From 4c32238b382729c65dc57147882c7e9e7efa401e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Oct 2025 17:57:33 -0700 Subject: [PATCH 001/850] bump to 25 --- src/base/base_context_cracking.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index 82af7918..f584c551 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -159,7 +159,7 @@ #endif #if !defined(BUILD_VERSION_PATCH) -# define BUILD_VERSION_PATCH 24 +# define BUILD_VERSION_PATCH 25 #endif #define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) From 499fe635d6ee1f7e90e98b107b6de926c2ec6fc0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 3 Nov 2025 11:29:04 -0800 Subject: [PATCH 002/850] only enable WS_EX_NOREDIRECTIONBITMAP on non-gl renderers - need either this, or we'll need to switch win32/gl to directcomposition (?) --- src/os/gfx/win32/os_gfx_win32.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/os/gfx/win32/os_gfx_win32.c b/src/os/gfx/win32/os_gfx_win32.c index 53f8edb5..4d7f7254 100644 --- a/src/os/gfx/win32/os_gfx_win32.c +++ b/src/os/gfx/win32/os_gfx_win32.c @@ -1066,7 +1066,11 @@ os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) Temp scratch = scratch_begin(0, 0); String16 title16 = str16_from_8(scratch.arena, title); os_w32_new_window_custom_border = custom_border; - hwnd = CreateWindowExW(WS_EX_APPWINDOW | WS_EX_NOREDIRECTIONBITMAP, + DWORD style_flags = WS_EX_APPWINDOW; +#if defined(R_BACKEND) && R_BACKEND != R_BACKEND_OPENGL + style_flags |= WS_EX_NOREDIRECTIONBITMAP; +#endif + hwnd = CreateWindowExW(style_flags, L"graphical-window", (WCHAR*)title16.str, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, From af7f57193275ce3e912bb42e34631cc4a8d57042 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 3 Nov 2025 14:59:15 -0800 Subject: [PATCH 003/850] adjust menu bar --- src/raddbg/raddbg_core.c | 90 ++++++++++++++++++++++++++++--------- src/raddbg/raddbg_widgets.c | 25 +++++++---- src/ui/ui_basic_widgets.c | 12 +++-- 3 files changed, 94 insertions(+), 33 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 171689c4..8a9a9464 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -6622,32 +6622,36 @@ rd_window_frame(void) { rd_cmd_kind_info_table[RD_CmdKind_Open].string, rd_cmd_kind_info_table[RD_CmdKind_Switch].string, - rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_NewUser].string, - rd_cmd_kind_info_table[RD_CmdKind_NewProject].string, rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string, + rd_cmd_kind_info_table[RD_CmdKind_SaveUser].string, + rd_cmd_kind_info_table[RD_CmdKind_UserSettings].string, + {0},//- + rd_cmd_kind_info_table[RD_CmdKind_NewProject].string, rd_cmd_kind_info_table[RD_CmdKind_OpenProject].string, rd_cmd_kind_info_table[RD_CmdKind_OpenRecentProject].string, - rd_cmd_kind_info_table[RD_CmdKind_SaveUser].string, rd_cmd_kind_info_table[RD_CmdKind_SaveProject].string, - rd_cmd_kind_info_table[RD_CmdKind_UserSettings].string, rd_cmd_kind_info_table[RD_CmdKind_ProjectSettings].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_Exit].string, }; U32 codepoints[] = { 'o', 'i', - 'n', + 0,//- 'w', - 'j', 'u', + 's', + 'e', + 0,//- + 'j', 'p', 'r', - 's', 'a', - 'e', 't', + 0,//- 'x', }; Assert(ArrayCount(codepoints) == ArrayCount(cmds)); @@ -6663,6 +6667,7 @@ rd_window_frame(void) rd_cmd_kind_info_table[RD_CmdKind_OpenWindow].string, rd_cmd_kind_info_table[RD_CmdKind_CloseWindow].string, rd_cmd_kind_info_table[RD_CmdKind_ToggleFullscreen].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_WindowSettings].string, }; U32 codepoints[] = @@ -6670,6 +6675,7 @@ rd_window_frame(void) 'w', 'c', 'f', + 0,//- 's', }; Assert(ArrayCount(codepoints) == ArrayCount(cmds)); @@ -6687,11 +6693,13 @@ rd_window_frame(void) rd_cmd_kind_info_table[RD_CmdKind_NewPanelRight].string, rd_cmd_kind_info_table[RD_CmdKind_NewPanelLeft].string, rd_cmd_kind_info_table[RD_CmdKind_ClosePanel].string, - rd_cmd_kind_info_table[RD_CmdKind_RotatePanelColumns].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_NextPanel].string, rd_cmd_kind_info_table[RD_CmdKind_PrevPanel].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_TabBarTop].string, rd_cmd_kind_info_table[RD_CmdKind_TabBarBottom].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_ResetToDefaultPanels].string, rd_cmd_kind_info_table[RD_CmdKind_ResetToCompactPanels].string, rd_cmd_kind_info_table[RD_CmdKind_ResetToSimplePanels].string, @@ -6702,12 +6710,14 @@ rd_window_frame(void) 'd', 'r', 'l', - 'x', - 'c', + 'o', + 0,//- 'n', 'p', + 0,//- 0, 0, + 0,//- 0, 0, 0, @@ -6725,10 +6735,13 @@ rd_window_frame(void) rd_cmd_kind_info_table[RD_CmdKind_OpenTab].string, rd_cmd_kind_info_table[RD_CmdKind_CloseTab].string, rd_cmd_kind_info_table[RD_CmdKind_DuplicateTab].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_MoveTabLeft].string, rd_cmd_kind_info_table[RD_CmdKind_MoveTabRight].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_NextTab].string, rd_cmd_kind_info_table[RD_CmdKind_PrevTab].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_TabSettings].string, }; U32 codepoints[] = @@ -6736,10 +6749,13 @@ rd_window_frame(void) 'o', 'c', 'd', + 0,//- 'l', 'r', + 0,//- 'n', 'p', + 0,//- 's', }; Assert(ArrayCount(codepoints) == ArrayCount(cmds)); @@ -6778,9 +6794,11 @@ rd_window_frame(void) rd_cmd_kind_info_table[D_CmdKind_KillAll].string, rd_cmd_kind_info_table[D_CmdKind_Restart].string, rd_cmd_kind_info_table[D_CmdKind_Halt].string, + {0},//- rd_cmd_kind_info_table[D_CmdKind_StepInto].string, rd_cmd_kind_info_table[D_CmdKind_StepOver].string, rd_cmd_kind_info_table[D_CmdKind_StepOut].string, + {0},//- rd_cmd_kind_info_table[D_CmdKind_Attach].string, rd_cmd_kind_info_table[D_CmdKind_Detach].string, }; @@ -6790,9 +6808,11 @@ rd_window_frame(void) 'k', 's', 'h', + 0,//- 'i', 'o', 't', + 0,//- 'a', 'd', }; @@ -6816,23 +6836,44 @@ rd_window_frame(void) ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit("")); } ui_spacer(ui_em(1.f, 1.f)); - UI_Row - UI_PrefWidth(ui_text_dim(10, 1)) + CFG_KeyMapNodePtrList key_map_nodes = cfg_key_map_node_ptr_list_from_name(scratch.arena, rd_state->key_map, rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string); + CFG_Binding binding = {0}; + String8 binding_str = {0}; + if(key_map_nodes.first != 0) + { + binding = key_map_nodes.first->v->binding; + binding_str = os_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key); + } + UI_TagF(".") + UI_Row UI_TextAlignment(UI_TextAlign_Center) UI_Padding(ui_pct(1, 0)) { - ui_labelf("Search for commands and options by pressing "); - UI_Flags(UI_BoxFlag_DrawBorder) - UI_TextAlignment(UI_TextAlign_Center) - rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string, str8_zero(), 1); + UI_Signal sig = {0}; + UI_PrefWidth(ui_children_sum(1)) + UI_Flags(UI_BoxFlag_DrawBorder) + UI_CornerRadius(ui_top_font_size()*0.5f) + sig = ui_buttonf("###open_palette"); + UI_Parent(sig.box) UI_PrefWidth(ui_text_dim(ui_top_font_size()*2.f, 1)) + { + ui_labelf("Search for commands & settings"); + if(binding_str.size != 0) + { + UI_TagF("weak") ui_labelf("(%S)", binding_str); + } + } + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string); + } } ui_spacer(ui_em(1.f, 1.f)); UI_TagF("pop") - UI_Row UI_Padding(ui_pct(1, 0)) UI_TextAlignment(UI_TextAlign_Center) UI_PrefWidth(ui_text_dim(10, 1)) + UI_Row UI_Padding(ui_pct(1, 0)) UI_TextAlignment(UI_TextAlign_Center) UI_PrefWidth(ui_text_dim(ui_top_font_size()*2.f, 1)) UI_CornerRadius(ui_top_font_size()*0.5f) { String8 url = str8_lit("https://github.com/EpicGamesExt/raddebugger/issues"); - UI_Signal sig = ui_button(str8_lit("Submit Request, Issue, or Bug Report")); + UI_Signal sig = ui_button(str8_lit("Submit request, issue, or bug report")); if(ui_clicked(sig)) { os_open_in_browser(url); @@ -8830,9 +8871,8 @@ rd_window_frame(void) { color.w *= b->hot_t; } + color.w *= 0.01f; R_Rect2DInst *inst = dr_rect(b_border_rect, color, 0, 1.f, 1.f); - inst->colors[Corner_01].w *= 0.2f; - inst->colors[Corner_11].w *= 0.2f; MemoryCopyArray(inst->corner_radii, b_corner_radii); } } @@ -14648,6 +14688,14 @@ rd_frame(void) String8 cmd_name = rd_regs()->cmd_name; RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); + // rjf: close existing context menus + { + CFG_Node *window = cfg_node_from_id(rd_regs()->window); + RD_WindowState *ws = rd_window_state_from_cfg(window); + ui_ctx_menu_close(); + ws->menu_bar_focused = 0; + } + // rjf: floating queries -> set up window to build immediate-mode top-level query CFG_Node *view = &cfg_nil_node; B32 is_floating = (cmd_name.size == 0 || cmd_kind_info->query.flags & RD_QueryFlag_Floating); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 4d039d03..d87d844a 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -964,17 +964,24 @@ internal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints) { Temp scratch = scratch_begin(0, 0); - for(U64 idx = 0; idx < count; idx += 1) + for EachIndex(idx, count) { - ui_set_next_fastpath_codepoint(fastpath_codepoints[idx]); - UI_Signal sig = rd_cmd_spec_button(cmd_names[idx]); - if(ui_clicked(sig)) + if(cmd_names[idx].size == 0) { - rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_names[idx]); - ui_ctx_menu_close(); - CFG_Node *window = cfg_node_from_id(rd_regs()->window); - RD_WindowState *ws = rd_window_state_from_cfg(window); - ws->menu_bar_focused = 0; + UI_TagF("floating") ui_divider(ui_em(1.f, 1.f)); + } + else + { + ui_set_next_fastpath_codepoint(fastpath_codepoints[idx]); + UI_Signal sig = rd_cmd_spec_button(cmd_names[idx]); + if(ui_clicked(sig)) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_names[idx]); + ui_ctx_menu_close(); + CFG_Node *window = cfg_node_from_id(rd_regs()->window); + RD_WindowState *ws = rd_window_state_from_cfg(window); + ws->menu_bar_focused = 0; + } } } scratch_end(scratch); diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index f4b28a38..e55eaa34 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -11,10 +11,16 @@ ui_divider(UI_Size size) ui_set_next_pref_size(parent->child_layout_axis, size); ui_set_next_child_layout_axis(parent->child_layout_axis); UI_Box *box = ui_build_box_from_key(0, ui_key_zero()); - UI_Parent(box) UI_PrefSize(parent->child_layout_axis, ui_pct(1, 0)) + UI_Parent(box) UI_Padding(ui_pct(0.5f, 0.5f)) + UI_PrefSize(parent->child_layout_axis, ui_em(0.1f, 1.f)) + UI_BackgroundColor(ui_color_from_name(str8_lit("border"))) { - ui_build_box_from_key(UI_BoxFlag_DrawSideBottom, ui_key_zero()); - ui_build_box_from_key(0, ui_key_zero()); + ui_set_next_child_layout_axis(axis2_flip(parent->child_layout_axis)); + UI_Box *spacing_parent = ui_build_box_from_key(0, ui_key_zero()); + UI_Parent(spacing_parent) UI_Padding(ui_em(1.f, 1.f)) UI_PrefSize(axis2_flip(parent->child_layout_axis), ui_pct(1, 0)) + { + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } } } From cb657aab14e4126667174c083ba161c7668ce06d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 3 Nov 2025 15:21:17 -0800 Subject: [PATCH 004/850] fix bad line range gathering on non-textual files --- src/text/text.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/text/text.c b/src/text/text.c index 7b4ef0f8..9d6b1f94 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -2066,19 +2066,18 @@ txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_ou U64 line_start_idx = 0; for(U64 idx = 0; idx <= data.size; idx += 1) { - if(idx == data.size || data.str[idx] == '\n' || data.str[idx] == '\r') + if(idx == data.size || data.str[idx] == '\n') { Rng1U64 line_range = r1u64(line_start_idx, idx); + if(idx > 0 && data.str[idx-1] == '\r' && line_range.max > line_range.min) + { + line_range.max -= 1; + } U64 line_size = dim_1u64(line_range); shared->info.lines_ranges[line_idx] = line_range; shared->info.lines_max_size = Max(shared->info.lines_max_size, line_size); line_idx += 1; line_start_idx = idx+1; - if(idx < data.size && data.str[idx] == '\r') - { - line_start_idx += 1; - idx += 1; - } } if(idx && idx%1000 == 0) { From 1ffd662e4f9f3dd67e8860c96cddc5e1b4a90c04 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 3 Nov 2025 15:55:43 -0800 Subject: [PATCH 005/850] do case/slash insensitive search for filename references for breakpoint disqualification - we can *not* use the string table hash, since paths may disagree on casing --- src/pdb/pdb_parse.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/pdb/pdb_parse.c b/src/pdb/pdb_parse.c index 0849fd98..8ac51adc 100644 --- a/src/pdb/pdb_parse.c +++ b/src/pdb/pdb_parse.c @@ -1138,21 +1138,19 @@ pdb_has_file_ref(String8 msf_data, String8List file_list, MSF_RawStreamTable *st PDB_Strtbl *strtbl = pdb_strtbl_from_data(scratch.arena, strtbl_data); if(strtbl->bucket_count != 0) { - for(String8Node *file_n = file_list.first; file_n != 0; file_n = file_n->next) + for EachIndex(idx, strtbl->bucket_count) { - Temp temp = temp_begin(scratch.arena); - String8 path = file_n->string; - String8 path_pdbstyle = path_convert_slashes(temp.arena, path, PathStyle_WindowsAbsolute); - String8 path_pdbstyle_lower = lower_from_str8(temp.arena, path_pdbstyle); - U32 off1 = pdb_strtbl_off_from_string(strtbl, path_pdbstyle); - U32 off2 = pdb_strtbl_off_from_string(strtbl, path_pdbstyle_lower); - temp_end(temp); - if(off1 != max_U32 || off2 != max_U32) + String8 stored_string = pdb_strtbl_string_from_index(strtbl, idx); + for(String8Node *file_n = file_list.first; file_n != 0; file_n = file_n->next) { - has_ref = 1; - break; + if(str8_match(file_n->string, stored_string, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive)) + { + has_ref = 1; + goto dbl_break; + } } } + dbl_break:; } } } From 27d01bcee01afa653f5665e2084963151336784e Mon Sep 17 00:00:00 2001 From: Speykious Date: Sat, 25 Oct 2025 02:28:01 +0200 Subject: [PATCH 006/850] Implement Rust syntax highlighting --- src/text/text.c | 370 ++++++++++++++++++++++++++++++++++++++++++++++++ src/text/text.h | 2 + 2 files changed, 372 insertions(+) diff --git a/src/text/text.c b/src/text/text.c index 9d6b1f94..3d39beb9 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -47,6 +47,10 @@ txt_lang_kind_from_extension(String8 extension) { kind = TXT_LangKind_Zig; } + else if(str8_match(extension, str8_lit("rs"), StringMatchFlag_CaseInsensitive)) + { + kind = TXT_LangKind_Rust; + } return kind; } @@ -65,6 +69,7 @@ txt_extension_from_lang_kind(TXT_LangKind kind) case TXT_LangKind_Odin: {result = str8_lit("odin");}break; case TXT_LangKind_Jai: {result = str8_lit("jai");}break; case TXT_LangKind_Zig: {result = str8_lit("zig");}break; + case TXT_LangKind_Rust: {result = str8_lit("rs");}break; } return result; } @@ -93,6 +98,7 @@ txt_lex_function_from_lang_kind(TXT_LangKind kind) case TXT_LangKind_Odin: {fn = txt_token_array_from_string__odin;}break; case TXT_LangKind_Jai: {fn = txt_token_array_from_string__jai;}break; case TXT_LangKind_Zig: {fn = txt_token_array_from_string__zig;}break; + case TXT_LangKind_Rust: {fn = txt_token_array_from_string__rust;}break; case TXT_LangKind_DisasmX64Intel:{fn = txt_token_array_from_string__disasm_x64_intel;}break; } return fn; @@ -1368,6 +1374,370 @@ txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, Str return result; } +internal TXT_TokenArray +txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, String8 string) +{ + // NOTE(spey): Rust supports unicode identifiers. They are not handled in any way here, + // but it might be worth looking into in the future. + + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: generate token list + TXT_TokenChunkList tokens = {0}; + { + S32 multiline_comment_nesting_level = 0; + S32 raw_string_nesting_level = 0; + S32 raw_string_ender_nesting_level = 0; + + // NOTE(spey): Rust's syntax is designed in such a way that we can't be sure what a token + // is immediately from the first character, so we have to keep track of some possibilities. + B32 token_may_be_char = 0; + B32 token_may_be_lifetime = 0; + B32 token_may_be_string = 0; + + TXT_TokenKind active_token_kind = TXT_TokenKind_Null; + U64 active_token_start_idx = 0; + B32 escaped = 0; + B32 next_escaped = 0; + U64 byte_process_start_idx = 0; + for(U64 idx = 0; idx <= string.size;) + { + U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; + U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; + + // rjf: update counter + if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) + { + ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); + byte_process_start_idx = idx; + } + + // rjf: escaping + if(escaped && (byte != '\r' && byte != '\n')) + { + next_escaped = 0; + } + else if(!escaped && byte == '\\') + { + next_escaped = 1; + } + + // rjf: take starter, determine active token kind + U64 starter_pad = 0; + + // spey: special case of starter for nested comments + if(active_token_kind == TXT_TokenKind_Comment) + { + if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; multiline_comment_nesting_level++; starter_pad = 1; } + } + // spey: special case of starter for raw string literals + else if(active_token_kind == TXT_TokenKind_Identifier && token_may_be_string) + { + if(0){} + else if(byte == 'r' && next_byte == '#') {} // spey: still an identifier that may be a string (this branch triggers for raw byte/C string literals) + else if(byte == '#' && next_byte == '"') { active_token_kind = TXT_TokenKind_String; token_may_be_string = 0; token_may_be_char = 0; raw_string_nesting_level++; starter_pad = 2; } + else if(byte == '#' && next_byte == '#') { raw_string_nesting_level++; } + else { token_may_be_string = 0; token_may_be_char = 0; raw_string_nesting_level = 0; } // spey: confirmed raw identifier + } + // spey: regular cases + else if(active_token_kind == TXT_TokenKind_Null) + { + // rjf: use next bytes to start a new token + if(0){} + else if(char_is_space(byte)) { active_token_kind = TXT_TokenKind_Whitespace; } + else if(byte == 'r' && next_byte == '#') { active_token_kind = TXT_TokenKind_Identifier; token_may_be_string = 1; } // spey: either raw identifiers or raw string literals + else if(char_is_digit(byte, 10) || + (byte == '.' && + char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } + else if(byte == '"') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 0; } + else if((byte == 'c' || byte == 'b') && + next_byte == '"') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 0; starter_pad = 1; } + else if((byte == 'c' || byte == 'b') && + next_byte == 'r') { active_token_kind = TXT_TokenKind_Identifier; token_may_be_string = 1; } + else if(byte == '_' || + char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } + else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; starter_pad = 1; } + else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; starter_pad = 1; multiline_comment_nesting_level++; } + else if(byte == '~' || byte == '!' || + byte == '%' || byte == '^' || + byte == '&' || byte == '*' || + byte == '(' || byte == ')' || + byte == '-' || byte == '=' || + byte == '+' || byte == '[' || + byte == ']' || byte == '{' || + byte == '}' || byte == ':' || + byte == ';' || byte == ',' || + byte == '.' || byte == '<' || + byte == '>' || byte == '/' || + byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } + else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 1; token_may_be_lifetime = 1; } + else if((byte == 'c' || byte == 'b') && + next_byte == '\'') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 1; starter_pad = 1; } + + // rjf: start new token + if(active_token_kind != TXT_TokenKind_Null) + { + active_token_start_idx = idx; + } + + // rjf: invalid token kind -> emit error + else + { + TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + + B32 is_on_starter = idx <= active_token_start_idx || token_may_be_string; + + // spey: advance by starter padding byte(s) and reset byte/next_byte values + idx += starter_pad; + byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; + next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; + + // rjf: look for ender + U64 ender_pad = 0; + B32 ender_found = 0; + if(active_token_kind != TXT_TokenKind_Null && !is_on_starter) + { + if(idx == string.size) + { + ender_pad = 0; + ender_found = 1; + } + else switch(active_token_kind) + { + default:break; + case TXT_TokenKind_Whitespace: + { + ender_found = !char_is_space(byte); + }break; + case TXT_TokenKind_Identifier: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$' && byte != '#' && byte != '!' && byte < 128); + }break; + case TXT_TokenKind_Numeric: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); + }break; + case TXT_TokenKind_String: + { + if(!escaped) + { + if(token_may_be_char) + { + if(byte == '\'') + { + // spey: char ending + ender_found = 1; + } + else if(token_may_be_lifetime && !char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte < 128) + { + // spey: lifetime ending + ender_found = 1; + } + } + else + { + if(0){} + + // spey: regular string + else if(raw_string_nesting_level == 0) { ender_found = byte == '"'; } + + // spey: raw string + else if(byte == '"' && next_byte == '#' && + raw_string_ender_nesting_level == 0) { raw_string_ender_nesting_level++; } + else if(byte == '#' && next_byte != '#' && + raw_string_ender_nesting_level == raw_string_nesting_level && + raw_string_ender_nesting_level >= 0) { ender_found = 1; raw_string_nesting_level = 0; raw_string_ender_nesting_level = 0; } + else if(byte == '#' && next_byte != '#' && + raw_string_ender_nesting_level >= 0) { raw_string_ender_nesting_level = 0; } + else if(byte == '#' && + raw_string_ender_nesting_level >= 0) { raw_string_ender_nesting_level++; } + } + } + + ender_pad += 1; + }break; + case TXT_TokenKind_Symbol: + { + ender_found = (byte != '~' && byte != '!' && + byte != '%' && byte != '^' && + byte != '&' && byte != '*' && + byte != '(' && byte != ')' && + byte != '-' && byte != '=' && + byte != '+' && byte != '[' && + byte != ']' && byte != '{' && + byte != '}' && byte != ':' && + byte != ';' && byte != ',' && + byte != '.' && byte != '<' && + byte != '>' && byte != '/' && + byte != '?' && byte != '|'); + }break; + case TXT_TokenKind_Comment: + { + if(multiline_comment_nesting_level == 0) + { + ender_found = (byte == '\r' || byte == '\n'); + } + else + { + if (byte == '*' && next_byte == '/') + multiline_comment_nesting_level--; + + ender_found = (active_token_start_idx+1 < idx && multiline_comment_nesting_level == 0); + ender_pad += 2; + } + }break; + } + } + + // rjf: next byte is ender => emit token + if(ender_found) + { + TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)}; + active_token_kind = TXT_TokenKind_Null; + + // rjf: identifier -> keyword in special cases + if(token.kind == TXT_TokenKind_Identifier) + { + read_only local_persist String8 rust_keywords[] = + { + str8_lit_comp("as"), + str8_lit_comp("break"), + str8_lit_comp("const"), + str8_lit_comp("continue"), + str8_lit_comp("crate"), + str8_lit_comp("else"), + str8_lit_comp("enum"), + str8_lit_comp("extern"), + str8_lit_comp("false"), + str8_lit_comp("fn"), + str8_lit_comp("for"), + str8_lit_comp("if"), + str8_lit_comp("impl"), + str8_lit_comp("in"), + str8_lit_comp("let"), + str8_lit_comp("loop"), + str8_lit_comp("match"), + str8_lit_comp("mod"), + str8_lit_comp("move"), + str8_lit_comp("mut"), + str8_lit_comp("pub"), + str8_lit_comp("ref"), + str8_lit_comp("return"), + str8_lit_comp("self"), + str8_lit_comp("Self"), + str8_lit_comp("static"), + str8_lit_comp("struct"), + str8_lit_comp("super"), + str8_lit_comp("trait"), + str8_lit_comp("true"), + str8_lit_comp("type"), + str8_lit_comp("unsafe"), + str8_lit_comp("use"), + str8_lit_comp("where"), + str8_lit_comp("while"), + str8_lit_comp("yield"), + str8_lit_comp("async"), + str8_lit_comp("await"), + str8_lit_comp("dyn"), + + // weak keywords + str8_lit_comp("macro_rules"), + str8_lit_comp("raw"), + str8_lit_comp("safe"), + str8_lit_comp("union"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 keyword_idx = 0; keyword_idx < ArrayCount(rust_keywords); keyword_idx += 1) + { + if(str8_match(rust_keywords[keyword_idx], token_string, 0)) + { + token.kind = TXT_TokenKind_Keyword; + break; + } + } + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + + // rjf: split symbols by maximum-munch-rule + else if(token.kind == TXT_TokenKind_Symbol) + { + read_only local_persist String8 rust_multichar_symbol_strings[] = + { + str8_lit_comp("<<"), + str8_lit_comp(">>"), + str8_lit_comp("<="), + str8_lit_comp(">="), + str8_lit_comp("=="), + str8_lit_comp("!="), + str8_lit_comp("&&"), + str8_lit_comp("||"), + str8_lit_comp("|="), + str8_lit_comp("&="), + str8_lit_comp("^="), + str8_lit_comp("~="), + str8_lit_comp("+="), + str8_lit_comp("-="), + str8_lit_comp("*="), + str8_lit_comp("/="), + str8_lit_comp("%="), + str8_lit_comp("<<="), + str8_lit_comp(">>="), + str8_lit_comp("->"), + }; + String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad)); + for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) + { + B32 found = 0; + for(U64 idx = 0; idx < ArrayCount(rust_multichar_symbol_strings); idx += 1) + { + if(str8_match(str8_substr(token_string, r1u64(off, off+rust_multichar_symbol_strings[idx].size)), + rust_multichar_symbol_strings[idx], + 0)) + { + found = 1; + next_off = off + rust_multichar_symbol_strings[idx].size; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + break; + } + } + if(!found) + { + next_off = off+1; + TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + } + } + + // rjf: all other tokens + else + { + txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); + } + + // rjf: increment by starter and ender padding + idx += ender_pad; + } + + // rjf: advance by 1 byte if we haven't found an ender + if(!ender_found) + { + idx += 1; + } + escaped = next_escaped; + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + return result; +} + internal TXT_TokenArray txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string) { diff --git a/src/text/text.h b/src/text/text.h index c34eb64b..5978e43d 100644 --- a/src/text/text.h +++ b/src/text/text.h @@ -148,6 +148,7 @@ typedef enum TXT_LangKind TXT_LangKind_Odin, TXT_LangKind_Jai, TXT_LangKind_Zig, + TXT_LangKind_Rust, TXT_LangKind_DisasmX64Intel, TXT_LangKind_COUNT } @@ -183,6 +184,7 @@ internal TXT_TokenArray txt_token_array_from_string__c_cpp(Arena *arena, U64 *by internal TXT_TokenArray txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string); internal TXT_TokenArray txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, String8 string); internal TXT_TokenArray txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, String8 string); +internal TXT_TokenArray txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, String8 string); internal TXT_TokenArray txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string); //////////////////////////////// From 82bc133ba58acead7131daf2829954ae203afebb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 4 Nov 2025 15:56:42 -0800 Subject: [PATCH 007/850] first pass at unified lexer path, not plugged in yet --- src/text/generated/text.meta.c | 458 +++++++++++++++++++++++++++++++++ src/text/generated/text.meta.h | 41 +++ src/text/text.c | 450 ++++++++++++++++++++++++++------ src/text/text.h | 47 +++- src/text/text.mdesk | 246 ++++++++++++++++++ 5 files changed, 1155 insertions(+), 87 deletions(-) create mode 100644 src/text/generated/text.meta.c create mode 100644 src/text/generated/text.meta.h create mode 100644 src/text/text.mdesk diff --git a/src/text/generated/text.meta.c b/src/text/generated/text.meta.c new file mode 100644 index 00000000..bb00c67a --- /dev/null +++ b/src/text/generated/text.meta.c @@ -0,0 +1,458 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 txt_lang_kind_ext_table[8] = +{ +str8_lit_comp("null"), +str8_lit_comp("c"), +str8_lit_comp("cpp"), +str8_lit_comp("odin"), +str8_lit_comp("jai"), +str8_lit_comp("zig"), +str8_lit_comp("rs"), +str8_lit_comp("disasm_x64_intel"), +}; + +struct {String8 ext; TXT_LangKind kind;} txt_ext_lang_kind_table[24] = +{ +{str8_lit_comp("null"), TXT_LangKind_Null}, +{str8_lit_comp("c"), TXT_LangKind_C}, +{str8_lit_comp("cpp"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("odin"), TXT_LangKind_Odin}, +{str8_lit_comp("jai"), TXT_LangKind_Jai}, +{str8_lit_comp("zig"), TXT_LangKind_Zig}, +{str8_lit_comp("rs"), TXT_LangKind_Rust}, +{str8_lit_comp("disasm_x64_intel"), TXT_LangKind_DisasmX64Intel}, +{str8_lit_comp("h"), TXT_LangKind_C}, +{str8_lit_comp("cxx"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("cc"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("c++"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("ixx"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("cxxm"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("c++m"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("ccm"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("cppm"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("mpp"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("C"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("hpp"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("hxx"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("hh"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("h++"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("H"), TXT_LangKind_CPlusPlus}, +}; + +String8Array txt_keywords_from_lang_kind_table[8] = +{ +{txt_keywords__null, ArrayCount(txt_keywords__null)}, +{txt_keywords__c, ArrayCount(txt_keywords__c)}, +{txt_keywords__cpp, ArrayCount(txt_keywords__cpp)}, +{txt_keywords__odin, ArrayCount(txt_keywords__odin)}, +{txt_keywords__jai, ArrayCount(txt_keywords__jai)}, +{txt_keywords__zig, ArrayCount(txt_keywords__zig)}, +{txt_keywords__rust, ArrayCount(txt_keywords__rust)}, +{txt_keywords__null, ArrayCount(txt_keywords__null)}, +}; + +String8Array txt_multichar_symbols_from_lang_kind_table[8] = +{ +{txt_multichar_symbols__null, ArrayCount(txt_multichar_symbols__null)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__null, ArrayCount(txt_multichar_symbols__null)}, +}; + +TXT_TokenizerRuleArray txt_tokenizer_rules_from_lang_kind_table[8] = +{ +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__c, ArrayCount(txt_tokenizer_rules__c)}, +{txt_tokenizer_rules__c, ArrayCount(txt_tokenizer_rules__c)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +}; + +String8 txt_keywords__null[1] = +{ +{0}, +}; + +String8 txt_multichar_symbols__null[1] = +{ +{0}, +}; + +TXT_TokenizerRule txt_tokenizer_rules__null[1] = +{ +{TXT_TokenKind_Null}, +}; + +String8 txt_keywords__c[32] = +{ +str8_lit_comp("auto"), +str8_lit_comp("break"), +str8_lit_comp("case"), +str8_lit_comp("char"), +str8_lit_comp("const"), +str8_lit_comp("continue"), +str8_lit_comp("default"), +str8_lit_comp("do"), +str8_lit_comp("double"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("extern"), +str8_lit_comp("float"), +str8_lit_comp("for"), +str8_lit_comp("goto"), +str8_lit_comp("if"), +str8_lit_comp("int"), +str8_lit_comp("long"), +str8_lit_comp("register"), +str8_lit_comp("return"), +str8_lit_comp("short"), +str8_lit_comp("signed"), +str8_lit_comp("sizeof"), +str8_lit_comp("static"), +str8_lit_comp("struct"), +str8_lit_comp("switch"), +str8_lit_comp("typedef"), +str8_lit_comp("union"), +str8_lit_comp("unsigned"), +str8_lit_comp("void"), +str8_lit_comp("volatile"), +str8_lit_comp("while"), +}; + +String8 txt_multichar_symbols__c[20] = +{ +str8_lit_comp("<<"), +str8_lit_comp(">>"), +str8_lit_comp("<="), +str8_lit_comp(">="), +str8_lit_comp("=="), +str8_lit_comp("!="), +str8_lit_comp("&&"), +str8_lit_comp("||"), +str8_lit_comp("|="), +str8_lit_comp("&="), +str8_lit_comp("^="), +str8_lit_comp("~="), +str8_lit_comp("+="), +str8_lit_comp("-="), +str8_lit_comp("*="), +str8_lit_comp("/="), +str8_lit_comp("%="), +str8_lit_comp("<<="), +str8_lit_comp(">>="), +str8_lit_comp("->"), +}; + +TXT_TokenizerRule txt_tokenizer_rules__c[7] = +{ +{TXT_TokenKind_Comment, str8_lit_comp("//"), str8_lit_comp("\n"), 0, 0, 1, 0}, +{TXT_TokenKind_Comment, str8_lit_comp("/*"), str8_lit_comp("*/"), 2, 0, 0, 0}, +{TXT_TokenKind_Meta, str8_lit_comp("#"), str8_lit_comp("\n"), 0, 0, 1, 0}, +{TXT_TokenKind_String, str8_lit_comp("\""), str8_lit_comp("\""), 1, 0, 1, 0}, +{TXT_TokenKind_String, str8_lit_comp("'"), str8_lit_comp("'"), 1, 0, 1, 0}, +{TXT_TokenKind_String, str8_lit_comp("\""), str8_lit_comp("\""), 1, 0, 1, 3}, +{TXT_TokenKind_String, str8_lit_comp("<"), str8_lit_comp(">"), 1, 0, 1, 3}, +}; + +String8 txt_keywords__cpp[97] = +{ +str8_lit_comp("alignas"), +str8_lit_comp("alignof"), +str8_lit_comp("and"), +str8_lit_comp("and_eq"), +str8_lit_comp("asm"), +str8_lit_comp("atomic_cancel"), +str8_lit_comp("atomic_commit"), +str8_lit_comp("atomic_noexcept"), +str8_lit_comp("auto"), +str8_lit_comp("bitand"), +str8_lit_comp("bitor"), +str8_lit_comp("bool"), +str8_lit_comp("break"), +str8_lit_comp("case"), +str8_lit_comp("catch"), +str8_lit_comp("char"), +str8_lit_comp("char8_t"), +str8_lit_comp("char16_t"), +str8_lit_comp("char32_t"), +str8_lit_comp("class"), +str8_lit_comp("compl"), +str8_lit_comp("concept"), +str8_lit_comp("const"), +str8_lit_comp("consteval"), +str8_lit_comp("constexpr"), +str8_lit_comp("constinit"), +str8_lit_comp("const_cast"), +str8_lit_comp("continue"), +str8_lit_comp("co_await"), +str8_lit_comp("co_return"), +str8_lit_comp("co_yield"), +str8_lit_comp("decltype"), +str8_lit_comp("default"), +str8_lit_comp("delete"), +str8_lit_comp("do"), +str8_lit_comp("double"), +str8_lit_comp("dynamic_cast"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("explicit"), +str8_lit_comp("export"), +str8_lit_comp("extern"), +str8_lit_comp("false"), +str8_lit_comp("float"), +str8_lit_comp("for"), +str8_lit_comp("friend"), +str8_lit_comp("goto"), +str8_lit_comp("if"), +str8_lit_comp("inline"), +str8_lit_comp("int"), +str8_lit_comp("long"), +str8_lit_comp("mutable"), +str8_lit_comp("namespace"), +str8_lit_comp("new"), +str8_lit_comp("noexcept"), +str8_lit_comp("not"), +str8_lit_comp("not_eq"), +str8_lit_comp("nullptr"), +str8_lit_comp("operator"), +str8_lit_comp("or"), +str8_lit_comp("or_eq"), +str8_lit_comp("private"), +str8_lit_comp("protected"), +str8_lit_comp("public"), +str8_lit_comp("reflexpr"), +str8_lit_comp("register"), +str8_lit_comp("reinterpret_cast"), +str8_lit_comp("requires"), +str8_lit_comp("return"), +str8_lit_comp("short"), +str8_lit_comp("signed"), +str8_lit_comp("sizeof"), +str8_lit_comp("static"), +str8_lit_comp("static_assert"), +str8_lit_comp("static_cast"), +str8_lit_comp("struct"), +str8_lit_comp("switch"), +str8_lit_comp("synchronized"), +str8_lit_comp("template"), +str8_lit_comp("this"), +str8_lit_comp("thread_local"), +str8_lit_comp("throw"), +str8_lit_comp("true"), +str8_lit_comp("try"), +str8_lit_comp("typedef"), +str8_lit_comp("typeid"), +str8_lit_comp("typename"), +str8_lit_comp("union"), +str8_lit_comp("unsigned"), +str8_lit_comp("using"), +str8_lit_comp("virtual"), +str8_lit_comp("void"), +str8_lit_comp("volatile"), +str8_lit_comp("wchar_t"), +str8_lit_comp("while"), +str8_lit_comp("xor"), +str8_lit_comp("xor_eq"), +}; + +String8 txt_keywords__odin[40] = +{ +str8_lit_comp("align_of"), +str8_lit_comp("asm"), +str8_lit_comp("auto_cast"), +str8_lit_comp("bit_set"), +str8_lit_comp("break"), +str8_lit_comp("case"), +str8_lit_comp("cast"), +str8_lit_comp("context"), +str8_lit_comp("continue"), +str8_lit_comp("defer"), +str8_lit_comp("distinct"), +str8_lit_comp("do"), +str8_lit_comp("dynamic"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("fallthrough"), +str8_lit_comp("for"), +str8_lit_comp("foreign"), +str8_lit_comp("if"), +str8_lit_comp("in"), +str8_lit_comp("map"), +str8_lit_comp("matrix"), +str8_lit_comp("not_in"), +str8_lit_comp("or_break"), +str8_lit_comp("or_continue"), +str8_lit_comp("or_else"), +str8_lit_comp("or_return"), +str8_lit_comp("package"), +str8_lit_comp("proc"), +str8_lit_comp("return"), +str8_lit_comp("size_of"), +str8_lit_comp("struct"), +str8_lit_comp("switch"), +str8_lit_comp("transmute"), +str8_lit_comp("typeid"), +str8_lit_comp("union"), +str8_lit_comp("using"), +str8_lit_comp("when"), +str8_lit_comp("where"), +str8_lit_comp("import"), +}; + +String8 txt_keywords__jai[39] = +{ +str8_lit_comp("bool"), +str8_lit_comp("true"), +str8_lit_comp("false"), +str8_lit_comp("int"), +str8_lit_comp("s8"), +str8_lit_comp("u8"), +str8_lit_comp("s16"), +str8_lit_comp("u16"), +str8_lit_comp("s32"), +str8_lit_comp("u32"), +str8_lit_comp("s64"), +str8_lit_comp("u64"), +str8_lit_comp("s128"), +str8_lit_comp("u128"), +str8_lit_comp("float"), +str8_lit_comp("float32"), +str8_lit_comp("float64"), +str8_lit_comp("void"), +str8_lit_comp("enum"), +str8_lit_comp("enum_flags"), +str8_lit_comp("size_of"), +str8_lit_comp("string"), +str8_lit_comp("type_of"), +str8_lit_comp("cast"), +str8_lit_comp("if"), +str8_lit_comp("ifs"), +str8_lit_comp("then"), +str8_lit_comp("else"), +str8_lit_comp("case"), +str8_lit_comp("for"), +str8_lit_comp("while"), +str8_lit_comp("break"), +str8_lit_comp("continue"), +str8_lit_comp("remove"), +str8_lit_comp("return"), +str8_lit_comp("inline"), +str8_lit_comp("null"), +str8_lit_comp("defer"), +str8_lit_comp("xx"), +}; + +String8 txt_keywords__zig[49] = +{ +str8_lit_comp("addrspace"), +str8_lit_comp("align"), +str8_lit_comp("allowzero"), +str8_lit_comp("and"), +str8_lit_comp("anyframe"), +str8_lit_comp("anytype"), +str8_lit_comp("asm"), +str8_lit_comp("async"), +str8_lit_comp("await"), +str8_lit_comp("break"), +str8_lit_comp("callconv"), +str8_lit_comp("catch"), +str8_lit_comp("comptime"), +str8_lit_comp("const"), +str8_lit_comp("continue"), +str8_lit_comp("defer"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("errdefer"), +str8_lit_comp("error"), +str8_lit_comp("export"), +str8_lit_comp("extern"), +str8_lit_comp("fn"), +str8_lit_comp("for"), +str8_lit_comp("if"), +str8_lit_comp("inline"), +str8_lit_comp("noalias"), +str8_lit_comp("nosuspend"), +str8_lit_comp("noinline"), +str8_lit_comp("opaque"), +str8_lit_comp("or"), +str8_lit_comp("orelse"), +str8_lit_comp("packed"), +str8_lit_comp("pub"), +str8_lit_comp("resume"), +str8_lit_comp("return"), +str8_lit_comp("linksection"), +str8_lit_comp("struct"), +str8_lit_comp("suspend"), +str8_lit_comp("switch"), +str8_lit_comp("test"), +str8_lit_comp("threadlocal"), +str8_lit_comp("try"), +str8_lit_comp("union"), +str8_lit_comp("unreachable"), +str8_lit_comp("usingnamespace"), +str8_lit_comp("var"), +str8_lit_comp("volatile"), +str8_lit_comp("while"), +}; + +String8 txt_keywords__rust[43] = +{ +str8_lit_comp("as"), +str8_lit_comp("break"), +str8_lit_comp("const"), +str8_lit_comp("continue"), +str8_lit_comp("crate"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("extern"), +str8_lit_comp("false"), +str8_lit_comp("fn"), +str8_lit_comp("for"), +str8_lit_comp("if"), +str8_lit_comp("impl"), +str8_lit_comp("in"), +str8_lit_comp("let"), +str8_lit_comp("loop"), +str8_lit_comp("match"), +str8_lit_comp("mod"), +str8_lit_comp("move"), +str8_lit_comp("mut"), +str8_lit_comp("pub"), +str8_lit_comp("ref"), +str8_lit_comp("return"), +str8_lit_comp("self"), +str8_lit_comp("Self"), +str8_lit_comp("static"), +str8_lit_comp("struct"), +str8_lit_comp("super"), +str8_lit_comp("trait"), +str8_lit_comp("true"), +str8_lit_comp("type"), +str8_lit_comp("unsafe"), +str8_lit_comp("use"), +str8_lit_comp("where"), +str8_lit_comp("while"), +str8_lit_comp("yield"), +str8_lit_comp("async"), +str8_lit_comp("await"), +str8_lit_comp("dyn"), +str8_lit_comp("macro_rules"), +str8_lit_comp("raw"), +str8_lit_comp("safe"), +str8_lit_comp("union"), +}; + +C_LINKAGE_END + diff --git a/src/text/generated/text.meta.h b/src/text/generated/text.meta.h new file mode 100644 index 00000000..f4cc1eab --- /dev/null +++ b/src/text/generated/text.meta.h @@ -0,0 +1,41 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef TEXT_META_H +#define TEXT_META_H + +typedef enum TXT_LangKind +{ +TXT_LangKind_Null, +TXT_LangKind_C, +TXT_LangKind_CPlusPlus, +TXT_LangKind_Odin, +TXT_LangKind_Jai, +TXT_LangKind_Zig, +TXT_LangKind_Rust, +TXT_LangKind_DisasmX64Intel, +TXT_LangKind_COUNT, +} TXT_LangKind; + +C_LINKAGE_BEGIN +extern String8 txt_lang_kind_ext_table[8]; +extern String8Array txt_keywords_from_lang_kind_table[8]; +extern String8Array txt_multichar_symbols_from_lang_kind_table[8]; +extern TXT_TokenizerRuleArray txt_tokenizer_rules_from_lang_kind_table[8]; +extern String8 txt_keywords__null[1]; +extern String8 txt_multichar_symbols__null[1]; +extern TXT_TokenizerRule txt_tokenizer_rules__null[1]; +extern String8 txt_keywords__c[32]; +extern String8 txt_multichar_symbols__c[20]; +extern TXT_TokenizerRule txt_tokenizer_rules__c[7]; +extern String8 txt_keywords__cpp[97]; +extern String8 txt_keywords__odin[40]; +extern String8 txt_keywords__jai[39]; +extern String8 txt_keywords__zig[49]; +extern String8 txt_keywords__rust[43]; + +C_LINKAGE_END + +#endif // TEXT_META_H diff --git a/src/text/text.c b/src/text/text.c index 3d39beb9..9ebe6c6b 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -4,6 +4,11 @@ #undef LAYER_COLOR #define LAYER_COLOR 0xe34cd4ff +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/text.meta.c" + //////////////////////////////// //~ rjf: Basic Helpers @@ -11,45 +16,13 @@ internal TXT_LangKind txt_lang_kind_from_extension(String8 extension) { TXT_LangKind kind = TXT_LangKind_Null; - if(str8_match(extension, str8_lit("c"), 0) || - str8_match(extension, str8_lit("h"), 0)) + for EachElement(idx, txt_ext_lang_kind_table) { - kind = TXT_LangKind_C; - } - else if(str8_match(extension, str8_lit("cpp"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cxx"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cc"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("c++"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("ixx"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cxxm"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("c++m"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("ccm"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("cppm"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("mpp"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("C"), 0) || - str8_match(extension, str8_lit("hpp"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("hxx"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("hh"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("h++"), StringMatchFlag_CaseInsensitive) || - str8_match(extension, str8_lit("H"), 0)) - { - kind = TXT_LangKind_CPlusPlus; - } - else if(str8_match(extension, str8_lit("odin"), StringMatchFlag_CaseInsensitive)) - { - kind = TXT_LangKind_Odin; - } - else if(str8_match(extension, str8_lit("jai"), StringMatchFlag_CaseInsensitive)) - { - kind = TXT_LangKind_Jai; - } - else if(str8_match(extension, str8_lit("zig"), StringMatchFlag_CaseInsensitive)) - { - kind = TXT_LangKind_Zig; - } - else if(str8_match(extension, str8_lit("rs"), StringMatchFlag_CaseInsensitive)) - { - kind = TXT_LangKind_Rust; + if(str8_match(extension, txt_ext_lang_kind_table[idx].ext, 0)) + { + kind = txt_ext_lang_kind_table[idx].kind; + break; + } } return kind; } @@ -57,20 +30,7 @@ txt_lang_kind_from_extension(String8 extension) internal String8 txt_extension_from_lang_kind(TXT_LangKind kind) { - String8 result = {0}; - switch(kind) - { - case TXT_LangKind_Null: - case TXT_LangKind_COUNT: - case TXT_LangKind_DisasmX64Intel: - {}break; - case TXT_LangKind_C: {result = str8_lit("c");}break; - case TXT_LangKind_CPlusPlus: {result = str8_lit("cpp");}break; - case TXT_LangKind_Odin: {result = str8_lit("odin");}break; - case TXT_LangKind_Jai: {result = str8_lit("jai");}break; - case TXT_LangKind_Zig: {result = str8_lit("zig");}break; - case TXT_LangKind_Rust: {result = str8_lit("rs");}break; - } + String8 result = txt_lang_kind_ext_table[kind]; return result; } @@ -166,6 +126,343 @@ txt_token_array_from_list(Arena *arena, TXT_TokenList *list) //////////////////////////////// //~ rjf: Lexing Functions +internal TXT_TokenArray +txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, String8 string) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + U64 chunk_size = Clamp(8, string.size/8, 4096); + + //- rjf: gather keywords + U64 keyword_slots_count = txt_keywords_from_lang_kind_table[lang_kind].count; + String8Node **keyword_slots = push_array(scratch.arena, String8Node *, keyword_slots_count); + for EachIndex(idx, txt_keywords_from_lang_kind_table[lang_kind].count) + { + String8 keyword = txt_keywords_from_lang_kind_table[lang_kind].v[idx]; + U64 hash = u64_hash_from_str8(keyword); + U64 slot_idx = hash%keyword_slots_count; + String8Node *n = push_array(scratch.arena, String8Node, 1); + SLLStackPush(keyword_slots[slot_idx], n); + n->string = keyword; + } + + //- rjf: gather multichar symbols + String8Array multichar_symbols = txt_multichar_symbols_from_lang_kind_table[lang_kind]; + + //- rjf: gather rules + U64 tokenizer_rule_slots_count = txt_tokenizer_rules_from_lang_kind_table[lang_kind].count; + TXT_TokenizerRulePtrNode **tokenizer_rule_opener_slots = push_array(scratch.arena, TXT_TokenizerRulePtrNode *, tokenizer_rule_slots_count); + TXT_TokenizerRulePtrNode **tokenizer_rule_closer_slots = push_array(scratch.arena, TXT_TokenizerRulePtrNode *, tokenizer_rule_slots_count); + { + TXT_TokenizerRuleArray rules = txt_tokenizer_rules_from_lang_kind_table[lang_kind]; + for EachIndex(idx, rules.count) + { + TXT_TokenizerRule *r = &rules.v[idx]; + U64 open_hash = u64_hash_from_str8(r->open_string); + U64 close_hash = u64_hash_from_str8(r->close_string); + U64 open_slot_idx = open_hash%tokenizer_rule_slots_count; + U64 close_slot_idx = close_hash%tokenizer_rule_slots_count; + TXT_TokenizerRulePtrNode *open_n = push_array(scratch.arena, TXT_TokenizerRulePtrNode, 1); + TXT_TokenizerRulePtrNode *close_n = push_array(scratch.arena, TXT_TokenizerRulePtrNode, 1); + open_n->v = r; + close_n->v = r; + SLLStackPush(tokenizer_rule_opener_slots[open_slot_idx], open_n); + SLLStackPush(tokenizer_rule_closer_slots[close_slot_idx], close_n); + } + } + + //- rjf: generate token list + TXT_TokenChunkList tokens = {0}; + { + typedef struct TokenTask TokenTask; + struct TokenTask + { + TokenTask *next; + TXT_TokenizerRule *rule; + TXT_TokenKind kind; + U64 start_idx; + }; + TXT_TokenizerRule *nil_rule = &txt_tokenizer_rules__null[0]; + TokenTask *top_task = 0; + TokenTask *free_task = 0; + B32 escaped = 0; + B32 next_escaped = 0; + U64 byte_process_start_idx = 0; + for(U64 idx = 0; idx <= string.size;) + { + U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; + U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; + + // rjf: unpack next bytes + U8 next_bytes[] = {byte, next_byte}; + String8 string_1byte = str8(next_bytes, 1); + String8 string_2byte = str8(next_bytes, 2); + + // rjf: update counter + if((idx-byte_process_start_idx) >= 1000 || idx == string.size) + { + add_progress(idx - byte_process_start_idx); + byte_process_start_idx = idx; + } + + // rjf: escaping + if(escaped && (byte != '\r' && byte != '\n')) + { + next_escaped = 0; + } + else if(!escaped && byte == '\\') + { + next_escaped = 1; + } + + // rjf: take starter, push new token tasks + { + TXT_TokenizerRule *new_rule = nil_rule; + TXT_TokenKind new_token_kind = TXT_TokenKind_Null; + + // rjf: use next bytes to look up a rule from the table + if(top_task == 0) + { + TXT_TokenizerRule *active_rule = top_task ? top_task->rule : nil_rule; + U64 hash_1byte = u64_hash_from_str8(string_1byte); + U64 hash_2byte = u64_hash_from_str8(string_2byte); + U64 slot_1byte = hash_1byte%tokenizer_rule_slots_count; + U64 slot_2byte = hash_2byte%tokenizer_rule_slots_count; + if(new_rule == nil_rule) + { + for EachNode(n, TXT_TokenizerRulePtrNode, tokenizer_rule_opener_slots[slot_2byte]) + { + TXT_TokenizerRule *n_parent_rule = nil_rule; + if(0 < n->v->parent_num && n->v->parent_num <= txt_tokenizer_rules_from_lang_kind_table[lang_kind].count) + { + n_parent_rule = &txt_tokenizer_rules_from_lang_kind_table[lang_kind].v[n->v->parent_num-1]; + } + if(str8_match(n->v->open_string, string_2byte, 0) && + active_rule == n_parent_rule) + { + new_rule = n->v; + break; + } + } + } + if(new_rule == nil_rule) + { + for EachNode(n, TXT_TokenizerRulePtrNode, tokenizer_rule_opener_slots[slot_1byte]) + { + TXT_TokenizerRule *n_parent_rule = nil_rule; + if(0 < n->v->parent_num && n->v->parent_num <= txt_tokenizer_rules_from_lang_kind_table[lang_kind].count) + { + n_parent_rule = &txt_tokenizer_rules_from_lang_kind_table[lang_kind].v[n->v->parent_num-1]; + } + if(str8_match(n->v->open_string, string_1byte, 0) && + active_rule == n_parent_rule) + { + new_rule = n->v; + break; + } + } + } + if(new_rule != nil_rule) + { + new_token_kind = new_rule->token_kind; + } + } + + // rjf: use next bytes to start a new token based on fallback rules + if(top_task == 0 && new_rule == nil_rule) + { + if(0){} + else if(char_is_space(byte)) { new_token_kind = TXT_TokenKind_Whitespace; } + else if(byte == '_' || + byte == '$' || + char_is_alpha(byte)) { new_token_kind = TXT_TokenKind_Identifier; } + else if(char_is_digit(byte, 10) || + (byte == '.' && + char_is_digit(next_byte, 10))) { new_token_kind = TXT_TokenKind_Numeric; } + else if(byte == '~' || byte == '!' || + byte == '%' || byte == '^' || + byte == '&' || byte == '*' || + byte == '(' || byte == ')' || + byte == '-' || byte == '=' || + byte == '+' || byte == '[' || + byte == ']' || byte == '{' || + byte == '}' || byte == ':' || + byte == ';' || byte == ',' || + byte == '.' || byte == '<' || + byte == '>' || byte == '/' || + byte == '?' || byte == '|') { new_token_kind = TXT_TokenKind_Symbol; } + } + + // rjf: start new token + if(new_token_kind != TXT_TokenKind_Null) + { + TokenTask *task = free_task; + if(task != 0) + { + SLLStackPop(free_task); + } + else + { + task = push_array(scratch.arena, TokenTask, 1); + } + SLLStackPush(top_task, task); + top_task->rule = new_rule; + top_task->kind = new_token_kind; + top_task->start_idx = idx; + } + + // rjf: invalid token kind -> emit error + else if(top_task == 0) + { + TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); + } + } + + // rjf: look for ender based on rule's closing symbol + U64 ender_pad = 0; + B32 ender_found = 0; + B32 task_pop = 0; + if(top_task != 0 && idx > top_task->start_idx) + { + TXT_TokenKind active_token_kind = top_task->kind; + TXT_TokenizerRule *active_rule = top_task->rule; + U64 active_token_start_idx = top_task->start_idx; + if(idx == string.size) + { + ender_pad = 0; + ender_found = 1; + } + else if(active_rule != nil_rule && + str8_match(string_1byte, active_rule->close_string, 0) || + str8_match(string_2byte, active_rule->close_string, 0)) + { + ender_found = 1; + ender_pad = active_rule->close_advance; + } + else switch(active_token_kind) + { + default:{}break; + case TXT_TokenKind_Whitespace: + { + ender_found = !char_is_space(byte); + }break; + case TXT_TokenKind_Identifier: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$' && byte < 128); + }break; + case TXT_TokenKind_Numeric: + { + ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\''); + }break; + case TXT_TokenKind_Symbol: + { + ender_found = (byte != '~' && byte != '!' && + byte != '%' && byte != '^' && + byte != '&' && byte != '*' && + byte != '(' && byte != ')' && + byte != '-' && byte != '=' && + byte != '+' && byte != '[' && + byte != ']' && byte != '{' && + byte != '}' && byte != ':' && + byte != ';' && byte != ',' && + byte != '.' && byte != '<' && + byte != '>' && byte != '/' && + byte != '?' && byte != '|'); + }break; + } + } + + // rjf: next byte is ender => emit token + if(ender_found) + { + TXT_Token token = {top_task->kind, r1u64(top_task->start_idx, idx+ender_pad)}; + TokenTask *popped = top_task; + SLLStackPop(top_task); + SLLStackPush(free_task, popped); + + // rjf: trim \r's off of end + { + String8 token_string = str8_substr(string, token.range); + if(token_string.size != 0 && token_string.str[token_string.size-1] == '\r') + { + token.range.max -= 1; + ender_pad += 1; + } + } + + // rjf: identifier -> keyword in special cases + if(token.kind == TXT_TokenKind_Identifier) + { + String8 token_string = str8_substr(string, token.range); + U64 hash = u64_hash_from_str8(token_string); + U64 slot_idx = hash%keyword_slots_count; + for EachNode(n, String8Node, keyword_slots[slot_idx]) + { + if(str8_match(token_string, n->string, 0)) + { + token.kind = TXT_TokenKind_Keyword; + break; + } + } + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); + } + + // rjf: split symbols by maximum-munch-rule + else if(token.kind == TXT_TokenKind_Symbol) + { + String8 token_string = str8_substr(string, token.range); + for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off) + { + B32 found = 0; + for(U64 idx = 0; idx < multichar_symbols.count; idx += 1) + { + if(str8_match(str8_substr(token_string, r1u64(off, off+multichar_symbols.v[idx].size)), + multichar_symbols.v[idx], + 0)) + { + found = 1; + next_off = off + Max(1, multichar_symbols.v[idx].size); + TXT_Token sub_token = {TXT_TokenKind_Symbol, r1u64(token.range.min+off, token.range.min+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &sub_token); + break; + } + } + if(!found) + { + next_off = off+1; + TXT_Token sub_token = {TXT_TokenKind_Symbol, r1u64(token.range.min+off, token.range.min+next_off)}; + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &sub_token); + } + } + } + + // rjf: all other tokens + else + { + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); + } + + // rjf: increment by ender padding + idx += ender_pad; + } + + // rjf: advance by 1 byte if we haven't found an ender + if(!ender_found) + { + idx += 1; + } + escaped = next_escaped; + } + } + + //- rjf: token list -> token array + TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens); + scratch_end(scratch); + ProfEnd(); + return result; +} + internal TXT_TokenArray txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string) { @@ -1379,7 +1676,7 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St { // NOTE(spey): Rust supports unicode identifiers. They are not handled in any way here, // but it might be worth looking into in the future. - + Temp scratch = scratch_begin(&arena, 1); //- rjf: generate token list @@ -1388,7 +1685,7 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St S32 multiline_comment_nesting_level = 0; S32 raw_string_nesting_level = 0; S32 raw_string_ender_nesting_level = 0; - + // NOTE(spey): Rust's syntax is designed in such a way that we can't be sure what a token // is immediately from the first character, so we have to keep track of some possibilities. B32 token_may_be_char = 0; @@ -1404,14 +1701,14 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St { U8 byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; - + // rjf: update counter if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size)) { ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx)); byte_process_start_idx = idx; } - + // rjf: escaping if(escaped && (byte != '\r' && byte != '\n')) { @@ -1421,10 +1718,10 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St { next_escaped = 1; } - + // rjf: take starter, determine active token kind U64 starter_pad = 0; - + // spey: special case of starter for nested comments if(active_token_kind == TXT_TokenKind_Comment) { @@ -1451,9 +1748,9 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St char_is_digit(next_byte, 10))) { active_token_kind = TXT_TokenKind_Numeric; } else if(byte == '"') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 0; } else if((byte == 'c' || byte == 'b') && - next_byte == '"') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 0; starter_pad = 1; } + next_byte == '"') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 0; starter_pad = 1; } else if((byte == 'c' || byte == 'b') && - next_byte == 'r') { active_token_kind = TXT_TokenKind_Identifier; token_may_be_string = 1; } + next_byte == 'r') { active_token_kind = TXT_TokenKind_Identifier; token_may_be_string = 1; } else if(byte == '_' || char_is_alpha(byte)) { active_token_kind = TXT_TokenKind_Identifier; } else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; starter_pad = 1; } @@ -1472,8 +1769,8 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St byte == '?' || byte == '|') { active_token_kind = TXT_TokenKind_Symbol; } else if(byte == '\'') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 1; token_may_be_lifetime = 1; } else if((byte == 'c' || byte == 'b') && - next_byte == '\'') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 1; starter_pad = 1; } - + next_byte == '\'') { active_token_kind = TXT_TokenKind_String; token_may_be_char = 1; starter_pad = 1; } + // rjf: start new token if(active_token_kind != TXT_TokenKind_Null) { @@ -1487,14 +1784,14 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); } } - + B32 is_on_starter = idx <= active_token_start_idx || token_may_be_string; - + // spey: advance by starter padding byte(s) and reset byte/next_byte values idx += starter_pad; byte = (idx+0 < string.size) ? (string.str[idx+0]) : 0; next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0; - + // rjf: look for ender U64 ender_pad = 0; B32 ender_found = 0; @@ -1540,10 +1837,10 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St else { if(0){} - + // spey: regular string else if(raw_string_nesting_level == 0) { ender_found = byte == '"'; } - + // spey: raw string else if(byte == '"' && next_byte == '#' && raw_string_ender_nesting_level == 0) { raw_string_ender_nesting_level++; } @@ -1556,7 +1853,7 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St raw_string_ender_nesting_level >= 0) { raw_string_ender_nesting_level++; } } } - + ender_pad += 1; }break; case TXT_TokenKind_Symbol: @@ -1584,7 +1881,7 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St { if (byte == '*' && next_byte == '/') multiline_comment_nesting_level--; - + ender_found = (active_token_start_idx+1 < idx && multiline_comment_nesting_level == 0); ender_pad += 2; } @@ -1642,7 +1939,7 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St str8_lit_comp("async"), str8_lit_comp("await"), str8_lit_comp("dyn"), - + // weak keywords str8_lit_comp("macro_rules"), str8_lit_comp("raw"), @@ -1712,17 +2009,17 @@ txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, St } } } - + // rjf: all other tokens else { txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token); } - + // rjf: increment by starter and ender padding idx += ender_pad; } - + // rjf: advance by 1 byte if we haven't found an ender if(!ender_found) { @@ -2459,10 +2756,17 @@ txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_ou set_progress(Min(data.size, 1024) + data.size + data.size); //- rjf: lex function * data -> tokens +#if 1 if(lane_idx() == 0 && lex_function != 0) { shared->info.tokens = lex_function(shared->arena, 0, data); } +#else + if(lane_idx() == 0) + { + shared->info.tokens = txt_token_array_from_lang_kind_string(shared->arena, lang, data); + } +#endif lane_sync(); set_progress(Min(data.size, 1024) + data.size + data.size + data.size*(lex_function != 0)); TXT_TokenArray tokens = shared->info.tokens; diff --git a/src/text/text.h b/src/text/text.h index 5978e43d..23293f3c 100644 --- a/src/text/text.h +++ b/src/text/text.h @@ -32,6 +32,32 @@ typedef enum TXT_TokenKind } TXT_TokenKind; +typedef struct TXT_TokenizerRule TXT_TokenizerRule; +struct TXT_TokenizerRule +{ + TXT_TokenKind token_kind; + String8 open_string; + String8 close_string; + U32 close_advance; + B32 nesting; + B32 escaping; + U32 parent_num; +}; + +typedef struct TXT_TokenizerRulePtrNode TXT_TokenizerRulePtrNode; +struct TXT_TokenizerRulePtrNode +{ + TXT_TokenizerRulePtrNode *next; + TXT_TokenizerRule *v; +}; + +typedef struct TXT_TokenizerRuleArray TXT_TokenizerRuleArray; +struct TXT_TokenizerRuleArray +{ + TXT_TokenizerRule *v; + U64 count; +}; + typedef struct TXT_Token TXT_Token; struct TXT_Token { @@ -138,21 +164,12 @@ struct TXT_LineTokensSlice }; //////////////////////////////// -//~ rjf: Language Kind Types +//~ rjf: Generated Code -typedef enum TXT_LangKind -{ - TXT_LangKind_Null, - TXT_LangKind_C, - TXT_LangKind_CPlusPlus, - TXT_LangKind_Odin, - TXT_LangKind_Jai, - TXT_LangKind_Zig, - TXT_LangKind_Rust, - TXT_LangKind_DisasmX64Intel, - TXT_LangKind_COUNT -} -TXT_LangKind; +#include "generated/text.meta.h" + +//////////////////////////////// +//~ rjf: Language Kind Types typedef TXT_TokenArray TXT_LangLexFunctionType(Arena *arena, U64 *bytes_processed_counter, String8 string); @@ -180,6 +197,8 @@ internal TXT_TokenArray txt_token_array_from_list(Arena *arena, TXT_TokenList *l //////////////////////////////// //~ rjf: Lexing Functions +internal TXT_TokenArray txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, String8 string); + internal TXT_TokenArray txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string); internal TXT_TokenArray txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string); internal TXT_TokenArray txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, String8 string); diff --git a/src/text/text.mdesk b/src/text/text.mdesk new file mode 100644 index 00000000..6b904df3 --- /dev/null +++ b/src/text/text.mdesk @@ -0,0 +1,246 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@table(name ext keywords_table multichar_symbol_table tokenizer_rules_table) +TXT_LangKindTable: +{ + { Null null null null null} + { C c c c c } + { CPlusPlus cpp cpp c c } + { Odin odin odin c null} + { Jai jai jai c null} + { Zig zig zig c null} + { Rust rs rust c null} + { DisasmX64Intel disasm_x64_intel null null null} +} + +@table(string kind) +TXT_LangKindExtTable: +{ + {"h" C } + {"cxx" CPlusPlus} + {"cc" CPlusPlus} + {"c++" CPlusPlus} + {"ixx" CPlusPlus} + {"cxxm" CPlusPlus} + {"c++m" CPlusPlus} + {"ccm" CPlusPlus} + {"cppm" CPlusPlus} + {"mpp" CPlusPlus} + {"C" CPlusPlus} + {"hpp" CPlusPlus} + {"hxx" CPlusPlus} + {"hh" CPlusPlus} + {"h++" CPlusPlus} + {"H" CPlusPlus} +} + +@enum TXT_LangKind: +{ + @expand(TXT_LangKindTable a) `$(a.name)`, + COUNT +} + +@data(String8) +txt_lang_kind_ext_table: +{ + @expand(TXT_LangKindTable a) `str8_lit_comp("$(a.ext)")` +} + +@data(`struct {String8 ext; TXT_LangKind kind;}`) @c_file +txt_ext_lang_kind_table: +{ + @expand(TXT_LangKindTable a) `{str8_lit_comp("$(a.ext)"), TXT_LangKind_$(a.name)}`, + @expand(TXT_LangKindExtTable a) `{str8_lit_comp("$(a.string)"), TXT_LangKind_$(a.kind)}`, +} + +@data(String8Array) txt_keywords_from_lang_kind_table: +{ + @expand(TXT_LangKindTable a) `{txt_keywords__$(a.keywords_table), ArrayCount(txt_keywords__$(a.keywords_table))}` +} + +@data(String8Array) txt_multichar_symbols_from_lang_kind_table: +{ + @expand(TXT_LangKindTable a) `{txt_multichar_symbols__$(a.multichar_symbol_table), ArrayCount(txt_multichar_symbols__$(a.multichar_symbol_table))}` +} + +@data(TXT_TokenizerRuleArray) txt_tokenizer_rules_from_lang_kind_table: +{ + @expand(TXT_LangKindTable a) `{txt_tokenizer_rules__$(a.tokenizer_rules_table), ArrayCount(txt_tokenizer_rules__$(a.tokenizer_rules_table))}` +} + +@data(String8) txt_keywords__null:{`{0}`} +@data(String8) txt_multichar_symbols__null:{`{0}`} +@data(TXT_TokenizerRule) txt_tokenizer_rules__null:{`{TXT_TokenKind_Null}`} + +//////////////////////////////// +//~ rjf: C + +@table(string) +txt_keywords__c: +{ + {"auto"} {"break"} {"case"} {"char"} + {"const"} {"continue"} {"default"} {"do"} + {"double"} {"else"} {"enum"} {"extern"} + {"float"} {"for"} {"goto"} {"if"} + {"int"} {"long"} {"register"} {"return"} + {"short"} {"signed"} {"sizeof"} {"static"} + {"struct"} {"switch"} {"typedef"} {"union"} + {"unsigned"} {"void"} {"volatile"} {"while"} +} +@data(String8) txt_keywords__c: {@expand(txt_keywords__c a) `str8_lit_comp("$(a.string)")`} + +@table(string) +txt_multichar_symbols__c: +{ + {"<<"} + {">>"} + {"<="} + {">="} + {"=="} + {"!="} + {"&&"} + {"||"} + {"|="} + {"&="} + {"^="} + {"~="} + {"+="} + {"-="} + {"*="} + {"/="} + {"%="} + {"<<="} + {">>="} + {"->"} +} +@data(String8) txt_multichar_symbols__c: {@expand(txt_multichar_symbols__c a) `str8_lit_comp("$(a.string)")`} + +@table(token_kind open_string close_string close_advance nesting escaping parent_num) txt_tokenizer_rules__c: +{ + {Comment "//" "\\n" 0 0 1 0} + {Comment "/*" "*/" 2 0 0 0} + {Meta "#" "\\n" 0 0 1 0} + {String '\\"' '\\"' 1 0 1 0} + {String "'" "'" 1 0 1 0} + {String '\\"' '\\"' 1 0 1 3} + {String "<" ">" 1 0 1 3} +} +@data(TXT_TokenizerRule) txt_tokenizer_rules__c: +{ + @expand(txt_tokenizer_rules__c a) `{TXT_TokenKind_$(a.token_kind), str8_lit_comp("$(a.open_string)"), str8_lit_comp("$(a.close_string)"), $(a.close_advance), $(a.nesting), $(a.escaping), $(a.parent_num)}` +} + +//////////////////////////////// +//~ rjf: C++ + +@table(string) +txt_keywords__cpp: +{ + {"alignas"} {"alignof"} {"and"} {"and_eq"} + {"asm"} {"atomic_cancel"} {"atomic_commit"} {"atomic_noexcept"} + {"auto"} {"bitand"} {"bitor"} {"bool"} + {"break"} {"case"} {"catch"} {"char"} + {"char8_t"} {"char16_t"} {"char32_t"} {"class"} + {"compl"} {"concept"} {"const"} {"consteval"} + {"constexpr"} {"constinit"} {"const_cast"} {"continue"} + {"co_await"} {"co_return"} {"co_yield"} {"decltype"} + {"default"} {"delete"} {"do"} {"double"} + {"dynamic_cast"} {"else"} {"enum"} {"explicit"} + {"export"} {"extern"} {"false"} {"float"} + {"for"} {"friend"} {"goto"} {"if"} + {"inline"} {"int"} {"long"} {"mutable"} + {"namespace"} {"new"} {"noexcept"} {"not"} + {"not_eq"} {"nullptr"} {"operator"} {"or"} + {"or_eq"} {"private"} {"protected"} {"public"} + {"reflexpr"} {"register"} {"reinterpret_cast"} {"requires"} + {"return"} {"short"} {"signed"} {"sizeof"} + {"static"} {"static_assert"} {"static_cast"} {"struct"} + {"switch"} {"synchronized"} {"template"} {"this"} + {"thread_local"} {"throw"} {"true"} {"try"} + {"typedef"} {"typeid"} {"typename"} {"union"} + {"unsigned"} {"using"} {"virtual"} {"void"} + {"volatile"} {"wchar_t"} {"while"} {"xor"} + {"xor_eq"} +} +@data(String8) txt_keywords__cpp: {@expand(txt_keywords__cpp a) `str8_lit_comp("$(a.string)")`} + +//////////////////////////////// +//~ rjf: Odin + +@table(string) +txt_keywords__odin: +{ + {"align_of"} {"asm"} {"auto_cast"} {"bit_set"} + {"break"} {"case"} {"cast"} {"context"} + {"continue"} {"defer"} {"distinct"} {"do"} + {"dynamic"} {"else"} {"enum"} {"fallthrough"} + {"for"} {"foreign"} {"if"} {"in"} + {"map"} {"matrix"} {"not_in"} {"or_break"} + {"or_continue"} {"or_else"} {"or_return"} {"package"} + {"proc"} {"return"} {"size_of"} {"struct"} + {"switch"} {"transmute"} {"typeid"} {"union"} + {"using"} {"when"} {"where"} {"import"} +} +@data(String8) txt_keywords__odin: {@expand(txt_keywords__odin a) `str8_lit_comp("$(a.string)")`} + +//////////////////////////////// +//~ rjf: Jai + +@table(string) +txt_keywords__jai: +{ + {"bool"} {"true"} {"false"} {"int"} + {"s8"} {"u8"} {"s16"} {"u16"} + {"s32"} {"u32"} {"s64"} {"u64"} + {"s128"} {"u128"} {"float"} {"float32"} + {"float64"} {"void"} {"enum"} {"enum_flags"} + {"size_of"} {"string"} {"type_of"} {"cast"} + {"if"} {"ifs"} {"then"} {"else"} + {"case"} {"for"} {"while"} {"break"} + {"continue"} {"remove"} {"return"} {"inline"} + {"null"} {"defer"} {"xx"} +} +@data(String8) txt_keywords__jai: {@expand(txt_keywords__jai a) `str8_lit_comp("$(a.string)")`} + +//////////////////////////////// +//~ rjf: Zig + +@table(string) +txt_keywords__zig: +{ + {"addrspace"} {"align"} {"allowzero"} {"and"} + {"anyframe"} {"anytype"} {"asm"} {"async"} + {"await"} {"break"} {"callconv"} {"catch"} + {"comptime"} {"const"} {"continue"} {"defer"} + {"else"} {"enum"} {"errdefer"} {"error"} + {"export"} {"extern"} {"fn"} {"for"} + {"if"} {"inline"} {"noalias"} {"nosuspend"} + {"noinline"} {"opaque"} {"or"} {"orelse"} + {"packed"} {"pub"} {"resume"} {"return"} + {"linksection"} {"struct"} {"suspend"} {"switch"} + {"test"} {"threadlocal"} {"try"} {"union"} + {"unreachable"} {"usingnamespace"} {"var"} {"volatile"} + {"while"} +} +@data(String8) txt_keywords__zig: {@expand(txt_keywords__zig a) `str8_lit_comp("$(a.string)")`} + +//////////////////////////////// +//~ rjf: Rust + +@table(string) +txt_keywords__rust: +{ + {"as"} {"break"} {"const"} {"continue"} + {"crate"} {"else"} {"enum"} {"extern"} + {"false"} {"fn"} {"for"} {"if"} + {"impl"} {"in"} {"let"} {"loop"} + {"match"} {"mod"} {"move"} {"mut"} + {"pub"} {"ref"} {"return"} {"self"} + {"Self"} {"static"} {"struct"} {"super"} + {"trait"} {"true"} {"type"} {"unsafe"} + {"use"} {"where"} {"while"} {"yield"} + {"async"} {"await"} {"dyn"} {"macro_rules"} + {"raw"} {"safe"} {"union"} +} +@data(String8) txt_keywords__rust: {@expand(txt_keywords__rust a) `str8_lit_comp("$(a.string)")`} From e9e0036122fc8c42c520328e903d2beee2327004 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 6 Nov 2025 12:47:05 -0800 Subject: [PATCH 008/850] checkpoint on unified lexer --- src/text/text.c | 96 +++++++++++++++++++++++++++++-------------------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/src/text/text.c b/src/text/text.c index 9ebe6c6b..8da83931 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -215,13 +215,12 @@ txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, Stri next_escaped = 1; } - // rjf: take starter, push new token tasks + // rjf: take token starters + B32 new_token_needed = (top_task == 0); + TXT_TokenizerRule *new_rule = nil_rule; + TXT_TokenKind new_token_kind = TXT_TokenKind_Null; { - TXT_TokenizerRule *new_rule = nil_rule; - TXT_TokenKind new_token_kind = TXT_TokenKind_Null; - // rjf: use next bytes to look up a rule from the table - if(top_task == 0) { TXT_TokenizerRule *active_rule = top_task ? top_task->rule : nil_rule; U64 hash_1byte = u64_hash_from_str8(string_1byte); @@ -292,37 +291,11 @@ txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, Stri byte == '>' || byte == '/' || byte == '?' || byte == '|') { new_token_kind = TXT_TokenKind_Symbol; } } - - // rjf: start new token - if(new_token_kind != TXT_TokenKind_Null) - { - TokenTask *task = free_task; - if(task != 0) - { - SLLStackPop(free_task); - } - else - { - task = push_array(scratch.arena, TokenTask, 1); - } - SLLStackPush(top_task, task); - top_task->rule = new_rule; - top_task->kind = new_token_kind; - top_task->start_idx = idx; - } - - // rjf: invalid token kind -> emit error - else if(top_task == 0) - { - TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; - txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); - } } // rjf: look for ender based on rule's closing symbol U64 ender_pad = 0; B32 ender_found = 0; - B32 task_pop = 0; if(top_task != 0 && idx > top_task->start_idx) { TXT_TokenKind active_token_kind = top_task->kind; @@ -373,13 +346,33 @@ txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, Stri } } - // rjf: next byte is ender => emit token + // rjf: if we have a new token to start, but we have an active token, then + // end the current token (but keep the same stack) + B32 keep_top_task = 0; + if(top_task != 0 && new_token_kind != TXT_TokenKind_Null && idx > top_task->start_idx) + { + keep_top_task = (!ender_found); + ender_found = 1; + } + + // rjf: if we have an ender => emit token(s) for current task if(ender_found) { TXT_Token token = {top_task->kind, r1u64(top_task->start_idx, idx+ender_pad)}; - TokenTask *popped = top_task; - SLLStackPop(top_task); - SLLStackPush(free_task, popped); + if(!keep_top_task) + { + TokenTask *popped = top_task; + SLLStackPop(top_task); + SLLStackPush(free_task, popped); + if(top_task != 0) + { + top_task->start_idx = idx+ender_pad; + } + } + else + { + top_task->start_idx = idx+ender_pad; + } // rjf: trim \r's off of end { @@ -442,9 +435,31 @@ txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, Stri { txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); } - - // rjf: increment by ender padding - idx += ender_pad; + } + + // rjf: start new token + if(new_token_kind != TXT_TokenKind_Null) + { + TokenTask *task = free_task; + if(task != 0) + { + SLLStackPop(free_task); + } + else + { + task = push_array(scratch.arena, TokenTask, 1); + } + SLLStackPush(top_task, task); + top_task->rule = new_rule; + top_task->kind = new_token_kind; + top_task->start_idx = idx; + } + + // rjf: invalid token kind -> emit error + else if(new_token_needed) + { + TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)}; + txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token); } // rjf: advance by 1 byte if we haven't found an ender @@ -452,6 +467,11 @@ txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, Stri { idx += 1; } + + // rjf: advance by ender padding + idx += ender_pad; + + // rjf: advance escaping escaped = next_escaped; } } From bc49b806c113286d1d7fbec7d0ae2c395459f3b2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 10:33:17 -0800 Subject: [PATCH 009/850] do not retry artifact computation if cancelled --- src/artifact_cache/artifact_cache.c | 4 ++-- src/text/text.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 679a50fe..6e2d138d 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -376,7 +376,7 @@ ac_async_tick(void) AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen); // rjf: retry? -> resubmit request - if(retry && lane_idx() == 0) + if(retry && lane_idx() == 0 && !ins_atomic_u32_eval(r->cancel_signal)) { AC_RequestBatch *batch = &ac_shared->req_batches[task_idx]; MutexScope(batch->mutex) @@ -485,7 +485,7 @@ ac_async_tick(void) lane_ctx(lane_ctx_restore); // rjf: retry? -> resubmit request - if(retry) + if(retry && !ins_atomic_u32_eval(r->cancel_signal)) { AC_RequestBatch *batch = &ac_shared->req_batches[task_idx]; MutexScope(batch->mutex) diff --git a/src/text/text.c b/src/text/text.c index 8da83931..d8bac644 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -307,8 +307,8 @@ txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, Stri ender_found = 1; } else if(active_rule != nil_rule && - str8_match(string_1byte, active_rule->close_string, 0) || - str8_match(string_2byte, active_rule->close_string, 0)) + (str8_match(string_1byte, active_rule->close_string, 0) || + str8_match(string_2byte, active_rule->close_string, 0))) { ender_found = 1; ender_pad = active_rule->close_advance; From 0c7630e41cd529e3180b6e0699b6554486907daf Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 12:00:36 -0800 Subject: [PATCH 010/850] cursor trails --- src/draw/draw.c | 2 ++ src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 4 +++ src/raddbg/raddbg_widgets.c | 31 +++++++++++++++++++ .../d3d11/generated/render_d3d11.meta.h | 7 +++-- src/render/d3d11/render_d3d11.mdesk | 7 +++-- src/render/render_core.h | 2 +- 7 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/draw/draw.c b/src/draw/draw.c index 250317cb..1f870c21 100644 --- a/src/draw/draw.c +++ b/src/draw/draw.c @@ -318,6 +318,7 @@ dr_rect(Rng2F32 dst, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 inst->border_thickness = border_thickness; inst->edge_softness = edge_softness; inst->white_texture_override = 1.f; + inst->shear = 0.f; bucket->last_cmd_stack_gen = bucket->stack_gen; return inst; } @@ -363,6 +364,7 @@ dr_img(Rng2F32 dst, Rng2F32 src, R_Handle texture, Vec4F32 color, F32 corner_rad inst->border_thickness = border_thickness; inst->edge_softness = edge_softness; inst->white_texture_override = 0.f; + inst->shear = 0.f; bucket->last_cmd_stack_gen = bucket->stack_gen; return inst; } diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index f02a7917..33777f96 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -426,7 +426,7 @@ RD_VocabInfo rd_vocab_info_table[358] = RD_NameSchemaInfo rd_name_schema_info_table[26] = { -{str8_lit_comp("user"), str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': query,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, +{str8_lit_comp("user"), str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': query,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, {str8_lit_comp("project"), str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': query,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index c1023ed2..8c73f11b 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -264,6 +264,10 @@ RD_VocabTable: @default(1) @display_name('Cursor Scope Lines') @description("Controls whether or not scopes containing the cursor in text views are drawn.") 'cursor_scope_lines': bool, + //- rjf: cursor decorations + @default(1) @display_name('Cursor Trail') @description("Controls whether or not a movement trail of the cursor is drawn.") + 'cursor_trail': bool, + //- rjf: thread & breakpoint decorations @default(1) @display_name('Thread Lines') @description("Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.") 'thread_lines': bool, diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index d87d844a..56af9ada 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1277,6 +1277,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe B32 do_bp_lines = rd_setting_b32_from_name(str8_lit("breakpoint_lines")); B32 do_bp_glow = rd_setting_b32_from_name(str8_lit("breakpoint_glow")); B32 do_scope_lines = rd_setting_b32_from_name(str8_lit("cursor_scope_lines")); + B32 do_cursor_trail = rd_setting_b32_from_name(str8_lit("cursor_trail")); Vec4F32 pop_color = {0}; UI_TagF("pop") { @@ -2775,7 +2776,10 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { S64 column = cursor->column; Vec2F32 advance = fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, column-1)); + F32 cursor_y = line_box->rect.y0-params->font_size*0.125f; + F32 cursor_y__animated = ui_anim(ui_key_from_stringf(text_container_box->key, "cursor_y_px"), cursor_y); F32 cursor_off_pixels = advance.x; + F32 cursor_off_pixels__animated = ui_anim(ui_key_from_stringf(text_container_box->key, "cursor_off_px"), cursor_off_pixels); F32 cursor_thickness = ClampBot(1.f, floor_f32(line_box->font_size/10.f)); Rng2F32 cursor_rect = { @@ -2784,12 +2788,39 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe ui_box_text_position(line_box).x+cursor_off_pixels+cursor_thickness, line_box->rect.y1+params->font_size*0.125f, }; + Rng1F32 trail_off_span = r1f32(cursor_off_pixels__animated, cursor_off_pixels); + Rng2F32 trail_rect = + { + ui_box_text_position(line_box).x+trail_off_span.min, + line_box->rect.y0-params->font_size*0.125f, + ui_box_text_position(line_box).x+trail_off_span.max, + line_box->rect.y1+params->font_size*0.125f, + }; Vec4F32 cursor_color = ui_color_from_name(str8_lit("cursor")); + Vec4F32 trail_color = cursor_color; if(!is_focused) { cursor_color.w *= 0.5f; } + trail_color.w *= 0.25f; dr_rect(cursor_rect, cursor_color, 1.f, 0, 0.f); + if(do_cursor_trail) + { + R_Rect2DInst *trail_inst = dr_rect(trail_rect, trail_color, ui_top_font_size()*0.2f, 0, 1.f); + trail_inst->shear = cursor_y - cursor_y__animated; + if(cursor_off_pixels > cursor_off_pixels__animated) + { + trail_inst->dst = shift_2f32(trail_inst->dst, v2f32(0, -trail_inst->shear)); + trail_inst->colors[Corner_00].w *= 0.1f; + trail_inst->colors[Corner_01].w *= 0.1f; + } + else + { + trail_inst->shear *= -1; + trail_inst->colors[Corner_10].w *= 0.1f; + trail_inst->colors[Corner_11].w *= 0.1f; + } + } } // rjf: extra rendering for lines with line-info that match the hovered diff --git a/src/render/d3d11/generated/render_d3d11.meta.h b/src/render/d3d11/generated/render_d3d11.meta.h index cc1949a7..6578fe5b 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.h +++ b/src/render/d3d11/generated/render_d3d11.meta.h @@ -58,7 +58,7 @@ str8_lit_comp( " float4 color10 : COL2;\n" " float4 color11 : COL3;\n" " float4 corner_radii_px : CRAD;\n" -" float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused\n" +" float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\n" " uint vertex_id : SV_VertexID;\n" "};\n" "\n" @@ -113,14 +113,15 @@ str8_lit_comp( " float border_thickness_px = cpu2vertex.style_params.x;\n" " float softness_px = cpu2vertex.style_params.y;\n" " float omit_texture = cpu2vertex.style_params.z;\n" +" float shear_px = cpu2vertex.style_params.w;\n" " \n" " //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\n" " float2 dst_p_verts_px[] =\n" " {\n" " float2(dst_p0_px.x, dst_p1_px.y),\n" " float2(dst_p0_px.x, dst_p0_px.y),\n" -" float2(dst_p1_px.x, dst_p1_px.y),\n" -" float2(dst_p1_px.x, dst_p0_px.y),\n" +" float2(dst_p1_px.x, dst_p1_px.y + shear_px),\n" +" float2(dst_p1_px.x, dst_p0_px.y + shear_px),\n" " };\n" " float2 src_p_verts_px[] =\n" " {\n" diff --git a/src/render/d3d11/render_d3d11.mdesk b/src/render/d3d11/render_d3d11.mdesk index 0e001db1..888fa4a9 100644 --- a/src/render/d3d11/render_d3d11.mdesk +++ b/src/render/d3d11/render_d3d11.mdesk @@ -56,7 +56,7 @@ struct CPU2Vertex float4 color10 : COL2; float4 color11 : COL3; float4 corner_radii_px : CRAD; - float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused + float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear uint vertex_id : SV_VertexID; }; @@ -111,14 +111,15 @@ vs_main(CPU2Vertex cpu2vertex) float border_thickness_px = cpu2vertex.style_params.x; float softness_px = cpu2vertex.style_params.y; float omit_texture = cpu2vertex.style_params.z; + float shear_px = cpu2vertex.style_params.w; //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius) float2 dst_p_verts_px[] = { float2(dst_p0_px.x, dst_p1_px.y), float2(dst_p0_px.x, dst_p0_px.y), - float2(dst_p1_px.x, dst_p1_px.y), - float2(dst_p1_px.x, dst_p0_px.y), + float2(dst_p1_px.x, dst_p1_px.y + shear_px), + float2(dst_p1_px.x, dst_p0_px.y + shear_px), }; float2 src_p_verts_px[] = { diff --git a/src/render/render_core.h b/src/render/render_core.h index e9182497..039cfa99 100644 --- a/src/render/render_core.h +++ b/src/render/render_core.h @@ -103,7 +103,7 @@ struct R_Rect2DInst F32 border_thickness; F32 edge_softness; F32 white_texture_override; - F32 _unused_[1]; + F32 shear; }; typedef struct R_Mesh3DInst R_Mesh3DInst; From 0549f670c337611611d766be5729652586526d0c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 13:20:57 -0800 Subject: [PATCH 011/850] cell cursor trail --- src/raddbg/raddbg_widgets.c | 1 + src/ui/ui_basic_widgets.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 56af9ada..5dbf202c 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -3373,6 +3373,7 @@ rd_cell(RD_CellParams *params, String8 string) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); + B32 do_cursor_trail = rd_setting_b32_from_name(str8_lit("cursor_trail")); ////////////////////////////// //- rjf: unpack visual metrics diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index e55eaa34..b8201857 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -143,11 +143,14 @@ internal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw) cursor_color.w *= box->parent->parent->focus_active_t; Vec4F32 select_color = ui_color_from_tags_key_name(box->tags_key, str8_lit("selection")); select_color.w *= (box->parent->parent->focus_active_t*0.2f + 0.8f); + Vec4F32 trail_color = cursor_color; + trail_color.w *= 0.25f; Vec2F32 text_position = ui_box_text_position(box); String8 edited_string = draw_data->edited_string; TxtPt cursor = draw_data->cursor; TxtPt mark = draw_data->mark; F32 cursor_pixel_off = fnt_dim_from_tag_size_string(font, font_size, 0, tab_size, str8_prefix(edited_string, cursor.column-1)).x; + F32 cursor_pixel_off__animated = ui_anim(ui_key_from_stringf(box->key, "cursor_off_px"), cursor_pixel_off); F32 mark_pixel_off = fnt_dim_from_tag_size_string(font, font_size, 0, tab_size, str8_prefix(edited_string, mark.column-1)).x; F32 cursor_thickness = ClampBot(1.f, floor_f32(font_size/10.f)); Rng2F32 cursor_rect = @@ -157,6 +160,14 @@ internal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw) text_position.x + cursor_pixel_off + cursor_thickness, box->parent->parent->rect.y1-ui_top_font_size()*0.5f, }; + Rng1F32 trail_off_span = r1f32(cursor_pixel_off, cursor_pixel_off__animated); + Rng2F32 trail_rect = + { + text_position.x + trail_off_span.min, + cursor_rect.y0, + text_position.x + trail_off_span.max, + cursor_rect.y1, + }; Rng2F32 mark_rect = { text_position.x + mark_pixel_off - cursor_thickness, @@ -167,6 +178,17 @@ internal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw) Rng2F32 select_rect = union_2f32(cursor_rect, mark_rect); dr_rect(select_rect, select_color, font_size/2.f, 0, 1.f); dr_rect(cursor_rect, cursor_color, 0.f, 0, 0.f); + R_Rect2DInst *trail_inst = dr_rect(trail_rect, trail_color, ui_top_font_size()*0.2f, 0, 1.f); + if(cursor_pixel_off > cursor_pixel_off__animated) + { + trail_inst->colors[Corner_00].w *= 0.1f; + trail_inst->colors[Corner_01].w *= 0.1f; + } + else + { + trail_inst->colors[Corner_10].w *= 0.1f; + trail_inst->colors[Corner_11].w *= 0.1f; + } } internal UI_Signal From e4aae5b0756fff63cdfa3516632d1a8962195a66 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 13:40:24 -0800 Subject: [PATCH 012/850] respect cursor trail enabling in single line trail path --- src/raddbg/raddbg_widgets.c | 1 + src/ui/ui_basic_widgets.c | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 5dbf202c..1836dfda 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -4151,6 +4151,7 @@ rd_cell(RD_CellParams *params, String8 string) draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); draw_data->cursor = params->cursor[0]; draw_data->mark = params->mark[0]; + draw_data->trail = do_cursor_trail; ui_box_equip_custom_draw(text_box, ui_line_edit_draw, draw_data); Vec2F32 text2mouse = sub_2f32(ui_mouse(), ui_box_text_position(text_box)); FNT_Tag font = ui_top_font(); diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index b8201857..8723c6cd 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -131,6 +131,7 @@ struct UI_LineEditDrawData String8 edited_string; TxtPt cursor; TxtPt mark; + B32 trail; }; internal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw) @@ -178,16 +179,19 @@ internal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw) Rng2F32 select_rect = union_2f32(cursor_rect, mark_rect); dr_rect(select_rect, select_color, font_size/2.f, 0, 1.f); dr_rect(cursor_rect, cursor_color, 0.f, 0, 0.f); - R_Rect2DInst *trail_inst = dr_rect(trail_rect, trail_color, ui_top_font_size()*0.2f, 0, 1.f); - if(cursor_pixel_off > cursor_pixel_off__animated) + if(draw_data->trail) { - trail_inst->colors[Corner_00].w *= 0.1f; - trail_inst->colors[Corner_01].w *= 0.1f; - } - else - { - trail_inst->colors[Corner_10].w *= 0.1f; - trail_inst->colors[Corner_11].w *= 0.1f; + R_Rect2DInst *trail_inst = dr_rect(trail_rect, trail_color, ui_top_font_size()*0.2f, 0, 1.f); + if(cursor_pixel_off > cursor_pixel_off__animated) + { + trail_inst->colors[Corner_00].w *= 0.1f; + trail_inst->colors[Corner_01].w *= 0.1f; + } + else + { + trail_inst->colors[Corner_10].w *= 0.1f; + trail_inst->colors[Corner_11].w *= 0.1f; + } } } @@ -288,6 +292,7 @@ ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); draw_data->cursor = *cursor; draw_data->mark = *mark; + draw_data->trail = 1; ui_box_equip_display_string(editstr_box, edit_string); ui_box_equip_custom_draw(editstr_box, ui_line_edit_draw, draw_data); mouse_pt = txt_pt(1, 1+ui_box_char_pos_from_xy(editstr_box, ui_mouse())); From 88b79b2b6ac1e27189cf506f31b05b0cba3cf417 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 14:15:35 -0800 Subject: [PATCH 013/850] turn off transient tab creation with explicit open/switch command --- src/raddbg/generated/raddbg.meta.c | 6 ++-- src/raddbg/generated/raddbg.meta.h | 7 ++-- src/raddbg/raddbg.mdesk | 1 + src/raddbg/raddbg_core.c | 56 +++++++++++++++++------------- 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 33777f96..cf9d1d40 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -454,7 +454,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[26] = {str8_lit_comp("thread"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':query}")}, }; -String8 rd_reg_slot_code_name_table[47] = +String8 rd_reg_slot_code_name_table[48] = { {0}, str8_lit_comp("machine"), @@ -499,13 +499,14 @@ str8_lit_comp("do_lister"), str8_lit_comp("do_big_rows"), str8_lit_comp("all_windows"), str8_lit_comp("non_graphical"), +str8_lit_comp("prefer_new_tab"), str8_lit_comp("dir2"), str8_lit_comp("string"), str8_lit_comp("cmd_name"), str8_lit_comp("os_event"), }; -Rng1U64 rd_reg_slot_range_table[47] = +Rng1U64 rd_reg_slot_range_table[48] = { {0}, {OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(CTRL_Handle)}, @@ -550,6 +551,7 @@ Rng1U64 rd_reg_slot_range_table[47] = {OffsetOf(RD_Regs, do_big_rows), OffsetOf(RD_Regs, do_big_rows) + sizeof(B32)}, {OffsetOf(RD_Regs, all_windows), OffsetOf(RD_Regs, all_windows) + sizeof(B32)}, {OffsetOf(RD_Regs, non_graphical), OffsetOf(RD_Regs, non_graphical) + sizeof(B32)}, +{OffsetOf(RD_Regs, prefer_new_tab), OffsetOf(RD_Regs, prefer_new_tab) + sizeof(B32)}, {OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)}, {OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)}, {OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 411ddb7d..b9bac75c 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -51,6 +51,7 @@ RD_RegSlot_DoLister, RD_RegSlot_DoBigRows, RD_RegSlot_AllWindows, RD_RegSlot_NonGraphical, +RD_RegSlot_PreferNewTab, RD_RegSlot_Dir2, RD_RegSlot_String, RD_RegSlot_CmdName, @@ -489,6 +490,7 @@ B32 do_lister; B32 do_big_rows; B32 all_windows; B32 non_graphical; +B32 prefer_new_tab; Dir2 dir2; String8 string; String8 cmd_name; @@ -587,6 +589,7 @@ Z(getting_started)\ .do_big_rows = rd_regs()->do_big_rows,\ .all_windows = rd_regs()->all_windows,\ .non_graphical = rd_regs()->non_graphical,\ +.prefer_new_tab = rd_regs()->prefer_new_tab,\ .dir2 = rd_regs()->dir2,\ .string = rd_regs()->string,\ .cmd_name = rd_regs()->cmd_name,\ @@ -597,8 +600,8 @@ extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; extern RD_VocabInfo rd_vocab_info_table[358]; extern RD_NameSchemaInfo rd_name_schema_info_table[26]; -extern String8 rd_reg_slot_code_name_table[47]; -extern Rng1U64 rd_reg_slot_range_table[47]; +extern String8 rd_reg_slot_code_name_table[48]; +extern Rng1U64 rd_reg_slot_range_table[48]; extern String8 rd_binding_version_remap_old_name_table[8]; extern String8 rd_binding_version_remap_new_name_table[8]; extern String8 rd_icon_kind_text_table[75]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 8c73f11b..e8e77f06 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -797,6 +797,7 @@ RD_RegTable: {B32 do_big_rows DoBigRows } {B32 all_windows AllWindows } {B32 non_graphical NonGraphical } + {B32 prefer_new_tab PreferNewTab } {Dir2 dir2 Dir2 } {String8 string String } {String8 cmd_name CmdName } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 8a9a9464..01cfcb8d 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -13515,7 +13515,7 @@ rd_frame(void) { path = rd_regs()->file_path; } - rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = path, .cursor = txt_pt(0, 0), .vaddr = 0, .force_focus = 1); + rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = path, .cursor = txt_pt(0, 0), .vaddr = 0, .force_focus = 1, .prefer_new_tab = 1); }break; case RD_CmdKind_SwitchToPartnerFile: { @@ -13542,7 +13542,7 @@ rd_frame(void) FileProperties candidate_props = os_properties_from_file_path(candidate_path); if(candidate_props.modified != 0) { - rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = candidate_path, .cursor = txt_pt(0, 0), .vaddr = 0); + rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = candidate_path, .cursor = txt_pt(0, 0), .vaddr = 0, .prefer_new_tab = 1); break; } } @@ -14124,12 +14124,14 @@ rd_frame(void) CTRL_Entity *process = &ctrl_entity_nil; U64 vaddr = 0; B32 require_disasm_snap = 0; + B32 prefer_new_tab = 0; { - file_path = rd_mapped_from_file_path(scratch.arena, rd_regs()->file_path); - point = rd_regs()->cursor; - thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); - process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process); - vaddr = rd_regs()->vaddr; + file_path = rd_mapped_from_file_path(scratch.arena, rd_regs()->file_path); + point = rd_regs()->cursor; + thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process); + vaddr = rd_regs()->vaddr; + prefer_new_tab = rd_regs()->prefer_new_tab; if(file_path.size == 0) { require_disasm_snap = 1; @@ -14236,25 +14238,28 @@ rd_frame(void) // rjf: try to find panel/view pair that has any *auto* source code tab open info->panel_w_auto = &cfg_nil_panel_node; info->view_w_auto = &cfg_nil_node; - for(CFG_PanelNode *panel = panel_tree.root; - panel != &cfg_nil_panel_node; - panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) + if(!prefer_new_tab) { - if(panel->first != &cfg_nil_panel_node) + for(CFG_PanelNode *panel = panel_tree.root; + panel != &cfg_nil_panel_node; + panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) { - continue; - } - for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next) - { - CFG_Node *tab = tab_n->v; - if(rd_cfg_is_project_filtered(tab)) { continue; } - RD_RegsScope(.tab = tab->id, .view = tab->id) + if(panel->first != &cfg_nil_panel_node) { - if(str8_match(tab->string, str8_lit("text"), 0) && - rd_view_setting_b32_from_name(str8_lit("auto"))) + continue; + } + for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next) + { + CFG_Node *tab = tab_n->v; + if(rd_cfg_is_project_filtered(tab)) { continue; } + RD_RegsScope(.tab = tab->id, .view = tab->id) { - info->panel_w_auto = panel; - info->view_w_auto = tab; + if(str8_match(tab->string, str8_lit("text"), 0) && + rd_view_setting_b32_from_name(str8_lit("auto"))) + { + info->panel_w_auto = panel; + info->view_w_auto = tab; + } } } } @@ -14616,8 +14621,11 @@ rd_frame(void) dst_tab = cfg_node_new(rd_state->cfg, dst_panel->cfg, str8_lit("text")); CFG_Node *expr = cfg_node_new(rd_state->cfg, dst_tab, str8_lit("expression")); cfg_node_new(rd_state->cfg, expr, rd_eval_string_from_file_path(scratch.arena, file_path)); - CFG_Node *auto_root = cfg_node_new(rd_state->cfg, dst_tab, str8_lit("auto")); - cfg_node_new(rd_state->cfg, auto_root, str8_lit("1")); + if(!prefer_new_tab) + { + CFG_Node *auto_root = cfg_node_new(rd_state->cfg, dst_tab, str8_lit("auto")); + cfg_node_new(rd_state->cfg, auto_root, str8_lit("1")); + } } // rjf: determine if we need a contain or center From ecbce1efdf743f478dabc6c2e78a2beee31fb983 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 13 Oct 2025 10:57:01 -0700 Subject: [PATCH 014/850] add TR and LDTR registers --- src/dwarf/dwarf.h | 14 +++++++------- src/lib_rdi/rdi.h | 8 ++++++++ src/rdi/rdi.mdesk | 4 ++++ src/regs/generated/regs.meta.c | 24 ++++++++++++++++++------ src/regs/generated/regs.meta.h | 20 ++++++++++++++------ src/regs/rdi/generated/regs_rdi.meta.c | 8 ++++++++ src/regs/regs.mdesk | 4 ++++ 7 files changed, 63 insertions(+), 19 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 7f9e9c61..7419bed5 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1635,8 +1635,8 @@ X(Ss, 42, ss, 0, 2) \ X(Ds, 43, ds, 0, 2) \ X(Fs, 44, fs, 0, 2) \ X(Gs, 45, gs, 0, 2) \ -X(Tr, 48, nil, 0, 0) \ -X(Ldtr, 49, nil, 0, 0) +X(Tr, 48, tr, 0, 0) \ +X(Ldtr, 49, ldtr, 0, 0) #define DW_Regs_X64_XList(X) \ X(Rax, 0, rax, 0, 8) \ @@ -1711,10 +1711,10 @@ X(Ss, 52, ss, 0, 2) \ X(Ds, 53, ds, 0, 2) \ X(Fs, 54, fs, 0, 2) \ X(Gs, 55, gs, 0, 2) \ -X(FsBase, 58, nil, 0, 0) \ -X(GsBase, 59, nil, 0, 0) \ -X(Tr, 62, nil, 0, 0) \ -X(Ldtr, 63, nil, 0, 0) +X(FsBase, 58, fsbase, 0, 0) \ +X(GsBase, 59, gsbase, 0, 0) \ +X(Tr, 62, tr, 0, 0) \ +X(Ldtr, 63, ldtr, 0, 0) typedef U32 DW_Reg; @@ -1744,8 +1744,8 @@ internal U64 dw_reg_size_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_pos_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code); internal U64 dw_reg_pos_from_code(Arch arch, DW_Reg reg_code); -internal U64 dw_reg_max_size_from_arch(Arch arch); internal U64 dw_reg_count_from_arch(Arch arch); +internal U64 dw_reg_max_size_from_arch(Arch arch); //- Attrib Class Encodings diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 7096399b..f4160b8b 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -206,6 +206,8 @@ RDI_RegCodeX86_ymm4 = 57, RDI_RegCodeX86_ymm5 = 58, RDI_RegCodeX86_ymm6 = 59, RDI_RegCodeX86_ymm7 = 60, +RDI_RegCodeX86_tr = 61, +RDI_RegCodeX86_ldtr = 62, } RDI_RegCodeX86Enum; typedef RDI_U8 RDI_RegCodeX64; @@ -314,6 +316,8 @@ RDI_RegCodeX64_fdp = 99, RDI_RegCodeX64_mxcsr_mask = 100, RDI_RegCodeX64_cetmsr = 101, RDI_RegCodeX64_cetssp = 102, +RDI_RegCodeX64_tr = 103, +RDI_RegCodeX64_ldtr = 104, } RDI_RegCodeX64Enum; typedef RDI_U32 RDI_BinarySectionFlags; @@ -699,6 +703,8 @@ X(ymm4, 57)\ X(ymm5, 58)\ X(ymm6, 59)\ X(ymm7, 60)\ +X(tr, 61)\ +X(ldtr, 62)\ #define RDI_RegCodeX64_XList \ X(nil, 0)\ @@ -804,6 +810,8 @@ X(fdp, 99)\ X(mxcsr_mask, 100)\ X(cetmsr, 101)\ X(cetssp, 102)\ +X(tr, 103)\ +X(ldtr, 104)\ #define RDI_TopLevelInfo_XList \ X(RDI_Arch, arch)\ diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index db7ca4be..6d90e855 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -346,6 +346,8 @@ RDI_RegCodeX86Table: {ymm5 58} {ymm6 59} {ymm7 60} + {tr 61} + {ldtr 62} } @table(name value) @@ -454,6 +456,8 @@ RDI_RegCodeX64Table: {mxcsr_mask 100} {cetmsr 101} {cetssp 102} + {tr 103} + {ldtr 104} } @enum(RDI_U32) RDI_Arch: diff --git a/src/regs/generated/regs.meta.c b/src/regs/generated/regs.meta.c index f1a01b06..cd5fca12 100644 --- a/src/regs/generated/regs.meta.c +++ b/src/regs/generated/regs.meta.c @@ -103,7 +103,7 @@ case Arch_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break; return result; } C_LINKAGE_BEGIN -REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[103] = +REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[105] = { REGS_UsageKind_Normal, REGS_UsageKind_Normal, @@ -208,6 +208,8 @@ REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, }; REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96] = @@ -310,7 +312,7 @@ REGS_UsageKind_Vector, REGS_UsageKind_Vector, }; -String8 regs_g_reg_code_x64_string_table[103] = +String8 regs_g_reg_code_x64_string_table[105] = { str8_lit_comp(""), str8_lit_comp("rax"), @@ -415,6 +417,8 @@ str8_lit_comp("k6"), str8_lit_comp("k7"), str8_lit_comp("cetmsr"), str8_lit_comp("cetssp"), +str8_lit_comp("tr"), +str8_lit_comp("ldtr"), }; String8 regs_g_alias_code_x64_string_table[96] = @@ -517,7 +521,7 @@ str8_lit_comp("mm6"), str8_lit_comp("mm7"), }; -REGS_Rng regs_g_reg_code_x64_rng_table[103] = +REGS_Rng regs_g_reg_code_x64_rng_table[105] = { {0}, {(U16)OffsetOf(REGS_RegBlockX64, rax), 8}, @@ -622,6 +626,8 @@ REGS_Rng regs_g_reg_code_x64_rng_table[103] = {(U16)OffsetOf(REGS_RegBlockX64, k7), 8}, {(U16)OffsetOf(REGS_RegBlockX64, cetmsr), 8}, {(U16)OffsetOf(REGS_RegBlockX64, cetssp), 8}, +{(U16)OffsetOf(REGS_RegBlockX64, tr), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, ldtr), 2}, }; REGS_Slice regs_g_alias_code_x64_slice_table[96] = @@ -724,7 +730,7 @@ REGS_Slice regs_g_alias_code_x64_slice_table[96] = {REGS_RegCodeX64_fpr7, 0, 8}, }; -REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[61] = +REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[63] = { REGS_UsageKind_Normal, REGS_UsageKind_Normal, @@ -779,6 +785,8 @@ REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, +REGS_UsageKind_Normal, +REGS_UsageKind_Normal, REGS_UsageKind_Vector, REGS_UsageKind_Vector, REGS_UsageKind_Vector, @@ -829,7 +837,7 @@ REGS_UsageKind_Vector, REGS_UsageKind_Vector, }; -String8 regs_g_reg_code_x86_string_table[61] = +String8 regs_g_reg_code_x86_string_table[63] = { str8_lit_comp(""), str8_lit_comp("eax"), @@ -884,6 +892,8 @@ str8_lit_comp("ds"), str8_lit_comp("es"), str8_lit_comp("fs"), str8_lit_comp("gs"), +str8_lit_comp("tr"), +str8_lit_comp("ldtr"), str8_lit_comp("ymm0"), str8_lit_comp("ymm1"), str8_lit_comp("ymm2"), @@ -934,7 +944,7 @@ str8_lit_comp("mm6"), str8_lit_comp("mm7"), }; -REGS_Rng regs_g_reg_code_x86_rng_table[61] = +REGS_Rng regs_g_reg_code_x86_rng_table[63] = { {0}, {(U16)OffsetOf(REGS_RegBlockX86, eax), 4}, @@ -989,6 +999,8 @@ REGS_Rng regs_g_reg_code_x86_rng_table[61] = {(U16)OffsetOf(REGS_RegBlockX86, es), 2}, {(U16)OffsetOf(REGS_RegBlockX86, fs), 2}, {(U16)OffsetOf(REGS_RegBlockX86, gs), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, tr), 2}, +{(U16)OffsetOf(REGS_RegBlockX86, ldtr), 2}, {(U16)OffsetOf(REGS_RegBlockX86, ymm0), 32}, {(U16)OffsetOf(REGS_RegBlockX86, ymm1), 32}, {(U16)OffsetOf(REGS_RegBlockX86, ymm2), 32}, diff --git a/src/regs/generated/regs.meta.h b/src/regs/generated/regs.meta.h index 1f1316dc..d5819953 100644 --- a/src/regs/generated/regs.meta.h +++ b/src/regs/generated/regs.meta.h @@ -111,6 +111,8 @@ REGS_RegCodeX64_k6, REGS_RegCodeX64_k7, REGS_RegCodeX64_cetmsr, REGS_RegCodeX64_cetssp, +REGS_RegCodeX64_tr, +REGS_RegCodeX64_ldtr, REGS_RegCodeX64_COUNT, } REGS_RegCodeX64; @@ -270,6 +272,8 @@ REGS_RegCodeX86_ds, REGS_RegCodeX86_es, REGS_RegCodeX86_fs, REGS_RegCodeX86_gs, +REGS_RegCodeX86_tr, +REGS_RegCodeX86_ldtr, REGS_RegCodeX86_ymm0, REGS_RegCodeX86_ymm1, REGS_RegCodeX86_ymm2, @@ -427,6 +431,8 @@ REGS_Reg64 k6; REGS_Reg64 k7; REGS_Reg64 cetmsr; REGS_Reg64 cetssp; +REGS_Reg16 tr; +REGS_Reg16 ldtr; }; typedef struct REGS_RegBlockX86 REGS_RegBlockX86; @@ -484,6 +490,8 @@ REGS_Reg16 ds; REGS_Reg16 es; REGS_Reg16 fs; REGS_Reg16 gs; +REGS_Reg16 tr; +REGS_Reg16 ldtr; REGS_Reg256 ymm0; REGS_Reg256 ymm1; REGS_Reg256 ymm2; @@ -495,17 +503,17 @@ REGS_Reg256 ymm7; }; C_LINKAGE_BEGIN -extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[103]; +extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[105]; extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96]; -extern String8 regs_g_reg_code_x64_string_table[103]; +extern String8 regs_g_reg_code_x64_string_table[105]; extern String8 regs_g_alias_code_x64_string_table[96]; -extern REGS_Rng regs_g_reg_code_x64_rng_table[103]; +extern REGS_Rng regs_g_reg_code_x64_rng_table[105]; extern REGS_Slice regs_g_alias_code_x64_slice_table[96]; -extern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[61]; +extern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[63]; extern REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36]; -extern String8 regs_g_reg_code_x86_string_table[61]; +extern String8 regs_g_reg_code_x86_string_table[63]; extern String8 regs_g_alias_code_x86_string_table[36]; -extern REGS_Rng regs_g_reg_code_x86_rng_table[61]; +extern REGS_Rng regs_g_reg_code_x86_rng_table[63]; extern REGS_Slice regs_g_alias_code_x86_slice_table[36]; C_LINKAGE_END diff --git a/src/regs/rdi/generated/regs_rdi.meta.c b/src/regs/rdi/generated/regs_rdi.meta.c index 686b8049..62069a6f 100644 --- a/src/regs/rdi/generated/regs_rdi.meta.c +++ b/src/regs/rdi/generated/regs_rdi.meta.c @@ -116,6 +116,8 @@ case REGS_RegCodeX64_k6:{result = RDI_RegCodeX64_k6;}break; case REGS_RegCodeX64_k7:{result = RDI_RegCodeX64_k7;}break; case REGS_RegCodeX64_cetmsr:{result = RDI_RegCodeX64_cetmsr;}break; case REGS_RegCodeX64_cetssp:{result = RDI_RegCodeX64_cetssp;}break; +case REGS_RegCodeX64_tr:{result = RDI_RegCodeX64_tr;}break; +case REGS_RegCodeX64_ldtr:{result = RDI_RegCodeX64_ldtr;}break; } }break; case Arch_x86: @@ -175,6 +177,8 @@ case REGS_RegCodeX86_ds:{result = RDI_RegCodeX86_ds;}break; case REGS_RegCodeX86_es:{result = RDI_RegCodeX86_es;}break; case REGS_RegCodeX86_fs:{result = RDI_RegCodeX86_fs;}break; case REGS_RegCodeX86_gs:{result = RDI_RegCodeX86_gs;}break; +case REGS_RegCodeX86_tr:{result = RDI_RegCodeX86_tr;}break; +case REGS_RegCodeX86_ldtr:{result = RDI_RegCodeX86_ldtr;}break; case REGS_RegCodeX86_ymm0:{result = RDI_RegCodeX86_ymm0;}break; case REGS_RegCodeX86_ymm1:{result = RDI_RegCodeX86_ymm1;}break; case REGS_RegCodeX86_ymm2:{result = RDI_RegCodeX86_ymm2;}break; @@ -301,6 +305,8 @@ case RDI_RegCodeX64_k6:{result = REGS_RegCodeX64_k6;}break; case RDI_RegCodeX64_k7:{result = REGS_RegCodeX64_k7;}break; case RDI_RegCodeX64_cetmsr:{result = REGS_RegCodeX64_cetmsr;}break; case RDI_RegCodeX64_cetssp:{result = REGS_RegCodeX64_cetssp;}break; +case RDI_RegCodeX64_tr:{result = REGS_RegCodeX64_tr;}break; +case RDI_RegCodeX64_ldtr:{result = REGS_RegCodeX64_ldtr;}break; } }break; case Arch_x86: @@ -360,6 +366,8 @@ case RDI_RegCodeX86_ds:{result = REGS_RegCodeX86_ds;}break; case RDI_RegCodeX86_es:{result = REGS_RegCodeX86_es;}break; case RDI_RegCodeX86_fs:{result = REGS_RegCodeX86_fs;}break; case RDI_RegCodeX86_gs:{result = REGS_RegCodeX86_gs;}break; +case RDI_RegCodeX86_tr:{result = REGS_RegCodeX86_tr;}break; +case RDI_RegCodeX86_ldtr:{result = REGS_RegCodeX86_ldtr;}break; case RDI_RegCodeX86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; case RDI_RegCodeX86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; case RDI_RegCodeX86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index a26bdf09..1f0cb270 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -109,6 +109,8 @@ REGS_RegTableX64: {k7 64 Normal} {cetmsr 64 Normal} {cetssp 64 Normal} + {tr 16 Normal} + {ldtr 16 Normal} } @table(name base off size usage) @@ -277,6 +279,8 @@ REGS_RegTableX86: {es 16 Normal} {fs 16 Normal} {gs 16 Normal} + {tr 16 Normal} + {ldtr 16 Normal} // SIMD REGISTERS {ymm0 256 Vector} {ymm1 256 Vector} From da38f266d9983ee037e30652832512c5f8c99b1d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 13 Oct 2025 10:59:41 -0700 Subject: [PATCH 015/850] parser for .eh_frame versions of CIE and FDE and new helper for mapping PC -> CFI Row --- src/dwarf/dwarf_dump.c | 3 +- src/dwarf/dwarf_dump.h | 1 - src/dwarf/dwarf_inc.c | 1 + src/dwarf/dwarf_inc.h | 1 + src/dwarf/dwarf_parse.c | 45 ++++- src/dwarf/dwarf_parse.h | 7 +- src/dwarf/dwarf_unwind.c | 102 +++++++--- src/dwarf/dwarf_unwind.h | 24 +-- src/eh/eh_frame.c | 418 ++++++++++++++++++++++++++++----------- src/eh/eh_frame.h | 47 ++++- src/raddbg/raddbg_main.c | 4 +- 11 files changed, 487 insertions(+), 166 deletions(-) diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index d18da87d..4a7ccc32 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -2237,7 +2237,8 @@ dw_dump_list_from_sections(Arena *arena, String8 cfi_regs_str = {0}; { String8List cfi_regs_list = {0}; - for EachIndex(reg_idx, cfi_unwind->reg_count) { + U64 reg_count = dw_reg_count_from_arch(arch); + for EachIndex(reg_idx, reg_count) { DW_CFI_Register *cfi_reg = &cfi_unwind->row->regs[reg_idx]; String8 rule_str = str8_lit("???"); switch (cfi_reg->rule) { diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index 0882061b..4ff7c1c0 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -61,7 +61,6 @@ read_only global String8 dw_name_title_from_dump_subset_table[] = internal String8 dw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off); internal String8List dw_string_list_from_expression (Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); internal String8 dw_single_line_string_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); -internal String8 dw_string_from_eh_ptr_enc (Arena *arena, EH_PtrEnc enc); #if 0 internal void dw_string_from_cfi_program (Arena *arena, String8List *out, String8 indent, String8 raw_data, DW_CIE *cie, EH_PtrCtx *ptr_ctx, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index 4293d911..b4ab74b0 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -8,3 +8,4 @@ #include "dwarf/dwarf_elf.c" #include "dwarf/dwarf_unwind.c" #include "dwarf/dwarf_dump.c" +#include "dwarf/dwarf_help.c" diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index 61f03873..26c24302 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -11,5 +11,6 @@ #include "dwarf/dwarf_elf.h" #include "dwarf/dwarf_unwind.h" #include "dwarf/dwarf_dump.h" +#include "dwarf/dwarf_help.h" #endif // DWARF_INC_H diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index ae6d8741..0998b75f 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -3383,18 +3383,18 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - U64 cie_id = 0; + U64 cie_id = 0; U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); if (cie_id_size == 0) { goto exit; } cursor += cie_id_size; - U8 version = 0; + U8 version = 0; U64 version_size = str8_deserial_read_struct(data, cursor, &version); if (version_size == 0) { goto exit; } cursor += version_size; - String8 aug_string = {0}; - U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); + String8 aug_string = {0}; + U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); if (aug_string_size == 0) { goto exit; } cursor += aug_string_size; @@ -3447,11 +3447,11 @@ exit:; } internal B32 -dw_parse_fde(String8 data, +dw_parse_fde(String8 data, DW_Format format, DW_CIEFromOffsetFunc *cie_from_offset_func, void *cie_from_offset_ud, - DW_FDE *fde_out) + DW_FDE *fde_out) { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; @@ -3485,6 +3485,7 @@ dw_parse_fde(String8 data, // commit values to out fde_out->format = format; fde_out->cie_pointer = cie_pointer; + fde_out->cie = cie; fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); fde_out->insts = str8_skip(data, cursor); @@ -3493,6 +3494,38 @@ exit:; return is_parsed; } +internal +DW_CIE_FROM_OFFSET_FUNC(dw_parse_cfi_cie_from_offset) +{ + return ud; +} + +internal B32 +dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out) +{ + B32 is_parsed = 0; + DW_DescriptorEntry fde_desc = {0}; + dw_parse_descriptor_entry_header(data, fde_offset, &fde_desc); + if (fde_desc.type == DW_DescriptorEntryType_FDE) { + U64 cie_pointer_off = fde_desc.format == DW_Format_32Bit ? 4 : 12; + U64 cie_pointer = 0; + U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); + if (cie_pointer_size) { + DW_DescriptorEntry cie_desc = {0}; + dw_parse_descriptor_entry_header(data, cie_pointer, &cie_desc); + if (cie_desc.type == DW_DescriptorEntryType_CIE) { + if (dw_parse_cie(str8_substr(data, cie_desc.entry_range), cie_desc.format, arch, cie_out)) { + if (dw_parse_fde(str8_substr(data, fde_desc.entry_range), fde_desc.format, dw_parse_cfi_cie_from_offset, cie_out, fde_out)) { + is_parsed = 1; + } + } + } + } + } + + return is_parsed; +} + internal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, U64 code_align_factor, diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index c691c38b..fc8ce759 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -378,6 +378,7 @@ typedef struct DW_CIE U64 code_align_factor; S64 data_align_factor; U64 ret_addr_reg; + U64 ext[4]; DW_Format format; U8 version; U8 address_size; @@ -388,6 +389,7 @@ typedef struct DW_FDE { DW_Format format; U64 cie_pointer; + DW_CIE *cie; Rng1U64 pc_range; String8 insts; } DW_FDE; @@ -529,8 +531,8 @@ internal DW_TagNode * dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off); // line info -internal U64 dw_read_line_file(String8 line_data, U64 line_off, DW_Input *input, DW_Version unit_version, DW_Format unit_format, DW_Ext ext, U64 address_size, DW_ListUnit *str_offsets, U64 enc_count, U64 *enc_arr, DW_LineFile *line_file_out); -internal U64 dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); +internal U64 dw_read_line_file(String8 line_data, U64 line_off, DW_Input *input, DW_Version unit_version, DW_Format unit_format, DW_Ext ext, U64 address_size, DW_ListUnit *str_offsets, U64 enc_count, U64 *enc_arr, DW_LineFile *line_file_out); +internal U64 dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); internal void dw_line_vm_reset(DW_LineVMState *state, B32 default_is_stmt); internal void dw_line_vm_advance(DW_LineVMState *state, U64 advance, U64 min_inst_len, U64 max_ops_for_inst); internal DW_LineSeqNode * dw_push_line_seq(Arena* arena, DW_LineTableParseResult *parsed_tbl); @@ -558,6 +560,7 @@ internal U64 dw_read_debug_frame_ptr(String8 data, DW_CIE *cie, U64 *ptr_out); internal U64 dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out); internal B32 dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out); internal B32 dw_parse_fde(String8 data, DW_Format format, DW_CIEFromOffsetFunc *cie_from_offset_func, void *cie_from_offset_ud, DW_FDE *fde_out); +internal B32 dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out); internal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud, U64 *bytes_read_out, DW_CFA_Inst *inst_out); internal DW_CFA_InstList dw_parse_cfa_inst_list(Arena *arena, String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud); diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index e899d676..de765be6 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -1,10 +1,10 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal DW_CFA_Row * -dw_make_cfa_row(Arena *arena, U64 reg_count) +internal DW_CFI_Row * +dw_make_cfi_row(Arena *arena, U64 reg_count) { - DW_CFA_Row *row = push_array(arena, DW_CFA_Row, 1); + DW_CFI_Row *row = push_array(arena, DW_CFI_Row, 1); row->regs = push_array(arena, DW_CFI_Register, reg_count); for EachIndex(reg_idx, reg_count) { row->regs[reg_idx].rule = DW_CFI_RegisterRule_SameValue; @@ -12,12 +12,18 @@ dw_make_cfa_row(Arena *arena, U64 reg_count) return row; } -internal DW_CFA_Row * -dw_copy_cfa_row(Arena *arena, U64 reg_count, DW_CFA_Row *row) +internal void +dw_memcpy_cfi_row(DW_CFI_Row *dst, DW_CFI_Row *src, U64 reg_count) { - DW_CFA_Row *new_row = dw_make_cfa_row(arena, reg_count); - new_row->cfa = row->cfa; - MemoryCopyTyped(new_row->regs, row->regs, reg_count); + dst->cfa = src->cfa; + MemoryCopyTyped(dst->regs, src->regs, reg_count); +} + +internal DW_CFI_Row * +dw_copy_cfi_row(Arena *arena, DW_CFI_Row *row, U64 reg_count) +{ + DW_CFI_Row *new_row = dw_make_cfi_row(arena, reg_count); + dw_memcpy_cfi_row(new_row, row, reg_count); return new_row; } @@ -35,19 +41,21 @@ dw_cfi_unwind_init(Arena *arena, uw->insts = dw_parse_cfa_inst_list(arena, fde->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud); uw->cie = cie; uw->fde = fde; - uw->reg_count = dw_reg_count_from_arch(arch); uw->pc = fde->pc_range.min; uw->arch = arch; + uw->reg_count = dw_reg_count_from_arch(arch); // setup initial register rules DW_CFA_InstList initial_insts = dw_parse_cfa_inst_list(scratch.arena, cie->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud); - uw->row = dw_make_cfa_row(arena, uw->reg_count); + uw->row = dw_make_cfi_row(arena, uw->reg_count); uw->curr_inst = initial_insts.first; - dw_cfi_next_row(arena, uw); + if (!dw_cfi_next_row(arena, uw)) { + AssertAlways(0 && "unable to interpret initial row instructions"); + } // make first row from initial rules uw->initial_row = uw->row; - uw->row = dw_copy_cfa_row(arena, uw->reg_count, uw->initial_row); + uw->row = dw_copy_cfi_row(arena, uw->initial_row, uw->reg_count); uw->curr_inst = uw->insts.first; scratch_end(scratch); @@ -156,12 +164,12 @@ dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) // Row State Instructions case DW_CFA_RememberState: { - DW_CFA_Row *new_row = dw_copy_cfa_row(arena, uw->reg_count, uw->row); + DW_CFI_Row *new_row = dw_copy_cfi_row(arena, uw->row, uw->reg_count); SLLStackPush(uw->row, new_row); } break; case DW_CFA_RestoreState: { if (uw->row == 0) { goto exit; } // TODO: report error: unbalanced number of pushes and pops - DW_CFA_Row *free_row = uw->row; + DW_CFI_Row *free_row = uw->row; SLLStackPop(uw->row); SLLStackPush(uw->free_rows, free_row); } break; @@ -183,17 +191,54 @@ exit:; return is_row_valid; } +internal DW_CFI_Row * +dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc) +{ + Temp scratch = scratch_begin(&arena, 1); + + B32 is_row_found = 0; + U64 reg_count = dw_reg_count_from_arch(arch); + DW_CFI_Unwind *uw = dw_cfi_unwind_init(scratch.arena, arch, cie, fde, decode_ptr_func, decode_ptr_ctx); + DW_CFI_Row *row = dw_copy_cfi_row(scratch.arena, uw->row, uw->reg_count); + U64 prev_pc = uw->pc; + while (dw_cfi_next_row(scratch.arena, uw)) { + if (prev_pc <= pc && pc < uw->pc) { + is_row_found = 1; + break; + } + dw_memcpy_cfi_row(row, uw->row, uw->reg_count); + prev_pc = uw->pc; + } + + // handle last row + if (!is_row_found) { + if (prev_pc <= pc && pc < uw->pc && contains_1u64(fde->pc_range, pc)) { + row = uw->row; + is_row_found = 1; + } + } + + // copy out final row + DW_CFI_Row *result = 0; + if (is_row_found) { + result = dw_copy_cfi_row(arena, row, reg_count); + } + + scratch_end(scratch); + return result; +} + internal DW_UnwindStatus -dw_cfi_apply_register_rules(DW_CFI_Unwind *uw, - DW_MemRead *mem_read_func, void *mem_read_ud, - DW_RegRead *reg_read_func, void *reg_read_ud, - DW_RegWrite *reg_write_func, void *reg_write_ud) +dw_cfi_apply_register_rules(Arch arch, + DW_CIE *cie, + DW_CFI_Row *row, + DW_MemRead *mem_read_func, void *mem_read_ud, + DW_RegRead *reg_read_func, void *reg_read_ud, + DW_RegWrite *reg_write_func, void *reg_write_ud) { Temp scratch = scratch_begin(0,0); DW_UnwindStatus unwind_status = DW_UnwindStatus_Ok; - DW_CFA_Row *row = uw->row; - // establish CFA U64 cfa = 0; switch (row->cfa.rule) { @@ -201,7 +246,7 @@ dw_cfi_apply_register_rules(DW_CFI_Unwind *uw, case DW_CFA_Rule_RegOff: { // TODO: report error (invalid register read) U64 cfa_reg_value = 0; - U64 reg_size = dw_reg_size_from_code(uw->arch, row->cfa.reg); + U64 reg_size = dw_reg_size_from_code(arch, row->cfa.reg); AssertAlways(reg_size <= sizeof(cfa_reg_value)); unwind_status = reg_read_func(row->cfa.reg, &cfa_reg_value, reg_size, reg_read_ud); if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } @@ -212,11 +257,12 @@ dw_cfi_apply_register_rules(DW_CFI_Unwind *uw, } break; } - U64 max_reg_size = dw_reg_max_size_from_arch(uw->arch); + U64 max_reg_size = dw_reg_max_size_from_arch(arch); void *reg_buffer = push_array(scratch.arena, U8, max_reg_size); - for EachIndex(reg_idx, uw->reg_count) { - DW_CFI_Register *reg = &uw->row->regs[reg_idx]; + U64 reg_count = dw_reg_count_from_arch(arch); + for EachIndex(reg_idx, reg_count) { + DW_CFI_Register *reg = &row->regs[reg_idx]; switch (reg->rule) { case DW_CFI_RegisterRule_Undefined: { // TODO: ??? @@ -226,7 +272,7 @@ dw_cfi_apply_register_rules(DW_CFI_Unwind *uw, case DW_CFI_RegisterRule_Offset: { // read register value from memory U64 addr = cfa + reg->n; - U64 reg_size = dw_reg_size_from_code(uw->arch, reg_idx); + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); unwind_status = mem_read_func(addr, reg_size, reg_buffer, mem_read_ud); if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } @@ -239,13 +285,13 @@ dw_cfi_apply_register_rules(DW_CFI_Unwind *uw, U64 reg_value = cfa + reg->n; // write register value to the thread context - U64 reg_size = dw_reg_size_from_code(uw->arch, reg_idx); + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); unwind_status = reg_write_func(reg_idx, ®_value, reg_size, reg_write_ud); if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } } break; case DW_CFI_RegisterRule_Register: { // read register value from another register - U64 reg_size = dw_reg_size_from_code(uw->arch, reg_idx); + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); unwind_status = reg_read_func(reg->n, reg_buffer, reg_size, reg_read_ud); if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } @@ -264,8 +310,10 @@ dw_cfi_apply_register_rules(DW_CFI_Unwind *uw, case DW_CFI_RegisterRule_Architectural: { NotImplemented; } break; + default: { InvalidPath; } break; } } + exit:; scratch_end(scratch); diff --git a/src/dwarf/dwarf_unwind.h b/src/dwarf/dwarf_unwind.h index f5fde8c0..bc8b2c57 100644 --- a/src/dwarf/dwarf_unwind.h +++ b/src/dwarf/dwarf_unwind.h @@ -44,25 +44,25 @@ typedef struct DW_CFI_Register }; } DW_CFI_Register; -typedef struct DW_CFA_Row +typedef struct DW_CFI_Row { - DW_CFA cfa; + DW_CFA cfa; DW_CFI_Register *regs; - struct DW_CFA_Row *next; -} DW_CFA_Row; + struct DW_CFI_Row *next; +} DW_CFI_Row; typedef struct DW_CFI_Unwind { DW_CFA_InstList insts; DW_CIE *cie; DW_FDE *fde; - DW_CFA_Row *initial_row; - DW_CFA_Row *row; + DW_CFI_Row *initial_row; + DW_CFI_Row *row; DW_CFA_InstNode *curr_inst; - DW_CFA_Row *free_rows; - DW_Reg reg_count; + DW_CFI_Row *free_rows; U64 pc; Arch arch; + U64 reg_count; } DW_CFI_Unwind; typedef enum { @@ -82,12 +82,14 @@ typedef DW_MEM_READ(DW_MemRead); //////////////////////////////// -internal DW_CFA_Row * dw_make_cfa_row(Arena *arena, U64 reg_count); -internal DW_CFA_Row * dw_copy_cfa_row(Arena *arena, U64 reg_count, DW_CFA_Row *row); +internal DW_CFI_Row * dw_make_cfi_row(Arena *arena, U64 reg_count); +internal DW_CFI_Row * dw_copy_cfi_row(Arena *arena, DW_CFI_Row *row, U64 reg_count); internal DW_CFI_Unwind * dw_cfi_unwind_init(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud); internal B32 dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw); -internal DW_UnwindStatus dw_cfi_apply_register_rules(DW_CFI_Unwind *uw, DW_MemRead *mem_read_func, void *mem_read_ud, DW_RegRead *reg_read_func, void *reg_read_ud, DW_RegWrite *reg_write_func, void *reg_write_ud); + +internal DW_CFI_Row * dw_cfi_row_from_pc(Arena *arena, Arch arch, struct DW_CIE *cie, struct DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc); +internal DW_UnwindStatus dw_cfi_apply_register_rules(Arch arch, DW_CIE *cie, DW_CFI_Row *row, DW_MemRead *mem_read_func, void *mem_read_ud, DW_RegRead *reg_read_func, void *reg_read_ud, DW_RegWrite *reg_write_func, void *reg_write_ud); #endif // DWARF_UNWIND_H diff --git a/src/eh/eh_frame.c b/src/eh/eh_frame.c index 0b3f56e3..c89c0ee5 100644 --- a/src/eh/eh_frame.c +++ b/src/eh/eh_frame.c @@ -2,10 +2,14 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) internal U64 -eh_read_ptr(String8 frame_base, U64 off, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) +eh_parse_ptr(String8 frame_base, U64 off, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) { U64 ptr_off = off; + if (encoding == EH_PtrEnc_Omit) { + return 0; + } + // align read offset as needed if (encoding == EH_PtrEnc_Aligned) { ptr_off = AlignPow2(ptr_off, ptr_ctx->ptr_align); @@ -65,6 +69,60 @@ eh_read_ptr(String8 frame_base, U64 off, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, return decode_size; } +internal EH_FrameHdr +eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) +{ + EH_FrameHdr header = {0}; + U64 cursor = 0; + + U64 version_size = str8_deserial_read_struct(data, cursor, &header.version); + if (version_size == 0) { goto exit; } + cursor += version_size; + + if (header.version == 1) { + U64 eh_frame_ptr_enc_size = str8_deserial_read_struct(data, cursor, &header.eh_frame_ptr_enc); + if (eh_frame_ptr_enc_size == 0) { goto exit; } + cursor += eh_frame_ptr_enc_size; + + EH_PtrEnc fde_count_enc = 0; + U64 fde_count_enc_size = str8_deserial_read_struct(data, cursor, &fde_count_enc); + if (fde_count_enc_size == 0) { goto exit; } + cursor += fde_count_enc_size; + + U64 table_enc_size = str8_deserial_read_struct(data, cursor, &header.table_enc); + if (table_enc_size == 0) { goto exit; } + cursor += table_enc_size; + + U64 eh_frame_ptr = 0; + cursor += eh_parse_ptr(data, cursor, ptr_ctx, header.eh_frame_ptr_enc, &eh_frame_ptr); + + cursor += eh_parse_ptr(data, cursor, ptr_ctx, header.fde_count_enc, &header.fde_count); + + switch (header.table_enc) { + case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; + case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; + default: { InvalidPath; } break; + } + header.entry_byte_size = header.field_byte_size * 2; + + header.table = str8_skip(data, cursor); + AssertAlways(header.table.size == header.entry_byte_size * header.fde_count); + } else { + Assert(0 && "unknown version"); + } + +exit:; + return header; +} + internal U64 eh_parse_aug_data(String8 aug_string, String8 aug_data, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out) { @@ -91,7 +149,7 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, EH_PtrCtx *ptr_ctx, EH_A } break; case 'P': { aug_cursor += str8_deserial_read_struct(aug_data, aug_cursor, &handler_encoding); - aug_cursor += eh_read_ptr(aug_data, aug_cursor, ptr_ctx, handler_encoding, &handler_ip); + aug_cursor += eh_parse_ptr(aug_data, aug_cursor, ptr_ctx, handler_encoding, &handler_ip); aug_flags |= EH_AugFlag_HasHandler; } break; case 'R': { @@ -116,128 +174,262 @@ exit:; return parse_size; } -internal U64 -eh_size_from_aug_data(String8 aug_string, String8 data, EH_PtrCtx *ptr_ctx) +internal B32 +eh_parse_cie(String8 data, DW_Format format, Arch arch, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out) { - return eh_parse_aug_data(aug_string, data, ptr_ctx, 0); -} + B32 is_parsed = 0; + U64 cursor = format == DW_Format_32Bit ? 4 : 12; -internal U64 -eh_frame_hdr_search_linear_x64(String8 raw_eh_frame_hdr, EH_PtrCtx *ptr_ctx, U64 location) -{ - // Table contains only addresses for first instruction in a function and we cannot - // guarantee that result is FDE that corresponds to the input location. - // So input location must be cheked against range from FDE header again. - - U64 closest_location = max_U64; - U64 closest_address = max_U64; - - U64 cursor = 0; - - U8 version = 0; - cursor += str8_deserial_read_struct(raw_eh_frame_hdr, cursor, &version); - + U64 cie_id = 0; + U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); + if (cie_id_size == 0) { goto exit; } + cursor += cie_id_size; + + U8 version = 0; + U64 version_size = str8_deserial_read_struct(data, cursor, &version); + if (version_size == 0) { goto exit; } + cursor += version_size; + + String8 aug_string = {0}; + EH_Augmentation aug = {0}; + U64 code_align_factor = 0; + S64 data_align_factor = 0; + U64 ret_addr_reg = max_U64; if (version == 1) { -#if 0 - EH_PtrCtx ptr_ctx = {0}; - // Set this to base address of .eh_frame_hdr. Entries are relative - // to this section for some reason. - ptr_ctx.data_vaddr = range.min; - // If input location is VMA then set this to address of .text. - // Pointer parsing function will adjust "init_location" to correct VMA. - ptr_ctx.text_vaddr = 0; -#endif - - EH_PtrEnc eh_frame_ptr_enc = 0, fde_count_enc = 0, table_enc = 0; - cursor += str8_deserial_read_struct(raw_eh_frame_hdr, cursor, &eh_frame_ptr_enc); - cursor += str8_deserial_read_struct(raw_eh_frame_hdr, cursor, &fde_count_enc); - cursor += str8_deserial_read_struct(raw_eh_frame_hdr, cursor, &table_enc); - - U64 eh_frame_ptr = 0, fde_count = 0; - NotImplemented; - //cursor += dw_unwind_parse_pointer_x64(raw_eh_frame_hdr.str, rng_1u64(0, raw_eh_frame_hdr.size), ptr_ctx, eh_frame_ptr_enc, cursor, &eh_frame_ptr); - //cursor += dw_unwind_parse_pointer_x64(raw_eh_frame_hdr.str, rng_1u64(0, raw_eh_frame_hdr.size), ptr_ctx, fde_count_enc, cursor, &fde_count); - - for (U64 fde_idx = 0; fde_idx < fde_count; ++fde_idx) { - U64 init_location = 0, address = 0; - NotImplemented; - //cursor += dw_unwind_parse_pointer_x64(raw_eh_frame_hdr.str, rng_1u64(0, raw_eh_frame_hdr.size), ptr_ctx, table_enc, cursor, &init_location); - //cursor += dw_unwind_parse_pointer_x64(raw_eh_frame_hdr.str, rng_1u64(0, raw_eh_frame_hdr.size), ptr_ctx, table_enc, cursor, &address); - - S64 current_delta = (S64)(location - init_location); - S64 closest_delta = (S64)(location - closest_location); - if (0 <= current_delta && current_delta < closest_delta) { - closest_location = init_location; - closest_address = address; - } - } + U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); + if (aug_string_size == 0) { goto exit; } + cursor += aug_string_size; + + U64 aug_data_size = eh_parse_aug_data(aug_string, str8_skip(data, cursor), ptr_ctx, &aug); + cursor += aug_data_size; + + U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); + if (code_align_factor_size == 0) { goto exit; } + cursor += code_align_factor_size; + + U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); + if (data_align_factor_size == 0) { goto exit; } + cursor += data_align_factor_size; + + ret_addr_reg = 0; + U64 ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); + if (ret_addr_reg_size == 0) { goto exit; } + cursor += ret_addr_reg_size; } - - // address where to find corresponding FDE, this is an absolute offset - // into the image file. - return closest_address; + + cie_out->insts = str8_skip(data, cursor); + cie_out->aug_string = aug_string; + cie_out->code_align_factor = code_align_factor; + cie_out->data_align_factor = data_align_factor; + cie_out->ret_addr_reg = ret_addr_reg; + cie_out->format = format; + cie_out->version = version; + cie_out->address_size = byte_size_from_arch(arch); + cie_out->segment_selector_size = 0; + + cie_out->ext[EH_CIE_Ext_LSDAEnc] = EH_PtrEnc_Omit; + cie_out->ext[EH_CIE_Ext_AddrEnc] = EH_PtrEnc_Omit; + cie_out->ext[EH_CIE_Ext_HandlerEnc] = EH_PtrEnc_Omit; + + if (aug.flags & EH_AugFlag_HasLSDA) { + cie_out->ext[EH_CIE_Ext_LSDAEnc] = aug.lsda_encoding; + } + if (aug.flags & EH_AugFlag_HasAddrEnc) { + cie_out->ext[EH_CIE_Ext_AddrEnc] = aug.addr_encoding; + } + if (aug.flags & EH_AugFlag_HasHandler) { + cie_out->ext[EH_CIE_Ext_HandlerEnc] = aug.handler_encoding; + cie_out->ext[EH_CIE_Ext_HandlerIp ] = aug.handler_ip; + } + + is_parsed = 1; +exit:; + return is_parsed; } -#if 0 -internal DW_CFIRecords -dw_unwind_eh_frame_hdr_from_ip_fast_x64(String8 raw_eh_frame, String8 raw_eh_frame_hdr, EH_PtrCtx *ptr_ctx, U64 ip_voff) +internal B32 +eh_parse_fde(String8 data, + DW_Format format, + DW_CIEFromOffsetFunc *cie_from_offset_func, + void *cie_from_offset_ud, + EH_PtrCtx *ptr_ctx, + DW_FDE *fde_out) { - DW_CFIRecords result = {0}; - - // find FDE offset - void *eh_frame_hdr = raw_eh_frame.str; - U64 fde_offset = dw_search_eh_frame_hdr_linear_x64(raw_eh_frame_hdr, ptr_ctx, ip_voff); - - B32 is_fde_offset_valid = (fde_offset != max_U64); - if (is_fde_offset_valid) { - U64 fde_read_offset = (fde_offset - ptr_ctx->raw_base_vaddr); - - // read FDE size - U64 fde_size = 0; - fde_read_offset += str8_deserial_read_dwarf_packed_size(raw_eh_frame, fde_read_offset, &fde_size); - - // read FDE discriminator - U32 fde_discrim = 0; - fde_read_offset += str8_deserial_read_struct(raw_eh_frame, fde_read_offset, &fde_discrim); - - // compute parent CIE offset - U64 cie_read_offset = fde_read_offset - (fde_discrim + sizeof(fde_discrim)); - - // read CIE size - U64 cie_size = 0; - cie_read_offset += str8_deserial_read_dwarf_packed_size(raw_eh_frame, cie_read_offset, &cie_size); - - // read CIE discriminator - U32 cie_discrim = max_U32; - cie_read_offset += str8_deserial_read_struct(raw_eh_frame, cie_read_offset, &cie_discrim); - - B32 is_fde = (fde_discrim != 0); - B32 is_cie = (cie_discrim == 0); - if (is_fde && is_cie) { - Rng1U64 cie_range = rng_1u64(0, cie_read_offset + (cie_size - sizeof(cie_discrim))); - Rng1U64 fde_range = rng_1u64(0, fde_read_offset + (fde_size - sizeof(fde_discrim))); - - // parse CIE - DW_CIE cie = {0}; - dw_unwind_parse_cie_x64(raw_eh_frame.str, cie_range, ptr_ctx, cie_read_offset, &cie); - - // parse FDE - DW_FDE fde = {0}; - NotImplemented; - //dw_unwind_parse_fde_x64(raw_eh_frame.str, fde_range, ptr_ctx, &cie, fde_read_offset, &fde); - - // range check instruction pointer - if (contains_1u64(fde.pc_range, ip_voff)) { - result.valid = 1; - result.cie = cie; - result.fde = fde; + B32 is_parsed = 0; + U64 cursor = format == DW_Format_32Bit ? 4 : 12; + + U64 cie_pointer = 0; + U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer); + if (cie_pointer_size == 0) { goto exit; } + + DW_CIE *cie = cie_from_offset_func(cie_from_offset_ud, cie_pointer); + if (cie == 0) { goto exit; } + + EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; + + U64 pc_begin = 0; + U64 pc_range = 0; + if (addr_enc != EH_PtrEnc_Omit) { + U64 pc_begin_size = eh_parse_ptr(data, cursor, ptr_ctx, addr_enc, &pc_begin); + if (pc_begin_size == 0) { goto exit; } + cursor += pc_begin_size; + + U64 pc_range_size = eh_parse_ptr(data, cursor, ptr_ctx, addr_enc, &pc_range_size); + if (pc_range_size == 0) { goto exit; } + cursor += pc_range_size; + } + + if (cursor + cie->aug_data.size > data.size) { goto exit; } + cursor += cie->aug_data.size; + + fde_out->format = format; + fde_out->cie_pointer = cie_pointer; + fde_out->cie = cie; + fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); + fde_out->insts = str8_skip(data, cursor); + + is_parsed = 1; +exit:; + return is_parsed; +} + +internal +DW_CIE_FROM_OFFSET_FUNC(eh_parse_cfi_cie_from_offset) +{ + return ud; +} + +internal B32 +eh_parse_cfi(String8 eh_frame, U64 fde_offset, Arch arch, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out, DW_FDE *fde_out) +{ + B32 is_parsed = 0; + DW_DescriptorEntry fde_desc = {0}; + dw_parse_descriptor_entry_header(eh_frame, fde_offset, &fde_desc); + if (fde_desc.type == DW_DescriptorEntryType_FDE) { + U64 cie_pointer_off = fde_desc.format == DW_Format_32Bit ? 4 : 12; + U64 cie_pointer = 0; + U64 cie_pointer_size = str8_deserial_read_dwarf_uint(eh_frame, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); + if (cie_pointer_size) { + DW_DescriptorEntry cie_desc = {0}; + dw_parse_descriptor_entry_header(eh_frame, cie_pointer, &cie_desc); + if (cie_desc.type == DW_DescriptorEntryType_CIE) { + if (eh_parse_cie(str8_substr(eh_frame, cie_desc.entry_range), cie_desc.format, arch, ptr_ctx, cie_out)) { + if (eh_parse_fde(str8_substr(eh_frame, fde_desc.entry_range), fde_desc.format, eh_parse_cfi_cie_from_offset, cie_out, ptr_ctx, fde_out)) { + return is_parsed; + } + } } } } - - return result; + return is_parsed; +} + +internal U64 +eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) +{ + U64 fde_offset = max_U64; + U64 fde_idx = max_U64; + + if (header.version == 1) { + if (header.fde_count > 0) { + U64 first = 0; + U64 first_size = eh_parse_ptr(header.table, 0, ptr_ctx, header.table_enc, &first); + AssertAlways(first_size); + if (first == pc) { + fde_idx = 0; + goto exit; + } + if (first > pc) { + goto exit; + } + + U64 last = 0; + U64 last_size = eh_parse_ptr(header.table, header.table.size - header.entry_byte_size, ptr_ctx, header.table_enc, &last); + AssertAlways(last_size); + if (last <= pc) { + fde_idx = header.fde_count - 1; + goto exit; + } + + if (first <= pc && pc < last) { + U64 l = 0; + U64 r = header.fde_count - 1; + while (l <= r) { + U64 m = l + (r - l) / 2; + U64 m_pc = 0; + U64 m_pc_size = eh_parse_ptr(header.table, m * header.entry_byte_size, ptr_ctx, header.table_enc, &m_pc); + Assert(m_pc_size); + + if (m_pc == pc) { + fde_idx = m; + goto exit; + } else if (m_pc < pc) { + l = m + 1; + } else { + r = m - 1; + } + } + fde_idx = l; + } + } + + } + +exit:; + if (fde_idx < header.fde_count) { + U64 fde_offset_size = eh_parse_ptr(header.table, (fde_idx * header.entry_byte_size) + header.field_byte_size, ptr_ctx, header.table_enc, &fde_offset); + Assert(fde_offset_size); + } + return fde_offset; +} + +internal int +eh_frame_hdr_entry_sort(void *raw_a, void *raw_b) +{ + return ((EH_FrameHdrEntry *)raw_a)->addr < ((EH_FrameHdrEntry *)raw_b)->addr; +} + +internal String8 +eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, DW_FDE *fde) +{ + Temp scratch = scratch_begin(&arena, 1); + + // make .eh_frame_hdr + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + str8_serial_push_u8(scratch.arena, &srl, 1); // version + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_Omit); // omit eh_frame_ptr field + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // fde_count encoding + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // table encoding + str8_serial_push_u64(scratch.arena, &srl, fde_count); // fde_count + String8 header = str8_serial_end(scratch.arena, &srl); + + // alloc buffer for output + U64 buffer_size = header.size + sizeof(EH_FrameHdrEntry) * fde_count; + U8 *buffer = push_array(arena, U8, buffer_size); + + // copy header + MemoryCopyStr8(buffer, header); + + // write the table + EH_FrameHdrEntry *table = (EH_FrameHdrEntry *)(buffer + header.size); + for EachIndex(fde_idx, fde_count) { + table[fde_idx].addr = fde[fde_idx].pc_range.min; + table[fde_idx].fde_offset = fde_offsets[fde_idx]; + } + radsort(table, fde_count, eh_frame_hdr_entry_sort); + + String8 eh_frame_hdr = str8(buffer, buffer_size); + scratch_end(scratch); + return eh_frame_hdr; +} + +internal +DW_DECODE_PTR(eh_decode_ptr) +{ + EH_DecodePtrCtx *ctx = ud; + return eh_parse_ptr(data, 0, ctx->ptr_ctx, ctx->addr_enc, ptr_out); } -#endif internal String8 eh_string_from_ptr_enc_type(EH_PtrEnc type) diff --git a/src/eh/eh_frame.h b/src/eh/eh_frame.h index ac5840e5..6139ca67 100644 --- a/src/eh/eh_frame.h +++ b/src/eh/eh_frame.h @@ -4,6 +4,9 @@ #ifndef EH_FRAME_H #define EH_FRAME_H +//////////////////////////////// +//~ Format + typedef U8 EH_PtrEnc; enum { @@ -65,10 +68,48 @@ typedef struct EH_Augmentation } EH_Augmentation; //////////////////////////////// +//~ Parser -internal U64 eh_read_ptr(String8 frame_base, U64 off, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); -internal U64 eh_parse_aug_data(String8 aug_string, String8 aug_data, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out); -internal U64 eh_size_from_aug_data(String8 aug_string, String8 data, EH_PtrCtx *ptr_ctx); +enum +{ + EH_CIE_Ext_AddrEnc, + EH_CIE_Ext_LSDAEnc, + EH_CIE_Ext_HandlerEnc, + EH_CIE_Ext_HandlerIp, +} EH_CIE_Ext; + +typedef struct EH_FrameHdrEntry +{ + U64 addr; + U64 fde_offset; +} EH_FrameHdrEntry; + +typedef struct EH_FrameHdr +{ + U8 version; + EH_PtrEnc eh_frame_ptr_enc; + EH_PtrEnc fde_count_enc; + EH_PtrEnc table_enc; + U64 field_byte_size; + U64 entry_byte_size; + U64 fde_count; + String8 table; +} EH_FrameHdr; + +typedef struct EH_DecodePtrCtx +{ + EH_PtrEnc addr_enc; + EH_PtrCtx *ptr_ctx; +} EH_DecodePtrCtx; + +//////////////////////////////// + +internal U64 eh_parse_ptr(String8 frame_base, U64 off, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); +internal EH_FrameHdr eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx); +internal U64 eh_parse_aug_data(String8 aug_string, String8 aug_data, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out); +internal B32 eh_parse_cfi(String8 eh_frame, U64 fde_offset, Arch arch, EH_PtrCtx *ptr_ctx, struct DW_CIE *cie_out, struct DW_FDE *fde_out); +internal U64 eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc); +internal String8 eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, struct DW_FDE *fde); //////////////////////////////// //~ Enum -> String diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index f633614c..723b0c64 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -217,8 +217,8 @@ #include "pdb/pdb.h" #include "pdb/pdb_parse.h" #include "pdb/pdb_stringize.h" -#include "eh/eh_frame.h" #include "dwarf/dwarf_inc.h" +#include "eh/eh_frame.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" @@ -265,8 +265,8 @@ #include "pdb/pdb.c" #include "pdb/pdb_parse.c" #include "pdb/pdb_stringize.c" -#include "eh/eh_frame.c" #include "dwarf/dwarf_inc.c" +#include "eh/eh_frame.c" #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" From 3b81e1a0e9508932679785039b65a199ca0ad9ee Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 13 Oct 2025 11:00:29 -0700 Subject: [PATCH 016/850] connect DWARF virtual stack unwinder --- src/ctrl/ctrl_core.c | 334 +++++++++++++++++++++++++++++++++++++++++-- src/ctrl/ctrl_core.h | 13 ++ 2 files changed, 332 insertions(+), 15 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index e343fa14..0499e09b 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1782,6 +1782,17 @@ ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle) return result; } +//////////////////////////////// +//~ Process Info Functions + +internal Arch +ctrl_arch_from_process_handle(CTRL_Handle process_handle) +{ + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_Entity *process_entity = ctrl_entity_from_handle(entity_ctx, process_handle); + return process_entity->arch; +} + //////////////////////////////// //~ rjf: Unwinding Functions @@ -1806,6 +1817,239 @@ ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src) return dst; } +//- DWARF + +typedef struct +{ + CTRL_Handle process_handle; + U64 endt_us; +} CTRL_MemoryReadContextDwarfX64; + +internal +DW_MEM_READ(ctrl_unwind_mem_read_dwarf_x64) +{ + CTRL_MemoryReadContextDwarfX64 *ctx = ud; + + B32 is_stale = 0; + B32 is_read = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + size), &is_stale, buffer, ctx->endt_us); + + DW_UnwindStatus status = DW_UnwindStatus_Fail; + if(is_stale && is_read) + { + status = DW_UnwindStatus_Maybe; + } + else if(is_read) + { + status = DW_UnwindStatus_Ok; + } + + return status; +} + +internal +DW_REG_READ(ctrl_unwind_reg_read_dwarf_x64) +{ + // map DWARF register to -> the internal register + REGS_RegBlockX64 *regs = ud; + U64 reg_size = 0; void *reg_bytes = 0; + switch(reg_id) + { +#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; + DW_Regs_X64_XList(X) +#undef X + default: { InvalidPath; } break; + } + + // copy out register value + DW_UnwindStatus status = DW_UnwindStatus_Fail; + if(reg_size > 0) + { + AssertAlways(reg_size == buffer_max); + MemoryCopy(buffer, reg_bytes, reg_size); + status = DW_UnwindStatus_Ok; + } + + return status; +} + +internal +DW_REG_WRITE(ctrl_unwind_reg_write_dwarf_x64) +{ + // map DWARF register to -> the internal register + REGS_RegBlockX64 *regs = ud; + U64 reg_size = 0; void *reg_bytes = 0; + switch(reg_id) + { +#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; + DW_Regs_X64_XList(X) +#undef X + default: { InvalidPath; } break; + } + + // write value to the register + DW_UnwindStatus status = DW_UnwindStatus_Fail; + if(reg_size > 0) + { + AssertAlways(value_size <= reg_size); + MemoryCopy(reg_bytes, value, value_size); + status = DW_UnwindStatus_Ok; + } + + return status; +} + +internal CTRL_UnwindStepResult +ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us) +{ + CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; + + // gather context for virtual stack unwinder + U64 rebase = 0; + B32 is_unwind_data_eh = 0; + String8 unwind_data = {0}; + EH_FrameHdr eh_frame_hdr = {0}; + EH_PtrCtx eh_ptr_ctx = {0}; + { + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash % ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx % ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) + { + if(ctrl_handle_match(n->module, module_handle)) + { + rebase = n->rebase; + is_unwind_data_eh = n->is_dwarf_unwind_data_eh; + unwind_data = n->dwarf_unwind_data; + eh_frame_hdr = n->eh_frame_hdr; + eh_ptr_ctx = n->eh_ptr_ctx; + break; + } + } + } + + // rebase IP to the base used for linking the module + U64 ip = regs_rip_from_arch_block(arch, regs); + U64 cfi_ip = ip + rebase; + + // use .eh_frame_hdr to quickly locate nearest FDE offset + U64 fde_offset = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, cfi_ip); + + if(fde_offset < unwind_data.size) + { + // parse call frame info + DW_CIE cie = {0}; + DW_FDE fde = {0}; + B32 is_cfi_parsed = is_unwind_data_eh ? + eh_parse_cfi(unwind_data, fde_offset, arch, &eh_ptr_ctx, &cie, &fde) : + dw_parse_cfi(unwind_data, fde_offset, arch, &cie, &fde); + + if(is_cfi_parsed) + { + Temp scratch = scratch_begin(0, 0); + + // setup pointer decoder ops + DW_DecodePtr *decode_ptr_func = 0; + void *decode_ptr_ctx = 0; + if(is_unwind_data_eh) + { + EH_DecodePtrCtx *decode_ptr_ctx_eh = push_array(scratch.arena, EH_DecodePtrCtx, 1); + decode_ptr_ctx_eh->ptr_ctx = &eh_ptr_ctx; + decode_ptr_ctx_eh->addr_enc = cie.ext[EH_CIE_Ext_AddrEnc]; + + decode_ptr_func = eh_decode_ptr; + decode_ptr_ctx = decode_ptr_ctx_eh; + } + else + { + decode_ptr_func = dw_decode_ptr_debug_frame; + decode_ptr_ctx = &cie; + } + + // find register rules for IP + DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(scratch.arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, cfi_ip); + if(cfi_row) + { + // setup machine ops + void *mem_read_ctx = 0; + void *reg_read_ctx = 0; + void *reg_write_ctx = 0; + DW_MemRead *mem_read_func = 0; + DW_RegRead *reg_read_func = 0; + DW_RegWrite *reg_write_func = 0; + switch(arch) + { + case Arch_Null: break; + case Arch_x64: + { + CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); + mem_read_ctx_x64->process_handle = process_handle; + mem_read_ctx_x64->endt_us = endt_us; + + mem_read_ctx = mem_read_ctx_x64; + reg_read_ctx = regs; + reg_write_ctx = regs; + + mem_read_func = ctrl_unwind_mem_read_dwarf_x64; + reg_read_func = ctrl_unwind_reg_read_dwarf_x64; + reg_write_func = ctrl_unwind_reg_write_dwarf_x64; + }break; + case Arch_x86: + case Arch_arm64: + case Arch_arm32: + { + NotImplemented; + }break; + default: { InvalidPath; } break; + } + + // apply register rules to the context + DW_UnwindStatus cfi_uw_status = dw_cfi_apply_register_rules(arch, + &cie, + cfi_row, + mem_read_func, + mem_read_ctx, + reg_read_func, + reg_read_ctx, + reg_write_func, + reg_write_ctx); + + // translate unwind status code to control layer's result flags + switch(cfi_uw_status) + { + case DW_UnwindStatus_Ok: + { + result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); + }break; + case DW_UnwindStatus_Fail: + { + result.flags |= CTRL_UnwindFlag_Error; + }break; + case DW_UnwindStatus_Maybe: + { + result.flags &= ~CTRL_UnwindFlag_Error; + result.flags |= CTRL_UnwindFlag_Stale; + }break; + default: { InvalidPath; } break; + } + } + + scratch_end(scratch); + } + else + { + Assert(0 && "failed to parse CFI"); + } + } + else + { + // TODO: if IP does not have FDE, does this mean function is a leaf? + } + + return result; +} + //- rjf: [x64] internal REGS_Reg64 * @@ -2652,13 +2896,19 @@ internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, U64 endt_us) { CTRL_UnwindStepResult result = {0}; - switch(arch) + + result = ctrl_unwind_step__dwarf(process, module, arch, reg_block, endt_us); + + if(result.flags != 0) { - default:{}break; - case Arch_x64: + switch(arch) { - result = ctrl_unwind_step__pe_x64(process, module, module_base_vaddr, (REGS_RegBlockX64 *)reg_block, endt_us); - }break; + default:{}break; + case Arch_x64: + { + result = ctrl_unwind_step__pe_x64(process, module, module_base_vaddr, (REGS_RegBlockX64 *)reg_block, endt_us); + }break; + } } return result; } @@ -3147,7 +3397,11 @@ ctrl_thread__entry_point(void *p) scratch_end(scratch); } - //- rjf: gather all touched files by user breakpoints + + + + + //- rjf: gather all touched files by user breakpoints for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) { if(n->v.kind != CTRL_UserBreakpointKind_FileNameAndLineColNumber) @@ -3392,8 +3646,15 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ //- rjf: parse module image info // Arena *arena = arena_alloc(); + COFF_MachineType machine = COFF_MachineType_Unknown; + PE_ImageFileCharacteristics file_characteristics = 0; PE_IntelPdata *pdatas = 0; U64 pdatas_count = 0; + U64 rebase = 0; + B32 is_dwarf_unwind_data_eh = 0; + String8 dwarf_unwind_data = {0}; + EH_FrameHdr eh_frame_hdr = {0}; + EH_PtrCtx eh_ptr_ctx = {0}; U64 entry_point_voff = 0; Rng1U64 tls_vaddr_range = {0}; U32 pdb_dbg_time = 0; @@ -3438,7 +3699,12 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ COFF_FileHeader file_header = {0}; if(is_valid) { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + file_header_off, &file_header)) + if(dmn_process_read_struct(process.dmn_handle, vaddr_range.min + file_header_off, &file_header)) + { + machine = file_header.machine; + file_characteristics = file_header.flags; + } + else { is_valid = 0; } @@ -3462,24 +3728,24 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ // rjf: read info U32 reported_data_dir_offset = 0; - U32 reported_data_dir_count = 0; + U32 reported_data_dir_count = 0; switch(opt_ext_magic) { case PE_PE32_MAGIC: { PE_OptionalHeader32 pe_optional = {0}; dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - entry_point = pe_optional.entry_point_va; + entry_point = pe_optional.entry_point_va; reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; + reported_data_dir_count = pe_optional.data_dir_count; }break; case PE_PE32PLUS_MAGIC: { PE_OptionalHeader32Plus pe_optional = {0}; dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - entry_point = pe_optional.entry_point_va; + entry_point = pe_optional.entry_point_va; reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; + reported_data_dir_count = pe_optional.data_dir_count; }break; } @@ -3607,7 +3873,7 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ exe_dbg_path = path; } } - + // rjf: extract copy of module's raddbg data { for EachIndex(idx, sec_count) @@ -3636,6 +3902,41 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ U8 new_value = 1; dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); } + +#if 0 + // TODO(ns): temporary hack to test DWARF unwinder on windows -- remove when done + { + for EachIndex(idx, sec_count) + { + String8 section_name = str8_cstring((char *)sec[idx].name); + if(str8_match(section_name, str8_lit("/130"), 0)) + { + U64 restore_pos = arena_pos(arena); + Rng1U64 debug_frame_voff_range = rng_1u64(sec[idx].voff, sec[idx].voff + sec[idx].vsize); + Rng1U64 debug_frame_vaddr_range = shift_1u64(debug_frame_voff_range, vaddr_range.min); + void *debug_frame_buffer = push_array(arena, U8, sec[idx].vsize); + U64 debug_frame_read_size = dmn_process_read(process.dmn_handle, debug_frame_vaddr_range, debug_frame_buffer); + if(debug_frame_read_size == sec[idx].vsize) + { + U64 default_base = pe_get_default_base_addr(file_characteristics, machine); + Arch arch = ctrl_arch_from_process_handle(process); + String8 debug_frame = str8(debug_frame_buffer, debug_frame_read_size); + DW_CallFrameInfo dwarf_cfi = dw_call_frame_info_from_data(scratch.arena, arch, debug_frame); + String8 eh_frame_hdr_data = eh_frame_hdr_from_call_frame_info(arena, dwarf_cfi.fde_count, dwarf_cfi.fde_offsets, dwarf_cfi.fde); + rebase = default_base - vaddr_range.min; // DL overwrites image base in the optional header, if image is linked with a custom base this breaks + dwarf_unwind_data = debug_frame; + is_dwarf_unwind_data_eh = 0; + eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), 0); + } + else + { + arena_pop_to(arena, restore_pos); + } + break; + } + } + } +#endif scratch_end(scratch); } @@ -3718,10 +4019,13 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ node->arena = arena; node->pdatas = pdatas; node->pdatas_count = pdatas_count; + node->rebase = rebase; + node->is_dwarf_unwind_data_eh = is_dwarf_unwind_data_eh; + node->dwarf_unwind_data = dwarf_unwind_data; + node->eh_frame_hdr = eh_frame_hdr; + node->eh_ptr_ctx = eh_ptr_ctx; node->entry_point_voff = entry_point_voff; node->initial_debug_info_path = initial_debug_info_path; - node->raddbg_section_voff_range = raddbg_section_voff_range; - node->raddbg_data = raddbg_data; } } } diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index f7304452..0505ab7f 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -597,6 +597,11 @@ struct CTRL_ModuleImageInfoCacheNode Arena *arena; PE_IntelPdata *pdatas; U64 pdatas_count; + U64 rebase; + B32 is_dwarf_unwind_data_eh; + String8 dwarf_unwind_data; + EH_FrameHdr eh_frame_hdr; + EH_PtrCtx eh_ptr_ctx; U64 entry_point_voff; Rng1U64 tls_vaddr_range; String8 initial_debug_info_path; @@ -915,12 +920,20 @@ internal Rng1U64 ctrl_tls_vaddr_range_from_module(CTRL_Handle module_handle); internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle); internal String8 ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle); +//////////////////////////////// +//~ Process Info Functions + +internal Arch ctrl_arch_from_process_handle(CTRL_Handle process_handle); + //////////////////////////////// //~ rjf: Unwinding Functions //- rjf: unwind deep copier internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src); +//- DWARF +internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us); + //- rjf: [x64] internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); From c32d85ea2d88a26d7d2b5853f1c788c8676ed970 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 13 Oct 2025 12:02:33 -0700 Subject: [PATCH 017/850] DWARF helper --- src/dwarf/dwarf_help.c | 71 ++++++++++++++++++++++++++++++++++++++++++ src/dwarf/dwarf_help.h | 18 +++++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/dwarf/dwarf_help.c create mode 100644 src/dwarf/dwarf_help.h diff --git a/src/dwarf/dwarf_help.c b/src/dwarf/dwarf_help.c new file mode 100644 index 00000000..547c171f --- /dev/null +++ b/src/dwarf/dwarf_help.c @@ -0,0 +1,71 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal +DW_CIE_FROM_OFFSET_FUNC(dw_call_frame_info_cie_from_offset) +{ + return hash_table_search_u64_raw(ud, offset); +} + +internal DW_CallFrameInfo +dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame) +{ + Temp scratch = scratch_begin(&arena, 1); + + // count CIE and FDE entries + U64 cie_count = 0, fde_count = 0; + for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { + DW_DescriptorEntry desc = {0}; + desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); + if (desc_size == 0) { break; } + if (desc.type == DW_DescriptorEntryType_CIE) { + cie_count += 1; + } else if (desc.type == DW_DescriptorEntryType_FDE) { + fde_count += 1; + } + } + + // parse CIEs and build (offset -> CIE) hash table + HashTable *cie_ht = hash_table_init(scratch.arena, (U64)(cie_count * 1.3)); + DW_CIE *cie = push_array(arena, DW_CIE, cie_count); + U64 parse_cie_count = 0; + for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { + DW_DescriptorEntry desc = {0}; + desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); + if (desc_size == 0) { break; } + if (desc.type == DW_DescriptorEntryType_CIE) { + if (dw_parse_cie(str8_skip(debug_frame, cursor), desc.format, arch, &cie[parse_cie_count])) { + hash_table_push_u64_raw(scratch.arena, cie_ht, cursor, &cie[parse_cie_count]); + parse_cie_count += 1; + } + } + } + + // parse FDEs + DW_FDE *fde = push_array(arena, DW_FDE, fde_count); + U64 parse_fde_count = 0; + for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { + DW_DescriptorEntry desc = {0}; + desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); + if (desc_size == 0) { break; } + if (desc.type == DW_DescriptorEntryType_FDE) { + if (dw_parse_fde(str8_skip(debug_frame, cursor), desc.format, dw_call_frame_info_cie_from_offset, cie_ht, &fde[parse_fde_count])) { + fde[parse_fde_count].pc_range.min += rebase; + fde[parse_fde_count].pc_range.max += rebase; + parse_fde_count += 1; + } + } + } + + // fill out result + DW_CallFrameInfo cfi = {0}; + cfi.cie_count = parse_cie_count; + cfi.fde_count = parse_fde_count; + cfi.cie = cie; + cfi.fde = fde; + + scratch_end(scratch); + return cfi; +} + + diff --git a/src/dwarf/dwarf_help.h b/src/dwarf/dwarf_help.h new file mode 100644 index 00000000..2882c6b6 --- /dev/null +++ b/src/dwarf/dwarf_help.h @@ -0,0 +1,18 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_HELP_H +#define DWARF_HELP_H + +typedef struct DW_CallFrameInfo +{ + U64 cie_count; + U64 fde_count; + DW_CIE *cie; + DW_FDE *fde; +} DW_CallFrameInfo; + +internal DW_CallFrameInfo dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame); + +#endif // DWARF_HELP_H + From 327645436ae6baa2166e6c3dd9856cba03ce5e3f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 13 Oct 2025 16:17:37 -0700 Subject: [PATCH 018/850] named semaphore impl for Linux --- src/os/core/linux/os_core_linux.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 9b137287..b254cf17 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -1059,8 +1059,19 @@ os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) Semaphore result = {0}; if (name.size > 0) { - // TODO: we need to allocate shared memory to store sem_t - // NotImplemented; + for EachIndex(attempt_idx, 64) + { + sem_t *s = sem_open((char *)name.str, O_CREAT | O_EXCL, 0666, initial_count); + if(s == SEM_FAILED) + { + s = sem_open((char *)name.str, 0); + } + if(s != SEM_FAILED) + { + result.u64[0] = (U64)s; + break; + } + } } else { From dad92610de60f167fd6f249d799f951db3d26da0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Oct 2025 17:48:06 -0700 Subject: [PATCH 019/850] dumper for .eh_frame_hdr and .eh_frame --- src/dwarf/dwarf_dump.c | 154 +++++++------ src/dwarf/dwarf_dump.h | 12 +- src/dwarf/dwarf_help.c | 9 +- src/dwarf/dwarf_inc.c | 2 + src/dwarf/dwarf_inc.h | 2 + src/dwarf/dwarf_parse.c | 27 +-- src/dwarf/dwarf_parse.h | 8 +- src/eh/eh_frame.c | 473 --------------------------------------- src/eh/eh_frame.h | 122 ---------- src/elf/elf.h | 41 ++-- src/radbin/radbin.c | 38 ++++ src/radbin/radbin_main.c | 2 - src/raddbg/raddbg_main.c | 2 - 13 files changed, 161 insertions(+), 731 deletions(-) delete mode 100644 src/eh/eh_frame.c delete mode 100644 src/eh/eh_frame.h diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 4a7ccc32..95850e58 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -343,7 +343,7 @@ dw_string_list_from_cfi_program(Arena *arena, DW_Ext ext, DW_Format format, U64 pc_begin, - DW_CIE *cie, + DW_CIE *cie, DW_DecodePtr *decode_ptr_func, void *deocde_ptr_ud, String8 program) @@ -494,6 +494,64 @@ exit:; return list; } +internal String8 +dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa) +{ + String8 cfa_str = str8_lit("???"); + switch (cfa.rule) { + case DW_CFA_Rule_Null: {} break; + case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; + case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; + default: { InvalidPath; } break; + } + return cfa_str; +} + +internal String8 +dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List cfi_regs_list = {0}; + U64 reg_count = dw_reg_count_from_arch(arch); + for EachIndex(reg_idx, reg_count) { + DW_CFI_Register *cfi_reg = &row->regs[reg_idx]; + String8 rule_str = str8_lit("???"); + switch (cfi_reg->rule) { + case DW_CFI_RegisterRule_Undefined: { + rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_SameValue: { + rule_str = str8_zero(); + } break; + case DW_CFI_RegisterRule_Offset: { + rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_ValOffset: { + rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_Expression: { + rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_ValExpression: { + rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_Architectural: { + rule_str = str8_lit("???"); + } break; + default: { InvalidPath; } break; + } + + if (rule_str.size) { + str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_reg(scratch.arena, arch, reg_idx), rule_str); + } + } + + String8 string = str8_list_join(arena, &cfi_regs_list, &(StringJoin){.sep=str8_lit(", ")}); + + scratch_end(scratch); + return string; +} + internal String8 dw_single_line_string_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format) { @@ -1674,12 +1732,6 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni return result; } -internal -DW_CIE_FROM_OFFSET_FUNC(dwarf_dump_cie_from_offset) -{ - return hash_table_search_u64_raw(ud, offset); -} - internal String8List dw_dump_list_from_sections(Arena *arena, DW_Input *input, @@ -1712,7 +1764,8 @@ dw_dump_list_from_sections(Arena *arena, //- rjf: dump .debug_info // DumpSubset(DebugInfo) - { Rng1U64List unit_ranges_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Info].data); + { + Rng1U64List unit_ranges_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Info].data); Rng1U64Array unit_ranges = rng1u64_array_from_list(scratch.arena, &unit_ranges_list); for EachIndex(unit_idx, unit_ranges.count) { @@ -2181,12 +2234,12 @@ dw_dump_list_from_sections(Arena *arena, dumpf("CIE: // entry range: %r\n", desc.entry_range); dumpf("{\n"); - dumpf(" Format: %S\n", dw_string_from_format(desc.format)); - dumpf(" Version: %u\n", cie.version); - dumpf(" Aug string: %S\n", cie.aug_string.size ? cie.aug_string : str8_lit("None")); - dumpf(" Code align: %I64u\n", cie.code_align_factor); - dumpf(" Data align: %I64d\n", cie.data_align_factor); - dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); + dumpf(" Format: %S\n", dw_string_from_format(desc.format)); + dumpf(" Version: %u\n", cie.version); + dumpf(" Aug string: \"%S\"\n", cie.aug_string); + dumpf(" Code align: %I64u\n", cie.code_align_factor); + dumpf(" Data align: %I64d\n", cie.data_align_factor); + dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); if (cie.version > DW_Version_3) { dumpf(" Address size: %u\n", cie.address_size); dumpf(" Segment selector size: %u\n", cie.segment_selector_size); @@ -2201,15 +2254,18 @@ dw_dump_list_from_sections(Arena *arena, } } break; case DW_DescriptorEntryType_FDE: { + DW_DescriptorEntry cie_desc = {0}; + U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); + String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); + DW_CIE cie = {0}; + dw_parse_cie(cie_data, cie_desc.format, arch, &cie); + DW_FDE fde = {0}; - if (dw_parse_fde(raw_desc, desc.format, dwarf_dump_cie_from_offset, cie_ht, &fde)) { - DW_Version version = DW_Version_5; - DW_Ext ext = DW_Ext_All; - - DW_CIE *cie = hash_table_search_u64_raw(cie_ht, fde.cie_pointer); - String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, cie, dw_decode_ptr_debug_frame, cie, fde.insts); - - dumpf("FDE: // entry range: %r\n", desc.entry_range, dw_string_from_format(fde.format), fde.cie_pointer, fde.pc_range); + if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { + DW_Version version = DW_Version_5; + DW_Ext ext = DW_Ext_All; + String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); + dumpf("FDE: // entry range: %r\n", desc.entry_range); dumpf("{\n"); { dumpf(" Format: %S\n", dw_string_from_format(fde.format)); @@ -2220,60 +2276,12 @@ dw_dump_list_from_sections(Arena *arena, for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } dumpf(" }\n"); } - dumpf(" Unwind:\n"); dumpf(" {\n"); - DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, cie, &fde, dw_decode_ptr_debug_frame, cie); + DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); do { - String8 cfa_str = str8_lit("???"); - DW_CFA cfa = cfi_unwind->row->cfa; - switch (cfa.rule) { - case DW_CFA_Rule_Null: {} break; - case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(scratch.arena, arch, cfa.reg, cfa.off); } break; - case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(scratch.arena, cfa.expr, max_U64, cie->address_size, arch, version, ext, fde.format); } break; - default: { InvalidPath; } break; - } - - String8 cfi_regs_str = {0}; - { - String8List cfi_regs_list = {0}; - U64 reg_count = dw_reg_count_from_arch(arch); - for EachIndex(reg_idx, reg_count) { - DW_CFI_Register *cfi_reg = &cfi_unwind->row->regs[reg_idx]; - String8 rule_str = str8_lit("???"); - switch (cfi_reg->rule) { - case DW_CFI_RegisterRule_Undefined: { - rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_SameValue: { - rule_str = str8_zero(); - } break; - case DW_CFI_RegisterRule_Offset: { - rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_ValOffset: { - rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_Expression: { - rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, cie->address_size, arch, version, ext, fde.format)); - } break; - case DW_CFI_RegisterRule_ValExpression: { - rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, cie->address_size, arch, version, ext, fde.format)); - } break; - case DW_CFI_RegisterRule_Architectural: { - rule_str = str8_lit("???"); - } break; - default: { InvalidPath; } break; - } - - if (rule_str.size) { - str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_reg(scratch.arena, arch, reg_idx), rule_str); - } - } - - cfi_regs_str = str8_list_join(scratch.arena, &cfi_regs_list, &(StringJoin){.sep=str8_lit(", ")}); - } - + String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); + String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); dumpf(" }\n"); diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index 4ff7c1c0..472bb7b7 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -59,12 +59,16 @@ read_only global String8 dw_name_title_from_dump_subset_table[] = //~ rjf: Stringification Helpers internal String8 dw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off); -internal String8List dw_string_list_from_expression (Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); -internal String8 dw_single_line_string_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); +internal String8 dw_string_from_reg(Arena *arena, Arch arch, DW_Reg reg_idx); +internal String8List dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); +internal String8 dw_string_from_expression(Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); + +internal String8List dw_string_list_from_cfi_program(Arena *arena, U64 cu_base, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format, U64 pc_begin, DW_CIE *cie, DW_DecodePtr *decode_ptr_func, void *deocde_ptr_ud, String8 program); + +internal String8 dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa); +internal String8 dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row); #if 0 -internal void dw_string_from_cfi_program (Arena *arena, String8List *out, String8 indent, String8 raw_data, DW_CIE *cie, EH_PtrCtx *ptr_ctx, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); - internal void dw_print_eh_frame (Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx); internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); diff --git a/src/dwarf/dwarf_help.c b/src/dwarf/dwarf_help.c index 547c171f..84ccf52c 100644 --- a/src/dwarf/dwarf_help.c +++ b/src/dwarf/dwarf_help.c @@ -1,12 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal -DW_CIE_FROM_OFFSET_FUNC(dw_call_frame_info_cie_from_offset) -{ - return hash_table_search_u64_raw(ud, offset); -} - internal DW_CallFrameInfo dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame) { @@ -49,7 +43,8 @@ dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_ desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); if (desc_size == 0) { break; } if (desc.type == DW_DescriptorEntryType_FDE) { - if (dw_parse_fde(str8_skip(debug_frame, cursor), desc.format, dw_call_frame_info_cie_from_offset, cie_ht, &fde[parse_fde_count])) { + DW_CIE *cie = hash_table_search_u64_raw(cie_ht, desc.cie_pointer); + if (dw_parse_fde(str8_skip(debug_frame, cursor), desc.format, cie, &fde[parse_fde_count])) { fde[parse_fde_count].pc_range.min += rebase; fde[parse_fde_count].pc_range.max += rebase; parse_fde_count += 1; diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index b4ab74b0..df0cc700 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -9,3 +9,5 @@ #include "dwarf/dwarf_unwind.c" #include "dwarf/dwarf_dump.c" #include "dwarf/dwarf_help.c" +#include "dwarf/eh_frame.c" +#include "dwarf/eh_dump.c" diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index 26c24302..44783a34 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -12,5 +12,7 @@ #include "dwarf/dwarf_unwind.h" #include "dwarf/dwarf_dump.h" #include "dwarf/dwarf_help.h" +#include "dwarf/eh_frame.h" +#include "dwarf/eh_dump.h" #endif // DWARF_INC_H diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 0998b75f..d65f304f 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -3369,9 +3369,11 @@ dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc if (id_size == 0) { goto exit; } U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64; - desc_out->format = format; - desc_out->type = (id == id_type) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; - desc_out->entry_range = entry_range; + desc_out->format = format; + desc_out->type = (id == id_type) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; + desc_out->entry_range = entry_range; + desc_out->cie_pointer = id; + desc_out->cie_pointer_off = length_size; exit:; return length + length_size; @@ -3447,11 +3449,7 @@ exit:; } internal B32 -dw_parse_fde(String8 data, - DW_Format format, - DW_CIEFromOffsetFunc *cie_from_offset_func, - void *cie_from_offset_ud, - DW_FDE *fde_out) +dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out) { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; @@ -3462,10 +3460,6 @@ dw_parse_fde(String8 data, if (cie_pointer_size == 0) { goto exit; } cursor += cie_pointer_size; - // map offset -> CIE - DW_CIE *cie = cie_from_offset_func(cie_from_offset_ud, cie_pointer); - if (cie == 0) { goto exit; } - // extract address of first instruction U64 pc_begin = 0; U64 pc_begin_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin); @@ -3485,7 +3479,6 @@ dw_parse_fde(String8 data, // commit values to out fde_out->format = format; fde_out->cie_pointer = cie_pointer; - fde_out->cie = cie; fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); fde_out->insts = str8_skip(data, cursor); @@ -3494,12 +3487,6 @@ exit:; return is_parsed; } -internal -DW_CIE_FROM_OFFSET_FUNC(dw_parse_cfi_cie_from_offset) -{ - return ud; -} - internal B32 dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out) { @@ -3515,7 +3502,7 @@ dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *f dw_parse_descriptor_entry_header(data, cie_pointer, &cie_desc); if (cie_desc.type == DW_DescriptorEntryType_CIE) { if (dw_parse_cie(str8_substr(data, cie_desc.entry_range), cie_desc.format, arch, cie_out)) { - if (dw_parse_fde(str8_substr(data, fde_desc.entry_range), fde_desc.format, dw_parse_cfi_cie_from_offset, cie_out, fde_out)) { + if (dw_parse_fde(str8_substr(data, fde_desc.entry_range), fde_desc.format, cie_out, fde_out)) { is_parsed = 1; } } diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index fc8ce759..e6bd6cc6 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -368,6 +368,8 @@ typedef struct DW_DescriptorEntry DW_DescriptorEntryType type; DW_Format format; Rng1U64 entry_range; + U64 cie_pointer_off; + U64 cie_pointer; } DW_DescriptorEntry; typedef struct DW_CIE @@ -389,7 +391,6 @@ typedef struct DW_FDE { DW_Format format; U64 cie_pointer; - DW_CIE *cie; Rng1U64 pc_range; String8 insts; } DW_FDE; @@ -430,9 +431,6 @@ typedef struct DW_CFA_InstList #define DW_DECODE_PTR(name) U64 name(String8 data, void *ud, U64 *ptr_out) typedef DW_DECODE_PTR(DW_DecodePtr); -#define DW_CIE_FROM_OFFSET_FUNC(name) DW_CIE * name(void *ud, U64 offset) -typedef DW_CIE_FROM_OFFSET_FUNC(DW_CIEFromOffsetFunc); - // hasher internal U64 dw_hash_from_string(String8 string); @@ -559,7 +557,7 @@ internal U64 dw_read_debug_frame_ptr(String8 data, DW_CIE *cie, U64 *ptr_out); internal U64 dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out); internal B32 dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out); -internal B32 dw_parse_fde(String8 data, DW_Format format, DW_CIEFromOffsetFunc *cie_from_offset_func, void *cie_from_offset_ud, DW_FDE *fde_out); +internal B32 dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out); internal B32 dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out); internal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud, U64 *bytes_read_out, DW_CFA_Inst *inst_out); diff --git a/src/eh/eh_frame.c b/src/eh/eh_frame.c deleted file mode 100644 index c89c0ee5..00000000 --- a/src/eh/eh_frame.c +++ /dev/null @@ -1,473 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal U64 -eh_parse_ptr(String8 frame_base, U64 off, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) -{ - U64 ptr_off = off; - - if (encoding == EH_PtrEnc_Omit) { - return 0; - } - - // align read offset as needed - if (encoding == EH_PtrEnc_Aligned) { - ptr_off = AlignPow2(ptr_off, ptr_ctx->ptr_align); - encoding = EH_PtrEnc_Ptr; - } - - // decode pointer value - U64 decode_size = 0; - U64 raw_ptr_size = 0; - U64 raw_ptr = 0; - switch (encoding & EH_PtrEnc_TypeMask) { - default: { InvalidPath; } break; - - case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; - case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; - case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; - case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; - ufixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - } break; - - // TODO: Signed is actually just a flag that indicates this int is negavite. - // There shouldn't be a read for Signed. - // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. - case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; - - case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; - case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; - case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; - sfixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); - } break; - - case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; - case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; - } - - // apply relative bases - if (decode_size > 0) { - U64 ptr = raw_ptr; - switch (encoding & EH_PtrEnc_ModifierMask) { - case EH_PtrEnc_PcRel: { ptr = ptr_ctx->raw_base_vaddr + off + raw_ptr; } break; - case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; - case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; - case EH_PtrEnc_FuncRel: { - Assert(!"TODO: need a sample to verify implementation"); - ptr = ptr_ctx->func_vaddr + raw_ptr; - } break; - } - - if (ptr_out) { - *ptr_out = raw_ptr; - } - } - - return decode_size; -} - -internal EH_FrameHdr -eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) -{ - EH_FrameHdr header = {0}; - U64 cursor = 0; - - U64 version_size = str8_deserial_read_struct(data, cursor, &header.version); - if (version_size == 0) { goto exit; } - cursor += version_size; - - if (header.version == 1) { - U64 eh_frame_ptr_enc_size = str8_deserial_read_struct(data, cursor, &header.eh_frame_ptr_enc); - if (eh_frame_ptr_enc_size == 0) { goto exit; } - cursor += eh_frame_ptr_enc_size; - - EH_PtrEnc fde_count_enc = 0; - U64 fde_count_enc_size = str8_deserial_read_struct(data, cursor, &fde_count_enc); - if (fde_count_enc_size == 0) { goto exit; } - cursor += fde_count_enc_size; - - U64 table_enc_size = str8_deserial_read_struct(data, cursor, &header.table_enc); - if (table_enc_size == 0) { goto exit; } - cursor += table_enc_size; - - U64 eh_frame_ptr = 0; - cursor += eh_parse_ptr(data, cursor, ptr_ctx, header.eh_frame_ptr_enc, &eh_frame_ptr); - - cursor += eh_parse_ptr(data, cursor, ptr_ctx, header.fde_count_enc, &header.fde_count); - - switch (header.table_enc) { - case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; - case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 - case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; - case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; - case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; - case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; - case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 - case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; - case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; - case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; - default: { InvalidPath; } break; - } - header.entry_byte_size = header.field_byte_size * 2; - - header.table = str8_skip(data, cursor); - AssertAlways(header.table.size == header.entry_byte_size * header.fde_count); - } else { - Assert(0 && "unknown version"); - } - -exit:; - return header; -} - -internal U64 -eh_parse_aug_data(String8 aug_string, String8 aug_data, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out) -{ - // TODO: - // Handle "eh" param, it indicates presence of EH Data field. - // On 32bit arch it is a 4-byte and on 64-bit 8-byte value. - // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html - // Reference doc doesn't clarify structure for EH Data though - - U64 cursor = 0; - - EH_AugFlags aug_flags = 0; - EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; - EH_PtrEnc addr_encoding = EH_PtrEnc_UData8; - EH_PtrEnc handler_encoding = EH_PtrEnc_Omit; - U64 handler_ip = 0; - if (str8_match(str8_prefix(aug_string, 1), str8_lit("z"), 0)) { - U64 aug_cursor = 0; - for (U8 *ptr = aug_string.str; ptr < (aug_string.str+aug_string.size); ptr += 1) { - switch (*ptr) { - case 'L': { - aug_cursor += str8_deserial_read_struct(aug_data, aug_cursor, &lsda_encoding); - aug_flags |= EH_AugFlag_HasLSDA; - } break; - case 'P': { - aug_cursor += str8_deserial_read_struct(aug_data, aug_cursor, &handler_encoding); - aug_cursor += eh_parse_ptr(aug_data, aug_cursor, ptr_ctx, handler_encoding, &handler_ip); - aug_flags |= EH_AugFlag_HasHandler; - } break; - case 'R': { - aug_cursor += str8_deserial_read_struct(aug_data, aug_cursor, &addr_encoding); - aug_flags |= EH_AugFlag_HasAddrEnc; - } break; - default: { Assert(!"failed to parse augmentation string"); goto exit; } break; - } - } - } - - if (aug_out) { - aug_out->handler_ip = handler_ip; - aug_out->handler_encoding = handler_encoding; - aug_out->lsda_encoding = handler_encoding; - aug_out->addr_encoding = addr_encoding; - aug_out->flags = aug_flags; - } - -exit:; - U64 parse_size = cursor; - return parse_size; -} - -internal B32 -eh_parse_cie(String8 data, DW_Format format, Arch arch, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out) -{ - B32 is_parsed = 0; - U64 cursor = format == DW_Format_32Bit ? 4 : 12; - - U64 cie_id = 0; - U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); - if (cie_id_size == 0) { goto exit; } - cursor += cie_id_size; - - U8 version = 0; - U64 version_size = str8_deserial_read_struct(data, cursor, &version); - if (version_size == 0) { goto exit; } - cursor += version_size; - - String8 aug_string = {0}; - EH_Augmentation aug = {0}; - U64 code_align_factor = 0; - S64 data_align_factor = 0; - U64 ret_addr_reg = max_U64; - if (version == 1) { - U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); - if (aug_string_size == 0) { goto exit; } - cursor += aug_string_size; - - U64 aug_data_size = eh_parse_aug_data(aug_string, str8_skip(data, cursor), ptr_ctx, &aug); - cursor += aug_data_size; - - U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); - if (code_align_factor_size == 0) { goto exit; } - cursor += code_align_factor_size; - - U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); - if (data_align_factor_size == 0) { goto exit; } - cursor += data_align_factor_size; - - ret_addr_reg = 0; - U64 ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); - if (ret_addr_reg_size == 0) { goto exit; } - cursor += ret_addr_reg_size; - } - - cie_out->insts = str8_skip(data, cursor); - cie_out->aug_string = aug_string; - cie_out->code_align_factor = code_align_factor; - cie_out->data_align_factor = data_align_factor; - cie_out->ret_addr_reg = ret_addr_reg; - cie_out->format = format; - cie_out->version = version; - cie_out->address_size = byte_size_from_arch(arch); - cie_out->segment_selector_size = 0; - - cie_out->ext[EH_CIE_Ext_LSDAEnc] = EH_PtrEnc_Omit; - cie_out->ext[EH_CIE_Ext_AddrEnc] = EH_PtrEnc_Omit; - cie_out->ext[EH_CIE_Ext_HandlerEnc] = EH_PtrEnc_Omit; - - if (aug.flags & EH_AugFlag_HasLSDA) { - cie_out->ext[EH_CIE_Ext_LSDAEnc] = aug.lsda_encoding; - } - if (aug.flags & EH_AugFlag_HasAddrEnc) { - cie_out->ext[EH_CIE_Ext_AddrEnc] = aug.addr_encoding; - } - if (aug.flags & EH_AugFlag_HasHandler) { - cie_out->ext[EH_CIE_Ext_HandlerEnc] = aug.handler_encoding; - cie_out->ext[EH_CIE_Ext_HandlerIp ] = aug.handler_ip; - } - - is_parsed = 1; -exit:; - return is_parsed; -} - -internal B32 -eh_parse_fde(String8 data, - DW_Format format, - DW_CIEFromOffsetFunc *cie_from_offset_func, - void *cie_from_offset_ud, - EH_PtrCtx *ptr_ctx, - DW_FDE *fde_out) -{ - B32 is_parsed = 0; - U64 cursor = format == DW_Format_32Bit ? 4 : 12; - - U64 cie_pointer = 0; - U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer); - if (cie_pointer_size == 0) { goto exit; } - - DW_CIE *cie = cie_from_offset_func(cie_from_offset_ud, cie_pointer); - if (cie == 0) { goto exit; } - - EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; - - U64 pc_begin = 0; - U64 pc_range = 0; - if (addr_enc != EH_PtrEnc_Omit) { - U64 pc_begin_size = eh_parse_ptr(data, cursor, ptr_ctx, addr_enc, &pc_begin); - if (pc_begin_size == 0) { goto exit; } - cursor += pc_begin_size; - - U64 pc_range_size = eh_parse_ptr(data, cursor, ptr_ctx, addr_enc, &pc_range_size); - if (pc_range_size == 0) { goto exit; } - cursor += pc_range_size; - } - - if (cursor + cie->aug_data.size > data.size) { goto exit; } - cursor += cie->aug_data.size; - - fde_out->format = format; - fde_out->cie_pointer = cie_pointer; - fde_out->cie = cie; - fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); - fde_out->insts = str8_skip(data, cursor); - - is_parsed = 1; -exit:; - return is_parsed; -} - -internal -DW_CIE_FROM_OFFSET_FUNC(eh_parse_cfi_cie_from_offset) -{ - return ud; -} - -internal B32 -eh_parse_cfi(String8 eh_frame, U64 fde_offset, Arch arch, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out, DW_FDE *fde_out) -{ - B32 is_parsed = 0; - DW_DescriptorEntry fde_desc = {0}; - dw_parse_descriptor_entry_header(eh_frame, fde_offset, &fde_desc); - if (fde_desc.type == DW_DescriptorEntryType_FDE) { - U64 cie_pointer_off = fde_desc.format == DW_Format_32Bit ? 4 : 12; - U64 cie_pointer = 0; - U64 cie_pointer_size = str8_deserial_read_dwarf_uint(eh_frame, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); - if (cie_pointer_size) { - DW_DescriptorEntry cie_desc = {0}; - dw_parse_descriptor_entry_header(eh_frame, cie_pointer, &cie_desc); - if (cie_desc.type == DW_DescriptorEntryType_CIE) { - if (eh_parse_cie(str8_substr(eh_frame, cie_desc.entry_range), cie_desc.format, arch, ptr_ctx, cie_out)) { - if (eh_parse_fde(str8_substr(eh_frame, fde_desc.entry_range), fde_desc.format, eh_parse_cfi_cie_from_offset, cie_out, ptr_ctx, fde_out)) { - return is_parsed; - } - } - } - } - } - return is_parsed; -} - -internal U64 -eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) -{ - U64 fde_offset = max_U64; - U64 fde_idx = max_U64; - - if (header.version == 1) { - if (header.fde_count > 0) { - U64 first = 0; - U64 first_size = eh_parse_ptr(header.table, 0, ptr_ctx, header.table_enc, &first); - AssertAlways(first_size); - if (first == pc) { - fde_idx = 0; - goto exit; - } - if (first > pc) { - goto exit; - } - - U64 last = 0; - U64 last_size = eh_parse_ptr(header.table, header.table.size - header.entry_byte_size, ptr_ctx, header.table_enc, &last); - AssertAlways(last_size); - if (last <= pc) { - fde_idx = header.fde_count - 1; - goto exit; - } - - if (first <= pc && pc < last) { - U64 l = 0; - U64 r = header.fde_count - 1; - while (l <= r) { - U64 m = l + (r - l) / 2; - U64 m_pc = 0; - U64 m_pc_size = eh_parse_ptr(header.table, m * header.entry_byte_size, ptr_ctx, header.table_enc, &m_pc); - Assert(m_pc_size); - - if (m_pc == pc) { - fde_idx = m; - goto exit; - } else if (m_pc < pc) { - l = m + 1; - } else { - r = m - 1; - } - } - fde_idx = l; - } - } - - } - -exit:; - if (fde_idx < header.fde_count) { - U64 fde_offset_size = eh_parse_ptr(header.table, (fde_idx * header.entry_byte_size) + header.field_byte_size, ptr_ctx, header.table_enc, &fde_offset); - Assert(fde_offset_size); - } - return fde_offset; -} - -internal int -eh_frame_hdr_entry_sort(void *raw_a, void *raw_b) -{ - return ((EH_FrameHdrEntry *)raw_a)->addr < ((EH_FrameHdrEntry *)raw_b)->addr; -} - -internal String8 -eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, DW_FDE *fde) -{ - Temp scratch = scratch_begin(&arena, 1); - - // make .eh_frame_hdr - String8List srl = {0}; - str8_serial_begin(scratch.arena, &srl); - str8_serial_push_u8(scratch.arena, &srl, 1); // version - str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_Omit); // omit eh_frame_ptr field - str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // fde_count encoding - str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // table encoding - str8_serial_push_u64(scratch.arena, &srl, fde_count); // fde_count - String8 header = str8_serial_end(scratch.arena, &srl); - - // alloc buffer for output - U64 buffer_size = header.size + sizeof(EH_FrameHdrEntry) * fde_count; - U8 *buffer = push_array(arena, U8, buffer_size); - - // copy header - MemoryCopyStr8(buffer, header); - - // write the table - EH_FrameHdrEntry *table = (EH_FrameHdrEntry *)(buffer + header.size); - for EachIndex(fde_idx, fde_count) { - table[fde_idx].addr = fde[fde_idx].pc_range.min; - table[fde_idx].fde_offset = fde_offsets[fde_idx]; - } - radsort(table, fde_count, eh_frame_hdr_entry_sort); - - String8 eh_frame_hdr = str8(buffer, buffer_size); - scratch_end(scratch); - return eh_frame_hdr; -} - -internal -DW_DECODE_PTR(eh_decode_ptr) -{ - EH_DecodePtrCtx *ctx = ud; - return eh_parse_ptr(data, 0, ctx->ptr_ctx, ctx->addr_enc, ptr_out); -} - -internal String8 -eh_string_from_ptr_enc_type(EH_PtrEnc type) -{ - switch (type) { - case EH_PtrEnc_Ptr: return str8_lit("Ptr"); - case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); - case EH_PtrEnc_UData2: return str8_lit("UData2"); - case EH_PtrEnc_UData4: return str8_lit("UData4"); - case EH_PtrEnc_UData8: return str8_lit("UData8"); - case EH_PtrEnc_Signed: return str8_lit("Signed"); - case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); - case EH_PtrEnc_SData2: return str8_lit("SData2"); - case EH_PtrEnc_SData4: return str8_lit("SData4"); - case EH_PtrEnc_SData8: return str8_lit("SData8"); - } - return str8_zero(); -} - -internal String8 -eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier) -{ - switch (modifier) { - case EH_PtrEnc_PcRel: return str8_lit("PcRel"); - case EH_PtrEnc_TextRel: return str8_lit("TextRel"); - case EH_PtrEnc_DataRel: return str8_lit("DataRel"); - case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); - case EH_PtrEnc_Aligned: return str8_lit("Aligned"); - } - return str8_zero(); -} - -internal String8 -eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc) -{ - String8 type_str = eh_string_from_ptr_enc_type(enc & EH_PtrEnc_TypeMask); - String8 modifer_str = eh_string_from_ptr_enc_modifier(enc & EH_PtrEnc_ModifierMask); - String8 indir_str = enc & EH_PtrEnc_Indirect ? str8_lit("Indirect") : str8_zero(); - String8 result = str8f(arena, "Type: %S, Modifier %S (%S)", type_str, modifer_str, indir_str); - return result; -} diff --git a/src/eh/eh_frame.h b/src/eh/eh_frame.h deleted file mode 100644 index 6139ca67..00000000 --- a/src/eh/eh_frame.h +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef EH_FRAME_H -#define EH_FRAME_H - -//////////////////////////////// -//~ Format - -typedef U8 EH_PtrEnc; -enum -{ - EH_PtrEnc_Ptr = 0x00, // Pointer sized unsigned value - EH_PtrEnc_ULEB128 = 0x01, // Unsigned LE base-128 value - EH_PtrEnc_UData2 = 0x02, // Unsigned 16-bit value - EH_PtrEnc_UData4 = 0x03, // Unsigned 32-bit value - EH_PtrEnc_UData8 = 0x04, // Unsigned 64-bit value - EH_PtrEnc_Signed = 0x08, // Signed pointer - EH_PtrEnc_SLEB128 = 0x09, // Signed LE base-128 value - EH_PtrEnc_SData2 = 0x0A, // Signed 16-bit value - EH_PtrEnc_SData4 = 0x0B, // Signed 32-bit value - EH_PtrEnc_SData8 = 0x0C, // Signed 64-bit value - - EH_PtrEnc_TypeMask = 0x0F, -}; - -enum -{ - EH_PtrEnc_PcRel = 0x10, // Value is relative to the current program counter. - EH_PtrEnc_TextRel = 0x20, // Value is relative to the .text section. - EH_PtrEnc_DataRel = 0x30, // Value is relative to the .got or .eh_frame_hdr section. - EH_PtrEnc_FuncRel = 0x40, // Value is relative to the function. - EH_PtrEnc_Aligned = 0x50, // Value is aligned to an address unit sized boundary. - - EH_PtrEnc_ModifierMask = 0x70, -}; - -enum -{ - EH_PtrEnc_Indirect = 0x80, // Value is stored in virtual memory. - EH_PtrEnc_Omit = 0xFF, -}; - -typedef struct EH_PtrCtx -{ - U64 raw_base_vaddr; // address where pointer is being read - U64 text_vaddr; // base address of section with instructions (used for encoding pointer on SH and IA64) - U64 data_vaddr; // base address of data section (used for encoding pointer on x86-64) - U64 func_vaddr; // base address of function where IP is located - U64 ptr_align; -} EH_PtrCtx; - -typedef U8 EH_AugFlags; -enum -{ - EH_AugFlag_HasLSDA = (1 << 0), - EH_AugFlag_HasHandler = (1 << 1), - EH_AugFlag_HasAddrEnc = (1 << 2), -}; - -typedef struct EH_Augmentation -{ - EH_AugFlags flags; - U64 handler_ip; - EH_PtrEnc handler_encoding; - EH_PtrEnc lsda_encoding; - EH_PtrEnc addr_encoding; -} EH_Augmentation; - -//////////////////////////////// -//~ Parser - -enum -{ - EH_CIE_Ext_AddrEnc, - EH_CIE_Ext_LSDAEnc, - EH_CIE_Ext_HandlerEnc, - EH_CIE_Ext_HandlerIp, -} EH_CIE_Ext; - -typedef struct EH_FrameHdrEntry -{ - U64 addr; - U64 fde_offset; -} EH_FrameHdrEntry; - -typedef struct EH_FrameHdr -{ - U8 version; - EH_PtrEnc eh_frame_ptr_enc; - EH_PtrEnc fde_count_enc; - EH_PtrEnc table_enc; - U64 field_byte_size; - U64 entry_byte_size; - U64 fde_count; - String8 table; -} EH_FrameHdr; - -typedef struct EH_DecodePtrCtx -{ - EH_PtrEnc addr_enc; - EH_PtrCtx *ptr_ctx; -} EH_DecodePtrCtx; - -//////////////////////////////// - -internal U64 eh_parse_ptr(String8 frame_base, U64 off, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); -internal EH_FrameHdr eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx); -internal U64 eh_parse_aug_data(String8 aug_string, String8 aug_data, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out); -internal B32 eh_parse_cfi(String8 eh_frame, U64 fde_offset, Arch arch, EH_PtrCtx *ptr_ctx, struct DW_CIE *cie_out, struct DW_FDE *fde_out); -internal U64 eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc); -internal String8 eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, struct DW_FDE *fde); - -//////////////////////////////// -//~ Enum -> String - -internal String8 eh_string_from_ptr_enc_type(EH_PtrEnc type); -internal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier); -internal String8 eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc); - -#endif // EH_FRAME_H - diff --git a/src/elf/elf.h b/src/elf/elf.h index 14955224..c9fbe15e 100644 --- a/src/elf/elf.h +++ b/src/elf/elf.h @@ -106,6 +106,20 @@ enum ELF_Data_2MSB = 2, }; +typedef U16 ELF_Type; +enum +{ + ELF_Type_None = 0, + ELF_Type_Rel = 1, + ELF_Type_Exec = 2, + ELF_Type_Dyn = 3, + ELF_Type_Core = 4, + ELF_Type_LoOs = 0xfe00, + ELF_Type_HiOs = 0xff00, + ELF_Type_LoProc = 0xff00, + ELF_Type_HiProc = 0xffff +}; + typedef U32 ELF_PType; enum { @@ -123,15 +137,10 @@ enum ELF_PType_LowProc = 0x70000000, ELF_PType_HighProc = 0x7fffffff, - // specific to Sun - ELF_PType_LowSunW = 0x6ffffffa, - ELF_PType_SunWBSS = 0x6ffffffb, - ELF_PType_GnuEHFrame = 0x6474E550, - - ELF_PType_GnuStack = ELF_PType_LoOs + 0x474e550, // frame unwind information - ELF_PType_GnuRelro = ELF_PType_LoOs + 0x474e551, // stack flags - ELF_PType_GnuProperty = ELF_PType_LoOs + 0x474e552, // read-only after relocations - ELF_PType_SunEHFrame = ELF_PType_GnuEHFrame, + ELF_PType_GnuEHFrame = ELF_PType_LoOs + 0x474E550, // segment with .eh_frame_hdr + ELF_PType_GnuStack = ELF_PType_LoOs + 0x474e551, // frame unwind information + ELF_PType_GnuRelro = ELF_PType_LoOs + 0x474e552, // stack flags + ELF_PType_GnuProperty = ELF_PType_LoOs + 0x474e553, // read-only after relocations }; typedef U32 ELF_PFlag; @@ -674,20 +683,6 @@ typedef enum ELF_Identifier read_only global U8 elf_magic[] = {0x7f, 'E', 'L', 'F'}; read_only global String8 elf_magic_string = {elf_magic, sizeof(elf_magic)}; -typedef U16 ELF_Type; -typedef enum ELF_TypeEnum -{ - ELF_Type_None = 0, - ELF_Type_Rel = 1, - ELF_Type_Exec = 2, - ELF_Type_Dyn = 3, - ELF_Type_Core = 4, - ELF_Type_LoOs = 0xfe00, - ELF_Type_HiOs = 0xfeff, - ELF_Type_LoProc = 0xff00, - ELF_Type_HiProc = 0xffff, -} ELF_TypeEnum; - typedef struct ELF_Hdr64 { U8 e_ident[ELF_Identifier_Max]; diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 9274a100..8f09207d 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1040,12 +1040,14 @@ rb_thread_entry_point(void *p) //- rjf: unpack dump subset flags RDI_DumpSubsetFlags rdi_dump_subset_flags = RDI_DumpSubsetFlag_All; DW_DumpSubsetFlags dw_dump_subset_flags = DW_DumpSubsetFlag_All; + EH_DumpSubsetFlags eh_dump_subset_flags = EH_DumpSubsetFlag_All; { String8List only_names = cmd_line_strings(cmdline, str8_lit("only")); if(only_names.node_count != 0) { rdi_dump_subset_flags = 0; dw_dump_subset_flags = 0; + eh_dump_subset_flags = 0; } for(String8Node *n = only_names.first; n != 0; n = n->next) { @@ -1055,6 +1057,9 @@ rb_thread_entry_point(void *p) #undef X #define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { dw_dump_subset_flags |= DW_DumpSubsetFlag_##name; } DW_DumpSubset_XList +#undef X +#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { eh_dump_subset_flags |= EH_DumpSubsetFlag_##name; } + EH_DumpSubset_XList #undef X } String8List omit_names = cmd_line_strings(cmdline, str8_lit("omit")); @@ -1066,6 +1071,9 @@ rb_thread_entry_point(void *p) #undef X #define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { dw_dump_subset_flags &= ~DW_DumpSubsetFlag_##name; } DW_DumpSubset_XList +#undef X +#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { eh_dump_subset_flags &= ~EH_DumpSubsetFlag_##name; } + EH_DumpSubset_XList #undef X } } @@ -1085,6 +1093,10 @@ rb_thread_entry_point(void *p) PE_BinInfo pe = {0}; ELF_Bin elf = {0}; DW_Input dw = {0}; + U64 eh_frame_hdr_vaddr = 0; + U64 eh_frame_vaddr = 0; + String8 eh_frame_hdr = {0}; + String8 eh_frame = {0}; { if(f->format == RB_FileFormat_PE) { @@ -1111,6 +1123,22 @@ rb_thread_entry_point(void *p) f->format == RB_FileFormat_ELF64) { dw = dw_input_from_elf_bin(arena, f->data, &elf); + for EachIndex(sect_idx, elf.hdr.e_shnum) + { + ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; + String8 name = elf_name_from_shdr64(f->data, &elf, shdr); + if (str8_match(name, str8_lit(".eh_frame_hdr"), 0)) + { + eh_frame_hdr = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); + eh_frame_hdr_vaddr = shdr->sh_addr; + + } + else if(str8_match(name, str8_lit(".eh_frame"), 0)) + { + eh_frame = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); + eh_frame_vaddr = shdr->sh_addr; + } + } } } } @@ -1204,6 +1232,16 @@ rb_thread_entry_point(void *p) } } } + + if(eh_dump_subset_flags) + { + if(lane_idx() == 0) + { + String8List dump = eh_dump_list_from_data(arena, arch, eh_frame_hdr_vaddr, eh_frame_vaddr, eh_frame_hdr, eh_frame, eh_dump_subset_flags); + str8_list_concat_in_place(&output_blobs, &dump); + } + lane_sync(); + } } }break; } diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 51a65730..e1abc2fc 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -22,7 +22,6 @@ #include "elf/elf_parse.h" #include "codeview/codeview.h" #include "codeview/codeview_parse.h" -#include "eh/eh_frame.h" #include "dwarf/dwarf_inc.h" #include "msf/msf.h" #include "msf/msf_parse.h" @@ -47,7 +46,6 @@ #include "elf/elf_parse.c" #include "codeview/codeview.c" #include "codeview/codeview_parse.c" -#include "eh/eh_frame.c" #include "dwarf/dwarf_inc.c" #include "msf/msf.c" #include "msf/msf_parse.c" diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 723b0c64..60693051 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -218,7 +218,6 @@ #include "pdb/pdb_parse.h" #include "pdb/pdb_stringize.h" #include "dwarf/dwarf_inc.h" -#include "eh/eh_frame.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" @@ -266,7 +265,6 @@ #include "pdb/pdb_parse.c" #include "pdb/pdb_stringize.c" #include "dwarf/dwarf_inc.c" -#include "eh/eh_frame.c" #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" From 4e2c983b0f6eda469718778d4848fbdb3e0db81f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Oct 2025 17:49:41 -0700 Subject: [PATCH 020/850] skip leading NOP opcodes, which caused extra CFI rows to be emitted --- src/dwarf/dwarf_unwind.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index de765be6..89b3b250 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -67,6 +67,14 @@ dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) { B32 is_row_valid = 0; + // skip leading nops + while (uw->curr_inst) { + if (uw->curr_inst->v.opcode != DW_CFA_Nop) { + break; + } + uw->curr_inst = uw->curr_inst->next; + } + while (uw->curr_inst) { DW_CFA_Inst *inst = &uw->curr_inst->v; From 7f705923e67198f606e05c91a3a5761605b897f1 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Oct 2025 17:53:00 -0700 Subject: [PATCH 021/850] parse CIE and FDE out of runtime ELF --- src/ctrl/ctrl_core.c | 746 +++++++++++++++++++++++++------------------ src/ctrl/ctrl_core.h | 4 +- src/pe/pe.h | 1 + 3 files changed, 441 insertions(+), 310 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 0499e09b..be5f7dd4 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1901,14 +1901,16 @@ DW_REG_WRITE(ctrl_unwind_reg_write_dwarf_x64) internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us) { + Temp scratch = scratch_begin(0, 0); + CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; // gather context for virtual stack unwinder - U64 rebase = 0; - B32 is_unwind_data_eh = 0; - String8 unwind_data = {0}; - EH_FrameHdr eh_frame_hdr = {0}; - EH_PtrCtx eh_ptr_ctx = {0}; + U64 rebase = 0; + B32 is_unwind_eh = 0; + String8 unwind_data = {0}; + EH_FrameHdr eh_frame_hdr = {0}; + EH_PtrCtx eh_ptr_ctx = {0}; { U64 hash = ctrl_hash_from_handle(module_handle); U64 slot_idx = hash % ctrl_state->module_image_info_cache.slots_count; @@ -1919,11 +1921,11 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A { if(ctrl_handle_match(n->module, module_handle)) { - rebase = n->rebase; - is_unwind_data_eh = n->is_dwarf_unwind_data_eh; - unwind_data = n->dwarf_unwind_data; - eh_frame_hdr = n->eh_frame_hdr; - eh_ptr_ctx = n->eh_ptr_ctx; + rebase = n->rebase; + is_unwind_eh = n->is_unwind_eh; + unwind_data = n->dwarf_unwind_data; + eh_frame_hdr = n->eh_frame_hdr; + eh_ptr_ctx = n->eh_ptr_ctx; break; } } @@ -1934,25 +1936,103 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A U64 cfi_ip = ip + rebase; // use .eh_frame_hdr to quickly locate nearest FDE offset - U64 fde_offset = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, cfi_ip); + U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, cfi_ip); - if(fde_offset < unwind_data.size) + if(fde_addr != max_U64) { // parse call frame info DW_CIE cie = {0}; DW_FDE fde = {0}; - B32 is_cfi_parsed = is_unwind_data_eh ? - eh_parse_cfi(unwind_data, fde_offset, arch, &eh_ptr_ctx, &cie, &fde) : - dw_parse_cfi(unwind_data, fde_offset, arch, &cie, &fde); + B32 is_cfi_parsed = 0; + if(is_unwind_eh) + { + B32 is_stale = 0; + + // extract FDE info + Rng1U64 fde_vrange = {0}; + DW_Format fde_format = DW_Format_Null; + String8 fde_data = {0}; + U64 cie_addr = 0; + { + // parse FDE length + U32 first_four_bytes = 0; + if(!ctrl_process_memory_read_struct(process_handle, fde_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } + if(first_four_bytes == max_U32) + { + U64 length = 0; + if(!ctrl_process_memory_read_struct(process_handle, fde_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } + fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + length); + fde_format = DW_Format_64Bit; + } + else + { + fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + first_four_bytes); + fde_format = DW_Format_32Bit; + } + + // read out whole FDE + void *fde_raw = push_array(scratch.arena, U8, dim_1u64(fde_vrange)); + if(!ctrl_process_memory_read(process_handle, fde_vrange, &is_stale, fde_raw, endt_us)) { goto eh_parse_exit; } + fde_data = str8(fde_raw, dim_1u64(fde_vrange)); + + // compute CIE address + U64 cie_delta_off = fde_format == DW_Format_32Bit ? 4 : 12; + U64 cie_delta = 0; + U64 cie_delta_size = str8_deserial_read_dwarf_uint(fde_data, cie_delta_off, fde_format, &cie_delta); + if (cie_delta_size == 0) { goto eh_parse_exit; } + cie_addr = (fde_addr + cie_delta_off) - cie_delta; + } + + // extract CIE info + Rng1U64 cie_vrange = {0}; + DW_Format cie_format = DW_Format_Null; + String8 cie_data = {0}; + { + // parse CIE length + U32 first_four_bytes = 0; + if(!ctrl_process_memory_read_struct(process_handle, cie_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } + if(first_four_bytes == max_U32) + { + U64 length = 0; + if(!ctrl_process_memory_read_struct(process_handle, cie_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } + cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + length); + cie_format = DW_Format_64Bit; + } + else + { + cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + first_four_bytes); + cie_format = DW_Format_32Bit; + } + + // read out whole CIE + void *cie_raw = push_array(scratch.arena, U8, dim_1u64(cie_vrange)); + if(!ctrl_process_memory_read(process_handle, cie_vrange, &is_stale, cie_raw, endt_us)) { goto eh_parse_exit; } + cie_data = str8(cie_raw, dim_1u64(cie_vrange)); + } + + // parse CIE and FDE + if(eh_parse_cie(cie_data, cie_format, arch, cie_vrange.min, &eh_ptr_ctx, &cie)) + { + is_cfi_parsed = eh_parse_fde(fde_data, fde_format, fde_vrange.min, &cie, &eh_ptr_ctx, &fde); + } + + eh_parse_exit:; + if(is_stale) + { + result.flags = CTRL_UnwindFlag_Stale; + } + } + else + { + is_cfi_parsed = dw_parse_cfi(unwind_data, fde_addr, arch, &cie, &fde); + } if(is_cfi_parsed) { - Temp scratch = scratch_begin(0, 0); - // setup pointer decoder ops DW_DecodePtr *decode_ptr_func = 0; void *decode_ptr_ctx = 0; - if(is_unwind_data_eh) + if(is_unwind_eh) { EH_DecodePtrCtx *decode_ptr_ctx_eh = push_array(scratch.arena, EH_DecodePtrCtx, 1); decode_ptr_ctx_eh->ptr_ctx = &eh_ptr_ctx; @@ -2034,12 +2114,6 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A default: { InvalidPath; } break; } } - - scratch_end(scratch); - } - else - { - Assert(0 && "failed to parse CFI"); } } else @@ -2047,6 +2121,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A // TODO: if IP does not have FDE, does this mean function is a leaf? } + scratch_end(scratch); return result; } @@ -3639,307 +3714,363 @@ ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_ //- rjf: module lifetime open/close work -internal void -ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path) +internal +DW_MEM_READ(ctrl_dmn_mem_read) { - ////////////////////////////// - //- rjf: parse module image info - // - Arena *arena = arena_alloc(); - COFF_MachineType machine = COFF_MachineType_Unknown; - PE_ImageFileCharacteristics file_characteristics = 0; - PE_IntelPdata *pdatas = 0; - U64 pdatas_count = 0; - U64 rebase = 0; - B32 is_dwarf_unwind_data_eh = 0; - String8 dwarf_unwind_data = {0}; + U64 read = dmn_process_read(((CTRL_Handle *)ud)->dmn_handle, r1u64(addr, addr + size), buffer); + return read == size ? DW_UnwindStatus_Ok : DW_UnwindStatus_Fail; +} + +internal void +ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) +{ + Temp scratch = scratch_begin(0,0); + + Arena *arena = arena_alloc(); + U64 entry_point_voff = 0; + Rng1U64 tls_vaddr_range = {0}; + U32 rdi_dbg_time = 0; + Guid rdi_dbg_guid = {0}; + String8 exe_dbg_path = {0}; + String8 rdi_dbg_path = {0}; + String8 raddbg_data = {0}; + Rng1U64 raddbg_section_voff_range = r1u64(0, 0); + Rng1U64 raddbg_is_attached_section_voff_range = r1u64(0, 0); + + PE_IntelPdata *pdatas = 0; + U64 pdatas_count = 0; + U32 pdb_dbg_time = 0; + U32 pdb_dbg_age = 0; + Guid pdb_dbg_guid = {0}; + String8 pdb_dbg_path = {0}; + + U64 rebase = 0; + B32 is_unwind_eh = 0; EH_FrameHdr eh_frame_hdr = {0}; - EH_PtrCtx eh_ptr_ctx = {0}; - U64 entry_point_voff = 0; - Rng1U64 tls_vaddr_range = {0}; - U32 pdb_dbg_time = 0; - U32 pdb_dbg_age = 0; - Guid pdb_dbg_guid = {0}; - String8 pdb_dbg_path = {0}; - U32 rdi_dbg_time = 0; - Guid rdi_dbg_guid = {0}; - String8 exe_dbg_path = {0}; - String8 rdi_dbg_path = {0}; - String8 raddbg_data = {0}; - Rng1U64 raddbg_section_voff_range = r1u64(0, 0); - Rng1U64 raddbg_is_attached_section_voff_range = r1u64(0, 0); - ProfScope("unpack relevant PE info") + EH_PtrCtx eh_ptr_ctx = { .raw_base_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; + + // read module's signature bytes + U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); + U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); + dmn_process_read(process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); + + ////////////////////////////// + //- parse PE module + // + PE_DosMagic dos_magic = *(PE_DosMagic *)module_sig_bytes; + if(dos_magic == PE_DOS_MAGIC) { - B32 is_valid = 1; - - //- rjf: read DOS header - PE_DosHeader dos_header = {0}; - if(is_valid) + ProfScope("unpack relevant PE info") { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min, &dos_header) || - dos_header.magic != PE_DOS_MAGIC) - { - is_valid = 0; - } - } - - //- rjf: read PE magic - U32 pe_magic = 0; - if(is_valid) - { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || - pe_magic != PE_MAGIC) - { - is_valid = 0; - } - } - - //- rjf: read COFF header - U64 file_header_off = dos_header.coff_file_offset + sizeof(pe_magic); - COFF_FileHeader file_header = {0}; - if(is_valid) - { - if(dmn_process_read_struct(process.dmn_handle, vaddr_range.min + file_header_off, &file_header)) - { - machine = file_header.machine; - file_characteristics = file_header.flags; - } - else - { - is_valid = 0; - } - } - - //- rjf: unpack range of optional extension header - U32 opt_ext_size = file_header.optional_header_size; - Rng1U64 opt_ext_off_range = r1u64(file_header_off + sizeof(COFF_FileHeader), - file_header_off + sizeof(COFF_FileHeader) + opt_ext_size); - - //- rjf: read optional header - U64 entry_point = 0; - U32 data_dir_count = 0; - if(opt_ext_size > 0) - { - Temp scratch = scratch_begin(0, 0); + B32 is_valid = 1; - // rjf: read magic number - U16 opt_ext_magic = 0; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); - - // rjf: read info - U32 reported_data_dir_offset = 0; - U32 reported_data_dir_count = 0; - switch(opt_ext_magic) + //- rjf: read DOS header + PE_DosHeader dos_header = {0}; + if(is_valid) { - case PE_PE32_MAGIC: + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min, &dos_header) || + dos_header.magic != PE_DOS_MAGIC) { - PE_OptionalHeader32 pe_optional = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - entry_point = pe_optional.entry_point_va; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - case PE_PE32PLUS_MAGIC: - { - PE_OptionalHeader32Plus pe_optional = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - entry_point = pe_optional.entry_point_va; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - } - - // rjf: find number of data directories - U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); - data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); - - // rjf: grab pdatas from exceptions section - if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) - { - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); - Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); - pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); - pdatas = push_array(arena, PE_IntelPdata, pdatas_count); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); - } - - // rjf: extract tls header - PE_TLSHeader64 tls_header = {0}; - if(data_dir_count > PE_DataDirectoryIndex_TLS) - { - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_TLS, &dir); - Rng1U64 tls_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); - switch(file_header.machine) - { - default:{}break; - case COFF_MachineType_X86: - { - PE_TLSHeader32 tls_header32 = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header32); - tls_header.raw_data_start = (U64)tls_header32.raw_data_start; - tls_header.raw_data_end = (U64)tls_header32.raw_data_end; - tls_header.index_address = (U64)tls_header32.index_address; - tls_header.callbacks_address = (U64)tls_header32.callbacks_address; - tls_header.zero_fill_size = (U64)tls_header32.zero_fill_size; - tls_header.characteristics = (U64)tls_header32.characteristics; - }break; - case COFF_MachineType_X64: - { - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header); - }break; + is_valid = 0; } } - // rjf: extract sections - U64 sec_array_off = opt_ext_off_range.max; - U64 sec_count = file_header.section_count; - COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); - - // rjf: grab entry point vaddr - entry_point_voff = entry_point; - - // rjf: calculate TLS vaddr range - tls_vaddr_range = r1u64(tls_header.index_address, tls_header.index_address+sizeof(U32)); - - // rjf: grab data about debug info - if(data_dir_count > PE_DataDirectoryIndex_DEBUG) + //- rjf: read PE magic + U32 pe_magic = 0; + if(is_valid) { - // rjf: read data dir - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || + pe_magic != PE_MAGIC) + { + is_valid = 0; + } + } + + //- rjf: read COFF header + U64 file_header_off = dos_header.coff_file_offset + sizeof(pe_magic); + COFF_FileHeader file_header = {0}; + if(is_valid) + { + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + file_header_off, &file_header)) + { + is_valid = 0; + } + } + + //- rjf: unpack range of optional extension header + U32 opt_ext_size = file_header.optional_header_size; + Rng1U64 opt_ext_off_range = r1u64(file_header_off + sizeof(COFF_FileHeader), + file_header_off + sizeof(COFF_FileHeader) + opt_ext_size); + + //- rjf: read optional header + U64 entry_point = 0; + U32 data_dir_count = 0; + if(opt_ext_size > 0) + { + // rjf: read magic number + U16 opt_ext_magic = 0; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); - U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); - for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) + // rjf: read info + U32 reported_data_dir_offset = 0; + U32 reported_data_dir_count = 0; + switch(opt_ext_magic) { - // rjf: read debug directory - U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); - PE_DebugDirectory dbg_data = {0}; - dmn_process_read_struct(process.dmn_handle, dir_addr, &dbg_data); + case PE_PE32_MAGIC: + { + PE_OptionalHeader32 pe_optional = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + entry_point = pe_optional.entry_point_va; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + case PE_PE32PLUS_MAGIC: + { + PE_OptionalHeader32Plus pe_optional = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + entry_point = pe_optional.entry_point_va; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + } + + // rjf: find number of data directories + U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); + data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); + + // rjf: grab pdatas from exceptions section + if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) + { + PE_DataDirectory dir = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); + Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); + pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); + pdatas = push_array(arena, PE_IntelPdata, pdatas_count); + dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); + } + + // rjf: extract tls header + PE_TLSHeader64 tls_header = {0}; + if(data_dir_count > PE_DataDirectoryIndex_TLS) + { + PE_DataDirectory dir = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_TLS, &dir); + Rng1U64 tls_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); + switch(file_header.machine) + { + default:{}break; + case COFF_MachineType_X86: + { + PE_TLSHeader32 tls_header32 = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header32); + tls_header.raw_data_start = (U64)tls_header32.raw_data_start; + tls_header.raw_data_end = (U64)tls_header32.raw_data_end; + tls_header.index_address = (U64)tls_header32.index_address; + tls_header.callbacks_address = (U64)tls_header32.callbacks_address; + tls_header.zero_fill_size = (U64)tls_header32.zero_fill_size; + tls_header.characteristics = (U64)tls_header32.characteristics; + }break; + case COFF_MachineType_X64: + { + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header); + }break; + } + } + + // rjf: extract sections + U64 sec_array_off = opt_ext_off_range.max; + U64 sec_count = file_header.section_count; + COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); + dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); + + // rjf: grab entry point vaddr + entry_point_voff = entry_point; + + // rjf: calculate TLS vaddr range + tls_vaddr_range = r1u64(tls_header.index_address, tls_header.index_address+sizeof(U32)); + + // rjf: grab data about debug info + if(data_dir_count > PE_DataDirectoryIndex_DEBUG) + { + // rjf: read data dir + PE_DataDirectory dir = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); - // rjf: extract external file info from codeview header - if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) + U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); + for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) { - U32 cv_magic = 0; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv_magic); - switch(cv_magic) + // rjf: read debug directory + U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); + PE_DebugDirectory dbg_data = {0}; + dmn_process_read_struct(process.dmn_handle, dir_addr, &dbg_data); + + // rjf: extract external file info from codeview header + if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) { - default:break; - case PE_CODEVIEW_PDB20_MAGIC: + U32 cv_magic = 0; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv_magic); + switch(cv_magic) { - PE_CvHeaderPDB20 cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min+dbg_data.voff, &cv); - if(read_size == sizeof(cv)) + default:break; + case PE_CODEVIEW_PDB20_MAGIC: { - pdb_dbg_time = cv.time_stamp; - pdb_dbg_age = cv.age; - pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); - } - }break; - case PE_CODEVIEW_PDB70_MAGIC: - { - PE_CvHeaderPDB70 cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); - if(read_size == sizeof(cv)) + PE_CvHeaderPDB20 cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min+dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + pdb_dbg_time = cv.time_stamp; + pdb_dbg_age = cv.age; + pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + case PE_CODEVIEW_PDB70_MAGIC: { - pdb_dbg_guid = cv.guid; - pdb_dbg_age = cv.age; - pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); - } - }break; - case PE_CODEVIEW_RDI_MAGIC: - { - PE_CvHeaderRDI cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); - if(read_size == sizeof(cv)) + PE_CvHeaderPDB70 cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + pdb_dbg_guid = cv.guid; + pdb_dbg_age = cv.age; + pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + case PE_CODEVIEW_RDI_MAGIC: { - rdi_dbg_guid = cv.guid; - rdi_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); - } - }break; + PE_CvHeaderRDI cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + rdi_dbg_guid = cv.guid; + rdi_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + } } } } - } - - // rjf: look for DWARF debug info - { - U64 symbol_array_off = file_header.symbol_table_foff; - U64 symbol_count = file_header.symbol_count; - if(symbol_array_off != 0) + + // rjf: look for DWARF debug info { - exe_dbg_path = path; + U64 symbol_array_off = file_header.symbol_table_foff; + U64 symbol_count = file_header.symbol_count; + if(symbol_array_off != 0) + { + exe_dbg_path = path; + } + } + + // rjf: extract copy of module's raddbg data + { + for EachIndex(idx, sec_count) + { + String8 section_name = str8_cstring((char *)sec[idx].name); + if(str8_match(section_name, str8_lit(".raddbg"), 0)) + { + raddbg_section_voff_range.min = sec[idx].voff; + raddbg_section_voff_range.max = sec[idx].voff + sec[idx].vsize; + } + else if(str8_match(section_name, str8_lit(".rdbgia"), 0)) + { + raddbg_is_attached_section_voff_range.min = sec[idx].voff; + raddbg_is_attached_section_voff_range.max = sec[idx].voff + sec[idx].vsize; + } + } + raddbg_data.size = dim_1u64(raddbg_section_voff_range); + raddbg_data.str = push_array(arena, U8, raddbg_data.size); + dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + raddbg_section_voff_range.min, + vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); + } + + // rjf: if we have a "raddbg is attached" section, mark the first byte as 1, to signify attachment + if(raddbg_is_attached_section_voff_range.max != raddbg_is_attached_section_voff_range.min) + { + U8 new_value = 1; + dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); } } + } + } + ////////////////////////////// + //- parse ELF module + // + else if(str8_match(str8(module_sig_bytes, elf_magic_string.size), elf_magic_string, 0)) + { + U64 e_entry = 0; + ELF_Type e_type = ELF_Type_None; + { + U8 *elf_sig = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max)); + if(elf_sig == 0) { goto elf_exit; } + switch(elf_sig[ELF_Identifier_Class]) + { + default: + case ELF_Class_None:{}break; + case ELF_Class_32: + { + NotImplemented; + }break; + case ELF_Class_64: + { + ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr))); + if(ehdr == 0) { goto elf_exit; } + e_entry = ehdr->e_entry; + e_type = ehdr->e_type; + }break; + } + } - // rjf: extract copy of module's raddbg data - { - for EachIndex(idx, sec_count) - { - String8 section_name = str8_cstring((char *)sec[idx].name); - if(str8_match(section_name, str8_lit(".raddbg"), 0)) - { - raddbg_section_voff_range.min = sec[idx].voff; - raddbg_section_voff_range.max = sec[idx].voff + sec[idx].vsize; - } - else if(str8_match(section_name, str8_lit(".rdbgia"), 0)) - { - raddbg_is_attached_section_voff_range.min = sec[idx].voff; - raddbg_is_attached_section_voff_range.max = sec[idx].voff + sec[idx].vsize; - } - } - raddbg_data.size = dim_1u64(raddbg_section_voff_range); - raddbg_data.str = push_array(arena, U8, raddbg_data.size); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + raddbg_section_voff_range.min, - vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); - } - - // rjf: if we have a "raddbg is attached" section, mark the first byte as 1, to signify attachment - if(raddbg_is_attached_section_voff_range.max != raddbg_is_attached_section_voff_range.min) - { - U8 new_value = 1; - dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); - } + // find and parse .eh_frame_hdr + Rng1U64 eh_frame_hdr_vrange = {0}; + String8 eh_frame_hdr_data = {0}; + { + void *phdrs_raw = dmn_process_read_raw(scratch.arena, process.dmn_handle, elf_phdr_vrange); + if(phdrs_raw == 0) { goto elf_exit; } -#if 0 - // TODO(ns): temporary hack to test DWARF unwinder on windows -- remove when done + if(elf_phdr_entsize == sizeof(ELF_Phdr32)) { - for EachIndex(idx, sec_count) + NotImplemented; + } + else if(elf_phdr_entsize == sizeof(ELF_Phdr64)) + { + U64 elf_phcount = dim_1u64(elf_phdr_vrange) / elf_phdr_entsize; + ELF_Phdr64 *phdrs64 = phdrs_raw; + for EachIndex(phdr_idx, elf_phcount) { - String8 section_name = str8_cstring((char *)sec[idx].name); - if(str8_match(section_name, str8_lit("/130"), 0)) + ELF_Phdr64 *phdr = phdrs64 + phdr_idx; + if(phdr->p_type == ELF_PType_GnuEHFrame) { - U64 restore_pos = arena_pos(arena); - Rng1U64 debug_frame_voff_range = rng_1u64(sec[idx].voff, sec[idx].voff + sec[idx].vsize); - Rng1U64 debug_frame_vaddr_range = shift_1u64(debug_frame_voff_range, vaddr_range.min); - void *debug_frame_buffer = push_array(arena, U8, sec[idx].vsize); - U64 debug_frame_read_size = dmn_process_read(process.dmn_handle, debug_frame_vaddr_range, debug_frame_buffer); - if(debug_frame_read_size == sec[idx].vsize) - { - U64 default_base = pe_get_default_base_addr(file_characteristics, machine); - Arch arch = ctrl_arch_from_process_handle(process); - String8 debug_frame = str8(debug_frame_buffer, debug_frame_read_size); - DW_CallFrameInfo dwarf_cfi = dw_call_frame_info_from_data(scratch.arena, arch, debug_frame); - String8 eh_frame_hdr_data = eh_frame_hdr_from_call_frame_info(arena, dwarf_cfi.fde_count, dwarf_cfi.fde_offsets, dwarf_cfi.fde); - rebase = default_base - vaddr_range.min; // DL overwrites image base in the optional header, if image is linked with a custom base this breaks - dwarf_unwind_data = debug_frame; - is_dwarf_unwind_data_eh = 0; - eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), 0); - } - else - { - arena_pop_to(arena, restore_pos); - } + eh_frame_hdr_vrange = r1u64(phdr->p_vaddr, phdr->p_vaddr + phdr->p_memsz); + eh_frame_hdr_data = dmn_process_read_block(arena, process.dmn_handle, eh_frame_hdr_vrange); + is_unwind_eh = 1; break; } } } -#endif - - scratch_end(scratch); } + + // parse .eh_frame_hdr + Arch arch = ctrl_arch_from_process_handle(process); + eh_ptr_ctx.raw_base_vaddr = eh_frame_hdr_vrange.min; + eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min; + eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx); + + // set entry point + if (e_entry != 0) + { + entry_point_voff = e_entry - vaddr_range.min; + } + + // TODO: is there a way to detect DWARF in runtime ELF? + if(1) + { + exe_dbg_path = path; + } + + if(e_type == ELF_Type_Dyn) + { + rebase = -vaddr_range.min; + } + + elf_exit:; } ////////////////////////////// @@ -3947,7 +4078,6 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ // String8 initial_debug_info_path = str8_zero(); { - Temp scratch = scratch_begin(0, 0); String8 exe_folder = str8_chop_last_slash(path); String8List dbg_path_candidates = {0}; // @@ -3988,22 +4118,21 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ break; } } - scratch_end(scratch); } ////////////////////////////// //- rjf: insert info into cache // { - U64 hash = ctrl_hash_from_handle(module); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 hash = ctrl_hash_from_handle(module); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeW(stripe->rw_mutex) { CTRL_ModuleImageInfoCacheNode *node = 0; - for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) { if(ctrl_handle_match(n->module, module)) { @@ -4015,20 +4144,21 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ { node = push_array(arena, CTRL_ModuleImageInfoCacheNode, 1); DLLPushBack(slot->first, slot->last, node); - node->module = module; - node->arena = arena; - node->pdatas = pdatas; - node->pdatas_count = pdatas_count; - node->rebase = rebase; - node->is_dwarf_unwind_data_eh = is_dwarf_unwind_data_eh; - node->dwarf_unwind_data = dwarf_unwind_data; - node->eh_frame_hdr = eh_frame_hdr; - node->eh_ptr_ctx = eh_ptr_ctx; - node->entry_point_voff = entry_point_voff; + node->module = module; + node->arena = arena; + node->pdatas = pdatas; + node->pdatas_count = pdatas_count; + node->rebase = rebase; + node->is_unwind_eh = is_unwind_eh; + node->eh_frame_hdr = eh_frame_hdr; + node->eh_ptr_ctx = eh_ptr_ctx; + node->entry_point_voff = entry_point_voff; node->initial_debug_info_path = initial_debug_info_path; } } } + + scratch_end(scratch); } internal void @@ -4362,7 +4492,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, CTRL_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts); String8 module_path = path_normalized_from_string(scratch.arena, event->string); U64 exe_timestamp = os_properties_from_file_path(module_path).modified; - ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path); + ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize); out_evt1->kind = CTRL_EventKind_NewModule; out_evt1->msg_id = msg->msg_id; out_evt1->entity = module_handle; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 0505ab7f..2a24ad07 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -598,7 +598,7 @@ struct CTRL_ModuleImageInfoCacheNode PE_IntelPdata *pdatas; U64 pdatas_count; U64 rebase; - B32 is_dwarf_unwind_data_eh; + B32 is_unwind_eh; String8 dwarf_unwind_data; EH_FrameHdr eh_frame_hdr; EH_PtrCtx eh_ptr_ctx; @@ -987,7 +987,7 @@ internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, C internal void ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out); //- rjf: module lifetime open/close work -internal void ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path); +internal void ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); internal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range); //- rjf: attached process running/event gathering diff --git a/src/pe/pe.h b/src/pe/pe.h index 74dce633..bb4386b0 100644 --- a/src/pe/pe.h +++ b/src/pe/pe.h @@ -486,6 +486,7 @@ struct PE_LoadConfig64 #define PE_MAGIC 0x00004550u #define PE_PE32_MAGIC 0x010bu #define PE_PE32PLUS_MAGIC 0x020bu +typedef U16 PE_DosMagic; typedef struct PE_MipsPdata PE_MipsPdata; struct PE_MipsPdata From 78f2e641bc7c1013f9e5b43b15bda8c7fede8b71 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Oct 2025 17:57:59 -0700 Subject: [PATCH 022/850] fix program header rebase issue in non-PIE exes, and export program header info through DEMON event --- src/demon/demon_core.c | 26 ++++++++++++++++++++++++++ src/demon/demon_core.h | 4 ++++ src/demon/linux/demon_core_linux.c | 30 +++++++++++++++++++----------- src/demon/linux/demon_core_linux.h | 8 ++++++++ 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 75cca59e..bba2dc69 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -180,3 +180,29 @@ dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr) scratch_end(scratch); return result; } + +internal String8 +dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange) +{ + String8 block = {0}; + void *raw = dmn_process_read_raw(arena, process, vrange); + if(raw) + { + block = str8(raw, dim_1u64(vrange)); + } + return block; +} + +internal void * +dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange) +{ + Temp temp = temp_begin(arena); + void *buffer = push_array(arena, U8, dim_1u64(vrange)); + U64 read_size = dmn_process_read(process, vrange, buffer); + if(read_size != dim_1u64(vrange)) + { + buffer = 0; + temp_end(temp); + } + return buffer; +} diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index b46f316b..e158e8ab 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -76,6 +76,8 @@ struct DMN_Event U32 flags; // DMN_TrapFlags, if `DMN_EventKind_SetBreakpoint` S32 signo; S32 sigcode; + Rng1U64 elf_phdr_vrange; + U64 elf_phdr_entsize; U64 instruction_pointer; U64 stack_pointer; U64 user_data; @@ -195,6 +197,8 @@ internal U64 dmn_rsp_from_thread(DMN_Handle thread); //~ rjf: Process Reading Helper Functions (Helpers, Implemented Once) internal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr); +internal String8 dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange); +internal void * dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange); //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 8f613189..da822d95 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -367,8 +367,11 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process) DMN_LNX_ModuleInfoNode *n = push_array(arena, DMN_LNX_ModuleInfoNode, 1); SLLQueuePush(list.first, list.last, n); list.count += 1; - n->v.vaddr_range = shift_1u64(phdr_info.range, base_vaddr); - n->v.name = aux.execfn; + n->v.vaddr_range = r1u64(base_vaddr, base_vaddr + dim_1u64(phdr_info.range)); + n->v.name = aux.execfn; + n->v.phvaddr = aux.phdr; + n->v.phentsize = aux.phent; + n->v.phcount = aux.phnum; } //- rjf: iterate link maps @@ -426,7 +429,10 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process) SLLQueuePush(list.first, list.last, n); list.count += 1; n->v.vaddr_range = r1u64(linkmap.base, linkmap.base + dim_1u64(module_phdr_info.range)); - n->v.name = linkmap.name; + n->v.name = linkmap.name; + n->v.phvaddr = phvaddr; + n->v.phentsize = phentsize; + n->v.phcount = phcount; } // rjf: iterate @@ -1108,14 +1114,16 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) module->id = n->v.name; { DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(main_thread); - e->module = dmn_lnx_handle_from_entity(module); - e->arch = process->arch; - e->address = n->v.vaddr_range.min; - e->size = dim_1u64(n->v.vaddr_range); - e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(main_thread); + e->module = dmn_lnx_handle_from_entity(module); + e->arch = process->arch; + e->address = n->v.vaddr_range.min; + e->size = dim_1u64(n->v.vaddr_range); + e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name); + e->elf_phdr_vrange = r1u64(n->v.phvaddr, n->v.phvaddr + n->v.phentsize * n->v.phcount); + e->elf_phdr_entsize = n->v.phentsize; } } diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 297fdb3a..8fd38499 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -216,6 +216,9 @@ struct DMN_LNX_ModuleInfo { Rng1U64 vaddr_range; U64 name; + U64 phvaddr; + U64 phentsize; + U64 phcount; }; typedef struct DMN_LNX_ModuleInfoNode DMN_LNX_ModuleInfoNode; @@ -261,6 +264,9 @@ struct DMN_LNX_Entity U64 id; int fd; B32 expecting_dummy_sigstop; + U64 phvaddr; + U64 phentsize; + U64 phcount; }; typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode; @@ -311,6 +317,8 @@ internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); #define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) #define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr); +internal void * dmn_lnx_read_raw(Arena *arena, int memory_fd, Rng1U64 vrange); +internal String8 dmn_lnx_read_block(Arena *arena, int memory_fd, Rng1U64 vrange); //- rjf: pid => info extraction internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); From 36b22c06b12f8f61d494b4d82800105ad05c9542 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 17 Oct 2025 11:30:57 -0700 Subject: [PATCH 023/850] moved eh_frame files to dwarf layer --- src/dwarf/eh_dump.c | 141 +++++++++++++ src/dwarf/eh_dump.h | 48 +++++ src/dwarf/eh_frame.c | 463 +++++++++++++++++++++++++++++++++++++++++++ src/dwarf/eh_frame.h | 124 ++++++++++++ 4 files changed, 776 insertions(+) create mode 100644 src/dwarf/eh_dump.c create mode 100644 src/dwarf/eh_dump.h create mode 100644 src/dwarf/eh_frame.c create mode 100644 src/dwarf/eh_frame.h diff --git a/src/dwarf/eh_dump.c b/src/dwarf/eh_dump.c new file mode 100644 index 00000000..591a35cb --- /dev/null +++ b/src/dwarf/eh_dump.c @@ -0,0 +1,141 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal String8List +eh_dump_list_from_data(Arena *arena, Arch arch, U64 eh_frame_hdr_vaddr, U64 eh_frame_vaddr, String8 eh_frame_hdr, String8 eh_frame, EH_DumpSubsetFlags subset_flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strings = {0}; +#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__) + + EH_PtrCtx ptr_ctx = { .data_vaddr = eh_frame_hdr_vaddr }; + EH_FrameHdr hdr = eh_parse_frame_hdr(eh_frame_hdr, byte_size_from_arch(arch), &ptr_ctx); + DW_Ext ext = DW_Ext_All; + + if (subset_flags & EH_DumpSubsetFlag_EhFrameHdr) { + dumpf("eh_frame_hdr:\n"); + dumpf("{\n"); + dumpf(" version: %u\n", hdr.version); + dumpf(" eh_frame_ptr_enc: %S\n", eh_string_from_ptr_enc(scratch.arena, hdr.eh_frame_ptr_enc)); + dumpf(" table_enc: %S\n", eh_string_from_ptr_enc(scratch.arena, hdr.table_enc)); + dumpf(" fde_count: %llu\n", hdr.fde_count); + if (hdr.eh_frame_ptr_enc != EH_PtrEnc_Omit) { + dumpf(" eh_frame_ptr: 0x%I64x\n", hdr.eh_frame_ptr); + } + + dumpf(" Entries:\n"); + dumpf(" {\n"); + for (U64 cursor = 0; cursor < hdr.table.size; ) { + U64 entry_off = cursor; + + U64 pc = 0; + U64 pc_size = eh_parse_ptr(hdr.table, cursor, cursor, &ptr_ctx, hdr.table_enc, &pc); + if (pc_size == 0) { break; } + cursor += pc_size; + + U64 fde_addr = 0; + U64 fde_addr_size = eh_parse_ptr(hdr.table, cursor, cursor, &ptr_ctx, hdr.table_enc, &fde_addr); + if (fde_addr_size == 0) { break; } + cursor += fde_addr_size; + + U64 fde_offset = fde_addr - eh_frame_vaddr; + dumpf(" { off=0x%04I64x, pc=0x%I64x, fde=0x%I64x }\n", entry_off, pc, fde_offset); + } + dumpf(" }\n"); + + dumpf("}\n"); + + } + + if (subset_flags & EH_DumpSubsetFlag_EhFrame) { + dumpf(".eh_frame:\n"); + dumpf("{\n"); + for (U64 cursor = 0; cursor < eh_frame.size; ) { + DW_DescriptorEntry desc = {0}; + U64 desc_size = eh_parse_descriptor_entry_header(eh_frame, cursor, &desc); + if (desc_size == 0) { break; } + + switch (desc.type) { + case DW_DescriptorEntryType_Null: break; + case DW_DescriptorEntryType_CIE: { + String8 cie_data = str8_substr(eh_frame, desc.entry_range); + DW_CIE cie = {0}; + if (eh_parse_cie(cie_data, desc.format, arch, eh_frame_vaddr + cursor, &ptr_ctx, &cie)) { + String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, ext, cie.format, 0, &cie, eh_decode_ptr, &ptr_ctx, cie.insts); + dumpf(" CIE: // entry range: %r\n", desc.entry_range); + dumpf(" {\n"); + dumpf(" Format: %S\n", dw_string_from_format(desc.format)); + dumpf(" Version: %u\n", cie.version); + dumpf(" Aug string: \"%S\"\n", cie.aug_string); + dumpf(" Code align: %I64u\n", cie.code_align_factor); + dumpf(" Data align: %I64d\n", cie.data_align_factor); + dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); + if (cie.version > DW_Version_3) { + dumpf(" Address size: %u\n", cie.address_size); + dumpf(" Segment selector size: %u\n", cie.segment_selector_size); + } + dumpf(" Initial Insturction:\n"); + dumpf(" {\n"); + for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(" %S\n", n->string); } + dumpf(" }\n"); + dumpf(" }\n"); + } else { + dumpf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); + } + } break; + case DW_DescriptorEntryType_FDE: { + U64 cie_offset = desc.cie_pointer_off - desc.cie_pointer; + + DW_CIE cie = {0}; + { + DW_DescriptorEntry cie_desc = {0}; + eh_parse_descriptor_entry_header(eh_frame, cie_offset, &cie_desc); + if (cie_desc.type == DW_DescriptorEntryType_CIE) { + String8 cie_data = str8_substr(eh_frame, cie_desc.entry_range); + eh_parse_cie(cie_data, cie_desc.format, arch, eh_frame_vaddr + cie_offset, &ptr_ctx, &cie); + } + } + + String8 fde_raw = str8_substr(eh_frame, desc.entry_range); + DW_FDE fde = {0}; + if (eh_parse_fde(fde_raw, desc.format, eh_frame_vaddr + cursor, &cie, &ptr_ctx, &fde)) { + String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, hdr.version, ext, fde.format, 0, &cie, eh_decode_ptr, &ptr_ctx, fde.insts); + + dumpf(" FDE: // entry range: %r\n", desc.entry_range); + dumpf(" {\n"); + { + dumpf(" Format: %S\n", dw_string_from_format(fde.format)); + dumpf(" CIE: 0x%I64x\n", cie_offset); + dumpf(" PC range: %r\n", fde.pc_range); + dumpf(" Instructions:\n"); + dumpf(" {\n"); + for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } + dumpf(" }\n"); + + dumpf(" Unwind:\n"); + dumpf(" {\n"); + DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, eh_decode_ptr, &ptr_ctx); + do { + String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, hdr.version, ext, fde.format, cfi_unwind->row->cfa); + String8 cfi_row_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, hdr.version, ext, fde.format, cfi_unwind->row); + dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_row_str); + } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); + dumpf(" }\n"); + } + } else { + dumpf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); + } + dumpf(" }\n"); + } break; + } + + cursor += desc_size; + } + dumpf("}\n"); + } + +#undef dumpf + scratch_end(scratch); + return strings; +} + diff --git a/src/dwarf/eh_dump.h b/src/dwarf/eh_dump.h new file mode 100644 index 00000000..8ba5a6cb --- /dev/null +++ b/src/dwarf/eh_dump.h @@ -0,0 +1,48 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EH_FRAME_DUMP_H +#define EH_FRAME_DUMP_H + +//////////////////////////////// +//~ Dump Subset Types + +#define EH_DumpSubset_XList \ + X(EhFrameHdr, eh_frame_hdr, ".eh_frame_hdr") \ + X(EhFrame, eh_frame, ".eh_frame") + +typedef enum EH_DumpSubset { +#define X(name, name_lower, title) EH_DumpSubset_##name, + EH_DumpSubset_XList +#undef X +} EH_DumpSubset; + +typedef U32 EH_DumpSubsetFlags; +enum { +#define X(name, name_lower, title) EH_DumpSubsetFlag_##name = (1<ptr_align); + encoding = EH_PtrEnc_Ptr; + } + + // decode pointer value + U64 decode_size = 0; + U64 raw_ptr_size = 0; + U64 raw_ptr = 0; + switch (encoding & EH_PtrEnc_TypeMask) { + default: { InvalidPath; } break; + + case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; + case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; + case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; + case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; + ufixed: { + decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); + } break; + + // TODO: Signed is actually just a flag that indicates this int is negavite. + // There shouldn't be a read for Signed. + // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. + case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; + + case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; + case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; + case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; + sfixed: { + decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); + raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); + } break; + + case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; + case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; + } + + // apply relative bases + if (decode_size > 0) { + U64 ptr = raw_ptr; + switch (encoding & EH_PtrEnc_ModifierMask) { + case 0: break; + case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; + case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; + case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; + case EH_PtrEnc_FuncRel: { + Assert(!"TODO: need a sample to verify implementation"); + ptr = ptr_ctx->func_vaddr + raw_ptr; + } break; + default: { InvalidPath; } break; + } + + if (ptr_out) { + *ptr_out = ptr; + } + } + + return decode_size; +} + +internal EH_FrameHdr +eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) +{ + EH_FrameHdr header = {0}; + U64 cursor = 0; + + U64 version_size = str8_deserial_read_struct(data, cursor, &header.version); + if (version_size == 0) { goto exit; } + cursor += version_size; + + if (header.version == 1) { + U64 eh_frame_ptr_enc_size = str8_deserial_read_struct(data, cursor, &header.eh_frame_ptr_enc); + if (eh_frame_ptr_enc_size == 0) { goto exit; } + cursor += eh_frame_ptr_enc_size; + + U64 fde_count_enc_size = str8_deserial_read_struct(data, cursor, &header.fde_count_enc); + if (fde_count_enc_size == 0) { goto exit; } + cursor += fde_count_enc_size; + + U64 table_enc_size = str8_deserial_read_struct(data, cursor, &header.table_enc); + if (table_enc_size == 0) { goto exit; } + cursor += table_enc_size; + + cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.eh_frame_ptr_enc, &header.eh_frame_ptr); + cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.fde_count_enc, &header.fde_count); + + switch (header.table_enc & EH_PtrEnc_TypeMask) { + case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; + case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; + default: { InvalidPath; } break; + } + header.entry_byte_size = header.field_byte_size * 2; + + header.table = str8_skip(data, cursor); + AssertAlways(header.table.size == header.entry_byte_size * header.fde_count); + } else { + Assert(0 && "unknown version"); + } + +exit:; + return header; +} + +internal U64 +eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out) +{ + // TODO: + // Handle "eh" param, it indicates presence of EH Data field. + // On 32bit arch it is a 4-byte and on 64-bit 8-byte value. + // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html + // Reference doc doesn't clarify structure for EH Data though + + U64 cursor = 0; + + EH_AugFlags aug_flags = 0; + EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; + EH_PtrEnc addr_encoding = EH_PtrEnc_UData8; + EH_PtrEnc handler_encoding = EH_PtrEnc_Omit; + U64 handler_ip = 0; + if (str8_match(str8_prefix(aug_string, 1), str8_lit("z"), 0)) { + U64 aug_data_size = 0; + cursor = str8_deserial_read_uleb128(aug_data, cursor, &aug_data_size); + + for (U8 *ptr = aug_string.str+1; ptr < (aug_string.str+aug_string.size); ptr += 1) { + switch (*ptr) { + case 'L': { + cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding); + aug_flags |= EH_AugFlag_HasLSDA; + } break; + case 'P': { + cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding); + cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip); + aug_flags |= EH_AugFlag_HasHandler; + } break; + case 'R': { + cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); + aug_flags |= EH_AugFlag_HasAddrEnc; + } break; + default: { Assert(!"failed to parse augmentation string"); goto exit; } break; + } + } + } + + if (aug_out) { + aug_out->handler_ip = handler_ip; + aug_out->handler_encoding = handler_encoding; + aug_out->lsda_encoding = handler_encoding; + aug_out->addr_encoding = addr_encoding; + aug_out->flags = aug_flags; + } + +exit:; + U64 parse_size = cursor; + return parse_size; +} + +internal U64 +eh_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out) +{ + U32 first_four_bytes = 0; + str8_deserial_read_struct(data, off, &first_four_bytes); + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + + U64 length = 0; + U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); + if (length_size == 0) { goto exit; } + + Rng1U64 entry_range = rng_1u64(off, off + length_size + length); + String8 entry_data = str8_substr(data, entry_range); + U64 id = 0; + U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); + if (id_size == 0) { goto exit; } + + desc_out->format = format; + desc_out->type = (id == 0) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; + desc_out->entry_range = entry_range; + desc_out->cie_pointer = id; + desc_out->cie_pointer_off = off + length_size; + +exit:; + return length + length_size; +} + +internal B32 +eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out) +{ + B32 is_parsed = 0; + U64 cursor = format == DW_Format_32Bit ? 4 : 12; + + U64 cie_id = 0; + U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); + if (cie_id_size == 0) { goto exit; } + cursor += cie_id_size; + + U8 version = 0; + U64 version_size = str8_deserial_read_struct(data, cursor, &version); + if (version_size == 0) { goto exit; } + cursor += version_size; + + String8 aug_string = {0}; + EH_Augmentation aug = {0}; + U64 code_align_factor = 0; + S64 data_align_factor = 0; + U64 ret_addr_reg = max_U64; + if (version == 1) { + U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); + if (aug_string_size == 0) { goto exit; } + cursor += aug_string_size; + + U64 eh_data = 0; + if (str8_match(aug_string, str8_lit("eh"), 0)) { + U64 arch_byte_size = byte_size_from_arch(arch); + cursor += str8_deserial_read(data, cursor, &eh_data, arch_byte_size, arch_byte_size); + } + + U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); + if (code_align_factor_size == 0) { goto exit; } + cursor += code_align_factor_size; + + U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); + if (data_align_factor_size == 0) { goto exit; } + cursor += data_align_factor_size; + + ret_addr_reg = 0; + U64 ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); + if (ret_addr_reg_size == 0) { goto exit; } + cursor += ret_addr_reg_size; + + U64 aug_data_size = eh_parse_aug_data(aug_string, str8_skip(data, cursor), pc + cursor, ptr_ctx, &aug); + cursor += aug_data_size; + } + + cie_out->insts = str8_skip(data, cursor); + cie_out->aug_string = aug_string; + cie_out->code_align_factor = code_align_factor; + cie_out->data_align_factor = data_align_factor; + cie_out->ret_addr_reg = ret_addr_reg; + cie_out->format = format; + cie_out->version = version; + cie_out->address_size = byte_size_from_arch(arch); + cie_out->segment_selector_size = 0; + + cie_out->ext[EH_CIE_Ext_LSDAEnc] = EH_PtrEnc_Omit; + cie_out->ext[EH_CIE_Ext_AddrEnc] = EH_PtrEnc_Omit; + cie_out->ext[EH_CIE_Ext_HandlerEnc] = EH_PtrEnc_Omit; + + if (aug.flags & EH_AugFlag_HasLSDA) { + cie_out->ext[EH_CIE_Ext_LSDAEnc] = aug.lsda_encoding; + } + if (aug.flags & EH_AugFlag_HasAddrEnc) { + cie_out->ext[EH_CIE_Ext_AddrEnc] = aug.addr_encoding; + } + if (aug.flags & EH_AugFlag_HasHandler) { + cie_out->ext[EH_CIE_Ext_HandlerEnc] = aug.handler_encoding; + cie_out->ext[EH_CIE_Ext_HandlerIp ] = aug.handler_ip; + } + + is_parsed = 1; +exit:; + return is_parsed; +} + +internal B32 +eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out) +{ + B32 is_parsed = 0; + U64 cursor = format == DW_Format_32Bit ? 8 : 20; + + U64 pc_begin = 0; + U64 pc_delta = 0; + EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; + if (addr_enc != EH_PtrEnc_Omit) { + U64 pc_begin_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc, &pc_begin); + if (pc_begin_size == 0) { goto exit; } + cursor += pc_begin_size; + + U64 pc_delta_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc & EH_PtrEnc_TypeMask, &pc_delta); + if (pc_delta_size == 0) { goto exit; } + cursor += pc_delta_size; + } + + if (cursor + cie->aug_data.size > data.size) { goto exit; } + cursor += cie->aug_data.size; + + fde_out->format = format; + fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_delta); + fde_out->insts = str8_skip(data, cursor); + + is_parsed = 1; +exit:; + return is_parsed; +} + +internal U64 +eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) +{ + U64 fde_addr = max_U64; + U64 fde_idx = max_U64; + + if (header.version == 1) { + if (header.fde_count > 0) { + U64 first = 0; + U64 first_size = eh_parse_ptr(header.table, 0, ptr_ctx->pc_vaddr, ptr_ctx, header.table_enc, &first); + AssertAlways(first_size); + if (first == pc) { + fde_idx = 0; + goto exit; + } + if (first > pc) { + goto exit; + } + + U64 last_off = header.table.size - header.entry_byte_size; + U64 last = 0; + U64 last_size = eh_parse_ptr(header.table, last_off, ptr_ctx->pc_vaddr + last_off, ptr_ctx, header.table_enc, &last); + AssertAlways(last_size); + if (last <= pc) { + fde_idx = header.fde_count - 1; + goto exit; + } + + if (first <= pc && pc < last) { + U64 l = 0; + U64 r = header.fde_count - 1; + while (l <= r) { + U64 m = l + (r - l) / 2; + U64 m_pc_off = m * header.entry_byte_size; + U64 m_pc = 0; + U64 m_pc_size = eh_parse_ptr(header.table, m_pc_off, ptr_ctx->pc_vaddr + m_pc_off, ptr_ctx, header.table_enc, &m_pc); + Assert(m_pc_size); + + if (m_pc == pc) { + fde_idx = m; + goto exit; + } else if (m_pc < pc) { + l = m + 1; + } else { + r = m - 1; + } + } + fde_idx = l; + } + } + } + +exit:; + if (fde_idx < header.fde_count) { + U64 fde_addr_off = (fde_idx * header.entry_byte_size) + header.field_byte_size; + U64 fde_addr_size = eh_parse_ptr(header.table, fde_addr_off, ptr_ctx->pc_vaddr + fde_addr_off, ptr_ctx, header.table_enc, &fde_addr); + Assert(fde_addr_size); + } + return fde_addr; +} + +internal int +eh_frame_hdr_entry_sort(void *raw_a, void *raw_b) +{ + return ((EH_FrameHdrEntry *)raw_a)->addr < ((EH_FrameHdrEntry *)raw_b)->addr; +} + +internal String8 +eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, DW_FDE *fde) +{ + Temp scratch = scratch_begin(&arena, 1); + + // make .eh_frame_hdr + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + str8_serial_push_u8(scratch.arena, &srl, 1); // version + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_Omit); // omit eh_frame_ptr field + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // fde_count encoding + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // table encoding + str8_serial_push_u64(scratch.arena, &srl, fde_count); // fde_count + String8 header = str8_serial_end(scratch.arena, &srl); + + // alloc buffer for output + U64 buffer_size = header.size + sizeof(EH_FrameHdrEntry) * fde_count; + U8 *buffer = push_array(arena, U8, buffer_size); + + // copy header + MemoryCopyStr8(buffer, header); + + // write the table + EH_FrameHdrEntry *table = (EH_FrameHdrEntry *)(buffer + header.size); + for EachIndex(fde_idx, fde_count) { + table[fde_idx].addr = fde[fde_idx].pc_range.min; + table[fde_idx].fde_offset = fde_offsets[fde_idx]; + } + radsort(table, fde_count, eh_frame_hdr_entry_sort); + + String8 eh_frame_hdr = str8(buffer, buffer_size); + scratch_end(scratch); + return eh_frame_hdr; +} + +internal +DW_DECODE_PTR(eh_decode_ptr) +{ + EH_DecodePtrCtx *ctx = ud; + return eh_parse_ptr(data, 0, ctx->ptr_ctx->pc_vaddr, ctx->ptr_ctx, ctx->addr_enc, ptr_out); +} + +internal String8 +eh_string_from_ptr_enc_type(EH_PtrEnc type) +{ + switch (type) { + case EH_PtrEnc_Ptr: return str8_lit("Ptr"); + case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); + case EH_PtrEnc_UData2: return str8_lit("UData2"); + case EH_PtrEnc_UData4: return str8_lit("UData4"); + case EH_PtrEnc_UData8: return str8_lit("UData8"); + case EH_PtrEnc_Signed: return str8_lit("Signed"); + case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); + case EH_PtrEnc_SData2: return str8_lit("SData2"); + case EH_PtrEnc_SData4: return str8_lit("SData4"); + case EH_PtrEnc_SData8: return str8_lit("SData8"); + } + return str8_zero(); +} + +internal String8 +eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier) +{ + switch (modifier) { + case EH_PtrEnc_PcRel: return str8_lit("PcRel"); + case EH_PtrEnc_TextRel: return str8_lit("TextRel"); + case EH_PtrEnc_DataRel: return str8_lit("DataRel"); + case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); + case EH_PtrEnc_Aligned: return str8_lit("Aligned"); + } + return str8_zero(); +} + +internal String8 +eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc) +{ + String8 type_str = eh_string_from_ptr_enc_type(enc & EH_PtrEnc_TypeMask); + String8 modifer_str = eh_string_from_ptr_enc_modifier(enc & EH_PtrEnc_ModifierMask); + String8 indir_str = enc & EH_PtrEnc_Indirect ? str8_lit("Indirect") : str8_zero(); + String8 result = str8f(arena, "Type: %S, Modifier %S (%S)", type_str, modifer_str, indir_str); + return result; +} diff --git a/src/dwarf/eh_frame.h b/src/dwarf/eh_frame.h new file mode 100644 index 00000000..dbd14053 --- /dev/null +++ b/src/dwarf/eh_frame.h @@ -0,0 +1,124 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EH_FRAME_H +#define EH_FRAME_H + +//////////////////////////////// +//~ Format + +typedef U8 EH_PtrEnc; +enum +{ + EH_PtrEnc_Ptr = 0x00, // Pointer sized unsigned value + EH_PtrEnc_ULEB128 = 0x01, // Unsigned LE base-128 value + EH_PtrEnc_UData2 = 0x02, // Unsigned 16-bit value + EH_PtrEnc_UData4 = 0x03, // Unsigned 32-bit value + EH_PtrEnc_UData8 = 0x04, // Unsigned 64-bit value + EH_PtrEnc_Signed = 0x08, // Signed pointer + EH_PtrEnc_SLEB128 = 0x09, // Signed LE base-128 value + EH_PtrEnc_SData2 = 0x0A, // Signed 16-bit value + EH_PtrEnc_SData4 = 0x0B, // Signed 32-bit value + EH_PtrEnc_SData8 = 0x0C, // Signed 64-bit value + + EH_PtrEnc_TypeMask = 0x0F, +}; + +enum +{ + EH_PtrEnc_PcRel = 0x10, // Value is relative to the current program counter. + EH_PtrEnc_TextRel = 0x20, // Value is relative to the .text section. + EH_PtrEnc_DataRel = 0x30, // Value is relative to the .got or .eh_frame_hdr section. + EH_PtrEnc_FuncRel = 0x40, // Value is relative to the function. + EH_PtrEnc_Aligned = 0x50, // Value is aligned to an address unit sized boundary. + + EH_PtrEnc_ModifierMask = 0x70, +}; + +enum +{ + EH_PtrEnc_Indirect = 0x80, // Value is stored in virtual memory. + EH_PtrEnc_Omit = 0xFF, +}; + +typedef struct EH_PtrCtx +{ + U64 pc_vaddr; // address where pointer is being read + U64 text_vaddr; // base address of section with instructions (used for encoding pointer on SH and IA64) + U64 data_vaddr; // base address of data section (used for encoding pointer on x86-64) + U64 func_vaddr; // base address of function where IP is located + U64 ptr_align; +} EH_PtrCtx; + +typedef U8 EH_AugFlags; +enum +{ + EH_AugFlag_HasLSDA = (1 << 0), + EH_AugFlag_HasHandler = (1 << 1), + EH_AugFlag_HasAddrEnc = (1 << 2), +}; + +typedef struct EH_Augmentation +{ + EH_AugFlags flags; + U64 handler_ip; + EH_PtrEnc handler_encoding; + EH_PtrEnc lsda_encoding; + EH_PtrEnc addr_encoding; +} EH_Augmentation; + +//////////////////////////////// +//~ Parser + +enum +{ + EH_CIE_Ext_AddrEnc, + EH_CIE_Ext_LSDAEnc, + EH_CIE_Ext_HandlerEnc, + EH_CIE_Ext_HandlerIp, +} EH_CIE_Ext; + +typedef struct EH_FrameHdrEntry +{ + U64 addr; + U64 fde_offset; +} EH_FrameHdrEntry; + +typedef struct EH_FrameHdr +{ + U8 version; + EH_PtrEnc eh_frame_ptr_enc; + EH_PtrEnc fde_count_enc; + EH_PtrEnc table_enc; + U64 field_byte_size; + U64 entry_byte_size; + U64 fde_count; + U64 eh_frame_ptr; + String8 table; +} EH_FrameHdr; + +typedef struct EH_DecodePtrCtx +{ + EH_PtrEnc addr_enc; + EH_PtrCtx *ptr_ctx; +} EH_DecodePtrCtx; + +//////////////////////////////// + +internal U64 eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); +internal EH_FrameHdr eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx); +internal U64 eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out); +internal B32 eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out); +internal B32 eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out); +internal U64 eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc); +internal String8 eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, struct DW_FDE *fde); + +//////////////////////////////// +//~ Enum -> String + +internal String8 eh_string_from_ptr_enc_type(EH_PtrEnc type); +internal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier); +internal String8 eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc); + +#endif // EH_FRAME_H + From b091233a33e1a3126130b312f12af832ec99624c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 17 Oct 2025 13:33:29 -0700 Subject: [PATCH 024/850] infer path style from exe type --- src/rdi_from_dwarf/rdi_from_dwarf.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index f8a067f0..45f13d62 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2582,9 +2582,10 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //////////////////////////////// - Arch arch = Arch_Null; - U64 image_base = 0; - DW_Input input = {0}; + Arch arch = Arch_Null; + U64 image_base = 0; + DW_Input input = {0}; + PathStyle path_style = PathStyle_Null; switch(params->exe_kind) { default:{}break; @@ -2597,6 +2598,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) image_base = pe.image_base; binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); + path_style = PathStyle_WindowsAbsolute; } break; case ExecutableImageKind_Elf32: case ExecutableImageKind_Elf64: { @@ -2605,6 +2607,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) image_base = elf_base_addr_from_bin(&bin); binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); + path_style = PathStyle_UnixAbsolute; } break; } @@ -2677,8 +2680,8 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW_LineFile *file = &file_table->v[file_idx]; String8 file_path = dw_path_from_file_idx(scratch.arena, &line_table->vm_header, file_idx); String8List file_path_split = str8_split_path(scratch.arena, file_path); - str8_path_list_resolve_dots_in_place(&file_path_split, PathStyle_WindowsAbsolute); - String8 file_path_resolved = str8_path_list_join_by_style(scratch.arena, &file_path_split, PathStyle_WindowsAbsolute); + str8_path_list_resolve_dots_in_place(&file_path_split, path_style); + String8 file_path_resolved = str8_path_list_join_by_style(scratch.arena, &file_path_split, path_style); RDIM_SrcFile *src_file = hash_table_search_path_raw(source_file_ht, file_path_resolved); if (src_file == 0) { src_file = rdim_src_file_chunk_list_push(arena, &src_files, SRC_FILE_CAP); From f0bd30c89b30cb89597b5bf2bb4630ae916b254f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 13:44:39 -0700 Subject: [PATCH 025/850] layer for interfacing with GNU --- src/gnu/gnu.c | 53 ++++++++++++++++++++++++++++++++++++ src/gnu/gnu.h | 58 ++++++++++++++++++++++++++++++++++++++++ src/raddbg/raddbg_main.c | 2 ++ 3 files changed, 113 insertions(+) create mode 100644 src/gnu/gnu.c create mode 100644 src/gnu/gnu.h diff --git a/src/gnu/gnu.c b/src/gnu/gnu.c new file mode 100644 index 00000000..c56091f9 --- /dev/null +++ b/src/gnu/gnu.c @@ -0,0 +1,53 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal GNU_LinkMap64 +gnu_linkmap64_from_linkmap32(GNU_LinkMap32 linkmap32) +{ + GNU_LinkMap64 linkmap64 = {0}; + linkmap64.addr_vaddr = linkmap32.addr_vaddr; + linkmap64.name_vaddr = linkmap32.name_vaddr; + linkmap64.ld_vaddr = linkmap32.ld_vaddr; + linkmap64.next_vaddr = linkmap32.next_vaddr; + linkmap64.prev_vaddr = linkmap32.prev_vaddr; + return linkmap64; +} + +internal U64 +gnu_rdebug_info_size_from_arch(Arch arch) +{ + U64 size = 0; + switch (byte_size_from_arch(arch)) { + case 0: break; + case 4: size = sizeof(GNU_RDebugInfo32); break; + case 8: size = sizeof(GNU_RDebugInfo64); break; + default: InvalidPath; break; + } + return size; +} + +internal U64 +gnu_r_brk_offset_from_arch(Arch arch) +{ + U64 offset = 0; + switch (gnu_rdebug_info_size_from_arch(arch)) { + case 0: offset = 0; break; + case sizeof(GNU_RDebugInfo32): offset = OffsetOf(GNU_RDebugInfo32, r_brk); break; + case sizeof(GNU_RDebugInfo64): offset = OffsetOf(GNU_RDebugInfo64, r_brk); break; + default: InvalidPath; break; + } + return offset; +} + +internal GNU_RDebugInfo64 +gnu_rdebug_info64_from_rdebug_info32(GNU_RDebugInfo32 rdebug32) +{ + GNU_RDebugInfo64 result = {0}; + result.r_version = rdebug32.r_version; + result.r_map = rdebug32.r_map; + result.r_brk = rdebug32.r_brk; + result.r_state = rdebug32.r_state; + result.r_ldbase = rdebug32.r_ldbase; + return result; +} + diff --git a/src/gnu/gnu.h b/src/gnu/gnu.h new file mode 100644 index 00000000..679f11c9 --- /dev/null +++ b/src/gnu/gnu.h @@ -0,0 +1,58 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef GNU_H +#define GNU_H + +typedef struct GNU_LinkMap64 +{ + U64 addr_vaddr; + U64 name_vaddr; + U64 ld_vaddr; // address of the dynamic section + U64 next_vaddr; + U64 prev_vaddr; +} GNU_LinkMap64; + +typedef struct GNU_LinkMap32 +{ + U32 addr_vaddr; + U32 name_vaddr; + U32 ld_vaddr; + U32 next_vaddr; + U32 prev_vaddr; +} GNU_LinkMap32; + +typedef U32 GNU_RT; +enum +{ + GNU_RT_Consistent = 0, + GNU_RT_Add = 1, + GNU_RT_Delete = 2, +}; + +// struct reflects r_debug from /usr/include/link.h +typedef struct GNU_RDebugInfo64 +{ + S32 r_version; // must be greater than 0 + U64 r_map; // address of first loaded object + U64 r_brk; // when module is loared/unloaded DL calls this function + GNU_RT r_state; + U64 r_ldbase; // base addres of dynamic linker +} GNU_RDebugInfo64; + +typedef struct GNU_RDebugInfo32 +{ + S32 r_version; + U32 r_map; + U32 r_brk; + GNU_RT r_state; + U32 r_ldbase; +} GNU_RDebugInfo32; + +//////////////////////////////// + +internal GNU_LinkMap64 elf_linkmap64_from_linkmap32(GNU_LinkMap32 linkmap32); +internal U64 gnu_rdebug_info_size_from_arch(Arch arch); +internal U64 gnu_r_brk_offset_from_arch(Arch arch); + +#endif // GNU_H diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 60693051..a83bd0b6 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -210,6 +210,7 @@ #include "pe/pe.h" #include "elf/elf.h" #include "elf/elf_parse.h" +#include "gnu/gnu.h" #include "codeview/codeview.h" #include "codeview/codeview_parse.h" #include "msf/msf.h" @@ -257,6 +258,7 @@ #include "pe/pe.c" #include "elf/elf.c" #include "elf/elf_parse.c" +#include "gnu/gnu.c" #include "codeview/codeview.c" #include "codeview/codeview_parse.c" #include "msf/msf.c" From 942c354bd93e816079f9d2dec2ca052a1c716ca1 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 13:45:12 -0700 Subject: [PATCH 026/850] fix eh_frame dumping --- src/radbin/radbin.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 8f09207d..b692d61d 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1108,6 +1108,23 @@ rb_thread_entry_point(void *p) { elf = elf_bin_from_data(arena, f->data); arch = arch_from_elf_machine(elf.hdr.e_machine); + + for EachIndex(sect_idx, elf.hdr.e_shnum) + { + ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; + String8 name = elf_name_from_shdr64(f->data, &elf, shdr); + if (str8_match(name, str8_lit(".eh_frame_hdr"), 0)) + { + eh_frame_hdr = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); + eh_frame_hdr_vaddr = shdr->sh_addr; + + } + else if(str8_match(name, str8_lit(".eh_frame"), 0)) + { + eh_frame = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); + eh_frame_vaddr = shdr->sh_addr; + } + } } if(f->format_flags & RB_FileFormatFlag_HasDWARF) { @@ -1123,22 +1140,6 @@ rb_thread_entry_point(void *p) f->format == RB_FileFormat_ELF64) { dw = dw_input_from_elf_bin(arena, f->data, &elf); - for EachIndex(sect_idx, elf.hdr.e_shnum) - { - ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; - String8 name = elf_name_from_shdr64(f->data, &elf, shdr); - if (str8_match(name, str8_lit(".eh_frame_hdr"), 0)) - { - eh_frame_hdr = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); - eh_frame_hdr_vaddr = shdr->sh_addr; - - } - else if(str8_match(name, str8_lit(".eh_frame"), 0)) - { - eh_frame = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); - eh_frame_vaddr = shdr->sh_addr; - } - } } } } From e6a01472c853459d39b1329550c9e52d39c91374 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 13:47:54 -0700 Subject: [PATCH 027/850] layer for x64 --- src/raddbg/raddbg_main.c | 2 + src/x64/x64.c | 184 ++++++++++++++++++++++++++++++ src/x64/x64.h | 234 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 420 insertions(+) create mode 100644 src/x64/x64.c create mode 100644 src/x64/x64.h diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index a83bd0b6..021be7f5 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -194,6 +194,7 @@ //- rjf: [h] #include "base/base_inc.h" +#include "x64/x64.h" #include "linker/hash_table.h" #include "os/os_inc.h" #include "artifact_cache/artifact_cache.h" @@ -242,6 +243,7 @@ //- rjf: [c] #include "base/base_inc.c" +#include "x64/x64.c" #include "linker/hash_table.c" #include "os/os_inc.c" #include "artifact_cache/artifact_cache.c" diff --git a/src/x64/x64.c b/src/x64/x64.c new file mode 100644 index 00000000..66ad5961 --- /dev/null +++ b/src/x64/x64.c @@ -0,0 +1,184 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +x64_cpuid(U32 leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx) +{ + U32 info[4] = {0}; +#if COMPILER_MSVC + __cpuid(info, leaf); + if (eax) { *eax = info[0]; } + if (ebx) { *ebx = info[1]; } + if (ecx) { *ecx = info[2]; } + if (edx) { *edx = info[3]; } +#elif COMPILER_CLANG || COMPILER_GCC + if (!eax) { eax = &info[0]; } + if (!ebx) { ebx = &info[1]; } + if (!ecx) { ecx = &info[2]; } + if (!edx) { edx = &info[3]; } + __get_cpuid(leaf, eax, ebx, ecx, edx); +#else +# error "cpuid is not defined for this compiler" +#endif +} + +internal void +x64_cpuid_ex(U32 leaf, U32 sub_leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx) +{ + U32 info[4]; +#if COMPILER_MSVC + __cpuidex(info, leaf, sub_leaf); + if (eax) { *eax = info[0]; } + if (ebx) { *ebx = info[1]; } + if (ecx) { *ecx = info[2]; } + if (edx) { *edx = info[3]; } +#elif COMPILER_CLANG || COMPILER_GCC + if (!eax) { eax = &info[0]; } + if (!ebx) { ebx = &info[1]; } + if (!ecx) { ecx = &info[2]; } + if (!edx) { edx = &info[3]; } + __get_cpuid_count(leaf, sub_leaf, eax, ebx, ecx, edx); +#else +# error "cpuid_count is not defined for this compiler" +#endif +} + +internal B32 +x64_is_xsave_supported(void) +{ + U32 ecx = 0; + x64_cpuid(1, 0, 0, &ecx, 0); + return !!(ecx & (1 << 26)); +} + +internal U32 +x64_get_xsave_size(void) +{ + U32 xsave_size = 0; + x64_cpuid_ex(0xd, 0, 0, &xsave_size, 0, 0); + return xsave_size; +} + +internal U16 +x64_xsave_tag_word_from_real_tag_word(U16 ftw) +{ + U16 compact = 0; + for EachIndex(fpr, 8) { + U32 tag = (ftw >> (fpr * 2)) & 3; + if (tag != 3) { + compact |= (1 << fpr); + } + } + return compact; +} + +internal U32 +x64_xsave_offset_from_feature_flag(U64 xcr0, X64_XStateComponentIdx comp_idx) +{ + U32 offset = 0; + if (xcr0 & (1 << comp_idx)) { + if(comp_idx == X64_XStateComponentIdx_FP) { + offset = 0; + } else if(comp_idx == X64_XStateComponentIdx_SSE) { + offset = 160; + } else { + x64_cpuid_ex(0xd, comp_idx, 0, &offset, 0, 0); + } + } + return offset; +} + +internal X64_XSaveLayout +x64_get_xsave_layout(U64 xcr0) +{ + X64_XSaveLayout xsave_layout = {0}; + xsave_layout.x87_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_FP); + xsave_layout.sse_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_SSE); + xsave_layout.avx_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_AVX); + xsave_layout.bndregs_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_BNDREGS); + xsave_layout.bndcfg_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_BNDCSR); + xsave_layout.opmask_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_OPMASK); + xsave_layout.zmm_h_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_ZMM_H); + xsave_layout.zmm_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_ZMM); + xsave_layout.pt_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_PT); + xsave_layout.pkru_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_PKRU); + xsave_layout.pasid_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_PASID); + xsave_layout.cet_u_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_CETU); + xsave_layout.cet_s_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_CETS); + xsave_layout.hdc_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_HDC); + xsave_layout.uintr_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_UINTR); + xsave_layout.lbr_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_LBR); + xsave_layout.hwp_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_HWP); + xsave_layout.tile_cfg_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_TILECFG); + xsave_layout.tile_data_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_TILEDATA); + return xsave_layout; +} + +internal void +x64_set_debug_break(U64 *drs, U64 trap_idx, U64 addr, U64 size, X64_BreakpointType bp_type, X64_DebugBreakType break_type) +{ + // set breakpoint address + switch (trap_idx) { + case 0: { drs[0] = addr; } break; + case 1: { drs[1] = addr; } break; + case 2: { drs[2] = addr; } break; + case 3: { drs[3] = addr; } break; + default: { InvalidPath; } break; + } + + // enable breakpoint + drs[7] &= ~(3 << (trap_idx * 2)); + switch (bp_type) + { + case X64_BreakpointType_Null: break; + case X64_BreakpointType_Local: { drs[7] |= 1 << (trap_idx * 2); } break; + case X64_BreakpointType_Global: { drs[7] |= 2 << (trap_idx * 2); } break; + default: { InvalidPath; } break; + } + + // set break access type + switch (break_type) { + case X64_DebugBreakType_Exec: + Assert(size == 0); + case X64_DebugBreakType_Null: { + drs[7] &= ~((1u << 16) << (trap_idx * 4)); + drs[7] &= ~((1u << 17) << (trap_idx * 4)); + } break; + case X64_DebugBreakType_Write: { + drs[7] |= (1u << 16) << (trap_idx * 4); + drs[7] &= ~((1u << 17) << (trap_idx * 4)); + } break; + case X64_DebugBreakType_ReadWriteIO: { + drs[7] &= ~((1u << 16) << (trap_idx * 4)); + drs[7] |= (1u << 17) << (trap_idx * 4); + } break; + case X64_DebugBreakType_ReadWriteNoFetch: { + drs[7] |= (1u << 16) << (trap_idx * 4); + drs[7] |= (1u << 17) << (trap_idx * 4); + } break; + default: { InvalidPath; } break; + } + + // set breakpoint size + switch (size) { + case 0: + case 1: { + drs[7] &= ~((1u << 18) << (trap_idx * 4)); + drs[7] &= ~((1u << 19) << (trap_idx * 4)); + } break; + case 2: { + drs[7] |= (1 << 18) << (trap_idx * 4); + drs[7] &= ~((1 << 19) << (trap_idx * 4)); + } break; + case 4: { + drs[7] |= (1 << 18) << (trap_idx * 4); + drs[7] |= (1 << 19) << (trap_idx * 4); + } break; + case 8: { + drs[7] &= ~((1 << 18) << (trap_idx * 4)); + drs[7] |= (1 << 19) << (trap_idx * 4); + } break; + default: { InvalidPath; } + } +} + diff --git a/src/x64/x64.h b/src/x64/x64.h new file mode 100644 index 00000000..93dfe433 --- /dev/null +++ b/src/x64/x64.h @@ -0,0 +1,234 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef X64_H +#define X64_H + +//////////////////////////////// +//~ RFlags + +typedef U64 X64_RFlags; +enum +{ + X64_RFlag_Carry = (1 << 0), + X64_RFlag_Parity = (1 << 2), + X64_RFlag_AuxCarry = (1 << 4), + X64_RFlag_Zero = (1 << 6), + X64_RFlag_Sign = (1 << 7), + X64_RFlag_Trap = (1 << 8), + X64_RFlag_Interrupt = (1 << 9), + X64_RFlag_Direction = (1 << 10), + X64_RFlag_Overflow = (1 << 11), + X64_RFlag_IoPrivilege = (3 << 12), + X64_RFlag_NT = (1 << 14), + X64_RFlag_MD = (1 << 15), + X64_RFlag_RF = (1 << 16), + X64_RFlag_VM = (1 << 17), + X64_RFlag_AC = (1 << 18), + X64_RFlag_VIF = (1 << 19), + X64_RFlag_VIP = (1 << 20), + X64_RFlag_AES = (1 << 30), + X64_RFlag_AI = (1 << 31), +}; + +//////////////////////////////// +//~ fxsave/xsave + +typedef struct AlignType(16) X64_FXSave +{ + U16 fcw; + U16 fsw; + U16 ftw; + U16 fop; + union { + struct { + U64 fip; + U64 fdp; + } b64; + struct { + U32 fip; + U16 fcs, _pad0; + U32 fdp; + U16 fds, _pad1; + } b32; + }; + U32 mxcsr; + U32 mxcsr_mask; + U128 st_space[8]; + U128 xmm_space[16]; + U8 padding[96]; +} X64_FXSave; +StaticAssert(sizeof(X64_FXSave) == 512, g_x64_xsave_legacy_size_check); + +typedef struct X64_XSaveHeader +{ + U64 xstate_bv; + U64 xcomp_bv; + U8 reserved[48]; +} X64_XSaveHeader; +StaticAssert(sizeof(X64_XSaveHeader) == 64, g_x64_xsave_header_size_check); + +typedef struct AlignType(64) X64_XSave +{ + X64_FXSave fxsave; + X64_XSaveHeader header; + // U8 ext_area[0]; +} X64_XSave; +StaticAssert(sizeof(X64_XSave) == 576, g_x64_xsave_size_check); + +typedef U32 X64_XStateComponentIdx; +enum +{ + X64_XStateComponentIdx_FP = 0, + X64_XStateComponentIdx_SSE = 1, + X64_XStateComponentIdx_AVX = 2, + X64_XStateComponentIdx_BNDREGS = 3, + X64_XStateComponentIdx_BNDCSR = 4, + X64_XStateComponentIdx_OPMASK = 5, + X64_XStateComponentIdx_ZMM_H = 6, + X64_XStateComponentIdx_ZMM = 7, + X64_XStateComponentIdx_PT = 8, + X64_XStateComponentIdx_PKRU = 9, + X64_XStateComponentIdx_PASID = 10, + X64_XStateComponentIdx_CETU = 11, + X64_XStateComponentIdx_CETS = 12, + X64_XStateComponentIdx_HDC = 13, + X64_XStateComponentIdx_UINTR = 14, + X64_XStateComponentIdx_LBR = 15, + X64_XStateComponentIdx_HWP = 16, + X64_XStateComponentIdx_TILECFG = 17, + X64_XStateComponentIdx_TILEDATA = 18, +}; + +enum +{ + X64_XStateComponentFlag_FP = (1 << X64_XStateComponentIdx_FP), + X64_XStateComponentFlag_SSE = (1 << X64_XStateComponentIdx_SSE), + X64_XStateComponentFlag_AVX = (1 << X64_XStateComponentIdx_AVX), + X64_XStateComponentFlag_BNDREGS = (1 << X64_XStateComponentIdx_BNDREGS), + X64_XStateComponentFlag_BNDCSR = (1 << X64_XStateComponentIdx_BNDCSR), + X64_XStateComponentFlag_OPMASK = (1 << X64_XStateComponentIdx_OPMASK), + X64_XStateComponentFlag_ZMM_H = (1 << X64_XStateComponentIdx_ZMM_H), + X64_XStateComponentFlag_ZMM = (1 << X64_XStateComponentIdx_ZMM), + X64_XStateComponentFlag_PT = (1 << X64_XStateComponentIdx_PT), + X64_XStateComponentFlag_PKRU = (1 << X64_XStateComponentIdx_PKRU), + X64_XStateComponentFlag_PASID = (1 << X64_XStateComponentIdx_PASID), + X64_XStateComponentFlag_CETU = (1 << X64_XStateComponentIdx_CETU), + X64_XStateComponentFlag_CETS = (1 << X64_XStateComponentIdx_CETS), + X64_XStateComponentFlag_HDC = (1 << X64_XStateComponentIdx_HDC), + X64_XStateComponentFlag_UINTR = (1 << X64_XStateComponentIdx_UINTR), + X64_XStateComponentFlag_LBR = (1 << X64_XStateComponentIdx_LBR), + X64_XStateComponentFlag_HWP = (1 << X64_XStateComponentIdx_HWP), + X64_XStateComponentFlag_TILECFG = (1 << X64_XStateComponentIdx_TILECFG), + X64_XStateComponentFlag_TILEDATA = (1 << X64_XStateComponentIdx_TILEDATA), +}; + +typedef struct +{ + U64 x87_offset; + U64 sse_offset; + U64 avx_offset; + U64 bndregs_offset; + U64 bndcfg_offset; + U64 opmask_offset; + U64 zmm_h_offset; + U64 zmm_offset; + U64 pt_offset; + U64 pkru_offset; + U64 pasid_offset; + U64 cet_u_offset; + U64 cet_s_offset; + U64 hdc_offset; + U64 uintr_offset; + U64 lbr_offset; + U64 hwp_offset; + U64 tile_cfg_offset; + U64 tile_data_offset; +} X64_XSaveLayout; + +//////////////////////////////// +//~ Debug Status Register + +typedef enum +{ + X64_DebugStatusFlag_B0 = (1 << 0), + X64_DebugStatusFlag_B1 = (1 << 1), + X64_DebugStatusFlag_B2 = (1 << 2), + X64_DebugStatusFlag_B3 = (1 << 3), + X64_DebugStatusFlag_BusLock = (1 << 11), + X64_DebugStatusFlag_DebugRegisterAccess = (1 << 13), + X64_DebugStatusFlag_SingleStep = (1 << 14), + X64_DebugStatusFlag_TaskSwitch = (1 << 15), + X64_DebugStatusFlag_RTM = (1 << 16), +} X64_DebugStatusFlags; + +//////////////////////////////// +//~ Debug Control Register + +typedef enum X64_BreakpointType { + X64_BreakpointType_Null, + X64_BreakpointType_Local, + X64_BreakpointType_Global, +} X64_BreakpointType; + +typedef enum X64_DebugBreakType +{ + X64_DebugBreakType_Null, + X64_DebugBreakType_Exec, + X64_DebugBreakType_Write, + X64_DebugBreakType_ReadWriteIO, + X64_DebugBreakType_ReadWriteNoFetch, +} X64_DebugBreakType; + +typedef enum X64_DebugControlFlags +{ + X64_DebugControlFlag_L0 = (1 << 0), + X64_DebugControlFlag_L1 = (1 << 2), + X64_DebugControlFlag_L2 = (1 << 4), + X64_DebugControlFlag_L3 = (1 << 6), + + X64_DebugControlFlag_G0 = (1 << 1), + X64_DebugControlFlag_G1 = (1 << 3), + X64_DebugControlFlag_G3 = (1 << 5), + X64_DebugControlFlag_G4 = (1 << 7), + + X64_DebugControlFlag_LE = (1 << 8), + X64_DebugControlFlag_GE = (1 << 9), + + X64_DebugControlFlag_RTM = (1 << 11), + + X64_DebugControlFlag_GD = (1 << 13), + + X64_DebugControlFlag_RW0 = (3 << 16), + X64_DebugControlFlag_RW1 = (3 << 20), + X64_DebugControlFlag_RW2 = (3 << 24), + X64_DebugControlFlag_FW3 = (3 << 26), + + X64_DebugControlFlag_LEN0 = (3 << 18), + X64_DebugControlFlag_LEN1 = (3 << 22), + X64_DebugControlFlag_LEN2 = (3 << 26), + X64_DebugControlFlag_LEN3 = (3 << 30), +} X64_DebugControlFlags; + +//////////////////////////////// +//~ cpuid + +internal void x64_cpuid(U32 leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx); +internal void x64_cpuid_ex(U32 leaf, U32 sub_leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx); + +//////////////////////////////// +//~ fxsave/xsave + +internal B32 x64_is_xsave_supported(void); +internal U32 x64_get_xsave_size(void); +internal U16 x64_xsave_tag_word_from_real_tag_word(U16 ftw); +internal U32 x64_xsave_offset_from_feature_flag(U64 xcr0, X64_XStateComponentIdx comp_idx); +internal X64_XSaveLayout x64_get_xsave_layout(U64 xcr0); + +//////////////////////////////// +//~ Debug Control Register + +internal void x64_set_debug_break(U64 *drs, U64 trap_idx, U64 addr, U64 size, X64_BreakpointType bp_type, X64_DebugBreakType break_type); + +#endif // BASE_X64_H + From d44efc15c81e9b31b5a51f1a39339233fb897e3f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 13:55:37 -0700 Subject: [PATCH 028/850] remove structs that are now in GNU layer and add 32 -> 64 bit struct converters --- src/elf/elf.c | 38 ++++++++++++++++++++++++++++++++++++++ src/elf/elf.h | 22 ++++++---------------- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/elf/elf.c b/src/elf/elf.c index 2eb6d0b3..0925a428 100644 --- a/src/elf/elf.c +++ b/src/elf/elf.c @@ -112,6 +112,15 @@ elf_chdr64_from_chdr32(ELF_Chdr32 chdr32) return chdr64; } +internal ELF_Auxv64 +elf_auxv64_from_auxv32(ELF_Auxv32 auxv32) +{ + ELF_Auxv64 auxv64 = {0}; + auxv64.a_type = auxv32.a_type; + auxv64.a_val = auxv32.a_val; + return auxv64; +} + //////////////////////////////// internal String8 @@ -141,3 +150,32 @@ arch_from_elf_machine(ELF_MachineKind e_machine) } return arch; } + +//////////////////////////////// + +internal U64 +elf_phdr_size_from_class(ELF_Class elf_class) +{ + U64 result = 0; + switch (elf_class) { + case ELF_Class_None: break; + case ELF_Class_32: { result = sizeof(ELF_Phdr32); } break; + case ELF_Class_64: { result = sizeof(ELF_Phdr64); } break; + default: { NotImplemented; } break; + } + return result; +} + +internal U64 +elf_dyn_size_from_class(ELF_Class elf_class) +{ + U64 result = 0; + switch (elf_class) { + case ELF_Class_None: break; + case ELF_Class_32: { result = sizeof(ELF_Dyn32); } break; + case ELF_Class_64: { result = sizeof(ELF_Dyn64); } break; + default: { NotImplemented; } break; + } + return result; +} + diff --git a/src/elf/elf.h b/src/elf/elf.h index c9fbe15e..648d46dd 100644 --- a/src/elf/elf.h +++ b/src/elf/elf.h @@ -805,22 +805,6 @@ typedef struct ELF_Dyn64 U64 val; } ELF_Dyn64; -typedef struct ELF_LinkMap32 -{ - U32 base; - U32 name; - U32 ld; - U32 next; -} ELF_LinkMap32; - -typedef struct ELF_LinkMap64 -{ - U64 base; - U64 name; - U64 ld; - U64 next; -} ELF_LinkMap64; - //////////////////////////////// // Imports and Exports @@ -982,6 +966,7 @@ internal ELF_Sym64 elf_sym64_from_sym32 (ELF_Sym32 sym32); internal ELF_Rel64 elf_rel64_from_rel32 (ELF_Rel32 rel32); internal ELF_Rela64 elf_rela64_from_rela32(ELF_Rela32 rela32); internal ELF_Chdr64 elf_chdr64_from_chdr32(ELF_Chdr32 chdr32); +internal ELF_Auxv64 elf_auxv64_from_auxv32(ELF_Auxv32 auxv32); //////////////////////////////// @@ -991,4 +976,9 @@ internal String8 elf_string_from_class(Arena *arena, ELF_Class v); internal Arch arch_from_elf_machine(ELF_MachineKind machine); +//////////////////////////////// + +internal U64 elf_phdr_size_from_class(ELF_Class elf_class); +internal U64 elf_dyn_size_from_class(ELF_Class elf_class); + #endif // ELF_H From 821af9b104d4b4e43fd0ab0dff1369a74d15e0db Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 13:57:03 -0700 Subject: [PATCH 029/850] fix FDE binary search for case where PC is not exactly on first instruction --- src/dwarf/eh_frame.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/dwarf/eh_frame.c b/src/dwarf/eh_frame.c index 12f8cfc4..9cb17637 100644 --- a/src/dwarf/eh_frame.c +++ b/src/dwarf/eh_frame.c @@ -331,8 +331,8 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) goto exit; } - U64 last_off = header.table.size - header.entry_byte_size; - U64 last = 0; + U64 last_off = header.table.size - header.entry_byte_size; + U64 last = 0; U64 last_size = eh_parse_ptr(header.table, last_off, ptr_ctx->pc_vaddr + last_off, ptr_ctx, header.table_enc, &last); AssertAlways(last_size); if (last <= pc) { @@ -340,27 +340,25 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) goto exit; } - if (first <= pc && pc < last) { - U64 l = 0; - U64 r = header.fde_count - 1; - while (l <= r) { - U64 m = l + (r - l) / 2; - U64 m_pc_off = m * header.entry_byte_size; - U64 m_pc = 0; - U64 m_pc_size = eh_parse_ptr(header.table, m_pc_off, ptr_ctx->pc_vaddr + m_pc_off, ptr_ctx, header.table_enc, &m_pc); - Assert(m_pc_size); - - if (m_pc == pc) { - fde_idx = m; - goto exit; - } else if (m_pc < pc) { - l = m + 1; - } else { - r = m - 1; - } + U64 l = 0; + U64 r = header.fde_count - 1; + while (l <= r) { + U64 m = l + (r - l) / 2; + U64 m_pc_off = m * header.entry_byte_size; + U64 m_pc = 0; + U64 m_pc_size = eh_parse_ptr(header.table, m_pc_off, ptr_ctx->pc_vaddr + m_pc_off, ptr_ctx, header.table_enc, &m_pc); + Assert(m_pc_size); + if (m_pc > pc) { + r = m - 1; + } else if (m_pc < pc) { + l = m + 1; + } else { + fde_idx = m; + goto exit; } - fde_idx = l; } + + fde_idx = l > 0 ? l-1 : 0; } } From 1b6e9e9d7b8e438349ca36105b62c52f2b5d0545 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 14:10:08 -0700 Subject: [PATCH 030/850] parse "Signal Frame" aug flag and fill out augmentation data size --- src/dwarf/eh_frame.c | 17 +++++++++++++---- src/dwarf/eh_frame.h | 8 +++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/dwarf/eh_frame.c b/src/dwarf/eh_frame.c index 9cb17637..cf455905 100644 --- a/src/dwarf/eh_frame.c +++ b/src/dwarf/eh_frame.c @@ -133,13 +133,13 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c U64 cursor = 0; + U64 aug_data_size = 0; EH_AugFlags aug_flags = 0; - EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; - EH_PtrEnc addr_encoding = EH_PtrEnc_UData8; - EH_PtrEnc handler_encoding = EH_PtrEnc_Omit; + EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; + EH_PtrEnc addr_encoding = EH_PtrEnc_UData8; + EH_PtrEnc handler_encoding = EH_PtrEnc_Omit; U64 handler_ip = 0; if (str8_match(str8_prefix(aug_string, 1), str8_lit("z"), 0)) { - U64 aug_data_size = 0; cursor = str8_deserial_read_uleb128(aug_data, cursor, &aug_data_size); for (U8 *ptr = aug_string.str+1; ptr < (aug_string.str+aug_string.size); ptr += 1) { @@ -157,6 +157,9 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); aug_flags |= EH_AugFlag_HasAddrEnc; } break; + case 'S': { + aug_flags |= EH_AugFlag_SignalFrame; + } break; default: { Assert(!"failed to parse augmentation string"); goto exit; } break; } } @@ -168,6 +171,7 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c aug_out->lsda_encoding = handler_encoding; aug_out->addr_encoding = addr_encoding; aug_out->flags = aug_flags; + aug_out->size = aug_data_size; } exit:; @@ -219,6 +223,7 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c cursor += version_size; String8 aug_string = {0}; + String8 aug_data = {0}; EH_Augmentation aug = {0}; U64 code_align_factor = 0; S64 data_align_factor = 0; @@ -248,11 +253,15 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c cursor += ret_addr_reg_size; U64 aug_data_size = eh_parse_aug_data(aug_string, str8_skip(data, cursor), pc + cursor, ptr_ctx, &aug); + aug_data = str8_substr(data, r1u64(cursor, cursor + aug.size)); cursor += aug_data_size; + } else { + Assert(0 && "unexpected version"); } cie_out->insts = str8_skip(data, cursor); cie_out->aug_string = aug_string; + cie_out->aug_data = aug_data; cie_out->code_align_factor = code_align_factor; cie_out->data_align_factor = data_align_factor; cie_out->ret_addr_reg = ret_addr_reg; diff --git a/src/dwarf/eh_frame.h b/src/dwarf/eh_frame.h index dbd14053..9ae4a257 100644 --- a/src/dwarf/eh_frame.h +++ b/src/dwarf/eh_frame.h @@ -53,9 +53,10 @@ typedef struct EH_PtrCtx typedef U8 EH_AugFlags; enum { - EH_AugFlag_HasLSDA = (1 << 0), - EH_AugFlag_HasHandler = (1 << 1), - EH_AugFlag_HasAddrEnc = (1 << 2), + EH_AugFlag_HasLSDA = (1 << 0), + EH_AugFlag_HasHandler = (1 << 1), + EH_AugFlag_HasAddrEnc = (1 << 2), + EH_AugFlag_SignalFrame = (1 << 3), }; typedef struct EH_Augmentation @@ -65,6 +66,7 @@ typedef struct EH_Augmentation EH_PtrEnc handler_encoding; EH_PtrEnc lsda_encoding; EH_PtrEnc addr_encoding; + U64 size; } EH_Augmentation; //////////////////////////////// From 9e965e345fddcc8e1d16439f5f6d2cbe489e7dcc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 13:59:17 -0700 Subject: [PATCH 031/850] string format expression op when version is below 3 --- src/dwarf/dwarf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 508c2594..db002a26 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -558,13 +558,13 @@ dw_string_from_expr_op(Arena *arena, DW_Version ver, DW_Ext ext, DW_ExprOp op) DW_Expr_V4_XList(X) } } // fall-through - case DW_Version_3: { + case DW_Version_3: + case DW_Version_2: + case DW_Version_1: { switch (op) { DW_Expr_V3_XList(X) } } // fall-through - case DW_Version_2: - case DW_Version_1: case DW_Version_Null: break; } From 16232b98d821fb65cd42fdd9c1f91251a42eb599 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 14:00:02 -0700 Subject: [PATCH 032/850] SP from arch helper --- src/dwarf/dwarf.c | 11 +++++++++++ src/dwarf/dwarf.h | 1 + 2 files changed, 12 insertions(+) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index db002a26..2b2f3966 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -94,6 +94,17 @@ dw_reg_max_size_from_arch(Arch arch) return max_size; } +internal U64 +dw_sp_from_arch(Arch arch) +{ + switch (arch) { + default: NotImplemented; + case Arch_Null: return 0; + case Arch_x86: return DW_RegX86_Esp; + case Arch_x64: return DW_RegX64_Rsp; + } +} + internal DW_AttribClass dw_attrib_class_from_attrib_v2(DW_AttribKind k) { diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 7419bed5..89e9b099 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1746,6 +1746,7 @@ internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code); internal U64 dw_reg_pos_from_code(Arch arch, DW_Reg reg_code); internal U64 dw_reg_count_from_arch(Arch arch); internal U64 dw_reg_max_size_from_arch(Arch arch); +internal U64 dw_sp_from_arch(Arch arch); //- Attrib Class Encodings From 793cd906048acec54147cc8c15c3880b4fdddbfa Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 14:04:17 -0700 Subject: [PATCH 033/850] zero out IP when reached last frame --- src/ctrl/ctrl_core.c | 50 +++++++++++++++++++++++++------------------- src/ctrl/ctrl_core.h | 2 +- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index be5f7dd4..35f8da05 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1906,7 +1906,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; // gather context for virtual stack unwinder - U64 rebase = 0; + U64 cfi_rebase = 0; B32 is_unwind_eh = 0; String8 unwind_data = {0}; EH_FrameHdr eh_frame_hdr = {0}; @@ -1921,7 +1921,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A { if(ctrl_handle_match(n->module, module_handle)) { - rebase = n->rebase; + cfi_rebase = n->cfi_rebase; is_unwind_eh = n->is_unwind_eh; unwind_data = n->dwarf_unwind_data; eh_frame_hdr = n->eh_frame_hdr; @@ -1931,12 +1931,11 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A } } - // rebase IP to the base used for linking the module - U64 ip = regs_rip_from_arch_block(arch, regs); - U64 cfi_ip = ip + rebase; + // grab IP + U64 ip = regs_rip_from_arch_block(arch, regs); - // use .eh_frame_hdr to quickly locate nearest FDE offset - U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, cfi_ip); + // use .eh_frame_hdr to quickly locate nearest FDE + U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, ip); if(fde_addr != max_U64) { @@ -2029,6 +2028,8 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A if(is_cfi_parsed) { + Assert(contains_1u64(fde.pc_range, ip)); + // setup pointer decoder ops DW_DecodePtr *decode_ptr_func = 0; void *decode_ptr_ctx = 0; @@ -2048,7 +2049,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A } // find register rules for IP - DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(scratch.arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, cfi_ip); + DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(scratch.arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, ip); if(cfi_row) { // setup machine ops @@ -2095,6 +2096,12 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A reg_write_func, reg_write_ctx); + // last frame typically has undefined rule for IP + if(cfi_row->regs[cie.ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) + { + regs_arch_block_write_rip(arch, regs, 0); + } + // translate unwind status code to control layer's result flags switch(cfi_uw_status) { @@ -3744,10 +3751,10 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ Guid pdb_dbg_guid = {0}; String8 pdb_dbg_path = {0}; - U64 rebase = 0; + U64 cfi_rebase = 0; B32 is_unwind_eh = 0; EH_FrameHdr eh_frame_hdr = {0}; - EH_PtrCtx eh_ptr_ctx = { .raw_base_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; + EH_PtrCtx eh_ptr_ctx = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; // read module's signature bytes U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); @@ -4018,6 +4025,11 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ } } + if(e_type == ELF_Type_Dyn) + { + cfi_rebase = vaddr_range.min; + } + // find and parse .eh_frame_hdr Rng1U64 eh_frame_hdr_vrange = {0}; String8 eh_frame_hdr_data = {0}; @@ -4031,14 +4043,14 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ } else if(elf_phdr_entsize == sizeof(ELF_Phdr64)) { - U64 elf_phcount = dim_1u64(elf_phdr_vrange) / elf_phdr_entsize; - ELF_Phdr64 *phdrs64 = phdrs_raw; + U64 elf_phcount = dim_1u64(elf_phdr_vrange) / elf_phdr_entsize; + ELF_Phdr64 *phdrs64 = phdrs_raw; for EachIndex(phdr_idx, elf_phcount) { ELF_Phdr64 *phdr = phdrs64 + phdr_idx; if(phdr->p_type == ELF_PType_GnuEHFrame) { - eh_frame_hdr_vrange = r1u64(phdr->p_vaddr, phdr->p_vaddr + phdr->p_memsz); + eh_frame_hdr_vrange = r1u64(cfi_rebase + phdr->p_vaddr, cfi_rebase + phdr->p_vaddr + phdr->p_memsz); eh_frame_hdr_data = dmn_process_read_block(arena, process.dmn_handle, eh_frame_hdr_vrange); is_unwind_eh = 1; break; @@ -4049,9 +4061,9 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ // parse .eh_frame_hdr Arch arch = ctrl_arch_from_process_handle(process); - eh_ptr_ctx.raw_base_vaddr = eh_frame_hdr_vrange.min; + eh_ptr_ctx.pc_vaddr = eh_frame_hdr_vrange.min; eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min; - eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx); + eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx); // set entry point if (e_entry != 0) @@ -4064,12 +4076,6 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ { exe_dbg_path = path; } - - if(e_type == ELF_Type_Dyn) - { - rebase = -vaddr_range.min; - } - elf_exit:; } @@ -4148,7 +4154,7 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ node->arena = arena; node->pdatas = pdatas; node->pdatas_count = pdatas_count; - node->rebase = rebase; + node->cfi_rebase = cfi_rebase; node->is_unwind_eh = is_unwind_eh; node->eh_frame_hdr = eh_frame_hdr; node->eh_ptr_ctx = eh_ptr_ctx; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 2a24ad07..59a9de51 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -597,7 +597,7 @@ struct CTRL_ModuleImageInfoCacheNode Arena *arena; PE_IntelPdata *pdatas; U64 pdatas_count; - U64 rebase; + U64 cfi_rebase; B32 is_unwind_eh; String8 dwarf_unwind_data; EH_FrameHdr eh_frame_hdr; From f2392284d57c59484ab0a4ea2c91598c5ef8029f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 14:04:41 -0700 Subject: [PATCH 034/850] add missing case for the register rule --- src/dwarf/dwarf_dump.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 95850e58..27ad6dd0 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -529,6 +529,9 @@ dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version ver case DW_CFI_RegisterRule_ValOffset: { rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); } break; + case DW_CFI_RegisterRule_Register: { + rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); + } break; case DW_CFI_RegisterRule_Expression: { rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); } break; From 7616767ed7b1558180aaa534a2bde03cfcb1b137 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 14:05:55 -0700 Subject: [PATCH 035/850] fix CFA_Expr instruction fill --- src/dwarf/dwarf_parse.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index d65f304f..8559b08d 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -3746,7 +3746,8 @@ dw_parse_cfa_inst(String8 data, String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); cursor += expr_size; - operands[0].block = expr; + operands[0].u64 = reg; + operands[1].block = expr; } break; case DW_CFA_ValExpr: { U64 val = 0; From 3f70cd6d05a36d64c131a0509f05b049049640b4 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 14:08:02 -0700 Subject: [PATCH 036/850] handle CFI programs without meaningful instructions --- src/dwarf/dwarf_unwind.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index 89b3b250..752ed668 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -65,7 +65,8 @@ dw_cfi_unwind_init(Arena *arena, internal B32 dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) { - B32 is_row_valid = 0; + B32 is_row_valid = 0; + DW_CFA_InstNode *row_inst = uw->curr_inst; // skip leading nops while (uw->curr_inst) { @@ -80,7 +81,7 @@ dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) // validate register operands DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst->opcode); - U64 operand_count = dw_operand_count_from_cfa_opcode(inst->opcode); + U64 operand_count = dw_operand_count_from_cfa_opcode(inst->opcode); for EachIndex(operand_idx, operand_count) { if (operand_types[operand_idx] == DW_CFA_OperandType_Register) { if (inst->operands[operand_idx].u64 >= uw->reg_count) { @@ -187,14 +188,13 @@ dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) default: { NotImplemented; } break; // TODO: report error: unknown CFA opcode } - is_row_valid = 1; - uw->curr_inst = uw->curr_inst->next; if (uw->curr_inst) { if (dw_is_new_row_cfa_opcode(uw->curr_inst->v.opcode)) { break; } } } + is_row_valid = row_inst != 0; exit:; return is_row_valid; } @@ -220,7 +220,7 @@ dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodeP // handle last row if (!is_row_found) { - if (prev_pc <= pc && pc < uw->pc && contains_1u64(fde->pc_range, pc)) { + if (contains_1u64(fde->pc_range, pc)) { row = uw->row; is_row_found = 1; } @@ -272,10 +272,7 @@ dw_cfi_apply_register_rules(Arch arch, for EachIndex(reg_idx, reg_count) { DW_CFI_Register *reg = &row->regs[reg_idx]; switch (reg->rule) { - case DW_CFI_RegisterRule_Undefined: { - // TODO: ??? - Assert(!"undefined"); - } break; + case DW_CFI_RegisterRule_Undefined: {} break; case DW_CFI_RegisterRule_SameValue: {} break; case DW_CFI_RegisterRule_Offset: { // read register value from memory From 8bc1e4b21c5674b19a349c73675c3c7d7369004f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 14:08:14 -0700 Subject: [PATCH 037/850] explicitly update stack pointer --- src/dwarf/dwarf_unwind.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index 752ed668..c444dbc2 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -319,7 +319,10 @@ dw_cfi_apply_register_rules(Arch arch, } } - + // update stack pointer + U64 sp = dw_sp_from_arch(arch); + reg_write_func(sp, &cfa, sizeof(cfa), reg_write_ud); + exit:; scratch_end(scratch); return unwind_status; From b596a6ed8a0479f881eae127a4228518e0f77fc9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Oct 2025 17:53:30 -0700 Subject: [PATCH 038/850] dumper for SHT_NOTE --- src/dwarf/dwarf_elf.c | 4 +- src/elf/elf.h | 237 +++++++++------------------------------ src/elf/elf_dump.c | 215 +++++++++++++++++++++++++++++++++++ src/elf/elf_dump.h | 30 +++++ src/gnu/gnu.c | 225 +++++++++++++++++++++++++++++++++++++ src/gnu/gnu.h | 146 ++++++++++++++++++++++++ src/radbin/radbin.c | 30 +++-- src/radbin/radbin_main.c | 4 + 8 files changed, 694 insertions(+), 197 deletions(-) create mode 100644 src/elf/elf_dump.c create mode 100644 src/elf/elf_dump.h diff --git a/src/dwarf/dwarf_elf.c b/src/dwarf/dwarf_elf.c index 6ea144f8..39884286 100644 --- a/src/dwarf/dwarf_elf.c +++ b/src/dwarf/dwarf_elf.c @@ -8,7 +8,7 @@ dw_is_dwarf_present_from_elf_bin(String8 data, ELF_Bin *bin) for EachIndex(idx, bin->shdrs.count) { ELF_Shdr64 *shdr = &bin->shdrs.v[idx]; - if(shdr->sh_type != ELF_SectionCode_ProgBits) { continue; } + if(shdr->sh_type != ELF_ShType_ProgBits) { continue; } String8 name = elf_name_from_shdr64(data, bin, shdr); DW_SectionKind s = dw_section_kind_from_string(name); if(s == DW_Section_Null) @@ -35,7 +35,7 @@ dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) for(U64 section_idx = 1; section_idx < bin->shdrs.count; section_idx += 1) { ELF_Shdr64 *shdr = &bin->shdrs.v[section_idx]; - if(shdr->sh_type != ELF_SectionCode_ProgBits) { continue; } // skip BSS sections + if(shdr->sh_type != ELF_ShType_ProgBits) { continue; } // skip BSS sections //- rjf: unpack section String8 section_name = elf_name_from_shdr64(data, bin, shdr); diff --git a/src/elf/elf.h b/src/elf/elf.h index 648d46dd..ddc6950e 100644 --- a/src/elf/elf.h +++ b/src/elf/elf.h @@ -151,40 +151,42 @@ enum ELF_PFlag_Read = (1 << 2), }; -typedef U32 ELF_SectionCode; +typedef U32 ELF_ShType; enum { - ELF_SectionCode_Null = 0, - ELF_SectionCode_ProgBits = 1, - ELF_SectionCode_Symtab = 2, - ELF_SectionCode_Strtab = 3, - ELF_SectionCode_Rela = 4, - ELF_SectionCode_Hash = 5, - ELF_SectionCode_Dynamic = 6, - ELF_SectionCode_Note = 7, - ELF_SectionCode_NoBits = 8, - ELF_SectionCode_Rel = 9, - ELF_SectionCode_Shlib = 10, - ELF_SectionCode_Dynsym = 11, - ELF_SectionCode_InitArray = 14, - ELF_SectionCode_FiniArray = 15, // Array of ptrs to init functions - ELF_SectionCode_PreinitArray = 16, // Array of ptrs to finish functions - ELF_SectionCode_Group = 17, // Array of ptrs to pre-init funcs - ELF_SectionCode_SymtabShndx = 18, // Section contains a section group - ELF_SectionCode_GNU_IncrementalInputs = 0x6fff4700, // Indices for SHN_XINDEX entries - ELF_SectionCode_GNU_Attributes = 0x6ffffff5, // Incremental build data - ELF_SectionCode_GNU_Hash = 0x6ffffff6, // Object attributes - ELF_SectionCode_GNU_LibList = 0x6ffffff7, // GNU style symbol hash table - ELF_SectionCode_SUNW_verdef = 0x6ffffffd, - ELF_SectionCode_SUNW_verneed = 0x6ffffffe, // Versions defined by file - ELF_SectionCode_SUNW_versym = 0x6fffffff, // Versions needed by file + ELF_ShType_Null = 0, + ELF_ShType_ProgBits = 1, + ELF_ShType_Symtab = 2, + ELF_ShType_Strtab = 3, + ELF_ShType_Rela = 4, + ELF_ShType_Hash = 5, + ELF_ShType_Dynamic = 6, + ELF_ShType_Note = 7, + ELF_ShType_NoBits = 8, + ELF_ShType_Rel = 9, + ELF_ShType_Shlib = 10, + ELF_ShType_Dynsym = 11, + ELF_ShType_InitArray = 14, + ELF_ShType_FiniArray = 15, // Array of ptrs to init functions + ELF_ShType_PreinitArray = 16, // Array of ptrs to finish functions + ELF_ShType_Group = 17, // Array of ptrs to pre-init funcs + ELF_ShType_SymtabShndx = 18, // Section contains a section group + + ELF_ShType_GNU_IncrementalInputs = 0x6fff4700, // Indices for SHN_XINDEX entries + ELF_ShType_GNU_Attributes = 0x6ffffff5, // Incremental build data + ELF_ShType_GNU_Hash = 0x6ffffff6, // Object attributes + ELF_ShType_GNU_LibList = 0x6ffffff7, // GNU style symbol hash table + + ELF_ShType_SUNW_verdef = 0x6ffffffd, + ELF_ShType_SUNW_verneed = 0x6ffffffe, // Versions defined by file + ELF_ShType_SUNW_versym = 0x6fffffff, // Versions needed by file // Symbol versions - ELF_SectionCode_GNU_verdef = ELF_SectionCode_SUNW_verdef, - ELF_SectionCode_GNU_verneed = ELF_SectionCode_SUNW_verneed, - ELF_SectionCode_GNU_versym = ELF_SectionCode_SUNW_versym, - ELF_SectionCode_Proc, - ELF_SectionCode_User, + ELF_ShType_GNU_verdef = ELF_ShType_SUNW_verdef, + ELF_ShType_GNU_verneed = ELF_ShType_SUNW_verneed, + ELF_ShType_GNU_versym = ELF_ShType_SUNW_versym, + ELF_ShType_Proc, + ELF_ShType_User, }; typedef U32 ELF_SectionIndex; @@ -527,140 +529,7 @@ enum typedef U32 ELF_NoteType; enum { - ELF_NoteType_GNU_Abi = 1, - ELF_NoteType_GNU_HwCap = 2, - ELF_NoteType_GNU_BuildId = 3, - ELF_NoteType_GNU_GoldVersion = 4, - ELF_NoteType_GNU_PropertyType0 = 5, -}; - -typedef U32 ELF_GnuABITag; -enum -{ - ELF_GnuABITag_Linux = 0, - ELF_GnuABITag_Hurd = 1, - ELF_GnuABITag_Solaris = 2, - ELF_GnuABITag_FreeBsd = 3, - ELF_GnuABITag_NetBsd = 4, - ELF_GnuABITag_Syllable = 5, - ELF_GnuABITag_Nacl = 6, -}; - -typedef S32 ELF_GnuProperty; -enum -{ - ELF_GnuProperty_LoProc = 0xc0000000, - // processor-specific range - ELF_GnuProperty_HiProc = 0xdfffffff, - ELF_GnuProperty_LoUser = 0xe0000000, - // application-specific range - ELF_GnuProperty_HiUser = 0xffffffff, - ELF_GnuProperty_StackSize = 1, - ELF_GnuProperty_NoCopyOnProtected = 2, -}; - -typedef U32 ELF_GnuPropertyX86Isa1; -enum -{ - ELF_GnuPropertyX86Isa1_BaseLine = (1 << 0), - ELF_GnuPropertyX86Isa1_V2 = (1 << 1), - ELF_GnuPropertyX86Isa1_V3 = (1 << 2), - ELF_GnuPropertyX86Isa1_V4 = (1 << 3), -}; - -typedef U32 ELF_GnuPropertyX86Compat1Isa1; -enum -{ - ELF_GnuPropertyX86Compat1Isa1_486 = (1 << 0), - ELF_GnuPropertyX86Compat1Isa1_586 = (1 << 1), - ELF_GnuPropertyX86Compat1Isa1_686 = (1 << 2), - ELF_GnuPropertyX86Compat1Isa1_SSE = (1 << 3), - ELF_GnuPropertyX86Compat1Isa1_SSE2 = (1 << 4), - ELF_GnuPropertyX86Compat1Isa1_SSE3 = (1 << 5), - ELF_GnuPropertyX86Compat1Isa1_SSSE3 = (1 << 6), - ELF_GnuPropertyX86Compat1Isa1_SSE4_1 = (1 << 7), - ELF_GnuPropertyX86Compat1Isa1_SSE4_2 = (1 << 8), - ELF_GnuPropertyX86Compat1Isa1_AVX = (1 << 9), - ELF_GnuPropertyX86Compat1Isa1_AVX2 = (1 << 10), - ELF_GnuPropertyX86Compat1Isa1_AVX512F = (1 << 11), - ELF_GnuPropertyX86Compat1Isa1_AVX512ER = (1 << 12), - ELF_GnuPropertyX86Compat1Isa1_AVX512PF = (1 << 13), - ELF_GnuPropertyX86Compat1Isa1_AVX512VL = (1 << 14), - ELF_GnuPropertyX86Compat1Isa1_AVX512DQ = (1 << 15), - ELF_GnuPropertyX86Compat1Isa1_AVX512BW = (1 << 16), -}; - -typedef U32 ELF_GnuPropertyX86Compat2Isa1; -enum -{ - ELF_GnuPropertyX86Compat2Isa1_CMOVE = (1 << 0), - ELF_GnuPropertyX86Compat2Isa1_SSE = (1 << 1), - ELF_GnuPropertyX86Compat2Isa1_SSE2 = (1 << 2), - ELF_GnuPropertyX86Compat2Isa1_SSE3 = (1 << 3), - ELF_GnuPropertyX86Compat2Isa1_SSE4_1 = (1 << 4), - ELF_GnuPropertyX86Compat2Isa1_SSE4_2 = (1 << 5), - ELF_GnuPropertyX86Compat2Isa1_AVX = (1 << 6), - ELF_GnuPropertyX86Compat2Isa1_AVX2 = (1 << 7), - ELF_GnuPropertyX86Compat2Isa1_FMA = (1 << 8), - ELF_GnuPropertyX86Compat2Isa1_AVX512F = (1 << 9), - ELF_GnuPropertyX86Compat2Isa1_AVX512CD = (1 << 10), - ELF_GnuPropertyX86Compat2Isa1_AVX512ER = (1 << 11), - ELF_GnuPropertyX86Compat2Isa1_AVX512PF = (1 << 12), - ELF_GnuPropertyX86Compat2Isa1_AVX512VL = (1 << 13), - ELF_GnuPropertyX86Compat2Isa1_AVX512DQ = (1 << 14), - ELF_GnuPropertyX86Compat2Isa1_AVX512BW = (1 << 15), - ELF_GnuPropertyX86Compat2Isa1_AVX512_4FMAPS = (1 << 16), - ELF_GnuPropertyX86Compat2Isa1_AVX512_4VNNIW = (1 << 17), - ELF_GnuPropertyX86Compat2Isa1_AVX512_BITALG = (1 << 18), - ELF_GnuPropertyX86Compat2Isa1_AVX512_IFMA = (1 << 19), - ELF_GnuPropertyX86Compat2Isa1_AVX512_VBMI = (1 << 20), - ELF_GnuPropertyX86Compat2Isa1_AVX512_VBMI2 = (1 << 21), - ELF_GnuPropertyX86Compat2Isa1_AVX512_VNNI = (1 << 22), - ELF_GnuPropertyX86Compat2Isa1_AVX512_BF16 = (1 << 23), -}; - -typedef S32 ELF_GnuPropertyX86; -enum -{ - ELF_GnuPropertyX86_Feature1And = 0xc0000002, - ELF_GnuPropertyX86_Feature2Used = 0xc0010001, - ELF_GnuPropertyX86_Isa1needed = 0xc0008002, - ELF_GnuPropertyX86_Isa2Needed = 0xc0008001, - ELF_GnuPropertyX86_Isa1Used = 0xc0010002, - ELF_GnuPropertyX86_Compat_isa_1_used = 0xc0000000, - ELF_GnuPropertyX86_Compat_isa_1_needed = 0xc0000001, - ELF_GnuPropertyX86_UInt32AndLo = ELF_GnuPropertyX86_Feature1And, - ELF_GnuPropertyX86_UInt32AndHi = 0xc0007fff, - ELF_GnuPropertyX86_UInt32OrLo = 0xc0008000, - ELF_GnuPropertyX86_UInt32OrHi = 0xc000ffff, - ELF_GnuPropertyX86_UInt32OrAndLo = 0xc0010000, - ELF_GnuPropertyX86_UInt32OrAndHi = 0xc0017fff, -}; - -typedef U32 ELF_GnuPropertyX86Feature1; -enum -{ - ELF_GnuPropertyX86Feature1_Ibt = (1 << 0), - ELF_GnuPropertyX86Feature1_Shstk = (1 << 1), - ELF_GnuPropertyX86Feature1_LamU48 = (1 << 2), - ELF_GnuPropertyX86Feature1_LamU57 = (1 << 3), -}; - -typedef U32 ELF_GnuPropertyX86Feature2; -enum -{ - ELF_GnuPropertyX86Feature2_X86 = (1 << 0), - ELF_GnuPropertyX86Feature2_X87 = (1 << 1), - ELF_GnuPropertyX86Feature2_MMX = (1 << 2), - ELF_GnuPropertyX86Feature2_XMM = (1 << 3), - ELF_GnuPropertyX86Feature2_YMM = (1 << 4), - ELF_GnuPropertyX86Feature2_ZMM = (1 << 5), - ELF_GnuPropertyX86Feature2_FXSR = (1 << 6), - ELF_GnuPropertyX86Feature2_XSAVE = (1 << 7), - ELF_GnuPropertyX86Feature2_XSAVEOPT = (1 << 8), - ELF_GnuPropertyX86Feature2_XSAVEC = (1 << 9), - ELF_GnuPropertyX86Feature2_TMM = (1 << 10), - ELF_GnuPropertyX86Feature2_MASK = (1 << 11), + ELF_NoteType_STapSdt = 3, // System Tap probes }; #define ELF_HdrIs64Bit(e_ident) (e_ident[ELF_Identifier_Class] == ELF_Class_64) @@ -721,30 +590,30 @@ typedef struct ELF_Hdr32 typedef struct ELF_Shdr64 { - U32 sh_name; - U32 sh_type; - U64 sh_flags; - U64 sh_addr; - U64 sh_offset; - U64 sh_size; - U32 sh_link; - U32 sh_info; - U64 sh_addralign; - U64 sh_entsize; + U32 sh_name; + ELF_ShType sh_type; + U64 sh_flags; + U64 sh_addr; + U64 sh_offset; + U64 sh_size; + U32 sh_link; + U32 sh_info; + U64 sh_addralign; + U64 sh_entsize; } ELF_Shdr64; typedef struct ELF_Shdr32 { - U32 sh_name; - U32 sh_type; - U32 sh_flags; - U32 sh_addr; - U32 sh_offset; - U32 sh_size; - U32 sh_link; - U32 sh_info; - U32 sh_addralign; - U32 sh_entsize; + U32 sh_name; + ELF_ShType sh_type; + U32 sh_flags; + U32 sh_addr; + U32 sh_offset; + U32 sh_size; + U32 sh_link; + U32 sh_info; + U32 sh_addralign; + U32 sh_entsize; } ELF_Shdr32; typedef struct ELF_Phdr64 diff --git a/src/elf/elf_dump.c b/src/elf/elf_dump.c new file mode 100644 index 00000000..c948ed3c --- /dev/null +++ b/src/elf/elf_dump.c @@ -0,0 +1,215 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal String8List +elf_dump_note(Arena *arena, String8 raw_notes, ELF_Class elf_class, ELF_MachineKind e_machine) +{ + Temp scratch = scratch_begin(&arena, 1); + + B32 is_bad_parse = 1; + String8List strings = {0}; + U64 cursor = 0; + + for (;cursor < raw_notes.size;) { + U32 owner_size; + U64 owner_size_size = str8_deserial_read_struct(raw_notes, cursor, &owner_size); + if (owner_size_size == 0) { goto exit; } + cursor += owner_size_size; + + U32 desc_size; + U64 desc_size_size = str8_deserial_read_struct(raw_notes, cursor, &desc_size); + if (desc_size_size == 0) { goto exit; } + cursor += desc_size_size; + + ELF_NoteType note_type; + U64 type_size = str8_deserial_read_struct(raw_notes, cursor, ¬e_type); + if (type_size == 0) { goto exit; } + cursor += type_size; + + if (cursor + owner_size > raw_notes.size) { goto exit; } + String8 owner = str8_cstring_capped(raw_notes.str + cursor, raw_notes.str + cursor + owner_size); + cursor += owner_size; + + if (cursor + desc_size > raw_notes.size) { goto exit; } + String8 raw_desc = str8_substr(raw_notes, r1u64(cursor, cursor + desc_size)); + cursor += desc_size; + cursor = AlignPow2(cursor, 4); + + String8List desc_fmt = {0}; + String8 note_type_str = {0}; + if (str8_match(owner, str8_lit("GNU"), StringMatchFlag_CaseInsensitive)) { + // format description + switch (note_type) { + case GNU_NoteType_Abi: { + U64 desc_cursor = 0; + + GNU_AbiTag os = 0; + U64 os_size = str8_deserial_read_struct(raw_desc, desc_cursor, &os); + if (os_size == 0) { goto exit; } + cursor += os_size; + + U32 major = 0; + U64 major_size = str8_deserial_read_struct(raw_desc, desc_cursor, &major); + if (major_size == 0) { goto exit; } + cursor += major_size; + + U32 minor = 0; + U64 minor_size = str8_deserial_read_struct(raw_desc, desc_cursor, &minor); + if (minor_size == 0) { goto exit; } + cursor += minor_size; + + U32 sub_minor = 0; + U64 sub_minor_size = str8_deserial_read_struct(raw_desc, desc_cursor, &sub_minor); + if (sub_minor_size == 0) { goto exit; } + cursor += sub_minor_size; + + String8 os_str = gnu_string_from_abi_tag(os); + if (os_str.size == 0) os_str = str8f(scratch.arena, "0x%x", os); + + str8_list_pushf(scratch.arena, &desc_fmt, "OS: %S, ABI: %u.%u.%u", os_str, major, minor, sub_minor); + } break; + case GNU_NoteType_BuildId: { + String8List build_id = {0}; + for EachIndex(desc_cursor, desc_size) { + U8 v = 0; + U64 v_size = str8_deserial_read_struct(raw_desc, desc_cursor, &v); + if (v_size == 0) { goto exit; } + desc_cursor += v_size; + str8_list_pushf(scratch.arena, &build_id, "%02x", v); + } + String8 build_id_str = str8_list_join(scratch.arena, &build_id, 0); + str8_list_pushf(scratch.arena, &desc_fmt, "Build ID: %S", build_id_str); + } break; + case GNU_NoteType_PropertyType0: { + U64 align = elf_class == ELF_Class_64 ? 8 : 4; + for (U64 desc_cursor = 0; desc_cursor < raw_desc.size; ) { + GNU_Property type = 0; + U64 type_size = str8_deserial_read_struct(raw_desc, desc_cursor, &type); + if (type_size == 0) { goto exit; } + desc_cursor += type_size; + + U32 size = 0; + U64 size_size = str8_deserial_read_struct(raw_desc, desc_cursor, &size); + if (size_size == 0) { goto exit; } + desc_cursor += size_size; + + U32 flags = 0; + if (size == 4) { + U64 flags_size = str8_deserial_read_struct(raw_desc, desc_cursor, &flags); + if (flags_size == 0) { goto exit; } + desc_cursor += flags_size; + } + + switch (e_machine) { + case ELF_MachineKind_None: break; + case ELF_MachineKind_X86_64: { + String8 features = gnu_string_from_property_flags_x86(scratch.arena, type, flags); + str8_list_pushf(scratch.arena, &desc_fmt, "x86 features: %S", features); + } break; + default: NotImplemented; break; + } + + desc_cursor = AlignPow2(desc_cursor, align); + } + } break; + default: NotImplemented; break; + } + + note_type_str = gnu_string_from_note_type(note_type); + } else if (str8_match(owner, str8_lit("stapsdt"), StringMatchFlag_CaseInsensitive)) { + if (note_type == ELF_NoteType_STapSdt) { + U64 desc_cursor = 0; + U64 addr_size = elf_class == ELF_Class_64 ? 8 : 4; + + U64 pc = 0; + U64 pc_size = str8_deserial_read(raw_desc, desc_cursor, &pc, addr_size, addr_size); + if (pc_size == 0) { goto exit; } + desc_cursor += pc_size; + + U64 base_addr = 0; + U64 base_addr_size = str8_deserial_read(raw_desc, desc_cursor, &base_addr, addr_size, addr_size); + if (base_addr_size == 0) { goto exit; } + desc_cursor += base_addr_size; + + U64 semaphore = 0; + U64 semaphore_size = str8_deserial_read(raw_desc, desc_cursor, &semaphore, addr_size, addr_size); + if (semaphore_size == 0) { goto exit; } + desc_cursor += semaphore_size; + + String8 provider = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size); + desc_cursor += provider.size + 1; + if (desc_cursor > raw_desc.size) { goto exit; } + + String8 probe = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size); + desc_cursor += probe.size + 1; + if (desc_cursor > raw_desc.size) { goto exit; } + + String8 args = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size); + desc_cursor += args.size + 1; + if (desc_cursor > raw_desc.size) { goto exit; } + + str8_list_pushf(scratch.arena, &desc_fmt, "Provider: %S", provider); + str8_list_pushf(scratch.arena, &desc_fmt, "Probe: %S", probe); + str8_list_pushf(scratch.arena, &desc_fmt, "PC: 0x%I64x", pc); + str8_list_pushf(scratch.arena, &desc_fmt, "Base: 0x%I64x", base_addr); + str8_list_pushf(scratch.arena, &desc_fmt, "Semaphore: 0x%I64x", semaphore); + str8_list_pushf(scratch.arena, &desc_fmt, "Arguments: %S", args); + + note_type_str = str8_lit("NT_STAPSDT"); + } + } + + if (note_type_str.size == 0) note_type_str = str8f(scratch.arena, "0x%x", note_type); + + str8_list_pushf(arena, &strings, "{"); + str8_list_pushf(arena, &strings, " Owner: %S", owner); + str8_list_pushf(arena, &strings, " Data Size: 0x%x", desc_size); + str8_list_pushf(arena, &strings, " Type: %S", note_type_str); + if (desc_fmt.node_count) { + str8_list_pushf(arena, &strings, " Description:"); + str8_list_pushf(arena, &strings, " {"); + for EachNode(n, String8Node, desc_fmt.first) { str8_list_pushf(arena, &strings, " %S", n->string); } + str8_list_pushf(arena, &strings, " }"); + } + str8_list_pushf(arena, &strings, "}"); + } + + is_bad_parse = 0; +exit:; + if (is_bad_parse) { + str8_list_pushf(arena, &strings, "ERROR: unable to parse data @ 0x%Ix64", cursor); + } + scratch_end(scratch); + return strings; +} + +internal String8List +elf_dump(Arena *arena, String8 raw_elf, ELF_DumpSubsetFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List strings = {0}; + ELF_Bin elf = elf_bin_from_data(scratch.arena, raw_elf); + + if (flags & ELF_DumpSubsetFlag_Note) { + for EachIndex(sect_idx, elf.shdrs.count) { + ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; + if (shdr->sh_type == ELF_ShType_Note) { + String8 raw_notes = str8_substr(raw_elf, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); + String8 shdr_name = elf_name_from_shdr64(raw_elf, &elf, shdr); + str8_list_pushf(scratch.arena, &strings, "//"); + str8_list_pushf(scratch.arena, &strings, "// %S", shdr_name); + str8_list_pushf(scratch.arena, &strings, "//"); + String8List note_strings = elf_dump_note(scratch.arena, raw_notes, elf.hdr.e_ident[ELF_Identifier_Class], elf.hdr.e_machine); + str8_list_concat_in_place(&strings, ¬e_strings); + } + } + } + + String8 out = str8_list_join(arena, &strings, &(StringJoin){.sep=str8_lit("\n"), .post=str8_lit("\n")}); + String8List result = {0}; + str8_list_push(arena, &result, out); + + scratch_end(scratch); + return result; +} diff --git a/src/elf/elf_dump.h b/src/elf/elf_dump.h new file mode 100644 index 00000000..5b920ffc --- /dev/null +++ b/src/elf/elf_dump.h @@ -0,0 +1,30 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef ELF_DUMP_H +#define ELF_DUMP_H + +#define ELF_DumpSubset_XList \ + X(Note, note, "NOTE") + +typedef U32 ELF_DumpSubset; +enum +{ +#define X(name, name_lower, title) ELF_DumpSubset_##name, + ELF_DumpSubset_XList +#undef X +}; + +typedef U32 ELF_DumpSubsetFlags; +enum +{ +#define X(name, name_lower, title) ELF_DumpSubsetFlag_##name = (1 << ELF_DumpSubset_##name), + ELF_DumpSubset_XList +#undef X + ELF_DumpSubsetFlag_All = ~0, +}; + +internal String8List elf_dump(Arena *arena, String8 raw_elf, ELF_DumpSubsetFlags flags); + +#endif // ELF_DUMP_H + diff --git a/src/gnu/gnu.c b/src/gnu/gnu.c index c56091f9..814d786f 100644 --- a/src/gnu/gnu.c +++ b/src/gnu/gnu.c @@ -51,3 +51,228 @@ gnu_rdebug_info64_from_rdebug_info32(GNU_RDebugInfo32 rdebug32) return result; } +internal String8 +gnu_string_from_abi_tag(GNU_AbiTag abi_tag) +{ + switch (abi_tag) { + case GNU_AbiTag_Linux: return str8_lit("Linux"); + case GNU_AbiTag_Hurd: return str8_lit("Hurd"); + case GNU_AbiTag_Solaris: return str8_lit("Solaris"); + case GNU_AbiTag_FreeBsd: return str8_lit("FreeBsd"); + case GNU_AbiTag_NetBsd: return str8_lit("NetBsd"); + case GNU_AbiTag_Syllable: return str8_lit("Syllable"); + case GNU_AbiTag_Nacl: return str8_lit("Nacl"); + } + return str8_zero(); +} + +internal String8 +gnu_string_from_note_type(GNU_NoteType note_type) +{ + switch (note_type) { + case GNU_NoteType_Abi: return str8_lit("GNU_Abi"); + case GNU_NoteType_HwCap: return str8_lit("GNU_HwCap"); + case GNU_NoteType_BuildId: return str8_lit("GNU_BuildId"); + case GNU_NoteType_GoldVersion: return str8_lit("GNU_GoldVersion"); + case GNU_NoteType_PropertyType0: return str8_lit("GNU_PropertyType0"); + } + return str8_zero(); +} + +internal String8 +gnu_string_from_property_x86(GNU_PropertyX86 prop) +{ + switch (prop) { + case GNU_PropertyX86_Feature1And: return str8_lit("Feature1And"); + case GNU_PropertyX86_Feature2Used: return str8_lit("Feature2Used"); + case GNU_PropertyX86_Isa1needed: return str8_lit("Isa1needed"); + case GNU_PropertyX86_Isa2Needed: return str8_lit("Isa2Needed"); + case GNU_PropertyX86_Isa1Used: return str8_lit("Isa1Used"); + case GNU_PropertyX86_Compat_isa_1_used: return str8_lit("Compat_isa_1_used"); + case GNU_PropertyX86_Compat_isa_1_needed: return str8_lit("Compat_isa_1_needed"); + case GNU_PropertyX86_UInt32AndHi: return str8_lit("UInt32AndHi"); + case GNU_PropertyX86_UInt32OrLo: return str8_lit("UInt32OrLo"); + case GNU_PropertyX86_UInt32OrHi: return str8_lit("UInt32OrHi"); + case GNU_PropertyX86_UInt32OrAndLo: return str8_lit("UInt32OrAndLo"); + case GNU_PropertyX86_UInt32OrAndHi: return str8_lit("UInt32OrAndHi"); + } + return str8_zero(); +} + +internal String8 +gnu_string_from_property_flags_x86(Arena *arena, GNU_PropertyX86 prop, U32 flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List fmt = {0}; + if (flags == 0) { + str8_list_pushf(scratch.arena, &fmt, "None"); + } + switch (prop) { + case GNU_PropertyX86_Isa1needed: + case GNU_PropertyX86_Isa1Used: { + if (flags & GNU_PropertyX86Isa1_BaseLine) { + str8_list_pushf(scratch.arena, &fmt, "BaseLine"); + flags &= ~GNU_PropertyX86Isa1_BaseLine; + } + if (flags & GNU_PropertyX86Isa1_V2) { + str8_list_pushf(scratch.arena, &fmt, "V2"); + flags &= ~GNU_PropertyX86Isa1_V2; + } + if (flags & GNU_PropertyX86Isa1_V3) { + str8_list_pushf(scratch.arena, &fmt, "V3"); + flags &= ~GNU_PropertyX86Isa1_V3; + } + if (flags & GNU_PropertyX86Isa1_V4) { + str8_list_pushf(scratch.arena, &fmt, "V4"); + flags &= ~GNU_PropertyX86Isa1_V4; + } + } break; + case GNU_PropertyX86_Feature1And: { + if (flags & GNU_PropertyX86Feature1_Ibt) { + str8_list_pushf(scratch.arena, &fmt, "Ibt"); + flags &= ~GNU_PropertyX86Feature1_Ibt; + } + if (flags & GNU_PropertyX86Feature1_Shstk) { + str8_list_pushf(scratch.arena, &fmt, "Shstk"); + flags &= ~GNU_PropertyX86Feature1_Shstk; + } + if (flags & GNU_PropertyX86Feature1_LamU48) { + str8_list_pushf(scratch.arena, &fmt, "LamU48"); + flags &= ~GNU_PropertyX86Feature1_LamU48; + } + if (flags & GNU_PropertyX86Feature1_LamU57) { + str8_list_pushf(scratch.arena, &fmt, "LamU57"); + flags &= ~GNU_PropertyX86Feature1_LamU57; + } + } break; + case GNU_PropertyX86_Feature2Used: { + if (flags & GNU_PropertyX86Feature2_X86) { + str8_list_pushf(scratch.arena, &fmt, "X86"); + flags &= ~GNU_PropertyX86Feature2_X86; + } + if (flags & GNU_PropertyX86Feature2_X87) { + str8_list_pushf(scratch.arena, &fmt, "X87"); + flags &= ~GNU_PropertyX86Feature2_X87; + } + if (flags & GNU_PropertyX86Feature2_MMX) { + str8_list_pushf(scratch.arena, &fmt, "MMX"); + flags &= ~GNU_PropertyX86Feature2_MMX; + } + if (flags & GNU_PropertyX86Feature2_XMM) { + str8_list_pushf(scratch.arena, &fmt, "XMM"); + flags &= ~GNU_PropertyX86Feature2_XMM; + } + if (flags & GNU_PropertyX86Feature2_YMM) { + str8_list_pushf(scratch.arena, &fmt, "YMM"); + flags &= ~GNU_PropertyX86Feature2_YMM; + } + if (flags & GNU_PropertyX86Feature2_ZMM) { + str8_list_pushf(scratch.arena, &fmt, "ZMM"); + flags &= ~GNU_PropertyX86Feature2_ZMM; + } + if (flags & GNU_PropertyX86Feature2_FXSR) { + str8_list_pushf(scratch.arena, &fmt, "FXSR"); + flags &= ~GNU_PropertyX86Feature2_FXSR; + } + if (flags & GNU_PropertyX86Feature2_XSAVE) { + str8_list_pushf(scratch.arena, &fmt, "XSAVE"); + flags &= ~GNU_PropertyX86Feature2_XSAVE; + } + if (flags & GNU_PropertyX86Feature2_XSAVEOPT) { + str8_list_pushf(scratch.arena, &fmt, "XSAVEOPT"); + flags &= ~GNU_PropertyX86Feature2_XSAVEOPT; + } + if (flags & GNU_PropertyX86Feature2_XSAVEC) { + str8_list_pushf(scratch.arena, &fmt, "XSAVEC"); + flags &= ~GNU_PropertyX86Feature2_XSAVEC; + } + if (flags & GNU_PropertyX86Feature2_TMM) { + str8_list_pushf(scratch.arena, &fmt, "TMM"); + flags &= ~GNU_PropertyX86Feature2_TMM; + } + if (flags & GNU_PropertyX86Feature2_MASK) { + str8_list_pushf(scratch.arena, &fmt, "MASK"); + flags &= ~GNU_PropertyX86Feature2_MASK; + } + } break; + case GNU_PropertyX86_Compat_isa_1_used: + case GNU_PropertyX86_Compat_isa_1_needed: { + if (flags & GNU_PropertyX86Compat1Isa1_486) { + str8_list_pushf(scratch.arena, &fmt, "486"); + flags &= ~GNU_PropertyX86Compat1Isa1_486; + } + if (flags & GNU_PropertyX86Compat1Isa1_586) { + str8_list_pushf(scratch.arena, &fmt, "586"); + flags &= ~GNU_PropertyX86Compat1Isa1_586; + } + if (flags & GNU_PropertyX86Compat1Isa1_686) { + str8_list_pushf(scratch.arena, &fmt, "686"); + flags &= ~GNU_PropertyX86Compat1Isa1_686; + } + if (flags & GNU_PropertyX86Compat1Isa1_SSE) { + str8_list_pushf(scratch.arena, &fmt, "SSE"); + flags &= ~GNU_PropertyX86Compat1Isa1_SSE; + } + if (flags & GNU_PropertyX86Compat1Isa1_SSE2) { + str8_list_pushf(scratch.arena, &fmt, "SSE2"); + flags &= ~GNU_PropertyX86Compat1Isa1_SSE2; + } + if (flags & GNU_PropertyX86Compat1Isa1_SSE3) { + str8_list_pushf(scratch.arena, &fmt, "SSE3"); + flags &= ~GNU_PropertyX86Compat1Isa1_SSE3; + } + if (flags & GNU_PropertyX86Compat1Isa1_SSSE3) { + str8_list_pushf(scratch.arena, &fmt, "SSSE3"); + flags &= ~GNU_PropertyX86Compat1Isa1_SSSE3; + } + if (flags & GNU_PropertyX86Compat1Isa1_SSE4_1) { + str8_list_pushf(scratch.arena, &fmt, "SSE4_1"); + flags &= ~GNU_PropertyX86Compat1Isa1_SSE4_1; + } + if (flags & GNU_PropertyX86Compat1Isa1_SSE4_2) { + str8_list_pushf(scratch.arena, &fmt, "SSE4_2"); + flags &= ~GNU_PropertyX86Compat1Isa1_SSE4_2; + } + if (flags & GNU_PropertyX86Compat1Isa1_AVX) { + str8_list_pushf(scratch.arena, &fmt, "AVX"); + flags &= ~GNU_PropertyX86Compat1Isa1_AVX; + } + if (flags & GNU_PropertyX86Compat1Isa1_AVX2) { + str8_list_pushf(scratch.arena, &fmt, "AVX2"); + flags &= ~GNU_PropertyX86Compat1Isa1_AVX2; + } + if (flags & GNU_PropertyX86Compat1Isa1_AVX512F) { + str8_list_pushf(scratch.arena, &fmt, "AVX512F"); + flags &= ~GNU_PropertyX86Compat1Isa1_AVX512F; + } + if (flags & GNU_PropertyX86Compat1Isa1_AVX512ER) { + str8_list_pushf(scratch.arena, &fmt, "AVX512ER"); + flags &= ~GNU_PropertyX86Compat1Isa1_AVX512ER; + } + if (flags & GNU_PropertyX86Compat1Isa1_AVX512PF) { + str8_list_pushf(scratch.arena, &fmt, "AVX512PF"); + flags &= ~GNU_PropertyX86Compat1Isa1_AVX512PF; + } + if (flags & GNU_PropertyX86Compat1Isa1_AVX512VL) { + str8_list_pushf(scratch.arena, &fmt, "AVX512VL"); + flags &= ~GNU_PropertyX86Compat1Isa1_AVX512VL; + } + if (flags & GNU_PropertyX86Compat1Isa1_AVX512DQ) { + str8_list_pushf(scratch.arena, &fmt, "AVX512DQ"); + flags &= ~GNU_PropertyX86Compat1Isa1_AVX512DQ; + } + if (flags & GNU_PropertyX86Compat1Isa1_AVX512BW) { + str8_list_pushf(scratch.arena, &fmt, "AVX512BW"); + flags &= ~GNU_PropertyX86Compat1Isa1_AVX512BW; + } + } break; + } + if (flags) { + str8_list_pushf(scratch.arena, &fmt, "Unknown: 0x%x", flags); + } + + String8 result = str8_list_join(arena, &fmt, &(StringJoin){.sep = str8_lit(", ")}); + scratch_end(scratch); + return result; +} + diff --git a/src/gnu/gnu.h b/src/gnu/gnu.h index 679f11c9..37f15007 100644 --- a/src/gnu/gnu.h +++ b/src/gnu/gnu.h @@ -4,6 +4,145 @@ #ifndef GNU_H #define GNU_H +typedef ELF_NoteType GNU_NoteType; +enum +{ + GNU_NoteType_Abi = 1, + GNU_NoteType_HwCap = 2, + GNU_NoteType_BuildId = 3, + GNU_NoteType_GoldVersion = 4, + GNU_NoteType_PropertyType0 = 5, +}; + +typedef U32 GNU_Property; +enum +{ + GNU_Property_LoProc = 0xc0000000, + // processor-specific range + GNU_Property_HiProc = 0xdfffffff, + GNU_Property_LoUser = 0xe0000000, + // application-specific range + GNU_Property_HiUser = 0xffffffff, + GNU_Property_StackSize = 1, + GNU_Property_NoCopyOnProtected = 2, +}; + +typedef U32 GNU_PropertyX86Isa1; +enum +{ + GNU_PropertyX86Isa1_BaseLine = (1 << 0), + GNU_PropertyX86Isa1_V2 = (1 << 1), + GNU_PropertyX86Isa1_V3 = (1 << 2), + GNU_PropertyX86Isa1_V4 = (1 << 3), +}; + +typedef U32 GNU_PropertyX86Compat1Isa1; +enum +{ + GNU_PropertyX86Compat1Isa1_486 = (1 << 0), + GNU_PropertyX86Compat1Isa1_586 = (1 << 1), + GNU_PropertyX86Compat1Isa1_686 = (1 << 2), + GNU_PropertyX86Compat1Isa1_SSE = (1 << 3), + GNU_PropertyX86Compat1Isa1_SSE2 = (1 << 4), + GNU_PropertyX86Compat1Isa1_SSE3 = (1 << 5), + GNU_PropertyX86Compat1Isa1_SSSE3 = (1 << 6), + GNU_PropertyX86Compat1Isa1_SSE4_1 = (1 << 7), + GNU_PropertyX86Compat1Isa1_SSE4_2 = (1 << 8), + GNU_PropertyX86Compat1Isa1_AVX = (1 << 9), + GNU_PropertyX86Compat1Isa1_AVX2 = (1 << 10), + GNU_PropertyX86Compat1Isa1_AVX512F = (1 << 11), + GNU_PropertyX86Compat1Isa1_AVX512ER = (1 << 12), + GNU_PropertyX86Compat1Isa1_AVX512PF = (1 << 13), + GNU_PropertyX86Compat1Isa1_AVX512VL = (1 << 14), + GNU_PropertyX86Compat1Isa1_AVX512DQ = (1 << 15), + GNU_PropertyX86Compat1Isa1_AVX512BW = (1 << 16), +}; + +typedef U32 GNU_PropertyX86Compat2Isa1; +enum +{ + GNU_PropertyX86Compat2Isa1_CMOVE = (1 << 0), + GNU_PropertyX86Compat2Isa1_SSE = (1 << 1), + GNU_PropertyX86Compat2Isa1_SSE2 = (1 << 2), + GNU_PropertyX86Compat2Isa1_SSE3 = (1 << 3), + GNU_PropertyX86Compat2Isa1_SSE4_1 = (1 << 4), + GNU_PropertyX86Compat2Isa1_SSE4_2 = (1 << 5), + GNU_PropertyX86Compat2Isa1_AVX = (1 << 6), + GNU_PropertyX86Compat2Isa1_AVX2 = (1 << 7), + GNU_PropertyX86Compat2Isa1_FMA = (1 << 8), + GNU_PropertyX86Compat2Isa1_AVX512F = (1 << 9), + GNU_PropertyX86Compat2Isa1_AVX512CD = (1 << 10), + GNU_PropertyX86Compat2Isa1_AVX512ER = (1 << 11), + GNU_PropertyX86Compat2Isa1_AVX512PF = (1 << 12), + GNU_PropertyX86Compat2Isa1_AVX512VL = (1 << 13), + GNU_PropertyX86Compat2Isa1_AVX512DQ = (1 << 14), + GNU_PropertyX86Compat2Isa1_AVX512BW = (1 << 15), + GNU_PropertyX86Compat2Isa1_AVX512_4FMAPS = (1 << 16), + GNU_PropertyX86Compat2Isa1_AVX512_4VNNIW = (1 << 17), + GNU_PropertyX86Compat2Isa1_AVX512_BITALG = (1 << 18), + GNU_PropertyX86Compat2Isa1_AVX512_IFMA = (1 << 19), + GNU_PropertyX86Compat2Isa1_AVX512_VBMI = (1 << 20), + GNU_PropertyX86Compat2Isa1_AVX512_VBMI2 = (1 << 21), + GNU_PropertyX86Compat2Isa1_AVX512_VNNI = (1 << 22), + GNU_PropertyX86Compat2Isa1_AVX512_BF16 = (1 << 23), +}; + +typedef GNU_Property GNU_PropertyX86; +enum +{ + GNU_PropertyX86_Feature1And = 0xc0000002, + GNU_PropertyX86_Feature2Used = 0xc0010001, + GNU_PropertyX86_Isa1needed = 0xc0008002, + GNU_PropertyX86_Isa2Needed = 0xc0008001, + GNU_PropertyX86_Isa1Used = 0xc0010002, + GNU_PropertyX86_Compat_isa_1_used = 0xc0000000, + GNU_PropertyX86_Compat_isa_1_needed = 0xc0000001, + GNU_PropertyX86_UInt32AndLo = GNU_PropertyX86_Feature1And, + GNU_PropertyX86_UInt32AndHi = 0xc0007fff, + GNU_PropertyX86_UInt32OrLo = 0xc0008000, + GNU_PropertyX86_UInt32OrHi = 0xc000ffff, + GNU_PropertyX86_UInt32OrAndLo = 0xc0010000, + GNU_PropertyX86_UInt32OrAndHi = 0xc0017fff, +}; + +typedef U32 GNU_PropertyX86Feature1; +enum +{ + GNU_PropertyX86Feature1_Ibt = (1 << 0), + GNU_PropertyX86Feature1_Shstk = (1 << 1), + GNU_PropertyX86Feature1_LamU48 = (1 << 2), + GNU_PropertyX86Feature1_LamU57 = (1 << 3), +}; + +typedef U32 GNU_PropertyX86Feature2; +enum +{ + GNU_PropertyX86Feature2_X86 = (1 << 0), + GNU_PropertyX86Feature2_X87 = (1 << 1), + GNU_PropertyX86Feature2_MMX = (1 << 2), + GNU_PropertyX86Feature2_XMM = (1 << 3), + GNU_PropertyX86Feature2_YMM = (1 << 4), + GNU_PropertyX86Feature2_ZMM = (1 << 5), + GNU_PropertyX86Feature2_FXSR = (1 << 6), + GNU_PropertyX86Feature2_XSAVE = (1 << 7), + GNU_PropertyX86Feature2_XSAVEOPT = (1 << 8), + GNU_PropertyX86Feature2_XSAVEC = (1 << 9), + GNU_PropertyX86Feature2_TMM = (1 << 10), + GNU_PropertyX86Feature2_MASK = (1 << 11), +}; + +typedef U32 GNU_AbiTag; +enum +{ + GNU_AbiTag_Linux = 0, + GNU_AbiTag_Hurd = 1, + GNU_AbiTag_Solaris = 2, + GNU_AbiTag_FreeBsd = 3, + GNU_AbiTag_NetBsd = 4, + GNU_AbiTag_Syllable = 5, + GNU_AbiTag_Nacl = 6, +}; + typedef struct GNU_LinkMap64 { U64 addr_vaddr; @@ -55,4 +194,11 @@ internal GNU_LinkMap64 elf_linkmap64_from_linkmap32(GNU_LinkMap32 linkmap32); internal U64 gnu_rdebug_info_size_from_arch(Arch arch); internal U64 gnu_r_brk_offset_from_arch(Arch arch); +//////////////////////////////// +//~ enum + +internal String8 gnu_string_from_abi_tag(GNU_AbiTag abi_tag); +internal String8 gnu_string_from_note_type(GNU_NoteType note_type); +internal String8 gnu_string_from_property_x86(GNU_PropertyX86 prop); + #endif // GNU_H diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index b692d61d..3811d462 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1039,8 +1039,9 @@ rb_thread_entry_point(void *p) //- rjf: unpack dump subset flags RDI_DumpSubsetFlags rdi_dump_subset_flags = RDI_DumpSubsetFlag_All; - DW_DumpSubsetFlags dw_dump_subset_flags = DW_DumpSubsetFlag_All; - EH_DumpSubsetFlags eh_dump_subset_flags = EH_DumpSubsetFlag_All; + DW_DumpSubsetFlags dw_dump_subset_flags = DW_DumpSubsetFlag_All; + EH_DumpSubsetFlags eh_dump_subset_flags = EH_DumpSubsetFlag_All; + ELF_DumpSubsetFlags elf_dump_subset_flags = ELF_DumpSubsetFlag_All; { String8List only_names = cmd_line_strings(cmdline, str8_lit("only")); if(only_names.node_count != 0) @@ -1060,6 +1061,9 @@ rb_thread_entry_point(void *p) #undef X #define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { eh_dump_subset_flags |= EH_DumpSubsetFlag_##name; } EH_DumpSubset_XList +#undef X +#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { elf_dump_subset_flags |= ELF_DumpSubsetFlag_##name; } + ELF_DumpSubset_XList #undef X } String8List omit_names = cmd_line_strings(cmdline, str8_lit("omit")); @@ -1074,6 +1078,9 @@ rb_thread_entry_point(void *p) #undef X #define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { eh_dump_subset_flags &= ~EH_DumpSubsetFlag_##name; } EH_DumpSubset_XList +#undef X +#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { elf_dump_subset_flags &= ~ELF_DumpSubsetFlag_##name; } + ELF_DumpSubset_XList #undef X } } @@ -1089,14 +1096,14 @@ rb_thread_entry_point(void *p) lane_sync(); //- rjf: unpack file parses - Arch arch = Arch_Null; - PE_BinInfo pe = {0}; - ELF_Bin elf = {0}; - DW_Input dw = {0}; - U64 eh_frame_hdr_vaddr = 0; - U64 eh_frame_vaddr = 0; - String8 eh_frame_hdr = {0}; - String8 eh_frame = {0}; + Arch arch = Arch_Null; + PE_BinInfo pe = {0}; + ELF_Bin elf = {0}; + DW_Input dw = {0}; + U64 eh_frame_hdr_vaddr = 0; + U64 eh_frame_vaddr = 0; + String8 eh_frame_hdr = {0}; + String8 eh_frame = {0}; { if(f->format == RB_FileFormat_PE) { @@ -1184,7 +1191,8 @@ rb_thread_entry_point(void *p) case RB_FileFormat_ELF32: case RB_FileFormat_ELF64: { - // TODO(rjf) + String8List elf_strings = elf_dump(arena, f->data, elf_dump_subset_flags); + str8_list_concat_in_place(&output_blobs, &elf_strings); }break; //- rjf: RDI file diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index e1abc2fc..5b742c04 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -19,7 +19,9 @@ #include "coff/coff_inc.h" #include "pe/pe.h" #include "elf/elf.h" +#include "gnu/gnu.h" #include "elf/elf_parse.h" +#include "elf/elf_dump.h" #include "codeview/codeview.h" #include "codeview/codeview_parse.h" #include "dwarf/dwarf_inc.h" @@ -43,7 +45,9 @@ #include "coff/coff_inc.c" #include "pe/pe.c" #include "elf/elf.c" +#include "gnu/gnu.c" #include "elf/elf_parse.c" +#include "elf/elf_dump.c" #include "codeview/codeview.c" #include "codeview/codeview_parse.c" #include "dwarf/dwarf_inc.c" From 6cc7b5622c8e1020f29e88acb4dd7a4b6f35081a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Oct 2025 16:25:53 -0700 Subject: [PATCH 039/850] ELF note parser --- src/elf/elf.h | 9 --------- src/elf/elf_parse.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/elf/elf_parse.h | 35 ++++++++++++++++++++++++++++++----- 3 files changed, 75 insertions(+), 14 deletions(-) diff --git a/src/elf/elf.h b/src/elf/elf.h index ddc6950e..a46413c3 100644 --- a/src/elf/elf.h +++ b/src/elf/elf.h @@ -784,15 +784,6 @@ typedef struct U16 vs_vers; } ELF_ExternalVersym; -typedef struct -{ - U32 name_size; - U32 desc_size; - U32 type; - // name + desc - // U8 data[1]; -} ELF_Note; - //////////////////////////////// // Extensions diff --git a/src/elf/elf_parse.c b/src/elf/elf_parse.c index 5949ebad..77efa627 100644 --- a/src/elf/elf_parse.c +++ b/src/elf/elf_parse.c @@ -164,3 +164,48 @@ elf_gnu_debug_link_from_bin(String8 raw_data, ELF_Bin *bin) } return result; } + +internal ELF_NoteList +elf_parse_note(Arena *arena, String8 raw_note, ELF_Class elf_class, ELF_MachineKind e_machine) +{ + ELF_NoteList result = {0}; + + for (U64 cursor = 0; cursor < raw_note.size; ) { + U32 owner_size; + U64 owner_size_size = str8_deserial_read_struct(raw_note, cursor, &owner_size); + if (owner_size_size == 0) { goto exit; } + cursor += owner_size_size; + + U32 desc_size; + U64 desc_size_size = str8_deserial_read_struct(raw_note, cursor, &desc_size); + if (desc_size_size == 0) { goto exit; } + cursor += desc_size_size; + + ELF_NoteType type; + U64 type_size = str8_deserial_read_struct(raw_note, cursor, &type); + if (type_size == 0) { goto exit; } + cursor += type_size; + + if (cursor + owner_size > raw_note.size) { goto exit; } + String8 owner = str8_cstring_capped(raw_note.str + cursor, raw_note.str + cursor + owner_size); + cursor += owner_size; + + if (cursor + desc_size > raw_note.size) { goto exit; } + String8 desc = str8_substr(raw_note, r1u64(cursor, cursor + desc_size)); + cursor += desc_size; + cursor = AlignPow2(cursor, 4); + + ELF_NoteNode *n = push_array(arena, ELF_NoteNode, 1); + n->v.owner = owner; + n->v.desc = desc; + n->v.type = type; + + SLLQueuePush(result.first, result.last, n); + result.count += 1; + } + +exit:; + return result; +} + + diff --git a/src/elf/elf_parse.h b/src/elf/elf_parse.h index 70a467e8..f15708c8 100644 --- a/src/elf/elf_parse.h +++ b/src/elf/elf_parse.h @@ -10,22 +10,22 @@ typedef struct ELF_Shdr64Array ELF_Shdr64Array; struct ELF_Shdr64Array { + U64 count; ELF_Shdr64 *v; - U64 count; }; typedef struct ELF_Phdr64Array ELF_Phdr64Array; struct ELF_Phdr64Array { + U64 count; ELF_Phdr64 *v; - U64 count; }; typedef struct ELF_Bin ELF_Bin; struct ELF_Bin { - ELF_Hdr64 hdr; - Rng1U64 sh_name_range; + ELF_Hdr64 hdr; + Rng1U64 sh_name_range; ELF_Shdr64Array shdrs; ELF_Phdr64Array phdrs; }; @@ -34,7 +34,30 @@ typedef struct ELF_GnuDebugLink ELF_GnuDebugLink; struct ELF_GnuDebugLink { String8 path; - U32 checksum; + U32 checksum; +}; + +typedef struct ELF_Note ELF_Note; +struct ELF_Note +{ + String8 owner; + ELF_NoteType type; + String8 desc; +}; + +typedef struct ELF_NoteNode ELF_NoteNode; +struct ELF_NoteNode +{ + ELF_Note v; + ELF_NoteNode *next; +}; + +typedef struct ELF_NoteList ELF_NoteList; +struct ELF_NoteList +{ + U64 count; + ELF_NoteNode *first; + ELF_NoteNode *last; }; //////////////////////////////// @@ -49,4 +72,6 @@ internal String8 elf_name_from_shdr64(String8 raw_data, ELF_Bin *bin, ELF_Shdr64 internal U64 elf_base_addr_from_bin(ELF_Bin *bin); internal ELF_GnuDebugLink elf_gnu_debug_link_from_bin(String8 raw_data, ELF_Bin *bin); +internal ELF_NoteList elf_parse_note(Arena *arena, String8 raw_note, ELF_Class elf_class, ELF_MachineKind e_machine); + #endif // ELF_PARSE_H From fdb1ad5ab6c8c24bdfc87d929cca44290bfe7e86 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Oct 2025 16:27:34 -0700 Subject: [PATCH 040/850] do not unwind with PE when DWARF unwinder exits with stale flag --- src/ctrl/ctrl_core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 35f8da05..4b81d987 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1567,7 +1567,8 @@ ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle { U64 current_reg_gen = ctrl_reg_gen(); B32 need_stale = 1; - if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(handle.dmn_handle, result)) + if(node->reg_gen != current_reg_gen && + dmn_thread_read_reg_block(handle.dmn_handle, result)) { if(node != 0) { @@ -2981,7 +2982,7 @@ ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, result = ctrl_unwind_step__dwarf(process, module, arch, reg_block, endt_us); - if(result.flags != 0) + if(result.flags == CTRL_UnwindFlag_Error && ~result.flags & CTRL_UnwindFlag_Stale) { switch(arch) { From 0d5df8f38dda2f6380880761fca4ce76b7e43829 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Oct 2025 16:29:15 -0700 Subject: [PATCH 041/850] ELF includes --- src/raddbg/raddbg_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 021be7f5..e1f2e543 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -210,8 +210,9 @@ #include "coff/coff_parse.h" #include "pe/pe.h" #include "elf/elf.h" -#include "elf/elf_parse.h" #include "gnu/gnu.h" +#include "elf/elf_parse.h" +#include "elf/elf_dump.h" #include "codeview/codeview.h" #include "codeview/codeview_parse.h" #include "msf/msf.h" @@ -259,8 +260,9 @@ #include "coff/coff_parse.c" #include "pe/pe.c" #include "elf/elf.c" -#include "elf/elf_parse.c" #include "gnu/gnu.c" +#include "elf/elf_parse.c" +#include "elf/elf_dump.c" #include "codeview/codeview.c" #include "codeview/codeview_parse.c" #include "msf/msf.c" From c4c9ef51820b72b9268f6d43433ac136e61b2bc3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Oct 2025 16:35:42 -0700 Subject: [PATCH 042/850] WIP: got Linux to the point where single stepping and breakpoint events are being reported correctly to the debugger --- src/demon/demon_core.h | 8 + src/demon/linux/demon_core_linux.c | 2537 ++++++++++++++++++---------- src/demon/linux/demon_core_linux.h | 332 ++-- 3 files changed, 1850 insertions(+), 1027 deletions(-) diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index e158e8ab..ccdf6bef 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -138,6 +138,14 @@ struct DMN_TrapChunkList U64 trap_count; }; +typedef struct DMN_ActiveTrap DMN_ActiveTrap; +struct DMN_ActiveTrap +{ + DMN_Trap *trap; + U8 swap_byte; + DMN_ActiveTrap *next; +}; + typedef struct DMN_RunCtrls DMN_RunCtrls; struct DMN_RunCtrls { diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index da822d95..59f60572 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -7,25 +7,41 @@ //- rjf: file descriptor memory reading/writing helpers internal U64 -dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst) +dmn_lnx_size_from_fd(int memory_fd, U64 cap) { - U64 bytes_read = 0; - U8 *ptr = (U8 *)dst; - U8 *opl = ptr + dim_1u64(range); - U64 cursor = range.min; - for(;ptr < opl;) + U8 temp[4096]; + size_t cursor = 0; + while(cursor < cap) { - size_t to_read = (size_t)(opl - ptr); - ssize_t actual_read = pread(memory_fd, ptr, to_read, cursor); - if(actual_read == -1) + ssize_t actual_read = pread(memory_fd, temp, sizeof(temp), cursor); + if(actual_read < 0) { + if(errno == EINTR) { continue; } break; } - ptr += actual_read; - cursor += actual_read; - bytes_read += actual_read; + if(actual_read == 0) { break; } + cursor += (U64)actual_read; } - return bytes_read; + return (U64)cursor; +} + +internal U64 +dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst) +{ + size_t cursor = 0, size = dim_1u64(range); + while(cursor < size) + { + size_t to_read = size - cursor; + ssize_t actual_read = pread(memory_fd, (U8 *)dst + cursor, to_read, range.min + cursor); + if(actual_read < 0) + { + if(errno == EINTR) { continue; } + break; + } + if(actual_read == 0) { break; } + cursor += actual_read; + } + return (U64)cursor; } internal B32 @@ -51,11 +67,11 @@ dmn_lnx_write(int memory_fd, Rng1U64 range, void *src) } internal String8 -dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr) +dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size) { String8 result = {0}; U64 string_size = 0; - for(U64 vaddr = base_vaddr; string_size < 4096; vaddr += 1, string_size += 1) + for(U64 vaddr = base_vaddr; string_size < cap_size; vaddr += 1, string_size += 1) { char byte = 0; if(pread(memory_fd, &byte, sizeof(byte), vaddr) == 0) @@ -77,6 +93,199 @@ dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr) return result; } +internal String8 +dmn_lnx_read_string(Arena *arena, int memory_fd, U64 vaddr) +{ + return dmn_lnx_read_string_capped(arena, memory_fd, vaddr, 4096); +} + +//////////////////////////////// +//~ Runtime Struct Helpers + +internal B32 +dmn_lnx_read_ehdr(int memory_fd, U64 addr, ELF_Hdr64 *ehdr_out) +{ + B32 is_read = 0; + U8 e_ident[ELF_Identifier_Max] = {0}; + U64 e_ident_size = dmn_lnx_read(memory_fd, r1u64(addr, addr + sizeof(e_ident)), &e_ident); + if(e_ident_size == sizeof(e_ident)) + { + if(str8_match(str8_prefix(str8_array_fixed(e_ident), elf_magic_string.size), elf_magic_string, 0)) + { + switch(e_ident[ELF_Identifier_Class]) + { + default:{InvalidPath;}break; + case ELF_Class_None: {}break; + case ELF_Class_32: + { + ELF_Hdr32 ehdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &ehdr32)) + { + *ehdr_out = elf_hdr64_from_hdr32(ehdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, ehdr_out); + }break; + } + } + } + return is_read; +} + +internal B32 +dmn_lnx_read_phdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr_out) +{ + B32 is_read = 0; + switch (elf_class) + { + case ELF_Class_None: break; + case ELF_Class_32: + { + ELF_Phdr32 phdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &phdr32)) + { + *phdr_out = elf_phdr64_from_phdr32(phdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, phdr_out); + }break; + default:{NotImplemented;}break; + } + return is_read; +} + +internal B32 +dmn_lnx_read_shdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr_out) +{ + B32 is_read = 0; + switch (elf_class) + { + case ELF_Class_None: break; + case ELF_Class_32: + { + ELF_Shdr32 shdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &shdr32)) + { + *shdr_out = elf_shdr64_from_shdr32(shdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, shdr_out); + }break; + default:{NotImplemented;}break; + } + return is_read; +} + +internal B32 +dmn_lnx_read_linkmap(int memory_fd, U64 addr, ELF_Class elf_class, GNU_LinkMap64 *linkmap_out) +{ + B32 is_read = 0; + switch(elf_class) + { + case ELF_Class_None: {}break; + case ELF_Class_32: + { + // TODO(rjf): endianness + GNU_LinkMap32 linkmap32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &linkmap32)) + { + *linkmap_out = gnu_linkmap64_from_linkmap32(linkmap32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, linkmap_out); + }break; + default:{NotImplemented;}break; + } + return is_read; +} + +internal B32 +dmn_lnx_read_dynamic(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dyn_out) +{ + B32 is_read = 0; + switch(elf_class) + { + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Dyn32 dyn32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &dyn32)) + { + *dyn_out = elf_dyn64_from_dyn32(dyn32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, dyn_out); + }break; + default:{NotImplemented;}break; + } + return is_read; +} + +internal B32 +dmn_lnx_read_symbol(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Sym64 *symbol_out) +{ + B32 is_read = 0; + switch(elf_class) + { + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Sym32 symbol32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &symbol32)) + { + *symbol_out = elf_sym64_from_sym32(symbol32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, symbol_out); + }break; + default:{NotImplemented;}break; + } + return is_read; +} + +internal B32 +dmn_lnx_read_r_debug(int memory_fd, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebug_out) +{ + B32 is_read = 0; + switch(gnu_rdebug_info_size_from_arch(arch)) + { + case 0: {} break; + case sizeof(GNU_RDebugInfo32): { + GNU_RDebugInfo32 rdebug32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &rdebug32)) + { + *rdebug_out = gnu_rdebug_info64_from_rdebug_info32(rdebug32); + is_read = 1; + } + }break; + case sizeof(GNU_RDebugInfo64): + { + is_read = dmn_lnx_read_struct(memory_fd, addr, rdebug_out); + }break; + default:{InvalidPath;}break; + } + Assert(is_read); + return is_read; +} + //- rjf: pid => info extraction internal String8 @@ -121,174 +330,115 @@ dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) return result; } -internal Arch -dmn_lnx_arch_from_pid(pid_t pid) -{ - Arch result = Arch_Null; - { - Temp scratch = scratch_begin(0, 0); - String8 exe_path = dmn_lnx_exe_path_from_pid(scratch.arena, pid); - - // rjf: unpack exe handle - int exe_fd = -1; - if(exe_path.size != 0) - { - exe_fd = open((char*)exe_path.str, O_RDONLY); - } - - // rjf: unpack elf identifier - U8 e_ident[ELF_Identifier_Max] = {0}; - B32 is_elf = 0; - U8 elf_class = 0; - if(exe_fd >= 0 && - pread(exe_fd, e_ident, sizeof(e_ident), 0) == sizeof(e_ident)) - { - is_elf = (e_ident[ELF_Identifier_Mag0] == 0x7f && - e_ident[ELF_Identifier_Mag1] == 'E' && - e_ident[ELF_Identifier_Mag2] == 'L' && - e_ident[ELF_Identifier_Mag3] == 'F'); - elf_class = e_ident[ELF_Identifier_Class]; - } - - // rjf: read elf header - ELF_Hdr64 hdr = {0}; - switch(elf_class) - { - case 1: - { - ELF_Hdr32 hdr32 = {0}; - if(pread(exe_fd, &hdr32, sizeof(hdr32), 0) == sizeof(hdr32)) - { - hdr = elf_hdr64_from_hdr32(hdr32); - } - }break; - case 2: - { - pread(exe_fd, &hdr, sizeof(hdr), 0); - }break; - } - - // rjf: determine arch from elf machine kind - result = arch_from_elf_machine(hdr.e_machine); - - close(exe_fd); - scratch_end(scratch); - } - return result; -} - -internal DMN_LNX_ProcessAux -dmn_lnx_aux_from_pid(pid_t pid, Arch arch) +internal ELF_Hdr64 +dmn_lnx_ehdr_from_pid(pid_t pid) { Temp scratch = scratch_begin(0, 0); - DMN_LNX_ProcessAux result = {0}; + B32 is_read = 0; + ELF_Hdr64 exe = {0}; + String8 exe_path = dmn_lnx_exe_path_from_pid(scratch.arena, pid); + if(exe_path.size != 0) + { + int exe_fd = open((char *)exe_path.str, O_RDONLY); + if(exe_fd != -1) + { + is_read = dmn_lnx_read_ehdr(exe_fd, 0, &exe); + close(exe_fd); + } + } + Assert(is_read); + scratch_end(scratch); + return exe; +} + +internal DMN_LNX_ProcessAuxv +dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) +{ + Temp scratch = scratch_begin(0, 0); + DMN_LNX_ProcessAuxv result = {0}; // rjf: open aux data String8 auxv_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int aux_fd = open((char*)auxv_path.str, O_RDONLY); + int auxv_fd = open((char*)auxv_path.str, O_RDONLY); // rjf: scan aux data - if(aux_fd >= 0) + if(auxv_fd >= 0) { - B32 addr_32bit = (arch == Arch_x86 || arch == Arch_arm32); for(;;) { - result.filled = 1; - // rjf: read next aux - U64 type = 0; - U64 val = 0; - if(addr_32bit) + ELF_Auxv64 auxv = {0}; + switch(elf_class) { - ELF_Auxv32 aux = {0}; - if(read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)) + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Auxv32 auxv32 = {0}; + if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) { goto brkloop; } - type = aux.a_type; - val = aux.a_val; - } - else + auxv = elf_auxv64_from_auxv32(auxv32); + }break; + case ELF_Class_64: { - ELF_Auxv64 aux = {0}; - if(read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)) + if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) { goto brkloop; } - type = aux.a_type; - val = aux.a_val; + }break; + default:{NotImplemented;}break; } // rjf: fill result - switch(type) + switch(auxv.a_type) { default:{}break; case ELF_AuxType_Null: goto brkloop; break; - case ELF_AuxType_Phnum: result.phnum = val; break; - case ELF_AuxType_Phent: result.phent = val; break; - case ELF_AuxType_Phdr: result.phdr = val; break; - case ELF_AuxType_ExecFn: result.execfn = val; break; - case ELF_AuxType_Pagesz: result.pagesz = val; break; + case ELF_AuxType_Base: result.base = auxv.a_val; break; + case ELF_AuxType_Phnum: result.phnum = auxv.a_val; break; + case ELF_AuxType_Phent: result.phent = auxv.a_val; break; + case ELF_AuxType_Phdr: result.phdr = auxv.a_val; break; + case ELF_AuxType_ExecFn: result.execfn = auxv.a_val; break; + case ELF_AuxType_Pagesz: result.pagesz = auxv.a_val; break; } } brkloop:; - close(aux_fd); + close(auxv_fd); } scratch_end(scratch); return result; } -//- rjf: phdr info extraction - internal DMN_LNX_PhdrInfo -dmn_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phsize, U64 phcount) +dmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) { - DMN_LNX_PhdrInfo result = {0}; - result.range.min = max_U64; - - // rjf: determine how much phdr we'll read - U64 phdr_size_expected = (is_32bit ? sizeof(ELF_Phdr32) : sizeof(ELF_Phdr64)); - U64 phdr_stride = (phsize ? phsize : phdr_size_expected); - U64 phdr_read_size = ClampTop(phsize, phdr_size_expected); + DMN_LNX_PhdrInfo result = { .range.min = max_U64 }; // rjf: scan table - U64 va = phvaddr; - for(U64 i = 0; i < phcount; i += 1, va += phdr_stride) + for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); + ph_cursor < ph_opl; + ph_cursor += e_phentsize) { - // rjf: read type and range - ELF_PType p_type = 0; - U64 p_vaddr = 0; - U64 p_memsz = 0; - if(is_32bit) + ELF_Phdr64 phdr = {0}; + if(!dmn_lnx_read_phdr(memory_fd, ph_cursor, elf_class, &phdr)) { - ELF_Phdr32 phdr32 = {0}; - dmn_lnx_read_struct(memory_fd, va, &phdr32); - p_type = phdr32.p_type; - p_vaddr = phdr32.p_vaddr; - p_memsz = phdr32.p_memsz; + Assert(0 && "unable to read a program header"); } - else - { - ELF_Phdr64 phdr64 = {0}; - dmn_lnx_read_struct(memory_fd, va, &phdr64); - p_type = phdr64.p_type; - p_vaddr = phdr64.p_vaddr; - p_memsz = phdr64.p_memsz; - } - + // rjf: save - switch(p_type) + switch(phdr.p_type) { default:{}break; case ELF_PType_Dynamic: { - result.dynamic = p_vaddr; + result.dynamic = rebase + phdr.p_vaddr; }break; case ELF_PType_Load: { - U64 min = p_vaddr; - U64 max = p_vaddr + p_memsz; + U64 min = rebase + phdr.p_vaddr; + U64 max = rebase + phdr.p_vaddr + phdr.p_memsz; result.range.min = Min(result.range.min, min); result.range.max = Max(result.range.max, max); }break; @@ -298,149 +448,273 @@ dmn_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phsi return result; } -//- rjf: process entity => info extraction - -internal DMN_LNX_ModuleInfoList -dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process) +internal DMN_LNX_DynamicInfo +dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr) { - Arch arch = process->arch; - B32 is_32bit = (arch == Arch_x86 || arch == Arch_arm32); - int memory_fd = (int)process->fd; - - //- rjf: pid => aux - DMN_LNX_ProcessAux aux = dmn_lnx_aux_from_pid((pid_t)process->id, arch); - - //- rjf: memory => phdr info - DMN_LNX_PhdrInfo phdr_info = dmn_lnx_phdr_info_from_memory(memory_fd, is_32bit, aux.phdr, aux.phent, aux.phnum); - - //- rjf: memory space & vaddr => linkmap first - U64 first_linkmap_vaddr = 0; - if(phdr_info.dynamic != 0) + DMN_LNX_DynamicInfo dynamic_info = {0}; + for(U64 dynamic_cursor = dynamic_vaddr; ; dynamic_cursor += elf_dyn_size_from_class(elf_class)) { - U64 off = phdr_info.dynamic; - for(;;) + // rjf: read next dyn entry + ELF_Dyn64 dyn = {0}; + if(!dmn_lnx_read_dynamic(memory_fd, dynamic_cursor, elf_class, &dyn)) { Assert(0 && "unable to read dynamic"); } + + // rjf: break on zero + if(dyn.tag == ELF_DynTag_Null) { break; } + + // extract reuiqred values out of dynamic section + if(dyn.tag == ELF_DynTag_Strtab) { - // rjf: read next dyn entry - ELF_Dyn64 dyn = {0}; - if(is_32bit) - { - ELF_Dyn32 dyn32 = {0}; - dmn_lnx_read_struct(memory_fd, off, &dyn32); - dyn.tag = dyn32.tag; - dyn.val = dyn32.val; - off += sizeof(dyn32); - } - else - { - dmn_lnx_read_struct(memory_fd, off, &dyn); - off += sizeof(dyn); - } - - // rjf: break on zero - if(dyn.tag == ELF_DynTag_Null) + dynamic_info.strtab_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_Strsz) + { + dynamic_info.strtab_size = dyn.val; + } + else if(dyn.tag == ELF_DynTag_Symtab) + { + dynamic_info.symtab_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_Syment) + { + dynamic_info.symtab_entry_size = dyn.val; + } + else if(dyn.tag == ELF_DynTag_Hash) + { + dynamic_info.hash_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_GNU_Hash) + { + dynamic_info.gnu_hash_vaddr = rebase + dyn.val; + } + } + return dynamic_info; +} + +internal U64 +dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) +{ + Temp scratch = scratch_begin(0, 0); + + U64 rdebug_vaddr = 0; + + // load DL's header + ELF_Hdr64 ehdr = {0}; + if(!dmn_lnx_read_ehdr(memory_fd, loader_vbase, &ehdr)) { Assert(0 && "failed to read interp's header"); goto exit; } + + U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; + ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; + + // find dynamic program header + U64 dynamic_vaddr = max_U64; + for EachIndex(phdr_idx, ehdr.e_phnum) + { + U64 phdr_vaddr = loader_vbase + ehdr.e_phoff + phdr_idx * ehdr.e_phentsize; + + ELF_Phdr64 phdr = {0}; + if(!dmn_lnx_read_phdr(memory_fd, phdr_vaddr, elf_class, &phdr)) { Assert(0 && "failed to read program header"); goto exit; } + + if(phdr.p_type == ELF_PType_Dynamic) + { + dynamic_vaddr = rebase + phdr.p_offset; + break; + } + } + + // extract necessary info out of dynamic program header + DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, rebase, dynamic_vaddr); + + // extract symbol table count from available options + U64 symbol_count = 0; + if(dynamic_info.hash_vaddr) + { + U64 hash_entry_size = 4; + if(elf_class == ELF_Class_64 && (ehdr.e_machine == ELF_MachineKind_ALPHA || ehdr.e_machine == ELF_MachineKind_S390 || ehdr.e_machine == ELF_MachineKind_S390_OLD)) + { + hash_entry_size = 8; + } + + U64 chain_count = 0; + if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) + { + symbol_count = chain_count; + } + else + { + Assert(0 && "failed to read hash table's chain count out of HASH"); + } + } + else + { + // TODO: extract count from GNU_HASH + NotImplemented; + } + + // scan symbol table for the rendezvous symbol + if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) + { + for EachIndex(symbol_idx, symbol_count) + { + ELF_Sym64 symbol = {0}; + if(!dmn_lnx_read_symbol(memory_fd, dynamic_info.symtab_vaddr + symbol_idx * dynamic_info.symtab_entry_size, elf_class, &symbol)) { + Assert(0 && "failed to read symbol table"); break; } - - // rjf: pltgot => grab first linkmap address - if(dyn.tag == ELF_DynTag_PltGot) + + Temp temp = temp_begin(scratch.arena); + + String8 symbol_name = {0}; + if(symbol.st_name < dynamic_info.strtab_size) { - // True for x86 and x64 - // vas[0] virtual address of .dynamic - // vas[2] callback for resolving function address of relocation and if successful jumps to it. - // - // Code that sets up PLTGOT is in glibc/sysdeps/x86_64/dl_machine.h -> elf_machine_runtime_setup - // - U64 vas_off = dyn.val; - U64 vas[3] = {0}; - dmn_lnx_read(memory_fd, r1u64(vas_off, vas_off+sizeof(vas)), vas); - first_linkmap_vaddr = vas[1]; - break; + U64 cap = dynamic_info.strtab_size - symbol.st_name; + symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); } + + if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) + { + ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info); + if(symbol_type == ELF_SymType_Object && symbol.st_size > 0) + { + rdebug_vaddr = rebase + symbol.st_value; + break; + } + } + + temp_end(temp); } } - //- rjf: push main module - DMN_LNX_ModuleInfoList list = {0}; - { - U64 base_vaddr = (aux.phdr & ~(aux.pagesz-1)); - DMN_LNX_ModuleInfoNode *n = push_array(arena, DMN_LNX_ModuleInfoNode, 1); - SLLQueuePush(list.first, list.last, n); - list.count += 1; - n->v.vaddr_range = r1u64(base_vaddr, base_vaddr + dim_1u64(phdr_info.range)); - n->v.name = aux.execfn; - n->v.phvaddr = aux.phdr; - n->v.phentsize = aux.phent; - n->v.phcount = aux.phnum; - } - - //- rjf: iterate link maps - if(first_linkmap_vaddr != 0) - { - U64 linkmap_vaddr = first_linkmap_vaddr; - for(;linkmap_vaddr != 0;) +exit:; + scratch_end(scratch); + return rdebug_vaddr; +} + +//////////////////////////////// +//~ Probes + +internal DMN_LNX_ProbeList +dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) +{ + Temp scratch = scratch_begin(&arena, 1); + + DMN_LNX_ProbeList probes = {0}; + + ELF_Hdr64 ehdr = {0}; + if(!dmn_lnx_read_ehdr(fd, offset, &ehdr)) { goto exit; } + + U64 strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize; + ELF_Shdr64 strtab_shdr = {0}; + if(!dmn_lnx_read_shdr(fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr)) { goto exit; } + + B32 found_probes = 0; + B32 found_probes_base = 0; + ELF_Shdr64 text_shdr = {0}; + ELF_Shdr64 stapsdt_base_shdr = {0}; + ELF_Shdr64 stapsdt_shdr = {0}; + for(U64 shdr_off = offset + ehdr.e_shoff, shdr_opl = shdr_off + ehdr.e_shentsize * ehdr.e_shnum; + shdr_off < shdr_opl; + shdr_off += ehdr.e_shentsize) { + ELF_Shdr64 shdr = {0}; + if(!dmn_lnx_read_shdr(fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr)) { goto exit; } + + if(shdr.sh_type == ELF_ShType_Note) { - // rjf: read next linkmap entry - ELF_LinkMap64 linkmap = {0}; - if(is_32bit) + U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; + U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; + String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); + + if(str8_match(name, str8_lit(".note.stapsdt"), 0)) { - // TODO(rjf): endianness - ELF_LinkMap32 linkmap32 = {0}; - dmn_lnx_read_struct(memory_fd, linkmap_vaddr, &linkmap32); - linkmap.base = linkmap32.base; - linkmap.name = linkmap32.name; - linkmap.ld = linkmap32.ld; - linkmap.next = linkmap32.next; + stapsdt_shdr = shdr; + found_probes = 1; } - else - { - dmn_lnx_read_struct(memory_fd, linkmap_vaddr, &linkmap); - } - - // rjf: push module for next link map - if(linkmap.base != 0) - { - // rjf: find phdr info for this module - U64 phvaddr = 0; - U64 phentsize = 0; - U64 phcount = 0; - if(is_32bit) - { - ELF_Hdr32 ehdr = {0}; - dmn_lnx_read_struct(memory_fd, linkmap.base, &ehdr); - phvaddr = ehdr.e_phoff + linkmap.base; - phentsize = ehdr.e_phentsize; - phcount = ehdr.e_phnum; - } - else - { - ELF_Hdr64 ehdr = {0}; - dmn_lnx_read_struct(memory_fd, linkmap.base, &ehdr); - phvaddr = ehdr.e_phoff + linkmap.base; - phentsize = ehdr.e_phentsize; - phcount = ehdr.e_phnum; - } - - // rjf: extract info from module's phdrs - DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(memory_fd, is_32bit, phvaddr, phentsize, phcount); - - // rjf: push - DMN_LNX_ModuleInfoNode *n = push_array(arena, DMN_LNX_ModuleInfoNode, 1); - SLLQueuePush(list.first, list.last, n); - list.count += 1; - n->v.vaddr_range = r1u64(linkmap.base, linkmap.base + dim_1u64(module_phdr_info.range)); - n->v.name = linkmap.name; - n->v.phvaddr = phvaddr; - n->v.phentsize = phentsize; - n->v.phcount = phcount; - } - - // rjf: iterate - linkmap_vaddr = linkmap.next; } + else if(shdr.sh_type == ELF_ShType_ProgBits) + { + U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; + U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; + String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); + + if(str8_match(name, str8_lit(".stapsdt.base"), 0)) + { + stapsdt_base_shdr = shdr; + found_probes_base = 1; + } else if(str8_match(name, str8_lit(".text"), 0)) + { + text_shdr = shdr; + } + } + + if(found_probes && found_probes_base) { break; } } + + if(!found_probes || !found_probes_base) { goto exit; } + + U64 probes_base = stapsdt_base_shdr.sh_addr; - return list; + Rng1U64 note_range = shift_1u64(r1u64(stapsdt_shdr.sh_offset, stapsdt_shdr.sh_offset + stapsdt_shdr.sh_size), offset); + void *raw_note = push_array(arena, U8, stapsdt_shdr.sh_size); + U64 note_read_size = dmn_lnx_read(fd, note_range, raw_note); + if(note_read_size != dim_1u64(note_range)) { goto exit; } + + ELF_NoteList note = elf_parse_note(scratch.arena, str8(raw_note, dim_1u64(note_range)), ehdr.e_ident[ELF_Identifier_Class], ehdr.e_machine); + + for EachNode(n, ELF_NoteNode, note.first) + { + ELF_Note *note = &n->v; + if(!str8_match(note->owner, str8_lit("stapsdt"), 0)) { continue; } + if(note->type != ELF_NoteType_STapSdt) { continue; } + + DMN_LNX_Probe probe = {0}; + { + U64 cursor = 0; + U64 addr_size = ehdr.e_ident[ELF_Identifier_Class] == ELF_Class_64 ? 8 : 4; + + U64 pc = 0; + U64 pc_size = str8_deserial_read(note->desc, cursor, &pc, addr_size, addr_size); + if (pc_size == 0) { goto exit; } + cursor += pc_size; + + U64 base_addr = 0; + U64 base_addr_size = str8_deserial_read(note->desc, cursor, &base_addr, addr_size, addr_size); + if (base_addr_size == 0) { goto exit; } + cursor += base_addr_size; + + U64 semaphore = 0; + U64 semaphore_size = str8_deserial_read(note->desc, cursor, &semaphore, addr_size, addr_size); + if (semaphore_size == 0) { goto exit; } + cursor += semaphore_size; + + String8 provider = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); + cursor += provider.size + 1; + if (cursor > note->desc.size) { goto exit; } + + String8 name = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); + cursor += name.size + 1; + if (cursor > note->desc.size) { goto exit; } + + String8 args = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); + cursor += args.size + 1; + if (cursor > note->desc.size) { goto exit; } + + U64 probe_rebase = image_base + (base_addr - probes_base); + + probe.provider = provider; + probe.name = name; + probe.args = args; + probe.pc = pc + probe_rebase; + probe.semaphore = semaphore ? semaphore + probe_rebase : 0; + } + + DMN_LNX_ProbeNode *n = push_array(arena, DMN_LNX_ProbeNode, 1); + n->v = probe; + SLLQueuePush(probes.first, probes.last, n); + probes.count += 1; + } + +exit:; + scratch_end(scratch); + return probes; } //////////////////////////////// @@ -542,9 +816,63 @@ dmn_lnx_thread_from_pid(pid_t pid) return result; } +internal U64 +dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread) +{ + U64 ip = 0; + if(thread->reg_block) + { + ip = regs_rip_from_arch_block(thread->arch, thread->reg_block); + } + Assert(ip); + return ip; +} + +internal U64 +dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread) +{ + U64 sp = 0; + if(thread->reg_block) + { + sp = regs_rsp_from_arch_block(thread->arch, thread->reg_block); + } + Assert(sp); + return sp; +} + +internal B32 +dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip) +{ + B32 is_ip_written = 0; + if(thread->reg_block) + { + REGS_RegBlockX64 *reg_block = thread->reg_block; + regs_arch_block_write_rip(thread->arch, reg_block, ip); + is_ip_written = 1; + } + Assert(is_ip_written); + return is_ip_written; +} + +internal B32 +dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp) +{ + B32 is_sp_written = 0; + if(thread->reg_block) + { + REGS_RegBlockX64 *reg_block = thread->reg_block; + regs_arch_block_write_rsp(thread->arch, reg_block, sp); + is_sp_written = 1; + } + Assert(is_sp_written); + return is_sp_written; +} + internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) { + AssertAlways(gettid() == thread->parent->tracer_tid); + B32 result = 0; switch(thread->arch) { @@ -560,55 +888,47 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) // case Arch_x64: { - REGS_RegBlockX64 *dst = (REGS_RegBlockX64 *)reg_block; - pid_t tid = (pid_t)thread->id; + DMN_LNX_Entity *process = thread->parent; + pid_t tid = (pid_t)thread->id; + REGS_RegBlockX64 *dst = reg_block; //- rjf: read GPR B32 got_gpr = 0; { DMN_LNX_UserX64 ctx = {0}; - struct iovec iov_gpr = {0}; - iov_gpr.iov_len = sizeof(ctx); - iov_gpr.iov_base = &ctx; - int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr); + int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(ctx), .iov_base = &ctx }); if(ptrace_result != -1) { got_gpr = 1; - DMN_LNX_UserRegsX64 *src = &ctx.regs; - dst->rax.u64 = src->rax; - dst->rcx.u64 = src->rcx; - dst->rdx.u64 = src->rdx; - dst->rbx.u64 = src->rbx; - dst->rsp.u64 = src->rsp; - dst->rbp.u64 = src->rbp; - dst->rsi.u64 = src->rsi; - dst->rdi.u64 = src->rdi; - dst->r8.u64 = src->r8; - dst->r9.u64 = src->r9; - dst->r10.u64 = src->r10; - dst->r11.u64 = src->r11; - dst->r12.u64 = src->r12; - dst->r13.u64 = src->r13; - dst->r14.u64 = src->r14; - dst->r15.u64 = src->r15; - dst->cs.u16 = src->cs; - dst->ds.u16 = src->ds; - dst->es.u16 = src->es; - dst->fs.u16 = src->fs; - dst->gs.u16 = src->gs; - dst->ss.u16 = src->ss; - dst->fsbase.u64 = src->fsbase; - dst->gsbase.u64 = src->gsbase; - dst->rip.u64 = src->rip; - dst->rflags.u64 = src->rflags; - } - else - { - int error_code = errno; - (void)error_code; - int x = 0; - (void)x; + DMN_LNX_UserX64 *src = &ctx; + dst->rax.u64 = src->regs.rax; + dst->rcx.u64 = src->regs.rcx; + dst->rdx.u64 = src->regs.rdx; + dst->rbx.u64 = src->regs.rbx; + dst->rsp.u64 = src->regs.rsp; + dst->rbp.u64 = src->regs.rbp; + dst->rsi.u64 = src->regs.rsi; + dst->rdi.u64 = src->regs.rdi; + dst->r8.u64 = src->regs.r8; + dst->r9.u64 = src->regs.r9; + dst->r10.u64 = src->regs.r10; + dst->r11.u64 = src->regs.r11; + dst->r12.u64 = src->regs.r12; + dst->r13.u64 = src->regs.r13; + dst->r14.u64 = src->regs.r14; + dst->r15.u64 = src->regs.r15; + dst->cs.u16 = src->regs.cs; + dst->ds.u16 = src->regs.ds; + dst->es.u16 = src->regs.es; + dst->fs.u16 = src->regs.fs; + dst->gs.u16 = src->regs.gs; + dst->ss.u16 = src->regs.ss; + dst->fsbase.u64 = src->regs.fsbase; + dst->gsbase.u64 = src->regs.gsbase; + dst->rip.u64 = src->regs.rip; + dst->rflags.u64 = src->regs.rflags; } + else { Assert(0 && "failed to get gprs"); } } //- rjf: read FPR @@ -616,104 +936,122 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(got_gpr) { Temp scratch = scratch_begin(0, 0); - DMN_LNX_XSave *xsave = 0; - DMN_LNX_XSaveLegacy *xsave_legacy = 0; + + X64_XSave *xsave = 0; + X64_FXSave *fxsave = 0; - // rjf: try xsave - if(!xsave_legacy) + // get xsave + if(x64_is_xsave_supported()) { - U8 xsave_buffer[KB(4)]; - struct iovec iov_xsave = {0}; - iov_xsave.iov_len = sizeof(xsave_buffer); - iov_xsave.iov_base = xsave_buffer; - int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave); + void *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); + int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process->xsave_size, .iov_base = xsave_raw }); if(ptrace_result != -1) { - xsave = push_array_no_zero(scratch.arena, DMN_LNX_XSave, 1); - MemoryCopy(xsave, xsave_buffer, sizeof(*xsave)); - xsave_legacy = &xsave->legacy; - } - else - { - int error_code = errno; - (void)error_code; - int x = 0; - (void)x; + xsave = xsave_raw; + fxsave = &xsave->fxsave; } + else { Assert(0 && "failed to get xsave"); } } - // rjf: try fxsave - if(!xsave_legacy) + // get fxsave + if (fxsave == 0) { - DMN_LNX_XSaveLegacy fxsave = {0}; - struct iovec iov_fxsave = {0}; - iov_fxsave.iov_len = sizeof(fxsave); - iov_fxsave.iov_base = &fxsave; - int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_FPREGSET, &iov_fxsave); + fxsave = push_array(scratch.arena, X64_FXSave, 1); + int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave }); if(ptrace_result != -1) { - xsave_legacy = push_array_no_zero(scratch.arena, DMN_LNX_XSaveLegacy, 1); - MemoryCopy(xsave_legacy, &fxsave, sizeof(*xsave_legacy)); - } - else - { - int error_code = errno; - (void)error_code; - int x = 0; - (void)x; + fxsave = 0; } + else { Assert(0 && "failed to get fxsave"); } } - // rjf: fill from xsave legacy - if(xsave_legacy) + // copy fxsave registers + if(fxsave) { - DMN_LNX_XSaveLegacy *src = xsave_legacy; - dst->fcw.u16 = src->fcw; - dst->fsw.u16 = src->fsw; - dst->ftw.u16 = src->ftw; // TODO(rjf): old: fix tag word (?) - dst->fop.u16 = src->fop; - dst->fip.u64 = src->b64.fip; - // TODO(rjf): these 16-bit registers do not belong in x64 - dst->fcs.u16 = 0; - dst->fdp.u64 = src->b64.fdp; - dst->fds.u16 = 0; - dst->mxcsr.u32 = src->mxcsr; + X64_FXSave *src = fxsave; + + // copy x87 registers + dst->fcw.u16 = src->fcw; + dst->fsw.u16 = src->fsw; + dst->ftw.u16 = x64_xsave_tag_word_from_real_tag_word(src->ftw); + dst->fop.u16 = src->fop; + dst->fip.u64 = src->b64.fip; + dst->fdp.u64 = src->b64.fdp; + dst->mxcsr.u32 = src->mxcsr; dst->mxcsr_mask.u32 = src->mxcsr_mask; + for EachIndex(i, 8) { - U8 *float_s = src->st_space.u8; - REGS_Reg80 *float_d = &dst->st0; - for(U32 n = 0; n < 8; n += 1, float_s += 16, float_d += 1) - { - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } + MemoryCopy(&dst->st0 + i, src->st_space + i, sizeof(REGS_Reg80)); } + + // SSE registers are always available in x64 { - U8 *xmm_s = src->xmm_space.u8; - REGS_Reg512 *xmm_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, xmm_s += 16, xmm_d += 1) + U128 *xmm_d = fxsave->xmm_space; + REGS_Reg512 *zmm_s = &dst->zmm0; + for EachIndex(i, 16) { - MemoryCopy(xmm_d, xmm_s, 16); + MemoryCopy(&zmm_s[i], &xmm_d[i], sizeof(*xmm_d)); } } } - - // rjf: fill from ymm registers - // TODO(rjf): this is a lie; ymm can technically move around. study & fix. + + // copy xsave registers if(xsave) { - B32 has_ymm_registers = ((xsave->header.xstate_bv & 4) != 0); - if(has_ymm_registers) + if(xsave->header.xstate_bv & X64_XStateComponentFlag_AVX) { - U8 *ymm_s = (U8 *)xsave->ymmh; - REGS_Reg512 *ymm_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, ymm_s += 16, ymm_d += 1) + AssertAlways(process->xsave_layout.avx_offset + 16*sizeof(REGS_Reg128) <= process->xsave_size); + REGS_Reg128 *avx_s = (REGS_Reg128 *)((U8 *)xsave + process->xsave_layout.avx_offset); + REGS_Reg512 *zmm_d = &dst->zmm0; + for EachIndex(n, 16) { - MemoryCopy(((U8*)ymm_d) + 16, ymm_s, 16); + MemoryCopy(&zmm_d[n].v[16], &avx_s[n], sizeof(REGS_Reg128)); } } + + if(xsave->header.xstate_bv & X64_XStateComponentFlag_OPMASK) + { + AssertAlways(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size); + REGS_Reg64 *kmask_s = (REGS_Reg64 *)((U8 *)xsave + process->xsave_layout.opmask_offset); + REGS_Reg64 *kmask_d = &dst->k0; + for EachIndex(n, 8) + { + MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64)); + } + } + + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM_H) + { + AssertAlways(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size); + REGS_Reg256 *avx512h_s = (REGS_Reg256 *)((U8 *)xsave + process->xsave_layout.zmm_h_offset); + REGS_Reg512 *zmmh_d = &dst->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&zmmh_d[n].v[32], &avx512h_s[n], sizeof(REGS_Reg256)); + } + } + + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM) + { + AssertAlways(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size); + REGS_Reg512 *avx512_s = (REGS_Reg512 *)((U8 *)xsave + process->xsave_layout.zmm_offset); + REGS_Reg512 *zmm_d = &dst->zmm16; + for EachIndex(n, 16) + { + MemoryCopy(&zmm_d[n], &avx512_s[n], sizeof(REGS_Reg512)); + } + } + + if(xsave->header.xstate_bv & X64_XStateComponentFlag_CETU) + { + AssertAlways(process->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process->xsave_size); + U64 *cet_u = (U64 *)((U8 *)xsave + process->xsave_layout.cet_u_offset); + dst->cetmsr.u64 = cet_u[0]; + dst->cetssp.u64 = cet_u[1]; + } } - got_fpr = (xsave || xsave_legacy); + got_fpr = (xsave || fxsave); scratch_end(scratch); } @@ -723,16 +1061,16 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) { got_debug = 1; REGS_Reg64 *dr_d = &dst->dr0; - for(U32 i = 0; i < 8; i += 1, dr_d += 1) + for EachIndex(n, 8) { - if(i != 4 && i != 5) + if(n != 4 && n != 5) { - U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[i]); + U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[n]); errno = 0; - int peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0); + long peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0); if(errno == 0) { - dr_d->u64 = (U64)peek_result; + dr_d[n].u64 = (U64)peek_result; } else { @@ -751,14 +1089,16 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) { + AssertAlways(gettid() == thread->parent->tracer_tid); + B32 result = 0; switch(thread->arch) { case Arch_Null: case Arch_COUNT:{}break; - case Arch_x86: case Arch_arm64: case Arch_arm32: + case Arch_x86: {NotImplemented;}break; //////////////////////////// @@ -766,110 +1106,168 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) // case Arch_x64: { - REGS_RegBlockX64 *src = (REGS_RegBlockX64 *)reg_block; - pid_t tid = (pid_t)thread->id; + DMN_LNX_Entity *process = thread->parent; + pid_t tid = (pid_t)thread->id; + REGS_RegBlockX64 *src = reg_block; //- rjf: write GPR B32 did_gpr = 0; { DMN_LNX_UserX64 dst = {0}; - dst.regs.rax = src->rax.u64; - dst.regs.rcx = src->rcx.u64; - dst.regs.rdx = src->rdx.u64; - dst.regs.rbx = src->rbx.u64; - dst.regs.rsp = src->rsp.u64; - dst.regs.rbp = src->rbp.u64; - dst.regs.rsi = src->rsi.u64; - dst.regs.rdi = src->rdi.u64; - dst.regs.r8 = src->r8.u64; - dst.regs.r9 = src->r9.u64; - dst.regs.r10 = src->r10.u64; - dst.regs.r11 = src->r11.u64; - dst.regs.r12 = src->r12.u64; - dst.regs.r13 = src->r13.u64; - dst.regs.r14 = src->r14.u64; - dst.regs.r15 = src->r15.u64; - dst.regs.cs = src->cs.u16; - dst.regs.ds = src->ds.u16; - dst.regs.es = src->es.u16; - dst.regs.fs = src->fs.u16; - dst.regs.gs = src->gs.u16; - dst.regs.ss = src->ss.u16; - dst.regs.fsbase = src->fsbase.u64; - dst.regs.gsbase = src->gsbase.u64; - dst.regs.rip = src->rip.u64; - dst.regs.rflags = src->rflags.u64; - struct iovec iov_gpr = {0}; - iov_gpr.iov_base = &dst; - iov_gpr.iov_len = sizeof(dst); - int gpr_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr); - did_gpr = (gpr_result != -1); + dst.regs.rax = src->rax.u64; + dst.regs.rcx = src->rcx.u64; + dst.regs.rdx = src->rdx.u64; + dst.regs.rbx = src->rbx.u64; + dst.regs.rsp = src->rsp.u64; + dst.regs.rbp = src->rbp.u64; + dst.regs.rsi = src->rsi.u64; + dst.regs.rdi = src->rdi.u64; + dst.regs.r8 = src->r8.u64; + dst.regs.r9 = src->r9.u64; + dst.regs.r10 = src->r10.u64; + dst.regs.r11 = src->r11.u64; + dst.regs.r12 = src->r12.u64; + dst.regs.r13 = src->r13.u64; + dst.regs.r14 = src->r14.u64; + dst.regs.r15 = src->r15.u64; + dst.regs.cs = src->cs.u16; + dst.regs.ds = src->ds.u16; + dst.regs.es = src->es.u16; + dst.regs.fs = src->fs.u16; + dst.regs.gs = src->gs.u16; + dst.regs.ss = src->ss.u16; + dst.regs.fsbase = src->fsbase.u64; + dst.regs.gsbase = src->gsbase.u64; + dst.regs.rip = src->rip.u64; + dst.regs.rflags = src->rflags.u64; + did_gpr = ptrace(PTRACE_SETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) }) >= 0; } - //- rjf: write FPR B32 did_fpr = 0; if(did_gpr) { - // rjf: fill xsave structure - DMN_LNX_XSave xsave = {0}; - { - xsave.legacy.fcw = src->fcw.u16; - xsave.legacy.fsw = src->fsw.u16; - xsave.legacy.ftw = src->ftw.u16; - xsave.legacy.fop = src->fop.u16; - xsave.legacy.b64.fip = src->fip.u64; - xsave.legacy.b64.fdp = src->fdp.u64; - xsave.legacy.mxcsr = src->mxcsr.u32; - xsave.legacy.mxcsr_mask = src->mxcsr_mask.u32; - { - U8 *float_d = xsave.legacy.st_space.u8; - REGS_Reg80 *float_s = &src->st0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 16) - { - MemoryCopy(float_d, float_s, sizeof(*float_s)); - } - } - { - U8 *xmm_d = xsave.legacy.xmm_space.u8; - REGS_Reg512 *xmm_s = &src->zmm0; - for(U32 n = 0; n < 16; n += 1, xmm_s += 1, xmm_d += 16) - { - MemoryCopy(xmm_d, xmm_s, 16); - } - } - xsave.header.xstate_bv = 7; - { - // TODO(rjf): this is a lie; ymm can technically move around. study & fix. - U8 *ymm_d = xsave.ymmh; - REGS_Reg512 *ymm_s = &src->zmm0; - for(U32 n = 0; n < 16; n += 1, ymm_s += 1, ymm_d += 16) - { - MemoryCopy(ymm_d, ((U8 *)ymm_s) + 16, 16); - } - } - } - - // rjf: try xsave - int xsave_result = -1; - { - struct iovec iov_xsave = {0}; - iov_xsave.iov_base = &xsave; - iov_xsave.iov_len = sizeof(xsave); - xsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave); - } - - // rjf: try fxsave + Temp scratch = scratch_begin(0, 0); + + int xsave_result = -1; int fxsave_result = -1; - if(xsave_result == -1) + + X64_FXSave dst_fxsave = {0}; { - struct iovec iov_fxsave = {0}; - iov_fxsave.iov_base = &xsave.legacy; - iov_fxsave.iov_len = sizeof(xsave.legacy); - fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave); + dst_fxsave.fcw = src->fcw.u16; + dst_fxsave.fsw = src->fsw.u16; + dst_fxsave.ftw = src->ftw.u16; + dst_fxsave.fop = src->fop.u16; + dst_fxsave.b64.fip = src->fip.u64; + dst_fxsave.b64.fdp = src->fdp.u64; + dst_fxsave.mxcsr = src->mxcsr.u32; + dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32; + + REGS_Reg128 *st_d = (REGS_Reg128 *)dst_fxsave.st_space; + REGS_Reg80 *st_s = &src->st0; + for EachIndex(n, 8) + { + MemoryCopy(&st_d[n], &st_s[n], sizeof(REGS_Reg80)); + } + + REGS_Reg128 *xmm_d = (REGS_Reg128 *)dst_fxsave.xmm_space; + REGS_Reg512 *xmm_s = &src->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&xmm_d[n], &xmm_s[n], sizeof(REGS_Reg128)); + } } - + + if(x64_is_xsave_supported()) + { + U8 *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); + int xsave_get = ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = xsave_raw, .iov_len = process->xsave_size }); + AssertAlways(xsave_get >= 0); + + X64_XSave *dst = (X64_XSave *)xsave_raw; + dst->fxsave = dst_fxsave; + + if(process->xsave_layout.avx_offset) + { + if(process->xsave_layout.avx_offset + sizeof(REGS_Reg128) * 16 <= process->xsave_size) + { + REGS_Reg128 *avx_d = (REGS_Reg128 *)(xsave_raw + process->xsave_layout.avx_offset); + REGS_Reg512 *zmm_s = &src->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&avx_d[n], &zmm_s[n].v[16], sizeof(REGS_Reg128)); + } + } + } + + if(process->xsave_layout.opmask_offset) + { + if(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size) + { + REGS_Reg64 *kmask_d = (REGS_Reg64 *)(xsave_raw + process->xsave_layout.opmask_offset); + REGS_Reg64 *kmask_s = &src->k0; + for EachIndex(n, 8) + { + MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64)); + } + } + else { Assert(0 && "invalid xsave size"); } + } + + if(process->xsave_layout.zmm_h_offset) + { + if(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size) + { + REGS_Reg256 *avx512h_d = (REGS_Reg256 *)(xsave_raw + process->xsave_layout.zmm_h_offset); + REGS_Reg512 *zmmh_s = &src->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&avx512h_d[n], &zmmh_s[n].v[32], sizeof(REGS_Reg256)); + } + } + else { Assert(0 && "invalid xsave size"); } + } + + if(process->xsave_layout.zmm_offset) + { + if(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size) + { + REGS_Reg512 *avx512_d = (REGS_Reg512 *)(xsave_raw + process->xsave_layout.zmm_offset); + REGS_Reg512 *zmm_s = &src->zmm16; + for EachIndex(n, 16) + { + MemoryCopy(&avx512_d[n], &zmm_s[n], sizeof(REGS_Reg512)); + } + } + else { Assert(0 && "invalid xsave size"); } + } + + if(process->xsave_layout.cet_u_offset) + { + if(process->xsave_layout.cet_u_offset + sizeof(REGS_Reg64) * 2 <= process->xsave_size) + { + REGS_Reg64 *cet_u = (REGS_Reg64 *)(xsave_raw + process->xsave_layout.cet_u_offset); + cet_u[0] = src->cetmsr; + cet_u[1] = src->cetssp; + } + else { Assert(0 && "invalid xsave size"); } + } + + // xsave + xsave_result = ptrace(PTRACE_SETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process->xsave_size }); + Assert(xsave_result >= 0); + } + + // fallback to fxsave + if(xsave_result < 0) + { + fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_base = &dst_fxsave, sizeof(dst_fxsave) }); + Assert(fxsave_result >= 0); + } + // rjf: good finish requires xsave or fxsave - did_fpr = (xsave_result != -1 || fxsave_result != -1); + did_fpr = (xsave_result >= 0 || fxsave_result >= 0); + + scratch_end(scratch); } //- rjf: write debug registers @@ -877,16 +1275,20 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(did_fpr) { did_dbg = 1; + + src->dr7.u64 |= (1 << 10); + REGS_Reg64 *dr_s = &src->dr0; - for(U32 i = 0; i < 8; i += 1, dr_s += 1) + for EachIndex(n, 8) { - if(i != 4 && i != 5) + if(n != 4 && n != 5) { - U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[i]); - int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s->u64); - if(poke_result == -1) + U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[n]); + int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s[n].u64); + if(poke_result < 0) { did_dbg = 0; + break; } } } @@ -898,6 +1300,37 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) return result; } +internal B32 +dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on) +{ + B32 is_flag_set = 0; + switch(thread->arch) + { + case Arch_COUNT: + case Arch_Null: {} break; + case Arch_x64: + { + REGS_RegBlockX64 *reg_block = thread->reg_block; + if(is_on) + { + reg_block->rflags.u64 |= X64_RFlag_Trap; + } + else + { + reg_block->rflags.u64 &= ~X64_RFlag_Trap; + } + is_flag_set = 1; + }break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: + { + NotImplemented; + }break; + } + return is_flag_set; +} + //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) @@ -982,11 +1415,11 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) //- rjf: create & set up new process if(argv != 0 && argv[0] != 0) { - pid_t pid = 0; - int ptrace_result = 0; - int chdir_result = 0; - int setoptions_result = 0; - B32 error__need_child_kill = 0; + pid_t pid = 0; + int ptrace_result = 0; + int chdir_result = 0; + int setoptions_result = 0; + B32 error__need_child_kill = 0; //- rjf: fork pid = fork(); @@ -995,11 +1428,18 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) //- rjf: child process -> execute actual target if(pid == 0) { + // turn the thread into a tracee ptrace_result = ptrace(PTRACE_TRACEME, 0, 0, 0); if(ptrace_result == -1) { goto error; } + + // set current working directory to tracee chdir_result = chdir(path); if(chdir_result == -1) { goto error; } + + // replace process with target execve(argv[0], argv, env); + + // execve failed -- exit abort(); } @@ -1007,7 +1447,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) if(pid != 0) { //- rjf: wait for child - int status = 0; + int status = 0; pid_t wait_id = waitpid(pid, &status, __WALL); if(wait_id != pid) { @@ -1033,7 +1473,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) else if(wifstopped && wstopsig != SIGTRAP) { launch_status = LaunchStatus_FailAfterPtrace; } else { launch_status = LaunchStatus_FailBeforePtrace; } } - + //- rjf: respond to launch status appropriately switch(launch_status) { @@ -1072,16 +1512,176 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) { setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(DMN_LNX_PTRACE_OPTIONS)); if(setoptions_result == -1) { error__need_child_kill = 1; goto error; } - - //- rjf: build initial process/thread/modules entities + + ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); + int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); + DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); + Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); + U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base); + U64 rdebug_brk_vaddr = rdebug_vaddr + gnu_r_brk_offset_from_arch(arch); + + ELF_Class dl_class; + { + ELF_Hdr64 ehdr = {0}; + if(!dmn_lnx_read_ehdr(memory_fd, auxv.base, &ehdr)) { Assert(0 && "failed to read interp's header"); } + dl_class = ehdr.e_ident[ELF_Identifier_Class]; + } + + U64 xcr0 = 0; + U64 xsave_size = 0; + X64_XSaveLayout xsave_layout = {0}; + if(arch == Arch_x64) + { + X64_XSave xsave = {0}; + if(ptrace(PTRACE_GETREGSET, pid, (void*)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0) + { + // Linux stores xcr0 bits in fxstate padding, + // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25 + xcr0 = *(U64 *)((U8 *)&xsave + 464); + xsave_size = x64_get_xsave_size(); + xsave_layout = x64_get_xsave_layout(xcr0); + } + else + { + Assert(0 && "failed to get xstate"); + } + } + + String8 dl_path = {0}; + { + int maps_fd = open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY); + if(maps_fd != -1) + { + struct stat st = {0}; + if(fstat(maps_fd, &st) != -1) + { + U64 maps_size = dmn_lnx_size_from_fd(maps_fd, MB(1)); + U8 *maps_ptr = push_array(scratch.arena, U8, maps_size); + U64 read_size = dmn_lnx_read(maps_fd, r1u64(0, maps_size), maps_ptr); + if(read_size == maps_size) + { + String8 maps = str8(maps_ptr, maps_size); + + String8List parts = {0}; + { + for(U64 cursor = 0, part_off = 0; cursor < maps.size; cursor += 1) + { + if(maps.str[cursor] == '\\') + { + cursor += 1; + continue; + } + if(maps.str[cursor] == ' ' || maps.str[cursor] == '\n' || cursor + 1 >= maps.size) + { + String8 p = str8_substr(maps, r1u64(part_off, cursor)); + if(p.size > 0) + { + str8_list_push(scratch.arena, &parts, p); + } + part_off = cursor + 1; + } + } + } + + for(String8Node *n = parts.first; n != 0; ) + { + String8 vrange_str = n->string; + n = n->next; + if(n == 0) { break; } + + String8 perms_str = n->string; + n = n->next; + if(n == 0) { break; } + + String8 offset_str = n->string; + n = n->next; + if(n == 0) { break; } + + String8 dev_str = n->string; + n = n->next; + if(n == 0) { break; } + + String8 inode_str = n->string; + n = n->next; + if(n == 0) { break; } + + String8 path = n->string; + n = n->next; + if(n == 0) { break; } + + String8List vaddr_list = str8_split_by_string_chars(scratch.arena, vrange_str, str8_lit("-"), 0); + if(vaddr_list.node_count != 2) { break; } + + U64 lo_vaddr = u64_from_str8(vaddr_list.first->string, 16); + if(lo_vaddr == auxv.base) + { + dl_path = push_str8_copy(scratch.arena, path); + break; + } + } + } + } + close(maps_fd); + } + } + AssertAlways(dl_path.size); + + DMN_LNX_ProbeList probes = {0}; + { + int dl_fd = open((char *)dl_path.str, O_RDONLY); + if(dl_fd >= 0) + { + probes = dmn_lnx_read_probes(scratch.arena, dl_fd, 0, auxv.base); + close(dl_fd); + } + } + + DMN_LNX_Probe *known_probes[DMN_LNX_ProbeType_Count] = {0}; + for EachNode(n, DMN_LNX_ProbeNode, probes.first) + { + DMN_LNX_Probe *p = &n->v; + if(str8_match(p->provider, str8_lit("rtld"), 0)) + { +#define X(_N,_S) if(str8_match(p->name, str8_lit(_S), 0)) { known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } + DMN_LNX_Probe_XList +#undef X + } + } + + // install DL probes + U64 probe_vaddrs[DMN_LNX_ProbeType_Count] = {0}; + for EachIndex(i, ArrayCount(known_probes)) + { + if(known_probes[i] == 0) { continue; } + + U8 og_byte = 0; + if(!dmn_lnx_read_struct(memory_fd, known_probes[i]->pc, &og_byte)) { Assert(0 && "failed to read original byte"); } + Assert(og_byte == 0x90); + + U8 trap = 0xcc; + if(!dmn_lnx_write_struct(memory_fd, known_probes[i]->pc, &trap)) { Assert(0 && "failed to install probe"); } + + probe_vaddrs[i] = known_probes[i]->pc; + } + + // make process entity & push create event DMN_LNX_Entity *process = &dmn_lnx_nil_entity; - DMN_LNX_Entity *main_thread = &dmn_lnx_nil_entity; { - // rjf: build process process = dmn_lnx_entity_alloc(dmn_lnx_state->entities_base, DMN_LNX_EntityKind_Process); - process->arch = dmn_lnx_arch_from_pid(pid); - process->id = pid; - process->fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); + process->arch = arch; + process->id = pid; + process->fd = memory_fd; + process->tracer_tid = gettid(); + process->rdebug_vaddr = rdebug_vaddr; + process->rdebug_brk_vaddr = rdebug_brk_vaddr; + process->expect_rdebug_data_breakpoint = rdebug_vaddr != 0; + process->dl_class = dl_class; + process->arena = arena_alloc(); + process->loaded_modules_ht = hash_table_init(process->arena, 0x1000); + process->xcr0 = xcr0; + process->xsave_size = Max(xsave_size, sizeof(X64_XSave)); + process->xsave_layout = xsave_layout; + MemoryCopyTyped(&process->probe_vaddrs[0], &probe_vaddrs[0], DMN_LNX_ProbeType_Count); { DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); e->kind = DMN_EventKind_CreateProcess; @@ -1089,53 +1689,60 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) e->arch = process->arch; e->code = pid; } - - // rjf: build thread - { - DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); - thread->id = pid; - thread->arch = process->arch; - { - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->arch = thread->arch; - e->code = thread->id; - } - main_thread = thread; - } - - // rjf: gather all process module infos - DMN_LNX_ModuleInfoList module_infos = dmn_lnx_module_info_list_from_process(scratch.arena, process); - for(DMN_LNX_ModuleInfoNode *n = module_infos.first; n != 0; n = n->next) - { - DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); - module->id = n->v.name; - { - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(main_thread); - e->module = dmn_lnx_handle_from_entity(module); - e->arch = process->arch; - e->address = n->v.vaddr_range.min; - e->size = dim_1u64(n->v.vaddr_range); - e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name); - e->elf_phdr_vrange = r1u64(n->v.phvaddr, n->v.phvaddr + n->v.phentsize * n->v.phcount); - e->elf_phdr_entsize = n->v.phentsize; - } - } - - // rjf: handshake event + } + + // make thread entity & push create event + DMN_LNX_Entity *main_thread = &dmn_lnx_nil_entity; + { + main_thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); + main_thread->id = pid; + main_thread->arch = process->arch; + main_thread->reg_block = push_array(dmn_lnx_state->entities_arena, U8, regs_block_size_from_arch(process->arch)); + dmn_lnx_thread_read_reg_block(main_thread, main_thread->reg_block); { DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_HandshakeComplete; + e->kind = DMN_EventKind_CreateThread; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(main_thread); - e->arch = process->arch; + e->arch = main_thread->arch; + e->code = main_thread->id; } } + + // make main module & push load module event + { + U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); + U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; + DMN_LNX_PhdrInfo phdr_info = dmn_lnx_phdr_info_from_memory(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); + + DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); + module->id = auxv.execfn; + module->base_vaddr = base_vaddr; + + DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(main_thread); + e->module = dmn_lnx_handle_from_entity(module); + e->arch = process->arch; + e->address = base_vaddr; + e->size = dim_1u64(phdr_info.range); + e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, auxv.execfn); + e->elf_phdr_vrange = r1u64(auxv.phdr, auxv.phdr + auxv.phent * auxv.phnum); + e->elf_phdr_entsize = auxv.phent; + + hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, 0, module); + hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, base_vaddr, module); + } + + // rjf: handshake event + { + DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); + e->kind = DMN_EventKind_HandshakeComplete; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(main_thread); + e->arch = process->arch; + } }break; } } @@ -1193,326 +1800,537 @@ dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { + Temp scratch = scratch_begin(&arena, 1); DMN_EventList evts = {0}; + + //////////////////////////// + //- rjf: push any deferred events + // { - Temp scratch = scratch_begin(&arena, 1); - - //////////////////////////// - //- rjf: unpack controls - // - DMN_LNX_Entity *single_step_thread = dmn_lnx_entity_from_handle(ctrls->single_step_thread); - - //////////////////////////// - //- rjf: push any deferred events - // + for EachNode(n, DMN_EventNode, dmn_lnx_state->deferred_events.first) { - for(DMN_EventNode *n = dmn_lnx_state->deferred_events.first; n != 0; n = n->next) - { - DMN_Event *e_src = &n->v; - DMN_Event *e_dst = dmn_event_list_push(arena, &evts); - MemoryCopyStruct(e_dst, e_src); - e_dst->string = str8_copy(arena, e_dst->string); - } - MemoryZeroStruct(&dmn_lnx_state->deferred_events); - arena_clear(dmn_lnx_state->deferred_events_arena); + DMN_Event *e_src = &n->v; + DMN_Event *e_dst = dmn_event_list_push(arena, &evts); + MemoryCopyStruct(e_dst, e_src); + e_dst->string = str8_copy(arena, e_dst->string); } - - //////////////////////////// - //- rjf: no processes, no output events -> not attached - // - if(evts.count == 0 && dmn_lnx_state->entities_base->first == &dmn_lnx_nil_entity) - { - DMN_Event *e = dmn_event_list_push(arena, &evts); - e->kind = DMN_EventKind_Error; - e->error_kind = DMN_ErrorKind_NotAttached; - } - - //////////////////////////// - //- rjf: determine if we need to wait for new events - // - B32 need_wait_on_events = (evts.count == 0); - - //////////////////////////// - //- rjf: write all traps into memory - // - U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, ctrls->traps.trap_count); + MemoryZeroStruct(&dmn_lnx_state->deferred_events); + arena_clear(dmn_lnx_state->deferred_events_arena); + } + + //////////////////////////// + //- rjf: no processes, no output events -> not attached + // + if(evts.count == 0 && dmn_lnx_state->entities_base->first == &dmn_lnx_nil_entity) + { + DMN_Event *e = dmn_event_list_push(arena, &evts); + e->kind = DMN_EventKind_Error; + e->error_kind = DMN_ErrorKind_NotAttached; + } + + //////////////////////////// + //- rjf: determine if we need to wait for new events + // + B32 need_wait_on_events = (evts.count == 0); + + //////////////////////////// + //- rjf: write all traps into memory + // + DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; + { ProfScope("write all traps into memory") { - U64 trap_idx = 0; - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) + for EachIndex(n_idx, n->count) { DMN_Trap *trap = n->v+n_idx; + if(trap->flags == 0) { - trap_swap_bytes[trap_idx] = 0xCC; - dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), trap_swap_bytes+trap_idx); - U8 int3 = 0xCC; - dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3); + U8 swap_byte = 0; + if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &swap_byte) > 0) + { + U8 int3 = 0xCC; + if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3)) + { + DMN_ActiveTrap *active_trap = push_array(scratch.arena, DMN_ActiveTrap, 1); + active_trap->trap = trap; + active_trap->swap_byte = swap_byte; + SLLQueuePush(active_trap_first, active_trap_last, active_trap); + } else { Assert(0 && "failed to write trap"); } + } else { Assert(0 && "failed to read original byte"); } } } } } - - //////////////////////////// - //- rjf: gather all threads which we should run - // - DMN_LNX_EntityNode *first_run_thread = 0; - DMN_LNX_EntityNode *last_run_thread = 0; - if(need_wait_on_events) ProfScope("gather all threads which we should run") + } + + //////////////////////////// + //- rjf: gather all threads which we should run + // + DMN_LNX_EntityNode *first_run_thread = 0, *last_run_thread = 0; + if(need_wait_on_events) ProfScope("gather all threads which we should run") + { + //- rjf: scan all processes + for(DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; + process != &dmn_lnx_nil_entity; + process = process->next) { - //- rjf: scan all processes - for(DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; - process != &dmn_lnx_nil_entity; - process = process->next) + if(process->kind != DMN_LNX_EntityKind_Process) {continue;} + + //- rjf: determine if this process is frozen + B32 process_is_frozen = 0; + if(ctrls->run_entities_are_processes) { - if(process->kind != DMN_LNX_EntityKind_Process) {continue;} - - //- rjf: determine if this process is frozen - B32 process_is_frozen = 0; - if(ctrls->run_entities_are_processes) + for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) { - for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(process))) { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(process))) + process_is_frozen = 1; + break; + } + } + } + + //- rjf: scan all threads in this process + for(DMN_LNX_Entity *thread = process->first; + thread != &dmn_lnx_nil_entity; + thread = thread->next) + { + if(thread->kind != DMN_LNX_EntityKind_Thread) {continue;} + + //- rjf: determine if this thread is frozen + B32 is_frozen = 0; + { + // rjf: single-step? freeze if not the single-step thread. + if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) + { + is_frozen = !dmn_handle_match(dmn_lnx_handle_from_entity(thread), ctrls->single_step_thread); + } + + // rjf: not single-stepping? determine based on run controls freezing info + else + { + if(ctrls->run_entities_are_processes) { - process_is_frozen = 1; - break; + is_frozen = process_is_frozen; + } + else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(thread))) + { + is_frozen = 1; + break; + } + } + if(ctrls->run_entities_are_unfrozen) + { + is_frozen ^= 1; } } } - //- rjf: scan all threads in this process - for(DMN_LNX_Entity *thread = process->first; - thread != &dmn_lnx_nil_entity; - thread = thread->next) - { - if(thread->kind != DMN_LNX_EntityKind_Thread) {continue;} - - //- rjf: determine if this thread is frozen - B32 is_frozen = 0; - { - // rjf: single-step? freeze if not the single-step thread. - if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) - { - is_frozen = !dmn_handle_match(dmn_lnx_handle_from_entity(thread), ctrls->single_step_thread); - } - - // rjf: not single-stepping? determine based on run controls freezing info - else - { - if(ctrls->run_entities_are_processes) - { - is_frozen = process_is_frozen; - } - else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(thread))) - { - is_frozen = 1; - break; - } - } - if(ctrls->run_entities_are_unfrozen) - { - is_frozen ^= 1; - } - } - } - - //- rjf: disregard all other rules if this is the halter thread - // TODO(rjf): halting - here is what we do on windows... + //- rjf: disregard all other rules if this is the halter thread + // TODO(rjf): halting - here is what we do on windows... #if 0 - if(dmn_w32_shared->halter_tid == thread->id) - { - is_frozen = 0; - } + if(dmn_w32_shared->halter_tid == thread->id) + { + is_frozen = 0; + } #endif - - //- rjf: add to list - if(!is_frozen) - { - DMN_LNX_EntityNode *n = push_array(scratch.arena, DMN_LNX_EntityNode, 1); - n->v = thread; - SLLQueuePush(first_run_thread, last_run_thread, n); - } + + //- rjf: add to list + if(!is_frozen) + { + DMN_LNX_EntityNode *n = push_array(scratch.arena, DMN_LNX_EntityNode, 1); + n->v = thread; + SLLQueuePush(first_run_thread, last_run_thread, n); } } } - - //////////////////////////// - //- rjf: resume all threads we need to run - // - DMN_LNX_EntityNode *first_ran_thread = 0; - DMN_LNX_EntityNode *last_ran_thread = 0; - for(DMN_LNX_EntityNode *n = first_run_thread; n != 0; n = n->next) + } + + // enable single stepping + DMN_LNX_Entity *single_step_thread = dmn_lnx_entity_from_handle(ctrls->single_step_thread); + if(single_step_thread != &dmn_lnx_nil_entity) + { + dmn_lnx_set_single_step_flag(single_step_thread, 1); + } + + // update registers + for EachNode(n, DMN_LNX_EntityNode, first_run_thread) + { + DMN_LNX_Entity *thread = n->v; + if(thread->reg_block) { - ptrace(PTRACE_CONT, (pid_t)n->v->id, 0, 0); - DMN_LNX_EntityNode *n2 = push_array_no_zero(scratch.arena, DMN_LNX_EntityNode, 1); - SLLQueuePush(first_ran_thread, last_ran_thread, n2); - n2->v = n->v; + if (!dmn_lnx_thread_write_reg_block(thread, thread->reg_block)) { Assert(0 && "failed to write thread's registers"); } + } + } + + //////////////////////////// + //- rjf: resume all threads we need to run + // + DMN_LNX_EntityNode *first_ran_thread = 0, *last_ran_thread = 0; + for EachNode(n, DMN_LNX_EntityNode, first_run_thread) + { + DMN_LNX_Entity *thread = n->v; + + void *sig_code = 0; + if(dmn_lnx_state->last_event_kind == DMN_EventKind_Exception && dmn_lnx_state->last_stop_pid == thread->id) + { + sig_code = (void *)(uintptr_t)dmn_lnx_state->last_sig_code; + } + if (ptrace(PTRACE_CONT, (pid_t)thread->id, 0, (void *)sig_code) < 0) { Assert(0 && "failed to resume a thread"); } + + DMN_LNX_EntityNode *n2 = push_array_no_zero(scratch.arena, DMN_LNX_EntityNode, 1); + SLLQueuePush(first_ran_thread, last_ran_thread, n2); + n2->v = thread; + } + + //////////////////////////// + //- rjf: loop: wait for next stop, produce debug events + // + for(B32 done = !need_wait_on_events; !done;) + { + //- rjf: wait for next event + int status = 0; + pid_t wait_id = waitpid(-1, &status, __WALL|__WNOTHREAD); + if(status == -1 && errno == EINTR) {continue;} // wait interrupted, try again + if(status == -1) {InvalidPath;} // TODO: graceful exit + + //- rjf: unpack event + int wifexited = WIFEXITED(status); + int wifsignaled = WIFSIGNALED(status); + int wifstopped = WIFSTOPPED(status); + int wstopsig = WSTOPSIG(status); + int ptrace_event_code = (status>>16); + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); + DMN_LNX_Entity *process = thread->parent; + B32 thread_is_process_root = (thread->id == process->id); + + // update thread registers + if(thread != &dmn_lnx_nil_entity) + { + if (!dmn_lnx_thread_read_reg_block(thread, thread->reg_block)) { Assert(0 && "failed to update thread's registers"); } } - //////////////////////////// - //- rjf: loop: wait for next stop, produce debug events - // - pid_t final_wait_pid = 0; - if(need_wait_on_events) for(B32 done = 0; !done;) + DMN_EventKind e_kind = DMN_EventKind_Null; + U64 exit_code = max_U64; + U64 address = 0; + DMN_Trap *hit_user_trap = 0; + + //- rjf: WIFEXITED(status) -> thread exit + if(wifexited) { - //- rjf: wait for next event - int status = 0; - pid_t wait_id = waitpid(-1, &status, __WALL); - final_wait_pid = wait_id; - done = 1; - - // NOTE(rjf): siginfo hint from old code: -#if 0 + e_kind = DMN_EventKind_ExitThread; + } + + //- rjf: WIFEXITED(status) -> thread exit w/ exit code + else if(wifsignaled) + { + e_kind = DMN_EventKind_ExitThread; + exit_code = WTERMSIG(status); + } + + //- rjf: SIGTRAP:PTRACE_EVENT_EXIT + else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_EXIT) + { + // TODO(rjf): verify + e_kind = DMN_EventKind_ExitThread; + } + + //- rjf: SIGTRAP:PTRACE_EVENT_CLONE + else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_CLONE) + { + // TODO(rjf) + } + + //- rjf: SIGTRAP:PTRACE_EVENT_FORK, or SIGTRAP:PTRACE_EVENT_VFORK + else if(wifstopped && wstopsig == SIGTRAP && + (ptrace_event_code == PTRACE_EVENT_FORK || + ptrace_event_code == PTRACE_EVENT_VFORK)) + { + } + + //- rjf: SIGTRAP + else if(wifstopped && wstopsig == SIGTRAP) + { + // translate signal code to DEMON event kind + siginfo_t siginfo = {0}; + if(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo) < 0) { Assert(0 && "failed to get signal info"); } + switch(siginfo.si_code) { - switch(siginfo.si_code) + case DMN_LNX_SigTrapCode_Brkpt: { - // SI_KERNEL (hit int3; 0xCC) - case 0x80: - { - // TODO(rjf): breakpoint event - }break; - // +----------------------"breakpoint" - // | - // v----------v----------------------"hardware breakpoint" - // TRAP_UNK, TRAP_HWBKPT, TRAP_BRKPT, TRAP_TRACE - case 0x5: case 0x4: case 0x1: case 0x2: - { - // TODO(rjf): breakpoint event (?) - }break; - case 0x3: case 0x0: - { - // TODO(rjf): do nothing(?) - }break; - } - } -#endif - - //- rjf: unpack event - int wifexited = WIFEXITED(status); - int wifsignaled = WIFSIGNALED(status); - int wifstopped = WIFSTOPPED(status); - int wstopsig = WSTOPSIG(status); - int ptrace_event_code = (status>>16); - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - DMN_LNX_Entity *process = thread->parent; - B32 thread_is_process_root = (thread->id == process->id); - - //- rjf: unpack thread's registers - U64 rip = 0; - void *regs_block = 0; - if(thread != &dmn_lnx_nil_entity) - { - U64 regs_block_size = regs_block_size_from_arch(thread->arch); - regs_block = push_array(scratch.arena, U8, regs_block_size); - dmn_lnx_thread_read_reg_block(thread, regs_block); - rip = regs_rip_from_arch_block(thread->arch, regs_block); - } - - //- rjf: WIFEXITED(status) -> thread exit - B32 thread_exit = 0; - U64 exit_code = 0; - if(wifexited) - { - thread_exit = 1; - } - - //- rjf: WIFEXITED(status) -> thread exit w/ exit code - else if(wifsignaled) - { - exit_code = WTERMSIG(status); - thread_exit = 1; - } - - //- rjf: SIGTRAP:PTRACE_EVENT_EXIT - else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_EXIT) - { - // TODO(rjf): verify - thread_exit = 1; - } - - //- rjf: SIGTRAP:PTRACE_EVENT_CLONE - else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_CLONE) - { - // TODO(rjf) - } - - //- rjf: SIGTRAP:PTRACE_EVENT_FORK, or SIGTRAP:PTRACE_EVENT_VFORK - else if(wifstopped && wstopsig == SIGTRAP && - (ptrace_event_code == PTRACE_EVENT_FORK || - ptrace_event_code == PTRACE_EVENT_VFORK)) - { - } - - //- rjf: SIGTRAP - else if(wifstopped && wstopsig == SIGTRAP) - { - // rjf: this is the single step thread => this is a single step completion - DMN_EventKind e_kind = DMN_EventKind_Trap; - if(thread == single_step_thread) + e_kind = DMN_EventKind_Breakpoint; + }break; + case DMN_LNX_SigTrapCode_Trace: { e_kind = DMN_EventKind_SingleStep; - } - - // rjf: this matches a specified trap => breakpoint + }break; + case DMN_LNX_SigTrapCode_HwBkpt: { - // TODO(rjf) - } - - // rjf: after breakpoint -> rollback - if(e_kind == DMN_EventKind_Breakpoint) + if(thread->arch == Arch_Null) { } + else if(thread->arch == Arch_x64) + { + REGS_RegBlockX64 *regs_x64 = thread->reg_block; + if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B0) + { + address = regs_x64->dr0.u64; + e_kind = DMN_EventKind_Breakpoint; + } + else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B1) + { + address = regs_x64->dr1.u64; + e_kind = DMN_EventKind_Breakpoint; + } + else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B2) + { + address = regs_x64->dr2.u64; + e_kind = DMN_EventKind_Breakpoint; + } + else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B3) + { + address = regs_x64->dr3.u64; + e_kind = DMN_EventKind_Breakpoint; + } + } + else + { + NotImplemented; + } + }break; + case SI_KERNEL: { - // TODO(rjf) + e_kind = DMN_EventKind_Breakpoint; + }break; + case DMN_LNX_SigTrapCode_Unk: {NotImplemented;}break; + case DMN_LNX_SigTrapCode_Perf: {NotImplemented;}break; + default: {InvalidPath;} break; + } + } + + //- rjf: WSTOPSIG(status) is SIGSTOP + else if(wifstopped && wstopsig == SIGSTOP) + { + // + // TODO(rjf): how do we tell the following apart?: + // - SIGSTOP All-Stop + // - SIGSTOP Halt + // - SIGSTOP "User" + // + // we are currently just assuming that, if we've queried a SIGSTOP to halt, then + // the first one that comes back is our "dummy" sigstop. this is likely not + // necessarily true. + // + if(thread->expecting_dummy_sigstop) + { + thread->expecting_dummy_sigstop = 0; + done = 0; + } + else if(dmn_lnx_state->has_halt_injection) + { + e_kind = DMN_EventKind_Halt; + } + else + { + // TODO(rjf): study this case; old notes: + // + // a signal we don't want to mess with (except to record that it + // happened maybe) we should "hand it back" + } + } + + //- rjf: WSTOPSIG(status) is an unrecoverable exception (unless user does something to fix state first) + else if(wifstopped) + { + e_kind = DMN_EventKind_Exception; + } + else + { + Assert(0 && "unexpected stop code"); + } + + dmn_lnx_state->last_event_kind = e_kind; + dmn_lnx_state->last_stop_pid = wait_id; + dmn_lnx_state->last_sig_code = wstopsig; + done = 1; + + if(e_kind == DMN_EventKind_Breakpoint) + { + U64 ip = dmn_lnx_thread_read_ip(thread); + for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) + { + if(active_trap->trap->vaddr == ip-1) + { + hit_user_trap = active_trap->trap; + break; } - - // rjf: push event + } + + // rollback IP on user traps + if(hit_user_trap) + { + U64 ip = dmn_lnx_thread_read_ip(thread); + dmn_lnx_thread_write_ip(thread, ip - 1); + } + } + + // is this a probe trap? + if(!hit_user_trap && e_kind == DMN_EventKind_Breakpoint) + { + B32 skip_event = 0; + + // find which probe was triggered + U64 ip = dmn_lnx_thread_read_ip(thread) - 1; + DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; + for EachIndex(i, ArrayCount(process->probe_vaddrs)) + { + if(process->probe_vaddrs[i] == ip) + { + probe_type = i; + skip_event = 1; + break; + } + } + + // handle the probe + if((probe_type == DMN_LNX_ProbeType_InitStart || probe_type == DMN_LNX_ProbeType_InitComplete)) + { + GNU_RDebugInfo64 rdebug = {0}; + dmn_lnx_read_r_debug(process->fd, process->rdebug_vaddr, process->arch, &rdebug); + + switch(rdebug.r_state) + { + case GNU_RT_Add: + case GNU_RT_Delete: + case GNU_RT_Consistent: + { + // flag every module as inactive + for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next) + { + if(module->kind != DMN_LNX_EntityKind_Module) {continue;} + module->is_active = 0; + } + + for(U64 map_vaddr = rdebug.r_map; map_vaddr!= 0; ) + { + // read out link map + GNU_LinkMap64 map = {0}; + if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { Assert(0 && "unable to read Link Map"); } + + // make new module if never seen before + DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); + if(module == 0) + { + ELF_Hdr64 module_ehdr = {0}; + if(!dmn_lnx_read_ehdr(process->fd, map.addr_vaddr, &module_ehdr)) { NotImplemented; } + + U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? map.addr_vaddr : 0; + U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; + DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); + String8 module_name = dmn_lnx_read_string(process->arena, process->fd, map.name_vaddr); + + module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); + module->id = map.name_vaddr; + module->base_vaddr = map.addr_vaddr; + + if (!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) + { + DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->module = dmn_lnx_handle_from_entity(module); + e->arch = arch_from_elf_machine(module_ehdr.e_machine); + e->address = map.addr_vaddr; + e->size = dim_1u64(module_phdr_info.range); + e->string = module_name; + e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); + e->elf_phdr_entsize = module_ehdr.e_phentsize; + } + + hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module); + } + + // do not unload module + module->is_active = 1; + + // advance to next link map + map_vaddr = map.next_vaddr; + } + + // unload inactive modules + for(DMN_LNX_Entity *module = process->first, *module_next; module != &dmn_lnx_nil_entity; module = module_next) + { + module_next = module->next; + if(module->kind != DMN_LNX_EntityKind_Module) {continue;} + if(module->is_active) {continue;} + + DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->module = dmn_lnx_handle_from_entity(module); + e->string = dmn_lnx_read_string(arena, process->fd, module->id); + + hash_table_purge_u64(process->loaded_modules_ht, module->base_vaddr); + dmn_lnx_entity_release(module); + } + } break; + default: { Assert(0 && "unexpected state"); } break; + } + } + + if(skip_event) {break;} + } + + switch(e_kind) + { + case DMN_EventKind_COUNT: + case DMN_EventKind_Null: break; + case DMN_EventKind_Error: + case DMN_EventKind_HandshakeComplete: + case DMN_EventKind_LoadModule: + case DMN_EventKind_UnloadModule: + {InvalidPath;}break; + case DMN_EventKind_Trap: + case DMN_EventKind_Memory: + case DMN_EventKind_SetThreadName: + case DMN_EventKind_SetThreadColor: + case DMN_EventKind_SetBreakpoint: + case DMN_EventKind_UnsetBreakpoint: + case DMN_EventKind_SetVAddrRangeNote: + case DMN_EventKind_DebugString: + { + NotImplemented; + }break; + case DMN_EventKind_SingleStep: + { + // clear single step flag + dmn_lnx_set_single_step_flag(thread, 0); + DMN_Event *e = dmn_event_list_push(arena, &evts); e->kind = e_kind; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(thread); - e->instruction_pointer = rip; - } - - //- rjf: WSTOPSIG(status) is SIGSTOP - else if(wifstopped && wstopsig == SIGSTOP) + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + }break; + case DMN_EventKind_Breakpoint: { - // - // TODO(rjf): how do we tell the following apart?: - // - SIGSTOP All-Stop - // - SIGSTOP Halt - // - SIGSTOP "User" - // - // we are currently just assuming that, if we've queried a SIGSTOP to halt, then - // the first one that comes back is our "dummy" sigstop. this is likely not - // necessarily true. - // - if(thread->expecting_dummy_sigstop) - { - thread->expecting_dummy_sigstop = 0; - done = 0; - } - else if(dmn_lnx_state->has_halt_injection) - { - DMN_Event *e = dmn_event_list_push(arena, &evts); - e->kind = DMN_EventKind_Halt; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - } - else - { - // TODO(rjf): study this case; old notes: - // - // a signal we don't want to mess with (except to record that it - // happened maybe) we should "hand it back" - } - } - - //- rjf: WSTOPSIG(status) is an unrecoverable exception (unless user does something to fix state first) - else if(wifstopped) + DMN_Event *e = dmn_event_list_push(arena, &evts); + e->kind = e_kind; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + }break; + case DMN_EventKind_Halt: + { + DMN_Event *e = dmn_event_list_push(arena, &evts); + e->kind = DMN_EventKind_Halt; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + }break; + case DMN_EventKind_Exception: { // TODO(rjf): possible cases: // SIGABRT @@ -1523,12 +2341,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) e->kind = DMN_EventKind_Exception; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(thread); - e->instruction_pointer = rip; + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); e->signo = wstopsig; - } - - //- rjf: thread exit, thread is process' "root thread" -> eliminate this entire entity subtree - if(thread_exit && thread_is_process_root) + }break; + case DMN_EventKind_CreateProcess: + { + NotImplemented; + }break; + case DMN_EventKind_ExitProcess: { // rjf: generate exit-thread / unload-module events for(DMN_LNX_Entity *child = process->first; child != &dmn_lnx_nil_entity; child = child->next) @@ -1564,59 +2384,52 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: eliminate entity tree dmn_lnx_entity_release(process); - } - - //- rjf: thread exit, thread is *not* process root -> just exit this one thread - if(thread_exit && !thread_is_process_root) + }break; + case DMN_EventKind_CreateThread: + { + NotImplemented; + }break; + case DMN_EventKind_ExitThread: { DMN_Event *e = dmn_event_list_push(arena, &evts); e->kind = DMN_EventKind_ExitThread; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(thread); dmn_lnx_entity_release(thread); - } + }break; } - - //////////////////////////// - //- rjf: stop all threads - // - for(DMN_LNX_EntityNode *n = first_ran_thread; n != 0; n = n->next) - { - DMN_LNX_Entity *thread = n->v; - pid_t thread_id = (pid_t)thread->id; - if(thread_id != final_wait_pid) - { - union sigval sv = {0}; - sigqueue(thread_id, SIGSTOP, sv); - thread->expecting_dummy_sigstop = 1; - } - } - - ////////////////////////// - //- rjf: restore original memory at trap locations - // - ProfScope("restore original memory at trap locations") - { - U64 trap_idx = 0; - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) - { - DMN_Trap *trap = n->v+n_idx; - if(trap->flags == 0) - { - U8 og_byte = trap_swap_bytes[trap_idx]; - if(og_byte != 0xCC) - { - dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &og_byte); - } - } - } - } - } - - scratch_end(scratch); } + + //////////////////////////// + //- rjf: stop all threads + // + for EachNode(n, DMN_LNX_EntityNode, first_ran_thread) + { + DMN_LNX_Entity *thread = n->v; + pid_t thread_id = (pid_t)thread->id; + if(thread_id != dmn_lnx_state->last_stop_pid) + { + union sigval sv = {0}; + sigqueue(thread_id, SIGSTOP, sv); + thread->expecting_dummy_sigstop = 1; + } + } + + ////////////////////////// + //- rjf: restore original memory at trap locations + // + ProfScope("restore original memory at trap locations") + { + for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) + { + if(!dmn_process_write_struct(active_trap->trap->process, active_trap->trap->vaddr, &active_trap->swap_byte)) + { + Assert(0 && "failed to swap back original byte"); + } + } + } + + scratch_end(scratch); return evts; } @@ -1743,8 +2556,17 @@ dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) B32 result = 0; DMN_AccessScope { - DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); - result = dmn_lnx_thread_read_reg_block(thread, reg_block); + DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); + U64 reg_block_size = regs_block_size_from_arch(thread->arch); + if(thread == &dmn_lnx_nil_entity) + { + MemoryZero(reg_block, reg_block_size); + } + else + { + MemoryCopy(reg_block, thread->reg_block, reg_block_size); + } + result = 1; } return result; } @@ -1755,8 +2577,17 @@ dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) B32 result = 0; DMN_AccessScope { - DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); - result = dmn_lnx_thread_write_reg_block(thread, reg_block); + DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); + U64 reg_block_size = regs_block_size_from_arch(thread->arch); + if(thread == &dmn_lnx_nil_entity) + { + MemoryZero(reg_block, reg_block_size); + } + else + { + MemoryCopy(thread->reg_block, reg_block, reg_block_size); + } + result = 1; } return result; } diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 8fd38499..b49a9a92 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -25,102 +25,56 @@ PTRACE_O_TRACEFORK|\ PTRACE_O_TRACEVFORK|\ PTRACE_O_TRACECLONE) +enum +{ + DMN_LNX_SigTrapCode_Brkpt = 1, + DMN_LNX_SigTrapCode_Trace = 2, + DMN_LNX_SigTrapCode_Branch = 3, + DMN_LNX_SigTrapCode_HwBkpt = 4, + DMN_LNX_SigTrapCode_Unk = 5, + DMN_LNX_SigTrapCode_Perf = 6 +} DMN_LNX_SigTrapCode; + //////////////////////////////// //~ rjf: Register Layouts // // These are defined in , but only for one architecture at a time -#pragma pack(push, 1) - -typedef struct DMN_LNX_UserRegsX64 DMN_LNX_UserRegsX64; -struct DMN_LNX_UserRegsX64 -{ - U64 r15; - U64 r14; - U64 r13; - U64 r12; - U64 rbp; - U64 rbx; - U64 r11; - U64 r10; - U64 r9; - U64 r8; - U64 rax; - U64 rcx; - U64 rdx; - U64 rsi; - U64 rdi; - U64 orig_rax; - U64 rip; - U64 cs; - U64 rflags; - U64 rsp; - U64 ss; - U64 fsbase; - U64 gsbase; - U64 ds; - U64 es; - U64 fs; - U64 gs; -}; - -typedef struct DMN_LNX_XSaveLegacy DMN_LNX_XSaveLegacy; -struct DMN_LNX_XSaveLegacy -{ - U16 fcw; - U16 fsw; - U16 ftw; - U16 fop; - union - { - struct - { - U64 fip; - U64 fdp; - } b64; - struct - { - U32 fip; - U16 fcs, _pad0; - U32 fdp; - U16 fds, _pad1; - } b32; - }; - U32 mxcsr; - U32 mxcsr_mask; - U128 st_space; - U256 xmm_space; - U8 padding[96]; -}; - -typedef struct DMN_LNX_XSaveHeader DMN_LNX_XSaveHeader; -struct DMN_LNX_XSaveHeader -{ - U64 xstate_bv; - U64 xcomp_bv; - U8 reserved[48]; -}; - -// TODO(rjf): -// -// this one is hacked; ymmh is not gauranteed to be at a fixed location -// and there can be more after that. Requires CPUID to be totally compliant to the standard. -// See intel's manual on the xsave format for more info. -// -typedef struct DMN_LNX_XSave DMN_LNX_XSave; -struct DMN_LNX_XSave -{ - DMN_LNX_XSaveLegacy legacy; - DMN_LNX_XSaveHeader header; - U8 ymmh[256]; -}; - typedef struct DMN_LNX_UserX64 DMN_LNX_UserX64; struct DMN_LNX_UserX64 { - DMN_LNX_UserRegsX64 regs; + struct + { + U64 r15; + U64 r14; + U64 r13; + U64 r12; + U64 rbp; + U64 rbx; + U64 r11; + U64 r10; + U64 r9; + U64 r8; + U64 rax; + U64 rcx; + U64 rdx; + U64 rsi; + U64 rdi; + U64 orig_rax; + U64 rip; + U64 cs; + U64 rflags; + U64 rsp; + U64 ss; + U64 fsbase; + U64 gsbase; + U64 ds; + U64 es; + U64 fs; + U64 gs; + } regs; S32 u_fpvalid, _pad0; - DMN_LNX_XSaveLegacy i387; + X64_FXSave i387; U64 u_tsize, u_dsize, u_ssize, start_code, start_stack; U64 signal; S32 reserved, _pad1; @@ -129,74 +83,66 @@ struct DMN_LNX_UserX64 U8 u_comm[32]; U64 u_debugreg[8]; }; +StaticAssert(sizeof(DMN_LNX_UserX64) == 912, g_dmn_lnx_user_x64_size_check); -typedef struct DMN_LNX_UserRegsX86 DMN_LNX_UserRegsX86; -struct DMN_LNX_UserRegsX86 +//////////////////////////////// +//~ Probes + +typedef struct DMN_LNX_Probe DMN_LNX_Probe; +struct DMN_LNX_Probe { - U32 ebx; - U32 ecx; - U32 edx; - U32 esi; - U32 edi; - U32 ebp; - U32 eax; - U32 ds; - U32 es; - U32 fs; - U32 gs; - U32 orig_eax; - U32 eip; - U32 cs; - U32 eflags; - U32 sp; - U32 ss; + String8 provider; + String8 name; + String8 args; + U64 pc; + U64 semaphore; }; -// NOTE(rjf): (32-Bit Protected Mode Format) -typedef struct DMN_LNX_FSave DMN_LNX_FSave; -struct DMN_LNX_FSave +typedef struct DMN_LNX_ProbeNode DMN_LNX_ProbeNode; +struct DMN_LNX_ProbeNode { - // control registers - U16 fcw; - U16 _pad0; - U16 fsw; - U16 _pad1; - U16 ftw; - U16 _pad2; - U32 fip; - U16 fips; - U16 fop; - U32 fdp; - U16 fds; - U16 _pad3; - - // data registers - U8 st[80]; + DMN_LNX_Probe v; + DMN_LNX_ProbeNode *next; }; -typedef struct DMN_LNX_UserX86 DMN_LNX_UserX86; -struct DMN_LNX_UserX86 +typedef struct DMN_LNX_ProbeList DMN_LNX_ProbeList; +struct DMN_LNX_ProbeList { - DMN_LNX_UserRegsX86 regs; - S32 u_fpvalid; - DMN_LNX_FSave i387; - U32 u_tsize, u_dsize, u_ssize, start_code, start_stack; - S32 signal, reserved; - U32 u_ar0, u_fpstate; - U32 magic; - U8 u_comm[32]; - U32 u_debugreg[8]; + U64 count; + DMN_LNX_ProbeNode *first; + DMN_LNX_ProbeNode *last; }; -#pragma pack(pop) +#define DMN_LNX_Probe_XList \ + X(InitStart, "init_start") \ + X(InitComplete, "init_complete") \ + X(RelocStart, "reloc_start") \ + X(RelocComplete, "reloc_complete") \ + X(MapStart, "map_start") \ + X(MapComplete, "map_complete") \ + X(UnmapStart, "unmap_start") \ + X(UnmapComplete, "unmap_complete") \ + X(LongJmp, "longjmp") \ + X(LongJmpTarget, "longjmp_target") \ + X(SetJmp, "setjmp") + +typedef enum +{ + DMN_LNX_ProbeType_Null, + +#define X(_N,...) DMN_LNX_ProbeType_##_N, + DMN_LNX_Probe_XList +#undef X + DMN_LNX_ProbeType_Count, +} DMN_LNX_ProbeType; //////////////////////////////// //~ rjf: Process Info Extraction Types -typedef struct DMN_LNX_ProcessAux DMN_LNX_ProcessAux; -struct DMN_LNX_ProcessAux +typedef struct DMN_LNX_ProcessAuxv DMN_LNX_ProcessAuxv; +struct DMN_LNX_ProcessAuxv { - B32 filled; + U64 base; U64 phnum; U64 phent; U64 phdr; @@ -211,29 +157,15 @@ struct DMN_LNX_PhdrInfo U64 dynamic; }; -typedef struct DMN_LNX_ModuleInfo DMN_LNX_ModuleInfo; -struct DMN_LNX_ModuleInfo +typedef struct DMN_LNX_DynamicInfo DMN_LNX_DynamicInfo; +struct DMN_LNX_DynamicInfo { - Rng1U64 vaddr_range; - U64 name; - U64 phvaddr; - U64 phentsize; - U64 phcount; -}; - -typedef struct DMN_LNX_ModuleInfoNode DMN_LNX_ModuleInfoNode; -struct DMN_LNX_ModuleInfoNode -{ - DMN_LNX_ModuleInfoNode *next; - DMN_LNX_ModuleInfo v; -}; - -typedef struct DMN_LNX_ModuleInfoList DMN_LNX_ModuleInfoList; -struct DMN_LNX_ModuleInfoList -{ - DMN_LNX_ModuleInfoNode *first; - DMN_LNX_ModuleInfoNode *last; - U64 count; + U64 hash_vaddr; + U64 gnu_hash_vaddr; + U64 strtab_vaddr; + U64 strtab_size; + U64 symtab_vaddr; + U64 symtab_entry_size; }; //////////////////////////////// @@ -262,11 +194,33 @@ struct DMN_LNX_Entity U32 gen; Arch arch; U64 id; + + // process + Arena *arena; int fd; + pid_t tracer_tid; + B32 expect_rdebug_data_breakpoint; + U64 rdebug_vaddr; + U64 rdebug_brk_vaddr; + ELF_Class dl_class; + HashTable *loaded_modules_ht; + U64 probe_vaddrs[DMN_LNX_ProbeType_Count]; + + // process x64 + U64 xcr0; + U64 xsave_size; + X64_XSaveLayout xsave_layout; + + // thread B32 expecting_dummy_sigstop; + void *reg_block; + + // module + U64 base_vaddr; U64 phvaddr; U64 phentsize; U64 phcount; + B8 is_active; }; typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode; @@ -276,6 +230,14 @@ struct DMN_LNX_EntityNode DMN_LNX_Entity *v; }; +typedef struct DMN_LNX_EntityList DMN_LNX_EntityList; +struct DMN_LNX_EntityList +{ + U64 count; + DMN_LNX_EntityNode *first; + DMN_LNX_EntityNode *last; +}; + //////////////////////////////// //~ rjf: Main State Bundle @@ -302,6 +264,10 @@ struct DMN_LNX_State B32 has_halt_injection; U64 halt_code; U64 halt_user_data; + + DMN_EventKind last_event_kind; + pid_t last_stop_pid; + int last_sig_code; }; read_only global DMN_LNX_Entity dmn_lnx_nil_entity = {&dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity}; @@ -311,35 +277,53 @@ thread_static B32 dmn_lnx_ctrl_thread = 0; //////////////////////////////// //~ rjf: Helpers +internal DMN_LNX_EntityNode * dmn_lnx_entity_list_push(Arena *arena, DMN_LNX_EntityList *list, DMN_LNX_Entity *v); + //- rjf: file descriptor memory reading/writing helpers internal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst); internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); #define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) #define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) +internal String8 dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size); internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr); -internal void * dmn_lnx_read_raw(Arena *arena, int memory_fd, Rng1U64 vrange); -internal String8 dmn_lnx_read_block(Arena *arena, int memory_fd, Rng1U64 vrange); + +//////////////////////////////// +//~ Runtime Struct Helpers + +internal B32 dmn_lnx_read_ehdr(int memory_fd, U64 addr, ELF_Hdr64 *ehdr_out); +internal B32 dmn_lnx_read_phdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr_out); +internal B32 dmn_lnx_read_shdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr_out); +internal B32 dmn_lnx_read_linkmap(int memory_fd, U64 addr, ELF_Class elf_class, GNU_LinkMap64 *link_map_out); +internal B32 dmn_lnx_read_dynamic(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dyn_out); +internal B32 dmn_lnx_read_symbol(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Sym64 *symbol_out); +internal B32 dmn_lnx_read_r_debug(int memory_fd, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebug_out); //- rjf: pid => info extraction -internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); -internal Arch dmn_lnx_arch_from_pid(pid_t pid); -internal DMN_LNX_ProcessAux dmn_lnx_aux_from_pid(pid_t pid, Arch arch); +internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); +internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid); +internal DMN_LNX_ProcessAuxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class); -//- rjf: phdr info extraction -internal DMN_LNX_PhdrInfo dmn_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phsize, U64 phcount); - -//- rjf: process entity => info extraction -internal DMN_LNX_ModuleInfoList dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process); +//- ELF/GNU info from memory +internal DMN_LNX_PhdrInfo dmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum); +internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); +internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr); //////////////////////////////// //~ rjf: Entity Functions internal DMN_LNX_Entity *dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind); -internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); -internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); +internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); +internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); internal DMN_LNX_Entity *dmn_lnx_entity_from_handle(DMN_Handle handle); internal DMN_LNX_Entity *dmn_lnx_thread_from_pid(pid_t pid); + +internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread); +internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread); +internal B32 dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip); +internal B32 dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp); internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block); internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block); +internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on); + #endif // DEMON_CORE_LINUX_H From bda3a7137924acfcb9a564b7819a33fd8765f3fb Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 31 Oct 2025 12:53:06 -0700 Subject: [PATCH 043/850] argument parser for simple STAP arguments --- src/base/base_strings.c | 16 ++ src/base/base_strings.h | 1 + src/stap/stap_parse.c | 364 ++++++++++++++++++++++++++++++++++++++++ src/stap/stap_parse.h | 74 ++++++++ src/stap/stap_test.c | 114 +++++++++++++ 5 files changed, 569 insertions(+) create mode 100644 src/stap/stap_parse.c create mode 100644 src/stap/stap_parse.h create mode 100644 src/stap/stap_test.c diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 7c39715d..0728bedf 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -616,6 +616,22 @@ str8_is_integer(String8 string, U32 radix) return result; } +internal B32 +str8_is_integer_signed(String8 string, U32 radix) +{ + B32 result = 0; + String8 sign = str8_prefix(string, 1); + if(str8_match(sign, str8_lit("-"), 0)) + { + result = str8_is_integer(str8_skip(string, 1), radix); + } + else + { + result = str8_is_integer(string, radix); + } + return result; +} + internal U64 u64_from_str8(String8 string, U32 radix) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 5a14e3dc..37c7acb2 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -233,6 +233,7 @@ internal String8 push_cstr(Arena *arena, String8 str); // TODO(rjf): this is unn //- rjf: string -> integer internal S64 sign_from_str8(String8 string, String8 *string_tail); internal B32 str8_is_integer(String8 string, U32 radix); +internal B32 str8_is_integer_signed(String8 string, U32 radix); internal U64 u64_from_str8(String8 string, U32 radix); internal S64 s64_from_str8(String8 string, U32 radix); internal U32 u32_from_str8(String8 string, U32 radix); diff --git a/src/stap/stap_parse.c b/src/stap/stap_parse.c new file mode 100644 index 00000000..932b47d0 --- /dev/null +++ b/src/stap/stap_parse.c @@ -0,0 +1,364 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal B32 +stap_is_scale_valid(U64 scale) +{ + local_persist B8 valid_sizes[9] = { 0, 1, 1, 0, 1, 0, 0, 0, 1 }; + B32 is_valid = scale < ArrayCount(valid_sizes) && valid_sizes[scale]; + return is_valid; +} + +internal U64 +stap_parse_digit(U8 *begin, U8 *end, U64 *digit_out) +{ + U8 *ptr = begin; + if (ptr < end && *ptr == '-') { + ptr += 1; + } + for (;ptr < end; ptr += 1) { + if (!char_is_digit(*ptr, 10)) { break; } + } + String8 digit_str = str8(begin, (U64)(ptr - begin)); + if (digit_out) { + *digit_out = u64_from_str8(digit_str, 10); + } + return digit_str.size; +} + +internal U64 +stap_skip_whitespace(U8 *begin, U8 *end) +{ + U8 *ptr = begin; + for (; ptr < end && *ptr == ' '; ptr += 1); + U64 size = (U64)(ptr - begin); + return size; +} + +internal U64 +stap_parse_ident(U8 *begin, U8 *end, String8 *ident_out) +{ + U8 *ptr = begin; + for (; ptr < end; ptr += 1) { + if (!char_is_alpha(*ptr) && !char_is_digit(*ptr, 10)) { break; } + } + String8 ident = str8(begin, (U64)(ptr - begin)); + if (ident_out) { *ident_out = ident; } + return ident.size; +} + +internal U64 +stap_size_from_arg(String8 string) +{ + U64 tag_sep = str8_find_needle(string, 0, str8_lit("@"), 0); + U64 next_tag_sep = str8_find_needle(string, tag_sep + 1, str8_lit("@"), 0); + U64 arg_end = str8_find_needle_reverse(string, next_tag_sep, str8_lit(" "), 0); + return arg_end == 0 ? string.size : arg_end; +} + +internal String8List +stap_list_from_string(Arena *arena, String8 string) +{ + String8List result = {0}; + for (U64 cursor = 0, arg_size; cursor < string.size; cursor += arg_size) { + arg_size = stap_size_from_arg(str8_skip(string, cursor)); + String8 arg = str8_substr(string, r1u64(cursor, cursor + arg_size)); + str8_list_push(arena, &result, arg); + } + return result; +} + +internal String8 +stap_parse_args_x64(String8 string, STAP_Arg *arg_out) +{ + String8 error = str8_lit("unknown parse error"); + U64 sep_pos = str8_find_needle(string, 0, str8_lit("@"), 0); + if (sep_pos < string.size) { + STAP_Arg arg = {0}; + + String8 tag = str8_prefix(string, sep_pos + 1); + String8 oper = str8_skip(string, tag.size); + + STAP_ArgValueType arg_value_type = STAP_ArgValueType_Null; + U64 arg_value_size = 0; + B32 infer_arg_value_size = 1; + U64 tag_size = 0; + { + U8 *ptr = tag.str, *end = tag.str + tag.size; + + // is signed? + if (ptr >= end) { goto operand_parse_exit; } + if (*ptr == '-') { + arg_value_type = STAP_ArgValueType_S; + ptr += 1; + } + + // parse optional size + if (ptr >= end) { goto operand_parse_exit; } + if (char_is_digit(*ptr, 10)) { + arg_value_size = *ptr - '0'; + if (!stap_is_scale_valid(arg_value_size)) { + error = str8_lit("invalid operand size"); + goto operand_parse_exit; + } + ptr += 1; + infer_arg_value_size = 0; + } + + // is this float? + if (ptr >= end) { goto operand_parse_exit; } + if (*ptr == 'f') { + if (arg_value_type != STAP_ArgValueType_Null) { + error = str8_lit("illegal combination of modifiers '-' and 'f'"); + goto operand_parse_exit; + } + ptr += 1; + arg_value_type = STAP_ArgValueType_F; + } + + // assume default value type to be unsigned + if (arg_value_type == STAP_ArgValueType_Null) { + arg_value_type = STAP_ArgValueType_U; + } + + if (ptr >= end) { goto operand_parse_exit; } + if (*ptr != '@') { + error = str8_lit("failed to find @"); + goto operand_parse_exit; + } + ptr += 1; + + tag_size = (U64)(ptr - tag.str); + } + + U64 memory_ref_start = str8_find_needle_reverse(oper, 0, str8_lit("("), 0); + // memory operand + if (memory_ref_start > 0 && memory_ref_start < oper.size) { + // + // Expected syntax for memory operand: { [Disp] (Base [',' Index [',' Scale]]) } | { $IMM } | { %reg } + // + // Disp: { [+|-]Digits } | { Expr } + // Base: %reg + // Index: %reg + // Scale: 1|2|4|8 + // Expr: A small C-like infix expression + // + + // find closing ')' + U64 memory_ref_end = str8_find_needle(oper, memory_ref_start+1, str8_lit(")"), 0); + if (memory_ref_end > oper.size) { + error = str8_lit("missing closing ')'"); + goto operand_parse_exit; + } + if (memory_ref_end >= oper.size) { + error = str8_lit("expression does not terminate after ')'"); + goto operand_parse_exit; + } + + // parse displacement + String8 disp_str = str8_skip_chop_whitespace(str8_prefix(oper, memory_ref_start-1)); + if (disp_str.size > 0 && !str8_is_integer_signed(disp_str, 10)) { + error = str8_lit("displacement is too complicated, only integral displacement is supported"); + goto operand_parse_exit; + } + S64 disp = s64_from_str8(disp_str, 10); + + // parse base, index, scale + String8 base_index_scale = str8_skip_chop_whitespace(str8_substr(oper, r1u64(memory_ref_start, memory_ref_end))); + U64 first_comma = str8_find_needle(base_index_scale, 0, str8_lit(","), 0); + U64 second_comma = str8_find_needle(base_index_scale, first_comma+1, str8_lit(","), 0); + String8 base_str = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(0, first_comma))); + String8 index_str = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(first_comma + 1, second_comma))); + String8 scale_str = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(second_comma + 1, memory_ref_end))); + + // syntax check + if(first_comma >= base_index_scale.size && base_str.size == 0) { + error = str8_lit("missing base register"); + goto operand_parse_exit; + } + if (first_comma < base_index_scale.size && index_str.size == 0) { + error = str8_lit("missing index register"); + goto operand_parse_exit; + } + if (second_comma < base_index_scale.size && scale_str.size == 0) { + error = str8_lit("missing scale"); + goto operand_parse_exit; + } + if (base_str.size > 0 && !str8_match(str8_lit("%"), base_str, StringMatchFlag_RightSideSloppy)) { + error = str8_lit("invalid base register"); + goto operand_parse_exit; + } + if (first_comma < base_index_scale.size && (index_str.size < 2 || !str8_match(str8_lit("%"), index_str, StringMatchFlag_RightSideSloppy))) { + error = str8_lit("invalid index register"); + goto operand_parse_exit; + } + if (second_comma < base_index_scale.size && (scale_str.size > 0 && !str8_is_integer(scale_str, 10))) { + error = str8_lit("invalid of scale (expected unsigned integral type)"); + goto operand_parse_exit; + } + + // stip '%' prefix + base_str = str8_skip(base_str, 1); + index_str = str8_skip(index_str, 1); + + // parse base + B8 base_is_alias = 0; + U32 base_reg_code = 0; + if (base_str.size) { + base_reg_code = regs_reg_code_from_name(Arch_x64, base_str); + if (base_reg_code == 0) { + base_reg_code = regs_alias_code_from_name(Arch_x64, base_str); + base_is_alias = base_reg_code != 0; + } + if (base_reg_code == 0) { + error = str8_lit("unknown base register"); + goto operand_parse_exit; + } + } + + // parse index + B8 index_is_alias = 0; + U32 index_reg_code = 0; + if (index_str.size) { + index_reg_code = regs_reg_code_from_name(Arch_x64, index_str); + if (index_reg_code == 0) { + index_reg_code = regs_alias_code_from_name(Arch_x64, index_str); + index_is_alias = index_reg_code != 0; + } + if (index_reg_code == 0) { + error = str8_lit("unknown index register"); + } + } + + // parse scale + U64 scale = 1; + if (scale_str.size) { + scale = u64_from_str8(scale_str, 10); + if (!stap_is_scale_valid(scale)) { + error = str8_lit("invalid scale value (expected 1/2/4/8)"); + goto operand_parse_exit; + } + } + + if (infer_arg_value_size) { + error = str8_lit("memory operands must have a sice"); + goto operand_parse_exit; + } + + // fill out memory ref portion + arg.type = STAP_ArgType_MemoryRef; + arg.memory_ref.disp = disp; + arg.memory_ref.base.reg_code = base_reg_code; + arg.memory_ref.base.is_alias = base_is_alias; + arg.memory_ref.index.reg_code = index_reg_code; + arg.memory_ref.index.is_alias = index_is_alias; + arg.memory_ref.scale = scale; + } + // $imm + else if (str8_match(str8_lit("$"), oper, StringMatchFlag_RightSideSloppy)) { + String8 imm_str = str8_skip(oper, 1); + + U64 imm_size = str8_find_needle(imm_str, 0, str8_lit(" "), 0); + if (imm_size > imm_str.size ) { + imm_size = imm_str.size; + } + imm_str = str8_prefix(imm_str, imm_size); + + if (imm_str.size == 0) { + goto operand_parse_exit; + } + + U64 imm = 0; + B32 is_parsed = 0; + switch (arg_value_type) { + case STAP_ArgValueType_Null: + case STAP_ArgValueType_U: + case STAP_ArgValueType_F: { + is_parsed = try_u64_from_str8_c_rules(imm_str, &imm); + } break; + case STAP_ArgValueType_S: { + is_parsed = try_s64_from_str8_c_rules(imm_str, (S64 *)&imm); + } break; + default: { InvalidPath; } break; + } + + if (!is_parsed) { + error = str8_lit("failed to parse immediate"); + goto operand_parse_exit; + } + + arg.type = STAP_ArgType_Imm; + arg.imm = imm; + } + // %reg + else if (str8_match(str8_lit("%"), oper, StringMatchFlag_RightSideSloppy)) { + // skip % + String8 reg_str = str8_skip(oper, 1); + if (reg_str.size == 0) { + goto operand_parse_exit; + } + + B8 is_reg_alias = 0; + U32 reg_code = regs_reg_code_from_name(Arch_x64, reg_str); + if (reg_code == 0) { + reg_code = regs_alias_code_from_name(Arch_x64, reg_str); + is_reg_alias = reg_code != 0; + } + if (reg_code == 0) { + error = str8_lit("invalid register name"); + goto operand_parse_exit; + } + + arg.type = STAP_ArgType_Reg; + arg.reg.is_alias = is_reg_alias; + arg.reg.reg_code = reg_code; + } else { + goto operand_parse_exit; + } + + // fill out value portion + arg.value_type = arg_value_type == STAP_ArgValueType_Null ? STAP_ArgValueType_U : arg_value_type; + arg.value_size = arg_value_size; + + // write output + if (arg_out) { + *arg_out = arg; + } + + // clear error tracker + error = str8_zero(); + +operand_parse_exit:; + } else { + error = str8_lit("invalid argument string"); + } + + return error; +} + +internal STAP_ArgArray +stap_arg_array_from_string(Arena *arena, Arch arch, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List arg_strings = stap_list_from_string(scratch.arena, string); + STAP_ArgArray result = {0}; + result.v = push_array(arena, STAP_Arg, arg_strings.node_count); + for EachNode(n, String8Node, arg_strings.first) { + STAP_Arg *arg = &result.v[result.count++]; + + switch (arch) { + case Arch_Null: {} break; + case Arch_x64: { + stap_parse_args_x64(n->string, arg); + } break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: { NotImplemented; } break; + default: { InvalidPath; } break; + } + } + scratch_end(scratch); + return result; +} + + diff --git a/src/stap/stap_parse.h b/src/stap/stap_parse.h new file mode 100644 index 00000000..74897711 --- /dev/null +++ b/src/stap/stap_parse.h @@ -0,0 +1,74 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef STAP_PARSE_H +#define STAP_PARSE_H + +typedef enum STAP_ArgType +{ + STAP_ArgType_Null, + STAP_ArgType_Imm, + STAP_ArgType_Reg, + STAP_ArgType_MemoryRef, +} STAP_ArgType; + +typedef enum STAP_ArgValueType +{ + STAP_ArgValueType_Null, + STAP_ArgValueType_U, + STAP_ArgValueType_S, + STAP_ArgValueType_F, +} STAP_ArgValueType; + +typedef struct STAP_Arg +{ + STAP_ArgValueType value_type; + U64 value_size; + STAP_ArgType type; + union { + U64 imm; + struct { + U32 reg_code; + B8 is_alias; + } reg; + struct { + S64 disp; + struct { + U32 reg_code; + B8 is_alias; + } base; + struct { + U32 reg_code; + B8 is_alias; + } index; + U64 scale; + } memory_ref; + }; +} STAP_Arg; + +typedef struct STAP_ArgArray +{ + U64 count; + STAP_Arg *v; +} STAP_ArgArray; + +typedef struct STAP_ArgValue +{ + STAP_ArgValueType value_type; + U8 value_size; + void *raw_ptr; +} STAP_ArgValue; + +typedef struct STAP_ArgValueArray +{ + U64 count; + STAP_ArgValue *v; +} STAP_ArgValueArray; + +//////////////////////////////// + +internal String8 stap_parse_args_x64(String8 string, STAP_Arg *arg_out); +internal STAP_ArgArray stap_arg_array_from_string(Arena *arena, Arch arch, String8 string); + +#endif // STAP_PARSE_H + diff --git a/src/stap/stap_test.c b/src/stap/stap_test.c new file mode 100644 index 00000000..70c31539 --- /dev/null +++ b/src/stap/stap_test.c @@ -0,0 +1,114 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#define BUILD_TITLE "STAP Parser Test" +#define BUILD_CONSOLE_INTERFACE 1 + +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "regs/regs.h" +#include "stap/stap_parse.h" + +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "regs/regs.c" +#include "stap/stap_parse.c" + +internal void +entry_point(CmdLine *cmd_line) +{ + B32 passed = 0; + STAP_Arg arg = {0}; + String8 error = {0}; + String8 string = {0}; + + string = str8_lit("-2@$-123"); + error = stap_parse_args_x64(string, &arg); + if (error.size != 0) { goto exit; } + AssertAlways(arg.value_type == STAP_ArgValueType_S); + AssertAlways(arg.value_size == 2); + AssertAlways(arg.type == STAP_ArgType_Imm); + AssertAlways((S64)arg.imm == -123); + + string = str8_lit("1@$43"); + error = stap_parse_args_x64(string, &arg); + if (error.size != 0) { goto exit; } + AssertAlways(arg.value_type == STAP_ArgValueType_U); + AssertAlways(arg.value_size == 1); + AssertAlways(arg.type == STAP_ArgType_Imm); + AssertAlways((S64)arg.imm == 43); + + string = str8_lit("4f@%eax"); + error = stap_parse_args_x64(string, &arg); + if (error.size != 0) { goto exit; } + AssertAlways(arg.value_type == STAP_ArgValueType_F); + AssertAlways(arg.value_size == 4); + AssertAlways(arg.type == STAP_ArgType_Reg); + AssertAlways(arg.reg.is_alias == 1); + AssertAlways(arg.reg.reg_code == REGS_AliasCodeX64_eax); + + string = str8_lit("4@(%rdi)"); + error = stap_parse_args_x64(string, &arg); + if (error.size != 0) { goto exit; } + AssertAlways(arg.value_size == 4); + AssertAlways(arg.value_type == STAP_ArgValueType_U); + AssertAlways(arg.type == STAP_ArgType_MemoryRef); + AssertAlways(arg.memory_ref.disp == 0); + AssertAlways(arg.memory_ref.base.reg_code == REGS_RegCodeX64_rdi); + AssertAlways(!arg.memory_ref.base.is_alias); + AssertAlways(arg.memory_ref.index.reg_code == 0); + AssertAlways(arg.memory_ref.index.is_alias == 0); + AssertAlways(arg.memory_ref.scale == 1); + + string = str8_lit("4@-22(%rdi)"); + error = stap_parse_args_x64(string, &arg); + if (error.size != 0) { goto exit; } + AssertAlways(arg.value_size == 4); + AssertAlways(arg.value_type == STAP_ArgValueType_U); + AssertAlways(arg.type == STAP_ArgType_MemoryRef); + AssertAlways(arg.memory_ref.disp == -22); + AssertAlways(arg.memory_ref.base.reg_code == REGS_RegCodeX64_rdi); + AssertAlways(!arg.memory_ref.base.is_alias); + AssertAlways(arg.memory_ref.index.reg_code == 0); + AssertAlways(arg.memory_ref.index.is_alias == 0); + AssertAlways(arg.memory_ref.scale == 1); + + string = str8_lit("4@32(%rax,%rsi,8)"); + error = stap_parse_args_x64(string, &arg); + if (error.size != 0) { goto exit; } + AssertAlways(arg.value_size == 4); + AssertAlways(arg.value_type == STAP_ArgValueType_U); + AssertAlways(arg.memory_ref.disp == 32); + AssertAlways(arg.memory_ref.base.reg_code == REGS_RegCodeX64_rax); + AssertAlways(arg.memory_ref.base.is_alias == 0); + AssertAlways(arg.memory_ref.index.reg_code == REGS_RegCodeX64_rsi); + AssertAlways(arg.memory_ref.index.is_alias == 0); + AssertAlways(arg.memory_ref.scale == 8); + + string = str8_lit("4@32(,%rsi,8)"); + error = stap_parse_args_x64(string, &arg); + if (error.size != 0) { goto exit; } + AssertAlways(arg.value_size == 4); + AssertAlways(arg.value_type == STAP_ArgValueType_U); + AssertAlways(arg.memory_ref.disp == 32); + AssertAlways(arg.memory_ref.base.reg_code == 0); + AssertAlways(arg.memory_ref.index.reg_code == REGS_RegCodeX64_rsi); + AssertAlways(arg.memory_ref.scale == 8); + + error = stap_parse_args_x64(str8_lit("4@(,,)"), &arg); + if (error.size == 0) { goto exit; } + + error = stap_parse_args_x64(str8_lit("4@()"), &arg); + if (error.size == 0) { goto exit; } + + error = stap_parse_args_x64(str8_lit("4@(%rdi, %rsi, 8"), &arg); + if (error.size == 0) { goto exit; } + + error = stap_parse_args_x64(str8_lit("4@( ,, 8"), &arg); + if (error.size == 0) { goto exit; } + + passed = 1; +exit:; + AssertAlways(passed); +} + From e1a46f7d2132ce4168393996ac64280ee53d4546 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 11:28:33 -0800 Subject: [PATCH 044/850] reader for STAP arguments --- src/regs/regs.c | 48 ++++++++++++++++++++++++ src/regs/regs.h | 3 ++ src/stap/stap_parse.c | 86 ++++++++++++++++++++++++++++++++++++++++--- src/stap/stap_parse.h | 8 ++++ 4 files changed, 139 insertions(+), 6 deletions(-) diff --git a/src/regs/regs.c b/src/regs/regs.c index f55d133a..2127200d 100644 --- a/src/regs/regs.c +++ b/src/regs/regs.c @@ -9,6 +9,54 @@ //////////////////////////////// //~ rjf: Helpers +internal REGS_RegCode +regs_reg_code_from_name(Arch arch, String8 name) +{ + String8 *name_table = regs_reg_code_string_table_from_arch(arch); + U64 name_count = regs_reg_code_count_from_arch(arch); + for EachIndex(i, name_count) + { + if(str8_match(name_table[i], name, StringMatchFlag_CaseInsensitive)) + { + return (REGS_RegCode)i; + } + } + return 0; +} + +internal REGS_AliasCode +regs_alias_code_from_name(Arch arch, String8 name) +{ + String8 *alias_table = regs_alias_code_string_table_from_arch(arch); + U64 alias_count = regs_alias_code_count_from_arch(arch); + for EachIndex(i, alias_count) + { + if(str8_match(alias_table[i], name, StringMatchFlag_CaseInsensitive)) + { + return (REGS_RegCode)i; + } + } + return 0; +} + +internal Rng1U64 +regs_range_from_code(Arch arch, B32 is_alias, U64 reg_code) +{ + Rng1U64 range = {0}; + if(is_alias) + { + REGS_Slice slice = regs_alias_code_slice_table_from_arch(arch)[reg_code]; + REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[reg_code]; + range = r1u64(rng.byte_off + slice.byte_off, rng.byte_off + slice.byte_off + slice.byte_size); + } + else + { + REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[reg_code]; + range = r1u64(rng.byte_off, rng.byte_off + rng.byte_size); + } + return range; +} + internal U64 regs_rip_from_arch_block(Arch arch, void *block) { diff --git a/src/regs/regs.h b/src/regs/regs.h index 4d781fc9..27c1efcd 100644 --- a/src/regs/regs.h +++ b/src/regs/regs.h @@ -108,6 +108,9 @@ struct REGS_Slice //////////////////////////////// //~ rjf: Helpers +internal REGS_RegCode regs_reg_code_from_name(Arch arch, String8 name); +internal REGS_AliasCode regs_alias_code_from_name(Arch arch, String8 name); +internal Rng1U64 regs_range_from_code(Arch arch, B32 is_alias, U64 reg_code); internal U64 regs_block_size_from_arch(Arch arch); internal U64 regs_reg_code_count_from_arch(Arch arch); internal U64 regs_alias_code_count_from_arch(Arch arch); diff --git a/src/stap/stap_parse.c b/src/stap/stap_parse.c index 932b47d0..ae9302b0 100644 --- a/src/stap/stap_parse.c +++ b/src/stap/stap_parse.c @@ -4,9 +4,7 @@ internal B32 stap_is_scale_valid(U64 scale) { - local_persist B8 valid_sizes[9] = { 0, 1, 1, 0, 1, 0, 0, 0, 1 }; - B32 is_valid = scale < ArrayCount(valid_sizes) && valid_sizes[scale]; - return is_valid; + return IsPow2(scale) && scale <= 8; } internal U64 @@ -52,7 +50,7 @@ stap_size_from_arg(String8 string) { U64 tag_sep = str8_find_needle(string, 0, str8_lit("@"), 0); U64 next_tag_sep = str8_find_needle(string, tag_sep + 1, str8_lit("@"), 0); - U64 arg_end = str8_find_needle_reverse(string, next_tag_sep, str8_lit(" "), 0); + U64 arg_end = str8_find_needle_reverse(string, string.size - next_tag_sep, str8_lit(" "), 0); return arg_end == 0 ? string.size : arg_end; } @@ -292,8 +290,8 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) } // %reg else if (str8_match(str8_lit("%"), oper, StringMatchFlag_RightSideSloppy)) { - // skip % - String8 reg_str = str8_skip(oper, 1); + // skip % and strip white space + String8 reg_str = str8_skip_chop_whitespace(str8_skip(oper, 1)); if (reg_str.size == 0) { goto operand_parse_exit; } @@ -361,4 +359,80 @@ stap_arg_array_from_string(Arena *arena, Arch arch, String8 string) return result; } +internal B32 +stap_read_arg(STAP_Arg arg, + Arch arch, + void *reg_block, + STAP_MemoryRead *memory_read, + void *memory_read_ctx, + void *raw_value) +{ + AssertAlways(arg.value_size <= 8); + + B32 is_value_read = 0; + + switch (arg.type) { + case STAP_ArgType_Null: break; + case STAP_ArgType_Imm: { + MemoryCopy(raw_value, &arg.imm, arg.value_size); + is_value_read = 1; + } break; + case STAP_ArgType_Reg: { + Rng1U64 range = regs_range_from_code(arch, arg.reg.is_alias, arg.reg.reg_code); + U64 copy_size = Min(arg.value_size, dim_1u64(range)); + MemoryCopy(raw_value, (U8 *)reg_block + range.min, copy_size); + is_value_read = 1; + } break; + case STAP_ArgType_MemoryRef: { + U64 base = 0; + if(arg.memory_ref.base.reg_code) { + Rng1U64 range = regs_range_from_code(arch, arg.memory_ref.base.is_alias, arg.memory_ref.base.reg_code); + U64 copy_size = Min(sizeof(base), dim_1u64(range)); + MemoryCopy(&base, (U8 *)reg_block + range.min, copy_size); + } + + U64 index = 0; + if(arg.memory_ref.index.reg_code) { + Rng1U64 range = regs_range_from_code(arch, arg.memory_ref.index.is_alias, arg.memory_ref.index.reg_code); + U64 copy_size = Min(sizeof(base), dim_1u64(range)); + MemoryCopy(&index, (U8 *)reg_block + range.min, copy_size); + } + + U64 addr = arg.memory_ref.disp + (base + index * arg.memory_ref.scale); + if (memory_read(addr, raw_value, arg.value_size, memory_read_ctx)) { + is_value_read = 1; + } + } break; + default: { InvalidPath; } break; + } + + if (arg.value_size < 8) { + if (arg.value_type == STAP_ArgValueType_S) { + *(U64 *)raw_value = extend_sign64(*(U64 *)raw_value, arg.value_size); + } else if (arg.value_type == STAP_ArgValueType_F) { + Assert(arg.value_size == 4); + *(F64 *)raw_value = *(F32 *)raw_value; + } + } + + return is_value_read; +} + +internal B32 +stap_read_arg_u(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, U64 *u_out) +{ + return stap_read_arg(arg, arch, reg_block, memory_read, memory_read_ctx, u_out); +} + +internal B32 +stap_read_arg_s(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, S64 *s_out) +{ + return stap_read_arg(arg, arch, reg_block, memory_read, memory_read_ctx, s_out); +} + +internal B32 +stap_read_arg_f(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, F64 *f_out) +{ + return stap_read_arg(arg, arch, reg_block, memory_read, memory_read_ctx, f_out); +} diff --git a/src/stap/stap_parse.h b/src/stap/stap_parse.h index 74897711..43101a36 100644 --- a/src/stap/stap_parse.h +++ b/src/stap/stap_parse.h @@ -65,10 +65,18 @@ typedef struct STAP_ArgValueArray STAP_ArgValue *v; } STAP_ArgValueArray; +#define STAP_MEMORY_READ(name) B32 name(U64 addr, void *buffer, U64 read_size, void *raw_ctx) +typedef STAP_MEMORY_READ(STAP_MemoryRead); + //////////////////////////////// internal String8 stap_parse_args_x64(String8 string, STAP_Arg *arg_out); internal STAP_ArgArray stap_arg_array_from_string(Arena *arena, Arch arch, String8 string); +internal B32 stap_read_arg(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, void *raw_value); +internal B32 stap_read_arg_u(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, U64 *u_out); +internal B32 stap_read_arg_s(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, S64 *s_out); +internal B32 stap_read_arg_f(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, F64 *f_out); + #endif // STAP_PARSE_H From f832ac191cb99144262d2bf285ac80cf5c1d49f6 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 11:29:15 -0800 Subject: [PATCH 045/850] implement process API under Linux --- src/os/core/linux/os_core_linux.c | 137 ++++++++++++++++++++++++++++-- src/os/core/linux/os_core_linux.h | 1 + 2 files changed, 133 insertions(+), 5 deletions(-) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index b254cf17..2a886046 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -652,7 +652,7 @@ os_shared_memory_alloc(U64 size, String8 name) { Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR, 0); + int id = shm_open((char *)name_copy.str, O_RDWR | O_CREAT, 0); ftruncate(id, size); OS_Handle result = {(U64)id}; scratch_end(scratch); @@ -770,13 +770,138 @@ os_sleep_milliseconds(U32 msec) internal OS_Handle os_process_launch(OS_ProcessLaunchParams *params) { - NotImplemented; + OS_Handle handle = {0}; + + posix_spawn_file_actions_t file_actions = {0}; + int file_actions_init_code = posix_spawn_file_actions_init(&file_actions); + if(file_actions_init_code == 0) + { + // redirect STDOUT + int stdout_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdout_file.u64[0], STDOUT_FILENO); + Assert(stdout_code == 0); + + // redirect STDERR + int stderr_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stderr_file.u64[0], STDERR_FILENO); + Assert(stderr_code == 0); + + // redirect STDIN + int stdin_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdin_file.u64[0], STDIN_FILENO); + Assert(stdin_code == 0); + + posix_spawnattr_t attr = {0}; + int attr_init_code = posix_spawnattr_init(&attr); + if(attr_init_code == 0) + { + Temp scratch = scratch_begin(0, 0); + + // make path to exe + String8 path_to_exe; + { + String8List l = str8_split_path(scratch.arena, params->path); + str8_list_push(scratch.arena, &l, params->cmd_line.first->string); + path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); + } + + // package argv + char **argv = push_array(scratch.arena, char *, params->cmd_line.node_count + 1); + { + argv[0] = (char *)path_to_exe.str; + U64 arg_idx = 1; + for EachNode(n, String8Node, params->cmd_line.first->next) { argv[arg_idx++] = (char *)n->string.str; } + } + + // package envp + char **envp = 0; + if(params->inherit_env) + { + envp = __environ; + } + else + { + envp = push_array(scratch.arena, char *, params->env.node_count + 2); + U64 env_idx = 0; + for EachNode(n, String8Node, params->cmd_line.first) + { + envp[env_idx] = (char *)n->string.str; + } + } + + if(params->debug_subprocesses) + { + // not suported + InvalidPath; + } + + if(!params->consoleless) + { + NotImplemented; + } + + // spawn process + pid_t pid = 0; + int spawn_code = posix_spawn(&pid, (char *)path_to_exe.str, &file_actions, &attr, argv, envp); + + if(spawn_code == 0) + { + handle.u64[0] = (U64)pid; + } + + // clean up attributes + int attr_destroy_code = posix_spawnattr_destroy(&attr); + Assert(attr_destroy_code == 0); + + scratch_end(scratch); + } + + // clean up file actions + int file_actions_destroy_code = posix_spawn_file_actions_destroy(&file_actions); + Assert(file_actions_destroy_code == 0); + } + + return handle; } internal B32 os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) { - NotImplemented; + pid_t pid = (pid_t)handle.u64[0]; + B32 result = 0; + if(endt_us == 0) + { + if(kill(pid, 0) >= 0) + { + result = (errno == ENOENT); + + if(result) + { + int status; + waitpid(pid, &status, 0); + } + } + else { Assert(0 && "failed to get status from pid"); } + } + else if(endt_us == max_U64) + { + for(;;) + { + int status = 0; + int w = waitpid(pid, &status, 0); + if(w == -1) + { + break; + } + if(WIFEXITED(status) || WIFSTOPPED(status) || WIFSIGNALED(status)) + { + result = 1; + break; + } + } + } + else + { + NotImplemented; + } + return result; } internal U64 @@ -788,13 +913,15 @@ os_process_array_join(OS_HandleArray processes, U64 endt_us, U64 *exit_code_out) internal void os_process_detach(OS_Handle handle) { - NotImplemented; + // no need to close pid } internal B32 os_process_kill(OS_Handle handle) { - NotImplemented; + int error_code = kill((pid_t)handle.u64[0], SIGKILL); + B32 is_killed = error_code == 0; + return is_killed; } //////////////////////////////// diff --git a/src/os/core/linux/os_core_linux.h b/src/os/core/linux/os_core_linux.h index 7b335fbb..c3136d3b 100644 --- a/src/os/core/linux/os_core_linux.h +++ b/src/os/core/linux/os_core_linux.h @@ -27,6 +27,7 @@ #include #include #include +#include pid_t gettid(void); int pthread_setname_np(pthread_t thread, const char *name); From c8c993d4e8c42a05c0b39478836b5066caef5170 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 11:29:34 -0800 Subject: [PATCH 046/850] filter for threads --- src/ctrl/ctrl_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 4b81d987..ed111ad1 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -5358,6 +5358,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) if(process->kind != CTRL_EntityKind_Process) { continue; } for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) { + if(thread->kind != CTRL_EntityKind_Thread) { continue; } U64 rip = dmn_rip_from_thread(thread->handle.dmn_handle); // rjf: determine if thread is frozen From 66606b0327f042866ad8fb1bf56d4179306c5dfd Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 11:34:19 -0800 Subject: [PATCH 047/850] use STAP probes to generate load and unload module events --- src/demon/linux/demon_core_linux.c | 314 +++++++++++++++++++---------- src/demon/linux/demon_core_linux.h | 43 ++-- src/raddbg/raddbg_main.c | 2 + 3 files changed, 232 insertions(+), 127 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 59f60572..57e851a7 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -590,7 +590,7 @@ exit:; } //////////////////////////////// -//~ Probes +//~ SDT Probes internal DMN_LNX_ProbeList dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) @@ -657,6 +657,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) U64 note_read_size = dmn_lnx_read(fd, note_range, raw_note); if(note_read_size != dim_1u64(note_range)) { goto exit; } + Arch arch = arch_from_elf_machine(ehdr.e_machine); ELF_NoteList note = elf_parse_note(scratch.arena, str8(raw_note, dim_1u64(note_range)), ehdr.e_ident[ELF_Identifier_Class], ehdr.e_machine); for EachNode(n, ELF_NoteNode, note.first) @@ -701,7 +702,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) probe.provider = provider; probe.name = name; - probe.args = args; + probe.args = stap_arg_array_from_string(arena, arch, args); probe.pc = pc + probe_rebase; probe.semaphore = semaphore ? semaphore + probe_rebase : 0; } @@ -717,6 +718,17 @@ exit:; return probes; } +//////////////////////////////// +//~ STAP + +internal +STAP_MEMORY_READ(dmn_lnx_stap_memory_read) +{ + DMN_LNX_Entity *process = raw_ctx; + U64 bytes_read = dmn_lnx_read(process->fd, r1u64(addr, addr + read_size), buffer); + return bytes_read == read_size; +} + //////////////////////////////// //~ rjf: Entity Functions @@ -1331,6 +1343,120 @@ dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on) return is_flag_set; } +internal void +dmn_lnx_process_loaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 new_link_map_vaddr) +{ + GNU_LinkMap64 map = {0}; + for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) + { + // read out new link map item + if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { goto exit; } + + // was module with this base already registered? + DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); + if(module) { continue; } + + // parse out module's ELF header + ELF_Hdr64 module_ehdr = {0}; + if(!dmn_lnx_read_ehdr(process->fd, map.addr_vaddr, &module_ehdr)) { goto exit; } + + // gather info about module + U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? map.addr_vaddr : 0; + U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; + DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); + String8 module_name = dmn_lnx_read_string(process->arena, process->fd, map.name_vaddr); + + // fill out module + module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); + module->id = map.name_vaddr; + module->base_vaddr = map.addr_vaddr; + + // push load event + if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->module = dmn_lnx_handle_from_entity(module); + e->arch = arch_from_elf_machine(module_ehdr.e_machine); + e->address = map.addr_vaddr; + e->size = dim_1u64(module_phdr_info.range); + e->string = module_name; + e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); + e->elf_phdr_entsize = module_ehdr.e_phentsize; + } + + // create mapping for base -> module + hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module); + } + + exit:; +} + +internal void +dmn_lnx_process_unloaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 rdebug_vaddr) +{ + Temp scratch = scratch_begin(&arena, 1); + B32 is_unmap_complete_finished = 0; + + GNU_RDebugInfo64 rdebug = {0}; + if(!dmn_lnx_read_r_debug(process->fd, rdebug_vaddr, process->arch, &rdebug)) { goto exit; } + if(rdebug.r_version != 1) { goto exit; } + + // flag every module as inactive + for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next) + { + if(module->kind != DMN_LNX_EntityKind_Module) {continue;} + module->is_live = 0; + } + + // loop over modules in the link map and mark live modules + GNU_LinkMap64 map = {0}; + for(U64 map_vaddr = rdebug.r_map; map_vaddr != 0; map_vaddr = map.next_vaddr) + { + if(dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) + { + DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); + if(module) + { + module->is_live = 1; + } + else { Assert(0 && "unknown module is being unloaded"); } + } + else { Assert(0 && "unable to read Link Map"); } + } + + // unload inactive modules + DMN_HandleList to_release = {0}; + for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next) + { + if(module->kind != DMN_LNX_EntityKind_Module) {continue;} + if(module->is_live) {continue;} + dmn_handle_list_push(scratch.arena, &to_release, dmn_lnx_handle_from_entity(module)); + } + + // push events and clean up internal structures + for EachNode(n, DMN_HandleNode, to_release.first) + { + DMN_LNX_Entity *module = dmn_lnx_entity_from_handle(n->v); + + DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->module = dmn_lnx_handle_from_entity(module); + e->string = dmn_lnx_read_string(arena, process->fd, module->id); + + hash_table_purge_u64(process->loaded_modules_ht, module->base_vaddr); + + dmn_lnx_entity_release(module); + } + + is_unmap_complete_finished = 1; +exit:; + Assert(is_unmap_complete_finished); + scratch_end(scratch); +} + //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) @@ -1626,31 +1752,34 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) } AssertAlways(dl_path.size); - DMN_LNX_ProbeList probes = {0}; + // alloc arena for the process + Arena *process_arena = arena_alloc(); + + DMN_LNX_Probe **known_probes = push_array(process_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); { + DMN_LNX_ProbeList probes = {0}; int dl_fd = open((char *)dl_path.str, O_RDONLY); if(dl_fd >= 0) { - probes = dmn_lnx_read_probes(scratch.arena, dl_fd, 0, auxv.base); + probes = dmn_lnx_read_probes(process_arena, dl_fd, 0, auxv.base); close(dl_fd); } - } - DMN_LNX_Probe *known_probes[DMN_LNX_ProbeType_Count] = {0}; - for EachNode(n, DMN_LNX_ProbeNode, probes.first) - { - DMN_LNX_Probe *p = &n->v; - if(str8_match(p->provider, str8_lit("rtld"), 0)) + for EachNode(n, DMN_LNX_ProbeNode, probes.first) { -#define X(_N,_S) if(str8_match(p->name, str8_lit(_S), 0)) { known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } - DMN_LNX_Probe_XList -#undef X + DMN_LNX_Probe *p = &n->v; + if(str8_match(p->provider, str8_lit("rtld"), 0)) + { + #define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } + DMN_LNX_Probe_XList + #undef X + } } } // install DL probes U64 probe_vaddrs[DMN_LNX_ProbeType_Count] = {0}; - for EachIndex(i, ArrayCount(known_probes)) + for EachIndex(i, DMN_LNX_ProbeType_Count) { if(known_probes[i] == 0) { continue; } @@ -1676,8 +1805,9 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) process->rdebug_brk_vaddr = rdebug_brk_vaddr; process->expect_rdebug_data_breakpoint = rdebug_vaddr != 0; process->dl_class = dl_class; - process->arena = arena_alloc(); - process->loaded_modules_ht = hash_table_init(process->arena, 0x1000); + process->arena = process_arena; + process->loaded_modules_ht = hash_table_init(process_arena, 0x1000); + process->probes = known_probes; process->xcr0 = xcr0; process->xsave_size = Max(xsave_size, sizeof(X64_XSave)); process->xsave_layout = xsave_layout; @@ -1697,7 +1827,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) main_thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); main_thread->id = pid; main_thread->arch = process->arch; - main_thread->reg_block = push_array(dmn_lnx_state->entities_arena, U8, regs_block_size_from_arch(process->arch)); + main_thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); dmn_lnx_thread_read_reg_block(main_thread, main_thread->reg_block); { DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); @@ -1840,6 +1970,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { ProfScope("write all traps into memory") { + HashTable *ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) { for EachIndex(n_idx, n->count) @@ -1848,6 +1979,9 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(trap->flags == 0) { + DMN_ActiveTrap *is_set = hash_table_search_u64_raw(ht, trap->vaddr); + if(is_set) {continue;} + U8 swap_byte = 0; if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &swap_byte) > 0) { @@ -1858,6 +1992,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) active_trap->trap = trap; active_trap->swap_byte = swap_byte; SLLQueuePush(active_trap_first, active_trap_last, active_trap); + + hash_table_push_u64_raw(scratch.arena, ht, trap->vaddr, active_trap); } else { Assert(0 && "failed to write trap"); } } else { Assert(0 && "failed to read original byte"); } } @@ -2168,120 +2304,84 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) break; } } - - // rollback IP on user traps - if(hit_user_trap) - { - U64 ip = dmn_lnx_thread_read_ip(thread); - dmn_lnx_thread_write_ip(thread, ip - 1); - } } // is this a probe trap? - if(!hit_user_trap && e_kind == DMN_EventKind_Breakpoint) + if(e_kind == DMN_EventKind_Breakpoint) { - B32 skip_event = 0; - // find which probe was triggered - U64 ip = dmn_lnx_thread_read_ip(thread) - 1; + U64 ip = dmn_lnx_thread_read_ip(thread); DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; for EachIndex(i, ArrayCount(process->probe_vaddrs)) { - if(process->probe_vaddrs[i] == ip) + if(process->probe_vaddrs[i] == ip-1) { probe_type = i; - skip_event = 1; break; } } - // handle the probe - if((probe_type == DMN_LNX_ProbeType_InitStart || probe_type == DMN_LNX_ProbeType_InitComplete)) + if(probe_type == DMN_LNX_ProbeType_InitComplete) { - GNU_RDebugInfo64 rdebug = {0}; - dmn_lnx_read_r_debug(process->fd, process->rdebug_vaddr, process->arch, &rdebug); - - switch(rdebug.r_state) + U64 name_space_id = 0, rdebug_addr = 0; + DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_InitComplete]; + if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { - case GNU_RT_Add: - case GNU_RT_Delete: - case GNU_RT_Consistent: + if(stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { - // flag every module as inactive - for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next) + GNU_RDebugInfo64 rdebug = {0}; + if(dmn_lnx_read_r_debug(process->fd, rdebug_addr, process->arch, &rdebug)) { - if(module->kind != DMN_LNX_EntityKind_Module) {continue;} - module->is_active = 0; - } - - for(U64 map_vaddr = rdebug.r_map; map_vaddr!= 0; ) - { - // read out link map - GNU_LinkMap64 map = {0}; - if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { Assert(0 && "unable to read Link Map"); } - - // make new module if never seen before - DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); - if(module == 0) + if(rdebug.r_version == 1) { - ELF_Hdr64 module_ehdr = {0}; - if(!dmn_lnx_read_ehdr(process->fd, map.addr_vaddr, &module_ehdr)) { NotImplemented; } - - U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? map.addr_vaddr : 0; - U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; - DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); - String8 module_name = dmn_lnx_read_string(process->arena, process->fd, map.name_vaddr); - - module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); - module->id = map.name_vaddr; - module->base_vaddr = map.addr_vaddr; - - if (!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) - { - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->module = dmn_lnx_handle_from_entity(module); - e->arch = arch_from_elf_machine(module_ehdr.e_machine); - e->address = map.addr_vaddr; - e->size = dim_1u64(module_phdr_info.range); - e->string = module_name; - e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); - e->elf_phdr_entsize = module_ehdr.e_phentsize; - } - - hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module); + dmn_lnx_process_loaded_modules(arena, &evts, process, name_space_id, rdebug.r_map); } - - // do not unload module - module->is_active = 1; - - // advance to next link map - map_vaddr = map.next_vaddr; + else { Assert(0 && "unexpected version number"); } } - - // unload inactive modules - for(DMN_LNX_Entity *module = process->first, *module_next; module != &dmn_lnx_nil_entity; module = module_next) - { - module_next = module->next; - if(module->kind != DMN_LNX_EntityKind_Module) {continue;} - if(module->is_active) {continue;} - - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->module = dmn_lnx_handle_from_entity(module); - e->string = dmn_lnx_read_string(arena, process->fd, module->id); - - hash_table_purge_u64(process->loaded_modules_ht, module->base_vaddr); - dmn_lnx_entity_release(module); - } - } break; - default: { Assert(0 && "unexpected state"); } break; + else { Assert(0 && "failed to read rdebug"); } + } + else { Assert(0 && "failed to parse second argument"); } } + else { Assert(0 && "failed to parse first argument"); } + } + else if(probe_type == DMN_LNX_ProbeType_RelocComplete) + { + U64 name_space_id = 0, new_link_map_addr = 0; + DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_RelocComplete]; + if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) + { + if(stap_read_arg_u(probe->args.v[2], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) + { + dmn_lnx_process_loaded_modules(arena, &evts, process, name_space_id, new_link_map_addr); + } + else { Assert(0 && "failed to parse third argument"); } + } + else { Assert(0 && "failed to parse first argument"); } + } + else if(probe_type == DMN_LNX_ProbeType_UnmapComplete) + { + // read probe's arguments + U64 name_space_id = 0, rdebug_vaddr = 0; + DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_UnmapComplete]; + if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) + { + if(stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) + { + dmn_lnx_process_unloaded_modules(arena, &evts, process, name_space_id, rdebug_vaddr); + } + else { Assert(0 && "failed to read second argument"); } + } + else { Assert(0 && "failed to read first argument"); } } - if(skip_event) {break;} + if(probe_type != DMN_LNX_ProbeType_Null) {break;} + } + + // rollback IP on user traps + if(hit_user_trap) + { + U64 ip = dmn_lnx_thread_read_ip(thread); + dmn_lnx_thread_write_ip(thread, ip - 1); } switch(e_kind) diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index b49a9a92..be4ea7e1 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -86,16 +86,17 @@ struct DMN_LNX_UserX64 StaticAssert(sizeof(DMN_LNX_UserX64) == 912, g_dmn_lnx_user_x64_size_check); //////////////////////////////// -//~ Probes +//~ SDT Probes typedef struct DMN_LNX_Probe DMN_LNX_Probe; struct DMN_LNX_Probe { - String8 provider; - String8 name; - String8 args; - U64 pc; - U64 semaphore; + String8 provider; + String8 name; + String8 args_string; + STAP_ArgArray args; + U64 pc; + U64 semaphore; }; typedef struct DMN_LNX_ProbeNode DMN_LNX_ProbeNode; @@ -113,23 +114,22 @@ struct DMN_LNX_ProbeList DMN_LNX_ProbeNode *last; }; -#define DMN_LNX_Probe_XList \ - X(InitStart, "init_start") \ - X(InitComplete, "init_complete") \ - X(RelocStart, "reloc_start") \ - X(RelocComplete, "reloc_complete") \ - X(MapStart, "map_start") \ - X(MapComplete, "map_complete") \ - X(UnmapStart, "unmap_start") \ - X(UnmapComplete, "unmap_complete") \ - X(LongJmp, "longjmp") \ - X(LongJmpTarget, "longjmp_target") \ - X(SetJmp, "setjmp") +#define DMN_LNX_Probe_XList \ + X(InitStart, 2, "init_start") \ + X(InitComplete, 2, "init_complete") \ + X(RelocStart, 2, "reloc_start") \ + X(RelocComplete, 3, "reloc_complete") \ + X(MapStart, 2, "map_start") \ + X(MapComplete, 3, "map_complete") \ + X(UnmapStart, 2, "unmap_start") \ + X(UnmapComplete, 2, "unmap_complete") \ + X(LongJmp, 3, "longjmp") \ + X(LongJmpTarget, 3, "longjmp_target") \ + X(SetJmp, 3, "setjmp") typedef enum { DMN_LNX_ProbeType_Null, - #define X(_N,...) DMN_LNX_ProbeType_##_N, DMN_LNX_Probe_XList #undef X @@ -204,6 +204,7 @@ struct DMN_LNX_Entity U64 rdebug_brk_vaddr; ELF_Class dl_class; HashTable *loaded_modules_ht; + DMN_LNX_Probe **probes; U64 probe_vaddrs[DMN_LNX_ProbeType_Count]; // process x64 @@ -220,7 +221,7 @@ struct DMN_LNX_Entity U64 phvaddr; U64 phentsize; U64 phcount; - B8 is_active; + B8 is_live; }; typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode; @@ -324,6 +325,8 @@ internal B32 dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp); internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block); internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block); +//////////////////////////////// + internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on); #endif // DEMON_CORE_LINUX_H diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index e1f2e543..dad95fca 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -230,6 +230,7 @@ #include "regs/rdi/regs_rdi.h" #include "dbg_info/dbg_info.h" #include "disasm/disasm.h" +#include "stap/stap_parse.h" #include "demon/demon_inc.h" #include "eval/eval_inc.h" #include "eval_visualization/eval_visualization_inc.h" @@ -280,6 +281,7 @@ #include "regs/rdi/regs_rdi.c" #include "dbg_info/dbg_info.c" #include "disasm/disasm.c" +#include "stap/stap_parse.c" #include "demon/demon_inc.c" #include "eval/eval_inc.c" #include "eval_visualization/eval_visualization_inc.c" From 880b8135cc6257a87f072e0b3d44f1dd1f66afa4 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 11:37:03 -0800 Subject: [PATCH 048/850] add per-item purging to the hash table --- src/coff/coff_lib_writer.c | 5 +- src/linker/hash_table.c | 92 +++++++++++++++++++++++----------- src/linker/hash_table.h | 17 ++++--- src/linker/lnk.c | 2 +- src/linker/lnk_config.c | 14 +++--- src/linker/lnk_debug_info.c | 13 +++-- src/linker/lnk_section_table.c | 4 +- 7 files changed, 89 insertions(+), 58 deletions(-) diff --git a/src/coff/coff_lib_writer.c b/src/coff/coff_lib_writer.c index aeb9a3d2..152e558a 100644 --- a/src/coff/coff_lib_writer.c +++ b/src/coff/coff_lib_writer.c @@ -184,10 +184,7 @@ coff_lib_writer_serialize(Arena *arena, COFF_LibWriter *lib_writer, COFF_TimeSta U64 name_with_slash_size = member->name.size + 1; if (name_with_slash_size > COFF_Archive_MaxShortNameSize) { // have we seen this member name before? - KeyValuePair *is_present = hash_table_search_string(name_ht, member->name); - if (is_present) { - name = is_present->value_string; - } else { + if (!hash_table_search_string_string(name_ht, member->name, &name)) { name = push_str8f(scratch.arena, "/%u", long_names_list.total_size); str8_list_pushf(scratch.arena, &long_names_list, "%S/\n", member->name); hash_table_push_string_string(scratch.arena, name_ht, member->name, name); diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index 22276591..58c9daea 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -64,8 +64,8 @@ hash_table_push(Arena *arena, HashTable *ht, U64 hash, KeyValuePair v) node->v = v; U64 ibucket = hash % ht->cap; - SLLQueuePush(ht->buckets[ibucket].first, ht->buckets[ibucket].last, node); - ++ht->count; + DLLPushBack(ht->buckets[ibucket].first, ht->buckets[ibucket].last, node); + ht->count += 1; return node; } @@ -162,7 +162,7 @@ hash_table_push_path_raw(Arena *arena, HashTable *ht, String8 path, void *value) //////////////////////////////// -internal KeyValuePair * +internal BucketNode * hash_table_search_string(HashTable *ht, String8 key_string) { U64 hash = hash_table_hasher(key_string); @@ -170,13 +170,13 @@ hash_table_search_string(HashTable *ht, String8 key_string) BucketList *bucket = ht->buckets + ibucket; for (BucketNode *n = bucket->first; n != 0; n = n->next) { if (str8_match(n->v.key_string, key_string, 0)) { - return &n->v; + return n; } } return 0; } -internal KeyValuePair * +internal BucketNode * hash_table_search_u32(HashTable *ht, U32 key_u32) { U64 hash = hash_table_hasher(str8_struct(&key_u32)); @@ -184,13 +184,13 @@ hash_table_search_u32(HashTable *ht, U32 key_u32) BucketList *bucket = ht->buckets + ibucket; for (BucketNode *n = bucket->first; n != 0; n = n->next) { if (n->v.key_u32 == key_u32) { - return &n->v; + return n; } } return 0; } -internal KeyValuePair * +internal BucketNode * hash_table_search_u64(HashTable *ht, U64 key_u64) { U64 hash = hash_table_hasher(str8_struct(&key_u64)); @@ -198,25 +198,25 @@ hash_table_search_u64(HashTable *ht, U64 key_u64) BucketList *bucket = ht->buckets + ibucket; for (BucketNode *n = bucket->first; n != 0; n = n->next) { if (n->v.key_u64 == key_u64) { - return &n->v; + return n; } } return 0; } -internal KeyValuePair * +internal BucketNode * hash_table_search_path(HashTable *ht, String8 path) { Temp scratch = scratch_begin(0,0); String8 path_canon = path; path_canon = lower_from_str8(scratch.arena, path_canon); path_canon = path_convert_slashes(scratch.arena, path_canon, PathStyle_UnixAbsolute); - KeyValuePair *result = hash_table_search_string(ht, path_canon); + BucketNode *result = hash_table_search_string(ht, path_canon); scratch_end(scratch); return result; } -internal KeyValuePair * +internal BucketNode * hash_table_search_raw(HashTable *ht, void *key) { U64 hash = hash_table_hasher(str8_struct(&key)); @@ -224,7 +224,7 @@ hash_table_search_raw(HashTable *ht, void *key) BucketList *bucket = ht->buckets + ibucket; for (BucketNode *n = bucket->first; n != 0; n = n->next) { if (n->v.key_raw == key) { - return &n->v; + return n; } } return 0; @@ -233,10 +233,10 @@ hash_table_search_raw(HashTable *ht, void *key) internal B32 hash_table_search_path_u64(HashTable *ht, String8 key, U64 *value_out) { - KeyValuePair *result = hash_table_search_path(ht, key); + BucketNode *result = hash_table_search_path(ht, key); if (result != 0) { if (value_out != 0) { - *value_out = result->value_u64; + *value_out = result->v.value_u64; } return 1; } @@ -260,10 +260,10 @@ hash_table_push_raw_raw(Arena *arena, HashTable *ht, void *key, void *value) internal B32 hash_table_search_string_u64(HashTable *ht, String8 key, U64 *value_out) { - KeyValuePair *result = hash_table_search_string(ht, key); + BucketNode *result = hash_table_search_string(ht, key); if (result != 0) { if (value_out != 0) { - *value_out = result->value_u64; + *value_out = result->v.value_u64; } return 1; } @@ -273,10 +273,10 @@ hash_table_search_string_u64(HashTable *ht, String8 key, U64 *value_out) internal B32 hash_table_search_string_string(HashTable *ht, String8 key, String8 *value_out) { - KeyValuePair *result = hash_table_search_string(ht, key); + BucketNode *result = hash_table_search_string(ht, key); if (result) { if (value_out) { - *value_out = result->value_string; + *value_out = result->v.value_string; } return 1; } @@ -286,10 +286,10 @@ hash_table_search_string_string(HashTable *ht, String8 key, String8 *value_out) internal B32 hash_table_search_u32_u32(HashTable *ht, U32 key, U32 *value_out) { - KeyValuePair *result = hash_table_search_u32(ht, key); + BucketNode *result = hash_table_search_u32(ht, key); if (result) { if (value_out) { - *value_out = result->value_u32; + *value_out = result->v.value_u32; } return 1; } @@ -299,9 +299,9 @@ hash_table_search_u32_u32(HashTable *ht, U32 key, U32 *value_out) internal void * hash_table_search_string_raw(HashTable *ht, String8 key) { - KeyValuePair *result = hash_table_search_string(ht, key); + BucketNode *result = hash_table_search_string(ht, key); if (result) { - return result->value_raw; + return result->v.value_raw; } return 0; } @@ -309,22 +309,54 @@ hash_table_search_string_raw(HashTable *ht, String8 key) internal void * hash_table_search_u64_raw(HashTable *ht, U64 key_u64) { - KeyValuePair *kv = hash_table_search_u64(ht, key_u64); - return kv ? kv->value_raw : 0; + BucketNode *n = hash_table_search_u64(ht, key_u64); + return n ? n->v.value_raw : 0; } internal void * hash_table_search_path_raw(HashTable *ht, String8 path) { - KeyValuePair *kv = hash_table_search_path(ht, path); - return kv ? kv->value_raw : 0; + BucketNode *n = hash_table_search_path(ht, path); + return n ? n->v.value_raw : 0; } internal void * hash_table_search_raw_raw(HashTable *ht, void *key) { - KeyValuePair *kv = hash_table_search_raw(ht, key); - return kv ? kv->value_raw : 0; + BucketNode *n = hash_table_search_raw(ht, key); + return n ? n->v.value_raw : 0; +} + +internal void +hash_table_purge_item(HashTable *ht, U64 hash, BucketNode *node) +{ + U64 bucket_idx = hash % ht->cap; + DLLRemove(ht->buckets[bucket_idx].first, ht->buckets[bucket_idx].last, node); + ht->count -= 1; +} + +internal B32 +hash_table_purge_u64(HashTable *ht, U64 key) +{ + U64 hash = hash_table_hasher(str8_struct(&key)); + BucketNode *n = hash_table_search_u64(ht, key); + if (n) { + hash_table_purge_item(ht, hash, n); + return 1; + } + return 0; +} + +internal B32 +hash_table_purge_string(HashTable *ht, String8 key) +{ + U64 hash = hash_table_hasher(key); + BucketNode *n = hash_table_search_string(ht, key); + if (n) { + hash_table_purge_item(ht, hash, n); + return 1; + } + return 0; } internal int @@ -451,7 +483,7 @@ remove_duplicates_u64_array(Arena *arena, U64Array arr) HashTable *ht = hash_table_init(scratch.arena, ((U64)(F64)arr.count * 0.5)); for (U64 i = 0; i < arr.count; ++i) { - KeyValuePair *is_present = hash_table_search_u64(ht, arr.v[i]); + BucketNode *is_present = hash_table_search_u64(ht, arr.v[i]); if (!is_present) { hash_table_push_u64_raw(scratch.arena, ht, arr.v[i], 0); } @@ -474,7 +506,7 @@ remove_duplicates_str8_list(Arena *arena, String8List list) HashTable *ht = hash_table_init(scratch.arena, list.node_count); for (String8Node *node = list.first; node != 0; node = node->next) { - KeyValuePair *is_present = hash_table_search_string(ht, node->string); + BucketNode *is_present = hash_table_search_string(ht, node->string); if (!is_present) { hash_table_push_string_raw(scratch.arena, ht, node->string, 0); str8_list_push(arena, &result, node->string); diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 67e9e3dd..6498f14b 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -21,8 +21,9 @@ typedef struct KeyValuePair typedef struct BucketNode { - struct BucketNode *next; KeyValuePair v; + struct BucketNode *next; + struct BucketNode *prev; } BucketNode; typedef struct BucketList @@ -64,11 +65,11 @@ internal BucketNode * hash_table_push_path_u64 (Arena *arena, HashTable *ht, internal BucketNode * hash_table_push_u64_u64 (Arena *arena, HashTable *ht, U64 key, U64 value); internal BucketNode * hash_table_push_u32_u32 (Arena *arena, HashTable *ht, U32 key, U32 value); -internal KeyValuePair * hash_table_search_string (HashTable *ht, String8 key); -internal KeyValuePair * hash_table_search_u32 (HashTable *ht, U32 key); -internal KeyValuePair * hash_table_search_u64 (HashTable *ht, U64 key); -internal KeyValuePair * hash_table_search_path (HashTable *ht, String8 key); -internal KeyValuePair * hash_table_search_raw (HashTable *ht, void *key); +internal BucketNode * hash_table_search_string (HashTable *ht, String8 key); +internal BucketNode * hash_table_search_u32 (HashTable *ht, U32 key); +internal BucketNode * hash_table_search_u64 (HashTable *ht, U64 key); +internal BucketNode * hash_table_search_path (HashTable *ht, String8 key); +internal BucketNode * hash_table_search_raw (HashTable *ht, void *key); internal B32 hash_table_search_path_u64 (HashTable *ht, String8 key, U64 *value_out); internal B32 hash_table_search_string_u64 (HashTable *ht, String8 key, U64 *value_out); @@ -80,6 +81,10 @@ internal void * hash_table_search_u64_raw (HashTable *ht, U64 key); internal void * hash_table_search_path_raw (HashTable *ht, String8 key); internal void * hash_table_search_raw_raw (HashTable *ht, void *key); +internal void hash_table_purge_item (HashTable *ht, U64 hash, BucketNode *node); +internal B32 hash_table_purge_u64 (HashTable *ht, U64 key); +internal B32 hash_table_purge_string(HashTable *ht, String8 key); + // --- Key Value Helpers ------------------------------------------------------- internal U32 * keys_from_hash_table_u32 (Arena *arena, HashTable *ht); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 1a1c9b19..65534ce8 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1086,7 +1086,7 @@ lnk_inputer_push_lib_thin(LNK_Inputer *inputer, LNK_Config *config, LNK_InputSou // warn about missing library if (first_match.size == 0) { - KeyValuePair *was_reported = hash_table_search_path(inputer->missing_lib_ht, path); + BucketNode *was_reported = hash_table_search_path(inputer->missing_lib_ht, path); if (was_reported == 0) { hash_table_push_path_u64(inputer->arena, inputer->missing_lib_ht, path, 0); lnk_error(LNK_Warning_FileNotFound, "unable to find library `%S`", path); diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index a06de23b..c47d366c 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -1072,10 +1072,10 @@ lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string) i += text.size; if (open < close) { - String8 env_var_name = str8_substr(string, rng_1u64(open+1, close)); - KeyValuePair *match = hash_table_search_path(env_vars, env_var_name); + String8 env_var_name = str8_substr(string, rng_1u64(open+1, close)); + BucketNode *match = hash_table_search_path(env_vars, env_var_name); if (match) { - str8_list_push(scratch.arena, &list, match->value_string); + str8_list_push(scratch.arena, &list, match->v.value_string); i = close+1; } else { str8_list_pushf(scratch.arena, &list, "%%%S", env_var_name); @@ -2277,16 +2277,16 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) // collect LIB and LIBPATH if (config->flags & LNK_ConfigFlag_EnvLib) { - KeyValuePair *lib = hash_table_search_path(env_vars, str8_lit("lib")); + BucketNode *lib = hash_table_search_path(env_vars, str8_lit("lib")); if (lib) { - String8List val_list = str8_split_by_string_chars(scratch.arena, lib->value_string, str8_lit(";"), 0); + String8List val_list = str8_split_by_string_chars(scratch.arena, lib->v.value_string, str8_lit(";"), 0); String8List val_list_copy = str8_list_copy(arena, &val_list); str8_list_concat_in_place(&config->lib_dir_list, &val_list_copy); } - KeyValuePair *lib_path = hash_table_search_path(env_vars, str8_lit("libpath")); + BucketNode *lib_path = hash_table_search_path(env_vars, str8_lit("libpath")); if (lib_path) { - String8List val_list = str8_split_by_string_chars(scratch.arena, lib->value_string, str8_lit(";"), 0); + String8List val_list = str8_split_by_string_chars(scratch.arena, lib->v.value_string, str8_lit(";"), 0); String8List val_list_copy = str8_list_copy(arena, &val_list); str8_list_concat_in_place(&config->lib_dir_list, &val_list_copy); } diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index d277bee8..e546f3f3 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -587,9 +587,9 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla }; // was this type server queued? - KeyValuePair *is_path_queued = hash_table_search_path(type_server_path_ht, type_server_path); + BucketNode *is_path_queued = hash_table_search_path(type_server_path_ht, type_server_path); if (is_path_queued) { - struct HT_Value *present = is_path_queued->value_raw; + struct HT_Value *present = is_path_queued->v.value_raw; // make sure type servers sigs match if (MemoryMatchStruct(&ts.sig, &present->ts.sig)) { @@ -4705,9 +4705,9 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) // get link name through virtual offset look up String8 link_name = {0}; if (symbol.kind == CV_SymKind_GDATA32) { - KeyValuePair *pair = hash_table_search_u64(task->extern_symbol_voff_ht, data_voff); + BucketNode *pair = hash_table_search_u64(task->extern_symbol_voff_ht, data_voff); if (pair != 0) { - LNK_Symbol *link_symbol = pair->value_raw; + LNK_Symbol *link_symbol = pair->v.value_raw; link_name = link_symbol->name; } } @@ -4801,9 +4801,8 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) // get link name through virtual offset look up String8 link_name = str8(0,0); if (symbol.kind == CV_SymKind_GPROC32) { - KeyValuePair *pair = hash_table_search_u64(task->extern_symbol_voff_ht, virt_range.min); - if (pair != 0) { - LNK_Symbol *link_symbol = pair->value_raw; + LNK_Symbol *link_symbol = hash_table_search_u64_raw(task->extern_symbol_voff_ht, virt_range.min); + if (link_symbol) { link_name = link_symbol->name; } } diff --git a/src/linker/lnk_section_table.c b/src/linker/lnk_section_table.c index 7c3a464e..a095e64e 100644 --- a/src/linker/lnk_section_table.c +++ b/src/linker/lnk_section_table.c @@ -161,9 +161,7 @@ lnk_section_table_purge(LNK_SectionTable *sectab, String8 name) LNK_SectionNode *node = lnk_section_table_remove(sectab, name); String8 name_with_flags = lnk_make_name_with_flags(scratch.arena, name, node->data.flags); - KeyValuePair *kv = hash_table_search_string(sectab->sect_ht, name_with_flags); - kv->key_string = str8_zero(); - kv->value_raw = 0; + hash_table_purge_string(sectab->sect_ht, name_with_flags); scratch_end(scratch); } From 857860fb276671ab0aff9395efe55cab9cdd21ca Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 11:55:16 -0800 Subject: [PATCH 049/850] remove unused includes and inline ptrace options define --- src/demon/linux/demon_core_linux.c | 3 ++- src/demon/linux/demon_core_linux.h | 12 +----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 57e851a7..6dd8e298 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -1636,7 +1636,8 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) //- rjf: successful launch case LaunchStatus_Success: { - setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(DMN_LNX_PTRACE_OPTIONS)); + uintptr_t trace_options = PTRACE_O_TRACEEXIT|PTRACE_O_EXITKILL|PTRACE_O_TRACEFORK|PTRACE_O_TRACEVFORK|PTRACE_O_TRACECLONE; + setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(trace_options)); if(setoptions_result == -1) { error__need_child_kill = 1; goto error; } ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index be4ea7e1..b5b11498 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -8,22 +8,12 @@ //~ rjf: Includes #include -#include #include #include -#include #include -#include -#include //////////////////////////////// -//~ rjf: ptrace options - -#define DMN_LNX_PTRACE_OPTIONS (PTRACE_O_TRACEEXIT|\ -PTRACE_O_EXITKILL|\ -PTRACE_O_TRACEFORK|\ -PTRACE_O_TRACEVFORK|\ -PTRACE_O_TRACECLONE) +//~ SIGTRAP codes enum { From 90c4e1604e9cbd3aacbcfb3b42d12f826648e2f2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 18:13:45 -0800 Subject: [PATCH 050/850] implement semaphore open and clsoe --- src/os/core/linux/os_core_linux.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 2a886046..80407d50 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -1223,13 +1223,20 @@ os_semaphore_release(Semaphore semaphore) internal Semaphore os_semaphore_open(String8 name) { - NotImplemented; + Semaphore result = {0}; + sem_t *s = sem_open((char *)name.str, 0); + if(s != SEM_FAILED) + { + result.u64[0] = (U64)s; + } + return result; } internal void os_semaphore_close(Semaphore semaphore) { - NotImplemented; + sem_t *s = (sem_t *)semaphore.u64[0]; + sem_close(s); } internal B32 From 1cb1522931b9307f2f0c5e3516737a732158dc9f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 18:14:01 -0800 Subject: [PATCH 051/850] minor cleanup --- src/os/core/linux/os_core_linux.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 80407d50..1b3fa320 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -794,17 +794,13 @@ os_process_launch(OS_ProcessLaunchParams *params) { Temp scratch = scratch_begin(0, 0); - // make path to exe - String8 path_to_exe; - { - String8List l = str8_split_path(scratch.arena, params->path); - str8_list_push(scratch.arena, &l, params->cmd_line.first->string); - path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); - } - // package argv char **argv = push_array(scratch.arena, char *, params->cmd_line.node_count + 1); { + String8List l = str8_split_path(scratch.arena, params->path); + str8_list_push(scratch.arena, &l, params->cmd_line.first->string); + String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); + argv[0] = (char *)path_to_exe.str; U64 arg_idx = 1; for EachNode(n, String8Node, params->cmd_line.first->next) { argv[arg_idx++] = (char *)n->string.str; } @@ -839,7 +835,7 @@ os_process_launch(OS_ProcessLaunchParams *params) // spawn process pid_t pid = 0; - int spawn_code = posix_spawn(&pid, (char *)path_to_exe.str, &file_actions, &attr, argv, envp); + int spawn_code = posix_spawn(&pid, argv[0], &file_actions, &attr, argv, envp); if(spawn_code == 0) { From 69fe51ec94749895f6e10ac76c32e9382a6ead94 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 3 Nov 2025 18:14:28 -0800 Subject: [PATCH 052/850] set permissions on shared memory --- src/os/core/linux/os_core_linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 1b3fa320..872bd1b9 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -652,7 +652,7 @@ os_shared_memory_alloc(U64 size, String8 name) { Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR | O_CREAT, 0); + int id = shm_open((char *)name_copy.str, O_RDWR | O_CREAT, 0666); ftruncate(id, size); OS_Handle result = {(U64)id}; scratch_end(scratch); From b00d3d9041697b556eae3ac1787b614f52033d1c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 4 Nov 2025 13:40:00 -0800 Subject: [PATCH 053/850] print out call stacks on crashes --- build.sh | 4 +- src/os/core/linux/os_core_linux.c | 69 +++++++++++++++++++++++++++++++ src/os/core/linux/os_core_linux.h | 5 ++- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/build.sh b/build.sh index f7ea6139..ecd0ce6e 100644 --- a/build.sh +++ b/build.sh @@ -19,12 +19,12 @@ git_hash=$(git describe --always --dirty) git_hash_full=$(git rev-parse HEAD) # --- Compile/Link Line Definitions ------------------------------------------- -clang_common="-I../src/ -I/usr/include/freetype2/ -I../local/ -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wno-unknown-warning-option -fdiagnostics-absolute-paths -Wall -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Wno-for-loop-analysis -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" +clang_common="-I../src/ -I/usr/include/freetype2/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wno-unknown-warning-option -fdiagnostics-absolute-paths -Wall -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Wno-for-loop-analysis -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" clang_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${clang_common} ${auto_compile_flags}" clang_release="$compiler -g -O2 -DBUILD_DEBUG=0 ${clang_common} ${auto_compile_flags}" clang_link="-lpthread -lm -lrt -ldl" clang_out="-o" -gcc_common="-I../src/ -I../local/ -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wno-unknown-warning-option -Wall -Wno-missing-braces -Wno-unused-function -Wno-attributes -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-compare-distinct-pointer-types -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" +gcc_common="-I../src/ -I../local/ -g -D_GNU_SOURCE -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wno-unknown-warning-option -Wall -Wno-missing-braces -Wno-unused-function -Wno-attributes -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-compare-distinct-pointer-types -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" gcc_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${gcc_common} ${auto_compile_flags}" gcc_release="$compiler -g -O2 -DBUILD_DEBUG=0 ${gcc_common} ${auto_compile_flags}" gcc_link="-lpthread -lm -lrt -ldl" diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 872bd1b9..1e6b71e5 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -1399,9 +1399,78 @@ os_make_guid(void) //////////////////////////////// //~ rjf: @os_hooks Entry Points (Implemented Per-OS) +internal void +lnx_signal_handler(int sig, siginfo_t *info, void *arg) +{ + local_persist volatile U32 first = 0; + if (ins_atomic_u32_eval_cond_assign(&first, 1, 0) != 0) + { + for(;;) + { + sleep(UINT32_MAX); + } + } + + local_persist void *ips[4096]; + int ips_count = backtrace(ips, ArrayCount(ips)); + + fprintf(stderr, "A fatal signal was received: %s (%d). The process is terminating.\n", strsignal(sig), sig); + fprintf(stderr, "Create a new issue with this report at %s.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); + fprintf(stderr, "Callstack:\n"); + for EachIndex(i, ips_count) + { + Dl_info info = {0}; + dladdr(ips[i], &info); + + char cmd[2048]; + snprintf(cmd, sizeof(cmd), "llvm-symbolizer --relative-address -f -e %s %lu", info.dli_fname, (unsigned long)ips[i] - (unsigned long)info.dli_fbase); + FILE *f = popen(cmd, "r"); + if(f) + { + char func_name[256], file_name[256]; + if(fgets(func_name, sizeof(func_name), f) && fgets(file_name, sizeof(file_name), f)) + { + String8 func = str8_cstring(func_name); + if(func.size > 0) func.size -= 1; + String8 module = str8_skip_last_slash(str8_cstring(info.dli_fname)); + String8 file = str8_skip_last_slash(str8_cstring_capped(file_name, file_name + sizeof(file_name))); + if(file.size > 0) file.size -= 1; + + B32 no_func = str8_match(func, str8_lit("??"), StringMatchFlag_RightSideSloppy); + B32 no_file = str8_match(file, str8_lit("??"), StringMatchFlag_RightSideSloppy); + if(no_func) { func = str8_zero(); } + if(no_file) { file = str8_zero(); } + + fprintf(stderr, "%ld. [0x%016lx] %.*s%s%.*s %.*s\n", i+1, (unsigned long)ips[i], (int)module.size, module.str, (!no_func || !no_file) ? ", " : "", (int)func.size, func.str, (int)file.size, file.str); + } + pclose(f); + } + else + { + fprintf(stderr, "%ld. [0x%016lx] %s\n", i+1, (unsigned long)ips[i], info.dli_fname); + } + } + fprintf(stderr, "\nVersion: %s%s\n\n", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); + + _exit(0); +} + int main(int argc, char **argv) { + // install signal handler for the crash call stacks + { + struct sigaction handler = { .sa_sigaction = lnx_signal_handler, .sa_flags = SA_SIGINFO, }; + sigfillset(&handler.sa_mask); + sigaction(SIGILL, &handler, NULL); + sigaction(SIGTRAP, &handler, NULL); + sigaction(SIGABRT, &handler, NULL); + sigaction(SIGFPE, &handler, NULL); + sigaction(SIGBUS, &handler, NULL); + sigaction(SIGSEGV, &handler, NULL); + sigaction(SIGQUIT, &handler, NULL); + } + //- rjf: set up OS layer { //- rjf: get statically-allocated system/process info diff --git a/src/os/core/linux/os_core_linux.h b/src/os/core/linux/os_core_linux.h index c3136d3b..2a351674 100644 --- a/src/os/core/linux/os_core_linux.h +++ b/src/os/core/linux/os_core_linux.h @@ -7,7 +7,6 @@ //////////////////////////////// //~ rjf: Includes -#define _GNU_SOURCE #include #include #include @@ -17,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -27,7 +27,8 @@ #include #include #include -#include +#include +#include pid_t gettid(void); int pthread_setname_np(pthread_t thread, const char *name); From 920a3ab3b7ff0baecc9dcce662b9b45aa9c199c2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 7 Nov 2025 14:30:12 -0800 Subject: [PATCH 054/850] discard unknown FDEs --- src/ctrl/ctrl_core.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index ed111ad1..49aaf22a 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -2027,10 +2027,8 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A is_cfi_parsed = dw_parse_cfi(unwind_data, fde_addr, arch, &cie, &fde); } - if(is_cfi_parsed) + if(is_cfi_parsed && contains_1u64(fde.pc_range, ip)) { - Assert(contains_1u64(fde.pc_range, ip)); - // setup pointer decoder ops DW_DecodePtr *decode_ptr_func = 0; void *decode_ptr_ctx = 0; From af423b142e851e5a2c1af1986eb6148a1808e1bb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 14:47:14 -0800 Subject: [PATCH 055/850] gl shear --- src/render/opengl/generated/render_opengl.meta.h | 6 +++++- src/render/opengl/render_opengl.mdesk | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index dc8709d1..1ed1de8d 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -32,7 +32,7 @@ str8_lit_comp( "in vec4 c2v_colors_2;\n" "in vec4 c2v_colors_3;\n" "in vec4 c2v_corner_radii;\n" -"in vec4 c2v_style; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused\n" +"in vec4 c2v_style; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\n" "\n" "out vec2 v2p_sdf_sample_pos;\n" "out vec2 v2p_texcoord_pct;\n" @@ -51,10 +51,14 @@ str8_lit_comp( " // rjf: constants\n" " vec2 vertices[] = vec2[](vec2(-1, -1), vec2(-1, +1), vec2(+1, -1), vec2(+1, +1));\n" " \n" +" // rjf: unpack shears\n" +" float shears[] = float[](0, 0, c2v_style.w, c2v_style.w);\n" +" \n" " // rjf: find dst position\n" " vec2 dst_half_size = (c2v_dst_rect.zw - c2v_dst_rect.xy) / 2;\n" " vec2 dst_center = (c2v_dst_rect.zw + c2v_dst_rect.xy) / 2;\n" " vec2 dst_position = vertices[gl_VertexID] * dst_half_size + dst_center;\n" +" dst_position.y += shears[gl_VertexID];\n" " \n" " // rjf: find src position\n" " vec2 src_half_size = (c2v_src_rect.zw - c2v_src_rect.xy) / 2;\n" diff --git a/src/render/opengl/render_opengl.mdesk b/src/render/opengl/render_opengl.mdesk index 9bfd735c..909c7054 100644 --- a/src/render/opengl/render_opengl.mdesk +++ b/src/render/opengl/render_opengl.mdesk @@ -57,7 +57,7 @@ in vec4 c2v_colors_1; in vec4 c2v_colors_2; in vec4 c2v_colors_3; in vec4 c2v_corner_radii; -in vec4 c2v_style; // x: border_thickness_px, y: softness_px, z: omit_texture, w: unused +in vec4 c2v_style; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear out vec2 v2p_sdf_sample_pos; out vec2 v2p_texcoord_pct; @@ -76,10 +76,14 @@ void main(void) // rjf: constants vec2 vertices[] = vec2[](vec2(-1, -1), vec2(-1, +1), vec2(+1, -1), vec2(+1, +1)); + // rjf: unpack shears + float shears[] = float[](0, 0, c2v_style.w, c2v_style.w); + // rjf: find dst position vec2 dst_half_size = (c2v_dst_rect.zw - c2v_dst_rect.xy) / 2; vec2 dst_center = (c2v_dst_rect.zw + c2v_dst_rect.xy) / 2; vec2 dst_position = vertices[gl_VertexID] * dst_half_size + dst_center; + dst_position.y += shears[gl_VertexID]; // rjf: find src position vec2 src_half_size = (c2v_src_rect.zw - c2v_src_rect.xy) / 2; From 80ccfba3c6d9daef19f19a2ba92baa5e15806501 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 14:57:41 -0800 Subject: [PATCH 056/850] fix metagen build on linux --- project.4coder | 2 +- src/metagen/metagen_os/core/linux/metagen_os_core_linux.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/project.4coder b/project.4coder index 6abaea66..69b7529f 100644 --- a/project.4coder +++ b/project.4coder @@ -53,7 +53,7 @@ commands = // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [scratch] - .f2 = { .win = "build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f2 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [textperf] // .f1 = { .win = "raddbg_stable --ipc kill_all && build no_meta telemetry textperf && raddbg_stable --ipc bring_to_front && raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h index e7d2ba5a..c939f2bd 100644 --- a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h +++ b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h @@ -7,7 +7,6 @@ //////////////////////////////// //~ rjf: Includes -#define _GNU_SOURCE #include #include #include From ddc57a0ac494acb08568569b49e9b4d36cf92a96 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 7 Nov 2025 14:39:56 -0800 Subject: [PATCH 057/850] WIP changed backend to use ptrace seize and interrupt --- src/demon/linux/demon_core_linux.c | 639 ++++++++++++++++------------- 1 file changed, 354 insertions(+), 285 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 6dd8e298..4b455038 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -4,6 +4,16 @@ //////////////////////////////// //~ rjf: Helpers +internal DMN_LNX_EntityNode * +dmn_lnx_entity_list_push(Arena *arena, DMN_LNX_EntityList *list, DMN_LNX_Entity *v) +{ + DMN_LNX_EntityNode *n = push_array(arena, DMN_LNX_EntityNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; +} + //- rjf: file descriptor memory reading/writing helpers internal U64 @@ -293,39 +303,28 @@ dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) { Temp scratch = scratch_begin(&arena, 1); - //- rjf: get exe link path - String8 exe_link_path = str8f(scratch.arena, "/proc/%d/exe", pid); - - //- rjf: read the link - Temp restore_point = temp_begin(arena); - B32 good = 0; - U8 *buffer = 0; - int readlink_result = 0; - S64 cap = PATH_MAX; - for(S64 r = 0; r < 4; cap *= 2, r += 1) + String8 exe_link_path = str8f(scratch.arena, "/proc/%d/exe", pid); + String8List parts = {0}; + int readlink_result = 0; + for(S64 r = 0, cap = PATH_MAX; r < 4; cap *= 2, r += 1) { - temp_end(restore_point); - buffer = push_array_no_zero(arena, U8, cap); + U8 *buffer = push_array(arena, U8, cap); readlink_result = readlink((char *)exe_link_path.str, (char *)buffer, cap); + + if(readlink_result < 0) + { + break; + } + + str8_list_push(scratch.arena, &parts, str8(buffer, readlink_result)); + if(readlink_result < cap) { - good = 1; break; } } - //- rjf: package result - String8 result = {0}; - if(!good || readlink_result == -1) - { - temp_end(restore_point); - } - else - { - arena_pop(arena, (cap - readlink_result - 1)); - result = str8(buffer, readlink_result + 1); - } - + String8 result = str8_list_join(arena, &parts, 0); scratch_end(scratch); return result; } @@ -860,7 +859,7 @@ dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip) { REGS_RegBlockX64 *reg_block = thread->reg_block; regs_arch_block_write_rip(thread->arch, reg_block, ip); - is_ip_written = 1; + is_ip_written = dmn_lnx_thread_write_reg_block(thread, reg_block); } Assert(is_ip_written); return is_ip_written; @@ -874,7 +873,7 @@ dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp) { REGS_RegBlockX64 *reg_block = thread->reg_block; regs_arch_block_write_rsp(thread->arch, reg_block, sp); - is_sp_written = 1; + is_sp_written = dmn_lnx_thread_write_reg_block(thread, reg_block); } Assert(is_sp_written); return is_sp_written; @@ -1331,7 +1330,7 @@ dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on) { reg_block->rflags.u64 &= ~X64_RFlag_Trap; } - is_flag_set = 1; + is_flag_set = dmn_lnx_thread_write_reg_block(thread, thread->reg_block); }break; case Arch_x86: case Arch_arm32: @@ -1340,6 +1339,7 @@ dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on) NotImplemented; }break; } + Assert(is_flag_set); return is_flag_set; } @@ -1544,9 +1544,12 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) pid_t pid = 0; int ptrace_result = 0; int chdir_result = 0; - int setoptions_result = 0; B32 error__need_child_kill = 0; - + + // open temp pipes to communicate with child process + int pipe_fds[2] = {0}; + if (pipe(&pipe_fds[0]) < 0) { InvalidPath; } + //- rjf: fork pid = fork(); if(pid == -1) { goto error; } @@ -1554,9 +1557,9 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) //- rjf: child process -> execute actual target if(pid == 0) { - // turn the thread into a tracee - ptrace_result = ptrace(PTRACE_TRACEME, 0, 0, 0); - if(ptrace_result == -1) { goto error; } + // wait for parent seize + char b; + read(pipe_fds[0], &b, sizeof(b)); // set current working directory to tracee chdir_result = chdir(path); @@ -1572,34 +1575,61 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) //- rjf: parent process if(pid != 0) { - //- rjf: wait for child - int status = 0; - pid_t wait_id = waitpid(pid, &status, __WALL); - if(wait_id != pid) - { - // NOTE(rjf): we do not know what this means - needs study if this actually arises. - goto error; - } - - //- rjf: determine child launch status - typedef enum LaunchStatus + enum LaunchStatus { LaunchStatus_Null, LaunchStatus_FailBeforePtrace, LaunchStatus_FailAfterPtrace, LaunchStatus_Success, - } - LaunchStatus; - LaunchStatus launch_status = LaunchStatus_Null; + }; + enum LaunchStatus launch_status = LaunchStatus_FailBeforePtrace; { - B32 wifstopped = WIFSTOPPED(status); - int wstopsig = WSTOPSIG(status); - if(0){} - else if(wifstopped && wstopsig == SIGTRAP) { launch_status = LaunchStatus_Success; } - else if(wifstopped && wstopsig != SIGTRAP) { launch_status = LaunchStatus_FailAfterPtrace; } - else { launch_status = LaunchStatus_FailBeforePtrace; } - } + int s = 0; + // seize process + if (ptrace(PTRACE_SEIZE, pid, 0, 0) < 0) { Assert(0 && "seize failed"); goto launch_error; } + + // interrupt process + launch_status = LaunchStatus_FailAfterPtrace; + if (ptrace(PTRACE_INTERRUPT, pid, 0, 0) < 0) { Assert(0 && "interrupt failed"); goto launch_error; } + if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "interrupt wait failed"); goto launch_error; } + + // entry read + if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } + + // resume child + char b = 1; + if (write(pipe_fds[1], &b, sizeof(b)) < 0) { Assert(0 && "resume child failed"); goto launch_error; } + + // exit read + if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } + if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } + + // entry chdir + if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } + if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } + + // exit chdir + if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } + if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } + + // entry execv + if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } + if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } + + // exit execve + if (waitpid(pid, &s, __WALL | __WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } + if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } + if (waitpid(pid, &s, __WALL | __WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } + + uintptr_t trace_options = PTRACE_O_TRACEEXIT | PTRACE_O_EXITKILL | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEVFORKDONE; + int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(trace_options)); + if (setoptions_result == -1) { Assert(0 && "failed to set options"); error__need_child_kill = 1; goto launch_error; } + + launch_status = LaunchStatus_Success; + launch_error:; + } + //- rjf: respond to launch status appropriately switch(launch_status) { @@ -1636,10 +1666,6 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) //- rjf: successful launch case LaunchStatus_Success: { - uintptr_t trace_options = PTRACE_O_TRACEEXIT|PTRACE_O_EXITKILL|PTRACE_O_TRACEFORK|PTRACE_O_TRACEVFORK|PTRACE_O_TRACECLONE; - setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(trace_options)); - if(setoptions_result == -1) { error__need_child_kill = 1; goto error; } - ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); @@ -1890,6 +1916,10 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) //- rjf: success success:; + + // clean up pipes + close(pipe_fds[0]); + close(pipe_fds[1]); } scratch_end(scratch); @@ -1928,211 +1958,14 @@ dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) return result; } -internal DMN_EventList -dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) +internal void +dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_for_group_stop, DMN_ActiveTrap *active_traps) { - Temp scratch = scratch_begin(&arena, 1); - DMN_EventList evts = {0}; - - //////////////////////////// - //- rjf: push any deferred events - // - { - for EachNode(n, DMN_EventNode, dmn_lnx_state->deferred_events.first) - { - DMN_Event *e_src = &n->v; - DMN_Event *e_dst = dmn_event_list_push(arena, &evts); - MemoryCopyStruct(e_dst, e_src); - e_dst->string = str8_copy(arena, e_dst->string); - } - MemoryZeroStruct(&dmn_lnx_state->deferred_events); - arena_clear(dmn_lnx_state->deferred_events_arena); - } - - //////////////////////////// - //- rjf: no processes, no output events -> not attached - // - if(evts.count == 0 && dmn_lnx_state->entities_base->first == &dmn_lnx_nil_entity) - { - DMN_Event *e = dmn_event_list_push(arena, &evts); - e->kind = DMN_EventKind_Error; - e->error_kind = DMN_ErrorKind_NotAttached; - } - - //////////////////////////// - //- rjf: determine if we need to wait for new events - // - B32 need_wait_on_events = (evts.count == 0); - - //////////////////////////// - //- rjf: write all traps into memory - // - DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; - { - ProfScope("write all traps into memory") - { - HashTable *ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); - for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) - { - for EachIndex(n_idx, n->count) - { - DMN_Trap *trap = n->v+n_idx; - - if(trap->flags == 0) - { - DMN_ActiveTrap *is_set = hash_table_search_u64_raw(ht, trap->vaddr); - if(is_set) {continue;} - - U8 swap_byte = 0; - if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &swap_byte) > 0) - { - U8 int3 = 0xCC; - if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3)) - { - DMN_ActiveTrap *active_trap = push_array(scratch.arena, DMN_ActiveTrap, 1); - active_trap->trap = trap; - active_trap->swap_byte = swap_byte; - SLLQueuePush(active_trap_first, active_trap_last, active_trap); - - hash_table_push_u64_raw(scratch.arena, ht, trap->vaddr, active_trap); - } else { Assert(0 && "failed to write trap"); } - } else { Assert(0 && "failed to read original byte"); } - } - } - } - } - } - - //////////////////////////// - //- rjf: gather all threads which we should run - // - DMN_LNX_EntityNode *first_run_thread = 0, *last_run_thread = 0; - if(need_wait_on_events) ProfScope("gather all threads which we should run") - { - //- rjf: scan all processes - for(DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; - process != &dmn_lnx_nil_entity; - process = process->next) - { - if(process->kind != DMN_LNX_EntityKind_Process) {continue;} - - //- rjf: determine if this process is frozen - B32 process_is_frozen = 0; - if(ctrls->run_entities_are_processes) - { - for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(process))) - { - process_is_frozen = 1; - break; - } - } - } - - //- rjf: scan all threads in this process - for(DMN_LNX_Entity *thread = process->first; - thread != &dmn_lnx_nil_entity; - thread = thread->next) - { - if(thread->kind != DMN_LNX_EntityKind_Thread) {continue;} - - //- rjf: determine if this thread is frozen - B32 is_frozen = 0; - { - // rjf: single-step? freeze if not the single-step thread. - if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) - { - is_frozen = !dmn_handle_match(dmn_lnx_handle_from_entity(thread), ctrls->single_step_thread); - } - - // rjf: not single-stepping? determine based on run controls freezing info - else - { - if(ctrls->run_entities_are_processes) - { - is_frozen = process_is_frozen; - } - else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(thread))) - { - is_frozen = 1; - break; - } - } - if(ctrls->run_entities_are_unfrozen) - { - is_frozen ^= 1; - } - } - } - - //- rjf: disregard all other rules if this is the halter thread - // TODO(rjf): halting - here is what we do on windows... -#if 0 - if(dmn_w32_shared->halter_tid == thread->id) - { - is_frozen = 0; - } -#endif - - //- rjf: add to list - if(!is_frozen) - { - DMN_LNX_EntityNode *n = push_array(scratch.arena, DMN_LNX_EntityNode, 1); - n->v = thread; - SLLQueuePush(first_run_thread, last_run_thread, n); - } - } - } - } - - // enable single stepping - DMN_LNX_Entity *single_step_thread = dmn_lnx_entity_from_handle(ctrls->single_step_thread); - if(single_step_thread != &dmn_lnx_nil_entity) - { - dmn_lnx_set_single_step_flag(single_step_thread, 1); - } - - // update registers - for EachNode(n, DMN_LNX_EntityNode, first_run_thread) - { - DMN_LNX_Entity *thread = n->v; - if(thread->reg_block) - { - if (!dmn_lnx_thread_write_reg_block(thread, thread->reg_block)) { Assert(0 && "failed to write thread's registers"); } - } - } - - //////////////////////////// - //- rjf: resume all threads we need to run - // - DMN_LNX_EntityNode *first_ran_thread = 0, *last_ran_thread = 0; - for EachNode(n, DMN_LNX_EntityNode, first_run_thread) - { - DMN_LNX_Entity *thread = n->v; - - void *sig_code = 0; - if(dmn_lnx_state->last_event_kind == DMN_EventKind_Exception && dmn_lnx_state->last_stop_pid == thread->id) - { - sig_code = (void *)(uintptr_t)dmn_lnx_state->last_sig_code; - } - if (ptrace(PTRACE_CONT, (pid_t)thread->id, 0, (void *)sig_code) < 0) { Assert(0 && "failed to resume a thread"); } - - DMN_LNX_EntityNode *n2 = push_array_no_zero(scratch.arena, DMN_LNX_EntityNode, 1); - SLLQueuePush(first_ran_thread, last_ran_thread, n2); - n2->v = thread; - } - - //////////////////////////// - //- rjf: loop: wait for next stop, produce debug events - // - for(B32 done = !need_wait_on_events; !done;) + for(B32 done = 0; !done;) { //- rjf: wait for next event int status = 0; - pid_t wait_id = waitpid(-1, &status, __WALL|__WNOTHREAD); + pid_t wait_id = waitpid(tid, &status, __WALL|__WNOTHREAD); if(status == -1 && errno == EINTR) {continue;} // wait interrupted, try again if(status == -1) {InvalidPath;} // TODO: graceful exit @@ -2144,7 +1977,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) int ptrace_event_code = (status>>16); DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); DMN_LNX_Entity *process = thread->parent; - B32 thread_is_process_root = (thread->id == process->id); + + //printf("waitpid - pid %d wifexited %d, wifsignaled %d, wifstopped %d, wstopsig %d\n", wait_id, wifexited, wifsignaled, wifstopped, wstopsig); // update thread registers if(thread != &dmn_lnx_nil_entity) @@ -2156,6 +1990,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) U64 exit_code = max_U64; U64 address = 0; DMN_Trap *hit_user_trap = 0; + pid_t new_pid = 0; + B32 is_group_stop = 0; //- rjf: WIFEXITED(status) -> thread exit if(wifexited) @@ -2169,7 +2005,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) e_kind = DMN_EventKind_ExitThread; exit_code = WTERMSIG(status); } - + //- rjf: SIGTRAP:PTRACE_EVENT_EXIT else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_EXIT) { @@ -2178,9 +2014,13 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } //- rjf: SIGTRAP:PTRACE_EVENT_CLONE - else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_CLONE) + else if(wifstopped && (status >> 8) == (SIGTRAP | PTRACE_EVENT_CLONE << 8)) { - // TODO(rjf) + if(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid) >= 0) + { + e_kind = DMN_EventKind_CreateThread; + } + else { Assert(0 && "failed to get new tid"); } } //- rjf: SIGTRAP:PTRACE_EVENT_FORK, or SIGTRAP:PTRACE_EVENT_VFORK @@ -2189,6 +2029,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) ptrace_event_code == PTRACE_EVENT_VFORK)) { } + + // group stop + else if(wifstopped && wstopsig == SIGTRAP && status >> 16 == PTRACE_EVENT_STOP) + { + is_group_stop = 1; + } //- rjf: SIGTRAP else if(wifstopped && wstopsig == SIGTRAP) @@ -2196,6 +2042,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // translate signal code to DEMON event kind siginfo_t siginfo = {0}; if(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo) < 0) { Assert(0 && "failed to get signal info"); } + switch(siginfo.si_code) { case DMN_LNX_SigTrapCode_Brkpt: @@ -2292,12 +2139,23 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) dmn_lnx_state->last_event_kind = e_kind; dmn_lnx_state->last_stop_pid = wait_id; dmn_lnx_state->last_sig_code = wstopsig; - done = 1; + + if(wait_for_group_stop) + { + if(is_group_stop) + { + done = 1; + } + } + else + { + done = 1; + } if(e_kind == DMN_EventKind_Breakpoint) { U64 ip = dmn_lnx_thread_read_ip(thread); - for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) + for EachNode(active_trap, DMN_ActiveTrap, active_traps) { if(active_trap->trap->vaddr == ip-1) { @@ -2335,7 +2193,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { if(rdebug.r_version == 1) { - dmn_lnx_process_loaded_modules(arena, &evts, process, name_space_id, rdebug.r_map); + dmn_lnx_process_loaded_modules(arena, evts, process, name_space_id, rdebug.r_map); } else { Assert(0 && "unexpected version number"); } } @@ -2353,7 +2211,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { if(stap_read_arg_u(probe->args.v[2], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) { - dmn_lnx_process_loaded_modules(arena, &evts, process, name_space_id, new_link_map_addr); + dmn_lnx_process_loaded_modules(arena, evts, process, name_space_id, new_link_map_addr); } else { Assert(0 && "failed to parse third argument"); } } @@ -2368,7 +2226,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { if(stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { - dmn_lnx_process_unloaded_modules(arena, &evts, process, name_space_id, rdebug_vaddr); + dmn_lnx_process_unloaded_modules(arena, evts, process, name_space_id, rdebug_vaddr); } else { Assert(0 && "failed to read second argument"); } } @@ -2410,7 +2268,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // clear single step flag dmn_lnx_set_single_step_flag(thread, 0); - DMN_Event *e = dmn_event_list_push(arena, &evts); + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = e_kind; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(thread); @@ -2418,7 +2276,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case DMN_EventKind_Breakpoint: { - DMN_Event *e = dmn_event_list_push(arena, &evts); + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = e_kind; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(thread); @@ -2426,7 +2284,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case DMN_EventKind_Halt: { - DMN_Event *e = dmn_event_list_push(arena, &evts); + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = DMN_EventKind_Halt; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(thread); @@ -2438,7 +2296,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // SIGFPE // SIGSEGV // SIGILL - DMN_Event *e = dmn_event_list_push(arena, &evts); + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = DMN_EventKind_Exception; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(thread); @@ -2459,14 +2317,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) default:{}break; case DMN_LNX_EntityKind_Thread: { - DMN_Event *e = dmn_event_list_push(arena, &evts); + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = DMN_EventKind_ExitThread; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(child); }break; case DMN_LNX_EntityKind_Module: { - DMN_Event *e = dmn_event_list_push(arena, &evts); + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = DMN_EventKind_UnloadModule; e->process = dmn_lnx_handle_from_entity(process); e->module = dmn_lnx_handle_from_entity(child); @@ -2477,7 +2335,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: generate exit process event { - DMN_Event *e = dmn_event_list_push(arena, &evts); + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = DMN_EventKind_ExitProcess; e->process = dmn_lnx_handle_from_entity(process); e->code = exit_code; @@ -2488,11 +2346,22 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case DMN_EventKind_CreateThread: { - NotImplemented; + DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); + thread->id = new_pid; + thread->arch = process->arch; + thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); + dmn_lnx_thread_read_reg_block(thread, thread->reg_block); + + DMN_Event *e = dmn_event_list_push(arena, evts); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->arch = thread->arch; + e->code = thread->id; }break; case DMN_EventKind_ExitThread: { - DMN_Event *e = dmn_event_list_push(arena, &evts); + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = DMN_EventKind_ExitThread; e->process = dmn_lnx_handle_from_entity(process); e->thread = dmn_lnx_handle_from_entity(thread); @@ -2500,20 +2369,220 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; } } +} + +internal DMN_EventList +dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) +{ + Temp scratch = scratch_begin(&arena, 1); + DMN_EventList evts = {0}; + //////////////////////////// + //- rjf: push any deferred events + // + { + for EachNode(n, DMN_EventNode, dmn_lnx_state->deferred_events.first) + { + DMN_Event *e_src = &n->v; + DMN_Event *e_dst = dmn_event_list_push(arena, &evts); + MemoryCopyStruct(e_dst, e_src); + e_dst->string = str8_copy(arena, e_dst->string); + } + MemoryZeroStruct(&dmn_lnx_state->deferred_events); + arena_clear(dmn_lnx_state->deferred_events_arena); + } + + //////////////////////////// + //- rjf: no processes, no output events -> not attached + // + if(evts.count == 0 && dmn_lnx_state->entities_base->first == &dmn_lnx_nil_entity) + { + DMN_Event *e = dmn_event_list_push(arena, &evts); + e->kind = DMN_EventKind_Error; + e->error_kind = DMN_ErrorKind_NotAttached; + } + + //////////////////////////// + //- rjf: determine if we need to wait for new events + // + B32 need_wait_on_events = (evts.count == 0); + + //////////////////////////// + //- rjf: write all traps into memory + // + DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; + ProfScope("write all traps into memory") + { + HashTable *ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); + for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) + { + for EachIndex(n_idx, n->count) + { + DMN_Trap *trap = n->v+n_idx; + + if(trap->flags == 0) + { + DMN_ActiveTrap *is_set = hash_table_search_u64_raw(ht, trap->vaddr); + if(is_set) { continue; } + + U8 swap_byte = 0; + if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &swap_byte) > 0) + { + U8 int3 = 0xCC; + if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3)) + { + DMN_ActiveTrap *active_trap = push_array(scratch.arena, DMN_ActiveTrap, 1); + active_trap->trap = trap; + active_trap->swap_byte = swap_byte; + SLLQueuePush(active_trap_first, active_trap_last, active_trap); + + hash_table_push_u64_raw(scratch.arena, ht, trap->vaddr, active_trap); + } else { Assert(0 && "failed to write trap"); } + } else { Assert(0 && "failed to read original byte"); } + } + } + } + } + + //////////////////////////// + //- enable single stepping + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) + { + DMN_LNX_Entity *single_step_thread = dmn_lnx_entity_from_handle(ctrls->single_step_thread); + dmn_lnx_set_single_step_flag(single_step_thread, 1); + } + + //////////////////////////// + //- rjf: gather all threads which we should run + // + DMN_LNX_EntityList run_threads = {0}; + if(need_wait_on_events) ProfScope("gather all threads which we should run") + { + //- rjf: scan all processes + for(DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; process != &dmn_lnx_nil_entity; process = process->next) + { + if(process->kind != DMN_LNX_EntityKind_Process) { continue; } + + //- rjf: determine if this process is frozen + B32 process_is_frozen = 0; + if(ctrls->run_entities_are_processes) + { + for EachIndex(idx, ctrls->run_entity_count) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(process))) + { + process_is_frozen = 1; + break; + } + } + } + + //- rjf: scan all threads in this process + for(DMN_LNX_Entity *thread = process->first; thread != &dmn_lnx_nil_entity; thread = thread->next) + { + if(thread->kind != DMN_LNX_EntityKind_Thread) { continue; } + + //- rjf: determine if this thread is frozen + B32 is_frozen = 0; + { + // rjf: single-step? freeze if not the single-step thread. + if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) + { + is_frozen = !dmn_handle_match(dmn_lnx_handle_from_entity(thread), ctrls->single_step_thread); + } + + // rjf: not single-stepping? determine based on run controls freezing info + else + { + if(ctrls->run_entities_are_processes) + { + is_frozen = process_is_frozen; + } + else + { + for EachIndex(idx, ctrls->run_entity_count) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(thread))) + { + is_frozen = 1; + break; + } + } + } + if(ctrls->run_entities_are_unfrozen) + { + is_frozen ^= 1; + } + } + } + + //- rjf: add to list + if(!is_frozen) + { + dmn_lnx_entity_list_push(scratch.arena, &run_threads, thread); + } + } + } + } + + //////////////////////////// + //- rjf: resume all threads we need to run + // + DMN_LNX_EntityList ran_threads = {0}; + for EachNode(n, DMN_LNX_EntityNode, run_threads.first) + { + DMN_LNX_Entity *thread = n->v; + + // update registers + if(!dmn_lnx_thread_write_reg_block(thread, thread->reg_block)) { Assert(0 && "failed to write thread's registers"); } + + // pass signal to the child process + void *sig_code = 0; + if(dmn_lnx_state->last_event_kind == DMN_EventKind_Exception && dmn_lnx_state->last_stop_pid == thread->id) + { + sig_code = (void *)(uintptr_t)dmn_lnx_state->last_sig_code; + } + + // resume thread + if (ptrace(PTRACE_CONT, (pid_t)thread->id, 0, (void *)sig_code) < 0) { Assert(0 && "failed to resume a thread"); } + + dmn_lnx_entity_list_push(scratch.arena, &ran_threads, thread); + } + + //////////////////////////// + //- rjf: loop: wait for next stop, produce debug events + // + if(need_wait_on_events) + { + dmn_lnx_wait_for_events(arena, &evts, -1, 0, active_trap_first); + } + //////////////////////////// //- rjf: stop all threads // - for EachNode(n, DMN_LNX_EntityNode, first_ran_thread) { - DMN_LNX_Entity *thread = n->v; - pid_t thread_id = (pid_t)thread->id; - if(thread_id != dmn_lnx_state->last_stop_pid) + B32 was_interrupt_issued = 0; + for EachNode(n, DMN_LNX_EntityNode, ran_threads.first) { - union sigval sv = {0}; - sigqueue(thread_id, SIGSTOP, sv); - thread->expecting_dummy_sigstop = 1; + if(n->v->id != dmn_lnx_state->last_stop_pid) + { + if(ptrace(PTRACE_INTERRUPT, n->v->id, 0, 0) >= 0) + { + was_interrupt_issued = 1; + } + else { Assert(0 && "failed to interrupt thread"); } + } } + if(was_interrupt_issued) + { + dmn_lnx_wait_for_events(arena, &evts, -1, 1, active_trap_first); + } + } + + // update registers + for EachNode(n, DMN_LNX_EntityNode, ran_threads.first) + { + dmn_lnx_thread_read_reg_block(n->v, n->v->reg_block); } ////////////////////////// @@ -2525,7 +2594,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { if(!dmn_process_write_struct(active_trap->trap->process, active_trap->trap->vaddr, &active_trap->swap_byte)) { - Assert(0 && "failed to swap back original byte"); + Assert(0 && "failed to restore original memory"); } } } From 32bdd14d8ee5e1db1dc2f838d1a39369500a5bba Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 7 Nov 2025 14:40:18 -0800 Subject: [PATCH 058/850] image base for a dynamic ELF is always zero --- src/rdi_from_dwarf/rdi_from_dwarf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 45f13d62..d5bdac94 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2604,7 +2604,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) case ExecutableImageKind_Elf64: { ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data); arch = arch_from_elf_machine(bin.hdr.e_machine); - image_base = elf_base_addr_from_bin(&bin); + image_base = bin.hdr.e_type == ELF_Type_Dyn ? 0 : elf_base_addr_from_bin(&bin); binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); path_style = PathStyle_UnixAbsolute; From 85778910c6453224fbe2db545916768654bfa863 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 15:13:08 -0800 Subject: [PATCH 059/850] radbin build.sh --- build.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/build.sh b/build.sh index ecd0ce6e..f4b94e07 100644 --- a/build.sh +++ b/build.sh @@ -65,12 +65,8 @@ fi # --- Build Everything (@build_targets) --------------------------------------- cd build if [ -v raddbg ]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c $compile_link $link_os_gfx $link_render $link_font_provider $out raddbg; fi +if [ -v radbin ]; then didbuild=1 && $compile ../src/radbin/radbin_main.c $compile_link $out radbin; fi if [ -v radlink ]; then didbuild=1 && $compile ../src/linker/lnk.c $compile_link $out radlink; fi -if [ -v rdi_from_pdb ]; then didbuild=1 && $compile ../src/rdi_from_pdb/rdi_from_pdb_main.c $compile_link $out rdi_from_pdb; fi -if [ -v rdi_from_dwarf ]; then didbuild=1 && $compile ../src/rdi_from_dwarf/rdi_from_dwarf.c $compile_link $out rdi_from_dwarf; fi -if [ -v rdi_dump ]; then didbuild=1 && $compile ../src/rdi_dump/rdi_dump_main.c $compile_link $out rdi_dump; fi -if [ -v rdi_breakpad_from_pdb ]; then didbuild=1 && $compile ../src/rdi_breakpad_from_pdb/rdi_breakpad_from_pdb_main.c $compile_link $out rdi_breakpad_from_pdb; fi -if [ -v ryan_scratch ]; then didbuild=1 && $compile ../src/scratch/ryan_scratch.c $compile_link $link_os_gfx $link_render $link_font_provider $out ryan_scratch; fi cd .. # --- Warn On No Builds ------------------------------------------------------- From 4ea3c5a0e423339f9ef9f4dad59438ef1d7cdae3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 15:47:08 -0800 Subject: [PATCH 060/850] artifact cache cancellation mutex -> semaphore (fixes cancellation thread on linux - we cannot take/drop across threads with mutexes); flip no_meta -> meta --- build.sh | 4 +-- src/artifact_cache/artifact_cache.c | 10 +++--- src/artifact_cache/artifact_cache.h | 2 +- src/base/base_entry_point.c | 3 -- src/os/core/linux/os_core_linux.c | 52 +++++++++++++---------------- 5 files changed, 32 insertions(+), 39 deletions(-) diff --git a/build.sh b/build.sh index f4b94e07..a69c0dd4 100644 --- a/build.sh +++ b/build.sh @@ -53,9 +53,9 @@ mkdir -p build mkdir -p local # --- Build & Run Metaprogram ------------------------------------------------- -if [ -v no_meta ]; then echo "[skipping metagen]"; fi -if [ ! -v no_meta ] +if [ ! -v meta ] then + echo "[doing metagen]" cd build $compile_debug ../src/metagen/metagen_main.c $compile_link $out metagen ./metagen diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 6e2d138d..199baa07 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -19,8 +19,7 @@ ac_init(void) ac_shared->req_batches[idx].arena = arena_alloc(); } ac_shared->cancel_thread = thread_launch(ac_cancel_thread_entry_point, 0); - ac_shared->cancel_thread_mutex = mutex_alloc(); - mutex_take(ac_shared->cancel_thread_mutex); + ac_shared->cancel_thread_semaphore = semaphore_alloc(0, 1, str8_zero()); } //////////////////////////////// @@ -218,7 +217,7 @@ ac_async_tick(void) // if(lane_idx() == 0) { - mutex_drop(ac_shared->cancel_thread_mutex); + semaphore_drop(ac_shared->cancel_thread_semaphore); } ////////////////////////////// @@ -590,7 +589,7 @@ ac_async_tick(void) // if(lane_idx() == 0) { - mutex_take(ac_shared->cancel_thread_mutex); + semaphore_take(ac_shared->cancel_thread_semaphore, max_U64); } scratch_end(scratch); } @@ -604,7 +603,7 @@ ac_cancel_thread_entry_point(void *p) for(;;) { os_sleep_milliseconds(50); - MutexScope(ac_shared->cancel_thread_mutex) + semaphore_take(ac_shared->cancel_thread_semaphore, max_U64); { for EachIndex(cache_slot_idx, ac_shared->cache_slots_count) { @@ -650,5 +649,6 @@ ac_cancel_thread_entry_point(void *p) } } } + semaphore_drop(ac_shared->cancel_thread_semaphore); } } diff --git a/src/artifact_cache/artifact_cache.h b/src/artifact_cache/artifact_cache.h index 3e433e5f..04953201 100644 --- a/src/artifact_cache/artifact_cache.h +++ b/src/artifact_cache/artifact_cache.h @@ -129,7 +129,7 @@ struct AC_Shared // rjf: cancel thread Thread cancel_thread; - Mutex cancel_thread_mutex; + Semaphore cancel_thread_semaphore; }; //////////////////////////////// diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index 451669bc..a79ced53 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -57,9 +57,6 @@ main_thread_base_entry_point(int arguments_count, char **arguments) #if defined(ARTIFACT_CACHE_H) && !defined(AC_INIT_MANUAL) ac_init(); #endif -#if defined(ASYNC_H) && !defined(ASYNC_INIT_MANUAL) - async_init(&cmdline); -#endif #if defined(CONTENT_H) && !defined(C_INIT_MANUAL) c_init(); #endif diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 1e6b71e5..cb11d8bd 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -771,7 +771,7 @@ internal OS_Handle os_process_launch(OS_ProcessLaunchParams *params) { OS_Handle handle = {0}; - + posix_spawn_file_actions_t file_actions = {0}; int file_actions_init_code = posix_spawn_file_actions_init(&file_actions); if(file_actions_init_code == 0) @@ -779,33 +779,33 @@ os_process_launch(OS_ProcessLaunchParams *params) // redirect STDOUT int stdout_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdout_file.u64[0], STDOUT_FILENO); Assert(stdout_code == 0); - + // redirect STDERR int stderr_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stderr_file.u64[0], STDERR_FILENO); Assert(stderr_code == 0); - + // redirect STDIN int stdin_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdin_file.u64[0], STDIN_FILENO); Assert(stdin_code == 0); - + posix_spawnattr_t attr = {0}; int attr_init_code = posix_spawnattr_init(&attr); if(attr_init_code == 0) { Temp scratch = scratch_begin(0, 0); - + // package argv char **argv = push_array(scratch.arena, char *, params->cmd_line.node_count + 1); { String8List l = str8_split_path(scratch.arena, params->path); str8_list_push(scratch.arena, &l, params->cmd_line.first->string); String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); - + argv[0] = (char *)path_to_exe.str; U64 arg_idx = 1; for EachNode(n, String8Node, params->cmd_line.first->next) { argv[arg_idx++] = (char *)n->string.str; } } - + // package envp char **envp = 0; if(params->inherit_env) @@ -821,39 +821,39 @@ os_process_launch(OS_ProcessLaunchParams *params) envp[env_idx] = (char *)n->string.str; } } - + if(params->debug_subprocesses) { // not suported InvalidPath; } - + if(!params->consoleless) { NotImplemented; } - + // spawn process pid_t pid = 0; int spawn_code = posix_spawn(&pid, argv[0], &file_actions, &attr, argv, envp); - + if(spawn_code == 0) { handle.u64[0] = (U64)pid; } - + // clean up attributes int attr_destroy_code = posix_spawnattr_destroy(&attr); Assert(attr_destroy_code == 0); - + scratch_end(scratch); } - + // clean up file actions int file_actions_destroy_code = posix_spawn_file_actions_destroy(&file_actions); Assert(file_actions_destroy_code == 0); } - + return handle; } @@ -867,7 +867,7 @@ os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) if(kill(pid, 0) >= 0) { result = (errno == ENOENT); - + if(result) { int status; @@ -969,11 +969,7 @@ internal Mutex os_mutex_alloc(void) { OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex); - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int init_result = pthread_mutex_init(&entity->mutex_handle, &attr); - pthread_mutexattr_destroy(&attr); + int init_result = pthread_mutex_init(&entity->mutex_handle, 0); if(init_result == -1) { os_lnx_entity_release(entity); @@ -1410,10 +1406,10 @@ lnx_signal_handler(int sig, siginfo_t *info, void *arg) sleep(UINT32_MAX); } } - + local_persist void *ips[4096]; int ips_count = backtrace(ips, ArrayCount(ips)); - + fprintf(stderr, "A fatal signal was received: %s (%d). The process is terminating.\n", strsignal(sig), sig); fprintf(stderr, "Create a new issue with this report at %s.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); fprintf(stderr, "Callstack:\n"); @@ -1421,7 +1417,7 @@ lnx_signal_handler(int sig, siginfo_t *info, void *arg) { Dl_info info = {0}; dladdr(ips[i], &info); - + char cmd[2048]; snprintf(cmd, sizeof(cmd), "llvm-symbolizer --relative-address -f -e %s %lu", info.dli_fname, (unsigned long)ips[i] - (unsigned long)info.dli_fbase); FILE *f = popen(cmd, "r"); @@ -1435,12 +1431,12 @@ lnx_signal_handler(int sig, siginfo_t *info, void *arg) String8 module = str8_skip_last_slash(str8_cstring(info.dli_fname)); String8 file = str8_skip_last_slash(str8_cstring_capped(file_name, file_name + sizeof(file_name))); if(file.size > 0) file.size -= 1; - + B32 no_func = str8_match(func, str8_lit("??"), StringMatchFlag_RightSideSloppy); B32 no_file = str8_match(file, str8_lit("??"), StringMatchFlag_RightSideSloppy); if(no_func) { func = str8_zero(); } if(no_file) { file = str8_zero(); } - + fprintf(stderr, "%ld. [0x%016lx] %.*s%s%.*s %.*s\n", i+1, (unsigned long)ips[i], (int)module.size, module.str, (!no_func || !no_file) ? ", " : "", (int)func.size, func.str, (int)file.size, file.str); } pclose(f); @@ -1451,7 +1447,7 @@ lnx_signal_handler(int sig, siginfo_t *info, void *arg) } } fprintf(stderr, "\nVersion: %s%s\n\n", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); - + _exit(0); } @@ -1470,7 +1466,7 @@ main(int argc, char **argv) sigaction(SIGSEGV, &handler, NULL); sigaction(SIGQUIT, &handler, NULL); } - + //- rjf: set up OS layer { //- rjf: get statically-allocated system/process info From d4d21593892322338f5129785e8dd604c3a808c7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 15:54:41 -0800 Subject: [PATCH 061/850] eliminate process array join api, no longer needed --- src/os/core/linux/os_core_linux.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index cb11d8bd..026005c2 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -900,12 +900,6 @@ os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) return result; } -internal U64 -os_process_array_join(OS_HandleArray processes, U64 endt_us, U64 *exit_code_out) -{ - NotImplemented; -} - internal void os_process_detach(OS_Handle handle) { From 035e72306d5976d5ce795d367ec9d16a9cff0ab5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 16:37:30 -0800 Subject: [PATCH 062/850] o_cloexec; preserve leading slashes in root-level paths --- src/demon/linux/demon_core_linux.c | 608 ++++++++++++++--------------- src/demon/linux/demon_os_linux.c | 8 +- src/lib_rdi_make/rdi_make.c | 20 +- src/os/core/linux/os_core_linux.c | 3 +- 4 files changed, 327 insertions(+), 312 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 4b455038..3d1631a0 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -124,21 +124,21 @@ dmn_lnx_read_ehdr(int memory_fd, U64 addr, ELF_Hdr64 *ehdr_out) { switch(e_ident[ELF_Identifier_Class]) { - default:{InvalidPath;}break; - case ELF_Class_None: {}break; - case ELF_Class_32: - { - ELF_Hdr32 ehdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &ehdr32)) + default:{InvalidPath;}break; + case ELF_Class_None: {}break; + case ELF_Class_32: { - *ehdr_out = elf_hdr64_from_hdr32(ehdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, ehdr_out); - }break; + ELF_Hdr32 ehdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &ehdr32)) + { + *ehdr_out = elf_hdr64_from_hdr32(ehdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, ehdr_out); + }break; } } } @@ -151,21 +151,21 @@ dmn_lnx_read_phdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr B32 is_read = 0; switch (elf_class) { - case ELF_Class_None: break; - case ELF_Class_32: - { - ELF_Phdr32 phdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &phdr32)) + case ELF_Class_None: break; + case ELF_Class_32: { - *phdr_out = elf_phdr64_from_phdr32(phdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, phdr_out); - }break; - default:{NotImplemented;}break; + ELF_Phdr32 phdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &phdr32)) + { + *phdr_out = elf_phdr64_from_phdr32(phdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, phdr_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -176,21 +176,21 @@ dmn_lnx_read_shdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr B32 is_read = 0; switch (elf_class) { - case ELF_Class_None: break; - case ELF_Class_32: - { - ELF_Shdr32 shdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &shdr32)) + case ELF_Class_None: break; + case ELF_Class_32: { - *shdr_out = elf_shdr64_from_shdr32(shdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, shdr_out); - }break; - default:{NotImplemented;}break; + ELF_Shdr32 shdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &shdr32)) + { + *shdr_out = elf_shdr64_from_shdr32(shdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, shdr_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -201,22 +201,22 @@ dmn_lnx_read_linkmap(int memory_fd, U64 addr, ELF_Class elf_class, GNU_LinkMap64 B32 is_read = 0; switch(elf_class) { - case ELF_Class_None: {}break; - case ELF_Class_32: - { - // TODO(rjf): endianness - GNU_LinkMap32 linkmap32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &linkmap32)) + case ELF_Class_None: {}break; + case ELF_Class_32: { - *linkmap_out = gnu_linkmap64_from_linkmap32(linkmap32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, linkmap_out); - }break; - default:{NotImplemented;}break; + // TODO(rjf): endianness + GNU_LinkMap32 linkmap32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &linkmap32)) + { + *linkmap_out = gnu_linkmap64_from_linkmap32(linkmap32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, linkmap_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -227,21 +227,21 @@ dmn_lnx_read_dynamic(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dy B32 is_read = 0; switch(elf_class) { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Dyn32 dyn32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &dyn32)) + case ELF_Class_None:{}break; + case ELF_Class_32: { - *dyn_out = elf_dyn64_from_dyn32(dyn32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, dyn_out); - }break; - default:{NotImplemented;}break; + ELF_Dyn32 dyn32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &dyn32)) + { + *dyn_out = elf_dyn64_from_dyn32(dyn32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, dyn_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -252,21 +252,21 @@ dmn_lnx_read_symbol(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Sym64 *sym B32 is_read = 0; switch(elf_class) { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Sym32 symbol32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &symbol32)) + case ELF_Class_None:{}break; + case ELF_Class_32: { - *symbol_out = elf_sym64_from_sym32(symbol32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, symbol_out); - }break; - default:{NotImplemented;}break; + ELF_Sym32 symbol32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &symbol32)) + { + *symbol_out = elf_sym64_from_sym32(symbol32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, symbol_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -277,20 +277,20 @@ dmn_lnx_read_r_debug(int memory_fd, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebu B32 is_read = 0; switch(gnu_rdebug_info_size_from_arch(arch)) { - case 0: {} break; - case sizeof(GNU_RDebugInfo32): { - GNU_RDebugInfo32 rdebug32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &rdebug32)) + case 0: {} break; + case sizeof(GNU_RDebugInfo32): { + GNU_RDebugInfo32 rdebug32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &rdebug32)) + { + *rdebug_out = gnu_rdebug_info64_from_rdebug_info32(rdebug32); + is_read = 1; + } + }break; + case sizeof(GNU_RDebugInfo64): { - *rdebug_out = gnu_rdebug_info64_from_rdebug_info32(rdebug32); - is_read = 1; - } - }break; - case sizeof(GNU_RDebugInfo64): - { - is_read = dmn_lnx_read_struct(memory_fd, addr, rdebug_out); - }break; - default:{InvalidPath;}break; + is_read = dmn_lnx_read_struct(memory_fd, addr, rdebug_out); + }break; + default:{InvalidPath;}break; } Assert(is_read); return is_read; @@ -310,14 +310,14 @@ dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) { U8 *buffer = push_array(arena, U8, cap); readlink_result = readlink((char *)exe_link_path.str, (char *)buffer, cap); - + if(readlink_result < 0) { break; } - + str8_list_push(scratch.arena, &parts, str8(buffer, readlink_result)); - + if(readlink_result < cap) { break; @@ -338,7 +338,7 @@ dmn_lnx_ehdr_from_pid(pid_t pid) String8 exe_path = dmn_lnx_exe_path_from_pid(scratch.arena, pid); if(exe_path.size != 0) { - int exe_fd = open((char *)exe_path.str, O_RDONLY); + int exe_fd = open((char *)exe_path.str, O_RDONLY|O_CLOEXEC); if(exe_fd != -1) { is_read = dmn_lnx_read_ehdr(exe_fd, 0, &exe); @@ -358,7 +358,7 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) // rjf: open aux data String8 auxv_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int auxv_fd = open((char*)auxv_path.str, O_RDONLY); + int auxv_fd = open((char*)auxv_path.str, O_RDONLY|O_CLOEXEC); // rjf: scan aux data if(auxv_fd >= 0) @@ -369,24 +369,24 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) ELF_Auxv64 auxv = {0}; switch(elf_class) { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Auxv32 auxv32 = {0}; - if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) + case ELF_Class_None:{}break; + case ELF_Class_32: { - goto brkloop; - } - auxv = elf_auxv64_from_auxv32(auxv32); - }break; - case ELF_Class_64: - { - if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) + ELF_Auxv32 auxv32 = {0}; + if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) + { + goto brkloop; + } + auxv = elf_auxv64_from_auxv32(auxv32); + }break; + case ELF_Class_64: { - goto brkloop; - } - }break; - default:{NotImplemented;}break; + if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) + { + goto brkloop; + } + }break; + default:{NotImplemented;}break; } // rjf: fill result @@ -425,7 +425,7 @@ dmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U6 { Assert(0 && "unable to read a program header"); } - + // rjf: save switch(phdr.p_type) { @@ -456,10 +456,10 @@ dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, // rjf: read next dyn entry ELF_Dyn64 dyn = {0}; if(!dmn_lnx_read_dynamic(memory_fd, dynamic_cursor, elf_class, &dyn)) { Assert(0 && "unable to read dynamic"); } - + // rjf: break on zero if(dyn.tag == ELF_DynTag_Null) { break; } - + // extract reuiqred values out of dynamic section if(dyn.tag == ELF_DynTag_Strtab) { @@ -493,35 +493,35 @@ internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) { Temp scratch = scratch_begin(0, 0); - + U64 rdebug_vaddr = 0; - + // load DL's header ELF_Hdr64 ehdr = {0}; if(!dmn_lnx_read_ehdr(memory_fd, loader_vbase, &ehdr)) { Assert(0 && "failed to read interp's header"); goto exit; } - + U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; - + // find dynamic program header U64 dynamic_vaddr = max_U64; for EachIndex(phdr_idx, ehdr.e_phnum) { U64 phdr_vaddr = loader_vbase + ehdr.e_phoff + phdr_idx * ehdr.e_phentsize; - + ELF_Phdr64 phdr = {0}; if(!dmn_lnx_read_phdr(memory_fd, phdr_vaddr, elf_class, &phdr)) { Assert(0 && "failed to read program header"); goto exit; } - + if(phdr.p_type == ELF_PType_Dynamic) { dynamic_vaddr = rebase + phdr.p_offset; break; } } - + // extract necessary info out of dynamic program header DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, rebase, dynamic_vaddr); - + // extract symbol table count from available options U64 symbol_count = 0; if(dynamic_info.hash_vaddr) @@ -531,7 +531,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) { hash_entry_size = 8; } - + U64 chain_count = 0; if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) { @@ -547,7 +547,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) // TODO: extract count from GNU_HASH NotImplemented; } - + // scan symbol table for the rendezvous symbol if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) { @@ -559,16 +559,16 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) Assert(0 && "failed to read symbol table"); break; } - + Temp temp = temp_begin(scratch.arena); - + String8 symbol_name = {0}; if(symbol.st_name < dynamic_info.strtab_size) { U64 cap = dynamic_info.strtab_size - symbol.st_name; symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); } - + if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) { ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info); @@ -578,12 +578,12 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) break; } } - + temp_end(temp); } } -exit:; + exit:; scratch_end(scratch); return rdebug_vaddr; } @@ -595,33 +595,33 @@ internal DMN_LNX_ProbeList dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) { Temp scratch = scratch_begin(&arena, 1); - + DMN_LNX_ProbeList probes = {0}; - + ELF_Hdr64 ehdr = {0}; if(!dmn_lnx_read_ehdr(fd, offset, &ehdr)) { goto exit; } - + U64 strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize; ELF_Shdr64 strtab_shdr = {0}; if(!dmn_lnx_read_shdr(fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr)) { goto exit; } - + B32 found_probes = 0; B32 found_probes_base = 0; ELF_Shdr64 text_shdr = {0}; ELF_Shdr64 stapsdt_base_shdr = {0}; ELF_Shdr64 stapsdt_shdr = {0}; for(U64 shdr_off = offset + ehdr.e_shoff, shdr_opl = shdr_off + ehdr.e_shentsize * ehdr.e_shnum; - shdr_off < shdr_opl; - shdr_off += ehdr.e_shentsize) { + shdr_off < shdr_opl; + shdr_off += ehdr.e_shentsize) { ELF_Shdr64 shdr = {0}; if(!dmn_lnx_read_shdr(fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr)) { goto exit; } - + if(shdr.sh_type == ELF_ShType_Note) { U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); - + if(str8_match(name, str8_lit(".note.stapsdt"), 0)) { stapsdt_shdr = shdr; @@ -633,7 +633,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); - + if(str8_match(name, str8_lit(".stapsdt.base"), 0)) { stapsdt_base_shdr = shdr; @@ -643,76 +643,76 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) text_shdr = shdr; } } - + if(found_probes && found_probes_base) { break; } } - + if(!found_probes || !found_probes_base) { goto exit; } - + U64 probes_base = stapsdt_base_shdr.sh_addr; Rng1U64 note_range = shift_1u64(r1u64(stapsdt_shdr.sh_offset, stapsdt_shdr.sh_offset + stapsdt_shdr.sh_size), offset); void *raw_note = push_array(arena, U8, stapsdt_shdr.sh_size); U64 note_read_size = dmn_lnx_read(fd, note_range, raw_note); if(note_read_size != dim_1u64(note_range)) { goto exit; } - + Arch arch = arch_from_elf_machine(ehdr.e_machine); ELF_NoteList note = elf_parse_note(scratch.arena, str8(raw_note, dim_1u64(note_range)), ehdr.e_ident[ELF_Identifier_Class], ehdr.e_machine); - + for EachNode(n, ELF_NoteNode, note.first) { ELF_Note *note = &n->v; if(!str8_match(note->owner, str8_lit("stapsdt"), 0)) { continue; } if(note->type != ELF_NoteType_STapSdt) { continue; } - + DMN_LNX_Probe probe = {0}; { U64 cursor = 0; U64 addr_size = ehdr.e_ident[ELF_Identifier_Class] == ELF_Class_64 ? 8 : 4; - + U64 pc = 0; U64 pc_size = str8_deserial_read(note->desc, cursor, &pc, addr_size, addr_size); if (pc_size == 0) { goto exit; } cursor += pc_size; - + U64 base_addr = 0; U64 base_addr_size = str8_deserial_read(note->desc, cursor, &base_addr, addr_size, addr_size); if (base_addr_size == 0) { goto exit; } cursor += base_addr_size; - + U64 semaphore = 0; U64 semaphore_size = str8_deserial_read(note->desc, cursor, &semaphore, addr_size, addr_size); if (semaphore_size == 0) { goto exit; } cursor += semaphore_size; - + String8 provider = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += provider.size + 1; if (cursor > note->desc.size) { goto exit; } - + String8 name = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += name.size + 1; if (cursor > note->desc.size) { goto exit; } - + String8 args = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += args.size + 1; if (cursor > note->desc.size) { goto exit; } - + U64 probe_rebase = image_base + (base_addr - probes_base); - + probe.provider = provider; probe.name = name; probe.args = stap_arg_array_from_string(arena, arch, args); probe.pc = pc + probe_rebase; probe.semaphore = semaphore ? semaphore + probe_rebase : 0; } - + DMN_LNX_ProbeNode *n = push_array(arena, DMN_LNX_ProbeNode, 1); n->v = probe; SLLQueuePush(probes.first, probes.last, n); probes.count += 1; } - -exit:; + + exit:; scratch_end(scratch); return probes; } @@ -883,7 +883,7 @@ internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) { AssertAlways(gettid() == thread->parent->tracer_tid); - + B32 result = 0; switch(thread->arch) { @@ -947,7 +947,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(got_gpr) { Temp scratch = scratch_begin(0, 0); - + X64_XSave *xsave = 0; X64_FXSave *fxsave = 0; @@ -980,7 +980,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(fxsave) { X64_FXSave *src = fxsave; - + // copy x87 registers dst->fcw.u16 = src->fcw; dst->fsw.u16 = src->fsw; @@ -994,7 +994,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) { MemoryCopy(&dst->st0 + i, src->st_space + i, sizeof(REGS_Reg80)); } - + // SSE registers are always available in x64 { U128 *xmm_d = fxsave->xmm_space; @@ -1005,7 +1005,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) } } } - + // copy xsave registers if(xsave) { @@ -1019,7 +1019,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&zmm_d[n].v[16], &avx_s[n], sizeof(REGS_Reg128)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_OPMASK) { AssertAlways(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size); @@ -1030,7 +1030,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM_H) { AssertAlways(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size); @@ -1041,7 +1041,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&zmmh_d[n].v[32], &avx512h_s[n], sizeof(REGS_Reg256)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM) { AssertAlways(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size); @@ -1052,7 +1052,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&zmm_d[n], &avx512_s[n], sizeof(REGS_Reg512)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_CETU) { AssertAlways(process->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process->xsave_size); @@ -1101,7 +1101,7 @@ internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) { AssertAlways(gettid() == thread->parent->tracer_tid); - + B32 result = 0; switch(thread->arch) { @@ -1158,10 +1158,10 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(did_gpr) { Temp scratch = scratch_begin(0, 0); - + int xsave_result = -1; int fxsave_result = -1; - + X64_FXSave dst_fxsave = {0}; { dst_fxsave.fcw = src->fcw.u16; @@ -1172,14 +1172,14 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) dst_fxsave.b64.fdp = src->fdp.u64; dst_fxsave.mxcsr = src->mxcsr.u32; dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32; - + REGS_Reg128 *st_d = (REGS_Reg128 *)dst_fxsave.st_space; REGS_Reg80 *st_s = &src->st0; for EachIndex(n, 8) { MemoryCopy(&st_d[n], &st_s[n], sizeof(REGS_Reg80)); } - + REGS_Reg128 *xmm_d = (REGS_Reg128 *)dst_fxsave.xmm_space; REGS_Reg512 *xmm_s = &src->zmm0; for EachIndex(n, 16) @@ -1187,16 +1187,16 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&xmm_d[n], &xmm_s[n], sizeof(REGS_Reg128)); } } - + if(x64_is_xsave_supported()) { U8 *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); int xsave_get = ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = xsave_raw, .iov_len = process->xsave_size }); AssertAlways(xsave_get >= 0); - + X64_XSave *dst = (X64_XSave *)xsave_raw; dst->fxsave = dst_fxsave; - + if(process->xsave_layout.avx_offset) { if(process->xsave_layout.avx_offset + sizeof(REGS_Reg128) * 16 <= process->xsave_size) @@ -1209,7 +1209,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } } } - + if(process->xsave_layout.opmask_offset) { if(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size) @@ -1223,7 +1223,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } else { Assert(0 && "invalid xsave size"); } } - + if(process->xsave_layout.zmm_h_offset) { if(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size) @@ -1237,7 +1237,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } else { Assert(0 && "invalid xsave size"); } } - + if(process->xsave_layout.zmm_offset) { if(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size) @@ -1251,7 +1251,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } else { Assert(0 && "invalid xsave size"); } } - + if(process->xsave_layout.cet_u_offset) { if(process->xsave_layout.cet_u_offset + sizeof(REGS_Reg64) * 2 <= process->xsave_size) @@ -1262,22 +1262,22 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } else { Assert(0 && "invalid xsave size"); } } - + // xsave xsave_result = ptrace(PTRACE_SETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process->xsave_size }); Assert(xsave_result >= 0); } - + // fallback to fxsave if(xsave_result < 0) { fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_base = &dst_fxsave, sizeof(dst_fxsave) }); Assert(fxsave_result >= 0); } - + // rjf: good finish requires xsave or fxsave did_fpr = (xsave_result >= 0 || fxsave_result >= 0); - + scratch_end(scratch); } @@ -1286,9 +1286,9 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(did_fpr) { did_dbg = 1; - + src->dr7.u64 |= (1 << 10); - + REGS_Reg64 *dr_s = &src->dr0; for EachIndex(n, 8) { @@ -1317,27 +1317,27 @@ dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on) B32 is_flag_set = 0; switch(thread->arch) { - case Arch_COUNT: - case Arch_Null: {} break; - case Arch_x64: - { - REGS_RegBlockX64 *reg_block = thread->reg_block; - if(is_on) + case Arch_COUNT: + case Arch_Null: {} break; + case Arch_x64: { - reg_block->rflags.u64 |= X64_RFlag_Trap; - } - else + REGS_RegBlockX64 *reg_block = thread->reg_block; + if(is_on) + { + reg_block->rflags.u64 |= X64_RFlag_Trap; + } + else + { + reg_block->rflags.u64 &= ~X64_RFlag_Trap; + } + is_flag_set = dmn_lnx_thread_write_reg_block(thread, thread->reg_block); + }break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: { - reg_block->rflags.u64 &= ~X64_RFlag_Trap; - } - is_flag_set = dmn_lnx_thread_write_reg_block(thread, thread->reg_block); - }break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { - NotImplemented; - }break; + NotImplemented; + }break; } Assert(is_flag_set); return is_flag_set; @@ -1351,26 +1351,26 @@ dmn_lnx_process_loaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Enti { // read out new link map item if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { goto exit; } - + // was module with this base already registered? DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); if(module) { continue; } - + // parse out module's ELF header ELF_Hdr64 module_ehdr = {0}; if(!dmn_lnx_read_ehdr(process->fd, map.addr_vaddr, &module_ehdr)) { goto exit; } - + // gather info about module U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? map.addr_vaddr : 0; U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); String8 module_name = dmn_lnx_read_string(process->arena, process->fd, map.name_vaddr); - + // fill out module module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); module->id = map.name_vaddr; module->base_vaddr = map.addr_vaddr; - + // push load event if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) { @@ -1385,11 +1385,11 @@ dmn_lnx_process_loaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Enti e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); e->elf_phdr_entsize = module_ehdr.e_phentsize; } - + // create mapping for base -> module hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module); } - + exit:; } @@ -1398,18 +1398,18 @@ dmn_lnx_process_unloaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_En { Temp scratch = scratch_begin(&arena, 1); B32 is_unmap_complete_finished = 0; - + GNU_RDebugInfo64 rdebug = {0}; if(!dmn_lnx_read_r_debug(process->fd, rdebug_vaddr, process->arch, &rdebug)) { goto exit; } if(rdebug.r_version != 1) { goto exit; } - + // flag every module as inactive for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next) { if(module->kind != DMN_LNX_EntityKind_Module) {continue;} module->is_live = 0; } - + // loop over modules in the link map and mark live modules GNU_LinkMap64 map = {0}; for(U64 map_vaddr = rdebug.r_map; map_vaddr != 0; map_vaddr = map.next_vaddr) @@ -1425,7 +1425,7 @@ dmn_lnx_process_unloaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_En } else { Assert(0 && "unable to read Link Map"); } } - + // unload inactive modules DMN_HandleList to_release = {0}; for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next) @@ -1434,25 +1434,25 @@ dmn_lnx_process_unloaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_En if(module->is_live) {continue;} dmn_handle_list_push(scratch.arena, &to_release, dmn_lnx_handle_from_entity(module)); } - + // push events and clean up internal structures for EachNode(n, DMN_HandleNode, to_release.first) { DMN_LNX_Entity *module = dmn_lnx_entity_from_handle(n->v); - + DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); e->kind = DMN_EventKind_UnloadModule; e->process = dmn_lnx_handle_from_entity(process); e->module = dmn_lnx_handle_from_entity(module); e->string = dmn_lnx_read_string(arena, process->fd, module->id); - + hash_table_purge_u64(process->loaded_modules_ht, module->base_vaddr); - + dmn_lnx_entity_release(module); } - + is_unmap_complete_finished = 1; -exit:; + exit:; Assert(is_unmap_complete_finished); scratch_end(scratch); } @@ -1545,11 +1545,11 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) int ptrace_result = 0; int chdir_result = 0; B32 error__need_child_kill = 0; - + // open temp pipes to communicate with child process int pipe_fds[2] = {0}; if (pipe(&pipe_fds[0]) < 0) { InvalidPath; } - + //- rjf: fork pid = fork(); if(pid == -1) { goto error; } @@ -1560,14 +1560,14 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) // wait for parent seize char b; read(pipe_fds[0], &b, sizeof(b)); - + // set current working directory to tracee chdir_result = chdir(path); if(chdir_result == -1) { goto error; } - + // replace process with target execve(argv[0], argv, env); - + // execve failed -- exit abort(); } @@ -1585,47 +1585,47 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) enum LaunchStatus launch_status = LaunchStatus_FailBeforePtrace; { int s = 0; - + // seize process if (ptrace(PTRACE_SEIZE, pid, 0, 0) < 0) { Assert(0 && "seize failed"); goto launch_error; } - + // interrupt process launch_status = LaunchStatus_FailAfterPtrace; if (ptrace(PTRACE_INTERRUPT, pid, 0, 0) < 0) { Assert(0 && "interrupt failed"); goto launch_error; } if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "interrupt wait failed"); goto launch_error; } - + // entry read if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - + // resume child char b = 1; if (write(pipe_fds[1], &b, sizeof(b)) < 0) { Assert(0 && "resume child failed"); goto launch_error; } - + // exit read if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - + // entry chdir if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - + // exit chdir if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - + // entry execv if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - + // exit execve if (waitpid(pid, &s, __WALL | __WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } if (waitpid(pid, &s, __WALL | __WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } - + uintptr_t trace_options = PTRACE_O_TRACEEXIT | PTRACE_O_EXITKILL | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEVFORKDONE; int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(trace_options)); if (setoptions_result == -1) { Assert(0 && "failed to set options"); error__need_child_kill = 1; goto launch_error; } - + launch_status = LaunchStatus_Success; launch_error:; } @@ -1667,19 +1667,19 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) case LaunchStatus_Success: { ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); - int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); + int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR|O_CLOEXEC); DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base); U64 rdebug_brk_vaddr = rdebug_vaddr + gnu_r_brk_offset_from_arch(arch); - + ELF_Class dl_class; { ELF_Hdr64 ehdr = {0}; if(!dmn_lnx_read_ehdr(memory_fd, auxv.base, &ehdr)) { Assert(0 && "failed to read interp's header"); } dl_class = ehdr.e_ident[ELF_Identifier_Class]; } - + U64 xcr0 = 0; U64 xsave_size = 0; X64_XSaveLayout xsave_layout = {0}; @@ -1699,10 +1699,10 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) Assert(0 && "failed to get xstate"); } } - + String8 dl_path = {0}; { - int maps_fd = open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY); + int maps_fd = open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY|O_CLOEXEC); if(maps_fd != -1) { struct stat st = {0}; @@ -1714,7 +1714,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) if(read_size == maps_size) { String8 maps = str8(maps_ptr, maps_size); - + String8List parts = {0}; { for(U64 cursor = 0, part_off = 0; cursor < maps.size; cursor += 1) @@ -1735,36 +1735,36 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) } } } - + for(String8Node *n = parts.first; n != 0; ) { String8 vrange_str = n->string; n = n->next; if(n == 0) { break; } - + String8 perms_str = n->string; n = n->next; if(n == 0) { break; } - + String8 offset_str = n->string; n = n->next; if(n == 0) { break; } - + String8 dev_str = n->string; n = n->next; if(n == 0) { break; } - + String8 inode_str = n->string; n = n->next; if(n == 0) { break; } - + String8 path = n->string; n = n->next; if(n == 0) { break; } - + String8List vaddr_list = str8_split_by_string_chars(scratch.arena, vrange_str, str8_lit("-"), 0); if(vaddr_list.node_count != 2) { break; } - + U64 lo_vaddr = u64_from_str8(vaddr_list.first->string, 16); if(lo_vaddr == auxv.base) { @@ -1778,48 +1778,48 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) } } AssertAlways(dl_path.size); - + // alloc arena for the process Arena *process_arena = arena_alloc(); - + DMN_LNX_Probe **known_probes = push_array(process_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); { DMN_LNX_ProbeList probes = {0}; - int dl_fd = open((char *)dl_path.str, O_RDONLY); + int dl_fd = open((char *)dl_path.str, O_RDONLY|O_CLOEXEC); if(dl_fd >= 0) { probes = dmn_lnx_read_probes(process_arena, dl_fd, 0, auxv.base); close(dl_fd); } - + for EachNode(n, DMN_LNX_ProbeNode, probes.first) { DMN_LNX_Probe *p = &n->v; if(str8_match(p->provider, str8_lit("rtld"), 0)) { - #define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } +#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } DMN_LNX_Probe_XList - #undef X +#undef X } } } - + // install DL probes U64 probe_vaddrs[DMN_LNX_ProbeType_Count] = {0}; for EachIndex(i, DMN_LNX_ProbeType_Count) { if(known_probes[i] == 0) { continue; } - + U8 og_byte = 0; if(!dmn_lnx_read_struct(memory_fd, known_probes[i]->pc, &og_byte)) { Assert(0 && "failed to read original byte"); } Assert(og_byte == 0x90); - + U8 trap = 0xcc; if(!dmn_lnx_write_struct(memory_fd, known_probes[i]->pc, &trap)) { Assert(0 && "failed to install probe"); } - + probe_vaddrs[i] = known_probes[i]->pc; } - + // make process entity & push create event DMN_LNX_Entity *process = &dmn_lnx_nil_entity; { @@ -1847,7 +1847,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) e->code = pid; } } - + // make thread entity & push create event DMN_LNX_Entity *main_thread = &dmn_lnx_nil_entity; { @@ -1865,17 +1865,17 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) e->code = main_thread->id; } } - + // make main module & push load module event { U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; DMN_LNX_PhdrInfo phdr_info = dmn_lnx_phdr_info_from_memory(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); - + DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); module->id = auxv.execfn; module->base_vaddr = base_vaddr; - + DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); e->kind = DMN_EventKind_LoadModule; e->process = dmn_lnx_handle_from_entity(process); @@ -1887,11 +1887,11 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, auxv.execfn); e->elf_phdr_vrange = r1u64(auxv.phdr, auxv.phdr + auxv.phent * auxv.phnum); e->elf_phdr_entsize = auxv.phent; - + hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, 0, module); hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, base_vaddr, module); } - + // rjf: handshake event { DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); @@ -1916,7 +1916,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) //- rjf: success success:; - + // clean up pipes close(pipe_fds[0]); close(pipe_fds[1]); @@ -1968,7 +1968,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f pid_t wait_id = waitpid(tid, &status, __WALL|__WNOTHREAD); if(status == -1 && errno == EINTR) {continue;} // wait interrupted, try again if(status == -1) {InvalidPath;} // TODO: graceful exit - + //- rjf: unpack event int wifexited = WIFEXITED(status); int wifsignaled = WIFSIGNALED(status); @@ -1977,9 +1977,9 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f int ptrace_event_code = (status>>16); DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); DMN_LNX_Entity *process = thread->parent; - + //printf("waitpid - pid %d wifexited %d, wifsignaled %d, wifstopped %d, wstopsig %d\n", wait_id, wifexited, wifsignaled, wifstopped, wstopsig); - + // update thread registers if(thread != &dmn_lnx_nil_entity) { @@ -1992,7 +1992,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f DMN_Trap *hit_user_trap = 0; pid_t new_pid = 0; B32 is_group_stop = 0; - + //- rjf: WIFEXITED(status) -> thread exit if(wifexited) { @@ -2005,7 +2005,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f e_kind = DMN_EventKind_ExitThread; exit_code = WTERMSIG(status); } - + //- rjf: SIGTRAP:PTRACE_EVENT_EXIT else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_EXIT) { @@ -2029,7 +2029,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f ptrace_event_code == PTRACE_EVENT_VFORK)) { } - + // group stop else if(wifstopped && wstopsig == SIGTRAP && status >> 16 == PTRACE_EVENT_STOP) { @@ -2042,7 +2042,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f // translate signal code to DEMON event kind siginfo_t siginfo = {0}; if(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo) < 0) { Assert(0 && "failed to get signal info"); } - + switch(siginfo.si_code) { case DMN_LNX_SigTrapCode_Brkpt: @@ -2135,11 +2135,11 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f { Assert(0 && "unexpected stop code"); } - + dmn_lnx_state->last_event_kind = e_kind; dmn_lnx_state->last_stop_pid = wait_id; dmn_lnx_state->last_sig_code = wstopsig; - + if(wait_for_group_stop) { if(is_group_stop) @@ -2151,7 +2151,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f { done = 1; } - + if(e_kind == DMN_EventKind_Breakpoint) { U64 ip = dmn_lnx_thread_read_ip(thread); @@ -2164,7 +2164,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f } } } - + // is this a probe trap? if(e_kind == DMN_EventKind_Breakpoint) { @@ -2179,7 +2179,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f break; } } - + if(probe_type == DMN_LNX_ProbeType_InitComplete) { U64 name_space_id = 0, rdebug_addr = 0; @@ -2232,17 +2232,17 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f } else { Assert(0 && "failed to read first argument"); } } - + if(probe_type != DMN_LNX_ProbeType_Null) {break;} } - + // rollback IP on user traps if(hit_user_trap) { U64 ip = dmn_lnx_thread_read_ip(thread); dmn_lnx_thread_write_ip(thread, ip - 1); } - + switch(e_kind) { case DMN_EventKind_COUNT: @@ -2251,7 +2251,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f case DMN_EventKind_HandshakeComplete: case DMN_EventKind_LoadModule: case DMN_EventKind_UnloadModule: - {InvalidPath;}break; + {InvalidPath;}break; case DMN_EventKind_Trap: case DMN_EventKind_Memory: case DMN_EventKind_SetThreadName: @@ -2267,7 +2267,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f { // clear single step flag dmn_lnx_set_single_step_flag(thread, 0); - + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = e_kind; e->process = dmn_lnx_handle_from_entity(process); @@ -2351,7 +2351,7 @@ dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_f thread->arch = process->arch; thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); dmn_lnx_thread_read_reg_block(thread, thread->reg_block); - + DMN_Event *e = dmn_event_list_push(arena, evts); e->kind = DMN_EventKind_CreateThread; e->process = dmn_lnx_handle_from_entity(process); @@ -2419,12 +2419,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) for EachIndex(n_idx, n->count) { DMN_Trap *trap = n->v+n_idx; - + if(trap->flags == 0) { DMN_ActiveTrap *is_set = hash_table_search_u64_raw(ht, trap->vaddr); if(is_set) { continue; } - + U8 swap_byte = 0; if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &swap_byte) > 0) { @@ -2435,7 +2435,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) active_trap->trap = trap; active_trap->swap_byte = swap_byte; SLLQueuePush(active_trap_first, active_trap_last, active_trap); - + hash_table_push_u64_raw(scratch.arena, ht, trap->vaddr, active_trap); } else { Assert(0 && "failed to write trap"); } } else { Assert(0 && "failed to read original byte"); } @@ -2443,7 +2443,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } } - + //////////////////////////// //- enable single stepping if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) @@ -2451,7 +2451,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) DMN_LNX_Entity *single_step_thread = dmn_lnx_entity_from_handle(ctrls->single_step_thread); dmn_lnx_set_single_step_flag(single_step_thread, 1); } - + //////////////////////////// //- rjf: gather all threads which we should run // @@ -2524,7 +2524,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } } - + //////////////////////////// //- rjf: resume all threads we need to run // @@ -2532,20 +2532,20 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) for EachNode(n, DMN_LNX_EntityNode, run_threads.first) { DMN_LNX_Entity *thread = n->v; - + // update registers if(!dmn_lnx_thread_write_reg_block(thread, thread->reg_block)) { Assert(0 && "failed to write thread's registers"); } - + // pass signal to the child process void *sig_code = 0; if(dmn_lnx_state->last_event_kind == DMN_EventKind_Exception && dmn_lnx_state->last_stop_pid == thread->id) { sig_code = (void *)(uintptr_t)dmn_lnx_state->last_sig_code; } - + // resume thread if (ptrace(PTRACE_CONT, (pid_t)thread->id, 0, (void *)sig_code) < 0) { Assert(0 && "failed to resume a thread"); } - + dmn_lnx_entity_list_push(scratch.arena, &ran_threads, thread); } @@ -2556,7 +2556,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { dmn_lnx_wait_for_events(arena, &evts, -1, 0, active_trap_first); } - + //////////////////////////// //- rjf: stop all threads // @@ -2578,7 +2578,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) dmn_lnx_wait_for_events(arena, &evts, -1, 1, active_trap_first); } } - + // update registers for EachNode(n, DMN_LNX_EntityNode, ran_threads.first) { diff --git a/src/demon/linux/demon_os_linux.c b/src/demon/linux/demon_os_linux.c index 39c1aa1f..65b4e639 100644 --- a/src/demon/linux/demon_os_linux.c +++ b/src/demon/linux/demon_os_linux.c @@ -110,7 +110,7 @@ internal int demon_lnx_open_memory_fd_for_pid(pid_t pid){ Temp scratch = scratch_begin(0, 0); String8 memory_path = push_str8f(scratch.arena, "/proc/%i/mem", pid); - int result = open((char*)memory_path.str, O_RDWR); + int result = open((char*)memory_path.str, O_RDWR|O_CLOEXEC); scratch_end(scratch); return(result); } @@ -126,7 +126,7 @@ demon_lnx_arch_from_pid(pid_t pid){ // handle to exe int exe_fd = -1; if (exe_path.size != 0){ - exe_fd = open((char*)exe_path.str, O_RDONLY); + exe_fd = open((char*)exe_path.str, O_RDONLY|O_CLOEXEC); } // elf identification @@ -199,7 +199,7 @@ demon_lnx_aux_from_pid(pid_t pid, Arch arch){ // open aux data Temp scratch = scratch_begin(0, 0); String8 auxv_symbol_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int aux_fd = open((char*)auxv_symbol_path.str, O_RDONLY); + int aux_fd = open((char*)auxv_symbol_path.str, O_RDONLY|O_CLOEXEC); // scan aux data if (aux_fd >= 0){ @@ -670,7 +670,7 @@ internal int demon_lnx_open_maps(pid_t pid){ Temp scratch = scratch_begin(0, 0); String8 path = push_str8f(scratch.arena, "/proc/%d/maps", pid); - int maps = open((char*)path.str, O_RDONLY); + int maps = open((char*)path.str, O_RDONLY|O_CLOEXEC); scratch_end(scratch); return(maps); } diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 3a26b89d..811a8faa 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1977,12 +1977,26 @@ rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_Stri RDI_U8 *opl = string.str + string.size; for(;ptr < opl;) { - // rjf: skip past slashes - for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + // rjf: skip past non-leading slashes + RDI_U32 leading_slash = 0; + if(ptr > string.str) + { + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + } + else if(ptr < opl) + { + leading_slash = (*ptr == '/'); + } - // rjf: save beginning of non-slash range + // rjf: save beginning of path part RDI_U8 *range_first = ptr; + // rjf: advance past leading slash + if(leading_slash) + { + ptr += 1; + } + // rjf: skip past non-slashes for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 026005c2..13d6bacb 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -284,6 +284,7 @@ os_file_open(OS_AccessFlags flags, String8 path) { lnx_flags |= O_CREAT; } + lnx_flags |= O_CLOEXEC; int fd = open((char *)path_copy.str, lnx_flags, 0755); OS_Handle handle = {0}; if(fd != -1) @@ -652,7 +653,7 @@ os_shared_memory_alloc(U64 size, String8 name) { Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR | O_CREAT, 0666); + int id = shm_open((char *)name_copy.str, O_RDWR|O_CREAT, 0666); ftruncate(id, size); OS_Handle result = {(U64)id}; scratch_end(scratch); From 1196de69165fd1c8d0efd5d8d5a4e4d6882ee222 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 7 Nov 2025 15:47:32 -0800 Subject: [PATCH 063/850] move sys/wait.h to os_core_linux --- src/demon/linux/demon_core_linux.h | 1 - src/os/core/linux/os_core_linux.h | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index b5b11498..a53d587a 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -8,7 +8,6 @@ //~ rjf: Includes #include -#include #include #include diff --git a/src/os/core/linux/os_core_linux.h b/src/os/core/linux/os_core_linux.h index 2a351674..d7301e78 100644 --- a/src/os/core/linux/os_core_linux.h +++ b/src/os/core/linux/os_core_linux.h @@ -9,7 +9,9 @@ #include #include +#include #include +#include #include #include #include @@ -25,10 +27,9 @@ #include #include #include +#include #include #include -#include -#include pid_t gettid(void); int pthread_setname_np(pthread_t thread, const char *name); From ed5742860232964379a65c3e45c4af26823dc5da Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 16:38:46 -0800 Subject: [PATCH 064/850] flip meta check in build.sh --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index a69c0dd4..a1df2af2 100644 --- a/build.sh +++ b/build.sh @@ -53,7 +53,7 @@ mkdir -p build mkdir -p local # --- Build & Run Metaprogram ------------------------------------------------- -if [ ! -v meta ] +if [ -v meta ] then echo "[doing metagen]" cd build From efb4731acec006c4dbfb6d95fbb32d673d21cb04 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 7 Nov 2025 16:53:30 -0800 Subject: [PATCH 065/850] respect leading slashes in bake file path tree lookup --- src/lib_rdi_make/rdi_make.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 811a8faa..e07100f6 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1904,12 +1904,26 @@ rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string) RDI_U8 *opl = string.str + string.size; for(;ptr < opl && node != 0;) { - // rjf: skip past slashes - for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + // rjf: skip past non-leading slashes + RDI_U32 leading_slash = 0; + if(ptr > string.str) + { + for(;ptr < opl && (*ptr == '/' || *ptr == '\\'); ptr += 1); + } + else if(ptr < opl) + { + leading_slash = (*ptr == '/'); + } // rjf: save beginning of non-slash range RDI_U8 *range_first = ptr; + // rjf: advance past leading slash + if(leading_slash) + { + ptr += 1; + } + // rjf: skip past non-slashes for(;ptr < opl && !(*ptr == '/' || *ptr == '\\'); ptr += 1); From f396b2eaa32850742700487fd7771b95ab80df7d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 10 Nov 2025 15:06:52 -0800 Subject: [PATCH 066/850] start dwarf -> rdi cleanup; eliminate some assertions-as-validation, remove incorrect assumption that line info addresses are vaddrs (they seem to be voffs) --- project.4coder | 4 +- src/dwarf/dwarf.h | 6 +- src/dwarf/dwarf_dump.c | 444 +++++------ src/dwarf/dwarf_parse.c | 1141 ++++++++++++++------------- src/elf/elf.h | 6 +- src/rdi_from_coff/rdi_from_coff.c | 13 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 1008 +++++++++++++---------- src/rdi_from_dwarf/rdi_from_dwarf.h | 23 +- src/rdi_from_elf/rdi_from_elf.c | 31 +- src/rdi_from_elf/rdi_from_elf.h | 3 +- src/rdi_from_pdb/rdi_from_pdb.h | 4 +- 11 files changed, 1433 insertions(+), 1250 deletions(-) diff --git a/project.4coder b/project.4coder index 69b7529f..137f091b 100644 --- a/project.4coder +++ b/project.4coder @@ -46,8 +46,8 @@ load_paths = commands = { //- rjf: [raddbg] - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 89e9b099..2fc8668f 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1582,9 +1582,9 @@ typedef enum DW_ExprOpEnum { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) DW_ExprOp_##_N = _ID, DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) + DW_Expr_V4_XList(X) + DW_Expr_V5_XList(X) + DW_Expr_GNU_XList(X) #undef X } DW_ExprOpEnum; diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 27ad6dd0..e551e4ea 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -350,7 +350,7 @@ dw_string_list_from_cfi_program(Arena *arena, { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; - + U64 reg_max = dw_reg_count_from_arch(arch); U64 pc = pc_begin; for (U64 cursor = 0, inst_size; cursor < program.size; cursor += inst_size) { @@ -362,134 +362,134 @@ dw_string_list_from_cfi_program(Arena *arena, str8_list_pushf(arena, &list, "ERROR: failed to unpack CFA instruction @ 0x%I64", cursor); break; } - + // error check operands DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst.opcode); U64 operand_count = dw_operand_count_from_cfa_opcode(inst.opcode); for EachIndex(operand_idx, operand_count) { switch (operand_types[operand_idx]) { - case DW_CFA_OperandType_Null: break; - case DW_CFA_OperandType_Value: break; - case DW_CFA_OperandType_Register: { - if (inst.operands[operand_idx].u64 >= reg_max) { - str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", - dw_string_from_cfa_opcode(inst.opcode), - cursor); - } - } break; - case DW_CFA_OperandType_Expression: { - DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); - for EachNode(inst, DW_ExprInst, expr.first) { - if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { - String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); - str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); + case DW_CFA_OperandType_Null: break; + case DW_CFA_OperandType_Value: break; + case DW_CFA_OperandType_Register: { + if (inst.operands[operand_idx].u64 >= reg_max) { + str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", + dw_string_from_cfa_opcode(inst.opcode), + cursor); } - } - } break; - default: { InvalidPath; } break; + } break; + case DW_CFA_OperandType_Expression: { + DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); + for EachNode(inst, DW_ExprInst, expr.first) { + if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { + String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); + str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); + } + } + } break; + default: { InvalidPath; } break; } } - + // format operands String8 operand_str = str8_lit("???"); switch (inst.opcode) { - case DW_CFA_Nop: { operand_str = str8_zero(); } break; - case DW_CFA_SetLoc: { - operand_str = str8f(arena, "0x%X", inst.operands[0].u64); - pc = inst.operands[0].u64; - } break; - case DW_CFA_AdvanceLoc1: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc2: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc4: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_OffsetExt: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; - case DW_CFA_Undefined: { - operand_str = str8f(arena, "%I64u", inst.operands[0].u64); - } break; - case DW_CFA_SameValue: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_Register: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_RememberState: { operand_str = str8_zero(); } break; - case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; - case DW_CFA_DefCfa: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_DefCfaRegister: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_DefCfaOffset: { - operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); - } break; - case DW_CFA_DefCfaExpr: { - operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); - } break; - case DW_CFA_Expr: { - String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); - } break; - case DW_CFA_OffsetExtSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; - case DW_CFA_ValOffset: { - operand_str = str8f(arena, "value 0x%llx, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_ValOffsetSf: { - operand_str = str8f(arena, "value %llu, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_ValExpr: { - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); - } break; - case DW_CFA_AdvanceLoc: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_Offset: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_Restore: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - default: { - str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); - } goto exit; + case DW_CFA_Nop: { operand_str = str8_zero(); } break; + case DW_CFA_SetLoc: { + operand_str = str8f(arena, "0x%X", inst.operands[0].u64); + pc = inst.operands[0].u64; + } break; + case DW_CFA_AdvanceLoc1: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc2: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc4: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_OffsetExt: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; + case DW_CFA_Undefined: { + operand_str = str8f(arena, "%I64u", inst.operands[0].u64); + } break; + case DW_CFA_SameValue: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_Register: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_RememberState: { operand_str = str8_zero(); } break; + case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; + case DW_CFA_DefCfa: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_DefCfaRegister: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_DefCfaOffset: { + operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); + } break; + case DW_CFA_DefCfaExpr: { + operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); + } break; + case DW_CFA_Expr: { + String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); + } break; + case DW_CFA_OffsetExtSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; + case DW_CFA_ValOffset: { + operand_str = str8f(arena, "value 0x%llx, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_ValOffsetSf: { + operand_str = str8f(arena, "value %llu, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_ValExpr: { + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); + } break; + case DW_CFA_AdvanceLoc: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_Offset: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_Restore: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + default: { + str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); + } goto exit; } - + if (operand_str.size) { str8_list_pushf(arena, &list, "DW_CFA_%S: %S", dw_string_from_cfa_opcode(inst.opcode), operand_str); } else { str8_list_pushf(arena, &list, "DW_CFA_%S", dw_string_from_cfa_opcode(inst.opcode)); } } - -exit:; + + exit:; scratch_end(scratch); return list; } @@ -499,10 +499,10 @@ dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version { String8 cfa_str = str8_lit("???"); switch (cfa.rule) { - case DW_CFA_Rule_Null: {} break; - case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; - case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; - default: { InvalidPath; } break; + case DW_CFA_Rule_Null: {} break; + case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; + case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; + default: { InvalidPath; } break; } return cfa_str; } @@ -517,40 +517,40 @@ dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version ver DW_CFI_Register *cfi_reg = &row->regs[reg_idx]; String8 rule_str = str8_lit("???"); switch (cfi_reg->rule) { - case DW_CFI_RegisterRule_Undefined: { - rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_SameValue: { - rule_str = str8_zero(); - } break; - case DW_CFI_RegisterRule_Offset: { - rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_ValOffset: { - rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_Register: { - rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_Expression: { - rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); - } break; - case DW_CFI_RegisterRule_ValExpression: { - rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); - } break; - case DW_CFI_RegisterRule_Architectural: { - rule_str = str8_lit("???"); - } break; - default: { InvalidPath; } break; + case DW_CFI_RegisterRule_Undefined: { + rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_SameValue: { + rule_str = str8_zero(); + } break; + case DW_CFI_RegisterRule_Offset: { + rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_ValOffset: { + rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_Register: { + rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_Expression: { + rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_ValExpression: { + rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_Architectural: { + rule_str = str8_lit("???"); + } break; + default: { InvalidPath; } break; } - + if (rule_str.size) { str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_reg(scratch.arena, arch, reg_idx), rule_str); } } - + String8 string = str8_list_join(arena, &cfi_regs_list, &(StringJoin){.sep=str8_lit(", ")}); - + scratch_end(scratch); return string; } @@ -1601,7 +1601,7 @@ internal String8 dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_vm, DW_Attrib *attrib) { Temp scratch = scratch_begin(&arena, 1); - + String8List attrib_fmt = {0}; // rjf: log attrib's value based on vlass @@ -1722,7 +1722,7 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni enum_info = dw_string_from_attrib_type_encoding(scratch.arena, encoding); }break; } - + if(enum_info.size) { str8_list_pushf(scratch.arena, &attrib_fmt, " `%S`", enum_info); @@ -1730,7 +1730,7 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni } String8 result = str8_list_join(arena, &attrib_fmt, 0); - + scratch_end(scratch); return result; } @@ -1750,7 +1750,7 @@ dw_dump_list_from_sections(Arena *arena, Rng1U64Array segment_vranges = {0}; DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input); B32 relaxed = 1; - + DW_CompUnit *cu_arr; { DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input); @@ -1780,7 +1780,7 @@ dw_dump_list_from_sections(Arena *arena, String8 unit_dir = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_CompDir ); String8 unit_name = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_Name ); String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_StmtList); - DW_LineVMHeader line_vm = {0}; + DW_LineVMHeader line_vm = {0}; dw_read_line_vm_header(unit_temp.arena, stmt_list, 0, input, unit_dir, unit_name, unit->address_size, unit->str_offsets_lu, &line_vm); //- rjf: log top-level unit info @@ -1820,25 +1820,25 @@ dw_dump_list_from_sections(Arena *arena, temp_end(attrib_temp); } value_max_size = Min(120, value_max_size); - + // log for EachNode(attrib_n, DW_AttribNode, tag.attribs.first) { DW_Attrib *attrib = &attrib_n->v; - + Temp attrib_temp = temp_begin(tag_temp.arena); - + String8 attrib_kind_str = dw_string_from_attrib_kind(attrib_temp.arena, unit->version, unit->ext, attrib->attrib_kind); String8 form_kind_str = dw_string_from_form_kind(attrib_temp.arena, unit->version, attrib->form_kind); String8 value_str = dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_vm, attrib); - + dumpf("%S attrib: { kind: %S, %.*sform_kind: %S, %.*svalue: %S, %.*s} // info_off: 0x%I64x\n", - tag_indent, - attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, indent.str, - form_kind_str, form_kind_max_size - form_kind_str.size, indent.str, - value_str, value_str.size < value_max_size ? value_max_size - value_str.size: 0, indent.str, - attrib->info_off, unit_idx, tag_idx); - + tag_indent, + attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, indent.str, + form_kind_str, form_kind_max_size - form_kind_str.size, indent.str, + value_str, value_str.size < value_max_size ? value_max_size - value_str.size: 0, indent.str, + attrib->info_off, unit_idx, tag_idx); + temp_end(attrib_temp); } } @@ -2199,7 +2199,7 @@ dw_dump_list_from_sections(Arena *arena, dumpf(" { 0x%08I64x %llu \"%S\" }\n", cursor, string.size, string); } } - + ////////////////////////////// //~ dump .debug_frame DumpSubset(DebugFrame) @@ -2207,7 +2207,7 @@ dw_dump_list_from_sections(Arena *arena, HashTable *cie_ht = hash_table_init(scratch.arena, 0x2000); String8 debug_frame = input->sec[DW_Section_Frame].data; U64 addr_size = byte_size_from_arch(arch); - + // make offset -> CIE hash table for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { DW_DescriptorEntry desc = {0}; @@ -2229,71 +2229,71 @@ dw_dump_list_from_sections(Arena *arena, desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); String8 raw_desc = str8_substr(debug_frame, desc.entry_range); switch (desc.type) { - case DW_DescriptorEntryType_Null: {} break; - case DW_DescriptorEntryType_CIE: { - DW_CIE cie = {0}; - if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { - String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); - - dumpf("CIE: // entry range: %r\n", desc.entry_range); - dumpf("{\n"); - dumpf(" Format: %S\n", dw_string_from_format(desc.format)); - dumpf(" Version: %u\n", cie.version); - dumpf(" Aug string: \"%S\"\n", cie.aug_string); - dumpf(" Code align: %I64u\n", cie.code_align_factor); - dumpf(" Data align: %I64d\n", cie.data_align_factor); - dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); - if (cie.version > DW_Version_3) { - dumpf(" Address size: %u\n", cie.address_size); - dumpf(" Segment selector size: %u\n", cie.segment_selector_size); - } - dumpf(" Initial Insturction:\n"); - dumpf(" {\n"); - for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(" %S\n", n->string); } - dumpf(" }\n"); - dumpf("}\n"); - } else { - dumpf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); - } - } break; - case DW_DescriptorEntryType_FDE: { - DW_DescriptorEntry cie_desc = {0}; - U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); - String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); - DW_CIE cie = {0}; - dw_parse_cie(cie_data, cie_desc.format, arch, &cie); - - DW_FDE fde = {0}; - if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { - DW_Version version = DW_Version_5; - DW_Ext ext = DW_Ext_All; - String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); - dumpf("FDE: // entry range: %r\n", desc.entry_range); - dumpf("{\n"); - { - dumpf(" Format: %S\n", dw_string_from_format(fde.format)); - dumpf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); - dumpf(" PC range: %r\n", fde.pc_range); - dumpf(" Instructions:\n"); + case DW_DescriptorEntryType_Null: {} break; + case DW_DescriptorEntryType_CIE: { + DW_CIE cie = {0}; + if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { + String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); + + dumpf("CIE: // entry range: %r\n", desc.entry_range); + dumpf("{\n"); + dumpf(" Format: %S\n", dw_string_from_format(desc.format)); + dumpf(" Version: %u\n", cie.version); + dumpf(" Aug string: \"%S\"\n", cie.aug_string); + dumpf(" Code align: %I64u\n", cie.code_align_factor); + dumpf(" Data align: %I64d\n", cie.data_align_factor); + dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); + if (cie.version > DW_Version_3) { + dumpf(" Address size: %u\n", cie.address_size); + dumpf(" Segment selector size: %u\n", cie.segment_selector_size); + } + dumpf(" Initial Insturction:\n"); dumpf(" {\n"); - for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } + for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(" %S\n", n->string); } dumpf(" }\n"); + dumpf("}\n"); + } else { + dumpf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); } - dumpf(" Unwind:\n"); - dumpf(" {\n"); - DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); - do { - String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); - String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); - dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); - } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); - dumpf(" }\n"); - - dumpf("}\n"); - } else { - dumpf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); - } - } break; + } break; + case DW_DescriptorEntryType_FDE: { + DW_DescriptorEntry cie_desc = {0}; + U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); + String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); + DW_CIE cie = {0}; + dw_parse_cie(cie_data, cie_desc.format, arch, &cie); + + DW_FDE fde = {0}; + if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { + DW_Version version = DW_Version_5; + DW_Ext ext = DW_Ext_All; + String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); + dumpf("FDE: // entry range: %r\n", desc.entry_range); + dumpf("{\n"); + { + dumpf(" Format: %S\n", dw_string_from_format(fde.format)); + dumpf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); + dumpf(" PC range: %r\n", fde.pc_range); + dumpf(" Instructions:\n"); + dumpf(" {\n"); + for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } + dumpf(" }\n"); + } + dumpf(" Unwind:\n"); + dumpf(" {\n"); + DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); + do { + String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); + String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); + dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); + } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); + dumpf(" }\n"); + + dumpf("}\n"); + } else { + dumpf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); + } + } break; } } } diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 8559b08d..481b5eee 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -12,12 +12,17 @@ internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) { U64 bytes_read = 0; - if (str8_deserial_read(string, off, size_out, sizeof(U32), sizeof(U32))) { - if (*size_out == max_U32) { - if (str8_deserial_read_struct(string, off+sizeof(U32), size_out)) { + if(str8_deserial_read(string, off, size_out, sizeof(U32), sizeof(U32))) + { + if(*size_out == max_U32) + { + if(str8_deserial_read_struct(string, off+sizeof(U32), size_out)) + { bytes_read = sizeof(U32) + sizeof(U64); } - } else { + } + else + { *size_out &= (U64)max_U32; bytes_read = sizeof(U32); } @@ -29,15 +34,18 @@ internal U64 str8_deserial_read_dwarf_uint(String8 string, U64 off, DW_Format format, U64 *uint_out) { U64 bytes_read = 0; - switch (format) { + switch(format) + { case DW_Format_Null: break; - case DW_Format_32Bit: { + case DW_Format_32Bit: + { *uint_out &= (U64)max_U32; bytes_read = str8_deserial_read(string, off, uint_out, sizeof(U32), sizeof(U32)); - } break; - case DW_Format_64Bit: { + }break; + case DW_Format_64Bit: + { bytes_read = str8_deserial_read_struct(string, off, uint_out); - } break; + }break; } return bytes_read; } @@ -196,27 +204,26 @@ internal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data) { Rng1U64List result = {0}; - - for (U64 cursor = 0; cursor < data.size; ) { - // read CU size - U64 cu_size = 0; + for(U64 cursor = 0; cursor < data.size;) + { + // rjf: read CU size; bad read -> terminate + U64 cu_size = 0; U64 cu_size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &cu_size); - - // was read ok? - if (cu_size_size == 0) { + if(cu_size_size == 0) + { break; } - if (cu_size > 0) { - // push unit range + // rjf: push + if(cu_size > 0) + { rng1u64_list_push(arena, &result, rng_1u64(cursor, cursor+cu_size+cu_size_size)); } - // advance + // rjf: advance cursor += cu_size_size; cursor += cu_size; } - return result; } @@ -2420,15 +2427,7 @@ dw_read_line_file_array(Arena *arena, } internal U64 -dw_read_line_vm_header(Arena *arena, - String8 line_data, - U64 line_off, - DW_Input *input, - String8 cu_dir, - String8 cu_name, - U8 cu_address_size, - DW_ListUnit *cu_str_offsets, - DW_LineVMHeader *header_out) +dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out) { Temp scratch = scratch_begin(&arena, 1); @@ -2824,37 +2823,35 @@ dw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx) } internal DW_LineTableParseResult -dw_parsed_line_table_from_data(Arena *arena, - String8 unit_data, - DW_Input *input, - String8 cu_dir, - String8 cu_name, - U8 cu_address_size, - DW_ListUnit *cu_str_offsets) +dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets) { DW_LineVMHeader vm_header = {0}; U64 vm_header_size = dw_read_line_vm_header(arena, unit_data, 0, input, cu_dir, cu_name, cu_address_size, cu_str_offsets, &vm_header); - U64 unit_cursor = vm_header_size; + U64 unit_cursor_opl = Min(unit_data.size, vm_header.unit_range.max); //- rjf: prep state for VM DW_LineVMState vm_state = {0}; dw_line_vm_reset(&vm_state, vm_header.default_is_stmt); //- rjf: VM loop; build output list - DW_LineTableParseResult result = { .vm_header = vm_header }; - B32 end_of_seq = 0; - B32 error = 0; - for (; !error && unit_cursor < unit_data.size; ) { + DW_LineTableParseResult result = {.vm_header = vm_header}; + B32 end_of_seq = 0; + B32 error = 0; + for(;!error && unit_cursor < unit_cursor_opl;) + { //- rjf: parse opcode U8 opcode = 0; unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &opcode); //- rjf: do opcode action - switch (opcode) { - default: { - //- rjf: special opcode case - if (opcode >= vm_header.opcode_base) { + switch(opcode) + { + //- rjf: special opcode cases + default: + { + if(opcode >= vm_header.opcode_base) + { U32 adjusted_opcode = (U32)(opcode - vm_header.opcode_base); U32 op_advance = adjusted_opcode / vm_header.line_range; S32 line_inc = (S32)vm_header.line_base + ((S32)adjusted_opcode) % (S32)vm_header.line_range; @@ -2884,25 +2881,31 @@ dw_parsed_line_table_from_data(Arena *arena, } #endif } + // Skipping unknown opcode. This is a valid case and // it works because compiler stores operand lengths. - else { - if (0 < opcode && opcode <= vm_header.num_opcode_lens) { + else + { + if(0 < opcode && opcode <= vm_header.num_opcode_lens) + { U8 num_operands = vm_header.opcode_lens[opcode - 1]; - for (U8 i = 0; i < num_operands; ++i) { + for(U8 i = 0; i < num_operands; i += 1) + { U64 operand = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &operand); } - } else { + } + else + { error = 1; goto exit; } } - } break; + }break; - //- Standard opcodes - - case DW_StdOpcode_Copy: { + //- standard opcodes + case DW_StdOpcode_Copy: + { if(vm_state.is_stmt) { dw_push_line(arena, &result, &vm_state, end_of_seq); @@ -2912,68 +2915,69 @@ dw_parsed_line_table_from_data(Arena *arena, vm_state.basic_block = 0; vm_state.prologue_end = 0; vm_state.epilogue_begin = 0; - } break; - - case DW_StdOpcode_AdvancePc: { + }break; + case DW_StdOpcode_AdvancePc: + { U64 advance = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &advance); dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst); - } break; - - case DW_StdOpcode_AdvanceLine: { + }break; + case DW_StdOpcode_AdvanceLine: + { S64 s = 0; unit_cursor += str8_deserial_read_sleb128(unit_data, unit_cursor, &s); vm_state.line += s; - } break; - - case DW_StdOpcode_SetFile: { + }break; + case DW_StdOpcode_SetFile: + { U64 file_index = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &file_index); vm_state.file_index = file_index; - } break; - - case DW_StdOpcode_SetColumn: { + }break; + case DW_StdOpcode_SetColumn: + { U64 column = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &column); vm_state.column = column; - } break; - - case DW_StdOpcode_NegateStmt: { + }break; + case DW_StdOpcode_NegateStmt: + { vm_state.is_stmt = !vm_state.is_stmt; - } break; - - case DW_StdOpcode_SetBasicBlock: { + }break; + case DW_StdOpcode_SetBasicBlock: + { vm_state.basic_block = 1; - } break; - - case DW_StdOpcode_ConstAddPc: { + }break; + case DW_StdOpcode_ConstAddPc: + { U64 advance = (0xffu - vm_header.opcode_base) / vm_header.line_range; dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst); - } break; - - case DW_StdOpcode_FixedAdvancePc: { + }break; + case DW_StdOpcode_FixedAdvancePc: + { U16 operand = 0; unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &operand); vm_state.address += operand; vm_state.op_index = 0; - } break; - - case DW_StdOpcode_SetPrologueEnd: { + }break; + case DW_StdOpcode_SetPrologueEnd: + { vm_state.prologue_end = 1; - } break; - - case DW_StdOpcode_SetEpilogueBegin: { + }break; + case DW_StdOpcode_SetEpilogueBegin: + { vm_state.epilogue_begin = 1; - } break; - - case DW_StdOpcode_SetIsa: { + }break; + case DW_StdOpcode_SetIsa: + { U64 v = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &v); vm_state.isa = v; - } break; + }break; - //- Extended opcodes - case DW_StdOpcode_ExtendedOpcode: { + //- extended opcodes + case DW_StdOpcode_ExtendedOpcode: + { U64 length = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &length); @@ -2981,8 +2985,12 @@ dw_parsed_line_table_from_data(Arena *arena, U8 extended_opcode = 0; unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &extended_opcode); - switch (extended_opcode) { - case DW_ExtOpcode_EndSequence: { + switch(extended_opcode) + { + default:{}break; + + case DW_ExtOpcode_EndSequence: + { vm_state.end_sequence = 1; if(vm_state.is_stmt) { @@ -2990,16 +2998,18 @@ dw_parsed_line_table_from_data(Arena *arena, } dw_line_vm_reset(&vm_state, vm_header.default_is_stmt); end_of_seq = 1; - } break; + }break; - case DW_ExtOpcode_SetAddress: { + case DW_ExtOpcode_SetAddress: + { U64 address = 0; unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, vm_header.address_size, vm_header.address_size); vm_state.address = address; vm_state.op_index = 0; - } break; + }break; - case DW_ExtOpcode_DefineFile: { + case DW_ExtOpcode_DefineFile: + { String8 file_name = {0}; U64 dir_index = 0; U64 modify_time = 0; @@ -3017,25 +3027,22 @@ dw_parsed_line_table_from_data(Arena *arena, // // See the DWARF V4 spec (June 10, 2010), page 122. error = 1; - AssertAlways(!"UNHANDLED DEFINE FILE!!!"); - } break; + // AssertAlways(!"UNHANDLED DEFINE FILE!!!"); + }break; - case DW_ExtOpcode_SetDiscriminator: { + case DW_ExtOpcode_SetDiscriminator: + { U64 v = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &v); vm_state.discriminator = v; - } break; - - default: break; + }break; } unit_cursor = extended_opl; - } break; + }break; } } - exit:; - return result; } @@ -3118,205 +3125,205 @@ dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data) DW_Expr expr = {0}; for (U64 cursor = 0; cursor < data.size; ) { U64 inst_start = cursor; - + DW_ExprOp opcode = 0; cursor += str8_deserial_read_struct(data, cursor, &opcode); DW_ExprOperand operands[4] = {0}; switch (opcode) { - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { - // implicit operands - } break; - case DW_ExprOp_Const1U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); } break; - case DW_ExprOp_Const2U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); } break; - case DW_ExprOp_Const4U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); } break; - case DW_ExprOp_Const8U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_Const1S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s8); } break; - case DW_ExprOp_Const2S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); } break; - case DW_ExprOp_Const4S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s32); } break; - case DW_ExprOp_Const8S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s64); } break; - case DW_ExprOp_ConstU: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_ConstS: { cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); } break; - case DW_ExprOp_Addr: { cursor += str8_deserial_read(data, cursor, &operands[0].u64, addr_size, addr_size); } break; - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { - // implicit operands - } break; - case DW_ExprOp_RegX: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_ImplicitValue: { - U64 value_size = 0; String8 value = {0}; - cursor += str8_deserial_read_uleb128(data, cursor, &value_size); - cursor += str8_deserial_read_block(data, cursor, value_size, &operands[0].block); - } break; - case DW_ExprOp_Piece: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_BitPiece: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_Pick: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_PlusUConst: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_Skip: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); - } break; - case DW_ExprOp_Bra: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); - } break; - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { - cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); - } break; - case DW_ExprOp_BRegX: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); - } break; - case DW_ExprOp_FBReg: { - cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); - } break; - case DW_ExprOp_Deref: { - // no operands - } break; - case DW_ExprOp_DerefSize: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_XDerefSize: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_Call2: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); - } break; - case DW_ExprOp_Call4: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); - } break; - case DW_ExprOp_CallRef: { - cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); - } break; - case DW_ExprOp_ImplicitPointer: - case DW_ExprOp_GNU_ImplicitPointer: { - cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); - cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); - } break; - case DW_ExprOp_Convert: - case DW_ExprOp_GNU_Convert: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_GNU_ParameterRef: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); - } break; - case DW_ExprOp_DerefType: - case DW_ExprOp_GNU_DerefType: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_XDerefType: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_ConstType: - case DW_ExprOp_GNU_ConstType: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_struct(data, cursor, &operands[1].u8); - cursor += str8_deserial_read_block(data, cursor, operands[1].u8, &operands[2].block); - } break; - case DW_ExprOp_RegvalType: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: { - U64 entry_value_expr_size = 0; - cursor += str8_deserial_read_uleb128(data, cursor, &entry_value_expr_size); - cursor += str8_deserial_read_block(data, cursor, entry_value_expr_size, &operands[0].block); - } break; - case DW_ExprOp_Addrx: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_Constx: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_CallFrameCfa: - case DW_ExprOp_FormTlsAddress: - case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_Nop: - case DW_ExprOp_Eq: - case DW_ExprOp_Ge: - case DW_ExprOp_Gt: - case DW_ExprOp_Le: - case DW_ExprOp_Lt: - case DW_ExprOp_Ne: - case DW_ExprOp_Shl: - case DW_ExprOp_Shr: - case DW_ExprOp_Shra: - case DW_ExprOp_Xor: - case DW_ExprOp_XDeref: - case DW_ExprOp_Abs: - case DW_ExprOp_And: - case DW_ExprOp_Div: - case DW_ExprOp_Minus: - case DW_ExprOp_Mod: - case DW_ExprOp_Mul: - case DW_ExprOp_Neg: - case DW_ExprOp_Not: - case DW_ExprOp_Or: - case DW_ExprOp_Plus: - case DW_ExprOp_Rot: - case DW_ExprOp_Swap: - case DW_ExprOp_Dup: - case DW_ExprOp_Drop: - case DW_ExprOp_Over: - case DW_ExprOp_StackValue: - case DW_ExprOp_GNU_PushTlsAddress: { - // no operands - } break; - case DW_ExprOp_GNU_AddrIndex: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_GNU_ConstIndex: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - default: { InvalidPath; } break; + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { + // implicit operands + } break; + case DW_ExprOp_Const1U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); } break; + case DW_ExprOp_Const2U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); } break; + case DW_ExprOp_Const4U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); } break; + case DW_ExprOp_Const8U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u64); } break; + case DW_ExprOp_Const1S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s8); } break; + case DW_ExprOp_Const2S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); } break; + case DW_ExprOp_Const4S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s32); } break; + case DW_ExprOp_Const8S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s64); } break; + case DW_ExprOp_ConstU: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; + case DW_ExprOp_ConstS: { cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); } break; + case DW_ExprOp_Addr: { cursor += str8_deserial_read(data, cursor, &operands[0].u64, addr_size, addr_size); } break; + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { + // implicit operands + } break; + case DW_ExprOp_RegX: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; + case DW_ExprOp_ImplicitValue: { + U64 value_size = 0; String8 value = {0}; + cursor += str8_deserial_read_uleb128(data, cursor, &value_size); + cursor += str8_deserial_read_block(data, cursor, value_size, &operands[0].block); + } break; + case DW_ExprOp_Piece: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_BitPiece: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); + } break; + case DW_ExprOp_Pick: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + } break; + case DW_ExprOp_PlusUConst: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_Skip: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); + } break; + case DW_ExprOp_Bra: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); + } break; + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { + cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); + } break; + case DW_ExprOp_BRegX: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); + } break; + case DW_ExprOp_FBReg: { + cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); + } break; + case DW_ExprOp_Deref: { + // no operands + } break; + case DW_ExprOp_DerefSize: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + } break; + case DW_ExprOp_XDerefSize: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + } break; + case DW_ExprOp_Call2: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); + } break; + case DW_ExprOp_Call4: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); + } break; + case DW_ExprOp_CallRef: { + cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); + } break; + case DW_ExprOp_ImplicitPointer: + case DW_ExprOp_GNU_ImplicitPointer: { + cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); + cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); + } break; + case DW_ExprOp_Convert: + case DW_ExprOp_GNU_Convert: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_GNU_ParameterRef: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); + } break; + case DW_ExprOp_DerefType: + case DW_ExprOp_GNU_DerefType: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); + } break; + case DW_ExprOp_XDerefType: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); + } break; + case DW_ExprOp_ConstType: + case DW_ExprOp_GNU_ConstType: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + cursor += str8_deserial_read_struct(data, cursor, &operands[1].u8); + cursor += str8_deserial_read_block(data, cursor, operands[1].u8, &operands[2].block); + } break; + case DW_ExprOp_RegvalType: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); + } break; + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: { + U64 entry_value_expr_size = 0; + cursor += str8_deserial_read_uleb128(data, cursor, &entry_value_expr_size); + cursor += str8_deserial_read_block(data, cursor, entry_value_expr_size, &operands[0].block); + } break; + case DW_ExprOp_Addrx: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_Constx: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_CallFrameCfa: + case DW_ExprOp_FormTlsAddress: + case DW_ExprOp_PushObjectAddress: + case DW_ExprOp_Nop: + case DW_ExprOp_Eq: + case DW_ExprOp_Ge: + case DW_ExprOp_Gt: + case DW_ExprOp_Le: + case DW_ExprOp_Lt: + case DW_ExprOp_Ne: + case DW_ExprOp_Shl: + case DW_ExprOp_Shr: + case DW_ExprOp_Shra: + case DW_ExprOp_Xor: + case DW_ExprOp_XDeref: + case DW_ExprOp_Abs: + case DW_ExprOp_And: + case DW_ExprOp_Div: + case DW_ExprOp_Minus: + case DW_ExprOp_Mod: + case DW_ExprOp_Mul: + case DW_ExprOp_Neg: + case DW_ExprOp_Not: + case DW_ExprOp_Or: + case DW_ExprOp_Plus: + case DW_ExprOp_Rot: + case DW_ExprOp_Swap: + case DW_ExprOp_Dup: + case DW_ExprOp_Drop: + case DW_ExprOp_Over: + case DW_ExprOp_StackValue: + case DW_ExprOp_GNU_PushTlsAddress: { + // no operands + } break; + case DW_ExprOp_GNU_AddrIndex: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_GNU_ConstIndex: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + default: { InvalidPath; } break; } - + U64 operand_count = dw_operand_count_from_expr_op(opcode); DW_ExprInst *inst = push_array(arena, DW_ExprInst, 1); inst->opcode = opcode; inst->size = cursor - inst_start; inst->operands = push_array(arena, DW_ExprOperand, operand_count); MemoryCopy(inst->operands, operands, operand_count * sizeof(DW_ExprOperand)); - + DLLPushBack(expr.first, expr.last, inst); expr.count += 1; } @@ -3357,25 +3364,25 @@ dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc U32 first_four_bytes = 0; str8_deserial_read_struct(data, off, &first_four_bytes); DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - + U64 length = 0; U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); if (length_size == 0) { goto exit; } - + Rng1U64 entry_range = rng_1u64(off, off + length_size + length); String8 entry_data = str8_substr(data, entry_range); U64 id = 0; U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); if (id_size == 0) { goto exit; } - + U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64; desc_out->format = format; desc_out->type = (id == id_type) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; desc_out->entry_range = entry_range; desc_out->cie_pointer = id; desc_out->cie_pointer_off = length_size; - -exit:; + + exit:; return length + length_size; } @@ -3384,55 +3391,55 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - + U64 cie_id = 0; U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); if (cie_id_size == 0) { goto exit; } cursor += cie_id_size; - + U8 version = 0; U64 version_size = str8_deserial_read_struct(data, cursor, &version); if (version_size == 0) { goto exit; } cursor += version_size; - + String8 aug_string = {0}; U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); if (aug_string_size == 0) { goto exit; } cursor += aug_string_size; - + U8 address_size = 0; U8 segment_selector_size = 0; if (version >= DW_Version_4) { U64 address_size_size = str8_deserial_read_struct(data, cursor, &address_size); if (address_size_size == 0) { goto exit; } cursor += address_size_size; - + U64 segment_selector_size_size = str8_deserial_read_struct(data, cursor, &segment_selector_size); if (segment_selector_size_size == 0) { goto exit; } cursor += segment_selector_size; } else { address_size = byte_size_from_arch(arch); } - + U64 code_align_factor = 0; U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); if (code_align_factor_size == 0) { goto exit; } cursor += code_align_factor_size; - + S64 data_align_factor = 0; U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); if (data_align_factor_size == 0) { goto exit; } cursor += data_align_factor_size; - + U64 ret_addr_reg = 0; U64 ret_addr_reg_size = 0; if (version == DW_Version_1) { ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); } else { ret_addr_reg_size = str8_deserial_read_uleb128(data, cursor, &ret_addr_reg); } if (ret_addr_reg_size == 0) { goto exit; } cursor += ret_addr_reg_size; - + if (aug_string.size > 0) { goto exit; } - + cie_out->insts = str8_skip(data, cursor); cie_out->aug_string = aug_string; cie_out->code_align_factor = code_align_factor; @@ -3442,9 +3449,9 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) cie_out->version = version; cie_out->address_size = address_size; cie_out->segment_selector_size = segment_selector_size; - + is_parsed = 1; -exit:; + exit:; return is_parsed; } @@ -3453,37 +3460,37 @@ dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out) { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - + // extract CIE pointer U64 cie_pointer = 0; U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer); if (cie_pointer_size == 0) { goto exit; } cursor += cie_pointer_size; - + // extract address of first instruction U64 pc_begin = 0; U64 pc_begin_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin); if (pc_begin_size == 0) { goto exit; } cursor += pc_begin_size; - + // extract instruction range size U64 pc_range = 0; U64 pc_range_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_range); if (pc_range_size == 0) { goto exit; } cursor += pc_range_size; - + // parse augmentation data String8 aug_data = str8_substr(data, rng_1u64(cursor, cursor + cie->aug_data.size)); cursor += cie->aug_data.size; - + // commit values to out fde_out->format = format; fde_out->cie_pointer = cie_pointer; fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); fde_out->insts = str8_skip(data, cursor); - + is_parsed = 1; -exit:; + exit:; return is_parsed; } @@ -3509,30 +3516,30 @@ dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *f } } } - + return is_parsed; } internal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, - U64 code_align_factor, - S64 data_align_factor, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud, - U64 *bytes_read_out, - DW_CFA_Inst *inst_out) + U64 code_align_factor, + S64 data_align_factor, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud, + U64 *bytes_read_out, + DW_CFA_Inst *inst_out) { *bytes_read_out = 0; - + DW_CFA_ParseErrorCode error_code = DW_CFA_ParseErrorCode_End; U64 cursor = 0; - + // read opcode DW_CFA_Opcode raw_opcode = 0; U64 raw_opcode_size = str8_deserial_read_struct(data, cursor, &raw_opcode); if (raw_opcode_size == 0) { goto exit; } cursor += raw_opcode_size; - + // decode opcode implicit operand U64 opcode = raw_opcode & ~DW_CFA_Mask_OpcodeHi; U64 implicit_operand = 0; @@ -3540,262 +3547,262 @@ dw_parse_cfa_inst(String8 data, opcode = raw_opcode & DW_CFA_Mask_OpcodeHi; implicit_operand = raw_opcode & DW_CFA_Mask_Operand; } - + // decode operands DW_CFA_Operand operands[DW_CFA_OperandMax] = {0}; switch (opcode) { - case DW_CFA_SetLoc: { - U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64); - if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += address_size; - } break; - case DW_CFA_AdvanceLoc: { - operands[0].u64 = implicit_operand * code_align_factor; - } break; - case DW_CFA_AdvanceLoc1: { - U8 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_AdvanceLoc2: { - U16 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_AdvanceLoc4: { - U32 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_DefCfa: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].u64 = offset; - } break; - case DW_CFA_DefCfaSf: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].s64 = offset * data_align_factor; - } break; - case DW_CFA_DefCfaRegister: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_DefCfaOffset: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = offset; - } break; - case DW_CFA_DefCfaOffsetSf: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = offset * data_align_factor; - } break; - case DW_CFA_DefCfaExpr: { - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - - operands[0].block = expr; - cursor += expr_size; - } break; - case DW_CFA_Undefined: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_SameValue: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_Offset: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = implicit_operand; - operands[1].s64 = (S64)offset * data_align_factor; - } break; - case DW_CFA_OffsetExt: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].u64 = offset * data_align_factor; - } break; - case DW_CFA_OffsetExtSf: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].s64 = offset * data_align_factor; - } break; - case DW_CFA_ValOffset: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += val_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = val; - operands[1].u64 = offset * data_align_factor; - } break; - case DW_CFA_ValOffsetSf: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += val_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = val; - operands[1].s64 = offset; - } break; - case DW_CFA_Register: { - U64 dst_reg = 0; - U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg); - if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += dst_reg_size; - - U64 src_reg = 0; - U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg); - if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += src_reg_size; - - operands[0].u64 = dst_reg; - operands[1].u64 = src_reg; - } break; - case DW_CFA_Expr: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - cursor += expr_size; - - operands[0].u64 = reg; - operands[1].block = expr; - } break; - case DW_CFA_ValExpr: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { goto exit; } - cursor += val_size; - - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - cursor += expr_size; - - operands[0].u64 = val; - operands[1].block = expr; - } break; - case DW_CFA_Restore: { - operands[0].u64 = implicit_operand; - } break; - case DW_CFA_RestoreExt: {} break; - case DW_CFA_RememberState: {} break; - case DW_CFA_RestoreState: {} break; - case DW_CFA_Nop: {} break; - default: { NotImplemented; goto exit; } break; + case DW_CFA_SetLoc: { + U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64); + if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += address_size; + } break; + case DW_CFA_AdvanceLoc: { + operands[0].u64 = implicit_operand * code_align_factor; + } break; + case DW_CFA_AdvanceLoc1: { + U8 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_AdvanceLoc2: { + U16 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_AdvanceLoc4: { + U32 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_DefCfa: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].u64 = offset; + } break; + case DW_CFA_DefCfaSf: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].s64 = offset * data_align_factor; + } break; + case DW_CFA_DefCfaRegister: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_DefCfaOffset: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = offset; + } break; + case DW_CFA_DefCfaOffsetSf: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = offset * data_align_factor; + } break; + case DW_CFA_DefCfaExpr: { + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + + operands[0].block = expr; + cursor += expr_size; + } break; + case DW_CFA_Undefined: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_SameValue: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_Offset: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = implicit_operand; + operands[1].s64 = (S64)offset * data_align_factor; + } break; + case DW_CFA_OffsetExt: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].u64 = offset * data_align_factor; + } break; + case DW_CFA_OffsetExtSf: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].s64 = offset * data_align_factor; + } break; + case DW_CFA_ValOffset: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += val_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = val; + operands[1].u64 = offset * data_align_factor; + } break; + case DW_CFA_ValOffsetSf: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += val_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = val; + operands[1].s64 = offset; + } break; + case DW_CFA_Register: { + U64 dst_reg = 0; + U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg); + if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += dst_reg_size; + + U64 src_reg = 0; + U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg); + if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += src_reg_size; + + operands[0].u64 = dst_reg; + operands[1].u64 = src_reg; + } break; + case DW_CFA_Expr: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + cursor += expr_size; + + operands[0].u64 = reg; + operands[1].block = expr; + } break; + case DW_CFA_ValExpr: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { goto exit; } + cursor += val_size; + + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + cursor += expr_size; + + operands[0].u64 = val; + operands[1].block = expr; + } break; + case DW_CFA_Restore: { + operands[0].u64 = implicit_operand; + } break; + case DW_CFA_RestoreExt: {} break; + case DW_CFA_RememberState: {} break; + case DW_CFA_RestoreState: {} break; + case DW_CFA_Nop: {} break; + default: { NotImplemented; goto exit; } break; } - + // fill out output inst_out->opcode = opcode; MemoryCopyTyped(&inst_out->operands[0], &operands[0], DW_CFA_OperandMax); - + *bytes_read_out = cursor; - + error_code = DW_CFA_ParseErrorCode_NewInst; - -exit:; + + exit:; return error_code; } internal DW_CFA_InstList dw_parse_cfa_inst_list(Arena *arena, - String8 data, - U64 code_align_factor, - S64 data_align_factor, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud) + String8 data, + U64 code_align_factor, + S64 data_align_factor, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud) { U64 pos = arena_pos(arena); DW_CFA_InstList list = {0}; diff --git a/src/elf/elf.h b/src/elf/elf.h index a46413c3..2c15aa15 100644 --- a/src/elf/elf.h +++ b/src/elf/elf.h @@ -171,12 +171,12 @@ enum ELF_ShType_PreinitArray = 16, // Array of ptrs to finish functions ELF_ShType_Group = 17, // Array of ptrs to pre-init funcs ELF_ShType_SymtabShndx = 18, // Section contains a section group - + ELF_ShType_GNU_IncrementalInputs = 0x6fff4700, // Indices for SHN_XINDEX entries ELF_ShType_GNU_Attributes = 0x6ffffff5, // Incremental build data ELF_ShType_GNU_Hash = 0x6ffffff6, // Object attributes ELF_ShType_GNU_LibList = 0x6ffffff7, // GNU style symbol hash table - + ELF_ShType_SUNW_verdef = 0x6ffffffd, ELF_ShType_SUNW_verneed = 0x6ffffffe, // Versions defined by file ELF_ShType_SUNW_versym = 0x6fffffff, // Versions needed by file @@ -216,7 +216,7 @@ enum ELF_SectionIndex_MIPS_SUndefined = 0xff04, }; -typedef U32 ELF_SectionFlag; +typedef U32 ELF_SectionFlags; enum { ELF_Shf_Write = (1 << 0), diff --git a/src/rdi_from_coff/rdi_from_coff.c b/src/rdi_from_coff/rdi_from_coff.c index d10d1b25..04138605 100644 --- a/src/rdi_from_coff/rdi_from_coff.c +++ b/src/rdi_from_coff/rdi_from_coff.c @@ -58,14 +58,11 @@ c2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) internal RDIM_BinarySectionList c2r_rdi_binary_sections_from_coff_sections(Arena *arena, String8 image_data, String8 string_table, U64 sectab_count, COFF_SectionHeader *sectab) { - ProfBeginFunction(); - RDIM_BinarySectionList binary_sections = {0}; - - for (U64 isec = 0; isec < sectab_count; ++isec) { - COFF_SectionHeader *coff_sec = §ab[isec]; - RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections); - + for EachIndex(idx, sectab_count) + { + COFF_SectionHeader *coff_sec = §ab[idx]; + RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections); sec->name = coff_name_from_section_header(string_table, coff_sec); sec->flags = c2r_rdi_binary_section_flags_from_coff_section_flags(coff_sec->flags); sec->voff_first = coff_sec->voff; @@ -73,7 +70,5 @@ c2r_rdi_binary_sections_from_coff_sections(Arena *arena, String8 image_data, Str sec->foff_first = coff_sec->foff; sec->foff_opl = coff_sec->foff + coff_sec->fsize; } - - ProfEnd(); return binary_sections; } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index d5bdac94..263c584d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -45,7 +45,6 @@ d2r_rdi_language_from_dw_language(DW_Language v) switch(v) { default:{}break; - case DW_Language_C89: case DW_Language_C99: case DW_Language_C11: @@ -53,7 +52,6 @@ d2r_rdi_language_from_dw_language(DW_Language v) { result = RDI_Language_C; }break; - case DW_Language_CPlusPlus03: case DW_Language_CPlusPlus11: case DW_Language_CPlusPlus14: @@ -72,7 +70,7 @@ d2r_rdi_reg_code_from_dw_reg_x86(DW_RegX86 v) switch(v) { default:{}break; -#define X(reg_dw, val_dw, reg_rdi, ...) case DW_RegX86_##reg_dw: result = RDI_RegCodeX86_##reg_rdi; break; +#define X(reg_dw, val_dw, reg_rdi, ...) case DW_RegX86_##reg_dw:{result = RDI_RegCodeX86_##reg_rdi;}break; DW_Regs_X86_XList(X) #undef X } @@ -101,6 +99,7 @@ d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v) { default: case Arch_Null: + {}break; case Arch_x86:{result = d2r_rdi_reg_code_from_dw_reg_x86(v);}break; case Arch_x64:{result = d2r_rdi_reg_code_from_dw_reg_x64(v);}break; } @@ -257,6 +256,7 @@ d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input } //////////////////////////////// +//~ RDIM Bytecode Helpers internal B32 rdim_is_eval_bytecode_static(RDIM_EvalBytecode bc) @@ -1454,14 +1454,6 @@ d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Inp return loc; } -internal RDIM_Location * -d2r_location_from_attrib(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) -{ - String8 expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, kind); - RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, cu->address_size, arch, cu->addr_lu, cu, expr); - return location; -} - internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, @@ -1556,92 +1548,6 @@ d2r_var_locset_from_tag(Arena *arena, return locset; } -internal D2R_CompUnitContribMap -d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) -{ - Temp scratch = scratch_begin(&arena, 1); - - String8 aranges_data = input->sec[DW_Section_ARanges].data; - Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, aranges_data); - - D2R_CompUnitContribMap cm = {0}; - cm.count = 0; - cm.info_off_arr = push_array(arena, U64, unit_range_list.count); - cm.voff_range_arr = push_array(arena, RDIM_Rng1U64ChunkList, unit_range_list.count); - - for EachNode(range_n, Rng1U64Node, unit_range_list.first) { - String8 unit_data = str8_substr(aranges_data, range_n->v); - U64 unit_cursor = 0; - - U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length); - if (unit_length_size == 0) { continue; } - unit_cursor += unit_length_size; - - DW_Version version = 0; - U64 version_size = str8_deserial_read_struct(unit_data, unit_cursor, &version); - if (version_size == 0) { continue; } - unit_cursor += version; - - if (version != DW_Version_2) { - AssertAlways(!"unknown .debug_aranges version"); - continue; - } - - DW_Format unit_format = DW_FormatFromSize(unit_length); - U64 cu_info_off = 0; - U64 cu_info_off_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &cu_info_off); - if (cu_info_off_size == 0) { continue; } - unit_cursor += cu_info_off_size; - - U8 address_size = 0; - U64 address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &address_size); - if (address_size_size == 0) { continue; } - unit_cursor += address_size_size; - - U8 segment_selector_size = 0; - U64 segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &segment_selector_size); - if (segment_selector_size_size == 0) { continue; } - unit_cursor += segment_selector_size_size; - - U64 tuple_size = address_size * 2 + segment_selector_size; - U64 bytes_too_far_past_boundary = unit_cursor % tuple_size; - if (bytes_too_far_past_boundary > 0) { - unit_cursor += tuple_size - bytes_too_far_past_boundary; - } - - RDIM_Rng1U64ChunkList voff_ranges = {0}; - if (segment_selector_size == 0) { - while (unit_cursor + address_size * 2 <= unit_data.size) { - U64 address = 0; - U64 length = 0; - unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, address_size, address_size); - unit_cursor += str8_deserial_read(unit_data, unit_cursor, &length, address_size, address_size); - - if (address == 0 && length == 0) { break; } - if (address == 0) { continue; } - - // TODO: error handling - AssertAlways(address >= image_base); - - U64 min = address - image_base; - U64 max = min + length; - rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, (RDIM_Rng1U64){.min = min, .max = max}); - } - } else { - // TODO: segment relative addressing - NotImplemented; - } - - U64 map_idx = cm.count++; - cm.info_off_arr[map_idx] = cu_info_off; - cm.voff_range_arr[map_idx] = voff_ranges; - } - - scratch_end(scratch); - return cm; -} - //////////////////////////////// //~ rjf: Compilation Unit / Scope Conversion Helpers @@ -1688,7 +1594,7 @@ d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D } //////////////////////////////// -//~ rjf: Main Conversion Entry Point +//~ Tag Iterator internal D2R_TagIterator * d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) @@ -1758,6 +1664,9 @@ d2r_tag_iterator_parent_tag(D2R_TagIterator *iter) return tag_node->tag; } +//////////////////////////////// +//~ Type/UDT/Symbol Conversion + internal void d2r_flag_converted_tag(DW_TagNode *tag_node) { @@ -1823,28 +1732,37 @@ d2r_convert_types(Arena *arena, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { + for(D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); + it->tag_node != 0; + d2r_tag_iterator_next(scratch.arena, it)) + { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; // skip converted tags - if (d2r_is_tag_converted(tag_node)) { + if(d2r_is_tag_converted(tag_node)) + { d2r_tag_iterator_skip_children(it); continue; } + // mark the tag as converted here, because during conversion we may recurse on the same tag d2r_flag_converted_tag(tag_node); - switch (tag.kind) { - case DW_TagKind_ClassType: { + switch(tag.kind) + { + case DW_TagKind_ClassType: + { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { + if(is_decl) + { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_IncompleteClass; type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - Assert(!tag_node->first_child); d2r_tag_iterator_skip_children(it); - } else { + } + else + { RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1852,51 +1770,58 @@ d2r_convert_types(Arena *arena, type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); type->direct_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); } - } break; - case DW_TagKind_StructureType: { + }break; + + case DW_TagKind_StructureType: + { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { + if(is_decl) + { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteStruct; - - // TODO: error handling - Assert(!tag_node->first_child); d2r_tag_iterator_skip_children(it); - } else { + } + else + { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_Struct; type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); } - } break; - case DW_TagKind_UnionType: { + }break; + + case DW_TagKind_UnionType: + { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { + if(is_decl) + { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteUnion; - - // TODO: error handling - Assert(!tag_node->first_child); d2r_tag_iterator_skip_children(it); - } else { + } + else + { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_Union; type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); } - } break; - case DW_TagKind_EnumerationType: { + }break; + + case DW_TagKind_EnumerationType: + { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { + if(is_decl) + { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteEnum; - // TODO: error handling - Assert(!tag_node->first_child); d2r_tag_iterator_skip_children(it); - } else { + } + else + { RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1904,8 +1829,10 @@ d2r_convert_types(Arena *arena, type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); type->direct_type = enum_base_type; } - } break; - case DW_TagKind_SubroutineType: { + }break; + + case DW_TagKind_SubroutineType: + { RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); // collect parameters @@ -1931,8 +1858,10 @@ d2r_convert_types(Arena *arena, type->param_types = rdim_array_from_type_list(arena, param_list); d2r_tag_iterator_skip_children(it); - } break; - case DW_TagKind_Typedef: { + }break; + + case DW_TagKind_Typedef: + { RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Alias; @@ -1944,8 +1873,10 @@ d2r_convert_types(Arena *arena, break; } } - } break; - case DW_TagKind_BaseType: { + }break; + + case DW_TagKind_BaseType: + { DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); U64 byte_size = dw_byte_size_from_tag(input, cu, tag); @@ -2052,8 +1983,10 @@ d2r_convert_types(Arena *arena, type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->direct_type = type_table->builtin_types[kind]; type->byte_size = byte_size; - } break; - case DW_TagKind_PointerType: { + }break; + + case DW_TagKind_PointerType: + { RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); // TODO: @@ -2073,8 +2006,10 @@ d2r_convert_types(Arena *arena, type->kind = RDI_TypeKind_Ptr; type->byte_size = byte_size; type->direct_type = direct_type; - } break; - case DW_TagKind_RestrictType: { + }break; + + case DW_TagKind_RestrictType: + { // TODO: Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)); Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); @@ -2085,8 +2020,10 @@ d2r_convert_types(Arena *arena, type->byte_size = arch_addr_size; type->flags = RDI_TypeModifierFlag_Restrict; type->direct_type = direct_type; - } break; - case DW_TagKind_VolatileType: { + }break; + + case DW_TagKind_VolatileType: + { // TODO: Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); @@ -2096,8 +2033,10 @@ d2r_convert_types(Arena *arena, type->byte_size = arch_addr_size; type->flags = RDI_TypeModifierFlag_Volatile; type->direct_type = direct_type; - } break; - case DW_TagKind_ConstType: { + }break; + + case DW_TagKind_ConstType: + { // TODO: Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)); @@ -2108,8 +2047,10 @@ d2r_convert_types(Arena *arena, type->byte_size = arch_addr_size; type->flags = RDI_TypeModifierFlag_Const; type->direct_type = direct_type; - } break; - case DW_TagKind_ArrayType: { + }break; + + case DW_TagKind_ArrayType: + { // * DWARF vs RDI Array Type Graph * // // For example lets take following decl: @@ -2186,12 +2127,16 @@ d2r_convert_types(Arena *arena, } d2r_tag_iterator_skip_children(it); - } break; - case DW_TagKind_SubrangeType: { + }break; + + case DW_TagKind_SubrangeType: + { // TODO: error handling AssertAlways(!"unexpected tag"); - } break; - case DW_TagKind_Inheritance: { + }break; + + case DW_TagKind_Inheritance: + { DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind != DW_TagKind_StructureType && parent_tag.kind != DW_TagKind_ClassType) { // TODO: error handling @@ -2207,7 +2152,8 @@ d2r_convert_types(Arena *arena, member->type = type; member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); } - } break; + }break; + } } scratch_end(scratch); @@ -2312,28 +2258,26 @@ d2r_convert_udts(Arena *arena, } internal void -d2r_convert_symbols(Arena *arena, - D2R_TypeTable *type_table, - RDIM_Scope *global_scope, - DW_Input *input, - DW_CompUnit *cu, - DW_Language cu_lang, - U64 arch_addr_size, - U64 image_base, - Arch arch, - DW_TagNode *root) +d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { + for(D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); + it->tag_node != 0; + d2r_tag_iterator_next(scratch.arena, it)) + { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; - switch (tag.kind) { - case DW_TagKind_Null: { InvalidPath; } break; + switch(tag.kind) + { + case DW_TagKind_Null:{}break; + case DW_TagKind_ClassType: case DW_TagKind_StructureType: - case DW_TagKind_UnionType: { - // visit children to collect methods and variables - } break; + case DW_TagKind_UnionType: + { + // TODO(rjf): visit children to collect methods and variables + }break; + case DW_TagKind_EnumerationType: case DW_TagKind_SubroutineType: case DW_TagKind_Typedef: @@ -2346,15 +2290,19 @@ d2r_convert_symbols(Arena *arena, case DW_TagKind_SubrangeType: case DW_TagKind_Inheritance: case DW_TagKind_Enumerator: - case DW_TagKind_Member: { + case DW_TagKind_Member: + { d2r_tag_iterator_skip_children(it); - } break; - case DW_TagKind_SubProgram: { + }break; + + case DW_TagKind_SubProgram: + { DW_InlKind inl = DW_Inl_NotInlined; if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Inline)) { inl = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Inline); } - - switch (inl) { - case DW_Inl_NotInlined: { + switch(inl) + { + case DW_Inl_NotInlined: + { U64 param_count = 0; RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); @@ -2418,16 +2366,19 @@ d2r_convert_symbols(Arena *arena, } it->stack->scope = root_scope; - } break; + }break; case DW_Inl_DeclaredNotInlined: case DW_Inl_DeclaredInlined: - case DW_Inl_Inlined: { + case DW_Inl_Inlined: + { d2r_tag_iterator_skip_children(it); - } break; - default: InvalidPath; break; + }break; + default:{}break; } - } break; - case DW_TagKind_InlinedSubroutine: { + }break; + + case DW_TagKind_InlinedSubroutine: + { U64 param_count = 0; RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); @@ -2459,8 +2410,10 @@ d2r_convert_symbols(Arena *arena, Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); RDIM_Scope *root_scope = d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges); root_scope->inline_site = inline_site; - } break; - case DW_TagKind_Variable: { + }break; + + case DW_TagKind_Variable: + { String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); @@ -2520,8 +2473,10 @@ d2r_convert_symbols(Arena *arena, var->container_symbol = 0; var->container_type = 0; // TODO: NotImplemented; } - } break; - case DW_TagKind_FormalParameter: { + }break; + + case DW_TagKind_FormalParameter: + { DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) { RDIM_Scope *scope = it->stack->next->scope; @@ -2530,26 +2485,35 @@ d2r_convert_symbols(Arena *arena, param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); param->location_cases = d2r_var_locset_from_tag(arena, &scopes, scope, &locations, input, cu, image_base, arch, tag); - } else { - // TODO: error handling - AssertAlways(!"this is a local variable"); } - } break; - case DW_TagKind_LexicalBlock: { + else + { + // TODO: error handling; this is a local variable + } + }break; + + case DW_TagKind_LexicalBlock: + { DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind == DW_TagKind_SubProgram || - parent_tag.kind == DW_TagKind_InlinedSubroutine || - parent_tag.kind == DW_TagKind_LexicalBlock) { + if(parent_tag.kind == DW_TagKind_SubProgram || + parent_tag.kind == DW_TagKind_InlinedSubroutine || + parent_tag.kind == DW_TagKind_LexicalBlock) + { Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges); } - } break; - case DW_TagKind_CallSite: { + }break; + + case DW_TagKind_CallSite: + { // TODO - } break; - case DW_TagKind_CallSiteParameter: { + }break; + + case DW_TagKind_CallSiteParameter: + { // TODO - } break; + }break; + case DW_TagKind_Label: case DW_TagKind_CompileUnit: case DW_TagKind_UnspecifiedParameters: @@ -2557,9 +2521,11 @@ d2r_convert_symbols(Arena *arena, case DW_TagKind_ImportedDeclaration: case DW_TagKind_PtrToMemberType: case DW_TagKind_TemplateTypeParameter: - case DW_TagKind_ReferenceType: { - // TODO: - } break; + case DW_TagKind_ReferenceType: + { + // TODO + }break; + default: { // NotImplemented; @@ -2569,288 +2535,469 @@ d2r_convert_symbols(Arena *arena, scratch_end(scratch); } +//////////////////////////////// +//~ rjf: Main Conversion Entry Point + internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); - if (lane_idx() == 0) { - //////////////////////////////// - + if(lane_idx() == 0) + { + //////////////////////////// + //- rjf: compute exe hash + // ProfBegin("compute exe hash"); U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); ProfEnd(); - //////////////////////////////// - - Arch arch = Arch_Null; - U64 image_base = 0; - DW_Input input = {0}; + //////////////////////////// + //- rjf: unpack input image info + // + Arch arch = Arch_Null; + U64 image_base = 0; + DW_Input input = {0}; PathStyle path_style = PathStyle_Null; - - switch(params->exe_kind) { + switch(params->exe_kind) + { default:{}break; - case ExecutableImageKind_CoffPe: { - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); - String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); + case ExecutableImageKind_CoffPe: + { + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); + String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); - String8 string_table = str8_substr(params->exe_data, pe.string_table_range); - arch = pe.arch; - image_base = pe.image_base; + String8 string_table = str8_substr(params->exe_data, pe.string_table_range); + arch = pe.arch; + image_base = pe.image_base; binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); - input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); - path_style = PathStyle_WindowsAbsolute; - } break; + input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); + path_style = PathStyle_WindowsAbsolute; + }break; case ExecutableImageKind_Elf32: - case ExecutableImageKind_Elf64: { + case ExecutableImageKind_Elf64: + { ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data); - arch = arch_from_elf_machine(bin.hdr.e_machine); - image_base = bin.hdr.e_type == ELF_Type_Dyn ? 0 : elf_base_addr_from_bin(&bin); - binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); - input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); - path_style = PathStyle_UnixAbsolute; - } break; + arch = arch_from_elf_machine(bin.hdr.e_machine); + image_base = (bin.hdr.e_type == ELF_Type_Dyn ? 0 : elf_base_addr_from_bin(&bin)); + binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, params->dbg_data, &bin, bin.shdrs); + input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); + path_style = PathStyle_UnixAbsolute; + }break; + } + U64 arch_addr_size = rdi_addr_size_from_arch(arch); + + //////////////////////////// + //- rjf: determine acceptable address range + // + // in many cases, linkers seem to trample over addresses in various DWARF sections, + // potentially due to optimizations. we'd like to filter out those busted addresses + // from our final debug info - a good enough heuristic is to disqualify them by + // whether or not they actually fall into the ranges covered by the binary sections. + // + Rng1U64 acceptable_vaddr_range = {0}; + { + acceptable_vaddr_range.min = max_U64; + acceptable_vaddr_range.max = 0; + for EachNode(n, RDIM_BinarySectionNode, binary_sections.first) + { + acceptable_vaddr_range.min = Min(n->v.voff_first, acceptable_vaddr_range.min); + acceptable_vaddr_range.max = Max(n->v.voff_opl, acceptable_vaddr_range.max); + } } - //////////////////////////////// - + //////////////////////////// + //- rjf: unpack input image info + // top_level_info = rdim_make_top_level_info(params->exe_name, arch, exe_hash, binary_sections); - //////////////////////////////// - - U64 arch_addr_size = rdi_addr_size_from_arch(top_level_info.arch); - - //////////////////////////////// - + //////////////////////////// + //- rjf: build global scope + // RDIM_Scope *global_scope = rdim_scope_chunk_list_push(arena, &scopes, SCOPE_CHUNK_CAP); - //////////////////////////////// - - ProfBegin("Parse Unit Contrib Map"); + //////////////////////////// + //- rjf: parse unit contribution map + // D2R_CompUnitContribMap cu_contrib_map = {0}; - if (input.sec[DW_Section_ARanges].data.size) { - cu_contrib_map = d2r_cu_contrib_map_from_aranges(arena, &input, image_base); - } - ProfEnd(); - - ProfBegin("Parse Comop Unit Ranges"); - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); - Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input.sec[DW_Section_Info].data); - Rng1U64Array cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); - ProfEnd(); - - //////////////////////////////// - - ProfBegin("Parse Compile Unit Headers"); - // TODO(rjf): parse should always be relaxed. any verification checks we do - // should just be logged via log_info(...), and then the caller of this - // converter can collect those & display as necessary. - B32 is_parse_relaxed = 1; - DW_CompUnit *cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) { - cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, is_parse_relaxed); - } - ProfEnd(); - - //////////////////////////////// - - ProfBegin("Parse Line Tables"); - DW_LineTableParseResult *cu_line_tables = push_array(scratch.arena, DW_LineTableParseResult, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) { - DW_CompUnit *cu = &cu_arr[cu_idx]; - String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_StmtList); - String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); - String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); - cu_line_tables[cu_idx] = dw_parsed_line_table_from_data(scratch.arena, cu_stmt_list, &input, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu); - } - ProfEnd(); - - //////////////////////////////// - - ProfBegin("Convert Line Tables"); - HashTable *source_file_ht = hash_table_init(scratch.arena, 0x4000); - RDIM_LineTable **cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) { - cu_line_tables_rdi[cu_idx] = rdim_line_table_chunk_list_push(arena, &line_tables, LINE_TABLE_CAP); - - DW_LineTableParseResult *line_table = &cu_line_tables[cu_idx]; - DW_LineVMFileArray *dir_table = &line_table->vm_header.dir_table; - DW_LineVMFileArray *file_table = &line_table->vm_header.file_table; - RDIM_SrcFile **src_file_map = push_array(scratch.arena, RDIM_SrcFile *, file_table->count); - for EachIndex(file_idx, file_table->count) { - DW_LineFile *file = &file_table->v[file_idx]; - String8 file_path = dw_path_from_file_idx(scratch.arena, &line_table->vm_header, file_idx); - String8List file_path_split = str8_split_path(scratch.arena, file_path); - str8_path_list_resolve_dots_in_place(&file_path_split, path_style); - String8 file_path_resolved = str8_path_list_join_by_style(scratch.arena, &file_path_split, path_style); - RDIM_SrcFile *src_file = hash_table_search_path_raw(source_file_ht, file_path_resolved); - if (src_file == 0) { - src_file = rdim_src_file_chunk_list_push(arena, &src_files, SRC_FILE_CAP); - src_file->path = push_str8_copy(arena, file_path_resolved); - hash_table_push_path_raw(scratch.arena, source_file_ht, src_file->path, src_file); + ProfScope("parse unit contribution map") + { + String8 aranges_data = input.sec[DW_Section_ARanges].data; + if(aranges_data.size != 0) + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: unpack input + Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, aranges_data); + + //- rjf: set up map + cu_contrib_map.info_off_arr = push_array(arena, U64, unit_range_list.count); + cu_contrib_map.voff_range_arr = push_array(arena, RDIM_Rng1U64ChunkList, unit_range_list.count); + + //- rjf: convert all units + for EachNode(range_n, Rng1U64Node, unit_range_list.first) + { + //- rjf: unpack unit + String8 unit_data = str8_substr(aranges_data, range_n->v); + U64 unit_cursor = 0; + + //- rjf: read unit data length + U64 unit_length = 0; + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length); + B32 unit_length_good = (unit_length_size != 0); + unit_cursor += unit_length_size; + DW_Format unit_format = DW_FormatFromSize(unit_length); + + //- rjf: read unit version + DW_Version version = 0; + U64 version_size = str8_deserial_read_struct(unit_data, unit_cursor, &version); + B32 version_good = (version_size != 0); + unit_cursor += version_size; + + //- rjf: parse section by version + switch(version) + { + //- rjf: unsupported versions + default: + { + log_infof("Unknown .debug_aranges version (%i).\n", version); + }break; + + //- rjf: version 2 + case DW_Version_2: + { + // rjf: unpack & read unit header info + U64 unit_info_off = 0; + U8 unit_address_size = 0; + U8 unit_segment_selector_size = 0; + B32 unit_good = 0; + { + U64 unit_info_off_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &unit_info_off); + unit_cursor += unit_info_off_size; + U64 unit_address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &unit_address_size); + unit_cursor += unit_address_size_size; + U64 unit_segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &unit_segment_selector_size); + unit_cursor += unit_segment_selector_size_size; + unit_good = (unit_info_off_size != 0 && unit_address_size_size != 0 && unit_segment_selector_size_size != 0); + } + U64 tuple_size = unit_address_size * 2 + unit_segment_selector_size; + + // rjf: align cursor to be divisible by the tuple size (see the February 13, 2017 spec) + { + U64 bytes_too_far_past_boundary = unit_cursor % tuple_size; + if(bytes_too_far_past_boundary > 0) + { + unit_cursor += tuple_size - bytes_too_far_past_boundary; + } + } + + // rjf: read all ranges + RDIM_Rng1U64ChunkList voff_ranges = {0}; + if(unit_segment_selector_size == 0) + { + for(;unit_cursor + unit_address_size*2 <= unit_data.size;) + { + U64 segment = 0; + U64 address = 0; + U64 length = 0; + unit_cursor += str8_deserial_read(unit_data, unit_cursor, &segment, unit_segment_selector_size, Max(unit_segment_selector_size, 1)); + unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, unit_address_size, unit_address_size); + unit_cursor += str8_deserial_read(unit_data, unit_cursor, &length, unit_address_size, unit_address_size); + if((segment != 0 || address != 0 || length != 0) && + (contains_1u64(acceptable_vaddr_range, address) || + contains_1u64(acceptable_vaddr_range, address + length))) + { + RDIM_Rng1U64 range = + { + address - image_base, + address - image_base + length, + }; + rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, range); + } + else + { + break; + } + } + } + else + { + log_infof("Segment-relative addressing detected in .debug_aranges; this is not currently supported.\n"); + } + + // rjf: store record + U64 map_idx = cu_contrib_map.count; + cu_contrib_map.info_off_arr[map_idx] = unit_info_off; + cu_contrib_map.voff_range_arr[map_idx] = voff_ranges; + cu_contrib_map.count += 1; + }break; + } } - src_file_map[file_idx] = src_file; + + scratch_end(scratch); } - - for EachNode(line_seq, DW_LineSeqNode, line_table->first_seq) { - if (line_seq->count == 0) { continue; } + } + + //////////////////////////// + //- rjf: parse list of comp units + // + DW_ListUnitInput lu_input = {0}; + ProfScope("parse list of comp units") + { + lu_input = dw_list_unit_input_from_input(scratch.arena, &input); + } + + //////////////////////////// + //- rjf: parse comp unit ranges + // + Rng1U64Array cu_ranges = {0}; + ProfScope("parse comp unit ranges") + { + Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input.sec[DW_Section_Info].data); + cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); + } + + //////////////////////////// + //- rjf: parse comp unit headers + // + DW_CompUnit *cu_arr = 0; + ProfScope("parse comp unit headers") + { + // TODO(rjf): parse should always be relaxed. any verification checks we do + // should just be logged via log_info(...), and then the caller of this + // converter can collect those & display as necessary. + B32 is_parse_relaxed = 1; + cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); + for EachIndex(cu_idx, cu_ranges.count) + { + cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, is_parse_relaxed); + } + } + + //////////////////////////// + //- rjf: parse line tables + // + DW_LineTableParseResult *cu_line_tables = push_array(scratch.arena, DW_LineTableParseResult, cu_ranges.count); + ProfScope("parse line tables") + { + for EachIndex(cu_idx, cu_ranges.count) + { + DW_CompUnit *cu = &cu_arr[cu_idx]; + String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_StmtList); + String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); + String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); + cu_line_tables[cu_idx] = dw_parsed_line_table_from_data(scratch.arena, cu_stmt_list, &input, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu); + } + } + + //////////////////////////// + //- rjf: convert line tables + // + RDIM_LineTable **cu_line_tables_rdi = 0; + ProfScope("convert line tables") + { + HashTable *source_file_ht = hash_table_init(scratch.arena, 0x4000); + cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); + for EachIndex(cu_idx, cu_ranges.count) + { + cu_line_tables_rdi[cu_idx] = rdim_line_table_chunk_list_push(arena, &line_tables, LINE_TABLE_CAP); - U64 *voffs = push_array(arena, U64, line_seq->count); - U32 *line_nums = push_array(arena, U32, line_seq->count); - U16 *col_nums = 0; - U64 line_idx = 0; + DW_LineTableParseResult *line_table = &cu_line_tables[cu_idx]; + DW_LineVMFileArray *dir_table = &line_table->vm_header.dir_table; + DW_LineVMFileArray *file_table = &line_table->vm_header.file_table; + RDIM_SrcFile **src_file_map = push_array(scratch.arena, RDIM_SrcFile *, file_table->count); + for EachIndex(file_idx, file_table->count) + { + DW_LineFile *file = &file_table->v[file_idx]; + String8 file_path = dw_path_from_file_idx(scratch.arena, &line_table->vm_header, file_idx); + String8List file_path_split = str8_split_path(scratch.arena, file_path); + str8_path_list_resolve_dots_in_place(&file_path_split, path_style); + String8 file_path_resolved = str8_path_list_join_by_style(scratch.arena, &file_path_split, path_style); + RDIM_SrcFile *src_file = hash_table_search_path_raw(source_file_ht, file_path_resolved); + if(src_file == 0) + { + src_file = rdim_src_file_chunk_list_push(arena, &src_files, SRC_FILE_CAP); + src_file->path = push_str8_copy(arena, file_path_resolved); + hash_table_push_path_raw(scratch.arena, source_file_ht, src_file->path, src_file); + } + src_file_map[file_idx] = src_file; + } - DW_LineNode *file_line_n = line_seq->first; - U64 file_line_count = 0; - - for EachNode(line_n, DW_LineNode, file_line_n) { - if (file_line_n->v.file_index != line_n->v.file_index || line_n->next == 0) { + for EachNode(line_seq, DW_LineSeqNode, line_table->first_seq) + { + if(line_seq->count == 0) {continue;} + + U64 *voffs = push_array(arena, U64, line_seq->count); + U32 *line_nums = push_array(arena, U32, line_seq->count); + U16 *col_nums = 0; + U64 line_idx = 0; + + DW_LineNode *file_line_n = line_seq->first; + U64 file_line_count = 0; + + for EachNode(line_n, DW_LineNode, file_line_n) + { + if(file_line_n->v.file_index != line_n->v.file_index || line_n->next == 0) + { + U64 file_index = file_line_n->v.file_index; + U64 *file_voffs = &voffs[line_idx]; + U32 *file_line_nums = &line_nums[line_idx]; + U16 *file_col_nums = 0; + + U64 lines_written = 0; + U64 prev_ln = max_U64; + DW_LineNode *sentinel = line_n->v.file_index != file_line_n->v.file_index ? line_n : 0; + for(; file_line_n != sentinel; file_line_n = file_line_n->next) + { + if(file_line_n->v.line != prev_ln) + { + if(file_line_n->v.address == 0) {continue;} + + voffs[line_idx] = file_line_n->v.address; + line_nums[line_idx] = file_line_n->v.line; + + lines_written += 1; + line_idx += 1; + + prev_ln = file_line_n->v.line; + } + } + + RDIM_SrcFile *src_file = src_file_map[file_index]; + RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, lines_written); + rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); + + file_line_count = 1; + } + else + { + file_line_count += 1; + } + } + + // handle last line + if(file_line_n) + { U64 file_index = file_line_n->v.file_index; U64 *file_voffs = &voffs[line_idx]; U32 *file_line_nums = &line_nums[line_idx]; U16 *file_col_nums = 0; - - U64 lines_written = 0; - U64 prev_ln = max_U64; - DW_LineNode *sentinel = line_n->v.file_index != file_line_n->v.file_index ? line_n : 0; - for (; file_line_n != sentinel; file_line_n = file_line_n->next) { - if (file_line_n->v.line != prev_ln) { - if (file_line_n->v.address == 0) { continue; } - - voffs[line_idx] = file_line_n->v.address - image_base; - line_nums[line_idx] = file_line_n->v.line; - - ++lines_written; - ++line_idx; - - prev_ln = file_line_n->v.line; - } + for(;file_line_n != 0; file_line_n = file_line_n->next, line_idx += 1) + { + // NOTE(rjf): DWARF encodes line info as "relocatable addresses"; we do *not* + // need to translate from 'addresses' to 'voffs' with the image base here. + voffs[line_idx] = file_line_n->v.address; + line_nums[line_idx] = file_line_n->v.line; } - RDIM_SrcFile *src_file = src_file_map[file_index]; - RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, lines_written); + RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count); rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); - - file_line_count = 1; - } else { - file_line_count += 1; - } - } - - // handle last line - if (file_line_n) { - U64 file_index = file_line_n->v.file_index; - U64 *file_voffs = &voffs[line_idx]; - U32 *file_line_nums = &line_nums[line_idx]; - U16 *file_col_nums = 0; - - for (; file_line_n != 0; file_line_n = file_line_n->next, line_idx += 1) { - // TODO: error handling - AssertAlways(file_line_n->v.address >= image_base); - voffs[line_idx] = file_line_n->v.address - image_base; - line_nums[line_idx] = file_line_n->v.line; } - RDIM_SrcFile *src_file = src_file_map[file_index]; - RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count); - rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); + //Assert(line_idx == line_seq->count); } - - //Assert(line_idx == line_seq->count); } } - ProfEnd(); - - //////////////////////////////// + //////////////////////////// + //- rjf: build built-in basic types + // RDIM_Type *builtin_types[RDI_TypeKind_Count] = {0}; - for (RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) { - RDIM_Type *type = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); - type->kind = type_kind; - type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); - type->byte_size = rdi_size_from_basic_type_kind(type_kind); - builtin_types[type_kind] = type; - } - builtin_types[RDI_TypeKind_Void]->byte_size = arch_addr_size; - builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size; - - builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); - builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; - - //////////////////////////////// - - ProfBegin("Convert Units"); - for EachIndex(cu_idx, cu_ranges.count) { - Temp comp_temp = temp_begin(scratch.arena); - - DW_CompUnit *cu = &cu_arr[cu_idx]; - - // parse and build tag tree - DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu); - - // skip DWO + ProfScope("build built-in basic types") + { + for(RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) { - if (cu->dwo_id) { goto next_cu; } - - String8 dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_DwoName); - if (dwo_name.size) { goto next_cu; } - - String8 gnu_dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_GNU_DwoName); - if (gnu_dwo_name.size) { goto next_cu; } + RDIM_Type *type = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); + type->kind = type_kind; + type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); + type->byte_size = rdi_size_from_basic_type_kind(type_kind); + builtin_types[type_kind] = type; } - - // build (info offset -> tag) hash table to resolve tags with abstract origin - cu->tag_ht = dw_make_tag_hash_table(comp_temp.arena, tag_tree); - - // extract compile unit info - String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); - String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); - String8 cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer); - DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language); - - // init type table - D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); - type_table->ht = hash_table_init(comp_temp.arena, 0x4000); - type_table->types = &types; - type_table->type_chunk_cap = TYPE_CHUNK_CAP; - type_table->builtin_types = builtin_types; - - // convert debug info - d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); - d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); - d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root); - - RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; - if (cu_idx < cu_contrib_map.count) { - cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); - } else { - Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); - for EachNode(n, Rng1U64Node, range_list.first) { - rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); + builtin_types[RDI_TypeKind_Void]->byte_size = arch_addr_size; + builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size; + builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); + builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; + } + + //////////////////////////// + //- rjf: convert units + // + ProfScope("convert units") + { + for EachIndex(cu_idx, cu_ranges.count) + { + Temp comp_temp = temp_begin(scratch.arena); + + DW_CompUnit *cu = &cu_arr[cu_idx]; + + // parse and build tag tree + DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu); + + // skip DWO + { + if (cu->dwo_id) { goto next_cu; } + + String8 dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_DwoName); + if (dwo_name.size) { goto next_cu; } + + String8 gnu_dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_GNU_DwoName); + if (gnu_dwo_name.size) { goto next_cu; } } + + // build (info offset -> tag) hash table to resolve tags with abstract origin + cu->tag_ht = dw_make_tag_hash_table(comp_temp.arena, tag_tree); + + // extract compile unit info + String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); + String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); + String8 cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer); + DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language); + + // init type table + D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); + type_table->ht = hash_table_init(comp_temp.arena, 0x4000); + type_table->types = &types; + type_table->type_chunk_cap = TYPE_CHUNK_CAP; + type_table->builtin_types = builtin_types; + + // convert debug info + d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); + d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); + d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root); + + RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; + if(cu_idx < cu_contrib_map.count) + { + cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); + } + else + { + Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); + for EachNode(n, Rng1U64Node, range_list.first) + { + rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); + } + } + + // convert compile unit + { + RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &units, UNIT_CHUNK_CAP); + unit->unit_name = cu_name; + unit->compiler_name = cu_prod; + unit->source_file = str8_zero(); // TODO + unit->object_file = str8_zero(); // TODO + unit->archive_file = str8_zero(); // TODO + unit->build_path = cu_dir; + unit->language = d2r_rdi_language_from_dw_language(cu_lang); + unit->line_table = cu_line_tables_rdi[cu_idx]; + unit->voff_ranges = cu_voff_ranges; + } + + next_cu:; + temp_end(comp_temp); } - - // convert compile unit - { - RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &units, UNIT_CHUNK_CAP); - unit->unit_name = cu_name; - unit->compiler_name = cu_prod; - unit->source_file = str8_zero(); // TODO - unit->object_file = str8_zero(); // TODO - unit->archive_file = str8_zero(); // TODO - unit->build_path = cu_dir; - unit->language = d2r_rdi_language_from_dw_language(cu_lang); - unit->line_table = cu_line_tables_rdi[cu_idx]; - unit->voff_ranges = cu_voff_ranges; - } - - next_cu:; - temp_end(comp_temp); } - ProfEnd(); } - lane_sync(); - RDIM_BakeParams bake_params = {0}; bake_params.subset_flags = params->subset_flags; bake_params.top_level_info = top_level_info; @@ -2866,7 +3013,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) bake_params.procedures = procs; bake_params.scopes = scopes; bake_params.inline_sites = inline_sites; - scratch_end(scratch); return bake_params; } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 5b297184..100bd174 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -1,7 +1,11 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#pragma once +#ifndef RDI_FROM_DWARF_H +#define RDI_FROM_DWARF_H + +//////////////////////////////// +//~ rjf: Conversion Stage Inputs typedef struct D2R_ConvertParams D2R_ConvertParams; struct D2R_ConvertParams @@ -15,6 +19,9 @@ struct D2R_ConvertParams B32 deterministic; }; +//////////////////////////////// +//~ rjf: Conversion Helper Types + typedef struct D2R_TypeTable { HashTable *ht; @@ -76,7 +83,7 @@ typedef enum D2R_ValueType typedef struct D2R_ValueTypeNode { D2R_ValueType type; - + struct D2R_ValueTypeNode *next; } D2R_ValueTypeNode; @@ -104,9 +111,6 @@ internal RDIM_Type * d2r_type_from_offset(D2R_TypeTable *type_table, U64 i internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); -internal RDI_TypeKind d2r_unsigned_type_kind_from_size(U64 byte_size); -internal RDI_TypeKind d2r_signed_type_kind_from_size(U64 byte_size); -internal RDI_EvalTypeGroup d2r_type_group_from_type_kind(RDI_TypeKind x); //////////////////////////////// //~ RDIM Bytecode Helpers @@ -134,15 +138,14 @@ internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack * internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); internal RDIM_Location * d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); -internal RDIM_Location * d2r_location_from_attrib(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); internal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); //////////////////////////////// //~ rjf: Compilation Unit / Scope Conversion Helpers -internal D2R_CompUnitContribMap d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base); -internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); +internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); +internal RDIM_Scope *d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges); //////////////////////////////// //~ Tag Iterator @@ -159,6 +162,8 @@ internal DW_Tag d2r_tag_iterator_parent_tag(D2R_TagIterator *iter); internal void d2r_flag_converted_tag(DW_TagNode *tag_node); internal B8 d2r_is_tag_converted(DW_TagNode *tag_node); +internal RDIM_Type *d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind); + internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); @@ -167,3 +172,5 @@ internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_ //~ rjf: Main Conversion Entry Point internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params); + +#endif // RDI_FROM_DWARF_H diff --git a/src/rdi_from_elf/rdi_from_elf.c b/src/rdi_from_elf/rdi_from_elf.c index ccbb1351..eb85fa89 100644 --- a/src/rdi_from_elf/rdi_from_elf.c +++ b/src/rdi_from_elf/rdi_from_elf.c @@ -1,9 +1,36 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal RDIM_BinarySectionList -e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, ELF_Shdr64Array shdrs) +internal RDI_BinarySectionFlags +e2r_rdi_binary_section_flags_from_elf(ELF_SectionFlags f) { + RDI_BinarySectionFlags result = RDI_BinarySectionFlag_Read; + if(f & ELF_Shf_Write) + { + result |= RDI_BinarySectionFlag_Write; + } + if(f & ELF_Shf_ExecInstr) + { + result |= RDI_BinarySectionFlag_Execute; + } + return result; +} + +internal RDIM_BinarySectionList +e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_Bin *bin, ELF_Shdr64Array shdrs) +{ RDIM_BinarySectionList result = {0}; + U64 base_vaddr = elf_base_addr_from_bin(bin); + for EachIndex(idx, shdrs.count) + { + ELF_Shdr64 *src = &shdrs.v[idx]; + RDIM_BinarySection *dst = rdim_binary_section_list_push(arena, &result); + dst->name = elf_name_from_shdr64(data, bin, src); + dst->flags = e2r_rdi_binary_section_flags_from_elf(src->sh_flags); + dst->voff_first = src->sh_addr - base_vaddr; + dst->voff_opl = dst->voff_first + src->sh_size; + dst->foff_first = src->sh_offset; + dst->foff_opl = dst->foff_first + src->sh_size; + } return result; } diff --git a/src/rdi_from_elf/rdi_from_elf.h b/src/rdi_from_elf/rdi_from_elf.h index 3d979c8f..2915e3eb 100644 --- a/src/rdi_from_elf/rdi_from_elf.h +++ b/src/rdi_from_elf/rdi_from_elf.h @@ -4,6 +4,7 @@ #ifndef RDI_FROM_ELF_H #define RDI_FROM_ELF_H -internal RDIM_BinarySectionList e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, ELF_Shdr64Array shdrs); +internal RDI_BinarySectionFlags e2r_rdi_binary_section_flags_from_elf(ELF_SectionFlags f); +internal RDIM_BinarySectionList e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_Bin *bin, ELF_Shdr64Array shdrs); #endif // RDI_FROM_ELF_H diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index 2f39dd91..97aa831b 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -5,7 +5,7 @@ #define RDI_FROM_PDB_H //////////////////////////////// -//~ rjf: Conversion Stage Inputs/Outputs +//~ rjf: Conversion Stage Inputs typedef struct P2R_ConvertParams P2R_ConvertParams; struct P2R_ConvertParams @@ -19,7 +19,7 @@ struct P2R_ConvertParams }; //////////////////////////////// -//~ rjf: Shared Conversion State +//~ rjf: Conversion Helper Types //- rjf: link name map (voff -> string) From 08642d2745da516387fa0f43639b7a8776a154b0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 10 Nov 2025 16:37:23 -0800 Subject: [PATCH 067/850] next checkpoint on dwarf cleanup --- src/base/base_core.h | 40 ++-- src/dwarf/dwarf.c | 142 ++++++------ src/dwarf/dwarf.h | 2 +- src/dwarf/dwarf_parse.c | 24 +- src/dwarf/dwarf_parse.h | 176 ++++++++------- src/rdi_from_dwarf/rdi_from_dwarf.c | 329 ++++++++++++++-------------- src/rdi_from_dwarf/rdi_from_dwarf.h | 47 ++-- src/rdi_make/rdi_make_local.c | 29 --- src/rdi_make/rdi_make_local.h | 1 - 9 files changed, 387 insertions(+), 403 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index a6f41da6..80ffc909 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -611,19 +611,19 @@ typedef enum Arch Arch_arm64, Arch_arm32, Arch_COUNT, -#if ARCH_X64 - Arch_CURRENT = Arch_x64, -#elif ARCH_X86 - Arch_CURRENT = Arch_x86, -#elif ARCH_ARM64 - Arch_CURRENT = Arch_arm64, -#elif ARCH_ARM32 - Arch_CURRENT = Arch_arm32, -#else - Arch_CURRENT = Arch_Null, -#endif } Arch; +#if ARCH_X64 +# define Arch_CURRENT Arch_x64 +#elif ARCH_X86 +# define Arch_CURRENT Arch_x86 +#elif ARCH_ARM64 +# define Arch_CURRENT Arch_arm64 +#elif ARCH_ARM32 +# define Arch_CURRENT Arch_arm32 +#else +# define Arch_CURRENT Arch_Null +#endif typedef enum Compiler { @@ -632,17 +632,17 @@ typedef enum Compiler Compiler_gcc, Compiler_clang, Compiler_COUNT, -#if COMPILER_MSVC - Compiler_CURRENT = Compiler_msvc, -#elif COMPILER_GCC - Compiler_CURRENT = Compiler_gcc, -#elif COMPILER_CLANG - Compiler_CURRENT = Compiler_clang, -#else - Compiler_CURRENT = Compiler_Null, -#endif } Compiler; +#if COMPILER_MSVC +# define Compiler_CURRENT Compiler_msvc +#elif COMPILER_GCC +# define Compiler_CURRENT Compiler_gcc +#elif COMPILER_CLANG +# define Compiler_CURRENT Compiler_clang +#else +# define Compiler_CURRENT Compiler_Null +#endif //////////////////////////////// //~ rjf: Text 2D Coordinates & Ranges diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 2b2f3966..e6fa63d0 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -73,10 +73,10 @@ internal U64 dw_reg_count_from_arch(Arch arch) { switch (arch) { - default: { NotImplemented; } // fall-through - case Arch_Null: return 0; - case Arch_x86: return DW_RegX86_Last; - case Arch_x64: return DW_RegX64_Last; + default: { NotImplemented; } // fall-through + case Arch_Null: return 0; + case Arch_x86: return DW_RegX86_Last; + case Arch_x64: return DW_RegX64_Last; } } @@ -98,10 +98,10 @@ internal U64 dw_sp_from_arch(Arch arch) { switch (arch) { - default: NotImplemented; - case Arch_Null: return 0; - case Arch_x86: return DW_RegX86_Esp; - case Arch_x64: return DW_RegX64_Rsp; + default: NotImplemented; + case Arch_Null: return 0; + case Arch_x86: return DW_RegX86_Esp; + case Arch_x64: return DW_RegX64_Rsp; } } @@ -278,58 +278,64 @@ internal B32 dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind) { DW_AttribClass compat_flags = dw_attrib_class_from_form_kind(ver, form_kind); - B32 are_compat = (attrib_class & compat_flags) != 0; + B32 are_compat = (attrib_class & compat_flags) != 0; return are_compat; } internal String8 dw_name_string_from_section_kind(DW_SectionKind k) { - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_L); + String8 result = {0}; + switch(k) + { +#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_L);}break; DW_SectionKind_XList(X) #undef X } - return str8_zero(); + return result; } internal String8 dw_mach_name_string_from_section_kind(DW_SectionKind k) { - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_M); + String8 result = {0}; + switch(k) + { +#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_M);}break; DW_SectionKind_XList(X) #undef X } - return str8_zero(); + return result; } internal String8 dw_dwo_name_string_from_section_kind(DW_SectionKind k) { - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_D); + String8 result = {0}; + switch(k) + { +#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_D);}break; DW_SectionKind_XList(X) #undef X } - return str8_zero(); + return result; } internal U64 dw_size_from_format(DW_Format format) { U64 result = 0; - switch (format) { - case DW_Format_Null: break; + switch(format) + { + default:{}break; case DW_Format_32Bit: result = 4; break; case DW_Format_64Bit: result = 8; break; - default: InvalidPath; break; } return result; } internal DW_AttribClass -dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib_kind, DW_FormKind form_kind) +dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib_kind, DW_FormKind form_kind) { // NOTE(rjf): DWARF's spec specifies two mappings: // (DW_AttribKind) => List(DW_AttribClass) @@ -340,14 +346,10 @@ dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKin DW_AttribClass attrib_class = dw_attrib_class_from_attrib(ver, ext, attrib_kind); DW_AttribClass form_class = dw_attrib_class_from_form_kind(ver, form_kind); - - if(relaxed) + if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null) { - if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null) - { - attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind); - form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind); - } + attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind); + form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind); } DW_AttribClass result = DW_AttribClass_Null; @@ -428,11 +430,11 @@ dw_operand_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _OPER_COUNT; DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) + DW_Expr_V4_XList(X) + DW_Expr_V5_XList(X) + DW_Expr_GNU_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -443,11 +445,11 @@ dw_pop_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _POP_COUNT; DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) + DW_Expr_V4_XList(X) + DW_Expr_V5_XList(X) + DW_Expr_GNU_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -458,11 +460,11 @@ dw_push_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _PUSH_COUNT; DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) + DW_Expr_V4_XList(X) + DW_Expr_V5_XList(X) + DW_Expr_GNU_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -474,7 +476,7 @@ dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode) #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return ArrayCount(t)-1; } DW_CFA_Kind_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -484,21 +486,21 @@ dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode) { B32 is_invalid = 0; switch (opcode) { - case DW_ExprOp_Addrx: - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: - case DW_ExprOp_ConstType: - case DW_ExprOp_Constx: - case DW_ExprOp_Convert: - case DW_ExprOp_DerefType: - case DW_ExprOp_RegvalType: - case DW_ExprOp_Reinterpret: - case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_CallFrameCfa: { - is_invalid = 1; - } break; - default: break; + case DW_ExprOp_Addrx: + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: + case DW_ExprOp_ConstType: + case DW_ExprOp_Constx: + case DW_ExprOp_Convert: + case DW_ExprOp_DerefType: + case DW_ExprOp_RegvalType: + case DW_ExprOp_Reinterpret: + case DW_ExprOp_PushObjectAddress: + case DW_ExprOp_CallFrameCfa: { + is_invalid = 1; + } break; + default: break; } return is_invalid; } @@ -508,14 +510,14 @@ dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode) { B32 is_new_row_op = 0; switch (opcode) { - case DW_CFA_SetLoc: - case DW_CFA_AdvanceLoc: - case DW_CFA_AdvanceLoc1: - case DW_CFA_AdvanceLoc2: - case DW_CFA_AdvanceLoc4: { - is_new_row_op = 1; - } break; - default: break; + case DW_CFA_SetLoc: + case DW_CFA_AdvanceLoc: + case DW_CFA_AdvanceLoc1: + case DW_CFA_AdvanceLoc2: + case DW_CFA_AdvanceLoc4: { + is_new_row_op = 1; + } break; + default: break; } return is_new_row_op; } @@ -527,7 +529,7 @@ dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode) #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return &t[0] + 1; } DW_CFA_Kind_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -539,9 +541,9 @@ internal String8 dw_string_from_format(DW_Format format) { switch (format) { - case DW_Format_Null: return str8_zero(); - case DW_Format_32Bit: return str8_lit("DWARF32"); - case DW_Format_64Bit: return str8_lit("DWARF64"); + case DW_Format_Null: return str8_zero(); + case DW_Format_32Bit: return str8_lit("DWARF32"); + case DW_Format_64Bit: return str8_lit("DWARF64"); } return str8_zero(); } @@ -824,7 +826,7 @@ dw_string_from_cfa_opcode(DW_CFA_Opcode opcode) #define X(_NAME, _ID, ...) case _ID: return str8_lit(Stringify(_NAME)); DW_CFA_Kind_XList(X) #undef X - default: InvalidPath; break; + default: InvalidPath; break; } return str8_zero(); } diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 2fc8668f..b22e1623 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1782,7 +1782,7 @@ internal U64 dw_size_from_format(DW_Format format); //////////////////////////////// -internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib, DW_FormKind form_kind); +internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib, DW_FormKind form_kind); internal U64 dw_pick_default_lower_bound(DW_Language lang); diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 481b5eee..d4250e9c 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -1,13 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal U64 -dw_hash_from_string(String8 string) -{ - XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); - return hash64; -} - internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) { @@ -58,20 +51,16 @@ str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) U64 cursor = off; for(;;) { - U8 byte = 0; + U8 byte = 0; U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) { break; } - U8 val = byte & 0x7fu; value |= ((U64)val) << shift; - cursor += bytes_read; shift += 7u; - if((byte & 0x80u) == 0) { break; @@ -93,19 +82,16 @@ str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) U64 cursor = off; for(;;) { - U8 byte; + U8 byte = 0; U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); if(bytes_read != sizeof(byte)) { break; } - U8 val = byte & 0x7fu; value |= ((U64)val) << shift; - cursor += bytes_read; shift += 7u; - if((byte & 0x80u) == 0) { if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) @@ -1678,7 +1664,7 @@ dw_interp_loclists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) internal DW_AttribClass dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib) { - return dw_pick_attrib_value_class(cu->version, cu->ext, cu->relaxed, attrib->attrib_kind, attrib->form_kind); + return dw_pick_attrib_value_class(cu->version, cu->ext, attrib->attrib_kind, attrib->form_kind); } internal String8 @@ -2163,7 +2149,6 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form_kind, low_pc_attrib->form); // fill out compile unit - cu.relaxed = relaxed; cu.ext = DW_Ext_All; cu.kind = unit_kind; cu.version = version; @@ -3027,7 +3012,6 @@ dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, // // See the DWARF V4 spec (June 10, 2010), page 122. error = 1; - // AssertAlways(!"UNHANDLED DEFINE FILE!!!"); }break; case DW_ExtOpcode_SetDiscriminator: @@ -3103,7 +3087,7 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_Sect String8 string = {0}; cursor += str8_deserial_read_cstr(section_data, cursor, &string); - U64 hash = dw_hash_from_string(string); + U64 hash = u64_hash_from_str8(string); U64 bucket_idx = hash % names_table.size; DW_PubStringsBucket *bucket = push_array(arena, DW_PubStringsBucket, 1); diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index e6bd6cc6..d6bf466d 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -4,54 +4,59 @@ #ifndef DWARF_PARSE_H #define DWARF_PARSE_H -typedef struct DW_Section +typedef struct DW_Section DW_Section; +struct DW_Section { String8 name; String8 data; B32 is_dwo; -} DW_Section; +}; -typedef struct DW_Input +typedef struct DW_Input DW_Input; +struct DW_Input { DW_Section sec[DW_Section_Count]; DW_Section sup[DW_Section_Count]; -} DW_Input; +}; -typedef struct DW_ListUnit +typedef struct DW_ListUnit DW_ListUnit; +struct DW_ListUnit { DW_Version version; - U64 address_size; - U64 segment_selector_size; - U64 entry_size; - String8 entries; -} DW_ListUnit; + U64 address_size; + U64 segment_selector_size; + U64 entry_size; + String8 entries; +}; -typedef struct DW_ListUnitInput +typedef struct DW_ListUnitInput DW_ListUnitInput; +struct DW_ListUnitInput { - U64 addr_count; - U64 str_offset_count; - U64 rnglist_count; - U64 loclist_count; - Rng1U64Array addr_ranges; - Rng1U64Array str_offset_ranges; - Rng1U64Array rnglist_ranges; - Rng1U64Array loclist_ranges; - DW_ListUnit *addrs; - DW_ListUnit *str_offsets; - DW_ListUnit *rnglists; - DW_ListUnit *loclists; -} DW_ListUnitInput; + U64 addr_count; + U64 str_offset_count; + U64 rnglist_count; + U64 loclist_count; + Rng1U64Array addr_ranges; + Rng1U64Array str_offset_ranges; + Rng1U64Array rnglist_ranges; + Rng1U64Array loclist_ranges; + DW_ListUnit *addrs; + DW_ListUnit *str_offsets; + DW_ListUnit *rnglists; + DW_ListUnit *loclists; +}; -typedef struct DW_AbbrevTableEntry +typedef struct DW_AbbrevTableEntry DW_AbbrevTableEntry; +struct DW_AbbrevTableEntry { U64 id; U64 off; -} DW_AbbrevTableEntry; +}; typedef struct DW_AbbrevTable DW_AbbrevTable; struct DW_AbbrevTable { - U64 count; + U64 count; DW_AbbrevTableEntry *entries; }; @@ -63,7 +68,8 @@ typedef enum DW_AbbrevKind DW_Abbrev_AttribSequenceEnd, DW_Abbrev_DIEBegin, DW_Abbrev_DIEEnd, -} DW_AbbrevKind; +} +DW_AbbrevKind; typedef U32 DW_AbbrevFlags; enum @@ -72,14 +78,15 @@ enum DW_AbbrevFlag_HasChildren = (1 << 1), }; -typedef struct DW_Abbrev +typedef struct DW_Abbrev DW_Abbrev; +struct DW_Abbrev { - DW_AbbrevKind kind; - U64 sub_kind; - U64 id; - U64 const_value; + DW_AbbrevKind kind; + U64 sub_kind; + U64 id; + U64 const_value; DW_AbbrevFlags flags; -} DW_Abbrev; +}; typedef union DW_Form { @@ -100,71 +107,80 @@ typedef union DW_Form U64 rnglistx; U64 ptr; U64 implicit_const; -} DW_Form; +} +DW_Form; -typedef struct DW_Attrib +typedef struct DW_Attrib DW_Attrib; +struct DW_Attrib { - U64 info_off; - U64 abbrev_off; - U64 abbrev_id; - DW_AttribKind attrib_kind; - DW_FormKind form_kind; - DW_Form form; -} DW_Attrib; + U64 info_off; + U64 abbrev_off; + U64 abbrev_id; + DW_AttribKind attrib_kind; + DW_FormKind form_kind; + DW_Form form; +}; -typedef struct DW_AttribNode +typedef struct DW_AttribNode DW_AttribNode; +struct DW_AttribNode { - struct DW_AttribNode *next; - DW_Attrib v; -} DW_AttribNode; + DW_AttribNode *next; + DW_Attrib v; +}; -typedef struct DW_AttribList +typedef struct DW_AttribList DW_AttribList; +struct DW_AttribList { DW_AttribNode *first; DW_AttribNode *last; - U64 count; -} DW_AttribList; + U64 count; +}; -typedef struct DW_Tag +typedef struct DW_Tag DW_Tag; +struct DW_Tag { - B32 has_children; - U64 abbrev_id; - DW_TagKind kind; - DW_AttribList attribs; - U64 info_off; - U8 v[1]; -} DW_Tag; + B32 has_children; + U64 abbrev_id; + DW_TagKind kind; + DW_AttribList attribs; + U64 info_off; + U8 v[1]; +}; -typedef struct DW_TagNode +typedef struct DW_TagNode DW_TagNode; +struct DW_TagNode { - DW_Tag tag; - struct DW_TagNode *sibling; - struct DW_TagNode *first_child; - struct DW_TagNode *last_child; -} DW_TagNode; + DW_Tag tag; + DW_TagNode *sibling; + DW_TagNode *first_child; + DW_TagNode *last_child; +}; -typedef struct DW_Loc +typedef struct DW_Loc DW_Loc; +struct DW_Loc { Rng1U64 range; String8 expr; -} DW_Loc; +}; -typedef struct DW_LocNode +typedef struct DW_LocNode DW_LocNode; +struct DW_LocNode { - DW_Loc v; - struct DW_LocNode *next; -} DW_LocNode; + DW_LocNode *next; + DW_Loc v; +}; -typedef struct DW_LocList +typedef struct DW_LocList DW_LocList; +struct DW_LocList { - U64 count; DW_LocNode *first; DW_LocNode *last; -} DW_LocList; + U64 count; +}; -typedef struct DW_CompUnit +typedef struct DW_CompUnit DW_CompUnit; +struct DW_CompUnit { - B32 relaxed; DW_Ext ext; DW_CompUnitKind kind; DW_Version version; @@ -183,7 +199,7 @@ typedef struct DW_CompUnit U64 dwo_id; DW_Tag tag; HashTable *tag_ht; -} DW_CompUnit; +}; typedef struct DW_TagTree { @@ -328,12 +344,12 @@ typedef union DW_ExprOperand U16 u16; U32 u32; U64 u64; - + S8 s8; S16 s16; S32 s32; S64 s64; - + String8 block; } DW_ExprOperand; @@ -431,10 +447,6 @@ typedef struct DW_CFA_InstList #define DW_DECODE_PTR(name) U64 name(String8 data, void *ud, U64 *ptr_out) typedef DW_DECODE_PTR(DW_DecodePtr); -// hasher - -internal U64 dw_hash_from_string(String8 string); - // deserial helpers internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 263c584d..880de0b8 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1596,25 +1596,26 @@ d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D //////////////////////////////// //~ Tag Iterator -internal D2R_TagIterator * -d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) +internal D2R_TagIter * +d2r_tag_iter_init(Arena *arena, DW_TagNode *root) { - D2R_TagIterator *iter = push_array(arena, D2R_TagIterator, 1); - iter->free_list = 0; - iter->stack = push_array(arena, D2R_TagFrame, 1); - iter->stack->node = push_array(arena, DW_TagNode, 1); + D2R_TagIter *iter = push_array(arena, D2R_TagIter, 1); + iter->free_list = 0; + iter->stack = push_array(arena, D2R_TagFrame, 1); + iter->stack->node = push_array(arena, DW_TagNode, 1); if(root != 0) { - *iter->stack->node = *root; + *iter->stack->node = *root; } iter->stack->node->sibling = 0; - iter->visit_children = 1; - iter->tag_node = root; + iter->visit_children = 1; + iter->tag_node = root; + iter->root = root; return iter; } internal void -d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter) +d2r_tag_iter_next(Arena *arena, D2R_TagIter *iter) { // descend to first child if (iter->visit_children) { @@ -1643,24 +1644,30 @@ d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter) // update iterator iter->visit_children = 1; iter->tag_node = iter->stack ? iter->stack->node : 0; + + // rjf: exit on root + if(iter->tag_node == iter->root) + { + iter->tag_node = 0; + } } internal void -d2r_tag_iterator_skip_children(D2R_TagIterator *iter) +d2r_tag_iter_skip_children(D2R_TagIter *iter) { iter->visit_children = 0; } internal DW_TagNode * -d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter) +d2r_tag_iter_parent_tag_node(D2R_TagIter *iter) { return iter->stack->next->node; } internal DW_Tag -d2r_tag_iterator_parent_tag(D2R_TagIterator *iter) +d2r_tag_iter_parent_tag(D2R_TagIter *iter) { - DW_TagNode *tag_node = d2r_tag_iterator_parent_tag_node(iter); + DW_TagNode *tag_node = d2r_tag_iter_parent_tag_node(iter); return tag_node->tag; } @@ -1723,18 +1730,12 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *inpu } internal void -d2r_convert_types(Arena *arena, - D2R_TypeTable *type_table, - DW_Input *input, - DW_CompUnit *cu, - DW_Language cu_lang, - U64 arch_addr_size, - DW_TagNode *root) +d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - for(D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); + for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root); it->tag_node != 0; - d2r_tag_iterator_next(scratch.arena, it)) + d2r_tag_iter_next(scratch.arena, it)) { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; @@ -1742,7 +1743,7 @@ d2r_convert_types(Arena *arena, // skip converted tags if(d2r_is_tag_converted(tag_node)) { - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); continue; } @@ -1759,7 +1760,7 @@ d2r_convert_types(Arena *arena, RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_IncompleteClass; type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); } else { @@ -1780,7 +1781,7 @@ d2r_convert_types(Arena *arena, RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteStruct; - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); } else { @@ -1799,7 +1800,7 @@ d2r_convert_types(Arena *arena, RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteUnion; - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); } else { @@ -1818,7 +1819,7 @@ d2r_convert_types(Arena *arena, RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteEnum; - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); } else { @@ -1857,7 +1858,7 @@ d2r_convert_types(Arena *arena, type->count = param_list.count; type->param_types = rdim_array_from_type_list(arena, param_list); - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); }break; case DW_TagKind_Typedef: @@ -1877,107 +1878,92 @@ d2r_convert_types(Arena *arena, case DW_TagKind_BaseType: { - DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); - U64 byte_size = dw_byte_size_from_tag(input, cu, tag); + DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); + U64 byte_size = dw_byte_size_from_tag(input, cu, tag); - // convert base type encoding to RDI version + // rjf: attribute type encoding -> RDI type kind RDI_TypeKind kind = RDI_TypeKind_NULL; - switch (encoding) { - case DW_ATE_Null: kind = RDI_TypeKind_NULL; break; - case DW_ATE_Address: kind = RDI_TypeKind_Void; break; - case DW_ATE_Boolean: kind = RDI_TypeKind_Bool; break; - case DW_ATE_ComplexFloat: { - switch (byte_size) { - case 4: kind = RDI_TypeKind_ComplexF32; break; - case 8: kind = RDI_TypeKind_ComplexF64; break; - case 10: kind = RDI_TypeKind_ComplexF80; break; - case 16: kind = RDI_TypeKind_ComplexF128; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling - } - } break; - case DW_ATE_Float: { - switch (byte_size) { - case 2: kind = RDI_TypeKind_F16; break; - case 4: kind = RDI_TypeKind_F32; break; - case 6: kind = RDI_TypeKind_F48; break; - case 8: kind = RDI_TypeKind_F64; break; - case 16: kind = RDI_TypeKind_F128; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling - } - } break; - case DW_ATE_Signed: { - switch (byte_size) { - case 1: kind = RDI_TypeKind_S8; break; - case 2: kind = RDI_TypeKind_S16; break; - case 4: kind = RDI_TypeKind_S32; break; - case 8: kind = RDI_TypeKind_S64; break; - case 16: kind = RDI_TypeKind_S128; break; - case 32: kind = RDI_TypeKind_S256; break; - case 64: kind = RDI_TypeKind_S512; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling - } - } break; - case DW_ATE_SignedChar: { - switch (byte_size) { - case 1: kind = RDI_TypeKind_Char8; break; - case 2: kind = RDI_TypeKind_Char16; break; - case 4: kind = RDI_TypeKind_Char32; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling - } - } break; - case DW_ATE_Unsigned: { - switch (byte_size) { - case 1: kind = RDI_TypeKind_U8; break; - case 2: kind = RDI_TypeKind_U16; break; - case 4: kind = RDI_TypeKind_U32; break; - case 8: kind = RDI_TypeKind_U64; break; - case 16: kind = RDI_TypeKind_U128; break; - case 32: kind = RDI_TypeKind_U256; break; - case 64: kind = RDI_TypeKind_U512; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling - } - } break; - case DW_ATE_UnsignedChar: { - switch (byte_size) { - case 1: kind = RDI_TypeKind_UChar8; break; - case 2: kind = RDI_TypeKind_UChar16; break; - case 4: kind = RDI_TypeKind_UChar32; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling - } - } break; - case DW_ATE_ImaginaryFloat: { - NotImplemented; - } break; - case DW_ATE_PackedDecimal: { - NotImplemented; - } break; - case DW_ATE_NumericString: { - NotImplemented; - } break; - case DW_ATE_Edited: { - NotImplemented; - } break; - case DW_ATE_SignedFixed: { - NotImplemented; - } break; - case DW_ATE_UnsignedFixed: { - NotImplemented; - } break; - case DW_ATE_DecimalFloat: { - NotImplemented; - } break; - case DW_ATE_Utf: { - NotImplemented; - } break; - case DW_ATE_Ucs: { - NotImplemented; - } break; - case DW_ATE_Ascii: { - NotImplemented; - } break; - default: AssertAlways(!"unexpected base type encoding"); break; // TODO: error handling + switch(encoding) + { + default:{}break; + case DW_ATE_Null: {kind = RDI_TypeKind_NULL;}break; + case DW_ATE_Boolean: {kind = RDI_TypeKind_Bool;}break; + case DW_ATE_ComplexFloat: + switch(byte_size) + { + case 4: {kind = RDI_TypeKind_ComplexF32;}break; + case 8: {kind = RDI_TypeKind_ComplexF64;}break; + case 10: {kind = RDI_TypeKind_ComplexF80;}break; + case 16: {kind = RDI_TypeKind_ComplexF128;}break; + default: {log_infof("Unsupported complex float size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; + }break; + case DW_ATE_Float: + switch(byte_size) + { + case 2: {kind = RDI_TypeKind_F16; }break; + case 4: {kind = RDI_TypeKind_F32; }break; + case 6: {kind = RDI_TypeKind_F48; }break; + case 8: {kind = RDI_TypeKind_F64; }break; + case 16: {kind = RDI_TypeKind_F128;}break; + default: {log_infof("Unsupported float size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; + }break; + case DW_ATE_Signed: + switch(byte_size) + { + case 1: {kind = RDI_TypeKind_S8; }break; + case 2: {kind = RDI_TypeKind_S16; }break; + case 4: {kind = RDI_TypeKind_S32; }break; + case 8: {kind = RDI_TypeKind_S64; }break; + case 16: {kind = RDI_TypeKind_S128;}break; + case 32: {kind = RDI_TypeKind_S256;}break; + case 64: {kind = RDI_TypeKind_S512;}break; + default: {log_infof("Unsupported signed integer size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; + }break; + case DW_ATE_SignedChar: + switch(byte_size) + { + case 1: {kind = RDI_TypeKind_Char8; }break; + case 2: {kind = RDI_TypeKind_Char16;}break; + case 4: {kind = RDI_TypeKind_Char32;}break; + default:{log_infof("Unsupported signed character size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; + }break; + case DW_ATE_Address: + case DW_ATE_Unsigned: + switch(byte_size) + { + case 1: {kind = RDI_TypeKind_U8; }break; + case 2: {kind = RDI_TypeKind_U16; }break; + case 4: {kind = RDI_TypeKind_U32; }break; + case 8: {kind = RDI_TypeKind_U64; }break; + case 16: {kind = RDI_TypeKind_U128;}break; + case 32: {kind = RDI_TypeKind_U256;}break; + case 64: {kind = RDI_TypeKind_U512;}break; + default:{log_infof("Unsupported unsigned integer size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; + }break; + case DW_ATE_UnsignedChar: + switch(byte_size) + { + case 1: {kind = RDI_TypeKind_UChar8; }break; + case 2: {kind = RDI_TypeKind_UChar16;}break; + case 4: {kind = RDI_TypeKind_UChar32;}break; + default:{log_infof("Unsupported unsigned character size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; + }break; + case DW_ATE_ImaginaryFloat: + case DW_ATE_PackedDecimal: + case DW_ATE_NumericString: + case DW_ATE_Edited: + case DW_ATE_SignedFixed: + case DW_ATE_UnsignedFixed: + case DW_ATE_DecimalFloat: + case DW_ATE_Utf: + case DW_ATE_Ucs: + case DW_ATE_Ascii: + { + // TODO(rjf): not implemented + }break; } + // rjf: build RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Alias; type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1998,9 +1984,7 @@ d2r_convert_types(Arena *arena, Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass)); U64 byte_size = arch_addr_size; - if (cu->version == DW_Version_5 || cu->relaxed) { - dw_try_byte_size_from_tag(input, cu, tag, &byte_size); - } + dw_try_byte_size_from_tag(input, cu, tag, &byte_size); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Ptr; @@ -2126,7 +2110,7 @@ d2r_convert_types(Arena *arena, direct_type = t; } - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); }break; case DW_TagKind_SubrangeType: @@ -2137,7 +2121,7 @@ d2r_convert_types(Arena *arena, case DW_TagKind_Inheritance: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); if (parent_tag.kind != DW_TagKind_StructureType && parent_tag.kind != DW_TagKind_ClassType) { // TODO: error handling AssertAlways(!"unexpected parent tag"); @@ -2169,14 +2153,17 @@ d2r_convert_udts(Arena *arena, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { + for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root); + it->tag_node != 0; + d2r_tag_iter_next(scratch.arena, it)) + { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; switch (tag.kind) { case DW_TagKind_ClassType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); @@ -2187,7 +2174,7 @@ d2r_convert_udts(Arena *arena, case DW_TagKind_StructureType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); @@ -2198,7 +2185,7 @@ d2r_convert_udts(Arena *arena, case DW_TagKind_UnionType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); @@ -2209,7 +2196,7 @@ d2r_convert_udts(Arena *arena, case DW_TagKind_EnumerationType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); @@ -2218,7 +2205,7 @@ d2r_convert_udts(Arena *arena, } } break; case DW_TagKind_Member: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType || parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_UnionType; @@ -2241,7 +2228,7 @@ d2r_convert_udts(Arena *arena, } } break; case DW_TagKind_Enumerator: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); if (parent_tag.kind == DW_TagKind_EnumerationType) { RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &udts, parent_type->udt); @@ -2258,12 +2245,12 @@ d2r_convert_udts(Arena *arena, } internal void -d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root) +d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - for(D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); + for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root); it->tag_node != 0; - d2r_tag_iterator_next(scratch.arena, it)) + d2r_tag_iter_next(scratch.arena, it)) { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; @@ -2292,7 +2279,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_ case DW_TagKind_Enumerator: case DW_TagKind_Member: { - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); }break; case DW_TagKind_SubProgram: @@ -2345,7 +2332,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_ proc->location_cases = d2r_locset_from_attrib(arena, &scopes, root_scope, &locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); // sub program with user-defined parent tag is a method - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); if (parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_StructureType) { RDI_MemberKind member_kind = RDI_MemberKind_NULL; DW_VirtualityKind virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality); @@ -2371,7 +2358,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_ case DW_Inl_DeclaredInlined: case DW_Inl_Inlined: { - d2r_tag_iterator_skip_children(it); + d2r_tag_iter_skip_children(it); }break; default:{}break; } @@ -2417,7 +2404,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_ String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_LexicalBlock) { @@ -2477,7 +2464,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_ case DW_TagKind_FormalParameter: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) { RDIM_Scope *scope = it->stack->next->scope; RDIM_Local *param = rdim_scope_push_local(arena, &scopes, scope); @@ -2494,7 +2481,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_ case DW_TagKind_LexicalBlock: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); if(parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_LexicalBlock) @@ -2564,9 +2551,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) case ExecutableImageKind_CoffPe: { PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); - String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); + String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); - String8 string_table = str8_substr(params->exe_data, pe.string_table_range); + String8 string_table = str8_substr(params->exe_data, pe.string_table_range); arch = pe.arch; image_base = pe.image_base; binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); @@ -2608,12 +2595,38 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //////////////////////////// //- rjf: unpack input image info // - top_level_info = rdim_make_top_level_info(params->exe_name, arch, exe_hash, binary_sections); - - //////////////////////////// - //- rjf: build global scope - // - RDIM_Scope *global_scope = rdim_scope_chunk_list_push(arena, &scopes, SCOPE_CHUNK_CAP); + { + // rjf: base arch -> rdi + RDI_Arch arch_rdi = RDI_Arch_NULL; + switch(arch) + { + case Arch_Null: + case Arch_arm64: + case Arch_arm32: + case Arch_COUNT: + {}break; + case Arch_x64:{arch_rdi = RDI_Arch_X64;}break; + case Arch_x86:{arch_rdi = RDI_Arch_X86;}break; + } + + // rjf: binary sections -> voff max + U64 exe_voff_max = 0; + for EachNode(sect_n, RDIM_BinarySectionNode, binary_sections.first) + { + exe_voff_max = Max(exe_voff_max, sect_n->v.voff_opl); + } + + // rjf: fill + top_level_info.arch = arch_rdi; + top_level_info.exe_name = params->exe_name; + top_level_info.exe_hash = exe_hash; + top_level_info.voff_max = exe_voff_max; + if(!params->deterministic) + { + // TODO(rjf): top_level_info.guid = ...; + top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); + } + } //////////////////////////// //- rjf: parse unit contribution map @@ -2892,8 +2905,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count); rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); } - - //Assert(line_idx == line_seq->count); } } } @@ -2912,7 +2923,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) type->byte_size = rdi_size_from_basic_type_kind(type_kind); builtin_types[type_kind] = type; } - builtin_types[RDI_TypeKind_Void]->byte_size = arch_addr_size; builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size; builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; @@ -2962,7 +2972,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // convert debug info d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); - d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root); + d2r_convert_symbols(arena, type_table, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root); RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; if(cu_idx < cu_contrib_map.count) @@ -2996,6 +3006,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) temp_end(comp_temp); } } + } lane_sync(); RDIM_BakeParams bake_params = {0}; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 100bd174..57f5bf41 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -22,35 +22,40 @@ struct D2R_ConvertParams //////////////////////////////// //~ rjf: Conversion Helper Types -typedef struct D2R_TypeTable +typedef struct D2R_TypeTable D2R_TypeTable; +struct D2R_TypeTable { - HashTable *ht; + HashTable *ht; RDIM_TypeChunkList *types; - U64 type_chunk_cap; - RDIM_Type **builtin_types; -} D2R_TypeTable; + U64 type_chunk_cap; + RDIM_Type **builtin_types; +}; -typedef struct D2R_TagFrame +typedef struct D2R_TagFrame D2R_TagFrame; +struct D2R_TagFrame { DW_TagNode *node; RDIM_Scope *scope; struct D2R_TagFrame *next; -} D2R_TagFrame; +}; -typedef struct D2R_TagIterator +typedef struct D2R_TagIter D2R_TagIter; +struct D2R_TagIter { D2R_TagFrame *free_list; D2R_TagFrame *stack; - DW_TagNode *tag_node; - B32 visit_children; -} D2R_TagIterator; + DW_TagNode *tag_node; + DW_TagNode *root; + B32 visit_children; +}; -typedef struct D2R_CompUnitContribMap +typedef struct D2R_CompUnitContribMap D2R_CompUnitContribMap; +struct D2R_CompUnitContribMap { - U64 count; - U64 *info_off_arr; + U64 count; + U64 *info_off_arr; RDIM_Rng1U64ChunkList *voff_range_arr; -} D2R_CompUnitContribMap; +}; #define D2R_ValueType_IsSigned(x) ((x) == D2R_ValueType_S8 || (x) == D2R_ValueType_S16 || (x) == D2R_ValueType_S32 || (x) == D2R_ValueType_S64 || (x) == D2R_ValueType_S128 || (x) == D2R_ValueType_S256 || (x) == D2R_ValueType_S512) #define D2R_ValueType_IsUnsigned(x) ((x) == D2R_ValueType_U8 || (x) == D2R_ValueType_U16 || (x) == D2R_ValueType_U32 || (x) == D2R_ValueType_U64 || (x) == D2R_ValueType_U128 || (x) == D2R_ValueType_U256 || (x) == D2R_ValueType_U512) @@ -150,11 +155,11 @@ internal RDIM_Scope *d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U //////////////////////////////// //~ Tag Iterator -internal D2R_TagIterator * d2r_tag_iterator_init(Arena *arena, DW_TagNode *root); -internal void d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter); -internal void d2r_tag_iterator_skip_children(D2R_TagIterator *iter); -internal DW_TagNode * d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter); -internal DW_Tag d2r_tag_iterator_parent_tag(D2R_TagIterator *iter); +internal D2R_TagIter *d2r_tag_iter_init(Arena *arena, DW_TagNode *root); +internal void d2r_tag_iter_next(Arena *arena, D2R_TagIter *iter); +internal void d2r_tag_iter_skip_children(D2R_TagIter *iter); +internal DW_TagNode * d2r_tag_iter_parent_tag_node(D2R_TagIter *iter); +internal DW_Tag d2r_tag_iter_parent_tag(D2R_TagIter *iter); //////////////////////////////// //~ Type/UDT/Symbol Conversion @@ -166,7 +171,7 @@ internal RDIM_Type *d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_t internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); -internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); +internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); //////////////////////////////// //~ rjf: Main Conversion Entry Point diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 7d5ad140..554b1c5f 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -17,35 +17,6 @@ rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch) return data_model; } -internal RDIM_TopLevelInfo -rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections) -{ - // convert arch - RDI_Arch arch_rdi = RDI_Arch_NULL; - switch(arch) - { - default:{}break; - case Arch_x64:{arch_rdi = RDI_Arch_X64;}break; - case Arch_x86:{arch_rdi = RDI_Arch_X86;}break; - } - - // find max VOFF - U64 exe_voff_max = 0; - for EachNode(sect_n, RDIM_BinarySectionNode, sections.first) - { - exe_voff_max = Max(exe_voff_max, sect_n->v.voff_opl); - } - - // fill out top level info - RDIM_TopLevelInfo top_level_info = {0}; - top_level_info.arch = arch_rdi; - top_level_info.exe_hash = exe_hash; - top_level_info.voff_max = exe_voff_max; - top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); - - return top_level_info; -} - internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params) { diff --git a/src/rdi_make/rdi_make_local.h b/src/rdi_make/rdi_make_local.h index b7ed9ed9..b3d5da2e 100644 --- a/src/rdi_make/rdi_make_local.h +++ b/src/rdi_make/rdi_make_local.h @@ -161,7 +161,6 @@ struct RDIM_Shared global RDIM_Shared *rdim_shared = 0; internal RDIM_DataModel rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch); -internal RDIM_TopLevelInfo rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections); internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params); internal RDIM_SerializedSectionBundle rdim_compress(Arena *arena, RDIM_SerializedSectionBundle *in); From 17ec73d7524be16e1b5390ec9dbeafa67bcb9afb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 10 Nov 2025 17:41:01 -0800 Subject: [PATCH 068/850] dwarf cleanup checkpoint --- src/base/base_strings.c | 66 +++++++ src/base/base_strings.h | 2 + src/coff/coff_dump.c | 2 +- src/ctrl/ctrl_core.c | 194 +++++++++--------- src/dwarf/dwarf_coff.c | 15 +- src/dwarf/dwarf_coff.h | 3 +- src/dwarf/dwarf_dump.c | 37 ++-- src/dwarf/dwarf_dump.h | 22 +-- src/dwarf/dwarf_elf.c | 7 +- src/dwarf/dwarf_elf.h | 2 +- src/dwarf/dwarf_help.h | 1 - src/dwarf/dwarf_parse.c | 296 ++++++++-------------------- src/dwarf/dwarf_parse.h | 103 +++++----- src/dwarf/eh_dump.h | 5 +- src/dwarf/eh_frame.c | 272 ++++++++++++------------- src/dwarf/eh_frame.h | 7 +- src/radbin/radbin.c | 12 +- src/raddump/raddump.c | 6 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 42 ++-- src/rdi_from_dwarf/rdi_from_dwarf.h | 22 +-- 20 files changed, 524 insertions(+), 592 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 0728bedf..540e8a86 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -2838,6 +2838,72 @@ str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out) return block_out->size; } +internal U64 +str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) +{ + U64 value = 0; + U64 shift = 0; + U64 cursor = off; + for(;;) + { + U8 byte = 0; + U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); + if(bytes_read != sizeof(byte)) + { + break; + } + U8 val = byte & 0x7fu; + value |= ((U64)val) << shift; + cursor += bytes_read; + shift += 7u; + if((byte & 0x80u) == 0) + { + break; + } + } + if(value_out != 0) + { + *value_out = value; + } + U64 bytes_read = cursor - off; + return bytes_read; +} + +internal U64 +str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) +{ + U64 value = 0; + U64 shift = 0; + U64 cursor = off; + for(;;) + { + U8 byte = 0; + U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); + if(bytes_read != sizeof(byte)) + { + break; + } + U8 val = byte & 0x7fu; + value |= ((U64)val) << shift; + cursor += bytes_read; + shift += 7u; + if((byte & 0x80u) == 0) + { + if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) + { + value |= -(S64)(1ull << shift); + } + break; + } + } + if(value_out != 0) + { + *value_out = value; + } + U64 bytes_read = cursor - off; + return bytes_read; +} + //////////////////////////////// internal int diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 37c7acb2..65c17f1d 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -444,6 +444,8 @@ internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 of internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); #define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) #define str8_deserial_read_struct(string, off, ptr) str8_deserial_read_array(string, off, ptr, 1) +internal U64 str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out); +internal U64 str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out); //////////////////////////////// //~ rjf: Basic String Hashes diff --git a/src/coff/coff_dump.c b/src/coff/coff_dump.c index 2d74d087..e402bbcd 100644 --- a/src/coff/coff_dump.c +++ b/src/coff/coff_dump.c @@ -648,7 +648,7 @@ coff_print_obj(Arena *arena, String8List *out, String8 indent, String8 raw_data, } if (opts & RD_Option_Dwarf) { - DW_Input dwarf_input = dw_input_from_coff_section_table(scratch.arena, raw_data, raw_string_table, header->section_count, section_table); + DW_Raw dwarf_input = dw_raw_from_coff_section_table(scratch.arena, raw_data, raw_string_table, header->section_count, section_table); dw_format(arena, out, indent, opts, &dwarf_input, arch, ExecutableImageKind_CoffPe); } diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 49aaf22a..1faead8d 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1568,7 +1568,7 @@ ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle U64 current_reg_gen = ctrl_reg_gen(); B32 need_stale = 1; if(node->reg_gen != current_reg_gen && - dmn_thread_read_reg_block(handle.dmn_handle, result)) + dmn_thread_read_reg_block(handle.dmn_handle, result)) { if(node != 0) { @@ -1830,10 +1830,10 @@ internal DW_MEM_READ(ctrl_unwind_mem_read_dwarf_x64) { CTRL_MemoryReadContextDwarfX64 *ctx = ud; - + B32 is_stale = 0; B32 is_read = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + size), &is_stale, buffer, ctx->endt_us); - + DW_UnwindStatus status = DW_UnwindStatus_Fail; if(is_stale && is_read) { @@ -1843,7 +1843,7 @@ DW_MEM_READ(ctrl_unwind_mem_read_dwarf_x64) { status = DW_UnwindStatus_Ok; } - + return status; } @@ -1858,9 +1858,9 @@ DW_REG_READ(ctrl_unwind_reg_read_dwarf_x64) #define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; DW_Regs_X64_XList(X) #undef X - default: { InvalidPath; } break; + default: { InvalidPath; } break; } - + // copy out register value DW_UnwindStatus status = DW_UnwindStatus_Fail; if(reg_size > 0) @@ -1869,7 +1869,7 @@ DW_REG_READ(ctrl_unwind_reg_read_dwarf_x64) MemoryCopy(buffer, reg_bytes, reg_size); status = DW_UnwindStatus_Ok; } - + return status; } @@ -1884,9 +1884,9 @@ DW_REG_WRITE(ctrl_unwind_reg_write_dwarf_x64) #define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; DW_Regs_X64_XList(X) #undef X - default: { InvalidPath; } break; + default: { InvalidPath; } break; } - + // write value to the register DW_UnwindStatus status = DW_UnwindStatus_Fail; if(reg_size > 0) @@ -1895,7 +1895,7 @@ DW_REG_WRITE(ctrl_unwind_reg_write_dwarf_x64) MemoryCopy(reg_bytes, value, value_size); status = DW_UnwindStatus_Ok; } - + return status; } @@ -1903,9 +1903,9 @@ internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us) { Temp scratch = scratch_begin(0, 0); - + CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; - + // gather context for virtual stack unwinder U64 cfi_rebase = 0; B32 is_unwind_eh = 0; @@ -1931,13 +1931,13 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A } } } - + // grab IP U64 ip = regs_rip_from_arch_block(arch, regs); - + // use .eh_frame_hdr to quickly locate nearest FDE U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, ip); - + if(fde_addr != max_U64) { // parse call frame info @@ -1947,7 +1947,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A if(is_unwind_eh) { B32 is_stale = 0; - + // extract FDE info Rng1U64 fde_vrange = {0}; DW_Format fde_format = DW_Format_Null; @@ -1969,16 +1969,16 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + first_four_bytes); fde_format = DW_Format_32Bit; } - + // read out whole FDE void *fde_raw = push_array(scratch.arena, U8, dim_1u64(fde_vrange)); if(!ctrl_process_memory_read(process_handle, fde_vrange, &is_stale, fde_raw, endt_us)) { goto eh_parse_exit; } fde_data = str8(fde_raw, dim_1u64(fde_vrange)); - + // compute CIE address U64 cie_delta_off = fde_format == DW_Format_32Bit ? 4 : 12; U64 cie_delta = 0; - U64 cie_delta_size = str8_deserial_read_dwarf_uint(fde_data, cie_delta_off, fde_format, &cie_delta); + U64 cie_delta_size = dw_str8_deserial_read_fmt_uint(fde_data, cie_delta_off, fde_format, &cie_delta); if (cie_delta_size == 0) { goto eh_parse_exit; } cie_addr = (fde_addr + cie_delta_off) - cie_delta; } @@ -2003,19 +2003,19 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + first_four_bytes); cie_format = DW_Format_32Bit; } - + // read out whole CIE void *cie_raw = push_array(scratch.arena, U8, dim_1u64(cie_vrange)); if(!ctrl_process_memory_read(process_handle, cie_vrange, &is_stale, cie_raw, endt_us)) { goto eh_parse_exit; } cie_data = str8(cie_raw, dim_1u64(cie_vrange)); } - + // parse CIE and FDE if(eh_parse_cie(cie_data, cie_format, arch, cie_vrange.min, &eh_ptr_ctx, &cie)) { is_cfi_parsed = eh_parse_fde(fde_data, fde_format, fde_vrange.min, &cie, &eh_ptr_ctx, &fde); } - + eh_parse_exit:; if(is_stale) { @@ -2026,7 +2026,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A { is_cfi_parsed = dw_parse_cfi(unwind_data, fde_addr, arch, &cie, &fde); } - + if(is_cfi_parsed && contains_1u64(fde.pc_range, ip)) { // setup pointer decoder ops @@ -2037,7 +2037,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A EH_DecodePtrCtx *decode_ptr_ctx_eh = push_array(scratch.arena, EH_DecodePtrCtx, 1); decode_ptr_ctx_eh->ptr_ctx = &eh_ptr_ctx; decode_ptr_ctx_eh->addr_enc = cie.ext[EH_CIE_Ext_AddrEnc]; - + decode_ptr_func = eh_decode_ptr; decode_ptr_ctx = decode_ptr_ctx_eh; } @@ -2046,7 +2046,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A decode_ptr_func = dw_decode_ptr_debug_frame; decode_ptr_ctx = &cie; } - + // find register rules for IP DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(scratch.arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, ip); if(cfi_row) @@ -2060,28 +2060,28 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A DW_RegWrite *reg_write_func = 0; switch(arch) { - case Arch_Null: break; - case Arch_x64: - { - CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); - mem_read_ctx_x64->process_handle = process_handle; - mem_read_ctx_x64->endt_us = endt_us; - - mem_read_ctx = mem_read_ctx_x64; - reg_read_ctx = regs; - reg_write_ctx = regs; - - mem_read_func = ctrl_unwind_mem_read_dwarf_x64; - reg_read_func = ctrl_unwind_reg_read_dwarf_x64; - reg_write_func = ctrl_unwind_reg_write_dwarf_x64; - }break; - case Arch_x86: - case Arch_arm64: - case Arch_arm32: - { - NotImplemented; - }break; - default: { InvalidPath; } break; + case Arch_Null: break; + case Arch_x64: + { + CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); + mem_read_ctx_x64->process_handle = process_handle; + mem_read_ctx_x64->endt_us = endt_us; + + mem_read_ctx = mem_read_ctx_x64; + reg_read_ctx = regs; + reg_write_ctx = regs; + + mem_read_func = ctrl_unwind_mem_read_dwarf_x64; + reg_read_func = ctrl_unwind_reg_read_dwarf_x64; + reg_write_func = ctrl_unwind_reg_write_dwarf_x64; + }break; + case Arch_x86: + case Arch_arm64: + case Arch_arm32: + { + NotImplemented; + }break; + default: { InvalidPath; } break; } // apply register rules to the context @@ -2094,30 +2094,30 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A reg_read_ctx, reg_write_func, reg_write_ctx); - + // last frame typically has undefined rule for IP if(cfi_row->regs[cie.ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) { regs_arch_block_write_rip(arch, regs, 0); } - + // translate unwind status code to control layer's result flags switch(cfi_uw_status) { - case DW_UnwindStatus_Ok: - { - result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); - }break; - case DW_UnwindStatus_Fail: - { - result.flags |= CTRL_UnwindFlag_Error; - }break; - case DW_UnwindStatus_Maybe: - { - result.flags &= ~CTRL_UnwindFlag_Error; - result.flags |= CTRL_UnwindFlag_Stale; - }break; - default: { InvalidPath; } break; + case DW_UnwindStatus_Ok: + { + result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); + }break; + case DW_UnwindStatus_Fail: + { + result.flags |= CTRL_UnwindFlag_Error; + }break; + case DW_UnwindStatus_Maybe: + { + result.flags &= ~CTRL_UnwindFlag_Error; + result.flags |= CTRL_UnwindFlag_Stale; + }break; + default: { InvalidPath; } break; } } } @@ -2126,7 +2126,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A { // TODO: if IP does not have FDE, does this mean function is a leaf? } - + scratch_end(scratch); return result; } @@ -2977,9 +2977,9 @@ internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, U64 endt_us) { CTRL_UnwindStepResult result = {0}; - + result = ctrl_unwind_step__dwarf(process, module, arch, reg_block, endt_us); - + if(result.flags == CTRL_UnwindFlag_Error && ~result.flags & CTRL_UnwindFlag_Stale) { switch(arch) @@ -2987,7 +2987,7 @@ ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, default:{}break; case Arch_x64: { - result = ctrl_unwind_step__pe_x64(process, module, module_base_vaddr, (REGS_RegBlockX64 *)reg_block, endt_us); + result = ctrl_unwind_step__pe_x64(process, module, module_base_vaddr, (REGS_RegBlockX64 *)reg_block, endt_us); }break; } } @@ -3478,11 +3478,11 @@ ctrl_thread__entry_point(void *p) scratch_end(scratch); } - - - - - //- rjf: gather all touched files by user breakpoints + + + + + //- rjf: gather all touched files by user breakpoints for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) { if(n->v.kind != CTRL_UserBreakpointKind_FileNameAndLineColNumber) @@ -3731,7 +3731,7 @@ internal void ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) { Temp scratch = scratch_begin(0,0); - + Arena *arena = arena_alloc(); U64 entry_point_voff = 0; Rng1U64 tls_vaddr_range = {0}; @@ -3742,24 +3742,24 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ String8 raddbg_data = {0}; Rng1U64 raddbg_section_voff_range = r1u64(0, 0); Rng1U64 raddbg_is_attached_section_voff_range = r1u64(0, 0); - + PE_IntelPdata *pdatas = 0; U64 pdatas_count = 0; U32 pdb_dbg_time = 0; U32 pdb_dbg_age = 0; Guid pdb_dbg_guid = {0}; String8 pdb_dbg_path = {0}; - + U64 cfi_rebase = 0; B32 is_unwind_eh = 0; EH_FrameHdr eh_frame_hdr = {0}; EH_PtrCtx eh_ptr_ctx = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; - + // read module's signature bytes U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); dmn_process_read(process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); - + ////////////////////////////// //- parse PE module // @@ -4008,34 +4008,34 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ if(elf_sig == 0) { goto elf_exit; } switch(elf_sig[ELF_Identifier_Class]) { - default: - case ELF_Class_None:{}break; - case ELF_Class_32: - { - NotImplemented; - }break; - case ELF_Class_64: - { - ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr))); - if(ehdr == 0) { goto elf_exit; } - e_entry = ehdr->e_entry; - e_type = ehdr->e_type; - }break; + default: + case ELF_Class_None:{}break; + case ELF_Class_32: + { + NotImplemented; + }break; + case ELF_Class_64: + { + ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr))); + if(ehdr == 0) { goto elf_exit; } + e_entry = ehdr->e_entry; + e_type = ehdr->e_type; + }break; } } - + if(e_type == ELF_Type_Dyn) { cfi_rebase = vaddr_range.min; } - + // find and parse .eh_frame_hdr Rng1U64 eh_frame_hdr_vrange = {0}; String8 eh_frame_hdr_data = {0}; { void *phdrs_raw = dmn_process_read_raw(scratch.arena, process.dmn_handle, elf_phdr_vrange); if(phdrs_raw == 0) { goto elf_exit; } - + if(elf_phdr_entsize == sizeof(ELF_Phdr32)) { NotImplemented; @@ -4057,19 +4057,19 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ } } } - + // parse .eh_frame_hdr Arch arch = ctrl_arch_from_process_handle(process); eh_ptr_ctx.pc_vaddr = eh_frame_hdr_vrange.min; eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min; eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx); - + // set entry point if (e_entry != 0) { entry_point_voff = e_entry - vaddr_range.min; } - + // TODO: is there a way to detect DWARF in runtime ELF? if(1) { @@ -4162,7 +4162,7 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ } } } - + scratch_end(scratch); } diff --git a/src/dwarf/dwarf_coff.c b/src/dwarf/dwarf_coff.c index 2c6614f9..7282f6dc 100644 --- a/src/dwarf/dwarf_coff.c +++ b/src/dwarf/dwarf_coff.c @@ -23,14 +23,14 @@ dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, return is_dwarf_present; } -internal DW_Input -dw_input_from_coff_section_table(Arena *arena, - String8 raw_image, - String8 string_table, - U64 section_count, - COFF_SectionHeader *section_table) +internal DW_Raw +dw_raw_from_coff_section_table(Arena *arena, + String8 raw_image, + String8 string_table, + U64 section_count, + COFF_SectionHeader *section_table) { - DW_Input input = {0}; + DW_Raw input = {0}; B32 sect_status[ArrayCount(input.sec)] = {0}; for (U64 i = 0; i < section_count; ++i) { @@ -51,7 +51,6 @@ dw_input_from_coff_section_table(Arena *arena, } else { sect_status[s] = 1; DW_Section *d = &input.sec[s]; - d->name = push_str8_copy(arena, name); d->data = str8_substr(raw_image, raw_data_range); d->is_dwo = is_dwo; } diff --git a/src/dwarf/dwarf_coff.h b/src/dwarf/dwarf_coff.h index 79cd37c3..9bcd02a8 100644 --- a/src/dwarf/dwarf_coff.h +++ b/src/dwarf/dwarf_coff.h @@ -5,7 +5,6 @@ #define DWARF_COFF_H internal B32 dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, COFF_SectionHeader *section_table); -internal DW_Input dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); +internal DW_Raw dw_raw_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); #endif // DWARF_COFF_H - diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index e551e4ea..e33ef953 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -211,13 +211,13 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 } break; case DW_ExprOp_CallRef: { U64 x = 0; - cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &x); + cursor += dw_str8_deserial_read_fmt_uint(raw_data, cursor, format, &x); op_value = push_str8f(scratch.arena, "%llu", x); } break; case DW_ExprOp_ImplicitPointer: case DW_ExprOp_GNU_ImplicitPointer: { U64 info_off = 0; - cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &info_off); + cursor += dw_str8_deserial_read_fmt_uint(raw_data, cursor, format, &info_off); S64 ptr = 0; cursor += str8_deserial_read_sleb128(raw_data, cursor, &ptr); @@ -680,7 +680,7 @@ dw_print_eh_frame(Arena *arena, String8List *out, String8 indent, String8 raw_eh } internal void -dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) +dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) { #if 0 DW_Section info = input->sec[DW_Section_Info]; @@ -827,7 +827,7 @@ dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *inp } internal void -dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) +dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) { NotImplemented; #if 0 @@ -933,7 +933,7 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input * } internal void -dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Raw *input) { NotImplemented; #if 0 @@ -1022,7 +1022,7 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input } internal void -dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Raw *input) { NotImplemented; #if 0 @@ -1131,7 +1131,7 @@ dw_based_range_read_address(void *base, Rng1U64 range, U64 offset, Rng1U64Array } internal void -dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_virtual_ranges, Arch arch) +dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_virtual_ranges, Arch arch) { NotImplemented; #if 0 @@ -1284,7 +1284,7 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input } internal void -dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_ranges) +dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_ranges) { NotImplemented; #if 0 @@ -1423,7 +1423,7 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input } internal void -dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input *input, DW_SectionKind sec) +dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Raw *input, DW_SectionKind sec) { NotImplemented; #if 0 @@ -1485,19 +1485,19 @@ dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input } internal void -dw_print_debug_pubnames(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_pubnames(Arena *arena, String8List *out, String8 indent, DW_Raw *input) { dw_format_string_table(arena, out, indent, input, DW_Section_PubNames); } internal void -dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 indent, DW_Raw *input) { dw_format_string_table(arena, out, indent, input, DW_Section_PubTypes); } internal void -dw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Raw *input) { NotImplemented; #if 0 @@ -1527,7 +1527,7 @@ dw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Input } internal void -dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Raw *input) { NotImplemented; #if 0 @@ -1598,7 +1598,7 @@ dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_In //~ rjf: Dump Entry Point internal String8 -dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_vm, DW_Attrib *attrib) +dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_vm, DW_Attrib *attrib) { Temp scratch = scratch_begin(&arena, 1); @@ -1737,7 +1737,7 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni internal String8List dw_dump_list_from_sections(Arena *arena, - DW_Input *input, + DW_Raw *input, Arch arch, DW_DumpSubsetFlags subset_flags) { @@ -1748,18 +1748,17 @@ dw_dump_list_from_sections(Arena *arena, #define DumpSubset(name) if(subset_flags & DW_DumpSubsetFlag_##name) DeferLoop(dumpf("// %S\n\n", dw_name_title_from_dump_subset_table[DW_DumpSubset_##name]), dump(str8_lit("\n"))) Temp scratch = scratch_begin(&arena, 1); Rng1U64Array segment_vranges = {0}; - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input); - B32 relaxed = 1; + DW_ListUnitInput lu_input = dw_list_unit_input_from_raw(scratch.arena, input); DW_CompUnit *cu_arr; { - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input); + DW_ListUnitInput lu_input = dw_list_unit_input_from_raw(scratch.arena, input); Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Info].data); Rng1U64Array cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); for EachIndex(cu_idx, cu_ranges.count) { - cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, input, lu_input, cu_ranges.v[cu_idx].min, relaxed); + cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, input, lu_input, cu_ranges.v[cu_idx].min); } } diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index 472bb7b7..67aa59d7 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -70,21 +70,21 @@ internal String8 dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_siz #if 0 internal void dw_print_eh_frame (Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx); -internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); -internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); -internal void dw_print_debug_aranges (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_addr (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_loclists (Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_vranges, Arch arch); -internal void dw_print_debug_rnglists (Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_vranges); -internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input); +internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); +internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); +internal void dw_print_debug_aranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_addr (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_loclists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges, Arch arch); +internal void dw_print_debug_rnglists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges); +internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Raw *input); #endif //////////////////////////////// //~ rjf: Dump Entry Point -internal String8List dw_dump_list_from_sections(Arena *arena, DW_Input *input, Arch arch, DW_DumpSubsetFlags subset_flags); +internal String8List dw_dump_list_from_sections(Arena *arena, DW_Raw *input, Arch arch, DW_DumpSubsetFlags subset_flags); #endif // DWARF_DUMP_H diff --git a/src/dwarf/dwarf_elf.c b/src/dwarf/dwarf_elf.c index 39884286..a247434f 100644 --- a/src/dwarf/dwarf_elf.c +++ b/src/dwarf/dwarf_elf.c @@ -27,10 +27,10 @@ dw_is_dwarf_present_from_elf_bin(String8 data, ELF_Bin *bin) #define SINFL_IMPLEMENTATION #include "third_party/sinfl/sinfl.h" -internal DW_Input -dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) +internal DW_Raw +dw_raw_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) { - DW_Input result = {0}; + DW_Raw result = {0}; B32 is_section_present[ArrayCount(result.sec)] = {0}; for(U64 section_idx = 1; section_idx < bin->shdrs.count; section_idx += 1) { @@ -106,7 +106,6 @@ dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) //- rjf: store is_section_present[section_kind] = 1; DW_Section *d = &result.sec[section_kind]; - d->name = push_str8_copy(arena, section_name); d->data = section_data__uncompressed; d->is_dwo = is_dwo; } diff --git a/src/dwarf/dwarf_elf.h b/src/dwarf/dwarf_elf.h index a9a54f38..c2e8ba78 100644 --- a/src/dwarf/dwarf_elf.h +++ b/src/dwarf/dwarf_elf.h @@ -5,6 +5,6 @@ #define DWARF_ELF_H internal B32 dw_is_dwarf_present_from_elf_bin(String8 raw_image, ELF_Bin *bin); -internal DW_Input dw_input_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin); +internal DW_Raw dw_raw_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin); #endif // DWARF_ELF_H diff --git a/src/dwarf/dwarf_help.h b/src/dwarf/dwarf_help.h index 2882c6b6..ffb7d37e 100644 --- a/src/dwarf/dwarf_help.h +++ b/src/dwarf/dwarf_help.h @@ -15,4 +15,3 @@ typedef struct DW_CallFrameInfo internal DW_CallFrameInfo dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame); #endif // DWARF_HELP_H - diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index d4250e9c..f564d80e 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -2,7 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) internal U64 -str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) +dw_str8_deserial_read_packed_size(String8 string, U64 off, U64 *size_out) { U64 bytes_read = 0; if(str8_deserial_read(string, off, size_out, sizeof(U32), sizeof(U32))) @@ -24,7 +24,7 @@ str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) } internal U64 -str8_deserial_read_dwarf_uint(String8 string, U64 off, DW_Format format, U64 *uint_out) +dw_str8_deserial_read_fmt_uint(String8 string, U64 off, DW_Format format, U64 *uint_out) { U64 bytes_read = 0; switch(format) @@ -43,126 +43,6 @@ str8_deserial_read_dwarf_uint(String8 string, U64 off, DW_Format format, U64 *ui return bytes_read; } -internal U64 -str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) -{ - U64 value = 0; - U64 shift = 0; - U64 cursor = off; - for(;;) - { - U8 byte = 0; - U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) - { - break; - } - U8 val = byte & 0x7fu; - value |= ((U64)val) << shift; - cursor += bytes_read; - shift += 7u; - if((byte & 0x80u) == 0) - { - break; - } - } - if(value_out != 0) - { - *value_out = value; - } - U64 bytes_read = cursor - off; - return bytes_read; -} - -internal U64 -str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) -{ - U64 value = 0; - U64 shift = 0; - U64 cursor = off; - for(;;) - { - U8 byte = 0; - U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) - { - break; - } - U8 val = byte & 0x7fu; - value |= ((U64)val) << shift; - cursor += bytes_read; - shift += 7u; - if((byte & 0x80u) == 0) - { - if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) - { - value |= -(S64)(1ull << shift); - } - break; - } - } - if(value_out != 0) - { - *value_out = value; - } - U64 bytes_read = cursor - off; - return bytes_read; -} - -internal U64 -str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out) -{ - Temp temp = temp_begin(arena); - - U64 *arr = push_array(arena, U64, count); - U64 i, cursor; - for (i = 0, cursor = off; i < count; ++i) { - U64 read_size = str8_deserial_read_uleb128(string, cursor, &arr[i]); - if (read_size == 0) { - break; - } - cursor += read_size; - } - - U64 bytes_read = 0; - if (i == count) { - *arr_out = arr; - bytes_read = cursor - off; - } else { - temp_end(temp); - *arr_out = 0; - } - - return bytes_read; -} - -internal U64 -str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out) -{ - Temp temp = temp_begin(arena); - - S64 *arr = push_array(arena, S64, count); - U64 i, cursor; - for (i = 0, cursor = off; i < count; ++i) { - U64 read_size = str8_deserial_read_sleb128(string, cursor, &arr[i]); - if (read_size == 0) { - break; - } - cursor += read_size; - } - - U64 bytes_read = 0; - if (i == count) { - *arr_out = arr; - bytes_read = cursor - off; - } else { - temp_end(temp); - *arr_out = 0; - } - - return bytes_read; -} - internal DW_SectionKind dw_section_kind_from_string(String8 string) { @@ -194,7 +74,7 @@ dw_unit_ranges_from_data(Arena *arena, String8 data) { // rjf: read CU size; bad read -> terminate U64 cu_size = 0; - U64 cu_size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &cu_size); + U64 cu_size_size = dw_str8_deserial_read_packed_size(data, cursor, &cu_size); if(cu_size_size == 0) { break; @@ -219,7 +99,7 @@ dw_read_list_unit_header_addr(String8 unit_data, DW_ListUnit *lu_out) U64 header_size = 0; U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); + U64 unit_length_size = dw_str8_deserial_read_packed_size(unit_data, 0, &unit_length); if (unit_length_size) { DW_Version version = DW_Version_Null; @@ -260,7 +140,7 @@ dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out) U64 header_size = 0; U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); + U64 unit_length_size = dw_str8_deserial_read_packed_size(unit_data, 0, &unit_length); if (unit_length_size) { DW_Version version = DW_Version_Null; @@ -291,7 +171,7 @@ dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) U64 header_size = 0; U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); + U64 unit_length_size = dw_str8_deserial_read_packed_size(unit_data, 0, &unit_length); if (unit_length_size) { DW_Version version = DW_Version_Null; @@ -327,7 +207,7 @@ dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) } internal DW_ListUnitInput -dw_list_unit_input_from_input(Arena *arena, DW_Input *input) +dw_list_unit_input_from_raw(Arena *arena, DW_Raw *input) { Temp scratch = scratch_begin(&arena, 1); @@ -709,11 +589,11 @@ dw_read_form(String8 data, if (version < DW_Version_3) { bytes_read = str8_deserial_read(data, off, &form.ref, address_size, address_size); } else { - bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.ref); + bytes_read = dw_str8_deserial_read_fmt_uint(data, off, unit_format, &form.ref); } } break; case DW_Form_GNU_RefAlt: { - bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.ref); + bytes_read = dw_str8_deserial_read_fmt_uint(data, off, unit_format, &form.ref); } break; case DW_Form_Ref1: { bytes_read = str8_deserial_read(data, off, &form.ref, 1, 1); @@ -734,7 +614,7 @@ dw_read_form(String8 data, case DW_Form_LineStrp: case DW_Form_GNU_StrpAlt: case DW_Form_Strp: { - bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.sec_offset); + bytes_read = dw_str8_deserial_read_fmt_uint(data, off, unit_format, &form.sec_offset); } break; case DW_Form_ExprLoc: { U64 expr_size = 0; @@ -764,7 +644,7 @@ dw_read_form(String8 data, NotImplemented; } break; case DW_Form_StrpSup: { - bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.strp_sup); + bytes_read = dw_str8_deserial_read_fmt_uint(data, off, unit_format, &form.strp_sup); } break; case DW_Form_Data16: { bytes_read = str8_deserial_read_block(data, off, 16, &form.data); @@ -902,7 +782,7 @@ dw_read_tag(Arena *arena, } internal U64 -dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) +dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) { String8 tag_data = str8_substr(input->sec[DW_Section_Info].data, cu->info_range); U64 tag_off = info_off - cu->info_range.min; @@ -1054,14 +934,14 @@ dw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_Form } internal String8 -dw_interp_block(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_block(DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) { NotImplemented; return str8_zero(); } internal String8 -dw_interp_string(DW_Input *input, +dw_interp_string(DW_Raw *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_FormKind form_kind, @@ -1100,7 +980,7 @@ dw_interp_string(DW_Input *input, } internal String8 -dw_interp_line_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_line_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) { String8 result = {0}; if (form_kind == DW_Form_SecOffset) { @@ -1125,7 +1005,7 @@ dw_interp_file(DW_LineVMHeader *line_vm, DW_FormKind form_kind, DW_Form form) } internal DW_Reference -dw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_ref(DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) { DW_Reference ref = {0}; if (form_kind == DW_Form_Ref1 || form_kind == DW_Form_Ref2 || @@ -1146,7 +1026,7 @@ dw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form f } internal DW_LocList -dw_interp_loclist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_loclist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) { DW_LocList loclist = {0}; @@ -1433,7 +1313,7 @@ dw_interp_flag(DW_FormKind form_kind, DW_Form form) } internal Rng1U64List -dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_rnglist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) { Rng1U64List rnglist = {0}; @@ -1624,7 +1504,7 @@ dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind fo } internal String8 -dw_interp_secptr(DW_Input *input, DW_SectionKind section, DW_FormKind form_kind, DW_Form form) +dw_interp_secptr(DW_Raw *input, DW_SectionKind section, DW_FormKind form_kind, DW_Form form) { String8 secptr = {0}; if (form_kind == DW_Form_SecOffset) { @@ -1638,25 +1518,25 @@ dw_interp_secptr(DW_Input *input, DW_SectionKind section, DW_FormKind form_kind, } internal String8 -dw_interp_addrptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_addrptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) { return dw_interp_secptr(input, DW_Section_Addr, form_kind, form); } internal String8 -dw_interp_str_offsets_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_str_offsets_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) { return dw_interp_secptr(input, DW_Section_StrOffsets, form_kind, form); } internal String8 -dw_interp_rnglists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_rnglists_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) { return dw_interp_secptr(input, DW_Section_RngLists, form_kind, form); } internal String8 -dw_interp_loclists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_loclists_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) { return dw_interp_secptr(input, DW_Section_LocLists, form_kind, form); } @@ -1668,7 +1548,7 @@ dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_exprloc_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_exprloc_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_ExprLoc || value_class == DW_AttribClass_Block); @@ -1676,7 +1556,7 @@ dw_exprloc_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U128 -dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1684,7 +1564,7 @@ dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U64 -dw_const_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1692,7 +1572,7 @@ dw_const_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U32 -dw_const_u32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1700,7 +1580,7 @@ dw_const_u32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal S64 -dw_const_s64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_s64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1708,7 +1588,7 @@ dw_const_s64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal S32 -dw_const_s32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_s32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1716,7 +1596,7 @@ dw_const_s32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal B32 -dw_flag_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_flag_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Flag); @@ -1724,7 +1604,7 @@ dw_flag_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U64 -dw_address_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_address_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || @@ -1749,7 +1629,7 @@ dw_address_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_block_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_block_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Block); @@ -1757,7 +1637,7 @@ dw_block_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_string_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_string_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_String || value_class == DW_AttribClass_StrOffsetsPtr); @@ -1765,7 +1645,7 @@ dw_string_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_line_ptr_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_line_ptr_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_LinePtr); @@ -1781,7 +1661,7 @@ dw_file_from_attrib(DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Attrib *attrib } internal DW_Reference -dw_ref_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_ref_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Reference); @@ -1789,7 +1669,7 @@ dw_ref_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal DW_LocList -dw_loclist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_loclist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || @@ -1799,7 +1679,7 @@ dw_loclist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib } internal Rng1U64List -dw_rnglist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_rnglist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { Rng1U64List rnglist = {0}; DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); @@ -1826,7 +1706,7 @@ dw_attrib_from_tag_(DW_Tag tag, DW_AttribKind kind) } internal DW_Attrib * -dw_attrib_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_attrib_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { DW_Attrib *attrib = dw_attrib_from_tag_(tag, kind); @@ -1845,7 +1725,7 @@ dw_attrib_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind k } internal B32 -dw_tag_has_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_tag_has_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); B32 has_attrib = attrib->attrib_kind != DW_AttribKind_Null; @@ -1853,85 +1733,85 @@ dw_tag_has_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind ki } internal String8 -dw_exprloc_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_exprloc_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_exprloc_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_block_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_block_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_block_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U128 -dw_const_u128_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u128_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U64 -dw_const_u64_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u64_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u64_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U32 -dw_const_u32_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u32_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u32_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U64 -dw_address_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_address_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_address_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_string_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_string_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_string_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_line_ptr_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_line_ptr_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_line_ptr_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_Reference -dw_ref_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_ref_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_ref_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_LocList -dw_loclist_from_tag_attrib_kind(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_loclist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_loclist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal Rng1U64List -dw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_rnglist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal B32 -dw_flag_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_flag_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_flag_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_LineFile * -dw_file_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind) +dw_file_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind) { return dw_file_from_attrib(cu, line_vm, dw_attrib_from_tag(input, cu, tag, kind)); } internal B32 -dw_try_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out) +dw_try_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out) { B32 has_byte_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ByteSize); B32 has_bit_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_BitSize ); @@ -1953,7 +1833,7 @@ dw_try_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, U64 *byt } internal U64 -dw_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) +dw_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) { U64 byte_size = max_U64; dw_try_byte_size_from_tag(input, cu, tag, &byte_size); @@ -1961,7 +1841,7 @@ dw_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) } internal U32 -dw_byte_size_32_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) +dw_byte_size_32_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) { U32 byte_size32 = 0; U64 byte_size64; @@ -1972,7 +1852,7 @@ dw_byte_size_32_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) } internal U64 -dw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { U64 result = 0; DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); @@ -2003,7 +1883,7 @@ dw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind k } internal DW_CompUnit -dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed) +dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 offset) { DW_CompUnit cu = {0}; @@ -2011,7 +1891,7 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 // read unit size in bytes U64 length = 0; - U64 length_size = str8_deserial_read_dwarf_packed_size(info_data, offset, &length); + U64 length_size = dw_str8_deserial_read_packed_size(info_data, offset, &length); if (length_size) { // compute unit range @@ -2058,7 +1938,7 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 case DW_Version_3: case DW_Version_4: { U64 abbrev_base_off = cursor; - U64 abbrev_base_size = str8_deserial_read_dwarf_uint(data, abbrev_base_off, format, &abbrev_base); + U64 abbrev_base_size = dw_str8_deserial_read_fmt_uint(data, abbrev_base_off, format, &abbrev_base); if (!abbrev_base_size) { break; } @@ -2086,7 +1966,7 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 } U64 abbrev_base_off = address_size_off + address_size_size; - U64 abbrev_base_size = str8_deserial_read_dwarf_uint(data, abbrev_base_off, format, &abbrev_base); + U64 abbrev_base_size = dw_str8_deserial_read_fmt_uint(data, abbrev_base_off, format, &abbrev_base); if (!abbrev_base_size) { break; } @@ -2209,7 +2089,7 @@ dw_tag_tree_from_data(Arena *arena, String8 info_data, String8 abbrev_data, DW_C } internal DW_TagTree -dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu) +dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu) { String8 abbrev_data = input->sec[DW_Section_Abbrev].data; String8 info_data = str8_substr(input->sec[DW_Section_Info].data, cu->info_range); @@ -2302,7 +2182,7 @@ dw_line_vm_file_array_from_list(Arena *arena, DW_LineVMFileList list) internal U64 dw_read_line_file(String8 data, U64 off, - DW_Input *input, + DW_Raw *input, DW_Version version, DW_Format format, DW_Ext ext, @@ -2364,7 +2244,7 @@ internal U64 dw_read_line_file_array(Arena *arena, String8 data, U64 off, - DW_Input *input, + DW_Raw *input, DW_Version version, DW_Format format, DW_Ext ext, @@ -2412,7 +2292,7 @@ dw_read_line_file_array(Arena *arena, } internal U64 -dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out) +dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Raw *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out) { Temp scratch = scratch_begin(&arena, 1); @@ -2420,7 +2300,7 @@ dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input * // read unit length U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(line_data, line_off, &unit_length); + U64 unit_length_size = dw_str8_deserial_read_packed_size(line_data, line_off, &unit_length); U64 unit_opl = line_off + unit_length_size + unit_length; Rng1U64 unit_range = rng_1u64(line_off, unit_opl); @@ -2457,7 +2337,7 @@ dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input * // read header length U64 header_length = 0; - U64 header_length_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, format, &header_length); + U64 header_length_size = dw_str8_deserial_read_fmt_uint(unit_data, unit_cursor, format, &header_length); if (header_length_size == 0) { goto exit; } @@ -2611,12 +2491,11 @@ dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input * unit_cursor += enc_count_size; // read table entry encodings - U64 *enc_arr = 0; - U64 enc_arr_size = str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr); - if (enc_arr_size == 0) { - goto exit; + U64 *enc_arr = push_array(scratch.arena, U64, enc_count*2); + for EachIndex(idx, enc_count) + { + unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &enc_arr[idx]); } - unit_cursor += enc_arr_size; // read table count U64 table_count = 0; @@ -2657,12 +2536,11 @@ dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input * unit_cursor += enc_count_size; // read table entry encodings - U64 *enc_arr = 0; - U64 enc_arr_size = str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr); - if (enc_arr_size == 0) { - goto exit; + U64 *enc_arr = push_array(scratch.arena, U64, enc_count*2); + for EachIndex(idx, enc_count) + { + unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &enc_arr[idx]); } - unit_cursor += enc_arr_size; // read table count U64 table_count = 0; @@ -2808,7 +2686,7 @@ dw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx) } internal DW_LineTableParseResult -dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets) +dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets) { DW_LineVMHeader vm_header = {0}; U64 vm_header_size = dw_read_line_vm_header(arena, unit_data, 0, input, cu_dir, cu_name, cu_address_size, cu_str_offsets, &vm_header); @@ -3031,7 +2909,7 @@ dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, } internal DW_PubStringsTable -dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind) +dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind) { Temp scratch = scratch_begin(&arena, 1); @@ -3043,7 +2921,7 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_Sect for(U64 cursor = 0; cursor < section_data.size; ) { U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(section_data, cursor, &unit_length); + U64 unit_length_size = dw_str8_deserial_read_packed_size(section_data, cursor, &unit_length); if (unit_length_size == 0) { break; } @@ -3063,13 +2941,13 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_Sect DW_Format format = DW_FormatFromSize(unit_length); U64 debug_info_off = 0; - cursor += str8_deserial_read_dwarf_uint(section_data, cursor, format, &debug_info_off); + cursor += dw_str8_deserial_read_fmt_uint(section_data, cursor, format, &debug_info_off); if (cursor >= cursor_opl) { break; } U64 debug_info_length = 0; - cursor += str8_deserial_read_dwarf_packed_size(section_data, cursor, &debug_info_length); + cursor += dw_str8_deserial_read_packed_size(section_data, cursor, &debug_info_length); if (cursor >= cursor_opl) { break; } @@ -3077,7 +2955,7 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_Sect U64 off_size = dw_size_from_format(format); for (; (cursor + off_size) <= cursor_opl;) { U64 info_off = 0; - U64 info_off_size = str8_deserial_read_dwarf_uint(section_data, cursor, format, &info_off); + U64 info_off_size = dw_str8_deserial_read_fmt_uint(section_data, cursor, format, &info_off); cursor += info_off_size; if (info_off_size == 0 || info_off == 0) { @@ -3213,11 +3091,11 @@ dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data) cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); } break; case DW_ExprOp_CallRef: { - cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); + cursor += dw_str8_deserial_read_fmt_uint(data, cursor, format, &operands[0].u64); } break; case DW_ExprOp_ImplicitPointer: case DW_ExprOp_GNU_ImplicitPointer: { - cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); + cursor += dw_str8_deserial_read_fmt_uint(data, cursor, format, &operands[0].u64); cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); } break; case DW_ExprOp_Convert: @@ -3350,13 +3228,13 @@ dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; U64 length = 0; - U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); + U64 length_size = dw_str8_deserial_read_packed_size(data, off, &length); if (length_size == 0) { goto exit; } Rng1U64 entry_range = rng_1u64(off, off + length_size + length); String8 entry_data = str8_substr(data, entry_range); U64 id = 0; - U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); + U64 id_size = dw_str8_deserial_read_fmt_uint(entry_data, length_size, format, &id); if (id_size == 0) { goto exit; } U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64; @@ -3377,7 +3255,7 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) U64 cursor = format == DW_Format_32Bit ? 4 : 12; U64 cie_id = 0; - U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); + U64 cie_id_size = dw_str8_deserial_read_fmt_uint(data, cursor, format, &cie_id); if (cie_id_size == 0) { goto exit; } cursor += cie_id_size; @@ -3447,7 +3325,7 @@ dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out) // extract CIE pointer U64 cie_pointer = 0; - U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer); + U64 cie_pointer_size = dw_str8_deserial_read_fmt_uint(data, cursor, format, &cie_pointer); if (cie_pointer_size == 0) { goto exit; } cursor += cie_pointer_size; @@ -3487,7 +3365,7 @@ dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *f if (fde_desc.type == DW_DescriptorEntryType_FDE) { U64 cie_pointer_off = fde_desc.format == DW_Format_32Bit ? 4 : 12; U64 cie_pointer = 0; - U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); + U64 cie_pointer_size = dw_str8_deserial_read_fmt_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); if (cie_pointer_size) { DW_DescriptorEntry cie_desc = {0}; dw_parse_descriptor_entry_header(data, cie_pointer, &cie_desc); diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index d6bf466d..70c0268d 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -4,19 +4,20 @@ #ifndef DWARF_PARSE_H #define DWARF_PARSE_H +//////////////////////////////// +//~ rjf: Raw DWARF Info Bundle + typedef struct DW_Section DW_Section; struct DW_Section { - String8 name; String8 data; - B32 is_dwo; + B32 is_dwo; }; -typedef struct DW_Input DW_Input; -struct DW_Input +typedef struct DW_Raw DW_Raw; +struct DW_Raw { DW_Section sec[DW_Section_Count]; - DW_Section sup[DW_Section_Count]; }; typedef struct DW_ListUnit DW_ListUnit; @@ -449,12 +450,8 @@ typedef DW_DECODE_PTR(DW_DecodePtr); // deserial helpers -internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out); -internal U64 str8_deserial_read_dwarf_uint (String8 string, U64 off, DW_Format format, U64 *uint_out); -internal U64 str8_deserial_read_uleb128 (String8 string, U64 off, U64 *value_out); -internal U64 str8_deserial_read_sleb128 (String8 string, U64 off, S64 *value_out); -internal U64 str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out); -internal U64 str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out); +internal U64 dw_str8_deserial_read_packed_size(String8 string, U64 off, U64 *size_out); +internal U64 dw_str8_deserial_read_fmt_uint(String8 string, U64 off, DW_Format format, U64 *uint_out); internal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data); @@ -464,7 +461,7 @@ internal U64 dw_read_list_unit_header_addr (String8 unit_data, DW_ListUnit internal U64 dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out); internal U64 dw_read_list_unit_header_list (String8 unit_data, DW_ListUnit *lu_out); -internal DW_ListUnitInput dw_list_unit_input_from_input(Arena *arena, DW_Input *input); +internal DW_ListUnitInput dw_list_unit_input_from_raw(Arena *arena, DW_Raw *input); internal U64 dw_offset_from_list_unit(DW_ListUnit *lu, U64 index); internal U64 dw_addr_from_list_unit (DW_ListUnit *lu, U64 index); @@ -480,7 +477,7 @@ internal U64 dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U6 internal U64 dw_read_form(String8 data, U64 off, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, U64 implicit_const, DW_Form *form_out); internal U64 dw_read_tag (Arena *arena, String8 tag_data, U64 tag_off, U64 tag_base, DW_AbbrevTable abbrev_table, String8 abbrev_data, DW_Version version, DW_Format unit_format, U64 address_size, DW_Tag *tag_out); -internal U64 dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); +internal U64 dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); // attrib interp @@ -493,56 +490,56 @@ internal S64 dw_interp_const_s64 (DW_FormKind form_kind, DW_Form form) internal S32 dw_interp_const_s32 (DW_FormKind form_kind, DW_Form form); internal B32 dw_interp_flag (DW_FormKind form_kind, DW_Form form); internal U64 dw_interp_address (U64 address_size, U64 base_addr, DW_ListUnit *addr_xlist, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_block (DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_string (DW_Input *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_line_ptr (DW_Input *input, DW_FormKind form_kind, DW_Form form); +internal String8 dw_interp_block (DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal String8 dw_interp_string (DW_Raw *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_FormKind form_kind, DW_Form form); +internal String8 dw_interp_line_ptr (DW_Raw *input, DW_FormKind form_kind, DW_Form form); internal DW_LineFile * dw_interp_file (DW_LineVMHeader *line_vm, DW_FormKind form_kind, DW_Form form); -internal DW_Reference dw_interp_ref (DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal DW_LocList dw_interp_loclist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal DW_Reference dw_interp_ref (DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal DW_LocList dw_interp_loclist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal String8 dw_exprloc_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U128 dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U64 dw_const_u64_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U32 dw_const_u32_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal S64 dw_const_s64_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal S32 dw_const_s32_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal B32 dw_flag_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U64 dw_address_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_block_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_string_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_line_ptr_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_exprloc_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U128 dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U64 dw_const_u64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U32 dw_const_u32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal S64 dw_const_s64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal S32 dw_const_s32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal B32 dw_flag_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U64 dw_address_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_block_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_string_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_line_ptr_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); internal DW_LineFile * dw_file_from_attrib (DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Attrib *attrib); -internal DW_Reference dw_ref_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW_Reference dw_ref_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_exprloc_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U128 dw_const_u128_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U64 dw_const_u64_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U32 dw_const_u32_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal B32 dw_flag_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U64 dw_address_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_block_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_string_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind); -internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_exprloc_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U128 dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U64 dw_const_u64_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U32 dw_const_u32_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal B32 dw_flag_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U64 dw_address_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_block_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_string_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind); +internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); // compile unit -internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed); -internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu); +internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 offset); +internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu); internal HashTable * dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree); internal DW_TagNode * dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off); // line info -internal U64 dw_read_line_file(String8 line_data, U64 line_off, DW_Input *input, DW_Version unit_version, DW_Format unit_format, DW_Ext ext, U64 address_size, DW_ListUnit *str_offsets, U64 enc_count, U64 *enc_arr, DW_LineFile *line_file_out); -internal U64 dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); +internal U64 dw_read_line_file(String8 line_data, U64 line_off, DW_Raw *input, DW_Version unit_version, DW_Format unit_format, DW_Ext ext, U64 address_size, DW_ListUnit *str_offsets, U64 enc_count, U64 *enc_arr, DW_LineFile *line_file_out); +internal U64 dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Raw *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); internal void dw_line_vm_reset(DW_LineVMState *state, B32 default_is_stmt); internal void dw_line_vm_advance(DW_LineVMState *state, U64 advance, U64 min_inst_len, U64 max_ops_for_inst); internal DW_LineSeqNode * dw_push_line_seq(Arena* arena, DW_LineTableParseResult *parsed_tbl); @@ -550,11 +547,11 @@ internal DW_LineNode * dw_push_line(Arena *arena, DW_LineTableParseResult *tb internal String8 dw_path_from_file(Arena *arena, DW_LineVMHeader *vm, DW_LineFile *file); internal String8 dw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx); -internal DW_LineTableParseResult dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets); +internal DW_LineTableParseResult dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets); // helper for .debug_pubtypes and .debug_pubnames -internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind); +internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind); // expression diff --git a/src/dwarf/eh_dump.h b/src/dwarf/eh_dump.h index 8ba5a6cb..598a8005 100644 --- a/src/dwarf/eh_dump.h +++ b/src/dwarf/eh_dump.h @@ -8,8 +8,8 @@ //~ Dump Subset Types #define EH_DumpSubset_XList \ - X(EhFrameHdr, eh_frame_hdr, ".eh_frame_hdr") \ - X(EhFrame, eh_frame, ".eh_frame") +X(EhFrameHdr, eh_frame_hdr, ".eh_frame_hdr") \ +X(EhFrame, eh_frame, ".eh_frame") typedef enum EH_DumpSubset { #define X(name, name_lower, title) EH_DumpSubset_##name, @@ -45,4 +45,3 @@ read_only global String8 eh_name_title_from_dump_subset_table[] = internal String8List eh_dump_list_from_data(Arena *arena, Arch arch, U64 eh_frame_hdr_vaddr, U64 eh_frame_vaddr, String8 eh_frame_hdr, String8 eh_frame, EH_DumpSubsetFlags subset_flags); #endif // EH_FRAME_DUMP_H - diff --git a/src/dwarf/eh_frame.c b/src/dwarf/eh_frame.c index cf455905..33515e03 100644 --- a/src/dwarf/eh_frame.c +++ b/src/dwarf/eh_frame.c @@ -5,69 +5,69 @@ internal U64 eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) { U64 ptr_off = off; - + if (encoding == EH_PtrEnc_Omit) { return 0; } - + // align read offset as needed if (encoding == EH_PtrEnc_Aligned) { ptr_off = AlignPow2(ptr_off, ptr_ctx->ptr_align); encoding = EH_PtrEnc_Ptr; } - + // decode pointer value U64 decode_size = 0; U64 raw_ptr_size = 0; U64 raw_ptr = 0; switch (encoding & EH_PtrEnc_TypeMask) { - default: { InvalidPath; } break; - - case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; - case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; - case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; - case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; - ufixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - } break; - - // TODO: Signed is actually just a flag that indicates this int is negavite. - // There shouldn't be a read for Signed. - // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. - case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; - - case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; - case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; - case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; - sfixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); - } break; - - case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; - case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; + default: { InvalidPath; } break; + + case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; + case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; + case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; + case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; + ufixed: { + decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); + } break; + + // TODO: Signed is actually just a flag that indicates this int is negavite. + // There shouldn't be a read for Signed. + // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. + case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; + + case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; + case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; + case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; + sfixed: { + decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); + raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); + } break; + + case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; + case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; } - + // apply relative bases if (decode_size > 0) { U64 ptr = raw_ptr; switch (encoding & EH_PtrEnc_ModifierMask) { - case 0: break; - case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; - case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; - case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; - case EH_PtrEnc_FuncRel: { - Assert(!"TODO: need a sample to verify implementation"); - ptr = ptr_ctx->func_vaddr + raw_ptr; - } break; - default: { InvalidPath; } break; + case 0: break; + case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; + case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; + case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; + case EH_PtrEnc_FuncRel: { + Assert(!"TODO: need a sample to verify implementation"); + ptr = ptr_ctx->func_vaddr + raw_ptr; + } break; + default: { InvalidPath; } break; } - + if (ptr_out) { *ptr_out = ptr; } } - + return decode_size; } @@ -76,49 +76,49 @@ eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) { EH_FrameHdr header = {0}; U64 cursor = 0; - + U64 version_size = str8_deserial_read_struct(data, cursor, &header.version); if (version_size == 0) { goto exit; } cursor += version_size; - + if (header.version == 1) { U64 eh_frame_ptr_enc_size = str8_deserial_read_struct(data, cursor, &header.eh_frame_ptr_enc); if (eh_frame_ptr_enc_size == 0) { goto exit; } cursor += eh_frame_ptr_enc_size; - + U64 fde_count_enc_size = str8_deserial_read_struct(data, cursor, &header.fde_count_enc); if (fde_count_enc_size == 0) { goto exit; } cursor += fde_count_enc_size; - + U64 table_enc_size = str8_deserial_read_struct(data, cursor, &header.table_enc); if (table_enc_size == 0) { goto exit; } cursor += table_enc_size; - + cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.eh_frame_ptr_enc, &header.eh_frame_ptr); cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.fde_count_enc, &header.fde_count); - + switch (header.table_enc & EH_PtrEnc_TypeMask) { - case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; - case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 - case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; - case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; - case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; - case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; - case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 - case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; - case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; - case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; - default: { InvalidPath; } break; + case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; + case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; + default: { InvalidPath; } break; } header.entry_byte_size = header.field_byte_size * 2; - + header.table = str8_skip(data, cursor); AssertAlways(header.table.size == header.entry_byte_size * header.fde_count); } else { Assert(0 && "unknown version"); } - -exit:; + + exit:; return header; } @@ -130,9 +130,9 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c // On 32bit arch it is a 4-byte and on 64-bit 8-byte value. // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html // Reference doc doesn't clarify structure for EH Data though - + U64 cursor = 0; - + U64 aug_data_size = 0; EH_AugFlags aug_flags = 0; EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; @@ -141,30 +141,30 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c U64 handler_ip = 0; if (str8_match(str8_prefix(aug_string, 1), str8_lit("z"), 0)) { cursor = str8_deserial_read_uleb128(aug_data, cursor, &aug_data_size); - + for (U8 *ptr = aug_string.str+1; ptr < (aug_string.str+aug_string.size); ptr += 1) { switch (*ptr) { - case 'L': { - cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding); - aug_flags |= EH_AugFlag_HasLSDA; - } break; - case 'P': { - cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding); - cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip); - aug_flags |= EH_AugFlag_HasHandler; - } break; - case 'R': { - cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); - aug_flags |= EH_AugFlag_HasAddrEnc; - } break; - case 'S': { - aug_flags |= EH_AugFlag_SignalFrame; - } break; - default: { Assert(!"failed to parse augmentation string"); goto exit; } break; + case 'L': { + cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding); + aug_flags |= EH_AugFlag_HasLSDA; + } break; + case 'P': { + cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding); + cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip); + aug_flags |= EH_AugFlag_HasHandler; + } break; + case 'R': { + cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); + aug_flags |= EH_AugFlag_HasAddrEnc; + } break; + case 'S': { + aug_flags |= EH_AugFlag_SignalFrame; + } break; + default: { Assert(!"failed to parse augmentation string"); goto exit; } break; } } } - + if (aug_out) { aug_out->handler_ip = handler_ip; aug_out->handler_encoding = handler_encoding; @@ -173,8 +173,8 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c aug_out->flags = aug_flags; aug_out->size = aug_data_size; } - -exit:; + + exit:; U64 parse_size = cursor; return parse_size; } @@ -185,24 +185,24 @@ eh_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc U32 first_four_bytes = 0; str8_deserial_read_struct(data, off, &first_four_bytes); DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - + U64 length = 0; - U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); + U64 length_size = dw_str8_deserial_read_packed_size(data, off, &length); if (length_size == 0) { goto exit; } - + Rng1U64 entry_range = rng_1u64(off, off + length_size + length); String8 entry_data = str8_substr(data, entry_range); U64 id = 0; - U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); + U64 id_size = dw_str8_deserial_read_fmt_uint(entry_data, length_size, format, &id); if (id_size == 0) { goto exit; } - + desc_out->format = format; desc_out->type = (id == 0) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; desc_out->entry_range = entry_range; desc_out->cie_pointer = id; desc_out->cie_pointer_off = off + length_size; - -exit:; + + exit:; return length + length_size; } @@ -211,17 +211,17 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - + U64 cie_id = 0; - U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); + U64 cie_id_size = dw_str8_deserial_read_fmt_uint(data, cursor, format, &cie_id); if (cie_id_size == 0) { goto exit; } cursor += cie_id_size; - + U8 version = 0; U64 version_size = str8_deserial_read_struct(data, cursor, &version); if (version_size == 0) { goto exit; } cursor += version_size; - + String8 aug_string = {0}; String8 aug_data = {0}; EH_Augmentation aug = {0}; @@ -232,33 +232,33 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); if (aug_string_size == 0) { goto exit; } cursor += aug_string_size; - + U64 eh_data = 0; if (str8_match(aug_string, str8_lit("eh"), 0)) { U64 arch_byte_size = byte_size_from_arch(arch); cursor += str8_deserial_read(data, cursor, &eh_data, arch_byte_size, arch_byte_size); } - + U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); if (code_align_factor_size == 0) { goto exit; } cursor += code_align_factor_size; - + U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); if (data_align_factor_size == 0) { goto exit; } cursor += data_align_factor_size; - + ret_addr_reg = 0; U64 ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); if (ret_addr_reg_size == 0) { goto exit; } cursor += ret_addr_reg_size; - + U64 aug_data_size = eh_parse_aug_data(aug_string, str8_skip(data, cursor), pc + cursor, ptr_ctx, &aug); aug_data = str8_substr(data, r1u64(cursor, cursor + aug.size)); cursor += aug_data_size; } else { Assert(0 && "unexpected version"); } - + cie_out->insts = str8_skip(data, cursor); cie_out->aug_string = aug_string; cie_out->aug_data = aug_data; @@ -269,11 +269,11 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c cie_out->version = version; cie_out->address_size = byte_size_from_arch(arch); cie_out->segment_selector_size = 0; - + cie_out->ext[EH_CIE_Ext_LSDAEnc] = EH_PtrEnc_Omit; cie_out->ext[EH_CIE_Ext_AddrEnc] = EH_PtrEnc_Omit; cie_out->ext[EH_CIE_Ext_HandlerEnc] = EH_PtrEnc_Omit; - + if (aug.flags & EH_AugFlag_HasLSDA) { cie_out->ext[EH_CIE_Ext_LSDAEnc] = aug.lsda_encoding; } @@ -284,9 +284,9 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c cie_out->ext[EH_CIE_Ext_HandlerEnc] = aug.handler_encoding; cie_out->ext[EH_CIE_Ext_HandlerIp ] = aug.handler_ip; } - + is_parsed = 1; -exit:; + exit:; return is_parsed; } @@ -295,7 +295,7 @@ eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 8 : 20; - + U64 pc_begin = 0; U64 pc_delta = 0; EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; @@ -303,21 +303,21 @@ eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr U64 pc_begin_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc, &pc_begin); if (pc_begin_size == 0) { goto exit; } cursor += pc_begin_size; - + U64 pc_delta_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc & EH_PtrEnc_TypeMask, &pc_delta); if (pc_delta_size == 0) { goto exit; } cursor += pc_delta_size; } - + if (cursor + cie->aug_data.size > data.size) { goto exit; } cursor += cie->aug_data.size; - + fde_out->format = format; fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_delta); fde_out->insts = str8_skip(data, cursor); - + is_parsed = 1; -exit:; + exit:; return is_parsed; } @@ -326,7 +326,7 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) { U64 fde_addr = max_U64; U64 fde_idx = max_U64; - + if (header.version == 1) { if (header.fde_count > 0) { U64 first = 0; @@ -339,7 +339,7 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) if (first > pc) { goto exit; } - + U64 last_off = header.table.size - header.entry_byte_size; U64 last = 0; U64 last_size = eh_parse_ptr(header.table, last_off, ptr_ctx->pc_vaddr + last_off, ptr_ctx, header.table_enc, &last); @@ -348,7 +348,7 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) fde_idx = header.fde_count - 1; goto exit; } - + U64 l = 0; U64 r = header.fde_count - 1; while (l <= r) { @@ -366,12 +366,12 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) goto exit; } } - + fde_idx = l > 0 ? l-1 : 0; } } - -exit:; + + exit:; if (fde_idx < header.fde_count) { U64 fde_addr_off = (fde_idx * header.entry_byte_size) + header.field_byte_size; U64 fde_addr_size = eh_parse_ptr(header.table, fde_addr_off, ptr_ctx->pc_vaddr + fde_addr_off, ptr_ctx, header.table_enc, &fde_addr); @@ -390,7 +390,7 @@ internal String8 eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, DW_FDE *fde) { Temp scratch = scratch_begin(&arena, 1); - + // make .eh_frame_hdr String8List srl = {0}; str8_serial_begin(scratch.arena, &srl); @@ -400,14 +400,14 @@ eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // table encoding str8_serial_push_u64(scratch.arena, &srl, fde_count); // fde_count String8 header = str8_serial_end(scratch.arena, &srl); - + // alloc buffer for output U64 buffer_size = header.size + sizeof(EH_FrameHdrEntry) * fde_count; U8 *buffer = push_array(arena, U8, buffer_size); - + // copy header MemoryCopyStr8(buffer, header); - + // write the table EH_FrameHdrEntry *table = (EH_FrameHdrEntry *)(buffer + header.size); for EachIndex(fde_idx, fde_count) { @@ -415,7 +415,7 @@ eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, table[fde_idx].fde_offset = fde_offsets[fde_idx]; } radsort(table, fde_count, eh_frame_hdr_entry_sort); - + String8 eh_frame_hdr = str8(buffer, buffer_size); scratch_end(scratch); return eh_frame_hdr; @@ -432,16 +432,16 @@ internal String8 eh_string_from_ptr_enc_type(EH_PtrEnc type) { switch (type) { - case EH_PtrEnc_Ptr: return str8_lit("Ptr"); - case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); - case EH_PtrEnc_UData2: return str8_lit("UData2"); - case EH_PtrEnc_UData4: return str8_lit("UData4"); - case EH_PtrEnc_UData8: return str8_lit("UData8"); - case EH_PtrEnc_Signed: return str8_lit("Signed"); - case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); - case EH_PtrEnc_SData2: return str8_lit("SData2"); - case EH_PtrEnc_SData4: return str8_lit("SData4"); - case EH_PtrEnc_SData8: return str8_lit("SData8"); + case EH_PtrEnc_Ptr: return str8_lit("Ptr"); + case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); + case EH_PtrEnc_UData2: return str8_lit("UData2"); + case EH_PtrEnc_UData4: return str8_lit("UData4"); + case EH_PtrEnc_UData8: return str8_lit("UData8"); + case EH_PtrEnc_Signed: return str8_lit("Signed"); + case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); + case EH_PtrEnc_SData2: return str8_lit("SData2"); + case EH_PtrEnc_SData4: return str8_lit("SData4"); + case EH_PtrEnc_SData8: return str8_lit("SData8"); } return str8_zero(); } @@ -450,11 +450,11 @@ internal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier) { switch (modifier) { - case EH_PtrEnc_PcRel: return str8_lit("PcRel"); - case EH_PtrEnc_TextRel: return str8_lit("TextRel"); - case EH_PtrEnc_DataRel: return str8_lit("DataRel"); - case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); - case EH_PtrEnc_Aligned: return str8_lit("Aligned"); + case EH_PtrEnc_PcRel: return str8_lit("PcRel"); + case EH_PtrEnc_TextRel: return str8_lit("TextRel"); + case EH_PtrEnc_DataRel: return str8_lit("DataRel"); + case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); + case EH_PtrEnc_Aligned: return str8_lit("Aligned"); } return str8_zero(); } diff --git a/src/dwarf/eh_frame.h b/src/dwarf/eh_frame.h index 9ae4a257..5e8807c7 100644 --- a/src/dwarf/eh_frame.h +++ b/src/dwarf/eh_frame.h @@ -20,7 +20,7 @@ enum EH_PtrEnc_SData2 = 0x0A, // Signed 16-bit value EH_PtrEnc_SData4 = 0x0B, // Signed 32-bit value EH_PtrEnc_SData8 = 0x0C, // Signed 64-bit value - + EH_PtrEnc_TypeMask = 0x0F, }; @@ -31,7 +31,7 @@ enum EH_PtrEnc_DataRel = 0x30, // Value is relative to the .got or .eh_frame_hdr section. EH_PtrEnc_FuncRel = 0x40, // Value is relative to the function. EH_PtrEnc_Aligned = 0x50, // Value is aligned to an address unit sized boundary. - + EH_PtrEnc_ModifierMask = 0x70, }; @@ -104,7 +104,7 @@ typedef struct EH_DecodePtrCtx EH_PtrEnc addr_enc; EH_PtrCtx *ptr_ctx; } EH_DecodePtrCtx; - + //////////////////////////////// internal U64 eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); @@ -123,4 +123,3 @@ internal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier); internal String8 eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc); #endif // EH_FRAME_H - diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 3811d462..802b4ae7 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1099,7 +1099,7 @@ rb_thread_entry_point(void *p) Arch arch = Arch_Null; PE_BinInfo pe = {0}; ELF_Bin elf = {0}; - DW_Input dw = {0}; + DW_Raw dw = {0}; U64 eh_frame_hdr_vaddr = 0; U64 eh_frame_vaddr = 0; String8 eh_frame_hdr = {0}; @@ -1115,7 +1115,7 @@ rb_thread_entry_point(void *p) { elf = elf_bin_from_data(arena, f->data); arch = arch_from_elf_machine(elf.hdr.e_machine); - + for EachIndex(sect_idx, elf.hdr.e_shnum) { ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; @@ -1124,7 +1124,7 @@ rb_thread_entry_point(void *p) { eh_frame_hdr = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); eh_frame_hdr_vaddr = shdr->sh_addr; - + } else if(str8_match(name, str8_lit(".eh_frame"), 0)) { @@ -1141,12 +1141,12 @@ rb_thread_entry_point(void *p) U64 section_count = raw_sections.size / sizeof(COFF_SectionHeader); COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_sections.str; String8 string_table = str8_substr(f->data, pe.string_table_range); - dw = dw_input_from_coff_section_table(arena, f->data, string_table, section_count, section_table); + dw = dw_raw_from_coff_section_table(arena, f->data, string_table, section_count, section_table); } else if(f->format == RB_FileFormat_ELF32 || f->format == RB_FileFormat_ELF64) { - dw = dw_input_from_elf_bin(arena, f->data, &elf); + dw = dw_raw_from_elf_bin(arena, f->data, &elf); } } } @@ -1241,7 +1241,7 @@ rb_thread_entry_point(void *p) } } } - + if(eh_dump_subset_flags) { if(lane_idx() == 0) diff --git a/src/raddump/raddump.c b/src/raddump/raddump.c index 04192a6d..34d6fe06 100644 --- a/src/raddump/raddump.c +++ b/src/raddump/raddump.c @@ -4064,7 +4064,7 @@ pe_print(Arena *arena, String8List *out, String8 indent, String8 raw_data, RD_Op } if (opts & RD_Option_Dwarf) { - DW_Input dwarf_input = dw_input_from_coff_section_table(scratch.arena, raw_data, raw_string_table, file_header->section_count, sections); + DW_Raw dwarf_input = dw_raw_from_coff_section_table(scratch.arena, raw_data, raw_string_table, file_header->section_count, sections); dw_format(arena, out, indent, opts, &dwarf_input, arch, ExecutableImageKind_CoffPe); } @@ -4080,12 +4080,12 @@ elf_print_dwarf_expressions(Arena *arena, String8List *out, String8 indent, Stri ELF_Bin bin = elf_bin_from_data(raw_data); Arch arch = arch_from_elf_machine(bin.hdr.e_machine); - DW_Input dwarf_input = dw_input_from_elf_bin(scratch.arena, raw_data, &bin); + DW_Raw dwarf_input = dw_raw_from_elf_bin(scratch.arena, raw_data, &bin); ELF_Class elf_class = bin.hdr.e_ident[ELF_Identifier_Class]; ExecutableImageKind image_type = elf_class == ELF_Class_32 ? ExecutableImageKind_Elf32 : elf_class == ELF_Class_64 ? ExecutableImageKind_Elf64 : ELF_Class_None; B32 relaxed = 1; Rng1U64List cu_ranges = dw_unit_ranges_from_data(scratch.arena, dwarf_input.sec[DW_Section_Info].data); - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &dwarf_input); + DW_ListUnitInput lu_input = dw_list_unit_input_from_raw(scratch.arena, &dwarf_input); if (bin.hdr.e_type == ELF_Type_Exec || bin.hdr.e_type == ELF_Type_Dyn) { U64 cu_idx = 0; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 880de0b8..760ea3dd 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -136,7 +136,7 @@ d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off) } internal RDIM_Type * -d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; @@ -165,7 +165,7 @@ d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu } internal Rng1U64List -d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) +d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) { // collect non-contiguous range Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); @@ -223,7 +223,7 @@ d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 imag } internal RDIM_Type ** -d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) +d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) { Temp scratch = scratch_begin(&arena, 1); @@ -892,7 +892,7 @@ d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecod internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, - DW_Input *input, + DW_Raw *input, U64 image_base, U64 address_size, Arch arch, @@ -1438,7 +1438,7 @@ d2r_bytecode_from_expression(Arena *arena, } internal RDIM_Location * -d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) +d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Raw *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) { RDIM_Location *loc = 0; if (expr.size) { @@ -1459,7 +1459,7 @@ d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, - DW_Input *input, + DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, @@ -1507,7 +1507,7 @@ d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, - DW_Input *input, + DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, @@ -1687,7 +1687,7 @@ d2r_is_tag_converted(DW_TagNode *tag_node) } internal RDIM_Type * -d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind) +d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind) { RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; @@ -1730,7 +1730,7 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *inpu } internal void -d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root) +d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root); @@ -2146,7 +2146,7 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_C internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, - DW_Input *input, + DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, @@ -2245,7 +2245,7 @@ d2r_convert_udts(Arena *arena, } internal void -d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root) +d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root); @@ -2543,7 +2543,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // Arch arch = Arch_Null; U64 image_base = 0; - DW_Input input = {0}; + DW_Raw input = {0}; PathStyle path_style = PathStyle_Null; switch(params->exe_kind) { @@ -2557,7 +2557,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) arch = pe.arch; image_base = pe.image_base; binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); - input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); + input = dw_raw_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); path_style = PathStyle_WindowsAbsolute; }break; case ExecutableImageKind_Elf32: @@ -2567,7 +2567,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) arch = arch_from_elf_machine(bin.hdr.e_machine); image_base = (bin.hdr.e_type == ELF_Type_Dyn ? 0 : elf_base_addr_from_bin(&bin)); binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, params->dbg_data, &bin, bin.shdrs); - input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); + input = dw_raw_from_elf_bin(scratch.arena, params->dbg_data, &bin); path_style = PathStyle_UnixAbsolute; }break; } @@ -2593,7 +2593,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } //////////////////////////// - //- rjf: unpack input image info + //- rjf: convert top-level-info // { // rjf: base arch -> rdi @@ -2655,7 +2655,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //- rjf: read unit data length U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length); + U64 unit_length_size = dw_str8_deserial_read_packed_size(unit_data, unit_cursor, &unit_length); B32 unit_length_good = (unit_length_size != 0); unit_cursor += unit_length_size; DW_Format unit_format = DW_FormatFromSize(unit_length); @@ -2684,7 +2684,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U8 unit_segment_selector_size = 0; B32 unit_good = 0; { - U64 unit_info_off_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &unit_info_off); + U64 unit_info_off_size = dw_str8_deserial_read_fmt_uint(unit_data, unit_cursor, unit_format, &unit_info_off); unit_cursor += unit_info_off_size; U64 unit_address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &unit_address_size); unit_cursor += unit_address_size_size; @@ -2756,7 +2756,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW_ListUnitInput lu_input = {0}; ProfScope("parse list of comp units") { - lu_input = dw_list_unit_input_from_input(scratch.arena, &input); + lu_input = dw_list_unit_input_from_raw(scratch.arena, &input); } //////////////////////////// @@ -2775,14 +2775,10 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW_CompUnit *cu_arr = 0; ProfScope("parse comp unit headers") { - // TODO(rjf): parse should always be relaxed. any verification checks we do - // should just be logged via log_info(...), and then the caller of this - // converter can collect those & display as necessary. - B32 is_parse_relaxed = 1; cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); for EachIndex(cu_idx, cu_ranges.count) { - cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, is_parse_relaxed); + cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min); } } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 57f5bf41..25cd3770 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -113,9 +113,9 @@ internal RDI_RegCode d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v); internal RDIM_Type * d2r_create_type(Arena *arena, D2R_TypeTable *type_table); internal RDIM_Type * d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off); internal RDIM_Type * d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off); -internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); -internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); +internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); +internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); //////////////////////////////// //~ RDIM Bytecode Helpers @@ -141,10 +141,10 @@ internal D2R_ValueType d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ internal void d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); -internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); -internal RDIM_Location * d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); -internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); +internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Raw *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); +internal RDIM_Location * d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Raw *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); +internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); //////////////////////////////// //~ rjf: Compilation Unit / Scope Conversion Helpers @@ -167,11 +167,11 @@ internal DW_Tag d2r_tag_iter_parent_tag(D2R_TagIter *iter); internal void d2r_flag_converted_tag(DW_TagNode *tag_node); internal B8 d2r_is_tag_converted(DW_TagNode *tag_node); -internal RDIM_Type *d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind); +internal RDIM_Type *d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind); -internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); -internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); -internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); +internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); +internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); +internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); //////////////////////////////// //~ rjf: Main Conversion Entry Point From b8a8ec31c752dceb408a2256a49ed8bff5afd688 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 11 Nov 2025 15:10:16 -0800 Subject: [PATCH 069/850] checkpoint on simplified / stripped down dwarf -> rdi, and dwarf parsing helpers --- src/base/base_strings.c | 4 +- src/dwarf/dwarf_inc.c | 1 + src/dwarf/dwarf_inc.h | 1 + src/dwarf/dwarf_parse.c | 2 - src/dwarf/dwarf_parse.h | 2 - src/dwarf/dwarf_parse_2.c | 487 ++++++++++++++++++++++++++ src/dwarf/dwarf_parse_2.h | 117 +++++++ src/elf/elf_parse.c | 31 +- src/radbin/radbin.c | 151 ++++++-- src/radbin/radbin_main.c | 2 + src/rdi_from_dwarf/rdi_from_dwarf.c | 14 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 311 ++++++++++++++++ src/rdi_from_dwarf/rdi_from_dwarf_2.h | 28 ++ 13 files changed, 1097 insertions(+), 54 deletions(-) create mode 100644 src/dwarf/dwarf_parse_2.c create mode 100644 src/dwarf/dwarf_parse_2.h create mode 100644 src/rdi_from_dwarf/rdi_from_dwarf_2.c create mode 100644 src/rdi_from_dwarf/rdi_from_dwarf_2.h diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 540e8a86..8c3ab290 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -2769,14 +2769,14 @@ str8_serial_push_string(Arena *arena, String8List *srl, String8 str){ internal U64 str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity) { - U64 bytes_left = string.size-Min(off, string.size); + U64 bytes_left = string.size - Min(off, string.size); U64 actually_readable_size = Min(bytes_left, read_size); U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity; if(legally_readable_size > 0) { MemoryCopy(read_dst, string.str+off, legally_readable_size); } - return legally_readable_size; + return actually_readable_size; } internal U64 diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index df0cc700..cf8f939e 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -4,6 +4,7 @@ #include "dwarf/dwarf.c" #include "dwarf/dwarf_expr.c" #include "dwarf/dwarf_parse.c" +#include "dwarf/dwarf_parse_2.c" #include "dwarf/dwarf_coff.c" #include "dwarf/dwarf_elf.c" #include "dwarf/dwarf_unwind.c" diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index 44783a34..1f6937af 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -7,6 +7,7 @@ #include "dwarf/dwarf.h" #include "dwarf/dwarf_expr.h" #include "dwarf/dwarf_parse.h" +#include "dwarf/dwarf_parse_2.h" #include "dwarf/dwarf_coff.h" #include "dwarf/dwarf_elf.h" #include "dwarf/dwarf_unwind.h" diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index f564d80e..415e68cc 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -758,8 +758,6 @@ dw_read_tag(Arena *arena, // fill out node DW_AttribNode *attrib_n = push_array(arena, DW_AttribNode, 1); attrib_n->v.info_off = tag_base + attrib_tag_cursor; - attrib_n->v.abbrev_off = attrib_abbrev_off; - attrib_n->v.abbrev_id = attrib_abbrev.id; attrib_n->v.attrib_kind = attrib_kind; attrib_n->v.form_kind = form_kind; attrib_n->v.form = form; diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index 70c0268d..c67123a1 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -115,8 +115,6 @@ typedef struct DW_Attrib DW_Attrib; struct DW_Attrib { U64 info_off; - U64 abbrev_off; - U64 abbrev_id; DW_AttribKind attrib_kind; DW_FormKind form_kind; DW_Form form; diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c new file mode 100644 index 00000000..409d3bf8 --- /dev/null +++ b/src/dwarf/dwarf_parse_2.c @@ -0,0 +1,487 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Parsing Helpers + +internal U64 +dw2_read_initial_length(String8 data, U64 off, U64 *out, DW_Format *fmt_out) +{ + DW_Format format = DW_Format_32Bit; + U64 size = 0; + U64 size_size = 0; + { + U32 size_or_header = 0; + size_size += str8_deserial_read_struct(data, off, &size_or_header); + if(size_or_header == max_U32) + { + size_size += str8_deserial_read_struct(data, off + size_size, &size); + format = DW_Format_64Bit; + } + else + { + size = (U64)size_or_header; + } + } + if(out) + { + out[0] = size; + } + if(fmt_out) + { + fmt_out[0] = format; + } + return size_size; +} + +internal U64 +dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out) +{ + U64 start_off = off; + switch(format) + { + default: + case DW_Format_32Bit: + { + U32 out_32 = 0; + off += str8_deserial_read_struct(data, off, &out_32); + out[0] = (U64)out_32; + }break; + case DW_Format_64Bit: + { + off += str8_deserial_read_struct(data, off, out); + }break; + } + U64 bytes_read = (off - start_off); + return bytes_read; +} + +//////////////////////////////// +//~ rjf: Unit Header Parsing + +internal U64 +dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out) +{ + U64 start_off = off; + + // rjf: read unit's .debug_info range size / format + U64 unit_info_size = 0; + DW_Format format = DW_Format_32Bit; + off += dw2_read_initial_length(data, off, &unit_info_size, &format); + + // rjf: read dwarf version + DW_Version version = 0; + off += str8_deserial_read_struct(data, off, &version); + + // rjf: read header properties + U64 abbrev_off = max_U64; + U64 addr_size = 0; + DW_CompUnitKind kind = DW_CompUnitKind_Reserved; + U64 dwo_id = 0; + switch((DW_VersionEnum)version) + { + case DW_Version_Null: + case DW_Version_1: + {}break; + + // rjf: @dwarf2 + case DW_Version_2: + { + // rjf: read abbrev off + U32 abbrev_off_32 = 0; + off += str8_deserial_read_struct(data, off, &abbrev_off_32); + abbrev_off = (U64)abbrev_off_32; + + // rjf: read address size + U8 addr_size_8 = 0; + off += str8_deserial_read_struct(data, off, &addr_size_8); + addr_size = (U64)addr_size_8; + }break; + + // rjf: @dwarf3 @dwarf4 + case DW_Version_3: + case DW_Version_4: + { + // rjf: read abbrev off + off += dw2_read_fmt_u64(data, off, format, &abbrev_off); + + // rjf: read address size + U8 addr_size_8 = 0; + off += str8_deserial_read_struct(data, off, &addr_size_8); + addr_size = (U64)addr_size_8; + }break; + + // rjf: @dwarf5 + case DW_Version_5: + { + // rjf: read unit kind + U8 comp_unit_kind_8 = 0; + off += str8_deserial_read_struct(data, off, &comp_unit_kind_8); + kind = (DW_CompUnitKind)comp_unit_kind_8; + + // rjf: read address size + U8 addr_size_8 = 0; + off += str8_deserial_read_struct(data, off, &addr_size_8); + addr_size = (U64)addr_size_8; + + // rjf: read abbrev off + off += dw2_read_fmt_u64(data, off, format, &abbrev_off); + + // rjf: read DWO ID, if applicable + if(kind == DW_CompUnitKind_Skeleton || + kind == DW_CompUnitKind_SplitCompile || + kind == DW_CompUnitKind_SplitType) + { + off += str8_deserial_read_struct(data, off, &dwo_id); + } + }break; + } + + // rjf: fill + out->version = version; + out->format = format; + out->abbrev_off = abbrev_off; + out->addr_size = addr_size; + out->kind = kind; + out->dwo_id = dwo_id; + + // rjf: return # of bytes read + U64 bytes_read = (off - start_off); + return bytes_read; +} + +//////////////////////////////// +//~ rjf: Abbreviation Map Parsing + +internal DW2_AbbrevMap +dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off) +{ + DW2_AbbrevMap map = {0}; + + // rjf: loop - first to determine the number of tag formats encoded + // by this abbrev table, second to actually build a hash table for + // mapping (id -> .debug_abbrev offset) + for(B32 build = 0; build <= 1; build += 1) + { + // rjf: parse whole abbrev table + U64 tag_count = 0; + for(U64 read_off = off;;) + { + U64 start_off = read_off; + + // rjf: read tag abbrev + U64 id = 0; + U64 tag_kind = 0; + U8 has_children = 0; + { + read_off += str8_deserial_read_uleb128(data, read_off, &id); + if(id != 0) + { + read_off += str8_deserial_read_uleb128(data, read_off, &tag_kind); + read_off += str8_deserial_read_struct(data, read_off, &has_children); + } + } + + // rjf: count tag + if(id != 0) + { + tag_count += 1; + } + + // rjf: read all tag attribute abbreviations + if(id != 0) + { + for(;;) + { + U64 attrib_start_off = read_off; + U64 attrib_kind = 0; + U64 attrib_form_kind = 0; + U64 implicit_const = 0; + read_off += str8_deserial_read_uleb128(data, read_off, &attrib_kind); + read_off += str8_deserial_read_uleb128(data, read_off, &attrib_form_kind); + if(attrib_form_kind == DW_Form_ImplicitConst) + { + read_off += str8_deserial_read_uleb128(data, read_off, &implicit_const); + } + if(read_off == attrib_start_off || attrib_kind == 0) + { + break; + } + } + } + + // rjf: if building (second loop) -> insert into map + if(build) + { + U64 hash = u64_hash_from_str8(str8_struct(&id)); + U64 slot_idx = hash%map.slots_count; + DW2_AbbrevMapNode *n = push_array(arena, DW2_AbbrevMapNode, 1); + SLLStackPush(map.slots[slot_idx], n); + n->id = id; + n->off = start_off; + } + + // rjf: no tag ID, or no movement? -> exit + if(read_off == start_off || id == 0) + { + break; + } + } + + // rjf: on first loop iteration, given the tag format count, construct the table + if(!build) + { + map.slots_count = Max(1, tag_count + tag_count/4); + map.slots = push_array(arena, DW2_AbbrevMapNode *, map.slots_count); + } + } + + return map; +} + +//////////////////////////////// +//~ rjf: Tag Parsing + +internal U64 +dw2_read_tag(Arena *arena, DW2_TagParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out) +{ + U64 start_off = off; + + // rjf: read tag's abbrev ID + U64 abbrev_id = 0; + off += str8_deserial_read_uleb128(data, off, &abbrev_id); + + // rjf: map abbrev ID -> abbrev offset + U64 abbrev_off = 0; + { + DW2_AbbrevMap *abbrev_map = ctx->abbrev_map; + U64 hash = u64_hash_from_str8(str8_struct(&abbrev_id)); + U64 slot_idx = hash%abbrev_map->slots_count; + for EachNode(n, DW2_AbbrevMapNode, abbrev_map->slots[slot_idx]) + { + if(n->id == abbrev_id) + { + abbrev_off = n->off; + break; + } + } + } + + // rjf: read abbrev header + U64 tag_kind = 0; + U8 has_children = 0; + U64 attrib_abbrev_read_off = 0; + { + String8 abbrev_data = ctx->abbrev_data; + U64 abbrev_read_off = abbrev_off; + U64 id = 0; + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &id); + if(id != 0) + { + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &tag_kind); + abbrev_read_off += str8_deserial_read_struct(abbrev_data, abbrev_read_off, &has_children); + } + attrib_abbrev_read_off = abbrev_read_off; + } + + // rjf: walk abbrev / info in lock-step; read all tag attributes + DW2_AttribList attribs = {0}; + if(abbrev_id != 0) + { + String8 abbrev_data = ctx->abbrev_data; + U64 abbrev_read_off = attrib_abbrev_read_off; + for(;;) + { + U64 abbrev_start_read_off = abbrev_read_off; + + // rjf: read next attribute abbreviation from .debug_abbrev + U64 attrib_kind = 0; + U64 attrib_form_kind = 0; + U64 implicit_const = 0; + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &attrib_kind); + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &attrib_form_kind); + if(attrib_form_kind == DW_Form_ImplicitConst) + { + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &implicit_const); + } + + // rjf: indirect form -> form kind is encoded in .debug_info (because why not) + if(attrib_form_kind == DW_Form_Indirect) + { + off += str8_deserial_read_uleb128(data, off, &attrib_form_kind); + } + + // rjf: read attribute's value from .debug_info + DW2_AttribVal val = {0}; + if(attrib_kind != 0) + { + U64 bytes_to_read = 0; + switch(attrib_form_kind) + { + //- rjf: no-ops + default: + case DW_Form_Indirect: + case DW_Form_Null: + {}break; + + //- rjf: 1-byte uint reads + case DW_Form_Ref1: + case DW_Form_Data1: + case DW_Form_Flag: + case DW_Form_Strx1: + case DW_Form_Addrx1: + bytes_to_read = 1; goto read_fixed_uint; + + //- rjf: 2-byte uint reads + case DW_Form_Ref2: + case DW_Form_Data2: + case DW_Form_Strx2: + case DW_Form_Addrx2: + bytes_to_read = 2; goto read_fixed_uint; + + //- rjf: 3-byte uint reads + case DW_Form_Strx3: + case DW_Form_Addrx3: + bytes_to_read = 3; goto read_fixed_uint; + + //- rjf: 4-byte uint reads + case DW_Form_Data4: + case DW_Form_Ref4: + case DW_Form_RefSup4: + case DW_Form_Strx4: + case DW_Form_Addrx4: + bytes_to_read = 4; goto read_fixed_uint; + + //- rjf: 8-byte uint reads + case DW_Form_Data8: + case DW_Form_Ref8: + case DW_Form_RefSig8: + case DW_Form_RefSup8: + bytes_to_read = 8; goto read_fixed_uint; + + //- rjf: 16-byte uint reads + case DW_Form_Data16: + bytes_to_read = 16; goto read_fixed_uint; + + //- rjf: address-sized reads + case DW_Form_Addr: + bytes_to_read = ctx->addr_size; goto read_fixed_uint; + + //- rjf: format-defined-size reads + case DW_Form_RefAddr: + case DW_Form_SecOffset: + case DW_Form_LineStrp: + case DW_Form_Strp: + case DW_Form_StrpSup: + bytes_to_read = dw_size_from_format(ctx->format); goto read_fixed_uint; + + //- rjf: fixed-size uint reads + read_fixed_uint: + { + off += str8_deserial_read(data, off, &val.u128.u64[0], bytes_to_read, bytes_to_read); + }break; + + //- rjf: uleb128 reads + case DW_Form_UData: + case DW_Form_RefUData: + case DW_Form_Strx: + case DW_Form_Addrx: + case DW_Form_LocListx: + case DW_Form_RngListx: + { + off += str8_deserial_read_uleb128(data, off, &val.u128.u64[0]); + }break; + + //- rjf: sleb128 reads + case DW_Form_SData: + { + off += str8_deserial_read_sleb128(data, off, &val.u128.u64[0]); + }break; + + //- rjf: fixed-size uint reads / skips + case DW_Form_Block1: bytes_to_read = 1; goto read_fixed_uint_and_skip; + case DW_Form_Block2: bytes_to_read = 2; goto read_fixed_uint_and_skip; + case DW_Form_Block4: bytes_to_read = 4; goto read_fixed_uint_and_skip; + read_fixed_uint_and_skip: + { + U64 size = 0; + U64 og_read_off = off; + off += str8_deserial_read(data, off, &size, bytes_to_read, bytes_to_read); + val.u128.u64[0] = size; + val.u128.u64[1] = og_read_off; + off += size; + }break; + + //- rjf: uleb128 read & skip + case DW_Form_Block: + { + U64 size = 0; + U64 og_read_off = off; + off += str8_deserial_read_uleb128(data, off, &size); + val.u128.u64[0] = size; + val.u128.u64[1] = og_read_off; + off += size; + }break; + + //- rjf: strings + case DW_Form_String: + { + String8 string = {0}; + U64 og_read_off = off; + off += str8_deserial_read_cstr(data, off, &string); + val.u128.u64[0] = og_read_off; + val.u128.u64[1] = og_read_off + string.size - 1; + }break; + + //- rjf: implicit constants (no reading in .debug_info; value comes from .debug_abbrev) + case DW_Form_ImplicitConst: + { + val.u128.u64[0] = implicit_const; + }break; + + //- rjf: exprloc + case DW_Form_ExprLoc: + { + U64 size = 0; + U64 og_read_off = off; + U64 bytes_read = str8_deserial_read_uleb128(data, off, &size); + val.u128.u64[0] = og_read_off + bytes_read; + val.u128.u64[1] = size; + off += bytes_read; + }break; + + //- rjf: flag present + case DW_Form_FlagPresent: + { + val.u128.u64[0] = 1; + }break; + } + } + + // rjf: push + if(attrib_kind != 0) + { + DW2_AttribNode *n = push_array(arena, DW2_AttribNode, 1); + SLLQueuePush(attribs.first, attribs.last, n); + attribs.count += 1; + n->v.attrib_kind = attrib_kind; + n->v.form_kind = attrib_form_kind; + } + + // rjf: no movement, or no attrib kind -> done + if(abbrev_read_off == abbrev_start_read_off || attrib_kind == 0) + { + break; + } + } + } + + // rjf: fill output + tag_out->kind = (DW_TagKind)tag_kind; + tag_out->has_children = !!has_children; + tag_out->attribs = attribs; + + // rjf: return # of bytes read + U64 bytes_read = (off - start_off); + return bytes_read; +} diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h new file mode 100644 index 00000000..258b808a --- /dev/null +++ b/src/dwarf/dwarf_parse_2.h @@ -0,0 +1,117 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_PARSE_2_H +#define DWARF_PARSE_2_H + +//////////////////////////////// +//~ rjf: Unit Headers + +typedef struct DW2_UnitHeader DW2_UnitHeader; +struct DW2_UnitHeader +{ + DW_Version version; + DW_Format format; + U64 abbrev_off; + U64 addr_size; + DW_CompUnitKind kind; + U64 dwo_id; +}; + +//////////////////////////////// +//~ rjf: Abbreviation Map (ID -> .debug_abbrev Offset) + +typedef struct DW2_AbbrevMapNode DW2_AbbrevMapNode; +struct DW2_AbbrevMapNode +{ + DW2_AbbrevMapNode *next; + U64 id; + U64 off; +}; + +typedef struct DW2_AbbrevMap DW2_AbbrevMap; +struct DW2_AbbrevMap +{ + DW2_AbbrevMapNode **slots; + U64 slots_count; +}; + +//////////////////////////////// +//~ rjf: Tag Parsing Context + +typedef struct DW2_TagParseCtx DW2_TagParseCtx; +struct DW2_TagParseCtx +{ + DW_Version version; + DW_Format format; + U64 addr_size; + String8 abbrev_data; + DW2_AbbrevMap *abbrev_map; +}; + +//////////////////////////////// +//~ rjf: Tag Attributes + +typedef struct DW2_AttribVal DW2_AttribVal; +struct DW2_AttribVal +{ + DW_SectionKind section_kind; + U128 u128; +}; + +typedef struct DW2_Attrib DW2_Attrib; +struct DW2_Attrib +{ + DW_AttribKind attrib_kind; + DW_FormKind form_kind; + DW2_AttribVal val; +}; + +typedef struct DW2_AttribNode DW2_AttribNode; +struct DW2_AttribNode +{ + DW2_AttribNode *next; + DW2_Attrib v; +}; + +typedef struct DW2_AttribList DW2_AttribList; +struct DW2_AttribList +{ + DW2_AttribNode *first; + DW2_AttribNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Tags + +typedef struct DW2_Tag DW2_Tag; +struct DW2_Tag +{ + DW_TagKind kind; + B32 has_children; + DW2_AttribList attribs; +}; + +//////////////////////////////// +//~ rjf: Basic Parsing Helpers + +internal U64 dw2_read_initial_length(String8 data, U64 off, U64 *out, DW_Format *fmt_out); +internal U64 dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out); + +//////////////////////////////// +//~ rjf: Unit Header Parsing + +internal U64 dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out); + +//////////////////////////////// +//~ rjf: Abbreviation Map Parsing + +internal DW2_AbbrevMap dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off); + +//////////////////////////////// +//~ rjf: Tag Parsing + +internal U64 dw2_read_tag(Arena *arena, DW2_TagParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); + +#endif // DWARF_PARSE_2_H diff --git a/src/elf/elf_parse.c b/src/elf/elf_parse.c index 77efa627..297965ff 100644 --- a/src/elf/elf_parse.c +++ b/src/elf/elf_parse.c @@ -125,13 +125,16 @@ internal U64 elf_base_addr_from_bin(ELF_Bin *bin) { U64 base_vaddr = 0; - for EachIndex(phdr_idx, bin->phdrs.count) + if(bin->hdr.e_type != ELF_Type_Dyn) { - ELF_Phdr64 *phdr = &bin->phdrs.v[phdr_idx]; - if(phdr->p_type == ELF_PType_Load && - (base_vaddr == 0 || phdr->p_vaddr < base_vaddr)) + for EachIndex(phdr_idx, bin->phdrs.count) { - base_vaddr = phdr->p_vaddr; + ELF_Phdr64 *phdr = &bin->phdrs.v[phdr_idx]; + if(phdr->p_type == ELF_PType_Load && + (base_vaddr == 0 || phdr->p_vaddr < base_vaddr)) + { + base_vaddr = phdr->p_vaddr; + } } } return base_vaddr; @@ -169,42 +172,42 @@ internal ELF_NoteList elf_parse_note(Arena *arena, String8 raw_note, ELF_Class elf_class, ELF_MachineKind e_machine) { ELF_NoteList result = {0}; - + for (U64 cursor = 0; cursor < raw_note.size; ) { U32 owner_size; U64 owner_size_size = str8_deserial_read_struct(raw_note, cursor, &owner_size); if (owner_size_size == 0) { goto exit; } cursor += owner_size_size; - + U32 desc_size; U64 desc_size_size = str8_deserial_read_struct(raw_note, cursor, &desc_size); if (desc_size_size == 0) { goto exit; } cursor += desc_size_size; - + ELF_NoteType type; U64 type_size = str8_deserial_read_struct(raw_note, cursor, &type); if (type_size == 0) { goto exit; } cursor += type_size; - + if (cursor + owner_size > raw_note.size) { goto exit; } String8 owner = str8_cstring_capped(raw_note.str + cursor, raw_note.str + cursor + owner_size); cursor += owner_size; - + if (cursor + desc_size > raw_note.size) { goto exit; } String8 desc = str8_substr(raw_note, r1u64(cursor, cursor + desc_size)); cursor += desc_size; cursor = AlignPow2(cursor, 4); - + ELF_NoteNode *n = push_array(arena, ELF_NoteNode, 1); n->v.owner = owner; n->v.desc = desc; n->v.type = type; - + SLLQueuePush(result.first, result.last, n); result.count += 1; } - -exit:; + + exit:; return result; } diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 802b4ae7..04a74ea5 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -613,12 +613,10 @@ rb_thread_entry_point(void *p) }break; } - //- rjf: convert inputs to RDI info + //- rjf: convert DWARF in inputs to RDI info B32 convert_done = 0; - RDIM_BakeParams pdb_bake_params = {0}; RDIM_BakeParams dwarf_bake_params = {0}; { - //- rjf: PE inputs w/ DWARF, or ELF inputs => DWARF -> RDI conversion B32 pe_w_dwarf = (input_files_from_format_table[RB_FileFormat_PE].count != 0 && input_files_from_format_table[RB_FileFormat_PE].first->v->format_flags & RB_FileFormatFlag_HasDWARF); B32 elf_w_dwarf = (input_files_from_format_table[RB_FileFormat_ELF32].count != 0 || @@ -630,7 +628,103 @@ rb_thread_entry_point(void *p) else if(pe_w_dwarf) { log_infof("PEs w/ DWARF specified; converting DWARF data to RDI\n"); } else if(elf_w_dwarf) { log_infof("ELFs specified; converting DWARF data to RDI\n"); } + // rjf: input files -> exe, exe metadata, & raw dwarf + RB_File *exe_file = &rb_file_nil; + Arch arch = Arch_Null; + U64 base_vaddr = 0; + RDIM_BinarySectionList binary_sections = {0}; + DW_Raw raw = {0}; + B32 got_dwarf = 0; + { + for(RB_FileNode *n = input_files.first; n != 0; n = n->next) + { + // rjf: the first PE w/ DWARF, *or* the first ELF => pick as our exectable + if(exe_file == &rb_file_nil && + ((n->v->format == RB_FileFormat_PE && n->v->format_flags & RB_FileFormatFlag_HasDWARF) || + n->v->format == RB_FileFormat_ELF64 || + n->v->format == RB_FileFormat_ELF32)) + { + exe_file = n->v; + } + + // rjf: PE => get PE info + PE_BinInfo pe = {0}; + if(n->v->format == RB_FileFormat_PE) + { + pe = pe_bin_info_from_data(arena, n->v->data); + if(arch == Arch_Null) + { + arch = pe.arch; + } + if(base_vaddr == 0) + { + base_vaddr = pe.image_base; + } + if(binary_sections.count == 0) + { + String8 raw_sections = str8_substr(n->v->data, pe.section_table_range); + COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader)*pe.section_count); + String8 string_table = str8_substr(n->v->data, pe.string_table_range); + binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, n->v->data, string_table, pe.section_count, section_table); + } + } + + // rjf: ELF => get ELF info + ELF_Bin elf = {0}; + if(n->v->format == RB_FileFormat_ELF32 || + n->v->format == RB_FileFormat_ELF64) + { + elf = elf_bin_from_data(arena, n->v->data); + if(arch == Arch_Null) + { + arch = arch_from_elf_machine(elf.hdr.e_machine); + } + if(base_vaddr == 0) + { + base_vaddr = elf_base_addr_from_bin(&elf); + } + if(binary_sections.count == 0) + { + binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, n->v->data, &elf, elf.shdrs); + } + } + + // rjf: PE w/ DWARF => gather DWARF sections + if(!got_dwarf && n->v->format == RB_FileFormat_PE && n->v->format_flags & RB_FileFormatFlag_HasDWARF) + { + String8 raw_sections = str8_substr(n->v->data, pe.section_table_range); + COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader)*pe.section_count); + String8 string_table = str8_substr(n->v->data, pe.string_table_range); + raw = dw_raw_from_coff_section_table(arena, n->v->data, string_table, pe.section_count, section_table); + got_dwarf = 1; + } + + // rjf: ELF w/ DWARF => gather DWARF sections + if(!got_dwarf && (n->v->format == RB_FileFormat_ELF32 || n->v->format == RB_FileFormat_ELF64) && n->v->format_flags & RB_FileFormatFlag_HasDWARF) + { + raw = dw_raw_from_elf_bin(arena, n->v->data, &elf); + got_dwarf = 1; + } + } + } + + // rjf: convert (NEW) +#if 0 + D2R2_ConvertParams convert_params = {0}; + { + convert_params.exe_name = exe_file->path; + convert_params.exe_data = exe_file->data; + convert_params.arch = arch; + convert_params.base_vaddr = base_vaddr; + convert_params.binary_sections = binary_sections; + convert_params.raw = raw; + convert_params.subset_flags = subset_flags; + convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + } + ProfScope("convert") dwarf_bake_params = d2r2_convert(arena, &convert_params); + // rjf: convert +#else D2R_ConvertParams convert_params = {0}; { B32 got_exe = 0; @@ -710,34 +804,37 @@ rb_thread_entry_point(void *p) convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); +#endif } + } + lane_sync(); + + //- rjf: convert PDB in inputs to RDI info + RDIM_BakeParams pdb_bake_params = {0}; + if(input_files_from_format_table[RB_FileFormat_PDB].count != 0) + { + convert_done = 1; + log_infof("PDBs specified; converting PDB data to RDI\n"); - //- rjf: PDB inputs => PDB -> RDI conversion - if(input_files_from_format_table[RB_FileFormat_PDB].count != 0) + // rjf: get EXE/PDB file data + RB_File *exe_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PE]); + RB_File *pdb_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PDB]); + String8 exe_path = exe_file->path; + String8 pdb_path = pdb_file->path; + String8 exe_data = exe_file->data; + String8 pdb_data = pdb_file->data; + + // rjf: convert + P2R_ConvertParams convert_params = {0}; { - convert_done = 1; - log_infof("PDBs specified; converting PDB data to RDI\n"); - - // rjf: get EXE/PDB file data - RB_File *exe_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PE]); - RB_File *pdb_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PDB]); - String8 exe_path = exe_file->path; - String8 pdb_path = pdb_file->path; - String8 exe_data = exe_file->data; - String8 pdb_data = pdb_file->data; - - // rjf: convert - P2R_ConvertParams convert_params = {0}; - { - convert_params.input_pdb_name = pdb_path; - convert_params.input_exe_name = exe_path; - convert_params.input_pdb_data = pdb_data; - convert_params.input_exe_data = exe_data; - convert_params.subset_flags = subset_flags; - convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); - } - ProfScope("convert") pdb_bake_params = p2r_convert(arena, &convert_params); + convert_params.input_pdb_name = pdb_path; + convert_params.input_exe_name = exe_path; + convert_params.input_pdb_data = pdb_data; + convert_params.input_exe_data = exe_data; + convert_params.subset_flags = subset_flags; + convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } + ProfScope("convert") pdb_bake_params = p2r_convert(arena, &convert_params); } lane_sync(); diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 5b742c04..2769ef3e 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -34,6 +34,7 @@ #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "rdi_from_dwarf/rdi_from_dwarf.h" +#include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "radbin/radbin.h" //- rjf: [c] @@ -60,6 +61,7 @@ #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" #include "rdi_from_dwarf/rdi_from_dwarf.c" +#include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "radbin/radbin.c" //////////////////////////////// diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 760ea3dd..caa0fe21 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2531,13 +2531,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) Temp scratch = scratch_begin(&arena, 1); if(lane_idx() == 0) { - //////////////////////////// - //- rjf: compute exe hash - // - ProfBegin("compute exe hash"); - U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); - ProfEnd(); - //////////////////////////// //- rjf: unpack input image info // @@ -2592,6 +2585,13 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } + //////////////////////////// + //- rjf: compute exe hash + // + ProfBegin("compute exe hash"); + U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); + ProfEnd(); + //////////////////////////// //- rjf: convert top-level-info // diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c new file mode 100644 index 00000000..f83d7197 --- /dev/null +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -0,0 +1,311 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Main Conversion Entry Point (New) + +internal RDIM_BakeParams +d2r2_convert(Arena *arena, D2R2_ConvertParams *params) +{ + Temp scratch = scratch_begin(&arena, 1); + DW_Raw *raw = ¶ms->raw; + RDIM_BinarySectionList binary_sections = params->binary_sections; + Arch arch = params->arch; + U64 base_vaddr = params->base_vaddr; + + //////////////////////////// + //- rjf: determine acceptable address range + // + // in many cases, linkers seem to trample over addresses in various DWARF sections, + // potentially due to optimizations. we'd like to filter out those busted addresses + // from our final debug info - a good enough heuristic is to disqualify them by + // whether or not they actually fall into the ranges covered by the binary sections. + // + Rng1U64 acceptable_vaddr_range = {0}; + { + acceptable_vaddr_range.min = max_U64; + acceptable_vaddr_range.max = 0; + for EachNode(n, RDIM_BinarySectionNode, binary_sections.first) + { + acceptable_vaddr_range.min = Min(base_vaddr + n->v.voff_first, acceptable_vaddr_range.min); + acceptable_vaddr_range.max = Max(base_vaddr + n->v.voff_opl, acceptable_vaddr_range.max); + } + } + + //////////////////////////// + //- rjf: compute exe hash + // + U64 exe_hash = 0; + ProfScope("compute exe hash") + { + if(lane_idx() == 0) + { + exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); + } + lane_sync_u64(&exe_hash, 0); + } + + //////////////////////////// + //- rjf: produce top-level-info + // + RDIM_TopLevelInfo top_level_info = {0}; + ProfScope("produce top-level-info") + { + // rjf: base arch -> rdi + RDI_Arch arch_rdi = RDI_Arch_NULL; + switch(arch) + { + case Arch_Null: + case Arch_arm64: + case Arch_arm32: + case Arch_COUNT: + {}break; + case Arch_x64:{arch_rdi = RDI_Arch_X64;}break; + case Arch_x86:{arch_rdi = RDI_Arch_X86;}break; + } + + // rjf: fill + top_level_info.arch = arch_rdi; + top_level_info.exe_name = params->exe_name; + top_level_info.exe_hash = exe_hash; + top_level_info.voff_max = acceptable_vaddr_range.max - base_vaddr; + if(!params->deterministic) + { + // TODO(rjf): top_level_info.guid = ...; + top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); + } + } + + //////////////////////////// + //- rjf: gather unit ranges from .debug_info + // + Rng1U64Array *unit_info_ranges = 0; + ProfScope("gather unit ranges from .debug_info") if(lane_idx() == 0) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + String8 data = raw->sec[DW_Section_Info].data; + Rng1U64List unit_info_ranges_list = {0}; + for(U64 off = 0; off < data.size;) + { + U64 start_off = off; + + // rjf: read next unit info size + U64 unit_info_size = 0; + U64 unit_info_size_size = dw2_read_initial_length(data, off, &unit_info_size, 0); + + // rjf: push + if(unit_info_size > 0) + { + rng1u64_list_push(scratch2.arena, &unit_info_ranges_list, r1u64(off, off + unit_info_size_size + unit_info_size)); + } + + // rjf: advance + off += unit_info_size_size; + off += unit_info_size; + + // rjf: break if no movement + if(off == start_off) + { + break; + } + } + unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); + unit_info_ranges[0] = rng1u64_array_from_list(scratch.arena, &unit_info_ranges_list); + scratch_end(scratch2); + } + lane_sync_u64(&unit_info_ranges, 0); + U64 unit_count = unit_info_ranges->count; + + //////////////////////////// + //- rjf: parse all unit headers + // + DW2_UnitHeader *unit_headers = 0; + Rng1U64 *unit_info_tag_ranges = 0; + ProfScope("parse all unit headers") + { + // rjf: set up + if(lane_idx() == 0) + { + unit_headers = push_array(scratch.arena, DW2_UnitHeader, unit_count); + unit_info_tag_ranges = push_array(scratch.arena, Rng1U64, unit_count); + } + lane_sync_u64(&unit_headers, 0); + lane_sync_u64(&unit_info_tag_ranges, 0); + + // rjf: parse all unit headers + String8 data = raw->sec[DW_Section_Info].data; + Rng1U64 range = lane_range(unit_count); + for EachInRange(idx, range) + { + Rng1U64 unit_info_range = unit_info_ranges->v[idx]; + U64 bytes_read = dw2_read_unit_header(str8_substr(data, unit_info_range), 0, &unit_headers[idx]); + unit_info_tag_ranges[idx] = r1u64(unit_info_range.min + bytes_read, unit_info_range.max); + } + } + lane_sync(); + + //////////////////////////// + //- rjf: build all abbreviation maps, build (unit -> abbrev map) + // + U64 abbrev_map_count = 0; + U64 *abbrev_map_off_from_idx_table = 0; + DW2_AbbrevMap *abbrev_map_from_idx_table = 0; + DW2_AbbrevMap **abbrev_map_from_unit_idx_table = 0; + ProfScope("build all abbreviation maps, build (unit -> abbrev map)") + { + //- rjf: gather deduplicated .debug_abbrev offsets, representing beginnings + // of abbreviation tables. we want to do this because many units may refer + // to the same abbreviation table. + // + typedef struct AbbrevOffNode AbbrevOffNode; + struct AbbrevOffNode + { + AbbrevOffNode *order_next; + AbbrevOffNode *hash_next; + U64 off; + U64 idx; + }; + U64 abbrev_off_slots_count = unit_count; + AbbrevOffNode **abbrev_off_slots = 0; + ProfScope("gather deduplicated .debug_abbrev offsets") if(lane_idx() == 0) + { + AbbrevOffNode *abbrev_off_first = 0; + AbbrevOffNode *abbrev_off_last = 0; + abbrev_off_slots = push_array(scratch.arena, AbbrevOffNode *, abbrev_off_slots_count); + for EachIndex(unit_idx, unit_count) + { + U64 abbrev_off = unit_headers[unit_idx].abbrev_off; + U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); + U64 slot_idx = hash%abbrev_off_slots_count; + AbbrevOffNode *node = 0; + for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->off == abbrev_off) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(scratch.arena, AbbrevOffNode, 1); + SLLStackPush_N(abbrev_off_slots[slot_idx], node, hash_next); + SLLQueuePush_N(abbrev_off_first, abbrev_off_last, node, order_next); + node->off = abbrev_off; + node->idx = abbrev_map_count; + abbrev_map_count += 1; + } + } + abbrev_map_off_from_idx_table = push_array(scratch.arena, U64, abbrev_map_count); + abbrev_map_from_idx_table = push_array(scratch.arena, DW2_AbbrevMap, abbrev_map_count); + abbrev_map_from_unit_idx_table = push_array(scratch.arena, DW2_AbbrevMap *, unit_count); + { + U64 abbrev_map_idx = 0; + for(AbbrevOffNode *n = abbrev_off_first; n != 0; n = n->order_next) + { + abbrev_map_off_from_idx_table[abbrev_map_idx] = n->off; + abbrev_map_idx += 1; + } + } + } + lane_sync_u64(&abbrev_off_slots, 0); + lane_sync_u64(&abbrev_map_count, 0); + lane_sync_u64(&abbrev_map_off_from_idx_table, 0); + lane_sync_u64(&abbrev_map_from_idx_table, 0); + lane_sync_u64(&abbrev_map_from_unit_idx_table, 0); + + //- rjf: build all unique abbreviation maps + ProfScope("build all unique abbreviation maps") + { + String8 abbrev_data = raw->sec[DW_Section_Abbrev].data; + U64 abbrev_map_take_idx = 0; + U64 *abbrev_map_take_idx_ptr = &abbrev_map_take_idx; + lane_sync_u64(&abbrev_map_take_idx_ptr, 0); + for(;;) + { + U64 abbrev_map_idx = ins_atomic_u64_inc_eval(abbrev_map_take_idx_ptr) - 1; + if(abbrev_map_idx >= abbrev_map_count) + { + break; + } + abbrev_map_from_idx_table[abbrev_map_idx] = dw2_abbrev_map_from_data(scratch.arena, abbrev_data, abbrev_map_off_from_idx_table[abbrev_map_idx]); + } + } + + //- rjf: build unit -> abbrev map table + ProfScope("build unit -> abbrev map table") + { + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + U64 abbrev_off = unit_headers[unit_idx].abbrev_off; + U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); + U64 slot_idx = hash%abbrev_off_slots_count; + U64 abbrev_map_idx = 0; + for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->off == abbrev_off) + { + abbrev_map_idx = n->idx; + break; + } + } + abbrev_map_from_unit_idx_table[unit_idx] = &abbrev_map_from_idx_table[abbrev_map_idx]; + } + } + } + lane_sync(); + + //////////////////////////// + //- rjf: build per-unit tag parsing contexts + // + DW2_TagParseCtx *unit_tag_parse_ctxs = 0; + { + if(lane_idx() == 0) + { + unit_tag_parse_ctxs = push_array(scratch.arena, DW2_TagParseCtx, unit_count); + } + lane_sync_u64(&unit_tag_parse_ctxs, 0); + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + DW2_UnitHeader *hdr = &unit_headers[unit_idx]; + DW2_TagParseCtx *ctx = &unit_tag_parse_ctxs[unit_idx]; + ctx->version = hdr->version; + ctx->format = hdr->format; + ctx->addr_size = hdr->addr_size; + ctx->abbrev_data = raw->sec[DW_Section_Abbrev].data; + ctx->abbrev_map = abbrev_map_from_unit_idx_table[unit_idx]; + } + } + lane_sync(); + + //////////////////////////// + //- rjf: parse each unit's root-level tag + // + DW2_Tag *unit_root_tags = 0; + { + if(lane_idx() == 0) + { + unit_root_tags = push_array(scratch.arena, DW2_Tag, unit_count); + } + lane_sync_u64(&unit_root_tags, 0); + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + dw2_read_tag(scratch.arena, &unit_tag_parse_ctxs[unit_idx], raw->sec[DW_Section_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags[unit_idx]); + } + } + lane_sync(); + + //////////////////////////// + //- rjf: fill result + // + RDIM_BakeParams result = {0}; + { + // TODO(rjf) + } + + scratch_end(scratch); + return result; +} diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h new file mode 100644 index 00000000..b25d3d57 --- /dev/null +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -0,0 +1,28 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_FROM_DWARF_2_H +#define RDI_FROM_DWARF_2_H + +//////////////////////////////// +//~ rjf: Conversion Stage Inputs (New) + +typedef struct D2R2_ConvertParams D2R2_ConvertParams; +struct D2R2_ConvertParams +{ + String8 exe_name; + String8 exe_data; + Arch arch; + U64 base_vaddr; + RDIM_BinarySectionList binary_sections; + DW_Raw raw; + RDIM_SubsetFlags subset_flags; + B32 deterministic; +}; + +//////////////////////////////// +//~ rjf: Main Conversion Entry Point (New) + +internal RDIM_BakeParams d2r2_convert(Arena *arena, D2R2_ConvertParams *params); + +#endif // RDI_FROM_DWARF_2_H From faee02f763d4b7fe52c5584f26a4a0ff9992994e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 11 Nov 2025 16:27:16 -0800 Subject: [PATCH 070/850] simplified dwarf parsing checkpoint: pull out form value reading, line table header parsing --- src/dwarf/dwarf_parse_2.c | 594 +++++++++++++++++++------- src/dwarf/dwarf_parse_2.h | 88 +++- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 14 +- 3 files changed, 536 insertions(+), 160 deletions(-) diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 409d3bf8..d4e86ed9 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -239,11 +239,176 @@ dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off) return map; } +//////////////////////////////// +//~ rjf: Form Value Parsing + +internal U64 +dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out) +{ + U64 start_off = off; + DW2_FormVal val = {0}; + { + U64 bytes_to_read = 0; + switch(form_kind) + { + //- rjf: no-ops + default: + case DW_Form_Indirect: + case DW_Form_Null: + {}break; + + //- rjf: 1-byte uint reads + case DW_Form_Ref1: + case DW_Form_Data1: + case DW_Form_Flag: + case DW_Form_Strx1: + case DW_Form_Addrx1: + bytes_to_read = 1; goto read_fixed_uint; + + //- rjf: 2-byte uint reads + case DW_Form_Ref2: + case DW_Form_Data2: + case DW_Form_Strx2: + case DW_Form_Addrx2: + bytes_to_read = 2; goto read_fixed_uint; + + //- rjf: 3-byte uint reads + case DW_Form_Strx3: + case DW_Form_Addrx3: + bytes_to_read = 3; goto read_fixed_uint; + + //- rjf: 4-byte uint reads + case DW_Form_Data4: + case DW_Form_Ref4: + case DW_Form_RefSup4: + case DW_Form_Strx4: + case DW_Form_Addrx4: + bytes_to_read = 4; goto read_fixed_uint; + + //- rjf: 8-byte uint reads + case DW_Form_Data8: + case DW_Form_Ref8: + case DW_Form_RefSig8: + case DW_Form_RefSup8: + bytes_to_read = 8; goto read_fixed_uint; + + //- rjf: 16-byte uint reads + case DW_Form_Data16: + bytes_to_read = 16; goto read_fixed_uint; + + //- rjf: address-sized reads + case DW_Form_Addr: + bytes_to_read = ctx->addr_size; goto read_fixed_uint; + + //- rjf: format-defined-size reads + case DW_Form_RefAddr: + case DW_Form_SecOffset: + case DW_Form_LineStrp: + case DW_Form_Strp: + case DW_Form_StrpSup: + bytes_to_read = dw_size_from_format(ctx->format); goto read_fixed_uint; + + //- rjf: fixed-size uint reads + read_fixed_uint: + { + off += str8_deserial_read(data, off, &val.u128.u64[0], bytes_to_read, bytes_to_read); + }break; + + //- rjf: uleb128 reads + case DW_Form_UData: + case DW_Form_RefUData: + case DW_Form_Strx: + case DW_Form_Addrx: + case DW_Form_LocListx: + case DW_Form_RngListx: + { + off += str8_deserial_read_uleb128(data, off, &val.u128.u64[0]); + }break; + + //- rjf: sleb128 reads + case DW_Form_SData: + { + off += str8_deserial_read_sleb128(data, off, &val.u128.u64[0]); + }break; + + //- rjf: fixed-size uint reads / skips + case DW_Form_Block1: bytes_to_read = 1; goto read_fixed_uint_and_skip; + case DW_Form_Block2: bytes_to_read = 2; goto read_fixed_uint_and_skip; + case DW_Form_Block4: bytes_to_read = 4; goto read_fixed_uint_and_skip; + read_fixed_uint_and_skip: + { + U64 size = 0; + U64 og_read_off = off; + off += str8_deserial_read(data, off, &size, bytes_to_read, bytes_to_read); + val.u128.u64[0] = size; + val.u128.u64[1] = og_read_off; + off += size; + }break; + + //- rjf: uleb128 read & skip + case DW_Form_Block: + { + U64 size = 0; + U64 og_read_off = off; + off += str8_deserial_read_uleb128(data, off, &size); + val.u128.u64[0] = size; + val.u128.u64[1] = og_read_off; + off += size; + }break; + + //- rjf: strings + case DW_Form_String: + { + String8 string = {0}; + U64 og_read_off = off; + off += str8_deserial_read_cstr(data, off, &string); + val.u128.u64[0] = og_read_off; + val.u128.u64[1] = og_read_off + string.size - 1; + }break; + + //- rjf: implicit constants (no reading in .debug_info; value comes from .debug_abbrev) + case DW_Form_ImplicitConst: + { + val.u128.u64[0] = implicit_const; + }break; + + //- rjf: exprloc + case DW_Form_ExprLoc: + { + U64 size = 0; + U64 og_read_off = off; + U64 bytes_read = str8_deserial_read_uleb128(data, off, &size); + val.u128.u64[0] = og_read_off + bytes_read; + val.u128.u64[1] = size; + off += bytes_read; + }break; + + //- rjf: flag present + case DW_Form_FlagPresent: + { + val.u128.u64[0] = 1; + }break; + } + } + *out = val; + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal String8 +dw2_string_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal val) +{ + String8 section_data = ctx->raw->sec[val.section_kind].data; + Rng1U64 range = r1u64(val.u128.u64[0], val.u128.u64[1]); + String8 string = str8_substr(section_data, range); + return string; +} + //////////////////////////////// //~ rjf: Tag Parsing internal U64 -dw2_read_tag(Arena *arena, DW2_TagParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out) +dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out) { U64 start_off = off; @@ -272,7 +437,7 @@ dw2_read_tag(Arena *arena, DW2_TagParseCtx *ctx, String8 data, U64 off, DW2_Tag U8 has_children = 0; U64 attrib_abbrev_read_off = 0; { - String8 abbrev_data = ctx->abbrev_data; + String8 abbrev_data = ctx->raw->sec[DW_Section_Abbrev].data; U64 abbrev_read_off = abbrev_off; U64 id = 0; abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &id); @@ -288,7 +453,7 @@ dw2_read_tag(Arena *arena, DW2_TagParseCtx *ctx, String8 data, U64 off, DW2_Tag DW2_AttribList attribs = {0}; if(abbrev_id != 0) { - String8 abbrev_data = ctx->abbrev_data; + String8 abbrev_data = ctx->raw->sec[DW_Section_Abbrev].data; U64 abbrev_read_off = attrib_abbrev_read_off; for(;;) { @@ -312,150 +477,10 @@ dw2_read_tag(Arena *arena, DW2_TagParseCtx *ctx, String8 data, U64 off, DW2_Tag } // rjf: read attribute's value from .debug_info - DW2_AttribVal val = {0}; + DW2_FormVal val = {0}; if(attrib_kind != 0) { - U64 bytes_to_read = 0; - switch(attrib_form_kind) - { - //- rjf: no-ops - default: - case DW_Form_Indirect: - case DW_Form_Null: - {}break; - - //- rjf: 1-byte uint reads - case DW_Form_Ref1: - case DW_Form_Data1: - case DW_Form_Flag: - case DW_Form_Strx1: - case DW_Form_Addrx1: - bytes_to_read = 1; goto read_fixed_uint; - - //- rjf: 2-byte uint reads - case DW_Form_Ref2: - case DW_Form_Data2: - case DW_Form_Strx2: - case DW_Form_Addrx2: - bytes_to_read = 2; goto read_fixed_uint; - - //- rjf: 3-byte uint reads - case DW_Form_Strx3: - case DW_Form_Addrx3: - bytes_to_read = 3; goto read_fixed_uint; - - //- rjf: 4-byte uint reads - case DW_Form_Data4: - case DW_Form_Ref4: - case DW_Form_RefSup4: - case DW_Form_Strx4: - case DW_Form_Addrx4: - bytes_to_read = 4; goto read_fixed_uint; - - //- rjf: 8-byte uint reads - case DW_Form_Data8: - case DW_Form_Ref8: - case DW_Form_RefSig8: - case DW_Form_RefSup8: - bytes_to_read = 8; goto read_fixed_uint; - - //- rjf: 16-byte uint reads - case DW_Form_Data16: - bytes_to_read = 16; goto read_fixed_uint; - - //- rjf: address-sized reads - case DW_Form_Addr: - bytes_to_read = ctx->addr_size; goto read_fixed_uint; - - //- rjf: format-defined-size reads - case DW_Form_RefAddr: - case DW_Form_SecOffset: - case DW_Form_LineStrp: - case DW_Form_Strp: - case DW_Form_StrpSup: - bytes_to_read = dw_size_from_format(ctx->format); goto read_fixed_uint; - - //- rjf: fixed-size uint reads - read_fixed_uint: - { - off += str8_deserial_read(data, off, &val.u128.u64[0], bytes_to_read, bytes_to_read); - }break; - - //- rjf: uleb128 reads - case DW_Form_UData: - case DW_Form_RefUData: - case DW_Form_Strx: - case DW_Form_Addrx: - case DW_Form_LocListx: - case DW_Form_RngListx: - { - off += str8_deserial_read_uleb128(data, off, &val.u128.u64[0]); - }break; - - //- rjf: sleb128 reads - case DW_Form_SData: - { - off += str8_deserial_read_sleb128(data, off, &val.u128.u64[0]); - }break; - - //- rjf: fixed-size uint reads / skips - case DW_Form_Block1: bytes_to_read = 1; goto read_fixed_uint_and_skip; - case DW_Form_Block2: bytes_to_read = 2; goto read_fixed_uint_and_skip; - case DW_Form_Block4: bytes_to_read = 4; goto read_fixed_uint_and_skip; - read_fixed_uint_and_skip: - { - U64 size = 0; - U64 og_read_off = off; - off += str8_deserial_read(data, off, &size, bytes_to_read, bytes_to_read); - val.u128.u64[0] = size; - val.u128.u64[1] = og_read_off; - off += size; - }break; - - //- rjf: uleb128 read & skip - case DW_Form_Block: - { - U64 size = 0; - U64 og_read_off = off; - off += str8_deserial_read_uleb128(data, off, &size); - val.u128.u64[0] = size; - val.u128.u64[1] = og_read_off; - off += size; - }break; - - //- rjf: strings - case DW_Form_String: - { - String8 string = {0}; - U64 og_read_off = off; - off += str8_deserial_read_cstr(data, off, &string); - val.u128.u64[0] = og_read_off; - val.u128.u64[1] = og_read_off + string.size - 1; - }break; - - //- rjf: implicit constants (no reading in .debug_info; value comes from .debug_abbrev) - case DW_Form_ImplicitConst: - { - val.u128.u64[0] = implicit_const; - }break; - - //- rjf: exprloc - case DW_Form_ExprLoc: - { - U64 size = 0; - U64 og_read_off = off; - U64 bytes_read = str8_deserial_read_uleb128(data, off, &size); - val.u128.u64[0] = og_read_off + bytes_read; - val.u128.u64[1] = size; - off += bytes_read; - }break; - - //- rjf: flag present - case DW_Form_FlagPresent: - { - val.u128.u64[0] = 1; - }break; - } + off += dw2_read_form_val(ctx, data, off, attrib_form_kind, implicit_const, &val); } // rjf: push @@ -485,3 +510,282 @@ dw2_read_tag(Arena *arena, DW2_TagParseCtx *ctx, String8 data, U64 off, DW2_Tag U64 bytes_read = (off - start_off); return bytes_read; } + +//////////////////////////////// +//~ rjf: Line Table Parsing + +internal U64 +dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out) +{ + Temp scratch = scratch_begin(&arena, 1); + U64 start_off = 0; + + ////////////////////////////// + //- rjf: read unit length + // + U64 unit_length = 0; + DW_Format format = DW_Format_32Bit; + off += dw2_read_initial_length(data, off, &unit_length, &format); + U64 off_opl = off + unit_length; + + ////////////////////////////// + //- rjf: read version + // + DW_Version version = DW_Version_Null; + off += str8_deserial_read_struct(data, off, &version); + + ////////////////////////////// + //- rjf: read address / segment selector sizes + // + U8 addr_size = 0; + U8 segment_selector_size = 0; + switch(version) + { + // NOTE(rjf): pre-dwarf5: assume from context + default: + { + addr_size = ctx->addr_size; + }break; + + // NOTE(rjf): @dwarf5 read address / segment selector sizes explicitly + case DW_Version_5: + { + off += str8_deserial_read_struct(data, off, &addr_size); + off += str8_deserial_read_struct(data, off, &segment_selector_size); + }break; + } + + ////////////////////////////// + //- rjf: read all remaining flat header properties + // + U64 header_length = 0; + U8 min_inst_length = 0; + U8 max_ops_per_inst = 1; + U8 default_is_stmt = 0; + S8 line_base = 0; + U8 line_range = 0; + U8 opcode_base = 0; + { + off += dw2_read_fmt_u64(data, off, format, &header_length); + off += str8_deserial_read_struct(data, off, &min_inst_length); + off += str8_deserial_read_struct(data, off, &max_ops_per_inst); + off += str8_deserial_read_struct(data, off, &default_is_stmt); + off += str8_deserial_read_struct(data, off, &line_base); + off += str8_deserial_read_struct(data, off, &line_range); + off += str8_deserial_read_struct(data, off, &opcode_base); + } + + ////////////////////////////// + //- rjf: read opcode lengths + // + U64 opcode_lengths_count = (opcode_base > 0 ? opcode_base - 1 : 0); + U8 *opcode_lengths = 0; + if(opcode_lengths_count > 0) + { + opcode_lengths = str8_skip(data, off).str; + off += sizeof(opcode_lengths[0]) * opcode_lengths_count; + } + + ////////////////////////////// + //- rjf: read directory / file tables + // + DW2_LineTableFileArray dirs = {0}; + DW2_LineTableFileArray files = {0}; + switch(version) + { + //////////////////////////// + //- rjf: pre-dwarf5: simple(r) well-defined format... still ulebs everywhere but oh well... + // just wait until the next case... + // + default: + { + //- rjf: gather directories + DW2_LineTableFileList dir_list = {0}; + { + // rjf: push compile directory as first list element, always + { + DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); + SLLQueuePush(dir_list.first, dir_list.last, n); + dir_list.count += 1; + n->v.file_name = ctx->unit_dir; + } + + // rjf: gather additional directories + for(;off < off_opl;) + { + String8 dir = {0}; + off += str8_deserial_read_cstr(data, off, &dir); + if(dir.size != 0) + { + DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); + SLLQueuePush(dir_list.first, dir_list.last, n); + dir_list.count += 1; + n->v.file_name = dir; + } + else + { + break; + } + } + } + + //- rjf: gather files + DW2_LineTableFileList file_list = {0}; + { + // rjf: push main compilation unit file as first list element, always + { + DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); + SLLQueuePush(file_list.first, file_list.last, n); + file_list.count += 1; + n->v.file_name = ctx->unit_file; + } + + // rjf: gather additional files + for(;off < off_opl;) + { + String8 file_name = {0}; + U64 dir_idx = 0; + U64 modify_time = 0; + U64 file_size = 0; + off += str8_deserial_read_cstr(data, off, &file_name); + off += str8_deserial_read_uleb128(data, off, &dir_idx); + off += str8_deserial_read_uleb128(data, off, &modify_time); + off += str8_deserial_read_uleb128(data, off, &file_size); + if(file_name.size != 0) + { + DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); + SLLQueuePush(file_list.first, file_list.last, n); + file_list.count += 1; + n->v.file_name = file_name; + n->v.dir_idx = dir_idx; + n->v.modify_time = modify_time; + n->v.file_size = file_size; + } + } + } + + //- rjf: flatten + { + dirs.count = dir_list.count; + dirs.v = push_array(arena, DW2_LineTableFile, dirs.count); + files.count = file_list.count; + files.v = push_array(arena, DW2_LineTableFile, files.count); + { + U64 idx = 0; + for EachNode(n, DW2_LineTableFileNode, dir_list.first) + { + MemoryCopyStruct(&dirs.v[idx], &n->v); + idx += 1; + } + } + { + U64 idx = 0; + for EachNode(n, DW2_LineTableFileNode, file_list.first) + { + MemoryCopyStruct(&files.v[idx], &n->v); + idx += 1; + } + } + } + }break; + + //////////////////////////// + //- rjf: @dwarf5: another VM! d'oh. :( + // + case DW_Version_5: + { + //- rjf: read directory & file tables + for(B32 files = 0, dirs = 1; files <= 1; files = 1, dirs = 0) + { + // rjf: read header + U8 entry_formats_count = 0; + off += str8_deserial_read_struct(data, off, &entry_formats_count); + U64 *entry_formats = push_array(scratch.arena, U64, entry_formats_count*2); + for EachIndex(idx, entry_formats_count) + { + off += str8_deserial_read_uleb128(data, off, &entry_formats[idx]); + } + U64 table_count = 0; + off += str8_deserial_read_uleb128(data, off, &table_count); + + // rjf: read all table entries + DW2_LineTableFileArray table = {0}; + table.count = table_count; + table.v = push_array(arena, DW2_LineTableFile, table.count); + { + U64 idx = 0; + for(;off < off_opl && idx < table.count; idx += 1) + { + DW2_LineTableFile *entry_out = &table.v[idx]; + for(U64 entry_format_idx = 0; entry_format_idx < entry_formats_count; entry_format_idx += 1) + { + DW_LNCT lnct = (DW_LNCT)entry_formats[entry_format_idx*2 + 0]; + DW_FormKind form_kind = (DW_FormKind)entry_formats[entry_format_idx*2 + 1]; + DW2_FormVal form_val = {0}; + off += dw2_read_form_val(ctx, data, off, form_kind, 0, &form_val); + switch(lnct) + { + default: + { + log_infof("DWARF LNCT encoding not currently supported (0x%I64x).\n", (U64)lnct); + }break; + case DW_LNCT_Path: + { + entry_out->file_name = dw2_string_from_form_val(ctx, form_val); + }break; + case DW_LNCT_DirectoryIndex: + { + entry_out->dir_idx = form_val.u128.u64[0]; + }break; + case DW_LNCT_TimeStamp: + { + entry_out->modify_time = form_val.u128.u64[0]; + }break; + case DW_LNCT_Size: + { + entry_out->file_size = form_val.u128.u64[0]; + }break; + case DW_LNCT_MD5: + { + entry_out->md5.u128 = form_val.u128; + }break; + case DW_LNCT_LLVM_Source: + { + entry_out->source = dw2_string_from_form_val(ctx, form_val); + }break; + } + } + } + } + } + + }break; + } + + ////////////////////////////// + //- rjf: fill output + // + if(out) + { + out->unit_length = unit_length; + out->format = format; + out->version = version; + out->addr_size = addr_size; + out->segment_selector_size = segment_selector_size; + out->header_length = header_length; + out->min_inst_length = min_inst_length; + out->max_ops_per_inst = max_ops_per_inst; + out->default_is_stmt = default_is_stmt; + out->line_base = line_base; + out->line_range = line_range; + out->opcode_base = opcode_base; + out->opcode_lengths_count = opcode_lengths_count; + out->opcode_lengths = opcode_lengths; + out->dirs = dirs; + out->files = files; + } + + U64 bytes_read = (off - start_off); + scratch_end(scratch); + return bytes_read; +} diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index 258b808a..d8096846 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -37,23 +37,27 @@ struct DW2_AbbrevMap }; //////////////////////////////// -//~ rjf: Tag Parsing Context +//~ rjf: Parsing Context Bundle -typedef struct DW2_TagParseCtx DW2_TagParseCtx; -struct DW2_TagParseCtx +typedef struct DW2_ParseCtx DW2_ParseCtx; +struct DW2_ParseCtx { + DW_Raw *raw; + // NOTE(rjf): all subsequent fields optional - top-level code fills out whatever + // it can from context. DW_Version version; DW_Format format; U64 addr_size; - String8 abbrev_data; DW2_AbbrevMap *abbrev_map; + String8 unit_dir; + String8 unit_file; }; //////////////////////////////// //~ rjf: Tag Attributes -typedef struct DW2_AttribVal DW2_AttribVal; -struct DW2_AttribVal +typedef struct DW2_FormVal DW2_FormVal; +struct DW2_FormVal { DW_SectionKind section_kind; U128 u128; @@ -64,7 +68,7 @@ struct DW2_Attrib { DW_AttribKind attrib_kind; DW_FormKind form_kind; - DW2_AttribVal val; + DW2_FormVal val; }; typedef struct DW2_AttribNode DW2_AttribNode; @@ -93,6 +97,63 @@ struct DW2_Tag DW2_AttribList attribs; }; +//////////////////////////////// +//~ rjf: Line Info + +typedef struct DW2_LineTableFile DW2_LineTableFile; +struct DW2_LineTableFile +{ + String8 file_name; + U64 dir_idx; + U64 modify_time; + U64 file_size; + MD5 md5; + String8 source; +}; + +typedef struct DW2_LineTableFileNode DW2_LineTableFileNode; +struct DW2_LineTableFileNode +{ + DW2_LineTableFileNode *next; + DW2_LineTableFile v; +}; + +typedef struct DW2_LineTableFileList DW2_LineTableFileList; +struct DW2_LineTableFileList +{ + DW2_LineTableFileNode *first; + DW2_LineTableFileNode *last; + U64 count; +}; + +typedef struct DW2_LineTableFileArray DW2_LineTableFileArray; +struct DW2_LineTableFileArray +{ + DW2_LineTableFile *v; + U64 count; +}; + +typedef struct DW2_LineTableHeader DW2_LineTableHeader; +struct DW2_LineTableHeader +{ + U64 unit_length; + DW_Format format; + DW_Version version; + U8 addr_size; + U8 segment_selector_size; + U64 header_length; + U8 min_inst_length; + U8 max_ops_per_inst; + U8 default_is_stmt; + S8 line_base; + U8 line_range; + U8 opcode_base; + U64 opcode_lengths_count; + U8 *opcode_lengths; + DW2_LineTableFileArray dirs; + DW2_LineTableFileArray files; +}; + //////////////////////////////// //~ rjf: Basic Parsing Helpers @@ -109,9 +170,20 @@ internal U64 dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out); internal DW2_AbbrevMap dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off); +//////////////////////////////// +//~ rjf: Form Value Parsing + +internal U64 dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out); +internal String8 dw2_string_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal val); + //////////////////////////////// //~ rjf: Tag Parsing -internal U64 dw2_read_tag(Arena *arena, DW2_TagParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); +internal U64 dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); + +//////////////////////////////// +//~ rjf: Line Table Parsing + +internal U64 dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out); #endif // DWARF_PARSE_2_H diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index f83d7197..f3e9bcd2 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -257,24 +257,24 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync(); //////////////////////////// - //- rjf: build per-unit tag parsing contexts + //- rjf: build per-unit parsing contexts // - DW2_TagParseCtx *unit_tag_parse_ctxs = 0; + DW2_ParseCtx *unit_parse_ctxs = 0; { if(lane_idx() == 0) { - unit_tag_parse_ctxs = push_array(scratch.arena, DW2_TagParseCtx, unit_count); + unit_parse_ctxs = push_array(scratch.arena, DW2_ParseCtx, unit_count); } - lane_sync_u64(&unit_tag_parse_ctxs, 0); + lane_sync_u64(&unit_parse_ctxs, 0); Rng1U64 range = lane_range(unit_count); for EachInRange(unit_idx, range) { DW2_UnitHeader *hdr = &unit_headers[unit_idx]; - DW2_TagParseCtx *ctx = &unit_tag_parse_ctxs[unit_idx]; + DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; + ctx->raw = raw; ctx->version = hdr->version; ctx->format = hdr->format; ctx->addr_size = hdr->addr_size; - ctx->abbrev_data = raw->sec[DW_Section_Abbrev].data; ctx->abbrev_map = abbrev_map_from_unit_idx_table[unit_idx]; } } @@ -293,7 +293,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64 range = lane_range(unit_count); for EachInRange(unit_idx, range) { - dw2_read_tag(scratch.arena, &unit_tag_parse_ctxs[unit_idx], raw->sec[DW_Section_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags[unit_idx]); + dw2_read_tag(scratch.arena, &unit_parse_ctxs[unit_idx], raw->sec[DW_Section_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags[unit_idx]); } } lane_sync(); From 2a76093e173b5d02c37283a33d1e491e5392a713 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 11 Nov 2025 17:24:12 -0800 Subject: [PATCH 071/850] form value resolution; line table header parsing --- src/dwarf/dwarf.c | 6 +-- src/dwarf/dwarf.h | 6 +-- src/dwarf/dwarf_parse_2.c | 78 ++++++++++++++++++++------- src/dwarf/dwarf_parse_2.h | 11 ++-- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 25 +++++++++ 5 files changed, 98 insertions(+), 28 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index e6fa63d0..a010a320 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -194,7 +194,7 @@ dw_attrib_class_from_attrib_mips(DW_AttribKind k) } internal DW_AttribClass -dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind k) +dw_attrib_class_from_kind(DW_Version ver, DW_Ext ext, DW_AttribKind k) { DW_AttribClass result = DW_AttribClass_Null; @@ -344,11 +344,11 @@ dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib_kind // This function's purpose is to find the overlapping class between an // DW_AttribKind and DW_FormKind. - DW_AttribClass attrib_class = dw_attrib_class_from_attrib(ver, ext, attrib_kind); + DW_AttribClass attrib_class = dw_attrib_class_from_kind(ver, ext, attrib_kind); DW_AttribClass form_class = dw_attrib_class_from_form_kind(ver, form_kind); if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null) { - attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind); + attrib_class = dw_attrib_class_from_kind(DW_Version_Last, ext, attrib_kind); form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind); } diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index b22e1623..7239aefb 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -478,7 +478,7 @@ X(GNU_RefAlt, DW_AttribClass_Undefined) \ X(GNU_StrpAlt, DW_AttribClass_String) typedef U64 DW_FormKind; -typedef enum DW_FormEnum +typedef enum DW_FormKindEnum { DW_Form_Null, #define X(_N, _ID) DW_Form_##_N = _ID, @@ -487,7 +487,7 @@ typedef enum DW_FormEnum DW_Form_V5_XList(X) DW_Form_GNU_XList(X) #undef X -} DW_FormEnum; +} DW_FormKindEnum; //- Attributes DWARF2 @@ -1762,7 +1762,7 @@ internal DW_AttribClass dw_attrib_class_from_attrib_llvm (DW_AttribKind k); internal DW_AttribClass dw_attrib_class_from_attrib_apple(DW_AttribKind k); internal DW_AttribClass dw_attrib_class_from_attrib_mips (DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind v); +internal DW_AttribClass dw_attrib_class_from_kind(DW_Version ver, DW_Ext ext, DW_AttribKind v); //- Form Class Encodings diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index d4e86ed9..6da9c57a 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -246,8 +246,9 @@ internal U64 dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out) { U64 start_off = off; - DW2_FormVal val = {0}; + DW2_FormVal val = {form_kind}; { + //- rjf: read value bytes U64 bytes_to_read = 0; switch(form_kind) { @@ -351,8 +352,7 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin U64 size = 0; U64 og_read_off = off; off += str8_deserial_read_uleb128(data, off, &size); - val.u128.u64[0] = size; - val.u128.u64[1] = og_read_off; + val.string = str8_substr(data, r1u64(off, off+size)); off += size; }break; @@ -362,8 +362,7 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin String8 string = {0}; U64 og_read_off = off; off += str8_deserial_read_cstr(data, off, &string); - val.u128.u64[0] = og_read_off; - val.u128.u64[1] = og_read_off + string.size - 1; + val.string = string; }break; //- rjf: implicit constants (no reading in .debug_info; value comes from .debug_abbrev) @@ -389,21 +388,41 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin val.u128.u64[0] = 1; }break; } + + //- rjf: in some cases, resolve numeric values -> strings + { + switch(form_kind) + { + default:{}break; + case DW_Form_Strx1: + case DW_Form_Strx2: + case DW_Form_Strx3: + case DW_Form_Strx4: + case DW_Form_Strx: + { + // TODO(rjf) + }break; + case DW_Form_LineStrp: + { + String8 string_section_data = ctx->raw->sec[DW_Section_LineStr].data; + val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0], + string_section_data.str + string_section_data.size); + }break; + case DW_Form_Strp: + case DW_Form_StrpSup: + { + String8 string_section_data = ctx->raw->sec[DW_Section_Str].data; + val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0], + string_section_data.str + string_section_data.size); + }break; + } + } } *out = val; U64 bytes_read = (off - start_off); return bytes_read; } -internal String8 -dw2_string_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal val) -{ - String8 section_data = ctx->raw->sec[val.section_kind].data; - Rng1U64 range = r1u64(val.u128.u64[0], val.u128.u64[1]); - String8 string = str8_substr(section_data, range); - return string; -} - //////////////////////////////// //~ rjf: Tag Parsing @@ -490,7 +509,7 @@ dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *ta SLLQueuePush(attribs.first, attribs.last, n); attribs.count += 1; n->v.attrib_kind = attrib_kind; - n->v.form_kind = attrib_form_kind; + n->v.val = val; } // rjf: no movement, or no attrib kind -> done @@ -511,6 +530,21 @@ dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *ta return bytes_read; } +internal DW2_Attrib * +dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind) +{ + DW2_Attrib *result = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag->attribs.first) + { + if(n->v.attrib_kind == kind) + { + result = &n->v; + break; + } + } + return result; +} + //////////////////////////////// //~ rjf: Line Table Parsing @@ -695,7 +729,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of case DW_Version_5: { //- rjf: read directory & file tables - for(B32 files = 0, dirs = 1; files <= 1; files = 1, dirs = 0) + for(B32 do_files = 0, do_dirs = 1; do_files <= 1; do_files += 1, do_dirs = 0) { // rjf: read header U8 entry_formats_count = 0; @@ -703,7 +737,8 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of U64 *entry_formats = push_array(scratch.arena, U64, entry_formats_count*2); for EachIndex(idx, entry_formats_count) { - off += str8_deserial_read_uleb128(data, off, &entry_formats[idx]); + off += str8_deserial_read_uleb128(data, off, &entry_formats[idx*2 + 0]); + off += str8_deserial_read_uleb128(data, off, &entry_formats[idx*2 + 1]); } U64 table_count = 0; off += str8_deserial_read_uleb128(data, off, &table_count); @@ -731,7 +766,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of }break; case DW_LNCT_Path: { - entry_out->file_name = dw2_string_from_form_val(ctx, form_val); + entry_out->file_name = form_val.string; }break; case DW_LNCT_DirectoryIndex: { @@ -751,12 +786,17 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of }break; case DW_LNCT_LLVM_Source: { - entry_out->source = dw2_string_from_form_val(ctx, form_val); + entry_out->source = form_val.string; }break; } } } } + + // rjf: store + if(0){} + else if(do_files) { files = table; } + else if(do_dirs) { dirs = table; } } }break; diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index d8096846..cf69a1fc 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -59,7 +59,8 @@ struct DW2_ParseCtx typedef struct DW2_FormVal DW2_FormVal; struct DW2_FormVal { - DW_SectionKind section_kind; + DW_FormKind kind; + String8 string; U128 u128; }; @@ -67,7 +68,6 @@ typedef struct DW2_Attrib DW2_Attrib; struct DW2_Attrib { DW_AttribKind attrib_kind; - DW_FormKind form_kind; DW2_FormVal val; }; @@ -154,6 +154,11 @@ struct DW2_LineTableHeader DW2_LineTableFileArray files; }; +//////////////////////////////// +//~ rjf: Globals + +global read_only DW2_Attrib dw2_attrib_nil = {0}; + //////////////////////////////// //~ rjf: Basic Parsing Helpers @@ -174,12 +179,12 @@ internal DW2_AbbrevMap dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 //~ rjf: Form Value Parsing internal U64 dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out); -internal String8 dw2_string_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal val); //////////////////////////////// //~ rjf: Tag Parsing internal U64 dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); +internal DW2_Attrib *dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind); //////////////////////////////// //~ rjf: Line Table Parsing diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index f3e9bcd2..17939b5a 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -298,6 +298,31 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync(); + //////////////////////////// + //- rjf: parse each unit's line table + // + { + U64 unit_take_idx = 0; + U64 *unit_take_idx_ptr = &unit_take_idx; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; + if(unit_idx >= unit_count) + { + break; + } + DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; + DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; + DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); + U64 line_info_off = stmt_list->val.u128.u64[0]; + DW2_LineTableHeader line_table_header = {0}; + String8 line_info_data = raw->sec[DW_Section_Line].data; + dw2_read_line_table_header(scratch.arena, ctx, line_info_data, line_info_off, &line_table_header); + } + } + lane_sync(); + //////////////////////////// //- rjf: fill result // From 7cafde33768b5e1790c01573a15e3f6c2306486d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 13 Nov 2025 10:53:29 -0800 Subject: [PATCH 072/850] revert DWARF changes to commit bda3a7137924acfcb9a564b7819a33fd8765f3fb --- src/base/base_strings.c | 70 +- src/base/base_strings.h | 2 - src/ctrl/ctrl_core.c | 2 +- src/dwarf/dwarf.c | 146 ++- src/dwarf/dwarf.h | 14 +- src/dwarf/dwarf_coff.c | 15 +- src/dwarf/dwarf_coff.h | 3 +- src/dwarf/dwarf_dump.c | 479 ++++----- src/dwarf/dwarf_dump.h | 22 +- src/dwarf/dwarf_elf.c | 7 +- src/dwarf/dwarf_elf.h | 2 +- src/dwarf/dwarf_help.h | 1 + src/dwarf/dwarf_inc.c | 1 - src/dwarf/dwarf_inc.h | 1 - src/dwarf/dwarf_parse.c | 1449 +++++++++++++++------------ src/dwarf/dwarf_parse.h | 273 +++-- src/dwarf/eh_dump.h | 5 +- src/dwarf/eh_frame.c | 272 ++--- src/dwarf/eh_frame.h | 7 +- src/radbin/radbin.c | 163 +-- src/radbin/radbin_main.c | 2 - src/rdi_from_dwarf/rdi_from_dwarf.c | 1321 +++++++++++------------- src/rdi_from_dwarf/rdi_from_dwarf.h | 88 +- src/rdi_from_elf/rdi_from_elf.c | 29 +- src/rdi_from_elf/rdi_from_elf.h | 3 +- src/rdi_make/rdi_make_local.c | 29 + src/rdi_make/rdi_make_local.h | 1 + 27 files changed, 2103 insertions(+), 2304 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 8c3ab290..0728bedf 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -2769,14 +2769,14 @@ str8_serial_push_string(Arena *arena, String8List *srl, String8 str){ internal U64 str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity) { - U64 bytes_left = string.size - Min(off, string.size); + U64 bytes_left = string.size-Min(off, string.size); U64 actually_readable_size = Min(bytes_left, read_size); U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity; if(legally_readable_size > 0) { MemoryCopy(read_dst, string.str+off, legally_readable_size); } - return actually_readable_size; + return legally_readable_size; } internal U64 @@ -2838,72 +2838,6 @@ str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out) return block_out->size; } -internal U64 -str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) -{ - U64 value = 0; - U64 shift = 0; - U64 cursor = off; - for(;;) - { - U8 byte = 0; - U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) - { - break; - } - U8 val = byte & 0x7fu; - value |= ((U64)val) << shift; - cursor += bytes_read; - shift += 7u; - if((byte & 0x80u) == 0) - { - break; - } - } - if(value_out != 0) - { - *value_out = value; - } - U64 bytes_read = cursor - off; - return bytes_read; -} - -internal U64 -str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) -{ - U64 value = 0; - U64 shift = 0; - U64 cursor = off; - for(;;) - { - U8 byte = 0; - U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) - { - break; - } - U8 val = byte & 0x7fu; - value |= ((U64)val) << shift; - cursor += bytes_read; - shift += 7u; - if((byte & 0x80u) == 0) - { - if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) - { - value |= -(S64)(1ull << shift); - } - break; - } - } - if(value_out != 0) - { - *value_out = value; - } - U64 bytes_read = cursor - off; - return bytes_read; -} - //////////////////////////////// internal int diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 65c17f1d..37c7acb2 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -444,8 +444,6 @@ internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 of internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); #define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) #define str8_deserial_read_struct(string, off, ptr) str8_deserial_read_array(string, off, ptr, 1) -internal U64 str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out); -internal U64 str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out); //////////////////////////////// //~ rjf: Basic String Hashes diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 1faead8d..779f4761 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1978,7 +1978,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A // compute CIE address U64 cie_delta_off = fde_format == DW_Format_32Bit ? 4 : 12; U64 cie_delta = 0; - U64 cie_delta_size = dw_str8_deserial_read_fmt_uint(fde_data, cie_delta_off, fde_format, &cie_delta); + U64 cie_delta_size = str8_deserial_read_dwarf_uint(fde_data, cie_delta_off, fde_format, &cie_delta); if (cie_delta_size == 0) { goto eh_parse_exit; } cie_addr = (fde_addr + cie_delta_off) - cie_delta; } diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index a010a320..2b2f3966 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -73,10 +73,10 @@ internal U64 dw_reg_count_from_arch(Arch arch) { switch (arch) { - default: { NotImplemented; } // fall-through - case Arch_Null: return 0; - case Arch_x86: return DW_RegX86_Last; - case Arch_x64: return DW_RegX64_Last; + default: { NotImplemented; } // fall-through + case Arch_Null: return 0; + case Arch_x86: return DW_RegX86_Last; + case Arch_x64: return DW_RegX64_Last; } } @@ -98,10 +98,10 @@ internal U64 dw_sp_from_arch(Arch arch) { switch (arch) { - default: NotImplemented; - case Arch_Null: return 0; - case Arch_x86: return DW_RegX86_Esp; - case Arch_x64: return DW_RegX64_Rsp; + default: NotImplemented; + case Arch_Null: return 0; + case Arch_x86: return DW_RegX86_Esp; + case Arch_x64: return DW_RegX64_Rsp; } } @@ -194,7 +194,7 @@ dw_attrib_class_from_attrib_mips(DW_AttribKind k) } internal DW_AttribClass -dw_attrib_class_from_kind(DW_Version ver, DW_Ext ext, DW_AttribKind k) +dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind k) { DW_AttribClass result = DW_AttribClass_Null; @@ -278,64 +278,58 @@ internal B32 dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind) { DW_AttribClass compat_flags = dw_attrib_class_from_form_kind(ver, form_kind); - B32 are_compat = (attrib_class & compat_flags) != 0; + B32 are_compat = (attrib_class & compat_flags) != 0; return are_compat; } internal String8 dw_name_string_from_section_kind(DW_SectionKind k) { - String8 result = {0}; - switch(k) - { -#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_L);}break; + switch (k) { +#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_L); DW_SectionKind_XList(X) #undef X } - return result; + return str8_zero(); } internal String8 dw_mach_name_string_from_section_kind(DW_SectionKind k) { - String8 result = {0}; - switch(k) - { -#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_M);}break; + switch (k) { +#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_M); DW_SectionKind_XList(X) #undef X } - return result; + return str8_zero(); } internal String8 dw_dwo_name_string_from_section_kind(DW_SectionKind k) { - String8 result = {0}; - switch(k) - { -#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_D);}break; + switch (k) { +#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_D); DW_SectionKind_XList(X) #undef X } - return result; + return str8_zero(); } internal U64 dw_size_from_format(DW_Format format) { U64 result = 0; - switch(format) - { - default:{}break; + switch (format) { + case DW_Format_Null: break; case DW_Format_32Bit: result = 4; break; case DW_Format_64Bit: result = 8; break; + default: InvalidPath; break; } return result; } internal DW_AttribClass -dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib_kind, DW_FormKind form_kind) +dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib_kind, DW_FormKind form_kind) { // NOTE(rjf): DWARF's spec specifies two mappings: // (DW_AttribKind) => List(DW_AttribClass) @@ -344,12 +338,16 @@ dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib_kind // This function's purpose is to find the overlapping class between an // DW_AttribKind and DW_FormKind. - DW_AttribClass attrib_class = dw_attrib_class_from_kind(ver, ext, attrib_kind); + DW_AttribClass attrib_class = dw_attrib_class_from_attrib(ver, ext, attrib_kind); DW_AttribClass form_class = dw_attrib_class_from_form_kind(ver, form_kind); - if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null) + + if(relaxed) { - attrib_class = dw_attrib_class_from_kind(DW_Version_Last, ext, attrib_kind); - form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind); + if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null) + { + attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind); + form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind); + } } DW_AttribClass result = DW_AttribClass_Null; @@ -430,11 +428,11 @@ dw_operand_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _OPER_COUNT; DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) + DW_Expr_V4_XList(X) + DW_Expr_V5_XList(X) + DW_Expr_GNU_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -445,11 +443,11 @@ dw_pop_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _POP_COUNT; DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) + DW_Expr_V4_XList(X) + DW_Expr_V5_XList(X) + DW_Expr_GNU_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -460,11 +458,11 @@ dw_push_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _PUSH_COUNT; DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) + DW_Expr_V4_XList(X) + DW_Expr_V5_XList(X) + DW_Expr_GNU_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -476,7 +474,7 @@ dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode) #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return ArrayCount(t)-1; } DW_CFA_Kind_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -486,21 +484,21 @@ dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode) { B32 is_invalid = 0; switch (opcode) { - case DW_ExprOp_Addrx: - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: - case DW_ExprOp_ConstType: - case DW_ExprOp_Constx: - case DW_ExprOp_Convert: - case DW_ExprOp_DerefType: - case DW_ExprOp_RegvalType: - case DW_ExprOp_Reinterpret: - case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_CallFrameCfa: { - is_invalid = 1; - } break; - default: break; + case DW_ExprOp_Addrx: + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: + case DW_ExprOp_ConstType: + case DW_ExprOp_Constx: + case DW_ExprOp_Convert: + case DW_ExprOp_DerefType: + case DW_ExprOp_RegvalType: + case DW_ExprOp_Reinterpret: + case DW_ExprOp_PushObjectAddress: + case DW_ExprOp_CallFrameCfa: { + is_invalid = 1; + } break; + default: break; } return is_invalid; } @@ -510,14 +508,14 @@ dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode) { B32 is_new_row_op = 0; switch (opcode) { - case DW_CFA_SetLoc: - case DW_CFA_AdvanceLoc: - case DW_CFA_AdvanceLoc1: - case DW_CFA_AdvanceLoc2: - case DW_CFA_AdvanceLoc4: { - is_new_row_op = 1; - } break; - default: break; + case DW_CFA_SetLoc: + case DW_CFA_AdvanceLoc: + case DW_CFA_AdvanceLoc1: + case DW_CFA_AdvanceLoc2: + case DW_CFA_AdvanceLoc4: { + is_new_row_op = 1; + } break; + default: break; } return is_new_row_op; } @@ -529,7 +527,7 @@ dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode) #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return &t[0] + 1; } DW_CFA_Kind_XList(X) #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -541,9 +539,9 @@ internal String8 dw_string_from_format(DW_Format format) { switch (format) { - case DW_Format_Null: return str8_zero(); - case DW_Format_32Bit: return str8_lit("DWARF32"); - case DW_Format_64Bit: return str8_lit("DWARF64"); + case DW_Format_Null: return str8_zero(); + case DW_Format_32Bit: return str8_lit("DWARF32"); + case DW_Format_64Bit: return str8_lit("DWARF64"); } return str8_zero(); } @@ -826,7 +824,7 @@ dw_string_from_cfa_opcode(DW_CFA_Opcode opcode) #define X(_NAME, _ID, ...) case _ID: return str8_lit(Stringify(_NAME)); DW_CFA_Kind_XList(X) #undef X - default: InvalidPath; break; + default: InvalidPath; break; } return str8_zero(); } diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 7239aefb..89e9b099 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -478,7 +478,7 @@ X(GNU_RefAlt, DW_AttribClass_Undefined) \ X(GNU_StrpAlt, DW_AttribClass_String) typedef U64 DW_FormKind; -typedef enum DW_FormKindEnum +typedef enum DW_FormEnum { DW_Form_Null, #define X(_N, _ID) DW_Form_##_N = _ID, @@ -487,7 +487,7 @@ typedef enum DW_FormKindEnum DW_Form_V5_XList(X) DW_Form_GNU_XList(X) #undef X -} DW_FormKindEnum; +} DW_FormEnum; //- Attributes DWARF2 @@ -1582,9 +1582,9 @@ typedef enum DW_ExprOpEnum { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) DW_ExprOp_##_N = _ID, DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) + DW_Expr_V4_XList(X) + DW_Expr_V5_XList(X) + DW_Expr_GNU_XList(X) #undef X } DW_ExprOpEnum; @@ -1762,7 +1762,7 @@ internal DW_AttribClass dw_attrib_class_from_attrib_llvm (DW_AttribKind k); internal DW_AttribClass dw_attrib_class_from_attrib_apple(DW_AttribKind k); internal DW_AttribClass dw_attrib_class_from_attrib_mips (DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_kind(DW_Version ver, DW_Ext ext, DW_AttribKind v); +internal DW_AttribClass dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind v); //- Form Class Encodings @@ -1782,7 +1782,7 @@ internal U64 dw_size_from_format(DW_Format format); //////////////////////////////// -internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib, DW_FormKind form_kind); +internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib, DW_FormKind form_kind); internal U64 dw_pick_default_lower_bound(DW_Language lang); diff --git a/src/dwarf/dwarf_coff.c b/src/dwarf/dwarf_coff.c index 7282f6dc..2c6614f9 100644 --- a/src/dwarf/dwarf_coff.c +++ b/src/dwarf/dwarf_coff.c @@ -23,14 +23,14 @@ dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, return is_dwarf_present; } -internal DW_Raw -dw_raw_from_coff_section_table(Arena *arena, - String8 raw_image, - String8 string_table, - U64 section_count, - COFF_SectionHeader *section_table) +internal DW_Input +dw_input_from_coff_section_table(Arena *arena, + String8 raw_image, + String8 string_table, + U64 section_count, + COFF_SectionHeader *section_table) { - DW_Raw input = {0}; + DW_Input input = {0}; B32 sect_status[ArrayCount(input.sec)] = {0}; for (U64 i = 0; i < section_count; ++i) { @@ -51,6 +51,7 @@ dw_raw_from_coff_section_table(Arena *arena, } else { sect_status[s] = 1; DW_Section *d = &input.sec[s]; + d->name = push_str8_copy(arena, name); d->data = str8_substr(raw_image, raw_data_range); d->is_dwo = is_dwo; } diff --git a/src/dwarf/dwarf_coff.h b/src/dwarf/dwarf_coff.h index 9bcd02a8..79cd37c3 100644 --- a/src/dwarf/dwarf_coff.h +++ b/src/dwarf/dwarf_coff.h @@ -5,6 +5,7 @@ #define DWARF_COFF_H internal B32 dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, COFF_SectionHeader *section_table); -internal DW_Raw dw_raw_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); +internal DW_Input dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); #endif // DWARF_COFF_H + diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index e33ef953..27ad6dd0 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -211,13 +211,13 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 } break; case DW_ExprOp_CallRef: { U64 x = 0; - cursor += dw_str8_deserial_read_fmt_uint(raw_data, cursor, format, &x); + cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &x); op_value = push_str8f(scratch.arena, "%llu", x); } break; case DW_ExprOp_ImplicitPointer: case DW_ExprOp_GNU_ImplicitPointer: { U64 info_off = 0; - cursor += dw_str8_deserial_read_fmt_uint(raw_data, cursor, format, &info_off); + cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &info_off); S64 ptr = 0; cursor += str8_deserial_read_sleb128(raw_data, cursor, &ptr); @@ -350,7 +350,7 @@ dw_string_list_from_cfi_program(Arena *arena, { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; - + U64 reg_max = dw_reg_count_from_arch(arch); U64 pc = pc_begin; for (U64 cursor = 0, inst_size; cursor < program.size; cursor += inst_size) { @@ -362,134 +362,134 @@ dw_string_list_from_cfi_program(Arena *arena, str8_list_pushf(arena, &list, "ERROR: failed to unpack CFA instruction @ 0x%I64", cursor); break; } - + // error check operands DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst.opcode); U64 operand_count = dw_operand_count_from_cfa_opcode(inst.opcode); for EachIndex(operand_idx, operand_count) { switch (operand_types[operand_idx]) { - case DW_CFA_OperandType_Null: break; - case DW_CFA_OperandType_Value: break; - case DW_CFA_OperandType_Register: { - if (inst.operands[operand_idx].u64 >= reg_max) { - str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", - dw_string_from_cfa_opcode(inst.opcode), - cursor); + case DW_CFA_OperandType_Null: break; + case DW_CFA_OperandType_Value: break; + case DW_CFA_OperandType_Register: { + if (inst.operands[operand_idx].u64 >= reg_max) { + str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", + dw_string_from_cfa_opcode(inst.opcode), + cursor); + } + } break; + case DW_CFA_OperandType_Expression: { + DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); + for EachNode(inst, DW_ExprInst, expr.first) { + if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { + String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); + str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); } - } break; - case DW_CFA_OperandType_Expression: { - DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); - for EachNode(inst, DW_ExprInst, expr.first) { - if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { - String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); - str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); - } - } - } break; - default: { InvalidPath; } break; + } + } break; + default: { InvalidPath; } break; } } - + // format operands String8 operand_str = str8_lit("???"); switch (inst.opcode) { - case DW_CFA_Nop: { operand_str = str8_zero(); } break; - case DW_CFA_SetLoc: { - operand_str = str8f(arena, "0x%X", inst.operands[0].u64); - pc = inst.operands[0].u64; - } break; - case DW_CFA_AdvanceLoc1: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc2: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc4: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_OffsetExt: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; - case DW_CFA_Undefined: { - operand_str = str8f(arena, "%I64u", inst.operands[0].u64); - } break; - case DW_CFA_SameValue: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_Register: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_RememberState: { operand_str = str8_zero(); } break; - case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; - case DW_CFA_DefCfa: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_DefCfaRegister: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_DefCfaOffset: { - operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); - } break; - case DW_CFA_DefCfaExpr: { - operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); - } break; - case DW_CFA_Expr: { - String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); - } break; - case DW_CFA_OffsetExtSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; - case DW_CFA_ValOffset: { - operand_str = str8f(arena, "value 0x%llx, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_ValOffsetSf: { - operand_str = str8f(arena, "value %llu, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_ValExpr: { - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); - } break; - case DW_CFA_AdvanceLoc: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_Offset: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_Restore: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - default: { - str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); - } goto exit; + case DW_CFA_Nop: { operand_str = str8_zero(); } break; + case DW_CFA_SetLoc: { + operand_str = str8f(arena, "0x%X", inst.operands[0].u64); + pc = inst.operands[0].u64; + } break; + case DW_CFA_AdvanceLoc1: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc2: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc4: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_OffsetExt: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; + case DW_CFA_Undefined: { + operand_str = str8f(arena, "%I64u", inst.operands[0].u64); + } break; + case DW_CFA_SameValue: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_Register: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_RememberState: { operand_str = str8_zero(); } break; + case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; + case DW_CFA_DefCfa: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_DefCfaRegister: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_DefCfaOffset: { + operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); + } break; + case DW_CFA_DefCfaExpr: { + operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); + } break; + case DW_CFA_Expr: { + String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); + } break; + case DW_CFA_OffsetExtSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; + case DW_CFA_ValOffset: { + operand_str = str8f(arena, "value 0x%llx, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_ValOffsetSf: { + operand_str = str8f(arena, "value %llu, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_ValExpr: { + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); + } break; + case DW_CFA_AdvanceLoc: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_Offset: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_Restore: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + default: { + str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); + } goto exit; } - + if (operand_str.size) { str8_list_pushf(arena, &list, "DW_CFA_%S: %S", dw_string_from_cfa_opcode(inst.opcode), operand_str); } else { str8_list_pushf(arena, &list, "DW_CFA_%S", dw_string_from_cfa_opcode(inst.opcode)); } } - - exit:; + +exit:; scratch_end(scratch); return list; } @@ -499,10 +499,10 @@ dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version { String8 cfa_str = str8_lit("???"); switch (cfa.rule) { - case DW_CFA_Rule_Null: {} break; - case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; - case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; - default: { InvalidPath; } break; + case DW_CFA_Rule_Null: {} break; + case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; + case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; + default: { InvalidPath; } break; } return cfa_str; } @@ -517,40 +517,40 @@ dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version ver DW_CFI_Register *cfi_reg = &row->regs[reg_idx]; String8 rule_str = str8_lit("???"); switch (cfi_reg->rule) { - case DW_CFI_RegisterRule_Undefined: { - rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_SameValue: { - rule_str = str8_zero(); - } break; - case DW_CFI_RegisterRule_Offset: { - rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_ValOffset: { - rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_Register: { - rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_Expression: { - rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); - } break; - case DW_CFI_RegisterRule_ValExpression: { - rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); - } break; - case DW_CFI_RegisterRule_Architectural: { - rule_str = str8_lit("???"); - } break; - default: { InvalidPath; } break; + case DW_CFI_RegisterRule_Undefined: { + rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_SameValue: { + rule_str = str8_zero(); + } break; + case DW_CFI_RegisterRule_Offset: { + rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_ValOffset: { + rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_Register: { + rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_Expression: { + rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_ValExpression: { + rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_Architectural: { + rule_str = str8_lit("???"); + } break; + default: { InvalidPath; } break; } - + if (rule_str.size) { str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_reg(scratch.arena, arch, reg_idx), rule_str); } } - + String8 string = str8_list_join(arena, &cfi_regs_list, &(StringJoin){.sep=str8_lit(", ")}); - + scratch_end(scratch); return string; } @@ -680,7 +680,7 @@ dw_print_eh_frame(Arena *arena, String8List *out, String8 indent, String8 raw_eh } internal void -dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) +dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) { #if 0 DW_Section info = input->sec[DW_Section_Info]; @@ -827,7 +827,7 @@ dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Raw *input } internal void -dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) +dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) { NotImplemented; #if 0 @@ -933,7 +933,7 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Raw *in } internal void -dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Raw *input) +dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input *input) { NotImplemented; #if 0 @@ -1022,7 +1022,7 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Raw *i } internal void -dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Raw *input) +dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *input) { NotImplemented; #if 0 @@ -1131,7 +1131,7 @@ dw_based_range_read_address(void *base, Rng1U64 range, U64 offset, Rng1U64Array } internal void -dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_virtual_ranges, Arch arch) +dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_virtual_ranges, Arch arch) { NotImplemented; #if 0 @@ -1284,7 +1284,7 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Raw * } internal void -dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_ranges) +dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_ranges) { NotImplemented; #if 0 @@ -1423,7 +1423,7 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Raw * } internal void -dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Raw *input, DW_SectionKind sec) +dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input *input, DW_SectionKind sec) { NotImplemented; #if 0 @@ -1485,19 +1485,19 @@ dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Raw *i } internal void -dw_print_debug_pubnames(Arena *arena, String8List *out, String8 indent, DW_Raw *input) +dw_print_debug_pubnames(Arena *arena, String8List *out, String8 indent, DW_Input *input) { dw_format_string_table(arena, out, indent, input, DW_Section_PubNames); } internal void -dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 indent, DW_Raw *input) +dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 indent, DW_Input *input) { dw_format_string_table(arena, out, indent, input, DW_Section_PubTypes); } internal void -dw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Raw *input) +dw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Input *input) { NotImplemented; #if 0 @@ -1527,7 +1527,7 @@ dw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Raw * } internal void -dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Raw *input) +dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input) { NotImplemented; #if 0 @@ -1598,10 +1598,10 @@ dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Ra //~ rjf: Dump Entry Point internal String8 -dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_vm, DW_Attrib *attrib) +dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_vm, DW_Attrib *attrib) { Temp scratch = scratch_begin(&arena, 1); - + String8List attrib_fmt = {0}; // rjf: log attrib's value based on vlass @@ -1722,7 +1722,7 @@ dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit enum_info = dw_string_from_attrib_type_encoding(scratch.arena, encoding); }break; } - + if(enum_info.size) { str8_list_pushf(scratch.arena, &attrib_fmt, " `%S`", enum_info); @@ -1730,14 +1730,14 @@ dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit } String8 result = str8_list_join(arena, &attrib_fmt, 0); - + scratch_end(scratch); return result; } internal String8List dw_dump_list_from_sections(Arena *arena, - DW_Raw *input, + DW_Input *input, Arch arch, DW_DumpSubsetFlags subset_flags) { @@ -1748,17 +1748,18 @@ dw_dump_list_from_sections(Arena *arena, #define DumpSubset(name) if(subset_flags & DW_DumpSubsetFlag_##name) DeferLoop(dumpf("// %S\n\n", dw_name_title_from_dump_subset_table[DW_DumpSubset_##name]), dump(str8_lit("\n"))) Temp scratch = scratch_begin(&arena, 1); Rng1U64Array segment_vranges = {0}; - DW_ListUnitInput lu_input = dw_list_unit_input_from_raw(scratch.arena, input); - + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input); + B32 relaxed = 1; + DW_CompUnit *cu_arr; { - DW_ListUnitInput lu_input = dw_list_unit_input_from_raw(scratch.arena, input); + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input); Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Info].data); Rng1U64Array cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); for EachIndex(cu_idx, cu_ranges.count) { - cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, input, lu_input, cu_ranges.v[cu_idx].min); + cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, input, lu_input, cu_ranges.v[cu_idx].min, relaxed); } } @@ -1779,7 +1780,7 @@ dw_dump_list_from_sections(Arena *arena, String8 unit_dir = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_CompDir ); String8 unit_name = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_Name ); String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_StmtList); - DW_LineVMHeader line_vm = {0}; + DW_LineVMHeader line_vm = {0}; dw_read_line_vm_header(unit_temp.arena, stmt_list, 0, input, unit_dir, unit_name, unit->address_size, unit->str_offsets_lu, &line_vm); //- rjf: log top-level unit info @@ -1819,25 +1820,25 @@ dw_dump_list_from_sections(Arena *arena, temp_end(attrib_temp); } value_max_size = Min(120, value_max_size); - + // log for EachNode(attrib_n, DW_AttribNode, tag.attribs.first) { DW_Attrib *attrib = &attrib_n->v; - + Temp attrib_temp = temp_begin(tag_temp.arena); - + String8 attrib_kind_str = dw_string_from_attrib_kind(attrib_temp.arena, unit->version, unit->ext, attrib->attrib_kind); String8 form_kind_str = dw_string_from_form_kind(attrib_temp.arena, unit->version, attrib->form_kind); String8 value_str = dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_vm, attrib); - + dumpf("%S attrib: { kind: %S, %.*sform_kind: %S, %.*svalue: %S, %.*s} // info_off: 0x%I64x\n", - tag_indent, - attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, indent.str, - form_kind_str, form_kind_max_size - form_kind_str.size, indent.str, - value_str, value_str.size < value_max_size ? value_max_size - value_str.size: 0, indent.str, - attrib->info_off, unit_idx, tag_idx); - + tag_indent, + attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, indent.str, + form_kind_str, form_kind_max_size - form_kind_str.size, indent.str, + value_str, value_str.size < value_max_size ? value_max_size - value_str.size: 0, indent.str, + attrib->info_off, unit_idx, tag_idx); + temp_end(attrib_temp); } } @@ -2198,7 +2199,7 @@ dw_dump_list_from_sections(Arena *arena, dumpf(" { 0x%08I64x %llu \"%S\" }\n", cursor, string.size, string); } } - + ////////////////////////////// //~ dump .debug_frame DumpSubset(DebugFrame) @@ -2206,7 +2207,7 @@ dw_dump_list_from_sections(Arena *arena, HashTable *cie_ht = hash_table_init(scratch.arena, 0x2000); String8 debug_frame = input->sec[DW_Section_Frame].data; U64 addr_size = byte_size_from_arch(arch); - + // make offset -> CIE hash table for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { DW_DescriptorEntry desc = {0}; @@ -2228,71 +2229,71 @@ dw_dump_list_from_sections(Arena *arena, desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); String8 raw_desc = str8_substr(debug_frame, desc.entry_range); switch (desc.type) { - case DW_DescriptorEntryType_Null: {} break; - case DW_DescriptorEntryType_CIE: { - DW_CIE cie = {0}; - if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { - String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); - - dumpf("CIE: // entry range: %r\n", desc.entry_range); - dumpf("{\n"); - dumpf(" Format: %S\n", dw_string_from_format(desc.format)); - dumpf(" Version: %u\n", cie.version); - dumpf(" Aug string: \"%S\"\n", cie.aug_string); - dumpf(" Code align: %I64u\n", cie.code_align_factor); - dumpf(" Data align: %I64d\n", cie.data_align_factor); - dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); - if (cie.version > DW_Version_3) { - dumpf(" Address size: %u\n", cie.address_size); - dumpf(" Segment selector size: %u\n", cie.segment_selector_size); - } - dumpf(" Initial Insturction:\n"); - dumpf(" {\n"); - for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(" %S\n", n->string); } - dumpf(" }\n"); - dumpf("}\n"); - } else { - dumpf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); + case DW_DescriptorEntryType_Null: {} break; + case DW_DescriptorEntryType_CIE: { + DW_CIE cie = {0}; + if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { + String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); + + dumpf("CIE: // entry range: %r\n", desc.entry_range); + dumpf("{\n"); + dumpf(" Format: %S\n", dw_string_from_format(desc.format)); + dumpf(" Version: %u\n", cie.version); + dumpf(" Aug string: \"%S\"\n", cie.aug_string); + dumpf(" Code align: %I64u\n", cie.code_align_factor); + dumpf(" Data align: %I64d\n", cie.data_align_factor); + dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); + if (cie.version > DW_Version_3) { + dumpf(" Address size: %u\n", cie.address_size); + dumpf(" Segment selector size: %u\n", cie.segment_selector_size); } - } break; - case DW_DescriptorEntryType_FDE: { - DW_DescriptorEntry cie_desc = {0}; - U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); - String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); - DW_CIE cie = {0}; - dw_parse_cie(cie_data, cie_desc.format, arch, &cie); - - DW_FDE fde = {0}; - if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { - DW_Version version = DW_Version_5; - DW_Ext ext = DW_Ext_All; - String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); - dumpf("FDE: // entry range: %r\n", desc.entry_range); - dumpf("{\n"); - { - dumpf(" Format: %S\n", dw_string_from_format(fde.format)); - dumpf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); - dumpf(" PC range: %r\n", fde.pc_range); - dumpf(" Instructions:\n"); - dumpf(" {\n"); - for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } - dumpf(" }\n"); - } - dumpf(" Unwind:\n"); + dumpf(" Initial Insturction:\n"); + dumpf(" {\n"); + for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(" %S\n", n->string); } + dumpf(" }\n"); + dumpf("}\n"); + } else { + dumpf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); + } + } break; + case DW_DescriptorEntryType_FDE: { + DW_DescriptorEntry cie_desc = {0}; + U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); + String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); + DW_CIE cie = {0}; + dw_parse_cie(cie_data, cie_desc.format, arch, &cie); + + DW_FDE fde = {0}; + if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { + DW_Version version = DW_Version_5; + DW_Ext ext = DW_Ext_All; + String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); + dumpf("FDE: // entry range: %r\n", desc.entry_range); + dumpf("{\n"); + { + dumpf(" Format: %S\n", dw_string_from_format(fde.format)); + dumpf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); + dumpf(" PC range: %r\n", fde.pc_range); + dumpf(" Instructions:\n"); dumpf(" {\n"); - DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); - do { - String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); - String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); - dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); - } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); + for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } dumpf(" }\n"); - - dumpf("}\n"); - } else { - dumpf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); } - } break; + dumpf(" Unwind:\n"); + dumpf(" {\n"); + DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); + do { + String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); + String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); + dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); + } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); + dumpf(" }\n"); + + dumpf("}\n"); + } else { + dumpf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); + } + } break; } } } diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index 67aa59d7..472bb7b7 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -70,21 +70,21 @@ internal String8 dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_siz #if 0 internal void dw_print_eh_frame (Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx); -internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); -internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); -internal void dw_print_debug_aranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_addr (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_loclists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges, Arch arch); -internal void dw_print_debug_rnglists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges); -internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); +internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); +internal void dw_print_debug_aranges (Arena *arena, String8List *out, String8 indent, DW_Input *input); +internal void dw_print_debug_addr (Arena *arena, String8List *out, String8 indent, DW_Input *input); +internal void dw_print_debug_loclists (Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_vranges, Arch arch); +internal void dw_print_debug_rnglists (Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_vranges); +internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 indent, DW_Input *input); +internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Input *input); +internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Input *input); +internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input); #endif //////////////////////////////// //~ rjf: Dump Entry Point -internal String8List dw_dump_list_from_sections(Arena *arena, DW_Raw *input, Arch arch, DW_DumpSubsetFlags subset_flags); +internal String8List dw_dump_list_from_sections(Arena *arena, DW_Input *input, Arch arch, DW_DumpSubsetFlags subset_flags); #endif // DWARF_DUMP_H diff --git a/src/dwarf/dwarf_elf.c b/src/dwarf/dwarf_elf.c index a247434f..39884286 100644 --- a/src/dwarf/dwarf_elf.c +++ b/src/dwarf/dwarf_elf.c @@ -27,10 +27,10 @@ dw_is_dwarf_present_from_elf_bin(String8 data, ELF_Bin *bin) #define SINFL_IMPLEMENTATION #include "third_party/sinfl/sinfl.h" -internal DW_Raw -dw_raw_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) +internal DW_Input +dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) { - DW_Raw result = {0}; + DW_Input result = {0}; B32 is_section_present[ArrayCount(result.sec)] = {0}; for(U64 section_idx = 1; section_idx < bin->shdrs.count; section_idx += 1) { @@ -106,6 +106,7 @@ dw_raw_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) //- rjf: store is_section_present[section_kind] = 1; DW_Section *d = &result.sec[section_kind]; + d->name = push_str8_copy(arena, section_name); d->data = section_data__uncompressed; d->is_dwo = is_dwo; } diff --git a/src/dwarf/dwarf_elf.h b/src/dwarf/dwarf_elf.h index c2e8ba78..a9a54f38 100644 --- a/src/dwarf/dwarf_elf.h +++ b/src/dwarf/dwarf_elf.h @@ -5,6 +5,6 @@ #define DWARF_ELF_H internal B32 dw_is_dwarf_present_from_elf_bin(String8 raw_image, ELF_Bin *bin); -internal DW_Raw dw_raw_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin); +internal DW_Input dw_input_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin); #endif // DWARF_ELF_H diff --git a/src/dwarf/dwarf_help.h b/src/dwarf/dwarf_help.h index ffb7d37e..2882c6b6 100644 --- a/src/dwarf/dwarf_help.h +++ b/src/dwarf/dwarf_help.h @@ -15,3 +15,4 @@ typedef struct DW_CallFrameInfo internal DW_CallFrameInfo dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame); #endif // DWARF_HELP_H + diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index cf8f939e..df0cc700 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -4,7 +4,6 @@ #include "dwarf/dwarf.c" #include "dwarf/dwarf_expr.c" #include "dwarf/dwarf_parse.c" -#include "dwarf/dwarf_parse_2.c" #include "dwarf/dwarf_coff.c" #include "dwarf/dwarf_elf.c" #include "dwarf/dwarf_unwind.c" diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index 1f6937af..44783a34 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -7,7 +7,6 @@ #include "dwarf/dwarf.h" #include "dwarf/dwarf_expr.h" #include "dwarf/dwarf_parse.h" -#include "dwarf/dwarf_parse_2.h" #include "dwarf/dwarf_coff.h" #include "dwarf/dwarf_elf.h" #include "dwarf/dwarf_unwind.h" diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 415e68cc..8559b08d 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -2,20 +2,22 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) internal U64 -dw_str8_deserial_read_packed_size(String8 string, U64 off, U64 *size_out) +dw_hash_from_string(String8 string) +{ + XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); + return hash64; +} + +internal U64 +str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) { U64 bytes_read = 0; - if(str8_deserial_read(string, off, size_out, sizeof(U32), sizeof(U32))) - { - if(*size_out == max_U32) - { - if(str8_deserial_read_struct(string, off+sizeof(U32), size_out)) - { + if (str8_deserial_read(string, off, size_out, sizeof(U32), sizeof(U32))) { + if (*size_out == max_U32) { + if (str8_deserial_read_struct(string, off+sizeof(U32), size_out)) { bytes_read = sizeof(U32) + sizeof(U64); } - } - else - { + } else { *size_out &= (U64)max_U32; bytes_read = sizeof(U32); } @@ -24,25 +26,149 @@ dw_str8_deserial_read_packed_size(String8 string, U64 off, U64 *size_out) } internal U64 -dw_str8_deserial_read_fmt_uint(String8 string, U64 off, DW_Format format, U64 *uint_out) +str8_deserial_read_dwarf_uint(String8 string, U64 off, DW_Format format, U64 *uint_out) { U64 bytes_read = 0; - switch(format) - { + switch (format) { case DW_Format_Null: break; - case DW_Format_32Bit: - { + case DW_Format_32Bit: { *uint_out &= (U64)max_U32; bytes_read = str8_deserial_read(string, off, uint_out, sizeof(U32), sizeof(U32)); - }break; - case DW_Format_64Bit: - { + } break; + case DW_Format_64Bit: { bytes_read = str8_deserial_read_struct(string, off, uint_out); - }break; + } break; } return bytes_read; } +internal U64 +str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) +{ + U64 value = 0; + U64 shift = 0; + U64 cursor = off; + for(;;) + { + U8 byte = 0; + U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); + + if(bytes_read != sizeof(byte)) + { + break; + } + + U8 val = byte & 0x7fu; + value |= ((U64)val) << shift; + + cursor += bytes_read; + shift += 7u; + + if((byte & 0x80u) == 0) + { + break; + } + } + if(value_out != 0) + { + *value_out = value; + } + U64 bytes_read = cursor - off; + return bytes_read; +} + +internal U64 +str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) +{ + U64 value = 0; + U64 shift = 0; + U64 cursor = off; + for(;;) + { + U8 byte; + U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); + if(bytes_read != sizeof(byte)) + { + break; + } + + U8 val = byte & 0x7fu; + value |= ((U64)val) << shift; + + cursor += bytes_read; + shift += 7u; + + if((byte & 0x80u) == 0) + { + if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) + { + value |= -(S64)(1ull << shift); + } + break; + } + } + if(value_out != 0) + { + *value_out = value; + } + U64 bytes_read = cursor - off; + return bytes_read; +} + +internal U64 +str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out) +{ + Temp temp = temp_begin(arena); + + U64 *arr = push_array(arena, U64, count); + U64 i, cursor; + for (i = 0, cursor = off; i < count; ++i) { + U64 read_size = str8_deserial_read_uleb128(string, cursor, &arr[i]); + if (read_size == 0) { + break; + } + cursor += read_size; + } + + U64 bytes_read = 0; + if (i == count) { + *arr_out = arr; + bytes_read = cursor - off; + } else { + temp_end(temp); + *arr_out = 0; + } + + return bytes_read; +} + +internal U64 +str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out) +{ + Temp temp = temp_begin(arena); + + S64 *arr = push_array(arena, S64, count); + U64 i, cursor; + for (i = 0, cursor = off; i < count; ++i) { + U64 read_size = str8_deserial_read_sleb128(string, cursor, &arr[i]); + if (read_size == 0) { + break; + } + cursor += read_size; + } + + U64 bytes_read = 0; + if (i == count) { + *arr_out = arr; + bytes_read = cursor - off; + } else { + temp_end(temp); + *arr_out = 0; + } + + return bytes_read; +} + internal DW_SectionKind dw_section_kind_from_string(String8 string) { @@ -70,26 +196,27 @@ internal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data) { Rng1U64List result = {0}; - for(U64 cursor = 0; cursor < data.size;) - { - // rjf: read CU size; bad read -> terminate - U64 cu_size = 0; - U64 cu_size_size = dw_str8_deserial_read_packed_size(data, cursor, &cu_size); - if(cu_size_size == 0) - { + + for (U64 cursor = 0; cursor < data.size; ) { + // read CU size + U64 cu_size = 0; + U64 cu_size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &cu_size); + + // was read ok? + if (cu_size_size == 0) { break; } - // rjf: push - if(cu_size > 0) - { + if (cu_size > 0) { + // push unit range rng1u64_list_push(arena, &result, rng_1u64(cursor, cursor+cu_size+cu_size_size)); } - // rjf: advance + // advance cursor += cu_size_size; cursor += cu_size; } + return result; } @@ -99,7 +226,7 @@ dw_read_list_unit_header_addr(String8 unit_data, DW_ListUnit *lu_out) U64 header_size = 0; U64 unit_length = 0; - U64 unit_length_size = dw_str8_deserial_read_packed_size(unit_data, 0, &unit_length); + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); if (unit_length_size) { DW_Version version = DW_Version_Null; @@ -140,7 +267,7 @@ dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out) U64 header_size = 0; U64 unit_length = 0; - U64 unit_length_size = dw_str8_deserial_read_packed_size(unit_data, 0, &unit_length); + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); if (unit_length_size) { DW_Version version = DW_Version_Null; @@ -171,7 +298,7 @@ dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) U64 header_size = 0; U64 unit_length = 0; - U64 unit_length_size = dw_str8_deserial_read_packed_size(unit_data, 0, &unit_length); + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); if (unit_length_size) { DW_Version version = DW_Version_Null; @@ -207,7 +334,7 @@ dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) } internal DW_ListUnitInput -dw_list_unit_input_from_raw(Arena *arena, DW_Raw *input) +dw_list_unit_input_from_input(Arena *arena, DW_Input *input) { Temp scratch = scratch_begin(&arena, 1); @@ -589,11 +716,11 @@ dw_read_form(String8 data, if (version < DW_Version_3) { bytes_read = str8_deserial_read(data, off, &form.ref, address_size, address_size); } else { - bytes_read = dw_str8_deserial_read_fmt_uint(data, off, unit_format, &form.ref); + bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.ref); } } break; case DW_Form_GNU_RefAlt: { - bytes_read = dw_str8_deserial_read_fmt_uint(data, off, unit_format, &form.ref); + bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.ref); } break; case DW_Form_Ref1: { bytes_read = str8_deserial_read(data, off, &form.ref, 1, 1); @@ -614,7 +741,7 @@ dw_read_form(String8 data, case DW_Form_LineStrp: case DW_Form_GNU_StrpAlt: case DW_Form_Strp: { - bytes_read = dw_str8_deserial_read_fmt_uint(data, off, unit_format, &form.sec_offset); + bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.sec_offset); } break; case DW_Form_ExprLoc: { U64 expr_size = 0; @@ -644,7 +771,7 @@ dw_read_form(String8 data, NotImplemented; } break; case DW_Form_StrpSup: { - bytes_read = dw_str8_deserial_read_fmt_uint(data, off, unit_format, &form.strp_sup); + bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.strp_sup); } break; case DW_Form_Data16: { bytes_read = str8_deserial_read_block(data, off, 16, &form.data); @@ -758,6 +885,8 @@ dw_read_tag(Arena *arena, // fill out node DW_AttribNode *attrib_n = push_array(arena, DW_AttribNode, 1); attrib_n->v.info_off = tag_base + attrib_tag_cursor; + attrib_n->v.abbrev_off = attrib_abbrev_off; + attrib_n->v.abbrev_id = attrib_abbrev.id; attrib_n->v.attrib_kind = attrib_kind; attrib_n->v.form_kind = form_kind; attrib_n->v.form = form; @@ -780,7 +909,7 @@ dw_read_tag(Arena *arena, } internal U64 -dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) +dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) { String8 tag_data = str8_substr(input->sec[DW_Section_Info].data, cu->info_range); U64 tag_off = info_off - cu->info_range.min; @@ -932,14 +1061,14 @@ dw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_Form } internal String8 -dw_interp_block(DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_block(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) { NotImplemented; return str8_zero(); } internal String8 -dw_interp_string(DW_Raw *input, +dw_interp_string(DW_Input *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_FormKind form_kind, @@ -978,7 +1107,7 @@ dw_interp_string(DW_Raw *input, } internal String8 -dw_interp_line_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) +dw_interp_line_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) { String8 result = {0}; if (form_kind == DW_Form_SecOffset) { @@ -1003,7 +1132,7 @@ dw_interp_file(DW_LineVMHeader *line_vm, DW_FormKind form_kind, DW_Form form) } internal DW_Reference -dw_interp_ref(DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) { DW_Reference ref = {0}; if (form_kind == DW_Form_Ref1 || form_kind == DW_Form_Ref2 || @@ -1024,7 +1153,7 @@ dw_interp_ref(DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form for } internal DW_LocList -dw_interp_loclist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_loclist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) { DW_LocList loclist = {0}; @@ -1311,7 +1440,7 @@ dw_interp_flag(DW_FormKind form_kind, DW_Form form) } internal Rng1U64List -dw_interp_rnglist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) { Rng1U64List rnglist = {0}; @@ -1502,7 +1631,7 @@ dw_interp_rnglist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form } internal String8 -dw_interp_secptr(DW_Raw *input, DW_SectionKind section, DW_FormKind form_kind, DW_Form form) +dw_interp_secptr(DW_Input *input, DW_SectionKind section, DW_FormKind form_kind, DW_Form form) { String8 secptr = {0}; if (form_kind == DW_Form_SecOffset) { @@ -1516,25 +1645,25 @@ dw_interp_secptr(DW_Raw *input, DW_SectionKind section, DW_FormKind form_kind, D } internal String8 -dw_interp_addrptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) +dw_interp_addrptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) { return dw_interp_secptr(input, DW_Section_Addr, form_kind, form); } internal String8 -dw_interp_str_offsets_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) +dw_interp_str_offsets_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) { return dw_interp_secptr(input, DW_Section_StrOffsets, form_kind, form); } internal String8 -dw_interp_rnglists_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) +dw_interp_rnglists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) { return dw_interp_secptr(input, DW_Section_RngLists, form_kind, form); } internal String8 -dw_interp_loclists_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) +dw_interp_loclists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) { return dw_interp_secptr(input, DW_Section_LocLists, form_kind, form); } @@ -1542,11 +1671,11 @@ dw_interp_loclists_ptr(DW_Raw *input, DW_FormKind form_kind, DW_Form form) internal DW_AttribClass dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib) { - return dw_pick_attrib_value_class(cu->version, cu->ext, attrib->attrib_kind, attrib->form_kind); + return dw_pick_attrib_value_class(cu->version, cu->ext, cu->relaxed, attrib->attrib_kind, attrib->form_kind); } internal String8 -dw_exprloc_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_exprloc_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_ExprLoc || value_class == DW_AttribClass_Block); @@ -1554,7 +1683,7 @@ dw_exprloc_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U128 -dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1562,7 +1691,7 @@ dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U64 -dw_const_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1570,7 +1699,7 @@ dw_const_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U32 -dw_const_u32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1578,7 +1707,7 @@ dw_const_u32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal S64 -dw_const_s64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_s64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1586,7 +1715,7 @@ dw_const_s64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal S32 -dw_const_s32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_s32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1594,7 +1723,7 @@ dw_const_s32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal B32 -dw_flag_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_flag_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Flag); @@ -1602,7 +1731,7 @@ dw_flag_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U64 -dw_address_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_address_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || @@ -1627,7 +1756,7 @@ dw_address_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_block_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_block_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Block); @@ -1635,7 +1764,7 @@ dw_block_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_string_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_string_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_String || value_class == DW_AttribClass_StrOffsetsPtr); @@ -1643,7 +1772,7 @@ dw_string_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_line_ptr_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_line_ptr_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_LinePtr); @@ -1659,7 +1788,7 @@ dw_file_from_attrib(DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Attrib *attrib } internal DW_Reference -dw_ref_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_ref_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Reference); @@ -1667,7 +1796,7 @@ dw_ref_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal DW_LocList -dw_loclist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_loclist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || @@ -1677,7 +1806,7 @@ dw_loclist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib * } internal Rng1U64List -dw_rnglist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_rnglist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { Rng1U64List rnglist = {0}; DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); @@ -1704,7 +1833,7 @@ dw_attrib_from_tag_(DW_Tag tag, DW_AttribKind kind) } internal DW_Attrib * -dw_attrib_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_attrib_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { DW_Attrib *attrib = dw_attrib_from_tag_(tag, kind); @@ -1723,7 +1852,7 @@ dw_attrib_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kin } internal B32 -dw_tag_has_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_tag_has_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); B32 has_attrib = attrib->attrib_kind != DW_AttribKind_Null; @@ -1731,85 +1860,85 @@ dw_tag_has_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind } internal String8 -dw_exprloc_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_exprloc_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_exprloc_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_block_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_block_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_block_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U128 -dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u128_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u128_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U64 -dw_const_u64_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u64_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u64_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U32 -dw_const_u32_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u32_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u32_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U64 -dw_address_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_address_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_address_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_string_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_string_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_string_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_line_ptr_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_line_ptr_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_line_ptr_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_Reference -dw_ref_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_ref_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_ref_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_LocList -dw_loclist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_loclist_from_tag_attrib_kind(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_loclist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal Rng1U64List -dw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_rnglist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal B32 -dw_flag_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_flag_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_flag_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_LineFile * -dw_file_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind) +dw_file_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind) { return dw_file_from_attrib(cu, line_vm, dw_attrib_from_tag(input, cu, tag, kind)); } internal B32 -dw_try_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out) +dw_try_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out) { B32 has_byte_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ByteSize); B32 has_bit_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_BitSize ); @@ -1831,7 +1960,7 @@ dw_try_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_ } internal U64 -dw_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) +dw_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) { U64 byte_size = max_U64; dw_try_byte_size_from_tag(input, cu, tag, &byte_size); @@ -1839,7 +1968,7 @@ dw_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) } internal U32 -dw_byte_size_32_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) +dw_byte_size_32_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) { U32 byte_size32 = 0; U64 byte_size64; @@ -1850,7 +1979,7 @@ dw_byte_size_32_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) } internal U64 -dw_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { U64 result = 0; DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); @@ -1881,7 +2010,7 @@ dw_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kin } internal DW_CompUnit -dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 offset) +dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed) { DW_CompUnit cu = {0}; @@ -1889,7 +2018,7 @@ dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 // read unit size in bytes U64 length = 0; - U64 length_size = dw_str8_deserial_read_packed_size(info_data, offset, &length); + U64 length_size = str8_deserial_read_dwarf_packed_size(info_data, offset, &length); if (length_size) { // compute unit range @@ -1936,7 +2065,7 @@ dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 case DW_Version_3: case DW_Version_4: { U64 abbrev_base_off = cursor; - U64 abbrev_base_size = dw_str8_deserial_read_fmt_uint(data, abbrev_base_off, format, &abbrev_base); + U64 abbrev_base_size = str8_deserial_read_dwarf_uint(data, abbrev_base_off, format, &abbrev_base); if (!abbrev_base_size) { break; } @@ -1964,7 +2093,7 @@ dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 } U64 abbrev_base_off = address_size_off + address_size_size; - U64 abbrev_base_size = dw_str8_deserial_read_fmt_uint(data, abbrev_base_off, format, &abbrev_base); + U64 abbrev_base_size = str8_deserial_read_dwarf_uint(data, abbrev_base_off, format, &abbrev_base); if (!abbrev_base_size) { break; } @@ -2027,6 +2156,7 @@ dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form_kind, low_pc_attrib->form); // fill out compile unit + cu.relaxed = relaxed; cu.ext = DW_Ext_All; cu.kind = unit_kind; cu.version = version; @@ -2087,7 +2217,7 @@ dw_tag_tree_from_data(Arena *arena, String8 info_data, String8 abbrev_data, DW_C } internal DW_TagTree -dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu) +dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu) { String8 abbrev_data = input->sec[DW_Section_Abbrev].data; String8 info_data = str8_substr(input->sec[DW_Section_Info].data, cu->info_range); @@ -2180,7 +2310,7 @@ dw_line_vm_file_array_from_list(Arena *arena, DW_LineVMFileList list) internal U64 dw_read_line_file(String8 data, U64 off, - DW_Raw *input, + DW_Input *input, DW_Version version, DW_Format format, DW_Ext ext, @@ -2242,7 +2372,7 @@ internal U64 dw_read_line_file_array(Arena *arena, String8 data, U64 off, - DW_Raw *input, + DW_Input *input, DW_Version version, DW_Format format, DW_Ext ext, @@ -2290,7 +2420,15 @@ dw_read_line_file_array(Arena *arena, } internal U64 -dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Raw *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out) +dw_read_line_vm_header(Arena *arena, + String8 line_data, + U64 line_off, + DW_Input *input, + String8 cu_dir, + String8 cu_name, + U8 cu_address_size, + DW_ListUnit *cu_str_offsets, + DW_LineVMHeader *header_out) { Temp scratch = scratch_begin(&arena, 1); @@ -2298,7 +2436,7 @@ dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Raw *in // read unit length U64 unit_length = 0; - U64 unit_length_size = dw_str8_deserial_read_packed_size(line_data, line_off, &unit_length); + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(line_data, line_off, &unit_length); U64 unit_opl = line_off + unit_length_size + unit_length; Rng1U64 unit_range = rng_1u64(line_off, unit_opl); @@ -2335,7 +2473,7 @@ dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Raw *in // read header length U64 header_length = 0; - U64 header_length_size = dw_str8_deserial_read_fmt_uint(unit_data, unit_cursor, format, &header_length); + U64 header_length_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, format, &header_length); if (header_length_size == 0) { goto exit; } @@ -2489,11 +2627,12 @@ dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Raw *in unit_cursor += enc_count_size; // read table entry encodings - U64 *enc_arr = push_array(scratch.arena, U64, enc_count*2); - for EachIndex(idx, enc_count) - { - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &enc_arr[idx]); + U64 *enc_arr = 0; + U64 enc_arr_size = str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr); + if (enc_arr_size == 0) { + goto exit; } + unit_cursor += enc_arr_size; // read table count U64 table_count = 0; @@ -2534,11 +2673,12 @@ dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Raw *in unit_cursor += enc_count_size; // read table entry encodings - U64 *enc_arr = push_array(scratch.arena, U64, enc_count*2); - for EachIndex(idx, enc_count) - { - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &enc_arr[idx]); + U64 *enc_arr = 0; + U64 enc_arr_size = str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr); + if (enc_arr_size == 0) { + goto exit; } + unit_cursor += enc_arr_size; // read table count U64 table_count = 0; @@ -2684,35 +2824,37 @@ dw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx) } internal DW_LineTableParseResult -dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets) +dw_parsed_line_table_from_data(Arena *arena, + String8 unit_data, + DW_Input *input, + String8 cu_dir, + String8 cu_name, + U8 cu_address_size, + DW_ListUnit *cu_str_offsets) { DW_LineVMHeader vm_header = {0}; U64 vm_header_size = dw_read_line_vm_header(arena, unit_data, 0, input, cu_dir, cu_name, cu_address_size, cu_str_offsets, &vm_header); + U64 unit_cursor = vm_header_size; - U64 unit_cursor_opl = Min(unit_data.size, vm_header.unit_range.max); //- rjf: prep state for VM DW_LineVMState vm_state = {0}; dw_line_vm_reset(&vm_state, vm_header.default_is_stmt); //- rjf: VM loop; build output list - DW_LineTableParseResult result = {.vm_header = vm_header}; - B32 end_of_seq = 0; - B32 error = 0; - for(;!error && unit_cursor < unit_cursor_opl;) - { + DW_LineTableParseResult result = { .vm_header = vm_header }; + B32 end_of_seq = 0; + B32 error = 0; + for (; !error && unit_cursor < unit_data.size; ) { //- rjf: parse opcode U8 opcode = 0; unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &opcode); //- rjf: do opcode action - switch(opcode) - { - //- rjf: special opcode cases - default: - { - if(opcode >= vm_header.opcode_base) - { + switch (opcode) { + default: { + //- rjf: special opcode case + if (opcode >= vm_header.opcode_base) { U32 adjusted_opcode = (U32)(opcode - vm_header.opcode_base); U32 op_advance = adjusted_opcode / vm_header.line_range; S32 line_inc = (S32)vm_header.line_base + ((S32)adjusted_opcode) % (S32)vm_header.line_range; @@ -2742,31 +2884,25 @@ dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, S } #endif } - // Skipping unknown opcode. This is a valid case and // it works because compiler stores operand lengths. - else - { - if(0 < opcode && opcode <= vm_header.num_opcode_lens) - { + else { + if (0 < opcode && opcode <= vm_header.num_opcode_lens) { U8 num_operands = vm_header.opcode_lens[opcode - 1]; - for(U8 i = 0; i < num_operands; i += 1) - { + for (U8 i = 0; i < num_operands; ++i) { U64 operand = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &operand); } - } - else - { + } else { error = 1; goto exit; } } - }break; + } break; - //- standard opcodes - case DW_StdOpcode_Copy: - { + //- Standard opcodes + + case DW_StdOpcode_Copy: { if(vm_state.is_stmt) { dw_push_line(arena, &result, &vm_state, end_of_seq); @@ -2776,69 +2912,68 @@ dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, S vm_state.basic_block = 0; vm_state.prologue_end = 0; vm_state.epilogue_begin = 0; - }break; - case DW_StdOpcode_AdvancePc: - { + } break; + + case DW_StdOpcode_AdvancePc: { U64 advance = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &advance); dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst); - }break; - case DW_StdOpcode_AdvanceLine: - { + } break; + + case DW_StdOpcode_AdvanceLine: { S64 s = 0; unit_cursor += str8_deserial_read_sleb128(unit_data, unit_cursor, &s); vm_state.line += s; - }break; - case DW_StdOpcode_SetFile: - { + } break; + + case DW_StdOpcode_SetFile: { U64 file_index = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &file_index); vm_state.file_index = file_index; - }break; - case DW_StdOpcode_SetColumn: - { + } break; + + case DW_StdOpcode_SetColumn: { U64 column = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &column); vm_state.column = column; - }break; - case DW_StdOpcode_NegateStmt: - { + } break; + + case DW_StdOpcode_NegateStmt: { vm_state.is_stmt = !vm_state.is_stmt; - }break; - case DW_StdOpcode_SetBasicBlock: - { + } break; + + case DW_StdOpcode_SetBasicBlock: { vm_state.basic_block = 1; - }break; - case DW_StdOpcode_ConstAddPc: - { + } break; + + case DW_StdOpcode_ConstAddPc: { U64 advance = (0xffu - vm_header.opcode_base) / vm_header.line_range; dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst); - }break; - case DW_StdOpcode_FixedAdvancePc: - { + } break; + + case DW_StdOpcode_FixedAdvancePc: { U16 operand = 0; unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &operand); vm_state.address += operand; vm_state.op_index = 0; - }break; - case DW_StdOpcode_SetPrologueEnd: - { + } break; + + case DW_StdOpcode_SetPrologueEnd: { vm_state.prologue_end = 1; - }break; - case DW_StdOpcode_SetEpilogueBegin: - { + } break; + + case DW_StdOpcode_SetEpilogueBegin: { vm_state.epilogue_begin = 1; - }break; - case DW_StdOpcode_SetIsa: - { + } break; + + case DW_StdOpcode_SetIsa: { U64 v = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &v); vm_state.isa = v; - }break; + } break; - //- extended opcodes - case DW_StdOpcode_ExtendedOpcode: - { + //- Extended opcodes + case DW_StdOpcode_ExtendedOpcode: { U64 length = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &length); @@ -2846,12 +2981,8 @@ dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, S U8 extended_opcode = 0; unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &extended_opcode); - switch(extended_opcode) - { - default:{}break; - - case DW_ExtOpcode_EndSequence: - { + switch (extended_opcode) { + case DW_ExtOpcode_EndSequence: { vm_state.end_sequence = 1; if(vm_state.is_stmt) { @@ -2859,18 +2990,16 @@ dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, S } dw_line_vm_reset(&vm_state, vm_header.default_is_stmt); end_of_seq = 1; - }break; + } break; - case DW_ExtOpcode_SetAddress: - { + case DW_ExtOpcode_SetAddress: { U64 address = 0; unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, vm_header.address_size, vm_header.address_size); vm_state.address = address; vm_state.op_index = 0; - }break; + } break; - case DW_ExtOpcode_DefineFile: - { + case DW_ExtOpcode_DefineFile: { String8 file_name = {0}; U64 dir_index = 0; U64 modify_time = 0; @@ -2888,26 +3017,30 @@ dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, S // // See the DWARF V4 spec (June 10, 2010), page 122. error = 1; - }break; + AssertAlways(!"UNHANDLED DEFINE FILE!!!"); + } break; - case DW_ExtOpcode_SetDiscriminator: - { + case DW_ExtOpcode_SetDiscriminator: { U64 v = 0; unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &v); vm_state.discriminator = v; - }break; + } break; + + default: break; } unit_cursor = extended_opl; - }break; + } break; } } + exit:; + return result; } internal DW_PubStringsTable -dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind) +dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind) { Temp scratch = scratch_begin(&arena, 1); @@ -2919,7 +3052,7 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_Sectio for(U64 cursor = 0; cursor < section_data.size; ) { U64 unit_length = 0; - U64 unit_length_size = dw_str8_deserial_read_packed_size(section_data, cursor, &unit_length); + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(section_data, cursor, &unit_length); if (unit_length_size == 0) { break; } @@ -2939,13 +3072,13 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_Sectio DW_Format format = DW_FormatFromSize(unit_length); U64 debug_info_off = 0; - cursor += dw_str8_deserial_read_fmt_uint(section_data, cursor, format, &debug_info_off); + cursor += str8_deserial_read_dwarf_uint(section_data, cursor, format, &debug_info_off); if (cursor >= cursor_opl) { break; } U64 debug_info_length = 0; - cursor += dw_str8_deserial_read_packed_size(section_data, cursor, &debug_info_length); + cursor += str8_deserial_read_dwarf_packed_size(section_data, cursor, &debug_info_length); if (cursor >= cursor_opl) { break; } @@ -2953,7 +3086,7 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_Sectio U64 off_size = dw_size_from_format(format); for (; (cursor + off_size) <= cursor_opl;) { U64 info_off = 0; - U64 info_off_size = dw_str8_deserial_read_fmt_uint(section_data, cursor, format, &info_off); + U64 info_off_size = str8_deserial_read_dwarf_uint(section_data, cursor, format, &info_off); cursor += info_off_size; if (info_off_size == 0 || info_off == 0) { @@ -2963,7 +3096,7 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_Sectio String8 string = {0}; cursor += str8_deserial_read_cstr(section_data, cursor, &string); - U64 hash = u64_hash_from_str8(string); + U64 hash = dw_hash_from_string(string); U64 bucket_idx = hash % names_table.size; DW_PubStringsBucket *bucket = push_array(arena, DW_PubStringsBucket, 1); @@ -2985,205 +3118,205 @@ dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data) DW_Expr expr = {0}; for (U64 cursor = 0; cursor < data.size; ) { U64 inst_start = cursor; - + DW_ExprOp opcode = 0; cursor += str8_deserial_read_struct(data, cursor, &opcode); DW_ExprOperand operands[4] = {0}; switch (opcode) { - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { - // implicit operands - } break; - case DW_ExprOp_Const1U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); } break; - case DW_ExprOp_Const2U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); } break; - case DW_ExprOp_Const4U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); } break; - case DW_ExprOp_Const8U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_Const1S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s8); } break; - case DW_ExprOp_Const2S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); } break; - case DW_ExprOp_Const4S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s32); } break; - case DW_ExprOp_Const8S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s64); } break; - case DW_ExprOp_ConstU: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_ConstS: { cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); } break; - case DW_ExprOp_Addr: { cursor += str8_deserial_read(data, cursor, &operands[0].u64, addr_size, addr_size); } break; - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { - // implicit operands - } break; - case DW_ExprOp_RegX: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_ImplicitValue: { - U64 value_size = 0; String8 value = {0}; - cursor += str8_deserial_read_uleb128(data, cursor, &value_size); - cursor += str8_deserial_read_block(data, cursor, value_size, &operands[0].block); - } break; - case DW_ExprOp_Piece: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_BitPiece: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_Pick: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_PlusUConst: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_Skip: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); - } break; - case DW_ExprOp_Bra: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); - } break; - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { - cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); - } break; - case DW_ExprOp_BRegX: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); - } break; - case DW_ExprOp_FBReg: { - cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); - } break; - case DW_ExprOp_Deref: { - // no operands - } break; - case DW_ExprOp_DerefSize: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_XDerefSize: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_Call2: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); - } break; - case DW_ExprOp_Call4: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); - } break; - case DW_ExprOp_CallRef: { - cursor += dw_str8_deserial_read_fmt_uint(data, cursor, format, &operands[0].u64); - } break; - case DW_ExprOp_ImplicitPointer: - case DW_ExprOp_GNU_ImplicitPointer: { - cursor += dw_str8_deserial_read_fmt_uint(data, cursor, format, &operands[0].u64); - cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); - } break; - case DW_ExprOp_Convert: - case DW_ExprOp_GNU_Convert: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_GNU_ParameterRef: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); - } break; - case DW_ExprOp_DerefType: - case DW_ExprOp_GNU_DerefType: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_XDerefType: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_ConstType: - case DW_ExprOp_GNU_ConstType: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_struct(data, cursor, &operands[1].u8); - cursor += str8_deserial_read_block(data, cursor, operands[1].u8, &operands[2].block); - } break; - case DW_ExprOp_RegvalType: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: { - U64 entry_value_expr_size = 0; - cursor += str8_deserial_read_uleb128(data, cursor, &entry_value_expr_size); - cursor += str8_deserial_read_block(data, cursor, entry_value_expr_size, &operands[0].block); - } break; - case DW_ExprOp_Addrx: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_Constx: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_CallFrameCfa: - case DW_ExprOp_FormTlsAddress: - case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_Nop: - case DW_ExprOp_Eq: - case DW_ExprOp_Ge: - case DW_ExprOp_Gt: - case DW_ExprOp_Le: - case DW_ExprOp_Lt: - case DW_ExprOp_Ne: - case DW_ExprOp_Shl: - case DW_ExprOp_Shr: - case DW_ExprOp_Shra: - case DW_ExprOp_Xor: - case DW_ExprOp_XDeref: - case DW_ExprOp_Abs: - case DW_ExprOp_And: - case DW_ExprOp_Div: - case DW_ExprOp_Minus: - case DW_ExprOp_Mod: - case DW_ExprOp_Mul: - case DW_ExprOp_Neg: - case DW_ExprOp_Not: - case DW_ExprOp_Or: - case DW_ExprOp_Plus: - case DW_ExprOp_Rot: - case DW_ExprOp_Swap: - case DW_ExprOp_Dup: - case DW_ExprOp_Drop: - case DW_ExprOp_Over: - case DW_ExprOp_StackValue: - case DW_ExprOp_GNU_PushTlsAddress: { - // no operands - } break; - case DW_ExprOp_GNU_AddrIndex: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_GNU_ConstIndex: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - default: { InvalidPath; } break; + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { + // implicit operands + } break; + case DW_ExprOp_Const1U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); } break; + case DW_ExprOp_Const2U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); } break; + case DW_ExprOp_Const4U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); } break; + case DW_ExprOp_Const8U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u64); } break; + case DW_ExprOp_Const1S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s8); } break; + case DW_ExprOp_Const2S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); } break; + case DW_ExprOp_Const4S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s32); } break; + case DW_ExprOp_Const8S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s64); } break; + case DW_ExprOp_ConstU: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; + case DW_ExprOp_ConstS: { cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); } break; + case DW_ExprOp_Addr: { cursor += str8_deserial_read(data, cursor, &operands[0].u64, addr_size, addr_size); } break; + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { + // implicit operands + } break; + case DW_ExprOp_RegX: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; + case DW_ExprOp_ImplicitValue: { + U64 value_size = 0; String8 value = {0}; + cursor += str8_deserial_read_uleb128(data, cursor, &value_size); + cursor += str8_deserial_read_block(data, cursor, value_size, &operands[0].block); + } break; + case DW_ExprOp_Piece: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_BitPiece: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); + } break; + case DW_ExprOp_Pick: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + } break; + case DW_ExprOp_PlusUConst: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_Skip: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); + } break; + case DW_ExprOp_Bra: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); + } break; + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { + cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); + } break; + case DW_ExprOp_BRegX: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); + } break; + case DW_ExprOp_FBReg: { + cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); + } break; + case DW_ExprOp_Deref: { + // no operands + } break; + case DW_ExprOp_DerefSize: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + } break; + case DW_ExprOp_XDerefSize: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + } break; + case DW_ExprOp_Call2: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); + } break; + case DW_ExprOp_Call4: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); + } break; + case DW_ExprOp_CallRef: { + cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); + } break; + case DW_ExprOp_ImplicitPointer: + case DW_ExprOp_GNU_ImplicitPointer: { + cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); + cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); + } break; + case DW_ExprOp_Convert: + case DW_ExprOp_GNU_Convert: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_GNU_ParameterRef: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); + } break; + case DW_ExprOp_DerefType: + case DW_ExprOp_GNU_DerefType: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); + } break; + case DW_ExprOp_XDerefType: { + cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); + cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); + } break; + case DW_ExprOp_ConstType: + case DW_ExprOp_GNU_ConstType: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + cursor += str8_deserial_read_struct(data, cursor, &operands[1].u8); + cursor += str8_deserial_read_block(data, cursor, operands[1].u8, &operands[2].block); + } break; + case DW_ExprOp_RegvalType: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); + } break; + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: { + U64 entry_value_expr_size = 0; + cursor += str8_deserial_read_uleb128(data, cursor, &entry_value_expr_size); + cursor += str8_deserial_read_block(data, cursor, entry_value_expr_size, &operands[0].block); + } break; + case DW_ExprOp_Addrx: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_Constx: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_CallFrameCfa: + case DW_ExprOp_FormTlsAddress: + case DW_ExprOp_PushObjectAddress: + case DW_ExprOp_Nop: + case DW_ExprOp_Eq: + case DW_ExprOp_Ge: + case DW_ExprOp_Gt: + case DW_ExprOp_Le: + case DW_ExprOp_Lt: + case DW_ExprOp_Ne: + case DW_ExprOp_Shl: + case DW_ExprOp_Shr: + case DW_ExprOp_Shra: + case DW_ExprOp_Xor: + case DW_ExprOp_XDeref: + case DW_ExprOp_Abs: + case DW_ExprOp_And: + case DW_ExprOp_Div: + case DW_ExprOp_Minus: + case DW_ExprOp_Mod: + case DW_ExprOp_Mul: + case DW_ExprOp_Neg: + case DW_ExprOp_Not: + case DW_ExprOp_Or: + case DW_ExprOp_Plus: + case DW_ExprOp_Rot: + case DW_ExprOp_Swap: + case DW_ExprOp_Dup: + case DW_ExprOp_Drop: + case DW_ExprOp_Over: + case DW_ExprOp_StackValue: + case DW_ExprOp_GNU_PushTlsAddress: { + // no operands + } break; + case DW_ExprOp_GNU_AddrIndex: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + case DW_ExprOp_GNU_ConstIndex: { + cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); + } break; + default: { InvalidPath; } break; } - + U64 operand_count = dw_operand_count_from_expr_op(opcode); DW_ExprInst *inst = push_array(arena, DW_ExprInst, 1); inst->opcode = opcode; inst->size = cursor - inst_start; inst->operands = push_array(arena, DW_ExprOperand, operand_count); MemoryCopy(inst->operands, operands, operand_count * sizeof(DW_ExprOperand)); - + DLLPushBack(expr.first, expr.last, inst); expr.count += 1; } @@ -3224,25 +3357,25 @@ dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc U32 first_four_bytes = 0; str8_deserial_read_struct(data, off, &first_four_bytes); DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - + U64 length = 0; - U64 length_size = dw_str8_deserial_read_packed_size(data, off, &length); + U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); if (length_size == 0) { goto exit; } - + Rng1U64 entry_range = rng_1u64(off, off + length_size + length); String8 entry_data = str8_substr(data, entry_range); U64 id = 0; - U64 id_size = dw_str8_deserial_read_fmt_uint(entry_data, length_size, format, &id); + U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); if (id_size == 0) { goto exit; } - + U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64; desc_out->format = format; desc_out->type = (id == id_type) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; desc_out->entry_range = entry_range; desc_out->cie_pointer = id; desc_out->cie_pointer_off = length_size; - - exit:; + +exit:; return length + length_size; } @@ -3251,55 +3384,55 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - + U64 cie_id = 0; - U64 cie_id_size = dw_str8_deserial_read_fmt_uint(data, cursor, format, &cie_id); + U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); if (cie_id_size == 0) { goto exit; } cursor += cie_id_size; - + U8 version = 0; U64 version_size = str8_deserial_read_struct(data, cursor, &version); if (version_size == 0) { goto exit; } cursor += version_size; - + String8 aug_string = {0}; U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); if (aug_string_size == 0) { goto exit; } cursor += aug_string_size; - + U8 address_size = 0; U8 segment_selector_size = 0; if (version >= DW_Version_4) { U64 address_size_size = str8_deserial_read_struct(data, cursor, &address_size); if (address_size_size == 0) { goto exit; } cursor += address_size_size; - + U64 segment_selector_size_size = str8_deserial_read_struct(data, cursor, &segment_selector_size); if (segment_selector_size_size == 0) { goto exit; } cursor += segment_selector_size; } else { address_size = byte_size_from_arch(arch); } - + U64 code_align_factor = 0; U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); if (code_align_factor_size == 0) { goto exit; } cursor += code_align_factor_size; - + S64 data_align_factor = 0; U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); if (data_align_factor_size == 0) { goto exit; } cursor += data_align_factor_size; - + U64 ret_addr_reg = 0; U64 ret_addr_reg_size = 0; if (version == DW_Version_1) { ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); } else { ret_addr_reg_size = str8_deserial_read_uleb128(data, cursor, &ret_addr_reg); } if (ret_addr_reg_size == 0) { goto exit; } cursor += ret_addr_reg_size; - + if (aug_string.size > 0) { goto exit; } - + cie_out->insts = str8_skip(data, cursor); cie_out->aug_string = aug_string; cie_out->code_align_factor = code_align_factor; @@ -3309,9 +3442,9 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) cie_out->version = version; cie_out->address_size = address_size; cie_out->segment_selector_size = segment_selector_size; - + is_parsed = 1; - exit:; +exit:; return is_parsed; } @@ -3320,37 +3453,37 @@ dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out) { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - + // extract CIE pointer U64 cie_pointer = 0; - U64 cie_pointer_size = dw_str8_deserial_read_fmt_uint(data, cursor, format, &cie_pointer); + U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer); if (cie_pointer_size == 0) { goto exit; } cursor += cie_pointer_size; - + // extract address of first instruction U64 pc_begin = 0; U64 pc_begin_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin); if (pc_begin_size == 0) { goto exit; } cursor += pc_begin_size; - + // extract instruction range size U64 pc_range = 0; U64 pc_range_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_range); if (pc_range_size == 0) { goto exit; } cursor += pc_range_size; - + // parse augmentation data String8 aug_data = str8_substr(data, rng_1u64(cursor, cursor + cie->aug_data.size)); cursor += cie->aug_data.size; - + // commit values to out fde_out->format = format; fde_out->cie_pointer = cie_pointer; fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); fde_out->insts = str8_skip(data, cursor); - + is_parsed = 1; - exit:; +exit:; return is_parsed; } @@ -3363,7 +3496,7 @@ dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *f if (fde_desc.type == DW_DescriptorEntryType_FDE) { U64 cie_pointer_off = fde_desc.format == DW_Format_32Bit ? 4 : 12; U64 cie_pointer = 0; - U64 cie_pointer_size = dw_str8_deserial_read_fmt_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); + U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); if (cie_pointer_size) { DW_DescriptorEntry cie_desc = {0}; dw_parse_descriptor_entry_header(data, cie_pointer, &cie_desc); @@ -3376,30 +3509,30 @@ dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *f } } } - + return is_parsed; } internal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, - U64 code_align_factor, - S64 data_align_factor, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud, - U64 *bytes_read_out, - DW_CFA_Inst *inst_out) + U64 code_align_factor, + S64 data_align_factor, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud, + U64 *bytes_read_out, + DW_CFA_Inst *inst_out) { *bytes_read_out = 0; - + DW_CFA_ParseErrorCode error_code = DW_CFA_ParseErrorCode_End; U64 cursor = 0; - + // read opcode DW_CFA_Opcode raw_opcode = 0; U64 raw_opcode_size = str8_deserial_read_struct(data, cursor, &raw_opcode); if (raw_opcode_size == 0) { goto exit; } cursor += raw_opcode_size; - + // decode opcode implicit operand U64 opcode = raw_opcode & ~DW_CFA_Mask_OpcodeHi; U64 implicit_operand = 0; @@ -3407,262 +3540,262 @@ dw_parse_cfa_inst(String8 data, opcode = raw_opcode & DW_CFA_Mask_OpcodeHi; implicit_operand = raw_opcode & DW_CFA_Mask_Operand; } - + // decode operands DW_CFA_Operand operands[DW_CFA_OperandMax] = {0}; switch (opcode) { - case DW_CFA_SetLoc: { - U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64); - if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += address_size; - } break; - case DW_CFA_AdvanceLoc: { - operands[0].u64 = implicit_operand * code_align_factor; - } break; - case DW_CFA_AdvanceLoc1: { - U8 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_AdvanceLoc2: { - U16 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_AdvanceLoc4: { - U32 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_DefCfa: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].u64 = offset; - } break; - case DW_CFA_DefCfaSf: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].s64 = offset * data_align_factor; - } break; - case DW_CFA_DefCfaRegister: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_DefCfaOffset: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = offset; - } break; - case DW_CFA_DefCfaOffsetSf: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = offset * data_align_factor; - } break; - case DW_CFA_DefCfaExpr: { - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - - operands[0].block = expr; - cursor += expr_size; - } break; - case DW_CFA_Undefined: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_SameValue: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_Offset: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = implicit_operand; - operands[1].s64 = (S64)offset * data_align_factor; - } break; - case DW_CFA_OffsetExt: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].u64 = offset * data_align_factor; - } break; - case DW_CFA_OffsetExtSf: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].s64 = offset * data_align_factor; - } break; - case DW_CFA_ValOffset: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += val_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = val; - operands[1].u64 = offset * data_align_factor; - } break; - case DW_CFA_ValOffsetSf: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += val_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = val; - operands[1].s64 = offset; - } break; - case DW_CFA_Register: { - U64 dst_reg = 0; - U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg); - if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += dst_reg_size; - - U64 src_reg = 0; - U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg); - if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += src_reg_size; - - operands[0].u64 = dst_reg; - operands[1].u64 = src_reg; - } break; - case DW_CFA_Expr: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - cursor += expr_size; - - operands[0].u64 = reg; - operands[1].block = expr; - } break; - case DW_CFA_ValExpr: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { goto exit; } - cursor += val_size; - - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - cursor += expr_size; - - operands[0].u64 = val; - operands[1].block = expr; - } break; - case DW_CFA_Restore: { - operands[0].u64 = implicit_operand; - } break; - case DW_CFA_RestoreExt: {} break; - case DW_CFA_RememberState: {} break; - case DW_CFA_RestoreState: {} break; - case DW_CFA_Nop: {} break; - default: { NotImplemented; goto exit; } break; + case DW_CFA_SetLoc: { + U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64); + if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += address_size; + } break; + case DW_CFA_AdvanceLoc: { + operands[0].u64 = implicit_operand * code_align_factor; + } break; + case DW_CFA_AdvanceLoc1: { + U8 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_AdvanceLoc2: { + U16 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_AdvanceLoc4: { + U32 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_DefCfa: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].u64 = offset; + } break; + case DW_CFA_DefCfaSf: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].s64 = offset * data_align_factor; + } break; + case DW_CFA_DefCfaRegister: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_DefCfaOffset: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = offset; + } break; + case DW_CFA_DefCfaOffsetSf: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = offset * data_align_factor; + } break; + case DW_CFA_DefCfaExpr: { + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + + operands[0].block = expr; + cursor += expr_size; + } break; + case DW_CFA_Undefined: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_SameValue: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_Offset: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = implicit_operand; + operands[1].s64 = (S64)offset * data_align_factor; + } break; + case DW_CFA_OffsetExt: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].u64 = offset * data_align_factor; + } break; + case DW_CFA_OffsetExtSf: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].s64 = offset * data_align_factor; + } break; + case DW_CFA_ValOffset: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += val_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = val; + operands[1].u64 = offset * data_align_factor; + } break; + case DW_CFA_ValOffsetSf: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += val_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = val; + operands[1].s64 = offset; + } break; + case DW_CFA_Register: { + U64 dst_reg = 0; + U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg); + if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += dst_reg_size; + + U64 src_reg = 0; + U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg); + if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += src_reg_size; + + operands[0].u64 = dst_reg; + operands[1].u64 = src_reg; + } break; + case DW_CFA_Expr: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + cursor += expr_size; + + operands[0].u64 = reg; + operands[1].block = expr; + } break; + case DW_CFA_ValExpr: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { goto exit; } + cursor += val_size; + + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + cursor += expr_size; + + operands[0].u64 = val; + operands[1].block = expr; + } break; + case DW_CFA_Restore: { + operands[0].u64 = implicit_operand; + } break; + case DW_CFA_RestoreExt: {} break; + case DW_CFA_RememberState: {} break; + case DW_CFA_RestoreState: {} break; + case DW_CFA_Nop: {} break; + default: { NotImplemented; goto exit; } break; } - + // fill out output inst_out->opcode = opcode; MemoryCopyTyped(&inst_out->operands[0], &operands[0], DW_CFA_OperandMax); - + *bytes_read_out = cursor; - + error_code = DW_CFA_ParseErrorCode_NewInst; - - exit:; + +exit:; return error_code; } internal DW_CFA_InstList dw_parse_cfa_inst_list(Arena *arena, - String8 data, - U64 code_align_factor, - S64 data_align_factor, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud) + String8 data, + U64 code_align_factor, + S64 data_align_factor, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud) { U64 pos = arena_pos(arena); DW_CFA_InstList list = {0}; diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index c67123a1..e6bd6cc6 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -4,60 +4,54 @@ #ifndef DWARF_PARSE_H #define DWARF_PARSE_H -//////////////////////////////// -//~ rjf: Raw DWARF Info Bundle - -typedef struct DW_Section DW_Section; -struct DW_Section +typedef struct DW_Section { + String8 name; String8 data; - B32 is_dwo; -}; + B32 is_dwo; +} DW_Section; -typedef struct DW_Raw DW_Raw; -struct DW_Raw +typedef struct DW_Input { DW_Section sec[DW_Section_Count]; -}; + DW_Section sup[DW_Section_Count]; +} DW_Input; -typedef struct DW_ListUnit DW_ListUnit; -struct DW_ListUnit +typedef struct DW_ListUnit { DW_Version version; - U64 address_size; - U64 segment_selector_size; - U64 entry_size; - String8 entries; -}; + U64 address_size; + U64 segment_selector_size; + U64 entry_size; + String8 entries; +} DW_ListUnit; -typedef struct DW_ListUnitInput DW_ListUnitInput; -struct DW_ListUnitInput +typedef struct DW_ListUnitInput { - U64 addr_count; - U64 str_offset_count; - U64 rnglist_count; - U64 loclist_count; - Rng1U64Array addr_ranges; - Rng1U64Array str_offset_ranges; - Rng1U64Array rnglist_ranges; - Rng1U64Array loclist_ranges; - DW_ListUnit *addrs; - DW_ListUnit *str_offsets; - DW_ListUnit *rnglists; - DW_ListUnit *loclists; -}; + U64 addr_count; + U64 str_offset_count; + U64 rnglist_count; + U64 loclist_count; + Rng1U64Array addr_ranges; + Rng1U64Array str_offset_ranges; + Rng1U64Array rnglist_ranges; + Rng1U64Array loclist_ranges; + DW_ListUnit *addrs; + DW_ListUnit *str_offsets; + DW_ListUnit *rnglists; + DW_ListUnit *loclists; +} DW_ListUnitInput; -typedef struct DW_AbbrevTableEntry DW_AbbrevTableEntry; -struct DW_AbbrevTableEntry +typedef struct DW_AbbrevTableEntry { U64 id; U64 off; -}; +} DW_AbbrevTableEntry; typedef struct DW_AbbrevTable DW_AbbrevTable; struct DW_AbbrevTable { - U64 count; + U64 count; DW_AbbrevTableEntry *entries; }; @@ -69,8 +63,7 @@ typedef enum DW_AbbrevKind DW_Abbrev_AttribSequenceEnd, DW_Abbrev_DIEBegin, DW_Abbrev_DIEEnd, -} -DW_AbbrevKind; +} DW_AbbrevKind; typedef U32 DW_AbbrevFlags; enum @@ -79,15 +72,14 @@ enum DW_AbbrevFlag_HasChildren = (1 << 1), }; -typedef struct DW_Abbrev DW_Abbrev; -struct DW_Abbrev +typedef struct DW_Abbrev { - DW_AbbrevKind kind; - U64 sub_kind; - U64 id; - U64 const_value; + DW_AbbrevKind kind; + U64 sub_kind; + U64 id; + U64 const_value; DW_AbbrevFlags flags; -}; +} DW_Abbrev; typedef union DW_Form { @@ -108,78 +100,71 @@ typedef union DW_Form U64 rnglistx; U64 ptr; U64 implicit_const; -} -DW_Form; +} DW_Form; -typedef struct DW_Attrib DW_Attrib; -struct DW_Attrib +typedef struct DW_Attrib { - U64 info_off; - DW_AttribKind attrib_kind; - DW_FormKind form_kind; - DW_Form form; -}; + U64 info_off; + U64 abbrev_off; + U64 abbrev_id; + DW_AttribKind attrib_kind; + DW_FormKind form_kind; + DW_Form form; +} DW_Attrib; -typedef struct DW_AttribNode DW_AttribNode; -struct DW_AttribNode +typedef struct DW_AttribNode { - DW_AttribNode *next; - DW_Attrib v; -}; + struct DW_AttribNode *next; + DW_Attrib v; +} DW_AttribNode; -typedef struct DW_AttribList DW_AttribList; -struct DW_AttribList +typedef struct DW_AttribList { DW_AttribNode *first; DW_AttribNode *last; - U64 count; -}; + U64 count; +} DW_AttribList; -typedef struct DW_Tag DW_Tag; -struct DW_Tag +typedef struct DW_Tag { - B32 has_children; - U64 abbrev_id; - DW_TagKind kind; - DW_AttribList attribs; - U64 info_off; - U8 v[1]; -}; + B32 has_children; + U64 abbrev_id; + DW_TagKind kind; + DW_AttribList attribs; + U64 info_off; + U8 v[1]; +} DW_Tag; -typedef struct DW_TagNode DW_TagNode; -struct DW_TagNode +typedef struct DW_TagNode { - DW_Tag tag; - DW_TagNode *sibling; - DW_TagNode *first_child; - DW_TagNode *last_child; -}; + DW_Tag tag; + struct DW_TagNode *sibling; + struct DW_TagNode *first_child; + struct DW_TagNode *last_child; +} DW_TagNode; -typedef struct DW_Loc DW_Loc; -struct DW_Loc +typedef struct DW_Loc { Rng1U64 range; String8 expr; -}; +} DW_Loc; -typedef struct DW_LocNode DW_LocNode; -struct DW_LocNode +typedef struct DW_LocNode { - DW_LocNode *next; - DW_Loc v; -}; + DW_Loc v; + struct DW_LocNode *next; +} DW_LocNode; -typedef struct DW_LocList DW_LocList; -struct DW_LocList +typedef struct DW_LocList { + U64 count; DW_LocNode *first; DW_LocNode *last; - U64 count; -}; +} DW_LocList; -typedef struct DW_CompUnit DW_CompUnit; -struct DW_CompUnit +typedef struct DW_CompUnit { + B32 relaxed; DW_Ext ext; DW_CompUnitKind kind; DW_Version version; @@ -198,7 +183,7 @@ struct DW_CompUnit U64 dwo_id; DW_Tag tag; HashTable *tag_ht; -}; +} DW_CompUnit; typedef struct DW_TagTree { @@ -343,12 +328,12 @@ typedef union DW_ExprOperand U16 u16; U32 u32; U64 u64; - + S8 s8; S16 s16; S32 s32; S64 s64; - + String8 block; } DW_ExprOperand; @@ -446,10 +431,18 @@ typedef struct DW_CFA_InstList #define DW_DECODE_PTR(name) U64 name(String8 data, void *ud, U64 *ptr_out) typedef DW_DECODE_PTR(DW_DecodePtr); +// hasher + +internal U64 dw_hash_from_string(String8 string); + // deserial helpers -internal U64 dw_str8_deserial_read_packed_size(String8 string, U64 off, U64 *size_out); -internal U64 dw_str8_deserial_read_fmt_uint(String8 string, U64 off, DW_Format format, U64 *uint_out); +internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out); +internal U64 str8_deserial_read_dwarf_uint (String8 string, U64 off, DW_Format format, U64 *uint_out); +internal U64 str8_deserial_read_uleb128 (String8 string, U64 off, U64 *value_out); +internal U64 str8_deserial_read_sleb128 (String8 string, U64 off, S64 *value_out); +internal U64 str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out); +internal U64 str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out); internal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data); @@ -459,7 +452,7 @@ internal U64 dw_read_list_unit_header_addr (String8 unit_data, DW_ListUnit internal U64 dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out); internal U64 dw_read_list_unit_header_list (String8 unit_data, DW_ListUnit *lu_out); -internal DW_ListUnitInput dw_list_unit_input_from_raw(Arena *arena, DW_Raw *input); +internal DW_ListUnitInput dw_list_unit_input_from_input(Arena *arena, DW_Input *input); internal U64 dw_offset_from_list_unit(DW_ListUnit *lu, U64 index); internal U64 dw_addr_from_list_unit (DW_ListUnit *lu, U64 index); @@ -475,7 +468,7 @@ internal U64 dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U6 internal U64 dw_read_form(String8 data, U64 off, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, U64 implicit_const, DW_Form *form_out); internal U64 dw_read_tag (Arena *arena, String8 tag_data, U64 tag_off, U64 tag_base, DW_AbbrevTable abbrev_table, String8 abbrev_data, DW_Version version, DW_Format unit_format, U64 address_size, DW_Tag *tag_out); -internal U64 dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); +internal U64 dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); // attrib interp @@ -488,56 +481,56 @@ internal S64 dw_interp_const_s64 (DW_FormKind form_kind, DW_Form form) internal S32 dw_interp_const_s32 (DW_FormKind form_kind, DW_Form form); internal B32 dw_interp_flag (DW_FormKind form_kind, DW_Form form); internal U64 dw_interp_address (U64 address_size, U64 base_addr, DW_ListUnit *addr_xlist, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_block (DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_string (DW_Raw *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_line_ptr (DW_Raw *input, DW_FormKind form_kind, DW_Form form); +internal String8 dw_interp_block (DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal String8 dw_interp_string (DW_Input *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_FormKind form_kind, DW_Form form); +internal String8 dw_interp_line_ptr (DW_Input *input, DW_FormKind form_kind, DW_Form form); internal DW_LineFile * dw_interp_file (DW_LineVMHeader *line_vm, DW_FormKind form_kind, DW_Form form); -internal DW_Reference dw_interp_ref (DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal DW_LocList dw_interp_loclist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal DW_Reference dw_interp_ref (DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal DW_LocList dw_interp_loclist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal String8 dw_exprloc_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U128 dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U64 dw_const_u64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U32 dw_const_u32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal S64 dw_const_s64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal S32 dw_const_s32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal B32 dw_flag_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U64 dw_address_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_block_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_string_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_line_ptr_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_exprloc_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U128 dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U64 dw_const_u64_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U32 dw_const_u32_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal S64 dw_const_s64_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal S32 dw_const_s32_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal B32 dw_flag_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U64 dw_address_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_block_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_string_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_line_ptr_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); internal DW_LineFile * dw_file_from_attrib (DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Attrib *attrib); -internal DW_Reference dw_ref_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW_Reference dw_ref_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_exprloc_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U128 dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U64 dw_const_u64_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U32 dw_const_u32_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal B32 dw_flag_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U64 dw_address_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_block_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_string_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind); -internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_exprloc_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U128 dw_const_u128_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U64 dw_const_u64_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U32 dw_const_u32_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal B32 dw_flag_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U64 dw_address_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_block_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_string_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind); +internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); // compile unit -internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 offset); -internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu); +internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed); +internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu); internal HashTable * dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree); internal DW_TagNode * dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off); // line info -internal U64 dw_read_line_file(String8 line_data, U64 line_off, DW_Raw *input, DW_Version unit_version, DW_Format unit_format, DW_Ext ext, U64 address_size, DW_ListUnit *str_offsets, U64 enc_count, U64 *enc_arr, DW_LineFile *line_file_out); -internal U64 dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Raw *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); +internal U64 dw_read_line_file(String8 line_data, U64 line_off, DW_Input *input, DW_Version unit_version, DW_Format unit_format, DW_Ext ext, U64 address_size, DW_ListUnit *str_offsets, U64 enc_count, U64 *enc_arr, DW_LineFile *line_file_out); +internal U64 dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); internal void dw_line_vm_reset(DW_LineVMState *state, B32 default_is_stmt); internal void dw_line_vm_advance(DW_LineVMState *state, U64 advance, U64 min_inst_len, U64 max_ops_for_inst); internal DW_LineSeqNode * dw_push_line_seq(Arena* arena, DW_LineTableParseResult *parsed_tbl); @@ -545,11 +538,11 @@ internal DW_LineNode * dw_push_line(Arena *arena, DW_LineTableParseResult *tb internal String8 dw_path_from_file(Arena *arena, DW_LineVMHeader *vm, DW_LineFile *file); internal String8 dw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx); -internal DW_LineTableParseResult dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Raw *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets); +internal DW_LineTableParseResult dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets); // helper for .debug_pubtypes and .debug_pubnames -internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind); +internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind); // expression diff --git a/src/dwarf/eh_dump.h b/src/dwarf/eh_dump.h index 598a8005..8ba5a6cb 100644 --- a/src/dwarf/eh_dump.h +++ b/src/dwarf/eh_dump.h @@ -8,8 +8,8 @@ //~ Dump Subset Types #define EH_DumpSubset_XList \ -X(EhFrameHdr, eh_frame_hdr, ".eh_frame_hdr") \ -X(EhFrame, eh_frame, ".eh_frame") + X(EhFrameHdr, eh_frame_hdr, ".eh_frame_hdr") \ + X(EhFrame, eh_frame, ".eh_frame") typedef enum EH_DumpSubset { #define X(name, name_lower, title) EH_DumpSubset_##name, @@ -45,3 +45,4 @@ read_only global String8 eh_name_title_from_dump_subset_table[] = internal String8List eh_dump_list_from_data(Arena *arena, Arch arch, U64 eh_frame_hdr_vaddr, U64 eh_frame_vaddr, String8 eh_frame_hdr, String8 eh_frame, EH_DumpSubsetFlags subset_flags); #endif // EH_FRAME_DUMP_H + diff --git a/src/dwarf/eh_frame.c b/src/dwarf/eh_frame.c index 33515e03..cf455905 100644 --- a/src/dwarf/eh_frame.c +++ b/src/dwarf/eh_frame.c @@ -5,69 +5,69 @@ internal U64 eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) { U64 ptr_off = off; - + if (encoding == EH_PtrEnc_Omit) { return 0; } - + // align read offset as needed if (encoding == EH_PtrEnc_Aligned) { ptr_off = AlignPow2(ptr_off, ptr_ctx->ptr_align); encoding = EH_PtrEnc_Ptr; } - + // decode pointer value U64 decode_size = 0; U64 raw_ptr_size = 0; U64 raw_ptr = 0; switch (encoding & EH_PtrEnc_TypeMask) { - default: { InvalidPath; } break; - - case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; - case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; - case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; - case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; - ufixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - } break; - - // TODO: Signed is actually just a flag that indicates this int is negavite. - // There shouldn't be a read for Signed. - // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. - case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; - - case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; - case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; - case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; - sfixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); - } break; - - case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; - case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; - } + default: { InvalidPath; } break; + case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; + case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; + case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; + case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; + ufixed: { + decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); + } break; + + // TODO: Signed is actually just a flag that indicates this int is negavite. + // There shouldn't be a read for Signed. + // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. + case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; + + case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; + case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; + case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; + sfixed: { + decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); + raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); + } break; + + case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; + case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; + } + // apply relative bases if (decode_size > 0) { U64 ptr = raw_ptr; switch (encoding & EH_PtrEnc_ModifierMask) { - case 0: break; - case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; - case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; - case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; - case EH_PtrEnc_FuncRel: { - Assert(!"TODO: need a sample to verify implementation"); - ptr = ptr_ctx->func_vaddr + raw_ptr; - } break; - default: { InvalidPath; } break; + case 0: break; + case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; + case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; + case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; + case EH_PtrEnc_FuncRel: { + Assert(!"TODO: need a sample to verify implementation"); + ptr = ptr_ctx->func_vaddr + raw_ptr; + } break; + default: { InvalidPath; } break; } - + if (ptr_out) { *ptr_out = ptr; } } - + return decode_size; } @@ -76,49 +76,49 @@ eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) { EH_FrameHdr header = {0}; U64 cursor = 0; - + U64 version_size = str8_deserial_read_struct(data, cursor, &header.version); if (version_size == 0) { goto exit; } cursor += version_size; - + if (header.version == 1) { U64 eh_frame_ptr_enc_size = str8_deserial_read_struct(data, cursor, &header.eh_frame_ptr_enc); if (eh_frame_ptr_enc_size == 0) { goto exit; } cursor += eh_frame_ptr_enc_size; - + U64 fde_count_enc_size = str8_deserial_read_struct(data, cursor, &header.fde_count_enc); if (fde_count_enc_size == 0) { goto exit; } cursor += fde_count_enc_size; - + U64 table_enc_size = str8_deserial_read_struct(data, cursor, &header.table_enc); if (table_enc_size == 0) { goto exit; } cursor += table_enc_size; - + cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.eh_frame_ptr_enc, &header.eh_frame_ptr); cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.fde_count_enc, &header.fde_count); - + switch (header.table_enc & EH_PtrEnc_TypeMask) { - case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; - case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 - case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; - case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; - case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; - case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; - case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 - case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; - case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; - case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; - default: { InvalidPath; } break; + case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; + case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; + default: { InvalidPath; } break; } header.entry_byte_size = header.field_byte_size * 2; - + header.table = str8_skip(data, cursor); AssertAlways(header.table.size == header.entry_byte_size * header.fde_count); } else { Assert(0 && "unknown version"); } - - exit:; + +exit:; return header; } @@ -130,9 +130,9 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c // On 32bit arch it is a 4-byte and on 64-bit 8-byte value. // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html // Reference doc doesn't clarify structure for EH Data though - + U64 cursor = 0; - + U64 aug_data_size = 0; EH_AugFlags aug_flags = 0; EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; @@ -141,30 +141,30 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c U64 handler_ip = 0; if (str8_match(str8_prefix(aug_string, 1), str8_lit("z"), 0)) { cursor = str8_deserial_read_uleb128(aug_data, cursor, &aug_data_size); - + for (U8 *ptr = aug_string.str+1; ptr < (aug_string.str+aug_string.size); ptr += 1) { switch (*ptr) { - case 'L': { - cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding); - aug_flags |= EH_AugFlag_HasLSDA; - } break; - case 'P': { - cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding); - cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip); - aug_flags |= EH_AugFlag_HasHandler; - } break; - case 'R': { - cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); - aug_flags |= EH_AugFlag_HasAddrEnc; - } break; - case 'S': { - aug_flags |= EH_AugFlag_SignalFrame; - } break; - default: { Assert(!"failed to parse augmentation string"); goto exit; } break; + case 'L': { + cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding); + aug_flags |= EH_AugFlag_HasLSDA; + } break; + case 'P': { + cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding); + cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip); + aug_flags |= EH_AugFlag_HasHandler; + } break; + case 'R': { + cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); + aug_flags |= EH_AugFlag_HasAddrEnc; + } break; + case 'S': { + aug_flags |= EH_AugFlag_SignalFrame; + } break; + default: { Assert(!"failed to parse augmentation string"); goto exit; } break; } } } - + if (aug_out) { aug_out->handler_ip = handler_ip; aug_out->handler_encoding = handler_encoding; @@ -173,8 +173,8 @@ eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_c aug_out->flags = aug_flags; aug_out->size = aug_data_size; } - - exit:; + +exit:; U64 parse_size = cursor; return parse_size; } @@ -185,24 +185,24 @@ eh_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc U32 first_four_bytes = 0; str8_deserial_read_struct(data, off, &first_four_bytes); DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - + U64 length = 0; - U64 length_size = dw_str8_deserial_read_packed_size(data, off, &length); + U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); if (length_size == 0) { goto exit; } - + Rng1U64 entry_range = rng_1u64(off, off + length_size + length); String8 entry_data = str8_substr(data, entry_range); U64 id = 0; - U64 id_size = dw_str8_deserial_read_fmt_uint(entry_data, length_size, format, &id); + U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); if (id_size == 0) { goto exit; } - + desc_out->format = format; desc_out->type = (id == 0) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; desc_out->entry_range = entry_range; desc_out->cie_pointer = id; desc_out->cie_pointer_off = off + length_size; - - exit:; + +exit:; return length + length_size; } @@ -211,17 +211,17 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - + U64 cie_id = 0; - U64 cie_id_size = dw_str8_deserial_read_fmt_uint(data, cursor, format, &cie_id); + U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); if (cie_id_size == 0) { goto exit; } cursor += cie_id_size; - + U8 version = 0; U64 version_size = str8_deserial_read_struct(data, cursor, &version); if (version_size == 0) { goto exit; } cursor += version_size; - + String8 aug_string = {0}; String8 aug_data = {0}; EH_Augmentation aug = {0}; @@ -232,33 +232,33 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); if (aug_string_size == 0) { goto exit; } cursor += aug_string_size; - + U64 eh_data = 0; if (str8_match(aug_string, str8_lit("eh"), 0)) { U64 arch_byte_size = byte_size_from_arch(arch); cursor += str8_deserial_read(data, cursor, &eh_data, arch_byte_size, arch_byte_size); } - + U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); if (code_align_factor_size == 0) { goto exit; } cursor += code_align_factor_size; - + U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); if (data_align_factor_size == 0) { goto exit; } cursor += data_align_factor_size; - + ret_addr_reg = 0; U64 ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); if (ret_addr_reg_size == 0) { goto exit; } cursor += ret_addr_reg_size; - + U64 aug_data_size = eh_parse_aug_data(aug_string, str8_skip(data, cursor), pc + cursor, ptr_ctx, &aug); aug_data = str8_substr(data, r1u64(cursor, cursor + aug.size)); cursor += aug_data_size; } else { Assert(0 && "unexpected version"); } - + cie_out->insts = str8_skip(data, cursor); cie_out->aug_string = aug_string; cie_out->aug_data = aug_data; @@ -269,11 +269,11 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c cie_out->version = version; cie_out->address_size = byte_size_from_arch(arch); cie_out->segment_selector_size = 0; - + cie_out->ext[EH_CIE_Ext_LSDAEnc] = EH_PtrEnc_Omit; cie_out->ext[EH_CIE_Ext_AddrEnc] = EH_PtrEnc_Omit; cie_out->ext[EH_CIE_Ext_HandlerEnc] = EH_PtrEnc_Omit; - + if (aug.flags & EH_AugFlag_HasLSDA) { cie_out->ext[EH_CIE_Ext_LSDAEnc] = aug.lsda_encoding; } @@ -284,9 +284,9 @@ eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_c cie_out->ext[EH_CIE_Ext_HandlerEnc] = aug.handler_encoding; cie_out->ext[EH_CIE_Ext_HandlerIp ] = aug.handler_ip; } - + is_parsed = 1; - exit:; +exit:; return is_parsed; } @@ -295,7 +295,7 @@ eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 8 : 20; - + U64 pc_begin = 0; U64 pc_delta = 0; EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; @@ -303,21 +303,21 @@ eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr U64 pc_begin_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc, &pc_begin); if (pc_begin_size == 0) { goto exit; } cursor += pc_begin_size; - + U64 pc_delta_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc & EH_PtrEnc_TypeMask, &pc_delta); if (pc_delta_size == 0) { goto exit; } cursor += pc_delta_size; } - + if (cursor + cie->aug_data.size > data.size) { goto exit; } cursor += cie->aug_data.size; - + fde_out->format = format; fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_delta); fde_out->insts = str8_skip(data, cursor); - + is_parsed = 1; - exit:; +exit:; return is_parsed; } @@ -326,7 +326,7 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) { U64 fde_addr = max_U64; U64 fde_idx = max_U64; - + if (header.version == 1) { if (header.fde_count > 0) { U64 first = 0; @@ -339,7 +339,7 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) if (first > pc) { goto exit; } - + U64 last_off = header.table.size - header.entry_byte_size; U64 last = 0; U64 last_size = eh_parse_ptr(header.table, last_off, ptr_ctx->pc_vaddr + last_off, ptr_ctx, header.table_enc, &last); @@ -348,7 +348,7 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) fde_idx = header.fde_count - 1; goto exit; } - + U64 l = 0; U64 r = header.fde_count - 1; while (l <= r) { @@ -366,12 +366,12 @@ eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) goto exit; } } - + fde_idx = l > 0 ? l-1 : 0; } } - - exit:; + +exit:; if (fde_idx < header.fde_count) { U64 fde_addr_off = (fde_idx * header.entry_byte_size) + header.field_byte_size; U64 fde_addr_size = eh_parse_ptr(header.table, fde_addr_off, ptr_ctx->pc_vaddr + fde_addr_off, ptr_ctx, header.table_enc, &fde_addr); @@ -390,7 +390,7 @@ internal String8 eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, DW_FDE *fde) { Temp scratch = scratch_begin(&arena, 1); - + // make .eh_frame_hdr String8List srl = {0}; str8_serial_begin(scratch.arena, &srl); @@ -400,14 +400,14 @@ eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // table encoding str8_serial_push_u64(scratch.arena, &srl, fde_count); // fde_count String8 header = str8_serial_end(scratch.arena, &srl); - + // alloc buffer for output U64 buffer_size = header.size + sizeof(EH_FrameHdrEntry) * fde_count; U8 *buffer = push_array(arena, U8, buffer_size); - + // copy header MemoryCopyStr8(buffer, header); - + // write the table EH_FrameHdrEntry *table = (EH_FrameHdrEntry *)(buffer + header.size); for EachIndex(fde_idx, fde_count) { @@ -415,7 +415,7 @@ eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, table[fde_idx].fde_offset = fde_offsets[fde_idx]; } radsort(table, fde_count, eh_frame_hdr_entry_sort); - + String8 eh_frame_hdr = str8(buffer, buffer_size); scratch_end(scratch); return eh_frame_hdr; @@ -432,16 +432,16 @@ internal String8 eh_string_from_ptr_enc_type(EH_PtrEnc type) { switch (type) { - case EH_PtrEnc_Ptr: return str8_lit("Ptr"); - case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); - case EH_PtrEnc_UData2: return str8_lit("UData2"); - case EH_PtrEnc_UData4: return str8_lit("UData4"); - case EH_PtrEnc_UData8: return str8_lit("UData8"); - case EH_PtrEnc_Signed: return str8_lit("Signed"); - case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); - case EH_PtrEnc_SData2: return str8_lit("SData2"); - case EH_PtrEnc_SData4: return str8_lit("SData4"); - case EH_PtrEnc_SData8: return str8_lit("SData8"); + case EH_PtrEnc_Ptr: return str8_lit("Ptr"); + case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); + case EH_PtrEnc_UData2: return str8_lit("UData2"); + case EH_PtrEnc_UData4: return str8_lit("UData4"); + case EH_PtrEnc_UData8: return str8_lit("UData8"); + case EH_PtrEnc_Signed: return str8_lit("Signed"); + case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); + case EH_PtrEnc_SData2: return str8_lit("SData2"); + case EH_PtrEnc_SData4: return str8_lit("SData4"); + case EH_PtrEnc_SData8: return str8_lit("SData8"); } return str8_zero(); } @@ -450,11 +450,11 @@ internal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier) { switch (modifier) { - case EH_PtrEnc_PcRel: return str8_lit("PcRel"); - case EH_PtrEnc_TextRel: return str8_lit("TextRel"); - case EH_PtrEnc_DataRel: return str8_lit("DataRel"); - case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); - case EH_PtrEnc_Aligned: return str8_lit("Aligned"); + case EH_PtrEnc_PcRel: return str8_lit("PcRel"); + case EH_PtrEnc_TextRel: return str8_lit("TextRel"); + case EH_PtrEnc_DataRel: return str8_lit("DataRel"); + case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); + case EH_PtrEnc_Aligned: return str8_lit("Aligned"); } return str8_zero(); } diff --git a/src/dwarf/eh_frame.h b/src/dwarf/eh_frame.h index 5e8807c7..9ae4a257 100644 --- a/src/dwarf/eh_frame.h +++ b/src/dwarf/eh_frame.h @@ -20,7 +20,7 @@ enum EH_PtrEnc_SData2 = 0x0A, // Signed 16-bit value EH_PtrEnc_SData4 = 0x0B, // Signed 32-bit value EH_PtrEnc_SData8 = 0x0C, // Signed 64-bit value - + EH_PtrEnc_TypeMask = 0x0F, }; @@ -31,7 +31,7 @@ enum EH_PtrEnc_DataRel = 0x30, // Value is relative to the .got or .eh_frame_hdr section. EH_PtrEnc_FuncRel = 0x40, // Value is relative to the function. EH_PtrEnc_Aligned = 0x50, // Value is aligned to an address unit sized boundary. - + EH_PtrEnc_ModifierMask = 0x70, }; @@ -104,7 +104,7 @@ typedef struct EH_DecodePtrCtx EH_PtrEnc addr_enc; EH_PtrCtx *ptr_ctx; } EH_DecodePtrCtx; - + //////////////////////////////// internal U64 eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); @@ -123,3 +123,4 @@ internal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier); internal String8 eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc); #endif // EH_FRAME_H + diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 04a74ea5..3811d462 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -613,10 +613,12 @@ rb_thread_entry_point(void *p) }break; } - //- rjf: convert DWARF in inputs to RDI info + //- rjf: convert inputs to RDI info B32 convert_done = 0; + RDIM_BakeParams pdb_bake_params = {0}; RDIM_BakeParams dwarf_bake_params = {0}; { + //- rjf: PE inputs w/ DWARF, or ELF inputs => DWARF -> RDI conversion B32 pe_w_dwarf = (input_files_from_format_table[RB_FileFormat_PE].count != 0 && input_files_from_format_table[RB_FileFormat_PE].first->v->format_flags & RB_FileFormatFlag_HasDWARF); B32 elf_w_dwarf = (input_files_from_format_table[RB_FileFormat_ELF32].count != 0 || @@ -628,103 +630,7 @@ rb_thread_entry_point(void *p) else if(pe_w_dwarf) { log_infof("PEs w/ DWARF specified; converting DWARF data to RDI\n"); } else if(elf_w_dwarf) { log_infof("ELFs specified; converting DWARF data to RDI\n"); } - // rjf: input files -> exe, exe metadata, & raw dwarf - RB_File *exe_file = &rb_file_nil; - Arch arch = Arch_Null; - U64 base_vaddr = 0; - RDIM_BinarySectionList binary_sections = {0}; - DW_Raw raw = {0}; - B32 got_dwarf = 0; - { - for(RB_FileNode *n = input_files.first; n != 0; n = n->next) - { - // rjf: the first PE w/ DWARF, *or* the first ELF => pick as our exectable - if(exe_file == &rb_file_nil && - ((n->v->format == RB_FileFormat_PE && n->v->format_flags & RB_FileFormatFlag_HasDWARF) || - n->v->format == RB_FileFormat_ELF64 || - n->v->format == RB_FileFormat_ELF32)) - { - exe_file = n->v; - } - - // rjf: PE => get PE info - PE_BinInfo pe = {0}; - if(n->v->format == RB_FileFormat_PE) - { - pe = pe_bin_info_from_data(arena, n->v->data); - if(arch == Arch_Null) - { - arch = pe.arch; - } - if(base_vaddr == 0) - { - base_vaddr = pe.image_base; - } - if(binary_sections.count == 0) - { - String8 raw_sections = str8_substr(n->v->data, pe.section_table_range); - COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader)*pe.section_count); - String8 string_table = str8_substr(n->v->data, pe.string_table_range); - binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, n->v->data, string_table, pe.section_count, section_table); - } - } - - // rjf: ELF => get ELF info - ELF_Bin elf = {0}; - if(n->v->format == RB_FileFormat_ELF32 || - n->v->format == RB_FileFormat_ELF64) - { - elf = elf_bin_from_data(arena, n->v->data); - if(arch == Arch_Null) - { - arch = arch_from_elf_machine(elf.hdr.e_machine); - } - if(base_vaddr == 0) - { - base_vaddr = elf_base_addr_from_bin(&elf); - } - if(binary_sections.count == 0) - { - binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, n->v->data, &elf, elf.shdrs); - } - } - - // rjf: PE w/ DWARF => gather DWARF sections - if(!got_dwarf && n->v->format == RB_FileFormat_PE && n->v->format_flags & RB_FileFormatFlag_HasDWARF) - { - String8 raw_sections = str8_substr(n->v->data, pe.section_table_range); - COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader)*pe.section_count); - String8 string_table = str8_substr(n->v->data, pe.string_table_range); - raw = dw_raw_from_coff_section_table(arena, n->v->data, string_table, pe.section_count, section_table); - got_dwarf = 1; - } - - // rjf: ELF w/ DWARF => gather DWARF sections - if(!got_dwarf && (n->v->format == RB_FileFormat_ELF32 || n->v->format == RB_FileFormat_ELF64) && n->v->format_flags & RB_FileFormatFlag_HasDWARF) - { - raw = dw_raw_from_elf_bin(arena, n->v->data, &elf); - got_dwarf = 1; - } - } - } - - // rjf: convert (NEW) -#if 0 - D2R2_ConvertParams convert_params = {0}; - { - convert_params.exe_name = exe_file->path; - convert_params.exe_data = exe_file->data; - convert_params.arch = arch; - convert_params.base_vaddr = base_vaddr; - convert_params.binary_sections = binary_sections; - convert_params.raw = raw; - convert_params.subset_flags = subset_flags; - convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); - } - ProfScope("convert") dwarf_bake_params = d2r2_convert(arena, &convert_params); - // rjf: convert -#else D2R_ConvertParams convert_params = {0}; { B32 got_exe = 0; @@ -804,37 +710,34 @@ rb_thread_entry_point(void *p) convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); -#endif } - } - lane_sync(); - - //- rjf: convert PDB in inputs to RDI info - RDIM_BakeParams pdb_bake_params = {0}; - if(input_files_from_format_table[RB_FileFormat_PDB].count != 0) - { - convert_done = 1; - log_infof("PDBs specified; converting PDB data to RDI\n"); - // rjf: get EXE/PDB file data - RB_File *exe_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PE]); - RB_File *pdb_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PDB]); - String8 exe_path = exe_file->path; - String8 pdb_path = pdb_file->path; - String8 exe_data = exe_file->data; - String8 pdb_data = pdb_file->data; - - // rjf: convert - P2R_ConvertParams convert_params = {0}; + //- rjf: PDB inputs => PDB -> RDI conversion + if(input_files_from_format_table[RB_FileFormat_PDB].count != 0) { - convert_params.input_pdb_name = pdb_path; - convert_params.input_exe_name = exe_path; - convert_params.input_pdb_data = pdb_data; - convert_params.input_exe_data = exe_data; - convert_params.subset_flags = subset_flags; - convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + convert_done = 1; + log_infof("PDBs specified; converting PDB data to RDI\n"); + + // rjf: get EXE/PDB file data + RB_File *exe_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PE]); + RB_File *pdb_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PDB]); + String8 exe_path = exe_file->path; + String8 pdb_path = pdb_file->path; + String8 exe_data = exe_file->data; + String8 pdb_data = pdb_file->data; + + // rjf: convert + P2R_ConvertParams convert_params = {0}; + { + convert_params.input_pdb_name = pdb_path; + convert_params.input_exe_name = exe_path; + convert_params.input_pdb_data = pdb_data; + convert_params.input_exe_data = exe_data; + convert_params.subset_flags = subset_flags; + convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + } + ProfScope("convert") pdb_bake_params = p2r_convert(arena, &convert_params); } - ProfScope("convert") pdb_bake_params = p2r_convert(arena, &convert_params); } lane_sync(); @@ -1196,7 +1099,7 @@ rb_thread_entry_point(void *p) Arch arch = Arch_Null; PE_BinInfo pe = {0}; ELF_Bin elf = {0}; - DW_Raw dw = {0}; + DW_Input dw = {0}; U64 eh_frame_hdr_vaddr = 0; U64 eh_frame_vaddr = 0; String8 eh_frame_hdr = {0}; @@ -1212,7 +1115,7 @@ rb_thread_entry_point(void *p) { elf = elf_bin_from_data(arena, f->data); arch = arch_from_elf_machine(elf.hdr.e_machine); - + for EachIndex(sect_idx, elf.hdr.e_shnum) { ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; @@ -1221,7 +1124,7 @@ rb_thread_entry_point(void *p) { eh_frame_hdr = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); eh_frame_hdr_vaddr = shdr->sh_addr; - + } else if(str8_match(name, str8_lit(".eh_frame"), 0)) { @@ -1238,12 +1141,12 @@ rb_thread_entry_point(void *p) U64 section_count = raw_sections.size / sizeof(COFF_SectionHeader); COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_sections.str; String8 string_table = str8_substr(f->data, pe.string_table_range); - dw = dw_raw_from_coff_section_table(arena, f->data, string_table, section_count, section_table); + dw = dw_input_from_coff_section_table(arena, f->data, string_table, section_count, section_table); } else if(f->format == RB_FileFormat_ELF32 || f->format == RB_FileFormat_ELF64) { - dw = dw_raw_from_elf_bin(arena, f->data, &elf); + dw = dw_input_from_elf_bin(arena, f->data, &elf); } } } @@ -1338,7 +1241,7 @@ rb_thread_entry_point(void *p) } } } - + if(eh_dump_subset_flags) { if(lane_idx() == 0) diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 2769ef3e..5b742c04 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -34,7 +34,6 @@ #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "rdi_from_dwarf/rdi_from_dwarf.h" -#include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "radbin/radbin.h" //- rjf: [c] @@ -61,7 +60,6 @@ #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" #include "rdi_from_dwarf/rdi_from_dwarf.c" -#include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "radbin/radbin.c" //////////////////////////////// diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index caa0fe21..45f13d62 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -45,6 +45,7 @@ d2r_rdi_language_from_dw_language(DW_Language v) switch(v) { default:{}break; + case DW_Language_C89: case DW_Language_C99: case DW_Language_C11: @@ -52,6 +53,7 @@ d2r_rdi_language_from_dw_language(DW_Language v) { result = RDI_Language_C; }break; + case DW_Language_CPlusPlus03: case DW_Language_CPlusPlus11: case DW_Language_CPlusPlus14: @@ -70,7 +72,7 @@ d2r_rdi_reg_code_from_dw_reg_x86(DW_RegX86 v) switch(v) { default:{}break; -#define X(reg_dw, val_dw, reg_rdi, ...) case DW_RegX86_##reg_dw:{result = RDI_RegCodeX86_##reg_rdi;}break; +#define X(reg_dw, val_dw, reg_rdi, ...) case DW_RegX86_##reg_dw: result = RDI_RegCodeX86_##reg_rdi; break; DW_Regs_X86_XList(X) #undef X } @@ -99,7 +101,6 @@ d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v) { default: case Arch_Null: - {}break; case Arch_x86:{result = d2r_rdi_reg_code_from_dw_reg_x86(v);}break; case Arch_x64:{result = d2r_rdi_reg_code_from_dw_reg_x64(v);}break; } @@ -136,7 +137,7 @@ d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off) } internal RDIM_Type * -d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; @@ -165,7 +166,7 @@ d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, } internal Rng1U64List -d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) +d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) { // collect non-contiguous range Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); @@ -223,7 +224,7 @@ d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_ } internal RDIM_Type ** -d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) +d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) { Temp scratch = scratch_begin(&arena, 1); @@ -256,7 +257,6 @@ d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, } //////////////////////////////// -//~ RDIM Bytecode Helpers internal B32 rdim_is_eval_bytecode_static(RDIM_EvalBytecode bc) @@ -892,7 +892,7 @@ d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecod internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, - DW_Raw *input, + DW_Input *input, U64 image_base, U64 address_size, Arch arch, @@ -1438,7 +1438,7 @@ d2r_bytecode_from_expression(Arena *arena, } internal RDIM_Location * -d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Raw *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) +d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) { RDIM_Location *loc = 0; if (expr.size) { @@ -1454,12 +1454,20 @@ d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Raw return loc; } +internal RDIM_Location * +d2r_location_from_attrib(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) +{ + String8 expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, kind); + RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, cu->address_size, arch, cu->addr_lu, cu, expr); + return location; +} + internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, - DW_Raw *input, + DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, @@ -1507,7 +1515,7 @@ d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, - DW_Raw *input, + DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, @@ -1548,6 +1556,92 @@ d2r_var_locset_from_tag(Arena *arena, return locset; } +internal D2R_CompUnitContribMap +d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8 aranges_data = input->sec[DW_Section_ARanges].data; + Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, aranges_data); + + D2R_CompUnitContribMap cm = {0}; + cm.count = 0; + cm.info_off_arr = push_array(arena, U64, unit_range_list.count); + cm.voff_range_arr = push_array(arena, RDIM_Rng1U64ChunkList, unit_range_list.count); + + for EachNode(range_n, Rng1U64Node, unit_range_list.first) { + String8 unit_data = str8_substr(aranges_data, range_n->v); + U64 unit_cursor = 0; + + U64 unit_length = 0; + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length); + if (unit_length_size == 0) { continue; } + unit_cursor += unit_length_size; + + DW_Version version = 0; + U64 version_size = str8_deserial_read_struct(unit_data, unit_cursor, &version); + if (version_size == 0) { continue; } + unit_cursor += version; + + if (version != DW_Version_2) { + AssertAlways(!"unknown .debug_aranges version"); + continue; + } + + DW_Format unit_format = DW_FormatFromSize(unit_length); + U64 cu_info_off = 0; + U64 cu_info_off_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &cu_info_off); + if (cu_info_off_size == 0) { continue; } + unit_cursor += cu_info_off_size; + + U8 address_size = 0; + U64 address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &address_size); + if (address_size_size == 0) { continue; } + unit_cursor += address_size_size; + + U8 segment_selector_size = 0; + U64 segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &segment_selector_size); + if (segment_selector_size_size == 0) { continue; } + unit_cursor += segment_selector_size_size; + + U64 tuple_size = address_size * 2 + segment_selector_size; + U64 bytes_too_far_past_boundary = unit_cursor % tuple_size; + if (bytes_too_far_past_boundary > 0) { + unit_cursor += tuple_size - bytes_too_far_past_boundary; + } + + RDIM_Rng1U64ChunkList voff_ranges = {0}; + if (segment_selector_size == 0) { + while (unit_cursor + address_size * 2 <= unit_data.size) { + U64 address = 0; + U64 length = 0; + unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, address_size, address_size); + unit_cursor += str8_deserial_read(unit_data, unit_cursor, &length, address_size, address_size); + + if (address == 0 && length == 0) { break; } + if (address == 0) { continue; } + + // TODO: error handling + AssertAlways(address >= image_base); + + U64 min = address - image_base; + U64 max = min + length; + rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, (RDIM_Rng1U64){.min = min, .max = max}); + } + } else { + // TODO: segment relative addressing + NotImplemented; + } + + U64 map_idx = cm.count++; + cm.info_off_arr[map_idx] = cu_info_off; + cm.voff_range_arr[map_idx] = voff_ranges; + } + + scratch_end(scratch); + return cm; +} + //////////////////////////////// //~ rjf: Compilation Unit / Scope Conversion Helpers @@ -1594,28 +1688,27 @@ d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D } //////////////////////////////// -//~ Tag Iterator +//~ rjf: Main Conversion Entry Point -internal D2R_TagIter * -d2r_tag_iter_init(Arena *arena, DW_TagNode *root) +internal D2R_TagIterator * +d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) { - D2R_TagIter *iter = push_array(arena, D2R_TagIter, 1); - iter->free_list = 0; - iter->stack = push_array(arena, D2R_TagFrame, 1); - iter->stack->node = push_array(arena, DW_TagNode, 1); + D2R_TagIterator *iter = push_array(arena, D2R_TagIterator, 1); + iter->free_list = 0; + iter->stack = push_array(arena, D2R_TagFrame, 1); + iter->stack->node = push_array(arena, DW_TagNode, 1); if(root != 0) { - *iter->stack->node = *root; + *iter->stack->node = *root; } iter->stack->node->sibling = 0; - iter->visit_children = 1; - iter->tag_node = root; - iter->root = root; + iter->visit_children = 1; + iter->tag_node = root; return iter; } internal void -d2r_tag_iter_next(Arena *arena, D2R_TagIter *iter) +d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter) { // descend to first child if (iter->visit_children) { @@ -1644,36 +1737,27 @@ d2r_tag_iter_next(Arena *arena, D2R_TagIter *iter) // update iterator iter->visit_children = 1; iter->tag_node = iter->stack ? iter->stack->node : 0; - - // rjf: exit on root - if(iter->tag_node == iter->root) - { - iter->tag_node = 0; - } } internal void -d2r_tag_iter_skip_children(D2R_TagIter *iter) +d2r_tag_iterator_skip_children(D2R_TagIterator *iter) { iter->visit_children = 0; } internal DW_TagNode * -d2r_tag_iter_parent_tag_node(D2R_TagIter *iter) +d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter) { return iter->stack->next->node; } internal DW_Tag -d2r_tag_iter_parent_tag(D2R_TagIter *iter) +d2r_tag_iterator_parent_tag(D2R_TagIterator *iter) { - DW_TagNode *tag_node = d2r_tag_iter_parent_tag_node(iter); + DW_TagNode *tag_node = d2r_tag_iterator_parent_tag_node(iter); return tag_node->tag; } -//////////////////////////////// -//~ Type/UDT/Symbol Conversion - internal void d2r_flag_converted_tag(DW_TagNode *tag_node) { @@ -1687,7 +1771,7 @@ d2r_is_tag_converted(DW_TagNode *tag_node) } internal RDIM_Type * -d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind) +d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind) { RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; @@ -1730,40 +1814,37 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, } internal void -d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root) +d2r_convert_types(Arena *arena, + D2R_TypeTable *type_table, + DW_Input *input, + DW_CompUnit *cu, + DW_Language cu_lang, + U64 arch_addr_size, + DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root); - it->tag_node != 0; - d2r_tag_iter_next(scratch.arena, it)) - { + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; // skip converted tags - if(d2r_is_tag_converted(tag_node)) - { - d2r_tag_iter_skip_children(it); + if (d2r_is_tag_converted(tag_node)) { + d2r_tag_iterator_skip_children(it); continue; } - // mark the tag as converted here, because during conversion we may recurse on the same tag d2r_flag_converted_tag(tag_node); - switch(tag.kind) - { - case DW_TagKind_ClassType: - { + switch (tag.kind) { + case DW_TagKind_ClassType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if(is_decl) - { + if (is_decl) { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_IncompleteClass; type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - d2r_tag_iter_skip_children(it); - } - else - { + Assert(!tag_node->first_child); + d2r_tag_iterator_skip_children(it); + } else { RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1771,58 +1852,51 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); type->direct_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); } - }break; - - case DW_TagKind_StructureType: - { + } break; + case DW_TagKind_StructureType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if(is_decl) - { + if (is_decl) { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteStruct; - d2r_tag_iter_skip_children(it); - } - else - { + + // TODO: error handling + Assert(!tag_node->first_child); + d2r_tag_iterator_skip_children(it); + } else { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_Struct; type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); } - }break; - - case DW_TagKind_UnionType: - { + } break; + case DW_TagKind_UnionType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if(is_decl) - { + if (is_decl) { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteUnion; - d2r_tag_iter_skip_children(it); - } - else - { + + // TODO: error handling + Assert(!tag_node->first_child); + d2r_tag_iterator_skip_children(it); + } else { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_Union; type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); } - }break; - - case DW_TagKind_EnumerationType: - { + } break; + case DW_TagKind_EnumerationType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if(is_decl) - { + if (is_decl) { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteEnum; - d2r_tag_iter_skip_children(it); - } - else - { + // TODO: error handling + Assert(!tag_node->first_child); + d2r_tag_iterator_skip_children(it); + } else { RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1830,10 +1904,8 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); type->direct_type = enum_base_type; } - }break; - - case DW_TagKind_SubroutineType: - { + } break; + case DW_TagKind_SubroutineType: { RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); // collect parameters @@ -1858,11 +1930,9 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com type->count = param_list.count; type->param_types = rdim_array_from_type_list(arena, param_list); - d2r_tag_iter_skip_children(it); - }break; - - case DW_TagKind_Typedef: - { + d2r_tag_iterator_skip_children(it); + } break; + case DW_TagKind_Typedef: { RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Alias; @@ -1874,105 +1944,116 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com break; } } - }break; - - case DW_TagKind_BaseType: - { - DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); - U64 byte_size = dw_byte_size_from_tag(input, cu, tag); + } break; + case DW_TagKind_BaseType: { + DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); + U64 byte_size = dw_byte_size_from_tag(input, cu, tag); - // rjf: attribute type encoding -> RDI type kind + // convert base type encoding to RDI version RDI_TypeKind kind = RDI_TypeKind_NULL; - switch(encoding) - { - default:{}break; - case DW_ATE_Null: {kind = RDI_TypeKind_NULL;}break; - case DW_ATE_Boolean: {kind = RDI_TypeKind_Bool;}break; - case DW_ATE_ComplexFloat: - switch(byte_size) - { - case 4: {kind = RDI_TypeKind_ComplexF32;}break; - case 8: {kind = RDI_TypeKind_ComplexF64;}break; - case 10: {kind = RDI_TypeKind_ComplexF80;}break; - case 16: {kind = RDI_TypeKind_ComplexF128;}break; - default: {log_infof("Unsupported complex float size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; - }break; - case DW_ATE_Float: - switch(byte_size) - { - case 2: {kind = RDI_TypeKind_F16; }break; - case 4: {kind = RDI_TypeKind_F32; }break; - case 6: {kind = RDI_TypeKind_F48; }break; - case 8: {kind = RDI_TypeKind_F64; }break; - case 16: {kind = RDI_TypeKind_F128;}break; - default: {log_infof("Unsupported float size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; - }break; - case DW_ATE_Signed: - switch(byte_size) - { - case 1: {kind = RDI_TypeKind_S8; }break; - case 2: {kind = RDI_TypeKind_S16; }break; - case 4: {kind = RDI_TypeKind_S32; }break; - case 8: {kind = RDI_TypeKind_S64; }break; - case 16: {kind = RDI_TypeKind_S128;}break; - case 32: {kind = RDI_TypeKind_S256;}break; - case 64: {kind = RDI_TypeKind_S512;}break; - default: {log_infof("Unsupported signed integer size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; - }break; - case DW_ATE_SignedChar: - switch(byte_size) - { - case 1: {kind = RDI_TypeKind_Char8; }break; - case 2: {kind = RDI_TypeKind_Char16;}break; - case 4: {kind = RDI_TypeKind_Char32;}break; - default:{log_infof("Unsupported signed character size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; - }break; - case DW_ATE_Address: - case DW_ATE_Unsigned: - switch(byte_size) - { - case 1: {kind = RDI_TypeKind_U8; }break; - case 2: {kind = RDI_TypeKind_U16; }break; - case 4: {kind = RDI_TypeKind_U32; }break; - case 8: {kind = RDI_TypeKind_U64; }break; - case 16: {kind = RDI_TypeKind_U128;}break; - case 32: {kind = RDI_TypeKind_U256;}break; - case 64: {kind = RDI_TypeKind_U512;}break; - default:{log_infof("Unsupported unsigned integer size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; - }break; - case DW_ATE_UnsignedChar: - switch(byte_size) - { - case 1: {kind = RDI_TypeKind_UChar8; }break; - case 2: {kind = RDI_TypeKind_UChar16;}break; - case 4: {kind = RDI_TypeKind_UChar32;}break; - default:{log_infof("Unsupported unsigned character size (%I64u) at 0x%I64x.\n", byte_size, tag.info_off);}break; - }break; - case DW_ATE_ImaginaryFloat: - case DW_ATE_PackedDecimal: - case DW_ATE_NumericString: - case DW_ATE_Edited: - case DW_ATE_SignedFixed: - case DW_ATE_UnsignedFixed: - case DW_ATE_DecimalFloat: - case DW_ATE_Utf: - case DW_ATE_Ucs: - case DW_ATE_Ascii: - { - // TODO(rjf): not implemented - }break; + switch (encoding) { + case DW_ATE_Null: kind = RDI_TypeKind_NULL; break; + case DW_ATE_Address: kind = RDI_TypeKind_Void; break; + case DW_ATE_Boolean: kind = RDI_TypeKind_Bool; break; + case DW_ATE_ComplexFloat: { + switch (byte_size) { + case 4: kind = RDI_TypeKind_ComplexF32; break; + case 8: kind = RDI_TypeKind_ComplexF64; break; + case 10: kind = RDI_TypeKind_ComplexF80; break; + case 16: kind = RDI_TypeKind_ComplexF128; break; + default: AssertAlways(!"unexpected size"); break; // TODO: error handling + } + } break; + case DW_ATE_Float: { + switch (byte_size) { + case 2: kind = RDI_TypeKind_F16; break; + case 4: kind = RDI_TypeKind_F32; break; + case 6: kind = RDI_TypeKind_F48; break; + case 8: kind = RDI_TypeKind_F64; break; + case 16: kind = RDI_TypeKind_F128; break; + default: AssertAlways(!"unexpected size"); break; // TODO: error handling + } + } break; + case DW_ATE_Signed: { + switch (byte_size) { + case 1: kind = RDI_TypeKind_S8; break; + case 2: kind = RDI_TypeKind_S16; break; + case 4: kind = RDI_TypeKind_S32; break; + case 8: kind = RDI_TypeKind_S64; break; + case 16: kind = RDI_TypeKind_S128; break; + case 32: kind = RDI_TypeKind_S256; break; + case 64: kind = RDI_TypeKind_S512; break; + default: AssertAlways(!"unexpected size"); break; // TODO: error handling + } + } break; + case DW_ATE_SignedChar: { + switch (byte_size) { + case 1: kind = RDI_TypeKind_Char8; break; + case 2: kind = RDI_TypeKind_Char16; break; + case 4: kind = RDI_TypeKind_Char32; break; + default: AssertAlways(!"unexpected size"); break; // TODO: error handling + } + } break; + case DW_ATE_Unsigned: { + switch (byte_size) { + case 1: kind = RDI_TypeKind_U8; break; + case 2: kind = RDI_TypeKind_U16; break; + case 4: kind = RDI_TypeKind_U32; break; + case 8: kind = RDI_TypeKind_U64; break; + case 16: kind = RDI_TypeKind_U128; break; + case 32: kind = RDI_TypeKind_U256; break; + case 64: kind = RDI_TypeKind_U512; break; + default: AssertAlways(!"unexpected size"); break; // TODO: error handling + } + } break; + case DW_ATE_UnsignedChar: { + switch (byte_size) { + case 1: kind = RDI_TypeKind_UChar8; break; + case 2: kind = RDI_TypeKind_UChar16; break; + case 4: kind = RDI_TypeKind_UChar32; break; + default: AssertAlways(!"unexpected size"); break; // TODO: error handling + } + } break; + case DW_ATE_ImaginaryFloat: { + NotImplemented; + } break; + case DW_ATE_PackedDecimal: { + NotImplemented; + } break; + case DW_ATE_NumericString: { + NotImplemented; + } break; + case DW_ATE_Edited: { + NotImplemented; + } break; + case DW_ATE_SignedFixed: { + NotImplemented; + } break; + case DW_ATE_UnsignedFixed: { + NotImplemented; + } break; + case DW_ATE_DecimalFloat: { + NotImplemented; + } break; + case DW_ATE_Utf: { + NotImplemented; + } break; + case DW_ATE_Ucs: { + NotImplemented; + } break; + case DW_ATE_Ascii: { + NotImplemented; + } break; + default: AssertAlways(!"unexpected base type encoding"); break; // TODO: error handling } - // rjf: build RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Alias; type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->direct_type = type_table->builtin_types[kind]; type->byte_size = byte_size; - }break; - - case DW_TagKind_PointerType: - { + } break; + case DW_TagKind_PointerType: { RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); // TODO: @@ -1984,16 +2065,16 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass)); U64 byte_size = arch_addr_size; - dw_try_byte_size_from_tag(input, cu, tag, &byte_size); + if (cu->version == DW_Version_5 || cu->relaxed) { + dw_try_byte_size_from_tag(input, cu, tag, &byte_size); + } RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Ptr; type->byte_size = byte_size; type->direct_type = direct_type; - }break; - - case DW_TagKind_RestrictType: - { + } break; + case DW_TagKind_RestrictType: { // TODO: Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)); Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); @@ -2004,10 +2085,8 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com type->byte_size = arch_addr_size; type->flags = RDI_TypeModifierFlag_Restrict; type->direct_type = direct_type; - }break; - - case DW_TagKind_VolatileType: - { + } break; + case DW_TagKind_VolatileType: { // TODO: Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); @@ -2017,10 +2096,8 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com type->byte_size = arch_addr_size; type->flags = RDI_TypeModifierFlag_Volatile; type->direct_type = direct_type; - }break; - - case DW_TagKind_ConstType: - { + } break; + case DW_TagKind_ConstType: { // TODO: Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)); @@ -2031,10 +2108,8 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com type->byte_size = arch_addr_size; type->flags = RDI_TypeModifierFlag_Const; type->direct_type = direct_type; - }break; - - case DW_TagKind_ArrayType: - { + } break; + case DW_TagKind_ArrayType: { // * DWARF vs RDI Array Type Graph * // // For example lets take following decl: @@ -2110,18 +2185,14 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com direct_type = t; } - d2r_tag_iter_skip_children(it); - }break; - - case DW_TagKind_SubrangeType: - { + d2r_tag_iterator_skip_children(it); + } break; + case DW_TagKind_SubrangeType: { // TODO: error handling AssertAlways(!"unexpected tag"); - }break; - - case DW_TagKind_Inheritance: - { - DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); + } break; + case DW_TagKind_Inheritance: { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind != DW_TagKind_StructureType && parent_tag.kind != DW_TagKind_ClassType) { // TODO: error handling AssertAlways(!"unexpected parent tag"); @@ -2136,8 +2207,7 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com member->type = type; member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); } - }break; - + } break; } } scratch_end(scratch); @@ -2146,24 +2216,21 @@ d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_Com internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, - DW_Raw *input, + DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root); - it->tag_node != 0; - d2r_tag_iter_next(scratch.arena, it)) - { + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; switch (tag.kind) { case DW_TagKind_ClassType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { - d2r_tag_iter_skip_children(it); + d2r_tag_iterator_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); @@ -2174,7 +2241,7 @@ d2r_convert_udts(Arena *arena, case DW_TagKind_StructureType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { - d2r_tag_iter_skip_children(it); + d2r_tag_iterator_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); @@ -2185,7 +2252,7 @@ d2r_convert_udts(Arena *arena, case DW_TagKind_UnionType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { - d2r_tag_iter_skip_children(it); + d2r_tag_iterator_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); @@ -2196,7 +2263,7 @@ d2r_convert_udts(Arena *arena, case DW_TagKind_EnumerationType: { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { - d2r_tag_iter_skip_children(it); + d2r_tag_iterator_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); @@ -2205,7 +2272,7 @@ d2r_convert_udts(Arena *arena, } } break; case DW_TagKind_Member: { - DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType || parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_UnionType; @@ -2228,7 +2295,7 @@ d2r_convert_udts(Arena *arena, } } break; case DW_TagKind_Enumerator: { - DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_EnumerationType) { RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &udts, parent_type->udt); @@ -2245,26 +2312,28 @@ d2r_convert_udts(Arena *arena, } internal void -d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root) +d2r_convert_symbols(Arena *arena, + D2R_TypeTable *type_table, + RDIM_Scope *global_scope, + DW_Input *input, + DW_CompUnit *cu, + DW_Language cu_lang, + U64 arch_addr_size, + U64 image_base, + Arch arch, + DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root); - it->tag_node != 0; - d2r_tag_iter_next(scratch.arena, it)) - { + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; - switch(tag.kind) - { - case DW_TagKind_Null:{}break; - + switch (tag.kind) { + case DW_TagKind_Null: { InvalidPath; } break; case DW_TagKind_ClassType: case DW_TagKind_StructureType: - case DW_TagKind_UnionType: - { - // TODO(rjf): visit children to collect methods and variables - }break; - + case DW_TagKind_UnionType: { + // visit children to collect methods and variables + } break; case DW_TagKind_EnumerationType: case DW_TagKind_SubroutineType: case DW_TagKind_Typedef: @@ -2277,19 +2346,15 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_C case DW_TagKind_SubrangeType: case DW_TagKind_Inheritance: case DW_TagKind_Enumerator: - case DW_TagKind_Member: - { - d2r_tag_iter_skip_children(it); - }break; - - case DW_TagKind_SubProgram: - { + case DW_TagKind_Member: { + d2r_tag_iterator_skip_children(it); + } break; + case DW_TagKind_SubProgram: { DW_InlKind inl = DW_Inl_NotInlined; if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Inline)) { inl = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Inline); } - switch(inl) - { - case DW_Inl_NotInlined: - { + + switch (inl) { + case DW_Inl_NotInlined: { U64 param_count = 0; RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); @@ -2332,7 +2397,7 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_C proc->location_cases = d2r_locset_from_attrib(arena, &scopes, root_scope, &locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); // sub program with user-defined parent tag is a method - DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_StructureType) { RDI_MemberKind member_kind = RDI_MemberKind_NULL; DW_VirtualityKind virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality); @@ -2353,19 +2418,16 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_C } it->stack->scope = root_scope; - }break; + } break; case DW_Inl_DeclaredNotInlined: case DW_Inl_DeclaredInlined: - case DW_Inl_Inlined: - { - d2r_tag_iter_skip_children(it); - }break; - default:{}break; + case DW_Inl_Inlined: { + d2r_tag_iterator_skip_children(it); + } break; + default: InvalidPath; break; } - }break; - - case DW_TagKind_InlinedSubroutine: - { + } break; + case DW_TagKind_InlinedSubroutine: { U64 param_count = 0; RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); @@ -2397,14 +2459,12 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_C Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); RDIM_Scope *root_scope = d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges); root_scope->inline_site = inline_site; - }break; - - case DW_TagKind_Variable: - { + } break; + case DW_TagKind_Variable: { String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_LexicalBlock) { @@ -2460,11 +2520,9 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_C var->container_symbol = 0; var->container_type = 0; // TODO: NotImplemented; } - }break; - - case DW_TagKind_FormalParameter: - { - DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); + } break; + case DW_TagKind_FormalParameter: { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) { RDIM_Scope *scope = it->stack->next->scope; RDIM_Local *param = rdim_scope_push_local(arena, &scopes, scope); @@ -2472,35 +2530,26 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_C param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); param->location_cases = d2r_var_locset_from_tag(arena, &scopes, scope, &locations, input, cu, image_base, arch, tag); + } else { + // TODO: error handling + AssertAlways(!"this is a local variable"); } - else - { - // TODO: error handling; this is a local variable - } - }break; - - case DW_TagKind_LexicalBlock: - { - DW_Tag parent_tag = d2r_tag_iter_parent_tag(it); - if(parent_tag.kind == DW_TagKind_SubProgram || - parent_tag.kind == DW_TagKind_InlinedSubroutine || - parent_tag.kind == DW_TagKind_LexicalBlock) - { + } break; + case DW_TagKind_LexicalBlock: { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + if (parent_tag.kind == DW_TagKind_SubProgram || + parent_tag.kind == DW_TagKind_InlinedSubroutine || + parent_tag.kind == DW_TagKind_LexicalBlock) { Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges); } - }break; - - case DW_TagKind_CallSite: - { + } break; + case DW_TagKind_CallSite: { // TODO - }break; - - case DW_TagKind_CallSiteParameter: - { + } break; + case DW_TagKind_CallSiteParameter: { // TODO - }break; - + } break; case DW_TagKind_Label: case DW_TagKind_CompileUnit: case DW_TagKind_UnspecifiedParameters: @@ -2508,11 +2557,9 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_C case DW_TagKind_ImportedDeclaration: case DW_TagKind_PtrToMemberType: case DW_TagKind_TemplateTypeParameter: - case DW_TagKind_ReferenceType: - { - // TODO - }break; - + case DW_TagKind_ReferenceType: { + // TODO: + } break; default: { // NotImplemented; @@ -2522,489 +2569,288 @@ d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_C scratch_end(scratch); } -//////////////////////////////// -//~ rjf: Main Conversion Entry Point - internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); - if(lane_idx() == 0) - { - //////////////////////////// - //- rjf: unpack input image info - // - Arch arch = Arch_Null; - U64 image_base = 0; - DW_Raw input = {0}; - PathStyle path_style = PathStyle_Null; - switch(params->exe_kind) - { - default:{}break; - case ExecutableImageKind_CoffPe: - { - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); - String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); - COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); - String8 string_table = str8_substr(params->exe_data, pe.string_table_range); - arch = pe.arch; - image_base = pe.image_base; - binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); - input = dw_raw_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); - path_style = PathStyle_WindowsAbsolute; - }break; - case ExecutableImageKind_Elf32: - case ExecutableImageKind_Elf64: - { - ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data); - arch = arch_from_elf_machine(bin.hdr.e_machine); - image_base = (bin.hdr.e_type == ELF_Type_Dyn ? 0 : elf_base_addr_from_bin(&bin)); - binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, params->dbg_data, &bin, bin.shdrs); - input = dw_raw_from_elf_bin(scratch.arena, params->dbg_data, &bin); - path_style = PathStyle_UnixAbsolute; - }break; - } - U64 arch_addr_size = rdi_addr_size_from_arch(arch); + if (lane_idx() == 0) { + //////////////////////////////// - //////////////////////////// - //- rjf: determine acceptable address range - // - // in many cases, linkers seem to trample over addresses in various DWARF sections, - // potentially due to optimizations. we'd like to filter out those busted addresses - // from our final debug info - a good enough heuristic is to disqualify them by - // whether or not they actually fall into the ranges covered by the binary sections. - // - Rng1U64 acceptable_vaddr_range = {0}; - { - acceptable_vaddr_range.min = max_U64; - acceptable_vaddr_range.max = 0; - for EachNode(n, RDIM_BinarySectionNode, binary_sections.first) - { - acceptable_vaddr_range.min = Min(n->v.voff_first, acceptable_vaddr_range.min); - acceptable_vaddr_range.max = Max(n->v.voff_opl, acceptable_vaddr_range.max); - } - } - - //////////////////////////// - //- rjf: compute exe hash - // ProfBegin("compute exe hash"); U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); ProfEnd(); - //////////////////////////// - //- rjf: convert top-level-info - // - { - // rjf: base arch -> rdi - RDI_Arch arch_rdi = RDI_Arch_NULL; - switch(arch) - { - case Arch_Null: - case Arch_arm64: - case Arch_arm32: - case Arch_COUNT: - {}break; - case Arch_x64:{arch_rdi = RDI_Arch_X64;}break; - case Arch_x86:{arch_rdi = RDI_Arch_X86;}break; - } - - // rjf: binary sections -> voff max - U64 exe_voff_max = 0; - for EachNode(sect_n, RDIM_BinarySectionNode, binary_sections.first) - { - exe_voff_max = Max(exe_voff_max, sect_n->v.voff_opl); - } - - // rjf: fill - top_level_info.arch = arch_rdi; - top_level_info.exe_name = params->exe_name; - top_level_info.exe_hash = exe_hash; - top_level_info.voff_max = exe_voff_max; - if(!params->deterministic) - { - // TODO(rjf): top_level_info.guid = ...; - top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); - } + //////////////////////////////// + + Arch arch = Arch_Null; + U64 image_base = 0; + DW_Input input = {0}; + PathStyle path_style = PathStyle_Null; + + switch(params->exe_kind) { + default:{}break; + case ExecutableImageKind_CoffPe: { + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); + String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); + COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); + String8 string_table = str8_substr(params->exe_data, pe.string_table_range); + arch = pe.arch; + image_base = pe.image_base; + binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); + input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); + path_style = PathStyle_WindowsAbsolute; + } break; + case ExecutableImageKind_Elf32: + case ExecutableImageKind_Elf64: { + ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data); + arch = arch_from_elf_machine(bin.hdr.e_machine); + image_base = elf_base_addr_from_bin(&bin); + binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); + input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); + path_style = PathStyle_UnixAbsolute; + } break; } - //////////////////////////// - //- rjf: parse unit contribution map - // + //////////////////////////////// + + top_level_info = rdim_make_top_level_info(params->exe_name, arch, exe_hash, binary_sections); + + //////////////////////////////// + + U64 arch_addr_size = rdi_addr_size_from_arch(top_level_info.arch); + + //////////////////////////////// + + RDIM_Scope *global_scope = rdim_scope_chunk_list_push(arena, &scopes, SCOPE_CHUNK_CAP); + + //////////////////////////////// + + ProfBegin("Parse Unit Contrib Map"); D2R_CompUnitContribMap cu_contrib_map = {0}; - ProfScope("parse unit contribution map") - { - String8 aranges_data = input.sec[DW_Section_ARanges].data; - if(aranges_data.size != 0) - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: unpack input - Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, aranges_data); - - //- rjf: set up map - cu_contrib_map.info_off_arr = push_array(arena, U64, unit_range_list.count); - cu_contrib_map.voff_range_arr = push_array(arena, RDIM_Rng1U64ChunkList, unit_range_list.count); - - //- rjf: convert all units - for EachNode(range_n, Rng1U64Node, unit_range_list.first) - { - //- rjf: unpack unit - String8 unit_data = str8_substr(aranges_data, range_n->v); - U64 unit_cursor = 0; - - //- rjf: read unit data length - U64 unit_length = 0; - U64 unit_length_size = dw_str8_deserial_read_packed_size(unit_data, unit_cursor, &unit_length); - B32 unit_length_good = (unit_length_size != 0); - unit_cursor += unit_length_size; - DW_Format unit_format = DW_FormatFromSize(unit_length); - - //- rjf: read unit version - DW_Version version = 0; - U64 version_size = str8_deserial_read_struct(unit_data, unit_cursor, &version); - B32 version_good = (version_size != 0); - unit_cursor += version_size; - - //- rjf: parse section by version - switch(version) - { - //- rjf: unsupported versions - default: - { - log_infof("Unknown .debug_aranges version (%i).\n", version); - }break; - - //- rjf: version 2 - case DW_Version_2: - { - // rjf: unpack & read unit header info - U64 unit_info_off = 0; - U8 unit_address_size = 0; - U8 unit_segment_selector_size = 0; - B32 unit_good = 0; - { - U64 unit_info_off_size = dw_str8_deserial_read_fmt_uint(unit_data, unit_cursor, unit_format, &unit_info_off); - unit_cursor += unit_info_off_size; - U64 unit_address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &unit_address_size); - unit_cursor += unit_address_size_size; - U64 unit_segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &unit_segment_selector_size); - unit_cursor += unit_segment_selector_size_size; - unit_good = (unit_info_off_size != 0 && unit_address_size_size != 0 && unit_segment_selector_size_size != 0); - } - U64 tuple_size = unit_address_size * 2 + unit_segment_selector_size; - - // rjf: align cursor to be divisible by the tuple size (see the February 13, 2017 spec) - { - U64 bytes_too_far_past_boundary = unit_cursor % tuple_size; - if(bytes_too_far_past_boundary > 0) - { - unit_cursor += tuple_size - bytes_too_far_past_boundary; - } - } - - // rjf: read all ranges - RDIM_Rng1U64ChunkList voff_ranges = {0}; - if(unit_segment_selector_size == 0) - { - for(;unit_cursor + unit_address_size*2 <= unit_data.size;) - { - U64 segment = 0; - U64 address = 0; - U64 length = 0; - unit_cursor += str8_deserial_read(unit_data, unit_cursor, &segment, unit_segment_selector_size, Max(unit_segment_selector_size, 1)); - unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, unit_address_size, unit_address_size); - unit_cursor += str8_deserial_read(unit_data, unit_cursor, &length, unit_address_size, unit_address_size); - if((segment != 0 || address != 0 || length != 0) && - (contains_1u64(acceptable_vaddr_range, address) || - contains_1u64(acceptable_vaddr_range, address + length))) - { - RDIM_Rng1U64 range = - { - address - image_base, - address - image_base + length, - }; - rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, range); - } - else - { - break; - } - } - } - else - { - log_infof("Segment-relative addressing detected in .debug_aranges; this is not currently supported.\n"); - } - - // rjf: store record - U64 map_idx = cu_contrib_map.count; - cu_contrib_map.info_off_arr[map_idx] = unit_info_off; - cu_contrib_map.voff_range_arr[map_idx] = voff_ranges; - cu_contrib_map.count += 1; - }break; - } - } - - scratch_end(scratch); - } + if (input.sec[DW_Section_ARanges].data.size) { + cu_contrib_map = d2r_cu_contrib_map_from_aranges(arena, &input, image_base); } + ProfEnd(); - //////////////////////////// - //- rjf: parse list of comp units - // - DW_ListUnitInput lu_input = {0}; - ProfScope("parse list of comp units") - { - lu_input = dw_list_unit_input_from_raw(scratch.arena, &input); + ProfBegin("Parse Comop Unit Ranges"); + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); + Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input.sec[DW_Section_Info].data); + Rng1U64Array cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); + ProfEnd(); + + //////////////////////////////// + + ProfBegin("Parse Compile Unit Headers"); + // TODO(rjf): parse should always be relaxed. any verification checks we do + // should just be logged via log_info(...), and then the caller of this + // converter can collect those & display as necessary. + B32 is_parse_relaxed = 1; + DW_CompUnit *cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); + for EachIndex(cu_idx, cu_ranges.count) { + cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, is_parse_relaxed); } + ProfEnd(); - //////////////////////////// - //- rjf: parse comp unit ranges - // - Rng1U64Array cu_ranges = {0}; - ProfScope("parse comp unit ranges") - { - Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input.sec[DW_Section_Info].data); - cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); - } + //////////////////////////////// - //////////////////////////// - //- rjf: parse comp unit headers - // - DW_CompUnit *cu_arr = 0; - ProfScope("parse comp unit headers") - { - cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) - { - cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min); - } - } - - //////////////////////////// - //- rjf: parse line tables - // + ProfBegin("Parse Line Tables"); DW_LineTableParseResult *cu_line_tables = push_array(scratch.arena, DW_LineTableParseResult, cu_ranges.count); - ProfScope("parse line tables") - { - for EachIndex(cu_idx, cu_ranges.count) - { - DW_CompUnit *cu = &cu_arr[cu_idx]; - String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_StmtList); - String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); - String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); - cu_line_tables[cu_idx] = dw_parsed_line_table_from_data(scratch.arena, cu_stmt_list, &input, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu); - } + for EachIndex(cu_idx, cu_ranges.count) { + DW_CompUnit *cu = &cu_arr[cu_idx]; + String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_StmtList); + String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); + String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); + cu_line_tables[cu_idx] = dw_parsed_line_table_from_data(scratch.arena, cu_stmt_list, &input, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu); } + ProfEnd(); - //////////////////////////// - //- rjf: convert line tables - // - RDIM_LineTable **cu_line_tables_rdi = 0; - ProfScope("convert line tables") - { - HashTable *source_file_ht = hash_table_init(scratch.arena, 0x4000); - cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) - { - cu_line_tables_rdi[cu_idx] = rdim_line_table_chunk_list_push(arena, &line_tables, LINE_TABLE_CAP); - - DW_LineTableParseResult *line_table = &cu_line_tables[cu_idx]; - DW_LineVMFileArray *dir_table = &line_table->vm_header.dir_table; - DW_LineVMFileArray *file_table = &line_table->vm_header.file_table; - RDIM_SrcFile **src_file_map = push_array(scratch.arena, RDIM_SrcFile *, file_table->count); - for EachIndex(file_idx, file_table->count) - { - DW_LineFile *file = &file_table->v[file_idx]; - String8 file_path = dw_path_from_file_idx(scratch.arena, &line_table->vm_header, file_idx); - String8List file_path_split = str8_split_path(scratch.arena, file_path); - str8_path_list_resolve_dots_in_place(&file_path_split, path_style); - String8 file_path_resolved = str8_path_list_join_by_style(scratch.arena, &file_path_split, path_style); - RDIM_SrcFile *src_file = hash_table_search_path_raw(source_file_ht, file_path_resolved); - if(src_file == 0) - { - src_file = rdim_src_file_chunk_list_push(arena, &src_files, SRC_FILE_CAP); - src_file->path = push_str8_copy(arena, file_path_resolved); - hash_table_push_path_raw(scratch.arena, source_file_ht, src_file->path, src_file); - } - src_file_map[file_idx] = src_file; + //////////////////////////////// + + ProfBegin("Convert Line Tables"); + HashTable *source_file_ht = hash_table_init(scratch.arena, 0x4000); + RDIM_LineTable **cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); + for EachIndex(cu_idx, cu_ranges.count) { + cu_line_tables_rdi[cu_idx] = rdim_line_table_chunk_list_push(arena, &line_tables, LINE_TABLE_CAP); + + DW_LineTableParseResult *line_table = &cu_line_tables[cu_idx]; + DW_LineVMFileArray *dir_table = &line_table->vm_header.dir_table; + DW_LineVMFileArray *file_table = &line_table->vm_header.file_table; + RDIM_SrcFile **src_file_map = push_array(scratch.arena, RDIM_SrcFile *, file_table->count); + for EachIndex(file_idx, file_table->count) { + DW_LineFile *file = &file_table->v[file_idx]; + String8 file_path = dw_path_from_file_idx(scratch.arena, &line_table->vm_header, file_idx); + String8List file_path_split = str8_split_path(scratch.arena, file_path); + str8_path_list_resolve_dots_in_place(&file_path_split, path_style); + String8 file_path_resolved = str8_path_list_join_by_style(scratch.arena, &file_path_split, path_style); + RDIM_SrcFile *src_file = hash_table_search_path_raw(source_file_ht, file_path_resolved); + if (src_file == 0) { + src_file = rdim_src_file_chunk_list_push(arena, &src_files, SRC_FILE_CAP); + src_file->path = push_str8_copy(arena, file_path_resolved); + hash_table_push_path_raw(scratch.arena, source_file_ht, src_file->path, src_file); } + src_file_map[file_idx] = src_file; + } + + for EachNode(line_seq, DW_LineSeqNode, line_table->first_seq) { + if (line_seq->count == 0) { continue; } - for EachNode(line_seq, DW_LineSeqNode, line_table->first_seq) - { - if(line_seq->count == 0) {continue;} - - U64 *voffs = push_array(arena, U64, line_seq->count); - U32 *line_nums = push_array(arena, U32, line_seq->count); - U16 *col_nums = 0; - U64 line_idx = 0; - - DW_LineNode *file_line_n = line_seq->first; - U64 file_line_count = 0; - - for EachNode(line_n, DW_LineNode, file_line_n) - { - if(file_line_n->v.file_index != line_n->v.file_index || line_n->next == 0) - { - U64 file_index = file_line_n->v.file_index; - U64 *file_voffs = &voffs[line_idx]; - U32 *file_line_nums = &line_nums[line_idx]; - U16 *file_col_nums = 0; - - U64 lines_written = 0; - U64 prev_ln = max_U64; - DW_LineNode *sentinel = line_n->v.file_index != file_line_n->v.file_index ? line_n : 0; - for(; file_line_n != sentinel; file_line_n = file_line_n->next) - { - if(file_line_n->v.line != prev_ln) - { - if(file_line_n->v.address == 0) {continue;} - - voffs[line_idx] = file_line_n->v.address; - line_nums[line_idx] = file_line_n->v.line; - - lines_written += 1; - line_idx += 1; - - prev_ln = file_line_n->v.line; - } - } - - RDIM_SrcFile *src_file = src_file_map[file_index]; - RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, lines_written); - rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); - - file_line_count = 1; - } - else - { - file_line_count += 1; - } - } - - // handle last line - if(file_line_n) - { + U64 *voffs = push_array(arena, U64, line_seq->count); + U32 *line_nums = push_array(arena, U32, line_seq->count); + U16 *col_nums = 0; + U64 line_idx = 0; + + DW_LineNode *file_line_n = line_seq->first; + U64 file_line_count = 0; + + for EachNode(line_n, DW_LineNode, file_line_n) { + if (file_line_n->v.file_index != line_n->v.file_index || line_n->next == 0) { U64 file_index = file_line_n->v.file_index; U64 *file_voffs = &voffs[line_idx]; U32 *file_line_nums = &line_nums[line_idx]; U16 *file_col_nums = 0; - for(;file_line_n != 0; file_line_n = file_line_n->next, line_idx += 1) - { - // NOTE(rjf): DWARF encodes line info as "relocatable addresses"; we do *not* - // need to translate from 'addresses' to 'voffs' with the image base here. - voffs[line_idx] = file_line_n->v.address; - line_nums[line_idx] = file_line_n->v.line; + + U64 lines_written = 0; + U64 prev_ln = max_U64; + DW_LineNode *sentinel = line_n->v.file_index != file_line_n->v.file_index ? line_n : 0; + for (; file_line_n != sentinel; file_line_n = file_line_n->next) { + if (file_line_n->v.line != prev_ln) { + if (file_line_n->v.address == 0) { continue; } + + voffs[line_idx] = file_line_n->v.address - image_base; + line_nums[line_idx] = file_line_n->v.line; + + ++lines_written; + ++line_idx; + + prev_ln = file_line_n->v.line; + } } + RDIM_SrcFile *src_file = src_file_map[file_index]; - RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count); + RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, lines_written); rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); + + file_line_count = 1; + } else { + file_line_count += 1; } } + + // handle last line + if (file_line_n) { + U64 file_index = file_line_n->v.file_index; + U64 *file_voffs = &voffs[line_idx]; + U32 *file_line_nums = &line_nums[line_idx]; + U16 *file_col_nums = 0; + + for (; file_line_n != 0; file_line_n = file_line_n->next, line_idx += 1) { + // TODO: error handling + AssertAlways(file_line_n->v.address >= image_base); + voffs[line_idx] = file_line_n->v.address - image_base; + line_nums[line_idx] = file_line_n->v.line; + } + + RDIM_SrcFile *src_file = src_file_map[file_index]; + RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count); + rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); + } + + //Assert(line_idx == line_seq->count); } } + ProfEnd(); + + //////////////////////////////// - //////////////////////////// - //- rjf: build built-in basic types - // RDIM_Type *builtin_types[RDI_TypeKind_Count] = {0}; - ProfScope("build built-in basic types") - { - for(RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) - { - RDIM_Type *type = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); - type->kind = type_kind; - type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); - type->byte_size = rdi_size_from_basic_type_kind(type_kind); - builtin_types[type_kind] = type; - } - builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size; - builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); - builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; + for (RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) { + RDIM_Type *type = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); + type->kind = type_kind; + type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); + type->byte_size = rdi_size_from_basic_type_kind(type_kind); + builtin_types[type_kind] = type; } + builtin_types[RDI_TypeKind_Void]->byte_size = arch_addr_size; + builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size; - //////////////////////////// - //- rjf: convert units - // - ProfScope("convert units") - { - for EachIndex(cu_idx, cu_ranges.count) + builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); + builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; + + //////////////////////////////// + + ProfBegin("Convert Units"); + for EachIndex(cu_idx, cu_ranges.count) { + Temp comp_temp = temp_begin(scratch.arena); + + DW_CompUnit *cu = &cu_arr[cu_idx]; + + // parse and build tag tree + DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu); + + // skip DWO { - Temp comp_temp = temp_begin(scratch.arena); + if (cu->dwo_id) { goto next_cu; } - DW_CompUnit *cu = &cu_arr[cu_idx]; + String8 dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_DwoName); + if (dwo_name.size) { goto next_cu; } - // parse and build tag tree - DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu); - - // skip DWO - { - if (cu->dwo_id) { goto next_cu; } - - String8 dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_DwoName); - if (dwo_name.size) { goto next_cu; } - - String8 gnu_dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_GNU_DwoName); - if (gnu_dwo_name.size) { goto next_cu; } - } - - // build (info offset -> tag) hash table to resolve tags with abstract origin - cu->tag_ht = dw_make_tag_hash_table(comp_temp.arena, tag_tree); - - // extract compile unit info - String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); - String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); - String8 cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer); - DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language); - - // init type table - D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); - type_table->ht = hash_table_init(comp_temp.arena, 0x4000); - type_table->types = &types; - type_table->type_chunk_cap = TYPE_CHUNK_CAP; - type_table->builtin_types = builtin_types; - - // convert debug info - d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); - d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); - d2r_convert_symbols(arena, type_table, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root); - - RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; - if(cu_idx < cu_contrib_map.count) - { - cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); - } - else - { - Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); - for EachNode(n, Rng1U64Node, range_list.first) - { - rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); - } - } - - // convert compile unit - { - RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &units, UNIT_CHUNK_CAP); - unit->unit_name = cu_name; - unit->compiler_name = cu_prod; - unit->source_file = str8_zero(); // TODO - unit->object_file = str8_zero(); // TODO - unit->archive_file = str8_zero(); // TODO - unit->build_path = cu_dir; - unit->language = d2r_rdi_language_from_dw_language(cu_lang); - unit->line_table = cu_line_tables_rdi[cu_idx]; - unit->voff_ranges = cu_voff_ranges; - } - - next_cu:; - temp_end(comp_temp); + String8 gnu_dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_GNU_DwoName); + if (gnu_dwo_name.size) { goto next_cu; } } + + // build (info offset -> tag) hash table to resolve tags with abstract origin + cu->tag_ht = dw_make_tag_hash_table(comp_temp.arena, tag_tree); + + // extract compile unit info + String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); + String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); + String8 cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer); + DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language); + + // init type table + D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); + type_table->ht = hash_table_init(comp_temp.arena, 0x4000); + type_table->types = &types; + type_table->type_chunk_cap = TYPE_CHUNK_CAP; + type_table->builtin_types = builtin_types; + + // convert debug info + d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); + d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); + d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root); + + RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; + if (cu_idx < cu_contrib_map.count) { + cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); + } else { + Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); + for EachNode(n, Rng1U64Node, range_list.first) { + rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); + } + } + + // convert compile unit + { + RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &units, UNIT_CHUNK_CAP); + unit->unit_name = cu_name; + unit->compiler_name = cu_prod; + unit->source_file = str8_zero(); // TODO + unit->object_file = str8_zero(); // TODO + unit->archive_file = str8_zero(); // TODO + unit->build_path = cu_dir; + unit->language = d2r_rdi_language_from_dw_language(cu_lang); + unit->line_table = cu_line_tables_rdi[cu_idx]; + unit->voff_ranges = cu_voff_ranges; + } + + next_cu:; + temp_end(comp_temp); } - + ProfEnd(); } + lane_sync(); + RDIM_BakeParams bake_params = {0}; bake_params.subset_flags = params->subset_flags; bake_params.top_level_info = top_level_info; @@ -3020,6 +2866,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) bake_params.procedures = procs; bake_params.scopes = scopes; bake_params.inline_sites = inline_sites; + scratch_end(scratch); return bake_params; } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 25cd3770..5b297184 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -1,11 +1,7 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef RDI_FROM_DWARF_H -#define RDI_FROM_DWARF_H - -//////////////////////////////// -//~ rjf: Conversion Stage Inputs +#pragma once typedef struct D2R_ConvertParams D2R_ConvertParams; struct D2R_ConvertParams @@ -19,43 +15,35 @@ struct D2R_ConvertParams B32 deterministic; }; -//////////////////////////////// -//~ rjf: Conversion Helper Types - -typedef struct D2R_TypeTable D2R_TypeTable; -struct D2R_TypeTable +typedef struct D2R_TypeTable { - HashTable *ht; + HashTable *ht; RDIM_TypeChunkList *types; - U64 type_chunk_cap; - RDIM_Type **builtin_types; -}; + U64 type_chunk_cap; + RDIM_Type **builtin_types; +} D2R_TypeTable; -typedef struct D2R_TagFrame D2R_TagFrame; -struct D2R_TagFrame +typedef struct D2R_TagFrame { DW_TagNode *node; RDIM_Scope *scope; struct D2R_TagFrame *next; -}; +} D2R_TagFrame; -typedef struct D2R_TagIter D2R_TagIter; -struct D2R_TagIter +typedef struct D2R_TagIterator { D2R_TagFrame *free_list; D2R_TagFrame *stack; - DW_TagNode *tag_node; - DW_TagNode *root; - B32 visit_children; -}; + DW_TagNode *tag_node; + B32 visit_children; +} D2R_TagIterator; -typedef struct D2R_CompUnitContribMap D2R_CompUnitContribMap; -struct D2R_CompUnitContribMap +typedef struct D2R_CompUnitContribMap { - U64 count; - U64 *info_off_arr; + U64 count; + U64 *info_off_arr; RDIM_Rng1U64ChunkList *voff_range_arr; -}; +} D2R_CompUnitContribMap; #define D2R_ValueType_IsSigned(x) ((x) == D2R_ValueType_S8 || (x) == D2R_ValueType_S16 || (x) == D2R_ValueType_S32 || (x) == D2R_ValueType_S64 || (x) == D2R_ValueType_S128 || (x) == D2R_ValueType_S256 || (x) == D2R_ValueType_S512) #define D2R_ValueType_IsUnsigned(x) ((x) == D2R_ValueType_U8 || (x) == D2R_ValueType_U16 || (x) == D2R_ValueType_U32 || (x) == D2R_ValueType_U64 || (x) == D2R_ValueType_U128 || (x) == D2R_ValueType_U256 || (x) == D2R_ValueType_U512) @@ -88,7 +76,7 @@ typedef enum D2R_ValueType typedef struct D2R_ValueTypeNode { D2R_ValueType type; - + struct D2R_ValueTypeNode *next; } D2R_ValueTypeNode; @@ -113,9 +101,12 @@ internal RDI_RegCode d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v); internal RDIM_Type * d2r_create_type(Arena *arena, D2R_TypeTable *type_table); internal RDIM_Type * d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off); internal RDIM_Type * d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off); -internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); -internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); +internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); +internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); +internal RDI_TypeKind d2r_unsigned_type_kind_from_size(U64 byte_size); +internal RDI_TypeKind d2r_signed_type_kind_from_size(U64 byte_size); +internal RDI_EvalTypeGroup d2r_type_group_from_type_kind(RDI_TypeKind x); //////////////////////////////// //~ RDIM Bytecode Helpers @@ -141,25 +132,26 @@ internal D2R_ValueType d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ internal void d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); -internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Raw *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); -internal RDIM_Location * d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Raw *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); -internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); +internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); +internal RDIM_Location * d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); +internal RDIM_Location * d2r_location_from_attrib(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); //////////////////////////////// //~ rjf: Compilation Unit / Scope Conversion Helpers -internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); -internal RDIM_Scope *d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges); +internal D2R_CompUnitContribMap d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base); +internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); //////////////////////////////// //~ Tag Iterator -internal D2R_TagIter *d2r_tag_iter_init(Arena *arena, DW_TagNode *root); -internal void d2r_tag_iter_next(Arena *arena, D2R_TagIter *iter); -internal void d2r_tag_iter_skip_children(D2R_TagIter *iter); -internal DW_TagNode * d2r_tag_iter_parent_tag_node(D2R_TagIter *iter); -internal DW_Tag d2r_tag_iter_parent_tag(D2R_TagIter *iter); +internal D2R_TagIterator * d2r_tag_iterator_init(Arena *arena, DW_TagNode *root); +internal void d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter); +internal void d2r_tag_iterator_skip_children(D2R_TagIterator *iter); +internal DW_TagNode * d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter); +internal DW_Tag d2r_tag_iterator_parent_tag(D2R_TagIterator *iter); //////////////////////////////// //~ Type/UDT/Symbol Conversion @@ -167,15 +159,11 @@ internal DW_Tag d2r_tag_iter_parent_tag(D2R_TagIter *iter); internal void d2r_flag_converted_tag(DW_TagNode *tag_node); internal B8 d2r_is_tag_converted(DW_TagNode *tag_node); -internal RDIM_Type *d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind); - -internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); -internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); -internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); +internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); +internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); +internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); //////////////////////////////// //~ rjf: Main Conversion Entry Point internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params); - -#endif // RDI_FROM_DWARF_H diff --git a/src/rdi_from_elf/rdi_from_elf.c b/src/rdi_from_elf/rdi_from_elf.c index eb85fa89..ccbb1351 100644 --- a/src/rdi_from_elf/rdi_from_elf.c +++ b/src/rdi_from_elf/rdi_from_elf.c @@ -1,36 +1,9 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal RDI_BinarySectionFlags -e2r_rdi_binary_section_flags_from_elf(ELF_SectionFlags f) -{ - RDI_BinarySectionFlags result = RDI_BinarySectionFlag_Read; - if(f & ELF_Shf_Write) - { - result |= RDI_BinarySectionFlag_Write; - } - if(f & ELF_Shf_ExecInstr) - { - result |= RDI_BinarySectionFlag_Execute; - } - return result; -} - internal RDIM_BinarySectionList -e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_Bin *bin, ELF_Shdr64Array shdrs) +e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, ELF_Shdr64Array shdrs) { RDIM_BinarySectionList result = {0}; - U64 base_vaddr = elf_base_addr_from_bin(bin); - for EachIndex(idx, shdrs.count) - { - ELF_Shdr64 *src = &shdrs.v[idx]; - RDIM_BinarySection *dst = rdim_binary_section_list_push(arena, &result); - dst->name = elf_name_from_shdr64(data, bin, src); - dst->flags = e2r_rdi_binary_section_flags_from_elf(src->sh_flags); - dst->voff_first = src->sh_addr - base_vaddr; - dst->voff_opl = dst->voff_first + src->sh_size; - dst->foff_first = src->sh_offset; - dst->foff_opl = dst->foff_first + src->sh_size; - } return result; } diff --git a/src/rdi_from_elf/rdi_from_elf.h b/src/rdi_from_elf/rdi_from_elf.h index 2915e3eb..3d979c8f 100644 --- a/src/rdi_from_elf/rdi_from_elf.h +++ b/src/rdi_from_elf/rdi_from_elf.h @@ -4,7 +4,6 @@ #ifndef RDI_FROM_ELF_H #define RDI_FROM_ELF_H -internal RDI_BinarySectionFlags e2r_rdi_binary_section_flags_from_elf(ELF_SectionFlags f); -internal RDIM_BinarySectionList e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_Bin *bin, ELF_Shdr64Array shdrs); +internal RDIM_BinarySectionList e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, ELF_Shdr64Array shdrs); #endif // RDI_FROM_ELF_H diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 554b1c5f..7d5ad140 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -17,6 +17,35 @@ rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch) return data_model; } +internal RDIM_TopLevelInfo +rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections) +{ + // convert arch + RDI_Arch arch_rdi = RDI_Arch_NULL; + switch(arch) + { + default:{}break; + case Arch_x64:{arch_rdi = RDI_Arch_X64;}break; + case Arch_x86:{arch_rdi = RDI_Arch_X86;}break; + } + + // find max VOFF + U64 exe_voff_max = 0; + for EachNode(sect_n, RDIM_BinarySectionNode, sections.first) + { + exe_voff_max = Max(exe_voff_max, sect_n->v.voff_opl); + } + + // fill out top level info + RDIM_TopLevelInfo top_level_info = {0}; + top_level_info.arch = arch_rdi; + top_level_info.exe_hash = exe_hash; + top_level_info.voff_max = exe_voff_max; + top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); + + return top_level_info; +} + internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params) { diff --git a/src/rdi_make/rdi_make_local.h b/src/rdi_make/rdi_make_local.h index b3d5da2e..b7ed9ed9 100644 --- a/src/rdi_make/rdi_make_local.h +++ b/src/rdi_make/rdi_make_local.h @@ -161,6 +161,7 @@ struct RDIM_Shared global RDIM_Shared *rdim_shared = 0; internal RDIM_DataModel rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch); +internal RDIM_TopLevelInfo rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections); internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params); internal RDIM_SerializedSectionBundle rdim_compress(Arena *arena, RDIM_SerializedSectionBundle *in); From 08f794527cb721e290082f3b60947b62a4a5f150 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 13 Nov 2025 11:45:34 -0800 Subject: [PATCH 073/850] updated hashing libraries --- src/third_party/martins_hash/sha1.h | 236 +++--- src/third_party/martins_hash/sha256.h | 195 ++--- src/third_party/martins_hash/sha512.h | 1050 +++++++++++++------------ 3 files changed, 748 insertions(+), 733 deletions(-) diff --git a/src/third_party/martins_hash/sha1.h b/src/third_party/martins_hash/sha1.h index 5fd59362..b61e36dd 100644 --- a/src/third_party/martins_hash/sha1.h +++ b/src/third_party/martins_hash/sha1.h @@ -137,17 +137,17 @@ static inline int sha1_cpuid(void) SHA1_TARGET("ssse3,sha") static void sha1_process_shani(uint32_t* state, const uint8_t* block, size_t count) { - // in SHA1 each round has two parts: + // in sha1 each round has two parts: // 1) calculate message schedule dwords in w[i] // 2) do round functions to update a/b/c/d/e state values using w[i] - // w[i] in first 16 rounds is just loaded from block bytes, as 32-bit big-endian load + // initial message schedule is loaded as 32-bit big-endian 16 dwords // for next rounds it is done as: // w[i] = ROL(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]) // where ROL(x) = 32-bit rotate left by 1 - // this means it is possible to keep just the last 16 of w's in circular buffer + // this means it is possible to keep just the last 16 of w's // and every new w calculated will need to update 1 to 3 previous w's // unrolling round calculations by 4 we get: @@ -156,7 +156,7 @@ static void sha1_process_shani(uint32_t* state, const uint8_t* block, size_t cou // w[i+2] = ROL(w[i-1] ^ w[i-6] ^ w[i-12] ^ w[i-14]) // w[i+3] = ROL(w[i+0] ^ w[i-5] ^ w[i-11] ^ w[i-13]) - // now if you store 4 w[..] values in 128-bit SSE register, then + // now use 4 w[..] values in 128-bit SSE register W(i), then // W(i) = ROL( r0 ^ r1 ^ r2 ^ r3 ) // with caveat that r0 lane 3 depends on W(i) lane 0 @@ -166,43 +166,31 @@ static void sha1_process_shani(uint32_t* state, const uint8_t* block, size_t cou // r2 = [ w[i-11], w[i-12], w[i-13], w[i-14] ] // r3 = [ w[i-13], w[i-14], w[i-15], w[i-16] ] - // in each 4-round i'th step it is possible to incrementally update new W(..) value when - // keeping W(i) values in 4 xmm element circular buffer + // in each 4-round i'th step it is possible to incrementally update W's that will be + // used in later rounds - // rounds i>0: W(i-1) = r2 ^ r3 = _mm_sha1msg1_epu32(W(i-1), W(i)) - // rounds i>1: W(i-2) = W(i-2) ^ r1 = _mm_xor_si128 (W(i-2), W(i)) - // rounds i>2: W(i-3) = ROL(W(i-3) ^ r0) = _mm_sha1msg2_epu32(W(i-3), W(i)) - // then the new W(i) can be used in round function calculations - // _mm_sha1msg2_epu32 correctly handles r0 lane 3 dependency on W(i) lane 0 + // rounds i>0: m3 = r2 ^ r3 = _mm_sha1msg1_epu32(m3, m0) + // rounds i>1: m2 = m2 ^ r1 = _mm_xor_si128 (m2, m0) + // rounds i>2: m1 = ROL(m1 ^ r0) = _mm_sha1msg2_epu32(m1, m0) + // then the new m0 can be used in round function calculations + // _mm_sha1msg2_epu32 correctly handles r0 lane 3 dependency on lane 0 output // to perform round functions on two SIMD registers with state as: - // abcd = [a,b,c,d] - // e0 = [e,0,0,0] - // use the following code to get next abcd/e0 state 4 rounds at a time: - - // tmp = _mm_sha1nexte_epu32(e0, W(i)) // rotates e0 and adds message dwords - // abcd_next = _mm_sha1rnds4_epu32(abcd, tmp, Fn) // with Fn = 0..3 round function selection - // e0_next = abcd - - // sha1nexte is not needed on first round, just regular add32(e0, W(i)) should be used - // after last round need to do extra rotation, which sha1nexte takes care when adding to last_e0 - - #define W(i) w[(i)%4] + // s0 = [a,b,c,d] + // s1 = [e,0,0,0] + // use _mm_sha1rnds4_epu32 and _mm_sha1nexte_epu32 ops and swap both state variables between rounds // 4 wide round calculations - #define QROUND(i) do { \ - /* first 4 rounds load input block */ \ - if (i < 4) W(i) = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[i]), bswap); \ - /* update message schedule */ \ - if (i > 0 && i < 17) W(i-1) = _mm_sha1msg1_epu32(W(i-1), W(i)); \ - if (i > 1 && i < 18) W(i-2) = _mm_xor_si128 (W(i-2), W(i)); \ - if (i > 2 && i < 19) W(i-3) = _mm_sha1msg2_epu32(W(i-3), W(i)); \ - /* calculate E plus message schedule */ \ - if (i == 0) tmp = _mm_add_epi32 (e0, W(i)); \ - if (i != 0) tmp = _mm_sha1nexte_epu32(e0, W(i)); \ - /* 4 round functions */ \ - e0 = abcd; \ - abcd = _mm_sha1rnds4_epu32(abcd, tmp, i/5); \ + #define QROUND(i,s0,s1,m0,m1,m2,m3) do { \ + /* update message schedule */ \ + if (i > 0 && i < 17) m3 = _mm_sha1msg1_epu32(m3, m0); \ + if (i > 1 && i < 18) m2 = _mm_xor_si128 (m2, m0); \ + if (i > 2 && i < 19) m1 = _mm_sha1msg2_epu32(m1, m0); \ + /* calculate E plus message schedule */ \ + if (i == 0) tmp = _mm_add_epi32 (s1, m0); \ + if (i != 0) tmp = _mm_sha1nexte_epu32(s1, m0); \ + /* 4 round functions */ \ + s1 = _mm_sha1rnds4_epu32(s0, tmp, i/5); \ } while(0) const __m128i* buffer = (const __m128i*)block; @@ -213,63 +201,67 @@ static void sha1_process_shani(uint32_t* state, const uint8_t* block, size_t cou const __m128i bswap = _mm_setr_epi8(15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0); // load initial state - __m128i abcd = _mm_loadu_si128((const __m128i*)state); // [d,c,b,a] - __m128i e0 = _mm_loadu_si32(&state[4]); // [0,0,0,e] + __m128i s0 = _mm_loadu_si128((const __m128i*)state); // [d,c,b,a] + __m128i s1 = _mm_loadu_si32(&state[4]); // [0,0,0,e] // flip dword order, to what sha1 instructions use - abcd = _mm_shuffle_epi32(abcd, _MM_SHUFFLE(0,1,2,3)); // [a,b,c,d] where a is in the top lane - e0 = _mm_slli_si128(e0, 12); // [e,0,0,0] where e is in top lane + s0 = _mm_shuffle_epi32(s0, _MM_SHUFFLE(0,1,2,3)); // [a,b,c,d] + s1 = _mm_shuffle_epi32(s1, _MM_SHUFFLE(0,1,2,3)); // [e,0,0,0] do { // remember current state - __m128i last_abcd = abcd; - __m128i last_e0 = e0; + __m128i last0 = s0; + __m128i last1 = s1; - __m128i tmp, w[4]; + // load initial message schedule, 64-byte block + __m128i w0 = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[0]), bswap); + __m128i w1 = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[1]), bswap); + __m128i w2 = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[2]), bswap); + __m128i w3 = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[3]), bswap); + buffer += 4; - QROUND(0); - QROUND(1); - QROUND(2); - QROUND(3); - QROUND(4); + __m128i tmp; - QROUND(5); - QROUND(6); - QROUND(7); - QROUND(8); - QROUND(9); + QROUND( 0, s0, s1, w0, w1, w2, w3); + QROUND( 1, s1, s0, w1, w2, w3, w0); + QROUND( 2, s0, s1, w2, w3, w0, w1); + QROUND( 3, s1, s0, w3, w0, w1, w2); + QROUND( 4, s0, s1, w0, w1, w2, w3); - QROUND(10); - QROUND(11); - QROUND(12); - QROUND(13); - QROUND(14); + QROUND( 5, s1, s0, w1, w2, w3, w0); + QROUND( 6, s0, s1, w2, w3, w0, w1); + QROUND( 7, s1, s0, w3, w0, w1, w2); + QROUND( 8, s0, s1, w0, w1, w2, w3); + QROUND( 9, s1, s0, w1, w2, w3, w0); - QROUND(15); - QROUND(16); - QROUND(17); - QROUND(18); - QROUND(19); + QROUND(10, s0, s1, w2, w3, w0, w1); + QROUND(11, s1, s0, w3, w0, w1, w2); + QROUND(12, s0, s1, w0, w1, w2, w3); + QROUND(13, s1, s0, w1, w2, w3, w0); + QROUND(14, s0, s1, w2, w3, w0, w1); + + QROUND(15, s1, s0, w3, w0, w1, w2); + QROUND(16, s0, s1, w0, w1, w2, w3); + QROUND(17, s1, s0, w1, w2, w3, w0); + QROUND(18, s0, s1, w2, w3, w0, w1); + QROUND(19, s1, s0, w3, w0, w1, w2); // update next state - abcd = _mm_add_epi32(abcd, last_abcd); - e0 = _mm_sha1nexte_epu32(e0, last_e0); - - buffer += 4; + s0 = _mm_add_epi32 (s0, last0); + s1 = _mm_sha1nexte_epu32(s1, last1); } while (--count); // restore dword order - abcd = _mm_shuffle_epi32(abcd, _MM_SHUFFLE(0,1,2,3)); - e0 = _mm_shuffle_epi32(e0, _MM_SHUFFLE(0,1,2,3)); + s0 = _mm_shuffle_epi32(s0, _MM_SHUFFLE(0,1,2,3)); + s1 = _mm_shuffle_epi32(s1, _MM_SHUFFLE(0,1,2,3)); // save the new state - _mm_storeu_si128((__m128i*)state, abcd); - _mm_storeu_si32(&state[4], e0); + _mm_storeu_si128((__m128i*)state, s0); + _mm_storeu_si32(&state[4], s1); #undef QROUND - #undef W } #endif // defined(__x86_64__) || defined(_M_AMD64) @@ -343,21 +335,16 @@ static void sha1_process_arm64(uint32_t* state, const uint8_t* block, size_t cou { // code here is similar to x64 shani implementation - // message array is 16 element circular buffer - // each iteration updates 4 rounds at the same time - - #define W(i) w[(i)%4] - - #define QROUND(i,F,k) do { \ - /* update message schedule */ \ - if (i >= 4) W(i) = vsha1su0q_u32(W(i), W(i-3), W(i-2)); \ - if (i >= 4) W(i) = vsha1su1q_u32(W(i), W(i-1)); \ - /* add round constant */ \ - uint32x4_t tmp = vaddq_u32(W(i), k); \ - /* 4 round functions */ \ - uint32_t x = e0; \ - e0 = vsha1h_u32(vgetq_lane_u32(abcd, 0)); \ - abcd = F(abcd, x, tmp); \ + #define QROUND(i,m0,m1,m2,m3,k,F) do { \ + /* update message schedule */ \ + if (i >= 4) m0 = vsha1su0q_u32(m0, m1, m2); \ + if (i >= 4) m0 = vsha1su1q_u32(m0, m3); \ + /* add round constant */ \ + uint32x4_t tmp = vaddq_u32(m0, k); \ + /* 4 round functions */ \ + uint32_t e = vgetq_lane_u32(s0, 0); \ + s0 = F(s0, s1, tmp); \ + s1 = vsha1h_u32(e); \ } while (0) const uint32x4_t k0 = vdupq_n_u32(0x5a827999); @@ -365,64 +352,61 @@ static void sha1_process_arm64(uint32_t* state, const uint8_t* block, size_t cou const uint32x4_t k2 = vdupq_n_u32(0x8f1bbcdc); const uint32x4_t k3 = vdupq_n_u32(0xca62c1d6); - // load state - a,b,c,d,e - uint32x4_t abcd = vld1q_u32(state); - uint32_t e0 = state[4]; + // load initial state + uint32x4_t s0 = vld1q_u32(state); // [d,c,b,a] + uint32_t s1 = state[4]; // e do { // remember current state - uint32x4_t last_abcd = abcd; - uint32_t last_e0 = e0; + uint32x4_t last0 = s0; + uint32_t last1 = s1; - // load 64-byte block and advance pointer to next block + // load initial message schedule, 64-byte block uint8x16x4_t msg = vld1q_u8_x4(block); block += SHA1_BLOCK_SIZE; - uint32x4_t w[4]; + // reverse the byte order in each 32-bit lane + uint32x4_t w0 = vreinterpretq_u32_u8(vrev32q_u8(msg.val[0])); + uint32x4_t w1 = vreinterpretq_u32_u8(vrev32q_u8(msg.val[1])); + uint32x4_t w2 = vreinterpretq_u32_u8(vrev32q_u8(msg.val[2])); + uint32x4_t w3 = vreinterpretq_u32_u8(vrev32q_u8(msg.val[3])); - // for first 16 w's reverse the byte order in each 32-bit lane - W(0) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[0])); - W(1) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[1])); - W(2) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[2])); - W(3) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[3])); + QROUND( 0, w0, w1, w2, w3, k0, vsha1cq_u32); + QROUND( 1, w1, w2, w3, w0, k0, vsha1cq_u32); + QROUND( 2, w2, w3, w0, w1, k0, vsha1cq_u32); + QROUND( 3, w3, w0, w1, w2, k0, vsha1cq_u32); + QROUND( 4, w0, w1, w2, w3, k0, vsha1cq_u32); - QROUND( 0, vsha1cq_u32, k0); - QROUND( 1, vsha1cq_u32, k0); - QROUND( 2, vsha1cq_u32, k0); - QROUND( 3, vsha1cq_u32, k0); - QROUND( 4, vsha1cq_u32, k0); + QROUND( 5, w1, w2, w3, w0, k1, vsha1pq_u32); + QROUND( 6, w2, w3, w0, w1, k1, vsha1pq_u32); + QROUND( 7, w3, w0, w1, w2, k1, vsha1pq_u32); + QROUND( 8, w0, w1, w2, w3, k1, vsha1pq_u32); + QROUND( 9, w1, w2, w3, w0, k1, vsha1pq_u32); - QROUND( 5, vsha1pq_u32, k1); - QROUND( 6, vsha1pq_u32, k1); - QROUND( 7, vsha1pq_u32, k1); - QROUND( 8, vsha1pq_u32, k1); - QROUND( 9, vsha1pq_u32, k1); + QROUND(10, w2, w3, w0, w1, k2, vsha1mq_u32); + QROUND(11, w3, w0, w1, w2, k2, vsha1mq_u32); + QROUND(12, w0, w1, w2, w3, k2, vsha1mq_u32); + QROUND(13, w1, w2, w3, w0, k2, vsha1mq_u32); + QROUND(14, w2, w3, w0, w1, k2, vsha1mq_u32); - QROUND(10, vsha1mq_u32, k2); - QROUND(11, vsha1mq_u32, k2); - QROUND(12, vsha1mq_u32, k2); - QROUND(13, vsha1mq_u32, k2); - QROUND(14, vsha1mq_u32, k2); - - QROUND(15, vsha1pq_u32, k3); - QROUND(16, vsha1pq_u32, k3); - QROUND(17, vsha1pq_u32, k3); - QROUND(18, vsha1pq_u32, k3); - QROUND(19, vsha1pq_u32, k3); + QROUND(15, w3, w0, w1, w2, k3, vsha1pq_u32); + QROUND(16, w0, w1, w2, w3, k3, vsha1pq_u32); + QROUND(17, w1, w2, w3, w0, k3, vsha1pq_u32); + QROUND(18, w2, w3, w0, w1, k3, vsha1pq_u32); + QROUND(19, w3, w0, w1, w2, k3, vsha1pq_u32); // update next state - abcd = vaddq_u32(abcd, last_abcd); - e0 += last_e0; + s0 = vaddq_u32(s0, last0); + s1 += last1; } while (--count); // save state - vst1q_u32(state, abcd); - state[4] = e0; + vst1q_u32(state, s0); + state[4] = s1; #undef QROUND - #undef W } #endif // defined(__aarch64__) || defined(_M_ARM64) @@ -452,7 +436,7 @@ static void sha1_process(uint32_t* state, const uint8_t* block, size_t count) #define F3(x,y,z) (0x8f1bbcdc + ((x & y) | (z & (x | y)))) #define F4(x,y,z) (0xca62c1d6 + (x ^ y ^ z)) - #define W(i) w[(i)%16] + #define W(i) w[(i+16)%16] #define ROUND(i,a,b,c,d,e,F) do \ { \ diff --git a/src/third_party/martins_hash/sha256.h b/src/third_party/martins_hash/sha256.h index b70a72a0..56cbc5c5 100644 --- a/src/third_party/martins_hash/sha256.h +++ b/src/third_party/martins_hash/sha256.h @@ -167,9 +167,7 @@ static void sha256_process_shani(uint32_t* state, const uint8_t* block, size_t c { // similar way how sha1 works in with shani - // first 16 rounds loads message schedule dwords as 32-bit big endian values - - // for next rounds message schedule is prepared as: + // rounds message schedule is updated as: // w[i] = SSig1(w[i-2]) + w[i-7] + SSig0(w[i-15]) + w[i-16] // unrolled by 4: @@ -190,32 +188,22 @@ static void sha256_process_shani(uint32_t* state, const uint8_t* block, size_t c // r2 = [ w[i-12], w[i-13], w[i-14], w[i-15] ] // r3 = [ w[i-13], w[i-14], w[i-15], w[i-16] ] - // rN's can be calculated from previous W(..) values: - // r0 from W(i) - // r1 from _mm_alignr_epi8(W(i), W(i-1), 4) - // r2 from W(i-1) and W(i) - // r3 from W(i-1) - - // rounds i>2: W(i-3) = _mm_sha256msg2_epu32(_mm_add_epi32( W(i-3), _mm_alignr_epi8(W(i), W(i-1), 4) ), W(i)) - // rounds i>0: W(i-1) = _mm_sha256msg1_epu32(W(i-1), W(i)) + // rounds i>2: m1 = _mm_sha256msg2_epu32(_mm_add_epi32(m1, _mm_alignr_epi8(m0, m3, 4) ), m0) + // rounds i>0: m3 = _mm_sha256msg1_epu32(m3, m0) // round functions are done with _mm_sha256rnds2_epu32 which performs it for 2 rounds - // thus repeat it two times, as input use W(i) + K(i) - message schedule added with sha256 constants - - #define W(i) w[(i)%4] + // thus repeat it two times, as input use m0 + K(i) - message schedule added with sha256 constants // 4 wide round calculations - #define QROUND(i) do { \ - /* first 4 rounds load input block */ \ - if (i < 4) W(i) = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[i]), bswap); \ - /* update message schedule */ \ - if (i > 2 && i < 15) W(i-3) = _mm_sha256msg2_epu32(_mm_add_epi32(W(i-3), _mm_alignr_epi8(W(i), W(i-1), 4)), W(i)); \ - if (i > 0 && i < 13) W(i-1) = _mm_sha256msg1_epu32(W(i-1), W(i)); \ - /* add round constants */ \ - __m128i tmp = _mm_add_epi32(W(i), _mm_loadu_si128((const __m128i*)&SHA256_K[4*i])); \ - /* 4 round functions */ \ - state1 = _mm_sha256rnds2_epu32(state1, state0, tmp); \ - state0 = _mm_sha256rnds2_epu32(state0, state1, _mm_shuffle_epi32(tmp, _MM_SHUFFLE(0,0,3,2))); \ + #define QROUND(i,m0,m1,m2,m3) do { \ + /* update message schedule */ \ + if (i > 2 && i < 15) m1 = _mm_sha256msg2_epu32(_mm_add_epi32(m1, _mm_alignr_epi8(m0, m3, 4)), m0); \ + if (i > 0 && i < 13) m3 = _mm_sha256msg1_epu32(m3, m0); \ + /* add round constants */ \ + __m128i tmp = _mm_add_epi32(m0, _mm_loadu_si128((const __m128i*)&SHA256_K[4*i])); \ + /* 4 round functions */ \ + s1 = _mm_sha256rnds2_epu32(s1, s0, tmp); \ + s0 = _mm_sha256rnds2_epu32(s0, s1, _mm_shuffle_epi32(tmp, _MM_SHUFFLE(0,0,3,2))); \ } while(0) const __m128i* buffer = (const __m128i*)block; @@ -228,52 +216,57 @@ static void sha256_process_shani(uint32_t* state, const uint8_t* block, size_t c __m128i efgh = _mm_shuffle_epi32(_mm_loadu_si128((const __m128i*)&state[4]), _MM_SHUFFLE(0,1,2,3)); // [e,f,g,h] // dword order for sha256rnds2 instruction - __m128i state0 = _mm_unpackhi_epi64(efgh, abcd); // [a,b,e,f] - __m128i state1 = _mm_unpacklo_epi64(efgh, abcd); // [c,d,g,h] + __m128i s0 = _mm_unpackhi_epi64(efgh, abcd); // [a,b,e,f] + __m128i s1 = _mm_unpacklo_epi64(efgh, abcd); // [c,d,g,h] do { // remember current state - __m128i last0 = state0; - __m128i last1 = state1; + __m128i last0 = s0; + __m128i last1 = s1; - __m128i w[4]; + // load initial message schedule, 64-byte block + __m128i w0 = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[0]), bswap); + __m128i w1 = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[1]), bswap); + __m128i w2 = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[2]), bswap); + __m128i w3 = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[3]), bswap); + buffer += 4; - QROUND( 0); - QROUND( 1); - QROUND( 2); - QROUND( 3); - QROUND( 4); - QROUND( 5); - QROUND( 6); - QROUND( 7); - QROUND( 8); - QROUND( 9); - QROUND(10); - QROUND(11); - QROUND(12); - QROUND(13); - QROUND(14); - QROUND(15); + QROUND( 0, w0, w1, w2, w3); + QROUND( 1, w1, w2, w3, w0); + QROUND( 2, w2, w3, w0, w1); + QROUND( 3, w3, w0, w1, w2); + + QROUND( 4, w0, w1, w2, w3); + QROUND( 5, w1, w2, w3, w0); + QROUND( 6, w2, w3, w0, w1); + QROUND( 7, w3, w0, w1, w2); + + QROUND( 8, w0, w1, w2, w3); + QROUND( 9, w1, w2, w3, w0); + QROUND(10, w2, w3, w0, w1); + QROUND(11, w3, w0, w1, w2); + + QROUND(12, w0, w1, w2, w3); + QROUND(13, w1, w2, w3, w0); + QROUND(14, w2, w3, w0, w1); + QROUND(15, w3, w0, w1, w2); // update next state - state0 = _mm_add_epi32(state0, last0); - state1 = _mm_add_epi32(state1, last1); - - buffer += 4; + s0 = _mm_add_epi32(s0, last0); + s1 = _mm_add_epi32(s1, last1); } while (--count); // restore dword order - abcd = _mm_unpackhi_epi64(state1, state0); - efgh = _mm_unpacklo_epi64(state1, state0); + abcd = _mm_unpackhi_epi64(s1, s0); + efgh = _mm_unpacklo_epi64(s1, s0); // save the new state _mm_storeu_si128((__m128i*)&state[0], _mm_shuffle_epi32(abcd, _MM_SHUFFLE(0,1,2,3))); _mm_storeu_si128((__m128i*)&state[4], _mm_shuffle_epi32(efgh, _MM_SHUFFLE(0,1,2,3))); #undef QROUND - #undef W } #endif // defined(__x86_64__) || defined(_M_AMD64) @@ -344,70 +337,71 @@ static inline int sha256_cpuid(void) SHA256_TARGET static void sha256_process_arm64(uint32_t* state, const uint8_t* block, size_t count) { - // code here is similar to x64 shani implementation - - #define W(i) w[(i)%4] - - #define QROUND(i) do { \ - /* load 16 round constants */ \ - if ((i % 4) == 0) rk = vld1q_u32_x4(&SHA256_K[4*i]); \ - /* first 4 rounds reverse byte order in each 32-bit lane of input block */ \ - if (i < 4) W(i) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[i])); \ - /* update message schedule */ \ - if (i >= 4) W(i) = vsha256su0q_u32(W(i), W(i-3)); \ - if (i >= 4) W(i) = vsha256su1q_u32(W(i), W(i-2), W(i-1)); \ - /* add round constants */ \ - uint32x4_t tmp = vaddq_u32(W(i), rk.val[i%4]); \ - /* 4 round functions */ \ - uint32x4_t x = vstate.val[0]; \ - vstate.val[0] = vsha256hq_u32(vstate.val[0], vstate.val[1], tmp); \ - vstate.val[1] = vsha256h2q_u32(vstate.val[1], x, tmp); \ + #define QROUND(i,m0,m1,m2,m3) do { \ + /* update message schedule */ \ + if (i >= 4) m0 = vsha256su1q_u32(vsha256su0q_u32(m0, m1), m2, m3); \ + /* add round constants */ \ + uint32x4_t tmp = vaddq_u32(m0, rk.val[i%4]); \ + /* 4 round functions */ \ + uint32x4x2_t x = s; \ + s.val[0] = vsha256hq_u32(x.val[0], x.val[1], tmp); \ + s.val[1] = vsha256h2q_u32(x.val[1], x.val[0], tmp); \ } while (0) // load initial state - uint32x4x2_t vstate = vld1q_u32_x2(state); + uint32x4x2_t s = vld1q_u32_x2(state); do { // remember current state - uint32x4x2_t vlast = vstate; + uint32x4x2_t last = s; - // load 64-byte block + // load initial message schedule, 64-byte block uint8x16x4_t msg = vld1q_u8_x4(block); + block += SHA256_BLOCK_SIZE; + + // reverse the byte order in each 32-bit lane + uint32x4_t w0 = vreinterpretq_u32_u8(vrev32q_u8(msg.val[0])); + uint32x4_t w1 = vreinterpretq_u32_u8(vrev32q_u8(msg.val[1])); + uint32x4_t w2 = vreinterpretq_u32_u8(vrev32q_u8(msg.val[2])); + uint32x4_t w3 = vreinterpretq_u32_u8(vrev32q_u8(msg.val[3])); uint32x4x4_t rk; - uint32x4_t w[4]; - QROUND( 0); - QROUND( 1); - QROUND( 2); - QROUND( 3); - QROUND( 4); - QROUND( 5); - QROUND( 6); - QROUND( 7); - QROUND( 8); - QROUND( 9); - QROUND(10); - QROUND(11); - QROUND(12); - QROUND(13); - QROUND(14); - QROUND(15); + rk = vld1q_u32_x4(&SHA256_K[0]); + QROUND( 0, w0, w1, w2, w3); + QROUND( 1, w1, w2, w3, w0); + QROUND( 2, w2, w3, w0, w1); + QROUND( 3, w3, w0, w1, w2); + + rk = vld1q_u32_x4(&SHA256_K[16]); + QROUND( 4, w0, w1, w2, w3); + QROUND( 5, w1, w2, w3, w0); + QROUND( 6, w2, w3, w0, w1); + QROUND( 7, w3, w0, w1, w2); + + rk = vld1q_u32_x4(&SHA256_K[32]); + QROUND( 8, w0, w1, w2, w3); + QROUND( 9, w1, w2, w3, w0); + QROUND(10, w2, w3, w0, w1); + QROUND(11, w3, w0, w1, w2); + + rk = vld1q_u32_x4(&SHA256_K[48]); + QROUND(12, w0, w1, w2, w3); + QROUND(13, w1, w2, w3, w0); + QROUND(14, w2, w3, w0, w1); + QROUND(15, w3, w0, w1, w2); // update next state - vstate.val[0] = vaddq_u32(vstate.val[0], vlast.val[0]); - vstate.val[1] = vaddq_u32(vstate.val[1], vlast.val[1]); - - block += SHA256_BLOCK_SIZE; + s.val[0] = vaddq_u32(s.val[0], last.val[0]); + s.val[1] = vaddq_u32(s.val[1], last.val[1]); } while (--count); // save the new state - vst1q_u32_x2(state, vstate); + vst1q_u32_x2(state, s); #undef QROUND - #undef W } #endif // defined(__aarch64__) || defined(_M_ARM64) @@ -475,6 +469,7 @@ static void sha256_process(uint32_t* state, const uint8_t* block, size_t count) ROUND( 5, d, e, f, g, h, a, b, c); ROUND( 6, c, d, e, f, g, h, a, b); ROUND( 7, b, c, d, e, f, g, h, a); + ROUND( 8, a, b, c, d, e, f, g, h); ROUND( 9, h, a, b, c, d, e, f, g); ROUND(10, g, h, a, b, c, d, e, f); @@ -483,6 +478,7 @@ static void sha256_process(uint32_t* state, const uint8_t* block, size_t count) ROUND(13, d, e, f, g, h, a, b, c); ROUND(14, c, d, e, f, g, h, a, b); ROUND(15, b, c, d, e, f, g, h, a); + ROUND(16, a, b, c, d, e, f, g, h); ROUND(17, h, a, b, c, d, e, f, g); ROUND(18, g, h, a, b, c, d, e, f); @@ -491,6 +487,7 @@ static void sha256_process(uint32_t* state, const uint8_t* block, size_t count) ROUND(21, d, e, f, g, h, a, b, c); ROUND(22, c, d, e, f, g, h, a, b); ROUND(23, b, c, d, e, f, g, h, a); + ROUND(24, a, b, c, d, e, f, g, h); ROUND(25, h, a, b, c, d, e, f, g); ROUND(26, g, h, a, b, c, d, e, f); @@ -499,6 +496,7 @@ static void sha256_process(uint32_t* state, const uint8_t* block, size_t count) ROUND(29, d, e, f, g, h, a, b, c); ROUND(30, c, d, e, f, g, h, a, b); ROUND(31, b, c, d, e, f, g, h, a); + ROUND(32, a, b, c, d, e, f, g, h); ROUND(33, h, a, b, c, d, e, f, g); ROUND(34, g, h, a, b, c, d, e, f); @@ -507,6 +505,7 @@ static void sha256_process(uint32_t* state, const uint8_t* block, size_t count) ROUND(37, d, e, f, g, h, a, b, c); ROUND(38, c, d, e, f, g, h, a, b); ROUND(39, b, c, d, e, f, g, h, a); + ROUND(40, a, b, c, d, e, f, g, h); ROUND(41, h, a, b, c, d, e, f, g); ROUND(42, g, h, a, b, c, d, e, f); @@ -515,6 +514,7 @@ static void sha256_process(uint32_t* state, const uint8_t* block, size_t count) ROUND(45, d, e, f, g, h, a, b, c); ROUND(46, c, d, e, f, g, h, a, b); ROUND(47, b, c, d, e, f, g, h, a); + ROUND(48, a, b, c, d, e, f, g, h); ROUND(49, h, a, b, c, d, e, f, g); ROUND(50, g, h, a, b, c, d, e, f); @@ -523,6 +523,7 @@ static void sha256_process(uint32_t* state, const uint8_t* block, size_t count) ROUND(53, d, e, f, g, h, a, b, c); ROUND(54, c, d, e, f, g, h, a, b); ROUND(55, b, c, d, e, f, g, h, a); + ROUND(56, a, b, c, d, e, f, g, h); ROUND(57, h, a, b, c, d, e, f, g); ROUND(58, g, h, a, b, c, d, e, f); diff --git a/src/third_party/martins_hash/sha512.h b/src/third_party/martins_hash/sha512.h index 4a48c6f1..10a4cb9e 100644 --- a/src/third_party/martins_hash/sha512.h +++ b/src/third_party/martins_hash/sha512.h @@ -15,9 +15,9 @@ #define SHA512_BLOCK_SIZE 128 typedef struct { - uint8_t buffer[SHA512_BLOCK_SIZE]; - uint64_t count[2]; - uint64_t state[8]; + uint8_t buffer[SHA512_BLOCK_SIZE]; + uint64_t count[2]; + uint64_t state[8]; } sha512_ctx; typedef sha512_ctx sha384_ctx; @@ -62,52 +62,52 @@ static inline void sha384_finish(sha384_ctx* ctx, uint8_t digest[SHA384_DIGEST_S # define SHA512_SET64BE(ptr,x) *((__unaligned uint64_t*)(ptr)) = _byteswap_uint64(x) #else # define SHA512_GET64BE(ptr) \ -( \ -((uint64_t)((ptr)[0]) << 56) | \ -((uint64_t)((ptr)[1]) << 48) | \ -((uint64_t)((ptr)[2]) << 40) | \ -((uint64_t)((ptr)[3]) << 32) | \ -((uint64_t)((ptr)[4]) << 24) | \ -((uint64_t)((ptr)[5]) << 16) | \ -((uint64_t)((ptr)[6]) << 8) | \ -((uint64_t)((ptr)[7]) << 0) \ -) + ( \ + ((uint64_t)((ptr)[0]) << 56) | \ + ((uint64_t)((ptr)[1]) << 48) | \ + ((uint64_t)((ptr)[2]) << 40) | \ + ((uint64_t)((ptr)[3]) << 32) | \ + ((uint64_t)((ptr)[4]) << 24) | \ + ((uint64_t)((ptr)[5]) << 16) | \ + ((uint64_t)((ptr)[6]) << 8) | \ + ((uint64_t)((ptr)[7]) << 0) \ + ) # define SHA512_SET64BE(ptr, x) do \ -{ \ -(ptr)[0] = (uint8_t)((x) >> 56); \ -(ptr)[1] = (uint8_t)((x) >> 48); \ -(ptr)[2] = (uint8_t)((x) >> 40); \ -(ptr)[3] = (uint8_t)((x) >> 32); \ -(ptr)[4] = (uint8_t)((x) >> 24); \ -(ptr)[5] = (uint8_t)((x) >> 16); \ -(ptr)[6] = (uint8_t)((x) >> 8); \ -(ptr)[7] = (uint8_t)((x) >> 0); \ -} \ -while (0) + { \ + (ptr)[0] = (uint8_t)((x) >> 56); \ + (ptr)[1] = (uint8_t)((x) >> 48); \ + (ptr)[2] = (uint8_t)((x) >> 40); \ + (ptr)[3] = (uint8_t)((x) >> 32); \ + (ptr)[4] = (uint8_t)((x) >> 24); \ + (ptr)[5] = (uint8_t)((x) >> 16); \ + (ptr)[6] = (uint8_t)((x) >> 8); \ + (ptr)[7] = (uint8_t)((x) >> 0); \ + } \ + while (0) #endif static const uint64_t SHA512_K[80] = { - 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, - 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, - 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, - 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694, - 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, - 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, - 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, - 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70, - 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, - 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, - 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, - 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, - 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, - 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, - 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, - 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, - 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, - 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, - 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, - 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817, + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, + 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, + 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694, + 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, + 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, + 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70, + 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, + 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, + 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, + 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, + 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, + 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, + 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, + 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817, }; #if defined(__x86_64__) || defined(_M_AMD64) @@ -134,129 +134,131 @@ static const uint64_t SHA512_K[80] = SHA512_TARGET("xsave") static inline int sha512_cpuid(void) { - static int cpuid; - - int result = cpuid; - if (result == 0) - { - int info[4]; - - SHA512_CPUID(1, info); - int has_xsave = info[2] & (1 << 26); - - int has_ymm = 0; - if (has_xsave) + static int cpuid; + + int result = cpuid; + if (result == 0) { - uint64_t xcr0 = SHA512_XGETBV(0); - has_ymm = xcr0 & (1 << 2); + int info[4]; + + SHA512_CPUID(1, info); + int has_xsave = info[2] & (1 << 26); + + int has_ymm = 0; + if (has_xsave) + { + uint64_t xcr0 = SHA512_XGETBV(0); + has_ymm = xcr0 & (1 << 2); + } + + SHA512_CPUID_EX(7, 0, info); + int has_avx2 = info[1] & (1 << 5); + + SHA512_CPUID_EX(7, 1, info); + int has_sha512 = info[0] & (1 << 0); + + result |= SHA512_CPUID_INIT; + if (has_ymm && has_avx2 && has_sha512) + { + result |= SHA512_CPUID_VSHA512; + } + + cpuid = result; } - - SHA512_CPUID_EX(7, 0, info); - int has_avx2 = info[1] & (1 << 5); - - SHA512_CPUID_EX(7, 1, info); - int has_sha512 = info[0] & (1 << 0); - - result |= SHA512_CPUID_INIT; - if (has_ymm && has_avx2 && has_sha512) - { - result |= SHA512_CPUID_VSHA512; - } - - cpuid = result; - } - + #if defined(SHA512_CPUID_MASK) - result &= SHA512_CPUID_MASK; + result &= SHA512_CPUID_MASK; #endif - - return result; + + return result; } SHA512_TARGET("avx2,sha512") static void sha512_process_vsha512(uint64_t* state, const uint8_t* block, size_t count) { - // pretty much same way how sha256 works, only with avx2 registers and 64-bit additions - // state is kept as two 256-bit ymm registers (8 qwords) - - // message qwords are loaded as 64-bit big-endian values - -#define W(i) w[(i)%4] - - // 4 wide round calculations -#define QROUND(i) do { \ -/* first 4 rounds load input block */ \ -if (i < 4) W(i) = _mm256_shuffle_epi8(_mm256_loadu_si256(&buffer[i]), bswap); \ -/* update message schedule */ \ -if (i > 2 && i < 19) W(i-3) = _mm256_sha512msg2_epi64(_mm256_add_epi64(W(i-3), _mm256_permute4x64_epi64(_mm256_blend_epi32(W(i-1), W(i), 3), _MM_SHUFFLE(0,3,2,1))), W(i)); \ -if (i > 0 && i < 17) W(i-1) = _mm256_sha512msg1_epi64(W(i-1), _mm256_castsi256_si128(W(i))); \ -/* add round constants */ \ -__m256i tmp = _mm256_add_epi64(W(i), _mm256_loadu_si256((const __m256i*)&SHA512_K[4*i])); \ -/* round functions */ \ -state1 = _mm256_sha512rnds2_epi64(state1, state0, _mm256_castsi256_si128(tmp)); \ -state0 = _mm256_sha512rnds2_epi64(state0, state1, _mm256_extracti128_si256(tmp, 1)); \ -} while(0) - - const __m256i* buffer = (const __m256i*)block; - - // to byteswap when doing big-ending load for message qwords - const __m256i bswap = _mm256_broadcastsi128_si256(_mm_setr_epi8(7,6,5,4,3,2,1,0, 15,14,13,12,11,10,9,8)); - - // load initial state - __m256i abcd = _mm256_permute4x64_epi64(_mm256_loadu_si256((const __m256i*)&state[0]), _MM_SHUFFLE(0,1,2,3)); // [a,b,c,d] - __m256i efgh = _mm256_permute4x64_epi64(_mm256_loadu_si256((const __m256i*)&state[4]), _MM_SHUFFLE(0,1,2,3)); // [e,f,g,h] - - // qword order for vsha512rnds2 instruction - __m256i state0 = _mm256_permute2x128_si256(efgh, abcd, (3 << 4) | 1); // [a,b,e,f] - __m256i state1 = _mm256_permute2x128_si256(efgh, abcd, (2 << 4) | 0); // [c,d,g,h] - - do - { - // remember current state - __m256i last0 = state0; - __m256i last1 = state1; - - __m256i w[4]; - - QROUND(0); - QROUND(1); - QROUND(2); - QROUND(3); - QROUND(4); - QROUND(5); - QROUND(6); - QROUND(7); - QROUND(8); - QROUND(9); - QROUND(10); - QROUND(11); - QROUND(12); - QROUND(13); - QROUND(14); - QROUND(15); - QROUND(16); - QROUND(17); - QROUND(18); - QROUND(19); - - // update next state - state0 = _mm256_add_epi64(state0, last0); - state1 = _mm256_add_epi64(state1, last1); - - buffer += 4; - } - while (--count); - - // restore qword order - abcd = _mm256_permute2x128_si256(state1, state0, (3 << 4) | 1); - efgh = _mm256_permute2x128_si256(state1, state0, (2 << 4) | 0); - - // save the new state - _mm256_storeu_si256((__m256i*)&state[0], _mm256_permute4x64_epi64(abcd, _MM_SHUFFLE(0,1,2,3))); - _mm256_storeu_si256((__m256i*)&state[4], _mm256_permute4x64_epi64(efgh, _MM_SHUFFLE(0,1,2,3))); - -#undef QROUND -#undef W + // pretty much same way how sha256 works, only with avx2 registers and 64-bit additions + // state is kept as two 256-bit ymm registers (8 qwords) + + // message qwords are loaded as 64-bit big-endian values + + // 4 wide round calculations + #define QROUND(i,m0,m1,m2,m3) do { \ + /* update message schedule */ \ + if (i > 2 && i < 19) m1 = _mm256_sha512msg2_epi64(_mm256_add_epi64(m1, _mm256_permute4x64_epi64(_mm256_blend_epi32(m3, m0, 3), _MM_SHUFFLE(0,3,2,1))), m0); \ + if (i > 0 && i < 17) m3 = _mm256_sha512msg1_epi64(m3, _mm256_castsi256_si128(m0)); \ + /* add round constants */ \ + __m256i tmp = _mm256_add_epi64(m0, _mm256_loadu_si256((const __m256i*)&SHA512_K[4*i])); \ + /* 4 round functions */ \ + s1 = _mm256_sha512rnds2_epi64(s1, s0, _mm256_castsi256_si128(tmp)); \ + s0 = _mm256_sha512rnds2_epi64(s0, s1, _mm256_extracti128_si256(tmp, 1)); \ + } while(0) + + const __m256i* buffer = (const __m256i*)block; + + // to byteswap when doing big-ending load for message qwords + const __m256i bswap = _mm256_broadcastsi128_si256(_mm_setr_epi8(7,6,5,4,3,2,1,0, 15,14,13,12,11,10,9,8)); + + // load initial state + __m256i abcd = _mm256_permute4x64_epi64(_mm256_loadu_si256((const __m256i*)&state[0]), _MM_SHUFFLE(0,1,2,3)); // [a,b,c,d] + __m256i efgh = _mm256_permute4x64_epi64(_mm256_loadu_si256((const __m256i*)&state[4]), _MM_SHUFFLE(0,1,2,3)); // [e,f,g,h] + + // qword order for vsha512rnds2 instruction + __m256i s0 = _mm256_permute2x128_si256(efgh, abcd, 0x31); // [a,b,e,f] + __m256i s1 = _mm256_permute2x128_si256(efgh, abcd, 0x20); // [c,d,g,h] + + do + { + // remember current state + __m256i last0 = s0; + __m256i last1 = s1; + + // load initial message schedule, 128-byte block + __m256i w0 = _mm256_shuffle_epi8(_mm256_loadu_si256(&buffer[0]), bswap); + __m256i w1 = _mm256_shuffle_epi8(_mm256_loadu_si256(&buffer[1]), bswap); + __m256i w2 = _mm256_shuffle_epi8(_mm256_loadu_si256(&buffer[2]), bswap); + __m256i w3 = _mm256_shuffle_epi8(_mm256_loadu_si256(&buffer[3]), bswap); + buffer += 4; + + QROUND( 0, w0, w1, w2, w3); + QROUND( 1, w1, w2, w3, w0); + QROUND( 2, w2, w3, w0, w1); + QROUND( 3, w3, w0, w1, w2); + + QROUND( 4, w0, w1, w2, w3); + QROUND( 5, w1, w2, w3, w0); + QROUND( 6, w2, w3, w0, w1); + QROUND( 7, w3, w0, w1, w2); + + QROUND( 8, w0, w1, w2, w3); + QROUND( 9, w1, w2, w3, w0); + QROUND(10, w2, w3, w0, w1); + QROUND(11, w3, w0, w1, w2); + + QROUND(12, w0, w1, w2, w3); + QROUND(13, w1, w2, w3, w0); + QROUND(14, w2, w3, w0, w1); + QROUND(15, w3, w0, w1, w2); + + QROUND(16, w0, w1, w2, w3); + QROUND(17, w1, w2, w3, w0); + QROUND(18, w2, w3, w0, w1); + QROUND(19, w3, w0, w1, w2); + + // update next state + s0 = _mm256_add_epi64(s0, last0); + s1 = _mm256_add_epi64(s1, last1); + } + while (--count); + + // restore qword order + abcd = _mm256_permute2x128_si256(s1, s0, 0x31); + efgh = _mm256_permute2x128_si256(s1, s0, 0x20); + + // save the new state + _mm256_storeu_si256((__m256i*)&state[0], _mm256_permute4x64_epi64(abcd, _MM_SHUFFLE(0,1,2,3))); + _mm256_storeu_si256((__m256i*)&state[4], _mm256_permute4x64_epi64(efgh, _MM_SHUFFLE(0,1,2,3))); + + #undef QROUND } #endif // defined(__x86_64__) || defined(_M_AMD64) @@ -293,153 +295,172 @@ state0 = _mm256_sha512rnds2_epi64(state0, state1, _mm256_extracti128_si256(tmp, static inline int sha512_cpuid(void) { #if defined(__ARM_FEATURE_SHA512) - int result = SHA512_CPUID_ARM64; + int result = SHA512_CPUID_ARM64; #else - static int cpuid; - - int result = cpuid; - if (result == 0) - { + static int cpuid; + + int result = cpuid; + if (result == 0) + { #if defined(_WIN32) - // no sha512 bit in IsProcessorFeaturePresent function :( - uint64_t bits; - DWORD bitsize = sizeof(bits); - RegGetValueA(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", "CP 4030", RRF_RT_QWORD | RRF_ZEROONFAILURE, NULL, &bits, &bitsize); - // bits from ID_AA64ISAR0_EL1 - int has_arm64 = ((bits >> 12) & 0xf) == 0x2; + // no sha512 bit in IsProcessorFeaturePresent function :( + uint64_t bits; + DWORD bitsize = sizeof(bits); + RegGetValueA(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", "CP 4030", RRF_RT_QWORD | RRF_ZEROONFAILURE, NULL, &bits, &bitsize); + // bits from ID_AA64ISAR0_EL1 + int has_arm64 = ((bits >> 12) & 0xf) == 0x2; #elif defined(__linux__) - unsigned long hwcap = getauxval(AT_HWCAP); - int has_arm64 = hwcap & HWCAP_SHA512; + unsigned long hwcap = getauxval(AT_HWCAP); + int has_arm64 = hwcap & HWCAP_SHA512; #elif defined(__APPLE__) - int value = 0; - size_t valuelen = sizeof(value); - int has_arm64 = sysctlbyname("hw.optional.arm.FEAT_SHA512", &value, &valuelen, NULL, 0) == 0 && value != 0; + int value = 0; + size_t valuelen = sizeof(value); + int has_arm64 = sysctlbyname("hw.optional.arm.FEAT_SHA512", &value, &valuelen, NULL, 0) == 0 && value != 0; #else #error unknown platform #endif - result |= SHA512_CPUID_INIT; - if (has_arm64) - { - result |= SHA512_CPUID_ARM64; + result |= SHA512_CPUID_INIT; + if (has_arm64) + { + result |= SHA512_CPUID_ARM64; + } + + cpuid = result; } - - cpuid = result; - } #endif - + #if defined(SHA512_CPUID_MASK) - result &= SHA512_CPUID_MASK; + result &= SHA512_CPUID_MASK; #endif - - return result; + + return result; } SHA512_TARGET static void sha512_process_arm64(uint64_t* state, const uint8_t* block, size_t count) { -#define W(i) w[(i)%8] -#define S(i) vstate.val[3-(i)%4] - -#define DROUND(i) do { \ -/* load 8 round constants */ \ -if ((i % 4) == 0) rk = vld1q_u64_x4(&SHA512_K[2*i]); \ -/* first 8 rounds reverse byte order in each 64-bit lane of input block */ \ -if (i < 8) W(i) = vreinterpretq_u64_u8(vrev64q_u8(msg[(i/4)%2].val[i%4])); \ -/* update message schedule for next rounds */ \ -if (i >= 8) W(i) = vsha512su1q_u64(vsha512su0q_u64(W(i), W(i-7)), W(i-1), vextq_u64(W(i-4), W(i-3), 1)); \ -/* add round constants */ \ -uint64x2_t tmp = vaddq_u64(W(i), rk.val[i%4]); \ -/* 2 round functions */ \ -uint64x2_t x0 = vaddq_u64(vextq_u64(tmp, tmp, 1), S(i+0)); \ -uint64x2_t x1 = vsha512hq_u64(x0, vextq_u64(S(i+1), S(i+0), 1), vextq_u64(S(i+2), S(i+1), 1)); \ -S(i+0) = vsha512h2q_u64(x1, S(i+2), S(i+3)); \ -S(i+2) = vaddq_u64(S(i+2), x1); \ -} while (0) - - // load initial state - uint64x2x4_t vstate = vld1q_u64_x4(state); - - do - { - // remember current state - uint64x2x4_t vlast = vstate; - - // load 128-byte block - uint8x16x4_t msg[2] = + #define DROUND(i, ab,cd,ef,gh, m0,m1,m2,m3,m4,m5,m6,m7) do { \ + /* update message schedule */ \ + if (i >= 8) m0 = vsha512su1q_u64(vsha512su0q_u64(m0, m1), m7, vextq_u64(m4, m5, 1)); \ + /* add round constants */ \ + uint64x2_t tmp = vaddq_u64(m0, rk.val[i%4]); \ + /* 2 round functions */ \ + uint64x2_t gf = vextq_u64(ef, gh, 1); \ + uint64x2_t ed = vextq_u64(cd, ef, 1); \ + uint64x2_t x0 = vaddq_u64(vextq_u64(tmp, tmp, 1), gh); \ + uint64x2_t x1 = vsha512hq_u64(x0, gf, ed); \ + gh = vsha512h2q_u64(x1, cd, ab); \ + cd = vaddq_u64(cd, x1); \ + } while (0) + + // load initial state + uint64x2x4_t s = vld1q_u64_x4(state); + uint64x2_t s0 = s.val[0]; // ab + uint64x2_t s1 = s.val[1]; // cd + uint64x2_t s2 = s.val[2]; // ef + uint64x2_t s3 = s.val[3]; // gh + + do { - vld1q_u8_x4(block + 0 * 16), - vld1q_u8_x4(block + 4 * 16), - }; - - uint64x2x4_t rk; - uint64x2_t w[8]; - - DROUND( 0); - DROUND( 1); - DROUND( 2); - DROUND( 3); - - DROUND( 4); - DROUND( 5); - DROUND( 6); - DROUND( 7); - - DROUND( 8); - DROUND( 9); - DROUND(10); - DROUND(11); - - DROUND(12); - DROUND(13); - DROUND(14); - DROUND(15); - - DROUND(16); - DROUND(17); - DROUND(18); - DROUND(19); - - DROUND(20); - DROUND(21); - DROUND(22); - DROUND(23); - - DROUND(24); - DROUND(25); - DROUND(26); - DROUND(27); - - DROUND(28); - DROUND(29); - DROUND(30); - DROUND(31); - - DROUND(32); - DROUND(33); - DROUND(34); - DROUND(35); - - DROUND(36); - DROUND(37); - DROUND(38); - DROUND(39); - - // update next state - vstate.val[0] = vaddq_u64(vstate.val[0], vlast.val[0]); - vstate.val[1] = vaddq_u64(vstate.val[1], vlast.val[1]); - vstate.val[2] = vaddq_u64(vstate.val[2], vlast.val[2]); - vstate.val[3] = vaddq_u64(vstate.val[3], vlast.val[3]); - - block += SHA512_BLOCK_SIZE; - } - while (--count); - - // save the new state - vst1q_u64_x4(state, vstate); - -#undef DROUND -#undef S -#undef W + // remember current state + uint64x2_t last0 = s0; + uint64x2_t last1 = s1; + uint64x2_t last2 = s2; + uint64x2_t last3 = s3; + + // load initial message schedule, 128-byte block + uint8x16x4_t msg0 = vld1q_u8_x4(block + 0 * 16); + uint8x16x4_t msg1 = vld1q_u8_x4(block + 4 * 16); + block += SHA512_BLOCK_SIZE; + + // reverse the byte order in each 64-bit lane + uint64x2_t w0 = vreinterpretq_u64_u8(vrev64q_u8(msg0.val[0])); + uint64x2_t w1 = vreinterpretq_u64_u8(vrev64q_u8(msg0.val[1])); + uint64x2_t w2 = vreinterpretq_u64_u8(vrev64q_u8(msg0.val[2])); + uint64x2_t w3 = vreinterpretq_u64_u8(vrev64q_u8(msg0.val[3])); + uint64x2_t w4 = vreinterpretq_u64_u8(vrev64q_u8(msg1.val[0])); + uint64x2_t w5 = vreinterpretq_u64_u8(vrev64q_u8(msg1.val[1])); + uint64x2_t w6 = vreinterpretq_u64_u8(vrev64q_u8(msg1.val[2])); + uint64x2_t w7 = vreinterpretq_u64_u8(vrev64q_u8(msg1.val[3])); + + uint64x2x4_t rk; + + rk = vld1q_u64_x4(&SHA512_K[0]); + DROUND( 0, s0,s1,s2,s3, w0,w1,w2,w3,w4,w5,w6,w7); + DROUND( 1, s3,s0,s1,s2, w1,w2,w3,w4,w5,w6,w7,w0); + DROUND( 2, s2,s3,s0,s1, w2,w3,w4,w5,w6,w7,w0,w1); + DROUND( 3, s1,s2,s3,s0, w3,w4,w5,w6,w7,w0,w1,w2); + + rk = vld1q_u64_x4(&SHA512_K[8]); + DROUND( 4, s0,s1,s2,s3, w4,w5,w6,w7,w0,w1,w2,w3); + DROUND( 5, s3,s0,s1,s2, w5,w6,w7,w0,w1,w2,w3,w4); + DROUND( 6, s2,s3,s0,s1, w6,w7,w0,w1,w2,w3,w4,w5); + DROUND( 7, s1,s2,s3,s0, w7,w0,w1,w2,w3,w4,w5,w6); + + rk = vld1q_u64_x4(&SHA512_K[16]); + DROUND( 8, s0,s1,s2,s3, w0,w1,w2,w3,w4,w5,w6,w7); + DROUND( 9, s3,s0,s1,s2, w1,w2,w3,w4,w5,w6,w7,w0); + DROUND(10, s2,s3,s0,s1, w2,w3,w4,w5,w6,w7,w0,w1); + DROUND(11, s1,s2,s3,s0, w3,w4,w5,w6,w7,w0,w1,w2); + + rk = vld1q_u64_x4(&SHA512_K[24]); + DROUND(12, s0,s1,s2,s3, w4,w5,w6,w7,w0,w1,w2,w3); + DROUND(13, s3,s0,s1,s2, w5,w6,w7,w0,w1,w2,w3,w4); + DROUND(14, s2,s3,s0,s1, w6,w7,w0,w1,w2,w3,w4,w5); + DROUND(15, s1,s2,s3,s0, w7,w0,w1,w2,w3,w4,w5,w6); + + rk = vld1q_u64_x4(&SHA512_K[32]); + DROUND(16, s0,s1,s2,s3, w0,w1,w2,w3,w4,w5,w6,w7); + DROUND(17, s3,s0,s1,s2, w1,w2,w3,w4,w5,w6,w7,w0); + DROUND(18, s2,s3,s0,s1, w2,w3,w4,w5,w6,w7,w0,w1); + DROUND(19, s1,s2,s3,s0, w3,w4,w5,w6,w7,w0,w1,w2); + + rk = vld1q_u64_x4(&SHA512_K[40]); + DROUND(20, s0,s1,s2,s3, w4,w5,w6,w7,w0,w1,w2,w3); + DROUND(21, s3,s0,s1,s2, w5,w6,w7,w0,w1,w2,w3,w4); + DROUND(22, s2,s3,s0,s1, w6,w7,w0,w1,w2,w3,w4,w5); + DROUND(23, s1,s2,s3,s0, w7,w0,w1,w2,w3,w4,w5,w6); + + rk = vld1q_u64_x4(&SHA512_K[48]); + DROUND(24, s0,s1,s2,s3, w0,w1,w2,w3,w4,w5,w6,w7); + DROUND(25, s3,s0,s1,s2, w1,w2,w3,w4,w5,w6,w7,w0); + DROUND(26, s2,s3,s0,s1, w2,w3,w4,w5,w6,w7,w0,w1); + DROUND(27, s1,s2,s3,s0, w3,w4,w5,w6,w7,w0,w1,w2); + + rk = vld1q_u64_x4(&SHA512_K[56]); + DROUND(28, s0,s1,s2,s3, w4,w5,w6,w7,w0,w1,w2,w3); + DROUND(29, s3,s0,s1,s2, w5,w6,w7,w0,w1,w2,w3,w4); + DROUND(30, s2,s3,s0,s1, w6,w7,w0,w1,w2,w3,w4,w5); + DROUND(31, s1,s2,s3,s0, w7,w0,w1,w2,w3,w4,w5,w6); + + rk = vld1q_u64_x4(&SHA512_K[64]); + DROUND(32, s0,s1,s2,s3, w0,w1,w2,w3,w4,w5,w6,w7); + DROUND(33, s3,s0,s1,s2, w1,w2,w3,w4,w5,w6,w7,w0); + DROUND(34, s2,s3,s0,s1, w2,w3,w4,w5,w6,w7,w0,w1); + DROUND(35, s1,s2,s3,s0, w3,w4,w5,w6,w7,w0,w1,w2); + + rk = vld1q_u64_x4(&SHA512_K[72]); + DROUND(36, s0,s1,s2,s3, w4,w5,w6,w7,w0,w1,w2,w3); + DROUND(37, s3,s0,s1,s2, w5,w6,w7,w0,w1,w2,w3,w4); + DROUND(38, s2,s3,s0,s1, w6,w7,w0,w1,w2,w3,w4,w5); + DROUND(39, s1,s2,s3,s0, w7,w0,w1,w2,w3,w4,w5,w6); + + // update next state + s0 = vaddq_u64(s0, last0); + s1 = vaddq_u64(s1, last1); + s2 = vaddq_u64(s2, last2); + s3 = vaddq_u64(s3, last3); + } + while (--count); + + // save the new state + s.val[0] = s0; + s.val[1] = s1; + s.val[2] = s2; + s.val[3] = s3; + vst1q_u64_x4(state, s); + + #undef DROUND } #endif // defined(__aarch64__) || defined(_M_ARM64) @@ -447,255 +468,264 @@ S(i+2) = vaddq_u64(S(i+2), x1); static void sha512_process(uint64_t* state, const uint8_t* block, size_t count) { #if defined(__x86_64__) || defined(_M_AMD64) - int cpuid = sha512_cpuid(); - if (cpuid & SHA512_CPUID_VSHA512) - { - sha512_process_vsha512(state, block, count); - return; - } + int cpuid = sha512_cpuid(); + if (cpuid & SHA512_CPUID_VSHA512) + { + sha512_process_vsha512(state, block, count); + return; + } #endif - + #if defined(__aarch64__) || defined(_M_ARM64) - int cpuid = sha512_cpuid(); - if (cpuid & SHA512_CPUID_ARM64) - { - sha512_process_arm64(state, block, count); - return; - } + int cpuid = sha512_cpuid(); + if (cpuid & SHA512_CPUID_ARM64) + { + sha512_process_arm64(state, block, count); + return; + } #endif - -#define Ch(x,y,z) ((x & (y ^ z)) ^ z) -#define Maj(x,y,z) ((x & y) | (z & (x | y))) - -#define BSig0(x) (SHA512_ROR64(x, 28) ^ SHA512_ROR64(x, 34) ^ SHA512_ROR64(x, 39)) -#define BSig1(x) (SHA512_ROR64(x, 14) ^ SHA512_ROR64(x, 18) ^ SHA512_ROR64(x, 41)) -#define SSig0(x) (SHA512_ROR64(x, 1) ^ SHA512_ROR64(x, 8) ^ (x >> 7)) -#define SSig1(x) (SHA512_ROR64(x, 19) ^ SHA512_ROR64(x, 61) ^ (x >> 6)) - -#define W(i) w[(i+16)%16] - -#define ROUND(i,a,b,c,d,e,f,g,h) do \ -{ \ -uint64_t w0; \ -if (i < 16) W(i) = w0 = SHA512_GET64BE(block + i*sizeof(uint64_t)); \ -if (i >= 16) W(i) = w0 = SSig1(W(i-2)) + W(i-7) + SSig0(W(i-15)) + W(i-16); \ - \ -uint64_t t1 = h + BSig1(e) + Ch(e,f,g) + SHA512_K[i] + w0; \ -uint64_t t2 = BSig0(a) + Maj(a,b,c); \ -d += t1; \ -h = t1 + t2; \ -} while (0) - - do - { - uint64_t a = state[0]; - uint64_t b = state[1]; - uint64_t c = state[2]; - uint64_t d = state[3]; - uint64_t e = state[4]; - uint64_t f = state[5]; - uint64_t g = state[6]; - uint64_t h = state[7]; - - uint64_t w[16]; - - ROUND( 0, a, b, c, d, e, f, g, h); - ROUND( 1, h, a, b, c, d, e, f, g); - ROUND( 2, g, h, a, b, c, d, e, f); - ROUND( 3, f, g, h, a, b, c, d, e); - ROUND( 4, e, f, g, h, a, b, c, d); - ROUND( 5, d, e, f, g, h, a, b, c); - ROUND( 6, c, d, e, f, g, h, a, b); - ROUND( 7, b, c, d, e, f, g, h, a); - ROUND( 8, a, b, c, d, e, f, g, h); - ROUND( 9, h, a, b, c, d, e, f, g); - ROUND(10, g, h, a, b, c, d, e, f); - ROUND(11, f, g, h, a, b, c, d, e); - ROUND(12, e, f, g, h, a, b, c, d); - ROUND(13, d, e, f, g, h, a, b, c); - ROUND(14, c, d, e, f, g, h, a, b); - ROUND(15, b, c, d, e, f, g, h, a); - ROUND(16, a, b, c, d, e, f, g, h); - ROUND(17, h, a, b, c, d, e, f, g); - ROUND(18, g, h, a, b, c, d, e, f); - ROUND(19, f, g, h, a, b, c, d, e); - ROUND(20, e, f, g, h, a, b, c, d); - ROUND(21, d, e, f, g, h, a, b, c); - ROUND(22, c, d, e, f, g, h, a, b); - ROUND(23, b, c, d, e, f, g, h, a); - ROUND(24, a, b, c, d, e, f, g, h); - ROUND(25, h, a, b, c, d, e, f, g); - ROUND(26, g, h, a, b, c, d, e, f); - ROUND(27, f, g, h, a, b, c, d, e); - ROUND(28, e, f, g, h, a, b, c, d); - ROUND(29, d, e, f, g, h, a, b, c); - ROUND(30, c, d, e, f, g, h, a, b); - ROUND(31, b, c, d, e, f, g, h, a); - ROUND(32, a, b, c, d, e, f, g, h); - ROUND(33, h, a, b, c, d, e, f, g); - ROUND(34, g, h, a, b, c, d, e, f); - ROUND(35, f, g, h, a, b, c, d, e); - ROUND(36, e, f, g, h, a, b, c, d); - ROUND(37, d, e, f, g, h, a, b, c); - ROUND(38, c, d, e, f, g, h, a, b); - ROUND(39, b, c, d, e, f, g, h, a); - ROUND(40, a, b, c, d, e, f, g, h); - ROUND(41, h, a, b, c, d, e, f, g); - ROUND(42, g, h, a, b, c, d, e, f); - ROUND(43, f, g, h, a, b, c, d, e); - ROUND(44, e, f, g, h, a, b, c, d); - ROUND(45, d, e, f, g, h, a, b, c); - ROUND(46, c, d, e, f, g, h, a, b); - ROUND(47, b, c, d, e, f, g, h, a); - ROUND(48, a, b, c, d, e, f, g, h); - ROUND(49, h, a, b, c, d, e, f, g); - ROUND(50, g, h, a, b, c, d, e, f); - ROUND(51, f, g, h, a, b, c, d, e); - ROUND(52, e, f, g, h, a, b, c, d); - ROUND(53, d, e, f, g, h, a, b, c); - ROUND(54, c, d, e, f, g, h, a, b); - ROUND(55, b, c, d, e, f, g, h, a); - ROUND(56, a, b, c, d, e, f, g, h); - ROUND(57, h, a, b, c, d, e, f, g); - ROUND(58, g, h, a, b, c, d, e, f); - ROUND(59, f, g, h, a, b, c, d, e); - ROUND(60, e, f, g, h, a, b, c, d); - ROUND(61, d, e, f, g, h, a, b, c); - ROUND(62, c, d, e, f, g, h, a, b); - ROUND(63, b, c, d, e, f, g, h, a); - ROUND(64, a, b, c, d, e, f, g, h); - ROUND(65, h, a, b, c, d, e, f, g); - ROUND(66, g, h, a, b, c, d, e, f); - ROUND(67, f, g, h, a, b, c, d, e); - ROUND(68, e, f, g, h, a, b, c, d); - ROUND(69, d, e, f, g, h, a, b, c); - ROUND(70, c, d, e, f, g, h, a, b); - ROUND(71, b, c, d, e, f, g, h, a); - ROUND(72, a, b, c, d, e, f, g, h); - ROUND(73, h, a, b, c, d, e, f, g); - ROUND(74, g, h, a, b, c, d, e, f); - ROUND(75, f, g, h, a, b, c, d, e); - ROUND(76, e, f, g, h, a, b, c, d); - ROUND(77, d, e, f, g, h, a, b, c); - ROUND(78, c, d, e, f, g, h, a, b); - ROUND(79, b, c, d, e, f, g, h, a); - - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - state[5] += f; - state[6] += g; - state[7] += h; - - block += SHA512_BLOCK_SIZE; - } - while (--count); - -#undef ROUND -#undef W -#undef Ch -#undef Maj -#undef BSig0 -#undef BSig1 -#undef SSig0 -#undef SSig1 + + #define Ch(x,y,z) ((x & (y ^ z)) ^ z) + #define Maj(x,y,z) ((x & y) | (z & (x | y))) + + #define BSig0(x) (SHA512_ROR64(x, 28) ^ SHA512_ROR64(x, 34) ^ SHA512_ROR64(x, 39)) + #define BSig1(x) (SHA512_ROR64(x, 14) ^ SHA512_ROR64(x, 18) ^ SHA512_ROR64(x, 41)) + #define SSig0(x) (SHA512_ROR64(x, 1) ^ SHA512_ROR64(x, 8) ^ (x >> 7)) + #define SSig1(x) (SHA512_ROR64(x, 19) ^ SHA512_ROR64(x, 61) ^ (x >> 6)) + + #define W(i) w[(i+16)%16] + + #define ROUND(i,a,b,c,d,e,f,g,h) do \ + { \ + uint64_t w0; \ + if (i < 16) W(i) = w0 = SHA512_GET64BE(block + i*sizeof(uint64_t)); \ + if (i >= 16) W(i) = w0 = SSig1(W(i-2)) + W(i-7) + SSig0(W(i-15)) + W(i-16); \ + \ + uint64_t t1 = h + BSig1(e) + Ch(e,f,g) + SHA512_K[i] + w0; \ + uint64_t t2 = BSig0(a) + Maj(a,b,c); \ + d += t1; \ + h = t1 + t2; \ + } while (0) + + do + { + uint64_t a = state[0]; + uint64_t b = state[1]; + uint64_t c = state[2]; + uint64_t d = state[3]; + uint64_t e = state[4]; + uint64_t f = state[5]; + uint64_t g = state[6]; + uint64_t h = state[7]; + + uint64_t w[16]; + + ROUND( 0, a, b, c, d, e, f, g, h); + ROUND( 1, h, a, b, c, d, e, f, g); + ROUND( 2, g, h, a, b, c, d, e, f); + ROUND( 3, f, g, h, a, b, c, d, e); + ROUND( 4, e, f, g, h, a, b, c, d); + ROUND( 5, d, e, f, g, h, a, b, c); + ROUND( 6, c, d, e, f, g, h, a, b); + ROUND( 7, b, c, d, e, f, g, h, a); + + ROUND( 8, a, b, c, d, e, f, g, h); + ROUND( 9, h, a, b, c, d, e, f, g); + ROUND(10, g, h, a, b, c, d, e, f); + ROUND(11, f, g, h, a, b, c, d, e); + ROUND(12, e, f, g, h, a, b, c, d); + ROUND(13, d, e, f, g, h, a, b, c); + ROUND(14, c, d, e, f, g, h, a, b); + ROUND(15, b, c, d, e, f, g, h, a); + + ROUND(16, a, b, c, d, e, f, g, h); + ROUND(17, h, a, b, c, d, e, f, g); + ROUND(18, g, h, a, b, c, d, e, f); + ROUND(19, f, g, h, a, b, c, d, e); + ROUND(20, e, f, g, h, a, b, c, d); + ROUND(21, d, e, f, g, h, a, b, c); + ROUND(22, c, d, e, f, g, h, a, b); + ROUND(23, b, c, d, e, f, g, h, a); + + ROUND(24, a, b, c, d, e, f, g, h); + ROUND(25, h, a, b, c, d, e, f, g); + ROUND(26, g, h, a, b, c, d, e, f); + ROUND(27, f, g, h, a, b, c, d, e); + ROUND(28, e, f, g, h, a, b, c, d); + ROUND(29, d, e, f, g, h, a, b, c); + ROUND(30, c, d, e, f, g, h, a, b); + ROUND(31, b, c, d, e, f, g, h, a); + + ROUND(32, a, b, c, d, e, f, g, h); + ROUND(33, h, a, b, c, d, e, f, g); + ROUND(34, g, h, a, b, c, d, e, f); + ROUND(35, f, g, h, a, b, c, d, e); + ROUND(36, e, f, g, h, a, b, c, d); + ROUND(37, d, e, f, g, h, a, b, c); + ROUND(38, c, d, e, f, g, h, a, b); + ROUND(39, b, c, d, e, f, g, h, a); + + ROUND(40, a, b, c, d, e, f, g, h); + ROUND(41, h, a, b, c, d, e, f, g); + ROUND(42, g, h, a, b, c, d, e, f); + ROUND(43, f, g, h, a, b, c, d, e); + ROUND(44, e, f, g, h, a, b, c, d); + ROUND(45, d, e, f, g, h, a, b, c); + ROUND(46, c, d, e, f, g, h, a, b); + ROUND(47, b, c, d, e, f, g, h, a); + + ROUND(48, a, b, c, d, e, f, g, h); + ROUND(49, h, a, b, c, d, e, f, g); + ROUND(50, g, h, a, b, c, d, e, f); + ROUND(51, f, g, h, a, b, c, d, e); + ROUND(52, e, f, g, h, a, b, c, d); + ROUND(53, d, e, f, g, h, a, b, c); + ROUND(54, c, d, e, f, g, h, a, b); + ROUND(55, b, c, d, e, f, g, h, a); + + ROUND(56, a, b, c, d, e, f, g, h); + ROUND(57, h, a, b, c, d, e, f, g); + ROUND(58, g, h, a, b, c, d, e, f); + ROUND(59, f, g, h, a, b, c, d, e); + ROUND(60, e, f, g, h, a, b, c, d); + ROUND(61, d, e, f, g, h, a, b, c); + ROUND(62, c, d, e, f, g, h, a, b); + ROUND(63, b, c, d, e, f, g, h, a); + + ROUND(64, a, b, c, d, e, f, g, h); + ROUND(65, h, a, b, c, d, e, f, g); + ROUND(66, g, h, a, b, c, d, e, f); + ROUND(67, f, g, h, a, b, c, d, e); + ROUND(68, e, f, g, h, a, b, c, d); + ROUND(69, d, e, f, g, h, a, b, c); + ROUND(70, c, d, e, f, g, h, a, b); + ROUND(71, b, c, d, e, f, g, h, a); + + ROUND(72, a, b, c, d, e, f, g, h); + ROUND(73, h, a, b, c, d, e, f, g); + ROUND(74, g, h, a, b, c, d, e, f); + ROUND(75, f, g, h, a, b, c, d, e); + ROUND(76, e, f, g, h, a, b, c, d); + ROUND(77, d, e, f, g, h, a, b, c); + ROUND(78, c, d, e, f, g, h, a, b); + ROUND(79, b, c, d, e, f, g, h, a); + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; + + block += SHA512_BLOCK_SIZE; + } + while (--count); + + #undef ROUND + #undef W + #undef Ch + #undef Maj + #undef BSig0 + #undef BSig1 + #undef SSig0 + #undef SSig1 } void sha512_init(sha512_ctx* ctx) { - ctx->count[0] = 0; - ctx->count[1] = 0; - ctx->state[0] = 0x6a09e667f3bcc908; - ctx->state[1] = 0xbb67ae8584caa73b; - ctx->state[2] = 0x3c6ef372fe94f82b; - ctx->state[3] = 0xa54ff53a5f1d36f1; - ctx->state[4] = 0x510e527fade682d1; - ctx->state[5] = 0x9b05688c2b3e6c1f; - ctx->state[6] = 0x1f83d9abfb41bd6b; - ctx->state[7] = 0x5be0cd19137e2179; + ctx->count[0] = 0; + ctx->count[1] = 0; + ctx->state[0] = 0x6a09e667f3bcc908; + ctx->state[1] = 0xbb67ae8584caa73b; + ctx->state[2] = 0x3c6ef372fe94f82b; + ctx->state[3] = 0xa54ff53a5f1d36f1; + ctx->state[4] = 0x510e527fade682d1; + ctx->state[5] = 0x9b05688c2b3e6c1f; + ctx->state[6] = 0x1f83d9abfb41bd6b; + ctx->state[7] = 0x5be0cd19137e2179; } void sha512_update(sha512_ctx* ctx, const void* data, size_t size) { - const uint8_t* buffer = (const uint8_t*)data; - - size_t pending = ctx->count[0] % SHA512_BLOCK_SIZE; - ctx->count[0] += size; - ctx->count[1] += size > ctx->count[0]; - - size_t available = SHA512_BLOCK_SIZE - pending; - if (pending && size >= available) - { - memcpy(ctx->buffer + pending, buffer, available); - sha512_process(ctx->state, ctx->buffer, 1); - buffer += available; - size -= available; - pending = 0; - } - - size_t count = size / SHA512_BLOCK_SIZE; - if (count) - { - sha512_process(ctx->state, buffer, count); - buffer += count * SHA512_BLOCK_SIZE; - size -= count * SHA512_BLOCK_SIZE; - } - - memcpy(ctx->buffer + pending, buffer, size); + const uint8_t* buffer = (const uint8_t*)data; + + size_t pending = ctx->count[0] % SHA512_BLOCK_SIZE; + ctx->count[0] += size; + ctx->count[1] += size > ctx->count[0]; + + size_t available = SHA512_BLOCK_SIZE - pending; + if (pending && size >= available) + { + memcpy(ctx->buffer + pending, buffer, available); + sha512_process(ctx->state, ctx->buffer, 1); + buffer += available; + size -= available; + pending = 0; + } + + size_t count = size / SHA512_BLOCK_SIZE; + if (count) + { + sha512_process(ctx->state, buffer, count); + buffer += count * SHA512_BLOCK_SIZE; + size -= count * SHA512_BLOCK_SIZE; + } + + memcpy(ctx->buffer + pending, buffer, size); } void sha512_finish(sha512_ctx* ctx, uint8_t digest[SHA512_DIGEST_SIZE]) { - uint64_t count0 = ctx->count[0]; - uint64_t count1 = ctx->count[1]; - uint64_t bitcount[2] = { (count0 << 3), (count1 << 3) | (count0 >> 61) }; - - size_t pending = count0 % SHA512_BLOCK_SIZE; - size_t blocks = pending < SHA512_BLOCK_SIZE - sizeof(bitcount) ? 1 : 2; - - ctx->buffer[pending++] = 0x80; - - uint8_t padding[2 * SHA512_BLOCK_SIZE]; - memcpy(padding, ctx->buffer, SHA512_BLOCK_SIZE); - memset(padding + pending, 0, SHA512_BLOCK_SIZE); - SHA512_SET64BE(padding + blocks * SHA512_BLOCK_SIZE - 2*sizeof(uint64_t), bitcount[1]); - SHA512_SET64BE(padding + blocks * SHA512_BLOCK_SIZE - 1*sizeof(uint64_t), bitcount[0]); - - sha512_process(ctx->state, padding, blocks); - - for (size_t i=0; i<8; i++) - { - SHA512_SET64BE(digest + i*sizeof(uint64_t), ctx->state[i]); - } + uint64_t count0 = ctx->count[0]; + uint64_t count1 = ctx->count[1]; + uint64_t bitcount[2] = { (count0 << 3), (count1 << 3) | (count0 >> 61) }; + + size_t pending = count0 % SHA512_BLOCK_SIZE; + size_t blocks = pending < SHA512_BLOCK_SIZE - sizeof(bitcount) ? 1 : 2; + + ctx->buffer[pending++] = 0x80; + + uint8_t padding[2 * SHA512_BLOCK_SIZE]; + memcpy(padding, ctx->buffer, SHA512_BLOCK_SIZE); + memset(padding + pending, 0, SHA512_BLOCK_SIZE); + SHA512_SET64BE(padding + blocks * SHA512_BLOCK_SIZE - 2*sizeof(uint64_t), bitcount[1]); + SHA512_SET64BE(padding + blocks * SHA512_BLOCK_SIZE - 1*sizeof(uint64_t), bitcount[0]); + + sha512_process(ctx->state, padding, blocks); + + for (size_t i=0; i<8; i++) + { + SHA512_SET64BE(digest + i*sizeof(uint64_t), ctx->state[i]); + } } void sha384_init(sha384_ctx* ctx) { - ctx->count[0] = 0; - ctx->count[1] = 0; - ctx->state[0] = 0xcbbb9d5dc1059ed8; - ctx->state[1] = 0x629a292a367cd507; - ctx->state[2] = 0x9159015a3070dd17; - ctx->state[3] = 0x152fecd8f70e5939; - ctx->state[4] = 0x67332667ffc00b31; - ctx->state[5] = 0x8eb44a8768581511; - ctx->state[6] = 0xdb0c2e0d64f98fa7; - ctx->state[7] = 0x47b5481dbefa4fa4; + ctx->count[0] = 0; + ctx->count[1] = 0; + ctx->state[0] = 0xcbbb9d5dc1059ed8; + ctx->state[1] = 0x629a292a367cd507; + ctx->state[2] = 0x9159015a3070dd17; + ctx->state[3] = 0x152fecd8f70e5939; + ctx->state[4] = 0x67332667ffc00b31; + ctx->state[5] = 0x8eb44a8768581511; + ctx->state[6] = 0xdb0c2e0d64f98fa7; + ctx->state[7] = 0x47b5481dbefa4fa4; } void sha384_update(sha512_ctx* ctx, const void* data, size_t size) { - sha512_update(ctx, data, size); + sha512_update(ctx, data, size); } void sha384_finish(sha384_ctx* ctx, uint8_t digest[SHA384_DIGEST_SIZE]) { - uint8_t temp[SHA512_DIGEST_SIZE]; - sha512_finish(ctx, temp); - - memcpy(digest, temp, SHA384_DIGEST_SIZE); + uint8_t temp[SHA512_DIGEST_SIZE]; + sha512_finish(ctx, temp); + + memcpy(digest, temp, SHA384_DIGEST_SIZE); } #if defined(__clang__) From a82cba0c87239067af7b46c75279d49b9f55fcea Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 19 Nov 2025 11:24:11 -0800 Subject: [PATCH 074/850] cache env strings on startup --- src/os/core/linux/os_core_linux.c | 18 ++++++++++++++++-- src/os/core/linux/os_core_linux.h | 2 ++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 13d6bacb..de752de3 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -811,7 +811,7 @@ os_process_launch(OS_ProcessLaunchParams *params) char **envp = 0; if(params->inherit_env) { - envp = __environ; + envp = os_lnx_state.default_env; } else { @@ -1443,7 +1443,7 @@ lnx_signal_handler(int sig, siginfo_t *info, void *arg) } fprintf(stderr, "\nVersion: %s%s\n\n", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); - _exit(0); + _exit(1); } int @@ -1485,6 +1485,20 @@ main(int argc, char **argv) os_lnx_state.arena = arena_alloc(); os_lnx_state.entity_arena = arena_alloc(); pthread_mutex_init(&os_lnx_state.entity_mutex, 0); + + // cache default environment + { + U64 env_count = 0; + for(; __environ[env_count] != 0; env_count += 1) {} + char **default_env = push_array(os_lnx_state.arena, char *, env_count+1); + for EachIndex(i, env_count) + { + default_env[i] = (char *)str8_copy(os_lnx_state.arena, str8_cstring(__environ[i])).str; + } + default_env[env_count] = 0; + os_lnx_state.default_env_count = env_count; + os_lnx_state.default_env = default_env; + } //- rjf: grab dynamically allocated system info { diff --git a/src/os/core/linux/os_core_linux.h b/src/os/core/linux/os_core_linux.h index d7301e78..b80f1ab3 100644 --- a/src/os/core/linux/os_core_linux.h +++ b/src/os/core/linux/os_core_linux.h @@ -110,6 +110,8 @@ struct OS_LNX_State pthread_mutex_t entity_mutex; Arena *entity_arena; OS_LNX_Entity *entity_free; + U64 default_env_count; + char **default_env; }; //////////////////////////////// From e0d0cf6e2909d815852aaf13698519c8fa6e4936 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 19 Nov 2025 11:24:36 -0800 Subject: [PATCH 075/850] helper marco for dealing with syscalls that are interrupted --- src/os/core/linux/os_core_linux.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/os/core/linux/os_core_linux.h b/src/os/core/linux/os_core_linux.h index b80f1ab3..d18a2a7e 100644 --- a/src/os/core/linux/os_core_linux.h +++ b/src/os/core/linux/os_core_linux.h @@ -38,6 +38,17 @@ int pthread_getname_np(pthread_t thread, char *name, size_t size); typedef struct tm tm; typedef struct timespec timespec; +//////////////////////////////// + +#define OS_LNX_RETRY_ON_EINTR(expr) \ + (__extension__({ \ + __typeof__(expr) __ret; \ + do { \ + __ret = (expr); \ + } while ((__ret == -1) && errno == EINTR); \ + __ret; \ + })) + //////////////////////////////// //~ rjf: File Iterator From 597ea44337bc8ec46c1183e6a289d8f97aa48a41 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 19 Nov 2025 11:25:54 -0800 Subject: [PATCH 076/850] handle empty hash table case --- src/linker/hash_table.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index 58c9daea..25cc5c9f 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -162,13 +162,21 @@ hash_table_push_path_raw(Arena *arena, HashTable *ht, String8 path, void *value) //////////////////////////////// +internal BucketNode * +hash_table_bucket_from_hash(HashTable *ht, U64 hash) +{ + BucketNode *bucket = 0; + if (ht->cap > 0) { + bucket = ht->buckets[hash % ht->cap].first; + } + return bucket; +} + internal BucketNode * hash_table_search_string(HashTable *ht, String8 key_string) { - U64 hash = hash_table_hasher(key_string); - U64 ibucket = hash % ht->cap; - BucketList *bucket = ht->buckets + ibucket; - for (BucketNode *n = bucket->first; n != 0; n = n->next) { + BucketNode *bucket = hash_table_bucket_from_hash(ht, hash_table_hasher(key_string)); + for EachNode(n, BucketNode, bucket) { if (str8_match(n->v.key_string, key_string, 0)) { return n; } @@ -179,10 +187,8 @@ hash_table_search_string(HashTable *ht, String8 key_string) internal BucketNode * hash_table_search_u32(HashTable *ht, U32 key_u32) { - U64 hash = hash_table_hasher(str8_struct(&key_u32)); - U64 ibucket = hash % ht->cap; - BucketList *bucket = ht->buckets + ibucket; - for (BucketNode *n = bucket->first; n != 0; n = n->next) { + BucketNode *bucket = hash_table_bucket_from_hash(ht, hash_table_hasher(str8_struct(&key_u32))); + for EachNode(n, BucketNode, bucket) { if (n->v.key_u32 == key_u32) { return n; } @@ -193,10 +199,8 @@ hash_table_search_u32(HashTable *ht, U32 key_u32) internal BucketNode * hash_table_search_u64(HashTable *ht, U64 key_u64) { - U64 hash = hash_table_hasher(str8_struct(&key_u64)); - U64 ibucket = hash % ht->cap; - BucketList *bucket = ht->buckets + ibucket; - for (BucketNode *n = bucket->first; n != 0; n = n->next) { + BucketNode *bucket = hash_table_bucket_from_hash(ht, hash_table_hasher(str8_struct(&key_u64))); + for EachNode(n, BucketNode, bucket) { if (n->v.key_u64 == key_u64) { return n; } @@ -219,10 +223,8 @@ hash_table_search_path(HashTable *ht, String8 path) internal BucketNode * hash_table_search_raw(HashTable *ht, void *key) { - U64 hash = hash_table_hasher(str8_struct(&key)); - U64 ibucket = hash % ht->cap; - BucketList *bucket = ht->buckets + ibucket; - for (BucketNode *n = bucket->first; n != 0; n = n->next) { + BucketNode *bucket = hash_table_bucket_from_hash(ht, hash_table_hasher(str8_struct(&key))); + for EachNode(n, BucketNode, bucket) { if (n->v.key_raw == key) { return n; } From b7fb4fe04d7b5d3d2035330beb7bad4c7715c2f4 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 19 Nov 2025 11:38:22 -0800 Subject: [PATCH 077/850] WIP improved signal handling in multi-threaded programs --- src/demon/demon_core.c | 12 + src/demon/demon_core.h | 5 +- src/demon/linux/demon_core_linux.c | 2689 ++++++++++++++-------------- src/demon/linux/demon_core_linux.h | 159 +- 4 files changed, 1472 insertions(+), 1393 deletions(-) diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index bba2dc69..401480a7 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -206,3 +206,15 @@ dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange) } return buffer; } + +internal String8 +dmn_get_trap_inst(void) +{ +#if ARCH_X64 + local_persist U8 inst[] = { 0xcc }; +#else +# error "trap instruction is not defined for this arch" +#endif + return str8_array_fixed(inst); +} + diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index ccdf6bef..f0b4ce54 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -142,7 +142,7 @@ typedef struct DMN_ActiveTrap DMN_ActiveTrap; struct DMN_ActiveTrap { DMN_Trap *trap; - U8 swap_byte; + String8 swap_bytes; DMN_ActiveTrap *next; }; @@ -262,4 +262,7 @@ internal void dmn_process_iter_begin(DMN_ProcessIter *iter); internal B32 dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out); internal void dmn_process_iter_end(DMN_ProcessIter *iter); +//- arch trap +internal String8 dmn_get_trap_inst(void); + #endif // DEMON_CORE_H diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 3d1631a0..5683c239 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -14,6 +14,30 @@ dmn_lnx_entity_list_push(Arena *arena, DMN_LNX_EntityList *list, DMN_LNX_Entity return n; } +internal void +dmn_lnx_process_launch_list_push_node(DMN_LNX_ProcessLaunchList *list, DMN_LNX_ProcessLaunch *n) +{ + DLLPushBack(list->first, list->last, n); + list->count += 1; +} + +internal DMN_LNX_ProcessLaunch * +dmn_lnx_process_launch_list_push(Arena *arena, DMN_LNX_ProcessLaunchList *list, pid_t pid) +{ + DMN_LNX_ProcessLaunch *n = push_array(arena, DMN_LNX_ProcessLaunch, 1); + n->pid = pid; + dmn_lnx_process_launch_list_push_node(list, n); + return n; +} + +internal void +dmn_lnx_process_launch_list_remove(DMN_LNX_ProcessLaunchList *list, DMN_LNX_ProcessLaunch *n) +{ + Assert(list->count > 0); + DLLRemove(list->first, list->last, n); + list->count -= 1; +} + //- rjf: file descriptor memory reading/writing helpers internal U64 @@ -23,13 +47,8 @@ dmn_lnx_size_from_fd(int memory_fd, U64 cap) size_t cursor = 0; while(cursor < cap) { - ssize_t actual_read = pread(memory_fd, temp, sizeof(temp), cursor); - if(actual_read < 0) - { - if(errno == EINTR) { continue; } - break; - } - if(actual_read == 0) { break; } + ssize_t actual_read = OS_LNX_RETRY_ON_EINTR(pread(memory_fd, temp, sizeof(temp), cursor)); + if(actual_read <= 0) { break; } cursor += (U64)actual_read; } return (U64)cursor; @@ -42,38 +61,27 @@ dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst) while(cursor < size) { size_t to_read = size - cursor; - ssize_t actual_read = pread(memory_fd, (U8 *)dst + cursor, to_read, range.min + cursor); - if(actual_read < 0) - { - if(errno == EINTR) { continue; } - break; - } + ssize_t actual_read = OS_LNX_RETRY_ON_EINTR(pread(memory_fd, (U8 *)dst + cursor, to_read, range.min + cursor)); + if(actual_read < 0) { break; } if(actual_read == 0) { break; } cursor += actual_read; } - return (U64)cursor; + return cursor; } internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src) { - B32 result = 1; - U8 *ptr = (U8 *)src; - U8 *opl = ptr + dim_1u64(range); - U64 cursor = range.min; - for(;ptr < opl;) + size_t cursor = 0, size = dim_1u64(range); + while(cursor < size) { - size_t to_write = (size_t)(opl - ptr); - ssize_t actual_write = pwrite(memory_fd, ptr, to_write, cursor); - if(actual_write == -1) - { - result = 0; - break; - } - ptr += actual_write; + size_t to_write = size - cursor; + ssize_t actual_write = OS_LNX_RETRY_ON_EINTR(pwrite(memory_fd, (U8 *)src + cursor, to_write, range.min + cursor)); + if(actual_write <= 0) { break; } cursor += actual_write; } - return result; + B32 is_written = (cursor == size); + return is_written; } internal String8 @@ -84,7 +92,7 @@ dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_ for(U64 vaddr = base_vaddr; string_size < cap_size; vaddr += 1, string_size += 1) { char byte = 0; - if(pread(memory_fd, &byte, sizeof(byte), vaddr) == 0) + if(OS_LNX_RETRY_ON_EINTR(pread(memory_fd, &byte, sizeof(byte), vaddr) <= 0)) { break; } @@ -96,7 +104,7 @@ dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_ if(string_size != 0) { char *buf = push_array_no_zero(arena, char, string_size+1); - pread(memory_fd, buf, string_size, base_vaddr); + OS_LNX_RETRY_ON_EINTR(pread(memory_fd, buf, string_size, base_vaddr)); buf[string_size] = '\0'; result = str8((U8 *)buf, string_size); } @@ -124,21 +132,21 @@ dmn_lnx_read_ehdr(int memory_fd, U64 addr, ELF_Hdr64 *ehdr_out) { switch(e_ident[ELF_Identifier_Class]) { - default:{InvalidPath;}break; - case ELF_Class_None: {}break; - case ELF_Class_32: + default:{InvalidPath;}break; + case ELF_Class_None: {}break; + case ELF_Class_32: + { + ELF_Hdr32 ehdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &ehdr32)) { - ELF_Hdr32 ehdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &ehdr32)) - { - *ehdr_out = elf_hdr64_from_hdr32(ehdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, ehdr_out); - }break; + *ehdr_out = elf_hdr64_from_hdr32(ehdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, ehdr_out); + }break; } } } @@ -151,21 +159,21 @@ dmn_lnx_read_phdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr B32 is_read = 0; switch (elf_class) { - case ELF_Class_None: break; - case ELF_Class_32: + case ELF_Class_None: break; + case ELF_Class_32: + { + ELF_Phdr32 phdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &phdr32)) { - ELF_Phdr32 phdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &phdr32)) - { - *phdr_out = elf_phdr64_from_phdr32(phdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, phdr_out); - }break; - default:{NotImplemented;}break; + *phdr_out = elf_phdr64_from_phdr32(phdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, phdr_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -176,21 +184,21 @@ dmn_lnx_read_shdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr B32 is_read = 0; switch (elf_class) { - case ELF_Class_None: break; - case ELF_Class_32: + case ELF_Class_None: break; + case ELF_Class_32: + { + ELF_Shdr32 shdr32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &shdr32)) { - ELF_Shdr32 shdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &shdr32)) - { - *shdr_out = elf_shdr64_from_shdr32(shdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, shdr_out); - }break; - default:{NotImplemented;}break; + *shdr_out = elf_shdr64_from_shdr32(shdr32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, shdr_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -201,22 +209,21 @@ dmn_lnx_read_linkmap(int memory_fd, U64 addr, ELF_Class elf_class, GNU_LinkMap64 B32 is_read = 0; switch(elf_class) { - case ELF_Class_None: {}break; - case ELF_Class_32: + case ELF_Class_None: {}break; + case ELF_Class_32: + { + GNU_LinkMap32 linkmap32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &linkmap32)) { - // TODO(rjf): endianness - GNU_LinkMap32 linkmap32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &linkmap32)) - { - *linkmap_out = gnu_linkmap64_from_linkmap32(linkmap32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, linkmap_out); - }break; - default:{NotImplemented;}break; + *linkmap_out = gnu_linkmap64_from_linkmap32(linkmap32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, linkmap_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -227,21 +234,21 @@ dmn_lnx_read_dynamic(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dy B32 is_read = 0; switch(elf_class) { - case ELF_Class_None:{}break; - case ELF_Class_32: + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Dyn32 dyn32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &dyn32)) { - ELF_Dyn32 dyn32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &dyn32)) - { - *dyn_out = elf_dyn64_from_dyn32(dyn32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, dyn_out); - }break; - default:{NotImplemented;}break; + *dyn_out = elf_dyn64_from_dyn32(dyn32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, dyn_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -252,21 +259,21 @@ dmn_lnx_read_symbol(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Sym64 *sym B32 is_read = 0; switch(elf_class) { - case ELF_Class_None:{}break; - case ELF_Class_32: + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Sym32 symbol32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &symbol32)) { - ELF_Sym32 symbol32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &symbol32)) - { - *symbol_out = elf_sym64_from_sym32(symbol32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, symbol_out); - }break; - default:{NotImplemented;}break; + *symbol_out = elf_sym64_from_sym32(symbol32); + is_read = 1; + } + }break; + case ELF_Class_64: + { + is_read = dmn_lnx_read_struct(memory_fd, addr, symbol_out); + }break; + default:{NotImplemented;}break; } return is_read; } @@ -277,20 +284,20 @@ dmn_lnx_read_r_debug(int memory_fd, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebu B32 is_read = 0; switch(gnu_rdebug_info_size_from_arch(arch)) { - case 0: {} break; - case sizeof(GNU_RDebugInfo32): { - GNU_RDebugInfo32 rdebug32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &rdebug32)) - { - *rdebug_out = gnu_rdebug_info64_from_rdebug_info32(rdebug32); - is_read = 1; - } - }break; - case sizeof(GNU_RDebugInfo64): + case 0: {} break; + case sizeof(GNU_RDebugInfo32): { + GNU_RDebugInfo32 rdebug32 = {0}; + if(dmn_lnx_read_struct(memory_fd, addr, &rdebug32)) { - is_read = dmn_lnx_read_struct(memory_fd, addr, rdebug_out); - }break; - default:{InvalidPath;}break; + *rdebug_out = gnu_rdebug_info64_from_rdebug_info32(rdebug32); + is_read = 1; + } + }break; + case sizeof(GNU_RDebugInfo64): + { + is_read = dmn_lnx_read_struct(memory_fd, addr, rdebug_out); + }break; + default:{InvalidPath;}break; } Assert(is_read); return is_read; @@ -310,14 +317,14 @@ dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) { U8 *buffer = push_array(arena, U8, cap); readlink_result = readlink((char *)exe_link_path.str, (char *)buffer, cap); - + if(readlink_result < 0) { break; } - + str8_list_push(scratch.arena, &parts, str8(buffer, readlink_result)); - + if(readlink_result < cap) { break; @@ -338,7 +345,7 @@ dmn_lnx_ehdr_from_pid(pid_t pid) String8 exe_path = dmn_lnx_exe_path_from_pid(scratch.arena, pid); if(exe_path.size != 0) { - int exe_fd = open((char *)exe_path.str, O_RDONLY|O_CLOEXEC); + int exe_fd = OS_LNX_RETRY_ON_EINTR(open((char *)exe_path.str, O_RDONLY)); if(exe_fd != -1) { is_read = dmn_lnx_read_ehdr(exe_fd, 0, &exe); @@ -358,7 +365,7 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) // rjf: open aux data String8 auxv_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int auxv_fd = open((char*)auxv_path.str, O_RDONLY|O_CLOEXEC); + int auxv_fd = OS_LNX_RETRY_ON_EINTR(open((char*)auxv_path.str, O_RDONLY)); // rjf: scan aux data if(auxv_fd >= 0) @@ -369,24 +376,18 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) ELF_Auxv64 auxv = {0}; switch(elf_class) { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Auxv32 auxv32 = {0}; - if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) - { - goto brkloop; - } - auxv = elf_auxv64_from_auxv32(auxv32); - }break; - case ELF_Class_64: - { - if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) - { - goto brkloop; - } - }break; - default:{NotImplemented;}break; + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Auxv32 auxv32 = {0}; + if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) { goto brkloop; } + auxv = elf_auxv64_from_auxv32(auxv32); + }break; + case ELF_Class_64: + { + if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) { goto brkloop; } + }break; + default:{NotImplemented;}break; } // rjf: fill result @@ -425,7 +426,7 @@ dmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U6 { Assert(0 && "unable to read a program header"); } - + // rjf: save switch(phdr.p_type) { @@ -456,10 +457,10 @@ dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, // rjf: read next dyn entry ELF_Dyn64 dyn = {0}; if(!dmn_lnx_read_dynamic(memory_fd, dynamic_cursor, elf_class, &dyn)) { Assert(0 && "unable to read dynamic"); } - + // rjf: break on zero if(dyn.tag == ELF_DynTag_Null) { break; } - + // extract reuiqred values out of dynamic section if(dyn.tag == ELF_DynTag_Strtab) { @@ -493,35 +494,35 @@ internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) { Temp scratch = scratch_begin(0, 0); - + U64 rdebug_vaddr = 0; - + // load DL's header ELF_Hdr64 ehdr = {0}; if(!dmn_lnx_read_ehdr(memory_fd, loader_vbase, &ehdr)) { Assert(0 && "failed to read interp's header"); goto exit; } - + U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; - + // find dynamic program header U64 dynamic_vaddr = max_U64; for EachIndex(phdr_idx, ehdr.e_phnum) { U64 phdr_vaddr = loader_vbase + ehdr.e_phoff + phdr_idx * ehdr.e_phentsize; - + ELF_Phdr64 phdr = {0}; if(!dmn_lnx_read_phdr(memory_fd, phdr_vaddr, elf_class, &phdr)) { Assert(0 && "failed to read program header"); goto exit; } - + if(phdr.p_type == ELF_PType_Dynamic) { dynamic_vaddr = rebase + phdr.p_offset; break; } } - + // extract necessary info out of dynamic program header DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, rebase, dynamic_vaddr); - + // extract symbol table count from available options U64 symbol_count = 0; if(dynamic_info.hash_vaddr) @@ -531,7 +532,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) { hash_entry_size = 8; } - + U64 chain_count = 0; if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) { @@ -547,7 +548,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) // TODO: extract count from GNU_HASH NotImplemented; } - + // scan symbol table for the rendezvous symbol if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) { @@ -559,16 +560,16 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) Assert(0 && "failed to read symbol table"); break; } - + Temp temp = temp_begin(scratch.arena); - + String8 symbol_name = {0}; if(symbol.st_name < dynamic_info.strtab_size) { U64 cap = dynamic_info.strtab_size - symbol.st_name; symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); } - + if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) { ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info); @@ -578,16 +579,87 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) break; } } - + temp_end(temp); } } - exit:; +exit:; scratch_end(scratch); return rdebug_vaddr; } +internal String8 +dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8 dl_path = {0}; + + int maps_fd = open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY); + if(maps_fd != -1) + { + // read entire /proc/pid/maps + U64 maps_size = dmn_lnx_size_from_fd(maps_fd, MB(1)); + U8 *maps_ptr = push_array(scratch.arena, U8, maps_size); + U64 read_size = dmn_lnx_read(maps_fd, r1u64(0, maps_size), maps_ptr); + + // split map file on lines + String8List lines = str8_split_by_string_chars(scratch.arena, str8(maps_ptr, maps_size), str8_lit("\n"), 0); + + // scan each line until a virtual mapping whose low part matches the DL base address is found + for EachNode(n, String8Node, lines.first) + { + String8 line = n->string; + + // split the string while respecting escape sequences + String8List parts = {0}; + for EachIndex(cursor, line.size) + { + if(line.str[cursor] == ' ') { continue; } + + // scan forward to the closing delimiter + U64 token_start = cursor; + for(; cursor < line.size; cursor += 1) + { + if(line.str[cursor] == '\\') + { + cursor += 1; + continue; + } + if(line.str[cursor] == ' ') { break; } + } + + // push sub-string to the list + str8_list_push(scratch.arena, &parts, str8_substr(line, r1u64(token_start, cursor))); + } + + // was line parsed correctly? + if(parts.node_count > 6 || parts.node_count < 5) { Assert(0 && "failed to parse map line"); continue; } + + // parse map virtual range + String8List vaddr_list = str8_split_by_string_chars(scratch.arena, parts.first->string, str8_lit("-"), 0); + if(vaddr_list.node_count != 2) { Assert(0 && "failed to parse virtual range portion of map line"); continue; } + + // does the low part match DL base address? + U64 lo_vaddr = u64_from_str8(vaddr_list.first->string, 16); + if(lo_vaddr == auxv_base) + { + dl_path = parts.node_count == 5 ? str8_zero() : parts.last->string; + dl_path = push_str8_copy(arena, dl_path); + break; + } + } + + close(maps_fd); + } + else { Assert(0 && "failed to open DL fd"); } + + scratch_end(scratch); + Assert(dl_path.size); + return dl_path; +} + //////////////////////////////// //~ SDT Probes @@ -595,33 +667,33 @@ internal DMN_LNX_ProbeList dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) { Temp scratch = scratch_begin(&arena, 1); - + DMN_LNX_ProbeList probes = {0}; - + ELF_Hdr64 ehdr = {0}; if(!dmn_lnx_read_ehdr(fd, offset, &ehdr)) { goto exit; } - + U64 strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize; ELF_Shdr64 strtab_shdr = {0}; if(!dmn_lnx_read_shdr(fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr)) { goto exit; } - + B32 found_probes = 0; B32 found_probes_base = 0; ELF_Shdr64 text_shdr = {0}; ELF_Shdr64 stapsdt_base_shdr = {0}; ELF_Shdr64 stapsdt_shdr = {0}; for(U64 shdr_off = offset + ehdr.e_shoff, shdr_opl = shdr_off + ehdr.e_shentsize * ehdr.e_shnum; - shdr_off < shdr_opl; - shdr_off += ehdr.e_shentsize) { + shdr_off < shdr_opl; + shdr_off += ehdr.e_shentsize) { ELF_Shdr64 shdr = {0}; if(!dmn_lnx_read_shdr(fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr)) { goto exit; } - + if(shdr.sh_type == ELF_ShType_Note) { U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); - + if(str8_match(name, str8_lit(".note.stapsdt"), 0)) { stapsdt_shdr = shdr; @@ -633,7 +705,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); - + if(str8_match(name, str8_lit(".stapsdt.base"), 0)) { stapsdt_base_shdr = shdr; @@ -643,76 +715,76 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) text_shdr = shdr; } } - + if(found_probes && found_probes_base) { break; } } - + if(!found_probes || !found_probes_base) { goto exit; } - + U64 probes_base = stapsdt_base_shdr.sh_addr; Rng1U64 note_range = shift_1u64(r1u64(stapsdt_shdr.sh_offset, stapsdt_shdr.sh_offset + stapsdt_shdr.sh_size), offset); void *raw_note = push_array(arena, U8, stapsdt_shdr.sh_size); U64 note_read_size = dmn_lnx_read(fd, note_range, raw_note); if(note_read_size != dim_1u64(note_range)) { goto exit; } - + Arch arch = arch_from_elf_machine(ehdr.e_machine); ELF_NoteList note = elf_parse_note(scratch.arena, str8(raw_note, dim_1u64(note_range)), ehdr.e_ident[ELF_Identifier_Class], ehdr.e_machine); - + for EachNode(n, ELF_NoteNode, note.first) { ELF_Note *note = &n->v; if(!str8_match(note->owner, str8_lit("stapsdt"), 0)) { continue; } if(note->type != ELF_NoteType_STapSdt) { continue; } - + DMN_LNX_Probe probe = {0}; { U64 cursor = 0; U64 addr_size = ehdr.e_ident[ELF_Identifier_Class] == ELF_Class_64 ? 8 : 4; - + U64 pc = 0; U64 pc_size = str8_deserial_read(note->desc, cursor, &pc, addr_size, addr_size); if (pc_size == 0) { goto exit; } cursor += pc_size; - + U64 base_addr = 0; U64 base_addr_size = str8_deserial_read(note->desc, cursor, &base_addr, addr_size, addr_size); if (base_addr_size == 0) { goto exit; } cursor += base_addr_size; - + U64 semaphore = 0; U64 semaphore_size = str8_deserial_read(note->desc, cursor, &semaphore, addr_size, addr_size); if (semaphore_size == 0) { goto exit; } cursor += semaphore_size; - + String8 provider = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += provider.size + 1; if (cursor > note->desc.size) { goto exit; } - + String8 name = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += name.size + 1; if (cursor > note->desc.size) { goto exit; } - + String8 args = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += args.size + 1; if (cursor > note->desc.size) { goto exit; } - + U64 probe_rebase = image_base + (base_addr - probes_base); - + probe.provider = provider; probe.name = name; probe.args = stap_arg_array_from_string(arena, arch, args); probe.pc = pc + probe_rebase; probe.semaphore = semaphore ? semaphore + probe_rebase : 0; } - + DMN_LNX_ProbeNode *n = push_array(arena, DMN_LNX_ProbeNode, 1); n->v = probe; SLLQueuePush(probes.first, probes.last, n); probes.count += 1; } - - exit:; + +exit:; scratch_end(scratch); return probes; } @@ -745,11 +817,11 @@ dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind) dmn_lnx_state->entities_count += 1; } U32 gen = entity->gen; - MemoryCopyStruct(entity, &dmn_lnx_nil_entity); + MemoryCopyStruct(entity, dmn_lnx_nil_entity); entity->gen += 1; - if(parent != &dmn_lnx_nil_entity) + if(parent != dmn_lnx_nil_entity) { - DLLPushBack_NPZ(&dmn_lnx_nil_entity, parent->first, parent->last, entity, next, prev); + DLLPushBack_NPZ(dmn_lnx_nil_entity, parent->first, parent->last, entity, next, prev); entity->parent = parent; } entity->kind = kind; @@ -759,25 +831,29 @@ dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind) internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity) { - if(entity->parent != &dmn_lnx_nil_entity) + if(entity->parent != dmn_lnx_nil_entity) { - DLLRemove_NPZ(&dmn_lnx_nil_entity, entity->parent->first, entity->parent->last, entity, next, prev); - entity->parent = &dmn_lnx_nil_entity; + DLLRemove_NPZ(dmn_lnx_nil_entity, entity->parent->first, entity->parent->last, entity, next, prev); + entity->parent = dmn_lnx_nil_entity; } { Temp scratch = scratch_begin(0, 0); - DMN_LNX_EntityNode start_task = {0, entity}; - DMN_LNX_EntityNode *first_task = &start_task; - for(DMN_LNX_EntityNode *t = first_task; t != 0; t = t->next) + for EachNode(t, DMN_LNX_EntityNode, &(DMN_LNX_EntityNode) { .v = entity }) { - SLLStackPush(dmn_lnx_state->free_entity, t->v); - for(DMN_LNX_Entity *child = t->v->first; child != &dmn_lnx_nil_entity; child = child->next) + // put children nodes on the task list + for(DMN_LNX_Entity *child = t->v->first; child != dmn_lnx_nil_entity; child = child->next) { DMN_LNX_EntityNode *task = push_array(scratch.arena, DMN_LNX_EntityNode, 1); task->next = t->next; t->next = task; task->v = child; } + + // free entity + U64 gen = t->v->gen + 1; + MemoryZeroStruct(t->v); + t->v->gen = gen; + SLLStackPush(dmn_lnx_state->free_entity, t->v); } scratch_end(scratch); } @@ -799,7 +875,7 @@ dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity) internal DMN_LNX_Entity * dmn_lnx_entity_from_handle(DMN_Handle handle) { - DMN_LNX_Entity *result = &dmn_lnx_nil_entity; + DMN_LNX_Entity *result = dmn_lnx_nil_entity; U64 index = (U64)handle.u32[0]; if(index < dmn_lnx_state->entities_count && dmn_lnx_state->entities_base[index].gen == handle.u32[1]) @@ -812,78 +888,56 @@ dmn_lnx_entity_from_handle(DMN_Handle handle) internal DMN_LNX_Entity * dmn_lnx_thread_from_pid(pid_t pid) { - DMN_LNX_Entity *result = &dmn_lnx_nil_entity; - if(pid != 0) + DMN_LNX_Entity *thread = hash_table_search_u64_raw(dmn_lnx_state->tid_ht, pid); + if(thread == 0) { - for EachIndex(idx, dmn_lnx_state->entities_count) - { - if(dmn_lnx_state->entities_base[idx].kind == DMN_LNX_EntityKind_Thread && (pid_t)dmn_lnx_state->entities_base[idx].id == pid) - { - result = &dmn_lnx_state->entities_base[idx]; - break; - } - } + thread = dmn_lnx_nil_entity; } - return result; + return thread; +} + +internal DMN_LNX_Entity * +dmn_lnx_process_from_pid(pid_t pid) +{ + DMN_LNX_Entity *process = hash_table_search_u64_raw(dmn_lnx_state->pid_ht, pid); + if(process == 0) + { + process = dmn_lnx_nil_entity; + } + return process; } internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread) { - U64 ip = 0; - if(thread->reg_block) - { - ip = regs_rip_from_arch_block(thread->arch, thread->reg_block); - } - Assert(ip); - return ip; + return regs_rip_from_arch_block(thread->arch, thread->reg_block); } internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread) { - U64 sp = 0; - if(thread->reg_block) - { - sp = regs_rsp_from_arch_block(thread->arch, thread->reg_block); - } - Assert(sp); - return sp; + return regs_rsp_from_arch_block(thread->arch, thread->reg_block); } -internal B32 +internal void dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip) { - B32 is_ip_written = 0; - if(thread->reg_block) - { - REGS_RegBlockX64 *reg_block = thread->reg_block; - regs_arch_block_write_rip(thread->arch, reg_block, ip); - is_ip_written = dmn_lnx_thread_write_reg_block(thread, reg_block); - } - Assert(is_ip_written); - return is_ip_written; + regs_arch_block_write_rip(thread->arch, thread->reg_block, ip); + thread->is_reg_block_dirty = 1; } -internal B32 +internal void dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp) { - B32 is_sp_written = 0; - if(thread->reg_block) - { - REGS_RegBlockX64 *reg_block = thread->reg_block; - regs_arch_block_write_rsp(thread->arch, reg_block, sp); - is_sp_written = dmn_lnx_thread_write_reg_block(thread, reg_block); - } - Assert(is_sp_written); - return is_sp_written; + regs_arch_block_write_rsp(thread->arch, thread->reg_block, sp); + thread->is_reg_block_dirty = 1; } internal B32 -dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) +dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) { - AssertAlways(gettid() == thread->parent->tracer_tid); - + AssertAlways(dmn_lnx_state->tracer_tid == gettid()); + B32 result = 0; switch(thread->arch) { @@ -901,13 +955,13 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) { DMN_LNX_Entity *process = thread->parent; pid_t tid = (pid_t)thread->id; - REGS_RegBlockX64 *dst = reg_block; + REGS_RegBlockX64 *dst = thread->reg_block; //- rjf: read GPR B32 got_gpr = 0; { DMN_LNX_UserX64 ctx = {0}; - int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(ctx), .iov_base = &ctx }); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(ctx), .iov_base = &ctx })); if(ptrace_result != -1) { got_gpr = 1; @@ -947,7 +1001,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(got_gpr) { Temp scratch = scratch_begin(0, 0); - + X64_XSave *xsave = 0; X64_FXSave *fxsave = 0; @@ -955,7 +1009,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(x64_is_xsave_supported()) { void *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); - int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process->xsave_size, .iov_base = xsave_raw }); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process->xsave_size, .iov_base = xsave_raw })); if(ptrace_result != -1) { xsave = xsave_raw; @@ -968,7 +1022,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) if (fxsave == 0) { fxsave = push_array(scratch.arena, X64_FXSave, 1); - int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave }); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave })); if(ptrace_result != -1) { fxsave = 0; @@ -980,7 +1034,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(fxsave) { X64_FXSave *src = fxsave; - + // copy x87 registers dst->fcw.u16 = src->fcw; dst->fsw.u16 = src->fsw; @@ -994,7 +1048,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) { MemoryCopy(&dst->st0 + i, src->st_space + i, sizeof(REGS_Reg80)); } - + // SSE registers are always available in x64 { U128 *xmm_d = fxsave->xmm_space; @@ -1005,7 +1059,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) } } } - + // copy xsave registers if(xsave) { @@ -1019,7 +1073,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&zmm_d[n].v[16], &avx_s[n], sizeof(REGS_Reg128)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_OPMASK) { AssertAlways(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size); @@ -1030,7 +1084,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM_H) { AssertAlways(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size); @@ -1041,7 +1095,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&zmmh_d[n].v[32], &avx512h_s[n], sizeof(REGS_Reg256)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM) { AssertAlways(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size); @@ -1052,7 +1106,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&zmm_d[n], &avx512_s[n], sizeof(REGS_Reg512)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_CETU) { AssertAlways(process->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process->xsave_size); @@ -1078,7 +1132,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) { U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[n]); errno = 0; - long peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0); + long peek_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0)); if(errno == 0) { dr_d[n].u64 = (U64)peek_result; @@ -1094,14 +1148,15 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block) result = got_debug; }break; } + return result; } internal B32 -dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) +dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) { - AssertAlways(gettid() == thread->parent->tracer_tid); - + AssertAlways(dmn_lnx_state->tracer_tid == thread->parent->tracer_tid); + B32 result = 0; switch(thread->arch) { @@ -1119,7 +1174,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) { DMN_LNX_Entity *process = thread->parent; pid_t tid = (pid_t)thread->id; - REGS_RegBlockX64 *src = reg_block; + REGS_RegBlockX64 *src = thread->reg_block; //- rjf: write GPR B32 did_gpr = 0; @@ -1151,17 +1206,17 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) dst.regs.gsbase = src->gsbase.u64; dst.regs.rip = src->rip.u64; dst.regs.rflags = src->rflags.u64; - did_gpr = ptrace(PTRACE_SETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) }) >= 0; + did_gpr = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) }) >= 0); } B32 did_fpr = 0; if(did_gpr) { Temp scratch = scratch_begin(0, 0); - + int xsave_result = -1; int fxsave_result = -1; - + X64_FXSave dst_fxsave = {0}; { dst_fxsave.fcw = src->fcw.u16; @@ -1172,14 +1227,14 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) dst_fxsave.b64.fdp = src->fdp.u64; dst_fxsave.mxcsr = src->mxcsr.u32; dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32; - + REGS_Reg128 *st_d = (REGS_Reg128 *)dst_fxsave.st_space; REGS_Reg80 *st_s = &src->st0; for EachIndex(n, 8) { MemoryCopy(&st_d[n], &st_s[n], sizeof(REGS_Reg80)); } - + REGS_Reg128 *xmm_d = (REGS_Reg128 *)dst_fxsave.xmm_space; REGS_Reg512 *xmm_s = &src->zmm0; for EachIndex(n, 16) @@ -1187,16 +1242,16 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) MemoryCopy(&xmm_d[n], &xmm_s[n], sizeof(REGS_Reg128)); } } - + if(x64_is_xsave_supported()) { U8 *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); - int xsave_get = ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = xsave_raw, .iov_len = process->xsave_size }); + int xsave_get = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = xsave_raw, .iov_len = process->xsave_size })); AssertAlways(xsave_get >= 0); - + X64_XSave *dst = (X64_XSave *)xsave_raw; dst->fxsave = dst_fxsave; - + if(process->xsave_layout.avx_offset) { if(process->xsave_layout.avx_offset + sizeof(REGS_Reg128) * 16 <= process->xsave_size) @@ -1209,7 +1264,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } } } - + if(process->xsave_layout.opmask_offset) { if(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size) @@ -1223,7 +1278,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } else { Assert(0 && "invalid xsave size"); } } - + if(process->xsave_layout.zmm_h_offset) { if(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size) @@ -1237,7 +1292,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } else { Assert(0 && "invalid xsave size"); } } - + if(process->xsave_layout.zmm_offset) { if(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size) @@ -1251,7 +1306,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } else { Assert(0 && "invalid xsave size"); } } - + if(process->xsave_layout.cet_u_offset) { if(process->xsave_layout.cet_u_offset + sizeof(REGS_Reg64) * 2 <= process->xsave_size) @@ -1262,22 +1317,22 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) } else { Assert(0 && "invalid xsave size"); } } - + // xsave - xsave_result = ptrace(PTRACE_SETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process->xsave_size }); + xsave_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process->xsave_size })); Assert(xsave_result >= 0); } - + // fallback to fxsave if(xsave_result < 0) { - fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_base = &dst_fxsave, sizeof(dst_fxsave) }); + fxsave_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_base = &dst_fxsave, sizeof(dst_fxsave) })); Assert(fxsave_result >= 0); } - + // rjf: good finish requires xsave or fxsave did_fpr = (xsave_result >= 0 || fxsave_result >= 0); - + scratch_end(scratch); } @@ -1286,16 +1341,16 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block) if(did_fpr) { did_dbg = 1; - + src->dr7.u64 |= (1 << 10); - + REGS_Reg64 *dr_s = &src->dr0; for EachIndex(n, 8) { if(n != 4 && n != 5) { U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[n]); - int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s[n].u64); + int poke_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), (void*)(uintptr_t)dr_s[n].u64)); if(poke_result < 0) { did_dbg = 0; @@ -1317,60 +1372,355 @@ dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on) B32 is_flag_set = 0; switch(thread->arch) { - case Arch_COUNT: - case Arch_Null: {} break; - case Arch_x64: - { - REGS_RegBlockX64 *reg_block = thread->reg_block; - if(is_on) - { - reg_block->rflags.u64 |= X64_RFlag_Trap; - } - else - { - reg_block->rflags.u64 &= ~X64_RFlag_Trap; - } - is_flag_set = dmn_lnx_thread_write_reg_block(thread, thread->reg_block); - }break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { - NotImplemented; - }break; + case Arch_COUNT: + case Arch_Null: {} break; + case Arch_x64: + { + REGS_RegBlockX64 *reg_block = thread->reg_block; + if(is_on) { reg_block->rflags.u64 |= X64_RFlag_Trap; } + else { reg_block->rflags.u64 &= ~X64_RFlag_Trap; } + thread->is_reg_block_dirty = 1; + is_flag_set = 1; + }break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: + { + NotImplemented; + }break; } Assert(is_flag_set); return is_flag_set; } internal void -dmn_lnx_process_loaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 new_link_map_vaddr) +dmn_lnx_handle_not_attached(Arena *arena, DMN_EventList *events) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Error; + e->error_kind = DMN_ErrorKind_NotAttached; +} + +internal void +dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, pid_t pid) +{ + Temp scratch = scratch_begin(&arena, 1); + + // + // move pid to the active list + // + B32 debug_subprocesses = 0; + for EachNode(n, DMN_LNX_ProcessLaunch, dmn_lnx_state->pending_creation.first) + { + if(n->pid == pid) + { + dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_creation, n); + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, n); + debug_subprocesses = n->debug_subprocesses; + break; + } + } + + ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); + int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); + DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); + Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); + U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base); + U64 rdebug_brk_vaddr = rdebug_vaddr + gnu_r_brk_offset_from_arch(arch); + U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); + U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; + DMN_LNX_PhdrInfo phdr_info = dmn_lnx_phdr_info_from_memory(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); + Arena *process_arena = arena_alloc(); + + ELF_Class dl_class; + { + ELF_Hdr64 ehdr = {0}; + if(!dmn_lnx_read_ehdr(memory_fd, auxv.base, &ehdr)) { Assert(0 && "failed to read interp's header"); } + dl_class = ehdr.e_ident[ELF_Identifier_Class]; + } + + // + // query xsave layout + // + U64 xcr0 = 0; + U64 xsave_size = 0; + X64_XSaveLayout xsave_layout = {0}; + if(arch == Arch_x64) + { + X64_XSave xsave = {0}; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, pid, (void*)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0)) + { + // Linux stores xcr0 bits in fxstate padding, + // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25 + xcr0 = *(U64 *)((U8 *)&xsave + 464); + xsave_size = x64_get_xsave_size(); + xsave_layout = x64_get_xsave_layout(xcr0); + } + else { Assert(0 && "failed to get xstate"); } + } + + // + // gather probes + // + DMN_LNX_Probe **known_probes = push_array(process_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); + { + String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, pid, auxv.base); + int dl_fd = open((char *)dl_path.str, O_RDONLY); + + DMN_LNX_ProbeList probes = {0}; + if(dl_fd >= 0) + { + probes = dmn_lnx_read_probes(process_arena, dl_fd, 0, auxv.base); + close(dl_fd); + } + + for EachNode(n, DMN_LNX_ProbeNode, probes.first) + { + DMN_LNX_Probe *p = &n->v; + if(str8_match(p->provider, str8_lit("rtld"), 0)) + { +#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } + DMN_LNX_Probe_XList +#undef X + } + } + } + + // + // install DL probes + // + U64 probe_vaddrs[DMN_LNX_ProbeType_Count] = {0}; + for EachIndex(i, DMN_LNX_ProbeType_Count) + { + if(known_probes[i] == 0) { continue; } + + U8 og_byte = 0; + if(!dmn_lnx_read_struct(memory_fd, known_probes[i]->pc, &og_byte)) { Assert(0 && "failed to read original byte"); } + Assert(og_byte == 0x90); + + U8 trap = 0xcc; + if(!dmn_lnx_write_struct(memory_fd, known_probes[i]->pc, &trap)) { Assert(0 && "failed to install probe"); } + + probe_vaddrs[i] = known_probes[i]->pc; + } + + // + // init process + // + DMN_LNX_Entity *process = dmn_lnx_entity_alloc(dmn_lnx_state->entities_base, DMN_LNX_EntityKind_Process); + process->id = pid; + process->arch = arch; + process->fd = memory_fd; + process->tracer_tid = gettid(); + process->debug_subprocesses = debug_subprocesses; + process->rdebug_vaddr = rdebug_vaddr; + process->rdebug_brk_vaddr = rdebug_brk_vaddr; + process->expect_rdebug_data_breakpoint = rdebug_vaddr != 0; + process->dl_class = dl_class; + process->arena = process_arena; + process->loaded_modules_ht = hash_table_init(process_arena, 0x1000); + process->probes = known_probes; + process->xcr0 = xcr0; + process->xsave_size = Max(xsave_size, sizeof(X64_XSave)); + process->xsave_layout = xsave_layout; + process->thread_count = 1; + MemoryCopyTyped(&process->probe_vaddrs[0], &probe_vaddrs[0], DMN_LNX_ProbeType_Count); + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); + // push create process event + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_lnx_handle_from_entity(process); + e->arch = process->arch; + e->code = pid; + } + + // + // init main thread + // + DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); + thread->id = pid; + thread->arch = process->arch; + thread->is_main_thread = 1; + thread->thread_state = DMN_LNX_ThreadState_Stopped; + thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); + thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->id, thread); + // push create thread event + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->arch = thread->arch; + e->code = thread->id; + } + + // + // init main module + // + { + DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); + module->id = auxv.execfn; + module->base_vaddr = base_vaddr; + + hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, 0, module); + hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, base_vaddr, module); + + // push load module event + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->module = dmn_lnx_handle_from_entity(module); + e->arch = process->arch; + e->address = base_vaddr; + e->size = dim_1u64(phdr_info.range); + e->string = dmn_lnx_read_string(arena, process->fd, auxv.execfn); + e->elf_phdr_vrange = r1u64(auxv.phdr, auxv.phdr + auxv.phent * auxv.phnum); + e->elf_phdr_entsize = auxv.phent; + } + } + + // + // handshake complete + // + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_HandshakeComplete; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->arch = process->arch; + } + + // + // update global state + // + dmn_lnx_state->active_process_count += 1; + + scratch_end(scratch); +} + +internal void +dmn_lnx_handle_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) +{ + DMN_LNX_Entity *process = dmn_lnx_process_from_pid(pid); + + // rjf: generate unload-module events + for(DMN_LNX_Entity *child = process->first; child != dmn_lnx_nil_entity; child = child->next) + { + if(child->kind == DMN_LNX_EntityKind_Module) + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->module = dmn_lnx_handle_from_entity(child); + // TODO(rjf): e->string = ...; + } + } + + // rjf: generate exit process event + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_lnx_handle_from_entity(process); + e->code = process->main_thread_exit_code; + } + + // free process + if(close(process->fd) < 0) { Assert(0 && "failed to close memory descriptor"); } + arena_release(process->arena); + + // rjf: eliminate entity tree + hash_table_purge_u64(dmn_lnx_state->pid_ht, process->id); + dmn_lnx_entity_release(process); + + // + // update global state + // + AssertAlways(dmn_lnx_state->active_process_count > 0); + dmn_lnx_state->active_process_count -= 1; +} + +internal void +dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, pid_t tid, pid_t new_tid) +{ + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Entity *process = thread->parent; + + DMN_LNX_Entity *new_thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); + new_thread->id = new_tid; + new_thread->arch = process->arch; + new_thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); + new_thread->thread_state = DMN_LNX_ThreadState_Stopped; + new_thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(new_thread); + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, new_thread->id, new_thread); + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(new_thread); + e->arch = new_thread->arch; + e->code = new_thread->id; + + process->thread_count += 1; +} + +internal void +dmn_lnx_handle_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code) +{ + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Entity *process = thread->parent; + + // store main thread's exit code + if(thread->is_main_thread) + { + process->main_thread_exit_code = exit_code; + } + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + hash_table_purge_u64(dmn_lnx_state->tid_ht, thread->id); + dmn_lnx_entity_release(thread); + process->thread_count -= 1; + + if(process->thread_count == 0) + { + dmn_lnx_handle_exit_process(arena, events, process->id); + } +} + +internal void +dmn_lnx_handle_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 new_link_map_vaddr) { GNU_LinkMap64 map = {0}; for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) { // read out new link map item if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { goto exit; } - + // was module with this base already registered? DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); if(module) { continue; } - + // parse out module's ELF header ELF_Hdr64 module_ehdr = {0}; if(!dmn_lnx_read_ehdr(process->fd, map.addr_vaddr, &module_ehdr)) { goto exit; } - + // gather info about module U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? map.addr_vaddr : 0; U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); String8 module_name = dmn_lnx_read_string(process->arena, process->fd, map.name_vaddr); - + // fill out module module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); module->id = map.name_vaddr; module->base_vaddr = map.addr_vaddr; - + // push load event if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) { @@ -1385,31 +1735,31 @@ dmn_lnx_process_loaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Enti e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); e->elf_phdr_entsize = module_ehdr.e_phentsize; } - + // create mapping for base -> module hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module); } - + exit:; } internal void -dmn_lnx_process_unloaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 rdebug_vaddr) +dmn_lnx_hanlde_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 rdebug_vaddr) { Temp scratch = scratch_begin(&arena, 1); B32 is_unmap_complete_finished = 0; - + GNU_RDebugInfo64 rdebug = {0}; if(!dmn_lnx_read_r_debug(process->fd, rdebug_vaddr, process->arch, &rdebug)) { goto exit; } if(rdebug.r_version != 1) { goto exit; } - + // flag every module as inactive - for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next) + for(DMN_LNX_Entity *module = process->first; module != dmn_lnx_nil_entity; module = module->next) { if(module->kind != DMN_LNX_EntityKind_Module) {continue;} module->is_live = 0; } - + // loop over modules in the link map and mark live modules GNU_LinkMap64 map = {0}; for(U64 map_vaddr = rdebug.r_map; map_vaddr != 0; map_vaddr = map.next_vaddr) @@ -1425,52 +1775,250 @@ dmn_lnx_process_unloaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_En } else { Assert(0 && "unable to read Link Map"); } } - - // unload inactive modules + + // collect unloaded modules DMN_HandleList to_release = {0}; - for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next) + for(DMN_LNX_Entity *module = process->first; module != dmn_lnx_nil_entity; module = module->next) { if(module->kind != DMN_LNX_EntityKind_Module) {continue;} if(module->is_live) {continue;} dmn_handle_list_push(scratch.arena, &to_release, dmn_lnx_handle_from_entity(module)); } - + // push events and clean up internal structures for EachNode(n, DMN_HandleNode, to_release.first) { DMN_LNX_Entity *module = dmn_lnx_entity_from_handle(n->v); - - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); + + DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_UnloadModule; e->process = dmn_lnx_handle_from_entity(process); e->module = dmn_lnx_handle_from_entity(module); e->string = dmn_lnx_read_string(arena, process->fd, module->id); - + hash_table_purge_u64(process->loaded_modules_ht, module->base_vaddr); - + dmn_lnx_entity_release(module); } - + is_unmap_complete_finished = 1; - exit:; +exit:; Assert(is_unmap_complete_finished); scratch_end(scratch); } +internal void +dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, HashTable *active_trap_ht, pid_t tid) +{ + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Entity *process = thread->parent; + U64 ip = dmn_lnx_thread_read_ip(thread); + + // is this user trap? + DMN_Trap *hit_user_trap = hash_table_search_u64_raw(active_trap_ht, ip-1); + + // is this a probe trap? + DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; + for EachIndex(i, ArrayCount(process->probe_vaddrs)) + { + if(process->probe_vaddrs[i] == ip-1) + { + probe_type = i; + break; + } + } + + if(probe_type == DMN_LNX_ProbeType_InitComplete) + { + B32 is_init_completed = 0; + + DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_InitComplete]; + U64 name_space_id = 0, rdebug_addr = 0; + if(!stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto init_complete_exit; } + if(!stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } + + GNU_RDebugInfo64 rdebug = {0}; + if(!dmn_lnx_read_r_debug(process->fd, rdebug_addr, process->arch, &rdebug)) { goto init_complete_exit; } + if(rdebug.r_version != 1 && rdebug.r_version != 2) { goto init_complete_exit; } + + dmn_lnx_handle_load_module(arena, events, process, name_space_id, rdebug.r_map); + + is_init_completed = 1; + init_complete_exit:; + AssertAlways(is_init_completed); + } + else if(probe_type == DMN_LNX_ProbeType_RelocComplete) + { + B32 is_reloc_completed = 0; + + DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_RelocComplete]; + U64 name_space_id = 0, new_link_map_addr = 0; + if(!stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto reloc_complete_exit; } + if(!stap_read_arg_u(probe->args.v[2], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) { goto reloc_complete_exit; } + + dmn_lnx_handle_load_module(arena, events, process, name_space_id, new_link_map_addr); + + is_reloc_completed = 1; + reloc_complete_exit:; + AssertAlways(is_reloc_completed); + } + else if(probe_type == DMN_LNX_ProbeType_UnmapComplete) + { + B32 is_unmap_completed = 0; + + DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_UnmapComplete]; + U64 name_space_id = 0, rdebug_vaddr = 0; + if(!stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } + if(!stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } + + dmn_lnx_hanlde_unload_module(arena, events, process, name_space_id, rdebug_vaddr); + + is_unmap_completed = 1; + unmap_complete_exit:; + AssertAlways(is_unmap_completed); + } + + if(probe_type == DMN_LNX_ProbeType_Null) + { + // rollback IP on user traps + if(hit_user_trap) + { + U64 ip = dmn_lnx_thread_read_ip(thread); + dmn_lnx_thread_write_ip(thread, ip - 1); + } + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Breakpoint; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + } +} + +internal void +dmn_lnx_handle_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) +{ + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Entity *process = thread->parent; + + B32 is_valid = 1; + U64 address = 0; + switch(thread->arch) + { + case Arch_Null: break; + case Arch_x64: + { + REGS_RegBlockX64 *regs_x64 = thread->reg_block; + if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B0) + { + address = regs_x64->dr0.u64; + } + else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B1) + { + address = regs_x64->dr1.u64; + } + else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B2) + { + address = regs_x64->dr2.u64; + } + else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B3) + { + address = regs_x64->dr3.u64; + } + else + { + is_valid = 0; + } + }break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: + { NotImplemented; }break; + default: { InvalidPath; } break; + } + + if(is_valid) + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Breakpoint; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->instruction_pointer = address; + } +} + +internal void +dmn_lnx_handle_halt(Arena *arena, DMN_EventList *events) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Halt; +} + +internal void +dmn_lnx_handle_single_step(Arena *arena, DMN_EventList *events, pid_t tid) +{ + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Entity *process = thread->parent; + + // clear single step flag + dmn_lnx_set_single_step_flag(thread, 0); + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_SingleStep; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); +} + +internal void +dmn_lnx_handle_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo) +{ + // TODO(rjf): possible cases: + // SIGABRT + // SIGFPE + // SIGSEGV + // SIGILL + + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Entity *process = thread->parent; + + thread->pass_through_signal = 1; + thread->pass_through_signo = signo; + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + e->signo = signo; + + if(signo == SIGSEGV) + { + siginfo_t si = {0}; + OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, tid, 0, &si)); + e->address = (U64)si.si_addr; + } +} + //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) internal void dmn_init(void) { - Arena *arena = arena_alloc(); - dmn_lnx_state = push_array(arena, DMN_LNX_State, 1); - dmn_lnx_state->arena = arena; - dmn_lnx_state->deferred_events_arena = arena_alloc(); + local_persist B32 was_inited; + local_persist DMN_LNX_State state; + AssertAlways(!was_inited); + was_inited = 1; + + dmn_lnx_state = &state; + dmn_lnx_state->arena = arena_alloc(); + dmn_lnx_state->access_mutex = mutex_alloc(); dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain); - dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0); - dmn_lnx_entity_alloc(&dmn_lnx_nil_entity, DMN_LNX_EntityKind_Root); - dmn_lnx_state->access_mutex = mutex_alloc(); + dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0); + dmn_lnx_state->tid_ht = hash_table_init(dmn_lnx_state->arena, 0x2000); + dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); + dmn_lnx_entity_alloc(dmn_lnx_nil_entity, DMN_LNX_EntityKind_Root); } //////////////////////////////// @@ -1506,19 +2054,17 @@ internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) { Temp scratch = scratch_begin(0, 0); + + pid_t pid = 0; //- rjf: unpack command line - char **argv = 0; - int argc = 0; + int argc = (int)(params->cmd_line.node_count); + char **argv = push_array(scratch.arena, char *, argc+1); { - argc = (int)(params->cmd_line.node_count); - argv = push_array(scratch.arena, char *, argc+1); + U64 idx = 0; + for(String8Node *n = params->cmd_line.first; n != 0; n = n->next, idx += 1) { - U64 idx = 0; - for(String8Node *n = params->cmd_line.first; n != 0; n = n->next, idx += 1) - { - argv[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; - } + argv[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; } } @@ -1526,404 +2072,78 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) char *path = (char *)push_str8_copy(scratch.arena, params->path).str; //- rjf: unpack environment - char **env = 0; + char **env = push_array(scratch.arena, char *, os_lnx_state.default_env_count + params->env.node_count + 1); { - env = push_array(scratch.arena, char *, params->env.node_count+1); + MemoryCopyTyped(env, os_lnx_state.default_env, os_lnx_state.default_env_count); + + U64 idx = os_lnx_state.default_env_count; + for(String8Node *n = params->env.first; n != 0; n = n->next, idx += 1) { - U64 idx = 0; - for(String8Node *n = params->env.first; n != 0; n = n->next, idx += 1) - { - env[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; - } + env[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; } } - - //- rjf: create & set up new process - if(argv != 0 && argv[0] != 0) + + //- rjf: fork + pid = fork(); + + // child process + if(pid == 0) { - pid_t pid = 0; - int ptrace_result = 0; - int chdir_result = 0; - B32 error__need_child_kill = 0; - - // open temp pipes to communicate with child process - int pipe_fds[2] = {0}; - if (pipe(&pipe_fds[0]) < 0) { InvalidPath; } - - //- rjf: fork - pid = fork(); - if(pid == -1) { goto error; } - - //- rjf: child process -> execute actual target - if(pid == 0) + // set current working directory to tracee + if(OS_LNX_RETRY_ON_EINTR(chdir(path)) < 0) { goto child_exit; } + + // notify parent that we are going to execve + OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)); + + // replace process with target + OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, env)); + + // execve failed -- exit + child_exit:; + abort(); + } + // parent process + else if(pid > 0) + { + B32 kill_child_process = 1; + + // try to seize child process + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, 0) < 0)) { Assert(0 && "failed to seize"); goto parent_exit; } + + if(dmn_lnx_state->tracer_tid == 0) { - // wait for parent seize - char b; - read(pipe_fds[0], &b, sizeof(b)); - - // set current working directory to tracee - chdir_result = chdir(path); - if(chdir_result == -1) { goto error; } - - // replace process with target - execve(argv[0], argv, env); - - // execve failed -- exit - abort(); + dmn_lnx_state->tracer_tid = gettid(); } - - //- rjf: parent process - if(pid != 0) + else { - enum LaunchStatus - { - LaunchStatus_Null, - LaunchStatus_FailBeforePtrace, - LaunchStatus_FailAfterPtrace, - LaunchStatus_Success, - }; - enum LaunchStatus launch_status = LaunchStatus_FailBeforePtrace; - { - int s = 0; - - // seize process - if (ptrace(PTRACE_SEIZE, pid, 0, 0) < 0) { Assert(0 && "seize failed"); goto launch_error; } - - // interrupt process - launch_status = LaunchStatus_FailAfterPtrace; - if (ptrace(PTRACE_INTERRUPT, pid, 0, 0) < 0) { Assert(0 && "interrupt failed"); goto launch_error; } - if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "interrupt wait failed"); goto launch_error; } - - // entry read - if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - - // resume child - char b = 1; - if (write(pipe_fds[1], &b, sizeof(b)) < 0) { Assert(0 && "resume child failed"); goto launch_error; } - - // exit read - if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } - if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - - // entry chdir - if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } - if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - - // exit chdir - if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } - if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - - // entry execv - if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } - if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - - // exit execve - if (waitpid(pid, &s, __WALL | __WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } - if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) { Assert(0 && "syscall failed"); goto launch_error; } - if (waitpid(pid, &s, __WALL | __WNOTHREAD) < 0) { Assert(0 && "wait failed"); goto launch_error; } - - uintptr_t trace_options = PTRACE_O_TRACEEXIT | PTRACE_O_EXITKILL | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEVFORKDONE; - int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(trace_options)); - if (setoptions_result == -1) { Assert(0 && "failed to set options"); error__need_child_kill = 1; goto launch_error; } - - launch_status = LaunchStatus_Success; - launch_error:; - } - - //- rjf: respond to launch status appropriately - switch(launch_status) - { - //- rjf: no understood handling path - default:{}break; - - //- rjf: failure, after ptrace => we need to explicitly obtain the - // result code & exit the process, otherwise it will become a zombie, - // since it is ptrace'd. - case LaunchStatus_FailAfterPtrace: - { - B32 cleanup_good = 0; - int detach_result = ptrace(PTRACE_DETACH, pid, 0, (void*)SIGCONT); - if(detach_result != -1) - { - int status_cleanup = 0; - pid_t wait_id_cleanup = waitpid(pid, &status_cleanup, __WALL); - if(wait_id_cleanup == pid) - { - cleanup_good = 1; - } - } - if(cleanup_good) - { - // TODO(rjf): child initialization failed, but we at least cleaned it up. - } - else - { - // TODO(rjf): child initialization failed, *and* we couldn't clean it up, so we've created - // yet-another zombie. - } - }break; - - //- rjf: successful launch - case LaunchStatus_Success: - { - ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); - int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR|O_CLOEXEC); - DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); - Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); - U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base); - U64 rdebug_brk_vaddr = rdebug_vaddr + gnu_r_brk_offset_from_arch(arch); - - ELF_Class dl_class; - { - ELF_Hdr64 ehdr = {0}; - if(!dmn_lnx_read_ehdr(memory_fd, auxv.base, &ehdr)) { Assert(0 && "failed to read interp's header"); } - dl_class = ehdr.e_ident[ELF_Identifier_Class]; - } - - U64 xcr0 = 0; - U64 xsave_size = 0; - X64_XSaveLayout xsave_layout = {0}; - if(arch == Arch_x64) - { - X64_XSave xsave = {0}; - if(ptrace(PTRACE_GETREGSET, pid, (void*)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0) - { - // Linux stores xcr0 bits in fxstate padding, - // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25 - xcr0 = *(U64 *)((U8 *)&xsave + 464); - xsave_size = x64_get_xsave_size(); - xsave_layout = x64_get_xsave_layout(xcr0); - } - else - { - Assert(0 && "failed to get xstate"); - } - } - - String8 dl_path = {0}; - { - int maps_fd = open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY|O_CLOEXEC); - if(maps_fd != -1) - { - struct stat st = {0}; - if(fstat(maps_fd, &st) != -1) - { - U64 maps_size = dmn_lnx_size_from_fd(maps_fd, MB(1)); - U8 *maps_ptr = push_array(scratch.arena, U8, maps_size); - U64 read_size = dmn_lnx_read(maps_fd, r1u64(0, maps_size), maps_ptr); - if(read_size == maps_size) - { - String8 maps = str8(maps_ptr, maps_size); - - String8List parts = {0}; - { - for(U64 cursor = 0, part_off = 0; cursor < maps.size; cursor += 1) - { - if(maps.str[cursor] == '\\') - { - cursor += 1; - continue; - } - if(maps.str[cursor] == ' ' || maps.str[cursor] == '\n' || cursor + 1 >= maps.size) - { - String8 p = str8_substr(maps, r1u64(part_off, cursor)); - if(p.size > 0) - { - str8_list_push(scratch.arena, &parts, p); - } - part_off = cursor + 1; - } - } - } - - for(String8Node *n = parts.first; n != 0; ) - { - String8 vrange_str = n->string; - n = n->next; - if(n == 0) { break; } - - String8 perms_str = n->string; - n = n->next; - if(n == 0) { break; } - - String8 offset_str = n->string; - n = n->next; - if(n == 0) { break; } - - String8 dev_str = n->string; - n = n->next; - if(n == 0) { break; } - - String8 inode_str = n->string; - n = n->next; - if(n == 0) { break; } - - String8 path = n->string; - n = n->next; - if(n == 0) { break; } - - String8List vaddr_list = str8_split_by_string_chars(scratch.arena, vrange_str, str8_lit("-"), 0); - if(vaddr_list.node_count != 2) { break; } - - U64 lo_vaddr = u64_from_str8(vaddr_list.first->string, 16); - if(lo_vaddr == auxv.base) - { - dl_path = push_str8_copy(scratch.arena, path); - break; - } - } - } - } - close(maps_fd); - } - } - AssertAlways(dl_path.size); - - // alloc arena for the process - Arena *process_arena = arena_alloc(); - - DMN_LNX_Probe **known_probes = push_array(process_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); - { - DMN_LNX_ProbeList probes = {0}; - int dl_fd = open((char *)dl_path.str, O_RDONLY|O_CLOEXEC); - if(dl_fd >= 0) - { - probes = dmn_lnx_read_probes(process_arena, dl_fd, 0, auxv.base); - close(dl_fd); - } - - for EachNode(n, DMN_LNX_ProbeNode, probes.first) - { - DMN_LNX_Probe *p = &n->v; - if(str8_match(p->provider, str8_lit("rtld"), 0)) - { -#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } - DMN_LNX_Probe_XList -#undef X - } - } - } - - // install DL probes - U64 probe_vaddrs[DMN_LNX_ProbeType_Count] = {0}; - for EachIndex(i, DMN_LNX_ProbeType_Count) - { - if(known_probes[i] == 0) { continue; } - - U8 og_byte = 0; - if(!dmn_lnx_read_struct(memory_fd, known_probes[i]->pc, &og_byte)) { Assert(0 && "failed to read original byte"); } - Assert(og_byte == 0x90); - - U8 trap = 0xcc; - if(!dmn_lnx_write_struct(memory_fd, known_probes[i]->pc, &trap)) { Assert(0 && "failed to install probe"); } - - probe_vaddrs[i] = known_probes[i]->pc; - } - - // make process entity & push create event - DMN_LNX_Entity *process = &dmn_lnx_nil_entity; - { - process = dmn_lnx_entity_alloc(dmn_lnx_state->entities_base, DMN_LNX_EntityKind_Process); - process->arch = arch; - process->id = pid; - process->fd = memory_fd; - process->tracer_tid = gettid(); - process->rdebug_vaddr = rdebug_vaddr; - process->rdebug_brk_vaddr = rdebug_brk_vaddr; - process->expect_rdebug_data_breakpoint = rdebug_vaddr != 0; - process->dl_class = dl_class; - process->arena = process_arena; - process->loaded_modules_ht = hash_table_init(process_arena, 0x1000); - process->probes = known_probes; - process->xcr0 = xcr0; - process->xsave_size = Max(xsave_size, sizeof(X64_XSave)); - process->xsave_layout = xsave_layout; - MemoryCopyTyped(&process->probe_vaddrs[0], &probe_vaddrs[0], DMN_LNX_ProbeType_Count); - { - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_lnx_handle_from_entity(process); - e->arch = process->arch; - e->code = pid; - } - } - - // make thread entity & push create event - DMN_LNX_Entity *main_thread = &dmn_lnx_nil_entity; - { - main_thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); - main_thread->id = pid; - main_thread->arch = process->arch; - main_thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); - dmn_lnx_thread_read_reg_block(main_thread, main_thread->reg_block); - { - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(main_thread); - e->arch = main_thread->arch; - e->code = main_thread->id; - } - } - - // make main module & push load module event - { - U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); - U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; - DMN_LNX_PhdrInfo phdr_info = dmn_lnx_phdr_info_from_memory(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); - - DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); - module->id = auxv.execfn; - module->base_vaddr = base_vaddr; - - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(main_thread); - e->module = dmn_lnx_handle_from_entity(module); - e->arch = process->arch; - e->address = base_vaddr; - e->size = dim_1u64(phdr_info.range); - e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, auxv.execfn); - e->elf_phdr_vrange = r1u64(auxv.phdr, auxv.phdr + auxv.phent * auxv.phnum); - e->elf_phdr_entsize = auxv.phent; - - hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, 0, module); - hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, base_vaddr, module); - } - - // rjf: handshake event - { - DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_HandshakeComplete; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(main_thread); - e->arch = process->arch; - } - }break; - } + AssertAlways(dmn_lnx_state->tracer_tid == gettid()); } - - //- rjf: error case - goto success; - error:; + + // alloc pid node + DMN_LNX_ProcessLaunch *pending_stopsig = dmn_lnx_state->free_pids.first; + if(pending_stopsig) { dmn_lnx_process_launch_list_remove(&dmn_lnx_state->free_pids, pending_stopsig); } + else { pending_stopsig = push_array(dmn_lnx_state->arena, DMN_LNX_ProcessLaunch, 1); } + + // add to list + pending_stopsig->debug_subprocesses = params->debug_subprocesses; + pending_stopsig->pid = pid; + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_stopsig, pending_stopsig); + + // tracee was successfully sizeed + kill_child_process = 0; + + parent_exit:; + if(kill_child_process) { - if(error__need_child_kill) - { - // TODO(rjf) - } + Assert(0 && "failed to ptrace child process"); + if(OS_LNX_RETRY_ON_EINTR(kill(SIGKILL, pid)) < 0) { Assert(0 && "failed to kill child process"); } + pid = 0; } - - //- rjf: success - success:; - - // clean up pipes - close(pipe_fds[0]); - close(pipe_fds[1]); } scratch_end(scratch); - return 0; + Assert(pid < max_U32); + return (U32)pid; } internal B32 @@ -1937,8 +2157,8 @@ dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) { B32 result = 0; DMN_LNX_Entity *process_entity = dmn_lnx_entity_from_handle(process); - if(process_entity != &dmn_lnx_nil_entity && - kill(process_entity->id, SIGKILL) != -1) + if(process_entity != dmn_lnx_nil_entity && + OS_LNX_RETRY_ON_EINTR(kill(process_entity->id, SIGKILL)) != -1) { result = 1; } @@ -1950,516 +2170,81 @@ dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) { B32 result = 0; DMN_LNX_Entity *process_entity = dmn_lnx_entity_from_handle(process); - if(process_entity != &dmn_lnx_nil_entity && - ptrace(PTRACE_DETACH, process_entity->id, 0, 0) != -1) + if(process_entity != dmn_lnx_nil_entity && + OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, process_entity->id, 0, 0)) != -1) { result = 1; } return result; } -internal void -dmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_for_group_stop, DMN_ActiveTrap *active_traps) -{ - for(B32 done = 0; !done;) - { - //- rjf: wait for next event - int status = 0; - pid_t wait_id = waitpid(tid, &status, __WALL|__WNOTHREAD); - if(status == -1 && errno == EINTR) {continue;} // wait interrupted, try again - if(status == -1) {InvalidPath;} // TODO: graceful exit - - //- rjf: unpack event - int wifexited = WIFEXITED(status); - int wifsignaled = WIFSIGNALED(status); - int wifstopped = WIFSTOPPED(status); - int wstopsig = WSTOPSIG(status); - int ptrace_event_code = (status>>16); - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - DMN_LNX_Entity *process = thread->parent; - - //printf("waitpid - pid %d wifexited %d, wifsignaled %d, wifstopped %d, wstopsig %d\n", wait_id, wifexited, wifsignaled, wifstopped, wstopsig); - - // update thread registers - if(thread != &dmn_lnx_nil_entity) - { - if (!dmn_lnx_thread_read_reg_block(thread, thread->reg_block)) { Assert(0 && "failed to update thread's registers"); } - } - - DMN_EventKind e_kind = DMN_EventKind_Null; - U64 exit_code = max_U64; - U64 address = 0; - DMN_Trap *hit_user_trap = 0; - pid_t new_pid = 0; - B32 is_group_stop = 0; - - //- rjf: WIFEXITED(status) -> thread exit - if(wifexited) - { - e_kind = DMN_EventKind_ExitThread; - } - - //- rjf: WIFEXITED(status) -> thread exit w/ exit code - else if(wifsignaled) - { - e_kind = DMN_EventKind_ExitThread; - exit_code = WTERMSIG(status); - } - - //- rjf: SIGTRAP:PTRACE_EVENT_EXIT - else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_EXIT) - { - // TODO(rjf): verify - e_kind = DMN_EventKind_ExitThread; - } - - //- rjf: SIGTRAP:PTRACE_EVENT_CLONE - else if(wifstopped && (status >> 8) == (SIGTRAP | PTRACE_EVENT_CLONE << 8)) - { - if(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid) >= 0) - { - e_kind = DMN_EventKind_CreateThread; - } - else { Assert(0 && "failed to get new tid"); } - } - - //- rjf: SIGTRAP:PTRACE_EVENT_FORK, or SIGTRAP:PTRACE_EVENT_VFORK - else if(wifstopped && wstopsig == SIGTRAP && - (ptrace_event_code == PTRACE_EVENT_FORK || - ptrace_event_code == PTRACE_EVENT_VFORK)) - { - } - - // group stop - else if(wifstopped && wstopsig == SIGTRAP && status >> 16 == PTRACE_EVENT_STOP) - { - is_group_stop = 1; - } - - //- rjf: SIGTRAP - else if(wifstopped && wstopsig == SIGTRAP) - { - // translate signal code to DEMON event kind - siginfo_t siginfo = {0}; - if(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo) < 0) { Assert(0 && "failed to get signal info"); } - - switch(siginfo.si_code) - { - case DMN_LNX_SigTrapCode_Brkpt: - { - e_kind = DMN_EventKind_Breakpoint; - }break; - case DMN_LNX_SigTrapCode_Trace: - { - e_kind = DMN_EventKind_SingleStep; - }break; - case DMN_LNX_SigTrapCode_HwBkpt: - { - if(thread->arch == Arch_Null) { } - else if(thread->arch == Arch_x64) - { - REGS_RegBlockX64 *regs_x64 = thread->reg_block; - if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B0) - { - address = regs_x64->dr0.u64; - e_kind = DMN_EventKind_Breakpoint; - } - else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B1) - { - address = regs_x64->dr1.u64; - e_kind = DMN_EventKind_Breakpoint; - } - else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B2) - { - address = regs_x64->dr2.u64; - e_kind = DMN_EventKind_Breakpoint; - } - else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B3) - { - address = regs_x64->dr3.u64; - e_kind = DMN_EventKind_Breakpoint; - } - } - else - { - NotImplemented; - } - }break; - case SI_KERNEL: - { - e_kind = DMN_EventKind_Breakpoint; - }break; - case DMN_LNX_SigTrapCode_Unk: {NotImplemented;}break; - case DMN_LNX_SigTrapCode_Perf: {NotImplemented;}break; - default: {InvalidPath;} break; - } - } - - //- rjf: WSTOPSIG(status) is SIGSTOP - else if(wifstopped && wstopsig == SIGSTOP) - { - // - // TODO(rjf): how do we tell the following apart?: - // - SIGSTOP All-Stop - // - SIGSTOP Halt - // - SIGSTOP "User" - // - // we are currently just assuming that, if we've queried a SIGSTOP to halt, then - // the first one that comes back is our "dummy" sigstop. this is likely not - // necessarily true. - // - if(thread->expecting_dummy_sigstop) - { - thread->expecting_dummy_sigstop = 0; - done = 0; - } - else if(dmn_lnx_state->has_halt_injection) - { - e_kind = DMN_EventKind_Halt; - } - else - { - // TODO(rjf): study this case; old notes: - // - // a signal we don't want to mess with (except to record that it - // happened maybe) we should "hand it back" - } - } - - //- rjf: WSTOPSIG(status) is an unrecoverable exception (unless user does something to fix state first) - else if(wifstopped) - { - e_kind = DMN_EventKind_Exception; - } - else - { - Assert(0 && "unexpected stop code"); - } - - dmn_lnx_state->last_event_kind = e_kind; - dmn_lnx_state->last_stop_pid = wait_id; - dmn_lnx_state->last_sig_code = wstopsig; - - if(wait_for_group_stop) - { - if(is_group_stop) - { - done = 1; - } - } - else - { - done = 1; - } - - if(e_kind == DMN_EventKind_Breakpoint) - { - U64 ip = dmn_lnx_thread_read_ip(thread); - for EachNode(active_trap, DMN_ActiveTrap, active_traps) - { - if(active_trap->trap->vaddr == ip-1) - { - hit_user_trap = active_trap->trap; - break; - } - } - } - - // is this a probe trap? - if(e_kind == DMN_EventKind_Breakpoint) - { - // find which probe was triggered - U64 ip = dmn_lnx_thread_read_ip(thread); - DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; - for EachIndex(i, ArrayCount(process->probe_vaddrs)) - { - if(process->probe_vaddrs[i] == ip-1) - { - probe_type = i; - break; - } - } - - if(probe_type == DMN_LNX_ProbeType_InitComplete) - { - U64 name_space_id = 0, rdebug_addr = 0; - DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_InitComplete]; - if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) - { - if(stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) - { - GNU_RDebugInfo64 rdebug = {0}; - if(dmn_lnx_read_r_debug(process->fd, rdebug_addr, process->arch, &rdebug)) - { - if(rdebug.r_version == 1) - { - dmn_lnx_process_loaded_modules(arena, evts, process, name_space_id, rdebug.r_map); - } - else { Assert(0 && "unexpected version number"); } - } - else { Assert(0 && "failed to read rdebug"); } - } - else { Assert(0 && "failed to parse second argument"); } - } - else { Assert(0 && "failed to parse first argument"); } - } - else if(probe_type == DMN_LNX_ProbeType_RelocComplete) - { - U64 name_space_id = 0, new_link_map_addr = 0; - DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_RelocComplete]; - if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) - { - if(stap_read_arg_u(probe->args.v[2], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) - { - dmn_lnx_process_loaded_modules(arena, evts, process, name_space_id, new_link_map_addr); - } - else { Assert(0 && "failed to parse third argument"); } - } - else { Assert(0 && "failed to parse first argument"); } - } - else if(probe_type == DMN_LNX_ProbeType_UnmapComplete) - { - // read probe's arguments - U64 name_space_id = 0, rdebug_vaddr = 0; - DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_UnmapComplete]; - if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) - { - if(stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) - { - dmn_lnx_process_unloaded_modules(arena, evts, process, name_space_id, rdebug_vaddr); - } - else { Assert(0 && "failed to read second argument"); } - } - else { Assert(0 && "failed to read first argument"); } - } - - if(probe_type != DMN_LNX_ProbeType_Null) {break;} - } - - // rollback IP on user traps - if(hit_user_trap) - { - U64 ip = dmn_lnx_thread_read_ip(thread); - dmn_lnx_thread_write_ip(thread, ip - 1); - } - - switch(e_kind) - { - case DMN_EventKind_COUNT: - case DMN_EventKind_Null: break; - case DMN_EventKind_Error: - case DMN_EventKind_HandshakeComplete: - case DMN_EventKind_LoadModule: - case DMN_EventKind_UnloadModule: - {InvalidPath;}break; - case DMN_EventKind_Trap: - case DMN_EventKind_Memory: - case DMN_EventKind_SetThreadName: - case DMN_EventKind_SetThreadColor: - case DMN_EventKind_SetBreakpoint: - case DMN_EventKind_UnsetBreakpoint: - case DMN_EventKind_SetVAddrRangeNote: - case DMN_EventKind_DebugString: - { - NotImplemented; - }break; - case DMN_EventKind_SingleStep: - { - // clear single step flag - dmn_lnx_set_single_step_flag(thread, 0); - - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = e_kind; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); - }break; - case DMN_EventKind_Breakpoint: - { - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = e_kind; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); - }break; - case DMN_EventKind_Halt: - { - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = DMN_EventKind_Halt; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - }break; - case DMN_EventKind_Exception: - { - // TODO(rjf): possible cases: - // SIGABRT - // SIGFPE - // SIGSEGV - // SIGILL - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = DMN_EventKind_Exception; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); - e->signo = wstopsig; - }break; - case DMN_EventKind_CreateProcess: - { - NotImplemented; - }break; - case DMN_EventKind_ExitProcess: - { - // rjf: generate exit-thread / unload-module events - for(DMN_LNX_Entity *child = process->first; child != &dmn_lnx_nil_entity; child = child->next) - { - switch(child->kind) - { - default:{}break; - case DMN_LNX_EntityKind_Thread: - { - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(child); - }break; - case DMN_LNX_EntityKind_Module: - { - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->module = dmn_lnx_handle_from_entity(child); - // TODO(rjf): e->string = ...; - }break; - } - } - - // rjf: generate exit process event - { - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_lnx_handle_from_entity(process); - e->code = exit_code; - } - - // rjf: eliminate entity tree - dmn_lnx_entity_release(process); - }break; - case DMN_EventKind_CreateThread: - { - DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); - thread->id = new_pid; - thread->arch = process->arch; - thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); - dmn_lnx_thread_read_reg_block(thread, thread->reg_block); - - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->arch = thread->arch; - e->code = thread->id; - }break; - case DMN_EventKind_ExitThread: - { - DMN_Event *e = dmn_event_list_push(arena, evts); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - dmn_lnx_entity_release(thread); - }break; - } - } -} - internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { Temp scratch = scratch_begin(&arena, 1); - DMN_EventList evts = {0}; + + DMN_EventList events = {0}; + dmn_access_open(); - //////////////////////////// - //- rjf: push any deferred events - // - { - for EachNode(n, DMN_EventNode, dmn_lnx_state->deferred_events.first) - { - DMN_Event *e_src = &n->v; - DMN_Event *e_dst = dmn_event_list_push(arena, &evts); - MemoryCopyStruct(e_dst, e_src); - e_dst->string = str8_copy(arena, e_dst->string); - } - MemoryZeroStruct(&dmn_lnx_state->deferred_events); - arena_clear(dmn_lnx_state->deferred_events_arena); - } - - //////////////////////////// - //- rjf: no processes, no output events -> not attached - // - if(evts.count == 0 && dmn_lnx_state->entities_base->first == &dmn_lnx_nil_entity) - { - DMN_Event *e = dmn_event_list_push(arena, &evts); - e->kind = DMN_EventKind_Error; - e->error_kind = DMN_ErrorKind_NotAttached; - } - - //////////////////////////// - //- rjf: determine if we need to wait for new events - // - B32 need_wait_on_events = (evts.count == 0); - - //////////////////////////// - //- rjf: write all traps into memory - // + // write traps to memory DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; - ProfScope("write all traps into memory") + HashTable *active_trap_ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); { - HashTable *ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) { for EachIndex(n_idx, n->count) { + // skip hardware breakpoints DMN_Trap *trap = n->v+n_idx; - - if(trap->flags == 0) + if(trap->flags) { continue; } + + // TODO: ctrl sends down duplicate traps + DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); + if(is_set) { continue; } + + // TODO: ctrl sends down traps for exited process + DMN_LNX_Entity *process = dmn_lnx_entity_from_handle(trap->process); + if(process == dmn_lnx_nil_entity) { continue; } + + // read original instruction bytes + String8 trap_inst = dmn_get_trap_inst(); + U8 *swap_bytes = push_array(scratch.arena, U8, trap_inst.size); + if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+trap_inst.size), swap_bytes) != trap_inst.size) { - DMN_ActiveTrap *is_set = hash_table_search_u64_raw(ht, trap->vaddr); - if(is_set) { continue; } - - U8 swap_byte = 0; - if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &swap_byte) > 0) - { - U8 int3 = 0xCC; - if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3)) - { - DMN_ActiveTrap *active_trap = push_array(scratch.arena, DMN_ActiveTrap, 1); - active_trap->trap = trap; - active_trap->swap_byte = swap_byte; - SLLQueuePush(active_trap_first, active_trap_last, active_trap); - - hash_table_push_u64_raw(scratch.arena, ht, trap->vaddr, active_trap); - } else { Assert(0 && "failed to write trap"); } - } else { Assert(0 && "failed to read original byte"); } + Assert(0 && "failed to read original byte"); + continue; } + + // replace with trap instruction bytes + if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+trap_inst.size), trap_inst.str) != trap_inst.size) + { + Assert(0 && "failed to write trap"); + continue; + } + + // add trap to the active list + DMN_ActiveTrap *active_trap = push_array(scratch.arena, DMN_ActiveTrap, 1); + active_trap->trap = trap; + active_trap->swap_bytes = str8(swap_bytes, trap_inst.size); + SLLQueuePush(active_trap_first, active_trap_last, active_trap); + + // add (address -> trap) + hash_table_push_u64_raw(scratch.arena, active_trap_ht, trap->vaddr, active_trap); } } } - - //////////////////////////// - //- enable single stepping + + // enable single stepping if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) { DMN_LNX_Entity *single_step_thread = dmn_lnx_entity_from_handle(ctrls->single_step_thread); dmn_lnx_set_single_step_flag(single_step_thread, 1); } - - //////////////////////////// - //- rjf: gather all threads which we should run - // - DMN_LNX_EntityList run_threads = {0}; - if(need_wait_on_events) ProfScope("gather all threads which we should run") + + // schedule threads to run + DMN_LNX_EntityList running_threads = {0}; { - //- rjf: scan all processes - for(DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; process != &dmn_lnx_nil_entity; process = process->next) + for(DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; process != dmn_lnx_nil_entity; process = process->next) { if(process->kind != DMN_LNX_EntityKind_Process) { continue; } @@ -2476,131 +2261,371 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } } - - //- rjf: scan all threads in this process - for(DMN_LNX_Entity *thread = process->first; thread != &dmn_lnx_nil_entity; thread = thread->next) + + if(!process_is_frozen && process->thread_count == 0) { - if(thread->kind != DMN_LNX_EntityKind_Thread) { continue; } - + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, (pid_t)process->id, 0, 0)) < 0) { InvalidPath; } + break; + } + + for(DMN_LNX_Entity *thread = process->first; thread != dmn_lnx_nil_entity; thread = thread->next) + { + if(thread->kind != DMN_LNX_EntityKind_Thread) { continue; } + if(thread->thread_state == DMN_LNX_ThreadState_WaitForVFrok) { continue; } + //- rjf: determine if this thread is frozen B32 is_frozen = 0; + + // rjf: not single-stepping? determine based on run controls freezing info + if(dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) { - // rjf: single-step? freeze if not the single-step thread. - if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) + if(ctrls->run_entities_are_processes) { - is_frozen = !dmn_handle_match(dmn_lnx_handle_from_entity(thread), ctrls->single_step_thread); + is_frozen = process_is_frozen; } - - // rjf: not single-stepping? determine based on run controls freezing info - else + else { - if(ctrls->run_entities_are_processes) + for EachIndex(idx, ctrls->run_entity_count) { - is_frozen = process_is_frozen; - } - else - { - for EachIndex(idx, ctrls->run_entity_count) + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(thread))) { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(thread))) - { - is_frozen = 1; - break; - } + is_frozen = 1; + break; } } - if(ctrls->run_entities_are_unfrozen) + } + if(ctrls->run_entities_are_unfrozen) + { + is_frozen ^= 1; + } + } + // rjf: single-step? freeze if not the single-step thread. + else + { + is_frozen = !dmn_handle_match(dmn_lnx_handle_from_entity(thread), ctrls->single_step_thread); + } + + // resume thread + if(!is_frozen) + { + AssertAlways(thread->thread_state == DMN_LNX_ThreadState_Stopped); + + // write registers + if(thread->is_reg_block_dirty) + { + thread->is_reg_block_dirty = !dmn_lnx_thread_write_reg_block(thread); + } + + // pass signal to the child process + void *sig_code = 0; + if(thread->pass_through_signal) + { + thread->pass_through_signal = 0; + if(!ctrls->ignore_previous_exception) { - is_frozen ^= 1; + sig_code = (void *)(uintptr_t)thread->pass_through_signo; + } + } + + // resume thread + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, (pid_t)thread->id, 0, sig_code)) >= 0) + { + thread->thread_state = DMN_LNX_ThreadState_Running; + thread->is_reg_block_dirty = 1; + dmn_lnx_entity_list_push(scratch.arena, &running_threads, thread); + } + else + { + if(errno == ESRCH) + { + // Race note: In multithreaded programs, ptrace(PTRACE_CONT) may fail if a running thread calls + // exit_group while we are resuming threads. The kernel begins tearing down the thread group so + // the target might not be in a ptrace-soppped state anymore. Handle this by ignoring, on waitpid + // we will get chance to report exit event. + // + // TODO: unfortunatley, kernel also sends us ESRCH whenever ptrace(PTRACE_CONT) is sent to a tracee + // that is not in a ptace-stop, so how can we tell these errors apart? + } + else + { + InvalidPath; } } } - - //- rjf: add to list - if(!is_frozen) + } + } + } + + // wait for signals from the running threads + { + U64 stopped_threads = 0; + B32 is_halt_done = 0; + do + { + // do not wait if there are no processes + if(dmn_lnx_state->pending_stopsig.count == 0 && dmn_lnx_state->pending_creation.count == 0 && dmn_lnx_state->active_process_count == 0) + { + dmn_lnx_handle_not_attached(arena, &events); + break; + } + + dmn_access_close(); + + // wait for a signal + int status = 0; + pid_t wait_id = 0; + for(;;) + { + wait_id = OS_LNX_RETRY_ON_EINTR(waitpid(-1, &status, __WALL|__WNOTHREAD)); + if(wait_id == -1) { InvalidPath; } // TODO: graceful exit + break; + } + + dmn_access_open(); + + // unpack status + int wifexited = WIFEXITED(status); + int wifsignaled = WIFSIGNALED(status); + int wifstopped = WIFSTOPPED(status); + int wstopsig = WSTOPSIG(status); + int event_code = (status >> 16); + + // intercept our SIGSTOP and signal tracee to continue to execve + if(wstopsig == SIGSTOP) + { + B32 is_pending_launch = 0; + for EachNode(n, DMN_LNX_ProcessLaunch, dmn_lnx_state->pending_stopsig.first) { - dmn_lnx_entity_list_push(scratch.arena, &run_threads, thread); + if(n->pid == wait_id) + { + // move node to the pending creation list + dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_stopsig, n); + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_creation, n); + + // set trace options + // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFROK | PTRACE_O_TRACEVFORKDONE + void *trace_options = (void *)(PTRACE_O_EXITKILL | PTRACE_O_TRACEEXEC | PTRACE_O_TRACECLONE); + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETOPTIONS, wait_id, 0, trace_options)) < 0) { Assert(0 && "failed to set options"); InvalidPath; } + + // signal process to continue to execve + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, wait_id, 0, 0)) < 0) { InvalidPath; } + + is_pending_launch = 1; + + break; + } + } + if(is_pending_launch) { continue; } + } + + if(wifstopped || wifsignaled || wifexited) + { + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); + + // kernel may send multiple stop signals for the same thread, + // so count first stop signal and ignore subsequent signals + B32 is_first_thread_to_stop = 0; + if(thread->thread_state == DMN_LNX_ThreadState_Running) + { + is_first_thread_to_stop = (stopped_threads == 0); + stopped_threads += 1; + } + + // update thread state + if(thread != dmn_lnx_nil_entity) + { + if(wifstopped && !wifsignaled && !wifexited) + { + thread->thread_state = DMN_LNX_ThreadState_Stopped; + } + else if(!wifstopped && (wifsignaled || wifexited)) + { + thread->thread_state = DMN_LNX_ThreadState_Exited; + } + else { InvalidPath; } + } + + // stop all other threads + if(is_first_thread_to_stop) + { + for EachNode(thread, DMN_LNX_EntityNode, running_threads.first) + { + if(thread->v->thread_state == DMN_LNX_ThreadState_Running) + { + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, thread->v->id, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } + } + } } } - } - } - - //////////////////////////// - //- rjf: resume all threads we need to run - // - DMN_LNX_EntityList ran_threads = {0}; - for EachNode(n, DMN_LNX_EntityNode, run_threads.first) - { - DMN_LNX_Entity *thread = n->v; - - // update registers - if(!dmn_lnx_thread_write_reg_block(thread, thread->reg_block)) { Assert(0 && "failed to write thread's registers"); } - - // pass signal to the child process - void *sig_code = 0; - if(dmn_lnx_state->last_event_kind == DMN_EventKind_Exception && dmn_lnx_state->last_stop_pid == thread->id) - { - sig_code = (void *)(uintptr_t)dmn_lnx_state->last_sig_code; - } - - // resume thread - if (ptrace(PTRACE_CONT, (pid_t)thread->id, 0, (void *)sig_code) < 0) { Assert(0 && "failed to resume a thread"); } - - dmn_lnx_entity_list_push(scratch.arena, &ran_threads, thread); - } - - //////////////////////////// - //- rjf: loop: wait for next stop, produce debug events - // - if(need_wait_on_events) - { - dmn_lnx_wait_for_events(arena, &evts, -1, 0, active_trap_first); - } - - //////////////////////////// - //- rjf: stop all threads - // - { - B32 was_interrupt_issued = 0; - for EachNode(n, DMN_LNX_EntityNode, ran_threads.first) - { - if(n->v->id != dmn_lnx_state->last_stop_pid) + + // normal child exit via _exit or exit() + if(wifexited) { - if(ptrace(PTRACE_INTERRUPT, n->v->id, 0, 0) >= 0) + dmn_lnx_handle_exit_thread(arena, &events, wait_id, WEXITSTATUS(status)); + } + + // exit because child did not handle a signal + else if(wifsignaled) + { + dmn_lnx_handle_exit_thread(arena, &events, wait_id, WTERMSIG(status)); + } + // thread or group stop + else if(wifstopped) + { + // read thread registers { - was_interrupt_issued = 1; + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); + if(thread != dmn_lnx_nil_entity) + { + thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); + Assert(!thread->is_reg_block_dirty); + } + } + + if(wstopsig == SIGTRAP) + { + switch(event_code) + { + case 0: + { + // translate signal code to DEMON event + siginfo_t siginfo = {0}; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) + { + switch(siginfo.si_code) + { + case SI_KERNEL: { dmn_lnx_handle_breakpoint(arena, &events, active_trap_ht, wait_id); } break; + case TRAP_BRKPT: { dmn_lnx_handle_breakpoint(arena, &events, active_trap_ht, wait_id); } break; + case TRAP_TRACE: { dmn_lnx_handle_single_step(arena, &events, wait_id); } break; + case TRAP_HWBKPT: { dmn_lnx_handle_data_breakpoint(arena, &events, wait_id); } break; + case TRAP_BRANCH: { NotImplemented; }break; + case TRAP_UNK: { NotImplemented; }break; + default: { InvalidPath; } break; + } + } else { Assert(0 && "failed to get signal info"); } + }break; + case PTRACE_EVENT_FORK: + { + NotImplemented; + }break; + case PTRACE_EVENT_VFORK: + { + NotImplemented; + }break; + case PTRACE_EVENT_CLONE: + { + pid_t new_pid; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid)) >= 0) + { + dmn_lnx_handle_create_thread(arena, &events, wait_id, new_pid); + } + else { Assert(0 && "failed to get new tid"); } + }break; + case PTRACE_EVENT_EXEC: + { + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); + DMN_LNX_Entity *process = thread->parent; + + if(process == dmn_lnx_nil_entity) + { + dmn_lnx_handle_create_process(arena, &events, wait_id); + } + else + { + if(process->debug_subprocesses) + { + dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); + dmn_lnx_handle_create_process(arena, &events, wait_id); + } + else + { + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, wait_id, 0, 0)) >= 0) + { + dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); + } + else { Assert(0 && "failed to detach"); } + } + } + }break; + case PTRACE_EVENT_VFORK_DONE: + { + NotImplemented; + }break; + case PTRACE_EVENT_EXIT: + { + AssertAlways(0 && "exit tracing is disabled, this event should not be delivered"); + }break; + case PTRACE_EVENT_SECCOMP: + { + NotImplemented; + }break; + case PTRACE_EVENT_STOP: + { + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); + DMN_LNX_Entity *process = thread->parent; + if(process->expect_user_interrupt) + { + process->expect_user_interrupt = 0; + dmn_lnx_handle_halt(arena, &events); + } + }break; + default: { Assert(0 && "unexpected ptrace code"); } break; + } + } + else if(wstopsig == SIGSTOP) + { + siginfo_t siginfo = {0}; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) + { + // finish halting if this is our SIGSTOP + if(siginfo.si_pid == dmn_lnx_state->halter_tid) + { + is_halt_done = 1; + } + else + { + // TODO: handle SIGSTOP + } + } + } + else + { + dmn_lnx_handle_exception(arena, &events, wait_id, wstopsig); } - else { Assert(0 && "failed to interrupt thread"); } } - } - if(was_interrupt_issued) + else { Assert(0 && "unexpected stop code"); } + } while(stopped_threads < running_threads.count); + + // finalize halter state + if(is_halt_done) { - dmn_lnx_wait_for_events(arena, &evts, -1, 1, active_trap_first); + // push event + dmn_lnx_handle_halt(arena, &events); + + // reset state + dmn_lnx_state->halter_tid = 0; + dmn_lnx_state->halt_code = 0; + dmn_lnx_state->halt_user_data = 0; + dmn_lnx_state->is_halting = 0; } } - - // update registers - for EachNode(n, DMN_LNX_EntityNode, ran_threads.first) + + // restore original instruction bytes + for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) { - dmn_lnx_thread_read_reg_block(n->v, n->v->reg_block); - } - - ////////////////////////// - //- rjf: restore original memory at trap locations - // - ProfScope("restore original memory at trap locations") - { - for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) + // skip process that exited during the wait + DMN_LNX_Entity *process = dmn_lnx_entity_from_handle(active_trap->trap->process); + if(process == dmn_lnx_nil_entity) { continue; } + + if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str)) { - if(!dmn_process_write_struct(active_trap->trap->process, active_trap->trap->vaddr, &active_trap->swap_byte)) - { - Assert(0 && "failed to restore original memory"); - } + Assert(0 && "failed to restore original instruction bytes"); } } + dmn_access_close(); scratch_end(scratch); - return evts; + return events; } //////////////////////////////// @@ -2609,20 +2634,21 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) internal void dmn_halt(U64 code, U64 user_data) { - if(!dmn_lnx_state->has_halt_injection) + dmn_ctrl_exclusive_access_begin(); + + if(!dmn_lnx_state->is_halting && dmn_lnx_state->active_process_count > 0) { - DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; - if(process != &dmn_lnx_nil_entity) + dmn_lnx_state->halter_tid = gettid(); + dmn_lnx_state->halt_code = code; + dmn_lnx_state->halt_user_data = user_data; + for (DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; process != dmn_lnx_nil_entity; process = process->next) { - union sigval sv = {0}; - if(sigqueue(process->id, SIGSTOP, sv) != -1) - { - dmn_lnx_state->has_halt_injection = 1; - dmn_lnx_state->halt_code = code; - dmn_lnx_state->halt_user_data = user_data; - } + if(process->kind != DMN_LNX_EntityKind_Process) { continue; } + if(OS_LNX_RETRY_ON_EINTR(kill(process->id, SIGSTOP)) < 0) { Assert(0 && "failed to send SIGSTOP"); } } } + + dmn_ctrl_exclusive_access_end(); } //////////////////////////////// @@ -2726,14 +2752,10 @@ dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) B32 result = 0; DMN_AccessScope { - DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); - U64 reg_block_size = regs_block_size_from_arch(thread->arch); - if(thread == &dmn_lnx_nil_entity) - { - MemoryZero(reg_block, reg_block_size); - } - else + DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); + if(thread != dmn_lnx_nil_entity) { + U64 reg_block_size = regs_block_size_from_arch(thread->arch); MemoryCopy(reg_block, thread->reg_block, reg_block_size); } result = 1; @@ -2749,13 +2771,14 @@ dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) { DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); U64 reg_block_size = regs_block_size_from_arch(thread->arch); - if(thread == &dmn_lnx_nil_entity) + if(thread == dmn_lnx_nil_entity) { MemoryZero(reg_block, reg_block_size); } else { MemoryCopy(thread->reg_block, reg_block, reg_block_size); + thread->is_reg_block_dirty = 1; } result = 1; } diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index a53d587a..93ec1016 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -11,19 +11,6 @@ #include #include -//////////////////////////////// -//~ SIGTRAP codes - -enum -{ - DMN_LNX_SigTrapCode_Brkpt = 1, - DMN_LNX_SigTrapCode_Trace = 2, - DMN_LNX_SigTrapCode_Branch = 3, - DMN_LNX_SigTrapCode_HwBkpt = 4, - DMN_LNX_SigTrapCode_Unk = 5, - DMN_LNX_SigTrapCode_Perf = 6 -} DMN_LNX_SigTrapCode; - //////////////////////////////// //~ rjf: Register Layouts // @@ -143,7 +130,7 @@ typedef struct DMN_LNX_PhdrInfo DMN_LNX_PhdrInfo; struct DMN_LNX_PhdrInfo { Rng1U64 range; - U64 dynamic; + U64 dynamic; }; typedef struct DMN_LNX_DynamicInfo DMN_LNX_DynamicInfo; @@ -171,39 +158,60 @@ typedef enum DMN_LNX_EntityKind } DMN_LNX_EntityKind; +typedef enum DMN_LNX_ThreadState +{ + DMN_LNX_ThreadState_Null, + DMN_LNX_ThreadState_Running, + DMN_LNX_ThreadState_Stopped, + DMN_LNX_ThreadState_Exited, + DMN_LNX_ThreadState_WaitForVFrok, +} DMN_LNX_ThreadState; + typedef struct DMN_LNX_Entity DMN_LNX_Entity; struct DMN_LNX_Entity { + // entity hierarchy DMN_LNX_Entity *first; DMN_LNX_Entity *last; DMN_LNX_Entity *next; DMN_LNX_Entity *prev; DMN_LNX_Entity *parent; + + // common DMN_LNX_EntityKind kind; - U32 gen; - Arch arch; - U64 id; + U32 gen; + Arch arch; + U64 id; // process - Arena *arena; - int fd; - pid_t tracer_tid; - B32 expect_rdebug_data_breakpoint; - U64 rdebug_vaddr; - U64 rdebug_brk_vaddr; - ELF_Class dl_class; - HashTable *loaded_modules_ht; + Arena *arena; + int fd; + pid_t tracer_tid; + B32 debug_subprocesses; + B32 expect_user_interrupt; + B32 expect_rdebug_data_breakpoint; + U64 rdebug_vaddr; + U64 rdebug_brk_vaddr; + ELF_Class dl_class; + HashTable *loaded_modules_ht; DMN_LNX_Probe **probes; - U64 probe_vaddrs[DMN_LNX_ProbeType_Count]; + U64 probe_vaddrs[DMN_LNX_ProbeType_Count]; + U64 main_thread_exit_code; + U64 thread_count; // process x64 - U64 xcr0; - U64 xsave_size; + U64 xcr0; + U64 xsave_size; X64_XSaveLayout xsave_layout; // thread - B32 expecting_dummy_sigstop; - void *reg_block; + void *reg_block; + B32 expecting_dummy_sigstop; + B32 is_main_thread; + B32 is_reg_block_dirty; + B32 pass_through_signal; + U64 pass_through_signo; + DMN_LNX_ThreadState thread_state; // module U64 base_vaddr; @@ -217,13 +225,13 @@ typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode; struct DMN_LNX_EntityNode { DMN_LNX_EntityNode *next; - DMN_LNX_Entity *v; + DMN_LNX_Entity *v; }; typedef struct DMN_LNX_EntityList DMN_LNX_EntityList; struct DMN_LNX_EntityList { - U64 count; + U64 count; DMN_LNX_EntityNode *first; DMN_LNX_EntityNode *last; }; @@ -231,38 +239,69 @@ struct DMN_LNX_EntityList //////////////////////////////// //~ rjf: Main State Bundle +typedef struct DMN_LNX_ProcessLaunch DMN_LNX_ProcessLaunch; +struct DMN_LNX_ProcessLaunch +{ + B32 debug_subprocesses; + pid_t pid; + DMN_LNX_ProcessLaunch *next; + DMN_LNX_ProcessLaunch *prev; +}; + +typedef struct DMN_LNX_ProcessLaunchList DMN_LNX_ProcessLaunchList; +struct DMN_LNX_ProcessLaunchList +{ + U64 count; + DMN_LNX_ProcessLaunch *first; + DMN_LNX_ProcessLaunch *last; +}; + +typedef struct DMN_LNX_Halt +{ + pid_t halter_pid; +} DMN_LNX_Halt; + typedef struct DMN_LNX_State DMN_LNX_State; struct DMN_LNX_State { Arena *arena; - + + pid_t tracer_tid; + // rjf: access locking mechanism Mutex access_mutex; - B32 access_run_state; - - // rjf: deferred events - Arena *deferred_events_arena; - DMN_EventList deferred_events; - - // rjf: entity storage - Arena *entities_arena; - DMN_LNX_Entity *entities_base; - U64 entities_count; - DMN_LNX_Entity *free_entity; - - // rjf: halting mechanism - B32 has_halt_injection; - U64 halt_code; - U64 halt_user_data; + B32 access_run_state; - DMN_EventKind last_event_kind; - pid_t last_stop_pid; - int last_sig_code; + // rjf: entity storage + Arena *entities_arena; + DMN_LNX_Entity *entities_base; + DMN_LNX_Entity *free_entity; + U64 entities_count; + HashTable *tid_ht; // thread id -> thread entity + HashTable *pid_ht; // process id -> process entity + + // pid tracking + U64 active_process_count; + DMN_LNX_ProcessLaunchList pending_stopsig; + DMN_LNX_ProcessLaunchList pending_creation; + DMN_LNX_ProcessLaunchList active_pids; + DMN_LNX_ProcessLaunchList free_pids; + + // halter + pid_t halter_tid; + U64 halt_code; + U64 halt_user_data; + B32 is_halting; }; -read_only global DMN_LNX_Entity dmn_lnx_nil_entity = {&dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity}; -global DMN_LNX_State *dmn_lnx_state = 0; -thread_static B32 dmn_lnx_ctrl_thread = 0; +//////////////////////////////// +//~ Globals + +global DMN_LNX_State *dmn_lnx_state = 0; +thread_static B32 dmn_lnx_ctrl_thread = 0; + +read_only global DMN_LNX_Entity dmn_lnx_nil_entity_ = {&dmn_lnx_nil_entity_, &dmn_lnx_nil_entity_, &dmn_lnx_nil_entity_, &dmn_lnx_nil_entity_, &dmn_lnx_nil_entity_}; +read_only global DMN_LNX_Entity *dmn_lnx_nil_entity = &dmn_lnx_nil_entity_; //////////////////////////////// //~ rjf: Helpers @@ -298,6 +337,8 @@ internal DMN_LNX_PhdrInfo dmn_lnx_phdr_info_from_memory(int memory_fd, ELF internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr); +internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); + //////////////////////////////// //~ rjf: Entity Functions @@ -309,10 +350,10 @@ internal DMN_LNX_Entity *dmn_lnx_thread_from_pid(pid_t pid); internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread); internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread); -internal B32 dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip); -internal B32 dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp); -internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block); -internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block); +internal void dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip); +internal void dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp); +internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread); +internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread); //////////////////////////////// From 533e7431e714d9d734a0163612ab4637128658d9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 19 Nov 2025 13:01:25 -0800 Subject: [PATCH 078/850] WIP switch to special mutex for syncing halts --- src/demon/linux/demon_core_linux.c | 23 +++++++++++------------ src/demon/linux/demon_core_linux.h | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 5683c239..35325711 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -2018,6 +2018,7 @@ dmn_init(void) dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0); dmn_lnx_state->tid_ht = hash_table_init(dmn_lnx_state->arena, 0x2000); dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); + dmn_lnx_state->halter_mutex = mutex_alloc(); dmn_lnx_entity_alloc(dmn_lnx_nil_entity, DMN_LNX_EntityKind_Root); } @@ -2181,10 +2182,11 @@ dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { + Assert(gettid() == dmn_lnx_state->tracer_tid); Temp scratch = scratch_begin(&arena, 1); - DMN_EventList events = {0}; - dmn_access_open(); + + mutex_take(dmn_lnx_state->halter_mutex); // write traps to memory DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; @@ -2270,8 +2272,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) for(DMN_LNX_Entity *thread = process->first; thread != dmn_lnx_nil_entity; thread = thread->next) { - if(thread->kind != DMN_LNX_EntityKind_Thread) { continue; } - if(thread->thread_state == DMN_LNX_ThreadState_WaitForVFrok) { continue; } + if(thread->kind != DMN_LNX_EntityKind_Thread) { continue; } //- rjf: determine if this thread is frozen B32 is_frozen = 0; @@ -2369,7 +2370,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) break; } - dmn_access_close(); + mutex_drop(dmn_lnx_state->halter_mutex); // wait for a signal int status = 0; @@ -2381,7 +2382,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) break; } - dmn_access_open(); + mutex_take(dmn_lnx_state->halter_mutex); // unpack status int wifexited = WIFEXITED(status); @@ -2623,7 +2624,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } - dmn_access_close(); + mutex_drop(dmn_lnx_state->halter_mutex); scratch_end(scratch); return events; } @@ -2634,9 +2635,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) internal void dmn_halt(U64 code, U64 user_data) { - dmn_ctrl_exclusive_access_begin(); - - if(!dmn_lnx_state->is_halting && dmn_lnx_state->active_process_count > 0) + mutex_take(dmn_lnx_state->halter_mutex); + if(dmn_lnx_state->active_process_count) { dmn_lnx_state->halter_tid = gettid(); dmn_lnx_state->halt_code = code; @@ -2647,8 +2647,7 @@ dmn_halt(U64 code, U64 user_data) if(OS_LNX_RETRY_ON_EINTR(kill(process->id, SIGSTOP)) < 0) { Assert(0 && "failed to send SIGSTOP"); } } } - - dmn_ctrl_exclusive_access_end(); + mutex_drop(dmn_lnx_state->halter_mutex); } //////////////////////////////// diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 93ec1016..8f9867fd 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -164,7 +164,6 @@ typedef enum DMN_LNX_ThreadState DMN_LNX_ThreadState_Running, DMN_LNX_ThreadState_Stopped, DMN_LNX_ThreadState_Exited, - DMN_LNX_ThreadState_WaitForVFrok, } DMN_LNX_ThreadState; typedef struct DMN_LNX_Entity DMN_LNX_Entity; @@ -288,6 +287,7 @@ struct DMN_LNX_State DMN_LNX_ProcessLaunchList free_pids; // halter + Mutex halter_mutex; pid_t halter_tid; U64 halt_code; U64 halt_user_data; From 6fa71607e236aaa7a8cd31f7da791c4a8b563400 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 21 Nov 2025 16:10:28 -0800 Subject: [PATCH 079/850] do not emit global vars for decls --- src/rdi_from_dwarf/rdi_from_dwarf.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 45f13d62..570d01ca 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2479,6 +2479,10 @@ d2r_convert_symbols(Arena *arena, // NOTE: due to a bug in clang in stb_sprint.h local variables // are declared in global scope without a name if (name.size == 0) { break; } + + // decls do not have location info + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { break; } U64 voff = max_U64; B32 is_thread_var = 0; From 7347d2f1bc0d218b3f0fb33ed9f591852e13117b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 21 Nov 2025 16:11:16 -0800 Subject: [PATCH 080/850] pipe DW_ExprOp_FormTlsAddress through DW_ExprOp_GNU_PushTlsAddress --- src/rdi_from_dwarf/rdi_from_dwarf.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 570d01ca..0c01d6be 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1264,10 +1264,6 @@ d2r_bytecode_from_expression(Arena *arena, rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_FrameOff, 0); d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); } break; - case DW_ExprOp_FormTlsAddress: { - // TODO: - AssertAlways(!"RDI_EvalOp_TLSOff accepts immediate"); - } break; case DW_ExprOp_PushObjectAddress: { AssertAlways(!"sample"); } break; @@ -1359,6 +1355,7 @@ d2r_bytecode_from_expression(Arena *arena, stack->top->type = d2r_unsigned_value_type_from_bit_size(address_size * 8); } } break; + case DW_ExprOp_FormTlsAddress: case DW_ExprOp_GNU_PushTlsAddress: { D2R_ValueType lhs = d2r_value_type_stack_pop(stack); if (!D2R_ValueType_IsInt(lhs)) { From 0565fdef0a8470c56f9a3f95968c0d461ccc2170 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 21 Nov 2025 16:41:35 -0800 Subject: [PATCH 081/850] WIP add support for GNU LibC TLS model Unlike on Windows, TLS index isn't part of the module format. glibc stores it in the opaque link_map struct. There are many different heuristics a debugger can use to locate it but most of them are unreliable and prone to errors, or don't work when debugger attaches to a process. We adopt the newer approach of looking for special symbols in glibc that provide TLS index offset. These symbols were added in 2021, so programs linked with older glibc won't have TLS support. --- src/ctrl/ctrl_core.c | 88 +++++--------- src/ctrl/ctrl_core.h | 22 +++- src/dbg_engine/dbg_engine_core.c | 116 ++++++++---------- src/demon/demon_core.h | 14 +++ src/demon/linux/demon_core_linux.c | 187 +++++++++++++++++++---------- src/demon/linux/demon_core_linux.h | 15 +++ src/demon/win32/demon_core_win32.c | 156 ++++++++++++++++-------- src/demon/win32/demon_core_win32.h | 1 + 8 files changed, 361 insertions(+), 238 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 779f4761..06b3dcba 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -60,6 +60,20 @@ ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind) return result; } +internal CTRL_TlsModel +ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type) +{ + CTRL_TlsModel result = CTRL_TlsModel_Null; + switch(type) + { + default:{}break; + case DMN_TlsModel_Null: {result = CTRL_TlsModel_Null;}break; + case DMN_TlsModel_WinodwsNt: {result = CTRL_TlsModel_WinodwsNt;}break; + case DMN_TlsModel_Gnu: {result = CTRL_TlsModel_Gnu;}break; + } + return result; +} + internal String8 ctrl_string_from_event_kind(CTRL_EventKind kind) { @@ -616,6 +630,9 @@ ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max) str8_serial_push_struct(scratch.arena, &srl, &event->exception_code); str8_serial_push_struct(scratch.arena, &srl, &event->rgba); str8_serial_push_struct(scratch.arena, &srl, &event->bp_flags); + str8_serial_push_struct(scratch.arena, &srl, &event->tls_model); + str8_serial_push_struct(scratch.arena, &srl, &event->tls_index); + str8_serial_push_struct(scratch.arena, &srl, &event->tls_offset); String8 string = event->string; string.size = Min(string.size, max-srl.total_size); str8_serial_push_struct(scratch.arena, &srl, &string.size); @@ -649,6 +666,9 @@ ctrl_event_from_serialized_string(Arena *arena, String8 string) read_off += str8_deserial_read_struct(string, read_off, &event.exception_code); read_off += str8_deserial_read_struct(string, read_off, &event.rgba); read_off += str8_deserial_read_struct(string, read_off, &event.bp_flags); + read_off += str8_deserial_read_struct(string, read_off, &event.tls_model); + read_off += str8_deserial_read_struct(string, read_off, &event.tls_index); + read_off += str8_deserial_read_struct(string, read_off, &event.tls_offset); read_off += str8_deserial_read_struct(string, read_off, &event.string.size); event.string.str = push_array_no_zero(arena, U8, event.string.size); read_off += str8_deserial_read(string, read_off, event.string.str, event.string.size, 1); @@ -1249,6 +1269,7 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis { CTRL_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); + process->tls_model = event->tls_model; }break; case CTRL_EventKind_EndProc: { @@ -1370,6 +1391,8 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis ctrl_entity_equip_string(store, module, event->string); module->timestamp = event->timestamp; module->vaddr_range = event->vaddr_rng; + module->tls_index = event->tls_index; + module->tls_offset = event->tls_offset; CTRL_Entity *first_module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module); if(first_module == module) { @@ -1723,26 +1746,6 @@ ctrl_entry_point_voff_from_module(CTRL_Handle module_handle) return result; } -internal Rng1U64 -ctrl_tls_vaddr_range_from_module(CTRL_Handle module_handle) -{ - Rng1U64 result = {0}; - U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->module, module_handle)) - { - result = n->tls_vaddr_range; - break; - } - } - return result; -} - internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle) { @@ -3734,7 +3737,6 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ Arena *arena = arena_alloc(); U64 entry_point_voff = 0; - Rng1U64 tls_vaddr_range = {0}; U32 rdi_dbg_time = 0; Guid rdi_dbg_guid = {0}; String8 exe_dbg_path = {0}; @@ -3855,34 +3857,6 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); } - // rjf: extract tls header - PE_TLSHeader64 tls_header = {0}; - if(data_dir_count > PE_DataDirectoryIndex_TLS) - { - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_TLS, &dir); - Rng1U64 tls_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); - switch(file_header.machine) - { - default:{}break; - case COFF_MachineType_X86: - { - PE_TLSHeader32 tls_header32 = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header32); - tls_header.raw_data_start = (U64)tls_header32.raw_data_start; - tls_header.raw_data_end = (U64)tls_header32.raw_data_end; - tls_header.index_address = (U64)tls_header32.index_address; - tls_header.callbacks_address = (U64)tls_header32.callbacks_address; - tls_header.zero_fill_size = (U64)tls_header32.zero_fill_size; - tls_header.characteristics = (U64)tls_header32.characteristics; - }break; - case COFF_MachineType_X64: - { - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header); - }break; - } - } - // rjf: extract sections U64 sec_array_off = opt_ext_off_range.max; U64 sec_count = file_header.section_count; @@ -3892,9 +3866,6 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ // rjf: grab entry point vaddr entry_point_voff = entry_point; - // rjf: calculate TLS vaddr range - tls_vaddr_range = r1u64(tls_header.index_address, tls_header.index_address+sizeof(U32)); - // rjf: grab data about debug info if(data_dir_count > PE_DataDirectoryIndex_DEBUG) { @@ -4469,11 +4440,12 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, case DMN_EventKind_CreateProcess: { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_NewProc; - out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->arch = event->arch; - out_evt->entity_id = event->code; + out_evt->kind = CTRL_EventKind_NewProc; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->arch = event->arch; + out_evt->entity_id = event->code; + out_evt->tls_model = ctrl_dynamic_linker_type_from_dmn(event->tls_model); ctrl_state->process_counter += 1; }break; case DMN_EventKind_CreateThread: @@ -4508,6 +4480,8 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, out_evt1->rip_vaddr = event->address; out_evt1->timestamp = exe_timestamp; out_evt1->string = module_path; + out_evt1->tls_index = event->tls_index; + out_evt1->tls_offset = event->tls_offset; CTRL_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts); String8 initial_debug_info_path = ctrl_initial_debug_info_path_from_module(scratch.arena, module_handle); U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 59a9de51..69d629a8 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -59,6 +59,17 @@ struct CTRL_UserBreakpointList U64 count; }; +//////////////////////////////// +//~ Dynamic Linker Types + +typedef U32 CTRL_TlsModel; +enum +{ + CTRL_TlsModel_Null, + CTRL_TlsModel_WinodwsNt, + CTRL_TlsModel_Gnu +}; + //////////////////////////////// //~ rjf: Entity Handle Types @@ -119,6 +130,9 @@ struct CTRL_Entity U64 timestamp; CTRL_UserBreakpointFlags bp_flags; String8 string; + CTRL_TlsModel tls_model; + U64 tls_index; + U64 tls_offset; }; typedef struct CTRL_EntityNode CTRL_EntityNode; @@ -512,11 +526,14 @@ struct CTRL_Event U64 rip_vaddr; U64 stack_base; U64 tls_root; + U64 tls_index; + U64 tls_offset; U64 timestamp; U32 exception_code; U32 rgba; CTRL_UserBreakpointFlags bp_flags; String8 string; + CTRL_TlsModel tls_model; }; typedef struct CTRL_EventNode CTRL_EventNode; @@ -603,7 +620,6 @@ struct CTRL_ModuleImageInfoCacheNode EH_FrameHdr eh_frame_hdr; EH_PtrCtx eh_ptr_ctx; U64 entry_point_voff; - Rng1U64 tls_vaddr_range; String8 initial_debug_info_path; Rng1U64 raddbg_section_voff_range; String8 raddbg_data; @@ -776,6 +792,7 @@ internal U64 ctrl_hash_from_string(String8 string); internal U64 ctrl_hash_from_handle(CTRL_Handle handle); internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); internal CTRL_ExceptionKind ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind); +internal CTRL_TlsModel ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type); internal String8 ctrl_string_from_event_kind(CTRL_EventKind kind); internal String8 ctrl_string_from_msg_kind(CTRL_MsgKind kind); internal CTRL_EntityKind ctrl_entity_kind_from_string(String8 string); @@ -916,7 +933,6 @@ internal B32 ctrl_thread_write_reg_block(CTRL_Handle thread, void *block); //- rjf: cache lookups internal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff); internal U64 ctrl_entry_point_voff_from_module(CTRL_Handle module_handle); -internal Rng1U64 ctrl_tls_vaddr_range_from_module(CTRL_Handle module_handle); internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle); internal String8 ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle); @@ -993,7 +1009,7 @@ internal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, //- rjf: attached process running/event gathering internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); -//- rjf: eval helpers +//- rjf: eval helpers internal U64 ctrl_eval_space_gen(E_Space space); internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 0d7587ca..a0a9295f 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -984,80 +984,68 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 { ProfBeginFunction(); U64 base_vaddr = 0; - Temp scratch = scratch_begin(0, 0); if(!d_ctrl_targets_running()) { + Temp scratch = scratch_begin(0, 0); + //- rjf: unpack module info - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - Rng1U64 tls_vaddr_range = ctrl_tls_vaddr_range_from_module(module->handle); - U64 addr_size = bit_size_from_arch(process->arch)/8; - - //- rjf: read module's TLS index - U64 tls_index = 0; - if(addr_size != 0) + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 addr_size = byte_size_from_arch(process->arch); + + switch(process->tls_model) { - CTRL_ProcessMemorySlice tls_index_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, tls_vaddr_range, 0, 0); - if(tls_index_slice.data.size >= addr_size) + case CTRL_TlsModel_Null: {}break; + case CTRL_TlsModel_WinodwsNt: { - tls_index = *(U64 *)tls_index_slice.data.str; - } - } - - //- rjf: PE path - if(addr_size != 0) - { - U64 thread_info_addr = root_vaddr; - U64 tls_addr_off = tls_index*addr_size; - U64 tls_addr_array = 0; - CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0, 0); - String8 tls_addr_array_data = tls_addr_array_slice.data; - if(tls_addr_array_data.size >= 8) - { - MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); - } - CTRL_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0, 0); - String8 result_data = result_slice.data; - if(result_data.size >= 8) - { - MemoryCopy(&base_vaddr, result_data.str, sizeof(U64)); - } - } - - //- rjf: non-PE path (not implemented) -#if 0 - if(!bin_is_pe) - { - // TODO(rjf): not supported. old code from the prototype that Nick had sketched out: - // TODO(nick): This code works only if the linked c runtime library is glibc. - // Implement CRT detection here. - - U64 dtv_addr = UINT64_MAX; - demon_read_memory(process->demon_handle, &dtv_addr, thread_info_addr, addr_size); - - /* - union delta_thread_vector + // read thread local base pointer out of TEB + U64 thread_local_base = root_vaddr; + U64 tls_addr_array = 0; + CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_local_base, thread_local_base + addr_size), 0, 0); + String8 tls_array_vaddr_data = tls_addr_array_slice.data; + if(tls_array_vaddr_data.size == addr_size) { - size_t counter; - struct + U64 tls_array_vaddr = 0; + MemoryCopyStr8(&tls_array_vaddr, tls_array_vaddr_data); + + // read thread local storage pointer (array of TLS pointers, one per module) + U64 tls_ptr_vaddr = tls_array_vaddr + module->tls_index * addr_size; + CTRL_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); + String8 result_data = result_slice.data; + if(result_data.size == addr_size) { - void *value; - void *to_free; - } pointer; - }; - */ - - U64 dtv_size = 16; - U64 dtv_count = 0; - demon_read_memory(process->demon_handle, &dtv_count, dtv_addr - dtv_size, addr_size); - - if (tls_index > 0 && tls_index < dtv_count) + MemoryCopyStr8(&base_vaddr, result_data); + } + } + }break; + case CTRL_TlsModel_Gnu: { - demon_read_memory(process->demon_handle, &result, dtv_addr + dtv_size*tls_index, addr_size); - } + if(module->tls_index > 0) // zero is reserved for the generation counter + { + // read dynamic thread vector pointer (one per dynamic module) + U64 dtv_base = root_vaddr; + U64 dtv_size = addr_size * 2; // union dtv { size_t counter; struct dtv_pointer { void *val, *to_free; }; }; + U64 dtv_pointer_vaddr = dtv_base + module->tls_index * dtv_size; + CTRL_ProcessMemorySlice dtv_pointer_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(dtv_pointer_vaddr, dtv_pointer_vaddr + dtv_size), 0, 0); + String8 dtv_pointer_data = dtv_pointer_slice.data; + if(dtv_pointer_data.size == dtv_size) + { + U64 dtv_pointer = 0; + MemoryCopyStr8(&dtv_pointer, dtv_pointer_data); + + // verify that TLS block was allocated + U64 tls_dtv_unallocated = addr_size == 4 ? max_U32 : max_U64; + if(dtv_pointer != tls_dtv_unallocated) + { + base_vaddr = dtv_pointer + module->tls_offset; // add tls_offset because DT_NEEDED modules share TLS block with the main exe + } + } + } + }break; + default: {InvalidPath;}break; } -#endif + + scratch_end(scratch); } - scratch_end(scratch); ProfEnd(); return base_vaddr; } diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index f0b4ce54..5dec068e 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -18,6 +18,17 @@ struct DMN_CtrlCtx U64 u64[1]; }; +//////////////////////////////// +//~ Dynamic Linker Types + +typedef U32 DMN_TlsModel; +enum +{ + DMN_TlsModel_Null, + DMN_TlsModel_WinodwsNt, + DMN_TlsModel_Gnu +}; + //////////////////////////////// //~ rjf: Handle Types @@ -82,6 +93,9 @@ struct DMN_Event U64 stack_pointer; U64 user_data; B32 exception_repeated; + U64 tls_index; + U64 tls_offset; + DMN_TlsModel tls_model; }; typedef struct DMN_EventNode DMN_EventNode; diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 35325711..142b69c6 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -1401,6 +1401,42 @@ dmn_lnx_handle_not_attached(Arena *arena, DMN_EventList *events) e->error_kind = DMN_ErrorKind_NotAttached; } +internal DMN_LNX_Entity * +dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, pid_t tid) +{ + DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); + thread->id = tid; + thread->arch = process->arch; + thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); + thread->thread_state = DMN_LNX_ThreadState_Stopped; + thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->id, thread); + + if(!thread->is_reg_block_dirty) + { + switch(thread->arch) + { + case Arch_Null: break; + case Arch_x64: thread->thread_local_base = ((REGS_RegBlockX64 *)thread->reg_block)->fsbase.u64; break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: { NotImplemented; } break; + default: { InvalidPath; } break; + } + } + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(thread); + e->arch = thread->arch; + e->code = thread->id; + + process->thread_count += 1; + + return thread; +} + internal void dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, pid_t pid) { @@ -1529,32 +1565,17 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, pid_t pid) // push create process event { DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_lnx_handle_from_entity(process); - e->arch = process->arch; - e->code = pid; + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_lnx_handle_from_entity(process); + e->arch = process->arch; + e->code = pid; + e->tls_model = DMN_TlsModel_Gnu; // TODO: use dynamic linker path to figure out correct enum here } // // init main thread // - DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); - thread->id = pid; - thread->arch = process->arch; - thread->is_main_thread = 1; - thread->thread_state = DMN_LNX_ThreadState_Stopped; - thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); - thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->id, thread); - // push create thread event - { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->arch = thread->arch; - e->code = thread->id; - } + DMN_LNX_Entity *thread = dmn_lnx_handle_create_thread(arena, events, process, pid); // // init main module @@ -1580,6 +1601,8 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, pid_t pid) e->string = dmn_lnx_read_string(arena, process->fd, auxv.execfn); e->elf_phdr_vrange = r1u64(auxv.phdr, auxv.phdr + auxv.phent * auxv.phnum); e->elf_phdr_entsize = auxv.phent; + e->tls_index = 1; + e->tls_offset = 0; } } @@ -1643,30 +1666,6 @@ dmn_lnx_handle_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) dmn_lnx_state->active_process_count -= 1; } -internal void -dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, pid_t tid, pid_t new_tid) -{ - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Entity *process = thread->parent; - - DMN_LNX_Entity *new_thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); - new_thread->id = new_tid; - new_thread->arch = process->arch; - new_thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); - new_thread->thread_state = DMN_LNX_ThreadState_Stopped; - new_thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(new_thread); - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, new_thread->id, new_thread); - - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(new_thread); - e->arch = new_thread->arch; - e->code = new_thread->id; - - process->thread_count += 1; -} - internal void dmn_lnx_handle_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code) { @@ -1716,14 +1715,27 @@ dmn_lnx_handle_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity * DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); String8 module_name = dmn_lnx_read_string(process->arena, process->fd, map.name_vaddr); + // read TLS index and TLS offset + U64 tls_index = max_U64; + U64 tls_offset = max_U64; + if(dmn_lnx_state->is_tls_detected) + { + Rng1U64 tls_modid_range = r1u64(dmn_lnx_state->tls_modid_desc.offset, dmn_lnx_state->tls_modid_desc.offset + dmn_lnx_state->tls_modid_desc.bit_size / 8); + Rng1U64 tls_offset_range = r1u64(dmn_lnx_state->tls_offset_desc.offset, dmn_lnx_state->tls_offset_desc.offset + dmn_lnx_state->tls_offset_desc.bit_size / 8); + tls_modid_range = shift_1u64(tls_modid_range, map_vaddr); + tls_offset_range = shift_1u64(tls_offset_range, map_vaddr); + if(!dmn_lnx_read(process->fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } + if(!dmn_lnx_read(process->fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } + } + // fill out module - module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); - module->id = map.name_vaddr; - module->base_vaddr = map.addr_vaddr; + module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); + module->id = map.name_vaddr; + module->base_vaddr = map.addr_vaddr; - // push load event if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) { + // push load event DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_LoadModule; e->process = dmn_lnx_handle_from_entity(process); @@ -1734,6 +1746,8 @@ dmn_lnx_handle_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity * e->string = module_name; e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); e->elf_phdr_entsize = module_ehdr.e_phentsize; + e->tls_index = tls_index; + e->tls_offset = tls_offset; } // create mapping for base -> module @@ -2007,19 +2021,40 @@ internal void dmn_init(void) { local_persist B32 was_inited; - local_persist DMN_LNX_State state; - AssertAlways(!was_inited); - was_inited = 1; + if(!was_inited) + { + was_inited = 1; - dmn_lnx_state = &state; - dmn_lnx_state->arena = arena_alloc(); - dmn_lnx_state->access_mutex = mutex_alloc(); - dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain); - dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0); - dmn_lnx_state->tid_ht = hash_table_init(dmn_lnx_state->arena, 0x2000); - dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); - dmn_lnx_state->halter_mutex = mutex_alloc(); - dmn_lnx_entity_alloc(dmn_lnx_nil_entity, DMN_LNX_EntityKind_Root); + local_persist DMN_LNX_State state; + dmn_lnx_state = &state; + + dmn_lnx_state->arena = arena_alloc(); + dmn_lnx_state->access_mutex = mutex_alloc(); + dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain); + dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0); + dmn_lnx_state->tid_ht = hash_table_init(dmn_lnx_state->arena, 0x2000); + dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); + dmn_lnx_state->halter_mutex = mutex_alloc(); + dmn_lnx_entity_alloc(dmn_lnx_nil_entity, DMN_LNX_EntityKind_Root); + + // find offsets of TLS index and TLS offset in the link_map struct + // + // TODO: assuming that target is using same libc version as debugger + { + DMN_LNX_DbDesc *tls_modid_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_modid"); + DMN_LNX_DbDesc *tls_offset_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_offset"); + if(tls_modid_desc && tls_offset_desc) + { + if(tls_modid_desc->bit_size <= 64 && tls_offset_desc->bit_size <= 64) + { + dmn_lnx_state->tls_modid_desc = *tls_modid_desc; + dmn_lnx_state->tls_offset_desc = *tls_offset_desc; + dmn_lnx_state->is_tls_detected = 1; + } + else { Assert(0 && "invalid TLS desc"); } + } + } + } } //////////////////////////////// @@ -2518,7 +2553,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) pid_t new_pid; if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid)) >= 0) { - dmn_lnx_handle_create_thread(arena, &events, wait_id, new_pid); + dmn_lnx_handle_create_thread(arena, &events, dmn_lnx_thread_from_pid(wait_id), new_pid); } else { Assert(0 && "failed to get new tid"); } }break; @@ -2742,7 +2777,33 @@ dmn_stack_base_vaddr_from_thread(DMN_Handle handle) internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle) { - return 0; + U64 tls_root_vaddr = max_U64; + DMN_AccessScope + { + DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); + switch (thread->arch) + { + case Arch_Null: {} break; + case Arch_x64: + { + DMN_LNX_Entity *process = thread->parent; + REGS_RegBlockX64 *reg_block = thread->reg_block; + U64 dtv_pointer = 0; + if(dmn_lnx_read_struct(process->fd, reg_block->fsbase.u64 + 8, &dtv_pointer)) + { + tls_root_vaddr = dtv_pointer; + } + } break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: + { + NotImplemented; + } break; + default: { InvalidPath; } break; + } + } + return tls_root_vaddr; } internal B32 diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 8f9867fd..c23bf2c1 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -61,6 +61,15 @@ struct DMN_LNX_UserX64 }; StaticAssert(sizeof(DMN_LNX_UserX64) == 912, g_dmn_lnx_user_x64_size_check); +//////////////////////////////// + +typedef struct +{ + U32 bit_size; + U32 count; + U32 offset; +} DMN_LNX_DbDesc; + //////////////////////////////// //~ SDT Probes @@ -211,6 +220,7 @@ struct DMN_LNX_Entity B32 pass_through_signal; U64 pass_through_signo; DMN_LNX_ThreadState thread_state; + U64 thread_local_base; // module U64 base_vaddr; @@ -292,6 +302,11 @@ struct DMN_LNX_State U64 halt_code; U64 halt_user_data; B32 is_halting; + + // TLS + B32 is_tls_detected; + DMN_LNX_DbDesc tls_modid_desc; + DMN_LNX_DbDesc tls_offset_desc; }; //////////////////////////////// diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index 8ccf1fa7..b2fe81f9 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -465,7 +465,7 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) U32 pe_offset = 0; { U64 dos_magic_off = base_vaddr; - U16 dos_magic = 0; + U16 dos_magic = 0; dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); if(dos_magic == PE_DOS_MAGIC) { @@ -475,56 +475,107 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) } // rjf: get COFF header - B32 got_coff_header = 0; - U64 coff_header_off = 0; - COFF_FileHeader coff_header = {0}; + B32 got_coff_header = 0; + U64 coff_header_off = 0; + COFF_FileHeader coff_header = {0}; if(pe_offset > 0) { U64 pe_magic_off = base_vaddr + pe_offset; - U32 pe_magic = 0; + U32 pe_magic = 0; dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); if(pe_magic == PE_MAGIC) { coff_header_off = pe_magic_off + sizeof(pe_magic); - if(dmn_w32_process_read_struct(process, coff_header_off, &coff_header)) - { - got_coff_header = 1; - } + got_coff_header = dmn_w32_process_read_struct(process, coff_header_off, &coff_header); } } - // rjf: get arch and size DMN_W32_ImageInfo result = zero_struct; if(got_coff_header) { - U64 optional_size_off = 0; - Arch arch = Arch_Null; - switch(coff_header.machine) + U64 optional_off = coff_header_off + sizeof(COFF_FileHeader); + + Arch arch = arch_from_coff_machine(coff_header.machine); + U64 image_size = 0; + U64 data_dir_count = 0; + U64 data_dir_off = max_U64; + U64 tls_index = max_U64; + + // parse optional header + if(pe_has_plus_header(coff_header.machine)) { - case COFF_MachineType_X86: + PE_OptionalHeader32Plus opt_header = {0}; + if(dmn_w32_process_read_struct(process, optional_off, &opt_header)) { - arch = Arch_x86; - optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image); - }break; - case COFF_MachineType_X64: - { - arch = Arch_x64; - optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image); - }break; - default: - {}break; - } - if(arch != Arch_Null) - { - U64 optional_off = coff_header_off + sizeof(coff_header); - U32 size = 0; - if(dmn_w32_process_read_struct(process, optional_off+optional_size_off, &size) >= sizeof(size)) - { - result.arch = arch; - result.size = size; + image_size = opt_header.sizeof_image; + data_dir_count = opt_header.data_dir_count; + data_dir_off = optional_off + sizeof(opt_header); } + else { Assert(0 && "failed to read optional header"); } } + else + { + PE_OptionalHeader32 opt_header = {0}; + if(dmn_w32_process_read_struct(process, optional_off, &opt_header)) + { + image_size = opt_header.sizeof_image; + data_dir_count = opt_header.data_dir_count; + data_dir_off = optional_off + sizeof(opt_header); + } + else { Assert(0 && "failed to read optional header"); } + } + + // extract TLS index + if(PE_DataDirectoryIndex_TLS < data_dir_count) + { + U64 tls_dir_vaddr = data_dir_off + PE_DataDirectoryIndex_TLS * sizeof(PE_DataDirectory); + PE_DataDirectory tls_dir = {0}; + if(dmn_w32_process_read_struct(process, tls_dir_vaddr, &tls_dir)) + { + if(pe_has_plus_header(coff_header.machine)) + { + if(tls_dir.virt_size == sizeof(PE_TLSHeader64)) + { + PE_TLSHeader64 tls_header = {0}; + if(dmn_w32_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) + { + U64 tls_index64 = 0; + if(dmn_w32_process_read_struct(process, tls_header.index_address, &tls_index64)) + { + tls_index = tls_index64; + } + else { Assert(0 && "failed to read TLS Index 64"); } + } + else { Assert(0 && "failed to read TLS Header 64"); } + } + } + else + { + if(tls_dir.virt_size == sizeof(PE_TLSHeader32)) + { + PE_TLSHeader32 tls_header = {0}; + if(dmn_w32_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) + { + U32 tls_index32 = 0; + if(dmn_w32_process_read_struct(process, tls_header.index_address, &tls_index32)) + { + tls_index = tls_index32; + } + else { Assert(0 && "failed to read TLS Index 32"); } + } + else { Assert(0 && "failed to read TLS Header32"); } + } + } + } + else { Assert(0 && "failed to read TLS directory"); } + } + + // fill out result + result.arch = arch; + result.size = image_size; + result.tls_index = tls_index; } + else { Assert(0 && "failed to find COFF file header"); } return result; } @@ -2003,10 +2054,11 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: create process { DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_w32_handle_from_entity(process); - e->arch = image_info.arch; - e->code = evt.dwProcessId; + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_w32_handle_from_entity(process); + e->arch = image_info.arch; + e->code = evt.dwProcessId; + e->tls_model = DMN_TlsModel_WinodwsNt; } // rjf: create thread @@ -2022,13 +2074,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: load module { DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->arch = image_info.arch; - e->address = module_base; - e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->arch = image_info.arch; + e->address = module_base; + e->size = image_info.size; + e->string = dmn_w32_full_path_from_module(arena, module); + e->tls_index = image_info.tls_index; } } }break; @@ -2195,13 +2248,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: generate event { DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->arch = module->arch; - e->address = module_base; - e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->arch = module->arch; + e->address = module_base; + e->size = image_info.size; + e->string = dmn_w32_full_path_from_module(arena, module); + e->tls_index = image_info.tls_index; } }break; diff --git a/src/demon/win32/demon_core_win32.h b/src/demon/win32/demon_core_win32.h index c33f71c6..f5f9265e 100644 --- a/src/demon/win32/demon_core_win32.h +++ b/src/demon/win32/demon_core_win32.h @@ -255,6 +255,7 @@ struct DMN_W32_ImageInfo { Arch arch; U32 size; + U64 tls_index; }; //////////////////////////////// From a1884aaf5fb40be96301da5dd38aea2867993748 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 25 Nov 2025 16:24:57 -0800 Subject: [PATCH 082/850] WIP handle abnormal process initialization --- src/demon/linux/demon_core_linux.c | 223 +++++++++++++++-------------- src/demon/linux/demon_core_linux.h | 24 +++- 2 files changed, 133 insertions(+), 114 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 142b69c6..6ce420ff 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -1438,25 +1438,10 @@ dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity } internal void -dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, pid_t pid) +dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_subprocesses, pid_t pid) { Temp scratch = scratch_begin(&arena, 1); - // - // move pid to the active list - // - B32 debug_subprocesses = 0; - for EachNode(n, DMN_LNX_ProcessLaunch, dmn_lnx_state->pending_creation.first) - { - if(n->pid == pid) - { - dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_creation, n); - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, n); - debug_subprocesses = n->debug_subprocesses; - break; - } - } - ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); @@ -1559,7 +1544,6 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, pid_t pid) process->xcr0 = xcr0; process->xsave_size = Max(xsave_size, sizeof(X64_XSave)); process->xsave_layout = xsave_layout; - process->thread_count = 1; MemoryCopyTyped(&process->probe_vaddrs[0], &probe_vaddrs[0], DMN_LNX_ProbeType_Count); hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); // push create process event @@ -2091,11 +2075,9 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) { Temp scratch = scratch_begin(0, 0); - pid_t pid = 0; - - //- rjf: unpack command line - int argc = (int)(params->cmd_line.node_count); - char **argv = push_array(scratch.arena, char *, argc+1); + // setup target command line + U64 argc = params->cmd_line.node_count + 1; + char **argv = push_array(scratch.arena, char *, argc); { U64 idx = 0; for(String8Node *n = params->cmd_line.first; n != 0; n = n->next, idx += 1) @@ -2103,83 +2085,79 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) argv[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; } } - - //- rjf: unpack path - char *path = (char *)push_str8_copy(scratch.arena, params->path).str; - - //- rjf: unpack environment - char **env = push_array(scratch.arena, char *, os_lnx_state.default_env_count + params->env.node_count + 1); + + // setup target environment + U64 envc = os_lnx_state.default_env_count + params->env.node_count + 1; + char **envp = push_array(scratch.arena, char *, envc); { - MemoryCopyTyped(env, os_lnx_state.default_env, os_lnx_state.default_env_count); + // copy default environment + MemoryCopyTyped(envp, os_lnx_state.default_env, os_lnx_state.default_env_count); + // copy user environment U64 idx = os_lnx_state.default_env_count; for(String8Node *n = params->env.first; n != 0; n = n->next, idx += 1) { - env[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; + envp[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; } } - //- rjf: fork - pid = fork(); + // create zero-terminated work directory path + char *work_dir_path = (char *)push_str8_copy(scratch.arena, params->path).str; + + // fork process + pid_t pid = fork(); // child process if(pid == 0) { - // set current working directory to tracee - if(OS_LNX_RETRY_ON_EINTR(chdir(path)) < 0) { goto child_exit; } + // change work directory to tracee + if(OS_LNX_RETRY_ON_EINTR(chdir(work_dir_path)) < 0) { goto child_exit; } - // notify parent that we are going to execve - OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)); + // @first_sigstop notify parent that we are going to execve + if(OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)) < 0) { goto child_exit; } - // replace process with target - OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, env)); + // replace process with target program + if(OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, envp)) < 0) { goto child_exit; } - // execve failed -- exit child_exit:; abort(); } // parent process else if(pid > 0) { - B32 kill_child_process = 1; + B32 failed_to_seize = 1; // try to seize child process - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, 0) < 0)) { Assert(0 && "failed to seize"); goto parent_exit; } + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, 0) < 0)) { goto parent_exit; } - if(dmn_lnx_state->tracer_tid == 0) - { - dmn_lnx_state->tracer_tid = gettid(); - } - else - { - AssertAlways(dmn_lnx_state->tracer_tid == gettid()); - } + // ensure tracer ops are issued on thread that sizes processes + if(dmn_lnx_state->tracer_tid == 0) { dmn_lnx_state->tracer_tid = gettid(); } + AssertAlways(dmn_lnx_state->tracer_tid == gettid()); - // alloc pid node - DMN_LNX_ProcessLaunch *pending_stopsig = dmn_lnx_state->free_pids.first; - if(pending_stopsig) { dmn_lnx_process_launch_list_remove(&dmn_lnx_state->free_pids, pending_stopsig); } - else { pending_stopsig = push_array(dmn_lnx_state->arena, DMN_LNX_ProcessLaunch, 1); } + // alloc pending process node + DMN_LNX_ProcessLaunch *pending_proc = dmn_lnx_state->free_pids.first; + if(pending_proc) { dmn_lnx_process_launch_list_remove(&dmn_lnx_state->free_pids, pending_proc); } + else { pending_proc = push_array(dmn_lnx_state->arena, DMN_LNX_ProcessLaunch, 1); } - // add to list - pending_stopsig->debug_subprocesses = params->debug_subprocesses; - pending_stopsig->pid = pid; - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_stopsig, pending_stopsig); + // add pending proc node to the list + *pending_proc = (DMN_LNX_ProcessLaunch){ params->debug_subprocesses, pid, DMN_LNX_ProcessLaunchState_SigStop }; + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_procs, pending_proc); - // tracee was successfully sizeed - kill_child_process = 0; + // tracee was successfully seized + failed_to_seize = 0; parent_exit:; - if(kill_child_process) + if(failed_to_seize) { Assert(0 && "failed to ptrace child process"); - if(OS_LNX_RETRY_ON_EINTR(kill(SIGKILL, pid)) < 0) { Assert(0 && "failed to kill child process"); } + OS_LNX_RETRY_ON_EINTR(kill(SIGKILL, pid)); + OS_LNX_RETRY_ON_EINTR(waitpid(pid, 0, WNOHANG)); pid = 0; } } scratch_end(scratch); - Assert(pid < max_U32); - return (U32)pid; + return pid; } internal B32 @@ -2394,31 +2372,30 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // wait for signals from the running threads { - U64 stopped_threads = 0; - B32 is_halt_done = 0; - do + B32 is_halt_done = 0; + for(U64 stopped_threads = 0;;) { - // do not wait if there are no processes - if(dmn_lnx_state->pending_stopsig.count == 0 && dmn_lnx_state->pending_creation.count == 0 && dmn_lnx_state->active_process_count == 0) + // do not wait if there are no pending or active processes + if(dmn_lnx_state->pending_procs.count == 0 && dmn_lnx_state->active_process_count == 0) { dmn_lnx_handle_not_attached(arena, &events); break; } - mutex_drop(dmn_lnx_state->halter_mutex); - // wait for a signal int status = 0; pid_t wait_id = 0; - for(;;) { - wait_id = OS_LNX_RETRY_ON_EINTR(waitpid(-1, &status, __WALL|__WNOTHREAD)); - if(wait_id == -1) { InvalidPath; } // TODO: graceful exit - break; + mutex_drop(dmn_lnx_state->halter_mutex); + for(;;) + { + wait_id = OS_LNX_RETRY_ON_EINTR(waitpid(-1, &status, __WALL|__WNOTHREAD)); + if(wait_id == -1) { InvalidPath; } // TODO: graceful exit + break; + } + mutex_take(dmn_lnx_state->halter_mutex); } - mutex_take(dmn_lnx_state->halter_mutex); - // unpack status int wifexited = WIFEXITED(status); int wifsignaled = WIFSIGNALED(status); @@ -2426,32 +2403,66 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) int wstopsig = WSTOPSIG(status); int event_code = (status >> 16); - // intercept our SIGSTOP and signal tracee to continue to execve - if(wstopsig == SIGSTOP) + // intercept signals meant for the process launch sequence { - B32 is_pending_launch = 0; - for EachNode(n, DMN_LNX_ProcessLaunch, dmn_lnx_state->pending_stopsig.first) + // pid -> pending process launch + DMN_LNX_ProcessLaunch *pending_proc = 0; + for EachNode(n, DMN_LNX_ProcessLaunch, dmn_lnx_state->pending_procs.first) { if(n->pid == wait_id) { pending_proc = n; break; } } + + if(pending_proc) { - if(n->pid == wait_id) + // process unexpectedly exited + if(wifexited) { pending_proc->state = DMN_LNX_ProcessLaunchState_Exit; } + + if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exec && wstopsig == SIGTRAP && event_code == PTRACE_EVENT_EXEC) { - // move node to the pending creation list - dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_stopsig, n); - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_creation, n); + // move pending process node to the free list + dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); - // set trace options - // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFROK | PTRACE_O_TRACEVFORKDONE - void *trace_options = (void *)(PTRACE_O_EXITKILL | PTRACE_O_TRACEEXEC | PTRACE_O_TRACECLONE); - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETOPTIONS, wait_id, 0, trace_options)) < 0) { Assert(0 && "failed to set options"); InvalidPath; } + // push create process events + dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, wait_id); - // signal process to continue to execve - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, wait_id, 0, 0)) < 0) { InvalidPath; } + // override event code so the main code path does not create another process + event_code = PTRACE_EVENT_STOP; + } + else + { + B32 shutdown_process = 1; - is_pending_launch = 1; + if(pending_proc->state == DMN_LNX_ProcessLaunchState_SigStop && wstopsig == SIGSTOP) // @first_sigstop + { + // set trace options and singal to proceed to the execve + // + // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFROK | PTRACE_O_TRACEVFORKDONE + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETOPTIONS, wait_id, 0, (void *)(PTRACE_O_EXITKILL | PTRACE_O_TRACEEXEC | PTRACE_O_TRACECLONE))) >= 0) + { + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, wait_id, 0, 0)) >= 0) + { + // update pending process state + pending_proc->state = DMN_LNX_ProcessLaunchState_Exec; + shutdown_process = 0; + } + } + } + else if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exit) + { + // move pending process node to the free list + dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); + shutdown_process = 0; + } - break; + // exit on abnormal process init + if(shutdown_process) + { + OS_LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)); + pending_proc->state = DMN_LNX_ProcessLaunchState_Exit; + } + + continue; } } - if(is_pending_launch) { continue; } } if(wifstopped || wifsignaled || wifexited) @@ -2561,26 +2572,18 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); DMN_LNX_Entity *process = thread->parent; - - if(process == dmn_lnx_nil_entity) + if(process->debug_subprocesses) { - dmn_lnx_handle_create_process(arena, &events, wait_id); + dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); + dmn_lnx_handle_create_process(arena, &events, 1, wait_id); } else { - if(process->debug_subprocesses) + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, wait_id, 0, 0)) >= 0) { dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); - dmn_lnx_handle_create_process(arena, &events, wait_id); - } - else - { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, wait_id, 0, 0)) >= 0) - { - dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); - } - else { Assert(0 && "failed to detach"); } } + else { Assert(0 && "failed to detach"); } } }break; case PTRACE_EVENT_VFORK_DONE: @@ -2630,7 +2633,13 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } else { Assert(0 && "unexpected stop code"); } - } while(stopped_threads < running_threads.count); + + // do not wait if all threads are stopped and there are no launching processes + if(stopped_threads >= running_threads.count && dmn_lnx_state->pending_procs.count == 0) + { + break; + } + } // finalize halter state if(is_halt_done) diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index c23bf2c1..a1c65f8f 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -248,11 +248,22 @@ struct DMN_LNX_EntityList //////////////////////////////// //~ rjf: Main State Bundle +typedef U32 DMN_LNX_ProcessLaunchState; +enum +{ + DMN_LNX_ProcessLaunchState_Null, + DMN_LNX_ProcessLaunchState_SigStop, + DMN_LNX_ProcessLaunchState_Exec, + DMN_LNX_ProcessLaunchState_Exit, +}; + typedef struct DMN_LNX_ProcessLaunch DMN_LNX_ProcessLaunch; struct DMN_LNX_ProcessLaunch { - B32 debug_subprocesses; - pid_t pid; + B32 debug_subprocesses; + pid_t pid; + DMN_LNX_ProcessLaunchState state; + DMN_LNX_ProcessLaunch *next; DMN_LNX_ProcessLaunch *prev; }; @@ -286,14 +297,13 @@ struct DMN_LNX_State DMN_LNX_Entity *entities_base; DMN_LNX_Entity *free_entity; U64 entities_count; - HashTable *tid_ht; // thread id -> thread entity - HashTable *pid_ht; // process id -> process entity + + HashTable *tid_ht; // thread id -> thread entity + HashTable *pid_ht; // process id -> process entity // pid tracking U64 active_process_count; - DMN_LNX_ProcessLaunchList pending_stopsig; - DMN_LNX_ProcessLaunchList pending_creation; - DMN_LNX_ProcessLaunchList active_pids; + DMN_LNX_ProcessLaunchList pending_procs; DMN_LNX_ProcessLaunchList free_pids; // halter From 2a6d0d737c906b62a628068f9627f16d1ae790ba Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 26 Nov 2025 15:13:16 -0800 Subject: [PATCH 083/850] add CFA op to the bytecode --- src/lib_rdi/rdi.c | 3 ++- src/lib_rdi/rdi.h | 6 ++++-- src/rdi/rdi.mdesk | 3 ++- src/rdi_from_dwarf/rdi_from_dwarf.c | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index d60dc325..766fd90f 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -58,7 +58,7 @@ sizeof(RDI_NameMapNode), sizeof(RDI_U8), }; -RDI_U16 rdi_eval_op_ctrlbits_table[53] = +RDI_U16 rdi_eval_op_ctrlbits_table[54] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), @@ -112,6 +112,7 @@ RDI_EVAL_CTRLBITS(4, 0, 0), RDI_EVAL_CTRLBITS(4, 0, 0), RDI_EVAL_CTRLBITS(8, 0, 0), RDI_EVAL_CTRLBITS(0, 2, 2), +RDI_EVAL_CTRLBITS(0, 0, 1), RDI_EVAL_CTRLBITS(0, 0, 0), }; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index f4160b8b..fd680a04 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -531,7 +531,8 @@ RDI_EvalOp_CallSiteValue = 48, RDI_EvalOp_PartialValue = 49, RDI_EvalOp_PartialValueBit = 50, RDI_EvalOp_Swap = 51, -RDI_EvalOp_COUNT = 52, +RDI_EvalOp_PushCfa = 52, +RDI_EvalOp_COUNT = 53, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; @@ -1136,6 +1137,7 @@ X(CallSiteValue)\ X(PartialValue)\ X(PartialValueBit)\ X(Swap)\ +X(PushCfa)\ #define RDI_EvalTypeGroup_XList \ X(Other)\ @@ -1638,6 +1640,6 @@ RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTyp RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); extern RDI_U16 rdi_section_element_size_table[44]; -extern RDI_U16 rdi_eval_op_ctrlbits_table[53]; +extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; #endif // RDI_H diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 6d90e855..3e73f1ac 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1358,7 +1358,8 @@ RDI_EvalOpTable: {PartialValue 49 4 0 0} {PartialValueBit 50 8 0 0} {Swap 51 0 2 2} // swaps the top two entries on the stack - {COUNT 52 0 0 0} + {PushCfa 52 0 0 1} // push canonical frame address on the stack + {COUNT 53 0 0 0} } // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 0c01d6be..0d7f5d6e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1261,7 +1261,7 @@ d2r_bytecode_from_expression(Arena *arena, } } break; case DW_ExprOp_CallFrameCfa: { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_FrameOff, 0); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PushCfa, 0); d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); } break; case DW_ExprOp_PushObjectAddress: { From f9561cb618c1b0c74ecd2d7eb39bff17333145d1 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 26 Nov 2025 15:16:00 -0800 Subject: [PATCH 084/850] add support for CFA in the eval system Canonical Frame Address is a DWARF-only concept encoded in the unwind info. Debugger must store this data for each call frame and provide it to the eval system based on selected stack frame. To abstract over format details, we introduce a "Frame Unwind Context". For DWARF, this context maintains the intermediate unwind state and exposes the CFA, whereas for PE, it remains empty. --- src/ctrl/ctrl_core.c | 246 ++++++++++++++++++++----------- src/ctrl/ctrl_core.h | 16 +- src/dbg_engine/dbg_engine_core.c | 14 ++ src/dbg_engine/dbg_engine_core.h | 1 + src/dwarf/dwarf_unwind.c | 35 +++-- src/dwarf/dwarf_unwind.h | 2 +- src/eval/eval_interpret.c | 9 +- src/eval/eval_interpret.h | 1 + src/raddbg/raddbg_core.c | 1 + 9 files changed, 225 insertions(+), 100 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 06b3dcba..f31cd624 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1838,7 +1838,7 @@ DW_MEM_READ(ctrl_unwind_mem_read_dwarf_x64) B32 is_read = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + size), &is_stale, buffer, ctx->endt_us); DW_UnwindStatus status = DW_UnwindStatus_Fail; - if(is_stale && is_read) + if(is_stale) { status = DW_UnwindStatus_Maybe; } @@ -1903,12 +1903,35 @@ DW_REG_WRITE(ctrl_unwind_reg_write_dwarf_x64) } internal CTRL_UnwindStepResult -ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us) +ctrl_unwind_step_result_from_dwarf_status(DW_UnwindStatus s) { - Temp scratch = scratch_begin(0, 0); - + CTRL_UnwindStepResult result = {0}; + switch(s) + { + case DW_UnwindStatus_Ok: + { + result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); + }break; + case DW_UnwindStatus_Fail: + { + result.flags |= CTRL_UnwindFlag_Error; + }break; + case DW_UnwindStatus_Maybe: + { + result.flags &= ~CTRL_UnwindFlag_Error; + result.flags |= CTRL_UnwindFlag_Stale; + }break; + default: { InvalidPath; } break; + } + return result; +} + +internal CTRL_UnwindStepResult +ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out) +{ + Temp scratch = scratch_begin(&arena, 1); CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; - + // gather context for virtual stack unwinder U64 cfi_rebase = 0; B32 is_unwind_eh = 0; @@ -1944,9 +1967,9 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A if(fde_addr != max_U64) { // parse call frame info - DW_CIE cie = {0}; - DW_FDE fde = {0}; - B32 is_cfi_parsed = 0; + DW_CIE cie = {0}; + DW_FDE fde = {0}; + B32 is_cfi_parsed = 0; if(is_unwind_eh) { B32 is_stale = 0; @@ -2051,16 +2074,14 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A } // find register rules for IP - DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(scratch.arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, ip); + DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, ip); if(cfi_row) { // setup machine ops void *mem_read_ctx = 0; void *reg_read_ctx = 0; - void *reg_write_ctx = 0; DW_MemRead *mem_read_func = 0; DW_RegRead *reg_read_func = 0; - DW_RegWrite *reg_write_func = 0; switch(arch) { case Arch_Null: break; @@ -2072,11 +2093,9 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A mem_read_ctx = mem_read_ctx_x64; reg_read_ctx = regs; - reg_write_ctx = regs; mem_read_func = ctrl_unwind_mem_read_dwarf_x64; reg_read_func = ctrl_unwind_reg_read_dwarf_x64; - reg_write_func = ctrl_unwind_reg_write_dwarf_x64; }break; case Arch_x86: case Arch_arm64: @@ -2084,51 +2103,90 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, A { NotImplemented; }break; - default: { InvalidPath; } break; + default: { InvalidPath; }break; } - - // apply register rules to the context - DW_UnwindStatus cfi_uw_status = dw_cfi_apply_register_rules(arch, - &cie, - cfi_row, - mem_read_func, - mem_read_ctx, - reg_read_func, - reg_read_ctx, - reg_write_func, - reg_write_ctx); - - // last frame typically has undefined rule for IP - if(cfi_row->regs[cie.ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) + + // compute CFA for the row + U64 cfa = 0; + DW_UnwindStatus unwind_status = dw_compute_cfa(arch, cfi_row, mem_read_func, mem_read_ctx, reg_read_func, reg_read_ctx, &cfa); + + // on success fill out output + if(unwind_status == DW_UnwindStatus_Ok) { - regs_arch_block_write_rip(arch, regs, 0); - } - - // translate unwind status code to control layer's result flags - switch(cfi_uw_status) - { - case DW_UnwindStatus_Ok: - { - result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); - }break; - case DW_UnwindStatus_Fail: - { - result.flags |= CTRL_UnwindFlag_Error; - }break; - case DW_UnwindStatus_Maybe: - { - result.flags &= ~CTRL_UnwindFlag_Error; - result.flags |= CTRL_UnwindFlag_Stale; - }break; - default: { InvalidPath; } break; + ctx_out->cfa = cfa; + ctx_out->cfi_row = cfi_row; + ctx_out->ret_addr_reg = cie.ret_addr_reg; } + + // translate unwind status code + result = ctrl_unwind_step_result_from_dwarf_status(unwind_status); } } } - else + + scratch_end(scratch); + return result; +} + +internal CTRL_UnwindStepResult +ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us) +{ + Temp scratch = scratch_begin(0, 0); + + CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; + + // setup machine ops + void *mem_read_ctx = 0; + void *reg_read_ctx = 0; + void *reg_write_ctx = 0; + DW_MemRead *mem_read_func = 0; + DW_RegRead *reg_read_func = 0; + DW_RegWrite *reg_write_func = 0; + switch(arch) { - // TODO: if IP does not have FDE, does this mean function is a leaf? + case Arch_Null: break; + case Arch_x64: + { + CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); + mem_read_ctx_x64->process_handle = process_handle; + mem_read_ctx_x64->endt_us = endt_us; + + mem_read_ctx = mem_read_ctx_x64; + reg_read_ctx = regs; + reg_write_ctx = regs; + + mem_read_func = ctrl_unwind_mem_read_dwarf_x64; + reg_read_func = ctrl_unwind_reg_read_dwarf_x64; + reg_write_func = ctrl_unwind_reg_write_dwarf_x64; + }break; + case Arch_x86: + case Arch_arm64: + case Arch_arm32: + { + NotImplemented; + }break; + default: { InvalidPath; }break; } + + // apply register rules to the context + DW_UnwindStatus unwind_status = dw_cfi_apply_register_rules(arch, + frame_ctx->cfa, + frame_ctx->cfi_row, + mem_read_func, + mem_read_ctx, + reg_read_func, + reg_read_ctx, + reg_write_func, + reg_write_ctx); + + // last frame typically has undefined rule for IP + if(frame_ctx->cfi_row->regs[frame_ctx->ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) + { + regs_arch_block_write_rip(arch, regs, 0); + } + + // translate unwind status code + result = ctrl_unwind_step_result_from_dwarf_status(unwind_status); scratch_end(scratch); return result; @@ -2977,23 +3035,41 @@ ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, //- rjf: abstracted unwind step internal CTRL_UnwindStepResult -ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, U64 endt_us) +ctrl_establish_frame_unwind_context(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out) { CTRL_UnwindStepResult result = {0}; - - result = ctrl_unwind_step__dwarf(process, module, arch, reg_block, endt_us); - - if(result.flags == CTRL_UnwindFlag_Error && ~result.flags & CTRL_UnwindFlag_Stale) +#if OS_LINUX + result = ctrl_establish_frame_unwind_context__dwarf(arena, process_handle, module_handle, arch, regs, endt_us, ctx_out); +#elif OS_WINDOWS + // windows does not have a concept of frame context +#else +# error "unwinder is not defined for current OS" +#endif + return result; +} + +internal CTRL_UnwindStepResult +ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us) +{ + CTRL_UnwindStepResult result = {0}; +#if OS_LINUX + result = ctrl_unwind_step__dwarf(process, module, arch, reg_block, frame_ctx, endt_us); +#elif OS_WINDOWS + switch(arch) { - switch(arch) + case Arch_Null:{}break; + case Arch_x64:{result = ctrl_unwind_step__pe_x64(process, module, module_base_vaddr, reg_block, endt_us);}break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: { - default:{}break; - case Arch_x64: - { - result = ctrl_unwind_step__pe_x64(process, module, module_base_vaddr, (REGS_RegBlockX64 *)reg_block, endt_us); - }break; - } + NotImplemented; + }break; + default:{InvalidPath;}break; } +#else +# error "unwinder is not defined for current OS" +#endif return result; } @@ -3004,8 +3080,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); - CTRL_Unwind unwind = {0}; - unwind.flags |= CTRL_UnwindFlag_Error; + CTRL_Unwind unwind = { .flags = CTRL_UnwindFlag_Error }; //- rjf: unpack args CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, thread); @@ -3023,24 +3098,25 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U U64 frame_node_count = 0; if(regs_block_good) { - unwind.flags = 0; - for(;;) + for(unwind.flags = 0;;) { - // rjf: regs -> rip*module U64 rip = regs_rip_from_arch_block(arch, regs_block); U64 rsp = regs_rsp_from_arch_block(arch, regs_block); - CTRL_Entity *module = &ctrl_entity_nil; - for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next) + + // rjf: cancel on 0 rip + if(rip == 0) { - if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, rip)) - { - module = m; - break; - } + break; } - - // rjf: cancel on 0 rip/rsp - if(rsp == 0 && rip == 0) + + // rip -> module + CTRL_Entity *module = ctrl_module_from_process_vaddr(process_entity, rip); + + // establish frame context + CTRL_FrameUnwindContext frame_ctx = {0}; + CTRL_UnwindStepResult frame_ctx_result = ctrl_establish_frame_unwind_context(scratch.arena, process_entity->handle, module->handle, arch, regs_block, endt_us, &frame_ctx); + unwind.flags |= frame_ctx_result.flags; + if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error)) { break; } @@ -3048,19 +3124,19 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U // rjf: valid step -> push frame CTRL_UnwindFrameNode *frame_node = push_array(scratch.arena, CTRL_UnwindFrameNode, 1); CTRL_UnwindFrame *frame = &frame_node->v; + frame->cfa = frame_ctx.cfa; frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); MemoryCopy(frame->regs, regs_block, arch_reg_block_size); DLLPushBack(first_frame_node, last_frame_node, frame_node); frame_node_count += 1; // rjf: unwind one step - CTRL_UnwindStepResult step = ctrl_unwind_step(process_entity->handle, module->handle, module->vaddr_range.min, arch, regs_block, endt_us); + CTRL_UnwindStepResult step = ctrl_unwind_step(process_entity->handle, module->handle, module->vaddr_range.min, arch, regs_block, &frame_ctx, endt_us); unwind.flags |= step.flags; - if(step.flags & CTRL_UnwindFlag_Error || - regs_rsp_from_arch_block(arch, regs_block) == 0 || - regs_rip_from_arch_block(arch, regs_block) == 0 || - (regs_rsp_from_arch_block(arch, regs_block) == rsp && - regs_rip_from_arch_block(arch, regs_block) == rip)) + + // stop unwinding on errors or stale data + if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error) || + (regs_rsp_from_arch_block(arch, regs_block) == rsp && regs_rip_from_arch_block(arch, regs_block) == rip)) { break; } @@ -3133,6 +3209,7 @@ ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *bas SLLQueuePush(first_frame, last_frame, dst_inline); dst_inline->v.unwind_count = base_frame_idx; dst_inline->v.regs = src->regs; + dst_inline->v.cfa = src->cfa; frame_count += 1; inline_frame_count += 1; } @@ -3142,6 +3219,7 @@ ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *bas SLLQueuePush(first_frame, last_frame, dst_base); dst_base->v.unwind_count = base_frame_idx; dst_base->v.regs = src->regs; + dst_base->v.cfa = src->cfa; frame_count += 1; // rjf: hook up inline frames to point to concrete frame, and to account for inline depth @@ -4898,6 +4976,8 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C ctx->frame_base = push_array(arena, U64, 1); // TODO(rjf): need to compute this out here somehow... ctx->frame_base[0] = ; ctx->tls_base = push_array(arena, U64, 1); + // TODO: compute CFA + ctx->cfa = 0; } e_select_interpret_ctx(&scope->interpret_ctx, eval_dbg_infos_primary->rdi, thread_rip_voff); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 69d629a8..650207d8 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -248,6 +248,7 @@ typedef struct CTRL_UnwindFrame CTRL_UnwindFrame; struct CTRL_UnwindFrame { void *regs; + U64 cfa; }; typedef struct CTRL_UnwindFrameNode CTRL_UnwindFrameNode; @@ -272,6 +273,15 @@ struct CTRL_Unwind CTRL_UnwindFlags flags; }; +typedef struct CTRL_FrameUnwindContext CTRL_FrameUnwindContext; +struct CTRL_FrameUnwindContext +{ + // DWARF + U64 cfa; + DW_CFI_Row *cfi_row; + U64 ret_addr_reg; +}; + //////////////////////////////// //~ rjf: Call Stack Types @@ -281,6 +291,7 @@ struct CTRL_CallStackFrame U64 unwind_count; U64 inline_depth; void *regs; + U64 cfa; }; typedef struct CTRL_CallStack CTRL_CallStack; @@ -948,14 +959,15 @@ internal Arch ctrl_arch_from_process_handle(CTRL_Handle process_handle); internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src); //- DWARF -internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us); +internal CTRL_UnwindStepResult ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out); +internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us); //- rjf: [x64] internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); //- rjf: abstracted unwind step -internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, U64 endt_us); +internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us); //- rjf: abstracted full unwind internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us); diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index a0a9295f..67ff4c22 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -1138,6 +1138,20 @@ d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) return result; } +internal U64 +d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) +{ + U64 cfa = 0; + Access *access = access_open(); + CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); + if(callstack.concrete_frames_count != 0) + { + cfa = callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->cfa; + } + access_close(access); + return cfa; +} + internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) { diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 1104bd33..03b4a8f8 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -418,6 +418,7 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); //- rjf: per-run caches internal U64 d_query_cached_rip_from_thread(CTRL_Entity *thread); internal U64 d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); +internal U64 d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); internal E_String2NumMap *d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); internal E_String2NumMap *d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index c444dbc2..27c37e66 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -237,18 +237,14 @@ dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodeP } internal DW_UnwindStatus -dw_cfi_apply_register_rules(Arch arch, - DW_CIE *cie, - DW_CFI_Row *row, - DW_MemRead *mem_read_func, void *mem_read_ud, - DW_RegRead *reg_read_func, void *reg_read_ud, - DW_RegWrite *reg_write_func, void *reg_write_ud) +dw_compute_cfa(Arch arch, + DW_CFI_Row *row, + DW_MemRead *mem_read_func, void *mem_read_ud, + DW_RegRead *reg_read_func, void *reg_read_ud, + U64 *cfa_out) { - Temp scratch = scratch_begin(0,0); - DW_UnwindStatus unwind_status = DW_UnwindStatus_Ok; + DW_UnwindStatus unwind_status = DW_UnwindStatus_Fail; - // establish CFA - U64 cfa = 0; switch (row->cfa.rule) { case DW_CFA_Rule_Null: break; case DW_CFA_Rule_RegOff: { @@ -257,14 +253,29 @@ dw_cfi_apply_register_rules(Arch arch, U64 reg_size = dw_reg_size_from_code(arch, row->cfa.reg); AssertAlways(reg_size <= sizeof(cfa_reg_value)); unwind_status = reg_read_func(row->cfa.reg, &cfa_reg_value, reg_size, reg_read_ud); - if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } - cfa = cfa_reg_value + row->cfa.off; + if (unwind_status != DW_UnwindStatus_Ok) { break; } + *cfa_out = cfa_reg_value + row->cfa.off; } break; case DW_CFA_Rule_Expression: { // TODO: evaluate expression + NotImplemented; } break; } + return unwind_status; +} + +internal DW_UnwindStatus +dw_cfi_apply_register_rules(Arch arch, + U64 cfa, + DW_CFI_Row *row, + DW_MemRead *mem_read_func, void *mem_read_ud, + DW_RegRead *reg_read_func, void *reg_read_ud, + DW_RegWrite *reg_write_func, void *reg_write_ud) +{ + Temp scratch = scratch_begin(0,0); + DW_UnwindStatus unwind_status = DW_UnwindStatus_Ok; + U64 max_reg_size = dw_reg_max_size_from_arch(arch); void *reg_buffer = push_array(scratch.arena, U8, max_reg_size); diff --git a/src/dwarf/dwarf_unwind.h b/src/dwarf/dwarf_unwind.h index bc8b2c57..afe2b294 100644 --- a/src/dwarf/dwarf_unwind.h +++ b/src/dwarf/dwarf_unwind.h @@ -89,7 +89,7 @@ internal DW_CFI_Unwind * dw_cfi_unwind_init(Arena *arena, Arch arch, DW_CIE *cie internal B32 dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw); internal DW_CFI_Row * dw_cfi_row_from_pc(Arena *arena, Arch arch, struct DW_CIE *cie, struct DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc); -internal DW_UnwindStatus dw_cfi_apply_register_rules(Arch arch, DW_CIE *cie, DW_CFI_Row *row, DW_MemRead *mem_read_func, void *mem_read_ud, DW_RegRead *reg_read_func, void *reg_read_ud, DW_RegWrite *reg_write_func, void *reg_write_ud); +internal DW_UnwindStatus dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, DW_MemRead *mem_read_func, void *mem_read_ud, DW_RegRead *reg_read_func, void *reg_read_ud, DW_RegWrite *reg_write_func, void *reg_write_ud); #endif // DWARF_UNWIND_H diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 53710f16..19f69266 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -26,10 +26,10 @@ e_select_interpret_ctx(E_InterpretCtx *ctx, RDI_Parsed *primary_rdi, U64 ip_voff RDI_LocationKind loc_kind = *(RDI_LocationKind *)(all_location_data + block->location_data_off); if(loc_kind == RDI_LocationKind_ValBytecodeStream || loc_kind == RDI_LocationKind_AddrBytecodeStream) { - U8 *bytecode_ptr = all_location_data + block->location_data_off + sizeof(RDI_LocationKind); + U8 *bytecode_ptr = all_location_data + block->location_data_off; U8 *bytecode_opl = all_location_data + all_location_data_size; U64 bytecode_size = rdi_size_from_bytecode_stream(bytecode_ptr, bytecode_opl); - String8 bytecode = str8(bytecode_ptr, bytecode_size); + String8 bytecode = str8(bytecode_ptr + sizeof(RDI_LocationKind), bytecode_size); frame_base = e_interpret(bytecode); } else if(loc_kind != RDI_LocationKind_NULL) @@ -960,6 +960,11 @@ e_interpret(String8 bytecode) // TODO: add support for pushing multiple values onto the stack NotImplemented; }break; + + case RDI_EvalOp_PushCfa: + { + nval.u64 = e_interpret_ctx->cfa; + }break; } // rjf: push diff --git a/src/eval/eval_interpret.h b/src/eval/eval_interpret.h index 590d4e4e..83a82c59 100644 --- a/src/eval/eval_interpret.h +++ b/src/eval/eval_interpret.h @@ -17,6 +17,7 @@ struct E_InterpretCtx U64 *module_base; U64 *frame_base; U64 *tls_base; + U64 cfa; }; //////////////////////////////// diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 01cfcb8d..8da90017 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11912,6 +11912,7 @@ rd_frame(void) ctx->frame_base = push_array(scratch.arena, U64, 1); ctx->tls_base = push_array(scratch.arena, U64, 1); ctx->tls_base[0] = d_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, rip_vaddr); + ctx->cfa = d_query_cached_cfa_from_thread_unwind(thread, unwind_count); } e_select_interpret_ctx(interpret_ctx, eval_dbg_infos_primary->rdi, rip_voff); From 7f701dd80690c972b93b159e59e570710426ace9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 26 Nov 2025 20:31:34 -0800 Subject: [PATCH 085/850] minor fix --- src/demon/linux/demon_core_linux.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 6ce420ff..e48631f3 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -2564,7 +2564,9 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) pid_t new_pid; if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid)) >= 0) { - dmn_lnx_handle_create_thread(arena, &events, dmn_lnx_thread_from_pid(wait_id), new_pid); + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); + DMN_LNX_Entity *process = thread->parent; + dmn_lnx_handle_create_thread(arena, &events, process, new_pid); } else { Assert(0 && "failed to get new tid"); } }break; From 1602a9e6ea0cb51aa588d1a6e7b4557f1b9f2103 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 26 Nov 2025 16:27:43 -0800 Subject: [PATCH 086/850] runtime target OS handling --- src/ctrl/ctrl_core.c | 107 ++++++++++++++++++++++++------------------- src/ctrl/ctrl_core.h | 7 ++- 2 files changed, 64 insertions(+), 50 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index f31cd624..58fd5c70 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -630,6 +630,7 @@ ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max) str8_serial_push_struct(scratch.arena, &srl, &event->exception_code); str8_serial_push_struct(scratch.arena, &srl, &event->rgba); str8_serial_push_struct(scratch.arena, &srl, &event->bp_flags); + str8_serial_push_struct(scratch.arena, &srl, &event->target_os); str8_serial_push_struct(scratch.arena, &srl, &event->tls_model); str8_serial_push_struct(scratch.arena, &srl, &event->tls_index); str8_serial_push_struct(scratch.arena, &srl, &event->tls_offset); @@ -666,6 +667,7 @@ ctrl_event_from_serialized_string(Arena *arena, String8 string) read_off += str8_deserial_read_struct(string, read_off, &event.exception_code); read_off += str8_deserial_read_struct(string, read_off, &event.rgba); read_off += str8_deserial_read_struct(string, read_off, &event.bp_flags); + read_off += str8_deserial_read_struct(string, read_off, &event.target_os); read_off += str8_deserial_read_struct(string, read_off, &event.tls_model); read_off += str8_deserial_read_struct(string, read_off, &event.tls_index); read_off += str8_deserial_read_struct(string, read_off, &event.tls_offset); @@ -1270,6 +1272,7 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis CTRL_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); process->tls_model = event->tls_model; + process->target_os = event->target_os; }break; case CTRL_EventKind_EndProc: { @@ -2129,7 +2132,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han } internal CTRL_UnwindStepResult -ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us) +ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us) { Temp scratch = scratch_begin(0, 0); @@ -3032,47 +3035,6 @@ ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, return result; } -//- rjf: abstracted unwind step - -internal CTRL_UnwindStepResult -ctrl_establish_frame_unwind_context(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out) -{ - CTRL_UnwindStepResult result = {0}; -#if OS_LINUX - result = ctrl_establish_frame_unwind_context__dwarf(arena, process_handle, module_handle, arch, regs, endt_us, ctx_out); -#elif OS_WINDOWS - // windows does not have a concept of frame context -#else -# error "unwinder is not defined for current OS" -#endif - return result; -} - -internal CTRL_UnwindStepResult -ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us) -{ - CTRL_UnwindStepResult result = {0}; -#if OS_LINUX - result = ctrl_unwind_step__dwarf(process, module, arch, reg_block, frame_ctx, endt_us); -#elif OS_WINDOWS - switch(arch) - { - case Arch_Null:{}break; - case Arch_x64:{result = ctrl_unwind_step__pe_x64(process, module, module_base_vaddr, reg_block, endt_us);}break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { - NotImplemented; - }break; - default:{InvalidPath;}break; - } -#else -# error "unwinder is not defined for current OS" -#endif - return result; -} - //- rjf: abstracted full unwind internal CTRL_Unwind @@ -3110,11 +3072,28 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U } // rip -> module - CTRL_Entity *module = ctrl_module_from_process_vaddr(process_entity, rip); + CTRL_Entity *module_entity = ctrl_module_from_process_vaddr(process_entity, rip); // establish frame context CTRL_FrameUnwindContext frame_ctx = {0}; - CTRL_UnwindStepResult frame_ctx_result = ctrl_establish_frame_unwind_context(scratch.arena, process_entity->handle, module->handle, arch, regs_block, endt_us, &frame_ctx); + CTRL_UnwindStepResult frame_ctx_result = {0}; + switch(process_entity->target_os) + { + case OperatingSystem_Null:{}break; + case OperatingSystem_Windows: + { + // no concept of frame unwind context + }break; + case OperatingSystem_Linux: + { + frame_ctx_result = ctrl_establish_frame_unwind_context__dwarf(arena, process_entity->handle, module_entity->handle, arch, regs_block, endt_us, &frame_ctx); + }break; + case OperatingSystem_Mac: + { + NotImplemented; + }break; + default: { InvalidPath; }break; + } unwind.flags |= frame_ctx_result.flags; if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error)) { @@ -3131,10 +3110,41 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U frame_node_count += 1; // rjf: unwind one step - CTRL_UnwindStepResult step = ctrl_unwind_step(process_entity->handle, module->handle, module->vaddr_range.min, arch, regs_block, &frame_ctx, endt_us); - unwind.flags |= step.flags; + CTRL_UnwindStepResult step_result = {0}; + switch(process_entity->target_os) + { + case OperatingSystem_Null:{}break; + case OperatingSystem_Windows: + { + switch(arch) + { + case Arch_Null:{}break; + case Arch_x64: + { + step_result = ctrl_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us); + }break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: + { + NotImplemented; + }break; + default: { InvalidPath; } break; + } + }break; + case OperatingSystem_Linux: + { + step_result = ctrl_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us); + }break; + case OperatingSystem_Mac: + { + NotImplemented; + }break; + default: { InvalidPath; }break; + } // stop unwinding on errors or stale data + unwind.flags |= step_result.flags; if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error) || (regs_rsp_from_arch_block(arch, regs_block) == rsp && regs_rip_from_arch_block(arch, regs_block) == rip)) { @@ -4524,6 +4534,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, out_evt->arch = event->arch; out_evt->entity_id = event->code; out_evt->tls_model = ctrl_dynamic_linker_type_from_dmn(event->tls_model); + out_evt->target_os = OperatingSystem_CURRENT; // TODO: operating system of the remote target machine ctrl_state->process_counter += 1; }break; case DMN_EventKind_CreateThread: @@ -6945,6 +6956,10 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, dst_e->timestamp = src_e->timestamp; dst_e->bp_flags = src_e->bp_flags; dst_e->string = push_str8_copy(scratch.arena, src_e->string); + dst_e->tls_index = src_e->tls_index; + dst_e->tls_offset = src_e->tls_offset; + dst_e->target_os = src_e->target_os; + dst_e->tls_model = src_e->tls_model; } if(dst_parent == &ctrl_entity_nil) { diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 650207d8..77870198 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -133,6 +133,7 @@ struct CTRL_Entity CTRL_TlsModel tls_model; U64 tls_index; U64 tls_offset; + OperatingSystem target_os; }; typedef struct CTRL_EntityNode CTRL_EntityNode; @@ -544,6 +545,7 @@ struct CTRL_Event U32 rgba; CTRL_UserBreakpointFlags bp_flags; String8 string; + OperatingSystem target_os; CTRL_TlsModel tls_model; }; @@ -960,15 +962,12 @@ internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind //- DWARF internal CTRL_UnwindStepResult ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out); -internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us); +internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us); //- rjf: [x64] internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); -//- rjf: abstracted unwind step -internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us); - //- rjf: abstracted full unwind internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us); From f8f3f95d334d2ee5d38f70dd4dc8767c944da0d9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 27 Nov 2025 15:45:36 -0800 Subject: [PATCH 087/850] set trace options in PTRACE_SEIZE and remove unnecessary PTRACE_SETOPTIONS --- src/demon/linux/demon_core_linux.c | 62 ++++++++++-------------------- src/demon/linux/demon_core_linux.h | 1 - 2 files changed, 21 insertions(+), 42 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index e48631f3..60b53de1 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -2113,9 +2113,6 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) // change work directory to tracee if(OS_LNX_RETRY_ON_EINTR(chdir(work_dir_path)) < 0) { goto child_exit; } - // @first_sigstop notify parent that we are going to execve - if(OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)) < 0) { goto child_exit; } - // replace process with target program if(OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, envp)) < 0) { goto child_exit; } @@ -2128,7 +2125,9 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) B32 failed_to_seize = 1; // try to seize child process - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, 0) < 0)) { goto parent_exit; } + // + // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE) < 0)) { goto parent_exit; } // ensure tracer ops are issued on thread that sizes processes if(dmn_lnx_state->tracer_tid == 0) { dmn_lnx_state->tracer_tid = gettid(); } @@ -2140,7 +2139,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) else { pending_proc = push_array(dmn_lnx_state->arena, DMN_LNX_ProcessLaunch, 1); } // add pending proc node to the list - *pending_proc = (DMN_LNX_ProcessLaunch){ params->debug_subprocesses, pid, DMN_LNX_ProcessLaunchState_SigStop }; + *pending_proc = (DMN_LNX_ProcessLaunch){ params->debug_subprocesses, pid, DMN_LNX_ProcessLaunchState_Exec }; dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_procs, pending_proc); // tracee was successfully seized @@ -2414,52 +2413,33 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // process unexpectedly exited if(wifexited) { pending_proc->state = DMN_LNX_ProcessLaunchState_Exit; } - if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exec && wstopsig == SIGTRAP && event_code == PTRACE_EVENT_EXEC) + if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exec) { - // move pending process node to the free list - dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); - - // push create process events - dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, wait_id); - - // override event code so the main code path does not create another process - event_code = PTRACE_EVENT_STOP; - } - else - { - B32 shutdown_process = 1; - - if(pending_proc->state == DMN_LNX_ProcessLaunchState_SigStop && wstopsig == SIGSTOP) // @first_sigstop - { - // set trace options and singal to proceed to the execve - // - // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFROK | PTRACE_O_TRACEVFORKDONE - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETOPTIONS, wait_id, 0, (void *)(PTRACE_O_EXITKILL | PTRACE_O_TRACEEXEC | PTRACE_O_TRACECLONE))) >= 0) - { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, wait_id, 0, 0)) >= 0) - { - // update pending process state - pending_proc->state = DMN_LNX_ProcessLaunchState_Exec; - shutdown_process = 0; - } - } - } - else if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exit) + if(wstopsig == SIGTRAP && event_code == PTRACE_EVENT_EXEC) { // move pending process node to the free list dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); - shutdown_process = 0; - } - // exit on abnormal process init - if(shutdown_process) + // push create process events + dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, wait_id); + + // override event code so the main code path does not create another process + event_code = PTRACE_EVENT_STOP; + } + else { + // shutdown process on abnormal init OS_LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)); pending_proc->state = DMN_LNX_ProcessLaunchState_Exit; + continue; } - + } + else if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exit) + { + // move pending process node to the free list + dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); continue; } } diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index a1c65f8f..e0f8329e 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -252,7 +252,6 @@ typedef U32 DMN_LNX_ProcessLaunchState; enum { DMN_LNX_ProcessLaunchState_Null, - DMN_LNX_ProcessLaunchState_SigStop, DMN_LNX_ProcessLaunchState_Exec, DMN_LNX_ProcessLaunchState_Exit, }; From 81f08a01bcf8658ccd360edff0839daeadbf8f37 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 2 Dec 2025 14:39:36 -0800 Subject: [PATCH 088/850] inline anonymous members --- src/dwarf/dwarf_parse.h | 3 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 199 +++++++++++++++------------- src/rdi_from_dwarf/rdi_from_dwarf.h | 7 + 3 files changed, 117 insertions(+), 92 deletions(-) diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index e6bd6cc6..4d17e932 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -125,6 +125,7 @@ typedef struct DW_AttribList U64 count; } DW_AttribList; +typedef U8 DW_TagSpare; typedef struct DW_Tag { B32 has_children; @@ -132,7 +133,7 @@ typedef struct DW_Tag DW_TagKind kind; DW_AttribList attribs; U64 info_off; - U8 v[1]; + DW_TagSpare v; } DW_Tag; typedef struct DW_TagNode diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 0d7f5d6e..ed66438a 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1756,15 +1756,15 @@ d2r_tag_iterator_parent_tag(D2R_TagIterator *iter) } internal void -d2r_flag_converted_tag(DW_TagNode *tag_node) +d2r_flag_converted_type_tag(DW_TagNode *tag_node) { - tag_node->tag.v[0] = 1; + tag_node->tag.v |= D2R_TagFlags_TypeConverted; } internal B8 -d2r_is_tag_converted(DW_TagNode *tag_node) +d2r_is_type_tag_converted(DW_TagNode *tag_node) { - return tag_node->tag.v[0]; + return !!(tag_node->tag.v & D2R_TagFlags_TypeConverted); } internal RDIM_Type * @@ -1825,12 +1825,12 @@ d2r_convert_types(Arena *arena, DW_Tag tag = tag_node->tag; // skip converted tags - if (d2r_is_tag_converted(tag_node)) { + if (d2r_is_type_tag_converted(tag_node)) { d2r_tag_iterator_skip_children(it); continue; } // mark the tag as converted here, because during conversion we may recurse on the same tag - d2r_flag_converted_tag(tag_node); + d2r_flag_converted_type_tag(tag_node); switch (tag.kind) { case DW_TagKind_ClassType: { @@ -2196,20 +2196,44 @@ d2r_convert_types(Arena *arena, } RDIM_Type *parent = d2r_type_from_offset(type_table, parent_tag.info_off); - if(parent->udt != 0) - { - RDIM_Type *type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); - RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, parent->udt); - member->kind = RDI_MemberKind_Base; - member->type = type; - member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); - } + RDIM_Type *type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, parent->udt); + member->kind = RDI_MemberKind_Base; + member->type = type; + member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); } break; } } scratch_end(scratch); } +internal B8 +d2r_is_udt_tag_converted(DW_TagNode *tag_node) +{ + return !!(tag_node->tag.v & D2R_TagFlags_UdtConverted); +} + +internal void +d2r_flag_converted_udt_tag(DW_TagNode *tag_node) +{ + tag_node->tag.v |= D2R_TagFlags_UdtConverted; +} + +internal void +d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, RDIM_UDT *udt) +{ + for (RDIM_UDTMember *curr = udt->first_member, *prev = 0; curr != 0; prev = curr, curr = curr->next) { + if (curr->name.size == 0) { + d2r_inline_anonymous_udt_member(arena, top_udt, base_off + curr->off, curr->type->udt); + } else { + // copy member and adjust its offset relative to inlined position in the root UDT + RDIM_UDTMember *m = rdim_udt_push_member(arena, &udts, top_udt); + *m = *curr; + m->off += base_off; + } + } +} + internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, @@ -2220,89 +2244,82 @@ d2r_convert_udts(Arena *arena, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; - switch (tag.kind) { - case DW_TagKind_ClassType: { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - d2r_tag_iterator_skip_children(it); - } else { - RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); - udt->self_type = type; - type->udt = udt; - } - } break; - case DW_TagKind_StructureType: { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - d2r_tag_iterator_skip_children(it); - } else { - RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); - udt->self_type = type; - type->udt = udt; - } - } break; - case DW_TagKind_UnionType: { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - d2r_tag_iterator_skip_children(it); - } else { - RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); - udt->self_type = type; - type->udt = udt; - } - } break; - case DW_TagKind_EnumerationType: { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - d2r_tag_iterator_skip_children(it); - } else { - RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); - udt->self_type = type; - type->udt = udt; - } - } break; - case DW_TagKind_Member: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType || - parent_tag.kind == DW_TagKind_ClassType || - parent_tag.kind == DW_TagKind_UnionType; - if (is_parent_udt) { - DW_Attrib *data_member_location = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_DataMemberLocation); - DW_AttribClass data_member_location_class = dw_value_class_from_attrib(cu, data_member_location); - if (data_member_location_class == DW_AttribClass_LocList) { - AssertAlways(!"UDT member with multiple locations are not supported"); + + // skip converted tags + if (d2r_is_udt_tag_converted(tag_node)) { + d2r_tag_iterator_skip_children(it); + continue; + } + d2r_flag_converted_udt_tag(tag_node); + + if (tag.kind == DW_TagKind_ClassType || tag.kind == DW_TagKind_StructureType || tag.kind == DW_TagKind_UnionType) { + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { + d2r_tag_iterator_skip_children(it); + } else { + RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); + RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); + udt->self_type = type; + type->udt = udt; + } + } else if (tag.kind == DW_TagKind_EnumerationType) { + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { + d2r_tag_iterator_skip_children(it); + } else { + RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); + RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); + udt->self_type = type; + type->udt = udt; + } + } else if (tag.kind == DW_TagKind_Member) { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType || + parent_tag.kind == DW_TagKind_ClassType || + parent_tag.kind == DW_TagKind_UnionType; + if (is_parent_udt) { + RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); + RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); + String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + U64 off = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation); + if (name.size == 0) { // inline anonymous members + DW_Reference type_ref = dw_ref_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Type); + RDIM_Type *member_type = d2r_type_from_offset(type_table, type_ref.info_off); + RDIM_UDT *member_udt = member_type->udt; + if (member_udt == 0) { + DW_Language ref_cu_lang = dw_const_u64_from_tag_attrib_kind(input, type_ref.cu, type_ref.cu->tag, DW_AttribKind_Language); + DW_TagNode *ref_tag_node = dw_tag_node_from_info_off(type_ref.cu, type_ref.info_off); + d2r_convert_udts(arena, type_table, input, type_ref.cu, ref_cu_lang, arch_addr_size, ref_tag_node); + Assert(member_type->udt); + member_udt = member_type->udt; } - - RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_UDTMember *udt_member = rdim_udt_push_member(arena, &udts, parent_type->udt); - udt_member->kind = RDI_MemberKind_DataField; - udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - udt_member->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - udt_member->off = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation); + d2r_inline_anonymous_udt_member(arena, parent_type->udt, off, member_udt); } else { - // TODO: error handling - AssertAlways(!"unexpected parent tag"); + RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, parent_type->udt); + member->kind = RDI_MemberKind_DataField; + member->name = name; + member->type = type; + member->off = off; } - } break; - case DW_TagKind_Enumerator: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind == DW_TagKind_EnumerationType) { - RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &udts, parent_type->udt); - udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - udt_member->val = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ConstValue); - } else { - // TODO: error handling - AssertAlways(!"unexpected parent tag"); - } - } break; + } else { + // TODO: error handling + AssertAlways(!"unexpected parent tag"); + } + } else if (tag.kind == DW_TagKind_Enumerator) { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + if (parent_tag.kind == DW_TagKind_EnumerationType) { + RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); + RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &udts, parent_type->udt); + udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + udt_member->val = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ConstValue); + } else { + // TODO: error handling + AssertAlways(!"unexpected parent tag"); + } } } scratch_end(scratch); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 5b297184..ec07ba46 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -23,6 +23,13 @@ typedef struct D2R_TypeTable RDIM_Type **builtin_types; } D2R_TypeTable; +typedef DW_TagSpare D2R_TagFlags; +enum +{ + D2R_TagFlags_TypeConverted = (1 << 0), + D2R_TagFlags_UdtConverted = (1 << 1), +}; + typedef struct D2R_TagFrame { DW_TagNode *node; From 38dbcde3f46497e0fa134a8337ac1ec1baead905 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 2 Dec 2025 17:00:05 -0800 Subject: [PATCH 089/850] debug info path entity is needed otherwise unwinder fails to map key to RDI --- src/ctrl/ctrl_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 58fd5c70..3bdb51c1 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -6934,7 +6934,7 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, rec = ctrl_entity_rec_depth_first_pre(src_e, src_process); // rjf: determine if we need this entity - B32 need_this_entity = (ctrl_handle_match(thread_handle, src_e->handle) || src_e->kind == CTRL_EntityKind_Module || src_e->kind == CTRL_EntityKind_Process); + B32 need_this_entity = (ctrl_handle_match(thread_handle, src_e->handle) || src_e->kind == CTRL_EntityKind_Module || src_e->kind == CTRL_EntityKind_Process || src_e->kind == CTRL_EntityKind_DebugInfoPath); // rjf: copy this entity CTRL_Entity *dst_e = &ctrl_entity_nil; From f4ceaecf756900930a474f7b85e7f95540fc9797 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 5 Dec 2025 13:35:10 -0800 Subject: [PATCH 090/850] set flags in xstate_bv for updated registers --- src/demon/linux/demon_core_linux.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 60b53de1..ba963fb1 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -1245,12 +1245,10 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) if(x64_is_xsave_supported()) { - U8 *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); - int xsave_get = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = xsave_raw, .iov_len = process->xsave_size })); - AssertAlways(xsave_get >= 0); - - X64_XSave *dst = (X64_XSave *)xsave_raw; + U8 *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); + X64_XSave *dst = (X64_XSave *)xsave_raw; dst->fxsave = dst_fxsave; + dst->header.xstate_bv |= X64_XStateComponentFlag_SSE; if(process->xsave_layout.avx_offset) { @@ -1262,6 +1260,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) { MemoryCopy(&avx_d[n], &zmm_s[n].v[16], sizeof(REGS_Reg128)); } + dst->header.xstate_bv |= X64_XStateComponentFlag_AVX; } } @@ -1275,6 +1274,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) { MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64)); } + dst->header.xstate_bv |= X64_XStateComponentFlag_OPMASK; } else { Assert(0 && "invalid xsave size"); } } @@ -1289,6 +1289,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) { MemoryCopy(&avx512h_d[n], &zmmh_s[n].v[32], sizeof(REGS_Reg256)); } + dst->header.xstate_bv |= X64_XStateComponentFlag_ZMM_H; } else { Assert(0 && "invalid xsave size"); } } @@ -1303,6 +1304,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) { MemoryCopy(&avx512_d[n], &zmm_s[n], sizeof(REGS_Reg512)); } + dst->header.xstate_bv |= X64_XStateComponentFlag_ZMM; } else { Assert(0 && "invalid xsave size"); } } @@ -1314,11 +1316,13 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) REGS_Reg64 *cet_u = (REGS_Reg64 *)(xsave_raw + process->xsave_layout.cet_u_offset); cet_u[0] = src->cetmsr; cet_u[1] = src->cetssp; + dst->header.xstate_bv |= X64_XStateComponentFlag_CETU; } else { Assert(0 && "invalid xsave size"); } } // xsave + Assert(dst->header.xcomp_bv == 0); // must always be zero xsave_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process->xsave_size })); Assert(xsave_result >= 0); } From ce77442d373880f52de24bc7daf36c5c8ccd1a1e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 5 Dec 2025 16:36:46 -0800 Subject: [PATCH 091/850] fix x87 register layout --- src/codeview/codeview.h | 64 ++-- src/demon/linux/demon_core_linux.c | 26 +- src/demon/win32/demon_core_win32.c | 79 +---- src/demon/win32/demon_core_win32.h | 2 - src/dwarf/dwarf.h | 36 +-- src/lib_rdi/rdi.h | 392 ++++++++++++------------- src/rdi/rdi.mdesk | 196 ++++++------- src/regs/generated/regs.meta.c | 100 ++----- src/regs/generated/regs.meta.h | 50 +--- src/regs/rdi/generated/regs_rdi.meta.c | 36 --- src/regs/regs.h | 3 + src/regs/regs.mdesk | 52 ++-- src/x64/x64.h | 23 +- 13 files changed, 404 insertions(+), 655 deletions(-) diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index fa8f4e09..fbd0649a 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -78,14 +78,14 @@ X(IP, 31, eip, 0, 2) \ X(FLAGS, 32, eflags, 0, 2) \ X(EIP, 33, eip, 0, 4) \ X(EFLAGS, 34, eflags, 0, 4) \ -X(MM0, 146, fpr0, 0, 8) \ -X(MM1, 147, fpr1, 0, 8) \ -X(MM2, 148, fpr2, 0, 8) \ -X(MM3, 149, fpr3, 0, 8) \ -X(MM4, 150, fpr4, 0, 8) \ -X(MM5, 151, fpr5, 0, 8) \ -X(MM6, 152, fpr6, 0, 8) \ -X(MM7, 153, fpr7, 0, 8) \ +X(MM0, 146, st0, 0, 8) \ +X(MM1, 147, st1, 0, 8) \ +X(MM2, 148, st2, 0, 8) \ +X(MM3, 149, st3, 0, 8) \ +X(MM4, 150, st4, 0, 8) \ +X(MM5, 151, st5, 0, 8) \ +X(MM6, 152, st6, 0, 8) \ +X(MM7, 153, st7, 0, 8) \ X(XMM0, 154, ymm0, 0, 16) \ X(XMM1, 155, ymm1, 0, 16) \ X(XMM2, 156, ymm2, 0, 16) \ @@ -382,14 +382,14 @@ X(FPDS, 142, nil, 0, 0) \ X(ISEM, 143, nil, 0, 0) \ X(FPEIP, 144, nil, 0, 0) \ X(FPEDO, 145, nil, 0, 0) \ -X(MM0, 146, fpr0, 0, 8) \ -X(MM1, 147, fpr1, 0, 8) \ -X(MM2, 148, fpr2, 0, 8) \ -X(MM3, 149, fpr3, 0, 8) \ -X(MM4, 150, fpr4, 0, 8) \ -X(MM5, 151, fpr5, 0, 8) \ -X(MM6, 152, fpr6, 0, 8) \ -X(MM7, 153, fpr7, 0, 8) \ +X(MM0, 146, st0, 0, 8) \ +X(MM1, 147, st1, 0, 8) \ +X(MM2, 148, st2, 0, 8) \ +X(MM3, 149, st3, 0, 8) \ +X(MM4, 150, st4, 0, 8) \ +X(MM5, 151, st5, 0, 8) \ +X(MM6, 152, st6, 0, 8) \ +X(MM7, 153, st7, 0, 8) \ X(XMM0, 154, zmm0, 0, 16) \ X(XMM1, 155, zmm1, 0, 16) \ X(XMM2, 156, zmm2, 0, 16) \ @@ -463,22 +463,22 @@ X(EMM4H, 232, zmm4, 8, 8) \ X(EMM5H, 233, zmm5, 8, 8) \ X(EMM6H, 234, zmm6, 8, 8) \ X(EMM7H, 235, zmm7, 8, 8) \ -X(MM00, 236, fpr0, 0, 4) \ -X(MM01, 237, fpr0, 4, 4) \ -X(MM10, 238, fpr1, 0, 4) \ -X(MM11, 239, fpr1, 4, 4) \ -X(MM20, 240, fpr2, 0, 4) \ -X(MM21, 241, fpr2, 4, 4) \ -X(MM30, 242, fpr3, 0, 4) \ -X(MM31, 243, fpr3, 4, 4) \ -X(MM40, 244, fpr4, 0, 4) \ -X(MM41, 245, fpr4, 4, 4) \ -X(MM50, 246, fpr5, 0, 4) \ -X(MM51, 247, fpr5, 4, 4) \ -X(MM60, 248, fpr6, 0, 4) \ -X(MM61, 249, fpr6, 4, 4) \ -X(MM70, 250, fpr7, 0, 4) \ -X(MM71, 251, fpr7, 4, 4) \ +X(MM00, 236, st0, 0, 4) \ +X(MM01, 237, st0, 4, 4) \ +X(MM10, 238, st1, 0, 4) \ +X(MM11, 239, st1, 4, 4) \ +X(MM20, 240, st2, 0, 4) \ +X(MM21, 241, st2, 4, 4) \ +X(MM30, 242, st3, 0, 4) \ +X(MM31, 243, st3, 4, 4) \ +X(MM40, 244, st4, 0, 4) \ +X(MM41, 245, st4, 4, 4) \ +X(MM50, 246, st5, 0, 4) \ +X(MM51, 247, st5, 4, 4) \ +X(MM60, 248, st6, 0, 4) \ +X(MM61, 249, st6, 4, 4) \ +X(MM70, 250, st7, 0, 4) \ +X(MM71, 251, st7, 4, 4) \ X(XMM8, 252, zmm8, 0, 16) \ X(XMM9, 253, zmm9, 0, 16) \ X(XMM10, 254, zmm10, 0, 16) \ diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index ba963fb1..86a9d9fd 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -1038,10 +1038,10 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) // copy x87 registers dst->fcw.u16 = src->fcw; dst->fsw.u16 = src->fsw; - dst->ftw.u16 = x64_xsave_tag_word_from_real_tag_word(src->ftw); + dst->ftw = src->ftw; dst->fop.u16 = src->fop; - dst->fip.u64 = src->b64.fip; - dst->fdp.u64 = src->b64.fdp; + dst->fip.u64 = src->fip; + dst->fdp.u64 = src->fdp; dst->mxcsr.u32 = src->mxcsr; dst->mxcsr_mask.u32 = src->mxcsr_mask; for EachIndex(i, 8) @@ -1063,6 +1063,9 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) // copy xsave registers if(xsave) { + // compact register layout is not supported + AssertAlways(xsave->header.xcomp_bv == 0); + if(xsave->header.xstate_bv & X64_XStateComponentFlag_AVX) { AssertAlways(process->xsave_layout.avx_offset + 16*sizeof(REGS_Reg128) <= process->xsave_size); @@ -1219,14 +1222,14 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) X64_FXSave dst_fxsave = {0}; { - dst_fxsave.fcw = src->fcw.u16; - dst_fxsave.fsw = src->fsw.u16; - dst_fxsave.ftw = src->ftw.u16; - dst_fxsave.fop = src->fop.u16; - dst_fxsave.b64.fip = src->fip.u64; - dst_fxsave.b64.fdp = src->fdp.u64; - dst_fxsave.mxcsr = src->mxcsr.u32; - dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32; + dst_fxsave.fcw = src->fcw.u16; + dst_fxsave.fsw = src->fsw.u16; + dst_fxsave.ftw = src->ftw; + dst_fxsave.fop = src->fop.u16; + dst_fxsave.fip = src->fip.u64; + dst_fxsave.fdp = src->fdp.u64; + dst_fxsave.mxcsr = src->mxcsr.u32; + dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32; REGS_Reg128 *st_d = (REGS_Reg128 *)dst_fxsave.st_space; REGS_Reg80 *st_s = &src->st0; @@ -1248,6 +1251,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) U8 *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); X64_XSave *dst = (X64_XSave *)xsave_raw; dst->fxsave = dst_fxsave; + dst->header.xstate_bv |= X64_XStateComponentFlag_FP; dst->header.xstate_bv |= X64_XStateComponentFlag_SSE; if(process->xsave_layout.avx_offset) diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index b2fe81f9..57a13702 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -582,57 +582,6 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) //- rjf: threads -internal U16 -dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave) -{ - U16 result = 0; - U32 top = (fxsave->StatusWord >> 11) & 7; - for(U32 fpr = 0; fpr < 8; fpr += 1) - { - U32 tag = 3; - if(fxsave->TagWord & (1 << fpr)) - { - U32 st = (fpr - top)&7; - - REGS_Reg80 *fp = (REGS_Reg80*)&fxsave->FloatRegisters[st*16]; - U16 exponent = fp->sign1_exp15 & bitmask15; - U64 integer_part = fp->int1_frac63 >> 63; - U64 fraction_part = fp->int1_frac63 & bitmask63; - - // tag: 0 - normal; 1 - zero; 2 - special - tag = 2; - if(exponent == 0) - { - if(integer_part == 0 && fraction_part == 0) - { - tag = 1; - } - } - else if(exponent != bitmask15 && integer_part != 0) - { - tag = 0; - } - } - result |= tag << (2 * fpr); - } - return result; -} - -internal U16 -dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw) -{ - U16 compact = 0; - for(U32 fpr = 0; fpr < 8; fpr++) - { - U32 tag = (ftw >> (fpr * 2)) & 3; - if(tag != 3) - { - compact |= (1 << fpr); - } - } - return compact; -} - internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) { @@ -694,7 +643,7 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) dst->eflags.u32 = ctx.EFlags | 0x2; dst->fcw.u16 = fxsave->ControlWord; dst->fsw.u16 = fxsave->StatusWord; - dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(fxsave); + dst->ftw.u16 = fxsave->TagWord; dst->fop.u16 = fxsave->ErrorOpcode; dst->fip.u32 = fxsave->ErrorOffset; dst->fcs.u16 = fxsave->ErrorSelector; @@ -704,7 +653,7 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) dst->mxcsr_mask.u32 = fxsave->MxCsr_Mask; { M128A *float_s = fxsave->FloatRegisters; - REGS_Reg80 *float_d = &dst->fpr0; + REGS_Reg80 *float_d = &dst->st0; for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) { MemoryCopy(float_d, float_s, sizeof(*float_d)); @@ -817,17 +766,15 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) dst->rflags.u64 = ctx->EFlags | 0x2; dst->fcw.u16 = xsave->ControlWord; dst->fsw.u16 = xsave->StatusWord; - dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(xsave); + dst->ftw = xsave->TagWord; dst->fop.u16 = xsave->ErrorOpcode; - dst->fcs.u16 = xsave->ErrorSelector; - dst->fds.u16 = xsave->DataSelector; - dst->fip.u64 = xsave->ErrorOffset; - dst->fdp.u64 = xsave->DataOffset; + MemoryCopy(&dst->fip.u64, &xsave->ErrorOffset, sizeof(U64)); + MemoryCopy(&dst->fdp.u64, &xsave->DataOffset, sizeof(U64)); dst->mxcsr.u32 = xsave->MxCsr; dst->mxcsr_mask.u32 = xsave->MxCsr_Mask; { M128A *float_s = xsave->FloatRegisters; - REGS_Reg80 *float_d = &dst->fpr0; + REGS_Reg80 *float_d = &dst->st0; for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) { MemoryCopy(float_d, float_s, sizeof(*float_d)); @@ -991,7 +938,7 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) ctx.EFlags = src->eflags.u32; fxsave->ControlWord = src->fcw.u16; fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); + fxsave->TagWord = src->ftw.u16; fxsave->ErrorOpcode = src->fop.u16; fxsave->ErrorSelector = src->fcs.u16; fxsave->DataSelector = src->fds.u16; @@ -1001,7 +948,7 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) fxsave->MxCsr_Mask = src->mxcsr_mask.u32; { M128A *float_d = fxsave->FloatRegisters; - REGS_Reg80 *float_s = &src->fpr0; + REGS_Reg80 *float_s = &src->st0; for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) { MemoryCopy(float_d, float_s, 10); @@ -1098,15 +1045,13 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) ctx->EFlags = src->rflags.u64; fxsave->ControlWord = src->fcw.u16; fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16); + fxsave->TagWord = src->ftw; fxsave->ErrorOpcode = src->fop.u16; - fxsave->ErrorSelector = src->fcs.u16; - fxsave->DataSelector = src->fds.u16; - fxsave->ErrorOffset = src->fip.u64; - fxsave->DataOffset = src->fdp.u64; + MemoryCopy(&fxsave->ErrorOffset, &src->fip.u64, sizeof(U64)); + MemoryCopy(&fxsave->DataOffset, &src->fdp.u64, sizeof(U64)); { M128A *float_d = fxsave->FloatRegisters; - REGS_Reg80 *float_s = &src->fpr0; + REGS_Reg80 *float_s = &src->st0; for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) { MemoryCopy(float_d, float_s, 10); diff --git a/src/demon/win32/demon_core_win32.h b/src/demon/win32/demon_core_win32.h index f5f9265e..c19b3cd4 100644 --- a/src/demon/win32/demon_core_win32.h +++ b/src/demon/win32/demon_core_win32.h @@ -350,8 +350,6 @@ internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); //- rjf: threads -internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave); -internal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw); internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block); internal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block); diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 89e9b099..4706619d 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1618,14 +1618,14 @@ X(Xmm4, 25, ymm4, 0, 16) \ X(Xmm5, 26, ymm5, 0, 16) \ X(Xmm6, 27, ymm6, 0, 16) \ X(Xmm7, 28, ymm7, 0, 16) \ -X(Mm0, 29, fpr0, 0, 8) \ -X(Mm1, 30, fpr1, 0, 8) \ -X(Mm2, 31, fpr2, 0, 8) \ -X(Mm3, 32, fpr3, 0, 8) \ -X(Mm4, 33, fpr4, 0, 8) \ -X(Mm5, 34, fpr5, 0, 8) \ -X(Mm6, 35, fpr6, 0, 8) \ -X(Mm7, 36, fpr7, 0, 8) \ +X(Mm0, 29, st0, 0, 8) \ +X(Mm1, 30, st1, 0, 8) \ +X(Mm2, 31, st2, 0, 8) \ +X(Mm3, 32, st3, 0, 8) \ +X(Mm4, 33, st4, 0, 8) \ +X(Mm5, 34, st5, 0, 8) \ +X(Mm6, 35, st6, 0, 8) \ +X(Mm7, 36, st7, 0, 8) \ X(Fcw, 37, fcw, 0, 2) \ X(Fsw, 38, fsw, 0, 2) \ X(Mxcsr, 39, mxcsr, 0, 4) \ @@ -1635,8 +1635,8 @@ X(Ss, 42, ss, 0, 2) \ X(Ds, 43, ds, 0, 2) \ X(Fs, 44, fs, 0, 2) \ X(Gs, 45, gs, 0, 2) \ -X(Tr, 48, tr, 0, 0) \ -X(Ldtr, 49, ldtr, 0, 0) +X(Tr, 48, tr, 0, 0) \ +X(Ldtr, 49, ldtr, 0, 0) #define DW_Regs_X64_XList(X) \ X(Rax, 0, rax, 0, 8) \ @@ -1696,14 +1696,14 @@ X(St4, 37, st4, 0, 10) \ X(St5, 38, st5, 0, 10) \ X(St6, 39, st6, 0, 10) \ X(St7, 40, st7, 0, 10) \ -X(Mm0, 41, fpr0, 0, 8) \ -X(Mm1, 42, fpr1, 0, 8) \ -X(Mm2, 43, fpr2, 0, 8) \ -X(Mm3, 44, fpr3, 0, 8) \ -X(Mm4, 45, fpr4, 0, 8) \ -X(Mm5, 46, fpr5, 0, 8) \ -X(Mm6, 47, fpr6, 0, 8) \ -X(Mm7, 48, fpr7, 0, 8) \ +X(Mm0, 41, st0, 0, 8) \ +X(Mm1, 42, st1, 0, 8) \ +X(Mm2, 43, st2, 0, 8) \ +X(Mm3, 44, st3, 0, 8) \ +X(Mm4, 45, st4, 0, 8) \ +X(Mm5, 46, st5, 0, 8) \ +X(Mm6, 47, st6, 0, 8) \ +X(Mm7, 48, st7, 0, 8) \ X(Rflags, 49, rflags, 0, 4) \ X(Es, 50, es, 0, 2) \ X(Cs, 51, cs, 0, 2) \ diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index fd680a04..8bb3fcfe 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -166,48 +166,40 @@ RDI_RegCodeX86_dr4 = 17, RDI_RegCodeX86_dr5 = 18, RDI_RegCodeX86_dr6 = 19, RDI_RegCodeX86_dr7 = 20, -RDI_RegCodeX86_fpr0 = 21, -RDI_RegCodeX86_fpr1 = 22, -RDI_RegCodeX86_fpr2 = 23, -RDI_RegCodeX86_fpr3 = 24, -RDI_RegCodeX86_fpr4 = 25, -RDI_RegCodeX86_fpr5 = 26, -RDI_RegCodeX86_fpr6 = 27, -RDI_RegCodeX86_fpr7 = 28, -RDI_RegCodeX86_st0 = 29, -RDI_RegCodeX86_st1 = 30, -RDI_RegCodeX86_st2 = 31, -RDI_RegCodeX86_st3 = 32, -RDI_RegCodeX86_st4 = 33, -RDI_RegCodeX86_st5 = 34, -RDI_RegCodeX86_st6 = 35, -RDI_RegCodeX86_st7 = 36, -RDI_RegCodeX86_fcw = 37, -RDI_RegCodeX86_fsw = 38, -RDI_RegCodeX86_ftw = 39, -RDI_RegCodeX86_fop = 40, -RDI_RegCodeX86_fcs = 41, -RDI_RegCodeX86_fds = 42, -RDI_RegCodeX86_fip = 43, -RDI_RegCodeX86_fdp = 44, -RDI_RegCodeX86_mxcsr = 45, -RDI_RegCodeX86_mxcsr_mask = 46, -RDI_RegCodeX86_ss = 47, -RDI_RegCodeX86_cs = 48, -RDI_RegCodeX86_ds = 49, -RDI_RegCodeX86_es = 50, -RDI_RegCodeX86_fs = 51, -RDI_RegCodeX86_gs = 52, -RDI_RegCodeX86_ymm0 = 53, -RDI_RegCodeX86_ymm1 = 54, -RDI_RegCodeX86_ymm2 = 55, -RDI_RegCodeX86_ymm3 = 56, -RDI_RegCodeX86_ymm4 = 57, -RDI_RegCodeX86_ymm5 = 58, -RDI_RegCodeX86_ymm6 = 59, -RDI_RegCodeX86_ymm7 = 60, -RDI_RegCodeX86_tr = 61, -RDI_RegCodeX86_ldtr = 62, +RDI_RegCodeX86_st0 = 21, +RDI_RegCodeX86_st1 = 22, +RDI_RegCodeX86_st2 = 23, +RDI_RegCodeX86_st3 = 24, +RDI_RegCodeX86_st4 = 25, +RDI_RegCodeX86_st5 = 26, +RDI_RegCodeX86_st6 = 27, +RDI_RegCodeX86_st7 = 28, +RDI_RegCodeX86_fcw = 29, +RDI_RegCodeX86_fsw = 30, +RDI_RegCodeX86_ftw = 31, +RDI_RegCodeX86_fop = 32, +RDI_RegCodeX86_fcs = 33, +RDI_RegCodeX86_fds = 34, +RDI_RegCodeX86_fip = 35, +RDI_RegCodeX86_fdp = 36, +RDI_RegCodeX86_mxcsr = 37, +RDI_RegCodeX86_mxcsr_mask = 38, +RDI_RegCodeX86_ss = 39, +RDI_RegCodeX86_cs = 40, +RDI_RegCodeX86_ds = 41, +RDI_RegCodeX86_es = 42, +RDI_RegCodeX86_fs = 43, +RDI_RegCodeX86_gs = 44, +RDI_RegCodeX86_ymm0 = 45, +RDI_RegCodeX86_ymm1 = 46, +RDI_RegCodeX86_ymm2 = 47, +RDI_RegCodeX86_ymm3 = 48, +RDI_RegCodeX86_ymm4 = 49, +RDI_RegCodeX86_ymm5 = 50, +RDI_RegCodeX86_ymm6 = 51, +RDI_RegCodeX86_ymm7 = 52, +RDI_RegCodeX86_tr = 53, +RDI_RegCodeX86_ldtr = 54, } RDI_RegCodeX86Enum; typedef RDI_U8 RDI_RegCodeX64; @@ -254,70 +246,62 @@ RDI_RegCodeX64_st4 = 37, RDI_RegCodeX64_st5 = 38, RDI_RegCodeX64_st6 = 39, RDI_RegCodeX64_st7 = 40, -RDI_RegCodeX64_fpr0 = 41, -RDI_RegCodeX64_fpr1 = 42, -RDI_RegCodeX64_fpr2 = 43, -RDI_RegCodeX64_fpr3 = 44, -RDI_RegCodeX64_fpr4 = 45, -RDI_RegCodeX64_fpr5 = 46, -RDI_RegCodeX64_fpr6 = 47, -RDI_RegCodeX64_fpr7 = 48, -RDI_RegCodeX64_zmm0 = 49, -RDI_RegCodeX64_zmm1 = 50, -RDI_RegCodeX64_zmm2 = 51, -RDI_RegCodeX64_zmm3 = 52, -RDI_RegCodeX64_zmm4 = 53, -RDI_RegCodeX64_zmm5 = 54, -RDI_RegCodeX64_zmm6 = 55, -RDI_RegCodeX64_zmm7 = 56, -RDI_RegCodeX64_zmm8 = 57, -RDI_RegCodeX64_zmm9 = 58, -RDI_RegCodeX64_zmm10 = 59, -RDI_RegCodeX64_zmm11 = 60, -RDI_RegCodeX64_zmm12 = 61, -RDI_RegCodeX64_zmm13 = 62, -RDI_RegCodeX64_zmm14 = 63, -RDI_RegCodeX64_zmm15 = 64, -RDI_RegCodeX64_zmm16 = 65, -RDI_RegCodeX64_zmm17 = 66, -RDI_RegCodeX64_zmm18 = 67, -RDI_RegCodeX64_zmm19 = 68, -RDI_RegCodeX64_zmm20 = 69, -RDI_RegCodeX64_zmm21 = 70, -RDI_RegCodeX64_zmm22 = 71, -RDI_RegCodeX64_zmm23 = 72, -RDI_RegCodeX64_zmm24 = 73, -RDI_RegCodeX64_zmm25 = 74, -RDI_RegCodeX64_zmm26 = 75, -RDI_RegCodeX64_zmm27 = 76, -RDI_RegCodeX64_zmm28 = 77, -RDI_RegCodeX64_zmm29 = 78, -RDI_RegCodeX64_zmm30 = 79, -RDI_RegCodeX64_zmm31 = 80, -RDI_RegCodeX64_k0 = 81, -RDI_RegCodeX64_k1 = 82, -RDI_RegCodeX64_k2 = 83, -RDI_RegCodeX64_k3 = 84, -RDI_RegCodeX64_k4 = 85, -RDI_RegCodeX64_k5 = 86, -RDI_RegCodeX64_k6 = 87, -RDI_RegCodeX64_k7 = 88, -RDI_RegCodeX64_mxcsr = 89, -RDI_RegCodeX64_fsbase = 90, -RDI_RegCodeX64_gsbase = 91, -RDI_RegCodeX64_fcw = 92, -RDI_RegCodeX64_fsw = 93, -RDI_RegCodeX64_ftw = 94, -RDI_RegCodeX64_fop = 95, -RDI_RegCodeX64_fcs = 96, -RDI_RegCodeX64_fds = 97, -RDI_RegCodeX64_fip = 98, -RDI_RegCodeX64_fdp = 99, -RDI_RegCodeX64_mxcsr_mask = 100, -RDI_RegCodeX64_cetmsr = 101, -RDI_RegCodeX64_cetssp = 102, -RDI_RegCodeX64_tr = 103, -RDI_RegCodeX64_ldtr = 104, +RDI_RegCodeX64_zmm0 = 41, +RDI_RegCodeX64_zmm1 = 42, +RDI_RegCodeX64_zmm2 = 43, +RDI_RegCodeX64_zmm3 = 44, +RDI_RegCodeX64_zmm4 = 45, +RDI_RegCodeX64_zmm5 = 46, +RDI_RegCodeX64_zmm6 = 47, +RDI_RegCodeX64_zmm7 = 48, +RDI_RegCodeX64_zmm8 = 49, +RDI_RegCodeX64_zmm9 = 50, +RDI_RegCodeX64_zmm10 = 51, +RDI_RegCodeX64_zmm11 = 52, +RDI_RegCodeX64_zmm12 = 53, +RDI_RegCodeX64_zmm13 = 54, +RDI_RegCodeX64_zmm14 = 55, +RDI_RegCodeX64_zmm15 = 56, +RDI_RegCodeX64_zmm16 = 57, +RDI_RegCodeX64_zmm17 = 58, +RDI_RegCodeX64_zmm18 = 59, +RDI_RegCodeX64_zmm19 = 60, +RDI_RegCodeX64_zmm20 = 61, +RDI_RegCodeX64_zmm21 = 62, +RDI_RegCodeX64_zmm22 = 63, +RDI_RegCodeX64_zmm23 = 64, +RDI_RegCodeX64_zmm24 = 65, +RDI_RegCodeX64_zmm25 = 66, +RDI_RegCodeX64_zmm26 = 67, +RDI_RegCodeX64_zmm27 = 68, +RDI_RegCodeX64_zmm28 = 69, +RDI_RegCodeX64_zmm29 = 70, +RDI_RegCodeX64_zmm30 = 71, +RDI_RegCodeX64_zmm31 = 72, +RDI_RegCodeX64_k0 = 73, +RDI_RegCodeX64_k1 = 74, +RDI_RegCodeX64_k2 = 75, +RDI_RegCodeX64_k3 = 76, +RDI_RegCodeX64_k4 = 77, +RDI_RegCodeX64_k5 = 78, +RDI_RegCodeX64_k6 = 79, +RDI_RegCodeX64_k7 = 80, +RDI_RegCodeX64_mxcsr = 81, +RDI_RegCodeX64_fsbase = 82, +RDI_RegCodeX64_gsbase = 83, +RDI_RegCodeX64_fcw = 84, +RDI_RegCodeX64_fsw = 85, +RDI_RegCodeX64_ftw = 86, +RDI_RegCodeX64_fop = 87, +RDI_RegCodeX64_fcs = 88, +RDI_RegCodeX64_fds = 89, +RDI_RegCodeX64_fip = 90, +RDI_RegCodeX64_fdp = 91, +RDI_RegCodeX64_mxcsr_mask = 92, +RDI_RegCodeX64_cetmsr = 93, +RDI_RegCodeX64_cetssp = 94, +RDI_RegCodeX64_tr = 95, +RDI_RegCodeX64_ldtr = 96, } RDI_RegCodeX64Enum; typedef RDI_U32 RDI_BinarySectionFlags; @@ -664,48 +648,40 @@ X(dr4, 17)\ X(dr5, 18)\ X(dr6, 19)\ X(dr7, 20)\ -X(fpr0, 21)\ -X(fpr1, 22)\ -X(fpr2, 23)\ -X(fpr3, 24)\ -X(fpr4, 25)\ -X(fpr5, 26)\ -X(fpr6, 27)\ -X(fpr7, 28)\ -X(st0, 29)\ -X(st1, 30)\ -X(st2, 31)\ -X(st3, 32)\ -X(st4, 33)\ -X(st5, 34)\ -X(st6, 35)\ -X(st7, 36)\ -X(fcw, 37)\ -X(fsw, 38)\ -X(ftw, 39)\ -X(fop, 40)\ -X(fcs, 41)\ -X(fds, 42)\ -X(fip, 43)\ -X(fdp, 44)\ -X(mxcsr, 45)\ -X(mxcsr_mask, 46)\ -X(ss, 47)\ -X(cs, 48)\ -X(ds, 49)\ -X(es, 50)\ -X(fs, 51)\ -X(gs, 52)\ -X(ymm0, 53)\ -X(ymm1, 54)\ -X(ymm2, 55)\ -X(ymm3, 56)\ -X(ymm4, 57)\ -X(ymm5, 58)\ -X(ymm6, 59)\ -X(ymm7, 60)\ -X(tr, 61)\ -X(ldtr, 62)\ +X(st0, 21)\ +X(st1, 22)\ +X(st2, 23)\ +X(st3, 24)\ +X(st4, 25)\ +X(st5, 26)\ +X(st6, 27)\ +X(st7, 28)\ +X(fcw, 29)\ +X(fsw, 30)\ +X(ftw, 31)\ +X(fop, 32)\ +X(fcs, 33)\ +X(fds, 34)\ +X(fip, 35)\ +X(fdp, 36)\ +X(mxcsr, 37)\ +X(mxcsr_mask, 38)\ +X(ss, 39)\ +X(cs, 40)\ +X(ds, 41)\ +X(es, 42)\ +X(fs, 43)\ +X(gs, 44)\ +X(ymm0, 45)\ +X(ymm1, 46)\ +X(ymm2, 47)\ +X(ymm3, 48)\ +X(ymm4, 49)\ +X(ymm5, 50)\ +X(ymm6, 51)\ +X(ymm7, 52)\ +X(tr, 53)\ +X(ldtr, 54)\ #define RDI_RegCodeX64_XList \ X(nil, 0)\ @@ -749,70 +725,62 @@ X(st4, 37)\ X(st5, 38)\ X(st6, 39)\ X(st7, 40)\ -X(fpr0, 41)\ -X(fpr1, 42)\ -X(fpr2, 43)\ -X(fpr3, 44)\ -X(fpr4, 45)\ -X(fpr5, 46)\ -X(fpr6, 47)\ -X(fpr7, 48)\ -X(zmm0, 49)\ -X(zmm1, 50)\ -X(zmm2, 51)\ -X(zmm3, 52)\ -X(zmm4, 53)\ -X(zmm5, 54)\ -X(zmm6, 55)\ -X(zmm7, 56)\ -X(zmm8, 57)\ -X(zmm9, 58)\ -X(zmm10, 59)\ -X(zmm11, 60)\ -X(zmm12, 61)\ -X(zmm13, 62)\ -X(zmm14, 63)\ -X(zmm15, 64)\ -X(zmm16, 65)\ -X(zmm17, 66)\ -X(zmm18, 67)\ -X(zmm19, 68)\ -X(zmm20, 69)\ -X(zmm21, 70)\ -X(zmm22, 71)\ -X(zmm23, 72)\ -X(zmm24, 73)\ -X(zmm25, 74)\ -X(zmm26, 75)\ -X(zmm27, 76)\ -X(zmm28, 77)\ -X(zmm29, 78)\ -X(zmm30, 79)\ -X(zmm31, 80)\ -X(k0, 81)\ -X(k1, 82)\ -X(k2, 83)\ -X(k3, 84)\ -X(k4, 85)\ -X(k5, 86)\ -X(k6, 87)\ -X(k7, 88)\ -X(mxcsr, 89)\ -X(fsbase, 90)\ -X(gsbase, 91)\ -X(fcw, 92)\ -X(fsw, 93)\ -X(ftw, 94)\ -X(fop, 95)\ -X(fcs, 96)\ -X(fds, 97)\ -X(fip, 98)\ -X(fdp, 99)\ -X(mxcsr_mask, 100)\ -X(cetmsr, 101)\ -X(cetssp, 102)\ -X(tr, 103)\ -X(ldtr, 104)\ +X(zmm0, 41)\ +X(zmm1, 42)\ +X(zmm2, 43)\ +X(zmm3, 44)\ +X(zmm4, 45)\ +X(zmm5, 46)\ +X(zmm6, 47)\ +X(zmm7, 48)\ +X(zmm8, 49)\ +X(zmm9, 50)\ +X(zmm10, 51)\ +X(zmm11, 52)\ +X(zmm12, 53)\ +X(zmm13, 54)\ +X(zmm14, 55)\ +X(zmm15, 56)\ +X(zmm16, 57)\ +X(zmm17, 58)\ +X(zmm18, 59)\ +X(zmm19, 60)\ +X(zmm20, 61)\ +X(zmm21, 62)\ +X(zmm22, 63)\ +X(zmm23, 64)\ +X(zmm24, 65)\ +X(zmm25, 66)\ +X(zmm26, 67)\ +X(zmm27, 68)\ +X(zmm28, 69)\ +X(zmm29, 70)\ +X(zmm30, 71)\ +X(zmm31, 72)\ +X(k0, 73)\ +X(k1, 74)\ +X(k2, 75)\ +X(k3, 76)\ +X(k4, 77)\ +X(k5, 78)\ +X(k6, 79)\ +X(k7, 80)\ +X(mxcsr, 81)\ +X(fsbase, 82)\ +X(gsbase, 83)\ +X(fcw, 84)\ +X(fsw, 85)\ +X(ftw, 86)\ +X(fop, 87)\ +X(fcs, 88)\ +X(fds, 89)\ +X(fip, 90)\ +X(fdp, 91)\ +X(mxcsr_mask, 92)\ +X(cetmsr, 93)\ +X(cetssp, 94)\ +X(tr, 95)\ +X(ldtr, 96)\ #define RDI_TopLevelInfo_XList \ X(RDI_Arch, arch)\ diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 3e73f1ac..214ca3f5 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -306,48 +306,40 @@ RDI_RegCodeX86Table: {dr5 18} {dr6 19} {dr7 20} - {fpr0 21} - {fpr1 22} - {fpr2 23} - {fpr3 24} - {fpr4 25} - {fpr5 26} - {fpr6 27} - {fpr7 28} - {st0 29} - {st1 30} - {st2 31} - {st3 32} - {st4 33} - {st5 34} - {st6 35} - {st7 36} - {fcw 37} - {fsw 38} - {ftw 39} - {fop 40} - {fcs 41} - {fds 42} - {fip 43} - {fdp 44} - {mxcsr 45} - {mxcsr_mask 46} - {ss 47} - {cs 48} - {ds 49} - {es 50} - {fs 51} - {gs 52} - {ymm0 53} - {ymm1 54} - {ymm2 55} - {ymm3 56} - {ymm4 57} - {ymm5 58} - {ymm6 59} - {ymm7 60} - {tr 61} - {ldtr 62} + {st0 21} + {st1 22} + {st2 23} + {st3 24} + {st4 25} + {st5 26} + {st6 27} + {st7 28} + {fcw 29} + {fsw 30} + {ftw 31} + {fop 32} + {fcs 33} + {fds 34} + {fip 35} + {fdp 36} + {mxcsr 37} + {mxcsr_mask 38} + {ss 39} + {cs 40} + {ds 41} + {es 42} + {fs 43} + {gs 44} + {ymm0 45} + {ymm1 46} + {ymm2 47} + {ymm3 48} + {ymm4 49} + {ymm5 50} + {ymm6 51} + {ymm7 52} + {tr 53} + {ldtr 54} } @table(name value) @@ -394,70 +386,62 @@ RDI_RegCodeX64Table: {st5 38} {st6 39} {st7 40} - {fpr0 41} - {fpr1 42} - {fpr2 43} - {fpr3 44} - {fpr4 45} - {fpr5 46} - {fpr6 47} - {fpr7 48} - {zmm0 49} - {zmm1 50} - {zmm2 51} - {zmm3 52} - {zmm4 53} - {zmm5 54} - {zmm6 55} - {zmm7 56} - {zmm8 57} - {zmm9 58} - {zmm10 59} - {zmm11 60} - {zmm12 61} - {zmm13 62} - {zmm14 63} - {zmm15 64} - {zmm16 65} - {zmm17 66} - {zmm18 67} - {zmm19 68} - {zmm20 69} - {zmm21 70} - {zmm22 71} - {zmm23 72} - {zmm24 73} - {zmm25 74} - {zmm26 75} - {zmm27 76} - {zmm28 77} - {zmm29 78} - {zmm30 79} - {zmm31 80} - {k0 81} - {k1 82} - {k2 83} - {k3 84} - {k4 85} - {k5 86} - {k6 87} - {k7 88} - {mxcsr 89} - {fsbase 90} - {gsbase 91} - {fcw 92} - {fsw 93} - {ftw 94} - {fop 95} - {fcs 96} - {fds 97} - {fip 98} - {fdp 99} - {mxcsr_mask 100} - {cetmsr 101} - {cetssp 102} - {tr 103} - {ldtr 104} + {zmm0 41} + {zmm1 42} + {zmm2 43} + {zmm3 44} + {zmm4 45} + {zmm5 46} + {zmm6 47} + {zmm7 48} + {zmm8 49} + {zmm9 50} + {zmm10 51} + {zmm11 52} + {zmm12 53} + {zmm13 54} + {zmm14 55} + {zmm15 56} + {zmm16 57} + {zmm17 58} + {zmm18 59} + {zmm19 60} + {zmm20 61} + {zmm21 62} + {zmm22 63} + {zmm23 64} + {zmm24 65} + {zmm25 66} + {zmm26 67} + {zmm27 68} + {zmm28 69} + {zmm29 70} + {zmm30 71} + {zmm31 72} + {k0 73} + {k1 74} + {k2 75} + {k3 76} + {k4 77} + {k5 78} + {k6 79} + {k7 80} + {mxcsr 81} + {fsbase 82} + {gsbase 83} + {fcw 84} + {fsw 85} + {ftw 86} + {fop 87} + {fcs 88} + {fds 89} + {fip 90} + {fdp 91} + {mxcsr_mask 92} + {cetmsr 93} + {cetssp 94} + {tr 95} + {ldtr 96} } @enum(RDI_U32) RDI_Arch: diff --git a/src/regs/generated/regs.meta.c b/src/regs/generated/regs.meta.c index cd5fca12..66f1a886 100644 --- a/src/regs/generated/regs.meta.c +++ b/src/regs/generated/regs.meta.c @@ -103,7 +103,7 @@ case Arch_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break; return result; } C_LINKAGE_BEGIN -REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[105] = +REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[95] = { REGS_UsageKind_Normal, REGS_UsageKind_Normal, @@ -156,16 +156,6 @@ REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, REGS_UsageKind_Vector, REGS_UsageKind_Vector, REGS_UsageKind_Vector, @@ -312,7 +302,7 @@ REGS_UsageKind_Vector, REGS_UsageKind_Vector, }; -String8 regs_g_reg_code_x64_string_table[105] = +String8 regs_g_reg_code_x64_string_table[95] = { str8_lit_comp(""), str8_lit_comp("rax"), @@ -343,14 +333,6 @@ str8_lit_comp("dr4"), str8_lit_comp("dr5"), str8_lit_comp("dr6"), str8_lit_comp("dr7"), -str8_lit_comp("fpr0"), -str8_lit_comp("fpr1"), -str8_lit_comp("fpr2"), -str8_lit_comp("fpr3"), -str8_lit_comp("fpr4"), -str8_lit_comp("fpr5"), -str8_lit_comp("fpr6"), -str8_lit_comp("fpr7"), str8_lit_comp("st0"), str8_lit_comp("st1"), str8_lit_comp("st2"), @@ -363,8 +345,6 @@ str8_lit_comp("fcw"), str8_lit_comp("fsw"), str8_lit_comp("ftw"), str8_lit_comp("fop"), -str8_lit_comp("fcs"), -str8_lit_comp("fds"), str8_lit_comp("fip"), str8_lit_comp("fdp"), str8_lit_comp("mxcsr"), @@ -521,7 +501,7 @@ str8_lit_comp("mm6"), str8_lit_comp("mm7"), }; -REGS_Rng regs_g_reg_code_x64_rng_table[105] = +REGS_Rng regs_g_reg_code_x64_rng_table[95] = { {0}, {(U16)OffsetOf(REGS_RegBlockX64, rax), 8}, @@ -552,14 +532,6 @@ REGS_Rng regs_g_reg_code_x64_rng_table[105] = {(U16)OffsetOf(REGS_RegBlockX64, dr5), 8}, {(U16)OffsetOf(REGS_RegBlockX64, dr6), 8}, {(U16)OffsetOf(REGS_RegBlockX64, dr7), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr0), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr1), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr2), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr3), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr4), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr5), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr6), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fpr7), 10}, {(U16)OffsetOf(REGS_RegBlockX64, st0), 10}, {(U16)OffsetOf(REGS_RegBlockX64, st1), 10}, {(U16)OffsetOf(REGS_RegBlockX64, st2), 10}, @@ -570,10 +542,8 @@ REGS_Rng regs_g_reg_code_x64_rng_table[105] = {(U16)OffsetOf(REGS_RegBlockX64, st7), 10}, {(U16)OffsetOf(REGS_RegBlockX64, fcw), 2}, {(U16)OffsetOf(REGS_RegBlockX64, fsw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ftw), 2}, +{(U16)OffsetOf(REGS_RegBlockX64, ftw), 1}, {(U16)OffsetOf(REGS_RegBlockX64, fop), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fcs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fds), 2}, {(U16)OffsetOf(REGS_RegBlockX64, fip), 8}, {(U16)OffsetOf(REGS_RegBlockX64, fdp), 8}, {(U16)OffsetOf(REGS_RegBlockX64, mxcsr), 4}, @@ -720,17 +690,17 @@ REGS_Slice regs_g_alias_code_x64_slice_table[96] = {REGS_RegCodeX64_zmm13, 0, 32}, {REGS_RegCodeX64_zmm14, 0, 32}, {REGS_RegCodeX64_zmm15, 0, 32}, -{REGS_RegCodeX64_fpr0, 0, 8}, -{REGS_RegCodeX64_fpr1, 0, 8}, -{REGS_RegCodeX64_fpr2, 0, 8}, -{REGS_RegCodeX64_fpr3, 0, 8}, -{REGS_RegCodeX64_fpr4, 0, 8}, -{REGS_RegCodeX64_fpr5, 0, 8}, -{REGS_RegCodeX64_fpr6, 0, 8}, -{REGS_RegCodeX64_fpr7, 0, 8}, +{REGS_RegCodeX64_st0, 0, 8}, +{REGS_RegCodeX64_st1, 0, 8}, +{REGS_RegCodeX64_st2, 0, 8}, +{REGS_RegCodeX64_st3, 0, 8}, +{REGS_RegCodeX64_st4, 0, 8}, +{REGS_RegCodeX64_st5, 0, 8}, +{REGS_RegCodeX64_st6, 0, 8}, +{REGS_RegCodeX64_st7, 0, 8}, }; -REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[63] = +REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[55] = { REGS_UsageKind_Normal, REGS_UsageKind_Normal, @@ -779,14 +749,6 @@ REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, REGS_UsageKind_Vector, REGS_UsageKind_Vector, REGS_UsageKind_Vector, @@ -837,7 +799,7 @@ REGS_UsageKind_Vector, REGS_UsageKind_Vector, }; -String8 regs_g_reg_code_x86_string_table[63] = +String8 regs_g_reg_code_x86_string_table[55] = { str8_lit_comp(""), str8_lit_comp("eax"), @@ -860,14 +822,6 @@ str8_lit_comp("dr4"), str8_lit_comp("dr5"), str8_lit_comp("dr6"), str8_lit_comp("dr7"), -str8_lit_comp("fpr0"), -str8_lit_comp("fpr1"), -str8_lit_comp("fpr2"), -str8_lit_comp("fpr3"), -str8_lit_comp("fpr4"), -str8_lit_comp("fpr5"), -str8_lit_comp("fpr6"), -str8_lit_comp("fpr7"), str8_lit_comp("st0"), str8_lit_comp("st1"), str8_lit_comp("st2"), @@ -944,7 +898,7 @@ str8_lit_comp("mm6"), str8_lit_comp("mm7"), }; -REGS_Rng regs_g_reg_code_x86_rng_table[63] = +REGS_Rng regs_g_reg_code_x86_rng_table[55] = { {0}, {(U16)OffsetOf(REGS_RegBlockX86, eax), 4}, @@ -967,14 +921,6 @@ REGS_Rng regs_g_reg_code_x86_rng_table[63] = {(U16)OffsetOf(REGS_RegBlockX86, dr5), 4}, {(U16)OffsetOf(REGS_RegBlockX86, dr6), 4}, {(U16)OffsetOf(REGS_RegBlockX86, dr7), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr0), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr1), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr2), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr3), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr4), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr5), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr6), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fpr7), 10}, {(U16)OffsetOf(REGS_RegBlockX86, st0), 10}, {(U16)OffsetOf(REGS_RegBlockX86, st1), 10}, {(U16)OffsetOf(REGS_RegBlockX86, st2), 10}, @@ -1041,14 +987,14 @@ REGS_Slice regs_g_alias_code_x86_slice_table[36] = {REGS_RegCodeX86_ymm5, 0, 16}, {REGS_RegCodeX86_ymm6, 0, 16}, {REGS_RegCodeX86_ymm7, 0, 16}, -{REGS_RegCodeX86_fpr0, 0, 8}, -{REGS_RegCodeX86_fpr1, 0, 8}, -{REGS_RegCodeX86_fpr2, 0, 8}, -{REGS_RegCodeX86_fpr3, 0, 8}, -{REGS_RegCodeX86_fpr4, 0, 8}, -{REGS_RegCodeX86_fpr5, 0, 8}, -{REGS_RegCodeX86_fpr6, 0, 8}, -{REGS_RegCodeX86_fpr7, 0, 8}, +{REGS_RegCodeX86_st0, 0, 8}, +{REGS_RegCodeX86_st1, 0, 8}, +{REGS_RegCodeX86_st2, 0, 8}, +{REGS_RegCodeX86_st3, 0, 8}, +{REGS_RegCodeX86_st4, 0, 8}, +{REGS_RegCodeX86_st5, 0, 8}, +{REGS_RegCodeX86_st6, 0, 8}, +{REGS_RegCodeX86_st7, 0, 8}, }; C_LINKAGE_END diff --git a/src/regs/generated/regs.meta.h b/src/regs/generated/regs.meta.h index d5819953..2490022d 100644 --- a/src/regs/generated/regs.meta.h +++ b/src/regs/generated/regs.meta.h @@ -37,14 +37,6 @@ REGS_RegCodeX64_dr4, REGS_RegCodeX64_dr5, REGS_RegCodeX64_dr6, REGS_RegCodeX64_dr7, -REGS_RegCodeX64_fpr0, -REGS_RegCodeX64_fpr1, -REGS_RegCodeX64_fpr2, -REGS_RegCodeX64_fpr3, -REGS_RegCodeX64_fpr4, -REGS_RegCodeX64_fpr5, -REGS_RegCodeX64_fpr6, -REGS_RegCodeX64_fpr7, REGS_RegCodeX64_st0, REGS_RegCodeX64_st1, REGS_RegCodeX64_st2, @@ -57,8 +49,6 @@ REGS_RegCodeX64_fcw, REGS_RegCodeX64_fsw, REGS_RegCodeX64_ftw, REGS_RegCodeX64_fop, -REGS_RegCodeX64_fcs, -REGS_RegCodeX64_fds, REGS_RegCodeX64_fip, REGS_RegCodeX64_fdp, REGS_RegCodeX64_mxcsr, @@ -240,14 +230,6 @@ REGS_RegCodeX86_dr4, REGS_RegCodeX86_dr5, REGS_RegCodeX86_dr6, REGS_RegCodeX86_dr7, -REGS_RegCodeX86_fpr0, -REGS_RegCodeX86_fpr1, -REGS_RegCodeX86_fpr2, -REGS_RegCodeX86_fpr3, -REGS_RegCodeX86_fpr4, -REGS_RegCodeX86_fpr5, -REGS_RegCodeX86_fpr6, -REGS_RegCodeX86_fpr7, REGS_RegCodeX86_st0, REGS_RegCodeX86_st1, REGS_RegCodeX86_st2, @@ -357,14 +339,6 @@ REGS_Reg64 dr4; REGS_Reg64 dr5; REGS_Reg64 dr6; REGS_Reg64 dr7; -REGS_Reg80 fpr0; -REGS_Reg80 fpr1; -REGS_Reg80 fpr2; -REGS_Reg80 fpr3; -REGS_Reg80 fpr4; -REGS_Reg80 fpr5; -REGS_Reg80 fpr6; -REGS_Reg80 fpr7; REGS_Reg80 st0; REGS_Reg80 st1; REGS_Reg80 st2; @@ -375,10 +349,8 @@ REGS_Reg80 st6; REGS_Reg80 st7; REGS_Reg16 fcw; REGS_Reg16 fsw; -REGS_Reg16 ftw; +REGS_Reg8 ftw; REGS_Reg16 fop; -REGS_Reg16 fcs; -REGS_Reg16 fds; REGS_Reg64 fip; REGS_Reg64 fdp; REGS_Reg32 mxcsr; @@ -458,14 +430,6 @@ REGS_Reg32 dr4; REGS_Reg32 dr5; REGS_Reg32 dr6; REGS_Reg32 dr7; -REGS_Reg80 fpr0; -REGS_Reg80 fpr1; -REGS_Reg80 fpr2; -REGS_Reg80 fpr3; -REGS_Reg80 fpr4; -REGS_Reg80 fpr5; -REGS_Reg80 fpr6; -REGS_Reg80 fpr7; REGS_Reg80 st0; REGS_Reg80 st1; REGS_Reg80 st2; @@ -503,17 +467,17 @@ REGS_Reg256 ymm7; }; C_LINKAGE_BEGIN -extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[105]; +extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[95]; extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96]; -extern String8 regs_g_reg_code_x64_string_table[105]; +extern String8 regs_g_reg_code_x64_string_table[95]; extern String8 regs_g_alias_code_x64_string_table[96]; -extern REGS_Rng regs_g_reg_code_x64_rng_table[105]; +extern REGS_Rng regs_g_reg_code_x64_rng_table[95]; extern REGS_Slice regs_g_alias_code_x64_slice_table[96]; -extern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[63]; +extern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[55]; extern REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36]; -extern String8 regs_g_reg_code_x86_string_table[63]; +extern String8 regs_g_reg_code_x86_string_table[55]; extern String8 regs_g_alias_code_x86_string_table[36]; -extern REGS_Rng regs_g_reg_code_x86_rng_table[63]; +extern REGS_Rng regs_g_reg_code_x86_rng_table[55]; extern REGS_Slice regs_g_alias_code_x86_slice_table[36]; C_LINKAGE_END diff --git a/src/regs/rdi/generated/regs_rdi.meta.c b/src/regs/rdi/generated/regs_rdi.meta.c index 62069a6f..cfdb9754 100644 --- a/src/regs/rdi/generated/regs_rdi.meta.c +++ b/src/regs/rdi/generated/regs_rdi.meta.c @@ -42,14 +42,6 @@ case REGS_RegCodeX64_dr4:{result = RDI_RegCodeX64_dr4;}break; case REGS_RegCodeX64_dr5:{result = RDI_RegCodeX64_dr5;}break; case REGS_RegCodeX64_dr6:{result = RDI_RegCodeX64_dr6;}break; case REGS_RegCodeX64_dr7:{result = RDI_RegCodeX64_dr7;}break; -case REGS_RegCodeX64_fpr0:{result = RDI_RegCodeX64_fpr0;}break; -case REGS_RegCodeX64_fpr1:{result = RDI_RegCodeX64_fpr1;}break; -case REGS_RegCodeX64_fpr2:{result = RDI_RegCodeX64_fpr2;}break; -case REGS_RegCodeX64_fpr3:{result = RDI_RegCodeX64_fpr3;}break; -case REGS_RegCodeX64_fpr4:{result = RDI_RegCodeX64_fpr4;}break; -case REGS_RegCodeX64_fpr5:{result = RDI_RegCodeX64_fpr5;}break; -case REGS_RegCodeX64_fpr6:{result = RDI_RegCodeX64_fpr6;}break; -case REGS_RegCodeX64_fpr7:{result = RDI_RegCodeX64_fpr7;}break; case REGS_RegCodeX64_st0:{result = RDI_RegCodeX64_st0;}break; case REGS_RegCodeX64_st1:{result = RDI_RegCodeX64_st1;}break; case REGS_RegCodeX64_st2:{result = RDI_RegCodeX64_st2;}break; @@ -62,8 +54,6 @@ case REGS_RegCodeX64_fcw:{result = RDI_RegCodeX64_fcw;}break; case REGS_RegCodeX64_fsw:{result = RDI_RegCodeX64_fsw;}break; case REGS_RegCodeX64_ftw:{result = RDI_RegCodeX64_ftw;}break; case REGS_RegCodeX64_fop:{result = RDI_RegCodeX64_fop;}break; -case REGS_RegCodeX64_fcs:{result = RDI_RegCodeX64_fcs;}break; -case REGS_RegCodeX64_fds:{result = RDI_RegCodeX64_fds;}break; case REGS_RegCodeX64_fip:{result = RDI_RegCodeX64_fip;}break; case REGS_RegCodeX64_fdp:{result = RDI_RegCodeX64_fdp;}break; case REGS_RegCodeX64_mxcsr:{result = RDI_RegCodeX64_mxcsr;}break; @@ -145,14 +135,6 @@ case REGS_RegCodeX86_dr4:{result = RDI_RegCodeX86_dr4;}break; case REGS_RegCodeX86_dr5:{result = RDI_RegCodeX86_dr5;}break; case REGS_RegCodeX86_dr6:{result = RDI_RegCodeX86_dr6;}break; case REGS_RegCodeX86_dr7:{result = RDI_RegCodeX86_dr7;}break; -case REGS_RegCodeX86_fpr0:{result = RDI_RegCodeX86_fpr0;}break; -case REGS_RegCodeX86_fpr1:{result = RDI_RegCodeX86_fpr1;}break; -case REGS_RegCodeX86_fpr2:{result = RDI_RegCodeX86_fpr2;}break; -case REGS_RegCodeX86_fpr3:{result = RDI_RegCodeX86_fpr3;}break; -case REGS_RegCodeX86_fpr4:{result = RDI_RegCodeX86_fpr4;}break; -case REGS_RegCodeX86_fpr5:{result = RDI_RegCodeX86_fpr5;}break; -case REGS_RegCodeX86_fpr6:{result = RDI_RegCodeX86_fpr6;}break; -case REGS_RegCodeX86_fpr7:{result = RDI_RegCodeX86_fpr7;}break; case REGS_RegCodeX86_st0:{result = RDI_RegCodeX86_st0;}break; case REGS_RegCodeX86_st1:{result = RDI_RegCodeX86_st1;}break; case REGS_RegCodeX86_st2:{result = RDI_RegCodeX86_st2;}break; @@ -231,14 +213,6 @@ case RDI_RegCodeX64_dr4:{result = REGS_RegCodeX64_dr4;}break; case RDI_RegCodeX64_dr5:{result = REGS_RegCodeX64_dr5;}break; case RDI_RegCodeX64_dr6:{result = REGS_RegCodeX64_dr6;}break; case RDI_RegCodeX64_dr7:{result = REGS_RegCodeX64_dr7;}break; -case RDI_RegCodeX64_fpr0:{result = REGS_RegCodeX64_fpr0;}break; -case RDI_RegCodeX64_fpr1:{result = REGS_RegCodeX64_fpr1;}break; -case RDI_RegCodeX64_fpr2:{result = REGS_RegCodeX64_fpr2;}break; -case RDI_RegCodeX64_fpr3:{result = REGS_RegCodeX64_fpr3;}break; -case RDI_RegCodeX64_fpr4:{result = REGS_RegCodeX64_fpr4;}break; -case RDI_RegCodeX64_fpr5:{result = REGS_RegCodeX64_fpr5;}break; -case RDI_RegCodeX64_fpr6:{result = REGS_RegCodeX64_fpr6;}break; -case RDI_RegCodeX64_fpr7:{result = REGS_RegCodeX64_fpr7;}break; case RDI_RegCodeX64_st0:{result = REGS_RegCodeX64_st0;}break; case RDI_RegCodeX64_st1:{result = REGS_RegCodeX64_st1;}break; case RDI_RegCodeX64_st2:{result = REGS_RegCodeX64_st2;}break; @@ -251,8 +225,6 @@ case RDI_RegCodeX64_fcw:{result = REGS_RegCodeX64_fcw;}break; case RDI_RegCodeX64_fsw:{result = REGS_RegCodeX64_fsw;}break; case RDI_RegCodeX64_ftw:{result = REGS_RegCodeX64_ftw;}break; case RDI_RegCodeX64_fop:{result = REGS_RegCodeX64_fop;}break; -case RDI_RegCodeX64_fcs:{result = REGS_RegCodeX64_fcs;}break; -case RDI_RegCodeX64_fds:{result = REGS_RegCodeX64_fds;}break; case RDI_RegCodeX64_fip:{result = REGS_RegCodeX64_fip;}break; case RDI_RegCodeX64_fdp:{result = REGS_RegCodeX64_fdp;}break; case RDI_RegCodeX64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; @@ -334,14 +306,6 @@ case RDI_RegCodeX86_dr4:{result = REGS_RegCodeX86_dr4;}break; case RDI_RegCodeX86_dr5:{result = REGS_RegCodeX86_dr5;}break; case RDI_RegCodeX86_dr6:{result = REGS_RegCodeX86_dr6;}break; case RDI_RegCodeX86_dr7:{result = REGS_RegCodeX86_dr7;}break; -case RDI_RegCodeX86_fpr0:{result = REGS_RegCodeX86_fpr0;}break; -case RDI_RegCodeX86_fpr1:{result = REGS_RegCodeX86_fpr1;}break; -case RDI_RegCodeX86_fpr2:{result = REGS_RegCodeX86_fpr2;}break; -case RDI_RegCodeX86_fpr3:{result = REGS_RegCodeX86_fpr3;}break; -case RDI_RegCodeX86_fpr4:{result = REGS_RegCodeX86_fpr4;}break; -case RDI_RegCodeX86_fpr5:{result = REGS_RegCodeX86_fpr5;}break; -case RDI_RegCodeX86_fpr6:{result = REGS_RegCodeX86_fpr6;}break; -case RDI_RegCodeX86_fpr7:{result = REGS_RegCodeX86_fpr7;}break; case RDI_RegCodeX86_st0:{result = REGS_RegCodeX86_st0;}break; case RDI_RegCodeX86_st1:{result = REGS_RegCodeX86_st1;}break; case RDI_RegCodeX86_st2:{result = REGS_RegCodeX86_st2;}break; diff --git a/src/regs/regs.h b/src/regs/regs.h index 27c1efcd..76214f41 100644 --- a/src/regs/regs.h +++ b/src/regs/regs.h @@ -20,6 +20,8 @@ REGS_UsageKind; typedef U8 REGS_RegCode; typedef U8 REGS_AliasCode; +typedef U8 REGS_Reg8; + typedef union REGS_Reg16 REGS_Reg16; union REGS_Reg16 { @@ -39,6 +41,7 @@ typedef union REGS_Reg64 REGS_Reg64; union REGS_Reg64 { U8 v[8]; + U32 u32[2]; U64 u64; F64 f64; }; diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index 1f0cb270..cd05c10a 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -35,14 +35,6 @@ REGS_RegTableX64: {dr5 64 Normal} {dr6 64 Normal} {dr7 64 Normal} - {fpr0 80 Normal} - {fpr1 80 Normal} - {fpr2 80 Normal} - {fpr3 80 Normal} - {fpr4 80 Normal} - {fpr5 80 Normal} - {fpr6 80 Normal} - {fpr7 80 Normal} {st0 80 Normal} {st1 80 Normal} {st2 80 Normal} @@ -53,10 +45,8 @@ REGS_RegTableX64: {st7 80 Normal} {fcw 16 Normal} {fsw 16 Normal} - {ftw 16 Normal} + {ftw 8 Normal} {fop 16 Normal} - {fcs 16 Normal} - {fds 16 Normal} {fip 64 Normal} {fdp 64 Normal} {mxcsr 32 Normal} @@ -206,14 +196,14 @@ REGS_AliasTableX64: {ymm13 zmm13 0 256 Vector} {ymm14 zmm14 0 256 Vector} {ymm15 zmm15 0 256 Vector} - {mm0 fpr0 0 64 Vector} - {mm1 fpr1 0 64 Vector} - {mm2 fpr2 0 64 Vector} - {mm3 fpr3 0 64 Vector} - {mm4 fpr4 0 64 Vector} - {mm5 fpr5 0 64 Vector} - {mm6 fpr6 0 64 Vector} - {mm7 fpr7 0 64 Vector} + {mm0 st0 0 64 Vector} + {mm1 st1 0 64 Vector} + {mm2 st2 0 64 Vector} + {mm3 st3 0 64 Vector} + {mm4 st4 0 64 Vector} + {mm5 st5 0 64 Vector} + {mm6 st6 0 64 Vector} + {mm7 st7 0 64 Vector} } //////////////////////////////// @@ -246,14 +236,6 @@ REGS_RegTableX86: // TODO(allen): I am suspicious of this stuff here. // Are fpr0-7 and st0-7 actually different things? Visual studio doesn't show // frp0-7. Not sure if the mm0-7 aliases are setup the right way either. - {fpr0 80 Normal} - {fpr1 80 Normal} - {fpr2 80 Normal} - {fpr3 80 Normal} - {fpr4 80 Normal} - {fpr5 80 Normal} - {fpr6 80 Normal} - {fpr7 80 Normal} {st0 80 Normal} {st1 80 Normal} {st2 80 Normal} @@ -322,14 +304,14 @@ REGS_AliasTableX86: {xmm5 ymm5 0 128 Vector} {xmm6 ymm6 0 128 Vector} {xmm7 ymm7 0 128 Vector} - {mm0 fpr0 0 64 Vector} - {mm1 fpr1 0 64 Vector} - {mm2 fpr2 0 64 Vector} - {mm3 fpr3 0 64 Vector} - {mm4 fpr4 0 64 Vector} - {mm5 fpr5 0 64 Vector} - {mm6 fpr6 0 64 Vector} - {mm7 fpr7 0 64 Vector} + {mm0 st0 0 64 Vector} + {mm1 st1 0 64 Vector} + {mm2 st2 0 64 Vector} + {mm3 st3 0 64 Vector} + {mm4 st4 0 64 Vector} + {mm5 st5 0 64 Vector} + {mm6 st6 0 64 Vector} + {mm7 st7 0 64 Vector} } //////////////////////////////// diff --git a/src/x64/x64.h b/src/x64/x64.h index 93dfe433..8a41a154 100644 --- a/src/x64/x64.h +++ b/src/x64/x64.h @@ -36,22 +36,13 @@ enum typedef struct AlignType(16) X64_FXSave { - U16 fcw; - U16 fsw; - U16 ftw; - U16 fop; - union { - struct { - U64 fip; - U64 fdp; - } b64; - struct { - U32 fip; - U16 fcs, _pad0; - U32 fdp; - U16 fds, _pad1; - } b32; - }; + U16 fcw; + U16 fsw; + U8 ftw; + U8 reserved1; + U16 fop; + U64 fip; + U64 fdp; U32 mxcsr; U32 mxcsr_mask; U128 st_space[8]; From 8005c31276fe128f6be9e19545d1da39a0b32231 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 5 Dec 2025 16:39:02 -0800 Subject: [PATCH 092/850] remove x86 register code --- src/codeview/codeview.c | 41 ---- src/codeview/codeview.h | 256 -------------------- src/demon/win32/demon_core_win32.c | 183 +------------- src/dwarf/dwarf.c | 34 +-- src/dwarf/dwarf.h | 59 ----- src/lib_rdi/rdi.c | 1 - src/lib_rdi/rdi.h | 121 +--------- src/linker/rdi/rdi_builder.c | 3 - src/linker/rdi/rdi_coff.c | 2 +- src/linker/rdi/rdi_cv.c | 10 +- src/rdi/rdi.mdesk | 73 +----- src/rdi/rdi_local.c | 16 -- src/rdi_from_coff/rdi_from_coff.c | 2 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 19 +- src/rdi_from_dwarf/rdi_from_dwarf.h | 1 - src/rdi_from_pdb/rdi_from_pdb.c | 35 +-- src/rdi_make/rdi_make_local.c | 2 +- src/regs/generated/regs.meta.c | 315 +------------------------ src/regs/generated/regs.meta.h | 173 +------------- src/regs/rdi/generated/regs_rdi.meta.c | 118 +-------- src/regs/rdi/regs_rdi.mdesk | 12 +- src/regs/regs.c | 8 +- src/regs/regs.mdesk | 172 -------------- 23 files changed, 31 insertions(+), 1625 deletions(-) diff --git a/src/codeview/codeview.c b/src/codeview/codeview.c index bd32423e..2923f941 100644 --- a/src/codeview/codeview.c +++ b/src/codeview/codeview.c @@ -47,7 +47,6 @@ cv_size_from_reg(CV_Arch arch, CV_Reg reg) { switch(arch) { - case CV_Arch_8086: return cv_size_from_reg_x86(reg); case CV_Arch_X64 : return cv_size_from_reg_x64(reg); default: NotImplemented; } @@ -59,25 +58,12 @@ cv_is_reg_sp(CV_Arch arch, CV_Reg reg) { switch(arch) { - case CV_Arch_8086: return reg == CV_Regx86_ESP; case CV_Arch_X64: return reg == CV_Regx64_RSP; default: NotImplemented; } return 0; } -internal U64 -cv_size_from_reg_x86(CV_Reg reg) -{ - switch(reg) - { -#define X(NAME, CODE, RDI_NAME, BYTE_POS, BYTE_SIZE) case CV_Regx86_##NAME: return BYTE_SIZE; - CV_Reg_X86_XList(X) -#undef X - } - return 0; -} - internal U64 cv_size_from_reg_x64(CV_Reg reg) { @@ -111,18 +97,6 @@ cv_decode_fp_reg(CV_Arch arch, CV_EncodedFramePtrReg encoded_reg) CV_Reg fp_reg = 0; switch (arch) { - case CV_Arch_8086: - { - switch (encoded_reg) - { - case CV_EncodedFramePtrReg_None : break; - case CV_EncodedFramePtrReg_StackPtr: AssertAlways(!"TODO: not tested, this is a guess"); - fp_reg = CV_Regx86_ESP; break; - case CV_EncodedFramePtrReg_FramePtr: fp_reg = CV_Regx86_EBP; break; - case CV_EncodedFramePtrReg_BasePtr : fp_reg = CV_Regx86_EBX; break; - default: InvalidPath; - } - } break; case CV_Arch_X64: { switch (encoded_reg) @@ -144,14 +118,6 @@ cv_map_encoded_base_pointer(CV_Arch arch, U32 encoded_frame_reg) { U32 r = 0; switch (arch) { - case CV_Arch_8086: { - switch (encoded_frame_reg) { - case 0: r = 0; break; - case 1: r = CV_AllReg_VFRAME; break; - case 2: r = CV_Regx86_EBP; break; - case 3: r = CV_Regx86_EBX; break; - } - } break; case CV_Arch_X64: { switch (encoded_frame_reg) { case 0: r = 0; break; @@ -207,13 +173,6 @@ cv_string_from_reg_id(Arena *arena, CV_Arch arch, U32 id) { String8 result = str8_zero(); switch (arch) { - case CV_Arch_8086: { - switch (id) { -#define X(_N, _ID, ...) case _ID: result = str8_lit(Stringify(_N)); break; - CV_Reg_X86_XList(X) -#undef X - } - } break; case CV_Arch_X64: { switch (id) { #define X(_N, _ID, ...) case _ID: result = str8_lit(Stringify(_N)); break; diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index fbd0649a..635acfe8 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -41,261 +41,6 @@ read_only global CV_TypeId cv_type_id_variadic = 0xFFFFFFFF; //////////////////////////////// //~ rjf: Registers -// X(NAME, CODE, (RDI_RegCode_X86) NAME, BYTE_POS, BYTE_SIZE) -#define CV_Reg_X86_XList(X) \ -X(NONE, 0, nil, 0, 0) \ -X(AL, 1, eax, 0, 1) \ -X(CL, 2, ecx, 0, 1) \ -X(DL, 3, edx, 0, 1) \ -X(BL, 4, ebx, 0, 1) \ -X(AH, 5, eax, 1, 1) \ -X(CH, 6, ecx, 1, 1) \ -X(DH, 7, edx, 1, 1) \ -X(BH, 8, ebx, 1, 1) \ -X(AX, 9, eax, 0, 2) \ -X(CX, 10, ecx, 0, 2) \ -X(DX, 11, edx, 0, 2) \ -X(BX, 12, ebx, 0, 2) \ -X(SP, 13, esp, 0, 2) \ -X(BP, 14, ebp, 0, 2) \ -X(SI, 15, esi, 0, 2) \ -X(DI, 16, edi, 0, 2) \ -X(EAX, 17, eax, 0, 4) \ -X(ECX, 18, ecx, 0, 4) \ -X(EDX, 19, edx, 0, 4) \ -X(EBX, 20, ebx, 0, 4) \ -X(ESP, 21, esp, 0, 4) \ -X(EBP, 22, ebp, 0, 4) \ -X(ESI, 23, esi, 0, 4) \ -X(EDI, 24, edi, 0, 4) \ -X(ES, 25, es, 0, 2) \ -X(CS, 26, cs, 0, 2) \ -X(SS, 27, ss, 0, 2) \ -X(DS, 28, ds, 0, 2) \ -X(FS, 29, fs, 0, 2) \ -X(GS, 30, gs, 0, 2) \ -X(IP, 31, eip, 0, 2) \ -X(FLAGS, 32, eflags, 0, 2) \ -X(EIP, 33, eip, 0, 4) \ -X(EFLAGS, 34, eflags, 0, 4) \ -X(MM0, 146, st0, 0, 8) \ -X(MM1, 147, st1, 0, 8) \ -X(MM2, 148, st2, 0, 8) \ -X(MM3, 149, st3, 0, 8) \ -X(MM4, 150, st4, 0, 8) \ -X(MM5, 151, st5, 0, 8) \ -X(MM6, 152, st6, 0, 8) \ -X(MM7, 153, st7, 0, 8) \ -X(XMM0, 154, ymm0, 0, 16) \ -X(XMM1, 155, ymm1, 0, 16) \ -X(XMM2, 156, ymm2, 0, 16) \ -X(XMM3, 157, ymm3, 0, 16) \ -X(XMM4, 158, ymm4, 0, 16) \ -X(XMM5, 159, ymm5, 0, 16) \ -X(XMM6, 160, ymm6, 0, 16) \ -X(XMM7, 161, ymm7, 0, 16) \ -X(XMM00, 162, ymm0, 0, 4) \ -X(XMM01, 163, ymm0, 4, 4) \ -X(XMM02, 164, ymm0, 8, 4) \ -X(XMM03, 165, ymm0, 12, 4) \ -X(XMM10, 166, ymm1, 0, 4) \ -X(XMM11, 167, ymm1, 4, 4) \ -X(XMM12, 168, ymm1, 8, 4) \ -X(XMM13, 169, ymm1, 12, 4) \ -X(XMM20, 170, ymm2, 0, 4) \ -X(XMM21, 171, ymm2, 4, 4) \ -X(XMM22, 172, ymm2, 8, 4) \ -X(XMM23, 173, ymm2, 12, 4) \ -X(XMM30, 174, ymm3, 0, 4) \ -X(XMM31, 175, ymm3, 4, 4) \ -X(XMM32, 176, ymm3, 8, 4) \ -X(XMM33, 177, ymm3, 12, 4) \ -X(XMM40, 178, ymm4, 0, 4) \ -X(XMM41, 179, ymm4, 4, 4) \ -X(XMM42, 180, ymm4, 8, 4) \ -X(XMM43, 181, ymm4, 12, 4) \ -X(XMM50, 182, ymm5, 0, 4) \ -X(XMM51, 183, ymm5, 4, 4) \ -X(XMM52, 184, ymm5, 8, 4) \ -X(XMM53, 185, ymm5, 12, 4) \ -X(XMM60, 186, ymm6, 0, 4) \ -X(XMM61, 187, ymm6, 4, 4) \ -X(XMM62, 188, ymm6, 8, 4) \ -X(XMM63, 189, ymm6, 12, 4) \ -X(XMM70, 190, ymm7, 0, 4) \ -X(XMM71, 191, ymm7, 4, 4) \ -X(XMM72, 192, ymm7, 8, 4) \ -X(XMM73, 193, ymm7, 12, 4) \ -X(XMM0L, 194, ymm0, 0, 8) \ -X(XMM1L, 195, ymm1, 0, 8) \ -X(XMM2L, 196, ymm2, 0, 8) \ -X(XMM3L, 197, ymm3, 0, 8) \ -X(XMM4L, 198, ymm4, 0, 8) \ -X(XMM5L, 199, ymm5, 0, 8) \ -X(XMM6L, 200, ymm6, 0, 8) \ -X(XMM7L, 201, ymm7, 0, 8) \ -X(XMM0H, 202, ymm0, 8, 8) \ -X(XMM1H, 203, ymm1, 8, 8) \ -X(XMM2H, 204, ymm2, 8, 8) \ -X(XMM3H, 205, ymm3, 8, 8) \ -X(XMM4H, 206, ymm4, 8, 8) \ -X(XMM5H, 207, ymm5, 8, 8) \ -X(XMM6H, 208, ymm6, 8, 8) \ -X(XMM7H, 209, ymm7, 8, 8) \ -X(YMM0, 252, ymm0, 0, 32) \ -X(YMM1, 253, ymm1, 0, 32) \ -X(YMM2, 254, ymm2, 0, 32) \ -X(YMM3, 255, ymm3, 0, 32) \ -X(YMM4, 256, ymm4, 0, 32) \ -X(YMM5, 257, ymm5, 0, 32) \ -X(YMM6, 258, ymm6, 0, 32) \ -X(YMM7, 259, ymm7, 0, 32) \ -X(YMM0H, 260, ymm0, 16, 16) \ -X(YMM1H, 261, ymm1, 16, 16) \ -X(YMM2H, 262, ymm2, 16, 16) \ -X(YMM3H, 263, ymm3, 16, 16) \ -X(YMM4H, 264, ymm4, 16, 16) \ -X(YMM5H, 265, ymm5, 16, 16) \ -X(YMM6H, 266, ymm6, 16, 16) \ -X(YMM7H, 267, ymm7, 16, 16) \ -X(YMM0I0, 268, ymm0, 0, 8) \ -X(YMM0I1, 269, ymm0, 8, 8) \ -X(YMM0I2, 270, ymm0, 16, 8) \ -X(YMM0I3, 271, ymm0, 24, 8) \ -X(YMM1I0, 272, ymm1, 0, 8) \ -X(YMM1I1, 273, ymm1, 8, 8) \ -X(YMM1I2, 274, ymm1, 16, 8) \ -X(YMM1I3, 275, ymm1, 24, 8) \ -X(YMM2I0, 276, ymm2, 0, 8) \ -X(YMM2I1, 277, ymm2, 8, 8) \ -X(YMM2I2, 278, ymm2, 16, 8) \ -X(YMM2I3, 279, ymm2, 24, 8) \ -X(YMM3I0, 280, ymm3, 0, 8) \ -X(YMM3I1, 281, ymm3, 8, 8) \ -X(YMM3I2, 282, ymm3, 16, 8) \ -X(YMM3I3, 283, ymm3, 24, 8) \ -X(YMM4I0, 284, ymm4, 0, 8) \ -X(YMM4I1, 285, ymm4, 8, 8) \ -X(YMM4I2, 286, ymm4, 16, 8) \ -X(YMM4I3, 287, ymm4, 24, 8) \ -X(YMM5I0, 288, ymm5, 0, 8) \ -X(YMM5I1, 289, ymm5, 8, 8) \ -X(YMM5I2, 290, ymm5, 16, 8) \ -X(YMM5I3, 291, ymm5, 24, 8) \ -X(YMM6I0, 292, ymm6, 0, 8) \ -X(YMM6I1, 293, ymm6, 8, 8) \ -X(YMM6I2, 294, ymm6, 16, 8) \ -X(YMM6I3, 295, ymm6, 24, 8) \ -X(YMM7I0, 296, ymm7, 0, 8) \ -X(YMM7I1, 297, ymm7, 8, 8) \ -X(YMM7I2, 298, ymm7, 16, 8) \ -X(YMM7I3, 299, ymm7, 24, 8) \ -X(YMM0F0, 300, ymm0, 0, 4) \ -X(YMM0F1, 301, ymm0, 4, 4) \ -X(YMM0F2, 302, ymm0, 8, 4) \ -X(YMM0F3, 303, ymm0, 12, 4) \ -X(YMM0F4, 304, ymm0, 16, 4) \ -X(YMM0F5, 305, ymm0, 20, 4) \ -X(YMM0F6, 306, ymm0, 24, 4) \ -X(YMM0F7, 307, ymm0, 28, 4) \ -X(YMM1F0, 308, ymm1, 0, 4) \ -X(YMM1F1, 309, ymm1, 4, 4) \ -X(YMM1F2, 310, ymm1, 8, 4) \ -X(YMM1F3, 311, ymm1, 12, 4) \ -X(YMM1F4, 312, ymm1, 16, 4) \ -X(YMM1F5, 313, ymm1, 20, 4) \ -X(YMM1F6, 314, ymm1, 24, 4) \ -X(YMM1F7, 315, ymm1, 28, 4) \ -X(YMM2F0, 316, ymm2, 0, 4) \ -X(YMM2F1, 317, ymm2, 4, 4) \ -X(YMM2F2, 318, ymm2, 8, 4) \ -X(YMM2F3, 319, ymm2, 12, 4) \ -X(YMM2F4, 320, ymm2, 16, 4) \ -X(YMM2F5, 321, ymm2, 20, 4) \ -X(YMM2F6, 322, ymm2, 24, 4) \ -X(YMM2F7, 323, ymm2, 28, 4) \ -X(YMM3F0, 324, ymm3, 0, 4) \ -X(YMM3F1, 325, ymm3, 4, 4) \ -X(YMM3F2, 326, ymm3, 8, 4) \ -X(YMM3F3, 327, ymm3, 12, 4) \ -X(YMM3F4, 328, ymm3, 16, 4) \ -X(YMM3F5, 329, ymm3, 20, 4) \ -X(YMM3F6, 330, ymm3, 24, 4) \ -X(YMM3F7, 331, ymm3, 28, 4) \ -X(YMM4F0, 332, ymm4, 0, 4) \ -X(YMM4F1, 333, ymm4, 4, 4) \ -X(YMM4F2, 334, ymm4, 8, 4) \ -X(YMM4F3, 335, ymm4, 12, 4) \ -X(YMM4F4, 336, ymm4, 16, 4) \ -X(YMM4F5, 337, ymm4, 20, 4) \ -X(YMM4F6, 338, ymm4, 24, 4) \ -X(YMM4F7, 339, ymm4, 28, 4) \ -X(YMM5F0, 340, ymm5, 0, 4) \ -X(YMM5F1, 341, ymm5, 4, 4) \ -X(YMM5F2, 342, ymm5, 8, 4) \ -X(YMM5F3, 343, ymm5, 12, 4) \ -X(YMM5F4, 344, ymm5, 16, 4) \ -X(YMM5F5, 345, ymm5, 20, 4) \ -X(YMM5F6, 346, ymm5, 24, 4) \ -X(YMM5F7, 347, ymm5, 28, 4) \ -X(YMM6F0, 348, ymm6, 0, 4) \ -X(YMM6F1, 349, ymm6, 4, 4) \ -X(YMM6F2, 350, ymm6, 8, 4) \ -X(YMM6F3, 351, ymm6, 12, 4) \ -X(YMM6F4, 352, ymm6, 16, 4) \ -X(YMM6F5, 353, ymm6, 20, 4) \ -X(YMM6F6, 354, ymm6, 24, 4) \ -X(YMM6F7, 355, ymm6, 28, 4) \ -X(YMM7F0, 356, ymm7, 0, 4) \ -X(YMM7F1, 357, ymm7, 4, 4) \ -X(YMM7F2, 358, ymm7, 8, 4) \ -X(YMM7F3, 359, ymm7, 12, 4) \ -X(YMM7F4, 360, ymm7, 16, 4) \ -X(YMM7F5, 361, ymm7, 20, 4) \ -X(YMM7F6, 362, ymm7, 24, 4) \ -X(YMM7F7, 363, ymm7, 28, 4) \ -X(YMM0D0, 364, ymm0, 0, 8) \ -X(YMM0D1, 365, ymm0, 8, 8) \ -X(YMM0D2, 366, ymm0, 16, 8) \ -X(YMM0D3, 367, ymm0, 24, 8) \ -X(YMM1D0, 368, ymm1, 0, 8) \ -X(YMM1D1, 369, ymm1, 8, 8) \ -X(YMM1D2, 370, ymm1, 16, 8) \ -X(YMM1D3, 371, ymm1, 24, 8) \ -X(YMM2D0, 372, ymm2, 0, 8) \ -X(YMM2D1, 373, ymm2, 8, 8) \ -X(YMM2D2, 374, ymm2, 16, 8) \ -X(YMM2D3, 375, ymm2, 24, 8) \ -X(YMM3D0, 376, ymm3, 0, 8) \ -X(YMM3D1, 377, ymm3, 8, 8) \ -X(YMM3D2, 378, ymm3, 16, 8) \ -X(YMM3D3, 379, ymm3, 24, 8) \ -X(YMM4D0, 380, ymm4, 0, 8) \ -X(YMM4D1, 381, ymm4, 8, 8) \ -X(YMM4D2, 382, ymm4, 16, 8) \ -X(YMM4D3, 383, ymm4, 24, 8) \ -X(YMM5D0, 384, ymm5, 0, 8) \ -X(YMM5D1, 385, ymm5, 8, 8) \ -X(YMM5D2, 386, ymm5, 16, 8) \ -X(YMM5D3, 387, ymm5, 24, 8) \ -X(YMM6D0, 388, ymm6, 0, 8) \ -X(YMM6D1, 389, ymm6, 8, 8) \ -X(YMM6D2, 390, ymm6, 16, 8) \ -X(YMM6D3, 391, ymm6, 24, 8) \ -X(YMM7D0, 392, ymm7, 0, 8) \ -X(YMM7D1, 393, ymm7, 8, 8) \ -X(YMM7D2, 394, ymm7, 16, 8) \ -X(YMM7D3, 395, ymm7, 24, 8) - -typedef U16 CV_Regx86; -typedef enum CV_Regx86Enum -{ -#define X(CVN,C,RDN,BP,BZ) CV_Regx86_##CVN = C, - CV_Reg_X86_XList(X) -#undef X -} -CV_Regx86Enum; - // X(NAME, CODE, (RDI_RegisterCode_X64) NAME, BYTE_POS, BYTE_SIZE) #define CV_Reg_X64_XList(X) \ X(NONE, 0, nil, 0, 0) \ @@ -2963,7 +2708,6 @@ struct CV_TypeIndexArray //////////////////////////////// internal CV_Arch cv_arch_from_coff_machine(COFF_MachineType machine); -internal U64 cv_size_from_reg_x86(CV_Reg reg); internal U64 cv_size_from_reg_x64(CV_Reg reg); internal U64 cv_size_from_reg(CV_Arch arch, CV_Reg reg); internal B32 cv_is_reg_sp(CV_Arch arch, CV_Reg reg); diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index 57a13702..cef314fb 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -597,90 +597,8 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) {}break; case Arch_arm64: case Arch_arm32: - {NotImplemented;}break; - - //////////////////////////// - //- rjf: x86 - // case Arch_x86: - { - REGS_RegBlockX86 *dst = (REGS_RegBlockX86 *)reg_block; - - //- rjf: get thread context - WOW64_CONTEXT ctx = {0}; - ctx.ContextFlags = DMN_W32_CTX_X86_ALL; - if(!Wow64GetThreadContext(thread, (WOW64_CONTEXT *)&ctx)) - { - break; - } - result = 1; - - //- rjf: convert WOW64_CONTEXT -> REGS_RegBlockX86 - XSAVE_FORMAT *fxsave = (XSAVE_FORMAT *)ctx.ExtendedRegisters; - dst->eax.u32 = ctx.Eax; - dst->ebx.u32 = ctx.Ebx; - dst->ecx.u32 = ctx.Ecx; - dst->edx.u32 = ctx.Edx; - dst->esi.u32 = ctx.Esi; - dst->edi.u32 = ctx.Edi; - dst->esp.u32 = ctx.Esp; - dst->ebp.u32 = ctx.Ebp; - dst->eip.u32 = ctx.Eip; - dst->cs.u16 = ctx.SegCs; - dst->ds.u16 = ctx.SegDs; - dst->es.u16 = ctx.SegEs; - dst->fs.u16 = ctx.SegFs; - dst->gs.u16 = ctx.SegGs; - dst->ss.u16 = ctx.SegSs; - dst->dr0.u32 = ctx.Dr0; - dst->dr1.u32 = ctx.Dr1; - dst->dr2.u32 = ctx.Dr2; - dst->dr3.u32 = ctx.Dr3; - dst->dr6.u32 = ctx.Dr6; - dst->dr7.u32 = ctx.Dr7; - // NOTE(rjf): this bit is "supposed to always be 1", according to old info. - // may need to be investigated. - dst->eflags.u32 = ctx.EFlags | 0x2; - dst->fcw.u16 = fxsave->ControlWord; - dst->fsw.u16 = fxsave->StatusWord; - dst->ftw.u16 = fxsave->TagWord; - dst->fop.u16 = fxsave->ErrorOpcode; - dst->fip.u32 = fxsave->ErrorOffset; - dst->fcs.u16 = fxsave->ErrorSelector; - dst->fdp.u32 = fxsave->DataOffset; - dst->fds.u16 = fxsave->DataSelector; - dst->mxcsr.u32 = fxsave->MxCsr; - dst->mxcsr_mask.u32 = fxsave->MxCsr_Mask; - { - M128A *float_s = fxsave->FloatRegisters; - REGS_Reg80 *float_d = &dst->st0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) - { - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } - } - { - M128A *xmm_s = fxsave->XmmRegisters; - REGS_Reg256 *xmm_d = &dst->ymm0; - for(U32 n = 0; n < 8; n += 1, xmm_s += 1, xmm_d += 1) - { - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s)); - } - } - - //- rjf: read FS/GS base - WOW64_LDT_ENTRY ldt = {0}; - if(Wow64GetThreadSelectorEntry(thread, ctx.SegFs, &ldt)) - { - U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); - dst->fsbase.u32 = base; - } - if(Wow64GetThreadSelectorEntry(thread, ctx.SegGs, &ldt)) - { - U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24); - dst->gsbase.u32 = base; - } - }break; + {NotImplemented;}break; //////////////////////////// //- rjf: x64 @@ -901,75 +819,8 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) {}break; case Arch_arm64: case Arch_arm32: - {NotImplemented;}break; - - //////////////////////////// - //- rjf: x86 - // case Arch_x86: - { - REGS_RegBlockX86 *src = (REGS_RegBlockX86 *)reg_block; - - //- rjf: convert REGS_RegBlockX86 -> WOW64_CONTEXT - WOW64_CONTEXT ctx = {0}; - XSAVE_FORMAT *fxsave = (XSAVE_FORMAT*)ctx.ExtendedRegisters; - ctx.ContextFlags = DMN_W32_CTX_X86_ALL; - ctx.Eax = src->eax.u32; - ctx.Ebx = src->ebx.u32; - ctx.Ecx = src->ecx.u32; - ctx.Edx = src->edx.u32; - ctx.Esi = src->esi.u32; - ctx.Edi = src->edi.u32; - ctx.Esp = src->esp.u32; - ctx.Ebp = src->ebp.u32; - ctx.Eip = src->eip.u32; - ctx.SegCs = src->cs.u16; - ctx.SegDs = src->ds.u16; - ctx.SegEs = src->es.u16; - ctx.SegFs = src->fs.u16; - ctx.SegGs = src->gs.u16; - ctx.SegSs = src->ss.u16; - ctx.Dr0 = src->dr0.u32; - ctx.Dr1 = src->dr1.u32; - ctx.Dr2 = src->dr2.u32; - ctx.Dr3 = src->dr3.u32; - ctx.Dr6 = src->dr6.u32; - ctx.Dr7 = src->dr7.u32; - ctx.EFlags = src->eflags.u32; - fxsave->ControlWord = src->fcw.u16; - fxsave->StatusWord = src->fsw.u16; - fxsave->TagWord = src->ftw.u16; - fxsave->ErrorOpcode = src->fop.u16; - fxsave->ErrorSelector = src->fcs.u16; - fxsave->DataSelector = src->fds.u16; - fxsave->ErrorOffset = src->fip.u32; - fxsave->DataOffset = src->fdp.u32; - fxsave->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; - fxsave->MxCsr_Mask = src->mxcsr_mask.u32; - { - M128A *float_d = fxsave->FloatRegisters; - REGS_Reg80 *float_s = &src->st0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) - { - MemoryCopy(float_d, float_s, 10); - } - } - { - M128A *xmm_d = fxsave->XmmRegisters; - REGS_Reg256 *xmm_s = &src->ymm0; - for(U32 n = 0; n < 8; n += 1, xmm_d += 1, xmm_s += 1) - { - MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d)); - } - } - - //- rjf: set thread context - B32 result = 0; - if(Wow64SetThreadContext(thread, &ctx)) - { - result = 1; - } - }break; + {NotImplemented;}break; //////////////////////////// //- rjf: x64 @@ -1528,16 +1379,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) {}break; case Arch_arm64: case Arch_arm32: - {NotImplemented;}break; - - //- rjf: x86 case Arch_x86: - { - REGS_RegBlockX86 regs = {0}; - dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); - regs.eflags.u32 |= 0x100; - dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); - }break; + {NotImplemented;}break; //- rjf: x64 case Arch_x64: @@ -2867,16 +2710,9 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) {}break; case Arch_arm64: case Arch_arm32: + case Arch_x86: {NotImplemented;}break; - //- rjf: x86/64 - case Arch_x86: - { - REGS_RegBlockX86 regs = {0}; - dmn_thread_read_reg_block(ctrls->single_step_thread, ®s); - regs.eflags.u32 &= ~0x100; - dmn_thread_write_reg_block(ctrls->single_step_thread, ®s); - }break; case Arch_x64: { if(!GetThreadContext(thread->handle, single_step_thread_ctx)) @@ -3137,17 +2973,13 @@ dmn_stack_base_vaddr_from_thread(DMN_Handle handle) {}break; case Arch_arm64: case Arch_arm32: + case Arch_x86: {NotImplemented;}break; case Arch_x64: { U64 stack_base_addr = tlb + 0x8; dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); }break; - case Arch_x86: - { - U64 stack_base_addr = tlb + 0x4; - dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result); - }break; } } } @@ -3171,15 +3003,12 @@ dmn_tls_root_vaddr_from_thread(DMN_Handle handle) {}break; case Arch_arm64: case Arch_arm32: + case Arch_x86: {NotImplemented;}break; case Arch_x64: { result += 88; }break; - case Arch_x86: - { - result += 44; - }break; } } } diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 2b2f3966..5a380b47 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -1,28 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal U64 -dw_reg_size_from_code_x86(DW_Reg reg_code) -{ - switch (reg_code) { -#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX86_##reg_name_dw: return reg_size; - DW_Regs_X86_XList(X) -#undef X - } - return 0; -} - -internal U64 -dw_reg_pos_from_code_x86(DW_Reg reg_code) -{ - switch (reg_code) { -#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX86_##reg_name_dw: return reg_pos; - DW_Regs_X86_XList(X) -#undef X - } - return max_U64; -} - internal U64 dw_reg_size_from_code_x64(DW_Reg reg_code) { @@ -50,7 +28,6 @@ dw_reg_size_from_code(Arch arch, DW_Reg reg_code) { switch (arch) { case Arch_Null: break; - case Arch_x86: return dw_reg_size_from_code_x86(reg_code); case Arch_x64: return dw_reg_size_from_code_x64(reg_code); default: NotImplemented; break; } @@ -62,7 +39,6 @@ dw_reg_pos_from_code(Arch arch, DW_Reg reg_code) { switch (arch) { case Arch_Null: break; - case Arch_x86: return dw_reg_pos_from_code_x86(reg_code); case Arch_x64: return dw_reg_pos_from_code_x64(reg_code); default: NotImplemented; break; } @@ -75,7 +51,6 @@ dw_reg_count_from_arch(Arch arch) switch (arch) { default: { NotImplemented; } // fall-through case Arch_Null: return 0; - case Arch_x86: return DW_RegX86_Last; case Arch_x64: return DW_RegX64_Last; } } @@ -100,7 +75,6 @@ dw_sp_from_arch(Arch arch) switch (arch) { default: NotImplemented; case Arch_Null: return 0; - case Arch_x86: return DW_RegX86_Esp; case Arch_x64: return DW_RegX64_Rsp; } } @@ -793,13 +767,6 @@ dw_string_from_register(Arena *arena, Arch arch, U64 reg_id) String8 reg_str = str8_zero(); switch (arch) { case Arch_Null: break; - case Arch_x86: { - switch (reg_id) { -#define X(_N, _ID, ...) case DW_RegX86_##_N: reg_str = str8_lit(Stringify(_N)); break; - DW_Regs_X86_XList(X) -#undef X - } - } break; case Arch_x64: { switch (reg_id) { #define X(_N, _ID, ...) case DW_RegX64_##_N: reg_str = str8_lit(Stringify(_N)); break; @@ -809,6 +776,7 @@ dw_string_from_register(Arena *arena, Arch arch, U64 reg_id) } break; case Arch_arm32: NotImplemented; break; case Arch_arm64: NotImplemented; break; + case Arch_x86: NotImplemented; break; default: InvalidPath; break; } if (reg_str.size == 0) { diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 4706619d..b10502fe 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1590,54 +1590,6 @@ typedef enum DW_ExprOpEnum //- Regs -#define DW_Regs_X86_XList(X) \ -X(Eax, 0, eax, 0, 4) \ -X(Ecx, 1, ecx, 0, 4) \ -X(Edx, 2, edx, 0, 4) \ -X(Ebx, 3, ebx, 0, 4) \ -X(Esp, 4, esp, 0, 4) \ -X(Ebp, 5, ebp, 0, 4) \ -X(Esi, 6, esi, 0, 4) \ -X(Edi, 7, edi, 0, 4) \ -X(Eip, 8, eip, 0, 4) \ -X(Eflags, 9, eflags, 0, 4) \ -X(Trapno, 10, nil, 0, 0) \ -X(St0, 11, st0, 0, 10) \ -X(St1, 12, st1, 0, 10) \ -X(St2, 13, st2, 0, 10) \ -X(St3, 14, st3, 0, 10) \ -X(St4, 15, st4, 0, 10) \ -X(St5, 16, st5, 0, 10) \ -X(St6, 17, st6, 0, 10) \ -X(St7, 18, st7, 0, 10) \ -X(Xmm0, 21, ymm0, 0, 16) \ -X(Xmm1, 22, ymm1, 0, 16) \ -X(Xmm2, 23, ymm2, 0, 16) \ -X(Xmm3, 24, ymm3, 0, 16) \ -X(Xmm4, 25, ymm4, 0, 16) \ -X(Xmm5, 26, ymm5, 0, 16) \ -X(Xmm6, 27, ymm6, 0, 16) \ -X(Xmm7, 28, ymm7, 0, 16) \ -X(Mm0, 29, st0, 0, 8) \ -X(Mm1, 30, st1, 0, 8) \ -X(Mm2, 31, st2, 0, 8) \ -X(Mm3, 32, st3, 0, 8) \ -X(Mm4, 33, st4, 0, 8) \ -X(Mm5, 34, st5, 0, 8) \ -X(Mm6, 35, st6, 0, 8) \ -X(Mm7, 36, st7, 0, 8) \ -X(Fcw, 37, fcw, 0, 2) \ -X(Fsw, 38, fsw, 0, 2) \ -X(Mxcsr, 39, mxcsr, 0, 4) \ -X(Es, 40, es, 0, 2) \ -X(Cs, 41, cs, 0, 2) \ -X(Ss, 42, ss, 0, 2) \ -X(Ds, 43, ds, 0, 2) \ -X(Fs, 44, fs, 0, 2) \ -X(Gs, 45, gs, 0, 2) \ -X(Tr, 48, tr, 0, 0) \ -X(Ldtr, 49, ldtr, 0, 0) - #define DW_Regs_X64_XList(X) \ X(Rax, 0, rax, 0, 8) \ X(Rdx, 1, rdx, 0, 8) \ @@ -1718,15 +1670,6 @@ X(Ldtr, 63, ldtr, 0, 0) typedef U32 DW_Reg; -typedef DW_Reg DW_RegX86; -typedef enum DW_RegX86Enum -{ -#define X(_N,_ID,...) DW_RegX86_##_N = _ID, - DW_Regs_X86_XList(X) -#undef X - DW_RegX86_Last -} DW_RegX86Enum; - typedef DW_Reg DW_RegX64; typedef enum DW_RegX64Enum { @@ -1738,8 +1681,6 @@ typedef enum DW_RegX64Enum //////////////////////////////// -internal U64 dw_reg_size_from_code_x86(DW_Reg reg_code); -internal U64 dw_reg_pos_from_code_x86(DW_Reg reg_code); internal U64 dw_reg_size_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_pos_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code); diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 766fd90f..78681bbf 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -272,7 +272,6 @@ RDI_U32 result = 0; switch(arch) { default:{}break; -case RDI_Arch_X86:{result = 4;}break; case RDI_Arch_X64:{result = 8;}break; } return result; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 8bb3fcfe..bd008e83 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -132,8 +132,7 @@ typedef RDI_U32 RDI_Arch; typedef enum RDI_ArchEnum { RDI_Arch_NULL = 0, -RDI_Arch_X86 = 1, -RDI_Arch_X64 = 2, +RDI_Arch_X64 = 1, } RDI_ArchEnum; typedef RDI_U8 RDI_RegCode; @@ -142,66 +141,6 @@ typedef enum RDI_RegCodeEnum RDI_RegCode_nil, } RDI_RegCodeEnum; -typedef RDI_U8 RDI_RegCodeX86; -typedef enum RDI_RegCodeX86Enum -{ -RDI_RegCodeX86_nil = 0, -RDI_RegCodeX86_eax = 1, -RDI_RegCodeX86_ecx = 2, -RDI_RegCodeX86_edx = 3, -RDI_RegCodeX86_ebx = 4, -RDI_RegCodeX86_esp = 5, -RDI_RegCodeX86_ebp = 6, -RDI_RegCodeX86_esi = 7, -RDI_RegCodeX86_edi = 8, -RDI_RegCodeX86_fsbase = 9, -RDI_RegCodeX86_gsbase = 10, -RDI_RegCodeX86_eflags = 11, -RDI_RegCodeX86_eip = 12, -RDI_RegCodeX86_dr0 = 13, -RDI_RegCodeX86_dr1 = 14, -RDI_RegCodeX86_dr2 = 15, -RDI_RegCodeX86_dr3 = 16, -RDI_RegCodeX86_dr4 = 17, -RDI_RegCodeX86_dr5 = 18, -RDI_RegCodeX86_dr6 = 19, -RDI_RegCodeX86_dr7 = 20, -RDI_RegCodeX86_st0 = 21, -RDI_RegCodeX86_st1 = 22, -RDI_RegCodeX86_st2 = 23, -RDI_RegCodeX86_st3 = 24, -RDI_RegCodeX86_st4 = 25, -RDI_RegCodeX86_st5 = 26, -RDI_RegCodeX86_st6 = 27, -RDI_RegCodeX86_st7 = 28, -RDI_RegCodeX86_fcw = 29, -RDI_RegCodeX86_fsw = 30, -RDI_RegCodeX86_ftw = 31, -RDI_RegCodeX86_fop = 32, -RDI_RegCodeX86_fcs = 33, -RDI_RegCodeX86_fds = 34, -RDI_RegCodeX86_fip = 35, -RDI_RegCodeX86_fdp = 36, -RDI_RegCodeX86_mxcsr = 37, -RDI_RegCodeX86_mxcsr_mask = 38, -RDI_RegCodeX86_ss = 39, -RDI_RegCodeX86_cs = 40, -RDI_RegCodeX86_ds = 41, -RDI_RegCodeX86_es = 42, -RDI_RegCodeX86_fs = 43, -RDI_RegCodeX86_gs = 44, -RDI_RegCodeX86_ymm0 = 45, -RDI_RegCodeX86_ymm1 = 46, -RDI_RegCodeX86_ymm2 = 47, -RDI_RegCodeX86_ymm3 = 48, -RDI_RegCodeX86_ymm4 = 49, -RDI_RegCodeX86_ymm5 = 50, -RDI_RegCodeX86_ymm6 = 51, -RDI_RegCodeX86_ymm7 = 52, -RDI_RegCodeX86_tr = 53, -RDI_RegCodeX86_ldtr = 54, -} RDI_RegCodeX86Enum; - typedef RDI_U8 RDI_RegCodeX64; typedef enum RDI_RegCodeX64Enum { @@ -623,66 +562,8 @@ X(RDI_U64, idx)\ #define RDI_Arch_XList \ X(NULL)\ -X(X86)\ X(X64)\ -#define RDI_RegCodeX86_XList \ -X(nil, 0)\ -X(eax, 1)\ -X(ecx, 2)\ -X(edx, 3)\ -X(ebx, 4)\ -X(esp, 5)\ -X(ebp, 6)\ -X(esi, 7)\ -X(edi, 8)\ -X(fsbase, 9)\ -X(gsbase, 10)\ -X(eflags, 11)\ -X(eip, 12)\ -X(dr0, 13)\ -X(dr1, 14)\ -X(dr2, 15)\ -X(dr3, 16)\ -X(dr4, 17)\ -X(dr5, 18)\ -X(dr6, 19)\ -X(dr7, 20)\ -X(st0, 21)\ -X(st1, 22)\ -X(st2, 23)\ -X(st3, 24)\ -X(st4, 25)\ -X(st5, 26)\ -X(st6, 27)\ -X(st7, 28)\ -X(fcw, 29)\ -X(fsw, 30)\ -X(ftw, 31)\ -X(fop, 32)\ -X(fcs, 33)\ -X(fds, 34)\ -X(fip, 35)\ -X(fdp, 36)\ -X(mxcsr, 37)\ -X(mxcsr_mask, 38)\ -X(ss, 39)\ -X(cs, 40)\ -X(ds, 41)\ -X(es, 42)\ -X(fs, 43)\ -X(gs, 44)\ -X(ymm0, 45)\ -X(ymm1, 46)\ -X(ymm2, 47)\ -X(ymm3, 48)\ -X(ymm4, 49)\ -X(ymm5, 50)\ -X(ymm6, 51)\ -X(ymm7, 52)\ -X(tr, 53)\ -X(ldtr, 54)\ - #define RDI_RegCodeX64_XList \ X(nil, 0)\ X(rax, 1)\ diff --git a/src/linker/rdi/rdi_builder.c b/src/linker/rdi/rdi_builder.c index 91a31d7a..113d4b82 100644 --- a/src/linker/rdi/rdi_builder.c +++ b/src/linker/rdi/rdi_builder.c @@ -9,7 +9,6 @@ rdib_infer_data_model(OperatingSystem os, RDI_Arch arch) case OperatingSystem_Null: break; case OperatingSystem_Windows: { switch (arch) { - case RDI_Arch_X86: case RDI_Arch_X64: data_model = RDIB_DataModel_LLP64; break; default: NotImplemented; @@ -17,14 +16,12 @@ rdib_infer_data_model(OperatingSystem os, RDI_Arch arch) } break; case OperatingSystem_Linux: { switch (arch) { - case RDI_Arch_X86: data_model = RDIB_DataModel_ILP32; break; case RDI_Arch_X64: data_model = RDIB_DataModel_LLP64; break; default: NotImplemented; } } break; case OperatingSystem_Mac: { switch (arch) { - case RDI_Arch_X86: NotImplemented; break; case RDI_Arch_X64: data_model = RDIB_DataModel_LP64; break; } } break; diff --git a/src/linker/rdi/rdi_coff.c b/src/linker/rdi/rdi_coff.c index 4db328bc..1227a480 100644 --- a/src/linker/rdi/rdi_coff.c +++ b/src/linker/rdi/rdi_coff.c @@ -5,9 +5,9 @@ internal RDI_Arch rdi_arch_from_coff_machine(COFF_MachineType machine) { switch (machine) { - case COFF_MachineType_X86: return RDI_Arch_X86; case COFF_MachineType_X64: return RDI_Arch_X64; + case COFF_MachineType_X86: case COFF_MachineType_Unknown: case COFF_MachineType_Am33: case COFF_MachineType_Arm: diff --git a/src/linker/rdi/rdi_cv.c b/src/linker/rdi/rdi_cv.c index ac0b99f2..545777ab 100644 --- a/src/linker/rdi/rdi_cv.c +++ b/src/linker/rdi/rdi_cv.c @@ -5,9 +5,9 @@ internal RDI_Arch rdi_arch_from_cv_arch(CV_Arch arch) { switch (arch) { - case CV_Arch_8086: return RDI_Arch_X86; case CV_Arch_X64: return RDI_Arch_X64; + case CV_Arch_8086: case CV_Arch_8080: case CV_Arch_80286: case CV_Arch_80386: @@ -211,13 +211,6 @@ rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg) { RDI_RegCode result = 0; switch (arch) { - case CV_Arch_8086: { - switch (reg) { -#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX86_##RDN; break; - CV_Reg_X86_XList(X) -#undef X - } - } break; case CV_Arch_X64: { switch (reg) { #define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break; @@ -225,6 +218,7 @@ rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg) #undef X } } break; + case CV_Arch_8086: default: NotImplemented; } return result; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 214ca3f5..65073945 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -278,68 +278,7 @@ RDI_VMapEntryMemberTable: RDI_ArchTable: { {NULL 0 0} - {X86 1 4} - {X64 2 8} -} - -@table(name value) -RDI_RegCodeX86Table: -{ - {nil 0} - {eax 1} - {ecx 2} - {edx 3} - {ebx 4} - {esp 5} - {ebp 6} - {esi 7} - {edi 8} - {fsbase 9} - {gsbase 10} - {eflags 11} - {eip 12} - {dr0 13} - {dr1 14} - {dr2 15} - {dr3 16} - {dr4 17} - {dr5 18} - {dr6 19} - {dr7 20} - {st0 21} - {st1 22} - {st2 23} - {st3 24} - {st4 25} - {st5 26} - {st6 27} - {st7 28} - {fcw 29} - {fsw 30} - {ftw 31} - {fop 32} - {fcs 33} - {fds 34} - {fip 35} - {fdp 36} - {mxcsr 37} - {mxcsr_mask 38} - {ss 39} - {cs 40} - {ds 41} - {es 42} - {fs 43} - {gs 44} - {ymm0 45} - {ymm1 46} - {ymm2 47} - {ymm3 48} - {ymm4 49} - {ymm5 50} - {ymm6 51} - {ymm7 52} - {tr 53} - {ldtr 54} + {X64 1 8} } @table(name value) @@ -456,21 +395,11 @@ RDI_RegCodeX64Table: @enum(RDI_U8) RDI_RegCode: {nil} -@enum(RDI_U8) RDI_RegCodeX86: -{ - @expand(RDI_RegCodeX86Table a) `$(a.name .. =>10) = $(a.value)` -} - @enum(RDI_U8) RDI_RegCodeX64: { @expand(RDI_RegCodeX64Table a) `$(a.name .. =>10) = $(a.value)` } -@xlist RDI_RegCodeX86_XList: -{ - @expand(RDI_RegCodeX86Table a) `$(a.name), $(a.value)` -} - @xlist RDI_RegCodeX64_XList: { @expand(RDI_RegCodeX64Table a) `$(a.name), $(a.value)` diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 5d46eccd..55e95f78 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -14,7 +14,6 @@ arch_from_rdi_arch(RDI_Arch arch) switch((RDI_ArchEnum)arch) { case RDI_Arch_NULL:{}break; - case RDI_Arch_X86:{result = Arch_x86;}break; case RDI_Arch_X64:{result = Arch_x64;}break; } return result; @@ -134,20 +133,6 @@ rdi_string_from_name_map_kind(RDI_NameMapKind kind) return result; } -internal String8 -rdi_string_from_reg_code_x86(U64 reg_code) -{ - String8 result = {0}; - switch(reg_code) - { - default:{}break; -#define X(name, value) case RDI_RegCodeX86_##name:{result = str8_lit(#name);}break; - RDI_RegCodeX86_XList -#undef X - } - return result; -} - internal String8 rdi_string_from_reg_code_x64(U64 reg_code) { @@ -170,7 +155,6 @@ rdi_string_from_reg_code(Arena *arena, RDI_Arch arch, U64 reg_code) { default: case RDI_Arch_NULL: {result = push_str8f(arena, "??? (%llu)", reg_code);}break; - case RDI_Arch_X86: {result = rdi_string_from_reg_code_x86(reg_code);}break; case RDI_Arch_X64: {result = rdi_string_from_reg_code_x64(reg_code);}break; } return result; diff --git a/src/rdi_from_coff/rdi_from_coff.c b/src/rdi_from_coff/rdi_from_coff.c index 04138605..bf165afc 100644 --- a/src/rdi_from_coff/rdi_from_coff.c +++ b/src/rdi_from_coff/rdi_from_coff.c @@ -5,9 +5,9 @@ internal RDI_Arch c2r_rdi_arch_from_coff_machine(COFF_MachineType machine) { switch (machine) { - case COFF_MachineType_X86: return RDI_Arch_X86; case COFF_MachineType_X64: return RDI_Arch_X64; + case COFF_MachineType_X86: case COFF_MachineType_Unknown: case COFF_MachineType_Am33: case COFF_MachineType_Arm: diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index ed66438a..df56fee8 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -65,20 +65,6 @@ d2r_rdi_language_from_dw_language(DW_Language v) return result; } -internal RDI_RegCodeX86 -d2r_rdi_reg_code_from_dw_reg_x86(DW_RegX86 v) -{ - RDI_RegCodeX86 result = RDI_RegCode_nil; - switch(v) - { - default:{}break; -#define X(reg_dw, val_dw, reg_rdi, ...) case DW_RegX86_##reg_dw: result = RDI_RegCodeX86_##reg_rdi; break; - DW_Regs_X86_XList(X) -#undef X - } - return result; -} - internal RDI_RegCodeX64 d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v) { @@ -99,9 +85,8 @@ d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v) RDI_RegCode result = RDI_RegCode_nil; switch(arch) { - default: - case Arch_Null: - case Arch_x86:{result = d2r_rdi_reg_code_from_dw_reg_x86(v);}break; + default: NotImplemented; break; + case Arch_Null: break; case Arch_x64:{result = d2r_rdi_reg_code_from_dw_reg_x64(v);}break; } return result; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index ec07ba46..1af4c114 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -98,7 +98,6 @@ typedef struct D2R_ValueTypeStack //~ rjf: Enum Conversion Helpers internal RDI_Language d2r_rdi_language_from_dw_language(DW_Language v); -internal RDI_RegCodeX86 d2r_rdi_reg_code_from_dw_reg_x86(DW_RegX86 v); internal RDI_RegCodeX64 d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v); internal RDI_RegCode d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v); diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 9c3fc512..99742013 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -69,7 +69,7 @@ p2r_rdi_arch_from_cv_arch(CV_Arch cv_arch) RDI_Arch result = 0; switch(cv_arch) { - case CV_Arch_8086: result = RDI_Arch_X86; break; + case CV_Arch_8086: NotImplemented; break; case CV_Arch_X64: result = RDI_Arch_X64; break; //case CV_Arch_8080: break; //case CV_Arch_80286: break; @@ -139,15 +139,6 @@ p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) RDI_RegCode result = 0; switch(arch) { - case RDI_Arch_X86: - { - switch(reg_code) - { -#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX86_##RDN; break; - CV_Reg_X86_XList(X) -#undef X - } - }break; case RDI_Arch_X64: { switch(reg_code) @@ -287,25 +278,6 @@ p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encod RDI_RegCode result = 0; switch(arch) { - case RDI_Arch_X86: - { - switch(encoded_reg) - { - case CV_EncodedFramePtrReg_StackPtr: - { - // TODO(allen): support CV_AllReg_VFRAME - // TODO(allen): error - }break; - case CV_EncodedFramePtrReg_FramePtr: - { - result = RDI_RegCodeX86_ebp; - }break; - case CV_EncodedFramePtrReg_BasePtr: - { - result = RDI_RegCodeX86_ebx; - }break; - } - }break; case RDI_Arch_X64: { switch(encoded_reg) @@ -3762,7 +3734,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) switch(arch) { default:{}break; - case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP || cv_reg == CV_Regx86_EBP);}break; case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP || cv_reg == CV_Regx64_RBP);}break; } if(is_stack_reg) @@ -3804,10 +3775,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) B32 extra_indirection_to_value = 0; switch(arch) { - case RDI_Arch_X86: - { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size))); - }break; case RDI_Arch_X64: { extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 7d5ad140..c5658272 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -26,7 +26,7 @@ rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_Binar { default:{}break; case Arch_x64:{arch_rdi = RDI_Arch_X64;}break; - case Arch_x86:{arch_rdi = RDI_Arch_X86;}break; + case Arch_x86:{NotImplemented;}break; } // find max VOFF diff --git a/src/regs/generated/regs.meta.c b/src/regs/generated/regs.meta.c index 66f1a886..493d0ec0 100644 --- a/src/regs/generated/regs.meta.c +++ b/src/regs/generated/regs.meta.c @@ -10,7 +10,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = sizeof(REGS_RegBlockX64);}break; -case Arch_x86:{result = sizeof(REGS_RegBlockX86);}break; } return result; } @@ -21,7 +20,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = REGS_RegCodeX64_COUNT;}break; -case Arch_x86:{result = REGS_RegCodeX86_COUNT;}break; } return result; } @@ -32,7 +30,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = REGS_AliasCodeX64_COUNT;}break; -case Arch_x86:{result = REGS_AliasCodeX86_COUNT;}break; } return result; } @@ -43,7 +40,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = regs_g_reg_code_x64_string_table;}break; -case Arch_x86:{result = regs_g_reg_code_x86_string_table;}break; } return result; } @@ -54,7 +50,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = regs_g_alias_code_x64_string_table;}break; -case Arch_x86:{result = regs_g_alias_code_x86_string_table;}break; } return result; } @@ -65,7 +60,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = regs_g_reg_code_x64_rng_table;}break; -case Arch_x86:{result = regs_g_reg_code_x86_rng_table;}break; } return result; } @@ -76,7 +70,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = regs_g_alias_code_x64_slice_table;}break; -case Arch_x86:{result = regs_g_alias_code_x86_slice_table;}break; } return result; } @@ -87,7 +80,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = regs_g_reg_code_x64_usage_kind_table;}break; -case Arch_x86:{result = regs_g_reg_code_x86_usage_kind_table;}break; } return result; } @@ -98,7 +90,6 @@ switch(arch) { default:{}break; case Arch_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break; -case Arch_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break; } return result; } @@ -202,7 +193,7 @@ REGS_UsageKind_Normal, REGS_UsageKind_Normal, }; -REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96] = +REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[95] = { REGS_UsageKind_Normal, REGS_UsageKind_Normal, @@ -259,7 +250,6 @@ REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, -REGS_UsageKind_Normal, REGS_UsageKind_Vector, REGS_UsageKind_Vector, REGS_UsageKind_Vector, @@ -401,7 +391,7 @@ str8_lit_comp("tr"), str8_lit_comp("ldtr"), }; -String8 regs_g_alias_code_x64_string_table[96] = +String8 regs_g_alias_code_x64_string_table[95] = { str8_lit_comp(""), str8_lit_comp("eax"), @@ -420,7 +410,6 @@ str8_lit_comp("r12d"), str8_lit_comp("r13d"), str8_lit_comp("r14d"), str8_lit_comp("r15d"), -str8_lit_comp("eip"), str8_lit_comp("eflags"), str8_lit_comp("ax"), str8_lit_comp("cx"), @@ -600,7 +589,7 @@ REGS_Rng regs_g_reg_code_x64_rng_table[95] = {(U16)OffsetOf(REGS_RegBlockX64, ldtr), 2}, }; -REGS_Slice regs_g_alias_code_x64_slice_table[96] = +REGS_Slice regs_g_alias_code_x64_slice_table[95] = { {0}, {REGS_RegCodeX64_rax, 0, 4}, @@ -619,7 +608,6 @@ REGS_Slice regs_g_alias_code_x64_slice_table[96] = {REGS_RegCodeX64_r13, 0, 4}, {REGS_RegCodeX64_r14, 0, 4}, {REGS_RegCodeX64_r15, 0, 4}, -{REGS_RegCodeX64_rip, 0, 4}, {REGS_RegCodeX64_rflags, 0, 4}, {REGS_RegCodeX64_rax, 0, 2}, {REGS_RegCodeX64_rcx, 0, 2}, @@ -700,302 +688,5 @@ REGS_Slice regs_g_alias_code_x64_slice_table[96] = {REGS_RegCodeX64_st7, 0, 8}, }; -REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[55] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -}; - -REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -}; - -String8 regs_g_reg_code_x86_string_table[55] = -{ -str8_lit_comp(""), -str8_lit_comp("eax"), -str8_lit_comp("ecx"), -str8_lit_comp("edx"), -str8_lit_comp("ebx"), -str8_lit_comp("esp"), -str8_lit_comp("ebp"), -str8_lit_comp("esi"), -str8_lit_comp("edi"), -str8_lit_comp("fsbase"), -str8_lit_comp("gsbase"), -str8_lit_comp("eflags"), -str8_lit_comp("eip"), -str8_lit_comp("dr0"), -str8_lit_comp("dr1"), -str8_lit_comp("dr2"), -str8_lit_comp("dr3"), -str8_lit_comp("dr4"), -str8_lit_comp("dr5"), -str8_lit_comp("dr6"), -str8_lit_comp("dr7"), -str8_lit_comp("st0"), -str8_lit_comp("st1"), -str8_lit_comp("st2"), -str8_lit_comp("st3"), -str8_lit_comp("st4"), -str8_lit_comp("st5"), -str8_lit_comp("st6"), -str8_lit_comp("st7"), -str8_lit_comp("fcw"), -str8_lit_comp("fsw"), -str8_lit_comp("ftw"), -str8_lit_comp("fop"), -str8_lit_comp("fcs"), -str8_lit_comp("fds"), -str8_lit_comp("fip"), -str8_lit_comp("fdp"), -str8_lit_comp("mxcsr"), -str8_lit_comp("mxcsr_mask"), -str8_lit_comp("ss"), -str8_lit_comp("cs"), -str8_lit_comp("ds"), -str8_lit_comp("es"), -str8_lit_comp("fs"), -str8_lit_comp("gs"), -str8_lit_comp("tr"), -str8_lit_comp("ldtr"), -str8_lit_comp("ymm0"), -str8_lit_comp("ymm1"), -str8_lit_comp("ymm2"), -str8_lit_comp("ymm3"), -str8_lit_comp("ymm4"), -str8_lit_comp("ymm5"), -str8_lit_comp("ymm6"), -str8_lit_comp("ymm7"), -}; - -String8 regs_g_alias_code_x86_string_table[36] = -{ -str8_lit_comp(""), -str8_lit_comp("ax"), -str8_lit_comp("cx"), -str8_lit_comp("bx"), -str8_lit_comp("dx"), -str8_lit_comp("sp"), -str8_lit_comp("bp"), -str8_lit_comp("si"), -str8_lit_comp("di"), -str8_lit_comp("ip"), -str8_lit_comp("ah"), -str8_lit_comp("ch"), -str8_lit_comp("dh"), -str8_lit_comp("bh"), -str8_lit_comp("al"), -str8_lit_comp("cl"), -str8_lit_comp("dl"), -str8_lit_comp("bl"), -str8_lit_comp("bpl"), -str8_lit_comp("spl"), -str8_lit_comp("xmm0"), -str8_lit_comp("xmm1"), -str8_lit_comp("xmm2"), -str8_lit_comp("xmm3"), -str8_lit_comp("xmm4"), -str8_lit_comp("xmm5"), -str8_lit_comp("xmm6"), -str8_lit_comp("xmm7"), -str8_lit_comp("mm0"), -str8_lit_comp("mm1"), -str8_lit_comp("mm2"), -str8_lit_comp("mm3"), -str8_lit_comp("mm4"), -str8_lit_comp("mm5"), -str8_lit_comp("mm6"), -str8_lit_comp("mm7"), -}; - -REGS_Rng regs_g_reg_code_x86_rng_table[55] = -{ -{0}, -{(U16)OffsetOf(REGS_RegBlockX86, eax), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ecx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, edx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ebx), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, esp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ebp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, esi), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, edi), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fsbase), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, gsbase), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, eflags), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, eip), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr0), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr1), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr2), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr3), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr4), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr5), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr6), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, dr7), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, st0), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st1), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st2), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st3), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st4), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st5), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st6), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, st7), 10}, -{(U16)OffsetOf(REGS_RegBlockX86, fcw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fsw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ftw), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fop), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fcs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fds), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fip), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, fdp), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, mxcsr), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, mxcsr_mask), 4}, -{(U16)OffsetOf(REGS_RegBlockX86, ss), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, cs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ds), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, es), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, fs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, gs), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, tr), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ldtr), 2}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm0), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm1), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm2), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm3), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm4), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm5), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm6), 32}, -{(U16)OffsetOf(REGS_RegBlockX86, ymm7), 32}, -}; - -REGS_Slice regs_g_alias_code_x86_slice_table[36] = -{ -{0}, -{REGS_RegCodeX86_eax, 0, 2}, -{REGS_RegCodeX86_ecx, 0, 2}, -{REGS_RegCodeX86_ebx, 0, 2}, -{REGS_RegCodeX86_edx, 0, 2}, -{REGS_RegCodeX86_esp, 0, 2}, -{REGS_RegCodeX86_ebp, 0, 2}, -{REGS_RegCodeX86_esi, 0, 2}, -{REGS_RegCodeX86_edi, 0, 2}, -{REGS_RegCodeX86_eip, 0, 2}, -{REGS_RegCodeX86_eax, 1, 1}, -{REGS_RegCodeX86_ecx, 1, 1}, -{REGS_RegCodeX86_edx, 1, 1}, -{REGS_RegCodeX86_ebx, 1, 1}, -{REGS_RegCodeX86_eax, 0, 1}, -{REGS_RegCodeX86_ecx, 0, 1}, -{REGS_RegCodeX86_edx, 0, 1}, -{REGS_RegCodeX86_ebx, 0, 1}, -{REGS_RegCodeX86_ebp, 0, 1}, -{REGS_RegCodeX86_esp, 0, 1}, -{REGS_RegCodeX86_ymm0, 0, 16}, -{REGS_RegCodeX86_ymm1, 0, 16}, -{REGS_RegCodeX86_ymm2, 0, 16}, -{REGS_RegCodeX86_ymm3, 0, 16}, -{REGS_RegCodeX86_ymm4, 0, 16}, -{REGS_RegCodeX86_ymm5, 0, 16}, -{REGS_RegCodeX86_ymm6, 0, 16}, -{REGS_RegCodeX86_ymm7, 0, 16}, -{REGS_RegCodeX86_st0, 0, 8}, -{REGS_RegCodeX86_st1, 0, 8}, -{REGS_RegCodeX86_st2, 0, 8}, -{REGS_RegCodeX86_st3, 0, 8}, -{REGS_RegCodeX86_st4, 0, 8}, -{REGS_RegCodeX86_st5, 0, 8}, -{REGS_RegCodeX86_st6, 0, 8}, -{REGS_RegCodeX86_st7, 0, 8}, -}; - C_LINKAGE_END diff --git a/src/regs/generated/regs.meta.h b/src/regs/generated/regs.meta.h index 2490022d..fca64a93 100644 --- a/src/regs/generated/regs.meta.h +++ b/src/regs/generated/regs.meta.h @@ -125,7 +125,6 @@ REGS_AliasCodeX64_r12d, REGS_AliasCodeX64_r13d, REGS_AliasCodeX64_r14d, REGS_AliasCodeX64_r15d, -REGS_AliasCodeX64_eip, REGS_AliasCodeX64_eflags, REGS_AliasCodeX64_ax, REGS_AliasCodeX64_cx, @@ -207,107 +206,6 @@ REGS_AliasCodeX64_mm7, REGS_AliasCodeX64_COUNT, } REGS_AliasCodeX64; -typedef enum REGS_RegCodeX86 -{ -REGS_RegCodeX86_NULL, -REGS_RegCodeX86_eax, -REGS_RegCodeX86_ecx, -REGS_RegCodeX86_edx, -REGS_RegCodeX86_ebx, -REGS_RegCodeX86_esp, -REGS_RegCodeX86_ebp, -REGS_RegCodeX86_esi, -REGS_RegCodeX86_edi, -REGS_RegCodeX86_fsbase, -REGS_RegCodeX86_gsbase, -REGS_RegCodeX86_eflags, -REGS_RegCodeX86_eip, -REGS_RegCodeX86_dr0, -REGS_RegCodeX86_dr1, -REGS_RegCodeX86_dr2, -REGS_RegCodeX86_dr3, -REGS_RegCodeX86_dr4, -REGS_RegCodeX86_dr5, -REGS_RegCodeX86_dr6, -REGS_RegCodeX86_dr7, -REGS_RegCodeX86_st0, -REGS_RegCodeX86_st1, -REGS_RegCodeX86_st2, -REGS_RegCodeX86_st3, -REGS_RegCodeX86_st4, -REGS_RegCodeX86_st5, -REGS_RegCodeX86_st6, -REGS_RegCodeX86_st7, -REGS_RegCodeX86_fcw, -REGS_RegCodeX86_fsw, -REGS_RegCodeX86_ftw, -REGS_RegCodeX86_fop, -REGS_RegCodeX86_fcs, -REGS_RegCodeX86_fds, -REGS_RegCodeX86_fip, -REGS_RegCodeX86_fdp, -REGS_RegCodeX86_mxcsr, -REGS_RegCodeX86_mxcsr_mask, -REGS_RegCodeX86_ss, -REGS_RegCodeX86_cs, -REGS_RegCodeX86_ds, -REGS_RegCodeX86_es, -REGS_RegCodeX86_fs, -REGS_RegCodeX86_gs, -REGS_RegCodeX86_tr, -REGS_RegCodeX86_ldtr, -REGS_RegCodeX86_ymm0, -REGS_RegCodeX86_ymm1, -REGS_RegCodeX86_ymm2, -REGS_RegCodeX86_ymm3, -REGS_RegCodeX86_ymm4, -REGS_RegCodeX86_ymm5, -REGS_RegCodeX86_ymm6, -REGS_RegCodeX86_ymm7, -REGS_RegCodeX86_COUNT, -} REGS_RegCodeX86; - -typedef enum REGS_AliasCodeX86 -{ -REGS_AliasCodeX86_NULL, -REGS_AliasCodeX86_ax, -REGS_AliasCodeX86_cx, -REGS_AliasCodeX86_bx, -REGS_AliasCodeX86_dx, -REGS_AliasCodeX86_sp, -REGS_AliasCodeX86_bp, -REGS_AliasCodeX86_si, -REGS_AliasCodeX86_di, -REGS_AliasCodeX86_ip, -REGS_AliasCodeX86_ah, -REGS_AliasCodeX86_ch, -REGS_AliasCodeX86_dh, -REGS_AliasCodeX86_bh, -REGS_AliasCodeX86_al, -REGS_AliasCodeX86_cl, -REGS_AliasCodeX86_dl, -REGS_AliasCodeX86_bl, -REGS_AliasCodeX86_bpl, -REGS_AliasCodeX86_spl, -REGS_AliasCodeX86_xmm0, -REGS_AliasCodeX86_xmm1, -REGS_AliasCodeX86_xmm2, -REGS_AliasCodeX86_xmm3, -REGS_AliasCodeX86_xmm4, -REGS_AliasCodeX86_xmm5, -REGS_AliasCodeX86_xmm6, -REGS_AliasCodeX86_xmm7, -REGS_AliasCodeX86_mm0, -REGS_AliasCodeX86_mm1, -REGS_AliasCodeX86_mm2, -REGS_AliasCodeX86_mm3, -REGS_AliasCodeX86_mm4, -REGS_AliasCodeX86_mm5, -REGS_AliasCodeX86_mm6, -REGS_AliasCodeX86_mm7, -REGS_AliasCodeX86_COUNT, -} REGS_AliasCodeX86; - typedef struct REGS_RegBlockX64 REGS_RegBlockX64; struct REGS_RegBlockX64 { @@ -407,78 +305,13 @@ REGS_Reg16 tr; REGS_Reg16 ldtr; }; -typedef struct REGS_RegBlockX86 REGS_RegBlockX86; -struct REGS_RegBlockX86 -{ -REGS_Reg32 eax; -REGS_Reg32 ecx; -REGS_Reg32 edx; -REGS_Reg32 ebx; -REGS_Reg32 esp; -REGS_Reg32 ebp; -REGS_Reg32 esi; -REGS_Reg32 edi; -REGS_Reg32 fsbase; -REGS_Reg32 gsbase; -REGS_Reg32 eflags; -REGS_Reg32 eip; -REGS_Reg32 dr0; -REGS_Reg32 dr1; -REGS_Reg32 dr2; -REGS_Reg32 dr3; -REGS_Reg32 dr4; -REGS_Reg32 dr5; -REGS_Reg32 dr6; -REGS_Reg32 dr7; -REGS_Reg80 st0; -REGS_Reg80 st1; -REGS_Reg80 st2; -REGS_Reg80 st3; -REGS_Reg80 st4; -REGS_Reg80 st5; -REGS_Reg80 st6; -REGS_Reg80 st7; -REGS_Reg16 fcw; -REGS_Reg16 fsw; -REGS_Reg16 ftw; -REGS_Reg16 fop; -REGS_Reg16 fcs; -REGS_Reg16 fds; -REGS_Reg32 fip; -REGS_Reg32 fdp; -REGS_Reg32 mxcsr; -REGS_Reg32 mxcsr_mask; -REGS_Reg16 ss; -REGS_Reg16 cs; -REGS_Reg16 ds; -REGS_Reg16 es; -REGS_Reg16 fs; -REGS_Reg16 gs; -REGS_Reg16 tr; -REGS_Reg16 ldtr; -REGS_Reg256 ymm0; -REGS_Reg256 ymm1; -REGS_Reg256 ymm2; -REGS_Reg256 ymm3; -REGS_Reg256 ymm4; -REGS_Reg256 ymm5; -REGS_Reg256 ymm6; -REGS_Reg256 ymm7; -}; - C_LINKAGE_BEGIN extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[95]; -extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96]; +extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[95]; extern String8 regs_g_reg_code_x64_string_table[95]; -extern String8 regs_g_alias_code_x64_string_table[96]; +extern String8 regs_g_alias_code_x64_string_table[95]; extern REGS_Rng regs_g_reg_code_x64_rng_table[95]; -extern REGS_Slice regs_g_alias_code_x64_slice_table[96]; -extern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[55]; -extern REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36]; -extern String8 regs_g_reg_code_x86_string_table[55]; -extern String8 regs_g_alias_code_x86_string_table[36]; -extern REGS_Rng regs_g_reg_code_x86_rng_table[55]; -extern REGS_Slice regs_g_alias_code_x86_slice_table[36]; +extern REGS_Slice regs_g_alias_code_x64_slice_table[95]; C_LINKAGE_END diff --git a/src/regs/rdi/generated/regs_rdi.meta.c b/src/regs/rdi/generated/regs_rdi.meta.c index cfdb9754..3ea6ce5c 100644 --- a/src/regs/rdi/generated/regs_rdi.meta.c +++ b/src/regs/rdi/generated/regs_rdi.meta.c @@ -112,64 +112,7 @@ case REGS_RegCodeX64_ldtr:{result = RDI_RegCodeX64_ldtr;}break; }break; case Arch_x86: { -switch(code) -{ -default:{}break; -case REGS_RegCodeX86_eax:{result = RDI_RegCodeX86_eax;}break; -case REGS_RegCodeX86_ecx:{result = RDI_RegCodeX86_ecx;}break; -case REGS_RegCodeX86_edx:{result = RDI_RegCodeX86_edx;}break; -case REGS_RegCodeX86_ebx:{result = RDI_RegCodeX86_ebx;}break; -case REGS_RegCodeX86_esp:{result = RDI_RegCodeX86_esp;}break; -case REGS_RegCodeX86_ebp:{result = RDI_RegCodeX86_ebp;}break; -case REGS_RegCodeX86_esi:{result = RDI_RegCodeX86_esi;}break; -case REGS_RegCodeX86_edi:{result = RDI_RegCodeX86_edi;}break; -case REGS_RegCodeX86_fsbase:{result = RDI_RegCodeX86_fsbase;}break; -case REGS_RegCodeX86_gsbase:{result = RDI_RegCodeX86_gsbase;}break; -case REGS_RegCodeX86_eflags:{result = RDI_RegCodeX86_eflags;}break; -case REGS_RegCodeX86_eip:{result = RDI_RegCodeX86_eip;}break; -case REGS_RegCodeX86_dr0:{result = RDI_RegCodeX86_dr0;}break; -case REGS_RegCodeX86_dr1:{result = RDI_RegCodeX86_dr1;}break; -case REGS_RegCodeX86_dr2:{result = RDI_RegCodeX86_dr2;}break; -case REGS_RegCodeX86_dr3:{result = RDI_RegCodeX86_dr3;}break; -case REGS_RegCodeX86_dr4:{result = RDI_RegCodeX86_dr4;}break; -case REGS_RegCodeX86_dr5:{result = RDI_RegCodeX86_dr5;}break; -case REGS_RegCodeX86_dr6:{result = RDI_RegCodeX86_dr6;}break; -case REGS_RegCodeX86_dr7:{result = RDI_RegCodeX86_dr7;}break; -case REGS_RegCodeX86_st0:{result = RDI_RegCodeX86_st0;}break; -case REGS_RegCodeX86_st1:{result = RDI_RegCodeX86_st1;}break; -case REGS_RegCodeX86_st2:{result = RDI_RegCodeX86_st2;}break; -case REGS_RegCodeX86_st3:{result = RDI_RegCodeX86_st3;}break; -case REGS_RegCodeX86_st4:{result = RDI_RegCodeX86_st4;}break; -case REGS_RegCodeX86_st5:{result = RDI_RegCodeX86_st5;}break; -case REGS_RegCodeX86_st6:{result = RDI_RegCodeX86_st6;}break; -case REGS_RegCodeX86_st7:{result = RDI_RegCodeX86_st7;}break; -case REGS_RegCodeX86_fcw:{result = RDI_RegCodeX86_fcw;}break; -case REGS_RegCodeX86_fsw:{result = RDI_RegCodeX86_fsw;}break; -case REGS_RegCodeX86_ftw:{result = RDI_RegCodeX86_ftw;}break; -case REGS_RegCodeX86_fop:{result = RDI_RegCodeX86_fop;}break; -case REGS_RegCodeX86_fcs:{result = RDI_RegCodeX86_fcs;}break; -case REGS_RegCodeX86_fds:{result = RDI_RegCodeX86_fds;}break; -case REGS_RegCodeX86_fip:{result = RDI_RegCodeX86_fip;}break; -case REGS_RegCodeX86_fdp:{result = RDI_RegCodeX86_fdp;}break; -case REGS_RegCodeX86_mxcsr:{result = RDI_RegCodeX86_mxcsr;}break; -case REGS_RegCodeX86_mxcsr_mask:{result = RDI_RegCodeX86_mxcsr_mask;}break; -case REGS_RegCodeX86_ss:{result = RDI_RegCodeX86_ss;}break; -case REGS_RegCodeX86_cs:{result = RDI_RegCodeX86_cs;}break; -case REGS_RegCodeX86_ds:{result = RDI_RegCodeX86_ds;}break; -case REGS_RegCodeX86_es:{result = RDI_RegCodeX86_es;}break; -case REGS_RegCodeX86_fs:{result = RDI_RegCodeX86_fs;}break; -case REGS_RegCodeX86_gs:{result = RDI_RegCodeX86_gs;}break; -case REGS_RegCodeX86_tr:{result = RDI_RegCodeX86_tr;}break; -case REGS_RegCodeX86_ldtr:{result = RDI_RegCodeX86_ldtr;}break; -case REGS_RegCodeX86_ymm0:{result = RDI_RegCodeX86_ymm0;}break; -case REGS_RegCodeX86_ymm1:{result = RDI_RegCodeX86_ymm1;}break; -case REGS_RegCodeX86_ymm2:{result = RDI_RegCodeX86_ymm2;}break; -case REGS_RegCodeX86_ymm3:{result = RDI_RegCodeX86_ymm3;}break; -case REGS_RegCodeX86_ymm4:{result = RDI_RegCodeX86_ymm4;}break; -case REGS_RegCodeX86_ymm5:{result = RDI_RegCodeX86_ymm5;}break; -case REGS_RegCodeX86_ymm6:{result = RDI_RegCodeX86_ymm6;}break; -case REGS_RegCodeX86_ymm7:{result = RDI_RegCodeX86_ymm7;}break; -} +NotImplemented; }break; } return result; @@ -283,64 +226,7 @@ case RDI_RegCodeX64_ldtr:{result = REGS_RegCodeX64_ldtr;}break; }break; case Arch_x86: { -switch(code) -{ -default:{}break; -case RDI_RegCodeX86_eax:{result = REGS_RegCodeX86_eax;}break; -case RDI_RegCodeX86_ecx:{result = REGS_RegCodeX86_ecx;}break; -case RDI_RegCodeX86_edx:{result = REGS_RegCodeX86_edx;}break; -case RDI_RegCodeX86_ebx:{result = REGS_RegCodeX86_ebx;}break; -case RDI_RegCodeX86_esp:{result = REGS_RegCodeX86_esp;}break; -case RDI_RegCodeX86_ebp:{result = REGS_RegCodeX86_ebp;}break; -case RDI_RegCodeX86_esi:{result = REGS_RegCodeX86_esi;}break; -case RDI_RegCodeX86_edi:{result = REGS_RegCodeX86_edi;}break; -case RDI_RegCodeX86_fsbase:{result = REGS_RegCodeX86_fsbase;}break; -case RDI_RegCodeX86_gsbase:{result = REGS_RegCodeX86_gsbase;}break; -case RDI_RegCodeX86_eflags:{result = REGS_RegCodeX86_eflags;}break; -case RDI_RegCodeX86_eip:{result = REGS_RegCodeX86_eip;}break; -case RDI_RegCodeX86_dr0:{result = REGS_RegCodeX86_dr0;}break; -case RDI_RegCodeX86_dr1:{result = REGS_RegCodeX86_dr1;}break; -case RDI_RegCodeX86_dr2:{result = REGS_RegCodeX86_dr2;}break; -case RDI_RegCodeX86_dr3:{result = REGS_RegCodeX86_dr3;}break; -case RDI_RegCodeX86_dr4:{result = REGS_RegCodeX86_dr4;}break; -case RDI_RegCodeX86_dr5:{result = REGS_RegCodeX86_dr5;}break; -case RDI_RegCodeX86_dr6:{result = REGS_RegCodeX86_dr6;}break; -case RDI_RegCodeX86_dr7:{result = REGS_RegCodeX86_dr7;}break; -case RDI_RegCodeX86_st0:{result = REGS_RegCodeX86_st0;}break; -case RDI_RegCodeX86_st1:{result = REGS_RegCodeX86_st1;}break; -case RDI_RegCodeX86_st2:{result = REGS_RegCodeX86_st2;}break; -case RDI_RegCodeX86_st3:{result = REGS_RegCodeX86_st3;}break; -case RDI_RegCodeX86_st4:{result = REGS_RegCodeX86_st4;}break; -case RDI_RegCodeX86_st5:{result = REGS_RegCodeX86_st5;}break; -case RDI_RegCodeX86_st6:{result = REGS_RegCodeX86_st6;}break; -case RDI_RegCodeX86_st7:{result = REGS_RegCodeX86_st7;}break; -case RDI_RegCodeX86_fcw:{result = REGS_RegCodeX86_fcw;}break; -case RDI_RegCodeX86_fsw:{result = REGS_RegCodeX86_fsw;}break; -case RDI_RegCodeX86_ftw:{result = REGS_RegCodeX86_ftw;}break; -case RDI_RegCodeX86_fop:{result = REGS_RegCodeX86_fop;}break; -case RDI_RegCodeX86_fcs:{result = REGS_RegCodeX86_fcs;}break; -case RDI_RegCodeX86_fds:{result = REGS_RegCodeX86_fds;}break; -case RDI_RegCodeX86_fip:{result = REGS_RegCodeX86_fip;}break; -case RDI_RegCodeX86_fdp:{result = REGS_RegCodeX86_fdp;}break; -case RDI_RegCodeX86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break; -case RDI_RegCodeX86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break; -case RDI_RegCodeX86_ss:{result = REGS_RegCodeX86_ss;}break; -case RDI_RegCodeX86_cs:{result = REGS_RegCodeX86_cs;}break; -case RDI_RegCodeX86_ds:{result = REGS_RegCodeX86_ds;}break; -case RDI_RegCodeX86_es:{result = REGS_RegCodeX86_es;}break; -case RDI_RegCodeX86_fs:{result = REGS_RegCodeX86_fs;}break; -case RDI_RegCodeX86_gs:{result = REGS_RegCodeX86_gs;}break; -case RDI_RegCodeX86_tr:{result = REGS_RegCodeX86_tr;}break; -case RDI_RegCodeX86_ldtr:{result = REGS_RegCodeX86_ldtr;}break; -case RDI_RegCodeX86_ymm0:{result = REGS_RegCodeX86_ymm0;}break; -case RDI_RegCodeX86_ymm1:{result = REGS_RegCodeX86_ymm1;}break; -case RDI_RegCodeX86_ymm2:{result = REGS_RegCodeX86_ymm2;}break; -case RDI_RegCodeX86_ymm3:{result = REGS_RegCodeX86_ymm3;}break; -case RDI_RegCodeX86_ymm4:{result = REGS_RegCodeX86_ymm4;}break; -case RDI_RegCodeX86_ymm5:{result = REGS_RegCodeX86_ymm5;}break; -case RDI_RegCodeX86_ymm6:{result = REGS_RegCodeX86_ymm6;}break; -case RDI_RegCodeX86_ymm7:{result = REGS_RegCodeX86_ymm7;}break; -} +NotImplemented; }break; } return result; diff --git a/src/regs/rdi/regs_rdi.mdesk b/src/regs/rdi/regs_rdi.mdesk index 1ef1197c..a03b73ea 100644 --- a/src/regs/rdi/regs_rdi.mdesk +++ b/src/regs/rdi/regs_rdi.mdesk @@ -22,11 +22,7 @@ `}break;`; `case Arch_x86:`; `{`; - `switch(code)` - `{`; - `default:{}break;`; - @expand(REGS_RegTableX86 a) `case REGS_RegCodeX86_$(a.name):{result = RDI_RegCodeX86_$(a.name);}break;`; - `}`; + `NotImplemented;` `}break;`; `}`; `return result;`; @@ -51,11 +47,7 @@ `}break;`; `case Arch_x86:`; `{`; - `switch(code)` - `{`; - `default:{}break;`; - @expand(REGS_RegTableX86 a) `case RDI_RegCodeX86_$(a.name):{result = REGS_RegCodeX86_$(a.name);}break;`; - `}`; + `NotImplemented;` `}break;`; `}`; `return result;`; diff --git a/src/regs/regs.c b/src/regs/regs.c index 2127200d..83b171d7 100644 --- a/src/regs/regs.c +++ b/src/regs/regs.c @@ -65,7 +65,7 @@ regs_rip_from_arch_block(Arch arch, void *block) { default:{}break; case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break; - case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->eip.u32;}break; + case Arch_x86:{NotImplemented;}break; } return result; } @@ -78,7 +78,7 @@ regs_rsp_from_arch_block(Arch arch, void *block) { default:{}break; case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break; - case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->esp.u32;}break; + case Arch_x86:{NotImplemented;}break; } return result; } @@ -90,7 +90,7 @@ regs_arch_block_write_rip(Arch arch, void *block, U64 rip) { default:{}break; case Arch_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break; - case Arch_x86:{((REGS_RegBlockX86 *)block)->eip.u32 = (U32)rip;}break; + case Arch_x86:{NotImplemented;}break; } } @@ -101,6 +101,6 @@ regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp) { default:{}break; case Arch_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break; - case Arch_x86:{((REGS_RegBlockX86 *)block)->esp.u32 = (U32)rsp;}break; + case Arch_x86:{NotImplemented;}break; } } diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index cd05c10a..018c8c5f 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -122,10 +122,6 @@ REGS_AliasTableX64: {r13d r13 0 32 Normal} {r14d r14 0 32 Normal} {r15d r15 0 32 Normal} - - // TODO(allen): figure this one out; visual studio disagrees - {eip rip 0 32 Normal} - {eflags rflags 0 32 Normal} {ax rax 0 16 Normal} {cx rcx 0 16 Normal} @@ -206,114 +202,6 @@ REGS_AliasTableX64: {mm7 st7 0 64 Vector} } -//////////////////////////////// -//~ rjf: X86 Tables - -@table(name size usage) -REGS_RegTableX86: -{ - {eax 32 Normal} - {ecx 32 Normal} - {edx 32 Normal} - {ebx 32 Normal} - {esp 32 Normal} - {ebp 32 Normal} - {esi 32 Normal} - {edi 32 Normal} - {fsbase 32 Normal} - {gsbase 32 Normal} - {eflags 32 Normal} - {eip 32 Normal} - {dr0 32 Normal} - {dr1 32 Normal} - {dr2 32 Normal} - {dr3 32 Normal} - {dr4 32 Normal} - {dr5 32 Normal} - {dr6 32 Normal} - {dr7 32 Normal} - // FSave registers - // TODO(allen): I am suspicious of this stuff here. - // Are fpr0-7 and st0-7 actually different things? Visual studio doesn't show - // frp0-7. Not sure if the mm0-7 aliases are setup the right way either. - {st0 80 Normal} - {st1 80 Normal} - {st2 80 Normal} - {st3 80 Normal} - {st4 80 Normal} - {st5 80 Normal} - {st6 80 Normal} - {st7 80 Normal} - {fcw 16 Normal} - {fsw 16 Normal} - {ftw 16 Normal} - {fop 16 Normal} - {fcs 16 Normal} - {fds 16 Normal} - {fip 32 Normal} - {fdp 32 Normal} - {mxcsr 32 Normal} - // TODO(allen): I don't think this is really a "register" - think about this... - {mxcsr_mask 32 Normal} - {ss 16 Normal} - {cs 16 Normal} - {ds 16 Normal} - {es 16 Normal} - {fs 16 Normal} - {gs 16 Normal} - {tr 16 Normal} - {ldtr 16 Normal} - // SIMD REGISTERS - {ymm0 256 Vector} - {ymm1 256 Vector} - {ymm2 256 Vector} - {ymm3 256 Vector} - {ymm4 256 Vector} - {ymm5 256 Vector} - {ymm6 256 Vector} - {ymm7 256 Vector} -} - -@table(name base off size usage) -REGS_AliasTableX86: -{ - {ax eax 0 16 Normal} - {cx ecx 0 16 Normal} - {bx ebx 0 16 Normal} - {dx edx 0 16 Normal} - {sp esp 0 16 Normal} - {bp ebp 0 16 Normal} - {si esi 0 16 Normal} - {di edi 0 16 Normal} - {ip eip 0 16 Normal} - {ah eax 8 8 Normal} - {ch ecx 8 8 Normal} - {dh edx 8 8 Normal} - {bh ebx 8 8 Normal} - {al eax 0 8 Normal} - {cl ecx 0 8 Normal} - {dl edx 0 8 Normal} - {bl ebx 0 8 Normal} - {bpl ebp 0 8 Normal} - {spl esp 0 8 Normal} - {xmm0 ymm0 0 128 Vector} - {xmm1 ymm1 0 128 Vector} - {xmm2 ymm2 0 128 Vector} - {xmm3 ymm3 0 128 Vector} - {xmm4 ymm4 0 128 Vector} - {xmm5 ymm5 0 128 Vector} - {xmm6 ymm6 0 128 Vector} - {xmm7 ymm7 0 128 Vector} - {mm0 st0 0 64 Vector} - {mm1 st1 0 64 Vector} - {mm2 st2 0 64 Vector} - {mm3 st3 0 64 Vector} - {mm4 st4 0 64 Vector} - {mm5 st5 0 64 Vector} - {mm6 st6 0 64 Vector} - {mm7 st7 0 64 Vector} -} - //////////////////////////////// //~ rjf: Architecture Tables @@ -321,7 +209,6 @@ REGS_AliasTableX86: REGS_ArchTable: { {X64 x64} - {X86 x86} } //////////////////////////////// @@ -383,65 +270,6 @@ regs_g_alias_code_x64_usage_kind_table: @expand(REGS_AliasTableX64 a) `{REGS_RegCodeX64_$(a.base), $(a.off/8), $(a.size/8)}`, } -//////////////////////////////// -//~ rjf: X86 Generators - -@enum REGS_RegCodeX86: -{ - NULL, - @expand(REGS_RegTableX86 a) `$(a.name)`, - COUNT, -} - -@enum REGS_AliasCodeX86: -{ - NULL, - @expand(REGS_AliasTableX86 a) `$(a.name)`, - COUNT, -} - -@struct REGS_RegBlockX86: -{ - @expand(REGS_RegTableX86 a) `REGS_Reg$(a.size) $(a.name)`, -} - -@data(REGS_UsageKind) -regs_g_reg_code_x86_usage_kind_table: -{ - `REGS_UsageKind_Normal`; - @expand(REGS_RegTableX86 a) `REGS_UsageKind_$(a.usage)`; -} - -@data(REGS_UsageKind) regs_g_alias_code_x86_usage_kind_table: -{ - `REGS_UsageKind_Normal`; - @expand(REGS_AliasTableX86 a) `REGS_UsageKind_$(a.usage)`; -} - -@data(String8) regs_g_reg_code_x86_string_table: -{ - `str8_lit_comp("")`; - @expand(REGS_RegTableX86 a) `str8_lit_comp("$(a.name)")`; -} - -@data(String8) regs_g_alias_code_x86_string_table: -{ - `str8_lit_comp("")`; - @expand(REGS_AliasTableX86 a) `str8_lit_comp("$(a.name)")`; -} - -@data(REGS_Rng) regs_g_reg_code_x86_rng_table: -{ - `{0}`; - @expand(REGS_RegTableX86 a) `{(U16)OffsetOf(REGS_RegBlockX86, $(a.name)), $(a.size/8)}`, -} - -@data(REGS_Slice) regs_g_alias_code_x86_slice_table: -{ - `{0}`; - @expand(REGS_AliasTableX86 a) `{REGS_RegCodeX86_$(a.base), $(a.off/8), $(a.size/8)}`, -} - //////////////////////////////// //~ rjf: Architecture-Dynamic Helper Implementation Generators From 9659ab4ad269c9796db873fbc5f655ed737257f1 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 5 Dec 2025 17:03:05 -0800 Subject: [PATCH 093/850] remove privileged registers --- src/dwarf/dwarf.h | 7 ++++--- src/lib_rdi/rdi.h | 4 ---- src/rdi/rdi.mdesk | 2 -- src/regs/generated/regs.meta.c | 12 +++--------- src/regs/generated/regs.meta.h | 10 +++------- src/regs/rdi/generated/regs_rdi.meta.c | 4 ---- src/regs/regs.mdesk | 2 -- 7 files changed, 10 insertions(+), 31 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index b10502fe..154055d5 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1664,9 +1664,10 @@ X(Ds, 53, ds, 0, 2) \ X(Fs, 54, fs, 0, 2) \ X(Gs, 55, gs, 0, 2) \ X(FsBase, 58, fsbase, 0, 0) \ -X(GsBase, 59, gsbase, 0, 0) \ -X(Tr, 62, tr, 0, 0) \ -X(Ldtr, 63, ldtr, 0, 0) +X(GsBase, 59, gsbase, 0, 0) +// privileged registers: +// X(Tr, 62, nil, 0, 0) \ +// X(Ldtr, 63, nil, 0, 0) typedef U32 DW_Reg; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index bd008e83..b72a7af9 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -239,8 +239,6 @@ RDI_RegCodeX64_fdp = 91, RDI_RegCodeX64_mxcsr_mask = 92, RDI_RegCodeX64_cetmsr = 93, RDI_RegCodeX64_cetssp = 94, -RDI_RegCodeX64_tr = 95, -RDI_RegCodeX64_ldtr = 96, } RDI_RegCodeX64Enum; typedef RDI_U32 RDI_BinarySectionFlags; @@ -660,8 +658,6 @@ X(fdp, 91)\ X(mxcsr_mask, 92)\ X(cetmsr, 93)\ X(cetssp, 94)\ -X(tr, 95)\ -X(ldtr, 96)\ #define RDI_TopLevelInfo_XList \ X(RDI_Arch, arch)\ diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 65073945..f0176573 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -379,8 +379,6 @@ RDI_RegCodeX64Table: {mxcsr_mask 92} {cetmsr 93} {cetssp 94} - {tr 95} - {ldtr 96} } @enum(RDI_U32) RDI_Arch: diff --git a/src/regs/generated/regs.meta.c b/src/regs/generated/regs.meta.c index 493d0ec0..e93d742e 100644 --- a/src/regs/generated/regs.meta.c +++ b/src/regs/generated/regs.meta.c @@ -94,7 +94,7 @@ case Arch_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break; return result; } C_LINKAGE_BEGIN -REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[95] = +REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[93] = { REGS_UsageKind_Normal, REGS_UsageKind_Normal, @@ -189,8 +189,6 @@ REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, }; REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[95] = @@ -292,7 +290,7 @@ REGS_UsageKind_Vector, REGS_UsageKind_Vector, }; -String8 regs_g_reg_code_x64_string_table[95] = +String8 regs_g_reg_code_x64_string_table[93] = { str8_lit_comp(""), str8_lit_comp("rax"), @@ -387,8 +385,6 @@ str8_lit_comp("k6"), str8_lit_comp("k7"), str8_lit_comp("cetmsr"), str8_lit_comp("cetssp"), -str8_lit_comp("tr"), -str8_lit_comp("ldtr"), }; String8 regs_g_alias_code_x64_string_table[95] = @@ -490,7 +486,7 @@ str8_lit_comp("mm6"), str8_lit_comp("mm7"), }; -REGS_Rng regs_g_reg_code_x64_rng_table[95] = +REGS_Rng regs_g_reg_code_x64_rng_table[93] = { {0}, {(U16)OffsetOf(REGS_RegBlockX64, rax), 8}, @@ -585,8 +581,6 @@ REGS_Rng regs_g_reg_code_x64_rng_table[95] = {(U16)OffsetOf(REGS_RegBlockX64, k7), 8}, {(U16)OffsetOf(REGS_RegBlockX64, cetmsr), 8}, {(U16)OffsetOf(REGS_RegBlockX64, cetssp), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, tr), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ldtr), 2}, }; REGS_Slice regs_g_alias_code_x64_slice_table[95] = diff --git a/src/regs/generated/regs.meta.h b/src/regs/generated/regs.meta.h index fca64a93..5bf2dfdb 100644 --- a/src/regs/generated/regs.meta.h +++ b/src/regs/generated/regs.meta.h @@ -101,8 +101,6 @@ REGS_RegCodeX64_k6, REGS_RegCodeX64_k7, REGS_RegCodeX64_cetmsr, REGS_RegCodeX64_cetssp, -REGS_RegCodeX64_tr, -REGS_RegCodeX64_ldtr, REGS_RegCodeX64_COUNT, } REGS_RegCodeX64; @@ -301,16 +299,14 @@ REGS_Reg64 k6; REGS_Reg64 k7; REGS_Reg64 cetmsr; REGS_Reg64 cetssp; -REGS_Reg16 tr; -REGS_Reg16 ldtr; }; C_LINKAGE_BEGIN -extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[95]; +extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[93]; extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[95]; -extern String8 regs_g_reg_code_x64_string_table[95]; +extern String8 regs_g_reg_code_x64_string_table[93]; extern String8 regs_g_alias_code_x64_string_table[95]; -extern REGS_Rng regs_g_reg_code_x64_rng_table[95]; +extern REGS_Rng regs_g_reg_code_x64_rng_table[93]; extern REGS_Slice regs_g_alias_code_x64_slice_table[95]; C_LINKAGE_END diff --git a/src/regs/rdi/generated/regs_rdi.meta.c b/src/regs/rdi/generated/regs_rdi.meta.c index 3ea6ce5c..49a4c827 100644 --- a/src/regs/rdi/generated/regs_rdi.meta.c +++ b/src/regs/rdi/generated/regs_rdi.meta.c @@ -106,8 +106,6 @@ case REGS_RegCodeX64_k6:{result = RDI_RegCodeX64_k6;}break; case REGS_RegCodeX64_k7:{result = RDI_RegCodeX64_k7;}break; case REGS_RegCodeX64_cetmsr:{result = RDI_RegCodeX64_cetmsr;}break; case REGS_RegCodeX64_cetssp:{result = RDI_RegCodeX64_cetssp;}break; -case REGS_RegCodeX64_tr:{result = RDI_RegCodeX64_tr;}break; -case REGS_RegCodeX64_ldtr:{result = RDI_RegCodeX64_ldtr;}break; } }break; case Arch_x86: @@ -220,8 +218,6 @@ case RDI_RegCodeX64_k6:{result = REGS_RegCodeX64_k6;}break; case RDI_RegCodeX64_k7:{result = REGS_RegCodeX64_k7;}break; case RDI_RegCodeX64_cetmsr:{result = REGS_RegCodeX64_cetmsr;}break; case RDI_RegCodeX64_cetssp:{result = REGS_RegCodeX64_cetssp;}break; -case RDI_RegCodeX64_tr:{result = REGS_RegCodeX64_tr;}break; -case RDI_RegCodeX64_ldtr:{result = REGS_RegCodeX64_ldtr;}break; } }break; case Arch_x86: diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index 018c8c5f..0408c873 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -99,8 +99,6 @@ REGS_RegTableX64: {k7 64 Normal} {cetmsr 64 Normal} {cetssp 64 Normal} - {tr 16 Normal} - {ldtr 16 Normal} } @table(name base off size usage) From c221286ab865001878fa617d31da3e299cea8bcb Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 8 Dec 2025 13:29:24 -0800 Subject: [PATCH 094/850] WIP process attaching --- src/demon/linux/demon_core_linux.c | 180 ++++++++++++++++++++++------- src/demon/linux/demon_core_linux.h | 4 +- src/gnu/gnu_parse.c | 63 ++++++++++ src/gnu/gnu_parse.h | 41 +++++++ src/raddbg/raddbg_main.c | 2 + 5 files changed, 246 insertions(+), 44 deletions(-) create mode 100644 src/gnu/gnu_parse.c create mode 100644 src/gnu/gnu_parse.h diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 86a9d9fd..fe9b0f25 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -117,6 +117,17 @@ dmn_lnx_read_string(Arena *arena, int memory_fd, U64 vaddr) return dmn_lnx_read_string_capped(arena, memory_fd, vaddr, 4096); } +internal int +dmn_lnx_ptrace_seize(pid_t pid) +{ + // ensure tracer ops are issued on thread that sizes processes + if(dmn_lnx_state->tracer_tid == 0) { dmn_lnx_state->tracer_tid = gettid(); } + AssertAlways(dmn_lnx_state->tracer_tid == gettid()); + + // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE + return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE)); +} + //////////////////////////////// //~ Runtime Struct Helpers @@ -491,7 +502,7 @@ dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, } internal U64 -dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) +dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) { Temp scratch = scratch_begin(0, 0); @@ -521,7 +532,8 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase) } // extract necessary info out of dynamic program header - DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, rebase, dynamic_vaddr); + U64 dynamic_info_rebase = is_rebased ? 0 : rebase; + DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, dynamic_info_rebase, dynamic_vaddr); // extract symbol table count from available options U64 symbol_count = 0; @@ -660,6 +672,12 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) return dl_path; } +internal +GNU_MEM_READ(dmn_lnx_gnu_mem_read) +{ + return dmn_lnx_read(((DMN_LNX_Entity *)ud)->fd, r1u64(addr, addr + size), buffer); +} + //////////////////////////////// //~ SDT Probes @@ -1409,6 +1427,8 @@ dmn_lnx_handle_not_attached(Arena *arena, DMN_EventList *events) e->error_kind = DMN_ErrorKind_NotAttached; } +//////////////////////////////// + internal DMN_LNX_Entity * dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, pid_t tid) { @@ -1445,16 +1465,18 @@ dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity return thread; } -internal void -dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_subprocesses, pid_t pid) +internal DMN_LNX_Entity * +dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_subprocesses, B32 is_rebased, pid_t pid) { Temp scratch = scratch_begin(&arena, 1); + DMN_LNX_Entity *process = 0; + ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); - U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base); + U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base, is_rebased); U64 rdebug_brk_vaddr = rdebug_vaddr + gnu_r_brk_offset_from_arch(arch); U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; @@ -1536,7 +1558,7 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub // // init process // - DMN_LNX_Entity *process = dmn_lnx_entity_alloc(dmn_lnx_state->entities_base, DMN_LNX_EntityKind_Process); + process = dmn_lnx_entity_alloc(dmn_lnx_state->entities_base, DMN_LNX_EntityKind_Process); process->id = pid; process->arch = arch; process->fd = memory_fd; @@ -1615,6 +1637,7 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub dmn_lnx_state->active_process_count += 1; scratch_end(scratch); + return process; } internal void @@ -1665,7 +1688,7 @@ dmn_lnx_handle_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 e DMN_LNX_Entity *process = thread->parent; // store main thread's exit code - if(thread->is_main_thread) + if(thread->id == process->id) { process->main_thread_exit_code = exit_code; } @@ -1753,41 +1776,31 @@ internal void dmn_lnx_hanlde_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 rdebug_vaddr) { Temp scratch = scratch_begin(&arena, 1); - B32 is_unmap_complete_finished = 0; - - GNU_RDebugInfo64 rdebug = {0}; - if(!dmn_lnx_read_r_debug(process->fd, rdebug_vaddr, process->arch, &rdebug)) { goto exit; } - if(rdebug.r_version != 1) { goto exit; } // flag every module as inactive for(DMN_LNX_Entity *module = process->first; module != dmn_lnx_nil_entity; module = module->next) { - if(module->kind != DMN_LNX_EntityKind_Module) {continue;} + if(module->kind != DMN_LNX_EntityKind_Module) { continue; } module->is_live = 0; } - // loop over modules in the link map and mark live modules - GNU_LinkMap64 map = {0}; - for(U64 map_vaddr = rdebug.r_map; map_vaddr != 0; map_vaddr = map.next_vaddr) - { - if(dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) - { - DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); - if(module) - { - module->is_live = 1; - } - else { Assert(0 && "unknown module is being unloaded"); } + // mark live modules + B32 is_64bit = process->dl_class == ELF_Class_64; + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_gnu_mem_read, process); + for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { + GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_gnu_mem_read, process); + for EachNode(link_map_n, GNU_LinkMapNode, link_map_list.first) { + DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, link_map_n->v.addr_vaddr); + module->is_live = 1; } - else { Assert(0 && "unable to read Link Map"); } } // collect unloaded modules DMN_HandleList to_release = {0}; for(DMN_LNX_Entity *module = process->first; module != dmn_lnx_nil_entity; module = module->next) { - if(module->kind != DMN_LNX_EntityKind_Module) {continue;} - if(module->is_live) {continue;} + if(module->kind != DMN_LNX_EntityKind_Module) { continue; } + if(module->is_live) { continue; } dmn_handle_list_push(scratch.arena, &to_release, dmn_lnx_handle_from_entity(module)); } @@ -1807,9 +1820,6 @@ dmn_lnx_hanlde_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity dmn_lnx_entity_release(module); } - is_unmap_complete_finished = 1; -exit:; - Assert(is_unmap_complete_finished); scratch_end(scratch); } @@ -1845,7 +1855,7 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, HashTable *active GNU_RDebugInfo64 rdebug = {0}; if(!dmn_lnx_read_r_debug(process->fd, rdebug_addr, process->arch, &rdebug)) { goto init_complete_exit; } - if(rdebug.r_version != 1 && rdebug.r_version != 2) { goto init_complete_exit; } + if(rdebug.r_version < 1) { goto init_complete_exit; } dmn_lnx_handle_load_module(arena, events, process, name_space_id, rdebug.r_map); @@ -2006,6 +2016,66 @@ dmn_lnx_handle_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 sig } } +internal DMN_LNX_Entity * +dmn_lnx_handle_attach(Arena *arena, DMN_EventList *events, pid_t pid) +{ + Temp scratch = scratch_begin(&arena, 1); + + DMN_LNX_Entity *process = 0; + + String8 task_path = push_str8f(scratch.arena, "/proc/%d/task", pid); + DIR *task_dirp = opendir((char *)task_path.str); + if(task_dirp) + { + // create process + process = dmn_lnx_handle_create_process(arena, events, 1, 1, pid); + + // extract threads from /proc/pid/task + for(;;) + { + struct dirent *dirent = readdir(task_dirp); + if(dirent == 0) { break; } + + String8 tid_str = str8_cstring_capped(dirent->d_name, dirent->d_name + NAME_MAX); + if(str8_match(tid_str, str8_lit(".."), 0) || str8_match(tid_str, str8_lit("."), 0)) { continue; } + U64 tid_64 = u64_from_str8(tid_str, 10); + pid_t tid = (pid_t)tid_64; + AssertAlways(tid == tid_64); + + if(tid == pid) { continue; } // main thread was created during create process sequence + dmn_lnx_handle_create_thread(arena, events, process, tid); + } + + // extract modules from r_debug + B32 is_64bit = process->dl_class == ELF_Class_64; + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->rdebug_vaddr, dmn_lnx_gnu_mem_read, process); + U64 name_space_id = 0; + for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) + { + dmn_lnx_handle_load_module(arena, events, process, name_space_id, rdebug_n->v.r_map); + name_space_id += 1; + } + + OS_LNX_RETRY_ON_EINTR(closedir(task_dirp)); + } + + // + // handshake complete + // + { + DMN_LNX_Entity *main_thread = dmn_lnx_thread_from_pid(pid); + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_HandshakeComplete; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(main_thread); + e->arch = process->arch; + } + + scratch_end(scratch); + return process; +} + //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) @@ -2133,13 +2203,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) B32 failed_to_seize = 1; // try to seize child process - // - // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE) < 0)) { goto parent_exit; } - - // ensure tracer ops are issued on thread that sizes processes - if(dmn_lnx_state->tracer_tid == 0) { dmn_lnx_state->tracer_tid = gettid(); } - AssertAlways(dmn_lnx_state->tracer_tid == gettid()); + if(dmn_lnx_ptrace_seize(pid) < 0) { goto parent_exit; } // alloc pending process node DMN_LNX_ProcessLaunch *pending_proc = dmn_lnx_state->free_pids.first; @@ -2170,7 +2234,28 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) { - return 0; + B32 is_attached = 0; + + if(dmn_lnx_ptrace_seize(pid) >= 0) + { + if(OS_LNX_RETRY_ON_EINTR(kill(pid, SIGSTOP)) >= 0) + { + DMN_LNX_ProcessLaunch *pending_proc = dmn_lnx_state->free_pids.first; + if(pending_proc) { dmn_lnx_process_launch_list_remove(&dmn_lnx_state->free_pids, pending_proc); } + else { pending_proc = push_array(dmn_lnx_state->arena, DMN_LNX_ProcessLaunch, 1); } + + *pending_proc = (DMN_LNX_ProcessLaunch){ 1, pid, DMN_LNX_ProcessLaunchState_Attach }; + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_procs, pending_proc); + + is_attached = 1; + } + else + { + OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, pid, 0, 0)); + } + } + + return is_attached; } internal B32 @@ -2430,7 +2515,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); // push create process events - dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, wait_id); + dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, 0, wait_id); // override event code so the main code path does not create another process event_code = PTRACE_EVENT_STOP; @@ -2443,6 +2528,17 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) continue; } } + else if(pending_proc->state == DMN_LNX_ProcessLaunchState_Attach) + { + // move pending process node to the free list + dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); + dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); + + dmn_lnx_handle_attach(arena, &events, wait_id); + + // override event code + event_code = PTRACE_EVENT_STOP; + } else if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exit) { // move pending process node to the free list @@ -2565,7 +2661,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(process->debug_subprocesses) { dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); - dmn_lnx_handle_create_process(arena, &events, 1, wait_id); + dmn_lnx_handle_create_process(arena, &events, 1, 0, wait_id); } else { diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index e0f8329e..823b2397 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -215,7 +215,6 @@ struct DMN_LNX_Entity // thread void *reg_block; B32 expecting_dummy_sigstop; - B32 is_main_thread; B32 is_reg_block_dirty; B32 pass_through_signal; U64 pass_through_signo; @@ -253,6 +252,7 @@ enum { DMN_LNX_ProcessLaunchState_Null, DMN_LNX_ProcessLaunchState_Exec, + DMN_LNX_ProcessLaunchState_Attach, DMN_LNX_ProcessLaunchState_Exit, }; @@ -359,7 +359,7 @@ internal DMN_LNX_ProcessAuxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_clas //- ELF/GNU info from memory internal DMN_LNX_PhdrInfo dmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum); internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); -internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr); +internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased); internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); diff --git a/src/gnu/gnu_parse.c b/src/gnu/gnu_parse.c new file mode 100644 index 00000000..5ea387a9 --- /dev/null +++ b/src/gnu/gnu_parse.c @@ -0,0 +1,63 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal GNU_RDebugInfoList +gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud) +{ + GNU_RDebugInfoList result = {0}; + + for (U64 rdebug_vaddr = first_rdebug_vaddr, rdebug_next = 0; rdebug_vaddr != 0; rdebug_vaddr = rdebug_next) { + GNU_RDebugInfo64 rdebug; + if (is_64bit) { + U64 rdebug_read_size = mem_read_func(rdebug_vaddr, sizeof(rdebug), &rdebug, mem_read_ud); + if (rdebug_read_size != sizeof(rdebug)) { goto exit; } + } else { + GNU_RDebugInfo32 rdebug32; + U64 rdebug_read_size = mem_read_func(rdebug_vaddr, sizeof(rdebug32), &rdebug32, mem_read_ud); + if (rdebug_read_size != sizeof(rdebug32)) { goto exit; } + } + if (rdebug.r_version < 1) { goto exit; } + + if (rdebug.r_version > 1) { + U64 r_next_size = mem_read_func(rdebug_vaddr + sizeof(rdebug), sizeof(rdebug_next), &rdebug_next, mem_read_ud); + if (r_next_size != sizeof(rdebug_next)) { goto exit; } + } + + GNU_RDebugInfoNode *rdebug_n = push_array(arena, GNU_RDebugInfoNode, 1); + rdebug_n->v = rdebug; + SLLQueuePush(result.first, result.last, rdebug_n); + result.count += 1; + } + + exit:; + return result; +} + +internal GNU_LinkMapList +gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud) +{ + GNU_LinkMapList result = {0}; + + GNU_LinkMap64 link_map = {0}; + for (U64 link_map_vaddr = first_link_map_vaddr; link_map_vaddr != 0; link_map_vaddr = link_map.next_vaddr) { + if (is_64bit) { + U64 link_map_size = mem_read_func(link_map_vaddr, sizeof(link_map), &link_map, mem_read_ud); + if (link_map_size != sizeof(link_map)) { goto exit; } + } else { + GNU_LinkMap32 link_map32 = {0}; + U64 link_map_size = mem_read_func(link_map_vaddr, sizeof(link_map32), &link_map32, mem_read_ud); + if (link_map_size != sizeof(link_map32)) { goto exit; } + gnu_linkmap64_from_linkmap32(link_map32); + } + + GNU_LinkMapNode *n = push_array(arena, GNU_LinkMapNode, 1); + n->v = link_map; + SLLQueuePush(result.first, result.last, n); + result.count += 1; + } + + exit:; + return result; +} + + diff --git a/src/gnu/gnu_parse.h b/src/gnu/gnu_parse.h new file mode 100644 index 00000000..79f9a9ec --- /dev/null +++ b/src/gnu/gnu_parse.h @@ -0,0 +1,41 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef GNU_PARSE_H +#define GNU_PARSE_H + +typedef struct GNU_LinkMapNode +{ + GNU_LinkMap64 v; + struct GNU_LinkMapNode *next; +} GNU_LinkMapNode; + +typedef struct GNU_LinkMapList +{ + U64 count; + GNU_LinkMapNode *first; + GNU_LinkMapNode *last; +} GNU_LinkMapList; + +typedef struct GNU_RDebugInfoNode +{ + GNU_RDebugInfo64 v; + struct GNU_RDebugInfoNode *next; +} GNU_RDebugInfoNode; + +typedef struct GNU_RDebugInfoList +{ + U64 count; + GNU_RDebugInfoNode *first; + GNU_RDebugInfoNode *last; +} GNU_RDebugInfoList; + +#define GNU_MEM_READ(name) U64 name(U64 addr, U64 size, void *buffer, void *ud) +typedef GNU_MEM_READ(GNU_MemRead); + +//////////////////////////////// +internal GNU_RDebugInfoList gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud); +internal GNU_LinkMapList gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud); + +#endif + diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index dad95fca..3c781ac6 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -211,6 +211,7 @@ #include "pe/pe.h" #include "elf/elf.h" #include "gnu/gnu.h" +#include "gnu/gnu_parse.h" #include "elf/elf_parse.h" #include "elf/elf_dump.h" #include "codeview/codeview.h" @@ -262,6 +263,7 @@ #include "pe/pe.c" #include "elf/elf.c" #include "gnu/gnu.c" +#include "gnu/gnu_parse.c" #include "elf/elf_parse.c" #include "elf/elf_dump.c" #include "codeview/codeview.c" From 962f0e30aebf0eceaaec791779b0ab3294a71fe0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 9 Dec 2025 09:56:43 -0800 Subject: [PATCH 095/850] WIP fork --- src/ctrl/ctrl_core.c | 29 +-- src/demon/demon_core.c | 34 ++++ src/demon/demon_core.h | 21 +- src/demon/linux/demon_core_linux.c | 301 +++++++++++++++++++---------- src/demon/linux/demon_core_linux.h | 10 +- 5 files changed, 271 insertions(+), 124 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 3bdb51c1..883e6358 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1323,7 +1323,7 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis } } thread->stack_base = event->stack_base; - ctrl_rip_from_thread(&store->ctx, event->entity); + //ctrl_rip_from_thread(&store->ctx, event->entity); }break; case CTRL_EventKind_EndThread: { @@ -4450,6 +4450,20 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, { dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); } + + // copy spoof info + if(do_spoof) + { + run_ctrls->spoof.process = spoof->process; + run_ctrls->spoof.thread = spoof->thread; + run_ctrls->spoof.vaddr = spoof->vaddr; + run_ctrls->spoof.old_ip = spoof_old_ip_value; + run_ctrls->spoof.size = size_of_spoof; + } + else + { + MemoryZeroStruct(&run_ctrls->spoof); + } // rjf: run for new events ProfScope("run for new events") @@ -4474,6 +4488,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, } } } + DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls); ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); @@ -5956,17 +5971,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); Arch arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); - CTRL_Entity *module = &ctrl_entity_nil; - { - for(CTRL_Entity *m = process->first; m != &ctrl_entity_nil; m = m->next) - { - if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, thread_rip_vaddr)) - { - module = m; - break; - } - } - } + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); ////////////////////////// //- rjf: extract module-dependent info diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 401480a7..41ad8cfe 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -218,3 +218,37 @@ dmn_get_trap_inst(void) return str8_array_fixed(inst); } +internal DMN_ActiveTrap * +dmn_set_trap(Arena *arena, DMN_Trap *trap) +{ + DMN_ActiveTrap *result = 0; + String8 trap_inst = dmn_get_trap_inst(); + U8 *swap_bytes = push_array(arena, U8, trap_inst.size); + if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), swap_bytes) == trap_inst.size) + { + if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), trap_inst.str) == trap_inst.size) + { + result = push_array(arena, DMN_ActiveTrap, 1); + result->trap = trap; + result->swap_bytes = str8(swap_bytes, trap_inst.size); + } + else + { + Assert(0 && "failed to write trap instruction"); + } + } + else + { + Assert(0 && "failed to read original byte"); + } + return result; +} + +internal B32 +dmn_remove_trap(DMN_ActiveTrap *active_trap) +{ + B32 is_removed = dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str); + Assert(is_removed); + return is_removed; +} + diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 5dec068e..8043b98e 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -155,8 +155,8 @@ struct DMN_TrapChunkList typedef struct DMN_ActiveTrap DMN_ActiveTrap; struct DMN_ActiveTrap { - DMN_Trap *trap; - String8 swap_bytes; + DMN_Trap *trap; + String8 swap_bytes; DMN_ActiveTrap *next; }; @@ -165,12 +165,20 @@ struct DMN_RunCtrls { DMN_Handle priority_thread; DMN_Handle single_step_thread; - B8 ignore_previous_exception; - B8 run_entities_are_unfrozen; - B8 run_entities_are_processes; DMN_Handle *run_entities; U64 run_entity_count; DMN_TrapChunkList traps; + B8 ignore_previous_exception; + B8 run_entities_are_unfrozen; + B8 run_entities_are_processes; + struct + { + DMN_Handle process; + DMN_Handle thread; + U64 vaddr; + U64 old_ip; + U64 size; + } spoof; }; //////////////////////////////// @@ -279,4 +287,7 @@ internal void dmn_process_iter_end(DMN_ProcessIter *iter); //- arch trap internal String8 dmn_get_trap_inst(void); +internal DMN_ActiveTrap * dmn_set_trap(Arena *arena, DMN_Trap *trap); +internal B32 dmn_remove_trap(DMN_ActiveTrap *active_trap); + #endif // DEMON_CORE_H diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index fe9b0f25..853da8ac 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -125,7 +125,7 @@ dmn_lnx_ptrace_seize(pid_t pid) AssertAlways(dmn_lnx_state->tracer_tid == gettid()); // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE - return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE)); + return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACEFORK | PTRACE_O_TRACECLONE)); } //////////////////////////////// @@ -925,6 +925,39 @@ dmn_lnx_process_from_pid(pid_t pid) return process; } +internal void +dmn_lnx_process_trap_probes(DMN_LNX_Entity *process) +{ + Assert(process->kind == DMN_LNX_EntityKind_Process); + for EachIndex(i, DMN_LNX_ProbeType_Count) + { + if(process->probes[i] == 0) { continue; } + + DMN_Trap *trap = push_array(process->arena, DMN_Trap, 1); + trap->process = dmn_lnx_handle_from_entity(process); + trap->vaddr = process->probes[i]->pc; + trap->id = i; + + DMN_ActiveTrap *active_trap = dmn_set_trap(process->arena, trap); + SLLQueuePush(process->first_probe_trap, process->last_probe_trap, active_trap); + + if(BUILD_DEBUG && process->arch == Arch_x64) + { + Assert(active_trap->swap_bytes.size == 1 && active_trap->swap_bytes.str[0] == 0x90); + } + } +} + +internal void +dmn_lnx_process_untrap_probes(DMN_LNX_Entity *process) +{ + Assert(process->kind == DMN_LNX_EntityKind_Process); + for EachNode(active_trap, DMN_ActiveTrap, process->first_probe_trap) + { + dmn_remove_trap(active_trap); + } +} + internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread) { @@ -1419,6 +1452,8 @@ dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on) return is_flag_set; } +//////////////////////////////// + internal void dmn_lnx_handle_not_attached(Arena *arena, DMN_EventList *events) { @@ -1427,8 +1462,6 @@ dmn_lnx_handle_not_attached(Arena *arena, DMN_EventList *events) e->error_kind = DMN_ErrorKind_NotAttached; } -//////////////////////////////// - internal DMN_LNX_Entity * dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, pid_t tid) { @@ -1537,24 +1570,6 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub } } - // - // install DL probes - // - U64 probe_vaddrs[DMN_LNX_ProbeType_Count] = {0}; - for EachIndex(i, DMN_LNX_ProbeType_Count) - { - if(known_probes[i] == 0) { continue; } - - U8 og_byte = 0; - if(!dmn_lnx_read_struct(memory_fd, known_probes[i]->pc, &og_byte)) { Assert(0 && "failed to read original byte"); } - Assert(og_byte == 0x90); - - U8 trap = 0xcc; - if(!dmn_lnx_write_struct(memory_fd, known_probes[i]->pc, &trap)) { Assert(0 && "failed to install probe"); } - - probe_vaddrs[i] = known_probes[i]->pc; - } - // // init process // @@ -1574,17 +1589,15 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub process->xcr0 = xcr0; process->xsave_size = Max(xsave_size, sizeof(X64_XSave)); process->xsave_layout = xsave_layout; - MemoryCopyTyped(&process->probe_vaddrs[0], &probe_vaddrs[0], DMN_LNX_ProbeType_Count); hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); + // push create process event - { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_lnx_handle_from_entity(process); - e->arch = process->arch; - e->code = pid; - e->tls_model = DMN_TlsModel_Gnu; // TODO: use dynamic linker path to figure out correct enum here - } + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_lnx_handle_from_entity(process); + e->arch = process->arch; + e->code = pid; + e->tls_model = DMN_TlsModel_Gnu; // TODO: use dynamic linker path to figure out correct enum here // // init main thread @@ -1596,8 +1609,10 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub // { DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); - module->id = auxv.execfn; - module->base_vaddr = base_vaddr; + module->id = auxv.execfn; + module->base_vaddr = base_vaddr; + module->module_name_vaddr = auxv.execfn; + module->is_main = 1; hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, 0, module); hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, base_vaddr, module); @@ -1707,6 +1722,60 @@ dmn_lnx_handle_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 e } } +internal DMN_LNX_Entity * +dmn_lnx_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 module_name_vaddr, U64 base_vaddr) +{ + DMN_LNX_Entity *module = 0; + + // parse out module's ELF header + ELF_Hdr64 module_ehdr = {0}; + if(!dmn_lnx_read_ehdr(process->fd, base_vaddr, &module_ehdr)) { goto exit; } + + // gather info about module + U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; + U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; + DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); + String8 module_name = dmn_lnx_read_string(process->arena, process->fd, module_name_vaddr); + + // read TLS index and TLS offset + U64 tls_index = max_U64; + U64 tls_offset = max_U64; + if(dmn_lnx_state->is_tls_detected) + { + Rng1U64 tls_modid_range = r1u64(dmn_lnx_state->tls_modid_desc.offset, dmn_lnx_state->tls_modid_desc.offset + dmn_lnx_state->tls_modid_desc.bit_size / 8); + Rng1U64 tls_offset_range = r1u64(dmn_lnx_state->tls_offset_desc.offset, dmn_lnx_state->tls_offset_desc.offset + dmn_lnx_state->tls_offset_desc.bit_size / 8); + tls_modid_range = shift_1u64(tls_modid_range, base_vaddr); + tls_offset_range = shift_1u64(tls_offset_range, base_vaddr); + if(!dmn_lnx_read(process->fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } + if(!dmn_lnx_read(process->fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } + } + + // fill out module + module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); + module->id = module_name_vaddr; + module->base_vaddr = base_vaddr; + module->module_name_vaddr = module_name_vaddr; + + if(str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) { goto exit; } + + // push load event + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->module = dmn_lnx_handle_from_entity(module); + e->arch = arch_from_elf_machine(module_ehdr.e_machine); + e->address = base_vaddr; + e->size = dim_1u64(module_phdr_info.range); + e->string = module_name; + e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); + e->elf_phdr_entsize = module_ehdr.e_phentsize; + e->tls_index = tls_index; + e->tls_offset = tls_offset; + + exit:; + return module; +} + internal void dmn_lnx_handle_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 new_link_map_vaddr) { @@ -1714,62 +1783,19 @@ dmn_lnx_handle_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity * for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) { // read out new link map item - if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { goto exit; } + if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { break; } // was module with this base already registered? DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); - if(module) { continue; } - - // parse out module's ELF header - ELF_Hdr64 module_ehdr = {0}; - if(!dmn_lnx_read_ehdr(process->fd, map.addr_vaddr, &module_ehdr)) { goto exit; } - - // gather info about module - U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? map.addr_vaddr : 0; - U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; - DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); - String8 module_name = dmn_lnx_read_string(process->arena, process->fd, map.name_vaddr); - - // read TLS index and TLS offset - U64 tls_index = max_U64; - U64 tls_offset = max_U64; - if(dmn_lnx_state->is_tls_detected) + if(module == 0) { - Rng1U64 tls_modid_range = r1u64(dmn_lnx_state->tls_modid_desc.offset, dmn_lnx_state->tls_modid_desc.offset + dmn_lnx_state->tls_modid_desc.bit_size / 8); - Rng1U64 tls_offset_range = r1u64(dmn_lnx_state->tls_offset_desc.offset, dmn_lnx_state->tls_offset_desc.offset + dmn_lnx_state->tls_offset_desc.bit_size / 8); - tls_modid_range = shift_1u64(tls_modid_range, map_vaddr); - tls_offset_range = shift_1u64(tls_offset_range, map_vaddr); - if(!dmn_lnx_read(process->fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } - if(!dmn_lnx_read(process->fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } + // load module + module = dmn_lnx_load_module(arena, events, process, name_space_id, map.name_vaddr, map.addr_vaddr); + + // create mapping for base -> module + hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module); } - - // fill out module - module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); - module->id = map.name_vaddr; - module->base_vaddr = map.addr_vaddr; - - if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) - { - // push load event - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->module = dmn_lnx_handle_from_entity(module); - e->arch = arch_from_elf_machine(module_ehdr.e_machine); - e->address = map.addr_vaddr; - e->size = dim_1u64(module_phdr_info.range); - e->string = module_name; - e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); - e->elf_phdr_entsize = module_ehdr.e_phentsize; - e->tls_index = tls_index; - e->tls_offset = tls_offset; - } - - // create mapping for base -> module - hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module); } - - exit:; } internal void @@ -1835,11 +1861,19 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, HashTable *active // is this a probe trap? DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; - for EachIndex(i, ArrayCount(process->probe_vaddrs)) + for EachNode(active_trap, DMN_ActiveTrap, process->first_probe_trap) { - if(process->probe_vaddrs[i] == ip-1) + if(active_trap->trap->vaddr == ip-1) + { + probe_type = active_trap->trap->id; + break; + } + } + + for(U64 i = 0; i < DMN_LNX_ProbeType_Count; ++i) + { + if(process->probes[i] != 0 && process->probes[i]->pc == ip-1) { - probe_type = i; break; } } @@ -2029,6 +2063,7 @@ dmn_lnx_handle_attach(Arena *arena, DMN_EventList *events, pid_t pid) { // create process process = dmn_lnx_handle_create_process(arena, events, 1, 1, pid); + dmn_lnx_process_trap_probes(process); // extract threads from /proc/pid/task for(;;) @@ -2313,26 +2348,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) DMN_LNX_Entity *process = dmn_lnx_entity_from_handle(trap->process); if(process == dmn_lnx_nil_entity) { continue; } - // read original instruction bytes - String8 trap_inst = dmn_get_trap_inst(); - U8 *swap_bytes = push_array(scratch.arena, U8, trap_inst.size); - if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+trap_inst.size), swap_bytes) != trap_inst.size) - { - Assert(0 && "failed to read original byte"); - continue; - } - - // replace with trap instruction bytes - if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+trap_inst.size), trap_inst.str) != trap_inst.size) - { - Assert(0 && "failed to write trap"); - continue; - } + // trap instruction + DMN_ActiveTrap *active_trap = dmn_set_trap(scratch.arena, trap); // add trap to the active list - DMN_ActiveTrap *active_trap = push_array(scratch.arena, DMN_ActiveTrap, 1); - active_trap->trap = trap; - active_trap->swap_bytes = str8(swap_bytes, trap_inst.size); SLLQueuePush(active_trap_first, active_trap_last, active_trap); // add (address -> trap) @@ -2464,6 +2483,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // wait for signals from the running threads { + printf("----------------------------------------------\n"); B32 is_halt_done = 0; for(U64 stopped_threads = 0;;) { @@ -2495,6 +2515,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) int wstopsig = WSTOPSIG(status); int event_code = (status >> 16); + printf("wstopsig %d, event_code %d\n", wstopsig, event_code); + // intercept signals meant for the process launch sequence { // pid -> pending process launch @@ -2515,7 +2537,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); // push create process events - dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, 0, wait_id); + DMN_LNX_Entity *process = dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, 0, wait_id); + dmn_lnx_process_trap_probes(process); // override event code so the main code path does not create another process event_code = PTRACE_EVENT_STOP; @@ -2637,7 +2660,72 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case PTRACE_EVENT_FORK: { - NotImplemented; + // grab child pid + pid_t child_pid; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &child_pid)) < 0) + { + AssertAlways(0 && "failed to grab child pid"); + } + + // at this point kernel cloned memory pages and writes in the child process trigger COW + Temp temp = temp_begin(scratch.arena); + int child_memory_fd = open((char*)str8f(temp.arena, "/proc/%d/mem", child_pid).str, O_RDWR); + + // grab parent process + DMN_LNX_Entity *parent_thread = dmn_lnx_thread_from_pid(wait_id); + DMN_LNX_Entity *parent_process = parent_thread->parent; + DMN_Handle parent_process_handle = dmn_lnx_handle_from_entity(parent_process); + DMN_Handle parent_thread_handle = dmn_lnx_handle_from_entity(parent_thread); + + // if debugger is steps over a line with fork we have to undo the return address spoof + if(MemoryCompare(&parent_process_handle, &ctrls->spoof.process, sizeof(DMN_Handle)) == 0 && + MemoryCompare(&parent_thread_handle, &ctrls->spoof.thread, sizeof(DMN_Handle)) == 0) + { + if(!dmn_lnx_write(child_memory_fd, r1u64(ctrls->spoof.vaddr, ctrls->spoof.vaddr + ctrls->spoof.size), &ctrls->spoof.old_ip)) + { + AssertAlways(0 && "failed to undo spoof"); + } + } + + if(parent_process->debug_subprocesses) + { + // create child process entity + dmn_lnx_process_untrap_probes(parent_process); + DMN_LNX_Entity *child_process = dmn_lnx_handle_create_process(arena, &events, 1, 1, child_pid); + dmn_lnx_process_trap_probes(child_process); + + // copy modules from the parent process + for(DMN_LNX_Entity *module = parent_process->first; module != dmn_lnx_nil_entity; module = module->next) + { + if(module->kind != DMN_LNX_EntityKind_Module) { continue; } + if(module->is_main) { continue; } + dmn_lnx_load_module(arena, &events, child_process, module->name_space_id, module->module_name_vaddr, module->base_vaddr); + } + } + else + { + // take out probes traps from the child probess + dmn_lnx_process_untrap_probes(parent_process); + + // take out traps from the child process + for EachNode(n, DMN_ActiveTrap, active_trap_first) + { + if(MemoryCompare(&n->trap->process, &parent_process_handle, sizeof(DMN_Handle))) + { + B32 is_written = dmn_lnx_write(child_memory_fd, r1u64(n->trap->vaddr, n->trap->vaddr + n->swap_bytes.size), n->swap_bytes.str); + AssertAlways(is_written); + } + } + + // detach and continue the child process + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, child_pid, 0, 0) < 0)) + { + Assert(0 && "unsuccessful detach"); + } + } + + close(child_memory_fd); + temp_end(temp); }break; case PTRACE_EVENT_VFORK: { @@ -2661,7 +2749,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(process->debug_subprocesses) { dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); - dmn_lnx_handle_create_process(arena, &events, 1, 0, wait_id); + DMN_LNX_Entity *process = dmn_lnx_handle_create_process(arena, &events, 1, 0, wait_id); + dmn_lnx_process_trap_probes(process); } else { diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 823b2397..f168d420 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -203,7 +203,8 @@ struct DMN_LNX_Entity ELF_Class dl_class; HashTable *loaded_modules_ht; DMN_LNX_Probe **probes; - U64 probe_vaddrs[DMN_LNX_ProbeType_Count]; + DMN_ActiveTrap *first_probe_trap; + DMN_ActiveTrap *last_probe_trap; U64 main_thread_exit_code; U64 thread_count; @@ -222,11 +223,14 @@ struct DMN_LNX_Entity U64 thread_local_base; // module + U64 module_name_vaddr; U64 base_vaddr; U64 phvaddr; U64 phentsize; U64 phcount; + U64 name_space_id; B8 is_live; + B8 is_main; }; typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode; @@ -372,6 +376,10 @@ internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); internal DMN_LNX_Entity *dmn_lnx_entity_from_handle(DMN_Handle handle); internal DMN_LNX_Entity *dmn_lnx_thread_from_pid(pid_t pid); +//- Process +internal void dmn_lnx_process_install_probes(); + +//- Thread internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread); internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread); internal void dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip); From 094370c028db4fe461c81ae24271b19c0b2bae2e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 9 Dec 2025 14:02:06 -0800 Subject: [PATCH 096/850] bugfix last string query --- src/lib_rdi/rdi_parse.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib_rdi/rdi_parse.c b/src/lib_rdi/rdi_parse.c index b0ea1ff4..224ad7c8 100644 --- a/src/lib_rdi/rdi_parse.c +++ b/src/lib_rdi/rdi_parse.c @@ -342,12 +342,12 @@ rdi_string_from_idx(RDI_Parsed *rdi, RDI_U32 idx, RDI_U64 *len_out) { RDI_U64 string_offs_count = 0; RDI_U32 *string_offs = rdi_table_from_name(rdi, StringTable, &string_offs_count); - if(idx < string_offs_count) + if(idx < string_offs_count && string_offs_count > 1) { RDI_U64 string_data_size = 0; RDI_U8 *string_data = rdi_table_from_name(rdi, StringData, &string_data_size); RDI_U32 off_raw = string_offs[idx]; - RDI_U32 opl_raw = string_offs[idx + 1]; + RDI_U32 opl_raw = idx + 1 < string_offs_count ? string_offs[idx + 1] : string_data_size; RDI_U32 opl = rdi_parse__min(opl_raw, string_data_size); RDI_U32 off = rdi_parse__min(off_raw, opl); result_base = string_data + off; From 5b6ffd5a498db67a3465d3ba8523f173b6e827ff Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 9 Dec 2025 16:08:19 -0800 Subject: [PATCH 097/850] clean up instrumentation inherited during fork --- src/demon/linux/demon_core_linux.c | 203 ++++++++++++++--------------- 1 file changed, 99 insertions(+), 104 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 853da8ac..9488dda6 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -628,6 +628,7 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) String8List parts = {0}; for EachIndex(cursor, line.size) { + if(parts.node_count > 5) { break; } if(line.str[cursor] == ' ') { continue; } // scan forward to the closing delimiter @@ -647,7 +648,7 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) } // was line parsed correctly? - if(parts.node_count > 6 || parts.node_count < 5) { Assert(0 && "failed to parse map line"); continue; } + if(parts.node_count < 5) { Assert(0 && "failed to parse map line"); continue; } // parse map virtual range String8List vaddr_list = str8_split_by_string_chars(scratch.arena, parts.first->string, str8_lit("-"), 0); @@ -925,39 +926,6 @@ dmn_lnx_process_from_pid(pid_t pid) return process; } -internal void -dmn_lnx_process_trap_probes(DMN_LNX_Entity *process) -{ - Assert(process->kind == DMN_LNX_EntityKind_Process); - for EachIndex(i, DMN_LNX_ProbeType_Count) - { - if(process->probes[i] == 0) { continue; } - - DMN_Trap *trap = push_array(process->arena, DMN_Trap, 1); - trap->process = dmn_lnx_handle_from_entity(process); - trap->vaddr = process->probes[i]->pc; - trap->id = i; - - DMN_ActiveTrap *active_trap = dmn_set_trap(process->arena, trap); - SLLQueuePush(process->first_probe_trap, process->last_probe_trap, active_trap); - - if(BUILD_DEBUG && process->arch == Arch_x64) - { - Assert(active_trap->swap_bytes.size == 1 && active_trap->swap_bytes.str[0] == 0x90); - } - } -} - -internal void -dmn_lnx_process_untrap_probes(DMN_LNX_Entity *process) -{ - Assert(process->kind == DMN_LNX_EntityKind_Process); - for EachNode(active_trap, DMN_ActiveTrap, process->first_probe_trap) - { - dmn_remove_trap(active_trap); - } -} - internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread) { @@ -1591,6 +1559,25 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub process->xsave_layout = xsave_layout; hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); + // trap probes + for EachIndex(i, DMN_LNX_ProbeType_Count) + { + if(known_probes[i] == 0) { continue; } + + DMN_Trap *trap = push_array(process_arena, DMN_Trap, 1); + trap->process = dmn_lnx_handle_from_entity(process); + trap->vaddr = known_probes[i]->pc; + trap->id = i; + + DMN_ActiveTrap *active_trap = dmn_set_trap(process_arena, trap); + SLLQueuePush(process->first_probe_trap, process->last_probe_trap, active_trap); + + if(BUILD_DEBUG && arch == Arch_x64) + { + Assert(active_trap->swap_bytes.size == 1 && active_trap->swap_bytes.str[0] == 0x90); + } + } + // push create process event DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_CreateProcess; @@ -1850,31 +1837,40 @@ dmn_lnx_hanlde_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity } internal void -dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, HashTable *active_trap_ht, pid_t tid) +dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid) { DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); DMN_LNX_Entity *process = thread->parent; U64 ip = dmn_lnx_thread_read_ip(thread); // is this user trap? - DMN_Trap *hit_user_trap = hash_table_search_u64_raw(active_trap_ht, ip-1); - - // is this a probe trap? - DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; - for EachNode(active_trap, DMN_ActiveTrap, process->first_probe_trap) + DMN_ActiveTrap *hit_user_trap = 0; { - if(active_trap->trap->vaddr == ip-1) + DMN_Handle process_handle = dmn_lnx_handle_from_entity(process); + for EachNode(active_trap, DMN_ActiveTrap, user_traps) { - probe_type = active_trap->trap->id; - break; + if(MemoryCompare(&active_trap->trap->process, &process_handle, sizeof(DMN_Handle)) == 0) + { + if(active_trap->trap->vaddr == ip-1) + { + hit_user_trap = active_trap; + break; + } + } } } - for(U64 i = 0; i < DMN_LNX_ProbeType_Count; ++i) + // is this a probe trap? + DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; + if(hit_user_trap == 0) { - if(process->probes[i] != 0 && process->probes[i]->pc == ip-1) + for EachNode(active_trap, DMN_ActiveTrap, process->first_probe_trap) { - break; + if(active_trap->trap->vaddr == ip-1) + { + probe_type = active_trap->trap->id; + break; + } } } @@ -2063,7 +2059,6 @@ dmn_lnx_handle_attach(Arena *arena, DMN_EventList *events, pid_t pid) { // create process process = dmn_lnx_handle_create_process(arena, events, 1, 1, pid); - dmn_lnx_process_trap_probes(process); // extract threads from /proc/pid/task for(;;) @@ -2330,8 +2325,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // write traps to memory DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; - HashTable *active_trap_ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); { + HashTable *process_ht = hash_table_init(scratch.arena, dmn_lnx_state->active_process_count); for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) { for EachIndex(n_idx, n->count) @@ -2340,6 +2335,13 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) DMN_Trap *trap = n->v+n_idx; if(trap->flags) { continue; } + HashTable *active_trap_ht = hash_table_search_u64_raw(process_ht, trap->process.u64[0]); + if(active_trap_ht == 0) + { + active_trap_ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); + hash_table_push_u64_raw(scratch.arena, process_ht, trap->process.u64[0], active_trap_ht); + } + // TODO: ctrl sends down duplicate traps DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); if(is_set) { continue; } @@ -2483,7 +2485,6 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // wait for signals from the running threads { - printf("----------------------------------------------\n"); B32 is_halt_done = 0; for(U64 stopped_threads = 0;;) { @@ -2515,8 +2516,6 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) int wstopsig = WSTOPSIG(status); int event_code = (status >> 16); - printf("wstopsig %d, event_code %d\n", wstopsig, event_code); - // intercept signals meant for the process launch sequence { // pid -> pending process launch @@ -2538,7 +2537,6 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // push create process events DMN_LNX_Entity *process = dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, 0, wait_id); - dmn_lnx_process_trap_probes(process); // override event code so the main code path does not create another process event_code = PTRACE_EVENT_STOP; @@ -2648,10 +2646,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { switch(siginfo.si_code) { - case SI_KERNEL: { dmn_lnx_handle_breakpoint(arena, &events, active_trap_ht, wait_id); } break; - case TRAP_BRKPT: { dmn_lnx_handle_breakpoint(arena, &events, active_trap_ht, wait_id); } break; - case TRAP_TRACE: { dmn_lnx_handle_single_step(arena, &events, wait_id); } break; - case TRAP_HWBKPT: { dmn_lnx_handle_data_breakpoint(arena, &events, wait_id); } break; + case SI_KERNEL: { dmn_lnx_handle_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_BRKPT: { dmn_lnx_handle_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_TRACE: { dmn_lnx_handle_single_step(arena, &events, wait_id); } break; + case TRAP_HWBKPT: { dmn_lnx_handle_data_breakpoint(arena, &events, wait_id); } break; case TRAP_BRANCH: { NotImplemented; }break; case TRAP_UNK: { NotImplemented; }break; default: { InvalidPath; } break; @@ -2662,70 +2660,68 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { // grab child pid pid_t child_pid; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &child_pid)) < 0) - { - AssertAlways(0 && "failed to grab child pid"); - } - - // at this point kernel cloned memory pages and writes in the child process trigger COW - Temp temp = temp_begin(scratch.arena); - int child_memory_fd = open((char*)str8f(temp.arena, "/proc/%d/mem", child_pid).str, O_RDWR); + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &child_pid)) < 0) { AssertAlways(0 && "failed to grab child pid"); } // grab parent process DMN_LNX_Entity *parent_thread = dmn_lnx_thread_from_pid(wait_id); DMN_LNX_Entity *parent_process = parent_thread->parent; - DMN_Handle parent_process_handle = dmn_lnx_handle_from_entity(parent_process); - DMN_Handle parent_thread_handle = dmn_lnx_handle_from_entity(parent_thread); - // if debugger is steps over a line with fork we have to undo the return address spoof - if(MemoryCompare(&parent_process_handle, &ctrls->spoof.process, sizeof(DMN_Handle)) == 0 && - MemoryCompare(&parent_thread_handle, &ctrls->spoof.thread, sizeof(DMN_Handle)) == 0) + // clean up in the child process instrumentation inherited during fork { - if(!dmn_lnx_write(child_memory_fd, r1u64(ctrls->spoof.vaddr, ctrls->spoof.vaddr + ctrls->spoof.size), &ctrls->spoof.old_ip)) - { - AssertAlways(0 && "failed to undo spoof"); - } - } - - if(parent_process->debug_subprocesses) - { - // create child process entity - dmn_lnx_process_untrap_probes(parent_process); - DMN_LNX_Entity *child_process = dmn_lnx_handle_create_process(arena, &events, 1, 1, child_pid); - dmn_lnx_process_trap_probes(child_process); - - // copy modules from the parent process - for(DMN_LNX_Entity *module = parent_process->first; module != dmn_lnx_nil_entity; module = module->next) - { - if(module->kind != DMN_LNX_EntityKind_Module) { continue; } - if(module->is_main) { continue; } - dmn_lnx_load_module(arena, &events, child_process, module->name_space_id, module->module_name_vaddr, module->base_vaddr); - } - } - else - { - // take out probes traps from the child probess - dmn_lnx_process_untrap_probes(parent_process); + DMN_Handle parent_process_handle = dmn_lnx_handle_from_entity(parent_process); + DMN_Handle parent_thread_handle = dmn_lnx_handle_from_entity(parent_thread); - // take out traps from the child process + // at this point kernel cloned memory pages and writes in the child process trigger COW + Temp temp = temp_begin(scratch.arena); + int child_memory_fd = open((char*)str8f(temp.arena, "/proc/%d/mem", child_pid).str, O_RDWR); + + // if debugger is stepping over a line with fork we have to undo the return address spoof + if(MemoryCompare(&parent_process_handle, &ctrls->spoof.process, sizeof(DMN_Handle)) == 0 && + MemoryCompare(&parent_thread_handle, &ctrls->spoof.thread, sizeof(DMN_Handle)) == 0) + { + B32 was_spoof_removed = dmn_lnx_write(child_memory_fd, r1u64(ctrls->spoof.vaddr, ctrls->spoof.vaddr + ctrls->spoof.size), &ctrls->spoof.old_ip); + AssertAlways(was_spoof_removed); + } + + // remove probe traps from the child process + for EachNode(n, DMN_ActiveTrap, parent_process->first_probe_trap) + { + B32 is_written = dmn_lnx_write(child_memory_fd, r1u64(n->trap->vaddr, n->trap->vaddr + n->swap_bytes.size), n->swap_bytes.str); + AssertAlways(is_written); + } + + // remove traps from the child process for EachNode(n, DMN_ActiveTrap, active_trap_first) { - if(MemoryCompare(&n->trap->process, &parent_process_handle, sizeof(DMN_Handle))) + if(MemoryCompare(&n->trap->process, &parent_process_handle, sizeof(DMN_Handle)) == 0) { B32 is_written = dmn_lnx_write(child_memory_fd, r1u64(n->trap->vaddr, n->trap->vaddr + n->swap_bytes.size), n->swap_bytes.str); AssertAlways(is_written); } } - // detach and continue the child process - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, child_pid, 0, 0) < 0)) - { - Assert(0 && "unsuccessful detach"); - } + close(child_memory_fd); + temp_end(temp); } - close(child_memory_fd); - temp_end(temp); + if(parent_process->debug_subprocesses) + { + // create child process + DMN_LNX_Entity *child_process = dmn_lnx_handle_create_process(arena, &events, 1, 1, child_pid); + + // copy modules from the parent process + for(DMN_LNX_Entity *mod = parent_process->first; mod != dmn_lnx_nil_entity; mod = mod->next) + { + if(mod->kind != DMN_LNX_EntityKind_Module) { continue; } + if(mod->is_main) { continue; } + dmn_lnx_load_module(arena, &events, child_process, mod->name_space_id, mod->module_name_vaddr, mod->base_vaddr); + } + } + else + { + // user asked to detach from the child process + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, child_pid, 0, 0) < 0)) { Assert(0 && "unsuccessful detach"); } + } }break; case PTRACE_EVENT_VFORK: { @@ -2750,7 +2746,6 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); DMN_LNX_Entity *process = dmn_lnx_handle_create_process(arena, &events, 1, 0, wait_id); - dmn_lnx_process_trap_probes(process); } else { From 7947d4dc553ef99f4228f5cafab8e5f5024b6c46 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 11 Dec 2025 16:42:55 -0800 Subject: [PATCH 098/850] outline DWARF expression evaluator --- src/dwarf/dwarf.h | 17 + src/dwarf/dwarf_expr.c | 2773 +++++++++++++++++++------------------- src/dwarf/dwarf_expr.h | 409 ++---- src/dwarf/dwarf_inc.c | 2 +- src/dwarf/dwarf_inc.h | 2 +- src/dwarf/dwarf_unwind.h | 15 - 6 files changed, 1537 insertions(+), 1681 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 154055d5..44c7fc08 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1682,6 +1682,23 @@ typedef enum DW_RegX64Enum //////////////////////////////// +typedef enum { + DW_UnwindStatus_Ok, + DW_UnwindStatus_Fail, + DW_UnwindStatus_Maybe +} DW_UnwindStatus; + +#define DW_REG_READ(name) DW_UnwindStatus name(DW_Reg reg_id, void *buffer, U64 buffer_max, void *ud) +typedef DW_REG_READ(DW_RegRead); + +#define DW_REG_WRITE(name) DW_UnwindStatus name(DW_Reg reg_id, void *value, U64 value_size, void *ud) +typedef DW_REG_WRITE(DW_RegWrite); + +#define DW_MEM_READ(name) DW_UnwindStatus name(U64 addr, U64 size, void *buffer, void *ud) +typedef DW_MEM_READ(DW_MemRead); + +//////////////////////////////// + internal U64 dw_reg_size_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_pos_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code); diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 63e1ea29..fc7275ef 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1,1442 +1,1419 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//- analyzers - -#if 0 -internal DW_SimpleLoc -dw_expr__analyze_fast(void *base, Rng1U64 range, U64 text_section_base) +internal DW_PieceNode * +dw_piece_list_push(Arena *arena, DW_PieceList *list, DW_Piece v) { - DW_SimpleLoc result = {DW_SimpleLocKind_Empty}; - - String8 expr_data = str8((U8*)data+range.min, (U8*)data+range.max); - - U8 op = 0; - if (str8_deserial_read_struct(expr_data, 0, &op)) { - // step params - U64 size_param = 0; - B32 is_signed = 0; - - // step - U64 step_cursor = 1; - switch (op) { - - //// literal encodings //// - - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: - { - U64 x = op - DW_ExprOp_Lit0; - result.kind = DW_SimpleLocKind_Address; - result.addr = x; - } break; - - case DW_ExprOp_Const1U:size_param = 1; goto const_n; - case DW_ExprOp_Const2U:size_param = 2; goto const_n; - case DW_ExprOp_Const4U:size_param = 4; goto const_n; - case DW_ExprOp_Const8U:size_param = 8; goto const_n; - case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n; - case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n; - case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n; - case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n; - const_n: - { - U64 x = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, size_param, &x); - - if (is_signed) { - x = extend_sign64(x, size_param); - } - - result.kind = DW_SimpleLocKind_Address; - result.addr = x; - } break; - - case DW_ExprOp_Addr: - { - U64 offset = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, 8, &offset); - U64 x = text_section_base + offset; - result.kind = DW_SimpleLocKind_Address; - result.addr = x; - } break; - - case DW_ExprOp_ConstU: - { - U64 x = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &x); - result.kind = DW_SimpleLocKind_Address; - result.addr = x; - } break; - - case DW_ExprOp_ConstS: - { - U64 x = 0; - step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, (S64*)&x); - result.kind = DW_SimpleLocKind_Address; - result.addr = x; - } break; - - - //// register location descriptions //// - - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: - { - U64 reg_idx = op - DW_ExprOp_Reg0; - result.kind = DW_SimpleLocKind_Register; - result.reg_idx = reg_idx; - } break; - - case DW_ExprOp_RegX: - { - U64 reg_idx = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, ®_idx); - result.kind = DW_SimpleLocKind_Register; - result.reg_idx = reg_idx; - } break; - - - //// implicit location descriptions //// - - case DW_ExprOp_ImplicitValue: - { - U64 size = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &size); - if (step_cursor + size <= range.max) { - result.kind = DW_SimpleLocKind_ValueLong; - result.val_long.str = (U8*)base + range.min + step_cursor; - result.val_long.size = size; - } - step_cursor += size; - } break; - - case DW_ExprOp_StackValue: - { - // this op pops from the value stack, so if it comes first the dwarf expression is bad. - result.kind = DW_SimpleLocKind_Fail; - result.fail_kind = DW_LocFailKind_BadData; - } break; - - - //// composite location descriptions //// - - // if the first and only op is a piece, the expression is empty - - case DW_ExprOp_Piece: - { - U64 size = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &size); - result.kind = DW_SimpleLocKind_Empty; - } break; - - case DW_ExprOp_BitPiece: - { - U64 bit_size = 0, bit_off = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &bit_size); - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &bit_off); - result.kind = DW_SimpleLocKind_Empty; - } break; - - - //// final fallback //// - - default: - { - result.kind = DW_SimpleLocKind_Fail; - result.fail_kind = DW_LocFailKind_TooComplicated; - } break; - } - - // check this was the whole expression - if (range.min + step_cursor < range.max) { - result.kind = DW_SimpleLocKind_Fail; - result.fail_kind = DW_LocFailKind_TooComplicated; - } - } - - return result; + DW_PieceNode *n = push_array(arena, DW_PieceNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; } -internal DW_ExprAnalysis -dw_expr__analyze_details(void *in_base, Rng1U64 in_range, DW_ExprMachineCallConfig *call_config) +internal DW_ExprValueType +dw_expr_unsigned_value_type_from_bit_size(U64 bit_size) { - Temp scratch = scratch_begin(0, 0); - - DW_ExprAnalysis result = {0}; - - // are we resolving calls? - B32 has_call_func = (call_config != 0 && call_config->func != 0); - - // tasks - DW_ExprAnalysisTask *unfinished_tasks = 0; - DW_ExprAnalysisTask *finished_tasks = 0; - - // convert range input to string - String8 in_data = str8((U8*)in_base + in_range.min, in_range.max - in_range.min); - - // put input task onto the list - { - DW_ExprAnalysisTask *new_task = push_array(scratch.arena, DW_ExprAnalysisTask, 1); - new_task->p = max_U64; - new_task->data = in_data; - SLLStackPush(unfinished_tasks, new_task); + switch (bit_size) { + case 8: return DW_ExprValueType_U8; + case 16: return DW_ExprValueType_U16; + case 32: return DW_ExprValueType_U32; + case 64: return DW_ExprValueType_U64; + case 128: return DW_ExprValueType_U128; + case 256: return DW_ExprValueType_U256; + case 512: return DW_ExprValueType_U512; } - - // state for checking implicit locations - B32 last_was_implicit_loc = 0; - - // task loop - for (;;) { - // get next task to handle - DW_ExprAnalysisTask *task = unfinished_tasks; - if (task == 0) { - break; - } - - String8 task_data = task->data; - U8 *task_base = task_data.str; - Rng1U64 task_range = rng_1u64(0, task_data.size); - - // move the task to finished now - SLLStackPop(unfinished_tasks); - SLLStackPush(finished_tasks, task); - - // analysis loop - for (U64 cursor = 0;;) { - // decode op - U64 op_offset = cursor; - U8 op = 0; - if (dw_based_range_read(task_base, task_range, op_offset, 1, &op)) { - U64 after_op_off = cursor + 1; - - // require piece op after 'implicit' location descriptions - if (last_was_implicit_loc) { - if (op != DW_ExprOp_Piece && op != DW_ExprOp_BitPiece) { - result.flags |= DW_ExprFlag_BadData; - goto finish; - } - } - - // step params - U64 size_param = 0; - B32 is_signed = 0; - - // step - U64 step_cursor = after_op_off; - switch (op) { - - //// literal encodings //// - - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: - break; - - case DW_ExprOp_Const1U:size_param = 1; goto const_n; - case DW_ExprOp_Const2U:size_param = 2; goto const_n; - case DW_ExprOp_Const4U:size_param = 4; goto const_n; - case DW_ExprOp_Const8U:size_param = 8; goto const_n; - case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n; - case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n; - case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n; - case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n; - const_n: - { - U64 x = 0; - step_cursor += dw_based_range_read(task_base, task_range, step_cursor, size_param, &x); - } break; - - case DW_ExprOp_Addr: - { - U64 offset = 0; - step_cursor += dw_based_range_read(task_base, task_range, step_cursor, 8, &offset); - result.flags |= DW_ExprFlag_UsesTextBase; - } break; - - case DW_ExprOp_ConstU: - { - U64 x = 0; - step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &x); - } break; - - case DW_ExprOp_ConstS: - { - U64 x = 0; - step_cursor += dw_based_range_read_sleb128(task_base, task_range, step_cursor, (S64*)&x); - } break; - - - //// register based addressing //// - - case DW_ExprOp_FBReg: - { - S64 offset = 0; - step_cursor += dw_based_range_read_sleb128(task_base, task_range, step_cursor, &offset); - result.flags |= DW_ExprFlag_UsesFrameBase; - } break; - - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: - { - S64 offset = 0; - step_cursor += dw_based_range_read_sleb128(task_base, task_range, step_cursor, &offset); - result.flags |= DW_ExprFlag_UsesRegisters; - } break; - - case DW_ExprOp_BRegX: - { - U64 reg_idx = 0; S64 offset = 0; - step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, ®_idx); - step_cursor += dw_based_range_read_sleb128(task_base, task_range, step_cursor, &offset); - result.flags |= DW_ExprFlag_UsesRegisters; - } break; - - - //// stack operations //// - - case DW_ExprOp_Dup: - case DW_ExprOp_Drop: - break; - - case DW_ExprOp_Pick: - { - U64 idx = 0; - step_cursor += dw_based_range_read(task_base, task_range, step_cursor, 1, &idx); - } break; - - case DW_ExprOp_Over: - case DW_ExprOp_Swap: - case DW_ExprOp_Rot: - break; - - case DW_ExprOp_Deref: - { - result.flags |= DW_ExprFlag_UsesMemory; - } break; - - case DW_ExprOp_DerefSize: - { - U64 size = 0; - step_cursor += dw_based_range_read(task_base, task_range, step_cursor, 1, &size); - result.flags |= DW_ExprFlag_UsesMemory; - } break; - - case DW_ExprOp_XDeref: - case DW_ExprOp_XDerefSize: - { - result.flags |= DW_ExprFlag_NotSupported; - } goto finish; - - case DW_ExprOp_PushObjectAddress: - { - result.flags |= DW_ExprFlag_UsesObjectAddress; - } break; - - case DW_ExprOp_GNU_PushTlsAddress: - case DW_ExprOp_FormTlsAddress: - { - result.flags |= DW_ExprFlag_UsesTLSAddress; - } break; - - case DW_ExprOp_CallFrameCfa: - { - result.flags |= DW_ExprFlag_UsesCFA; - } break; - - - //// arithmetic and logical operations //// - - case DW_ExprOp_Abs: - case DW_ExprOp_And: - case DW_ExprOp_Div: - case DW_ExprOp_Minus: - case DW_ExprOp_Mod: - case DW_ExprOp_Mul: - case DW_ExprOp_Neg: - case DW_ExprOp_Not: - case DW_ExprOp_Or: - case DW_ExprOp_Plus: - break; - - case DW_ExprOp_PlusUConst: - { - U64 y = 0; - step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &y); - } break; - - case DW_ExprOp_Shl: - case DW_ExprOp_Shr: - case DW_ExprOp_Shra: - case DW_ExprOp_Xor: - break; - - - //// control flow operations //// - - case DW_ExprOp_Le: - case DW_ExprOp_Ge: - case DW_ExprOp_Eq: - case DW_ExprOp_Lt: - case DW_ExprOp_Gt: - case DW_ExprOp_Ne: - break; - - case DW_ExprOp_Skip: - case DW_ExprOp_Bra: - { - S16 d = 0; - step_cursor += dw_based_range_read(task_base, task_range, step_cursor, 2, &d); - result.flags |= DW_ExprFlag_NonLinearFlow; - } break; - - case DW_ExprOp_Call2:size_param = 2; goto callN; - case DW_ExprOp_Call4:size_param = 4; goto callN; - callN: - { - U64 p = 0; - step_cursor += dw_based_range_read(task_base, task_range, step_cursor, size_param, &p); - result.flags |= DW_ExprFlag_UsesCallResolution|DW_ExprFlag_NonLinearFlow; - - // add to task list - if (has_call_func) { - DW_ExprAnalysisTask *existing = dw_expr__analysis_task_from_p(unfinished_tasks, p); - if (existing == 0) { - existing = dw_expr__analysis_task_from_p(finished_tasks, p);; - } - if (existing == 0) { - DW_ExprAnalysisTask *new_task = push_array(scratch.arena, DW_ExprAnalysisTask, 1); - new_task->p = p; - new_task->data = call_config->func(call_config->user_ptr, p); - SLLStackPush(unfinished_tasks, new_task); - } - } - } break; - - case DW_ExprOp_CallRef: - { - result.flags |= DW_ExprFlag_NotSupported; - } goto finish; - - - //// special operations //// - - case DW_ExprOp_Nop:break; - - - //// register location descriptions //// - - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: - { - last_was_implicit_loc = 1; - } break; - - case DW_ExprOp_RegX: - { - U64 reg_idx = 0; - step_cursor += dw_based_range_read(task_base, task_range, step_cursor, size_param, ®_idx); - last_was_implicit_loc = 1; - } break; - - - //// implicit location descriptions //// - - case DW_ExprOp_ImplicitValue: - { - U64 size = 0; - step_cursor += dw_based_range_read(task_base, task_range, step_cursor, size_param, &size); - if (step_cursor + size > task_range.max) { - result.flags |= DW_ExprFlag_BadData; - goto finish; - } - step_cursor += size; - last_was_implicit_loc = 1; - } break; - - case DW_ExprOp_StackValue: - { - last_was_implicit_loc = 1; - } break; - - - //// composite location descriptions //// - - case DW_ExprOp_Piece: - { - U64 size = 0; - step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &size); - result.flags |= DW_ExprFlag_UsesComposite; - - last_was_implicit_loc = 0; - } break; - - case DW_ExprOp_BitPiece: - { - U64 bit_size = 0; U64 bit_off = 0; - step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &bit_size); - step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &bit_off); - result.flags |= DW_ExprFlag_UsesComposite; - - last_was_implicit_loc = 0; - } break; - - - //// final fallback //// - - default: - { - result.flags |= DW_ExprFlag_NotSupported; - } goto finish; - } - - // increment cursor - cursor = step_cursor; - } - - // check for end of task - if (cursor < task_data.size) { - goto finish_task; - } - } - - finish_task:; - } - finish:; - - scratch_end(scratch); - return result; + AssertAlways(0 && "no suitable unsigned type was found for the specified size"); + return DW_ExprValueType_Generic; } -#endif -//- full eval - -internal DW_Location -dw_expr__eval(Arena *arena_optional, void *expr_base, Rng1U64 expr_range, DW_ExprMachineConfig *config) +internal DW_ExprValueType +dw_expr_signed_value_type_from_bit_size(U64 bit_size) { -#if 0 - Temp scratch = scratch_begin(&arena_optional, 1); - - DW_Location result = {0}; - - // setup stack - DW_ExprStack stack = dw_expr__stack_make(scratch.arena); - - // adjust expr range - void *expr_ptr = (U8*)expr_base + expr_range.min; - U64 expr_size = expr_range.max - expr_range.min; - - // setup call stack - DW_ExprCallStack call_stack = {0}; - dw_expr__call_push(scratch.arena, &call_stack, expr_ptr, expr_size); - - // state variables - DW_SimpleLoc stashed_loc = {DW_SimpleLocKind_Address}; - - // run loop - U64 max_step_count = config->max_step_count; - U64 step_counter = 0; - for (;;) { - // check top of stack - DW_ExprCall *call = dw_expr__call_top(&call_stack); - if (call == 0) { - goto finish; - } - - // grab top of stack details - void *base = call->ptr; - Rng1U64 range = rng_1u64(0, call->size); - U64 cursor = call->cursor; - - // decode op - U64 op_offset = cursor; - U8 op = 0; - if (dw_based_range_read(base, range, op_offset, 1, &op)) { - U64 after_op_off = cursor + 1; - - // require piece op after 'implicit' location descriptions - if (stashed_loc.kind != DW_SimpleLocKind_Address) { - if (op != DW_ExprOp_Piece && op != DW_ExprOp_BitPiece) { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_BadData; - goto finish; - } - } - - // step params - U64 size_param = 0; - B32 is_signed = 0; - - // step - U64 step_cursor = after_op_off; - switch (op) { - - //// literal encodings //// - - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: - { - U64 x = op - DW_ExprOp_Lit0; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Const1U:size_param = 1; goto const_n; - case DW_ExprOp_Const2U:size_param = 2; goto const_n; - case DW_ExprOp_Const4U:size_param = 4; goto const_n; - case DW_ExprOp_Const8U:size_param = 8; goto const_n; - case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n; - case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n; - case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n; - case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n; - const_n: - { - U64 x = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, size_param, &x); - if (is_signed) { - x = extend_sign64(x, size_param); - } - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Addr: - { - U64 offset = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, 8, &offset); - - // earlier versions of GCC emit TLS offset with DW_ExprOp_Addr. - B32 is_text_relative; - { - U8 next_op = 0; - dw_based_range_read_struct(base, range, step_cursor, &next_op); - is_text_relative = (next_op != DW_ExprOp_GNU_PushTlsAddress); - } - - U64 addr = offset; - - if (is_text_relative) { - if (config->text_section_base != 0) { - addr += *config->text_section_base; - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingTextBase; - goto finish; - } - } - - dw_expr__stack_push(scratch.arena, &stack, addr); - } break; - - case DW_ExprOp_ConstU: - { - U64 x = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &x); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_ConstS: - { - U64 x = 0; - step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, (S64*)&x); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - - //// register based addressing //// - - case DW_ExprOp_FBReg: - { - S64 offset = 0; - step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, &offset); - if (config->frame_base != 0) { - U64 x = *config->frame_base + offset; - dw_expr__stack_push(scratch.arena, &stack, x); - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingFrameBase; - goto finish; - } - } break; - - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: - { - S64 offset = 0; - step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, &offset); - U64 reg_idx = op - DW_ExprOp_BReg0; - DW_RegsX64 *regs = config->regs; - if (regs != 0) { - if (reg_idx < ArrayCount(regs->r)) { - U64 x = regs->r[reg_idx] + offset; - dw_expr__stack_push(scratch.arena, &stack, x); - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_BadData; - stashed_loc.fail_data = op_offset; - goto finish; - } - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingRegisters; - goto finish; - } - } break; - - case DW_ExprOp_BRegX: - { - U64 reg_idx = 0; S64 offset = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, ®_idx); - step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, &offset); - - DW_RegsX64 *regs = config->regs; - if (regs != 0) { - if (reg_idx < ArrayCount(regs->r)) { - U64 x = regs->r[reg_idx] + offset; - dw_expr__stack_push(scratch.arena, &stack, x); - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_BadData; - stashed_loc.fail_data = op_offset; - goto finish; - } - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingRegisters; - goto finish; - } - } break; - - - //// stack operations //// - - case DW_ExprOp_Dup: - { - U64 x = dw_expr__stack_pick(&stack, 0); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Drop: - { - dw_expr__stack_pop(&stack); - } break; - - case DW_ExprOp_Pick: - { - U64 idx = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, 1, &idx); - U64 x = dw_expr__stack_pick(&stack, idx); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Over: - { - U64 x = dw_expr__stack_pick(&stack, 1); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Swap: - { - U64 a = dw_expr__stack_pop(&stack); - U64 b = dw_expr__stack_pop(&stack); - dw_expr__stack_push(scratch.arena, &stack, b); - dw_expr__stack_push(scratch.arena, &stack, a); - } break; - - case DW_ExprOp_Rot: - { - U64 a = dw_expr__stack_pop(&stack); - U64 b = dw_expr__stack_pop(&stack); - U64 c = dw_expr__stack_pop(&stack); - dw_expr__stack_push(scratch.arena, &stack, a); - dw_expr__stack_push(scratch.arena, &stack, c); - dw_expr__stack_push(scratch.arena, &stack, b); - } break; - - case DW_ExprOp_Deref: - { - U64 addr = dw_expr__stack_pop(&stack); - - B32 read_success = 0; - if (config->read_memory) { - U64 x = 0; - if (config->read_memory(addr, sizeof(x), &x, config->read_memory_ud) == sizeof(x)) { - dw_expr__stack_push(scratch.arena, &stack, x); - read_success = 1; - } - } - - if (!read_success) { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingMemory; - stashed_loc.fail_data = addr; - goto finish; - } - } break; - - case DW_ExprOp_DerefSize: - { - U64 raw_size = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, 1, &raw_size); - - U64 size = ClampTop(raw_size, 8); - U64 addr = dw_expr__stack_pop(&stack); - - B32 read_success = 0; - if (config->read_memory) { - U64 x = 0; - if (config->read_memory(addr, size, &x, config->read_memory_ud) == sizeof(x)) { - dw_expr__stack_push(scratch.arena, &stack, x); - read_success = 1; - } - } - if (!read_success) { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingMemory; - stashed_loc.fail_data = addr; - goto finish; - } - } break; - - case DW_ExprOp_XDeref: - case DW_ExprOp_XDerefSize: - { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_NotSupported; - goto finish; - } break; - - case DW_ExprOp_PushObjectAddress: - { - if (config->object_address != 0) { - U64 x = *config->object_address; - dw_expr__stack_push(scratch.arena, &stack, x); - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingObjectAddress; - goto finish; - } - } break; - - // NOTE: pop offset from stack, convert it to TLS address, then push it back. - case DW_ExprOp_GNU_PushTlsAddress: - case DW_ExprOp_FormTlsAddress: - { - S64 s = (S64)dw_expr__stack_pop(&stack); - - if (config->tls_address != 0) { - U64 x = *config->tls_address + s; - dw_expr__stack_push(scratch.arena, &stack, x); - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingTLSAddress; - goto finish; - } - } break; - - case DW_ExprOp_CallFrameCfa: - { - if (config->cfa != 0) { - U64 x = *config->cfa; - dw_expr__stack_push(scratch.arena, &stack, x); - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingCFA; - goto finish; - } - } break; - - - //// arithmetic and logical operations //// - - case DW_ExprOp_Abs: - { - S64 s = (S64)dw_expr__stack_pop(&stack); - S64 x = abs_s64(s); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_And: - { - U64 x = dw_expr__stack_pop(&stack); - U64 y = dw_expr__stack_pop(&stack); - dw_expr__stack_push(scratch.arena, &stack, x&y); - } break; - - case DW_ExprOp_Div: - { - S64 d = (S64)dw_expr__stack_pop(&stack); - S64 n = (S64)dw_expr__stack_pop(&stack); - S64 x = (d == 0)?0:n/d; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Minus: - { - U64 b = dw_expr__stack_pop(&stack); - U64 a = dw_expr__stack_pop(&stack); - U64 x = a - b; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Mod: - { - S64 d = (S64)dw_expr__stack_pop(&stack); - S64 n = (S64)dw_expr__stack_pop(&stack); - S64 x = (d == 0)?0:n%d; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Mul: - { - U64 b = dw_expr__stack_pop(&stack); - U64 a = dw_expr__stack_pop(&stack); - U64 x = a*b; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Neg: - { - S64 s = (S64)dw_expr__stack_pop(&stack); - S64 x = -s; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Not: - { - U64 y = dw_expr__stack_pop(&stack); - U64 x = ~y; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Or: - { - U64 y = dw_expr__stack_pop(&stack); - U64 z = dw_expr__stack_pop(&stack); - U64 x = y | z; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Plus: - { - U64 y = dw_expr__stack_pop(&stack); - U64 z = dw_expr__stack_pop(&stack); - U64 x = y + z; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_PlusUConst: - { - U64 y = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &y); - U64 z = dw_expr__stack_pop(&stack); - U64 x = y + z; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Shl: - { - U64 y = dw_expr__stack_pop(&stack); - U64 z = dw_expr__stack_pop(&stack); - U64 x = 0; - if (y < 64) { - x = z << y; - } - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Shr: - { - U64 y = dw_expr__stack_pop(&stack); - U64 z = dw_expr__stack_pop(&stack); - U64 x = 0; - if (y < 64) { - x = z >> y; - } - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Shra: - { - U64 y = dw_expr__stack_pop(&stack); - U64 z = dw_expr__stack_pop(&stack); - U64 x = 0; - if (y < 64) { - x = z >> y; - // sign extensions - if (y > 0 && (z & (1ull << 63))) { - x |= ~((1 << (64 - y)) - 1); - } - } - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Xor: - { - U64 y = dw_expr__stack_pop(&stack); - U64 z = dw_expr__stack_pop(&stack); - U64 x = y ^ z; - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - - //// control flow operations //// - - case DW_ExprOp_Le: - { - S64 b = (S64)dw_expr__stack_pop(&stack); - S64 a = (S64)dw_expr__stack_pop(&stack); - U64 x = (a <= b); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Ge: - { - S64 b = (S64)dw_expr__stack_pop(&stack); - S64 a = (S64)dw_expr__stack_pop(&stack); - U64 x = (a >= b); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Eq: - { - S64 b = (S64)dw_expr__stack_pop(&stack); - S64 a = (S64)dw_expr__stack_pop(&stack); - U64 x = (a == b); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Lt: - { - S64 b = (S64)dw_expr__stack_pop(&stack); - S64 a = (S64)dw_expr__stack_pop(&stack); - U64 x = (a < b); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Gt: - { - S64 b = (S64)dw_expr__stack_pop(&stack); - S64 a = (S64)dw_expr__stack_pop(&stack); - U64 x = (a > b); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Ne: - { - S64 b = (S64)dw_expr__stack_pop(&stack); - S64 a = (S64)dw_expr__stack_pop(&stack); - U64 x = (a != b); - dw_expr__stack_push(scratch.arena, &stack, x); - } break; - - case DW_ExprOp_Skip: - { - S16 d = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, 2, &d); - step_cursor = step_cursor + d; - } break; - - case DW_ExprOp_Bra: - { - S16 d = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, 2, &d); - U64 b = dw_expr__stack_pop(&stack); - if (b != 0) { - step_cursor = step_cursor + d; - } - } break; - - case DW_ExprOp_Call2: - { - U16 p = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, 2, &p); - if (config->call.func != 0) { - String8 sub_data = config->call.func(config->call.user_ptr, p); - dw_expr__call_push(scratch.arena, &call_stack, sub_data.str, sub_data.size); - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingCallResolution; - goto finish; - } - } break; - - case DW_ExprOp_Call4: - { - U32 p = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, 4, &p); - if (config->call.func != 0) { - String8 sub_data = config->call.func(config->call.user_ptr, p); - dw_expr__call_push(scratch.arena, &call_stack, sub_data.str, sub_data.size); - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingCallResolution; - goto finish; - } - } break; - - case DW_ExprOp_CallRef: - { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_NotSupported; - goto finish; - } break; - - - //// special operations //// - - case DW_ExprOp_Nop:break; - - - //// register location descriptions //// - - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: - { - U64 reg_idx = op - DW_ExprOp_Reg0; - stashed_loc.kind = DW_SimpleLocKind_Register; - stashed_loc.reg_idx = reg_idx; - } break; - - case DW_ExprOp_RegX: - { - U64 reg_idx = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, size_param, ®_idx); - stashed_loc.kind = DW_SimpleLocKind_Register; - stashed_loc.reg_idx = reg_idx; - } break; - - - //// implicit location descriptions //// - - case DW_ExprOp_ImplicitValue: - { - U64 size = 0; - step_cursor += dw_based_range_read(base, range, step_cursor, size_param, &size); - if (step_cursor + size <= range.max) { - void *data = (U8*)base + range.min + step_cursor; - stashed_loc.kind = DW_SimpleLocKind_ValueLong; - stashed_loc.val_long.str = (U8*)data; - stashed_loc.val_long.size = size; - } else { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_BadData; - goto finish; - } - step_cursor += size; - } break; - - case DW_ExprOp_StackValue: - { - U64 x = dw_expr__stack_pop(&stack); - stashed_loc.kind = DW_SimpleLocKind_Value; - stashed_loc.val = x; - } break; - - - //// composite location descriptions //// - - case DW_ExprOp_Piece: - case DW_ExprOp_BitPiece: - { - if (arena_optional == 0) { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_MissingArenaForComposite; - goto finish; - } else { - // determine this piece's size & offset - U64 bit_size = 0; - U64 bit_off = 0; - B32 is_bit_loc = 0; - switch (op) { - case DW_ExprOp_Piece: - { - U64 size = 0; - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &size); - bit_size = size*8; - } break; - case DW_ExprOp_BitPiece: - { - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &bit_size); - step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &bit_off); - is_bit_loc = 1; - } break; - } - - // determine this piece's location information - DW_SimpleLoc piece_loc = stashed_loc; - if (piece_loc.kind == DW_SimpleLocKind_Address) { - if (dw_expr__stack_is_empty(&stack)) { - piece_loc.kind = DW_SimpleLocKind_Empty; - } else { - U64 x = dw_expr__stack_pop(&stack); - piece_loc.addr = x; - } - } - - // push the piece - DW_Piece *piece = push_array(arena_optional, DW_Piece, 1); - SLLQueuePush(result.first_piece, result.last_piece, piece); - piece->loc = piece_loc; - piece->bit_size = bit_size; - piece->bit_off = bit_off; - piece->is_bit_loc = is_bit_loc; - - // zero the stached loc - MemoryZeroStruct(&stashed_loc); - } - } break; - - - //// final fallback //// - - default: - { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_NotSupported; - goto finish; - } break; - } - - // increment cursor - cursor = step_cursor; - } - - // advance cursor or finish call - if (cursor < call->size) { - call->cursor = cursor; + switch (bit_size) { + case 8: return DW_ExprValueType_S8; + case 16: return DW_ExprValueType_S16; + case 32: return DW_ExprValueType_S32; + case 64: return DW_ExprValueType_S64; + case 128: return DW_ExprValueType_S128; + case 256: return DW_ExprValueType_S256; + case 512: return DW_ExprValueType_S512; + } + AssertAlways(0 && "no suitable signed type was found for the specified size"); + return DW_ExprValueType_Generic; +} + +internal DW_ExprValueType +dw_expr_float_type_from_bit_size(U64 bit_size) +{ + switch (bit_size) { + case 4: return DW_ExprValueType_F32; + case 8: return DW_ExprValueType_F64; + } + AssertAlways(0 && "no suitable type was found for the specified size"); + return DW_ExprValueType_Generic; +} + +internal U64 +dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k) +{ + switch (k) { + default: { InvalidPath; } + case DW_ExprValueType_Generic: return 0; + case DW_ExprValueType_Addr: return addr_size; + case DW_ExprValueType_U8: return 1; + case DW_ExprValueType_U16: return 2; + case DW_ExprValueType_U32: return 4; + case DW_ExprValueType_U64: return 8; + case DW_ExprValueType_U128: return 16; + case DW_ExprValueType_U256: return 32; + case DW_ExprValueType_U512: return 64; + case DW_ExprValueType_S8: return 1; + case DW_ExprValueType_S16: return 2; + case DW_ExprValueType_S32: return 4; + case DW_ExprValueType_S64: return 8; + case DW_ExprValueType_S128: return 16; + case DW_ExprValueType_S256: return 32; + case DW_ExprValueType_S512: return 64; + case DW_ExprValueType_F32: return 4; + case DW_ExprValueType_F64: return 8; + } +} + +internal DW_ExprValueType +dw_expr_pick_common_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs) +{ + if (lhs == rhs) { + return lhs; + } + // unsigned vs unsigned + else if (DW_ExprValueType_IsUnsigned(lhs) && DW_ExprValueType_IsUnsigned(rhs)) { + return Max(lhs, rhs); + } + // signed vs signed + else if (DW_ExprValueType_IsSigned(lhs) && DW_ExprValueType_IsSigned(rhs)) { + return Max(lhs, rhs); + } + // (unsigned vs signed) || (signed vs unsigned) + else if ((DW_ExprValueType_IsUnsigned(lhs) && DW_ExprValueType_IsSigned(rhs)) || + (DW_ExprValueType_IsSigned(lhs) && DW_ExprValueType_IsUnsigned(rhs))) { + U64 lhs_size = dw_expr_byte_size_from_value_type(0, lhs); + U64 rhs_size = dw_expr_byte_size_from_value_type(0, rhs); + if (lhs_size < rhs_size) { + return rhs; + } else if (lhs > rhs_size) { + return lhs; } else { - dw_expr__call_pop(&call_stack); - } - - // advance step counter - step_counter += 1; - if (step_counter == max_step_count) { - stashed_loc.kind = DW_SimpleLocKind_Fail; - stashed_loc.fail_kind = DW_LocFailKind_TimeOut; - goto finish; + return dw_expr_unsigned_value_type_from_bit_size(lhs_size * 8); } } - - finish:; - - // non-piece location - { - DW_SimpleLoc loc = stashed_loc; - if (result.first_piece == 0) { - - // normal location resolution - loc = stashed_loc; - if (loc.kind == DW_SimpleLocKind_Address) { - if (dw_expr__stack_is_empty(&stack)) { - loc.kind = DW_SimpleLocKind_Empty; - } else { - U64 x = dw_expr__stack_pop(&stack); - loc.addr = x; - } - } - } - // non-piece location resolution after composite - else { - - // change the default kind to empty - if (loc.kind == DW_SimpleLocKind_Address) { - loc.kind = DW_SimpleLocKind_Empty; - } - - // the non-piece should either be empty or fail - if (loc.kind != DW_SimpleLocKind_Empty && - loc.kind != DW_SimpleLocKind_Fail) { - loc.kind = DW_SimpleLocKind_Fail; - loc.fail_kind = DW_LocFailKind_BadData; - } - } - - result.non_piece_loc = loc; + // float vs int + else if (DW_ExprValueType_IsFloat(lhs) && DW_ExprValueType_IsInt(rhs)) { + return lhs; } - - // clear stack - scratch_end(scratch); - return result; -#endif - DW_Location result = {0}; - return result; + // int vs float + else if (DW_ExprValueType_IsInt(lhs) && DW_ExprValueType_IsFloat(rhs)) { + return rhs; + } + // float vs float + else if (DW_ExprValueType_IsFloat(lhs) && DW_ExprValueType_IsFloat(rhs)) { + return Max(lhs, rhs); + } + // address vs int + else if (lhs == DW_ExprValueType_Addr && DW_ExprValueType_IsInt(rhs)) { + return DW_ExprValueType_Addr; + } + // int vs address + else if (DW_ExprValueType_IsInt(lhs) && rhs == DW_ExprValueType_Addr) { + return DW_ExprValueType_Addr; + } + // address vs float + else if (lhs == DW_ExprValueType_Addr && DW_ExprValueType_IsFloat(rhs)) { + return DW_ExprValueType_Generic; + } + // float vs address + else if (DW_ExprValueType_IsFloat(lhs) && rhs == DW_ExprValueType_Addr) { + return DW_ExprValueType_Generic; + } + // no conversion for implicit value + else if (lhs == DW_ExprValueType_Implicit || rhs == DW_ExprValueType_Implicit) { + return DW_ExprValueType_Generic; + } + AssertAlways(!"undefined conversion case"); + return DW_ExprValueType_Generic; } - -//- dw expr val stack - -internal DW_ExprStack -dw_expr__stack_make(Arena *arena) +internal DW_ExprValueType +dw_expr_pick_common_comparison_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs) { - DW_ExprStack result = {0}; - return result; -} - -internal void -dw_expr__stack_push(Arena *arena, DW_ExprStack *stack, U64 x) -{ - DW_ExprStackNode *node = stack->free_nodes; - if (node == 0) { - SLLStackPop(stack->free_nodes); + DW_ExprValueType result; + if (lhs == DW_ExprValueType_Generic || rhs == DW_ExprValueType_Generic) { + result = DW_ExprValueType_S64; } else { - node = push_array(arena, DW_ExprStackNode, 1); + result = dw_expr_pick_common_value_type(lhs, rhs); } - SLLStackPush(stack->stack, node); - node->val = x; + return result; +} + +internal DW_ExprValue +dw_expr_cast(DW_ExprValue value, DW_ExprValueType type) +{ + DW_ExprValue result = { type }; + +#define CastTable(f, t) \ + switch (value.type) { \ + case DW_ExprValueType_Generic: { MemoryCopy(&result.##f, value.generic.str, Min(sizeof(t), value.generic.size)); } break; \ + case DW_ExprValueType_U8: { result.##f = (t)value.u8; } break; \ + case DW_ExprValueType_U16: { result.##f = (t)value.u16; } break; \ + case DW_ExprValueType_U32: { result.##f = (t)value.u32; } break; \ + case DW_ExprValueType_U64: { result.##f = (t)value.u64; } break; \ + case DW_ExprValueType_U128: { NotImplemented; } break; \ + case DW_ExprValueType_U256: { NotImplemented; } break; \ + case DW_ExprValueType_U512: { NotImplemented; } break; \ + case DW_ExprValueType_S8: { result.##f = (t)value.s8; } break; \ + case DW_ExprValueType_S16: { result.##f = (t)value.s16; } break; \ + case DW_ExprValueType_S32: { result.##f = (t)value.s32; } break; \ + case DW_ExprValueType_S64: { result.##f = (t)value.s64; } break; \ + case DW_ExprValueType_S128: { NotImplemented; } break; \ + case DW_ExprValueType_S256: { NotImplemented; } break; \ + case DW_ExprValueType_S512: { NotImplemented; } break; \ + case DW_ExprValueType_F32: { result.##f = (t)value.f32; } break; \ + case DW_ExprValueType_F64: { result.##f = (t)value.f64; } break; \ + case DW_ExprValueType_Addr: { result.##f = (t)value.addr; } break; \ + case DW_ExprValueType_Implicit: { InvalidPath; } break; \ + case DW_ExprValueType_Bool: { result.##f = (t)value.boolean; } break; \ + default: { InvalidPath; } break; \ + } + + switch (type) { + case DW_ExprValueType_Generic: {} break; + case DW_ExprValueType_U8: { CastTable(u8, U8); } break; + case DW_ExprValueType_U16: { CastTable(u16, U16); } break; + case DW_ExprValueType_U32: { CastTable(u32, U32); } break; + case DW_ExprValueType_U64: { CastTable(u64, U64); } break; + case DW_ExprValueType_U128: { NotImplemented; } break; + case DW_ExprValueType_U256: { NotImplemented; } break; + case DW_ExprValueType_U512: { NotImplemented; } break; + case DW_ExprValueType_S8: { CastTable(s8, S8); } break; + case DW_ExprValueType_S16: { CastTable(s16, S16); } break; + case DW_ExprValueType_S32: { CastTable(s32, S32); } break; + case DW_ExprValueType_S64: { CastTable(s64, S64); } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + case DW_ExprValueType_F32: { CastTable(f32, F32); } break; + case DW_ExprValueType_F64: { CastTable(f64, F64); } break; + case DW_ExprValueType_Addr: { CastTable(addr, U64); } break; + case DW_ExprValueType_Implicit: { NotImplemented; } break; + case DW_ExprValueType_Bool: { CastTable(boolean, DW_ExprBool); } break; + } + +#undef CastTable + return result; +} + +internal DW_ExprValue +dw_expr_add(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 + common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 + common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 + common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 + common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 + common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 + common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 + common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 + common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 + common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr + common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_minus(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 - common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 - common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 - common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 - common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 - common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 - common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 - common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 - common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 - common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr - common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_mul(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 * common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 * common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 * common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 * common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 * common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 * common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 * common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 * common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 * common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr * common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_div(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 / common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 / common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 / common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 / common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 / common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 / common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 / common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 / common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 / common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr / common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_mod(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 % common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 % common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 % common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 % common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 % common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 % common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 % common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr % common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_eq(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 == common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 == common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 == common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 == common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 == common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 == common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 == common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 == common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 == common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr == common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_ge(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >= common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >= common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >= common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >= common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >= common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >= common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >= common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 >= common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 >= common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >= common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_gt(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 > common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 > common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 > common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 > common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 > common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 > common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 > common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 > common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 > common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr > common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_le(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 <= common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 <= common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 <= common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 <= common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 <= common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 <= common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 <= common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 <= common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 <= common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr <= common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_lt(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 < common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 < common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 < common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 < common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 < common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 < common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 < common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 < common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 < common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr < common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_ne(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 != common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 != common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 != common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 != common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 != common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 != common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 != common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 != common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 != common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr != common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_xor(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 ^ common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 ^ common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 ^ common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 ^ common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 ^ common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 ^ common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 ^ common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr ^ common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_and(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 & common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 & common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 & common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 & common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 & common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 & common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 & common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr & common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_or(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 | common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 | common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 | common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 | common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 | common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 | common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 | common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr | common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_shl(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 << common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 << common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 << common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 << common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 << common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 << common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 << common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr << common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_shr(DW_ExprValue lhs, DW_ExprValue rhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >> common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >> common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >> common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >> common_rhs.u64; } break; + + case DW_ExprValueType_U128: { NotImplemented; } break; + case DW_ExprValueType_U256: { NotImplemented; } break; + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { InvalidPath; } break; + case DW_ExprValueType_S8: { InvalidPath; } break; + case DW_ExprValueType_S16: { InvalidPath; } break; + case DW_ExprValueType_S32: { InvalidPath; } break; + case DW_ExprValueType_S64: { InvalidPath; } break; + case DW_ExprValueType_S128: { InvalidPath; } break; + case DW_ExprValueType_S256: { InvalidPath; } break; + case DW_ExprValueType_S512: { InvalidPath; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_shra(DW_ExprValue lhs, DW_ExprValue rhs) +{ + if (DW_ExprValueType_IsUnsigned(lhs.type)) { + DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, lhs.type) * 8); + lhs = dw_expr_cast(lhs, new_type); + } + + if (DW_ExprValueType_IsUnsigned(rhs.type)) { + DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, rhs.type) * 8); + rhs = dw_expr_cast(rhs, new_type); + } + + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { InvalidPath; } break; + case DW_ExprValueType_U16: { InvalidPath; } break; + case DW_ExprValueType_U32: { InvalidPath; } break; + case DW_ExprValueType_U64: { InvalidPath; } break; + case DW_ExprValueType_U128: { InvalidPath; } break; + case DW_ExprValueType_U256: { InvalidPath; } break; + case DW_ExprValueType_U512: { InvalidPath; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >> common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >> common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >> common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_abs(DW_ExprValue value) +{ + DW_ExprValue result = value; + + switch (value.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: {}; break; + case DW_ExprValueType_U16: {}; break; + case DW_ExprValueType_U32: {}; break; + case DW_ExprValueType_U64: {}; break; + case DW_ExprValueType_U128: {}; break; + case DW_ExprValueType_U256: {}; break; + case DW_ExprValueType_U512: {}; break; + + case DW_ExprValueType_S8: { result.s8 = abs_s64(result.s8); } break; + case DW_ExprValueType_S16: { result.s16 = abs_s64(result.s16); } break; + case DW_ExprValueType_S32: { result.s32 = abs_s64(result.s32); } break; + case DW_ExprValueType_S64: { result.s64 = abs_s64(result.s64); } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = abs_f32(result.f32); } break; + case DW_ExprValueType_F64: { result.f64 = abs_f64(result.f64); } break; + + case DW_ExprValueType_Addr: {} break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_neg(DW_ExprValue value) +{ + DW_ExprValue result = value; + + switch (value.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = -result.u8; }; break; + case DW_ExprValueType_U16: { result.u16 = -result.u16; }; break; + case DW_ExprValueType_U32: { result.u32 = -result.u32; }; break; + case DW_ExprValueType_U64: { result.u64 = -result.u64; }; break; + case DW_ExprValueType_U128: { NotImplemented; }; break; + case DW_ExprValueType_U256: { NotImplemented; }; break; + case DW_ExprValueType_U512: { NotImplemented; }; break; + + case DW_ExprValueType_S8: { result.s8 = -result.s8; } break; + case DW_ExprValueType_S16: { result.s16 = -result.s16; } break; + case DW_ExprValueType_S32: { result.s32 = -result.s32; } break; + case DW_ExprValueType_S64: { result.s64 = -result.s64; } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = -result.f32; } break; + case DW_ExprValueType_F64: { result.f64 = -result.f64; } break; + + case DW_ExprValueType_Addr: { result.addr = -result.addr; } break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_not(DW_ExprValue value) +{ + DW_ExprValue result = value; + + switch (value.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = !result.u8; }; break; + case DW_ExprValueType_U16: { result.u16 = !result.u16; }; break; + case DW_ExprValueType_U32: { result.u32 = !result.u32; }; break; + case DW_ExprValueType_U64: { result.u64 = !result.u64; }; break; + case DW_ExprValueType_U128: { NotImplemented; }; break; + case DW_ExprValueType_U256: { NotImplemented; }; break; + case DW_ExprValueType_U512: { NotImplemented; }; break; + + case DW_ExprValueType_S8: { result.s8 = !result.s8; } break; + case DW_ExprValueType_S16: { result.s16 = !result.s16; } break; + case DW_ExprValueType_S32: { result.s32 = !result.s32; } break; + case DW_ExprValueType_S64: { result.s64 = !result.s64; } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = !result.f32; } break; + case DW_ExprValueType_F64: { result.f64 = !result.f64; } break; + + case DW_ExprValueType_Addr: { result.addr = !result.addr; } break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + } + + return result; +} + +internal String8 +dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v) +{ + String8 s = {0}; + switch (v.type) { + case DW_ExprValueType_Generic: { } break; + case DW_ExprValueType_U8: { s = str8_struct(&v.u8); } break; + case DW_ExprValueType_U16: { s = str8_struct(&v.u16); } break; + case DW_ExprValueType_U32: { s = str8_struct(&v.u32); } break; + case DW_ExprValueType_U64: { s = str8_struct(&v.u64); } break; + case DW_ExprValueType_U128: { s = str8_struct(&v.u128); } break; + case DW_ExprValueType_U256: { s = str8_struct(&v.u256); } break; + case DW_ExprValueType_U512: { s = str8_struct(&v.u512); } break; + case DW_ExprValueType_S8: { s = str8_struct(&v.s8); } break; + case DW_ExprValueType_S16: { s = str8_struct(&v.s16); } break; + case DW_ExprValueType_S32: { s = str8_struct(&v.s32); } break; + case DW_ExprValueType_S64: { s = str8_struct(&v.s64); } break; + case DW_ExprValueType_F32: { s = str8_struct(&v.f32); } break; + case DW_ExprValueType_F64: { s = str8_struct(&v.f64); } break; + case DW_ExprValueType_Addr: { s = str8((U8 *)&v.addr, addr_size); } break; + case DW_ExprValueType_Implicit: { s = v.implicit; } break; + default: { NotImplemented; } break; + } + return str8_copy(arena, s); +} + +internal DW_ExprValueNode * +dw_expr_stack_push(Arena *arena, DW_ExprStack *stack, DW_ExprValue value) +{ + DW_ExprValueNode *n = push_array(arena, DW_ExprValueNode, 1); + n->v = value; + SLLStackPush(stack->top, n); stack->count += 1; + return n; } -internal U64 -dw_expr__stack_pop(DW_ExprStack *stack) +internal DW_ExprValueNode * +dw_expr_stack_push_unsigned(Arena *arena, DW_ExprStack *stack, void *value, U64 value_size) { - U64 result = 0; - DW_ExprStackNode *node = stack->stack; - if (node != 0) { - SLLStackPop(stack->stack); - stack->count -= 1; - result = node->val; + DW_ExprValueNode *n = 0; + switch (value_size) { + case 0: {} break; + case 1: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = *(U8 *)value }); } break; + case 2: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = *(U16 *)value }); } break; + case 4: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = *(U32 *)value }); } break; + case 8: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = *(U64 *)value }); } break; + default: { NotImplemented; } break; } - return result; + return n; } -internal U64 -dw_expr__stack_pick(DW_ExprStack *stack, U64 idx) +internal DW_ExprValue +dw_expr_stack_pop(DW_ExprStack *stack) { - U64 result = 0; + DW_ExprValueNode *n = stack->top; + DW_ExprValue v = n->v; + SLLStackPop(stack->top); + return v; +} + +internal DW_ExprValue +dw_expr_stack_peek(DW_ExprStack *stack) +{ + return stack->top->v; +} + +internal DW_ExprValueNode * +dw_expr_stack_pick(DW_ExprStack *stack, U64 idx) +{ + DW_ExprValueNode *n = 0; if (idx < stack->count) { - U64 counter = idx; - DW_ExprStackNode *node = stack->stack; - for (;node != 0 && counter > 0; node = node->next, counter -= 1); - if (counter == 0 && node != 0) { - result = node->val; - } + U64 c = idx; + for (n = stack->top; n != 0 && c > 0; n = n->next, c -= 1); } - return result; + return n; } -internal B32 -dw_expr__stack_is_empty(DW_ExprStack *stack) +internal DW_ExprInst * +dw_expr_inst_from_delta(DW_ExprInst *inst, S16 delta) { - B32 result = (stack->count == 0); - return result; -} - -//- dw expr call stack - -internal DW_ExprCall* -dw_expr__call_top(DW_ExprCallStack *stack) -{ - DW_ExprCall *call = stack->stack; - return call; -} - -internal void -dw_expr__call_push(Arena *arena, DW_ExprCallStack *stack, void *ptr, U64 size) -{ - DW_ExprCall *call = 0; - if (call != 0) { - SLLStackPop(stack->free_calls); - } else { - call = push_array(arena, DW_ExprCall, 1); + B32 skip_fwd = inst->operands[0].s16 >= 0; + DW_ExprInst *i = inst; + U16 u_delta = abs_s64(inst->operands[0].s16); + U64 cursor = 0; + for (i = skip_fwd ? inst : inst->prev; i != 0 && cursor < u_delta; i = skip_fwd ? inst->next : inst->prev) { + cursor += inst->size; } - MemoryZeroStruct(call); - SLLStackPush(stack->stack, call); - stack->depth += 1; -} - -internal void -dw_expr__call_pop(DW_ExprCallStack *stack) -{ - DW_ExprCall *top = stack->stack; - if (top != 0) - { - SLLStackPop(stack->stack); - SLLStackPush(stack->free_calls, top); + if (cursor != u_delta) { + i = 0; } + return i; } -//- analysis tasks - -internal DW_ExprAnalysisTask* -dw_expr__analysis_task_from_p(DW_ExprAnalysisTask *first, U64 p) +internal DW_UnwindStatus +dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out) { - DW_ExprAnalysisTask *result = 0; - for (DW_ExprAnalysisTask *task = first; task != 0; task = task->next) { - if (task->p == p) { - result = task; + Temp scratch = scratch_begin(&arena, 1); + DW_UnwindStatus result = DW_UnwindStatus_Ok; + DW_PieceList pieces = {0}; + DW_ExprStack *stack = push_array(scratch.arena, DW_ExprStack, 1); + B32 is_ok = 1; + + for EachNode(inst, DW_ExprInst, expr.first) { + again:; + + U64 pop_count = dw_pop_count_from_expr_op(inst->opcode); + if (pop_count >= stack->count) { + Assert(0 && "not enough values on the stack to evaluate the instruction"); + is_ok = 0; break; } + + switch (inst->opcode) { + case DW_ExprOp_Nop: {} break; + + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->opcode - DW_ExprOp_Lit0 }); + } break; + + case DW_ExprOp_Const1U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->operands[0].u8 }); } break; + case DW_ExprOp_Const2U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = inst->operands[0].u16 }); } break; + case DW_ExprOp_Const4U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = inst->operands[0].u32 }); } break; + case DW_ExprOp_Const8U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; + case DW_ExprOp_Const1S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S8, .s8 = inst->operands[0].s8 }); } break; + case DW_ExprOp_Const2S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S16, .s16 = inst->operands[0].s16 }); } break; + case DW_ExprOp_Const4S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S32, .s32 = inst->operands[0].s32 }); } break; + case DW_ExprOp_Const8S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; + case DW_ExprOp_ConstU: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; + case DW_ExprOp_ConstS: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; + case DW_ExprOp_Addr: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = inst->operands[0].u64 }); } break; + + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { + DW_Reg reg_id = inst->opcode - DW_ExprOp_Reg0; + U64 reg_size = dw_reg_size_from_code(ctx->arch, reg_id); + U8 *reg_value = push_array(scratch.arena, U8, reg_size); + result = reg_read(reg_id, reg_value, reg_size, reg_read_ud); + if (result != DW_UnwindStatus_Ok) { goto exit; } + dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); + } break; + + case DW_ExprOp_RegX: { + U64 reg_size = dw_reg_size_from_code(ctx->arch, inst->operands[0].u64); + U8 *reg_value = push_array(scratch.arena, U8, reg_size); + result = reg_read(inst->operands[0].u64, reg_value, reg_size, reg_read_ud); + if (result != DW_UnwindStatus_Ok) { goto exit; } + dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); + } break; + + case DW_ExprOp_ImplicitValue: { + if (inst->operands[0].block.size <= sizeof(U512)) { + dw_expr_stack_push_unsigned(scratch.arena, stack, inst->operands[0].block.str, inst->operands[0].block.size); + } else { + NotImplemented; + } + } break; + + case DW_ExprOp_Piece: { + if (stack->count) { + String8 value = dw_string_from_expr_value(arena, ctx->arch, dw_expr_stack_pop(stack)); + if (inst->operands[0].u64 <= value.size) { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .value = { .ptr = value.str, .bit_size = inst->operands[0].u64 * 8 }}); + } else { + Assert(0 && "out of bounds size in the piece opcode"); + result = DW_UnwindStatus_Fail; + } + } else { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .undef_bit_size = inst->operands[0].u64 * 8 }); + } + } break; + case DW_ExprOp_BitPiece: { + if (stack->count) { + String8 value = dw_string_from_expr_value(arena, ctx->arch, dw_expr_stack_pop(stack)); + if (inst->operands[0].u64 <= value.size * 8) { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .value = { .ptr = value.str, .bit_size = inst->operands[0].u64 }}); + } else { + Assert(0 && "out of bounds size in the bit piece opcode"); + result = DW_UnwindStatus_Fail; + } + } else { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .undef_bit_size = inst->operands[0].u64 }); + } + } break; + + case DW_ExprOp_Pick: { + DW_ExprValueNode *src = dw_expr_stack_pick(stack, inst->operands[0].u8); + if (src) { + dw_expr_stack_push(scratch.arena, stack, src->v); + } else { + Assert(0 && "out of bounds stack index"); + result = DW_UnwindStatus_Fail; + } + } break; + + case DW_ExprOp_Over: { + DW_ExprValueNode *src = dw_expr_stack_pick(stack, 1); + if (src) { + dw_expr_stack_push(scratch.arena, stack, src->v); + } else { + Assert(0 && "out of bounds stack index"); + result = DW_UnwindStatus_Fail; + } + } break; + + case DW_ExprOp_PlusUConst: { + DW_ExprValue lhs = dw_expr_stack_pop(stack); + DW_ExprValue rhs = { .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }; + DW_ExprValue sum = dw_expr_add(lhs, rhs); + dw_expr_stack_push(scratch.arena, stack, sum); + } break; + + case DW_ExprOp_Skip: { + DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); + + if (i == 0) { + Assert(0 && "seeking to an invalid offset"); + result = DW_UnwindStatus_Fail; + break; + } + + inst = i; + goto again; + } + + case DW_ExprOp_Bra: { + DW_ExprValue cond = dw_expr_stack_pop(stack); + + if (cond.type != DW_ExprValueType_S16) { + Assert(0 && "unexpected value"); + result = DW_UnwindStatus_Fail; + break; + } + + DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); + + if (i == 0) { + Assert(0 && "seeking to an invalid offset"); + result = DW_UnwindStatus_Fail; + break; + } + + inst = i; + goto again; + } + + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: { + NotImplemented; + } break; + + case DW_ExprOp_GNU_Convert: + case DW_ExprOp_Convert: { + if (inst->operands[0].u64 == 0) { + DW_ExprValue value = dw_expr_stack_pop(stack); + DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); + dw_expr_stack_push(scratch.arena, stack, new_value); + } else { + NotImplemented; + } + } break; + + case DW_ExprOp_Reinterpret: { + if (inst->operands[0].u64 == 0) { + DW_ExprValue value = dw_expr_stack_pop(stack); + DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); + dw_expr_stack_push(scratch.arena, stack, new_value); + } else { + NotImplemented; + } + } break; + + case DW_ExprOp_GNU_ParameterRef: { NotImplemented; } break; + case DW_ExprOp_GNU_DerefType: { NotImplemented; } break; + case DW_ExprOp_DerefType: { NotImplemented; } break; + case DW_ExprOp_ConstType: { NotImplemented; } break; + case DW_ExprOp_GNU_ConstType: { NotImplemented; } break; + case DW_ExprOp_RegvalType: { NotImplemented; } break; + + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: { + DW_Expr entry_value_expr = dw_expr_from_data(scratch.arena, ctx->format, byte_size_from_arch(ctx->arch), inst->operands[0].block); + DW_ExprValue entry_value; + result = dw_eval_expr(scratch.arena, ctx, entry_value_expr, reg_read, reg_read_ud, &entry_value); + if (result == DW_UnwindStatus_Ok) { + dw_expr_stack_push(scratch.arena, stack, entry_value); + } + } break; + + case DW_ExprOp_Addrx: { NotImplemented; } break; + + case DW_ExprOp_CallFrameCfa: { + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = ctx->cfa }); + } break; + + case DW_ExprOp_PushObjectAddress: { NotImplemented; } break; + + case DW_ExprOp_Plus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_add(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Minus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_minus(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Div: { dw_expr_stack_push(scratch.arena, stack, dw_expr_div(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Mul: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mul(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Mod: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mod(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Eq: { dw_expr_stack_push(scratch.arena, stack, dw_expr_eq(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Ge: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ge(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Gt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_gt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Le: { dw_expr_stack_push(scratch.arena, stack, dw_expr_le(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Lt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_lt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Ne: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ne(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Xor: { dw_expr_stack_push(scratch.arena, stack, dw_expr_xor(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_And: { dw_expr_stack_push(scratch.arena, stack, dw_expr_and(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Or: { dw_expr_stack_push(scratch.arena, stack, dw_expr_or(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shl: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shl(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shr: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shr(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shra: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shra(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Abs: { dw_expr_stack_push(scratch.arena, stack, dw_expr_abs(dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Neg: { dw_expr_stack_push(scratch.arena, stack, dw_expr_neg(dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Not: { dw_expr_stack_push(scratch.arena, stack, dw_expr_not(dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Dup: { + dw_expr_stack_push(scratch.arena, stack, dw_expr_stack_peek(stack)); + } break; + + case DW_ExprOp_Rot: { + DW_ExprValue first = dw_expr_stack_pop(stack); + DW_ExprValue second = dw_expr_stack_pop(stack); + DW_ExprValue third = dw_expr_stack_pop(stack); + dw_expr_stack_push(scratch.arena, stack, first); // -> third + dw_expr_stack_push(scratch.arena, stack, third); // -> second + dw_expr_stack_push(scratch.arena, stack, second); // -> first + } break; + + case DW_ExprOp_Swap: { + DW_ExprValue first = dw_expr_stack_pop(stack); + DW_ExprValue second = dw_expr_stack_pop(stack); + dw_expr_stack_push(scratch.arena, stack, first); // -> second + dw_expr_stack_push(scratch.arena, stack, second); // -> first + } break; + + case DW_ExprOp_Drop: { + dw_expr_stack_pop(stack); + } break; + + case DW_ExprOp_StackValue: { + stack->top->v.type = dw_expr_unsigned_value_type_from_bit_size(byte_size_from_arch(ctx->arch) * 8); + } break; + + case DW_ExprOp_GNU_PushTlsAddress: + case DW_ExprOp_FormTlsAddress: { + DW_ExprValue tls_off = dw_expr_stack_pop(stack); + DW_ExprValue tls_base = { .type = DW_ExprValueType_Addr, .addr = ctx->tls_base }; + DW_ExprValue tls_addr = dw_expr_add(tls_base, tls_off); + dw_expr_stack_push(scratch.arena, stack, tls_addr); + } break; + } } + +exit:; + scratch_end(scratch); return result; } diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index 9daf7f73..150b7077 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -4,298 +4,175 @@ #ifndef DWARF_EXPR_H #define DWARF_EXPR_H -//////////////////////////////// -//~ Dwarf Register Layout - -typedef struct DW_RegsX64 +typedef struct DW_ExprContext { + Arch arch; + DW_Format format; + U64 cfa; + U64 tls_base; +} DW_ExprContext; + +#define DW_ExprValueType_IsSigned(x) ((x) == DW_ExprValueType_S8 || (x) == DW_ExprValueType_S16 || (x) == DW_ExprValueType_S32 || (x) == DW_ExprValueType_S64 || (x) == DW_ExprValueType_S128 || (x) == DW_ExprValueType_S256 || (x) == DW_ExprValueType_S512) +#define DW_ExprValueType_IsUnsigned(x) ((x) == DW_ExprValueType_U8 || (x) == DW_ExprValueType_U16 || (x) == DW_ExprValueType_U32 || (x) == DW_ExprValueType_U64 || (x) == DW_ExprValueType_U128 || (x) == DW_ExprValueType_U256 || (x) == DW_ExprValueType_U512) +#define DW_ExprValueType_IsFloat(x) ((x) == DW_ExprValueType_F32 || (x) == DW_ExprValueType_F64) +#define DW_ExprValueType_IsInt(x) (DW_ExprValueType_IsSigned(x) || DW_ExprValueType_IsUnsigned(x) || (x) == DW_ExprValueType_Addr) +typedef enum +{ + DW_ExprValueType_Generic, + DW_ExprValueType_U8, + DW_ExprValueType_U16, + DW_ExprValueType_U32, + DW_ExprValueType_U64, + DW_ExprValueType_U128, + DW_ExprValueType_U256, + DW_ExprValueType_U512, + DW_ExprValueType_S8, + DW_ExprValueType_S16, + DW_ExprValueType_S32, + DW_ExprValueType_S64, + DW_ExprValueType_S128, + DW_ExprValueType_S256, + DW_ExprValueType_S512, + DW_ExprValueType_F32, + DW_ExprValueType_F64, + DW_ExprValueType_Addr, + DW_ExprValueType_Implicit, + DW_ExprValueType_Bool, +} DW_ExprValueType; + +typedef S8 DW_ExprBool; + +typedef struct DW_ExprValue +{ + DW_ExprValueType type; union { - struct { - U64 rax; - U64 rdx; - U64 rcx; - U64 rbx; - U64 rsi; - U64 rdi; - U64 rbp; - U64 rsp; - U64 r8; - U64 r9; - U64 r10; - U64 r11; - U64 r12; - U64 r13; - U64 r14; - U64 r15; - U64 rip; - }; - U64 r[17]; + U8 u8; + U16 u16; + U32 u32; + U64 u64; + U128 u128; + U256 u256; + U512 u512; + S8 s8; + S16 s16; + S32 s32; + S64 s64; + F32 f32; + F64 f64; + U64 addr; + DW_ExprBool boolean; + String8 implicit; + String8 generic; }; -} DW_RegsX64; +} DW_ExprValue; -//////////////////////////////// -//~ Dwarf Expression Eval Types - -#define DW_READ_MEMORY_SIG(name) U64 name(U64 addr, U64 size, void *out, void *ud) -typedef DW_READ_MEMORY_SIG(DW_ReadMemorySig); - -//- machine configuration types -typedef String8 DW_ExprResolveCallFunc(void *call_user_ptr, U64 p); - -typedef struct DW_ExprMachineCallConfig +typedef struct DW_ExprValueNode { - void *user_ptr; - DW_ExprResolveCallFunc *func; -} DW_ExprMachineCallConfig; - -typedef struct DW_ExprMachineConfig -{ - U64 max_step_count; // (read only in the eval functions) - DW_ReadMemorySig *read_memory; - void *read_memory_ud; - DW_RegsX64 *regs; - U64 *text_section_base; - U64 *frame_base; - U64 *object_address; - U64 *tls_address; - U64 *cfa; - DW_ExprMachineCallConfig call; -} DW_ExprMachineConfig; - - -//- detail analysis types -typedef U32 DW_ExprFlags; -enum -{ - DW_ExprFlag_UsesTextBase = (1 << 0), - DW_ExprFlag_UsesMemory = (1 << 1), - DW_ExprFlag_UsesRegisters = (1 << 2), - DW_ExprFlag_UsesFrameBase = (1 << 3), - DW_ExprFlag_UsesObjectAddress = (1 << 4), - DW_ExprFlag_UsesTLSAddress = (1 << 5), - DW_ExprFlag_UsesCFA = (1 << 6), - DW_ExprFlag_UsesCallResolution = (1 << 7), - DW_ExprFlag_UsesComposite = (1 << 8), - - DW_ExprFlag_NotSupported = (1 << 16), - DW_ExprFlag_BadData = (1 << 17), - DW_ExprFlag_NonLinearFlow = (1 << 18) -}; - -typedef struct DW_ExprAnalysis -{ - DW_ExprFlags flags; -} DW_ExprAnalysis; - -typedef struct DW_ExprAnalysisTask -{ - struct DW_ExprAnalysisTask *next; - U64 p; - String8 data; -} DW_ExprAnalysisTask; - - -//- location types -typedef enum DW_SimpleLocKind -{ - DW_SimpleLocKind_Address, - DW_SimpleLocKind_Register, - DW_SimpleLocKind_Value, - DW_SimpleLocKind_ValueLong, - DW_SimpleLocKind_Empty, - DW_SimpleLocKind_Fail, -} DW_SimpleLocKind; - -typedef enum DW_LocFailKind -{ - // Interpreting Fail Kinds - // - // BadData: the evaluator detected that the dwarf expression operation is incorrectly formed - // NotSupported: the evaluator does not support a dwarf feature that was found in the dwarf expression - // TimeOut: the evaluator hit the maximum step count - // TooComplicated: used by analyzer when it the expression uses features outside of the analyzer's scope - // Missing*: the dwarf machine config was missing necessary information to finish the evaluation - - DW_LocFailKind_BadData, - DW_LocFailKind_NotSupported, - DW_LocFailKind_TimeOut, - DW_LocFailKind_TooComplicated, - DW_LocFailKind_MissingTextBase, - DW_LocFailKind_MissingMemory, - DW_LocFailKind_MissingRegisters, - DW_LocFailKind_MissingFrameBase, - DW_LocFailKind_MissingObjectAddress, - DW_LocFailKind_MissingTLSAddress, - DW_LocFailKind_MissingCFA, - DW_LocFailKind_MissingCallResolution, - DW_LocFailKind_MissingArenaForComposite, -} DW_LocFailKind; - -typedef struct DW_SimpleLoc -{ - DW_SimpleLocKind kind; - union { - U64 addr; - U64 reg_idx; - U64 val; - String8 val_long; - struct { - DW_LocFailKind fail_kind; - U64 fail_data; - }; - }; -} DW_SimpleLoc; - -typedef struct DW_Piece -{ - // Hint for Interpreting Pieces - // - // src = decode(loc, is_bit_loc, bit_size); - // dst |= (src >> bit_off) << bit_cursor; - // bit_cursor += bit_size; - - struct DW_Piece *next; - DW_SimpleLoc loc; - U64 bit_size; - U64 bit_off; - B32 is_bit_loc; -} DW_Piece; - -typedef struct DW_Location -{ - // Interpreting a Dwarf Location - // - // CASE (any number of pieces, fail in the non-piece): - // this is how errors are reported, error information is in the non-piece - // the 'fail' location kind should never show up in a piece - // if there are any pieces they can be treated as correct information that - // was successfully decoded before the error was encountered - // - // CASE (no pieces, empty non-piece): - // the data is completely optimized out and unrecoverable - // - // CASE (no pieces, non-empty non-piece): - // the size of the data is not known by the location, but something in the - // surrounding context of the location (eg type info) should know the size - // - // CASE (one-or-more pieces, empty non-piece): - // the data is described by the pieces - // - // CASE (one-or-more pieces, non-empty non-fail non-piece): - // this is supposed to be impossible; the non-piece either carries an error - // or *all* of the location information about the data, there should never - // be a mix of piece-based location and non-piece-based location data. - - DW_Piece *first_piece; - DW_Piece *last_piece; - U64 count; - - DW_SimpleLoc non_piece_loc; -} DW_Location; - - -//- full evaluator state types -typedef struct DW_ExprStackNode -{ - struct DW_ExprStackNode *next; - U64 val; -} DW_ExprStackNode; + DW_ExprValue v; + struct DW_ExprValueNode *next; +} DW_ExprValueNode; typedef struct DW_ExprStack { - DW_ExprStackNode *stack; - DW_ExprStackNode *free_nodes; U64 count; + DW_ExprValueNode *top; } DW_ExprStack; -typedef struct DW_ExprCall +typedef enum { - struct DW_ExprCall *next; - void *ptr; - U64 size; - U64 cursor; -} DW_ExprCall; + DW_PieceKind_Null, + DW_PieceKind_Value, + DW_PieceKind_Undefined, +} DW_PieceKind; -typedef struct DW_ExprCallStack +typedef struct DW_Piece { - DW_ExprCall *stack; - DW_ExprCall *free_calls; - U64 depth; -} DW_ExprCallStack; + DW_PieceKind kind; + union { + U64 undef_bit_size; + struct { + U64 bit_size; + void *ptr; + } value; + }; +} DW_Piece; + +typedef struct DW_PieceNode +{ + DW_Piece v; + struct DW_PieceNode *next; +} DW_PieceNode; + +typedef struct DW_PieceList +{ + U64 count; + DW_PieceNode *first; + DW_PieceNode *last; +} DW_PieceList; + +typedef struct DW_ExprResult +{ + int x; +} DW_ExprResult; //////////////////////////////// -//~ Dwarf Expression Analysis & Eval Functions -//- analyzers +// pieces +internal DW_PieceNode * dw_piece_list_push(Arena *arena, DW_PieceList *list, DW_Piece v); -// This analyzer provides the most simplified dwarf expression -// decoding. If the expression consists of a single op that can be interpreted -// as a valid dwarf expression, then it represents that expression as a simple -// location. -// -// If there is a single 'piece' op that is represeted here as an empty simple -// location, losing whatever additional size information from the piece. -// -// If there is an op that requires the machine configuration data the analyzer -// fails with "too complicated" - unless the required configuration data is the -// text section base which this analyzer treats as a non-optional parameter and -// always decodes successfully. -// -// If the expression contains more than one op than the analyzer fails with -// "too complicated". +// size -> type +internal DW_ExprValueType dw_expr_unsigned_value_type_from_bit_size(U64 bit_size); +internal DW_ExprValueType dw_expr_signed_value_type_from_bit_size(U64 bit_size); +internal DW_ExprValueType dw_expr_float_type_from_bit_size(U64 bit_size); -internal DW_SimpleLoc dw_expr__analyze_fast(void *base, Rng1U64 range, U64 text_section_base); +// type -> size +internal U64 dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k); -// This analyzer does a one-pass scan through the expression to -// help a caller determine what to expect before doing a full evaluation which -// has to maintain value stacks, perform more checks, and execute any loops -// that may appear in the expression, etc. -// -// For each piece of data that can be equipped to a machine config there is a -// 'Uses' flag in the analysis. A user can use these flags to determine what to -// prepare and equip before a full eval. This can be a lot more efficient than -// always preparing everything, or iteratively equipping and retrying after -// each failure. -// -// The analysis can also catch some cases of bad data and unsupported features. -// These flags are useful for short circuit style optimizations, but they are -// not definitive, some bad data can only be caught by the full evaluator. -// Sometimes the full evaluator might miss bad data that this analyzer will see -// if control flow in the evaluator completely skips the bad data. A forgiving -// interpretation of dwarf expression data would only rely on the results of -// the full evaluator. A more strict interpretation would consider it an error -// if either this analyzer or the evaluator finds bad data. -// -// The analyzer also determines if there is any possibility for non-linear -// flow. Jumps, branches, and call ops all create non-linear flow. An -// expression that doesn't have non-linear flow is trivially gauranteed to -// terminate and therefore a good candidate for conversion to a human readable -// expression. -// -// The call config is optional (may be null). If is provided the analysis -// includes features seen in all of the expressions that might be reached by -// call ops from the initial expression. +// typer +internal DW_ExprValueType dw_expr_pick_common_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs); +internal DW_ExprValueType dw_expr_pick_common_comparison_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs); +internal DW_ExprValue dw_expr_cast(DW_ExprValue value, DW_ExprValueType type); -internal DW_ExprAnalysis dw_expr__analyze_details(void *base, Rng1U64 range, DW_ExprMachineCallConfig *call_config); +// arithmetic operators +internal DW_ExprValue dw_expr_add(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_minus(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_mul(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_div(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_mod(DW_ExprValue lhs, DW_ExprValue rhs); -//- full eval -internal DW_Location dw_expr__eval(Arena *arena_optional, void *base, Rng1U64 range, DW_ExprMachineConfig *config); +// comparison operators +internal DW_ExprValue dw_expr_eq(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_ge(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_gt(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_le(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_lt(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_ne(DW_ExprValue lhs, DW_ExprValue rhs); -//- dw expr val stack -internal DW_ExprStack dw_expr__stack_make(Arena *arena); -internal void dw_expr__stack_push(Arena *arena, DW_ExprStack *stack, U64 x); -internal U64 dw_expr__stack_pop(DW_ExprStack *stack); -internal U64 dw_expr__stack_pick(DW_ExprStack *stack, U64 idx); -internal B32 dw_expr__stack_is_empty(DW_ExprStack *stack); +// bitwise operators +internal DW_ExprValue dw_expr_xor(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_and(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_or(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_shl(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_shr(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_shra(DW_ExprValue lhs, DW_ExprValue rhs); -//- dw expr call stack -internal DW_ExprCall* dw_expr__call_top(DW_ExprCallStack *stack); -internal void dw_expr__call_push(Arena *arena, DW_ExprCallStack *stack, void *ptr, U64 size); -internal void dw_expr__call_pop(DW_ExprCallStack *stack); +// unary operators +internal DW_ExprValue dw_expr_abs(DW_ExprValue value); +internal DW_ExprValue dw_expr_neg(DW_ExprValue value); +internal DW_ExprValue dw_expr_not(DW_ExprValue value); +// stack +internal DW_ExprValueNode * dw_expr_stack_push(Arena *arena, DW_ExprStack *stack, DW_ExprValue value); +internal DW_ExprValueNode * dw_expr_stack_push_unsigned(Arena *arena, DW_ExprStack *stack, void *value, U64 value_size); +internal DW_ExprValue dw_expr_stack_pop(DW_ExprStack *stack); +internal DW_ExprValue dw_expr_stack_peek(DW_ExprStack *stack); +internal DW_ExprValueNode * dw_expr_stack_pick(DW_ExprStack *stack, U64 idx); -//- analysis tasks -internal DW_ExprAnalysisTask* dw_expr__analysis_task_from_p(DW_ExprAnalysisTask *first, U64 p); +// value helpers +internal String8 dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v); + +// evaluator +internal DW_UnwindStatus dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out); #endif //DWARF_EXPR_H diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index df0cc700..286b7799 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -2,8 +2,8 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #include "dwarf/dwarf.c" -#include "dwarf/dwarf_expr.c" #include "dwarf/dwarf_parse.c" +#include "dwarf/dwarf_expr.c" #include "dwarf/dwarf_coff.c" #include "dwarf/dwarf_elf.c" #include "dwarf/dwarf_unwind.c" diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index 44783a34..71c548bf 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -5,8 +5,8 @@ #define DWARF_INC_H #include "dwarf/dwarf.h" -#include "dwarf/dwarf_expr.h" #include "dwarf/dwarf_parse.h" +#include "dwarf/dwarf_expr.h" #include "dwarf/dwarf_coff.h" #include "dwarf/dwarf_elf.h" #include "dwarf/dwarf_unwind.h" diff --git a/src/dwarf/dwarf_unwind.h b/src/dwarf/dwarf_unwind.h index afe2b294..904b7df4 100644 --- a/src/dwarf/dwarf_unwind.h +++ b/src/dwarf/dwarf_unwind.h @@ -65,21 +65,6 @@ typedef struct DW_CFI_Unwind U64 reg_count; } DW_CFI_Unwind; -typedef enum { - DW_UnwindStatus_Ok, - DW_UnwindStatus_Fail, - DW_UnwindStatus_Maybe -} DW_UnwindStatus; - -#define DW_REG_READ(name) DW_UnwindStatus name(DW_Reg reg_id, void *buffer, U64 buffer_max, void *ud) -typedef DW_REG_READ(DW_RegRead); - -#define DW_REG_WRITE(name) DW_UnwindStatus name(DW_Reg reg_id, void *value, U64 value_size, void *ud) -typedef DW_REG_WRITE(DW_RegWrite); - -#define DW_MEM_READ(name) DW_UnwindStatus name(U64 addr, U64 size, void *buffer, void *ud) -typedef DW_MEM_READ(DW_MemRead); - //////////////////////////////// internal DW_CFI_Row * dw_make_cfi_row(Arena *arena, U64 reg_count); From 7d0e168f8f05b2e4da65e4f080ef1139101ea18f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Dec 2025 12:16:28 -0800 Subject: [PATCH 099/850] typoes --- src/dwarf/dwarf_expr.c | 74 +++++++++++++++++++++--------------------- src/dwarf/dwarf_expr.h | 2 +- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index fc7275ef..fb824763 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -144,7 +144,7 @@ dw_expr_pick_common_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs) } internal DW_ExprValueType -dw_expr_pick_common_comparison_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs) +dw_expr_pick_common_compar_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs) { DW_ExprValueType result; if (lhs == DW_ExprValueType_Generic || rhs == DW_ExprValueType_Generic) { @@ -160,29 +160,29 @@ dw_expr_cast(DW_ExprValue value, DW_ExprValueType type) { DW_ExprValue result = { type }; -#define CastTable(f, t) \ - switch (value.type) { \ - case DW_ExprValueType_Generic: { MemoryCopy(&result.##f, value.generic.str, Min(sizeof(t), value.generic.size)); } break; \ - case DW_ExprValueType_U8: { result.##f = (t)value.u8; } break; \ - case DW_ExprValueType_U16: { result.##f = (t)value.u16; } break; \ - case DW_ExprValueType_U32: { result.##f = (t)value.u32; } break; \ - case DW_ExprValueType_U64: { result.##f = (t)value.u64; } break; \ - case DW_ExprValueType_U128: { NotImplemented; } break; \ - case DW_ExprValueType_U256: { NotImplemented; } break; \ - case DW_ExprValueType_U512: { NotImplemented; } break; \ - case DW_ExprValueType_S8: { result.##f = (t)value.s8; } break; \ - case DW_ExprValueType_S16: { result.##f = (t)value.s16; } break; \ - case DW_ExprValueType_S32: { result.##f = (t)value.s32; } break; \ - case DW_ExprValueType_S64: { result.##f = (t)value.s64; } break; \ - case DW_ExprValueType_S128: { NotImplemented; } break; \ - case DW_ExprValueType_S256: { NotImplemented; } break; \ - case DW_ExprValueType_S512: { NotImplemented; } break; \ - case DW_ExprValueType_F32: { result.##f = (t)value.f32; } break; \ - case DW_ExprValueType_F64: { result.##f = (t)value.f64; } break; \ - case DW_ExprValueType_Addr: { result.##f = (t)value.addr; } break; \ - case DW_ExprValueType_Implicit: { InvalidPath; } break; \ - case DW_ExprValueType_Bool: { result.##f = (t)value.boolean; } break; \ - default: { InvalidPath; } break; \ +#define CastTable(f, t) \ + switch (value.type) { \ + case DW_ExprValueType_Generic: { MemoryCopy(&result.f, value.generic.str, Min(sizeof(t), value.generic.size)); } break; \ + case DW_ExprValueType_U8: { result.f = (t)value.u8; } break; \ + case DW_ExprValueType_U16: { result.f = (t)value.u16; } break; \ + case DW_ExprValueType_U32: { result.f = (t)value.u32; } break; \ + case DW_ExprValueType_U64: { result.f = (t)value.u64; } break; \ + case DW_ExprValueType_U128: { NotImplemented; } break; \ + case DW_ExprValueType_U256: { NotImplemented; } break; \ + case DW_ExprValueType_U512: { NotImplemented; } break; \ + case DW_ExprValueType_S8: { result.f = (t)value.s8; } break; \ + case DW_ExprValueType_S16: { result.f = (t)value.s16; } break; \ + case DW_ExprValueType_S32: { result.f = (t)value.s32; } break; \ + case DW_ExprValueType_S64: { result.f = (t)value.s64; } break; \ + case DW_ExprValueType_S128: { NotImplemented; } break; \ + case DW_ExprValueType_S256: { NotImplemented; } break; \ + case DW_ExprValueType_S512: { NotImplemented; } break; \ + case DW_ExprValueType_F32: { result.f = (t)value.f32; } break; \ + case DW_ExprValueType_F64: { result.f = (t)value.f64; } break; \ + case DW_ExprValueType_Addr: { result.f = (t)value.addr; } break; \ + case DW_ExprValueType_Implicit: { InvalidPath; } break; \ + case DW_ExprValueType_Bool: { result.f = (t)value.boolean; } break; \ + default: { InvalidPath; } break; \ } switch (type) { @@ -380,7 +380,7 @@ internal DW_ExprValue dw_expr_mod(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -421,7 +421,7 @@ internal DW_ExprValue dw_expr_eq(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_type(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -463,7 +463,7 @@ internal DW_ExprValue dw_expr_ge(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_type(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -505,7 +505,7 @@ internal DW_ExprValue dw_expr_gt(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_type(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -547,7 +547,7 @@ internal DW_ExprValue dw_expr_le(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_type(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -589,7 +589,7 @@ internal DW_ExprValue dw_expr_lt(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -631,7 +631,7 @@ internal DW_ExprValue dw_expr_ne(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -673,7 +673,7 @@ internal DW_ExprValue dw_expr_xor(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -715,7 +715,7 @@ internal DW_ExprValue dw_expr_and(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -757,7 +757,7 @@ internal DW_ExprValue dw_expr_or(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -799,7 +799,7 @@ internal DW_ExprValue dw_expr_shl(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -841,7 +841,7 @@ internal DW_ExprValue dw_expr_shr(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); @@ -892,7 +892,7 @@ dw_expr_shra(DW_ExprValue lhs, DW_ExprValue rhs) } DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_comparsion_value_kind(lhs.type, rhs.type); + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index 150b7077..d9d3f0c7 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -130,7 +130,7 @@ internal U64 dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k // typer internal DW_ExprValueType dw_expr_pick_common_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs); -internal DW_ExprValueType dw_expr_pick_common_comparison_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs); +internal DW_ExprValueType dw_expr_pick_common_compar_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs); internal DW_ExprValue dw_expr_cast(DW_ExprValue value, DW_ExprValueType type); // arithmetic operators From 782f87e512342d22e70aee06daf0a65463a59c47 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Dec 2025 17:39:49 -0800 Subject: [PATCH 100/850] WIP DWARF expression encoder --- build.bat | 1 + src/dwarf/dwarf.c | 52 +++-- src/dwarf/dwarf.h | 397 ++++++++++++++++++---------------- src/dwarf/dwarf_expr.c | 101 +++++++++ src/dwarf/dwarf_expr.h | 66 ++++++ src/dwarf/dwarf_parse.c | 231 ++++---------------- src/torture/dwarf_expr_test.c | 49 +++++ 7 files changed, 498 insertions(+), 399 deletions(-) create mode 100644 src/torture/dwarf_expr_test.c diff --git a/build.bat b/build.bat index abe5f279..1f6dfe34 100644 --- a/build.bat +++ b/build.bat @@ -145,6 +145,7 @@ if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb & if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1 if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture.c %compile_link% %out%torture.exe || exit /b1 +if "%dwarf_expr_test%"=="1" set didbuild=1 && %compile% ..\src\torture\dwarf_expr_test.c %compile_link% %out%dwarf_expr_test.exe || exit /b1 if "%mule_peb_trample%"=="1" ( set didbuild=1 if exist mule_peb_trample.exe move mule_peb_trample.exe mule_peb_trample_old_%random%.exe diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 5a380b47..2d9a66e9 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -400,11 +400,11 @@ internal U64 dw_operand_count_from_expr_op(DW_ExprOp op) { switch (op) { -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _OPER_COUNT; - DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _OPER_COUNT; + DW_Expr_V3_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X default: { NotImplemented; } break; } @@ -415,11 +415,11 @@ internal U64 dw_pop_count_from_expr_op(DW_ExprOp op) { switch (op) { -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _POP_COUNT; - DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _POP_COUNT; + DW_Expr_V3_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X default: { NotImplemented; } break; } @@ -430,11 +430,25 @@ internal U64 dw_push_count_from_expr_op(DW_ExprOp op) { switch (op) { -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _PUSH_COUNT; - DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _PUSH_COUNT; + DW_Expr_V3_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList +#undef X + default: { NotImplemented; } break; + } + return 0; +} + +internal DW_ExprOperandType * +dw_operand_types_from_expr_opcode(DW_ExprOp op) +{ +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, _OPER_TYPE0, _OPER_TYPE1) case _ID: { local_persist DW_ExprOperandType t[] = { DW_ExprOperandType_##_OPER_TYPE0, DW_ExprOperandType_##_OPER_TYPE1 }; return t; } + switch (op) { + DW_Expr_V3_XList + DW_Expr_V4_XList + DW_Expr_V5_XList #undef X default: { NotImplemented; } break; } @@ -528,26 +542,26 @@ dw_string_from_expr_op(Arena *arena, DW_Version ver, DW_Ext ext, DW_ExprOp op) #define X(_N,...) case DW_ExprOp_##_N: result = str8_lit(Stringify(_N)); goto exit; if (ext & DW_Ext_GNU) { switch (op) { - DW_Expr_GNU_XList(X); + DW_Expr_GNU_XList; } } switch (ver) { case DW_Version_5: { switch (op) { - DW_Expr_V5_XList(X) + DW_Expr_V5_XList } } // fall-through case DW_Version_4: { switch (op) { - DW_Expr_V4_XList(X) + DW_Expr_V4_XList } } // fall-through case DW_Version_3: case DW_Version_2: case DW_Version_1: { switch (op) { - DW_Expr_V3_XList(X) + DW_Expr_V3_XList } } // fall-through case DW_Version_Null: diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 44c7fc08..94dd6ade 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1392,199 +1392,217 @@ typedef enum DW_CFA_Enum //////////////////////////////// // Expression Opcodes -// (opcode name, opcode id, operand count, pop count, push count) -#define DW_Expr_V3_XList(X) \ -X(Null, 0x00, 0, 0, 0) \ -X(Addr, 0x03, 1, 0, 1) \ -X(Deref, 0x06, 0, 1, 1) \ -X(Const1U, 0x08, 1, 0, 1) \ -X(Const1S, 0x09, 1, 0, 1) \ -X(Const2U, 0x0a, 1, 0, 1) \ -X(Const2S, 0x0b, 1, 0, 1) \ -X(Const4U, 0x0c, 1, 0, 1) \ -X(Const4S, 0x0d, 1, 0, 1) \ -X(Const8U, 0x0e, 1, 0, 1) \ -X(Const8S, 0x0f, 1, 0, 1) \ -X(ConstU, 0x10, 1, 0, 1) \ -X(ConstS, 0x11, 1, 0, 1) \ -X(Dup, 0x12, 0, 0, 1) \ -X(Drop, 0x13, 0, 1, 0) \ -X(Over, 0x14, 0, 0, 1) \ -X(Pick, 0x15, 1, 0, 1) \ -X(Swap, 0x16, 0, 0, 0) \ -X(Rot, 0x17, 0, 0, 0) \ -X(XDeref, 0x18, 0, 2, 1) \ -X(Abs, 0x19, 0, 1, 1) \ -X(And, 0x1a, 0, 2, 1) \ -X(Div, 0x1b, 0, 2, 1) \ -X(Minus, 0x1c, 0, 2, 1) \ -X(Mod, 0x1d, 0, 2, 1) \ -X(Mul, 0x1e, 0, 2, 1) \ -X(Neg, 0x1f, 0, 1, 1) \ -X(Not, 0x20, 0, 1, 1) \ -X(Or, 0x21, 0, 2, 1) \ -X(Plus, 0x22, 0, 2, 1) \ -X(PlusUConst, 0x23, 1, 1, 1) \ -X(Shl, 0x24, 0, 2, 1) \ -X(Shr, 0x25, 0, 2, 1) \ -X(Shra, 0x26, 0, 2, 1) \ -X(Xor, 0x27, 0, 2, 1) \ -X(Bra, 0x28, 1, 1, 0) \ -X(Eq, 0x29, 0, 2, 1) \ -X(Ge, 0x2a, 0, 2, 1) \ -X(Gt, 0x2b, 0, 2, 1) \ -X(Le, 0x2c, 0, 2, 1) \ -X(Lt, 0x2d, 0, 2, 1) \ -X(Ne, 0x2e, 0, 2, 1) \ -X(Skip, 0x2f, 1, 0, 0) \ -X(Lit0, 0x30, 0, 0, 0) \ -X(Lit1, 0x31, 0, 0, 0) \ -X(Lit2, 0x32, 0, 0, 0) \ -X(Lit3, 0x33, 0, 0, 0) \ -X(Lit4, 0x34, 0, 0, 0) \ -X(Lit5, 0x35, 0, 0, 0) \ -X(Lit6, 0x36, 0, 0, 0) \ -X(Lit7, 0x37, 0, 0, 0) \ -X(Lit8, 0x38, 0, 0, 0) \ -X(Lit9, 0x39, 0, 0, 0) \ -X(Lit10, 0x3a, 0, 0, 0) \ -X(Lit11, 0x3b, 0, 0, 0) \ -X(Lit12, 0x3c, 0, 0, 0) \ -X(Lit13, 0x3d, 0, 0, 0) \ -X(Lit14, 0x3e, 0, 0, 0) \ -X(Lit15, 0x3f, 0, 0, 0) \ -X(Lit16, 0x40, 0, 0, 0) \ -X(Lit17, 0x41, 0, 0, 0) \ -X(Lit18, 0x42, 0, 0, 0) \ -X(Lit19, 0x43, 0, 0, 0) \ -X(Lit20, 0x44, 0, 0, 0) \ -X(Lit21, 0x45, 0, 0, 0) \ -X(Lit22, 0x46, 0, 0, 0) \ -X(Lit23, 0x47, 0, 0, 0) \ -X(Lit24, 0x48, 0, 0, 0) \ -X(Lit25, 0x49, 0, 0, 0) \ -X(Lit26, 0x4a, 0, 0, 0) \ -X(Lit27, 0x4b, 0, 0, 0) \ -X(Lit28, 0x4c, 0, 0, 0) \ -X(Lit29, 0x4d, 0, 0, 0) \ -X(Lit30, 0x4e, 0, 0, 0) \ -X(Lit31, 0x4f, 0, 0, 0) \ -X(Reg0, 0x50, 0, 0, 1) \ -X(Reg1, 0x51, 0, 0, 1) \ -X(Reg2, 0x52, 0, 0, 1) \ -X(Reg3, 0x53, 0, 0, 1) \ -X(Reg4, 0x54, 0, 0, 1) \ -X(Reg5, 0x55, 0, 0, 1) \ -X(Reg6, 0x56, 0, 0, 1) \ -X(Reg7, 0x57, 0, 0, 1) \ -X(Reg8, 0x58, 0, 0, 1) \ -X(Reg9, 0x59, 0, 0, 1) \ -X(Reg10, 0x5a, 0, 0, 1) \ -X(Reg11, 0x5b, 0, 0, 1) \ -X(Reg12, 0x5c, 0, 0, 1) \ -X(Reg13, 0x5d, 0, 0, 1) \ -X(Reg14, 0x5e, 0, 0, 1) \ -X(Reg15, 0x5f, 0, 0, 1) \ -X(Reg16, 0x60, 0, 0, 1) \ -X(Reg17, 0x61, 0, 0, 1) \ -X(Reg18, 0x62, 0, 0, 1) \ -X(Reg19, 0x63, 0, 0, 1) \ -X(Reg20, 0x64, 0, 0, 1) \ -X(Reg21, 0x65, 0, 0, 1) \ -X(Reg22, 0x66, 0, 0, 1) \ -X(Reg23, 0x67, 0, 0, 1) \ -X(Reg24, 0x68, 0, 0, 1) \ -X(Reg25, 0x69, 0, 0, 1) \ -X(Reg26, 0x6a, 0, 0, 1) \ -X(Reg27, 0x6b, 0, 0, 1) \ -X(Reg28, 0x6c, 0, 0, 1) \ -X(Reg29, 0x6d, 0, 0, 1) \ -X(Reg30, 0x6e, 0, 0, 1) \ -X(Reg31, 0x6f, 0, 0, 1) \ -X(BReg0, 0x70, 1, 0, 1) \ -X(BReg1, 0x71, 1, 0, 1) \ -X(BReg2, 0x72, 1, 0, 1) \ -X(BReg3, 0x73, 1, 0, 1) \ -X(BReg4, 0x74, 1, 0, 1) \ -X(BReg5, 0x75, 1, 0, 1) \ -X(BReg6, 0x76, 1, 0, 1) \ -X(BReg7, 0x77, 1, 0, 1) \ -X(BReg8, 0x78, 1, 0, 1) \ -X(BReg9, 0x79, 1, 0, 1) \ -X(BReg10, 0x7a, 1, 0, 1) \ -X(BReg11, 0x7b, 1, 0, 1) \ -X(BReg12, 0x7c, 1, 0, 1) \ -X(BReg13, 0x7d, 1, 0, 1) \ -X(BReg14, 0x7e, 1, 0, 1) \ -X(BReg15, 0x7f, 1, 0, 1) \ -X(BReg16, 0x80, 1, 0, 1) \ -X(BReg17, 0x81, 1, 0, 1) \ -X(BReg18, 0x82, 1, 0, 1) \ -X(BReg19, 0x83, 1, 0, 1) \ -X(BReg20, 0x84, 1, 0, 1) \ -X(BReg21, 0x85, 1, 0, 1) \ -X(BReg22, 0x86, 1, 0, 1) \ -X(BReg23, 0x87, 1, 0, 1) \ -X(BReg24, 0x88, 1, 0, 1) \ -X(BReg25, 0x89, 1, 0, 1) \ -X(BReg26, 0x8a, 1, 0, 1) \ -X(BReg27, 0x8b, 1, 0, 1) \ -X(BReg28, 0x8c, 1, 0, 1) \ -X(BReg29, 0x8d, 1, 0, 1) \ -X(BReg30, 0x8e, 1, 0, 1) \ -X(BReg31, 0x8f, 1, 0, 1) \ -X(RegX, 0x90, 1, 0, 1) \ -X(FBReg, 0x91, 1, 0, 1) \ -X(BRegX, 0x92, 2, 0, 1) \ -X(Piece, 0x93, 1, 0, 0) \ -X(DerefSize, 0x94, 1, 1, 1) \ -X(XDerefSize, 0x95, 1, 2, 1) \ -X(Nop, 0x96, 0, 0, 0) \ -X(PushObjectAddress, 0x97, 0, 0, 1) \ -X(Call2, 0x98, 1, 0, 0) \ -X(Call4, 0x99, 1, 0, 0) \ -X(CallRef, 0x9a, 1, 0, 0) \ -X(FormTlsAddress, 0x9b, 0, 0, 1) \ -X(CallFrameCfa, 0x9c, 0, 0, 1) \ -X(BitPiece, 0x9d, 2, 0, 0) +typedef enum +{ + DW_ExprOperandType_Null, + DW_ExprOperandType_U8, + DW_ExprOperandType_U16, + DW_ExprOperandType_U32, + DW_ExprOperandType_U64, + DW_ExprOperandType_S8, + DW_ExprOperandType_S16, + DW_ExprOperandType_S32, + DW_ExprOperandType_S64, + DW_ExprOperandType_ULEB128, + DW_ExprOperandType_SLEB128, + DW_ExprOperandType_Addr, + DW_ExprOperandType_Block, + DW_ExprOperandType_DwarfUInt, +} DW_ExprOperandType; -#define DW_Expr_V4_XList(X) \ -X(ImplicitValue, 0x9e, 2, 0, 1) \ -X(StackValue, 0x9f, 0, 0, 0) +// (opcode name, opcode id, operand count, pop count, push count, operand0 type, operand1 type) +#define DW_Expr_V3_XList \ + X(Null, 0x00, 0, 0, 0, Null, Null) \ + X(Addr, 0x03, 1, 0, 1, Addr, Null) \ + X(Deref, 0x06, 0, 1, 1, Null, Null) \ + X(Const1U, 0x08, 1, 0, 1, U8, Null) \ + X(Const1S, 0x09, 1, 0, 1, S8, Null) \ + X(Const2U, 0x0a, 1, 0, 1, U16, Null) \ + X(Const2S, 0x0b, 1, 0, 1, S16, Null) \ + X(Const4U, 0x0c, 1, 0, 1, U32, Null) \ + X(Const4S, 0x0d, 1, 0, 1, S32, Null) \ + X(Const8U, 0x0e, 1, 0, 1, U64, Null) \ + X(Const8S, 0x0f, 1, 0, 1, S64, Null) \ + X(ConstU, 0x10, 1, 0, 1, ULEB128, Null) \ + X(ConstS, 0x11, 1, 0, 1, SLEB128, Null) \ + X(Dup, 0x12, 0, 0, 1, Null, Null) \ + X(Drop, 0x13, 0, 1, 0, Null, Null) \ + X(Over, 0x14, 0, 0, 1, Null, Null) \ + X(Pick, 0x15, 1, 0, 1, U8, Null) \ + X(Swap, 0x16, 0, 0, 0, Null, Null) \ + X(Rot, 0x17, 0, 0, 0, Null, Null) \ + X(XDeref, 0x18, 0, 2, 1, Null, Null) \ + X(Abs, 0x19, 0, 1, 1, Null, Null) \ + X(And, 0x1a, 0, 2, 1, Null, Null) \ + X(Div, 0x1b, 0, 2, 1, Null, Null) \ + X(Minus, 0x1c, 0, 2, 1, Null, Null) \ + X(Mod, 0x1d, 0, 2, 1, Null, Null) \ + X(Mul, 0x1e, 0, 2, 1, Null, Null) \ + X(Neg, 0x1f, 0, 1, 1, Null, Null) \ + X(Not, 0x20, 0, 1, 1, Null, Null) \ + X(Or, 0x21, 0, 2, 1, Null, Null) \ + X(Plus, 0x22, 0, 2, 1, Null, Null) \ + X(PlusUConst, 0x23, 1, 1, 1, ULEB128, Null) \ + X(Shl, 0x24, 0, 2, 1, Null, Null) \ + X(Shr, 0x25, 0, 2, 1, Null, Null) \ + X(Shra, 0x26, 0, 2, 1, Null, Null) \ + X(Xor, 0x27, 0, 2, 1, Null, Null) \ + X(Bra, 0x28, 1, 1, 0, S16, Null) \ + X(Eq, 0x29, 0, 2, 1, Null, Null) \ + X(Ge, 0x2a, 0, 2, 1, Null, Null) \ + X(Gt, 0x2b, 0, 2, 1, Null, Null) \ + X(Le, 0x2c, 0, 2, 1, Null, Null) \ + X(Lt, 0x2d, 0, 2, 1, Null, Null) \ + X(Ne, 0x2e, 0, 2, 1, Null, Null) \ + X(Skip, 0x2f, 1, 0, 0, S16, Null) \ + X(Lit0, 0x30, 0, 0, 0, Null, Null) \ + X(Lit1, 0x31, 0, 0, 0, Null, Null) \ + X(Lit2, 0x32, 0, 0, 0, Null, Null) \ + X(Lit3, 0x33, 0, 0, 0, Null, Null) \ + X(Lit4, 0x34, 0, 0, 0, Null, Null) \ + X(Lit5, 0x35, 0, 0, 0, Null, Null) \ + X(Lit6, 0x36, 0, 0, 0, Null, Null) \ + X(Lit7, 0x37, 0, 0, 0, Null, Null) \ + X(Lit8, 0x38, 0, 0, 0, Null, Null) \ + X(Lit9, 0x39, 0, 0, 0, Null, Null) \ + X(Lit10, 0x3a, 0, 0, 0, Null, Null) \ + X(Lit11, 0x3b, 0, 0, 0, Null, Null) \ + X(Lit12, 0x3c, 0, 0, 0, Null, Null) \ + X(Lit13, 0x3d, 0, 0, 0, Null, Null) \ + X(Lit14, 0x3e, 0, 0, 0, Null, Null) \ + X(Lit15, 0x3f, 0, 0, 0, Null, Null) \ + X(Lit16, 0x40, 0, 0, 0, Null, Null) \ + X(Lit17, 0x41, 0, 0, 0, Null, Null) \ + X(Lit18, 0x42, 0, 0, 0, Null, Null) \ + X(Lit19, 0x43, 0, 0, 0, Null, Null) \ + X(Lit20, 0x44, 0, 0, 0, Null, Null) \ + X(Lit21, 0x45, 0, 0, 0, Null, Null) \ + X(Lit22, 0x46, 0, 0, 0, Null, Null) \ + X(Lit23, 0x47, 0, 0, 0, Null, Null) \ + X(Lit24, 0x48, 0, 0, 0, Null, Null) \ + X(Lit25, 0x49, 0, 0, 0, Null, Null) \ + X(Lit26, 0x4a, 0, 0, 0, Null, Null) \ + X(Lit27, 0x4b, 0, 0, 0, Null, Null) \ + X(Lit28, 0x4c, 0, 0, 0, Null, Null) \ + X(Lit29, 0x4d, 0, 0, 0, Null, Null) \ + X(Lit30, 0x4e, 0, 0, 0, Null, Null) \ + X(Lit31, 0x4f, 0, 0, 0, Null, Null) \ + X(Reg0, 0x50, 0, 0, 1, Null, Null) \ + X(Reg1, 0x51, 0, 0, 1, Null, Null) \ + X(Reg2, 0x52, 0, 0, 1, Null, Null) \ + X(Reg3, 0x53, 0, 0, 1, Null, Null) \ + X(Reg4, 0x54, 0, 0, 1, Null, Null) \ + X(Reg5, 0x55, 0, 0, 1, Null, Null) \ + X(Reg6, 0x56, 0, 0, 1, Null, Null) \ + X(Reg7, 0x57, 0, 0, 1, Null, Null) \ + X(Reg8, 0x58, 0, 0, 1, Null, Null) \ + X(Reg9, 0x59, 0, 0, 1, Null, Null) \ + X(Reg10, 0x5a, 0, 0, 1, Null, Null) \ + X(Reg11, 0x5b, 0, 0, 1, Null, Null) \ + X(Reg12, 0x5c, 0, 0, 1, Null, Null) \ + X(Reg13, 0x5d, 0, 0, 1, Null, Null) \ + X(Reg14, 0x5e, 0, 0, 1, Null, Null) \ + X(Reg15, 0x5f, 0, 0, 1, Null, Null) \ + X(Reg16, 0x60, 0, 0, 1, Null, Null) \ + X(Reg17, 0x61, 0, 0, 1, Null, Null) \ + X(Reg18, 0x62, 0, 0, 1, Null, Null) \ + X(Reg19, 0x63, 0, 0, 1, Null, Null) \ + X(Reg20, 0x64, 0, 0, 1, Null, Null) \ + X(Reg21, 0x65, 0, 0, 1, Null, Null) \ + X(Reg22, 0x66, 0, 0, 1, Null, Null) \ + X(Reg23, 0x67, 0, 0, 1, Null, Null) \ + X(Reg24, 0x68, 0, 0, 1, Null, Null) \ + X(Reg25, 0x69, 0, 0, 1, Null, Null) \ + X(Reg26, 0x6a, 0, 0, 1, Null, Null) \ + X(Reg27, 0x6b, 0, 0, 1, Null, Null) \ + X(Reg28, 0x6c, 0, 0, 1, Null, Null) \ + X(Reg29, 0x6d, 0, 0, 1, Null, Null) \ + X(Reg30, 0x6e, 0, 0, 1, Null, Null) \ + X(Reg31, 0x6f, 0, 0, 1, Null, Null) \ + X(BReg0, 0x70, 1, 0, 1, SLEB128, Null) \ + X(BReg1, 0x71, 1, 0, 1, SLEB128, Null) \ + X(BReg2, 0x72, 1, 0, 1, SLEB128, Null) \ + X(BReg3, 0x73, 1, 0, 1, SLEB128, Null) \ + X(BReg4, 0x74, 1, 0, 1, SLEB128, Null) \ + X(BReg5, 0x75, 1, 0, 1, SLEB128, Null) \ + X(BReg6, 0x76, 1, 0, 1, SLEB128, Null) \ + X(BReg7, 0x77, 1, 0, 1, SLEB128, Null) \ + X(BReg8, 0x78, 1, 0, 1, SLEB128, Null) \ + X(BReg9, 0x79, 1, 0, 1, SLEB128, Null) \ + X(BReg10, 0x7a, 1, 0, 1, SLEB128, Null) \ + X(BReg11, 0x7b, 1, 0, 1, SLEB128, Null) \ + X(BReg12, 0x7c, 1, 0, 1, SLEB128, Null) \ + X(BReg13, 0x7d, 1, 0, 1, SLEB128, Null) \ + X(BReg14, 0x7e, 1, 0, 1, SLEB128, Null) \ + X(BReg15, 0x7f, 1, 0, 1, SLEB128, Null) \ + X(BReg16, 0x80, 1, 0, 1, SLEB128, Null) \ + X(BReg17, 0x81, 1, 0, 1, SLEB128, Null) \ + X(BReg18, 0x82, 1, 0, 1, SLEB128, Null) \ + X(BReg19, 0x83, 1, 0, 1, SLEB128, Null) \ + X(BReg20, 0x84, 1, 0, 1, SLEB128, Null) \ + X(BReg21, 0x85, 1, 0, 1, SLEB128, Null) \ + X(BReg22, 0x86, 1, 0, 1, SLEB128, Null) \ + X(BReg23, 0x87, 1, 0, 1, SLEB128, Null) \ + X(BReg24, 0x88, 1, 0, 1, SLEB128, Null) \ + X(BReg25, 0x89, 1, 0, 1, SLEB128, Null) \ + X(BReg26, 0x8a, 1, 0, 1, SLEB128, Null) \ + X(BReg27, 0x8b, 1, 0, 1, SLEB128, Null) \ + X(BReg28, 0x8c, 1, 0, 1, SLEB128, Null) \ + X(BReg29, 0x8d, 1, 0, 1, SLEB128, Null) \ + X(BReg30, 0x8e, 1, 0, 1, SLEB128, Null) \ + X(BReg31, 0x8f, 1, 0, 1, SLEB128, Null) \ + X(RegX, 0x90, 1, 0, 1, ULEB128, Null) \ + X(FBReg, 0x91, 1, 0, 1, SLEB128, Null) \ + X(BRegX, 0x92, 2, 0, 1, ULEB128, SLEB128) \ + X(Piece, 0x93, 1, 0, 0, ULEB128, Null) \ + X(DerefSize, 0x94, 1, 1, 1, U8, Null) \ + X(XDerefSize, 0x95, 1, 2, 1, U8, Null) \ + X(Nop, 0x96, 0, 0, 0, Null, Null) \ + X(PushObjectAddress, 0x97, 0, 0, 1, Null, Null) \ + X(Call2, 0x98, 1, 0, 0, U16, Null) \ + X(Call4, 0x99, 1, 0, 0, U32, Null) \ + X(CallRef, 0x9a, 1, 0, 0, DwarfUInt,Null) \ + X(FormTlsAddress, 0x9b, 0, 0, 1, Null, Null) \ + X(CallFrameCfa, 0x9c, 0, 0, 1, Null, Null) \ + X(BitPiece, 0x9d, 2, 0, 0, ULEB128, ULEB128) -#define DW_Expr_V5_XList(X) \ -X(ImplicitPointer, 0xa0, 2, 0, 1) \ -X(Addrx, 0xa1, 1, 0, 1) \ -X(Constx, 0xa2, 1, 0, 1) \ -X(EntryValue, 0xa3, 2, 0, 0) \ -X(ConstType, 0xa4, 3, 0, 1) \ -X(RegvalType, 0xa5, 2, 0, 1) \ -X(DerefType, 0xa6, 2, 1, 1) \ -X(XDerefType, 0xa7, 2, 2, 1) \ -X(Convert, 0xa8, 1, 1, 1) \ -X(Reinterpret, 0xa9, 1, 1, 1) +#define DW_Expr_V4_XList \ + X(ImplicitValue, 0x9e, 2, 0, 1, Block, Null) \ + X(StackValue, 0x9f, 0, 0, 0, Null, Null) -#define DW_Expr_GNU_XList(X) \ -X(GNU_PushTlsAddress, 0xe0, 0, 0, 1) \ -X(GNU_UnInit, 0xf0, 0, 0, 0) \ -X(GNU_ImplicitPointer, 0xf2, 2, 0, 1) \ -X(GNU_EntryValue, 0xf3, 2, 0, 0) \ -X(GNU_ConstType, 0xf4, 3, 0, 1) \ -X(GNU_RegvalType, 0xf5, 2, 0, 1) \ -X(GNU_DerefType, 0xf6, 2, 1, 1) \ -X(GNU_Convert, 0xf7, 1, 1, 1) \ -X(GNU_ParameterRef, 0xfa, 1, 0, 0) \ -X(GNU_AddrIndex, 0xfb, 0, 0, 1) \ -X(GNU_ConstIndex, 0xfc, 1, 0, 1) +#define DW_Expr_V5_XList \ + X(ImplicitPointer, 0xa0, 2, 0, 1, DwarfUInt, SLEB128) \ + X(Addrx, 0xa1, 1, 0, 1, ULEB128, Null) \ + X(Constx, 0xa2, 1, 0, 1, ULEB128, Null) \ + X(EntryValue, 0xa3, 1, 0, 0, Block, Null) \ + X(ConstType, 0xa4, 2, 0, 1, ULEB128, Block) \ + X(RegvalType, 0xa5, 2, 0, 1, ULEB128, ULEB128) \ + X(DerefType, 0xa6, 2, 1, 1, U8, ULEB128) \ + X(XDerefType, 0xa7, 2, 2, 1, U8, ULEB128) \ + X(Convert, 0xa8, 1, 1, 1, ULEB128, Null) \ + X(Reinterpret, 0xa9, 1, 1, 1, ULEB128, Null) + +#define DW_Expr_GNU_XList \ + X(GNU_PushTlsAddress, 0xe0, 0, 0, 1, Null, Null) \ + X(GNU_UnInit, 0xf0, 0, 0, 0, Null, Null) \ + X(GNU_ImplicitPointer, 0xf2, 2, 0, 1, DwarfUInt, SLEB128) \ + X(GNU_EntryValue, 0xf3, 1, 0, 0, Block, Null) \ + X(GNU_ConstType, 0xf4, 2, 0, 1, ULEB128, Block) \ + X(GNU_RegvalType, 0xf5, 2, 0, 1, ULEB128, ULEB128) \ + X(GNU_DerefType, 0xf6, 2, 1, 1, U8, ULEB128) \ + X(GNU_Convert, 0xf7, 1, 1, 1, ULEB128, Null) \ + X(GNU_ParameterRef, 0xfa, 1, 0, 0, U32, Null) \ + X(GNU_AddrIndex, 0xfb, 0, 0, 1, Null, Null) \ + X(GNU_ConstIndex, 0xfc, 1, 0, 1, ULEB128, Null) typedef U8 DW_ExprOp; typedef enum DW_ExprOpEnum { -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) DW_ExprOp_##_N = _ID, - DW_Expr_V3_XList(X) - DW_Expr_V4_XList(X) - DW_Expr_V5_XList(X) - DW_Expr_GNU_XList(X) +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) DW_ExprOp_##_N = _ID, + DW_Expr_V3_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X } DW_ExprOpEnum; @@ -1745,9 +1763,10 @@ internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B internal U64 dw_pick_default_lower_bound(DW_Language lang); -internal U64 dw_operand_count_from_expr_op(DW_ExprOp op); -internal U64 dw_pop_count_from_expr_op(DW_ExprOp op); -internal U64 dw_push_count_from_expr_op(DW_ExprOp op); +internal U64 dw_operand_count_from_expr_op(DW_ExprOp op); +internal U64 dw_pop_count_from_expr_op(DW_ExprOp op); +internal U64 dw_push_count_from_expr_op(DW_ExprOp op); +internal DW_ExprOperandType * dw_operand_types_from_expr_opcode(DW_ExprOp op); //////////////////////////////// //~ CFA diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index fb824763..f81afa4c 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1417,3 +1417,104 @@ exit:; return result; } +internal String8 +dw_encode_expr(Arena *arena, DW_Format format, U64 addr_size, DW_ExprEnc *encs, U64 encs_count) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List *srl = push_array(scratch.arena, String8List, 1); + str8_serial_begin(scratch.arena, srl); + + for EachIndex(i, encs_count) { + DW_ExprEnc *e = &encs[i]; + + switch (e->type) { + case DW_ExprEncType_Op: { + str8_serial_push_struct(scratch.arena, srl, &e->op); + } break; + case DW_ExprEncType_U8: { + str8_serial_push_struct(scratch.arena, srl, &e->u8); + } break; + case DW_ExprEncType_U16: { + str8_serial_push_struct(scratch.arena, srl, &e->u16); + } break; + case DW_ExprEncType_U32: { + str8_serial_push_struct(scratch.arena, srl, &e->u32); + } break; + case DW_ExprEncType_U64: { + str8_serial_push_struct(scratch.arena, srl, &e->u64); + } break; + case DW_ExprEncType_S8: { + str8_serial_push_struct(scratch.arena, srl, &e->s8); + } break; + case DW_ExprEncType_S16: { + str8_serial_push_struct(scratch.arena, srl, &e->s16); + } break; + case DW_ExprEncType_S32: { + str8_serial_push_struct(scratch.arena, srl, &e->s32); + } break; + case DW_ExprEncType_S64: { + str8_serial_push_struct(scratch.arena, srl, &e->s64); + } break; + case DW_ExprEncType_ULEB128: { + U64 buffer_size = 0; + U8 buffer[10]; + for (U64 value = e->u64; value != 0; ) { + U8 byte = value & 0x7f; + value >>= 7; + if (value != 0) { + byte |= 0x80; + } + Assert(buffer_size < sizeof(buffer)); + buffer[buffer_size++] = byte; + } + str8_serial_push_string(scratch.arena, srl, str8(buffer, buffer_size)); + } break; + case DW_ExprEncType_SLEB128: { + U64 buffer_size = 0; + U8 buffer[10]; + for (S64 value = e->s64, more = 1; more != 0; ) { + U8 byte = value & 0x7f; + value >>= 7; + U8 sign_bit = byte & 0x40; + if ((value == 0 && sign_bit == 0) || (value == -1 && sign_bit != 0)) { + more = 0; + } else { + byte |= 0x80; + } + Assert(buffer_size < sizeof(buffer)); + buffer[buffer_size++] = byte; + } + str8_serial_push_string(scratch.arena, srl, str8(buffer, buffer_size)); + } break; + case DW_ExprEncType_Addr: { + Assert(addr_size <= sizeof(e->addr)); + str8_serial_push_string(scratch.arena, srl, str8((U8 *)&e->addr, addr_size)); + } break; + case DW_ExprEncType_Block: { + Assert(e->block.size <= max_U8); + str8_serial_push_u8(scratch.arena, srl, (U8)e->block.size); + str8_serial_push_string(scratch.arena, srl, e->block); + } break; + case DW_ExprEncType_DwarfUInt: { + switch (format) { + case DW_Format_Null: {} break; + case DW_Format_32Bit: { str8_serial_push_u32(scratch.arena, srl, e->u32); } break; + case DW_Format_64Bit: { str8_serial_push_u64(scratch.arena, srl, e->u64); } break; + default: { InvalidPath; } break; + } + } break; + case DW_ExprEncType_Label: { + // TODO: + } break; + case DW_ExprEncType_DeclLabel: { + // TODO: + } break; + default: { InvalidPath; } break; + } + } + + String8 expr = str8_serial_end(arena, srl); + scratch_end(scratch); + return expr; +} + diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index d9d3f0c7..c1ac240f 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -4,6 +4,9 @@ #ifndef DWARF_EXPR_H #define DWARF_EXPR_H +//////////////////////////////// +// evaluator + typedef struct DW_ExprContext { Arch arch; @@ -115,6 +118,66 @@ typedef struct DW_ExprResult int x; } DW_ExprResult; +//////////////////////////////// +// encoder + +typedef enum +{ + DW_ExprEncType_Null, + DW_ExprEncType_Op, + DW_ExprEncType_U8, + DW_ExprEncType_U16, + DW_ExprEncType_U32, + DW_ExprEncType_U64, + DW_ExprEncType_S8, + DW_ExprEncType_S16, + DW_ExprEncType_S32, + DW_ExprEncType_S64, + DW_ExprEncType_ULEB128, + DW_ExprEncType_SLEB128, + DW_ExprEncType_Addr, + DW_ExprEncType_Block, + DW_ExprEncType_DwarfUInt, + DW_ExprEncType_Label, + DW_ExprEncType_DeclLabel, +} DW_ExprEncType; + +typedef struct DW_ExprEnc +{ + DW_ExprEncType type; + union { + DW_ExprOp op; + U8 u8; + U16 u16; + U32 u32; + U64 u64; + S8 s8; + S16 s16; + S32 s32; + S64 s64; + U64 addr; + String8 block; + char *label; + }; +} DW_ExprEnc; + +#define DW_ExprEnc_Op(v) { .type = DW_ExprEncType_Op, .op = DW_ExprOp_##v } +#define DW_ExprEnc_U8(v) { .type = DW_ExprEncType_U8, .u8 = v } +#define DW_ExprEnc_U16(v) { .type = DW_ExprEncType_U16, .u16 = v } +#define DW_ExprEnc_U32(v) { .type = DW_ExprEncType_U32, .u32 = v } +#define DW_ExprEnc_U64(v) { .type = DW_ExprEncType_U64, .u64 = v } +#define DW_ExprEnc_S8(v) { .type = DW_ExprEncType_S8, .s8 = v } +#define DW_ExprEnc_S16(v) { .type = DW_ExprEncType_S16, .s16 = v } +#define DW_ExprEnc_S32(v) { .type = DW_ExprEncType_S32, .s32 = v } +#define DW_ExprEnc_S64(v) { .type = DW_ExprEncType_S64, .s64 = v } +#define DW_ExprEnc_ULEB128(v) { .type = DW_ExprEncType_ULEB128, .u64 = v } +#define DW_ExprEnc_SLEB128(v) { .type = DW_ExprEncType_SLEB128, .s64 = v } +#define DW_ExprEnc_Addr(v) { .type = DW_ExprEncType_Addr, .addr = v } +#define DW_ExprEnc_Block(v) { .type = DW_ExprEncType_Block, .block = v } +#define DW_ExprEnc_UInt(v) { .type = DW_ExprEncType_DwarfUInt, .u64 = v } +#define DW_ExprEnc_Label(v) { .type = DW_ExprEncType_Label, .label = v } +#define DW_ExprEnc_DeclLabel(v) { .type = DW_ExprEncType_DeclLabel, .label = v } + //////////////////////////////// // pieces @@ -174,5 +237,8 @@ internal String8 dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprV // evaluator internal DW_UnwindStatus dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out); +// encoder +internal String8 dw_encode_expr(Arena *arena, DW_Format format, U64 addr_size, DW_ExprEnc *encs, U64 encs_count); + #endif //DWARF_EXPR_H diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 8559b08d..3e2a4a1b 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -3116,210 +3116,59 @@ internal DW_Expr dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data) { DW_Expr expr = {0}; - for (U64 cursor = 0; cursor < data.size; ) { - U64 inst_start = cursor; - + for (U64 cursor = 0, inst_start = 0; cursor < data.size; inst_start = cursor) { + // read opcode DW_ExprOp opcode = 0; - cursor += str8_deserial_read_struct(data, cursor, &opcode); + U64 opcode_size = str8_deserial_read_struct(data, cursor, &opcode); + if (opcode_size == 0) { break; } + cursor += opcode_size; - DW_ExprOperand operands[4] = {0}; - switch (opcode) { - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { - // implicit operands - } break; - case DW_ExprOp_Const1U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); } break; - case DW_ExprOp_Const2U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); } break; - case DW_ExprOp_Const4U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); } break; - case DW_ExprOp_Const8U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_Const1S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s8); } break; - case DW_ExprOp_Const2S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); } break; - case DW_ExprOp_Const4S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s32); } break; - case DW_ExprOp_Const8S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s64); } break; - case DW_ExprOp_ConstU: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_ConstS: { cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); } break; - case DW_ExprOp_Addr: { cursor += str8_deserial_read(data, cursor, &operands[0].u64, addr_size, addr_size); } break; - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { - // implicit operands - } break; - case DW_ExprOp_RegX: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break; - case DW_ExprOp_ImplicitValue: { - U64 value_size = 0; String8 value = {0}; - cursor += str8_deserial_read_uleb128(data, cursor, &value_size); - cursor += str8_deserial_read_block(data, cursor, value_size, &operands[0].block); - } break; - case DW_ExprOp_Piece: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_BitPiece: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_Pick: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_PlusUConst: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_Skip: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); - } break; - case DW_ExprOp_Bra: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16); - } break; - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { - cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); - } break; - case DW_ExprOp_BRegX: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); - } break; - case DW_ExprOp_FBReg: { - cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); - } break; - case DW_ExprOp_Deref: { - // no operands - } break; - case DW_ExprOp_DerefSize: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_XDerefSize: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - } break; - case DW_ExprOp_Call2: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16); - } break; - case DW_ExprOp_Call4: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); - } break; - case DW_ExprOp_CallRef: { - cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); - } break; - case DW_ExprOp_ImplicitPointer: - case DW_ExprOp_GNU_ImplicitPointer: { - cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64); - cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64); - } break; - case DW_ExprOp_Convert: - case DW_ExprOp_GNU_Convert: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_GNU_ParameterRef: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32); - } break; - case DW_ExprOp_DerefType: - case DW_ExprOp_GNU_DerefType: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_XDerefType: { - cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_ConstType: - case DW_ExprOp_GNU_ConstType: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_struct(data, cursor, &operands[1].u8); - cursor += str8_deserial_read_block(data, cursor, operands[1].u8, &operands[2].block); - } break; - case DW_ExprOp_RegvalType: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64); - } break; - case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: { - U64 entry_value_expr_size = 0; - cursor += str8_deserial_read_uleb128(data, cursor, &entry_value_expr_size); - cursor += str8_deserial_read_block(data, cursor, entry_value_expr_size, &operands[0].block); - } break; - case DW_ExprOp_Addrx: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_Constx: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_CallFrameCfa: - case DW_ExprOp_FormTlsAddress: - case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_Nop: - case DW_ExprOp_Eq: - case DW_ExprOp_Ge: - case DW_ExprOp_Gt: - case DW_ExprOp_Le: - case DW_ExprOp_Lt: - case DW_ExprOp_Ne: - case DW_ExprOp_Shl: - case DW_ExprOp_Shr: - case DW_ExprOp_Shra: - case DW_ExprOp_Xor: - case DW_ExprOp_XDeref: - case DW_ExprOp_Abs: - case DW_ExprOp_And: - case DW_ExprOp_Div: - case DW_ExprOp_Minus: - case DW_ExprOp_Mod: - case DW_ExprOp_Mul: - case DW_ExprOp_Neg: - case DW_ExprOp_Not: - case DW_ExprOp_Or: - case DW_ExprOp_Plus: - case DW_ExprOp_Rot: - case DW_ExprOp_Swap: - case DW_ExprOp_Dup: - case DW_ExprOp_Drop: - case DW_ExprOp_Over: - case DW_ExprOp_StackValue: - case DW_ExprOp_GNU_PushTlsAddress: { - // no operands - } break; - case DW_ExprOp_GNU_AddrIndex: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - case DW_ExprOp_GNU_ConstIndex: { - cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); - } break; - default: { InvalidPath; } break; + // read operands + U64 operand_count = dw_operand_count_from_expr_op(opcode); + DW_ExprOperandType *operand_types = dw_operand_types_from_expr_opcode(opcode); + DW_ExprOperand operands[2] = {0}; + for EachIndex(operand_idx, operand_count) { + U64 operand_size = 0; + switch (operand_types[operand_idx]) { + case DW_ExprOperandType_Null: { } break; + case DW_ExprOperandType_U8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u8); } break; + case DW_ExprOperandType_U16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u16); } break; + case DW_ExprOperandType_U32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u32); } break; + case DW_ExprOperandType_U64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_S8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s8); } break; + case DW_ExprOperandType_S16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s16); } break; + case DW_ExprOperandType_S32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s32); } break; + case DW_ExprOperandType_S64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s64); } break; + case DW_ExprOperandType_ULEB128: { operand_size = str8_deserial_read_uleb128(data, cursor, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_SLEB128: { operand_size = str8_deserial_read_sleb128(data, cursor, &operands[operand_idx].s64); } break; + case DW_ExprOperandType_Addr: { operand_size = str8_deserial_read(data, cursor, &operands[operand_idx].u64, addr_size, addr_size); } break; + case DW_ExprOperandType_DwarfUInt: { operand_size = str8_deserial_read_dwarf_uint(data, cursor, format, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_Block: { + U8 block_size; + U64 block_size_size = str8_deserial_read_struct(data, cursor, &block_size); + U64 block_read_size = str8_deserial_read_block(data, cursor + block_size_size, block_size, &operands[operand_idx].block); + if(block_read_size == block_size_size) { + operand_size = block_size_size + block_read_size; + } + } break; + default: { InvalidPath; } break; + } + if (operand_size == 0) { goto exit; } + cursor += operand_size; } - U64 operand_count = dw_operand_count_from_expr_op(opcode); + // fill out instruction DW_ExprInst *inst = push_array(arena, DW_ExprInst, 1); inst->opcode = opcode; inst->size = cursor - inst_start; inst->operands = push_array(arena, DW_ExprOperand, operand_count); MemoryCopy(inst->operands, operands, operand_count * sizeof(DW_ExprOperand)); + // push instruction DLLPushBack(expr.first, expr.last, inst); expr.count += 1; } +exit:; return expr; } diff --git a/src/torture/dwarf_expr_test.c b/src/torture/dwarf_expr_test.c new file mode 100644 index 00000000..5035d0a2 --- /dev/null +++ b/src/torture/dwarf_expr_test.c @@ -0,0 +1,49 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#define BUILD_CONSOLE_INFERFACE 1 +#define BUILD_TITLE "DWARF Expr Test" + +//////////////////////////////// + +#include "third_party/xxHash/xxhash.c" +#include "third_party/xxHash/xxhash.h" +#include "third_party/radsort/radsort.h" + +//////////////////////////////// + +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "linker/hash_table.h" +#include "coff/coff.h" +#include "elf/elf.h" +#include "elf/elf_parse.h" +#include "dwarf/dwarf_inc.h" + +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "coff/coff.c" +#include "elf/elf.c" +#include "elf/elf_parse.c" +#include "linker/hash_table.c" +#include "dwarf/dwarf_inc.c" + +//////////////////////////////// + +internal void +entry_point(CmdLine *cmdline) +{ + Temp scratch = scratch_begin(0, 0); + + { + DW_ExprEnc program[] = { + DW_ExprEnc_DeclLabel("foo"), + DW_ExprEnc_Op(BReg11), DW_ExprEnc_S64(44), + DW_ExprEnc_Op(Skip), DW_ExprEnc_Label("foo"), + }; + String8 expr_data = dw_encode_expr(scratch.arena, DW_Format_64Bit, sizeof(U64), program, ArrayCount(program)); + } + + scratch_end(scratch); +} + From 952afd49a7da60bcd92826a7c185467d6a5e7a1e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 16 Dec 2025 10:40:48 -0800 Subject: [PATCH 101/850] generalize machine ops --- src/base/base_core.h | 23 ++++++ src/ctrl/ctrl_core.c | 111 ++++++++--------------------- src/demon/linux/demon_core_linux.c | 18 ++--- src/dwarf/dwarf_unwind.c | 32 ++++----- src/dwarf/dwarf_unwind.h | 2 +- src/gnu/gnu_parse.c | 14 ++-- src/gnu/gnu_parse.h | 8 +-- 7 files changed, 89 insertions(+), 119 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index 80ffc909..3455562a 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -678,6 +678,29 @@ union Guid }; StaticAssert(sizeof(Guid) == 16, g_guid_size_check); +//////////////////////////////// +//~ Machine Ops + +typedef enum MachineOpResult +{ + MachineOpResult_Null, + MachineOpResult_Ok, + MachineOpResult_Fail, + MachineOpResult_Maybe, +} MachineOpResult; + +#define MACHINE_OP_REG_READ(name) MachineOpResult name(U64 reg_id, void *buffer, U64 buffer_max, void *ud) +typedef MACHINE_OP_REG_READ(MachineOp_RegRead); + +#define MACHINE_OP_REG_WRITE(name) MachineOpResult name(U64 reg_id, void *value, U64 value_size, void *ud) +typedef MACHINE_OP_REG_WRITE(MachineOp_RegWrite); + +#define MACHINE_OP_MEM_READ(name) MachineOpResult name(U64 addr, void *buffer, U64 buffer_size, void *ud) +typedef MACHINE_OP_MEM_READ(MachineOp_MemRead); + +#define MACHINE_OP_MEM_WRITE(name) MachineOpResult name(U64 addr, void *value, U64 value_size, void *ud) +typedef MACHINE_OP_MEM_WRITE(MachineOp_MemWrite); + //////////////////////////////// //~ rjf: Basic Constants diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 883e6358..9477b835 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1833,93 +1833,42 @@ typedef struct } CTRL_MemoryReadContextDwarfX64; internal -DW_MEM_READ(ctrl_unwind_mem_read_dwarf_x64) +MACHINE_OP_MEM_READ(ctrl_machine_mem_read) { CTRL_MemoryReadContextDwarfX64 *ctx = ud; B32 is_stale = 0; - B32 is_read = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + size), &is_stale, buffer, ctx->endt_us); + B32 is_read = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + buffer_size), &is_stale, buffer, ctx->endt_us); - DW_UnwindStatus status = DW_UnwindStatus_Fail; + MachineOpResult status = MachineOpResult_Fail; if(is_stale) { - status = DW_UnwindStatus_Maybe; + status = MachineOpResult_Maybe; } else if(is_read) { - status = DW_UnwindStatus_Ok; - } - - return status; -} - -internal -DW_REG_READ(ctrl_unwind_reg_read_dwarf_x64) -{ - // map DWARF register to -> the internal register - REGS_RegBlockX64 *regs = ud; - U64 reg_size = 0; void *reg_bytes = 0; - switch(reg_id) - { -#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; - DW_Regs_X64_XList(X) -#undef X - default: { InvalidPath; } break; - } - - // copy out register value - DW_UnwindStatus status = DW_UnwindStatus_Fail; - if(reg_size > 0) - { - AssertAlways(reg_size == buffer_max); - MemoryCopy(buffer, reg_bytes, reg_size); - status = DW_UnwindStatus_Ok; - } - - return status; -} - -internal -DW_REG_WRITE(ctrl_unwind_reg_write_dwarf_x64) -{ - // map DWARF register to -> the internal register - REGS_RegBlockX64 *regs = ud; - U64 reg_size = 0; void *reg_bytes = 0; - switch(reg_id) - { -#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; - DW_Regs_X64_XList(X) -#undef X - default: { InvalidPath; } break; - } - - // write value to the register - DW_UnwindStatus status = DW_UnwindStatus_Fail; - if(reg_size > 0) - { - AssertAlways(value_size <= reg_size); - MemoryCopy(reg_bytes, value, value_size); - status = DW_UnwindStatus_Ok; + status = MachineOpResult_Ok; } return status; } internal CTRL_UnwindStepResult -ctrl_unwind_step_result_from_dwarf_status(DW_UnwindStatus s) +ctrl_unwind_step_result_from_machine_op_result(MachineOpResult s) { CTRL_UnwindStepResult result = {0}; switch(s) { - case DW_UnwindStatus_Ok: + case MachineOpResult_Null: {} break; + case MachineOpResult_Ok: { result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); }break; - case DW_UnwindStatus_Fail: + case MachineOpResult_Fail: { result.flags |= CTRL_UnwindFlag_Error; }break; - case DW_UnwindStatus_Maybe: + case MachineOpResult_Maybe: { result.flags &= ~CTRL_UnwindFlag_Error; result.flags |= CTRL_UnwindFlag_Stale; @@ -2083,8 +2032,8 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han // setup machine ops void *mem_read_ctx = 0; void *reg_read_ctx = 0; - DW_MemRead *mem_read_func = 0; - DW_RegRead *reg_read_func = 0; + MachineOp_MemRead *mem_read_func = 0; + MachineOp_RegRead *reg_read_func = 0; switch(arch) { case Arch_Null: break; @@ -2094,11 +2043,11 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han mem_read_ctx_x64->process_handle = process_handle; mem_read_ctx_x64->endt_us = endt_us; - mem_read_ctx = mem_read_ctx_x64; - reg_read_ctx = regs; + mem_read_ctx = mem_read_ctx_x64; + reg_read_ctx = regs; - mem_read_func = ctrl_unwind_mem_read_dwarf_x64; - reg_read_func = ctrl_unwind_reg_read_dwarf_x64; + mem_read_func = ctrl_machine_mem_read; + reg_read_func = regs_read_dwarf_x64; }break; case Arch_x86: case Arch_arm64: @@ -2111,10 +2060,10 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han // compute CFA for the row U64 cfa = 0; - DW_UnwindStatus unwind_status = dw_compute_cfa(arch, cfi_row, mem_read_func, mem_read_ctx, reg_read_func, reg_read_ctx, &cfa); + MachineOpResult unwind_status = dw_compute_cfa(arch, cfi_row, mem_read_func, mem_read_ctx, reg_read_func, reg_read_ctx, &cfa); // on success fill out output - if(unwind_status == DW_UnwindStatus_Ok) + if(unwind_status == MachineOpResult_Ok) { ctx_out->cfa = cfa; ctx_out->cfi_row = cfi_row; @@ -2122,7 +2071,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han } // translate unwind status code - result = ctrl_unwind_step_result_from_dwarf_status(unwind_status); + result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); } } } @@ -2142,9 +2091,9 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_ void *mem_read_ctx = 0; void *reg_read_ctx = 0; void *reg_write_ctx = 0; - DW_MemRead *mem_read_func = 0; - DW_RegRead *reg_read_func = 0; - DW_RegWrite *reg_write_func = 0; + MachineOp_MemRead *mem_read_func = 0; + MachineOp_RegRead *reg_read_func = 0; + MachineOp_RegWrite *reg_write_func = 0; switch(arch) { case Arch_Null: break; @@ -2158,9 +2107,9 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_ reg_read_ctx = regs; reg_write_ctx = regs; - mem_read_func = ctrl_unwind_mem_read_dwarf_x64; - reg_read_func = ctrl_unwind_reg_read_dwarf_x64; - reg_write_func = ctrl_unwind_reg_write_dwarf_x64; + mem_read_func = ctrl_machine_mem_read; + reg_read_func = regs_read_dwarf_x64; + reg_write_func = regs_write_dwarf_x64; }break; case Arch_x86: case Arch_arm64: @@ -2172,7 +2121,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_ } // apply register rules to the context - DW_UnwindStatus unwind_status = dw_cfi_apply_register_rules(arch, + MachineOpResult unwind_status = dw_cfi_apply_register_rules(arch, frame_ctx->cfa, frame_ctx->cfi_row, mem_read_func, @@ -2189,7 +2138,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_ } // translate unwind status code - result = ctrl_unwind_step_result_from_dwarf_status(unwind_status); + result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); scratch_end(scratch); return result; @@ -3812,10 +3761,10 @@ ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_ //- rjf: module lifetime open/close work internal -DW_MEM_READ(ctrl_dmn_mem_read) +MACHINE_OP_MEM_READ(ctrl_dmn_mem_read) { - U64 read = dmn_process_read(((CTRL_Handle *)ud)->dmn_handle, r1u64(addr, addr + size), buffer); - return read == size ? DW_UnwindStatus_Ok : DW_UnwindStatus_Fail; + U64 read = dmn_process_read(((CTRL_Handle *)ud)->dmn_handle, r1u64(addr, addr + buffer_size), buffer); + return read == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; } internal void diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 9488dda6..56d4602e 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -117,6 +117,12 @@ dmn_lnx_read_string(Arena *arena, int memory_fd, U64 vaddr) return dmn_lnx_read_string_capped(arena, memory_fd, vaddr, 4096); } +internal +MACHINE_OP_MEM_READ(dmn_lnx_machine_op_mem_read) +{ + return dmn_lnx_read(((DMN_LNX_Entity *)ud)->fd, r1u64(addr, addr + buffer_size), buffer); +} + internal int dmn_lnx_ptrace_seize(pid_t pid) { @@ -673,12 +679,6 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) return dl_path; } -internal -GNU_MEM_READ(dmn_lnx_gnu_mem_read) -{ - return dmn_lnx_read(((DMN_LNX_Entity *)ud)->fd, r1u64(addr, addr + size), buffer); -} - //////////////////////////////// //~ SDT Probes @@ -1799,9 +1799,9 @@ dmn_lnx_hanlde_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity // mark live modules B32 is_64bit = process->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_gnu_mem_read, process); + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_machine_op_mem_read, process); for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { - GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_gnu_mem_read, process); + GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_machine_op_mem_read, process); for EachNode(link_map_n, GNU_LinkMapNode, link_map_list.first) { DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, link_map_n->v.addr_vaddr); module->is_live = 1; @@ -2078,7 +2078,7 @@ dmn_lnx_handle_attach(Arena *arena, DMN_EventList *events, pid_t pid) // extract modules from r_debug B32 is_64bit = process->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->rdebug_vaddr, dmn_lnx_gnu_mem_read, process); + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->rdebug_vaddr, dmn_lnx_machine_op_mem_read, process); U64 name_space_id = 0; for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index 27c37e66..d0130373 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -236,14 +236,14 @@ dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodeP return result; } -internal DW_UnwindStatus +internal MachineOpResult dw_compute_cfa(Arch arch, DW_CFI_Row *row, - DW_MemRead *mem_read_func, void *mem_read_ud, - DW_RegRead *reg_read_func, void *reg_read_ud, + MachineOp_MemRead *mem_read_func, void *mem_read_ud, + MachineOp_RegRead *reg_read_func, void *reg_read_ud, U64 *cfa_out) { - DW_UnwindStatus unwind_status = DW_UnwindStatus_Fail; + MachineOpResult unwind_status = MachineOpResult_Fail; switch (row->cfa.rule) { case DW_CFA_Rule_Null: break; @@ -253,7 +253,7 @@ dw_compute_cfa(Arch arch, U64 reg_size = dw_reg_size_from_code(arch, row->cfa.reg); AssertAlways(reg_size <= sizeof(cfa_reg_value)); unwind_status = reg_read_func(row->cfa.reg, &cfa_reg_value, reg_size, reg_read_ud); - if (unwind_status != DW_UnwindStatus_Ok) { break; } + if (unwind_status != MachineOpResult_Ok) { break; } *cfa_out = cfa_reg_value + row->cfa.off; } break; case DW_CFA_Rule_Expression: { @@ -265,16 +265,16 @@ dw_compute_cfa(Arch arch, return unwind_status; } -internal DW_UnwindStatus +internal MachineOpResult dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, - DW_MemRead *mem_read_func, void *mem_read_ud, - DW_RegRead *reg_read_func, void *reg_read_ud, - DW_RegWrite *reg_write_func, void *reg_write_ud) + MachineOp_MemRead *mem_read_func, void *mem_read_ud, + MachineOp_RegRead *reg_read_func, void *reg_read_ud, + MachineOp_RegWrite *reg_write_func, void *reg_write_ud) { Temp scratch = scratch_begin(0,0); - DW_UnwindStatus unwind_status = DW_UnwindStatus_Ok; + MachineOpResult unwind_status = MachineOpResult_Ok; U64 max_reg_size = dw_reg_max_size_from_arch(arch); void *reg_buffer = push_array(scratch.arena, U8, max_reg_size); @@ -289,12 +289,12 @@ dw_cfi_apply_register_rules(Arch arch, // read register value from memory U64 addr = cfa + reg->n; U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - unwind_status = mem_read_func(addr, reg_size, reg_buffer, mem_read_ud); - if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } + unwind_status = mem_read_func(addr, reg_buffer, reg_size, mem_read_ud); + if (unwind_status != MachineOpResult_Ok) { goto exit; } // write register value to the thread context unwind_status = reg_write_func(reg_idx, reg_buffer, reg_size, reg_write_ud); - if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } + if (unwind_status != MachineOpResult_Ok) { goto exit; } } break; case DW_CFI_RegisterRule_ValOffset: { // compute register value @@ -303,17 +303,17 @@ dw_cfi_apply_register_rules(Arch arch, // write register value to the thread context U64 reg_size = dw_reg_size_from_code(arch, reg_idx); unwind_status = reg_write_func(reg_idx, ®_value, reg_size, reg_write_ud); - if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } + if (unwind_status != MachineOpResult_Ok) { goto exit; } } break; case DW_CFI_RegisterRule_Register: { // read register value from another register U64 reg_size = dw_reg_size_from_code(arch, reg_idx); unwind_status = reg_read_func(reg->n, reg_buffer, reg_size, reg_read_ud); - if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } + if (unwind_status != MachineOpResult_Ok) { goto exit; } // write register value to the thread context unwind_status = reg_write_func(reg_idx, reg_buffer, reg_size, reg_write_ud); - if (unwind_status != DW_UnwindStatus_Ok) { goto exit; } + if (unwind_status != MachineOpResult_Ok) { goto exit; } } break; case DW_CFI_RegisterRule_Expression: { // TODO: evaluate expression diff --git a/src/dwarf/dwarf_unwind.h b/src/dwarf/dwarf_unwind.h index 904b7df4..510057e2 100644 --- a/src/dwarf/dwarf_unwind.h +++ b/src/dwarf/dwarf_unwind.h @@ -74,7 +74,7 @@ internal DW_CFI_Unwind * dw_cfi_unwind_init(Arena *arena, Arch arch, DW_CIE *cie internal B32 dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw); internal DW_CFI_Row * dw_cfi_row_from_pc(Arena *arena, Arch arch, struct DW_CIE *cie, struct DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc); -internal DW_UnwindStatus dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, DW_MemRead *mem_read_func, void *mem_read_ud, DW_RegRead *reg_read_func, void *reg_read_ud, DW_RegWrite *reg_write_func, void *reg_write_ud); +internal MachineOpResult dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, MachineOp_MemRead *mem_read_func, void *mem_read_ud, MachineOp_RegRead *reg_read_func, void *reg_read_ud, MachineOp_RegWrite *reg_write_func, void *reg_write_ud); #endif // DWARF_UNWIND_H diff --git a/src/gnu/gnu_parse.c b/src/gnu/gnu_parse.c index 5ea387a9..f68dc5d5 100644 --- a/src/gnu/gnu_parse.c +++ b/src/gnu/gnu_parse.c @@ -2,24 +2,24 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) internal GNU_RDebugInfoList -gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud) +gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, MachineOp_MemRead *mem_read_func, void *mem_read_ud) { GNU_RDebugInfoList result = {0}; for (U64 rdebug_vaddr = first_rdebug_vaddr, rdebug_next = 0; rdebug_vaddr != 0; rdebug_vaddr = rdebug_next) { GNU_RDebugInfo64 rdebug; if (is_64bit) { - U64 rdebug_read_size = mem_read_func(rdebug_vaddr, sizeof(rdebug), &rdebug, mem_read_ud); + U64 rdebug_read_size = mem_read_func(rdebug_vaddr, &rdebug, sizeof(rdebug),mem_read_ud); if (rdebug_read_size != sizeof(rdebug)) { goto exit; } } else { GNU_RDebugInfo32 rdebug32; - U64 rdebug_read_size = mem_read_func(rdebug_vaddr, sizeof(rdebug32), &rdebug32, mem_read_ud); + U64 rdebug_read_size = mem_read_func(rdebug_vaddr, &rdebug32, sizeof(rdebug32), mem_read_ud); if (rdebug_read_size != sizeof(rdebug32)) { goto exit; } } if (rdebug.r_version < 1) { goto exit; } if (rdebug.r_version > 1) { - U64 r_next_size = mem_read_func(rdebug_vaddr + sizeof(rdebug), sizeof(rdebug_next), &rdebug_next, mem_read_ud); + U64 r_next_size = mem_read_func(rdebug_vaddr + sizeof(rdebug), &rdebug_next, sizeof(rdebug_next), mem_read_ud); if (r_next_size != sizeof(rdebug_next)) { goto exit; } } @@ -34,18 +34,18 @@ gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead } internal GNU_LinkMapList -gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud) +gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, MachineOp_MemRead *mem_read_func, void *mem_read_ud) { GNU_LinkMapList result = {0}; GNU_LinkMap64 link_map = {0}; for (U64 link_map_vaddr = first_link_map_vaddr; link_map_vaddr != 0; link_map_vaddr = link_map.next_vaddr) { if (is_64bit) { - U64 link_map_size = mem_read_func(link_map_vaddr, sizeof(link_map), &link_map, mem_read_ud); + U64 link_map_size = mem_read_func(link_map_vaddr, &link_map, sizeof(link_map), mem_read_ud); if (link_map_size != sizeof(link_map)) { goto exit; } } else { GNU_LinkMap32 link_map32 = {0}; - U64 link_map_size = mem_read_func(link_map_vaddr, sizeof(link_map32), &link_map32, mem_read_ud); + U64 link_map_size = mem_read_func(link_map_vaddr, &link_map32, sizeof(link_map32), mem_read_ud); if (link_map_size != sizeof(link_map32)) { goto exit; } gnu_linkmap64_from_linkmap32(link_map32); } diff --git a/src/gnu/gnu_parse.h b/src/gnu/gnu_parse.h index 79f9a9ec..57fd74e3 100644 --- a/src/gnu/gnu_parse.h +++ b/src/gnu/gnu_parse.h @@ -30,12 +30,10 @@ typedef struct GNU_RDebugInfoList GNU_RDebugInfoNode *last; } GNU_RDebugInfoList; -#define GNU_MEM_READ(name) U64 name(U64 addr, U64 size, void *buffer, void *ud) -typedef GNU_MEM_READ(GNU_MemRead); - //////////////////////////////// -internal GNU_RDebugInfoList gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud); -internal GNU_LinkMapList gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, GNU_MemRead *mem_read_func, void *mem_read_ud); + +internal GNU_RDebugInfoList gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, MachineOp_MemRead *mem_read_func, void *mem_read_ud); +internal GNU_LinkMapList gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, MachineOp_MemRead *mem_read_func, void *mem_read_ud); #endif From 44123e971294b6608b15b6f29f995d4e7ee6621e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 16 Dec 2025 10:47:05 -0800 Subject: [PATCH 102/850] extend regs with DWARF registers mappings and read/write machine ops --- src/raddbg/raddbg_main.c | 2 + src/regs/dwarf/regs_dwarf.c | 77 +++++++++++++++++++++++++++++++++++++ src/regs/dwarf/regs_dwarf.h | 14 +++++++ 3 files changed, 93 insertions(+) create mode 100644 src/regs/dwarf/regs_dwarf.c create mode 100644 src/regs/dwarf/regs_dwarf.h diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 3c781ac6..7812a03a 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -229,6 +229,7 @@ #include "radbin/radbin.h" #include "regs/regs.h" #include "regs/rdi/regs_rdi.h" +#include "regs/dwarf/regs_dwarf.h" #include "dbg_info/dbg_info.h" #include "disasm/disasm.h" #include "stap/stap_parse.h" @@ -281,6 +282,7 @@ #include "radbin/radbin.c" #include "regs/regs.c" #include "regs/rdi/regs_rdi.c" +#include "regs/dwarf/regs_dwarf.c" #include "dbg_info/dbg_info.c" #include "disasm/disasm.c" #include "stap/stap_parse.c" diff --git a/src/regs/dwarf/regs_dwarf.c b/src/regs/dwarf/regs_dwarf.c new file mode 100644 index 00000000..93105e2d --- /dev/null +++ b/src/regs/dwarf/regs_dwarf.c @@ -0,0 +1,77 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal REGS_RegCode +reg_code_from_dw_reg_x64(DW_Reg reg) +{ + switch (reg) { +#define X(_SRC, _SRC_ID, _DST_ID, ...) case _SRC_ID: return REGS_RegCodeX64_##_DST_ID; + DW_Regs_X64_XList +#undef X + } + return REGS_RegCodeX64_NULL; +} + +internal REGS_RegCode +reg_code_from_dw_reg(Arch arch, DW_Reg reg) +{ + REGS_RegCode result = 0; + switch (arch) { + case Arch_Null: {} break; + case Arch_x64: { result = reg_code_from_dw_reg_x64(reg); } break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: { NotImplemented; } break; + default: { InvalidPath; } break; + } + return result; +} + +internal +MACHINE_OP_REG_READ(regs_read_dwarf_x64) +{ + // map DWARF register to -> the internal register + REGS_RegBlockX64 *regs = ud; + U64 reg_size = 0; void *reg_bytes = 0; + switch (reg_id) { +#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; + DW_Regs_X64_XList +#undef X + default: { InvalidPath; } break; + } + + // copy out register value + MachineOpResult status = MachineOpResult_Fail; + if (reg_size > 0) { + AssertAlways(reg_size == buffer_max); + MemoryCopy(buffer, reg_bytes, reg_size); + status = MachineOpResult_Ok; + } + + return status; +} + +internal +MACHINE_OP_REG_WRITE(regs_write_dwarf_x64) +{ + // map DWARF register to -> the internal register + REGS_RegBlockX64 *regs = ud; + U64 reg_size = 0; void *reg_bytes = 0; + switch (reg_id) { +#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; + DW_Regs_X64_XList +#undef X + default: { InvalidPath; } break; + } + + // write value to the register + MachineOpResult status = MachineOpResult_Fail; + if (reg_size > 0) { + AssertAlways(value_size <= reg_size); + MemoryCopy(reg_bytes, value, value_size); + status = MachineOpResult_Fail; + } + + return status; +} + diff --git a/src/regs/dwarf/regs_dwarf.h b/src/regs/dwarf/regs_dwarf.h new file mode 100644 index 00000000..37faf65a --- /dev/null +++ b/src/regs/dwarf/regs_dwarf.h @@ -0,0 +1,14 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef REGS_DWARF_H +#define REGS_DWARF_H + +internal REGS_RegCode reg_code_from_dw_reg_x64(DW_Reg reg); +internal REGS_RegCode reg_code_from_dw_reg(Arch arch, DW_Reg reg); + +internal MACHINE_OP_REG_READ(regs_read_dwarf_x64); +internal MACHINE_OP_REG_WRITE(regs_write_dwarf_x64); + +#endif // REGS_DWARF_H + From 2b4e0f8b7737b7968f1ec639ae9e3ad998c3c72d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 16 Dec 2025 11:12:43 -0800 Subject: [PATCH 103/850] WIP DWARF expression eval - fixup jump offsets after expression is serialized - use generalized machine ops for register reads - add option to limit number of executed opcodes --- src/dwarf/dwarf.c | 86 +- src/dwarf/dwarf.h | 2395 +++++++++++++-------------- src/dwarf/dwarf_expr.c | 111 +- src/dwarf/dwarf_expr.h | 66 +- src/dwarf/dwarf_parse.c | 4 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 2 +- 6 files changed, 1338 insertions(+), 1326 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 2d9a66e9..86bd56a4 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -6,7 +6,7 @@ dw_reg_size_from_code_x64(DW_Reg reg_code) { switch (reg_code) { #define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_size; - DW_Regs_X64_XList(X) + DW_Regs_X64_XList #undef X } return 0; @@ -17,7 +17,7 @@ dw_reg_pos_from_code_x64(DW_Reg reg_code) { switch (reg_code) { #define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_pos; - DW_Regs_X64_XList(X) + DW_Regs_X64_XList #undef X } return max_U64; @@ -84,7 +84,7 @@ dw_attrib_class_from_attrib_v2(DW_AttribKind k) { switch (k) { #define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_V2_XList(X) + DW_AttribKind_ClassFlags_V2_XList #undef X } return DW_AttribClass_Null; @@ -95,7 +95,7 @@ dw_attrib_class_from_attrib_v3(DW_AttribKind k) { switch (k) { #define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_V3_XList(X) + DW_AttribKind_ClassFlags_V3_XList #undef X } return DW_AttribClass_Null; @@ -106,7 +106,7 @@ dw_attrib_class_from_attrib_v4(DW_AttribKind k) { switch (k) { #define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_V4_XList(X) + DW_AttribKind_ClassFlags_V4_XList #undef X } return DW_AttribClass_Null; @@ -117,7 +117,7 @@ dw_attrib_class_from_attrib_v5(DW_AttribKind k) { switch (k) { #define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_V5_XList(X) + DW_AttribKind_ClassFlags_V5_XList #undef X } return DW_AttribClass_Null; @@ -128,7 +128,7 @@ dw_attrib_class_from_attrib_gnu(DW_AttribKind k) { switch (k) { #define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_GNU_XList(X) + DW_AttribKind_ClassFlags_GNU_XList #undef X } return DW_AttribClass_Null; @@ -139,7 +139,7 @@ dw_attrib_class_from_attrib_llvm(DW_AttribKind k) { switch (k) { #define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_LLVM_XList(X) + DW_AttribKind_ClassFlags_LLVM_XList #undef X } return DW_AttribClass_Null; @@ -150,7 +150,7 @@ dw_attrib_class_from_attrib_apple(DW_AttribKind k) { switch (k) { #define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_APPLE_XList(X) + DW_AttribKind_ClassFlags_APPLE_XList #undef X } return DW_AttribClass_Null; @@ -161,7 +161,7 @@ dw_attrib_class_from_attrib_mips(DW_AttribKind k) { switch (k) { #define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_MIPS_XList(X) + DW_AttribKind_ClassFlags_MIPS_XList #undef X } return DW_AttribClass_Null; @@ -215,28 +215,28 @@ dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k) #define X(_N,_C) case DW_Form_##_N: return _C; switch (k) { - DW_Form_AttribClass_GNU_XList(X) + DW_Form_AttribClass_GNU_XList } switch (ver) { case DW_Version_5: { switch (k) { - DW_Form_AttribClass_V5_XList(X) + DW_Form_AttribClass_V5_XList } } break; case DW_Version_4: { switch (k) { - DW_Form_AttribClass_V4_XList(X) + DW_Form_AttribClass_V4_XList } } break; case DW_Version_3: { switch (k) { - DW_Form_AttribClass_V2_XList(X) + DW_Form_AttribClass_V2_XList } } break; case DW_Version_2: { switch (k) { - DW_Form_AttribClass_V2_XList(X) + DW_Form_AttribClass_V2_XList } } break; case DW_Version_1: { @@ -261,7 +261,7 @@ dw_name_string_from_section_kind(DW_SectionKind k) { switch (k) { #define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_L); - DW_SectionKind_XList(X) + DW_SectionKind_XList #undef X } return str8_zero(); @@ -272,7 +272,7 @@ dw_mach_name_string_from_section_kind(DW_SectionKind k) { switch (k) { #define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_M); - DW_SectionKind_XList(X) + DW_SectionKind_XList #undef X } return str8_zero(); @@ -283,7 +283,7 @@ dw_dwo_name_string_from_section_kind(DW_SectionKind k) { switch (k) { #define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_D); - DW_SectionKind_XList(X) + DW_SectionKind_XList #undef X } return str8_zero(); @@ -460,7 +460,7 @@ dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode) { switch (opcode) { #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return ArrayCount(t)-1; } - DW_CFA_Kind_XList(X) + DW_CFA_Kind_XList #undef X default: { NotImplemented; } break; } @@ -513,7 +513,7 @@ dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode) { switch (opcode) { #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return &t[0] + 1; } - DW_CFA_Kind_XList(X) + DW_CFA_Kind_XList #undef X default: { NotImplemented; } break; } @@ -581,9 +581,9 @@ dw_string_from_tag_kind(Arena *arena, DW_TagKind kind) switch (kind) { case DW_TagKind_Null: return str8_lit("Null"); #define X(_N,_ID) case DW_TagKind_##_N: return str8_lit(Stringify(_N)); - DW_TagKind_V3_XList(X) - DW_TagKind_V5_XList(X) - DW_TagKind_GNU_XList(X) + DW_TagKind_V3_XList + DW_TagKind_V5_XList + DW_TagKind_GNU_XList #undef X } return push_str8f(arena, "%llx", kind); @@ -611,10 +611,10 @@ dw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKi { default:{}break; case DW_Ext_Null: break; - case DW_Ext_GNU: switch (kind) { DW_AttribKind_GNU_XList(X) } break; - case DW_Ext_LLVM: switch (kind) { DW_AttribKind_LLVM_XList(X) } break; - case DW_Ext_APPLE: switch (kind) { DW_AttribKind_APPLE_XList(X) } break; - case DW_Ext_MIPS: switch (kind) { DW_AttribKind_MIPS_XList(X) } break; + case DW_Ext_GNU: switch (kind) { DW_AttribKind_GNU_XList } break; + case DW_Ext_LLVM: switch (kind) { DW_AttribKind_LLVM_XList } break; + case DW_Ext_APPLE: switch (kind) { DW_AttribKind_APPLE_XList } break; + case DW_Ext_MIPS: switch (kind) { DW_AttribKind_MIPS_XList } break; } } } @@ -627,10 +627,10 @@ dw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKi DW_Version version = retry ? DW_Version_5 : ver; switch(version) { - case DW_Version_5: { switch(kind) { DW_AttribKind_V5_XList(X) } } // fall-through - case DW_Version_4: { switch(kind) { DW_AttribKind_V4_XList(X) } } // fall-through - case DW_Version_3: { switch(kind) { DW_AttribKind_V3_XList(X) } } // fall-through - case DW_Version_2: { switch(kind) { DW_AttribKind_V2_XList(X) } } // fall-through + case DW_Version_5: { switch(kind) { DW_AttribKind_V5_XList } } // fall-through + case DW_Version_4: { switch(kind) { DW_AttribKind_V4_XList } } // fall-through + case DW_Version_3: { switch(kind) { DW_AttribKind_V3_XList } } // fall-through + case DW_Version_2: { switch(kind) { DW_AttribKind_V2_XList } } // fall-through case DW_Version_1: {}break; case DW_Version_Null:{}break; default:{}break; @@ -655,18 +655,18 @@ dw_string_from_form_kind(Arena *arena, DW_Version ver, DW_FormKind kind) switch (ver) { case DW_Version_5: { switch (kind) { - DW_Form_V5_XList(X) + DW_Form_V5_XList } } // fall-through case DW_Version_4: { switch (kind) { - DW_Form_V4_XList(X) + DW_Form_V4_XList } } // fall-through case DW_Version_3: case DW_Version_2: { switch (kind) { - DW_Form_V2_XList(X) + DW_Form_V2_XList } } // fall-through case DW_Version_Null: break; @@ -681,7 +681,7 @@ dw_string_from_language(Arena *arena, DW_Language kind) { switch (kind) { #define X(_N,_ID) case DW_Language_##_N: return str8_lit(Stringify(_N)); - DW_Language_XList(X) + DW_Language_XList #undef X } return push_str8f(arena, "%x", kind); @@ -692,7 +692,7 @@ dw_string_from_inl(Arena *arena, DW_InlKind kind) { switch (kind) { #define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_Inl_XList(X) + DW_Inl_XList #undef X } return push_str8f(arena, "%x", kind); @@ -703,7 +703,7 @@ dw_string_from_access_kind(Arena *arena, DW_AccessKind kind) { switch (kind) { #define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_AccessKind_XList(X) + DW_AccessKind_XList #undef X } return push_str8f(arena, "%llx", kind); @@ -714,7 +714,7 @@ dw_string_from_calling_convetion(Arena *arena, DW_CallingConventionKind kind) { switch (kind) { #define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_CallingConventionKind_XList(X) + DW_CallingConventionKind_XList #undef X } return push_str8f(arena, "%llx", kind); @@ -725,7 +725,7 @@ dw_string_from_attrib_type_encoding(Arena *arena, DW_ATE kind) { switch (kind) { #define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_ATE_XList(X) + DW_ATE_XList #undef X } return push_str8f(arena, "%llx", kind); @@ -736,7 +736,7 @@ dw_string_from_std_opcode(Arena *arena, DW_StdOpcode kind) { switch (kind) { #define X(_N,_ID) case DW_StdOpcode_##_N: return str8_lit(Stringify(_N)); - DW_StdOpcode_XList(X) + DW_StdOpcode_XList #undef X } return push_str8f(arena, "%x", kind); @@ -747,7 +747,7 @@ dw_string_from_ext_opcode(Arena *arena, DW_ExtOpcode kind) { switch (kind) { #define X(_N,_ID) case DW_ExtOpcode_##_N: return str8_lit(Stringify(_N)); - DW_ExtOpcode_XList(X) + DW_ExtOpcode_XList #undef X default: InvalidPath; break; } @@ -784,7 +784,7 @@ dw_string_from_register(Arena *arena, Arch arch, U64 reg_id) case Arch_x64: { switch (reg_id) { #define X(_N, _ID, ...) case DW_RegX64_##_N: reg_str = str8_lit(Stringify(_N)); break; - DW_Regs_X64_XList(X) + DW_Regs_X64_XList #undef X } } break; @@ -804,7 +804,7 @@ dw_string_from_cfa_opcode(DW_CFA_Opcode opcode) { switch (opcode) { #define X(_NAME, _ID, ...) case _ID: return str8_lit(Stringify(_NAME)); - DW_CFA_Kind_XList(X) + DW_CFA_Kind_XList #undef X default: InvalidPath; break; } diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 94dd6ade..349e8b35 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -39,239 +39,239 @@ typedef enum DW_Format #define DW_SentinelFromSize(address_size) ((address_size) == 4 ? max_U32 : (address_size) == 8 ? max_U64 : 0) -#define DW_SectionKind_XList(X )\ -X(Null, "", "", "" )\ -X(Abbrev, ".debug_abbrev", "__debug_abbrev", ".debug_abbrev.dwo" )\ -X(ARanges, ".debug_aranges", "__debug_aranges", ".debug_aranges.dwo" )\ -X(Frame, ".debug_frame", "__debug_frame", ".debug_frame.dwo" )\ -X(Info, ".debug_info", "__debug_info", ".debug_info.dwo" )\ -X(Line, ".debug_line", "__debug_line", ".debug_line.dwo" )\ -X(Loc, ".debug_loc", "__debug_loc", ".debug_loc.dwo" )\ -X(MacInfo, ".debug_macinfo", "__debug_macinfo", ".debug_macinfo.dwo" )\ -X(PubNames, ".debug_pubnames", "__debug_pubnames", ".debug_pubnames.dwo" )\ -X(PubTypes, ".debug_pubtypes", "__debug_pubtypes", ".debug_pubtypes.dwo" )\ -X(Ranges, ".debug_ranges", "__debug_ranges", ".debug_ranges.dwo" )\ -X(Str, ".debug_str", "__debug_str", ".debug_str.dwo" )\ -X(Addr, ".debug_addr", "__debug_addr", ".debug_addr.dwo" )\ -X(LocLists, ".debug_loclists", "__debug_loclists", ".debug_loclists.dwo" )\ -X(RngLists, ".debug_rnglists", "__debug_rnglists", ".debug_rnglists.dwo" )\ -X(StrOffsets, ".debug_str_offsets", "__debug_str_offsets", ".debug_str_offsets.dwo")\ -X(LineStr, ".debug_line_str", "__debug_line_str", ".debug_line_str.dwo" )\ -X(Names, ".debug_names", "__debug_names", ".debug_names.dwo" ) +#define DW_SectionKind_XList \ + X(Null, "", "", "" ) \ + X(Abbrev, ".debug_abbrev", "__debug_abbrev", ".debug_abbrev.dwo" ) \ + X(ARanges, ".debug_aranges", "__debug_aranges", ".debug_aranges.dwo" ) \ + X(Frame, ".debug_frame", "__debug_frame", ".debug_frame.dwo" ) \ + X(Info, ".debug_info", "__debug_info", ".debug_info.dwo" ) \ + X(Line, ".debug_line", "__debug_line", ".debug_line.dwo" ) \ + X(Loc, ".debug_loc", "__debug_loc", ".debug_loc.dwo" ) \ + X(MacInfo, ".debug_macinfo", "__debug_macinfo", ".debug_macinfo.dwo" ) \ + X(PubNames, ".debug_pubnames", "__debug_pubnames", ".debug_pubnames.dwo" ) \ + X(PubTypes, ".debug_pubtypes", "__debug_pubtypes", ".debug_pubtypes.dwo" ) \ + X(Ranges, ".debug_ranges", "__debug_ranges", ".debug_ranges.dwo" ) \ + X(Str, ".debug_str", "__debug_str", ".debug_str.dwo" ) \ + X(Addr, ".debug_addr", "__debug_addr", ".debug_addr.dwo" ) \ + X(LocLists, ".debug_loclists", "__debug_loclists", ".debug_loclists.dwo" ) \ + X(RngLists, ".debug_rnglists", "__debug_rnglists", ".debug_rnglists.dwo" ) \ + X(StrOffsets, ".debug_str_offsets", "__debug_str_offsets", ".debug_str_offsets.dwo") \ + X(LineStr, ".debug_line_str", "__debug_line_str", ".debug_line_str.dwo" ) \ + X(Names, ".debug_names", "__debug_names", ".debug_names.dwo" ) typedef U64 DW_SectionKind; typedef enum DW_SectionKindEnum { #define X(_N,...) DW_Section_##_N, - DW_SectionKind_XList(X) + DW_SectionKind_XList #undef X DW_Section_Count } DW_SectionKindEnum; -#define DW_Language_XList(X) \ -X(Null, 0x00) \ -X(C89, 0x01) \ -X(C, 0x02) \ -X(Ada83, 0x03) \ -X(CPlusPlus, 0x04) \ -X(Cobol74, 0x05) \ -X(Cobol85, 0x06) \ -X(Fortran77, 0x07) \ -X(Fortran90, 0x08) \ -X(Pascal83, 0x09) \ -X(Modula2, 0x0A) \ -X(Java, 0x0B) \ -X(C99, 0x0C) \ -X(Ada95, 0x0D) \ -X(Fortran95, 0x0E) \ -X(PLI, 0x0F) \ -X(ObjC, 0x10) \ -X(ObjCPlusPlus, 0x11) \ -X(UPC, 0x12) \ -X(D, 0x13) \ -X(Python, 0x14) \ -X(OpenCL, 0x15) \ -X(Go, 0x16) \ -X(Modula3, 0x17) \ -X(Haskell, 0x18) \ -X(CPlusPlus03, 0x19) \ -X(CPlusPlus11, 0x1a) \ -X(OCaml, 0x1b) \ -X(Rust, 0x1c) \ -X(C11, 0x1d) \ -X(Swift, 0x1e) \ -X(Julia, 0x1f) \ -X(Dylan, 0x20) \ -X(CPlusPlus14, 0x21) \ -X(Fortran03, 0x22) \ -X(Fortran08, 0x23) \ -X(RenderScript, 0x24) \ -X(BLISS, 0x25) \ -X(MipsAssembler, 0x8001) \ -X(GoogleRenderScript, 0x8E57) \ -X(SunAssembler, 0x9001) \ -X(BorlandDelphi, 0xB000) +#define DW_Language_XList \ + X(Null, 0x00) \ + X(C89, 0x01) \ + X(C, 0x02) \ + X(Ada83, 0x03) \ + X(CPlusPlus, 0x04) \ + X(Cobol74, 0x05) \ + X(Cobol85, 0x06) \ + X(Fortran77, 0x07) \ + X(Fortran90, 0x08) \ + X(Pascal83, 0x09) \ + X(Modula2, 0x0A) \ + X(Java, 0x0B) \ + X(C99, 0x0C) \ + X(Ada95, 0x0D) \ + X(Fortran95, 0x0E) \ + X(PLI, 0x0F) \ + X(ObjC, 0x10) \ + X(ObjCPlusPlus, 0x11) \ + X(UPC, 0x12) \ + X(D, 0x13) \ + X(Python, 0x14) \ + X(OpenCL, 0x15) \ + X(Go, 0x16) \ + X(Modula3, 0x17) \ + X(Haskell, 0x18) \ + X(CPlusPlus03, 0x19) \ + X(CPlusPlus11, 0x1a) \ + X(OCaml, 0x1b) \ + X(Rust, 0x1c) \ + X(C11, 0x1d) \ + X(Swift, 0x1e) \ + X(Julia, 0x1f) \ + X(Dylan, 0x20) \ + X(CPlusPlus14, 0x21) \ + X(Fortran03, 0x22) \ + X(Fortran08, 0x23) \ + X(RenderScript, 0x24) \ + X(BLISS, 0x25) \ + X(MipsAssembler, 0x8001) \ + X(GoogleRenderScript, 0x8E57) \ + X(SunAssembler, 0x9001) \ + X(BorlandDelphi, 0xB000) typedef U32 DW_Language; typedef enum DW_LanguageEnum { #define X(_N, _ID) DW_Language_##_N = _ID, - DW_Language_XList(X) + DW_Language_XList #undef X DW_Language_UserLo = 0x8000, DW_Language_UserHi = 0xffff, } DW_LanguageEnum; -#define DW_Inl_XList(X) \ -X(NotInlined, 0) \ -X(Inlined, 1) \ -X(DeclaredNotInlined, 2) \ -X(DeclaredInlined, 3) +#define DW_Inl_XList \ + X(NotInlined, 0) \ + X(Inlined, 1) \ + X(DeclaredNotInlined, 2) \ + X(DeclaredInlined, 3) typedef U32 DW_InlKind; typedef enum DW_InlKindEnum { #define X(_N,_ID) DW_Inl_##_N = _ID, - DW_Inl_XList(X) + DW_Inl_XList #undef X } DW_InlKindEnum; -#define DW_StdOpcode_XList(X) \ -X(ExtendedOpcode, 0x00) \ -X(Copy, 0x01) \ -X(AdvancePc, 0x02) \ -X(AdvanceLine, 0x03) \ -X(SetFile, 0x04) \ -X(SetColumn, 0x05) \ -X(NegateStmt, 0x06) \ -X(SetBasicBlock, 0x07) \ -X(ConstAddPc, 0x08) \ -X(FixedAdvancePc, 0x09) \ -X(SetPrologueEnd, 0x0A) \ -X(SetEpilogueBegin, 0x0B) \ -X(SetIsa, 0x0C) \ +#define DW_StdOpcode_XList \ + X(ExtendedOpcode, 0x00) \ + X(Copy, 0x01) \ + X(AdvancePc, 0x02) \ + X(AdvanceLine, 0x03) \ + X(SetFile, 0x04) \ + X(SetColumn, 0x05) \ + X(NegateStmt, 0x06) \ + X(SetBasicBlock, 0x07) \ + X(ConstAddPc, 0x08) \ + X(FixedAdvancePc, 0x09) \ + X(SetPrologueEnd, 0x0A) \ + X(SetEpilogueBegin, 0x0B) \ + X(SetIsa, 0x0C) \ typedef enum DW_StdOpcode { #define X(_N,_ID) DW_StdOpcode_##_N = _ID, - DW_StdOpcode_XList(X) + DW_StdOpcode_XList #undef X } DW_StdOpcode; -#define DW_ExtOpcode_XList(X) \ -X(Undefined, 0x00) \ -X(EndSequence, 0x01) \ -X(SetAddress, 0x02) \ -X(DefineFile, 0x03) \ -X(SetDiscriminator, 0x04) \ -X(UserLo, 0x80) \ -X(UserHi, 0xff) +#define DW_ExtOpcode_XList \ + X(Undefined, 0x00) \ + X(EndSequence, 0x01) \ + X(SetAddress, 0x02) \ + X(DefineFile, 0x03) \ + X(SetDiscriminator, 0x04) \ + X(UserLo, 0x80) \ + X(UserHi, 0xff) typedef enum DW_ExtOpcode { #define X(_N,_ID) DW_ExtOpcode_##_N = _ID, - DW_ExtOpcode_XList(X) + DW_ExtOpcode_XList #undef X } DW_ExtOpcode; -#define DW_IDCaseKind_XList(X) \ -X(CaseSensitive, 0x00) \ -X(UpCase, 0x01) \ -X(DownCase, 0x02) \ -X(CaseInsensitive, 0x03) +#define DW_IDCaseKind_XList \ + X(CaseSensitive, 0x00) \ + X(UpCase, 0x01) \ + X(DownCase, 0x02) \ + X(CaseInsensitive, 0x03) typedef U64 DW_IDCaseKind; typedef enum DW_IDCaseKindEnum { #define X(_N,_ID) DW_IDCase_##_N = _ID, - DW_IDCaseKind_XList(X) + DW_IDCaseKind_XList #undef X } DW_IDCaseKindEnum; -#define DW_TagKind_V3_XList(X) \ -X(ArrayType, 0x01) \ -X(ClassType, 0x02) \ -X(EntryPoint, 0x03) \ -X(EnumerationType, 0x04) \ -X(FormalParameter, 0x05) \ -X(ImportedDeclaration, 0x08) \ -X(Label, 0x0a) \ -X(LexicalBlock, 0x0b) \ -X(Member, 0x0d) \ -X(PointerType, 0x0f) \ -X(ReferenceType, 0x10) \ -X(CompileUnit, 0x11) \ -X(StringType, 0x12) \ -X(StructureType, 0x13) \ -X(SubroutineType, 0x15) \ -X(Typedef, 0x16) \ -X(UnionType, 0x17) \ -X(UnspecifiedParameters, 0x18) \ -X(Variant, 0x19) \ -X(CommonBlock, 0x1a) \ -X(CommonInclusion, 0x1b) \ -X(Inheritance, 0x1c) \ -X(InlinedSubroutine, 0x1d) \ -X(Module, 0x1e) \ -X(PtrToMemberType, 0x1f) \ -X(SetType, 0x20) \ -X(SubrangeType, 0x21) \ -X(WithStmt, 0x22) \ -X(AccessDeclaration, 0x23) \ -X(BaseType, 0x24) \ -X(CatchBlock, 0x25) \ -X(ConstType, 0x26) \ -X(Constant, 0x27) \ -X(Enumerator, 0x28) \ -X(FileType, 0x29) \ -X(Friend, 0x2a) \ -X(NameList, 0x2b) \ -X(NameListItem, 0x2c) \ -X(PackedType, 0x2d) \ -X(SubProgram, 0x2e) \ -X(TemplateTypeParameter, 0x2f) \ -X(TemplateValueParameter, 0x30) \ -X(ThrownType, 0x31) \ -X(TryBlock, 0x32) \ -X(VariantPart, 0x33) \ -X(Variable, 0x34) \ -X(VolatileType, 0x35) \ -X(DwarfProcedure, 0x36) \ -X(RestrictType, 0x37) \ -X(InterfaceType, 0x38) \ -X(Namespace, 0x39) \ -X(ImportedModule, 0x3a) \ -X(UnspecifiedType, 0x3b) \ -X(PartialUnit, 0x3c) \ -X(ImportedUnit, 0x3d) \ -X(Condition, 0x3f) \ -X(SharedType, 0x40) +#define DW_TagKind_V3_XList \ + X(ArrayType, 0x01) \ + X(ClassType, 0x02) \ + X(EntryPoint, 0x03) \ + X(EnumerationType, 0x04) \ + X(FormalParameter, 0x05) \ + X(ImportedDeclaration, 0x08) \ + X(Label, 0x0a) \ + X(LexicalBlock, 0x0b) \ + X(Member, 0x0d) \ + X(PointerType, 0x0f) \ + X(ReferenceType, 0x10) \ + X(CompileUnit, 0x11) \ + X(StringType, 0x12) \ + X(StructureType, 0x13) \ + X(SubroutineType, 0x15) \ + X(Typedef, 0x16) \ + X(UnionType, 0x17) \ + X(UnspecifiedParameters, 0x18) \ + X(Variant, 0x19) \ + X(CommonBlock, 0x1a) \ + X(CommonInclusion, 0x1b) \ + X(Inheritance, 0x1c) \ + X(InlinedSubroutine, 0x1d) \ + X(Module, 0x1e) \ + X(PtrToMemberType, 0x1f) \ + X(SetType, 0x20) \ + X(SubrangeType, 0x21) \ + X(WithStmt, 0x22) \ + X(AccessDeclaration, 0x23) \ + X(BaseType, 0x24) \ + X(CatchBlock, 0x25) \ + X(ConstType, 0x26) \ + X(Constant, 0x27) \ + X(Enumerator, 0x28) \ + X(FileType, 0x29) \ + X(Friend, 0x2a) \ + X(NameList, 0x2b) \ + X(NameListItem, 0x2c) \ + X(PackedType, 0x2d) \ + X(SubProgram, 0x2e) \ + X(TemplateTypeParameter, 0x2f) \ + X(TemplateValueParameter, 0x30) \ + X(ThrownType, 0x31) \ + X(TryBlock, 0x32) \ + X(VariantPart, 0x33) \ + X(Variable, 0x34) \ + X(VolatileType, 0x35) \ + X(DwarfProcedure, 0x36) \ + X(RestrictType, 0x37) \ + X(InterfaceType, 0x38) \ + X(Namespace, 0x39) \ + X(ImportedModule, 0x3a) \ + X(UnspecifiedType, 0x3b) \ + X(PartialUnit, 0x3c) \ + X(ImportedUnit, 0x3d) \ + X(Condition, 0x3f) \ + X(SharedType, 0x40) -#define DW_TagKind_V5_XList(X) \ -X(TypeUnit, 0x41) \ -X(RValueReferenceType, 0x42) \ -X(TemplateAlias, 0x43) \ -X(CoarrayType, 0x44) \ -X(GenericSubrange, 0x45) \ -X(DynamicType, 0x46) \ -X(AtomicType, 0x47) \ -X(CallSite, 0x48) \ -X(CallSiteParameter, 0x49) \ -X(SkeletonUnit, 0x4A) \ -X(ImmutableType, 0x4B) +#define DW_TagKind_V5_XList \ + X(TypeUnit, 0x41) \ + X(RValueReferenceType, 0x42) \ + X(TemplateAlias, 0x43) \ + X(CoarrayType, 0x44) \ + X(GenericSubrange, 0x45) \ + X(DynamicType, 0x46) \ + X(AtomicType, 0x47) \ + X(CallSite, 0x48) \ + X(CallSiteParameter, 0x49) \ + X(SkeletonUnit, 0x4A) \ + X(ImmutableType, 0x4B) -#define DW_TagKind_GNU_XList(X) \ -X(GNU_CallSite, 0x4109) \ -X(GNU_CallSiteParameter, 0x410a) +#define DW_TagKind_GNU_XList \ + X(GNU_CallSite, 0x4109) \ + X(GNU_CallSiteParameter, 0x410a) typedef U64 DW_TagKind; typedef enum DW_TagKindEnum { DW_TagKind_Null, #define X(_N,_ID) DW_TagKind_##_N = _ID, - DW_TagKind_V3_XList(X) - DW_TagKind_V5_XList(X) - DW_TagKind_GNU_XList(X) + DW_TagKind_V3_XList + DW_TagKind_V5_XList + DW_TagKind_GNU_XList #undef X DW_TagKind_UserLo = 0x4080, DW_TagKind_UserHi = 0xffff @@ -279,999 +279,993 @@ typedef enum DW_TagKindEnum //- Attrib Class Encodings -#define DW_AttribClass_V3_XList(X) \ -X(Null, 0) \ -X(Undefined, 1) \ -X(Address, 2) \ -X(Block, 3) \ -X(Const, 4) \ -X(ExprLoc, 5) \ -X(Flag, 6) \ -X(LinePtr, 7) \ -X(LocListPtr, 8) \ -X(MacPtr, 9) \ -X(RngListPtr, 10) \ -X(Reference, 11) \ -X(String, 12) +#define DW_AttribClass_V3_XList \ + X(Null, 0) \ + X(Undefined, 1) \ + X(Address, 2) \ + X(Block, 3) \ + X(Const, 4) \ + X(ExprLoc, 5) \ + X(Flag, 6) \ + X(LinePtr, 7) \ + X(LocListPtr, 8) \ + X(MacPtr, 9) \ + X(RngListPtr, 10) \ + X(Reference, 11) \ + X(String, 12) -#define DW_AttribClass_V4_XList(X) \ -X(LocList, 13) \ -X(RngList, 14) +#define DW_AttribClass_V4_XList \ + X(LocList, 13) \ + X(RngList, 14) -#define DW_AttribClass_V5_XList(X) \ -X(StrOffsetsPtr, 15) \ -X(AddrPtr, 16) +#define DW_AttribClass_V5_XList \ + X(StrOffsetsPtr, 15) \ + X(AddrPtr, 16) typedef U32 DW_AttribClass; typedef enum DW_AttribClassEnum { #define X(_N,_ID) DW_AttribClass_##_N = (1 << _ID), - DW_AttribClass_V3_XList(X) - DW_AttribClass_V4_XList(X) - DW_AttribClass_V5_XList(X) + DW_AttribClass_V3_XList + DW_AttribClass_V4_XList + DW_AttribClass_V5_XList #undef X + DW_AttribClass_AllPtrs = DW_AttribClass_AddrPtr|DW_AttribClass_LinePtr|DW_AttribClass_LocList|DW_AttribClass_LocListPtr| DW_AttribClass_MacPtr| DW_AttribClass_RngList| DW_AttribClass_RngListPtr| DW_AttribClass_StrOffsetsPtr, } DW_AttribClassEnum; //- Form Encodings -#define DW_Form_V2_XList(X) \ -X(Addr, 0x1) \ -X(Block2, 0x3) \ -X(Block4, 0x4) \ -X(Data2, 0x5) \ -X(Data4, 0x6) \ -X(Data8, 0x7) \ -X(String, 0x8) \ -X(Block, 0x9) \ -X(Block1, 0xa) \ -X(Data1, 0xb) \ -X(Flag, 0xc) \ -X(SData, 0xd) \ -X(Strp, 0xe) \ -X(UData, 0xf) \ -X(RefAddr, 0x10) \ -X(Ref1, 0x11) \ -X(Ref2, 0x12) \ -X(Ref4, 0x13) \ -X(Ref8, 0x14) \ -X(RefUData, 0x15) \ -X(Indirect, 0x16) +#define DW_Form_V2_XList \ + X(Addr, 0x1) \ + X(Block2, 0x3) \ + X(Block4, 0x4) \ + X(Data2, 0x5) \ + X(Data4, 0x6) \ + X(Data8, 0x7) \ + X(String, 0x8) \ + X(Block, 0x9) \ + X(Block1, 0xa) \ + X(Data1, 0xb) \ + X(Flag, 0xc) \ + X(SData, 0xd) \ + X(Strp, 0xe) \ + X(UData, 0xf) \ + X(RefAddr, 0x10) \ + X(Ref1, 0x11) \ + X(Ref2, 0x12) \ + X(Ref4, 0x13) \ + X(Ref8, 0x14) \ + X(RefUData, 0x15) \ + X(Indirect, 0x16) -#define DW_Form_AttribClass_V2_XList(X) \ -X(Addr, DW_AttribClass_Address) \ -X(Block2, DW_AttribClass_Block) \ -X(Block4, DW_AttribClass_Block) \ -X(Data2, DW_AttribClass_Const) \ -X(Data4, DW_AttribClass_Const) \ -X(Data8, DW_AttribClass_Const) \ -X(String, DW_AttribClass_String) \ -X(Block, DW_AttribClass_Block) \ -X(Block1, DW_AttribClass_Block) \ -X(Data1, DW_AttribClass_Const) \ -X(Flag, DW_AttribClass_Flag) \ -X(SData, DW_AttribClass_Const) \ -X(Strp, DW_AttribClass_String) \ -X(UData, DW_AttribClass_Const) \ -X(RefAddr, DW_AttribClass_Reference) \ -X(Ref1, DW_AttribClass_Reference) \ -X(Ref2, DW_AttribClass_Reference) \ -X(Ref4, DW_AttribClass_Reference) \ -X(Ref8, DW_AttribClass_Reference) \ -X(RefUData, DW_AttribClass_Reference) \ -X(Indirect, DW_AttribClass_Null) +#define DW_Form_AttribClass_V2_XList \ + X(Addr, DW_AttribClass_Address) \ + X(Block2, DW_AttribClass_Block) \ + X(Block4, DW_AttribClass_Block) \ + X(Data2, DW_AttribClass_Const) \ + X(Data4, DW_AttribClass_Const) \ + X(Data8, DW_AttribClass_Const) \ + X(String, DW_AttribClass_String) \ + X(Block, DW_AttribClass_Block) \ + X(Block1, DW_AttribClass_Block) \ + X(Data1, DW_AttribClass_Const) \ + X(Flag, DW_AttribClass_Flag) \ + X(SData, DW_AttribClass_Const) \ + X(Strp, DW_AttribClass_String) \ + X(UData, DW_AttribClass_Const) \ + X(RefAddr, DW_AttribClass_Reference) \ + X(Ref1, DW_AttribClass_Reference) \ + X(Ref2, DW_AttribClass_Reference) \ + X(Ref4, DW_AttribClass_Reference) \ + X(Ref8, DW_AttribClass_Reference) \ + X(RefUData, DW_AttribClass_Reference) \ + X(Indirect, DW_AttribClass_Null) -#define DW_Form_V4_XList(X) \ -X(SecOffset, 0x17) \ -X(ExprLoc, 0x18) \ -X(FlagPresent, 0x19) \ -X(RefSig8, 0x20) +#define DW_Form_V4_XList \ + X(SecOffset, 0x17) \ + X(ExprLoc, 0x18) \ + X(FlagPresent, 0x19) \ + X(RefSig8, 0x20) -#define DW_Form_AttribClass_V4_XList(X) \ -X(Addr, DW_AttribClass_Address) \ -X(Block2, DW_AttribClass_Block) \ -X(Block4, DW_AttribClass_Block) \ -X(Data2, DW_AttribClass_Const) \ -X(Data4, DW_AttribClass_Const) \ -X(Data8, DW_AttribClass_Const) \ -X(String, DW_AttribClass_String) \ -X(Block, DW_AttribClass_Block) \ -X(Block1, DW_AttribClass_Block) \ -X(Data1, DW_AttribClass_Const) \ -X(Flag, DW_AttribClass_Flag) \ -X(SData, DW_AttribClass_Const) \ -X(Strp, DW_AttribClass_String) \ -X(UData, DW_AttribClass_Const) \ -X(RefAddr, DW_AttribClass_Reference) \ -X(Ref1, DW_AttribClass_Reference) \ -X(Ref2, DW_AttribClass_Reference) \ -X(Ref4, DW_AttribClass_Reference) \ -X(Ref8, DW_AttribClass_Reference) \ -X(RefUData, DW_AttribClass_Reference) \ -X(Indirect, DW_AttribClass_Null) \ -X(SecOffset, DW_AttribClass_LinePtr|DW_AttribClass_LocListPtr|DW_AttribClass_MacPtr|DW_AttribClass_RngListPtr) \ -X(ExprLoc, DW_AttribClass_ExprLoc) \ -X(FlagPresent, DW_AttribClass_Flag) \ -X(RefSig8, DW_AttribClass_Reference) +#define DW_Form_AttribClass_V4_XList \ + X(Addr, DW_AttribClass_Address) \ + X(Block2, DW_AttribClass_Block) \ + X(Block4, DW_AttribClass_Block) \ + X(Data2, DW_AttribClass_Const) \ + X(Data4, DW_AttribClass_Const) \ + X(Data8, DW_AttribClass_Const) \ + X(String, DW_AttribClass_String) \ + X(Block, DW_AttribClass_Block) \ + X(Block1, DW_AttribClass_Block) \ + X(Data1, DW_AttribClass_Const) \ + X(Flag, DW_AttribClass_Flag) \ + X(SData, DW_AttribClass_Const) \ + X(Strp, DW_AttribClass_String) \ + X(UData, DW_AttribClass_Const) \ + X(RefAddr, DW_AttribClass_Reference) \ + X(Ref1, DW_AttribClass_Reference) \ + X(Ref2, DW_AttribClass_Reference) \ + X(Ref4, DW_AttribClass_Reference) \ + X(Ref8, DW_AttribClass_Reference) \ + X(RefUData, DW_AttribClass_Reference) \ + X(Indirect, DW_AttribClass_Null) \ + X(SecOffset, DW_AttribClass_LinePtr|DW_AttribClass_LocListPtr|DW_AttribClass_MacPtr|DW_AttribClass_RngListPtr) \ + X(ExprLoc, DW_AttribClass_ExprLoc) \ + X(FlagPresent, DW_AttribClass_Flag) \ + X(RefSig8, DW_AttribClass_Reference) -#define DW_Form_V5_XList(X) \ -X(Strx, 0x1a) \ -X(Addrx, 0x1b) \ -X(RefSup4, 0x1c) \ -X(StrpSup, 0x1d) \ -X(Data16, 0x1e) \ -X(LineStrp, 0x1f) \ -X(ImplicitConst, 0x21) \ -X(LocListx, 0x22) \ -X(RngListx, 0x23) \ -X(RefSup8, 0x24) \ -X(Strx1, 0x25) \ -X(Strx2, 0x26) \ -X(Strx3, 0x27) \ -X(Strx4, 0x28) \ -X(Addrx1, 0x29) \ -X(Addrx2, 0x2a) \ -X(Addrx3, 0x2b) \ -X(Addrx4, 0x2c) +#define DW_Form_V5_XList \ + X(Strx, 0x1a) \ + X(Addrx, 0x1b) \ + X(RefSup4, 0x1c) \ + X(StrpSup, 0x1d) \ + X(Data16, 0x1e) \ + X(LineStrp, 0x1f) \ + X(ImplicitConst, 0x21) \ + X(LocListx, 0x22) \ + X(RngListx, 0x23) \ + X(RefSup8, 0x24) \ + X(Strx1, 0x25) \ + X(Strx2, 0x26) \ + X(Strx3, 0x27) \ + X(Strx4, 0x28) \ + X(Addrx1, 0x29) \ + X(Addrx2, 0x2a) \ + X(Addrx3, 0x2b) \ + X(Addrx4, 0x2c) -#define DW_Form_AttribClass_V5_XList(X) \ -X(Addr, DW_AttribClass_Address) \ -X(Block2, DW_AttribClass_Block) \ -X(Block4, DW_AttribClass_Block) \ -X(Data2, DW_AttribClass_Const) \ -X(Data4, DW_AttribClass_Const) \ -X(Data8, DW_AttribClass_Const) \ -X(String, DW_AttribClass_String) \ -X(Block, DW_AttribClass_Block) \ -X(Block1, DW_AttribClass_Block) \ -X(Data1, DW_AttribClass_Const) \ -X(Flag, DW_AttribClass_Flag) \ -X(SData, DW_AttribClass_Const) \ -X(Strp, DW_AttribClass_String) \ -X(UData, DW_AttribClass_Const) \ -X(RefAddr, DW_AttribClass_Reference) \ -X(Ref1, DW_AttribClass_Reference) \ -X(Ref2, DW_AttribClass_Reference) \ -X(Ref4, DW_AttribClass_Reference) \ -X(Ref8, DW_AttribClass_Reference) \ -X(RefUData, DW_AttribClass_Reference) \ -X(Indirect, DW_AttribClass_Null) \ -X(SecOffset, DW_AttribClass_AddrPtr| \ -DW_AttribClass_LinePtr| \ -DW_AttribClass_LocList| \ -DW_AttribClass_LocListPtr| \ -DW_AttribClass_MacPtr| \ -DW_AttribClass_RngList| \ -DW_AttribClass_RngListPtr| \ -DW_AttribClass_StrOffsetsPtr) \ -X(ExprLoc, DW_AttribClass_ExprLoc) \ -X(FlagPresent, DW_AttribClass_Flag) \ -X(RefSig8, DW_AttribClass_Reference) \ -X(Strx, DW_AttribClass_String) \ -X(Addrx, DW_AttribClass_Address) \ -X(RefSup4, DW_AttribClass_Reference) \ -X(StrpSup, DW_AttribClass_String) \ -X(Data16, DW_AttribClass_Const) \ -X(LineStrp, DW_AttribClass_String) \ -X(ImplicitConst, DW_AttribClass_Const) \ -X(LocListx, DW_AttribClass_LocListPtr) \ -X(RngListx, DW_AttribClass_RngList) \ -X(RefSup8, DW_AttribClass_Reference) \ -X(Strx1, DW_AttribClass_String) \ -X(Strx2, DW_AttribClass_String) \ -X(Strx3, DW_AttribClass_String) \ -X(Strx4, DW_AttribClass_String) \ -X(Addrx1, DW_AttribClass_Address) \ -X(Addrx2, DW_AttribClass_Address) \ -X(Addrx3, DW_AttribClass_Address) \ -X(Addrx4, DW_AttribClass_Address) +#define DW_Form_AttribClass_V5_XList \ + X(Addr, DW_AttribClass_Address) \ + X(Block2, DW_AttribClass_Block) \ + X(Block4, DW_AttribClass_Block) \ + X(Data2, DW_AttribClass_Const) \ + X(Data4, DW_AttribClass_Const) \ + X(Data8, DW_AttribClass_Const) \ + X(String, DW_AttribClass_String) \ + X(Block, DW_AttribClass_Block) \ + X(Block1, DW_AttribClass_Block) \ + X(Data1, DW_AttribClass_Const) \ + X(Flag, DW_AttribClass_Flag) \ + X(SData, DW_AttribClass_Const) \ + X(Strp, DW_AttribClass_String) \ + X(UData, DW_AttribClass_Const) \ + X(RefAddr, DW_AttribClass_Reference) \ + X(Ref1, DW_AttribClass_Reference) \ + X(Ref2, DW_AttribClass_Reference) \ + X(Ref4, DW_AttribClass_Reference) \ + X(Ref8, DW_AttribClass_Reference) \ + X(RefUData, DW_AttribClass_Reference) \ + X(Indirect, DW_AttribClass_Null) \ + X(SecOffset, DW_AttribClass_AllPtrs) \ + X(ExprLoc, DW_AttribClass_ExprLoc) \ + X(FlagPresent, DW_AttribClass_Flag) \ + X(RefSig8, DW_AttribClass_Reference) \ + X(Strx, DW_AttribClass_String) \ + X(Addrx, DW_AttribClass_Address) \ + X(RefSup4, DW_AttribClass_Reference) \ + X(StrpSup, DW_AttribClass_String) \ + X(Data16, DW_AttribClass_Const) \ + X(LineStrp, DW_AttribClass_String) \ + X(ImplicitConst, DW_AttribClass_Const) \ + X(LocListx, DW_AttribClass_LocListPtr) \ + X(RngListx, DW_AttribClass_RngList) \ + X(RefSup8, DW_AttribClass_Reference) \ + X(Strx1, DW_AttribClass_String) \ + X(Strx2, DW_AttribClass_String) \ + X(Strx3, DW_AttribClass_String) \ + X(Strx4, DW_AttribClass_String) \ + X(Addrx1, DW_AttribClass_Address) \ + X(Addrx2, DW_AttribClass_Address) \ + X(Addrx3, DW_AttribClass_Address) \ + X(Addrx4, DW_AttribClass_Address) -#define DW_Form_GNU_XList(X) \ -X(GNU_AddrIndex, 0x1f01) \ -X(GNU_StrIndex, 0x1f02) \ -X(GNU_RefAlt, 0x1f20) \ -X(GNU_StrpAlt, 0x1f21) +#define DW_Form_GNU_XList \ + X(GNU_AddrIndex, 0x1f01) \ + X(GNU_StrIndex, 0x1f02) \ + X(GNU_RefAlt, 0x1f20) \ + X(GNU_StrpAlt, 0x1f21) -#define DW_Form_AttribClass_GNU_XList(X) \ -X(GNU_AddrIndex, DW_AttribClass_Undefined) \ -X(GNU_StrIndex, DW_AttribClass_Undefined) \ -X(GNU_RefAlt, DW_AttribClass_Undefined) \ -X(GNU_StrpAlt, DW_AttribClass_String) +#define DW_Form_AttribClass_GNU_XList \ + X(GNU_AddrIndex, DW_AttribClass_Undefined) \ + X(GNU_StrIndex, DW_AttribClass_Undefined) \ + X(GNU_RefAlt, DW_AttribClass_Undefined) \ + X(GNU_StrpAlt, DW_AttribClass_String) typedef U64 DW_FormKind; typedef enum DW_FormEnum { DW_Form_Null, #define X(_N, _ID) DW_Form_##_N = _ID, - DW_Form_V2_XList(X) - DW_Form_V4_XList(X) - DW_Form_V5_XList(X) - DW_Form_GNU_XList(X) + DW_Form_V2_XList + DW_Form_V4_XList + DW_Form_V5_XList + DW_Form_GNU_XList #undef X } DW_FormEnum; //- Attributes DWARF2 -#define DW_AttribKind_V2_XList(X) \ -X(Sibling, 0x1) \ -X(Location, 0x2) \ -X(Name, 0x3) \ -X(Ordering, 0x9) \ -X(ByteSize, 0xB) \ -X(BitOffset, 0xC) \ -X(BitSize, 0xD) \ -X(StmtList, 0x10) \ -X(LowPc, 0x11) \ -X(HighPc, 0x12) \ -X(Language, 0x13) \ -X(Discr, 0x15) \ -X(DiscrValue, 0x16) \ -X(Visibility, 0x17) \ -X(Import, 0x18) \ -X(StringLength, 0x19) \ -X(CommonReference, 0x1a) \ -X(CompDir, 0x1b) \ -X(ConstValue, 0x1c) \ -X(ContainingType, 0x1d) \ -X(DefaultValue, 0x1e) \ -X(Inline, 0x20) \ -X(IsOptional, 0x21) \ -X(LowerBound, 0x22) \ -X(Producer, 0x25) \ -X(Prototyped, 0x27) \ -X(ReturnAddr, 0x2a) \ -X(StartScope, 0x2c) \ -X(BitStride, 0x2e) \ -X(UpperBound, 0x2f) \ -X(AbstractOrigin, 0x31) \ -X(Accessibility, 0x32) \ -X(AddressClass, 0x33) \ -X(Artificial, 0x34) \ -X(BaseTypes, 0x35) \ -X(CallingConvention, 0x36) \ -X(Count, 0x37) \ -X(DataMemberLocation, 0x38) \ -X(DeclColumn, 0x39) \ -X(DeclFile, 0x3a) \ -X(DeclLine, 0x3b) \ -X(Declaration, 0x3c) \ -X(DiscrList, 0x3d) \ -X(Encoding, 0x3e) \ -X(External, 0x3f) \ -X(FrameBase, 0x40) \ -X(Friend, 0x41) \ -X(IdentifierCase, 0x42) \ -X(MacroInfo, 0x43) \ -X(NameListItem, 0x44) \ -X(Priority, 0x45) \ -X(Segment, 0x46) \ -X(Specification, 0x47) \ -X(StaticLink, 0x48) \ -X(Type, 0x49) \ -X(UseLocation, 0x4a) \ -X(VariableParameter, 0x4b) \ -X(Virtuality, 0x4c) \ -X(VTableElemLocation, 0x4d) +#define DW_AttribKind_V2_XList \ + X(Sibling, 0x1) \ + X(Location, 0x2) \ + X(Name, 0x3) \ + X(Ordering, 0x9) \ + X(ByteSize, 0xB) \ + X(BitOffset, 0xC) \ + X(BitSize, 0xD) \ + X(StmtList, 0x10) \ + X(LowPc, 0x11) \ + X(HighPc, 0x12) \ + X(Language, 0x13) \ + X(Discr, 0x15) \ + X(DiscrValue, 0x16) \ + X(Visibility, 0x17) \ + X(Import, 0x18) \ + X(StringLength, 0x19) \ + X(CommonReference, 0x1a) \ + X(CompDir, 0x1b) \ + X(ConstValue, 0x1c) \ + X(ContainingType, 0x1d) \ + X(DefaultValue, 0x1e) \ + X(Inline, 0x20) \ + X(IsOptional, 0x21) \ + X(LowerBound, 0x22) \ + X(Producer, 0x25) \ + X(Prototyped, 0x27) \ + X(ReturnAddr, 0x2a) \ + X(StartScope, 0x2c) \ + X(BitStride, 0x2e) \ + X(UpperBound, 0x2f) \ + X(AbstractOrigin, 0x31) \ + X(Accessibility, 0x32) \ + X(AddressClass, 0x33) \ + X(Artificial, 0x34) \ + X(BaseTypes, 0x35) \ + X(CallingConvention, 0x36) \ + X(Count, 0x37) \ + X(DataMemberLocation, 0x38) \ + X(DeclColumn, 0x39) \ + X(DeclFile, 0x3a) \ + X(DeclLine, 0x3b) \ + X(Declaration, 0x3c) \ + X(DiscrList, 0x3d) \ + X(Encoding, 0x3e) \ + X(External, 0x3f) \ + X(FrameBase, 0x40) \ + X(Friend, 0x41) \ + X(IdentifierCase, 0x42) \ + X(MacroInfo, 0x43) \ + X(NameListItem, 0x44) \ + X(Priority, 0x45) \ + X(Segment, 0x46) \ + X(Specification, 0x47) \ + X(StaticLink, 0x48) \ + X(Type, 0x49) \ + X(UseLocation, 0x4a) \ + X(VariableParameter, 0x4b) \ + X(Virtuality, 0x4c) \ + X(VTableElemLocation, 0x4d) -#define DW_AttribKind_ClassFlags_V2_XList(X) \ -X(Sibling, DW_AttribClass_Reference) \ -X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Name, DW_AttribClass_String) \ -X(Ordering, DW_AttribClass_Const) \ -X(ByteSize, DW_AttribClass_Const) \ -X(BitOffset, DW_AttribClass_Const) \ -X(BitSize, DW_AttribClass_Const) \ -X(StmtList, DW_AttribClass_Const) \ -X(LowPc, DW_AttribClass_Address) \ -X(HighPc, DW_AttribClass_Address) \ -X(Language, DW_AttribClass_Const) \ -X(Discr, DW_AttribClass_Reference) \ -X(DiscrValue, DW_AttribClass_Const) \ -X(Visibility, DW_AttribClass_Const) \ -X(Import, DW_AttribClass_Reference) \ -X(StringLength, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(CommonReference, DW_AttribClass_Reference) \ -X(CompDir, DW_AttribClass_String) \ -X(ConstValue, DW_AttribClass_String|DW_AttribClass_Const|DW_AttribClass_Block) \ -X(ContainingType, DW_AttribClass_Reference) \ -X(DefaultValue, DW_AttribClass_Reference) \ -X(Inline, DW_AttribClass_Const) \ -X(IsOptional, DW_AttribClass_Flag) \ -X(LowerBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(Producer, DW_AttribClass_String) \ -X(Prototyped, DW_AttribClass_Flag) \ -X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(StartScope, DW_AttribClass_Const) \ -X(BitStride, DW_AttribClass_Const) /* dwarf-v1 DW_AttribKind_stride_size*/ \ -X(UpperBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(AbstractOrigin, DW_AttribClass_Reference) \ -X(Accessibility, DW_AttribClass_Const) \ -X(AddressClass, DW_AttribClass_Const) \ -X(Artificial, DW_AttribClass_Flag) \ -X(BaseTypes, DW_AttribClass_Reference) \ -X(CallingConvention, DW_AttribClass_Const) \ -X(Count, DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Reference) \ -X(DeclColumn, DW_AttribClass_Const) \ -X(DeclFile, DW_AttribClass_Const) \ -X(DeclLine, DW_AttribClass_Const) \ -X(Declaration, DW_AttribClass_Flag) \ -X(DiscrList, DW_AttribClass_Block) \ -X(Encoding, DW_AttribClass_Const) \ -X(External, DW_AttribClass_Flag) \ -X(FrameBase, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(Friend, DW_AttribClass_Reference) \ -X(IdentifierCase, DW_AttribClass_Const) \ -X(MacroInfo, DW_AttribClass_Const) \ -X(NameListItem, DW_AttribClass_Block) \ -X(Priority, DW_AttribClass_Reference) \ -X(Segment, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(Specification, DW_AttribClass_Reference) \ -X(StaticLink, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(Type, DW_AttribClass_Reference) \ -X(UseLocation, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(VariableParameter, DW_AttribClass_Flag) \ -X(Virtuality, DW_AttribClass_Const) \ -X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_Reference) +#define DW_AttribKind_ClassFlags_V2_XList \ + X(Sibling, DW_AttribClass_Reference) \ + X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(Name, DW_AttribClass_String) \ + X(Ordering, DW_AttribClass_Const) \ + X(ByteSize, DW_AttribClass_Const) \ + X(BitOffset, DW_AttribClass_Const) \ + X(BitSize, DW_AttribClass_Const) \ + X(StmtList, DW_AttribClass_Const) \ + X(LowPc, DW_AttribClass_Address) \ + X(HighPc, DW_AttribClass_Address) \ + X(Language, DW_AttribClass_Const) \ + X(Discr, DW_AttribClass_Reference) \ + X(DiscrValue, DW_AttribClass_Const) \ + X(Visibility, DW_AttribClass_Const) \ + X(Import, DW_AttribClass_Reference) \ + X(StringLength, DW_AttribClass_Block|DW_AttribClass_Const) \ + X(CommonReference, DW_AttribClass_Reference) \ + X(CompDir, DW_AttribClass_String) \ + X(ConstValue, DW_AttribClass_String|DW_AttribClass_Const|DW_AttribClass_Block) \ + X(ContainingType, DW_AttribClass_Reference) \ + X(DefaultValue, DW_AttribClass_Reference) \ + X(Inline, DW_AttribClass_Const) \ + X(IsOptional, DW_AttribClass_Flag) \ + X(LowerBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(Producer, DW_AttribClass_String) \ + X(Prototyped, DW_AttribClass_Flag) \ + X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_Const) \ + X(StartScope, DW_AttribClass_Const) \ + X(BitStride, DW_AttribClass_Const) /* dwarf-v1 DW_AttribKind_stride_size*/ \ + X(UpperBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(AbstractOrigin, DW_AttribClass_Reference) \ + X(Accessibility, DW_AttribClass_Const) \ + X(AddressClass, DW_AttribClass_Const) \ + X(Artificial, DW_AttribClass_Flag) \ + X(BaseTypes, DW_AttribClass_Reference) \ + X(CallingConvention, DW_AttribClass_Const) \ + X(Count, DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Reference) \ + X(DeclColumn, DW_AttribClass_Const) \ + X(DeclFile, DW_AttribClass_Const) \ + X(DeclLine, DW_AttribClass_Const) \ + X(Declaration, DW_AttribClass_Flag) \ + X(DiscrList, DW_AttribClass_Block) \ + X(Encoding, DW_AttribClass_Const) \ + X(External, DW_AttribClass_Flag) \ + X(FrameBase, DW_AttribClass_Block|DW_AttribClass_Const) \ + X(Friend, DW_AttribClass_Reference) \ + X(IdentifierCase, DW_AttribClass_Const) \ + X(MacroInfo, DW_AttribClass_Const) \ + X(NameListItem, DW_AttribClass_Block) \ + X(Priority, DW_AttribClass_Reference) \ + X(Segment, DW_AttribClass_Block|DW_AttribClass_Const) \ + X(Specification, DW_AttribClass_Reference) \ + X(StaticLink, DW_AttribClass_Block|DW_AttribClass_Const) \ + X(Type, DW_AttribClass_Reference) \ + X(UseLocation, DW_AttribClass_Block|DW_AttribClass_Const) \ + X(VariableParameter, DW_AttribClass_Flag) \ + X(Virtuality, DW_AttribClass_Const) \ + X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_Reference) //- Attributes DWARF3 -#define DW_AttribKind_V3_XList(X) \ -X(Allocated, 0x4e) \ -X(Associated, 0x4f) \ -X(DataLocation, 0x50) \ -X(ByteStride, 0x51) \ -X(EntryPc, 0x52) \ -X(UseUtf8, 0x53) \ -X(Extension, 0x54) \ -X(Ranges, 0x55) \ -X(Trampoline, 0x56) \ -X(CallColumn, 0x57) \ -X(CallFile, 0x58) \ -X(CallLine, 0x59) \ -X(Description, 0x5a) \ -X(BinaryScale, 0x5b) \ -X(DecimalScale, 0x5c) \ -X(Small, 0x5d) \ -X(DecimalSign, 0x5e) \ -X(DigitCount, 0x5f) \ -X(PictureString, 0x60) \ -X(Mutable, 0x61) \ -X(ThreadsScaled, 0x62) \ -X(Explicit, 0x63) \ -X(ObjectPointer, 0x64) \ -X(Endianity, 0x65) \ -X(Elemental, 0x66) \ -X(Pure, 0x67) \ -X(Recursive, 0x68) +#define DW_AttribKind_V3_XList \ + X(Allocated, 0x4e) \ + X(Associated, 0x4f) \ + X(DataLocation, 0x50) \ + X(ByteStride, 0x51) \ + X(EntryPc, 0x52) \ + X(UseUtf8, 0x53) \ + X(Extension, 0x54) \ + X(Ranges, 0x55) \ + X(Trampoline, 0x56) \ + X(CallColumn, 0x57) \ + X(CallFile, 0x58) \ + X(CallLine, 0x59) \ + X(Description, 0x5a) \ + X(BinaryScale, 0x5b) \ + X(DecimalScale, 0x5c) \ + X(Small, 0x5d) \ + X(DecimalSign, 0x5e) \ + X(DigitCount, 0x5f) \ + X(PictureString, 0x60) \ + X(Mutable, 0x61) \ + X(ThreadsScaled, 0x62) \ + X(Explicit, 0x63) \ + X(ObjectPointer, 0x64) \ + X(Endianity, 0x65) \ + X(Elemental, 0x66) \ + X(Pure, 0x67) \ + X(Recursive, 0x68) -#define DW_AttribKind_ClassFlags_V3_XList(X) \ -X(Sibling, DW_AttribClass_Reference) \ -X(Location, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Name, DW_AttribClass_String) \ -X(Ordering, DW_AttribClass_Const) \ -X(ByteSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(BitOffset, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(BitSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(StmtList, DW_AttribClass_LinePtr) \ -X(LowPc, DW_AttribClass_Address) \ -X(HighPc, DW_AttribClass_Address) \ -X(Language, DW_AttribClass_Const) \ -X(Discr, DW_AttribClass_Reference) \ -X(DiscrValue, DW_AttribClass_Const) \ -X(Visibility, DW_AttribClass_Const) \ -X(Import, DW_AttribClass_Reference) \ -X(StringLength, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(CommonReference, DW_AttribClass_Reference) \ -X(CompDir, DW_AttribClass_String) \ -X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ -X(ContainingType, DW_AttribClass_Reference) \ -X(DefaultValue, DW_AttribClass_Reference) \ -X(Inline, DW_AttribClass_Const) \ -X(IsOptional, DW_AttribClass_Flag) \ -X(LowerBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(Producer, DW_AttribClass_String) \ -X(Prototyped, DW_AttribClass_Flag) \ -X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(StartScope, DW_AttribClass_Const) \ -X(BitStride, DW_AttribClass_Const) \ -X(UpperBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(AbstractOrigin, DW_AttribClass_Reference) \ -X(Accessibility, DW_AttribClass_Const) \ -X(AddressClass, DW_AttribClass_Const) \ -X(Artificial, DW_AttribClass_Flag) \ -X(BaseTypes, DW_AttribClass_Reference) \ -X(CallingConvention, DW_AttribClass_Const) \ -X(Count, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_LocListPtr) \ -X(DeclColumn, DW_AttribClass_Const) \ -X(DeclFile, DW_AttribClass_Const) \ -X(DeclLine, DW_AttribClass_Const) \ -X(Declaration, DW_AttribClass_Flag) \ -X(DiscrList, DW_AttribClass_Block) \ -X(Encoding, DW_AttribClass_Const) \ -X(External, DW_AttribClass_Flag) \ -X(FrameBase, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Friend, DW_AttribClass_Reference) \ -X(IdentifierCase, DW_AttribClass_Const) \ -X(MacroInfo, DW_AttribClass_MacPtr) \ -X(NameListItem, DW_AttribClass_Block) \ -X(Priority, DW_AttribClass_Reference) \ -X(Segment, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Specification, DW_AttribClass_Reference) \ -X(StaticLink, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Type, DW_AttribClass_Reference) \ -X(UseLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(VariableParameter, DW_AttribClass_Flag) \ -X(Virtuality, DW_AttribClass_Const) \ -X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Allocated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(Associated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(DataLocation, DW_AttribClass_Block) \ -X(ByteStride, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(EntryPc, DW_AttribClass_Address) \ -X(UseUtf8, DW_AttribClass_Flag) \ -X(Extension, DW_AttribClass_Reference) \ -X(Ranges, DW_AttribClass_RngListPtr) \ -X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ -X(CallColumn, DW_AttribClass_Const) \ -X(CallFile, DW_AttribClass_Const) \ -X(CallLine, DW_AttribClass_Const) \ -X(Description, DW_AttribClass_String) \ -X(BinaryScale, DW_AttribClass_Const) \ -X(DecimalScale, DW_AttribClass_Const) \ -X(Small, DW_AttribClass_Reference) \ -X(DecimalSign, DW_AttribClass_Const) \ -X(DigitCount, DW_AttribClass_Const) \ -X(PictureString, DW_AttribClass_String) \ -X(Mutable, DW_AttribClass_Flag) \ -X(ThreadsScaled, DW_AttribClass_Flag) \ -X(Explicit, DW_AttribClass_Flag) \ -X(ObjectPointer, DW_AttribClass_Reference) \ -X(Endianity, DW_AttribClass_Const) \ -X(Elemental, DW_AttribClass_Flag) \ -X(Pure, DW_AttribClass_Flag) \ -X(Recursive, DW_AttribClass_Flag) +#define DW_AttribKind_ClassFlags_V3_XList \ + X(Sibling, DW_AttribClass_Reference) \ + X(Location, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ + X(Name, DW_AttribClass_String) \ + X(Ordering, DW_AttribClass_Const) \ + X(ByteSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(BitOffset, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(BitSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(StmtList, DW_AttribClass_LinePtr) \ + X(LowPc, DW_AttribClass_Address) \ + X(HighPc, DW_AttribClass_Address) \ + X(Language, DW_AttribClass_Const) \ + X(Discr, DW_AttribClass_Reference) \ + X(DiscrValue, DW_AttribClass_Const) \ + X(Visibility, DW_AttribClass_Const) \ + X(Import, DW_AttribClass_Reference) \ + X(StringLength, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ + X(CommonReference, DW_AttribClass_Reference) \ + X(CompDir, DW_AttribClass_String) \ + X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ + X(ContainingType, DW_AttribClass_Reference) \ + X(DefaultValue, DW_AttribClass_Reference) \ + X(Inline, DW_AttribClass_Const) \ + X(IsOptional, DW_AttribClass_Flag) \ + X(LowerBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(Producer, DW_AttribClass_String) \ + X(Prototyped, DW_AttribClass_Flag) \ + X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ + X(StartScope, DW_AttribClass_Const) \ + X(BitStride, DW_AttribClass_Const) \ + X(UpperBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(AbstractOrigin, DW_AttribClass_Reference) \ + X(Accessibility, DW_AttribClass_Const) \ + X(AddressClass, DW_AttribClass_Const) \ + X(Artificial, DW_AttribClass_Flag) \ + X(BaseTypes, DW_AttribClass_Reference) \ + X(CallingConvention, DW_AttribClass_Const) \ + X(Count, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_LocListPtr) \ + X(DeclColumn, DW_AttribClass_Const) \ + X(DeclFile, DW_AttribClass_Const) \ + X(DeclLine, DW_AttribClass_Const) \ + X(Declaration, DW_AttribClass_Flag) \ + X(DiscrList, DW_AttribClass_Block) \ + X(Encoding, DW_AttribClass_Const) \ + X(External, DW_AttribClass_Flag) \ + X(FrameBase, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ + X(Friend, DW_AttribClass_Reference) \ + X(IdentifierCase, DW_AttribClass_Const) \ + X(MacroInfo, DW_AttribClass_MacPtr) \ + X(NameListItem, DW_AttribClass_Block) \ + X(Priority, DW_AttribClass_Reference) \ + X(Segment, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ + X(Specification, DW_AttribClass_Reference) \ + X(StaticLink, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ + X(Type, DW_AttribClass_Reference) \ + X(UseLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ + X(VariableParameter, DW_AttribClass_Flag) \ + X(Virtuality, DW_AttribClass_Const) \ + X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ + X(Allocated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(Associated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(DataLocation, DW_AttribClass_Block) \ + X(ByteStride, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ + X(EntryPc, DW_AttribClass_Address) \ + X(UseUtf8, DW_AttribClass_Flag) \ + X(Extension, DW_AttribClass_Reference) \ + X(Ranges, DW_AttribClass_RngListPtr) \ + X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ + X(CallColumn, DW_AttribClass_Const) \ + X(CallFile, DW_AttribClass_Const) \ + X(CallLine, DW_AttribClass_Const) \ + X(Description, DW_AttribClass_String) \ + X(BinaryScale, DW_AttribClass_Const) \ + X(DecimalScale, DW_AttribClass_Const) \ + X(Small, DW_AttribClass_Reference) \ + X(DecimalSign, DW_AttribClass_Const) \ + X(DigitCount, DW_AttribClass_Const) \ + X(PictureString, DW_AttribClass_String) \ + X(Mutable, DW_AttribClass_Flag) \ + X(ThreadsScaled, DW_AttribClass_Flag) \ + X(Explicit, DW_AttribClass_Flag) \ + X(ObjectPointer, DW_AttribClass_Reference) \ + X(Endianity, DW_AttribClass_Const) \ + X(Elemental, DW_AttribClass_Flag) \ + X(Pure, DW_AttribClass_Flag) \ + X(Recursive, DW_AttribClass_Flag) //- Attributes DWARF4 -#define DW_AttribKind_V4_XList(X) \ -X(Signature, 0x69) \ -X(MainSubProgram, 0x6a) \ -X(DataBitOffset, 0x6b) \ -X(ConstExpr, 0x6c) \ -X(EnumClass, 0x6d) \ -X(LinkageName, 0x6e) +#define DW_AttribKind_V4_XList \ + X(Signature, 0x69) \ + X(MainSubProgram, 0x6a) \ + X(DataBitOffset, 0x6b) \ + X(ConstExpr, 0x6c) \ + X(EnumClass, 0x6d) \ + X(LinkageName, 0x6e) -#define DW_AttribKind_ClassFlags_V4_XList(X) \ -X(Sibling, DW_AttribClass_Reference) \ -X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Name, DW_AttribClass_String) \ -X(Ordering, DW_AttribClass_Const) \ -X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(StmtList, DW_AttribClass_LinePtr) \ -X(LowPc, DW_AttribClass_Address) \ -X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ -X(Language, DW_AttribClass_Const) \ -X(Discr, DW_AttribClass_Reference) \ -X(DiscrValue, DW_AttribClass_Const) \ -X(Visibility, DW_AttribClass_Const) \ -X(Import, DW_AttribClass_Reference) \ -X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(CommonReference, DW_AttribClass_Reference) \ -X(CompDir, DW_AttribClass_String) \ -X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ -X(ContainingType, DW_AttribClass_Reference) \ -X(DefaultValue, DW_AttribClass_Reference) \ -X(Inline, DW_AttribClass_Const) \ -X(IsOptional, DW_AttribClass_Flag) \ -X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(Producer, DW_AttribClass_String) \ -X(Prototyped, DW_AttribClass_Flag) \ -X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ -X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(AbstractOrigin, DW_AttribClass_Reference) \ -X(Accessibility, DW_AttribClass_Const) \ -X(AddressClass, DW_AttribClass_Const) \ -X(Artificial, DW_AttribClass_Flag) \ -X(BaseTypes, DW_AttribClass_Reference) \ -X(CallingConvention, DW_AttribClass_Const) \ -X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(DeclColumn, DW_AttribClass_Const) \ -X(DeclFile, DW_AttribClass_Const) \ -X(DeclLine, DW_AttribClass_Const) \ -X(Declaration, DW_AttribClass_Flag) \ -X(DiscrList, DW_AttribClass_Block) \ -X(Encoding, DW_AttribClass_Const) \ -X(External, DW_AttribClass_Flag) \ -X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Friend, DW_AttribClass_Reference) \ -X(IdentifierCase, DW_AttribClass_Const) \ -X(MacroInfo, DW_AttribClass_MacPtr) \ -X(NameListItem, DW_AttribClass_Reference) \ -X(Priority, DW_AttribClass_Reference) \ -X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Specification, DW_AttribClass_Reference) \ -X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Type, DW_AttribClass_Reference) \ -X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(VariableParameter, DW_AttribClass_Flag) \ -X(Virtuality, DW_AttribClass_Const) \ -X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(DataLocation, DW_AttribClass_ExprLoc) \ -X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(EntryPc, DW_AttribClass_Address) \ -X(UseUtf8, DW_AttribClass_Flag) \ -X(Extension, DW_AttribClass_Reference) \ -X(Ranges, DW_AttribClass_RngListPtr) \ -X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ -X(CallColumn, DW_AttribClass_Const) \ -X(CallFile, DW_AttribClass_Const) \ -X(CallLine, DW_AttribClass_Const) \ -X(Description, DW_AttribClass_String) \ -X(BinaryScale, DW_AttribClass_Const) \ -X(DecimalScale, DW_AttribClass_Const) \ -X(Small, DW_AttribClass_Reference) \ -X(DecimalSign, DW_AttribClass_Const) \ -X(DigitCount, DW_AttribClass_Const) \ -X(PictureString, DW_AttribClass_String) \ -X(Mutable, DW_AttribClass_Flag) \ -X(ThreadsScaled, DW_AttribClass_Flag) \ -X(Explicit, DW_AttribClass_Flag) \ -X(ObjectPointer, DW_AttribClass_Reference) \ -X(Endianity, DW_AttribClass_Const) \ -X(Elemental, DW_AttribClass_Flag) \ -X(Pure, DW_AttribClass_Flag) \ -X(Recursive, DW_AttribClass_Flag) \ -X(Signature, DW_AttribClass_Reference) \ -X(MainSubProgram, DW_AttribClass_Flag) \ -X(DataBitOffset, DW_AttribClass_Const) \ -X(ConstExpr, DW_AttribClass_Flag) \ -X(EnumClass, DW_AttribClass_Flag) \ -X(LinkageName, DW_AttribClass_String) +#define DW_AttribKind_ClassFlags_V4_XList \ + X(Sibling, DW_AttribClass_Reference) \ + X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(Name, DW_AttribClass_String) \ + X(Ordering, DW_AttribClass_Const) \ + X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(StmtList, DW_AttribClass_LinePtr) \ + X(LowPc, DW_AttribClass_Address) \ + X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ + X(Language, DW_AttribClass_Const) \ + X(Discr, DW_AttribClass_Reference) \ + X(DiscrValue, DW_AttribClass_Const) \ + X(Visibility, DW_AttribClass_Const) \ + X(Import, DW_AttribClass_Reference) \ + X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(CommonReference, DW_AttribClass_Reference) \ + X(CompDir, DW_AttribClass_String) \ + X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ + X(ContainingType, DW_AttribClass_Reference) \ + X(DefaultValue, DW_AttribClass_Reference) \ + X(Inline, DW_AttribClass_Const) \ + X(IsOptional, DW_AttribClass_Flag) \ + X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(Producer, DW_AttribClass_String) \ + X(Prototyped, DW_AttribClass_Flag) \ + X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ + X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(AbstractOrigin, DW_AttribClass_Reference) \ + X(Accessibility, DW_AttribClass_Const) \ + X(AddressClass, DW_AttribClass_Const) \ + X(Artificial, DW_AttribClass_Flag) \ + X(BaseTypes, DW_AttribClass_Reference) \ + X(CallingConvention, DW_AttribClass_Const) \ + X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(DeclColumn, DW_AttribClass_Const) \ + X(DeclFile, DW_AttribClass_Const) \ + X(DeclLine, DW_AttribClass_Const) \ + X(Declaration, DW_AttribClass_Flag) \ + X(DiscrList, DW_AttribClass_Block) \ + X(Encoding, DW_AttribClass_Const) \ + X(External, DW_AttribClass_Flag) \ + X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(Friend, DW_AttribClass_Reference) \ + X(IdentifierCase, DW_AttribClass_Const) \ + X(MacroInfo, DW_AttribClass_MacPtr) \ + X(NameListItem, DW_AttribClass_Reference) \ + X(Priority, DW_AttribClass_Reference) \ + X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(Specification, DW_AttribClass_Reference) \ + X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(Type, DW_AttribClass_Reference) \ + X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(VariableParameter, DW_AttribClass_Flag) \ + X(Virtuality, DW_AttribClass_Const) \ + X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(DataLocation, DW_AttribClass_ExprLoc) \ + X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(EntryPc, DW_AttribClass_Address) \ + X(UseUtf8, DW_AttribClass_Flag) \ + X(Extension, DW_AttribClass_Reference) \ + X(Ranges, DW_AttribClass_RngListPtr) \ + X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ + X(CallColumn, DW_AttribClass_Const) \ + X(CallFile, DW_AttribClass_Const) \ + X(CallLine, DW_AttribClass_Const) \ + X(Description, DW_AttribClass_String) \ + X(BinaryScale, DW_AttribClass_Const) \ + X(DecimalScale, DW_AttribClass_Const) \ + X(Small, DW_AttribClass_Reference) \ + X(DecimalSign, DW_AttribClass_Const) \ + X(DigitCount, DW_AttribClass_Const) \ + X(PictureString, DW_AttribClass_String) \ + X(Mutable, DW_AttribClass_Flag) \ + X(ThreadsScaled, DW_AttribClass_Flag) \ + X(Explicit, DW_AttribClass_Flag) \ + X(ObjectPointer, DW_AttribClass_Reference) \ + X(Endianity, DW_AttribClass_Const) \ + X(Elemental, DW_AttribClass_Flag) \ + X(Pure, DW_AttribClass_Flag) \ + X(Recursive, DW_AttribClass_Flag) \ + X(Signature, DW_AttribClass_Reference) \ + X(MainSubProgram, DW_AttribClass_Flag) \ + X(DataBitOffset, DW_AttribClass_Const) \ + X(ConstExpr, DW_AttribClass_Flag) \ + X(EnumClass, DW_AttribClass_Flag) \ + X(LinkageName, DW_AttribClass_String) //- Attributes DWARF5 -#define DW_AttribKind_V5_XList(X) \ -X(StringLengthBitSize, 0x6f) \ -X(StringLengthByteSize, 0x70) \ -X(Rank, 0x71) \ -X(StrOffsetsBase, 0x72) \ -X(AddrBase, 0x73) \ -X(RngListsBase, 0x74) \ -X(DwoName, 0x76) \ -X(Reference, 0x77) \ -X(RValueReference, 0x78) \ -X(Macros, 0x79) \ -X(CallAllCalls, 0x7a) \ -X(CallAllSourceCalls, 0x7b) \ -X(CallAllTailCalls, 0x7c) \ -X(CallReturnPc, 0x7d) \ -X(CallValue, 0x7e) \ -X(CallOrigin, 0x7f) \ -X(CallParameter, 0x80) \ -X(CallPc, 0x81) \ -X(CallTailCall, 0x82) \ -X(CallTarget, 0x83) \ -X(CallTargetClobbered, 0x84) \ -X(CallDataLocation, 0x85) \ -X(CallDataValue, 0x86) \ -X(NoReturn, 0x87) \ -X(Alignment, 0x88) \ -X(ExportSymbols, 0x89) \ -X(Deleted, 0x8a) \ -X(Defaulted, 0x8b) \ -X(LocListsBase, 0x8c) +#define DW_AttribKind_V5_XList \ + X(StringLengthBitSize, 0x6f) \ + X(StringLengthByteSize, 0x70) \ + X(Rank, 0x71) \ + X(StrOffsetsBase, 0x72) \ + X(AddrBase, 0x73) \ + X(RngListsBase, 0x74) \ + X(DwoName, 0x76) \ + X(Reference, 0x77) \ + X(RValueReference, 0x78) \ + X(Macros, 0x79) \ + X(CallAllCalls, 0x7a) \ + X(CallAllSourceCalls, 0x7b) \ + X(CallAllTailCalls, 0x7c) \ + X(CallReturnPc, 0x7d) \ + X(CallValue, 0x7e) \ + X(CallOrigin, 0x7f) \ + X(CallParameter, 0x80) \ + X(CallPc, 0x81) \ + X(CallTailCall, 0x82) \ + X(CallTarget, 0x83) \ + X(CallTargetClobbered, 0x84) \ + X(CallDataLocation, 0x85) \ + X(CallDataValue, 0x86) \ + X(NoReturn, 0x87) \ + X(Alignment, 0x88) \ + X(ExportSymbols, 0x89) \ + X(Deleted, 0x8a) \ + X(Defaulted, 0x8b) \ + X(LocListsBase, 0x8c) -#define DW_AttribKind_ClassFlags_V5_XList(X) \ -X(Sibling, DW_AttribClass_Reference) \ -X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Name, DW_AttribClass_String) \ -X(Ordering, DW_AttribClass_Const) \ -X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(StmtList, DW_AttribClass_LinePtr) \ -X(LowPc, DW_AttribClass_Address) \ -X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ -X(Language, DW_AttribClass_Const) \ -X(Discr, DW_AttribClass_Reference) \ -X(DiscrValue, DW_AttribClass_Const) \ -X(Visibility, DW_AttribClass_Const) \ -X(Import, DW_AttribClass_Reference) \ -X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(CommonReference, DW_AttribClass_Reference) \ -X(CompDir, DW_AttribClass_String) \ -X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ -X(ContainingType, DW_AttribClass_Reference) \ -X(DefaultValue, DW_AttribClass_Reference) \ -X(Inline, DW_AttribClass_Const) \ -X(IsOptional, DW_AttribClass_Flag) \ -X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(Producer, DW_AttribClass_String) \ -X(Prototyped, DW_AttribClass_Flag) \ -X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ -X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(AbstractOrigin, DW_AttribClass_Reference) \ -X(Accessibility, DW_AttribClass_Const) \ -X(AddressClass, DW_AttribClass_Const) \ -X(Artificial, DW_AttribClass_Flag) \ -X(BaseTypes, DW_AttribClass_Reference) \ -X(CallingConvention, DW_AttribClass_Const) \ -X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(DeclColumn, DW_AttribClass_Const) \ -X(DeclFile, DW_AttribClass_Const) \ -X(DeclLine, DW_AttribClass_Const) \ -X(Declaration, DW_AttribClass_Flag) \ -X(DiscrList, DW_AttribClass_Block) \ -X(Encoding, DW_AttribClass_Const) \ -X(External, DW_AttribClass_Flag) \ -X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(Friend, DW_AttribClass_Reference) \ -X(IdentifierCase, DW_AttribClass_Const) \ -X(MacroInfo, DW_AttribClass_MacPtr) \ -X(NameListItem, DW_AttribClass_Reference) \ -X(Priority, DW_AttribClass_Reference) \ -X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(Specification, DW_AttribClass_Reference) \ -X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(Type, DW_AttribClass_Reference) \ -X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(VariableParameter, DW_AttribClass_Flag) \ -X(Virtuality, DW_AttribClass_Const) \ -X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(DataLocation, DW_AttribClass_ExprLoc) \ -X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(EntryPc, DW_AttribClass_Address|DW_AttribClass_Const) \ -X(UseUtf8, DW_AttribClass_Flag) \ -X(Extension, DW_AttribClass_Reference) \ -X(Ranges, DW_AttribClass_RngList) \ -X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ -X(CallColumn, DW_AttribClass_Const) \ -X(CallFile, DW_AttribClass_Const) \ -X(CallLine, DW_AttribClass_Const) \ -X(Description, DW_AttribClass_String) \ -X(BinaryScale, DW_AttribClass_Const) \ -X(DecimalScale, DW_AttribClass_Const) \ -X(Small, DW_AttribClass_Reference) \ -X(DecimalSign, DW_AttribClass_Const) \ -X(DigitCount, DW_AttribClass_Const) \ -X(PictureString, DW_AttribClass_String) \ -X(Mutable, DW_AttribClass_Flag) \ -X(ThreadsScaled, DW_AttribClass_Flag) \ -X(Explicit, DW_AttribClass_Flag) \ -X(ObjectPointer, DW_AttribClass_Reference) \ -X(Endianity, DW_AttribClass_Const) \ -X(Elemental, DW_AttribClass_Flag) \ -X(Pure, DW_AttribClass_Flag) \ -X(Recursive, DW_AttribClass_Flag) \ -X(Signature, DW_AttribClass_Reference) \ -X(MainSubProgram, DW_AttribClass_Flag) \ -X(DataBitOffset, DW_AttribClass_Const) \ -X(ConstExpr, DW_AttribClass_Flag) \ -X(EnumClass, DW_AttribClass_Flag) \ -X(LinkageName, DW_AttribClass_String) \ -X(StringLengthBitSize, DW_AttribClass_Const) \ -X(StringLengthByteSize, DW_AttribClass_Const) \ -X(Rank, DW_AttribClass_Const|DW_AttribClass_ExprLoc) \ -X(StrOffsetsBase, DW_AttribClass_StrOffsetsPtr) \ -X(AddrBase, DW_AttribClass_AddrPtr) \ -X(RngListsBase, DW_AttribClass_RngListPtr) \ -X(DwoName, DW_AttribClass_String) \ -X(Reference, DW_AttribClass_Flag) \ -X(RValueReference, DW_AttribClass_Flag) \ -X(Macros, DW_AttribClass_MacPtr) \ -X(CallAllCalls, DW_AttribClass_Flag) \ -X(CallAllSourceCalls, DW_AttribClass_Flag) \ -X(CallAllTailCalls, DW_AttribClass_Flag) \ -X(CallReturnPc, DW_AttribClass_Address) \ -X(CallValue, DW_AttribClass_ExprLoc) \ -X(CallOrigin, DW_AttribClass_ExprLoc) \ -X(CallParameter, DW_AttribClass_Reference) \ -X(CallPc, DW_AttribClass_Address) \ -X(CallTailCall, DW_AttribClass_Flag) \ -X(CallTarget, DW_AttribClass_ExprLoc) \ -X(CallTargetClobbered, DW_AttribClass_ExprLoc) \ -X(CallDataLocation, DW_AttribClass_ExprLoc) \ -X(CallDataValue, DW_AttribClass_ExprLoc) \ -X(NoReturn, DW_AttribClass_Flag) \ -X(Alignment, DW_AttribClass_Const) \ -X(ExportSymbols, DW_AttribClass_Flag) \ -X(Deleted, DW_AttribClass_Flag) \ -X(Defaulted, DW_AttribClass_Const) \ -X(LocListsBase, DW_AttribClass_LocListPtr) +#define DW_AttribKind_ClassFlags_V5_XList \ + X(Sibling, DW_AttribClass_Reference) \ + X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(Name, DW_AttribClass_String) \ + X(Ordering, DW_AttribClass_Const) \ + X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(StmtList, DW_AttribClass_LinePtr) \ + X(LowPc, DW_AttribClass_Address) \ + X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ + X(Language, DW_AttribClass_Const) \ + X(Discr, DW_AttribClass_Reference) \ + X(DiscrValue, DW_AttribClass_Const) \ + X(Visibility, DW_AttribClass_Const) \ + X(Import, DW_AttribClass_Reference) \ + X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(CommonReference, DW_AttribClass_Reference) \ + X(CompDir, DW_AttribClass_String) \ + X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ + X(ContainingType, DW_AttribClass_Reference) \ + X(DefaultValue, DW_AttribClass_Reference) \ + X(Inline, DW_AttribClass_Const) \ + X(IsOptional, DW_AttribClass_Flag) \ + X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(Producer, DW_AttribClass_String) \ + X(Prototyped, DW_AttribClass_Flag) \ + X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ + X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ + X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(AbstractOrigin, DW_AttribClass_Reference) \ + X(Accessibility, DW_AttribClass_Const) \ + X(AddressClass, DW_AttribClass_Const) \ + X(Artificial, DW_AttribClass_Flag) \ + X(BaseTypes, DW_AttribClass_Reference) \ + X(CallingConvention, DW_AttribClass_Const) \ + X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ + X(DeclColumn, DW_AttribClass_Const) \ + X(DeclFile, DW_AttribClass_Const) \ + X(DeclLine, DW_AttribClass_Const) \ + X(Declaration, DW_AttribClass_Flag) \ + X(DiscrList, DW_AttribClass_Block) \ + X(Encoding, DW_AttribClass_Const) \ + X(External, DW_AttribClass_Flag) \ + X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ + X(Friend, DW_AttribClass_Reference) \ + X(IdentifierCase, DW_AttribClass_Const) \ + X(MacroInfo, DW_AttribClass_MacPtr) \ + X(NameListItem, DW_AttribClass_Reference) \ + X(Priority, DW_AttribClass_Reference) \ + X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ + X(Specification, DW_AttribClass_Reference) \ + X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ + X(Type, DW_AttribClass_Reference) \ + X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ + X(VariableParameter, DW_AttribClass_Flag) \ + X(Virtuality, DW_AttribClass_Const) \ + X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ + X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(DataLocation, DW_AttribClass_ExprLoc) \ + X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ + X(EntryPc, DW_AttribClass_Address|DW_AttribClass_Const) \ + X(UseUtf8, DW_AttribClass_Flag) \ + X(Extension, DW_AttribClass_Reference) \ + X(Ranges, DW_AttribClass_RngList) \ + X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ + X(CallColumn, DW_AttribClass_Const) \ + X(CallFile, DW_AttribClass_Const) \ + X(CallLine, DW_AttribClass_Const) \ + X(Description, DW_AttribClass_String) \ + X(BinaryScale, DW_AttribClass_Const) \ + X(DecimalScale, DW_AttribClass_Const) \ + X(Small, DW_AttribClass_Reference) \ + X(DecimalSign, DW_AttribClass_Const) \ + X(DigitCount, DW_AttribClass_Const) \ + X(PictureString, DW_AttribClass_String) \ + X(Mutable, DW_AttribClass_Flag) \ + X(ThreadsScaled, DW_AttribClass_Flag) \ + X(Explicit, DW_AttribClass_Flag) \ + X(ObjectPointer, DW_AttribClass_Reference) \ + X(Endianity, DW_AttribClass_Const) \ + X(Elemental, DW_AttribClass_Flag) \ + X(Pure, DW_AttribClass_Flag) \ + X(Recursive, DW_AttribClass_Flag) \ + X(Signature, DW_AttribClass_Reference) \ + X(MainSubProgram, DW_AttribClass_Flag) \ + X(DataBitOffset, DW_AttribClass_Const) \ + X(ConstExpr, DW_AttribClass_Flag) \ + X(EnumClass, DW_AttribClass_Flag) \ + X(LinkageName, DW_AttribClass_String) \ + X(StringLengthBitSize, DW_AttribClass_Const) \ + X(StringLengthByteSize, DW_AttribClass_Const) \ + X(Rank, DW_AttribClass_Const|DW_AttribClass_ExprLoc) \ + X(StrOffsetsBase, DW_AttribClass_StrOffsetsPtr) \ + X(AddrBase, DW_AttribClass_AddrPtr) \ + X(RngListsBase, DW_AttribClass_RngListPtr) \ + X(DwoName, DW_AttribClass_String) \ + X(Reference, DW_AttribClass_Flag) \ + X(RValueReference, DW_AttribClass_Flag) \ + X(Macros, DW_AttribClass_MacPtr) \ + X(CallAllCalls, DW_AttribClass_Flag) \ + X(CallAllSourceCalls, DW_AttribClass_Flag) \ + X(CallAllTailCalls, DW_AttribClass_Flag) \ + X(CallReturnPc, DW_AttribClass_Address) \ + X(CallValue, DW_AttribClass_ExprLoc) \ + X(CallOrigin, DW_AttribClass_ExprLoc) \ + X(CallParameter, DW_AttribClass_Reference) \ + X(CallPc, DW_AttribClass_Address) \ + X(CallTailCall, DW_AttribClass_Flag) \ + X(CallTarget, DW_AttribClass_ExprLoc) \ + X(CallTargetClobbered, DW_AttribClass_ExprLoc) \ + X(CallDataLocation, DW_AttribClass_ExprLoc) \ + X(CallDataValue, DW_AttribClass_ExprLoc) \ + X(NoReturn, DW_AttribClass_Flag) \ + X(Alignment, DW_AttribClass_Const) \ + X(ExportSymbols, DW_AttribClass_Flag) \ + X(Deleted, DW_AttribClass_Flag) \ + X(Defaulted, DW_AttribClass_Const) \ + X(LocListsBase, DW_AttribClass_LocListPtr) //- Attributes GNU -#define DW_AttribKind_GNU_XList(X) \ -X(GNU_Vector, 0x2107) \ -X(GNU_GuardedBy, 0x2108) \ -X(GNU_PtGuardedBy, 0x2109) \ -X(GNU_Guarded, 0x210a) \ -X(GNU_PtGuarded, 0x210b) \ -X(GNU_LocksExcluded, 0x210c) \ -X(GNU_ExclusiveLocksRequired, 0x210d) \ -X(GNU_SharedLocksRequired, 0x210e) \ -X(GNU_OdrSignature, 0x210f) \ -X(GNU_TemplateName, 0x2110) \ -X(GNU_CallSiteValue, 0x2111) \ -X(GNU_CallSiteDataValue, 0x2112) \ -X(GNU_CallSiteTarget, 0x2113) \ -X(GNU_CallSiteTargetClobbered, 0x2114) \ -X(GNU_TailCall, 0x2115) \ -X(GNU_AllTailCallsSites, 0x2116) \ -X(GNU_AllCallSites, 0x2117) \ -X(GNU_AllSourceCallSites, 0x2118) \ -X(GNU_Macros, 0x2119) \ -X(GNU_Deleted, 0x211a) \ -X(GNU_DwoName, 0x2130) \ -X(GNU_DwoId, 0x2131) \ -X(GNU_RangesBase, 0x2132) \ -X(GNU_AddrBase, 0x2133) \ -X(GNU_PubNames, 0x2134) \ -X(GNU_PubTypes, 0x2135) \ -X(GNU_Discriminator, 0x2136) \ -X(GNU_LocViews, 0x2137) \ -X(GNU_EntryView, 0x2138) \ -X(GNU_DescriptiveType, 0x2302) \ -X(GNU_Numerator, 0x2303) \ -X(GNU_Denominator, 0x2304) \ -X(GNU_Bias, 0x2305) +#define DW_AttribKind_GNU_XList \ + X(GNU_Vector, 0x2107) \ + X(GNU_GuardedBy, 0x2108) \ + X(GNU_PtGuardedBy, 0x2109) \ + X(GNU_Guarded, 0x210a) \ + X(GNU_PtGuarded, 0x210b) \ + X(GNU_LocksExcluded, 0x210c) \ + X(GNU_ExclusiveLocksRequired, 0x210d) \ + X(GNU_SharedLocksRequired, 0x210e) \ + X(GNU_OdrSignature, 0x210f) \ + X(GNU_TemplateName, 0x2110) \ + X(GNU_CallSiteValue, 0x2111) \ + X(GNU_CallSiteDataValue, 0x2112) \ + X(GNU_CallSiteTarget, 0x2113) \ + X(GNU_CallSiteTargetClobbered, 0x2114) \ + X(GNU_TailCall, 0x2115) \ + X(GNU_AllTailCallsSites, 0x2116) \ + X(GNU_AllCallSites, 0x2117) \ + X(GNU_AllSourceCallSites, 0x2118) \ + X(GNU_Macros, 0x2119) \ + X(GNU_Deleted, 0x211a) \ + X(GNU_DwoName, 0x2130) \ + X(GNU_DwoId, 0x2131) \ + X(GNU_RangesBase, 0x2132) \ + X(GNU_AddrBase, 0x2133) \ + X(GNU_PubNames, 0x2134) \ + X(GNU_PubTypes, 0x2135) \ + X(GNU_Discriminator, 0x2136) \ + X(GNU_LocViews, 0x2137) \ + X(GNU_EntryView, 0x2138) \ + X(GNU_DescriptiveType, 0x2302) \ + X(GNU_Numerator, 0x2303) \ + X(GNU_Denominator, 0x2304) \ + X(GNU_Bias, 0x2305) -#define DW_AttribKind_ClassFlags_GNU_XList(X) \ -X(GNU_Vector, DW_AttribClass_Flag) \ -X(GNU_GuardedBy, DW_AttribClass_Undefined) \ -X(GNU_PtGuardedBy, DW_AttribClass_Undefined) \ -X(GNU_Guarded, DW_AttribClass_Undefined) \ -X(GNU_PtGuarded, DW_AttribClass_Undefined) \ -X(GNU_LocksExcluded, DW_AttribClass_Undefined) \ -X(GNU_ExclusiveLocksRequired, DW_AttribClass_Undefined) \ -X(GNU_SharedLocksRequired, DW_AttribClass_Undefined) \ -X(GNU_OdrSignature, DW_AttribClass_Undefined) \ -X(GNU_TemplateName, DW_AttribClass_Undefined) \ -X(GNU_CallSiteValue, DW_AttribClass_ExprLoc) \ -X(GNU_CallSiteDataValue, DW_AttribClass_ExprLoc) \ -X(GNU_CallSiteTarget, DW_AttribClass_ExprLoc) \ -X(GNU_CallSiteTargetClobbered, DW_AttribClass_ExprLoc) \ -X(GNU_TailCall, DW_AttribClass_Flag) \ -X(GNU_AllTailCallsSites, DW_AttribClass_Flag) \ -X(GNU_AllCallSites, DW_AttribClass_Flag) \ -X(GNU_AllSourceCallSites, DW_AttribClass_Flag) \ -X(GNU_Macros, DW_AttribClass_Flag) \ -X(GNU_Deleted, DW_AttribClass_Undefined) \ -X(GNU_DwoName, DW_AttribClass_String) \ -X(GNU_DwoId, DW_AttribClass_Const) \ -X(GNU_RangesBase, DW_AttribClass_Undefined) \ -X(GNU_AddrBase, DW_AttribClass_AddrPtr) \ -X(GNU_PubNames, DW_AttribClass_Flag) \ -X(GNU_PubTypes, DW_AttribClass_Undefined) \ -X(GNU_Discriminator, DW_AttribClass_Const) \ -X(GNU_LocViews, DW_AttribClass_Undefined) \ -X(GNU_EntryView, DW_AttribClass_Undefined) \ -X(GNU_DescriptiveType, DW_AttribClass_Undefined) \ -X(GNU_Numerator, DW_AttribClass_Undefined) \ -X(GNU_Denominator, DW_AttribClass_Undefined) \ -X(GNU_Bias, DW_AttribClass_Undefined) +#define DW_AttribKind_ClassFlags_GNU_XList \ + X(GNU_Vector, DW_AttribClass_Flag) \ + X(GNU_GuardedBy, DW_AttribClass_Undefined) \ + X(GNU_PtGuardedBy, DW_AttribClass_Undefined) \ + X(GNU_Guarded, DW_AttribClass_Undefined) \ + X(GNU_PtGuarded, DW_AttribClass_Undefined) \ + X(GNU_LocksExcluded, DW_AttribClass_Undefined) \ + X(GNU_ExclusiveLocksRequired, DW_AttribClass_Undefined) \ + X(GNU_SharedLocksRequired, DW_AttribClass_Undefined) \ + X(GNU_OdrSignature, DW_AttribClass_Undefined) \ + X(GNU_TemplateName, DW_AttribClass_Undefined) \ + X(GNU_CallSiteValue, DW_AttribClass_ExprLoc) \ + X(GNU_CallSiteDataValue, DW_AttribClass_ExprLoc) \ + X(GNU_CallSiteTarget, DW_AttribClass_ExprLoc) \ + X(GNU_CallSiteTargetClobbered, DW_AttribClass_ExprLoc) \ + X(GNU_TailCall, DW_AttribClass_Flag) \ + X(GNU_AllTailCallsSites, DW_AttribClass_Flag) \ + X(GNU_AllCallSites, DW_AttribClass_Flag) \ + X(GNU_AllSourceCallSites, DW_AttribClass_Flag) \ + X(GNU_Macros, DW_AttribClass_Flag) \ + X(GNU_Deleted, DW_AttribClass_Undefined) \ + X(GNU_DwoName, DW_AttribClass_String) \ + X(GNU_DwoId, DW_AttribClass_Const) \ + X(GNU_RangesBase, DW_AttribClass_Undefined) \ + X(GNU_AddrBase, DW_AttribClass_AddrPtr) \ + X(GNU_PubNames, DW_AttribClass_Flag) \ + X(GNU_PubTypes, DW_AttribClass_Undefined) \ + X(GNU_Discriminator, DW_AttribClass_Const) \ + X(GNU_LocViews, DW_AttribClass_Undefined) \ + X(GNU_EntryView, DW_AttribClass_Undefined) \ + X(GNU_DescriptiveType, DW_AttribClass_Undefined) \ + X(GNU_Numerator, DW_AttribClass_Undefined) \ + X(GNU_Denominator, DW_AttribClass_Undefined) \ + X(GNU_Bias, DW_AttribClass_Undefined) //- Attributes LLVM -#define DW_AttribKind_LLVM_XList(X) \ -X(LLVM_IncludePath, 0x3e00) \ -X(LLVM_ConfigMacros, 0x3e01) \ -X(LLVM_SysRoot, 0x3e02) \ -X(LLVM_TagOffset, 0x3e03) \ -X(LLVM_ApiNotes, 0x3e07) +#define DW_AttribKind_LLVM_XList \ + X(LLVM_IncludePath, 0x3e00) \ + X(LLVM_ConfigMacros, 0x3e01) \ + X(LLVM_SysRoot, 0x3e02) \ + X(LLVM_TagOffset, 0x3e03) \ + X(LLVM_ApiNotes, 0x3e07) -#define DW_AttribKind_ClassFlags_LLVM_XList(X) \ -X(LLVM_IncludePath, DW_AttribClass_String) \ -X(LLVM_ConfigMacros, DW_AttribClass_String) \ -X(LLVM_SysRoot, DW_AttribClass_String) \ -X(LLVM_TagOffset, DW_AttribClass_Undefined) \ -X(LLVM_ApiNotes, DW_AttribClass_String) +#define DW_AttribKind_ClassFlags_LLVM_XList \ + X(LLVM_IncludePath, DW_AttribClass_String) \ + X(LLVM_ConfigMacros, DW_AttribClass_String) \ + X(LLVM_SysRoot, DW_AttribClass_String) \ + X(LLVM_TagOffset, DW_AttribClass_Undefined) \ + X(LLVM_ApiNotes, DW_AttribClass_String) //- Attributes Apple -#define DW_AttribKind_APPLE_XList(X) \ -X(APPLE_Optimized, 0x3fe1) \ -X(APPLE_Flags, 0x3fe2) \ -X(APPLE_Isa, 0x3fe3) \ -X(APPLE_Block, 0x3fe4) \ -X(APPLE_MajorRuntimeVers, 0x3fe5) \ -X(APPLE_RuntimeClass, 0x3fe6) \ -X(APPLE_OmitFramePtr, 0x3fe7) \ -X(APPLE_PropertyName, 0x3fe8) \ -X(APPLE_PropertyGetter, 0x3fe9) \ -X(APPLE_PropertySetter, 0x3fea) \ -X(APPLE_PropertyAttribute, 0x3feb) \ -X(APPLE_ObjcCompleteType, 0x3fec) \ -X(APPLE_Property, 0x3fed) \ -X(APPLE_ObjDirect, 0x3fee) \ -X(APPLE_Sdk, 0x3fef) +#define DW_AttribKind_APPLE_XList \ + X(APPLE_Optimized, 0x3fe1) \ + X(APPLE_Flags, 0x3fe2) \ + X(APPLE_Isa, 0x3fe3) \ + X(APPLE_Block, 0x3fe4) \ + X(APPLE_MajorRuntimeVers, 0x3fe5) \ + X(APPLE_RuntimeClass, 0x3fe6) \ + X(APPLE_OmitFramePtr, 0x3fe7) \ + X(APPLE_PropertyName, 0x3fe8) \ + X(APPLE_PropertyGetter, 0x3fe9) \ + X(APPLE_PropertySetter, 0x3fea) \ + X(APPLE_PropertyAttribute, 0x3feb) \ + X(APPLE_ObjcCompleteType, 0x3fec) \ + X(APPLE_Property, 0x3fed) \ + X(APPLE_ObjDirect, 0x3fee) \ + X(APPLE_Sdk, 0x3fef) -#define DW_AttribKind_ClassFlags_APPLE_XList(X) \ -X(APPLE_Optimized, DW_AttribClass_Flag) \ -X(APPLE_Flags, DW_AttribClass_Flag) \ -X(APPLE_Isa, DW_AttribClass_Flag) \ -X(APPLE_Block, DW_AttribClass_Undefined) \ -X(APPLE_MajorRuntimeVers, DW_AttribClass_Undefined) \ -X(APPLE_RuntimeClass, DW_AttribClass_Undefined) \ -X(APPLE_OmitFramePtr, DW_AttribClass_Flag) \ -X(APPLE_PropertyName, DW_AttribClass_Undefined) \ -X(APPLE_PropertyGetter, DW_AttribClass_Undefined) \ -X(APPLE_PropertySetter, DW_AttribClass_Undefined) \ -X(APPLE_PropertyAttribute, DW_AttribClass_Undefined) \ -X(APPLE_ObjcCompleteType, DW_AttribClass_Undefined) \ -X(APPLE_Property, DW_AttribClass_Undefined) \ -X(APPLE_ObjDirect, DW_AttribClass_Undefined) \ -X(APPLE_Sdk, DW_AttribClass_String) +#define DW_AttribKind_ClassFlags_APPLE_XList \ + X(APPLE_Optimized, DW_AttribClass_Flag) \ + X(APPLE_Flags, DW_AttribClass_Flag) \ + X(APPLE_Isa, DW_AttribClass_Flag) \ + X(APPLE_Block, DW_AttribClass_Undefined) \ + X(APPLE_MajorRuntimeVers, DW_AttribClass_Undefined) \ + X(APPLE_RuntimeClass, DW_AttribClass_Undefined) \ + X(APPLE_OmitFramePtr, DW_AttribClass_Flag) \ + X(APPLE_PropertyName, DW_AttribClass_Undefined) \ + X(APPLE_PropertyGetter, DW_AttribClass_Undefined) \ + X(APPLE_PropertySetter, DW_AttribClass_Undefined) \ + X(APPLE_PropertyAttribute, DW_AttribClass_Undefined) \ + X(APPLE_ObjcCompleteType, DW_AttribClass_Undefined) \ + X(APPLE_Property, DW_AttribClass_Undefined) \ + X(APPLE_ObjDirect, DW_AttribClass_Undefined) \ + X(APPLE_Sdk, DW_AttribClass_String) //- Attributes MIPS -#define DW_AttribKind_MIPS_XList(X) \ -X(MIPS_Fde, 0x2001) \ -X(MIPS_LoopBegin, 0x2002) \ -X(MIPS_TailLoopBegin, 0x2003) \ -X(MIPS_EpilogBegin, 0x2004) \ -X(MIPS_LoopUnrollFactor, 0x2005) \ -X(MIPS_SoftwarePipelineDepth, 0x2006) \ -X(MIPS_LinkageName, 0x2007) \ -X(MIPS_Stride, 0x2008) \ -X(MIPS_AbstractName, 0x2009) \ -X(MIPS_CloneOrigin, 0x200a) \ -X(MIPS_HasInlines, 0x200b) \ -X(MIPS_StrideByte, 0x200c) \ -X(MIPS_StrideElem, 0x200d) \ -X(MIPS_PtrDopeType, 0x200e) \ -X(MIPS_AllocatableDopeType, 0x200f) \ -X(MIPS_AssumedShapeDopeType, 0x2010) \ -X(MIPS_AssumedSize, 0x2011) +#define DW_AttribKind_MIPS_XList \ + X(MIPS_Fde, 0x2001) \ + X(MIPS_LoopBegin, 0x2002) \ + X(MIPS_TailLoopBegin, 0x2003) \ + X(MIPS_EpilogBegin, 0x2004) \ + X(MIPS_LoopUnrollFactor, 0x2005) \ + X(MIPS_SoftwarePipelineDepth, 0x2006) \ + X(MIPS_LinkageName, 0x2007) \ + X(MIPS_Stride, 0x2008) \ + X(MIPS_AbstractName, 0x2009) \ + X(MIPS_CloneOrigin, 0x200a) \ + X(MIPS_HasInlines, 0x200b) \ + X(MIPS_StrideByte, 0x200c) \ + X(MIPS_StrideElem, 0x200d) \ + X(MIPS_PtrDopeType, 0x200e) \ + X(MIPS_AllocatableDopeType, 0x200f) \ + X(MIPS_AssumedShapeDopeType, 0x2010) \ + X(MIPS_AssumedSize, 0x2011) -#define DW_AttribKind_ClassFlags_MIPS_XList(X) \ -X(MIPS_Fde, DW_AttribClass_Block) \ -X(MIPS_LoopBegin, DW_AttribClass_Block) \ -X(MIPS_TailLoopBegin, DW_AttribClass_Block) \ -X(MIPS_EpilogBegin, DW_AttribClass_Block) \ -X(MIPS_LoopUnrollFactor, DW_AttribClass_Block) \ -X(MIPS_SoftwarePipelineDepth, DW_AttribClass_Block) \ -X(MIPS_LinkageName, DW_AttribClass_String) \ -X(MIPS_Stride, DW_AttribClass_Block) \ -X(MIPS_AbstractName, DW_AttribClass_String) \ -X(MIPS_CloneOrigin, DW_AttribClass_String) \ -X(MIPS_HasInlines, DW_AttribClass_Reference) \ -X(MIPS_StrideByte, DW_AttribClass_Reference) \ -X(MIPS_StrideElem, DW_AttribClass_Reference) \ -X(MIPS_PtrDopeType, DW_AttribClass_Reference) \ -X(MIPS_AllocatableDopeType, DW_AttribClass_Reference) \ -X(MIPS_AssumedShapeDopeType, DW_AttribClass_Reference) \ -X(MIPS_AssumedSize, DW_AttribClass_Reference) +#define DW_AttribKind_ClassFlags_MIPS_XList \ + X(MIPS_Fde, DW_AttribClass_Block) \ + X(MIPS_LoopBegin, DW_AttribClass_Block) \ + X(MIPS_TailLoopBegin, DW_AttribClass_Block) \ + X(MIPS_EpilogBegin, DW_AttribClass_Block) \ + X(MIPS_LoopUnrollFactor, DW_AttribClass_Block) \ + X(MIPS_SoftwarePipelineDepth, DW_AttribClass_Block) \ + X(MIPS_LinkageName, DW_AttribClass_String) \ + X(MIPS_Stride, DW_AttribClass_Block) \ + X(MIPS_AbstractName, DW_AttribClass_String) \ + X(MIPS_CloneOrigin, DW_AttribClass_String) \ + X(MIPS_HasInlines, DW_AttribClass_Reference) \ + X(MIPS_StrideByte, DW_AttribClass_Reference) \ + X(MIPS_StrideElem, DW_AttribClass_Reference) \ + X(MIPS_PtrDopeType, DW_AttribClass_Reference) \ + X(MIPS_AllocatableDopeType, DW_AttribClass_Reference) \ + X(MIPS_AssumedShapeDopeType, DW_AttribClass_Reference) \ + X(MIPS_AssumedSize, DW_AttribClass_Reference) typedef U32 DW_AttribKind; typedef enum DW_AttribKindEnum { DW_AttribKind_Null, #define X(_N,_ID,...) DW_AttribKind_##_N = _ID, - DW_AttribKind_V2_XList(X) - DW_AttribKind_V3_XList(X) - DW_AttribKind_V4_XList(X) - DW_AttribKind_V5_XList(X) - DW_AttribKind_GNU_XList(X) - DW_AttribKind_LLVM_XList(X) - DW_AttribKind_APPLE_XList(X) - DW_AttribKind_MIPS_XList(X) + DW_AttribKind_V2_XList + DW_AttribKind_V3_XList + DW_AttribKind_V4_XList + DW_AttribKind_V5_XList + DW_AttribKind_GNU_XList + DW_AttribKind_LLVM_XList + DW_AttribKind_APPLE_XList + DW_AttribKind_MIPS_XList #undef X DW_AttribKind_UserLo = 0x2000, DW_AttribKind_UserHi = 0x3fff } DW_AttribKindEnum; -#define DW_ATE_XList(X) \ -X(Null, 0x00) \ -X(Address, 0x01) \ -X(Boolean, 0x02) \ -X(ComplexFloat, 0x03) \ -X(Float, 0x04) \ -X(Signed, 0x05) \ -X(SignedChar, 0x06) \ -X(Unsigned, 0x07) \ -X(UnsignedChar, 0x08) \ -X(ImaginaryFloat, 0x09) \ -X(PackedDecimal, 0x0A) \ -X(NumericString, 0x0B) \ -X(Edited, 0x0C) \ -X(SignedFixed, 0x0D) \ -X(UnsignedFixed, 0x0E) \ -X(DecimalFloat, 0x0F) \ -X(Utf, 0x10) \ -X(Ucs, 0x11) \ -X(Ascii, 0x12) +#define DW_ATE_XList \ + X(Null, 0x00) \ + X(Address, 0x01) \ + X(Boolean, 0x02) \ + X(ComplexFloat, 0x03) \ + X(Float, 0x04) \ + X(Signed, 0x05) \ + X(SignedChar, 0x06) \ + X(Unsigned, 0x07) \ + X(UnsignedChar, 0x08) \ + X(ImaginaryFloat, 0x09) \ + X(PackedDecimal, 0x0A) \ + X(NumericString, 0x0B) \ + X(Edited, 0x0C) \ + X(SignedFixed, 0x0D) \ + X(UnsignedFixed, 0x0E) \ + X(DecimalFloat, 0x0F) \ + X(Utf, 0x10) \ + X(Ucs, 0x11) \ + X(Ascii, 0x12) typedef U64 DW_ATE; typedef enum DW_ATEEnum { #define X(_N,_ID) DW_ATE_##_N = _ID, - DW_ATE_XList(X) + DW_ATE_XList #undef X } DW_ATEnum; -#define DW_CallingConventionKind_XList(X) \ -X(Normal, 0x0) \ -X(Program, 0x1) \ -X(NoCall, 0x3) \ -X(PassByValue, 0x4) \ -X(PassByReference, 0x5) +#define DW_CallingConventionKind_XList \ + X(Normal, 0x0) \ + X(Program, 0x1) \ + X(NoCall, 0x3) \ + X(PassByValue, 0x4) \ + X(PassByReference, 0x5) typedef U64 DW_CallingConventionKind; typedef enum DW_CallingConventionKindEnum { #define X(_N,_ID) DW_CallingConventionKind_##_N = _ID, - DW_CallingConventionKind_XList(X) + DW_CallingConventionKind_XList #undef X } DW_CallingConventionKindEnum; -#define DW_AccessKind_XList(X) \ -X(Public, 0x00) \ -X(Private, 0x01) \ -X(Protected, 0x02) +#define DW_AccessKind_XList \ + X(Public, 0x00) \ + X(Private, 0x01) \ + X(Protected, 0x02) typedef U64 DW_AccessKind; typedef enum DW_AccessKindEnum { #define X(_N,_ID) DW_AccessKind_##_N = _ID, - DW_AccessKind_XList(X) + DW_AccessKind_XList #undef X } DW_AccessKindEnum; -#define DW_VirtualityKind_XList(X) \ -X(None, 0x00) \ -X(Virtual, 0x01) \ -X(PureVirtual, 0x02) +#define DW_VirtualityKind_XList \ + X(None, 0x00) \ + X(Virtual, 0x01) \ + X(PureVirtual, 0x02) typedef U64 DW_VirtualityKind; typedef enum DW_VirtualityEnum { #define X(_N,_ID) DW_VirtualityKind_##_N = _ID, - DW_VirtualityKind_XList(X) + DW_VirtualityKind_XList #undef X } DW_VirtualityEnum; -#define DW_RngListEntryKind(X) \ -X(EndOfList, 0x00) \ -X(BaseAddressx, 0x01) \ -X(StartxEndx, 0x02) \ -X(StartxLength, 0x03) \ -X(OffsetPair, 0x04) \ -X(BaseAddress, 0x05) \ -X(StartEnd, 0x06) \ -X(StartLength, 0x07) +#define DW_RngListEntryKind \ + X(EndOfList, 0x00) \ + X(BaseAddressx, 0x01) \ + X(StartxEndx, 0x02) \ + X(StartxLength, 0x03) \ + X(OffsetPair, 0x04) \ + X(BaseAddress, 0x05) \ + X(StartEnd, 0x06) \ + X(StartLength, 0x07) typedef U8 DW_RLE; typedef enum DW_RLE_Enum { #define X(_N,_ID) DW_RLE_##_N = _ID, - DW_RngListEntryKind(X) + DW_RngListEntryKind #undef X } DW_RLE_Enum; -#define DW_LocListEntry_XList(X) \ -X(EndOfList, 0x00) \ -X(BaseAddressx, 0x01) \ -X(StartxEndx, 0x02) \ -X(StartxLength, 0x03) \ -X(OffsetPair, 0x04) \ -X(DefaultLocation, 0x05) \ -X(BaseAddress, 0x06) \ -X(StartEnd, 0x07) \ -X(StartLength, 0x08) +#define DW_LocListEntry_XList \ + X(EndOfList, 0x00) \ + X(BaseAddressx, 0x01) \ + X(StartxEndx, 0x02) \ + X(StartxLength, 0x03) \ + X(OffsetPair, 0x04) \ + X(DefaultLocation, 0x05) \ + X(BaseAddress, 0x06) \ + X(StartEnd, 0x07) \ + X(StartLength, 0x08) #define DW_LocListEntry_GNU_XList(X) \ X(GNU_ViewPair, 0x9) @@ -1280,58 +1274,58 @@ typedef U8 DW_LLE; typedef enum DW_LLE_Enum { #define X(_N,_ID) DW_LLE_##_N = _ID, - DW_LocListEntry_XList(X) + DW_LocListEntry_XList #undef X } DW_LLEEnum; -#define DW_AddrClass_XList(X) \ -X(None, 0) \ -X(Near16, 1) \ -X(Far16, 2) \ -X(Huge16, 3) \ -X(Near32, 4) \ -X(Far32, 5) +#define DW_AddrClass_XList \ + X(None, 0) \ + X(Near16, 1) \ + X(Far16, 2) \ + X(Huge16, 3) \ + X(Near32, 4) \ + X(Far32, 5) typedef U64 DW_AddrClass; typedef enum DW_AddrClassEnum { #define X(_N, _ID) DW_AddrClassKind_##_N = _ID, - DW_AddrClass_XList(X) + DW_AddrClass_XList #undef X } DW_AddrClassEnum; -#define DW_CompUnitKind_XList(X) \ -X(Reserved, 0) \ -X(Compile, 1) \ -X(Type, 2) \ -X(Partial, 3) \ -X(Skeleton, 4) \ -X(SplitCompile, 5) \ -X(SplitType, 6) +#define DW_CompUnitKind_XList \ + X(Reserved, 0) \ + X(Compile, 1) \ + X(Type, 2) \ + X(Partial, 3) \ + X(Skeleton, 4) \ + X(SplitCompile, 5) \ + X(SplitType, 6) typedef U8 DW_CompUnitKind; typedef enum DW_CompUnitKindEnum { #define X(_N, _ID) DW_CompUnitKind_##_N = _ID, - DW_CompUnitKind_XList(X) + DW_CompUnitKind_XList #undef X DW_CompUnitKind_UserLo = 0x80, DW_CompUnitKind_UserHi = 0xff } DW_CompUnitKindEnum; -#define DW_LNCT_XList(X) \ -X(Path, 0x1) \ -X(DirectoryIndex, 0x2) \ -X(TimeStamp, 0x3) \ -X(Size, 0x4) \ -X(MD5, 0x5) \ -X(LLVM_Source, 0x2001) +#define DW_LNCT_XList \ + X(Path, 0x1) \ + X(DirectoryIndex, 0x2) \ + X(TimeStamp, 0x3) \ + X(Size, 0x4) \ + X(MD5, 0x5) \ + X(LLVM_Source, 0x2001) typedef U64 DW_LNCT; typedef enum DW_LNCTEnum { #define X(_N, _ID) DW_LNCT_##_N = _ID, - DW_LNCT_XList(X) + DW_LNCT_XList #undef X DW_LNCT_UserLo = 0x2000, DW_LNCT_UserHi = 0x3fff @@ -1349,33 +1343,33 @@ typedef enum } DW_CFA_OperandType; // (opcode name, opcode id, operand count, operand types) -#define DW_CFA_Kind_XList(X) \ -X(Nop, 0x0) \ -X(SetLoc, 0x1, DW_CFA_OperandType_Value) \ -X(AdvanceLoc1, 0x2, DW_CFA_OperandType_Value) \ -X(AdvanceLoc2, 0x3, DW_CFA_OperandType_Value) \ -X(AdvanceLoc4, 0x4, DW_CFA_OperandType_Value) \ -X(OffsetExt, 0x5, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(RestoreExt, 0x6) \ -X(Undefined, 0x7, DW_CFA_OperandType_Register) \ -X(SameValue, 0x8, DW_CFA_OperandType_Register) \ -X(Register, 0x9, DW_CFA_OperandType_Register) \ -X(RememberState, 0xa) \ -X(RestoreState, 0xb) \ -X(DefCfa, 0xc, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(DefCfaRegister, 0xd, DW_CFA_OperandType_Register) \ -X(DefCfaOffset, 0xe, DW_CFA_OperandType_Value) \ -X(DefCfaExpr, 0xf, DW_CFA_OperandType_Expression) \ -X(Expr, 0x10, DW_CFA_OperandType_Expression) \ -X(OffsetExtSf, 0x11, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(DefCfaSf, 0x12, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(DefCfaOffsetSf, 0x13, DW_CFA_OperandType_Value) \ -X(ValOffset, 0x14, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(ValOffsetSf, 0x15, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(ValExpr, 0x16, DW_CFA_OperandType_Register, DW_CFA_OperandType_Expression) \ -X(AdvanceLoc, 0x40, DW_CFA_OperandType_Value) \ -X(Offset, 0x80, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(Restore, 0xc0, DW_CFA_OperandType_Register) +#define DW_CFA_Kind_XList \ + X(Nop, 0x0) \ + X(SetLoc, 0x1, DW_CFA_OperandType_Value) \ + X(AdvanceLoc1, 0x2, DW_CFA_OperandType_Value) \ + X(AdvanceLoc2, 0x3, DW_CFA_OperandType_Value) \ + X(AdvanceLoc4, 0x4, DW_CFA_OperandType_Value) \ + X(OffsetExt, 0x5, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ + X(RestoreExt, 0x6) \ + X(Undefined, 0x7, DW_CFA_OperandType_Register) \ + X(SameValue, 0x8, DW_CFA_OperandType_Register) \ + X(Register, 0x9, DW_CFA_OperandType_Register) \ + X(RememberState, 0xa) \ + X(RestoreState, 0xb) \ + X(DefCfa, 0xc, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ + X(DefCfaRegister, 0xd, DW_CFA_OperandType_Register) \ + X(DefCfaOffset, 0xe, DW_CFA_OperandType_Value) \ + X(DefCfaExpr, 0xf, DW_CFA_OperandType_Expression) \ + X(Expr, 0x10, DW_CFA_OperandType_Expression) \ + X(OffsetExtSf, 0x11, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ + X(DefCfaSf, 0x12, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ + X(DefCfaOffsetSf, 0x13, DW_CFA_OperandType_Value) \ + X(ValOffset, 0x14, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ + X(ValOffsetSf, 0x15, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ + X(ValExpr, 0x16, DW_CFA_OperandType_Register, DW_CFA_OperandType_Expression) \ + X(AdvanceLoc, 0x40, DW_CFA_OperandType_Value) \ + X(Offset, 0x80, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ + X(Restore, 0xc0, DW_CFA_OperandType_Register) #define DW_CFA_OperandMax 2 #define DW_CFA_Mask_OpcodeHi 0xc0 @@ -1385,7 +1379,7 @@ typedef U8 DW_CFA_Opcode; typedef enum DW_CFA_Enum { #define X(_N, _ID, ...) DW_CFA_##_N = _ID, - DW_CFA_Kind_XList(X) + DW_CFA_Kind_XList #undef X } DW_CFA_Enum; @@ -1608,84 +1602,84 @@ typedef enum DW_ExprOpEnum //- Regs -#define DW_Regs_X64_XList(X) \ -X(Rax, 0, rax, 0, 8) \ -X(Rdx, 1, rdx, 0, 8) \ -X(Rcx, 2, rcx, 0, 8) \ -X(Rbx, 3, rbx, 0, 8) \ -X(Rsi, 4, rsi, 0, 8) \ -X(Rdi, 5, rdi, 0, 8) \ -X(Rbp, 6, rbp, 0, 8) \ -X(Rsp, 7, rsp, 0, 8) \ -X(R8, 8, r8, 0, 8) \ -X(R9, 9, r9, 0, 8) \ -X(R10, 10, r10, 0, 8) \ -X(R11, 11, r11, 0, 8) \ -X(R12, 12, r12, 0, 8) \ -X(R13, 13, r13, 0, 8) \ -X(R14, 14, r14, 0, 8) \ -X(R15, 15, r15, 0, 8) \ -X(Rip, 16, rip, 0, 8) \ -X(Xmm0, 17, zmm0, 0, 16) \ -X(Xmm1, 18, zmm1, 0, 16) \ -X(Xmm2, 19, zmm2, 0, 16) \ -X(Xmm3, 20, zmm3, 0, 16) \ -X(Xmm4, 21, zmm4, 0, 16) \ -X(Xmm5, 22, zmm5, 0, 16) \ -X(Xmm6, 23, zmm6, 0, 16) \ -X(Xmm7, 24, zmm7, 0, 16) \ -X(Xmm8, 25, zmm8, 0, 16) \ -X(Xmm9, 26, zmm9, 0, 16) \ -X(Xmm10, 27, zmm10, 0, 16) \ -X(Xmm11, 28, zmm11, 0, 16) \ -X(Xmm12, 29, zmm12, 0, 16) \ -X(Xmm13, 30, zmm13, 0, 16) \ -X(Xmm14, 31, zmm14, 0, 16) \ -X(Xmm15, 32, zmm15, 0, 16) \ -X(Xmm16, 67, zmm16, 0, 16) \ -X(Xmm17, 68, zmm17, 0, 16) \ -X(Xmm18, 69, zmm18, 0, 16) \ -X(Xmm19, 70, zmm19, 0, 16) \ -X(Xmm20, 71, zmm20, 0, 16) \ -X(Xmm21, 72, zmm21, 0, 16) \ -X(Xmm22, 73, zmm22, 0, 16) \ -X(Xmm23, 74, zmm23, 0, 16) \ -X(Xmm24, 75, zmm24, 0, 16) \ -X(Xmm25, 76, zmm25, 0, 16) \ -X(Xmm26, 77, zmm26, 0, 16) \ -X(Xmm27, 78, zmm27, 0, 16) \ -X(Xmm28, 79, zmm28, 0, 16) \ -X(Xmm29, 80, zmm29, 0, 16) \ -X(Xmm30, 81, zmm30, 0, 16) \ -X(Xmm31, 82, zmm31, 0, 16) \ -X(St0, 33, st0, 0, 10) \ -X(St1, 34, st1, 0, 10) \ -X(St2, 35, st2, 0, 10) \ -X(St3, 36, st3, 0, 10) \ -X(St4, 37, st4, 0, 10) \ -X(St5, 38, st5, 0, 10) \ -X(St6, 39, st6, 0, 10) \ -X(St7, 40, st7, 0, 10) \ -X(Mm0, 41, st0, 0, 8) \ -X(Mm1, 42, st1, 0, 8) \ -X(Mm2, 43, st2, 0, 8) \ -X(Mm3, 44, st3, 0, 8) \ -X(Mm4, 45, st4, 0, 8) \ -X(Mm5, 46, st5, 0, 8) \ -X(Mm6, 47, st6, 0, 8) \ -X(Mm7, 48, st7, 0, 8) \ -X(Rflags, 49, rflags, 0, 4) \ -X(Es, 50, es, 0, 2) \ -X(Cs, 51, cs, 0, 2) \ -X(Ss, 52, ss, 0, 2) \ -X(Ds, 53, ds, 0, 2) \ -X(Fs, 54, fs, 0, 2) \ -X(Gs, 55, gs, 0, 2) \ -X(FsBase, 58, fsbase, 0, 0) \ -X(GsBase, 59, gsbase, 0, 0) -// privileged registers: -// X(Tr, 62, nil, 0, 0) \ -// X(Ldtr, 63, nil, 0, 0) +#define DW_Regs_X64_XList \ + X(Rax, 0, rax, 0, 8) \ + X(Rdx, 1, rdx, 0, 8) \ + X(Rcx, 2, rcx, 0, 8) \ + X(Rbx, 3, rbx, 0, 8) \ + X(Rsi, 4, rsi, 0, 8) \ + X(Rdi, 5, rdi, 0, 8) \ + X(Rbp, 6, rbp, 0, 8) \ + X(Rsp, 7, rsp, 0, 8) \ + X(R8, 8, r8, 0, 8) \ + X(R9, 9, r9, 0, 8) \ + X(R10, 10, r10, 0, 8) \ + X(R11, 11, r11, 0, 8) \ + X(R12, 12, r12, 0, 8) \ + X(R13, 13, r13, 0, 8) \ + X(R14, 14, r14, 0, 8) \ + X(R15, 15, r15, 0, 8) \ + X(Rip, 16, rip, 0, 8) \ + X(Xmm0, 17, zmm0, 0, 16) \ + X(Xmm1, 18, zmm1, 0, 16) \ + X(Xmm2, 19, zmm2, 0, 16) \ + X(Xmm3, 20, zmm3, 0, 16) \ + X(Xmm4, 21, zmm4, 0, 16) \ + X(Xmm5, 22, zmm5, 0, 16) \ + X(Xmm6, 23, zmm6, 0, 16) \ + X(Xmm7, 24, zmm7, 0, 16) \ + X(Xmm8, 25, zmm8, 0, 16) \ + X(Xmm9, 26, zmm9, 0, 16) \ + X(Xmm10, 27, zmm10, 0, 16) \ + X(Xmm11, 28, zmm11, 0, 16) \ + X(Xmm12, 29, zmm12, 0, 16) \ + X(Xmm13, 30, zmm13, 0, 16) \ + X(Xmm14, 31, zmm14, 0, 16) \ + X(Xmm15, 32, zmm15, 0, 16) \ + X(Xmm16, 67, zmm16, 0, 16) \ + X(Xmm17, 68, zmm17, 0, 16) \ + X(Xmm18, 69, zmm18, 0, 16) \ + X(Xmm19, 70, zmm19, 0, 16) \ + X(Xmm20, 71, zmm20, 0, 16) \ + X(Xmm21, 72, zmm21, 0, 16) \ + X(Xmm22, 73, zmm22, 0, 16) \ + X(Xmm23, 74, zmm23, 0, 16) \ + X(Xmm24, 75, zmm24, 0, 16) \ + X(Xmm25, 76, zmm25, 0, 16) \ + X(Xmm26, 77, zmm26, 0, 16) \ + X(Xmm27, 78, zmm27, 0, 16) \ + X(Xmm28, 79, zmm28, 0, 16) \ + X(Xmm29, 80, zmm29, 0, 16) \ + X(Xmm30, 81, zmm30, 0, 16) \ + X(Xmm31, 82, zmm31, 0, 16) \ + X(St0, 33, st0, 0, 10) \ + X(St1, 34, st1, 0, 10) \ + X(St2, 35, st2, 0, 10) \ + X(St3, 36, st3, 0, 10) \ + X(St4, 37, st4, 0, 10) \ + X(St5, 38, st5, 0, 10) \ + X(St6, 39, st6, 0, 10) \ + X(St7, 40, st7, 0, 10) \ + X(Mm0, 41, st0, 0, 8) \ + X(Mm1, 42, st1, 0, 8) \ + X(Mm2, 43, st2, 0, 8) \ + X(Mm3, 44, st3, 0, 8) \ + X(Mm4, 45, st4, 0, 8) \ + X(Mm5, 46, st5, 0, 8) \ + X(Mm6, 47, st6, 0, 8) \ + X(Mm7, 48, st7, 0, 8) \ + X(Rflags, 49, rflags, 0, 4) \ + X(Es, 50, es, 0, 2) \ + X(Cs, 51, cs, 0, 2) \ + X(Ss, 52, ss, 0, 2) \ + X(Ds, 53, ds, 0, 2) \ + X(Fs, 54, fs, 0, 2) \ + X(Gs, 55, gs, 0, 2) \ + X(FsBase, 58, fsbase, 0, 0) \ + X(GsBase, 59, gsbase, 0, 0) + // privileged registers: + // X(Tr, 62, nil, 0, 0) \ + // X(Ldtr, 63, nil, 0, 0) typedef U32 DW_Reg; @@ -1693,30 +1687,13 @@ typedef DW_Reg DW_RegX64; typedef enum DW_RegX64Enum { #define X(_N,_ID,...) DW_RegX64_##_N = _ID, - DW_Regs_X64_XList(X) + DW_Regs_X64_XList #undef X DW_RegX64_Last } DW_RegX64Enum; //////////////////////////////// -typedef enum { - DW_UnwindStatus_Ok, - DW_UnwindStatus_Fail, - DW_UnwindStatus_Maybe -} DW_UnwindStatus; - -#define DW_REG_READ(name) DW_UnwindStatus name(DW_Reg reg_id, void *buffer, U64 buffer_max, void *ud) -typedef DW_REG_READ(DW_RegRead); - -#define DW_REG_WRITE(name) DW_UnwindStatus name(DW_Reg reg_id, void *value, U64 value_size, void *ud) -typedef DW_REG_WRITE(DW_RegWrite); - -#define DW_MEM_READ(name) DW_UnwindStatus name(U64 addr, U64 size, void *buffer, void *ud) -typedef DW_MEM_READ(DW_MemRead); - -//////////////////////////////// - internal U64 dw_reg_size_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_pos_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code); diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index f81afa4c..6bf706b1 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1127,23 +1127,30 @@ dw_expr_inst_from_delta(DW_ExprInst *inst, S16 delta) return i; } -internal DW_UnwindStatus -dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out) +internal DW_ExprEvalResult +dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls, U64 exec_op_limit, DW_Expr expr, MachineOp_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out) { Temp scratch = scratch_begin(&arena, 1); - DW_UnwindStatus result = DW_UnwindStatus_Ok; - DW_PieceList pieces = {0}; - DW_ExprStack *stack = push_array(scratch.arena, DW_ExprStack, 1); - B32 is_ok = 1; + + DW_ExprEvalResult result = DW_ExprEvalResult_Fail; + DW_PieceList pieces = {0}; + DW_ExprStack *stack = push_array(scratch.arena, DW_ExprStack, 1); + U64 exec_op_count = 0; for EachNode(inst, DW_ExprInst, expr.first) { again:; + + exec_op_count += 1; + if (exec_op_count > exec_op_limit) { + Assert(0 && "reached opcode exec limit on the expression"); + result = DW_ExprEvalResult_ExecOpLimitReached; + goto exit; + } U64 pop_count = dw_pop_count_from_expr_op(inst->opcode); - if (pop_count >= stack->count) { + if (pop_count > stack->count) { Assert(0 && "not enough values on the stack to evaluate the instruction"); - is_ok = 0; - break; + goto exit; } switch (inst->opcode) { @@ -1187,18 +1194,18 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { DW_Reg reg_id = inst->opcode - DW_ExprOp_Reg0; - U64 reg_size = dw_reg_size_from_code(ctx->arch, reg_id); + U64 reg_size = dw_reg_size_from_code(arch, reg_id); U8 *reg_value = push_array(scratch.arena, U8, reg_size); - result = reg_read(reg_id, reg_value, reg_size, reg_read_ud); - if (result != DW_UnwindStatus_Ok) { goto exit; } + MachineOpResult reg_read_result = reg_read(reg_id, reg_value, reg_size, reg_read_ud); + if (reg_read_result != MachineOpResult_Ok) { goto exit; } dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); } break; case DW_ExprOp_RegX: { - U64 reg_size = dw_reg_size_from_code(ctx->arch, inst->operands[0].u64); + U64 reg_size = dw_reg_size_from_code(arch, inst->operands[0].u64); U8 *reg_value = push_array(scratch.arena, U8, reg_size); - result = reg_read(inst->operands[0].u64, reg_value, reg_size, reg_read_ud); - if (result != DW_UnwindStatus_Ok) { goto exit; } + MachineOpResult reg_read_result = reg_read(inst->operands[0].u64, reg_value, reg_size, reg_read_ud); + if (reg_read_result != MachineOpResult_Ok) { goto exit; } dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); } break; @@ -1212,12 +1219,12 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re case DW_ExprOp_Piece: { if (stack->count) { - String8 value = dw_string_from_expr_value(arena, ctx->arch, dw_expr_stack_pop(stack)); + String8 value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); if (inst->operands[0].u64 <= value.size) { dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .value = { .ptr = value.str, .bit_size = inst->operands[0].u64 * 8 }}); } else { Assert(0 && "out of bounds size in the piece opcode"); - result = DW_UnwindStatus_Fail; + goto exit; } } else { dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .undef_bit_size = inst->operands[0].u64 * 8 }); @@ -1225,12 +1232,12 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re } break; case DW_ExprOp_BitPiece: { if (stack->count) { - String8 value = dw_string_from_expr_value(arena, ctx->arch, dw_expr_stack_pop(stack)); + String8 value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); if (inst->operands[0].u64 <= value.size * 8) { dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .value = { .ptr = value.str, .bit_size = inst->operands[0].u64 }}); } else { Assert(0 && "out of bounds size in the bit piece opcode"); - result = DW_UnwindStatus_Fail; + goto exit; } } else { dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .undef_bit_size = inst->operands[0].u64 }); @@ -1243,7 +1250,7 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re dw_expr_stack_push(scratch.arena, stack, src->v); } else { Assert(0 && "out of bounds stack index"); - result = DW_UnwindStatus_Fail; + goto exit; } } break; @@ -1253,7 +1260,7 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re dw_expr_stack_push(scratch.arena, stack, src->v); } else { Assert(0 && "out of bounds stack index"); - result = DW_UnwindStatus_Fail; + goto exit; } } break; @@ -1269,8 +1276,7 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re if (i == 0) { Assert(0 && "seeking to an invalid offset"); - result = DW_UnwindStatus_Fail; - break; + goto exit; } inst = i; @@ -1282,16 +1288,14 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re if (cond.type != DW_ExprValueType_S16) { Assert(0 && "unexpected value"); - result = DW_UnwindStatus_Fail; - break; + goto exit; } DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); if (i == 0) { Assert(0 && "seeking to an invalid offset"); - result = DW_UnwindStatus_Fail; - break; + goto exit; } inst = i; @@ -1334,18 +1338,17 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re case DW_ExprOp_EntryValue: case DW_ExprOp_GNU_EntryValue: { - DW_Expr entry_value_expr = dw_expr_from_data(scratch.arena, ctx->format, byte_size_from_arch(ctx->arch), inst->operands[0].block); + DW_Expr entry_value_expr = dw_expr_from_data(scratch.arena, format, byte_size_from_arch(arch), inst->operands[0].block); DW_ExprValue entry_value; - result = dw_eval_expr(scratch.arena, ctx, entry_value_expr, reg_read, reg_read_ud, &entry_value); - if (result == DW_UnwindStatus_Ok) { - dw_expr_stack_push(scratch.arena, stack, entry_value); - } + result = dw_eval_expr(scratch.arena, arch, format, cfa, tls, exec_op_limit, entry_value_expr, reg_read, reg_read_ud, &entry_value); + if (result != DW_ExprEvalResult_Ok) { goto exit; } + dw_expr_stack_push(scratch.arena, stack, entry_value); } break; case DW_ExprOp_Addrx: { NotImplemented; } break; case DW_ExprOp_CallFrameCfa: { - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = ctx->cfa }); + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = cfa }); } break; case DW_ExprOp_PushObjectAddress: { NotImplemented; } break; @@ -1399,35 +1402,43 @@ dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_re } break; case DW_ExprOp_StackValue: { - stack->top->v.type = dw_expr_unsigned_value_type_from_bit_size(byte_size_from_arch(ctx->arch) * 8); + stack->top->v.type = dw_expr_unsigned_value_type_from_bit_size(bit_size_from_arch(arch)); } break; case DW_ExprOp_GNU_PushTlsAddress: case DW_ExprOp_FormTlsAddress: { DW_ExprValue tls_off = dw_expr_stack_pop(stack); - DW_ExprValue tls_base = { .type = DW_ExprValueType_Addr, .addr = ctx->tls_base }; + DW_ExprValue tls_base = { .type = DW_ExprValueType_Addr, .addr = tls }; DW_ExprValue tls_addr = dw_expr_add(tls_base, tls_off); dw_expr_stack_push(scratch.arena, stack, tls_addr); } break; } } + result = DW_ExprEvalResult_Ok; exit:; scratch_end(scratch); return result; } internal String8 -dw_encode_expr(Arena *arena, DW_Format format, U64 addr_size, DW_ExprEnc *encs, U64 encs_count) +dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count) { Temp scratch = scratch_begin(&arena, 1); + String8List *srl = push_array(scratch.arena, String8List, 1); str8_serial_begin(scratch.arena, srl); + HashTable *label_map = hash_table_init(scratch.arena, 128); + + struct Fixup { U64 offset; String8 label; struct Fixup *next; }; + struct Fixup *first_fixup = 0, *last_fixup = 0; + for EachIndex(i, encs_count) { DW_ExprEnc *e = &encs[i]; switch (e->type) { + case DW_ExprEncType_Null: {} break; case DW_ExprEncType_Op: { str8_serial_push_struct(scratch.arena, srl, &e->op); } break; @@ -1487,6 +1498,7 @@ dw_encode_expr(Arena *arena, DW_Format format, U64 addr_size, DW_ExprEnc *encs, str8_serial_push_string(scratch.arena, srl, str8(buffer, buffer_size)); } break; case DW_ExprEncType_Addr: { + U64 addr_size = byte_size_from_arch(arch); Assert(addr_size <= sizeof(e->addr)); str8_serial_push_string(scratch.arena, srl, str8((U8 *)&e->addr, addr_size)); } break; @@ -1504,16 +1516,39 @@ dw_encode_expr(Arena *arena, DW_Format format, U64 addr_size, DW_ExprEnc *encs, } } break; case DW_ExprEncType_Label: { - // TODO: + struct Fixup *fixup = push_array(scratch.arena, struct Fixup, 1); + fixup->offset = srl->total_size; + fixup->label = e->label; + SLLQueuePush(first_fixup, last_fixup, fixup); + + S16 delta_placeholder = 0; + str8_serial_push_struct(scratch.arena, srl, &delta_placeholder); } break; case DW_ExprEncType_DeclLabel: { - // TODO: + hash_table_push_string_u64(scratch.arena, label_map, e->label, srl->total_size); } break; default: { InvalidPath; } break; } } + // finalize expression String8 expr = str8_serial_end(arena, srl); + + // apply fixups + for EachNode(fixup, struct Fixup, first_fixup) { + U64 label_offset; + if (!hash_table_search_string_u64(label_map, fixup->label, &label_offset)) { + Assert(0 && "undefined label"); + continue; + } + + S64 delta = (S64)label_offset - (S64)fixup->offset; + AssertAlways(min_S16 <= delta && delta <= max_S16); + + S16 *delta_ptr = (S16 *)(expr.str + fixup->offset); + *delta_ptr = delta; + } + scratch_end(scratch); return expr; } diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index c1ac240f..6237d2e8 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -7,14 +7,6 @@ //////////////////////////////// // evaluator -typedef struct DW_ExprContext -{ - Arch arch; - DW_Format format; - U64 cfa; - U64 tls_base; -} DW_ExprContext; - #define DW_ExprValueType_IsSigned(x) ((x) == DW_ExprValueType_S8 || (x) == DW_ExprValueType_S16 || (x) == DW_ExprValueType_S32 || (x) == DW_ExprValueType_S64 || (x) == DW_ExprValueType_S128 || (x) == DW_ExprValueType_S256 || (x) == DW_ExprValueType_S512) #define DW_ExprValueType_IsUnsigned(x) ((x) == DW_ExprValueType_U8 || (x) == DW_ExprValueType_U16 || (x) == DW_ExprValueType_U32 || (x) == DW_ExprValueType_U64 || (x) == DW_ExprValueType_U128 || (x) == DW_ExprValueType_U256 || (x) == DW_ExprValueType_U512) #define DW_ExprValueType_IsFloat(x) ((x) == DW_ExprValueType_F32 || (x) == DW_ExprValueType_F64) @@ -75,12 +67,6 @@ typedef struct DW_ExprValueNode struct DW_ExprValueNode *next; } DW_ExprValueNode; -typedef struct DW_ExprStack -{ - U64 count; - DW_ExprValueNode *top; -} DW_ExprStack; - typedef enum { DW_PieceKind_Null, @@ -113,11 +99,25 @@ typedef struct DW_PieceList DW_PieceNode *last; } DW_PieceList; +typedef struct DW_ExprStack +{ + U64 count; + DW_ExprValueNode *top; +} DW_ExprStack; + typedef struct DW_ExprResult { int x; } DW_ExprResult; +typedef enum +{ + DW_ExprEvalResult_Fail, + DW_ExprEvalResult_Ok, + DW_ExprEvalResult_Maybe, + DW_ExprEvalResult_ExecOpLimitReached, +} DW_ExprEvalResult; + //////////////////////////////// // encoder @@ -157,26 +157,26 @@ typedef struct DW_ExprEnc S64 s64; U64 addr; String8 block; - char *label; + String8 label; }; } DW_ExprEnc; -#define DW_ExprEnc_Op(v) { .type = DW_ExprEncType_Op, .op = DW_ExprOp_##v } -#define DW_ExprEnc_U8(v) { .type = DW_ExprEncType_U8, .u8 = v } -#define DW_ExprEnc_U16(v) { .type = DW_ExprEncType_U16, .u16 = v } -#define DW_ExprEnc_U32(v) { .type = DW_ExprEncType_U32, .u32 = v } -#define DW_ExprEnc_U64(v) { .type = DW_ExprEncType_U64, .u64 = v } -#define DW_ExprEnc_S8(v) { .type = DW_ExprEncType_S8, .s8 = v } -#define DW_ExprEnc_S16(v) { .type = DW_ExprEncType_S16, .s16 = v } -#define DW_ExprEnc_S32(v) { .type = DW_ExprEncType_S32, .s32 = v } -#define DW_ExprEnc_S64(v) { .type = DW_ExprEncType_S64, .s64 = v } -#define DW_ExprEnc_ULEB128(v) { .type = DW_ExprEncType_ULEB128, .u64 = v } -#define DW_ExprEnc_SLEB128(v) { .type = DW_ExprEncType_SLEB128, .s64 = v } -#define DW_ExprEnc_Addr(v) { .type = DW_ExprEncType_Addr, .addr = v } -#define DW_ExprEnc_Block(v) { .type = DW_ExprEncType_Block, .block = v } -#define DW_ExprEnc_UInt(v) { .type = DW_ExprEncType_DwarfUInt, .u64 = v } -#define DW_ExprEnc_Label(v) { .type = DW_ExprEncType_Label, .label = v } -#define DW_ExprEnc_DeclLabel(v) { .type = DW_ExprEncType_DeclLabel, .label = v } +#define DW_ExprEnc_Op(v) { .type = DW_ExprEncType_Op, .op = DW_ExprOp_##v } +#define DW_ExprEnc_U8(v) { .type = DW_ExprEncType_U8, .u8 = v } +#define DW_ExprEnc_U16(v) { .type = DW_ExprEncType_U16, .u16 = v } +#define DW_ExprEnc_U32(v) { .type = DW_ExprEncType_U32, .u32 = v } +#define DW_ExprEnc_U64(v) { .type = DW_ExprEncType_U64, .u64 = v } +#define DW_ExprEnc_S8(v) { .type = DW_ExprEncType_S8, .s8 = v } +#define DW_ExprEnc_S16(v) { .type = DW_ExprEncType_S16, .s16 = v } +#define DW_ExprEnc_S32(v) { .type = DW_ExprEncType_S32, .s32 = v } +#define DW_ExprEnc_S64(v) { .type = DW_ExprEncType_S64, .s64 = v } +#define DW_ExprEnc_ULEB128(v) { .type = DW_ExprEncType_ULEB128, .u64 = v } +#define DW_ExprEnc_SLEB128(v) { .type = DW_ExprEncType_SLEB128, .s64 = v } +#define DW_ExprEnc_Addr(v) { .type = DW_ExprEncType_Addr, .addr = v } +#define DW_ExprEnc_Block(v) { .type = DW_ExprEncType_Block, .block = v } +#define DW_ExprEnc_UInt(v) { .type = DW_ExprEncType_DwarfUInt, .u64 = v } +#define DW_ExprEnc_Label(v) { .type = DW_ExprEncType_Label, .label = str8_lit_comp(v) } +#define DW_ExprEnc_DeclLabel(v) { .type = DW_ExprEncType_DeclLabel, .label = str8_lit_comp(v) } //////////////////////////////// @@ -235,10 +235,10 @@ internal DW_ExprValueNode * dw_expr_stack_pick(DW_ExprStack *stack, U64 idx); internal String8 dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v); // evaluator -internal DW_UnwindStatus dw_eval_expr(Arena *arena, DW_ExprContext *ctx, DW_Expr expr, DW_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out); +internal DW_ExprEvalResult dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls_base, U64 op_limit, DW_Expr expr, MachineOp_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out); // encoder -internal String8 dw_encode_expr(Arena *arena, DW_Format format, U64 addr_size, DW_ExprEnc *encs, U64 encs_count); +internal String8 dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count); #endif //DWARF_EXPR_H diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 3e2a4a1b..a2d60eff 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -176,7 +176,7 @@ dw_section_kind_from_string(String8 string) #define X(_K,_L,_M,_W) \ if (str8_match_lit(_L, string, 0)) { s = DW_Section_##_K; } \ if (str8_match_lit(_M, string, 0)) { s = DW_Section_##_K; } - DW_SectionKind_XList(X) + DW_SectionKind_XList #undef X return s; } @@ -187,7 +187,7 @@ dw_section_dwo_kind_from_string(String8 string) DW_SectionKind s = DW_Section_Null; #define X(_K,_L,_M,_W) \ if (str8_match_lit(_W, string, 0)) { s = DW_Section_##_K; } - DW_SectionKind_XList(X) + DW_SectionKind_XList #undef X return s; } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index df56fee8..cccaa0c4 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -73,7 +73,7 @@ d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v) { default:{}break; #define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw:{result = RDI_RegCodeX64_##reg_rdi;}break; - DW_Regs_X64_XList(X) + DW_Regs_X64_XList #undef X } return result; From 823cbf6a7234b289ac5d8f91182beb71639e58bf Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 16 Dec 2025 11:13:56 -0800 Subject: [PATCH 104/850] missing func decls --- src/linker/hash_table.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 6498f14b..3b1d0707 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -57,6 +57,8 @@ internal BucketNode * hash_table_push(Arena *arena, HashTable *ht, U64 hash, internal BucketNode * hash_table_push_u32_string (Arena *arena, HashTable *ht, U32 key, String8 value); internal BucketNode * hash_table_push_u64_string (Arena *arena, HashTable *ht, U64 key, String8 value); internal BucketNode * hash_table_push_string_string(Arena *arena, HashTable *ht, String8 key, String8 value); +internal BucketNode * hash_table_push_string_raw (Arena *arena, HashTable *ht, String8 key, void *value); +internal BucketNode * hash_table_push_string_u64 (Arena *arena, HashTable *ht, String8 key, U64 value); internal BucketNode * hash_table_push_path_string (Arena *arena, HashTable *ht, String8 key, String8 value); internal BucketNode * hash_table_push_u32_raw (Arena *arena, HashTable *ht, U32 key, void *value); internal BucketNode * hash_table_push_u64_raw (Arena *arena, HashTable *ht, U64 key, void *value); From da57259379d82c4836eb2580d54c41183e61220b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 16 Dec 2025 11:14:17 -0800 Subject: [PATCH 105/850] move DWARF expressions test to the torture --- src/torture/dwarf_expr_test.c | 49 --------- src/torture/torture.c | 195 ++++++++++++++++++++-------------- 2 files changed, 118 insertions(+), 126 deletions(-) delete mode 100644 src/torture/dwarf_expr_test.c diff --git a/src/torture/dwarf_expr_test.c b/src/torture/dwarf_expr_test.c deleted file mode 100644 index 5035d0a2..00000000 --- a/src/torture/dwarf_expr_test.c +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#define BUILD_CONSOLE_INFERFACE 1 -#define BUILD_TITLE "DWARF Expr Test" - -//////////////////////////////// - -#include "third_party/xxHash/xxhash.c" -#include "third_party/xxHash/xxhash.h" -#include "third_party/radsort/radsort.h" - -//////////////////////////////// - -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "linker/hash_table.h" -#include "coff/coff.h" -#include "elf/elf.h" -#include "elf/elf_parse.h" -#include "dwarf/dwarf_inc.h" - -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "coff/coff.c" -#include "elf/elf.c" -#include "elf/elf_parse.c" -#include "linker/hash_table.c" -#include "dwarf/dwarf_inc.c" - -//////////////////////////////// - -internal void -entry_point(CmdLine *cmdline) -{ - Temp scratch = scratch_begin(0, 0); - - { - DW_ExprEnc program[] = { - DW_ExprEnc_DeclLabel("foo"), - DW_ExprEnc_Op(BReg11), DW_ExprEnc_S64(44), - DW_ExprEnc_Op(Skip), DW_ExprEnc_Label("foo"), - }; - String8 expr_data = dw_encode_expr(scratch.arena, DW_Format_64Bit, sizeof(U64), program, ArrayCount(program)); - } - - scratch_end(scratch); -} - diff --git a/src/torture/torture.c b/src/torture/torture.c index ab845134..e1c087ef 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -17,28 +17,38 @@ #include "base/base_inc.h" #include "os/os_inc.h" +#include "linker/base_ext/base_core.h" +#include "linker/base_ext/base_arena.h" +#include "linker/base_ext/base_arrays.h" +#include "linker/hash_table.h" #include "coff/coff.h" #include "coff/coff_parse.h" #include "coff/coff_obj_writer.h" #include "coff/coff_lib_writer.h" #include "pe/pe.h" #include "pe/pe_section_flags.h" -#include "linker/base_ext/base_core.h" -#include "linker/base_ext/base_arena.h" -#include "linker/base_ext/base_arrays.h" -#include "linker/hash_table.h" +#include "elf/elf.h" +#include "elf/elf_parse.h" +#include "dwarf/dwarf_inc.h" +#include "regs/regs.h" +#include "regs/dwarf/regs_dwarf.h" #include "base/base_inc.c" #include "os/os_inc.c" +#include "linker/hash_table.c" +#include "linker/base_ext/base_core.c" +#include "linker/base_ext/base_arena.c" +#include "linker/base_ext/base_arrays.c" #include "coff/coff.c" #include "coff/coff_parse.c" #include "coff/coff_obj_writer.c" #include "coff/coff_lib_writer.c" #include "pe/pe.c" -#include "linker/hash_table.c" -#include "linker/base_ext/base_core.c" -#include "linker/base_ext/base_arena.c" -#include "linker/base_ext/base_arrays.c" +#include "elf/elf.c" +#include "elf/elf_parse.c" +#include "dwarf/dwarf_inc.c" +#include "regs/regs.c" +#include "regs/dwarf/regs_dwarf.c" #include "linker/lnk_cmd_line.h" #include "linker/lnk_cmd_line.c" @@ -4942,6 +4952,33 @@ exit:; return result; } +internal T_Result +t_value_in_register(void) +{ + Temp scratch = scratch_begin(0, 0); + T_Result result = T_Result_Fail; + + REGS_RegBlockX64 regs = {0}; + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_Reg3 - DW_ExprOp_Reg0); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 0xc0ffee; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, &expr_value); + + if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } + + // TODO: validate value + +exit:; + scratch_end(scratch); + return result; +} + //////////////////////////////////////////////////////////////// internal void @@ -4952,75 +4989,79 @@ entry_point(CmdLine *cmdline) // // Test Targets // - static struct { - char *label; T_Result (*r)(void); - } target_array[] = { - { "simple_link_test", t_simple_link_test }, - { "machine_compat_check", t_machine_compat_check }, - { "out_of_bounds_section_number", t_out_of_bounds_section_number }, - { "merge", t_merge }, - { "undef_section", t_undef_section }, - { "undef_reloc_section", t_undef_reloc_section }, - { "link_undef", t_link_undef }, - { "link_unref_undef", t_link_unref_undef }, - { "weak_lib_vs_weak_lib", t_weak_lib_vs_weak_lib }, - { "weak_lib_vs_weak_nolib", t_weak_lib_vs_weak_nolib }, - { "weak_lib_vs_weak_alias", t_weak_lib_vs_weak_alias }, - { "weak_lib_vs_weak_antidep", t_weak_lib_vs_weak_antidep }, - { "weak_alias_vs_weak_alias", t_weak_alias_vs_weak_alias }, - { "weak_alias_vs_weak_lib", t_weak_alias_vs_weak_lib }, - { "weak_alias_vs_weak_nolib", t_weak_alias_vs_weak_nolib }, - { "weak_alias_vs_weak_antidep", t_weak_alias_vs_weak_antidep }, - { "weak_nolib_vs_weak_nolib", t_weak_nolib_vs_weak_nolib }, - { "weak_nolib_vs_weak_lib", t_weak_nolib_vs_weak_lib }, - { "weak_nolib_vs_weak_alias", t_weak_nolib_vs_weak_alias }, - { "weak_nolib_vs_weak_antidep", t_weak_nolib_vs_weak_antidep }, - { "weak_antidep_vs_weak_antidep", t_weak_antidep_vs_weak_antidep }, - { "weak_antidep_vs_weak_nolib", t_weak_antidep_vs_weak_nolib }, - { "weak_antidep_vs_weak_lib", t_weak_antidep_vs_weak_lib }, - { "weak_antidep_vs_weak_alias", t_weak_antidep_vs_weak_alias }, - { "weak_vs_common", t_weak_vs_common }, - { "abs_vs_weak", t_abs_vs_weak }, - { "abs_vs_regular", t_abs_vs_regular }, - { "abs_vs_common", t_abs_vs_common }, - { "abs_vs_abs", t_abs_vs_abs }, - { "undef_weak_lib", t_undef_weak_lib }, - { "undef_weak_search_alias", t_undef_weak_search_alias }, - { "sect_symbol", t_sect_symbol }, - { "weak_cycle", t_weak_cycle }, - { "weak_tag", t_weak_tag }, - { "find_merged_pdata", t_find_merged_pdata }, - { "section_sort", t_section_sort }, - { "flag_conf", t_flag_conf }, - { "invalid_bss", t_invalid_bss }, - { "common_block", t_common_block }, - { "base_relocs", t_base_relocs }, - { "simple_lib_test", t_simple_lib_test }, - { "sect_align", t_sect_align }, - { "image_base", t_image_base }, - { "comdat_any", t_comdat_any }, - { "comdat_no_duplicates", t_comdat_no_duplicates }, - { "comdat_same_size", t_comdat_same_size }, - { "comdat_exact_match", t_comdat_exact_match }, - { "comdat_largest", t_comdat_largest }, - { "comdat_associative", t_comdat_associative }, - { "comdat_associative_loop", t_comdat_associative_loop }, - { "comdat_associative_non_comdat", t_comdat_associative_non_comdat }, - { "comdat_associative_out_of_bounds", t_comdat_associative_out_of_bounds }, - { "comdat_with_offset", t_comdat_with_offset }, - { "reloc_against_removed_comdat", t_reloc_against_removed_comdat }, - { "alt_name", t_alt_name }, - { "include", t_include }, - { "communal_var_vs_regular_comdat", t_communal_var_vs_regular_comdat }, - { "communal_var_vs_regular", t_communal_var_vs_regular }, - { "import_kernel32", t_import_kernel32 }, - { "delay_import_user32", t_delay_import_user32 }, - { "delay_import", t_delay_import }, - { "empty_section", t_empty_section }, - { "removed_section", t_removed_section }, - { "function_pad_min", t_function_pad_min }, - { "first_member_header", t_first_member_header }, - { "second_member_header", t_second_member_header }, + static struct { char *label; T_Result (*r)(void); } target_array[] = { +#define T(x) { Stringify(x), t_##x } + // Linker Tests + T(simple_link_test), + T(machine_compat_check), + T(out_of_bounds_section_number), + T(merge), + T(undef_section), + T(undef_reloc_section), + T(link_undef), + T(link_unref_undef), + T(weak_lib_vs_weak_lib), + T(weak_lib_vs_weak_nolib), + T(weak_lib_vs_weak_alias), + T(weak_lib_vs_weak_antidep), + T(weak_alias_vs_weak_alias), + T(weak_alias_vs_weak_lib), + T(weak_alias_vs_weak_nolib), + T(weak_alias_vs_weak_antidep), + T(weak_nolib_vs_weak_nolib), + T(weak_nolib_vs_weak_lib), + T(weak_nolib_vs_weak_alias), + T(weak_nolib_vs_weak_antidep), + T(weak_antidep_vs_weak_antidep), + T(weak_antidep_vs_weak_nolib), + T(weak_antidep_vs_weak_lib), + T(weak_antidep_vs_weak_alias), + T(weak_vs_common), + T(abs_vs_weak), + T(abs_vs_regular), + T(abs_vs_common), + T(abs_vs_abs), + T(undef_weak_lib), + T(undef_weak_search_alias), + T(sect_symbol), + T(weak_cycle), + T(weak_tag), + T(find_merged_pdata), + T(section_sort), + T(flag_conf), + T(invalid_bss), + T(common_block), + T(base_relocs), + T(simple_lib_test), + T(sect_align), + T(image_base), + T(comdat_any), + T(comdat_no_duplicates), + T(comdat_same_size), + T(comdat_exact_match), + T(comdat_largest), + T(comdat_associative), + T(comdat_associative_loop), + T(comdat_associative_non_comdat), + T(comdat_associative_out_of_bounds), + T(comdat_with_offset), + T(reloc_against_removed_comdat), + T(alt_name), + T(include), + T(communal_var_vs_regular_comdat), + T(communal_var_vs_regular), + T(import_kernel32), + T(delay_import_user32), + T(delay_import), + T(empty_section), + T(removed_section), + T(function_pad_min), + T(first_member_header), + T(second_member_header), + + // DWARF Expression Tests + //T(value_in_register), +#undef T }; // From 0aea6c4e8f17b54fe40b8baae37d56c4d6c1450a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 16 Dec 2025 13:49:23 -0800 Subject: [PATCH 106/850] finish value in register test --- src/dwarf/dwarf_expr.c | 4 ++++ src/torture/torture.c | 14 ++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 6bf706b1..74bc8a80 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1415,6 +1415,10 @@ dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls, U64 ex } } + if (stack->top) { + *value_out = stack->top->v; + } + result = DW_ExprEvalResult_Ok; exit:; scratch_end(scratch); diff --git a/src/torture/torture.c b/src/torture/torture.c index e1c087ef..725d657b 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -4958,22 +4958,28 @@ t_value_in_register(void) Temp scratch = scratch_begin(0, 0); T_Result result = T_Result_Fail; + // setup register context REGS_RegBlockX64 regs = {0}; REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_Reg3 - DW_ExprOp_Reg0); Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); U64 value = 0xc0ffee; MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + // compile a simple program which reads the value from register 3 DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + // evaluate the program DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, &expr_value); - if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } - - // TODO: validate value + // validate eval result + if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } + if (expr_value.type != DW_ExprValueType_U64) { goto exit; } + if (expr_value.u64 != value) { goto exit; } + result = T_Result_Pass; exit:; scratch_end(scratch); return result; @@ -5060,7 +5066,7 @@ entry_point(CmdLine *cmdline) T(second_member_header), // DWARF Expression Tests - //T(value_in_register), + T(value_in_register), #undef T }; From 43cb8b7b1a2c6420e9bfa0846a75f44955a26317 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 16 Dec 2025 17:32:12 -0800 Subject: [PATCH 107/850] handle DW_Op_FBReg, DW_ExprOp_Deref, DW_ExprOp_BReg*, and DW_ExprOp_BRegX --- src/dwarf/dwarf.h | 4 +- src/dwarf/dwarf_expr.c | 74 +++++++++++++++- src/dwarf/dwarf_expr.h | 2 +- src/torture/torture.c | 192 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 263 insertions(+), 9 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 349e8b35..9f3b0dfc 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1675,8 +1675,8 @@ typedef enum DW_ExprOpEnum X(Ds, 53, ds, 0, 2) \ X(Fs, 54, fs, 0, 2) \ X(Gs, 55, gs, 0, 2) \ - X(FsBase, 58, fsbase, 0, 0) \ - X(GsBase, 59, gsbase, 0, 0) + X(FsBase, 58, fsbase, 0, 8) \ + X(GsBase, 59, gsbase, 0, 8) // privileged registers: // X(Tr, 62, nil, 0, 0) \ // X(Ldtr, 63, nil, 0, 0) diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 74bc8a80..89087294 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1128,7 +1128,17 @@ dw_expr_inst_from_delta(DW_ExprInst *inst, S16 delta) } internal DW_ExprEvalResult -dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls, U64 exec_op_limit, DW_Expr expr, MachineOp_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out) +dw_eval_expr(Arena *arena, + Arch arch, + DW_Format format, + U64 frame_base, + U64 cfa, + U64 tls, + U64 exec_op_limit, + DW_Expr expr, + MachineOp_RegRead *reg_read, void *reg_read_ud, + MachineOp_MemRead *mem_read, void *mem_read_ud, + DW_ExprValue *value_out) { Temp scratch = scratch_begin(&arena, 1); @@ -1201,6 +1211,29 @@ dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls, U64 ex dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); } break; + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { + DW_Reg reg_id = inst->opcode - DW_ExprOp_BReg0; + U64 reg_size = dw_reg_size_from_code(arch, reg_id); + AssertAlways(reg_size <= byte_size_from_arch(arch)); + + U64 reg_value; + MachineOpResult reg_read_result = reg_read(reg_id, ®_value, reg_size, reg_read_ud); + if (reg_read_result != MachineOpResult_Ok) { goto exit; } + + U64 addr = (U64)((S64)reg_value + inst->operands[0].s64); + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + } break; + case DW_ExprOp_RegX: { U64 reg_size = dw_reg_size_from_code(arch, inst->operands[0].u64); U8 *reg_value = push_array(scratch.arena, U8, reg_size); @@ -1209,6 +1242,24 @@ dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls, U64 ex dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); } break; + case DW_ExprOp_BRegX: { + DW_Reg reg_id = (DW_Reg)inst->operands[0].u64; + U64 reg_size = dw_reg_size_from_code(arch, reg_id); + AssertAlways(reg_size <= byte_size_from_arch(arch)); + + U64 reg_value; + MachineOpResult reg_read_result = reg_read(reg_id, ®_value, reg_size, reg_read_ud); + if (reg_read_result != MachineOpResult_Ok) { goto exit; } + + U64 addr = (U64)((S64)reg_value + inst->operands[1].s64); + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + } break; + + case DW_ExprOp_FBReg: { + U64 addr = frame_base + inst->operands[0].s64; + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + } break; + case DW_ExprOp_ImplicitValue: { if (inst->operands[0].block.size <= sizeof(U512)) { dw_expr_stack_push_unsigned(scratch.arena, stack, inst->operands[0].block.str, inst->operands[0].block.size); @@ -1340,7 +1391,7 @@ dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls, U64 ex case DW_ExprOp_GNU_EntryValue: { DW_Expr entry_value_expr = dw_expr_from_data(scratch.arena, format, byte_size_from_arch(arch), inst->operands[0].block); DW_ExprValue entry_value; - result = dw_eval_expr(scratch.arena, arch, format, cfa, tls, exec_op_limit, entry_value_expr, reg_read, reg_read_ud, &entry_value); + result = dw_eval_expr(scratch.arena, arch, format, frame_base, cfa, tls, exec_op_limit, entry_value_expr, reg_read, reg_read_ud, mem_read, mem_read_ud, &entry_value); if (result != DW_ExprEvalResult_Ok) { goto exit; } dw_expr_stack_push(scratch.arena, stack, entry_value); } break; @@ -1401,6 +1452,25 @@ dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls, U64 ex dw_expr_stack_pop(stack); } break; + case DW_ExprOp_Deref: { + DW_ExprValue value = dw_expr_stack_pop(stack); + + // expression must be of an integral type + if (!DW_ExprValueType_IsInt(value.type)) { goto exit; } + + // treat value as an address + DW_ExprValue addr = dw_expr_cast(value, DW_ExprValueType_Addr); + + // read pointer size from the address + U64 addr_size = byte_size_from_arch(arch); + U8 *generic_value = push_array(scratch.arena, U8, addr_size); + MachineOpResult read_result = mem_read(addr.addr, generic_value, addr_size, mem_read_ud); + if (read_result != MachineOpResult_Ok) { goto exit; } + + // push generic data + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Generic, .generic = str8(generic_value, addr_size) }); + } break; + case DW_ExprOp_StackValue: { stack->top->v.type = dw_expr_unsigned_value_type_from_bit_size(bit_size_from_arch(arch)); } break; diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index 6237d2e8..278481b1 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -235,7 +235,7 @@ internal DW_ExprValueNode * dw_expr_stack_pick(DW_ExprStack *stack, U64 idx); internal String8 dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v); // evaluator -internal DW_ExprEvalResult dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 cfa, U64 tls_base, U64 op_limit, DW_Expr expr, MachineOp_RegRead *reg_read, void *reg_read_ud, DW_ExprValue *value_out); +internal DW_ExprEvalResult dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls_base, U64 op_limit, DW_Expr expr, MachineOp_RegRead *reg_read, void *reg_read_ud, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out); // encoder internal String8 dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count); diff --git a/src/torture/torture.c b/src/torture/torture.c index 725d657b..2a9690cd 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -4966,13 +4966,13 @@ t_value_in_register(void) MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); // compile a simple program which reads the value from register 3 - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); // evaluate the program DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); // validate eval result if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } @@ -4985,6 +4985,184 @@ exit:; return result; } +internal T_Result +t_value_in_x_register(void) +{ + Temp scratch = scratch_begin(0, 0); + T_Result result = T_Result_Fail; + + // setup register context + REGS_RegBlockX64 regs = {0}; + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_RegX64_FsBase); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 0xc0ffee; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + + // compile a simple program which reads the value from register 3 + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(RegX), DW_ExprEnc_ULEB128(DW_RegX64_FsBase) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + // evaluate the program + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + + // validate eval result + if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } + if (expr_value.type != DW_ExprValueType_U64) { goto exit; } + if (expr_value.u64 != value) { goto exit; } + + result = T_Result_Pass; +exit:; + scratch_end(scratch); + return result; +} + +internal T_Result +t_address_of_value(void) +{ + Temp scratch = scratch_begin(0, 0); + T_Result result = T_Result_Fail; + + // compile a simple program which reads address + U64 addr = 0xdeadbeef; + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_U64(addr) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + // evaluate the program + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); + + // validate eval result + if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } + if (expr_value.type != DW_ExprValueType_Addr) { goto exit; } + if (expr_value.addr != addr) { goto exit; } + + result = T_Result_Pass; +exit:; + scratch_end(scratch); + return result; +} + +internal T_Result +t_register_relative_variable(void) +{ + Temp scratch = scratch_begin(0, 0); + T_Result result = T_Result_Fail; + + // setup register context + REGS_RegBlockX64 regs = {0}; + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg11 - DW_ExprOp_BReg0); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 1; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BReg11), DW_ExprEnc_SLEB128(44) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + + // validate eval result + if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } + if (expr_value.type != DW_ExprValueType_Addr) { goto exit; } + if (expr_value.addr != (1 + 44)) { goto exit; } + + result = T_Result_Pass; +exit:; + scratch_end(scratch); + return result; +} + +internal T_Result +t_frame_relative_variable(void) +{ + Temp scratch = scratch_begin(0, 0); + T_Result result = T_Result_Fail; + + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(FBReg), DW_ExprEnc_SLEB128(-50) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + U64 frame_base = 123; + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); + + if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } + if (expr_value.type != DW_ExprValueType_Addr) { goto exit; } + if (expr_value.addr != frame_base -50) { goto exit; } + + result = T_Result_Pass; +exit:; + scratch_end(scratch); + return result; +} + +internal +MACHINE_OP_MEM_READ(t_machine_op_mem_read) +{ + MemoryCopy(buffer, PtrFromInt(addr), buffer_size); + return MachineOpResult_Ok; +} + +internal T_Result +t_call_by_reference(void) +{ + Temp scratch = scratch_begin(0, 0); + T_Result result = T_Result_Fail; + + U8 *memory = push_array(scratch.arena, U8, 128); + U64 value = 0xc0ffee; + MemoryCopy(memory + 32, &value, sizeof(value)); + + REGS_RegBlockX64 regs = {0}; + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, 58); // fsbase + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 memory_ptr = IntFromPtr(memory); + MemoryCopy((U8 *)®s + reg_range.min, &memory_ptr, sizeof(memory_ptr)); + + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BRegX), DW_ExprEnc_ULEB128(58), DW_ExprEnc_SLEB128(32), DW_ExprEnc_Op(Deref) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, t_machine_op_mem_read, 0, &expr_value); + + if (expr_value.type != DW_ExprValueType_Generic) { goto exit; } + if (expr_value.generic.size != sizeof(U64)) { goto exit; } + if (*(U64 *)expr_value.generic.str != value) { goto exit; } + + result = T_Result_Pass; + exit:; + scratch_end(scratch); + return result; +} + +internal T_Result +t_plus_uconst(void) +{ + Temp scratch = scratch_begin(0, 0); + T_Result result = T_Result_Fail; + + U64 struct_addr = 0x123; + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_Addr(struct_addr), DW_ExprEnc_Op(PlusUConst), DW_ExprEnc_ULEB128(4) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, t_machine_op_mem_read, 0, &expr_value); + + if (expr_value.type != DW_ExprValueType_Addr) { goto exit; } + if (expr_value.addr != 0x123 + 4) { goto exit; } + + result = T_Result_Pass; + exit:; + scratch_end(scratch); + return result; +} + //////////////////////////////////////////////////////////////// internal void @@ -5067,6 +5245,12 @@ entry_point(CmdLine *cmdline) // DWARF Expression Tests T(value_in_register), + T(value_in_x_register), + T(address_of_value), + T(register_relative_variable), + T(frame_relative_variable), + T(call_by_reference), + T(plus_uconst), #undef T }; From ce4d09d431c96977ea5f8a142b7b479eeee8fb49 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 17 Dec 2025 17:32:03 -0800 Subject: [PATCH 108/850] WIP DW_OP_piece --- src/dwarf/dwarf.h | 4 +- src/dwarf/dwarf_expr.c | 107 +++++++++++++++++++++++++++++++++-------- src/dwarf/dwarf_expr.h | 16 ++---- src/torture/torture.c | 35 ++++++++++++++ 4 files changed, 128 insertions(+), 34 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 9f3b0dfc..a5ac02f0 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1548,7 +1548,7 @@ typedef enum X(RegX, 0x90, 1, 0, 1, ULEB128, Null) \ X(FBReg, 0x91, 1, 0, 1, SLEB128, Null) \ X(BRegX, 0x92, 2, 0, 1, ULEB128, SLEB128) \ - X(Piece, 0x93, 1, 0, 0, ULEB128, Null) \ + X(Piece, 0x93, 1, 1, 0, ULEB128, Null) \ X(DerefSize, 0x94, 1, 1, 1, U8, Null) \ X(XDerefSize, 0x95, 1, 2, 1, U8, Null) \ X(Nop, 0x96, 0, 0, 0, Null, Null) \ @@ -1558,7 +1558,7 @@ typedef enum X(CallRef, 0x9a, 1, 0, 0, DwarfUInt,Null) \ X(FormTlsAddress, 0x9b, 0, 0, 1, Null, Null) \ X(CallFrameCfa, 0x9c, 0, 0, 1, Null, Null) \ - X(BitPiece, 0x9d, 2, 0, 0, ULEB128, ULEB128) + X(BitPiece, 0x9d, 2, 1, 0, ULEB128, ULEB128) #define DW_Expr_V4_XList \ X(ImplicitValue, 0x9e, 2, 0, 1, Block, Null) \ diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 89087294..04f9e1ba 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1269,29 +1269,44 @@ dw_eval_expr(Arena *arena, } break; case DW_ExprOp_Piece: { - if (stack->count) { - String8 value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); - if (inst->operands[0].u64 <= value.size) { - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .value = { .ptr = value.str, .bit_size = inst->operands[0].u64 * 8 }}); - } else { - Assert(0 && "out of bounds size in the piece opcode"); - goto exit; - } + B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); + if (is_undefined) { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 * 8 }); } else { - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .undef_bit_size = inst->operands[0].u64 * 8 }); + DW_ExprValue top = dw_expr_stack_pop(stack); + + String8 value; + + // piece is a memory reference + if (top.type == DW_ExprValueType_Addr) { + U64 value_size = inst->operands[0].u64; + U8 *value_buffer = push_array(arena, U8, value_size); + MachineOpResult read_result = mem_read(top.addr, value_buffer, value_size, mem_read_ud); + if (read_result != MachineOpResult_Ok) { Assert(0 && "failed to read piece memory referece"); goto exit; } + } + // piece is a value + else { + value = dw_string_from_expr_value(arena, arch, top); + } + + if (inst->operands[0].u64 > value.size) { Assert(0 && "out of bounds size in the piece opcode"); goto exit; } + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64 * 8, .value = value.str }); } } break; + case DW_ExprOp_BitPiece: { - if (stack->count) { - String8 value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); - if (inst->operands[0].u64 <= value.size * 8) { - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .value = { .ptr = value.str, .bit_size = inst->operands[0].u64 }}); - } else { - Assert(0 && "out of bounds size in the bit piece opcode"); - goto exit; - } + B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); + if (is_undefined) { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 }); } else { - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .undef_bit_size = inst->operands[0].u64 }); + String8 value; + if (dw_expr_stack_peek(stack).type == DW_ExprValueType_Addr) { + NotImplemented; + } else { + value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); + } + if (inst->operands[0].u64 > value.size * 8) { Assert(0 && "out of bounds size in piece opcode"); goto exit; } + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64, .value = value.str }); } } break; @@ -1485,8 +1500,60 @@ dw_eval_expr(Arena *arena, } } - if (stack->top) { - *value_out = stack->top->v; + // composite value + if (pieces.count > 0) { +#if 0 + U64 total_bit_size = 0; + for EachNode (n, DW_PieceNode, pieces.first) { + total_bit_size += n->v.bit_size; + } + + U64 value_size = CeilIntegerDiv(total_bit_size, 8); + U8 *value = push_array(arena, U8, value_size); + Rng1U64 *ranges = push_array(arena, Rng1U64, pieces.count); + U64 *offsets = push_array(arena, U64, pieces.count); + U64 value_idx = 0; + U64 value_cursor = 0; + U64 piece_cursor = 0; + for EachNode(n, DW_PieceNode, pieces.first) { + if (n->v.kind == DW_PieceKind_Value) { + ranges[value_idx] = r1u64(piece_cursor, piece_cursor + n->v.bit_size); + offsets[value_idx] = value_cursor; + for (U64 i = 0; i < n->v.bit_size; i += 8) { + U64 to_copy = Min(8, n->v.bit_size - i); + if (value_cursor % 8 == 0) { + value[value_cursor / 8] = n->v.value[i]; + } else { + value[value_cursor / 8] |= n->v.value[i] << (value_cursor % 8); + value[AlignPow2(value_cursor / 8, 8)] |= n->v.value[i] >> (value_cursor % 8); + } + value_cursor += to_copy; + } + value_idx += 1; + } + piece_cursor += n->v.bit_size; + } + + value_out->type = DW_ExprValueType_Generic; + value_out->ranges = (Rng1U64Array){ .count = pieces.count, .v = ranges }; + value_out->offsets = offsets; + value_out->generic = str8(value, value_size); +#else + NotImplemented; +#endif + } + // scalar + else { + if (stack->top) { + *value_out = stack->top->v; + + Rng1U64 *range = push_array(arena, Rng1U64, 1); + *range = r1u64(0, max_U64); + value_out->ranges = (Rng1U64Array){ .count = 1, .v = range }; + value_out->offsets = push_array(arena, U64, 1); + } else { + MemoryZeroStruct(value_out); + } } result = DW_ExprEvalResult_Ok; diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index 278481b1..4cc52f8b 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -40,6 +40,8 @@ typedef S8 DW_ExprBool; typedef struct DW_ExprValue { DW_ExprValueType type; + Rng1U64Array ranges; + U64 *offsets; union { U8 u8; U16 u16; @@ -77,13 +79,8 @@ typedef enum typedef struct DW_Piece { DW_PieceKind kind; - union { - U64 undef_bit_size; - struct { - U64 bit_size; - void *ptr; - } value; - }; + U64 bit_size; + U8 *value; } DW_Piece; typedef struct DW_PieceNode @@ -105,11 +102,6 @@ typedef struct DW_ExprStack DW_ExprValueNode *top; } DW_ExprStack; -typedef struct DW_ExprResult -{ - int x; -} DW_ExprResult; - typedef enum { DW_ExprEvalResult_Fail, diff --git a/src/torture/torture.c b/src/torture/torture.c index 2a9690cd..ff7d7a22 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -5163,6 +5163,40 @@ t_plus_uconst(void) return result; } +internal T_Result +t_reg_split_spill(void) +{ + Temp scratch = scratch_begin(0, 0); + T_Result result = T_Result_Fail; + + // setup register context + REGS_RegBlockX64 regs = {0}; + { + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg3 - DW_ExprOp_BReg0); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 0xaaaa; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + } + { + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg10 - DW_ExprOp_BReg0); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 0xbbbb; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + } + + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(4), DW_ExprEnc_Op(Reg10), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(2) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + + result = T_Result_Pass; +exit:; + scratch_end(scratch); + return result; +} + //////////////////////////////////////////////////////////////// internal void @@ -5251,6 +5285,7 @@ entry_point(CmdLine *cmdline) T(frame_relative_variable), T(call_by_reference), T(plus_uconst), + //T(reg_split_spill), #undef T }; From cc01c04b8aeff1f307fae5d873550e809821b6de Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 18 Dec 2025 20:05:47 -0800 Subject: [PATCH 109/850] use p_vaddr for computing dynamic segment address --- src/demon/linux/demon_core_linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 56d4602e..5f50ea4f 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -532,7 +532,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased if(phdr.p_type == ELF_PType_Dynamic) { - dynamic_vaddr = rebase + phdr.p_offset; + dynamic_vaddr = rebase + phdr.p_vaddr; break; } } From cf849f7875f7cccdca6d7ad5e1e97386a74ee205 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 18 Dec 2025 20:06:14 -0800 Subject: [PATCH 110/850] add missing GNU expr opcodes --- src/dwarf/dwarf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 86bd56a4..b71be5dd 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -449,6 +449,7 @@ dw_operand_types_from_expr_opcode(DW_ExprOp op) DW_Expr_V3_XList DW_Expr_V4_XList DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X default: { NotImplemented; } break; } From 99fe1bc2f20d6859605baac1e76871fd8ee0b5d9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 18 Dec 2025 20:06:20 -0800 Subject: [PATCH 111/850] typo --- src/regs/dwarf/regs_dwarf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/regs/dwarf/regs_dwarf.c b/src/regs/dwarf/regs_dwarf.c index 93105e2d..d7fcc715 100644 --- a/src/regs/dwarf/regs_dwarf.c +++ b/src/regs/dwarf/regs_dwarf.c @@ -69,7 +69,7 @@ MACHINE_OP_REG_WRITE(regs_write_dwarf_x64) if (reg_size > 0) { AssertAlways(value_size <= reg_size); MemoryCopy(reg_bytes, value, value_size); - status = MachineOpResult_Fail; + status = MachineOpResult_Ok; } return status; From 717781e0a3a12ded599fc84350c508d2bb525e06 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 19 Dec 2025 17:34:14 -0800 Subject: [PATCH 112/850] adjust cursor by delta read size --- src/dwarf/dwarf_parse.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index a2d60eff..cdb65070 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -3419,6 +3419,7 @@ dw_parse_cfa_inst(String8 data, U32 delta = 0; U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; operands[0].u64 = delta * code_align_factor; } break; case DW_CFA_DefCfa: { From 13ce0cf02031cb061afe9294ba956efad7c1234e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 19 Dec 2025 17:34:35 -0800 Subject: [PATCH 113/850] fix race condition in artifact cache --- src/artifact_cache/artifact_cache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 199baa07..2ae211a8 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -18,8 +18,8 @@ ac_init(void) ac_shared->req_batches[idx].mutex = mutex_alloc(); ac_shared->req_batches[idx].arena = arena_alloc(); } - ac_shared->cancel_thread = thread_launch(ac_cancel_thread_entry_point, 0); ac_shared->cancel_thread_semaphore = semaphore_alloc(0, 1, str8_zero()); + ac_shared->cancel_thread = thread_launch(ac_cancel_thread_entry_point, 0); } //////////////////////////////// From f150662cc475d7a1d4cfa68bee6001b6ef4d6bc9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 20 Dec 2025 14:41:01 -0800 Subject: [PATCH 114/850] update logic for tracking new threads --- src/demon/linux/demon_core_linux.c | 114 +++++++++++++++++++---------- src/demon/linux/demon_core_linux.h | 8 +- 2 files changed, 80 insertions(+), 42 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 5f50ea4f..87028bcc 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -1430,11 +1430,9 @@ dmn_lnx_handle_not_attached(Arena *arena, DMN_EventList *events) e->error_kind = DMN_ErrorKind_NotAttached; } -internal DMN_LNX_Entity * -dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, pid_t tid) +internal void +dmn_lnx_init_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, DMN_LNX_Entity *thread) { - DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); - thread->id = tid; thread->arch = process->arch; thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); thread->thread_state = DMN_LNX_ThreadState_Stopped; @@ -1462,7 +1460,14 @@ dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity e->code = thread->id; process->thread_count += 1; +} +internal DMN_LNX_Entity * +dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, pid_t tid) +{ + DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); + thread->id = tid; + dmn_lnx_init_create_thread(arena, events, process, thread); return thread; } @@ -1786,7 +1791,7 @@ dmn_lnx_handle_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity * } internal void -dmn_lnx_hanlde_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 rdebug_vaddr) +dmn_lnx_handle_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 rdebug_vaddr) { Temp scratch = scratch_begin(&arena, 1); @@ -1917,7 +1922,7 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *u if(!stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } if(!stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } - dmn_lnx_hanlde_unload_module(arena, events, process, name_space_id, rdebug_vaddr); + dmn_lnx_handle_unload_module(arena, events, process, name_space_id, rdebug_vaddr); is_unmap_completed = 1; unmap_complete_exit:; @@ -2573,38 +2578,40 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(wifstopped || wifsignaled || wifexited) { DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - - // kernel may send multiple stop signals for the same thread, - // so count first stop signal and ignore subsequent signals - B32 is_first_thread_to_stop = 0; - if(thread->thread_state == DMN_LNX_ThreadState_Running) + if(thread->thread_state != DMN_LNX_ThreadState_PendingCreation) { - is_first_thread_to_stop = (stopped_threads == 0); - stopped_threads += 1; - } - - // update thread state - if(thread != dmn_lnx_nil_entity) - { - if(wifstopped && !wifsignaled && !wifexited) + // kernel may send multiple stop signals for the same thread, + // so count first stop signal and ignore subsequent signals + B32 is_first_thread_to_stop = 0; + if(thread->thread_state == DMN_LNX_ThreadState_Running) { - thread->thread_state = DMN_LNX_ThreadState_Stopped; + is_first_thread_to_stop = (stopped_threads == 0); + stopped_threads += 1; } - else if(!wifstopped && (wifsignaled || wifexited)) - { - thread->thread_state = DMN_LNX_ThreadState_Exited; - } - else { InvalidPath; } - } - // stop all other threads - if(is_first_thread_to_stop) - { - for EachNode(thread, DMN_LNX_EntityNode, running_threads.first) + // update thread state + if(thread != dmn_lnx_nil_entity) { - if(thread->v->thread_state == DMN_LNX_ThreadState_Running) + if(wifstopped && !wifsignaled && !wifexited) { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, thread->v->id, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } + thread->thread_state = DMN_LNX_ThreadState_Stopped; + } + else if(!wifstopped && (wifsignaled || wifexited)) + { + thread->thread_state = DMN_LNX_ThreadState_Exited; + } + else { InvalidPath; } + } + + // stop all other threads + if(is_first_thread_to_stop) + { + for EachNode(thread, DMN_LNX_EntityNode, running_threads.first) + { + if(thread->v->thread_state == DMN_LNX_ThreadState_Running) + { + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, thread->v->id, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } + } } } } @@ -2627,7 +2634,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // read thread registers { DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - if(thread != dmn_lnx_nil_entity) + if(thread != dmn_lnx_nil_entity && thread->thread_state != DMN_LNX_ThreadState_PendingCreation) { thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); Assert(!thread->is_reg_block_dirty); @@ -2729,12 +2736,26 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case PTRACE_EVENT_CLONE: { + // kernel stopped the parent just before scheduling the child to + // give us a chance to prepare to trace it; next event for the child + // will be a PTRACE_EVENT_STOP + pid_t new_pid; if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid)) >= 0) { DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); DMN_LNX_Entity *process = thread->parent; - dmn_lnx_handle_create_thread(arena, &events, process, new_pid); + + // create a new partially inited thread + DMN_LNX_Entity *new_thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); + new_thread->id = new_pid; + new_thread->thread_state = DMN_LNX_ThreadState_PendingCreation; + + // create mapping from tid -> new thread + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, new_thread->id, new_thread); + + // do not exit the wait loop before new threads are inited + dmn_lnx_state->threads_pending_creation += 1; } else { Assert(0 && "failed to get new tid"); } }break; @@ -2770,12 +2791,25 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case PTRACE_EVENT_STOP: { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); + DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); DMN_LNX_Entity *process = thread->parent; - if(process->expect_user_interrupt) + + if(thread->thread_state == DMN_LNX_ThreadState_PendingCreation) { - process->expect_user_interrupt = 0; - dmn_lnx_handle_halt(arena, &events); + // finish thread init + dmn_lnx_init_create_thread(arena, &events, process, thread); + + // update global thread counter + AssertAlways(dmn_lnx_state->threads_pending_creation > 0); + dmn_lnx_state->threads_pending_creation -= 1; + } + else + { + if(process->expect_user_interrupt) + { + process->expect_user_interrupt = 0; + dmn_lnx_handle_halt(arena, &events); + } } }break; default: { Assert(0 && "unexpected ptrace code"); } break; @@ -2804,8 +2838,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } else { Assert(0 && "unexpected stop code"); } - // do not wait if all threads are stopped and there are no launching processes - if(stopped_threads >= running_threads.count && dmn_lnx_state->pending_procs.count == 0) + // do not wait if all threads are stopped, there are no launching processes, and all threads were created + if(stopped_threads >= running_threads.count && dmn_lnx_state->pending_procs.count == 0 && dmn_lnx_state->threads_pending_creation == 0) { break; } diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index f168d420..44f499b4 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -63,12 +63,13 @@ StaticAssert(sizeof(DMN_LNX_UserX64) == 912, g_dmn_lnx_user_x64_size_check); //////////////////////////////// -typedef struct +typedef struct DMN_LNX_DbDesc DMN_LNX_DbDesc; +struct DMN_LNX_DbDesc { U32 bit_size; U32 count; U32 offset; -} DMN_LNX_DbDesc; +}; //////////////////////////////// //~ SDT Probes @@ -173,6 +174,7 @@ typedef enum DMN_LNX_ThreadState DMN_LNX_ThreadState_Running, DMN_LNX_ThreadState_Stopped, DMN_LNX_ThreadState_Exited, + DMN_LNX_ThreadState_PendingCreation, } DMN_LNX_ThreadState; typedef struct DMN_LNX_Entity DMN_LNX_Entity; @@ -309,6 +311,8 @@ struct DMN_LNX_State DMN_LNX_ProcessLaunchList pending_procs; DMN_LNX_ProcessLaunchList free_pids; + U64 threads_pending_creation; + // halter Mutex halter_mutex; pid_t halter_tid; From fd6c3ef0e0d486bded796797d29ed9aeab0cbe3c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 28 Dec 2025 01:16:55 -0800 Subject: [PATCH 115/850] move GNU and ELF specific struct readers to appropriate layers --- src/demon/linux/demon_core_linux.c | 752 +++++++++++------------------ src/demon/linux/demon_core_linux.h | 57 +-- src/elf/elf.c | 112 +++++ src/elf/elf.h | 9 + src/gnu/gnu.c | 37 ++ src/gnu/gnu.h | 6 + 6 files changed, 466 insertions(+), 507 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 87028bcc..2ead00fb 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -120,7 +120,8 @@ dmn_lnx_read_string(Arena *arena, int memory_fd, U64 vaddr) internal MACHINE_OP_MEM_READ(dmn_lnx_machine_op_mem_read) { - return dmn_lnx_read(((DMN_LNX_Entity *)ud)->fd, r1u64(addr, addr + buffer_size), buffer); + U64 read_size = dmn_lnx_read(*(int *)ud, r1u64(addr, addr + buffer_size), buffer); + return read_size == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; } internal int @@ -134,192 +135,6 @@ dmn_lnx_ptrace_seize(pid_t pid) return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACEFORK | PTRACE_O_TRACECLONE)); } -//////////////////////////////// -//~ Runtime Struct Helpers - -internal B32 -dmn_lnx_read_ehdr(int memory_fd, U64 addr, ELF_Hdr64 *ehdr_out) -{ - B32 is_read = 0; - U8 e_ident[ELF_Identifier_Max] = {0}; - U64 e_ident_size = dmn_lnx_read(memory_fd, r1u64(addr, addr + sizeof(e_ident)), &e_ident); - if(e_ident_size == sizeof(e_ident)) - { - if(str8_match(str8_prefix(str8_array_fixed(e_ident), elf_magic_string.size), elf_magic_string, 0)) - { - switch(e_ident[ELF_Identifier_Class]) - { - default:{InvalidPath;}break; - case ELF_Class_None: {}break; - case ELF_Class_32: - { - ELF_Hdr32 ehdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &ehdr32)) - { - *ehdr_out = elf_hdr64_from_hdr32(ehdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, ehdr_out); - }break; - } - } - } - return is_read; -} - -internal B32 -dmn_lnx_read_phdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr_out) -{ - B32 is_read = 0; - switch (elf_class) - { - case ELF_Class_None: break; - case ELF_Class_32: - { - ELF_Phdr32 phdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &phdr32)) - { - *phdr_out = elf_phdr64_from_phdr32(phdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, phdr_out); - }break; - default:{NotImplemented;}break; - } - return is_read; -} - -internal B32 -dmn_lnx_read_shdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr_out) -{ - B32 is_read = 0; - switch (elf_class) - { - case ELF_Class_None: break; - case ELF_Class_32: - { - ELF_Shdr32 shdr32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &shdr32)) - { - *shdr_out = elf_shdr64_from_shdr32(shdr32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, shdr_out); - }break; - default:{NotImplemented;}break; - } - return is_read; -} - -internal B32 -dmn_lnx_read_linkmap(int memory_fd, U64 addr, ELF_Class elf_class, GNU_LinkMap64 *linkmap_out) -{ - B32 is_read = 0; - switch(elf_class) - { - case ELF_Class_None: {}break; - case ELF_Class_32: - { - GNU_LinkMap32 linkmap32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &linkmap32)) - { - *linkmap_out = gnu_linkmap64_from_linkmap32(linkmap32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, linkmap_out); - }break; - default:{NotImplemented;}break; - } - return is_read; -} - -internal B32 -dmn_lnx_read_dynamic(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dyn_out) -{ - B32 is_read = 0; - switch(elf_class) - { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Dyn32 dyn32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &dyn32)) - { - *dyn_out = elf_dyn64_from_dyn32(dyn32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, dyn_out); - }break; - default:{NotImplemented;}break; - } - return is_read; -} - -internal B32 -dmn_lnx_read_symbol(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Sym64 *symbol_out) -{ - B32 is_read = 0; - switch(elf_class) - { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Sym32 symbol32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &symbol32)) - { - *symbol_out = elf_sym64_from_sym32(symbol32); - is_read = 1; - } - }break; - case ELF_Class_64: - { - is_read = dmn_lnx_read_struct(memory_fd, addr, symbol_out); - }break; - default:{NotImplemented;}break; - } - return is_read; -} - -internal B32 -dmn_lnx_read_r_debug(int memory_fd, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebug_out) -{ - B32 is_read = 0; - switch(gnu_rdebug_info_size_from_arch(arch)) - { - case 0: {} break; - case sizeof(GNU_RDebugInfo32): { - GNU_RDebugInfo32 rdebug32 = {0}; - if(dmn_lnx_read_struct(memory_fd, addr, &rdebug32)) - { - *rdebug_out = gnu_rdebug_info64_from_rdebug_info32(rdebug32); - is_read = 1; - } - }break; - case sizeof(GNU_RDebugInfo64): - { - is_read = dmn_lnx_read_struct(memory_fd, addr, rdebug_out); - }break; - default:{InvalidPath;}break; - } - Assert(is_read); - return is_read; -} - //- rjf: pid => info extraction internal String8 @@ -353,260 +168,6 @@ dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) return result; } -internal ELF_Hdr64 -dmn_lnx_ehdr_from_pid(pid_t pid) -{ - Temp scratch = scratch_begin(0, 0); - B32 is_read = 0; - ELF_Hdr64 exe = {0}; - String8 exe_path = dmn_lnx_exe_path_from_pid(scratch.arena, pid); - if(exe_path.size != 0) - { - int exe_fd = OS_LNX_RETRY_ON_EINTR(open((char *)exe_path.str, O_RDONLY)); - if(exe_fd != -1) - { - is_read = dmn_lnx_read_ehdr(exe_fd, 0, &exe); - close(exe_fd); - } - } - Assert(is_read); - scratch_end(scratch); - return exe; -} - -internal DMN_LNX_ProcessAuxv -dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) -{ - Temp scratch = scratch_begin(0, 0); - DMN_LNX_ProcessAuxv result = {0}; - - // rjf: open aux data - String8 auxv_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int auxv_fd = OS_LNX_RETRY_ON_EINTR(open((char*)auxv_path.str, O_RDONLY)); - - // rjf: scan aux data - if(auxv_fd >= 0) - { - for(;;) - { - // rjf: read next aux - ELF_Auxv64 auxv = {0}; - switch(elf_class) - { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Auxv32 auxv32 = {0}; - if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) { goto brkloop; } - auxv = elf_auxv64_from_auxv32(auxv32); - }break; - case ELF_Class_64: - { - if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) { goto brkloop; } - }break; - default:{NotImplemented;}break; - } - - // rjf: fill result - switch(auxv.a_type) - { - default:{}break; - case ELF_AuxType_Null: goto brkloop; break; - case ELF_AuxType_Base: result.base = auxv.a_val; break; - case ELF_AuxType_Phnum: result.phnum = auxv.a_val; break; - case ELF_AuxType_Phent: result.phent = auxv.a_val; break; - case ELF_AuxType_Phdr: result.phdr = auxv.a_val; break; - case ELF_AuxType_ExecFn: result.execfn = auxv.a_val; break; - case ELF_AuxType_Pagesz: result.pagesz = auxv.a_val; break; - } - } - brkloop:; - close(auxv_fd); - } - - scratch_end(scratch); - return result; -} - -internal DMN_LNX_PhdrInfo -dmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) -{ - DMN_LNX_PhdrInfo result = { .range.min = max_U64 }; - - // rjf: scan table - for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); - ph_cursor < ph_opl; - ph_cursor += e_phentsize) - { - ELF_Phdr64 phdr = {0}; - if(!dmn_lnx_read_phdr(memory_fd, ph_cursor, elf_class, &phdr)) - { - Assert(0 && "unable to read a program header"); - } - - // rjf: save - switch(phdr.p_type) - { - default:{}break; - case ELF_PType_Dynamic: - { - result.dynamic = rebase + phdr.p_vaddr; - }break; - case ELF_PType_Load: - { - U64 min = rebase + phdr.p_vaddr; - U64 max = rebase + phdr.p_vaddr + phdr.p_memsz; - result.range.min = Min(result.range.min, min); - result.range.max = Max(result.range.max, max); - }break; - } - } - - return result; -} - -internal DMN_LNX_DynamicInfo -dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr) -{ - DMN_LNX_DynamicInfo dynamic_info = {0}; - for(U64 dynamic_cursor = dynamic_vaddr; ; dynamic_cursor += elf_dyn_size_from_class(elf_class)) - { - // rjf: read next dyn entry - ELF_Dyn64 dyn = {0}; - if(!dmn_lnx_read_dynamic(memory_fd, dynamic_cursor, elf_class, &dyn)) { Assert(0 && "unable to read dynamic"); } - - // rjf: break on zero - if(dyn.tag == ELF_DynTag_Null) { break; } - - // extract reuiqred values out of dynamic section - if(dyn.tag == ELF_DynTag_Strtab) - { - dynamic_info.strtab_vaddr = rebase + dyn.val; - } - else if(dyn.tag == ELF_DynTag_Strsz) - { - dynamic_info.strtab_size = dyn.val; - } - else if(dyn.tag == ELF_DynTag_Symtab) - { - dynamic_info.symtab_vaddr = rebase + dyn.val; - } - else if(dyn.tag == ELF_DynTag_Syment) - { - dynamic_info.symtab_entry_size = dyn.val; - } - else if(dyn.tag == ELF_DynTag_Hash) - { - dynamic_info.hash_vaddr = rebase + dyn.val; - } - else if(dyn.tag == ELF_DynTag_GNU_Hash) - { - dynamic_info.gnu_hash_vaddr = rebase + dyn.val; - } - } - return dynamic_info; -} - -internal U64 -dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) -{ - Temp scratch = scratch_begin(0, 0); - - U64 rdebug_vaddr = 0; - - // load DL's header - ELF_Hdr64 ehdr = {0}; - if(!dmn_lnx_read_ehdr(memory_fd, loader_vbase, &ehdr)) { Assert(0 && "failed to read interp's header"); goto exit; } - - U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; - ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; - - // find dynamic program header - U64 dynamic_vaddr = max_U64; - for EachIndex(phdr_idx, ehdr.e_phnum) - { - U64 phdr_vaddr = loader_vbase + ehdr.e_phoff + phdr_idx * ehdr.e_phentsize; - - ELF_Phdr64 phdr = {0}; - if(!dmn_lnx_read_phdr(memory_fd, phdr_vaddr, elf_class, &phdr)) { Assert(0 && "failed to read program header"); goto exit; } - - if(phdr.p_type == ELF_PType_Dynamic) - { - dynamic_vaddr = rebase + phdr.p_vaddr; - break; - } - } - - // extract necessary info out of dynamic program header - U64 dynamic_info_rebase = is_rebased ? 0 : rebase; - DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, dynamic_info_rebase, dynamic_vaddr); - - // extract symbol table count from available options - U64 symbol_count = 0; - if(dynamic_info.hash_vaddr) - { - U64 hash_entry_size = 4; - if(elf_class == ELF_Class_64 && (ehdr.e_machine == ELF_MachineKind_ALPHA || ehdr.e_machine == ELF_MachineKind_S390 || ehdr.e_machine == ELF_MachineKind_S390_OLD)) - { - hash_entry_size = 8; - } - - U64 chain_count = 0; - if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) - { - symbol_count = chain_count; - } - else - { - Assert(0 && "failed to read hash table's chain count out of HASH"); - } - } - else - { - // TODO: extract count from GNU_HASH - NotImplemented; - } - - // scan symbol table for the rendezvous symbol - if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) - { - for EachIndex(symbol_idx, symbol_count) - { - ELF_Sym64 symbol = {0}; - if(!dmn_lnx_read_symbol(memory_fd, dynamic_info.symtab_vaddr + symbol_idx * dynamic_info.symtab_entry_size, elf_class, &symbol)) - { - Assert(0 && "failed to read symbol table"); - break; - } - - Temp temp = temp_begin(scratch.arena); - - String8 symbol_name = {0}; - if(symbol.st_name < dynamic_info.strtab_size) - { - U64 cap = dynamic_info.strtab_size - symbol.st_name; - symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); - } - - if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) - { - ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info); - if(symbol_type == ELF_SymType_Object && symbol.st_size > 0) - { - rdebug_vaddr = rebase + symbol.st_value; - break; - } - } - - temp_end(temp); - } - } - -exit:; - scratch_end(scratch); - return rdebug_vaddr; -} - internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) { @@ -679,6 +240,259 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) return dl_path; } +internal ELF_Hdr64 +dmn_lnx_ehdr_from_pid(pid_t pid) +{ + Temp scratch = scratch_begin(0, 0); + B32 is_read = 0; + ELF_Hdr64 exe = {0}; + String8 exe_path = dmn_lnx_exe_path_from_pid(scratch.arena, pid); + if(exe_path.size != 0) + { + int exe_fd = OS_LNX_RETRY_ON_EINTR(open((char *)exe_path.str, O_RDONLY)); + if(exe_fd != -1) + { + is_read = elf_read_ehdr(dmn_lnx_machine_op_mem_read, &exe_fd, 0, &exe); + close(exe_fd); + } + } + Assert(is_read); + scratch_end(scratch); + return exe; +} + +internal DMN_LNX_ProcessAuxv +dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) +{ + Temp scratch = scratch_begin(0, 0); + DMN_LNX_ProcessAuxv result = {0}; + + // rjf: open aux data + String8 auxv_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); + int auxv_fd = OS_LNX_RETRY_ON_EINTR(open((char*)auxv_path.str, O_RDONLY)); + + // rjf: scan aux data + if(auxv_fd >= 0) + { + for(;;) + { + // rjf: read next aux + ELF_Auxv64 auxv = {0}; + switch(elf_class) + { + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Auxv32 auxv32 = {0}; + if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) { goto brkloop; } + auxv = elf_auxv64_from_auxv32(auxv32); + }break; + case ELF_Class_64: + { + if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) { goto brkloop; } + }break; + default:{NotImplemented;}break; + } + + // rjf: fill result + switch(auxv.a_type) + { + default:{}break; + case ELF_AuxType_Null: goto brkloop; break; + case ELF_AuxType_Base: result.base = auxv.a_val; break; + case ELF_AuxType_Phnum: result.phnum = auxv.a_val; break; + case ELF_AuxType_Phent: result.phent = auxv.a_val; break; + case ELF_AuxType_Phdr: result.phdr = auxv.a_val; break; + case ELF_AuxType_ExecFn: result.execfn = auxv.a_val; break; + case ELF_AuxType_Pagesz: result.pagesz = auxv.a_val; break; + } + } + brkloop:; + close(auxv_fd); + } + + scratch_end(scratch); + return result; +} + +internal Rng1U64 +dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) +{ + Rng1U64 result = { .min = max_U64 }; + + for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) + { + ELF_Phdr64 phdr = {0}; + if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) + { + Assert(0 && "unable to read a program header"); + } + + if(phdr.p_type == ELF_PType_Load) + { + U64 min = rebase + phdr.p_vaddr; + U64 max = rebase + phdr.p_vaddr + phdr.p_memsz; + result.min = Min(result.min, min); + result.max = Max(result.max, max); + } + } + + return result; +} + +internal U64 +dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) +{ + U64 result = max_U64; + + for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) + { + ELF_Phdr64 phdr = {0}; + if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) + { + Assert(0 && "unable to read a program header"); + } + + if(phdr.p_type == ELF_PType_Dynamic) + { + result = rebase + phdr.p_vaddr; + break; + } + } + + return result; +} + +internal DMN_LNX_DynamicInfo +dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr) +{ + DMN_LNX_DynamicInfo dynamic_info = {0}; + for(U64 dynamic_cursor = dynamic_vaddr; ; dynamic_cursor += elf_dyn_size_from_class(elf_class)) + { + // rjf: read next dyn entry + ELF_Dyn64 dyn = {0}; + if(elf_read_dyn(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_cursor, elf_class, &dyn) != MachineOpResult_Ok) { Assert(0 && "unable to read dynamic"); } + + // rjf: break on zero + if(dyn.tag == ELF_DynTag_Null) { break; } + + // extract reuiqred values out of dynamic section + if(dyn.tag == ELF_DynTag_Strtab) + { + dynamic_info.strtab_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_Strsz) + { + dynamic_info.strtab_size = dyn.val; + } + else if(dyn.tag == ELF_DynTag_Symtab) + { + dynamic_info.symtab_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_Syment) + { + dynamic_info.symtab_entry_size = dyn.val; + } + else if(dyn.tag == ELF_DynTag_Hash) + { + dynamic_info.hash_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_GNU_Hash) + { + dynamic_info.gnu_hash_vaddr = rebase + dyn.val; + } + } + return dynamic_info; +} + +internal U64 +dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) +{ + Temp scratch = scratch_begin(0, 0); + + U64 rdebug_vaddr = 0; + + // load DL's header + ELF_Hdr64 ehdr = {0}; + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, loader_vbase, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); goto exit; } + + U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; + ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; + + // find dynamic program header + U64 phdr_vaddr = loader_vbase + ehdr.e_phoff; + U64 dynamic_vaddr = dmn_lnx_find_dynamic_phdr(memory_fd, elf_class, rebase, phdr_vaddr, ehdr.e_phentsize, ehdr.e_phentsize); + + // extract necessary info out of dynamic program header + U64 dynamic_info_rebase = is_rebased ? 0 : rebase; + DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, dynamic_info_rebase, dynamic_vaddr); + + // extract symbol table count from available options + U64 symbol_count = 0; + if(dynamic_info.hash_vaddr) + { + U64 hash_entry_size = 4; + if(elf_class == ELF_Class_64 && (ehdr.e_machine == ELF_MachineKind_ALPHA || ehdr.e_machine == ELF_MachineKind_S390 || ehdr.e_machine == ELF_MachineKind_S390_OLD)) + { + hash_entry_size = 8; + } + + U64 chain_count = 0; + if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) + { + symbol_count = chain_count; + } + else + { + Assert(0 && "failed to read hash table's chain count out of HASH"); + } + } + else + { + // TODO: extract count from GNU_HASH + NotImplemented; + } + + // scan symbol table for the rendezvous symbol + if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) + { + for EachIndex(symbol_idx, symbol_count) + { + ELF_Sym64 symbol = {0}; + if(elf_read_symbol(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_info.symtab_vaddr + symbol_idx * dynamic_info.symtab_entry_size, elf_class, &symbol) != MachineOpResult_Ok) + { + Assert(0 && "failed to read symbol table"); + break; + } + + Temp temp = temp_begin(scratch.arena); + + String8 symbol_name = {0}; + if(symbol.st_name < dynamic_info.strtab_size) + { + U64 cap = dynamic_info.strtab_size - symbol.st_name; + symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); + } + + if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) + { + ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info); + if(symbol_type == ELF_SymType_Object && symbol.st_size > 0) + { + rdebug_vaddr = rebase + symbol.st_value; + break; + } + } + + temp_end(temp); + } + } + +exit:; + scratch_end(scratch); + return rdebug_vaddr; +} + //////////////////////////////// //~ SDT Probes @@ -690,11 +504,11 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) DMN_LNX_ProbeList probes = {0}; ELF_Hdr64 ehdr = {0}; - if(!dmn_lnx_read_ehdr(fd, offset, &ehdr)) { goto exit; } + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &fd, offset, &ehdr) != MachineOpResult_Ok) { goto exit; } U64 strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize; ELF_Shdr64 strtab_shdr = {0}; - if(!dmn_lnx_read_shdr(fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr)) { goto exit; } + if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr) != MachineOpResult_Ok) { goto exit; } B32 found_probes = 0; B32 found_probes_base = 0; @@ -705,7 +519,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) shdr_off < shdr_opl; shdr_off += ehdr.e_shentsize) { ELF_Shdr64 shdr = {0}; - if(!dmn_lnx_read_shdr(fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr)) { goto exit; } + if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr) != MachineOpResult_Ok) { goto exit; } if(shdr.sh_type == ELF_ShType_Note) { @@ -956,6 +770,7 @@ internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) { AssertAlways(dmn_lnx_state->tracer_tid == gettid()); + AssertAlways(thread->thread_state == DMN_LNX_ThreadState_Stopped); B32 result = 0; switch(thread->arch) @@ -1178,6 +993,7 @@ internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) { AssertAlways(dmn_lnx_state->tracer_tid == thread->parent->tracer_tid); + AssertAlways(thread->thread_state == DMN_LNX_ThreadState_Stopped); B32 result = 0; switch(thread->arch) @@ -1486,13 +1302,13 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub U64 rdebug_brk_vaddr = rdebug_vaddr + gnu_r_brk_offset_from_arch(arch); U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; - DMN_LNX_PhdrInfo phdr_info = dmn_lnx_phdr_info_from_memory(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); + Rng1U64 image_vrange = dmn_lnx_compute_image_vrange(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); Arena *process_arena = arena_alloc(); ELF_Class dl_class; { ELF_Hdr64 ehdr = {0}; - if(!dmn_lnx_read_ehdr(memory_fd, auxv.base, &ehdr)) { Assert(0 && "failed to read interp's header"); } + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, auxv.base, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); } dl_class = ehdr.e_ident[ELF_Identifier_Class]; } @@ -1618,7 +1434,7 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub e->module = dmn_lnx_handle_from_entity(module); e->arch = process->arch; e->address = base_vaddr; - e->size = dim_1u64(phdr_info.range); + e->size = dim_1u64(image_vrange); e->string = dmn_lnx_read_string(arena, process->fd, auxv.execfn); e->elf_phdr_vrange = r1u64(auxv.phdr, auxv.phdr + auxv.phent * auxv.phnum); e->elf_phdr_entsize = auxv.phent; @@ -1721,13 +1537,13 @@ dmn_lnx_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process // parse out module's ELF header ELF_Hdr64 module_ehdr = {0}; - if(!dmn_lnx_read_ehdr(process->fd, base_vaddr, &module_ehdr)) { goto exit; } + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &process->fd, base_vaddr, &module_ehdr) != MachineOpResult_Ok) { goto exit; } // gather info about module - U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; - U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; - DMN_LNX_PhdrInfo module_phdr_info = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); - String8 module_name = dmn_lnx_read_string(process->arena, process->fd, module_name_vaddr); + U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; + U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; + Rng1U64 module_vrange = dmn_lnx_compute_image_vrange(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); + String8 module_name = dmn_lnx_read_string(process->arena, process->fd, module_name_vaddr); // read TLS index and TLS offset U64 tls_index = max_U64; @@ -1757,7 +1573,7 @@ dmn_lnx_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process e->module = dmn_lnx_handle_from_entity(module); e->arch = arch_from_elf_machine(module_ehdr.e_machine); e->address = base_vaddr; - e->size = dim_1u64(module_phdr_info.range); + e->size = dim_1u64(module_vrange); e->string = module_name; e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); e->elf_phdr_entsize = module_ehdr.e_phentsize; @@ -1775,7 +1591,7 @@ dmn_lnx_handle_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity * for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) { // read out new link map item - if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { break; } + if(gnu_read_link_map(dmn_lnx_machine_op_mem_read, &process->fd, map_vaddr, process->dl_class, &map) != MachineOpResult_Ok) { break; } // was module with this base already registered? DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); @@ -1804,9 +1620,9 @@ dmn_lnx_handle_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity // mark live modules B32 is_64bit = process->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_machine_op_mem_read, process); + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { - GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_machine_op_mem_read, process); + GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_machine_op_mem_read, &process->fd); for EachNode(link_map_n, GNU_LinkMapNode, link_map_list.first) { DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, link_map_n->v.addr_vaddr); module->is_live = 1; @@ -1889,8 +1705,8 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *u if(!stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } GNU_RDebugInfo64 rdebug = {0}; - if(!dmn_lnx_read_r_debug(process->fd, rdebug_addr, process->arch, &rdebug)) { goto init_complete_exit; } - if(rdebug.r_version < 1) { goto init_complete_exit; } + if(gnu_read_r_debug(dmn_lnx_machine_op_mem_read, &process->fd, rdebug_addr, process->arch, &rdebug) != MachineOpResult_Ok) { goto init_complete_exit; } + if(rdebug.r_version < 1) { goto init_complete_exit; } dmn_lnx_handle_load_module(arena, events, process, name_space_id, rdebug.r_map); @@ -2083,7 +1899,7 @@ dmn_lnx_handle_attach(Arena *arena, DMN_EventList *events, pid_t pid) // extract modules from r_debug B32 is_64bit = process->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->rdebug_vaddr, dmn_lnx_machine_op_mem_read, process); + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); U64 name_space_id = 0; for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { @@ -2794,6 +2610,15 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); DMN_LNX_Entity *process = thread->parent; + AssertAlways(thread->thread_state == DMN_LNX_ThreadState_PendingCreation || thread->thread_state == DMN_LNX_ThreadState_Stopped); + + if(process->expect_user_interrupt) + { + process->expect_user_interrupt = 0; + dmn_lnx_handle_halt(arena, &events); + break; + } + if(thread->thread_state == DMN_LNX_ThreadState_PendingCreation) { // finish thread init @@ -2803,14 +2628,6 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) AssertAlways(dmn_lnx_state->threads_pending_creation > 0); dmn_lnx_state->threads_pending_creation -= 1; } - else - { - if(process->expect_user_interrupt) - { - process->expect_user_interrupt = 0; - dmn_lnx_handle_halt(arena, &events); - } - } }break; default: { Assert(0 && "unexpected ptrace code"); } break; } @@ -3130,3 +2947,4 @@ dmn_process_iter_end(DMN_ProcessIter *iter) } MemoryZeroStruct(iter); } + diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 44f499b4..6bb67868 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -136,13 +136,6 @@ struct DMN_LNX_ProcessAuxv U64 pagesz; }; -typedef struct DMN_LNX_PhdrInfo DMN_LNX_PhdrInfo; -struct DMN_LNX_PhdrInfo -{ - Rng1U64 range; - U64 dynamic; -}; - typedef struct DMN_LNX_DynamicInfo DMN_LNX_DynamicInfo; struct DMN_LNX_DynamicInfo { @@ -341,58 +334,42 @@ read_only global DMN_LNX_Entity *dmn_lnx_nil_entity = &dmn_lnx_nil_entity_; internal DMN_LNX_EntityNode * dmn_lnx_entity_list_push(Arena *arena, DMN_LNX_EntityList *list, DMN_LNX_Entity *v); //- rjf: file descriptor memory reading/writing helpers -internal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst); -internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); -#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) -#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) +internal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst); +internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); internal String8 dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size); internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr); - -//////////////////////////////// -//~ Runtime Struct Helpers - -internal B32 dmn_lnx_read_ehdr(int memory_fd, U64 addr, ELF_Hdr64 *ehdr_out); -internal B32 dmn_lnx_read_phdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr_out); -internal B32 dmn_lnx_read_shdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr_out); -internal B32 dmn_lnx_read_linkmap(int memory_fd, U64 addr, ELF_Class elf_class, GNU_LinkMap64 *link_map_out); -internal B32 dmn_lnx_read_dynamic(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dyn_out); -internal B32 dmn_lnx_read_symbol(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Sym64 *symbol_out); -internal B32 dmn_lnx_read_r_debug(int memory_fd, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebug_out); +#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) +#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) //- rjf: pid => info extraction internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); +internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid); internal DMN_LNX_ProcessAuxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class); //- ELF/GNU info from memory -internal DMN_LNX_PhdrInfo dmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum); -internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); -internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased); - -internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); +internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); +internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased); //////////////////////////////// //~ rjf: Entity Functions -internal DMN_LNX_Entity *dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind); -internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); -internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); -internal DMN_LNX_Entity *dmn_lnx_entity_from_handle(DMN_Handle handle); -internal DMN_LNX_Entity *dmn_lnx_thread_from_pid(pid_t pid); +internal DMN_LNX_Entity * dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind); +internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); +internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); +internal DMN_LNX_Entity * dmn_lnx_entity_from_handle(DMN_Handle handle); +internal DMN_LNX_Entity * dmn_lnx_thread_from_pid(pid_t pid); //- Process internal void dmn_lnx_process_install_probes(); //- Thread -internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread); -internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread); +internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread); +internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread); internal void dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip); internal void dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp); -internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread); -internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread); - -//////////////////////////////// - -internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on); +internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread); +internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread); +internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on); #endif // DEMON_CORE_LINUX_H diff --git a/src/elf/elf.c b/src/elf/elf.c index 0925a428..e9e67346 100644 --- a/src/elf/elf.c +++ b/src/elf/elf.c @@ -179,3 +179,115 @@ elf_dyn_size_from_class(ELF_Class elf_class) return result; } +//////////////////////////////// + +internal MachineOpResult +elf_read_ehdr(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Hdr64 *ehdr_out) +{ + U8 e_ident[ELF_Identifier_Max] = {0}; + MachineOpResult result = mem_read(addr, &e_ident, sizeof(e_ident), mem_read_ud); + if (result == MachineOpResult_Ok) { + if (str8_match(str8_prefix(str8_array_fixed(e_ident), elf_magic_string.size), elf_magic_string, 0)) { + switch (e_ident[ELF_Identifier_Class]) { + default: { InvalidPath; }break; + case ELF_Class_None: { }break; + case ELF_Class_32: { + ELF_Hdr32 ehdr32 = {0}; + result = mem_read(addr, &ehdr32, sizeof(ehdr32), mem_read_ud); + if (result == MachineOpResult_Ok) { + *ehdr_out = elf_hdr64_from_hdr32(ehdr32); + } + } break; + case ELF_Class_64: { + result = mem_read(addr, ehdr_out, sizeof(*ehdr_out), mem_read_ud); + } break; + } + } + } + return result; +} + +internal MachineOpResult +elf_read_phdr(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr_out) +{ + MachineOpResult result = MachineOpResult_Fail; + switch (elf_class) { + case ELF_Class_None: break; + case ELF_Class_32: { + ELF_Phdr32 phdr32 = {0}; + result = mem_read(addr, &phdr32, sizeof(phdr32), mem_read_ud); + if (result == MachineOpResult_Ok) { + *phdr_out = elf_phdr64_from_phdr32(phdr32); + } + } break; + case ELF_Class_64: { + result = mem_read(addr, phdr_out, sizeof(*phdr_out), mem_read_ud); + } break; + default: { NotImplemented; } break; + } + return result; +} + +internal MachineOpResult +elf_read_shdr(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr_out) +{ + MachineOpResult result = MachineOpResult_Fail; + switch (elf_class) { + case ELF_Class_None: break; + case ELF_Class_32: { + ELF_Shdr32 shdr32 = {0}; + result = mem_read(addr, &shdr32, sizeof(shdr32), mem_read_ud); + if (result == MachineOpResult_Ok) { + *shdr_out = elf_shdr64_from_shdr32(shdr32); + } + } break; + case ELF_Class_64: { + result = mem_read(addr, shdr_out, sizeof(*shdr_out), mem_read_ud); + } break; + default: { NotImplemented; } break; + } + return result; +} + +internal MachineOpResult +elf_read_dyn(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dyn_out) +{ + MachineOpResult result = MachineOpResult_Fail; + switch (elf_class) { + case ELF_Class_None: {} break; + case ELF_Class_32: { + ELF_Dyn32 dyn32 = {0}; + result = mem_read(addr, &dyn32, sizeof(dyn32), mem_read_ud); + if (result == MachineOpResult_Fail) { + *dyn_out = elf_dyn64_from_dyn32(dyn32); + } + } break; + case ELF_Class_64: { + result = mem_read(addr, dyn_out, sizeof(*dyn_out), mem_read_ud); + } break; + default: { NotImplemented; } break; + } + return result; +} + +internal MachineOpResult +elf_read_symbol(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Class elf_class, ELF_Sym64 *symbol_out) +{ + MachineOpResult result = MachineOpResult_Fail; + switch (elf_class) { + case ELF_Class_None: {} break; + case ELF_Class_32: { + ELF_Sym32 symbol32 = {0}; + result = mem_read(addr, &symbol32, sizeof(symbol32), mem_read_ud); + if (result == MachineOpResult_Ok) { + *symbol_out = elf_sym64_from_sym32(symbol32); + } + }break; + case ELF_Class_64: { + result = mem_read(addr, symbol_out, sizeof(*symbol_out), mem_read_ud); + }break; + default: { NotImplemented; } break; + } + return result; +} + diff --git a/src/elf/elf.h b/src/elf/elf.h index 2c15aa15..1a32fbce 100644 --- a/src/elf/elf.h +++ b/src/elf/elf.h @@ -841,4 +841,13 @@ internal Arch arch_from_elf_machine(ELF_MachineKind machine); internal U64 elf_phdr_size_from_class(ELF_Class elf_class); internal U64 elf_dyn_size_from_class(ELF_Class elf_class); +//////////////////////////////// +//~ Compat Readers + +internal MachineOpResult elf_read_ehdr (MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Hdr64 *ehdr_out); +internal MachineOpResult elf_read_phdr (MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr_out); +internal MachineOpResult elf_read_shdr (MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr_out); +internal MachineOpResult elf_read_dyn (MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dyn_out); +internal MachineOpResult elf_read_symbol(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, ELF_Class elf_class, ELF_Sym64 *symbol_out); + #endif // ELF_H diff --git a/src/gnu/gnu.c b/src/gnu/gnu.c index 814d786f..9586fa32 100644 --- a/src/gnu/gnu.c +++ b/src/gnu/gnu.c @@ -276,3 +276,40 @@ gnu_string_from_property_flags_x86(Arena *arena, GNU_PropertyX86 prop, U32 flags return result; } +internal MachineOpResult +gnu_read_link_map(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, B32 is_64bit, GNU_LinkMap64 *link_map_out) +{ + MachineOpResult result = MachineOpResult_Fail; + if (is_64bit) { + result = mem_read(addr, link_map_out, sizeof(*link_map_out), mem_read_ud); + } else { + GNU_LinkMap32 link_map_32 = {0}; + result = mem_read(addr, &link_map_32, sizeof(link_map_32), mem_read_ud); + if (result == MachineOpResult_Ok) { + *link_map_out = gnu_linkmap64_from_linkmap32(link_map_32); + } + } + return result; +} + +internal MachineOpResult +gnu_read_r_debug(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebug_out) +{ + MachineOpResult result = MachineOpResult_Fail; + switch (gnu_rdebug_info_size_from_arch(arch)) { + case 0: {} break; + case sizeof(GNU_RDebugInfo32): { + GNU_RDebugInfo32 rdebug32 = {0}; + result = mem_read(addr, &rdebug32, sizeof(rdebug32), mem_read_ud); + if (result == MachineOpResult_Ok) { + *rdebug_out = gnu_rdebug_info64_from_rdebug_info32(rdebug32); + } + } break; + case sizeof(GNU_RDebugInfo64): { + result = mem_read(addr, rdebug_out, sizeof(*rdebug_out), mem_read_ud); + } break; + default: { InvalidPath; } break; + } + return result; +} + diff --git a/src/gnu/gnu.h b/src/gnu/gnu.h index 37f15007..22ba9aaf 100644 --- a/src/gnu/gnu.h +++ b/src/gnu/gnu.h @@ -201,4 +201,10 @@ internal String8 gnu_string_from_abi_tag(GNU_AbiTag abi_tag); internal String8 gnu_string_from_note_type(GNU_NoteType note_type); internal String8 gnu_string_from_property_x86(GNU_PropertyX86 prop); +//////////////////////////////// +//~ Compat Readers + +internal MachineOpResult gnu_read_link_map(MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, B32 is_64bit, GNU_LinkMap64 *link_map_out); +internal MachineOpResult gnu_read_r_debug (MachineOp_MemRead *mem_read, void *mem_read_ud, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebug_out); + #endif // GNU_H From 12b53f417475431c86a19112a4abea40e8cad475 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 12 Jan 2026 15:08:29 -0800 Subject: [PATCH 116/850] move register layout struct to Linux OS layer; use only GPR portion of the layout struct for reg r/w; handle orig_rax --- src/demon/linux/demon_core_linux.c | 119 +++++++++++++++-------------- src/demon/linux/demon_core_linux.h | 51 +------------ src/os/core/linux/os_core_linux.h | 60 +++++++++++++++ 3 files changed, 121 insertions(+), 109 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 2ead00fb..286aae38 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -794,38 +794,38 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) //- rjf: read GPR B32 got_gpr = 0; { - DMN_LNX_UserX64 ctx = {0}; - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(ctx), .iov_base = &ctx })); - if(ptrace_result != -1) + OS_LNX_GprsX64 src; + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(src), .iov_base = &src })); + if(ptrace_result >= 0) { got_gpr = 1; - DMN_LNX_UserX64 *src = &ctx; - dst->rax.u64 = src->regs.rax; - dst->rcx.u64 = src->regs.rcx; - dst->rdx.u64 = src->regs.rdx; - dst->rbx.u64 = src->regs.rbx; - dst->rsp.u64 = src->regs.rsp; - dst->rbp.u64 = src->regs.rbp; - dst->rsi.u64 = src->regs.rsi; - dst->rdi.u64 = src->regs.rdi; - dst->r8.u64 = src->regs.r8; - dst->r9.u64 = src->regs.r9; - dst->r10.u64 = src->regs.r10; - dst->r11.u64 = src->regs.r11; - dst->r12.u64 = src->regs.r12; - dst->r13.u64 = src->regs.r13; - dst->r14.u64 = src->regs.r14; - dst->r15.u64 = src->regs.r15; - dst->cs.u16 = src->regs.cs; - dst->ds.u16 = src->regs.ds; - dst->es.u16 = src->regs.es; - dst->fs.u16 = src->regs.fs; - dst->gs.u16 = src->regs.gs; - dst->ss.u16 = src->regs.ss; - dst->fsbase.u64 = src->regs.fsbase; - dst->gsbase.u64 = src->regs.gsbase; - dst->rip.u64 = src->regs.rip; - dst->rflags.u64 = src->regs.rflags; + dst->r15.u64 = src.r15; + dst->r14.u64 = src.r14; + dst->r13.u64 = src.r13; + dst->r12.u64 = src.r12; + dst->rbp.u64 = src.rbp; + dst->rbx.u64 = src.rbx; + dst->r11.u64 = src.r11; + dst->r10.u64 = src.r10; + dst->r9.u64 = src.r9; + dst->r8.u64 = src.r8; + dst->rax.u64 = src.rax; + dst->rcx.u64 = src.rcx; + dst->rdx.u64 = src.rdx; + dst->rsi.u64 = src.rsi; + dst->rdi.u64 = src.rdi; + dst->rip.u64 = src.rip; + dst->cs.u16 = src.cs; + dst->rflags.u64 = src.rflags; + dst->rsp.u64 = src.rsp; + dst->ss.u16 = src.ss; + dst->fsbase.u64 = src.fsbase; + dst->gsbase.u64 = src.gsbase; + dst->ds.u16 = src.ds; + dst->es.u16 = src.es; + dst->fs.u16 = src.fs; + dst->gs.u16 = src.gs; + thread->orig_rax = src.orig_rax; } else { Assert(0 && "failed to get gprs"); } } @@ -967,7 +967,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) { if(n != 4 && n != 5) { - U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[n]); + U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); errno = 0; long peek_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0)); if(errno == 0) @@ -1017,33 +1017,34 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) //- rjf: write GPR B32 did_gpr = 0; { - DMN_LNX_UserX64 dst = {0}; - dst.regs.rax = src->rax.u64; - dst.regs.rcx = src->rcx.u64; - dst.regs.rdx = src->rdx.u64; - dst.regs.rbx = src->rbx.u64; - dst.regs.rsp = src->rsp.u64; - dst.regs.rbp = src->rbp.u64; - dst.regs.rsi = src->rsi.u64; - dst.regs.rdi = src->rdi.u64; - dst.regs.r8 = src->r8.u64; - dst.regs.r9 = src->r9.u64; - dst.regs.r10 = src->r10.u64; - dst.regs.r11 = src->r11.u64; - dst.regs.r12 = src->r12.u64; - dst.regs.r13 = src->r13.u64; - dst.regs.r14 = src->r14.u64; - dst.regs.r15 = src->r15.u64; - dst.regs.cs = src->cs.u16; - dst.regs.ds = src->ds.u16; - dst.regs.es = src->es.u16; - dst.regs.fs = src->fs.u16; - dst.regs.gs = src->gs.u16; - dst.regs.ss = src->ss.u16; - dst.regs.fsbase = src->fsbase.u64; - dst.regs.gsbase = src->gsbase.u64; - dst.regs.rip = src->rip.u64; - dst.regs.rflags = src->rflags.u64; + OS_LNX_GprsX64 dst; + dst.r15 = src->r15.u64; + dst.r14 = src->r14.u64; + dst.r13 = src->r13.u64; + dst.r12 = src->r12.u64; + dst.rbp = src->rbp.u64; + dst.rbx = src->rbx.u64; + dst.r11 = src->r11.u64; + dst.r10 = src->r10.u64; + dst.r9 = src->r9.u64; + dst.r8 = src->r8.u64; + dst.rax = src->rax.u64; + dst.rcx = src->rcx.u64; + dst.rdx = src->rdx.u64; + dst.rsi = src->rsi.u64; + dst.rdi = src->rdi.u64; + dst.orig_rax = thread->orig_rax; + dst.rip = src->rip.u64; + dst.cs = src->cs.u16; + dst.rflags = src->rflags.u64; + dst.rsp = src->rsp.u64; + dst.ss = src->ss.u16; + dst.fsbase = src->fsbase.u64; + dst.gsbase = src->gsbase.u64; + dst.ds = src->ds.u16; + dst.es = src->es.u16; + dst.fs = src->fs.u16; + dst.gs = src->gs.u16; did_gpr = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) }) >= 0); } @@ -1192,7 +1193,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) { if(n != 4 && n != 5) { - U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[n]); + U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); int poke_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), (void*)(uintptr_t)dr_s[n].u64)); if(poke_result < 0) { diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 6bb67868..2e05e8c9 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -11,56 +11,6 @@ #include #include -//////////////////////////////// -//~ rjf: Register Layouts -// -// These are defined in , but only for one architecture at a time - -typedef struct DMN_LNX_UserX64 DMN_LNX_UserX64; -struct DMN_LNX_UserX64 -{ - struct - { - U64 r15; - U64 r14; - U64 r13; - U64 r12; - U64 rbp; - U64 rbx; - U64 r11; - U64 r10; - U64 r9; - U64 r8; - U64 rax; - U64 rcx; - U64 rdx; - U64 rsi; - U64 rdi; - U64 orig_rax; - U64 rip; - U64 cs; - U64 rflags; - U64 rsp; - U64 ss; - U64 fsbase; - U64 gsbase; - U64 ds; - U64 es; - U64 fs; - U64 gs; - } regs; - S32 u_fpvalid, _pad0; - X64_FXSave i387; - U64 u_tsize, u_dsize, u_ssize, start_code, start_stack; - U64 signal; - S32 reserved, _pad1; - U64 u_ar0, u_fpstate; - U64 magic; - U8 u_comm[32]; - U64 u_debugreg[8]; -}; -StaticAssert(sizeof(DMN_LNX_UserX64) == 912, g_dmn_lnx_user_x64_size_check); - //////////////////////////////// typedef struct DMN_LNX_DbDesc DMN_LNX_DbDesc; @@ -216,6 +166,7 @@ struct DMN_LNX_Entity U64 pass_through_signo; DMN_LNX_ThreadState thread_state; U64 thread_local_base; + U64 orig_rax; // module U64 module_name_vaddr; diff --git a/src/os/core/linux/os_core_linux.h b/src/os/core/linux/os_core_linux.h index d18a2a7e..1f3ab4a0 100644 --- a/src/os/core/linux/os_core_linux.h +++ b/src/os/core/linux/os_core_linux.h @@ -49,6 +49,66 @@ typedef struct timespec timespec; __ret; \ })) +//////////////////////////////// +//~ rjf: Register Layouts +// +// These are defined in , but only for one architecture at a time + +typedef struct OS_LNX_GprsX64 OS_LNX_GprsX64; +struct OS_LNX_GprsX64 +{ + U64 r15; + U64 r14; + U64 r13; + U64 r12; + U64 rbp; + U64 rbx; + U64 r11; + U64 r10; + U64 r9; + U64 r8; + U64 rax; + U64 rcx; + U64 rdx; + U64 rsi; + U64 rdi; + U64 orig_rax; + U64 rip; + U64 cs; + U64 rflags; + U64 rsp; + U64 ss; + U64 fsbase; + U64 gsbase; + U64 ds; + U64 es; + U64 fs; + U64 gs; +}; + +typedef struct OS_LNX_UserX64 OS_LNX_UserX64; +struct OS_LNX_UserX64 +{ + OS_LNX_GprsX64 regs; + S32 u_fpvalid; + U32 _pad0; + X64_FXSave i387; + U64 u_tsize; + U64 u_dsize; + U64 u_ssize; + U64 start_code; + U64 start_stack; + U64 signal; + U32 reserved; + U32 _pad1; + U64 u_ar0; + U64 u_fpstate; + U64 magic; + U8 u_comm[32]; + U64 u_debugreg[8]; +}; +StaticAssert(sizeof(OS_LNX_UserX64) == 912, g_os_lnx_user_x64_size_check); + //////////////////////////////// //~ rjf: File Iterator From 70d04ac807384f8b38a03579e088e0053b83a773 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 12 Jan 2026 15:23:09 -0800 Subject: [PATCH 117/850] clean up unused process fields --- src/demon/linux/demon_core_linux.c | 10 ---------- src/demon/linux/demon_core_linux.h | 3 --- 2 files changed, 13 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 286aae38..544a49d8 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -1300,7 +1300,6 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base, is_rebased); - U64 rdebug_brk_vaddr = rdebug_vaddr + gnu_r_brk_offset_from_arch(arch); U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; Rng1U64 image_vrange = dmn_lnx_compute_image_vrange(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); @@ -1370,8 +1369,6 @@ dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_sub process->tracer_tid = gettid(); process->debug_subprocesses = debug_subprocesses; process->rdebug_vaddr = rdebug_vaddr; - process->rdebug_brk_vaddr = rdebug_brk_vaddr; - process->expect_rdebug_data_breakpoint = rdebug_vaddr != 0; process->dl_class = dl_class; process->arena = process_arena; process->loaded_modules_ht = hash_table_init(process_arena, 0x1000); @@ -2613,13 +2610,6 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) AssertAlways(thread->thread_state == DMN_LNX_ThreadState_PendingCreation || thread->thread_state == DMN_LNX_ThreadState_Stopped); - if(process->expect_user_interrupt) - { - process->expect_user_interrupt = 0; - dmn_lnx_handle_halt(arena, &events); - break; - } - if(thread->thread_state == DMN_LNX_ThreadState_PendingCreation) { // finish thread init diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 2e05e8c9..f0fcb288 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -141,10 +141,7 @@ struct DMN_LNX_Entity int fd; pid_t tracer_tid; B32 debug_subprocesses; - B32 expect_user_interrupt; - B32 expect_rdebug_data_breakpoint; U64 rdebug_vaddr; - U64 rdebug_brk_vaddr; ELF_Class dl_class; HashTable *loaded_modules_ht; DMN_LNX_Probe **probes; From de164784d08966caf292f953cd692128859d3930 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 12 Jan 2026 19:06:29 -0800 Subject: [PATCH 118/850] fix typos in runtime GNU struct parser --- src/gnu/gnu_parse.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/gnu/gnu_parse.c b/src/gnu/gnu_parse.c index f68dc5d5..dbd90f3c 100644 --- a/src/gnu/gnu_parse.c +++ b/src/gnu/gnu_parse.c @@ -9,18 +9,18 @@ gnu_parse_rdebug(Arena *arena, B32 is_64bit, U64 first_rdebug_vaddr, MachineOp_M for (U64 rdebug_vaddr = first_rdebug_vaddr, rdebug_next = 0; rdebug_vaddr != 0; rdebug_vaddr = rdebug_next) { GNU_RDebugInfo64 rdebug; if (is_64bit) { - U64 rdebug_read_size = mem_read_func(rdebug_vaddr, &rdebug, sizeof(rdebug),mem_read_ud); - if (rdebug_read_size != sizeof(rdebug)) { goto exit; } + MachineOpResult read_result = mem_read_func(rdebug_vaddr, &rdebug, sizeof(rdebug),mem_read_ud); + if (read_result != MachineOpResult_Ok) { goto exit; } } else { GNU_RDebugInfo32 rdebug32; - U64 rdebug_read_size = mem_read_func(rdebug_vaddr, &rdebug32, sizeof(rdebug32), mem_read_ud); - if (rdebug_read_size != sizeof(rdebug32)) { goto exit; } + MachineOpResult read_result = mem_read_func(rdebug_vaddr, &rdebug32, sizeof(rdebug32), mem_read_ud); + if (read_result != MachineOpResult_Ok) { goto exit; } } if (rdebug.r_version < 1) { goto exit; } if (rdebug.r_version > 1) { - U64 r_next_size = mem_read_func(rdebug_vaddr + sizeof(rdebug), &rdebug_next, sizeof(rdebug_next), mem_read_ud); - if (r_next_size != sizeof(rdebug_next)) { goto exit; } + MachineOpResult read_result = mem_read_func(rdebug_vaddr + sizeof(rdebug), &rdebug_next, sizeof(rdebug_next), mem_read_ud); + if (read_result != MachineOpResult_Ok) { goto exit; } } GNU_RDebugInfoNode *rdebug_n = push_array(arena, GNU_RDebugInfoNode, 1); @@ -41,12 +41,12 @@ gnu_parse_link_map_list(Arena *arena, B32 is_64bit, U64 first_link_map_vaddr, Ma GNU_LinkMap64 link_map = {0}; for (U64 link_map_vaddr = first_link_map_vaddr; link_map_vaddr != 0; link_map_vaddr = link_map.next_vaddr) { if (is_64bit) { - U64 link_map_size = mem_read_func(link_map_vaddr, &link_map, sizeof(link_map), mem_read_ud); - if (link_map_size != sizeof(link_map)) { goto exit; } + MachineOpResult read_result = mem_read_func(link_map_vaddr, &link_map, sizeof(link_map), mem_read_ud); + if (read_result != MachineOpResult_Ok) { goto exit; } } else { GNU_LinkMap32 link_map32 = {0}; - U64 link_map_size = mem_read_func(link_map_vaddr, &link_map32, sizeof(link_map32), mem_read_ud); - if (link_map_size != sizeof(link_map32)) { goto exit; } + MachineOpResult read_result = mem_read_func(link_map_vaddr, &link_map32, sizeof(link_map32), mem_read_ud); + if (read_result != MachineOpResult_Ok) { goto exit; } gnu_linkmap64_from_linkmap32(link_map32); } From 2729aae982e62434ebf862db3f832b7a265ab19d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 15 Jan 2026 16:41:07 -0800 Subject: [PATCH 119/850] natvis for linker types --- src/linker/linker.natvis | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/linker/linker.natvis b/src/linker/linker.natvis index 64de6bfb..84296c9c 100644 --- a/src/linker/linker.natvis +++ b/src/linker/linker.natvis @@ -102,6 +102,27 @@ + + + v + + + + + + name + + + + + + node + node = node->next + + + + + count From 0c0b7ac6d319c87d41a6e72a52ad0ceb65b53883 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 15 Jan 2026 18:25:46 -0800 Subject: [PATCH 120/850] bugfix import linking --- src/base/base_core.h | 2 ++ src/linker/lnk.c | 43 +++++++++++++++---------------------------- src/linker/lnk.h | 6 ++++-- src/linker/lnk_lib.c | 26 +++++++++++++++----------- src/linker/lnk_lib.h | 8 ++++++++ 5 files changed, 44 insertions(+), 41 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index 3455562a..8eeb9ab1 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -266,6 +266,7 @@ # define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((LONG *)(x),(k),(c)) # define ins_atomic_u32_add_eval(x,c) InterlockedAdd((LONG *)(x), (c)) # define ins_atomic_u8_eval_assign(x,c) InterlockedExchange8((CHAR *)(x), (c)) +# define ins_atomic_u8_or(x,c) InterlockedOr8((char *)(x), (char)c) # else # error Atomic intrinsics not defined for this compiler / architecture combination. # endif @@ -284,6 +285,7 @@ # define ins_atomic_u32_eval_assign(x,c) __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST) # define ins_atomic_u32_eval_cond_assign(x,k,c) ({ U32 _new = (c); __atomic_compare_exchange_n((U32 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) # define ins_atomic_u8_eval_assign(x,c) __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST) +# define ins_atomic_u8_or(x,c) __atomic_fetch_or((U8 *)(x), (U8)(c), __ATOMIC_SEQ_CST) #else # error Atomic intrinsics not defined for this compiler / architecture. #endif diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 65534ce8..81bfbbfc 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1486,8 +1486,9 @@ lnk_queue_lib_member(Arena *arena, LNK_LibMemberRefList *queued_members, LNK_Sym B32 was_linked = lnk_lib_set_link_symbol(lib, member_idx, link_symbol); if (was_linked) { LNK_LibMemberRef *member_ref = push_array(arena, LNK_LibMemberRef, 1); - member_ref->lib = lib; - member_ref->member_idx = member_idx; + member_ref->lib = lib; + member_ref->member_idx = member_idx; + member_ref->link_symbol = link_symbol; lnk_lib_member_ref_list_push_node(queued_members, member_ref); } } @@ -1583,7 +1584,7 @@ lnk_link_inputs(TP_Context *tp, LNK_LibMemberRef *member_ref = member_refs[i]; LNK_Lib *lib = member_ref->lib; - LNK_Symbol *link_symbol = lib->member_links[member_ref->member_idx]; + LNK_Symbol *link_symbol = member_ref->link_symbol; COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, lib->member_offsets[member_ref->member_idx]); COFF_DataType member_type = coff_data_type_from_data(member_info.data); @@ -1612,35 +1613,21 @@ lnk_link_inputs(TP_Context *tp, switch (member_type) { case COFF_DataType_Import: { - LNK_Symbol *link_symbol = lib->member_links[member_idx]; + // find import stub + LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB)); - LNK_Symbol *import_symbols[2] = {0}; - if (str8_starts_with(link_symbol->name, str8_lit("__imp_"))) { - import_symbols[0] = link_symbol; - import_symbols[1] = lnk_symbol_table_search(symtab, str8_skip(link_symbol->name, str8_lit("__imp_").size)); - } else { - Temp temp = temp_begin(scratch.arena); - String8 imp_name = push_str8f(temp.arena, "__imp_%S", link_symbol->name); - import_symbols[0] = lnk_symbol_table_search(symtab, imp_name); - import_symbols[1] = link_symbol; - temp_end(temp); - } + // same import symbol must never be queued more than once, if it is, there is a bug in the link set logic + AssertAlways(member_ref->link_symbol->refs != import_stub->refs); - for EachIndex(i, ArrayCount(import_symbols)) { - LNK_Symbol *import_symbol = import_symbols[i]; - if (import_symbol == 0) { continue; } - - LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB)); - - // same import symbol must never be queued more than once, if it is, there is a bug in the link set logic - AssertAlways(import_symbol->refs != import_stub->refs); - - // replace the import symbol with a stub, which is later replaced with the real import symbol once import obj is ready - import_symbol->refs = import_stub->refs; - } + // replace the import symbol with a stub, which is later replaced with the real import symbol once import obj is ready + member_ref->link_symbol->refs = import_stub->refs; // push import member for import obj generation - lnk_lib_member_ref_list_push_node(&link->imports, member_ref); + LNK_LibMemberFlags member_flags = lib->member_flags[member_ref->member_idx]; + B32 is_first_link = member_flags != (LNK_LibMemberFlag_LinkedRegular | LNK_LibMemberFlag_LinkedImp); + if (is_first_link) { + lnk_lib_member_ref_list_push_node(&link->imports, member_ref); + } } break; case COFF_DataType_BigObj: case COFF_DataType_Obj: { diff --git a/src/linker/lnk.h b/src/linker/lnk.h index fd96e826..4f8f9cbe 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -7,8 +7,9 @@ typedef struct LNK_LibMemberRef { - LNK_Lib *lib; - U32 member_idx; + LNK_Lib *lib; + U32 member_idx; + LNK_Symbol *link_symbol; struct LNK_LibMemberRef *next; } LNK_LibMemberRef; @@ -183,6 +184,7 @@ typedef struct { B32 search_anti_deps; LNK_SymbolTable *symtab; + LNK_Symbol *import_stub; LNK_Lib *lib; LNK_LibMemberRefList *member_ref_lists; } LNK_SearchLibTask; diff --git a/src/linker/lnk_lib.c b/src/linker/lnk_lib.c index 28ab3673..cd00876a 100644 --- a/src/linker/lnk_lib.c +++ b/src/linker/lnk_lib.c @@ -142,6 +142,7 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, U64 input_idx, LNK_L lib_out->member_offsets = member_offsets; lib_out->symbol_indices = symbol_indices; lib_out->member_links = push_array(arena, LNK_Symbol *, member_count); + lib_out->member_flags = push_array(arena, LNK_LibMemberFlags, member_count); lib_out->symbol_names = symbol_names; lib_out->long_names = parse.long_names; lib_out->input_idx = input_idx; @@ -224,15 +225,21 @@ lnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, U internal B32 lnk_lib_set_link_symbol(LNK_Lib *lib, U32 member_idx, LNK_Symbol *link_symbol) { - local_persist LNK_Symbol null_symbol; - - LNK_Symbol *slot = ins_atomic_ptr_eval_assign(&lib->member_links[member_idx], &null_symbol); - - B32 was_linked = (slot == 0); + B32 was_linked; + if (str8_starts_with(link_symbol->name, str8_lit("__imp_"))) { + U8 member_flags = ins_atomic_u8_or(&lib->member_flags[member_idx], LNK_LibMemberFlag_LinkedImp); + was_linked = !!(~member_flags & LNK_LibMemberFlag_LinkedImp); + } else { + U8 flag = LNK_LibMemberFlag_LinkedRegular; + U8 member_flags = ins_atomic_u8_or(&lib->member_flags[member_idx], LNK_LibMemberFlag_LinkedRegular); + was_linked = !!(~member_flags & LNK_LibMemberFlag_LinkedRegular); + } for (LNK_Symbol *leader = link_symbol;;) { + LNK_Symbol *slot = ins_atomic_ptr_eval_assign(&lib->member_links[member_idx], 0); + // update slot symbol if it is empty or link symbol comes before symbol in the slot - if (slot && slot != &null_symbol) { + if (slot) { if (lnk_symbol_is_before(slot, leader)) { leader = slot; } @@ -241,15 +248,12 @@ lnk_lib_set_link_symbol(LNK_Lib *lib, U32 member_idx, LNK_Symbol *link_symbol) } // try to insert back updated slot symbol - LNK_Symbol *swap = ins_atomic_ptr_eval_cond_assign(&lib->member_links[member_idx], leader, &null_symbol); + LNK_Symbol *swap = ins_atomic_ptr_eval_cond_assign(&lib->member_links[member_idx], leader, 0); // exit if slot symbol was null - if (swap == &null_symbol) { + if (swap == 0) { break; } - - // reload slot symbol - slot = ins_atomic_ptr_eval_assign(&lib->member_links[member_idx], &null_symbol); } return was_linked; diff --git a/src/linker/lnk_lib.h b/src/linker/lnk_lib.h index 0cbdd673..adaf0487 100644 --- a/src/linker/lnk_lib.h +++ b/src/linker/lnk_lib.h @@ -3,6 +3,13 @@ #pragma once +typedef U8 LNK_LibMemberFlags; +enum +{ + LNK_LibMemberFlag_LinkedRegular = (1 << 0), + LNK_LibMemberFlag_LinkedImp = (1 << 1), +}; + typedef struct LNK_Lib { String8 path; @@ -13,6 +20,7 @@ typedef struct LNK_Lib U32 *member_offsets; U16 *symbol_indices; LNK_Symbol **member_links; + LNK_LibMemberFlags *member_flags; String8Array symbol_names; String8 long_names; U64 input_idx; From 6e32a1f11ca3c34c2717e27bac188976ad249ad3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 15 Jan 2026 18:28:03 -0800 Subject: [PATCH 121/850] ignore /EXPERIMENTAL --- src/linker/lnk_config.c | 5 +++++ src/linker/lnk_config.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index c47d366c..49478ba9 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -40,6 +40,7 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_ErrorReport, 0, "ERRORREPORT", "", "Deprecated starting Windows Vista." }, { LNK_CmdSwitch_Export, 1, "EXPORT", ":SYMBOL", "" }, { LNK_CmdSwitch_NotImplemented, 0, "EXPORTADMIN", "", "" }, + { LNK_CmdSwitch_Experimental, 0, "EXPERIMENTAL", "Not supported." }, { LNK_CmdSwitch_FastFail, 0, "FASTFAIL", "", "Not used." }, { LNK_CmdSwitch_NotImplemented, 0, "FASTGENPROFILE", "", "" }, { LNK_CmdSwitch_FailIfMismatch, 1, "FAILIFMISMATCH", "", "" }, @@ -1350,6 +1351,10 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; + case LNK_CmdSwitch_Experimental: { + // not supported + } break; + case LNK_CmdSwitch_FastFail: { // do nothing } break; diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 3638ea29..e05a6ef2 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -48,6 +48,7 @@ typedef enum LNK_CmdSwitch_D2, LNK_CmdSwitch_Entry, LNK_CmdSwitch_ErrorReport, + LNK_CmdSwitch_Experimental, LNK_CmdSwitch_Export, LNK_CmdSwitch_FastFail, LNK_CmdSwitch_FileAlign, From 0168448924cde57f30ba7f2833aa2483df0b88d2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 16 Jan 2026 18:40:32 -0800 Subject: [PATCH 122/850] by default commit a page for heap and stack --- src/linker/lnk_config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 49478ba9..31bc071f 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -2084,9 +2084,9 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) config->build_imp_lib = 1; config->build_exp = 1; config->heap_reserve = MB(1); - config->heap_commit = KB(1); + config->heap_commit = KB(4); config->stack_reserve = MB(1); - config->stack_commit = KB(1); + config->stack_commit = KB(4); config->pdb_hash_type_names = LNK_TypeNameHashMode_None; config->pdb_hash_type_name_length = 8; config->data_dir_count = PE_DataDirectoryIndex_COUNT; From 4ab89cd120e59c761d5a9e6bf574b781696e6460 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 16 Jan 2026 18:41:15 -0800 Subject: [PATCH 123/850] set default values for unload and nobind --- src/linker/lnk_config.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 31bc071f..2aec5160 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -1259,9 +1259,9 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } else { String8 value = value_strings.first->string; if (str8_match_lit("unload", value, StringMatchFlag_CaseInsensitive)) { - config->import_table_emit_uiat = 1; + config->import_table_emit_uiat = LNK_SwitchState_Yes; } else if (str8_match_lit("nobind", value, StringMatchFlag_CaseInsensitive)) { - config->import_table_emit_biat = 0; + config->import_table_emit_biat = LNK_SwitchState_No; } else { lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unknown parameter \"%S\"", value); } @@ -2152,6 +2152,13 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) if (config->dll_characteristics & PE_DllCharacteristic_NO_BIND) { config->import_table_emit_biat = LNK_SwitchState_No; } + + if (config->import_table_emit_biat == LNK_SwitchState_Null) { + config->import_table_emit_biat = LNK_SwitchState_Yes; + } + if (config->import_table_emit_uiat == LNK_SwitchState_Null) { + config->import_table_emit_uiat = LNK_SwitchState_Yes; + } // set flags for /OPT { From 8f47ce761635e5297f1da37fcbe090b6dbb4bcfc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 16 Jan 2026 18:52:55 -0800 Subject: [PATCH 124/850] filter out duplicate page entries before computing the buffer size --- src/linker/base_ext/base_arrays.c | 12 ++-- src/linker/base_ext/base_arrays.h | 1 + src/linker/lnk.c | 92 ++++++++++++++++++------------- 3 files changed, 64 insertions(+), 41 deletions(-) diff --git a/src/linker/base_ext/base_arrays.c b/src/linker/base_ext/base_arrays.c index fa50c36f..c6552b4c 100644 --- a/src/linker/base_ext/base_arrays.c +++ b/src/linker/base_ext/base_arrays.c @@ -26,16 +26,20 @@ void_node_concat_atomic(VoidNode **head, VoidNode *node) node->next = ins_atomic_ptr_eval_assign(head, node); } +internal void +u64_list_push_node(U64List *list, U64Node *n) +{ + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + internal U64Node * u64_list_push(Arena *arena, U64List *list, U64 data) { U64Node *n = push_array(arena, U64Node, 1); n->next = 0; n->data = data; - - SLLQueuePush(list->first, list->last, n); - ++list->count; - + u64_list_push_node(list, n); return n; } diff --git a/src/linker/base_ext/base_arrays.h b/src/linker/base_ext/base_arrays.h index 45ad68e8..6613dea6 100644 --- a/src/linker/base_ext/base_arrays.h +++ b/src/linker/base_ext/base_arrays.h @@ -30,6 +30,7 @@ typedef struct VoidNode //////////////////////////////// +internal void u64_list_push_node(U64List *list, U64Node *n); internal U64Node * u64_list_push(Arena *arena, U64List *list, U64 data); internal void u64_list_concat_in_place(U64List *list, U64List *to_concat); internal U64Array u64_array_from_list(Arena *arena, U64List *list); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 81bfbbfc..1b3b14e2 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -3637,44 +3637,59 @@ THREAD_POOL_TASK_FUNC(lnk_gather_base_reloc_pages_task) ProfEnd(); } +internal +THREAD_POOL_TASK_FUNC(lnk_filter_out_duplicate_base_reloc_entries_task) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + LNK_BaseRelocsTask *task = raw_task; + + HashTable *voff_ht = hash_table_init(scratch.arena, task->page_size); + for EachInRange(page_idx, task->serialize.ranges[task_id]) { + LNK_BaseRelocPage *page = &task->serialize.pages.v[page_idx]; + + U64List unique_entries32 = {0}; + U64List unique_entries64 = {0}; + + // filter out duplicate 32-bit virtual offsets + for (U64Node *curr = page->entries_addr32->first, *next; curr != 0; curr = next) { + next = curr->next; + if (hash_table_search_u64(voff_ht, curr->data)) { continue; } + hash_table_push_u64_u64(scratch.arena, voff_ht, curr->data, 0); + u64_list_push_node(&unique_entries32, curr); + } + + // filter out duplicate 64-bit virtual offsets + for (U64Node *curr = page->entries_addr64->first, *next; curr != 0; curr = next) { + next = curr->next; + if (hash_table_search_u64(voff_ht, curr->data)) { continue; } + hash_table_push_u64_u64(scratch.arena, voff_ht, curr->data, 0); + u64_list_push_node(&unique_entries64, curr); + } + + *page->entries_addr32 = unique_entries32; + *page->entries_addr64 = unique_entries64; + + // purge hash table for the next run + hash_table_purge(voff_ht); + } + + scratch_end(scratch); + ProfEnd(); +} + internal THREAD_POOL_TASK_FUNC(lnk_serialize_base_reloc_pages_task) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - LNK_BaseRelocsTask *task = raw_task; - HashTable *voff_ht = hash_table_init(scratch.arena, task->page_size); - - U64 voffs_max = task->page_size; - U32 *voffs32 = push_array(scratch.arena, U32, voffs_max); - U64 *voffs64 = push_array(scratch.arena, U64, voffs_max); + LNK_BaseRelocsTask *task = raw_task; for EachInRange(page_idx, task->serialize.ranges[task_id]) { LNK_BaseRelocPage *page = &task->serialize.pages.v[page_idx]; - // filter out duplicate 32-bit virtual offsets - U64 voff_count32 = 0; - for EachNode(voff_n, U64Node, page->entries_addr32->first) { - if (hash_table_search_u64(voff_ht, voff_n->data)) { continue; } - hash_table_push_u64_u64(scratch.arena, voff_ht, voff_n->data, 0); - voffs32[voff_count32] = voff_n->data; - voff_count32 += 1; - } - - // filter out duplicate 64-bit virtual offsets - U64 voff_count64 = 0; - for EachNode(voff_n, U64Node, page->entries_addr64->first) { - if (hash_table_search_u64(voff_ht, voff_n->data)) { continue; } - hash_table_push_u64_u64(scratch.arena, voff_ht, voff_n->data, 0); - voffs64[voff_count64] = voff_n->data; - voff_count64 += 1; - } - - // gather step is not deterministic - radsort(voffs32, voff_count32, u32_is_before); - radsort(voffs64, voff_count64, u64_is_before); - // find block bytes in the buffer void *block = task->serialize.buffer + page->buffer_offset; @@ -3685,18 +3700,22 @@ THREAD_POOL_TASK_FUNC(lnk_serialize_base_reloc_pages_task) U16 *reloc_arr_ptr = reloc_arr_base; // write 32-bit relocation entries - for EachIndex(i, voff_count32) { - U64 rel_off = voffs32[i] - page->voff; + U16 *reloc_entries32 = reloc_arr_ptr; + for EachNode(n, U64Node, page->entries_addr32->first) { + U64 rel_off = n->data - page->voff; *reloc_arr_ptr = PE_BaseRelocMake(PE_BaseRelocKind_HIGHLOW, rel_off); reloc_arr_ptr += 1; } + radsort(reloc_entries32, page->entries_addr32->count, u16_is_before); // write 64-bit relocation entries - for EachIndex(i, voff_count64) { - U64 rel_off = voffs64[i] - page->voff; + U16 *reloc_entries64 = reloc_arr_ptr; + for EachNode(n, U64Node, page->entries_addr64->first) { + U64 rel_off = n->data - page->voff; *reloc_arr_ptr = PE_BaseRelocMake(PE_BaseRelocKind_DIR64, rel_off); reloc_arr_ptr += 1; } + radsort(reloc_entries64, page->entries_addr64->count, u16_is_before); // compute block size U64 reloc_arr_size = IntFromPtr(reloc_arr_ptr - reloc_arr_base) * sizeof(reloc_arr_ptr[0]); @@ -3710,9 +3729,6 @@ THREAD_POOL_TASK_FUNC(lnk_serialize_base_reloc_pages_task) // write page header *page_voff_ptr = safe_cast_u32(page->voff); *block_size_ptr = safe_cast_u32(block_size_aligned); - - // purge hash table for the next run - hash_table_purge(voff_ht); } scratch_end(scratch); @@ -3786,6 +3802,10 @@ lnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U6 String8 base_relocs = {0}; { + task.serialize.pages = pages; + task.serialize.ranges = tp_divide_work(scratch.arena, pages.count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_filter_out_duplicate_base_reloc_entries_task, &task); + ProfBegin("Compute Buffer Size"); U64 buffer_size = 0; for EachIndex(page_idx, pages.count) { @@ -3804,8 +3824,6 @@ lnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U6 task.serialize.buffer_size = buffer_size; task.serialize.buffer = buffer; - task.serialize.pages = pages; - task.serialize.ranges = tp_divide_work(scratch.arena, pages.count, tp->worker_count); tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_serialize_base_reloc_pages_task, &task, "Serialize"); base_relocs = str8(task.serialize.buffer, task.serialize.buffer_size); From 0c4009c3286188a9c63d5e359f93db96dd88af66 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 16 Jan 2026 18:53:03 -0800 Subject: [PATCH 125/850] bugfix import member queue detection --- src/linker/lnk.c | 5 ++--- src/linker/lnk_lib.h | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 1b3b14e2..64098309 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1623,9 +1623,8 @@ lnk_link_inputs(TP_Context *tp, member_ref->link_symbol->refs = import_stub->refs; // push import member for import obj generation - LNK_LibMemberFlags member_flags = lib->member_flags[member_ref->member_idx]; - B32 is_first_link = member_flags != (LNK_LibMemberFlag_LinkedRegular | LNK_LibMemberFlag_LinkedImp); - if (is_first_link) { + if (!(lib->member_flags[member_ref->member_idx] & LNK_LibMemberFlag_WasQueued)) { + lib->member_flags[member_ref->member_idx] |= LNK_LibMemberFlag_WasQueued; lnk_lib_member_ref_list_push_node(&link->imports, member_ref); } } break; diff --git a/src/linker/lnk_lib.h b/src/linker/lnk_lib.h index adaf0487..4f1fdde0 100644 --- a/src/linker/lnk_lib.h +++ b/src/linker/lnk_lib.h @@ -8,6 +8,7 @@ enum { LNK_LibMemberFlag_LinkedRegular = (1 << 0), LNK_LibMemberFlag_LinkedImp = (1 << 1), + LNK_LibMemberFlag_WasQueued = (1 << 2), }; typedef struct LNK_Lib From a51d3fb752962fa7f10163f65c5bda1cbfd72838 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 20 Jan 2026 14:47:01 -0800 Subject: [PATCH 126/850] fix case where return local without a type was converted to a parameter --- src/rdi_from_pdb/rdi_from_pdb.c | 178 +++++++++++++++++--------------- 1 file changed, 93 insertions(+), 85 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 99742013..1d468d6e 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3437,6 +3437,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) B32 defrange_target_is_param = 0; U64 procedure_num = 0; U64 procedure_base_voff = 0; + U64 regrel_idx = 0; + RDIM_Symbol *curr_proc_symbol = 0; CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges + sym_rec_range.min; CV_RecRange *rec_ranges_opl = sym->sym_ranges.ranges + sym_rec_range.max; typedef struct P2R_ScopeNode P2R_ScopeNode; @@ -3675,17 +3677,17 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: build procedure symbol if(params->subset_flags & (RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_ProcedureNameMap)) { - RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); - procedure_symbol->is_extern = (kind == CV_SymKind_GPROC32); - procedure_symbol->name = name; - procedure_symbol->link_name = link_name; - procedure_symbol->type = type; - procedure_symbol->container_symbol = container_symbol; - procedure_symbol->container_type = container_type; - procedure_symbol->root_scope = procedure_root_scope; + curr_proc_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); + curr_proc_symbol->is_extern = (kind == CV_SymKind_GPROC32); + curr_proc_symbol->name = name; + curr_proc_symbol->link_name = link_name; + curr_proc_symbol->type = type; + curr_proc_symbol->container_symbol = container_symbol; + curr_proc_symbol->container_type = container_type; + curr_proc_symbol->root_scope = procedure_root_scope; if(procedure_root_scope != 0) { - procedure_root_scope->symbol = procedure_symbol; + procedure_root_scope->symbol = curr_proc_symbol; } } @@ -3701,98 +3703,104 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: increment procedure counter procedure_num += 1; + + // reset S_REGREL32 index + regrel_idx = 0; }break; //- rjf: REGREL32 case CV_SymKind_REGREL32: - if(params->subset_flags & RDIM_SubsetFlag_Locals) { - // TODO(rjf): apparently some of the information here may end up being - // redundant with "better" information from CV_SymKind_LOCAL record. - // we don't currently handle this, but if those cases arise then it - // will obviously be better to prefer the better information from both - // records. - - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) + if(params->subset_flags & RDIM_SubsetFlag_Locals) { - break; - } - - // rjf: unpack sym - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); - RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); - CV_Reg cv_reg = regrel32->reg; - U32 var_off = regrel32->reg_off; - - // rjf: determine if this is a parameter - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - { - B32 is_stack_reg = 0; - switch(arch) + // TODO(rjf): apparently some of the information here may end up being + // redundant with "better" information from CV_SymKind_LOCAL record. + // we don't currently handle this, but if those cases arise then it + // will obviously be better to prefer the better information from both + // records. + + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) { - default:{}break; - case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP || cv_reg == CV_Regx64_RBP);}break; + break; } - if(is_stack_reg) - { - U32 frame_size = 0xFFFFFFFF; - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num <= procedure_frameprocs_count) - { - CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; - frame_size = frameproc->frame_size; - } - if(var_off > frame_size) - { - local_kind = RDI_LocalKind_Parameter; - } - } - } - - // TODO(rjf): is this correct? - // rjf: redirect type, if 0, and if outside frame, to the return type of the - // containing procedure - if(local_kind == RDI_LocalKind_Parameter && regrel32->itype == 0 && - top_scope_node->scope->symbol != 0 && - top_scope_node->scope->symbol->type != 0) - { - type = top_scope_node->scope->symbol->type->direct_type; - } - - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; - - // rjf: add location info to local - if(type != 0) - { + + // rjf: unpack sym + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; + String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); + RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); + CV_Reg cv_reg = regrel32->reg; + U32 var_off = regrel32->reg_off; + + // rjf: determine if this is a parameter + RDI_LocalKind local_kind = regrel_idx < curr_proc_symbol->type->count ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable; + // rjf: determine if we need an extra indirection to the value B32 extra_indirection_to_value = 0; - switch(arch) + if(type != 0) { - case RDI_Arch_X64: + switch(arch) { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); - }break; + case RDI_Arch_X64: + { + extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); + }break; + } + } + + // If the return local does not fit in a register MSVC does not assign it a type. + // So we infer the return type from the signature. + // + // rjf: redirect type, if 0, and if outside frame, to the return type of the + // containing procedure + { + B32 is_stack_reg = 0; + switch(arch) + { + default:{}break; + case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP || cv_reg == CV_Regx64_RBP);}break; + } + if(is_stack_reg) + { + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num <= procedure_frameprocs_count) + { + CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; + if(var_off > frameproc->frame_size && regrel32->itype == 0 && + top_scope_node->scope->symbol != 0 && + top_scope_node->scope->symbol->type != 0) + { + type = top_scope_node->scope->symbol->type->direct_type; + extra_indirection_to_value = 1; + } + } + } } - // rjf: get raddbg register code - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - // TODO(rjf): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope); + local->kind = local_kind; + local->name = name; + local->type = type; - // rjf: build location - RDIM_LocationInfo loc_info = p2r_location_info_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RDIM_Location *loc2 = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_local_push_location_case(arena, sym_scopes, local, loc2, voff_range); + // rjf: add location info to local + { + // rjf: get raddbg register code + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + // TODO(rjf): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // rjf: build location + RDIM_LocationInfo loc_info = p2r_location_info_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Location *loc2 = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_local_push_location_case(arena, sym_scopes, local, loc2, voff_range); + } } + + regrel_idx += 1; }break; //- rjf: LTHREAD32/GTHREAD32 From d1b055c62f47b4b64449a6130efd17896db4feff Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 20 Jan 2026 14:30:11 -0800 Subject: [PATCH 127/850] Ignore S_REGREL32 during conversion of optimized procedures. In optimized builds, MSVC emits parameters as both S_LOCAL and S_REGREL32. Most likely because their debugger relies on S_REGREL32 to format parameters in the call stack window. --- src/rdi_from_pdb/rdi_from_pdb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 1d468d6e..bd800cff 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3437,6 +3437,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) B32 defrange_target_is_param = 0; U64 procedure_num = 0; U64 procedure_base_voff = 0; + CV_ProcFlags proc_flags = 0; U64 regrel_idx = 0; RDIM_Symbol *curr_proc_symbol = 0; CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges + sym_rec_range.min; @@ -3706,12 +3707,14 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // reset S_REGREL32 index regrel_idx = 0; + + proc_flags = proc32->flags; }break; //- rjf: REGREL32 case CV_SymKind_REGREL32: { - if(params->subset_flags & RDIM_SubsetFlag_Locals) + if(params->subset_flags & RDIM_SubsetFlag_Locals && !(proc_flags & CV_ProcFlag_OptDbgInfo)) { // TODO(rjf): apparently some of the information here may end up being // redundant with "better" information from CV_SymKind_LOCAL record. From 1c0e9030fade8a57600ead71f911cff45c50dfdf Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 20 Jan 2026 15:27:31 -0800 Subject: [PATCH 128/850] move lib member queue state to the link step and release it after link step is done --- src/linker/hash_table.h | 1 + src/linker/lnk.c | 101 +++++++++++++++++++++++++++++++--------- src/linker/lnk.h | 31 ++++++++++-- src/linker/lnk_lib.c | 39 ---------------- src/linker/lnk_lib.h | 12 ----- 5 files changed, 107 insertions(+), 77 deletions(-) diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 3b1d0707..80f0ea30 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -66,6 +66,7 @@ internal BucketNode * hash_table_push_path_raw (Arena *arena, HashTable *ht, internal BucketNode * hash_table_push_path_u64 (Arena *arena, HashTable *ht, String8 path, U64 value); internal BucketNode * hash_table_push_u64_u64 (Arena *arena, HashTable *ht, U64 key, U64 value); internal BucketNode * hash_table_push_u32_u32 (Arena *arena, HashTable *ht, U32 key, U32 value); +internal BucketNode * hash_table_push_raw_raw (Arena *arena, HashTable *ht, void *key, void *value); internal BucketNode * hash_table_search_string (HashTable *ht, String8 key); internal BucketNode * hash_table_search_u32 (HashTable *ht, U32 key); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 64098309..2f8c472d 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1196,13 +1196,13 @@ lnk_lib_member_ref_list_concat_in_place_array(LNK_LibMemberRefList *list, LNK_Li SLLConcatInPlaceArray(list, to_concat_arr, count); } +static LNK_LibMemberInfo *g_sort_lib_member_context; + internal int lnk_lib_member_ref_is_before(void *raw_a, void *raw_b) { LNK_LibMemberRef **a = raw_a, **b = raw_b; - LNK_Symbol *a_pull_in_ref = (*a)->lib->member_links[(*a)->member_idx]; - LNK_Symbol *b_pull_in_ref = (*b)->lib->member_links[(*b)->member_idx]; - return lnk_symbol_is_before(a_pull_in_ref, b_pull_in_ref); + return lnk_symbol_is_before(g_sort_lib_member_context[(*a)->member_idx].link, g_sort_lib_member_context[(*b)->member_idx].link); } internal LNK_LibMemberRef ** @@ -1481,9 +1481,40 @@ lnk_load_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer } internal void -lnk_queue_lib_member(Arena *arena, LNK_LibMemberRefList *queued_members, LNK_Symbol *link_symbol, LNK_Lib *lib, U32 member_idx) +lnk_queue_lib_member(Arena *arena, LNK_LibMemberRefList *queued_members, LNK_Symbol *link_symbol, LNK_Lib *lib, LNK_LibMemberInfo *member_infos, U32 member_idx) { - B32 was_linked = lnk_lib_set_link_symbol(lib, member_idx, link_symbol); + // associate link symbol to lib member + for (LNK_Symbol *leader = link_symbol;;) { + LNK_Symbol *slot = ins_atomic_ptr_eval_assign(&member_infos[member_idx].link, 0); + + // update slot symbol if it is empty or link symbol comes before symbol in the slot + if (slot) { + if (lnk_symbol_is_before(slot, leader)) { + leader = slot; + } + } else { + leader = link_symbol; + } + + // try to insert back updated slot symbol + LNK_Symbol *swap = ins_atomic_ptr_eval_cond_assign(&member_infos[member_idx].link, leader, 0); + + // exit if slot symbol was null + if (swap == 0) { + break; + } + } + + B32 was_linked; + if (str8_starts_with(link_symbol->name, str8_lit("__imp_"))) { + U8 member_flags = ins_atomic_u8_or(&member_infos[member_idx].flags, LNK_LibMemberFlag_LinkedImp); + was_linked = !(member_flags & LNK_LibMemberFlag_LinkedImp); + } else { + U8 flag = LNK_LibMemberFlag_LinkedRegular; + U8 member_flags = ins_atomic_u8_or(&member_infos[member_idx].flags, LNK_LibMemberFlag_LinkedRegular); + was_linked = !(member_flags & LNK_LibMemberFlag_LinkedRegular); + } + if (was_linked) { LNK_LibMemberRef *member_ref = push_array(arena, LNK_LibMemberRef, 1); member_ref->lib = lib; @@ -1500,6 +1531,7 @@ THREAD_POOL_TASK_FUNC(lnk_search_lib_task) LNK_Lib *lib = task->lib; LNK_SymbolTable *symtab = task->symtab; B32 search_anti_deps = task->search_anti_deps; + LNK_LibMemberInfo *lib_member_infos = task->lib_member_infos; LNK_LibMemberRefList *member_ref_list = &task->member_ref_lists[task_id]; for EachNode(c, LNK_SymbolHashTrieChunk, symtab->search_chunks[task_id].first) { @@ -1512,14 +1544,14 @@ THREAD_POOL_TASK_FUNC(lnk_search_lib_task) if (symbol_interp == COFF_SymbolValueInterp_Undefined) { U32 member_idx; if (lnk_search_lib(lib, symbol->name, &member_idx)) { - lnk_queue_lib_member(arena, member_ref_list, symbol, lib, member_idx); + lnk_queue_lib_member(arena, member_ref_list, symbol, lib, lib_member_infos, member_idx); } } else if (symbol_interp == COFF_SymbolValueInterp_Weak) { COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(symbol_parsed, symbol_ref.obj->header.is_big_obj); if (weak_ext->characteristics == COFF_WeakExt_SearchLibrary) { U32 member_idx; if (lnk_search_lib(lib, symbol->name, &member_idx)) { - lnk_queue_lib_member(arena, member_ref_list, symbol, lib, member_idx); + lnk_queue_lib_member(arena, member_ref_list, symbol, lib, lib_member_infos, member_idx); } } else if (weak_ext->characteristics == COFF_WeakExt_AntiDependency) { if (search_anti_deps) { @@ -1530,7 +1562,7 @@ THREAD_POOL_TASK_FUNC(lnk_search_lib_task) if (dep_interp == COFF_SymbolValueInterp_Weak) { U32 member_idx; if (lnk_search_lib(lib, symbol_parsed.name, &member_idx)) { - lnk_queue_lib_member(arena, member_ref_list, symbol, lib, member_idx); + lnk_queue_lib_member(arena, member_ref_list, symbol, lib, lib_member_infos, member_idx); } } } @@ -1560,13 +1592,19 @@ lnk_link_inputs(TP_Context *tp, for EachNode(lib_n, LNK_LibNode, link->libs.first) { LNK_Lib *lib = &lib_n->data; + LNK_LibMemberInfo *lib_member_infos = hash_table_search_raw_raw(link->lib_member_infos_ht, lib); + if (lib_member_infos == 0) { + lib_member_infos = push_array(link->arena, LNK_LibMemberInfo, lib->member_count); + hash_table_push_raw_raw(link->arena, link->lib_member_infos_ht, lib, lib_member_infos); + } + ProfBeginV("Search %S", str8_skip_last_slash(lib->path)); do { lnk_load_inputs(tp, arena, config, inputer, symtab, link); // search symbols in lib MemoryZeroTyped(member_ref_lists, tp->worker_count); - tp_for_parallel(tp, arena, tp->worker_count, lnk_search_lib_task, &(LNK_SearchLibTask){ .search_anti_deps = search_anti_deps, .lib = lib, .symtab = symtab, .member_ref_lists = member_ref_lists }); + tp_for_parallel(tp, arena, tp->worker_count, lnk_search_lib_task, &(LNK_SearchLibTask){ .search_anti_deps = search_anti_deps, .lib = lib, .symtab = symtab, .lib_member_infos = lib_member_infos, .member_ref_lists = member_ref_lists }); LNK_LibMemberRefList queued_members = {0}; lnk_lib_member_ref_list_concat_in_place_array(&queued_members, member_ref_lists, tp->worker_count); @@ -1574,6 +1612,7 @@ lnk_link_inputs(TP_Context *tp, // sort library member refs to match the order of their appearance in obj symbol tables LNK_LibMemberRef **member_refs = lnk_array_from_lib_member_list(scratch.arena, queued_members); //qsort(member_refs, queued_members.count, sizeof(member_refs[0]), lnk_lib_member_ref_compar); + g_sort_lib_member_context = lib_member_infos; radsort(member_refs, queued_members.count, lnk_lib_member_ref_is_before); if (queued_members.count) { @@ -1619,18 +1658,21 @@ lnk_link_inputs(TP_Context *tp, // same import symbol must never be queued more than once, if it is, there is a bug in the link set logic AssertAlways(member_ref->link_symbol->refs != import_stub->refs); - // replace the import symbol with a stub, which is later replaced with the real import symbol once import obj is ready + // replace the import symbol with a stub, which is later replaced with the real import symbol once import obj is ready. member_ref->link_symbol->refs = import_stub->refs; // push import member for import obj generation - if (!(lib->member_flags[member_ref->member_idx] & LNK_LibMemberFlag_WasQueued)) { - lib->member_flags[member_ref->member_idx] |= LNK_LibMemberFlag_WasQueued; + if (!(lib_member_infos[member_ref->member_idx].flags & LNK_LibMemberFlag_WasGenQueued)) { + lib_member_infos[member_ref->member_idx].flags |= LNK_LibMemberFlag_WasGenQueued; lnk_lib_member_ref_list_push_node(&link->imports, member_ref); } } break; case COFF_DataType_BigObj: case COFF_DataType_Obj: { if (lib->type == COFF_Archive_Thin) { + Assert(!(lib_member_infos[member_ref->member_idx].flags & LNK_LibMemberFlag_WasGenQueued)); + lib_member_infos[member_ref->member_idx].flags |= LNK_LibMemberFlag_WasGenQueued; + // obj path in thin archive is relative to the directory with lib String8List obj_path_list = {0}; str8_list_push(scratch.arena, &obj_path_list, str8_chop_last_slash(lib->path)); @@ -1696,7 +1738,7 @@ lnk_link_inputs(TP_Context *tp, ProfEnd(); } -internal LNK_Link * +internal LNK_LinkResult lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab) { ProfBeginFunction(); @@ -1706,11 +1748,13 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer // init link context // LNK_Link *link = push_array(arena->v[0], LNK_Link, 1); + link->arena = arena_alloc(); link->last_symbol_input = &link->objs.first; link->last_include = &config->include_symbol_list.first; link->last_default_lib = &config->input_default_lib_list.first; link->last_obj_lib = &config->input_obj_lib_list.first; link->last_cmd_lib = &config->input_list[LNK_Input_Lib].first; + link->lib_member_infos_ht = hash_table_init(link->arena, config->input_list[LNK_Input_Lib].node_count * 2); link->try_to_resolve_entry_point = 1; // input :null_obj @@ -1750,9 +1794,10 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer String8List static_dll_names = {0}; for EachNode(member_ref, LNK_LibMemberRef, link->imports.first) { - LNK_Lib *lib = member_ref->lib; - U64 member_idx = member_ref->member_idx; - LNK_Symbol *link_symbol = lib->member_links[member_idx]; + LNK_Lib *lib = member_ref->lib; + U64 member_idx = member_ref->member_idx; + LNK_LibMemberInfo *member_infos = hash_table_search_raw_raw(link->lib_member_infos_ht, lib); + LNK_Symbol *link_symbol = member_infos[member_idx].link; COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, lib->member_offsets[member_idx]); COFF_DataType member_type = coff_data_type_from_data(member_info.data); @@ -2130,6 +2175,18 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer config->infer_function_pad_min = 0; } + // + // fill out result + // + LNK_LinkResult result = {0}; + result.objs = link->objs; + result.libs = link->libs; + + // + // release link context + // + arena_release(link->arena); + // // log // @@ -2146,7 +2203,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer scratch_end(scratch); ProfEnd(); - return link; + return result; } internal void @@ -4975,12 +5032,12 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) // // Link Image // - LNK_Link *link = lnk_link_image(tp, arena, config, inputer, symtab); + LNK_LinkResult link = lnk_link_image(tp, arena, config, inputer, symtab); - U64 objs_count = link->objs.count; - U64 libs_count = link->libs.count; - LNK_Obj **objs = lnk_array_from_obj_list(scratch.arena, link->objs); - LNK_Lib **libs = lnk_array_from_lib_list(scratch.arena, link->libs); + U64 objs_count = link.objs.count; + U64 libs_count = link.libs.count; + LNK_Obj **objs = lnk_array_from_obj_list(scratch.arena, link.objs); + LNK_Lib **libs = lnk_array_from_lib_list(scratch.arena, link.libs); // // Layout Image diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 4f8f9cbe..d565e023 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -77,8 +77,23 @@ typedef struct LNK_Inputer #define LNK_SECTION_FLAG_LIVE (1 << 0) #define LNK_SECTION_FLAG_DEBUG (1 << 1) +typedef U8 LNK_LibMemberFlags; +enum +{ + LNK_LibMemberFlag_LinkedRegular = (1 << 0), + LNK_LibMemberFlag_LinkedImp = (1 << 1), + LNK_LibMemberFlag_WasGenQueued = (1 << 2), +}; + +typedef struct LNK_LibMemberInfo +{ + LNK_Symbol *link; + LNK_LibMemberFlags flags; +} LNK_LibMemberInfo; + typedef struct LNK_Link { + Arena *arena; LNK_ObjList objs; LNK_LibList libs; LNK_ObjNode **last_symbol_input; @@ -86,10 +101,17 @@ typedef struct LNK_Link String8Node **last_cmd_lib; String8Node **last_default_lib; String8Node **last_obj_lib; + HashTable *lib_member_infos_ht; LNK_LibMemberRefList imports; B32 try_to_resolve_entry_point; } LNK_Link; +typedef struct LNK_LinkResult +{ + LNK_ObjList objs; + LNK_LibList libs; +} LNK_LinkResult; + // -- Image Layout ------------------------------------------------------------ #define LNK_REMOVED_SECTION_NUMBER_32 (U32)-3 @@ -186,6 +208,7 @@ typedef struct LNK_SymbolTable *symtab; LNK_Symbol *import_stub; LNK_Lib *lib; + LNK_LibMemberInfo *lib_member_infos; LNK_LibMemberRefList *member_ref_lists; } LNK_SearchLibTask; @@ -342,10 +365,10 @@ internal void lnk_lib_member_ref_list_concat_in_place_array(LNK_L internal int lnk_lib_member_ref_is_before(void *raw_a, void *raw_b); internal LNK_LibMemberRef ** lnk_array_from_lib_member_list(Arena *arena, LNK_LibMemberRefList list); -internal LNK_ObjNode * lnk_load_objs (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link, U64 *objs_count_out); -internal void lnk_load_libs (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_Link *link); -internal void lnk_link_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link); -internal LNK_Link * lnk_link_image (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab); +internal LNK_ObjNode * lnk_load_objs (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link, U64 *objs_count_out); +internal void lnk_load_libs (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_Link *link); +internal void lnk_link_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link); +internal LNK_LinkResult lnk_link_image (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab); // --- Optimizations ----------------------------------------------------------- diff --git a/src/linker/lnk_lib.c b/src/linker/lnk_lib.c index cd00876a..7f546e88 100644 --- a/src/linker/lnk_lib.c +++ b/src/linker/lnk_lib.c @@ -141,8 +141,6 @@ lnk_lib_from_data(Arena *arena, String8 data, String8 path, U64 input_idx, LNK_L lib_out->symbol_count = Min(symbol_count, symbol_names.count); // TODO: warn about mismatched number of symbol names and symbol count in the header lib_out->member_offsets = member_offsets; lib_out->symbol_indices = symbol_indices; - lib_out->member_links = push_array(arena, LNK_Symbol *, member_count); - lib_out->member_flags = push_array(arena, LNK_LibMemberFlags, member_count); lib_out->symbol_names = symbol_names; lib_out->long_names = parse.long_names; lib_out->input_idx = input_idx; @@ -222,43 +220,6 @@ lnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, U return result; } -internal B32 -lnk_lib_set_link_symbol(LNK_Lib *lib, U32 member_idx, LNK_Symbol *link_symbol) -{ - B32 was_linked; - if (str8_starts_with(link_symbol->name, str8_lit("__imp_"))) { - U8 member_flags = ins_atomic_u8_or(&lib->member_flags[member_idx], LNK_LibMemberFlag_LinkedImp); - was_linked = !!(~member_flags & LNK_LibMemberFlag_LinkedImp); - } else { - U8 flag = LNK_LibMemberFlag_LinkedRegular; - U8 member_flags = ins_atomic_u8_or(&lib->member_flags[member_idx], LNK_LibMemberFlag_LinkedRegular); - was_linked = !!(~member_flags & LNK_LibMemberFlag_LinkedRegular); - } - - for (LNK_Symbol *leader = link_symbol;;) { - LNK_Symbol *slot = ins_atomic_ptr_eval_assign(&lib->member_links[member_idx], 0); - - // update slot symbol if it is empty or link symbol comes before symbol in the slot - if (slot) { - if (lnk_symbol_is_before(slot, leader)) { - leader = slot; - } - } else { - leader = link_symbol; - } - - // try to insert back updated slot symbol - LNK_Symbol *swap = ins_atomic_ptr_eval_cond_assign(&lib->member_links[member_idx], leader, 0); - - // exit if slot symbol was null - if (swap == 0) { - break; - } - } - - return was_linked; -} - internal force_inline B32 lnk_search_lib(LNK_Lib *lib, String8 symbol_name, U32 *member_idx_out) { diff --git a/src/linker/lnk_lib.h b/src/linker/lnk_lib.h index 4f1fdde0..79b682c7 100644 --- a/src/linker/lnk_lib.h +++ b/src/linker/lnk_lib.h @@ -3,14 +3,6 @@ #pragma once -typedef U8 LNK_LibMemberFlags; -enum -{ - LNK_LibMemberFlag_LinkedRegular = (1 << 0), - LNK_LibMemberFlag_LinkedImp = (1 << 1), - LNK_LibMemberFlag_WasQueued = (1 << 2), -}; - typedef struct LNK_Lib { String8 path; @@ -20,8 +12,6 @@ typedef struct LNK_Lib U32 symbol_count; U32 *member_offsets; U16 *symbol_indices; - LNK_Symbol **member_links; - LNK_LibMemberFlags *member_flags; String8Array symbol_names; String8 long_names; U64 input_idx; @@ -76,7 +66,5 @@ internal LNK_Lib ** lnk_array_from_lib_list(Arena *arena, LNK_LibList list internal void lnk_lib_list_push_node(LNK_LibList *list, LNK_LibNode *node); internal LNK_LibNodeArray lnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, U64 inputs_count, struct LNK_Input **inputs); -internal B32 lnk_lib_set_link_symbol(LNK_Lib *lib, U32 member_idx, LNK_Symbol *link_symbol); - internal B32 lnk_search_lib(LNK_Lib *lib, String8 symbol_name, U32 *member_idx_out); From 85df75c30bc3a01ef0460d5e4570ed41c2630755 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 20 Jan 2026 15:27:40 -0800 Subject: [PATCH 129/850] defer import link test --- src/torture/torture.c | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/torture/torture.c b/src/torture/torture.c index ff7d7a22..a6fed823 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -4870,6 +4870,65 @@ exit:; return result; } +internal T_Result +t_defer_impl_link_to_second_search_pass(void) +{ + Temp scratch = scratch_begin(0,0); + T_Result result = T_Result_Fail; + + String8 imp_ref_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xc3 }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("entry"), 0, sect); + coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_foo")); + coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("func")); // force linker to pull obj from the lib + imp_ref_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 impl_ref_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xc3 }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("func"), 0, sect); + coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); // on a second search pass force linker to look up same import + impl_ref_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 impl_ref_lib; + { + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(lib_writer, str8_lit("impl_ref.obj"), impl_ref_obj); + impl_ref_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + coff_lib_writer_release(&lib_writer); + } + + String8 foo_lib; + { + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_import(lib_writer, COFF_MachineType_X64, ~0u, str8_lit("foo.dll"), COFF_ImportBy_Name, str8_lit("foo"), 0, COFF_ImportHeader_Code); + foo_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + coff_lib_writer_release(&lib_writer); + } + + if (!t_write_file(str8_lit("imp_ref.obj"), imp_ref_obj)) { goto exit; } + if (!t_write_file(str8_lit("impl_ref.lib"), impl_ref_lib)) { goto exit; } + if (!t_write_file(str8_lit("foo.lib"), foo_lib)) { goto exit; } + if (!t_write_file(str8_lit("foo2.lib"), foo_lib)) { goto exit; } + + int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe foo.lib foo2.lib imp_ref.obj impl_ref.lib"); + if (linker_exit_code != 0) { goto exit; } + + result = T_Result_Pass; +exit:; + scratch_end(scratch); + return result; +} + internal T_Result t_opt_ref_dangling_section(void) { @@ -5276,6 +5335,7 @@ entry_point(CmdLine *cmdline) T(function_pad_min), T(first_member_header), T(second_member_header), + T(defer_impl_link_to_second_search_pass), // DWARF Expression Tests T(value_in_register), From 4f95819eb040e927cdb6131ccb93aa7975544a12 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 20 Jan 2026 15:33:00 -0800 Subject: [PATCH 130/850] by default linker creates a bind table --- src/torture/torture.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index a6fed823..1695d55a 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -4568,11 +4568,11 @@ t_delay_import(void) if (!str8_match(a_import->name, str8_lit("a.dll"), 0)) { goto exit; } if (a_import->module_handle_voff == 0) { goto exit; } if (a_import->name_table_voff == 0) { goto exit; } - if (a_import->bound_table_voff != 0) { goto exit; } - if (a_import->unload_table_voff != 0) { goto exit; } + if (a_import->bound_table_voff == 0) { goto exit; } + if (a_import->unload_table_voff == 0) { goto exit; } if (a_import->time_stamp != 0) { goto exit; } - if (a_import->bound_table_count != 0) { goto exit; } - if (a_import->unload_table_count != 0) { goto exit; } + if (a_import->bound_table_count != 2) { goto exit; } + if (a_import->unload_table_count != 2) { goto exit; } if (a_import->import_count != 2) { goto exit; } PE_ParsedImport *return_1 = &a_import->imports[0]; @@ -4590,11 +4590,11 @@ t_delay_import(void) if (!str8_match(b_import->name, str8_lit("b.dll"), 0)) { goto exit; } if (b_import->module_handle_voff == 0) { goto exit; } if (b_import->name_table_voff == 0) { goto exit; } - if (b_import->bound_table_voff != 0) { goto exit; } - if (b_import->unload_table_voff != 0) { goto exit; } + if (b_import->bound_table_voff == 0) { goto exit; } + if (b_import->unload_table_voff == 0) { goto exit; } if (b_import->time_stamp != 0) { goto exit; } - if (b_import->bound_table_count != 0) { goto exit; } - if (b_import->unload_table_count != 0) { goto exit; } + if (b_import->bound_table_count != 2) { goto exit; } + if (b_import->unload_table_count != 2) { goto exit; } if (b_import->import_count != 2) { goto exit; } PE_ParsedImport *return_123 = &b_import->imports[0]; From 29a7dfedac78f9ebcb3f37485ae62229d828b87d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 20 Jan 2026 15:35:02 -0800 Subject: [PATCH 131/850] natvis type --- src/natvis/base.natvis | 1 + 1 file changed, 1 insertion(+) diff --git a/src/natvis/base.natvis b/src/natvis/base.natvis index ce938f33..447d3d4c 100644 --- a/src/natvis/base.natvis +++ b/src/natvis/base.natvis @@ -153,6 +153,7 @@ + {{ count={count} first={first} }} count From 7627ccf84eb57885b22cd18499cc0d554933d388 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 22 Jan 2026 13:29:45 -0800 Subject: [PATCH 132/850] move str8 list pop to the base layer --- src/base/base_strings.c | 15 +++++++++++++++ src/base/base_strings.h | 1 + src/linker/base_ext/base_strings.c | 14 -------------- src/linker/base_ext/base_strings.h | 3 --- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 0728bedf..d4943ef1 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1122,6 +1122,21 @@ str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...) return result; } +internal String8Node* +str8_list_pop_front(String8List *list) +{ + String8Node *node = 0; + if(list->node_count) + { + node = list->first; + Assert(list->total_size >= list->first->string.size); + list->node_count -= 1; + list->total_size -= list->first->string.size; + SLLQueuePop(list->first, list->last); + } + return node; +} + internal String8List str8_list_copy(Arena *arena, String8List *list) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 37c7acb2..cc1eda1e 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -267,6 +267,7 @@ internal void str8_list_concat_in_place(String8List *list, String8List * internal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align); internal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...); internal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...); +internal String8Node* str8_list_pop_front(String8List *list); internal String8List str8_list_copy(Arena *arena, String8List *list); #define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero()) diff --git a/src/linker/base_ext/base_strings.c b/src/linker/base_ext/base_strings.c index 232a4f99..7d9510c1 100644 --- a/src/linker/base_ext/base_strings.c +++ b/src/linker/base_ext/base_strings.c @@ -7,20 +7,6 @@ str8_starts_with(String8 string, String8 expected_prefix) return str8_match(str8_prefix(string, expected_prefix.size), expected_prefix, 0); } -internal String8Node * -str8_list_pop_front(String8List *list) -{ - String8Node *node = 0; - if (list->node_count) { - node = list->first; - Assert(list->total_size >= list->first->string.size); - list->node_count -= 1; - list->total_size -= list->first->string.size; - SLLQueuePop(list->first, list->last); - } - return node; -} - internal U64 str8_array_bsearch(String8Array arr, String8 value) { diff --git a/src/linker/base_ext/base_strings.h b/src/linker/base_ext/base_strings.h index c982e700..dc61d504 100644 --- a/src/linker/base_ext/base_strings.h +++ b/src/linker/base_ext/base_strings.h @@ -3,9 +3,6 @@ #pragma once -// TODO: remove -internal String8Node * str8_list_pop_front(String8List *list); - internal B32 str8_starts_with(String8 string, String8 expected_prefix); internal U64 str8_array_bsearch(String8Array arr, String8 value); From 1ecd970f3116fc0bd83680046e498db7336e3610 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 22 Jan 2026 13:30:03 -0800 Subject: [PATCH 133/850] STAP copy functions --- src/stap/stap_parse.c | 19 +++++++++++++++++++ src/stap/stap_parse.h | 7 +++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/stap/stap_parse.c b/src/stap/stap_parse.c index ae9302b0..8bb048de 100644 --- a/src/stap/stap_parse.c +++ b/src/stap/stap_parse.c @@ -436,3 +436,22 @@ stap_read_arg_f(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memor return stap_read_arg(arg, arch, reg_block, memory_read, memory_read_ctx, f_out); } +internal STAP_Arg +stap_arg_copy(STAP_Arg *src) +{ + return *src; +} + +internal STAP_ArgArray +stap_arg_array_copy(Arena *arena, STAP_ArgArray arr) +{ + STAP_ArgArray result = {0}; + result.count = arr.count; + result.v = push_array(arena, STAP_Arg, arr.count); + for EachIndex(arg_idx, arr.count) + { + result.v[arg_idx] = stap_arg_copy(&arr.v[arg_idx]); + } + return result; +} + diff --git a/src/stap/stap_parse.h b/src/stap/stap_parse.h index 43101a36..8d5164ca 100644 --- a/src/stap/stap_parse.h +++ b/src/stap/stap_parse.h @@ -32,7 +32,7 @@ typedef struct STAP_Arg B8 is_alias; } reg; struct { - S64 disp; + S64 disp; struct { U32 reg_code; B8 is_alias; @@ -41,7 +41,7 @@ typedef struct STAP_Arg U32 reg_code; B8 is_alias; } index; - U64 scale; + U64 scale; } memory_ref; }; } STAP_Arg; @@ -78,5 +78,8 @@ internal B32 stap_read_arg_u(STAP_Arg arg, Arch arch, void *reg_block, STAP_Memo internal B32 stap_read_arg_s(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, S64 *s_out); internal B32 stap_read_arg_f(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, F64 *f_out); +internal STAP_Arg stap_arg_copy(STAP_Arg *src); +internal STAP_ArgArray stap_arg_array_copy(Arena *arena, STAP_ArgArray arr); + #endif // STAP_PARSE_H From e907d895c6abf73ee2662860d2b90a7c8eb043c8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 22 Jan 2026 13:30:39 -0800 Subject: [PATCH 134/850] refactored Linux layer to use static types for the entities --- src/ctrl/ctrl_core.c | 14 - src/demon/demon_core.h | 10 +- src/demon/linux/demon_core_linux.c | 2610 +++++++++++++++------------- src/demon/linux/demon_core_linux.h | 435 +++-- 4 files changed, 1685 insertions(+), 1384 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 9477b835..bc8cd65c 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -4400,20 +4400,6 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); } - // copy spoof info - if(do_spoof) - { - run_ctrls->spoof.process = spoof->process; - run_ctrls->spoof.thread = spoof->thread; - run_ctrls->spoof.vaddr = spoof->vaddr; - run_ctrls->spoof.old_ip = spoof_old_ip_value; - run_ctrls->spoof.size = size_of_spoof; - } - else - { - MemoryZeroStruct(&run_ctrls->spoof); - } - // rjf: run for new events ProfScope("run for new events") { diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 8043b98e..53aebfbd 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -156,7 +156,7 @@ typedef struct DMN_ActiveTrap DMN_ActiveTrap; struct DMN_ActiveTrap { DMN_Trap *trap; - String8 swap_bytes; + String8 swap_bytes; DMN_ActiveTrap *next; }; @@ -171,14 +171,6 @@ struct DMN_RunCtrls B8 ignore_previous_exception; B8 run_entities_are_unfrozen; B8 run_entities_are_processes; - struct - { - DMN_Handle process; - DMN_Handle thread; - U64 vaddr; - U64 old_ip; - U64 size; - } spoof; }; //////////////////////////////// diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 544a49d8..e1fa1d63 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -2,43 +2,13 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: Helpers +//~ Includes -internal DMN_LNX_EntityNode * -dmn_lnx_entity_list_push(Arena *arena, DMN_LNX_EntityList *list, DMN_LNX_Entity *v) -{ - DMN_LNX_EntityNode *n = push_array(arena, DMN_LNX_EntityNode, 1); - n->v = v; - SLLQueuePush(list->first, list->last, n); - list->count += 1; - return n; -} +#include +#include +#include -internal void -dmn_lnx_process_launch_list_push_node(DMN_LNX_ProcessLaunchList *list, DMN_LNX_ProcessLaunch *n) -{ - DLLPushBack(list->first, list->last, n); - list->count += 1; -} - -internal DMN_LNX_ProcessLaunch * -dmn_lnx_process_launch_list_push(Arena *arena, DMN_LNX_ProcessLaunchList *list, pid_t pid) -{ - DMN_LNX_ProcessLaunch *n = push_array(arena, DMN_LNX_ProcessLaunch, 1); - n->pid = pid; - dmn_lnx_process_launch_list_push_node(list, n); - return n; -} - -internal void -dmn_lnx_process_launch_list_remove(DMN_LNX_ProcessLaunchList *list, DMN_LNX_ProcessLaunch *n) -{ - Assert(list->count > 0); - DLLRemove(list->first, list->last, n); - list->count -= 1; -} - -//- rjf: file descriptor memory reading/writing helpers +//////////////////////////////// internal U64 dmn_lnx_size_from_fd(int memory_fd, U64 cap) @@ -127,16 +97,10 @@ MACHINE_OP_MEM_READ(dmn_lnx_machine_op_mem_read) internal int dmn_lnx_ptrace_seize(pid_t pid) { - // ensure tracer ops are issued on thread that sizes processes - if(dmn_lnx_state->tracer_tid == 0) { dmn_lnx_state->tracer_tid = gettid(); } - AssertAlways(dmn_lnx_state->tracer_tid == gettid()); - - // TODO: PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE - return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACEFORK | PTRACE_O_TRACECLONE)); + // TODO: PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACEFORK + return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE)); } -//- rjf: pid => info extraction - internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) { @@ -261,11 +225,11 @@ dmn_lnx_ehdr_from_pid(pid_t pid) return exe; } -internal DMN_LNX_ProcessAuxv +internal DMN_LNX_Auxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) { Temp scratch = scratch_begin(0, 0); - DMN_LNX_ProcessAuxv result = {0}; + DMN_LNX_Auxv result = {0}; // rjf: open aux data String8 auxv_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); @@ -298,13 +262,13 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) switch(auxv.a_type) { default:{}break; - case ELF_AuxType_Null: goto brkloop; break; - case ELF_AuxType_Base: result.base = auxv.a_val; break; - case ELF_AuxType_Phnum: result.phnum = auxv.a_val; break; - case ELF_AuxType_Phent: result.phent = auxv.a_val; break; - case ELF_AuxType_Phdr: result.phdr = auxv.a_val; break; - case ELF_AuxType_ExecFn: result.execfn = auxv.a_val; break; - case ELF_AuxType_Pagesz: result.pagesz = auxv.a_val; break; + case ELF_AuxType_Null: goto brkloop; break; + case ELF_AuxType_Base: result.base = auxv.a_val; break; + case ELF_AuxType_Phnum: result.phnum = auxv.a_val; break; + case ELF_AuxType_Phent: result.phent = auxv.a_val; break; + case ELF_AuxType_Phdr: result.phdr = auxv.a_val; break; + case ELF_AuxType_ExecFn: result.execfn = auxv.a_val; break; + case ELF_AuxType_Pagesz: result.pagesz = auxv.a_val; break; } } brkloop:; @@ -315,6 +279,18 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) return result; } +internal DMN_LNX_Thread * +dmn_lnx_thread_from_pid(pid_t tid) +{ + return hash_table_search_u64_raw(dmn_lnx_state->tid_ht, tid); +} + +internal DMN_LNX_Process * +dmn_lnx_process_from_pid(pid_t pid) +{ + return hash_table_search_u64_raw(dmn_lnx_state->pid_ht, pid); +} + internal Rng1U64 dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) { @@ -340,29 +316,6 @@ dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 return result; } -internal U64 -dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) -{ - U64 result = max_U64; - - for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) - { - ELF_Phdr64 phdr = {0}; - if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) - { - Assert(0 && "unable to read a program header"); - } - - if(phdr.p_type == ELF_PType_Dynamic) - { - result = rebase + phdr.p_vaddr; - break; - } - } - - return result; -} - internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr) { @@ -405,6 +358,29 @@ dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, return dynamic_info; } +internal U64 +dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) +{ + U64 result = max_U64; + + for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) + { + ELF_Phdr64 phdr = {0}; + if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) + { + Assert(0 && "unable to read a program header"); + } + + if(phdr.p_type == ELF_PType_Dynamic) + { + result = rebase + phdr.p_vaddr; + break; + } + } + + return result; +} + internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) { @@ -493,9 +469,6 @@ exit:; return rdebug_vaddr; } -//////////////////////////////// -//~ SDT Probes - internal DMN_LNX_ProbeList dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) { @@ -622,22 +595,16 @@ exit:; return probes; } -//////////////////////////////// -//~ STAP - internal STAP_MEMORY_READ(dmn_lnx_stap_memory_read) { - DMN_LNX_Entity *process = raw_ctx; + DMN_LNX_Process *process = raw_ctx; U64 bytes_read = dmn_lnx_read(process->fd, r1u64(addr, addr + read_size), buffer); return bytes_read == read_size; } -//////////////////////////////// -//~ rjf: Entity Functions - internal DMN_LNX_Entity * -dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind) +dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind) { DMN_LNX_Entity *entity = dmn_lnx_state->free_entity; if(entity != 0) @@ -650,189 +617,592 @@ dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind) dmn_lnx_state->entities_count += 1; } U32 gen = entity->gen; - MemoryCopyStruct(entity, dmn_lnx_nil_entity); entity->gen += 1; - if(parent != dmn_lnx_nil_entity) - { - DLLPushBack_NPZ(dmn_lnx_nil_entity, parent->first, parent->last, entity, next, prev); - entity->parent = parent; - } entity->kind = kind; return entity; } +internal DMN_LNX_Process * +dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocesses, B32 is_cow) +{ + Temp scratch = scratch_begin(0, 0); + + DMN_LNX_Process *process = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Process)->process; + process->pid = pid; + process->fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); + process->state = state; + process->debug_subprocesses = debug_subprocesses; + process->is_cow = is_cow; + process->parent_process = parent_process; + + // update pending process tracker + if(state != DMN_LNX_ProcessState_Normal) + { + dmn_lnx_state->process_pending_creation += 1; + } + + // add process to the list + DLLPushBack(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); + dmn_lnx_state->process_count += 1; + + // push pid -> DMN_LNX_Process mapping + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); + + scratch_end(scratch); + return process; +} + +internal DMN_LNX_ProcessCtx * +dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) +{ + DMN_LNX_ProcessCtx *ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + + ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(process->pid); + DMN_LNX_Auxv auxv = dmn_lnx_auxv_from_pid(process->pid, exe_ehdr.e_ident[ELF_Identifier_Class]); + Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); + U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(process->fd, auxv.base, is_rebased); + U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); + U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; + Rng1U64 image_vrange = dmn_lnx_compute_image_vrange(process->fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); + Arena *ctx_arena = arena_alloc(); + + ELF_Class dl_class; + { + ELF_Hdr64 ehdr = {0}; + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &process->fd, auxv.base, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); } + dl_class = ehdr.e_ident[ELF_Identifier_Class]; + } + + // query xsave layout + U64 xcr0 = 0; + U64 xsave_size = 0; + X64_XSaveLayout xsave_layout = {0}; + if(arch == Arch_x64) + { + X64_XSave xsave = {0}; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, process->pid, (void *)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0)) + { + // Linux stores xcr0 bits in fxstate padding, + // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25 + xcr0 = *(U64 *)((U8 *)&xsave + 464); + xsave_size = x64_get_xsave_size(); + xsave_layout = x64_get_xsave_layout(xcr0); + } + else { Assert(0 && "failed to get xstate"); } + } + + // gather probes + DMN_LNX_Probe **known_probes = push_array(ctx_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); + { + Temp scratch = scratch_begin(0, 0); + + String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, process->pid, auxv.base); + int dl_fd = open((char *)dl_path.str, O_RDONLY); + + DMN_LNX_ProbeList probes = {0}; + if(dl_fd >= 0) + { + probes = dmn_lnx_read_probes(ctx_arena, dl_fd, 0, auxv.base); + close(dl_fd); + } + + for EachNode(n, DMN_LNX_ProbeNode, probes.first) + { + DMN_LNX_Probe *p = &n->v; + if(str8_match(p->provider, str8_lit("rtld"), 0)) + { +#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } + DMN_LNX_Probe_XList +#undef X + } + } + + scratch_end(scratch); + } + + ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + ctx->arena = arena_alloc(); + ctx->arch = arch; + ctx->rdebug_vaddr = rdebug_vaddr; + ctx->dl_class = dl_class; + ctx->loaded_modules_ht = hash_table_init(ctx_arena, 0x1000); + ctx->probes = known_probes; + ctx->xcr0 = xcr0; + ctx->xsave_size = Max(xsave_size, sizeof(X64_XSave)); + ctx->xsave_layout = xsave_layout; + + // create main module + DMN_LNX_Module *main_module = dmn_lnx_module_alloc(ctx, process->fd, base_vaddr, auxv.execfn, 1, 1); + + // glibc has a shortcut mapping for the main module + hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, 0, main_module); + + return ctx; +} + +internal DMN_LNX_Thread * +dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid) +{ + void *reg_block; + if(process->ctx->free_reg_blocks.node_count) + { + String8Node *n = str8_list_pop_front(&process->ctx->free_reg_blocks); + reg_block = n->string.str; + str8_list_push_node(&process->ctx->free_reg_block_nodes, n); + } + else + { + U64 reg_block_size = regs_block_size_from_arch(process->ctx->arch); + reg_block = push_array(process->ctx->arena, U8, reg_block_size); + } + + DMN_LNX_Thread *thread = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Thread)->thread; + thread->tid = tid; + thread->state = thread_state; + thread->process = process; + thread->reg_block = reg_block; + if(thread_state == DMN_LNX_ThreadState_Stopped) + { + thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); + } + + // add thread to the list + DLLPushBack(process->first_thread, process->last_thread, thread); + process->thread_count += 1; + + // push tid -> thread mapping + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->tid, thread); + + // update global thread counter + if(thread_state == DMN_LNX_ThreadState_PendingCreation) + { + dmn_lnx_state->threads_pending_creation += 1; + } + + return thread; +} + +internal DMN_LNX_Module * +dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main) +{ + DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, base_vaddr); + if(module) { goto exit; } + + // parse out module's ELF header + ELF_Hdr64 module_ehdr = {0}; + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, base_vaddr, &module_ehdr) != MachineOpResult_Ok) { goto exit; } + + // gather info about module + U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; + U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; + Rng1U64 module_vrange = dmn_lnx_compute_image_vrange(memory_fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); + + // read TLS index and TLS offset + U64 tls_index = max_U64; + U64 tls_offset = max_U64; + if(is_main) + { + tls_index = 1; + tls_offset = 0; + } + else + { + if(dmn_lnx_state->is_tls_detected) + { + Rng1U64 tls_modid_range = r1u64(dmn_lnx_state->tls_modid_desc.offset, dmn_lnx_state->tls_modid_desc.offset + dmn_lnx_state->tls_modid_desc.bit_size / 8); + Rng1U64 tls_offset_range = r1u64(dmn_lnx_state->tls_offset_desc.offset, dmn_lnx_state->tls_offset_desc.offset + dmn_lnx_state->tls_offset_desc.bit_size / 8); + tls_modid_range = shift_1u64(tls_modid_range, base_vaddr); + tls_offset_range = shift_1u64(tls_offset_range, base_vaddr); + if(!dmn_lnx_read(memory_fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } + if(!dmn_lnx_read(memory_fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } + } + } + + module = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; + module->base_vaddr = base_vaddr; + module->name_vaddr = name_vaddr; + module->name_space_id = name_space_id; + module->size = dim_1u64(module_vrange); + module->phvaddr = base_vaddr + module_ehdr.e_phoff; + module->phcount = module_ehdr.e_phnum; + module->phentsize = module_ehdr.e_phentsize; + module->tls_index = tls_index; + module->tls_offset = tls_offset; + module->is_main = is_main; + + // add module to the list + DLLPushBack(ctx->first_module, ctx->last_module, module); + ctx->module_count += 1; + + // push base address -> module mapping + hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, base_vaddr, module); + +exit:; + return module; +} + internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity) { - if(entity->parent != dmn_lnx_nil_entity) - { - DLLRemove_NPZ(dmn_lnx_nil_entity, entity->parent->first, entity->parent->last, entity, next, prev); - entity->parent = dmn_lnx_nil_entity; - } - { - Temp scratch = scratch_begin(0, 0); - for EachNode(t, DMN_LNX_EntityNode, &(DMN_LNX_EntityNode) { .v = entity }) - { - // put children nodes on the task list - for(DMN_LNX_Entity *child = t->v->first; child != dmn_lnx_nil_entity; child = child->next) - { - DMN_LNX_EntityNode *task = push_array(scratch.arena, DMN_LNX_EntityNode, 1); - task->next = t->next; - t->next = task; - task->v = child; - } + U32 gen = entity->gen + 1; + MemoryZeroStruct(entity); + entity->gen = gen; + SLLStackPush(dmn_lnx_state->free_entity, entity); +} - // free entity - U64 gen = t->v->gen + 1; - MemoryZeroStruct(t->v); - t->v->gen = gen; - SLLStackPush(dmn_lnx_state->free_entity, t->v); - } - scratch_end(scratch); +internal void +dmn_lnx_process_release(DMN_LNX_Process *process) +{ + // update global state + AssertAlways(dmn_lnx_state->process_count > 0); + DLLRemove(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); + dmn_lnx_state->process_count -= 1; + + // update pending process tracker + if(process->state != DMN_LNX_ProcessState_Normal) + { + Assert(dmn_lnx_state->process_pending_creation > 0); + dmn_lnx_state->process_pending_creation -= 1; } + + // close memory handle + if(close(process->fd) < 0) { Assert(0 && "failed to close memory descriptor"); } + + // remove pid mapping + hash_table_purge_u64(dmn_lnx_state->pid_ht, process->pid); + + // release the context + if(process->ctx) + { + dmn_lnx_process_ctx_release(process->ctx); + } + + // release process entity + dmn_lnx_entity_release((DMN_LNX_Entity *)process); +} + +internal void +dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *ctx) +{ + Assert(ctx->ref_count > 0); + ctx->ref_count -= 1; + + if(ctx->ref_count == 0) + { + arena_release(ctx->arena); + dmn_lnx_entity_release((DMN_LNX_Entity *)ctx); + } +} + +internal void +dmn_lnx_thread_release(DMN_LNX_Thread *thread) +{ + DMN_LNX_Process *process = thread->process; + + // purge tid mapping + hash_table_purge_u64(dmn_lnx_state->tid_ht, thread->tid); + + // update global thread counter + if(thread->state == DMN_LNX_ThreadState_PendingCreation) + { + AssertAlways(dmn_lnx_state->threads_pending_creation > 0); + dmn_lnx_state->threads_pending_creation -= 1; + } + + // remove thread from the list + Assert(process->thread_count > 0); + DLLRemove(process->first_thread, process->last_thread, thread); + process->thread_count -= 1; + + // push reg block to the free list + String8Node *reg_block_node; + if(process->ctx->free_reg_block_nodes.node_count) + { + reg_block_node = str8_list_pop_front(&process->ctx->free_reg_block_nodes); + } + else + { + reg_block_node = push_array(process->ctx->arena, String8Node, 1); + } + reg_block_node->string = str8(thread->reg_block, 0); + str8_list_push_node(&process->ctx->free_reg_blocks, reg_block_node); + + dmn_lnx_entity_release((DMN_LNX_Entity *)thread); +} + +internal void +dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module) +{ + // remove module from the list + Assert(ctx->module_count > 0); + DLLRemove(ctx->first_module, ctx->last_module, module); + ctx->module_count -= 1; + + // purge base addr -> module mapping + hash_table_purge_u64(ctx->loaded_modules_ht, module->base_vaddr); + + dmn_lnx_entity_release((DMN_LNX_Entity *)module); +} + +internal DMN_LNX_ProcessCtx * +dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) +{ + DMN_LNX_ProcessCtx *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + + result->arena = arena_alloc(); + result->arch = ctx->arch; + result->rdebug_vaddr = ctx->rdebug_vaddr; + result->dl_class = ctx->dl_class; + result->loaded_modules_ht = hash_table_init(result->arena, ctx->loaded_modules_ht->cap); + result->xcr0 = ctx->xcr0; + result->xsave_size = ctx->xsave_size; + result->xsave_layout = ctx->xsave_layout; + + // clone probes + result->probes = push_array(result->arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); + for EachIndex(probe_idx, DMN_LNX_ProbeType_Count) + { + DMN_LNX_Probe *dst = result->probes[probe_idx]; + DMN_LNX_Probe *src = ctx->probes[probe_idx]; + + dst->provider = str8_copy(result->arena, src->provider); + dst->name = str8_copy(result->arena, src->name); + dst->args_string = str8_copy(result->arena, src->args_string); + dst->args = stap_arg_array_copy(result->arena, src->args); + dst->pc = src->pc; + dst->semaphore = src->semaphore; + } + + // clone probe traps + for EachNode(src, DMN_ActiveTrap, ctx->first_probe_trap) + { + DMN_Trap *src_trap = src->trap; + DMN_Trap *dst_trap = push_array(result->arena, DMN_Trap, 1); + dst_trap->process = dmn_lnx_handle_from_process(new_owner); + dst_trap->vaddr = src_trap->vaddr; + dst_trap->id = src_trap->id; + dst_trap->flags = src_trap->flags; + dst_trap->size = src_trap->size; + + DMN_ActiveTrap *dst = push_array(result->arena, DMN_ActiveTrap, 1); + dst->trap = dst_trap; + dst->swap_bytes = str8_copy(result->arena, src->swap_bytes); + + SLLQueuePush(result->first_probe_trap, result->last_probe_trap, dst); + } + + // clone modules + for EachNode(module, DMN_LNX_Module, ctx->first_module) + { + dmn_lnx_module_clone(result, module); + } + + return result; +} + +internal DMN_LNX_Module * +dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module) +{ + DMN_LNX_Module *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; + *result = *module; + result->next = result->prev = 0; + + // clone base addr mapping + hash_table_push_u64_raw(process_ctx->arena, process_ctx->loaded_modules_ht, result->base_vaddr, result); + + // push module to the list + DLLPushBack(process_ctx->first_module, process_ctx->last_module, module); + process_ctx->module_count += 1; + + return result; } internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity) { DMN_Handle handle = {0}; - U64 index = (U64)(entity - dmn_lnx_state->entities_base); - if(index <= 0xffffffffu) + U64 index = IntFromPtr(entity - dmn_lnx_state->entities_base); + if(index <= max_U32) { handle.u32[0] = index; handle.u32[1] = entity->gen; } + else + { + Assert(0 && "failed to make a handle for the entity"); + } return handle; } -internal DMN_LNX_Entity * -dmn_lnx_entity_from_handle(DMN_Handle handle) +internal DMN_Handle +dmn_lnx_handle_from_process(DMN_LNX_Process *process) { - DMN_LNX_Entity *result = dmn_lnx_nil_entity; - U64 index = (U64)handle.u32[0]; - if(index < dmn_lnx_state->entities_count && - dmn_lnx_state->entities_base[index].gen == handle.u32[1]) + return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)process); +} + +internal DMN_Handle +dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx) +{ + return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)process_ctx); +} + +internal DMN_Handle +dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread) +{ + return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)thread); +} + +internal DMN_Handle +dmn_lnx_handle_from_module(DMN_LNX_Module *module) +{ + return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)module); +} + +internal DMN_LNX_Entity * +dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind) +{ + DMN_LNX_Entity *result = 0; + U32 index = handle.u32[0]; + U32 gen = handle.u32[1]; + if(index < dmn_lnx_state->entities_count && dmn_lnx_state->entities_base[index].gen == gen) { - result = &dmn_lnx_state->entities_base[index]; + if(dmn_lnx_state->entities_base[index].kind == expected_kind) + { + result = &dmn_lnx_state->entities_base[index]; + } } return result; } -internal DMN_LNX_Entity * -dmn_lnx_thread_from_pid(pid_t pid) +internal DMN_LNX_Process * +dmn_lnx_process_from_handle(DMN_Handle process_handle) { - DMN_LNX_Entity *thread = hash_table_search_u64_raw(dmn_lnx_state->tid_ht, pid); - if(thread == 0) - { - thread = dmn_lnx_nil_entity; - } - return thread; + return (DMN_LNX_Process *)dmn_lnx_entity_from_handle(process_handle, DMN_LNX_EntityKind_Process); } -internal DMN_LNX_Entity * -dmn_lnx_process_from_pid(pid_t pid) +internal DMN_LNX_ProcessCtx * +dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle) { - DMN_LNX_Entity *process = hash_table_search_u64_raw(dmn_lnx_state->pid_ht, pid); - if(process == 0) - { - process = dmn_lnx_nil_entity; - } - return process; + return (DMN_LNX_ProcessCtx *)dmn_lnx_entity_from_handle(process_ctx_handle, DMN_LNX_EntityKind_ProcessCtx); } -internal U64 -dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread) +internal DMN_LNX_Thread * +dmn_lnx_thread_from_handle(DMN_Handle thread_handle) { - return regs_rip_from_arch_block(thread->arch, thread->reg_block); + return (DMN_LNX_Thread *)dmn_lnx_entity_from_handle(thread_handle, DMN_LNX_EntityKind_Thread); } -internal U64 -dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread) +internal DMN_LNX_Module * +dmn_lnx_module_from_handle(DMN_Handle module_handle) { - return regs_rsp_from_arch_block(thread->arch, thread->reg_block); + return (DMN_LNX_Module *)dmn_lnx_entity_from_handle(module_handle, DMN_LNX_EntityKind_Module); } internal void -dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip) +dmn_lnx_process_trap_probes(DMN_LNX_Process *process) { - regs_arch_block_write_rip(thread->arch, thread->reg_block, ip); + for EachIndex(i, DMN_LNX_ProbeType_Count) + { + if(process->ctx->probes[i] == 0) { continue; } + + DMN_Trap *trap = push_array(process->ctx->arena, DMN_Trap, 1); + trap->process = dmn_lnx_handle_from_process(process); + trap->vaddr = process->ctx->probes[i]->pc; + trap->id = i; + + DMN_ActiveTrap *active_trap = dmn_set_trap(process->ctx->arena, trap); + SLLQueuePush(process->ctx->first_probe_trap, process->ctx->last_probe_trap, active_trap); + + if(BUILD_DEBUG && process->ctx->arch == Arch_x64) + { + Assert(active_trap->swap_bytes.size == 1 && active_trap->swap_bytes.str[0] == 0x90); + } + } +} + +internal void +dmn_lnx_process_untrap_probes(DMN_LNX_Process *process) +{ + NotImplemented; +} + +internal U64 +dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread) +{ + return regs_rip_from_arch_block(thread->process->ctx->arch, thread->reg_block); +} + +internal U64 +dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread) +{ + return regs_rsp_from_arch_block(thread->process->ctx->arch, thread->reg_block); +} + +internal void +dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip) +{ + regs_arch_block_write_rip(thread->process->ctx->arch, thread->reg_block, ip); thread->is_reg_block_dirty = 1; } internal void -dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp) +dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp) { - regs_arch_block_write_rsp(thread->arch, thread->reg_block, sp); + regs_arch_block_write_rsp(thread->process->ctx->arch, thread->reg_block, sp); thread->is_reg_block_dirty = 1; } internal B32 -dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) +dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) { - AssertAlways(dmn_lnx_state->tracer_tid == gettid()); - AssertAlways(thread->thread_state == DMN_LNX_ThreadState_Stopped); + AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - B32 result = 0; - switch(thread->arch) + B32 is_reg_block_read = 0; + + switch(thread->process->ctx->arch) { - case Arch_Null: - case Arch_COUNT:{}break; - case Arch_x86: - case Arch_arm64: - case Arch_arm32: - {NotImplemented;}break; - - //////////////////////////// - //- rjf: [x64] - // + case Arch_Null: {} break; case Arch_x64: { - DMN_LNX_Entity *process = thread->parent; - pid_t tid = (pid_t)thread->id; - REGS_RegBlockX64 *dst = thread->reg_block; + DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; + REGS_RegBlockX64 *dst = thread->reg_block; - //- rjf: read GPR - B32 got_gpr = 0; + // general purpose registers { OS_LNX_GprsX64 src; - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(src), .iov_base = &src })); - if(ptrace_result >= 0) - { - got_gpr = 1; - dst->r15.u64 = src.r15; - dst->r14.u64 = src.r14; - dst->r13.u64 = src.r13; - dst->r12.u64 = src.r12; - dst->rbp.u64 = src.rbp; - dst->rbx.u64 = src.rbx; - dst->r11.u64 = src.r11; - dst->r10.u64 = src.r10; - dst->r9.u64 = src.r9; - dst->r8.u64 = src.r8; - dst->rax.u64 = src.rax; - dst->rcx.u64 = src.rcx; - dst->rdx.u64 = src.rdx; - dst->rsi.u64 = src.rsi; - dst->rdi.u64 = src.rdi; - dst->rip.u64 = src.rip; - dst->cs.u16 = src.cs; - dst->rflags.u64 = src.rflags; - dst->rsp.u64 = src.rsp; - dst->ss.u16 = src.ss; - dst->fsbase.u64 = src.fsbase; - dst->gsbase.u64 = src.gsbase; - dst->ds.u16 = src.ds; - dst->es.u16 = src.es; - dst->fs.u16 = src.fs; - dst->gs.u16 = src.gs; - thread->orig_rax = src.orig_rax; - } - else { Assert(0 && "failed to get gprs"); } + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(src), .iov_base = &src })); + if(ptrace_result < 0) { goto exit; } + + dst->r15.u64 = src.r15; + dst->r14.u64 = src.r14; + dst->r13.u64 = src.r13; + dst->r12.u64 = src.r12; + dst->rbp.u64 = src.rbp; + dst->rbx.u64 = src.rbx; + dst->r11.u64 = src.r11; + dst->r10.u64 = src.r10; + dst->r9.u64 = src.r9; + dst->r8.u64 = src.r8; + dst->rax.u64 = src.rax; + dst->rcx.u64 = src.rcx; + dst->rdx.u64 = src.rdx; + dst->rsi.u64 = src.rsi; + dst->rdi.u64 = src.rdi; + dst->rip.u64 = src.rip; + dst->cs.u16 = src.cs; + dst->rflags.u64 = src.rflags; + dst->rsp.u64 = src.rsp; + dst->ss.u16 = src.ss; + dst->fsbase.u64 = src.fsbase; + dst->gsbase.u64 = src.gsbase; + dst->ds.u16 = src.ds; + dst->es.u16 = src.es; + dst->fs.u16 = src.fs; + dst->gs.u16 = src.gs; + thread->orig_rax = src.orig_rax; } - //- rjf: read FPR - B32 got_fpr = 0; - if(got_gpr) + // xsave { Temp scratch = scratch_begin(0, 0); @@ -842,26 +1212,22 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) // get xsave if(x64_is_xsave_supported()) { - void *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process->xsave_size, .iov_base = xsave_raw })); - if(ptrace_result != -1) - { - xsave = xsave_raw; - fxsave = &xsave->fxsave; - } - else { Assert(0 && "failed to get xsave"); } + void *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process_ctx->xsave_size, .iov_base = xsave_raw })); + if(ptrace_result < 0) { goto exit; } + + xsave = xsave_raw; + fxsave = &xsave->fxsave; } // get fxsave - if (fxsave == 0) + if(fxsave == 0) { fxsave = push_array(scratch.arena, X64_FXSave, 1); - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave })); - if(ptrace_result != -1) - { - fxsave = 0; - } - else { Assert(0 && "failed to get fxsave"); } + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave })); + if(ptrace_result < 0) { goto exit; } + + fxsave = 0; } // copy fxsave registers @@ -902,8 +1268,8 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) if(xsave->header.xstate_bv & X64_XStateComponentFlag_AVX) { - AssertAlways(process->xsave_layout.avx_offset + 16*sizeof(REGS_Reg128) <= process->xsave_size); - REGS_Reg128 *avx_s = (REGS_Reg128 *)((U8 *)xsave + process->xsave_layout.avx_offset); + AssertAlways(process_ctx->xsave_layout.avx_offset + 16*sizeof(REGS_Reg128) <= process_ctx->xsave_size); + REGS_Reg128 *avx_s = (REGS_Reg128 *)((U8 *)xsave + process_ctx->xsave_layout.avx_offset); REGS_Reg512 *zmm_d = &dst->zmm0; for EachIndex(n, 16) { @@ -913,8 +1279,8 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) if(xsave->header.xstate_bv & X64_XStateComponentFlag_OPMASK) { - AssertAlways(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size); - REGS_Reg64 *kmask_s = (REGS_Reg64 *)((U8 *)xsave + process->xsave_layout.opmask_offset); + AssertAlways(process_ctx->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process_ctx->xsave_size); + REGS_Reg64 *kmask_s = (REGS_Reg64 *)((U8 *)xsave + process_ctx->xsave_layout.opmask_offset); REGS_Reg64 *kmask_d = &dst->k0; for EachIndex(n, 8) { @@ -924,8 +1290,8 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM_H) { - AssertAlways(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size); - REGS_Reg256 *avx512h_s = (REGS_Reg256 *)((U8 *)xsave + process->xsave_layout.zmm_h_offset); + AssertAlways(process_ctx->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process_ctx->xsave_size); + REGS_Reg256 *avx512h_s = (REGS_Reg256 *)((U8 *)xsave + process_ctx->xsave_layout.zmm_h_offset); REGS_Reg512 *zmmh_d = &dst->zmm0; for EachIndex(n, 16) { @@ -935,8 +1301,8 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM) { - AssertAlways(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size); - REGS_Reg512 *avx512_s = (REGS_Reg512 *)((U8 *)xsave + process->xsave_layout.zmm_offset); + AssertAlways(process_ctx->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process_ctx->xsave_size); + REGS_Reg512 *avx512_s = (REGS_Reg512 *)((U8 *)xsave + process_ctx->xsave_layout.zmm_offset); REGS_Reg512 *zmm_d = &dst->zmm16; for EachIndex(n, 16) { @@ -946,22 +1312,18 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) if(xsave->header.xstate_bv & X64_XStateComponentFlag_CETU) { - AssertAlways(process->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process->xsave_size); - U64 *cet_u = (U64 *)((U8 *)xsave + process->xsave_layout.cet_u_offset); + AssertAlways(process_ctx->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process_ctx->xsave_size); + U64 *cet_u = (U64 *)((U8 *)xsave + process_ctx->xsave_layout.cet_u_offset); dst->cetmsr.u64 = cet_u[0]; dst->cetssp.u64 = cet_u[1]; } } - got_fpr = (xsave || fxsave); scratch_end(scratch); } - //- rjf: read debug registers - B32 got_debug = 0; - if(got_fpr) + // debug registers { - got_debug = 1; REGS_Reg64 *dr_d = &dst->dr0; for EachIndex(n, 8) { @@ -969,53 +1331,41 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread) { U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); errno = 0; - long peek_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0)); - if(errno == 0) - { - dr_d[n].u64 = (U64)peek_result; - } - else - { - got_debug = 0; - } + long peek_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_PEEKUSER, thread->tid, PtrFromInt(offset), 0)); + if(errno != 0) { goto exit; } + dr_d[n].u64 = peek_result; } } } - - result = got_debug; - }break; + + is_reg_block_read = 1; + } break; + case Arch_x86: + case Arch_arm64: + case Arch_arm32: { NotImplemented; } break; + default: { InvalidPath; } break; } - return result; +exit:; + return is_reg_block_read; } internal B32 -dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) +dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) { - AssertAlways(dmn_lnx_state->tracer_tid == thread->parent->tracer_tid); - AssertAlways(thread->thread_state == DMN_LNX_ThreadState_Stopped); + AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - B32 result = 0; - switch(thread->arch) + B32 is_reg_block_written = 0; + + switch(thread->process->ctx->arch) { - case Arch_Null: - case Arch_COUNT:{}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - - //////////////////////////// - //- rjf: [x64] - // + case Arch_Null: {} break; case Arch_x64: { - DMN_LNX_Entity *process = thread->parent; - pid_t tid = (pid_t)thread->id; - REGS_RegBlockX64 *src = thread->reg_block; + DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; + REGS_RegBlockX64 *src = thread->reg_block; - //- rjf: write GPR - B32 did_gpr = 0; + // general purpose registers { OS_LNX_GprsX64 dst; dst.r15 = src->r15.u64; @@ -1045,17 +1395,14 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) dst.es = src->es.u16; dst.fs = src->fs.u16; dst.gs = src->gs.u16; - did_gpr = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) }) >= 0); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) })); + if(ptrace_result < 0) { goto exit; } } - B32 did_fpr = 0; - if(did_gpr) + // xsave { Temp scratch = scratch_begin(0, 0); - int xsave_result = -1; - int fxsave_result = -1; - X64_FXSave dst_fxsave = {0}; { dst_fxsave.fcw = src->fcw.u16; @@ -1084,17 +1431,17 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) if(x64_is_xsave_supported()) { - U8 *xsave_raw = push_array(scratch.arena, U8, process->xsave_size); + U8 *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); X64_XSave *dst = (X64_XSave *)xsave_raw; dst->fxsave = dst_fxsave; dst->header.xstate_bv |= X64_XStateComponentFlag_FP; dst->header.xstate_bv |= X64_XStateComponentFlag_SSE; - if(process->xsave_layout.avx_offset) + if(process_ctx->xsave_layout.avx_offset) { - if(process->xsave_layout.avx_offset + sizeof(REGS_Reg128) * 16 <= process->xsave_size) + if(process_ctx->xsave_layout.avx_offset + sizeof(REGS_Reg128) * 16 <= process_ctx->xsave_size) { - REGS_Reg128 *avx_d = (REGS_Reg128 *)(xsave_raw + process->xsave_layout.avx_offset); + REGS_Reg128 *avx_d = (REGS_Reg128 *)(xsave_raw + process_ctx->xsave_layout.avx_offset); REGS_Reg512 *zmm_s = &src->zmm0; for EachIndex(n, 16) { @@ -1104,11 +1451,11 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) } } - if(process->xsave_layout.opmask_offset) + if(process_ctx->xsave_layout.opmask_offset) { - if(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size) + if(process_ctx->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process_ctx->xsave_size) { - REGS_Reg64 *kmask_d = (REGS_Reg64 *)(xsave_raw + process->xsave_layout.opmask_offset); + REGS_Reg64 *kmask_d = (REGS_Reg64 *)(xsave_raw + process_ctx->xsave_layout.opmask_offset); REGS_Reg64 *kmask_s = &src->k0; for EachIndex(n, 8) { @@ -1116,14 +1463,14 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) } dst->header.xstate_bv |= X64_XStateComponentFlag_OPMASK; } - else { Assert(0 && "invalid xsave size"); } + else { Assert(0 && "invalid xsave size"); goto exit; } } - if(process->xsave_layout.zmm_h_offset) + if(process_ctx->xsave_layout.zmm_h_offset) { - if(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size) + if(process_ctx->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process_ctx->xsave_size) { - REGS_Reg256 *avx512h_d = (REGS_Reg256 *)(xsave_raw + process->xsave_layout.zmm_h_offset); + REGS_Reg256 *avx512h_d = (REGS_Reg256 *)(xsave_raw + process_ctx->xsave_layout.zmm_h_offset); REGS_Reg512 *zmmh_s = &src->zmm0; for EachIndex(n, 16) { @@ -1131,14 +1478,14 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) } dst->header.xstate_bv |= X64_XStateComponentFlag_ZMM_H; } - else { Assert(0 && "invalid xsave size"); } + else { Assert(0 && "invalid xsave size"); goto exit; } } - if(process->xsave_layout.zmm_offset) + if(process_ctx->xsave_layout.zmm_offset) { - if(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size) + if(process_ctx->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process_ctx->xsave_size) { - REGS_Reg512 *avx512_d = (REGS_Reg512 *)(xsave_raw + process->xsave_layout.zmm_offset); + REGS_Reg512 *avx512_d = (REGS_Reg512 *)(xsave_raw + process_ctx->xsave_layout.zmm_offset); REGS_Reg512 *zmm_s = &src->zmm16; for EachIndex(n, 16) { @@ -1146,46 +1493,32 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) } dst->header.xstate_bv |= X64_XStateComponentFlag_ZMM; } - else { Assert(0 && "invalid xsave size"); } + else { Assert(0 && "invalid xsave size"); goto exit; } } - if(process->xsave_layout.cet_u_offset) + if(process_ctx->xsave_layout.cet_u_offset) { - if(process->xsave_layout.cet_u_offset + sizeof(REGS_Reg64) * 2 <= process->xsave_size) + if(process_ctx->xsave_layout.cet_u_offset + sizeof(REGS_Reg64) * 2 <= process_ctx->xsave_size) { - REGS_Reg64 *cet_u = (REGS_Reg64 *)(xsave_raw + process->xsave_layout.cet_u_offset); + REGS_Reg64 *cet_u = (REGS_Reg64 *)(xsave_raw + process_ctx->xsave_layout.cet_u_offset); cet_u[0] = src->cetmsr; cet_u[1] = src->cetssp; dst->header.xstate_bv |= X64_XStateComponentFlag_CETU; } - else { Assert(0 && "invalid xsave size"); } + else { Assert(0 && "invalid xsave size"); goto exit; } } // xsave Assert(dst->header.xcomp_bv == 0); // must always be zero - xsave_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process->xsave_size })); - Assert(xsave_result >= 0); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process_ctx->xsave_size })); + if(ptrace_result < 0) { goto exit; } } - // fallback to fxsave - if(xsave_result < 0) - { - fxsave_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_base = &dst_fxsave, sizeof(dst_fxsave) })); - Assert(fxsave_result >= 0); - } - - // rjf: good finish requires xsave or fxsave - did_fpr = (xsave_result >= 0 || fxsave_result >= 0); - scratch_end(scratch); } - //- rjf: write debug registers - B32 did_dbg = 0; - if(did_fpr) + // debug registers { - did_dbg = 1; - src->dr7.u64 |= (1 << 10); REGS_Reg64 *dr_s = &src->dr0; @@ -1194,478 +1527,454 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread) if(n != 4 && n != 5) { U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); - int poke_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), (void*)(uintptr_t)dr_s[n].u64)); - if(poke_result < 0) - { - did_dbg = 0; - break; - } + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_POKEUSER, thread->tid, PtrFromInt(offset), (void*)(uintptr_t)dr_s[n].u64)); + if(ptrace_result < 0) { goto exit; } } } } - result = (did_dbg); - }break; + is_reg_block_written = 1; + } break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: { NotImplemented; }break; + default: { InvalidPath; } break; } - return result; + +exit:; + return is_reg_block_written; } internal B32 -dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on) +dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on) { B32 is_flag_set = 0; - switch(thread->arch) + switch(thread->process->ctx->arch) { - case Arch_COUNT: - case Arch_Null: {} break; - case Arch_x64: - { - REGS_RegBlockX64 *reg_block = thread->reg_block; - if(is_on) { reg_block->rflags.u64 |= X64_RFlag_Trap; } - else { reg_block->rflags.u64 &= ~X64_RFlag_Trap; } - thread->is_reg_block_dirty = 1; - is_flag_set = 1; - }break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { - NotImplemented; - }break; + case Arch_Null: {} break; + case Arch_x64: + { + REGS_RegBlockX64 *reg_block = thread->reg_block; + if(is_on) { reg_block->rflags.u64 |= X64_RFlag_Trap; } + else { reg_block->rflags.u64 &= ~X64_RFlag_Trap; } + thread->is_reg_block_dirty = 1; + is_flag_set = 1; + } break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: { NotImplemented; }break; + default: { InvalidPath; } break; } Assert(is_flag_set); return is_flag_set; } -//////////////////////////////// +internal void +dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n) +{ + DLLPushBack(list->first, list->last, n); + list->count += 1; +} + +internal DMN_LNX_ThreadPtrNode * +dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v) +{ + DMN_LNX_ThreadPtrNode *n = push_array(arena, DMN_LNX_ThreadPtrNode, 1); + n->v = v; + dmn_lnx_thread_ptr_list_push_node(list, n); + return n; +} internal void -dmn_lnx_handle_not_attached(Arena *arena, DMN_EventList *events) +dmn_lnx_thread_ptr_list_remove(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n) +{ + DLLRemove(list->first, list->last, n); + list->count -= 1; +} + +internal DMN_LNX_ModulePtrNode * +dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v) +{ + DMN_LNX_ModulePtrNode *n = push_array(arena, DMN_LNX_ModulePtrNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; +} + +internal DMN_LNX_ProcessPtrNode * +dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v) +{ + DMN_LNX_ProcessPtrNode *n = push_array(arena, DMN_LNX_ProcessPtrNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; +} + +internal void +dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +{ + // push create process event + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_lnx_handle_from_process(process); + e->arch = process->ctx->arch; + e->code = process->pid; + e->tls_model = DMN_TlsModel_Gnu; // TODO: use dynamic linker path to figure out correct enum here +} + +internal void +dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_lnx_handle_from_process(process); + e->code = process->main_thread_exit_code; +} + +internal void +dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->arch = thread->process->ctx->arch; + e->code = thread->tid; +} + +internal void +dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->code = exit_code; +} + +internal void +dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module) +{ + // TODO: reporting this module breaks ctrl thread + String8 module_name = dmn_lnx_read_string(arena, thread->process->fd, module->name_vaddr); + if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->module = dmn_lnx_handle_from_module(module); + e->arch = thread->process->ctx->arch; + e->address = module->base_vaddr; + e->size = module->size; + e->string = module_name; + e->elf_phdr_vrange = r1u64(module->phvaddr, module->phvaddr + module->phentsize * module->phcount); + e->elf_phdr_entsize = module->phentsize; + e->tls_index = module->tls_index; + e->tls_offset = module->tls_offset; + } +} + +internal void +dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_lnx_handle_from_process(process); + e->module = dmn_lnx_handle_from_module(module); +} + +internal void +dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_HandshakeComplete; + e->process = dmn_lnx_handle_from_process(process); + e->thread = dmn_lnx_handle_from_thread(process->first_thread); + e->arch = process->ctx->arch; +} + +internal void +dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Breakpoint; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->instruction_pointer = address; +} + +internal void +dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_SingleStep; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); +} + +internal void +dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo) +{ + local_persist B8 is_repeatable[] = + { + 0, // null + 1, // 1 SIGHUP + 1, // 2 SIGINT + 1, // 3 SIGQUIT + 1, // 4 SIGTRAP + 1, // 5 SIGABRT + 1, // 6 SIGIOT + 1, // 7 SIGBUS + 1, // 8 SIGFPE + 1, // 9 SIGKILL + 1, // 10 SIGUSR1 + 1, // 11 SIGSEGV + 1, // 12 SIGUSR2 + 1, // 13 SIGPIPE + 1, // 14 SIGALRM + 1, // 15 SIGTERM + 1, // 16 SIGTKFLT + 0, // 17 SIGCHLD + 0, // 18 SIGCONT + 1, // 19 SIGSTOP + 1, // 20 SIGTSP + 1, // 21 SIGTTIN + 1, // 22 SIGTTOU + 0, // 23 SIGURG + 1, // 24 SIGXCPU + 1, // 25 SIGXFSZ + 1, // 26 SIGVTALRM + 1, // 27 SIGPROF + 0, // 28 SIGWINCH + 1, // 29 SIGIO + 1, // 30 SIGPWR + 1, // 31 SIGSYS + 1, // 32 SIGUNUSED + }; + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + e->signo = signo; + e->exception_repeated = signo < ArrayCount(is_repeatable) ? is_repeatable[signo] : 0; + + if(signo == SIGSEGV) + { + siginfo_t si = {0}; + OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, thread->tid, 0, &si)); + e->address = (U64)si.si_addr; + } +} + +internal void +dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Halt; +} + +internal void +dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Error; e->error_kind = DMN_ErrorKind_NotAttached; } -internal void -dmn_lnx_init_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, DMN_LNX_Entity *thread) +internal DMN_LNX_Thread * +dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid) { - thread->arch = process->arch; - thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch)); - thread->thread_state = DMN_LNX_ThreadState_Stopped; - thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->id, thread); - - if(!thread->is_reg_block_dirty) - { - switch(thread->arch) - { - case Arch_Null: break; - case Arch_x64: thread->thread_local_base = ((REGS_RegBlockX64 *)thread->reg_block)->fsbase.u64; break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: { NotImplemented; } break; - default: { InvalidPath; } break; - } - } - - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->arch = thread->arch; - e->code = thread->id; - - process->thread_count += 1; -} - -internal DMN_LNX_Entity * -dmn_lnx_handle_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, pid_t tid) -{ - DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); - thread->id = tid; - dmn_lnx_init_create_thread(arena, events, process, thread); + DMN_LNX_Thread *thread = dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, tid); + dmn_lnx_push_event_create_thread(arena, events, thread); return thread; } -internal DMN_LNX_Entity * -dmn_lnx_handle_create_process(Arena *arena, DMN_EventList *events, B32 debug_subprocesses, B32 is_rebased, pid_t pid) +internal void +dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code) { - Temp scratch = scratch_begin(&arena, 1); + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Process *process = thread->process; - DMN_LNX_Entity *process = 0; - - ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(pid); - int memory_fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); - DMN_LNX_ProcessAuxv auxv = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]); - Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); - U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base, is_rebased); - U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); - U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; - Rng1U64 image_vrange = dmn_lnx_compute_image_vrange(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); - Arena *process_arena = arena_alloc(); - - ELF_Class dl_class; + // store main thread's exit code + if(thread->tid == thread->process->pid) { - ELF_Hdr64 ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, auxv.base, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); } - dl_class = ehdr.e_ident[ELF_Identifier_Class]; + thread->process->main_thread_exit_code = exit_code; } - // - // query xsave layout - // - U64 xcr0 = 0; - U64 xsave_size = 0; - X64_XSaveLayout xsave_layout = {0}; - if(arch == Arch_x64) + // push exit event + dmn_lnx_push_event_exit_thread(arena, events, thread, exit_code); + + // release entity + dmn_lnx_thread_release(thread); + + // auto exit process on last thread + if(process->thread_count == 0) { - X64_XSave xsave = {0}; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, pid, (void*)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0)) - { - // Linux stores xcr0 bits in fxstate padding, - // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25 - xcr0 = *(U64 *)((U8 *)&xsave + 464); - xsave_size = x64_get_xsave_size(); - xsave_layout = x64_get_xsave_layout(xcr0); - } - else { Assert(0 && "failed to get xstate"); } + dmn_lnx_event_exit_process(arena, events, process->pid); + } +} + +internal DMN_LNX_Process * +dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags) +{ + DMN_LNX_Process *process = dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Normal, parent_process, !!(flags & DMN_LNX_CreateProcessFlag_DebugSubprocesses), !!(flags & DMN_LNX_CreateProcessFlag_Cow)); + + if(flags & DMN_LNX_CreateProcessFlag_ClonedMemory) + { + process->ctx = parent_process->ctx; + } + else + { + process->ctx = dmn_lnx_process_ctx_alloc(process, !!(flags & DMN_LNX_CreateProcessFlag_Rebased)); + } + process->ctx->ref_count += 1; + + // install probes in a process that does not have a cloned memory + if(!(flags & DMN_LNX_CreateProcessFlag_ClonedMemory)) + { + dmn_lnx_process_trap_probes(process); } - // - // gather probes - // - DMN_LNX_Probe **known_probes = push_array(process_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); + // create main thread + dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, pid); + + // push events + dmn_lnx_push_event_create_process(arena, events, process); + for EachNode(thread, DMN_LNX_Thread, process->first_thread) { - String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, pid, auxv.base); - int dl_fd = open((char *)dl_path.str, O_RDONLY); - - DMN_LNX_ProbeList probes = {0}; - if(dl_fd >= 0) - { - probes = dmn_lnx_read_probes(process_arena, dl_fd, 0, auxv.base); - close(dl_fd); - } - - for EachNode(n, DMN_LNX_ProbeNode, probes.first) - { - DMN_LNX_Probe *p = &n->v; - if(str8_match(p->provider, str8_lit("rtld"), 0)) - { -#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } - DMN_LNX_Probe_XList -#undef X - } - } + dmn_lnx_push_event_create_thread(arena, events, thread); } - - // - // init process - // - process = dmn_lnx_entity_alloc(dmn_lnx_state->entities_base, DMN_LNX_EntityKind_Process); - process->id = pid; - process->arch = arch; - process->fd = memory_fd; - process->tracer_tid = gettid(); - process->debug_subprocesses = debug_subprocesses; - process->rdebug_vaddr = rdebug_vaddr; - process->dl_class = dl_class; - process->arena = process_arena; - process->loaded_modules_ht = hash_table_init(process_arena, 0x1000); - process->probes = known_probes; - process->xcr0 = xcr0; - process->xsave_size = Max(xsave_size, sizeof(X64_XSave)); - process->xsave_layout = xsave_layout; - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); - - // trap probes - for EachIndex(i, DMN_LNX_ProbeType_Count) + for EachNode(module, DMN_LNX_Module, process->ctx->first_module) { - if(known_probes[i] == 0) { continue; } - - DMN_Trap *trap = push_array(process_arena, DMN_Trap, 1); - trap->process = dmn_lnx_handle_from_entity(process); - trap->vaddr = known_probes[i]->pc; - trap->id = i; - - DMN_ActiveTrap *active_trap = dmn_set_trap(process_arena, trap); - SLLQueuePush(process->first_probe_trap, process->last_probe_trap, active_trap); - - if(BUILD_DEBUG && arch == Arch_x64) - { - Assert(active_trap->swap_bytes.size == 1 && active_trap->swap_bytes.str[0] == 0x90); - } + dmn_lnx_push_event_load_module(arena, events, process->first_thread, module); } + dmn_lnx_push_event_handshake_complete(arena, events, process); - // push create process event - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_lnx_handle_from_entity(process); - e->arch = process->arch; - e->code = pid; - e->tls_model = DMN_TlsModel_Gnu; // TODO: use dynamic linker path to figure out correct enum here - - // - // init main thread - // - DMN_LNX_Entity *thread = dmn_lnx_handle_create_thread(arena, events, process, pid); - - // - // init main module - // - { - DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); - module->id = auxv.execfn; - module->base_vaddr = base_vaddr; - module->module_name_vaddr = auxv.execfn; - module->is_main = 1; - - hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, 0, module); - hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, base_vaddr, module); - - // push load module event - { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->module = dmn_lnx_handle_from_entity(module); - e->arch = process->arch; - e->address = base_vaddr; - e->size = dim_1u64(image_vrange); - e->string = dmn_lnx_read_string(arena, process->fd, auxv.execfn); - e->elf_phdr_vrange = r1u64(auxv.phdr, auxv.phdr + auxv.phent * auxv.phnum); - e->elf_phdr_entsize = auxv.phent; - e->tls_index = 1; - e->tls_offset = 0; - } - } - - // - // handshake complete - // - { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_HandshakeComplete; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->arch = process->arch; - } - - // - // update global state - // - dmn_lnx_state->active_process_count += 1; - - scratch_end(scratch); return process; } internal void -dmn_lnx_handle_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) +dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) { - DMN_LNX_Entity *process = dmn_lnx_process_from_pid(pid); + DMN_LNX_Process *process = dmn_lnx_process_from_pid(pid); + AssertAlways(process->thread_count == 0); - // rjf: generate unload-module events - for(DMN_LNX_Entity *child = process->first; child != dmn_lnx_nil_entity; child = child->next) + // push module events + for EachNode(module, DMN_LNX_Module, process->ctx->first_module) { - if(child->kind == DMN_LNX_EntityKind_Module) - { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->module = dmn_lnx_handle_from_entity(child); - // TODO(rjf): e->string = ...; - } + dmn_lnx_push_event_unload_module(arena, events, process, module); } - // rjf: generate exit process event - { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_lnx_handle_from_entity(process); - e->code = process->main_thread_exit_code; - } + // push process exit event + dmn_lnx_push_event_exit_process(arena, events, process); - // free process - if(close(process->fd) < 0) { Assert(0 && "failed to close memory descriptor"); } - arena_release(process->arena); - - // rjf: eliminate entity tree - hash_table_purge_u64(dmn_lnx_state->pid_ht, process->id); - dmn_lnx_entity_release(process); - - // - // update global state - // - AssertAlways(dmn_lnx_state->active_process_count > 0); - dmn_lnx_state->active_process_count -= 1; + // release process + dmn_lnx_process_release(process); } internal void -dmn_lnx_handle_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code) +dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr) { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Entity *process = thread->parent; + DMN_LNX_Process *process = thread->process; - // store main thread's exit code - if(thread->id == process->id) - { - process->main_thread_exit_code = exit_code; - } - - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - hash_table_purge_u64(dmn_lnx_state->tid_ht, thread->id); - dmn_lnx_entity_release(thread); - process->thread_count -= 1; - - if(process->thread_count == 0) - { - dmn_lnx_handle_exit_process(arena, events, process->id); - } -} - -internal DMN_LNX_Entity * -dmn_lnx_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 module_name_vaddr, U64 base_vaddr) -{ - DMN_LNX_Entity *module = 0; - - // parse out module's ELF header - ELF_Hdr64 module_ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &process->fd, base_vaddr, &module_ehdr) != MachineOpResult_Ok) { goto exit; } - - // gather info about module - U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; - U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; - Rng1U64 module_vrange = dmn_lnx_compute_image_vrange(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); - String8 module_name = dmn_lnx_read_string(process->arena, process->fd, module_name_vaddr); - - // read TLS index and TLS offset - U64 tls_index = max_U64; - U64 tls_offset = max_U64; - if(dmn_lnx_state->is_tls_detected) - { - Rng1U64 tls_modid_range = r1u64(dmn_lnx_state->tls_modid_desc.offset, dmn_lnx_state->tls_modid_desc.offset + dmn_lnx_state->tls_modid_desc.bit_size / 8); - Rng1U64 tls_offset_range = r1u64(dmn_lnx_state->tls_offset_desc.offset, dmn_lnx_state->tls_offset_desc.offset + dmn_lnx_state->tls_offset_desc.bit_size / 8); - tls_modid_range = shift_1u64(tls_modid_range, base_vaddr); - tls_offset_range = shift_1u64(tls_offset_range, base_vaddr); - if(!dmn_lnx_read(process->fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } - if(!dmn_lnx_read(process->fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } - } - - // fill out module - module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module); - module->id = module_name_vaddr; - module->base_vaddr = base_vaddr; - module->module_name_vaddr = module_name_vaddr; - - if(str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) { goto exit; } - - // push load event - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->module = dmn_lnx_handle_from_entity(module); - e->arch = arch_from_elf_machine(module_ehdr.e_machine); - e->address = base_vaddr; - e->size = dim_1u64(module_vrange); - e->string = module_name; - e->elf_phdr_vrange = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum); - e->elf_phdr_entsize = module_ehdr.e_phentsize; - e->tls_index = tls_index; - e->tls_offset = tls_offset; - - exit:; - return module; -} - -internal void -dmn_lnx_handle_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 new_link_map_vaddr) -{ GNU_LinkMap64 map = {0}; for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) { // read out new link map item - if(gnu_read_link_map(dmn_lnx_machine_op_mem_read, &process->fd, map_vaddr, process->dl_class, &map) != MachineOpResult_Ok) { break; } + if(gnu_read_link_map(dmn_lnx_machine_op_mem_read, &process->fd, map_vaddr, process->ctx->dl_class, &map) != MachineOpResult_Ok) { break; } - // was module with this base already registered? - DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr); - if(module == 0) + // was module already loaded? + DMN_LNX_Module *module = hash_table_search_u64_raw(process->ctx->loaded_modules_ht, map.addr_vaddr); + if(module) { continue; } + + // clone process ctx + if(process->is_cow) { - // load module - module = dmn_lnx_load_module(arena, events, process, name_space_id, map.name_vaddr, map.addr_vaddr); - - // create mapping for base -> module - hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module); + process->is_cow = 0; + process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); } + + // alloc module + module = dmn_lnx_module_alloc(process->ctx, process->fd, map.addr_vaddr, map.name_vaddr, name_space_id, 0); + + // push load module event + dmn_lnx_push_event_load_module(arena, events, thread, module); } } internal void -dmn_lnx_handle_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 rdebug_vaddr) +dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr) { Temp scratch = scratch_begin(&arena, 1); + DMN_LNX_ProcessCtx *ctx = process->ctx; + // flag every module as inactive - for(DMN_LNX_Entity *module = process->first; module != dmn_lnx_nil_entity; module = module->next) + for EachNode(module, DMN_LNX_Module, ctx->first_module) { - if(module->kind != DMN_LNX_EntityKind_Module) { continue; } module->is_live = 0; } // mark live modules - B32 is_64bit = process->dl_class == ELF_Class_64; + B32 is_64bit = ctx->dl_class == ELF_Class_64; GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); - for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { + for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) + { GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_machine_op_mem_read, &process->fd); - for EachNode(link_map_n, GNU_LinkMapNode, link_map_list.first) { - DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, link_map_n->v.addr_vaddr); + for EachNode(link_map_n, GNU_LinkMapNode, link_map_list.first) + { + DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, link_map_n->v.addr_vaddr); module->is_live = 1; } } // collect unloaded modules - DMN_HandleList to_release = {0}; - for(DMN_LNX_Entity *module = process->first; module != dmn_lnx_nil_entity; module = module->next) + DMN_LNX_ModulePtrList to_release = {0}; + for EachNode(module, DMN_LNX_Module, ctx->first_module) { - if(module->kind != DMN_LNX_EntityKind_Module) { continue; } - if(module->is_live) { continue; } - dmn_handle_list_push(scratch.arena, &to_release, dmn_lnx_handle_from_entity(module)); + if(!module->is_live) + { + dmn_lnx_module_ptr_list_push(scratch.arena, &to_release, module); + } } - // push events and clean up internal structures - for EachNode(n, DMN_HandleNode, to_release.first) + // clone process context + if(to_release.count > 0) { - DMN_LNX_Entity *module = dmn_lnx_entity_from_handle(n->v); + if(process->is_cow) + { + process->is_cow = 0; + process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); + } + } - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->module = dmn_lnx_handle_from_entity(module); - e->string = dmn_lnx_read_string(arena, process->fd, module->id); - - hash_table_purge_u64(process->loaded_modules_ht, module->base_vaddr); - - dmn_lnx_entity_release(module); + // push events and clean up unloaded modules + for EachNode(module_n, DMN_LNX_ModulePtrNode, to_release.first) + { + dmn_lnx_push_event_unload_module(arena, events, process, module_n->v); + dmn_lnx_module_release(process->ctx, module_n->v); } scratch_end(scratch); } internal void -dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid) +dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid) { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Entity *process = thread->parent; - U64 ip = dmn_lnx_thread_read_ip(thread); + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Process *process = thread->process; + U64 ip = dmn_lnx_thread_read_ip(thread); // is this user trap? DMN_ActiveTrap *hit_user_trap = 0; { - DMN_Handle process_handle = dmn_lnx_handle_from_entity(process); + DMN_Handle process_handle = dmn_lnx_handle_from_process(process); for EachNode(active_trap, DMN_ActiveTrap, user_traps) { if(MemoryCompare(&active_trap->trap->process, &process_handle, sizeof(DMN_Handle)) == 0) @@ -1679,11 +1988,11 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *u } } - // is this a probe trap? + // is this a probe trap? DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; if(hit_user_trap == 0) { - for EachNode(active_trap, DMN_ActiveTrap, process->first_probe_trap) + for EachNode(active_trap, DMN_ActiveTrap, process->ctx->first_probe_trap) { if(active_trap->trap->vaddr == ip-1) { @@ -1697,16 +2006,16 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *u { B32 is_init_completed = 0; - DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_InitComplete]; + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_InitComplete]; U64 name_space_id = 0, rdebug_addr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto init_complete_exit; } - if(!stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto init_complete_exit; } + if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } GNU_RDebugInfo64 rdebug = {0}; - if(gnu_read_r_debug(dmn_lnx_machine_op_mem_read, &process->fd, rdebug_addr, process->arch, &rdebug) != MachineOpResult_Ok) { goto init_complete_exit; } + if(gnu_read_r_debug(dmn_lnx_machine_op_mem_read, &process->fd, rdebug_addr, process->ctx->arch, &rdebug) != MachineOpResult_Ok) { goto init_complete_exit; } if(rdebug.r_version < 1) { goto init_complete_exit; } - dmn_lnx_handle_load_module(arena, events, process, name_space_id, rdebug.r_map); + dmn_lnx_event_load_module(arena, events, thread, name_space_id, rdebug.r_map); is_init_completed = 1; init_complete_exit:; @@ -1716,12 +2025,12 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *u { B32 is_reloc_completed = 0; - DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_RelocComplete]; + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_RelocComplete]; U64 name_space_id = 0, new_link_map_addr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto reloc_complete_exit; } - if(!stap_read_arg_u(probe->args.v[2], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) { goto reloc_complete_exit; } + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto reloc_complete_exit; } + if(!stap_read_arg_u(probe->args.v[2], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) { goto reloc_complete_exit; } - dmn_lnx_handle_load_module(arena, events, process, name_space_id, new_link_map_addr); + dmn_lnx_event_load_module(arena, events, thread, name_space_id, new_link_map_addr); is_reloc_completed = 1; reloc_complete_exit:; @@ -1731,12 +2040,12 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *u { B32 is_unmap_completed = 0; - DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_UnmapComplete]; + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_UnmapComplete]; U64 name_space_id = 0, rdebug_vaddr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } - if(!stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } + if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } - dmn_lnx_handle_unload_module(arena, events, process, name_space_id, rdebug_vaddr); + dmn_lnx_event_unload_module(arena, events, process, rdebug_vaddr); is_unmap_completed = 1; unmap_complete_exit:; @@ -1754,23 +2063,22 @@ dmn_lnx_handle_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *u DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Breakpoint; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); + e->process = dmn_lnx_handle_from_process(process); + e->thread = dmn_lnx_handle_from_thread(thread); e->instruction_pointer = dmn_lnx_thread_read_ip(thread); } } internal void -dmn_lnx_handle_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) +dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Entity *process = thread->parent; + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); B32 is_valid = 1; U64 address = 0; - switch(thread->arch) + switch(thread->process->ctx->arch) { - case Arch_Null: break; + case Arch_Null: {} break; case Arch_x64: { REGS_RegBlockX64 *regs_x64 = thread->reg_block; @@ -1794,132 +2102,96 @@ dmn_lnx_handle_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) { is_valid = 0; } - }break; + } break; case Arch_x86: case Arch_arm32: case Arch_arm64: - { NotImplemented; }break; + { NotImplemented; } break; default: { InvalidPath; } break; } if(is_valid) { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_Breakpoint; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->instruction_pointer = address; + dmn_lnx_push_event_breakpoint(arena, events, thread, address); } } internal void -dmn_lnx_handle_halt(Arena *arena, DMN_EventList *events) +dmn_lnx_event_halt(Arena *arena, DMN_EventList *events) { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_Halt; + dmn_lnx_push_event_halt(arena, events); } internal void -dmn_lnx_handle_single_step(Arena *arena, DMN_EventList *events, pid_t tid) +dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid) { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Entity *process = thread->parent; + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); // clear single step flag dmn_lnx_set_single_step_flag(thread, 0); - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_SingleStep; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + // push event + dmn_lnx_push_event_single_step(arena, events, thread); } internal void -dmn_lnx_handle_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo) +dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo) { - // TODO(rjf): possible cases: - // SIGABRT - // SIGFPE - // SIGSEGV - // SIGILL - - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Entity *process = thread->parent; + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); thread->pass_through_signal = 1; thread->pass_through_signo = signo; - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_Exception; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); - e->signo = signo; - - if(signo == SIGSEGV) - { - siginfo_t si = {0}; - OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, tid, 0, &si)); - e->address = (U64)si.si_addr; - } + dmn_lnx_push_event_exception(arena, events, thread, signo); } -internal DMN_LNX_Entity * -dmn_lnx_handle_attach(Arena *arena, DMN_EventList *events, pid_t pid) +internal DMN_LNX_Process * +dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) { Temp scratch = scratch_begin(&arena, 1); - DMN_LNX_Entity *process = 0; + // create process + DMN_LNX_Process *process = dmn_lnx_event_create_process(arena, events, pid, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses|DMN_LNX_CreateProcessFlag_Rebased); - String8 task_path = push_str8f(scratch.arena, "/proc/%d/task", pid); - DIR *task_dirp = opendir((char *)task_path.str); - if(task_dirp) + // extract threads from /proc/pid/task { - // create process - process = dmn_lnx_handle_create_process(arena, events, 1, 1, pid); - - // extract threads from /proc/pid/task - for(;;) + String8 task_path = push_str8f(scratch.arena, "/proc/%d/task", pid); + DIR *task_dirp = opendir((char *)task_path.str); + if(task_dirp) { - struct dirent *dirent = readdir(task_dirp); - if(dirent == 0) { break; } + for(;;) + { + struct dirent *dirent = readdir(task_dirp); + if(dirent == 0) { break; } - String8 tid_str = str8_cstring_capped(dirent->d_name, dirent->d_name + NAME_MAX); - if(str8_match(tid_str, str8_lit(".."), 0) || str8_match(tid_str, str8_lit("."), 0)) { continue; } - U64 tid_64 = u64_from_str8(tid_str, 10); - pid_t tid = (pid_t)tid_64; - AssertAlways(tid == tid_64); + String8 tid_str = str8_cstring_capped(dirent->d_name, dirent->d_name + NAME_MAX); + if(str8_match(tid_str, str8_lit(".."), 0) || str8_match(tid_str, str8_lit("."), 0)) { continue; } + U64 tid_64 = u64_from_str8(tid_str, 10); + pid_t tid = (pid_t)tid_64; + AssertAlways(tid == tid_64); - if(tid == pid) { continue; } // main thread was created during create process sequence - dmn_lnx_handle_create_thread(arena, events, process, tid); + if(tid == pid) { continue; } // main thread was created during create process sequence + dmn_lnx_event_create_thread(arena, events, process, tid); + } + + OS_LNX_RETRY_ON_EINTR(closedir(task_dirp)); } + } - // extract modules from r_debug - B32 is_64bit = process->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); + // extract modules from r_debug + { + B32 is_64bit = process->ctx->dl_class == ELF_Class_64; + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->ctx->rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); U64 name_space_id = 0; for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { - dmn_lnx_handle_load_module(arena, events, process, name_space_id, rdebug_n->v.r_map); + dmn_lnx_event_load_module(arena, events, process->first_thread, name_space_id, rdebug_n->v.r_map); name_space_id += 1; } - - OS_LNX_RETRY_ON_EINTR(closedir(task_dirp)); } - // // handshake complete - // - { - DMN_LNX_Entity *main_thread = dmn_lnx_thread_from_pid(pid); - - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_HandshakeComplete; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(main_thread); - e->arch = process->arch; - } + dmn_lnx_push_event_handshake_complete(arena, events, process); scratch_end(scratch); return process; @@ -1931,11 +2203,8 @@ dmn_lnx_handle_attach(Arena *arena, DMN_EventList *events, pid_t pid) internal void dmn_init(void) { - local_persist B32 was_inited; - if(!was_inited) + if(dmn_lnx_state == 0) { - was_inited = 1; - local_persist DMN_LNX_State state; dmn_lnx_state = &state; @@ -1946,7 +2215,7 @@ dmn_init(void) dmn_lnx_state->tid_ht = hash_table_init(dmn_lnx_state->arena, 0x2000); dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); dmn_lnx_state->halter_mutex = mutex_alloc(); - dmn_lnx_entity_alloc(dmn_lnx_nil_entity, DMN_LNX_EntityKind_Root); + dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Null); // find offsets of TLS index and TLS offset in the link_map struct // @@ -2007,9 +2276,9 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) char **argv = push_array(scratch.arena, char *, argc); { U64 idx = 0; - for(String8Node *n = params->cmd_line.first; n != 0; n = n->next, idx += 1) + for EachNode(n, String8Node, params->cmd_line.first) { - argv[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; + argv[idx++] = (char *)push_str8_copy(scratch.arena, n->string).str; } } @@ -2022,9 +2291,9 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) // copy user environment U64 idx = os_lnx_state.default_env_count; - for(String8Node *n = params->env.first; n != 0; n = n->next, idx += 1) + for EachNode(n, String8Node, params->env.first) { - envp[idx] = (char *)push_str8_copy(scratch.arena, n->string).str; + envp[idx++] = (char *)push_str8_copy(scratch.arena, n->string).str; } } @@ -2037,6 +2306,9 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) // child process if(pid == 0) { + // wait for seize + if(OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)) < 0) { goto child_exit; } + // change work directory to tracee if(OS_LNX_RETRY_ON_EINTR(chdir(work_dir_path)) < 0) { goto child_exit; } @@ -2044,30 +2316,18 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) if(OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, envp)) < 0) { goto child_exit; } child_exit:; - abort(); + exit(0); } // parent process else if(pid > 0) { - B32 failed_to_seize = 1; - // try to seize child process - if(dmn_lnx_ptrace_seize(pid) < 0) { goto parent_exit; } - - // alloc pending process node - DMN_LNX_ProcessLaunch *pending_proc = dmn_lnx_state->free_pids.first; - if(pending_proc) { dmn_lnx_process_launch_list_remove(&dmn_lnx_state->free_pids, pending_proc); } - else { pending_proc = push_array(dmn_lnx_state->arena, DMN_LNX_ProcessLaunch, 1); } - - // add pending proc node to the list - *pending_proc = (DMN_LNX_ProcessLaunch){ params->debug_subprocesses, pid, DMN_LNX_ProcessLaunchState_Exec }; - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_procs, pending_proc); - - // tracee was successfully seized - failed_to_seize = 0; - - parent_exit:; - if(failed_to_seize) + if(dmn_lnx_ptrace_seize(pid) >= 0) + { + // tracee was successfully seized, create process + dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Launch, 0, params->debug_subprocesses, 0); + } + else { Assert(0 && "failed to ptrace child process"); OS_LNX_RETRY_ON_EINTR(kill(SIGKILL, pid)); @@ -2084,18 +2344,11 @@ internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) { B32 is_attached = 0; - if(dmn_lnx_ptrace_seize(pid) >= 0) { if(OS_LNX_RETRY_ON_EINTR(kill(pid, SIGSTOP)) >= 0) { - DMN_LNX_ProcessLaunch *pending_proc = dmn_lnx_state->free_pids.first; - if(pending_proc) { dmn_lnx_process_launch_list_remove(&dmn_lnx_state->free_pids, pending_proc); } - else { pending_proc = push_array(dmn_lnx_state->arena, DMN_LNX_ProcessLaunch, 1); } - - *pending_proc = (DMN_LNX_ProcessLaunch){ 1, pid, DMN_LNX_ProcessLaunchState_Attach }; - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->pending_procs, pending_proc); - + dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Attach, 0, 1, 0); is_attached = 1; } else @@ -2103,217 +2356,216 @@ dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, pid, 0, 0)); } } - return is_attached; } internal B32 -dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) +dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process_handle, U32 exit_code) { B32 result = 0; - DMN_LNX_Entity *process_entity = dmn_lnx_entity_from_handle(process); - if(process_entity != dmn_lnx_nil_entity && - OS_LNX_RETRY_ON_EINTR(kill(process_entity->id, SIGKILL)) != -1) + mutex_take(dmn_lnx_state->halter_mutex); + DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + if(process) { - result = 1; + result = OS_LNX_RETRY_ON_EINTR(kill(process->pid, SIGKILL)) >= 0; } + mutex_drop(dmn_lnx_state->halter_mutex); return result; } internal B32 -dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) +dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process_handle) { B32 result = 0; - DMN_LNX_Entity *process_entity = dmn_lnx_entity_from_handle(process); - if(process_entity != dmn_lnx_nil_entity && - OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, process_entity->id, 0, 0)) != -1) + mutex_take(dmn_lnx_state->halter_mutex); + DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + if(process) { - result = 1; + result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, process->pid, 0, 0)) >= 0; } + mutex_drop(dmn_lnx_state->halter_mutex); return result; } internal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { - Assert(gettid() == dmn_lnx_state->tracer_tid); Temp scratch = scratch_begin(&arena, 1); DMN_EventList events = {0}; mutex_take(dmn_lnx_state->halter_mutex); - // write traps to memory - DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; + // wait for signals from the running threads + if(dmn_lnx_state->process_count > 0) { - HashTable *process_ht = hash_table_init(scratch.arena, dmn_lnx_state->active_process_count); - for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) + // write traps to memory + DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; { - for EachIndex(n_idx, n->count) + HashTable *process_ht = hash_table_init(scratch.arena, dmn_lnx_state->process_count); + for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) { - // skip hardware breakpoints - DMN_Trap *trap = n->v+n_idx; - if(trap->flags) { continue; } - - HashTable *active_trap_ht = hash_table_search_u64_raw(process_ht, trap->process.u64[0]); - if(active_trap_ht == 0) + for EachIndex(n_idx, n->count) { - active_trap_ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); - hash_table_push_u64_raw(scratch.arena, process_ht, trap->process.u64[0], active_trap_ht); + // skip hardware breakpoints + DMN_Trap *trap = n->v+n_idx; + if(trap->flags) { continue; } + + HashTable *active_trap_ht = hash_table_search_u64_raw(process_ht, trap->process.u64[0]); + if(active_trap_ht == 0) + { + active_trap_ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); + hash_table_push_u64_raw(scratch.arena, process_ht, trap->process.u64[0], active_trap_ht); + } + + // TODO: ctrl sends down duplicate traps + DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); + if(is_set) { continue; } + + // TODO: ctrl sends down traps for exited process + DMN_LNX_Process *process = dmn_lnx_process_from_handle(trap->process); + if(!process) { continue; } + + // trap instruction + DMN_ActiveTrap *active_trap = dmn_set_trap(scratch.arena, trap); + + // add trap to the active list + SLLQueuePush(active_trap_first, active_trap_last, active_trap); + + // add (address -> trap) + hash_table_push_u64_raw(scratch.arena, active_trap_ht, trap->vaddr, active_trap); } - - // TODO: ctrl sends down duplicate traps - DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); - if(is_set) { continue; } - - // TODO: ctrl sends down traps for exited process - DMN_LNX_Entity *process = dmn_lnx_entity_from_handle(trap->process); - if(process == dmn_lnx_nil_entity) { continue; } - - // trap instruction - DMN_ActiveTrap *active_trap = dmn_set_trap(scratch.arena, trap); - - // add trap to the active list - SLLQueuePush(active_trap_first, active_trap_last, active_trap); - - // add (address -> trap) - hash_table_push_u64_raw(scratch.arena, active_trap_ht, trap->vaddr, active_trap); } } - } - // enable single stepping - if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) - { - DMN_LNX_Entity *single_step_thread = dmn_lnx_entity_from_handle(ctrls->single_step_thread); - dmn_lnx_set_single_step_flag(single_step_thread, 1); - } - - // schedule threads to run - DMN_LNX_EntityList running_threads = {0}; - { - for(DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; process != dmn_lnx_nil_entity; process = process->next) + // enable single stepping + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) { - if(process->kind != DMN_LNX_EntityKind_Process) { continue; } - - //- rjf: determine if this process is frozen - B32 process_is_frozen = 0; - if(ctrls->run_entities_are_processes) + DMN_LNX_Thread *single_step_thread = dmn_lnx_thread_from_handle(ctrls->single_step_thread); + if(single_step_thread) { - for EachIndex(idx, ctrls->run_entity_count) + dmn_lnx_set_single_step_flag(single_step_thread, 1); + } + else + { + Assert(0 && "invalid single_step_thread handle"); + } + } + + // schedule threads to run + DMN_LNX_ThreadPtrList running_threads = {0}; + { + for EachNode(process, DMN_LNX_Process, dmn_lnx_state->first_process) + { + //- rjf: determine if this process is frozen + B32 process_is_frozen = 0; + if(ctrls->run_entities_are_processes) { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(process))) + for EachIndex(idx, ctrls->run_entity_count) { - process_is_frozen = 1; - break; + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_process(process))) + { + process_is_frozen = 1; + break; + } } } - } - if(!process_is_frozen && process->thread_count == 0) - { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, (pid_t)process->id, 0, 0)) < 0) { InvalidPath; } - break; - } - - for(DMN_LNX_Entity *thread = process->first; thread != dmn_lnx_nil_entity; thread = thread->next) - { - if(thread->kind != DMN_LNX_EntityKind_Thread) { continue; } - - //- rjf: determine if this thread is frozen - B32 is_frozen = 0; - - // rjf: not single-stepping? determine based on run controls freezing info - if(dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) + for EachNode(thread, DMN_LNX_Thread, process->first_thread) { - if(ctrls->run_entities_are_processes) + //- rjf: determine if this thread is frozen + B32 is_frozen = 0; + + // rjf: not single-stepping? determine based on run controls freezing info + if(dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) { - is_frozen = process_is_frozen; - } - else - { - for EachIndex(idx, ctrls->run_entity_count) + if(ctrls->run_entities_are_processes) { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(thread))) + is_frozen = process_is_frozen; + } + else + { + for EachIndex(idx, ctrls->run_entity_count) { - is_frozen = 1; - break; + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_thread(thread))) + { + is_frozen = 1; + break; + } } } - } - if(ctrls->run_entities_are_unfrozen) - { - is_frozen ^= 1; - } - } - // rjf: single-step? freeze if not the single-step thread. - else - { - is_frozen = !dmn_handle_match(dmn_lnx_handle_from_entity(thread), ctrls->single_step_thread); - } - - // resume thread - if(!is_frozen) - { - AssertAlways(thread->thread_state == DMN_LNX_ThreadState_Stopped); - - // write registers - if(thread->is_reg_block_dirty) - { - thread->is_reg_block_dirty = !dmn_lnx_thread_write_reg_block(thread); - } - - // pass signal to the child process - void *sig_code = 0; - if(thread->pass_through_signal) - { - thread->pass_through_signal = 0; - if(!ctrls->ignore_previous_exception) + if(ctrls->run_entities_are_unfrozen) { - sig_code = (void *)(uintptr_t)thread->pass_through_signo; + is_frozen ^= 1; } } + // rjf: single-step? freeze if not the single-step thread. + else + { + is_frozen = !dmn_handle_match(dmn_lnx_handle_from_thread(thread), ctrls->single_step_thread); + } // resume thread - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, (pid_t)thread->id, 0, sig_code)) >= 0) + if(!is_frozen) { - thread->thread_state = DMN_LNX_ThreadState_Running; - thread->is_reg_block_dirty = 1; - dmn_lnx_entity_list_push(scratch.arena, &running_threads, thread); - } - else - { - if(errno == ESRCH) + AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); + + // write registers + if(thread->is_reg_block_dirty) { - // Race note: In multithreaded programs, ptrace(PTRACE_CONT) may fail if a running thread calls - // exit_group while we are resuming threads. The kernel begins tearing down the thread group so - // the target might not be in a ptrace-soppped state anymore. Handle this by ignoring, on waitpid - // we will get chance to report exit event. - // - // TODO: unfortunatley, kernel also sends us ESRCH whenever ptrace(PTRACE_CONT) is sent to a tracee - // that is not in a ptace-stop, so how can we tell these errors apart? + thread->is_reg_block_dirty = !dmn_lnx_thread_write_reg_block(thread); + } + + // pass signal to the child process + void *sig_code = 0; + if(thread->pass_through_signal) + { + thread->pass_through_signal = 0; + if(!ctrls->ignore_previous_exception) + { + sig_code = (void *)(uintptr_t)thread->pass_through_signo; + } + } + + // resume thread + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, thread->tid, 0, sig_code)) >= 0) + { + thread->state = DMN_LNX_ThreadState_Running; + thread->is_reg_block_dirty = 1; + dmn_lnx_thread_ptr_list_push(scratch.arena, &running_threads, thread); } else { - InvalidPath; + if(errno == ESRCH) + { + // Race note: In multithreaded programs, ptrace(PTRACE_CONT) may fail if a running thread calls + // exit_group while we are resuming threads. The kernel begins tearing down the thread group so + // the target might not be in a ptrace-soppped state anymore. Handle this by ignoring, on waitpid + // we will get chance to report exit event. + // + // TODO: unfortunatley, kernel also sends us ESRCH whenever ptrace(PTRACE_CONT) is sent to a tracee + // that is not in a ptace-stop, so how can we tell these errors apart? + } + else + { + InvalidPath; + } } } } } } - } - // wait for signals from the running threads - { - B32 is_halt_done = 0; - for(U64 stopped_threads = 0;;) + // hash running threads tids + HashTable *running_threads_ht = hash_table_init(scratch.arena, running_threads.count * 2); + for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) { - // do not wait if there are no pending or active processes - if(dmn_lnx_state->pending_procs.count == 0 && dmn_lnx_state->active_process_count == 0) - { - dmn_lnx_handle_not_attached(arena, &events); - break; - } + hash_table_push_u64_raw(scratch.arena, running_threads_ht, n->v->tid, n); + } + B32 is_halt_done = 0; + DMN_LNX_ThreadPtrList stopped_threads = {0}; + do + { // wait for a signal int status = 0; pid_t wait_id = 0; @@ -2335,97 +2587,115 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) int wstopsig = WSTOPSIG(status); int event_code = (status >> 16); - // intercept signals meant for the process launch sequence + // intercept initing processes { - // pid -> pending process launch - DMN_LNX_ProcessLaunch *pending_proc = 0; - for EachNode(n, DMN_LNX_ProcessLaunch, dmn_lnx_state->pending_procs.first) { if(n->pid == wait_id) { pending_proc = n; break; } } + DMN_LNX_Process *process = dmn_lnx_process_from_pid(wait_id); - if(pending_proc) + if(process && process->state != DMN_LNX_ProcessState_Normal) { - // process unexpectedly exited - if(wifexited) { pending_proc->state = DMN_LNX_ProcessLaunchState_Exit; } - - if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exec) + switch(process->state) { - if(wstopsig == SIGTRAP && event_code == PTRACE_EVENT_EXEC) + case DMN_LNX_ProcessState_Null: + case DMN_LNX_ProcessState_Normal: { - // move pending process node to the free list - dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); + InvalidPath; + } break; + case DMN_LNX_ProcessState_Launch: + { + if(wstopsig == SIGSTOP) + { + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, process->pid, 0, 0)) >= 0) + { + process->state = DMN_LNX_ProcessState_WaitForExec; + goto wait_for_signal; + } + else { Assert(0 && "failed to resume tracee"); } + } + // else { Assert(0 && "unexpected signal"); } + } break; + case DMN_LNX_ProcessState_WaitForExec: + { + if(wstopsig == SIGTRAP && event_code == PTRACE_EVENT_EXEC) + { + DMN_LNX_CreateProcessFlags create_flags = process->debug_subprocesses ? DMN_LNX_CreateProcessFlag_DebugSubprocesses : 0; + dmn_lnx_process_release(process); + dmn_lnx_event_create_process(arena, &events, wait_id, 0, create_flags); + goto wait_for_signal; + } + //else { Assert(0 && "unexpected signal"); } + } break; + case DMN_LNX_ProcessState_ExecFailedDoExit: + { + if(wifexited) + { + dmn_lnx_process_release(process); + goto wait_for_signal; + } + else { Assert(0 && "unexpected signal"); } + } break; + case DMN_LNX_ProcessState_Attach: + { + if(wstopsig == SIGSTOP) + { + DMN_LNX_CreateProcessFlags create_flags = process->debug_subprocesses ? DMN_LNX_CreateProcessFlag_DebugSubprocesses : 0; + dmn_lnx_process_release(process); + dmn_lnx_event_create_process(arena, &events, wait_id, 0, create_flags); + goto wait_for_signal; + } + else { Assert(0 && "unexpected signal"); } + } break; + } - // push create process events - DMN_LNX_Entity *process = dmn_lnx_handle_create_process(arena, &events, pending_proc->debug_subprocesses, 0, wait_id); - - // override event code so the main code path does not create another process - event_code = PTRACE_EVENT_STOP; + // shutdown process + { + if(OS_LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)) >= 0) + { + process->state = DMN_LNX_ProcessState_ExecFailedDoExit; } else { - // shutdown process on abnormal init - OS_LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)); - pending_proc->state = DMN_LNX_ProcessLaunchState_Exit; - continue; + //Assert(0 && "failed to send kill signal to the tracee"); + dmn_lnx_process_release(process); } } - else if(pending_proc->state == DMN_LNX_ProcessLaunchState_Attach) - { - // move pending process node to the free list - dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); - dmn_lnx_handle_attach(arena, &events, wait_id); - - // override event code - event_code = PTRACE_EVENT_STOP; - } - else if(pending_proc->state == DMN_LNX_ProcessLaunchState_Exit) - { - // move pending process node to the free list - dmn_lnx_process_launch_list_remove(&dmn_lnx_state->pending_procs, pending_proc); - dmn_lnx_process_launch_list_push_node(&dmn_lnx_state->free_pids, pending_proc); - continue; - } + wait_for_signal:; + continue; } } if(wifstopped || wifsignaled || wifexited) { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - if(thread->thread_state != DMN_LNX_ThreadState_PendingCreation) + DMN_LNX_ThreadPtrNode *thread_n = hash_table_search_u64_raw(running_threads_ht, wait_id); + if(thread_n) { - // kernel may send multiple stop signals for the same thread, - // so count first stop signal and ignore subsequent signals - B32 is_first_thread_to_stop = 0; - if(thread->thread_state == DMN_LNX_ThreadState_Running) - { - is_first_thread_to_stop = (stopped_threads == 0); - stopped_threads += 1; - } + DMN_LNX_Thread *thread = thread_n->v; + AssertAlways(thread->state == DMN_LNX_ThreadState_Running); + + // remove mapping + hash_table_purge_u64(running_threads_ht, thread->tid); + + // move thread to the stopped list + dmn_lnx_thread_ptr_list_remove(&running_threads, thread_n); + dmn_lnx_thread_ptr_list_push_node(&stopped_threads, thread_n); // update thread state - if(thread != dmn_lnx_nil_entity) + if(wifstopped && !wifsignaled && !wifexited) { - if(wifstopped && !wifsignaled && !wifexited) - { - thread->thread_state = DMN_LNX_ThreadState_Stopped; - } - else if(!wifstopped && (wifsignaled || wifexited)) - { - thread->thread_state = DMN_LNX_ThreadState_Exited; - } - else { InvalidPath; } + thread->state = DMN_LNX_ThreadState_Stopped; } + else if(!wifstopped && (wifsignaled || wifexited)) + { + thread->state = DMN_LNX_ThreadState_Exited; + } + else { InvalidPath; } // stop all other threads - if(is_first_thread_to_stop) + if(stopped_threads.count == 1) { - for EachNode(thread, DMN_LNX_EntityNode, running_threads.first) + for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) { - if(thread->v->thread_state == DMN_LNX_ThreadState_Running) - { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, thread->v->id, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } - } + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, n->v->tid, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } } } } @@ -2434,21 +2704,21 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // normal child exit via _exit or exit() if(wifexited) { - dmn_lnx_handle_exit_thread(arena, &events, wait_id, WEXITSTATUS(status)); + dmn_lnx_event_exit_thread(arena, &events, wait_id, WEXITSTATUS(status)); } // exit because child did not handle a signal else if(wifsignaled) { - dmn_lnx_handle_exit_thread(arena, &events, wait_id, WTERMSIG(status)); + dmn_lnx_event_exit_thread(arena, &events, wait_id, WTERMSIG(status)); } // thread or group stop else if(wifstopped) { // read thread registers { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - if(thread != dmn_lnx_nil_entity && thread->thread_state != DMN_LNX_ThreadState_PendingCreation) + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); + if(thread && thread->state != DMN_LNX_ThreadState_PendingCreation) { thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); Assert(!thread->is_reg_block_dirty); @@ -2467,10 +2737,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { switch(siginfo.si_code) { - case SI_KERNEL: { dmn_lnx_handle_breakpoint(arena, &events, active_trap_first, wait_id); } break; - case TRAP_BRKPT: { dmn_lnx_handle_breakpoint(arena, &events, active_trap_first, wait_id); } break; - case TRAP_TRACE: { dmn_lnx_handle_single_step(arena, &events, wait_id); } break; - case TRAP_HWBKPT: { dmn_lnx_handle_data_breakpoint(arena, &events, wait_id); } break; + case SI_KERNEL: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_BRKPT: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_TRACE: { dmn_lnx_event_single_step(arena, &events, wait_id); } break; + case TRAP_HWBKPT: { dmn_lnx_event_data_breakpoint(arena, &events, wait_id); } break; case TRAP_BRANCH: { NotImplemented; }break; case TRAP_UNK: { NotImplemented; }break; default: { InvalidPath; } break; @@ -2479,122 +2749,50 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case PTRACE_EVENT_FORK: { - // grab child pid - pid_t child_pid; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &child_pid)) < 0) { AssertAlways(0 && "failed to grab child pid"); } - - // grab parent process - DMN_LNX_Entity *parent_thread = dmn_lnx_thread_from_pid(wait_id); - DMN_LNX_Entity *parent_process = parent_thread->parent; - - // clean up in the child process instrumentation inherited during fork - { - DMN_Handle parent_process_handle = dmn_lnx_handle_from_entity(parent_process); - DMN_Handle parent_thread_handle = dmn_lnx_handle_from_entity(parent_thread); - - // at this point kernel cloned memory pages and writes in the child process trigger COW - Temp temp = temp_begin(scratch.arena); - int child_memory_fd = open((char*)str8f(temp.arena, "/proc/%d/mem", child_pid).str, O_RDWR); - - // if debugger is stepping over a line with fork we have to undo the return address spoof - if(MemoryCompare(&parent_process_handle, &ctrls->spoof.process, sizeof(DMN_Handle)) == 0 && - MemoryCompare(&parent_thread_handle, &ctrls->spoof.thread, sizeof(DMN_Handle)) == 0) - { - B32 was_spoof_removed = dmn_lnx_write(child_memory_fd, r1u64(ctrls->spoof.vaddr, ctrls->spoof.vaddr + ctrls->spoof.size), &ctrls->spoof.old_ip); - AssertAlways(was_spoof_removed); - } - - // remove probe traps from the child process - for EachNode(n, DMN_ActiveTrap, parent_process->first_probe_trap) - { - B32 is_written = dmn_lnx_write(child_memory_fd, r1u64(n->trap->vaddr, n->trap->vaddr + n->swap_bytes.size), n->swap_bytes.str); - AssertAlways(is_written); - } - - // remove traps from the child process - for EachNode(n, DMN_ActiveTrap, active_trap_first) - { - if(MemoryCompare(&n->trap->process, &parent_process_handle, sizeof(DMN_Handle)) == 0) - { - B32 is_written = dmn_lnx_write(child_memory_fd, r1u64(n->trap->vaddr, n->trap->vaddr + n->swap_bytes.size), n->swap_bytes.str); - AssertAlways(is_written); - } - } - - close(child_memory_fd); - temp_end(temp); - } - - if(parent_process->debug_subprocesses) - { - // create child process - DMN_LNX_Entity *child_process = dmn_lnx_handle_create_process(arena, &events, 1, 1, child_pid); - - // copy modules from the parent process - for(DMN_LNX_Entity *mod = parent_process->first; mod != dmn_lnx_nil_entity; mod = mod->next) - { - if(mod->kind != DMN_LNX_EntityKind_Module) { continue; } - if(mod->is_main) { continue; } - dmn_lnx_load_module(arena, &events, child_process, mod->name_space_id, mod->module_name_vaddr, mod->base_vaddr); - } - } - else - { - // user asked to detach from the child process - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, child_pid, 0, 0) < 0)) { Assert(0 && "unsuccessful detach"); } - } + NotImplemented; }break; case PTRACE_EVENT_VFORK: { NotImplemented; }break; + case PTRACE_EVENT_VFORK_DONE: + { + NotImplemented; + }break; case PTRACE_EVENT_CLONE: { // kernel stopped the parent just before scheduling the child to // give us a chance to prepare to trace it; next event for the child // will be a PTRACE_EVENT_STOP - pid_t new_pid; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid)) >= 0) + pid_t new_tid; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid)) >= 0) { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - DMN_LNX_Entity *process = thread->parent; + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); // create a new partially inited thread - DMN_LNX_Entity *new_thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread); - new_thread->id = new_pid; - new_thread->thread_state = DMN_LNX_ThreadState_PendingCreation; - - // create mapping from tid -> new thread - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, new_thread->id, new_thread); - - // do not exit the wait loop before new threads are inited - dmn_lnx_state->threads_pending_creation += 1; + dmn_lnx_thread_alloc(thread->process, DMN_LNX_ThreadState_PendingCreation, new_tid); } else { Assert(0 && "failed to get new tid"); } }break; case PTRACE_EVENT_EXEC: { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - DMN_LNX_Entity *process = thread->parent; + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); + DMN_LNX_Process *process = thread->process; if(process->debug_subprocesses) { - dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); - DMN_LNX_Entity *process = dmn_lnx_handle_create_process(arena, &events, 1, 0, wait_id); + dmn_lnx_event_exit_thread(arena, &events, wait_id, 0); + dmn_lnx_event_create_process(arena, &events, wait_id, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses); } else { if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, wait_id, 0, 0)) >= 0) { - dmn_lnx_handle_exit_thread(arena, &events, wait_id, 0); + dmn_lnx_event_exit_thread(arena, &events, wait_id, 0); } else { Assert(0 && "failed to detach"); } } }break; - case PTRACE_EVENT_VFORK_DONE: - { - NotImplemented; - }break; case PTRACE_EVENT_EXIT: { AssertAlways(0 && "exit tracing is disabled, this event should not be delivered"); @@ -2605,19 +2803,16 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case PTRACE_EVENT_STOP: { - DMN_LNX_Entity *thread = dmn_lnx_thread_from_pid(wait_id); - DMN_LNX_Entity *process = thread->parent; - - AssertAlways(thread->thread_state == DMN_LNX_ThreadState_PendingCreation || thread->thread_state == DMN_LNX_ThreadState_Stopped); - - if(thread->thread_state == DMN_LNX_ThreadState_PendingCreation) + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); + if(thread->state == DMN_LNX_ThreadState_PendingCreation) { - // finish thread init - dmn_lnx_init_create_thread(arena, &events, process, thread); - - // update global thread counter - AssertAlways(dmn_lnx_state->threads_pending_creation > 0); - dmn_lnx_state->threads_pending_creation -= 1; + DMN_LNX_Process *process = thread->process; + dmn_lnx_thread_release(thread); + thread = dmn_lnx_event_create_thread(arena, &events, process, wait_id); + } + else + { + AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); } }break; default: { Assert(0 && "unexpected ptrace code"); } break; @@ -2641,23 +2836,17 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } else { - dmn_lnx_handle_exception(arena, &events, wait_id, wstopsig); + dmn_lnx_event_exception(arena, &events, wait_id, wstopsig); } } else { Assert(0 && "unexpected stop code"); } - - // do not wait if all threads are stopped, there are no launching processes, and all threads were created - if(stopped_threads >= running_threads.count && dmn_lnx_state->pending_procs.count == 0 && dmn_lnx_state->threads_pending_creation == 0) - { - break; - } - } + } while(running_threads.count > 0 || dmn_lnx_state->process_pending_creation > 0 || dmn_lnx_state->threads_pending_creation > 0); // finalize halter state if(is_halt_done) { // push event - dmn_lnx_handle_halt(arena, &events); + dmn_lnx_event_halt(arena, &events); // reset state dmn_lnx_state->halter_tid = 0; @@ -2665,21 +2854,26 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) dmn_lnx_state->halt_user_data = 0; dmn_lnx_state->is_halting = 0; } - } - // restore original instruction bytes - for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) - { - // skip process that exited during the wait - DMN_LNX_Entity *process = dmn_lnx_entity_from_handle(active_trap->trap->process); - if(process == dmn_lnx_nil_entity) { continue; } - - if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str)) + // restore original instruction bytes + for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) { - Assert(0 && "failed to restore original instruction bytes"); + // skip process that exited during the wait + DMN_LNX_Process *process = dmn_lnx_process_from_handle(active_trap->trap->process); + if(!process) { continue; } + + if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str)) + { + Assert(0 && "failed to restore original instruction bytes"); + } } } - + + if(events.count == 0 && dmn_lnx_state->process_count == 0) + { + dmn_lnx_push_event_not_attached(arena, &events); + } + mutex_drop(dmn_lnx_state->halter_mutex); scratch_end(scratch); return events; @@ -2692,15 +2886,14 @@ internal void dmn_halt(U64 code, U64 user_data) { mutex_take(dmn_lnx_state->halter_mutex); - if(dmn_lnx_state->active_process_count) + if(dmn_lnx_state->process_count) { dmn_lnx_state->halter_tid = gettid(); dmn_lnx_state->halt_code = code; dmn_lnx_state->halt_user_data = user_data; - for (DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; process != dmn_lnx_nil_entity; process = process->next) + for EachNode(process, DMN_LNX_Process, dmn_lnx_state->first_process) { - if(process->kind != DMN_LNX_EntityKind_Process) { continue; } - if(OS_LNX_RETRY_ON_EINTR(kill(process->id, SIGSTOP)) < 0) { Assert(0 && "failed to send SIGSTOP"); } + if(OS_LNX_RETRY_ON_EINTR(kill(process->pid, SIGSTOP)) < 0) { Assert(0 && "failed to send SIGSTOP"); } } } mutex_drop(dmn_lnx_state->halter_mutex); @@ -2765,78 +2958,93 @@ dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFla } internal U64 -dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) +dmn_process_read(DMN_Handle process_handle, Rng1U64 range, void *dst) { - DMN_LNX_Entity *entity = dmn_lnx_entity_from_handle(process); - U64 result = dmn_lnx_read(entity->fd, range, dst); + DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + U64 result = 0; + if(process) + { + result = dmn_lnx_read(process->fd, range, dst); + } return result; } internal B32 -dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) +dmn_process_write(DMN_Handle process_handle, Rng1U64 range, void *src) { - DMN_LNX_Entity *entity = dmn_lnx_entity_from_handle(process); - B32 result = dmn_lnx_write(entity->fd, range, src); + DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + B32 result = 0; + if(process) + { + result = dmn_lnx_write(process->fd, range, src); + } return result; } //- rjf: threads internal Arch -dmn_arch_from_thread(DMN_Handle handle) +dmn_arch_from_thread(DMN_Handle thread_handle) { - DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); - return thread->arch; + Arch arch = Arch_Null; + DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + if(thread) + { + arch = thread->process->ctx->arch; + } + return arch; } internal U64 -dmn_stack_base_vaddr_from_thread(DMN_Handle handle) +dmn_stack_base_vaddr_from_thread(DMN_Handle thread_handle) { return 0; } internal U64 -dmn_tls_root_vaddr_from_thread(DMN_Handle handle) +dmn_tls_root_vaddr_from_thread(DMN_Handle thread_handle) { U64 tls_root_vaddr = max_U64; DMN_AccessScope { - DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); - switch (thread->arch) + DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + if(thread) { - case Arch_Null: {} break; - case Arch_x64: + switch(thread->process->ctx->arch) { - DMN_LNX_Entity *process = thread->parent; - REGS_RegBlockX64 *reg_block = thread->reg_block; - U64 dtv_pointer = 0; - if(dmn_lnx_read_struct(process->fd, reg_block->fsbase.u64 + 8, &dtv_pointer)) + case Arch_Null: {} break; + case Arch_x64: { - tls_root_vaddr = dtv_pointer; - } - } break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { - NotImplemented; - } break; - default: { InvalidPath; } break; + REGS_RegBlockX64 *reg_block = thread->reg_block; + U64 dtv_pointer = 0; + if(dmn_lnx_read_struct(thread->process->fd, reg_block->fsbase.u64 + 8, &dtv_pointer)) + { + tls_root_vaddr = dtv_pointer; + } + } break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: + { + NotImplemented; + } break; + default: { InvalidPath; } break; + } } } return tls_root_vaddr; } internal B32 -dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) +dmn_thread_read_reg_block(DMN_Handle thread_handle, void *reg_block) { B32 result = 0; DMN_AccessScope { - DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); - if(thread != dmn_lnx_nil_entity) + DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + if(thread) { - U64 reg_block_size = regs_block_size_from_arch(thread->arch); + U64 reg_block_size = regs_block_size_from_arch(thread->process->ctx->arch); MemoryCopy(reg_block, thread->reg_block, reg_block_size); } result = 1; @@ -2845,23 +3053,19 @@ dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) } internal B32 -dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) +dmn_thread_write_reg_block(DMN_Handle thread_handle, void *reg_block) { B32 result = 0; DMN_AccessScope { - DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle); - U64 reg_block_size = regs_block_size_from_arch(thread->arch); - if(thread == dmn_lnx_nil_entity) - { - MemoryZero(reg_block, reg_block_size); - } - else + DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + if(thread) { + U64 reg_block_size = regs_block_size_from_arch(thread->process->ctx->arch); MemoryCopy(thread->reg_block, reg_block, reg_block_size); thread->is_reg_block_dirty = 1; + result = 1; } - result = 1; } return result; } diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index f0fcb288..94a667c7 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -5,27 +5,19 @@ #define DEMON_CORE_LINUX_H //////////////////////////////// -//~ rjf: Includes +//~ TLS -#include -#include -#include - -//////////////////////////////// - -typedef struct DMN_LNX_DbDesc DMN_LNX_DbDesc; -struct DMN_LNX_DbDesc +typedef struct DMN_LNX_DbDesc { U32 bit_size; U32 count; U32 offset; -}; +} DMN_LNX_DbDesc; //////////////////////////////// //~ SDT Probes -typedef struct DMN_LNX_Probe DMN_LNX_Probe; -struct DMN_LNX_Probe +typedef struct DMN_LNX_Probe { String8 provider; String8 name; @@ -33,22 +25,20 @@ struct DMN_LNX_Probe STAP_ArgArray args; U64 pc; U64 semaphore; -}; +} DMN_LNX_Probe; -typedef struct DMN_LNX_ProbeNode DMN_LNX_ProbeNode; -struct DMN_LNX_ProbeNode +typedef struct DMN_LNX_ProbeNode { DMN_LNX_Probe v; - DMN_LNX_ProbeNode *next; -}; + struct DMN_LNX_ProbeNode *next; +} DMN_LNX_ProbeNode; -typedef struct DMN_LNX_ProbeList DMN_LNX_ProbeList; -struct DMN_LNX_ProbeList +typedef struct DMN_LNX_ProbeList { U64 count; DMN_LNX_ProbeNode *first; DMN_LNX_ProbeNode *last; -}; +} DMN_LNX_ProbeList; #define DMN_LNX_Probe_XList \ X(InitStart, 2, "init_start") \ @@ -73,10 +63,9 @@ typedef enum } DMN_LNX_ProbeType; //////////////////////////////// -//~ rjf: Process Info Extraction Types +//~ Process Info -typedef struct DMN_LNX_ProcessAuxv DMN_LNX_ProcessAuxv; -struct DMN_LNX_ProcessAuxv +typedef struct DMN_LNX_Auxv { U64 base; U64 phnum; @@ -84,10 +73,9 @@ struct DMN_LNX_ProcessAuxv U64 phdr; U64 execfn; U64 pagesz; -}; +} DMN_LNX_Auxv; -typedef struct DMN_LNX_DynamicInfo DMN_LNX_DynamicInfo; -struct DMN_LNX_DynamicInfo +typedef struct DMN_LNX_DynamicInfo { U64 hash_vaddr; U64 gnu_hash_vaddr; @@ -95,21 +83,19 @@ struct DMN_LNX_DynamicInfo U64 strtab_size; U64 symtab_vaddr; U64 symtab_entry_size; -}; +} DMN_LNX_DynamicInfo; //////////////////////////////// -//~ rjf: Entity Types +//~ Entities typedef enum DMN_LNX_EntityKind { DMN_LNX_EntityKind_Null, - DMN_LNX_EntityKind_Root, DMN_LNX_EntityKind_Process, + DMN_LNX_EntityKind_ProcessCtx, DMN_LNX_EntityKind_Thread, DMN_LNX_EntityKind_Module, - DMN_LNX_EntityKind_COUNT -} -DMN_LNX_EntityKind; +} DMN_LNX_EntityKind; typedef enum DMN_LNX_ThreadState { @@ -120,120 +106,178 @@ typedef enum DMN_LNX_ThreadState DMN_LNX_ThreadState_PendingCreation, } DMN_LNX_ThreadState; -typedef struct DMN_LNX_Entity DMN_LNX_Entity; -struct DMN_LNX_Entity +typedef struct DMN_LNX_Thread { - // entity hierarchy - DMN_LNX_Entity *first; - DMN_LNX_Entity *last; - DMN_LNX_Entity *next; - DMN_LNX_Entity *prev; - DMN_LNX_Entity *parent; + pid_t tid; + DMN_LNX_ThreadState state; + struct DMN_LNX_Process *process; + void *reg_block; + B32 is_reg_block_dirty; + B32 pass_through_signal; + U64 pass_through_signo; + U64 orig_rax; - // common - DMN_LNX_EntityKind kind; - U32 gen; - Arch arch; - U64 id; + struct DMN_LNX_Thread *next; + struct DMN_LNX_Thread *prev; +} DMN_LNX_Thread; - // process - Arena *arena; - int fd; - pid_t tracer_tid; - B32 debug_subprocesses; - U64 rdebug_vaddr; - ELF_Class dl_class; - HashTable *loaded_modules_ht; - DMN_LNX_Probe **probes; - DMN_ActiveTrap *first_probe_trap; - DMN_ActiveTrap *last_probe_trap; - U64 main_thread_exit_code; - U64 thread_count; +typedef struct DMN_LNX_ThreadPtrNode +{ + DMN_LNX_Thread *v; + struct DMN_LNX_ThreadPtrNode *next; + struct DMN_LNX_ThreadPtrNode *prev; +} DMN_LNX_ThreadPtrNode; - // process x64 - U64 xcr0; - U64 xsave_size; - X64_XSaveLayout xsave_layout; +typedef struct DMN_LNX_ThreadPtrList +{ + U64 count; + DMN_LNX_ThreadPtrNode *first; + DMN_LNX_ThreadPtrNode *last; +} DMN_LNX_ThreadPtrList; - // thread - void *reg_block; - B32 expecting_dummy_sigstop; - B32 is_reg_block_dirty; - B32 pass_through_signal; - U64 pass_through_signo; - DMN_LNX_ThreadState thread_state; - U64 thread_local_base; - U64 orig_rax; - - // module - U64 module_name_vaddr; +typedef struct DMN_LNX_Module +{ + U64 name_vaddr; U64 base_vaddr; + U64 name_space_id; + U64 size; U64 phvaddr; U64 phentsize; U64 phcount; - U64 name_space_id; + U64 tls_index; + U64 tls_offset; B8 is_live; B8 is_main; -}; -typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode; -struct DMN_LNX_EntityNode + struct DMN_LNX_Module *next; + struct DMN_LNX_Module *prev; +} DMN_LNX_Module; + +typedef struct DMN_LNX_ModulePtrNode { - DMN_LNX_EntityNode *next; - DMN_LNX_Entity *v; -}; + DMN_LNX_Module *v; + struct DMN_LNX_ModulePtrNode *next; +} DMN_LNX_ModulePtrNode; -typedef struct DMN_LNX_EntityList DMN_LNX_EntityList; -struct DMN_LNX_EntityList +typedef struct DMN_LNX_ModulePtrList +{ + U64 count; + DMN_LNX_ModulePtrNode *first; + DMN_LNX_ModulePtrNode *last; +} DMN_LNX_ModulePtrList; + +typedef enum +{ + DMN_LNX_ProcessState_Null, + DMN_LNX_ProcessState_Launch, + DMN_LNX_ProcessState_Attach, + DMN_LNX_ProcessState_WaitForExec, + DMN_LNX_ProcessState_ExecFailedDoExit, + DMN_LNX_ProcessState_Normal, +} DMN_LNX_ProcessState; + +typedef enum +{ + DMN_LNX_CreateProcessFlag_DebugSubprocesses = (1 << 0), + DMN_LNX_CreateProcessFlag_Rebased = (1 << 1), + DMN_LNX_CreateProcessFlag_Cow = (1 << 2), + DMN_LNX_CreateProcessFlag_ClonedMemory = (1 << 3), +} DMN_LNX_CreateProcessFlags; + +typedef struct DMN_LNX_Process +{ + pid_t pid; + int fd; + DMN_LNX_ProcessState state; + B32 debug_subprocesses; + B32 is_cow; + B32 vfork_with_spoof; + U64 thread_count; + DMN_LNX_Thread *first_thread; + DMN_LNX_Thread *last_thread; + U64 main_thread_exit_code; + struct DMN_LNX_Process *parent_process; + struct DMN_LNX_ProcessCtx *ctx; + + + struct DMN_LNX_Process *next; + struct DMN_LNX_Process *prev; +} DMN_LNX_Process; + +typedef struct DMN_LNX_ProcessPtrNode +{ + DMN_LNX_Process *v; + struct DMN_LNX_ProcessPtrNode *next; +} DMN_LNX_ProcessPtrNode; + +typedef struct DMN_LNX_ProcessPtrList +{ + U64 count; + DMN_LNX_ProcessPtrNode *first; + DMN_LNX_ProcessPtrNode *last; +} DMN_LNX_ProcessPtrList; + +typedef struct DMN_LNX_ProcessCtx +{ + Arena *arena; + Arch arch; + U64 rdebug_vaddr; + ELF_Class dl_class; + HashTable *loaded_modules_ht; + DMN_LNX_Probe **probes; + DMN_ActiveTrap *first_probe_trap; + DMN_ActiveTrap *last_probe_trap; + DMN_LNX_Module *first_module; + DMN_LNX_Module *last_module; + U64 module_count; + U64 ref_count; + + String8List free_reg_blocks; + String8List free_reg_block_nodes; + + // x64 + U64 xcr0; + U64 xsave_size; + X64_XSaveLayout xsave_layout; +} DMN_LNX_ProcessCtx; + +typedef struct DMN_LNX_Entity +{ + union + { + DMN_LNX_Process process; + DMN_LNX_ProcessCtx process_ctx; + DMN_LNX_Thread thread; + DMN_LNX_Module module; + struct + { + struct DMN_LNX_Entity *next; + }; + }; + U32 gen; + DMN_LNX_EntityKind kind; +} DMN_LNX_Entity; + +typedef struct DMN_LNX_EntityNode +{ + DMN_LNX_Entity *v; + struct DMN_LNX_EntityNode *next; +} DMN_LNX_EntityNode; + +typedef struct DMN_LNX_EntityList { U64 count; DMN_LNX_EntityNode *first; DMN_LNX_EntityNode *last; -}; +} DMN_LNX_EntityList; //////////////////////////////// -//~ rjf: Main State Bundle +//~ Global State -typedef U32 DMN_LNX_ProcessLaunchState; -enum -{ - DMN_LNX_ProcessLaunchState_Null, - DMN_LNX_ProcessLaunchState_Exec, - DMN_LNX_ProcessLaunchState_Attach, - DMN_LNX_ProcessLaunchState_Exit, -}; - -typedef struct DMN_LNX_ProcessLaunch DMN_LNX_ProcessLaunch; -struct DMN_LNX_ProcessLaunch -{ - B32 debug_subprocesses; - pid_t pid; - DMN_LNX_ProcessLaunchState state; - - DMN_LNX_ProcessLaunch *next; - DMN_LNX_ProcessLaunch *prev; -}; - -typedef struct DMN_LNX_ProcessLaunchList DMN_LNX_ProcessLaunchList; -struct DMN_LNX_ProcessLaunchList -{ - U64 count; - DMN_LNX_ProcessLaunch *first; - DMN_LNX_ProcessLaunch *last; -}; - -typedef struct DMN_LNX_Halt -{ - pid_t halter_pid; -} DMN_LNX_Halt; - -typedef struct DMN_LNX_State DMN_LNX_State; -struct DMN_LNX_State +typedef struct DMN_LNX_State { Arena *arena; - pid_t tracer_tid; - // rjf: access locking mechanism Mutex access_mutex; B32 access_run_state; @@ -247,11 +291,13 @@ struct DMN_LNX_State HashTable *tid_ht; // thread id -> thread entity HashTable *pid_ht; // process id -> process entity - // pid tracking - U64 active_process_count; - DMN_LNX_ProcessLaunchList pending_procs; - DMN_LNX_ProcessLaunchList free_pids; + // process tracking + U64 process_count; + DMN_LNX_Process *first_process; + DMN_LNX_Process *last_process; + // process/thread creation tracking + U64 process_pending_creation; U64 threads_pending_creation; // halter @@ -265,23 +311,17 @@ struct DMN_LNX_State B32 is_tls_detected; DMN_LNX_DbDesc tls_modid_desc; DMN_LNX_DbDesc tls_offset_desc; -}; +} DMN_LNX_State; //////////////////////////////// //~ Globals -global DMN_LNX_State *dmn_lnx_state = 0; -thread_static B32 dmn_lnx_ctrl_thread = 0; - -read_only global DMN_LNX_Entity dmn_lnx_nil_entity_ = {&dmn_lnx_nil_entity_, &dmn_lnx_nil_entity_, &dmn_lnx_nil_entity_, &dmn_lnx_nil_entity_, &dmn_lnx_nil_entity_}; -read_only global DMN_LNX_Entity *dmn_lnx_nil_entity = &dmn_lnx_nil_entity_; +global B32 dmn_lnx_ctrl_thread; +global DMN_LNX_State *dmn_lnx_state; //////////////////////////////// -//~ rjf: Helpers +//~ Memory R/W -internal DMN_LNX_EntityNode * dmn_lnx_entity_list_push(Arena *arena, DMN_LNX_EntityList *list, DMN_LNX_Entity *v); - -//- rjf: file descriptor memory reading/writing helpers internal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst); internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); internal String8 dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size); @@ -289,35 +329,114 @@ internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr #define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) #define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) -//- rjf: pid => info extraction -internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); -internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); -internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid); -internal DMN_LNX_ProcessAuxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class); +//////////////////////////////// +//~ ELF/GNU info -//- ELF/GNU info from memory +internal Rng1U64 dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum); internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased); //////////////////////////////// -//~ rjf: Entity Functions +//~ Process Info -internal DMN_LNX_Entity * dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind); -internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); -internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); -internal DMN_LNX_Entity * dmn_lnx_entity_from_handle(DMN_Handle handle); -internal DMN_LNX_Entity * dmn_lnx_thread_from_pid(pid_t pid); +internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); +internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); +internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid); +internal DMN_LNX_Auxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class); +internal DMN_LNX_Thread * dmn_lnx_thread_from_pid(pid_t pid); +internal DMN_LNX_Process * dmn_lnx_process_from_pid(pid_t pid); -//- Process -internal void dmn_lnx_process_install_probes(); +//////////////////////////////// +//~ Entity -//- Thread -internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread); -internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread); -internal void dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip); -internal void dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp); -internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread); -internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread); -internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on); +// alloc +internal DMN_LNX_Entity * dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind); +internal DMN_LNX_Process * dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocess, B32 is_cow); +internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased); +internal DMN_LNX_Thread * dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid); +internal DMN_LNX_Module * dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main); + +// release +internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); +internal void dmn_lnx_process_release(DMN_LNX_Process *process); +internal void dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *process_ctx); +internal void dmn_lnx_thread_release(DMN_LNX_Thread *thread); +internal void dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module); + +// clone +internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_clone(DMN_LNX_Process *process, DMN_LNX_ProcessCtx *ctx); +internal DMN_LNX_Module * dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module); + +// entity -> handle +internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); +internal DMN_Handle dmn_lnx_handle_from_process(DMN_LNX_Process *process); +internal DMN_Handle dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx); +internal DMN_Handle dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread); +internal DMN_Handle dmn_lnx_handle_from_module(DMN_LNX_Module *module); + +// handle -> entity +internal DMN_LNX_Entity * dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind); +internal DMN_LNX_Process * dmn_lnx_process_from_handle(DMN_Handle process_handle); +internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle); +internal DMN_LNX_Thread * dmn_lnx_thread_from_handle(DMN_Handle thread_handle); +internal DMN_LNX_Module * dmn_lnx_module_from_handle(DMN_Handle module_handle); + +//////////////////////////////// +//~ Process Helpers + +internal void dmn_lnx_process_trap_probes(DMN_LNX_Process *process); +internal void dmn_lnx_process_untrap_probes(DMN_LNX_Process *process); + +//////////////////////////////// +//~ Thread Helpers + +internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread); +internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread); +internal void dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip); +internal void dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp); +internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread); +internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread); +internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on); + +//////////////////////////////// +//~ List Helpers + +internal void dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n); +internal DMN_LNX_ThreadPtrNode * dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v); +internal DMN_LNX_ModulePtrNode * dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v); +internal DMN_LNX_ProcessPtrNode * dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v); + +//////////////////////////////// +//~ Debug Event Pushers + +internal void dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); +internal void dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); +internal void dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread); +internal void dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code); +internal void dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module); +internal void dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module); +internal void dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); +internal void dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address); +internal void dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread); +internal void dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo); +internal void dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events); +internal void dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events); + +//////////////////////////////// +//~ Debug Event + +internal DMN_LNX_Thread * dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid); +internal void dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code); +internal DMN_LNX_Process * dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags); +internal void dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid); +internal void dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr); +internal void dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr); +internal void dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid); +internal void dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid); +internal void dmn_lnx_event_halt(Arena *arena, DMN_EventList *events); +internal void dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid); +internal void dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo); +internal DMN_LNX_Process * dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid); #endif // DEMON_CORE_LINUX_H + From e724ee8185fb8680d272d8a45aa33bc13efbf045 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 22 Jan 2026 13:59:12 -0800 Subject: [PATCH 135/850] use /proc/pid/exe to extract ELF header --- src/demon/linux/demon_core_linux.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index e1fa1d63..eb0c38dc 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -208,18 +208,19 @@ internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid) { Temp scratch = scratch_begin(0, 0); - B32 is_read = 0; - ELF_Hdr64 exe = {0}; - String8 exe_path = dmn_lnx_exe_path_from_pid(scratch.arena, pid); - if(exe_path.size != 0) + + ELF_Hdr64 exe = {0}; + B32 is_read = 0; + + char *exe_path = (char *)push_str8f(scratch.arena, "/proc/%d/exe", pid).str; + int exe_fd = OS_LNX_RETRY_ON_EINTR(open(exe_path, O_RDONLY)); + + if(exe_fd >= 0) { - int exe_fd = OS_LNX_RETRY_ON_EINTR(open((char *)exe_path.str, O_RDONLY)); - if(exe_fd != -1) - { - is_read = elf_read_ehdr(dmn_lnx_machine_op_mem_read, &exe_fd, 0, &exe); - close(exe_fd); - } + is_read = elf_read_ehdr(dmn_lnx_machine_op_mem_read, &exe_fd, 0, &exe); + OS_LNX_RETRY_ON_EINTR(close(exe_fd)); } + Assert(is_read); scratch_end(scratch); return exe; From be350c4147c707e534452f810b6bc6b9ccde45e7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 22 Jan 2026 14:04:40 -0800 Subject: [PATCH 136/850] add cstr union field to String8 and remove char* casts from the Linux code --- src/base/base_strings.h | 6 +++- src/demon/linux/demon_core_linux.c | 20 ++++++------- src/os/core/linux/os_core_linux.c | 48 +++++++++++++++--------------- 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/base/base_strings.h b/src/base/base_strings.h index cc1eda1e..d570ec8b 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -10,7 +10,11 @@ typedef struct String8 String8; struct String8 { - U8 *str; + union + { + U8 *str; + char *cstr; + }; U64 size; }; diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index eb0c38dc..68e6baef 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -112,7 +112,7 @@ dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) for(S64 r = 0, cap = PATH_MAX; r < 4; cap *= 2, r += 1) { U8 *buffer = push_array(arena, U8, cap); - readlink_result = readlink((char *)exe_link_path.str, (char *)buffer, cap); + readlink_result = readlink(exe_link_path.cstr, (char *)buffer, cap); if(readlink_result < 0) { @@ -139,7 +139,7 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) String8 dl_path = {0}; - int maps_fd = open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY); + int maps_fd = open(str8f(scratch.arena, "/proc/%d/maps", pid).cstr, O_RDONLY); if(maps_fd != -1) { // read entire /proc/pid/maps @@ -212,7 +212,7 @@ dmn_lnx_ehdr_from_pid(pid_t pid) ELF_Hdr64 exe = {0}; B32 is_read = 0; - char *exe_path = (char *)push_str8f(scratch.arena, "/proc/%d/exe", pid).str; + char *exe_path = push_str8f(scratch.arena, "/proc/%d/exe", pid).cstr; int exe_fd = OS_LNX_RETRY_ON_EINTR(open(exe_path, O_RDONLY)); if(exe_fd >= 0) @@ -234,7 +234,7 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) // rjf: open aux data String8 auxv_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int auxv_fd = OS_LNX_RETRY_ON_EINTR(open((char*)auxv_path.str, O_RDONLY)); + int auxv_fd = OS_LNX_RETRY_ON_EINTR(open(auxv_path.cstr, O_RDONLY)); // rjf: scan aux data if(auxv_fd >= 0) @@ -630,7 +630,7 @@ dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *pa DMN_LNX_Process *process = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Process)->process; process->pid = pid; - process->fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR); + process->fd = open(str8f(scratch.arena, "/proc/%d/mem", pid).cstr, O_RDWR); process->state = state; process->debug_subprocesses = debug_subprocesses; process->is_cow = is_cow; @@ -698,7 +698,7 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) Temp scratch = scratch_begin(0, 0); String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, process->pid, auxv.base); - int dl_fd = open((char *)dl_path.str, O_RDONLY); + int dl_fd = open(dl_path.cstr, O_RDONLY); DMN_LNX_ProbeList probes = {0}; if(dl_fd >= 0) @@ -2157,7 +2157,7 @@ dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) // extract threads from /proc/pid/task { String8 task_path = push_str8f(scratch.arena, "/proc/%d/task", pid); - DIR *task_dirp = opendir((char *)task_path.str); + DIR *task_dirp = opendir(task_path.cstr); if(task_dirp) { for(;;) @@ -2279,7 +2279,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) U64 idx = 0; for EachNode(n, String8Node, params->cmd_line.first) { - argv[idx++] = (char *)push_str8_copy(scratch.arena, n->string).str; + argv[idx++] = push_str8_copy(scratch.arena, n->string).cstr; } } @@ -2294,12 +2294,12 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) U64 idx = os_lnx_state.default_env_count; for EachNode(n, String8Node, params->env.first) { - envp[idx++] = (char *)push_str8_copy(scratch.arena, n->string).str; + envp[idx++] = push_str8_copy(scratch.arena, n->string).cstr; } } // create zero-terminated work directory path - char *work_dir_path = (char *)push_str8_copy(scratch.arena, params->path).str; + char *work_dir_path = push_str8_copy(scratch.arena, params->path).cstr; // fork process pid_t pid = fork(); diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index de752de3..672151e6 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -159,7 +159,7 @@ os_get_process_start_time_unix(void) pid_t pid = getpid(); String8 path = push_str8f(scratch.arena, "/proc/%u", pid); struct stat st; - int err = stat((char*)path.str, &st); + int err = stat(path.cstr, &st); if(err == 0) { start_time = st.st_mtime; @@ -240,7 +240,7 @@ os_set_thread_name(String8 name) Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); pthread_t current_thread = pthread_self(); - pthread_setname_np(current_thread, (char *)name_copy.str); + pthread_setname_np(current_thread, name_copy.cstr); scratch_end(scratch); } @@ -285,7 +285,7 @@ os_file_open(OS_AccessFlags flags, String8 path) lnx_flags |= O_CREAT; } lnx_flags |= O_CLOEXEC; - int fd = open((char *)path_copy.str, lnx_flags, 0755); + int fd = open(path_copy.cstr, lnx_flags, 0755); OS_Handle handle = {0}; if(fd != -1) { @@ -400,7 +400,7 @@ os_delete_file_at_path(String8 path) Temp scratch = scratch_begin(0, 0); B32 result = 0; String8 path_copy = push_str8_copy(scratch.arena, path); - if(remove((char*)path_copy.str) != -1) + if(remove(path_copy.cstr) != -1) { result = 1; } @@ -447,8 +447,8 @@ os_move_file_path(String8 dst, String8 src) B32 good = 0; Temp scratch = scratch_begin(0, 0); { - char *src_cstr = (char *)push_str8_copy(scratch.arena, src).str; - char *dst_cstr = (char *)push_str8_copy(scratch.arena, dst).str; + char *src_cstr = push_str8_copy(scratch.arena, src).cstr; + char *dst_cstr = push_str8_copy(scratch.arena, dst).cstr; int rename_result = rename(src_cstr, dst_cstr); good = (rename_result != -1); } @@ -462,7 +462,7 @@ os_full_path_from_path(Arena *arena, String8 path) Temp scratch = scratch_begin(&arena, 1); String8 path_copy = push_str8_copy(scratch.arena, path); char buffer[PATH_MAX] = {0}; - realpath((char *)path_copy.str, buffer); + realpath(path_copy.cstr, buffer); String8 result = push_str8_copy(arena, str8_cstring(buffer)); scratch_end(scratch); return result; @@ -473,7 +473,7 @@ os_file_path_exists(String8 path) { Temp scratch = scratch_begin(0, 0); String8 path_copy = push_str8_copy(scratch.arena, path); - int access_result = access((char *)path_copy.str, F_OK); + int access_result = access(path_copy.cstr, F_OK); B32 result = 0; if(access_result == 0) { @@ -489,7 +489,7 @@ os_folder_path_exists(String8 path) Temp scratch = scratch_begin(0, 0); B32 exists = 0; String8 path_copy = push_str8_copy(scratch.arena, path); - DIR *handle = opendir((char*)path_copy.str); + DIR *handle = opendir(path_copy.cstr); if(handle) { closedir(handle); @@ -505,7 +505,7 @@ os_properties_from_file_path(String8 path) Temp scratch = scratch_begin(0, 0); String8 path_copy = push_str8_copy(scratch.arena, path); struct stat f_stat = {0}; - int stat_result = stat((char *)path_copy.str, &f_stat); + int stat_result = stat(path_copy.cstr, &f_stat); FileProperties props = {0}; if(stat_result != -1) { @@ -564,7 +564,7 @@ os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory; { String8 path_copy = push_str8_copy(arena, path); - iter->dir = opendir((char *)path_copy.str); + iter->dir = opendir(path_copy.cstr); iter->path = path_copy; } return base_iter; @@ -588,7 +588,7 @@ os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) { Temp scratch = scratch_begin(&arena, 1); String8 full_path = push_str8f(scratch.arena, "%S/%s", lnx_iter->path, lnx_iter->dp->d_name); - stat_result = stat((char *)full_path.str, &st); + stat_result = stat(full_path.cstr, &st); scratch_end(scratch); } @@ -637,7 +637,7 @@ os_make_directory(String8 path) Temp scratch = scratch_begin(0, 0); B32 result = 0; String8 path_copy = push_str8_copy(scratch.arena, path); - if(mkdir((char*)path_copy.str, 0755) != -1) + if(mkdir(path_copy.cstr, 0755) != -1) { result = 1; } @@ -653,7 +653,7 @@ os_shared_memory_alloc(U64 size, String8 name) { Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR|O_CREAT, 0666); + int id = shm_open(name_copy.cstr, O_RDWR|O_CREAT, 0666); ftruncate(id, size); OS_Handle result = {(U64)id}; scratch_end(scratch); @@ -665,7 +665,7 @@ os_shared_memory_open(String8 name) { Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR, 0); + int id = shm_open(name_copy.cstr, O_RDWR, 0); OS_Handle result = {(U64)id}; scratch_end(scratch); return result; @@ -802,9 +802,9 @@ os_process_launch(OS_ProcessLaunchParams *params) str8_list_push(scratch.arena, &l, params->cmd_line.first->string); String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); - argv[0] = (char *)path_to_exe.str; + argv[0] = path_to_exe.cstr; U64 arg_idx = 1; - for EachNode(n, String8Node, params->cmd_line.first->next) { argv[arg_idx++] = (char *)n->string.str; } + for EachNode(n, String8Node, params->cmd_line.first->next) { argv[arg_idx++] = n->string.cstr; } } // package envp @@ -819,7 +819,7 @@ os_process_launch(OS_ProcessLaunchParams *params) U64 env_idx = 0; for EachNode(n, String8Node, params->cmd_line.first) { - envp[env_idx] = (char *)n->string.str; + envp[env_idx] = n->string.cstr; } } @@ -1175,10 +1175,10 @@ os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) { for EachIndex(attempt_idx, 64) { - sem_t *s = sem_open((char *)name.str, O_CREAT | O_EXCL, 0666, initial_count); + sem_t *s = sem_open(name.cstr, O_CREAT | O_EXCL, 0666, initial_count); if(s == SEM_FAILED) { - s = sem_open((char *)name.str, 0); + s = sem_open(name.cstr, 0); } if(s != SEM_FAILED) { @@ -1211,7 +1211,7 @@ internal Semaphore os_semaphore_open(String8 name) { Semaphore result = {0}; - sem_t *s = sem_open((char *)name.str, 0); + sem_t *s = sem_open(name.cstr, 0); if(s != SEM_FAILED) { result.u64[0] = (U64)s; @@ -1310,7 +1310,7 @@ internal OS_Handle os_library_open(String8 path) { Temp scratch = scratch_begin(0, 0); - char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str; + char *path_cstr = push_str8_copy(scratch.arena, path).cstr; void *so = dlopen(path_cstr, RTLD_LAZY|RTLD_LOCAL); OS_Handle lib = { (U64)so }; scratch_end(scratch); @@ -1322,7 +1322,7 @@ os_library_load_proc(OS_Handle lib, String8 name) { Temp scratch = scratch_begin(0, 0); void *so = (void *)lib.u64; - char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str; + char *name_cstr = push_str8_copy(scratch.arena, name).cstr; VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); scratch_end(scratch); return proc; @@ -1493,7 +1493,7 @@ main(int argc, char **argv) char **default_env = push_array(os_lnx_state.arena, char *, env_count+1); for EachIndex(i, env_count) { - default_env[i] = (char *)str8_copy(os_lnx_state.arena, str8_cstring(__environ[i])).str; + default_env[i] = str8_copy(os_lnx_state.arena, str8_cstring(__environ[i])).cstr; } default_env[env_count] = 0; os_lnx_state.default_env_count = env_count; From 3113db2d082741ad13b38c616a0d98b2bbe8bde9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 22 Jan 2026 14:38:23 -0800 Subject: [PATCH 137/850] add missing retry wraps around syscalls --- src/demon/linux/demon_core_linux.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 68e6baef..12104181 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -139,7 +139,7 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) String8 dl_path = {0}; - int maps_fd = open(str8f(scratch.arena, "/proc/%d/maps", pid).cstr, O_RDONLY); + int maps_fd = OS_LNX_RETRY_ON_EINTR(open(str8f(scratch.arena, "/proc/%d/maps", pid).cstr, O_RDONLY)); if(maps_fd != -1) { // read entire /proc/pid/maps @@ -195,7 +195,7 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) } } - close(maps_fd); + OS_LNX_RETRY_ON_EINTR(close(maps_fd)); } else { Assert(0 && "failed to open DL fd"); } @@ -273,7 +273,7 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) } } brkloop:; - close(auxv_fd); + OS_LNX_RETRY_ON_EINTR(close(auxv_fd)); } scratch_end(scratch); @@ -630,7 +630,7 @@ dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *pa DMN_LNX_Process *process = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Process)->process; process->pid = pid; - process->fd = open(str8f(scratch.arena, "/proc/%d/mem", pid).cstr, O_RDWR); + process->fd = OS_LNX_RETRY_ON_EINTR(open(str8f(scratch.arena, "/proc/%d/mem", pid).cstr, O_RDWR)); process->state = state; process->debug_subprocesses = debug_subprocesses; process->is_cow = is_cow; @@ -698,13 +698,13 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) Temp scratch = scratch_begin(0, 0); String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, process->pid, auxv.base); - int dl_fd = open(dl_path.cstr, O_RDONLY); + int dl_fd = OS_LNX_RETRY_ON_EINTR(open(dl_path.cstr, O_RDONLY)); DMN_LNX_ProbeList probes = {0}; if(dl_fd >= 0) { probes = dmn_lnx_read_probes(ctx_arena, dl_fd, 0, auxv.base); - close(dl_fd); + OS_LNX_RETRY_ON_EINTR(close(dl_fd)); } for EachNode(n, DMN_LNX_ProbeNode, probes.first) @@ -867,7 +867,7 @@ dmn_lnx_process_release(DMN_LNX_Process *process) } // close memory handle - if(close(process->fd) < 0) { Assert(0 && "failed to close memory descriptor"); } + if(OS_LNX_RETRY_ON_EINTR(close(process->fd)) < 0) { Assert(0 && "failed to close memory descriptor"); } // remove pid mapping hash_table_purge_u64(dmn_lnx_state->pid_ht, process->pid); From cc43d17496b06b40686c28e4d40d67401c15fb9c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 27 Jan 2026 11:25:54 -0800 Subject: [PATCH 138/850] bugfix export by ordinal --- src/pe/pe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pe/pe.c b/src/pe/pe.c index 1789d154..61786acd 100644 --- a/src/pe/pe.c +++ b/src/pe/pe.c @@ -1342,7 +1342,7 @@ pe_exports_from_data(Arena *arena, U64 section_count, COFF_SectionHeader *sectio if (is_voff_taken && is_ordinal_free) { curr_exp->name = str8_zero(); curr_exp->voff = voff; - curr_exp->ordinal = header->ordinal_base; + curr_exp->ordinal = header->ordinal_base + ordinal_nb; ++curr_exp; } } From 3abfb800a826e69c8ff85f3369e2350ada14571c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 27 Jan 2026 11:26:24 -0800 Subject: [PATCH 139/850] group forwarder and named exports and sort them together --- src/pe/pe_make_export_table.c | 112 ++++++++++++++-------------------- src/pe/pe_make_export_table.h | 5 +- 2 files changed, 48 insertions(+), 69 deletions(-) diff --git a/src/pe/pe_make_export_table.c b/src/pe/pe_make_export_table.c index 27e5d9e8..b8919c24 100644 --- a/src/pe/pe_make_export_table.c +++ b/src/pe/pe_make_export_table.c @@ -75,36 +75,30 @@ pe_export_parse_list_concat_in_place(PE_ExportParseList *list, PE_ExportParseLis internal int pe_named_export_is_before(void *raw_a, void *raw_b) { - PE_ExportParse *a = *(PE_ExportParse **)raw_a; - PE_ExportParse *b = *(PE_ExportParse **)raw_b; - int cmp = str8_compar_case_sensitive(&a->name, &b->name); - return cmp < 0; + PE_ExportParse *a = *(PE_ExportParse **)raw_a, *b = *(PE_ExportParse **)raw_b; + String8 name_a = a->alias.size ? a->alias : a->name; + String8 name_b = b->alias.size ? b->alias : b->name; + return str8_compar_case_sensitive(&name_a, &name_b) < 0; } internal int pe_ordinal_export_is_before(void *raw_a, void *raw_b) { - PE_ExportParse *a = raw_a; - PE_ExportParse *b = raw_b; - return a->ordinal < b->ordinal; + return ((PE_ExportParse * )raw_a)->ordinal < ((PE_ExportParse *)raw_b)->ordinal; } internal PE_FinalizedExports pe_finalize_export_list(Arena *arena, PE_ExportParseList export_list) { - PE_ExportParsePtrArray named_exports = {0}; + PE_ExportParsePtrArray named_exports = {0}; PE_ExportParsePtrArray ordinal_exports = {0}; - PE_ExportParsePtrArray forwarder_exports = {0}; { // group exports based on flags - PE_ExportParseList named_exports_list = {0}; + PE_ExportParseList named_exports_list = {0}; PE_ExportParseList ordinal_exports_list = {0}; - PE_ExportParseList forwarder_exports_list = {0}; for (PE_ExportParseNode *exp_n = export_list.first, *exp_n_next; exp_n != 0; exp_n = exp_n_next) { exp_n_next = exp_n->next; - if (exp_n->data.is_forwarder) { - pe_export_parse_list_push_node(&forwarder_exports_list, exp_n); - } else if (exp_n->data.is_noname_present) { + if (exp_n->data.is_noname_present) { AssertAlways(exp_n->data.is_ordinal_assigned); pe_export_parse_list_push_node(&ordinal_exports_list, exp_n); } else { @@ -113,29 +107,29 @@ pe_finalize_export_list(Arena *arena, PE_ExportParseList export_list) } // list -> array - named_exports = pe_array_from_export_list(arena, named_exports_list); - forwarder_exports = pe_array_from_export_list(arena, forwarder_exports_list); + named_exports = pe_array_from_export_list(arena, named_exports_list); ordinal_exports = pe_array_from_export_list(arena, ordinal_exports_list); + for(int i = 0; i < ordinal_exports.count; ++i) { + PE_ExportParse p = *ordinal_exports.v[i]; + } + // sort exports radsort(named_exports.v, named_exports.count, pe_named_export_is_before); radsort(ordinal_exports.v, ordinal_exports.count, pe_ordinal_export_is_before); - radsort(forwarder_exports.v, forwarder_exports.count, pe_named_export_is_before); MemoryZeroStruct(&export_list); pe_export_parse_list_concat_in_place(&export_list, &named_exports_list); - pe_export_parse_list_concat_in_place(&export_list, &forwarder_exports_list); pe_export_parse_list_concat_in_place(&export_list, &ordinal_exports_list); } // compute max ordinal and used ordinal flag array U64 ordinal_low = max_U64; B8 *is_ordinal_used = push_array(arena, B8, max_U16); - for (PE_ExportParseNode *exp_n = export_list.first; exp_n != 0; exp_n = exp_n->next) { - PE_ExportParse *exp = &exp_n->data; - if (exp->is_ordinal_assigned) { - ordinal_low = Min(ordinal_low, exp->ordinal); - is_ordinal_used[exp->ordinal] = 1; + for EachNode(exp_n, PE_ExportParseNode, export_list.first) { + if (exp_n->data.is_ordinal_assigned) { + ordinal_low = Min(ordinal_low, exp_n->data.ordinal); + is_ordinal_used[exp_n->data.ordinal] = 1; } } if (ordinal_low == max_U64) { @@ -154,15 +148,6 @@ pe_finalize_export_list(Arena *arena, PE_ExportParseList export_list) is_ordinal_used[last_ordinal] = 1; } } - for (U64 exp_idx = 0; exp_idx < forwarder_exports.count; exp_idx += 1) { - PE_ExportParse *exp = forwarder_exports.v[exp_idx]; - if (!exp->is_ordinal_assigned) { - for (; last_ordinal < max_U16 && is_ordinal_used[last_ordinal] != 0; last_ordinal += 1); - exp->ordinal = last_ordinal; - exp->is_ordinal_assigned = 1; - is_ordinal_used[last_ordinal] = 1; - } - } for (U64 exp_idx = 0; exp_idx < ordinal_exports.count; exp_idx += 1) { PE_ExportParse *exp = ordinal_exports.v[exp_idx]; if (!exp->is_ordinal_assigned) { @@ -179,18 +164,13 @@ pe_finalize_export_list(Arena *arena, PE_ExportParseList export_list) for (U64 exp_idx = 0; exp_idx < named_exports.count; exp_idx += 1, hint += 1) { named_exports.v[exp_idx]->hint = hint; } - for (U64 exp_idx = 0; exp_idx < forwarder_exports.count; exp_idx += 1, hint += 1) { - forwarder_exports.v[exp_idx]->hint = hint; - } } - PE_FinalizedExports result = {0}; - result.ordinal_low = ordinal_low; - result.named_exports = named_exports; - result.forwarder_exports = forwarder_exports; - result.ordinal_exports = ordinal_exports; - - return result; + return (PE_FinalizedExports) { + .ordinal_low = ordinal_low, + .named_exports = named_exports, + .ordinal_exports = ordinal_exports + }; } internal String8 @@ -214,34 +194,34 @@ pe_make_edata_obj(Arena *arena, ProfBegin("Virtual Offset Table"); { B8 *is_ordinal_bound = push_array(scratch.arena, B8, max_U16); - - for (U64 arr_idx = 0; arr_idx < ArrayCount(finalized_exports.all); arr_idx += 1) { - for (U64 exp_idx = 0; exp_idx < finalized_exports.all[arr_idx].count; exp_idx += 1) { + for EachElement(arr_idx, finalized_exports.all) { + for EachIndex(exp_idx, finalized_exports.all[arr_idx].count) { PE_ExportParse *exp = finalized_exports.all[arr_idx].v[exp_idx]; - if (is_ordinal_bound[exp->ordinal] == 0) { - // alloc only one slot per ordinal, so it's possible to map ordinal to a virtual offset - is_ordinal_bound[exp->ordinal] = 1; - // create slot for the ordinal virtual offset - U64 voff_offset = voff_table_sect->data.total_size; - U32 *voff = push_array(obj_writer->arena, U32, 1); - str8_list_push(obj_writer->arena, &voff_table_sect->data, str8_struct(voff)); + // export with this ordinal was already allocated + if (is_ordinal_bound[exp->ordinal]) { continue; } + is_ordinal_bound[exp->ordinal] = 1; - COFF_ObjSymbol *exp_symbol; - if (exp->is_forwarder) { - U64 forwarder_name_offset = string_table_sect->data.total_size; - String8 forwarder_name_cstr = push_cstr(obj_writer->arena, exp->name); - str8_list_push(obj_writer->arena, &string_table_sect->data, forwarder_name_cstr); - // symbol to the name string - exp_symbol = coff_obj_writer_push_symbol_static(obj_writer, exp->name, forwarder_name_offset, string_table_sect); - } else { - // function or global var symbol - exp_symbol = coff_obj_writer_push_symbol_undef(obj_writer, exp->name); - } - - U16 ordinal_nb = exp->ordinal - finalized_exports.ordinal_low; - coff_obj_writer_section_push_reloc_voff(obj_writer, voff_table_sect, ordinal_nb*sizeof(U32), exp_symbol); + // create symbol for the export address table entry + COFF_ObjSymbol *exp_symbol; + if (exp->is_forwarder) { + // symbol to the forwarder string + U64 fwd_name_offset = string_table_sect->data.total_size; + str8_list_push(obj_writer->arena, &string_table_sect->data, push_cstr(obj_writer->arena, exp->name)); + exp_symbol = coff_obj_writer_push_symbol_static(obj_writer, exp->name, fwd_name_offset, string_table_sect); + } else { + // function or data symbol + exp_symbol = coff_obj_writer_push_symbol_undef(obj_writer, exp->name); } + + // create slot for the ordinal virtual offset + U64 voff_offset = voff_table_sect->data.total_size; + U32 *voff = push_array(obj_writer->arena, U32, 1); + str8_list_push(obj_writer->arena, &voff_table_sect->data, str8_struct(voff)); + + // ordinal is an index into the export address table + U16 ordinal_nb = exp->ordinal - finalized_exports.ordinal_low; + coff_obj_writer_section_push_reloc_voff(obj_writer, voff_table_sect, ordinal_nb*sizeof(U32), exp_symbol); } } } diff --git a/src/pe/pe_make_export_table.h b/src/pe/pe_make_export_table.h index 6b3d1ff8..5fa08335 100644 --- a/src/pe/pe_make_export_table.h +++ b/src/pe/pe_make_export_table.h @@ -45,11 +45,10 @@ typedef struct PE_FinalizedExports union { struct { PE_ExportParsePtrArray named_exports; - PE_ExportParsePtrArray forwarder_exports; PE_ExportParsePtrArray ordinal_exports; }; - PE_ExportParsePtrArray exports_with_names[2]; - PE_ExportParsePtrArray all[3]; + PE_ExportParsePtrArray exports_with_names[1]; + PE_ExportParsePtrArray all[2]; }; } PE_FinalizedExports; From f330bde8aae1c8667fbc71ae56285b74faa112b3 Mon Sep 17 00:00:00 2001 From: Martins Mozeiko Date: Fri, 16 Jan 2026 16:40:30 -0800 Subject: [PATCH 140/850] better callstack for null calls This improves callstack in win32 unhandled exception handler when indirect call to NULL happens. Before no call stack was printed at all, so it was hard to know what happened. Now call stack explicitly will print out [NULL] stack entry + rest of call stack entries. This is done by manually looking up return address from call stack when possible. Also fixes wine compatibility for os_commit function. Wine does not support RIO buffer functions. --- src/os/core/win32/os_core_win32.c | 58 +++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 6e681f0e..8aaf0fda 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -208,7 +208,11 @@ internal B32 os_commit(void *ptr, U64 size) { B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0); - w32_rio_functions.RIODeregisterBuffer(w32_rio_functions.RIORegisterBuffer(ptr, size)); + if (w32_rio_functions.RIORegisterBuffer) + { + // wine does not implement these functions + w32_rio_functions.RIODeregisterBuffer(w32_rio_functions.RIORegisterBuffer(ptr, size)); + } return result; } @@ -1565,7 +1569,43 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) #else # error Arch not supported! #endif - + +#if BUILD_CONSOLE_INTERFACE + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); +#else + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, + L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" + L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); +#endif + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); + + U64 frame_offset = 0; + + if (frame.AddrPC.Offset == 0) + { + // if IP address is 0 then most likely we have called indirectly on NULL function pointer + // which means no useful stack unwinding will happen, because there's no unwind info for address 0 + // but we can try reading 8 bytes of return address from stack, and start unwinding there + + ULONG_PTR hi, lo; + GetCurrentThreadStackLimits(&lo, &hi); + if (frame.AddrStack.Offset >= lo && frame.AddrStack.Offset <= hi - sizeof(void*)) + { + frame.AddrPC.Offset = *(DWORD64*)frame.AddrStack.Offset - 1; + frame.AddrStack.Offset += sizeof(void*); +#if defined(_M_AMD64) + context->Rip = frame.AddrPC.Offset; + context->Rsp = frame.AddrStack.Offset; +#elif defined(_M_ARM64) + context->Pc = frame.AddrPC.Offset; + context->Sp = frame.AddrStack.Offset; +#endif + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"1. [NULL]\n"); + frame_offset = 1; + } + for(U32 idx=0; ;idx++) { const U32 max_frames = 32; @@ -1586,19 +1626,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) break; } - if(idx==0) - { -#if BUILD_CONSOLE_INTERFACE - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); -#else - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, - L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" - L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); -#endif - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", idx + 1, address); + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", frame_offset + idx + 1, address); struct { SYMBOL_INFOW info; From a13afb441ed89561055fd46312d5d908b0f6e452 Mon Sep 17 00:00:00 2001 From: Martins Mozeiko Date: Tue, 3 Feb 2026 12:57:23 -0800 Subject: [PATCH 141/850] fixes issues with minidump on win32 minidump did not have proper exception record passed in, so it did not contain actual issue of the unhandled exception. Also stack walking before was mutating registers in exception CONTEXT, this means that minidump did not have proper call stack anymore. Now code make a local copy of CONTEXT for stack walking. --- src/os/core/win32/os_core_win32.c | 61 ++++++++++++++++++++----------- src/os/core/win32/os_core_win32.h | 2 +- src/os/gfx/win32/os_gfx_win32.h | 2 - 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 8aaf0fda..59b8f176 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1521,7 +1521,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) { HANDLE process = GetCurrentProcess(); HANDLE thread = GetCurrentThread(); - CONTEXT* context = exception_ptrs->ContextRecord; + CONTEXT context = *exception_ptrs->ContextRecord; WCHAR module_path[MAX_PATH]; GetModuleFileNameW(NULL, module_path, ArrayCount(module_path)); @@ -1552,19 +1552,19 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) DWORD image_type; #if defined(_M_AMD64) image_type = IMAGE_FILE_MACHINE_AMD64; - frame.AddrPC.Offset = context->Rip; + frame.AddrPC.Offset = context.Rip; frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Rbp; + frame.AddrFrame.Offset = context.Rbp; frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Rsp; + frame.AddrStack.Offset = context.Rsp; frame.AddrStack.Mode = AddrModeFlat; #elif defined(_M_ARM64) image_type = IMAGE_FILE_MACHINE_ARM64; - frame.AddrPC.Offset = context->Pc; + frame.AddrPC.Offset = context.Pc; frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Fp; + frame.AddrFrame.Offset = context.Fp; frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Sp; + frame.AddrStack.Offset = context.Sp; frame.AddrStack.Mode = AddrModeFlat; #else # error Arch not supported! @@ -1594,11 +1594,11 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) frame.AddrPC.Offset = *(DWORD64*)frame.AddrStack.Offset - 1; frame.AddrStack.Offset += sizeof(void*); #if defined(_M_AMD64) - context->Rip = frame.AddrPC.Offset; - context->Rsp = frame.AddrStack.Offset; + context.Rip = frame.AddrPC.Offset; + context.Rsp = frame.AddrStack.Offset; #elif defined(_M_ARM64) - context->Pc = frame.AddrPC.Offset; - context->Sp = frame.AddrStack.Offset; + context.Pc = frame.AddrPC.Offset; + context.Sp = frame.AddrStack.Offset; #endif } @@ -1615,7 +1615,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) break; } - if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) + if(!dbg_StackWalk64(image_type, process, thread, &frame, &context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) { break; } @@ -1692,15 +1692,33 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) if(dbg_MiniDumpWriteDump && generate_crash_dump) { - WCHAR desktop_path[512] = {0}; - SHGetFolderPathW(0, CSIDL_DESKTOP, 0, 0, desktop_path); - WCHAR dump_file_path[512] = {0}; - wnsprintfW(dump_file_path, ArrayCount(dump_file_path), L"%s\\raddbg_crash_dump.dmp", desktop_path); - SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0}; - HANDLE file = CreateFileW(dump_file_path, GENERIC_WRITE, 0, &security_attributes, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); - BOOL dump_successful = dbg_MiniDumpWriteDump(GetCurrentProcess(), os_get_process_info()->pid, file, MiniDumpNormal, 0, 0, 0); - CloseHandle(file); - (void)dump_successful; + WCHAR dump_file_path[MAX_PATH] = {0}; + SHGetFolderPathW(0, CSIDL_DESKTOP, 0, 0, dump_file_path); + PathAppendW(dump_file_path, L"raddbg_crash_dump.dmp"); + HANDLE file = CreateFileW(dump_file_path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + if (file != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info = {0}; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception_ptrs; + info.ClientPointers = FALSE; + BOOL dump_successful = dbg_MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, MiniDumpNormal, &info, 0, 0); + CloseHandle(file); + + if (dump_successful) + { +#if !BUILD_CONSOLE_INTERFACE + // opens explorer and selects file + SFGAOF flags = 0; + PIDLIST_ABSOLUTE list = 0; + if (SUCCEEDED(SHParseDisplayName(dump_file_path, NULL, &list, 0, &flags))) + { + SHOpenFolderAndSelectItems(list, 0, NULL, 0); + CoTaskMemFree(list); + } +#endif + } + } } ExitProcess(1); @@ -1890,6 +1908,7 @@ int wmain(int argc, WCHAR **argv) #else int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) { + CoInitializeEx(0, COINIT_APARTMENTTHREADED); w32_entry_point_caller(__argc, __wargv); return 0; } diff --git a/src/os/core/win32/os_core_win32.h b/src/os/core/win32/os_core_win32.h index 777961c0..a15a223c 100644 --- a/src/os/core/win32/os_core_win32.h +++ b/src/os/core/win32/os_core_win32.h @@ -16,7 +16,7 @@ #include #include #pragma comment(lib, "user32") -#pragma comment(lib, "winmm") +#pragma comment(lib, "ole32") #pragma comment(lib, "shell32") #pragma comment(lib, "advapi32") #pragma comment(lib, "rpcrt4") diff --git a/src/os/gfx/win32/os_gfx_win32.h b/src/os/gfx/win32/os_gfx_win32.h index 8737055d..82c03278 100644 --- a/src/os/gfx/win32/os_gfx_win32.h +++ b/src/os/gfx/win32/os_gfx_win32.h @@ -13,8 +13,6 @@ #pragma comment(lib, "gdi32") #pragma comment(lib, "dwmapi") #pragma comment(lib, "UxTheme") -#pragma comment(lib, "ole32") -#pragma comment(lib, "user32") #pragma comment(lib, "comdlg32") #ifndef WM_NCUAHDRAWCAPTION #define WM_NCUAHDRAWCAPTION (0x00AE) From 2071e31f2963e1d80665b3e7aab112ac48afcc08 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 27 Jan 2026 15:22:23 -0800 Subject: [PATCH 142/850] refactor bad read handling in DWARF parser --- src/base/base_core.h | 2 + src/dwarf/dwarf_parse.c | 290 ++++++++++------------------------------ 2 files changed, 73 insertions(+), 219 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index 8eeb9ab1..03e05dd4 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -439,6 +439,8 @@ C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t s # define this_function_name __func__ #endif +#define TryRead(func, cursor, label) do { U64 size = (func); if (size == 0) { goto label; } cursor += size; } while (0) + //////////////////////////////// //~ rjf: Base Types diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index cdb65070..2c07ffe9 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -2389,7 +2389,7 @@ dw_read_line_file_array(Arena *arena, table_out->v = push_array(arena, DW_LineFile, table_count); U64 i, cursor; - for (i = 0, cursor = off; i < table_count; ++i) { + for (i = 0, cursor = off; i < table_count; i += 1) { U64 bytes_read = dw_read_line_file(data, cursor, input, @@ -2401,9 +2401,7 @@ dw_read_line_file_array(Arena *arena, enc_count, enc_arr, &table_out->v[i]); - if (bytes_read == 0) { - break; - } + if (bytes_read == 0) { break; } cursor += bytes_read; } @@ -2446,91 +2444,48 @@ dw_read_line_vm_header(Arena *arena, // read unit version DW_Version version = DW_Version_Null; - U64 version_size = str8_deserial_read_struct(unit_data, unit_cursor, &version); - if (version_size == 0) { - goto exit; - } - unit_cursor += version_size; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &version), unit_cursor, exit); // read DWARF5 address & segment selector U8 address_size = 0; U8 segsel_size = 0; if (version == DW_Version_5) { - U64 address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &address_size); - if (address_size_size == 0) { - goto exit; - } - unit_cursor += address_size_size; - - U64 segsel_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &segsel_size); - if (segsel_size_size == 0) { - goto exit; - } - unit_cursor += segsel_size_size; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &address_size), unit_cursor, exit); + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &segsel_size), unit_cursor, exit); } else { address_size = cu_address_size; } // read header length U64 header_length = 0; - U64 header_length_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, format, &header_length); - if (header_length_size == 0) { - goto exit; - } - unit_cursor += header_length_size; + TryRead(str8_deserial_read_dwarf_uint(unit_data, unit_cursor, format, &header_length), unit_cursor, exit); // read min instruction length U8 min_inst_len = 0; - U64 min_inst_len_size = str8_deserial_read_struct(unit_data, unit_cursor, &min_inst_len); - if (min_inst_len_size == 0) { - goto exit; - } - unit_cursor += min_inst_len_size; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &min_inst_len), unit_cursor, exit); // read max operands for instruction U8 max_ops_for_inst = 1; if (version > DW_Version_3) { - U64 max_ops_for_inst_size = str8_deserial_read_struct(unit_data, unit_cursor, &max_ops_for_inst); - if (max_ops_for_inst_size == 0) { - goto exit; - } - unit_cursor += max_ops_for_inst_size; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &max_ops_for_inst), unit_cursor, exit); } Assert(max_ops_for_inst > 0); - U8 default_is_stmt = 0; - U64 default_is_stmt_size = str8_deserial_read_struct(unit_data, unit_cursor, &default_is_stmt); - if (default_is_stmt_size == 0) { - goto exit; - } - unit_cursor += default_is_stmt_size; + U8 default_is_stmt = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &default_is_stmt), unit_cursor, exit); - S8 line_base = 0; - U64 line_base_size = str8_deserial_read_struct(unit_data, unit_cursor, &line_base); - if (line_base_size == 0) { - goto exit; - } - unit_cursor += line_base_size; + S8 line_base = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &line_base), unit_cursor, exit); - U8 line_range = 0; - U64 line_range_size = str8_deserial_read_struct(unit_data, unit_cursor, &line_range); - if (line_range_size == 0) { - goto exit; - } - unit_cursor += line_range_size; + U8 line_range = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &line_range), unit_cursor, exit); - U8 opcode_base = 0; - U64 opcode_base_size = str8_deserial_read_struct(unit_data, unit_cursor, &opcode_base); - if (opcode_base_size == 0) { - goto exit; - } - unit_cursor += opcode_base_size; + U8 opcode_base = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &opcode_base), unit_cursor, exit); U64 num_opcode_lens = opcode_base > 0 ? opcode_base - 1 : 0; U8 *opcode_lens = str8_deserial_get_raw_ptr(unit_data, unit_cursor, num_opcode_lens * sizeof(opcode_lens[0])); - if (opcode_lens == 0) { - goto exit; - } + if (opcode_lens == 0) { goto exit; } unit_cursor += num_opcode_lens * sizeof(opcode_lens[0]); DW_LineVMFileArray dir_table = {0}; @@ -2549,10 +2504,7 @@ dw_read_line_vm_header(Arena *arena, // parse additional directories for (; unit_cursor < unit_data.size; ) { String8 dir = {0}; - unit_cursor += str8_deserial_read_cstr(unit_data, unit_cursor, &dir); - if (dir.size == 0) { - break; - } + TryRead(str8_deserial_read_cstr(unit_data, unit_cursor, &dir), unit_cursor, exit); DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1); node->file.file_name = dir; @@ -2573,31 +2525,16 @@ dw_read_line_vm_header(Arena *arena, // read file table for (; unit_cursor < unit_data.size; ) { String8 file_name = {0}; - unit_cursor += str8_deserial_read_cstr(unit_data, unit_cursor, &file_name); - if (file_name.size == 0) { - break; - } + TryRead(str8_deserial_read_cstr(unit_data, unit_cursor, &file_name), unit_cursor, exit); - U64 dir_index = 0; - U64 dir_index_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &dir_index); - if (dir_index_size == 0) { - goto exit; - } - unit_cursor += dir_index_size; + U64 dir_index = 0; + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &dir_index), unit_cursor, exit); - U64 modify_time = 0; - U64 modify_time_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &modify_time); - if (modify_time_size == 0) { - goto exit; - } - unit_cursor += modify_time_size; + U64 modify_time = 0; + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &modify_time), unit_cursor, exit); - U64 file_size = 0; - U64 file_size_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &file_size); - if (file_size_size == 0) { - goto exit; - } - unit_cursor += file_size_size; + U64 file_size = 0; + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &file_size), unit_cursor, exit); DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1); node->file.file_name = file_name; @@ -2619,93 +2556,37 @@ dw_read_line_vm_header(Arena *arena, // directory table { // read table entry encoding count - U8 enc_count = 0; - U64 enc_count_size = str8_deserial_read_struct(unit_data, unit_cursor, &enc_count); - if (enc_count_size == 0) { - goto exit; - } - unit_cursor += enc_count_size; + U8 enc_count = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &enc_count), unit_cursor, exit); // read table entry encodings - U64 *enc_arr = 0; - U64 enc_arr_size = str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr); - if (enc_arr_size == 0) { - goto exit; - } - unit_cursor += enc_arr_size; + U64 *enc_arr = 0; + TryRead(str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr), unit_cursor, exit); // read table count - U64 table_count = 0; - U64 table_count_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &table_count); - if (table_count_size == 0) { - goto exit; - } - unit_cursor += table_count_size; + U64 table_count = 0; + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &table_count), unit_cursor, exit); // read table - U64 table_size = dw_read_line_file_array(arena, - unit_data, - unit_cursor, - input, - version, - format, - DW_Ext_All, - address_size, - cu_str_offsets, - enc_count, - enc_arr, - table_count, - &dir_table); - if (table_size == 0) { - goto exit; - } - unit_cursor += table_size; + TryRead(dw_read_line_file_array(arena, unit_data, unit_cursor, input, version, format, DW_Ext_All, address_size, cu_str_offsets, enc_count, enc_arr, table_count, &dir_table), unit_cursor, exit); } // file table { // read table entry encoding count - U8 enc_count = 0; - U64 enc_count_size = str8_deserial_read_struct(unit_data, unit_cursor, &enc_count); - if (enc_count == 0) { - goto exit; - } - unit_cursor += enc_count_size; + U8 enc_count = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &enc_count), unit_cursor, exit); // read table entry encodings U64 *enc_arr = 0; - U64 enc_arr_size = str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr); - if (enc_arr_size == 0) { - goto exit; - } - unit_cursor += enc_arr_size; + TryRead(str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr), unit_cursor, exit); // read table count - U64 table_count = 0; - U64 table_count_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &table_count); - if (table_count_size == 0) { - goto exit; - } - unit_cursor += table_count_size; + U64 table_count = 0; + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &table_count), unit_cursor, exit); // read table - U64 file_table_size = dw_read_line_file_array(arena, - unit_data, - unit_cursor, - input, - version, - format, - DW_Ext_All, - address_size, - cu_str_offsets, - enc_count, - enc_arr, - table_count, - &file_table); - if (file_table_size == 0) { - goto exit; - } - unit_cursor += file_table_size; + TryRead(dw_read_line_file_array(arena, unit_data, unit_cursor, input, version, format, DW_Ext_All, address_size, cu_str_offsets, enc_count, enc_arr, table_count, &file_table), unit_cursor, exit); } } @@ -2844,11 +2725,10 @@ dw_parsed_line_table_from_data(Arena *arena, //- rjf: VM loop; build output list DW_LineTableParseResult result = { .vm_header = vm_header }; B32 end_of_seq = 0; - B32 error = 0; - for (; !error && unit_cursor < unit_data.size; ) { + for (; unit_cursor < unit_data.size; ) { //- rjf: parse opcode U8 opcode = 0; - unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &opcode); + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &opcode), unit_cursor, exit); //- rjf: do opcode action switch (opcode) { @@ -2891,10 +2771,9 @@ dw_parsed_line_table_from_data(Arena *arena, U8 num_operands = vm_header.opcode_lens[opcode - 1]; for (U8 i = 0; i < num_operands; ++i) { U64 operand = 0; - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &operand); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &operand), unit_cursor, exit); } } else { - error = 1; goto exit; } } @@ -2916,25 +2795,25 @@ dw_parsed_line_table_from_data(Arena *arena, case DW_StdOpcode_AdvancePc: { U64 advance = 0; - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &advance); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &advance), unit_cursor, exit); dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst); } break; case DW_StdOpcode_AdvanceLine: { S64 s = 0; - unit_cursor += str8_deserial_read_sleb128(unit_data, unit_cursor, &s); + TryRead(str8_deserial_read_sleb128(unit_data, unit_cursor, &s), unit_cursor, exit); vm_state.line += s; } break; case DW_StdOpcode_SetFile: { U64 file_index = 0; - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &file_index); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &file_index), unit_cursor, exit); vm_state.file_index = file_index; } break; case DW_StdOpcode_SetColumn: { U64 column = 0; - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &column); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &column), unit_cursor, exit); vm_state.column = column; } break; @@ -2953,7 +2832,7 @@ dw_parsed_line_table_from_data(Arena *arena, case DW_StdOpcode_FixedAdvancePc: { U16 operand = 0; - unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &operand); + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &operand), unit_cursor, exit); vm_state.address += operand; vm_state.op_index = 0; } break; @@ -2968,18 +2847,18 @@ dw_parsed_line_table_from_data(Arena *arena, case DW_StdOpcode_SetIsa: { U64 v = 0; - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &v); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &v), unit_cursor, exit); vm_state.isa = v; } break; //- Extended opcodes case DW_StdOpcode_ExtendedOpcode: { U64 length = 0; - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &length); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &length), unit_cursor, exit); U64 extended_opl = unit_cursor + length; U8 extended_opcode = 0; - unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &extended_opcode); + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &extended_opcode), unit_cursor, exit); switch (extended_opcode) { case DW_ExtOpcode_EndSequence: { @@ -2994,7 +2873,7 @@ dw_parsed_line_table_from_data(Arena *arena, case DW_ExtOpcode_SetAddress: { U64 address = 0; - unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, vm_header.address_size, vm_header.address_size); + TryRead(str8_deserial_read(unit_data, unit_cursor, &address, vm_header.address_size, vm_header.address_size), unit_cursor, exit); vm_state.address = address; vm_state.op_index = 0; } break; @@ -3005,10 +2884,10 @@ dw_parsed_line_table_from_data(Arena *arena, U64 modify_time = 0; U64 file_size = 0; - unit_cursor += str8_deserial_read_cstr(unit_data, unit_cursor, &file_name); - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &dir_index); - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &modify_time); - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &file_size); + TryRead(str8_deserial_read_cstr(unit_data, unit_cursor, &file_name), unit_cursor, exit); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &dir_index), unit_cursor, exit); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &modify_time), unit_cursor, exit); + TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &file_size), unit_cursor, exit); // TODO(rjf): Not fully implemented. By the DWARF V4 spec, the above is // all that needs to be parsed, but the rest of the work that needs to @@ -3016,7 +2895,6 @@ dw_parsed_line_table_from_data(Arena *arena, // not implemented. // // See the DWARF V4 spec (June 10, 2010), page 122. - error = 1; AssertAlways(!"UNHANDLED DEFINE FILE!!!"); } break; @@ -3035,7 +2913,6 @@ dw_parsed_line_table_from_data(Arena *arena, } exit:; - return result; } @@ -3235,50 +3112,33 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) U64 cursor = format == DW_Format_32Bit ? 4 : 12; U64 cie_id = 0; - U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); - if (cie_id_size == 0) { goto exit; } - cursor += cie_id_size; + TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id), cursor, exit); U8 version = 0; - U64 version_size = str8_deserial_read_struct(data, cursor, &version); - if (version_size == 0) { goto exit; } - cursor += version_size; + TryRead(str8_deserial_read_struct(data, cursor, &version), cursor, exit); - String8 aug_string = {0}; - U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); - if (aug_string_size == 0) { goto exit; } - cursor += aug_string_size; + String8 aug_string = {0}; + TryRead(str8_deserial_read_cstr(data, cursor, &aug_string), cursor, exit); U8 address_size = 0; U8 segment_selector_size = 0; if (version >= DW_Version_4) { - U64 address_size_size = str8_deserial_read_struct(data, cursor, &address_size); - if (address_size_size == 0) { goto exit; } - cursor += address_size_size; - - U64 segment_selector_size_size = str8_deserial_read_struct(data, cursor, &segment_selector_size); - if (segment_selector_size_size == 0) { goto exit; } - cursor += segment_selector_size; + TryRead(str8_deserial_read_struct(data, cursor, &address_size), cursor, exit); + TryRead(str8_deserial_read_struct(data, cursor, &segment_selector_size), cursor, exit); } else { address_size = byte_size_from_arch(arch); } U64 code_align_factor = 0; - U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); - if (code_align_factor_size == 0) { goto exit; } - cursor += code_align_factor_size; + TryRead(str8_deserial_read_uleb128(data, cursor, &code_align_factor), cursor, exit); S64 data_align_factor = 0; - U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); - if (data_align_factor_size == 0) { goto exit; } - cursor += data_align_factor_size; + TryRead(str8_deserial_read_sleb128(data, cursor, &data_align_factor), cursor, exit); U64 ret_addr_reg = 0; U64 ret_addr_reg_size = 0; - if (version == DW_Version_1) { ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); } - else { ret_addr_reg_size = str8_deserial_read_uleb128(data, cursor, &ret_addr_reg); } - if (ret_addr_reg_size == 0) { goto exit; } - cursor += ret_addr_reg_size; + if (version == DW_Version_1) { TryRead(str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)), cursor, exit); } + else { TryRead(str8_deserial_read_uleb128(data, cursor, &ret_addr_reg), cursor, exit); } if (aug_string.size > 0) { goto exit; } @@ -3304,22 +3164,16 @@ dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out) U64 cursor = format == DW_Format_32Bit ? 4 : 12; // extract CIE pointer - U64 cie_pointer = 0; - U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer); - if (cie_pointer_size == 0) { goto exit; } - cursor += cie_pointer_size; + U64 cie_pointer = 0; + TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer), cursor, exit); // extract address of first instruction U64 pc_begin = 0; - U64 pc_begin_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin); - if (pc_begin_size == 0) { goto exit; } - cursor += pc_begin_size; + TryRead(dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin), cursor, exit); // extract instruction range size - U64 pc_range = 0; - U64 pc_range_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_range); - if (pc_range_size == 0) { goto exit; } - cursor += pc_range_size; + U64 pc_range = 0; + TryRead(dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_range), cursor, exit); // parse augmentation data String8 aug_data = str8_substr(data, rng_1u64(cursor, cursor + cie->aug_data.size)); @@ -3377,10 +3231,8 @@ dw_parse_cfa_inst(String8 data, U64 cursor = 0; // read opcode - DW_CFA_Opcode raw_opcode = 0; - U64 raw_opcode_size = str8_deserial_read_struct(data, cursor, &raw_opcode); - if (raw_opcode_size == 0) { goto exit; } - cursor += raw_opcode_size; + DW_CFA_Opcode raw_opcode = 0; + TryRead(str8_deserial_read_struct(data, cursor, &raw_opcode), cursor, exit); // decode opcode implicit operand U64 opcode = raw_opcode & ~DW_CFA_Mask_OpcodeHi; From 82169462a4c300c27560bd94c2df249a810fbd5b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 27 Jan 2026 17:13:38 -0800 Subject: [PATCH 143/850] detect variable length array in upper bound and lower bound --- src/dwarf/dwarf.c | 19 +++++++++++ src/dwarf/dwarf.h | 2 ++ src/dwarf/dwarf_parse.c | 22 ++++++++++-- src/dwarf/dwarf_parse.h | 4 ++- src/rdi_from_dwarf/rdi_from_dwarf.c | 52 ++++++++++++++++++++--------- src/rdi_from_dwarf/rdi_from_dwarf.h | 8 +++++ 6 files changed, 87 insertions(+), 20 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index b71be5dd..ca78ab5e 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -256,6 +256,25 @@ dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attr return are_compat; } +internal B32 +dw_is_form_kind_ref(DW_Version ver, DW_Ext ext, DW_FormKind form_kind) +{ + B32 is_ref = 0; + if (form_kind == DW_Form_RefAddr || + form_kind == DW_Form_Ref1 || + form_kind == DW_Form_Ref2 || + form_kind == DW_Form_Ref4 || + form_kind == DW_Form_Ref8 || + form_kind == DW_Form_RefUData) { + is_ref = 1; + } else { + if (ext == DW_Ext_GNU) { + is_ref = DW_Form_GNU_RefAlt; + } + } + return is_ref; +} + internal String8 dw_name_string_from_section_kind(DW_SectionKind k) { diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index a5ac02f0..53e28221 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1724,6 +1724,8 @@ internal DW_AttribClass dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKi internal B32 dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind); +internal B32 dw_is_form_kind_ref(DW_Version ver, DW_Ext ext, DW_FormKind form_kind); + //- Section Names internal String8 dw_name_string_from_section_kind (DW_SectionKind k); diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 2c07ffe9..0523407d 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -1139,7 +1139,7 @@ dw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form f form_kind == DW_Form_Ref4 || form_kind == DW_Form_Ref8 || form_kind == DW_Form_RefUData) { ref.cu = cu; - ref.info_off = form.ref; + ref.info_off = cu->info_range.min + form.ref; } else if (form_kind == DW_Form_RefAddr) { NotImplemented; } else if (form_kind == DW_Form_RefSig8) { @@ -1987,7 +1987,7 @@ dw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind k if (attrib_class == DW_AttribClass_Const || attrib_class == DW_AttribClass_Block) { if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Type)) { Temp scratch = scratch_begin(0,0); - DW_Reference type_ref = dw_ref_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Type); + DW_Reference type_ref = dw_ref_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Type); DW_Tag type_tag = {0}; dw_read_tag_cu(scratch.arena, input, type_ref.cu, type_ref.info_off, &type_tag); U64 type_byte_size = dw_byte_size_from_tag(input, cu, type_tag); @@ -2009,6 +2009,22 @@ dw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind k return result; } +internal B32 +dw_is_attrib_var_ref(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + B32 is_var_ref = 0; + if (dw_is_form_kind_ref(cu->version, cu->ext, attrib->form_kind)) { + Temp scratch = scratch_begin(0,0); + DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); + DW_Tag ref_tag = {0}; + if (dw_read_tag_cu(scratch.arena, input, ref.cu, ref.info_off, &ref_tag)) { + is_var_ref = ref_tag.kind == DW_TagKind_Variable; + } + scratch_end(scratch); + } + return is_var_ref; +} + internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed) { @@ -2164,7 +2180,7 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 cu.address_size = address_size; cu.abbrev_off = abbrev_base; cu.info_range = range; - cu.first_tag_info_off = range.min + cursor; + cu.first_tag_info_off = cursor; cu.abbrev_table = abbrev_table; cu.abbrev_data = abbrev_data; cu.addr_lu = addr_lu; diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index 4d17e932..d9770072 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -317,7 +317,7 @@ typedef struct DW_PubStringsTable typedef struct DW_Reference { DW_CompUnit *cu; - U64 info_off; + U64 info_off; // global .debug_info offset } DW_Reference; //////////////////////////////// @@ -521,6 +521,8 @@ internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Input *input, DW_Co internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal B32 dw_is_attrib_var_ref(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); + // compile unit internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index cccaa0c4..30fa1a4c 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1,11 +1,9 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -// TODO: -// -// [ ] Currently converter relies on clang's -gdwarf-aranges to generate compile unit ranges, -// however it is optional and in case it is missing converter has to generate the ranges from scopes. -// [ ] Error handling +//////////////////////////////// + +thread_static D2R_Log g_d2r_log; //////////////////////////////// @@ -2092,6 +2090,8 @@ d2r_convert_types(Arena *arena, type->direct_type = direct_type; } break; case DW_TagKind_ArrayType: { + B32 error = 1; + // * DWARF vs RDI Array Type Graph * // // For example lets take following decl: @@ -2118,15 +2118,19 @@ d2r_convert_types(Arena *arena, struct SubrangeNode *subrange_stack = 0; for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) { if (n->tag.kind != DW_TagKind_SubrangeType) { - // TODO: error handling - AssertAlways(!"unexpected tag"); - continue; + d2r_log("[%llx] while scanning for DW_TagKind_SubrangeType found an unexpected child tag %S @ %llx\n", tag.info_off, dw_string_from_tag_kind(g_d2r_log.arena, n->tag.kind), n->tag.info_off); + goto array_type_exit; } // resolve lower bound U64 lower_bound = 0; if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_LowerBound)) { - lower_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_LowerBound); + B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_LowerBound)); + if (is_vla) { + d2r_log("[%llx] TODO: lower bound is a variable\n", n->tag.info_off); + } else { + lower_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_LowerBound); + } } else { lower_bound = dw_pick_default_lower_bound(cu_lang); } @@ -2137,9 +2141,14 @@ d2r_convert_types(Arena *arena, U64 count = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_Count); upper_bound = lower_bound + count; } else if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_UpperBound)) { - upper_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_UpperBound); - // turn upper bound into exclusive range - upper_bound += 1; + B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_UpperBound)); + if (is_vla) { + d2r_log("[%llx] TODO: upper bound is a variable\n", n->tag.info_off); + goto array_type_exit; + } else { + upper_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_UpperBound); + upper_bound += 1; // turn upper bound into exclusive range + } } else { // zero sized array } @@ -2167,6 +2176,15 @@ d2r_convert_types(Arena *arena, direct_type = t; } + error = 0; + array_type_exit:; + + // in case of an error, assign null to the array type + if (error) { + Assert(d2r_type_from_offset(type_table, tag.info_off) == 0); // this should the first time this type is being parsed + hash_table_push_u64_raw(arena, type_table->ht, tag.info_off, type_table->builtin_types[RDI_TypeKind_NULL]); + } + d2r_tag_iterator_skip_children(it); } break; case DW_TagKind_SubrangeType: { @@ -2577,6 +2595,8 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); if (lane_idx() == 0) { + g_d2r_log.arena = arena_alloc(); + //////////////////////////////// ProfBegin("compute exe hash"); @@ -2786,10 +2806,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) Temp comp_temp = temp_begin(scratch.arena); DW_CompUnit *cu = &cu_arr[cu_idx]; - - // parse and build tag tree - DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu); - + // skip DWO { if (cu->dwo_id) { goto next_cu; } @@ -2801,6 +2818,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) if (gnu_dwo_name.size) { goto next_cu; } } + // parse and build tag tree + DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu); + // build (info offset -> tag) hash table to resolve tags with abstract origin cu->tag_ht = dw_make_tag_hash_table(comp_temp.arena, tag_tree); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 1af4c114..939daf17 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -3,6 +3,14 @@ #pragma once +typedef struct D2R_Log +{ + Arena *arena; + String8List v; +} D2R_Log; + +#define d2r_log(...) str8_list_pushf(g_d2r_log.arena, &g_d2r_log.v, __FILE__ ":" Stringify(__LINE__) " " __VA_ARGS__) + typedef struct D2R_ConvertParams D2R_ConvertParams; struct D2R_ConvertParams { From dec5258c324b36bf47c5f25df60ece7610089284 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 28 Jan 2026 11:20:08 -0800 Subject: [PATCH 144/850] piece opcodes do not pop the stack --- src/dwarf/dwarf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 53e28221..de5eb5f5 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1548,7 +1548,7 @@ typedef enum X(RegX, 0x90, 1, 0, 1, ULEB128, Null) \ X(FBReg, 0x91, 1, 0, 1, SLEB128, Null) \ X(BRegX, 0x92, 2, 0, 1, ULEB128, SLEB128) \ - X(Piece, 0x93, 1, 1, 0, ULEB128, Null) \ + X(Piece, 0x93, 1, 0, 0, ULEB128, Null) \ X(DerefSize, 0x94, 1, 1, 1, U8, Null) \ X(XDerefSize, 0x95, 1, 2, 1, U8, Null) \ X(Nop, 0x96, 0, 0, 0, Null, Null) \ @@ -1558,7 +1558,7 @@ typedef enum X(CallRef, 0x9a, 1, 0, 0, DwarfUInt,Null) \ X(FormTlsAddress, 0x9b, 0, 0, 1, Null, Null) \ X(CallFrameCfa, 0x9c, 0, 0, 1, Null, Null) \ - X(BitPiece, 0x9d, 2, 1, 0, ULEB128, ULEB128) + X(BitPiece, 0x9d, 2, 0, 0, ULEB128, ULEB128) #define DW_Expr_V4_XList \ X(ImplicitValue, 0x9e, 2, 0, 1, Block, Null) \ From c81eafb65622f02026e0d597af55b7d9e6df7a9c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 30 Jan 2026 23:02:18 -0800 Subject: [PATCH 145/850] fix memory poisoning for arenas allocated from an optional buffer --- src/base/base_arena.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 22778571..4e6cd0c0 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -37,8 +37,13 @@ arena_alloc_(ArenaParams *params) base = os_reserve(reserve_size); os_commit(base, commit_size); } + AsanPoisonMemoryRegion(base, commit_size); raddbg_annotate_vaddr_range(base, reserve_size, "arena %s:%i", params->allocation_site_file, params->allocation_site_line); } + else + { + AsanPoisonMemoryRegion(base, params->reserve_size); + } // rjf: panic on arena creation failure #if OS_FEATURE_GRAPHICAL @@ -50,6 +55,7 @@ arena_alloc_(ArenaParams *params) #endif // rjf: extract arena header & fill + AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE); Arena *arena = (Arena *)base; arena->current = arena; arena->flags = params->flags; @@ -64,8 +70,6 @@ arena_alloc_(ArenaParams *params) #if ARENA_FREE_LIST arena->free_last = 0; #endif - AsanPoisonMemoryRegion(base, commit_size); - AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE); return arena; } @@ -161,6 +165,7 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) { os_commit(cmt_ptr, cmt_size); } + AsanPoisonMemoryRegion(cmt_ptr, cmt_size); current->cmt = cmt_pst_clamped; } From 2ca68c103918ce00759bda7342484c208e246c9a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 30 Jan 2026 23:17:12 -0800 Subject: [PATCH 146/850] flush output buffer before formatting --- src/third_party/stb/stb_sprintf.h | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/third_party/stb/stb_sprintf.h b/src/third_party/stb/stb_sprintf.h index 55f95241..bc7d5fc5 100644 --- a/src/third_party/stb/stb_sprintf.h +++ b/src/third_party/stb/stb_sprintf.h @@ -635,6 +635,8 @@ cl = lg; \ case 'm': case 'M': { + stbsp__flush_cb(); + static const U64 one_kib = 1ull * 1024; static const U64 one_mib = 1ull * 1024 * 1024; static const U64 one_gib = 1ull * 1024 * 1024 * 1024; @@ -746,25 +748,9 @@ cl = lg; \ case 'r': { + stbsp__flush_cb(); Rng1U64 range = va_arg(va, Rng1U64); - *bf = '['; ++bf; - - U8 buffer[ARENA_HEADER_SIZE + 128]; - Arena *arena = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }); - - String8 min = str8_from_u64(arena, range.min, 16, 0, 0); - MemoryCopy(bf, min.str, min.size); - bf += min.size; - - *bf = ','; ++bf; - *bf = ' '; ++bf; - - arena_clear(arena); - String8 max = str8_from_u64(arena, range.max, 16, 0, 0); - MemoryCopy(bf, max.str, max.size); - bf += max.size; - - *bf = ')'; ++bf; + bf += STB_SPRINTF_DECORATE(sprintf)(bf, "[0x%llx, 0x%llx]", range.min, range.max); }break; // From 6d8cbe8e6015d5f3de410c0abf9095b227bc0585 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 3 Feb 2026 15:34:01 -0800 Subject: [PATCH 147/850] fix stack reference --- src/lib_rdi_make/rdi_make.c | 2 +- src/lib_rdi_make/rdi_make.h | 2 +- src/rdi_make/rdi_make_local.c | 13 +++++++------ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index e07100f6..961005f5 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -2131,7 +2131,7 @@ rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results) { RDIM_SerializedSectionBundle bundle; rdim_memzero_struct(&bundle); - bundle.sections[RDI_SectionKind_TopLevelInfo] = rdim_serialized_section_make_unpacked_struct(&results->top_level_info.top_level_info); + bundle.sections[RDI_SectionKind_TopLevelInfo] = rdim_serialized_section_make_unpacked_struct(results->top_level_info.top_level_info); bundle.sections[RDI_SectionKind_StringData] = rdim_serialized_section_make_unpacked_array(results->strings.string_data, results->strings.string_data_size); bundle.sections[RDI_SectionKind_StringTable] = rdim_serialized_section_make_unpacked_array(results->strings.string_offs, results->strings.string_offs_count); bundle.sections[RDI_SectionKind_IndexRuns] = rdim_serialized_section_make_unpacked_array(results->idx_runs.idx_runs, results->idx_runs.idx_count); diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 9eb8829d..fcc3f9fd 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1285,7 +1285,7 @@ struct RDIM_LineRec typedef struct RDIM_TopLevelInfoBakeResult RDIM_TopLevelInfoBakeResult; struct RDIM_TopLevelInfoBakeResult { - RDI_TopLevelInfo top_level_info; + RDI_TopLevelInfo *top_level_info; }; typedef struct RDIM_BinarySectionBakeResult RDIM_BinarySectionBakeResult; diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index c5658272..3d3e27b1 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2990,12 +2990,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { if(lane_idx() == lane_from_task_idx(0)) ProfScope("bake top level info") { - rdim_shared->baked_top_level_info.top_level_info.arch = params->top_level_info.arch; - rdim_shared->baked_top_level_info.top_level_info.exe_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.exe_name); - rdim_shared->baked_top_level_info.top_level_info.exe_hash = params->top_level_info.exe_hash; - rdim_shared->baked_top_level_info.top_level_info.voff_max = params->top_level_info.voff_max; - rdim_shared->baked_top_level_info.top_level_info.guid = params->top_level_info.guid; - rdim_shared->baked_top_level_info.top_level_info.producer_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.producer_name); + rdim_shared->baked_top_level_info.top_level_info = push_array(arena, RDI_TopLevelInfo, 1); + rdim_shared->baked_top_level_info.top_level_info->arch = params->top_level_info.arch; + rdim_shared->baked_top_level_info.top_level_info->exe_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.exe_name); + rdim_shared->baked_top_level_info.top_level_info->exe_hash = params->top_level_info.exe_hash; + rdim_shared->baked_top_level_info.top_level_info->voff_max = params->top_level_info.voff_max; + rdim_shared->baked_top_level_info.top_level_info->guid = params->top_level_info.guid; + rdim_shared->baked_top_level_info.top_level_info->producer_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.producer_name); } if(lane_idx() == lane_from_task_idx(1)) ProfScope("bake binary sections") { From 3d6ca7d6104269dc3644b6da78ae30cb26c69126 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 3 Feb 2026 15:34:31 -0800 Subject: [PATCH 148/850] indent macros --- src/lib_rdi_make/rdi_make.c | 84 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 961005f5..053392ce 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -5,51 +5,51 @@ //~ rjf: API Implementation Helper Macros #define RDIM_IdxedChunkListPush(arena, list, chunk_type, element_type, cap_value, result, ...) \ -element_type *result = 0;\ -do\ -{\ -chunk_type *n = list->last;\ -if(n == 0 || n->count >= n->cap)\ -{\ -n = rdim_push_array(arena, chunk_type, 1);\ -n->cap = cap_value;\ -n->base_idx = list->total_count;\ -__VA_ARGS__;\ -n->v = rdim_push_array_no_zero(arena, element_type, n->cap);\ -RDIM_SLLQueuePush(list->first, list->last, n);\ -list->chunk_count += 1;\ -}\ -result = &n->v[n->count];\ -result->chunk = n;\ -n->count += 1;\ -list->total_count += 1;\ -}while(0) + element_type *result = 0; \ + do \ + { \ + chunk_type *n = list->last; \ + if(n == 0 || n->count >= n->cap) \ + { \ + n = rdim_push_array(arena, chunk_type, 1); \ + n->cap = cap_value; \ + n->base_idx = list->total_count; \ + __VA_ARGS__; \ + n->v = rdim_push_array_no_zero(arena, element_type, n->cap); \ + RDIM_SLLQueuePush(list->first, list->last, n); \ + list->chunk_count += 1; \ + } \ + result = &n->v[n->count]; \ + result->chunk = n; \ + n->count += 1; \ + list->total_count += 1; \ + }while(0) -#define RDIM_IdxedChunkListElementGetIdx(ptr, result) \ -RDI_U64 idx = 0;\ -if(ptr != 0 && ptr->chunk != 0)\ -{\ -idx = ptr->chunk->base_idx + (ptr - ptr->chunk->v) + 1;\ -} +#define RDIM_IdxedChunkListElementGetIdx(ptr, result) \ + RDI_U64 idx = 0; \ + if(ptr != 0 && ptr->chunk != 0) \ + { \ + idx = ptr->chunk->base_idx + (ptr - ptr->chunk->v) + 1; \ + } #define RDIM_IdxedChunkListConcatInPlace(chunk_type, dst, to_push, ...) \ -for(chunk_type *n = to_push->first; n != 0; n = n->next)\ -{\ -n->base_idx += dst->total_count;\ -}\ -if(dst->last != 0 && to_push->first != 0)\ -{\ -dst->last->next = to_push->first;\ -dst->last = to_push->last;\ -dst->chunk_count += to_push->chunk_count;\ -dst->total_count += to_push->total_count;\ -__VA_ARGS__;\ -}\ -else if(dst->first == 0)\ -{\ -rdim_memcpy_struct(dst, to_push);\ -}\ -rdim_memzero_struct(to_push); + for(chunk_type *n = to_push->first; n != 0; n = n->next) \ + { \ + n->base_idx += dst->total_count; \ + } \ + if(dst->last != 0 && to_push->first != 0) \ + { \ + dst->last->next = to_push->first; \ + dst->last = to_push->last; \ + dst->chunk_count += to_push->chunk_count; \ + dst->total_count += to_push->total_count; \ + __VA_ARGS__; \ + } \ + else if(dst->first == 0) \ + { \ + rdim_memcpy_struct(dst, to_push); \ + } \ + rdim_memzero_struct(to_push); //////////////////////////////// //~ rjf: Basic Helpers From cd70b7e1ec7eac9156a1bf5eeb6a324f6da2b029 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 3 Feb 2026 15:45:59 -0800 Subject: [PATCH 149/850] define default debug macros for third party code --- build.bat | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.bat b/build.bat index 1f6dfe34..f3519851 100644 --- a/build.bat +++ b/build.bat @@ -67,14 +67,14 @@ if "%pgo%"=="1" ( :: --- Compile/Link Line Definitions ------------------------------------------ set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 -set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% -set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% +set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 /D_DEBUG %cl_common% %auto_compile_flags% +set cl_release= call cl /O2 /DBUILD_DEBUG=0 /DNDEBUG %cl_common% %auto_compile_flags% set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" /noexp /nocoffgrpinfo /opt:ref /opt:icf set cl_out= /out: set cl_linker= set clang_common= -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -mcx16 -msha -set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% -set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% +set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% +set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:icf set clang_out= -o set clang_linker= -Xlinker From 4f30f64914b668b8f5d2292ba643b30ee413edbc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 4 Feb 2026 14:01:29 -0800 Subject: [PATCH 150/850] switched to TryRead helper macro for parsing abbrev table and compile units --- src/base/base_core.h | 3 +- src/dwarf/dwarf.h | 76 +- src/dwarf/dwarf_parse.c | 1628 +++++++++++++++++---------------------- src/dwarf/dwarf_parse.h | 146 ++-- 4 files changed, 811 insertions(+), 1042 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index 03e05dd4..aa00a278 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -12,6 +12,7 @@ #include #include #include +#include //////////////////////////////// //~ rjf: Third Party Includes @@ -439,7 +440,7 @@ C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t s # define this_function_name __func__ #endif -#define TryRead(func, cursor, label) do { U64 size = (func); if (size == 0) { goto label; } cursor += size; } while (0) +#define TryRead(func__, cursor__, label__) do { U64 size__ = (func__); if (size__ == 0) { Assert(0 && "failed read"); goto label__; } cursor__ += size__; } while (0) //////////////////////////////// //~ rjf: Base Types diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index de5eb5f5..a098e521 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -151,12 +151,13 @@ typedef enum DW_InlKindEnum X(SetEpilogueBegin, 0x0B) \ X(SetIsa, 0x0C) \ -typedef enum DW_StdOpcode +typedef U8 DW_StdOpcode; +typedef enum DW_StdOpcodeEnum { #define X(_N,_ID) DW_StdOpcode_##_N = _ID, DW_StdOpcode_XList #undef X -} DW_StdOpcode; +} DW_StdOpcodeEnum; #define DW_ExtOpcode_XList \ X(Undefined, 0x00) \ @@ -167,12 +168,13 @@ typedef enum DW_StdOpcode X(UserLo, 0x80) \ X(UserHi, 0xff) -typedef enum DW_ExtOpcode +typedef U8 DW_ExtOpcode; +typedef enum DW_ExtOpcodeEnum { #define X(_N,_ID) DW_ExtOpcode_##_N = _ID, DW_ExtOpcode_XList #undef X -} DW_ExtOpcode; +} DW_ExtOpcodeEnum; #define DW_IDCaseKind_XList \ X(CaseSensitive, 0x00) \ @@ -1023,39 +1025,39 @@ typedef enum DW_FormEnum X(GNU_Denominator, 0x2304) \ X(GNU_Bias, 0x2305) -#define DW_AttribKind_ClassFlags_GNU_XList \ - X(GNU_Vector, DW_AttribClass_Flag) \ - X(GNU_GuardedBy, DW_AttribClass_Undefined) \ - X(GNU_PtGuardedBy, DW_AttribClass_Undefined) \ - X(GNU_Guarded, DW_AttribClass_Undefined) \ - X(GNU_PtGuarded, DW_AttribClass_Undefined) \ - X(GNU_LocksExcluded, DW_AttribClass_Undefined) \ - X(GNU_ExclusiveLocksRequired, DW_AttribClass_Undefined) \ - X(GNU_SharedLocksRequired, DW_AttribClass_Undefined) \ - X(GNU_OdrSignature, DW_AttribClass_Undefined) \ - X(GNU_TemplateName, DW_AttribClass_Undefined) \ - X(GNU_CallSiteValue, DW_AttribClass_ExprLoc) \ - X(GNU_CallSiteDataValue, DW_AttribClass_ExprLoc) \ - X(GNU_CallSiteTarget, DW_AttribClass_ExprLoc) \ - X(GNU_CallSiteTargetClobbered, DW_AttribClass_ExprLoc) \ - X(GNU_TailCall, DW_AttribClass_Flag) \ - X(GNU_AllTailCallsSites, DW_AttribClass_Flag) \ - X(GNU_AllCallSites, DW_AttribClass_Flag) \ - X(GNU_AllSourceCallSites, DW_AttribClass_Flag) \ - X(GNU_Macros, DW_AttribClass_Flag) \ - X(GNU_Deleted, DW_AttribClass_Undefined) \ - X(GNU_DwoName, DW_AttribClass_String) \ - X(GNU_DwoId, DW_AttribClass_Const) \ - X(GNU_RangesBase, DW_AttribClass_Undefined) \ - X(GNU_AddrBase, DW_AttribClass_AddrPtr) \ - X(GNU_PubNames, DW_AttribClass_Flag) \ - X(GNU_PubTypes, DW_AttribClass_Undefined) \ - X(GNU_Discriminator, DW_AttribClass_Const) \ - X(GNU_LocViews, DW_AttribClass_Undefined) \ - X(GNU_EntryView, DW_AttribClass_Undefined) \ - X(GNU_DescriptiveType, DW_AttribClass_Undefined) \ - X(GNU_Numerator, DW_AttribClass_Undefined) \ - X(GNU_Denominator, DW_AttribClass_Undefined) \ +#define DW_AttribKind_ClassFlags_GNU_XList \ + X(GNU_Vector, DW_AttribClass_Flag) \ + X(GNU_GuardedBy, DW_AttribClass_Undefined) \ + X(GNU_PtGuardedBy, DW_AttribClass_Undefined) \ + X(GNU_Guarded, DW_AttribClass_Undefined) \ + X(GNU_PtGuarded, DW_AttribClass_Undefined) \ + X(GNU_LocksExcluded, DW_AttribClass_Undefined) \ + X(GNU_ExclusiveLocksRequired, DW_AttribClass_Undefined) \ + X(GNU_SharedLocksRequired, DW_AttribClass_Undefined) \ + X(GNU_OdrSignature, DW_AttribClass_Undefined) \ + X(GNU_TemplateName, DW_AttribClass_Undefined) \ + X(GNU_CallSiteValue, DW_AttribClass_ExprLoc) \ + X(GNU_CallSiteDataValue, DW_AttribClass_ExprLoc) \ + X(GNU_CallSiteTarget, DW_AttribClass_ExprLoc) \ + X(GNU_CallSiteTargetClobbered, DW_AttribClass_ExprLoc) \ + X(GNU_TailCall, DW_AttribClass_Flag) \ + X(GNU_AllTailCallsSites, DW_AttribClass_Flag) \ + X(GNU_AllCallSites, DW_AttribClass_Flag) \ + X(GNU_AllSourceCallSites, DW_AttribClass_Flag) \ + X(GNU_Macros, DW_AttribClass_Flag) \ + X(GNU_Deleted, DW_AttribClass_Undefined) \ + X(GNU_DwoName, DW_AttribClass_String) \ + X(GNU_DwoId, DW_AttribClass_Const) \ + X(GNU_RangesBase, DW_AttribClass_Undefined) \ + X(GNU_AddrBase, DW_AttribClass_AddrPtr) \ + X(GNU_PubNames, DW_AttribClass_Flag) \ + X(GNU_PubTypes, DW_AttribClass_Undefined) \ + X(GNU_Discriminator, DW_AttribClass_Const) \ + X(GNU_LocViews, DW_AttribClass_LocListPtr) \ + X(GNU_EntryView, DW_AttribClass_Undefined) \ + X(GNU_DescriptiveType, DW_AttribClass_Undefined) \ + X(GNU_Numerator, DW_AttribClass_Undefined) \ + X(GNU_Denominator, DW_AttribClass_Undefined) \ X(GNU_Bias, DW_AttribClass_Undefined) //- Attributes LLVM diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 0523407d..b95cfddd 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -441,48 +441,29 @@ internal U64 dw_read_abbrev_tag(String8 data, U64 offset, DW_Abbrev *out_abbrev) { U64 total_bytes_read = 0; + U64 cursor = offset; - //- rjf: parse ID - U64 id_off = offset; - U64 sub_kind_off = id_off; - U64 id = 0; - { - U64 bytes_read = str8_deserial_read_uleb128(data, id_off, &id); - sub_kind_off += bytes_read; - total_bytes_read += bytes_read; - } - - //- rjf: parse sub-kind - U64 sub_kind = 0; - U64 next_off = sub_kind_off; - if(id != 0) - { - U64 bytes_read = str8_deserial_read_uleb128(data, sub_kind_off, &sub_kind); - next_off += bytes_read; - total_bytes_read += bytes_read; - } - - //- rjf: parse whether this tag has children + // read tag ID and kind + U64 id, kind; + TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); + + // read child flag U8 has_children = 0; - if(id != 0) - { - total_bytes_read += str8_deserial_read_struct(data, next_off, &has_children); + if (id != 0) { + TryRead(str8_deserial_read_struct(data, cursor, &has_children), cursor, exit); } - //- rjf: fill abbrev - if(out_abbrev != 0) - { - DW_Abbrev abbrev = {0}; - abbrev.kind = DW_Abbrev_Tag; - abbrev.sub_kind = sub_kind; - abbrev.id = id; - if(has_children) - { + if (out_abbrev != 0) { + DW_Abbrev abbrev = { .kind = DW_Abbrev_Tag, .sub_kind = kind, .id = id}; + if (has_children) { abbrev.flags |= DW_AbbrevFlag_HasChildren; } *out_abbrev = abbrev; } + total_bytes_read = cursor - offset; +exit:; return total_bytes_read; } @@ -490,122 +471,83 @@ internal U64 dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev) { U64 total_bytes_read = 0; + U64 cursor = offset; + + // read id and kind + U64 id, kind; + TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); - //- rjf: parse ID - U64 id_off = offset; - U64 sub_kind_off = id_off; - U64 id = 0; - { - U64 bytes_read = str8_deserial_read_uleb128(data, id_off, &id); - sub_kind_off += bytes_read; - total_bytes_read += bytes_read; - } - - //- rjf: parse sub-kind (form-kind) - U64 sub_kind = 0; - U64 next_off = sub_kind_off; - { - U64 bytes_read = str8_deserial_read_uleb128(data, sub_kind_off, &sub_kind); - next_off += bytes_read; - total_bytes_read += bytes_read; - } - - //- rjf: parse implicit const + // read implicit const U64 implicit_const = 0; - if(sub_kind == DW_Form_ImplicitConst) - { - U64 bytes_read = str8_deserial_read_uleb128(data, next_off, &implicit_const); - total_bytes_read += bytes_read; + if (kind == DW_Form_ImplicitConst) { + TryRead(str8_deserial_read_uleb128(data, cursor, &implicit_const), cursor, exit); } - //- rjf: fill abbrev - if(out_abbrev != 0) - { - DW_Abbrev abbrev = {0}; - abbrev.kind = DW_Abbrev_Attrib; - abbrev.sub_kind = sub_kind; - abbrev.id = id; - if(sub_kind == DW_Form_ImplicitConst) - { + if (out_abbrev != 0) { + DW_Abbrev abbrev = { .kind = DW_Abbrev_Attrib, .sub_kind = kind, .id = id }; + if (kind == DW_Form_ImplicitConst) { abbrev.flags |= DW_AbbrevFlag_HasImplicitConst; abbrev.const_value = implicit_const; } *out_abbrev = abbrev; } + total_bytes_read = cursor - offset; +exit:; return total_bytes_read; } internal DW_AbbrevTable -dw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_offset) +dw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_base) { - //- rjf: count the tags we have - U64 tag_count = 0; - for(U64 abbrev_read_off = abbrev_offset;;) - { + Temp temp = temp_begin(arena); + DW_AbbrevTable table = {0}; + B32 failed_to_make = 1; + + // count abbrev tags + for (U64 cursor = abbrev_base; cursor < abbrev_data.size; table.count += 1) { DW_Abbrev tag; - { - U64 bytes_read = dw_read_abbrev_tag(abbrev_data, abbrev_read_off, &tag); - abbrev_read_off += bytes_read; - if(bytes_read == 0 || tag.id == 0) - { - break; - } + TryRead(dw_read_abbrev_tag(abbrev_data, cursor, &tag), cursor, exit); + if (tag.id == 0) { break; } + + for (; cursor < abbrev_data.size; ) { + DW_Abbrev attrib; + TryRead(dw_read_abbrev_attrib(abbrev_data, cursor, &attrib), cursor, exit); + if(attrib.id == 0) { break; } } - for(;;) - { - DW_Abbrev attrib = {0}; - U64 bytes_read = dw_read_abbrev_attrib(abbrev_data, abbrev_read_off, &attrib); - abbrev_read_off += bytes_read; - if(bytes_read == 0 || attrib.id == 0) - { - break; - } - } - tag_count += 1; } - - //- rjf: build table - DW_AbbrevTable table = {0}; - table.count = tag_count; - table.entries = push_array(arena, DW_AbbrevTableEntry, table.count); - MemorySet(table.entries, 0, sizeof(DW_AbbrevTableEntry)*table.count); - - U64 tag_idx = 0; - for(U64 abbrev_read_off = abbrev_offset;;) - { - U64 tag_abbrev_off = abbrev_read_off; + + // alloc entries + table.entries = push_array(arena, DW_AbbrevTableEntry, table.count); + table.count = 0; + + // fill out the table + for (U64 cursor = abbrev_base; cursor < abbrev_data.size;) { + U64 tag_abbrev_off = cursor; - DW_Abbrev tag; - { - U64 bytes_read = dw_read_abbrev_tag(abbrev_data, abbrev_read_off, &tag); - abbrev_read_off += bytes_read; - if(bytes_read == 0 || tag.id == 0) - { - break; - } - } + DW_Abbrev tag = {0}; + TryRead(dw_read_abbrev_tag(abbrev_data, cursor, &tag), cursor, exit); + if (tag.id == 0) { break; } - // rjf: insert this tag into the table - { - table.entries[tag_idx].id = tag.id; - table.entries[tag_idx].off = tag_abbrev_off; - tag_idx += 1; - } + // push new entry + table.entries[table.count].id = tag.id; + table.entries[table.count].off = tag_abbrev_off; + table.count += 1; - for(;;) - { + for (; cursor < abbrev_data.size ;) { DW_Abbrev attrib = {0}; - U64 bytes_read = dw_read_abbrev_attrib(abbrev_data, abbrev_read_off, &attrib); - abbrev_read_off += bytes_read; - if(bytes_read == 0 || attrib.id == 0) - { - break; - } + TryRead(dw_read_abbrev_attrib(abbrev_data, cursor, &attrib), cursor, exit); + if (attrib.id == 0) { break; } } - tag_count += 1; } + failed_to_make = 0; +exit:; + if (failed_to_make) { + MemoryZeroStruct(&table); + temp_end(temp); + } return table; } @@ -629,152 +571,127 @@ dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U64 abbrev_id) return abbrev_offset; } -internal U64 +internal B32 dw_read_form(String8 data, - U64 off, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, U64 implicit_const, - DW_Form *form_out) + DW_Form *form_out, + U64 *bytes_read_out) { - U64 bytes_read = 0; - DW_Form form = {0}; - + B32 is_ok = 0; + U64 cursor = 0; + DW_Form form = {0}; switch (form_kind) { case DW_Form_Null: break; - case DW_Form_Addr: { - bytes_read = str8_deserial_read_block(data, off, address_size, &form.addr); + TryRead(str8_deserial_read_block(data, cursor, address_size, &form.addr), cursor, exit); } break; case DW_Form_Block2: { U16 size = 0; - U64 size_size = str8_deserial_read_struct(data, off, &size); - if (size_size) { - U64 block_size = str8_deserial_read_block(data, off + size_size, size, &form.block); - if (block_size) { - bytes_read = size_size + block_size; - } - } + TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); } break; case DW_Form_Block4: { U32 size = 0; - U64 size_size = str8_deserial_read_struct(data, off, &size); - if (size_size) { - U64 block_size = str8_deserial_read_block(data, off + size_size, size, &form.block); - if (block_size) { - bytes_read = size_size + block_size; - } - } + TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor + cursor, size, &form.block), cursor, exit); } break; case DW_Form_Data2: { - bytes_read = str8_deserial_read_block(data, off, sizeof(U16), &form.data); + TryRead(str8_deserial_read_block(data, cursor, sizeof(U16), &form.data), cursor, exit); } break; case DW_Form_Data4: { - bytes_read = str8_deserial_read_block(data, off, sizeof(U32), &form.data); + TryRead(str8_deserial_read_block(data, cursor, sizeof(U32), &form.data), cursor, exit); } break; case DW_Form_Data8: { - bytes_read = str8_deserial_read_block(data, off, sizeof(U64), &form.data); + TryRead(str8_deserial_read_block(data, cursor, sizeof(U64), &form.data), cursor, exit); } break; case DW_Form_String: { - bytes_read = str8_deserial_read_cstr(data, off, &form.string); + TryRead(str8_deserial_read_cstr(data, cursor, &form.string), cursor, exit); } break; case DW_Form_Block: { U64 size = 0; - U64 size_size = str8_deserial_read_uleb128(data, off, &size); - if (size_size) { - U64 block_size = str8_deserial_read_block(data, off + size_size, size, &form.block); - if (block_size) { - bytes_read = size_size + block_size; - } - } + TryRead(str8_deserial_read_uleb128(data, cursor, &size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); } break; case DW_Form_Block1: { - U8 size = 0; - U64 size_size = str8_deserial_read_struct(data, off, &size); - if (size_size) { - U64 block_size = str8_deserial_read_block(data, off, size, &form.block); - if (block_size == size) { - bytes_read = size_size + block_size; - } - } + U8 size = 0; + TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); } break; case DW_Form_Data1: { - bytes_read = str8_deserial_read_block(data, off, sizeof(U8), &form.data); + TryRead(str8_deserial_read_block(data, cursor, sizeof(U8), &form.data), cursor, exit); } break; case DW_Form_Flag: { - bytes_read = str8_deserial_read_struct(data, off, &form.flag); + TryRead(str8_deserial_read_struct(data, cursor, &form.flag), cursor, exit); } break; case DW_Form_SData: { - bytes_read = str8_deserial_read_sleb128(data, off, &form.sdata); + TryRead(str8_deserial_read_sleb128(data, cursor, &form.sdata), cursor, exit); } break; case DW_Form_UData: { - bytes_read = str8_deserial_read_uleb128(data, off, &form.udata); + TryRead(str8_deserial_read_uleb128(data, cursor, &form.udata), cursor, exit); } break; case DW_Form_RefAddr: { if (version < DW_Version_3) { - bytes_read = str8_deserial_read(data, off, &form.ref, address_size, address_size); + TryRead(str8_deserial_read(data, cursor, &form.ref, address_size, address_size), cursor, exit); } else { - bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.ref); + TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.ref), cursor, exit); } } break; case DW_Form_GNU_RefAlt: { - bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.ref); + TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.ref), cursor, exit); } break; case DW_Form_Ref1: { - bytes_read = str8_deserial_read(data, off, &form.ref, 1, 1); + TryRead(str8_deserial_read(data, cursor, &form.ref, 1, 1), cursor, exit); } break; case DW_Form_Ref2: { - bytes_read = str8_deserial_read(data, off, &form.ref, 2, 2); + TryRead(str8_deserial_read(data, cursor, &form.ref, 2, 2), cursor, exit); } break; case DW_Form_Ref4: { - bytes_read = str8_deserial_read(data, off, &form.ref, 4, 4); + TryRead(str8_deserial_read(data, cursor, &form.ref, 4, 4), cursor, exit); } break; case DW_Form_Ref8: { - bytes_read = str8_deserial_read(data, off, &form.ref, 8, 8); + TryRead(str8_deserial_read(data, cursor, &form.ref, 8, 8), cursor, exit); } break; case DW_Form_RefUData: { - bytes_read = str8_deserial_read_uleb128(data, off, &form.ref); + TryRead(str8_deserial_read_uleb128(data, cursor, &form.ref), cursor, exit); } break; case DW_Form_SecOffset: case DW_Form_LineStrp: case DW_Form_GNU_StrpAlt: case DW_Form_Strp: { - bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.sec_offset); + TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.sec_offset), cursor, exit); } break; case DW_Form_ExprLoc: { - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, off, &expr_size); - if (expr_size_size) { - if (str8_deserial_read_block(data, off + expr_size_size, expr_size, &form.exprloc)) { - bytes_read = expr_size_size + expr_size; - } - } + U64 expr_size = 0; + TryRead(str8_deserial_read_uleb128(data, cursor, &expr_size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor, expr_size, &form.exprloc), cursor, exit); } break; case DW_Form_FlagPresent: { form.flag = 1; } break; case DW_Form_RefSig8: { //U64 ref = 0; - //bytes_read = str8_deserial_read_struct(data, off, &ref); + //cursor = str8_deserial_read_struct(data, cursor, &ref); NotImplemented; } break; case DW_Form_Addrx: case DW_Form_RngListx: case DW_Form_Strx: { - bytes_read = str8_deserial_read_uleb128(data, off, &form.xval); + TryRead(str8_deserial_read_uleb128(data, cursor, &form.xval), cursor, exit); } break; case DW_Form_RefSup4: { //U32 ref_sup4 = 0; - //bytes_read = str8_deserial_read_struct(data, off, &ref_sup4); + //cursor = str8_deserial_read_struct(data, cursor, &ref_sup4); NotImplemented; } break; case DW_Form_StrpSup: { - bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.strp_sup); + TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.strp_sup), cursor, exit); } break; case DW_Form_Data16: { - bytes_read = str8_deserial_read_block(data, off, 16, &form.data); + cursor = str8_deserial_read_block(data, cursor, 16, &form.data); } break; case DW_Form_ImplicitConst: { // Special case. @@ -783,34 +700,34 @@ dw_read_form(String8 data, form.implicit_const = implicit_const; } break; case DW_Form_LocListx: { - bytes_read = str8_deserial_read_uleb128(data, off, &form.xval); + TryRead(str8_deserial_read_uleb128(data, cursor, &form.xval), cursor, exit); } break; case DW_Form_RefSup8: { NotImplemented; } break; case DW_Form_Strx1: { - bytes_read = str8_deserial_read(data, off, &form.xval, 1, 1); + TryRead(str8_deserial_read(data, cursor, &form.xval, 1, 1), cursor, exit); } break; case DW_Form_Strx2: { - bytes_read = str8_deserial_read(data, off, &form.xval, 2, 2); + TryRead(str8_deserial_read(data, cursor, &form.xval, 2, 2), cursor, exit); } break; case DW_Form_Strx3: { - bytes_read = str8_deserial_read(data, off, &form.xval, 3, 3); + TryRead(str8_deserial_read(data, cursor, &form.xval, 3, 3), cursor, exit); } break; case DW_Form_Strx4: { - bytes_read = str8_deserial_read(data, off, &form.xval, 4, 4); + TryRead(str8_deserial_read(data, cursor, &form.xval, 4, 4), cursor, exit); } break; case DW_Form_Addrx1: { - bytes_read = str8_deserial_read(data, off, &form.xval, 1, 1); + TryRead(str8_deserial_read(data, cursor, &form.xval, 1, 1), cursor, exit); } break; case DW_Form_Addrx2: { - bytes_read = str8_deserial_read(data, off, &form.xval, 2, 2); + TryRead(str8_deserial_read(data, cursor, &form.xval, 2, 2), cursor, exit); } break; case DW_Form_Addrx3: { - bytes_read = str8_deserial_read(data, off, &form.xval, 3, 3); + TryRead(str8_deserial_read(data, cursor, &form.xval, 3, 3), cursor, exit); } break; case DW_Form_Addrx4: { - bytes_read = str8_deserial_read(data, off, &form.xval, 4, 4); + TryRead(str8_deserial_read(data, cursor, &form.xval, 4, 4), cursor, exit); } break; default: InvalidPath; break; } @@ -818,102 +735,121 @@ dw_read_form(String8 data, if (form_out) { *form_out = form; } + if (bytes_read_out) { + *bytes_read_out = cursor; + } - return bytes_read; + is_ok = 1; +exit:; + Assert(is_ok); + return is_ok; } internal U64 dw_read_tag(Arena *arena, - String8 tag_data, - U64 tag_off, - U64 tag_base, + DW_Input *input, DW_AbbrevTable abbrev_table, - String8 abbrev_data, DW_Version version, - DW_Format unit_format, + DW_Format format, U64 address_size, + Rng1U64 cu_info_range, + U64 tag_info_off, DW_Tag *tag_out) { - U64 tag_cursor = tag_off; + U64 bytes_read = 0; + + String8 info_data = input->sec[DW_Section_Info].data; + String8 abbrev_data = input->sec[DW_Section_Abbrev].data; + + String8 tag_data = str8_substr(info_data, cu_info_range); + U64 tag_cursor = tag_info_off - cu_info_range.min; // read tag abbrev id - U64 tag_abbrev_id = 0; - U64 tag_abbrev_id_size = str8_deserial_read_uleb128(tag_data, tag_cursor, &tag_abbrev_id); - Assert(tag_abbrev_id_size); - tag_cursor += tag_abbrev_id_size; - - // read tag abbrev - U64 abbrev_cursor = dw_abbrev_offset_from_abbrev_id(abbrev_table, tag_abbrev_id); - DW_Abbrev tag_abbrev = {0}; - U64 tag_abbrev_size = dw_read_abbrev_tag(abbrev_data, abbrev_cursor, &tag_abbrev); - - // read attribs - DW_AttribList attribs = {0}; - if (tag_abbrev_size > 0) { - abbrev_cursor += tag_abbrev_size; - + U64 tag_abbrev_id = 0; + TryRead(str8_deserial_read_uleb128(tag_data, tag_cursor, &tag_abbrev_id), tag_cursor, exit); + + B32 has_children = 0; + DW_TagKind tag_kind = DW_TagKind_Null; + DW_AttribList attribs = {0}; + if (tag_abbrev_id > 0) { + // map abbrev id -> .debug_abbrev offset + U64 abbrev_cursor = dw_abbrev_offset_from_abbrev_id(abbrev_table, tag_abbrev_id); + if (abbrev_cursor >= abbrev_data.size) { Assert(0 && "failed to find abbrev id"); goto exit; } + + // read tag abbrev + DW_Abbrev tag_abbrev = {0}; + TryRead(dw_read_abbrev_tag(abbrev_data, abbrev_cursor, &tag_abbrev), abbrev_cursor, exit); + + has_children = !!(tag_abbrev.flags & DW_AbbrevFlag_HasChildren); + tag_kind = (DW_TagKind)tag_abbrev.sub_kind; + + // read attribs for (; tag_cursor < tag_data.size && abbrev_cursor < abbrev_data.size; ) { U64 attrib_tag_cursor = tag_cursor; U64 attrib_abbrev_off = abbrev_cursor; - + // read attrib abbrev DW_Abbrev attrib_abbrev = {0}; - abbrev_cursor += dw_read_abbrev_attrib(abbrev_data, abbrev_cursor, &attrib_abbrev); - if (attrib_abbrev.id == 0) { - break; - } - + TryRead(dw_read_abbrev_attrib(abbrev_data, abbrev_cursor, &attrib_abbrev), abbrev_cursor, exit); + DW_AttribKind attrib_kind = (DW_AttribKind)attrib_abbrev.id; DW_FormKind form_kind = (DW_FormKind)attrib_abbrev.sub_kind; - + + // is this closing attrib? + if (attrib_kind == DW_AttribKind_Null) { break; } + // special case, allows producer to embed form in .debug_info if (form_kind == DW_Form_Indirect) { - U64 form_kind_size = str8_deserial_read_uleb128(tag_data, tag_cursor, &form_kind); - - if (form_kind_size == 0) { - Assert(!"unable to read indirect form kind"); - break; - } - - tag_cursor += form_kind_size; + TryRead(str8_deserial_read_uleb128(tag_data, tag_cursor, &form_kind), tag_cursor, exit); } - + // read form value - DW_Form form = {0}; - tag_cursor += dw_read_form(tag_data, tag_cursor, version, unit_format, address_size, form_kind, attrib_abbrev.const_value, &form); - + DW_Form form = {0}; + U64 form_size = 0; + if (!dw_read_form(str8_skip(tag_data, tag_cursor), version, format, address_size, form_kind, attrib_abbrev.const_value, &form, &form_size)) { + goto exit; + } + tag_cursor += form_size; + // fill out node DW_AttribNode *attrib_n = push_array(arena, DW_AttribNode, 1); - attrib_n->v.info_off = tag_base + attrib_tag_cursor; + attrib_n->v.info_off = tag_info_off + attrib_tag_cursor; attrib_n->v.abbrev_off = attrib_abbrev_off; attrib_n->v.abbrev_id = attrib_abbrev.id; attrib_n->v.attrib_kind = attrib_kind; attrib_n->v.form_kind = form_kind; attrib_n->v.form = form; - + // push node to list SLLQueuePush(attribs.first, attribs.last, attrib_n); - ++attribs.count; + attribs.count += 1; } } - + // fill out tag tag_out->abbrev_id = tag_abbrev_id; - tag_out->has_children = !!(tag_abbrev.flags & DW_AbbrevFlag_HasChildren); - tag_out->kind = (DW_TagKind)tag_abbrev.sub_kind; + tag_out->has_children = has_children; + tag_out->kind = tag_kind; tag_out->attribs = attribs; - tag_out->info_off = tag_base + tag_off; + tag_out->info_off = tag_info_off; - U64 bytes_read = tag_cursor - tag_off; + bytes_read = tag_cursor - (tag_info_off - cu_info_range.min); +exit:; return bytes_read; } internal U64 dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) { - String8 tag_data = str8_substr(input->sec[DW_Section_Info].data, cu->info_range); - U64 tag_off = info_off - cu->info_range.min; - return dw_read_tag(arena, tag_data, tag_off, cu->info_range.min, cu->abbrev_table, cu->abbrev_data, cu->version, cu->format, cu->address_size, tag_out); + return dw_read_tag(arena, + input, + cu->abbrev_table, + cu->version, + cu->format, + cu->address_size, + cu->info_range, + info_off, + tag_out); } internal B32 @@ -2026,196 +1962,143 @@ dw_is_attrib_var_ref(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal DW_CompUnit -dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed) +dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 cu_header_offset, B32 relaxed) { DW_CompUnit cu = {0}; - String8 info_data = input->sec[DW_Section_Info].data; - // read unit size in bytes U64 length = 0; - U64 length_size = str8_deserial_read_dwarf_packed_size(info_data, offset, &length); + U64 length_size = str8_deserial_read_dwarf_packed_size(input->sec[DW_Section_Info].data, cu_header_offset, &length); + if (length_size == 0) { goto exit; } - if (length_size) { - // compute unit range - Rng1U64 range = rng_1u64(offset, offset + length_size + length); - String8 data = str8_substr(info_data, range); - U64 cursor = length_size; - - // read version - DW_Version version = 0; - U64 version_size = str8_deserial_read_struct(data, cursor, &version); - cursor += version_size; - - if (version_size) { - DW_Format format = DW_FormatFromSize(length); - B32 is_header_ok = 0; - U64 abbrev_base = max_U64; - U8 address_size = 0; - DW_CompUnitKind unit_kind = DW_CompUnitKind_Reserved; - U64 spec_dwo_id = max_U64; - - switch (version) { - default: - case DW_Version_Null: - case DW_Version_1: - break; - case DW_Version_2: { - U32 abbrev_base32 = 0; - U64 abbrev_base_off = cursor; - U64 abbrev_base_size = str8_deserial_read_struct(data, abbrev_base_off, &abbrev_base32); - if (!abbrev_base_size) { - break; - } - - U64 address_size_off = abbrev_base_off + abbrev_base_size; - U64 address_size_size = str8_deserial_read_struct(data, address_size_off, &address_size); - if (!address_size_size) { - break; - } - - abbrev_base = abbrev_base32; - cursor = address_size_off + address_size_size; - is_header_ok = 1; - } break; - case DW_Version_3: - case DW_Version_4: { - U64 abbrev_base_off = cursor; - U64 abbrev_base_size = str8_deserial_read_dwarf_uint(data, abbrev_base_off, format, &abbrev_base); - if (!abbrev_base_size) { - break; - } - - U64 address_size_off = abbrev_base_off + abbrev_base_size; - U64 address_size_size = str8_deserial_read_struct(data, address_size_off, &address_size); - if (!address_size_size) { - break; - } - - cursor = address_size_off + address_size_size; - is_header_ok = 1; - } break; - case DW_Version_5: { - U64 unit_kind_off = cursor; - U64 unit_kind_size = str8_deserial_read_struct(data, unit_kind_off, &unit_kind); - if (unit_kind_size == 0) { - break; - } - - U64 address_size_off = unit_kind_off + unit_kind_size; - U64 address_size_size = str8_deserial_read_struct(data, address_size_off, &address_size); - if (!address_size_size) { - break; - } - - U64 abbrev_base_off = address_size_off + address_size_size; - U64 abbrev_base_size = str8_deserial_read_dwarf_uint(data, abbrev_base_off, format, &abbrev_base); - if (!abbrev_base_size) { - break; - } - - U64 spec_dwo_id_off = abbrev_base_off + abbrev_base_size; - U64 spec_dwo_id_size = 0; - if (unit_kind == DW_CompUnitKind_Skeleton || input->sec[DW_Section_Info].is_dwo) { - spec_dwo_id_size = str8_deserial_read_struct(data, spec_dwo_id_off, &spec_dwo_id); - if (!spec_dwo_id_size) { - break; - } - } - - cursor = spec_dwo_id_off + spec_dwo_id_size; - is_header_ok = 1; - } break; - } - - if (is_header_ok) { - Temp temp = temp_begin(arena); - - // TODO: cache abbrev tables with identical offsets - String8 abbrev_data = input->sec[DW_Section_Abbrev].data; - DW_AbbrevTable abbrev_table = dw_make_abbrev_table(arena, abbrev_data, abbrev_base); - - DW_Tag cu_tag = {0}; - dw_read_tag(arena, data, cursor, range.min, abbrev_table, abbrev_data, version, format, address_size, &cu_tag); - - // TODO: handle these unit types - Assert(cu_tag.kind != DW_TagKind_SkeletonUnit); - Assert(cu_tag.kind != DW_TagKind_TypeUnit); - - if (cu_tag.kind == DW_TagKind_CompileUnit || cu_tag.kind == DW_TagKind_PartialUnit) { - // fetch attribs for list sections - DW_Attrib *addr_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_AddrBase ); - DW_Attrib *str_offsets_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_StrOffsetsBase); - DW_Attrib *rnglists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_RngListsBase ); - DW_Attrib *loclists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LocListsBase ); - - // interp attribs as section offsets - U64 addr_sec_off = dw_interp_sec_offset(addr_base_attrib->form_kind, addr_base_attrib->form ); - U64 str_offsets_sec_off = dw_interp_sec_offset(str_offsets_base_attrib->form_kind, str_offsets_base_attrib->form); - U64 rnglists_sec_off = dw_interp_sec_offset(rnglists_base_attrib->form_kind, rnglists_base_attrib->form ); - U64 loclists_sec_off = dw_interp_sec_offset(loclists_base_attrib->form_kind, loclists_base_attrib->form ); - - // map section offset to unit index - U64 addr_lu_idx = rng_1u64_array_bsearch(lu_input.addr_ranges, addr_sec_off ); - U64 str_offsets_lu_idx = rng_1u64_array_bsearch(lu_input.str_offset_ranges, str_offsets_sec_off); - U64 rnglists_lu_idx = rng_1u64_array_bsearch(lu_input.rnglist_ranges, rnglists_sec_off ); - U64 loclists_lu_idx = rng_1u64_array_bsearch(lu_input.loclist_ranges, loclists_sec_off ); - - // map index to unit - DW_ListUnit *addr_lu = addr_lu_idx < lu_input.addr_count ? &lu_input.addrs[addr_lu_idx] : 0; - DW_ListUnit *str_offsets_lu = str_offsets_lu_idx < lu_input.str_offset_count ? &lu_input.str_offsets[str_offsets_lu_idx] : 0; - DW_ListUnit *rnglists_lu = rnglists_lu_idx < lu_input.rnglist_count ? &lu_input.rnglists[rnglists_lu_idx] : 0; - DW_ListUnit *loclists_lu = loclists_lu_idx < lu_input.loclist_count ? &lu_input.loclists[loclists_lu_idx] : 0; - - // find compile unit base address - DW_Attrib *low_pc_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LowPc); - U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form_kind, low_pc_attrib->form); - - // fill out compile unit - cu.relaxed = relaxed; - cu.ext = DW_Ext_All; - cu.kind = unit_kind; - cu.version = version; - cu.format = format; - cu.address_size = address_size; - cu.abbrev_off = abbrev_base; - cu.info_range = range; - cu.first_tag_info_off = cursor; - cu.abbrev_table = abbrev_table; - cu.abbrev_data = abbrev_data; - cu.addr_lu = addr_lu; - cu.str_offsets_lu = str_offsets_lu; - cu.rnglists_lu = rnglists_lu; - cu.loclists_lu = loclists_lu; - cu.low_pc = low_pc; - cu.tag = cu_tag; - } else { - // unexpected tag, release memory and exit - temp_end(temp); - } + // compute unit range + Rng1U64 info_range = rng_1u64(cu_header_offset, cu_header_offset + length_size + length); + String8 info = str8_substr(input->sec[DW_Section_Info].data, info_range); + U64 info_cursor = length_size; + + // read version + DW_Version version; + TryRead(str8_deserial_read_struct(info, info_cursor, &version), info_cursor, exit); + + DW_Format format = DW_FormatFromSize(length); + U64 abbrev_base = max_U64; + U8 address_size = 0; + DW_CompUnitKind unit_kind = DW_CompUnitKind_Reserved; + U64 spec_dwo_id = max_U64; + B32 is_header_ok = 0; + switch (version) { + default: + case DW_Version_Null: { + } break; + case DW_Version_1: { + NotImplemented; + } break; + case DW_Version_2: { + U32 abbrev_base32; + TryRead(str8_deserial_read_struct(info, info_cursor, &abbrev_base32), info_cursor, exit); + TryRead(str8_deserial_read_struct(info, info_cursor, &address_size), info_cursor, exit); + abbrev_base = abbrev_base32; + is_header_ok = 1; + } break; + case DW_Version_3: + case DW_Version_4: { + TryRead(str8_deserial_read_dwarf_uint(info, info_cursor, format, &abbrev_base), info_cursor, exit); + TryRead(str8_deserial_read_struct (info, info_cursor, &address_size), info_cursor, exit); + is_header_ok = 1; + } break; + case DW_Version_5: { + TryRead(str8_deserial_read_struct (info, info_cursor, &unit_kind), info_cursor, exit); + TryRead(str8_deserial_read_struct (info, info_cursor, &address_size), info_cursor, exit); + TryRead(str8_deserial_read_dwarf_uint(info, info_cursor, format, &abbrev_base), info_cursor, exit); + if (unit_kind == DW_CompUnitKind_Skeleton || input->sec[DW_Section_Info].is_dwo) { + TryRead(str8_deserial_read_struct(info, info_cursor, &spec_dwo_id), info_cursor, exit); } + is_header_ok = 1; + } break; + } + + U64 header_size = info_cursor; + + if (is_header_ok) { + Temp temp = temp_begin(arena); + + // TODO: cache abbrev tables with identical offsets + DW_AbbrevTable abbrev_table = dw_make_abbrev_table(arena, input->sec[DW_Section_Abbrev].data, abbrev_base); + + DW_Tag cu_tag = {0}; + dw_read_tag(arena, input, abbrev_table, version, format, address_size, info_range, cu_header_offset + header_size, &cu_tag); + + // TODO: handle these unit types + Assert(cu_tag.kind != DW_TagKind_SkeletonUnit); + Assert(cu_tag.kind != DW_TagKind_TypeUnit); + + if (cu_tag.kind != DW_TagKind_CompileUnit && cu_tag.kind != DW_TagKind_PartialUnit) { + // unexpected tag, release memory and exit + temp_end(temp); + goto exit; } + + // fetch attribs for list sections + DW_Attrib *addr_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_AddrBase ); + DW_Attrib *str_offsets_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_StrOffsetsBase); + DW_Attrib *rnglists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_RngListsBase ); + DW_Attrib *loclists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LocListsBase ); + + // interp attribs as section offsets + U64 addr_sec_off = dw_interp_sec_offset(addr_base_attrib->form_kind, addr_base_attrib->form ); + U64 str_offsets_sec_off = dw_interp_sec_offset(str_offsets_base_attrib->form_kind, str_offsets_base_attrib->form); + U64 rnglists_sec_off = dw_interp_sec_offset(rnglists_base_attrib->form_kind, rnglists_base_attrib->form ); + U64 loclists_sec_off = dw_interp_sec_offset(loclists_base_attrib->form_kind, loclists_base_attrib->form ); + + // map section offset to unit index + U64 addr_lu_idx = rng_1u64_array_bsearch(lu_input.addr_ranges, addr_sec_off ); + U64 str_offsets_lu_idx = rng_1u64_array_bsearch(lu_input.str_offset_ranges, str_offsets_sec_off); + U64 rnglists_lu_idx = rng_1u64_array_bsearch(lu_input.rnglist_ranges, rnglists_sec_off ); + U64 loclists_lu_idx = rng_1u64_array_bsearch(lu_input.loclist_ranges, loclists_sec_off ); + + // map index to unit + DW_ListUnit *addr_lu = addr_lu_idx < lu_input.addr_count ? &lu_input.addrs[addr_lu_idx] : 0; + DW_ListUnit *str_offsets_lu = str_offsets_lu_idx < lu_input.str_offset_count ? &lu_input.str_offsets[str_offsets_lu_idx] : 0; + DW_ListUnit *rnglists_lu = rnglists_lu_idx < lu_input.rnglist_count ? &lu_input.rnglists[rnglists_lu_idx] : 0; + DW_ListUnit *loclists_lu = loclists_lu_idx < lu_input.loclist_count ? &lu_input.loclists[loclists_lu_idx] : 0; + + // find compile unit base address + DW_Attrib *low_pc_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LowPc); + U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form_kind, low_pc_attrib->form); + + // fill out compile unit + cu.relaxed = relaxed; + cu.ext = DW_Ext_All; + cu.kind = unit_kind; + cu.version = version; + cu.format = format; + cu.address_size = address_size; + cu.abbrev_off = abbrev_base; + cu.info_range = info_range; + cu.first_tag_info_off = cu_header_offset + header_size; + cu.abbrev_table = abbrev_table; + cu.addr_lu = addr_lu; + cu.str_offsets_lu = str_offsets_lu; + cu.rnglists_lu = rnglists_lu; + cu.loclists_lu = loclists_lu; + cu.low_pc = low_pc; + cu.tag = cu_tag; } +exit:; return cu; } internal void -dw_tag_tree_from_data(Arena *arena, String8 info_data, String8 abbrev_data, DW_CompUnit *cu, DW_TagNode *parent, U64 *cursor, U64 *tag_count) +dw_tag_tree_from_data(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_TagNode *parent, U64 *cursor, U64 *tag_count) { - while (*cursor < info_data.size) { + while (*cursor < cu->info_range.max) { // read tag DW_Tag tag = {0}; - U64 tag_size = dw_read_tag(arena, info_data, *cursor, cu->info_range.min, cu->abbrev_table, abbrev_data, cu->version, cu->format, cu->address_size, &tag); - if (tag_size == 0) { - break; - } - *cursor += tag_size; + TryRead(dw_read_tag(arena, input, cu->abbrev_table, cu->version, cu->format, cu->address_size, cu->info_range, *cursor, &tag), *cursor, exit); - // is this sentinel tag? - if (tag.kind == DW_TagKind_Null) { - break; - } + // reached of the CU? + if (tag.kind == DW_TagKind_Null) { break; } // normal tag DW_TagNode *tag_n = push_array(arena, DW_TagNode, 1); @@ -2227,26 +2110,21 @@ dw_tag_tree_from_data(Arena *arena, String8 info_data, String8 abbrev_data, DW_C *tag_count += 1; if (tag.has_children) { - dw_tag_tree_from_data(arena, info_data, abbrev_data, cu, tag_n, cursor, tag_count); + dw_tag_tree_from_data(arena, input, cu, tag_n, cursor, tag_count); } } + exit:; } internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu) { - String8 abbrev_data = input->sec[DW_Section_Abbrev].data; - String8 info_data = str8_substr(input->sec[DW_Section_Info].data, cu->info_range); - DW_TagNode root = {0}; - U64 cursor = cu->first_tag_info_off; - U64 tag_count = 0; - dw_tag_tree_from_data(arena, info_data, abbrev_data, cu, &root, &cursor, &tag_count); - - DW_TagTree result = {0}; - result.root = root.first_child; - result.tag_count = tag_count; - - return result; + DW_TagNode root = {0}; + U64 cursor = cu->first_tag_info_off; + U64 tag_count = 0; + dw_tag_tree_from_data(arena, input, cu, &root, &cursor, &tag_count); + Assert(cursor == cu->info_range.max); + return (DW_TagTree){ .root = root.first_child, .tag_count = tag_count }; } internal HashTable * @@ -2305,139 +2183,10 @@ dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off) return tag_node; } -internal DW_LineVMFileArray -dw_line_vm_file_array_from_list(Arena *arena, DW_LineVMFileList list) -{ - DW_LineVMFileArray result = {0}; - result.count = 0; - result.v = push_array(arena, DW_LineFile, list.node_count); - - for (DW_LineVMFileNode *src = list.first; src != 0; src = src->next) { - DW_LineFile *dst = &result.v[result.count++]; - dst->file_name = push_str8_copy(arena, src->file.file_name); - dst->dir_idx = src->file.dir_idx; - dst->modify_time = src->file.modify_time; - dst->file_size = src->file.file_size; - } - - return result; -} - -internal U64 -dw_read_line_file(String8 data, - U64 off, - DW_Input *input, - DW_Version version, - DW_Format format, - DW_Ext ext, - U64 address_size, - DW_ListUnit *str_offsets, - U64 enc_count, - U64 *enc_arr, - DW_LineFile *line_file_out) -{ - MemoryZeroStruct(line_file_out); - U64 cursor = off; - for (U64 enc_idx = 0; enc_idx < enc_count; ++enc_idx) { - DW_LNCT lnct = enc_arr[enc_idx*2 + 0]; - DW_FormKind form_kind = enc_arr[enc_idx*2 + 1]; - DW_Form form = {0}; - U64 bytes_read = 0; - switch (lnct) { - case DW_LNCT_Path: { - bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form); - line_file_out->file_name = dw_interp_string(input, format, str_offsets, form_kind, form); - } break; - case DW_LNCT_DirectoryIndex: { - bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form); - line_file_out->dir_idx = dw_interp_const_u64(form_kind, form); - } break; - case DW_LNCT_TimeStamp: { - bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form); - line_file_out->modify_time = dw_interp_const_u64(form_kind, form); - } break; - case DW_LNCT_Size: { - bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form); - line_file_out->file_size = dw_interp_const_u64(form_kind, form); - } break; - case DW_LNCT_MD5: { - bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form); - line_file_out->md5_digest = dw_interp_const_u128(form_kind, form); - } break; - case DW_LNCT_LLVM_Source: { - if (ext & DW_Ext_LLVM) { - bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form); - line_file_out->source = dw_interp_string(input, format, str_offsets, form_kind, form); - } else { - Assert(!"extension not supported"); - } - } break; - default: { - bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form); - Assert(!"unexpected LNTC encoding"); - } break; - } - Assert(bytes_read); - cursor += bytes_read; - } - U64 bytes_read = cursor - off; - return bytes_read; -} - -internal U64 -dw_read_line_file_array(Arena *arena, - String8 data, - U64 off, - DW_Input *input, - DW_Version version, - DW_Format format, - DW_Ext ext, - U64 address_size, - DW_ListUnit *str_offsets, - U64 enc_count, - U64 *enc_arr, - U64 table_count, - DW_LineVMFileArray *table_out) -{ - Temp temp = temp_begin(arena); - - table_out->count = table_count; - table_out->v = push_array(arena, DW_LineFile, table_count); - - U64 i, cursor; - for (i = 0, cursor = off; i < table_count; i += 1) { - U64 bytes_read = dw_read_line_file(data, - cursor, - input, - version, - format, - ext, - address_size, - str_offsets, - enc_count, - enc_arr, - &table_out->v[i]); - if (bytes_read == 0) { break; } - cursor += bytes_read; - } - - U64 bytes_read = 0; - if (i == table_count) { - bytes_read = cursor - off; - } else { - temp_end(temp); - table_out->count = 0; - table_out->v = 0; - } - - return bytes_read; -} - internal U64 dw_read_line_vm_header(Arena *arena, - String8 line_data, - U64 line_off, DW_Input *input, + String8 cu_stmt_list, String8 cu_dir, String8 cu_name, U8 cu_address_size, @@ -2446,126 +2195,118 @@ dw_read_line_vm_header(Arena *arena, { Temp scratch = scratch_begin(&arena, 1); - U64 bytes_read = 0; - // read unit length - U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(line_data, line_off, &unit_length); + U64 length = 0; + U64 length_size = str8_deserial_read_dwarf_packed_size(cu_stmt_list, 0, &length); - U64 unit_opl = line_off + unit_length_size + unit_length; - Rng1U64 unit_range = rng_1u64(line_off, unit_opl); - DW_Format format = DW_FormatFromSize(unit_length); - U64 unit_cursor = unit_length_size; - String8 unit_data = str8_substr(line_data, unit_range); + DW_Format format = DW_FormatFromSize(length); + U64 cursor = length_size; + String8 data = str8_substr(cu_stmt_list, r1u64(0, length + length_size)); // read unit version DW_Version version = DW_Version_Null; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &version), unit_cursor, exit); + TryRead(str8_deserial_read_struct(data, cursor, &version), cursor, exit); // read DWARF5 address & segment selector - U8 address_size = 0; + U8 address_size = cu_address_size; U8 segsel_size = 0; if (version == DW_Version_5) { - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &address_size), unit_cursor, exit); - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &segsel_size), unit_cursor, exit); - } else { - address_size = cu_address_size; + TryRead(str8_deserial_read_struct(data, cursor, &address_size), cursor, exit); + TryRead(str8_deserial_read_struct(data, cursor, &segsel_size), cursor, exit); } - // read header length U64 header_length = 0; - TryRead(str8_deserial_read_dwarf_uint(unit_data, unit_cursor, format, &header_length), unit_cursor, exit); + TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &header_length), cursor, exit); + U64 line_program_off = cursor + header_length; - // read min instruction length - U8 min_inst_len = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &min_inst_len), unit_cursor, exit); + // substring header so we dont overread into the line program + data = str8_prefix(data, cursor + header_length); + + U8 min_inst_len = 0; + TryRead(str8_deserial_read_struct(data, cursor, &min_inst_len), cursor, exit); - // read max operands for instruction U8 max_ops_for_inst = 1; if (version > DW_Version_3) { - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &max_ops_for_inst), unit_cursor, exit); + TryRead(str8_deserial_read_struct(data, cursor, &max_ops_for_inst), cursor, exit); + Assert(max_ops_for_inst > 0); } - Assert(max_ops_for_inst > 0); U8 default_is_stmt = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &default_is_stmt), unit_cursor, exit); - + TryRead(str8_deserial_read_struct(data, cursor, &default_is_stmt), cursor, exit); + S8 line_base = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &line_base), unit_cursor, exit); - + TryRead(str8_deserial_read_struct(data, cursor, &line_base), cursor, exit); + U8 line_range = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &line_range), unit_cursor, exit); - + TryRead(str8_deserial_read_struct(data, cursor, &line_range), cursor, exit); + U8 opcode_base = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &opcode_base), unit_cursor, exit); - + TryRead(str8_deserial_read_struct(data, cursor, &opcode_base), cursor, exit); + U64 num_opcode_lens = opcode_base > 0 ? opcode_base - 1 : 0; - U8 *opcode_lens = str8_deserial_get_raw_ptr(unit_data, unit_cursor, num_opcode_lens * sizeof(opcode_lens[0])); - if (opcode_lens == 0) { goto exit; } - unit_cursor += num_opcode_lens * sizeof(opcode_lens[0]); + String8 opcode_lens; + TryRead(str8_deserial_read_block(data, cursor, num_opcode_lens * sizeof(U8), &opcode_lens), cursor, exit); - DW_LineVMFileArray dir_table = {0}; - DW_LineVMFileArray file_table = {0}; + String8Array dir_table = {0}; + DW_LineFileArray file_table = {0}; if (version < DW_Version_5) { // read directory table - DW_LineVMFileList dir_list = {0}; - { - // compile directory is always first in the table - DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1); - node->file.file_name = cu_dir; - SLLQueuePush(dir_list.first, dir_list.last, node); - ++dir_list.node_count; - } + String8List dir_list = {0}; + + // compile directory is always first in the table + str8_list_push(scratch.arena, &dir_list, cu_dir); // parse additional directories - for (; unit_cursor < unit_data.size; ) { + while (cursor < data.size) { String8 dir = {0}; - TryRead(str8_deserial_read_cstr(unit_data, unit_cursor, &dir), unit_cursor, exit); - - DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1); - node->file.file_name = dir; - SLLQueuePush(dir_list.first, dir_list.last, node); - ++dir_list.node_count; + TryRead(str8_deserial_read_cstr(data, cursor, &dir), cursor, exit); + if (dir.size == 0) { break; } + str8_list_push(scratch.arena, &dir_list, dir); } - DW_LineVMFileList file_list = {0}; + DW_LineFileList file_list = {0}; { // compile unit name is always first in the file table { - DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1); + DW_LineFileNode *node = push_array(scratch.arena, DW_LineFileNode, 1); node->file.file_name = cu_name; SLLQueuePush(file_list.first, file_list.last, node); - ++file_list.node_count; + file_list.node_count += 1; } // read file table - for (; unit_cursor < unit_data.size; ) { - String8 file_name = {0}; - TryRead(str8_deserial_read_cstr(unit_data, unit_cursor, &file_name), unit_cursor, exit); + while (cursor < data.size) { + U8 first_byte = 0; + if (str8_deserial_read_struct(data, cursor, &first_byte) == 0) { goto exit; } + if (first_byte == 0) { break; } + + DW_LineFile file = {0}; + TryRead(str8_deserial_read_cstr (data, cursor, &file.file_name), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.dir_idx), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.modify_time), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.file_size), cursor, exit); - U64 dir_index = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &dir_index), unit_cursor, exit); - - U64 modify_time = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &modify_time), unit_cursor, exit); - - U64 file_size = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &file_size), unit_cursor, exit); - - DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1); - node->file.file_name = file_name; - node->file.dir_idx = dir_index; - node->file.modify_time = modify_time; - node->file.file_size = file_size; + DW_LineFileNode *node = push_array(scratch.arena, DW_LineFileNode, 1); + node->file = file; SLLQueuePush(file_list.first, file_list.last, node); - ++file_list.node_count; + file_list.node_count += 1; } } - // list -> array - dir_table = dw_line_vm_file_array_from_list(arena, dir_list); - file_table = dw_line_vm_file_array_from_list(arena, file_list); + // dir list -> array + dir_table = str8_array_from_list(arena, &dir_list); + + // file list -> array + file_table.count = 0; + file_table.v = push_array(arena, DW_LineFile, file_list.node_count); + for EachNode(n, DW_LineFileNode, file_list.first) { + DW_LineFile *dst = &file_table.v[file_table.count++]; + dst->file_name = push_str8_copy(arena, n->file.file_name); + dst->dir_idx = n->file.dir_idx; + dst->modify_time = n->file.modify_time; + dst->file_size = n->file.file_size; + } } // DWARF5 else { @@ -2573,41 +2314,81 @@ dw_read_line_vm_header(Arena *arena, { // read table entry encoding count U8 enc_count = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &enc_count), unit_cursor, exit); + TryRead(str8_deserial_read_struct(data, cursor, &enc_count), cursor, exit); // read table entry encodings U64 *enc_arr = 0; - TryRead(str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr), unit_cursor, exit); + TryRead(str8_deserial_read_uleb128_array(scratch.arena, data, cursor, enc_count*2, &enc_arr), cursor, exit); // read table count U64 table_count = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &table_count), unit_cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &table_count), cursor, exit); + + // validate encoding + if (table_count > 0) { + if (enc_count != 1) { goto exit; } + if (enc_arr[0] != DW_LNCT_Path) { goto exit; } + } // read table - TryRead(dw_read_line_file_array(arena, unit_data, unit_cursor, input, version, format, DW_Ext_All, address_size, cu_str_offsets, enc_count, enc_arr, table_count, &dir_table), unit_cursor, exit); + dir_table.count = table_count; + dir_table.v = push_array(arena, String8, table_count); + for EachIndex(i, table_count) { + DW_FormKind form_kind = enc_arr[1]; + DW_Form form = {0}; + U64 form_size = 0; + if (!dw_read_form(str8_skip(data, cursor), version, format, address_size, form_kind, max_U64, &form, &form_size)) { goto exit; } + cursor += form_size; + dir_table.v[i] = dw_interp_string(input, format, cu_str_offsets, form_kind, form); + } } // file table { // read table entry encoding count U8 enc_count = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &enc_count), unit_cursor, exit); + TryRead(str8_deserial_read_struct(data, cursor, &enc_count), cursor, exit); // read table entry encodings U64 *enc_arr = 0; - TryRead(str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr), unit_cursor, exit); + TryRead(str8_deserial_read_uleb128_array(scratch.arena, data, cursor, enc_count*2, &enc_arr), cursor, exit); // read table count U64 table_count = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &table_count), unit_cursor, exit); - - // read table - TryRead(dw_read_line_file_array(arena, unit_data, unit_cursor, input, version, format, DW_Ext_All, address_size, cu_str_offsets, enc_count, enc_arr, table_count, &file_table), unit_cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &table_count), cursor, exit); + + file_table.count = table_count; + file_table.v = push_array(arena, DW_LineFile, table_count); + + for EachIndex(i, table_count) { + DW_LineFile *file = &file_table.v[i]; + for EachIndex(enc_idx, enc_count) { + DW_LNCT lnct = enc_arr[enc_idx*2 + 0]; + + DW_FormKind form_kind = enc_arr[enc_idx*2 + 1]; + DW_Form form = {0}; + U64 form_size = 0; + if (!dw_read_form(str8_skip(data, cursor), version, format, address_size, form_kind, max_U64, &form, &form_size)) { goto exit; } + cursor += form_size; + + switch (lnct) { + case DW_LNCT_Path: { file->file_name = dw_interp_string(input, format, cu_str_offsets, form_kind, form); } break; + case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form_kind, form); } break; + case DW_LNCT_TimeStamp: { file->modify_time = dw_interp_const_u64(form_kind, form); } break; + case DW_LNCT_Size: { file->file_size = dw_interp_const_u64(form_kind, form); } break; + case DW_LNCT_MD5: { file->md5_digest = dw_interp_const_u128(form_kind, form); } break; + case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form_kind, form); } break; + default: { + Assert(!"unexpected LNTC encoding"); + } break; + } + } + } } } if (header_out) { - header_out->unit_range = unit_range; + header_out->unit_length = length_size + length; header_out->version = version; header_out->address_size = address_size; header_out->segment_selector_size = segsel_size; @@ -2619,319 +2400,306 @@ dw_read_line_vm_header(Arena *arena, header_out->line_range = line_range; header_out->opcode_base = opcode_base; header_out->num_opcode_lens = num_opcode_lens; - header_out->opcode_lens = opcode_lens; + header_out->opcode_lens = opcode_lens.str; + header_out->line_program_off = line_program_off; header_out->dir_table = dir_table; header_out->file_table = file_table; } - bytes_read = unit_cursor; - exit:; scratch_end(scratch); - return bytes_read; + return cursor; +} + +internal DW_LineVM * +dw_line_vm_init(DW_Input *input, DW_CompUnit *cu) +{ + DW_LineVM *vm = 0; + + Arena *arena = arena_alloc(.reserve_size = KB(64), .commit_size = KB(1)); + + String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); + String8 cu_dir = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_CompDir); + String8 cu_name = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_Name); + + // read the line table header + DW_LineVMHeader header = {0}; + if ( ! dw_read_line_vm_header(arena, input, cu_stmt_list, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu, &header)) { goto exit; } + + vm = push_array(arena, DW_LineVM, 1); + *vm = (DW_LineVM){ + .arena = arena, + .cursor = header.line_program_off, + .program = str8_prefix(cu_stmt_list, header.unit_length), + .header = header, + .state.end_sequence = 1, + }; + + exit:; + if (vm == 0) { arena_release(arena); } + return vm; } internal void -dw_line_vm_reset(DW_LineVMState *state, B32 default_is_stmt) +dw_line_vm_release(DW_LineVM *vm) { - state->address = 0; - state->op_index = 0; - state->file_index = 1; - state->line = 1; - state->column = 0; - state->is_stmt = default_is_stmt; - state->basic_block = 0; - state->prologue_end = 0; - state->epilogue_begin = 0; - state->isa = 0; - state->discriminator = 0; + arena_release(vm->arena); } internal void -dw_line_vm_advance(DW_LineVMState *state, U64 advance, U64 min_inst_len, U64 max_ops_for_inst) +dw_line_vm_advance(DW_LineVM *vm, U64 advance) { - U64 op_index = state->op_index + advance; - state->address += min_inst_len*(op_index/max_ops_for_inst); - state->op_index = op_index % max_ops_for_inst; + U64 op_index = vm->state.op_index + advance; + vm->state.address += vm->header.min_inst_len * (op_index / vm->header.max_ops_for_inst); + vm->state.op_index = op_index % vm->header.max_ops_for_inst; + vm->advance = advance; } -internal DW_LineSeqNode * -dw_push_line_seq(Arena* arena, DW_LineTableParseResult *parsed_tbl) +internal B32 +dw_line_vm_step(DW_LineVM *vm) { - DW_LineSeqNode *new_seq = push_array(arena, DW_LineSeqNode, 1); - SLLQueuePush(parsed_tbl->first_seq, parsed_tbl->last_seq, new_seq); - parsed_tbl->seq_count += 1; - return new_seq; -} + B32 is_ok = 0; -internal DW_LineNode * -dw_push_line(Arena *arena, DW_LineTableParseResult *tbl, DW_LineVMState *vm_state, B32 start_of_sequence) -{ - DW_LineSeqNode *seq = tbl->last_seq; - if(seq == 0 || start_of_sequence) - { - seq = dw_push_line_seq(arena, tbl); + if (vm->cursor >= vm->program.size) { goto exit; } + + vm->new_line = 0; + + // reset VM state + if (vm->state.end_sequence) { + vm->state.address = 0; + vm->state.op_index = 0; + vm->state.file_index = 1; + vm->state.line = 1; + vm->state.column = 0; + vm->state.is_stmt = vm->header.default_is_stmt; + vm->state.basic_block = 0; + vm->state.end_sequence = 0; + vm->state.prologue_end = 0; + vm->state.epilogue_begin = 0; + vm->state.isa = 0; + vm->state.discriminator = 0; } - - DW_LineNode *n = push_array(arena, DW_LineNode, 1); - n->v.file_index = vm_state->file_index; - n->v.line = vm_state->line; - n->v.column = vm_state->column; - n->v.address = vm_state->address; - - SLLQueuePush(seq->first, seq->last, n); - seq->count += 1; - return n; + + // read opcode + TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &vm->opcode), vm->cursor, exit); + + // special opcodes + if (vm->opcode >= vm->header.opcode_base) { + U32 adjusted_opcode = (U32)(vm->opcode - vm->header.opcode_base); + U32 op_advance = adjusted_opcode / vm->header.line_range; + S32 line_advance = (S64)vm->header.line_base + ((S64)adjusted_opcode) % (S64)vm->header.line_range; + U64 addr_advance = vm->header.min_inst_len * ((vm->state.op_index + op_advance) / vm->header.max_ops_for_inst); + + if (vm->header.line_range > 0 && vm->header.max_ops_for_inst > 0) { + adjusted_opcode = (U32)(vm->opcode - vm->header.opcode_base); + op_advance = adjusted_opcode / vm->header.line_range; + line_advance = (S32)vm->header.line_base + ((S32)adjusted_opcode) % (S32)vm->header.line_range; + addr_advance = vm->header.min_inst_len * ((vm->state.op_index+op_advance) / vm->header.max_ops_for_inst); + } + + vm->state.address += addr_advance; + vm->state.op_index = (vm->state.op_index + op_advance) % vm->header.max_ops_for_inst; + vm->state.line = (U64)((S64)vm->state.line + line_advance); + vm->state.basic_block = 0; + vm->state.prologue_end = 0; + vm->state.epilogue_begin = 0; + vm->state.discriminator = 0; + + vm->line_advance = line_advance; + vm->addr_advance = addr_advance; + vm->new_line = 1; + } else { + // standard opcodes + switch (vm->opcode) { + case DW_StdOpcode_Copy: { + vm->new_line = 1; + + vm->state.discriminator = 0; + vm->state.basic_block = 0; + vm->state.prologue_end = 0; + vm->state.epilogue_begin = 0; + } break; + + case DW_StdOpcode_AdvancePc: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + dw_line_vm_advance(vm, vm->operands[0].u64); + } break; + + case DW_StdOpcode_AdvanceLine: { + TryRead(str8_deserial_read_sleb128(vm->program, vm->cursor, &vm->operands[0].s64), vm->cursor, exit); + vm->state.line += vm->operands[0].s64; + } break; + + case DW_StdOpcode_SetFile: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.file_index = vm->operands[0].u64; + } break; + + case DW_StdOpcode_SetColumn: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.column = vm->operands[0].u64; + } break; + + case DW_StdOpcode_NegateStmt: { + vm->state.is_stmt = !vm->state.is_stmt; + } break; + + case DW_StdOpcode_SetBasicBlock: { + vm->state.basic_block = 1; + } break; + + case DW_StdOpcode_ConstAddPc: { + U64 advance = (0xffu - vm->header.opcode_base) / vm->header.line_range; + dw_line_vm_advance(vm, advance); + } break; + + case DW_StdOpcode_FixedAdvancePc: { + TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.address += vm->operands[0].u64; + vm->state.op_index = 0; + } break; + + case DW_StdOpcode_SetPrologueEnd: { + vm->state.prologue_end = 1; + } break; + + case DW_StdOpcode_SetEpilogueBegin: { + vm->state.epilogue_begin = 1; + } break; + + case DW_StdOpcode_SetIsa: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.isa = vm->operands[0].u64; + } break; + + // extended opcodes + case DW_StdOpcode_ExtendedOpcode: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->ext_length), vm->cursor, exit); + + U64 extended_opl = vm->cursor + vm->ext_length; + + TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &vm->ext_opcode), vm->cursor, exit); + + switch (vm->ext_opcode) { + case DW_ExtOpcode_EndSequence: { + vm->new_seq = 1; + vm->new_line = 1; + vm->state.end_sequence = 1; + } break; + + case DW_ExtOpcode_SetAddress: { + TryRead(str8_deserial_read(vm->program, vm->cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), vm->cursor, exit); + vm->state.address = vm->operands[0].u64; + vm->state.op_index = 0; + } break; + + case DW_ExtOpcode_DefineFile: { + TryRead(str8_deserial_read_cstr (vm->program, vm->cursor, &vm->operands[0].string), vm->cursor, exit); // file name + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[1].u64), vm->cursor, exit); // dir index + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[2].u64), vm->cursor, exit); // modify time + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[3].u64), vm->cursor, exit); // file size + + if (vm->ext_file_ht == 0) { + vm->ext_file_ht = hash_table_init(vm->arena, 512); + } + + DW_LineFile *file = push_array(vm->arena, DW_LineFile, 1); + file->file_name = vm->operands[0].string; + file->dir_idx = vm->operands[1].u64; + file->modify_time = vm->operands[2].u64; + file->file_size = vm->operands[3].u64; + + if (hash_table_search_u64_raw(vm->ext_file_ht, vm->state.file_index) == 0) { + vm->error = push_str8f(vm->arena, "file with index %I64d was already defined", vm->state.file_index); + goto exit; + } + + hash_table_push_u64_raw(vm->arena, vm->ext_file_ht, vm->state.file_index, file); + } break; + + case DW_ExtOpcode_SetDiscriminator: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.discriminator = vm->operands[0].u64; + } break; + + default: { NotImplemented; } break; + } + + vm->cursor = extended_opl; + } break; + + default: { + // skip unknown opcode + if (0 == vm->opcode || vm->opcode > vm->header.num_opcode_lens) { goto exit; } + for EachIndex(i, vm->header.opcode_lens[vm->opcode - 1]) { + U64 v = 0; + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &v), vm->cursor, exit); + } + } break; + } + } + + is_ok = 1; + exit:; + return is_ok; +} + +internal DW_LineFile * +dw_line_vm_find_file(DW_LineVM *vm, U64 file_idx) +{ + DW_LineFile *file = 0; + if (file == 0 && file_idx < vm->header.file_table.count) { + file = &vm->header.file_table.v[file_idx]; + } else if (vm->ext_file_ht) { + file = hash_table_search_u64_raw(vm->ext_file_ht, file_idx); + } + return file; } internal String8 -dw_path_from_file(Arena *arena, DW_LineVMHeader *vm, DW_LineFile *file) +dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file) { Temp scratch = scratch_begin(&arena, 1); - String8 dir = vm->dir_table.v[file->dir_idx].file_name; - PathStyle style = path_style_from_str8(dir); + + // directory table must contain at least compile unit directory + Assert(dir_table.count > 0); + + // find directory and file name associated with the file index + String8 dir = dir_table.v[file->dir_idx]; + String8 file_name = file->file_name; + + // infer path style if directory is empty use file name + PathStyle style = path_style_from_str8(dir); if (style == PathStyle_Null || style == PathStyle_Relative) { style = path_style_from_str8(file->file_name); } String8List path_list = {0}; - - if (str8_match_lit("..", dir, StringMatchFlag_RightSideSloppy)) { - String8List comp_dir_list = str8_split_path(scratch.arena, vm->dir_table.v[0].file_name); - str8_list_concat_in_place(&path_list, &comp_dir_list); + { + // directories that start with ".." are relative to the compile unit directory + if (str8_match_lit("..", dir, StringMatchFlag_RightSideSloppy)) { + String8List comp_dir = str8_split_path(scratch.arena, dir_table.v[0]); + str8_list_concat_in_place(&path_list, &comp_dir); + } + + // push directory + String8List dir_list = str8_split_path(scratch.arena, dir); + str8_list_concat_in_place(&path_list, &dir_list); + + // push file name + str8_list_push(scratch.arena, &path_list, file->file_name); + + // resolve dots in the path + str8_path_list_resolve_dots_in_place(&path_list, style); } - - String8List dir_list = str8_split_path(scratch.arena, dir); - str8_list_concat_in_place(&path_list, &dir_list); - - str8_list_push(scratch.arena, &path_list, file->file_name); - - str8_path_list_resolve_dots_in_place(&path_list, style); - + + // join path String8 path = str8_path_list_join_by_style(arena, &path_list, style); scratch_end(scratch); return path; } -internal String8 -dw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx) -{ - return dw_path_from_file(arena, vm, &vm->file_table.v[file_idx]); -} - -internal DW_LineTableParseResult -dw_parsed_line_table_from_data(Arena *arena, - String8 unit_data, - DW_Input *input, - String8 cu_dir, - String8 cu_name, - U8 cu_address_size, - DW_ListUnit *cu_str_offsets) -{ - DW_LineVMHeader vm_header = {0}; - U64 vm_header_size = dw_read_line_vm_header(arena, unit_data, 0, input, cu_dir, cu_name, cu_address_size, cu_str_offsets, &vm_header); - - U64 unit_cursor = vm_header_size; - - //- rjf: prep state for VM - DW_LineVMState vm_state = {0}; - dw_line_vm_reset(&vm_state, vm_header.default_is_stmt); - - //- rjf: VM loop; build output list - DW_LineTableParseResult result = { .vm_header = vm_header }; - B32 end_of_seq = 0; - for (; unit_cursor < unit_data.size; ) { - //- rjf: parse opcode - U8 opcode = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &opcode), unit_cursor, exit); - - //- rjf: do opcode action - switch (opcode) { - default: { - //- rjf: special opcode case - if (opcode >= vm_header.opcode_base) { - U32 adjusted_opcode = (U32)(opcode - vm_header.opcode_base); - U32 op_advance = adjusted_opcode / vm_header.line_range; - S32 line_inc = (S32)vm_header.line_base + ((S32)adjusted_opcode) % (S32)vm_header.line_range; - // TODO: can we just call dw_advance_line_vm_state_pc - U64 addr_inc = vm_header.min_inst_len * ((vm_state.op_index+op_advance) / vm_header.max_ops_for_inst); - - vm_state.address += addr_inc; - vm_state.op_index = (vm_state.op_index + op_advance) % vm_header.max_ops_for_inst; - vm_state.line = (U32)((S32)vm_state.line + line_inc); - vm_state.basic_block = 0; - vm_state.prologue_end = 0; - vm_state.epilogue_begin = 0; - vm_state.discriminator = 0; - - if(vm_state.is_stmt) - { - dw_push_line(arena, &result, &vm_state, end_of_seq); - } - end_of_seq = 0; - -#if 0 - // NOTE(rjf): DWARF has dummy lines at the end of groups of line ranges, where we'd like - // to break line info into sequences. - if(vm_state.line == 0) - { - end_of_seq = 1; - } -#endif - } - // Skipping unknown opcode. This is a valid case and - // it works because compiler stores operand lengths. - else { - if (0 < opcode && opcode <= vm_header.num_opcode_lens) { - U8 num_operands = vm_header.opcode_lens[opcode - 1]; - for (U8 i = 0; i < num_operands; ++i) { - U64 operand = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &operand), unit_cursor, exit); - } - } else { - goto exit; - } - } - } break; - - //- Standard opcodes - - case DW_StdOpcode_Copy: { - if(vm_state.is_stmt) - { - dw_push_line(arena, &result, &vm_state, end_of_seq); - } - end_of_seq = 0; - vm_state.discriminator = 0; - vm_state.basic_block = 0; - vm_state.prologue_end = 0; - vm_state.epilogue_begin = 0; - } break; - - case DW_StdOpcode_AdvancePc: { - U64 advance = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &advance), unit_cursor, exit); - dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst); - } break; - - case DW_StdOpcode_AdvanceLine: { - S64 s = 0; - TryRead(str8_deserial_read_sleb128(unit_data, unit_cursor, &s), unit_cursor, exit); - vm_state.line += s; - } break; - - case DW_StdOpcode_SetFile: { - U64 file_index = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &file_index), unit_cursor, exit); - vm_state.file_index = file_index; - } break; - - case DW_StdOpcode_SetColumn: { - U64 column = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &column), unit_cursor, exit); - vm_state.column = column; - } break; - - case DW_StdOpcode_NegateStmt: { - vm_state.is_stmt = !vm_state.is_stmt; - } break; - - case DW_StdOpcode_SetBasicBlock: { - vm_state.basic_block = 1; - } break; - - case DW_StdOpcode_ConstAddPc: { - U64 advance = (0xffu - vm_header.opcode_base) / vm_header.line_range; - dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst); - } break; - - case DW_StdOpcode_FixedAdvancePc: { - U16 operand = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &operand), unit_cursor, exit); - vm_state.address += operand; - vm_state.op_index = 0; - } break; - - case DW_StdOpcode_SetPrologueEnd: { - vm_state.prologue_end = 1; - } break; - - case DW_StdOpcode_SetEpilogueBegin: { - vm_state.epilogue_begin = 1; - } break; - - case DW_StdOpcode_SetIsa: { - U64 v = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &v), unit_cursor, exit); - vm_state.isa = v; - } break; - - //- Extended opcodes - case DW_StdOpcode_ExtendedOpcode: { - U64 length = 0; - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &length), unit_cursor, exit); - - U64 extended_opl = unit_cursor + length; - U8 extended_opcode = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &extended_opcode), unit_cursor, exit); - - switch (extended_opcode) { - case DW_ExtOpcode_EndSequence: { - vm_state.end_sequence = 1; - if(vm_state.is_stmt) - { - dw_push_line(arena, &result, &vm_state, 0); - } - dw_line_vm_reset(&vm_state, vm_header.default_is_stmt); - end_of_seq = 1; - } break; - - case DW_ExtOpcode_SetAddress: { - U64 address = 0; - TryRead(str8_deserial_read(unit_data, unit_cursor, &address, vm_header.address_size, vm_header.address_size), unit_cursor, exit); - vm_state.address = address; - vm_state.op_index = 0; - } break; - - case DW_ExtOpcode_DefineFile: { - String8 file_name = {0}; - U64 dir_index = 0; - U64 modify_time = 0; - U64 file_size = 0; - - TryRead(str8_deserial_read_cstr(unit_data, unit_cursor, &file_name), unit_cursor, exit); - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &dir_index), unit_cursor, exit); - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &modify_time), unit_cursor, exit); - TryRead(str8_deserial_read_uleb128(unit_data, unit_cursor, &file_size), unit_cursor, exit); - - // TODO(rjf): Not fully implemented. By the DWARF V4 spec, the above is - // all that needs to be parsed, but the rest of the work that needs to - // happen here---allowing this file to be used by further opcodes---is - // not implemented. - // - // See the DWARF V4 spec (June 10, 2010), page 122. - AssertAlways(!"UNHANDLED DEFINE FILE!!!"); - } break; - - case DW_ExtOpcode_SetDiscriminator: { - U64 v = 0; - unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &v); - vm_state.discriminator = v; - } break; - - default: break; - } - - unit_cursor = extended_opl; - } break; - } - } - - exit:; - return result; -} - internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind) { @@ -3517,7 +3285,7 @@ dw_parse_cfa_inst_list(Arena *arena, { U64 pos = arena_pos(arena); DW_CFA_InstList list = {0}; - for (U64 cursor = 0, inst_size;; cursor += inst_size) { + for (U64 cursor = 0, inst_size; cursor < data.size; cursor += inst_size) { DW_CFA_Inst inst = {0}; DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(data, cursor), code_align_factor, data_align_factor, decode_ptr_func, decode_ptr_ud, &inst_size, &inst); if (error_code == DW_CFA_ParseErrorCode_End) { break; } diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index d9770072..d34d7e00 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -175,7 +175,6 @@ typedef struct DW_CompUnit Rng1U64 info_range; U64 first_tag_info_off; DW_AbbrevTable abbrev_table; - String8 abbrev_data; DW_ListUnit *addr_lu; DW_ListUnit *str_offsets_lu; DW_ListUnit *rnglists_lu; @@ -192,6 +191,8 @@ typedef struct DW_TagTree U64 tag_count; } DW_TagTree; +//////////////////////////////// + typedef struct DW_LineFile { String8 file_name; @@ -202,42 +203,43 @@ typedef struct DW_LineFile String8 source; } DW_LineFile; -typedef struct DW_LineVMFileNode +typedef struct DW_LineFileNode { - struct DW_LineVMFileNode *next; - DW_LineFile file; -} DW_LineVMFileNode; + struct DW_LineFileNode *next; + DW_LineFile file; +} DW_LineFileNode; -typedef struct DW_LineVMFileList +typedef struct DW_LineFileList { - U64 node_count; - DW_LineVMFileNode *first; - DW_LineVMFileNode *last; -} DW_LineVMFileList; + U64 node_count; + DW_LineFileNode *first; + DW_LineFileNode *last; +} DW_LineFileList; -typedef struct DW_LineVMFileArray +typedef struct DW_LineFileArray { U64 count; DW_LineFile *v; -} DW_LineVMFileArray; +} DW_LineFileArray; typedef struct DW_LineVMHeader { - Rng1U64 unit_range; - DW_Version version; - U8 address_size; // Duplicates size from the compilation unit but is needed to support stripped exe that just have .debug_line and .debug_line_str. - U8 segment_selector_size; - U64 header_length; - U8 min_inst_len; - U8 max_ops_for_inst; - U8 default_is_stmt; - S8 line_base; - U8 line_range; - U8 opcode_base; - U64 num_opcode_lens; - U8 *opcode_lens; - DW_LineVMFileArray dir_table; - DW_LineVMFileArray file_table; + U64 unit_length; + DW_Version version; + U8 address_size; // Duplicates size from the compilation unit but is needed to support stripped exe that just have .debug_line and .debug_line_str. + U8 segment_selector_size; + U64 header_length; + U8 min_inst_len; + U8 max_ops_for_inst; + U8 default_is_stmt; + S8 line_base; + U8 line_range; + U8 opcode_base; + U64 num_opcode_lens; + U8 *opcode_lens; + U64 line_program_off; + String8Array dir_table; + DW_LineFileArray file_table; } DW_LineVMHeader; typedef struct DW_LineVMState @@ -248,10 +250,10 @@ typedef struct DW_LineVMState // Line table doesn't contain full path to a file, instead // DWARF encodes path as two indices. First index will point into a directory // table, and second points into a file name table. - U32 file_index; + U64 file_index; - U32 line; - U32 column; + U64 line; + U64 column; B32 is_stmt; // Indicates that "address" points to place suitable for a breakpoint. B32 basic_block; // Indicates that the "address" is inside a basic block. @@ -267,35 +269,33 @@ typedef struct DW_LineVMState B32 end_sequence; // Indicates that "address" points to the first instruction in the instruction block that follows. } DW_LineVMState; -typedef struct DW_Line +typedef struct DW_LineVM { - U64 file_index; - U32 line; - U32 column; - U64 address; -} DW_Line; - -typedef struct DW_LineNode -{ - struct DW_LineNode *next; - DW_Line v; -} DW_LineNode; - -typedef struct DW_LineSeqNode -{ - struct DW_LineSeqNode *next; - U64 count; - DW_LineNode *first; - DW_LineNode *last; -} DW_LineSeqNode; - -typedef struct DW_LineTableParseResult -{ - DW_LineVMHeader vm_header; - U64 seq_count; - DW_LineSeqNode *first_seq; - DW_LineSeqNode *last_seq; -} DW_LineTableParseResult; + Arena *arena; + U64 cursor; + String8 program; + DW_LineVMHeader header; + B32 new_line; + B32 new_seq; + B32 skip_opcode; + DW_LineVMState state; + U64 advance; + U64 opcode_off; + DW_StdOpcode opcode; + DW_ExtOpcode ext_opcode; + U64 ext_length; + U64 line_advance; + U64 addr_advance; + HashTable *ext_file_ht; + struct { + union { + String8 string; + U64 u64; + S64 s64; + }; + } operands[4]; + String8 error; +} DW_LineVM; //////////////////////////////// // .debug_pubnames and .debug_pubtypes @@ -460,15 +460,16 @@ internal U64 dw_addr_from_list_unit (DW_ListUnit *lu, U64 index); // abbrev table -internal U64 dw_read_abbrev_tag (String8 data, U64 offset, DW_Abbrev *out_abbrev); -internal U64 dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev); -internal DW_AbbrevTable dw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 start_abbrev_off); +internal U64 dw_read_abbrev_tag (String8 data, U64 offset, DW_Abbrev *out_abbrev); +internal U64 dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev); + +internal DW_AbbrevTable dw_read_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_base); internal U64 dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U64 abbrev_id); // form and tag -internal U64 dw_read_form(String8 data, U64 off, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, U64 implicit_const, DW_Form *form_out); -internal U64 dw_read_tag (Arena *arena, String8 tag_data, U64 tag_off, U64 tag_base, DW_AbbrevTable abbrev_table, String8 abbrev_data, DW_Version version, DW_Format unit_format, U64 address_size, DW_Tag *tag_out); +internal B32 dw_read_form (String8 data, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, U64 implicit_const, DW_Form *form_out, U64 *bytes_read_out); +internal U64 dw_read_tag (Arena *arena, DW_Input *input, DW_AbbrevTable abbrev_table, DW_Version version, DW_Format format, U64 address_size, Rng1U64 cu_info_range, U64 tag_info_off, DW_Tag *tag_out); internal U64 dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); // attrib interp @@ -530,18 +531,15 @@ internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_Comp internal HashTable * dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree); internal DW_TagNode * dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off); -// line info +// line VM -internal U64 dw_read_line_file(String8 line_data, U64 line_off, DW_Input *input, DW_Version unit_version, DW_Format unit_format, DW_Ext ext, U64 address_size, DW_ListUnit *str_offsets, U64 enc_count, U64 *enc_arr, DW_LineFile *line_file_out); -internal U64 dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); -internal void dw_line_vm_reset(DW_LineVMState *state, B32 default_is_stmt); -internal void dw_line_vm_advance(DW_LineVMState *state, U64 advance, U64 min_inst_len, U64 max_ops_for_inst); -internal DW_LineSeqNode * dw_push_line_seq(Arena* arena, DW_LineTableParseResult *parsed_tbl); -internal DW_LineNode * dw_push_line(Arena *arena, DW_LineTableParseResult *tbl, DW_LineVMState *vm_state, B32 start_of_sequence); -internal String8 dw_path_from_file(Arena *arena, DW_LineVMHeader *vm, DW_LineFile *file); -internal String8 dw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx); - -internal DW_LineTableParseResult dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets); +internal U64 dw_read_line_vm_header(Arena *arena, DW_Input *input, String8 cu_stmt_list, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); +internal DW_LineVM * dw_line_vm_init(DW_Input *input, DW_CompUnit *cu); +internal void dw_line_vm_release(DW_LineVM *vm); +internal void dw_line_vm_advance(DW_LineVM *vm, U64 advance); +internal B32 dw_line_vm_step(DW_LineVM *vm); +internal DW_LineFile * dw_line_vm_find_file(DW_LineVM *vm, U64 file_idx); +internal String8 dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file); // helper for .debug_pubtypes and .debug_pubnames From 469fbece3d5815954d50458476cefc764cb8b2d3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 4 Feb 2026 14:02:14 -0800 Subject: [PATCH 151/850] fix check extension in attrib formatter --- src/dwarf/dwarf.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index ca78ab5e..feeaa924 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -616,26 +616,23 @@ dw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKi String8 result = {0}; //- rjf: try extensions - if(result.size != 0) + while(ext) { - while(ext) + U64 z = 64-clz64(ext); + if(z == 0) { - U64 z = 64-clz64(ext); - if(z == 0) - { - break; - } - U64 flag = 1 << (z-1); - ext &= ~flag; - switch(flag) - { - default:{}break; - case DW_Ext_Null: break; - case DW_Ext_GNU: switch (kind) { DW_AttribKind_GNU_XList } break; - case DW_Ext_LLVM: switch (kind) { DW_AttribKind_LLVM_XList } break; - case DW_Ext_APPLE: switch (kind) { DW_AttribKind_APPLE_XList } break; - case DW_Ext_MIPS: switch (kind) { DW_AttribKind_MIPS_XList } break; - } + break; + } + U64 flag = 1 << (z-1); + ext &= ~flag; + switch(flag) + { + default:{}break; + case DW_Ext_Null: break; + case DW_Ext_GNU: switch (kind) { DW_AttribKind_GNU_XList } break; + case DW_Ext_LLVM: switch (kind) { DW_AttribKind_LLVM_XList } break; + case DW_Ext_APPLE: switch (kind) { DW_AttribKind_APPLE_XList } break; + case DW_Ext_MIPS: switch (kind) { DW_AttribKind_MIPS_XList } break; } } From 3bc9bacf6fd9e61e7ce62493a958796ac88f62e3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 4 Feb 2026 14:05:00 -0800 Subject: [PATCH 152/850] update line table dumper; pipe down verbose switch to the DWARF dumper --- src/dwarf/dwarf_dump.c | 392 ++++++++++++++++++----------------------- src/dwarf/dwarf_dump.h | 2 +- src/radbin/radbin.c | 11 +- 3 files changed, 177 insertions(+), 228 deletions(-) diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 27ad6dd0..48103650 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -11,7 +11,7 @@ dw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off) String8 reg_str = dw_string_from_register(scratch.arena, arch, reg_idx); String8 result; if (reg_off != 0) { - result = push_str8f(arena, "%S%+lld", reg_str, reg_off); + result = push_str8f(arena, "%S%+I64d", reg_str, reg_off); } else { result = reg_str; } @@ -50,7 +50,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { U64 x = op - DW_ExprOp_Lit0; - op_value = push_str8f(scratch.arena, "%llu", x); + op_value = push_str8f(scratch.arena, "%I64u", x); } break; case DW_ExprOp_Const1U:size_param = 1; goto const_n; @@ -67,30 +67,30 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 S64 x = 0; cursor += str8_deserial_read(raw_data, cursor, &x, size_param, 1); x = extend_sign64(x, size_param); - op_value = push_str8f(scratch.arena, "%lld", x); + op_value = push_str8f(scratch.arena, "%I64d", x); } else { U64 x = 0; cursor += str8_deserial_read(raw_data, cursor, &x, size_param, 1); - op_value = push_str8f(scratch.arena, "%llu", x); + op_value = push_str8f(scratch.arena, "%I64u", x); } } break; case DW_ExprOp_Addr: { U64 addr = 0; cursor += str8_deserial_read(raw_data, cursor, &addr, addr_size, 1); - op_value = push_str8f(scratch.arena, "%#llx", addr); + op_value = push_str8f(scratch.arena, "%#I64x", addr); } break; case DW_ExprOp_ConstU: { U64 x = 0; cursor += str8_deserial_read_uleb128(raw_data, cursor, &x); - op_value = push_str8f(scratch.arena, "%llu", x); + op_value = push_str8f(scratch.arena, "%I64u", x); } break; case DW_ExprOp_ConstS: { S64 x = 0; cursor += str8_deserial_read_sleb128(raw_data, cursor, &x); - op_value = push_str8f(scratch.arena, "%lld", x); + op_value = push_str8f(scratch.arena, "%I64d", x); } break; case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: @@ -134,7 +134,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 U64 bit_size = 0, bit_off = 0; cursor += str8_deserial_read_uleb128(raw_data, cursor, &bit_size); cursor += str8_deserial_read_uleb128(raw_data, cursor, &bit_off); - op_value = push_str8f(scratch.arena, "bit size %llu, bit offset %llu", bit_size, bit_off); + op_value = push_str8f(scratch.arena, "bit size %I64u, bit offset %I64u", bit_size, bit_off); } break; case DW_ExprOp_Pick: { @@ -146,7 +146,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_PlusUConst: { U64 addend = 0; cursor += str8_deserial_read_uleb128(raw_data, cursor, &addend); - op_value = push_str8f(arena, "addend %llu", addend); + op_value = push_str8f(arena, "addend %I64u", addend); } break; case DW_ExprOp_Skip: { @@ -181,7 +181,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_FBReg: { S64 reg_off = 0; cursor += str8_deserial_read_sleb128(raw_data, cursor, ®_off); - op_value = push_str8f(scratch.arena, "offset %lld", reg_off); + op_value = push_str8f(scratch.arena, "offset %I64d", reg_off); } break; case DW_ExprOp_BRegX: { @@ -212,7 +212,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_CallRef: { U64 x = 0; cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &x); - op_value = push_str8f(scratch.arena, "%llu", x); + op_value = push_str8f(scratch.arena, "%I64u", x); } break; case DW_ExprOp_ImplicitPointer: case DW_ExprOp_GNU_ImplicitPointer: { @@ -221,13 +221,13 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 S64 ptr = 0; cursor += str8_deserial_read_sleb128(raw_data, cursor, &ptr); - op_value = push_str8f(scratch.arena, ".debug_info+%#llx, ptr %llx", info_off, ptr); + op_value = push_str8f(scratch.arena, ".debug_info+%#I64x, ptr %I64x", info_off, ptr); } break; case DW_ExprOp_Convert: case DW_ExprOp_GNU_Convert: { U64 type_cu_off = 0; cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); - op_value = push_str8f(scratch.arena, "TypeCuOff %#llx", cu_base + type_cu_off); + op_value = push_str8f(scratch.arena, "TypeCuOff %#I64x", cu_base + type_cu_off); } break; case DW_ExprOp_GNU_ParameterRef: { // TODO: always 4 bytes? @@ -241,7 +241,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 U64 type_cu_off = 0; cursor += str8_deserial_read_struct(raw_data, cursor, &deref_size); cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); - op_value = push_str8f(scratch.arena, "%#x, TypeCuOff %#llx", deref_size, cu_base + type_cu_off); + op_value = push_str8f(scratch.arena, "%#x, TypeCuOff %#I64x", deref_size, cu_base + type_cu_off); } break; case DW_ExprOp_ConstType: case DW_ExprOp_GNU_ConstType: { @@ -253,7 +253,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 String8 const_value_data = str8_substr(raw_data, const_value_range); String8List const_value_strings = numeric_str8_list_from_data(scratch.arena, 16, const_value_data, 1); String8 const_value_str = str8_list_join(scratch.arena, &const_value_strings, &(StringJoin){.sep = str8_lit(", ")}); - op_value = push_str8f(scratch.arena, "TypeCuOff %#llx, Const Value { %S }", cu_base + type_cu_off, const_value_str); + op_value = push_str8f(scratch.arena, "TypeCuOff %#I64x, Const Value { %S }", cu_base + type_cu_off, const_value_str); cursor += const_value_size; } break; case DW_ExprOp_RegvalType: @@ -261,7 +261,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 U64 reg_idx = 0, type_cu_off = 0; cursor += str8_deserial_read_uleb128(raw_data, cursor, ®_idx); cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); - op_value = push_str8f(scratch.arena, "%S, TypeCuOff %#llx", dw_string_from_register(scratch.arena, arch, reg_idx), cu_base + type_cu_off); + op_value = push_str8f(scratch.arena, "%S, TypeCuOff %#I64x", dw_string_from_register(scratch.arena, arch, reg_idx), cu_base + type_cu_off); } break; case DW_ExprOp_EntryValue: case DW_ExprOp_GNU_EntryValue: { @@ -276,7 +276,7 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_Addrx: { U64 addr = 0; cursor += str8_deserial_read_uleb128(raw_data, cursor, &addr); - op_value = push_str8f(scratch.arena, "%#llx", addr); + op_value = push_str8f(scratch.arena, "%#I64x", addr); } break; case DW_ExprOp_CallFrameCfa: @@ -455,10 +455,10 @@ dw_string_list_from_cfi_program(Arena *arena, } break; case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; case DW_CFA_ValOffset: { - operand_str = str8f(arena, "value 0x%llx, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); + operand_str = str8f(arena, "value 0x%I64x, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); } break; case DW_CFA_ValOffsetSf: { - operand_str = str8f(arena, "value %llu, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); + operand_str = str8f(arena, "value %I64u, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); } break; case DW_CFA_ValExpr: { String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); @@ -638,10 +638,10 @@ dw_print_eh_frame(Arena *arena, String8List *out, String8 indent, String8 raw_eh rd_printf("LSDA Encoding: %S", dw_string_from_eh_ptr_enc(scratch.arena, cie.lsda_encoding)); rd_printf("Address Encoding: %S", dw_string_from_eh_ptr_enc(scratch.arena, cie.addr_encoding)); rd_printf("Augmentation: %S", cie.augmentation); - rd_printf("Code Align Factor: %llu", cie.code_align_factor); - rd_printf("Data Align Factor: %lld", cie.data_align_factor); + rd_printf("Code Align Factor: %I64u", cie.code_align_factor); + rd_printf("Data Align Factor: %I64d", cie.data_align_factor); rd_printf("Return Address Register: %u", cie.ret_addr_reg); - rd_printf("Handler IP: %#llx", cie.handler_ip); + rd_printf("Handler IP: %#I64x", cie.handler_ip); rd_unindent(); } // FDE @@ -654,10 +654,10 @@ dw_print_eh_frame(Arena *arena, String8List *out, String8 indent, String8 raw_eh AssertAlways(entry_start >= entry_id); U64 cie_offset = entry_start - entry_id; NotImplemented; // TODO: syms_safe_sub_u64(range.min + entry_start, entry_id); - rd_printf("FDE @ %#llx, Length %u, Parent CIE @ %#llx", header_offset, length, cie_offset); + rd_printf("FDE @ %#I64x, Length %u, Parent CIE @ %#I64x", header_offset, length, cie_offset); rd_indent(); - rd_printf("IP Range: %#llx-%#llx", fde.ip_voff_range.min, fde.ip_voff_range.max); - rd_printf("LSDA IP: %#llx", fde.lsda_ip); + rd_printf("IP Range: %#I64x-%#I64x", fde.ip_voff_range.min, fde.ip_voff_range.max); + rd_printf("LSDA IP: %#I64x", fde.lsda_ip); rd_unindent(); } @@ -774,7 +774,7 @@ dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *inp String8List list = {0}; // offset - str8_list_pushf(range_temp.arena, &list, "%08llx", cursor); + str8_list_pushf(range_temp.arena, &list, "%08I64x", cursor); // parse entry U64 v0 = 0, v1 = 0; @@ -800,7 +800,7 @@ dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *inp // push entry U64 min = base_address + v0; U64 max = base_address + v1; - str8_list_pushf(range_temp.arena, &list, "%08llx %08llx %S", min, max, expression); + str8_list_pushf(range_temp.arena, &list, "%08I64x %08I64x %S", min, max, expression); } // print entry @@ -897,7 +897,7 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input * String8List list = {0}; // offset - str8_list_pushf(range_temp.arena, &list, "%08llx", cursor); + str8_list_pushf(range_temp.arena, &list, "%08I64x", cursor); // parse entry U64 v0 = 0, v1 = 0; @@ -913,7 +913,7 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input * // push entry U64 min = base_address + v0; U64 max = base_address + v1; - str8_list_pushf(range_temp.arena, &list, "%08llx %08llx", min, max); + str8_list_pushf(range_temp.arena, &list, "%08I64x %08I64x", min, max); } // print entry @@ -972,9 +972,9 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input cursor += tuple_size - bytes_too_far_past_boundary; } - rd_printf("Unit length: %llu", unit_length); + rd_printf("Unit length: %I64u", unit_length); rd_printf("Version: %u", version); - rd_printf("Debug info offset: %#llx", debug_info_offset); + rd_printf("Debug info offset: %#I64x", debug_info_offset); rd_printf("Address size: %u", address_size); rd_printf("Segment selector size: %u", segment_selector_size); @@ -989,7 +989,7 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input String8List list = {0}; - str8_list_pushf(temp.arena, &list, "%08llx", cursor); + str8_list_pushf(temp.arena, &list, "%08I64x", cursor); U64 segment_selector = 0; U64 address = 0; @@ -1002,9 +1002,9 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input str8_list_pushf(temp.arena, &list, ""); } else { if (segment_selector != 0) { - str8_list_pushf(temp.arena, &list, "%02llu:", segment_selector); + str8_list_pushf(temp.arena, &list, "%02I64u:", segment_selector); } - str8_list_pushf(temp.arena, &list, "%llx-%llx", address, address+length); + str8_list_pushf(temp.arena, &list, "%I64x-%I64x", address, address+length); } String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ") }); @@ -1057,7 +1057,7 @@ dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *in cursor += tuple_size - bytes_too_far_past_boundary; } - rd_printf("Unit @ %#llx, length %llu", unit_offset, unit_length); + rd_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); rd_printf("Version: %u", version); rd_printf("Address size: %u", address_size); rd_printf("Segment selector size: %u", segment_selector_size); @@ -1086,7 +1086,7 @@ dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *in if (segment_selector != 0) { str8_list_pushf(temp.arena, &list, "%02u:", segment_selector); } - str8_list_pushf(temp.arena, &list, "%llx", address); + str8_list_pushf(temp.arena, &list, "%I64x", address); } String8 print = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(" ")}); @@ -1165,7 +1165,7 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input B32 is_dwarf64 = unit_length > max_U32; U64 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - rd_printf("Unit @ %#llx, length %llu", unit_offset, unit_length); + rd_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); rd_printf("Version: %u", version); rd_printf("Address size: %u", address_size); rd_printf("Segment selector size: %u", segment_selector_size); @@ -1181,7 +1181,7 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) { U64 offset = 0; cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - rd_printf("%-8llu %llx", offset_idx, offset+past_header_offset); + rd_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); } rd_unindent(); } @@ -1194,7 +1194,7 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input String8List list = {0}; - str8_list_pushf(temp.arena, &list, "%08llx", cursor); + str8_list_pushf(temp.arena, &list, "%08I64x", cursor); U8 kind = 0; cursor += dw_based_range_read_struct(base, range, cursor, &kind); @@ -1210,40 +1210,40 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input case DW_LocListEntryKind_BaseAddress: { U64 base_address = 0; cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &base_address); - str8_list_pushf(temp.arena, &list, "%llx", base_address); + str8_list_pushf(temp.arena, &list, "%I64x", base_address); } break; case DW_LocListEntryKind_StartLength: { U64 start = 0; U64 length = 0; cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &start); cursor += dw_based_range_read_uleb128(base, range, cursor, &length); - str8_list_pushf(temp.arena, &list, "%llx, %llx", start, length); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, length); } break; case DW_LocListEntryKind_StartEnd: { U64 start = 0; U64 end = 0; cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &start); cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &end); - str8_list_pushf(temp.arena, &list, "%llx, %llx", start, end); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, end); } break; case DW_LocListEntryKind_BaseAddressX: { U64 base_addressx = 0; cursor += dw_based_range_read_uleb128(base, range, cursor, &base_addressx); - str8_list_pushf(temp.arena, &list, "%llx", base_addressx); + str8_list_pushf(temp.arena, &list, "%I64x", base_addressx); } break; case DW_LocListEntryKind_StartXEndX: { U64 startx = 0; U64 endx = 0; cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); cursor += dw_based_range_read_uleb128(base, range, cursor, &endx); - str8_list_pushf(temp.arena, &list, "%llx, %llx", startx, endx); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, endx); } break; case DW_LocListEntryKind_OffsetPair: { U64 a = 0; U64 b = 0; cursor += dw_based_range_read_uleb128(base, range, cursor, &a); cursor += dw_based_range_read_uleb128(base, range, cursor, &b); - str8_list_pushf(temp.arena, &list, "%llx, %llx", a, b); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", a, b); U8 expr_length = 0; cursor += dw_based_range_read_struct(base, range, cursor, &expr_length); @@ -1317,7 +1317,7 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input B32 is_dwarf64 = unit_length > max_U32; U64 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - rd_printf("Unit @ %#llx, length %llu", unit_offset, unit_length); + rd_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); rd_printf("Version: %u", version); rd_printf("Address size: %u", address_size); rd_printf("Segment selector size: %u", segment_selector_size); @@ -1334,7 +1334,7 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) { U64 offset = 0; cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - rd_printf("%-8llu %llx", offset_idx, offset+past_header_offset); + rd_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); } rd_unindent(); } @@ -1348,7 +1348,7 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input String8List list = {0}; // offset - str8_list_pushf(temp.arena, &list, "%08llx", cursor); + str8_list_pushf(temp.arena, &list, "%08I64x", cursor); // opcode mnemonic U8 kind = 0; @@ -1363,47 +1363,47 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input case DW_RngListEntryKind_BaseAddressX: { U64 base_addressx = 0; cursor += dw_based_range_read_uleb128(base, range, cursor, &base_addressx); - str8_list_pushf(temp.arena, &list, "%llx", base_addressx); + str8_list_pushf(temp.arena, &list, "%I64x", base_addressx); } break; case DW_RngListEntryKind_BaseAddress: { U64 base_address = 0; cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &base_address); - str8_list_pushf(temp.arena, &list, "%llx", base_address); + str8_list_pushf(temp.arena, &list, "%I64x", base_address); } break; case DW_RngListEntryKind_OffsetPair: { U64 min = 0; U64 max = 0; cursor += dw_based_range_read_uleb128(base, range, cursor, &min); cursor += dw_based_range_read_uleb128(base, range, cursor, &max); - str8_list_pushf(temp.arena, &list, "%llx, %llx", min, max); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", min, max); } break; case DW_RngListEntryKind_StartxLength: { U64 startx = 0; U64 length = 0; cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); cursor += dw_based_range_read_uleb128(base, range, cursor, &length); - str8_list_pushf(temp.arena, &list, "%llx, %llx", startx, length); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, length); } break; case DW_RngListEntryKind_StartxEndx: { U64 startx = 0; U64 endx = 0; cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); cursor += dw_based_range_read_uleb128(base, range, cursor, &endx); - str8_list_pushf(temp.arena, &list, "%llx, %llx", startx, endx); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, endx); } break; case DW_RngListEntryKind_StartEnd: { U64 start = 0; U64 end = 0; cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &start); cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &end); - str8_list_pushf(temp.arena, &list, "%llx, %llx", start, end); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, end); } break; case DW_RngListEntryKind_StartLength: { U64 start = 0; U64 length = 0; cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &start); cursor += dw_based_range_read_uleb128(base, range, cursor, &length); - str8_list_pushf(temp.arena, &list, "%llx, %llx", start, length); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, length); } break; } @@ -1459,10 +1459,10 @@ dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_offset); cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_length); - rd_printf("Unit @ %#llx, length %llu", unit_offset, unit_length); + rd_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); rd_printf("Version: %u", version); - rd_printf("Debug info offset: %#llx", debug_info_offset); - rd_printf("Debug info length: %#llx", debug_info_length); + rd_printf("Debug info offset: %#I64x", debug_info_offset); + rd_printf("Debug info length: %#I64x", debug_info_length); rd_printf("Entries:"); rd_indent(); @@ -1473,7 +1473,7 @@ dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input String8 string = dw_based_range_read_string(base, range, cursor); cursor += (string.size + 1); - rd_printf("%08llx %S", info_offset, string); + rd_printf("%08I64x %S", info_offset, string); } rd_unindent(); rd_newline(); @@ -1567,7 +1567,7 @@ dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_In B32 is_dwarf64 = unit_length > max_U32; U32 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - rd_printf("Unit @ %#llX, length %lld", unit_offset, unit_length); + rd_printf("Unit @ %#llX, length %I64d", unit_offset, unit_length); rd_printf("Version: %d", version); rd_printf("Padding: %d", padding); rd_indent(); @@ -1576,7 +1576,7 @@ dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_In U64 read_at = cursor; U64 offset = 0; cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - rd_printf("%08llx %08llx", read_at, offset); + rd_printf("%08I64x %08I64x", read_at, offset); if (dim_1u64(debug_str_range) > 0) { String8 string = dw_based_range_read_string(debug_str_base, debug_str_range, offset); rd_printf(" %S", string); @@ -1598,7 +1598,7 @@ dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_In //~ rjf: Dump Entry Point internal String8 -dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_vm, DW_Attrib *attrib) +dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_table_header, DW_Attrib *attrib) { Temp scratch = scratch_begin(&arena, 1); @@ -1628,7 +1628,7 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni case DW_AttribClass_Flag: { B32 flag = dw_flag_from_attrib(input, unit, attrib); - str8_list_pushf(scratch.arena, &attrib_fmt, "%llu (%s)", flag, flag == 0 ? "false" : "true"); + str8_list_pushf(scratch.arena, &attrib_fmt, "%I64u (%s)", flag, flag == 0 ? "false" : "true"); }break; case DW_AttribClass_LinePtr: case DW_AttribClass_LocListPtr: @@ -1691,10 +1691,10 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni case DW_AttribKind_DeclFile: { U64 file_idx = dw_const_u64_from_attrib(input, unit, attrib); - DW_LineFile *file = dw_file_from_attrib(unit, line_vm, attrib); + DW_LineFile *file = dw_file_from_attrib(unit, line_table_header, attrib); if(file != 0) { - enum_info = dw_path_from_file(scratch.arena, line_vm, file); + enum_info = dw_path_from_file(scratch.arena, line_table_header->dir_table, file); } }break; case DW_AttribKind_DeclLine: @@ -1739,7 +1739,8 @@ internal String8List dw_dump_list_from_sections(Arena *arena, DW_Input *input, Arch arch, - DW_DumpSubsetFlags subset_flags) + DW_DumpSubsetFlags subset_flags, + B32 verbose) { String8List strings = {0}; String8 indent = str8_lit(" "); @@ -1780,8 +1781,16 @@ dw_dump_list_from_sections(Arena *arena, String8 unit_dir = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_CompDir ); String8 unit_name = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_Name ); String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_StmtList); - DW_LineVMHeader line_vm = {0}; - dw_read_line_vm_header(unit_temp.arena, stmt_list, 0, input, unit_dir, unit_name, unit->address_size, unit->str_offsets_lu, &line_vm); + + DW_LineVMHeader line_table_header = {0}; + dw_read_line_vm_header(scratch.arena, + input, + stmt_list, + unit_dir, + unit_name, + unit->address_size, + unit->str_offsets_lu, + &line_table_header); //- rjf: log top-level unit info dumpf("unit: // compile_unit[%I64u]\n{\n", unit_idx); @@ -1796,15 +1805,19 @@ dw_dump_list_from_sections(Arena *arena, for(U64 info_off = unit->first_tag_info_off; info_off < unit->info_range.max; tag_idx += 1) { Temp tag_temp = temp_begin(scratch.arena); - + if (info_off == 0x1ed3) { + int x = 0; + } // rjf: unpack tag String8 tag_indent = str8_prefix(indent, (tag_depth+1)*2); - U64 tag_info_off = info_off; DW_Tag tag = {0}; - info_off += dw_read_tag_cu(tag_temp.arena, input, unit, tag_info_off, &tag); + U64 tag_size = dw_read_tag_cu(tag_temp.arena, input, unit, info_off, &tag); + + if (tag_size == 0) { dumpf("ERROR: .debug_info ends unexpectedly @ %#64x"); break; } + info_off += tag_size; // rjf: log top-level tag info - dumpf("%Stag: // info_off: 0x%I64x, abbrev_id: %I64u, compile_unit[%I64u].tag[%I64u]\n%S{\n", tag_indent, tag_info_off, tag.abbrev_id, unit_idx, tag_idx, tag_indent); + dumpf("%Stag: // info_off: 0x%I64x, abbrev_id: %I64u, compile_unit[%I64u].tag[%I64u]\n%S{\n", tag_indent, tag.info_off, tag.abbrev_id, unit_idx, tag_idx, tag_indent); dumpf("%S kind: %S\n", tag_indent, dw_string_from_tag_kind(tag_temp.arena, tag.kind)); // log attribs @@ -1816,7 +1829,7 @@ dw_dump_list_from_sections(Arena *arena, Temp attrib_temp = temp_begin(tag_temp.arena); attrib_name_max_size = Max(attrib_name_max_size, dw_string_from_attrib_kind(attrib_temp.arena, unit->version, unit->ext, attrib_n->v.attrib_kind).size); form_kind_max_size = Max(form_kind_max_size, dw_string_from_form_kind(attrib_temp.arena, unit->version, attrib_n->v.form_kind).size); - value_max_size = Max(value_max_size, dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_vm, &attrib_n->v).size); + value_max_size = Max(value_max_size, dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_table_header, &attrib_n->v).size); temp_end(attrib_temp); } value_max_size = Min(120, value_max_size); @@ -1830,9 +1843,9 @@ dw_dump_list_from_sections(Arena *arena, String8 attrib_kind_str = dw_string_from_attrib_kind(attrib_temp.arena, unit->version, unit->ext, attrib->attrib_kind); String8 form_kind_str = dw_string_from_form_kind(attrib_temp.arena, unit->version, attrib->form_kind); - String8 value_str = dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_vm, attrib); + String8 value_str = dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_table_header, attrib); - dumpf("%S attrib: { kind: %S, %.*sform_kind: %S, %.*svalue: %S, %.*s} // info_off: 0x%I64x\n", + dumpf("%S attrib: { kind: %S, %.*sform_kind: %S, %.*svalue: %S, %.*s} // [%llu] info_off: 0x%I64x\n", tag_indent, attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, indent.str, form_kind_str, form_kind_max_size - form_kind_str.size, indent.str, @@ -1923,19 +1936,8 @@ dw_dump_list_from_sections(Arena *arena, for EachIndex(unit_idx, unit_ranges.count) { Temp unit_temp = temp_begin(scratch.arena); - - // rjf: unpack unit - String8 raw_lines = str8_substr(input->sec[DW_Section_Line].data, unit_ranges.v[unit_idx]); - DW_CompUnit *cu = &cu_arr[unit_idx]; - String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); - String8 cu_dir = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_CompDir); - String8 cu_name = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_Name); - DW_LineVMHeader line_vm = {0}; - U64 line_vm_size = dw_read_line_vm_header(unit_temp.arena, raw_lines, 0, input, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu, &line_vm); - if(line_vm_size == 0) - { - continue; - } + + DW_LineVM *vm = dw_line_vm_init(input, &cu_arr[unit_idx]); // rjf: begin logging line table dumpf("line_table: // line_table[%I64u]\n{\n", unit_idx); @@ -1943,41 +1945,40 @@ dw_dump_list_from_sections(Arena *arena, // rjf: log line table header DeferLoop(dumpf(" header:\n {\n"), dumpf(" }\n\n")) { - String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(line_vm.opcode_lens, line_vm.num_opcode_lens), 1); + String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(vm->header.opcode_lens, vm->header.num_opcode_lens), 1); String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(", ")}); - dumpf(" version: %u\n", line_vm.version ); - dumpf(" line_table_off: 0x%I64x\n", line_vm.unit_range.min ); - dumpf(" line_table_size: %I64u\n", dim_1u64(line_vm.unit_range) ); - dumpf(" address_size: %u\n", line_vm.address_size ); - dumpf(" segment_selector_size: %u\n", line_vm.segment_selector_size); - dumpf(" header_length: %I64u\n", line_vm.header_length ); - dumpf(" min_instruction_length: %u\n", line_vm.min_inst_len ); - dumpf(" max_ops_for_instruction: %u\n", line_vm.max_ops_for_inst ); - dumpf(" default_is_stmt: %u\n", line_vm.default_is_stmt ); - dumpf(" line_base: %d\n", line_vm.line_base ); - dumpf(" line_range: %u\n", line_vm.line_range ); - dumpf(" opcode_base: %u\n", line_vm.opcode_base ); - dumpf(" opcode_lengths: %S\n", opcode_lengths_string ); + dumpf(" version: %u\n", vm->header.version ); + dumpf(" line_table_size: %I64u\n", vm->header.unit_length ); + dumpf(" address_size: %u\n", vm->header.address_size ); + dumpf(" segment_selector_size: %u\n", vm->header.segment_selector_size); + dumpf(" header_length: %I64u\n", vm->header.header_length ); + dumpf(" min_instruction_length: %u\n", vm->header.min_inst_len ); + dumpf(" max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); + dumpf(" default_is_stmt: %u\n", vm->header.default_is_stmt ); + dumpf(" line_base: %d\n", vm->header.line_base ); + dumpf(" line_range: %u\n", vm->header.line_range ); + dumpf(" opcode_base: %u\n", vm->header.opcode_base ); + dumpf(" opcode_lengths: %S\n", opcode_lengths_string ); } // rjf: log directory table DeferLoop(dumpf(" directory_table:\n {\n"), dumpf(" }\n\n")) { dumpf(" // %-4s %-8s\n", "no.", "name"); - for EachIndex(dir_idx, line_vm.dir_table.count) + for EachIndex(dir_idx, vm->header.dir_table.count) { - dumpf(" { %-4llu %S }\n", dir_idx, line_vm.dir_table.v[dir_idx]); + dumpf(" { %-4I64u %S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); } } // rjf: log file table DeferLoop(dumpf(" file_table:\n {\n"), dumpf(" }\n\n")) { - dumpf(" // %-4s %-8s %-8s %-33s %-8s %-8s\n", "no.", "dir_idx", "time", "md5", "size", "name"); - for EachIndex(file_idx, line_vm.file_table.count) + dumpf(" // %-4s %-8s %-8s %-33s %-8s %-8s\n", "no.", "dir_idx", "time", "md5", "size", "name"); + for EachIndex(file_idx, vm->header.file_table.count) { - DW_LineFile *file = &line_vm.file_table.v[file_idx]; - dumpf(" { %-4llu %-8llu %-8llu %016llx-%016llx %-8llu %S }\n", + DW_LineFile *file = &vm->header.file_table.v[file_idx]; + dumpf(" { %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %S }\n", file_idx, file->dir_idx, file->modify_time, @@ -1989,198 +1990,141 @@ dw_dump_list_from_sections(Arena *arena, } // rjf: log opcodes - DeferLoop(dumpf(" opcodes:\n {\n"), dumpf(" }\n\n")) + DeferLoop(dumpf(" line_table:\n {\n"), dumpf(" }\n\n")) { - String8 opcodes = str8_skip(raw_lines, line_vm_size); - B32 end_of_seq = 0; - DW_LineVMState vm_state = {0}; - dw_line_vm_reset(&vm_state, line_vm.default_is_stmt); - for(U64 cursor = 0; cursor < opcodes.size;) + dumpf(" //\n"); + dumpf(" // %-16s %-8s %-4s %-5s %-3s %-7s %-16s\n", "Address", "Line", "Col", "File", "ISA", "Discrim", "Flags"); + dumpf(" // ---------------- -------- ---- ----- --- ------- ----------------\n"); + + for(;;) { + U64 global_opcode_off = unit_ranges.v[unit_idx].min + vm->cursor; + + if( ! dw_line_vm_step(vm)) { break; } + Temp opcode_temp = temp_begin(unit_temp.arena); String8List opcode_fmt = {0}; // opcode offset - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "[%08llx]", cursor); - - // parse opcode - U8 opcode = 0; - cursor += str8_deserial_read_struct(opcodes, cursor, &opcode); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); // push opcode id - String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, opcode); + String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); str8_list_push(arena, &opcode_fmt, opcode_str); // format operands - switch(opcode) + switch(vm->opcode) { default: { - if(opcode >= line_vm.opcode_base) + if(vm->opcode >= vm->header.opcode_base) { - U32 adjusted_opcode = 0; - U32 op_advance = 0; - S32 line_advance = 0; - U64 addr_advance = 0; - if(line_vm.line_range > 0 && line_vm.max_ops_for_inst > 0) - { - adjusted_opcode = (U32)(opcode - line_vm.opcode_base); - op_advance = adjusted_opcode / line_vm.line_range; - line_advance = (S32)line_vm.line_base + ((S32)adjusted_opcode) % (S32)line_vm.line_range; - addr_advance = line_vm.min_inst_len * ((vm_state.op_index+op_advance) / line_vm.max_ops_for_inst); - } - vm_state.address += addr_advance; - vm_state.op_index = (vm_state.op_index + op_advance) % line_vm.max_ops_for_inst; - vm_state.line = (U32)((S32)vm_state.line + line_advance); - vm_state.basic_block = 0; - vm_state.prologue_end = 0; - vm_state.epilogue_begin = 0; - vm_state.discriminator = 0; - end_of_seq = 0; - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %d, advance address by %lld", line_advance, addr_advance); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); } else { - if(opcode > 0 && opcode <= line_vm.num_opcode_lens) - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skip operands:"); - U64 num_operands = line_vm.opcode_lens[opcode - 1]; - for(U8 i = 0; i < num_operands; i += 1) - { - U64 operand = 0; - cursor += str8_deserial_read_uleb128(opcodes, cursor, &operand); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, " %llx", operand); - } - } + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); } }break; case DW_StdOpcode_Copy: { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %u, Column = %u, Address = %#llx", vm_state.line, vm_state.column, vm_state.address); - end_of_seq = 0; - vm_state.discriminator = 0; - vm_state.basic_block = 0; - vm_state.prologue_end = 0; - vm_state.epilogue_begin = 0; + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); }break; case DW_StdOpcode_AdvancePc: { - U64 advance = 0; - cursor += str8_deserial_read_uleb128(opcodes, cursor, &advance); - dw_line_vm_advance(&vm_state, advance, line_vm.min_inst_len, line_vm.max_ops_for_inst); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#llx ; current address %#llx", advance, vm_state.address); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); }break; case DW_StdOpcode_AdvanceLine: { - S64 advance = 0; - cursor += str8_deserial_read_sleb128(opcodes, cursor, &advance); - vm_state.line += advance; - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %lld ; current line %u", advance, vm_state.line); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); }break; case DW_StdOpcode_SetFile: { - U64 file_idx = 0; - cursor += str8_deserial_read_uleb128(opcodes, cursor, &file_idx); - vm_state.file_index = file_idx; - String8 path = dw_path_from_file_idx(opcode_temp.arena, &line_vm, file_idx); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%llu \"%S\"", file_idx, path); + DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); }break; case DW_StdOpcode_SetColumn: { - U64 column = 0; - cursor += str8_deserial_read_uleb128(opcodes, cursor, &column); - vm_state.column = column; - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%llu", column); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); }break; case DW_StdOpcode_NegateStmt: { - vm_state.is_stmt = !vm_state.is_stmt; - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm_state.is_stmt); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); }break; case DW_StdOpcode_SetBasicBlock: { - vm_state.basic_block = 1; }break; case DW_StdOpcode_ConstAddPc: { - U64 advance = (0xffu - line_vm.opcode_base)/line_vm.line_range; - dw_line_vm_advance(&vm_state, advance, line_vm.min_inst_len, line_vm.max_ops_for_inst); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%lld ; address %#llx", advance, vm_state.address); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); }break; case DW_StdOpcode_FixedAdvancePc: { - U64 operand = 0; - cursor += str8_deserial_read_struct(opcodes, cursor, &operand); - vm_state.address += operand; - vm_state.op_index = 0; - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%llu", operand); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); }break; case DW_StdOpcode_SetPrologueEnd: { - vm_state.prologue_end = 1; }break; case DW_StdOpcode_SetEpilogueBegin: { - vm_state.epilogue_begin = 1; }break; case DW_StdOpcode_SetIsa: { - U64 v = 0; - cursor += str8_deserial_read_uleb128(opcodes, cursor, &v); - vm_state.isa = v; - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%llu", v); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); }break; case DW_StdOpcode_ExtendedOpcode: { - U64 length = 0; - U8 ext_opcode = 0; - cursor += str8_deserial_read_uleb128(opcodes, cursor, &length); - U64 opcode_end = cursor + length; - cursor += str8_deserial_read_struct(opcodes, cursor, &ext_opcode); - String8 ext_opcode_str = dw_string_from_ext_opcode(opcode_temp.arena, ext_opcode); + str8_list_push(opcode_temp.arena, &opcode_fmt, dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); - str8_list_push(opcode_temp.arena, &opcode_fmt, ext_opcode_str); - switch(ext_opcode) + switch(vm->ext_opcode) { case DW_ExtOpcode_EndSequence: { - vm_state.end_sequence = 1; - dw_line_vm_reset(&vm_state, line_vm.default_is_stmt); - end_of_seq = 1; }break; case DW_ExtOpcode_SetAddress: { - U64 address = 0; - cursor += str8_deserial_read(opcodes, cursor, &address, line_vm.address_size, line_vm.address_size); - vm_state.address = address; - vm_state.op_index = 0; - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#llx", address); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); }break; case DW_ExtOpcode_DefineFile: { - String8 file_name = {0}; - cursor += str8_deserial_read_cstr(opcodes, cursor, &file_name); - U64 dir_idx = 0, modify_time = 0, file_size = 0; - cursor += str8_deserial_read_uleb128(opcodes, cursor, &dir_idx); - cursor += str8_deserial_read_uleb128(opcodes, cursor, &modify_time); - cursor += str8_deserial_read_uleb128(opcodes, cursor, &file_size); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %llu, Time: %llu, Size: %llu", file_name, dir_idx, modify_time, file_size); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); }break; case DW_ExtOpcode_SetDiscriminator: { - U64 v = 0; - cursor += str8_deserial_read_uleb128(opcodes, cursor, &v); - vm_state.discriminator = v; - str8_list_pushf(arena, &opcode_fmt, "%llu", v); + str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); }break; } - cursor = opcode_end; }break; } - String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); - dumpf("%S\n", string); + + if(verbose) + { + String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); + dumpf(" // %S\n", string); + } + + if(vm->new_line) { + String8List l = {0}; + if(vm->state.is_stmt) + { + str8_list_pushf(opcode_temp.arena, &l, "is_stmt"); + } + if(vm->state.end_sequence) + { + str8_list_pushf(opcode_temp.arena, &l, "end_seq"); + } + String8 flags = str8_list_join(opcode_temp.arena, &l, &(StringJoin){.sep = "|"}); + + dumpf(" { %#016I64x %8I64u %4I64u %5I64u %3I64u %7I64u %-16S } %s\n", vm->state.address, vm->state.line, vm->state.column, vm->state.file_index, vm->state.isa, vm->state.discriminator, flags, vm->new_seq ? "// new seq" : ""); + } + temp_end(opcode_temp); } + + if(vm->error.size) + { + dumpf("ERROR: Line VM failed stepping @ 0x%I64x\n", vm->cursor); + } } temp_end(unit_temp); } @@ -2196,7 +2140,7 @@ dw_dump_list_from_sections(Arena *arena, { String8 string = {0}; read_size = str8_deserial_read_cstr(data, cursor, &string); - dumpf(" { 0x%08I64x %llu \"%S\" }\n", cursor, string.size, string); + dumpf(" { 0x%08I64x %I64u \"%S\" }\n", cursor, string.size, string); } } diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index 472bb7b7..f5648785 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -85,6 +85,6 @@ internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 //////////////////////////////// //~ rjf: Dump Entry Point -internal String8List dw_dump_list_from_sections(Arena *arena, DW_Input *input, Arch arch, DW_DumpSubsetFlags subset_flags); +internal String8List dw_dump_list_from_sections(Arena *arena, DW_Input *input, Arch arch, DW_DumpSubsetFlags subset_flags, B32 verbose); #endif // DWARF_DUMP_H diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 3811d462..70c0eb2f 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -706,8 +706,9 @@ rb_thread_entry_point(void *p) } } } - convert_params.subset_flags = subset_flags; - convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + convert_params.subset_flags = subset_flags; + convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + convert_params.is_parse_relaxed = 1; // TODO: switch } ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); } @@ -1019,6 +1020,8 @@ rb_thread_entry_point(void *p) fprintf(stderr, " be dumped. See below for a list of valid\n"); fprintf(stderr, " subset names.\n"); fprintf(stderr, "\n"); + fprintf(stderr, "--verbose dump more format details\n"); + fprintf(stderr, "\n"); fprintf(stderr, "-------------------------------------------------------------------------------\n\n"); @@ -1036,6 +1039,8 @@ rb_thread_entry_point(void *p) #undef X fprintf(stderr, "\n"); } + + B32 verbose = cmd_line_has_flag(cmdline, str8_lit("verbose")); //- rjf: unpack dump subset flags RDI_DumpSubsetFlags rdi_dump_subset_flags = RDI_DumpSubsetFlag_All; @@ -1234,7 +1239,7 @@ rb_thread_entry_point(void *p) } lane_sync(); { - String8List dump = dw_dump_list_from_sections(arena, &dw, arch, dw_dump_subset_flags); + String8List dump = dw_dump_list_from_sections(arena, &dw, arch, dw_dump_subset_flags, verbose); if(lane_idx() == 0) { str8_list_concat_in_place(&output_blobs, &dump); From 2ccb6f64097073e49b7d31f254889d9469030162 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 5 Feb 2026 13:38:49 -0800 Subject: [PATCH 153/850] natvis --- src/natvis/base.natvis | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/natvis/base.natvis b/src/natvis/base.natvis index 447d3d4c..c4387550 100644 --- a/src/natvis/base.natvis +++ b/src/natvis/base.natvis @@ -154,6 +154,7 @@ + {{ count={count} first={first} }} count @@ -166,6 +167,19 @@ + + {{ op_count={op_count} encoded_size={encoded_size} first_op={first_op} }} + + op_count + + op_count + first_op + next + this + + + + From 7d4a64aae68ba603ec0878901ba1ad46073ad658 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 5 Feb 2026 13:40:49 -0800 Subject: [PATCH 154/850] change size of immediate on Cond opcode to match Skip immediate size --- src/rdi/rdi.mdesk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index f0176573..ba82843e 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1219,7 +1219,7 @@ RDI_EvalOpTable: { {Stop 0 0 0 0} {Noop 1 0 0 0} - {Cond 2 1 1 0} + {Cond 2 2 1 0} {Skip 3 2 0 0} {MemRead 4 1 1 1} {RegRead 5 4 0 1} From 5986e595ce287dda982042b32d79aeb8b4630e25 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 5 Feb 2026 13:42:45 -0800 Subject: [PATCH 155/850] eval type group for F80 and F128 --- src/lib_rdi/rdi.c | 6 ++++-- src/lib_rdi/rdi.h | 6 +++++- src/rdi/rdi.mdesk | 16 +++++++++------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 78681bbf..ee71d957 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -62,7 +62,7 @@ RDI_U16 rdi_eval_op_ctrlbits_table[54] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(1, 1, 0), +RDI_EVAL_CTRLBITS(2, 1, 0), RDI_EVAL_CTRLBITS(2, 0, 0), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(4, 0, 1), @@ -116,13 +116,15 @@ RDI_EVAL_CTRLBITS(0, 0, 1), RDI_EVAL_CTRLBITS(0, 0, 0), }; -struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[6] = +struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[8] = { {{RDI_EvalConversionKind_OtherToOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther}}, {{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, {{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, {{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal}}, {{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, {{RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop}}, }; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index b72a7af9..2fba3f42 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -464,7 +464,9 @@ RDI_EvalTypeGroup_U = 1, RDI_EvalTypeGroup_S = 2, RDI_EvalTypeGroup_F32 = 3, RDI_EvalTypeGroup_F64 = 4, -RDI_EvalTypeGroup_COUNT = 5, +RDI_EvalTypeGroup_F80 = 5, +RDI_EvalTypeGroup_F128 = 6, +RDI_EvalTypeGroup_COUNT = 7, } RDI_EvalTypeGroupEnum; typedef RDI_U8 RDI_EvalConversionKind; @@ -990,6 +992,8 @@ X(U)\ X(S)\ X(F32)\ X(F64)\ +X(F80)\ +X(F128)\ #define RDI_EvalConversionKind_XList \ X(Noop)\ diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index ba82843e..fb0cf030 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1275,15 +1275,17 @@ RDI_EvalOpTable: // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form // e.g. x:0, y:0 means other -> other, x:3, y:1 means uint -> f32, etc. -@table(name value ck0 ck1 ck2 ck3 ck4) +@table(name value ck0 ck1 ck2 ck3 ck4 ck5 ck6) RDI_EvalTypeGroupTable: { - {Other 0 OtherToOther FromOther FromOther FromOther FromOther } - {U 1 ToOther Noop Noop Legal Legal } - {S 2 ToOther Noop Noop Legal Legal } - {F32 3 ToOther Legal Legal Noop Legal } - {F64 4 ToOther Legal Legal Legal Noop } - {COUNT 5 Noop Noop Noop Noop Noop } + {Other 0 OtherToOther FromOther FromOther FromOther FromOther FromOther FromOther} + {U 1 ToOther Noop Noop Legal Legal Legal Legal } + {S 2 ToOther Noop Noop Legal Legal Legal Legal } + {F32 3 ToOther Legal Legal Noop Legal Legal Legal } + {F64 4 ToOther Legal Legal Legal Noop Legal Legal } + {F80 5 ToOther Legal Legal Legal Legal Noop Legal } + {F128 6 ToOther Legal Legal Legal Legal Legal Noop } + {COUNT 7 Noop Noop Noop Noop Noop Noop Noop } } @table(name value error_string) From 4b893d50ec968ebfbece4f85950c65e0d5ebc6be Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 5 Feb 2026 13:44:21 -0800 Subject: [PATCH 156/850] implement swap and drop opcodes; stub out GNU_UnInit --- src/rdi_from_dwarf/rdi_from_dwarf.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 30fa1a4c..ce8ebd1e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1330,12 +1330,21 @@ d2r_bytecode_from_expression(Arena *arena, d2r_value_type_stack_push(scratch.arena, stack, d2r_value_type_stack_peek(stack)); } break; case DW_ExprOp_Rot: { AssertAlways(!"no suitable conversion"); } break; - case DW_ExprOp_Swap: { AssertAlways(!"no suitable conversion"); } break; - case DW_ExprOp_Drop: { AssertAlways(!"no suitable conversion"); } break; + case DW_ExprOp_Swap: { + D2R_ValueType a = d2r_value_type_stack_pop(stack); + D2R_ValueType b = d2r_value_type_stack_pop(stack); + d2r_value_type_stack_push(scratch.arena, stack, a); + d2r_value_type_stack_push(scratch.arena, stack, b); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Swap, 0); + } break; + case DW_ExprOp_Drop: { + d2r_value_type_stack_pop(stack); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pop, 0); + } break; case DW_ExprOp_StackValue: { rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Stop, 0); if (stack->top->type == D2R_ValueType_Address) { - stack->top->type = d2r_unsigned_value_type_from_bit_size(address_size * 8); + stack->top->type = d2r_unsigned_value_type_from_bit_size(cu->address_size * 8); } } break; case DW_ExprOp_FormTlsAddress: @@ -1349,7 +1358,9 @@ d2r_bytecode_from_expression(Arena *arena, rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, d2r_value_type_to_rdi(lhs)); d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); } break; - + case DW_ExprOp_GNU_UnInit: { + // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; + } break; default: InvalidPath; break; } if (!is_ok) { break; } From edd982852eeed1c6e07b2d22fc86bc06170e04cf Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 5 Feb 2026 17:42:24 -0800 Subject: [PATCH 157/850] pass over DWARF converter - prepare to thread line table conversion - error handling - organizational improvements --- src/radbin/radbin_main.c | 2 + src/raddbg/raddbg_main.c | 2 + src/rdi_from_dwarf/rdi_from_dwarf.c | 2105 +++++++++++++++------------ src/rdi_from_dwarf/rdi_from_dwarf.h | 293 ++-- 4 files changed, 1340 insertions(+), 1062 deletions(-) diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 5b742c04..64e03163 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -13,6 +13,7 @@ //- rjf: [h] #include "base/base_inc.h" #include "linker/hash_table.h" +#include "linker/lf_hash_table.h" #include "os/os_inc.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" @@ -39,6 +40,7 @@ //- rjf: [c] #include "base/base_inc.c" #include "linker/hash_table.c" +#include "linker/lf_hash_table.c" #include "os/os_inc.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 7812a03a..1b3bcfb3 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -196,6 +196,7 @@ #include "base/base_inc.h" #include "x64/x64.h" #include "linker/hash_table.h" +#include "linker/lf_hash_table.h" #include "os/os_inc.h" #include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" @@ -249,6 +250,7 @@ #include "base/base_inc.c" #include "x64/x64.c" #include "linker/hash_table.c" +#include "linker/lf_hash_table.c" #include "os/os_inc.c" #include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index ce8ebd1e..5ae83a54 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -3,241 +3,7 @@ //////////////////////////////// -thread_static D2R_Log g_d2r_log; - -//////////////////////////////// - -static const U64 UNIT_CHUNK_CAP = 256; -static const U64 UDT_CHUNK_CAP = 256; -static const U64 TYPE_CHUNK_CAP = 256; -static const U64 SRC_FILE_CAP = 256; -static const U64 LINE_TABLE_CAP = 256; -static const U64 LOCATIONS_CAP = 256; -static const U64 GVAR_CHUNK_CAP = 256; -static const U64 TVAR_CHUNK_CAP = 256; -static const U64 PROC_CHUNK_CAP = 256; -static const U64 SCOPE_CHUNK_CAP = 256; -static const U64 INLINE_SITE_CHUNK_CAP = 256; - -RDIM_TopLevelInfo top_level_info = {0}; -RDIM_BinarySectionList binary_sections = {0}; -RDIM_UnitChunkList units = {0}; -RDIM_UDTChunkList udts = {0}; -RDIM_TypeChunkList types = {0}; -RDIM_SrcFileChunkList src_files = {0}; -RDIM_LineTableChunkList line_tables = {0}; -RDIM_LocationChunkList locations = {0}; -RDIM_SymbolChunkList gvars = {0}; -RDIM_SymbolChunkList tvars = {0}; -RDIM_SymbolChunkList procs = {0}; -RDIM_ScopeChunkList scopes = {0}; -RDIM_InlineSiteChunkList inline_sites = {0}; - -//////////////////////////////// -//~ rjf: Enum Conversion Helpers - -internal RDI_Language -d2r_rdi_language_from_dw_language(DW_Language v) -{ - RDI_Language result = RDI_Language_NULL; - switch(v) - { - default:{}break; - - case DW_Language_C89: - case DW_Language_C99: - case DW_Language_C11: - case DW_Language_C: - { - result = RDI_Language_C; - }break; - - case DW_Language_CPlusPlus03: - case DW_Language_CPlusPlus11: - case DW_Language_CPlusPlus14: - case DW_Language_CPlusPlus: - { - result = RDI_Language_CPlusPlus; - }break; - } - return result; -} - -internal RDI_RegCodeX64 -d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v) -{ - RDI_RegCodeX64 result = RDI_RegCode_nil; - switch(v) - { - default:{}break; -#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw:{result = RDI_RegCodeX64_##reg_rdi;}break; - DW_Regs_X64_XList -#undef X - } - return result; -} - -internal RDI_RegCode -d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v) -{ - RDI_RegCode result = RDI_RegCode_nil; - switch(arch) - { - default: NotImplemented; break; - case Arch_Null: break; - case Arch_x64:{result = d2r_rdi_reg_code_from_dw_reg_x64(v);}break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Type Conversion Helpers - -internal RDIM_Type * -d2r_create_type(Arena *arena, D2R_TypeTable *type_table) -{ - RDIM_Type *type = rdim_type_chunk_list_push(arena, type_table->types, type_table->type_chunk_cap); - return type; -} - -internal RDIM_Type * -d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off) -{ - RDIM_Type *type = d2r_create_type(arena, type_table); - Assert(hash_table_search_u64_raw(type_table->ht, info_off) == 0); - hash_table_push_u64_raw(arena, type_table->ht, info_off, type); - return type; -} - -internal RDIM_Type * -d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off) -{ - RDIM_Type *type = hash_table_search_u64_raw(type_table->ht, info_off); - if (type == 0) { - type = type_table->builtin_types[RDI_TypeKind_NULL]; - } - return type; -} - -internal RDIM_Type * -d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; - - // find attrib - DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); - - // does tag have this attribute? - if (attrib->attrib_kind == kind) { - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - - if (value_class == DW_AttribClass_Reference) { - // resolve reference - DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); - - // TODO: support for external compile unit references - AssertAlways(ref.cu == cu); - - // find type - type = d2r_type_from_offset(type_table, ref.info_off); - } else { - Assert(!"unexpected attrib class"); - } - } - - return type; -} - -internal Rng1U64List -d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) -{ - // collect non-contiguous range - Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); - - // exclude invalid ranges caused by linker optimizations - Rng1U64List ranges = {0}; - for (Rng1U64Node *n = raw_ranges.first, *next = 0; n != 0; n = next) { - next = n->next; - if (n->v.min < image_base || n->v.min > n->v.max) { - continue; - } - rng1u64_list_push_node(&ranges, n); - } - - // debase ranges - for EachNode(r, Rng1U64Node, ranges.first) { - r->v.min -= image_base; - r->v.max -= image_base; - } - - // collect contiguous range - { - DW_Attrib *lo_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_LowPc); - DW_Attrib *hi_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_HighPc); - if (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) { - U64 lo_pc = dw_address_from_attrib(input, cu, lo_pc_attrib); - - U64 hi_pc = 0; - DW_AttribClass hi_pc_class = dw_value_class_from_attrib(cu, hi_pc_attrib); - if (hi_pc_class == DW_AttribClass_Address) { - hi_pc = dw_address_from_attrib(input, cu, hi_pc_attrib); - } else if (hi_pc_class == DW_AttribClass_Const) { - hi_pc = dw_const_u64_from_attrib(input, cu, hi_pc_attrib); - hi_pc += lo_pc; - } else { - AssertAlways(!"unexpected attribute encoding"); - } - - if (lo_pc >= image_base && hi_pc >= image_base) { - if (lo_pc < hi_pc) { - rng1u64_list_push(arena, &ranges, rng_1u64(lo_pc - image_base, hi_pc - image_base)); - } else { - // TODO: error handling - } - } else { - // invalid low and hi PC are likely are caused by an optimization pass during linking - } - } else if ((lo_pc_attrib->attrib_kind == DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) || - (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind == DW_AttribKind_Null)) { - // TODO: error handling - } - } - - return ranges; -} - -internal RDIM_Type ** -d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) -{ - Temp scratch = scratch_begin(&arena, 1); - - RDIM_TypeList list = {0}; - B32 has_vargs = 0; - for (DW_TagNode *i = cur_node->first_child; i != 0; i = i->sibling) { - if (i->tag.kind == DW_TagKind_FormalParameter) { - RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1); - n->v = d2r_type_from_attrib(type_table, input, cu, i->tag, DW_AttribKind_Type); - SLLQueuePush(list.first, list.last, n); - ++list.count; - } else if (i->tag.kind == DW_TagKind_UnspecifiedParameters) { - has_vargs = 1; - } - } - - if (has_vargs) { - RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1); - n->v = type_table->builtin_types[RDI_TypeKind_Variadic]; - SLLQueuePush(list.first, list.last, n); - ++list.count; - } - - // collect params - *param_count_out = list.count; - RDIM_Type **params = rdim_array_from_type_list(arena, list); - - scratch_end(scratch); - return params; -} +static D2R_Shared g_d2r_shared; //////////////////////////////// @@ -258,10 +24,11 @@ rdim_is_eval_bytecode_static(RDIM_EvalBytecode bc) return is_static; } -internal U64 -rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) +internal B32 +rdim_static_eval_bytecode_to_voff(RDIM_EvalBytecode bc, U64 image_base, U64 *voff_out) { Temp scratch = scratch_begin(0,0); + B32 is_ok = 0; typedef union { U16 u16; U32 u32; U64 u64; S64 s64; F32 f32; F64 f64; } Value; U64 stack_cap = 128, stack_count = 0; @@ -273,9 +40,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) { U32 pop_count = RDI_POPN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[opcode_n->op]); if (pop_count > stack_count) { - // TODO: report error - Assert(!"malformed byte code"); - break; + goto exit; } stack_count -= pop_count; svals = stack + stack_count; @@ -315,7 +80,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = abs_s64(svals[0].s64); } break; case RDI_EvalTypeGroup_F32: { nval.f32 = abs_f32(svals[0].f32); } break; case RDI_EvalTypeGroup_F64: { nval.f64 = abs_f64(svals[0].f64); } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Neg: { @@ -325,7 +90,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.u64 = ~svals[0].u64 + 1; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = -svals[0].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = -svals[0].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Add: { @@ -335,7 +100,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 + svals[1].s64; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 + svals[1].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 + svals[1].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Sub: { @@ -345,7 +110,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = svals[1].s64 - svals[1].s64; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 - svals[1].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 - svals[1].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Mul: { @@ -355,7 +120,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 * svals[1].s64; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 * svals[1].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 * svals[1].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Div: { @@ -366,11 +131,13 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { is_div_by_zero = svals[1].s64 == 0; } break; case RDI_EvalTypeGroup_F32: { is_div_by_zero = svals[1].f32 == 0.0f; } break; case RDI_EvalTypeGroup_F64: { is_div_by_zero = svals[1].f64 == 0.0; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } - // TODO: report error - AssertAlways(!is_div_by_zero); + if (is_div_by_zero) { + Assert(!"trying to div by zero"); + goto exit; + } switch (imm.u64) { case RDI_EvalTypeGroup_Other: {} break; @@ -378,7 +145,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 / svals[1].s64; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 / svals[1].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 / svals[1].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Mod: { @@ -386,39 +153,39 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_Other: {} break; case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 % svals[1].u64; } break; case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 % svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 MOD is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 MOD is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_F32: { Assert(!"F32 MOD is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 MOD is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_LShift: { switch (imm.u64) { case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 << svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 << svals[1].u64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 LShift is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 LShift is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 << svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 << svals[1].u64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 LShift is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 LShift is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_RShift: { switch (imm.u64) { case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 >> svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[1].s64 >> svals[1].u64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 RShift is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 RShift is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0 ] .u64 >> svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[1 ] .s64 >> svals[1].u64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 RShift is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 RShift is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_BitAnd: { switch (imm.u64) { case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 | svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 | svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 bitwise AND is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 bitwise AND is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 | svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 | svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 bitwise AND is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 bitwise AND is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_BitXor: { @@ -426,19 +193,19 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_Other: {} break; case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 ^ svals[1].u64; } break; case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 ^ svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 XOR is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 XOR is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_F32: { Assert(!"F32 XOR is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 XOR is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_BitNot: { switch (imm.u64) { case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = ~svals[0].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = ~svals[0].u64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 bitwise NOT is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 bitwise NOT is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_U: { nval.u64 = ~svals[0].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = ~svals[0].u64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 bitwise NOT is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 bitwise NOT is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_LogAnd: { @@ -446,29 +213,29 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_Other: {} break; case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 && svals[1].u64; } break; case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 && svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 AND is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 AND is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_F32: { Assert(!"F32 AND is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 AND is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_LogOr: { switch (imm.u64) { case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 || svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 || svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 OR is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 OR is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 || svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 || svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 OR is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 OR is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_LogNot: { switch (imm.u64) { case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = !svals[0].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = !svals[0].u64; } break; - case RDI_EvalTypeGroup_F32: { AssertAlways(!"F32 NOT is not supported"); } break; // TODO: report error - case RDI_EvalTypeGroup_F64: { AssertAlways(!"F64 NOT is not supported"); } break; // TODO: report error - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + case RDI_EvalTypeGroup_U: { nval.u64 = !svals[0].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = !svals[0].u64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 NOT is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 NOT is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_EqEq: { @@ -484,7 +251,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 <= svals[1].s64; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 <= svals[1].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 <= svals[1].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_GrEq: { @@ -494,7 +261,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 >= svals[1].s64; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 >= svals[1].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 >= svals[1].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Less: { @@ -504,7 +271,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 < svals[1].s64; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 < svals[1].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 < svals[1].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Grtr: { @@ -514,7 +281,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 > svals[1].s64; } break; case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 > svals[1].f32; } break; case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 > svals[1].f64; } break; - default: { AssertAlways(!"unexpected eval type group"); } break; // report error + default: { Assert(!"unexpected eval type group"); } goto exit; } } break; case RDI_EvalOp_Trunc: { @@ -522,8 +289,8 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) U64 mask = max_U64 >> (64 - imm.u64); nval.u64 = svals[0].u64 & (max_U64 >> (64 - imm.u64)); } else if (imm.u64 > 64) { - // TODO: report error - AssertAlways(!"malformed bytecode"); + Assert(!"malformed bytecode"); + goto exit; } } break; case RDI_EvalOp_TruncSigned: { @@ -536,8 +303,8 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) } nval.u64 = high | (svals[0].u64 & mask); } else if (imm.u64 > 64) { - // TODO: report error - AssertAlways(!"malformed bytecode"); + Assert(!"malformed bytecode"); + goto exit; } } break; case RDI_EvalOp_Convert: { @@ -555,7 +322,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].u64; } break; case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].s64; } break; case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].f32; } break; - default: { Assert(!"unexpected conversion case"); } break; // report error + default: { Assert(!"unexpected conversion case"); } goto exit; } } } break; @@ -563,8 +330,8 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) if (stack_count > imm.u64) { nval = stack[stack_count - imm.u64 - 1]; } else { - // TODO: report error - AssertAlways(!"malformed bytecode"); + Assert(!"malformed bytecode"); + goto exit; } } break; case RDI_EvalOp_Pop: {} break; @@ -576,8 +343,8 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) MemoryCopy(shift, dst, imm.u64 * sizeof(Value)); *dst = tval; } else { - // TODO: report error - AssertAlways(!"malformed bytecode"); + Assert(!"malformed bytecode"); + goto exit; } } break; case RDI_EvalOp_ValueRead: { @@ -595,7 +362,7 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) case 2: { nval.u16 = bswap_u16(svals[0].u16); } break; case 4: { nval.u32 = bswap_u16(svals[0].u32); } break; case 8: { nval.u64 = bswap_u16(svals[0].u64); } break; - default: { AssertAlways(!"malformed bytecode"); } break; // TODO: report error + default: { Assert(!"malformed bytecode"); } goto exit; } } break; case RDI_EvalOp_Swap: { @@ -612,7 +379,8 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) stack[stack_count] = nval; stack_count += 1; } else { - AssertAlways(!"stack overflow"); // TODO: report error + Assert(!"stack overflow"); + goto exit; } } } @@ -622,13 +390,64 @@ rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base) if (stack_count >= 1) { result = stack[0].u64 - image_base; } + if (voff_out) { + *voff_out = result; + } + is_ok = 1; +exit:; scratch_end(scratch); + return is_ok; +} + +internal RDI_Language +d2r_rdi_language_from_dw_language(DW_Language v) +{ + RDI_Language result = RDI_Language_NULL; + switch (v) { + default: {} break; + + case DW_Language_C89: + case DW_Language_C99: + case DW_Language_C11: + case DW_Language_C: { + result = RDI_Language_C; + } break; + + case DW_Language_CPlusPlus03: + case DW_Language_CPlusPlus11: + case DW_Language_CPlusPlus14: + case DW_Language_CPlusPlus: { + result = RDI_Language_CPlusPlus; + } break; + } return result; } -//////////////////////////////// -//~ rjf: Bytecode Conversion Helpers +internal RDI_RegCodeX64 +d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v) +{ + RDI_RegCodeX64 result = RDI_RegCode_nil; + switch (v) { + default: {} break; +#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw: { result = RDI_RegCodeX64_##reg_rdi; } break; + DW_Regs_X64_XList +#undef X + } + return result; +} + +internal RDI_RegCode +d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v) +{ + RDI_RegCode result = RDI_RegCode_nil; + switch (arch) { + default: NotImplemented; break; + case Arch_Null: break; + case Arch_x64:{ result = d2r_rdi_reg_code_from_dw_reg_x64(v); } break; + } + return result; +} internal D2R_ValueTypeNode * d2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type) @@ -666,103 +485,92 @@ d2r_value_type_stack_peek(D2R_ValueTypeStack *stack) return stack->top ? stack->top->type : D2R_ValueType_Generic; } -internal D2R_ValueType -d2r_unsigned_value_type_from_bit_size(U64 bit_size) -{ - switch (bit_size) { - case 8: return D2R_ValueType_U8; - case 16: return D2R_ValueType_U16; - case 32: return D2R_ValueType_U32; - case 64: return D2R_ValueType_U64; - case 128: return D2R_ValueType_U128; - case 256: return D2R_ValueType_U256; - case 512: return D2R_ValueType_U512; - } - AssertAlways(!"no suitable unsigned type was found for the specified size"); - return D2R_ValueType_Generic; -} - internal D2R_ValueType d2r_signed_value_type_from_bit_size(U64 bit_size) { switch (bit_size) { - case 8: return D2R_ValueType_S8; - case 16: return D2R_ValueType_S16; - case 32: return D2R_ValueType_S32; - case 64: return D2R_ValueType_S64; - case 128: return D2R_ValueType_S128; - case 256: return D2R_ValueType_S256; - case 512: return D2R_ValueType_S512; +#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; + D2R_ValueType_Signed_XList +#undef X } AssertAlways(!"no suitable signed type was found for the specified size"); return D2R_ValueType_Generic; } internal D2R_ValueType -d2r_float_type_from_bit_size(U64 bit_size) +d2r_unsigned_value_type_from_bit_size(U64 bit_size) { switch (bit_size) { - case 4: return D2R_ValueType_F32; - case 8: return D2R_ValueType_F64; +#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; + D2R_ValueType_Unsigned_XList +#undef X } + AssertAlways(!"no suitable unsigned type was found for the specified size"); + return D2R_ValueType_Generic; +} + +internal D2R_ValueType +d2r_float_type_from_bit_size(U64 bit_size) +{ +#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; + switch (bit_size) { + D2R_ValueType_Float_XList + } +#undef X AssertAlways(!"no suitable type was found for the specified size"); return D2R_ValueType_Generic; } -internal RDI_EvalTypeGroup -d2r_value_type_to_rdi(D2R_ValueType v) +internal D2R_ArithmeticType +d2r_arithmetic_type_from_value_type(D2R_ValueType v) { - RDI_EvalTypeGroup result = RDI_EvalTypeGroup_Other; - switch(v) - { - case D2R_ValueType_Generic: - {result = RDI_EvalTypeGroup_Other;}break; - case D2R_ValueType_U8: - case D2R_ValueType_U16: - case D2R_ValueType_U32: - case D2R_ValueType_U64: - {result = RDI_EvalTypeGroup_U;}break; - case D2R_ValueType_S8: - case D2R_ValueType_S16: - case D2R_ValueType_S32: - case D2R_ValueType_S64: - {result = RDI_EvalTypeGroup_S;}break; - case D2R_ValueType_F32: - {result = RDI_EvalTypeGroup_F32;}break; - case D2R_ValueType_F64: - {result = RDI_EvalTypeGroup_F64;}break; - case D2R_ValueType_Address: - {result = RDI_EvalTypeGroup_U;}break; - default: - case D2R_ValueType_ImplicitValue: - {AssertAlways(!"unable to convert value type to RDI equivalent");}break; +#define X(_N, _AT, ...) case D2R_ValueType_##_N: return D2R_ArithmeticType_##_AT; + switch (v) { + D2R_ValueType_XList } - return result; +#undef X + return D2R_ArithmeticType_Null; +} + +internal B32 +d2r_is_value_type_signed(D2R_ValueType v) +{ + return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Signed; +} + +internal B32 +d2r_is_value_type_integral(D2R_ValueType v) +{ + D2R_ArithmeticType at = d2r_arithmetic_type_from_value_type(v); + return at == D2R_ArithmeticType_Unsigned || at == D2R_ArithmeticType_Signed; +} + +internal B32 +d2r_is_value_type_unsigned(D2R_ValueType v) +{ + return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Unsigned; +} + +internal B32 +d2r_is_value_type_float(D2R_ValueType v) +{ + return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Float; } internal U64 d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type) { - switch (value_type) { - case D2R_ValueType_Address: return addr_size; - case D2R_ValueType_U8: return 1; - case D2R_ValueType_U16: return 2; - case D2R_ValueType_U32: return 4; - case D2R_ValueType_U64: return 8; - case D2R_ValueType_U128: return 16; - case D2R_ValueType_U256: return 32; - case D2R_ValueType_U512: return 64; - case D2R_ValueType_S8: return 1; - case D2R_ValueType_S16: return 2; - case D2R_ValueType_S32: return 4; - case D2R_ValueType_S64: return 8; - case D2R_ValueType_S128: return 16; - case D2R_ValueType_S256: return 32; - case D2R_ValueType_S512: return 64; - case D2R_ValueType_F32: return 4; - case D2R_ValueType_F64: return 8; - default: return 0; + if (value_type == D2R_ValueType_Address) { + return addr_size; } + + switch (value_type) { +#define X(_N, _AT, _S) case D2R_ValueType_##_N: return _S; + D2R_ValueType_XList +#undef X + } + + return 0; } internal D2R_ValueType @@ -772,16 +580,16 @@ d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs) return lhs; } // unsigned vs unsigned - else if (D2R_ValueType_IsUnsigned(lhs) && D2R_ValueType_IsUnsigned(rhs)) { + else if (d2r_is_value_type_unsigned(lhs) && d2r_is_value_type_unsigned(rhs)) { return Max(lhs, rhs); } // signed vs signed - else if (D2R_ValueType_IsSigned(lhs) && D2R_ValueType_IsSigned(rhs)) { + else if (d2r_is_value_type_signed(lhs) && d2r_is_value_type_signed(rhs)) { return Max(lhs, rhs); } // (unsigned vs signed) || (signed vs unsigned) - else if ((D2R_ValueType_IsUnsigned(lhs) && D2R_ValueType_IsSigned(rhs)) || - (D2R_ValueType_IsSigned(lhs) && D2R_ValueType_IsUnsigned(rhs))) { + else if ((d2r_is_value_type_unsigned(lhs) && d2r_is_value_type_signed(rhs)) || + (d2r_is_value_type_signed(lhs) && d2r_is_value_type_unsigned(rhs))) { U64 lhs_size = d2r_size_from_value_type(0, lhs); U64 rhs_size = d2r_size_from_value_type(0, rhs); if (lhs_size < rhs_size) { @@ -793,31 +601,31 @@ d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs) } } // float vs int - else if (D2R_ValueType_IsFloat(lhs) && D2R_ValueType_IsInt(rhs)) { + else if (d2r_is_value_type_float(lhs) && d2r_is_value_type_integral(rhs)) { return lhs; } // int vs float - else if (D2R_ValueType_IsInt(lhs) && D2R_ValueType_IsFloat(rhs)) { + else if (d2r_is_value_type_integral(lhs) && d2r_is_value_type_float(rhs)) { return rhs; } // float vs float - else if (D2R_ValueType_IsFloat(lhs) && D2R_ValueType_IsFloat(rhs)) { + else if (d2r_is_value_type_float(lhs) && d2r_is_value_type_float(rhs)) { return Max(lhs, rhs); } // address vs int - else if (lhs == D2R_ValueType_Address && D2R_ValueType_IsInt(rhs)) { + else if (lhs == D2R_ValueType_Address && d2r_is_value_type_integral(rhs)) { return D2R_ValueType_Address; } // int vs address - else if (D2R_ValueType_IsInt(lhs) && rhs == D2R_ValueType_Address) { + else if (d2r_is_value_type_integral(lhs) && rhs == D2R_ValueType_Address) { return D2R_ValueType_Address; } // address vs float - else if (lhs == D2R_ValueType_Address && D2R_ValueType_IsFloat(rhs)) { + else if (lhs == D2R_ValueType_Address && d2r_is_value_type_float(rhs)) { return D2R_ValueType_Generic; } // float vs address - else if (D2R_ValueType_IsFloat(lhs) && rhs == D2R_ValueType_Address) { + else if (d2r_is_value_type_float(lhs) && rhs == D2R_ValueType_Address) { return D2R_ValueType_Generic; } // no conversion for implicit value @@ -828,6 +636,40 @@ d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs) return D2R_ValueType_Generic; } +internal RDI_EvalTypeGroup +d2r_value_type_to_rdi(D2R_ValueType v) +{ + if (v == D2R_ValueType_Generic) { + return RDI_EvalTypeGroup_Other; + } + + if (v == D2R_ValueType_Address) { + return RDI_EvalTypeGroup_U; + } + + if (d2r_is_value_type_unsigned(v)) { + return RDI_EvalTypeGroup_U; + } + + if (d2r_is_value_type_signed(v)) { + return RDI_EvalTypeGroup_S; + } + + if (d2r_is_value_type_float(v)) { + if (v == D2R_ValueType_F16) { NotImplemented; } + else if (v == D2R_ValueType_F32) { return RDI_EvalTypeGroup_F32; } + else if (v == D2R_ValueType_F48) { NotImplemented; } + else if (v == D2R_ValueType_F64) { return RDI_EvalTypeGroup_F64; } + else if (v == D2R_ValueType_F80) { return RDI_EvalTypeGroup_F80; } + else if (v == D2R_ValueType_F96) { NotImplemented; } + else if (v == D2R_ValueType_F128) { return RDI_EvalTypeGroup_F128; } + else { InvalidPath; } + } + + InvalidPath; + return RDI_EvalTypeGroup_Other; +} + internal D2R_ValueType d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc) { @@ -858,12 +700,12 @@ d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecod D2R_ValueType rhs = d2r_value_type_stack_pop(stack); D2R_ValueType lhs = d2r_value_type_stack_pop(stack); D2R_ValueType common_type; - if (D2R_ValueType_IsInt(lhs) && rhs == D2R_ValueType_Address) { + if (d2r_is_value_type_integral(lhs) && rhs == D2R_ValueType_Address) { rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0); rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(lhs), RDI_EvalTypeGroup_U); rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0); common_type = D2R_ValueType_Address; - } else if (lhs == D2R_ValueType_Address && D2R_ValueType_IsInt(rhs)) { + } else if (lhs == D2R_ValueType_Address && d2r_is_value_type_integral(rhs)) { rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(rhs), RDI_EvalTypeGroup_U); common_type = D2R_ValueType_Address; } else { @@ -874,35 +716,32 @@ d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecod } internal RDIM_EvalBytecode -d2r_bytecode_from_expression(Arena *arena, - DW_Input *input, - U64 image_base, - U64 address_size, - Arch arch, - DW_ListUnit *addr_lu, - String8 raw_expr, - DW_CompUnit *cu, +d2r_bytecode_from_expression(Arena *arena, + DW_Input *input, + U64 image_base, + Arch arch, + DW_ListUnit *addr_lu, + String8 raw_expr, + DW_CompUnit *cu, D2R_ValueType *result_type_out) { Temp scratch = scratch_begin(&arena, 1); - Temp arena_restore_point = temp_begin(arena); - + Temp temp = temp_begin(arena); + B32 is_ok = 0; + RDIM_EvalBytecode bc = {0}; - DW_Expr expr = dw_expr_from_data(scratch.arena, cu->format, address_size, raw_expr); + DW_Expr expr = dw_expr_from_data(scratch.arena, cu->format, cu->address_size, raw_expr); D2R_ValueTypeStack *stack = push_array(scratch.arena, D2R_ValueTypeStack, 1); RDIM_EvalBytecodeOp **converted_insts = push_array(scratch.arena, RDIM_EvalBytecodeOp *, expr.count); - B32 is_ok = 1; U64 inst_idx = 0; for EachNode(inst, DW_ExprInst, expr.first) { RDIM_EvalBytecodeOp *last_op = bc.last_op; U64 pop_count = dw_pop_count_from_expr_op(inst->opcode); if (pop_count > stack->count) { - // TODO: report error Assert(!"not enough values on the stack to evaluate instruction"); - is_ok = 0; - break; + goto exit; } switch (inst->opcode) { @@ -962,13 +801,14 @@ d2r_bytecode_from_expression(Arena *arena, d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S64); } break; case DW_ExprOp_Addr: { - if (inst->operands[0].u64 >= image_base) { - U64 voff = inst->operands[0].u64 - image_base; - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); - } else { - is_ok = 0; + if (inst->operands[0].u64 < image_base) { + Assert(!"invalid address"); + goto exit; } + + U64 voff = inst->operands[0].u64 - image_base; + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); } break; case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: @@ -996,7 +836,24 @@ d2r_bytecode_from_expression(Arena *arena, RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, inst->operands[0].u64); U32 regread_param = RDI_EncodeRegReadParam(reg_code_rdi, reg_size, reg_pos); rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, regread_param); - d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(reg_size)); + D2R_ValueType value_type; + if (arch == Arch_x64) { + if (reg_code_rdi == RDI_RegCodeX64_st0 || + reg_code_rdi == RDI_RegCodeX64_st1 || + reg_code_rdi == RDI_RegCodeX64_st2 || + reg_code_rdi == RDI_RegCodeX64_st3 || + reg_code_rdi == RDI_RegCodeX64_st4 || + reg_code_rdi == RDI_RegCodeX64_st5 || + reg_code_rdi == RDI_RegCodeX64_st6 || + reg_code_rdi == RDI_RegCodeX64_st7) { + value_type = d2r_float_type_from_bit_size(reg_size); + } else { + value_type = d2r_unsigned_value_type_from_bit_size(reg_size); + } + } else { + value_type = d2r_unsigned_value_type_from_bit_size(reg_size); + } + d2r_value_type_stack_push(scratch.arena, stack, value_type); } break; case DW_ExprOp_ImplicitValue: { if (inst->operands[0].block.size <= sizeof(U64)) { @@ -1006,7 +863,8 @@ d2r_bytecode_from_expression(Arena *arena, d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(inst->operands[0].block.size * 8)); } else { // TODO: currenlty no way to encode string in RDIM_EvalBytecodeOp - NotImplemented; + Assert(!"TODO:"); + goto exit; } } break; case DW_ExprOp_Piece: { @@ -1027,8 +885,8 @@ d2r_bytecode_from_expression(Arena *arena, rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, inst->operands[0].u64); d2r_value_type_stack_push(scratch.arena, stack, n->type); } else { - // TODO: report error - AssertAlways(!"out of bounds pick"); + Assert(!"out of bounds pick"); + goto exit; } } break; case DW_ExprOp_Over: { @@ -1036,8 +894,8 @@ d2r_bytecode_from_expression(Arena *arena, rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, 1); d2r_value_type_stack_push(scratch.arena, stack, stack->top->next->type); } else { - // TODO: report error - AssertAlways(!"out of bounds over"); + Assert(!"out of bounds over"); + goto exit; } } break; case DW_ExprOp_PlusUConst: { @@ -1053,21 +911,33 @@ d2r_bytecode_from_expression(Arena *arena, U16 cursor = 0; U64 inst_count = 0; for (DW_ExprInst *i = skip_fwd ? inst : inst->prev; i != 0 && cursor < delta; i = skip_fwd ? inst->next : inst->prev) { - cursor += inst->size; + cursor += i->size; inst_count += 1; } + + if (cursor != delta) { Assert(!"skip landed in middle of an instruction"); goto exit; } + if (inst_count > min_S16) { Assert(!"operand overflow"); goto exit; } + if (inst_idx > max_U32) { Assert(!"index overflow"); goto exit; } - // TODO: report error (skip does not land on first byte of an instruction) - AssertAlways(cursor == delta); - // TODO: report overflow - AssertAlways(inst_count <= min_S16); - AssertAlways(inst_idx <= max_U32); - - U64 imm = Compose64Bit(inst_idx, skip_fwd ? (S16)inst_count : -(S16)inst_count); + U64 imm = Compose64Bit(inst_idx, skip_fwd ? (S16)inst_count : (U16)(-(S16)inst_count)); rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Skip, imm); } break; case DW_ExprOp_Bra: { - NotImplemented; + B32 skip_fwd = inst->operands[0].s16 >= 0; + U16 delta = abs_s64(inst->operands[0].s16); + U16 cursor = 0; + U64 inst_count = 0; + for (DW_ExprInst *i = skip_fwd ? inst->next : inst->prev; i != 0 && cursor < delta; i = skip_fwd ? inst->next : inst->prev) { + cursor += i->size; + inst_count += 1; + } + + if (cursor != delta) { Assert(!"cond landed in middle of an instruction"); goto exit; } + if (inst_count > min_S16) { Assert(!"operand overflow"); goto exit; } + if (inst_idx > max_U32) { Assert(!"index overflow"); goto exit; } + + U64 imm = Compose64Bit(inst_idx, skip_fwd ? inst_count : (U16)(-(S16)inst_count)); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Cond, imm); } break; case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: @@ -1111,46 +981,47 @@ d2r_bytecode_from_expression(Arena *arena, } break; case DW_ExprOp_Deref: { D2R_ValueType address_type = d2r_value_type_stack_pop(stack); - if (address_type != D2R_ValueType_Address && !D2R_ValueType_IsInt(address_type)) { - // TODO: report error + if (address_type != D2R_ValueType_Address && !d2r_is_value_type_integral(address_type)) { Assert(!"value must be of integral type"); - break; + goto exit; } - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, address_size); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, cu->address_size); d2r_value_type_stack_push(scratch.arena, stack, address_type); } break; case DW_ExprOp_DerefSize: { D2R_ValueType address_type = d2r_value_type_stack_pop(stack); - if (!D2R_ValueType_IsInt(address_type) && address_type != D2R_ValueType_Address ) { - // TODO: report error + if (!d2r_is_value_type_integral(address_type) && address_type != D2R_ValueType_Address ) { Assert(!"value must be of integral type"); - break; + goto exit; } U8 deref_size_in_bytes = inst->operands[0].u64; - if (0 < deref_size_in_bytes && deref_size_in_bytes <= address_size) { + if (0 < deref_size_in_bytes && deref_size_in_bytes <= cu->address_size) { rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, deref_size_in_bytes); } else { - // TODO: error handling - AssertAlways(!"ill formed expression"); + Assert(!"ill formed expression"); + goto exit; } d2r_value_type_stack_push(scratch.arena, stack, address_type); } break; case DW_ExprOp_XDeref: { - // TODO: error handling - AssertAlways(!"multiple address spaces are not supported"); + Assert(!"multiple address spaces are not supported"); + goto exit; + } break; + case DW_ExprOp_XDerefSize: { + Assert(!"no suitable conversion"); + goto exit; } break; - // TODO: error handling - case DW_ExprOp_XDerefSize: { AssertAlways(!"no suitable conversion"); } break; case DW_ExprOp_Call2: case DW_ExprOp_Call4: case DW_ExprOp_CallRef: { - // TODO: error handling - AssertAlways(!"calls are not supported"); + Assert(!"calls are not supported"); + goto exit; } break; case DW_ExprOp_ImplicitPointer: case DW_ExprOp_GNU_ImplicitPointer: { - // TODO: - AssertAlways(!"sample"); + // TODO: RDI does not support encoding of implicit pointers + //Assert(!"TODO: implicit pointer"); + goto exit; } break; case DW_ExprOp_Convert: case DW_ExprOp_GNU_Convert: { @@ -1165,41 +1036,48 @@ d2r_bytecode_from_expression(Arena *arena, out = D2R_ValueType_Generic; } else { // find ref tag - DW_TagNode *tag_node = dw_tag_node_from_info_off(cu, inst->operands[0].u64); - DW_Tag tag = tag_node->tag; + U64 ref_tag_info_off = cu->info_range.min + inst->operands[0].u64; + DW_TagNode *tag_node = dw_tag_node_from_info_off(cu, ref_tag_info_off); + if (tag_node == 0) { + Assert(!"invalid .debug_info offset"); + goto exit; + } + + DW_Tag tag = tag_node->tag; if (tag.kind == DW_TagKind_BaseType) { // extract encoding attribute DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); - + // DW_ATE -> RDI_EvalTypeGroup switch (encoding) { - case DW_ATE_Null: { - out = D2R_ValueType_Generic; - } break; - case DW_ATE_Address: { - out = D2R_ValueType_Address; - } break; - case DW_ATE_Boolean: { - out = D2R_ValueType_S8; - } break; - case DW_ATE_SignedChar: - case DW_ATE_Signed: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_signed_value_type_from_bit_size(byte_size * 8); - } break; - case DW_ATE_UnsignedChar: - case DW_ATE_Unsigned: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_unsigned_value_type_from_bit_size(byte_size * 8); - } break; - case DW_ATE_Float: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_float_type_from_bit_size(byte_size * 8); - } break; - default: InvalidPath; break; + case DW_ATE_Null: { + out = D2R_ValueType_Generic; + } break; + case DW_ATE_Address: { + out = D2R_ValueType_Address; + } break; + case DW_ATE_Boolean: { + out = D2R_ValueType_S8; + } break; + case DW_ATE_SignedChar: + case DW_ATE_Signed: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_signed_value_type_from_bit_size(byte_size * 8); + } break; + case DW_ATE_UnsignedChar: + case DW_ATE_Unsigned: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_unsigned_value_type_from_bit_size(byte_size * 8); + } break; + case DW_ATE_Float: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_float_type_from_bit_size(byte_size * 8); + } break; + default: InvalidPath; break; } } else { - AssertAlways(!"unexpected tag"); // TODO: error handling + Assert(!"unexpected tag"); + goto exit; } } @@ -1207,20 +1085,27 @@ d2r_bytecode_from_expression(Arena *arena, d2r_value_type_stack_push(scratch.arena, stack, out); rdim_bytecode_push_convert(arena, &bc, d2r_value_type_to_rdi(in), d2r_value_type_to_rdi(out)); } break; - // TODO: - case DW_ExprOp_GNU_ParameterRef: { AssertAlways(!"sample"); } break; - // TODO: + case DW_ExprOp_GNU_ParameterRef: { + Assert(!"TODO: sample"); + goto exit; + } case DW_ExprOp_DerefType: - case DW_ExprOp_GNU_DerefType: { AssertAlways(!"sample"); } break; - // TODO: + case DW_ExprOp_GNU_DerefType: { + goto exit; + } case DW_ExprOp_ConstType: - case DW_ExprOp_GNU_ConstType: { AssertAlways(!"sample"); } break; - // TODO: - case DW_ExprOp_RegvalType: { AssertAlways(!"sample"); } break; + case DW_ExprOp_GNU_ConstType: { + Assert(!"TODO: sample"); + goto exit; + } + case DW_ExprOp_RegvalType: { + Assert(!"sample"); + goto exit; + } case DW_ExprOp_EntryValue: case DW_ExprOp_GNU_EntryValue: { D2R_ValueType call_site_result_type = 0; - RDIM_EvalBytecode call_site_bc = d2r_bytecode_from_expression(arena, input, image_base, address_size, arch, addr_lu, inst->operands[0].block, cu, &call_site_result_type); + RDIM_EvalBytecode call_site_bc = d2r_bytecode_from_expression(arena, input, image_base, arch, addr_lu, inst->operands[0].block, cu, &call_site_result_type); rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_CallSiteValue, safe_cast_u32(call_site_bc.encoded_size)); rdim_bytecode_concat_in_place(&bc, &call_site_bc); @@ -1235,12 +1120,12 @@ d2r_bytecode_from_expression(Arena *arena, rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff); d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); } else { - // TODO: error handling - AssertAlways(!"unable to relocate address"); + Assert(!"unable to relocate address"); + goto exit; } } else { - // TODO: error handling - AssertAlways(!"out of bounds index"); + Assert(!"out of bounds index"); + goto exit; } } break; case DW_ExprOp_CallFrameCfa: { @@ -1248,8 +1133,9 @@ d2r_bytecode_from_expression(Arena *arena, d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); } break; case DW_ExprOp_PushObjectAddress: { - AssertAlways(!"sample"); - } break; + Assert(!"TODO: sample"); + goto exit; + } case DW_ExprOp_Nop: {} break; case DW_ExprOp_Eq: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_EqEq); } break; case DW_ExprOp_Ge: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_GrEq); } break; @@ -1268,57 +1154,51 @@ d2r_bytecode_from_expression(Arena *arena, case DW_ExprOp_Shr: { D2R_ValueType rhs = d2r_value_type_stack_pop(stack); D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - if (D2R_ValueType_IsInt(rhs) && D2R_ValueType_IsInt(lhs)) { + if (d2r_is_value_type_integral(rhs) && d2r_is_value_type_integral(lhs)) { D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); - D2R_ValueType result_type = d2r_unsigned_value_type_from_bit_size(d2r_size_from_value_type((address_size), common_type) * 8); + D2R_ValueType result_type = d2r_unsigned_value_type_from_bit_size(d2r_size_from_value_type((cu->address_size), common_type) * 8); rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RShift, d2r_value_type_to_rdi(result_type)); d2r_value_type_stack_push(scratch.arena, stack, result_type); } else { - // TODO: report error - AssertAlways(!"operands must be of integral type"); + Assert(!"operands must be of integral type"); + goto exit; } } break; case DW_ExprOp_Shra: { D2R_ValueType rhs = d2r_value_type_stack_pop(stack); D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - if (D2R_ValueType_IsInt(lhs) && D2R_ValueType_IsInt(rhs)) { + if (d2r_is_value_type_integral(lhs) && d2r_is_value_type_integral(rhs)) { D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); - D2R_ValueType result_type = d2r_signed_value_type_from_bit_size(d2r_size_from_value_type((address_size), common_type) * 8); + D2R_ValueType result_type = d2r_signed_value_type_from_bit_size(d2r_size_from_value_type((cu->address_size), common_type) * 8); rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RShift, d2r_value_type_to_rdi(result_type)); d2r_value_type_stack_push(scratch.arena, stack, result_type); } else { - // TODO: report error - AssertAlways(!"operands must be of integral type"); + Assert(!"operands must be of integral type"); + goto exit; } } break; case DW_ExprOp_Mod: { D2R_ValueType rhs = d2r_value_type_stack_pop(stack); D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - if (!D2R_ValueType_IsInt(rhs) || !D2R_ValueType_IsInt(lhs)) { - // TODO: report error - AssertAlways(!"operands must be of integral type"); - is_ok = 0; - break; + if (!d2r_is_value_type_integral(rhs) || !d2r_is_value_type_integral(lhs)) { + Assert(!"operands must be of integral type"); + goto exit; } D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Mod, d2r_value_type_to_rdi(common_type)); d2r_value_type_stack_push(scratch.arena, stack, common_type); } break; case DW_ExprOp_Abs: { - if (!D2R_ValueType_IsInt(d2r_value_type_stack_peek(stack)) && !D2R_ValueType_IsFloat(d2r_value_type_stack_peek(stack))) { - // TODO: report error - AssertAlways(!"operand must be of integral type or float"); - is_ok = 0; - break; + if (!d2r_is_value_type_integral(d2r_value_type_stack_peek(stack)) && !d2r_is_value_type_float(d2r_value_type_stack_peek(stack))) { + Assert(!"operand must be of integral type or float"); + goto exit; } rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Abs, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack))); } break; case DW_ExprOp_Neg: { - if (!D2R_ValueType_IsInt(d2r_value_type_stack_peek(stack))) { - // TODO: report error - AssertAlways(!"operand must be of integral type"); - is_ok = 0; - break; + if (!d2r_is_value_type_integral(d2r_value_type_stack_peek(stack))) { + Assert(!"operand must be of integral type"); + goto exit; } rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Neg, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack))); } break; @@ -1329,7 +1209,10 @@ d2r_bytecode_from_expression(Arena *arena, rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, 0); d2r_value_type_stack_push(scratch.arena, stack, d2r_value_type_stack_peek(stack)); } break; - case DW_ExprOp_Rot: { AssertAlways(!"no suitable conversion"); } break; + case DW_ExprOp_Rot: { + Assert(!"no suitable conversion"); + goto exit; + } case DW_ExprOp_Swap: { D2R_ValueType a = d2r_value_type_stack_pop(stack); D2R_ValueType b = d2r_value_type_stack_pop(stack); @@ -1350,9 +1233,9 @@ d2r_bytecode_from_expression(Arena *arena, case DW_ExprOp_FormTlsAddress: case DW_ExprOp_GNU_PushTlsAddress: { D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - if (!D2R_ValueType_IsInt(lhs)) { - // TODO: report error - AssertAlways(!"lhs must be of integral type"); + if (!d2r_is_value_type_integral(lhs)) { + Assert(!"lhs must be of integral type"); + goto exit; } rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_TLSOff, 0); rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, d2r_value_type_to_rdi(lhs)); @@ -1361,9 +1244,8 @@ d2r_bytecode_from_expression(Arena *arena, case DW_ExprOp_GNU_UnInit: { // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; } break; - default: InvalidPath; break; + default: goto exit; } - if (!is_ok) { break; } // store converted instruction if (last_op != bc.last_op) { @@ -1374,73 +1256,74 @@ d2r_bytecode_from_expression(Arena *arena, inst_idx += 1; } - if (is_ok) { - // fixup bytecode - for EachNode(op, RDIM_EvalBytecodeOp, bc.first_op) { - if (op->op == RDI_EvalOp_Skip) { - // unpack skip info - U32 inst_idx = Extract32(op->p, 0); - S16 skip_count_signed = (S16)Extract32(op->p, 1); - U16 skip_count = abs_s64(skip_count_signed); - B32 skip_fwd = skip_count_signed > 0; - - // setup being/end links - RDIM_EvalBytecodeOp *begin = 0, *end = 0; - if (skip_fwd) { - if (inst_idx + skip_count <= expr.count) { - begin = converted_insts[inst_idx]; - end = (inst_idx + skip_count) < expr.count ? converted_insts[inst_idx + skip_count] : 0; - } else { - // TODO: report error - AssertAlways(!"out of bounds skip"); - } + // fixup bytecode jumps + for EachNode(op, RDIM_EvalBytecodeOp, bc.first_op) { + if (op->op == RDI_EvalOp_Skip || op->op == RDI_EvalOp_Cond) { + // unpack skip info + U32 inst_idx = Extract32(op->p, 1); + S16 skip_count_signed = (S16)Extract32(op->p, 0); + U16 skip_count = abs_s64(skip_count_signed); + B32 skip_fwd = skip_count_signed > 0; + + // setup being/end links + RDIM_EvalBytecodeOp *begin = 0, *end = 0; + if (skip_fwd) { + if (inst_idx + skip_count <= expr.count) { + begin = converted_insts[inst_idx]; + end = (inst_idx + skip_count) < expr.count ? converted_insts[inst_idx + skip_count] : 0; } else { - if (skip_count <= inst_idx) { - begin = converted_insts[inst_idx - skip_count]; - end = converted_insts[inst_idx]; - } else { - // TODO: report error - AssertAlways(!"out of bounds skip"); - } + Assert(!"out of bounds skip"); + goto exit; } - - // compute skip delta - U64 skip_delta = 0; - for (RDIM_EvalBytecodeOp *n = begin; n != end; n = n->next) { - skip_delta += n->p_size; + } else { + if (skip_count <= inst_idx) { + begin = converted_insts[inst_idx - skip_count]; + end = converted_insts[inst_idx]; + } else { + Assert(!"out of bounds skip"); + goto exit; } - - // rewrite skip operand with byte delta - AssertAlways(skip_delta <= max_S16); - op->p = skip_fwd ? (S16)skip_delta : -(S16)skip_delta; } + + // compute skip delta + U64 skip_delta = 0; + for (RDIM_EvalBytecodeOp *n = begin; n != end; n = n->next) { + skip_delta += n->p_size; + } + + // rewrite skip operand with byte delta + AssertAlways(skip_delta <= max_S16); + op->p = skip_fwd ? (S16)skip_delta : -(S16)skip_delta; } - - if (result_type_out) { - *result_type_out = d2r_value_type_stack_peek(stack); - } - } else { - MemoryZeroStruct(&bc); - temp_end(arena_restore_point); } + if (result_type_out) { + *result_type_out = d2r_value_type_stack_peek(stack); + } + + is_ok = 1; +exit:; + if (!is_ok) { + MemoryZeroStruct(&bc); + temp_end(temp); + } scratch_end(scratch); return bc; } internal RDIM_Location * -d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) +d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) { RDIM_Location *loc = 0; if (expr.size) { D2R_ValueType result_type = 0; - RDIM_EvalBytecode bytecode = d2r_bytecode_from_expression(arena, input, image_base, address_size, arch, addr_lu, expr, cu, &result_type); + RDIM_EvalBytecode bytecode = d2r_bytecode_from_expression(arena, input, image_base, arch, addr_lu, expr, cu, &result_type); RDIM_LocationInfo *loc_info = push_array(arena, RDIM_LocationInfo, 1); loc_info->kind = result_type == D2R_ValueType_Address ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; loc_info->bytecode = bytecode; - loc = rdim_location_chunk_list_push_new(arena, locations, LOCATIONS_CAP, loc_info); + loc = rdim_location_chunk_list_push_new(arena, locations, D2R_LOCATIONS_CAP, loc_info); } return loc; } @@ -1449,7 +1332,7 @@ internal RDIM_Location * d2r_location_from_attrib(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) { String8 expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, kind); - RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, cu->address_size, arch, cu->addr_lu, cu, expr); + RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, arch, cu->addr_lu, cu, expr); return location; } @@ -1479,7 +1362,7 @@ d2r_locset_from_attrib(Arena *arena, // convert location list to RDIM location set for EachNode(loc_n, DW_LocNode, loclist.first) { - RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, cu->address_size, arch, cu->addr_lu, cu, loc_n->v.expr); + RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, arch, cu->addr_lu, cu, loc_n->v.expr); RDIM_Rng1U64 voff_range = { .min = loc_n->v.range.min - image_base, .max = loc_n->v.range.max - image_base }; rdim_push_location_case(arena, scopes, &locset, location, voff_range); } @@ -1490,12 +1373,12 @@ d2r_locset_from_attrib(Arena *arena, String8 expr = dw_exprloc_from_attrib(input, cu, attrib); // convert expression and inherit life-time ranges from enclosed scope - RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, cu->address_size, arch, cu->addr_lu, cu, expr); + RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, arch, cu->addr_lu, cu, expr); for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { rdim_push_location_case(arena, scopes, &locset, location, range_n->v); } } else if (attrib_class != DW_AttribClass_Null) { - AssertAlways(!"unexpected attrib class"); + log_user_errorf("unexpected attrib class @ .debug_info+%llx", tag.info_off); } return locset; @@ -1518,8 +1401,8 @@ d2r_var_locset_from_tag(Arena *arena, B32 has_location = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Location); if (has_const_value && has_location) { - // TODO: error handling - AssertAlways(!"unexpected variable encoding"); + log_user_errorf("unexpected variable encoding @ .debug_info+%llx", tag.info_off); + return locset; } if (has_const_value) { @@ -1534,7 +1417,7 @@ d2r_var_locset_from_tag(Arena *arena, RDIM_LocationInfo *loc_info = push_array(arena, RDIM_LocationInfo, 1); loc_info->kind = RDI_LocationKind_ValBytecodeStream; loc_info->bytecode = bc; - RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, locations, LOCATIONS_CAP, loc_info); + RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, locations, D2R_LOCATIONS_CAP, loc_info); // push location cases for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { @@ -1547,140 +1430,62 @@ d2r_var_locset_from_tag(Arena *arena, return locset; } -internal D2R_CompUnitContribMap -d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) +internal RDIM_Type * +d2r_create_type(Arena *arena, D2R_TypeTable *type_table) { - Temp scratch = scratch_begin(&arena, 1); + RDIM_Type *type = rdim_type_chunk_list_push(arena, type_table->types, type_table->type_chunk_cap); + return type; +} + +internal RDIM_Type * +d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off) +{ + RDIM_Type *type = d2r_create_type(arena, type_table); + Assert(hash_table_search_u64_raw(type_table->ht, info_off) == 0); + hash_table_push_u64_raw(arena, type_table->ht, info_off, type); + return type; +} + +internal RDIM_Type * +d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off) +{ + RDIM_Type *type = hash_table_search_u64_raw(type_table->ht, info_off); + if (type == 0) { + type = type_table->builtin_types[RDI_TypeKind_NULL]; + } + return type; +} + +internal RDIM_Type * +d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; - String8 aranges_data = input->sec[DW_Section_ARanges].data; - Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, aranges_data); + // find attrib + DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); - D2R_CompUnitContribMap cm = {0}; - cm.count = 0; - cm.info_off_arr = push_array(arena, U64, unit_range_list.count); - cm.voff_range_arr = push_array(arena, RDIM_Rng1U64ChunkList, unit_range_list.count); - - for EachNode(range_n, Rng1U64Node, unit_range_list.first) { - String8 unit_data = str8_substr(aranges_data, range_n->v); - U64 unit_cursor = 0; + // does tag have this attribute? + if (attrib->attrib_kind == kind) { + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length); - if (unit_length_size == 0) { continue; } - unit_cursor += unit_length_size; - - DW_Version version = 0; - U64 version_size = str8_deserial_read_struct(unit_data, unit_cursor, &version); - if (version_size == 0) { continue; } - unit_cursor += version; - - if (version != DW_Version_2) { - AssertAlways(!"unknown .debug_aranges version"); - continue; - } - - DW_Format unit_format = DW_FormatFromSize(unit_length); - U64 cu_info_off = 0; - U64 cu_info_off_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &cu_info_off); - if (cu_info_off_size == 0) { continue; } - unit_cursor += cu_info_off_size; - - U8 address_size = 0; - U64 address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &address_size); - if (address_size_size == 0) { continue; } - unit_cursor += address_size_size; - - U8 segment_selector_size = 0; - U64 segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &segment_selector_size); - if (segment_selector_size_size == 0) { continue; } - unit_cursor += segment_selector_size_size; - - U64 tuple_size = address_size * 2 + segment_selector_size; - U64 bytes_too_far_past_boundary = unit_cursor % tuple_size; - if (bytes_too_far_past_boundary > 0) { - unit_cursor += tuple_size - bytes_too_far_past_boundary; - } - - RDIM_Rng1U64ChunkList voff_ranges = {0}; - if (segment_selector_size == 0) { - while (unit_cursor + address_size * 2 <= unit_data.size) { - U64 address = 0; - U64 length = 0; - unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, address_size, address_size); - unit_cursor += str8_deserial_read(unit_data, unit_cursor, &length, address_size, address_size); - - if (address == 0 && length == 0) { break; } - if (address == 0) { continue; } - - // TODO: error handling - AssertAlways(address >= image_base); - - U64 min = address - image_base; - U64 max = min + length; - rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, (RDIM_Rng1U64){.min = min, .max = max}); + if (value_class == DW_AttribClass_Reference) { + // resolve reference + DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); + + if (ref.cu == cu) { + // find type + type = d2r_type_from_offset(type_table, ref.info_off); + } else { + NotImplemented; } } else { - // TODO: segment relative addressing - NotImplemented; + log_user_errorf("unexpected attrib class @ .debug_info+%llx", tag.info_off); } - - U64 map_idx = cm.count++; - cm.info_off_arr[map_idx] = cu_info_off; - cm.voff_range_arr[map_idx] = voff_ranges; } - scratch_end(scratch); - return cm; + return type; } -//////////////////////////////// -//~ rjf: Compilation Unit / Scope Conversion Helpers - -internal RDIM_Rng1U64ChunkList -d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off) -{ - RDIM_Rng1U64ChunkList voff_ranges = {0}; - U64 voff_list_idx = u64_array_bsearch(map.info_off_arr, map.count, info_off); - if (voff_list_idx < map.count) { - voff_ranges = map.voff_range_arr[voff_list_idx]; - } - return voff_ranges; -} - -internal RDIM_Scope * -d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges) -{ - // fill out scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, scopes, scope_chunk_cap); - - // push ranges - for EachNode(i, Rng1U64Node, ranges.first) { - rdim_scope_push_voff_range(arena, scopes, scope, (RDIM_Rng1U64){.min = i->v.min, i->v.max}); - } - - // associate scope with tag - tag_stack->scope = scope; - - // update scope hierarchy - DW_TagKind parent_tag_kind = tag_stack->next->node->tag.kind; - if (parent_tag_kind == DW_TagKind_SubProgram || parent_tag_kind == DW_TagKind_InlinedSubroutine || parent_tag_kind == DW_TagKind_LexicalBlock) { - RDIM_Scope *parent = tag_stack->next->scope; - - scope->parent_scope = parent; - scope->symbol = parent->symbol; - - if (parent->last_child) { - parent->last_child->next_sibling = scope; - } - SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); - } - - return scope; -} - -//////////////////////////////// -//~ rjf: Main Conversion Entry Point - internal D2R_TagIterator * d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) { @@ -1688,8 +1493,7 @@ d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) iter->free_list = 0; iter->stack = push_array(arena, D2R_TagFrame, 1); iter->stack->node = push_array(arena, DW_TagNode, 1); - if(root != 0) - { + if (root != 0) { *iter->stack->node = *root; } iter->stack->node->sibling = 0; @@ -1762,7 +1566,7 @@ d2r_is_type_tag_converted(DW_TagNode *tag_node) } internal RDIM_Type * -d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind) +d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, DW_Tag tag, DW_AttribKind kind) { RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; @@ -1777,27 +1581,27 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *inpu // resolve reference DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); - // TODO: support for external compile unit references - AssertAlways(ref.cu == cu); - - // find type - type = d2r_type_from_offset(type_table, ref.info_off); - - // was type converted? - if (type == 0) { - // issue type conversion - DW_TagNode *ref_node = dw_tag_node_from_info_off(cu, ref.info_off); - d2r_convert_types(arena, type_table, input, cu, cu_lang, arch_addr_size, ref_node); - - // if we do not have a converted type at this point then debug info is malformed + if (ref.cu == cu) { + // find type type = d2r_type_from_offset(type_table, ref.info_off); - if(type == 0) - { - type = type_table->builtin_types[RDI_TypeKind_NULL]; + + // was type converted? + if (type == 0) { + // issue type conversion + DW_TagNode *ref_node = dw_tag_node_from_info_off(cu, ref.info_off); + d2r_convert_types(arena, type_table, input, cu, cu_lang, ref_node); + + // if we do not have a converted type at this point then debug info is malformed + type = d2r_type_from_offset(type_table, ref.info_off); + if (type == 0) { + type = type_table->builtin_types[RDI_TypeKind_NULL]; + } } + } else { + NotImplemented; } } else { - Assert(!"unexpected attrib class"); + log_user_errorf("unexpected attrib class @ .debug_info+%llx", tag.info_off); } } @@ -1810,7 +1614,6 @@ d2r_convert_types(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, - U64 arch_addr_size, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); @@ -1836,7 +1639,7 @@ d2r_convert_types(Arena *arena, Assert(!tag_node->first_child); d2r_tag_iterator_skip_children(it); } else { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_Class; @@ -1851,9 +1654,11 @@ d2r_convert_types(Arena *arena, type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteStruct; - // TODO: error handling - Assert(!tag_node->first_child); - d2r_tag_iterator_skip_children(it); + if (tag_node->first_child) { + d2r_tag_iterator_skip_children(it); + } else { + log_user_errorf("childless struct @ .debug_info+%llx", tag.info_off); + } } else { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1868,9 +1673,11 @@ d2r_convert_types(Arena *arena, type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteUnion; - // TODO: error handling - Assert(!tag_node->first_child); - d2r_tag_iterator_skip_children(it); + if (tag_node->first_child) { + d2r_tag_iterator_skip_children(it); + } else { + log_user_errorf("childless union @ .debug_info+%llx", tag.info_off); + } } else { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1884,11 +1691,13 @@ d2r_convert_types(Arena *arena, RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_IncompleteEnum; - // TODO: error handling - Assert(!tag_node->first_child); - d2r_tag_iterator_skip_children(it); + if (tag_node->first_child) { + d2r_tag_iterator_skip_children(it); + } else { + log_user_errorf("childless enum @ .debug_info+%llx", tag.info_off); + } } else { - RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_Enum; @@ -1897,7 +1706,7 @@ d2r_convert_types(Arena *arena, } } break; case DW_TagKind_SubroutineType: { - RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); // collect parameters RDIM_TypeList param_list = {0}; @@ -1908,15 +1717,14 @@ d2r_convert_types(Arena *arena, } else if (n->tag.kind == DW_TagKind_UnspecifiedParameters) { rdim_type_list_push(scratch.arena, ¶m_list, type_table->builtin_types[RDI_TypeKind_Variadic]); } else { - // TODO: error handling - AssertAlways(!"unexpected tag"); + log_user_errorf("unexpected tag @ .debug_info+%llx", tag.info_off); } } // init proceudre type RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Function; - type->byte_size = arch_addr_size; + type->byte_size = cu->address_size; type->direct_type = ret_type; type->count = param_list.count; type->param_types = rdim_array_from_type_list(arena, param_list); @@ -1924,7 +1732,7 @@ d2r_convert_types(Arena *arena, d2r_tag_iterator_skip_children(it); } break; case DW_TagKind_Typedef: { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Alias; type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1952,7 +1760,7 @@ d2r_convert_types(Arena *arena, case 8: kind = RDI_TypeKind_ComplexF64; break; case 10: kind = RDI_TypeKind_ComplexF80; break; case 16: kind = RDI_TypeKind_ComplexF128; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_Float: { @@ -1962,7 +1770,7 @@ d2r_convert_types(Arena *arena, case 6: kind = RDI_TypeKind_F48; break; case 8: kind = RDI_TypeKind_F64; break; case 16: kind = RDI_TypeKind_F128; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_Signed: { @@ -1974,7 +1782,7 @@ d2r_convert_types(Arena *arena, case 16: kind = RDI_TypeKind_S128; break; case 32: kind = RDI_TypeKind_S256; break; case 64: kind = RDI_TypeKind_S512; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_SignedChar: { @@ -1982,7 +1790,7 @@ d2r_convert_types(Arena *arena, case 1: kind = RDI_TypeKind_Char8; break; case 2: kind = RDI_TypeKind_Char16; break; case 4: kind = RDI_TypeKind_Char32; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_Unsigned: { @@ -1994,7 +1802,7 @@ d2r_convert_types(Arena *arena, case 16: kind = RDI_TypeKind_U128; break; case 32: kind = RDI_TypeKind_U256; break; case 64: kind = RDI_TypeKind_U512; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_UnsignedChar: { @@ -2002,7 +1810,7 @@ d2r_convert_types(Arena *arena, case 1: kind = RDI_TypeKind_UChar8; break; case 2: kind = RDI_TypeKind_UChar16; break; case 4: kind = RDI_TypeKind_UChar32; break; - default: AssertAlways(!"unexpected size"); break; // TODO: error handling + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_ImaginaryFloat: { @@ -2035,7 +1843,7 @@ d2r_convert_types(Arena *arena, case DW_ATE_Ascii: { NotImplemented; } break; - default: AssertAlways(!"unexpected base type encoding"); break; // TODO: error handling + default: log_user_errorf("unexpected base type encoding"); break; } RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); @@ -2045,17 +1853,26 @@ d2r_convert_types(Arena *arena, type->byte_size = byte_size; } break; case DW_TagKind_PointerType: { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); // TODO: - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Allocated)); - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Associated)); - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)); - // TODO(rjf): this is not an invalid case; it shows up in `mule_main` pointer types - // Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass)); + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Allocated)) { + log_infof("TODO: handle allocated attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Associated)) { + log_infof("TODO: handle associated attrib @ .debug_info%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { + log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { + log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass)) { + log_infof("TODO: handle address class attrib @ .debug_info+%llx", tag.info_off); + } - U64 byte_size = arch_addr_size; + U64 byte_size = cu->address_size; if (cu->version == DW_Version_5 || cu->relaxed) { dw_try_byte_size_from_tag(input, cu, tag, &byte_size); } @@ -2067,36 +1884,44 @@ d2r_convert_types(Arena *arena, } break; case DW_TagKind_RestrictType: { // TODO: - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)); - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { + log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { + log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); + } - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Modifier; - type->byte_size = arch_addr_size; + type->byte_size = cu->address_size; type->flags = RDI_TypeModifierFlag_Restrict; type->direct_type = direct_type; } break; case DW_TagKind_VolatileType: { - // TODO: - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { + log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); + } - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Modifier; - type->byte_size = arch_addr_size; + type->byte_size = cu->address_size; type->flags = RDI_TypeModifierFlag_Volatile; type->direct_type = direct_type; } break; case DW_TagKind_ConstType: { - // TODO: - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)); - Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)); + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { + log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { + log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); + } - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Modifier; - type->byte_size = arch_addr_size; + type->byte_size = cu->address_size; type->flags = RDI_TypeModifierFlag_Const; type->direct_type = direct_type; } break; @@ -2129,7 +1954,7 @@ d2r_convert_types(Arena *arena, struct SubrangeNode *subrange_stack = 0; for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) { if (n->tag.kind != DW_TagKind_SubrangeType) { - d2r_log("[%llx] while scanning for DW_TagKind_SubrangeType found an unexpected child tag %S @ %llx\n", tag.info_off, dw_string_from_tag_kind(g_d2r_log.arena, n->tag.kind), n->tag.info_off); + log_user_errorf("[%llx] while scanning for DW_TagKind_SubrangeType found an unexpected child tag %S @ %llx\n", tag.info_off, dw_string_from_tag_kind(scratch.arena, n->tag.kind), n->tag.info_off); goto array_type_exit; } @@ -2138,7 +1963,7 @@ d2r_convert_types(Arena *arena, if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_LowerBound)) { B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_LowerBound)); if (is_vla) { - d2r_log("[%llx] TODO: lower bound is a variable\n", n->tag.info_off); + log_user_errorf("[%llx] TODO: lower bound is a variable\n", n->tag.info_off); } else { lower_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_LowerBound); } @@ -2154,7 +1979,7 @@ d2r_convert_types(Arena *arena, } else if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_UpperBound)) { B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_UpperBound)); if (is_vla) { - d2r_log("[%llx] TODO: upper bound is a variable\n", n->tag.info_off); + log_user_errorf("[%llx] TODO: upper bound is a variable\n", n->tag.info_off); goto array_type_exit; } else { upper_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_UpperBound); @@ -2169,7 +1994,7 @@ d2r_convert_types(Arena *arena, SLLStackPush(subrange_stack, s); } - RDIM_Type *array_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); + RDIM_Type *array_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); RDIM_Type *direct_type = array_base_type; U64 size_cursor = array_base_type->byte_size; for EachNode(s, struct SubrangeNode, subrange_stack) { @@ -2199,22 +2024,20 @@ d2r_convert_types(Arena *arena, d2r_tag_iterator_skip_children(it); } break; case DW_TagKind_SubrangeType: { - // TODO: error handling - AssertAlways(!"unexpected tag"); + log_user_errorf("unexpected tag"); } break; case DW_TagKind_Inheritance: { DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind != DW_TagKind_StructureType && parent_tag.kind != DW_TagKind_ClassType) { - // TODO: error handling - AssertAlways(!"unexpected parent tag"); + if (parent_tag.kind == DW_TagKind_StructureType || parent_tag.kind == DW_TagKind_ClassType) { + RDIM_Type *parent = d2r_type_from_offset(type_table, parent_tag.info_off); + RDIM_Type *type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, parent->udt); + member->kind = RDI_MemberKind_Base; + member->type = type; + member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); + } else { + log_user_errorf("unexpected parent tag"); } - - RDIM_Type *parent = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_Type *type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type); - RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, parent->udt); - member->kind = RDI_MemberKind_Base; - member->type = type; - member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); } break; } } @@ -2241,7 +2064,7 @@ d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, R d2r_inline_anonymous_udt_member(arena, top_udt, base_off + curr->off, curr->type->udt); } else { // copy member and adjust its offset relative to inlined position in the root UDT - RDIM_UDTMember *m = rdim_udt_push_member(arena, &udts, top_udt); + RDIM_UDTMember *m = rdim_udt_push_member(arena, &g_d2r_shared.udts, top_udt); *m = *curr; m->off += base_off; } @@ -2254,7 +2077,6 @@ d2r_convert_udts(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, - U64 arch_addr_size, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); @@ -2276,7 +2098,7 @@ d2r_convert_udts(Arena *arena, d2r_tag_iterator_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); + RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &g_d2r_shared.udts, D2R_UDT_CHUNK_CAP); udt->self_type = type; type->udt = udt; } @@ -2286,7 +2108,7 @@ d2r_convert_udts(Arena *arena, d2r_tag_iterator_skip_children(it); } else { RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP); + RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &g_d2r_shared.udts, D2R_UDT_CHUNK_CAP); udt->self_type = type; type->udt = udt; } @@ -2307,38 +2129,156 @@ d2r_convert_udts(Arena *arena, if (member_udt == 0) { DW_Language ref_cu_lang = dw_const_u64_from_tag_attrib_kind(input, type_ref.cu, type_ref.cu->tag, DW_AttribKind_Language); DW_TagNode *ref_tag_node = dw_tag_node_from_info_off(type_ref.cu, type_ref.info_off); - d2r_convert_udts(arena, type_table, input, type_ref.cu, ref_cu_lang, arch_addr_size, ref_tag_node); + d2r_convert_udts(arena, type_table, input, type_ref.cu, ref_cu_lang, ref_tag_node); Assert(member_type->udt); member_udt = member_type->udt; } d2r_inline_anonymous_udt_member(arena, parent_type->udt, off, member_udt); } else { - RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, parent_type->udt); + RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, parent_type->udt); member->kind = RDI_MemberKind_DataField; member->name = name; member->type = type; member->off = off; } } else { - // TODO: error handling - AssertAlways(!"unexpected parent tag"); + log_user_errorf("unexpected parent tag @ .debug_info+%llx", tag.info_off); } } else if (tag.kind == DW_TagKind_Enumerator) { DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_EnumerationType) { RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &udts, parent_type->udt); + RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &g_d2r_shared.udts, parent_type->udt); udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); udt_member->val = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ConstValue); } else { - // TODO: error handling - AssertAlways(!"unexpected parent tag"); + log_user_errorf("unexpected parent tag @ .debug_info+%llx", tag.info_off); } } } scratch_end(scratch); } +internal RDIM_Scope * +d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges) +{ + // fill out scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, scopes, scope_chunk_cap); + + // push ranges + for EachNode(i, Rng1U64Node, ranges.first) { + rdim_scope_push_voff_range(arena, scopes, scope, (RDIM_Rng1U64){.min = i->v.min, i->v.max}); + } + + // associate scope with tag + tag_stack->scope = scope; + + // update scope hierarchy + DW_TagKind parent_tag_kind = tag_stack->next->node->tag.kind; + if (parent_tag_kind == DW_TagKind_SubProgram || parent_tag_kind == DW_TagKind_InlinedSubroutine || parent_tag_kind == DW_TagKind_LexicalBlock) { + RDIM_Scope *parent = tag_stack->next->scope; + + scope->parent_scope = parent; + scope->symbol = parent->symbol; + + if (parent->last_child) { + parent->last_child->next_sibling = scope; + } + SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); + } + + return scope; +} + +internal RDIM_Type ** +d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) +{ + Temp scratch = scratch_begin(&arena, 1); + + RDIM_TypeList list = {0}; + B32 has_vargs = 0; + for (DW_TagNode *i = cur_node->first_child; i != 0; i = i->sibling) { + if (i->tag.kind == DW_TagKind_FormalParameter) { + RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1); + n->v = d2r_type_from_attrib(type_table, input, cu, i->tag, DW_AttribKind_Type); + SLLQueuePush(list.first, list.last, n); + ++list.count; + } else if (i->tag.kind == DW_TagKind_UnspecifiedParameters) { + has_vargs = 1; + } + } + + if (has_vargs) { + RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1); + n->v = type_table->builtin_types[RDI_TypeKind_Variadic]; + SLLQueuePush(list.first, list.last, n); + ++list.count; + } + + // collect params + *param_count_out = list.count; + RDIM_Type **params = rdim_array_from_type_list(arena, list); + + scratch_end(scratch); + return params; +} + +internal Rng1U64List +d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) +{ + // collect non-contiguous range + Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); + + // exclude invalid ranges caused by linker optimizations + Rng1U64List ranges = {0}; + for (Rng1U64Node *n = raw_ranges.first, *next = 0; n != 0; n = next) { + next = n->next; + if (n->v.min < image_base || n->v.min > n->v.max) { + continue; + } + rng1u64_list_push_node(&ranges, n); + } + + // debase ranges + for EachNode(r, Rng1U64Node, ranges.first) { + r->v.min -= image_base; + r->v.max -= image_base; + } + + // collect contiguous range + { + DW_Attrib *lo_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_LowPc); + DW_Attrib *hi_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_HighPc); + if (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) { + U64 lo_pc = dw_address_from_attrib(input, cu, lo_pc_attrib); + + U64 hi_pc = 0; + DW_AttribClass hi_pc_class = dw_value_class_from_attrib(cu, hi_pc_attrib); + if (hi_pc_class == DW_AttribClass_Address) { + hi_pc = dw_address_from_attrib(input, cu, hi_pc_attrib); + } else if (hi_pc_class == DW_AttribClass_Const) { + hi_pc = dw_const_u64_from_attrib(input, cu, hi_pc_attrib); + hi_pc += lo_pc; + } + + if (lo_pc >= image_base && hi_pc >= image_base) { + if (lo_pc < hi_pc) { + rng1u64_list_push(arena, &ranges, rng_1u64(lo_pc - image_base, hi_pc - image_base)); + } else { + log_user_errorf("invalid range @ .debug_info+%llx", tag.info_off); + } + } else { + // invalid low and hi PC are likely are caused by an optimization pass during linking + } + } else if ((lo_pc_attrib->attrib_kind == DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) || + (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind == DW_AttribKind_Null)) { + log_user_errorf("invalid range @ .debug_info+%llx", tag.info_off); + } + } + + return ranges; +} + internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, @@ -2346,7 +2286,6 @@ d2r_convert_symbols(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, - U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root) @@ -2392,7 +2331,7 @@ d2r_convert_symbols(Arena *arena, // fill out proc type RDIM_Type *proc_type = d2r_create_type(arena, type_table); proc_type->kind = RDI_TypeKind_Function; - proc_type->byte_size = arch_addr_size; + proc_type->byte_size = cu->address_size; proc_type->direct_type = ret_type; proc_type->count = param_count; proc_type->param_types = params; @@ -2407,11 +2346,11 @@ d2r_convert_symbols(Arena *arena, String8 frame_base_expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_FrameBase); // get proc container symbol - RDIM_Symbol *proc = rdim_symbol_chunk_list_push(arena, &procs, PROC_CHUNK_CAP); + RDIM_Symbol *proc = rdim_symbol_chunk_list_push(arena, &g_d2r_shared.procs, D2R_PROC_CHUNK_CAP); // make scope Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - RDIM_Scope *root_scope = d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges); + RDIM_Scope *root_scope = d2r_push_scope(arena, &g_d2r_shared.scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); root_scope->symbol = proc; // fill out proc @@ -2422,7 +2361,7 @@ d2r_convert_symbols(Arena *arena, proc->container_symbol = 0; proc->container_type = container_type; proc->root_scope = root_scope; - proc->location_cases = d2r_locset_from_attrib(arena, &scopes, root_scope, &locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); + proc->location_cases = d2r_locset_from_attrib(arena, &g_d2r_shared.scopes, root_scope, &g_d2r_shared.locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); // sub program with user-defined parent tag is a method DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); @@ -2433,16 +2372,16 @@ d2r_convert_symbols(Arena *arena, case DW_VirtualityKind_None: member_kind = RDI_MemberKind_Method; break; case DW_VirtualityKind_Virtual: member_kind = RDI_MemberKind_VirtualMethod; break; case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal - //default: InvalidPath; break; + default: { log_user_errorf("unhandled virtuality kind"); } break; } RDIM_Type *type = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, type->udt); + RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, type->udt); member->kind = member_kind; member->type = type; member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); } else if (parent_tag.kind != DW_TagKind_CompileUnit) { - //AssertAlways(!"unexpected tag"); + log_user_errorf("unexpected tag @ .debug_info+%llx", tag.info_off); } it->stack->scope = root_scope; @@ -2465,7 +2404,7 @@ d2r_convert_symbols(Arena *arena, // fill out proc type RDIM_Type *proc_type = d2r_create_type(arena, type_table); proc_type->kind = RDI_TypeKind_Function; - proc_type->byte_size = arch_addr_size; + proc_type->byte_size = cu->address_size; proc_type->direct_type = ret_type; proc_type->count = param_count; proc_type->param_types = params; @@ -2477,7 +2416,7 @@ d2r_convert_symbols(Arena *arena, } // fill out inline site - RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &inline_sites, INLINE_SITE_CHUNK_CAP); + RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &g_d2r_shared.inline_sites, D2R_INLINE_SITE_CHUNK_CAP); inline_site->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); inline_site->type = proc_type; inline_site->owner = owner; @@ -2485,7 +2424,7 @@ d2r_convert_symbols(Arena *arena, // make scope Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - RDIM_Scope *root_scope = d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges); + RDIM_Scope *root_scope = d2r_push_scope(arena, &g_d2r_shared.scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); root_scope->inline_site = inline_site; } break; case DW_TagKind_Variable: { @@ -2497,14 +2436,14 @@ d2r_convert_symbols(Arena *arena, parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_LexicalBlock) { RDIM_Scope *scope = it->stack->next->scope; - RDIM_Local *local = rdim_scope_push_local(arena, &scopes, scope); + RDIM_Local *local = rdim_scope_push_local(arena, &g_d2r_shared.scopes, scope); local->kind = RDI_LocalKind_Variable; local->name = name; local->type = type; - local->location_cases = d2r_var_locset_from_tag(arena, &scopes, scope, &locations, input, cu, image_base, arch, tag); + local->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, &g_d2r_shared.locations, input, cu, image_base, arch, tag); } else { - // NOTE: due to a bug in clang in stb_sprint.h local variables + // NOTE: due to a bug in clang in stb_sprintf.h local variables // are declared in global scope without a name if (name.size == 0) { break; } @@ -2522,13 +2461,15 @@ d2r_convert_symbols(Arena *arena, String8 expr = dw_exprloc_from_attrib(input, cu, loc_attrib); D2R_ValueType expr_type = 0; - RDIM_EvalBytecode bc = d2r_bytecode_from_expression(temp.arena, input, image_base, arch_addr_size, arch, cu->addr_lu, expr, cu, &expr_type); + RDIM_EvalBytecode bc = d2r_bytecode_from_expression(temp.arena, input, image_base, arch, cu->addr_lu, expr, cu, &expr_type); // evaluate bytecode to virutal offset if possible if (expr_type == D2R_ValueType_Address) { B32 is_static = rdim_is_eval_bytecode_static(bc); if (is_static) { - voff = rdim_virt_off_from_eval_bytecode(bc, image_base); + if (!rdim_static_eval_bytecode_to_voff(bc, image_base, &voff)) { + log_user_errorf("failed to evalute byte code to virtual offset @ .debug_info+%llx", tag.info_off); + } } } @@ -2540,8 +2481,8 @@ d2r_convert_symbols(Arena *arena, } RDIM_SymbolChunkList *var_chunks; U64 var_chunks_cap; - if (is_thread_var) { var_chunks = &tvars; var_chunks_cap = TVAR_CHUNK_CAP; } - else { var_chunks = &gvars; var_chunks_cap = GVAR_CHUNK_CAP; } + if (is_thread_var) { var_chunks = &g_d2r_shared.tvars; var_chunks_cap = D2R_TVAR_CHUNK_CAP; } + else { var_chunks = &g_d2r_shared.gvars; var_chunks_cap = D2R_GVAR_CHUNK_CAP; } RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, var_chunks, var_chunks_cap); var->is_extern = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_External); @@ -2557,14 +2498,14 @@ d2r_convert_symbols(Arena *arena, DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) { RDIM_Scope *scope = it->stack->next->scope; - RDIM_Local *param = rdim_scope_push_local(arena, &scopes, scope); + RDIM_Local *param = rdim_scope_push_local(arena, &g_d2r_shared.scopes, scope); param->kind = RDI_LocalKind_Parameter; param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - param->location_cases = d2r_var_locset_from_tag(arena, &scopes, scope, &locations, input, cu, image_base, arch, tag); + param->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, &g_d2r_shared.locations, input, cu, image_base, arch, tag); } else { - // TODO: error handling - AssertAlways(!"this is a local variable"); + Assert(!"this is a local variable"); + log_user_errorf(".debug_info+%llx out of scope formal parameter", tag.info_off); } } break; case DW_TagKind_LexicalBlock: { @@ -2573,7 +2514,7 @@ d2r_convert_symbols(Arena *arena, parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_LexicalBlock) { Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges); + d2r_push_scope(arena, &g_d2r_shared.scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); } } break; case DW_TagKind_CallSite: { @@ -2595,25 +2536,157 @@ d2r_convert_symbols(Arena *arena, default: { // NotImplemented; - }break; + } break; } } scratch_end(scratch); } +force_inline int +d2r_src_file_lookup_compar(void *raw_a, void *raw_b) +{ + D2R_SrcFileLookup *a = raw_a, *b = raw_b; + DW_LineFile *file_a = a->file, *file_b = b->file; + String8 dir_path_a = a->vm->header.dir_table.v[file_a->dir_idx]; + String8 dir_path_b = b->vm->header.dir_table.v[file_b->dir_idx]; + int cmp = str8_compar(dir_path_a, dir_path_b, 0); + if (cmp == 0) { + cmp = str8_compar(file_a->file_name, file_b->file_name, 0); + } + return cmp; +} + +force_inline +LFHT_IS_KEY_EQUAL_FUNC(d2r_src_file_lookup_is_equal) +{ + return d2r_src_file_lookup_compar(a, b) == 0; +} + +force_inline int +d2r_src_file_lfht_key_value_is_before(void *raw_a, void *raw_b) +{ + return d2r_src_file_lookup_compar(*(D2R_SrcFileLookup **)raw_a, *(D2R_SrcFileLookup **)raw_b) < 0; +} + +internal U64 +d2r_hash_line_file(String8 dir_path, DW_LineFile *file) +{ + XXH3_state_t hasher = {0}; + XXH3_64bits_reset(&hasher); + XXH3_64bits_update(&hasher, dir_path.str, dir_path.size); + XXH3_64bits_update(&hasher, file->file_name.str, file->file_name.size); + XXH3_64bits_update(&hasher, &file->modify_time, sizeof(file->modify_time)); + XXH3_64bits_update(&hasher, &file->md5_digest, sizeof(file->md5_digest)); + XXH64_hash_t hash = XXH3_64bits_digest(&hasher); + return hash; +} + +internal void +d2r_sort_ptrs(void **ptrs, U64 count, int (* is_before)(void *a, void *b)) +{ + radsort(ptrs, count, is_before); +} + +internal D2R_CompUnitContribMap +d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) +{ + Temp scratch = scratch_begin(&arena, 1); + Temp temp = temp_begin(arena); + B32 parse_failed = 1; + + Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_ARanges].data); + + D2R_CompUnitContribMap cm = {0}; + cm.info_off_arr = push_array(temp.arena, U64, unit_range_list.count); + cm.voff_range_arr = push_array(temp.arena, RDIM_Rng1U64ChunkList, unit_range_list.count); + + for EachNode(range_n, Rng1U64Node, unit_range_list.first) { + String8 unit_data = str8_substr(input->sec[DW_Section_ARanges].data, range_n->v); + U64 unit_cursor = 0; + + U64 unit_length; + TryRead(str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length), unit_cursor, exit); + DW_Format unit_format = DW_FormatFromSize(unit_length); + + DW_Version version; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &version), unit_cursor, exit); + + if (version != DW_Version_2) { + log_user_errorf("unknown .debug_aranges version %u @ 0x%llx", version, range_n->v.min); + continue; + } + + U64 cu_info_off; + TryRead(str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &cu_info_off), unit_cursor, exit); + + U8 address_size = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &address_size), unit_cursor, exit); + + U8 segment_selector_size = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &segment_selector_size), unit_cursor, exit); + + U64 tuple_size = address_size * 2 + segment_selector_size; + U64 bytes_too_far_past_boundary = unit_cursor % tuple_size; + if (bytes_too_far_past_boundary > 0) { + unit_cursor += tuple_size - bytes_too_far_past_boundary; + } + + RDIM_Rng1U64ChunkList voff_ranges = {0}; + if (segment_selector_size == 0) { + while (unit_cursor + address_size * 2 <= unit_data.size) { + U64 address = 0; + U64 length = 0; + TryRead(str8_deserial_read(unit_data, unit_cursor, &address, address_size, address_size), unit_cursor, exit); + TryRead(str8_deserial_read(unit_data, unit_cursor, &length, address_size, address_size), unit_cursor, exit); + + if (address == 0 && length == 0) { break; } + if (address == 0) { continue; } + + if (address < image_base) { + log_user_errorf("invalid address 0x%llx in .debug_aranges+%llx", range_n->v.min + unit_cursor); + continue; + } + + U64 min = address - image_base; + U64 max = min + length; + rdim_rng1u64_chunk_list_push(temp.arena, &voff_ranges, 256, (RDIM_Rng1U64){.min = min, .max = max}); + } + } else { + NotImplemented; + } + + U64 map_idx = cm.count++; + cm.info_off_arr[map_idx] = cu_info_off; + cm.voff_range_arr[map_idx] = voff_ranges; + } + + parse_failed = 0; + exit:; + if (parse_failed) { + MemoryZeroStruct(&cm); + temp_end(temp); + } + scratch_end(scratch); + return cm; +} + +internal RDIM_Rng1U64ChunkList +d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off) +{ + RDIM_Rng1U64ChunkList voff_ranges = {0}; + U64 voff_list_idx = u64_array_bsearch(map.info_off_arr, map.count, info_off); + if (voff_list_idx < map.count) { + voff_ranges = map.voff_range_arr[voff_list_idx]; + } + return voff_ranges; +} + internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); - if (lane_idx() == 0) { - g_d2r_log.arena = arena_alloc(); - //////////////////////////////// - - ProfBegin("compute exe hash"); - U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); - ProfEnd(); - + if (lane_idx() == 0) { //////////////////////////////// Arch arch = Arch_Null; @@ -2621,41 +2694,42 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW_Input input = {0}; PathStyle path_style = PathStyle_Null; - switch(params->exe_kind) { - default:{}break; + switch (params->exe_kind) { + case ExecutableImageKind_Null: {} break; case ExecutableImageKind_CoffPe: { PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); String8 string_table = str8_substr(params->exe_data, pe.string_table_range); - arch = pe.arch; - image_base = pe.image_base; - binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); - input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); - path_style = PathStyle_WindowsAbsolute; + + arch = pe.arch; + image_base = pe.image_base; + input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); + path_style = PathStyle_WindowsAbsolute; + + g_d2r_shared.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); } break; case ExecutableImageKind_Elf32: case ExecutableImageKind_Elf64: { ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data); - arch = arch_from_elf_machine(bin.hdr.e_machine); - image_base = elf_base_addr_from_bin(&bin); - binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); - input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); - path_style = PathStyle_UnixAbsolute; + + arch = arch_from_elf_machine(bin.hdr.e_machine); + image_base = elf_base_addr_from_bin(&bin); + input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); + path_style = PathStyle_UnixAbsolute; + + g_d2r_shared.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); } break; + default: { InvalidPath; } break; } //////////////////////////////// + + ProfBegin("compute exe hash"); + U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); + ProfEnd(); - top_level_info = rdim_make_top_level_info(params->exe_name, arch, exe_hash, binary_sections); - - //////////////////////////////// - - U64 arch_addr_size = rdi_addr_size_from_arch(top_level_info.arch); - - //////////////////////////////// - - RDIM_Scope *global_scope = rdim_scope_chunk_list_push(arena, &scopes, SCOPE_CHUNK_CAP); + g_d2r_shared.top_level_info = rdim_make_top_level_info(params->exe_name, arch, exe_hash, g_d2r_shared.binary_sections); //////////////////////////////// @@ -2675,139 +2749,241 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //////////////////////////////// ProfBegin("Parse Compile Unit Headers"); - // TODO(rjf): parse should always be relaxed. any verification checks we do - // should just be logged via log_info(...), and then the caller of this - // converter can collect those & display as necessary. - B32 is_parse_relaxed = 1; DW_CompUnit *cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); for EachIndex(cu_idx, cu_ranges.count) { - cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, is_parse_relaxed); + cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, params->is_parse_relaxed); } ProfEnd(); //////////////////////////////// - - ProfBegin("Parse Line Tables"); - DW_LineTableParseResult *cu_line_tables = push_array(scratch.arena, DW_LineTableParseResult, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) { - DW_CompUnit *cu = &cu_arr[cu_idx]; - String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_StmtList); - String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); - String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); - cu_line_tables[cu_idx] = dw_parsed_line_table_from_data(scratch.arena, cu_stmt_list, &input, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu); - } - ProfEnd(); - - //////////////////////////////// - - ProfBegin("Convert Line Tables"); - HashTable *source_file_ht = hash_table_init(scratch.arena, 0x4000); + + ProfBeginV("Convert Line Tables [Count: %llu]", cu_ranges.count); RDIM_LineTable **cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) { - cu_line_tables_rdi[cu_idx] = rdim_line_table_chunk_list_push(arena, &line_tables, LINE_TABLE_CAP); - - DW_LineTableParseResult *line_table = &cu_line_tables[cu_idx]; - DW_LineVMFileArray *dir_table = &line_table->vm_header.dir_table; - DW_LineVMFileArray *file_table = &line_table->vm_header.file_table; - RDIM_SrcFile **src_file_map = push_array(scratch.arena, RDIM_SrcFile *, file_table->count); - for EachIndex(file_idx, file_table->count) { - DW_LineFile *file = &file_table->v[file_idx]; - String8 file_path = dw_path_from_file_idx(scratch.arena, &line_table->vm_header, file_idx); - String8List file_path_split = str8_split_path(scratch.arena, file_path); - str8_path_list_resolve_dots_in_place(&file_path_split, path_style); - String8 file_path_resolved = str8_path_list_join_by_style(scratch.arena, &file_path_split, path_style); - RDIM_SrcFile *src_file = hash_table_search_path_raw(source_file_ht, file_path_resolved); - if (src_file == 0) { - src_file = rdim_src_file_chunk_list_push(arena, &src_files, SRC_FILE_CAP); - src_file->path = push_str8_copy(arena, file_path_resolved); - hash_table_push_path_raw(scratch.arena, source_file_ht, src_file->path, src_file); - } - src_file_map[file_idx] = src_file; + { + Temp temp = temp_begin(scratch.arena); + + // TODO: per thread task + ProfBegin("Up front parse line VM headers"); + DW_LineVM **line_vms = push_array(temp.arena, DW_LineVM *, cu_ranges.count); + for EachIndex(cu_idx, cu_ranges.count) { + line_vms[cu_idx] = dw_line_vm_init(&input, &cu_arr[cu_idx]); } - - for EachNode(line_seq, DW_LineSeqNode, line_table->first_seq) { - if (line_seq->count == 0) { continue; } - - U64 *voffs = push_array(arena, U64, line_seq->count); - U32 *line_nums = push_array(arena, U32, line_seq->count); - U16 *col_nums = 0; - U64 line_idx = 0; - - DW_LineNode *file_line_n = line_seq->first; - U64 file_line_count = 0; - - for EachNode(line_n, DW_LineNode, file_line_n) { - if (file_line_n->v.file_index != line_n->v.file_index || line_n->next == 0) { - U64 file_index = file_line_n->v.file_index; - U64 *file_voffs = &voffs[line_idx]; - U32 *file_line_nums = &line_nums[line_idx]; - U16 *file_col_nums = 0; - - U64 lines_written = 0; - U64 prev_ln = max_U64; - DW_LineNode *sentinel = line_n->v.file_index != file_line_n->v.file_index ? line_n : 0; - for (; file_line_n != sentinel; file_line_n = file_line_n->next) { - if (file_line_n->v.line != prev_ln) { - if (file_line_n->v.address == 0) { continue; } - - voffs[line_idx] = file_line_n->v.address - image_base; - line_nums[line_idx] = file_line_n->v.line; - - ++lines_written; - ++line_idx; - - prev_ln = file_line_n->v.line; - } + ProfEnd(); + + // TODO: sync + // + // sum all source files (including duplicates) + U64 total_file_count = 0; + for EachIndex(cu_idx, cu_ranges.count) { total_file_count += line_vms[cu_idx]->header.file_table.count; } + + // TODO: sync + ProfBeginV("Dedup source files [Count: %llu]", total_file_count); + LFHT_NodeChunkList *src_file_lfht_nodes = push_array(temp.arena, LFHT_NodeChunkList, lane_count()); + LFHT_Node *src_file_lfht = 0; + + // TODO: per thread + { + D2R_SrcFileLookup *lookup = 0; + for EachIndex(cu_idx, cu_ranges.count) { + DW_LineVM *vm = line_vms[cu_idx]; + for EachIndex(file_idx, vm->header.file_table.count) { + DW_LineFile *file = &vm->header.file_table.v[file_idx]; + + if (lookup == 0) { lookup = push_array(temp.arena, D2R_SrcFileLookup, 1); } + lookup->vm = vm; + lookup->file = file; + + LFHT_NodeChunkList *node_chunks = &src_file_lfht_nodes[lane_idx()]; + U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); + B32 was_inserted = lfht_insert(temp.arena, node_chunks, &src_file_lfht, hash, lookup, d2r_src_file_lookup_is_equal, 0); + if (was_inserted) { + lookup = 0; } - - RDIM_SrcFile *src_file = src_file_map[file_index]; - RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, lines_written); - rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); - - file_line_count = 1; - } else { - file_line_count += 1; } } - - // handle last line - if (file_line_n) { - U64 file_index = file_line_n->v.file_index; - U64 *file_voffs = &voffs[line_idx]; - U32 *file_line_nums = &line_nums[line_idx]; - U16 *file_col_nums = 0; - - for (; file_line_n != 0; file_line_n = file_line_n->next, line_idx += 1) { - // TODO: error handling - AssertAlways(file_line_n->v.address >= image_base); - voffs[line_idx] = file_line_n->v.address - image_base; - line_nums[line_idx] = file_line_n->v.line; - } - - RDIM_SrcFile *src_file = src_file_map[file_index]; - RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count); - rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq); - } - - //Assert(line_idx == line_seq->count); } + ProfEnd(); + + // TODO: sync + ProfBegin("Extract source file lookups"); + U64 unique_file_count = lfht_total_count_from_node_chunk_lists(lane_count(), src_file_lfht_nodes); + void **lookups = lfht_data_from_node_chunk_lists(temp.arena, unique_file_count, lane_count(), src_file_lfht_nodes); + ProfEnd(); + + // TODO: sync + ProfBeginV("Sort unique source files [Count: %llu]", unique_file_count); + d2r_sort_ptrs(lookups, unique_file_count, d2r_src_file_lfht_key_value_is_before); + ProfEnd(); + + // TODO: per thread task + ProfBegin("Convert source files"); + for EachIndex(i, unique_file_count) { + D2R_SrcFileLookup *lookup = lookups[i]; + + DW_LineFile *src = lookup->file; + RDIM_SrcFile *dst = rdim_src_file_chunk_list_push(arena, &g_d2r_shared.src_files, D2R_SRC_FILE_CAP); + + // make file path + String8 path; + { + String8List path_list = {0}; + str8_list_push_node(&path_list, &(String8Node){ .string = lookup->vm->header.dir_table.v[src->dir_idx] }); + str8_list_push_node(&path_list, &(String8Node){ .string = src->file_name }); + path = str8_path_list_join_by_style(arena, &path_list, path_style); + } + + // fill out source file + dst->path = path; + if ( ! u128_match(src->md5_digest, u128_zero())) { + dst->checksum_kind = RDI_ChecksumKind_MD5; + dst->checksum = str8_copy(arena, str8_struct(&src->md5_digest)); + } else if (src->modify_time != 0) { + dst->checksum_kind = RDI_ChecksumKind_Timestamp; + dst->checksum = str8_copy(arena, str8_struct(&src->modify_time)); + } + + lookup->src_file = dst; + } + ProfEnd(); + + // TODO: sync + RDIM_LineTableChunkList *lane_line_table_chunks = push_array(temp.arena, RDIM_LineTableChunkList, lane_count()); + + // TODO: per thread task + ProfBegin("Convert line sequences"); + U64 *line_seq_counts_per_lane = push_array(scratch.arena, U64, lane_count()); + for EachIndex(cu_idx, cu_ranges.count) { + RDIM_LineTableChunkList *lane_line_table_chunk_list = &lane_line_table_chunks[lane_idx()]; + + // push new line table for the compile unit + RDIM_LineTable *line_table = rdim_line_table_chunk_list_push(arena, lane_line_table_chunk_list, D2R_LINE_TABLE_CAP); + cu_line_tables_rdi[cu_idx] = line_table; + + // push line buffer +#define D2R_LineBufferMax 1024 + struct LineBuffer { U64 file_index; U64 voffs[D2R_LineBufferMax]; U32 line_nums[D2R_LineBufferMax]; U32 col_nums[D2R_LineBufferMax]; } LineBuffer; + struct LineBuffer *line_buffer = push_array(temp.arena, struct LineBuffer, 1); + U64 line_buffer_size = 0; + + // decode line sequences + DW_LineVM *vm = line_vms[cu_idx]; + U64 *line_seq_counts_per_file = push_array(temp.arena, U64, vm->header.file_table.count); + while (dw_line_vm_step(vm)) { + if (vm->new_line) { + // lazy defined files are not supported + if (vm->state.file_index >= vm->header.file_table.count) { continue; } + + // time to flush the buffer? + if ((line_buffer_size >= D2R_LineBufferMax || line_buffer->file_index != vm->state.file_index) && line_buffer_size > 0) { + // lookup source file + DW_LineFile *file = &vm->header.file_table.v[vm->state.file_index]; + U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); + D2R_SrcFileLookup *lookup = lfht_search(src_file_lfht, hash, &(D2R_SrcFileLookup){ .file = file, .vm = vm }, d2r_src_file_lookup_is_equal, 0); + RDIM_SrcFile *src_file = lookup->src_file; + + // copy line info + U64 *voffs = push_array_no_zero(arena, U64, line_buffer_size + 1); + U32 *line_nums = push_array_no_zero(arena, U32, line_buffer_size); + voffs[line_buffer_size] = vm->state.address; + MemoryCopyTyped(voffs, line_buffer->voffs, line_buffer_size); + MemoryCopyTyped(line_nums, line_buffer->line_nums, line_buffer_size); + + RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, lane_line_table_chunk_list, line_table, src_file, voffs, line_nums, 0, line_buffer_size); + + // atomic implementation of @rdim_src_file_push_line_sequence + { + // associate line fragment with source file + RDIM_SrcFileLineMapFragment *line_frag = push_array(arena, RDIM_SrcFileLineMapFragment, 1); + line_frag->seq = line_seq; + + // insert line fragment node + for (;;) { + RDIM_SrcFileLineMapFragment *next = src_file->first_line_map_fragment; + line_frag->next = next; + RDIM_SrcFileLineMapFragment *curr = ins_atomic_ptr_eval_cond_assign(&src_file->first_line_map_fragment, line_frag, next); + if (curr == 0) { + ins_atomic_u64_add_eval(&g_d2r_shared.src_files.source_line_map_count, 1); + } + if (curr == next) { break; } + } + + // accumulate line sequence counts per file + line_seq_counts_per_file[vm->state.file_index] += line_seq->line_count; + + // accumulate line sequence counts per lane + line_seq_counts_per_lane[lane_idx()] += line_seq->line_count; + } + + // reset line buffer size tracker + line_buffer_size = 0; + } + + if (line_buffer_size > 0 && line_buffer->voffs[line_buffer_size - 1] == vm->state.address) { + line_buffer->line_nums[line_buffer_size - 1] = Min(line_buffer->line_nums[line_buffer_size - 1], safe_cast_u32(vm->state.line)); + } else { + // append line to the buffer + line_buffer->file_index = vm->state.file_index; + line_buffer->voffs[line_buffer_size] = vm->state.address; + line_buffer->line_nums[line_buffer_size] = safe_cast_u32(vm->state.line); + line_buffer_size += 1; + } + } + } + + // update line sequence counts per source file @rdim_src_file_push_line_sequence + for EachIndex(file_idx, vm->header.file_table.count) { + if (line_seq_counts_per_file[file_idx] > 0) { + DW_LineFile *file = &vm->header.file_table.v[file_idx]; + U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); + D2R_SrcFileLookup *lookup = lfht_search(src_file_lfht, hash, &(D2R_SrcFileLookup){ .file = file, .vm = vm }, d2r_src_file_lookup_is_equal, 0); + RDIM_SrcFile *src_file = lookup->src_file; + ins_atomic_u64_add_eval(&src_file->total_line_count, line_seq_counts_per_file[file_idx]); + } + } + } + + // TODO: sync + // + // update total line sequences count in shared @rdim_src_file_push_line_sequence + for EachIndex(i, lane_count()) { + g_d2r_shared.src_files.total_line_count += line_seq_counts_per_lane[i]; + } + + // TODO: sync + for EachIndex(i, lane_count()) { + rdim_line_table_chunk_list_concat_in_place(&g_d2r_shared.line_tables, &lane_line_table_chunks[i]); + } + + // TODO: per thread task + ProfBegin("Relase line VMs"); + for EachIndex(i, cu_ranges.count) { + dw_line_vm_release(line_vms[i]); + } + ProfEnd(); + + temp_end(temp); } ProfEnd(); + //////////////////////////////// + + RDIM_Scope *global_scope = rdim_scope_chunk_list_push(arena, &g_d2r_shared.scopes, D2R_SCOPE_CHUNK_CAP); + //////////////////////////////// RDIM_Type *builtin_types[RDI_TypeKind_Count] = {0}; for (RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) { - RDIM_Type *type = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); + RDIM_Type *type = rdim_type_chunk_list_push(arena, &g_d2r_shared.types, D2R_TYPE_CHUNK_CAP); type->kind = type_kind; type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); type->byte_size = rdi_size_from_basic_type_kind(type_kind); builtin_types[type_kind] = type; } - builtin_types[RDI_TypeKind_Void]->byte_size = arch_addr_size; - builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size; - builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP); + builtin_types[RDI_TypeKind_Void]->byte_size = rdi_addr_size_from_arch(g_d2r_shared.top_level_info.arch); + builtin_types[RDI_TypeKind_Handle]->byte_size = rdi_addr_size_from_arch(g_d2r_shared.top_level_info.arch); + + builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &g_d2r_shared.types, D2R_TYPE_CHUNK_CAP); builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; //////////////////////////////// @@ -2844,14 +3020,14 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // init type table D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); type_table->ht = hash_table_init(comp_temp.arena, 0x4000); - type_table->types = &types; - type_table->type_chunk_cap = TYPE_CHUNK_CAP; + type_table->types = &g_d2r_shared.types; + type_table->type_chunk_cap = D2R_TYPE_CHUNK_CAP; type_table->builtin_types = builtin_types; // convert debug info - d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); - d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root); - d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root); + d2r_convert_types(arena, type_table, &input, cu, cu_lang, tag_tree.root); + d2r_convert_udts(arena, type_table, &input, cu, cu_lang, tag_tree.root); + d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, image_base, arch, tag_tree.root); RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; if (cu_idx < cu_contrib_map.count) { @@ -2865,7 +3041,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // convert compile unit { - RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &units, UNIT_CHUNK_CAP); + RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &g_d2r_shared.units, D2R_UNIT_CHUNK_CAP); unit->unit_name = cu_name; unit->compiler_name = cu_prod; unit->source_file = str8_zero(); // TODO @@ -2887,20 +3063,21 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) RDIM_BakeParams bake_params = {0}; bake_params.subset_flags = params->subset_flags; - bake_params.top_level_info = top_level_info; - bake_params.binary_sections = binary_sections; - bake_params.units = units; - bake_params.types = types; - bake_params.udts = udts; - bake_params.src_files = src_files; - bake_params.line_tables = line_tables; - bake_params.locations = locations; - bake_params.global_variables = gvars; - bake_params.thread_variables = tvars; - bake_params.procedures = procs; - bake_params.scopes = scopes; - bake_params.inline_sites = inline_sites; + bake_params.top_level_info = g_d2r_shared.top_level_info; + bake_params.binary_sections = g_d2r_shared.binary_sections; + bake_params.units = g_d2r_shared.units; + bake_params.types = g_d2r_shared.types; + bake_params.udts = g_d2r_shared.udts; + bake_params.src_files = g_d2r_shared.src_files; + bake_params.line_tables = g_d2r_shared.line_tables; + bake_params.locations = g_d2r_shared.locations; + bake_params.global_variables = g_d2r_shared.gvars; + bake_params.thread_variables = g_d2r_shared.tvars; + bake_params.procedures = g_d2r_shared.procs; + bake_params.scopes = g_d2r_shared.scopes; + bake_params.inline_sites = g_d2r_shared.inline_sites; scratch_end(scratch); return bake_params; } + diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 939daf17..543dbd8d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -1,18 +1,13 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#pragma once +#ifndef RDI_FROM_DWARF_H +#define RDI_FROM_DWARF_H -typedef struct D2R_Log -{ - Arena *arena; - String8List v; -} D2R_Log; +//////////////////////////////// +//~ Conversion -#define d2r_log(...) str8_list_pushf(g_d2r_log.arena, &g_d2r_log.v, __FILE__ ":" Stringify(__LINE__) " " __VA_ARGS__) - -typedef struct D2R_ConvertParams D2R_ConvertParams; -struct D2R_ConvertParams +typedef struct D2R_ConvertParams { String8 dbg_name; String8 dbg_data; @@ -21,7 +16,107 @@ struct D2R_ConvertParams ExecutableImageKind exe_kind; RDIM_SubsetFlags subset_flags; B32 deterministic; -}; + B32 is_parse_relaxed; +} D2R_ConvertParams; + +#define D2R_UNIT_CHUNK_CAP 512 +#define D2R_UDT_CHUNK_CAP 1024 +#define D2R_TYPE_CHUNK_CAP 1024 +#define D2R_SRC_FILE_CAP 1024 +#define D2R_LINE_TABLE_CAP 1024 +#define D2R_GVAR_CHUNK_CAP 1024 +#define D2R_TVAR_CHUNK_CAP 1024 +#define D2R_LOCATIONS_CAP 4096 +#define D2R_PROC_CHUNK_CAP 4096 +#define D2R_SCOPE_CHUNK_CAP 4096 +#define D2R_INLINE_SITE_CHUNK_CAP 4096 + +typedef struct D2R_Shared +{ + RDIM_TopLevelInfo top_level_info; + RDIM_BinarySectionList binary_sections; + RDIM_UnitChunkList units; + RDIM_UDTChunkList udts; + RDIM_TypeChunkList types; + RDIM_SrcFileChunkList src_files; + RDIM_LineTableChunkList line_tables; + RDIM_LocationChunkList locations; + RDIM_SymbolChunkList gvars; + RDIM_SymbolChunkList tvars; + RDIM_SymbolChunkList procs; + RDIM_ScopeChunkList scopes; + RDIM_InlineSiteChunkList inline_sites; +} D2R_Shared; + +//////////////////////////////// +//~ Value Types + +typedef enum +{ + D2R_ArithmeticType_Null, + D2R_ArithmeticType_Signed, + D2R_ArithmeticType_Unsigned, + D2R_ArithmeticType_Float, +} D2R_ArithmeticType; + +#define D2R_ValueType_Signed_XList \ + X(S8, Signed, 1 ) \ + X(S16, Signed, 2 ) \ + X(S32, Signed, 4 ) \ + X(S64, Signed, 8 ) \ + X(S128, Signed, 16) \ + X(S256, Signed, 32) \ + X(S512, Signed, 64) + +#define D2R_ValueType_Unsigned_XList \ + X(U8, Unsigned, 1 ) \ + X(U16, Unsigned, 2 ) \ + X(U32, Unsigned, 4 ) \ + X(U64, Unsigned, 8 ) \ + X(U128, Unsigned, 16) \ + X(U256, Unsigned, 32) \ + X(U512, Unsigned, 64) + +#define D2R_ValueType_Float_XList \ + X(F16, Float, 2 ) \ + X(F32, Float, 4 ) \ + X(F48, Float, 6 ) \ + X(F64, Float, 8 ) \ + X(F80, Float, 10) \ + X(F96, Float, 12) \ + X(F128, Float, 16) + +#define D2R_ValueType_XList \ + X(Generic, Null, 0 ) \ + X(ImplicitValue, Null, 0 ) \ + X(Address, Unsigned, 0 ) \ + D2R_ValueType_Signed_XList \ + D2R_ValueType_Unsigned_XList \ + D2R_ValueType_Float_XList + +typedef enum +{ +#define X(t, ...) D2R_ValueType_##t, + D2R_ValueType_XList +#undef X + D2R_ValueType_Bool = D2R_ValueType_S8, +} D2R_ValueType; + +typedef struct D2R_ValueTypeNode +{ + D2R_ValueType type; + struct D2R_ValueTypeNode *next; +} D2R_ValueTypeNode; + +typedef struct D2R_ValueTypeStack +{ + U64 count; + D2R_ValueTypeNode *top; + D2R_ValueTypeNode *free_list; +} D2R_ValueTypeStack; + +//////////////////////////////// +//~ Type Table typedef struct D2R_TypeTable { @@ -31,6 +126,9 @@ typedef struct D2R_TypeTable RDIM_Type **builtin_types; } D2R_TypeTable; +//////////////////////////////// +//~ Tag Iterator + typedef DW_TagSpare D2R_TagFlags; enum { @@ -53,6 +151,19 @@ typedef struct D2R_TagIterator B32 visit_children; } D2R_TagIterator; +//////////////////////////////// +//~ Line Table Conversion + +typedef struct D2R_SrcFileLookup +{ + DW_LineFile *file; + DW_LineVM *vm; + RDIM_SrcFile *src_file; +} D2R_SrcFileLookup; + +//////////////////////////////// +//~ Contrib Map + typedef struct D2R_CompUnitContribMap { U64 count; @@ -60,124 +171,110 @@ typedef struct D2R_CompUnitContribMap RDIM_Rng1U64ChunkList *voff_range_arr; } D2R_CompUnitContribMap; -#define D2R_ValueType_IsSigned(x) ((x) == D2R_ValueType_S8 || (x) == D2R_ValueType_S16 || (x) == D2R_ValueType_S32 || (x) == D2R_ValueType_S64 || (x) == D2R_ValueType_S128 || (x) == D2R_ValueType_S256 || (x) == D2R_ValueType_S512) -#define D2R_ValueType_IsUnsigned(x) ((x) == D2R_ValueType_U8 || (x) == D2R_ValueType_U16 || (x) == D2R_ValueType_U32 || (x) == D2R_ValueType_U64 || (x) == D2R_ValueType_U128 || (x) == D2R_ValueType_U256 || (x) == D2R_ValueType_U512) -#define D2R_ValueType_IsFloat(x) ((x) == D2R_ValueType_F32 || (x) == D2R_ValueType_F64) -#define D2R_ValueType_IsInt(x) (D2R_ValueType_IsSigned(x) || D2R_ValueType_IsUnsigned(x) || (x) == D2R_ValueType_Address) -typedef enum D2R_ValueType -{ - D2R_ValueType_Generic, - D2R_ValueType_U8, - D2R_ValueType_U16, - D2R_ValueType_U32, - D2R_ValueType_U64, - D2R_ValueType_U128, - D2R_ValueType_U256, - D2R_ValueType_U512, - D2R_ValueType_S8, - D2R_ValueType_S16, - D2R_ValueType_S32, - D2R_ValueType_S64, - D2R_ValueType_S128, - D2R_ValueType_S256, - D2R_ValueType_S512, - D2R_ValueType_F32, - D2R_ValueType_F64, - D2R_ValueType_Address, - D2R_ValueType_ImplicitValue, - D2R_ValueType_Bool = D2R_ValueType_S8, -} D2R_ValueType; +//////////////////////////////// +//~ RDIM Bytecode Extensions -typedef struct D2R_ValueTypeNode -{ - D2R_ValueType type; - - struct D2R_ValueTypeNode *next; -} D2R_ValueTypeNode; - -typedef struct D2R_ValueTypeStack -{ - U64 count; - D2R_ValueTypeNode *top; - D2R_ValueTypeNode *free_list; -} D2R_ValueTypeStack; +internal B32 rdim_is_eval_bytecode_static (RDIM_EvalBytecode bc); +internal B32 rdim_static_eval_bytecode_to_voff(RDIM_EvalBytecode bc, U64 image_base, U64 *voff_out); //////////////////////////////// -//~ rjf: Enum Conversion Helpers +//~ DWARF -> RDI Enums internal RDI_Language d2r_rdi_language_from_dw_language(DW_Language v); -internal RDI_RegCodeX64 d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v); -internal RDI_RegCode d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v); +internal RDI_RegCodeX64 d2r_rdi_reg_code_from_dw_reg_x64 (DW_RegX64 v); +internal RDI_RegCode d2r_rdi_reg_code_from_dw_reg (Arch arch, DW_Reg v); //////////////////////////////// -//~ rjf: Type Conversion Helpers - -internal RDIM_Type * d2r_create_type(Arena *arena, D2R_TypeTable *type_table); -internal RDIM_Type * d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off); -internal RDIM_Type * d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off); -internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); -internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); -internal RDI_TypeKind d2r_unsigned_type_kind_from_size(U64 byte_size); -internal RDI_TypeKind d2r_signed_type_kind_from_size(U64 byte_size); -internal RDI_EvalTypeGroup d2r_type_group_from_type_kind(RDI_TypeKind x); - -//////////////////////////////// -//~ RDIM Bytecode Helpers - -internal B32 rdim_is_eval_bytecode_static(RDIM_EvalBytecode bc); -internal U64 rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base); - -//////////////////////////////// -//~ rjf: Bytecode Conversion Helpers +//~ Value Type internal D2R_ValueTypeNode * d2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type); -internal D2R_ValueType d2r_value_type_stack_pop(D2R_ValueTypeStack *stack); +internal D2R_ValueType d2r_value_type_stack_pop (D2R_ValueTypeStack *stack); internal D2R_ValueType d2r_value_type_stack_peek(D2R_ValueTypeStack *stack); -internal D2R_ValueType d2r_unsigned_value_type_from_bit_size(U64 bit_size); -internal D2R_ValueType d2r_signed_value_type_from_bit_size(U64 bit_size); -internal D2R_ValueType d2r_float_type_from_bit_size(U64 bit_size); -internal RDI_EvalTypeGroup d2r_value_type_to_rdi(D2R_ValueType v); -internal U64 d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type); +internal D2R_ValueType d2r_signed_value_type_from_bit_size (U64 bit_size); +internal D2R_ValueType d2r_unsigned_value_type_from_bit_size(U64 bit_size); +internal D2R_ValueType d2r_float_type_from_bit_size (U64 bit_size); + +internal U64 d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type); +internal D2R_ArithmeticType d2r_arithmetic_type_from_value_type(D2R_ValueType v); +internal D2R_ArithmeticType d2r_arithmetic_type_from_value_type(D2R_ValueType v); +internal B32 d2r_is_value_type_signed (D2R_ValueType v); +internal B32 d2r_is_value_type_integral(D2R_ValueType v); +internal B32 d2r_is_value_type_unsigned(D2R_ValueType v); +internal B32 d2r_is_value_type_float (D2R_ValueType v); + internal D2R_ValueType d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs); +internal RDI_EvalTypeGroup d2r_value_type_to_rdi(D2R_ValueType v); internal D2R_ValueType d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc); internal void d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); -internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); -internal RDIM_Location * d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); -internal RDIM_Location * d2r_location_from_attrib(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); +//////////////////////////////// +//~ Expression Conversion + +internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); +internal RDIM_Location * d2r_transpile_expression (Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); +internal RDIM_Location * d2r_location_from_attrib (Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_locset_from_attrib (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_var_locset_from_tag (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); //////////////////////////////// -//~ rjf: Compilation Unit / Scope Conversion Helpers +//~ Type Table -internal D2R_CompUnitContribMap d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base); -internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); +internal RDIM_Type * d2r_create_type (Arena *arena, D2R_TypeTable *type_table); +internal RDIM_Type * d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off); +internal RDIM_Type * d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off); +internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); //////////////////////////////// //~ Tag Iterator internal D2R_TagIterator * d2r_tag_iterator_init(Arena *arena, DW_TagNode *root); internal void d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter); -internal void d2r_tag_iterator_skip_children(D2R_TagIterator *iter); +internal void d2r_tag_iterator_skip_children (D2R_TagIterator *iter); internal DW_TagNode * d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter); -internal DW_Tag d2r_tag_iterator_parent_tag(D2R_TagIterator *iter); +internal DW_Tag d2r_tag_iterator_parent_tag (D2R_TagIterator *iter); //////////////////////////////// -//~ Type/UDT/Symbol Conversion +//~ Type Conversion -internal void d2r_flag_converted_tag(DW_TagNode *tag_node); -internal B8 d2r_is_tag_converted(DW_TagNode *tag_node); - -internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); -internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root); -internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root); +internal void d2r_flag_converted_tag(DW_TagNode *tag_node); +internal B8 d2r_is_tag_converted (DW_TagNode *tag_node); +internal RDIM_Type * d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, DW_Tag tag, DW_AttribKind kind); +internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, DW_TagNode *root); //////////////////////////////// -//~ rjf: Main Conversion Entry Point +//~ UDT Conversion + +internal B8 d2r_is_udt_tag_converted (DW_TagNode *tag_node); +internal void d2r_flag_converted_udt_tag(DW_TagNode *tag_node); +internal void d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, RDIM_UDT *udt); +internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, DW_TagNode *root); + +//////////////////////////////// +//~ Symbol Conversion + +internal RDIM_Scope * d2r_push_scope (Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges); +internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); +internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); +internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, Arch arch, DW_TagNode *root); + +//////////////////////////////// +//~ Line Table Conversion + +internal U64 d2r_hash_line_file(String8 dir_path, DW_LineFile *file); +internal void d2r_sort_ptrs(void **ptrs, U64 count, int (* is_before)(void *a, void *b)); + +//////////////////////////////// +//~ Contrib Map + +internal D2R_CompUnitContribMap d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base); +internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); + +//////////////////////////////// +//~ Entry Point internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params); + +#endif // RDI_FROM_DWARF_H From 15831c704f52f841601f2736a8df83897be9fe1d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 5 Feb 2026 17:46:10 -0800 Subject: [PATCH 158/850] lock free hash trie --- src/linker/lf_hash_table.c | 89 ++++++++++++++++++++++++++++++++++++++ src/linker/lf_hash_table.h | 36 +++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 src/linker/lf_hash_table.c create mode 100644 src/linker/lf_hash_table.h diff --git a/src/linker/lf_hash_table.c b/src/linker/lf_hash_table.c new file mode 100644 index 00000000..6a2f86a7 --- /dev/null +++ b/src/linker/lf_hash_table.c @@ -0,0 +1,89 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal B32 +lfht_insert(Arena *arena, + LFHT_NodeChunkList *node_chunks, + LFHT_Node **root_ptr, + U64 hash, + void *data, + LFHT_IsKeyEqualFunc *is_key_equal, + void *is_key_equal_ud) +{ + B32 was_inserted = 0; + LFHT_Node **curr_ptr = root_ptr; + for (U64 h = hash; ; h <<= 2) { + LFHT_Node *curr = ins_atomic_ptr_eval(curr_ptr); + + if (curr == 0) { + if (node_chunks->last == 0 || node_chunks->last->count >= node_chunks->last->max) { + LFHT_NodeChunk *c = push_array(arena, LFHT_NodeChunk, 1); + c->max = 1024; + c->count = 0; + c->v = push_array_no_zero(arena, LFHT_Node, 1024); + + SLLQueuePush(node_chunks->first, node_chunks->last, c); + node_chunks->chunk_count += 1; + } + + LFHT_Node *n = &node_chunks->last->v[node_chunks->last->count]; + MemoryZeroStruct(n); + n->data = data; + + LFHT_Node *cmp = ins_atomic_ptr_eval_cond_assign(curr_ptr, n, curr); + if (cmp == curr) { + node_chunks->last->count += 1; + node_chunks->total_count += 1; + was_inserted = 1; + break; + } + } + + // was the key already inserted? + if (is_key_equal(is_key_equal_ud, curr->data, data)) { break; } + + // descend + curr_ptr = &curr->children[h >> 62]; + } + return was_inserted; +} + +internal void * +lfht_search(LFHT_Node *root, U64 hash, void *data, LFHT_IsKeyEqualFunc *is_key_equal, void *is_key_equal_ud) +{ + LFHT_Node *curr = root; + for (U64 h = hash; ; h <<= 2) { + if (curr == 0) { break; } + if (is_key_equal(is_key_equal_ud, curr->data, data)) { break; } + curr = curr->children[h >> 62]; + } + return curr ? curr->data : 0; +} + +internal U64 +lfht_total_count_from_node_chunk_lists(U64 list_count, LFHT_NodeChunkList *lists) +{ + U64 total_count = 0; + for EachIndex(i, list_count) { total_count += lists[i].total_count; } + return total_count; +} + +internal void ** +lfht_data_from_node_chunk_lists(Arena *arena, U64 total_count, U64 list_count, LFHT_NodeChunkList *lists) +{ + U64 result_count = 0; + void **result = push_array(arena, void *, total_count); + for EachIndex(list_idx, list_count) { + LFHT_NodeChunkList l = lists[list_idx]; + for EachNode(c, LFHT_NodeChunk, l.first) { + Assert(result_count + c->count <= total_count); + for EachIndex(item_idx, c->count) { + result[result_count++] = c->v[item_idx].data; + } + } + } + + return result; +} + + diff --git a/src/linker/lf_hash_table.h b/src/linker/lf_hash_table.h new file mode 100644 index 00000000..979e911c --- /dev/null +++ b/src/linker/lf_hash_table.h @@ -0,0 +1,36 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef LF_HASH_TABLE_H +#define LF_HAHS_TABLE_H + +typedef struct LFHT_Node +{ + void *data; + struct LFHT_Node *children[4]; +} LFHT_Node; + +typedef struct LFHT_NodeChunk +{ + struct LFHT_NodeChunk *next; + U64 max; + U64 count; + LFHT_Node *v; +} LFHT_NodeChunk; + +typedef struct LFHT_NodeChunkList +{ + U64 chunk_count; + U64 total_count; + LFHT_NodeChunk *first; + LFHT_NodeChunk *last; +} LFHT_NodeChunkList; + +#define LFHT_IS_KEY_EQUAL_FUNC(name) B32 name(void *ud, void *a, void *b) +typedef LFHT_IS_KEY_EQUAL_FUNC(LFHT_IsKeyEqualFunc); + +internal B32 lfht_insert(Arena *arena, LFHT_NodeChunkList *node_chunks, LFHT_Node **root_ptr, U64 hash, void *data, LFHT_IsKeyEqualFunc *is_key_equal, void *is_key_equal_ud); + +internal void ** lfht_data_from_node_chunk_lists(Arena *arena, U64 total_count, U64 list_count, LFHT_NodeChunkList *lists); + +#endif // LF_HASH_TABLE_H \ No newline at end of file From 09472fafbd74aecf1e64254c555b5ad0683f7904 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 28 Jan 2026 18:55:24 -0800 Subject: [PATCH 159/850] typo in the ordinal export sorter --- src/pe/pe_make_export_table.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/pe/pe_make_export_table.c b/src/pe/pe_make_export_table.c index b8919c24..20481a2d 100644 --- a/src/pe/pe_make_export_table.c +++ b/src/pe/pe_make_export_table.c @@ -84,7 +84,8 @@ pe_named_export_is_before(void *raw_a, void *raw_b) internal int pe_ordinal_export_is_before(void *raw_a, void *raw_b) { - return ((PE_ExportParse * )raw_a)->ordinal < ((PE_ExportParse *)raw_b)->ordinal; + PE_ExportParse **a = raw_a, **b = raw_b; + return (*a)->ordinal < (*b)->ordinal; } internal PE_FinalizedExports @@ -110,10 +111,6 @@ pe_finalize_export_list(Arena *arena, PE_ExportParseList export_list) named_exports = pe_array_from_export_list(arena, named_exports_list); ordinal_exports = pe_array_from_export_list(arena, ordinal_exports_list); - for(int i = 0; i < ordinal_exports.count; ++i) { - PE_ExportParse p = *ordinal_exports.v[i]; - } - // sort exports radsort(named_exports.v, named_exports.count, pe_named_export_is_before); radsort(ordinal_exports.v, ordinal_exports.count, pe_ordinal_export_is_before); From ae236f5ccf64fed807e31d1f070b7b37ea8497c2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 28 Jan 2026 18:56:03 -0800 Subject: [PATCH 160/850] assert element size does not overflow the simple buffer in radsort --- src/third_party/radsort/radsort.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/third_party/radsort/radsort.h b/src/third_party/radsort/radsort.h index 9850a6ff..90a971ba 100644 --- a/src/third_party/radsort/radsort.h +++ b/src/third_party/radsort/radsort.h @@ -112,8 +112,15 @@ typedef void rs_small_sort_func( void * left, size_t n, size_t element_size, is_ #define RS_SMALL_FLIP_TO_INSERTION_GT_SIZE sizeof( size_t ) typedef struct RS_MAX_BUBBLE_BUF { char b[RS_SMALL_FLIP_TO_INSERTION_GT_SIZE]; } RS_MAX_BUBBLE_BUF; +#if _MSC_VER +# define radsort_break_ __debugbreak() +#else +# define radsort_break_ ___builtin_trap() +#endif + #define radsort( start, len, is_before_func ) \ do { \ +if (sizeof((start)[0]) > sizeof(RS_MAX_SIMPLE_BUF)) { radsort_break_; } \ char __rs_tmp[ sizeof( (start)[0] ) ]; \ radsortinternal( start, len, sizeof( (start)[0] ), \ is_before_func, \ From d363c30e9582011f8cf67df847f7061d469f487f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 28 Jan 2026 19:06:51 -0800 Subject: [PATCH 161/850] copy out generic --- src/dwarf/dwarf_expr.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 04f9e1ba..359fb41f 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1546,6 +1546,9 @@ dw_eval_expr(Arena *arena, else { if (stack->top) { *value_out = stack->top->v; + if (value_out->type == DW_ExprValueType_Generic) { + value_out->generic = push_str8_copy(arena, value_out->generic); + } Rng1U64 *range = push_array(arena, Rng1U64, 1); *range = r1u64(0, max_U64); From 8b729d4588b5cfcbfa701d0ee442ea72bbd4412b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 29 Jan 2026 18:58:38 -0800 Subject: [PATCH 162/850] refactored testing utility - factored out common parts in tests into T_BeginTest and T_EndTest - separated radlink and DWARF tests --- build.bat | 4 +- src/coff/coff_parse.c | 37 +- src/coff/coff_parse.h | 7 +- src/torture/torture.c | 5411 +-------------------------------- src/torture/torture.h | 94 + src/torture/torture_dwarf.c | 190 ++ src/torture/torture_main.c | 62 + src/torture/torture_radlink.c | 3860 +++++++++++++++++++++++ src/torture/torture_radlink.h | 40 + 9 files changed, 4404 insertions(+), 5301 deletions(-) create mode 100644 src/torture/torture.h create mode 100644 src/torture/torture_dwarf.c create mode 100644 src/torture/torture_main.c create mode 100644 src/torture/torture_radlink.c create mode 100644 src/torture/torture_radlink.h diff --git a/build.bat b/build.bat index f3519851..eb0dd4d1 100644 --- a/build.bat +++ b/build.bat @@ -73,6 +73,8 @@ set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%% set cl_out= /out: set cl_linker= set clang_common= -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -mcx16 -msha +set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% +set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:icf @@ -144,7 +146,7 @@ if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_ if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1 if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 -if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture.c %compile_link% %out%torture.exe || exit /b1 +if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% %out%torture.exe || exit /b1 if "%dwarf_expr_test%"=="1" set didbuild=1 && %compile% ..\src\torture\dwarf_expr_test.c %compile_link% %out%dwarf_expr_test.exe || exit /b1 if "%mule_peb_trample%"=="1" ( set didbuild=1 diff --git a/src/coff/coff_parse.c b/src/coff/coff_parse.c index 3f9e81ca..1db0b582 100644 --- a/src/coff/coff_parse.c +++ b/src/coff/coff_parse.c @@ -127,12 +127,45 @@ coff_section_table_from_data(Arena *arena, String8 data, Rng1U64 section_table_r U64 section_count = dim_1u64(section_table_range) / sizeof(COFF_SectionHeader); COFF_SectionHeader **section_table = push_array_no_zero(arena, COFF_SectionHeader *, section_count+1); section_table[0] = push_array(arena, COFF_SectionHeader, 1); - for (U64 i = 0; i < section_count; ++i) { - section_table[i+1] = str8_deserial_get_raw_ptr(data, section_table_range.min + i*sizeof(COFF_SectionHeader), sizeof(COFF_SectionHeader)); + for EachIndex(sect_idx, section_count) { + section_table[sect_idx + 1] = str8_deserial_get_raw_ptr(data, section_table_range.min + sect_idx*sizeof(COFF_SectionHeader), sizeof(COFF_SectionHeader)); } return section_table; } +internal COFF_SectionHeader * +coff_section_header_from_name(String8 string_table, COFF_SectionHeader *section_table, U64 section_count, String8 name) +{ + for EachIndex(sect_idx, section_count) { + if (str8_match(coff_name_from_section_header(string_table, §ion_table[sect_idx]), name, 0)) { + return §ion_table[sect_idx]; + } + } + return 0; +} + +internal COFF_SectionHeaderArray +coff_section_header_array_from_name(Arena *arena, String8 string_table, COFF_SectionHeader *section_table, U64 section_count, String8 name) +{ + U64 match_count = 0; + for EachIndex(sect_idx, section_count) { + if (str8_match(coff_name_from_section_header(string_table, §ion_table[sect_idx]), name, 0)) { + match_count += 1; + } + } + + COFF_SectionHeader *matches = push_array(arena, COFF_SectionHeader, match_count); + for (U64 sect_idx = 0, match_idx = 0; sect_idx < section_count; sect_idx += 1) { + if (str8_match(coff_name_from_section_header(string_table, §ion_table[sect_idx]), name, 0)) { + matches[match_idx] = section_table[sect_idx]; + match_idx += 1; + } + } + + return (COFF_SectionHeaderArray){ .count = match_count, .v = matches }; +} + + internal COFF_ParsedSymbol coff_parse_symbol32(String8 string_table, COFF_Symbol32 *sym32) { diff --git a/src/coff/coff_parse.h b/src/coff/coff_parse.h index 4156b6c6..edcb2952 100644 --- a/src/coff/coff_parse.h +++ b/src/coff/coff_parse.h @@ -251,14 +251,17 @@ internal COFF_FileHeaderInfo coff_file_header_info_from_data(String8 raw_coff); //////////////////////////////// // Section -internal COFF_SectionHeader ** coff_section_table_from_data(Arena *arena, String8 data, Rng1U64 section_table_range); +internal COFF_SectionHeader ** coff_section_table_from_data (Arena *arena, String8 data, Rng1U64 section_table_range); +internal COFF_SectionHeader * coff_section_header_from_name (String8 string_table, COFF_SectionHeader *section_table, U64 section_count, String8 name); +internal COFF_SectionHeaderArray coff_section_header_array_from_name(Arena *arena, String8 string_table, COFF_SectionHeader *section_table, U64 section_count, String8 name); +internal String8 coff_name_from_section_header (String8 string_table, COFF_SectionHeader *header); //////////////////////////////// // Symbol internal COFF_ParsedSymbol coff_parse_symbol32(String8 string_table, COFF_Symbol32 *sym32); internal COFF_ParsedSymbol coff_parse_symbol16(String8 string_table, COFF_Symbol16 *sym16); -internal COFF_ParsedSymbol coff_parse_symbol(COFF_FileHeaderInfo header, String8 string_table, String8 symbol_table, U32 symbol_idx); +internal COFF_ParsedSymbol coff_parse_symbol (COFF_FileHeaderInfo header, String8 string_table, String8 symbol_table, U32 symbol_idx); internal COFF_Symbol32Array coff_symbol_array_from_data_16(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count); internal COFF_Symbol32Array coff_symbol_array_from_data_32(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count); diff --git a/src/torture/torture.c b/src/torture/torture.c index 1695d55a..a76d07cf 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -1,212 +1,30 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// -// Build Options - -#define BUILD_CONSOLE_INTERFACE 1 -#define BUILD_TITLE "TORTURE" - -//////////////////////////////// - -#include "third_party/xxHash/xxhash.c" -#include "third_party/xxHash/xxhash.h" -#include "third_party/radsort/radsort.h" - -//////////////////////////////// - -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "linker/base_ext/base_core.h" -#include "linker/base_ext/base_arena.h" -#include "linker/base_ext/base_arrays.h" -#include "linker/hash_table.h" -#include "coff/coff.h" -#include "coff/coff_parse.h" -#include "coff/coff_obj_writer.h" -#include "coff/coff_lib_writer.h" -#include "pe/pe.h" -#include "pe/pe_section_flags.h" -#include "elf/elf.h" -#include "elf/elf_parse.h" -#include "dwarf/dwarf_inc.h" -#include "regs/regs.h" -#include "regs/dwarf/regs_dwarf.h" - -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "linker/hash_table.c" -#include "linker/base_ext/base_core.c" -#include "linker/base_ext/base_arena.c" -#include "linker/base_ext/base_arrays.c" -#include "coff/coff.c" -#include "coff/coff_parse.c" -#include "coff/coff_obj_writer.c" -#include "coff/coff_lib_writer.c" -#include "pe/pe.c" -#include "elf/elf.c" -#include "elf/elf_parse.c" -#include "dwarf/dwarf_inc.c" -#include "regs/regs.c" -#include "regs/dwarf/regs_dwarf.c" - -#include "linker/lnk_cmd_line.h" -#include "linker/lnk_cmd_line.c" -#include "linker/lnk_error.h" - -//////////////////////////////// - -typedef enum -{ - T_Result_Fail, - T_Result_Crash, - T_Result_Pass, -} T_Result; - -typedef T_Result (*T_Run)(void); - -internal char * -t_string_from_result(T_Result v) -{ - switch (v) { - case T_Result_Fail: return "FAIL"; - case T_Result_Crash: return "CRASH"; - case T_Result_Pass: return "PASS"; - } - return 0; -} - +// command line global String8 g_stdout_file_name = str8_lit_comp("torture.out"); -global U64 g_linker_time_out; -global String8 g_linker; global String8 g_wdir; global String8 g_out = str8_lit_comp("torture"); global B32 g_verbose; global B32 g_redirect_stdout = 1; +global String8 g_linker; -#define T_LINKER_TIME_OUT_EXIT_CODE 999999 +// tests +U64 g_torture_test_count; +T_Test g_torture_tests[0xffffff]; -typedef enum +// invoke +global int g_last_exit_code; + +internal char * +t_string_from_result(T_RunStatus v) { - T_Linker_Null, - T_Linker_RAD, - T_Linker_MSVC, - T_Linker_LLVM -} T_Linker; - -internal T_Linker -t_ident_linker(void) -{ - String8 name = g_linker; - name = str8_skip_last_slash(name); - name = str8_chop_last_dot(name); - if (str8_match(name, str8_lit("radlink"), StringMatchFlag_CaseInsensitive)) { - return T_Linker_RAD; + switch (v) { + case T_RunStatus_Fail: return "FAIL"; + case T_RunStatus_Crash: return "CRASH"; + case T_RunStatus_Pass: return "PASS"; } - if (str8_match(name, str8_lit("link"), StringMatchFlag_CaseInsensitive)) { - return T_Linker_MSVC; - } - if (str8_match(name, str8_lit("lld-link"), StringMatchFlag_CaseInsensitive)) { - return T_Linker_LLVM; - } - return T_Linker_Null; -} - -internal int -t_invoke_linker_with_time_out(U64 time_out, String8 cmdline) -{ - Temp scratch = scratch_begin(0,0); - - OS_Handle output_redirect = {0}; - if (g_redirect_stdout) { - output_redirect = os_file_open(OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, g_stdout_file_name); - } - - // - // Build Launch Options - // - OS_ProcessLaunchParams launch_opts = {0}; - launch_opts.path = g_wdir; - launch_opts.inherit_env = 1; - launch_opts.stdout_file = output_redirect; - launch_opts.stderr_file = output_redirect; - str8_list_push(scratch.arena, &launch_opts.cmd_line, g_linker); - str8_list_push(scratch.arena, &launch_opts.cmd_line, str8_lit("/nologo")); - { - String8List parsed_cmdline = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline); - str8_list_concat_in_place(&launch_opts.cmd_line, &parsed_cmdline); - } - - // - // Invoke Linker - // - int exit_code = -1; - { - if (g_verbose) { - String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(" ") }); - fprintf(stdout, "Command Line: %.*s\n", str8_varg(full_cmd_line)); - fprintf(stdout, "Working Dir: %.*s\n", str8_varg(g_wdir)); - } - - OS_Handle linker_handle = os_process_launch(&launch_opts); - if (os_handle_match(linker_handle, os_handle_zero())) { - fprintf(stderr, "unable to start process: %.*s\n", str8_varg(g_linker)); - } else { - U64 exit_code_u64 = 0; - B32 was_joined = os_process_join(linker_handle, time_out, &exit_code_u64); - exit_code = (int)exit_code_u64; - if (!was_joined) { - os_process_kill(linker_handle); - exit_code = T_LINKER_TIME_OUT_EXIT_CODE; - } - os_process_detach(linker_handle); - } - } - - if (g_redirect_stdout) { - os_file_close(output_redirect); - } - - scratch_end(scratch); - return exit_code; -} - -internal int -t_invoke_linker(String8 cmdline) -{ - return t_invoke_linker_with_time_out(max_U64, cmdline); -} - -internal int -t_invoke_linkerf(char *fmt, ...) -{ - Temp scratch = scratch_begin(0,0); - va_list args; - va_start(args, fmt); - String8 cmdline = push_str8fv(scratch.arena, fmt, args); - int exit_code = t_invoke_linker(cmdline); - va_end(args); - scratch_end(scratch); - return exit_code; -} - -internal int -t_invoke_linker_with_time_outf(U64 time_out, char *fmt, ...) -{ - Temp scratch = scratch_begin(0,0); - va_list args; - va_start(args, fmt); - String8 cmdline = push_str8fv(scratch.arena, fmt, args); - int exit_code = t_invoke_linker_with_time_out(time_out, cmdline); - va_end(args); - scratch_end(scratch); - return exit_code; -} - -internal String8 -t_make_file_path(Arena *arena, String8 name) -{ - return push_str8f(arena, "%S\\%S", g_wdir, name); + return 0; } internal B32 @@ -241,16 +59,16 @@ t_read_file(Arena *arena, String8 name) return data; } -typedef struct +internal String8 +t_make_file_path(Arena *arena, String8 name) { - T_Run run; - T_Result result; -} T_RunCtx; + return push_str8f(arena, "%S\\%S", g_wdir, name); +} internal void t_run_caller(void *raw_ctx) { - T_RunCtx *ctx = raw_ctx; + T_RunCtx *ctx = raw_ctx; ctx->result = ctx->run(); } @@ -258,10 +76,10 @@ internal void t_run_fail_handler(void *raw_ctx) { T_RunCtx *ctx = raw_ctx; - ctx->result = T_Result_Crash; + ctx->result.status = T_RunStatus_Crash; } -internal T_Result +internal T_RunResult t_run(T_Run run) { T_RunCtx ctx = {0}; @@ -270,5085 +88,80 @@ t_run(T_Run run) return ctx.result; } -internal COFF_SectionHeader * -t_coff_section_header_from_name(String8 string_table, COFF_SectionHeader *section_table, U64 section_count, String8 name) +internal B32 +t_invoke(String8 exe_path, String8 cmdline, U64 timeout) { - for (U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1) { - COFF_SectionHeader *section_header = §ion_table[sect_idx]; - String8 section_name = coff_name_from_section_header(string_table, section_header); - if (str8_match(section_name, name, 0)) { - return section_header; - } - } - return 0; -} + Temp scratch = scratch_begin(0,0); -internal COFF_SectionHeaderArray -t_coff_section_header_array_from_name(Arena *arena, String8 string_table, COFF_SectionHeader *section_table, U64 section_count, String8 name) -{ - U64 match_count = 0; - for (U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1) { - COFF_SectionHeader *section_header = §ion_table[sect_idx]; - String8 section_name = coff_name_from_section_header(string_table, section_header); - if (str8_match(section_name, name, 0)) { - match_count += 1; + B32 is_ok = 0; + + OS_Handle output_redirect = {0}; + if (g_redirect_stdout) { + output_redirect = os_file_open(OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, g_stdout_file_name); + } + + // Build Launch Options + OS_ProcessLaunchParams launch_opts = { .path = g_wdir, .inherit_env = 1, .stdout_file = output_redirect, .stderr_file = output_redirect }; + str8_list_push(scratch.arena, &launch_opts.cmd_line, g_linker); + str8_list_push(scratch.arena, &launch_opts.cmd_line, str8_lit("/nologo")); + { + String8List parsed_cmdline = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline); + str8_list_concat_in_place(&launch_opts.cmd_line, &parsed_cmdline); + } + + if (g_verbose) { + String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(" ") }); + fprintf(stdout, "Command Line: %.*s\n", str8_varg(full_cmd_line)); + fprintf(stdout, "Working Dir: %.*s\n", str8_varg(g_wdir)); + } + + // Invoke Exe + int exit_code = -1; + { + OS_Handle process_handle = os_process_launch(&launch_opts); + if (!os_handle_match(process_handle, os_handle_zero())) { + U64 exit_code_u64 = 0; + is_ok = os_process_join(process_handle, timeout, &exit_code_u64); + exit_code = (int)exit_code_u64; + if (!is_ok) { + os_process_kill(process_handle); + } + os_process_detach(process_handle); } } - COFF_SectionHeader *matches = push_array(arena, COFF_SectionHeader, match_count); - for (U64 sect_idx = 0, match_idx = 0; sect_idx < section_count; sect_idx += 1) { - COFF_SectionHeader *section_header = §ion_table[sect_idx]; - String8 section_name = coff_name_from_section_header(string_table, section_header); - if (str8_match(section_name, name, 0)) { - matches[match_idx++] = *section_header; - } + // close handles + if (g_redirect_stdout) { + os_file_close(output_redirect); } - COFF_SectionHeaderArray result = {0}; - result.count = match_count; - result.v = matches; + // update global exit code + if (is_ok) { + g_last_exit_code = exit_code; + } else { + g_last_exit_code = -1; + } - return result; + scratch_end(scratch); + return is_ok; } -//////////////////////////////////////////////////////////////// - -typedef enum +internal int +t_test_is_before(void *raw_a, void *raw_b) { - T_MsvcLinkExitCode_UnresolvedExternals = 1120, - T_MsvcLinkExitCode_CorruptOrInvalidSymbolTable = 1235, - T_MsvcLinkExitCode_SectionsFoundWithDifferentAttributes = 4078, -} T_MsvcLinkExitCode; - -internal COFF_ObjSection * -t_push_text_section(COFF_ObjWriter *obj_writer, String8 data) -{ - return coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_Align1Bytes, data); -} - -internal COFF_ObjSection * -t_push_data_section(COFF_ObjWriter *obj_writer, String8 data) -{ - return coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, data); -} - -internal COFF_ObjSection * -t_push_rdata_section(COFF_ObjWriter *obj_writer, String8 data) -{ - return coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS, data); + T_Test *a = raw_a, *b = raw_b; + int cmp = str8_compar(str8_cstring(a->group), str8_cstring(b->group), 0); + if (cmp == 0) { + cmp = u64_compar(&a->decl_line, &b->decl_line); + } + return cmp < 0; } internal void -t_write_entry_obj(void) -{ - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(obj_writer->arena, obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - AssertAlways(!"unable to write entry obj"); - } - coff_obj_writer_release(&obj_writer); -} - -//////////////////////////////// - -internal T_Result -t_machine_compat_check(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown); - t_push_data_section(obj_writer, str8_lit("unknown")); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("unknown.obj"), obj)) { - goto exit; - } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - t_push_data_section(obj_writer, str8_lit("x64")); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("x64.obj"), obj)) { - goto exit; - } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Arm64); - t_push_data_section(obj_writer, str8_lit("arm64")); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("arm64.obj"), obj)) { - goto exit; - } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int linker_exit_code; - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj unknown.obj x64.obj"); - if (linker_exit_code != 0) { - goto exit; - } - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj unknown.obj x64.obj arm64.obj"); - if (linker_exit_code == 0) { - goto exit; - } - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /machine:amd64 arm64.obj entry.obj"); - if (linker_exit_code == 0) { - goto exit; - } - - result = T_Result_Pass; - - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_out_of_bounds_section_number(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *foo = coff_obj_writer_push_section(obj_writer, str8_lit(".foo"), PE_DATA_SECTION_FLAGS, str8_lit("foo")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, foo); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - { - COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj); - String8 string_table = str8_substr(obj, header.string_table_range); - String8 symbol_table = str8_substr(obj, header.symbol_table_range); - COFF_ParsedSymbol symbol = coff_parse_symbol(header, string_table, symbol_table, 0); - COFF_Symbol16 *symbol16 = symbol.raw_symbol; - symbol16->section_number = 123; - } - if (!t_write_file(str8_lit("bad.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj"); - if (linker_exit_code == 0) { goto exit; } - if (t_ident_linker() == T_Linker_RAD && linker_exit_code != LNK_Error_IllData) { goto exit; } - - result = T_Result_Pass; - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_merge(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_DATA_SECTION_FLAGS, str8_lit("hello, world")); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("test.obj"), obj)) { - goto exit; - } - } - - t_write_entry_obj(); - - int linker_exit_code; - - // circular merge - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.test entry.obj test.obj"); - if (linker_exit_code == 0) { - goto exit; - } - if (t_ident_linker() == T_Linker_RAD) { - if (linker_exit_code != LNK_Error_CircularMerge) { - goto exit; - } - } - - // circular merge with extra link - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.data /merge:.data=.test entry.obj test.obj"); - if (linker_exit_code == 0) { - goto exit; - } - if (t_ident_linker() == T_Linker_RAD) { - if (linker_exit_code != LNK_Error_CircularMerge) { - goto exit; - } - } - - // merge with non-defined section - { - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.qwe entry.obj test.obj"); - if (linker_exit_code != 0) { - goto exit; - } - - // make sure linker created .qwe and merged .test into it - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".qwe")); - if (sect == 0) { - goto exit; - } - if (sect->flags != PE_DATA_SECTION_FLAGS) { - goto exit; - } - String8 qwe = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(qwe, str8_lit("hello, world"),0)) { - goto exit; - } - } - - // illegal merge with .reloc - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.reloc entry.obj test.obj"); - if (linker_exit_code == 0) { - goto exit; - } - if (t_ident_linker() == T_Linker_RAD) { - if (linker_exit_code != LNK_Error_IllegalSectionMerge) { - goto exit; - } - } - - // illegal merge with .rsrc - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.rsrc entry.obj test.obj"); - if (linker_exit_code == 0) { - goto exit; - } - if (t_ident_linker() == T_Linker_RAD) { - if (linker_exit_code != LNK_Error_IllegalSectionMerge) { - goto exit; - } - } - - // merge non-defined section with defined section - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.qwe=.test entry.obj test.obj"); - if (linker_exit_code != 0) { - goto exit; - } - - // merge .test -> .qwe -> .data - { - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.qwe /merge:.qwe=.data entry.obj test.obj"); - if (linker_exit_code != 0) { - goto exit; - } - - // make sure linker merged .test into .data - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".data")); - if (sect == 0) { - goto exit; - } - if (sect->flags != PE_DATA_SECTION_FLAGS) { - goto exit; - } - String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(data, str8_lit("hello, world"),0)) { - goto exit; - } - } - - result = T_Result_Pass; - - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_simple_link_test(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - U8 text_payload[] = { 0xC3 }; - - String8 main_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text_payload)); - coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_lit("qwe")); - coff_obj_writer_push_section(obj_writer, str8_lit(".zero"), PE_BSS_SECTION_FLAGS, str8(0, 5)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 main_obj_name = str8_lit("main.obj"); - if (!t_write_file(main_obj_name, main_obj)) { - goto exit; - } - - int file_align = 512; - int virt_align = 4096; - String8 out_name = str8_lit("a.exe"); - int linker_exit_code = t_invoke_linkerf("/entry:my_entry /subsystem:console /fixed /filealign:%d /align:%d /out:%S %S", file_align, virt_align, out_name, main_obj_name); - if (linker_exit_code != 0) { - goto exit; - } - - String8 exe = t_read_file(scratch.arena, out_name); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - if (pe.is_pe32) { - goto exit; - } - if (pe.section_count != 3) { - goto exit; - } - if (pe.arch != Arch_x64) { - goto exit; - } - if (pe.subsystem != PE_WindowsSubsystem_WINDOWS_CUI) { - goto exit; - } - if (pe.virt_section_align != virt_align) { - goto exit; - } - if (pe.file_section_align != file_align) { - goto exit; - } - if (pe.symbol_count != 0) { - goto exit; - } - if (pe.data_dir_count != PE_DataDirectoryIndex_COUNT) { - goto exit; - } - - // check section alignment - for (U64 sect_idx = 0; sect_idx < pe.section_count; sect_idx += 1) { - COFF_SectionHeader *sect_header = §ion_table[sect_idx]; - if (AlignPadPow2(sect_header->fsize, file_align) != 0) { - goto exit; - } - if (AlignPadPow2(sect_header->voff, virt_align) != 0) { - goto exit; - } - } - - COFF_SectionHeader *text_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (!text_section) { - goto exit; - } - if (text_section->foff != file_align) { - goto exit; - } - if (pe.entry_point != text_section->voff) { - goto exit; - } - - COFF_SectionHeader *data_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - if (data_section == 0) { - goto exit; - } - - COFF_SectionHeader *zero_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".zero")); - if (zero_section == 0) { - goto exit; - } - - String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + text_section->vsize)); - if (!str8_match(text_data, str8_array_fixed(text_payload), 0)) { - goto exit; - } - - PE_OptionalHeader32Plus *opt = str8_deserial_get_raw_ptr(exe, pe.optional_header_off, sizeof(*opt)); - if (opt->sizeof_code != text_section->fsize) { - goto exit; - } - if (opt->sizeof_inited_data != text_section->fsize + data_section->fsize) { - goto exit; - } - if (opt->sizeof_uninited_data != 0x200) { - goto exit; - } - if (opt->code_base != 0x1000) { - goto exit; - } - if (opt->image_base != 0x140000000) { - goto exit; - } - if (opt->major_os_ver != 6) { - goto exit; - } - if (opt->minor_os_ver != 0) { - goto exit; - } - if (opt->major_img_ver != 0) { - goto exit; - } - if (opt->minor_img_ver != 0) { - goto exit; - } - if (opt->major_subsystem_ver != 6) { - goto exit; - } - if (opt->minor_subsystem_ver != 0) { - goto exit; - } - if (opt->win32_version_value != 0) { - goto exit; - } - if (opt->sizeof_image != 0x4000) { - goto exit; - } - if (opt->sizeof_headers != 0x200) { - goto exit; - } - if (opt->dll_characteristics != 0x8120) { - goto exit; - } - if (opt->loader_flags != 0) { - goto exit; - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_link_undef(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 undef_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); - undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("undef.obj"), undef_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - // try linking unresolved symbol and see if linker picks up on that - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj"); - if (linker_exit_code != LNK_Error_UnresolvedSymbol) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_link_unref_undef(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 undef_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); - undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("undef.obj"), undef_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - // try linking unreferenced unresolved symbol, this must link - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj"); - if (linker_exit_code == 0) { goto exit; } - - result = T_Result_Pass; - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_lib_vs_weak_lib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code; - - // linker must pick weak symbol from a.obj - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x111; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - // linker must pick weak symbol from entry.obj - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_lib_vs_weak_nolib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - // linker must pick weak symbol from entry.obj - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_lib_vs_weak_alias(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - // linker must pick weak symbol from entry.obj - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_lib_vs_weak_antidep(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - // linker must pick weak symbol from a.obj - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_alias_vs_weak_alias(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *qwe = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("qwe"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("sym"), COFF_WeakExt_SearchAlias, qwe); - a = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 b; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *ewq = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("ewq"), 0x222, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("sym"), COFF_WeakExt_SearchAlias, ewq); - b = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("sym")); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a)) { goto exit; } - if (!t_write_file(str8_lit("b.obj"), b)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); - if (linker_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_alias_vs_weak_lib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - // linker must pick weak symbol from entry.obj - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_alias_vs_weak_nolib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - // linker must pick weak symbol from entry.obj - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_alias_vs_weak_antidep(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - // linker must pick weak symbol from entry.obj - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_nolib_vs_weak_nolib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_nolib_vs_weak_lib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_nolib_vs_weak_alias(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_nolib_vs_weak_antidep(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_antidep_vs_weak_antidep(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code; - - // linker must pick weak symbol from a.obj - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x111; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - // linker must pick weak symbol from entry.obj - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_antidep_vs_weak_nolib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_antidep_vs_weak_lib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x222; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_antidep_vs_weak_alias(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); - if (linker_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - String8 imm = str8_substr(text_data, rng_1u64(3, 7)); - U32 expected = 0x111; - if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_vs_common(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 weak_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); - COFF_ObjSymbol *sect_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("_a"), 0, sect); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, sect_symbol); - weak_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 common_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_common(obj_writer, str8_lit("w"), 2); - common_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("w")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("weak.obj"), weak_obj)) { goto exit; } - if (!t_write_file(str8_lit("common.obj"), common_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code; - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe common.obj weak.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe weak.obj common.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeader *bss = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".bss")); - if (!bss) { goto exit; } - if (bss->fsize != 0) { goto exit; } - if (bss->vsize != 2) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_abs_vs_weak(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - U32 abs_value = 0x123; - U8 text_code[] = { 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3 }; - - String8 abs_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), abs_value, COFF_SymStorageClass_External); - abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 text_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - COFF_ObjSection *mydata = coff_obj_writer_push_section(obj_writer, str8_lit(".mydata"), COFF_SectionFlag_CntCode|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_Align1Bytes, str8_lit("mydata")); - COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("mydata"), 0, mydata); - COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("foo"), COFF_WeakExt_NoLibrary, tag); - - COFF_ObjSection *text = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), COFF_SectionFlag_CntCode|COFF_SectionFlag_MemExecute|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes, str8_array_fixed(text_code)); - coff_obj_writer_section_push_reloc(obj_writer, text, 2, foo, COFF_Reloc_X64_Addr64); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text); - - text_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("abs.obj"), abs_obj)) { goto exit; } - if (!t_write_file(str8_lit("text.obj"), text_obj)) { goto exit; } - - int abs_vs_weak_exit_code = t_invoke_linker(str8_lit("/subsystem:console /entry:my_entry /out:a.exe abs.obj text.obj")); - if (abs_vs_weak_exit_code != 0) { goto exit; } - - int weak_vs_abs_exit_code = t_invoke_linker(str8_lit("/subsystem:console /entry:my_entry /out:a.exe text.obj abs.obj")); - if (weak_vs_abs_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeader *text_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_section == 0) { goto exit; } - - String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + text_section->fsize)); - String8 inst = str8_prefix(text_data, 2); - if (!str8_match(inst, str8_array(text_code, 2), 0)) { goto exit; } - - String8 imm = str8_prefix(str8_skip(text_data, 2), 8); - U64 expected_imm = abs_value; - if (!str8_match(imm, str8_struct(&expected_imm), 0)) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_abs_vs_regular(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - String8 shared_symbol_name = str8_lit("foo"); - - U8 regular_payload[] = { 0xC0, 0xFF, 0xEE }; - String8 regular_obj_name = str8_lit("regular.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(regular_payload)); - coff_obj_writer_push_symbol_extern(obj_writer, shared_symbol_name, 0, data_sect); - String8 regular_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(regular_obj_name, regular_obj)) { - goto exit; - } - } - - String8 abs_obj_name = str8_lit("abs.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External); - String8 abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(abs_obj_name, abs_obj)) { - goto exit; - } - } - - U8 entry_text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - COFF_ObjSymbol *shared_symbol = coff_obj_writer_push_symbol_undef(obj_writer, shared_symbol_name); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, shared_symbol, COFF_Reloc_X64_Addr32Nb); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { - goto exit; - } - } - - // TODO: validate that linker issues multiply defined symbol error - int abs_vs_regular_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe abs.obj regular.obj entry.obj"); - if (abs_vs_regular_exit_code == 0) { - // linker should complain about multiply defined symbol - goto exit; - } - - int regular_vs_abs_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe regular.obj abs.obj entry.obj"); - if (regular_vs_abs_exit_code == 0) { - // linker should complain even in case regular is before abs - goto exit; - } - - result = T_Result_Pass; - - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_abs_vs_common(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 shared_symbol_name = str8_lit("foo"); - - String8 common_obj_name = str8_lit("common.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_common(obj_writer, shared_symbol_name, 321); - String8 common_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(common_obj_name, common_obj)) { - goto exit; - } - } - - String8 abs_obj_name = str8_lit("abs.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External); - String8 abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(abs_obj_name, abs_obj)) { - goto exit; - } - } - - U8 entry_text[] = { 0xC3 }; - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe abs.obj common.obj entry.obj"); - if (linker_exit_code == 0) { - // TODO: validate that linker issues multiply defined symbol error - int common_vs_abs = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe common.obj abs.obj entry.obj"); - if (t_ident_linker() == T_Linker_RAD) { - if (common_vs_abs == LNK_Error_MultiplyDefinedSymbol) { - result = T_Result_Pass; - } - } else { - if (common_vs_abs != 0) { - result = T_Result_Pass; - } - } - } - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_abs_vs_abs(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), 'a', COFF_SymStorageClass_External); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 b_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), 'b', COFF_SymStorageClass_External); - b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("b.obj"), b_obj)) { goto exit; } - t_write_entry_obj(); - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); - if (linker_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_undef_weak_lib(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 weak; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSymbol *b = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("b"), 0xc3000000, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("a"), COFF_WeakExt_SearchLibrary, b); - weak = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("a")); - U8 text[4] = {0}; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, sym); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry = coff_obj_writer_serialize(scratch.arena, obj_writer); - } - - if (!t_write_file(str8_lit("weak.obj"), weak)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry)) { goto exit; } - - // undefined symbol must always replace weak symbol with search library - int linker_exit_code = t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry entry.obj weak.obj"); - if (linker_exit_code != LNK_Error_UnresolvedSymbol) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_undef_weak_search_alias(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 weak_obj; - { - U8 weak_payload[] = { 0xDE, 0xAD, 0xBE, 0xEF }; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *weak_sect = t_push_data_section(obj_writer, str8_array_fixed(weak_payload)); - COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("ptr")); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("foo"), COFF_WeakExt_SearchAlias, tag); - weak_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 ptr_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("entry")); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("ptr"), COFF_WeakExt_SearchAlias, tag); - ptr_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 undef_obj; - { - U8 undef_obj_payload[] = { 0x00, 0x00, 0x00, 0x00 }; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *undef_sect = t_push_data_section(obj_writer, str8_array_fixed(undef_obj_payload)); - COFF_ObjSymbol *undef_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); - coff_obj_writer_section_push_reloc(obj_writer, undef_sect, 0, undef_symbol, COFF_Reloc_X64_Addr32Nb); - undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - U8 entry_payload[] = {0xC3}; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("weak.obj"), weak_obj)) { goto exit; } - if (!t_write_file(str8_lit("ptr.obj"), ptr_obj)) { goto exit; } - if (!t_write_file(str8_lit("undef.obj"), undef_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe weak.obj entry.obj ptr.obj undef.obj"); - if (linker_exit_code != 0) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_cycle(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - String8 ab_obj_name = str8_lit("ab.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *b = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("B")); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("A"), COFF_WeakExt_SearchAlias, b); - String8 ab_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(ab_obj_name, ab_obj)) { - goto exit; - } - } - - String8 ba_obj_name = str8_lit("ba.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *a = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("A")); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("B"), COFF_WeakExt_SearchAlias, a); - String8 ba_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(ba_obj_name, ba_obj)) { - goto exit; - } - } - - String8 entry_obj_name = str8_lit("entry.obj"); - U8 entry_payload[] = { 0xC3 }; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { - goto exit; - } - } - - U64 time_out = os_now_microseconds() + 3 * 1000 * 1000; // give a generous 3 seconds - int linker_exit_code = t_invoke_linker_with_time_outf(time_out, "/subsystem:console /entry:my_entry %S %S %S", entry_obj_name, ab_obj_name, ba_obj_name); - if (linker_exit_code != T_LINKER_TIME_OUT_EXIT_CODE) { - if (t_ident_linker() == T_Linker_MSVC) { - if (linker_exit_code == T_MsvcLinkExitCode_UnresolvedExternals) { - result = T_Result_Pass; - } - } else { - result = T_Result_Pass; - } - } - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_weak_tag(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - U32 weak_tag_expected_value = 0x12345678; - String8 weak_tag_obj_name = str8_lit("weak_tag.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *tag_symbol = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("abs"), weak_tag_expected_value, COFF_SymStorageClass_Static); - COFF_ObjSymbol *weak_first = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("strong_first"), COFF_WeakExt_SearchAlias, tag_symbol); - COFF_ObjSymbol *weak_second = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("strong_second"), COFF_WeakExt_SearchAlias, weak_first); - - U8 sect_data[4] = {0}; - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(sect_data)); - coff_obj_writer_section_push_reloc(obj_writer, sect, 0, weak_second, COFF_Reloc_X64_Addr32); - - String8 weak_tag_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(weak_tag_obj_name, weak_tag_obj)) { goto exit; } - } - - String8 entry_name = str8_lit("my_entry"); - U8 entry_text[] = { 0xC3 }; - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe %S %S", weak_tag_obj_name, entry_obj_name); - if (linker_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *data_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - String8 data = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize)); - if (!data_section) { goto exit; } - if (data_section->vsize != 4) { goto exit; } - if (!str8_match(data, str8_struct(&weak_tag_expected_value), 0)) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal String8 -t_make_sec_defn_obj(Arena *arena, String8 payload) -{ - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *mysect_section = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes, payload); - coff_obj_writer_push_symbol_secdef(obj_writer, mysect_section, COFF_ComdatSelect_Null); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - return obj; -} - -internal T_Result -t_undef_section(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 main_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - U8 data[] = { 0, 0, 0, 0 }; - COFF_ObjSection *data_section = t_push_data_section(obj_writer, str8_array_fixed(data)); - COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".mysect"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead); - coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr32Nb); - - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_section = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_section); - - main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - - coff_obj_writer_release(&obj_writer); - } - - U8 payload[] = { 1, 2, 3 }; - String8 sec_defn_obj = t_make_sec_defn_obj(scratch.arena, str8_array_fixed(payload)); - - t_write_file(str8_lit("main.obj"), main_obj); - t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj); - - int linker_exit_code = t_invoke_linker(str8_lit("/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj")); - if (linker_exit_code == 0) { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeader *data_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - COFF_SectionHeader *mysect_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".mysect")); - if (data_section && mysect_section) { - if (data_section->vsize == 4 && mysect_section->vsize == 3) { - String8 addr32nb = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize)); - String8 expected_voff = str8_struct(&mysect_section->voff); - if (str8_match(addr32nb, expected_voff, 0)) { - result = T_Result_Pass; - } - } - } - } - - scratch_end(scratch); - return result; -} - -internal T_Result -t_sect_symbol(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - String8 sect_payload = str8_lit("hello, world"); - String8 sect_obj_name = str8_lit("sect.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect$1"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, sect_payload); - coff_obj_writer_push_directive(obj_writer, str8_lit("/merge:.mysect=.data")); - String8 sect_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(sect_obj_name, sect_obj)) { - goto exit; - } - } - - String8 main_obj_name = str8_lit("main.obj"); - { - U8 data[8] = {0}; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(data)); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".mysect$2222"), PE_DATA_SECTION_FLAGS); - coff_obj_writer_section_push_reloc_addr(obj_writer, sect, 0, symbol); - - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - - String8 main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - - if (!t_write_file(main_obj_name, main_obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sect.obj"); - - if (linker_exit_code != 0) { - goto exit; - } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - - if (!sect) { - goto exit; - } - - String8 sect_data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - - String8 addr_data = str8_substr(sect_data, rng_1u64(0, sizeof(U64))); - if (addr_data.size != sizeof(U64)) { - goto exit; - } - U64 addr = *(U64 *)addr_data.str; - if (addr - (pe.image_base + sect->voff) != 8) { - goto exit; - } - - String8 payload_got = str8_substr(sect_data, rng_1u64(8, sect_data.size)); - if (!str8_match(payload_got, sect_payload, 0)) { - goto exit; - } - - result = T_Result_Pass; - - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_undef_reloc_section(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 main_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_section = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *my_entry_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_section); - - U8 data[8] = { 0 }; - COFF_ObjSection *data_section = t_push_data_section(obj_writer, str8_array_fixed(data)); - COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".reloc"), PE_RELOC_SECTION_FLAGS); - coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr64); - - main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - - coff_obj_writer_release(&obj_writer); - } - - U8 payload[] = { 1, 2, 3 }; - String8 sec_defn_obj = t_make_sec_defn_obj(scratch.arena, str8_array_fixed(payload)); - - t_write_file(str8_lit("main.obj"), main_obj); - t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj); - - int linker_exit_code = t_invoke_linker(str8_lit("/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj")); - if (t_ident_linker() == T_Linker_RAD) { - if (linker_exit_code != LNK_Error_SectRefsDiscardedMemory) { - goto exit; - } - } else if (linker_exit_code == 0) { - goto exit; - } - - result = T_Result_Pass; - - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_find_merged_pdata(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - U8 foobar_payload[] = { - 0x40, 0x57, 0x48, 0x81, 0xEC, 0x00, 0x02, 0x00, 0x00, 0x48, 0x8B, 0x05, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x33, 0xC4, 0x48, 0x89, 0x84, 0x24, 0xF0, 0x01, 0x00, 0x00, 0x48, 0x8D, 0x04, 0x24, 0x48, - 0x8B, 0xF8, 0x33, 0xC0, 0xB9, 0xEC, 0x01, 0x00, 0x00, 0xF3, 0xAA, 0xB8, 0x04, 0x00, 0x00, 0x00, - 0x48, 0x6B, 0xC0, 0x02, 0x8B, 0x04, 0x04, 0x48, 0x8B, 0x8C, 0x24, 0xF0, 0x01, 0x00, 0x00, 0x48, - 0x33, 0xCC, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x48, 0x81, 0xC4, 0x00, 0x02, 0x00, 0x00, 0x5F, 0xC3, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, - 0x48, 0x83, 0xEC, 0x28, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x28, 0xC3 - }; - U8 xdata_payload[] = { - 0x19, 0x1B, 0x03, 0x00, 0x09, 0x01, 0x40, 0x00, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xF0, 0x01, 0x00, 0x00, 0x01, 0x04, 0x01, 0x00, 0x04, 0x42, 0x00, 0x00 - }; - PE_IntelPdata intel_pdata = {0}; - U8 text_payload[] = { 0xC3 }; - - String8 main_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *xdata = coff_obj_writer_push_section(obj_writer, str8_lit(".xdata"), COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_Align4Bytes, str8_array_fixed(xdata_payload)); - COFF_ObjSection *pdata = coff_obj_writer_push_section(obj_writer, str8_lit(".pdata"), COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_Align4Bytes, str8_struct(&intel_pdata)); - COFF_ObjSection *foobar = coff_obj_writer_push_section(obj_writer, str8_lit(".foobar"), COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode|COFF_SectionFlag_Align1Bytes, str8_array_fixed(foobar_payload)); - COFF_ObjSection *text = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode|COFF_SectionFlag_Align1Bytes, str8_array_fixed(text_payload)); - - COFF_ObjSymbol *foobar_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("foobar"), 0, foobar); - - coff_obj_writer_push_symbol_secdef(obj_writer, xdata, COFF_ComdatSelect_Null); - COFF_ObjSymbol *unwind_foobar = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("$unwind$foobar"), 0, xdata); - - coff_obj_writer_push_symbol_secdef(obj_writer, pdata, COFF_ComdatSelect_Null); - coff_obj_writer_push_symbol_static(obj_writer, str8_lit("$pdata$foobar"), 0, pdata); - - coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_unwind_info), unwind_foobar, COFF_Reloc_X64_Addr32Nb); - coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_first), foobar_symbol, COFF_Reloc_X64_Addr32Nb); - coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_one_past_last), foobar_symbol, COFF_Reloc_X64_Addr32Nb); - - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text); - main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - t_write_file(str8_lit("main.obj"), main_obj); - - int linker_exit_code = t_invoke_linker(str8_lit("/subsystem:console /entry:my_entry /out:a.exe main.obj /merge:.pdata=.rdata")); - if (linker_exit_code == 0) { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - if (dim_1u64(pe.data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS]) == 0xC) { - result = T_Result_Pass; - } - } - - scratch_end(scratch); - return result; -} - -internal T_Result -t_section_sort(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - String8 data_obj_name = str8_lit("data.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - COFF_SectionFlags data_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes; - coff_obj_writer_push_section(obj_writer, str8_lit(".data$z"), data_flags, str8_lit("five")); - coff_obj_writer_push_section(obj_writer, str8_lit(".data$a"), data_flags, str8_lit("three")); - coff_obj_writer_push_section(obj_writer, str8_lit(".data$bbbbb"), data_flags, str8_lit("four")); - coff_obj_writer_push_section(obj_writer, str8_lit(".data$"), data_flags, str8_lit("two")); - coff_obj_writer_push_section(obj_writer, str8_lit(".data"), data_flags, str8_lit("one")); - - String8 data_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(data_obj_name, data_obj)) { - goto exit; - } - } - - String8 entry_obj_name = str8_lit("entry.obj"); - U8 entry_text[] = { 0xC3 }; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe data.obj entry.obj"); - if (linker_exit_code != 0) { - goto exit; - } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeader *data_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - if (!data_section) { - goto exit; - } - - String8 data = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize)); - String8 expected_data = str8_lit("onetwothreefourfive"); - if (!str8_match(data, expected_data, 0)) { - goto exit; - } - - result = T_Result_Pass; - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_flag_conf(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - COFF_SectionFlags my_sect0_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute; - COFF_SectionFlags my_sect1_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemWrite; - String8 conf_obj_name = str8_lit("conf.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *a_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), my_sect0_flags, str8_lit("one")); - COFF_ObjSection *b_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), my_sect1_flags, str8_lit("two")); - String8 conf_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(conf_obj_name, conf_obj)) { - goto exit; - } - } - - U8 entry_text[] = { 0xC3 }; - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe conf.obj entry.obj"); - if (linker_exit_code != 0) { - goto exit; - } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeaderArray my_sects = t_coff_section_header_array_from_name(scratch.arena, string_table, section_table, pe.section_count, str8_lit(".mysect")); - - if (my_sects.count != 2) { - goto exit; - } - - COFF_SectionHeader *my_sect0 = &my_sects.v[0]; - COFF_SectionHeader *my_sect1 = &my_sects.v[1]; - if (my_sect0->flags != my_sect0_flags) { - goto exit; - } - if (my_sect1->flags != my_sect1_flags) { - goto exit; - } - - result = T_Result_Pass; - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_invalid_bss(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - COFF_SectionFlags bss_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead; - String8 bss_obj_name = str8_lit("bss.obj"); - String8 bss_data = str8_lit("Hello, World"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(obj_writer, str8_lit(".bss"), bss_flags, bss_data); - String8 bss_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(bss_obj_name, bss_obj)) { - goto exit; - } - } - - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe bss.obj entry.obj"); - if (linker_exit_code != 0) { - goto exit; - } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeader *bss_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".bss")); - if (bss_sect == 0) { - goto exit; - } - if (bss_sect->vsize != 0xC) { - goto exit; - } - if (bss_sect->flags != bss_flags) { - goto exit; - } - String8 data = str8_substr(exe, rng_1u64(bss_sect->foff, bss_sect->foff + bss_sect->vsize)); - if (!str8_match(data, bss_data, 0)) { - goto exit; - } - - result = T_Result_Pass; - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_common_block(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - String8 a_obj_name = str8_lit("a.obj"); - U8 a_data[6] = {0}; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit("A"), 3); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(a_data)); - data_sect->flags |= COFF_SectionFlag_Align1Bytes; - coff_obj_writer_push_section(obj_writer, str8_lit(".bss"), PE_BSS_SECTION_FLAGS, str8(0, 1)); // shift common block's initial position - coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr32); - String8 a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(a_obj_name, a_obj)) { goto exit; } - } - - String8 b_obj_name = str8_lit("b.obj"); - U8 b_data[9] = { 0 }; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(b_data)); - data_sect->flags |= COFF_SectionFlag_Align1Bytes; - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit("B"), 6); - coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr64); - String8 b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(b_obj_name, b_obj)) { goto exit; } - } - - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /fixed /largeaddressaware:no /merge:.bss=.comm a.obj b.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - COFF_SectionHeader *comm_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".comm")); - COFF_SectionHeader *data_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - if (comm_sect == 0) { goto exit; } - if (data_sect == 0) { goto exit; } - - // blocks must be sorted in descending order to reduce alignment padding - if (comm_sect->vsize != 0x13) { goto exit; } - - // ensure linker correctly patched addresses for symbols pointing into common block - String8 data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->fsize)); - U32 *a_addr = (U32 *)data.str; - U64 *b_addr = (U64 *)(data.str + sizeof(a_data)); - if (*a_addr != (pe.image_base + comm_sect->voff + 0x10)) { goto exit; } - if (*b_addr != (pe.image_base + comm_sect->voff + 0x8)) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_base_relocs(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - // main.obj - String8 entry_name = str8_lit("my_entry"); - U64 mov_func_name64 = 2; - U64 mov_func_name32 = 16; - U8 main_text[] = { - 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // mov rax, func_name - 0xff, 0xd0, // call rax - 0x48, 0x31, 0xc0, // xor rax, rax - 0xb8, 0x00, 0x00, 0x00, 0x00, // mov eax, func_name - 0xff, 0xd0, // call rax - 0xc3 // ret - }; - - // func.obj - String8 func_name = str8_lit("foo"); - U8 func_text[] = { 0xc3 }; - - String8 main_obj_name = str8_lit("main.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(main_text)); - COFF_ObjSymbol *func_undef = coff_obj_writer_push_symbol_undef(obj_writer, func_name); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, mov_func_name64, func_undef, COFF_Reloc_X64_Addr64); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, mov_func_name32, func_undef, COFF_Reloc_X64_Addr32); - - // linker must not produce base relocations for absolute symbol - U8 data[4] = {0}; - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(data)); - COFF_ObjSymbol *abs_symbol = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("abs"), 0x12345678, COFF_SymStorageClass_Static); - coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, abs_symbol, COFF_Reloc_X64_Addr32); - - coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect); - String8 main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(main_obj_name, main_obj)) { - goto exit; - } - } - - String8 func_obj_name = str8_lit("func.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(func_text)); - coff_obj_writer_push_symbol_extern(obj_writer, func_name, 0, text_sect); - String8 func_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(func_obj_name, func_obj)) { - goto exit; - } - } - - String8 out_name = str8_lit("a.exe"); - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe main.obj func.obj"); - if (linker_exit_code != 0) { - goto exit; - } - - // it is illegal to merge .reloc with other sections - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe /merge:.reloc=.rdata main.obj func.obj"); - if (t_ident_linker() == T_Linker_RAD) { - if (linker_exit_code != LNK_Error_IllegalSectionMerge) { - goto exit; - } - } else { - if (linker_exit_code == 0) { - goto exit; - } - } - - // the other way around is illegal too - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe /merge:.rdata=.reloc main.obj func.obj"); - if (t_ident_linker() == T_Linker_RAD) { - if (linker_exit_code != LNK_Error_IllegalSectionMerge) { - goto exit; - } - } else { - if (linker_exit_code == 0) { - goto exit; - } - } - - result = T_Result_Pass; - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_simple_lib_test(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 test_payload = str8_lit("The quick brown fox jumps over the lazy dog"); - String8 test_obj = {0}; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_Unknown); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8(test_payload.str, test_payload.size+1)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, data_sect); - test_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 test_lib_name = str8_lit("test.lib"); - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("test.obj"), test_obj); - String8 test_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - if (!t_write_file(test_lib_name, test_lib)) { - goto exit; - } - } - - U8 entry_text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0xC3 - }; - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("test")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, test_symbol, COFF_Reloc_X64_Addr32Nb); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 7, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(entry_obj_name, entry_obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj test.lib"); - if (linker_exit_code != 0) { - goto exit; - } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - COFF_SectionHeader *data_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->fsize)); - String8 data_data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->fsize)); - - // was test payload linked? - String8 data_string = str8_cstring_capped(data_data.str, data_data.str + data_data.size); - if (!str8_match(data_string, test_payload, 0)) { - goto exit; - } - - // do we have enough bytes to read text? - if (text_data.size < sizeof(entry_text)) { - goto exit; - } - - // linker must pull-in test.obj and patch relocation for "test" symbol - U32 *data_addr32nb = (U32 *)(text_data.str+3); - if (*data_addr32nb != data_sect->voff) { - goto exit; - } - - result = T_Result_Pass; - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_import_export(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - { - String8 export_obj_name = str8_lit("export.obj"); - String8 export_obj_payload = str8_lit("test"); - U8 export_text[] = { 0xC3 }; - - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, export_obj_payload); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, data_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord"), 0, data_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord2"), 0, data_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord3"), 0, data_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord4"), 0, data_sect); - //coff_obj_writer_push_directive(obj_writer, str8_lit("/export:foo=foo")); - //coff_obj_writer_push_directive(obj_writer, str8_lit("/export:bar=foo")); - //coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord,@5")); - //coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord2,@6,DATA")); - //coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord3,@7,NONAME,PRIVATE")); - //coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord4,@8,NONAME,DATA")); - //coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baz=baz.qwe")); - //coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baf=baz.#1")); - String8 export_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(export_obj_name, export_obj)) { - goto exit; - } - } - - { - String8 import_obj_name = str8_lit("import.obj"); - U8 import_payload[1024] = {0}; - - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(import_payload)); - - char *import_symbols[] = { - "__imp_foo", - "__imp_bar", - "__imp_baz", - "__imp_baf", - "__imp_ord", - //"__imp_ord2", - //"__imp_ord4", - "bar", - //"baf", - //"baz", - "foo", - "ord", - }; - - for (U64 i = 0; i < ArrayCount(import_symbols); ++i) { - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_cstring(import_symbols[i])); - coff_obj_writer_section_push_reloc_voff(obj_writer, data_sect, i * 4, symbol); - } - - String8 import_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(import_obj_name, import_obj)) { - goto exit; - } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *s1 = coff_obj_writer_push_section(obj_writer, str8_lit(".s1"), PE_DATA_SECTION_FLAGS, str8_lit("s1")); - COFF_ObjSection *s2 = coff_obj_writer_push_section(obj_writer, str8_lit(".s2"), PE_DATA_SECTION_FLAGS, str8_lit("s2")); - COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed((U8[]){ 0xC3 })); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("_DllMainCRTStartup"), 0, text_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("s1"), 0, s1); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("s2"), 0, s2); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("baz.obj"), obj)) { - goto exit; - } - } - - t_write_entry_obj(); - - // - // link export.dll - // - int lib_link_exit_code = t_invoke_linkerf("/dll /out:export.dll libcmt.lib export.obj"); - if (lib_link_exit_code != 0) { - goto exit; - } - - // - // link baz.dll - // - int baz_link_exit_code = t_invoke_linkerf("/dll /out:baz.dll /export:s1,@1,NONAME /export:qwe=s2 baz.obj"); - if (baz_link_exit_code != 0) { - goto exit; - } - - // - // check export.dll export table - // - if (0) { - String8 dll = t_read_file(scratch.arena, str8_lit("export.dll")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, dll); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(dll, pe.section_table_range).str; - String8 string_table = str8_substr(dll, pe.string_table_range); - PE_ParsedExportTable export_table = pe_exports_from_data(scratch.arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]); - - if (export_table.export_count != 6) { - goto exit; - } - - { - String8 expected_symbols[] = { - str8_lit_comp("foo"), - str8_lit_comp("bar"), - //str8_lit_comp("baz"), - //str8_lit_comp("baf"), - str8_lit_comp("ord"), - str8_lit_comp("ord2") - }; - U64 match_count = 0; - for (U64 i = 0; i < export_table.export_count; i += 1) { - for (U64 k = 0; k < ArrayCount(expected_symbols); k += 1) { - if (str8_match(export_table.exports[i].name, expected_symbols[k], 0)) { - match_count += 1; - } - } - } - if (match_count != ArrayCount(expected_symbols)) { - goto exit; - } - } - - if (0) { - String8 expected_forwarders[] = { - str8_lit_comp("baz.qwe"), - str8_lit_comp("baz.#1"), - }; - U64 match_count = 0; - for (U64 i = 0; i < export_table.export_count; i += 1) { - for (U64 k = 0; k < ArrayCount(expected_forwarders); k += 1) { - if (str8_match(export_table.exports[i].forwarder, expected_forwarders[k], 0)) { - match_count += 1; - } - } - } - if (match_count != ArrayCount(expected_forwarders)) { - goto exit; - } - } - } - - #if OS_WINDOWS - BOOL is_dir_set = SetDllDirectoryA((LPCSTR)g_wdir.str); - AssertAlways(is_dir_set); - - HANDLE export_dll = LoadLibrary("export.dll"); - DWORD last_error = GetLastError(); - if (export_dll == 0) { - goto exit; - } - - char *export_dll_procs[] = { "foo", "bar", "baz", "baf" }; - for (U64 i = 0; i < ArrayCount(export_dll_procs); ++i) { - void *proc = GetProcAddress(export_dll, export_dll_procs[i]); - if (proc == 0) { - goto exit; - } - } - - U16 export_dll_ordinals[] = { 5 }; - for (U64 i = 0; i < ArrayCount(export_dll_ordinals); ++i) { - void *proc = GetProcAddress(export_dll, MAKEINTRESOURCE(export_dll_ordinals[i])); - if (proc == 0) { - goto exit; - } - } - #endif - - int import_link_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /delayload:export.dll /export:entry kernel32.Lib delayimp.lib libcmt.lib export.lib import.obj entry.obj"); - if (import_link_exit_code != 0) { - goto exit; - } - - // TODO: check import table - - result = T_Result_Pass; - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_image_base(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - String8 obj_name = str8_lit("image_base.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00, // lea rcx, [__ImageBase] - 0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // mov rax, __ImageBase - 0xB8, 0x00, 0x00, 0x00, 0x00, // mov eax, __ImageBase - 0xC3 // ret - }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - COFF_ObjSymbol *image_base_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__ImageBase")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, image_base_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 9, image_base_symbol, COFF_Reloc_X64_Addr64); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 18, image_base_symbol, COFF_Reloc_X64_Addr32Nb); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(obj_name, obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /base:0x2000000140000000 /out:a.exe image_base.obj"); - - if (linker_exit_code != 0) { - goto exit; - } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - - if (!text_section) { - goto exit; - } - - U8 expected_text[] = { - 0x48, 0x8D, 0x0D, 0xF9, 0xEF, 0xFF, 0xFF, - 0x48, 0xB8, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x20, - 0xB8, 0x00, 0x00, 0x00, 0x00, - 0xC3 - }; - String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + sizeof(expected_text))); - if (!str8_match(text_data, str8_array_fixed(expected_text), 0)) { - goto exit; - } - - result = T_Result_Pass; - - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_any(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test$mn"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("1")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any); - COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - test->type.u.msb = COFF_SymDType_Func; - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("1.obj"), obj)) { - goto exit; - } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test$mn"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("2")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any); - COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("2.obj"), obj)) { - goto exit; - } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - { - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:1.exe 1.obj 2.obj entry.obj"); - if (linker_exit_code != 0) { - goto exit; - } - String8 exe = t_read_file(scratch.arena, str8_lit("1.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); - String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(data, str8_lit("1"), 0)) { - goto exit; - } - } - - { - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:2.exe 2.obj 1.obj entry.obj"); - if (linker_exit_code != 0) { - goto exit; - } - String8 exe = t_read_file(scratch.arena, str8_lit("2.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); - String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(data, str8_lit("2"), 0)) { - goto exit; - } - } - - result = T_Result_Pass; - - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_no_duplicates(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 test_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, test_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("a"), 0, test_sect); - test_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("a")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - if (!t_write_file(str8_lit("a.obj"), test_obj)) { goto exit; } - if (!t_write_file(str8_lit("b.obj"), test_obj)) { goto exit; } - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - - int duplicates_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); - if (duplicates_exit_code == 0) { goto exit; } - if (t_ident_linker() == T_Linker_RAD && duplicates_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; } - - int good_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe a.obj entry.obj"); - if (good_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); - if (!sect) { goto exit; } - String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(data, str8_lit("a"), 0)) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_same_size(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("a.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("b")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("b.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".c"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("cc")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("c.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int same_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); - if (same_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); - if (sect == 0) { goto exit; } - String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(data, str8_lit("a"), 0)) { goto exit; } - } - - int not_same_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe a.obj b.obj c.obj entry.obj"); - if (not_same_exit_code == 0) { goto exit; } - if (t_ident_linker() == T_Linker_RAD && not_same_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_exact_match(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("a.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a2"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("a2.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("b")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("b.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int not_exact_match = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj"); - if (not_exact_match == 0) { goto exit; } - - int exact_match = t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe entry.obj a2.obj a.obj"); - if (exact_match != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a2")); - if (sect == 0) { goto exit; } - String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(data, str8_lit("a"), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_largest(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("a.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bb")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("b.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".c"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("c")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("c.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int largest_exit_code = t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry entry.obj a.obj b.obj"); - if (largest_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *discard_sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); - if (discard_sect != 0) { goto exit; } - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".b")); - if (sect == 0) { goto exit; } - String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(data, str8_lit("bb"), 0)) { goto exit; } - } - - int same_size_exit_code = t_invoke_linkerf("/subsystem:console /out:b.exe /entry:entry entry.obj c.obj a.obj"); - if (same_size_exit_code != 0) { goto exit; } - - { - String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".c")); - if (sect == 0) { goto exit; } - String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - if (!str8_match(data, str8_lit("c"), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_associative(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit("a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit("aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("aa")); - coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); - coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("a.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *bb = coff_obj_writer_push_section(obj_writer, str8_lit("bb"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bb")); - COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit("b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("b")); - COFF_ObjSection *bbb = coff_obj_writer_push_section(obj_writer, str8_lit("bbb"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bbb")); - coff_obj_writer_push_symbol_secdef(obj_writer, bb, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_associative(obj_writer, b, bb); - coff_obj_writer_push_symbol_associative(obj_writer, bbb, bb); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, bb); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("b.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj"); - if (linker_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeader *a = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("a")); - COFF_SectionHeader *aa = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("aa")); - COFF_SectionHeader *b = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("b")); - COFF_SectionHeader *bb = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("bb")); - COFF_SectionHeader *bbb = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("bbb")); - if (a != 0) { goto exit; } - if (aa != 0) { goto exit; } - if (b == 0) { goto exit; } - if (bb == 0) { goto exit; } - if (bbb == 0) { goto exit; } - String8 b_data = str8_substr(exe, rng_1u64(b->foff, b->foff + b->vsize)); - String8 bb_data = str8_substr(exe, rng_1u64(bb->foff, bb->foff + bb->vsize)); - String8 bbb_data = str8_substr(exe, rng_1u64(bbb->foff, bbb->foff + bbb->vsize)); - if (!str8_match(b_data, str8_lit("b"), 0)) { goto exit; } - if (!str8_match(bb_data, str8_lit("bb"), 0)) { goto exit; } - if (!str8_match(bbb_data, str8_lit("bbb"), 0)) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_associative_loop(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *aaaa = coff_obj_writer_push_section(obj_writer, str8_lit(".aaaa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aaaa")); - COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(".aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aa")); - COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); - COFF_ObjSection *aaa = coff_obj_writer_push_section(obj_writer, str8_lit(".aaa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aaa")); - coff_obj_writer_push_symbol_associative(obj_writer, aaa, aa); - coff_obj_writer_push_symbol_associative(obj_writer, aaaa, aaa); - coff_obj_writer_push_symbol_associative(obj_writer, a, aa); - coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("loop.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe loop.obj entry.obj"); - if (exit_code == 0) { goto exit; } - if (t_ident_linker() == T_Linker_RAD && exit_code != LNK_Error_AssociativeLoop) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_associative_non_comdat(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); - COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS, str8_lit("b")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); - coff_obj_writer_push_symbol_associative(obj_writer, b, a); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("test.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj test.obj"); - if (exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *a = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); - COFF_SectionHeader *b = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".b")); - if (a == 0) { goto exit; } - if (b == 0) { goto exit; } - String8 a_data = str8_substr(exe, rng_1u64(a->foff, a->foff + a->vsize)); - String8 b_data = str8_substr(exe, rng_1u64(b->foff, b->foff + b->vsize)); - if (!str8_match(a_data, str8_lit("a"), 0)) { goto exit; } - if (!str8_match(b_data, str8_lit("b"), 0)) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_associative_out_of_bounds(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(".aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("aa")); - coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Any); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); - coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - { - COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj); - String8 string_table = str8_substr(obj, header.string_table_range); - String8 symbol_table = str8_substr(obj, header.symbol_table_range); - COFF_ParsedSymbol symbol = coff_parse_symbol(header, string_table, symbol_table, 3); - AssertAlways(str8_match(symbol.name, str8_lit(".aa"), 0)); - AssertAlways(symbol.aux_symbol_count == 1); - COFF_Symbol16 *symbol16 = symbol.raw_symbol; - COFF_SymbolSecDef *secdef = (COFF_SymbolSecDef *)(symbol16 + 1); - secdef->number_lo = 321; - } - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("bad.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj"); - if (linker_exit_code == 0) { goto exit; } - if (t_ident_linker() == T_Linker_RAD && linker_exit_code != LNK_Error_IllData) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_comdat_with_offset(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 a[] = "1Hello, World!"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("a.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 a[] = "Hello, World!"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("b.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_reloc_against_removed_comdat(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 a[] = "1Hello, World!"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("a.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 a[] = "H"; - COFF_ObjSection *comdat_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); - coff_obj_writer_push_symbol_secdef(obj_writer, comdat_sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, comdat_sect); - COFF_ObjSymbol *static_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("STATIC"), 2, comdat_sect); - - U8 rdata[4] = {0}; - COFF_ObjSection *regular_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS, str8_array_fixed(rdata)); - coff_obj_writer_section_push_reloc_voff(obj_writer, regular_sect, 0, static_symbol); - - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("b.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj c.obj entry.obj"); - if (linker_exit_code != LNK_Error_RelocationAgainstRemovedSection) { goto exit; } - -exit:; - result = T_Result_Pass; - scratch_end(scratch); - return result; -} - -internal T_Result -t_sect_align(void) -{ - Temp scratch = scratch_begin(0,0); - - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - COFF_ObjSection *sect_align_shift = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("q")); - COFF_ObjSection *sect_align_none = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("abc")); - COFF_ObjSection *sect_align_1 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_lit("wr")); - COFF_ObjSection *sect_align_2 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, str8_lit("e")); - COFF_ObjSection *sect_align_4 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_lit("ttttt")); - COFF_ObjSection *sect_align_8 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align8Bytes, str8_lit("g")); - COFF_ObjSection *sect_align_16 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align16Bytes, str8_lit("o")); - COFF_ObjSection *sect_align_32 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align32Bytes, str8_lit("p")); - COFF_ObjSection *sect_align_64 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align64Bytes, str8_lit("f")); - COFF_ObjSection *sect_align_128 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align128Bytes, str8_lit("x")); - COFF_ObjSection *sect_align_256 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align256Bytes, str8_lit("c")); - COFF_ObjSection *sect_align_512 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align512Bytes, str8_lit("v")); - COFF_ObjSection *sect_align_1024 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1024Bytes, str8_lit("b")); - COFF_ObjSection *sect_align_2048 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align2048Bytes, str8_lit("n")); - COFF_ObjSection *sect_align_4096 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align4096Bytes, str8_lit("m")); - COFF_ObjSection *sect_align_8192 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align8192Bytes, str8_lit("z")); - - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("test.obj"), obj)) { - goto exit; - } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /align:8192 test.obj"); - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - COFF_SectionHeader *sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".a")); - if (!sect) { - goto exit; - } - String8 sect_data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); - - String8 shift = str8_substr(sect_data, rng_1u64(0, 1)); - if (!str8_match(shift, str8_lit("q"), 0)) { - goto exit; - } - String8 a_none = str8_substr(sect_data, rng_1u64(16, 16 + 3)); - if (!str8_match(a_none, str8_lit("abc"), 0)) { - goto exit; - } - String8 a_1 = str8_substr(sect_data, rng_1u64(19, 21)); - if (!str8_match(a_1, str8_lit("wr"), 0)) { - goto exit; - } - String8 a_2 = str8_substr(sect_data, rng_1u64(22, 23)); - if (!str8_match(a_2, str8_lit("e"), 0)) { - goto exit; - } - String8 a_4 = str8_substr(sect_data, rng_1u64(24, 29)); - if (!str8_match(a_4, str8_lit("ttttt"), 0)) { - goto exit; - } - String8 a_8 = str8_substr(sect_data, rng_1u64(32, 33)); - if (!str8_match(a_8, str8_lit("g"), 0)) { - goto exit; - } - String8 a_16 = str8_substr(sect_data, rng_1u64(48, 49)); - if (!str8_match(a_16, str8_lit("o"), 0)) { - goto exit; - } - String8 a_32 = str8_substr(sect_data, rng_1u64(64, 65)); - if (!str8_match(a_32, str8_lit("p"), 0)) { - goto exit; - } - String8 a_64 = str8_substr(sect_data, rng_1u64(128, 129)); - if (!str8_match(a_64, str8_lit("f"), 0)) { - goto exit; - } - String8 a_128 = str8_substr(sect_data, rng_1u64(256, 257)); - if (!str8_match(a_128, str8_lit("x"), 0)) { - goto exit; - } - String8 a_256 = str8_substr(sect_data, rng_1u64(512, 513)); - if (!str8_match(a_256, str8_lit("c"), 0)) { - goto exit; - } - String8 a_512 = str8_substr(sect_data, rng_1u64(1024, 1025)); - if (!str8_match(a_512, str8_lit("v"), 0)) { - goto exit; - } - String8 a_1024 = str8_substr(sect_data, rng_1u64(2048, 2049)); - if (!str8_match(a_1024, str8_lit("b"), 0)) { - goto exit; - } - String8 a_2048 = str8_substr(sect_data, rng_1u64(4096, 4097)); - if (!str8_match(a_2048, str8_lit("n"), 0)) { - goto exit; - } - String8 a_4096 = str8_substr(sect_data, rng_1u64(8192, 8193)); - if (!str8_match(a_4096, str8_lit("m"), 0)) { - goto exit; - } - String8 a_8192 = str8_substr(sect_data, rng_1u64(16384, 16385)); - if (!str8_match(a_8192, str8_lit("z"), 0)) { - goto exit; - } - - result = T_Result_Pass; - -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_alt_name(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("test.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("foo")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("foo.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { goto exit; } - } - - int linker_exit_code; - - // basic alternate name test - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:foo=test test.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - // linker should not chase alt name links - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe /alternatename:foo=bar /alternatename:bar=test test.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - // alt name conflict - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:c.exe /alternatename:foo=test /alternatename:foo=qwe test.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - // syntax error - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:d.exe /alternatename:foo foo.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - // syntax error - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:e.exe /alternatename:foo-oof foo.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - // syntax error - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:foo=test=bar foo.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - // syntax error - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:foo= foo.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - // syntax error - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:= foo.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - // syntax error - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename: foo.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - // TODO: check that RAD Linker prints these warnings - - // warn about alt name to self alt name? - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:f.exe /alternatename:foo=foo foo.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - // warn about alt name to unknown symbol? - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:g.exe /alternatename:qwe=ewq foo.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_include(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("foo")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("include.obj"), obj)) { goto exit; } - - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("include.obj"), obj); - String8 lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - if (!t_write_file(str8_lit("include.lib"), lib)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { goto exit; } - } - - int linker_exit_code; - - // simple include test - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /include:foo entry.obj include.lib"); - if (linker_exit_code != 0) { goto exit; } - - // validate that linker pulled-in include.obj - { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *foo_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - if (foo_sect == 0) { goto exit; } - String8 foo_data = str8_substr(exe, rng_1u64(foo_sect->foff, foo_sect->foff + foo_sect->vsize)); - if (!str8_match(foo_data, str8_lit("foo"), 0)) { goto exit; } - } - - // test unresolved include - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /include:ewq entry.obj"); - if (linker_exit_code == 0) { goto exit; } - if (t_ident_linker() == T_Linker_RAD && linker_exit_code != LNK_Error_UnresolvedSymbol) { goto exit; } - - result = T_Result_Pass; - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_communal_var_vs_regular(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_common(obj_writer, str8_lit("TEST"), 1); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("communal.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("defn.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - // linker should replace communal TEST with .data TEST - int linker_exit_code; - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe communal.obj defn.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe defn.obj communal.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - char *exes[] = { "a.exe", "b.exe" }; - for (U64 i = 0; i < ArrayCount(exes); i += 1) { - String8 exe = t_read_file(scratch.arena, str8_cstring(exes[i])); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *data_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - if (!data_sect) { goto exit; } - String8 data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->vsize)); - if (!str8_match(data, str8_lit("test"), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_communal_var_vs_regular_comdat(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_common(obj_writer, str8_lit("TEST"), 1); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("communal.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); - sect->flags |= COFF_SectionFlag_LnkCOMDAT; - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("large.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { - goto exit; - } - } - - // linker should replace communal TEST with .data TEST - int linker_exit_code; - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe communal.obj large.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe large.obj communal.obj entry.obj"); - if (linker_exit_code != 0) { goto exit; } - - char *exes[] = { "a.exe", "b.exe" }; - for (U64 i = 0; i < ArrayCount(exes); i += 1) { - String8 exe = t_read_file(scratch.arena, str8_cstring(exes[i])); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *data_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); - if (!data_sect) { goto exit; } - String8 data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->vsize)); - if (!str8_match(data, str8_lit("test"), 0)) { goto exit; } - } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_import_kernel32(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 data[] = "test"; - U8 text[] = { - 0x48, 0x83, 0xec, 0x68, // sub rsp,68h ; alloc space on stack - 0xc7, 0x44, 0x24, 0x48, 0x18, 0x00, 0x00, 0x00, // mov dword ptr [rsp+48h],18h ; SECURITY_ATTRIBUTES.nLength - 0x48, 0xc7, 0x44, 0x24, 0x50, 0x00, 0x00, 0x00, 0x00, // mov qword ptr [rsp+50h],0 ; SECURITY_ATTRIBUTES.lpSecurityDescriptor - 0xc7, 0x44, 0x24, 0x58, 0x00, 0x00, 0x00, 0x00, // mov dword ptr [rsp+58h],0 ; SECURITY_ATTRIBUTES.bInheritHandle - 0x48, 0xc7, 0x44, 0x24, 0x30, 0x00, 0x00, 0x00, 0x00, // mov qword ptr [rsp+30h],0 ; hTemplateFile - 0xc7, 0x44, 0x24, 0x28, 0x80, 0x00, 0x00, 0x00, // mov dword ptr [rsp+28h],80h ; dwFlagsAndAttributes - 0xc7, 0x44, 0x24, 0x20, 0x02, 0x00, 0x00, 0x00, // mov dword ptr [rsp+20h],2 ; dwCreationDisposition - 0x4c, 0x8d, 0x4c, 0x24, 0x48, // lea r9,[rsp+48h] ; lpSecurityAttributes - 0x45, 0x33, 0xc0, // xor r8d,r8d ; dwShareMode - 0xba, 0x00, 0x00, 0x00, 0x40, // mov edx,40000000h ; dwDesiredAccess - 0x48, 0x8d, 0x0d, 0x00, 0x00, 0x00, 0x00, // lea rcx,[test] ; lpFileName - 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, // call qword ptr [__imp_CreateFileA] ; call CreateFileA - 0x48, 0x89, 0xc1, // mov rcx,rax ; hObject - 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, // call qword ptr [__imp_CloseHandle] ; call CloseHandle - 0x33, 0xc0, // xor eax,eax ; clear result - 0x48, 0x83, 0xc4, 0x68, // add rsp,68h ; dealloc stack - 0xc3 // ret ; return - }; - COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_array_fixed(data)); - COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *data_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, data_sect); - COFF_ObjSymbol *entry_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - COFF_ObjSymbol *create_file_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_CreateFileA")); - COFF_ObjSymbol *close_handle_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_CloseHandle")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 70, data_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 76, create_file_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 85, close_handle_symbol, COFF_Reloc_X64_Rel32); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("import.obj"), obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed import.obj kernel32.lib"); - if (linker_exit_code != 0) { goto exit; } - -#if OS_WINDOWS - { - String8 test_file_path = push_str8f(scratch.arena, "%S/test", g_wdir); - os_delete_file_at_path(test_file_path); - - OS_ProcessLaunchParams launch_opts = {0}; - launch_opts.inherit_env = 0; - launch_opts.path = g_wdir; - str8_list_pushf(scratch.arena, &launch_opts.cmd_line, "%S/a.exe", g_wdir); - OS_Handle handle = os_process_launch(&launch_opts); - AssertAlways(!os_handle_match(handle, os_handle_zero())); - U64 exit_code = max_U64; - os_process_join(handle, max_U64, &exit_code); - os_process_detach(handle); - if (exit_code != 0) { goto exit; } - - if (!os_file_path_exists(test_file_path)) { goto exit; } - } -#endif - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_delay_import(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 return_0[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, 0 - 0xc3 // ret - }; - U8 return_1[] = { - 0x48, 0xC7, 0xC0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 - 0xc3 // ret - }; - U8 return_2[] = { - 0x48, 0xC7, 0xC0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 - 0xc3 // ret - }; - COFF_ObjSection *return_0_sect = t_push_text_section(obj_writer, str8_array_fixed(return_0)); - COFF_ObjSection *return_1_sect = t_push_text_section(obj_writer, str8_array_fixed(return_1)); - COFF_ObjSection *return_2_sect = t_push_text_section(obj_writer, str8_array_fixed(return_2)); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_1"), 0, return_1_sect); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_2"), 0, return_2_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("a.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 return_0[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, 0 - 0xc3 // ret - }; - U8 return_123[] = { - 0x48, 0xC7, 0xC0, 0x7B, 0x00, 0x00, 0x00, // mov rax, 123 - 0xc3 // ret - }; - U8 return_321[] = { - 0x48, 0xC7, 0xC0, 0x41, 0x01, 0x00, 0x00, // mov rax, 321 - 0xc3 // ret - }; - COFF_ObjSection *return_0_sect = t_push_text_section(obj_writer, str8_array_fixed(return_0)); - COFF_ObjSection *return_123_sect = t_push_text_section(obj_writer, str8_array_fixed(return_123)); - COFF_ObjSection *return_321_sect = t_push_text_section(obj_writer, str8_array_fixed(return_321)); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_123"), 0, return_123_sect); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_321"), 0, return_321_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("b.obj"), obj)) { goto exit; } - } - - { - U8 text[] = { - 0x56, // push rsi - 0x57, // push rdi - 0x48, 0x83, 0xEC, 0x28, // sub rsp,28h - 0xE8, 0x00, 0x00, 0x00, 0x00, // call return_1 - 0x89, 0xC6, // mov esi,eax - 0xE8, 0x00, 0x00, 0x00, 0x00, // call return_2 - 0x89, 0xC7, // mov edi,eax - 0x01, 0xF7, // add edi,esi - 0xE8, 0x00, 0x00, 0x00, 0x00, // call return_123 - 0x89, 0xC6, // mov esi,eax - 0xE8, 0x00, 0x00, 0x00, 0x00, // call return_321 - 0x01, 0xF0, // add eax,esi - 0x01, 0xF8, // add eax,edi - 0x48, 0x83, 0xC4, 0x28, // add rsp,28h - 0x5F, // pop rdi - 0x5E, // pop rsi - 0xC3, // ret - }; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - COFF_ObjSymbol *return_1_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_1")); - COFF_ObjSymbol *return_2_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_2")); - COFF_ObjSymbol *return_123_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_123")); - COFF_ObjSymbol *return_321_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_321")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 7, return_1_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 14, return_2_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 23, return_123_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 30, return_321_symbol, COFF_Reloc_X64_Rel32); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("main.obj"), obj)) { goto exit; } - } - - int linker_exit_code; - - linker_exit_code = t_invoke_linkerf("/dll /implib:a.lib /export:return_1 /export:return_2 a.obj libcmt.lib"); - if (linker_exit_code != 0) { goto exit; } - - linker_exit_code = t_invoke_linkerf("/dll /implib:b.lib /export:return_123 /export:return_321 b.obj libcmt.lib"); - if (linker_exit_code != 0) { goto exit; } - - linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed /debug:full main.obj a.lib b.lib kernel32.lib delayimp.lib libcmt.lib /delayload:a.dll /delayload:b.dll"); - if (linker_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - - PE_ParsedDelayImportTable delay_import_table = pe_delay_imports_from_data(scratch.arena, pe.is_pe32, pe.section_count, section_table, exe, pe.data_dir_franges[PE_DataDirectoryIndex_DELAY_IMPORT]); - - PE_ParsedDelayDLLImport *a_import = &delay_import_table.v[0]; - if (a_import->attributes != 1) { goto exit; } - if (!str8_match(a_import->name, str8_lit("a.dll"), 0)) { goto exit; } - if (a_import->module_handle_voff == 0) { goto exit; } - if (a_import->name_table_voff == 0) { goto exit; } - if (a_import->bound_table_voff == 0) { goto exit; } - if (a_import->unload_table_voff == 0) { goto exit; } - if (a_import->time_stamp != 0) { goto exit; } - if (a_import->bound_table_count != 2) { goto exit; } - if (a_import->unload_table_count != 2) { goto exit; } - if (a_import->import_count != 2) { goto exit; } - - PE_ParsedImport *return_1 = &a_import->imports[0]; - if (return_1->type != PE_ParsedImport_Name) { goto exit; } - if (!str8_match(return_1->u.name.string, str8_lit("return_1"), 0)) { goto exit; } - if (return_1->u.name.hint != 0) { goto exit; } - - PE_ParsedImport *return_2 = &a_import->imports[1]; - if (return_2->type != PE_ParsedImport_Name) { goto exit; } - if (!str8_match(return_2->u.name.string, str8_lit("return_2"), 0)) { goto exit; } - if (return_2->u.name.hint != 1) { goto exit; } - - PE_ParsedDelayDLLImport *b_import = &delay_import_table.v[1]; - if (b_import->attributes != 1) { goto exit; } - if (!str8_match(b_import->name, str8_lit("b.dll"), 0)) { goto exit; } - if (b_import->module_handle_voff == 0) { goto exit; } - if (b_import->name_table_voff == 0) { goto exit; } - if (b_import->bound_table_voff == 0) { goto exit; } - if (b_import->unload_table_voff == 0) { goto exit; } - if (b_import->time_stamp != 0) { goto exit; } - if (b_import->bound_table_count != 2) { goto exit; } - if (b_import->unload_table_count != 2) { goto exit; } - if (b_import->import_count != 2) { goto exit; } - - PE_ParsedImport *return_123 = &b_import->imports[0]; - if (return_123->type != PE_ParsedImport_Name) { goto exit; } - if (!str8_match(return_123->u.name.string, str8_lit("return_123"), 0)) { goto exit; } - if (return_123->u.name.hint != 0) { goto exit; } - - PE_ParsedImport *return_321 = &b_import->imports[1]; - if (return_321->type != PE_ParsedImport_Name) { goto exit; } - if (!str8_match(return_321->u.name.string, str8_lit("return_321"), 0)) { goto exit; } - if (return_321->u.name.hint != 1) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_delay_import_user32(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".str"), PE_DATA_SECTION_FLAGS, str8_zero()); - U64 msg_off = data_sect->data.total_size; - str8_list_pushf(obj_writer->arena, &data_sect->data, "test\0"); - U64 caption_off = data_sect->data.total_size; - str8_list_pushf(obj_writer->arena, &data_sect->data, "foo\0"); - COFF_ObjSymbol *msg_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("msg"), msg_off, data_sect); - COFF_ObjSymbol *caption_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("caption"), caption_off, data_sect); - - U8 text[] = { - 0x48, 0x83, 0xEC, 0x28, // sub rsp,28h - 0x45, 0x33, 0xC9, // xor r9d,r9d - 0x4C, 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00, // lea r8,[msg] - 0x48, 0x8D, 0x15, 0x00, 0x00, 0x00, 0x00, // lea rdx,[caption] - 0x33, 0xC9, // xor ecx,ecx - 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, // call qword ptr [__imp_MessageBoxA] - 0x33, 0xC0, // xor eax,eax - 0x48, 0x83, 0xC4, 0x28, // add rsp,28h - 0xC3, // ret - }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - COFF_ObjSymbol *text_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - COFF_ObjSymbol *message_box_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_MessageBoxA")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 10, msg_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 17, caption_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 25, message_box_symbol, COFF_Reloc_X64_Rel32); - - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("delay_import.obj"), obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry /fixed /delayload:user32.dll kernel32.lib user32.lib libcmt.lib delayimp.lib delay_import.obj /debug:full"); - if (linker_exit_code != 0) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_empty_section(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *test = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_TEXT_SECTION_FLAGS, str8(0,0)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, test); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("empty_section.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe empty_section.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_removed_section(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 test_text[] = { 0xc3 }; - COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkRemove, str8_array_fixed(test_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, test_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("test.obj"), obj)) { goto exit; } - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("entry.obj"), obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.obj entry.obj"); - if (linker_exit_code == 0) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_function_pad_min(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 ret[] = { 0xc3 }; - COFF_ObjSection *text_sect_0 = t_push_text_section(obj_writer, str8_array_fixed(ret)); - COFF_ObjSection *text_sect_1 = t_push_text_section(obj_writer, str8_array_fixed(ret)); - COFF_ObjSection *text_sect_2 = t_push_text_section(obj_writer, str8_array_fixed(ret)); - text_sect_0->flags |= COFF_SectionFlag_Align4Bytes; - text_sect_1->flags |= COFF_SectionFlag_Align2Bytes; - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("A"), 0, text_sect_0); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("B"), 0, text_sect_1); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("C"), 0, text_sect_2); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - if (!t_write_file(str8_lit("funcs.obj"), obj)) { goto exit; } - } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:A /functionpadmin:1 /out:a.exe funcs.obj"); - if (linker_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); - if (text_sect == 0) { goto exit; } - String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); - - U8 expected_text[] = { - 0xcc, 0xcc, 0xcc, 0xcc, 0xc3, - 0xcc, 0xcc, 0xcc, 0xc3, - 0xcc, 0xc3, - }; - if (!str8_match(text_data, str8_array_fixed(expected_text), 0)) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_first_member_header(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("8"), 0x8, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("1"), 0x1, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("9"), 0x9, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("7"), 0x7, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("4"), 0x4, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("5"), 0x5, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("2"), 0x2, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("3"), 0x3, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("6"), 0x6, COFF_SymStorageClass_External); - obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("obj.obj"), obj); - lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 0); - coff_lib_writer_release(&lib_writer); - } - - t_write_file(str8_lit("test.lib"), lib); - t_write_entry_obj(); - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9"); - if (linker_exit_code != 0) goto exit; - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_second_member_header(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("8"), 0x8, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("1"), 0x1, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("9"), 0x9, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("7"), 0x7, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("4"), 0x4, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("5"), 0x5, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("2"), 0x2, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("3"), 0x3, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("6"), 0x6, COFF_SymStorageClass_External); - obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("obj.obj"), obj); - lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - } - - t_write_file(str8_lit("test.lib"), lib); - t_write_entry_obj(); - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9"); - if (linker_exit_code != 0) goto exit; - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_defer_impl_link_to_second_search_pass(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 imp_ref_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("entry"), 0, sect); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_foo")); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("func")); // force linker to pull obj from the lib - imp_ref_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 impl_ref_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("func"), 0, sect); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); // on a second search pass force linker to look up same import - impl_ref_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 impl_ref_lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("impl_ref.obj"), impl_ref_obj); - impl_ref_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - } - - String8 foo_lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_import(lib_writer, COFF_MachineType_X64, ~0u, str8_lit("foo.dll"), COFF_ImportBy_Name, str8_lit("foo"), 0, COFF_ImportHeader_Code); - foo_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - } - - if (!t_write_file(str8_lit("imp_ref.obj"), imp_ref_obj)) { goto exit; } - if (!t_write_file(str8_lit("impl_ref.lib"), impl_ref_lib)) { goto exit; } - if (!t_write_file(str8_lit("foo.lib"), foo_lib)) { goto exit; } - if (!t_write_file(str8_lit("foo2.lib"), foo_lib)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe foo.lib foo2.lib imp_ref.obj impl_ref.lib"); - if (linker_exit_code != 0) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_opt_ref_dangling_section(void) -{ - Temp scratch = scratch_begin(0,0); - T_Result result = T_Result_Fail; - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("f")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - U8 data[] = "A0000"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(data)); - - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("q")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, q); - - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("f"), 0, sect); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 b_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - U8 q[] = { 1,2,3,4}; - COFF_ObjSection *q_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".q"), PE_DATA_SECTION_FLAGS, str8_array_fixed(q)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("q"), 0, q_sect); - - U8 data[] = "BBBBBBBBBBBBBBB"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(data)); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("f"), 0, sect); - - b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 b_lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("b.obj"), b_obj); - b_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - } - - if (!t_write_file(str8_lit("entry.obj"), entry_obj)) { goto exit; } - if (!t_write_file(str8_lit("a.obj"), a_obj)) { goto exit; } - if (!t_write_file(str8_lit("b.lib"), b_lib)) { goto exit; } - - int linker_exit_code = t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.lib"); - if (linker_exit_code != 0) { goto exit; } - - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *sect = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".q")); - if (sect != 0) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_value_in_register(void) -{ - Temp scratch = scratch_begin(0, 0); - T_Result result = T_Result_Fail; - - // setup register context - REGS_RegBlockX64 regs = {0}; - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_Reg3 - DW_ExprOp_Reg0); - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); - U64 value = 0xc0ffee; - MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); - - // compile a simple program which reads the value from register 3 - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - - // evaluate the program - DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); - - // validate eval result - if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } - if (expr_value.type != DW_ExprValueType_U64) { goto exit; } - if (expr_value.u64 != value) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_value_in_x_register(void) -{ - Temp scratch = scratch_begin(0, 0); - T_Result result = T_Result_Fail; - - // setup register context - REGS_RegBlockX64 regs = {0}; - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_RegX64_FsBase); - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); - U64 value = 0xc0ffee; - MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); - - // compile a simple program which reads the value from register 3 - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(RegX), DW_ExprEnc_ULEB128(DW_RegX64_FsBase) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - - // evaluate the program - DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); - - // validate eval result - if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } - if (expr_value.type != DW_ExprValueType_U64) { goto exit; } - if (expr_value.u64 != value) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_address_of_value(void) -{ - Temp scratch = scratch_begin(0, 0); - T_Result result = T_Result_Fail; - - // compile a simple program which reads address - U64 addr = 0xdeadbeef; - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_U64(addr) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - - // evaluate the program - DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); - - // validate eval result - if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } - if (expr_value.type != DW_ExprValueType_Addr) { goto exit; } - if (expr_value.addr != addr) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_register_relative_variable(void) -{ - Temp scratch = scratch_begin(0, 0); - T_Result result = T_Result_Fail; - - // setup register context - REGS_RegBlockX64 regs = {0}; - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg11 - DW_ExprOp_BReg0); - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); - U64 value = 1; - MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); - - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BReg11), DW_ExprEnc_SLEB128(44) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - - DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); - - // validate eval result - if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } - if (expr_value.type != DW_ExprValueType_Addr) { goto exit; } - if (expr_value.addr != (1 + 44)) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_frame_relative_variable(void) -{ - Temp scratch = scratch_begin(0, 0); - T_Result result = T_Result_Fail; - - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(FBReg), DW_ExprEnc_SLEB128(-50) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - - U64 frame_base = 123; - DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); - - if (expr_eval != DW_ExprEvalResult_Ok) { goto exit; } - if (expr_value.type != DW_ExprValueType_Addr) { goto exit; } - if (expr_value.addr != frame_base -50) { goto exit; } - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -internal -MACHINE_OP_MEM_READ(t_machine_op_mem_read) -{ - MemoryCopy(buffer, PtrFromInt(addr), buffer_size); - return MachineOpResult_Ok; -} - -internal T_Result -t_call_by_reference(void) -{ - Temp scratch = scratch_begin(0, 0); - T_Result result = T_Result_Fail; - - U8 *memory = push_array(scratch.arena, U8, 128); - U64 value = 0xc0ffee; - MemoryCopy(memory + 32, &value, sizeof(value)); - - REGS_RegBlockX64 regs = {0}; - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, 58); // fsbase - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); - U64 memory_ptr = IntFromPtr(memory); - MemoryCopy((U8 *)®s + reg_range.min, &memory_ptr, sizeof(memory_ptr)); - - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BRegX), DW_ExprEnc_ULEB128(58), DW_ExprEnc_SLEB128(32), DW_ExprEnc_Op(Deref) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - - DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, t_machine_op_mem_read, 0, &expr_value); - - if (expr_value.type != DW_ExprValueType_Generic) { goto exit; } - if (expr_value.generic.size != sizeof(U64)) { goto exit; } - if (*(U64 *)expr_value.generic.str != value) { goto exit; } - - result = T_Result_Pass; - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_plus_uconst(void) -{ - Temp scratch = scratch_begin(0, 0); - T_Result result = T_Result_Fail; - - U64 struct_addr = 0x123; - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_Addr(struct_addr), DW_ExprEnc_Op(PlusUConst), DW_ExprEnc_ULEB128(4) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - - DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, t_machine_op_mem_read, 0, &expr_value); - - if (expr_value.type != DW_ExprValueType_Addr) { goto exit; } - if (expr_value.addr != 0x123 + 4) { goto exit; } - - result = T_Result_Pass; - exit:; - scratch_end(scratch); - return result; -} - -internal T_Result -t_reg_split_spill(void) -{ - Temp scratch = scratch_begin(0, 0); - T_Result result = T_Result_Fail; - - // setup register context - REGS_RegBlockX64 regs = {0}; - { - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg3 - DW_ExprOp_BReg0); - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); - U64 value = 0xaaaa; - MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); - } - { - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg10 - DW_ExprOp_BReg0); - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); - U64 value = 0xbbbb; - MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); - } - - DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(4), DW_ExprEnc_Op(Reg10), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(2) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - - DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); - - result = T_Result_Pass; -exit:; - scratch_end(scratch); - return result; -} - -//////////////////////////////////////////////////////////////// - -internal void -entry_point(CmdLine *cmdline) +t_entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0,0); - // - // Test Targets - // - static struct { char *label; T_Result (*r)(void); } target_array[] = { -#define T(x) { Stringify(x), t_##x } - // Linker Tests - T(simple_link_test), - T(machine_compat_check), - T(out_of_bounds_section_number), - T(merge), - T(undef_section), - T(undef_reloc_section), - T(link_undef), - T(link_unref_undef), - T(weak_lib_vs_weak_lib), - T(weak_lib_vs_weak_nolib), - T(weak_lib_vs_weak_alias), - T(weak_lib_vs_weak_antidep), - T(weak_alias_vs_weak_alias), - T(weak_alias_vs_weak_lib), - T(weak_alias_vs_weak_nolib), - T(weak_alias_vs_weak_antidep), - T(weak_nolib_vs_weak_nolib), - T(weak_nolib_vs_weak_lib), - T(weak_nolib_vs_weak_alias), - T(weak_nolib_vs_weak_antidep), - T(weak_antidep_vs_weak_antidep), - T(weak_antidep_vs_weak_nolib), - T(weak_antidep_vs_weak_lib), - T(weak_antidep_vs_weak_alias), - T(weak_vs_common), - T(abs_vs_weak), - T(abs_vs_regular), - T(abs_vs_common), - T(abs_vs_abs), - T(undef_weak_lib), - T(undef_weak_search_alias), - T(sect_symbol), - T(weak_cycle), - T(weak_tag), - T(find_merged_pdata), - T(section_sort), - T(flag_conf), - T(invalid_bss), - T(common_block), - T(base_relocs), - T(simple_lib_test), - T(sect_align), - T(image_base), - T(comdat_any), - T(comdat_no_duplicates), - T(comdat_same_size), - T(comdat_exact_match), - T(comdat_largest), - T(comdat_associative), - T(comdat_associative_loop), - T(comdat_associative_non_comdat), - T(comdat_associative_out_of_bounds), - T(comdat_with_offset), - T(reloc_against_removed_comdat), - T(alt_name), - T(include), - T(communal_var_vs_regular_comdat), - T(communal_var_vs_regular), - T(import_kernel32), - T(delay_import_user32), - T(delay_import), - T(empty_section), - T(removed_section), - T(function_pad_min), - T(first_member_header), - T(second_member_header), - T(defer_impl_link_to_second_search_pass), - - // DWARF Expression Tests - T(value_in_register), - T(value_in_x_register), - T(address_of_value), - T(register_relative_variable), - T(frame_relative_variable), - T(call_by_reference), - T(plus_uconst), - //T(reg_split_spill), -#undef T - }; - // // Handle -help // @@ -5376,9 +189,9 @@ entry_point(CmdLine *cmdline) // { if (cmd_line_has_flag(cmdline, str8_lit("list"))) { - fprintf(stdout, "--- Targets --------------------------------------------------------------------\n"); - for (U64 i = 0; i < ArrayCount(target_array); i += 1) { - fprintf(stdout, " %s\n", target_array[i].label); + fprintf(stdout, "--- Tests --------------------------------------------------------------------\n"); + for EachIndex(i, g_torture_test_count) { + fprintf(stdout, " %s\n", g_torture_tests[i].label); } os_abort(0); } @@ -5467,11 +280,13 @@ entry_point(CmdLine *cmdline) os_delete_file_at_path(g_stdout_file_name); // - // Run Test Targets + // Run tests // { + radsort(g_torture_tests, g_torture_test_count, t_test_is_before); + U64 max_label_size = 0; - for (U64 i = 0; i < ArrayCount(target_array); i += 1) { max_label_size = Max(max_label_size, cstring8_length((U8*)target_array[i].label)); } + for EachIndex(i, g_torture_test_count) { max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[i].label)); } U64 dots_min = 10; U64 dots_size = max_label_size+dots_min; @@ -5481,17 +296,17 @@ entry_point(CmdLine *cmdline) U64 target_indices_count; U64 *target_indices; if (target.node_count == 0) { - target_indices_count = ArrayCount(target_array); - target_indices = push_array(scratch.arena, U64, ArrayCount(target_array)); - for (U64 i = 0; i < target_indices_count; i += 1) { target_indices[i] = i; } + target_indices_count = g_torture_test_count; + target_indices = push_array(scratch.arena, U64, g_torture_test_count); + for EachIndex(i, target_indices_count) { target_indices[i] = i; } } else { target_indices_count = 0; target_indices = push_array(scratch.arena, U64, target.node_count); - for (String8Node *target_n = target.first; target_n != 0; target_n = target_n->next) { + for EachNode(target_n, String8Node, target.first) { B32 is_target_unknown = 1; - for (U64 i = 0; i < ArrayCount(target_array); i += 1) { - if (str8_match(str8_cstring(target_array[i].label), target_n->string, 0)) { + for EachIndex(i, g_torture_test_count) { + if (str8_match(str8_cstring(g_torture_tests[i].label), target_n->string, 0)) { target_indices[target_indices_count++] = i; is_target_unknown = 0; break; @@ -5506,10 +321,17 @@ entry_point(CmdLine *cmdline) U64 pass_count = 0; U64 fail_count = 0; U64 crash_count = 0; - for (U64 i = 0; i < target_indices_count; i += 1) { + for EachIndex(i, target_indices_count) { U64 target_idx = target_indices[i]; - g_wdir = push_str8f(scratch.arena, "%S\\%s", g_out, target_array[target_idx].label); + // print run progress + U64 dots_count = (max_label_size - cstring8_length((U8*)g_torture_tests[target_idx].label)) + dots_min; + fprintf(stdout, "[%2I64u/%2I64u] ", i+1, target_indices_count); + fprintf(stdout, "(%s) %s", g_torture_tests[target_idx].group, g_torture_tests[target_idx].label); + fprintf(stdout, "%.*s", (int)dots_count, dots); + + // setup output directory + g_wdir = push_str8f(scratch.arena, "%S\\%s", g_out, g_torture_tests[target_idx].label); g_wdir = os_full_path_from_path(scratch.arena, g_wdir); os_make_directory(g_wdir); if (!os_folder_path_exists(g_out)) { @@ -5517,30 +339,27 @@ entry_point(CmdLine *cmdline) continue; } - T_Result result = t_run(target_array[target_idx].r); + // run test + T_RunResult result = t_run(g_torture_tests[target_idx].r); - U64 dots_count = (max_label_size - cstring8_length((U8*)target_array[target_idx].label)) + dots_min; - String8 msg = push_str8f(scratch.arena, "%s%.*s%s", target_array[target_idx].label, dots_count, dots, t_string_from_result(result)); - - // run progress - fprintf(stdout, "[%2llu/%2llu] ", i+1, target_indices_count); - - if (result == T_Result_Pass) { - fprintf(stdout, "\x1b[32m" "%.*s" "\x1b[0m" "\n", str8_varg(msg)); + // print result + if (result.status == T_RunStatus_Pass) { + fprintf(stdout, "\x1b[32m" "%s" "\x1b[0m" "\n", t_string_from_result(result.status)); pass_count += 1; - } else if (result == T_Result_Fail) { - fprintf(stdout, "\x1b[31m" "%.*s" "\x1b[0m" "\n", str8_varg(msg)); + } else if (result.status == T_RunStatus_Fail) { + fprintf(stdout, "\x1b[31m" "%s" "\x1b[0m" "\n", t_string_from_result(result.status)); fail_count += 1; - } else if (result == T_Result_Crash) { - fprintf(stdout, "\x1b[33m" "%.*s" "\x1b[0m" "\n", str8_varg(msg)); + } else if (result.status == T_RunStatus_Crash) { + fprintf(stdout, "\x1b[33m" "%s" "\x1b[0m" "\n", t_string_from_result(result.status)); crash_count += 1; } + + if (result.status != T_RunStatus_Pass) { + fprintf(stdout, " ERROR: %s:%d: condition: \"%s\"\n", result.fail_file, result.fail_line, result.fail_cond); + } } - fprintf(stdout, "--- Report ---------------------------------------------------------------------\n"); - fprintf(stdout, " Passed: %llu\n", pass_count); - fprintf(stdout, " Failed: %llu\n", fail_count); - fprintf(stdout, " Crashed: %llu\n", crash_count); + fprintf(stdout, "---- Passed: %I64u, Failed: %I64u, Crashed: %I64u ----\n", pass_count, fail_count, crash_count); if (fail_count + crash_count != 0) { fflush(stdout); diff --git a/src/torture/torture.h b/src/torture/torture.h new file mode 100644 index 00000000..74f27eb4 --- /dev/null +++ b/src/torture/torture.h @@ -0,0 +1,94 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +//////////////////////////////// + +typedef enum +{ + T_RunStatus_Fail, + T_RunStatus_Crash, + T_RunStatus_Pass, +} T_RunStatus; + +typedef struct +{ + T_RunStatus status; + char *fail_file; + int fail_line; + char *fail_cond; +} T_RunResult; + +typedef T_RunResult (*T_Run)(void); + +typedef struct +{ + T_Run run; + T_RunResult result; +} T_RunCtx; + +typedef struct +{ + char *group; + char *label; + int decl_line; + T_Run r; +} T_Test; + +extern U64 g_torture_test_count; +extern T_Test g_torture_tests[0xffffff]; + +#define T_AddTest(name, l, ...) \ + T_RunResult t_##name(void); \ + __VA_ARGS__ void t_add_test_##name(void) \ + { \ + g_torture_tests[g_torture_test_count].group = T_Group; \ + g_torture_tests[g_torture_test_count].label = Stringify(name); \ + g_torture_tests[g_torture_test_count].r = &t_##name; \ + g_torture_tests[g_torture_test_count].decl_line = l; \ + g_torture_test_count += 1; \ + } + +#if COMPILER_MSVC +#pragma section(".CRT$XCU", read) +# define T_BeginTest_(name) \ + T_AddTest(name, __LINE__) \ + __declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ + __pragma(comment(linker, "/include:" Stringify(r_##name))) +#else +# define T_BeginTest_(name) \ + T_AddTest(name, __LINE__, __attribute__((constructor))) +#endif + +#define T_BeginTest(name) \ + T_BeginTest_(name) \ + T_RunResult t_##name(void) { \ + Temp scratch = scratch_begin(0,0); \ + T_RunResult result = { .status = T_RunStatus_Fail }; + +#define T_EndTest \ + result.status = T_RunStatus_Pass; \ + exit__:; \ + scratch_end(scratch); \ + return result; \ + } + +#define T_Ok(c) do { if (!(c)) { result.fail_file = __FILE__; result.fail_line = __LINE__; result.fail_cond = Stringify(c); goto exit__; } } while(0) + +//////////////////////////////// + +// output directory +internal B32 t_write_file_list(String8 name, String8List data); +internal B32 t_write_file(String8 name, String8 data); +internal String8 t_read_file(Arena *arena, String8 name); +internal String8 t_make_file_path(Arena *arena, String8 name); + +// test runner +internal void t_run_caller(void *raw_ctx); +internal void t_run_fail_handler(void *raw_ctx); +internal T_RunResult t_run(T_Run run); + +internal B32 t_invoke(String8 exe, String8 cmdline, U64 timeout); + + diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c new file mode 100644 index 00000000..40088cbd --- /dev/null +++ b/src/torture/torture_dwarf.c @@ -0,0 +1,190 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#define T_Group "Dwarf" + +T_BeginTest(value_in_register) +{ + // setup register context + REGS_RegBlockX64 regs = {0}; + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_Reg3 - DW_ExprOp_Reg0); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 0xc0ffee; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + + // compile a simple program which reads the value from register 3 + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + // evaluate the program + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + + // validate eval result + T_Ok(expr_eval == DW_ExprEvalResult_Ok); + T_Ok(expr_value.type == DW_ExprValueType_U64); + T_Ok(expr_value.u64 == value); +} +T_EndTest; + +T_BeginTest(value_in_x_register) +{ + // setup register context + REGS_RegBlockX64 regs = {0}; + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_RegX64_FsBase); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 0xc0ffee; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + + // compile a simple program which reads the value from register 3 + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(RegX), DW_ExprEnc_ULEB128(DW_RegX64_FsBase) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + // evaluate the program + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + + // validate eval result + T_Ok(expr_eval == DW_ExprEvalResult_Ok); + T_Ok(expr_value.type == DW_ExprValueType_U64); + T_Ok(expr_value.u64 == value); +} +T_EndTest; + +T_BeginTest(address_of_value) +{ + // compile a simple program which reads address + U64 addr = 0xdeadbeef; + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_U64(addr) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + // evaluate the program + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); + + // validate eval result + T_Ok(expr_eval == DW_ExprEvalResult_Ok); + T_Ok(expr_value.type == DW_ExprValueType_Addr); + T_Ok(expr_value.addr == addr); +} +T_EndTest; + +T_BeginTest(register_relative_variable) +{ + // setup register context + REGS_RegBlockX64 regs = {0}; + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg11 - DW_ExprOp_BReg0); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 1; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BReg11), DW_ExprEnc_SLEB128(44) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + + // validate eval result + T_Ok(expr_eval == DW_ExprEvalResult_Ok); + T_Ok(expr_value.type == DW_ExprValueType_Addr); + T_Ok(expr_value.addr == (1 + 44)); +} +T_EndTest; + +T_BeginTest(frame_relative_variable) +{ + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(FBReg), DW_ExprEnc_SLEB128(-50) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + U64 frame_base = 123; + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); + + T_Ok(expr_eval == DW_ExprEvalResult_Ok); + T_Ok(expr_value.type == DW_ExprValueType_Addr); + T_Ok(expr_value.addr == frame_base -50); +} +T_EndTest; + +internal +MACHINE_OP_MEM_READ(t_machine_op_mem_read) +{ + MemoryCopy(buffer, PtrFromInt(addr), buffer_size); + return MachineOpResult_Ok; +} + +T_BeginTest(call_by_reference) +{ + U8 *memory = push_array(scratch.arena, U8, 128); + U64 value = 0xc0ffee; + MemoryCopy(memory + 32, &value, sizeof(value)); + + REGS_RegBlockX64 regs = {0}; + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, 58); // fsbase + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 memory_ptr = IntFromPtr(memory); + MemoryCopy((U8 *)®s + reg_range.min, &memory_ptr, sizeof(memory_ptr)); + + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BRegX), DW_ExprEnc_ULEB128(58), DW_ExprEnc_SLEB128(32), DW_ExprEnc_Op(Deref) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + DW_ExprValue expr_value = { 0 }; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, t_machine_op_mem_read, 0, &expr_value); + + T_Ok(expr_value.type == DW_ExprValueType_Generic); + T_Ok(expr_value.generic.size == sizeof(U64)); + T_Ok(*(U64 *)expr_value.generic.str == value); +} +T_EndTest; + +T_BeginTest(plus_uconst) +{ + U64 struct_addr = 0x123; + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_Addr(struct_addr), DW_ExprEnc_Op(PlusUConst), DW_ExprEnc_ULEB128(4) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, t_machine_op_mem_read, 0, &expr_value); + + T_Ok(expr_value.type == DW_ExprValueType_Addr); + T_Ok(expr_value.addr == 0x123 + 4); +} +T_EndTest; + +#if 0 +T_BeginTest(reg_split_spill) +{ + // setup register context + REGS_RegBlockX64 regs = {0}; + { + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg3 - DW_ExprOp_BReg0); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 0xaaaa; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + } + { + REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg10 - DW_ExprOp_BReg0); + Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + U64 value = 0xbbbb; + MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + } + + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(4), DW_ExprEnc_Op(Reg10), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(2) }; + String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + + DW_ExprValue expr_value; + DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); +} +T_EndTest; +#endif + +#undef T_Group + diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c new file mode 100644 index 00000000..75ecb3ba --- /dev/null +++ b/src/torture/torture_main.c @@ -0,0 +1,62 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +// Build Options + +#define BUILD_CONSOLE_INTERFACE 1 +#define BUILD_TITLE "TORTURE" + +//////////////////////////////// + +#include "base/base_inc.h" +#include "os/os_inc.h" +#include "linker/base_ext/base_core.h" +#include "linker/base_ext/base_arena.h" +#include "linker/base_ext/base_arrays.h" +#include "linker/hash_table.h" +#include "coff/coff.h" +#include "coff/coff_parse.h" +#include "coff/coff_obj_writer.h" +#include "coff/coff_lib_writer.h" +#include "pe/pe.h" +#include "pe/pe_section_flags.h" +#include "elf/elf.h" +#include "elf/elf_parse.h" +#include "dwarf/dwarf_inc.h" +#include "regs/regs.h" +#include "regs/dwarf/regs_dwarf.h" +#include "linker/lnk_cmd_line.h" +#include "linker/lnk_cmd_line.c" +#include "linker/lnk_error.h" +#include "torture.h" +#include "torture_radlink.h" + +#include "base/base_inc.c" +#include "os/os_inc.c" +#include "linker/hash_table.c" +#include "linker/base_ext/base_core.c" +#include "linker/base_ext/base_arena.c" +#include "linker/base_ext/base_arrays.c" +#include "coff/coff.c" +#include "coff/coff_parse.c" +#include "coff/coff_obj_writer.c" +#include "coff/coff_lib_writer.c" +#include "pe/pe.c" +#include "elf/elf.c" +#include "elf/elf_parse.c" +#include "dwarf/dwarf_inc.c" +#include "regs/regs.c" +#include "regs/dwarf/regs_dwarf.c" +#include "torture.c" +#include "torture_radlink.c" +#include "torture_dwarf.c" + +//////////////////////////////// + +internal void +entry_point(CmdLine *cmdline) +{ + t_entry_point(cmdline); +} + diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c new file mode 100644 index 00000000..500e2255 --- /dev/null +++ b/src/torture/torture_radlink.c @@ -0,0 +1,3860 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal T_Linker +t_id_linker(void) +{ + String8 name = str8_chop_last_dot(str8_skip_last_slash(g_linker)); + if (str8_match(name, str8_lit("radlink"), StringMatchFlag_CaseInsensitive)) { return T_Linker_RAD; } + if (str8_match(name, str8_lit("link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_MSVC; } + if (str8_match(name, str8_lit("lld-link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_LLVM; } + return T_Linker_Null; +} + +internal COFF_ObjSection * +t_push_text_section(COFF_ObjWriter *obj_writer, String8 data) +{ + return coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_Align1Bytes, data); +} + +internal COFF_ObjSection * +t_push_data_section(COFF_ObjWriter *obj_writer, String8 data) +{ + return coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, data); +} + +internal COFF_ObjSection * +t_push_rdata_section(COFF_ObjWriter *obj_writer, String8 data) +{ + return coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS, data); +} + +internal String8 +t_make_sec_defn_obj(Arena *arena, String8 payload) +{ + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *mysect_section = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes, payload); + coff_obj_writer_push_symbol_secdef(obj_writer, mysect_section, COFF_ComdatSelect_Null); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); + coff_obj_writer_release(&obj_writer); + return obj; +} + +internal String8 +t_make_entry_obj(Arena *arena) +{ + /* + "machine": "x64", + "sectab": [ ".text": [ "alias: "entry", "data": [ 0xc3 ] ] ] + "symtab" : [ { "name": "entry", "section": "entry", "offset": "100", "type": "extern" } ] + */ + + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xc3 }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); + coff_obj_writer_release(&obj_writer); + return obj; +} + +internal B32 +t_write_entry_obj(void) +{ + Temp scratch = scratch_begin(0,0); + String8 obj = t_make_entry_obj(scratch.arena); + B32 is_ok = t_write_file(str8_lit("entry.obj"), obj); + scratch_end(scratch); + return is_ok; +} + +//////////////////////////////// + +#define T_Group "Linker" + +T_BeginTest(machine_compat_check) +{ + // unknown.obj + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown); + t_push_data_section(obj_writer, str8_lit("unknown")); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("unknown.obj"), obj)); + } + + // x64.obj + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + t_push_data_section(obj_writer, str8_lit("x64")); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("x64.obj"), obj)); + } + + // entry.obj + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xC3 }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + // arm64.obj + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Arm64); + t_push_data_section(obj_writer, str8_lit("arm64")); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("arm64.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj unknown.obj x64.obj"); + T_Ok(g_last_exit_code == 0); + + // test objs with conflicting machines + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj unknown.obj x64.obj arm64.obj"); + T_Ok(g_last_exit_code != 0); + + // check /MACHINE switch + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /machine:amd64 arm64.obj entry.obj"); + T_Ok(g_last_exit_code != 0); +} +T_EndTest; + +T_BeginTest(simple_link_test) +{ + U8 text_payload[] = { 0xC3 }; + + String8 main_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text_payload)); + coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_lit("qwe")); + coff_obj_writer_push_section(obj_writer, str8_lit(".zero"), PE_BSS_SECTION_FLAGS, str8(0, 5)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 main_obj_name = str8_lit("main.obj"); + T_Ok(t_write_file(main_obj_name, main_obj)); + + int file_align = 512; + int virt_align = 4096; + String8 out_name = str8_lit("a.exe"); + t_invoke_linkerf("/entry:my_entry /subsystem:console /fixed /filealign:%d /align:%d /out:%S %S", file_align, virt_align, out_name, main_obj_name); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, out_name); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + T_Ok(!pe.is_pe32); + T_Ok(pe.section_count == 3); + T_Ok(pe.arch == Arch_x64); + T_Ok(pe.subsystem == PE_WindowsSubsystem_WINDOWS_CUI); + T_Ok(pe.virt_section_align == virt_align); + T_Ok(pe.file_section_align == file_align); + T_Ok(pe.symbol_count == 0); + T_Ok(pe.data_dir_count == PE_DataDirectoryIndex_COUNT); + + // check section alignment + for EachIndex(sect_idx, pe.section_count) { + COFF_SectionHeader *sect_header = §ion_table[sect_idx]; + T_Ok(AlignPadPow2(sect_header->fsize, file_align) == 0); + T_Ok(AlignPadPow2(sect_header->voff, virt_align) == 0); + } + + COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_section != 0); + T_Ok(text_section->foff == file_align); + T_Ok(pe.entry_point == text_section->voff); + + COFF_SectionHeader *data_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + T_Ok(data_section != 0); + + COFF_SectionHeader *zero_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".zero")); + T_Ok(zero_section != 0); + + String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + text_section->vsize)); + T_Ok(str8_match(text_data, str8_array_fixed(text_payload), 0)); + + PE_OptionalHeader32Plus *opt = str8_deserial_get_raw_ptr(exe, pe.optional_header_off, sizeof(*opt)); + T_Ok(opt->sizeof_code == text_section->fsize); + T_Ok(opt->sizeof_inited_data == (text_section->fsize + data_section->fsize)); + T_Ok(opt->sizeof_uninited_data == 0x200); + T_Ok(opt->code_base == 0x1000); + T_Ok(opt->image_base == 0x140000000); + T_Ok(opt->major_os_ver == 6); + T_Ok(opt->minor_os_ver == 0); + T_Ok(opt->major_img_ver == 0); + T_Ok(opt->minor_img_ver == 0); + T_Ok(opt->major_subsystem_ver == 6); + T_Ok(opt->minor_subsystem_ver == 0); + T_Ok(opt->win32_version_value == 0); + T_Ok(opt->sizeof_image == 0x4000); + T_Ok(opt->sizeof_headers == 0x200); + T_Ok(opt->dll_characteristics == 0x8120); + T_Ok(opt->loader_flags == 0); +} +T_EndTest; + +T_BeginTest(out_of_bounds_section_number) +{ + // bad.obj + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *foo = coff_obj_writer_push_section(obj_writer, str8_lit(".foo"), PE_DATA_SECTION_FLAGS, str8_lit("foo")); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, foo); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + { + COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj); + String8 string_table = str8_substr(obj, header.string_table_range); + String8 symbol_table = str8_substr(obj, header.symbol_table_range); + COFF_ParsedSymbol symbol = coff_parse_symbol(header, string_table, symbol_table, 0); + COFF_Symbol16 *symbol16 = symbol.raw_symbol; + symbol16->section_number = 123; + } + T_Ok(t_write_file(str8_lit("bad.obj"), obj)); + } + + // entry.obj + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj"); + T_Ok(g_last_exit_code != 0); +} +T_EndTest; + +T_BeginTest(merge) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_DATA_SECTION_FLAGS, str8_lit("hello, world")); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("test.obj"), obj)); + } + + T_Ok(t_write_entry_obj()); + + // circular merge + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.test entry.obj test.obj"); + T_Ok(g_last_exit_code != 0); + + if (t_id_linker() == T_Linker_RAD) { + T_Ok(g_last_exit_code == LNK_Error_CircularMerge); + } + + // circular merge with extra link + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.data /merge:.data=.test entry.obj test.obj"); + T_Ok(g_last_exit_code != 0); + if (t_id_linker() == T_Linker_RAD) { + T_Ok(g_last_exit_code == LNK_Error_CircularMerge); + } + + // merge with non-defined section + { + g_last_exit_code; + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.qwe entry.obj test.obj"); + T_Ok(g_last_exit_code == 0); + + // make sure linker created .qwe and merged .test into it + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".qwe")); + T_Ok(sect != 0); + T_Ok(sect->flags == PE_DATA_SECTION_FLAGS); + String8 qwe = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(qwe, str8_lit("hello, world"),0)); + } + + // illegal merge with .reloc + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.reloc entry.obj test.obj"); + T_Ok(g_last_exit_code != 0); + if (t_id_linker() == T_Linker_RAD) { + T_Ok(g_last_exit_code == LNK_Error_IllegalSectionMerge); + } + + // illegal merge with .rsrc + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.rsrc entry.obj test.obj"); + T_Ok(g_last_exit_code != 0); + if (t_id_linker() == T_Linker_RAD) { + T_Ok(g_last_exit_code == LNK_Error_IllegalSectionMerge); + } + + // merge non-defined section with defined section + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.qwe=.test entry.obj test.obj"); + T_Ok(g_last_exit_code == 0); + + // merge .test -> .qwe -> .data + { + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.qwe /merge:.qwe=.data entry.obj test.obj"); + T_Ok(g_last_exit_code == 0); + + // make sure linker merged .test into .data + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".data")); + T_Ok(sect != 0); + T_Ok(sect->flags == PE_DATA_SECTION_FLAGS); + String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(data, str8_lit("hello, world"),0)); + } +} +T_EndTest; + +T_BeginTest(link_undef) +{ + String8 undef_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); + undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("undef.obj"), undef_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // try linking unresolved symbol and see if linker picks up on that + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj"); + T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); +} +T_EndTest; + +T_BeginTest(link_unref_undef) +{ + String8 undef_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); + undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xc3 }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("undef.obj"), undef_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // try linking unreferenced unresolved symbol, this must link + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj"); + T_Ok(g_last_exit_code != 0); +} +T_EndTest; + +T_BeginTest(weak_lib_vs_weak_lib) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // linker must pick weak symbol from a.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x111; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } + + // linker must pick weak symbol from entry.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_lib_vs_weak_nolib) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // linker must pick weak symbol from entry.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_lib_vs_weak_alias) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // linker must pick weak symbol from entry.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); +} +T_EndTest; + +T_BeginTest(weak_lib_vs_weak_antidep) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // linker must pick weak symbol from a.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_alias_vs_weak_alias) +{ + String8 a; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *qwe = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("qwe"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("sym"), COFF_WeakExt_SearchAlias, qwe); + a = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 b; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *ewq = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("ewq"), 0x222, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("sym"), COFF_WeakExt_SearchAlias, ewq); + b = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("sym")); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a)); + T_Ok(t_write_file(str8_lit("b.obj"), b)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); +} +T_EndTest; + +T_BeginTest(weak_alias_vs_weak_lib) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // linker must pick weak symbol from entry.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_alias_vs_weak_nolib) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // linker must pick weak symbol from entry.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_alias_vs_weak_antidep) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // linker must pick weak symbol from entry.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_nolib_vs_weak_nolib) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_nolib_vs_weak_lib) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_nolib_vs_weak_alias) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); +} +T_EndTest; + +T_BeginTest(weak_nolib_vs_weak_antidep) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_antidep_vs_weak_antidep) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + // linker must pick weak symbol from a.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x111; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } + + // linker must pick weak symbol from entry.obj + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_antidep_vs_weak_nolib) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_antidep_vs_weak_lib) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x222; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_antidep_vs_weak_alias) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); + coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + String8 imm = str8_substr(text_data, rng_1u64(3, 7)); + U32 expected = 0x111; + T_Ok(str8_match(imm, str8_struct(&expected), 0)); + } +} +T_EndTest; + +T_BeginTest(weak_vs_common) +{ + String8 weak_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); + COFF_ObjSymbol *sect_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("_a"), 0, sect); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, sect_symbol); + weak_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 common_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_common(obj_writer, str8_lit("w"), 2); + common_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("w")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("weak.obj"), weak_obj)); + T_Ok(t_write_file(str8_lit("common.obj"), common_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe common.obj weak.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe weak.obj common.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *bss = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".bss")); + T_Ok(bss); + T_Ok(bss->fsize == 0); + T_Ok(bss->vsize == 2); +} +T_EndTest; + +T_BeginTest(abs_vs_weak) +{ + U32 abs_value = 0x123; + U8 text_code[] = { 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3 }; + + String8 abs_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), abs_value, COFF_SymStorageClass_External); + abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 text_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + COFF_ObjSection *mydata = coff_obj_writer_push_section(obj_writer, str8_lit(".mydata"), COFF_SectionFlag_CntCode|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_Align1Bytes, str8_lit("mydata")); + COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("mydata"), 0, mydata); + COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("foo"), COFF_WeakExt_NoLibrary, tag); + + COFF_ObjSection *text = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), COFF_SectionFlag_CntCode|COFF_SectionFlag_MemExecute|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes, str8_array_fixed(text_code)); + coff_obj_writer_section_push_reloc(obj_writer, text, 2, foo, COFF_Reloc_X64_Addr64); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text); + + text_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("abs.obj"), abs_obj)); + T_Ok(t_write_file(str8_lit("text.obj"), text_obj)); + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe abs.obj text.obj"); + T_Ok(g_last_exit_code == 0); + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe text.obj abs.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_section != 0); + + String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + text_section->fsize)); + String8 inst = str8_prefix(text_data, 2); + T_Ok(str8_match(inst, str8_array(text_code, 2), 0)); + + String8 imm = str8_prefix(str8_skip(text_data, 2), 8); + U64 expected_imm = abs_value; + T_Ok(str8_match(imm, str8_struct(&expected_imm), 0)); +} +T_EndTest; + +T_BeginTest(abs_vs_regular) +{ + String8 shared_symbol_name = str8_lit("foo"); + + U8 regular_payload[] = { 0xC0, 0xFF, 0xEE }; + String8 regular_obj_name = str8_lit("regular.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(regular_payload)); + coff_obj_writer_push_symbol_extern(obj_writer, shared_symbol_name, 0, data_sect); + String8 regular_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(regular_obj_name, regular_obj)); + } + + String8 abs_obj_name = str8_lit("abs.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External); + String8 abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(abs_obj_name, abs_obj)); + } + + U8 entry_text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + String8 entry_obj_name = str8_lit("entry.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + COFF_ObjSymbol *shared_symbol = coff_obj_writer_push_symbol_undef(obj_writer, shared_symbol_name); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, shared_symbol, COFF_Reloc_X64_Addr32Nb); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + // TODO: validate that linker issues multiply defined symbol error + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe abs.obj regular.obj entry.obj"); + // linker should complain about multiply defined symbol + T_Ok(g_last_exit_code != 0); + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe regular.obj abs.obj entry.obj"); + // linker should complain even in case regular is before abs + T_Ok(g_last_exit_code != 0); +} +T_EndTest; + +T_BeginTest(abs_vs_common) +{ + String8 shared_symbol_name = str8_lit("foo"); + + String8 common_obj_name = str8_lit("common.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_common(obj_writer, shared_symbol_name, 321); + String8 common_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(common_obj_name, common_obj)); + } + + String8 abs_obj_name = str8_lit("abs.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External); + String8 abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(abs_obj_name, abs_obj)); + } + + U8 entry_text[] = { 0xC3 }; + String8 entry_obj_name = str8_lit("entry.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe abs.obj common.obj entry.obj"); + if (g_last_exit_code == 0) { + // TODO: validate that linker issues multiply defined symbol error + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe common.obj abs.obj entry.obj"); + if (t_id_linker() == T_Linker_RAD) { + T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); + } else { + T_Ok(g_last_exit_code != 0); + } + } +} +T_EndTest; + +T_BeginTest(abs_vs_abs) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), 'a', COFF_SymStorageClass_External); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 b_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), 'b', COFF_SymStorageClass_External); + b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); +} +T_EndTest; + +T_BeginTest(undef_weak_lib) +{ + String8 weak; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + COFF_ObjSymbol *b = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("b"), 0xc3000000, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("a"), COFF_WeakExt_SearchLibrary, b); + weak = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("a")); + U8 text[4] = {0}; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, sym); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + entry = coff_obj_writer_serialize(scratch.arena, obj_writer); + } + + T_Ok(t_write_file(str8_lit("weak.obj"), weak)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry)); + + // undefined symbol must always replace weak symbol with search library + t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry entry.obj weak.obj"); + T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); +} +T_EndTest; + +T_BeginTest(undef_weak_search_alias) +{ + Temp scratch = scratch_begin(0,0); + + String8 weak_obj; + { + U8 weak_payload[] = { 0xDE, 0xAD, 0xBE, 0xEF }; + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *weak_sect = t_push_data_section(obj_writer, str8_array_fixed(weak_payload)); + COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("ptr")); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("foo"), COFF_WeakExt_SearchAlias, tag); + weak_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 ptr_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("entry")); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("ptr"), COFF_WeakExt_SearchAlias, tag); + ptr_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 undef_obj; + { + U8 undef_obj_payload[] = { 0x00, 0x00, 0x00, 0x00 }; + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *undef_sect = t_push_data_section(obj_writer, str8_array_fixed(undef_obj_payload)); + COFF_ObjSymbol *undef_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); + coff_obj_writer_section_push_reloc(obj_writer, undef_sect, 0, undef_symbol, COFF_Reloc_X64_Addr32Nb); + undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + U8 entry_payload[] = {0xC3}; + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("weak.obj"), weak_obj)); + T_Ok(t_write_file(str8_lit("ptr.obj"), ptr_obj)); + T_Ok(t_write_file(str8_lit("undef.obj"), undef_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe weak.obj entry.obj ptr.obj undef.obj"); + T_Ok(g_last_exit_code == 0); +} +T_EndTest; + +T_BeginTest(weak_cycle) +{ + String8 ab_obj_name = str8_lit("ab.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *b = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("B")); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("A"), COFF_WeakExt_SearchAlias, b); + String8 ab_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(ab_obj_name, ab_obj)); + } + + String8 ba_obj_name = str8_lit("ba.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *a = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("A")); + coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("B"), COFF_WeakExt_SearchAlias, a); + String8 ba_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(ba_obj_name, ba_obj)); + } + + String8 entry_obj_name = str8_lit("entry.obj"); + U8 entry_payload[] = { 0xC3 }; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + U64 timeout = os_now_microseconds() + 3 * 1000 * 1000; // give a generous 3 seconds + t_invoke_linker_timeoutf(timeout, "/subsystem:console /entry:my_entry %S %S %S", entry_obj_name, ab_obj_name, ba_obj_name); +} +T_EndTest; + +T_BeginTest(weak_tag) +{ + U32 weak_tag_expected_value = 0x12345678; + String8 weak_tag_obj_name = str8_lit("weak_tag.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *tag_symbol = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("abs"), weak_tag_expected_value, COFF_SymStorageClass_Static); + COFF_ObjSymbol *weak_first = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("strong_first"), COFF_WeakExt_SearchAlias, tag_symbol); + COFF_ObjSymbol *weak_second = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("strong_second"), COFF_WeakExt_SearchAlias, weak_first); + + U8 sect_data[4] = {0}; + COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(sect_data)); + coff_obj_writer_section_push_reloc(obj_writer, sect, 0, weak_second, COFF_Reloc_X64_Addr32); + + String8 weak_tag_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(weak_tag_obj_name, weak_tag_obj)); + } + + String8 entry_name = str8_lit("my_entry"); + U8 entry_text[] = { 0xC3 }; + String8 entry_obj_name = str8_lit("entry.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); + coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe %S %S", weak_tag_obj_name, entry_obj_name); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *data_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + String8 data = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize)); + T_Ok(data_section); + T_Ok(data_section->vsize == 4); + T_Ok(str8_match(data, str8_struct(&weak_tag_expected_value), 0)); +} +T_EndTest; + +T_BeginTest(undef_section) +{ + String8 main_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + U8 data[] = { 0, 0, 0, 0 }; + COFF_ObjSection *data_section = t_push_data_section(obj_writer, str8_array_fixed(data)); + COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".mysect"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead); + coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr32Nb); + + U8 text[] = { 0xC3 }; + COFF_ObjSection *text_section = t_push_text_section(obj_writer, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_section); + + main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + U8 payload[] = { 1, 2, 3 }; + String8 sec_defn_obj = t_make_sec_defn_obj(scratch.arena, str8_array_fixed(payload)); + + t_write_file(str8_lit("main.obj"), main_obj); + t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj); + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj"); + if (g_last_exit_code == 0) { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *data_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + COFF_SectionHeader *mysect_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".mysect")); + if (data_section && mysect_section) { + if (data_section->vsize == 4 && mysect_section->vsize == 3) { + String8 addr32nb = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize)); + String8 expected_voff = str8_struct(&mysect_section->voff); + T_Ok(str8_match(addr32nb, expected_voff, 0)); + } + } + } +} +T_EndTest; + +T_BeginTest(sect_symbol) +{ + String8 sect_payload = str8_lit("hello, world"); + String8 sect_obj_name = str8_lit("sect.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect$1"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, sect_payload); + coff_obj_writer_push_directive(obj_writer, str8_lit("/merge:.mysect=.data")); + String8 sect_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(sect_obj_name, sect_obj)); + } + + String8 main_obj_name = str8_lit("main.obj"); + { + U8 data[8] = {0}; + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(data)); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".mysect$2222"), PE_DATA_SECTION_FLAGS); + coff_obj_writer_section_push_reloc_addr(obj_writer, sect, 0, symbol); + + U8 text[] = { 0xC3 }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + + String8 main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + + T_Ok(t_write_file(main_obj_name, main_obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sect.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + + T_Ok(sect != 0); + + String8 sect_data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + + String8 addr_data = str8_substr(sect_data, rng_1u64(0, sizeof(U64))); + T_Ok(addr_data.size == sizeof(U64)); + + U64 addr = *(U64 *)addr_data.str; + T_Ok(addr - (pe.image_base + sect->voff) == 8); + + String8 payload_got = str8_substr(sect_data, rng_1u64(8, sect_data.size)); + T_Ok(str8_match(payload_got, sect_payload, 0)); +} +T_EndTest; + +T_BeginTest(undef_reloc_section) +{ + String8 main_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + U8 text[] = { 0xC3 }; + COFF_ObjSection *text_section = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + COFF_ObjSymbol *my_entry_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_section); + + U8 data[8] = { 0 }; + COFF_ObjSection *data_section = t_push_data_section(obj_writer, str8_array_fixed(data)); + COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".reloc"), PE_RELOC_SECTION_FLAGS); + coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr64); + + main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + + coff_obj_writer_release(&obj_writer); + } + + U8 payload[] = { 1, 2, 3 }; + String8 sec_defn_obj = t_make_sec_defn_obj(scratch.arena, str8_array_fixed(payload)); + + T_Ok(t_write_file(str8_lit("main.obj"), main_obj)); + T_Ok(t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj)); + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj"); + if (t_id_linker() == T_Linker_RAD) { + T_Ok(g_last_exit_code == LNK_Error_SectRefsDiscardedMemory); + } else { + T_Ok(g_last_exit_code != 0); + } +} +T_EndTest; + +T_BeginTest(find_merged_pdata) +{ + U8 foobar_payload[] = { + 0x40, 0x57, 0x48, 0x81, 0xEC, 0x00, 0x02, 0x00, 0x00, 0x48, 0x8B, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x33, 0xC4, 0x48, 0x89, 0x84, 0x24, 0xF0, 0x01, 0x00, 0x00, 0x48, 0x8D, 0x04, 0x24, 0x48, + 0x8B, 0xF8, 0x33, 0xC0, 0xB9, 0xEC, 0x01, 0x00, 0x00, 0xF3, 0xAA, 0xB8, 0x04, 0x00, 0x00, 0x00, + 0x48, 0x6B, 0xC0, 0x02, 0x8B, 0x04, 0x04, 0x48, 0x8B, 0x8C, 0x24, 0xF0, 0x01, 0x00, 0x00, 0x48, + 0x33, 0xCC, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x48, 0x81, 0xC4, 0x00, 0x02, 0x00, 0x00, 0x5F, 0xC3, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, + 0x48, 0x83, 0xEC, 0x28, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x28, 0xC3 + }; + U8 xdata_payload[] = { + 0x19, 0x1B, 0x03, 0x00, 0x09, 0x01, 0x40, 0x00, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x01, 0x00, 0x00, 0x01, 0x04, 0x01, 0x00, 0x04, 0x42, 0x00, 0x00 + }; + PE_IntelPdata intel_pdata = {0}; + U8 text_payload[] = { 0xC3 }; + + String8 main_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *xdata = coff_obj_writer_push_section(obj_writer, str8_lit(".xdata"), COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_Align4Bytes, str8_array_fixed(xdata_payload)); + COFF_ObjSection *pdata = coff_obj_writer_push_section(obj_writer, str8_lit(".pdata"), COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_Align4Bytes, str8_struct(&intel_pdata)); + COFF_ObjSection *foobar = coff_obj_writer_push_section(obj_writer, str8_lit(".foobar"), COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode|COFF_SectionFlag_Align1Bytes, str8_array_fixed(foobar_payload)); + COFF_ObjSection *text = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode|COFF_SectionFlag_Align1Bytes, str8_array_fixed(text_payload)); + + COFF_ObjSymbol *foobar_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("foobar"), 0, foobar); + + coff_obj_writer_push_symbol_secdef(obj_writer, xdata, COFF_ComdatSelect_Null); + COFF_ObjSymbol *unwind_foobar = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("$unwind$foobar"), 0, xdata); + + coff_obj_writer_push_symbol_secdef(obj_writer, pdata, COFF_ComdatSelect_Null); + coff_obj_writer_push_symbol_static(obj_writer, str8_lit("$pdata$foobar"), 0, pdata); + + coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_unwind_info), unwind_foobar, COFF_Reloc_X64_Addr32Nb); + coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_first), foobar_symbol, COFF_Reloc_X64_Addr32Nb); + coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_one_past_last), foobar_symbol, COFF_Reloc_X64_Addr32Nb); + + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text); + main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("main.obj"), main_obj)); + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj /merge:.pdata=.rdata"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + T_Ok(dim_1u64(pe.data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS]) == 0xC); +} +T_EndTest; + +T_BeginTest(section_sort) +{ + String8 data_obj_name = str8_lit("data.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + COFF_SectionFlags data_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes; + coff_obj_writer_push_section(obj_writer, str8_lit(".data$z"), data_flags, str8_lit("five")); + coff_obj_writer_push_section(obj_writer, str8_lit(".data$a"), data_flags, str8_lit("three")); + coff_obj_writer_push_section(obj_writer, str8_lit(".data$bbbbb"), data_flags, str8_lit("four")); + coff_obj_writer_push_section(obj_writer, str8_lit(".data$"), data_flags, str8_lit("two")); + coff_obj_writer_push_section(obj_writer, str8_lit(".data"), data_flags, str8_lit("one")); + + String8 data_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(data_obj_name, data_obj)); + } + + String8 entry_obj_name = str8_lit("entry.obj"); + U8 entry_text[] = { 0xC3 }; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe data.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *data_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + T_Ok(data_section); + + String8 data = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize)); + String8 expected_data = str8_lit("onetwothreefourfive"); + T_Ok(str8_match(data, expected_data, 0)); +} +T_EndTest; + +T_BeginTest(flag_conf) +{ + COFF_SectionFlags my_sect0_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute; + COFF_SectionFlags my_sect1_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemWrite; + String8 conf_obj_name = str8_lit("conf.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *a_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), my_sect0_flags, str8_lit("one")); + COFF_ObjSection *b_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), my_sect1_flags, str8_lit("two")); + String8 conf_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(conf_obj_name, conf_obj)); + } + + U8 entry_text[] = { 0xC3 }; + String8 entry_obj_name = str8_lit("entry.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe conf.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeaderArray my_sects = coff_section_header_array_from_name(scratch.arena, string_table, section_table, pe.section_count, str8_lit(".mysect")); + T_Ok(my_sects.count == 2); + + COFF_SectionHeader *my_sect0 = &my_sects.v[0]; + COFF_SectionHeader *my_sect1 = &my_sects.v[1]; + T_Ok(my_sect0->flags == my_sect0_flags); + T_Ok(my_sect1->flags == my_sect1_flags); +} +T_EndTest; + +T_BeginTest(invalid_bss) +{ + COFF_SectionFlags bss_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead; + String8 bss_obj_name = str8_lit("bss.obj"); + String8 bss_data = str8_lit("Hello, World"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(obj_writer, str8_lit(".bss"), bss_flags, bss_data); + String8 bss_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(bss_obj_name, bss_obj)); + } + + String8 entry_obj_name = str8_lit("entry.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xC3 }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe bss.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *bss_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".bss")); + T_Ok(bss_sect != 0); + T_Ok(bss_sect->vsize == 0xC); + T_Ok(bss_sect->flags == bss_flags); + String8 data = str8_substr(exe, rng_1u64(bss_sect->foff, bss_sect->foff + bss_sect->vsize)); + T_Ok(str8_match(data, bss_data, 0)); +} +T_EndTest; + +T_BeginTest(common_block) +{ + String8 a_obj_name = str8_lit("a.obj"); + U8 a_data[6] = {0}; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit("A"), 3); + COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(a_data)); + data_sect->flags |= COFF_SectionFlag_Align1Bytes; + coff_obj_writer_push_section(obj_writer, str8_lit(".bss"), PE_BSS_SECTION_FLAGS, str8(0, 1)); // shift common block's initial position + coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr32); + String8 a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(a_obj_name, a_obj)); + } + + String8 b_obj_name = str8_lit("b.obj"); + U8 b_data[9] = { 0 }; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(b_data)); + data_sect->flags |= COFF_SectionFlag_Align1Bytes; + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit("B"), 6); + coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr64); + String8 b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(b_obj_name, b_obj)); + } + + String8 entry_obj_name = str8_lit("entry.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xC3 }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /fixed /largeaddressaware:no /merge:.bss=.comm a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + COFF_SectionHeader *comm_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".comm")); + COFF_SectionHeader *data_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + T_Ok(comm_sect != 0); + T_Ok(data_sect != 0); + + // blocks must be sorted in descending order to reduce alignment padding + T_Ok(comm_sect->vsize == 0x13); + + // ensure linker correctly patched addresses for symbols pointing into common block + String8 data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->fsize)); + U32 *a_addr = (U32 *)data.str; + U64 *b_addr = (U64 *)(data.str + sizeof(a_data)); + T_Ok(*a_addr == (pe.image_base + comm_sect->voff + 0x10)); + T_Ok(*b_addr == (pe.image_base + comm_sect->voff + 0x8)); +} +T_EndTest; + +T_BeginTest(base_relocs) +{ + // main.obj + String8 entry_name = str8_lit("my_entry"); + U64 mov_func_name64 = 2; + U64 mov_func_name32 = 16; + U8 main_text[] = { + 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // mov rax, func_name + 0xff, 0xd0, // call rax + 0x48, 0x31, 0xc0, // xor rax, rax + 0xb8, 0x00, 0x00, 0x00, 0x00, // mov eax, func_name + 0xff, 0xd0, // call rax + 0xc3 // ret + }; + + // func.obj + String8 func_name = str8_lit("foo"); + U8 func_text[] = { 0xc3 }; + + String8 main_obj_name = str8_lit("main.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(main_text)); + COFF_ObjSymbol *func_undef = coff_obj_writer_push_symbol_undef(obj_writer, func_name); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, mov_func_name64, func_undef, COFF_Reloc_X64_Addr64); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, mov_func_name32, func_undef, COFF_Reloc_X64_Addr32); + + // linker must not produce base relocations for absolute symbol + U8 data[4] = {0}; + COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(data)); + COFF_ObjSymbol *abs_symbol = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("abs"), 0x12345678, COFF_SymStorageClass_Static); + coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, abs_symbol, COFF_Reloc_X64_Addr32); + + coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect); + String8 main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(main_obj_name, main_obj)); + } + + String8 func_obj_name = str8_lit("func.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(func_text)); + coff_obj_writer_push_symbol_extern(obj_writer, func_name, 0, text_sect); + String8 func_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(func_obj_name, func_obj)); + } + + String8 out_name = str8_lit("a.exe"); + t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe main.obj func.obj"); + T_Ok(g_last_exit_code == 0); + + // it is illegal to merge .reloc with other sections + t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe /merge:.reloc=.rdata main.obj func.obj"); + if (t_id_linker() == T_Linker_RAD) { + T_Ok(g_last_exit_code == LNK_Error_IllegalSectionMerge); + } else { + T_Ok(g_last_exit_code != 0); + } + + // the other way around is illegal too + t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe /merge:.rdata=.reloc main.obj func.obj"); + if (t_id_linker() == T_Linker_RAD) { + T_Ok(g_last_exit_code == LNK_Error_IllegalSectionMerge); + } else { + T_Ok(g_last_exit_code != 0); + } +} +T_EndTest; + +T_BeginTest(simple_lib_test) +{ + String8 test_payload = str8_lit("The quick brown fox jumps over the lazy dog"); + String8 test_obj = {0}; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_Unknown); + COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8(test_payload.str, test_payload.size+1)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, data_sect); + test_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 test_lib_name = str8_lit("test.lib"); + { + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(lib_writer, str8_lit("test.obj"), test_obj); + String8 test_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + coff_lib_writer_release(&lib_writer); + T_Ok(t_write_file(test_lib_name, test_lib)); + } + + U8 entry_text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0xC3 + }; + String8 entry_obj_name = str8_lit("entry.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); + COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("test")); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, test_symbol, COFF_Reloc_X64_Addr32Nb); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 7, text_sect); + String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(entry_obj_name, entry_obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj test.lib"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + COFF_SectionHeader *data_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->fsize)); + String8 data_data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->fsize)); + + // was test payload linked? + String8 data_string = str8_cstring_capped(data_data.str, data_data.str + data_data.size); + T_Ok(str8_match(data_string, test_payload, 0)); + + // do we have enough bytes to read text? + T_Ok(text_data.size >= sizeof(entry_text)); + + // linker must pull-in test.obj and patch relocation for "test" symbol + U32 *data_addr32nb = (U32 *)(text_data.str+3); + T_Ok(*data_addr32nb == data_sect->voff); +} +T_EndTest; + +T_BeginTest(import_export) +{ + String8 export_obj; + { + String8 export_obj_name = str8_lit("export.obj"); + String8 export_obj_payload = str8_lit("test"); + U8 export_text[] = { + 0x90, // 0: nop + 0x54, // 1: push rsp + 0x48, 0xc7, 0xc0, 0x21, 0x03, 0x00, 0x00, // 2: mov rax, 0x321 + 0x5c, // 9: pop rsp + 0xc3 // 10: ret + }; + + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *data_sect = t_push_data_section(obj_writer, export_obj_payload); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, data_sect); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord"), 1, data_sect); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord2"), 2, data_sect); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord3"), 9, data_sect); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord4"), 10, data_sect); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:foo=foo")); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:bar=foo")); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord,@5")); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord2,@6,DATA")); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord3,@7,NONAME,PRIVATE")); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord4,@8,NONAME,DATA")); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baz=BAZ.qwe")); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baf=BAZ.#1")); + export_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 import_obj; + { + String8 import_obj_name = str8_lit("import.obj"); + U8 import_payload[1024] = {0}; + + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(import_payload)); + + char *import_symbols[] = { + "__imp_foo", + "__imp_bar", + "__imp_baz", + "__imp_baf", + "__imp_ord", + //"__imp_ord2", + //"__imp_ord4", + "bar", + //"baf", + //"baz", + "foo", + "ord", + }; + + for EachElement(i, import_symbols) { + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_cstring(import_symbols[i])); + coff_obj_writer_section_push_reloc_voff(obj_writer, data_sect, i * 4, symbol); + } + + import_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 baz_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *s1 = coff_obj_writer_push_section(obj_writer, str8_lit(".s1"), PE_DATA_SECTION_FLAGS, str8_lit("s1")); + COFF_ObjSection *s2 = coff_obj_writer_push_section(obj_writer, str8_lit(".s2"), PE_DATA_SECTION_FLAGS, str8_lit("s2")); + COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed((U8[]){ 0xC3 })); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("_DllMainCRTStartup"), 0, text_sect); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("s1"), 0, s1); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("s2"), 0, s2); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baf=s1")); + coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baz=s2")); + baz_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + // write objs + T_Ok(t_write_file(str8_lit("export.obj"), export_obj)); + T_Ok(t_write_file(str8_lit("import.obj"), import_obj)); + T_Ok(t_write_file(str8_lit("baz.obj"), baz_obj)); + T_Ok(t_write_entry_obj()); + + // link dlls + t_invoke_linkerf("/dll /out:export.dll libcmt.lib export.obj"); // export.dll + T_Ok(g_last_exit_code == 0); + t_invoke_linkerf("/dll /out:baz.dll /export:s1,@1,NONAME /export:qwe=s2 baz.obj"); // baz.dll + T_Ok(g_last_exit_code == 0); + + // validate export table in export.dll + if (t_id_linker() == T_Linker_RAD) { + // validate export table in export.dll + { + String8 dll = t_read_file(scratch.arena, str8_lit("export.dll")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, dll); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(dll, pe.section_table_range).str; + PE_ParsedExportTable export_table = pe_exports_from_data(scratch.arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]); + + // validate header + T_Ok(export_table.flags == 0); + T_Ok(export_table.time_stamp == COFF_TimeStamp_Max); + T_Ok(export_table.major_ver == 0); + T_Ok(export_table.minor_ver == 0); + T_Ok(export_table.ordinal_base == 5); + T_Ok(export_table.export_count == 8); + + // validate names + T_Ok(str8_match(export_table.exports[0].name, str8_lit("baf"), 0)); + T_Ok(str8_match(export_table.exports[1].name, str8_lit("bar"), 0)); + T_Ok(str8_match(export_table.exports[2].name, str8_lit("baz"), 0)); + T_Ok(str8_match(export_table.exports[3].name, str8_lit("foo"), 0)); + T_Ok(str8_match(export_table.exports[4].name, str8_lit("ord"), 0)); + T_Ok(str8_match(export_table.exports[5].name, str8_lit("ord2"), 0)); + T_Ok(export_table.exports[6].name.size == 0); + T_Ok(export_table.exports[7].name.size == 0); + + // validate forwarders + T_Ok(str8_match(export_table.exports[0].forwarder, str8_lit("BAZ.#1"), 0)); + T_Ok(export_table.exports[1].forwarder.size == 0); + T_Ok(str8_match(export_table.exports[2].forwarder, str8_lit("BAZ.qwe"), 0)); + T_Ok(export_table.exports[3].forwarder.size == 0); + T_Ok(export_table.exports[4].forwarder.size == 0); + T_Ok(export_table.exports[5].forwarder.size == 0); + T_Ok(export_table.exports[6].forwarder.size == 0); + T_Ok(export_table.exports[7].forwarder.size == 0); + + // validate voffs + T_Ok(export_table.exports[0].voff == 0x20070); + T_Ok(export_table.exports[1].voff == 0x19000); + T_Ok(export_table.exports[2].voff == 0x20077); + T_Ok(export_table.exports[3].voff == 0x19000); + T_Ok(export_table.exports[4].voff == 0x19001); + T_Ok(export_table.exports[5].voff == 0x19002); + T_Ok(export_table.exports[6].voff == 0x19009); + T_Ok(export_table.exports[7].voff == 0x1900a); + + // validate ordinals + T_Ok(export_table.exports[0].ordinal == 9); + T_Ok(export_table.exports[1].ordinal == 10); + T_Ok(export_table.exports[2].ordinal == 11); + T_Ok(export_table.exports[3].ordinal == 12); + T_Ok(export_table.exports[4].ordinal == 5); + T_Ok(export_table.exports[5].ordinal == 6); + T_Ok(export_table.exports[6].ordinal == 7); + T_Ok(export_table.exports[7].ordinal == 8); + } + + // validate export table in baz.dll + { + String8 dll = t_read_file(scratch.arena, str8_lit("baz.dll")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, dll); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(dll, pe.section_table_range).str; + PE_ParsedExportTable export_table = pe_exports_from_data(scratch.arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]); + + // validate header + T_Ok(export_table.flags == 0); + T_Ok(export_table.time_stamp == COFF_TimeStamp_Max); + T_Ok(export_table.major_ver == 0); + T_Ok(export_table.minor_ver == 0); + T_Ok(export_table.ordinal_base == 1); + T_Ok(export_table.export_count == 4); + + // validate names + T_Ok(str8_match(export_table.exports[0].name, str8_lit("baf"), 0)); + T_Ok(str8_match(export_table.exports[1].name, str8_lit("baz"), 0)); + T_Ok(str8_match(export_table.exports[2].name, str8_lit("qwe"), 0)); + T_Ok(str8_match(export_table.exports[3].name, str8_zero(), 0)); + + // validate forwarders + T_Ok(str8_match(export_table.exports[0].forwarder, str8_zero(), 0)); + T_Ok(str8_match(export_table.exports[1].forwarder, str8_zero(), 0)); + T_Ok(str8_match(export_table.exports[2].forwarder, str8_zero(), 0)); + T_Ok(str8_match(export_table.exports[3].forwarder, str8_zero(), 0)); + + // validate voffs + T_Ok(export_table.exports[0].voff == 0x2000); + T_Ok(export_table.exports[1].voff == 0x3000); + T_Ok(export_table.exports[2].voff == 0x3000); + T_Ok(export_table.exports[3].voff == 0x2000); + + // validate ordinals + T_Ok(export_table.exports[0].ordinal == 2); + T_Ok(export_table.exports[1].ordinal == 3); + T_Ok(export_table.exports[2].ordinal == 4); + T_Ok(export_table.exports[3].ordinal == 1); + } + + } + + #if OS_WINDOWS + { + T_Ok(SetDllDirectoryA((LPCSTR)g_wdir.str)); + HANDLE export_dll = LoadLibrary("export.dll"); + T_Ok(export_dll); + + // test query by function name + //T_Ok(GetProcAddress(export_dll, "baf")); + T_Ok(GetProcAddress(export_dll, "bar")); + //T_Ok(GetProcAddress(export_dll, "baz")); + T_Ok(GetProcAddress(export_dll, "foo")); + T_Ok(GetProcAddress(export_dll, "ord")); + T_Ok(GetProcAddress(export_dll, "ord2")); + + // test query by ordinal + //T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(9))); + T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(10))); + //T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(11))); + T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(12))); + T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(5))); + T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(6))); + T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(7))); + T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(8))); + } + #endif + + //T_Ok(t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /delayload:export.dll /export:entry kernel32.Lib delayimp.lib libcmt.lib export.lib import.obj entry.obj") == 0); + // TODO: check import table +} +T_EndTest; + +T_BeginTest(image_base) +{ + String8 obj_name = str8_lit("image_base.obj"); + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00, // lea rcx, [__ImageBase] + 0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // mov rax, __ImageBase + 0xB8, 0x00, 0x00, 0x00, 0x00, // mov eax, __ImageBase + 0xC3 // ret + }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + COFF_ObjSymbol *image_base_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__ImageBase")); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, image_base_symbol, COFF_Reloc_X64_Rel32); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 9, image_base_symbol, COFF_Reloc_X64_Addr64); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 18, image_base_symbol, COFF_Reloc_X64_Addr32Nb); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(obj_name, obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /base:0x2000000140000000 /out:a.exe image_base.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_section); + + U8 expected_text[] = { + 0x48, 0x8D, 0x0D, 0xF9, 0xEF, 0xFF, 0xFF, + 0x48, 0xB8, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x20, + 0xB8, 0x00, 0x00, 0x00, 0x00, + 0xC3 + }; + String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + sizeof(expected_text))); + T_Ok(str8_match(text_data, str8_array_fixed(expected_text), 0)); +} +T_EndTest; + +T_BeginTest(comdat_any) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test$mn"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("1")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any); + COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + test->type.u.msb = COFF_SymDType_Func; + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("1.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test$mn"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("2")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any); + COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("2.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + { + t_invoke_linkerf("/subsystem:console /entry:entry /out:1.exe 1.obj 2.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + String8 exe = t_read_file(scratch.arena, str8_lit("1.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); + String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(data, str8_lit("1"), 0)); + } + + { + t_invoke_linkerf("/subsystem:console /entry:entry /out:2.exe 2.obj 1.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + String8 exe = t_read_file(scratch.arena, str8_lit("2.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); + String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(data, str8_lit("2"), 0)); + } +} +T_EndTest; + +T_BeginTest(comdat_no_duplicates) +{ + String8 test_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); + coff_obj_writer_push_symbol_secdef(obj_writer, test_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("a"), 0, test_sect); + test_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("a")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), test_obj)); + T_Ok(t_write_file(str8_lit("b.obj"), test_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe a.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); + T_Ok(sect); + String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(data, str8_lit("a"), 0)); +} +T_EndTest; + +T_BeginTest(comdat_same_size) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("a.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("b")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("b.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".c"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("cc")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("c.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); + T_Ok(sect != 0); + String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(data, str8_lit("a"), 0)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe a.obj b.obj c.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } +} +T_EndTest; + +T_BeginTest(comdat_exact_match) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("a.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a2"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("a2.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("b")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("b.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj"); + T_Ok(g_last_exit_code != 0); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe entry.obj a2.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a2")); + T_Ok(sect != 0); + String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(data, str8_lit("a"), 0)); + } +} +T_EndTest; + +T_BeginTest(comdat_largest) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("a.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bb")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("b.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".c"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("c")); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("c.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry entry.obj a.obj b.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *discard_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); + T_Ok(discard_sect == 0); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".b")); + T_Ok(sect != 0); + String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(data, str8_lit("bb"), 0)); + } + + t_invoke_linkerf("/subsystem:console /out:b.exe /entry:entry entry.obj c.obj a.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".c")); + T_Ok(sect != 0); + String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + T_Ok(str8_match(data, str8_lit("c"), 0)); + } +} +T_EndTest; + +T_BeginTest(comdat_associative) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit("a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); + COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit("aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("aa")); + coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); + coff_obj_writer_push_symbol_associative(obj_writer, aa, a); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("a.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + COFF_ObjSection *bb = coff_obj_writer_push_section(obj_writer, str8_lit("bb"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bb")); + COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit("b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("b")); + COFF_ObjSection *bbb = coff_obj_writer_push_section(obj_writer, str8_lit("bbb"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bbb")); + coff_obj_writer_push_symbol_secdef(obj_writer, bb, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_associative(obj_writer, b, bb); + coff_obj_writer_push_symbol_associative(obj_writer, bbb, bb); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, bb); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("b.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *a = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("a")); + COFF_SectionHeader *aa = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("aa")); + COFF_SectionHeader *b = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("b")); + COFF_SectionHeader *bb = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("bb")); + COFF_SectionHeader *bbb = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit("bbb")); + T_Ok(a == 0); + T_Ok(aa == 0); + T_Ok(b != 0); + T_Ok(bb != 0); + T_Ok(bbb != 0); + String8 b_data = str8_substr(exe, rng_1u64(b->foff, b->foff + b->vsize)); + String8 bb_data = str8_substr(exe, rng_1u64(bb->foff, bb->foff + bb->vsize)); + String8 bbb_data = str8_substr(exe, rng_1u64(bbb->foff, bbb->foff + bbb->vsize)); + T_Ok(str8_match(b_data, str8_lit("b"), 0)); + T_Ok(str8_match(bb_data, str8_lit("bb"), 0)); + T_Ok(str8_match(bbb_data, str8_lit("bbb"), 0)); +} +T_EndTest; + +T_BeginTest(comdat_associative_loop) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *aaaa = coff_obj_writer_push_section(obj_writer, str8_lit(".aaaa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aaaa")); + COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(".aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aa")); + COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); + COFF_ObjSection *aaa = coff_obj_writer_push_section(obj_writer, str8_lit(".aaa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aaa")); + coff_obj_writer_push_symbol_associative(obj_writer, aaa, aa); + coff_obj_writer_push_symbol_associative(obj_writer, aaaa, aaa); + coff_obj_writer_push_symbol_associative(obj_writer, a, aa); + coff_obj_writer_push_symbol_associative(obj_writer, aa, a); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("loop.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe loop.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_AssociativeLoop); } +} +T_EndTest; + +T_BeginTest(comdat_associative_non_comdat) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); + COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS, str8_lit("b")); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); + coff_obj_writer_push_symbol_associative(obj_writer, b, a); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("test.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj test.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *a = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); + COFF_SectionHeader *b = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".b")); + T_Ok(a != 0); + T_Ok(b != 0); + String8 a_data = str8_substr(exe, rng_1u64(a->foff, a->foff + a->vsize)); + String8 b_data = str8_substr(exe, rng_1u64(b->foff, b->foff + b->vsize)); + T_Ok(str8_match(a_data, str8_lit("a"), 0)); + T_Ok(str8_match(b_data, str8_lit("b"), 0)); +} +T_EndTest; + +T_BeginTest(comdat_associative_out_of_bounds) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); + COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(".aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("aa")); + coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Any); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); + coff_obj_writer_push_symbol_associative(obj_writer, aa, a); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + { + COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj); + String8 string_table = str8_substr(obj, header.string_table_range); + String8 symbol_table = str8_substr(obj, header.symbol_table_range); + COFF_ParsedSymbol symbol = coff_parse_symbol(header, string_table, symbol_table, 3); + AssertAlways(str8_match(symbol.name, str8_lit(".aa"), 0)); + AssertAlways(symbol.aux_symbol_count == 1); + COFF_Symbol16 *symbol16 = symbol.raw_symbol; + COFF_SymbolSecDef *secdef = (COFF_SymbolSecDef *)(symbol16 + 1); + secdef->number_lo = 321; + } + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("bad.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj"); + T_Ok(g_last_exit_code != 0); + if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_IllData); } +} +T_EndTest; + +T_BeginTest(comdat_with_offset) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 a[] = "1Hello, World!"; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("a.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 a[] = "Hello, World!"; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("b.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code == 0); +} +T_EndTest; + +T_BeginTest(reloc_against_removed_comdat) +{ + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 a[] = "1Hello, World!"; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 b_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 a[] = "H"; + COFF_ObjSection *comdat_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); + coff_obj_writer_push_symbol_secdef(obj_writer, comdat_sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, comdat_sect); + COFF_ObjSymbol *static_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("STATIC"), 2, comdat_sect); + + U8 rdata[4] = {0}; + COFF_ObjSection *regular_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS, str8_array_fixed(rdata)); + coff_obj_writer_section_push_reloc_voff(obj_writer, regular_sect, 0, static_symbol); + + b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code == LNK_Error_RelocationAgainstRemovedSection); +} +T_EndTest; + +T_BeginTest(sect_align) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + COFF_ObjSection *sect_align_shift = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("q")); + COFF_ObjSection *sect_align_none = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("abc")); + COFF_ObjSection *sect_align_1 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_lit("wr")); + COFF_ObjSection *sect_align_2 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, str8_lit("e")); + COFF_ObjSection *sect_align_4 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_lit("ttttt")); + COFF_ObjSection *sect_align_8 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align8Bytes, str8_lit("g")); + COFF_ObjSection *sect_align_16 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align16Bytes, str8_lit("o")); + COFF_ObjSection *sect_align_32 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align32Bytes, str8_lit("p")); + COFF_ObjSection *sect_align_64 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align64Bytes, str8_lit("f")); + COFF_ObjSection *sect_align_128 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align128Bytes, str8_lit("x")); + COFF_ObjSection *sect_align_256 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align256Bytes, str8_lit("c")); + COFF_ObjSection *sect_align_512 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align512Bytes, str8_lit("v")); + COFF_ObjSection *sect_align_1024 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1024Bytes, str8_lit("b")); + COFF_ObjSection *sect_align_2048 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align2048Bytes, str8_lit("n")); + COFF_ObjSection *sect_align_4096 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align4096Bytes, str8_lit("m")); + COFF_ObjSection *sect_align_8192 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align8192Bytes, str8_lit("z")); + + U8 text[] = { 0xC3 }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); + + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("test.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /align:8192 test.obj"); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".a")); + T_Ok(sect); + String8 sect_data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); + + String8 shift = str8_substr(sect_data, rng_1u64(0, 1)); + T_Ok(str8_match(shift, str8_lit("q"), 0)); + String8 a_none = str8_substr(sect_data, rng_1u64(16, 16 + 3)); + T_Ok(str8_match(a_none, str8_lit("abc"), 0)); + String8 a_1 = str8_substr(sect_data, rng_1u64(19, 21)); + T_Ok(str8_match(a_1, str8_lit("wr"), 0)); + String8 a_2 = str8_substr(sect_data, rng_1u64(22, 23)); + T_Ok(str8_match(a_2, str8_lit("e"), 0)); + String8 a_4 = str8_substr(sect_data, rng_1u64(24, 29)); + T_Ok(str8_match(a_4, str8_lit("ttttt"), 0)); + String8 a_8 = str8_substr(sect_data, rng_1u64(32, 33)); + T_Ok(str8_match(a_8, str8_lit("g"), 0)); + String8 a_16 = str8_substr(sect_data, rng_1u64(48, 49)); + T_Ok(str8_match(a_16, str8_lit("o"), 0)); + String8 a_32 = str8_substr(sect_data, rng_1u64(64, 65)); + T_Ok(str8_match(a_32, str8_lit("p"), 0)); + String8 a_64 = str8_substr(sect_data, rng_1u64(128, 129)); + T_Ok(str8_match(a_64, str8_lit("f"), 0)); + String8 a_128 = str8_substr(sect_data, rng_1u64(256, 257)); + T_Ok(str8_match(a_128, str8_lit("x"), 0)); + String8 a_256 = str8_substr(sect_data, rng_1u64(512, 513)); + T_Ok(str8_match(a_256, str8_lit("c"), 0)); + String8 a_512 = str8_substr(sect_data, rng_1u64(1024, 1025)); + T_Ok(str8_match(a_512, str8_lit("v"), 0)); + String8 a_1024 = str8_substr(sect_data, rng_1u64(2048, 2049)); + T_Ok(str8_match(a_1024, str8_lit("b"), 0)); + String8 a_2048 = str8_substr(sect_data, rng_1u64(4096, 4097)); + T_Ok(str8_match(a_2048, str8_lit("n"), 0)); + String8 a_4096 = str8_substr(sect_data, rng_1u64(8192, 8193)); + T_Ok(str8_match(a_4096, str8_lit("m"), 0)); + String8 a_8192 = str8_substr(sect_data, rng_1u64(16384, 16385)); + T_Ok(str8_match(a_8192, str8_lit("z"), 0)); +} +T_EndTest; + +T_BeginTest(alt_name) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("test.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("foo")); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("foo.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + // basic alternate name test + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:foo=test test.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + // linker should not chase alt name links + t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe /alternatename:foo=bar /alternatename:bar=test test.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + + // alt name conflict + t_invoke_linkerf("/subsystem:console /entry:entry /out:c.exe /alternatename:foo=test /alternatename:foo=qwe test.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + + // syntax error + t_invoke_linkerf("/subsystem:console /entry:entry /out:d.exe /alternatename:foo foo.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + + // syntax error + t_invoke_linkerf("/subsystem:console /entry:entry /out:e.exe /alternatename:foo-oof foo.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + + // syntax error + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:foo=test=bar foo.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + + // syntax error + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:foo= foo.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + + // syntax error + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:= foo.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + + // syntax error + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename: foo.obj entry.obj"); + T_Ok(g_last_exit_code != 0); + + // TODO: check that RAD Linker prints these warnings + + // warn about alt name to self alt name? + t_invoke_linkerf("/subsystem:console /entry:entry /out:f.exe /alternatename:foo=foo foo.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + // warn about alt name to unknown symbol? + t_invoke_linkerf("/subsystem:console /entry:entry /out:g.exe /alternatename:qwe=ewq foo.obj entry.obj"); + T_Ok(g_last_exit_code == 0); +} +T_EndTest; + +T_BeginTest(include) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("foo")); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("include.obj"), obj)); + + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(lib_writer, str8_lit("include.obj"), obj); + String8 lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + coff_lib_writer_release(&lib_writer); + T_Ok(t_write_file(str8_lit("include.lib"), lib)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + // simple include test + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /include:foo entry.obj include.lib"); + T_Ok(g_last_exit_code == 0); + + // validate that linker pulled-in include.obj + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *foo_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + T_Ok(foo_sect != 0); + String8 foo_data = str8_substr(exe, rng_1u64(foo_sect->foff, foo_sect->foff + foo_sect->vsize)); + T_Ok(str8_match(foo_data, str8_lit("foo"), 0)); + } + + // test unresolved include + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /include:ewq entry.obj"); + T_Ok(g_last_exit_code != 0); + if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } +} +T_EndTest; + +T_BeginTest(communal_var_vs_regular) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_common(obj_writer, str8_lit("TEST"), 1); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("communal.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("defn.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + // linker should replace communal TEST with .data TEST + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe communal.obj defn.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe defn.obj communal.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + char *exes[] = { "a.exe", "b.exe" }; + for EachElement(i, exes) { + String8 exe = t_read_file(scratch.arena, str8_cstring(exes[i])); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *data_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + T_Ok(data_sect); + String8 data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->vsize)); + T_Ok(str8_match(data, str8_lit("test"), 0)); + } +} +T_EndTest; + +T_BeginTest(communal_var_vs_regular_comdat) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_common(obj_writer, str8_lit("TEST"), 1); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("communal.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); + sect->flags |= COFF_SectionFlag_LnkCOMDAT; + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("large.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + // linker should replace communal TEST with .data TEST + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe communal.obj large.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe large.obj communal.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + char *exes[] = { "a.exe", "b.exe" }; + for EachElement(i, exes) { + String8 exe = t_read_file(scratch.arena, str8_cstring(exes[i])); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *data_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); + T_Ok(data_sect); + String8 data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->vsize)); + T_Ok(str8_match(data, str8_lit("test"), 0)); + } +} +T_EndTest; + +T_BeginTest(import_kernel32) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 data[] = "test"; + U8 text[] = { + 0x48, 0x83, 0xec, 0x68, // sub rsp,68h ; alloc space on stack + 0xc7, 0x44, 0x24, 0x48, 0x18, 0x00, 0x00, 0x00, // mov dword ptr [rsp+48h],18h ; SECURITY_ATTRIBUTES.nLength + 0x48, 0xc7, 0x44, 0x24, 0x50, 0x00, 0x00, 0x00, 0x00, // mov qword ptr [rsp+50h],0 ; SECURITY_ATTRIBUTES.lpSecurityDescriptor + 0xc7, 0x44, 0x24, 0x58, 0x00, 0x00, 0x00, 0x00, // mov dword ptr [rsp+58h],0 ; SECURITY_ATTRIBUTES.bInheritHandle + 0x48, 0xc7, 0x44, 0x24, 0x30, 0x00, 0x00, 0x00, 0x00, // mov qword ptr [rsp+30h],0 ; hTemplateFile + 0xc7, 0x44, 0x24, 0x28, 0x80, 0x00, 0x00, 0x00, // mov dword ptr [rsp+28h],80h ; dwFlagsAndAttributes + 0xc7, 0x44, 0x24, 0x20, 0x02, 0x00, 0x00, 0x00, // mov dword ptr [rsp+20h],2 ; dwCreationDisposition + 0x4c, 0x8d, 0x4c, 0x24, 0x48, // lea r9,[rsp+48h] ; lpSecurityAttributes + 0x45, 0x33, 0xc0, // xor r8d,r8d ; dwShareMode + 0xba, 0x00, 0x00, 0x00, 0x40, // mov edx,40000000h ; dwDesiredAccess + 0x48, 0x8d, 0x0d, 0x00, 0x00, 0x00, 0x00, // lea rcx,[test] ; lpFileName + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, // call qword ptr [__imp_CreateFileA] ; call CreateFileA + 0x48, 0x89, 0xc1, // mov rcx,rax ; hObject + 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, // call qword ptr [__imp_CloseHandle] ; call CloseHandle + 0x33, 0xc0, // xor eax,eax ; clear result + 0x48, 0x83, 0xc4, 0x68, // add rsp,68h ; dealloc stack + 0xc3 // ret ; return + }; + COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_array_fixed(data)); + COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + COFF_ObjSymbol *data_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, data_sect); + COFF_ObjSymbol *entry_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); + COFF_ObjSymbol *create_file_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_CreateFileA")); + COFF_ObjSymbol *close_handle_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_CloseHandle")); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 70, data_symbol, COFF_Reloc_X64_Rel32); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 76, create_file_symbol, COFF_Reloc_X64_Rel32); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 85, close_handle_symbol, COFF_Reloc_X64_Rel32); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("import.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed import.obj kernel32.lib"); + T_Ok(g_last_exit_code == 0); + +#if OS_WINDOWS + { + String8 test_file_path = push_str8f(scratch.arena, "%S/test", g_wdir); + os_delete_file_at_path(test_file_path); + + OS_ProcessLaunchParams launch_opts = {0}; + launch_opts.inherit_env = 0; + launch_opts.path = g_wdir; + str8_list_pushf(scratch.arena, &launch_opts.cmd_line, "%S/a.exe", g_wdir); + OS_Handle handle = os_process_launch(&launch_opts); + AssertAlways(!os_handle_match(handle, os_handle_zero())); + U64 exit_code = max_U64; + os_process_join(handle, max_U64, &exit_code); + os_process_detach(handle); + T_Ok(exit_code == 0); + T_Ok(os_file_path_exists(test_file_path)); + } +#endif +} +T_EndTest; + +T_BeginTest(delay_import) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 return_0[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, 0 + 0xc3 // ret + }; + U8 return_1[] = { + 0x48, 0xC7, 0xC0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 + 0xc3 // ret + }; + U8 return_2[] = { + 0x48, 0xC7, 0xC0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 + 0xc3 // ret + }; + COFF_ObjSection *return_0_sect = t_push_text_section(obj_writer, str8_array_fixed(return_0)); + COFF_ObjSection *return_1_sect = t_push_text_section(obj_writer, str8_array_fixed(return_1)); + COFF_ObjSection *return_2_sect = t_push_text_section(obj_writer, str8_array_fixed(return_2)); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_1"), 0, return_1_sect); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_2"), 0, return_2_sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("a.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 return_0[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, 0 + 0xc3 // ret + }; + U8 return_123[] = { + 0x48, 0xC7, 0xC0, 0x7B, 0x00, 0x00, 0x00, // mov rax, 123 + 0xc3 // ret + }; + U8 return_321[] = { + 0x48, 0xC7, 0xC0, 0x41, 0x01, 0x00, 0x00, // mov rax, 321 + 0xc3 // ret + }; + COFF_ObjSection *return_0_sect = t_push_text_section(obj_writer, str8_array_fixed(return_0)); + COFF_ObjSection *return_123_sect = t_push_text_section(obj_writer, str8_array_fixed(return_123)); + COFF_ObjSection *return_321_sect = t_push_text_section(obj_writer, str8_array_fixed(return_321)); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_123"), 0, return_123_sect); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_321"), 0, return_321_sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("b.obj"), obj)); + } + + { + U8 text[] = { + 0x56, // push rsi + 0x57, // push rdi + 0x48, 0x83, 0xEC, 0x28, // sub rsp,28h + 0xE8, 0x00, 0x00, 0x00, 0x00, // call return_1 + 0x89, 0xC6, // mov esi,eax + 0xE8, 0x00, 0x00, 0x00, 0x00, // call return_2 + 0x89, 0xC7, // mov edi,eax + 0x01, 0xF7, // add edi,esi + 0xE8, 0x00, 0x00, 0x00, 0x00, // call return_123 + 0x89, 0xC6, // mov esi,eax + 0xE8, 0x00, 0x00, 0x00, 0x00, // call return_321 + 0x01, 0xF0, // add eax,esi + 0x01, 0xF8, // add eax,edi + 0x48, 0x83, 0xC4, 0x28, // add rsp,28h + 0x5F, // pop rdi + 0x5E, // pop rsi + 0xC3, // ret + }; + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); + COFF_ObjSymbol *return_1_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_1")); + COFF_ObjSymbol *return_2_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_2")); + COFF_ObjSymbol *return_123_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_123")); + COFF_ObjSymbol *return_321_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_321")); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 7, return_1_symbol, COFF_Reloc_X64_Rel32); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 14, return_2_symbol, COFF_Reloc_X64_Rel32); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 23, return_123_symbol, COFF_Reloc_X64_Rel32); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 30, return_321_symbol, COFF_Reloc_X64_Rel32); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("main.obj"), obj)); + } + + t_invoke_linkerf("/dll /implib:a.lib /export:return_1 /export:return_2 a.obj libcmt.lib"); + T_Ok(g_last_exit_code == 0); + + t_invoke_linkerf("/dll /implib:b.lib /export:return_123 /export:return_321 b.obj libcmt.lib"); + T_Ok(g_last_exit_code == 0); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed /debug:full main.obj a.lib b.lib kernel32.lib delayimp.lib libcmt.lib /delayload:a.dll /delayload:b.dll"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + PE_ParsedDelayImportTable delay_import_table = pe_delay_imports_from_data(scratch.arena, pe.is_pe32, pe.section_count, section_table, exe, pe.data_dir_franges[PE_DataDirectoryIndex_DELAY_IMPORT]); + + PE_ParsedDelayDLLImport *a_import = &delay_import_table.v[0]; + T_Ok(a_import->attributes == 1); + T_Ok(str8_match(a_import->name, str8_lit("a.dll"), 0)); + T_Ok(a_import->module_handle_voff != 0); + T_Ok(a_import->name_table_voff != 0); + T_Ok(a_import->bound_table_voff != 0); + T_Ok(a_import->unload_table_voff != 0); + T_Ok(a_import->time_stamp == 0); + T_Ok(a_import->bound_table_count == 2); + T_Ok(a_import->unload_table_count == 2); + T_Ok(a_import->import_count == 2); + + PE_ParsedImport *return_1 = &a_import->imports[0]; + T_Ok(return_1->type == PE_ParsedImport_Name); + T_Ok(str8_match(return_1->u.name.string, str8_lit("return_1"), 0)); + T_Ok(return_1->u.name.hint == 0); + + PE_ParsedImport *return_2 = &a_import->imports[1]; + T_Ok(return_2->type == PE_ParsedImport_Name); + T_Ok(str8_match(return_2->u.name.string, str8_lit("return_2"), 0)); + T_Ok(return_2->u.name.hint == 1); + + PE_ParsedDelayDLLImport *b_import = &delay_import_table.v[1]; + T_Ok(b_import->attributes == 1); + T_Ok(str8_match(b_import->name, str8_lit("b.dll"), 0)); + T_Ok(b_import->module_handle_voff != 0); + T_Ok(b_import->name_table_voff != 0); + T_Ok(b_import->bound_table_voff != 0); + T_Ok(b_import->unload_table_voff != 0); + T_Ok(b_import->time_stamp == 0); + T_Ok(b_import->bound_table_count == 2); + T_Ok(b_import->unload_table_count == 2); + T_Ok(b_import->import_count == 2); + + PE_ParsedImport *return_123 = &b_import->imports[0]; + T_Ok(return_123->type == PE_ParsedImport_Name); + T_Ok(str8_match(return_123->u.name.string, str8_lit("return_123"), 0)); + T_Ok(return_123->u.name.hint == 0); + + PE_ParsedImport *return_321 = &b_import->imports[1]; + T_Ok(return_321->type == PE_ParsedImport_Name); + T_Ok(str8_match(return_321->u.name.string, str8_lit("return_321"), 0)); + T_Ok(return_321->u.name.hint == 1); +} +T_EndTest; + +T_BeginTest(delay_import_user32) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".str"), PE_DATA_SECTION_FLAGS, str8_zero()); + U64 msg_off = data_sect->data.total_size; + str8_list_pushf(obj_writer->arena, &data_sect->data, "test\0"); + U64 caption_off = data_sect->data.total_size; + str8_list_pushf(obj_writer->arena, &data_sect->data, "foo\0"); + COFF_ObjSymbol *msg_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("msg"), msg_off, data_sect); + COFF_ObjSymbol *caption_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("caption"), caption_off, data_sect); + + U8 text[] = { + 0x48, 0x83, 0xEC, 0x28, // sub rsp,28h + 0x45, 0x33, 0xC9, // xor r9d,r9d + 0x4C, 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00, // lea r8,[msg] + 0x48, 0x8D, 0x15, 0x00, 0x00, 0x00, 0x00, // lea rdx,[caption] + 0x33, 0xC9, // xor ecx,ecx + 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, // call qword ptr [__imp_MessageBoxA] + 0x33, 0xC0, // xor eax,eax + 0x48, 0x83, 0xC4, 0x28, // add rsp,28h + 0xC3, // ret + }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + COFF_ObjSymbol *text_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); + COFF_ObjSymbol *message_box_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_MessageBoxA")); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 10, msg_symbol, COFF_Reloc_X64_Rel32); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 17, caption_symbol, COFF_Reloc_X64_Rel32); + coff_obj_writer_section_push_reloc(obj_writer, text_sect, 25, message_box_symbol, COFF_Reloc_X64_Rel32); + + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("delay_import.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry /fixed /delayload:user32.dll kernel32.lib user32.lib libcmt.lib delayimp.lib delay_import.obj /debug:full"); + T_Ok(g_last_exit_code == 0); +} +T_EndTest; + +T_BeginTest(empty_section) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *test = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_TEXT_SECTION_FLAGS, str8(0,0)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, test); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("empty_section.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe empty_section.obj entry.obj"); + T_Ok(g_last_exit_code != 0); +} +T_EndTest; + +T_BeginTest(removed_section) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 test_text[] = { 0xc3 }; + COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkRemove, str8_array_fixed(test_text)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, test_sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("test.obj"), obj)); + } + + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); + COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); + coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("entry.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.obj entry.obj"); + T_Ok(g_last_exit_code != 0); +} +T_EndTest; + +T_BeginTest(function_pad_min) +{ + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 ret[] = { 0xc3 }; + COFF_ObjSection *text_sect_0 = t_push_text_section(obj_writer, str8_array_fixed(ret)); + COFF_ObjSection *text_sect_1 = t_push_text_section(obj_writer, str8_array_fixed(ret)); + COFF_ObjSection *text_sect_2 = t_push_text_section(obj_writer, str8_array_fixed(ret)); + text_sect_0->flags |= COFF_SectionFlag_Align4Bytes; + text_sect_1->flags |= COFF_SectionFlag_Align2Bytes; + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("A"), 0, text_sect_0); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("B"), 0, text_sect_1); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("C"), 0, text_sect_2); + String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + T_Ok(t_write_file(str8_lit("funcs.obj"), obj)); + } + + t_invoke_linkerf("/subsystem:console /entry:A /functionpadmin:1 /out:a.exe funcs.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + T_Ok(text_sect != 0); + String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize)); + + U8 expected_text[] = { + 0xcc, 0xcc, 0xcc, 0xcc, 0xc3, + 0xcc, 0xcc, 0xcc, 0xc3, + 0xcc, 0xc3, + }; + T_Ok(str8_match(text_data, str8_array_fixed(expected_text), 0)); +} +T_EndTest; + +T_BeginTest(first_member_header) +{ + String8 obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("8"), 0x8, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("1"), 0x1, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("9"), 0x9, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("7"), 0x7, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("4"), 0x4, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("5"), 0x5, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("2"), 0x2, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("3"), 0x3, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("6"), 0x6, COFF_SymStorageClass_External); + obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 lib; + { + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(lib_writer, str8_lit("obj.obj"), obj); + lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 0); + coff_lib_writer_release(&lib_writer); + } + + T_Ok(t_write_file(str8_lit("test.lib"), lib)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9"); + T_Ok(g_last_exit_code == 0); +} +T_EndTest; + +T_BeginTest(second_member_header) +{ + String8 obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("8"), 0x8, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("1"), 0x1, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("9"), 0x9, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("7"), 0x7, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("4"), 0x4, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("5"), 0x5, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("2"), 0x2, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("3"), 0x3, COFF_SymStorageClass_External); + coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("6"), 0x6, COFF_SymStorageClass_External); + obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 lib; + { + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(lib_writer, str8_lit("obj.obj"), obj); + lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + coff_lib_writer_release(&lib_writer); + } + + T_Ok(t_write_file(str8_lit("test.lib"), lib)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9"); + T_Ok(g_last_exit_code == 0); +} +T_EndTest; + +T_BeginTest(defer_impl_link_to_second_search_pass) +{ + String8 imp_ref_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xc3 }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("entry"), 0, sect); + coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_foo")); + coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("func")); // force linker to pull obj from the lib + imp_ref_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 impl_ref_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xc3 }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("func"), 0, sect); + coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); // on a second search pass force linker to look up same import + impl_ref_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 impl_ref_lib; + { + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(lib_writer, str8_lit("impl_ref.obj"), impl_ref_obj); + impl_ref_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + coff_lib_writer_release(&lib_writer); + } + + String8 foo_lib; + { + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_import(lib_writer, COFF_MachineType_X64, ~0u, str8_lit("foo.dll"), COFF_ImportBy_Name, str8_lit("foo"), 0, COFF_ImportHeader_Code); + foo_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + coff_lib_writer_release(&lib_writer); + } + + T_Ok(t_write_file(str8_lit("imp_ref.obj"), imp_ref_obj)); + T_Ok(t_write_file(str8_lit("impl_ref.lib"), impl_ref_lib)); + T_Ok(t_write_file(str8_lit("foo.lib"), foo_lib)); + T_Ok(t_write_file(str8_lit("foo2.lib"), foo_lib)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe foo.lib foo2.lib imp_ref.obj impl_ref.lib"); + T_Ok(g_last_exit_code == 0); +} +T_EndTest; + +T_BeginTest(opt_ref_dangling_section) +{ + String8 entry_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { + 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm + 0xC3 // ret + }; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("f")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); + entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 a_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + U8 data[] = "A0000"; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(data)); + + COFF_ObjSymbol *q = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("q")); + coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, q); + + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("f"), 0, sect); + a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 b_obj; + { + COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + U8 q[] = { 1,2,3,4}; + COFF_ObjSection *q_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".q"), PE_DATA_SECTION_FLAGS, str8_array_fixed(q)); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("q"), 0, q_sect); + + U8 data[] = "BBBBBBBBBBBBBBB"; + COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(data)); + coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); + coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("f"), 0, sect); + + b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + coff_obj_writer_release(&obj_writer); + } + + String8 b_lib; + { + COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(lib_writer, str8_lit("b.obj"), b_obj); + b_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + coff_lib_writer_release(&lib_writer); + } + + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("b.lib"), b_lib)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.lib"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".q")); + T_Ok(sect != 0); +} +T_EndTest; + +#undef T_Group + diff --git a/src/torture/torture_radlink.h b/src/torture/torture_radlink.h new file mode 100644 index 00000000..0aee7555 --- /dev/null +++ b/src/torture/torture_radlink.h @@ -0,0 +1,40 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +//////////////////////////////// + +typedef enum +{ + T_Linker_Null, + T_Linker_RAD, + T_Linker_MSVC, + T_Linker_LLVM +} T_Linker; + +typedef enum +{ + T_MsvcLinkExitCode_UnresolvedExternals = 1120, + T_MsvcLinkExitCode_CorruptOrInvalidSymbolTable = 1235, + T_MsvcLinkExitCode_SectionsFoundWithDifferentAttributes = 4078, +} T_MsvcLinkExitCode; + +//////////////////////////////// + +#define t_invoke_linker_timeout(c, t) T_Ok(t_invoke(g_linker, c, t)) +#define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(scratch.arena, f, ##__VA_ARGS__), t) +#define t_invoke_linker(c) t_invoke_linker_timeout(c, max_U64) +#define t_invoke_linkerf(f, ...) t_invoke_linker(push_str8f(scratch.arena, f, ##__VA_ARGS__)) + +internal T_Linker t_id_linker(void); + +internal COFF_ObjSection * t_push_text_section(COFF_ObjWriter *obj_writer, String8 data); +internal COFF_ObjSection * t_push_data_section(COFF_ObjWriter *obj_writer, String8 data); +internal COFF_ObjSection * t_push_rdata_section(COFF_ObjWriter *obj_writer, String8 data); + +internal String8 t_make_entry_obj(Arena *arena); +internal String8 t_make_sec_defn_obj(Arena *arena, String8 payload); + +internal B32 t_write_entry_obj(void); + From 0015e52d3cb2a4666abfeb857a5979aed3c93dc3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 30 Jan 2026 22:58:23 -0800 Subject: [PATCH 163/850] add /FAILIFMISMATCH --- src/linker/lnk_config.c | 59 ++++++++++++++++++++++++++--------- src/linker/lnk_config.h | 3 +- src/linker/lnk_error.h | 1 + src/torture/torture_radlink.c | 53 +++++++++++++++++++++++++++++++ src/torture/torture_radlink.h | 3 +- 5 files changed, 103 insertions(+), 16 deletions(-) diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 2aec5160..465414e9 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -42,8 +42,8 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_NotImplemented, 0, "EXPORTADMIN", "", "" }, { LNK_CmdSwitch_Experimental, 0, "EXPERIMENTAL", "Not supported." }, { LNK_CmdSwitch_FastFail, 0, "FASTFAIL", "", "Not used." }, + { LNK_CmdSwitch_FailIfMismatch, 1, "FAILIFMISMATCH", "{id=value}", "" }, { LNK_CmdSwitch_NotImplemented, 0, "FASTGENPROFILE", "", "" }, - { LNK_CmdSwitch_FailIfMismatch, 1, "FAILIFMISMATCH", "", "" }, { LNK_CmdSwitch_FileAlign, 0, "FILEALIGN", ":#", "" }, { LNK_CmdSwitch_Fixed, 0, "FIXED", "[:NO]", "" }, { LNK_CmdSwitch_NotImplemented, 0, "FORCE", "", "" }, @@ -398,7 +398,7 @@ lnk_cmd_switch_parse_version(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8 lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unable to parse major version"); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } exit:; @@ -431,7 +431,7 @@ lnk_cmd_switch_parse_tuple(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8Li lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unable to parse first parameter \"%S\"", value_strings.first->string); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } return 0; } @@ -595,7 +595,7 @@ lnk_cmd_switch_parse_string(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8L lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "empty string is not permitted"); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } return 0; } @@ -1183,7 +1183,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -1240,7 +1240,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid parameter \"%S\"", value_strings.first->string); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -1255,7 +1255,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_Delay: { if (value_strings.node_count == 0 || value_strings.node_count > 1) { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } else { String8 value = value_strings.first->string; if (str8_match_lit("unload", value, StringMatchFlag_CaseInsensitive)) { @@ -1359,6 +1359,36 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List // do nothing } break; + case LNK_CmdSwitch_FailIfMismatch: { + if (value_strings.node_count != 1) { + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); + break; + } + + LNK_AltName dir; + if ( ! lnk_parse_alt_name_directive(value_strings.first->string, obj, &dir)) { + break; + } + + LNK_AltName *current = hash_table_search_string_raw(config->fail_if_mismatch_ht, dir.from); + if (current) { + if ( ! str8_match(current->to, dir.to, 0)) { + lnk_error_cmd_switch(LNK_Error_FailIfMismatch, obj, cmd_switch, + "'%S=%S' mismatch in:\n" + " %S: /FAILIFMISMATCH:%S=%S\n", + dir.from, dir.to, + lnk_loc_from_obj(scratch.arena, current->obj), current->from, current->to); + break; + } + } else { + LNK_AltName *n = push_array(config->arena, LNK_AltName, 1); + n->from = push_str8_copy(config->arena, dir.from); + n->to = push_str8_copy(config->arena, dir.to); + n->obj = obj; + hash_table_push_string_raw(config->arena, config->fail_if_mismatch_ht, n->from, n); + } + } break; + case LNK_CmdSwitch_FileAlign: { lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->file_align, LNK_ParseU64Flag_CheckPow2); } break; @@ -1472,7 +1502,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unknown parameter \"%S\"", value_strings.first->string); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -1603,7 +1633,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_merge_directive_list_push(config->arena, &config->merge_list, merge); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters %d", value_strings.node_count); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -1717,7 +1747,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List if (value_strings.node_count == 0) { config->flags |= LNK_ConfigFlag_WriteImageChecksum; } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -1766,7 +1796,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid subsystem \"%S\"", value_strings.first->string); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -1893,7 +1923,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid parameter: \"%S\", expected NO or QUIET", value_strings.first->string); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -1919,7 +1949,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters, expected 1"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -1944,7 +1974,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unable to parse parameter \"%S\"", value_strings.first->string); } } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid number of parameters"); + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); } } break; @@ -2095,6 +2125,7 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) config->include_symbol_ht = hash_table_init(arena, 0x100); config->delay_load_ht = hash_table_init(arena, 0x100); config->disallow_lib_ht = hash_table_init(arena, 0x100); + config->fail_if_mismatch_ht = hash_table_init(arena, 0x100); // process command line switches for (LNK_CmdOption *cmd = cmd_line.first_option; cmd != 0; cmd = cmd->next) { diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index e05a6ef2..304ade0b 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -50,6 +50,7 @@ typedef enum LNK_CmdSwitch_ErrorReport, LNK_CmdSwitch_Experimental, LNK_CmdSwitch_Export, + LNK_CmdSwitch_FailIfMismatch, LNK_CmdSwitch_FastFail, LNK_CmdSwitch_FileAlign, LNK_CmdSwitch_Fixed, @@ -107,7 +108,6 @@ typedef enum LNK_CmdSwitch_EmitVolatileMetadata, LNK_CmdSwitch_ExportAdmin, LNK_CmdSwitch_FastGenProfile, - LNK_CmdSwitch_FailIfMismatch, LNK_CmdSwitch_Force, LNK_CmdSwitch_Guard, LNK_CmdSwitch_GuardSym, @@ -416,6 +416,7 @@ typedef struct LNK_Config HashTable *include_symbol_ht; HashTable *delay_load_ht; HashTable *disallow_lib_ht; + HashTable *fail_if_mismatch_ht; U64 unresolved_symbol_limit; U64 unresolved_symbol_ref_limit; LNK_SwitchState map_lines_for_unresolved_symbols; diff --git a/src/linker/lnk_error.h b/src/linker/lnk_error.h index 7a7e4a28..ced3a142 100644 --- a/src/linker/lnk_error.h +++ b/src/linker/lnk_error.h @@ -40,6 +40,7 @@ typedef enum LNK_Error_AssociativeLoop, LNK_Error_AlternateNameConflict, LNK_Error_RelocationAgainstRemovedSection, + LNK_Error_FailIfMismatch, LNK_Error_StopLast, LNK_Error_First, diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 500e2255..35a84a21 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -40,6 +40,16 @@ t_make_sec_defn_obj(Arena *arena, String8 payload) return obj; } +internal String8 +t_make_obj_with_directive(Arena *arena, String8 directive) +{ + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_directive(cow, directive); + String8 obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + return obj; +} + internal String8 t_make_entry_obj(Arena *arena) { @@ -3856,5 +3866,48 @@ T_BeginTest(opt_ref_dangling_section) } T_EndTest; +T_BeginTest(fail_if_mismatch) +{ + T_Ok(t_write_entry_obj()); + + // ------------------------------------------------------------ + // try linking two objs with mismatching directives + + String8 a1 = t_make_obj_with_directive(scratch.arena, str8_lit("/FAILIFMISMATCH:a=1")); + String8 a2 = t_make_obj_with_directive(scratch.arena, str8_lit("/FAILIFMISMATCH:a=2")); + T_Ok(t_write_file(str8_lit("a1.obj"), a1)); + T_Ok(t_write_file(str8_lit("a2.obj"), a2)); + + t_invoke_linkerf("entry.obj a1.obj a2.obj /entry:entry /subsystem:console /out:a2.exe"); + if (t_id_linker() == T_Linker_RAD) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); + else T_Ok(g_last_exit_code != 0); + + // ------------------------------------------------------------ + // happy case + + T_Ok(t_write_file(str8_lit("a1_copy.obj"), a1)); + + t_invoke_linkerf("entry.obj a1.obj a1_copy.obj /entry:entry /subsystem:console /out:a1.exe"); + T_Ok(g_last_exit_code == 0); + + // ------------------------------------------------------------ + // test conflicting directives in obj + + String8 conf_dirs = t_make_obj_with_directive(scratch.arena, str8_lit("/FAILIFMISMATCH:a=1 /FAILIFMISMATCH:a=2")); + T_Ok(t_write_file(str8_lit("conf_dirs.obj"), conf_dirs)); + + t_invoke_linkerf("entry.obj conf_dirs.obj /entry:entry /subsystem:console /out:conf_dirs.exe"); + if (t_id_linker() == T_Linker_RAD) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); + else T_Ok(g_last_exit_code != 0); + + // ------------------------------------------------------------ + // passing switch on command line + + t_invoke_linkerf("entry.obj a1.obj /FAILIFMISMATCH:a=2 /out:cmddir.exe"); + if (t_id_linker() == T_Linker_RAD) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); + else T_Ok(g_last_exit_code != 0); +} +T_EndTest; + #undef T_Group diff --git a/src/torture/torture_radlink.h b/src/torture/torture_radlink.h index 0aee7555..57cd8b32 100644 --- a/src/torture/torture_radlink.h +++ b/src/torture/torture_radlink.h @@ -35,6 +35,7 @@ internal COFF_ObjSection * t_push_rdata_section(COFF_ObjWriter *obj_writer, Stri internal String8 t_make_entry_obj(Arena *arena); internal String8 t_make_sec_defn_obj(Arena *arena, String8 payload); +internal String8 t_make_obj_with_directive(Arena *arena, String8 directive); -internal B32 t_write_entry_obj(void); +internal B32 t_write_entry_obj(void); From b6c74ae9bc05ef14460fb03a6ba03a4fb2789e9d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 30 Jan 2026 21:52:52 -0800 Subject: [PATCH 164/850] update values in import_export test --- src/torture/torture_radlink.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 35a84a21..70a6bb3e 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -2236,9 +2236,9 @@ T_BeginTest(import_export) T_Ok(export_table.exports[7].forwarder.size == 0); // validate voffs - T_Ok(export_table.exports[0].voff == 0x20070); + T_Ok(export_table.exports[0].voff == 0x17ff0); T_Ok(export_table.exports[1].voff == 0x19000); - T_Ok(export_table.exports[2].voff == 0x20077); + T_Ok(export_table.exports[2].voff == 0x17ff7); T_Ok(export_table.exports[3].voff == 0x19000); T_Ok(export_table.exports[4].voff == 0x19001); T_Ok(export_table.exports[5].voff == 0x19002); @@ -2284,10 +2284,10 @@ T_BeginTest(import_export) T_Ok(str8_match(export_table.exports[3].forwarder, str8_zero(), 0)); // validate voffs - T_Ok(export_table.exports[0].voff == 0x2000); - T_Ok(export_table.exports[1].voff == 0x3000); - T_Ok(export_table.exports[2].voff == 0x3000); - T_Ok(export_table.exports[3].voff == 0x2000); + T_Ok(export_table.exports[0].voff == 0x3000); + T_Ok(export_table.exports[1].voff == 0x4000); + T_Ok(export_table.exports[2].voff == 0x4000); + T_Ok(export_table.exports[3].voff == 0x3000); // validate ordinals T_Ok(export_table.exports[0].ordinal == 2); From 0c02e21284f8969a5becdb17f7c90cbad1b5df4a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 1 Feb 2026 23:23:37 -0800 Subject: [PATCH 165/850] WIP tests for ICF --- src/coff/coff_obj_writer.c | 12 ++ src/coff/coff_obj_writer.h | 33 ++-- src/torture/torture_radlink.c | 319 ++++++++++++++++++++++++++++++++++ 3 files changed, 348 insertions(+), 16 deletions(-) diff --git a/src/coff/coff_obj_writer.c b/src/coff/coff_obj_writer.c index ccfc4f47..f6a421f1 100644 --- a/src/coff/coff_obj_writer.c +++ b/src/coff/coff_obj_writer.c @@ -440,6 +440,18 @@ coff_obj_writer_section_push_reloc(COFF_ObjWriter *obj_writer, COFF_ObjSection * return reloc; } +internal COFF_ObjReloc * +coff_obj_writer_section_push_reloc_rel32(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol) +{ + COFF_RelocType reloc_type = 0; + switch (obj_writer->machine) { + case COFF_MachineType_Unknown: break; + case COFF_MachineType_X64: reloc_type = COFF_Reloc_X64_Rel32; break; + default: { NotImplemented; } break; + } + return coff_obj_writer_section_push_reloc(obj_writer, sect, apply_off, symbol, reloc_type); +} + internal COFF_ObjReloc * coff_obj_writer_section_push_reloc_addr32(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol) { diff --git a/src/coff/coff_obj_writer.h b/src/coff/coff_obj_writer.h index 1419396a..0f68aabc 100644 --- a/src/coff/coff_obj_writer.h +++ b/src/coff/coff_obj_writer.h @@ -95,32 +95,33 @@ typedef struct COFF_ObjWriter //////////////////////////////// -internal COFF_ObjWriter * coff_obj_writer_alloc(COFF_TimeStamp time_stamp, COFF_MachineType machine); -internal void coff_obj_writer_release(COFF_ObjWriter **obj_writer); +internal COFF_ObjWriter * coff_obj_writer_alloc (COFF_TimeStamp time_stamp, COFF_MachineType machine); +internal void coff_obj_writer_release (COFF_ObjWriter **obj_writer); internal String8 coff_obj_writer_serialize(Arena *arena, COFF_ObjWriter *obj_writer); internal COFF_ObjSection * coff_obj_writer_push_section(COFF_ObjWriter *obj_writer, String8 name, COFF_SectionFlags flags, String8 data); -internal COFF_ObjSymbol* coff_obj_writer_push_symbol(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymbolLocation loc, COFF_SymbolType type, COFF_SymStorageClass storage_class); +internal COFF_ObjSymbol* coff_obj_writer_push_symbol (COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymbolLocation loc, COFF_SymbolType type, COFF_SymStorageClass storage_class); internal COFF_ObjSymbol * coff_obj_writer_push_symbol_extern_func(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_ObjSection *section); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_extern(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_ObjSection *section); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_static(COFF_ObjWriter *obj_writer, String8 name, U32 off, COFF_ObjSection *section); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_secdef(COFF_ObjWriter *obj_writer, COFF_ObjSection *section, COFF_ComdatSelectType selection); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_extern (COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_ObjSection *section); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_static (COFF_ObjWriter *obj_writer, String8 name, U32 off, COFF_ObjSection *section); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_secdef (COFF_ObjWriter *obj_writer, COFF_ObjSection *section, COFF_ComdatSelectType selection); internal COFF_ObjSymbol * coff_obj_writer_push_symbol_associative(COFF_ObjWriter *obj_writer, COFF_ObjSection *head, COFF_ObjSection *associate); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_weak(COFF_ObjWriter *obj_writer, String8 name, COFF_WeakExtType characteristics, COFF_ObjSymbol *tag); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_abs(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymStorageClass storage_class); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef(COFF_ObjWriter *obj_writer, String8 name); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef_func(COFF_ObjWriter *obj_writer, String8 name); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef_sect(COFF_ObjWriter *obj_writer, String8 name, U32 value); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_sect(COFF_ObjWriter *obj_writer, String8 name, COFF_ObjSection *sect); -internal COFF_ObjSymbol * coff_obj_writer_push_symbol_common(COFF_ObjWriter *obj_writer, String8 name, U32 size); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_weak (COFF_ObjWriter *obj_writer, String8 name, COFF_WeakExtType characteristics, COFF_ObjSymbol *tag); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_abs (COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymStorageClass storage_class); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef (COFF_ObjWriter *obj_writer, String8 name); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef_func (COFF_ObjWriter *obj_writer, String8 name); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef_sect (COFF_ObjWriter *obj_writer, String8 name, U32 value); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_sect (COFF_ObjWriter *obj_writer, String8 name, COFF_ObjSection *sect); +internal COFF_ObjSymbol * coff_obj_writer_push_symbol_common (COFF_ObjWriter *obj_writer, String8 name, U32 size); internal void coff_obj_writer_set_default_symbol(COFF_ObjSymbol *weak_symbol, COFF_ObjSymbol *default_symbol); -internal COFF_ObjReloc * coff_obj_writer_section_push_reloc(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol, COFF_RelocType reloc_type); +internal COFF_ObjReloc * coff_obj_writer_section_push_reloc (COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol, COFF_RelocType reloc_type); +internal COFF_ObjReloc * coff_obj_writer_section_push_reloc_rel32 (COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol); internal COFF_ObjReloc * coff_obj_writer_section_push_reloc_addr32(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol); -internal COFF_ObjReloc * coff_obj_writer_section_push_reloc_addr(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol); -internal COFF_ObjReloc * coff_obj_writer_section_push_reloc_voff(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol); +internal COFF_ObjReloc * coff_obj_writer_section_push_reloc_addr (COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol); +internal COFF_ObjReloc * coff_obj_writer_section_push_reloc_voff (COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol); internal void coff_obj_writer_push_directive(COFF_ObjWriter *obj_writer, String8 directive); diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 70a6bb3e..35e84f65 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -3909,5 +3909,324 @@ T_BeginTest(fail_if_mismatch) } T_EndTest; +#if 0 + +T_BeginTest(fold_two_funcs) +{ + String8 ident_funcs_obj; + { + U8 same_text[] = { + 0x48, 0x31, 0xc0, // xor rax, rax + 0xc3 // ret + }; + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text$mn"), PE_TEXT_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(same_text)); + COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text$mb"), PE_TEXT_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(same_text)); + coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); + COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_extern_func(cow, str8_lit("a"), 0, a_sect); + COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_extern_func(cow, str8_lit("b"), 0, b_sect); + + U8 entry_text[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, // call a + 0xe8, 0x00, 0x00, 0x00, 0x00, // call b + 0xc3, // ret + }; + COFF_ObjSection *entry_sect = t_push_text_section(cow, str8_array_fixed(entry_text)); + coff_obj_writer_push_symbol_extern_func(cow, str8_lit("entry"), 0, entry_sect); + coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); + coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); + + ident_funcs_obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + T_Ok(t_write_file(str8_lit("ident_funcs.obj"), ident_funcs_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /opt:icf ident_funcs.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(scratch.arena, str8_lit("ident_funcs.exe")); + T_Ok(exe.size); + + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".text")); + + // validate .text header + T_Ok(text_sect->voff == 0x1000); + T_Ok(text_sect->vsize >= 0x14); + T_Ok(text_sect->fsize == 0x200); + + T_Ok(text_sect->foff + text_sect->vsize <= exe.size); + String8 text_data = str8_substr(exe, r1u64(text_sect->foff, text_sect->foff + 0x14)); + + U8 expected_text[] = { + // entry + 0xe8, 0x0b, 0x00, 0x00, 0x00, + 0xe8, 0x06, 0x00, 0x00, 0x00, + 0xc3, + + // pad + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + + // a and b folded + 0x48, 0x31, 0xc0, + 0xc3, + }; + T_Ok(str8_match(text_data, str8_array_fixed(expected_text), 0)); +} +T_EndTest; + +T_BeginTest(same_but_different) +{ + String8 obj; + { + U8 text[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, // call $ + 0xc3 + }; + + U8 return_1[] = { + 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 + 0xc3 // ret + }; + + U8 return_2[] = { + 0x48, 0xc7, 0xc0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 + 0xc3 // ret + }; + + U8 call_a_and_b[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + COFF_ObjSection *entry_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(call_a_and_b)); + COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(text)); + COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(text)); + COFF_ObjSection *c_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(return_1)); + COFF_ObjSection *d_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(return_2)); + + coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, c_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, d_sect, COFF_ComdatSelect_NoDuplicates); + + coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, entry_sect); + + COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("a"), 0, a_sect); + COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("b"), 0, b_sect); + COFF_ObjSymbol *c_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("c"), 0, c_sect); + COFF_ObjSymbol *d_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("d"), 0, d_sect); + + // a -> c + coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 1, c_symbol); + + // b -> d + coff_obj_writer_section_push_reloc_rel32(cow, b_sect, 1, d_symbol); + + // entry -> { a | b } + coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); + coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); + + obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + T_Ok(t_write_file(str8_lit("a.obj"), obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /opt:icf a.obj"); + T_Ok(g_last_exit_code == 0); + + // validate output + { + U8 expected_text[] = { + 0xE8, 0x0B, 0x00, 0x00, 0x00, // call a + 0xE8, 0x16, 0x00, 0x00, 0x00, // call b + 0xC3, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, + 0xE8, 0x1B, 0x00, 0x00, 0x00, // call c + 0xC3, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, + 0xE8, 0x1B, 0x00, 0x00, 0x00, // call d + 0xC3, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, + 0x48, 0xC7, 0xC0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 + 0xC3, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, + 0x48, 0xC7, 0xC0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 + 0xC3, + }; + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + T_Ok(exe.size); + + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + + T_Ok(text_section); + T_Ok(text_section->foff + sizeof(expected_text) <= exe.size); + + String8 text = str8_substr(exe, r1u64(text_section->foff, text_section->foff + text_section->vsize)); + T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); + } +} +T_EndTest; + +T_BeginTest(fold_diamond) +{ + String8 a_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + + U8 call_b_and_c[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + + U8 call_and_return[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + + U8 clear_and_return[] = { + 0x48, 0x31, 0xc0, + 0xc3 + }; + + COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(call_b_and_c)); + COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(call_and_return)); + COFF_ObjSection *c_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(call_and_return)); + COFF_ObjSection *d_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(clear_and_return)); + + coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, c_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, d_sect, COFF_ComdatSelect_NoDuplicates); + + coff_obj_writer_push_symbol_extern(cow, str8_lit("a"), 0, a_sect); + COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("b"), 0, b_sect); + COFF_ObjSymbol *c_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("c"), 0, c_sect); + COFF_ObjSymbol *d_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("d"), 0, d_sect); + + // a -> { b | c } + coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 1, b_symbol); + coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 6, c_symbol); + + // b -> d + coff_obj_writer_section_push_reloc_rel32(cow, b_sect, 1, d_symbol); + + // c -> d + coff_obj_writer_section_push_reloc_rel32(cow, c_sect, 1, d_symbol); + + a_obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + t_invoke_linkerf("/subsystem:console /entry:a /out:a.exe /opt:icf a.obj"); + T_Ok(g_last_exit_code == 0); + + // validate output + { + U8 expected_text[] = { + 0xe8, 0x0b, 0x00, 0x00, 0x00, + 0xe8, 0x06, 0x00, 0x00, 0x00, + 0xc3, + + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + + 0xe8, 0x0b, 0x00, 0x00, 0x00, + 0xc3, + + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + + 0x48, 0x31, 0xc0, + 0xc3 + }; + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + T_Ok(exe.size); + + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + + T_Ok(text_section); + T_Ok(text_section->foff + sizeof(expected_text) <= exe.size); + + String8 text = str8_substr(exe, r1u64(text_section->foff, text_section->foff + text_section->vsize)); + T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); + } +} +T_EndTest; + +T_BeginTest(cyclic_icf) +{ + String8 a_obj; + { + U8 text[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("a"), 0, a_sect); + COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("b"), 0, b_sect); + + // a <-> b + coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 1, b_symbol); + coff_obj_writer_section_push_reloc_rel32(cow, b_sect, 1, a_symbol); + + a_obj = coff_obj_writer_serialize(scratch.arena, cow); + + coff_obj_writer_release(&cow); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + + t_invoke_linkerf("/subsystem:console /out:a.exe /entry:a /opt:icf a.obj"); + T_Ok(g_last_exit_code == 0); + + // validate output + { + U8 expected_text[] = { + 0xe8, 0x0b, 0x00, 0x00, 0x00, // a + 0xc3, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xe8, 0xeb, 0xff, 0xff, 0xff, // b + 0xc3, + }; + + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + T_Ok(exe.size); + + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + + T_Ok(text_section); + T_Ok(text_section->foff + sizeof(expected_text) <= exe.size); + + String8 text = str8_substr(exe, r1u64(text_section->foff, text_section->foff + text_section->vsize)); + T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); + } +} +T_EndTest; + +#endif + #undef T_Group From b44f79fe44061f83763512a9ea8aab77a360989f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 2 Feb 2026 00:12:42 -0800 Subject: [PATCH 166/850] test section folding with different alignment --- src/torture/torture_radlink.c | 154 ++++++++++++++++++++++++++++++---- 1 file changed, 139 insertions(+), 15 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 35e84f65..21040f40 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4047,21 +4047,21 @@ T_BeginTest(same_but_different) // validate output { U8 expected_text[] = { - 0xE8, 0x0B, 0x00, 0x00, 0x00, // call a - 0xE8, 0x16, 0x00, 0x00, 0x00, // call b - 0xC3, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, - 0xE8, 0x1B, 0x00, 0x00, 0x00, // call c - 0xC3, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, - 0xE8, 0x1B, 0x00, 0x00, 0x00, // call d - 0xC3, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, - 0x48, 0xC7, 0xC0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 - 0xC3, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, - 0x48, 0xC7, 0xC0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 - 0xC3, + 0xe8, 0x0b, 0x00, 0x00, 0x00, // call a + 0xe8, 0x16, 0x00, 0x00, 0x00, // call b + 0xc3, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xe8, 0x1b, 0x00, 0x00, 0x00, // call c + 0xc3, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xe8, 0x1b, 0x00, 0x00, 0x00, // call d + 0xc3, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 + 0xc3, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x48, 0xc7, 0xc0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 + 0xc3, }; String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); @@ -4226,6 +4226,130 @@ T_BeginTest(cyclic_icf) } T_EndTest; +T_BeginTest(fold_with_largest_align) +{ + String8 a_obj; + { + U8 text[] = { + 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 + 0xc3 + }; + + U8 call_a_and_b[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *entry_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(call_a_and_b)); + COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_Align4Bytes, str8_array_fixed(text)); + COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_Align8Bytes, str8_array_fixed(text)); + + coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); + + coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, entry_sect); + COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("a"), 0, a_sect); + COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("b"), 0, b_sect); + coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); + coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); + + a_obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + // swap sections for a and b + String8 b_obj; + { + U8 text[] = { + 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 + 0xc3 + }; + + U8 call_a_and_b[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *entry_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(call_a_and_b)); + COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_Align8Bytes, str8_array_fixed(text)); + COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_Align4Bytes, str8_array_fixed(text)); + + coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); + coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); + + coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, entry_sect); + COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("a"), 0, a_sect); + COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("b"), 0, b_sect); + coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); + coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); + + b_obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj"); + T_Ok(g_last_exit_code == 0); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe b.obj"); + T_Ok(g_last_exit_code == 0); + + U8 expected_text[] = { + 0xe8, 0x0b, 0x00, 0x00, 0x00, + 0xe8, 0x06, 0x00, 0x00, 0x00, + 0xc3, + 0xcc, + 0xcc, + 0xcc, + 0xcc, + 0xcc, + 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, + 0x00, + 0xc3, + }; + + // validate output in a.exe + { + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + T_Ok(exe.size); + + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + + T_Ok(text_section); + T_Ok(text_section->foff + sizeof(expected_text) <= exe.size); + + String8 text = str8_substr(exe, r1u64(text_section->foff, text_section->foff + text_section->vsize)); + T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); + } + + // validate output in b.exe + { + String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); + T_Ok(exe.size); + + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); + + T_Ok(text_section); + T_Ok(text_section->foff + sizeof(expected_text) <= exe.size); + + String8 text = str8_substr(exe, r1u64(text_section->foff, text_section->foff + text_section->vsize)); + T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); + } +} +T_EndTest; + #endif #undef T_Group From b0d0b6a2b2201be16e5b0bed101f3e7691b8165c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 2 Feb 2026 21:39:05 -0800 Subject: [PATCH 167/850] factor out LEB128 writer --- src/dwarf/dwarf.c | 39 +++++++++++++++++++++++++++++++++++++++ src/dwarf/dwarf.h | 5 +++++ src/dwarf/dwarf_expr.c | 29 ++--------------------------- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index feeaa924..9e768ba1 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -827,3 +827,42 @@ dw_string_from_cfa_opcode(DW_CFA_Opcode opcode) } return str8_zero(); } + +internal String8 +dw_write_uleb128(Arena *arena, U64 v) +{ + U64 buffer_size = 0; + U8 buffer[10]; + U64 value = v; + do { + U8 byte = value & 0x7f; + value >>= 7; + if (value != 0) { + byte |= 0x80; + } + Assert(buffer_size < sizeof(buffer)); + buffer[buffer_size++] = byte; + } while (value > 0); + return str8_copy(arena, str8(buffer, buffer_size)); +} + +internal String8 +dw_write_sleb128(Arena *arena, S64 v) +{ + U64 buffer_size = 0; + U8 buffer[10]; + for (S64 value = v, more = 1; more != 0; ) { + U8 byte = value & 0x7f; + value >>= 7; + U8 sign_bit = byte & 0x40; + if ((value == 0 && sign_bit == 0) || (value == -1 && sign_bit != 0)) { + more = 0; + } else { + byte |= 0x80; + } + Assert(buffer_size < sizeof(buffer)); + buffer[buffer_size++] = byte; + } + return str8_copy(arena, str8(buffer, buffer_size)); +} + diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index a098e521..2b540976 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1778,4 +1778,9 @@ internal String8 dw_string_from_rng_list_entry_kind(Arena *arena, DW_RLE kind); internal String8 dw_string_from_register(Arena *arena, Arch arch, U64 reg_id); internal String8 dw_string_from_cfa_opcode(DW_CFA_Opcode opcode); +//////////////////////////////// + +internal String8 dw_write_uleb128(Arena *arena, U64 v); +internal String8 dw_write_sleb128(Arena *arena, S64 v); + #endif // DWARF_H diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 359fb41f..5d73e1c2 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1611,35 +1611,10 @@ dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 str8_serial_push_struct(scratch.arena, srl, &e->s64); } break; case DW_ExprEncType_ULEB128: { - U64 buffer_size = 0; - U8 buffer[10]; - for (U64 value = e->u64; value != 0; ) { - U8 byte = value & 0x7f; - value >>= 7; - if (value != 0) { - byte |= 0x80; - } - Assert(buffer_size < sizeof(buffer)); - buffer[buffer_size++] = byte; - } - str8_serial_push_string(scratch.arena, srl, str8(buffer, buffer_size)); + str8_serial_push_string(scratch.arena, srl, dw_write_uleb128(scratch.arena, e->u64)); } break; case DW_ExprEncType_SLEB128: { - U64 buffer_size = 0; - U8 buffer[10]; - for (S64 value = e->s64, more = 1; more != 0; ) { - U8 byte = value & 0x7f; - value >>= 7; - U8 sign_bit = byte & 0x40; - if ((value == 0 && sign_bit == 0) || (value == -1 && sign_bit != 0)) { - more = 0; - } else { - byte |= 0x80; - } - Assert(buffer_size < sizeof(buffer)); - buffer[buffer_size++] = byte; - } - str8_serial_push_string(scratch.arena, srl, str8(buffer, buffer_size)); + str8_serial_push_string(scratch.arena, srl, dw_write_sleb128(scratch.arena, e->s64)); } break; case DW_ExprEncType_Addr: { U64 addr_size = byte_size_from_arch(arch); From 010f54674f71730812af4be6e6617203561a054a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 2 Feb 2026 21:39:54 -0800 Subject: [PATCH 168/850] test for LEB128 reader and writer --- src/torture/torture_dwarf.c | 61 +++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 40088cbd..995a3c82 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -3,6 +3,67 @@ #define T_Group "Dwarf" +internal U64 +t_dw_test_uleb128(U64 v, U64 expected_length) +{ + Temp scratch = scratch_begin(0, 0); + B32 is_ok = 0; + + U64 v0 = v; + String8 e = dw_write_uleb128(scratch.arena, v0); + if (!(expected_length == e.size)) { goto exit; } + + U64 v1; + U64 bytes_read = str8_deserial_read_uleb128(e, 0, &v1); + if (!(bytes_read == e.size)) { goto exit; } + if (!(v0 == v1)) { goto exit; } + + is_ok = 1; +exit:; + scratch_end(scratch); + return is_ok; +} + +internal U64 +t_dw_test_sleb128(U64 v, U64 expected_length) +{ + Temp scratch = scratch_begin(0,0); + B32 is_ok = 0; + + U64 v0 = v; + String8 e = dw_write_sleb128(scratch.arena, v0); + if (!(expected_length == e.size)) { goto exit; } + + U64 v1; + U64 bytes_read = str8_deserial_read_sleb128(e, 0, &v1); + if (!(bytes_read == e.size)) { goto exit; } + if (!(v0 == v1)) { goto exit; } + + is_ok = 1; +exit:; + scratch_end(scratch); + return is_ok; +} + +T_BeginTest(test_leb128) +{ + T_Ok(t_dw_test_uleb128(0, 1)); + T_Ok(t_dw_test_sleb128(0, 1)); + T_Ok(t_dw_test_sleb128(-1, 1)); + + T_Ok(t_dw_test_uleb128(max_U64, 10)); + T_Ok(t_dw_test_sleb128(min_S64, 10)); + T_Ok(t_dw_test_sleb128(max_S64, 10)); + + for EachIndex(i, 64) { + T_Ok(t_dw_test_uleb128((1ull << i), 1 + (i / 7))); + } + for EachIndex(i, 64) { + T_Ok(t_dw_test_sleb128((1ull << i), 1 + (i + 1) / 7)); + } +} +T_EndTest; + T_BeginTest(value_in_register) { // setup register context From 71a46985b6ba1a699cfe5846c2f2c13bc8f01ec8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 5 Feb 2026 00:58:32 -0800 Subject: [PATCH 169/850] use string table extension for long section names --- src/linker/lnk.c | 41 ++++++++++++++++++++++++++++++----- src/linker/lnk.h | 2 +- src/torture/torture_radlink.c | 32 +++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 2f8c472d..5f42ac5f 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -3892,7 +3892,7 @@ lnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U6 } internal String8List -lnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config, LNK_SectionArray sects, U64 expected_image_header_size) +lnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config, LNK_SectionArray sects, U64 expected_image_header_size, U64 *file_header_offset_out, String8List *string_table_out) { ProfBeginFunction(); @@ -3951,6 +3951,8 @@ lnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config file_header->section_count = sects.count; file_header->optional_header_size = (has_pe_plus_header ? sizeof(PE_OptionalHeader32Plus) : sizeof(PE_OptionalHeader32)) + (sizeof(PE_DataDirectory) * config->data_dir_count); file_header->flags = config->file_characteristics; + + *file_header_offset_out = result.total_size; str8_list_push(arena, &result, str8_struct(file_header)); } @@ -4061,13 +4063,21 @@ lnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config if (coff_section->flags & COFF_SectionFlag_LnkRemove) { continue; } - // TODO: for objs we can store long name in string table and write here /offset + String8 section_name = sect->name; + + // use string table extension to store long section names if (sect->name.size > sizeof(coff_section->name)) { - lnk_error(LNK_Warning_LongSectionName, "not enough space in COFF section header to store entire name \"%S\"", sect->name); + if (string_table_out->node_count == 0) { + U32 *string_table_size = push_array(arena, U32, 1); + str8_list_push_front(arena, string_table_out, str8_struct(string_table_size)); + } + U64 name_offset = string_table_out->total_size; + str8_list_push(arena, string_table_out, push_cstr(arena, sect->name)); + section_name = push_str8f(arena, "/%u", name_offset); } MemorySet(&coff_section->name[0], 0, sizeof(coff_section->name)); - MemoryCopy(&coff_section->name[0], sect->name.str, Min(sect->name.size, sizeof(coff_section->name))); + MemoryCopy(&coff_section->name[0], section_name.str, Min(section_name.size, sizeof(coff_section->name))); coff_section->vsize = sect->vsize; coff_section->voff = sect->voff; coff_section->fsize = sect->fsize; @@ -4108,6 +4118,12 @@ lnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config scratch_end(scratch); } + // write string table size + if (string_table_out->total_size) { + U32 *string_table_size = (U32 *)string_table_out->first->string.str; + *string_table_size = safe_cast_u32(string_table_out->total_size); + } + Assert(result.total_size == expected_image_header_size); ProfEnd(); return result; @@ -4453,8 +4469,10 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT } // build win32 image header + U64 image_file_header_off = 0; + String8List image_string_table = {0}; { - String8List image_header_data = lnk_build_win32_header(sectab->arena, symtab, config, task.image_sects, AlignPow2(expected_image_header_size, config->file_align)); + String8List image_header_data = lnk_build_win32_header(sectab->arena, symtab, config, task.image_sects, AlignPow2(expected_image_header_size, config->file_align), &image_file_header_off, &image_string_table); LNK_Section *image_header_sect = lnk_section_table_push(sectab, str8_lit(".rad_linker_image_header_section"), 0); LNK_SectionContribChunk *image_header_sc_chunk = lnk_section_contrib_chunk_list_push_chunk(sectab->arena, &image_header_sect->contribs, 1, str8_zero()); LNK_SectionContrib *image_header_sc = lnk_section_contrib_chunk_push(image_header_sc_chunk, 1); @@ -4471,7 +4489,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT ProfBegin("Image Fill"); ProfBeginV("Alloc Image Buffer [%M]", lnk_section_table_total_fsize(sectab)); - image_data.size = lnk_section_table_total_fsize(sectab); + image_data.size = lnk_section_table_total_fsize(sectab) + image_string_table.total_size; image_data.str = push_array_no_zero(arena->v[0], U8, image_data.size); ProfEnd(); @@ -4522,6 +4540,17 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT task.u.image_fill.fill_nodes = fill_nodes; tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_image_fill_task, &task, "Fill"); + if (image_string_table.total_size) { + ProfBegin("Copy String Table"); + String8 buffer = str8_list_join(scratch.arena, &image_string_table, 0); + MemoryCopy(image_data.str + (image_data.size - buffer.size), buffer.str, buffer.size); + ProfEnd(); + + // patch string table offset + COFF_FileHeader *file_header = (COFF_FileHeader *)(image_data.str + image_file_header_off); + file_header->symbol_table_foff = safe_cast_u32(image_data.size - buffer.size); + } + temp_end(temp); ProfEnd(); diff --git a/src/linker/lnk.h b/src/linker/lnk.h index d565e023..8ef2d4cf 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -378,7 +378,7 @@ internal void lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *c internal String8List lnk_build_guard_tables(TP_Context *tp, LNK_SectionTable *sectab, LNK_SymbolTable *symtab, U64 objs_count, LNK_Obj **objs, COFF_MachineType machine, String8 entry_point_name, LNK_GuardFlags guard_flags, B32 emit_suppress_flag); internal String8 lnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_temp, LNK_Config *config, U64 objs_count, LNK_Obj **objs); -internal String8List lnk_build_win32_image_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config, LNK_SectionArray sect_arr, U64 expected_image_header_size); +internal String8List lnk_build_win32_image_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config, LNK_SectionArray sect_arr, U64 expected_image_header_size, U64 *file_header_offset_out, String8List *string_table_out); internal LNK_ImageContext lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolTable *symtab, U64 obj_count, LNK_Obj **objs); // --- Logger ------------------------------------------------------------------ diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 21040f40..c6909da1 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -3909,6 +3909,38 @@ T_BeginTest(fail_if_mismatch) } T_EndTest; +T_BeginTest(long_section_name) +{ + Arch arch = Arch_x64; + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + U8 text[] = { 0xc3 }; + COFF_ObjSection *text_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); + coff_obj_writer_push_section(cow, str8_lit(".debug_info"), PE_DATA_SECTION_FLAGS, str8_lit("DEBUG_INFO")); + coff_obj_writer_push_section(cow, str8_lit(".debug_abbrev"), PE_DATA_SECTION_FLAGS, str8_lit("DEBUG_ABBREV")); + coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, text_sect); + String8 raw_coff = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + + // link test.obj + T_Ok(t_write_file(str8_lit("test.obj"), raw_coff)); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.obj"); + T_Ok(g_last_exit_code == 0); + + // load linked exe + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + + COFF_SectionHeader *debug_info = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".debug_info")); + T_Ok(debug_info); + + COFF_SectionHeader *debug_abbrev = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".debug_abbrev")); + T_Ok(debug_abbrev); +} +T_EndTest; + #if 0 T_BeginTest(fold_two_funcs) From d7ffea785fc29f605fa4c37fcaec13d29bc5869b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 6 Feb 2026 18:49:52 -0800 Subject: [PATCH 170/850] compact print abbrev data --- src/dwarf/dwarf_dump.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 48103650..45a0023e 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -1904,11 +1904,8 @@ dw_dump_list_from_sections(Arena *arena, // rjf: log abbrev Temp temp = temp_begin(scratch.arena); - dumpf("abbrev: // abbrev[%I64u]\n{\n", idx); - dumpf(" offset: 0x%I64x\n", id_off); - dumpf(" id: %I64u\n", id); - dumpf(" tag_kind: %S\n", dw_string_from_tag_kind(temp.arena, tag)); - dumpf(" has_children: %s\n", has_children ? "true" : "false"); + dumpf("abbrev: // abbrev[%I64u] @ 0x%I64x \n{\n", idx, id_off); + dumpf(" id: %I64u tag_kind: %S has_children: %s\n", id, dw_string_from_tag_kind(temp.arena, tag), has_children ? "true" : "false"); for(;;) { U64 attrib_off = cursor; @@ -1918,7 +1915,7 @@ dw_dump_list_from_sections(Arena *arena, if(attrib_id == 0) { break; } String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); - dumpf(" attrib: { offset: 0x%I64x, kind: %S, form_kind: %S }\n", attrib_off, attrib_str, form_str); + dumpf(" attrib: { kind: %-8S form_kind: %-8S } // 0x%I64x\n", attrib_str, form_str, attrib_off); } dumpf("}\n"); temp_end(temp); From 1579e6eae6430cf458f425b6fe39af2547c4f2ed Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 9 Feb 2026 23:40:10 -0800 Subject: [PATCH 171/850] simplify serial pushes for u32 and u64 --- src/base/base_strings.c | 109 +++++++++++++++++++--------------------- src/base/base_strings.h | 13 +++-- 2 files changed, 59 insertions(+), 63 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index d4943ef1..c5d11262 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -2637,16 +2637,18 @@ fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src) //~ NOTE(allen): Serialization Helpers internal void -str8_serial_begin(Arena *arena, String8List *srl){ +str8_serial_begin(Arena *arena, String8List *srl) +{ String8Node *node = push_array(arena, String8Node, 1); node->string.str = push_array_no_zero(arena, U8, 0); - srl->first = srl->last = node; + srl->first = srl->last = node; srl->node_count = 1; srl->total_size = 0; } internal String8 -str8_serial_end(Arena *arena, String8List *srl){ +str8_serial_end(Arena *arena, String8List *srl) +{ U64 size = srl->total_size; U8 *out = push_array_no_zero(arena, U8, size); str8_serial_write_to_dst(srl, out); @@ -2655,19 +2657,20 @@ str8_serial_end(Arena *arena, String8List *srl){ } internal void -str8_serial_write_to_dst(String8List *srl, void *out){ +str8_serial_write_to_dst(String8List *srl, void *out) +{ U8 *ptr = (U8*)out; - for (String8Node *node = srl->first; - node != 0; - node = node->next){ - U64 size = node->string.size; - MemoryCopy(ptr, node->string.str, size); + for EachNode(n, String8Node, srl->first) + { + U64 size = n->string.size; + MemoryCopy(ptr, n->string.str, size); ptr += size; } } internal U64 -str8_serial_push_align(Arena *arena, String8List *srl, U64 align){ +str8_serial_push_align(Arena *arena, String8List *srl, U64 align) +{ Assert(IsPow2(align)); U64 pos = srl->total_size; @@ -2679,11 +2682,13 @@ str8_serial_push_align(Arena *arena, String8List *srl, U64 align){ U8 *buf = push_array(arena, U8, size); String8 *str = &srl->last->string; - if (str->str + str->size == buf){ + if(str->str + str->size == buf) + { srl->last->string.size += size; srl->total_size += size; } - else{ + else + { str8_list_push(arena, srl, str8(buf, size)); } } @@ -2698,11 +2703,13 @@ str8_serial_push_size(Arena *arena, String8List *srl, U64 size) { U8 *buf = push_array_no_zero(arena, U8, size); String8 *str = &srl->last->string; - if (str->str + str->size == buf){ + if(str->str + str->size == buf) + { srl->last->string.size += size; srl->total_size += size; } - else{ + else + { str8_list_push(arena, srl, str8(buf, size)); } result = buf; @@ -2711,7 +2718,8 @@ str8_serial_push_size(Arena *arena, String8List *srl, U64 size) } internal void * -str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){ +str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size) +{ void *result = str8_serial_push_size(arena, srl, size); if(result != 0) { @@ -2721,61 +2729,50 @@ str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){ } internal void -str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first){ - for (String8Node *node = first; - node != 0; - node = node->next){ - str8_serial_push_data(arena, srl, node->string.str, node->string.size); +str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first) +{ + for EachNode(n, String8Node, first) + { + str8_serial_push_data(arena, srl, n->string.str, n->string.size); } } -internal void -str8_serial_push_u64(Arena *arena, String8List *srl, U64 x){ - U8 *buf = push_array_no_zero(arena, U8, 8); - MemoryCopy(buf, &x, 8); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += 8; - srl->total_size += 8; - } - else{ - str8_list_push(arena, srl, str8(buf, 8)); - } +internal void * +str8_serial_push_u64(Arena *arena, String8List *srl, U64 x) +{ + return str8_serial_push_data(arena, srl, &x, sizeof(x)); } -internal void -str8_serial_push_u32(Arena *arena, String8List *srl, U32 x){ - U8 *buf = push_array_no_zero(arena, U8, 4); - MemoryCopy(buf, &x, 4); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += 4; - srl->total_size += 4; - } - else{ - str8_list_push(arena, srl, str8(buf, 4)); - } +internal void * +str8_serial_push_u32(Arena *arena, String8List *srl, U32 x) +{ + return str8_serial_push_data(arena, srl, &x, sizeof(x)); } -internal void -str8_serial_push_u16(Arena *arena, String8List *srl, U16 x){ - str8_serial_push_data(arena, srl, &x, sizeof(x)); +internal void * +str8_serial_push_u16(Arena *arena, String8List *srl, U16 x) +{ + return str8_serial_push_data(arena, srl, &x, sizeof(x)); } -internal void -str8_serial_push_u8(Arena *arena, String8List *srl, U8 x){ - str8_serial_push_data(arena, srl, &x, sizeof(x)); +internal void * +str8_serial_push_u8(Arena *arena, String8List *srl, U8 x) +{ + return str8_serial_push_data(arena, srl, &x, sizeof(x)); } -internal void -str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str){ - str8_serial_push_data(arena, srl, str.str, str.size); +internal void * +str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str) +{ + void *ptr = str8_serial_push_data(arena, srl, str.str, str.size); str8_serial_push_u8(arena, srl, 0); + return ptr; } -internal void -str8_serial_push_string(Arena *arena, String8List *srl, String8 str){ - str8_serial_push_data(arena, srl, str.str, str.size); +internal void * +str8_serial_push_string(Arena *arena, String8List *srl, String8 str) +{ + return str8_serial_push_data(arena, srl, str.str, str.size); } //////////////////////////////// diff --git a/src/base/base_strings.h b/src/base/base_strings.h index d570ec8b..9692eda4 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -428,13 +428,12 @@ internal U64 str8_serial_push_align(Arena *arena, String8List *srl, U64 alig internal void * str8_serial_push_size(Arena *arena, String8List *srl, U64 size); internal void * str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size); internal void str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first); -internal void str8_serial_push_u64(Arena *arena, String8List *srl, U64 x); -internal void str8_serial_push_u32(Arena *arena, String8List *srl, U32 x); -internal void str8_serial_push_u16(Arena *arena, String8List *srl, U16 x); -internal void str8_serial_push_u8(Arena *arena, String8List *srl, U8 x); -internal void str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); -internal void str8_serial_push_string(Arena *arena, String8List *srl, String8 str); -internal void str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); +internal void * str8_serial_push_u64(Arena *arena, String8List *srl, U64 x); +internal void * str8_serial_push_u32(Arena *arena, String8List *srl, U32 x); +internal void * str8_serial_push_u16(Arena *arena, String8List *srl, U16 x); +internal void * str8_serial_push_u8(Arena *arena, String8List *srl, U8 x); +internal void * str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); +internal void * str8_serial_push_string(Arena *arena, String8List *srl, String8 str); #define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count)) #define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1) From 33b1e252951651b402dd3834cea8deafbd5f69a0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 9 Feb 2026 23:40:31 -0800 Subject: [PATCH 172/850] arch -> COFF machine --- src/coff/coff.c | 15 +++++++++++++++ src/coff/coff.h | 5 +++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/coff/coff.c b/src/coff/coff.c index eef1c129..b7534ee8 100644 --- a/src/coff/coff.c +++ b/src/coff/coff.c @@ -455,6 +455,21 @@ arch_from_coff_machine(COFF_MachineType machine) return result; } +internal COFF_MachineType +coff_machine_from_arch(Arch arch) +{ + COFF_MachineType machine = COFF_MachineType_Unknown; + switch (arch) { + case Arch_Null: machine = COFF_MachineType_Unknown; break; + case Arch_x86: machine = COFF_MachineType_X86; break; + case Arch_x64: machine = COFF_MachineType_X64; break; + case Arch_arm64: machine = COFF_MachineType_Arm64; break; + case Arch_arm32: machine = COFF_MachineType_Arm; break; + default: InvalidPath; break; + } + return machine; +} + internal U64 coff_foff_from_voff(COFF_SectionHeader *sections, U64 section_count, U64 voff) { diff --git a/src/coff/coff.h b/src/coff/coff.h index 4adff448..6c321fc6 100644 --- a/src/coff/coff.h +++ b/src/coff/coff.h @@ -628,8 +628,9 @@ internal U64 coff_word_size_from_machine (COFF_MachineType machine); internal U64 coff_default_exe_base_from_machine(COFF_MachineType machine); internal U64 coff_default_dll_base_from_machine(COFF_MachineType machine); -internal Arch arch_from_coff_machine(COFF_MachineType machine); -internal U64 coff_foff_from_voff(COFF_SectionHeader *sections, U64 section_count, U64 voff); +internal Arch arch_from_coff_machine(COFF_MachineType machine); +internal COFF_MachineType coff_machine_from_arch(Arch arch); +internal U64 coff_foff_from_voff(COFF_SectionHeader *sections, U64 section_count, U64 voff); //////////////////////////////// //~ rjf: Enum <=> String From 482a61aaf797d35d28b4800fa52ba105d6f21f32 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 9 Feb 2026 23:41:19 -0800 Subject: [PATCH 173/850] obj -> COFF serializer --- src/coff/coff_obj_writer.c | 100 ++++++++++++++++++++++++++++++++++++- src/coff/coff_obj_writer.h | 7 +++ 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/src/coff/coff_obj_writer.c b/src/coff/coff_obj_writer.c index f6a421f1..02fb5f1f 100644 --- a/src/coff/coff_obj_writer.c +++ b/src/coff/coff_obj_writer.c @@ -1,3 +1,6 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + internal COFF_ObjWriter* coff_obj_writer_alloc(COFF_TimeStamp time_stamp, COFF_MachineType machine) { @@ -5,7 +8,7 @@ coff_obj_writer_alloc(COFF_TimeStamp time_stamp, COFF_MachineType machine) COFF_ObjWriter *obj_writer = push_array(arena, COFF_ObjWriter, 1); obj_writer->arena = arena; obj_writer->time_stamp = time_stamp; - obj_writer->machine = machine; + obj_writer->machine = machine; return obj_writer; } @@ -508,5 +511,100 @@ coff_obj_section_is_before(void *raw_a, void *raw_b) return (*a)->section_number < (*b)->section_number; } +#ifdef OBJ_H +internal String8 +coff_from_obj(Arena *arena, OBJ *obj) +{ + Temp scratch = scratch_begin(&arena, 1); + COFF_MachineType machine = coff_machine_from_arch(obj->arch); + COFF_TimeStamp time_stamp = (COFF_TimeStamp)obj->time_stamp; + COFF_ObjWriter *cow = coff_obj_writer_alloc(time_stamp, machine); + + // push sections + HashTable *section_remap = hash_table_init(scratch.arena, obj->symbols.count * 2); + for EachNode(section_n, OBJ_SectionNode, obj->sections.first) { + OBJ_Section *section = §ion_n->v; + + COFF_SectionFlags flags = 0; + if (section->flags & OBJ_SectionFlag_Read) { flags |= COFF_SectionFlag_MemRead; } + if (section->flags & OBJ_SectionFlag_Write) { flags |= COFF_SectionFlag_MemWrite; } + if (section->flags & OBJ_SectionFlag_Exec) { flags |= COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode; } + if ( ! (section->flags & OBJ_SectionFlag_Exec)) { flags |= COFF_SectionFlag_CntInitializedData; } + if ( ! (section->flags & OBJ_SectionFlag_Load)) { flags |= COFF_SectionFlag_MemDiscardable; } + + COFF_ObjSection *section_coff = coff_obj_writer_push_section(cow, section->name, flags, str8_zero()); + section_coff->data = section->data; + + // obj -> coff section + hash_table_push_raw_raw(scratch.arena, section_remap, section, section_coff); + } + + // push symbols + HashTable *symbol_remap = hash_table_init(scratch.arena, obj->symbols.count * 2); + for EachNode(symbol_n, OBJ_SymbolNode, obj->symbols.first) { + OBJ_Symbol *symbol = &symbol_n->v; + switch (symbol->ref_kind) { + case OBJ_RefKind_Null: break; + case OBJ_RefKind_Section: { + OBJ_Section *section = symbol->ref; + COFF_ObjSection *section_coff = hash_table_search_raw_raw(section_remap, section); + COFF_SymbolLocation location = (COFF_SymbolLocation){ .type = COFF_SymbolLocation_Section, .u.section = section_coff }; + + COFF_SymStorageClass storage_class = COFF_SymStorageClass_Null; + switch (symbol->scope) { + case OBJ_SymbolScope_Null: break; + case OBJ_SymbolScope_Local: storage_class = COFF_SymStorageClass_Static; break; + case OBJ_SymbolScope_Global: storage_class = COFF_SymStorageClass_External; break; + } + + COFF_ObjSymbol *symbol_coff = coff_obj_writer_push_symbol(cow, + symbol->name, + 0, + location, + (COFF_SymbolType){0}, + storage_class); + hash_table_push_raw_raw(scratch.arena, symbol_remap, symbol, symbol_coff); + } break; + } + } + + // push relocations + for EachNode(section_n, OBJ_SectionNode, obj->sections.first) { + OBJ_Section *section = §ion_n->v; + COFF_ObjSection *section_coff = hash_table_search_raw_raw(section_remap, section); + + for EachNode(reloc_n, OBJ_RelocNode, section->relocs.first) { + OBJ_Reloc *reloc = &reloc_n->v; + + // obj -> coff reloc type + COFF_RelocType reloc_type_coff = 0; + switch (cow->machine) { + case COFF_MachineType_Unknown: break; + case COFF_MachineType_X64: { + switch (reloc->kind) { + case OBJ_RelocKind_Null: break; + case OBJ_RelocKind_SecRel: reloc_type_coff = COFF_Reloc_X64_SecRel; break; + default: InvalidPath; break; + } + } break; + default: InvalidPath; break; + } + + // push reloc entry + COFF_ObjSymbol *symbol_coff = hash_table_search_raw_raw(symbol_remap, reloc->symbol); + AssertAlways(symbol_coff); + coff_obj_writer_section_push_reloc(cow, section_coff, reloc->offset, symbol_coff, reloc_type_coff); + } + } + + String8 raw_obj = coff_obj_writer_serialize(arena, cow); + + coff_obj_writer_release(&cow); + + scratch_end(scratch); + return raw_obj; +} + +#endif diff --git a/src/coff/coff_obj_writer.h b/src/coff/coff_obj_writer.h index 0f68aabc..8c4d83d7 100644 --- a/src/coff/coff_obj_writer.h +++ b/src/coff/coff_obj_writer.h @@ -1,3 +1,6 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + #ifndef COFF_OBJ_WRITER_H #define COFF_OBJ_WRITER_H @@ -125,5 +128,9 @@ internal COFF_ObjReloc * coff_obj_writer_section_push_reloc_voff (COFF_ObjWrite internal void coff_obj_writer_push_directive(COFF_ObjWriter *obj_writer, String8 directive); +#ifdef OBJ_H +internal String8 coff_from_obj(Arena *arena, OBJ *obj); +#endif + #endif // COFF_OBJ_WRITER_H From 9b1a5ae8f8bc82a4a7d61d8df87f347e31e2ece8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 9 Feb 2026 23:41:33 -0800 Subject: [PATCH 174/850] minor fix --- src/third_party/stb/stb_sprintf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/third_party/stb/stb_sprintf.h b/src/third_party/stb/stb_sprintf.h index bc7d5fc5..515ba6c5 100644 --- a/src/third_party/stb/stb_sprintf.h +++ b/src/third_party/stb/stb_sprintf.h @@ -750,7 +750,7 @@ cl = lg; \ { stbsp__flush_cb(); Rng1U64 range = va_arg(va, Rng1U64); - bf += STB_SPRINTF_DECORATE(sprintf)(bf, "[0x%llx, 0x%llx]", range.min, range.max); + bf += STB_SPRINTF_DECORATE(sprintf)(bf, "[0x%llx, 0x%llx)", range.min, range.max); }break; // From 988b0f55411ffd8c8541a3256815ad74b99aaa92 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 9 Feb 2026 23:42:04 -0800 Subject: [PATCH 175/850] header guard typo --- src/linker/lf_hash_table.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/linker/lf_hash_table.h b/src/linker/lf_hash_table.h index 979e911c..08ea041d 100644 --- a/src/linker/lf_hash_table.h +++ b/src/linker/lf_hash_table.h @@ -2,7 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #ifndef LF_HASH_TABLE_H -#define LF_HAHS_TABLE_H +#define LF_HASH_TABLE_H typedef struct LFHT_Node { @@ -33,4 +33,4 @@ internal B32 lfht_insert(Arena *arena, LFHT_NodeChunkList *node_chunks, LFHT_Nod internal void ** lfht_data_from_node_chunk_lists(Arena *arena, U64 total_count, U64 list_count, LFHT_NodeChunkList *lists); -#endif // LF_HASH_TABLE_H \ No newline at end of file +#endif // LF_HASH_TABLE_H From 12f8f4e078f33f9d48de779a3299a7f7d5301de0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 10 Feb 2026 15:26:56 -0800 Subject: [PATCH 176/850] move DW_Form to the DWARF format header --- src/dwarf/dwarf.c | 303 +++++++++++++++++++++++++--------------- src/dwarf/dwarf.h | 122 ++++++++++------ src/dwarf/dwarf_parse.h | 22 --- 3 files changed, 275 insertions(+), 172 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 9e768ba1..2aad1d7a 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -1,84 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal U64 -dw_reg_size_from_code_x64(DW_Reg reg_code) -{ - switch (reg_code) { -#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_size; - DW_Regs_X64_XList -#undef X - } - return 0; -} - -internal U64 -dw_reg_pos_from_code_x64(DW_Reg reg_code) -{ - switch (reg_code) { -#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_pos; - DW_Regs_X64_XList -#undef X - } - return max_U64; -} - -internal U64 -dw_reg_size_from_code(Arch arch, DW_Reg reg_code) -{ - switch (arch) { - case Arch_Null: break; - case Arch_x64: return dw_reg_size_from_code_x64(reg_code); - default: NotImplemented; break; - } - return 0; -} - -internal U64 -dw_reg_pos_from_code(Arch arch, DW_Reg reg_code) -{ - switch (arch) { - case Arch_Null: break; - case Arch_x64: return dw_reg_pos_from_code_x64(reg_code); - default: NotImplemented; break; - } - return max_U64; -} - -internal U64 -dw_reg_count_from_arch(Arch arch) -{ - switch (arch) { - default: { NotImplemented; } // fall-through - case Arch_Null: return 0; - case Arch_x64: return DW_RegX64_Last; - } -} - -internal U64 -dw_reg_max_size_from_arch(Arch arch) -{ - local_persist U64 max_size = 0; - if (max_size == 0) { - U64 max_idx = dw_reg_count_from_arch(arch); - for EachIndex(reg_idx, max_idx) { - U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - max_size = Max(max_size, reg_size); - } - } - return max_size; -} - -internal U64 -dw_sp_from_arch(Arch arch) -{ - switch (arch) { - default: NotImplemented; - case Arch_Null: return 0; - case Arch_x64: return DW_RegX64_Rsp; - } -} - internal DW_AttribClass dw_attrib_class_from_attrib_v2(DW_AttribKind k) { @@ -275,39 +197,85 @@ dw_is_form_kind_ref(DW_Version ver, DW_Ext ext, DW_FormKind form_kind) return is_ref; } -internal String8 -dw_name_string_from_section_kind(DW_SectionKind k) +internal U64 +dw_reg_size_from_code_x64(DW_Reg reg_code) { - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_L); - DW_SectionKind_XList + switch (reg_code) { +#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_size; + DW_Regs_X64_XList #undef X } - return str8_zero(); + return 0; } -internal String8 -dw_mach_name_string_from_section_kind(DW_SectionKind k) +internal U64 +dw_reg_pos_from_code_x64(DW_Reg reg_code) { - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_M); - DW_SectionKind_XList + switch (reg_code) { +#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_pos; + DW_Regs_X64_XList #undef X } - return str8_zero(); + return max_U64; } -internal String8 -dw_dwo_name_string_from_section_kind(DW_SectionKind k) +internal U64 +dw_reg_size_from_code(Arch arch, DW_Reg reg_code) { - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_D); - DW_SectionKind_XList -#undef X + switch (arch) { + case Arch_Null: break; + case Arch_x64: return dw_reg_size_from_code_x64(reg_code); + default: NotImplemented; break; } - return str8_zero(); + return 0; } +internal U64 +dw_reg_pos_from_code(Arch arch, DW_Reg reg_code) +{ + switch (arch) { + case Arch_Null: break; + case Arch_x64: return dw_reg_pos_from_code_x64(reg_code); + default: NotImplemented; break; + } + return max_U64; +} + +internal U64 +dw_reg_count_from_arch(Arch arch) +{ + switch (arch) { + default: { NotImplemented; } // fall-through + case Arch_Null: return 0; + case Arch_x64: return DW_RegX64_Last; + } +} + +internal U64 +dw_reg_max_size_from_arch(Arch arch) +{ + local_persist U64 max_size = 0; + if (max_size == 0) { + U64 max_idx = dw_reg_count_from_arch(arch); + for EachIndex(reg_idx, max_idx) { + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); + max_size = Max(max_size, reg_size); + } + } + return max_size; +} + +internal U64 +dw_sp_from_arch(Arch arch) +{ + switch (arch) { + default: NotImplemented; + case Arch_Null: return 0; + case Arch_x64: return DW_RegX64_Rsp; + } +} + + internal U64 dw_size_from_format(DW_Format format) { @@ -540,14 +508,11 @@ dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode) return 0; } -//////////////////////////////// -//~ rjf: String <=> Enum - internal String8 dw_string_from_format(DW_Format format) { switch (format) { - case DW_Format_Null: return str8_zero(); + case DW_Format_Null: return str8_lit("NULL"); case DW_Format_32Bit: return str8_lit("DWARF32"); case DW_Format_64Bit: return str8_lit("DWARF64"); } @@ -704,6 +669,17 @@ dw_string_from_language(Arena *arena, DW_Language kind) return push_str8f(arena, "%x", kind); } +internal String8 +dw_string_from_comp_unit_kind(Arena *arena, DW_CompUnitKind kind) +{ + switch (kind) { +#define X(_N,_ID) case DW_CompUnitKind_##_N: return str8_lit(Stringify(_N)); + DW_CompUnitKind_XList +#undef X + } + return push_str8f(arena, "%x", kind); +} + internal String8 dw_string_from_inl(Arena *arena, DW_InlKind kind) { @@ -829,10 +805,42 @@ dw_string_from_cfa_opcode(DW_CFA_Opcode opcode) } internal String8 -dw_write_uleb128(Arena *arena, U64 v) +dw_name_string_from_section_kind(DW_SectionKind k) +{ + switch (k) { +#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_L); + DW_SectionKind_XList +#undef X + } + return str8_zero(); +} + +internal String8 +dw_mach_name_string_from_section_kind(DW_SectionKind k) +{ + switch (k) { +#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_M); + DW_SectionKind_XList +#undef X + } + return str8_zero(); +} + +internal String8 +dw_dwo_name_string_from_section_kind(DW_SectionKind k) +{ + switch (k) { +#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_D); + DW_SectionKind_XList +#undef X + } + return str8_zero(); +} + +internal U64 +dw_write_to_buffer_uleb128(U8 buffer[10], U64 v) { U64 buffer_size = 0; - U8 buffer[10]; U64 value = v; do { U8 byte = value & 0x7f; @@ -840,17 +848,16 @@ dw_write_uleb128(Arena *arena, U64 v) if (value != 0) { byte |= 0x80; } - Assert(buffer_size < sizeof(buffer)); + Assert(buffer_size < 10); buffer[buffer_size++] = byte; } while (value > 0); - return str8_copy(arena, str8(buffer, buffer_size)); + return buffer_size; } -internal String8 -dw_write_sleb128(Arena *arena, S64 v) +internal U64 +dw_write_to_buffer_sleb128(U8 buffer[10], U64 v) { U64 buffer_size = 0; - U8 buffer[10]; for (S64 value = v, more = 1; more != 0; ) { U8 byte = value & 0x7f; value >>= 7; @@ -860,9 +867,87 @@ dw_write_sleb128(Arena *arena, S64 v) } else { byte |= 0x80; } - Assert(buffer_size < sizeof(buffer)); + Assert(buffer_size < 10); buffer[buffer_size++] = byte; } + return buffer_size; +} + +internal String8 +dw_write_uleb128(Arena *arena, U64 v) +{ + U8 buffer[10]; + U64 buffer_size = dw_write_to_buffer_uleb128(buffer, v); return str8_copy(arena, str8(buffer, buffer_size)); } +internal String8 +dw_write_sleb128(Arena *arena, S64 v) +{ + U8 buffer[10]; + U64 buffer_size = dw_write_to_buffer_sleb128(buffer, v); + return str8_copy(arena, str8(buffer, buffer_size)); +} + +internal U64 +dw_size_from_uleb128(U64 v) +{ + U8 buffer[10]; + return dw_write_to_buffer_uleb128(buffer, v); +} + +internal U64 +dw_size_from_sleb128(S64 v) +{ + U8 buffer[10]; + return dw_write_to_buffer_sleb128(buffer, v); +} + +internal void * +dw_serial_push_length(Arena *arena, String8List *srl, DW_Format format, U64 length) +{ + void *result; + if (format == DW_Format_64Bit) { + U8 buffer[sizeof(U32) + sizeof(U64)]; + MemorySet(&buffer[0], 0xff, sizeof(U32)); + MemoryCopy(buffer + sizeof(U32), &length, sizeof(length)); + result = str8_serial_push_string(arena, srl, str8_array_fixed(buffer)); + } else { + result = str8_serial_push_string(arena, srl, str8((U8 *)&length, sizeof(U32))); + } + return result; +} + +internal void * +dw_serial_push_uint(Arena *arena, String8List *srl, DW_Format format, U64 v) +{ + String8 uint; + if (format == DW_Format_64Bit) { + U64 *ptr = push_array(arena, U64, 1); + *ptr = v; + uint = str8((U8 *)ptr, sizeof(*ptr)); + } else { + U32 *ptr = push_array(arena, U32, 1); + *ptr = safe_cast_u32(v); + uint = str8((U8 *)ptr, sizeof(*ptr)); + } + return str8_serial_push_string(arena, srl, uint); +} + +internal void * +dw_serial_push_uleb128(Arena *arena, String8List *srl, U64 v) +{ + U8 buffer[10]; + U64 buffer_size = dw_write_to_buffer_uleb128(buffer, v); + return str8_serial_push_string(arena, srl, str8(buffer, buffer_size)); +} + +internal void * +dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v) +{ + U8 buffer[10]; + U64 buffer_size = dw_write_to_buffer_sleb128(buffer, v); + return str8_serial_push_string(arena, srl, str8(buffer, buffer_size)); +} + + diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 2b540976..96689070 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -68,6 +68,15 @@ typedef enum DW_SectionKindEnum DW_Section_Count } DW_SectionKindEnum; +typedef U32 DW_SectionFlags; +enum +{ +#define X(_N, ...) DW_SectionFlag_##_N = (1 << DW_Section_##_N), + DW_SectionKind_XList +#undef X + DW_SectionFlag_All = 0xffffffffu, +}; + #define DW_Language_XList \ X(Null, 0x00) \ X(C89, 0x01) \ @@ -485,6 +494,30 @@ typedef enum DW_FormEnum #undef X } DW_FormEnum; +typedef union DW_Form +{ + DW_FormKind kind; + union { + String8 addr; + String8 block; + String8 data; + String8 string; + String8 exprloc; + B8 flag; + S64 sdata; + U64 udata; + U64 sec_offset; + U64 ref; + U64 strp_sup; + U64 xval; + U64 addrx; + U64 strx; + U64 rnglistx; + U64 ptr; + U64 implicit_const; + }; +} DW_Form; + //- Attributes DWARF2 #define DW_AttribKind_V2_XList \ @@ -1695,7 +1728,33 @@ typedef enum DW_RegX64Enum } DW_RegX64Enum; //////////////////////////////// +// Speced Encodings +internal DW_AttribClass dw_attrib_class_from_attrib_v2(DW_AttribKind k); +internal DW_AttribClass dw_attrib_class_from_attrib_v3(DW_AttribKind k); +internal DW_AttribClass dw_attrib_class_from_attrib_v4(DW_AttribKind k); +internal DW_AttribClass dw_attrib_class_from_attrib_v5(DW_AttribKind k); + +//////////////////////////////// +// Extensions + +internal DW_AttribClass dw_attrib_class_from_attrib_gnu (DW_AttribKind k); +internal DW_AttribClass dw_attrib_class_from_attrib_llvm (DW_AttribKind k); +internal DW_AttribClass dw_attrib_class_from_attrib_apple(DW_AttribKind k); +internal DW_AttribClass dw_attrib_class_from_attrib_mips (DW_AttribKind k); +internal DW_AttribClass dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind v); + +//////////////////////////////// +// Form Class Encodings + +internal DW_AttribClass dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k); +internal B32 dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind); +internal B32 dw_is_form_kind_ref(DW_Version ver, DW_Ext ext, DW_FormKind form_kind); + +//////////////////////////////// +// xlist helpers + +// regs internal U64 dw_reg_size_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_pos_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code); @@ -1703,58 +1762,24 @@ internal U64 dw_reg_pos_from_code(Arch arch, DW_Reg reg_code); internal U64 dw_reg_count_from_arch(Arch arch); internal U64 dw_reg_max_size_from_arch(Arch arch); internal U64 dw_sp_from_arch(Arch arch); - -//- Attrib Class Encodings - -// Speced Encodings -internal DW_AttribClass dw_attrib_class_from_attrib_v2(DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_v3(DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_v4(DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_v5(DW_AttribKind k); - -// Extensions -internal DW_AttribClass dw_attrib_class_from_attrib_gnu (DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_llvm (DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_apple(DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_mips (DW_AttribKind k); - -internal DW_AttribClass dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind v); - -//- Form Class Encodings - -internal DW_AttribClass dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k); - -internal B32 dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind); - -internal B32 dw_is_form_kind_ref(DW_Version ver, DW_Ext ext, DW_FormKind form_kind); - -//- Section Names - -internal String8 dw_name_string_from_section_kind (DW_SectionKind k); -internal String8 dw_mach_name_string_from_section_kind(DW_SectionKind k); -internal String8 dw_dwo_name_string_from_section_kind (DW_SectionKind k); - -//////////////////////////////// - internal U64 dw_size_from_format(DW_Format format); -//////////////////////////////// - +// attrib form -> value class internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib, DW_FormKind form_kind); +// lang internal U64 dw_pick_default_lower_bound(DW_Language lang); +// expr internal U64 dw_operand_count_from_expr_op(DW_ExprOp op); internal U64 dw_pop_count_from_expr_op(DW_ExprOp op); internal U64 dw_push_count_from_expr_op(DW_ExprOp op); internal DW_ExprOperandType * dw_operand_types_from_expr_opcode(DW_ExprOp op); -//////////////////////////////// -//~ CFA - -internal U64 dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode); -internal B32 dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode); -internal B32 dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode); +// CFA +internal U64 dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode); +internal B32 dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode); +internal B32 dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode); internal DW_CFA_OperandType * dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode); //////////////////////////////// @@ -1766,6 +1791,7 @@ internal String8 dw_string_from_tag_kind(Arena *arena, DW_TagKind kind); internal String8 dw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKind kind); internal String8 dw_string_from_form_kind(Arena *arena, DW_Version ver, DW_FormKind kind); internal String8 dw_string_from_language(Arena *arena, DW_Language kind); +internal String8 dw_string_from_comp_unit_kind(Arena *arena, DW_CompUnitKind kind); internal String8 dw_string_from_inl(Arena *arena, DW_InlKind kind); internal String8 dw_string_from_access_kind(Arena *arena, DW_AccessKind kind); internal String8 dw_string_from_calling_convetion(Arena *arena, DW_CallingConventionKind kind); @@ -1777,10 +1803,24 @@ internal String8 dw_string_from_section_kind(Arena *arena, DW_SectionKind kind); internal String8 dw_string_from_rng_list_entry_kind(Arena *arena, DW_RLE kind); internal String8 dw_string_from_register(Arena *arena, Arch arch, U64 reg_id); internal String8 dw_string_from_cfa_opcode(DW_CFA_Opcode opcode); +internal String8 dw_name_string_from_section_kind(DW_SectionKind k); +internal String8 dw_mach_name_string_from_section_kind(DW_SectionKind k); +internal String8 dw_dwo_name_string_from_section_kind (DW_SectionKind k); //////////////////////////////// +// Serializers + +internal U64 dw_write_to_buffer_uleb128(U8 buffer[10], U64 v); +internal U64 dw_write_to_buffer_sleb128(U8 buffer[10], U64 v); internal String8 dw_write_uleb128(Arena *arena, U64 v); internal String8 dw_write_sleb128(Arena *arena, S64 v); +internal U64 dw_size_from_uleb128(U64 v); +internal U64 dw_size_from_sleb128(S64 v); + +internal void * dw_serial_push_length(Arena *arena, String8List *srl, DW_Format format, U64 length); +internal void * dw_serial_push_uint(Arena *arena, String8List *srl, DW_Format format, U64 v); +internal void * dw_serial_push_uleb128(Arena *arena, String8List *srl, U64 v); +internal void * dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v); #endif // DWARF_H diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index d34d7e00..3ef4c79e 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -81,34 +81,12 @@ typedef struct DW_Abbrev DW_AbbrevFlags flags; } DW_Abbrev; -typedef union DW_Form -{ - String8 addr; - String8 block; - String8 data; - String8 string; - String8 exprloc; - B8 flag; - S64 sdata; - U64 udata; - U64 sec_offset; - U64 ref; - U64 strp_sup; - U64 xval; - U64 addrx; - U64 strx; - U64 rnglistx; - U64 ptr; - U64 implicit_const; -} DW_Form; - typedef struct DW_Attrib { U64 info_off; U64 abbrev_off; U64 abbrev_id; DW_AttribKind attrib_kind; - DW_FormKind form_kind; DW_Form form; } DW_Attrib; From 6e100ad52f2b59a64ef73e13a0ae352d64fc7313 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 10 Feb 2026 15:27:27 -0800 Subject: [PATCH 177/850] make form_kind part of DW_Form --- src/dwarf/dwarf_parse.c | 320 ++++++++++++++++++++-------------------- src/dwarf/dwarf_parse.h | 39 ++--- 2 files changed, 181 insertions(+), 178 deletions(-) diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index b95cfddd..1168d705 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -173,7 +173,7 @@ internal DW_SectionKind dw_section_kind_from_string(String8 string) { DW_SectionKind s = DW_Section_Null; -#define X(_K,_L,_M,_W) \ +#define X(_K,_L,_M,_W) \ if (str8_match_lit(_L, string, 0)) { s = DW_Section_##_K; } \ if (str8_match_lit(_M, string, 0)) { s = DW_Section_##_K; } DW_SectionKind_XList @@ -185,8 +185,7 @@ internal DW_SectionKind dw_section_dwo_kind_from_string(String8 string) { DW_SectionKind s = DW_Section_Null; -#define X(_K,_L,_M,_W) \ -if (str8_match_lit(_W, string, 0)) { s = DW_Section_##_K; } +#define X(_K,_L,_M,_W) if (str8_match_lit(_W, string, 0)) { s = DW_Section_##_K; } DW_SectionKind_XList #undef X return s; @@ -198,28 +197,37 @@ dw_unit_ranges_from_data(Arena *arena, String8 data) Rng1U64List result = {0}; for (U64 cursor = 0; cursor < data.size; ) { - // read CU size - U64 cu_size = 0; - U64 cu_size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &cu_size); - - // was read ok? - if (cu_size_size == 0) { - break; + U64 start = cursor; + + // read unit size + U64 size; + U64 size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &size); + if (size_size == 0) { break; } + cursor += size_size; + + // is unit size valid? + if (cursor + size > data.size) { break; } + cursor += size; + + // push unit range + if (size > 0) { + rng1u64_list_push(arena, &result, rng_1u64(start, cursor)); } - - if (cu_size > 0) { - // push unit range - rng1u64_list_push(arena, &result, rng_1u64(cursor, cursor+cu_size+cu_size_size)); - } - - // advance - cursor += cu_size_size; - cursor += cu_size; } return result; } +internal Rng1U64Array +dw_unit_ranges_from_data_arr(Arena *arena, String8 data) +{ + Temp scratch = scratch_begin(&arena, 1); + Rng1U64List list = dw_unit_ranges_from_data(scratch.arena, data); + Rng1U64Array arr = rng1u64_array_from_list(arena, &list); + scratch_end(scratch); + return arr; +} + internal U64 dw_read_list_unit_header_addr(String8 unit_data, DW_ListUnit *lu_out) { @@ -731,8 +739,9 @@ dw_read_form(String8 data, } break; default: InvalidPath; break; } - + if (form_out) { + form.kind = form_kind; *form_out = form; } if (bytes_read_out) { @@ -774,7 +783,7 @@ dw_read_tag(Arena *arena, if (tag_abbrev_id > 0) { // map abbrev id -> .debug_abbrev offset U64 abbrev_cursor = dw_abbrev_offset_from_abbrev_id(abbrev_table, tag_abbrev_id); - if (abbrev_cursor >= abbrev_data.size) { Assert(0 && "failed to find abbrev id"); goto exit; } + if (abbrev_cursor >= abbrev_data.size) { log_user_errorf("failed to find abbrev id 0x%I64x for tag 0x%I64x", tag_abbrev_id, tag_info_off); goto exit; } // read tag abbrev DW_Abbrev tag_abbrev = {0}; @@ -817,7 +826,6 @@ dw_read_tag(Arena *arena, attrib_n->v.abbrev_off = attrib_abbrev_off; attrib_n->v.abbrev_id = attrib_abbrev.id; attrib_n->v.attrib_kind = attrib_kind; - attrib_n->v.form_kind = form_kind; attrib_n->v.form = form; // push node to list @@ -882,31 +890,31 @@ dw_u64_from_const_value(String8 const_value) } internal U64 -dw_interp_sec_offset(DW_FormKind form_kind, DW_Form form) +dw_interp_sec_offset(DW_Form form) { U64 sec_offset = 0; - if (form_kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { sec_offset = form.sec_offset; - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } return sec_offset; } internal String8 -dw_interp_exprloc(DW_FormKind form_kind, DW_Form form) +dw_interp_exprloc(DW_Form form) { String8 expr = {0}; - if (form_kind == DW_Form_ExprLoc) { + if (form.kind == DW_Form_ExprLoc) { expr = form.exprloc; - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } return expr; } internal U128 -dw_interp_const_u128(DW_FormKind form_kind, DW_Form form) +dw_interp_const_u128(DW_Form form) { AssertAlways(form.data.size <= sizeof(U128)); U128 result = {0}; @@ -915,10 +923,10 @@ dw_interp_const_u128(DW_FormKind form_kind, DW_Form form) } internal U64 -dw_interp_const64(U64 type_byte_size, DW_ATE type_encoding, DW_FormKind form_kind, DW_Form form) +dw_interp_const64(U64 type_byte_size, DW_ATE type_encoding, DW_Form form) { U64 result = max_U64; - if (form_kind == DW_Form_Data1 || form_kind == DW_Form_Data2 || form_kind == DW_Form_Data4 || form_kind == DW_Form_Data8 || form_kind == DW_Form_Data16) { + if (form.kind == DW_Form_Data1 || form.kind == DW_Form_Data2 || form.kind == DW_Form_Data4 || form.kind == DW_Form_Data8 || form.kind == DW_Form_Data16) { if (form.data.size <= sizeof(result)) { if (!dw_try_u64_from_const_value(type_byte_size, type_encoding, form.data, &result)) { Assert(!"unable to decode data"); @@ -926,13 +934,13 @@ dw_interp_const64(U64 type_byte_size, DW_ATE type_encoding, DW_FormKind form_kin } else { Assert(!"unable to cast U128 to U64"); } - } else if (form_kind == DW_Form_UData) { + } else if (form.kind == DW_Form_UData) { result = form.udata; - } else if (form_kind == DW_Form_SData) { + } else if (form.kind == DW_Form_SData) { result = form.sdata; - } else if (form_kind == DW_Form_ImplicitConst) { + } else if (form.kind == DW_Form_ImplicitConst) { result = form.implicit_const; - } else if (form_kind == DW_Form_Null) { + } else if (form.kind == DW_Form_Null) { // skip } else { AssertAlways(!"unexpected form"); @@ -941,47 +949,47 @@ dw_interp_const64(U64 type_byte_size, DW_ATE type_encoding, DW_FormKind form_kin } internal U64 -dw_interp_const_u64(DW_FormKind form_kind, DW_Form form) +dw_interp_const_u64(DW_Form form) { - return dw_interp_const64(sizeof(U64), DW_ATE_Unsigned, form_kind, form); + return dw_interp_const64(sizeof(U64), DW_ATE_Unsigned, form); } internal U32 -dw_interp_const_u32(DW_FormKind form_kind, DW_Form form) +dw_interp_const_u32(DW_Form form) { - U64 const64 = dw_interp_const_u64(form_kind, form); + U64 const64 = dw_interp_const_u64(form); U32 const32 = safe_cast_u32(const64); return const32; } internal S64 -dw_interp_const_s64(DW_FormKind form_kind, DW_Form form) +dw_interp_const_s64(DW_Form form) { - U64 const_u64 = dw_interp_const_u64(form_kind, form); + U64 const_u64 = dw_interp_const_u64(form); S64 const_s64 = (S64)const_u64; return const_s64; } internal S32 -dw_interp_const_s32(DW_FormKind form_kind, DW_Form form) +dw_interp_const_s32(DW_Form form) { - U32 const_u32 = dw_interp_const_u32(form_kind, form); + U32 const_u32 = dw_interp_const_u32(form); S32 const_s32 = (S32)const_u32; return const_s32; } internal U64 -dw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_FormKind form_kind, DW_Form form) +dw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_Form form) { U64 address = 0; - if (form_kind == DW_Form_Addr) { + if (form.kind == DW_Form_Addr) { if (!dw_try_u64_from_const_value(address_size, DW_ATE_Address, form.addr, &address)) { AssertAlways(!"unable to decode address"); } - } else if (form_kind == DW_Form_Addrx || form_kind == DW_Form_Addrx1 || form_kind == DW_Form_Addrx2 || - form_kind == DW_Form_Addrx3 || form_kind == DW_Form_Addrx4) { + } else if (form.kind == DW_Form_Addrx || form.kind == DW_Form_Addrx1 || form.kind == DW_Form_Addrx2 || + form.kind == DW_Form_Addrx3 || form.kind == DW_Form_Addrx4) { address = dw_addr_from_list_unit(addr_lu, form.xval); - } else if (form_kind == DW_Form_SecOffset) { + } else if (form.kind == DW_Form_SecOffset) { if (addr_lu->segment_selector_size > 0) { AssertAlways(!"TODO: support for segmented address space"); } @@ -990,14 +998,14 @@ dw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_Form } else { Assert(!"out of bounds .debug_addr offset"); } - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } return address; } internal String8 -dw_interp_block(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_block(DW_Input *input, DW_CompUnit *cu, DW_Form form) { NotImplemented; return str8_zero(); @@ -1007,24 +1015,23 @@ internal String8 dw_interp_string(DW_Input *input, DW_Format unit_format, DW_ListUnit *str_offsets, - DW_FormKind form_kind, DW_Form form) { String8 string = {0}; - if (form_kind == DW_Form_String) { + if (form.kind == DW_Form_String) { string = form.string; - } else if (form_kind == DW_Form_Strp) { + } else if (form.kind == DW_Form_Strp) { U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, form.sec_offset, &string); Assert(bytes_read > 0); - } else if (form_kind == DW_Form_LineStrp) { + } else if (form.kind == DW_Form_LineStrp) { U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_LineStr].data, form.sec_offset, &string); Assert(bytes_read > 0); - } else if (form_kind == DW_Form_StrpSup) { + } else if (form.kind == DW_Form_StrpSup) { U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, form.strp_sup, &string); Assert(bytes_read > 0); - } else if (form_kind == DW_Form_Strx || form_kind == DW_Form_Strx1 || - form_kind == DW_Form_Strx2 || form_kind == DW_Form_Strx3 || - form_kind == DW_Form_Strx4) { + } else if (form.kind == DW_Form_Strx || form.kind == DW_Form_Strx1 || + form.kind == DW_Form_Strx2 || form.kind == DW_Form_Strx3 || + form.kind == DW_Form_Strx4) { U64 sec_offset = dw_offset_from_list_unit(str_offsets, form.xval); if (sec_offset < input->sec[DW_Section_Str].data.size) { U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, sec_offset, &string); @@ -1032,78 +1039,73 @@ dw_interp_string(DW_Input *input, } else { AssertAlways(!"unable to translate index to offset"); } - } else if (form_kind == DW_Form_GNU_StrpAlt) { + } else if (form.kind == DW_Form_GNU_StrpAlt) { NotImplemented; - } else if (form_kind == DW_Form_GNU_StrIndex) { + } else if (form.kind == DW_Form_GNU_StrIndex) { NotImplemented; - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } return string; } internal String8 -dw_interp_line_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_line_ptr(DW_Input *input, DW_Form form) { String8 result = {0}; - if (form_kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { result = str8_skip(input->sec[DW_Section_Line].data, form.sec_offset); - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } return result; } internal DW_LineFile * -dw_interp_file(DW_LineVMHeader *line_vm, DW_FormKind form_kind, DW_Form form) +dw_interp_file(DW_LineVM *line_vm, DW_Form form) { - DW_LineFile *result = 0; - U64 file_idx = dw_interp_const_u64(form_kind, form); - if (file_idx < line_vm->file_table.count) { - result = &line_vm->file_table.v[file_idx]; - } else { - Assert(!"out of bounds file index"); - } + U64 file_idx = dw_interp_const_u64(form); + DW_LineFile *result = dw_line_vm_find_file(line_vm, file_idx); return result; } internal DW_Reference -dw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_Form form) { DW_Reference ref = {0}; - if (form_kind == DW_Form_Ref1 || form_kind == DW_Form_Ref2 || - form_kind == DW_Form_Ref4 || form_kind == DW_Form_Ref8 || - form_kind == DW_Form_RefUData) { + if (form.kind == DW_Form_Ref1 || form.kind == DW_Form_Ref2 || + form.kind == DW_Form_Ref4 || form.kind == DW_Form_Ref8 || + form.kind == DW_Form_RefUData) { ref.cu = cu; ref.info_off = cu->info_range.min + form.ref; - } else if (form_kind == DW_Form_RefAddr) { + } else if (form.kind == DW_Form_RefAddr) { NotImplemented; - } else if (form_kind == DW_Form_RefSig8) { + } else if (form.kind == DW_Form_RefSig8) { NotImplemented; - } else if (form_kind == DW_Form_RefSup4 || form_kind == DW_Form_RefSup8) { + } else if (form.kind == DW_Form_RefSup4 || form.kind == DW_Form_RefSup8) { NotImplemented; - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } return ref; } internal DW_LocList -dw_interp_loclist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_loclist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form) { DW_LocList loclist = {0}; if (cu->version < DW_Version_5) { - if (form_kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { U64 sec_offset = max_U64; - if (form_kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { sec_offset = form.sec_offset; - } else if (form_kind == DW_Form_Data8 || form_kind == DW_Form_Data4 || - form_kind == DW_Form_Data2 || form_kind == DW_Form_Data1) { + } else if (form.kind == DW_Form_Data8 || form.kind == DW_Form_Data4 || + form.kind == DW_Form_Data2 || form.kind == DW_Form_Data1) { if (!dw_try_u64_from_const_value(form.data.size, DW_ATE_Unsigned, form.data, &sec_offset)) { Assert(!"unable to extract section offset"); } - } else if (form_kind == DW_Form_Null) { + } else if (form.kind == DW_Form_Null) { Assert(!"unexpected form"); } @@ -1157,22 +1159,22 @@ dw_interp_loclist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind fo cursor += expr_size; } } - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } } else { DW_Version version = DW_Version_Null; String8 raw_lle = {0}; - if (form_kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { // offset is from beginning of the section U64 sec_offset = form.sec_offset; raw_lle = str8_skip(input->sec[DW_Section_LocLists].data, sec_offset); - } else if (form_kind == DW_Form_LocListx) { + } else if (form.kind == DW_Form_LocListx) { // offset is from beginning of the entries U64 entries_off = dw_offset_from_list_unit(cu->loclists_lu, form.xval); raw_lle = str8_skip(cu->loclists_lu->entries, entries_off); version = cu->loclists_lu->version; - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } @@ -1364,33 +1366,33 @@ dw_interp_loclist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind fo } internal B32 -dw_interp_flag(DW_FormKind form_kind, DW_Form form) +dw_interp_flag(DW_Form form) { B32 flag = 0; - if (form_kind == DW_Form_Flag || form_kind == DW_Form_FlagPresent) { + if (form.kind == DW_Form_Flag || form.kind == DW_Form_FlagPresent) { flag = form.flag; - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } return flag; } internal Rng1U64List -dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form) +dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form) { Rng1U64List rnglist = {0}; if (cu->version < DW_Version_5) { // decode section offset U64 sec_offset = max_U64; - if (form_kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { sec_offset = form.sec_offset; - } else if (form_kind == DW_Form_Data8 || form_kind == DW_Form_Data4 || - form_kind == DW_Form_Data2 || form_kind == DW_Form_Data1) { + } else if (form.kind == DW_Form_Data8 || form.kind == DW_Form_Data4 || + form.kind == DW_Form_Data2 || form.kind == DW_Form_Data1) { if (!dw_try_u64_from_const_value(form.data.size, DW_ATE_Unsigned, form.data, &sec_offset)) { Assert(!"unable to extract section offset"); } - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { Assert(!"unexpected form"); } @@ -1428,15 +1430,15 @@ dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind fo } } else { String8 raw_rle = {0}; - if (form_kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { // offset is from beginning of the section U64 sec_offset = form.sec_offset; raw_rle = str8_skip(input->sec[DW_Section_RngLists].data, sec_offset); - } else if (form_kind == DW_Form_RngListx) { + } else if (form.kind == DW_Form_RngListx) { // offset is from beginning of the entries U64 sec_offset = dw_offset_from_list_unit(cu->rnglists_lu, form.xval); raw_rle = str8_skip(cu->rnglists_lu->entries, sec_offset); - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { AssertAlways(!"unexpected form"); } @@ -1567,47 +1569,47 @@ dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind fo } internal String8 -dw_interp_secptr(DW_Input *input, DW_SectionKind section, DW_FormKind form_kind, DW_Form form) +dw_interp_secptr(DW_Input *input, DW_SectionKind section, DW_Form form) { String8 secptr = {0}; - if (form_kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { String8 sect = input->sec[section].data; Rng1U64 range = rng_1u64(form.sec_offset, sect.size); secptr = str8_substr(sect, range); - } else if (form_kind != DW_Form_Null) { + } else if (form.kind != DW_Form_Null) { Assert(!"unexpected form"); } return secptr; } internal String8 -dw_interp_addrptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_addrptr(DW_Input *input, DW_Form form) { - return dw_interp_secptr(input, DW_Section_Addr, form_kind, form); + return dw_interp_secptr(input, DW_Section_Addr, form); } internal String8 -dw_interp_str_offsets_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_str_offsets_ptr(DW_Input *input, DW_Form form) { - return dw_interp_secptr(input, DW_Section_StrOffsets, form_kind, form); + return dw_interp_secptr(input, DW_Section_StrOffsets, form); } internal String8 -dw_interp_rnglists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_rnglists_ptr(DW_Input *input, DW_Form form) { - return dw_interp_secptr(input, DW_Section_RngLists, form_kind, form); + return dw_interp_secptr(input, DW_Section_RngLists, form); } internal String8 -dw_interp_loclists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form) +dw_interp_loclists_ptr(DW_Input *input, DW_Form form) { - return dw_interp_secptr(input, DW_Section_LocLists, form_kind, form); + return dw_interp_secptr(input, DW_Section_LocLists, form); } internal DW_AttribClass dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib) { - return dw_pick_attrib_value_class(cu->version, cu->ext, cu->relaxed, attrib->attrib_kind, attrib->form_kind); + return dw_pick_attrib_value_class(cu->version, cu->ext, cu->relaxed, attrib->attrib_kind, attrib->form.kind); } internal String8 @@ -1615,7 +1617,7 @@ dw_exprloc_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_ExprLoc || value_class == DW_AttribClass_Block); - return dw_interp_exprloc(attrib->form_kind, attrib->form); + return dw_interp_exprloc(attrib->form); } internal U128 @@ -1623,7 +1625,7 @@ dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_u128(attrib->form_kind, attrib->form); + return dw_interp_const_u128(attrib->form); } internal U64 @@ -1631,7 +1633,7 @@ dw_const_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_u64(attrib->form_kind, attrib->form); + return dw_interp_const_u64(attrib->form); } internal U32 @@ -1639,7 +1641,7 @@ dw_const_u32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_u32(attrib->form_kind, attrib->form); + return dw_interp_const_u32(attrib->form); } internal S64 @@ -1647,7 +1649,7 @@ dw_const_s64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_s64(attrib->form_kind, attrib->form); + return dw_interp_const_s64(attrib->form); } internal S32 @@ -1655,7 +1657,7 @@ dw_const_s32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_s32(attrib->form_kind, attrib->form); + return dw_interp_const_s32(attrib->form); } internal B32 @@ -1663,7 +1665,7 @@ dw_flag_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Flag); - return dw_interp_flag(attrib->form_kind, attrib->form); + return dw_interp_flag(attrib->form); } internal U64 @@ -1673,22 +1675,18 @@ dw_address_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Address || value_class == DW_AttribClass_AddrPtr); - DW_FormKind form_kind = attrib->form_kind; - DW_Form form = attrib->form; + DW_Form form = attrib->form; if (value_class == DW_AttribClass_AddrPtr) { - - if (attrib->form_kind == DW_Form_SecOffset) { - - + if (attrib->form.kind == DW_Form_SecOffset) { + NotImplemented; } else { AssertAlways(!"unexpected form"); } - - form_kind = DW_Form_Addr; - form.addr = dw_interp_addrptr(input, attrib->form_kind, attrib->form); + form.kind = DW_Form_Addr; + form.addr = dw_interp_addrptr(input, attrib->form); } - return dw_interp_address(cu->address_size, cu->low_pc, cu->addr_lu, form_kind, form); + return dw_interp_address(cu->address_size, cu->low_pc, cu->addr_lu, form); } internal String8 @@ -1696,7 +1694,7 @@ dw_block_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Block); - return dw_interp_block(input, cu, attrib->form_kind, attrib->form); + return dw_interp_block(input, cu, attrib->form); } internal String8 @@ -1704,7 +1702,7 @@ dw_string_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_String || value_class == DW_AttribClass_StrOffsetsPtr); - return dw_interp_string(input, cu->format, cu->str_offsets_lu, attrib->form_kind, attrib->form); + return dw_interp_string(input, cu->format, cu->str_offsets_lu, attrib->form); } internal String8 @@ -1712,15 +1710,15 @@ dw_line_ptr_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_LinePtr); - return dw_interp_line_ptr(input, attrib->form_kind, attrib->form); + return dw_interp_line_ptr(input, attrib->form); } internal DW_LineFile * -dw_file_from_attrib(DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Attrib *attrib) +dw_file_from_attrib(DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_file(line_vm, attrib->form_kind, attrib->form); + return dw_interp_file(line_vm, attrib->form); } internal DW_Reference @@ -1728,7 +1726,7 @@ dw_ref_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Reference); - return dw_interp_ref(input, cu, attrib->form_kind, attrib->form); + return dw_interp_ref(input, cu, attrib->form); } internal DW_LocList @@ -1738,7 +1736,7 @@ dw_loclist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_LocList || value_class == DW_AttribClass_LocListPtr); - return dw_interp_loclist(arena, input, cu, attrib->form_kind, attrib->form); + return dw_interp_loclist(arena, input, cu, attrib->form); } internal Rng1U64List @@ -1747,7 +1745,7 @@ dw_rnglist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib Rng1U64List rnglist = {0}; DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); if (value_class == DW_AttribClass_RngListPtr || value_class == DW_AttribClass_RngList) { - rnglist = dw_interp_rnglist(arena, input, cu, attrib->form_kind, attrib->form); + rnglist = dw_interp_rnglist(arena, input, cu, attrib->form); } else if (value_class != DW_AttribClass_Null) { Assert(!"unexpected value class"); } @@ -1777,7 +1775,7 @@ dw_attrib_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind k if (cu && cu->tag_ht) { DW_Attrib *ao_attrib = dw_attrib_from_tag_(tag, DW_AttribKind_AbstractOrigin); if (ao_attrib->attrib_kind == DW_AttribKind_AbstractOrigin) { - DW_Reference ref = dw_interp_ref(input, cu, ao_attrib->form_kind, ao_attrib->form); + DW_Reference ref = dw_interp_ref(input, cu, ao_attrib->form); DW_TagNode *ref_tag = dw_tag_node_from_info_off(ref.cu, ref.info_off); attrib = dw_attrib_from_tag_(ref_tag->tag, kind); } @@ -1868,7 +1866,7 @@ dw_flag_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_At } internal DW_LineFile * -dw_file_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind) +dw_file_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind) { return dw_file_from_attrib(cu, line_vm, dw_attrib_from_tag(input, cu, tag, kind)); } @@ -1929,11 +1927,11 @@ dw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind k U64 type_byte_size = dw_byte_size_from_tag(input, cu, type_tag); DW_ATE type_encoding = dw_const_u64_from_tag_attrib_kind(input, type_ref.cu, type_tag, DW_AttribKind_Encoding); if (type_encoding == DW_ATE_Unsigned || type_encoding == DW_ATE_UnsignedChar) { - result = dw_interp_const64(type_byte_size, type_encoding, attrib->form_kind, attrib->form); + result = dw_interp_const64(type_byte_size, type_encoding, attrib->form); } scratch_end(scratch); } else { - result = dw_interp_const_u64(attrib->form_kind, attrib->form); + result = dw_interp_const_u64(attrib->form); } } else if (attrib_class == DW_AttribClass_Address) { result = dw_address_from_attrib(input, cu, attrib); @@ -1949,7 +1947,7 @@ internal B32 dw_is_attrib_var_ref(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) { B32 is_var_ref = 0; - if (dw_is_form_kind_ref(cu->version, cu->ext, attrib->form_kind)) { + if (dw_is_form_kind_ref(cu->version, cu->ext, attrib->form.kind)) { Temp scratch = scratch_begin(0,0); DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); DW_Tag ref_tag = {0}; @@ -2029,8 +2027,8 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 dw_read_tag(arena, input, abbrev_table, version, format, address_size, info_range, cu_header_offset + header_size, &cu_tag); // TODO: handle these unit types - Assert(cu_tag.kind != DW_TagKind_SkeletonUnit); - Assert(cu_tag.kind != DW_TagKind_TypeUnit); + if (cu_tag.kind == DW_TagKind_SkeletonUnit) { log_user_errorf("TODO: Skeleton Unit"); } + if (cu_tag.kind == DW_TagKind_TypeUnit) { log_user_errorf("TODO Type Unit"); } if (cu_tag.kind != DW_TagKind_CompileUnit && cu_tag.kind != DW_TagKind_PartialUnit) { // unexpected tag, release memory and exit @@ -2045,10 +2043,10 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 DW_Attrib *loclists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LocListsBase ); // interp attribs as section offsets - U64 addr_sec_off = dw_interp_sec_offset(addr_base_attrib->form_kind, addr_base_attrib->form ); - U64 str_offsets_sec_off = dw_interp_sec_offset(str_offsets_base_attrib->form_kind, str_offsets_base_attrib->form); - U64 rnglists_sec_off = dw_interp_sec_offset(rnglists_base_attrib->form_kind, rnglists_base_attrib->form ); - U64 loclists_sec_off = dw_interp_sec_offset(loclists_base_attrib->form_kind, loclists_base_attrib->form ); + U64 addr_sec_off = dw_interp_sec_offset(addr_base_attrib->form ); + U64 str_offsets_sec_off = dw_interp_sec_offset(str_offsets_base_attrib->form); + U64 rnglists_sec_off = dw_interp_sec_offset(rnglists_base_attrib->form ); + U64 loclists_sec_off = dw_interp_sec_offset(loclists_base_attrib->form ); // map section offset to unit index U64 addr_lu_idx = rng_1u64_array_bsearch(lu_input.addr_ranges, addr_sec_off ); @@ -2064,7 +2062,7 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 // find compile unit base address DW_Attrib *low_pc_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LowPc); - U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form_kind, low_pc_attrib->form); + U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form); // fill out compile unit cu.relaxed = relaxed; @@ -2194,7 +2192,7 @@ dw_read_line_vm_header(Arena *arena, DW_LineVMHeader *header_out) { Temp scratch = scratch_begin(&arena, 1); - + // read unit length U64 length = 0; U64 length_size = str8_deserial_read_dwarf_packed_size(cu_stmt_list, 0, &length); @@ -2339,7 +2337,7 @@ dw_read_line_vm_header(Arena *arena, U64 form_size = 0; if (!dw_read_form(str8_skip(data, cursor), version, format, address_size, form_kind, max_U64, &form, &form_size)) { goto exit; } cursor += form_size; - dir_table.v[i] = dw_interp_string(input, format, cu_str_offsets, form_kind, form); + dir_table.v[i] = dw_interp_string(input, format, cu_str_offsets, form); } } @@ -2372,12 +2370,12 @@ dw_read_line_vm_header(Arena *arena, cursor += form_size; switch (lnct) { - case DW_LNCT_Path: { file->file_name = dw_interp_string(input, format, cu_str_offsets, form_kind, form); } break; - case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form_kind, form); } break; - case DW_LNCT_TimeStamp: { file->modify_time = dw_interp_const_u64(form_kind, form); } break; - case DW_LNCT_Size: { file->file_size = dw_interp_const_u64(form_kind, form); } break; - case DW_LNCT_MD5: { file->md5_digest = dw_interp_const_u128(form_kind, form); } break; - case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form_kind, form); } break; + case DW_LNCT_Path: { file->file_name = dw_interp_string(input, format, cu_str_offsets, form); } break; + case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form); } break; + case DW_LNCT_TimeStamp: { file->modify_time = dw_interp_const_u64(form); } break; + case DW_LNCT_Size: { file->file_size = dw_interp_const_u64(form); } break; + case DW_LNCT_MD5: { file->md5_digest = dw_interp_const_u128(form); } break; + case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form); } break; default: { Assert(!"unexpected LNTC encoding"); } break; @@ -2424,7 +2422,11 @@ dw_line_vm_init(DW_Input *input, DW_CompUnit *cu) // read the line table header DW_LineVMHeader header = {0}; - if ( ! dw_read_line_vm_header(arena, input, cu_stmt_list, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu, &header)) { goto exit; } + if (cu_stmt_list.size) { + if ( ! dw_read_line_vm_header(arena, input, cu_stmt_list, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu, &header)) { + goto exit; + } + } vm = push_array(arena, DW_LineVM, 1); *vm = (DW_LineVM){ diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index 3ef4c79e..243e155c 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -423,7 +423,8 @@ internal U64 str8_deserial_read_sleb128 (String8 string, U64 off, S64 * internal U64 str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out); internal U64 str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out); -internal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data); +internal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data); +internal Rng1U64Array dw_unit_ranges_from_data_arr(Arena *arena, String8 data); // list units @@ -452,22 +453,22 @@ internal U64 dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 // attrib interp -internal U64 dw_interp_sec_offset(DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_exprloc (DW_FormKind form_kind, DW_Form form); -internal U128 dw_interp_const_u128(DW_FormKind form_kind, DW_Form form); -internal U64 dw_interp_const_u64 (DW_FormKind form_kind, DW_Form form); -internal U32 dw_interp_const_u32 (DW_FormKind form_kind, DW_Form form); -internal S64 dw_interp_const_s64 (DW_FormKind form_kind, DW_Form form); -internal S32 dw_interp_const_s32 (DW_FormKind form_kind, DW_Form form); -internal B32 dw_interp_flag (DW_FormKind form_kind, DW_Form form); -internal U64 dw_interp_address (U64 address_size, U64 base_addr, DW_ListUnit *addr_xlist, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_block (DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_string (DW_Input *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_FormKind form_kind, DW_Form form); -internal String8 dw_interp_line_ptr (DW_Input *input, DW_FormKind form_kind, DW_Form form); -internal DW_LineFile * dw_interp_file (DW_LineVMHeader *line_vm, DW_FormKind form_kind, DW_Form form); -internal DW_Reference dw_interp_ref (DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal DW_LocList dw_interp_loclist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); -internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form); +internal U64 dw_interp_sec_offset(DW_Form form); +internal String8 dw_interp_exprloc (DW_Form form); +internal U128 dw_interp_const_u128(DW_Form form); +internal U64 dw_interp_const_u64 (DW_Form form); +internal U32 dw_interp_const_u32 (DW_Form form); +internal S64 dw_interp_const_s64 (DW_Form form); +internal S32 dw_interp_const_s32 (DW_Form form); +internal B32 dw_interp_flag (DW_Form form); +internal U64 dw_interp_address (U64 address_size, U64 base_addr, DW_ListUnit *addr_xlist, DW_Form form); +internal String8 dw_interp_block (DW_Input *input, DW_CompUnit *cu, DW_Form form); +internal String8 dw_interp_string (DW_Input *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_Form form); +internal String8 dw_interp_line_ptr (DW_Input *input, DW_Form form); +internal DW_LineFile * dw_interp_file (DW_LineVM *line_vm, DW_Form form); +internal DW_Reference dw_interp_ref (DW_Input *input, DW_CompUnit *cu, DW_Form form); +internal DW_LocList dw_interp_loclist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form); +internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form); internal String8 dw_exprloc_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); internal U128 dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); @@ -480,7 +481,7 @@ internal U64 dw_address_from_attrib (DW_Input *input, DW_CompUnit *c internal String8 dw_block_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); internal String8 dw_string_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); internal String8 dw_line_ptr_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal DW_LineFile * dw_file_from_attrib (DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Attrib *attrib); +internal DW_LineFile * dw_file_from_attrib (DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib); internal DW_Reference dw_ref_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); @@ -495,7 +496,7 @@ internal String8 dw_block_from_tag_attrib_kind (DW_Input *input, DW_Co internal String8 dw_string_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind); +internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind); internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); From ff82d9843c13921ecf6bf93d433e6dbea7fb9f4b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 10 Feb 2026 15:27:53 -0800 Subject: [PATCH 178/850] matcher for DW_Form --- src/dwarf/dwarf.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ src/dwarf/dwarf.h | 5 +++ 2 files changed, 84 insertions(+) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 2aad1d7a..344cf956 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -950,4 +950,83 @@ dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v) return str8_serial_push_string(arena, srl, str8(buffer, buffer_size)); } +internal B32 +dw_form_match(DW_Form a, DW_Form b) +{ + B32 is_match = 0; + + if (a.kind == b.kind) { + switch (a.kind) { + case DW_Form_Null: {} break; + + case DW_Form_Addr: { is_match = str8_match(a.addr, b.addr, 0); } break; + case DW_Form_String: { is_match = str8_match(a.string, b.string, 0); } break; + + case DW_Form_Block: + case DW_Form_Block1: + case DW_Form_Block2: + case DW_Form_Block4: { + is_match = str8_match(a.block, b.block, 0); + } break; + + case DW_Form_Data1: + case DW_Form_Data2: + case DW_Form_Data4: + case DW_Form_Data8: + case DW_Form_Data16: { + is_match = str8_match(a.data, b.data, 0); + } break; + + case DW_Form_Flag: { is_match = a.flag == b.flag; } break; + case DW_Form_SData: { is_match = a.sdata == b.sdata; } break; + case DW_Form_UData: { is_match = a.udata == b.udata; } break; + + case DW_Form_RefAddr: + case DW_Form_Ref1: + case DW_Form_Ref2: + case DW_Form_Ref4: + case DW_Form_Ref8: + case DW_Form_RefUData: + case DW_Form_GNU_RefAlt: { + is_match = a.ref == b.ref; + } break; + + case DW_Form_Indirect: { NotImplemented; } break; + + case DW_Form_SecOffset: + case DW_Form_LineStrp: + case DW_Form_GNU_StrpAlt: { + is_match = a.sec_offset == b.sec_offset; + } break; + + case DW_Form_ImplicitConst: { is_match = a.implicit_const, b.implicit_const; } break; + + case DW_Form_Strx: + case DW_Form_Strx1: + case DW_Form_Strx2: + case DW_Form_Strx3: + case DW_Form_Strx4: + case DW_Form_Addrx: + case DW_Form_Addrx1: + case DW_Form_Addrx2: + case DW_Form_Addrx3: + case DW_Form_Addrx4: + case DW_Form_RngListx: + case DW_Form_LocListx: { + is_match = a.xval == b.xval; + } break; + + case DW_Form_StrpSup: { is_match = a.strp_sup == b.strp_sup; } break; + + case DW_Form_RefSup4: { NotImplemented; } break; + case DW_Form_RefSup8: { NotImplemented; } break; + + default: { InvalidPath; } break; + } + } + + return is_match; + + return is_match; +} diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 96689070..ee37de30 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1823,4 +1823,9 @@ internal void * dw_serial_push_uint(Arena *arena, String8List *srl, DW_Format fo internal void * dw_serial_push_uleb128(Arena *arena, String8List *srl, U64 v); internal void * dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v); +//////////////////////////////// +// Form + +internal B32 dw_form_match(DW_Form a, DW_Form b); + #endif // DWARF_H From 69434278bde3d55b11781cd674d856966a5da10a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 10 Feb 2026 23:57:43 -0800 Subject: [PATCH 179/850] WIP DWARF writer --- src/dwarf/dwarf.c | 7 +- src/dwarf/dwarf.h | 2 +- src/dwarf/dwarf_inc.c | 1 + src/dwarf/dwarf_inc.h | 1 + src/dwarf/dwarf_writer.c | 667 ++++++++++++++++++++++++++++++++++++ src/dwarf/dwarf_writer.h | 209 +++++++++++ src/obj/obj.c | 68 ++++ src/obj/obj.h | 115 +++++++ src/torture/torture_dwarf.c | 372 ++++++++++++++++++++ src/torture/torture_main.c | 2 + 10 files changed, 1439 insertions(+), 5 deletions(-) create mode 100644 src/dwarf/dwarf_writer.c create mode 100644 src/dwarf/dwarf_writer.h create mode 100644 src/obj/obj.c create mode 100644 src/obj/obj.h diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 344cf956..0ead6dc8 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -959,8 +959,9 @@ dw_form_match(DW_Form a, DW_Form b) switch (a.kind) { case DW_Form_Null: {} break; - case DW_Form_Addr: { is_match = str8_match(a.addr, b.addr, 0); } break; - case DW_Form_String: { is_match = str8_match(a.string, b.string, 0); } break; + case DW_Form_Addr: { is_match = str8_match(a.addr, b.addr, 0); } break; + case DW_Form_String: { is_match = str8_match(a.string, b.string, 0); } break; + case DW_Form_ExprLoc: { is_match = str8_match(a.exprloc, b.exprloc, 0); } break; case DW_Form_Block: case DW_Form_Block1: @@ -1026,7 +1027,5 @@ dw_form_match(DW_Form a, DW_Form b) } return is_match; - - return is_match; } diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index ee37de30..587bedf1 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -494,7 +494,7 @@ typedef enum DW_FormEnum #undef X } DW_FormEnum; -typedef union DW_Form +typedef struct DW_Form { DW_FormKind kind; union { diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index 286b7799..de222b03 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -9,5 +9,6 @@ #include "dwarf/dwarf_unwind.c" #include "dwarf/dwarf_dump.c" #include "dwarf/dwarf_help.c" +#include "dwarf/dwarf_writer.c" #include "dwarf/eh_frame.c" #include "dwarf/eh_dump.c" diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index 71c548bf..aeba7dde 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -12,6 +12,7 @@ #include "dwarf/dwarf_unwind.h" #include "dwarf/dwarf_dump.h" #include "dwarf/dwarf_help.h" +#include "dwarf/dwarf_writer.h" #include "dwarf/eh_frame.h" #include "dwarf/eh_dump.h" diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c new file mode 100644 index 00000000..9eaaae69 --- /dev/null +++ b/src/dwarf/dwarf_writer.c @@ -0,0 +1,667 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal DW_IntEnc +dw_int_enc_from_sint(S64 v) +{ + if ((S8)v == v) return DW_IntEnc_1Byte; + if ((S16)v == v) return DW_IntEnc_2Byte; + if ((S32)v == v) return DW_IntEnc_4Byte; + return DW_IntEnc_LEB128; +} + +internal DW_IntEnc +dw_int_enc_from_uint(U64 v) +{ + if ((U8)v == v) return DW_IntEnc_1Byte; + if ((U16)v == v) return DW_IntEnc_2Byte; + if ((U32)v == v) return DW_IntEnc_4Byte; + return DW_IntEnc_LEB128; +} + +internal U64 +dw_size_from_sint(S64 v) +{ + DW_IntEnc enc = dw_int_enc_from_sint(v); + switch (enc) { + case DW_IntEnc_Null: break; + case DW_IntEnc_1Byte: return 1; + case DW_IntEnc_2Byte: return 2; + case DW_IntEnc_4Byte: return 4; + case DW_IntEnc_LEB128: return dw_size_from_sleb128(v); + default: InvalidPath; break; + } + return 0; +} + +internal U64 +dw_size_from_uint(U64 v) +{ + DW_IntEnc enc = dw_int_enc_from_uint(v); + switch (enc) { + case DW_IntEnc_Null: break; + case DW_IntEnc_1Byte: return 1; + case DW_IntEnc_2Byte: return 2; + case DW_IntEnc_4Byte: return 4; + case DW_IntEnc_LEB128: return dw_size_from_uleb128(v); + default: InvalidPath; break; + } + return 0; +} + +internal void +dw_lower_form(DW_WriterFormKind form_kind, + DW_WriterForm form, + DW_FormKind *form_kind_out, + DW_Form *form_out) +{ +} + +internal DW_WriterFixupNode * +dw_writer_fixup_list_push(Arena *arena, DW_WriterFixupList *list, DW_WriterFixup v) +{ + DW_WriterFixupNode *n = push_array(arena, DW_WriterFixupNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; +} + +internal DW_WriterAttrib * +dw_writer_attrib_chunk_list_push(Arena *arena, DW_WriterAttribChunkList *list, U64 cap) +{ + if (list->last == 0 || list->last->count >= list->last->max) { + DW_WriterAttribChunk *n = push_array(arena, DW_WriterAttribChunk, 1); + n->v = push_array_no_zero(arena, DW_WriterAttrib, cap); + n->max = cap; + SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + + DW_WriterAttrib *result = &list->last->v[list->last->count++]; + MemoryZeroStruct(result); + + list->total_count += 1; + + return result; +} + +internal DW_WriterTag * +dw_writer_tag_chunk_list_push(Arena *arena, DW_WriterTagChunkList *list, U64 cap) +{ + if (list->last == 0 || list->last->count >= list->last->max) { + DW_WriterTagChunk *n = push_array(arena, DW_WriterTagChunk, 1); + n->v = push_array_no_zero(arena, DW_WriterTag, cap); + n->max = cap; + SLLQueuePush(list->first, list->last, n); + list->chunk_count += 1; + } + + DW_WriterTag *result = &list->last->v[list->last->count++]; + MemoryZeroStruct(result); + + list->total_count += 1; + + return result; +} + +internal DW_Writer * +dw_writer_begin(DW_Format format, DW_Version version, DW_CompUnitKind cu_kind, Arch arch) +{ + Arena *arena = arena_alloc(); + DW_Writer *writer = push_array(arena, DW_Writer, 1); + writer->arena = arena; + writer->arch = arch; + writer->format = format; + writer->version = version; + writer->cu_kind = cu_kind; + writer->address_size = byte_size_from_arch(arch); + writer->current = 0; + writer->abbrev_id_map = hash_table_init(arena, 0x2000); + for EachElement(i, writer->sections) { + str8_serial_begin(arena, &writer->sections[i].srl); + } + + // write .debug_info header + { + String8List *srl = &writer->sections[DW_Section_Info].srl; + + // length + writer->sections[DW_Section_Info].length = dw_serial_push_length(writer->arena, srl, writer->format, 0); + + // version + str8_serial_push_struct(writer->arena, srl, &writer->version); + + // compile unit kind + str8_serial_push_struct(writer->arena, srl, &writer->cu_kind); + + // address size + str8_serial_push_u8(writer->arena, srl, (U8)writer->address_size); + + // reserve 'abbrev_base' + writer->abbrev_base_info_off = srl->total_size; + dw_serial_push_uint(writer->arena, srl, writer->format, 0); + + if (writer->cu_kind == DW_CompUnitKind_Skeleton) { + // TODO: write skeleton id + NotImplemented; + } + } + + return writer; +} + +internal void +dw_writer_end(DW_Writer **writer_ptr) +{ + arena_release((*writer_ptr)->arena); + *writer_ptr = 0; +} + +internal String8 +dw_make_abbrev_entry(Arena *arena, DW_WriterTag *tag) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + + // tag abbrev + B8 has_children = tag->first_child != 0; + dw_serial_push_uleb128(scratch.arena, &srl, tag->kind); + str8_serial_push_string(scratch.arena, &srl, str8_struct(&has_children)); + + // attrib abbrev + for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { + dw_serial_push_uleb128(scratch.arena, &srl, attrib->kind); + dw_serial_push_uleb128(scratch.arena, &srl, attrib->reader.form.kind); + if (attrib->reader.form.kind == DW_Form_ImplicitConst) { + dw_serial_push_sleb128(scratch.arena, &srl, attrib->reader.form.implicit_const); + } + } + + // closing entry + dw_serial_push_uleb128(scratch.arena, &srl, 0); + dw_serial_push_uleb128(scratch.arena, &srl, 0); + + String8 tag_abbrev = str8_serial_end(arena, &srl); + + scratch_end(scratch); + return tag_abbrev; +} + +internal DW_WriterTag * +dw_writer_tag_begin(DW_Writer *writer, DW_TagKind kind) +{ + DW_WriterTag *tag = dw_writer_tag_chunk_list_push(writer->arena, &writer->tag_chunk_list, 512); + tag->kind = kind; + tag->parent = writer->current; + + // add tag to the tree + if (writer->current) { + SLLQueuePush(writer->current->first_child, writer->current->last_child, tag); + } else { + writer->root = tag; + } + writer->current = tag; + + return tag; +} + +internal void +dw_writer_tag_end(DW_Writer *writer) +{ + // pop to parent + writer->current = writer->current->parent; +} + +internal DW_WriterAttrib * +dw_writer_push_attrib(DW_Writer *writer, DW_AttribKind kind, DW_WriterForm form) +{ + DW_WriterAttrib *attrib = dw_writer_attrib_chunk_list_push(writer->arena, &writer->attrib_chunk_list, 512); + attrib->kind = kind; + attrib->writer.form = form; + SLLQueuePush(writer->current->first_attrib, writer->current->last_attrib, attrib); + writer->current->attrib_count += 1; + return attrib; +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_address(DW_Writer *writer, DW_AttribKind kind, U64 address) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_Address, .address = address }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_block(DW_Writer *writer, DW_AttribKind kind, String8 block) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_Block, .block = str8_copy(writer->arena, block) }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_data(DW_Writer *writer, DW_AttribKind kind, String8 data) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_Data, .data = str8_copy(writer->arena, data) }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_string(DW_Writer *writer, DW_AttribKind kind, String8 string) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_String, .string = string }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_flag(DW_Writer *writer, DW_AttribKind kind, B8 flag) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_Flag, .flag = flag }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_sint(DW_Writer *writer, DW_AttribKind kind, S64 sint) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_SInt, .sint = sint}); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_uint(DW_Writer *writer, DW_AttribKind kind, U64 uint) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_UInt, .uint = uint }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_enum(DW_Writer *writer, DW_AttribKind kind, S64 e) +{ + return dw_writer_push_attrib_sint(writer, kind, e); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_ref(DW_Writer *writer, DW_AttribKind kind, DW_WriterTag *ref) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_Ref, .ref = ref }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_exprloc(DW_Writer *writer, DW_AttribKind kind, String8 exprloc) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_ExprLoc, .exprloc = str8_copy(writer->arena, exprloc) }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_expression(DW_Writer *writer, DW_AttribKind kind, DW_ExprEnc *encs, U64 encs_count) +{ + String8 exprloc = dw_encode_expr(writer->arena, writer->arch, writer->format, encs, encs_count); + return dw_writer_push_attrib_exprloc(writer, kind, exprloc); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_line_ptr(DW_Writer *writer, DW_AttribKind kind, void *line_ptr) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_LinePtr, .line_ptr = line_ptr }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_mac_ptr(DW_Writer *writer, DW_AttribKind kind, void *mac_ptr) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_MacPtr, .mac_ptr = mac_ptr }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_rng_list_ptr(DW_Writer *writer, DW_AttribKind kind, void *rng_list_ptr) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_RngListPtr, .rng_list_ptr = rng_list_ptr }); +} + +internal DW_WriterAttrib * +dw_writer_push_attrib_implicit(DW_Writer *writer, DW_AttribKind kind, S64 implicit) +{ + return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_Implicit, .implicit = implicit }); +} + +internal void +dw_lower_attrib_forms(DW_Writer *writer, DW_WriterTag *tag) +{ + for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { + switch (attrib->writer.form.kind) { + case DW_WriterFormKind_Null: {} break; + case DW_WriterFormKind_Flag: { + attrib->reader.form.kind = DW_Form_Flag; + attrib->reader.form.flag = attrib->writer.form.flag; + } break; + case DW_WriterFormKind_SInt: { + switch (dw_int_enc_from_sint(attrib->writer.form.sint)) { + case DW_IntEnc_Null: attrib->reader.form.kind = 0; break; + case DW_IntEnc_1Byte: { + attrib->reader.form.kind = DW_Form_Data1; + attrib->reader.form.data = str8((U8 *)&attrib->writer.form.sint, sizeof(S8)); + } break; + case DW_IntEnc_2Byte: { + attrib->reader.form.kind = DW_Form_Data2; + attrib->reader.form.data = str8((U8 *)&attrib->writer.form.sint, sizeof(S16)); + } break; + case DW_IntEnc_4Byte: { + attrib->reader.form.kind = DW_Form_Data4; + attrib->reader.form.data = str8((U8 *)&attrib->writer.form.sint, sizeof(U32)); + } break; + case DW_IntEnc_LEB128: { + attrib->reader.form.kind = DW_Form_SData; + attrib->reader.form.sdata = attrib->writer.form.sint; + } break; + default: InvalidPath; break; + } + } break; + case DW_WriterFormKind_UInt: { + attrib->reader.form.kind = DW_Form_UData; + attrib->reader.form.udata = attrib->writer.form.uint; + } break; + case DW_WriterFormKind_Address: { + Assert(writer->address_size <= sizeof(attrib->writer.form.address)); + attrib->reader.form.kind = DW_Form_Addr; + attrib->reader.form.addr = push_str8_copy(writer->arena, str8((U8 *)&attrib->writer.form.address, writer->address_size)); + } break; + case DW_WriterFormKind_Ref: { + if (attrib->writer.form.ref->info_off == 0) { + attrib->reader.form.kind = DW_Form_Ref8; + } else { + switch (dw_int_enc_from_uint(attrib->writer.form.ref->info_off)) { + case DW_IntEnc_Null: break; + case DW_IntEnc_1Byte: { + attrib->reader.form.kind = DW_Form_Ref1; + attrib->reader.form.ref = (U8)attrib->writer.form.ref->info_off; + } break; + case DW_IntEnc_2Byte: { + attrib->reader.form.kind = DW_Form_Ref2; + attrib->reader.form.ref = (U16)attrib->writer.form.ref->info_off; + } break; + case DW_IntEnc_4Byte: { + attrib->reader.form.kind = DW_Form_Ref4; + attrib->reader.form.ref = (U32)attrib->writer.form.ref->info_off; + } break; + case DW_IntEnc_LEB128: { + attrib->reader.form.kind = DW_Form_RefUData; + attrib->reader.form.ref = attrib->writer.form.ref->info_off; + } break; + default: InvalidPath; break; + } + } + } break; + case DW_WriterFormKind_LinePtr: { + NotImplemented; + } break; + case DW_WriterFormKind_MacPtr: { + NotImplemented; + } break; + case DW_WriterFormKind_RngListPtr: { + NotImplemented; + } break; + case DW_WriterFormKind_Data: { + NotImplemented; + } break; + case DW_WriterFormKind_Block: { + attrib->reader.form.block = attrib->writer.form.block; + switch (attrib->writer.form.block.size) { + case 0 : break; + case 1 : attrib->reader.form.kind = DW_Form_Block1; break; + case 2 : attrib->reader.form.kind = DW_Form_Block2; break; + case 4 : attrib->reader.form.kind = DW_Form_Block4; break; + default: attrib->reader.form.kind = DW_Form_Block; break; + } + } break; + case DW_WriterFormKind_String: { + attrib->reader.form.kind = DW_Form_String; + attrib->reader.form.string = attrib->writer.form.string; + } break; + case DW_WriterFormKind_ExprLoc: { + attrib->reader.form.kind = DW_Form_ExprLoc; + attrib->reader.form.exprloc = attrib->writer.form.exprloc; + } break; + case DW_WriterFormKind_Implicit: { + attrib->reader.form.kind = DW_Form_ImplicitConst; + attrib->reader.form.implicit_const = attrib->writer.form.implicit; + } break; + default: { InvalidPath; } break; + } + } +} + +internal void +dw_writer_emit_tag(DW_Writer *writer, DW_WriterTag *tag) +{ + Assert(tag->info_off == 0); + + dw_lower_attrib_forms(writer, tag); + + // make abbrev id for the tag + U64 abbrev_id; + { + Temp temp = temp_begin(writer->arena); + String8 abbrev_entry = dw_make_abbrev_entry(temp.arena, tag); + + if ( ! hash_table_search_string_u64(writer->abbrev_id_map, abbrev_entry, &abbrev_id)) { + abbrev_id = writer->abbrev_id_map->count + 1; + + hash_table_push_string_u64(writer->arena, writer->abbrev_id_map, abbrev_entry, abbrev_id); + + // push abbrev entry + dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Abbrev].srl, abbrev_id); + str8_serial_push_string(writer->arena, &writer->sections[DW_Section_Abbrev].srl, abbrev_entry); + } else { + temp_end(temp); + } + } + + tag->abbrev_id = abbrev_id; + tag->info_off = writer->sections[DW_Section_Info].srl.total_size; + + // emit tag abbrev id + dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Info].srl, tag->abbrev_id); + + // emit attribs + { + String8List *debug_info = &writer->sections[DW_Section_Info].srl; + for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { + switch (attrib->reader.form.kind) { + case DW_Form_Addr: { + str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.addr); + } break; + case DW_Form_Block1: + case DW_Form_Block2: + case DW_Form_Block4: { + str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.block); + } break; + case DW_Form_Data1: + case DW_Form_Data2: + case DW_Form_Data4: + case DW_Form_Data8: { + str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.data); + } break; + case DW_Form_String: { + str8_serial_push_cstr(writer->arena, debug_info, attrib->reader.form.string); + } break; + case DW_Form_Flag: { + str8_serial_push_u8(writer->arena, debug_info, attrib->reader.form.flag); + } break; + case DW_Form_SData: { + dw_serial_push_sleb128(writer->arena, debug_info, attrib->reader.form.sdata); + } break; + case DW_Form_Strp: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.sec_offset); + } break; + case DW_Form_UData: { + dw_serial_push_uleb128(writer->arena, debug_info, attrib->reader.form.udata); + } break; + case DW_Form_RefAddr: { + if (writer->version < DW_Version_3) { + Assert(writer->address_size <= sizeof(attrib->reader.form.ref)); + str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->reader.form.ref, writer->address_size)); + } else { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.ref); + } + } break; + case DW_Form_Ref1: { + str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->reader.form.ref); + } break; + case DW_Form_Ref2: { + str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->reader.form.ref); + } break; + case DW_Form_Ref4: { + str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->reader.form.ref); + } break; + case DW_Form_Ref8: { + if (attrib->writer.form.ref->info_off == 0) { + // reserve 8 bytes + void *value = str8_serial_push_u64(writer->arena, debug_info, 0); + + // push fixup + dw_writer_fixup_list_push(writer->arena, &writer->fixups, (DW_WriterFixup){ .value = value, .attrib = attrib }); + } + } break; + case DW_Form_RefUData: { + dw_serial_push_uleb128(writer->arena, debug_info, attrib->reader.form.ref); + } break; + case DW_Form_Indirect: { + NotImplemented; + } break; + case DW_Form_SecOffset: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.sec_offset); + } break; + case DW_Form_ExprLoc: { + dw_serial_push_uleb128(writer->arena, debug_info, attrib->reader.form.exprloc.size); + str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.exprloc); + } break; + case DW_Form_FlagPresent: { + } break; + case DW_Form_RefSig8: { + NotImplemented; + } break; + case DW_Form_Strx: + case DW_Form_Addrx: + case DW_Form_RngListx: + case DW_Form_LocListx: { + dw_serial_push_uleb128(writer->arena, debug_info, attrib->reader.form.xval); + } break; + case DW_Form_RefSup4: { + NotImplemented; + } break; + case DW_Form_StrpSup: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.strp_sup); + } break; + case DW_Form_Data16: { + str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.data); + } break; + case DW_Form_LineStrp: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.sec_offset); + } break; + case DW_Form_ImplicitConst: { + // value is stored in the abbrev entry + } break; + case DW_Form_RefSup8: { + NotImplemented; + } break; + case DW_Form_Strx1: + case DW_Form_Addrx1: { + str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->reader.form.xval); + } break; + case DW_Form_Strx2: + case DW_Form_Addrx2: { + str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->reader.form.xval); + } break; + case DW_Form_Strx3: + case DW_Form_Addrx3: { + str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->reader.form.xval, 3)); + } break; + case DW_Form_Strx4: + case DW_Form_Addrx4: { + str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->reader.form.xval); + } break; + + case DW_Form_GNU_StrpAlt: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.sec_offset); + } break; + case DW_Form_GNU_RefAlt: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.ref); + } break; + + default: InvalidPath; break; + } + } + } + + // write children + for EachNode(child, DW_WriterTag, tag->first_child) { + dw_writer_emit_tag(writer, child); + } + + // close tag + if (tag->first_child) { + dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Info].srl, 0); + } +} + +internal void +dw_writer_emit(DW_Writer *writer) +{ + dw_writer_emit_tag(writer, writer->root); + + // null terminate .debug_abbrev + dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Abbrev].srl, 0); + dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Abbrev].srl, 0); + + // fixup units lengths + for EachElement(i, writer->sections) { + if (writer->sections[i].length) { + if (writer->format == DW_Format_64Bit) { + U64 *length = writer->sections[i].length; + U64 length_size = sizeof(U64) + sizeof(U32); + Assert(writer->sections[i].srl.total_size >= length_size); + *length = writer->sections[i].srl.total_size - length_size; + } else { + U32 *length = writer->sections[i].length; + U32 length_size = sizeof(U32); + Assert(writer->sections[i].srl.total_size >= length_size); + *length = safe_cast_u32(writer->sections[i].srl.total_size - length_size); + } + } + } + + // fixup forward references in .debug_info + for EachNode(fixup_n, DW_WriterFixupNode, writer->fixups.first) { + DW_WriterFixup *fixup = &fixup_n->v; + if (fixup->attrib->reader.form.kind == DW_Form_Ref8) { + Assert(fixup->attrib->writer.form.ref->info_off != 0); + MemoryCopy(fixup->value, &fixup->attrib->writer.form.ref->info_off, sizeof(U64)); + fixup->attrib->reader.form.ref = fixup->attrib->writer.form.ref->info_off; + } + } +} + +#ifdef OBJ_H +internal void +dw_writer_emit_to_obj(DW_Writer *writer, OBJ *obj) +{ + dw_writer_emit(writer); + + // push obj sections + OBJ_Section *sections[DW_Section_Count] = {0}; + for EachElement(i, writer->sections) { + if (writer->sections[i].srl.total_size) { + sections[i] = obj_push_section(obj, dw_name_string_from_section_kind(i), OBJ_SectionFlag_Read|OBJ_SectionFlag_Write); + } + } + + // push OBJ relocation for 'abbrev base' + OBJ_Section *debug_info = sections[DW_Section_Info]; + obj_push_reloc(obj, debug_info, OBJ_RelocKind_SecRel, writer->abbrev_base_info_off, sections[DW_Section_Abbrev]->symbol); + + // copy section data from writer to obj + for EachElement(i, writer->sections) { + if (writer->sections[i].srl.total_size > 0) { + String8 data = str8_serial_end(obj->arena, &writer->sections[i].srl); + str8_list_push(obj->arena, §ions[i]->data, data); + } + } + + // zero out writer sections + MemoryZeroArray(writer->sections); +} +#endif + diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h new file mode 100644 index 00000000..f2d8ad76 --- /dev/null +++ b/src/dwarf/dwarf_writer.h @@ -0,0 +1,209 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_WRITER_H +#define DWARF_WRITER_H + +//////////////////////////////// + +typedef enum +{ + DW_IntEnc_Null, + DW_IntEnc_1Byte, + DW_IntEnc_2Byte, + DW_IntEnc_4Byte, + DW_IntEnc_LEB128, +} DW_IntEnc; + +//////////////////////////////// + +typedef enum +{ + DW_WriterFormKind_Null, + DW_WriterFormKind_Flag, + DW_WriterFormKind_SInt, + DW_WriterFormKind_UInt, + DW_WriterFormKind_Address, + DW_WriterFormKind_Ref, + DW_WriterFormKind_LinePtr, + DW_WriterFormKind_MacPtr, + DW_WriterFormKind_RngListPtr, + DW_WriterFormKind_Data, + DW_WriterFormKind_Block, + DW_WriterFormKind_String, + DW_WriterFormKind_ExprLoc, + DW_WriterFormKind_Implicit, +} DW_WriterFormKind; + +typedef struct DW_WriterForm +{ + DW_WriterFormKind kind; + union { + B8 flag; + S64 sint; + U64 uint; + U64 address; + S64 implicit; + union { + struct { + struct DW_WriterTag *ref; + void *line_ptr; + void *mac_ptr; + void *rng_list_ptr; + }; + struct { + U64 ref_offset; + U64 line_offset; + U64 mac_ptr_offset; + U64 rng_list_offset; + }; + }; + String8 data; + String8 block; + String8 string; + String8 exprloc; + }; +} DW_WriterForm; + +typedef struct DW_WriterAttrib +{ + DW_AttribKindEnum kind; + struct { + DW_WriterForm form; + } writer; + struct { + DW_Form form; + } reader; + struct DW_WriterAttrib *next; +} DW_WriterAttrib; + +typedef struct DW_WriterTag +{ + DW_TagKindEnum kind; + struct DW_WriterTag *next; + struct DW_WriterTag *parent; + struct DW_WriterTag *first_child; + struct DW_WriterTag *last_child; + U64 attrib_count; + U64 abbrev_id; + U64 info_off; + DW_WriterAttrib *first_attrib; + DW_WriterAttrib *last_attrib; +} DW_WriterTag; + +typedef struct DW_WriterTagChunk +{ + U64 count; + U64 max; + DW_WriterTag *v; + struct DW_WriterTagChunk *next; +} DW_WriterTagChunk; + +typedef struct DW_WriterTagChunkList +{ + U64 chunk_count; + U64 total_count; + DW_WriterTagChunk *first; + DW_WriterTagChunk *last; +} DW_WriterTagChunkList; + +typedef struct DW_WriterAttribChunk +{ + U64 count; + U64 max; + DW_WriterAttrib *v; + struct DW_WriterAttribChunk *next; +} DW_WriterAttribChunk; + +typedef struct DW_WriterAttribChunkList +{ + U64 chunk_count; + U64 total_count; + DW_WriterAttribChunk *first; + DW_WriterAttribChunk *last; +} DW_WriterAttribChunkList; + +typedef struct DW_WriterFixup +{ + struct DW_WriterAttrib *attrib; + U8 *value; +} DW_WriterFixup; + +typedef struct DW_WriterFixupNode +{ + DW_WriterFixup v; + struct DW_WriterFixupNode *next; +} DW_WriterFixupNode; + +typedef struct DW_WriterFixupList +{ + U64 count; + DW_WriterFixupNode *first; + DW_WriterFixupNode *last; +} DW_WriterFixupList; + +typedef struct DW_WriterSection +{ + void *length; + String8List srl; +} DW_WriterSection; + +typedef struct DW_Writer +{ + Arena *arena; + DW_WriterTag *root; + DW_WriterTag *current; + Arch arch; + DW_Format format; + DW_Version version; + DW_CompUnitKind cu_kind; + U64 address_size; + U64 abbrev_base_info_off; + DW_WriterFixupList fixups; + HashTable *abbrev_id_map; + DW_WriterSection sections[DW_Section_Count]; + DW_WriterAttribChunkList attrib_chunk_list; + DW_WriterTagChunkList tag_chunk_list; +} DW_Writer; + +//////////////////////////////// + +internal DW_IntEnc dw_int_enc_from_sint(S64 v); +internal DW_IntEnc dw_int_enc_from_uint(U64 v); + +internal U64 dw_size_from_sint(S64 v); +internal U64 dw_size_from_uint(U64 v); + +internal void dw_serial_push_form(Arena *arena, String8List *srl, DW_Format format, DW_Version version, U8 address_size, DW_FormKind form_kind, DW_Form form); + +//////////////////////////////// + +internal DW_Writer * dw_writer_begin(DW_Format format, DW_Version version, DW_CompUnitKind cu_kind, Arch arch); +internal void dw_writer_end(DW_Writer **writer_ptr); + +internal DW_WriterTag * dw_writer_tag_begin(DW_Writer *writer, DW_TagKind kind); +internal void dw_writer_tag_end(DW_Writer *writer); + +internal DW_WriterAttrib * dw_writer_push_attrib (DW_Writer *writer, DW_AttribKind kind, DW_WriterForm form ); +internal DW_WriterAttrib * dw_writer_push_attrib_address (DW_Writer *writer, DW_AttribKind kind, U64 address ); +internal DW_WriterAttrib * dw_writer_push_attrib_block (DW_Writer *writer, DW_AttribKind kind, String8 block ); +internal DW_WriterAttrib * dw_writer_push_attrib_data (DW_Writer *writer, DW_AttribKind kind, String8 data ); +internal DW_WriterAttrib * dw_writer_push_attrib_string (DW_Writer *writer, DW_AttribKind kind, String8 string ); +internal DW_WriterAttrib * dw_writer_push_attrib_flag (DW_Writer *writer, DW_AttribKind kind, B8 flag ); +internal DW_WriterAttrib * dw_writer_push_attrib_sint (DW_Writer *writer, DW_AttribKind kind, S64 sint ); +internal DW_WriterAttrib * dw_writer_push_attrib_uint (DW_Writer *writer, DW_AttribKind kind, U64 uint ); +internal DW_WriterAttrib * dw_writer_push_attrib_enum (DW_Writer *writer, DW_AttribKind kind, S64 e ); +internal DW_WriterAttrib * dw_writer_push_attrib_ref (DW_Writer *writer, DW_AttribKind kind, DW_WriterTag *ref ); +internal DW_WriterAttrib * dw_writer_push_attrib_exprloc (DW_Writer *writer, DW_AttribKind kind, String8 exprloc ); +internal DW_WriterAttrib * dw_writer_push_attrib_line_ptr (DW_Writer *writer, DW_AttribKind kind, void * line_ptr ); +internal DW_WriterAttrib * dw_writer_push_attrib_mac_ptr (DW_Writer *writer, DW_AttribKind kind, void * mac_ptr ); +internal DW_WriterAttrib * dw_writer_push_attrib_rng_list_ptr(DW_Writer *writer, DW_AttribKind kind, void * rng_list_ptr); +internal DW_WriterAttrib * dw_writer_push_attrib_implicit (DW_Writer *writer, DW_AttribKind kind, S64 implicit ); + +internal void dw_writer_emit(DW_Writer *writer); +#ifdef OBJ_H +internal void dw_writer_emit_to_obj(DW_Writer *writer, OBJ *obj); +#endif + +#endif // DWARF_WRITER_H + diff --git a/src/obj/obj.c b/src/obj/obj.c new file mode 100644 index 00000000..c33577d8 --- /dev/null +++ b/src/obj/obj.c @@ -0,0 +1,68 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal OBJ * +obj_alloc(U64 time_stamp, Arch arch) +{ + Arena *arena = arena_alloc(); + OBJ *obj = push_array(arena, OBJ, 1); + obj->arena = arena; + obj->time_stamp = time_stamp; + obj->arch = arch; + return obj; +} + +internal void +obj_release(OBJ **obj_ptr) +{ + arena_release((*obj_ptr)->arena); + *obj_ptr = 0; +} + +internal OBJ_Symbol * +obj_push_symbol(OBJ *obj, String8 name, OBJ_SymbolScope scope, OBJ_RefKind ref_kind, void *ref) +{ + OBJ_SymbolNode *n = push_array(obj->arena, OBJ_SymbolNode, 1); + SLLQueuePush(obj->symbols.first, obj->symbols.last, n); + obj->symbols.count += 1; + + OBJ_Symbol *v = &n->v; + v->name = push_str8_copy(obj->arena, name); + v->scope = scope; + v->ref_kind = ref_kind; + v->ref = ref; + + return v; +} + +internal OBJ_Section * +obj_push_section(OBJ *obj, String8 name, OBJ_SectionFlags flags) +{ + OBJ_SectionNode *n = push_array(obj->arena, OBJ_SectionNode, 1); + SLLQueuePush(obj->sections.first, obj->sections.last, n); + obj->sections.count += 1; + + OBJ_Section *v = &n->v; + v->name = push_str8_copy(obj->arena, name); + v->flags = flags; + v->symbol = obj_push_symbol(obj, name, OBJ_SymbolScope_Local, OBJ_RefKind_Section, v); + str8_serial_begin(obj->arena, &v->data); + + return v; +} + +internal OBJ_Reloc * +obj_push_reloc(OBJ *obj, OBJ_Section *sec, OBJ_RelocKind kind, U64 offset, OBJ_Symbol *symbol) +{ + OBJ_RelocNode *n = push_array(obj->arena, OBJ_RelocNode, 1); + SLLQueuePush(sec->relocs.first, sec->relocs.last, n); + sec->relocs.count += 1; + + OBJ_Reloc *v = &n->v; + v->kind = kind; + v->offset = offset; + v->symbol = symbol; + + return v; +} + diff --git a/src/obj/obj.h b/src/obj/obj.h new file mode 100644 index 00000000..a5b285e3 --- /dev/null +++ b/src/obj/obj.h @@ -0,0 +1,115 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OBJ_H +#define OBJ_H + +typedef enum +{ + OBJ_RefKind_Null, + OBJ_RefKind_Section, +} OBJ_RefKind; + +typedef enum +{ + OBJ_SymbolScope_Null, + OBJ_SymbolScope_Local, + OBJ_SymbolScope_Global, +} OBJ_SymbolScope; + +typedef struct OBJ_Symbol +{ + String8 name; + OBJ_SymbolScope scope; + OBJ_RefKind ref_kind; + void *ref; +} OBJ_Symbol; + +typedef struct OBJ_SymbolNode +{ + OBJ_Symbol v; + struct OBJ_SymbolNode *next; +} OBJ_SymbolNode; + +typedef struct OBJ_SymbolList +{ + U64 count; + OBJ_SymbolNode *first; + OBJ_SymbolNode *last; +} OBJ_SymbolList; + +typedef enum +{ + OBJ_RelocKind_Null, + OBJ_RelocKind_SecRel, +} OBJ_RelocKind; + +typedef struct OBJ_Reloc +{ + OBJ_RelocKind kind; + U64 offset; + OBJ_Symbol *symbol; +} OBJ_Reloc; + +typedef struct OBJ_RelocNode +{ + OBJ_Reloc v; + struct OBJ_RelocNode *next; +} OBJ_RelocNode; + +typedef struct OBJ_RelocList +{ + U64 count; + OBJ_RelocNode *first; + OBJ_RelocNode *last; +} OBJ_RelocList; + +typedef enum OBJ_SectionFlags +{ + OBJ_SectionFlag_Read = (1 << 0), + OBJ_SectionFlag_Write = (1 << 1), + OBJ_SectionFlag_Exec = (1 << 2), + OBJ_SectionFlag_Load = (1 << 3), +} OBJ_SectionFlags; + +typedef struct OBJ_Section +{ + String8 name; + String8List data; + OBJ_SectionFlags flags; + OBJ_RelocList relocs; + OBJ_Symbol *symbol; +} OBJ_Section; + +typedef struct OBJ_SectionNode +{ + OBJ_Section v; + struct OBJ_SectionNode *next; +} OBJ_SectionNode; + +typedef struct OBJ_SectionList +{ + U64 count; + OBJ_SectionNode *first; + OBJ_SectionNode *last; +} OBJ_SectionList; + +typedef struct OBJ +{ + Arena *arena; + U64 time_stamp; + Arch arch; + OBJ_SectionList sections; + OBJ_SymbolList symbols; +} OBJ; + +//////////////////////////////// + +internal OBJ * obj_alloc(U64 time_stamp, Arch arch); +internal void obj_release(OBJ **obj_ptr); +internal OBJ_Symbol * obj_push_symbol(OBJ *obj, String8 name, OBJ_SymbolScope scope, OBJ_RefKind ref_kind, void *ref); +internal OBJ_Section * obj_push_section(OBJ *obj, String8 name, OBJ_SectionFlags flags); +internal OBJ_Reloc * obj_push_reloc(OBJ *obj, OBJ_Section *sec, OBJ_RelocKind kind, U64 offset, OBJ_Symbol *symbol); + +#endif // OBJ_H + diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 995a3c82..881b835d 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -64,6 +64,378 @@ T_BeginTest(test_leb128) } T_EndTest; +internal B32 +dwt_tags_must_match(DW_WriterTag *writer_tag, DW_TagNode *reader_tag) +{ + B32 is_match = 0; + + // match headers + B32 writer_has_children = writer_tag->first_child != 0; + if (writer_tag->kind != reader_tag->tag.kind) { goto exit; } + if (writer_tag->abbrev_id != reader_tag->tag.abbrev_id) { goto exit; } + if (writer_tag->attrib_count != reader_tag->tag.attribs.count) { goto exit; } + if (writer_tag->info_off != reader_tag->tag.info_off) { goto exit; } + if (writer_has_children != reader_tag->tag.has_children) { goto exit; } + + // match attribs + DW_WriterAttrib *writer_attrib = writer_tag->first_attrib; + DW_AttribNode *reader_attrib = reader_tag->tag.attribs.first; + while (writer_attrib) { + if (writer_attrib->kind != reader_attrib->v.attrib_kind) { goto exit; } + if (writer_attrib->reader.form.kind != reader_attrib->v.form.kind) { goto exit; } + if ( ! dw_form_match(writer_attrib->reader.form, reader_attrib->v.form)) { goto exit; } + writer_attrib = writer_attrib->next; + reader_attrib = reader_attrib->next; + } + + // visit children + DW_WriterTag *writer_child = writer_tag->first_child; + DW_TagNode *reader_child = reader_tag->first_child; + while (writer_child) { + if ( ! dwt_tags_must_match(writer_child, reader_child)) { goto exit; } + writer_child = writer_child->next; + reader_child = reader_child->sibling; + } + + is_match = 1; +exit:; + return is_match; +} + +internal DW_Writer * +dwt_make_writer(void) +{ + Temp scratch = scratch_begin(0, 0); + + // define debug info layout + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_Last, DW_CompUnitKind_Compile, Arch_x64); + { + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit(BUILD_TITLE_STRING_LITERAL)); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Language, DW_Language_C99); + dw_writer_push_attrib_flag(writer, DW_AttribKind_UseUtf8, 1); + { + DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("char")); + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_ConstType); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); + dw_writer_tag_end(writer); + + // test abbrev dedup + DW_WriterTag *dup_char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("char")); + dw_writer_tag_end(writer); + + // simple struct test + DW_WriterTag *simple_struct_tag = dw_writer_tag_begin(writer, DW_TagKind_StructureType); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("FooBar")); + dw_writer_push_attrib_uint(writer, DW_AttribKind_ByteSize, 90); + { + dw_writer_tag_begin(writer, DW_TagKind_Member); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("m0")); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); + dw_writer_push_attrib_sint(writer, DW_AttribKind_DataMemberLocation, 0); + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_Member); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("m1")); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); + dw_writer_push_attrib_sint(writer, DW_AttribKind_DataMemberLocation, 10); + dw_writer_push_attrib_implicit(writer, DW_AttribKind_ByteSize, 123); + dw_writer_tag_end(writer); + } + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x14012f2f0); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x14012f405); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("main")); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, simple_struct_tag); + dw_writer_push_attrib_expression(writer, DW_AttribKind_FrameBase, &(DW_ExprEnc)DW_ExprEnc_Op(Reg7), 1); + dw_writer_tag_end(writer); + } + dw_writer_tag_end(writer); + } + + { + DW_Input input; + { + OBJ *obj = obj_alloc(0, Arch_x64); + OBJ_Section *text_section = obj_push_section(obj, str8_lit(".text"), OBJ_SectionFlag_Read|OBJ_SectionFlag_Exec|OBJ_SectionFlag_Load); + str8_serial_push_u8(obj->arena, &text_section->data, 0xc3); + obj_push_symbol(obj, str8_lit("entry"), OBJ_SymbolScope_Global, OBJ_RefKind_Section, text_section); + + dw_writer_emit_to_obj(writer, obj); + + String8 raw_coff = coff_from_obj(scratch.arena, obj); + COFF_FileHeaderInfo obj_coff_header = coff_file_header_info_from_data(raw_coff); + String8 raw_sections = str8_substr(raw_coff, obj_coff_header.section_table_range); + U64 section_count = raw_sections.size / sizeof(COFF_SectionHeader); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_sections.str; + String8 string_table = str8_substr(raw_coff, obj_coff_header.string_table_range); + input = dw_input_from_coff_section_table(scratch.arena, raw_coff, string_table, section_count, section_table); + + t_write_file(str8_lit("dwarf.obj"), raw_coff); + + obj_release(&obj); + } + + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); + DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, lu_input, 0, 1); + DW_TagTree tag_tree = dw_tag_tree_from_cu(scratch.arena, &input, &cu); + AssertAlways(dwt_tags_must_match(writer->root, tag_tree.root)); + + } + + scratch_end(scratch); + return writer; +} + +T_BeginTest(dwarf_writer) +{ + DW_Writer *writer = dwt_make_writer(); + + // validate the writer + + T_Ok(writer->current == 0); + T_Ok(writer->format == DW_Format_32Bit); + T_Ok(writer->cu_kind == DW_CompUnitKind_Compile); + T_Ok(writer->version == DW_Version_5); + T_Ok(writer->address_size == 8); + T_Ok(writer->abbrev_base_info_off == 8); + T_Ok(writer->fixups.count == 0); + T_Ok(writer->abbrev_id_map->count == 7); + + DW_WriterTag *comp_unit_tag = writer->root; + { + T_Ok(comp_unit_tag->kind == DW_TagKind_CompileUnit); + T_Ok(comp_unit_tag->next == 0); + T_Ok(comp_unit_tag->parent == 0); + T_Ok(comp_unit_tag->attrib_count == 3); + T_Ok(comp_unit_tag->abbrev_id == 1); + T_Ok(comp_unit_tag->info_off == 0xc); + + DW_WriterAttrib *producer_attrib = comp_unit_tag->first_attrib; + T_Ok(producer_attrib->kind == DW_AttribKind_Producer); + T_Ok(producer_attrib->reader.form.kind == DW_Form_String); + T_Ok(str8_match(producer_attrib->writer.form.string, str8_lit(BUILD_TITLE_STRING_LITERAL), 0)); + + DW_WriterAttrib *language_attrib = producer_attrib->next; + T_Ok(language_attrib->kind == DW_AttribKind_Language); + T_Ok(language_attrib->reader.form.kind == DW_Form_Data1); + T_Ok(language_attrib->reader.form.data.size == 1); + T_Ok(*(U8 *)language_attrib->reader.form.data.str == DW_Language_C99); + + DW_WriterAttrib *use_utf8_attrib = language_attrib->next; + T_Ok(use_utf8_attrib->kind == DW_AttribKind_UseUtf8); + T_Ok(use_utf8_attrib->reader.form.kind == DW_Form_Flag); + T_Ok(use_utf8_attrib->reader.form.flag == 1); + } + + DW_WriterTag *char_type_tag = comp_unit_tag->first_child; + { + T_Ok(char_type_tag->kind == DW_TagKind_BaseType); + T_Ok(char_type_tag->next != 0); + T_Ok(char_type_tag->parent == comp_unit_tag); + T_Ok(char_type_tag->attrib_count == 3); + T_Ok(char_type_tag->abbrev_id == 2); + T_Ok(char_type_tag->info_off == 0x4d); + T_Ok(char_type_tag->first_attrib != char_type_tag->last_attrib); + + DW_WriterAttrib *byte_size_attrib = char_type_tag->first_attrib; + T_Ok(byte_size_attrib->kind == DW_AttribKind_ByteSize); + T_Ok(byte_size_attrib->reader.form.kind == DW_Form_Data1); + T_Ok(byte_size_attrib->reader.form.data.size == 1); + T_Ok(*(U8 *)byte_size_attrib->reader.form.data.str == 1); + + DW_WriterAttrib *encoding_attrib = byte_size_attrib->next; + T_Ok(encoding_attrib->kind == DW_AttribKind_Encoding); + T_Ok(encoding_attrib->reader.form.kind == DW_Form_Data1); + T_Ok(encoding_attrib->reader.form.data.size == 1); + T_Ok(*(U8 *)encoding_attrib->reader.form.data.str == DW_ATE_SignedChar); + + DW_WriterAttrib *name_attrib = encoding_attrib->next; + T_Ok(name_attrib->kind == DW_AttribKind_Name); + T_Ok(name_attrib->reader.form.kind == DW_Form_String); + T_Ok(str8_match(name_attrib->reader.form.string, str8_lit("char"), 0)); + } + + DW_WriterTag *const_type_tag = char_type_tag->next; + { + T_Ok(const_type_tag->kind == DW_TagKind_ConstType); + T_Ok(const_type_tag->next != 0); + T_Ok(const_type_tag->parent == comp_unit_tag); + T_Ok(const_type_tag->attrib_count == 1); + T_Ok(const_type_tag->abbrev_id == 3); + T_Ok(const_type_tag->info_off == 0x55); + T_Ok(const_type_tag->first_attrib && const_type_tag->first_attrib == const_type_tag->last_attrib); + + DW_WriterAttrib *type_attrib = const_type_tag->first_attrib; + T_Ok(type_attrib->kind == DW_AttribKind_Type); + T_Ok(type_attrib->writer.form.kind == DW_WriterFormKind_Ref); + T_Ok(type_attrib->writer.form.ref == char_type_tag); + } + + DW_WriterTag *dup_char_type_tag = const_type_tag->next; + { + T_Ok(dup_char_type_tag->kind == DW_TagKind_BaseType); + T_Ok(dup_char_type_tag->next != 0); + T_Ok(dup_char_type_tag->parent == comp_unit_tag); + T_Ok(dup_char_type_tag->attrib_count == 3); + T_Ok(dup_char_type_tag->abbrev_id == 2); + T_Ok(dup_char_type_tag->info_off == 0x57); + T_Ok(dup_char_type_tag->first_attrib != dup_char_type_tag->last_attrib); + + DW_WriterAttrib *byte_size_attrib = dup_char_type_tag->first_attrib; + T_Ok(byte_size_attrib->kind == DW_AttribKind_ByteSize); + T_Ok(byte_size_attrib->reader.form.kind == DW_Form_Data1); + T_Ok(byte_size_attrib->reader.form.data.size == 1); + T_Ok(*(U8 *)byte_size_attrib->reader.form.data.str == 1); + + DW_WriterAttrib *encoding_attrib = byte_size_attrib->next; + T_Ok(encoding_attrib->kind == DW_AttribKind_Encoding); + T_Ok(encoding_attrib->reader.form.kind == DW_Form_Data1); + T_Ok(encoding_attrib->reader.form.data.size == 1); + T_Ok(*(U8 *)encoding_attrib->reader.form.data.str == DW_ATE_SignedChar); + + DW_WriterAttrib *name_attrib = encoding_attrib->next; + T_Ok(name_attrib->kind == DW_AttribKind_Name); + T_Ok(name_attrib->reader.form.kind == DW_Form_String); + T_Ok(str8_match(name_attrib->reader.form.string, str8_lit("char"), 0)); + } + + DW_WriterTag *simple_struct_tag = dup_char_type_tag->next; + { + T_Ok(simple_struct_tag->kind == DW_TagKind_StructureType); + T_Ok(simple_struct_tag->next != 0); + T_Ok(simple_struct_tag->parent == comp_unit_tag); + T_Ok(simple_struct_tag->attrib_count == 2); + T_Ok(simple_struct_tag->abbrev_id == 4); + T_Ok(simple_struct_tag->info_off == 0x5f); + + DW_WriterAttrib *simple_struct_name = simple_struct_tag->first_attrib; + T_Ok(simple_struct_name->kind == DW_AttribKind_Name); + T_Ok(simple_struct_name->reader.form.kind == DW_Form_String); + T_Ok(str8_match(simple_struct_name->reader.form.string, str8_lit("FooBar"), 0)); + + DW_WriterTag *m0_tag = simple_struct_tag->first_child; + { + T_Ok(m0_tag->kind == DW_TagKind_Member); + T_Ok(m0_tag->parent == simple_struct_tag); + T_Ok(m0_tag->attrib_count == 3); + T_Ok(m0_tag->info_off == 0x68); + T_Ok(m0_tag->abbrev_id == 5); + + DW_WriterAttrib *name = m0_tag->first_attrib; + T_Ok(name->kind == DW_AttribKind_Name); + T_Ok(name->reader.form.kind == DW_Form_String); + T_Ok(str8_match(name->reader.form.string, str8_lit("m0"), 0)); + + DW_WriterAttrib *type = name->next; + T_Ok(type->kind == DW_AttribKind_Type); + T_Ok(type->reader.form.kind == DW_Form_Ref1); + T_Ok(type->reader.form.ref == 0x4d); + + DW_WriterAttrib *data_loc = type->next; + T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); + T_Ok(data_loc->reader.form.kind == DW_Form_Data1); + T_Ok(data_loc->reader.form.data.size == 1); + T_Ok(*(U8 *)data_loc->reader.form.data.str == 0); + } + + DW_WriterTag *m1_tag = m0_tag->next; + { + T_Ok(m1_tag->kind == DW_TagKind_Member); + T_Ok(m1_tag->parent == simple_struct_tag); + T_Ok(m1_tag->attrib_count == 4); + T_Ok(m1_tag->info_off == 0x6e); + T_Ok(m1_tag->abbrev_id == 6); + + DW_WriterAttrib *name = m1_tag->first_attrib; + T_Ok(name->kind == DW_AttribKind_Name); + T_Ok(name->reader.form.kind == DW_Form_String); + T_Ok(str8_match(name->reader.form.string, str8_lit("m1"), 0)); + + DW_WriterAttrib *type = name->next; + T_Ok(type->kind == DW_AttribKind_Type); + T_Ok(type->reader.form.kind == DW_Form_Ref1); + T_Ok(type->reader.form.ref == 0x4d); + + DW_WriterAttrib *data_loc = type->next; + T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); + T_Ok(data_loc->reader.form.kind == DW_Form_Data1); + T_Ok(data_loc->reader.form.data.size == 1); + T_Ok(*(U8 *)data_loc->reader.form.data.str == 10); + + DW_WriterAttrib *byte_size = data_loc->next; + T_Ok(byte_size->kind == DW_AttribKind_ByteSize); + T_Ok(byte_size->reader.form.kind == DW_Form_ImplicitConst); + T_Ok(byte_size->reader.form.implicit_const == 123); + } + } + + DW_WriterTag *main_tag = simple_struct_tag->next; + T_Ok(main_tag->next == 0); + T_Ok(main_tag->kind == DW_TagKind_SubProgram); + T_Ok(main_tag->parent == main_tag->parent); + T_Ok(main_tag->abbrev_id == 7); + { + DW_WriterAttrib *external = main_tag->first_attrib; + T_Ok(external->kind == DW_AttribKind_External); + T_Ok(external->reader.form.kind == DW_Form_Flag); + T_Ok(external->reader.form.flag); + + DW_WriterAttrib *prototyped = external->next; + T_Ok(prototyped->kind == DW_AttribKind_Prototyped); + T_Ok(prototyped->reader.form.kind == DW_Form_Flag); + T_Ok(prototyped->reader.form.flag); + + DW_WriterAttrib *low_pc = prototyped->next; + T_Ok(low_pc->kind == DW_AttribKind_LowPc); + T_Ok(low_pc->reader.form.kind == DW_Form_Addr); + T_Ok(low_pc->reader.form.addr.size == sizeof(U64)); + T_Ok(*(U64 *)low_pc->reader.form.addr.str == 0x14012f2f0); + + DW_WriterAttrib *high_pc = low_pc->next; + T_Ok(high_pc->kind == DW_AttribKind_HighPc); + T_Ok(high_pc->reader.form.kind == DW_Form_Addr); + T_Ok(high_pc->reader.form.addr.size == sizeof(U64)); + T_Ok(*(U64 *)high_pc->reader.form.addr.str == 0x14012f405); + + DW_WriterAttrib *name = high_pc->next; + T_Ok(name->kind == DW_AttribKind_Name); + T_Ok(name->reader.form.kind == DW_Form_String); + T_Ok(str8_match(name->reader.form.string, str8_lit("main"), 0)); + + DW_WriterAttrib *type = name->next; + T_Ok(type->kind == DW_AttribKind_Type); + T_Ok(type->reader.form.kind == DW_Form_Ref1); + T_Ok(type->reader.form.ref == simple_struct_tag->info_off); + + DW_WriterAttrib *frame_base = type->next; + T_Ok(frame_base->kind == DW_AttribKind_FrameBase); + T_Ok(frame_base->reader.form.kind == DW_Form_ExprLoc); + DW_Expr frame_base_expr = dw_expr_from_data(scratch.arena, writer->format, writer->address_size, frame_base->reader.form.exprloc); + T_Ok(frame_base_expr.count == 1); + T_Ok(frame_base_expr.first->opcode == DW_ExprOp_Reg7); + T_Ok(frame_base_expr.first->operands == 0); + T_Ok(frame_base_expr.first->size == 1); + T_Ok(frame_base_expr.first->next == 0); + T_Ok(frame_base_expr.first->prev == 0); + } + + dw_writer_end(&writer); +} +T_EndTest; + T_BeginTest(value_in_register) { // setup register context diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 75ecb3ba..b7c2735c 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -11,6 +11,7 @@ #include "base/base_inc.h" #include "os/os_inc.h" +#include "obj/obj.h" #include "linker/base_ext/base_core.h" #include "linker/base_ext/base_arena.h" #include "linker/base_ext/base_arrays.h" @@ -34,6 +35,7 @@ #include "base/base_inc.c" #include "os/os_inc.c" +#include "obj/obj.c" #include "linker/hash_table.c" #include "linker/base_ext/base_core.c" #include "linker/base_ext/base_arena.c" From ee8562ed97ef49d460d1e645c4d34c018bc0c795 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 10 Feb 2026 23:58:45 -0800 Subject: [PATCH 180/850] fix type for the implicit const --- src/dwarf/dwarf.h | 2 +- src/dwarf/dwarf_parse.c | 12 ++++++------ src/dwarf/dwarf_parse.h | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 587bedf1..960202a3 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -514,7 +514,7 @@ typedef struct DW_Form U64 strx; U64 rnglistx; U64 ptr; - U64 implicit_const; + S64 implicit_const; }; } DW_Form; diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 1168d705..80d9b055 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -487,16 +487,16 @@ dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev) TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); // read implicit const - U64 implicit_const = 0; + S64 implicit_const = 0; if (kind == DW_Form_ImplicitConst) { - TryRead(str8_deserial_read_uleb128(data, cursor, &implicit_const), cursor, exit); + TryRead(str8_deserial_read_sleb128(data, cursor, &implicit_const), cursor, exit); } if (out_abbrev != 0) { DW_Abbrev abbrev = { .kind = DW_Abbrev_Attrib, .sub_kind = kind, .id = id }; if (kind == DW_Form_ImplicitConst) { - abbrev.flags |= DW_AbbrevFlag_HasImplicitConst; - abbrev.const_value = implicit_const; + abbrev.flags |= DW_AbbrevFlag_HasImplicitConst; + abbrev.implicit_const = implicit_const; } *out_abbrev = abbrev; } @@ -585,7 +585,7 @@ dw_read_form(String8 data, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, - U64 implicit_const, + S64 implicit_const, DW_Form *form_out, U64 *bytes_read_out) { @@ -815,7 +815,7 @@ dw_read_tag(Arena *arena, // read form value DW_Form form = {0}; U64 form_size = 0; - if (!dw_read_form(str8_skip(tag_data, tag_cursor), version, format, address_size, form_kind, attrib_abbrev.const_value, &form, &form_size)) { + if (!dw_read_form(str8_skip(tag_data, tag_cursor), version, format, address_size, form_kind, attrib_abbrev.implicit_const, &form, &form_size)) { goto exit; } tag_cursor += form_size; diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index 243e155c..be823410 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -77,7 +77,7 @@ typedef struct DW_Abbrev DW_AbbrevKind kind; U64 sub_kind; U64 id; - U64 const_value; + S64 implicit_const; DW_AbbrevFlags flags; } DW_Abbrev; @@ -447,7 +447,7 @@ internal U64 dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U6 // form and tag -internal B32 dw_read_form (String8 data, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, U64 implicit_const, DW_Form *form_out, U64 *bytes_read_out); +internal B32 dw_read_form (String8 data, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, S64 implicit_const, DW_Form *form_out, U64 *bytes_read_out); internal U64 dw_read_tag (Arena *arena, DW_Input *input, DW_AbbrevTable abbrev_table, DW_Version version, DW_Format format, U64 address_size, Rng1U64 cu_info_range, U64 tag_info_off, DW_Tag *tag_out); internal U64 dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); From 031e24e1aae9d4d5a6a5e345a0fd0c9eb301589b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 10 Feb 2026 23:59:09 -0800 Subject: [PATCH 181/850] handle zero operand count --- src/dwarf/dwarf_parse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 80d9b055..c6f603b6 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -2824,7 +2824,7 @@ dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data) DW_ExprInst *inst = push_array(arena, DW_ExprInst, 1); inst->opcode = opcode; inst->size = cursor - inst_start; - inst->operands = push_array(arena, DW_ExprOperand, operand_count); + inst->operands = operand_count ? push_array(arena, DW_ExprOperand, operand_count) : 0; MemoryCopy(inst->operands, operands, operand_count * sizeof(DW_ExprOperand)); // push instruction From aaa5b0cb59a5cdbeb939d339531116010732175c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 00:00:43 -0800 Subject: [PATCH 182/850] pass over DWARF dumper --- src/dwarf/dwarf_dump.c | 2170 +++++++++++++++++++--------------------- src/dwarf/dwarf_dump.h | 95 +- src/radbin/radbin.c | 27 +- src/torture/torture.c | 4 +- 4 files changed, 1066 insertions(+), 1230 deletions(-) diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 45a0023e..c7759a7c 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -1,28 +1,239 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +#define dw_indent() do { indent += 1; } while (0) +#define dw_unindent() do { indent -= 1; } while (0) +#define dw_print(string) dw_print_ (arena, strings, indent, string) +#define dw_printf(...) dw_printf_(arena, strings, indent, __VA_ARGS__) +static char g_spaces[] = " "; + +internal void +dw_print_(Arena *arena, String8List *out, int indent, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + str8_list_pushf(arena, out, "%.*s%S", Min(indent * 2, sizeof(g_spaces)), g_spaces, string); + scratch_end(scratch); +} + +internal void +dw_printf_(Arena *arena, String8List *out, int indent, char *fmt, ...) +{ + Temp scratch = scratch_begin(&arena, 1); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + dw_print_(arena, out, indent, string); + va_end(args); + scratch_end(scratch); +} + +internal Rng1U64Array +dw_get_info_ranges(DW_Dumper *dumper) +{ + if (!(dumper->cache_flags & DW_DumperCacheFlag_InfoRanges)) { + dumper->cache.info_ranges = dw_unit_ranges_from_data_arr(dumper->arena, dumper->input->sec[DW_Section_Info].data); + } + return dumper->cache.info_ranges; +} + +internal DW_CompUnit * +dw_get_cu_arr(DW_Dumper *dumper) +{ + if (!(dumper->cache_flags & DW_DumperCacheFlag_CuArr)) { + Rng1U64Array info_ranges = dw_get_info_ranges(dumper); + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(dumper->arena, dumper->input); + dumper->cache.cu_arr = push_array(dumper->arena, DW_CompUnit, info_ranges.count); + for EachIndex(cu_idx, info_ranges.count) { + dumper->cache.cu_arr[cu_idx] = dw_cu_from_info_off(dumper->arena, dumper->input, lu_input, info_ranges.v[cu_idx].min, dumper->is_relaxed); + } + } + return dumper->cache.cu_arr; +} + +internal HashTable * +dw_get_line_vm_map(DW_Dumper *dumper) +{ + if (!(dumper->cache_flags & DW_DumperCacheFlag_LineVmMap)) { + Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(dumper->arena, dumper->input->sec[DW_Section_Line].data); + dumper->cache.line_vm_map = hash_table_init(dumper->arena, unit_ranges.count * 2); + } + return dumper->cache.line_vm_map; +} + +internal DW_TagTree * +dw_get_tag_trees(DW_Dumper *dumper) +{ + if (!(dumper->cache_flags & DW_DumperCacheFlag_TagTrees)) { + Rng1U64Array info_ranges = dw_get_info_ranges(dumper); + DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); + dumper->cache.tag_trees = push_array(dumper->arena, DW_TagTree, info_ranges.count); + for EachIndex(cu_idx, info_ranges.count) { + dumper->cache.tag_trees[cu_idx] = dw_tag_tree_from_cu(dumper->arena, dumper->input, &cu_arr[cu_idx]); + } + } + return dumper->cache.tag_trees; +} + //////////////////////////////// //~ rjf: Stringification Helpers -internal String8 -dw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off) +internal String8List +dw_string_list_from_cfi_program(Arena *arena, + U64 cu_base, + Arch arch, + DW_Version ver, + DW_Ext ext, + DW_Format format, + U64 pc_begin, + DW_CIE *cie, + DW_DecodePtr *decode_ptr_func, + void *deocde_ptr_ud, + String8 program) { Temp scratch = scratch_begin(&arena, 1); - String8 reg_str = dw_string_from_register(scratch.arena, arch, reg_idx); - String8 result; - if (reg_off != 0) { - result = push_str8f(arena, "%S%+I64d", reg_str, reg_off); - } else { - result = reg_str; - } - scratch_end(scratch); - return result; -} + String8List list = {0}; -internal String8 -dw_string_from_reg(Arena *arena, Arch arch, DW_Reg reg_idx) -{ - return dw_string_from_reg_off(arena, arch, reg_idx, 0); + U64 reg_max = dw_reg_count_from_arch(arch); + U64 pc = pc_begin; + for (U64 cursor = 0, inst_size; cursor < program.size; cursor += inst_size) { + // unpack instruction + DW_CFA_Inst inst = {0}; + DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(program, cursor), cie->code_align_factor, cie->data_align_factor, 0, 0, &inst_size, &inst); + if (error_code == DW_CFA_ParseErrorCode_End) { break; } + if (error_code != DW_CFA_ParseErrorCode_NewInst) { + str8_list_pushf(arena, &list, "ERROR: failed to unpack CFA instruction @ 0x%I64", cursor); + break; + } + + // error check operands + DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst.opcode); + U64 operand_count = dw_operand_count_from_cfa_opcode(inst.opcode); + for EachIndex(operand_idx, operand_count) { + switch (operand_types[operand_idx]) { + case DW_CFA_OperandType_Null: break; + case DW_CFA_OperandType_Value: break; + case DW_CFA_OperandType_Register: { + if (inst.operands[operand_idx].u64 >= reg_max) { + str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", + dw_string_from_cfa_opcode(inst.opcode), + cursor); + } + } break; + case DW_CFA_OperandType_Expression: { + DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); + for EachNode(inst, DW_ExprInst, expr.first) { + if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { + String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); + str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); + } + } + } break; + default: { InvalidPath; } break; + } + } + + // format operands + String8 operand_str = str8_lit("???"); + switch (inst.opcode) { + case DW_CFA_Nop: { operand_str = str8_zero(); } break; + case DW_CFA_SetLoc: { + operand_str = str8f(arena, "0x%X", inst.operands[0].u64); + pc = inst.operands[0].u64; + } break; + case DW_CFA_AdvanceLoc1: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc2: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc4: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_OffsetExt: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; + case DW_CFA_Undefined: { + operand_str = str8f(arena, "%I64u", inst.operands[0].u64); + } break; + case DW_CFA_SameValue: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_Register: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_RememberState: { operand_str = str8_zero(); } break; + case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; + case DW_CFA_DefCfa: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_DefCfaRegister: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_DefCfaOffset: { + operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); + } break; + case DW_CFA_DefCfaExpr: { + operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); + } break; + case DW_CFA_Expr: { + String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); + } break; + case DW_CFA_OffsetExtSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; + case DW_CFA_ValOffset: { + operand_str = str8f(arena, "value 0x%I64x, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_ValOffsetSf: { + operand_str = str8f(arena, "value %I64u, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_ValExpr: { + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); + } break; + case DW_CFA_AdvanceLoc: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_Offset: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_Restore: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + default: { + str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); + } goto exit; + } + + if (operand_str.size) { + str8_list_pushf(arena, &list, "DW_CFA_%S: %S", dw_string_from_cfa_opcode(inst.opcode), operand_str); + } else { + str8_list_pushf(arena, &list, "DW_CFA_%S", dw_string_from_cfa_opcode(inst.opcode)); + } + } + +exit:; + scratch_end(scratch); + return list; } internal String8List @@ -326,6 +537,21 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 return result; } +internal String8 +dw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 reg_str = dw_string_from_register(scratch.arena, arch, reg_idx); + String8 result; + if (reg_off != 0) { + result = push_str8f(arena, "%S%+I64d", reg_str, reg_off); + } else { + result = reg_str; + } + scratch_end(scratch); + return result; +} + internal String8 dw_string_from_expression(Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format) { @@ -335,165 +561,6 @@ dw_string_from_expression(Arena *arena, String8 expr, U64 cu_base, U64 addr_size return result; } -internal String8List -dw_string_list_from_cfi_program(Arena *arena, - U64 cu_base, - Arch arch, - DW_Version ver, - DW_Ext ext, - DW_Format format, - U64 pc_begin, - DW_CIE *cie, - DW_DecodePtr *decode_ptr_func, - void *deocde_ptr_ud, - String8 program) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 reg_max = dw_reg_count_from_arch(arch); - U64 pc = pc_begin; - for (U64 cursor = 0, inst_size; cursor < program.size; cursor += inst_size) { - // unpack instruction - DW_CFA_Inst inst = {0}; - DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(program, cursor), cie->code_align_factor, cie->data_align_factor, 0, 0, &inst_size, &inst); - if (error_code == DW_CFA_ParseErrorCode_End) { break; } - if (error_code != DW_CFA_ParseErrorCode_NewInst) { - str8_list_pushf(arena, &list, "ERROR: failed to unpack CFA instruction @ 0x%I64", cursor); - break; - } - - // error check operands - DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst.opcode); - U64 operand_count = dw_operand_count_from_cfa_opcode(inst.opcode); - for EachIndex(operand_idx, operand_count) { - switch (operand_types[operand_idx]) { - case DW_CFA_OperandType_Null: break; - case DW_CFA_OperandType_Value: break; - case DW_CFA_OperandType_Register: { - if (inst.operands[operand_idx].u64 >= reg_max) { - str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", - dw_string_from_cfa_opcode(inst.opcode), - cursor); - } - } break; - case DW_CFA_OperandType_Expression: { - DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); - for EachNode(inst, DW_ExprInst, expr.first) { - if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { - String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); - str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); - } - } - } break; - default: { InvalidPath; } break; - } - } - - // format operands - String8 operand_str = str8_lit("???"); - switch (inst.opcode) { - case DW_CFA_Nop: { operand_str = str8_zero(); } break; - case DW_CFA_SetLoc: { - operand_str = str8f(arena, "0x%X", inst.operands[0].u64); - pc = inst.operands[0].u64; - } break; - case DW_CFA_AdvanceLoc1: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc2: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc4: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_OffsetExt: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; - case DW_CFA_Undefined: { - operand_str = str8f(arena, "%I64u", inst.operands[0].u64); - } break; - case DW_CFA_SameValue: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_Register: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_RememberState: { operand_str = str8_zero(); } break; - case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; - case DW_CFA_DefCfa: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_DefCfaRegister: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_DefCfaOffset: { - operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); - } break; - case DW_CFA_DefCfaExpr: { - operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); - } break; - case DW_CFA_Expr: { - String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); - } break; - case DW_CFA_OffsetExtSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; - case DW_CFA_ValOffset: { - operand_str = str8f(arena, "value 0x%I64x, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_ValOffsetSf: { - operand_str = str8f(arena, "value %I64u, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_ValExpr: { - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); - } break; - case DW_CFA_AdvanceLoc: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_Offset: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_Restore: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - default: { - str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); - } goto exit; - } - - if (operand_str.size) { - str8_list_pushf(arena, &list, "DW_CFA_%S: %S", dw_string_from_cfa_opcode(inst.opcode), operand_str); - } else { - str8_list_pushf(arena, &list, "DW_CFA_%S", dw_string_from_cfa_opcode(inst.opcode)); - } - } - -exit:; - scratch_end(scratch); - return list; -} - internal String8 dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa) { @@ -518,7 +585,7 @@ dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version ver String8 rule_str = str8_lit("???"); switch (cfi_reg->rule) { case DW_CFI_RegisterRule_Undefined: { - rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); + rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); } break; case DW_CFI_RegisterRule_SameValue: { rule_str = str8_zero(); @@ -530,7 +597,7 @@ dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version ver rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); } break; case DW_CFI_RegisterRule_Register: { - rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_reg(scratch.arena, arch, cfi_reg->n)); + rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); } break; case DW_CFI_RegisterRule_Expression: { rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); @@ -545,7 +612,7 @@ dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version ver } if (rule_str.size) { - str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_reg(scratch.arena, arch, reg_idx), rule_str); + str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_register(scratch.arena, arch, reg_idx), rule_str); } } @@ -565,124 +632,617 @@ dw_single_line_string_from_expression(Arena *arena, String8 raw_data, U64 cu_bas return expression; } -#if 0 - internal String8 -w_string_from_eh_ptr_enc(Arena *arena, EH_PtrEnc enc) -{ - U8 type = enc & EH_PtrEnc_TypeMask; - String8 type_str = str8_lit("NULL"); - switch (type) { - case EH_PtrEnc_Ptr: type_str = str8_lit("PTR"); break; - case EH_PtrEnc_ULEB128: type_str = str8_lit("ULEB128"); break; - case EH_PtrEnc_UData2: type_str = str8_lit("UDATA2"); break; - case EH_PtrEnc_UData4: type_str = str8_lit("UDATA4"); break; - case EH_PtrEnc_UData8: type_str = str8_lit("UDATA8"); break; - case EH_PtrEnc_Signed: type_str = str8_lit("SIGNED"); break; - case EH_PtrEnc_SLEB128: type_str = str8_lit("SLEB128"); break; - case EH_PtrEnc_SData2: type_str = str8_lit("SDATA2"); break; - case EH_PtrEnc_SData4: type_str = str8_lit("SDATA4"); break; - case EH_PtrEnc_SData8: type_str = str8_lit("SDATA8"); break; - } - U8 modifier = enc & EH_PtrEnc_ModifyMask; - String8 modifier_str = str8_lit("NULL"); - switch (modifier) { - case EH_PtrEnc_PcRel: modifier_str = str8_lit("PCREL"); break; - case EH_PtrEnc_TextRel: modifier_str = str8_lit("TEXTREL"); break; - case EH_PtrEnc_DataRel: modifier_str = str8_lit("DATAREL"); break; - case EH_PtrEnc_FuncRel: modifier_str = str8_lit("FUNCREL"); break; - } - String8 indir_str = str8_lit(""); - if (enc & EH_PtrEnc_Indirect) { - indir_str = str8_lit("(INDIRECT)"); - } - return push_str8f(arena, "Type: %S, Modifier: %S %S", type_str, modifier_str, indir_str); -} - -internal void -dw_print_eh_frame(Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx) +dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) { Temp scratch = scratch_begin(&arena, 1); - DW_CIE cie = {0}; + + String8List attrib_fmt = {0}; - for (U64 cursor = 0; cursor < raw_eh_frame.size; ) { - U64 header_offset = cursor; - - U64 length = 0; // doesn't include bytes for size - cursor += dw_based_range_read_length(raw_eh_frame.str, rng_1u64(0,raw_eh_frame.size), cursor, &length); - - if (length == 0) { - break; // encountered exit marker - } - - U64 entry_start = cursor; - U64 entry_end = cursor + length; - - U32 entry_id = 0; // always 4-bytes, even when length is encoded as 64-bit integer - cursor += str8_deserial_read_struct(raw_eh_frame, cursor, &entry_id); - - // TODO: fix the freaking EH_PtrEnc_PCREL encoding. - // it assumes "frame_base" points to the first byte of .eh_frame - // but here base is start of ELF and we use range to select .eh_frame - // bytes to read, which breaks parsing. - String8 raw_frame = str8_substr(raw_eh_frame, rng_1u64(cursor, cursor + length - sizeof(entry_id))); - Rng1U64 cfi_range = rng_1u64(0,0); - - // CIE - if (entry_id == 0) { - dw_unwind_parse_cie_x64(raw_frame.str, rng_1u64(0,raw_frame.size), ptr_ctx, 0, &cie); - cfi_range = cie.cfi_range; - - rd_printf("CIE @ 0x%X, Length %u", header_offset, length); - rd_indent(); - rd_printf("LSDA Encoding: %S", dw_string_from_eh_ptr_enc(scratch.arena, cie.lsda_encoding)); - rd_printf("Address Encoding: %S", dw_string_from_eh_ptr_enc(scratch.arena, cie.addr_encoding)); - rd_printf("Augmentation: %S", cie.augmentation); - rd_printf("Code Align Factor: %I64u", cie.code_align_factor); - rd_printf("Data Align Factor: %I64d", cie.data_align_factor); - rd_printf("Return Address Register: %u", cie.ret_addr_reg); - rd_printf("Handler IP: %#I64x", cie.handler_ip); - rd_unindent(); - } - // FDE - else { - DW_FDE fde = {0}; - dw_unwind_parse_fde_x64(raw_eh_frame.str, rng_1u64(0,raw_eh_frame.size), ptr_ctx, &cie, 0, &fde); - cfi_range = fde.cfi_range; - - // calc parent CIE offset - AssertAlways(entry_start >= entry_id); - U64 cie_offset = entry_start - entry_id; NotImplemented; // TODO: syms_safe_sub_u64(range.min + entry_start, entry_id); - - rd_printf("FDE @ %#I64x, Length %u, Parent CIE @ %#I64x", header_offset, length, cie_offset); - rd_indent(); - rd_printf("IP Range: %#I64x-%#I64x", fde.ip_voff_range.min, fde.ip_voff_range.max); - rd_printf("LSDA IP: %#I64x", fde.lsda_ip); - rd_unindent(); - } - - // print CFI program - rd_printf("CFI Program:"); - rd_indent(); - - DW_Format format = DW_FormatFromSize(length); - String8 raw_cfi = str8_substr(raw_eh_frame, cfi_range); - dw_string_from_cfi_program(scratch.arena, out, indent, raw_cfi, &cie, ptr_ctx, arch, ver, ext, format); - - rd_unindent(); - rd_newline(); - - // advance to next entry - cursor = entry_end; + // rjf: log attrib's value based on vlass + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + switch(value_class) + { + default: {str8_list_pushf(scratch.arena, &attrib_fmt, "`unknown value class`");}break; + case DW_AttribClass_Undefined: {str8_list_pushf(scratch.arena, &attrib_fmt, "`undefined value class`");}break; + case DW_AttribClass_Address: {str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", dw_address_from_attrib(input, cu, attrib));}break; + case DW_AttribClass_Const: {str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", dw_const_u64_from_attrib(input, cu, attrib));}break; + case DW_AttribClass_Block: + { + String8 block = dw_block_from_attrib(input, cu, attrib); + String8List block_strs = numeric_str8_list_from_data(scratch.arena, 16, block, 1); + String8 block_str = str8_list_join(scratch.arena, &block_strs, &(StringJoin){.sep = str8_lit(", ")}); + str8_list_pushf(scratch.arena, &attrib_fmt, "{ %S }", block_str); + }break; + case DW_AttribClass_ExprLoc: + { + String8 exprloc = dw_exprloc_from_attrib(input, cu, attrib); + String8 exprloc_str = dw_single_line_string_from_expression(scratch.arena, exprloc, cu->info_range.min, cu->address_size, arch, cu->version, cu->ext, cu->format); + str8_list_pushf(scratch.arena, &attrib_fmt, "{ %S }", exprloc_str); + }break; + case DW_AttribClass_Flag: + { + B32 flag = dw_flag_from_attrib(input, cu, attrib); + str8_list_pushf(scratch.arena, &attrib_fmt, "%I64u (%s)", flag, flag == 0 ? "false" : "true"); + }break; + case DW_AttribClass_LinePtr: + case DW_AttribClass_LocListPtr: + case DW_AttribClass_MacPtr: + case DW_AttribClass_RngListPtr: + case DW_AttribClass_RngList: + case DW_AttribClass_StrOffsetsPtr: + case DW_AttribClass_AddrPtr: + { + if(attrib->form.kind == DW_Form_SecOffset) + { + str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", attrib->form.sec_offset); + } + else + { + str8_list_pushf(scratch.arena, &attrib_fmt, "`unexpected form kind %S`", dw_string_from_form_kind(scratch.arena, cu->version, attrib->form.kind)); + } + }break; + case DW_AttribClass_Reference: + { + if(attrib->form.kind == DW_Form_Ref1 || + attrib->form.kind == DW_Form_Ref2 || + attrib->form.kind == DW_Form_Ref4 || + attrib->form.kind == DW_Form_Ref8 || + attrib->form.kind == DW_Form_RefUData) + { + U64 info_off = cu->info_range.min + attrib->form.ref; + str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", info_off); + if(!contains_1u64(cu->info_range, info_off)) + { + str8_list_pushf(scratch.arena, &attrib_fmt, ": `(out of this cu's bounds)`"); + } + } + else + { + str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", attrib->form.ref); + } + }break; + case DW_AttribClass_String: + { + if(attrib->form.kind == DW_Form_Strp || attrib->form.kind == DW_Form_LineStrp || attrib->form.kind == DW_Form_StrpSup) + { + str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x ", attrib->form.sec_offset); + } + String8 string = dw_string_from_attrib(input, cu, attrib); + str8_list_pushf(scratch.arena, &attrib_fmt, "\"%S\"", string); + }break; } + // rjf: extend attrib's value with enum info + { + String8 enum_info = {0}; + switch(attrib->attrib_kind) + { + case DW_AttribKind_Language: + { + DW_Language lang = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_language(scratch.arena, lang); + }break; + case DW_AttribKind_DeclFile: + { + U64 file_idx = dw_const_u64_from_attrib(input, cu, attrib); + DW_LineFile *file = dw_file_from_attrib(cu, line_vm, attrib); + if(file != 0) + { + enum_info = dw_path_from_file(scratch.arena, line_vm->header.dir_table, file); + } + }break; + case DW_AttribKind_DeclLine: + { + enum_info = str8f(scratch.arena, "%I64u", dw_const_u64_from_attrib(input, cu, attrib)); + }break; + case DW_AttribKind_Inline: + { + DW_InlKind inl = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_inl(scratch.arena, inl); + }break; + case DW_AttribKind_Accessibility: + { + DW_AccessKind access = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_access_kind(scratch.arena, access); + }break; + case DW_AttribKind_CallingConvention: + { + DW_CallingConventionKind calling_convetion = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_calling_convetion(scratch.arena, calling_convetion); + }break; + case DW_AttribKind_Encoding: + { + DW_ATE encoding = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_attrib_type_encoding(scratch.arena, encoding); + }break; + } + + if(enum_info.size) + { + str8_list_pushf(scratch.arena, &attrib_fmt, " `%S`", enum_info); + } + } + + String8 result = str8_list_join(arena, &attrib_fmt, 0); + + scratch_end(scratch); + return result; +} + +internal +DW_PRINTER(dw_print_abbrev) +{ + DW_Input *input = dumper->input; + + Temp scratch = scratch_begin(&arena, 1); + DW_Section abbrev = input->sec[DW_Section_Abbrev]; + S64 depth = 0; + U64 idx = 0; + for(U64 cursor = 0; cursor < abbrev.data.size; idx += 1) + { + // rjf: read id & advance + U64 id_off = cursor; + U64 id = 0; + cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &id); + if(id == 0) { continue; } + + // rjf: unpack abbrev + U64 tag = 0; + U8 has_children = 0; + cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &tag); + cursor += str8_deserial_read_struct(abbrev.data, cursor, &has_children); + + // rjf: log abbrev + Temp temp = temp_begin(scratch.arena); + dw_printf("abbrev: // abbrev[%I64u] abbrev_off: 0x%I64x \n {\n", idx, id_off); + dw_indent(); + dw_printf("id: %I64u tag_kind: %S has_children: %s\n", id, dw_string_from_tag_kind(temp.arena, tag), has_children ? "true" : "false"); + U64 attrib_kind_max_size = 0; + U64 form_kind_max_size = 0; + { + for(U64 off = cursor;;) + { + U64 attrib_id = 0, form_id = 0; + off += str8_deserial_read_uleb128(abbrev.data, off, &attrib_id); + off += str8_deserial_read_uleb128(abbrev.data, off, &form_id); + if(attrib_id == 0) { break; } + String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); + String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); + attrib_kind_max_size = Max(attrib_kind_max_size, attrib_str.size); + form_kind_max_size = Max(form_kind_max_size, form_str.size); + } + } + for(;;) + { + U64 attrib_off = cursor; + U64 attrib_id = 0, form_id = 0; + cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &attrib_id); + cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &form_id); + if(attrib_id == 0) { break; } + String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); + String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); + + String8List fmt = {0}; + str8_list_pushf(temp.arena, &fmt, "%S%.*s", attrib_str, attrib_kind_max_size - attrib_str.size, g_spaces); + str8_list_pushf(temp.arena, &fmt, "%S%.*s", form_str, form_kind_max_size - form_str.size, g_spaces); + String8 value = str8_list_join(temp.arena, &fmt, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("attrib: { %S } // 0x%I64x\n", value, attrib_off); + } + dw_unindent(); + dw_printf("}\n"); + temp_end(temp); + } scratch_end(scratch); } internal void -dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) +dw_print_tag(Arena *arena, String8List *strings, int indent, Arch arch, DW_Input *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_TagNode *root) { + Temp scratch = scratch_begin(0, 0); + + for (DW_TagNode *n = root; n != 0; n = n->sibling) { + DW_Tag *tag = &n->tag; + + // compute columns' max widths + U64 attrib_name_max_size = 0, form_kind_max_size = 0, value_max_size = 0; + for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) + { + Temp attrib_temp = temp_begin(scratch.arena); + attrib_name_max_size = Max(attrib_name_max_size, dw_string_from_attrib_kind(attrib_temp.arena, cu->version, cu->ext, attrib_n->v.attrib_kind).size); + form_kind_max_size = Max(form_kind_max_size, dw_string_from_form_kind(attrib_temp.arena, cu->version, attrib_n->v.form.kind).size); + value_max_size = Max(value_max_size, dw_string_from_attrib_value(attrib_temp.arena, input, arch, cu, line_vm, &attrib_n->v).size); + temp_end(attrib_temp); + } + value_max_size = Min(120, value_max_size); + + dw_printf("tag: // info_off: 0x%I64x abbrev_id: %I64u\n", tag->info_off, tag->abbrev_id); + dw_printf("{\n"); + dw_indent(); + dw_printf("kind: %S\n", dw_string_from_tag_kind(scratch.arena, tag->kind)); + for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) { + DW_Attrib *attrib = &attrib_n->v; + + String8 attrib_kind_str = dw_string_from_attrib_kind(scratch.arena, cu->version, cu->ext, attrib->attrib_kind); + String8 form_kind_str = dw_string_from_form_kind(scratch.arena, cu->version, attrib->form.kind); + String8 value_str = dw_string_from_attrib_value(scratch.arena, input, arch, cu, line_vm, attrib); + + String8List fmt = {0}; + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, g_spaces); + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", form_kind_str, form_kind_max_size - form_kind_str.size, g_spaces); + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", value_str, value_str.size < value_max_size ? value_max_size - value_str.size: 0); + String8 attrib_str = str8_list_join(scratch.arena, &fmt, &(StringJoin){.sep = str8_lit(" ")}); + + dw_printf("attrib: { %S } // info_off: 0x%I64x\n", attrib_str, attrib->info_off); + } + + if (tag->has_children) { + dw_print_tag(arena, strings, indent, arch, input, cu, line_vm, n->first_child); + } + + dw_unindent(); + dw_printf("}\n"); + } + + scratch_end(scratch); +} + +internal +DW_PRINTER(dw_print_info) +{ + DW_Input *input = dumper->input; + Arch arch = dumper->arch; + HashTable *line_vm_map = dw_get_line_vm_map(dumper); + Rng1U64Array cu_ranges = dw_get_info_ranges(dumper); + DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); + DW_TagTree *tag_trees = dw_get_tag_trees(dumper); + + Temp scratch = scratch_begin(&arena, 1); + for EachIndex(cu_idx, cu_ranges.count) { + Rng1U64 cu_range = cu_ranges.v[cu_idx]; + DW_CompUnit *cu = &cu_arr[cu_idx]; + String8 cu_dir = dw_string_from_tag_attrib_kind (input, cu, cu->tag, DW_AttribKind_CompDir ); + String8 cu_name = dw_string_from_tag_attrib_kind (input, cu, cu->tag, DW_AttribKind_Name ); + String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); + + DW_LineVM *line_vm = 0; + if (stmt_list.str) { + line_vm = hash_table_search_raw_raw(line_vm_map, stmt_list.str); + if (line_vm == 0) { + line_vm = dw_line_vm_init(input, cu); + // decode line table to find all the defined files, in version 5 this behaviour was deprecated + if (cu->version < DW_Version_5) { + while (dw_line_vm_step(line_vm)); + } + hash_table_push_raw_raw(scratch.arena, line_vm_map, stmt_list.str, line_vm); + } + } + + dw_printf("cu: // compile_unit[%I64u] @ %r (%M)\n", cu_idx, cu_range, dim_1u64(cu->info_range)); + dw_printf("{\n"); + dw_indent(); + dw_printf("format: %S\n", dw_string_from_format(cu->format)); + dw_printf("version: %u\n", cu->version); + dw_printf("kind: %S\n", dw_string_from_comp_unit_kind(scratch.arena, cu->kind)); + dw_printf("address_size: %I64u\n", cu->address_size); + dw_printf("abbrev_off: 0x%I64x\n", cu->abbrev_off); + dw_print_tag(arena, strings, indent, arch, input, cu, line_vm, tag_trees[cu_idx].root); + dw_unindent(); + dw_printf("} // compile_unit[/%u]\n", cu_idx); + } +} + +DW_PRINTER(dw_print_line) +{ + DW_Input *input = dumper->input; + B32 is_verbose = dumper->is_verbose; + DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); + Temp scratch = scratch_begin(&arena, 1); + Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input->sec[DW_Section_Line].data); + for EachIndex(unit_idx, unit_ranges.count) + { + Temp unit_temp = temp_begin(scratch.arena); + + DW_LineVM *vm = dw_line_vm_init(input, &cu_arr[unit_idx]); + + // rjf: begin logging line table + dw_printf("line_table: // line_table[%I64u]\n{\n", unit_idx); + + // rjf: log line table header + DeferLoop(dw_printf(" header:\n {\n"), dw_printf(" }\n\n")) + { + String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(vm->header.opcode_lens, vm->header.num_opcode_lens), 1); + String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(", ")}); + dw_printf(" version: %u\n", vm->header.version ); + dw_printf(" line_table_size: %I64u\n", vm->header.unit_length ); + dw_printf(" address_size: %u\n", vm->header.address_size ); + dw_printf(" segment_selector_size: %u\n", vm->header.segment_selector_size); + dw_printf(" header_length: %I64u\n", vm->header.header_length ); + dw_printf(" min_instruction_length: %u\n", vm->header.min_inst_len ); + dw_printf(" max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); + dw_printf(" default_is_stmt: %u\n", vm->header.default_is_stmt ); + dw_printf(" line_base: %d\n", vm->header.line_base ); + dw_printf(" line_range: %u\n", vm->header.line_range ); + dw_printf(" opcode_base: %u\n", vm->header.opcode_base ); + dw_printf(" opcode_lengths: %S\n", opcode_lengths_string ); + } + + // rjf: log directory table + DeferLoop(dw_printf(" directory_table:\n {\n"), dw_printf(" }\n\n")) + { + dw_printf(" // %-4s %-8s\n", "no.", "name"); + for EachIndex(dir_idx, vm->header.dir_table.count) + { + dw_printf(" { %-4I64u %S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); + } + } + + // rjf: log file table + DeferLoop(dw_printf(" file_table:\n {\n"), dw_printf(" }\n\n")) + { + dw_printf(" // %-4s %-8s %-8s %-33s %-8s %-8s\n", "no.", "dir_idx", "time", "md5", "size", "name"); + for EachIndex(file_idx, vm->header.file_table.count) + { + DW_LineFile *file = &vm->header.file_table.v[file_idx]; + dw_printf(" { %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %S }\n", + file_idx, + file->dir_idx, + file->modify_time, + file->md5_digest.u64[1], + file->md5_digest.u64[0], + file->file_size, + file->file_name); + } + } + + // rjf: log opcodes + DeferLoop(dw_printf(" line_table:\n {\n"), dw_printf(" }\n\n")) + { + dw_printf(" //\n"); + dw_printf(" // %-16s %-8s %-4s %-5s %-3s %-7s %-16s\n", "Address", "Line", "Col", "File", "ISA", "Discrim", "Flags"); + dw_printf(" // ---------------- -------- ---- ----- --- ------- ----------------\n"); + + for(;;) + { + U64 global_opcode_off = unit_ranges.v[unit_idx].min + vm->cursor; + + if( ! dw_line_vm_step(vm)) { break; } + + Temp opcode_temp = temp_begin(unit_temp.arena); + String8List opcode_fmt = {0}; + + // opcode offset + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); + + // push opcode id + String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); + str8_list_push(arena, &opcode_fmt, opcode_str); + + // print operands + switch(vm->opcode) + { + default: + { + if(vm->opcode >= vm->header.opcode_base) + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); + } + else + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); + } + }break; + case DW_StdOpcode_Copy: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); + }break; + case DW_StdOpcode_AdvancePc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); + }break; + case DW_StdOpcode_AdvanceLine: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); + }break; + case DW_StdOpcode_SetFile: + { + DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); + }break; + case DW_StdOpcode_SetColumn: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); + }break; + case DW_StdOpcode_NegateStmt: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); + }break; + case DW_StdOpcode_SetBasicBlock: + { + }break; + case DW_StdOpcode_ConstAddPc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); + }break; + case DW_StdOpcode_FixedAdvancePc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); + }break; + case DW_StdOpcode_SetPrologueEnd: + { + }break; + case DW_StdOpcode_SetEpilogueBegin: + { + }break; + case DW_StdOpcode_SetIsa: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); + }break; + case DW_StdOpcode_ExtendedOpcode: + { + str8_list_push(opcode_temp.arena, &opcode_fmt, dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); + //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); + switch(vm->ext_opcode) + { + case DW_ExtOpcode_EndSequence: {} break; + case DW_ExtOpcode_SetAddress: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); } break; + case DW_ExtOpcode_DefineFile: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", + vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); } break; + case DW_ExtOpcode_SetDiscriminator: { str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); }break; + } + }break; + } + + if(is_verbose) + { + String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf(" // %S\n", string); + } + + if(vm->new_line) { + String8List l = {0}; + if(vm->state.is_stmt) + { + str8_list_pushf(opcode_temp.arena, &l, "is_stmt"); + } + if(vm->state.end_sequence) + { + str8_list_pushf(opcode_temp.arena, &l, "end_seq"); + } + String8 flags = str8_list_join(opcode_temp.arena, &l, &(StringJoin){.sep = str8_lit("|")}); + + dw_printf(" { %#016I64x %8I64u %4I64u %5I64u %3I64u %7I64u %-16S } %s\n", vm->state.address, vm->state.line, vm->state.column, vm->state.file_index, vm->state.isa, vm->state.discriminator, flags, vm->new_seq ? "// new seq" : ""); + } + + temp_end(opcode_temp); + } + + if(vm->error.size) + { + dw_printf("ERROR: Line VM failed stepping @ 0x%I64x\n", vm->cursor); + } + } + temp_end(unit_temp); + } + scratch_end(scratch); +} + +DW_PRINTER(dw_print_strings) +{ + DW_Input *input = dumper->input; + String8 data = input->sec[DW_Section_Str].data; + for (U64 cursor = 0, read_size = 0; cursor < data.size; cursor += read_size) { + String8 string = {0}; + read_size = str8_deserial_read_cstr(data, cursor, &string); + dw_printf(" { 0x%08I64x %I64u \"%S\" }\n", cursor, string.size, string); + } +} + +DW_PRINTER(dw_print_frame) +{ + DW_Input *input = dumper->input; + Arch arch = dumper->arch; + Temp scratch = scratch_begin(&arena, 1); + HashTable *cie_ht = hash_table_init(scratch.arena, 0x2000); + String8 debug_frame = input->sec[DW_Section_Frame].data; + U64 addr_size = byte_size_from_arch(arch); + + // make offset -> CIE hash table + for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { + DW_DescriptorEntry desc = {0}; + desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); + if (desc.type == DW_DescriptorEntryType_CIE) { + String8 raw_cie = str8_substr(debug_frame, desc.entry_range); + U64 restore_pos = arena_pos(scratch.arena); + DW_CIE *cie = push_array(scratch.arena, DW_CIE, 1); + if (dw_parse_cie(raw_cie, desc.format, arch, cie)) { + hash_table_push_u64_raw(scratch.arena, cie_ht, cursor, cie); + } else { + arena_pop_to(scratch.arena, restore_pos); + } + } + } + + for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { + DW_DescriptorEntry desc = {0}; + desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); + String8 raw_desc = str8_substr(debug_frame, desc.entry_range); + switch (desc.type) { + case DW_DescriptorEntryType_Null: {} break; + case DW_DescriptorEntryType_CIE: { + DW_CIE cie = {0}; + if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { + String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); + + dw_printf("CIE: // entry range: %r\n", desc.entry_range); + dw_printf("{\n"); + dw_printf(" Format: %S\n", dw_string_from_format(desc.format)); + dw_printf(" Version: %u\n", cie.version); + dw_printf(" Aug string: \"%S\"\n", cie.aug_string); + dw_printf(" Code align: %I64u\n", cie.code_align_factor); + dw_printf(" Data align: %I64d\n", cie.data_align_factor); + dw_printf(" Return addr reg: %u\n", cie.ret_addr_reg); + if (cie.version > DW_Version_3) { + dw_printf(" Address size: %u\n", cie.address_size); + dw_printf(" Segment selector size: %u\n", cie.segment_selector_size); + } + dw_printf(" Initial Insturction:\n"); + dw_printf(" {\n"); + for EachNode(n, String8Node, init_insts_str_list.first) { dw_printf(" %S\n", n->string); } + dw_printf(" }\n"); + dw_printf("}\n"); + } else { + dw_printf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); + } + } break; + case DW_DescriptorEntryType_FDE: { + DW_DescriptorEntry cie_desc = {0}; + U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); + String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); + DW_CIE cie = {0}; + dw_parse_cie(cie_data, cie_desc.format, arch, &cie); + + DW_FDE fde = {0}; + if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { + DW_Version version = DW_Version_5; + DW_Ext ext = DW_Ext_All; + String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); + dw_printf("FDE: // entry range: %r\n", desc.entry_range); + dw_printf("{\n"); + { + dw_printf(" Format: %S\n", dw_string_from_format(fde.format)); + dw_printf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); + dw_printf(" PC range: %r\n", fde.pc_range); + dw_printf(" Instructions:\n"); + dw_printf(" {\n"); + for EachNode(n, String8Node, insts_str_list.first) { dw_printf(" %S\n", n->string); } + dw_printf(" }\n"); + } + dw_printf(" Unwind:\n"); + dw_printf(" {\n"); + DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); + do { + String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); + String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); + dw_printf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); + } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); + dw_printf(" }\n"); + + dw_printf("}\n"); + } else { + dw_printf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); + } + } break; + } + } +} + #if 0 +internal +DW_PRINTER(dw_print_debug_loc) +{ + DW_Input *input = dumper->input; + DW_TagTree *tag_trees = dw_get_tag_trees(dumper); DW_Section info = input->sec[DW_Section_Info]; DW_Section loc = input->sec[DW_Section_Loc]; @@ -692,67 +1252,42 @@ dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *inp Temp scratch = scratch_begin(&arena, 1); - rd_printf("# %S", input->sec[DW_Section_Loc].name); - rd_indent(); - // TODO: warn about overlaps in ranges - Rng1U64List cu_range_list = dw_comp_unit_ranges_from_info(scratch.arena, info); + Rng1U64Array info_ranges = dw_get_info_ranges(dumper); + DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); // parse debug_info for attributes with LOCLIST and store .debug_loc offsets - U64List *loc_lists = push_array(scratch.arena, U64List, cu_range_list.count); - U64 *address_sizes = push_array(scratch.arena, U64, cu_range_list.count); - U64 *address_bases = push_array(scratch.arena, U64, cu_range_list.count); - U64 *cu_bases = push_array(scratch.arena, U64, cu_range_list.count); - DW_Version *ver_arr = push_array(scratch.arena, DW_Version, cu_range_list.count); - DW_Ext *ext_arr = push_array(scratch.arena, DW_Ext, cu_range_list.count); - - U64 comp_idx = 0; - for (Rng1U64Node *cu_range_n = cu_range_list.first; cu_range_n != 0; cu_range_n = cu_range_n->next, ++comp_idx) { - Temp comp_temp = temp_begin(arena); - - Rng1U64 cu_range = cu_range_n->v; - DW_CompUnit cu = dw_comp_unit_from_info_off(comp_temp.arena, input, cu_range.min, relaxed); - - // store info about comp unit - address_sizes[comp_idx] = cu.address_size; - address_bases[comp_idx] = cu.base_addr; - ver_arr[comp_idx] = cu.version; - cu_bases[comp_idx] = cu_range_n->v.min; - - // parse tags - for (U64 info_off = cu.tags_range.min; info_off < cu.tags_range.max; /* empty */) { - Temp tag_temp = temp_begin(scratch.arena); - - DW_Tag tag = dw_tag_from_info_offset_cu(tag_temp.arena, input, &cu, ext_arr[comp_idx], info_off); - - // parse attribs - for (DW_AttribNode *attrib_node = tag.attribs.first; attrib_node != 0; attrib_node = attrib_node->next) { - DW_Attrib *attrib = &attrib_node->v; - B32 is_sect_offset = attrib->value_class == DW_AttribClass_LocListPtr || (attrib->value_class == DW_AttribClass_LocList && attrib->form_kind == DW_Form_SecOffset); - B32 is_sect_index = attrib->value_class == DW_AttribClass_LocList && attrib->form_kind == DW_Form_LocListx; + U64List *loc_lists = push_array(scratch.arena, U64List, info_ranges.count); + for EachIndex(cu_idx, info_ranges.count) { + DW_CompUnit *cu = &cu_arr[cu_idx]; + DW_TagTree *tag_tree = tag_trees[cu_idx]; + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, tag_tree); + it->tag_node != 0; + d2r_tag_iterator_next(it)) { + DW_TagNode *tag_node = it->tag_node; + DW_Tag tag = tag_node->tag; + for EachNode(attrib_n, DW_AttribNode, tag.attribs.first) { + DW_Attrib *attrib = &attrib_n->v; + DW_AttribClass attrib_class = dw_attrib_class_from_attrib(cu->version, cu->ext, attrib->kind); + B32 is_sect_offset = attrib_class == DW_AttribClass_LocListPtr || (attrib_class == DW_AttribClass_LocList && attrib->form.kind == DW_Form_SecOffset); + B32 is_sect_index = attrib_class == DW_AttribClass_LocList && attrib->form.kind == DW_Form_LocListx; if (is_sect_offset) { - u64_list_push(scratch.arena, &loc_lists[comp_idx], attrib->value.v[0]); + U64 sec_offset = dw_interp_sec_offset(attrib->form.kind, attrib->form); + u64_list_push(scratch.arena, &loc_lists[cu_idx], attrib->value.v[0]); } else if (is_sect_index) { // TODO: support for section indexing } } - - // advance to next tag - info_off = tag.next_info_off; - - temp_end(tag_temp); } - - temp_end(comp_temp); } void *base = dw_base_from_sec(input, DW_Section_Loc); Rng1U64 range = dw_range_from_sec(input, DW_Section_Loc); - rd_printf(".debug_loc"); - rd_indent(); - rd_printf("%-8s %-8s %-8s %s", "Offset", "Min", "Max", "Expression"); + dw_printf(".debug_loc"); + dw_indent(); + dw_printf("%-8s %-8s %-8s %s", "Offset", "Min", "Max", "Expression"); for (U32 comp_idx = 0; comp_idx < cu_range_list.count; ++comp_idx) { Temp locs_temp = temp_begin(scratch.arena); @@ -805,7 +1340,7 @@ dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *inp // print entry String8 print = str8_list_join(range_temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - rd_printf("%S", print); + dw_printf("%S", print); // cleanup temp temp_end(range_temp); @@ -819,15 +1354,16 @@ dw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *inp temp_end(locs_temp); } - rd_unindent(); + dw_unindent(); - rd_unindent(); + dw_unindent(); scratch_end(scratch); -#endif } +#endif +#if 0 internal void -dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) +dw_print_debug_ranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) { NotImplemented; #if 0 @@ -865,8 +1401,8 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input * // parse attribs for (DW_AttribNode *attrib_node = tag.attribs.first; attrib_node != 0; attrib_node = attrib_node->next) { DW_Attrib *attrib = &attrib_node->v; - B32 is_sect_offset = attrib->value_class == DW_AttribClass_RngListPtr || (attrib->value_class == DW_AttribClass_RngList && attrib->form_kind == DW_Form_SecOffset); - B32 is_sect_index = attrib->value_class == DW_AttribClass_RngList && attrib->form_kind == DW_Form_RngListx; + B32 is_sect_offset = attrib->value_class == DW_AttribClass_RngListPtr || (attrib->value_class == DW_AttribClass_RngList && attrib->form.kind == DW_Form_SecOffset); + B32 is_sect_index = attrib->value_class == DW_AttribClass_RngList && attrib->form.kind == DW_Form_RngListx; if (is_sect_offset) { u64_list_push(scratch.arena, &loc_lists[comp_idx], attrib->value.v[0]); } else if (is_sect_index) { @@ -879,9 +1415,9 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input * } } - rd_printf("# %S", sections->v[DW_Section_Ranges].name); - rd_indent(); - rd_printf("%-8s %-8s %-8s", "Offset", "Min", "Max"); + dw_printf("# %S", sections->v[DW_Section_Ranges].name); + dw_indent(); + dw_printf("%-8s %-8s %-8s", "Offset", "Min", "Max"); for (U32 comp_idx = 0; comp_idx < cu_range_list.count; ++comp_idx) { U64Array locs = u64_array_from_list(scratch.arena, &loc_lists[comp_idx]); u64_array_sort(locs.count, locs.v); @@ -918,7 +1454,7 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input * // print entry String8 print = str8_list_join(range_temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - rd_printf("%S", print); + dw_printf("%S", print); temp_end(range_temp); @@ -933,7 +1469,7 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input * } internal void -dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_aranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) { NotImplemented; #if 0 @@ -946,8 +1482,8 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input Temp scratch = scratch_begin(&arena, 1); - rd_printf("# %S", sections->v[DW_Section_ARanges].name); - rd_indent(); + dw_printf("# %S", sections->v[DW_Section_ARanges].name); + dw_indent(); for (U64 cursor = 0; cursor < dim_1u64(range); ) { U64 unit_length = 0; DW_Version version = 0; @@ -972,18 +1508,18 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input cursor += tuple_size - bytes_too_far_past_boundary; } - rd_printf("Unit length: %I64u", unit_length); - rd_printf("Version: %u", version); - rd_printf("Debug info offset: %#I64x", debug_info_offset); - rd_printf("Address size: %u", address_size); - rd_printf("Segment selector size: %u", segment_selector_size); + dw_printf("Unit length: %I64u", unit_length); + dw_printf("Version: %u", version); + dw_printf("Debug info offset: %#I64x", debug_info_offset); + dw_printf("Address size: %u", address_size); + dw_printf("Segment selector size: %u", segment_selector_size); if (version != DW_Version_2) { rd_warningf("Version value must be 2 (DWARF5 sepc, Feb 13, 2017)"); } - rd_indent(); - rd_printf("%-8s %-8s", "Offset", "Range"); + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "Range"); for (; cursor < unit_opl; ) { Temp temp = temp_begin(arena); @@ -1008,21 +1544,21 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input } String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ") }); - rd_printf("%S", print); + dw_printf("%S", print); temp_end(temp); } - rd_unindent(); + dw_unindent(); rd_newline(); } - rd_unindent(); + dw_unindent(); scratch_end(scratch); #endif } internal void -dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_addr(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) { NotImplemented; #if 0 @@ -1035,8 +1571,8 @@ dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *in Temp scratch = scratch_begin(&arena, 1); - rd_printf("# %S", sections->v[DW_Section_Addr].name); - rd_indent(); + dw_printf("# %S", sections->v[DW_Section_Addr].name); + dw_indent(); for (U64 cursor = 0; cursor < dim_1u64(range); ) { U64 unit_length = 0; DW_Version version = 0; @@ -1057,17 +1593,17 @@ dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *in cursor += tuple_size - bytes_too_far_past_boundary; } - rd_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); - rd_printf("Version: %u", version); - rd_printf("Address size: %u", address_size); - rd_printf("Segment selector size: %u", segment_selector_size); + dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); + dw_printf("Version: %u", version); + dw_printf("Address size: %u", address_size); + dw_printf("Segment selector size: %u", segment_selector_size); if (version != DW_Version_2) { rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); } - rd_indent(); - rd_printf("%-8s %-8s", "Offset", "Address"); + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "Address"); for (; cursor < unit_opl; ) { Temp temp = temp_begin(arena); @@ -1090,14 +1626,14 @@ dw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *in } String8 print = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - rd_printf("%S", print); + dw_printf("%S", print); temp_end(temp); } - rd_unindent(); + dw_unindent(); rd_newline(); } - rd_unindent(); + dw_unindent(); scratch_end(scratch); #endif @@ -1131,7 +1667,7 @@ dw_based_range_read_address(void *base, Rng1U64 range, U64 offset, Rng1U64Array } internal void -dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_virtual_ranges, Arch arch) +dw_print_debug_loclists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input, Rng1U64Array segment_virtual_ranges, Arch arch) { NotImplemented; #if 0 @@ -1144,8 +1680,8 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input Temp scratch = scratch_begin(&arena, 1); - rd_printf("# %S", sections->v[DW_Section_LocLists].name); - rd_indent(); + dw_printf("# %S", sections->v[DW_Section_LocLists].name); + dw_indent(); for (U64 cursor = 0; cursor < dim_1u64(range); ) { U64 unit_offset = cursor; U64 unit_length = 0; @@ -1165,30 +1701,30 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input B32 is_dwarf64 = unit_length > max_U32; U64 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - rd_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); - rd_printf("Version: %u", version); - rd_printf("Address size: %u", address_size); - rd_printf("Segment selector size: %u", segment_selector_size); - rd_printf("Offset entry count: %u", offset_entry_count); + dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); + dw_printf("Version: %u", version); + dw_printf("Address size: %u", address_size); + dw_printf("Segment selector size: %u", segment_selector_size); + dw_printf("Offset entry count: %u", offset_entry_count); if (version != DW_Version_5) { rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); } if (offset_entry_count > 0) { - rd_printf("Offsets:"); - rd_indent(); - rd_printf("%-8s %-8s", "Index", "Offset"); + dw_printf("Offsets:"); + dw_indent(); + dw_printf("%-8s %-8s", "Index", "Offset"); for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) { U64 offset = 0; cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - rd_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); + dw_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); } - rd_unindent(); + dw_unindent(); } - rd_printf("Locations:"); - rd_indent(); - rd_printf("%-8s %-8s", "Offset", "Location"); + dw_printf("Locations:"); + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "Location"); for (; cursor < unit_opl; ) { Temp temp = temp_begin(arena); @@ -1270,21 +1806,21 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input } String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - rd_printf("%S", print); + dw_printf("%S", print); temp_end(temp); } - rd_unindent(); + dw_unindent(); rd_newline(); } - rd_unindent(); + dw_unindent(); scratch_end(scratch); #endif } internal void -dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_ranges) +dw_print_debug_rnglists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input, Rng1U64Array segment_ranges) { NotImplemented; #if 0 @@ -1297,8 +1833,8 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input Temp scratch = scratch_begin(&arena, 1); - rd_printf("# %S", sections->v[DW_Section_RngLists].name); - rd_indent(); + dw_printf("# %S", sections->v[DW_Section_RngLists].name); + dw_indent(); for (U64 cursor = 0; cursor < dim_1u64(range); ) { U64 unit_offset = cursor; U64 unit_length = 0; @@ -1317,31 +1853,31 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input B32 is_dwarf64 = unit_length > max_U32; U64 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - rd_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); - rd_printf("Version: %u", version); - rd_printf("Address size: %u", address_size); - rd_printf("Segment selector size: %u", segment_selector_size); - rd_printf("Offset entry count: %u", offset_entry_count); + dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); + dw_printf("Version: %u", version); + dw_printf("Address size: %u", address_size); + dw_printf("Segment selector size: %u", segment_selector_size); + dw_printf("Offset entry count: %u", offset_entry_count); if (version != DW_Version_5) { rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); } if (offset_entry_count > 0) { - rd_printf("Offsets:"); - rd_indent(); - rd_printf("%-8s %-8s", "Index", "Offset"); + dw_printf("Offsets:"); + dw_indent(); + dw_printf("%-8s %-8s", "Index", "Offset"); for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) { U64 offset = 0; cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - rd_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); + dw_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); } - rd_unindent(); + dw_unindent(); } - rd_printf("Ranges:"); - rd_indent(); - rd_printf("%-8s %-8s", "Offset", "Range"); + dw_printf("Ranges:"); + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "Range"); for (; cursor < unit_opl; ) { Temp temp = temp_begin(scratch.arena); @@ -1409,21 +1945,21 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input // output row String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - rd_printf("%S", print); + dw_printf("%S", print); temp_end(temp); } - rd_unindent(); + dw_unindent(); rd_newline(); } - rd_unindent(); + dw_unindent(); scratch_end(scratch); #endif } internal void -dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input *input, DW_SectionKind sec) +dw_format_string_table(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input, DW_SectionKind sec) { NotImplemented; #if 0 @@ -1436,8 +1972,8 @@ dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input Temp scratch = scratch_begin(&arena, 1); - rd_printf("# %S", sections->v[sec].name); - rd_indent(); + dw_printf("# %S", sections->v[sec].name); + dw_indent(); for (U64 cursor = 0; cursor < dim_1u64(range); ) { U64 unit_offset = cursor; @@ -1459,45 +1995,45 @@ dw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_offset); cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_length); - rd_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); - rd_printf("Version: %u", version); - rd_printf("Debug info offset: %#I64x", debug_info_offset); - rd_printf("Debug info length: %#I64x", debug_info_length); + dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); + dw_printf("Version: %u", version); + dw_printf("Debug info offset: %#I64x", debug_info_offset); + dw_printf("Debug info length: %#I64x", debug_info_length); - rd_printf("Entries:"); - rd_indent(); - rd_printf("%-8s %-8s", "Offset", "String"); + dw_printf("Entries:"); + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "String"); for (; cursor < unit_opl; ) { U64 info_offset = 0; cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &info_offset); String8 string = dw_based_range_read_string(base, range, cursor); cursor += (string.size + 1); - rd_printf("%08I64x %S", info_offset, string); + dw_printf("%08I64x %S", info_offset, string); } - rd_unindent(); + dw_unindent(); rd_newline(); } - rd_unindent(); + dw_unindent(); scratch_end(scratch); #endif } internal void -dw_print_debug_pubnames(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_pubnames(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) { - dw_format_string_table(arena, out, indent, input, DW_Section_PubNames); + dw_format_string_table(arena, out, g_dw_indent, input, DW_Section_PubNames); } internal void -dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) { - dw_format_string_table(arena, out, indent, input, DW_Section_PubTypes); + dw_format_string_table(arena, out, g_dw_indent, input, DW_Section_PubTypes); } internal void -dw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_line_str(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) { NotImplemented; #if 0 @@ -1510,24 +2046,24 @@ dw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Input Temp scratch = scratch_begin(&arena, 1); - rd_printf("# %S", sections->v[DW_Section_LineStr].name); - rd_indent(); + dw_printf("# %S", sections->v[DW_Section_LineStr].name); + dw_indent(); - rd_printf("%-8s %-8s", "Offset", "String"); + dw_printf("%-8s %-8s", "Offset", "String"); for (U64 cursor = 0; cursor < dim_1u64(range); ) { U64 offset = cursor; String8 string = dw_based_range_read_string(base, range, cursor); cursor += (string.size + 1); - rd_printf("%08llX %S", offset, string); + dw_printf("%08llX %S", offset, string); } - rd_unindent(); + dw_unindent(); scratch_end(scratch); #endif } internal void -dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input) +dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) { NotImplemented; #if 0 @@ -1543,8 +2079,8 @@ dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_In Temp scratch = scratch_begin(&arena, 1); - rd_printf("# %S", sections->v[DW_Section_StrOffsets].name); - rd_indent(); + dw_printf("# %S", sections->v[DW_Section_StrOffsets].name); + dw_indent(); for (U64 cursor = 0; cursor < dim_1u64(range); ) { U64 unit_offset = cursor; @@ -1567,26 +2103,26 @@ dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_In B32 is_dwarf64 = unit_length > max_U32; U32 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - rd_printf("Unit @ %#llX, length %I64d", unit_offset, unit_length); - rd_printf("Version: %d", version); - rd_printf("Padding: %d", padding); - rd_indent(); - rd_printf("%-8s %-8s", "@", "Offset"); + dw_printf("Unit @ %#llX, length %I64d", unit_offset, unit_length); + dw_printf("Version: %d", version); + dw_printf("Padding: %d", padding); + dw_indent(); + dw_printf("%-8s %-8s", "@", "Offset"); for (; cursor < unit_opl; ) { U64 read_at = cursor; U64 offset = 0; cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - rd_printf("%08I64x %08I64x", read_at, offset); + dw_printf("%08I64x %08I64x", read_at, offset); if (dim_1u64(debug_str_range) > 0) { String8 string = dw_based_range_read_string(debug_str_base, debug_str_range, offset); - rd_printf(" %S", string); + dw_printf(" %S", string); } rd_newline(); } - rd_unindent(); + dw_unindent(); rd_newline(); } - rd_unindent(); + dw_unindent(); scratch_end(scratch); #endif @@ -1597,731 +2133,53 @@ dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_In //////////////////////////////// //~ rjf: Dump Entry Point -internal String8 -dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_table_header, DW_Attrib *attrib) +read_only struct { + DW_Printer *printer; + DW_SectionKind kind; +} g_dw_printers[] = { + { dw_print_abbrev, DW_Section_Abbrev }, + { dw_print_info, DW_Section_Info }, + { dw_print_strings, DW_Section_Str }, + { dw_print_frame, DW_Section_Frame }, +}; + +internal String8List +dw_dump_list_from_sections(Arena *arena, + DW_Input *input, + Arch arch, + DW_SectionFlags subset_flags, + B32 is_verbose) { Temp scratch = scratch_begin(&arena, 1); + String8List *strings = push_array(scratch.arena, String8List, 1); + int indent = 0; - String8List attrib_fmt = {0}; - - // rjf: log attrib's value based on vlass - DW_AttribClass value_class = dw_value_class_from_attrib(unit, attrib); - switch(value_class) - { - default: {str8_list_pushf(scratch.arena, &attrib_fmt, "`unknown value class`");}break; - case DW_AttribClass_Undefined: {str8_list_pushf(scratch.arena, &attrib_fmt, "`undefined value class`");}break; - case DW_AttribClass_Address: {str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", dw_address_from_attrib(input, unit, attrib));}break; - case DW_AttribClass_Const: {str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", dw_const_u64_from_attrib(input, unit, attrib));}break; - case DW_AttribClass_Block: - { - String8 block = dw_block_from_attrib(input, unit, attrib); - String8List block_strs = numeric_str8_list_from_data(scratch.arena, 16, block, 1); - String8 block_str = str8_list_join(scratch.arena, &block_strs, &(StringJoin){.sep = str8_lit(", ")}); - str8_list_pushf(scratch.arena, &attrib_fmt, "{ %S }", block_str); - }break; - case DW_AttribClass_ExprLoc: - { - String8 exprloc = dw_exprloc_from_attrib(input, unit, attrib); - String8 exprloc_str = dw_single_line_string_from_expression(scratch.arena, exprloc, unit->info_range.min, unit->address_size, arch, unit->version, unit->ext, unit->format); - str8_list_pushf(scratch.arena, &attrib_fmt, "{ %S }", exprloc_str); - }break; - case DW_AttribClass_Flag: - { - B32 flag = dw_flag_from_attrib(input, unit, attrib); - str8_list_pushf(scratch.arena, &attrib_fmt, "%I64u (%s)", flag, flag == 0 ? "false" : "true"); - }break; - case DW_AttribClass_LinePtr: - case DW_AttribClass_LocListPtr: - case DW_AttribClass_MacPtr: - case DW_AttribClass_RngListPtr: - case DW_AttribClass_RngList: - case DW_AttribClass_StrOffsetsPtr: - case DW_AttribClass_AddrPtr: - { - if(attrib->form_kind == DW_Form_SecOffset) - { - str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", attrib->form.sec_offset); - } - else - { - str8_list_pushf(scratch.arena, &attrib_fmt, "`unexpected form kind %S`", dw_string_from_form_kind(scratch.arena, unit->version, attrib->form_kind)); - } - }break; - case DW_AttribClass_Reference: - { - if(attrib->form_kind == DW_Form_Ref1 || - attrib->form_kind == DW_Form_Ref2 || - attrib->form_kind == DW_Form_Ref4 || - attrib->form_kind == DW_Form_Ref8 || - attrib->form_kind == DW_Form_RefUData) - { - U64 info_off = unit->info_range.min + attrib->form.ref; - str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", info_off); - if(!contains_1u64(unit->info_range, info_off)) - { - str8_list_pushf(scratch.arena, &attrib_fmt, ": `(out of this unit's bounds)`"); - } - } - else - { - str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", attrib->form.ref); - } - }break; - case DW_AttribClass_String: - { - if(attrib->form_kind == DW_Form_Strp || attrib->form_kind == DW_Form_LineStrp || attrib->form_kind == DW_Form_StrpSup) - { - str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x ", attrib->form.sec_offset); - } - String8 string = dw_string_from_attrib(input, unit, attrib); - str8_list_pushf(scratch.arena, &attrib_fmt, "\"%S\"", string); - }break; - } - - // rjf: extend attrib's value with enum info - { - String8 enum_info = {0}; - switch(attrib->attrib_kind) - { - case DW_AttribKind_Language: - { - DW_Language lang = dw_const_u64_from_attrib(input, unit, attrib); - enum_info = dw_string_from_language(scratch.arena, lang); - }break; - case DW_AttribKind_DeclFile: - { - U64 file_idx = dw_const_u64_from_attrib(input, unit, attrib); - DW_LineFile *file = dw_file_from_attrib(unit, line_table_header, attrib); - if(file != 0) - { - enum_info = dw_path_from_file(scratch.arena, line_table_header->dir_table, file); - } - }break; - case DW_AttribKind_DeclLine: - { - enum_info = str8f(scratch.arena, "%I64u", dw_const_u64_from_attrib(input, unit, attrib)); - }break; - case DW_AttribKind_Inline: - { - DW_InlKind inl = dw_const_u64_from_attrib(input, unit, attrib); - enum_info = dw_string_from_inl(scratch.arena, inl); - }break; - case DW_AttribKind_Accessibility: - { - DW_AccessKind access = dw_const_u64_from_attrib(input, unit, attrib); - enum_info = dw_string_from_access_kind(scratch.arena, access); - }break; - case DW_AttribKind_CallingConvention: - { - DW_CallingConventionKind calling_convetion = dw_const_u64_from_attrib(input, unit, attrib); - enum_info = dw_string_from_calling_convetion(scratch.arena, calling_convetion); - }break; - case DW_AttribKind_Encoding: - { - DW_ATE encoding = dw_const_u64_from_attrib(input, unit, attrib); - enum_info = dw_string_from_attrib_type_encoding(scratch.arena, encoding); - }break; - } + DW_Dumper dumper = {0}; + dumper.arena = arena_alloc(); + dumper.arch = arch; + dumper.is_verbose = is_verbose; + dumper.input = input; + dumper.is_relaxed = 1; - if(enum_info.size) - { - str8_list_pushf(scratch.arena, &attrib_fmt, " `%S`", enum_info); + for EachElement(i, g_dw_printers) { + if (((1 << g_dw_printers[i].kind) & subset_flags) != 0) { + String8List s = {0}; + g_dw_printers[i].printer(arena, &s, indent + 1, &dumper); + + if (s.total_size > 0) { + dw_printf("%S:\n", str8_skip(dw_name_string_from_section_kind(g_dw_printers[i].kind), 1)); + dw_printf("{\n"); + dw_indent(); + str8_list_concat_in_place(strings, &s); + dw_unindent(); + dw_printf("}\n"); + } } } - - String8 result = str8_list_join(arena, &attrib_fmt, 0); + String8List result = *strings; + arena_release(dumper.arena); scratch_end(scratch); return result; } -internal String8List -dw_dump_list_from_sections(Arena *arena, - DW_Input *input, - Arch arch, - DW_DumpSubsetFlags subset_flags, - B32 verbose) -{ - String8List strings = {0}; - String8 indent = str8_lit(" "); -#define dump(str) str8_list_push(arena, &strings, (str)) -#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__) -#define DumpSubset(name) if(subset_flags & DW_DumpSubsetFlag_##name) DeferLoop(dumpf("// %S\n\n", dw_name_title_from_dump_subset_table[DW_DumpSubset_##name]), dump(str8_lit("\n"))) - Temp scratch = scratch_begin(&arena, 1); - Rng1U64Array segment_vranges = {0}; - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input); - B32 relaxed = 1; - - DW_CompUnit *cu_arr; - { - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input); - Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Info].data); - Rng1U64Array cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); - cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) - { - cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, input, lu_input, cu_ranges.v[cu_idx].min, relaxed); - } - } - - ////////////////////////////// - //- rjf: dump .debug_info - // - DumpSubset(DebugInfo) - { - Rng1U64List unit_ranges_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Info].data); - Rng1U64Array unit_ranges = rng1u64_array_from_list(scratch.arena, &unit_ranges_list); - for EachIndex(unit_idx, unit_ranges.count) - { - Temp unit_temp = temp_begin(scratch.arena); - - //- rjf: unpack unit - Rng1U64 unit_range = unit_ranges.v[unit_idx]; - DW_CompUnit *unit = &cu_arr[unit_idx]; - String8 unit_dir = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_CompDir ); - String8 unit_name = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_Name ); - String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_StmtList); - - DW_LineVMHeader line_table_header = {0}; - dw_read_line_vm_header(scratch.arena, - input, - stmt_list, - unit_dir, - unit_name, - unit->address_size, - unit->str_offsets_lu, - &line_table_header); - - //- rjf: log top-level unit info - dumpf("unit: // compile_unit[%I64u]\n{\n", unit_idx); - dumpf(" version: %u\n", unit->version); - dumpf(" address_size: %I64u\n", unit->address_size); - dumpf(" abbrev_off: 0x%I64x\n", unit->abbrev_off); - dumpf(" info_range: [0x%I64x, 0x%I64x) // (%M)\n", unit->info_range.min, unit->info_range.max, dim_1u64(unit->info_range)); - - //- rjf: log tags - S64 tag_depth = 0; - U64 tag_idx = 0; - for(U64 info_off = unit->first_tag_info_off; info_off < unit->info_range.max; tag_idx += 1) - { - Temp tag_temp = temp_begin(scratch.arena); - if (info_off == 0x1ed3) { - int x = 0; - } - // rjf: unpack tag - String8 tag_indent = str8_prefix(indent, (tag_depth+1)*2); - DW_Tag tag = {0}; - U64 tag_size = dw_read_tag_cu(tag_temp.arena, input, unit, info_off, &tag); - - if (tag_size == 0) { dumpf("ERROR: .debug_info ends unexpectedly @ %#64x"); break; } - info_off += tag_size; - - // rjf: log top-level tag info - dumpf("%Stag: // info_off: 0x%I64x, abbrev_id: %I64u, compile_unit[%I64u].tag[%I64u]\n%S{\n", tag_indent, tag.info_off, tag.abbrev_id, unit_idx, tag_idx, tag_indent); - dumpf("%S kind: %S\n", tag_indent, dw_string_from_tag_kind(tag_temp.arena, tag.kind)); - - // log attribs - { - // compute columns' max widths - U64 attrib_name_max_size = 0, form_kind_max_size = 0, value_max_size = 0; - for EachNode(attrib_n, DW_AttribNode, tag.attribs.first) - { - Temp attrib_temp = temp_begin(tag_temp.arena); - attrib_name_max_size = Max(attrib_name_max_size, dw_string_from_attrib_kind(attrib_temp.arena, unit->version, unit->ext, attrib_n->v.attrib_kind).size); - form_kind_max_size = Max(form_kind_max_size, dw_string_from_form_kind(attrib_temp.arena, unit->version, attrib_n->v.form_kind).size); - value_max_size = Max(value_max_size, dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_table_header, &attrib_n->v).size); - temp_end(attrib_temp); - } - value_max_size = Min(120, value_max_size); - - // log - for EachNode(attrib_n, DW_AttribNode, tag.attribs.first) - { - DW_Attrib *attrib = &attrib_n->v; - - Temp attrib_temp = temp_begin(tag_temp.arena); - - String8 attrib_kind_str = dw_string_from_attrib_kind(attrib_temp.arena, unit->version, unit->ext, attrib->attrib_kind); - String8 form_kind_str = dw_string_from_form_kind(attrib_temp.arena, unit->version, attrib->form_kind); - String8 value_str = dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_table_header, attrib); - - dumpf("%S attrib: { kind: %S, %.*sform_kind: %S, %.*svalue: %S, %.*s} // [%llu] info_off: 0x%I64x\n", - tag_indent, - attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, indent.str, - form_kind_str, form_kind_max_size - form_kind_str.size, indent.str, - value_str, value_str.size < value_max_size ? value_max_size - value_str.size: 0, indent.str, - attrib->info_off, unit_idx, tag_idx); - - temp_end(attrib_temp); - } - } - - // rjf: log tag closes - if(!tag.has_children || tag.abbrev_id == 0) - { - dumpf("%S}\n", tag_indent); - } - - // rjf: indent/unindent - if(tag.has_children) - { - tag_depth += 1; - } - if(!tag.abbrev_id) - { - tag_depth -= 1; - } - - temp_end(tag_temp); - } - temp_end(unit_temp); - dumpf("} // compile_unit[/%u]\n\n", unit_idx); - } - } - - ////////////////////////////// - //- rjf: dump .debug_abbrev - // - DumpSubset(DebugAbbrev) - { - Temp scratch = scratch_begin(&arena, 1); - DW_Section abbrev = input->sec[DW_Section_Abbrev]; - S64 depth = 0; - U64 idx = 0; - for(U64 cursor = 0; cursor < abbrev.data.size; idx += 1) - { - // rjf: read id & advance - U64 id_off = cursor; - U64 id = 0; - cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &id); - if(id == 0) { continue; } - - // rjf: unpack abbrev - U64 tag = 0; - U8 has_children = 0; - cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &tag); - cursor += str8_deserial_read_struct(abbrev.data, cursor, &has_children); - - // rjf: log abbrev - Temp temp = temp_begin(scratch.arena); - dumpf("abbrev: // abbrev[%I64u] @ 0x%I64x \n{\n", idx, id_off); - dumpf(" id: %I64u tag_kind: %S has_children: %s\n", id, dw_string_from_tag_kind(temp.arena, tag), has_children ? "true" : "false"); - for(;;) - { - U64 attrib_off = cursor; - U64 attrib_id = 0, form_id = 0; - cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &attrib_id); - cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &form_id); - if(attrib_id == 0) { break; } - String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); - String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); - dumpf(" attrib: { kind: %-8S form_kind: %-8S } // 0x%I64x\n", attrib_str, form_str, attrib_off); - } - dumpf("}\n"); - temp_end(temp); - } - scratch_end(scratch); - } - - ////////////////////////////// - //- rjf: dump .debug_line - // - DumpSubset(DebugLine) - { - Rng1U64List unit_ranges_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Line].data); - Rng1U64Array unit_ranges = rng1u64_array_from_list(scratch.arena, &unit_ranges_list); - for EachIndex(unit_idx, unit_ranges.count) - { - Temp unit_temp = temp_begin(scratch.arena); - - DW_LineVM *vm = dw_line_vm_init(input, &cu_arr[unit_idx]); - - // rjf: begin logging line table - dumpf("line_table: // line_table[%I64u]\n{\n", unit_idx); - - // rjf: log line table header - DeferLoop(dumpf(" header:\n {\n"), dumpf(" }\n\n")) - { - String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(vm->header.opcode_lens, vm->header.num_opcode_lens), 1); - String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(", ")}); - dumpf(" version: %u\n", vm->header.version ); - dumpf(" line_table_size: %I64u\n", vm->header.unit_length ); - dumpf(" address_size: %u\n", vm->header.address_size ); - dumpf(" segment_selector_size: %u\n", vm->header.segment_selector_size); - dumpf(" header_length: %I64u\n", vm->header.header_length ); - dumpf(" min_instruction_length: %u\n", vm->header.min_inst_len ); - dumpf(" max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); - dumpf(" default_is_stmt: %u\n", vm->header.default_is_stmt ); - dumpf(" line_base: %d\n", vm->header.line_base ); - dumpf(" line_range: %u\n", vm->header.line_range ); - dumpf(" opcode_base: %u\n", vm->header.opcode_base ); - dumpf(" opcode_lengths: %S\n", opcode_lengths_string ); - } - - // rjf: log directory table - DeferLoop(dumpf(" directory_table:\n {\n"), dumpf(" }\n\n")) - { - dumpf(" // %-4s %-8s\n", "no.", "name"); - for EachIndex(dir_idx, vm->header.dir_table.count) - { - dumpf(" { %-4I64u %S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); - } - } - - // rjf: log file table - DeferLoop(dumpf(" file_table:\n {\n"), dumpf(" }\n\n")) - { - dumpf(" // %-4s %-8s %-8s %-33s %-8s %-8s\n", "no.", "dir_idx", "time", "md5", "size", "name"); - for EachIndex(file_idx, vm->header.file_table.count) - { - DW_LineFile *file = &vm->header.file_table.v[file_idx]; - dumpf(" { %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %S }\n", - file_idx, - file->dir_idx, - file->modify_time, - file->md5_digest.u64[1], - file->md5_digest.u64[0], - file->file_size, - file->file_name); - } - } - - // rjf: log opcodes - DeferLoop(dumpf(" line_table:\n {\n"), dumpf(" }\n\n")) - { - dumpf(" //\n"); - dumpf(" // %-16s %-8s %-4s %-5s %-3s %-7s %-16s\n", "Address", "Line", "Col", "File", "ISA", "Discrim", "Flags"); - dumpf(" // ---------------- -------- ---- ----- --- ------- ----------------\n"); - - for(;;) - { - U64 global_opcode_off = unit_ranges.v[unit_idx].min + vm->cursor; - - if( ! dw_line_vm_step(vm)) { break; } - - Temp opcode_temp = temp_begin(unit_temp.arena); - String8List opcode_fmt = {0}; - - // opcode offset - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); - - // push opcode id - String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); - str8_list_push(arena, &opcode_fmt, opcode_str); - - // format operands - switch(vm->opcode) - { - default: - { - if(vm->opcode >= vm->header.opcode_base) - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); - } - else - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); - } - }break; - case DW_StdOpcode_Copy: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); - }break; - case DW_StdOpcode_AdvancePc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); - }break; - case DW_StdOpcode_AdvanceLine: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); - }break; - case DW_StdOpcode_SetFile: - { - DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); - }break; - case DW_StdOpcode_SetColumn: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); - }break; - case DW_StdOpcode_NegateStmt: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); - }break; - case DW_StdOpcode_SetBasicBlock: - { - }break; - case DW_StdOpcode_ConstAddPc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); - }break; - case DW_StdOpcode_FixedAdvancePc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); - }break; - case DW_StdOpcode_SetPrologueEnd: - { - }break; - case DW_StdOpcode_SetEpilogueBegin: - { - }break; - case DW_StdOpcode_SetIsa: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); - }break; - case DW_StdOpcode_ExtendedOpcode: - { - str8_list_push(opcode_temp.arena, &opcode_fmt, dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); - //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); - switch(vm->ext_opcode) - { - case DW_ExtOpcode_EndSequence: - { - }break; - case DW_ExtOpcode_SetAddress: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); - }break; - case DW_ExtOpcode_DefineFile: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); - }break; - case DW_ExtOpcode_SetDiscriminator: - { - str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); - }break; - } - }break; - } - - if(verbose) - { - String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); - dumpf(" // %S\n", string); - } - - if(vm->new_line) { - String8List l = {0}; - if(vm->state.is_stmt) - { - str8_list_pushf(opcode_temp.arena, &l, "is_stmt"); - } - if(vm->state.end_sequence) - { - str8_list_pushf(opcode_temp.arena, &l, "end_seq"); - } - String8 flags = str8_list_join(opcode_temp.arena, &l, &(StringJoin){.sep = "|"}); - - dumpf(" { %#016I64x %8I64u %4I64u %5I64u %3I64u %7I64u %-16S } %s\n", vm->state.address, vm->state.line, vm->state.column, vm->state.file_index, vm->state.isa, vm->state.discriminator, flags, vm->new_seq ? "// new seq" : ""); - } - - temp_end(opcode_temp); - } - - if(vm->error.size) - { - dumpf("ERROR: Line VM failed stepping @ 0x%I64x\n", vm->cursor); - } - } - temp_end(unit_temp); - } - } - - ////////////////////////////// - //- rjf: dump .debug_str - // - DumpSubset(DebugStr) DeferLoop(dumpf("strings:\n{\n"), dumpf("}\n\n")) - { - String8 data = input->sec[DW_Section_Str].data; - for(U64 cursor = 0, read_size = 0; cursor < data.size; cursor += read_size) - { - String8 string = {0}; - read_size = str8_deserial_read_cstr(data, cursor, &string); - dumpf(" { 0x%08I64x %I64u \"%S\" }\n", cursor, string.size, string); - } - } - - ////////////////////////////// - //~ dump .debug_frame - DumpSubset(DebugFrame) - { - HashTable *cie_ht = hash_table_init(scratch.arena, 0x2000); - String8 debug_frame = input->sec[DW_Section_Frame].data; - U64 addr_size = byte_size_from_arch(arch); - - // make offset -> CIE hash table - for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { - DW_DescriptorEntry desc = {0}; - desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); - if (desc.type == DW_DescriptorEntryType_CIE) { - String8 raw_cie = str8_substr(debug_frame, desc.entry_range); - U64 restore_pos = arena_pos(scratch.arena); - DW_CIE *cie = push_array(scratch.arena, DW_CIE, 1); - if (dw_parse_cie(raw_cie, desc.format, arch, cie)) { - hash_table_push_u64_raw(scratch.arena, cie_ht, cursor, cie); - } else { - arena_pop_to(scratch.arena, restore_pos); - } - } - } - - for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { - DW_DescriptorEntry desc = {0}; - desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); - String8 raw_desc = str8_substr(debug_frame, desc.entry_range); - switch (desc.type) { - case DW_DescriptorEntryType_Null: {} break; - case DW_DescriptorEntryType_CIE: { - DW_CIE cie = {0}; - if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { - String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); - - dumpf("CIE: // entry range: %r\n", desc.entry_range); - dumpf("{\n"); - dumpf(" Format: %S\n", dw_string_from_format(desc.format)); - dumpf(" Version: %u\n", cie.version); - dumpf(" Aug string: \"%S\"\n", cie.aug_string); - dumpf(" Code align: %I64u\n", cie.code_align_factor); - dumpf(" Data align: %I64d\n", cie.data_align_factor); - dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); - if (cie.version > DW_Version_3) { - dumpf(" Address size: %u\n", cie.address_size); - dumpf(" Segment selector size: %u\n", cie.segment_selector_size); - } - dumpf(" Initial Insturction:\n"); - dumpf(" {\n"); - for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(" %S\n", n->string); } - dumpf(" }\n"); - dumpf("}\n"); - } else { - dumpf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); - } - } break; - case DW_DescriptorEntryType_FDE: { - DW_DescriptorEntry cie_desc = {0}; - U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); - String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); - DW_CIE cie = {0}; - dw_parse_cie(cie_data, cie_desc.format, arch, &cie); - - DW_FDE fde = {0}; - if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { - DW_Version version = DW_Version_5; - DW_Ext ext = DW_Ext_All; - String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); - dumpf("FDE: // entry range: %r\n", desc.entry_range); - dumpf("{\n"); - { - dumpf(" Format: %S\n", dw_string_from_format(fde.format)); - dumpf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); - dumpf(" PC range: %r\n", fde.pc_range); - dumpf(" Instructions:\n"); - dumpf(" {\n"); - for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } - dumpf(" }\n"); - } - dumpf(" Unwind:\n"); - dumpf(" {\n"); - DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); - do { - String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); - String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); - dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); - } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); - dumpf(" }\n"); - - dumpf("}\n"); - } else { - dumpf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); - } - } break; - } - } - } - - ////////////////////////////// - //- rjf: dump .debug_loc - // - DumpSubset(DebugLoc) - { - // dw_print_debug_loc(arena, out, indent, input, arch, image_type, relaxed); - } - - ////////////////////////////// - //- rjf: dump .debug_ranges - // - DumpSubset(DebugRanges) - { - // dw_print_debug_ranges(arena, out, indent, input, arch, image_type, relaxed); - } - - ////////////////////////////// - //- rjf: dump .debug_aranges - // - DumpSubset(DebugARanges) - { - // dw_print_debug_aranges(arena, out, indent, input); - } - - ////////////////////////////// - //- rjf: dump .debug_addr - // - DumpSubset(DebugAddr) - { - // dw_print_debug_addr(arena, out, indent, input); - } - - ////////////////////////////// - //- rjf: dump .debug_loclists - // - DumpSubset(DebugLocLists) - { - // dw_print_debug_loclists(arena, out, indent, input, segment_vranges, arch); - } - - ////////////////////////////// - //- rjf: dump .debug_rnglists - // - DumpSubset(DebugRngLists) - { - // dw_print_debug_rnglists(arena, out, indent, input, segment_vranges); - } - - ////////////////////////////// - //- rjf: dump .debug_pubnames - // - DumpSubset(DebugPubNames) - { - // dw_print_debug_pubnames(arena, out, indent, input); - } - - ////////////////////////////// - //- rjf: dump .debug_pubtypes - // - DumpSubset(DebugPubTypes) - { - // dw_print_debug_pubtypes(arena, out, indent, input); - } - - ////////////////////////////// - //- rjf: dump .debug_linestr - // - DumpSubset(DebugLineStr) - { - // dw_print_debug_line_str(arena, out, indent, input); - } - - ////////////////////////////// - //- rjf: dump .debug_stroffs - // - DumpSubset(DebugStrOffsets) - { - // dw_print_debug_str_offsets(arena, out, indent, input); - } - - scratch_end(scratch); -#undef DumpSubset -#undef dumpf -#undef dump - return strings; -} diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index f5648785..eec0d983 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -4,69 +4,52 @@ #ifndef DWARF_DUMP_H #define DWARF_DUMP_H +typedef enum +{ + DW_DumperCacheFlag_InfoRanges = (1 << 0), + DW_DumperCacheFlag_CuArr = (1 << 1), + DW_DumperCacheFlag_LineVmMap = (1 << 2), + DW_DumperCacheFlag_TagTrees = (1 << 3), +} DW_DumperCacheFlags; + +typedef struct DW_Dumper +{ + Arena *arena; + Arch arch; + B32 is_relaxed; + B32 is_verbose; + DW_Input *input; + DW_DumperCacheFlags cache_flags; + struct { + Rng1U64Array info_ranges; + DW_CompUnit *cu_arr; + HashTable *line_vm_map; + DW_TagTree *tag_trees; + } cache; +} DW_Dumper; + +#define DW_PRINTER(name) void name(Arena *arena, String8List *strings, int indent, DW_Dumper *dumper) +typedef DW_PRINTER(DW_Printer); + //////////////////////////////// -//~ rjf: Dump Subset Types -#define DW_DumpSubset_XList \ -X(DebugInfo, debug_info, "DEBUG INFO") \ -X(DebugAbbrev, debug_abbrev, "DEBUG ABBREV") \ -X(DebugLine, debug_line, "DEBUG LINE") \ -X(DebugStr, debug_str, "DEBUG STR") \ -X(DebugLoc, debug_loc, "DEBUG LOC") \ -X(DebugRanges, debug_ranges, "DEBUG RANGES") \ -X(DebugARanges, debug_aranges, "DEBUG ARANGES") \ -X(DebugAddr, debug_addr, "DEBUG ADDR") \ -X(DebugLocLists, debug_loclists, "DEBUG LOCLISTS") \ -X(DebugRngLists, debug_rnglists, "DEBUG RNGLISTS") \ -X(DebugPubNames, debug_pubnames, "DEBUG PUBNAMES") \ -X(DebugPubTypes, debug_pubtypes, "DEBUG PUBTYPES") \ -X(DebugLineStr, debug_linestr, "DEBUG LINESTR") \ -X(DebugStrOffsets, debug_stroff, "DEBUG STROFF") \ -X(DebugFrame, debug_frame, "DEBUG FRAME") \ - -typedef enum DW_DumpSubset -{ -#define X(name, name_lower, title) DW_DumpSubset_##name, - DW_DumpSubset_XList -#undef X -} -DW_DumpSubset; - -typedef U32 DW_DumpSubsetFlags; -enum -{ -#define X(name, name_lower, title) DW_DumpSubsetFlag_##name = (1<string, str8_lit(#name_lower), 0)) { rdi_dump_subset_flags |= RDI_DumpSubsetFlag_##name; } RDI_DumpSubset_XList #undef X -#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { dw_dump_subset_flags |= DW_DumpSubsetFlag_##name; } - DW_DumpSubset_XList +#define X(_N, _L, ...) else if(str8_match(n->string, str8_skip(str8_lit(_L), 1), 0)) { dw_dump_subset_flags |= DW_SectionFlag_##_N; } + DW_SectionKind_XList #undef X #define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { eh_dump_subset_flags |= EH_DumpSubsetFlag_##name; } EH_DumpSubset_XList @@ -1078,8 +1078,8 @@ rb_thread_entry_point(void *p) #define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { rdi_dump_subset_flags &= ~RDI_DumpSubsetFlag_##name; } RDI_DumpSubset_XList #undef X -#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { dw_dump_subset_flags &= ~DW_DumpSubsetFlag_##name; } - DW_DumpSubset_XList +#define X(_N, _L, ...) else if(str8_match(n->string, str8_skip(str8_lit(_L), 1), 0)) { dw_dump_subset_flags &= ~DW_SectionFlag_##_N; } + DW_SectionKind_XList #undef X #define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { eh_dump_subset_flags &= ~EH_DumpSubsetFlag_##name; } EH_DumpSubset_XList @@ -1236,15 +1236,10 @@ rb_thread_entry_point(void *p) if(lane_idx() == 0) { str8_list_pushf(arena, &output_blobs, "// %S (%S) (DWARF)\n\n", deterministic ? str8_skip_last_slash(f->path) : f->path, f->format ? rb_file_format_display_name_table[f->format] : str8_lit("Unsupported format")); + String8List dump = dw_dump_list_from_sections(arena, &dw, arch, dw_dump_subset_flags, verbose); + str8_list_concat_in_place(&output_blobs, &dump); } lane_sync(); - { - String8List dump = dw_dump_list_from_sections(arena, &dw, arch, dw_dump_subset_flags, verbose); - if(lane_idx() == 0) - { - str8_list_concat_in_place(&output_blobs, &dump); - } - } } if(eh_dump_subset_flags) diff --git a/src/torture/torture.c b/src/torture/torture.c index a76d07cf..3d9ca11d 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -354,12 +354,12 @@ t_entry_point(CmdLine *cmdline) crash_count += 1; } - if (result.status != T_RunStatus_Pass) { + if (result.status == T_RunStatus_Fail) { fprintf(stdout, " ERROR: %s:%d: condition: \"%s\"\n", result.fail_file, result.fail_line, result.fail_cond); } } - fprintf(stdout, "---- Passed: %I64u, Failed: %I64u, Crashed: %I64u ----\n", pass_count, fail_count, crash_count); + fprintf(stdout, "*** Passed: %I64u, Failed: %I64u, Crashed: %I64u ***\n", pass_count, fail_count, crash_count); if (fail_count + crash_count != 0) { fflush(stdout); From da6fd986f0d6975bc1ac5657e8ac430443d4b012 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 00:00:56 -0800 Subject: [PATCH 183/850] do not exit on failed call --- src/os/core/win32/os_core_win32.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 59b8f176..49d67e80 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1424,7 +1424,6 @@ os_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *f { fail_handler(ptr); } - ExitProcess(1); } } From ddfeba8ae1fed86f4e9aab51d3891a67a50ec5e0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 00:01:21 -0800 Subject: [PATCH 184/850] natvis for DWARF writer --- src/natvis/base.natvis | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/natvis/base.natvis b/src/natvis/base.natvis index c4387550..59a43987 100644 --- a/src/natvis/base.natvis +++ b/src/natvis/base.natvis @@ -1,12 +1,11 @@ - {size,str} - size,str + {{ size={size} str={str} }} - {{ string={string.size,string.str} next={next} }} + {{ string={string} next={next} }} @@ -19,7 +18,7 @@ node_count first next - string + this @@ -207,4 +206,38 @@ + + + kind + next + next + parent + + {first_child} + + + + + + + node + node = node->next + + + + + + count={attrib_count}, [0]={first_attrib} + + + attrib_count + first_attrib + next + this + + + + + + From 21adae63bfa4eb22c6d93393bffaa1aeb88b2ecc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 00:03:19 -0800 Subject: [PATCH 185/850] enable spec-conformant preprocessor in MSVC --- build.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.bat b/build.bat index eb0dd4d1..07d1dcec 100644 --- a/build.bat +++ b/build.bat @@ -67,7 +67,7 @@ if "%pgo%"=="1" ( :: --- Compile/Link Line Definitions ------------------------------------------ set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 -set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 /D_DEBUG %cl_common% %auto_compile_flags% +set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 /D_DEBUG %cl_common% %auto_compile_flags% /Zc:preprocessor set cl_release= call cl /O2 /DBUILD_DEBUG=0 /DNDEBUG %cl_common% %auto_compile_flags% set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" /noexp /nocoffgrpinfo /opt:ref /opt:icf set cl_out= /out: From efc585541907a3db486fec9897e7163c39769d44 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 13:45:25 -0800 Subject: [PATCH 186/850] bake a predictable producer string --- src/torture/torture_dwarf.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 881b835d..cfecf768 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -111,7 +111,7 @@ dwt_make_writer(void) DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_Last, DW_CompUnitKind_Compile, Arch_x64); { dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit(BUILD_TITLE_STRING_LITERAL)); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); dw_writer_push_attrib_enum(writer, DW_AttribKind_Language, DW_Language_C99); dw_writer_push_attrib_flag(writer, DW_AttribKind_UseUtf8, 1); { @@ -226,7 +226,7 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *producer_attrib = comp_unit_tag->first_attrib; T_Ok(producer_attrib->kind == DW_AttribKind_Producer); T_Ok(producer_attrib->reader.form.kind == DW_Form_String); - T_Ok(str8_match(producer_attrib->writer.form.string, str8_lit(BUILD_TITLE_STRING_LITERAL), 0)); + T_Ok(str8_match(producer_attrib->writer.form.string, str8_lit("RAD DWARF WRITER"), 0)); DW_WriterAttrib *language_attrib = producer_attrib->next; T_Ok(language_attrib->kind == DW_AttribKind_Language); @@ -247,7 +247,7 @@ T_BeginTest(dwarf_writer) T_Ok(char_type_tag->parent == comp_unit_tag); T_Ok(char_type_tag->attrib_count == 3); T_Ok(char_type_tag->abbrev_id == 2); - T_Ok(char_type_tag->info_off == 0x4d); + T_Ok(char_type_tag->info_off == 0x20); T_Ok(char_type_tag->first_attrib != char_type_tag->last_attrib); DW_WriterAttrib *byte_size_attrib = char_type_tag->first_attrib; @@ -275,7 +275,7 @@ T_BeginTest(dwarf_writer) T_Ok(const_type_tag->parent == comp_unit_tag); T_Ok(const_type_tag->attrib_count == 1); T_Ok(const_type_tag->abbrev_id == 3); - T_Ok(const_type_tag->info_off == 0x55); + T_Ok(const_type_tag->info_off == 0x28); T_Ok(const_type_tag->first_attrib && const_type_tag->first_attrib == const_type_tag->last_attrib); DW_WriterAttrib *type_attrib = const_type_tag->first_attrib; @@ -291,7 +291,7 @@ T_BeginTest(dwarf_writer) T_Ok(dup_char_type_tag->parent == comp_unit_tag); T_Ok(dup_char_type_tag->attrib_count == 3); T_Ok(dup_char_type_tag->abbrev_id == 2); - T_Ok(dup_char_type_tag->info_off == 0x57); + T_Ok(dup_char_type_tag->info_off == 0x2a); T_Ok(dup_char_type_tag->first_attrib != dup_char_type_tag->last_attrib); DW_WriterAttrib *byte_size_attrib = dup_char_type_tag->first_attrib; @@ -319,7 +319,7 @@ T_BeginTest(dwarf_writer) T_Ok(simple_struct_tag->parent == comp_unit_tag); T_Ok(simple_struct_tag->attrib_count == 2); T_Ok(simple_struct_tag->abbrev_id == 4); - T_Ok(simple_struct_tag->info_off == 0x5f); + T_Ok(simple_struct_tag->info_off == 0x32); DW_WriterAttrib *simple_struct_name = simple_struct_tag->first_attrib; T_Ok(simple_struct_name->kind == DW_AttribKind_Name); @@ -331,7 +331,7 @@ T_BeginTest(dwarf_writer) T_Ok(m0_tag->kind == DW_TagKind_Member); T_Ok(m0_tag->parent == simple_struct_tag); T_Ok(m0_tag->attrib_count == 3); - T_Ok(m0_tag->info_off == 0x68); + T_Ok(m0_tag->info_off == 0x3b); T_Ok(m0_tag->abbrev_id == 5); DW_WriterAttrib *name = m0_tag->first_attrib; @@ -342,7 +342,7 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); T_Ok(type->reader.form.kind == DW_Form_Ref1); - T_Ok(type->reader.form.ref == 0x4d); + T_Ok(type->reader.form.ref == 0x20); DW_WriterAttrib *data_loc = type->next; T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); @@ -356,7 +356,7 @@ T_BeginTest(dwarf_writer) T_Ok(m1_tag->kind == DW_TagKind_Member); T_Ok(m1_tag->parent == simple_struct_tag); T_Ok(m1_tag->attrib_count == 4); - T_Ok(m1_tag->info_off == 0x6e); + T_Ok(m1_tag->info_off == 0x41); T_Ok(m1_tag->abbrev_id == 6); DW_WriterAttrib *name = m1_tag->first_attrib; @@ -367,7 +367,7 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); T_Ok(type->reader.form.kind == DW_Form_Ref1); - T_Ok(type->reader.form.ref == 0x4d); + T_Ok(type->reader.form.ref == 0x20); DW_WriterAttrib *data_loc = type->next; T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); From 5aea3527c1c77aed2fa079ed880cf6faac777923 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 13:52:33 -0800 Subject: [PATCH 187/850] use-after-poison fix --- src/linker/lnk_obj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 7a8e1a88..7e50190e 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -750,7 +750,7 @@ lnk_debug_s_from_obj(Arena *arena, LNK_Obj *obj) { for (String8Node *node = raw_debug_s.first; node != 0; node = node->next) { // parse & merge sub sections - CV_DebugS ds = cv_parse_debug_s(scratch.arena, node->string); + CV_DebugS ds = cv_parse_debug_s(arena, node->string); cv_debug_s_concat_in_place(&debug_s, &ds); // make sure there is one string table From 2a76188570bd6e00de7f49013be545cce0c1d317 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 13:53:37 -0800 Subject: [PATCH 188/850] allocate a minimum cap hash table for the lib member infos --- src/linker/lnk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 5f42ac5f..22f844f2 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1754,7 +1754,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer link->last_default_lib = &config->input_default_lib_list.first; link->last_obj_lib = &config->input_obj_lib_list.first; link->last_cmd_lib = &config->input_list[LNK_Input_Lib].first; - link->lib_member_infos_ht = hash_table_init(link->arena, config->input_list[LNK_Input_Lib].node_count * 2); + link->lib_member_infos_ht = hash_table_init(link->arena, Max(config->input_list[LNK_Input_Lib].node_count * 2, 512)); link->try_to_resolve_entry_point = 1; // input :null_obj From 56b89cc8cbf056111c6e50d33a4fc412ced2af03 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 15:26:22 -0800 Subject: [PATCH 189/850] plot arena memory usage --- src/base/base_arena.c | 28 ++++++++++++++++++++++++++++ src/base/base_arena.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 4e6cd0c0..7283d20e 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -67,6 +67,7 @@ arena_alloc_(ArenaParams *params) arena->res = reserve_size; arena->allocation_site_file = params->allocation_site_file; arena->allocation_site_line = params->allocation_site_line; + arena->name = params->name; #if ARENA_FREE_LIST arena->free_last = 0; #endif @@ -76,6 +77,14 @@ arena_alloc_(ArenaParams *params) internal void arena_release(Arena *arena) { +#if PROFILE_TELEMETRY + { + Arena *base_arena = arena; + while (base_arena->prev) base_arena = base_arena->prev; + tmPlot(0, TM_PLOT_UNITS_MEMORY, TM_PLOT_DRAW_LINE, 0, "%s/%p", base_arena->name, base_arena); + } +#endif + for(Arena *n = arena->current, *prev = 0; n != 0; n = prev) { prev = n->prev; @@ -181,6 +190,15 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) MemoryZero(result, size_to_zero); } } + +#if PROFILE_TELEMETRY + if(size > KB(1)) + { + Arena *base_arena = arena; + while (base_arena->prev) base_arena = base_arena->prev; + tmPlot(0, TM_PLOT_UNITS_MEMORY, TM_PLOT_DRAW_LINE, (double)(current->base_pos + current->pos) / 1024.0 / 1024.0, "%s/%p", base_arena->name, base_arena); + } +#endif // rjf: panic on failure #if OS_FEATURE_GRAPHICAL @@ -228,6 +246,16 @@ arena_pop_to(Arena *arena, U64 pos) AssertAlways(new_pos <= current->pos); AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos)); current->pos = new_pos; + +#if PROFILE_TELEMETRY + if((pos - (new_pos + current->base_pos)) > KB(1)) + { + Arena *base_arena = arena; + while (base_arena->prev) base_arena = base_arena->prev; + tmPlot(0, TM_PLOT_UNITS_MEMORY, TM_PLOT_DRAW_LINE, (double)(current->base_pos + current->pos) / 1024.0 / 1024.0, "%s/%p", base_arena->name, base_arena); + } +#endif + } //- rjf: arena push/pop helpers diff --git a/src/base/base_arena.h b/src/base/base_arena.h index 99fd33bb..5a1d82c2 100644 --- a/src/base/base_arena.h +++ b/src/base/base_arena.h @@ -25,6 +25,7 @@ struct ArenaParams void *optional_backing_buffer; char *allocation_site_file; int allocation_site_line; + char *name; }; typedef struct Arena Arena; @@ -41,6 +42,7 @@ struct Arena U64 res; char *allocation_site_file; int allocation_site_line; + char *name; #if ARENA_FREE_LIST Arena *free_last; #endif From e8ca3e0d5cd0d0cda228181560630a17fcd6d684 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 15:27:00 -0800 Subject: [PATCH 190/850] name tag arenas for the memory plots --- src/base/base_thread_context.c | 17 +++++++++++++---- src/coff/coff_obj_writer.c | 2 +- src/linker/lnk.c | 4 ++-- src/linker/thread_pool/thread_pool.c | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index a1b97d8d..12cc3343 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -17,10 +17,19 @@ C_LINKAGE thread_static TCTX *tctx_thread_local = 0; internal TCTX * tctx_alloc(void) { - Arena *arena = arena_alloc(); - TCTX *tctx = push_array(arena, TCTX, 1); - tctx->arenas[0] = arena; - tctx->arenas[1] = arena_alloc(); +#if PROFILE_TELEMETRY + thread_static static U8 name[2][1024]; + raddbg_snprintf(name[0], sizeof(name[0]), "Scratch/0[TID:%u]", os_tid()); + raddbg_snprintf(name[1], sizeof(name[1]), "Scratch/1[TID:%u]", os_tid()); + Arena *arena_0 = arena_alloc(.name = name[0]); + Arena *arena_1 = arena_alloc(.name = name[1]); +#else + Arena *arena_0 = arena_alloc(); + Arena *arena_1 = arena_alloc(); +#endif + TCTX *tctx = push_array(arena_0, TCTX, 1); + tctx->arenas[0] = arena_0; + tctx->arenas[1] = arena_1; tctx->lane_ctx.lane_count = 1; return tctx; } diff --git a/src/coff/coff_obj_writer.c b/src/coff/coff_obj_writer.c index 02fb5f1f..01b9cbfb 100644 --- a/src/coff/coff_obj_writer.c +++ b/src/coff/coff_obj_writer.c @@ -4,7 +4,7 @@ internal COFF_ObjWriter* coff_obj_writer_alloc(COFF_TimeStamp time_stamp, COFF_MachineType machine) { - Arena *arena = arena_alloc(); + Arena *arena = arena_alloc(.name = "COFF OBJ WRITER"); COFF_ObjWriter *obj_writer = push_array(arena, COFF_ObjWriter, 1); obj_writer->arena = arena; obj_writer->time_stamp = time_stamp; diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 22f844f2..13ff65f0 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -958,7 +958,7 @@ lnk_array_from_input_list(Arena *arena, LNK_InputList list) internal LNK_Inputer * lnk_inputer_init(void) { - Arena *arena = arena_alloc(); + Arena *arena = arena_alloc(.name = "INPUTER"); LNK_Inputer *inputer = push_array(arena, LNK_Inputer, 1); inputer->arena = arena; inputer->objs_ht = hash_table_init(arena, 0x20000); @@ -1748,7 +1748,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer // init link context // LNK_Link *link = push_array(arena->v[0], LNK_Link, 1); - link->arena = arena_alloc(); + link->arena = arena_alloc(.name = "LINK"); link->last_symbol_input = &link->objs.first; link->last_include = &config->include_symbol_list.first; link->last_default_lib = &config->input_default_lib_list.first; diff --git a/src/linker/thread_pool/thread_pool.c b/src/linker/thread_pool/thread_pool.c index da2f7814..e8f76277 100644 --- a/src/linker/thread_pool/thread_pool.c +++ b/src/linker/thread_pool/thread_pool.c @@ -139,7 +139,7 @@ tp_arena_alloc(TP_Context *pool) Temp scratch = scratch_begin(0,0); Arena **arr = push_array(scratch.arena, Arena *, pool->worker_count); for (U64 i = 0; i < pool->worker_count; ++i) { - arr[i] = arena_alloc(); + arr[i] = arena_alloc("THREAD_POOL"); } Arena **dst = push_array(arr[0], Arena *, pool->worker_count); MemoryCopy(dst, arr, sizeof(Arena*) * pool->worker_count); From aa25570904f424dadf581444ee1237555fc871c7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 15:28:02 -0800 Subject: [PATCH 191/850] improve memory usage when reporting unresolved symbols --- src/linker/lnk.c | 126 +++++++++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 58 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 13ff65f0..a2cbdf66 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -2077,79 +2077,89 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer radsort(unresolved_symbols, unresolved_symbols_count, lnk_symbol_ptr_is_before); } - for EachIndex(i, unresolved_symbols_count) { - LNK_Symbol *symbol = unresolved_symbols[i]; + if (unresolved_symbols_count) { + Temp debug_scratch = scratch_begin(&scratch.arena, 1); - if (i > config->unresolved_symbol_limit) { - lnk_error(LNK_Error_UnresolvedSymbol, "too many unresolved symbol errors, stopping now"); - break; - } + for EachIndex(i, unresolved_symbols_count) { + LNK_Symbol *symbol = unresolved_symbols[i]; - String8List supp_info = {0}; - { - U64 refs_count = 0; - LNK_ObjSymbolRef **refs = lnk_ref_from_symbol_many(scratch.arena, symbol, &refs_count); - for EachIndex(ref_idx, refs_count) { - LNK_ObjSymbolRef *ref = refs[ref_idx]; - LNK_Obj *obj = ref->obj; - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - String8 string_table = lnk_coff_string_table_from_obj(obj); + if (i > config->unresolved_symbol_limit) { + lnk_error(LNK_Error_UnresolvedSymbol, "too many unresolved symbol errors, stopping now"); + break; + } - CV_DebugS debug_s = {0}; - CV_LinesAccel *debug_lines = 0; - String8 debug_checksums = {0}; - String8 debug_strings = {0}; + String8List supp_info = {0}; + { + U64 refs_count = 0; + LNK_ObjSymbolRef **refs = lnk_ref_from_symbol_many(scratch.arena, symbol, &refs_count); + for EachIndex(ref_idx, refs_count) { + LNK_ObjSymbolRef *ref = refs[ref_idx]; + LNK_Obj *obj = ref->obj; + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + String8 string_table = lnk_coff_string_table_from_obj(obj); - for EachIndex(sect_idx, obj->header.section_count_no_null) { - COFF_SectionHeader *section_header = §ion_table[sect_idx]; - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + Temp debug_temp = temp_begin(debug_scratch.arena); + CV_DebugS debug_s = {0}; + CV_LinesAccel *debug_lines = 0; + String8 debug_checksums = {0}; + String8 debug_strings = {0}; - String8 section_name = coff_name_from_section_header(string_table, section_header); - U64 section_number = sect_idx+1; - COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, section_header); - for EachIndex(reloc_idx, relocs.count) { - if (supp_info.node_count > config->unresolved_symbol_ref_limit) { - str8_list_pushf(scratch.arena, &supp_info, "too many unresolved symbol references reported, stopping now"); - goto next_undefined_symbol; - } - COFF_Reloc *reloc = &relocs.v[reloc_idx]; - if (reloc->isymbol == ref->symbol_idx) { - U64 line_matches_count = 0; - CV_Line *line_matches = 0; - if (config->map_lines_for_unresolved_symbols == LNK_SwitchState_Yes) { - if (debug_lines == 0) { - debug_s = lnk_debug_s_from_obj(scratch.arena, obj); - String8List raw_checksums = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); - String8List raw_strings = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable); - debug_lines = cv_lines_accel_from_debug_s(scratch.arena, debug_s); - debug_checksums = str8_list_first(&raw_checksums); - debug_strings = str8_list_first(&raw_strings); - } - line_matches_count = 0; - line_matches = cv_line_from_voff(debug_lines, reloc->apply_off, &line_matches_count); + for EachIndex(sect_idx, obj->header.section_count_no_null) { + COFF_SectionHeader *section_header = §ion_table[sect_idx]; + if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + + String8 section_name = coff_name_from_section_header(string_table, section_header); + U64 section_number = sect_idx+1; + COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, section_header); + for EachIndex(reloc_idx, relocs.count) { + if (supp_info.node_count > config->unresolved_symbol_ref_limit) { + str8_list_pushf(scratch.arena, &supp_info, "too many unresolved symbol references reported, stopping now"); + temp_end(debug_temp); + goto next_undefined_symbol; } + COFF_Reloc *reloc = &relocs.v[reloc_idx]; + if (reloc->isymbol == ref->symbol_idx) { + U64 line_matches_count = 0; + CV_Line *line_matches = 0; + if (config->map_lines_for_unresolved_symbols == LNK_SwitchState_Yes) { + if (debug_lines == 0) { + debug_s = lnk_debug_s_from_obj(debug_temp.arena, obj); + String8List raw_checksums = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); + String8List raw_strings = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable); + debug_lines = cv_lines_accel_from_debug_s(debug_temp.arena, debug_s); + debug_checksums = str8_list_first(&raw_checksums); + debug_strings = str8_list_first(&raw_strings); + } + line_matches_count = 0; + line_matches = cv_line_from_voff(debug_lines, reloc->apply_off, &line_matches_count); + } - if (line_matches) { - for EachIndex(i, line_matches_count) { - CV_Line line = line_matches[i]; - CV_C13Checksum checksum = {0}; - String8 file_name = {0}; - str8_deserial_read_struct(debug_checksums, line.file_off, &checksum); - str8_deserial_read_cstr(debug_strings, checksum.name_off, &file_name); - str8_list_pushf(scratch.arena, &supp_info, "%S: %S:%u", lnk_loc_from_obj(scratch.arena, obj), file_name, line.line_num); + if (line_matches) { + for EachIndex(i, line_matches_count) { + CV_Line line = line_matches[i]; + CV_C13Checksum checksum = {0}; + String8 file_name = {0}; + str8_deserial_read_struct(debug_checksums, line.file_off, &checksum); + str8_deserial_read_cstr(debug_strings, checksum.name_off, &file_name); + str8_list_pushf(scratch.arena, &supp_info, "%S: %S:%u", lnk_loc_from_obj(debug_temp.arena, obj), file_name, line.line_num); + } + } else { + str8_list_pushf(scratch.arena, &supp_info, "%S: %S(%llx)+%x", lnk_loc_from_obj(debug_temp.arena, obj), section_name, section_number, reloc->apply_off); } - } else { - str8_list_pushf(scratch.arena, &supp_info, "%S: %S(%llx)+%x", lnk_loc_from_obj(scratch.arena, obj), section_name, section_number, reloc->apply_off); } } } + + temp_end(debug_temp); } + next_undefined_symbol:; } - next_undefined_symbol:; + + lnk_error(LNK_Error_UnresolvedSymbol, "unresolved symbol %S", symbol->name); + lnk_supplement_error_list(supp_info); } - lnk_error(LNK_Error_UnresolvedSymbol, "unresolved symbol %S", symbol->name); - lnk_supplement_error_list(supp_info); + scratch_end(debug_scratch); } // TODO: /FORCE From 1e6df05d9f182249ea0106c464fa576fd5f52e6f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 11 Feb 2026 17:20:38 -0800 Subject: [PATCH 192/850] sort resource pointers --- src/linker/lnk.c | 31 +++++++++++++++++++++++-------- src/pe/pe.c | 24 ++++++++++++++++++++++++ src/pe/pe.h | 10 ++++++++++ 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index a2cbdf66..ebea90b2 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -493,8 +493,8 @@ lnk_make_null_obj(Arena *arena) internal int lnk_res_string_id_is_before(void *raw_a, void *raw_b) { - PE_Resource *a = raw_a; - PE_Resource *b = raw_b; + PE_Resource *a = *(PE_Resource **)raw_a; + PE_Resource *b = *(PE_Resource **)raw_b; Assert(a->id.type == COFF_ResourceIDType_String); Assert(b->id.type == COFF_ResourceIDType_String); int is_before = str8_is_before_case_sensitive(&a->id.u.string, &b->id.u.string); @@ -504,8 +504,8 @@ lnk_res_string_id_is_before(void *raw_a, void *raw_b) internal int lnk_res_number_id_is_before(void *raw_a, void *raw_b) { - PE_Resource *a = raw_a; - PE_Resource *b = raw_b; + PE_Resource *a = *(PE_Resource **)raw_a; + PE_Resource *b = *(PE_Resource **)raw_b; Assert(a->id.type == COFF_ResourceIDType_Number); Assert(b->id.type == COFF_ResourceIDType_Number); int is_before = u16_is_before(&a->id.u.number, &b->id.u.number); @@ -576,10 +576,25 @@ lnk_serialize_pe_resource_tree(COFF_ObjWriter *obj_writer, PE_ResourceDir *root_ dir_header->id_entry_count = res->u.dir->id_list.count; // sort input resources - PE_ResourceArray named_array = pe_resource_list_to_array(scratch.arena, &res->u.dir->named_list); - PE_ResourceArray id_array = pe_resource_list_to_array(scratch.arena, &res->u.dir->id_list); - radsort(named_array.v, named_array.count, lnk_res_string_id_is_before); - radsort(id_array.v, id_array.count, lnk_res_number_id_is_before); + PE_ResourceArray named_array; + PE_ResourceArray id_array; + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + named_array = pe_resource_list_to_array(scratch2.arena, &res->u.dir->named_list); + id_array = pe_resource_list_to_array(scratch2.arena, &res->u.dir->id_list); + + PE_ResourcePtrArray named_ptr_array = pe_resource_ptr_from_array(scratch2.arena, named_array); + PE_ResourcePtrArray id_ptr_array = pe_resource_ptr_from_array(scratch2.arena, id_array); + + radsort(named_ptr_array.v, named_ptr_array.count, lnk_res_string_id_is_before); + radsort(id_ptr_array.v, id_ptr_array.count, lnk_res_number_id_is_before); + + named_array = pe_resource_from_ptr_array(scratch.arena, named_ptr_array); + id_array = pe_resource_from_ptr_array(scratch.arena, id_ptr_array); + + scratch_end(scratch2); + } // allocate COFF entries COFF_ResourceDirEntry *named_entries = push_array(obj_writer->arena, COFF_ResourceDirEntry, named_array.count); diff --git a/src/pe/pe.c b/src/pe/pe.c index 61786acd..2a967c2c 100644 --- a/src/pe/pe.c +++ b/src/pe/pe.c @@ -1712,6 +1712,30 @@ pe_make_manifest_resource(Arena *arena, U32 resource_id, String8 manifest_data) return res; } +internal PE_ResourcePtrArray +pe_resource_ptr_from_array(Arena *arena, PE_ResourceArray arr) +{ + PE_ResourcePtrArray result = {0}; + result.count = arr.count; + result.v = push_array(arena, PE_Resource *, arr.count); + for EachIndex(i, arr.count) { + result.v[i] = &arr.v[i]; + } + return result; +} + +internal PE_ResourceArray +pe_resource_from_ptr_array(Arena *arena, PE_ResourcePtrArray arr) +{ + PE_ResourceArray result = {0}; + result.count = arr.count; + result.v = push_array(arena, PE_Resource, arr.count); + for EachIndex(i, arr.count) { + result.v[i] = *arr.v[i]; + } + return result; +} + //////////////////////////////// //~ Debug Directory diff --git a/src/pe/pe.h b/src/pe/pe.h index bb4386b0..378d71ed 100644 --- a/src/pe/pe.h +++ b/src/pe/pe.h @@ -867,6 +867,13 @@ struct PE_ResourceArray U64 count; }; +typedef struct PE_ResourcePtrArray PE_ResourcePtrArray; +struct PE_ResourcePtrArray +{ + PE_Resource **v; + U64 count; +}; + typedef struct PE_ResourceDir PE_ResourceDir; struct PE_ResourceDir { @@ -1097,6 +1104,9 @@ internal PE_ResourceDir * pe_resource_table_from_directory_data(Arena *arena, S internal String8 pe_make_manifest_resource(Arena *arena, U32 resource_id, String8 manifest_data); +internal PE_ResourcePtrArray pe_resource_ptr_from_array(Arena *arena, PE_ResourceArray arr); +internal PE_ResourceArray pe_resource_from_ptr_array(Arena *arena, PE_ResourcePtrArray arr); + //////////////////////////////// //~ Debug Directory From 7720ba096e61fd5b56c2c7f02326763ade6bad0a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 12 Feb 2026 13:11:36 -0800 Subject: [PATCH 193/850] switch to 64-bit type hashes; 128-bits is unnecessary, CodeView can't have more than 2^32 types --- src/linker/lnk_debug_info.c | 165 ++++++++++++++++-------------------- src/linker/lnk_debug_info.h | 14 +-- 2 files changed, 78 insertions(+), 101 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index e546f3f3..3d80ea43 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -955,7 +955,7 @@ lnk_cv_leaf_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) return leaf; } -internal U128 +internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref) { LNK_LeafLocType loc_type; @@ -970,7 +970,7 @@ lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref) U32 loc_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; U32 leaf_idx = leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI; - U128 hash = hashes->v[loc_type][loc_idx][ti_source].v[leaf_idx]; + U64 hash = hashes->v[loc_type][loc_idx][ti_source][leaf_idx]; return hash; } @@ -1026,10 +1026,10 @@ lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef { B32 are_same = 0; - U128 a_hash = lnk_hash_from_leaf_ref(hashes, a); - U128 b_hash = lnk_hash_from_leaf_ref(hashes, b); + U64 a_hash = lnk_hash_from_leaf_ref(hashes, a); + U64 b_hash = lnk_hash_from_leaf_ref(hashes, b); - if (u128_match(a_hash, b_hash)) { + if (a_hash == b_hash) { CV_Leaf a_leaf = lnk_cv_leaf_from_leaf_ref(input, a); CV_Leaf b_leaf = lnk_cv_leaf_from_leaf_ref(input, b); Assert(a_leaf.kind == b_leaf.kind); @@ -1058,10 +1058,10 @@ lnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes * { B32 are_equal = 0; - U128 a_hash = lnk_hash_from_leaf_ref(hashes, a); - U128 b_hash = lnk_hash_from_leaf_ref(hashes, b); + U64 a_hash = lnk_hash_from_leaf_ref(hashes, a); + U64 b_hash = lnk_hash_from_leaf_ref(hashes, b); - if (u128_match(a_hash, b_hash)) { + if (a_hash == b_hash) { String8 a_raw_leaf = lnk_data_from_leaf_ref(input, a); String8 b_raw_leaf = lnk_data_from_leaf_ref(input, b); @@ -1130,7 +1130,7 @@ skip_type_index_compare:; return are_equal; } -internal U128 +internal U64 lnk_hash_cv_leaf(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, @@ -1190,10 +1190,10 @@ lnk_hash_cv_leaf(Arena *arena, LNK_LeafRef sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, loc_type, ti_n->source, loc_idx, sub_ti); // query sub hash - U128 sub_hash = lnk_hash_from_leaf_ref(hashes, sub_leaf_ref); + U64 sub_hash = lnk_hash_from_leaf_ref(hashes, sub_leaf_ref); // make sure sub hash was computed (:zero_hash_array) - Assert(!u128_match(sub_hash, u128_zero())); + Assert(sub_hash != 0); // mix-in sub hash blake3_hasher_update(&hasher, &sub_hash, sizeof sub_hash); @@ -1217,7 +1217,7 @@ lnk_hash_cv_leaf(Arena *arena, } } - U128 hash; + U64 hash; blake3_hasher_finalize(&hasher, (U8 *) &hash, sizeof hash); return hash; @@ -1256,7 +1256,7 @@ lnk_hash_cv_leaf_deep(Arena *arena, root_frame->ti_source = CV_TypeIndexSource_NULL; MemoryZeroStruct(&root_frame->leaf); - U128Array *curr_hashes = hashes->v[loc_type][loc_idx]; + U64 **curr_hashes = hashes->v[loc_type][loc_idx]; struct stack_s *stack = root_frame; while (stack) { @@ -1276,7 +1276,7 @@ lnk_hash_cv_leaf_deep(Arena *arena, U64 ti_idx = (*ti_ptr - ti_ranges[curr_ti_info->source].min); // was leaf hashed? - if (MemoryIsZeroStruct(&curr_hashes[curr_ti_info->source].v[ti_idx])) { // :zero_hash_array + if (curr_hashes[curr_ti_info->source][ti_idx] == 0) { // :zero_hash_array CV_Leaf leaf = cv_debug_t_get_leaf(leaves[curr_ti_info->source], ti_idx); // find index offsets @@ -1298,15 +1298,15 @@ lnk_hash_cv_leaf_deep(Arena *arena, SLLStackPush(stack, frame); break; } else { - curr_hashes[curr_ti_info->source].v[ti_idx] = lnk_hash_cv_leaf(temp.arena, - input, - hashes, - loc_type, - loc_idx, - ti_ranges, - CV_TypeIndex_Max, - leaf, - sub_ti_info_list); + curr_hashes[curr_ti_info->source][ti_idx] = lnk_hash_cv_leaf(temp.arena, + input, + hashes, + loc_type, + loc_idx, + ti_ranges, + CV_TypeIndex_Max, + leaf, + sub_ti_info_list); } } } @@ -1319,15 +1319,15 @@ lnk_hash_cv_leaf_deep(Arena *arena, // sub leaves are hashed we can now hash parent leaf Temp temp2 = temp_begin(temp.arena); U64 leaf_idx = stack->ti - ti_ranges[stack->ti_source].min; - curr_hashes[stack->ti_source].v[leaf_idx] = lnk_hash_cv_leaf(temp2.arena, - input, - hashes, - loc_type, - loc_idx, - ti_ranges, - CV_TypeIndex_Max, - stack->leaf, - stack->ti_info_list); + curr_hashes[stack->ti_source][leaf_idx] = lnk_hash_cv_leaf(temp2.arena, + input, + hashes, + loc_type, + loc_idx, + ti_ranges, + CV_TypeIndex_Max, + stack->leaf, + stack->ti_info_list); temp_end(temp2); } @@ -1339,16 +1339,16 @@ lnk_hash_cv_leaf_deep(Arena *arena, } internal LNK_LeafBucket * -lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U128 new_hash, LNK_LeafBucket *new_bucket) +lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 new_hash, LNK_LeafBucket *new_bucket) { LNK_LeafBucket *result = 0; B32 is_inserted_or_updated = 0; - U64 best_idx = u128_mod64(new_hash, leaf_ht->cap); + U64 best_idx = new_hash % leaf_ht->cap; U64 idx = best_idx; do { - retry:; +retry:; LNK_LeafBucket *curr_bucket = leaf_ht->bucket_arr[idx]; if (curr_bucket == 0) { @@ -1388,13 +1388,12 @@ lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInp // another thread took the bucket... goto retry; } - + // advance - idx = (idx + 1) % leaf_ht->cap; + idx = ((idx + 1) == leaf_ht->cap ? 0 : (idx + 1)); } while (idx != best_idx); Assert(is_inserted_or_updated); - return result; } @@ -1403,8 +1402,8 @@ lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_ { LNK_LeafBucket *match = 0; - U128 hash = lnk_hash_from_leaf_ref(hashes, leaf_ref); - U64 best_bucket_idx = u128_mod64(hash, ht->cap); + U64 hash = lnk_hash_from_leaf_ref(hashes, leaf_ref); + U64 best_bucket_idx = hash % ht->cap; U64 bucket_idx = best_bucket_idx; do { @@ -1419,7 +1418,7 @@ lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_ break; } - bucket_idx = (bucket_idx + 1) % ht->cap; + bucket_idx = (bucket_idx + 1) == ht->cap ? 0 : (bucket_idx + 1); } while (bucket_idx != best_bucket_idx); return match; @@ -1500,7 +1499,7 @@ THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_task) Arena *fixed_arena = task->fixed_arenas[worker_id]; CV_DebugT debug_t = task->debug_t_arr[obj_idx]; - U128Array out_hashes = task->hashes->v[LNK_LeafLocType_Internal][obj_idx][CV_TypeIndexSource_TPI]; + U64 *out_hashes = task->hashes->v[LNK_LeafLocType_Internal][obj_idx][CV_TypeIndexSource_TPI]; Rng1U64 ti_ranges[CV_TypeIndexSource_COUNT]; for (U64 ti_source = 0; ti_source < ArrayCount(ti_ranges); ++ti_source) { @@ -1517,15 +1516,15 @@ THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_task) CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); - out_hashes.v[leaf_idx] = lnk_hash_cv_leaf(temp.arena, - task->input, - task->hashes, - LNK_LeafLocType_Internal, - obj_idx, - ti_ranges, - curr_ti, - leaf, - ti_info_list); + out_hashes[leaf_idx] = lnk_hash_cv_leaf(temp.arena, + task->input, + task->hashes, + LNK_LeafLocType_Internal, + obj_idx, + ti_ranges, + curr_ti, + leaf, + ti_info_list); temp_end(temp); } @@ -1589,7 +1588,7 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_internal_task) LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_source]; LNK_LeafRef leaf_ref = lnk_obj_leaf_ref(obj_idx, leaf_idx); - U128 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); + U64 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); if (bucket == 0) { bucket = push_array_no_zero(arena, LNK_LeafBucket, 1); @@ -1616,15 +1615,15 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_external_task) LNK_CodeViewInput *input = task->input; LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[task->dedup_ti_source]; - U128Array hashes = task->hashes->external_hashes[ts_idx][task->dedup_ti_source]; + U64 *hashes = task->hashes->external_hashes[ts_idx][task->dedup_ti_source]; U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][task->dedup_ti_source]); LNK_LeafBucket *bucket = 0; for (U64 leaf_idx = 0; leaf_idx < leaf_count; ++leaf_idx) { - if (!MemoryIsZeroStruct(&hashes.v[leaf_idx])) { // :zero_hash_check + if (hashes[leaf_idx] != 0) { // :zero_hash_check LNK_LeafRef leaf_ref = lnk_ts_leaf_ref(task->dedup_ti_source, ts_idx, leaf_idx); - U128 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); + U64 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); if (bucket == 0) { bucket = push_array_no_zero(arena, LNK_LeafBucket, 1); @@ -2259,19 +2258,17 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) // TPI and IPI leaves in .debug$T are stored in one array (we don't move them // to respective arrays before this point to save on memory move) ProfBegin("Push Internal Hash Arrays"); - hashes->internal_hashes = push_array_no_zero(tp_temp->v[0], U128Array *, input->internal_count); + hashes->internal_hashes = push_array_no_zero(tp_temp->v[0], U64 **, input->internal_count); for (U64 obj_idx = 0; obj_idx < input->internal_count; ++obj_idx) { CV_DebugT debug_t = input->merged_debug_t_p_arr[obj_idx]; - U128Array arr = {0}; - arr.count = debug_t.count; - arr.v = push_array_no_zero(tp_temp->v[0], U128, debug_t.count); + U64 *arr = push_array_no_zero(tp_temp->v[0], U64, debug_t.count); // :debug_zero_hash_assert #if BUILD_DEBUG - MemoryZeroTyped(arr.v, arr.count); + MemoryZeroTyped(arr, debug_t.count); #endif - hashes->internal_hashes[obj_idx] = push_array(tp_temp->v[0], U128Array, CV_TypeIndexSource_COUNT); + hashes->internal_hashes[obj_idx] = push_array(tp_temp->v[0], U64 *, CV_TypeIndexSource_COUNT); for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { hashes->internal_hashes[obj_idx][ti_source] = arr; } @@ -2280,13 +2277,12 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) // push external hash arrays ProfBegin("Push External Hash Arrays"); - hashes->external_hashes = push_array_no_zero(tp_temp->v[0], U128Array *, input->type_server_count); + hashes->external_hashes = push_array_no_zero(tp_temp->v[0], U64 **, input->type_server_count); for (U64 ts_idx = 0; ts_idx < input->type_server_count; ++ts_idx) { - hashes->external_hashes[ts_idx] = push_array_no_zero(tp_temp->v[0], U128Array, CV_TypeIndexSource_COUNT); + hashes->external_hashes[ts_idx] = push_array_no_zero(tp_temp->v[0], U64 *, CV_TypeIndexSource_COUNT); for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); - hashes->external_hashes[ts_idx][ti_source].count = leaf_count; - hashes->external_hashes[ts_idx][ti_source].v = push_array(tp_temp->v[0], U128, leaf_count); // :zero_hash_check + hashes->external_hashes[ts_idx][ti_source] = push_array(tp_temp->v[0], U64, leaf_count); // :zero_hash_check } } ProfEnd(); @@ -2339,7 +2335,7 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) U64 bucket_cap = 0; bucket_cap += internal_per_source_count[ti_source]; bucket_cap += external_per_source_count[ti_source]; - bucket_cap = (U64) ((F64) bucket_cap * 1.3); + bucket_cap = (bucket_cap * 13) / 10; // * 1.3 #if PROFILE_TELEMETRY tmMessage(0, TMMF_ICON_NOTE, "%.*s Bucket Count: %llu", str8_varg(cv_string_from_type_index_source(ti_source)), bucket_cap); @@ -2438,22 +2434,6 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) return types; } -internal U64 -lnk_format_u128(U8 *buf, U64 buf_max, U64 length, U128 v) -{ - U64 size = 0; - if (length > 0 && buf_max > 0) { - if (length <= 8) { - U64 mask = length == 8 ? max_U64 : (1ull << (length*8)) - 1; - size = raddbg_snprintf((char*)buf, buf_max - 1, "%llX", (long long)(v.u64[0] & mask)); - } else { - U64 mask1 = length == 16 ? max_U64 : (1ull << ((length-8)*8)) - 1; - size = raddbg_snprintf((char*)buf, buf_max, "%llX%llX", (long long)(v.u64[1] & mask1), (long long)v.u64[0]); - } - } - return size; -} - internal THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) { @@ -2472,8 +2452,8 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) map = &task->maps[task_id]; } - U64 hash_max_chars = hash_length*2; - U8 temp[128]; + U64 hash_max_chars = hash_length*2; + char temp[128]; for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); @@ -2484,15 +2464,14 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) udt_info.unique_name.size > hash_max_chars && udt_info.name.size > hash_max_chars) { // hash unique name - U128 name_hash; + U64 name_hash; blake3_hasher hasher; blake3_hasher_init(&hasher); blake3_hasher_update(&hasher, udt_info.unique_name.str, udt_info.unique_name.size); blake3_hasher_finalize(&hasher, (U8*)&name_hash, sizeof(name_hash)); // emit hash -> unique name map if (make_map) { - lnk_format_u128(temp, sizeof(temp), hash_length, name_hash); - str8_list_pushf(map_arena, map, "%s %S\n", temp, str8_varg(udt_info.unique_name)); + str8_list_pushf(map_arena, map, "%llx %S\n", name_hash, str8_varg(udt_info.unique_name)); } // parse leaf size @@ -2504,7 +2483,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) B32 is_lambda = colon_pos != 0; if (is_lambda) { - U64 size = lnk_format_u128(temp, sizeof(temp), hash_length, name_hash); + U64 size = raddbg_snprintf(temp, sizeof(temp), "%llx", name_hash); Assert(size < udt_info.name.size); Assert(size < udt_info.unique_name.size); MemoryCopy(udt_info.name.str, temp, size+1); @@ -2522,7 +2501,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) } else { // replace uniuqe type name with hash udt_info.unique_name.str = udt_info.name.str + udt_info.name.size + 1; - udt_info.unique_name.size = lnk_format_u128(udt_info.unique_name.str, udt_info.unique_name.size, hash_length, name_hash); + udt_info.unique_name.size = raddbg_snprintf(udt_info.unique_name.cstr, udt_info.unique_name.size, "%llx", name_hash); // update leaf header CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); @@ -2558,7 +2537,6 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) } U64 hash_max_chars = hash_length*2; - U8 temp[128]; for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); @@ -2575,19 +2553,18 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) } // hash name - U128 name_hash; + U64 name_hash; blake3_hasher hasher; blake3_hasher_init(&hasher); blake3_hasher_update(&hasher, udt_info.name.str, udt_info.name.size); blake3_hasher_finalize(&hasher, (U8*)&name_hash, sizeof(name_hash)); // emit hash -> name map if (make_map) { - lnk_format_u128(temp, sizeof(temp), hash_length, name_hash); - str8_list_pushf(map_arena, map, "%s %.*s\n", temp, str8_varg(name)); + str8_list_pushf(map_arena, map, "%llx %S\n", name_hash, name); } // replace name with hash - udt_info.name.size = lnk_format_u128(udt_info.name.str, udt_info.name.size, hash_length, name_hash); + udt_info.name.size = raddbg_snprintf(udt_info.name.cstr, udt_info.name.size, "%llx", name_hash); // parse struct size CV_NumericParsed dummy; diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 5d93dd36..7b77e4e1 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -112,10 +112,10 @@ typedef struct typedef union { struct { - U128Array **internal_hashes; - U128Array **external_hashes; + U64 ***internal_hashes; + U64 ***external_hashes; }; - U128Array **v[CV_TypeIndexSource_COUNT]; + U64 ***v[CV_TypeIndexSource_COUNT]; } LNK_LeafHashes; // --- Symbol Parsing Tasks ---------------------------------------------------- @@ -512,17 +512,17 @@ internal CV_TypeIndex lnk_ti_lo_from_loc(LNK_CodeViewInput *input, LNK_LeafL internal CV_TypeIndex lnk_ti_lo_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); internal String8 lnk_data_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); internal CV_Leaf lnk_cv_leaf_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); -internal U128 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); +internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); internal LNK_LeafRef lnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, CV_TypeIndexSource ti_source, U64 loc_idx, CV_TypeIndex obj_ti); internal B32 lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); internal B32 lnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); -internal U128 lnk_hash_cv_leaf(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); +internal U64 lnk_hash_cv_leaf(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, String8 data); -internal LNK_LeafBucket * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U128 hash, LNK_LeafBucket *new_bucket); +internal LNK_LeafBucket * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 hash, LNK_LeafBucket *new_bucket); internal LNK_LeafBucket * lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); internal void lnk_cv_debug_t_count_leaves_per_source(TP_Context *tp, U64 count, CV_DebugT *debug_t_arr, U64 *per_source_count_arr); -internal void lnk_hash_debug_t_arr(TP_Context *tp, Arena *arena, U64 obj_count, CV_DebugT *debug_t_arr, U128Array *hash_arr_arr); +internal void lnk_hash_debug_t_arr(TP_Context *tp, Arena *arena, U64 obj_count, CV_DebugT *debug_t_arr, U64 **hash_arr_arr); internal LNK_LeafBucketArray lnk_present_bucket_array_from_leaf_hash_table(TP_Context *tp, Arena *arena, LNK_LeafHashTable *ht); internal void lnk_leaf_bucket_array_sort_radix_subset_parallel(TP_Context *tp, U64 bucket_count, U64 loc_idx_max, LNK_LeafBucket **dst, LNK_LeafBucket **src); internal void lnk_leaf_bucket_array_sort_radix_parallel(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_count, U64 type_server_count); From c4b26184fc232e6bbbf58547406d8d0e696a9bdb Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 12 Feb 2026 13:11:58 -0800 Subject: [PATCH 194/850] type warning fix --- src/base/base_thread_context.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index 12cc3343..b8d87170 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -18,7 +18,7 @@ internal TCTX * tctx_alloc(void) { #if PROFILE_TELEMETRY - thread_static static U8 name[2][1024]; + thread_static static char name[2][1024]; raddbg_snprintf(name[0], sizeof(name[0]), "Scratch/0[TID:%u]", os_tid()); raddbg_snprintf(name[1], sizeof(name[1]), "Scratch/1[TID:%u]", os_tid()); Arena *arena_0 = arena_alloc(.name = name[0]); From f5fc3c66b7894e802b917a4aa84a10192f0f8942 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 13 Feb 2026 15:03:51 -0800 Subject: [PATCH 195/850] reduce leaf hash table bucket size to 8 bytes --- src/linker/lnk_debug_info.c | 867 +++++++++++++++++------------------- src/linker/lnk_debug_info.h | 208 +++------ 2 files changed, 473 insertions(+), 602 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 3d80ea43..6c3f2511 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -807,24 +807,6 @@ lnk_ts_leaf_ref(CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx) return lnk_leaf_ref(ts_idx, leaf_idx); } -internal int -lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b) -{ - int cmp = 0; - if (a.enc_loc_idx < b.enc_loc_idx) { - cmp = -1; - } else if (a.enc_loc_idx > b.enc_loc_idx) { - cmp = +1; - } else { - if (a.enc_leaf_idx < b.enc_leaf_idx) { - cmp = -1; - } else if (a.enc_leaf_idx > b.enc_leaf_idx) { - cmp = +1; - } - } - return cmp; -} - internal int lnk_leaf_ref_is_before(void *raw_a, void *raw_b) { @@ -848,6 +830,24 @@ lnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref) return LNK_LeafLocType_Internal; } +internal int +lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b) +{ + int cmp = 0; + if (a.enc_loc_idx < b.enc_loc_idx) { + cmp = -1; + } else if (a.enc_loc_idx > b.enc_loc_idx) { + cmp = +1; + } else { + if (a.enc_leaf_idx < b.enc_leaf_idx) { + cmp = -1; + } else if (a.enc_leaf_idx > b.enc_leaf_idx) { + cmp = +1; + } + } + return cmp; +} + internal LNK_LeafLocType lnk_loc_type_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx) { @@ -946,15 +946,6 @@ lnk_type_index_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) return type_index; } -internal CV_Leaf -lnk_cv_leaf_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) -{ - String8 raw_leaf = lnk_data_from_leaf_ref(input, leaf_ref); - CV_Leaf leaf; - cv_deserial_leaf(raw_leaf, 0, 1, &leaf); - return leaf; -} - internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref) { @@ -1030,9 +1021,14 @@ lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef U64 b_hash = lnk_hash_from_leaf_ref(hashes, b); if (a_hash == b_hash) { - CV_Leaf a_leaf = lnk_cv_leaf_from_leaf_ref(input, a); - CV_Leaf b_leaf = lnk_cv_leaf_from_leaf_ref(input, b); + CV_Leaf a_leaf; + cv_deserial_leaf(lnk_data_from_leaf_ref(input, a), 0, 1, &a_leaf); + + CV_Leaf b_leaf; + cv_deserial_leaf(lnk_data_from_leaf_ref(input, b), 0, 1, &b_leaf); + Assert(a_leaf.kind == b_leaf.kind); + #if 0 { Temp scratch = scratch_begin(0,0); @@ -1047,12 +1043,14 @@ lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef scratch_end(scratch); } #endif + are_same = 1; } return are_same; } +#if 0 internal B32 lnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b) { @@ -1129,6 +1127,7 @@ skip_type_index_compare:; return are_equal; } +#endif internal U64 lnk_hash_cv_leaf(Arena *arena, @@ -1338,21 +1337,21 @@ lnk_hash_cv_leaf_deep(Arena *arena, temp_end(temp); } -internal LNK_LeafBucket * -lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 new_hash, LNK_LeafBucket *new_bucket) +internal LNK_LeafRef * +lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 new_hash, LNK_LeafRef *new_bucket) { - LNK_LeafBucket *result = 0; - B32 is_inserted_or_updated = 0; + LNK_LeafRef *result = 0; + B32 is_inserted_or_updated = 0; U64 best_idx = new_hash % leaf_ht->cap; U64 idx = best_idx; do { retry:; - LNK_LeafBucket *curr_bucket = leaf_ht->bucket_arr[idx]; + LNK_LeafRef *curr_bucket = leaf_ht->bucket_arr[idx]; if (curr_bucket == 0) { - LNK_LeafBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket); + LNK_LeafRef *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket); if (compare_bucket == curr_bucket) { // success, bucket was inserted @@ -1362,8 +1361,8 @@ retry:; // another thread took the bucket... goto retry; - } else if (lnk_match_leaf_ref(input, hashes, curr_bucket->leaf_ref, new_bucket->leaf_ref)) { - int leaf_cmp = lnk_leaf_ref_compare(curr_bucket->leaf_ref, new_bucket->leaf_ref); + } else if (lnk_match_leaf_ref(input, hashes, *curr_bucket, *new_bucket)) { + int leaf_cmp = lnk_leaf_ref_compare(*curr_bucket, *new_bucket); if (leaf_cmp <= 0) { // are we inserting bucket that was already inserterd? @@ -1377,7 +1376,7 @@ retry:; break; } - LNK_LeafBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket); + LNK_LeafRef *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket); if (compare_bucket == curr_bucket) { result = compare_bucket; @@ -1397,23 +1396,20 @@ retry:; return result; } -internal LNK_LeafBucket * +internal LNK_LeafRef * lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref) { - LNK_LeafBucket *match = 0; + LNK_LeafRef *match = 0; - U64 hash = lnk_hash_from_leaf_ref(hashes, leaf_ref); - U64 best_bucket_idx = hash % ht->cap; - U64 bucket_idx = best_bucket_idx; + U64 hash = lnk_hash_from_leaf_ref(hashes, leaf_ref); + U64 best_bucket_idx = hash % ht->cap; + U64 bucket_idx = best_bucket_idx; do { - LNK_LeafBucket *bucket = ht->bucket_arr[bucket_idx]; + LNK_LeafRef *bucket = ht->bucket_arr[bucket_idx]; + if (bucket == 0) { break; } - if (bucket == 0) { - break; - } - - if (lnk_match_leaf_ref(input, hashes, bucket->leaf_ref, leaf_ref)) { + if (lnk_match_leaf_ref(input, hashes, *bucket, leaf_ref)) { match = bucket; break; } @@ -1429,63 +1425,22 @@ THREAD_POOL_TASK_FUNC(lnk_count_per_source_leaf_task) { ProfBeginFunction(); - LNK_CountPerSourceLeafTask *task = raw_task; - LNK_LeafRangeList leaf_range_list = task->leaf_ranges_per_task[task_id]; + LNK_CvImportTypes *task = raw_task; - for (LNK_LeafRange *leaf_range = leaf_range_list.first; leaf_range != 0; leaf_range = leaf_range->next) { + U64 counts[CV_TypeIndexSource_COUNT] = {0}; + for EachNode(leaf_range, LNK_LeafRange, task->leaf_ranges_per_task[task_id].first) { CV_DebugT debug_t = *leaf_range->debug_t; - for (U64 leaf_idx = leaf_range->range.min; leaf_idx < leaf_range->range.max; ++leaf_idx) { + for EachInRange(leaf_idx, leaf_range->range) { CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(leaf_header->kind); - task->count_arr_arr[leaf_source][task_id] += 1; + counts[leaf_source] += 1; } } - ProfEnd(); -} - -internal void -lnk_cv_debug_t_count_leaves_per_source(TP_Context *tp, U64 count, CV_DebugT *debug_t_arr, U64 per_source_count_arr[CV_TypeIndexSource_COUNT]) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - ProfBegin("Compute Per Task Ranges"); - U64 per_task_leaf_count = 10000; - LNK_LeafRangeList *leaf_ranges_per_task = push_array(scratch.arena, LNK_LeafRangeList, tp->worker_count); - for (U64 i = 0, task_weight = 0, task_id = 0; i < count; ++i) { - CV_DebugT *debug_t = &debug_t_arr[i]; - for (U64 k = 0; k < debug_t->count; k += per_task_leaf_count) { - U64 cap = per_task_leaf_count - task_weight; - - LNK_LeafRange *leaf_range = push_array(scratch.arena, LNK_LeafRange, 1); - leaf_range->range = rng_1u64(k, Min(k + cap, debug_t->count)); - leaf_range->debug_t = debug_t; - - LNK_LeafRangeList *list = &leaf_ranges_per_task[task_id]; - SLLQueuePush(list->first, list->last, leaf_range); - ++list->count; - - task_weight += dim_1u64(leaf_range->range); - if (task_weight >= per_task_leaf_count) { - task_id = (task_id + 1) % tp->worker_count; - task_weight = 0; - } - } - } - ProfEnd(); - - - LNK_CountPerSourceLeafTask task; - task.leaf_ranges_per_task = leaf_ranges_per_task; - task.count_arr_arr = push_matrix_u64(scratch.arena, CV_TypeIndexSource_COUNT, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, lnk_count_per_source_leaf_task, &task); - - for (U64 i = 0; i < CV_TypeIndexSource_COUNT; ++i) { - per_source_count_arr[i] += sum_array_u64(tp->worker_count, task.count_arr_arr[i]); + for EachElement(i, counts) { + ins_atomic_u64_add_eval(&task->internal_per_source_count[i], counts[i]); } - scratch_end(scratch); ProfEnd(); } @@ -1494,19 +1449,19 @@ THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_task) { ProfBeginFunction(); - U64 obj_idx = task_id; - LNK_LeafHasherTask *task = raw_task; + U64 obj_idx = task_id; + LNK_CvImportTypes *task = raw_task; Arena *fixed_arena = task->fixed_arenas[worker_id]; CV_DebugT debug_t = task->debug_t_arr[obj_idx]; U64 *out_hashes = task->hashes->v[LNK_LeafLocType_Internal][obj_idx][CV_TypeIndexSource_TPI]; Rng1U64 ti_ranges[CV_TypeIndexSource_COUNT]; - for (U64 ti_source = 0; ti_source < ArrayCount(ti_ranges); ++ti_source) { + for EachElement(ti_source, ti_ranges) { ti_ranges[ti_source] = rng_1u64(task->input->pch_arr[obj_idx].ti_lo, task->input->pch_arr[obj_idx].ti_hi + debug_t.count); } - for (U64 leaf_idx = 0; leaf_idx < debug_t.count; ++leaf_idx) { + for EachIndex(leaf_idx, debug_t.count) { Temp temp = temp_begin(fixed_arena); // :debug_zero_hash_assert make sure we don't write same hash more than once @@ -1537,8 +1492,8 @@ THREAD_POOL_TASK_FUNC(lnk_hash_type_server_leaves_task) { ProfBeginFunction(); - LNK_LeafHasherTask *task = raw_task; - U64 obj_idx = task_id; + LNK_CvImportTypes *task = raw_task; + U64 obj_idx = task_id; LNK_CodeViewInput *input = task->input; LNK_LeafHashes *hashes = task->hashes; @@ -1550,9 +1505,9 @@ THREAD_POOL_TASK_FUNC(lnk_hash_type_server_leaves_task) Rng1U64 *ti_ranges = input->external_ti_ranges[ts_idx]; // hash leaves referenced in symbols - for (U64 i = 0; i < parsed_symbols.count; ++i) { + for EachIndex(i, parsed_symbols.count) { CV_SymbolList symbol_list = parsed_symbols.v[i]; - for (CV_SymbolNode *symnode = symbol_list.first; symnode != 0; symnode = symnode->next) { + for EachNode(symnode, CV_SymbolNode, symbol_list.first) { Temp temp = temp_begin(task->fixed_arenas[worker_id]); CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, symnode->data.kind, symnode->data.data); lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, hashes, LNK_LeafLocType_External, ts_idx, ti_info_list, symnode->data.data); @@ -1562,7 +1517,7 @@ THREAD_POOL_TASK_FUNC(lnk_hash_type_server_leaves_task) // hash leaves referenced in inlinees String8List inline_data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines); - for (String8Node *inline_data_node = inline_data_list.first; inline_data_node != 0; inline_data_node = inline_data_node->next) { + for EachNode(inline_data_node, String8Node, inline_data_list.first) { Temp temp = temp_begin(task->fixed_arenas[worker_id]); CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_node->string); lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, hashes, LNK_LeafLocType_External, ts_idx, ti_info_list, inline_data_node->string); @@ -1575,14 +1530,14 @@ THREAD_POOL_TASK_FUNC(lnk_hash_type_server_leaves_task) internal THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_internal_task) { - LNK_LeafDedupInternal *task = raw_task; - U64 obj_idx = task_id; - CV_DebugT debug_t = task->debug_t_arr[obj_idx]; + LNK_CvImportTypes *task = raw_task; + U64 obj_idx = task_id; + CV_DebugT debug_t = task->debug_t_arr[obj_idx]; ProfBeginDynamic("Leaf Dedup Task 0x%X [Leaf Count %u]", obj_idx, task->debug_t_arr[obj_idx].count); - LNK_LeafBucket *bucket = 0; - for (U64 leaf_idx = 0; leaf_idx < debug_t.count; ++leaf_idx) { + LNK_LeafRef *bucket = 0; + for EachIndex(leaf_idx, debug_t.count) { CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); CV_TypeIndexSource ti_source = cv_type_index_source_from_leaf_kind(leaf_header->kind); LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_source]; @@ -1591,11 +1546,11 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_internal_task) U64 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); if (bucket == 0) { - bucket = push_array_no_zero(arena, LNK_LeafBucket, 1); + bucket = push_array_no_zero(arena, LNK_LeafRef, 1); } - bucket->leaf_ref = leaf_ref; + *bucket = leaf_ref; - LNK_LeafBucket *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket); + LNK_LeafRef *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket); if (inserted_or_updated != bucket) { bucket = 0; @@ -1610,27 +1565,27 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_external_task) { ProfBeginFunction(); - LNK_LeafDedupExternal *task = raw_task; - U64 ts_idx = task_id; + LNK_CvImportTypes *task = raw_task; + U64 ts_idx = task_id; LNK_CodeViewInput *input = task->input; - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[task->dedup_ti_source]; - U64 *hashes = task->hashes->external_hashes[ts_idx][task->dedup_ti_source]; - U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][task->dedup_ti_source]); + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[task->ti_source]; + U64 *hashes = task->hashes->external_hashes[ts_idx][task->ti_source]; + U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][task->ti_source]); - LNK_LeafBucket *bucket = 0; + LNK_LeafRef *bucket = 0; - for (U64 leaf_idx = 0; leaf_idx < leaf_count; ++leaf_idx) { + for EachIndex(leaf_idx, leaf_count) { if (hashes[leaf_idx] != 0) { // :zero_hash_check - LNK_LeafRef leaf_ref = lnk_ts_leaf_ref(task->dedup_ti_source, ts_idx, leaf_idx); + LNK_LeafRef leaf_ref = lnk_ts_leaf_ref(task->ti_source, ts_idx, leaf_idx); U64 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); if (bucket == 0) { - bucket = push_array_no_zero(arena, LNK_LeafBucket, 1); + bucket = push_array_no_zero(arena, LNK_LeafRef, 1); } - bucket->leaf_ref = leaf_ref; + *bucket = leaf_ref; - LNK_LeafBucket *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket); + LNK_LeafRef *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket); if (inserted_or_updated != bucket) { bucket = 0; @@ -1645,12 +1600,16 @@ internal THREAD_POOL_TASK_FUNC(lnk_count_present_buckets_task) { ProfBeginFunction(); - LNK_GetPresentBucketsTask *task = raw_task; - for (U64 bucket_idx = task->range_arr[task_id].min; bucket_idx < task->range_arr[task_id].max; ++bucket_idx) { - if (task->ht->bucket_arr[bucket_idx] != 0) { - task->count_arr[task_id] += 1; + + LNK_CvImportTypes *task = raw_task; + LNK_LeafHashTable *ht = &task->leaf_ht_arr[task->ti_source]; + + for EachInRange(bucket_idx, task->ranges[task_id]) { + if (ht->bucket_arr[bucket_idx] != 0) { + task->counts[task->ti_source][task_id] += 1; } } + ProfEnd(); } @@ -1659,46 +1618,21 @@ THREAD_POOL_TASK_FUNC(lnk_get_present_buckets_task) { ProfBeginFunction(); - LNK_GetPresentBucketsTask *task = raw_task; + LNK_CvImportTypes *task = raw_task; - Rng1U64 range = task->range_arr[task_id]; - U64 cursor = task->offset_arr[task_id]; - LNK_LeafHashTable *ht = task->ht; + U64 cursor = task->offsets[task->ti_source][task_id]; + LNK_LeafHashTable *ht = &task->leaf_ht_arr[task->ti_source]; + LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[task->ti_source]; - for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) { + for EachInRange(bucket_idx, task->ranges[task_id]) { if (ht->bucket_arr[bucket_idx]) { - task->result.v[cursor++] = ht->bucket_arr[bucket_idx]; + unique_leaf_refs.v[cursor++] = ht->bucket_arr[bucket_idx]; } } ProfEnd(); } -internal LNK_LeafBucketArray -lnk_present_bucket_array_from_leaf_hash_table(TP_Context *tp, Arena *arena, LNK_LeafHashTable *ht) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - LNK_GetPresentBucketsTask task = {0}; - task.ht = ht; - task.count_arr = push_array(scratch.arena, U64, tp->worker_count); - task.range_arr = tp_divide_work(scratch.arena, ht->cap, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, lnk_count_present_buckets_task, &task); - - LNK_LeafBucketArray result; - result.count = sum_array_u64(tp->worker_count, task.count_arr); - result.v = push_array_no_zero(arena, LNK_LeafBucket *, result.count); - - task.result = result; - task.offset_arr = offsets_from_counts_array_u64(scratch.arena, task.count_arr, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, lnk_get_present_buckets_task, &task); - - scratch_end(scratch); - ProfEnd(); - return result; -} - internal THREAD_POOL_TASK_FUNC(lnk_leaf_ref_histo_task) { @@ -1717,46 +1651,46 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_ref_histo_task) switch (task->pass_idx) { case 0: { for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 leaf_digit0 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 10, 0); + LNK_LeafRef *bucket = task->src[i]; + U64 leaf_digit0 = BitExtract(bucket->enc_leaf_idx, 10, 0); ++counts_ptr[leaf_digit0]; } } break; case 1: { for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 leaf_digit1 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 10); + LNK_LeafRef *bucket = task->src[i]; + U64 leaf_digit1 = BitExtract(bucket->enc_leaf_idx, 11, 10); ++counts_ptr[leaf_digit1]; } } break; case 2: { for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 leaf_digit2 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag + LNK_LeafRef *bucket = task->src[i]; + U64 leaf_digit2 = BitExtract(bucket->enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag ++counts_ptr[leaf_digit2]; } } break; case 3: { for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 digit0 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_0, 0); + LNK_LeafRef *bucket = task->src[i]; + U64 digit0 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_0, 0); ++counts_ptr[digit0]; } } break; case 4: { for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 digit1 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0); + LNK_LeafRef *bucket = task->src[i]; + U64 digit1 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0); ++counts_ptr[digit1]; } } break; case 5: { for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 digit2 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1); + LNK_LeafRef *bucket = task->src[i]; + U64 digit2 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1); - U64 loc_bit = !!(bucket->leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal); + U64 loc_bit = !!(bucket->enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal); digit2 |= loc_bit << loc_idx_bit_count_2; ++counts_ptr[digit2]; @@ -1787,8 +1721,8 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) case 0: { ProfBegin("Leaf Sort Low"); for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 leaf_digit0 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 10, 0); + LNK_LeafRef *bucket = task->src[i]; + U64 leaf_digit0 = BitExtract(bucket->enc_leaf_idx, 10, 0); task->dst[counts_ptr[leaf_digit0]++] = bucket; } ProfEnd(); @@ -1796,8 +1730,8 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) case 1: { ProfBegin("Leaf Sort Mid"); for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 leaf_digit1 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 10); + LNK_LeafRef *bucket = task->src[i]; + U64 leaf_digit1 = BitExtract(bucket->enc_leaf_idx, 11, 10); task->dst[counts_ptr[leaf_digit1]++] = bucket; } ProfEnd(); @@ -1805,8 +1739,8 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) case 2: { ProfBegin("Leaf Sort High"); for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 leaf_digit2 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag + LNK_LeafRef *bucket = task->src[i]; + U64 leaf_digit2 = BitExtract(bucket->enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag task->dst[counts_ptr[leaf_digit2]++] = bucket; } ProfEnd(); @@ -1818,8 +1752,8 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) case 3: { ProfBegin("Loc Sort Low"); for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 digit0 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_0, 0); + LNK_LeafRef *bucket = task->src[i]; + U64 digit0 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_0, 0); task->dst[counts_ptr[digit0]++] = bucket; } ProfEnd(); @@ -1827,8 +1761,8 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) case 4: { ProfBegin("Loc Sort Mid"); for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 digit1 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0); + LNK_LeafRef *bucket = task->src[i]; + U64 digit1 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0); task->dst[counts_ptr[digit1]++] = bucket; } ProfEnd(); @@ -1836,10 +1770,10 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) case 5: { ProfBegin("Loc Sort High"); for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->src[i]; - U64 digit2 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1); + LNK_LeafRef *bucket = task->src[i]; + U64 digit2 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1); - U64 loc_bit = !!(bucket->leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal); + U64 loc_bit = !!(bucket->enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal); digit2 |= loc_bit << loc_idx_bit_count_2; Assert(counts_ptr[digit2] != max_U32); @@ -1855,7 +1789,7 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) } internal void -lnk_leaf_bucket_array_sort(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_count, U64 type_server_count) +lnk_leaf_ref_array_sort(TP_Context *tp, LNK_LeafRefArray arr, U64 obj_count, U64 type_server_count) { Temp scratch = scratch_begin(0,0); @@ -1878,7 +1812,7 @@ lnk_leaf_bucket_array_sort(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_coun task.counts_max = (1 << 11); task.loc_idx_max = arr.count; task.ranges = tp_divide_work(scratch.arena, arr.count, tp->worker_count); - task.dst = push_array_no_zero(scratch.arena, LNK_LeafBucket *, arr.count); + task.dst = push_array_no_zero(scratch.arena, LNK_LeafRef *, arr.count); task.src = arr.v; ProfBegin("Push Counts"); @@ -1920,7 +1854,7 @@ lnk_leaf_bucket_array_sort(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_coun ProfBegin("Sort"); tp_for_parallel(tp, 0, tp->worker_count, lnk_loc_idx_radix_sort_task, &task); - Swap(LNK_LeafBucket **, task.src, task.dst); + Swap(LNK_LeafRef **, task.src, task.dst); ProfEnd(); ProfEnd(); @@ -1953,123 +1887,150 @@ lnk_leaf_bucket_array_sort(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_coun internal THREAD_POOL_TASK_FUNC(lnk_assign_type_indices_task) { - LNK_AssignTypeIndicesTask *task = raw_task; - Rng1U64 range = task->range_arr[task_id]; - for (U64 i = range.min; i < range.max; ++i) { - LNK_LeafBucket *bucket = task->bucket_arr.v[i]; - bucket->type_index = task->min_type_index + i; + LNK_CvImportTypes *task = raw_task; + + CV_TypeIndexSource ti_source = task->ti_source; + LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_source]; + CV_TypeIndex min_type_index = task->min_type_indices[ti_source]; + U64 assigned_type_cap = task->assigned_type_caps[ti_source]; + CV_TypeIndex *assigned_type_ht = task->assigned_type_hts[ti_source]; + + for EachInRange(i, task->ranges[task_id]) { + LNK_LeafRef *leaf_ref = unique_leaf_refs.v[i]; + CV_TypeIndex type_index = min_type_index + i; + + U64 hash = u64_hash_from_str8(str8_struct(&leaf_ref)); + U64 best_idx = hash % assigned_type_cap; + U64 idx = best_idx; + + B32 is_inserted = 0; + do { + CV_TypeIndex curr_type_index = assigned_type_ht[idx]; + if (curr_type_index == 0) { + CV_TypeIndex cmp_type_index = ins_atomic_u32_eval_cond_assign(&assigned_type_ht[idx], type_index, curr_type_index); + if (cmp_type_index == curr_type_index) { + is_inserted = 1; + break; + } + } + // advance + idx = (idx + 1) == assigned_type_cap ? 0 : (idx + 1); + } while (idx != best_idx); + Assert(is_inserted); } } -internal void -lnk_assign_type_indices(TP_Context *tp, LNK_LeafBucketArray bucket_arr, CV_TypeIndex min_type_index) +internal CV_TypeIndex +lnk_assigned_type_ht_search(U64 cap, CV_TypeIndex *ht, CV_TypeIndex min_type_index, LNK_LeafRefArray unique_leaf_refs, LNK_LeafRef *v, U64 hash) { - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); + U64 best_idx = hash % cap; + U64 idx = best_idx; + do { + CV_TypeIndex type_index = ht[idx]; + if (type_index < min_type_index) { break; } - LNK_AssignTypeIndicesTask task; - task.range_arr = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count); - task.bucket_arr = bucket_arr; - task.min_type_index = min_type_index; - tp_for_parallel(tp, 0, tp->worker_count, lnk_assign_type_indices_task, &task); + U64 leaf_idx = type_index - min_type_index; + LNK_LeafRef *compar = unique_leaf_refs.v[leaf_idx]; + if (compar == v) { return type_index; } + + idx = (idx + 1) == cap ? 0 : (idx + 1); + } while(idx != best_idx); - ProfEnd(); - scratch_end(scratch); + InvalidPath; + return 0; } internal -THREAD_POOL_TASK_FUNC(lnk_patch_symbols_task) +THREAD_POOL_TASK_FUNC(lnk_cv_patcher_symbols_task) { ProfBeginFunction(); - LNK_PatchSymbolTypesTask *task = raw_task; - Arena *fixed_arena = task->arena_arr[task_id]; + LNK_CvImportTypes *task = raw_task; for EachInRange(symbol_input_idx, task->ranges[task_id]) { LNK_CodeViewSymbolsInput symbol_input = task->input->symbol_inputs[symbol_input_idx]; LNK_LeafLocType loc_type = lnk_loc_type_from_obj_idx(task->input, symbol_input.obj_idx); - U64 loc_idx = lnk_loc_idx_from_obj_idx(task->input, symbol_input.obj_idx); + U64 loc_idx = lnk_loc_idx_from_obj_idx (task->input, symbol_input.obj_idx); - CV_TypeIndex ti_lo_arr[CV_TypeIndexSource_COUNT]; - ti_lo_arr[CV_TypeIndexSource_NULL] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_NULL); - ti_lo_arr[CV_TypeIndexSource_TPI ] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_TPI); - ti_lo_arr[CV_TypeIndexSource_IPI ] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_IPI); + CV_TypeIndex ti_lo_arr[CV_TypeIndexSource_COUNT] = {0}; + for EachElement(ti_source, ti_lo_arr) { ti_lo_arr[ti_source] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, ti_source); } - for (CV_SymbolNode *symnode = symbol_input.symbol_list->first; symnode != 0; symnode = symnode->next) { - Temp temp = temp_begin(fixed_arena); + for EachNode(symbol_n, CV_SymbolNode, symbol_input.symbol_list->first) { + Temp temp = temp_begin(task->fixed_arenas[task_id]); // find type index offsets in symbol - CV_TypeIndexInfoList ti_list = cv_get_symbol_type_index_offsets(temp.arena, symnode->data.kind, symnode->data.data); + CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, symbol_n->data.kind, symbol_n->data.data); // overwrite type indices in symbol - for (CV_TypeIndexInfo *ti_info = ti_list.first; ti_info != 0; ti_info = ti_info->next) { - CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (symnode->data.data.str + ti_info->offset); - if (*ti_ptr >= ti_lo_arr[ti_info->source]) { - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); - LNK_LeafBucket *leaf_bucket = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); + for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { + CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(symbol_n->data.data.str + ti_info->offset); - // we overwrite section memory directly - *ti_ptr = leaf_bucket->type_index; - } + // skip simple type indices + if (*ti_ptr < ti_lo_arr[ti_info->source]) { continue; } + + U64 assigned_types_cap = task->assigned_type_caps[ti_info->source]; + CV_TypeIndex *assigned_types_ht = task->assigned_type_hts[ti_info->source]; + CV_TypeIndex min_type_index = task->min_type_indices[ti_info->source]; + LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + + // find unique leaf refernece + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); + U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); + + CV_TypeIndex type_index = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); + + // we overwrite section memory directly + *ti_ptr = type_index; } temp_end(temp); } } - ProfEnd(); -} -internal void -lnk_patch_symbols(TP_Context *tp, - LNK_CodeViewInput *input, - LNK_LeafHashes *hashes, - LNK_LeafHashTable *leaf_ht_arr) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex)); - - LNK_PatchSymbolTypesTask task = {0}; - task.ranges = tp_divide_work(scratch.arena, input->total_symbol_input_count, tp->worker_count); - task.input = input; - task.hashes = hashes; - task.leaf_ht_arr = leaf_ht_arr; - task.arena_arr = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_ti_list_size, max_ti_list_size); - tp_for_parallel(tp, 0, tp->worker_count, lnk_patch_symbols_task, &task); - - scratch_end(scratch); ProfEnd(); } internal -THREAD_POOL_TASK_FUNC(lnk_patch_inlines_task) +THREAD_POOL_TASK_FUNC(lnk_cv_patcher_inlines_task) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - LNK_PatchInlinesTask *task = raw_task; + LNK_CvImportTypes *task = raw_task; U64 loc_idx = lnk_loc_idx_from_obj_idx(task->input, task_id); LNK_LeafLocType loc_type = lnk_loc_type_from_obj_idx(task->input, task_id); String8List inline_data_list = cv_sub_section_from_debug_s(task->debug_s_arr[task_id], CV_C13SubSectionKind_InlineeLines); - for (String8Node *inline_data_node = inline_data_list.first; inline_data_node != 0; inline_data_node = inline_data_node->next) { - Temp temp = temp_begin(scratch.arena); + for EachNode(inline_data_node, String8Node, inline_data_list.first) { + Temp temp = temp_begin(task->fixed_arenas[worker_id]); // get indices offsets CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_node->string); - for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) { - CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (inline_data_node->string.str + ti_info->offset); + for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { + CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(inline_data_node->string.str + ti_info->offset); CV_TypeIndex ti_lo = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, ti_info->source); - if (*ti_ptr >= ti_lo) { - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); - LNK_LeafBucket *leaf_bucket = lnk_leaf_hash_table_search(&task->leaf_ht_arr[ti_info->source], task->input, task->hashes, leaf_ref); - - // patch index - *ti_ptr = leaf_bucket->type_index; - } + + // skip simple type indices + if (*ti_ptr < ti_lo) { continue; } + + U64 assigned_types_cap = task->assigned_type_caps[ti_info->source]; + CV_TypeIndex *assigned_types_ht = task->assigned_type_hts[ti_info->source]; + CV_TypeIndex min_type_index = task->min_type_indices[ti_info->source]; + LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + + // find unique leaf refernece + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); + U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); + + CV_TypeIndex type_index = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); + + // patch index + *ti_ptr = type_index; } temp_end(temp); @@ -2079,57 +2040,48 @@ THREAD_POOL_TASK_FUNC(lnk_patch_inlines_task) ProfEnd(); } -internal void -lnk_patch_inlines(TP_Context *tp, - LNK_CodeViewInput *input, - LNK_LeafHashes *hashes, - LNK_LeafHashTable *leaf_ht_arr, - U64 obj_count, - CV_DebugS *debug_s_arr) -{ - ProfBeginFunction(); - - LNK_PatchInlinesTask task = {0}; - task.input = input; - task.hashes = hashes; - task.leaf_ht_arr = leaf_ht_arr; - task.debug_s_arr = debug_s_arr; - tp_for_parallel(tp, 0, obj_count, lnk_patch_inlines_task, &task); - - ProfEnd(); -} - internal -THREAD_POOL_TASK_FUNC(lnk_patch_leaves_task) +THREAD_POOL_TASK_FUNC(lnk_cv_patcher_leaves_task) { ProfBeginFunction(); + LNK_CvImportTypes *task = raw_task; - LNK_PatchLeavesTask *task = raw_task; - Rng1U64 range = task->range_arr[task_id]; + for EachInRange(leaf_ref_idx, task->ranges[task_id]) { + Temp temp = temp_begin(task->fixed_arenas[task_id]); - for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) { - Temp temp = temp_begin(task->fixed_arena_arr[task_id]); + LNK_LeafRef *patch = task->unique_leaf_refs_arr[task->ti_source].v[leaf_ref_idx]; - LNK_LeafBucket *bucket = task->bucket_arr[bucket_idx]; - - U64 loc_idx = bucket->leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; - LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(bucket->leaf_ref); - CV_TypeIndex ti_lo = lnk_ti_lo_from_leaf_ref(task->input, bucket->leaf_ref); - String8 raw_leaf = lnk_data_from_leaf_ref(task->input, bucket->leaf_ref); + // patch leaf ref -> leaf record + U64 loc_idx = patch->enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; + LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(*patch); + CV_TypeIndex ti_lo = lnk_ti_lo_from_leaf_ref(task->input, *patch); + String8 raw_leaf = lnk_data_from_leaf_ref(task->input, *patch); CV_Leaf leaf = cv_leaf_from_string(raw_leaf); // get type indices offsets CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); - for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) { - CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (leaf.data.str + ti_info->offset); - if (*ti_ptr >= ti_lo) { - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; - LNK_LeafRef sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); - LNK_LeafBucket *sub_leaf_bucket = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, sub_leaf_ref); - // patch index - *ti_ptr = sub_leaf_bucket->type_index; - } + for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { + CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(leaf.data.str + ti_info->offset); + + // skip simple type indices + if (*ti_ptr < ti_lo) { continue; } + + U64 assigned_types_cap = task->assigned_type_caps[ti_info->source]; + CV_TypeIndex *assigned_types_ht = task->assigned_type_hts[ti_info->source]; + CV_TypeIndex min_type_index = task->min_type_indices[ti_info->source]; + LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + + // find unique leaf refernece + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); + U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); + + CV_TypeIndex type_index = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); + + // patch index + *ti_ptr = type_index; } temp_end(temp); @@ -2138,73 +2090,32 @@ THREAD_POOL_TASK_FUNC(lnk_patch_leaves_task) ProfEnd(); } -internal void -lnk_patch_leaves(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, LNK_LeafBucketArray bucket_arr) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - LNK_PatchLeavesTask task; - task.input = input; - task.hashes = hashes; - task.leaf_ht_arr = leaf_ht_arr; - task.bucket_arr = bucket_arr.v; - task.range_arr = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count); - task.fixed_arena_arr = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, MB(1), MB(1)); - tp_for_parallel(tp, 0, tp->worker_count, lnk_patch_leaves_task, &task); - - scratch_end(scratch); - ProfEnd(); -} - internal THREAD_POOL_TASK_FUNC(lnk_unbucket_raw_leaves_task) { - LNK_UnbucketRawLeavesTask *task = raw_task; - Rng1U64 range = task->range_arr[task_id]; - for (U64 i = range.min; i < range.max; ++i) { - String8 raw_leaf = lnk_data_from_leaf_ref(task->input, task->bucket_arr[i]->leaf_ref); - task->raw_leaf_arr[i] = raw_leaf.str; + LNK_CvImportTypes *task = raw_task; + for EachInRange(i, task->ranges[task_id]) { + task->types[task->ti_source].v[i] = lnk_data_from_leaf_ref(task->input, *task->unique_leaf_refs_arr[task->ti_source].v[i]).str; } } -internal CV_DebugT -lnk_unbucket_leaf_array(TP_Context *tp, Arena *arena, LNK_CodeViewInput *input, LNK_LeafBucketArray bucket_arr) -{ - ProfBeginDynamic("Unbucket Leaves [Count %llu]", bucket_arr.count); - Temp scratch = scratch_begin(&arena, 1); - - LNK_UnbucketRawLeavesTask task = {0}; - task.input = input; - task.bucket_arr = bucket_arr.v; - task.raw_leaf_arr = push_array_no_zero(arena, U8 *, bucket_arr.count); - task.range_arr = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task); - - CV_DebugT debug_t = {0}; - debug_t.count = bucket_arr.count; - debug_t.v = task.raw_leaf_arr; - - scratch_end(scratch); - ProfEnd(); - return debug_t; -} - internal THREAD_POOL_TASK_FUNC(lnk_post_process_cv_symbols_task) { - LNK_PostProcessCvSymbolsTask *task = raw_task; - LNK_CodeViewSymbolsInput symbol_input = task->symbol_inputs[task_id]; + LNK_CvImportTypes *task = raw_task; - for (CV_SymbolNode *symnode = symbol_input.symbol_list->first; symnode != 0; symnode = symnode->next) { + CV_DebugT ipi_types = task->types[CV_TypeIndexSource_IPI]; + CV_TypeIndex ipi_min_type_index = task->min_type_indices[CV_TypeIndexSource_IPI]; + + for EachNode(symnode, CV_SymbolNode, task->input->symbol_inputs[task_id].symbol_list->first) { CV_Symbol *symbol = &symnode->data; if (symbol->kind == CV_SymKind_LPROC32_ID || symbol->kind == CV_SymKind_GPROC32_ID || symbol->kind == CV_SymKind_LPROC32_DPC) { CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol->data.str; - if (proc32->itype >= task->ipi_min_type_index) { - if ((proc32->itype - task->ipi_min_type_index) < task->ipi_types.count) { - U64 leaf_idx = proc32->itype - task->ipi_min_type_index; - CV_Leaf leaf = cv_debug_t_get_leaf(task->ipi_types, leaf_idx); + if (proc32->itype >= ipi_min_type_index) { + if ((proc32->itype - ipi_min_type_index) < ipi_types.count) { + U64 leaf_idx = proc32->itype - ipi_min_type_index; + CV_Leaf leaf = cv_debug_t_get_leaf(ipi_types, leaf_idx); if (leaf.kind == CV_LeafKind_FUNC_ID) { if (leaf.data.size >= sizeof(CV_LeafFuncId)) { @@ -2247,191 +2158,217 @@ internal CV_DebugT * lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) { ProfBegin("Import Types"); + Temp scratch = scratch_begin(tp_temp->v, tp_temp->count); + + U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex)); + Arena **fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_ti_list_size, max_ti_list_size); + + LNK_CvImportTypes task = {0}; + task.input = input; + task.hashes = push_array(scratch.arena, LNK_LeafHashes, 1); + task.fixed_arenas = fixed_arenas; ProfBegin("Hash Leaves"); - LNK_LeafHashes *hashes = push_array(tp_temp->v[0], LNK_LeafHashes, 1); { - Temp scratch = scratch_begin(tp_temp->v, tp_temp->count); - // push internal hash arrays // // TPI and IPI leaves in .debug$T are stored in one array (we don't move them // to respective arrays before this point to save on memory move) ProfBegin("Push Internal Hash Arrays"); - hashes->internal_hashes = push_array_no_zero(tp_temp->v[0], U64 **, input->internal_count); - for (U64 obj_idx = 0; obj_idx < input->internal_count; ++obj_idx) { + task.hashes->internal_hashes = push_array_no_zero(scratch.arena, U64 **, input->internal_count); + for EachIndex(obj_idx, input->internal_count) { CV_DebugT debug_t = input->merged_debug_t_p_arr[obj_idx]; - U64 *arr = push_array_no_zero(tp_temp->v[0], U64, debug_t.count); - // :debug_zero_hash_assert -#if BUILD_DEBUG - MemoryZeroTyped(arr, debug_t.count); -#endif + U64 *arr = push_array_no_zero(scratch.arena, U64, debug_t.count); - hashes->internal_hashes[obj_idx] = push_array(tp_temp->v[0], U64 *, CV_TypeIndexSource_COUNT); - for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { - hashes->internal_hashes[obj_idx][ti_source] = arr; + // :debug_zero_hash_assert + #if BUILD_DEBUG + MemoryZeroTyped(arr, debug_t.count); + #endif + + task.hashes->internal_hashes[obj_idx] = push_array(scratch.arena, U64 *, CV_TypeIndexSource_COUNT); + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + task.hashes->internal_hashes[obj_idx][ti_source] = arr; } } ProfEnd(); // push external hash arrays ProfBegin("Push External Hash Arrays"); - hashes->external_hashes = push_array_no_zero(tp_temp->v[0], U64 **, input->type_server_count); - for (U64 ts_idx = 0; ts_idx < input->type_server_count; ++ts_idx) { - hashes->external_hashes[ts_idx] = push_array_no_zero(tp_temp->v[0], U64 *, CV_TypeIndexSource_COUNT); - for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { + task.hashes->external_hashes = push_array_no_zero(scratch.arena, U64 **, input->type_server_count); + for EachIndex(ts_idx, input->type_server_count) { + task.hashes->external_hashes[ts_idx] = push_array_no_zero(scratch.arena, U64 *, CV_TypeIndexSource_COUNT); + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); - hashes->external_hashes[ts_idx][ti_source] = push_array(tp_temp->v[0], U64, leaf_count); // :zero_hash_check + task.hashes->external_hashes[ts_idx][ti_source] = push_array(scratch.arena, U64, leaf_count); // :zero_hash_check } } ProfEnd(); - LNK_LeafHasherTask task = {0}; - task.input = input; - task.hashes = hashes; - task.fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, MB(1), MB(1)); - // hash .debug$P first so we can mix in hashes for precompiled sub leaves when hashing leaves in .debug$T ProfBeginDynamic("Hash .debug$P [Count: %llu]", input->internal_count); task.debug_t_arr = input->internal_debug_p_arr; tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); ProfEnd(); -#if PROFILE_TELEMETRY - String8 count_string = str8_from_count(scratch.arena, input->internal_count); - ProfBegin("Hash .debug$T [Count: %.*s]", str8_varg(count_string)); -#endif + ProfBegin("Hash .debug$T [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, input->internal_count))); task.debug_t_arr = input->internal_debug_t_arr; tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); ProfEnd(); - ProfBegin("Hash Type Server Leaves [Count: %.*s]", str8_varg(count_string)); + ProfBegin("Hash Type Server Leaves [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, input->external_count))); tp_for_parallel(tp, 0, input->external_count, lnk_hash_type_server_leaves_task, &task); ProfEnd(); - - scratch_end(scratch); } ProfEnd(); ProfBegin("Leaf Hash Table Init"); - LNK_LeafHashTable leaf_ht_arr[CV_TypeIndexSource_COUNT] = { 0 }; - U64 internal_per_source_count[CV_TypeIndexSource_COUNT] = { 0 }; - U64 external_per_source_count[CV_TypeIndexSource_COUNT] = { 0 }; { - // count internal leaves - lnk_cv_debug_t_count_leaves_per_source(tp, input->internal_count, input->internal_debug_p_arr, internal_per_source_count); - lnk_cv_debug_t_count_leaves_per_source(tp, input->internal_count, input->internal_debug_t_arr, internal_per_source_count); + ProfBegin("Count Types Per Source"); + { + Temp temp = temp_begin(scratch.arena); + + ProfBegin("Compute Per Task Ranges"); + U64 per_task_leaf_count = 10000; + LNK_LeafRangeList *leaf_ranges_per_task = push_array(temp.arena, LNK_LeafRangeList, tp->worker_count); + for (U64 i = 0, task_weight = 0, task_id = 0; i < input->internal_count; i += 1) { + CV_DebugT *debug_t = &input->merged_debug_t_p_arr[i]; + for (U64 k = 0; k < debug_t->count; k += per_task_leaf_count) { + U64 cap = per_task_leaf_count - task_weight; + + LNK_LeafRange *leaf_range = push_array(temp.arena, LNK_LeafRange, 1); + leaf_range->range = rng_1u64(k, Min(k + cap, debug_t->count)); + leaf_range->debug_t = debug_t; + + LNK_LeafRangeList *list = &leaf_ranges_per_task[task_id]; + SLLQueuePush(list->first, list->last, leaf_range); + list->count += 1; + + task_weight += dim_1u64(leaf_range->range); + if (task_weight >= per_task_leaf_count) { + task_id = (task_id + 1) % tp->worker_count; + task_weight = 0; + } + } + } + ProfEnd(); + + task.leaf_ranges_per_task = leaf_ranges_per_task; + tp_for_parallel(tp, 0, tp->worker_count, lnk_count_per_source_leaf_task, &task); + + temp_end(temp); + } + ProfEnd(); // count external leaves - for (U64 ts_idx = 0; ts_idx < input->type_server_count; ++ts_idx) { - for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { - external_per_source_count[ti_source] += dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); + for EachIndex(ts_idx, input->type_server_count) { + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + task.external_per_source_count[ti_source] += dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); } } // push buckets per source - for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) { - U64 bucket_cap = 0; - bucket_cap += internal_per_source_count[ti_source]; - bucket_cap += external_per_source_count[ti_source]; - bucket_cap = (bucket_cap * 13) / 10; // * 1.3 + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + task.leaf_ht_arr[ti_source].cap = 0; + task.leaf_ht_arr[ti_source].cap += task.internal_per_source_count[ti_source]; + task.leaf_ht_arr[ti_source].cap += task.external_per_source_count[ti_source]; + task.leaf_ht_arr[ti_source].cap = (task.leaf_ht_arr[ti_source].cap * 13) / 10; // * 1.3 + task.leaf_ht_arr[ti_source].bucket_arr = push_array(scratch.arena, LNK_LeafRef *, task.leaf_ht_arr[ti_source].cap); #if PROFILE_TELEMETRY - tmMessage(0, TMMF_ICON_NOTE, "%.*s Bucket Count: %llu", str8_varg(cv_string_from_type_index_source(ti_source)), bucket_cap); + tmMessage(0, TMMF_ICON_NOTE, "%.*s Bucket Count: %.*s", str8_varg(cv_string_from_type_index_source(ti_source)), str8_varg(str8_from_count(scratch.arena, task.leaf_ht_arr[ti_source].cap))); #endif - - leaf_ht_arr[ti_source].cap = bucket_cap; - leaf_ht_arr[ti_source].bucket_arr = push_array(tp_temp->v[0], LNK_LeafBucket *, bucket_cap); } } ProfEnd(); -#if PROFILE_TELEMETRY - String8 obj_count_string = str8_from_count(tp_temp->v[0], input->internal_count); - String8 tpi_count_string = str8_from_count(tp_temp->v[0], internal_per_source_count[CV_TypeIndexSource_TPI]); - String8 ipi_count_string = str8_from_count(tp_temp->v[0], internal_per_source_count[CV_TypeIndexSource_IPI]); ProfBeginDynamic("Internal Leaf Dedup [Obj Count: %.*s, TPI: %.*s, IPI: %.*s]", - str8_varg(obj_count_string), - str8_varg(tpi_count_string), - str8_varg(ipi_count_string)); -#endif - { + str8_varg(str8_from_count(scratch.arena, input->internal_count)), + str8_varg(str8_from_count(scratch.arena, task.internal_per_source_count[CV_TypeIndexSource_TPI])), + str8_varg(str8_from_count(scratch.arena, task.internal_per_source_count[CV_TypeIndexSource_IPI]))); - LNK_LeafDedupInternal task; - task.input = input; - task.hashes = hashes; - task.leaf_ht_arr = leaf_ht_arr; + task.debug_t_arr = input->internal_debug_p_arr; + tp_for_parallel_prof(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task, "Dedup .debug$P"); - ProfBegin("Dedup .debug$P"); - task.debug_t_arr = input->internal_debug_p_arr; - tp_for_parallel(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task); - ProfEnd(); + task.debug_t_arr = input->internal_debug_t_arr; + tp_for_parallel_prof(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task, "Dedup .debug$T"); - ProfBegin("Dedup .debug$T"); - task.debug_t_arr = input->internal_debug_t_arr; - tp_for_parallel(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task); - ProfEnd(); - } ProfEnd(); ProfBeginDynamic("External Leaf Import [Type Server Count: %llu, Dependent Obj Count: %llu]", input->type_server_count, input->external_count); - { - LNK_LeafDedupExternal task = {0}; - task.input = input; - task.hashes = hashes; - task.leaf_ht_arr = leaf_ht_arr; - - ProfBeginDynamic("Dedup TPI [Leaf Count %llu]", external_per_source_count[CV_TypeIndexSource_TPI]); - task.dedup_ti_source = CV_TypeIndexSource_TPI; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + task.ti_source = ti_source; tp_for_parallel(tp, tp_temp, input->type_server_count, lnk_leaf_dedup_external_task, &task); - ProfEnd(); - - ProfBeginDynamic("Dedup IPI [Leaf Count %llu]", external_per_source_count[CV_TypeIndexSource_IPI]); - task.dedup_ti_source = CV_TypeIndexSource_IPI; - tp_for_parallel(tp, tp_temp, input->type_server_count, lnk_leaf_dedup_external_task, &task); - ProfEnd(); } ProfEnd(); - // extract present buckets from the hash tables - LNK_LeafBucketArray tpi_arr = lnk_present_bucket_array_from_leaf_hash_table(tp, tp_temp->v[0], &leaf_ht_arr[CV_TypeIndexSource_TPI]); - LNK_LeafBucketArray ipi_arr = lnk_present_bucket_array_from_leaf_hash_table(tp, tp_temp->v[0], &leaf_ht_arr[CV_TypeIndexSource_IPI]); + ProfBegin("Extract present buckets from the leaf hash tables"); - // sort output leaves based on { location index, leaf index } to guarantee determinism - lnk_leaf_bucket_array_sort(tp, ipi_arr, input->internal_count, input->type_server_count); - lnk_leaf_bucket_array_sort(tp, tpi_arr, input->internal_count, input->type_server_count); + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + task.ti_source = ti_source; + task.counts[ti_source] = push_array(scratch.arena, U64, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, task.leaf_ht_arr[ti_source].cap, tp->worker_count); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_count_present_buckets_task, &task, "Count present buckets"); - // assign type indices to each bucket - lnk_assign_type_indices(tp, tpi_arr, CV_MinComplexTypeIndex); - lnk_assign_type_indices(tp, ipi_arr, CV_MinComplexTypeIndex); + task.unique_leaf_refs_arr[ti_source].count = sum_array_u64(tp->worker_count, task.counts[ti_source]); + task.unique_leaf_refs_arr[ti_source].v = push_array_no_zero(scratch.arena, LNK_LeafRef *, task.unique_leaf_refs_arr[ti_source].count); + task.offsets[ti_source] = offsets_from_counts_array_u64(scratch.arena, task.counts[ti_source], tp->worker_count); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_get_present_buckets_task, &task, "Copy present buckets"); - // patch indices in symbols, inline sites, and leaves - lnk_patch_symbols(tp, input, hashes, leaf_ht_arr); - lnk_patch_inlines(tp, input, hashes, leaf_ht_arr, input->count, input->debug_s_arr); - lnk_patch_leaves(tp, input, hashes, leaf_ht_arr, tpi_arr); - lnk_patch_leaves(tp, input, hashes, leaf_ht_arr, ipi_arr); + // sort output leaves based on { location index, leaf index } to guarantee determinism + lnk_leaf_ref_array_sort(tp, task.unique_leaf_refs_arr[ti_source], input->internal_count, input->type_server_count); + } - CV_DebugT tpi_types = lnk_unbucket_leaf_array(tp, tp_temp->v[0], input, tpi_arr); - CV_DebugT ipi_types = lnk_unbucket_leaf_array(tp, tp_temp->v[0], input, ipi_arr); + #if PROFILE_TELEMETRY + tmMessage(0, TMMF_ICON_NOTE, "TPI Count: %.*s", str8_varg(str8_from_count(scratch.arena, task.unique_leaf_refs_arr[CV_TypeIndexSource_TPI].count))); + tmMessage(0, TMMF_ICON_NOTE, "IPI Count: %.*s", str8_varg(str8_from_count(scratch.arena, task.unique_leaf_refs_arr[CV_TypeIndexSource_IPI].count))); + #endif - ProfBegin("Post Process CV Symbols"); - { - LNK_PostProcessCvSymbolsTask task = {0}; - task.ipi_min_type_index = CV_MinComplexTypeIndex; - task.ipi_types = ipi_types; - task.symbol_inputs = input->symbol_inputs; - task.parsed_symbols = input->parsed_symbols; - tp_for_parallel(tp, 0, input->total_symbol_input_count, lnk_post_process_cv_symbols_task, &task); + ProfEnd(); + + ProfBegin("Assign type indices"); + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + task.ti_source = ti_source; + task.assigned_type_caps[ti_source] = (task.unique_leaf_refs_arr[ti_source].count * 13) / 10; + task.assigned_type_hts [ti_source] = push_array(scratch.arena, CV_TypeIndex, task.assigned_type_caps[ti_source]); + task.min_type_indices [ti_source] = CV_MinComplexTypeIndex; + task.ranges = tp_divide_work(scratch.arena, task.unique_leaf_refs_arr[ti_source].count, tp->worker_count); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_assign_type_indices_task, &task, "Assign Type Indices"); } ProfEnd(); - CV_DebugT *types = push_array(tp_temp->v[0], CV_DebugT, CV_TypeIndexSource_COUNT); - types[CV_TypeIndexSource_TPI] = tpi_types; - types[CV_TypeIndexSource_IPI] = ipi_types; + ProfBegin("Patch Type Indices"); + { + task.ranges = tp_divide_work(scratch.arena, input->total_symbol_input_count, tp->worker_count); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_symbols_task, &task, "Symbols"); + task.ranges = 0; + task.debug_s_arr = input->debug_s_arr; + tp_for_parallel_prof(tp, 0, input->count, lnk_cv_patcher_inlines_task, &task, "Inlines"); + + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + task.ti_source = ti_source; + task.ranges = tp_divide_work(scratch.arena, task.unique_leaf_refs_arr[ti_source].count, tp->worker_count); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_leaves_task, &task, "Leaves"); + } + } ProfEnd(); - return types; + + task.types = push_array(tp_temp->v[0], CV_DebugT, CV_TypeIndexSource_COUNT); + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + LNK_LeafRefArray unique_leaf_refs = task.unique_leaf_refs_arr[ti_source]; + task.ti_source = ti_source; + task.types[ti_source].count = unique_leaf_refs.count; + task.types[ti_source].v = push_array(tp_temp->v[0], U8 *, unique_leaf_refs.count); + task.ranges = tp_divide_work(scratch.arena, unique_leaf_refs.count, tp->worker_count); + tp_for_parallel(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task); + } + + tp_for_parallel_prof(tp, 0, input->total_symbol_input_count, lnk_post_process_cv_symbols_task, &task, "Post Process CV Symbols"); + + scratch_end(scratch); + ProfEnd(); + return task.types; } internal diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 7b77e4e1..d9461fd1 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -93,20 +93,14 @@ typedef struct LNK_LeafRangeList typedef struct { - LNK_LeafRef leaf_ref; - CV_TypeIndex type_index; -} LNK_LeafBucket; + U64 count; + LNK_LeafRef **v; +} LNK_LeafRefArray; typedef struct { - U64 count; - LNK_LeafBucket **v; -} LNK_LeafBucketArray; - -typedef struct -{ - U64 cap; - LNK_LeafBucket **bucket_arr; + U64 cap; + LNK_LeafRef **bucket_arr; } LNK_LeafHashTable; typedef union @@ -157,45 +151,6 @@ typedef struct // --- Leaf Deduping Tasks ----------------------------------------------------- -typedef struct -{ - LNK_LeafRangeList *leaf_ranges_per_task; - U64 **count_arr_arr; -} LNK_CountPerSourceLeafTask; - -typedef struct -{ - LNK_CodeViewInput *input; - LNK_LeafHashes *hashes; - Arena **fixed_arenas; - CV_DebugT *debug_t_arr; -} LNK_LeafHasherTask; - -typedef struct -{ - LNK_CodeViewInput *input; - LNK_LeafHashes *hashes; - LNK_LeafHashTable *leaf_ht_arr; - CV_DebugT *debug_t_arr; -} LNK_LeafDedupInternal; - -typedef struct -{ - LNK_CodeViewInput *input; - LNK_LeafHashes *hashes; - LNK_LeafHashTable *leaf_ht_arr; - CV_TypeIndexSource dedup_ti_source; -} LNK_LeafDedupExternal; - -typedef struct -{ - LNK_LeafHashTable *ht; - U64 *count_arr; - Rng1U64 *range_arr; - U64 *offset_arr; - LNK_LeafBucketArray result; -} LNK_GetPresentBucketsTask; - typedef struct { U64 loc_idx_bit_count_0; @@ -204,8 +159,8 @@ typedef struct U64 counts_max; U32 **counts_arr; Rng1U64 *ranges; - LNK_LeafBucket **dst; - LNK_LeafBucket **src; + LNK_LeafRef **dst; + LNK_LeafRef **src; U64 loc_idx_max; U64 pass_idx; } LNK_LeafRadixSortTask; @@ -214,53 +169,41 @@ typedef struct { U32 *counts; U32 *offsets; - LNK_LeafBucket **dst; - LNK_LeafBucket **src; + LNK_LeafRef **dst; + LNK_LeafRef **src; Rng1U64 *ranges; } LNK_LeafLocRadixSortTask; -typedef struct -{ - Rng1U64 *range_arr; - CV_TypeIndex min_type_index; - LNK_LeafBucketArray bucket_arr; -} LNK_AssignTypeIndicesTask; - typedef struct { LNK_CodeViewInput *input; - LNK_LeafBucket **bucket_arr; - U8 **raw_leaf_arr; - Rng1U64 *range_arr; -} LNK_UnbucketRawLeavesTask; - -typedef struct -{ + LNK_LeafHashes *hashes; + Arena **fixed_arenas; Rng1U64 *ranges; - LNK_CodeViewInput *input; - LNK_LeafHashes *hashes; - LNK_LeafHashTable *leaf_ht_arr; - CV_SymbolList *symbol_list_arr; - Arena **arena_arr; -} LNK_PatchSymbolTypesTask; + LNK_LeafHashTable leaf_ht_arr[CV_TypeIndexSource_COUNT]; + CV_DebugT *debug_t_arr; + CV_TypeIndexSource ti_source; -typedef struct -{ - LNK_CodeViewInput *input; - LNK_LeafHashes *hashes; - LNK_LeafHashTable *leaf_ht_arr; - CV_DebugS *debug_s_arr; -} LNK_PatchInlinesTask; + // count types per source + LNK_LeafRangeList *leaf_ranges_per_task; + U64 internal_per_source_count[CV_TypeIndexSource_COUNT]; + U64 external_per_source_count[CV_TypeIndexSource_COUNT]; -typedef struct -{ - LNK_CodeViewInput *input; - LNK_LeafHashes *hashes; - LNK_LeafHashTable *leaf_ht_arr; - LNK_LeafBucket **bucket_arr; - Rng1U64 *range_arr; - Arena **fixed_arena_arr; -} LNK_PatchLeavesTask; + // extract present buckets + U64 *counts [CV_TypeIndexSource_COUNT]; + U64 *offsets[CV_TypeIndexSource_COUNT]; + + // assign type indices + U64 assigned_type_caps [CV_TypeIndexSource_COUNT]; + CV_TypeIndex *assigned_type_hts [CV_TypeIndexSource_COUNT]; + CV_TypeIndex min_type_indices [CV_TypeIndexSource_COUNT]; + LNK_LeafRefArray unique_leaf_refs_arr[CV_TypeIndexSource_COUNT]; + + CV_SymbolList *symbol_list_arr; + CV_DebugS *debug_s_arr; + + CV_DebugT *types; +} LNK_CvImportTypes; // --- Code View Processing Trasks --------------------------------------------- @@ -494,57 +437,48 @@ typedef struct // --- CodeView ---------------------------------------------------------------- -internal CV_DebugS * lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *sect_list_arr); -internal CV_DebugT * lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *debug_t_list_arr); -internal CV_SymbolList * lnk_cv_symbol_list_arr_from_debug_s_arr(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr); -internal LNK_PchInfo * lnk_setup_pch(Arena *arena, U64 obj_count, LNK_Obj **obj_arr, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr, CV_SymbolListArray *parsed_symbols, String8List alt_pch_dirs); +internal CV_DebugS * lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *sect_list_arr); +internal CV_DebugT * lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *debug_t_list_arr); +internal LNK_PchInfo * lnk_setup_pch (Arena *arena, U64 obj_count, LNK_Obj **obj_arr, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr, CV_SymbolListArray *parsed_symbols, String8List alt_pch_dirs); internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_flags, String8List lib_dir_list, String8List alt_pch_dirs, U64 objs_count, LNK_Obj **objs); -internal LNK_LeafRef lnk_leaf_ref(U32 idx, U32 leaf_idx); -internal LNK_LeafRef lnk_obj_leaf_ref(U32 obj_idx, U32 leaf_idx); -internal LNK_LeafRef lnk_ts_leaf_ref(CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx); -internal int lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b); -internal LNK_LeafLocType lnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref); -internal LNK_LeafLocType lnk_loc_type_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx); -internal U64 lnk_loc_idx_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx); -internal CV_TypeIndex lnk_ti_lo_from_loc(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, U64 loc_idx, CV_TypeIndexSource ti_source); -internal CV_TypeIndex lnk_ti_lo_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); -internal String8 lnk_data_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); -internal CV_Leaf lnk_cv_leaf_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); -internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); +internal LNK_LeafRef lnk_leaf_ref (U32 idx, U32 leaf_idx); +internal LNK_LeafRef lnk_obj_leaf_ref (U32 obj_idx, U32 leaf_idx); +internal LNK_LeafRef lnk_ts_leaf_ref (CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx); +internal LNK_LeafLocType lnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref); +internal int lnk_leaf_ref_compare (LNK_LeafRef a, LNK_LeafRef b); + +internal LNK_LeafLocType lnk_loc_type_from_obj_idx (LNK_CodeViewInput *input, U64 obj_idx); +internal U64 lnk_loc_idx_from_obj_idx (LNK_CodeViewInput *input, U64 obj_idx); +internal CV_TypeIndex lnk_ti_lo_from_loc (LNK_CodeViewInput *input, LNK_LeafLocType loc_type, U64 loc_idx, CV_TypeIndexSource ti_source); +internal CV_TypeIndex lnk_ti_lo_from_leaf_ref (LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); +internal String8 lnk_data_from_leaf_ref (LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); internal LNK_LeafRef lnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, CV_TypeIndexSource ti_source, U64 loc_idx, CV_TypeIndex obj_ti); -internal B32 lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); -internal B32 lnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); -internal U64 lnk_hash_cv_leaf(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); -internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, String8 data); -internal LNK_LeafBucket * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 hash, LNK_LeafBucket *new_bucket); -internal LNK_LeafBucket * lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); +internal B32 lnk_match_leaf_ref (LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); -internal void lnk_cv_debug_t_count_leaves_per_source(TP_Context *tp, U64 count, CV_DebugT *debug_t_arr, U64 *per_source_count_arr); -internal void lnk_hash_debug_t_arr(TP_Context *tp, Arena *arena, U64 obj_count, CV_DebugT *debug_t_arr, U64 **hash_arr_arr); -internal LNK_LeafBucketArray lnk_present_bucket_array_from_leaf_hash_table(TP_Context *tp, Arena *arena, LNK_LeafHashTable *ht); -internal void lnk_leaf_bucket_array_sort_radix_subset_parallel(TP_Context *tp, U64 bucket_count, U64 loc_idx_max, LNK_LeafBucket **dst, LNK_LeafBucket **src); -internal void lnk_leaf_bucket_array_sort_radix_parallel(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_count, U64 type_server_count); -internal void lnk_assign_type_indices(TP_Context *tp, LNK_LeafBucketArray bucket_arr, CV_TypeIndex min_type_index); -internal void lnk_patch_symbols(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr); -internal void lnk_patch_inlines(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, U64 obj_count, CV_DebugS *debug_s_arr); -internal void lnk_patch_leaves(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, LNK_LeafBucketArray bucket_arr); -internal String8Node * lnk_copy_raw_leaf_arr_to_type_server(TP_Context *tp, CV_DebugT types, PDB_TypeServer *type_server); -internal CV_DebugT * lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); +// leaf hashing +internal U64 lnk_hash_cv_leaf (Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); +internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, String8 data); +internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); -internal void lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); +// leaf hash table +internal LNK_LeafRef * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 hash, LNK_LeafRef *new_bucket); +internal LNK_LeafRef * lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); + +internal CV_DebugT * lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); +internal void lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); // --- RAD Debug info ---------------------------------------------------------- -internal U64 lnk_udt_name_hash_table_hash(String8 string); +internal U64 lnk_udt_name_hash_table_hash (String8 string); internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out); -internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name); -internal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context *tp, Arena *arena, CV_DebugT debug_t, CV_TypeIndex ti_lo, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap); +internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name); +internal CV_TypeIndex * lnk_build_udt_fwdmap (TP_Context *tp, Arena *arena, CV_DebugT debug_t, CV_TypeIndex ti_lo, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap); -internal RDIB_TypeRef lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); -internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop); -internal LNK_SourceFileBucket * lnk_src_file_hash_table_hash(String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); +internal RDIB_TypeRef lnk_rdib_type_from_itype (LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); +internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop (CV_MethodProp prop); +internal LNK_SourceFileBucket * lnk_src_file_hash_table_hash (String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); internal LNK_SourceFileBucket * lnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **src_file_buckets, U64 src_file_buckets_cap, U64 hash, String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); internal String8List lnk_build_rad_debug_info(TP_Context *tp, @@ -563,10 +497,10 @@ internal String8List lnk_build_rad_debug_info(TP_Context *tp, // --- PDB --------------------------------------------------------------------- -internal LNK_ProcessedCodeViewC11Data lnk_process_c11_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); -internal LNK_ProcessedCodeViewC13Data lnk_process_c13_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); +internal LNK_ProcessedCodeViewC11Data lnk_process_c11_data (TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); +internal LNK_ProcessedCodeViewC13Data lnk_process_c13_data (TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); internal U64 * lnk_hash_cv_symbol_ptr_arr(TP_Context *tp, Arena *arena, CV_SymbolPtrArray arr); -internal CV_SymbolPtrArray lnk_dedup_gsi_symbols(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 obj_count, CV_SymbolList *symbol_list_arr); +internal CV_SymbolPtrArray lnk_dedup_gsi_symbols (TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 obj_count, CV_SymbolList *symbol_list_arr); internal void lnk_build_pdb_public_symbols(TP_Context *tp, TP_Arena *arena, LNK_SymbolTable *symtab, PDB_PsiContext *psi); @@ -585,9 +519,9 @@ internal String8List lnk_build_pdb(TP_Context *tp, // --- RAD Debug Info ---------------------------------------------------------- -internal U64 lnk_udt_name_hash_table_hash(String8 string); +internal U64 lnk_udt_name_hash_table_hash (String8 string); internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out); -internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name); +internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name); internal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context *tp, Arena *arena, @@ -596,7 +530,7 @@ internal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context *tp, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap); -internal void lnk_init_rdib_itype_map(Arena *arena, RDI_Arch arch, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list); -internal RDIB_TypeRef lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); +internal void lnk_init_rdib_itype_map (Arena *arena, RDI_Arch arch, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list); +internal RDIB_TypeRef lnk_rdib_type_from_itype (LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop); From d7a87b7765e1a37fbf738d7028a695a697ea3ef9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 13 Feb 2026 16:06:54 -0800 Subject: [PATCH 196/850] share arena between type deduper and MSF --- src/linker/lnk_debug_info.c | 19 ++++++++++++++++--- src/linker/pdb_ext/msf_builder.c | 16 ++++++++++------ src/linker/pdb_ext/pdb_builder.c | 15 ++++++++++----- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 6c3f2511..74a53a95 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1,6 +1,17 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +static Arena *g_huge_arena = 0; + +internal Arena * +lnk_get_huge_arena(void) +{ + if (g_huge_arena == 0) { + g_huge_arena = arena_alloc(.name = "HUGE"); + } + return g_huge_arena; +} + internal THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) { @@ -2158,7 +2169,7 @@ internal CV_DebugT * lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) { ProfBegin("Import Types"); - Temp scratch = scratch_begin(tp_temp->v, tp_temp->count); + Temp scratch = temp_begin(lnk_get_huge_arena()); U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex)); Arena **fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_ti_list_size, max_ti_list_size); @@ -2366,7 +2377,7 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) tp_for_parallel_prof(tp, 0, input->total_symbol_input_count, lnk_post_process_cv_symbols_task, &task, "Post Process CV Symbols"); - scratch_end(scratch); + temp_end(scratch); ProfEnd(); return task.types; } @@ -3013,13 +3024,14 @@ lnk_build_pdb(TP_Context *tp, { ProfBegin("PDB"); Temp scratch = scratch_begin(tp_arena->v, tp_arena->count); + Temp huge_arena_temp = temp_begin(lnk_get_huge_arena()); PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, image_data); COFF_SectionHeader **image_section_table = coff_section_table_from_data(scratch.arena, image_data, pe.section_table_range); U64 image_section_table_count = pe.section_count+1; ProfBegin("Setup PDB Context"); - PDB_Context *pdb = pdb_alloc(config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid); + PDB_Context *pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid); ProfEnd(); // move patched type data @@ -3243,6 +3255,7 @@ lnk_build_pdb(TP_Context *tp, ProfEnd(); #endif + temp_end(huge_arena_temp); scratch_end(scratch); ProfEnd(); return page_data_list; diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index b0e9bfc2..e3604285 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -1343,14 +1343,12 @@ msf_stream_align(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt align) //////////////////////////////// internal MSF_Context * -msf_alloc__(MSF_UInt page_size, MSF_PageNumber active_fpm) +msf_alloc__(Arena *arena, MSF_UInt page_size, MSF_PageNumber active_fpm) { ProfBeginFunction(); Assert(active_fpm == MSF_FPM0 || active_fpm == MSF_FPM1); Assert(IsPow2(page_size)); - Arena *arena = arena_alloc(); - MSF_Context *msf = push_array(arena, MSF_Context, 1); msf->arena = arena; msf->page_size = page_size; @@ -1361,9 +1359,9 @@ msf_alloc__(MSF_UInt page_size, MSF_PageNumber active_fpm) } internal MSF_Context * -msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm) +msf_alloc_(Arena *arena, MSF_UInt page_size, MSF_UInt active_fpm) { - MSF_Context *msf = msf_alloc__(page_size, active_fpm); + MSF_Context *msf = msf_alloc__(arena, page_size, active_fpm); // reserve first page for header msf->header_page_list = msf_alloc_pages(msf, 1); @@ -1378,6 +1376,12 @@ msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm) return msf; } +internal MSF_Context * +msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm) +{ + return msf_alloc_(arena_alloc( .name = "MSF"), page_size, active_fpm); +} + internal MSF_StreamNode * msf_find_stream_node(MSF_Context *msf, MSF_StreamNumber sn) { @@ -1608,7 +1612,7 @@ msf_open(String8 data, MSF_Context **msf_out) } // allocate MSF context and don't reserve special pages - msf = msf_alloc__(header->page_size, header->active_fpm); + msf = msf_alloc__(arena_alloc(.name = "MSF"), header->page_size, header->active_fpm); // divide data into fixed size nodes (with 4KB page each node is 128MB) msf_set_page_data_list(msf->arena, &page_data_list, header->page_size, data); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 153bc759..28ea814c 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -3516,10 +3516,10 @@ dbi_push_section(PDB_DbiContext *dbi, COFF_SectionHeader *hdr) //////////////////////////////// internal MSF_Context * -pdb_alloc_msf(U64 page_size) +pdb_alloc_msf(Arena *arena, U64 page_size) { ProfBeginFunction(); - MSF_Context *msf = msf_alloc(page_size, MSF_DEFAULT_FPM); + MSF_Context *msf = msf_alloc_(arena, page_size, MSF_DEFAULT_FPM); MSF_StreamNumber null_sn = msf_stream_alloc(msf); MSF_StreamNumber info_sn = msf_stream_alloc(msf); MSF_StreamNumber tpi_sn = msf_stream_alloc(msf); @@ -3535,13 +3535,12 @@ pdb_alloc_msf(U64 page_size) } internal PDB_Context * -pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid) +pdb_alloc_(Arena *arena, U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid) { ProfBeginFunction(); - Arena *arena = arena_alloc(); PDB_Context *pdb = push_array(arena, PDB_Context, 1); pdb->arena = arena; - pdb->msf = pdb_alloc_msf(page_size); + pdb->msf = pdb_alloc_msf(arena, page_size); pdb->info = pdb_info_alloc(age, time_stamp, guid); pdb->dbi = dbi_alloc(machine, age); pdb->gsi = gsi_alloc(); @@ -3554,6 +3553,12 @@ pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U3 return pdb; } +internal PDB_Context * +pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid) +{ + return pdb_alloc_(arena_alloc(.name = "PDB"), page_size, machine, time_stamp, age, guid); +} + internal PDB_Context * pdb_open(String8 data) { From e14d3b7cdbb69e038e35963e53ed13334da1ffc5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 13 Feb 2026 17:29:48 -0800 Subject: [PATCH 197/850] correctly compute size_to_zero for new blocks --- src/base/base_arena.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 7283d20e..7b7e72d0 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -101,6 +101,16 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) U64 pos_pre = AlignPow2(current->pos, align); U64 pos_pst = pos_pre + size; + // TODO: Newly allocated arenas already have zeroed commited pages, + // so this unnecessarily zeroes them again. + // + // rjf: compute the size we need to zero + U64 size_to_zero = 0; + if(zero) + { + size_to_zero = Min(current->cmt, pos_pst) - pos_pre; + } + // rjf: chain, if needed if(current->res < pos_pst && !(arena->flags & ArenaFlag_NoChain)) { @@ -141,6 +151,12 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) .flags = current->flags, .allocation_site_file = current->allocation_site_file, .allocation_site_line = current->allocation_site_line); + + size_to_zero = 0; + } + else + { + size_to_zero = size; } new_block->base_pos = current->base_pos + current->res; @@ -151,13 +167,6 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) pos_pst = pos_pre + size; } - // rjf: compute the size we need to zero - U64 size_to_zero = 0; - if(zero) - { - size_to_zero = Min(current->cmt, pos_pst) - pos_pre; - } - // rjf: commit new pages, if needed if(current->cmt < pos_pst) { @@ -185,10 +194,7 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) result = (U8 *)current+pos_pre; current->pos = pos_pst; AsanUnpoisonMemoryRegion(result, size); - if(size_to_zero != 0) - { - MemoryZero(result, size_to_zero); - } + MemoryZero(result, size_to_zero); } #if PROFILE_TELEMETRY From 0315cce2ea3d488846f65f91fde584dcefeef8a0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 13 Feb 2026 17:31:27 -0800 Subject: [PATCH 198/850] track os_commit and os_decommit --- src/os/core/win32/os_core_win32.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 49d67e80..d21bc9af 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -213,6 +213,9 @@ os_commit(void *ptr, U64 size) // wine does not implement these functions w32_rio_functions.RIODeregisterBuffer(w32_rio_functions.RIORegisterBuffer(ptr, size)); } +#if PROFILE_TELEMETRY + tmAlloc(0, ptr, size / 1024, "Win32 Commit"); +#endif return result; } @@ -220,6 +223,9 @@ internal void os_decommit(void *ptr, U64 size) { VirtualFree(ptr, size, MEM_DECOMMIT); +#if PROFILE_TELEMETRY + tmFree(0, ptr); +#endif } internal void From 519bc154ec01c4c3ebeaa84d37b12ac75a00699d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 13 Feb 2026 17:33:18 -0800 Subject: [PATCH 199/850] disable async for radlink --- src/base/base_entry_point.c | 4 ++++ src/linker/lnk.c | 9 +-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index a79ced53..db167e5a 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -94,6 +94,7 @@ main_thread_base_entry_point(int arguments_count, char **arguments) rd_init(&cmdline); #endif +#if !NO_ASYNC //- rjf: launch async threads Thread *async_threads = 0; U64 lane_broadcast_val = 0; @@ -124,10 +125,12 @@ main_thread_base_entry_point(int arguments_count, char **arguments) async_threads[idx] = thread_launch(async_thread_entry_point, &lane_ctxs[idx]); } } +#endif //- rjf: call into entry point entry_point(&cmdline); +#if !NO_ASYNC //- rjf: join async threads ins_atomic_u32_inc_eval(&global_async_exit); cond_var_broadcast(async_tick_start_cond_var); @@ -135,6 +138,7 @@ main_thread_base_entry_point(int arguments_count, char **arguments) { thread_join(async_threads[idx], max_U64); } +#endif //- rjf: end captures if(capture) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index ebea90b2..bf5f13e4 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -6,20 +6,13 @@ #define BUILD_CONSOLE_INTERFACE 1 #define BUILD_TITLE "Epic Games Tools (R) RAD PE/COFF Linker" -// --- Arena ------------------------------------------------------------------- - #define ARENA_FREE_LIST 1 +#define NO_ASYNC 1 // --- Third Party ------------------------------------------------------------- #include "base_ext/base_blake3.h" #include "base_ext/base_blake3.c" -#define XXH_INLINE_ALL -#define XXH_IMPLEMENTATION -#define XXH_STATIC_LINKING_ONLY -#include "third_party/xxHash/xxhash.c" -#include "third_party/xxHash/xxhash.h" -#include "third_party/radsort/radsort.h" // --- Code Base --------------------------------------------------------------- From fbc3cbd6eb40cf75dd031c49dcfc0033a271e6e3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 12 Feb 2026 22:24:52 -0800 Subject: [PATCH 200/850] polish help in radlink --- src/linker/base_ext/base_arrays.c | 190 +++++++-------- src/linker/base_ext/base_arrays.h | 67 ++++-- src/linker/lnk.c | 210 +++++++++-------- src/linker/lnk.h | 2 +- src/linker/lnk_cmd_line.c | 18 +- src/linker/lnk_cmd_line.h | 2 + src/linker/lnk_config.c | 372 +++++++++++++----------------- src/linker/lnk_config.h | 79 +------ src/linker/lnk_error.c | 19 +- src/linker/lnk_error.h | 3 +- src/linker/lnk_io.c | 2 +- src/linker/pdb_ext/pdb_builder.c | 2 +- src/linker/rdi/rdi_builder.c | 40 ++-- 13 files changed, 480 insertions(+), 526 deletions(-) diff --git a/src/linker/base_ext/base_arrays.c b/src/linker/base_ext/base_arrays.c index c6552b4c..96e715b5 100644 --- a/src/linker/base_ext/base_arrays.c +++ b/src/linker/base_ext/base_arrays.c @@ -5,9 +5,7 @@ internal U64 void_list_count_nodes(VoidNode *head) { U64 node_count = 0; - for (VoidNode *curr = head; curr != 0; curr = curr->next) { - ++node_count; - } + for EachNode(curr, VoidNode, head) { node_count += 1; } return node_count; } @@ -49,15 +47,33 @@ u64_list_concat_in_place(U64List *list, U64List *to_concat) SLLConcatInPlace(list, to_concat); } -internal U64Array -u64_array_from_list(Arena *arena, U64List *list) +internal B32 +u32_array_compare(U32Array a, U32Array b) { - U64Array result; - result.count = 0; - result.v = push_array(arena, U64, list->count); - for (U64Node *n = list->first; n != NULL; n = n->next) { - result.v[result.count++] = n->data; + B32 are_equal = 0; + if (a.count == b.count) { + int cmp = MemoryCompare(a.v, b.v, sizeof(a.v[0]) * a.count); + are_equal = (cmp == 0); } + return are_equal; +} + +internal void +u32_array_counts_to_offsets(U64 count, U32 *arr) +{ + U32 next_offset = 0; + for (U64 i = 0; i < count; i += 1) { + U32 current_offset = next_offset; + next_offset += arr[i]; + arr[i] = current_offset; + } +} + +internal U32 * +u32_array_offsets_from_counts(Arena *arena, U32 *v, U64 count) +{ + U32 *result = push_array_copy_u32(arena, v, count); + u32_array_counts_to_offsets(count, result); return result; } @@ -68,13 +84,7 @@ u32_array_sort(U64 count, U32 *v) } internal void -u64_array_sort(U64 count, U64 *v) -{ - radsort(v, count, u64_is_before); -} - -internal void -u32_pair_radix_sort(U64 count, PairU32 *arr) +u32_pair_sort_radix(U64 count, PairU32 *arr) { Temp scratch = scratch_begin(0,0); @@ -98,9 +108,9 @@ u32_pair_radix_sort(U64 count, PairU32 *arr) ++count2[digit2]; } - counts_to_offsets_array_u32((1 << bit_count0), count0); - counts_to_offsets_array_u32((1 << bit_count1), count1); - counts_to_offsets_array_u32((1 << bit_count2), count2); + u32_array_counts_to_offsets((1 << bit_count0), count0); + u32_array_counts_to_offsets((1 << bit_count1), count1); + u32_array_counts_to_offsets((1 << bit_count2), count2); for (U64 i = 0; i < count; ++i) { U32 digit0 = (arr[i].v0 >> 0) % (1 << bit_count0); @@ -122,15 +132,59 @@ u32_pair_radix_sort(U64 count, PairU32 *arr) scratch_end(scratch); } -internal B32 -u32_array_compare(U32Array a, U32Array b) +internal U64 * +offsets_from_counts_array_u64(Arena *arena, U64 *v, U64 count) { - B32 are_equal = 0; - if (a.count == b.count) { - int cmp = MemoryCompare(a.v, b.v, sizeof(a.v[0]) * a.count); - are_equal = (cmp == 0); + U64 *result = push_array_copy_u64(arena, v, count); + u64_array_counts_to_offsets(count, result); + return result; +} + +internal void +u64_array_counts_to_offsets(U64 count, U64 *arr) +{ + U64 next_offset = 0; + for (U64 i = 0; i < count; i += 1) { + U64 current_offset = next_offset; + next_offset += arr[i]; + arr[i] = current_offset; } - return are_equal; +} + +internal void +u64_array_sort(U64 count, U64 *v) +{ + radsort(v, count, u64_is_before); +} + +internal U64 +u64_array_max(U64 count, U64 *v) +{ + U64 result = 0; + for (U64 i = 0; i < count; i += 1) { + result = Max(v[i], result); + } + return result; +} + +internal U64 +u64_array_min(U64 count, U64 *v) +{ + U64 result = max_U64; + for (U64 i = 0; i < count; i += 1) { + result = Min(v[i], result); + } + return result; +} + +internal U64 +sum_array_u64(U64 count, U64 *v) +{ + U64 result = 0; + for (U64 i = 0; i < count; i += 1) { + result += v[i]; + } + return result; } internal U64Array @@ -160,81 +214,35 @@ u64_array_remove_duplicates(Arena *arena, U64Array in) return result; } -internal U64 -sum_array_u64(U64 count, U64 *v) +internal void +s64_list_push_node(S64List *list, S64Node *n) { - U64 result = 0; - for (U64 i = 0; i < count; i += 1) { - result += v[i]; - } - return result; + SLLQueuePush(list->first, list->last, n); + list->count += 1; } -internal U64 -sum_matrix_u64(U64 rows, U64 cols, U64 **v) +internal S64Node * +s64_list_push(Arena *arena, S64List *list, S64 v) { - U64 result = 0; - for (U64 i = 0; i < rows; ++i) { - result += sum_array_u64(cols, v[i]); - } - return result; -} - -internal U64 -max_array_u64(U64 count, U64 *v) -{ - U64 result = 0; - for (U64 i = 0; i < count; i += 1) { - result = Max(v[i], result); - } - return result; -} - -internal U64 -min_array_u64(U64 count, U64 *v) -{ - U64 result = max_U64; - for (U64 i = 0; i < count; i += 1) { - result = Min(v[i], result); - } - return result; + S64Node *n = push_array(arena, S64Node, 1); + n->next = 0; + n->v = v; + s64_list_push_node(list, n); + return n; } internal void -counts_to_offsets_array_u32(U64 count, U32 *arr) +s64_list_concat_in_place(S64List *list, S64List *to_concat) { - U32 next_offset = 0; - for (U64 i = 0; i < count; i += 1) { - U32 current_offset = next_offset; - next_offset += arr[i]; - arr[i] = current_offset; - } + SLLConcatInPlace(list, to_concat); } -internal void -counts_to_offsets_array_u64(U64 count, U64 *arr) +internal S64Array +s64_array_from_list(Arena *arena, S64List *list) { - U64 next_offset = 0; - for (U64 i = 0; i < count; i += 1) { - U64 current_offset = next_offset; - next_offset += arr[i]; - arr[i] = current_offset; - } -} - -internal U32 * -offsets_from_counts_array_u32(Arena *arena, U32 *v, U64 count) -{ - U32 *result = push_array_copy_u32(arena, v, count); - counts_to_offsets_array_u32(count, result); - return result; -} - -internal U64 * -offsets_from_counts_array_u64(Arena *arena, U64 *v, U64 count) -{ - U64 *result = push_array_copy_u64(arena, v, count); - counts_to_offsets_array_u64(count, result); + S64Array result = {0}; + result.v = push_array(arena, S64, list->count); + for EachNode(n, S64Node, list->first) { result.v[result.count++] = n->v; } return result; } diff --git a/src/linker/base_ext/base_arrays.h b/src/linker/base_ext/base_arrays.h index 6613dea6..4d51fd96 100644 --- a/src/linker/base_ext/base_arrays.h +++ b/src/linker/base_ext/base_arrays.h @@ -3,6 +3,12 @@ #pragma once +typedef struct VoidNode +{ + struct VoidNode *next; + void *v; +} VoidNode; + typedef struct U32Node { struct U32Node *next; @@ -22,32 +28,53 @@ typedef struct U64List U64Node *last; } U64List; -typedef struct VoidNode +typedef struct S64Node { - struct VoidNode *next; - void *v; -} VoidNode; + S64 v; + struct S64Node *next; +} S64Node; + +typedef struct S64List +{ + U64 count; + S64Node *first; + S64Node *last; +} S64List; + +typedef struct S64Array +{ + U64 count; + S64 *v; +} S64Array; //////////////////////////////// -internal void u64_list_push_node(U64List *list, U64Node *n); -internal U64Node * u64_list_push(Arena *arena, U64List *list, U64 data); +internal U64 void_list_count_nodes (VoidNode *head); +internal void void_node_concat (VoidNode **head, VoidNode *node); +internal void void_node_concat_atomic(VoidNode **head, VoidNode *node); + +internal void u64_list_push_node (U64List *list, U64Node *n); +internal U64Node * u64_list_push (Arena *arena, U64List *list, U64 v); internal void u64_list_concat_in_place(U64List *list, U64List *to_concat); -internal U64Array u64_array_from_list(Arena *arena, U64List *list); -internal U64Array u64_array_remove_duplicates(Arena *arena, U64Array in); +internal B32 u32_array_compare (U32Array a, U32Array b); +internal U32 * u32_array_offsets_from_counts(Arena *arena, U32 *v, U64 count); +internal void u32_array_counts_to_offsets (U64 count, U32 *arr); +internal void u32_array_sort (U64 count, U32 *v); +internal void u32_pair_sort_radix (U64 count, PairU32 *arr); -internal void u32_array_sort(U64 count, U32 *v); -internal void u64_array_sort(U64 count, U64 *v); -internal B32 u32_array_compare(U32Array a, U32Array b); +internal U64 * offsets_from_counts_array_u64(Arena *arena, U64 *v, U64 count); +internal void u64_array_counts_to_offsets (U64 count, U64 *arr); +internal void u64_array_sort (U64 count, U64 *v); +internal U64 u64_array_max (U64 count, U64 *v); +internal U64 u64_array_min (U64 count, U64 *v); +internal U64 sum_array_u64 (U64 count, U64 *v); +internal U64 sum_array_u64 (U64 count, U64 *v); +internal U64Array u64_array_remove_duplicates (Arena *arena, U64Array in); +internal U64Array u64_array_from_list (Arena *arena, U64List *list); -internal U64 sum_array_u64(U64 count, U64 *v); -internal U64 max_array_u64(U64 count, U64 *v); -internal U64 min_array_u64(U64 count, U64 *v); - -internal void counts_to_offsets_array_u32(U64 count, U32 *arr); -internal void counts_to_offsets_array_u64(U64 count, U64 *arr); - -internal U32 * offsets_from_counts_array_u32(Arena *arena, U32 *v, U64 count); -internal U64 * offsets_from_counts_array_u64(Arena *arena, U64 *v, U64 count); +internal void s64_list_push_node (S64List *list, S64Node *n); +internal S64Node * s64_list_push (Arena *arena, S64List *list, S64 v); +internal void s64_list_concat_in_place(S64List *list, S64List *to_concat); +internal S64Array s64_array_from_list (Arena *arena, S64List *list); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index bf5f13e4..e3a35416 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -117,115 +117,117 @@ // ----------------------------------------------------------------------------- +internal LNK_CmdLine +lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) +{ + LNK_CmdLine cmd_line = {0}; + + // setup default flags + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Align, "%u", KB(4)); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Debug, "none"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_FileAlign, "%u", 512); + if (lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Dll)) { + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_SubSystem, "%S", pe_string_from_subsystem(PE_WindowsSubsystem_WINDOWS_GUI)); + } + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_HighEntropyVa, ""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_ManifestUac, "\"level='asInvoker' uiAccess='false'\""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_NxCompat, ""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_LargeAddressAware, ""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_PdbAltPath, "%%_RAD_PDB_PATH%%"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_PdbPageSize, "%u", KB(4)); + if (!lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Brepro)) { + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", os_get_process_start_time_unix()); + } + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Age, "%u", 1); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, ""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_DoMerge, ""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_EnvLib, ""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Exe, ""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Guid, "imageblake3"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_LargePages, "no"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_LinkVer, "14.0"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_OsVer, "6.0"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_PageSize, "%u", KB(4)); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_PathStyle, "system"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Workers, "%u", os_get_system_info()->logical_processor_count); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_DebugAltPath, "%%_RAD_RDI_PATH%%"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_MemoryMapFiles, ""); + if (BUILD_DEBUG) { + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "debug"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "io_write"); + } else { + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%u", LNK_Error_InvalidTypeIndex); + } + + // default section merges + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".xdata=.rdata"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".00cfg=.rdata"); + // TODO: .tls must be always first contribution in .data section because compiler generates TLS relative movs + //lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".tls=.data"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".idata=.data"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".didat=.data"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".edata=.rdata"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".RAD_LINK_PE_DEBUG_DIR=.rdata"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".RAD_LINK_PE_DEBUG_DATA=.rdata"); + + // sections to remove from the image + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".debug"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gehcont"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gfids"); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gxfg"); + + // set limits on unresolved symbol errors + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, ""); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, "1000"); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, "10"); + + // set default max worker count + if (lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Rad_SharedThreadPool)) { + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, ""); + } + + if ( ! lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Rad_MtPath)) { + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_MtPath, "%s", LNK_MANIFEST_MERGE_TOOL_NAME); + } + + // when /FORCE is specified on the command line, do not stop on these errors +#if 0 + if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Force)) { + g_error_mode_arr[LNK_Error_UnresolvedSymbol] = LNK_ErrorMode_Continue; + } +#endif + + // in release build ignore unknown switches + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Warning_UnknownSwitch * (BUILD_DEBUG * -1)); + + return cmd_line; +} + internal LNK_Config * lnk_config_from_argcv(Arena *arena, int argc, char **argv) { Temp scratch = scratch_begin(&arena, 1); String8List raw_cmd_line = {0}; - for EachIndex(i, argc) { - str8_list_push(arena, &raw_cmd_line, str8_cstring(argv[i])); - } + for (U64 i = 1; i < argc; i += 1) { str8_list_push(arena, &raw_cmd_line, str8_cstring(argv[i])); } - // remove exe name first argument - str8_list_pop_front(&raw_cmd_line); - - // parse command line - String8List unwrapped_cmd_line = lnk_unwrap_rsp(scratch.arena, raw_cmd_line); - LNK_CmdLine cmd_line = lnk_cmd_line_parse_windows_rules(scratch.arena, unwrapped_cmd_line); - - // setup default flags - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Align, "%u", KB(4)); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Debug, "none"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_FileAlign, "%u", 512); - if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Dll)) { - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_SubSystem, "%S", pe_string_from_subsystem(PE_WindowsSubsystem_WINDOWS_GUI)); - } - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_HighEntropyVa, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_ManifestUac, "\"level='asInvoker' uiAccess='false'\""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_NxCompat, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_LargeAddressAware, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbAltPath, "%%_RAD_PDB_PATH%%"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbPageSize, "%u", KB(4)); - if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Brepro)) { - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", os_get_process_start_time_unix()); - } - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Age, "%u", 1); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DoMerge, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_EnvLib, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Exe, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Guid, "imageblake3"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LargePages, "no"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LinkVer, "14.0"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_OsVer, "6.0"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PageSize, "%u", KB(4)); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PathStyle, "system"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Workers, "%u", os_get_system_info()->logical_processor_count); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TargetOs, "windows"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DebugAltPath, "%%_RAD_RDI_PATH%%"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MemoryMapFiles, ""); -#if BUILD_DEBUG - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "debug"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "io_write"); -#else - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SuppressError, "%u", LNK_Error_InvalidTypeIndex); +#if PROFILE_TELEMETRY + tmMessage(0, TMMF_ICON_NOTE, "Command Line: %.*s", str8_varg(str8_list_join(scratch.arena, &raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }))); #endif - // default section merges - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, ".xdata=.rdata"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, ".00cfg=.rdata"); - // TODO: .tls must be always first contribution in .data section because compiler generates TLS relative movs - //lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, ".tls=.data"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, ".idata=.data"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, ".didat=.data"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, ".edata=.rdata"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, ".RAD_LINK_PE_DEBUG_DIR=.rdata"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, ".RAD_LINK_PE_DEBUG_DATA=.rdata"); - - // sections to remove from the image - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".debug"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gehcont"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gfids"); - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gxfg"); - - // set limits on unresolved symbol errors - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, ""); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, "1000"); - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, "10"); - - // set default max worker count - if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_SharedThreadPool)) { - lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, ""); - } - - if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_MtPath)) { - lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MtPath, "%s", LNK_MANIFEST_MERGE_TOOL_NAME); - } - - // when /FORCE is specified on the command line, do not stop on these errors - if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Force)) { - g_error_mode_arr[LNK_Error_UnresolvedSymbol] = LNK_ErrorMode_Continue; + // make command line + LNK_CmdLine cmd_line = {0}; + { + String8List unwrapped_cmd_line = lnk_unwrap_rsp(scratch.arena, raw_cmd_line); + LNK_CmdLine user_cmd_line = lnk_cmd_line_parse_windows_rules(scratch.arena, unwrapped_cmd_line); + LNK_CmdLine default_cmd_line = lnk_make_default_cmd_line(scratch.arena, user_cmd_line); + lnk_cmd_line_concat_in_place(&cmd_line, &default_cmd_line); + lnk_cmd_line_concat_in_place(&cmd_line, &user_cmd_line); } // init config LNK_Config *config = lnk_config_from_cmd_line(raw_cmd_line, cmd_line); -#if PROFILE_TELEMETRY - { - String8 cmdl = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); - tmMessage(0, TMMF_ICON_NOTE, "Command Line: %.*s", str8_varg(cmdl)); - } -#endif - - if (lnk_get_log_status(LNK_Log_Debug)) { - String8 full_cmd_line = str8_list_join(scratch.arena, &raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); - fprintf(stderr, "--------------------------------------------------------------------------------\n"); - fprintf(stderr, "Command Line: %.*s\n", str8_varg(full_cmd_line)); - fprintf(stderr, "Work Dir : %.*s\n", str8_varg(config->work_dir)); - fprintf(stderr, "--------------------------------------------------------------------------------\n"); - } - scratch_end(scratch); return config; } @@ -1762,7 +1764,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer link->last_default_lib = &config->input_default_lib_list.first; link->last_obj_lib = &config->input_obj_lib_list.first; link->last_cmd_lib = &config->input_list[LNK_Input_Lib].first; - link->lib_member_infos_ht = hash_table_init(link->arena, Max(config->input_list[LNK_Input_Lib].node_count * 2, 512)); + link->lib_member_infos_ht = hash_table_init(link->arena, Max(config->input_list[LNK_Input_Lib].node_count * 2, 1024)); link->try_to_resolve_entry_point = 1; // input :null_obj @@ -1914,10 +1916,10 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer exp_n_next = exp_n->next; PE_ExportParse *exp = &exp_n->data; - if (str8_match(exp->name, config->entry_point_name, 0)) { + if (exp->name.size && str8_match(exp->name, config->entry_point_name, 0)) { lnk_error_with_loc(LNK_Warning_TryingToExportEntryPoint, exp->obj_path, exp->lib_path, "exported entry point \"%S\"", exp->name); } - if (str8_match(exp->alias, config->entry_point_name, 0)) { + if (exp->alias.size && str8_match(exp->alias, config->entry_point_name, 0)) { lnk_error_with_loc(LNK_Warning_TryingToExportEntryPoint, exp->obj_path, exp->lib_path, "alias exports entry point \"%S=%S\"", exp->name, exp->alias); continue; } @@ -5066,6 +5068,14 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) Temp scratch = scratch_begin(arena->v, arena->count); + if (lnk_get_log_status(LNK_Log_Debug)) { + String8 full_cmd_line = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); + fprintf(stderr, "--------------------------------------------------------------------------------\n"); + fprintf(stderr, "Command Line: %.*s\n", str8_varg(full_cmd_line)); + fprintf(stderr, "Work Dir : %.*s\n", str8_varg(config->work_dir)); + fprintf(stderr, "--------------------------------------------------------------------------------\n"); + } + // // Input Context // @@ -5148,7 +5158,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) String8List rdi_data = lnk_build_rad_debug_info(tp, arena, - config->target_os, + OperatingSystem_Windows, rdi_arch_from_coff_machine(config->machine), config->image_name, image_ctx.image_data, @@ -5217,7 +5227,7 @@ entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0,0); lnk_init_error_handler(); - LNK_Config *config = lnk_config_from_argcv(scratch.arena, cmdline->argc, cmdline->argv); + LNK_Config *config = lnk_config_from_argcv(scratch.arena, cmdline->argc, cmdline->argv); TP_Context *tp = tp_alloc(scratch.arena, config->worker_count, config->max_worker_count, config->shared_thread_pool_name); TP_Arena *tp_arena = tp_arena_alloc(tp); lnk_run(tp, tp_arena, config); diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 8ef2d4cf..2f8b8fbf 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -74,7 +74,7 @@ typedef struct LNK_Inputer #define LNK_IMPORT_STUB "*** RAD_IMPORT_STUB ***" #define LNK_NULL_SYMBOL "*** RAD_NULL_SYMBOL ***" -#define LNK_SECTION_FLAG_LIVE (1 << 0) +#define LNK_SECTION_FLAG_LIVE (1 << 0) #define LNK_SECTION_FLAG_DEBUG (1 << 1) typedef U8 LNK_LibMemberFlags; diff --git a/src/linker/lnk_cmd_line.c b/src/linker/lnk_cmd_line.c index cf1909dd..696ee180 100644 --- a/src/linker/lnk_cmd_line.c +++ b/src/linker/lnk_cmd_line.c @@ -92,8 +92,7 @@ internal LNK_CmdOption * lnk_cmd_line_push_option_list(Arena *arena, LNK_CmdLine *cmd_line, String8 string, String8List value_strings) { // fill out node - LNK_CmdOption *opt = push_array_no_zero(arena, LNK_CmdOption, 1); - opt->next = 0; + LNK_CmdOption *opt = push_array(arena, LNK_CmdOption, 1); opt->string = string; opt->value_strings = value_strings; @@ -126,6 +125,21 @@ lnk_cmd_line_push_option_if_not_present(Arena *arena, LNK_CmdLine *cmd_line, cha return 0; } +internal void +lnk_cmd_line_concat_in_place(LNK_CmdLine *list, LNK_CmdLine *to_concat) +{ + if (list->option_count > 0) { + list->option_count += to_concat->option_count; + list->last_option->next = to_concat->first_option; + list->last_option = to_concat->last_option; + str8_list_concat_in_place(&list->input_list, &to_concat->input_list); + str8_list_concat_in_place(&list->raw_cmd_line, &to_concat->raw_cmd_line); + } else { + *list = *to_concat; + } + MemoryZeroStruct(to_concat); +} + internal LNK_CmdLine lnk_cmd_line_parse_windows_rules(Arena *arena, String8List arg_list) { diff --git a/src/linker/lnk_cmd_line.h b/src/linker/lnk_cmd_line.h index 4330bc09..dee7f13a 100644 --- a/src/linker/lnk_cmd_line.h +++ b/src/linker/lnk_cmd_line.h @@ -28,5 +28,7 @@ internal B32 lnk_cmd_line_has_option(LNK_CmdLine cmd_line, char *str internal LNK_CmdOption * lnk_cmd_line_push_option(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value); internal LNK_CmdOption * lnk_cmd_line_push_option_if_not_present(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value); +internal void lnk_cmd_line_concat_in_place(LNK_CmdLine *list, LNK_CmdLine *to_concat); + internal String8List lnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line); diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 465414e9..56564808 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -5,161 +5,95 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { { LNK_CmdSwitch_Null, 0, "", "", "" }, { LNK_CmdSwitch_NotImplemented, 0, "NOT_IMPLEMENTED", "", "" }, - { LNK_CmdSwitch_Align, 0, "ALIGN", ":#", "" }, - { LNK_CmdSwitch_AllowBind, 0, "ALLOWBIND", "[:NO]", "" }, - { LNK_CmdSwitch_AllowIsolation, 0, "ALLOWISOLATION", "[:NO]", "" }, - { LNK_CmdSwitch_AlternateName, 1, "ALTERNATENAME", "Creates an a symbol alias \"FROM=TO\"." }, - { LNK_CmdSwitch_AppContainer, 0, "APPCONTAINER", "[:NO]", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "ASSEMBLYDEBUG", "", "" }, // .NET - { LNK_CmdSwitch_NotImplemented, 0, "ASSEMBLYLINKRESOURCE", "", "" }, // .NET - { LNK_CmdSwitch_NotImplemented, 0, "ASSEMBLYMODULE", "", "" }, // .NET - { LNK_CmdSwitch_NotImplemented, 0, "ASSEMBLYRESOURCE", "", "" }, // .NET - { LNK_CmdSwitch_Base, 0, "BASE", "{ADDRESS[,SIZE]|@FILENAME,KEY}", "" }, - { LNK_CmdSwitch_Brepro, 0, "BREPRO", "", "Not supported" }, - { LNK_CmdSwitch_NotImplemented, 0, "CLRIMAGETYPE", "", "" }, // .NET - { LNK_CmdSwitch_NotImplemented, 0, "CLRLOADEROPTIMIZATION","", "" }, // .NET - { LNK_CmdSwitch_NotImplemented, 0, "CLRSUPPORTLASTERROR", "", "" }, // .NET - { LNK_CmdSwitch_NotImplemented, 0, "CLRTHREADATTRIBUTE", "", "" }, // .NET - { LNK_CmdSwitch_NotImplemented, 0, "CLRUNMANAGEDCODECHECK","", "" }, // .NET - { LNK_CmdSwitch_Debug, 0, "DEBUG", "[:{FULL|NONE}]", "" }, - { LNK_CmdSwitch_Dump, 0, "DUMP", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "DEF", ":FILENAME", "" }, - { LNK_CmdSwitch_DefaultLib, 1, "DEFAULTLIB", ":LIBNAME", "" }, - { LNK_CmdSwitch_Delay, 0, "DELAY", ":{NOBIND|UNLOAD}", "" }, - { LNK_CmdSwitch_DelayLoad, 0, "DELAYLOAD", ":DLL", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "DELAYSIGN", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "DEPENDENTLOADFLAG", "", "" }, - { LNK_CmdSwitch_Dll, 0, "DLL", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "DRIVER", "", "" }, - { LNK_CmdSwitch_DisallowLib, 1, "DISALLOWLIB", ":LIBRARY", "", }, - { LNK_CmdSwitch_D2, 0, "D2", "" }, - { LNK_CmdSwitch_EditAndContinue, 1, "EDITANDCONTINUE", "[:NO]", "" }, - { LNK_CmdSwitch_DynamicBase, 0, "DYNAMICBASE", "[:NO]", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "EMITVOLATILEMETADATA", "", "" }, - { LNK_CmdSwitch_Entry, 1, "ENTRY", ":FUNCTION", "" }, - { LNK_CmdSwitch_ErrorReport, 0, "ERRORREPORT", "", "Deprecated starting Windows Vista." }, - { LNK_CmdSwitch_Export, 1, "EXPORT", ":SYMBOL", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "EXPORTADMIN", "", "" }, - { LNK_CmdSwitch_Experimental, 0, "EXPERIMENTAL", "Not supported." }, - { LNK_CmdSwitch_FastFail, 0, "FASTFAIL", "", "Not used." }, - { LNK_CmdSwitch_FailIfMismatch, 1, "FAILIFMISMATCH", "{id=value}", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "FASTGENPROFILE", "", "" }, - { LNK_CmdSwitch_FileAlign, 0, "FILEALIGN", ":#", "" }, - { LNK_CmdSwitch_Fixed, 0, "FIXED", "[:NO]", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "FORCE", "", "" }, - { LNK_CmdSwitch_FunctionPadMin, 0, "FUNCTIONPADMIN", ":#", "Not Implemented" }, - { LNK_CmdSwitch_NotImplemented, 0, "GUARD", "", "" }, - { LNK_CmdSwitch_GuardSym, 1, "GUARDSYM", "", "", }, - { LNK_CmdSwitch_NotImplemented, 0, "GENPROFILE", "", "" }, - { LNK_CmdSwitch_Heap, 0, "HEAP", "RESERVE[,COMMIT]", "" }, - { LNK_CmdSwitch_HighEntropyVa, 0, "HIGHENTROPYVA", "[:NO]", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "IDLOUT", "", "" }, - { LNK_CmdSwitch_Ignore, 0, "IGNORE", ":#", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "IGNOREIDL", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "ILK", "", "" }, - { LNK_CmdSwitch_ImpLib, 0, "IMPLIB", ":FILENAME", "" }, - { LNK_CmdSwitch_Include, 1, "INCLUDE", "", "" }, - { LNK_CmdSwitch_Incremental, 0, "INCREMENTAL", "[:NO]", "Incremental linking is not supported." }, - { LNK_CmdSwitch_NotImplemented, 0, "INTEGRITYCHECK", "", "" }, - { LNK_CmdSwitch_InferAsanLibs, 1, "INFERASANLIBS", "[:NO]", "" }, - { LNK_CmdSwitch_InferAsanLibsNo, 1, "INFERASANLIBSNO", "", "", }, - { LNK_CmdSwitch_NotImplemented, 0, "KERNEL", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "KEYCONTAINER", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "KEYFILE", "", "" }, - { LNK_CmdSwitch_LargeAddressAware, 0, "LARGEADDRESSAWARE", "[:NO]", "" }, - { LNK_CmdSwitch_Lib, 0, "LIB", "" }, - { LNK_CmdSwitch_LibPath, 0, "LIBPATH", ":DIR", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "LINKERREPO", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "LINKERREPOTARGET", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "LTCG", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "LTCGOUT", "", "" }, - { LNK_CmdSwitch_Machine, 0, "MACHINE", ":{X64|X86}", "" }, - { LNK_CmdSwitch_Manifest, 0, "MANIFEST", "[:{EMBED[,ID=#]|NO]", "" }, - { LNK_CmdSwitch_ManifestDependency, 1, "MANIFESTDEPENDENCY", ":\"manifest dependency XML string\"", "" }, - { LNK_CmdSwitch_ManifestFile, 0, "MANIFESTFILE", ":FILENAME", "" }, - { LNK_CmdSwitch_ManifestInput, 0, "MANIFESTINPUT", ":FILENAME", "" }, - { LNK_CmdSwitch_ManifestUac, 0, "MANIFESTUAC", ":{NO|{'level'={'asInvoker'|'highestAvailable'|'requireAdministrator'} ['uiAccess'={'true'|'false'}]}}", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "MAP", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "MAPINFO", "", "" }, - { LNK_CmdSwitch_Merge, 1, "MERGE", ":from=to", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "MIDL", "", "" }, - { LNK_CmdSwitch_Natvis, 0, "NATVIS", ":FILENAME", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "NOASSEMBLY", "", "" }, - { LNK_CmdSwitch_NoDefaultLib, 1, "NODEFAULTLIB", ":LIBNAME", "" }, - { LNK_CmdSwitch_NoDefaultLib, 0, "NOD", ":LIBNAME", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "NOENTRY", "", "" }, - { LNK_CmdSwitch_NoExp, 0, "NOEXP", "", ".exp is not supported." }, - { LNK_CmdSwitch_NoImpLib, 0, "NOIMPLIB", "", "" }, - { LNK_CmdSwitch_NoLogo, 0, "NOLOGO", "", "" }, - { LNK_CmdSwitch_NxCompat, 0, "NXCOMPAT", "[:NO]", "" }, - { LNK_CmdSwitch_Opt, 0, "OPT", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "ORDER", "", "" }, - { LNK_CmdSwitch_Out, 0, "OUT", ":FILENAME", "" }, - { LNK_CmdSwitch_Pdb, 0, "PDB", ":FILENAME", "" }, - { LNK_CmdSwitch_PdbAltPath, 0, "PDBALTPATH", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "PDBSTRIPPED", "", "" }, - { LNK_CmdSwitch_PdbPageSize, 0, "PDBPAGESIZE", ":#", "Page size must be power of two" }, - { LNK_CmdSwitch_NotImplemented, 0, "PROFILE", "", "" }, - { LNK_CmdSwitch_Release, 1, "RELEASE", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "SAFESEH", "", "" }, - { LNK_CmdSwitch_Section, 1, "SECTION", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "SOURCELINK", "", "" }, - { LNK_CmdSwitch_Stack, 1, "STACK", ":RESERVE[,COMMIT]", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "STUB", "", "" }, - { LNK_CmdSwitch_SubSystem, 1, "SUBSYSTEM", ":{CONSOLE|NATIVE|WINDOWS}[,#[.##]]", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "SWAPRUN", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "TLBID", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "TLBOUT", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "TIME", "", "" }, - { LNK_CmdSwitch_TsAware, 0, "TSAWARE", "[:NO]", "" }, - { LNK_CmdSwitch_ThrowingNew, 1, "THROWINGNEW", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "USERPROFILE", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "VERBOSE", "", "" }, - { LNK_CmdSwitch_Version, 0, "VERSION", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "WINMD", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "WINMDDELAYSIGN", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "WINMDKEYCONTAINER", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "WINMDKEYFILE", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "WHOLEARCHIVE", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "WX", "", "" }, + { LNK_CmdSwitch_Align, 0, "ALIGN", ":#", "Set section alignment in the virtual address space." }, + { LNK_CmdSwitch_AllowBind, 0, "ALLOWBIND", "[:NO]", "Toggles bind bit in the image header." }, + { LNK_CmdSwitch_AllowIsolation, 0, "ALLOWISOLATION", "[:NO]", "Toggles isolation bit in the image header." }, + { LNK_CmdSwitch_AlternateName, 1, "ALTERNATENAME", ":FROM=TO", "Creates a symbol alias \"FROM=TO\"." }, + { LNK_CmdSwitch_AppContainer, 0, "APPCONTAINER", "[:NO]", "Toggles app container bit in the image header." }, + { LNK_CmdSwitch_Base, 0, "BASE", "{ADDRESS[,SIZE]|@FILENAME,KEY}", "Set default image base address." }, + { LNK_CmdSwitch_Brepro, 0, "BREPRO", "", "No support." }, + { LNK_CmdSwitch_Debug, 0, "DEBUG", "[:{FULL|NONE}]", "Controls debug info level." }, + { LNK_CmdSwitch_DefaultLib, 1, "DEFAULTLIB", ":LIBNAME", "Set default library." }, + { LNK_CmdSwitch_Delay, 0, "DELAY", ":{NOBIND|UNLOAD}", "Controls emission of unload and bind tables." }, + { LNK_CmdSwitch_DelayLoad, 0, "DELAYLOAD", ":DLL", "Delay load DLL." }, + { LNK_CmdSwitch_Dll, 0, "DLL", "", "Link to a DLL." }, + { LNK_CmdSwitch_DisallowLib, 1, "DISALLOWLIB", ":LIBRARY", "Prevents LIBRARY from being linked.", }, + { LNK_CmdSwitch_DynamicBase, 0, "DYNAMICBASE", "[:NO]", "Enable random base address in the linked image." }, + { LNK_CmdSwitch_Entry, 1, "ENTRY", ":FUNCTION", "Name of the entry point symbol." }, + { LNK_CmdSwitch_Export, 1, "EXPORT", ":SYMBOL", "Create an export entry for SYMBOL." }, + { LNK_CmdSwitch_FailIfMismatch, 1, "FAILIFMISMATCH", "{id=value}", "Fails to link if same ids have conflicting values." }, + { LNK_CmdSwitch_FileAlign, 0, "FILEALIGN", ":#", "Set section alignment in the file." }, + { LNK_CmdSwitch_Fixed, 0, "FIXED", "[:NO]", "Load the image at the default base address." }, + { LNK_CmdSwitch_FunctionPadMin, 0, "FUNCTIONPADMIN", ":#", "Minimum function byte size." }, + { LNK_CmdSwitch_Heap, 0, "HEAP", "RESERVE[,COMMIT]", "Set reserve and commit size for the heap." }, + { LNK_CmdSwitch_HighEntropyVa, 0, "HIGHENTROPYVA", "[:NO]", "Indicate that image supports full 64-bit address space ASLR." }, + { LNK_CmdSwitch_Ignore, 0, "IGNORE", ":#", "Ignore a warning." }, + { LNK_CmdSwitch_ImpLib, 0, "IMPLIB", ":FILENAME", "Set file name for the import library." }, + { LNK_CmdSwitch_Include, 1, "INCLUDE", ":SYMBOL", "Force a link against SYMBOL." }, + { LNK_CmdSwitch_InferAsanLibs, 1, "INFERASANLIBS", "[:NO]", "No support." }, + { LNK_CmdSwitch_InferAsanLibsNo, 1, "INFERASANLIBSNO", "", "No support.", }, + { LNK_CmdSwitch_LargeAddressAware, 0, "LARGEADDRESSAWARE", "[:NO]", "For images that can handle addresses > 2GiB." }, + { LNK_CmdSwitch_Lib, 0, "LIB", "", "Turn linker into lib.exe." }, + { LNK_CmdSwitch_LibPath, 0, "LIBPATH", ":DIR", "Add DIR for the linker to search for libraries." }, + { LNK_CmdSwitch_Machine, 0, "MACHINE", ":{X64|X86}", "Image target platform." }, + { LNK_CmdSwitch_Manifest, 0, "MANIFEST", "[:{EMBED[,ID=#]|NO]", "Controls whether the linker should create a side manifest." }, + { LNK_CmdSwitch_ManifestDependency, 1, "MANIFESTDEPENDENCY", ":\"manifest dependency XML string\"", "Add a manifest dependency." }, + { LNK_CmdSwitch_ManifestFile, 0, "MANIFESTFILE", ":FILENAME", "Specifies a manifest file." }, + { LNK_CmdSwitch_ManifestInput, 0, "MANIFESTINPUT", ":FILENAME", "Manifest that is embedded in the image." }, + { LNK_CmdSwitch_ManifestUac, 0, "MANIFESTUAC", ":{NO|{'level'={'asInvoker'|'highestAvailable'|'requireAdministrator'} ['uiAccess'={'true'|'false'}]}}", "Controls UAC information in the manifest." }, + { LNK_CmdSwitch_Merge, 1, "MERGE", ":FROM=TO", "Merges sections." }, + { LNK_CmdSwitch_Natvis, 0, "NATVIS", ":FILENAME", "NATVIS to embed in the PDB." }, + { LNK_CmdSwitch_NoDefaultLib, 1, "NODEFAULTLIB", ":LIBNAME", "Ignore a /DEFAULTLIB." }, + { LNK_CmdSwitch_NoDefaultLib, 0, "NOD", ":LIBNAME", "Alias for /NODEFAULTLIB." }, + { LNK_CmdSwitch_NoExp, 0, "NOEXP", "", "No support." }, + { LNK_CmdSwitch_NoImpLib, 0, "NOIMPLIB", "", "Do not create the import library." }, + { LNK_CmdSwitch_NxCompat, 0, "NXCOMPAT", "[:NO]", "Image is compatible with data execution prevention." }, + { LNK_CmdSwitch_Opt, 0, "OPT", "{REF|ICF}", "Optimizations." }, + { LNK_CmdSwitch_Out, 0, "OUT", ":FILENAME", "File name of the output image." }, + { LNK_CmdSwitch_Pdb, 0, "PDB", ":FILENAME", "File name of the output PDB." }, + { LNK_CmdSwitch_PdbAltPath, 0, "PDBALTPATH", ":PATH", "Alternative output path for the PDB." }, + { LNK_CmdSwitch_PdbPageSize, 0, "PDBPAGESIZE", ":#", "Page size must be power of two." }, + { LNK_CmdSwitch_Release, 1, "RELEASE", "", "Write image checksum." }, + { LNK_CmdSwitch_Stack, 1, "STACK", ":RESERVE[,COMMIT]", "Set reserve and commit size for the stack." }, + { LNK_CmdSwitch_SubSystem, 1, "SUBSYSTEM", ":{CONSOLE|NATIVE|WINDOWS}[,#[.##]]", "Set subsystem for the image." }, + { LNK_CmdSwitch_TsAware, 0, "TSAWARE", "[:NO]", "Image is terminal server aware." }, + { LNK_CmdSwitch_Version, 0, "VERSION", "", "Image version." }, - //- internal switches { LNK_CmdSwitch_Rad_Age, 0, "RAD_AGE", ":#", "Age embeded in EXE and PDB, used to validate incremental build. Default is 1." }, { LNK_CmdSwitch_Rad_AltPchDir, 0, "RAD_ALT_PCH_DIR", ":PATH", "Alternative directory to search for PCH object files." }, { LNK_CmdSwitch_Rad_BuildInfo, 0, "RAD_BUILD_INFO", "", "Print build info and exit." }, - { LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, 0, "RAD_CHECK_UNUSED_DELAY_LOAD_DLL", "[:NO]", "" }, + { LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, 0, "RAD_CHECK_UNUSED_DELAY_LOAD_DLL", "[:NO]", "Check for unused delay load dlls." }, { LNK_CmdSwitch_Rad_Map, 0, "RAD_MAP", ":FILENAME", "Emit file with the output image's layout description." }, { LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, 0, "RAD_MAP_LINES_FOR_UNRESOLVED_SYMBOLS", "[:NO]", "Use debug info to print source file location for unresolved symbol" }, { LNK_CmdSwitch_Rad_MemoryMapFiles, 0, "RAD_MEMORY_MAP_FILES", "[:NO]", "When enabled, files are memory-mapped instead of being read entirely on request." }, { LNK_CmdSwitch_Rad_Debug, 0, "RAD_DEBUG", "[:NO]", "Emit RAD debug info file." }, - { LNK_CmdSwitch_Rad_DebugAltPath, 0, "RAD_DEBUGALTPATH", "", "" }, - { LNK_CmdSwitch_Rad_DebugName, 0, "RAD_DEBUG_NAME", ":FILENAME", "Sets file name for RAD debug info file." }, - { LNK_CmdSwitch_Rad_DelayBind, 0, "RAD_DELAY_BIND", "[:NO]", "" }, - { LNK_CmdSwitch_Rad_DoMerge, 0, "RAD_DO_MERGE", "[:NO]", "" }, - { LNK_CmdSwitch_Rad_EnvLib, 0, "RAD_ENV_LIB", "[:NO]", "" }, - { LNK_CmdSwitch_Rad_Exe, 0, "RAD_EXE", "[:NO]", "" }, - { LNK_CmdSwitch_Rad_Guid, 0, "RAD_GUID", ":{IMAGEBLAKE3|XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX}", "" }, + { LNK_CmdSwitch_Rad_DebugAltPath, 0, "RAD_DEBUGALTPATH", ":PATH", "Alternative output path fof the RDI." }, + { LNK_CmdSwitch_Rad_DebugName, 0, "RAD_DEBUG_NAME", ":FILENAME", "Set file name for RAD debug info file." }, + { LNK_CmdSwitch_Rad_DelayBind, 0, "RAD_DELAY_BIND", "[:NO]", "Emit bindable imports." }, + { LNK_CmdSwitch_Rad_DoMerge, 0, "RAD_DO_MERGE", "[:NO]", "Set whether the linker should execute /MERGE." }, + { LNK_CmdSwitch_Rad_EnvLib, 0, "RAD_ENV_LIB", "[:NO]", "Collect libraries from %%LIB%% and %%LIBPATH%% varibles." }, + { LNK_CmdSwitch_Rad_Exe, 0, "RAD_EXE", "[:NO]", "Set EXE bit in the image header." }, + { LNK_CmdSwitch_Rad_Guid, 0, "RAD_GUID", ":{IMAGEBLAKE3|XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX}", "The image guid that is embeded in the debug info." }, { LNK_CmdSwitch_Rad_LargePages, 0, "RAD_LARGE_PAGES", "[:NO]", "Disabled by default on Windows." }, - { LNK_CmdSwitch_Rad_LinkVer, 0, "RAD_LINK_VER", ":##,##", "" }, - { LNK_CmdSwitch_Rad_Log, 0, "RAD_LOG", ":{ALL,INPUT_OBJ,INPUT_LIB,IO,LINK_STATS,TIMERS}", "" }, - { LNK_CmdSwitch_Rad_MtPath, 0, "RAD_MT_PATH", ":EXEPATH", "Exe path to manifest tool, default: " LNK_MANIFEST_MERGE_TOOL_NAME }, - { LNK_CmdSwitch_Rad_OsVer, 0, "RAD_OS_VER", ":##,##", "" }, + { LNK_CmdSwitch_Rad_LinkVer, 0, "RAD_LINK_VER", ":##,##", "Linker version." }, + { LNK_CmdSwitch_Rad_Log, 0, "RAD_LOG", ":{ALL,INPUT_OBJ,INPUT_LIB,IO,LINK_STATS,TIMERS}", "Loggers." }, + { LNK_CmdSwitch_Rad_MtPath, 0, "RAD_MT_PATH", ":EXEPATH", "Exe path to the manifest tool (default: " LNK_MANIFEST_MERGE_TOOL_NAME ")" }, + { LNK_CmdSwitch_Rad_OsVer, 0, "RAD_OS_VER", ":##,##", "OS version." }, { LNK_CmdSwitch_Rad_PageSize, 0, "RAD_PAGE_SIZE", ":#", "Must be power of two." }, - { LNK_CmdSwitch_Rad_PathStyle, 0, "RAD_PATH_STYLE", ":{WindowsAbsolute|UnixAbsolute}", "" }, + { LNK_CmdSwitch_Rad_PathStyle, 0, "RAD_PATH_STYLE", ":{WindowsAbsolute|UnixAbsolute}", "Set path style in the PDB." }, { LNK_CmdSwitch_Rad_PdbHashTypeNameLength, 0, "RAD_PDB_HASH_TYPE_NAME_LENGTH", ":#", "Number of hash bytes to use to replace type name. Default 8 bytes (Max 16)." }, { LNK_CmdSwitch_Rad_PdbHashTypeNameMap, 0, "RAD_PDB_HASH_TYPE_NAME_MAP", ":FILENAME", "Produce map file with hash -> type name mappings." }, { LNK_CmdSwitch_Rad_PdbHashTypeNames, 0, "RAD_PDB_HASH_TYPE_NAMES", ":{NONE|LENIENT|FULL}", "Replace type names in LF_STRUCTURE and LF_CLASS with hashes." }, - { LNK_CmdSwitch_Rad_RemoveSection, 0, "RAD_REMOVE_SECTION", ":NAME", "Removes a section from output image." }, + { LNK_CmdSwitch_Rad_RemoveSection, 0, "RAD_REMOVE_SECTION", ":NAME", "Removes a section from the image." }, { LNK_CmdSwitch_Rad_SharedThreadPool, 0, "RAD_SHARED_THREAD_POOL", "[:STRING]", "Default value \"" LNK_DEFAULT_THREAD_POOL_NAME "\"" }, - { LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, 0, "RAD_SHARED_THREAD_POOL_MAX_WORKERS", ":#", "Sets maximum number of workers in a thread pool." }, - { LNK_CmdSwitch_Rad_SuppressError, 0, "RAD_SUPPRESS_ERROR", ":#", "" }, - { LNK_CmdSwitch_Rad_TargetOs, 0, "RAD_TARGET_OS", ":{WINDOWS,LINUX,MAC}" }, + { LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, 0, "RAD_SHARED_THREAD_POOL_MAX_WORKERS", ":#", "Set maximum number of workers in a thread pool." }, + { LNK_CmdSwitch_Rad_Ignore, 0, "RAD_IGNORE", ":#", "Ignore the specified RAD linker warning." }, { LNK_CmdSwitch_Rad_WriteTempFiles, 0, "RAD_WRITE_TEMP_FILES", "[:NO]", "When speicifed linker writes image and debug info to temporary files and renames after link is done." }, { LNK_CmdSwitch_Rad_TimeStamp, 0, "RAD_TIME_STAMP", ":#", "Time stamp embeded in EXE and PDB." }, { LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, 0, "RAD_UNRESOLVED_SYMBOL_LIMIT", ":#", "Limits number of unresolved symbol errors linker reports." }, { LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, 0, "RAD_UNRESOLVED_SYMBOL_REF_LIMIT", ":#", "Limit number of unresolved symbol references linker reports." }, { LNK_CmdSwitch_Rad_Version, 0, "RAD_VERSION", "", "Print version and exit." }, - { LNK_CmdSwitch_Rad_Workers, 0, "RAD_WORKERS", ":#", "Sets number of workers created in the pool. Number is capped at 1024. When /RAD_SHARED_THREAD_POOL is specified this number cant exceed /RAD_SHARED_THREAD_POOL_MAX_WORKERS." }, + { LNK_CmdSwitch_Rad_Workers, 0, "RAD_WORKERS", ":#", "Set number of workers created in the pool. Number is capped at 1024. When /RAD_SHARED_THREAD_POOL is specified this number cant exceed /RAD_SHARED_THREAD_POOL_MAX_WORKERS." }, { LNK_CmdSwitch_Help, 0, "HELP", "", "" }, { LNK_CmdSwitch_Help, 0, "?", "", "" }, @@ -454,6 +388,24 @@ lnk_try_parse_u64(String8 string, LNK_ParseU64Flags flags, U64 *value_out) return 1; } +internal B32 + +lnk_try_parse_s64(String8 string, LNK_ParseU64Flags flags, S64 *value_out) +{ + if (try_s64_from_str8_c_rules(string, value_out)) { + if (flags & LNK_ParseU64Flag_CheckUnder32bit) { + if (*value_out > max_S64) { + return 0; + } + } + if (flags & LNK_ParseU64Flag_CheckPow2) { + if (!IsPow2(*value_out)) { + return 0; + } + } + } + return 1; +} internal B32 lnk_cmd_switch_parse_u64(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U64 *value_out, LNK_ParseU64Flags flags) @@ -493,6 +445,19 @@ lnk_cmd_switch_parse_u64_list(Arena *arena, LNK_Obj *obj, LNK_CmdSwitchType cmd_ return 1; } +internal B32 +lnk_cmd_switch_parse_s64_list(Arena *arena, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, S64List *list_out, LNK_ParseU64Flags flags) +{ + for EachNode(string_n, String8Node, value_strings.first) { + S64 v; + if (!lnk_try_parse_s64(string_n->string, flags, &v)) { + return 0; + } + s64_list_push(arena, list_out, v); + } + return 1; +} + internal B32 lnk_cmd_switch_parse_flag(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, LNK_SwitchState *value_out) { @@ -1022,33 +987,67 @@ lnk_print_help(void) { Temp scratch = scratch_begin(0,0); - fprintf(stdout, "--- Help -------------------------------------------------------\n"); + static char spaces[] = " "; + U64 name_max_size = 0; + U64 args_max_size = 0; + U64 desc_max_size = 0; + for EachElement(i, g_cmd_switch_map) { + name_max_size = Max(name_max_size, strlen(g_cmd_switch_map[i].name)); + args_max_size = Max(args_max_size, strlen(g_cmd_switch_map[i].args)); + desc_max_size = Max(desc_max_size, strlen(g_cmd_switch_map[i].desc)); + } + + fprintf(stdout, "--- Help -------------------------------------------------------------------------------------------------------------------\n"); fprintf(stdout, " %s\n", BUILD_TITLE_STRING_LITERAL); fprintf(stdout, "\n"); fprintf(stdout, " Usage: radlink.exe [Options] [Files] [@rsp]\n"); fprintf(stdout, "\n"); fprintf(stdout, " Options:\n"); - for (U64 i = 0; i < ArrayCount(g_cmd_switch_map); ++i) { + U64 option_indent_size = 4; + U64 option_name_max_size = 60; + for EachElement(i, g_cmd_switch_map) { Temp temp = temp_begin(scratch.arena); + U64 name_size = strlen(g_cmd_switch_map[i].name); + U64 args_size = strlen(g_cmd_switch_map[i].args); + U64 desc_size = strlen(g_cmd_switch_map[i].desc); + char *name = g_cmd_switch_map[i].name; char *args = g_cmd_switch_map[i].args; char *desc = g_cmd_switch_map[i].desc; LNK_CmdSwitchType type = g_cmd_switch_map[i].type; - if (strcmp(name, "") == 0 || - strcmp(name, "NOT_IMPLEMENTED") == 0 || - type == LNK_CmdSwitch_Help) { + if (strcmp(name, "") == 0 || strcmp(name, "NOT_IMPLEMENTED") == 0 || type == LNK_CmdSwitch_Help) { continue; } - String8 name_args = push_str8f(temp.arena, "%s%s", name, args); + String8List fmt = {0}; - fprintf(stdout, " /%-32.*s %s%s\n", - str8_varg(name_args), - desc, - type == LNK_CmdSwitch_NotImplemented ? "Not Implemented" : ""); + str8_list_pushf(temp.arena, &fmt, "%.*s", option_indent_size, spaces); + + str8_list_pushf(temp.arena, &fmt, "/"); + + B32 put_option_args_on_new_line = name_size + args_size > option_name_max_size; + if (put_option_args_on_new_line) { + str8_list_pushf(temp.arena, &fmt, "%s%s", name, args[0] == ':' ? ":" : ""); + } else { + str8_list_pushf(temp.arena, &fmt, "%s%s", name, args); + } + + U64 desc_indent_size = fmt.total_size < option_name_max_size ? option_name_max_size - fmt.total_size : 0; + str8_list_pushf(temp.arena, &fmt, "%.*s", desc_indent_size, spaces); + + str8_list_pushf(temp.arena, &fmt, "%s", desc); + str8_list_pushf(temp.arena, &fmt, "\n"); + + if (put_option_args_on_new_line) { + str8_list_pushf(temp.arena, &fmt, "%.*s", Min(option_name_max_size, option_indent_size + name_size + 1), spaces); + str8_list_pushf(temp.arena, &fmt, "%s\n", args[0] == ':' ? args + 1 : args); + } + + String8 line = str8_list_join(temp.arena, &fmt, 0); + fprintf(stdout, "%.*s", str8_varg(line)); temp_end(temp); } @@ -1219,10 +1218,6 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; - case LNK_CmdSwitch_Brepro: { - // not supported -- ignore - } break; - case LNK_CmdSwitch_Debug: { if (value_strings.node_count == 0) { config->debug_mode = LNK_DebugMode_Full; @@ -1285,14 +1280,6 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->dll_characteristics, PE_DllCharacteristic_DYNAMIC_BASE); } break; - case LNK_CmdSwitch_Dump: { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unsupported switch; binary dump is done by passing /DUMP to link.exe"); - } break; - - case LNK_CmdSwitch_D2: { - // not supported -- ignore - } break; - case LNK_CmdSwitch_Entry: { String8 new_entry_point_name = {0}; lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &new_entry_point_name); @@ -1305,10 +1292,6 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List config->entry_point_name = new_entry_point_name; } break; - case LNK_CmdSwitch_ErrorReport: { - // not supported -- ignore - } break; - case LNK_CmdSwitch_Export: { PE_ExportParse export_parse = {0}; if (lnk_parse_export_directive_ex(config->arena, value_strings, obj, &export_parse)) { @@ -1351,14 +1334,6 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; - case LNK_CmdSwitch_Experimental: { - // not supported - } break; - - case LNK_CmdSwitch_FastFail: { - // do nothing - } break; - case LNK_CmdSwitch_FailIfMismatch: { if (value_strings.node_count != 1) { lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); @@ -1440,13 +1415,13 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List if (lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &error_code, 0)) { switch (error_code) { case LNK_MsWarningCode_UnsuedDelayLoadDll: { - lnk_suppress_error(LNK_Warning_UnusedDelayLoadDll); + lnk_ignore_error(LNK_Warning_UnusedDelayLoadDll); } break; case LNK_MsWarningCode_MissingExternalTypeServer: { - lnk_suppress_error(LNK_Warning_MissingExternalTypeServer); + lnk_ignore_error(LNK_Warning_MissingExternalTypeServer); } break; case LNK_MsWarningCode_SectionFlagsConflict: { - lnk_suppress_error(LNK_Warning_SectionFlagsConflict); + lnk_ignore_error(LNK_Warning_SectionFlagsConflict); } break; default: { lnk_not_implemented("TODO: /IGNORE:%llu", error_code); @@ -1465,15 +1440,6 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; - case LNK_CmdSwitch_Incremental: { - LNK_SwitchState state; - if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) { - if (state == LNK_SwitchState_Yes) { - lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "incremental linkage is not supported"); - } - } - } break; - case LNK_CmdSwitch_LargeAddressAware: { lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->file_characteristics, PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE); } break; @@ -1673,10 +1639,6 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List config->build_imp_lib = 0; } break; - case LNK_CmdSwitch_NoLogo: { - // we don't print logo - } break; - case LNK_CmdSwitch_NxCompat: { lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->dll_characteristics, PE_DllCharacteristic_NX_COMPAT); } break; @@ -2036,30 +1998,26 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; - case LNK_CmdSwitch_Rad_SuppressError: { - U64List error_code_list = {0}; - if (lnk_cmd_switch_parse_u64_list(scratch.arena, obj, cmd_switch, value_strings, &error_code_list, 0)) { - for (U64Node *error_code_n = error_code_list.first; error_code_n != 0; error_code_n = error_code_n->next) { - if (error_code_n->data < LNK_Error_Count) { - lnk_suppress_error(error_code_n->data); - } else { - lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "unknown error code %llu", error_code_n->data); - } - } + case LNK_CmdSwitch_Rad_Ignore: { + S64List error_code_list = {0}; + if ( ! lnk_cmd_switch_parse_s64_list(scratch.arena, obj, cmd_switch, value_strings, &error_code_list, 0)) { + lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "failed to parse input code"); + break; } - } break; - case LNK_CmdSwitch_Rad_TargetOs: { - if (value_strings.node_count == 1) { - String8 os_string = str8_list_first(&value_strings); - OperatingSystem target_os = operating_system_from_string(os_string); - if (target_os != OperatingSystem_Null) { - config->target_os = target_os; - } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unknown operating system type %S", os_string); + for EachNode(error_code_n, S64Node, error_code_list.first) { + S64 code = error_code_n->v; + + if (abs_s64(code) >= LNK_Error_Count) { + lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "unknown error code %llu", (U64)abs_s64(code)); + continue; + } + + if (code > 0) { + lnk_ignore_error(code); + } else if (code < 0) { + lnk_activate_error(abs_s64(code)); } - } else { - lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "expected 1 parameter"); } } break; diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 304ade0b..401a578f 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -42,25 +42,23 @@ typedef enum LNK_CmdSwitch_DefaultLib, LNK_CmdSwitch_Delay, LNK_CmdSwitch_DelayLoad, + LNK_CmdSwitch_DisallowLib, LNK_CmdSwitch_Dll, LNK_CmdSwitch_DynamicBase, - LNK_CmdSwitch_Dump, - LNK_CmdSwitch_D2, LNK_CmdSwitch_Entry, - LNK_CmdSwitch_ErrorReport, - LNK_CmdSwitch_Experimental, LNK_CmdSwitch_Export, LNK_CmdSwitch_FailIfMismatch, - LNK_CmdSwitch_FastFail, LNK_CmdSwitch_FileAlign, LNK_CmdSwitch_Fixed, LNK_CmdSwitch_FunctionPadMin, + LNK_CmdSwitch_Force, LNK_CmdSwitch_Heap, LNK_CmdSwitch_HighEntropyVa, LNK_CmdSwitch_Ignore, LNK_CmdSwitch_ImpLib, LNK_CmdSwitch_Include, - LNK_CmdSwitch_Incremental, + LNK_CmdSwitch_InferAsanLibs, + LNK_CmdSwitch_InferAsanLibsNo, LNK_CmdSwitch_LargeAddressAware, LNK_CmdSwitch_Lib, LNK_CmdSwitch_LibPath, @@ -75,81 +73,18 @@ typedef enum LNK_CmdSwitch_NoDefaultLib, LNK_CmdSwitch_NoExp, LNK_CmdSwitch_NoImpLib, - LNK_CmdSwitch_NoLogo, LNK_CmdSwitch_NxCompat, LNK_CmdSwitch_Opt, LNK_CmdSwitch_Out, LNK_CmdSwitch_Pdb, LNK_CmdSwitch_PdbAltPath, LNK_CmdSwitch_PdbPageSize, + LNK_CmdSwitch_Release, LNK_CmdSwitch_Stack, LNK_CmdSwitch_SubSystem, LNK_CmdSwitch_Time, LNK_CmdSwitch_TsAware, - - // -- NOT Implemented: - - LNK_CmdSwitch_AssemblyDebug, - LNK_CmdSwitch_AssemblyLinkResource, - LNK_CmdSwitch_AssemblyModule, - LNK_CmdSwitch_AssemblyResource, - LNK_CmdSwitch_ClrImageType, - LNK_CmdSwitch_ClrLoaderOptimization, - LNK_CmdSwitch_ClrSupportLastError, - LNK_CmdSwitch_ClrThreadAttribute, - LNK_CmdSwitch_ClrRunManagedCodeCheck, - LNK_CmdSwitch_ClrUnmanagedCheck, - LNK_CmdSwitch_Def, - LNK_CmdSwitch_DelaySign, - LNK_CmdSwitch_DependentLoadFlag, - LNK_CmdSwitch_Driver, - LNK_CmdSwitch_DisallowLib, - LNK_CmdSwitch_EditAndContinue, - LNK_CmdSwitch_EmitVolatileMetadata, - LNK_CmdSwitch_ExportAdmin, - LNK_CmdSwitch_FastGenProfile, - LNK_CmdSwitch_Force, - LNK_CmdSwitch_Guard, - LNK_CmdSwitch_GuardSym, - LNK_CmdSwitch_GenProfile, - LNK_CmdSwitch_IdlOut, - LNK_CmdSwitch_IgnoreIdl, - LNK_CmdSwitch_Ilk, - LNK_CmdSwitch_IntegrityCheck, - LNK_CmdSwitch_InferAsanLibs, - LNK_CmdSwitch_InferAsanLibsNo, - LNK_CmdSwitch_Kernel, - LNK_CmdSwitch_KeyContainer, - LNK_CmdSwitch_KeyFile, - LNK_CmdSwitch_LinkerRepro, - LNK_CmdSwitch_LinkerReproTarget, - LNK_CmdSwitch_Ltcg, - LNK_CmdSwitch_LtcgOut, - LNK_CmdSwitch_Map, - LNK_CmdSwitch_MapInfo, - LNK_CmdSwitch_Midl, - LNK_CmdSwitch_NoAssembly, - LNK_CmdSwitch_NoEntry, - LNK_CmdSwitch_Order, - LNK_CmdSwitch_PdbStripped, - LNK_CmdSwitch_Profile, - LNK_CmdSwitch_Release, - LNK_CmdSwitch_SafeSeh, - LNK_CmdSwitch_Section, - LNK_CmdSwitch_SourceLink, - LNK_CmdSwitch_Stub, - LNK_CmdSwitch_SwapRun, - LNK_CmdSwitch_TlbId, - LNK_CmdSwitch_ThrowingNew, - LNK_CmdSwitch_UserProfile, - LNK_CmdSwitch_Verbose, LNK_CmdSwitch_Version, - LNK_CmdSwitch_Winmd, - LNK_CmdSwitch_WinmdDelaySign, - LNK_CmdSwitch_WinmdKeyContainer, - LNK_CmdSwitch_WinmdKeyFile, - LNK_CmdSwitch_WholeArchive, - LNK_CmdSwitch_Wx, LNK_CmdSwitch_Rad_Age, LNK_CmdSwitch_Rad_AltPchDir, @@ -180,8 +115,7 @@ typedef enum LNK_CmdSwitch_Rad_RemoveSection, LNK_CmdSwitch_Rad_SharedThreadPool, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, - LNK_CmdSwitch_Rad_SuppressError, - LNK_CmdSwitch_Rad_TargetOs, + LNK_CmdSwitch_Rad_Ignore, LNK_CmdSwitch_Rad_TimeStamp, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, @@ -361,7 +295,6 @@ typedef struct LNK_Config Version link_ver; Version os_ver; Version image_ver; - OperatingSystem target_os; COFF_MachineType machine; PE_WindowsSubsystem subsystem; Version subsystem_ver; diff --git a/src/linker/lnk_error.c b/src/linker/lnk_error.c index f06a3b7e..6a1272ef 100644 --- a/src/linker/lnk_error.c +++ b/src/linker/lnk_error.c @@ -1,9 +1,9 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -static LNK_ErrorMode g_error_mode_arr[LNK_Error_Count]; +static LNK_ErrorMode g_error_mode_arr [LNK_Error_Count]; static LNK_ErrorCodeStatus g_error_code_status_arr[LNK_Error_Count]; -static B32 g_log_status[LNK_Log_Count]; +static B32 g_log_status [LNK_Log_Count]; internal void lnk_exit(int code) @@ -40,12 +40,7 @@ lnk_string_from_error_mode(LNK_ErrorMode mode) internal void lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args) { - if (g_error_mode_arr[code] == LNK_ErrorMode_Ignore) { - return; - } - if (lnk_is_error_code_ignored(code)) { - return; - } + if (lnk_is_error_code_ignored(code)) { return; } Temp scratch = scratch_begin(0,0); String8 message = push_str8fv(scratch.arena, fmt, args); @@ -118,11 +113,17 @@ lnk_supplement_error_list(String8List list) } internal void -lnk_suppress_error(LNK_ErrorCode code) +lnk_ignore_error(LNK_ErrorCode code) { g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Ignore; } +internal void +lnk_activate_error(LNK_ErrorCode code) +{ + g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Active; +} + internal LNK_ErrorCodeStatus lnk_get_error_code_status(LNK_ErrorCode code) { diff --git a/src/linker/lnk_error.h b/src/linker/lnk_error.h index ced3a142..d7a58531 100644 --- a/src/linker/lnk_error.h +++ b/src/linker/lnk_error.h @@ -126,7 +126,8 @@ internal void lnk_error(LNK_ErrorCode code, char *fmt, ...); internal void lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...); internal void lnk_supplement_error(char *fmt, ...); internal void lnk_supplement_error_list(String8List list); -internal void lnk_suppress_error(LNK_ErrorCode code); +internal void lnk_ignore_error(LNK_ErrorCode code); +internal void lnk_activate_error(LNK_ErrorCode code); #define lnk_is_error_code_active(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Active) #define lnk_is_error_code_ignored(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Ignore) diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index 1125c884..02853e43 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -250,7 +250,7 @@ lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, LNK_IO_Flags // assign offsets into file buffer U64 *off_arr = push_array_no_zero(scratch.arena, U64, path_arr.count); MemoryCopyTyped(off_arr, reader.size_arr, path_arr.count); - counts_to_offsets_array_u64(path_arr.count, off_arr); + u64_array_counts_to_offsets(path_arr.count, off_arr); reader.io_flags = io_flags; reader.data_arr = str8_array_reserve(arena, path_arr.count); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 28ea814c..d1c80b5d 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -2350,7 +2350,7 @@ gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_ U64 buffer_size = sum_array_u64(gsi->bucket_count, serial_task.bucket_size_arr); serial_task.buffer = push_array_no_zero(arena, U8, buffer_size); serial_task.bucket_off_arr = push_array_copy_u64(scratch.arena, serial_task.bucket_size_arr, gsi->bucket_count); - counts_to_offsets_array_u64(gsi->bucket_count, serial_task.bucket_off_arr); + u64_array_counts_to_offsets(gsi->bucket_count, serial_task.bucket_off_arr); // prepare GSI records serial_task.sort_record_arr_arr = push_array_no_zero(scratch.arena, PDB_GsiSortRecord *, gsi->bucket_count); diff --git a/src/linker/rdi/rdi_builder.c b/src/linker/rdi/rdi_builder.c index 113d4b82..0f91a97d 100644 --- a/src/linker/rdi/rdi_builder.c +++ b/src/linker/rdi/rdi_builder.c @@ -2072,9 +2072,9 @@ THREAD_POOL_TASK_FUNC(rdib_string_map_radix_sort_element_idx_task) ProfEnd(); ProfBegin("Histogram Counts -> Offsets"); - counts_to_offsets_array_u32(ArrayCount(histo_bot), &histo_bot[0]); - counts_to_offsets_array_u32(ArrayCount(histo_mid), &histo_mid[0]); - counts_to_offsets_array_u32(ArrayCount(histo_top), &histo_top[0]); + u32_array_counts_to_offsets(ArrayCount(histo_bot), &histo_bot[0]); + u32_array_counts_to_offsets(ArrayCount(histo_mid), &histo_mid[0]); + u32_array_counts_to_offsets(ArrayCount(histo_top), &histo_top[0]); ProfEnd(); ProfBegin("Sort Bot"); @@ -2140,7 +2140,7 @@ rdib_string_map_sort_buckets(TP_Context *tp, RDIB_StringMapBucket **buckets, U64 #endif ProfBegin("Chunk Histo -> Offsets"); - task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl); + task.chunk_offsets = u32_array_offsets_from_counts(scratch.arena, task.chunk_histo, chunk_idx_opl); ProfEnd(); ProfBegin("Sort on chunk index"); @@ -2148,7 +2148,7 @@ rdib_string_map_sort_buckets(TP_Context *tp, RDIB_StringMapBucket **buckets, U64 ProfEnd(); ProfBegin("Sort on element index"); - task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl); + task.chunk_offsets = u32_array_offsets_from_counts(scratch.arena, task.chunk_histo, chunk_idx_opl); task.ranges = tp_divide_work(scratch.arena, chunk_idx_opl, tp->worker_count); tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_radix_sort_element_idx_task, &task); ProfEnd(); @@ -2698,9 +2698,9 @@ THREAD_POOL_TASK_FUNC(rdib_index_run_map_radix_sort_element_idx_task) ProfEnd(); ProfBegin("Histogram Counts -> Offsets"); - counts_to_offsets_array_u32(ArrayCount(histo_bot), &histo_bot[0]); - counts_to_offsets_array_u32(ArrayCount(histo_mid), &histo_mid[0]); - counts_to_offsets_array_u32(ArrayCount(histo_top), &histo_top[0]); + u32_array_counts_to_offsets(ArrayCount(histo_bot), &histo_bot[0]); + u32_array_counts_to_offsets(ArrayCount(histo_mid), &histo_mid[0]); + u32_array_counts_to_offsets(ArrayCount(histo_top), &histo_top[0]); ProfEnd(); ProfBegin("Sort Bot"); @@ -2766,7 +2766,7 @@ rdib_index_run_map_sort_buckets(TP_Context *tp, RDIB_IndexRunBucket **buckets, U #endif ProfBegin("Chunk Histo -> Offsets"); - task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl); + task.chunk_offsets = u32_array_offsets_from_counts(scratch.arena, task.chunk_histo, chunk_idx_opl); ProfEnd(); ProfBegin("Sort on chunk index"); @@ -2774,7 +2774,7 @@ rdib_index_run_map_sort_buckets(TP_Context *tp, RDIB_IndexRunBucket **buckets, U ProfEnd(); ProfBegin("Sort on element index"); - task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl); + task.chunk_offsets = u32_array_offsets_from_counts(scratch.arena, task.chunk_histo, chunk_idx_opl); task.ranges = tp_divide_work(scratch.arena, chunk_idx_opl, tp->worker_count); tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_radix_sort_element_idx_task, &task); ProfEnd(); @@ -3253,9 +3253,9 @@ rdib_sort_procs_radix_32(RDIB_Procedure **v, U64 count) ProfEnd(); ProfBegin("Counts -> Offsets"); - counts_to_offsets_array_u32(ArrayCount(count_8lo), count_8lo); - counts_to_offsets_array_u32(ArrayCount(count_8hi), count_8hi); - counts_to_offsets_array_u32(ArrayCount(count_16), count_16 ); + u32_array_counts_to_offsets(ArrayCount(count_8lo), count_8lo); + u32_array_counts_to_offsets(ArrayCount(count_8hi), count_8hi); + u32_array_counts_to_offsets(ArrayCount(count_16), count_16 ); ProfEnd(); ProfBegin("Order 8 Lo"); @@ -3357,13 +3357,13 @@ rdib_data_from_vmap(Arena *arena, U64 range_count, RDIB_VMapRange *ranges) ++voff_count2[voff_digit2]; } - counts_to_offsets_array_u32((1 << size_bit_count0), size_count0); - counts_to_offsets_array_u32((1 << size_bit_count1), size_count1); - counts_to_offsets_array_u32((1 << size_bit_count2), size_count2); + u32_array_counts_to_offsets((1 << size_bit_count0), size_count0); + u32_array_counts_to_offsets((1 << size_bit_count1), size_count1); + u32_array_counts_to_offsets((1 << size_bit_count2), size_count2); - counts_to_offsets_array_u32((1 << voff_bit_count0), voff_count0); - counts_to_offsets_array_u32((1 << voff_bit_count1), voff_count1); - counts_to_offsets_array_u32((1 << voff_bit_count2), voff_count2); + u32_array_counts_to_offsets((1 << voff_bit_count0), voff_count0); + u32_array_counts_to_offsets((1 << voff_bit_count1), voff_count1); + u32_array_counts_to_offsets((1 << voff_bit_count2), voff_count2); // // Sort on range size (high to low) @@ -4517,7 +4517,7 @@ THREAD_POOL_TASK_FUNC(rdib_build_src_line_map_task) // than 4GiB in line table anyway. radsort(ln_voff_arr, ln_voff_count, pair_u32_is_before_v0); } else { - u32_pair_radix_sort(ln_voff_count, ln_voff_arr); + u32_pair_sort_radix(ln_voff_count, ln_voff_arr); } ProfEnd(); From 1f51c6f25bf8a4a664d9aca4d6fb587b4f5b1c28 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 13 Feb 2026 20:59:26 -0800 Subject: [PATCH 201/850] ubsan cleanup --- src/base/base_core.c | 60 +++++++++++--- src/base/base_core.h | 33 ++++++-- src/codeview/codeview_parse.c | 2 +- .../dwrite/font_provider_dwrite.c | 2 +- src/font_provider/font_provider.h | 2 +- src/linker/base_ext/base_bit_array.c | 6 +- src/linker/codeview_ext/codeview.c | 45 +++++----- src/linker/codeview_ext/codeview.h | 10 ++- src/linker/lnk.c | 17 ++-- src/linker/lnk_debug_info.c | 82 ++++++++++--------- src/linker/lnk_debug_info.h | 4 +- src/linker/lnk_lib.h | 2 +- src/linker/pdb_ext/pdb_builder.c | 2 +- src/metagen/metagen_base/metagen_base_core.h | 8 +- src/pdb/pdb.c | 13 ++- src/third_party/stb/stb_sprintf.h | 2 +- 16 files changed, 180 insertions(+), 110 deletions(-) diff --git a/src/base/base_core.c b/src/base/base_core.c index 79655432..8988f41e 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -79,19 +79,21 @@ u64_up_to_pow2(U64 x){ } internal S32 -extend_sign32(U32 x, U32 size){ - U32 high_bit = size * 8; - U32 shift = 32 - high_bit; - S32 result = ((S32)x << shift) >> shift; - return result; +extend_sign32(U32 x, U32 size) +{ + U32 n = size * 8; + U32 m = (U32)1 << (n - 1); + S32 r = (S32)((x ^ m) - m); + return r; } internal S64 -extend_sign64(U64 x, U64 size){ - U64 high_bit = size * 8; - U64 shift = 64 - high_bit; - S64 result = ((S64)x << shift) >> shift; - return result; +extend_sign64(U64 x, U64 size) +{ + U64 n = size * 8; + U64 m = (U64)1 << (n - 1); + S64 r = (S64)((x ^ m) - m); + return r; } internal F32 @@ -286,6 +288,44 @@ memory_is_zero(void *ptr, U64 size) return result; } +internal void UBSAN_NO_ALIGN +memory_write32(void *ptr, U32 v) +{ + MemoryCopy(ptr, &v, sizeof(v)); +} + +internal U8 UBSAN_NO_ALIGN +memory_read8(void *ptr) +{ + U8 result; + MemoryCopy(&result, ptr, sizeof(result)); + return result; +} + +internal U16 UBSAN_NO_ALIGN +memory_read16(void *ptr) +{ + U16 result; + MemoryCopy(&result, ptr, sizeof(result)); + return result; +} + +internal U32 UBSAN_NO_ALIGN +memory_read32(void *ptr) +{ + U32 result; + MemoryCopy(&result, ptr, sizeof(result)); + return result; +} + +internal U64 UBSAN_NO_ALIGN +memory_read64(void *ptr) +{ + U64 result; + MemoryCopy(&result, ptr, sizeof(result)); + return result; +} + //////////////////////////////// //~ rjf: Text 2D Coordinate/Range Functions diff --git a/src/base/base_core.h b/src/base/base_core.h index aa00a278..ba7d20cc 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -7,12 +7,13 @@ //////////////////////////////// //~ rjf: Foreign Includes -#include #include +#include +#include +#include +#include #include #include -#include -#include //////////////////////////////// //~ rjf: Third Party Includes @@ -181,8 +182,9 @@ //~ rjf: Member Offsets #define Member(T,m) (((T*)0)->m) -#define OffsetOf(T,m) IntFromPtr(&Member(T,m)) +#define OffsetOf(T,m) offsetof(T, m) #define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off))) +#define MemberFromPtr(T,ptr,m) (void*)((((U8 *)ptr)+OffsetOf(T,m))) #define CastFromMember(T,m,ptr) (T*)(((U8*)ptr) - OffsetOf(T,m)) //////////////////////////////// @@ -366,9 +368,9 @@ CheckNil(nil,p) ? \ #if COMPILER_MSVC # if defined(__SANITIZE_ADDRESS__) # define ASAN_ENABLED 1 -# define NO_ASAN __declspec(no_sanitize_address) +# define ASAN_NO_ADDR __declspec(no_sanitize_address) # else -# define NO_ASAN +# define UBSAN_NO_ALIGN # endif #elif COMPILER_CLANG # if defined(__has_feature) @@ -376,9 +378,15 @@ CheckNil(nil,p) ? \ # define ASAN_ENABLED 1 # endif # endif -# define NO_ASAN __attribute__((no_sanitize("address"))) -#else -# define NO_ASAN +# define ASAN_NO_ADDR __attribute__((no_sanitize("address"))) +# define UBSAN_NO_ALIGN __attribute__((no_sanitize("alignment"))) +#endif + +#ifndef ASAN_NO_ADDR +# define ASAN_NO_ADDR +#endif +#ifndef UBSAN_NO_ALIGN +# define UBSAN_NO_ALIGN #endif #if ASAN_ENABLED @@ -1001,6 +1009,13 @@ internal F32 sign_from_side_F32(Side side); internal B32 memory_is_zero(void *ptr, U64 size); +internal void memory_write32(void *ptr, U32 v); + +internal U8 memory_read8(void *ptr); +internal U16 memory_read16(void *ptr); +internal U32 memory_read32(void *ptr); +internal U64 memory_read64(void *ptr); + //////////////////////////////// //~ rjf: Text 2D Coordinate/Range Functions diff --git a/src/codeview/codeview_parse.c b/src/codeview/codeview_parse.c index bab4371f..a460de63 100644 --- a/src/codeview/codeview_parse.c +++ b/src/codeview/codeview_parse.c @@ -29,7 +29,7 @@ cv_numeric_from_data_range(U8 *first, U8 *opl) CV_NumericParsed result = {0}; if(first + 2 <= opl) { - U16 x = *(U16*)first; + U16 x = memory_read16(first); if(x < 0x8000) { result.kind = CV_NumericKind_USHORT; diff --git a/src/font_provider/dwrite/font_provider_dwrite.c b/src/font_provider/dwrite/font_provider_dwrite.c index 66c4a235..91dbd89e 100644 --- a/src/font_provider/dwrite/font_provider_dwrite.c +++ b/src/font_provider/dwrite/font_provider_dwrite.c @@ -447,7 +447,7 @@ fp_metrics_from_font(FP_Handle handle) return result; } -fp_hook NO_ASAN FP_RasterResult +fp_hook ASAN_NO_ADDR FP_RasterResult fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, String8 string) { ProfBeginFunction(); diff --git a/src/font_provider/font_provider.h b/src/font_provider/font_provider.h index 80fd608d..3f010552 100644 --- a/src/font_provider/font_provider.h +++ b/src/font_provider/font_provider.h @@ -54,6 +54,6 @@ fp_hook FP_Handle fp_font_open(String8 path); fp_hook FP_Handle fp_font_open_from_static_data_string(String8 *data_ptr); fp_hook void fp_font_close(FP_Handle handle); fp_hook FP_Metrics fp_metrics_from_font(FP_Handle font); -fp_hook NO_ASAN FP_RasterResult fp_raster(Arena *arena, FP_Handle font, F32 size, FP_RasterFlags flags, String8 string); +fp_hook ASAN_NO_ADDR FP_RasterResult fp_raster(Arena *arena, FP_Handle font, F32 size, FP_RasterFlags flags, String8 string); #endif // FONT_PROVIDER_H diff --git a/src/linker/base_ext/base_bit_array.c b/src/linker/base_ext/base_bit_array.c index a4f39b4a..8c0a8d1e 100644 --- a/src/linker/base_ext/base_bit_array.c +++ b/src/linker/base_ext/base_bit_array.c @@ -238,9 +238,9 @@ bit_array_set_bit32(U32Array bit_array, U64 idx, B32 state) U64 word_idx = idx / 32; U64 bit_idx = idx % 32; if (state) { - bit_array.v[word_idx] |= (1 << bit_idx); + bit_array.v[word_idx] |= (1u << bit_idx); } else { - bit_array.v[word_idx] &= ~(1 << bit_idx); + bit_array.v[word_idx] &= ~(1u << bit_idx); } } @@ -269,7 +269,7 @@ bit_array_is_bit_set(U32Array bit_arr, U64 bit_pos) Assert(word_idx < bit_arr.count); U32 word = bit_arr.v[word_idx]; U64 bit_idx = bit_pos % 32; - B32 is_set = !!(word & (1 << bit_idx)); + B32 is_set = !!(word & (1u << bit_idx)); return is_set; } diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 4dceeaa2..ba22e2e8 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -170,17 +170,18 @@ cv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out) // do we have enough bytes to read header? Assert(raw_data.size >= sizeof(CV_LeafHeader)); - CV_LeafHeader *header = (CV_LeafHeader*)(raw_data.str + off); + StaticAssert(sizeof(CV_LeafHeader) == 4, g_leaf_header_size_check); + CV_LeafHeader header = { .v = memory_read32(raw_data.str + off) }; // leaf size must have enough bytes for the kind enum - Assert(header->size >= sizeof(CV_LeafKind)); + Assert(header.size >= sizeof(CV_LeafKind)); // do we have enough bytes to read leaf data? - Assert(sizeof(CV_LeafSize) + header->size <= raw_data.size); + Assert(sizeof(CV_LeafSize) + header.size <= raw_data.size); // fill out leaf - leaf_out->kind = header->kind; - leaf_out->data = str8(raw_data.str + sizeof(CV_LeafHeader), header->size - sizeof(CV_LeafKind)); + leaf_out->kind = header.kind; + leaf_out->data = str8(raw_data.str + sizeof(CV_LeafHeader), header.size - sizeof(CV_LeafKind)); U64 leaf_size = AlignPow2(sizeof(CV_LeafHeader) + leaf_out->data.size, align); Assert(leaf_size <= raw_data.size); @@ -449,12 +450,20 @@ cv_parse_debug_s_c13_list(Arena *arena, String8List raw_debug_s) return debug_s; } +internal force_inline UBSAN_NO_ALIGN CV_Signature +cv_signature_from_debug_s(String8 raw_debug_s) +{ + CV_Signature sig; + MemoryCopy(&sig, raw_debug_s.str, sizeof(sig)); + return sig; +} + internal CV_DebugS cv_parse_debug_s(Arena *arena, String8 raw_debug_s) { CV_DebugS result; MemoryZeroStruct(&result); if (raw_debug_s.size >= sizeof(CV_Signature)) { - CV_Signature sig = *(CV_Signature *)raw_debug_s.str; + CV_Signature sig = cv_signature_from_debug_s(raw_debug_s); switch (sig) { case CV_Signature_C13: { String8 raw_debug_s_past_sig = str8_substr(raw_debug_s, r1u64(sizeof(sig), raw_debug_s.size)); @@ -1130,11 +1139,9 @@ internal String8 cv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx) { Assert(leaf_idx < debug_t.count); - U8 *leaf_ptr = debug_t.v[leaf_idx]; - CV_LeafSize *size_ptr = (CV_LeafSize *)leaf_ptr; - CV_LeafSize total_size = sizeof(*size_ptr) + *size_ptr; - String8 raw_leaf = str8(leaf_ptr, total_size); - return raw_leaf; + U8 *leaf_ptr = debug_t.v[leaf_idx]; + CV_LeafSize size = memory_read16(debug_t.v[leaf_idx]); + return str8(leaf_ptr, sizeof(size) + size); } internal CV_LeafHeader * @@ -1474,19 +1481,16 @@ cv_symbol_tree_from_symbol_list(Arena *arena, CV_SymbolList list) internal U64 cv_patch_symbol_tree_offsets(CV_SymbolList list, U64 base_offset, U64 align) { - Temp scratch = scratch_begin(0, 0); - struct Stack { struct Stack *next; CV_Symbol *symbol; U64 offset; }; + Temp scratch = scratch_begin(0, 0); struct Stack *stack = 0; struct Stack *free_list = 0; - - U64 cursor = base_offset; - - for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) { + U32 cursor = safe_cast_u32(base_offset); + for EachNode(symbol_n, CV_SymbolNode, list.first) { CV_Symbol symbol = symbol_n->data; if (cv_is_scope_symbol(symbol.kind)) { // NOTE: We don't patch 'next' offset in PROC symbols because @@ -1494,10 +1498,9 @@ cv_patch_symbol_tree_offsets(CV_SymbolList list, U64 base_offset, U64 align) // zeroed. LLD is on the same page. Assert(symbol.data.size >= sizeof(U32)*2); - // patch symbol parent + // patch parent symbol offset if (stack) { - U32 *parent_off_ptr = (U32 *)symbol.data.str; - *parent_off_ptr = stack->offset; + memory_write32(symbol.data.str, stack->offset); } // reuse/alloc frame @@ -1516,7 +1519,7 @@ cv_patch_symbol_tree_offsets(CV_SymbolList list, U64 base_offset, U64 align) } else if (cv_is_end_symbol(symbol.kind)) { // patch symbol end U32 *end_off_ptr = (U32 *)stack->symbol->data.str + /* skip parent off */ 1; - *end_off_ptr = cursor; + memory_write32(end_off_ptr, cursor); // recycle frame struct Stack *free_frame = stack; diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index 421af3c2..db8ad632 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -5,10 +5,13 @@ //- Symbol and Leaf Headers -typedef struct CV_LeafHeader +typedef union CV_LeafHeader { - CV_LeafSize size; - CV_LeafKind kind; + struct { + CV_LeafSize size; + CV_LeafKind kind; + }; + U32 v; } CV_LeafHeader; typedef struct CV_SymbolHeader @@ -404,6 +407,7 @@ internal CV_SymbolList cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_Symb internal CV_DebugS cv_parse_debug_s_c13(Arena *arena, String8 raw_debug_s); internal CV_DebugS cv_parse_debug_s_c13_list(Arena *arena, String8List raw_debug_s); +internal CV_Signature cv_signature_from_debug_s(String8 raw_debug_s); internal CV_DebugS cv_parse_debug_s(Arena *arena, String8 raw_debug_s); internal void cv_debug_s_concat_in_place(CV_DebugS *dst, CV_DebugS *src); internal String8List cv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index e3a35416..cac11a07 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1635,9 +1635,10 @@ lnk_link_inputs(TP_Context *tp, LNK_Lib *lib = member_ref->lib; LNK_Symbol *link_symbol = member_ref->link_symbol; - COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, lib->member_offsets[member_ref->member_idx]); - COFF_DataType member_type = coff_data_type_from_data(member_info.data); - String8 member_name = coff_decode_member_name(lib->long_names, member_info.header.name); + U32 member_offset = memory_read32(lib->member_offsets + member_ref->member_idx); + COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, member_offset); + COFF_DataType member_type = coff_data_type_from_data(member_info.data); + String8 member_name = coff_decode_member_name(lib->long_names, member_info.header.name); U64 refs_count = 0; LNK_ObjSymbolRef **refs = lnk_ref_from_symbol_many(temp.arena, link_symbol, &refs_count); @@ -1656,9 +1657,10 @@ lnk_link_inputs(TP_Context *tp, U64 member_idx = member_ref->member_idx; // parse member info - COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, lib->member_offsets[member_idx]); - COFF_DataType member_type = coff_data_type_from_data(member_info.data); - String8 member_name = coff_decode_member_name(lib->long_names, member_info.header.name); + U32 member_offset = memory_read32(lib->member_offsets + member_idx); + COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, member_offset); + COFF_DataType member_type = coff_data_type_from_data(member_info.data); + String8 member_name = coff_decode_member_name(lib->long_names, member_info.header.name); switch (member_type) { case COFF_DataType_Import: { @@ -1809,7 +1811,8 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer LNK_LibMemberInfo *member_infos = hash_table_search_raw_raw(link->lib_member_infos_ht, lib); LNK_Symbol *link_symbol = member_infos[member_idx].link; - COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, lib->member_offsets[member_idx]); + U32 member_offset = memory_read32(lib->member_offsets + member_idx); + COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, member_offset); COFF_DataType member_type = coff_data_type_from_data(member_info.data); String8 member_name = coff_decode_member_name(lib->long_names, member_info.header.name); COFF_ParsedArchiveImportHeader import_header = coff_archive_import_from_data(member_info.data); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 74a53a95..fd10a371 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -80,8 +80,8 @@ THREAD_POOL_TASK_FUNC(lnk_check_debug_t_sig_and_get_data_task) lnk_error_obj(LNK_Error_IllData, obj, ".debug$T must have at least 4 bytes for CodeView signature"); } - CV_Signature *sig_ptr = (CV_Signature *)data_ptr->str; - switch (*sig_ptr) { + CV_Signature sig = cv_signature_from_debug_s(*data_ptr); + switch (sig) { default: { lnk_error_obj(LNK_Warning_IllData, obj, "unknown CodeView type signature in section (TODO: print section index)"); *data_ptr = str8(0,0); @@ -1172,7 +1172,7 @@ lnk_hash_cv_leaf(Arena *arena, // mix-in sub leaf hashes for (CV_TypeIndexInfo *ti_n = ti_info_list.first; ti_n != 0; ti_n = ti_n->next) { - CV_TypeIndex sub_ti = *(CV_TypeIndex *) (leaf.data.str + ti_n->offset); + CV_TypeIndex sub_ti = memory_read32(leaf.data.str + ti_n->offset); // is type index complex? if (sub_ti >= ti_ranges[ti_n->source].min) { @@ -1278,12 +1278,13 @@ lnk_hash_cv_leaf_deep(Arena *arena, // get type index info CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (stack->data.str + curr_ti_info->offset); + CV_TypeIndex ti = memory_read32(ti_ptr); // is index complex? - if (*ti_ptr >= ti_ranges[curr_ti_info->source].min) { + if (ti >= ti_ranges[curr_ti_info->source].min) { // TODO: handle malformed index - AssertAlways(*ti_ptr < ti_ranges[curr_ti_info->source].max); - U64 ti_idx = (*ti_ptr - ti_ranges[curr_ti_info->source].min); + AssertAlways(ti < ti_ranges[curr_ti_info->source].max); + U64 ti_idx = (ti - ti_ranges[curr_ti_info->source].min); // was leaf hashed? if (curr_hashes[curr_ti_info->source][ti_idx] == 0) { // :zero_hash_array @@ -1301,7 +1302,7 @@ lnk_hash_cv_leaf_deep(Arena *arena, frame->ti_info = sub_ti_info_list.first; frame->leaf = leaf; frame->data = leaf.data; - frame->ti = *ti_ptr; + frame->ti = ti; frame->ti_source = curr_ti_info->source; // recurse to sub leaf @@ -1443,7 +1444,8 @@ THREAD_POOL_TASK_FUNC(lnk_count_per_source_leaf_task) CV_DebugT debug_t = *leaf_range->debug_t; for EachInRange(leaf_idx, leaf_range->range) { CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(leaf_header->kind); + CV_LeafKind kind = memory_read16(MemberFromPtr(CV_LeafHeader, leaf_header, kind)); + CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(kind); counts[leaf_source] += 1; } } @@ -1550,7 +1552,8 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_internal_task) LNK_LeafRef *bucket = 0; for EachIndex(leaf_idx, debug_t.count) { CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - CV_TypeIndexSource ti_source = cv_type_index_source_from_leaf_kind(leaf_header->kind); + CV_LeafKind leaf_kind = memory_read16(MemberFromPtr(CV_LeafHeader, leaf_header, kind)); + CV_TypeIndexSource ti_source = cv_type_index_source_from_leaf_kind(leaf_kind); LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_source]; LNK_LeafRef leaf_ref = lnk_obj_leaf_ref(obj_idx, leaf_idx); @@ -1974,25 +1977,26 @@ THREAD_POOL_TASK_FUNC(lnk_cv_patcher_symbols_task) // overwrite type indices in symbol for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(symbol_n->data.data.str + ti_info->offset); + CV_TypeIndex ti = memory_read32(ti_ptr); // skip simple type indices - if (*ti_ptr < ti_lo_arr[ti_info->source]) { continue; } + if (ti < ti_lo_arr[ti_info->source]) { continue; } - U64 assigned_types_cap = task->assigned_type_caps[ti_info->source]; - CV_TypeIndex *assigned_types_ht = task->assigned_type_hts[ti_info->source]; - CV_TypeIndex min_type_index = task->min_type_indices[ti_info->source]; - LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + U64 assigned_types_cap = task->assigned_type_caps [ti_info->source]; + CV_TypeIndex *assigned_types_ht = task->assigned_type_hts [ti_info->source]; + CV_TypeIndex min_type_index = task->min_type_indices [ti_info->source]; + LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr [ti_info->source]; // find unique leaf refernece - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, ti); LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); - CV_TypeIndex type_index = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); + CV_TypeIndex final_ti = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); // we overwrite section memory directly - *ti_ptr = type_index; + memory_write32(ti_ptr, final_ti); } temp_end(temp); @@ -2022,26 +2026,27 @@ THREAD_POOL_TASK_FUNC(lnk_cv_patcher_inlines_task) for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(inline_data_node->string.str + ti_info->offset); - CV_TypeIndex ti_lo = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, ti_info->source); + CV_TypeIndex ti = memory_read32(ti_ptr); // skip simple type indices - if (*ti_ptr < ti_lo) { continue; } + CV_TypeIndex ti_lo = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, ti_info->source); + if (ti < ti_lo) { continue; } - U64 assigned_types_cap = task->assigned_type_caps[ti_info->source]; - CV_TypeIndex *assigned_types_ht = task->assigned_type_hts[ti_info->source]; - CV_TypeIndex min_type_index = task->min_type_indices[ti_info->source]; - LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + U64 assigned_types_cap = task->assigned_type_caps [ti_info->source]; + CV_TypeIndex *assigned_types_ht = task->assigned_type_hts [ti_info->source]; + CV_TypeIndex min_type_index = task->min_type_indices [ti_info->source]; + LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr [ti_info->source]; // find unique leaf refernece - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, ti); LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); - CV_TypeIndex type_index = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); + CV_TypeIndex final_ti = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); // patch index - *ti_ptr = type_index; + memory_write32(ti_ptr, final_ti); } temp_end(temp); @@ -2074,25 +2079,26 @@ THREAD_POOL_TASK_FUNC(lnk_cv_patcher_leaves_task) for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(leaf.data.str + ti_info->offset); + CV_TypeIndex ti = memory_read32(ti_ptr); // skip simple type indices - if (*ti_ptr < ti_lo) { continue; } + if (ti < ti_lo) { continue; } - U64 assigned_types_cap = task->assigned_type_caps[ti_info->source]; - CV_TypeIndex *assigned_types_ht = task->assigned_type_hts[ti_info->source]; - CV_TypeIndex min_type_index = task->min_type_indices[ti_info->source]; - LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + U64 assigned_types_cap = task->assigned_type_caps [ti_info->source]; + CV_TypeIndex *assigned_types_ht = task->assigned_type_hts [ti_info->source]; + CV_TypeIndex min_type_index = task->min_type_indices [ti_info->source]; + LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr [ti_info->source]; - // find unique leaf refernece - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_info->source]; - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr); + // find unique leaf ref + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, ti); LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); - CV_TypeIndex type_index = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); + CV_TypeIndex final_ti = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); // patch index - *ti_ptr = type_index; + memory_write32(ti_ptr, final_ti); } temp_end(temp); diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index d9461fd1..61f34cfa 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -69,8 +69,8 @@ typedef enum LNK_LeafLocType_Count } LNK_LeafLocType; -#define LNK_LeafRefFlag_LocIdxExternal (1 << 31) -#define LNK_LeafRefFlag_LeafIdxIPI (1 << 31) +#define LNK_LeafRefFlag_LocIdxExternal (1u << 31) +#define LNK_LeafRefFlag_LeafIdxIPI (1u << 31) typedef struct { U32 enc_loc_idx; diff --git a/src/linker/lnk_lib.h b/src/linker/lnk_lib.h index 79b682c7..eed5e2de 100644 --- a/src/linker/lnk_lib.h +++ b/src/linker/lnk_lib.h @@ -66,5 +66,5 @@ internal LNK_Lib ** lnk_array_from_lib_list(Arena *arena, LNK_LibList list internal void lnk_lib_list_push_node(LNK_LibList *list, LNK_LibNode *node); internal LNK_LibNodeArray lnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, U64 inputs_count, struct LNK_Input **inputs); -internal B32 lnk_search_lib(LNK_Lib *lib, String8 symbol_name, U32 *member_idx_out); +internal force_inline B32 lnk_search_lib(LNK_Lib *lib, String8 symbol_name, U32 *member_idx_out); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index d1c80b5d..b20901e6 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -2384,7 +2384,7 @@ gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_ if (bucket_list.count) { U64 word_idx = bucket_idx / gsi->word_size; Assert(word_idx < bitmap_count); - bitmap[word_idx] |= 1 << (bucket_idx % gsi->word_size); + bitmap[word_idx] |= 1u << (bucket_idx % gsi->word_size); compressed_offset_arr[compressed_offset_count] = hash_idx * sizeof(PDB_GsiHashRecordOffsetCalc); // store in-memory offset for first bucket compressed_offset_count += 1; } diff --git a/src/metagen/metagen_base/metagen_base_core.h b/src/metagen/metagen_base/metagen_base_core.h index 191e1e7f..a56382a0 100644 --- a/src/metagen/metagen_base/metagen_base_core.h +++ b/src/metagen/metagen_base/metagen_base_core.h @@ -290,9 +290,9 @@ CheckNil(nil,p) ? \ #if COMPILER_MSVC # if defined(__SANITIZE_ADDRESS__) # define ASAN_ENABLED 1 -# define NO_ASAN __declspec(no_sanitize_address) +# define ASAN_NO_ADDR __declspec(no_sanitize_address) # else -# define NO_ASAN +# define ASAN_NO_ADDR # endif #elif COMPILER_CLANG # if defined(__has_feature) @@ -300,9 +300,9 @@ CheckNil(nil,p) ? \ # define ASAN_ENABLED 1 # endif # endif -# define NO_ASAN __attribute__((no_sanitize("address"))) +# define ASAN_NO_ADDR __attribute__((no_sanitize("address"))) #else -# define NO_ASAN +# define ASAN_NO_ADDR #endif #if ASAN_ENABLED diff --git a/src/pdb/pdb.c b/src/pdb/pdb.c index 035ca375..e334f51c 100644 --- a/src/pdb/pdb.c +++ b/src/pdb/pdb.c @@ -6,18 +6,17 @@ pdb_hash_v1(String8 string) { U32 result = 0; U8 *ptr = string.str; - U8 *opl = ptr + (string.size&(~3)); - for(; ptr < opl; ptr += 4) + for(U8 *opl = ptr + (string.size & (~3)); ptr < opl; ptr += 4) { - result ^= *(U32*)ptr; + result ^= memory_read32(ptr); } - if((string.size&2) != 0) + if((string.size & 2) != 0) { - result ^= *(U16*)ptr; ptr += 2; + result ^= memory_read16(ptr); ptr += 2; } - if((string.size&1) != 0) + if((string.size & 1) != 0) { - result ^= *ptr; + result ^= memory_read8(ptr); } result |= 0x20202020; result ^= (result >> 11); diff --git a/src/third_party/stb/stb_sprintf.h b/src/third_party/stb/stb_sprintf.h index 515ba6c5..7614dfbf 100644 --- a/src/third_party/stb/stb_sprintf.h +++ b/src/third_party/stb/stb_sprintf.h @@ -436,7 +436,7 @@ cl = lg; \ } else #endif { - *(stbsp__uint32 *)bf = v; + memory_write32(bf, v); } bf += 4; f += 4; From 6fb055bf6e185b7451ad77b51edf365765f4f92d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 13 Feb 2026 22:07:41 -0800 Subject: [PATCH 202/850] rename asan -> san --- .github/workflows/builds.yml | 2 +- build.bat | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index f9263756..195f02ce 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -46,7 +46,7 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build radlink asan debug no_meta || exit /b 1 + call build radlink san debug no_meta || exit /b 1 call build torture debug no_meta || exit /b 1 cd build torture -l:radlink || exit /b 1 diff --git a/build.bat b/build.bat index 07d1dcec..aa70b9d4 100644 --- a/build.bat +++ b/build.bat @@ -15,7 +15,7 @@ cd /D "%~dp0" :: `build raddbg` :: `build raddbg clang` :: `build raddbg release` -:: `build raddbg asan telemetry` +:: `build raddbg san telemetry` :: `build rdi_from_pdb` :: :: For a full list of possible build targets and their build command lines, @@ -23,7 +23,7 @@ cd /D "%~dp0" :: :: Below is a list of all possible non-target command line options: :: -:: - `asan`: enable address sanitizer +:: - `san`: enable address sanitizer :: - `telemetry`: enable RAD telemetry profiling support :: - `spall`: enable spall profiling support @@ -42,7 +42,7 @@ if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set auto_compile_flags= if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled] if "%spall%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_SPALL=1 && echo [spall profiling enabled] -if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled] +if "%san%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address -fsanitize=undefined && echo [san enabled] if "%opengl%"=="1" set auto_compile_flags=%auto_compile_flags% -DR_BACKEND=R_BACKEND_OPENGL && echo [opengl render backend] if "%dwarf%"=="1" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gdwarf && echo [dwarf debug info] if "%dwarf%"=="" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gcodeview From 09e37a6a2eeb5712afcbc9c03eb96bb0745ee1d3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 13 Feb 2026 22:10:23 -0800 Subject: [PATCH 203/850] report unknown ignore codes only in debug builds --- src/linker/lnk_config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 56564808..1088368f 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -1424,7 +1424,9 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_ignore_error(LNK_Warning_SectionFlagsConflict); } break; default: { + #if BUILD_DEBUG lnk_not_implemented("TODO: /IGNORE:%llu", error_code); + #endif } break; } } From 76213ec5cde699fef9f1fa1d6f6d1c990d2231f2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 15 Feb 2026 23:11:51 -0800 Subject: [PATCH 204/850] switch to using 32-bit offsets for leaf records over the pointers --- src/base/base_core.c | 6 + src/base/base_core.h | 1 + src/codeview/codeview.h | 2 + src/linker/codeview_ext/codeview.c | 151 +++++-------- src/linker/codeview_ext/codeview.h | 17 +- src/linker/lnk.c | 18 +- src/linker/lnk_debug_info.c | 342 ++++++++++++++++------------- src/linker/lnk_debug_info.h | 65 +++--- src/linker/pdb_ext/pdb_builder.c | 61 +++-- src/linker/pdb_ext/pdb_builder.h | 5 +- 10 files changed, 347 insertions(+), 321 deletions(-) diff --git a/src/base/base_core.c b/src/base/base_core.c index 8988f41e..4dbcffcd 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -288,6 +288,12 @@ memory_is_zero(void *ptr, U64 size) return result; } +internal void UBSAN_NO_ALIGN +memory_write16(void *ptr, U16 v) +{ + MemoryCopy(ptr, &v, sizeof(v)); +} + internal void UBSAN_NO_ALIGN memory_write32(void *ptr, U32 v) { diff --git a/src/base/base_core.h b/src/base/base_core.h index ba7d20cc..2c43fcb7 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -1009,6 +1009,7 @@ internal F32 sign_from_side_F32(Side side); internal B32 memory_is_zero(void *ptr, U64 size); +internal void memory_write16(void *ptr, U16 v); internal void memory_write32(void *ptr, U32 v); internal U8 memory_read8(void *ptr); diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index 635acfe8..a3f5ee19 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -1161,6 +1161,8 @@ struct CV_SymPub32 //- (SymKind: LPROC32, GPROC32) +#define CV_IsProc32(x) (x == CV_SymKind_LPROC32_ID || x == CV_SymKind_GPROC32_ID || x == CV_SymKind_LPROC32_DPC) + typedef struct CV_SymProc32 CV_SymProc32; struct CV_SymProc32 { diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index ba22e2e8..c6989dd2 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -170,8 +170,10 @@ cv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out) // do we have enough bytes to read header? Assert(raw_data.size >= sizeof(CV_LeafHeader)); + U8 *leaf_ptr = raw_data.str + off; + StaticAssert(sizeof(CV_LeafHeader) == 4, g_leaf_header_size_check); - CV_LeafHeader header = { .v = memory_read32(raw_data.str + off) }; + CV_LeafHeader header = { .v = memory_read32(leaf_ptr) }; // leaf size must have enough bytes for the kind enum Assert(header.size >= sizeof(CV_LeafKind)); @@ -181,7 +183,7 @@ cv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out) // fill out leaf leaf_out->kind = header.kind; - leaf_out->data = str8(raw_data.str + sizeof(CV_LeafHeader), header.size - sizeof(CV_LeafKind)); + leaf_out->data = str8(leaf_ptr + sizeof(CV_LeafHeader), header.size - sizeof(CV_LeafKind)); U64 leaf_size = AlignPow2(sizeof(CV_LeafHeader) + leaf_out->data.size, align); Assert(leaf_size <= raw_data.size); @@ -1070,68 +1072,36 @@ cv_dedup_symbol_ptr_array(TP_Context *tp, CV_SymbolPtrArray *symbols) //~ .debug$T helpers internal CV_DebugT -cv_debug_t_from_data_arr(Arena *arena, String8Array data_arr, U64 align) +cv_debug_t_from_data(Arena *arena, String8 data, U64 align) { ProfBegin("Upfront parse"); - U64 max_leaf_count = 0; - for (U64 data_idx = 0; data_idx < data_arr.count; data_idx += 1) { - String8 data = data_arr.v[data_idx]; - for (U64 cursor = 0; cursor < data.size; ) { - CV_Leaf leaf; - cursor += cv_deserial_leaf(data, cursor, align, &leaf); - max_leaf_count += 1; - } + U64 count = 0; + for (U64 cursor = 0; cursor < data.size; count += 1) { + CV_Leaf leaf; + cursor += cv_deserial_leaf(data, cursor, align, &leaf); } ProfEnd(); - U8 **leaf_arr = push_array_no_zero(arena, U8 *, max_leaf_count); - U64 leaf_count = 0; - for (U64 data_idx = 0; data_idx < data_arr.count; data_idx += 1) { - String8 data = data_arr.v[data_idx]; + U32 *offsets = push_array_no_zero(arena, U32, count); + for (U64 cursor = 0, idx = 0; cursor < data.size;) { + offsets[idx++] = cursor; - U64 cursor = 0; - while (cursor < data.size) { - CV_Leaf leaf; - U64 read_size = cv_deserial_leaf(data, cursor, align, &leaf); - - Assert(leaf_count < max_leaf_count); - leaf_arr[leaf_count] = str8_deserial_get_raw_ptr(data, cursor, read_size); - leaf_count += 1; - - // advance cursor - cursor += read_size; - } + CV_Leaf leaf; + cursor += cv_deserial_leaf(data, cursor, align, &leaf); } - CV_DebugT debug_t = {0}; - debug_t.count = leaf_count; - debug_t.v = leaf_arr; - return debug_t; -} - -internal CV_DebugT -cv_debug_t_from_data(Arena *arena, String8 data, U64 align) -{ - String8Array arr = {0}; - arr.count = 1; - arr.v = &data; - return cv_debug_t_from_data_arr(arena, arr, align); + return (CV_DebugT){ .count = count, .data = data, .offsets = offsets }; } internal CV_Leaf cv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx) { - Assert(leaf_idx < debug_t.count); - - U8 *ptr = debug_t.v[leaf_idx]; - String8 data = str8(ptr, max_U64); - - CV_Leaf leaf; - cv_deserial_leaf(data, 0, 1, &leaf); - - U64 size = cv_header_struct_size_from_leaf_kind(leaf.kind); - Assert(size <= leaf.data.size); - + CV_Leaf leaf = {0}; + if (debug_t.count > 0) { + Assert(leaf_idx < debug_t.count); + cv_deserial_leaf(debug_t.data, debug_t.offsets[leaf_idx], 1, &leaf); + Assert(cv_header_struct_size_from_leaf_kind(leaf.kind) <= leaf.data.size); + } return leaf; } @@ -1139,83 +1109,60 @@ internal String8 cv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx) { Assert(leaf_idx < debug_t.count); - U8 *leaf_ptr = debug_t.v[leaf_idx]; - CV_LeafSize size = memory_read16(debug_t.v[leaf_idx]); - return str8(leaf_ptr, sizeof(size) + size); + U8 *leaf_ptr = debug_t.data.str + debug_t.offsets[leaf_idx]; + CV_LeafSize leaf_size = memory_read16(leaf_ptr); + return str8(leaf_ptr, leaf_size + sizeof(leaf_size)); } internal CV_LeafHeader * cv_debug_t_get_leaf_header(CV_DebugT debug_t, U64 leaf_idx) { - Assert(leaf_idx < debug_t.count); - CV_LeafHeader *leaf_header = (CV_LeafHeader *) debug_t.v[leaf_idx]; - return leaf_header; + CV_LeafHeader *header = 0; + if (leaf_idx < debug_t.count) { + header = (CV_LeafHeader *)(debug_t.data.str + debug_t.offsets[leaf_idx]); + } + return header; } internal B32 cv_debug_t_is_pch(CV_DebugT debug_t) { - if (debug_t.count > 0) { - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); - return cv_is_leaf_pch(leaf.kind); - } - return 0; + return cv_is_leaf_pch(cv_debug_t_get_leaf(debug_t, 0).kind); } internal B32 cv_debug_t_is_type_server(CV_DebugT debug_t) { - if (debug_t.count > 0) { - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); - return cv_is_leaf_type_server(leaf.kind); - } - return 0; + return cv_is_leaf_type_server(cv_debug_t_get_leaf(debug_t, 0).kind); } internal U64 -cv_debug_t_array_count_leaves(U64 count, CV_DebugT *arr) +cv_debug_t_array_count_leaves(U64 count, CV_DebugT *debug_t) { - U64 total_leaf_count = 0; - for (U64 i = 0; i < count; i += 1) { - total_leaf_count += arr[i].count; - } - return total_leaf_count; + U64 total = 0; + for EachIndex(i, count) { total += debug_t[i].count; } + return total; } -internal -THREAD_POOL_TASK_FUNC(cv_str8_list_from_debug_t_task) +internal CV_Leaf +cv_leaf_from_ptr(U8 *ptr) { - CV_Str8ListFromDebugT *task = raw_task; - for (U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) { - String8Node *node = &task->nodes[leaf_idx]; - node->string = cv_debug_t_get_raw_leaf(task->debug_t, leaf_idx); - str8_list_push_node(&task->lists[task_id], node); - } + CV_Leaf leaf = {0}; + cv_deserial_leaf(str8(ptr, max_U64), 0, 1, &leaf); + return leaf; } -internal String8List -cv_str8_list_from_debug_t_parallel(TP_Context *tp, Arena *arena, CV_DebugT debug_t) +internal U16 +cv_leaf_size_from_ptr(U8 *ptr) { - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); + CV_LeafSize size = memory_read16(ptr); + return size + sizeof(size); +} - // build lists in parallel - CV_Str8ListFromDebugT task = {0}; - task.debug_t = debug_t; - task.ranges = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count); - task.lists = push_array(scratch.arena, String8List, tp->worker_count); - task.nodes = push_array_no_zero(arena, String8Node, debug_t.count); - tp_for_parallel(tp, 0, tp->worker_count, cv_str8_list_from_debug_t_task, &task); - - // concat output lists - String8List list = {0}; - for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) { - str8_list_concat_in_place(&list, &task.lists[task_id]); - } - - scratch_end(scratch); - ProfEnd(); - return list; +internal String8 +cv_raw_leaf_from_ptr(U8 *ptr) +{ + return str8(ptr, cv_leaf_size_from_ptr(ptr)); } // $$Symbols diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index db8ad632..354a0e14 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -255,9 +255,9 @@ typedef struct CV_DebugS typedef struct CV_DebugT { - U64 size; - U64 count; - U8 **v; + U64 count; + String8 data; + U32 *offsets; } CV_DebugT; //////////////////////////////// @@ -358,14 +358,6 @@ typedef struct CV_StringBucket **buckets; } CV_PackStringHashTableTask; -typedef struct -{ - CV_DebugT debug_t; - Rng1U64 *ranges; - String8List *lists; - String8Node *nodes; -} CV_Str8ListFromDebugT; - //////////////////////////////// internal CV_ObjInfo cv_obj_info_from_symbol(CV_Symbol symbol); @@ -421,7 +413,6 @@ internal String8 cv_file_chksms_from_debug_s(CV_DebugS debug_s); //////////////////////////////// //~ .debug$T helpers -internal CV_DebugT cv_debug_t_from_data_arr(Arena *arena, String8Array data_arr, U64 align); internal CV_DebugT cv_debug_t_from_data(Arena *arena, String8 data, U64 align); internal CV_Leaf cv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx); internal String8 cv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx); @@ -430,8 +421,6 @@ internal B32 cv_debug_t_is_pch(CV_DebugT debug_t); internal B32 cv_debug_t_is_type_server(CV_DebugT debug_t); internal U64 cv_debug_t_array_count_leaves(U64 count, CV_DebugT *arr); -internal String8List cv_str8_list_from_debug_t_parallel(TP_Context *tp, Arena *arena, CV_DebugT types); - //////////////////////////////// //~ Sub Section helpers diff --git a/src/linker/lnk.c b/src/linker/lnk.c index cac11a07..4de0462c 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -5150,8 +5150,8 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) // // CodeView // - LNK_CodeViewInput input = lnk_make_code_view_input(tp, arena, config->io_flags, config->lib_dir_list, config->alt_pch_dirs, debug_info_objs_count, debug_info_objs); - CV_DebugT *types = lnk_import_types(tp, arena, &input); + LNK_CodeViewInput input = lnk_make_code_view_input(tp, arena, config->io_flags, config->lib_dir_list, config->alt_pch_dirs, debug_info_objs_count, debug_info_objs); + LNK_MergedTypes merged_types = lnk_merge_types(tp, arena, &input); // // RDI @@ -5171,7 +5171,8 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) input.total_symbol_input_count, input.symbol_inputs, input.parsed_symbols, - types); + merged_types.count, + merged_types.v); lnk_write_data_list_to_file_path(config->rad_debug_name, config->temp_rad_debug_name, rdi_data); @@ -5187,7 +5188,13 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) lnk_timer_begin(LNK_Timer_Pdb); if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) { - lnk_replace_type_names_with_hashes(tp, arena, types[CV_TypeIndexSource_TPI], config->pdb_hash_type_names, config->pdb_hash_type_name_length, config->pdb_hash_type_name_map); + lnk_replace_type_names_with_hashes(tp, + arena, + merged_types.count[CV_TypeIndexSource_TPI], + merged_types.v [CV_TypeIndexSource_TPI], + config->pdb_hash_type_names, + config->pdb_hash_type_name_length, + config->pdb_hash_type_name_map); } String8List pdb_data = lnk_build_pdb(tp, @@ -5201,7 +5208,8 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) input.total_symbol_input_count, input.symbol_inputs, input.parsed_symbols, - types); + merged_types.count, + merged_types.v); lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data); lnk_timer_end(LNK_Timer_Pdb); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index fd10a371..bec8e05c 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -113,8 +113,11 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_t_task) U64 obj_idx = task_id; LNK_ParseDebugTTaskData *task = raw_task; String8Array data_arr = task->data_arr_arr[obj_idx]; - CV_DebugT *debug_t = &task->debug_t_arr[obj_idx]; - *debug_t = cv_debug_t_from_data_arr(arena, data_arr, CV_LeafAlign); + if (data_arr.count > 0) { + task->debug_t_arr[obj_idx] = cv_debug_t_from_data(arena, data_arr.v[0], CV_LeafAlign); + } else { + MemoryZeroStruct(&task->debug_t_arr[obj_idx]); + } ProfEnd(); } @@ -253,8 +256,8 @@ lnk_setup_pch(Arena *arena, U64 obj_count, LNK_Obj **obj_arr, CV_DebugT *debug_t pch->debug_p_obj_idx = debug_p_obj_idx; // [start_index, start_index+type_index_count) - debug_t_arr[obj_idx].count -= 1; - debug_t_arr[obj_idx].v += 1; + debug_t_arr[obj_idx].count -= 1; + debug_t_arr[obj_idx].offsets += 1; endprecomp_arr[debug_p_obj_idx] = cv_debug_t_get_leaf_header(debug_p, precomp.leaf_count); } else { @@ -2112,69 +2115,74 @@ THREAD_POOL_TASK_FUNC(lnk_unbucket_raw_leaves_task) { LNK_CvImportTypes *task = raw_task; for EachInRange(i, task->ranges[task_id]) { - task->types[task->ti_source].v[i] = lnk_data_from_leaf_ref(task->input, *task->unique_leaf_refs_arr[task->ti_source].v[i]).str; + LNK_LeafRef *leaf_ref_ptr = task->unique_leaf_refs_arr[task->ti_source].v[i]; + task->merged_types.v[task->ti_source][i] = lnk_data_from_leaf_ref(task->input, *leaf_ref_ptr).str; } } internal -THREAD_POOL_TASK_FUNC(lnk_post_process_cv_symbols_task) +THREAD_POOL_TASK_FUNC(lnk_fixup_symbols_task) { LNK_CvImportTypes *task = raw_task; - CV_DebugT ipi_types = task->types[CV_TypeIndexSource_IPI]; - CV_TypeIndex ipi_min_type_index = task->min_type_indices[CV_TypeIndexSource_IPI]; + U64 leaf_count_ipi = task->merged_types.count[CV_TypeIndexSource_IPI]; + U8 **leaf_arr_ipi = task->merged_types.v [CV_TypeIndexSource_IPI]; + CV_TypeIndex min_ti_ipi = task->min_type_indices [CV_TypeIndexSource_IPI]; for EachNode(symnode, CV_SymbolNode, task->input->symbol_inputs[task_id].symbol_list->first) { CV_Symbol *symbol = &symnode->data; - if (symbol->kind == CV_SymKind_LPROC32_ID || symbol->kind == CV_SymKind_GPROC32_ID || symbol->kind == CV_SymKind_LPROC32_DPC) { - CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol->data.str; - if (proc32->itype >= ipi_min_type_index) { - if ((proc32->itype - ipi_min_type_index) < ipi_types.count) { - U64 leaf_idx = proc32->itype - ipi_min_type_index; - CV_Leaf leaf = cv_debug_t_get_leaf(ipi_types, leaf_idx); - - if (leaf.kind == CV_LeafKind_FUNC_ID) { - if (leaf.data.size >= sizeof(CV_LeafFuncId)) { - proc32->itype = ((CV_LeafFuncId *) leaf.data.str)->itype; - } else { - Assert(!"TODO: error handle corrupt leaf"); - } - } else if (leaf.kind == CV_LeafKind_MFUNC_ID) { - if (leaf.data.size >= sizeof(CV_LeafMFuncId)) { - proc32->itype = ((CV_LeafMFuncId *) leaf.data.str)->itype; - } else { - Assert(!"TODO: error handle corrupt leaf"); - } - } else { - Assert(!"TODO: erorr handle unexpected leaf type"); - } - } else { - Assert("TODO: error handle corrupted type index"); - } - } else { - // TODO: in some cases destructors don't have a type, need a repro - } - } - // convert symbol to final type switch (symbol->kind) { - case CV_SymKind_LPROC32_ID: symbol->kind = CV_SymKind_LPROC32; break; - case CV_SymKind_GPROC32_ID: symbol->kind = CV_SymKind_GPROC32; break; - case CV_SymKind_LPROC32_DPC_ID: symbol->kind = CV_SymKind_LPROC32_DPC; break; - case CV_SymKind_LPROCMIPS_ID: symbol->kind = CV_SymKind_LPROCMIPS; break; - case CV_SymKind_GPROCMIPS_ID: symbol->kind = CV_SymKind_GPROCMIPS; break; - case CV_SymKind_LPROCIA64_ID: symbol->kind = CV_SymKind_LPROCIA64; break; - case CV_SymKind_GPROCIA64_ID: symbol->kind = CV_SymKind_GPROCIA64; break; - case CV_SymKind_PROC_ID_END: symbol->kind = CV_SymKind_END; break; + case CV_SymKind_LPROC32_ID: symbol->kind = CV_SymKind_LPROC32; goto fixup_id; + case CV_SymKind_GPROC32_ID: symbol->kind = CV_SymKind_GPROC32; goto fixup_id; + case CV_SymKind_LPROC32_DPC_ID: symbol->kind = CV_SymKind_LPROC32_DPC; goto fixup_id; + case CV_SymKind_LPROCMIPS_ID: symbol->kind = CV_SymKind_LPROCMIPS; goto fixup_id; + case CV_SymKind_GPROCMIPS_ID: symbol->kind = CV_SymKind_GPROCMIPS; goto fixup_id; + case CV_SymKind_LPROCIA64_ID: symbol->kind = CV_SymKind_LPROCIA64; goto fixup_id; + case CV_SymKind_GPROCIA64_ID: symbol->kind = CV_SymKind_GPROCIA64; goto fixup_id; + fixup_id:; { + CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol->data.str; + if (proc32->itype < min_ti_ipi) { + // TODO: in some cases destructors don't have a type, need a repro + break; + } + + if ((proc32->itype - min_ti_ipi) > leaf_count_ipi) { + Assert("TODO: error handle corrupted type index"); + break; + } + + U64 leaf_idx = proc32->itype - min_ti_ipi; + String8 leaf_data = str8(leaf_arr_ipi[leaf_idx], max_U64); + + CV_Leaf leaf; + cv_deserial_leaf(leaf_data, 0, 1, &leaf); + + U64 min_leaf_size = cv_header_struct_size_from_leaf_kind(leaf.kind); + if (min_leaf_size > leaf.data.size) { + Assert(!"TODO: error handle corrupt leaf"); + break; + } + + if (leaf.kind == CV_LeafKind_FUNC_ID) { + proc32->itype = ((CV_LeafFuncId *) leaf.data.str)->itype; + } else if (leaf.kind == CV_LeafKind_MFUNC_ID) { + proc32->itype = ((CV_LeafMFuncId *) leaf.data.str)->itype; + } else { + Assert(!"TODO: erorr handle unexpected leaf type"); + break; + } + } break; + case CV_SymKind_PROC_ID_END: symbol->kind = CV_SymKind_END; break; } } } -internal CV_DebugT * -lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) +internal LNK_MergedTypes +lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) { - ProfBegin("Import Types"); + ProfBeginFunction(); Temp scratch = temp_begin(lnk_get_huge_arena()); U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex)); @@ -2216,8 +2224,8 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) for EachIndex(ts_idx, input->type_server_count) { task.hashes->external_hashes[ts_idx] = push_array_no_zero(scratch.arena, U64 *, CV_TypeIndexSource_COUNT); for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); - task.hashes->external_hashes[ts_idx][ti_source] = push_array(scratch.arena, U64, leaf_count); // :zero_hash_check + U64 type_count = dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); + task.hashes->external_hashes[ts_idx][ti_source] = push_array(scratch.arena, U64, type_count); // :zero_hash_check } } ProfEnd(); @@ -2246,12 +2254,12 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) Temp temp = temp_begin(scratch.arena); ProfBegin("Compute Per Task Ranges"); - U64 per_task_leaf_count = 10000; + U64 per_task_type_count = 10000; LNK_LeafRangeList *leaf_ranges_per_task = push_array(temp.arena, LNK_LeafRangeList, tp->worker_count); for (U64 i = 0, task_weight = 0, task_id = 0; i < input->internal_count; i += 1) { CV_DebugT *debug_t = &input->merged_debug_t_p_arr[i]; - for (U64 k = 0; k < debug_t->count; k += per_task_leaf_count) { - U64 cap = per_task_leaf_count - task_weight; + for (U64 k = 0; k < debug_t->count; k += per_task_type_count) { + U64 cap = per_task_type_count - task_weight; LNK_LeafRange *leaf_range = push_array(temp.arena, LNK_LeafRange, 1); leaf_range->range = rng_1u64(k, Min(k + cap, debug_t->count)); @@ -2262,7 +2270,7 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) list->count += 1; task_weight += dim_1u64(leaf_range->range); - if (task_weight >= per_task_leaf_count) { + if (task_weight >= per_task_type_count) { task_id = (task_id + 1) % tp->worker_count; task_weight = 0; } @@ -2371,21 +2379,20 @@ lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) } ProfEnd(); - task.types = push_array(tp_temp->v[0], CV_DebugT, CV_TypeIndexSource_COUNT); for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { LNK_LeafRefArray unique_leaf_refs = task.unique_leaf_refs_arr[ti_source]; - task.ti_source = ti_source; - task.types[ti_source].count = unique_leaf_refs.count; - task.types[ti_source].v = push_array(tp_temp->v[0], U8 *, unique_leaf_refs.count); - task.ranges = tp_divide_work(scratch.arena, unique_leaf_refs.count, tp->worker_count); + task.ti_source = ti_source; + task.merged_types.count[ti_source] = unique_leaf_refs.count; + task.merged_types.v [ti_source] = push_array(tp_temp->v[0], U8 *, unique_leaf_refs.count); + task.ranges = tp_divide_work(scratch.arena, unique_leaf_refs.count, tp->worker_count); tp_for_parallel(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task); } - tp_for_parallel_prof(tp, 0, input->total_symbol_input_count, lnk_post_process_cv_symbols_task, &task, "Post Process CV Symbols"); + tp_for_parallel_prof(tp, 0, input->total_symbol_input_count, lnk_fixup_symbols_task, &task, "fixup type indices in symbols"); temp_end(scratch); ProfEnd(); - return task.types; + return task.merged_types; } internal @@ -2395,7 +2402,8 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) LNK_TypeNameReplacer *task = raw_task; Rng1U64 range = task->ranges[task_id]; - CV_DebugT debug_t = task->debug_t; + U64 leaf_count = task->leaf_count; + U8 **leaf_arr = task->leaf_arr; U64 hash_length = task->hash_length; B32 make_map = task->make_map; @@ -2409,8 +2417,8 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) U64 hash_max_chars = hash_length*2; char temp[128]; - for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + for EachInRange(leaf_idx, range) { + CV_Leaf leaf = cv_leaf_from_ptr(leaf_arr[leaf_idx]); if (leaf.kind == CV_LeafKind_STRUCTURE || leaf.kind == CV_LeafKind_CLASS) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); @@ -2446,24 +2454,28 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) udt_info.unique_name.size = size; // update leaf header - CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - header->size = sizeof(CV_LeafKind) + - sizeof(CV_LeafStruct) + - numeric_size + - udt_info.name.size + 1 + - udt_info.unique_name.size + 1; + U64 new_size = sizeof(CV_LeafKind) + + sizeof(CV_LeafStruct) + + numeric_size + + udt_info.name.size + 1 + + udt_info.unique_name.size + 1; + CV_LeafHeader *header = (CV_LeafHeader *)leaf_arr[leaf_idx]; + Assert(new_size <= max_U16); + memory_write16(MemberFromPtr(CV_LeafHeader, header, size), (U16)new_size); } else { // replace uniuqe type name with hash udt_info.unique_name.str = udt_info.name.str + udt_info.name.size + 1; udt_info.unique_name.size = raddbg_snprintf(udt_info.unique_name.cstr, udt_info.unique_name.size, "%llx", name_hash); // update leaf header - CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - header->size = sizeof(CV_LeafKind) + - sizeof(CV_LeafStruct) + - numeric_size + - udt_info.name.size + 1 + - udt_info.unique_name.size + 1; + U64 new_size = sizeof(CV_LeafKind) + + sizeof(CV_LeafStruct) + + numeric_size + + udt_info.name.size + 1 + + udt_info.unique_name.size + 1; + CV_LeafHeader *header = (CV_LeafHeader *)leaf_arr[leaf_idx]; + Assert(new_size <= max_U16); + memory_write16(MemberFromPtr(CV_LeafHeader, header, size), (U16)new_size); } } } @@ -2479,7 +2491,8 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) LNK_TypeNameReplacer *task = raw_task; Rng1U64 range = task->ranges[task_id]; - CV_DebugT debug_t = task->debug_t; + U64 leaf_count = task->leaf_count; + U8 **leaf_arr = task->leaf_arr; U64 hash_length = task->hash_length; B32 make_map = task->make_map; @@ -2492,8 +2505,8 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) U64 hash_max_chars = hash_length*2; - for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + for EachInRange(leaf_idx, range) { + CV_Leaf leaf = cv_leaf_from_ptr(leaf_arr[leaf_idx]); if (leaf.kind == CV_LeafKind_STRUCTURE || leaf.kind == CV_LeafKind_CLASS) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); @@ -2508,7 +2521,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) // hash name U64 name_hash; - blake3_hasher hasher; blake3_hasher_init(&hasher); + blake3_hasher hasher = {0}; blake3_hasher_init(&hasher); blake3_hasher_update(&hasher, udt_info.name.str, udt_info.name.size); blake3_hasher_finalize(&hasher, (U8*)&name_hash, sizeof(name_hash)); @@ -2525,8 +2538,10 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) U64 numeric_size = cv_read_numeric(leaf.data, sizeof(CV_LeafStruct), &dummy); // update header - CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - header->size = sizeof(CV_LeafKind) + sizeof(CV_LeafStruct) + numeric_size + udt_info.name.size + 1; + U64 new_size = sizeof(CV_LeafKind) + sizeof(CV_LeafStruct) + numeric_size + udt_info.name.size + 1; + CV_LeafHeader *header = (CV_LeafHeader *)leaf_arr[leaf_idx]; + Assert(new_size <= max_U16); + memory_write16(MemberFromPtr(CV_LeafHeader, header, size), (U16)new_size); // discard unique name CV_LeafStruct *lf = (CV_LeafStruct *)(header + 1); @@ -2539,15 +2554,16 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) } internal void -lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name) +lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name) { ProfBeginFunction(); Temp scratch = scratch_begin(arena->v, arena->count); // init task context LNK_TypeNameReplacer task = {0}; - task.debug_t = debug_t; - task.ranges = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count); + task.leaf_count = leaf_count; + task.leaf_arr = leaf_arr; + task.ranges = tp_divide_work(scratch.arena, leaf_count, tp->worker_count); task.hash_length = Clamp(1, hash_length, 16); if (map_name.size > 0) { @@ -3026,7 +3042,8 @@ lnk_build_pdb(TP_Context *tp, U64 total_symbol_input_count, LNK_CodeViewSymbolsInput *symbol_inputs, CV_SymbolListArray *parsed_symbols, - CV_DebugT types[CV_TypeIndexSource_COUNT]) + U64 leaf_count[CV_TypeIndexSource_COUNT], + U8 **leaf_arr [CV_TypeIndexSource_COUNT]) { ProfBegin("PDB"); Temp scratch = scratch_begin(tp_arena->v, tp_arena->count); @@ -3044,8 +3061,8 @@ lnk_build_pdb(TP_Context *tp, // // leaf data is stored in g_file_arena which has linker's life-time // and this way we skip redundant leaf copy to the type server to make things faster - pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_IPI], types[CV_TypeIndexSource_IPI]); - pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_TPI], types[CV_TypeIndexSource_TPI]); + pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_IPI], leaf_count[CV_TypeIndexSource_IPI], leaf_arr[CV_TypeIndexSource_IPI]); + pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_TPI], leaf_count[CV_TypeIndexSource_TPI], leaf_arr[CV_TypeIndexSource_TPI]); ProfBegin("Collect Symbols for GSI"); CV_SymbolList *gsi_list_arr = push_array(scratch.arena, CV_SymbolList, obj_count); @@ -3279,84 +3296,92 @@ THREAD_POOL_TASK_FUNC(lnk_build_udt_name_hash_table_task) LNK_BuildUDTNameHashTableTask *task = raw_task; LNK_UDTNameBucket *new_bucket = 0; + for EachInRange(leaf_idx, task->ranges[task_id]) { + String8 leaf_data = str8(task->leaf_arr[leaf_idx], max_U64); - for (U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) { - CV_Leaf leaf = cv_debug_t_get_leaf(task->debug_t, leaf_idx); - if (cv_is_udt(leaf.kind)) { - CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); - if (~udt_info.props & CV_TypeProp_FwdRef) { - if (!cv_is_udt_name_anon(udt_info.name)) { - String8 name = cv_name_from_udt_info(udt_info); - U64 hash = lnk_udt_name_hash_table_hash(name); - U64 best_idx = hash % task->buckets_cap; - U64 bucket_idx = best_idx; + CV_Leaf leaf; + cv_deserial_leaf(leaf_data, 0, 1, &leaf); - if (new_bucket == 0) { - new_bucket = push_array(arena, LNK_UDTNameBucket, 1); - } - new_bucket->name = name; - new_bucket->leaf_idx = leaf_idx; - - B32 is_inserted_or_updated = 0; - do { - retry:; - LNK_UDTNameBucket *curr_bucket = task->buckets[bucket_idx]; + // is this UDT? + if ( ! cv_is_udt(leaf.kind)) { continue; } - if (curr_bucket == 0) { - LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); + // skip forward references + CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); + if (udt_info.props & CV_TypeProp_FwdRef) { continue; } - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - is_inserted_or_updated = 1; - break; - } + // skip anon UDT + if (cv_is_udt_name_anon(udt_info.name)) { continue; } - // another thread took the bucket... - goto retry; - } else if (str8_match(curr_bucket->name, name, 0)) { - // there is more than one UDT with identical name, pick most recent and ignore others - - if (leaf_idx < curr_bucket->leaf_idx) { - LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - is_inserted_or_updated = 1; - break; - } - } else { - // don't need to update, more recent leaf is in the bucket - break; - } + // UDT name -> bucket index + String8 name = cv_name_from_udt_info(udt_info); + U64 hash = lnk_udt_name_hash_table_hash(name); + U64 best_idx = hash % task->buckets_cap; + U64 bucket_idx = best_idx; - // another thread took the bucket... - goto retry; - } + // push and fill bucket + if (new_bucket == 0) { new_bucket = push_array(arena, LNK_UDTNameBucket, 1); } + new_bucket->name = name; + new_bucket->leaf_idx = leaf_idx; - // advance - bucket_idx = (bucket_idx + 1) % task->buckets_cap; - } while (bucket_idx != best_idx); + B32 is_inserted_or_updated = 0; + do { + retry:; + LNK_UDTNameBucket *curr_bucket = task->buckets[bucket_idx]; - if (is_inserted_or_updated) { - new_bucket = 0; - } + if (curr_bucket == 0) { + LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); + + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + is_inserted_or_updated = 1; + break; } + + // another thread took the bucket... + goto retry; + } else if (str8_match(curr_bucket->name, name, 0)) { + // there is more than one UDT with identical name, pick most recent and ignore others + + if (leaf_idx < curr_bucket->leaf_idx) { + LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); + if (compare_bucket == curr_bucket) { + is_inserted_or_updated = 1; + break; + } + } else { + // don't need to update, more recent leaf is in the bucket + break; + } + + // another thread took the bucket... + goto retry; } + + // advance + bucket_idx = (bucket_idx + 1) % task->buckets_cap; + } while (bucket_idx != best_idx); + + if (is_inserted_or_updated) { + new_bucket = 0; } } } internal LNK_UDTNameBucket ** -lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, +lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, - CV_DebugT debug_t, + U64 leaf_count, + U8 **leaf_arr, U64 *buckets_cap_out) { Temp scratch = scratch_begin(&arena->v[0], 1); LNK_BuildUDTNameHashTableTask task = {0}; - task.debug_t = debug_t; - task.buckets_cap = (U64)((F64)debug_t.count * 1.3); + task.leaf_count = leaf_count; + task.leaf_arr = leaf_arr; + task.buckets_cap = (leaf_count * 13) / 10; task.buckets = push_array(arena->v[0], LNK_UDTNameBucket *, task.buckets_cap); - task.ranges = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, leaf_count, tp->worker_count); tp_for_parallel(tp, arena, tp->worker_count, lnk_build_udt_name_hash_table_task, &task); *buckets_cap_out = task.buckets_cap; scratch_end(scratch); @@ -3543,8 +3568,8 @@ lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype) // try to resovle forward reference (defn might be missing) if (itype >= tpi_range.min) { - U64 leaf_idx = itype - tpi_range.min; - CV_Leaf leaf = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], leaf_idx); + CV_Leaf leaf; + cv_deserial_leaf(str8(task->leaf_arr[CV_TypeIndexSource_TPI][itype - tpi_range.min], max_U64), 0, 1, &leaf); if (cv_is_udt(leaf.kind)) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); if (udt_info.props & CV_TypeProp_FwdRef) { @@ -3590,7 +3615,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_types_to_rdi_task) for(U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) { U64 itype = task->itype_ranges[CV_TypeIndexSource_TPI].min + leaf_idx; - CV_Leaf src = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], leaf_idx); + CV_Leaf src = cv_leaf_from_ptr(task->leaf_arr[CV_TypeIndexSource_TPI][leaf_idx]); switch (src.kind) { case CV_LeafKind_MODIFIER: { @@ -3613,7 +3638,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_types_to_rdi_task) CV_TypeIndex next_itype; for (next_itype = ptr->itype; task->itype_ranges[CV_TypeIndexSource_TPI].min <= next_itype && next_itype < task->itype_ranges[CV_TypeIndexSource_TPI].max;) { U64 next_leaf_idx = next_itype - task->itype_ranges[CV_TypeIndexSource_TPI].min; - CV_Leaf next_leaf = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], next_leaf_idx); + CV_Leaf next_leaf = cv_leaf_from_ptr(task->leaf_arr[CV_TypeIndexSource_TPI][next_leaf_idx]); if (next_leaf.kind != CV_LeafKind_MODIFIER) { break; } @@ -3909,7 +3934,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_types_to_rdi_task) if (contains_1u64(task->itype_ranges[CV_TypeIndexSource_TPI], method->list_itype)) { U64 method_list_leaf_idx = method->list_itype - task->itype_ranges[CV_TypeIndexSource_TPI].min; - CV_Leaf method_list_leaf = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], method_list_leaf_idx); + CV_Leaf method_list_leaf = cv_leaf_from_ptr(task->leaf_arr[CV_TypeIndexSource_TPI][method_list_leaf_idx]); if (method_list_leaf.kind == CV_LeafKind_METHODLIST) { for (U64 cursor = 0; cursor + sizeof(CV_LeafMethodListMember) <= method_list_leaf.data.size; ) { // parse CodeView method overload info @@ -5075,7 +5100,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) RDIB_Type *owner = 0; if (task->ipi_itype_range.min <= sym_inline_site->inlinee && sym_inline_site->inlinee < task->ipi_itype_range.max) { U64 leaf_idx = sym_inline_site->inlinee - task->tpi_itype_range.min; - CV_Leaf leaf = cv_debug_t_get_leaf(task->ipi, leaf_idx); + CV_Leaf leaf = cv_leaf_from_ptr(task->leaf_arr_ipi[leaf_idx]); if (leaf.kind == CV_LeafKind_MFUNC_ID) { if (sizeof(CV_LeafMFuncId) <= leaf.data.size) { CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId *) leaf.data.str; @@ -5260,7 +5285,8 @@ lnk_build_rad_debug_info(TP_Context *tp, U64 total_symbol_input_count, LNK_CodeViewSymbolsInput *symbol_inputs, CV_SymbolListArray *parsed_symbols, - CV_DebugT types[CV_TypeIndexSource_COUNT]) + U64 leaf_count[CV_TypeIndexSource_COUNT], + U8 **leaf_arr [CV_TypeIndexSource_COUNT]) { ProfBegin("RDI"); Temp scratch = scratch_begin(tp_arena->v,tp_arena->count); @@ -5314,7 +5340,7 @@ lnk_build_rad_debug_info(TP_Context *tp, // assing low and high type indices per source Rng1U64 itype_ranges[CV_TypeIndexSource_COUNT]; for (U64 i = 0; i < ArrayCount(itype_ranges); ++i) { - itype_ranges[i] = rng_1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + types[i].count); + itype_ranges[i] = rng_1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + leaf_count[i]); } ProfBegin("Convert Types"); @@ -5337,13 +5363,14 @@ lnk_build_rad_debug_info(TP_Context *tp, ProfBegin("Build UDT Name Hash Table"); // TODO: fix memory life-time udt_name_buckets_cap = 0; - udt_name_buckets = lnk_udt_name_hash_table_from_debug_t(tp, tp_arena, types[CV_TypeIndexSource_TPI], &udt_name_buckets_cap); + udt_name_buckets = lnk_udt_name_hash_table_from_leaf_arr(tp, tp_arena, leaf_count[CV_TypeIndexSource_TPI], leaf_arr[CV_TypeIndexSource_TPI], &udt_name_buckets_cap); ProfEnd(); ProfBegin("Convert CodeView types to RDIB Types"); LNK_ConvertTypesToRDI task = {0}; - task.types = types; + MemoryCopyTyped(&task.leaf_count[0], &leaf_count[0], CV_TypeIndexSource_COUNT); + MemoryCopyTyped(&task.leaf_arr[0], &leaf_arr[0], CV_TypeIndexSource_COUNT); task.type_cap = input.type_cap; task.udt_cap = input.udt_cap; task.variadic_type_ref = rdib_make_type_ref(scratch.arena, input.variadic_type); @@ -5360,7 +5387,7 @@ lnk_build_rad_debug_info(TP_Context *tp, task.rdib_types_params_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); task.rdib_udt_members_lists = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count); task.rdib_enum_members_lists = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count); - task.ranges = tp_divide_work(scratch.arena, types[CV_TypeIndexSource_TPI].count, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, leaf_count[CV_TypeIndexSource_TPI], tp->worker_count); tp_for_parallel(tp, tp_arena, tp->worker_count, lnk_convert_types_to_rdi_task, &task); ProfEnd(); @@ -5443,7 +5470,8 @@ lnk_build_rad_debug_info(TP_Context *tp, task.image_sects = image_sects; task.obj_arr = obj_arr; task.debug_s_arr = debug_s_arr; - task.ipi = types[CV_TypeIndexSource_IPI]; + task.leaf_arr_count_ipi = leaf_count[CV_TypeIndexSource_IPI]; + task.leaf_arr_ipi = leaf_arr[CV_TypeIndexSource_IPI]; task.symbol_inputs = symbol_inputs; task.parsed_symbols = parsed_symbols; task.ipi_itype_range = itype_ranges[CV_TypeIndexSource_IPI]; diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 61f34cfa..a70435bb 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -60,6 +60,12 @@ typedef struct LNK_CodeViewInput Rng1U64 external_obj_range; } LNK_CodeViewInput; +typedef struct LNK_MergedTypes +{ + U64 count[CV_TypeIndexSource_COUNT]; + U8 **v [CV_TypeIndexSource_COUNT]; +} LNK_MergedTypes; + // --- Leaf Ref ---------------------------------------------------------------- typedef enum @@ -202,7 +208,7 @@ typedef struct CV_SymbolList *symbol_list_arr; CV_DebugS *debug_s_arr; - CV_DebugT *types; + LNK_MergedTypes merged_types; } LNK_CvImportTypes; // --- Code View Processing Trasks --------------------------------------------- @@ -314,7 +320,8 @@ typedef struct typedef struct { - CV_DebugT debug_t; + U64 leaf_count; + U8 **leaf_arr; Rng1U64 *ranges; U64 hash_length; B32 make_map; @@ -332,7 +339,8 @@ typedef struct typedef struct { - CV_DebugT debug_t; + U64 leaf_count; + U8 **leaf_arr; Rng1U64 *ranges; U64 buckets_cap; LNK_UDTNameBucket **buckets; @@ -352,7 +360,8 @@ typedef struct typedef struct { - CV_DebugT *types; + U64 leaf_count[CV_TypeIndexSource_COUNT]; + U8 **leaf_arr[CV_TypeIndexSource_COUNT]; U64 type_cap; U64 udt_cap; RDIB_TypeRef variadic_type_ref; @@ -399,7 +408,8 @@ typedef struct COFF_SectionHeaderArray image_sects; LNK_Obj **obj_arr; CV_DebugS *debug_s_arr; - CV_DebugT ipi; + U64 leaf_arr_count_ipi; + U8 **leaf_arr_ipi; LNK_CodeViewSymbolsInput *symbol_inputs; CV_SymbolListArray *parsed_symbols; Rng1U64 ipi_itype_range; @@ -466,34 +476,36 @@ internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_re internal LNK_LeafRef * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 hash, LNK_LeafRef *new_bucket); internal LNK_LeafRef * lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); -internal CV_DebugT * lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); -internal void lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); +internal LNK_MergedTypes lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); +internal void lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); // --- RAD Debug info ---------------------------------------------------------- -internal U64 lnk_udt_name_hash_table_hash (String8 string); -internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out); -internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name); -internal CV_TypeIndex * lnk_build_udt_fwdmap (TP_Context *tp, Arena *arena, CV_DebugT debug_t, CV_TypeIndex ti_lo, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap); +internal U64 lnk_udt_name_hash_table_hash (String8 string); +internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out); +internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name); +internal CV_TypeIndex * lnk_build_udt_fwdmap (TP_Context *tp, Arena *arena, CV_DebugT debug_t, CV_TypeIndex ti_lo, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap); internal RDIB_TypeRef lnk_rdib_type_from_itype (LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop (CV_MethodProp prop); internal LNK_SourceFileBucket * lnk_src_file_hash_table_hash (String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); internal LNK_SourceFileBucket * lnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **src_file_buckets, U64 src_file_buckets_cap, U64 hash, String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); -internal String8List lnk_build_rad_debug_info(TP_Context *tp, - TP_Arena *tp_arena, - OperatingSystem os, - RDI_Arch arch, - String8 image_name, - String8 image_data, - U64 obj_count, - LNK_Obj **obj_arr, - CV_DebugS *debug_s_arr, - U64 total_symbol_input_count, - LNK_CodeViewSymbolsInput *symbol_inputs, - CV_SymbolListArray *parsed_symbols, - CV_DebugT types[CV_TypeIndexSource_COUNT]); +internal String8List +lnk_build_rad_debug_info(TP_Context *tp, + TP_Arena *tp_arena, + OperatingSystem os, + RDI_Arch arch, + String8 image_name, + String8 image_data, + U64 obj_count, + LNK_Obj **obj_arr, + CV_DebugS *debug_s_arr, + U64 total_symbol_input_count, + LNK_CodeViewSymbolsInput *symbol_inputs, + CV_SymbolListArray *parsed_symbols, + U64 leaf_count[CV_TypeIndexSource_COUNT], + U8 **leaf_arr [CV_TypeIndexSource_COUNT]); // --- PDB --------------------------------------------------------------------- @@ -515,12 +527,13 @@ internal String8List lnk_build_pdb(TP_Context *tp, U64 total_symbol_input_count, LNK_CodeViewSymbolsInput *symbol_inputs, CV_SymbolListArray *parsed_symbols, - CV_DebugT types[CV_TypeIndexSource_COUNT]); + U64 leaf_count[CV_TypeIndexSource_COUNT], + U8 **leaf_arr [CV_TypeIndexSource_COUNT]); // --- RAD Debug Info ---------------------------------------------------------- internal U64 lnk_udt_name_hash_table_hash (String8 string); -internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out); +internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out); internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name); internal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context *tp, diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index b20901e6..76b0c0bc 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1445,13 +1445,14 @@ internal THREAD_POOL_TASK_FUNC(pdb_count_udt_task) { PDB_PushLeafTask *task = raw_task; - Rng1U64 range = task->ranges[task_id]; - for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { - CV_Leaf leaf = cv_debug_t_get_leaf(task->debug_t, leaf_idx); + for EachInRange(leaf_idx, task->ranges[task_id]) { + CV_Leaf leaf; + cv_deserial_leaf(str8(task->leaf_arr[leaf_idx], max_U64), 0, 1, &leaf); + if (cv_is_udt(leaf.kind)) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); if (~udt_info.props & CV_TypeProp_FwdRef) { - ++task->udt_counts[task_id]; + task->udt_counts[task_id] += 1; } } } @@ -1462,27 +1463,27 @@ THREAD_POOL_TASK_FUNC(pdb_push_udt_leaf_task) { PDB_PushLeafTask *task = raw_task; PDB_TypeServer *type_server = task->type_server; - Rng1U64 range = task->ranges[task_id]; U64 bucket_cursor = task->udt_offsets[task_id]; - CV_DebugT debug_t = task->debug_t; PDB_TypeBucket *new_buckets = task->udt_buckets; U64 type_ht_cap = type_server->bucket_cap; PDB_TypeBucket **type_ht_buckets = type_server->buckets; U64 base_type_index = type_server->ti_lo + type_server->leaf_list.node_count; - for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) { - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + for EachInRange(leaf_idx, task->ranges[task_id]) { + CV_Leaf leaf; + cv_deserial_leaf(str8(task->leaf_arr[leaf_idx], max_U64), 0, 1, &leaf); + if (cv_is_udt(leaf.kind)) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); if (~udt_info.props & CV_TypeProp_FwdRef) { // hash udt and compute bucket index - U32 hash = pdb_hash_udt(udt_info, leaf.data); + U32 hash = pdb_hash_udt(udt_info, leaf.data); U32 bucket_idx = hash % type_ht_cap; // fill out & insert bucket PDB_TypeBucket *bucket = &new_buckets[bucket_cursor++]; - bucket->raw_leaf = cv_debug_t_get_raw_leaf(debug_t, leaf_idx); + bucket->raw_leaf = leaf.data; bucket->type_index = base_type_index + leaf_idx; bucket->next = ins_atomic_ptr_eval_assign(&type_ht_buckets[bucket_idx], bucket); } @@ -1490,16 +1491,36 @@ THREAD_POOL_TASK_FUNC(pdb_push_udt_leaf_task) } } +typedef struct +{ + Rng1U64 *ranges; + U8 **leaf_arr; + String8List *lists; + String8Node *nodes; +} PDB_String8ListFromLeafArray; + +internal +THREAD_POOL_TASK_FUNC(pdb_str8_list_from_leaf_array_task) +{ + PDB_String8ListFromLeafArray *task = raw_task; + for EachInRange(leaf_idx, task->ranges[task_id]) { + String8Node *node = &task->nodes[leaf_idx]; + node->string = cv_raw_leaf_from_ptr(task->leaf_arr[leaf_idx]); + str8_list_push_node(&task->lists[task_id], node); + } +} + internal void -pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *type_server, CV_DebugT debug_t) +pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *type_server, U64 leaf_count, U8 **leaf_arr) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); PDB_PushLeafTask task = {0}; - task.debug_t = debug_t; + task.leaf_count = leaf_count; + task.leaf_arr = leaf_arr; task.type_server = type_server; - task.ranges = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, leaf_count, tp->worker_count); ProfBegin("Count UDT"); task.udt_counts = push_array(scratch.arena, U64, tp->worker_count); @@ -1514,8 +1535,18 @@ pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *type_server, CV_De ProfEnd(); ProfBegin("Append New Leaves"); - String8List new_leaves = cv_str8_list_from_debug_t_parallel(tp, type_server->arena, debug_t); - str8_list_concat_in_place(&type_server->leaf_list, &new_leaves); + { + PDB_String8ListFromLeafArray task = {0}; + task.leaf_arr = leaf_arr; + task.ranges = tp_divide_work(scratch.arena, leaf_count, tp->worker_count); + task.lists = push_array(scratch.arena, String8List, tp->worker_count); + task.nodes = push_array_no_zero(type_server->arena, String8Node, leaf_count); + tp_for_parallel(tp, 0, tp->worker_count, pdb_str8_list_from_leaf_array_task, &task); + + // concat output lists + String8List list = {0}; + for EachIndex(task_id, tp->worker_count) { str8_list_concat_in_place(&type_server->leaf_list, &task.lists[task_id]); } + } ProfEnd(); scratch_end(scratch); diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h index f682e31e..529e75ab 100644 --- a/src/linker/pdb_ext/pdb_builder.h +++ b/src/linker/pdb_ext/pdb_builder.h @@ -119,7 +119,8 @@ typedef struct PDB_TypeServerParse typedef struct { - CV_DebugT debug_t; + U64 leaf_count; + U8 **leaf_arr; U64 *udt_counts; U64 *udt_offsets; Rng1U64 *ranges; @@ -474,7 +475,7 @@ internal PDB_TypeServer * pdb_type_server_open(MSF_Context *msf, MSF_Stre internal void pdb_type_server_build(TP_Context *tp, PDB_TypeServer *ts, PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn); internal void pdb_type_server_release(PDB_TypeServer **serv_ptr); internal void pdb_type_server_push(PDB_TypeServer *ts, String8 raw_leaf); -internal void pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *ts, CV_DebugT types); +internal void pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *ts, U64 leaf_count, U8 **leaf_arr); //internal CV_LeafNode * pdb_type_server_leaf_from_string(PDB_TypeServer *ts, String8 string); internal String8Node * pdb_type_server_reserve(PDB_TypeServer *ts, U64 count); internal String8Node * pdb_type_server_make_leaf(PDB_TypeServer *ts, CV_LeafKind kind, String8 data); From 4e4a806b33d6c127e0419cc4f8863eeb461c5e57 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 15 Feb 2026 23:17:59 -0800 Subject: [PATCH 205/850] pass over the aligner --- src/base/base_strings.c | 31 ++++++++++++------------------- src/linker/lnk.c | 6 +----- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index c5d11262..b59c0323 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1078,26 +1078,19 @@ str8_list_concat_in_place(String8List *list, String8List *to_push) } internal String8Node* -str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - U64 new_size = list->total_size + min; - U64 increase_size = 0; - if (align > 1){ - // NOTE(allen): assert is power of 2 - Assert(((align - 1) & align) == 0); - U64 mask = align - 1; - new_size += mask; - new_size &= (~mask); - increase_size = new_size - list->total_size; +str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align) +{ + read_only local_persist U8 zeroes[64] = {0}; + Assert(IsPow2OrZero(align)); + U64 pad = Max(min, AlignPadPow2(list->total_size, align)); + if(pad < sizeof(zeroes)) + { + return str8_list_push(arena, list, str8(zeroes, pad)); + } + else + { + return str8_list_push(arena, list, str8(push_array(arena, U8, pad), pad)); } - local_persist const U8 zeroes_buffer[64] = {0}; - Assert(increase_size <= ArrayCount(zeroes_buffer)); - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size = new_size; - node->string.str = (U8*)zeroes_buffer; - node->string.size = increase_size; - return(node); } internal String8Node* diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 4de0462c..bddfc842 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -4118,11 +4118,7 @@ lnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config } // align image headers - { - U64 image_headers_align_size = AlignPadPow2(result.total_size, config->file_align); - U8 *image_headers_align = push_array(arena, U8, image_headers_align_size); - str8_list_push(arena, &result, str8(image_headers_align, image_headers_align_size)); - } + str8_list_push_aligner(arena, &result, 0, config->file_align); // // entry point From c1e670a01c173e86b6672e1e7a6ea71fb18ab457 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 16 Feb 2026 12:18:01 -0800 Subject: [PATCH 206/850] type merging test --- src/torture/torture_main.c | 32 ++++++-- src/torture/torture_radlink.c | 144 ++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+), 8 deletions(-) diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index b7c2735c..71ab857f 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -10,23 +10,31 @@ //////////////////////////////// #include "base/base_inc.h" +#include "linker/hash_table.h" #include "os/os_inc.h" #include "obj/obj.h" -#include "linker/base_ext/base_core.h" -#include "linker/base_ext/base_arena.h" -#include "linker/base_ext/base_arrays.h" -#include "linker/hash_table.h" #include "coff/coff.h" #include "coff/coff_parse.h" #include "coff/coff_obj_writer.h" #include "coff/coff_lib_writer.h" #include "pe/pe.h" #include "pe/pe_section_flags.h" +#include "codeview/codeview.h" +#include "codeview/codeview_parse.h" +#include "msf/msf.h" +#include "msf/msf_parse.h" +#include "pdb/pdb.h" +#include "pdb/pdb_parse.h" #include "elf/elf.h" #include "elf/elf_parse.h" #include "dwarf/dwarf_inc.h" #include "regs/regs.h" #include "regs/dwarf/regs_dwarf.h" +#include "linker/base_ext/base_core.h" +#include "linker/base_ext/base_arena.h" +#include "linker/base_ext/base_arrays.h" +#include "linker/thread_pool/thread_pool.h" +#include "linker/codeview_ext/codeview.h" #include "linker/lnk_cmd_line.h" #include "linker/lnk_cmd_line.c" #include "linker/lnk_error.h" @@ -34,22 +42,30 @@ #include "torture_radlink.h" #include "base/base_inc.c" +#include "linker/hash_table.c" #include "os/os_inc.c" #include "obj/obj.c" -#include "linker/hash_table.c" -#include "linker/base_ext/base_core.c" -#include "linker/base_ext/base_arena.c" -#include "linker/base_ext/base_arrays.c" #include "coff/coff.c" #include "coff/coff_parse.c" #include "coff/coff_obj_writer.c" #include "coff/coff_lib_writer.c" #include "pe/pe.c" +#include "codeview/codeview.c" +#include "codeview/codeview_parse.c" +#include "msf/msf.c" +#include "msf/msf_parse.c" +#include "pdb/pdb.c" +#include "pdb/pdb_parse.c" #include "elf/elf.c" #include "elf/elf_parse.c" #include "dwarf/dwarf_inc.c" #include "regs/regs.c" #include "regs/dwarf/regs_dwarf.c" +#include "linker/base_ext/base_core.c" +#include "linker/base_ext/base_arena.c" +#include "linker/base_ext/base_arrays.c" +#include "linker/thread_pool/thread_pool.c" +#include "linker/codeview_ext/codeview.c" #include "torture.c" #include "torture_radlink.c" #include "torture_dwarf.c" diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index c6909da1..3f246873 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -3941,6 +3941,150 @@ T_BeginTest(long_section_name) } T_EndTest; +T_BeginTest(merge_duplicate_types) +{ + { + String8 debug_t; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(scratch.arena, &srl, &ptr); + str8_serial_push_align(scratch.arena, &srl, 4); + + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(scratch.arena, &srl, &proc); + str8_serial_push_align(scratch.arena, &srl, 4); + + debug_t = str8_serial_end(scratch.arena, &srl); + } + + String8 same_but_different; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_LeafPointer ptr = { .itype = CV_BasicType_SHORT }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(scratch.arena, &srl, &ptr); + str8_serial_push_align(scratch.arena, &srl, 4); + + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(scratch.arena, &srl, &proc); + str8_serial_push_align(scratch.arena, &srl, 4); + + same_but_different = str8_serial_end(scratch.arena, &srl); + } + + String8 a_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t); + a_obj = coff_obj_writer_serialize(scratch.arena, cow); + } + + String8 b_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t); + b_obj = coff_obj_writer_serialize(scratch.arena, cow); + } + + String8 c_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, same_but_different); + c_obj = coff_obj_writer_serialize(scratch.arena, cow); + } + + String8 entry_obj = t_make_entry_obj(scratch.arena); + + T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); + T_Ok(t_write_file(str8_lit("c.obj"), c_obj)); + + t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe a.obj b.obj c.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + } + + // load msf + String8 pdb = t_read_file(scratch.arena, str8_lit("a.pdb")); + MSF_Parsed *msf = msf_parsed_from_data(scratch.arena, pdb); + // find named streams + String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_Info); + PDB_Info *pdb_info = pdb_info_from_data(scratch.arena, info_data); + PDB_NamedStreamTable *named_streams = pdb_named_stream_table_from_info(scratch.arena, pdb_info); + // find string table + MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_StringTable]; + String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); + PDB_Strtbl *strtbl = pdb_strtbl_from_data(scratch.arena, strtbl_data); + // find TPI + String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi); + PDB_TpiParsed *tpi = pdb_tpi_from_data(scratch.arena, tpi_data); + + U64 type_count = tpi->itype_opl - tpi->itype_first; + T_Ok(type_count == 4); + + CV_DebugT debug_t = cv_debug_t_from_data(scratch.arena, pdb_leaf_data_from_tpi(tpi), 4); + T_Ok(debug_t.count == type_count); + + { + CV_Leaf ptr_leaf = cv_debug_t_get_leaf(debug_t, 0); + T_Ok(ptr_leaf.kind == CV_LeafKind_POINTER); + T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer) + sizeof(CV_LeafHeader)); + + CV_LeafPointer *ptr = (CV_LeafPointer *)(ptr_leaf.data.str + sizeof(CV_LeafHeader)); + T_Ok(ptr->itype == CV_BasicType_VOID); + T_Ok(ptr->attribs == 0); + } + + { + CV_Leaf proc_leaf = cv_debug_t_get_leaf(debug_t, 1); + T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); + T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure) + sizeof(CV_LeafHeader)); + + CV_LeafProcedure *proc = (CV_LeafProcedure *)(proc_leaf.data.str + sizeof(CV_LeafHeader)); + T_Ok(proc->ret_itype == 0x1000); + T_Ok(proc->call_kind == CV_CallKind_NearC); + } + + { + CV_Leaf ptr_leaf = cv_debug_t_get_leaf(debug_t, 2); + T_Ok(ptr_leaf.kind == CV_LeafKind_POINTER); + T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer) + sizeof(CV_LeafHeader)); + + CV_LeafPointer *ptr = (CV_LeafPointer *)(ptr_leaf.data.str + sizeof(CV_LeafHeader)); + T_Ok(ptr->itype == CV_BasicType_SHORT); + T_Ok(ptr->attribs == 0); + } + + { + CV_Leaf proc_leaf = cv_debug_t_get_leaf(debug_t, 3); + T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); + T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure) + sizeof(CV_LeafHeader)); + + CV_LeafProcedure *proc = (CV_LeafProcedure *)(proc_leaf.data.str + sizeof(CV_LeafHeader)); + T_Ok(proc->ret_itype == 0x1002); + T_Ok(proc->call_kind == CV_CallKind_NearC); + } +} +T_EndTest; + #if 0 T_BeginTest(fold_two_funcs) From 3e5c8ab9f65bf058f18e223e0940624267eddb4c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 16 Feb 2026 13:20:13 -0800 Subject: [PATCH 207/850] minor test fixes --- src/torture/torture_radlink.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 3f246873..2c7bec87 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4046,9 +4046,9 @@ T_BeginTest(merge_duplicate_types) { CV_Leaf ptr_leaf = cv_debug_t_get_leaf(debug_t, 0); T_Ok(ptr_leaf.kind == CV_LeafKind_POINTER); - T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer) + sizeof(CV_LeafHeader)); + T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer)); - CV_LeafPointer *ptr = (CV_LeafPointer *)(ptr_leaf.data.str + sizeof(CV_LeafHeader)); + CV_LeafPointer *ptr = (CV_LeafPointer *)ptr_leaf.data.str; T_Ok(ptr->itype == CV_BasicType_VOID); T_Ok(ptr->attribs == 0); } @@ -4056,9 +4056,9 @@ T_BeginTest(merge_duplicate_types) { CV_Leaf proc_leaf = cv_debug_t_get_leaf(debug_t, 1); T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); - T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure) + sizeof(CV_LeafHeader)); + T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure)); - CV_LeafProcedure *proc = (CV_LeafProcedure *)(proc_leaf.data.str + sizeof(CV_LeafHeader)); + CV_LeafProcedure *proc = (CV_LeafProcedure *)proc_leaf.data.str; T_Ok(proc->ret_itype == 0x1000); T_Ok(proc->call_kind == CV_CallKind_NearC); } @@ -4066,9 +4066,9 @@ T_BeginTest(merge_duplicate_types) { CV_Leaf ptr_leaf = cv_debug_t_get_leaf(debug_t, 2); T_Ok(ptr_leaf.kind == CV_LeafKind_POINTER); - T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer) + sizeof(CV_LeafHeader)); + T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer)); - CV_LeafPointer *ptr = (CV_LeafPointer *)(ptr_leaf.data.str + sizeof(CV_LeafHeader)); + CV_LeafPointer *ptr = (CV_LeafPointer *)ptr_leaf.data.str; T_Ok(ptr->itype == CV_BasicType_SHORT); T_Ok(ptr->attribs == 0); } @@ -4076,9 +4076,9 @@ T_BeginTest(merge_duplicate_types) { CV_Leaf proc_leaf = cv_debug_t_get_leaf(debug_t, 3); T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); - T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure) + sizeof(CV_LeafHeader)); + T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure)); - CV_LeafProcedure *proc = (CV_LeafProcedure *)(proc_leaf.data.str + sizeof(CV_LeafHeader)); + CV_LeafProcedure *proc = (CV_LeafProcedure *)proc_leaf.data.str; T_Ok(proc->ret_itype == 0x1002); T_Ok(proc->call_kind == CV_CallKind_NearC); } From 442f41b51a53dcf35d916100eafc51d5350cd6ea Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 16 Feb 2026 13:39:49 -0800 Subject: [PATCH 208/850] inline byte hashing around type indices --- src/linker/lnk_debug_info.c | 50 +++++++++++++++++++------------------ src/linker/lnk_debug_info.h | 2 +- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index bec8e05c..99f3d28e 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1144,8 +1144,7 @@ skip_type_index_compare:; #endif internal U64 -lnk_hash_cv_leaf(Arena *arena, - LNK_CodeViewInput *input, +lnk_hash_cv_leaf(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, @@ -1157,24 +1156,32 @@ lnk_hash_cv_leaf(Arena *arena, // init hasher blake3_hasher hasher; blake3_hasher_init(&hasher); - // hash leaf size - blake3_hasher_update(&hasher, &leaf.data.size, sizeof leaf.data.size); - - // hash leaf kind - blake3_hasher_update(&hasher, &leaf.kind, sizeof leaf.kind); + // hash leaf header + { + CV_LeafHeader header; + header.size = (U16)leaf.data.size; + header.kind = leaf.kind; + blake3_hasher_update(&hasher, &header, sizeof(header)); + } // hash bytes around indices { - Temp temp = temp_begin(arena); - String8Array raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, leaf.data); - for (U64 i = 0; i < raw_data_arr.count; ++i) { - blake3_hasher_update(&hasher, raw_data_arr.v[i].str, raw_data_arr.v[i].size); + U64 last_ti_off = 0; + for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { + U8 *bytes = leaf.data.str + last_ti_off; + U64 size = ti_info->offset - last_ti_off; + blake3_hasher_update(&hasher, bytes, size); + last_ti_off = ti_info->offset + sizeof(CV_TypeIndex); } - temp_end(temp); + + Assert(leaf.data.size >= last_ti_off); + U8 *bytes = leaf.data.str + last_ti_off; + U64 size = leaf.data.size - last_ti_off; + blake3_hasher_update(&hasher, bytes, size); } // mix-in sub leaf hashes - for (CV_TypeIndexInfo *ti_n = ti_info_list.first; ti_n != 0; ti_n = ti_n->next) { + for EachNode(ti_n, CV_TypeIndexInfo, ti_info_list.first) { CV_TypeIndex sub_ti = memory_read32(leaf.data.str + ti_n->offset); // is type index complex? @@ -1209,7 +1216,7 @@ lnk_hash_cv_leaf(Arena *arena, Assert(sub_hash != 0); // mix-in sub hash - blake3_hasher_update(&hasher, &sub_hash, sizeof sub_hash); + blake3_hasher_update(&hasher, &sub_hash, sizeof(sub_hash)); } else { Temp scratch = scratch_begin(0,0); String8 leaf_kind_str = cv_string_from_leaf_kind(leaf.kind); @@ -1226,12 +1233,12 @@ lnk_hash_cv_leaf(Arena *arena, } // simple indices are stable across compile units else { - blake3_hasher_update(&hasher, &sub_ti, sizeof sub_ti); + blake3_hasher_update(&hasher, &sub_ti, sizeof(sub_ti)); } } U64 hash; - blake3_hasher_finalize(&hasher, (U8 *) &hash, sizeof hash); + blake3_hasher_finalize(&hasher, (U8 *) &hash, sizeof(hash)); return hash; } @@ -1312,8 +1319,7 @@ lnk_hash_cv_leaf_deep(Arena *arena, SLLStackPush(stack, frame); break; } else { - curr_hashes[curr_ti_info->source][ti_idx] = lnk_hash_cv_leaf(temp.arena, - input, + curr_hashes[curr_ti_info->source][ti_idx] = lnk_hash_cv_leaf(input, hashes, loc_type, loc_idx, @@ -1331,10 +1337,8 @@ lnk_hash_cv_leaf_deep(Arena *arena, if (stack != root_frame) { // sub leaves are hashed we can now hash parent leaf - Temp temp2 = temp_begin(temp.arena); U64 leaf_idx = stack->ti - ti_ranges[stack->ti_source].min; - curr_hashes[stack->ti_source][leaf_idx] = lnk_hash_cv_leaf(temp2.arena, - input, + curr_hashes[stack->ti_source][leaf_idx] = lnk_hash_cv_leaf(input, hashes, loc_type, loc_idx, @@ -1342,7 +1346,6 @@ lnk_hash_cv_leaf_deep(Arena *arena, CV_TypeIndex_Max, stack->leaf, stack->ti_info_list); - temp_end(temp2); } SLLStackPop(stack); @@ -1487,8 +1490,7 @@ THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_task) CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); - out_hashes[leaf_idx] = lnk_hash_cv_leaf(temp.arena, - task->input, + out_hashes[leaf_idx] = lnk_hash_cv_leaf(task->input, task->hashes, LNK_LeafLocType_Internal, obj_idx, diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index a70435bb..a5bb23a3 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -468,7 +468,7 @@ internal LNK_LeafRef lnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput *in internal B32 lnk_match_leaf_ref (LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); // leaf hashing -internal U64 lnk_hash_cv_leaf (Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); +internal U64 lnk_hash_cv_leaf (LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, String8 data); internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); From 2083c1ed87f73338d834ed2904a58f4542299c87 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 16 Feb 2026 20:32:36 -0800 Subject: [PATCH 209/850] serialize symbols directly into MSF streams --- src/linker/codeview_ext/codeview.c | 38 +++- src/linker/codeview_ext/codeview.h | 3 + src/linker/lnk_debug_info.c | 328 +++++++++++++---------------- src/linker/lnk_debug_info.h | 22 +- src/linker/pdb_ext/msf_builder.c | 11 +- 5 files changed, 202 insertions(+), 200 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index c6989dd2..589fb4b6 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -545,6 +545,40 @@ cv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig) return srl; } +internal U64 +cv_size_from_debug_s(CV_DebugS *debug_s, U64 align) +{ + U64 size = 0; + for EachElement(i, debug_s->data_list) { + if (i == CV_C13SubSectionIdxKind_Lines) { continue; } + if (debug_s->data_list[i].total_size == 0) { continue; } + size += sizeof(CV_C13SubSectionKind) + sizeof(U32); // header + size += debug_s->data_list[i].total_size; + size = AlignPow2(size, align); + } + + String8List *line_data = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + for EachNode(line_n, String8Node, line_data->first) { + if (line_n->string.size == 0) { continue; } + size += sizeof(CV_C13SubSectionKind) + sizeof(U32); // header + size += line_n->string.size; + size = AlignPow2(size, align); + } + + return size; +} + +internal CV_C13SubSectionKind +cv_c13_sub_section_kind_from_idx(CV_C13SubSectionIdxKind idx) +{ + switch (idx) { +#define X(n, c) case CV_C13SubSectionIdxKind_##n: return c; + CV_C13SubSectionKindXList(X) +#undef X + } + return 0; +} + internal CV_C13SubSectionIdxKind cv_c13_sub_section_idx_from_kind(CV_C13SubSectionKind kind) { @@ -1520,8 +1554,8 @@ internal CV_ChecksumList cv_c13_parse_checksum_data_list(Arena *arena, String8List checksum_data_list) { CV_ChecksumList result = {0}; - for (String8Node *node = checksum_data_list.first; node != 0; node = node->next) { - cv_parse_checksum_data(arena, &result, node->string); + for EachNode(n, String8Node, checksum_data_list.first) { + cv_parse_checksum_data(arena, &result, n->string); } return result; } diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index 354a0e14..64e7b34d 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -403,8 +403,11 @@ internal CV_Signature cv_signature_from_debug_s(String8 raw_debug_s); internal CV_DebugS cv_parse_debug_s(Arena *arena, String8 raw_debug_s); internal void cv_debug_s_concat_in_place(CV_DebugS *dst, CV_DebugS *src); internal String8List cv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig); +internal U64 cv_size_from_debug_s(CV_DebugS *debug_s, U64 align); +internal CV_C13SubSectionKind cv_c13_sub_section_kind_from_idx(CV_C13SubSectionIdxKind idx); internal CV_C13SubSectionIdxKind cv_c13_sub_section_idx_from_kind(CV_C13SubSectionKind kind); + internal String8List * cv_sub_section_ptr_from_debug_s(CV_DebugS *debug_s, CV_C13SubSectionKind kind); internal String8List cv_sub_section_from_debug_s(CV_DebugS debug_s, CV_C13SubSectionKind kind); internal String8 cv_string_table_from_debug_s(CV_DebugS debug_s); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 99f3d28e..c413e9f1 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -517,11 +517,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } ProfEnd(); - ProfBegin("Symbol Parse"); - LNK_ParseCVSymbolsTaskData task = {0}; - task.inputs = symbol_inputs; - tp_for_parallel(tp, tp_arena, total_symbol_input_count, lnk_parse_cv_symbols_task, &task); - ProfEnd(); + tp_for_parallel_prof(tp, tp_arena, total_symbol_input_count, lnk_parse_cv_symbols_task, &(LNK_ParseCVSymbolsTaskData){ .inputs = symbol_inputs }, "Symbol Parse"); // TODO: do we rely on this behaviour? // @@ -2670,61 +2666,21 @@ THREAD_POOL_TASK_FUNC(lnk_make_proc_refs_task) } internal -THREAD_POOL_TASK_FUNC(lnk_process_sym_data_task) +THREAD_POOL_TASK_FUNC(lnk_fixup_symbol_offsets_task) { ProfBeginFunction(); - U64 obj_idx = task_id; - LNK_ProcessSymDataTaskData *task = raw_task; - CV_SymbolListArray parsed_symbols = task->parsed_symbols[obj_idx]; + LNK_ProcessSymDataTaskData *task = raw_task; + CV_SymbolListArray symbols = task->parsed_symbols[task_id]; - static CV_Signature MODULE_SYMBOL_SIGNATURE = CV_Signature_C13; - - ProfBegin("Compute Buffer Size"); - U64 buffer_size = sizeof(MODULE_SYMBOL_SIGNATURE); - for (U64 i = 0; i < parsed_symbols.count; ++i) { - CV_SymbolList list = parsed_symbols.v[i]; - U64 data_size = cv_patch_symbol_tree_offsets(list, buffer_size, PDB_SYMBOL_ALIGN); - buffer_size += data_size; + // fixup symbol offsets and estimate symbol data size + U64 size = sizeof(CV_Signature); + for EachIndex(i, symbols.count) { + size += cv_patch_symbol_tree_offsets(symbols.v[i], size, PDB_SYMBOL_ALIGN); } + task->serialized_symbol_data_sizes[task_id] = AlignPow2(size, CV_C13SubSectionAlign); + ProfEnd(); - - // alloc buffer - U8 *buffer = push_array_no_zero(arena, U8, buffer_size); - U64 buffer_cursor = 0; - - // MS Symbol and Type Information p.4: - // "The first four bytes of the $$SYMBOLS segment is used as a signature to specify the version of - // the Symbol and Type OMF contained in the $$SYMBOLS segment." - CV_Signature *sig_ptr = (CV_Signature *) (buffer + buffer_cursor); - *sig_ptr = MODULE_SYMBOL_SIGNATURE; - buffer_cursor += sizeof(*sig_ptr); - - ProfBegin("Serialize Symbols"); - for (U64 i = 0; i < parsed_symbols.count; ++i) { - CV_SymbolList list = parsed_symbols.v[i]; - for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) { - symbol_n->data.offset = buffer_cursor; - buffer_cursor += cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, &symbol_n->data, PDB_SYMBOL_ALIGN); - } - } - ProfEnd(); - - // output - Assert(task->symbol_data_arr[obj_idx].total_size == 0); - str8_list_push(arena, &task->symbol_data_arr[obj_idx], str8(buffer, buffer_size)); - - ProfEnd(); -} - -internal LNK_ProcessedCodeViewC11Data -lnk_process_c11_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr) -{ - // TODO: handle c11 data - String8List *data_list_arr = push_array(arena->v[0], String8List, obj_count); - LNK_ProcessedCodeViewC11Data result; - result.data_list_arr = data_list_arr; - return result; } internal @@ -2750,108 +2706,114 @@ THREAD_POOL_TASK_FUNC(lnk_process_c13_data_task) // relocate checksum data cv_c13_patch_string_offsets_in_checksum_list(checksum_list, string_data, task->string_data_base_offset, task->string_ht); - // get module sub-sections - PDB_DbiModule *mod = task->dbi_mod_arr[obj_idx]; - String8 mod_c13_data = dbi_module_read_c13_data(scratch.arena, task->msf, mod); - CV_DebugS mod_debug_s = cv_parse_debug_s_c13(scratch.arena, mod_c13_data); - - // relocate line and frame data - String8List *mod_checksum_data = cv_sub_section_ptr_from_debug_s(&mod_debug_s, CV_C13SubSectionKind_FileChksms); - U64 checksum_base = mod_checksum_data->total_size; - B32 is_checksum_patch_needed = checksum_base > 0; - if (is_checksum_patch_needed) { - String8List line_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); - String8List frame_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FrameData); - cv_c13_patch_checksum_offsets_in_line_data_list(line_data, checksum_base); - cv_c13_patch_checksum_offsets_in_frame_data_list(frame_data, checksum_base); - } - - // push obj c13 data to module - cv_debug_s_concat_in_place(&mod_debug_s, &debug_s); - - // serialize c13 data - B32 include_sig = 0; - String8List c13_data = cv_data_c13_from_debug_s(arena, &mod_debug_s, include_sig); - // store for later pass - task->c13_data_arr[obj_idx] = c13_data; task->source_file_names_list_arr[obj_idx] = source_file_names_list; scratch_end(scratch); ProfEnd(); } -internal LNK_ProcessedCodeViewC13Data -lnk_process_c13_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr) -{ - ProfBeginFunction(); - - LNK_ProcessC13DataTask task = {0}; - task.debug_s_arr = debug_s_arr; - task.msf = msf; - task.dbi_mod_arr = mod_arr; - task.c13_data_arr = push_array_no_zero(arena->v[0], String8List, obj_count); - task.source_file_names_list_arr = push_array_no_zero(arena->v[0], String8List, obj_count); - task.string_data_base_offset = string_data_base_offset; - task.string_ht = string_ht; - tp_for_parallel(tp, arena, obj_count, lnk_process_c13_data_task, &task); - - // fill out result - LNK_ProcessedCodeViewC13Data result = {0}; - result.data_list_arr = task.c13_data_arr; - result.source_file_names_list_arr = task.source_file_names_list_arr; - - ProfEnd(); - return result; -} - internal THREAD_POOL_TASK_FUNC(lnk_write_module_data_task) { - U64 obj_idx = task_id; LNK_WriteModuleDataTask *task = raw_task; - PDB_DbiModule *mod = task->mod_arr[obj_idx]; - String8List sym_data = task->symbol_data_arr[obj_idx]; - String8List c11_data = task->c11_data_list_arr[obj_idx]; - String8List c13_data = task->c13_data_list_arr[obj_idx]; - String8List globrefs = task->globrefs_arr[obj_idx]; - - U32 sym_data_size32 = safe_cast_u32(sym_data.total_size); - U32 c11_data_size32 = safe_cast_u32(c11_data.total_size); - U32 c13_data_size32 = safe_cast_u32(c13_data.total_size); - U32 globrefs_size32 = safe_cast_u32(globrefs.total_size); - - // layout module data - String8List module_data = {0}; - str8_list_concat_in_place(&module_data, &sym_data); - str8_list_concat_in_place(&module_data, &c11_data); - str8_list_concat_in_place(&module_data, &c13_data); - str8_list_concat_in_place(&module_data, &globrefs); + U64 obj_idx = task_id; + PDB_DbiModule *mod = task->mod_arr [obj_idx]; + CV_DebugS *debug_s = &task->debug_s_arr [obj_idx]; + CV_SymbolListArray parsed_symbols = task->parsed_symbols [obj_idx]; + String8List globrefs = task->globrefs_arr [obj_idx]; + U64 sym_data_size = task->serialized_symbol_data_sizes[obj_idx]; + + MSF_UInt stream_cap = msf_stream_get_cap(task->msf, mod->sn); + + // write symbols + if (sym_data_size > 0) { + Temp scratch = scratch_begin(&arena, 1); + + U64 temp_max = max_U16; + U64 temp_size = 0; + U8 *temp = push_array(scratch.arena, U8, temp_max); + + msf_stream_write_u32(task->msf, mod->sn, CV_Signature_C13); + + for EachIndex(i, parsed_symbols.count) { + for EachNode(symbol_n, CV_SymbolNode, parsed_symbols.v[i].first) { + U64 symbol_size = cv_compute_symbol_record_size(&symbol_n->data, PDB_SYMBOL_ALIGN); + + // flush temp + if (temp_size + symbol_size > temp_max) { + Assert(temp_size <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); + msf_stream_write(task->msf, mod->sn, temp, temp_size); + temp_size = 0; + } + + U64 serial_size = cv_serialize_symbol_to_buffer(temp, temp_size, temp_max, &symbol_n->data, PDB_SYMBOL_ALIGN); + Assert(serial_size == symbol_size); + temp_size += serial_size; + } + } + + // flush remaining temp + Assert(temp_size <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); + msf_stream_write(task->msf, mod->sn, temp, temp_size); + msf_stream_align(task->msf, mod->sn, CV_C13SubSectionAlign); + + U64 size = msf_stream_get_pos(task->msf, mod->sn); + // assert our symbol size estimate was correct + Assert(sym_data_size == msf_stream_get_pos(task->msf, mod->sn)); + + scratch_end(scratch); + } + + // write rest of c13 data + U64 c13_data_size; + { + U64 c13_start_pos = msf_stream_get_pos(task->msf, mod->sn); + + for EachElement(layout_idx, debug_s->data_list) { + if (layout_idx == CV_C13SubSectionIdxKind_Lines || layout_idx == CV_C13SubSectionIdxKind_Symbols) { continue; } + + CV_C13SubSectionKind kind = cv_c13_sub_section_kind_from_idx(layout_idx); + String8List *data = cv_sub_section_ptr_from_debug_s(debug_s, kind); + if (data->total_size == 0) { continue; } + + Assert(AlignPow2(sizeof(U32)*2 + data->total_size, PDB_SYMBOL_ALIGN) <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); + msf_stream_write_u32 (task->msf, mod->sn, kind); + msf_stream_write_u32 (task->msf, mod->sn, safe_cast_u32(data->total_size)); + msf_stream_write_list(task->msf, mod->sn, *data); + msf_stream_align(task->msf, mod->sn, CV_C13SubSectionAlign); + } + + String8List *line_data = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + for EachNode(line_n, String8Node, line_data->first) { + if (line_n->string.size == 0) { continue; } + + Assert(AlignPow2(sizeof(U32)*2 + line_n->string.size, PDB_SYMBOL_ALIGN) <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); + msf_stream_write_u32 (task->msf, mod->sn, CV_C13SubSectionKind_Lines); + msf_stream_write_u32 (task->msf, mod->sn, safe_cast_u32(line_n->string.size)); + msf_stream_write_string(task->msf, mod->sn, line_n->string); + msf_stream_align(task->msf, mod->sn, CV_C13SubSectionAlign); + } + + U64 c13_end_pos = msf_stream_get_pos(task->msf, mod->sn); + c13_data_size = c13_end_pos - c13_start_pos; + Assert(c13_data_size == cv_size_from_debug_s(debug_s, CV_C13SubSectionAlign)); + } + + // write global refs + Assert(globrefs.total_size <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); + msf_stream_write_list(task->msf, mod->sn, globrefs); + + // update module data sizes + mod->sym_data_size = safe_cast_u32(sym_data_size); + mod->c11_data_size = 0; + mod->c13_data_size = safe_cast_u32(c13_data_size); + mod->globrefs_size = safe_cast_u32(globrefs.total_size); // make stream has enough memory so it doens't trigger memory allocations in MSF // during multi-thread write - MSF_UInt stream_pos = msf_stream_get_pos(task->msf, mod->sn); - if (stream_pos != 0) { - Assert(!"stream must be at start position"); - } - MSF_UInt stream_cap = msf_stream_get_cap(task->msf, mod->sn); - if (stream_cap < module_data.total_size) { - Assert(!"not enough bytes in destination stream to copy module data"); - } - - // write data - B32 is_write_ok = msf_stream_write_list(task->msf, mod->sn, module_data); - - // update module data sizes - if (is_write_ok) { - mod->sym_data_size = sym_data_size32; - mod->c11_data_size = c11_data_size32; - mod->c13_data_size = c13_data_size32; - mod->globrefs_size = globrefs_size32; - } else { - // TODO: error handle - } + AssertAlways(task->mod_sizes[obj_idx] == msf_stream_get_pos(task->msf, mod->sn)); } internal @@ -3078,7 +3040,7 @@ lnk_build_pdb(TP_Context *tp, ProfBegin("Reserve DBI Modules"); PDB_DbiModule **mod_arr = push_array(tp_arena->v[0], PDB_DbiModule *, obj_count); - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + for EachIndex(obj_idx, obj_count) { LNK_Obj *obj = obj_arr[obj_idx]; mod_arr[obj_idx] = dbi_push_module(pdb->dbi, obj->path, lnk_obj_get_lib_path(obj)); @@ -3094,33 +3056,41 @@ lnk_build_pdb(TP_Context *tp, pdb_strtab_add_cv_string_hash_table(&pdb->info->strtab, string_ht); ProfEnd(); + ProfBegin("Build Source Files List"); + { + // push source files per module info + LNK_ProcessC13DataTask task = {0}; + task.debug_s_arr = debug_s_arr; + task.string_data_base_offset = string_data_base_offset; + task.source_file_names_list_arr = push_array_no_zero(tp_arena->v[0], String8List, obj_count); + task.string_ht = string_ht; + tp_for_parallel(tp, tp_arena, obj_count, lnk_process_c13_data_task, &task); + + for EachIndex(obj_idx, obj_count) { + String8List source_file_list = str8_list_copy(pdb->dbi->arena, &task.source_file_names_list_arr[obj_idx]); + str8_list_concat_in_place(&mod_arr[obj_idx]->source_file_list, &source_file_list); + } + + // zero out string table sub section + for EachIndex(obj_idx, obj_count) { + MemoryZeroStruct(&debug_s_arr[obj_idx].data_list[CV_C13SubSectionIdxKind_StringTable]); + } + } + ProfEnd(); + ProfBegin("Build DBI Modules"); { TP_Temp temp = tp_temp_begin(tp_arena); { - ProfBegin("Reloc Module Data"); - - ProfBegin("Serialize Symbols"); - String8List *serialized_symbol_data = push_array(scratch.arena, String8List, obj_count); - { - LNK_ProcessSymDataTaskData task = {0}; - task.symbol_inputs = symbol_inputs; - task.parsed_symbols = parsed_symbols; - task.mod_arr = mod_arr; - task.symbol_data_arr = serialized_symbol_data; - tp_for_parallel(tp, tp_arena, obj_count, lnk_process_sym_data_task, &task); - } - ProfEnd(); - - LNK_ProcessedCodeViewC11Data processed_c11 = lnk_process_c11_data(tp, tp_arena, obj_count, debug_s_arr, string_data_base_offset, string_ht, pdb->msf, mod_arr); - LNK_ProcessedCodeViewC13Data processed_c13 = lnk_process_c13_data(tp, tp_arena, obj_count, debug_s_arr, string_data_base_offset, string_ht, pdb->msf, mod_arr); - + ProfBegin("Fixup Symbol Offsets"); + U64 *serialized_symbol_data_sizes = push_array(scratch.arena, U64, obj_count); + tp_for_parallel(tp, tp_arena, obj_count, lnk_fixup_symbol_offsets_task, &(LNK_ProcessSymDataTaskData){ .parsed_symbols = parsed_symbols, .serialized_symbol_data_sizes = serialized_symbol_data_sizes }); ProfEnd(); // TODO: actually collect offsets and pass them here ProfBegin("Build Empty Global Reference Array"); String8List *globrefs_arr = push_array(tp_arena->v[0], String8List, obj_count); - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + for EachIndex(obj_idx, obj_count) { String8List *globrefs = &globrefs_arr[obj_idx]; str8_serial_begin(tp_arena->v[0], globrefs); Assert(globrefs->total_size == 0); @@ -3130,43 +3100,33 @@ lnk_build_pdb(TP_Context *tp, // reserve memory for module streams ProfBegin("Reserve Modules Memory"); - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { + U32 *mod_sizes = push_array(scratch.arena, U32, obj_count); + for EachIndex(obj_idx, obj_count) { // compute number of bytes needed for module data U64 mod_size = 0; - mod_size += serialized_symbol_data[obj_idx].total_size; - mod_size += processed_c11.data_list_arr[obj_idx].total_size; - mod_size += processed_c13.data_list_arr[obj_idx].total_size; + mod_size += cv_size_from_debug_s(&debug_s_arr[obj_idx], CV_C13SubSectionAlign); + mod_size += serialized_symbol_data_sizes[obj_idx]; mod_size += globrefs_arr[obj_idx].total_size; - U32 mod_size32 = safe_cast_u32(mod_size); + mod_sizes[obj_idx] = safe_cast_u32(mod_size); // allocate stream for module - PDB_DbiModule *mod = mod_arr[obj_idx]; - mod->sn = msf_stream_alloc_ex(pdb->msf, mod_size32); + mod_arr[obj_idx]->sn = msf_stream_alloc_ex(pdb->msf, mod_sizes[obj_idx]); } ProfEnd(); // copy data to module streams ProfBegin("Write Modules Data"); - LNK_WriteModuleDataTask write_module_data_task_data; - write_module_data_task_data.msf = pdb->msf; - write_module_data_task_data.mod_arr = mod_arr; - write_module_data_task_data.symbol_data_arr = serialized_symbol_data; - write_module_data_task_data.c11_data_list_arr = processed_c11.data_list_arr; - write_module_data_task_data.c13_data_list_arr = processed_c13.data_list_arr; - write_module_data_task_data.globrefs_arr = globrefs_arr; + LNK_WriteModuleDataTask write_module_data_task_data = {0}; + write_module_data_task_data.msf = pdb->msf; + write_module_data_task_data.mod_arr = mod_arr; + write_module_data_task_data.debug_s_arr = debug_s_arr; + write_module_data_task_data.serialized_symbol_data_sizes = serialized_symbol_data_sizes; + write_module_data_task_data.parsed_symbols = parsed_symbols; + write_module_data_task_data.globrefs_arr = globrefs_arr; + write_module_data_task_data.mod_sizes = mod_sizes; tp_for_parallel(tp, 0, obj_count, lnk_write_module_data_task, &write_module_data_task_data); ProfEnd(); - - // push source files per module info - ProfBegin("Build Source Files List"); - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { - PDB_DbiModule *mod = mod_arr[obj_idx]; - String8List source_file_list_scratch = processed_c13.source_file_names_list_arr[obj_idx]; - String8List source_file_list = str8_list_copy(pdb->dbi->arena, &source_file_list_scratch); - str8_list_concat_in_place(&mod->source_file_list, &source_file_list); - } - ProfEnd(); } tp_temp_end(temp); } diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index a5bb23a3..1a039dc7 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -232,8 +232,10 @@ typedef struct typedef struct { U64 total_symbol_input_count; - LNK_CodeViewSymbolsInput *symbol_inputs; CV_SymbolListArray *parsed_symbols; + U64 *serialized_symbol_data_sizes; + + LNK_CodeViewSymbolsInput *symbol_inputs; PDB_DbiModule **mod_arr; String8List *symbol_data_arr; CV_SymbolList *gsi_list_arr; @@ -242,9 +244,6 @@ typedef struct typedef struct { CV_DebugS *debug_s_arr; - MSF_Context *msf; - PDB_DbiModule **dbi_mod_arr; - String8List *c13_data_arr; String8List *source_file_names_list_arr; U64 string_data_base_offset; CV_StringHashTable string_ht; @@ -252,12 +251,13 @@ typedef struct typedef struct { - MSF_Context *msf; - PDB_DbiModule **mod_arr; - String8List *symbol_data_arr; - String8List *c11_data_list_arr; - String8List *c13_data_list_arr; - String8List *globrefs_arr; + MSF_Context *msf; + PDB_DbiModule **mod_arr; + CV_DebugS *debug_s_arr; + U64 *serialized_symbol_data_sizes; + CV_SymbolListArray *parsed_symbols; + String8List *globrefs_arr; + U32 *mod_sizes; } LNK_WriteModuleDataTask; typedef struct @@ -509,8 +509,6 @@ lnk_build_rad_debug_info(TP_Context *tp, // --- PDB --------------------------------------------------------------------- -internal LNK_ProcessedCodeViewC11Data lnk_process_c11_data (TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); -internal LNK_ProcessedCodeViewC13Data lnk_process_c13_data (TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr); internal U64 * lnk_hash_cv_symbol_ptr_arr(TP_Context *tp, Arena *arena, CV_SymbolPtrArray arr); internal CV_SymbolPtrArray lnk_dedup_gsi_symbols (TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 obj_count, CV_SymbolList *symbol_list_arr); diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index e3604285..40a879d5 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -1335,9 +1335,16 @@ msf_stream_read_string(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) internal void msf_stream_align(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt align) { + local_persist U8 zeroes[64]; MSF_UInt pos = msf_stream_get_pos(msf, sn); - MSF_UInt pos_aligned = AlignPow2(pos, align); - msf_stream_seek(msf, sn, pos_aligned); + MSF_UInt pad = AlignPadPow2(pos, align); + if (pad > 0) { + if (pad < sizeof(zeroes)) { + msf_stream_write(msf, sn, zeroes, pad); + } else { + NotImplemented; + } + } } //////////////////////////////// From 516365e97b747702ad9c63e12b6b558ad69bf69e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 17 Feb 2026 03:04:14 -0800 Subject: [PATCH 210/850] rename CodeView leaf/symbol/debug_s helpers for consistent naming --- src/linker/codeview_ext/codeview.c | 421 +++++++++++++---------------- src/linker/codeview_ext/codeview.h | 64 ++--- src/linker/lnk.c | 2 +- src/linker/lnk_debug_helper.c | 4 +- src/linker/lnk_debug_info.c | 16 +- src/linker/lnk_obj.c | 4 +- src/linker/pdb_ext/pdb_builder.c | 14 +- src/raddump/raddump.c | 2 +- src/scratch/parse_inline_sites.c | 2 +- 9 files changed, 247 insertions(+), 282 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 589fb4b6..7f61df28 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -16,27 +16,125 @@ hash_from_cv_symbol(CV_Symbol *symbol) } //////////////////////////////// +//~ Leaf Helpers -internal CV_ObjInfo -cv_obj_info_from_symbol(CV_Symbol symbol) +internal U64 +cv_size_from_leaf(String8 data, U64 align) { - CV_ObjInfo result; MemoryZeroStruct(&result); - switch (symbol.kind) { - case CV_SymKind_OBJNAME: { - CV_SymObjName *obj_name = (CV_SymObjName *) symbol.data.str; - result.sig = obj_name->sig; - str8_deserial_read_cstr(symbol.data, sizeof(CV_SymObjName), &result.name); - } break; - case CV_SymKind_OBJNAME_ST: { - NotImplemented; - } break; - default: { - InvalidPath; - } break; - } + U64 size = 0; + size += sizeof(CV_LeafSize); + size += sizeof(CV_LeafKind); + size += data.size; + size = AlignPow2(size, align); + return size; +} + +internal U64 +cv_write_leaf(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_LeafKind kind, String8 data, U64 align) +{ + U64 buffer_cursor_start = buffer_cursor; + + // compute record size + U64 record_size = sizeof(kind) + data.size; + Assert(record_size <= CV_LeafSize_Max); + CV_LeafSize record_size16 = (CV_LeafSize)record_size; + + // compute pad + static U8 LEAF_PAD_ARR[] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; + U64 pad_size = AlignPadPow2(data.size, align); + Assert(pad_size <= ArrayCount(LEAF_PAD_ARR)); + + // write header + CV_LeafHeader *header_ptr = (CV_LeafHeader *)(buffer + buffer_cursor); + header_ptr->size = record_size16; + header_ptr->kind = kind; + buffer_cursor += sizeof(*header_ptr); + + // write body + U8 *leaf_data_ptr = buffer + buffer_cursor; + MemoryCopy(leaf_data_ptr, data.str, data.size); + buffer_cursor += data.size; + + // write pad + U8 *pad_data_ptr = buffer + buffer_cursor; + MemoryCopy(pad_data_ptr, &LEAF_PAD_ARR[0], pad_size); + buffer_cursor += pad_size; + + U64 write_size = buffer_cursor - buffer_cursor_start; + return write_size; +} + +internal String8 +cv_make_leaf(Arena *arena, CV_LeafKind kind, String8 data, U64 align) +{ + U64 buffer_size = cv_size_from_leaf(data, align); + U8 *buffer = push_array_no_zero(arena, U8, buffer_size); + U64 size = cv_write_leaf(buffer, 0, buffer_size, kind, data, align); + String8 raw_leaf = str8(buffer, size); + return raw_leaf; +} + +internal String8 +cv_data_from_leaf(Arena *arena, CV_Leaf *leaf, U64 align) +{ + return cv_make_leaf(arena, leaf->kind, leaf->data, align); +} + +internal U64 +cv_read_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out) +{ + // do we have enough bytes to read header? + Assert(raw_data.size >= sizeof(CV_LeafHeader)); + + U8 *leaf_ptr = raw_data.str + off; + + StaticAssert(sizeof(CV_LeafHeader) == 4, g_leaf_header_size_check); + CV_LeafHeader header = { .v = memory_read32(leaf_ptr) }; + + // leaf size must have enough bytes for the kind enum + Assert(header.size >= sizeof(CV_LeafKind)); + + // do we have enough bytes to read leaf data? + Assert(sizeof(CV_LeafSize) + header.size <= raw_data.size); + + // fill out leaf + leaf_out->kind = header.kind; + leaf_out->data = str8(leaf_ptr + sizeof(CV_LeafHeader), header.size - sizeof(CV_LeafKind)); + + U64 leaf_size = AlignPow2(sizeof(CV_LeafHeader) + leaf_out->data.size, align); + Assert(leaf_size <= raw_data.size); + return leaf_size; +} + +internal CV_Leaf +cv_leaf_from_string(String8 raw_data) +{ + CV_Leaf result; + cv_read_leaf(raw_data, 0, 1, &result); return result; } +internal CV_Leaf +cv_leaf_from_ptr(U8 *ptr) +{ + CV_Leaf leaf = {0}; + cv_read_leaf(str8(ptr, max_U64), 0, 1, &leaf); + return leaf; +} + +internal U16 +cv_leaf_size_from_ptr(U8 *ptr) +{ + CV_LeafSize size = memory_read16(ptr); + return size + sizeof(size); +} + +internal String8 +cv_raw_leaf_from_ptr(U8 *ptr) +{ + return str8(ptr, cv_leaf_size_from_ptr(ptr)); +} + internal CV_TypeServerInfo cv_type_server_info_from_leaf(CV_Leaf leaf) { @@ -90,119 +188,11 @@ cv_precomp_info_from_leaf(CV_Leaf leaf) return result; } -//////////////////////////////// -//~ Leaf Helpers - -internal U64 -cv_compute_leaf_record_size(String8 data, U64 align) -{ - U64 size = 0; - size += sizeof(CV_LeafSize); - size += sizeof(CV_LeafKind); - size += data.size; - size = AlignPow2(size, align); - return size; -} - -internal U64 -cv_serialize_leaf_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_LeafKind kind, String8 data, U64 align) -{ - U64 buffer_cursor_start = buffer_cursor; - - // compute record size - U64 record_size = sizeof(kind) + data.size; - Assert(record_size <= CV_LeafSize_Max); - CV_LeafSize record_size16 = (CV_LeafSize)record_size; - - // compute pad - static U8 LEAF_PAD_ARR[] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; - U64 pad_size = AlignPadPow2(data.size, align); - Assert(pad_size <= ArrayCount(LEAF_PAD_ARR)); - - // write header - CV_LeafHeader *header_ptr = (CV_LeafHeader *)(buffer + buffer_cursor); - header_ptr->size = record_size16; - header_ptr->kind = kind; - buffer_cursor += sizeof(*header_ptr); - - // write body - U8 *leaf_data_ptr = buffer + buffer_cursor; - MemoryCopy(leaf_data_ptr, data.str, data.size); - buffer_cursor += data.size; - - // write pad - U8 *pad_data_ptr = buffer + buffer_cursor; - MemoryCopy(pad_data_ptr, &LEAF_PAD_ARR[0], pad_size); - buffer_cursor += pad_size; - - U64 write_size = buffer_cursor - buffer_cursor_start; - return write_size; -} - -internal String8 -cv_serialize_raw_leaf(Arena *arena, CV_LeafKind kind, String8 data, U64 align) -{ - U64 buffer_size = cv_compute_leaf_record_size(data, align); - U8 *buffer = push_array_no_zero(arena, U8, buffer_size); - U64 size = cv_serialize_leaf_to_buffer(buffer, 0, buffer_size, kind, data, align); - String8 raw_leaf = str8(buffer, size); - return raw_leaf; -} - -internal String8 -cv_serialize_leaf(Arena *arena, CV_Leaf *leaf, U64 align) -{ - return cv_serialize_raw_leaf(arena, leaf->kind, leaf->data, align); -} - -internal CV_Leaf -cv_make_leaf(Arena *arena, CV_LeafKind kind, String8 data) -{ - CV_Leaf result = {0}; - String8 raw_leaf = cv_serialize_raw_leaf(arena, kind, data, 1); - cv_deserial_leaf(raw_leaf, 0, 1, &result); - return result; -} - -internal U64 -cv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out) -{ - // do we have enough bytes to read header? - Assert(raw_data.size >= sizeof(CV_LeafHeader)); - - U8 *leaf_ptr = raw_data.str + off; - - StaticAssert(sizeof(CV_LeafHeader) == 4, g_leaf_header_size_check); - CV_LeafHeader header = { .v = memory_read32(leaf_ptr) }; - - // leaf size must have enough bytes for the kind enum - Assert(header.size >= sizeof(CV_LeafKind)); - - // do we have enough bytes to read leaf data? - Assert(sizeof(CV_LeafSize) + header.size <= raw_data.size); - - // fill out leaf - leaf_out->kind = header.kind; - leaf_out->data = str8(leaf_ptr + sizeof(CV_LeafHeader), header.size - sizeof(CV_LeafKind)); - - U64 leaf_size = AlignPow2(sizeof(CV_LeafHeader) + leaf_out->data.size, align); - Assert(leaf_size <= raw_data.size); - return leaf_size; -} - -internal CV_Leaf -cv_leaf_from_string(String8 raw_data) -{ - CV_Leaf result; - cv_deserial_leaf(raw_data, 0, 1, &result); - return result; -} - //////////////////////////////// //~ Symbol Helpers internal U64 -cv_compute_symbol_record_size(CV_Symbol *symbol, U64 align) +cv_size_from_symbol(CV_Symbol *symbol, U64 align) { U64 size = 0; size += sizeof(CV_SymSize); @@ -212,9 +202,9 @@ cv_compute_symbol_record_size(CV_Symbol *symbol, U64 align) } internal U64 -cv_serialize_symbol_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align) +cv_write_symbol(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align) { - U64 write_size = cv_compute_symbol_record_size(symbol, align); + U64 write_size = cv_size_from_symbol(symbol, align); Assert(buffer_cursor + write_size <= buffer_size); U64 record_size = 0; @@ -242,11 +232,11 @@ cv_serialize_symbol_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV } internal String8 -cv_serialize_symbol(Arena *arena, CV_Symbol *symbol, U64 align) +cv_data_from_symbol(Arena *arena, CV_Symbol *symbol, U64 align) { - U64 buffer_size = cv_compute_symbol_record_size(symbol, align); + U64 buffer_size = cv_size_from_symbol(symbol, align); U8 *buffer = push_array(arena, U8, buffer_size); - cv_serialize_symbol_to_buffer(buffer, 0, buffer_size, symbol, align); + cv_write_symbol(buffer, 0, buffer_size, symbol, align); String8 result = str8(buffer, buffer_size); return result; } @@ -406,11 +396,31 @@ cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list) return proc_ref_list; } +internal CV_ObjInfo +cv_obj_info_from_symbol(CV_Symbol symbol) +{ + CV_ObjInfo result; MemoryZeroStruct(&result); + switch (symbol.kind) { + case CV_SymKind_OBJNAME: { + CV_SymObjName *obj_name = (CV_SymObjName *) symbol.data.str; + result.sig = obj_name->sig; + str8_deserial_read_cstr(symbol.data, sizeof(CV_SymObjName), &result.name); + } break; + case CV_SymKind_OBJNAME_ST: { + NotImplemented; + } break; + default: { + InvalidPath; + } break; + } + return result; +} + //////////////////////////////// //~ .debug$S helpers internal void -cv_parse_debug_s_c13_(Arena *arena, CV_DebugS *debug_s, String8 raw_debug_s) +cv_debug_s_from_data_c13_(Arena *arena, CV_DebugS *debug_s, String8 raw_debug_s) { for (U64 cursor = 0; cursor + sizeof(CV_C13SubSectionHeader) <= raw_debug_s.size; ) { // read header @@ -434,24 +444,6 @@ cv_parse_debug_s_c13_(Arena *arena, CV_DebugS *debug_s, String8 raw_debug_s) } } -internal CV_DebugS -cv_parse_debug_s_c13(Arena *arena, String8 raw_debug_s) -{ - CV_DebugS debug_s = {0}; - cv_parse_debug_s_c13_(arena, &debug_s, raw_debug_s); - return debug_s; -} - -internal CV_DebugS -cv_parse_debug_s_c13_list(Arena *arena, String8List raw_debug_s) -{ - CV_DebugS debug_s = {0}; - for (String8Node *node = raw_debug_s.first; node != 0; node = node->next) { - cv_parse_debug_s_c13_(arena, &debug_s, node->string); - } - return debug_s; -} - internal force_inline UBSAN_NO_ALIGN CV_Signature cv_signature_from_debug_s(String8 raw_debug_s) { @@ -460,8 +452,16 @@ cv_signature_from_debug_s(String8 raw_debug_s) return sig; } +internal CV_DebugS +cv_debug_s_from_data_c13(Arena *arena, String8 raw_debug_s) +{ + CV_DebugS debug_s = {0}; + cv_debug_s_from_data_c13_(arena, &debug_s, raw_debug_s); + return debug_s; +} + internal CV_DebugS -cv_parse_debug_s(Arena *arena, String8 raw_debug_s) +cv_debug_s_from_data(Arena *arena, String8 raw_debug_s) { CV_DebugS result; MemoryZeroStruct(&result); if (raw_debug_s.size >= sizeof(CV_Signature)) { @@ -469,7 +469,7 @@ cv_parse_debug_s(Arena *arena, String8 raw_debug_s) switch (sig) { case CV_Signature_C13: { String8 raw_debug_s_past_sig = str8_substr(raw_debug_s, r1u64(sizeof(sig), raw_debug_s.size)); - result = cv_parse_debug_s_c13(arena, raw_debug_s_past_sig); + result = cv_debug_s_from_data_c13(arena, raw_debug_s_past_sig); } break; case CV_Signature_C6: { Assert(!"TODO: handle C6"); @@ -494,57 +494,6 @@ cv_debug_s_concat_in_place(CV_DebugS *dst, CV_DebugS *src) } } -internal String8List -cv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig) -{ - String8List srl = {0}; - str8_serial_begin(arena, &srl); - - if (write_sig) { - CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(arena, &srl, &sig); - } - - static CV_C13SubSectionKind layout_arr[] = { - CV_C13SubSectionKind_Symbols, - //CV_C13SubSectionKind_Lines, - CV_C13SubSectionKind_FileChksms, - CV_C13SubSectionKind_FrameData, - CV_C13SubSectionKind_InlineeLines, - CV_C13SubSectionKind_IlLines, - CV_C13SubSectionKind_CrossScopeImports, - CV_C13SubSectionKind_CrossScopeExports, - CV_C13SubSectionKind_FuncMDTokenMap, - CV_C13SubSectionKind_TypeMDTokenMap, - CV_C13SubSectionKind_MergedAssemblyInput, - CV_C13SubSectionKind_CoffSymbolRVA, - CV_C13SubSectionKind_XfgHashType, - CV_C13SubSectionKind_XfgHashVirtual, - }; - - for (U64 layout_idx = 0; layout_idx < ArrayCount(layout_arr); layout_idx += 1) { - CV_C13SubSectionKind kind = layout_arr[layout_idx]; - String8List *data = cv_sub_section_ptr_from_debug_s(debug_s, kind); - if (data->total_size > 0) { - U32 size32 = safe_cast_u32(data->total_size); - str8_serial_push_u32(arena, &srl, kind); - str8_serial_push_u32(arena, &srl, size32); - str8_serial_push_data_list(arena, &srl, data->first); - str8_serial_push_align(arena, &srl, 4); - } - } - - String8List *line_data = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); - for (String8Node *line_node = line_data->first; line_node != 0; line_node = line_node->next) { - str8_serial_push_u32(arena, &srl, CV_C13SubSectionKind_Lines); - str8_serial_push_u32(arena, &srl, safe_cast_u32(line_node->string.size)); - str8_serial_push_string(arena, &srl, line_node->string); - str8_serial_push_align(arena, &srl, 4); - } - - return srl; -} - internal U64 cv_size_from_debug_s(CV_DebugS *debug_s, U64 align) { @@ -568,6 +517,41 @@ cv_size_from_debug_s(CV_DebugS *debug_s, U64 align) return size; } +internal String8List +cv_data_from_debug_s_c13(Arena *arena, CV_DebugS *debug_s, B32 write_sig) +{ + String8List srl = {0}; + str8_serial_begin(arena, &srl); + + if (write_sig) { + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + } + + for EachIndex(i, CV_C13SubSectionIdxKind_COUNT) { + if (i == CV_C13SubSectionIdxKind_Lines) { continue; } + CV_C13SubSectionKind kind = cv_c13_sub_section_kind_from_idx(i); + String8List *data = cv_sub_section_ptr_from_debug_s(debug_s, kind); + if (data->total_size > 0) { + U32 size32 = safe_cast_u32(data->total_size); + str8_serial_push_u32(arena, &srl, kind); + str8_serial_push_u32(arena, &srl, size32); + str8_serial_push_data_list(arena, &srl, data->first); + str8_serial_push_align(arena, &srl, 4); + } + } + + String8List *line_data = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + for EachNode(line_n, String8Node, line_data->first) { + str8_serial_push_u32(arena, &srl, CV_C13SubSectionKind_Lines); + str8_serial_push_u32(arena, &srl, safe_cast_u32(line_n->string.size)); + str8_serial_push_string(arena, &srl, line_n->string); + str8_serial_push_align(arena, &srl, 4); + } + + return srl; +} + internal CV_C13SubSectionKind cv_c13_sub_section_kind_from_idx(CV_C13SubSectionIdxKind idx) { @@ -1112,7 +1096,7 @@ cv_debug_t_from_data(Arena *arena, String8 data, U64 align) U64 count = 0; for (U64 cursor = 0; cursor < data.size; count += 1) { CV_Leaf leaf; - cursor += cv_deserial_leaf(data, cursor, align, &leaf); + cursor += cv_read_leaf(data, cursor, align, &leaf); } ProfEnd(); @@ -1121,7 +1105,7 @@ cv_debug_t_from_data(Arena *arena, String8 data, U64 align) offsets[idx++] = cursor; CV_Leaf leaf; - cursor += cv_deserial_leaf(data, cursor, align, &leaf); + cursor += cv_read_leaf(data, cursor, align, &leaf); } return (CV_DebugT){ .count = count, .data = data, .offsets = offsets }; @@ -1133,7 +1117,7 @@ cv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx) CV_Leaf leaf = {0}; if (debug_t.count > 0) { Assert(leaf_idx < debug_t.count); - cv_deserial_leaf(debug_t.data, debug_t.offsets[leaf_idx], 1, &leaf); + cv_read_leaf(debug_t.data, debug_t.offsets[leaf_idx], 1, &leaf); Assert(cv_header_struct_size_from_leaf_kind(leaf.kind) <= leaf.data.size); } return leaf; @@ -1178,27 +1162,6 @@ cv_debug_t_array_count_leaves(U64 count, CV_DebugT *debug_t) return total; } -internal CV_Leaf -cv_leaf_from_ptr(U8 *ptr) -{ - CV_Leaf leaf = {0}; - cv_deserial_leaf(str8(ptr, max_U64), 0, 1, &leaf); - return leaf; -} - -internal U16 -cv_leaf_size_from_ptr(U8 *ptr) -{ - CV_LeafSize size = memory_read16(ptr); - return size + sizeof(size); -} - -internal String8 -cv_raw_leaf_from_ptr(U8 *ptr) -{ - return str8(ptr, cv_leaf_size_from_ptr(ptr)); -} - // $$Symbols internal void @@ -1323,11 +1286,11 @@ cv_symbol_list_arr_get_count(U64 count, CV_SymbolList *list_arr) } internal String8List -cv_data_from_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align) +cv_write_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align) { String8List data_list = {0}; for (CV_SymbolNode *node = symbol_list.first; node != 0; node = node->next) { - String8 data = cv_serialize_symbol(arena, &node->data, align); + String8 data = cv_data_from_symbol(arena, &node->data, align); str8_list_push(arena, &data_list, data); } return data_list; @@ -1509,7 +1472,7 @@ cv_patch_symbol_tree_offsets(CV_SymbolList list, U64 base_offset, U64 align) } // advance cursor - cursor += cv_compute_symbol_record_size(&symbol, align); + cursor += cv_size_from_symbol(&symbol, align); } scratch_end(scratch); diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index 64e7b34d..916609e7 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -359,59 +359,59 @@ typedef struct } CV_PackStringHashTableTask; //////////////////////////////// +//~ Leaf helpers + +internal U64 cv_size_from_leaf(String8 data, U64 align); +internal U64 cv_write_leaf(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_LeafKind kind, String8 data, U64 align); +internal String8 cv_make_leaf(Arena *arena, CV_LeafKind kind, String8 data, U64 align); +internal String8 cv_data_from_leaf(Arena *arena, CV_Leaf *leaf, U64 align); + +internal U64 cv_read_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out); +internal CV_Leaf cv_leaf_from_string(String8 raw_data); +internal CV_Leaf cv_leaf_from_ptr(U8 *ptr); +internal U16 cv_leaf_size_from_ptr(U8 *ptr); +internal String8 cv_raw_leaf_from_ptr(U8 *ptr); -internal CV_ObjInfo cv_obj_info_from_symbol(CV_Symbol symbol); internal CV_TypeServerInfo cv_type_server_info_from_leaf(CV_Leaf leaf); internal CV_PrecompInfo cv_precomp_info_from_leaf(CV_Leaf leaf); //////////////////////////////// -//~ Leaf Helpers +//~ Symbol helpers -internal U64 cv_compute_leaf_record_size(String8 data, U64 align); -internal U64 cv_serialize_leaf_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_LeafKind kind, String8 data, U64 align); -internal String8 cv_serialize_raw_leaf(Arena *arena, CV_LeafKind kind, String8 data, U64 align); -internal String8 cv_serialize_leaf(Arena *arena, CV_Leaf *leaf, U64 align); -internal CV_Leaf cv_make_leaf(Arena *arena, CV_LeafKind kind, String8 data); -internal U64 cv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out); -internal CV_Leaf cv_leaf_from_string(String8 raw_data); - -//////////////////////////////// -//~ Symbol Helpers - -internal U64 cv_compute_symbol_record_size(CV_Symbol *symbol, U64 align); -internal U64 cv_serialize_symbol_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align); -internal String8 cv_serialize_symbol(Arena *arena, CV_Symbol *symbol, U64 align); +internal U64 cv_size_from_symbol(CV_Symbol *symbol, U64 align); +internal U64 cv_write_symbol(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align); +internal String8 cv_data_from_symbol(Arena *arena, CV_Symbol *symbol, U64 align); internal String8 cv_make_symbol(Arena *arena, CV_SymKind kind, String8 data); internal String8 cv_make_obj_name(Arena *arena, String8 obj_path, U32 sig); -internal String8 cv_make_comp3(Arena *arena, - CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, - U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe, - U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe, - String8 version_string); +internal String8 cv_make_comp3(Arena *arena, CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe, U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe, String8 version_string); internal String8 cv_make_envblock(Arena *arena, String8List string_list); internal CV_Symbol cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local); internal CV_Symbol cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name); internal CV_SymbolList cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list); +internal U64 cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out); +internal CV_Symbol cv_symbol_from_string(String8 raw_data); + +internal CV_ObjInfo cv_obj_info_from_symbol(CV_Symbol symbol); + //////////////////////////////// -// .debug$S Helpers +// .debug$S helpers -internal CV_DebugS cv_parse_debug_s_c13(Arena *arena, String8 raw_debug_s); -internal CV_DebugS cv_parse_debug_s_c13_list(Arena *arena, String8List raw_debug_s); internal CV_Signature cv_signature_from_debug_s(String8 raw_debug_s); -internal CV_DebugS cv_parse_debug_s(Arena *arena, String8 raw_debug_s); +internal CV_DebugS cv_debug_s_from_data_c13(Arena *arena, String8 raw_debug_s); +internal CV_DebugS cv_debug_s_from_data(Arena *arena, String8 raw_debug_s); internal void cv_debug_s_concat_in_place(CV_DebugS *dst, CV_DebugS *src); -internal String8List cv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig); internal U64 cv_size_from_debug_s(CV_DebugS *debug_s, U64 align); +internal String8List cv_data_from_debug_s_c13(Arena *arena, CV_DebugS *debug_s, B32 write_sig); internal CV_C13SubSectionKind cv_c13_sub_section_kind_from_idx(CV_C13SubSectionIdxKind idx); internal CV_C13SubSectionIdxKind cv_c13_sub_section_idx_from_kind(CV_C13SubSectionKind kind); -internal String8List * cv_sub_section_ptr_from_debug_s(CV_DebugS *debug_s, CV_C13SubSectionKind kind); -internal String8List cv_sub_section_from_debug_s(CV_DebugS debug_s, CV_C13SubSectionKind kind); -internal String8 cv_string_table_from_debug_s(CV_DebugS debug_s); -internal String8 cv_file_chksms_from_debug_s(CV_DebugS debug_s); +internal String8List * cv_sub_section_ptr_from_debug_s(CV_DebugS *debug_s, CV_C13SubSectionKind kind); +internal String8List cv_sub_section_from_debug_s(CV_DebugS debug_s, CV_C13SubSectionKind kind); +internal String8 cv_string_table_from_debug_s(CV_DebugS debug_s); +internal String8 cv_file_chksms_from_debug_s(CV_DebugS debug_s); //////////////////////////////// //~ .debug$T helpers @@ -430,6 +430,7 @@ internal U64 cv_debug_t_array_count_leaves(U64 count, CV_DebugT *arr // $$Symbols internal void cv_parse_symbol_sub_section_capped(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align, U64 cap); internal void cv_parse_symbol_sub_section(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align); + internal void cv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node); internal CV_SymbolNode * cv_symbol_list_push(Arena *arena, CV_SymbolList *list); internal CV_SymbolNode * cv_symbol_list_push_data(Arena *arena, CV_SymbolList *list, CV_SymKind kind, String8 data); @@ -438,7 +439,8 @@ internal void cv_symbol_list_remove_node(CV_SymbolList *list, CV_Sy internal void cv_symbol_list_concat_in_place(CV_SymbolList *list, CV_SymbolList *to_concat); internal void cv_symbol_list_concat_in_place_arr(CV_SymbolList *list, U64 count, CV_SymbolList *to_concat); internal U64 cv_symbol_list_arr_get_count(U64 count, CV_SymbolList *list_arr); -internal String8List cv_data_from_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align); + +internal String8List cv_write_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align); internal CV_SymbolList cv_global_scope_symbols_from_list(Arena *arena, CV_SymbolList list); internal CV_SymbolPtrArray cv_symbol_ptr_array_from_list(Arena *arena, TP_Context *tp, U64 count, CV_SymbolList *symbol_list_arr); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index bddfc842..812ecfcb 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -470,7 +470,7 @@ lnk_make_null_obj(Arena *arena) // push .debug$T sections with null leaf String8 null_debug_data; { - String8 raw_null_leaf = cv_serialize_raw_leaf(obj_writer->arena, CV_LeafKind_NOTYPE, str8(0,0), 1); + String8 raw_null_leaf = cv_make_leaf(obj_writer->arena, CV_LeafKind_NOTYPE, str8(0,0), 1); String8List srl = {0}; str8_serial_begin(obj_writer->arena, &srl); diff --git a/src/linker/lnk_debug_helper.c b/src/linker/lnk_debug_helper.c index 7d1b7017..7cbfe291 100644 --- a/src/linker/lnk_debug_helper.c +++ b/src/linker/lnk_debug_helper.c @@ -27,9 +27,9 @@ lnk_make_debug_s(Arena *arena, CV_SymbolList symbol_list) CV_DebugS debug_s = {0}; String8List *symbol_list_ptr = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Symbols); - *symbol_list_ptr = cv_data_from_symbol_list(scratch.arena, symbol_list, CV_SymbolAlign); + *symbol_list_ptr = cv_write_symbol_list(scratch.arena, symbol_list, CV_SymbolAlign); - String8List debug_s_data_list = cv_data_c13_from_debug_s(scratch.arena, &debug_s, 1); + String8List debug_s_data_list = cv_data_from_debug_s_c13(scratch.arena, &debug_s, 1); String8 debug_s_data = str8_list_join(arena, &debug_s_data_list, 0); scratch_end(scratch); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index c413e9f1..fda7848f 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -24,7 +24,7 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) for (String8Node *node = sect_list.first; node != 0; node = node->next) { // parse & merge sub sections - CV_DebugS ds = cv_parse_debug_s(arena, node->string); + CV_DebugS ds = cv_debug_s_from_data(arena, node->string); cv_debug_s_concat_in_place(debug_s, &ds); // make sure there is one string table @@ -1032,10 +1032,10 @@ lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef if (a_hash == b_hash) { CV_Leaf a_leaf; - cv_deserial_leaf(lnk_data_from_leaf_ref(input, a), 0, 1, &a_leaf); + cv_read_leaf(lnk_data_from_leaf_ref(input, a), 0, 1, &a_leaf); CV_Leaf b_leaf; - cv_deserial_leaf(lnk_data_from_leaf_ref(input, b), 0, 1, &b_leaf); + cv_read_leaf(lnk_data_from_leaf_ref(input, b), 0, 1, &b_leaf); Assert(a_leaf.kind == b_leaf.kind); @@ -2155,7 +2155,7 @@ THREAD_POOL_TASK_FUNC(lnk_fixup_symbols_task) String8 leaf_data = str8(leaf_arr_ipi[leaf_idx], max_U64); CV_Leaf leaf; - cv_deserial_leaf(leaf_data, 0, 1, &leaf); + cv_read_leaf(leaf_data, 0, 1, &leaf); U64 min_leaf_size = cv_header_struct_size_from_leaf_kind(leaf.kind); if (min_leaf_size > leaf.data.size) { @@ -2739,7 +2739,7 @@ THREAD_POOL_TASK_FUNC(lnk_write_module_data_task) for EachIndex(i, parsed_symbols.count) { for EachNode(symbol_n, CV_SymbolNode, parsed_symbols.v[i].first) { - U64 symbol_size = cv_compute_symbol_record_size(&symbol_n->data, PDB_SYMBOL_ALIGN); + U64 symbol_size = cv_size_from_symbol(&symbol_n->data, PDB_SYMBOL_ALIGN); // flush temp if (temp_size + symbol_size > temp_max) { @@ -2748,7 +2748,7 @@ THREAD_POOL_TASK_FUNC(lnk_write_module_data_task) temp_size = 0; } - U64 serial_size = cv_serialize_symbol_to_buffer(temp, temp_size, temp_max, &symbol_n->data, PDB_SYMBOL_ALIGN); + U64 serial_size = cv_write_symbol(temp, temp_size, temp_max, &symbol_n->data, PDB_SYMBOL_ALIGN); Assert(serial_size == symbol_size); temp_size += serial_size; } @@ -3262,7 +3262,7 @@ THREAD_POOL_TASK_FUNC(lnk_build_udt_name_hash_table_task) String8 leaf_data = str8(task->leaf_arr[leaf_idx], max_U64); CV_Leaf leaf; - cv_deserial_leaf(leaf_data, 0, 1, &leaf); + cv_read_leaf(leaf_data, 0, 1, &leaf); // is this UDT? if ( ! cv_is_udt(leaf.kind)) { continue; } @@ -3531,7 +3531,7 @@ lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype) // try to resovle forward reference (defn might be missing) if (itype >= tpi_range.min) { CV_Leaf leaf; - cv_deserial_leaf(str8(task->leaf_arr[CV_TypeIndexSource_TPI][itype - tpi_range.min], max_U64), 0, 1, &leaf); + cv_read_leaf(str8(task->leaf_arr[CV_TypeIndexSource_TPI][itype - tpi_range.min], max_U64), 0, 1, &leaf); if (cv_is_udt(leaf.kind)) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); if (udt_info.props & CV_TypeProp_FwdRef) { diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 7e50190e..b128b177 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -300,7 +300,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) if (str8_match(name, str8_lit(".debug$S"), 0)) { Temp temp = temp_begin(scratch.arena); String8 debug_s_data = str8_substr(input->data, rng_1u64(sect_header->foff, sect_header->foff+sect_header->fsize)); - CV_DebugS debug_s = cv_parse_debug_s(temp.arena, debug_s_data); + CV_DebugS debug_s = cv_debug_s_from_data(temp.arena, debug_s_data); for EachNode(symbols_n, String8Node, debug_s.data_list[CV_C13SubSectionIdxKind_Symbols].first) { CV_SymbolList symbol_list = {0}; cv_parse_symbol_sub_section_capped(scratch.arena, &symbol_list, 0, symbols_n->string, CV_SymbolAlign, 2); @@ -750,7 +750,7 @@ lnk_debug_s_from_obj(Arena *arena, LNK_Obj *obj) { for (String8Node *node = raw_debug_s.first; node != 0; node = node->next) { // parse & merge sub sections - CV_DebugS ds = cv_parse_debug_s(arena, node->string); + CV_DebugS ds = cv_debug_s_from_data(arena, node->string); cv_debug_s_concat_in_place(&debug_s, &ds); // make sure there is one string table diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 76b0c0bc..65835a4a 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1336,7 +1336,7 @@ pdb_type_server_make_leaf(PDB_TypeServer *ts, CV_LeafKind kind, String8 data) { ProfBeginFunction(); - String8 leaf = cv_serialize_raw_leaf(ts->arena, kind, data, PDB_LEAF_ALIGN); + String8 leaf = cv_make_leaf(ts->arena, kind, data, PDB_LEAF_ALIGN); String8Node *node = str8_list_push(ts->arena, &ts->leaf_list, leaf); ProfEnd(); @@ -1427,7 +1427,7 @@ pdb_type_server_push(PDB_TypeServer *ts, String8 raw_leaf) ProfBeginFunction(); CV_Leaf leaf; - cv_deserial_leaf(raw_leaf, 0, 1, &leaf); + cv_read_leaf(raw_leaf, 0, 1, &leaf); if (cv_is_udt(leaf.kind)) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); @@ -1447,7 +1447,7 @@ THREAD_POOL_TASK_FUNC(pdb_count_udt_task) PDB_PushLeafTask *task = raw_task; for EachInRange(leaf_idx, task->ranges[task_id]) { CV_Leaf leaf; - cv_deserial_leaf(str8(task->leaf_arr[leaf_idx], max_U64), 0, 1, &leaf); + cv_read_leaf(str8(task->leaf_arr[leaf_idx], max_U64), 0, 1, &leaf); if (cv_is_udt(leaf.kind)) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); @@ -1472,7 +1472,7 @@ THREAD_POOL_TASK_FUNC(pdb_push_udt_leaf_task) for EachInRange(leaf_idx, task->ranges[task_id]) { CV_Leaf leaf; - cv_deserial_leaf(str8(task->leaf_arr[leaf_idx], max_U64), 0, 1, &leaf); + cv_read_leaf(str8(task->leaf_arr[leaf_idx], max_U64), 0, 1, &leaf); if (cv_is_udt(leaf.kind)) { CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); @@ -2273,7 +2273,7 @@ THREAD_POOL_TASK_FUNC(gsi_size_buckets_task) PDB_GsiSerializeSymbolsTask *task = raw_task; CV_SymbolList *bucket_list = &task->bucket_arr[bucket_idx]; for (CV_SymbolNode *node = bucket_list->first; node != 0; node = node->next) { - task->bucket_size_arr[bucket_idx] += cv_compute_symbol_record_size(&node->data, task->symbol_align); + task->bucket_size_arr[bucket_idx] += cv_size_from_symbol(&node->data, task->symbol_align); } } @@ -2308,7 +2308,7 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) sr->offset = buffer_cursor; // serialize symbol - U64 serial_size = cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align); + U64 serial_size = cv_write_symbol(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align); // advance sort_idx += 1; @@ -2347,7 +2347,7 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_symbols_task) sr->offset = buffer_cursor; // serialize symbol - U64 serial_size = cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align); + U64 serial_size = cv_write_symbol(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align); // advance sort_idx += 1; diff --git a/src/raddump/raddump.c b/src/raddump/raddump.c index 34d6fe06..06e87e4d 100644 --- a/src/raddump/raddump.c +++ b/src/raddump/raddump.c @@ -2468,7 +2468,7 @@ cv_format_debug_sections(Arena *arena, String8List *out, String8 indent, String8 String8 raw_sect = str8_substr(raw_image, sect_frange); if (str8_match_lit(".debug$S", sect_name, 0)) { Temp scratch = scratch_begin(&arena, 1); - CV_DebugS debug_s = cv_parse_debug_s(scratch.arena, raw_sect); + CV_DebugS debug_s = cv_debug_s_from_data(scratch.arena, raw_sect); for (String8Node *string_n = debug_s.data_list[CV_C13SubSectionIdxKind_Symbols].first; string_n != 0 && keep_parsing; string_n = string_n->next) { Temp temp = temp_begin(scratch.arena); diff --git a/src/scratch/parse_inline_sites.c b/src/scratch/parse_inline_sites.c index bd2bb656..10ba76be 100644 --- a/src/scratch/parse_inline_sites.c +++ b/src/scratch/parse_inline_sites.c @@ -290,7 +290,7 @@ entry_point(CmdLine *cmdl) String8 c13_data = pdb_data_from_unit_range(msf, comp_unit, PDB_DbiCompUnitRange_C13); // parse $$ - CV_DebugS debug_s = cv_parse_debug_s_c13(arena, c13_data); + CV_DebugS debug_s = cv_debug_s_from_data_c13(arena, c13_data); // find $$FILE_CKSMS String8 file_chksms = cv_file_chksms_from_debug_s(debug_s); From f9e36b55178df525c361b30fb5b5d6dfb05d5bfd Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 00:54:18 -0800 Subject: [PATCH 211/850] validate attrib-form encoding --- src/dwarf/dwarf_writer.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index 9eaaae69..29d9aef0 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -218,6 +218,35 @@ dw_writer_tag_end(DW_Writer *writer) internal DW_WriterAttrib * dw_writer_push_attrib(DW_Writer *writer, DW_AttribKind kind, DW_WriterForm form) { + // validate attribute-form encoding + B32 is_enc_legal = 0; + DW_AttribClass attrib_class = dw_attrib_class_from_attrib(writer->version, DW_Ext_Null, kind); + for (DW_AttribClass f = attrib_class; f != 0; f &= f - 1) { + DW_AttribClass v = f & -f; + switch (v) { + case DW_AttribClass_Null: { is_enc_legal = (form.kind == DW_WriterFormKind_Null); } break; + case DW_AttribClass_Undefined: { is_enc_legal = 0; } break; + case DW_AttribClass_Address: { is_enc_legal = (form.kind == DW_WriterFormKind_Address); } break; + case DW_AttribClass_Block: { is_enc_legal = (form.kind == DW_WriterFormKind_Block); } break; + case DW_AttribClass_Const: { is_enc_legal = (form.kind == DW_WriterFormKind_SInt || form.kind == DW_WriterFormKind_UInt); } break; + case DW_AttribClass_ExprLoc: { is_enc_legal = (form.kind == DW_WriterFormKind_ExprLoc); } break; + case DW_AttribClass_Flag: { is_enc_legal = (form.kind == DW_WriterFormKind_Flag); } break; + case DW_AttribClass_LinePtr: { is_enc_legal = (form.kind == DW_WriterFormKind_LinePtr); } break; + case DW_AttribClass_LocListPtr: { is_enc_legal = 0; /* TODO */ } break; + case DW_AttribClass_MacPtr: { is_enc_legal = (form.kind == DW_WriterFormKind_MacPtr); } break; + case DW_AttribClass_RngListPtr: { is_enc_legal = (form.kind == DW_WriterFormKind_RngListPtr); } break; + case DW_AttribClass_Reference: { is_enc_legal = (form.kind == DW_WriterFormKind_Ref); } break; + case DW_AttribClass_String: { is_enc_legal = (form.kind == DW_WriterFormKind_String); } break; + case DW_AttribClass_LocList: { is_enc_legal = 0; /* TODO */ } break; + case DW_AttribClass_RngList: { is_enc_legal = 0; /* TODO */ } break; + case DW_AttribClass_StrOffsetsPtr: { is_enc_legal = 0; /* TODO */ } break; + case DW_AttribClass_AddrPtr: { is_enc_legal = 0; /* TODO */ } break; + default: { InvalidPath; } break; + } + if (is_enc_legal) { break; } + } + Assert(is_enc_legal); + DW_WriterAttrib *attrib = dw_writer_attrib_chunk_list_push(writer->arena, &writer->attrib_chunk_list, 512); attrib->kind = kind; attrib->writer.form = form; From 86de8fb94c3057d2413a526f645d67913d29ae67 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 00:54:49 -0800 Subject: [PATCH 212/850] string attrib DWARF writer helper --- src/dwarf/dwarf_writer.c | 10 ++++++++++ src/dwarf/dwarf_writer.h | 1 + 2 files changed, 11 insertions(+) diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index 29d9aef0..b5d8e093 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -279,6 +279,16 @@ dw_writer_push_attrib_string(DW_Writer *writer, DW_AttribKind kind, String8 stri return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_String, .string = string }); } +internal DW_WriterAttrib * +dw_writer_push_attrib_stringf(DW_Writer *writer, DW_AttribKind kind, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(writer->arena, fmt, args); + va_end(args); + return dw_writer_push_attrib_string(writer, kind, string); +} + internal DW_WriterAttrib * dw_writer_push_attrib_flag(DW_Writer *writer, DW_AttribKind kind, B8 flag) { diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index f2d8ad76..880f3f92 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -189,6 +189,7 @@ internal DW_WriterAttrib * dw_writer_push_attrib_address (DW_Writer *writer, internal DW_WriterAttrib * dw_writer_push_attrib_block (DW_Writer *writer, DW_AttribKind kind, String8 block ); internal DW_WriterAttrib * dw_writer_push_attrib_data (DW_Writer *writer, DW_AttribKind kind, String8 data ); internal DW_WriterAttrib * dw_writer_push_attrib_string (DW_Writer *writer, DW_AttribKind kind, String8 string ); +internal DW_WriterAttrib * dw_writer_push_attrib_stringf (DW_Writer *writer, DW_AttribKind kind, char *fmt, ... ); internal DW_WriterAttrib * dw_writer_push_attrib_flag (DW_Writer *writer, DW_AttribKind kind, B8 flag ); internal DW_WriterAttrib * dw_writer_push_attrib_sint (DW_Writer *writer, DW_AttribKind kind, S64 sint ); internal DW_WriterAttrib * dw_writer_push_attrib_uint (DW_Writer *writer, DW_AttribKind kind, U64 uint ); From 59e8389ed933b977b3a1b4f1998655886ac6e924 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 00:56:30 -0800 Subject: [PATCH 213/850] cleanup invoke --- src/torture/torture.c | 3 +-- src/torture/torture_dwarf.c | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index 3d9ca11d..a6780d33 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -102,8 +102,7 @@ t_invoke(String8 exe_path, String8 cmdline, U64 timeout) // Build Launch Options OS_ProcessLaunchParams launch_opts = { .path = g_wdir, .inherit_env = 1, .stdout_file = output_redirect, .stderr_file = output_redirect }; - str8_list_push(scratch.arena, &launch_opts.cmd_line, g_linker); - str8_list_push(scratch.arena, &launch_opts.cmd_line, str8_lit("/nologo")); + str8_list_push(scratch.arena, &launch_opts.cmd_line, exe_path); { String8List parsed_cmdline = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline); str8_list_concat_in_place(&launch_opts.cmd_line, &parsed_cmdline); diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index cfecf768..567364e4 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -183,8 +183,6 @@ dwt_make_writer(void) String8 string_table = str8_substr(raw_coff, obj_coff_header.string_table_range); input = dw_input_from_coff_section_table(scratch.arena, raw_coff, string_table, section_count, section_table); - t_write_file(str8_lit("dwarf.obj"), raw_coff); - obj_release(&obj); } From 11d90a34a38b2f9e4e8905b35ad11af2fbd30f61 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 01:20:42 -0800 Subject: [PATCH 214/850] stop tests on first fail or crash --- src/torture/torture.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index a6780d33..b4744af6 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -7,6 +7,7 @@ global String8 g_wdir; global String8 g_out = str8_lit_comp("torture"); global B32 g_verbose; global B32 g_redirect_stdout = 1; +global B32 g_stop_on_first_fail_or_crash = 1; global String8 g_linker; // tests @@ -77,6 +78,8 @@ t_run_fail_handler(void *raw_ctx) { T_RunCtx *ctx = raw_ctx; ctx->result.status = T_RunStatus_Crash; + fflush(stdout); + fflush(stderr); } internal T_RunResult @@ -236,9 +239,11 @@ t_entry_point(CmdLine *cmdline) } } - // + g_verbose = cmd_line_has_flag(cmdline, str8_lit("verbose")); + g_redirect_stdout = !cmd_line_has_flag(cmdline, str8_lit("print_stdout")); + g_stop_on_first_fail_or_crash = !cmd_line_has_flag(cmdline, str8_lit("keep_going")); + // Handle -out - // { CmdLineOpt *out_opt = cmd_line_opt_from_string(cmdline, str8_lit("out")); if (out_opt) { @@ -250,20 +255,6 @@ t_entry_point(CmdLine *cmdline) } } - // - // Handle -verbose - // - { - g_verbose = cmd_line_has_flag(cmdline, str8_lit("verbose")); - } - - // - // Handle -print_stdout - // - { - g_redirect_stdout = !cmd_line_has_flag(cmdline, str8_lit("print_stdout")); - } - // // Make Output Directory // @@ -356,10 +347,15 @@ t_entry_point(CmdLine *cmdline) if (result.status == T_RunStatus_Fail) { fprintf(stdout, " ERROR: %s:%d: condition: \"%s\"\n", result.fail_file, result.fail_line, result.fail_cond); } + + if (result.status == T_RunStatus_Fail || result.status == T_RunStatus_Crash) { + if (g_stop_on_first_fail_or_crash) { goto exit; } + } } fprintf(stdout, "*** Passed: %I64u, Failed: %I64u, Crashed: %I64u ***\n", pass_count, fail_count, crash_count); + exit:; if (fail_count + crash_count != 0) { fflush(stdout); os_abort(fail_count + crash_count); From 0e4c864b221b701efeff48313a156d8996038bea Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 01:21:03 -0800 Subject: [PATCH 215/850] checkpoint: asan crashes radbin in rdi_section_raw_data_from_kind --- src/torture/torture_d2r.c | 77 ++++++++++++++++++++++++++++++++++++++ src/torture/torture_main.c | 5 +++ 2 files changed, 82 insertions(+) create mode 100644 src/torture/torture_d2r.c diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c new file mode 100644 index 00000000..f4648a62 --- /dev/null +++ b/src/torture/torture_d2r.c @@ -0,0 +1,77 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#define T_Group "d2r" + +internal RDI_Parsed * +d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8 raw_coff; + { + OBJ *obj = obj_alloc(0, Arch_x64); + OBJ_Section *text_section = obj_push_section(obj, str8_lit(".text"), OBJ_SectionFlag_Read|OBJ_SectionFlag_Exec|OBJ_SectionFlag_Load); + str8_serial_push_u8(obj->arena, &text_section->data, 0xc3); + obj_push_symbol(obj, str8_lit("main"), OBJ_SymbolScope_Global, OBJ_RefKind_Section, text_section); + dw_writer_emit_to_obj(writer, obj); + raw_coff = coff_from_obj(scratch.arena, obj); + obj_release(&obj); + } + + Assert(t_write_file(str8_lit("a.obj"), raw_coff)); + t_invoke(str8_lit("radlink.exe"), str8_lit("/subsystem:console /out:a.exe /entry:main /DEBUG:FULL /opt:noref /opt:noicf a.obj"), max_U64); + Assert(g_last_exit_code == 0); + String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + Assert(exe.size > 0); + + t_invoke(str8_lit("radbin.exe"), str8_lit("-rdi a.exe"), max_U64); + Assert(g_last_exit_code == 0); + + String8 raw_rdi = t_read_file(scratch.arena, str8_lit("a.rdi")); + Assert(raw_rdi.size > 0); + + RDI_Parsed *rdi = push_array(arena, RDI_Parsed, 1); + RDI_ParseStatus rdi_parse_status = rdi_parse(raw_rdi.str, raw_rdi.size, rdi); + Assert(rdi_parse_status == RDI_ParseStatus_Good); + + scratch_end(scratch); + return rdi; +} + +T_BeginTest(d2r_general) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); + // declare char type + DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); + dw_writer_tag_end(writer); + // declare function + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140173f9); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x14017474b); + dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "FooBar"); + // declare variable + dw_writer_tag_begin(writer, DW_TagKind_Variable); + dw_writer_push_attrib_expression(writer, DW_AttribKind_Location, &(DW_ExprEnc)DW_ExprEnc_Op(Reg7), 1); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestLocal"); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); + + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); + + RDI_Procedure *proc_name = rdi_procedure_from_name_cstr(rdi, "FooBar"); + T_Ok(proc_name); + + dw_writer_end(&writer); +} +T_EndTest; + +#undef T_Group diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 71ab857f..6521832d 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -12,6 +12,8 @@ #include "base/base_inc.h" #include "linker/hash_table.h" #include "os/os_inc.h" +#include "rdi/rdi_local.h" +#include "rdi_make/rdi_make_local.h" #include "obj/obj.h" #include "coff/coff.h" #include "coff/coff_parse.h" @@ -44,6 +46,8 @@ #include "base/base_inc.c" #include "linker/hash_table.c" #include "os/os_inc.c" +#include "rdi/rdi_local.c" +#include "rdi_make/rdi_make_local.c" #include "obj/obj.c" #include "coff/coff.c" #include "coff/coff_parse.c" @@ -69,6 +73,7 @@ #include "torture.c" #include "torture_radlink.c" #include "torture_dwarf.c" +#include "torture_d2r.c" //////////////////////////////// From 64d0f9b68b894bc57ef611984cd8d0d0edcf94a9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 16:16:43 -0800 Subject: [PATCH 216/850] copy new memory functions that are used in stb_sprintf to metagen base --- src/metagen/metagen_base/metagen_base_core.c | 44 ++++++++++++++++++++ src/metagen/metagen_base/metagen_base_core.h | 15 +++++-- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/metagen/metagen_base/metagen_base_core.c b/src/metagen/metagen_base/metagen_base_core.c index b392e4a0..d024c6e9 100644 --- a/src/metagen/metagen_base/metagen_base_core.c +++ b/src/metagen/metagen_base/metagen_base_core.c @@ -281,6 +281,50 @@ memory_is_zero(void *ptr, U64 size){ return(result); } +internal void UBSAN_NO_ALIGN +memory_write16(void *ptr, U16 v) +{ + MemoryCopy(ptr, &v, sizeof(v)); +} + +internal void UBSAN_NO_ALIGN +memory_write32(void *ptr, U32 v) +{ + MemoryCopy(ptr, &v, sizeof(v)); +} + +internal U8 UBSAN_NO_ALIGN +memory_read8(void *ptr) +{ + U8 result; + MemoryCopy(&result, ptr, sizeof(result)); + return result; +} + +internal U16 UBSAN_NO_ALIGN +memory_read16(void *ptr) +{ + U16 result; + MemoryCopy(&result, ptr, sizeof(result)); + return result; +} + +internal U32 UBSAN_NO_ALIGN +memory_read32(void *ptr) +{ + U32 result; + MemoryCopy(&result, ptr, sizeof(result)); + return result; +} + +internal U64 UBSAN_NO_ALIGN +memory_read64(void *ptr) +{ + U64 result; + MemoryCopy(&result, ptr, sizeof(result)); + return result; +} + //////////////////////////////// //~ rjf: Text 2D Coordinate/Range Functions diff --git a/src/metagen/metagen_base/metagen_base_core.h b/src/metagen/metagen_base/metagen_base_core.h index a56382a0..4a5277bf 100644 --- a/src/metagen/metagen_base/metagen_base_core.h +++ b/src/metagen/metagen_base/metagen_base_core.h @@ -292,7 +292,7 @@ CheckNil(nil,p) ? \ # define ASAN_ENABLED 1 # define ASAN_NO_ADDR __declspec(no_sanitize_address) # else -# define ASAN_NO_ADDR +# define UBSAN_NO_ALIGN # endif #elif COMPILER_CLANG # if defined(__has_feature) @@ -300,9 +300,8 @@ CheckNil(nil,p) ? \ # define ASAN_ENABLED 1 # endif # endif -# define ASAN_NO_ADDR __attribute__((no_sanitize("address"))) -#else -# define ASAN_NO_ADDR +# define ASAN_NO_ADDR __attribute__((no_sanitize("address"))) +# define UBSAN_NO_ALIGN __attribute__((no_sanitize("alignment"))) #endif #if ASAN_ENABLED @@ -841,6 +840,14 @@ internal F32 sign_from_side_F32(Side side); internal B32 memory_is_zero(void *ptr, U64 size); +internal void memory_write16(void *ptr, U16 v); +internal void memory_write32(void *ptr, U32 v); + +internal U8 memory_read8(void *ptr); +internal U16 memory_read16(void *ptr); +internal U32 memory_read32(void *ptr); +internal U64 memory_read64(void *ptr); + //////////////////////////////// //~ rjf: Text 2D Coordinate/Range Functions From a8833dac02bc7efdc8ce59d15d721b5e01ba58ea Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 16:17:21 -0800 Subject: [PATCH 217/850] add 96-bit float type to RDI --- src/lib_rdi/rdi.c | 2 ++ src/lib_rdi/rdi.h | 12 +++++++----- src/rdi/rdi.mdesk | 11 ++++++----- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index ee71d957..0e9f5352 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -193,6 +193,7 @@ case RDI_TypeKind_F32PP: {result = (RDI_U8*)"F32PP"; *size_out = sizeof("F32PP") case RDI_TypeKind_F48: {result = (RDI_U8*)"F48"; *size_out = sizeof("F48")-1;}break; case RDI_TypeKind_F64: {result = (RDI_U8*)"F64"; *size_out = sizeof("F64")-1;}break; case RDI_TypeKind_F80: {result = (RDI_U8*)"F80"; *size_out = sizeof("F80")-1;}break; +case RDI_TypeKind_F96: {result = (RDI_U8*)"F96"; *size_out = sizeof("F96")-1;}break; case RDI_TypeKind_F128: {result = (RDI_U8*)"F128"; *size_out = sizeof("F128")-1;}break; case RDI_TypeKind_ComplexF32: {result = (RDI_U8*)"ComplexF32"; *size_out = sizeof("ComplexF32")-1;}break; case RDI_TypeKind_ComplexF64: {result = (RDI_U8*)"ComplexF64"; *size_out = sizeof("ComplexF64")-1;}break; @@ -258,6 +259,7 @@ case RDI_TypeKind_F32PP:{result = 4;}break; case RDI_TypeKind_F48:{result = 6;}break; case RDI_TypeKind_F64:{result = 8;}break; case RDI_TypeKind_F80:{result = 10;}break; +case RDI_TypeKind_F96:{result = 12;}break; case RDI_TypeKind_F128:{result = 16;}break; case RDI_TypeKind_ComplexF32:{result = 8;}break; case RDI_TypeKind_ComplexF64:{result = 16;}break; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 2fba3f42..dd91bbd6 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -304,11 +304,12 @@ RDI_TypeKind_F32PP = 0x001B, RDI_TypeKind_F48 = 0x001C, RDI_TypeKind_F64 = 0x001D, RDI_TypeKind_F80 = 0x001E, -RDI_TypeKind_F128 = 0x001F, -RDI_TypeKind_ComplexF32 = 0x0020, -RDI_TypeKind_ComplexF64 = 0x0021, -RDI_TypeKind_ComplexF80 = 0x0022, -RDI_TypeKind_ComplexF128 = 0x0023, +RDI_TypeKind_F96 = 0x001F, +RDI_TypeKind_F128 = 0x0020, +RDI_TypeKind_ComplexF32 = 0x0021, +RDI_TypeKind_ComplexF64 = 0x0022, +RDI_TypeKind_ComplexF80 = 0x0023, +RDI_TypeKind_ComplexF128 = 0x0024, RDI_TypeKind_Modifier = 0x1000, RDI_TypeKind_Ptr = 0x1001, RDI_TypeKind_LRef = 0x1002, @@ -775,6 +776,7 @@ X(F32PP)\ X(F48)\ X(F64)\ X(F80)\ +X(F96)\ X(F128)\ X(ComplexF32)\ X(ComplexF64)\ diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index fb0cf030..6a07dab5 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -711,11 +711,12 @@ RDI_TypeKindTable: {F48 0x001C 6 } {F64 0x001D 8 } {F80 0x001E 10 } - {F128 0x001F 16 } - {ComplexF32 0x0020 8 } - {ComplexF64 0x0021 16 } - {ComplexF80 0x0022 20 } - {ComplexF128 0x0023 32 LastBuiltIn } + {F96 0x001F 12 } + {F128 0x0020 16 } + {ComplexF32 0x0021 8 } + {ComplexF64 0x0022 16 } + {ComplexF80 0x0023 20 } + {ComplexF128 0x0024 32 LastBuiltIn } //- {Modifier 0x1000 0 FirstConstructed } {Ptr 0x1001 0 } From 09f02f7d08e0c19f3e21ec867e24be5046388691 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 16:19:18 -0800 Subject: [PATCH 218/850] use xlist macros for float, signed, and unsigned conversion --- src/rdi_from_dwarf/rdi_from_dwarf.c | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 5ae83a54..15e129aa 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1750,6 +1750,7 @@ d2r_convert_types(Arena *arena, // convert base type encoding to RDI version RDI_TypeKind kind = RDI_TypeKind_NULL; + #define X(t,g,s) case s: kind = RDI_TypeKind_##t; break; switch (encoding) { case DW_ATE_Null: kind = RDI_TypeKind_NULL; break; case DW_ATE_Address: kind = RDI_TypeKind_Void; break; @@ -1765,23 +1766,13 @@ d2r_convert_types(Arena *arena, } break; case DW_ATE_Float: { switch (byte_size) { - case 2: kind = RDI_TypeKind_F16; break; - case 4: kind = RDI_TypeKind_F32; break; - case 6: kind = RDI_TypeKind_F48; break; - case 8: kind = RDI_TypeKind_F64; break; - case 16: kind = RDI_TypeKind_F128; break; + D2R_ValueType_Float_XList default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_Signed: { switch (byte_size) { - case 1: kind = RDI_TypeKind_S8; break; - case 2: kind = RDI_TypeKind_S16; break; - case 4: kind = RDI_TypeKind_S32; break; - case 8: kind = RDI_TypeKind_S64; break; - case 16: kind = RDI_TypeKind_S128; break; - case 32: kind = RDI_TypeKind_S256; break; - case 64: kind = RDI_TypeKind_S512; break; + D2R_ValueType_Signed_XList default: log_user_errorf("unexpected size"); break; } } break; @@ -1795,13 +1786,7 @@ d2r_convert_types(Arena *arena, } break; case DW_ATE_Unsigned: { switch (byte_size) { - case 1: kind = RDI_TypeKind_U8; break; - case 2: kind = RDI_TypeKind_U16; break; - case 4: kind = RDI_TypeKind_U32; break; - case 8: kind = RDI_TypeKind_U64; break; - case 16: kind = RDI_TypeKind_U128; break; - case 32: kind = RDI_TypeKind_U256; break; - case 64: kind = RDI_TypeKind_U512; break; + D2R_ValueType_Unsigned_XList default: log_user_errorf("unexpected size"); break; } } break; @@ -1845,6 +1830,7 @@ d2r_convert_types(Arena *arena, } break; default: log_user_errorf("unexpected base type encoding"); break; } + #undef X RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Alias; From d26c8902461564585e29cf4972fed0ea26d5ee2f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 19:16:51 -0800 Subject: [PATCH 219/850] test basic types --- src/dwarf/dwarf_writer.h | 3 + src/rdi_from_dwarf/rdi_from_dwarf.c | 64 +++++--- src/rdi_from_dwarf/rdi_from_dwarf.h | 4 +- src/torture/torture_d2r.c | 236 +++++++++++++++++++++++++--- 4 files changed, 260 insertions(+), 47 deletions(-) diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index 880f3f92..821c98fd 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -196,11 +196,14 @@ internal DW_WriterAttrib * dw_writer_push_attrib_uint (DW_Writer *writer, internal DW_WriterAttrib * dw_writer_push_attrib_enum (DW_Writer *writer, DW_AttribKind kind, S64 e ); internal DW_WriterAttrib * dw_writer_push_attrib_ref (DW_Writer *writer, DW_AttribKind kind, DW_WriterTag *ref ); internal DW_WriterAttrib * dw_writer_push_attrib_exprloc (DW_Writer *writer, DW_AttribKind kind, String8 exprloc ); +internal DW_WriterAttrib * dw_writer_push_attrib_expression (DW_Writer *writer, DW_AttribKind kind, DW_ExprEnc *encs, U64 encs_count); internal DW_WriterAttrib * dw_writer_push_attrib_line_ptr (DW_Writer *writer, DW_AttribKind kind, void * line_ptr ); internal DW_WriterAttrib * dw_writer_push_attrib_mac_ptr (DW_Writer *writer, DW_AttribKind kind, void * mac_ptr ); internal DW_WriterAttrib * dw_writer_push_attrib_rng_list_ptr(DW_Writer *writer, DW_AttribKind kind, void * rng_list_ptr); internal DW_WriterAttrib * dw_writer_push_attrib_implicit (DW_Writer *writer, DW_AttribKind kind, S64 implicit ); +#define dw_writer_push_attrib_expressionv(w, k, ...) dw_writer_push_attrib_expression(w, k, (DW_ExprEnc[]){ __VA_ARGS__ }, ArrayCount(((DW_ExprEnc[]){ __VA_ARGS__ })) ) + internal void dw_writer_emit(DW_Writer *writer); #ifdef OBJ_H internal void dw_writer_emit_to_obj(DW_Writer *writer, OBJ *obj); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 15e129aa..15ded770 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1566,7 +1566,7 @@ d2r_is_type_tag_converted(DW_TagNode *tag_node) } internal RDIM_Type * -d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, DW_Tag tag, DW_AttribKind kind) +d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind) { RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; @@ -1589,7 +1589,7 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *inpu if (type == 0) { // issue type conversion DW_TagNode *ref_node = dw_tag_node_from_info_off(cu, ref.info_off); - d2r_convert_types(arena, type_table, input, cu, cu_lang, ref_node); + d2r_convert_types(arena, type_table, input, cu, cu_lang, arch, ref_node); // if we do not have a converted type at this point then debug info is malformed type = d2r_type_from_offset(type_table, ref.info_off); @@ -1614,6 +1614,7 @@ d2r_convert_types(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, + Arch arch, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); @@ -1639,7 +1640,7 @@ d2r_convert_types(Arena *arena, Assert(!tag_node->first_child); d2r_tag_iterator_skip_children(it); } else { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_Class; @@ -1697,7 +1698,7 @@ d2r_convert_types(Arena *arena, log_user_errorf("childless enum @ .debug_info+%llx", tag.info_off); } } else { - RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); type->kind = RDI_TypeKind_Enum; @@ -1706,7 +1707,7 @@ d2r_convert_types(Arena *arena, } } break; case DW_TagKind_SubroutineType: { - RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); // collect parameters RDIM_TypeList param_list = {0}; @@ -1732,7 +1733,7 @@ d2r_convert_types(Arena *arena, d2r_tag_iterator_skip_children(it); } break; case DW_TagKind_Typedef: { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Alias; type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); @@ -1757,25 +1758,43 @@ d2r_convert_types(Arena *arena, case DW_ATE_Boolean: kind = RDI_TypeKind_Bool; break; case DW_ATE_ComplexFloat: { switch (byte_size) { - case 4: kind = RDI_TypeKind_ComplexF32; break; - case 8: kind = RDI_TypeKind_ComplexF64; break; - case 10: kind = RDI_TypeKind_ComplexF80; break; - case 16: kind = RDI_TypeKind_ComplexF128; break; + case 8: kind = RDI_TypeKind_ComplexF32; break; + case 16: kind = RDI_TypeKind_ComplexF64; break; + case 24: kind = RDI_TypeKind_ComplexF80; break; + case 32: kind = RDI_TypeKind_ComplexF128; break; default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_Float: { + String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + if (arch == Arch_x64 || arch == Arch_arm64) { + if (str8_match(name, str8_lit("__float80"), 0)) { + kind = RDI_TypeKind_F80; + } else if (str8_match(name, str8_lit("__float128"), 0)) { + kind = RDI_TypeKind_F128; + } else if (str8_match(name, str8_lit("_Float16"), 0)) { + kind = RDI_TypeKind_F16; + } else if (str8_match(name, str8_lit("__bf16"), 0)) { + NotImplemented; + } + if (kind != RDI_TypeKind_NULL) { break; } + } + switch (byte_size) { D2R_ValueType_Float_XList - default: log_user_errorf("unexpected size"); break; + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_Signed: { + String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + if (str8_match(name, str8_lit("wchar_t"), 0)) { goto do_signed_char; } + switch (byte_size) { D2R_ValueType_Signed_XList default: log_user_errorf("unexpected size"); break; } } break; + do_signed_char:; case DW_ATE_SignedChar: { switch (byte_size) { case 1: kind = RDI_TypeKind_Char8; break; @@ -1790,6 +1809,7 @@ d2r_convert_types(Arena *arena, default: log_user_errorf("unexpected size"); break; } } break; + case DW_ATE_Utf: case DW_ATE_UnsignedChar: { switch (byte_size) { case 1: kind = RDI_TypeKind_UChar8; break; @@ -1819,9 +1839,6 @@ d2r_convert_types(Arena *arena, case DW_ATE_DecimalFloat: { NotImplemented; } break; - case DW_ATE_Utf: { - NotImplemented; - } break; case DW_ATE_Ucs: { NotImplemented; } break; @@ -1839,7 +1856,7 @@ d2r_convert_types(Arena *arena, type->byte_size = byte_size; } break; case DW_TagKind_PointerType: { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); // TODO: if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Allocated)) { @@ -1877,7 +1894,7 @@ d2r_convert_types(Arena *arena, log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); } - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Modifier; type->byte_size = cu->address_size; @@ -1889,7 +1906,7 @@ d2r_convert_types(Arena *arena, log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); } - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Modifier; type->byte_size = cu->address_size; @@ -1904,7 +1921,7 @@ d2r_convert_types(Arena *arena, log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); } - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Modifier; type->byte_size = cu->address_size; @@ -1980,7 +1997,7 @@ d2r_convert_types(Arena *arena, SLLStackPush(subrange_stack, s); } - RDIM_Type *array_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *array_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); RDIM_Type *direct_type = array_base_type; U64 size_cursor = array_base_type->byte_size; for EachNode(s, struct SubrangeNode, subrange_stack) { @@ -2016,7 +2033,7 @@ d2r_convert_types(Arena *arena, DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_StructureType || parent_tag.kind == DW_TagKind_ClassType) { RDIM_Type *parent = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_Type *type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, tag, DW_AttribKind_Type); + RDIM_Type *type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, parent->udt); member->kind = RDI_MemberKind_Base; member->type = type; @@ -2965,6 +2982,11 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) type->byte_size = rdi_size_from_basic_type_kind(type_kind); builtin_types[type_kind] = type; } + + // fixup float80 size + if (arch == Arch_x64 || arch == Arch_arm64) { + builtin_types[RDI_TypeKind_F80]->byte_size = 16; + } builtin_types[RDI_TypeKind_Void]->byte_size = rdi_addr_size_from_arch(g_d2r_shared.top_level_info.arch); builtin_types[RDI_TypeKind_Handle]->byte_size = rdi_addr_size_from_arch(g_d2r_shared.top_level_info.arch); @@ -3011,7 +3033,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) type_table->builtin_types = builtin_types; // convert debug info - d2r_convert_types(arena, type_table, &input, cu, cu_lang, tag_tree.root); + d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch, tag_tree.root); d2r_convert_udts(arena, type_table, &input, cu, cu_lang, tag_tree.root); d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, image_base, arch, tag_tree.root); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 543dbd8d..e715cc3d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -241,8 +241,8 @@ internal DW_Tag d2r_tag_iterator_parent_tag (D2R_TagIterator *ite internal void d2r_flag_converted_tag(DW_TagNode *tag_node); internal B8 d2r_is_tag_converted (DW_TagNode *tag_node); -internal RDIM_Type * d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, DW_Tag tag, DW_AttribKind kind); -internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, DW_TagNode *root); +internal RDIM_Type * d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_TagNode *root); //////////////////////////////// //~ UDT Conversion diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index f4648a62..2b837911 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -25,10 +25,13 @@ d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); Assert(exe.size > 0); + B32 was_pdb_deleted = os_delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); + Assert(was_pdb_deleted); + t_invoke(str8_lit("radbin.exe"), str8_lit("-rdi a.exe"), max_U64); Assert(g_last_exit_code == 0); - String8 raw_rdi = t_read_file(scratch.arena, str8_lit("a.rdi")); + String8 raw_rdi = t_read_file(arena, str8_lit("a.rdi")); Assert(raw_rdi.size > 0); RDI_Parsed *rdi = push_array(arena, RDI_Parsed, 1); @@ -39,36 +42,221 @@ d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) return rdi; } +internal RDI_TypeNode * +d2rt_type_from_name(RDI_Parsed *rdi, RDI_ParsedNameMap *map, char *name) +{ + String8 s = str8_cstring(name); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, map, s.str, s.size); + + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + + if (id_count == 1) { + return rdi_element_from_name_idx(rdi, TypeNodes, ids[0]); + } + return 0; +} + +T_BeginTest(d2r_types) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + { + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); + +#define DeclBaseType(tt, n, e, s) \ + DW_WriterTag *tt = dw_writer_tag_begin(writer, DW_TagKind_BaseType); \ + dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, s); \ + dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_##e); \ + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ + dw_writer_tag_end(writer); + DeclBaseType(char_type, "char", SignedChar, 1); + DeclBaseType(unsigned_char_type, "unsigned char", UnsignedChar, 1); + DeclBaseType(char8_type, "char8_t", Utf, 1); + DeclBaseType(char16_type, "char16_t", Utf, 2); + DeclBaseType(char32_type, "char32_t", Utf, 4); + DeclBaseType(wchar_type, "wchar_t", Signed, 4); + DeclBaseType(bool_type, "_Bool", Boolean, 1); + DeclBaseType(short_type, "short", Signed, 2); + DeclBaseType(unsigned_short_type, "unsigned short", Unsigned, 2); + DeclBaseType(short_unsigned_int_type, "short unsigned int", Unsigned, 2); + DeclBaseType(short_int_type, "short int", Signed, 2); + DeclBaseType(unsigned_int_type, "unsigned int", Unsigned, 4); + DeclBaseType(int_type, "int", Signed, 4); + DeclBaseType(long_int_type, "long int", Signed, 8); + DeclBaseType(long_unsigned_int_type, "long unsigned int", Unsigned, 8); + DeclBaseType(long_long_int_type, "long long int", Signed, 8); + DeclBaseType(long_long_unsigned_int, "long long unsigned int", Unsigned, 8); + DeclBaseType(float_type, "float", Float, 4); + DeclBaseType(double_type, "double", Float, 8); + DeclBaseType(long_double_type, "long double", Float, 16); + DeclBaseType(float16_type, "_Float16", Float, 2); + DeclBaseType(float80_type, "__float80", Float, 16); + DeclBaseType(float128_type, "_float128", Float, 16); + DeclBaseType(complex_float, "complex float", ComplexFloat, 8); + DeclBaseType(complex_doulbe, "complex double", ComplexFloat, 16); + DeclBaseType(complex_long_double, "complex long double", ComplexFloat, 32); + //DeclBaseType("__bf16", Float, 2); +#undef DeclBaseType + +#define DeclStdint(n, a) \ + do { \ + dw_writer_tag_begin(writer, DW_TagKind_Typedef); \ + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, a); \ + dw_writer_tag_end(writer); \ + } while (0) + DeclStdint("uint8_t", unsigned_char_type); + DeclStdint("uint16_t", unsigned_short_type); + DeclStdint("uint32_t", unsigned_int_type); + DeclStdint("uint64_t", long_unsigned_int_type); + DeclStdint("int8_t", char_type); + DeclStdint("int16_t", short_type); + DeclStdint("int32_t", int_type); + DeclStdint("int64_t", long_int_type); +#undef DeclStdInt + + dw_writer_tag_end(writer); + } + + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); + RDI_NameMap *types_nm = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); + T_Ok(types_nm); + + RDI_ParsedNameMap types_map = {0}; + rdi_parsed_from_name_map(rdi, types_nm, &types_map); + +#define TestBuiltinType(n, bs, r) \ + do { \ + RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ + T_Ok(alias); \ + T_Ok(alias->kind == RDI_TypeKind_Alias); \ + T_Ok(alias->flags == 0); \ + T_Ok(alias->byte_size == bs); \ + RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, alias->user_defined.direct_type_idx); \ + T_Ok(type); \ + T_Ok(type->kind == RDI_TypeKind_##r); \ + T_Ok(type->flags == 0); \ + T_Ok(type->byte_size == alias->byte_size); \ + T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8_lit(Stringify(r)), 0)); \ + } while (0) + TestBuiltinType("char", 1, Char8); + TestBuiltinType("char8_t", 1, UChar8); + TestBuiltinType("char16_t", 2, UChar16); + TestBuiltinType("char32_t", 4, UChar32); + TestBuiltinType("unsigned char", 1, UChar8); + TestBuiltinType("wchar_t", 4, Char32); + TestBuiltinType("_Bool", 1, Bool); + TestBuiltinType("short", 2, S16); + TestBuiltinType("unsigned short", 2, U16); + TestBuiltinType("short unsigned int", 2, U16); + TestBuiltinType("short int", 2, S16); + TestBuiltinType("unsigned int", 4, U32); + TestBuiltinType("int", 4, S32); + TestBuiltinType("long int", 8, S64); + TestBuiltinType("long unsigned int", 8, U64); + TestBuiltinType("long long int", 8, S64); + TestBuiltinType("float", 4, F32); + TestBuiltinType("double", 8, F64); + TestBuiltinType("long double", 16, F128); + TestBuiltinType("_Float16", 2, F16); + TestBuiltinType("__float80", 16, F80); + TestBuiltinType("_float128", 16, F128); + TestBuiltinType("complex float", 8, ComplexF32); + TestBuiltinType("complex double", 16, ComplexF64); + TestBuiltinType("complex long double", 32, ComplexF128); + // TODO: bfloat16 + //TestBuiltinType("__bf16", 2, BF16); +#undef TestBuiltinType + +#define TestStdint(n, s, t) \ + do { \ + RDI_TypeNode *td = d2rt_type_from_name(rdi, &types_map, n); \ + T_Ok(td); \ + T_Ok(td->kind == RDI_TypeKind_Alias); \ + T_Ok(td->flags == 0); \ + T_Ok(td->byte_size == s); \ + RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, td->user_defined.direct_type_idx); \ + T_Ok(type); \ + T_Ok(type->kind == RDI_TypeKind_Alias); \ + T_Ok(type->flags == 0); \ + T_Ok(type->byte_size = td->byte_size); \ + T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8_lit(t), 0)); \ + } while (0) + TestStdint("uint8_t", 1, "unsigned char"); + TestStdint("uint16_t", 2, "unsigned short"); + TestStdint("uint32_t", 4, "unsigned int"); + TestStdint("uint64_t", 8, "long unsigned int"); + TestStdint("int8_t", 1, "char"); + TestStdint("int16_t", 2, "short"); + TestStdint("int32_t", 4, "int"); + TestStdint("int64_t", 8, "long int"); +#undef TestStdint + + dw_writer_end(&writer); +} +T_EndTest; + T_BeginTest(d2r_general) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); - // declare char type - DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); - dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); - dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); - dw_writer_tag_end(writer); - // declare function - dw_writer_tag_begin(writer, DW_TagKind_SubProgram); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140173f9); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x14017474b); - dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); - dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "FooBar"); - // declare variable - dw_writer_tag_begin(writer, DW_TagKind_Variable); - dw_writer_push_attrib_expression(writer, DW_AttribKind_Location, &(DW_ExprEnc)DW_ExprEnc_Op(Reg7), 1); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestLocal"); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); + { + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); + // declare char type + DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); dw_writer_tag_end(writer); - dw_writer_tag_end(writer); + // declare function + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140173f9); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x14017474b); + dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "FooBar"); + // declare variable + dw_writer_tag_begin(writer, DW_TagKind_Variable); + dw_writer_push_attrib_expressionv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestLocal"); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); + } RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); - RDI_Procedure *proc_name = rdi_procedure_from_name_cstr(rdi, "FooBar"); - T_Ok(proc_name); + RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, "FooBar"); + T_Ok(proc); + T_Ok(proc->link_flags == RDI_LinkFlag_External); + String8 proc_name = str8_from_rdi_string_idx(rdi, proc->name_string_idx); + T_Ok(str8_match(proc_name, str8_lit("FooBar"), 0)); + + RDI_Scope *root_scope = rdi_root_scope_from_procedure(rdi, proc); + T_Ok(root_scope); + T_Ok(root_scope->local_count == 1); + + RDI_Local *test_local = rdi_element_from_name_idx(rdi, Locals, root_scope->local_first + 0); + T_Ok(test_local); + T_Ok(test_local->kind == RDI_LocalKind_Variable); + String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); + T_Ok(str8_match(test_local_name, str8_lit("TestLocal"), 0)); + + RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); + T_Ok(test_local_type); + T_Ok(test_local_type->kind == RDI_TypeKind_Alias); + T_Ok(test_local_type->flags == 0); + String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); + T_Ok(str8_match(alias_name, str8_lit("char"), 0)); + + RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); + T_Ok(char_type); + T_Ok(char_type->kind == RDI_TypeKind_Char8); + T_Ok(char_type->flags == 0); + T_Ok(char_type->byte_size == 1); + String8 char_type_name = str8_from_rdi_string_idx(rdi, char_type->built_in.name_string_idx); + T_Ok(str8_match(char_type_name, str8_lit("Char8"), 0)); dw_writer_end(&writer); } From 9cc25d11fb01759bf57110e7e2df47e534a2c990 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 19:17:40 -0800 Subject: [PATCH 220/850] update rdi_parse.h --- src/lib_rdi/rdi_parse.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib_rdi/rdi_parse.h b/src/lib_rdi/rdi_parse.h index b03f0bc4..c4427445 100644 --- a/src/lib_rdi/rdi_parse.h +++ b/src/lib_rdi/rdi_parse.h @@ -171,8 +171,7 @@ RDI_PROC RDI_U64 *rdi_line_voffs_from_num(RDI_ParsedSourceLineMap *map, RDI_U32 RDI_PROC RDI_U64 rdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U64 vmap_count, RDI_U64 voff); //- name maps -RDI_PROC RDI_NameMap *rdi_name_map_from_kind(RDI_Parsed *p, RDI_NameMapKind kind); -RDI_PROC void rdi_name_map_parse(RDI_Parsed* p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out); +RDI_PROC void rdi_parsed_from_name_map(RDI_Parsed* p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out); RDI_PROC RDI_NameMapNode *rdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, RDI_U8 *str, RDI_U64 len); RDI_PROC RDI_U32 *rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out); From 28299bf7782b8b000be6dfe132ad2d2bd02592f2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 19:18:11 -0800 Subject: [PATCH 221/850] move /Zc:preprocessor to common --- build.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.bat b/build.bat index aa70b9d4..e274e20f 100644 --- a/build.bat +++ b/build.bat @@ -66,8 +66,8 @@ if "%pgo%"=="1" ( ) :: --- Compile/Link Line Definitions ------------------------------------------ -set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 -set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 /D_DEBUG %cl_common% %auto_compile_flags% /Zc:preprocessor +set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /Zc:preprocessor +set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 /D_DEBUG %cl_common% %auto_compile_flags% set cl_release= call cl /O2 /DBUILD_DEBUG=0 /DNDEBUG %cl_common% %auto_compile_flags% set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" /noexp /nocoffgrpinfo /opt:ref /opt:icf set cl_out= /out: From f0c3ea7678b73c78f75bc4e05e614c2e67b511a7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 20:55:41 -0800 Subject: [PATCH 222/850] treat implicit values as consts --- src/dwarf/dwarf_writer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index b5d8e093..420704f5 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -228,7 +228,9 @@ dw_writer_push_attrib(DW_Writer *writer, DW_AttribKind kind, DW_WriterForm form) case DW_AttribClass_Undefined: { is_enc_legal = 0; } break; case DW_AttribClass_Address: { is_enc_legal = (form.kind == DW_WriterFormKind_Address); } break; case DW_AttribClass_Block: { is_enc_legal = (form.kind == DW_WriterFormKind_Block); } break; - case DW_AttribClass_Const: { is_enc_legal = (form.kind == DW_WriterFormKind_SInt || form.kind == DW_WriterFormKind_UInt); } break; + case DW_AttribClass_Const: { is_enc_legal = (form.kind == DW_WriterFormKind_SInt || + form.kind == DW_WriterFormKind_UInt || + form.kind == DW_WriterFormKind_Implicit); } break; case DW_AttribClass_ExprLoc: { is_enc_legal = (form.kind == DW_WriterFormKind_ExprLoc); } break; case DW_AttribClass_Flag: { is_enc_legal = (form.kind == DW_WriterFormKind_Flag); } break; case DW_AttribClass_LinePtr: { is_enc_legal = (form.kind == DW_WriterFormKind_LinePtr); } break; From 338d2177ff236a93f7a4708be20e1f07e6a30928 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 21:25:35 -0800 Subject: [PATCH 223/850] added _Decimal* and __bf16 types to RDI and DWARF converter --- src/lib_rdi/rdi.c | 8 ++++ src/lib_rdi/rdi.h | 34 +++++++++------ src/rdi/rdi.mdesk | 28 +++++++------ src/rdi_from_dwarf/rdi_from_dwarf.c | 13 ++++-- src/torture/torture_d2r.c | 65 ++++++++++++++++------------- 5 files changed, 89 insertions(+), 59 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 0e9f5352..adfe99bd 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -187,6 +187,7 @@ case RDI_TypeKind_S128: {result = (RDI_U8*)"S128"; *size_out = sizeof("S128")-1; case RDI_TypeKind_S256: {result = (RDI_U8*)"S256"; *size_out = sizeof("S256")-1;}break; case RDI_TypeKind_S512: {result = (RDI_U8*)"S512"; *size_out = sizeof("S512")-1;}break; case RDI_TypeKind_Bool: {result = (RDI_U8*)"Bool"; *size_out = sizeof("Bool")-1;}break; +case RDI_TypeKind_BF16: {result = (RDI_U8*)"BF16"; *size_out = sizeof("BF16")-1;}break; case RDI_TypeKind_F16: {result = (RDI_U8*)"F16"; *size_out = sizeof("F16")-1;}break; case RDI_TypeKind_F32: {result = (RDI_U8*)"F32"; *size_out = sizeof("F32")-1;}break; case RDI_TypeKind_F32PP: {result = (RDI_U8*)"F32PP"; *size_out = sizeof("F32PP")-1;}break; @@ -199,6 +200,9 @@ case RDI_TypeKind_ComplexF32: {result = (RDI_U8*)"ComplexF32"; *size_out = sizeo case RDI_TypeKind_ComplexF64: {result = (RDI_U8*)"ComplexF64"; *size_out = sizeof("ComplexF64")-1;}break; case RDI_TypeKind_ComplexF80: {result = (RDI_U8*)"ComplexF80"; *size_out = sizeof("ComplexF80")-1;}break; case RDI_TypeKind_ComplexF128: {result = (RDI_U8*)"ComplexF128"; *size_out = sizeof("ComplexF128")-1;}break; +case RDI_TypeKind_Decimal32: {result = (RDI_U8*)"Decimal32"; *size_out = sizeof("Decimal32")-1;}break; +case RDI_TypeKind_Decimal64: {result = (RDI_U8*)"Decimal64"; *size_out = sizeof("Decimal64")-1;}break; +case RDI_TypeKind_Decimal128: {result = (RDI_U8*)"Decimal128"; *size_out = sizeof("Decimal128")-1;}break; case RDI_TypeKind_Modifier: {result = (RDI_U8*)"Modifier"; *size_out = sizeof("Modifier")-1;}break; case RDI_TypeKind_Ptr: {result = (RDI_U8*)"Ptr"; *size_out = sizeof("Ptr")-1;}break; case RDI_TypeKind_LRef: {result = (RDI_U8*)"LRef"; *size_out = sizeof("LRef")-1;}break; @@ -253,6 +257,7 @@ case RDI_TypeKind_S128:{result = 16;}break; case RDI_TypeKind_S256:{result = 32;}break; case RDI_TypeKind_S512:{result = 64;}break; case RDI_TypeKind_Bool:{result = 1;}break; +case RDI_TypeKind_BF16:{result = 2;}break; case RDI_TypeKind_F16:{result = 2;}break; case RDI_TypeKind_F32:{result = 4;}break; case RDI_TypeKind_F32PP:{result = 4;}break; @@ -265,6 +270,9 @@ case RDI_TypeKind_ComplexF32:{result = 8;}break; case RDI_TypeKind_ComplexF64:{result = 16;}break; case RDI_TypeKind_ComplexF80:{result = 20;}break; case RDI_TypeKind_ComplexF128:{result = 32;}break; +case RDI_TypeKind_Decimal32:{result = 4;}break; +case RDI_TypeKind_Decimal64:{result = 8;}break; +case RDI_TypeKind_Decimal128:{result = 16;}break; } return result; } diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index dd91bbd6..f51d6c42 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -298,18 +298,22 @@ RDI_TypeKind_S128 = 0x0015, RDI_TypeKind_S256 = 0x0016, RDI_TypeKind_S512 = 0x0017, RDI_TypeKind_Bool = 0x0018, -RDI_TypeKind_F16 = 0x0019, -RDI_TypeKind_F32 = 0x001A, -RDI_TypeKind_F32PP = 0x001B, -RDI_TypeKind_F48 = 0x001C, -RDI_TypeKind_F64 = 0x001D, -RDI_TypeKind_F80 = 0x001E, -RDI_TypeKind_F96 = 0x001F, -RDI_TypeKind_F128 = 0x0020, -RDI_TypeKind_ComplexF32 = 0x0021, -RDI_TypeKind_ComplexF64 = 0x0022, -RDI_TypeKind_ComplexF80 = 0x0023, -RDI_TypeKind_ComplexF128 = 0x0024, +RDI_TypeKind_BF16 = 0x0019, +RDI_TypeKind_F16 = 0x001A, +RDI_TypeKind_F32 = 0x001B, +RDI_TypeKind_F32PP = 0x001C, +RDI_TypeKind_F48 = 0x001D, +RDI_TypeKind_F64 = 0x001E, +RDI_TypeKind_F80 = 0x001F, +RDI_TypeKind_F96 = 0x0020, +RDI_TypeKind_F128 = 0x0021, +RDI_TypeKind_ComplexF32 = 0x0022, +RDI_TypeKind_ComplexF64 = 0x0023, +RDI_TypeKind_ComplexF80 = 0x0024, +RDI_TypeKind_ComplexF128 = 0x0025, +RDI_TypeKind_Decimal32 = 0x0026, +RDI_TypeKind_Decimal64 = 0x0027, +RDI_TypeKind_Decimal128 = 0x0028, RDI_TypeKind_Modifier = 0x1000, RDI_TypeKind_Ptr = 0x1001, RDI_TypeKind_LRef = 0x1002, @@ -331,7 +335,7 @@ RDI_TypeKind_Bitfield = 0xF000, RDI_TypeKind_Variadic = 0xF001, RDI_TypeKind_Count = 0xF002, RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, -RDI_TypeKind_LastBuiltIn = RDI_TypeKind_ComplexF128, +RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Decimal128, RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, @@ -770,6 +774,7 @@ X(S128)\ X(S256)\ X(S512)\ X(Bool)\ +X(BF16)\ X(F16)\ X(F32)\ X(F32PP)\ @@ -782,6 +787,9 @@ X(ComplexF32)\ X(ComplexF64)\ X(ComplexF80)\ X(ComplexF128)\ +X(Decimal32)\ +X(Decimal64)\ +X(Decimal128)\ X(Modifier)\ X(Ptr)\ X(LRef)\ diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 6a07dab5..0a4012ee 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -705,18 +705,22 @@ RDI_TypeKindTable: {S256 0x0016 32 } {S512 0x0017 64 } {Bool 0x0018 1 } - {F16 0x0019 2 } - {F32 0x001A 4 } - {F32PP 0x001B 4 } - {F48 0x001C 6 } - {F64 0x001D 8 } - {F80 0x001E 10 } - {F96 0x001F 12 } - {F128 0x0020 16 } - {ComplexF32 0x0021 8 } - {ComplexF64 0x0022 16 } - {ComplexF80 0x0023 20 } - {ComplexF128 0x0024 32 LastBuiltIn } + {BF16 0x0019 2 } + {F16 0x001A 2 } + {F32 0x001B 4 } + {F32PP 0x001C 4 } + {F48 0x001D 6 } + {F64 0x001E 8 } + {F80 0x001F 10 } + {F96 0x0020 12 } + {F128 0x0021 16 } + {ComplexF32 0x0022 8 } + {ComplexF64 0x0023 16 } + {ComplexF80 0x0024 20 } + {ComplexF128 0x0025 32 } + {Decimal32 0x0026 4 } + {Decimal64 0x0027 8 } + {Decimal128 0x0028 16 LastBuiltIn } //- {Modifier 0x1000 0 FirstConstructed } {Ptr 0x1001 0 } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 15ded770..369e22a0 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1775,7 +1775,7 @@ d2r_convert_types(Arena *arena, } else if (str8_match(name, str8_lit("_Float16"), 0)) { kind = RDI_TypeKind_F16; } else if (str8_match(name, str8_lit("__bf16"), 0)) { - NotImplemented; + kind = RDI_TypeKind_BF16; } if (kind != RDI_TypeKind_NULL) { break; } } @@ -1818,6 +1818,14 @@ d2r_convert_types(Arena *arena, default: log_user_errorf("unexpected size"); break; } } break; + case DW_ATE_DecimalFloat: { + switch (byte_size) { + case 4: kind = RDI_TypeKind_Decimal32; break; + case 8: kind = RDI_TypeKind_Decimal64; break; + case 16: kind = RDI_TypeKind_Decimal128; break; + default: log_user_errorf("unexpected size"); break; + } + } break; case DW_ATE_ImaginaryFloat: { NotImplemented; } break; @@ -1836,9 +1844,6 @@ d2r_convert_types(Arena *arena, case DW_ATE_UnsignedFixed: { NotImplemented; } break; - case DW_ATE_DecimalFloat: { - NotImplemented; - } break; case DW_ATE_Ucs: { NotImplemented; } break; diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 2b837911..a2fcbf99 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -70,33 +70,36 @@ T_BeginTest(d2r_types) dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_##e); \ dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ dw_writer_tag_end(writer); - DeclBaseType(char_type, "char", SignedChar, 1); - DeclBaseType(unsigned_char_type, "unsigned char", UnsignedChar, 1); - DeclBaseType(char8_type, "char8_t", Utf, 1); - DeclBaseType(char16_type, "char16_t", Utf, 2); - DeclBaseType(char32_type, "char32_t", Utf, 4); - DeclBaseType(wchar_type, "wchar_t", Signed, 4); - DeclBaseType(bool_type, "_Bool", Boolean, 1); - DeclBaseType(short_type, "short", Signed, 2); - DeclBaseType(unsigned_short_type, "unsigned short", Unsigned, 2); - DeclBaseType(short_unsigned_int_type, "short unsigned int", Unsigned, 2); - DeclBaseType(short_int_type, "short int", Signed, 2); - DeclBaseType(unsigned_int_type, "unsigned int", Unsigned, 4); - DeclBaseType(int_type, "int", Signed, 4); - DeclBaseType(long_int_type, "long int", Signed, 8); - DeclBaseType(long_unsigned_int_type, "long unsigned int", Unsigned, 8); - DeclBaseType(long_long_int_type, "long long int", Signed, 8); - DeclBaseType(long_long_unsigned_int, "long long unsigned int", Unsigned, 8); - DeclBaseType(float_type, "float", Float, 4); - DeclBaseType(double_type, "double", Float, 8); - DeclBaseType(long_double_type, "long double", Float, 16); - DeclBaseType(float16_type, "_Float16", Float, 2); - DeclBaseType(float80_type, "__float80", Float, 16); - DeclBaseType(float128_type, "_float128", Float, 16); - DeclBaseType(complex_float, "complex float", ComplexFloat, 8); - DeclBaseType(complex_doulbe, "complex double", ComplexFloat, 16); - DeclBaseType(complex_long_double, "complex long double", ComplexFloat, 32); - //DeclBaseType("__bf16", Float, 2); + DeclBaseType(char_type, "char", SignedChar, 1); + DeclBaseType(unsigned_char_type, "unsigned char", UnsignedChar, 1); + DeclBaseType(char8_type, "char8_t", Utf, 1); + DeclBaseType(char16_type, "char16_t", Utf, 2); + DeclBaseType(char32_type, "char32_t", Utf, 4); + DeclBaseType(wchar_type, "wchar_t", Signed, 4); + DeclBaseType(bool_type, "_Bool", Boolean, 1); + DeclBaseType(short_type, "short", Signed, 2); + DeclBaseType(unsigned_short_type, "unsigned short", Unsigned, 2); + DeclBaseType(short_unsigned_int_type, "short unsigned int", Unsigned, 2); + DeclBaseType(short_int_type, "short int", Signed, 2); + DeclBaseType(unsigned_int_type, "unsigned int", Unsigned, 4); + DeclBaseType(int_type, "int", Signed, 4); + DeclBaseType(long_int_type, "long int", Signed, 8); + DeclBaseType(long_unsigned_int_type, "long unsigned int", Unsigned, 8); + DeclBaseType(long_long_int_type, "long long int", Signed, 8); + DeclBaseType(long_long_unsigned_int, "long long unsigned int", Unsigned, 8); + DeclBaseType(float_type, "float", Float, 4); + DeclBaseType(double_type, "double", Float, 8); + DeclBaseType(long_double_type, "long double", Float, 16); + DeclBaseType(float16_type, "_Float16", Float, 2); + DeclBaseType(bfloat16_type, "__bf16", Float, 2); + DeclBaseType(float80_type, "__float80", Float, 16); + DeclBaseType(float128_type, "_float128", Float, 16); + DeclBaseType(complex_float_type, "complex float", ComplexFloat, 8); + DeclBaseType(complex_doulbe_type, "complex double", ComplexFloat, 16); + DeclBaseType(complex_long_double_type, "complex long double", ComplexFloat, 32); + DeclBaseType(decimal32_type, "_Decimal32", DecimalFloat, 4); + DeclBaseType(decimal64_type, "_Decimal64", DecimalFloat, 8); + DeclBaseType(decimal128_type, "_Decimal128", DecimalFloat, 16); #undef DeclBaseType #define DeclStdint(n, a) \ @@ -160,16 +163,18 @@ T_BeginTest(d2r_types) TestBuiltinType("double", 8, F64); TestBuiltinType("long double", 16, F128); TestBuiltinType("_Float16", 2, F16); + TestBuiltinType("__bf16", 2, BF16); TestBuiltinType("__float80", 16, F80); TestBuiltinType("_float128", 16, F128); TestBuiltinType("complex float", 8, ComplexF32); TestBuiltinType("complex double", 16, ComplexF64); TestBuiltinType("complex long double", 32, ComplexF128); - // TODO: bfloat16 - //TestBuiltinType("__bf16", 2, BF16); + TestBuiltinType("_Decimal32", 4, Decimal32); + TestBuiltinType("_Decimal64", 8, Decimal64); + TestBuiltinType("_Decimal128", 16, Decimal128); #undef TestBuiltinType -#define TestStdint(n, s, t) \ +#define TestStdint(n, s, t) \ do { \ RDI_TypeNode *td = d2rt_type_from_name(rdi, &types_map, n); \ T_Ok(td); \ From e300a8579e8ec04c7cb2d47781b36b5d5beb6727 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 21:28:40 -0800 Subject: [PATCH 224/850] bump up RDI version --- src/lib_rdi/rdi.h | 2 +- src/rdi/rdi.mdesk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index f51d6c42..d2b6f321 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -67,7 +67,7 @@ union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; // "raddbg\0\0" #define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 17 +#define RDI_ENCODING_VERSION 18 //////////////////////////////////////////////////////////////// //~ Format Types & Functions diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 0a4012ee..f194532b 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -77,7 +77,7 @@ ""; "// \"raddbg\\0\\0\""; "#define RDI_MAGIC_CONSTANT 0x0000676264646172"; - "#define RDI_ENCODING_VERSION 17"; + "#define RDI_ENCODING_VERSION 18"; ""; "////////////////////////////////////////////////////////////////"; "//~ Format Types & Functions"; From a02fa0f4cb22dc63111f3beaa2b4095d8608dacc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Feb 2026 23:11:25 -0800 Subject: [PATCH 225/850] tests for int128 and uint128 --- src/torture/torture_d2r.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index a2fcbf99..8baff142 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -90,6 +90,8 @@ T_BeginTest(d2r_types) DeclBaseType(float_type, "float", Float, 4); DeclBaseType(double_type, "double", Float, 8); DeclBaseType(long_double_type, "long double", Float, 16); + DeclBaseType(int128_type, "__int128", Signed, 16); + DeclBaseType(uint128_type, "__int128 unsigned", Unsigned, 16); DeclBaseType(float16_type, "_Float16", Float, 2); DeclBaseType(bfloat16_type, "__bf16", Float, 2); DeclBaseType(float80_type, "__float80", Float, 16); @@ -162,6 +164,8 @@ T_BeginTest(d2r_types) TestBuiltinType("float", 4, F32); TestBuiltinType("double", 8, F64); TestBuiltinType("long double", 16, F128); + TestBuiltinType("__int128", 16, S128); + TestBuiltinType("__int128 unsigned", 16, U128); TestBuiltinType("_Float16", 2, F16); TestBuiltinType("__bf16", 2, BF16); TestBuiltinType("__float80", 16, F80); From e7cf2513b70fef1e7d2628959f99cc76a75c6553 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Feb 2026 18:11:11 -0800 Subject: [PATCH 226/850] todo --- src/rdi_from_dwarf/rdi_from_dwarf.c | 5 +++++ src/torture/torture_d2r.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 369e22a0..e5020690 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1934,6 +1934,11 @@ d2r_convert_types(Arena *arena, type->direct_type = direct_type; } break; case DW_TagKind_ArrayType: { + // TODO: @native_vector_support extract byte size from the base type tag + // and convert to U256, U512, S256 and S512 + B32 is_vector = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_GNU_Vector); + if (is_vector) { NotImplemented; } + B32 error = 1; // * DWARF vs RDI Array Type Graph * diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 8baff142..c0f5ee47 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -120,6 +120,22 @@ T_BeginTest(d2r_types) DeclStdint("int32_t", int_type); DeclStdint("int64_t", long_int_type); #undef DeclStdInt + // TODO: @native_vector_support + // + // typedef int __attribute__((vector_size(32))) int256 + // typedef unsigned int __attribute__((vector_size(32))) uint256 + // typedef int __attribute__((vector_size(64))) int512 + // typedef unsigned int __attribute__((vector_size(64))) uint512 + // +#if 0 + dw_writer_tag_begin(writer, DW_TagKind_ArrayType); + dw_writer_push_attrib_flag(writer, DW_AttribKind_GNU_Vector, 1); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, int_type); + dw_writer_tag_begin(writer, DW_TagKind_SubrangeType); + dw_writer_push_attrib_uint(writer, DW_AttribKind_UpperBound, 15); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); +#endif dw_writer_tag_end(writer); } From a9d3757dbc395da336e7b23bbc4e87d61059dc63 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Feb 2026 18:08:53 -0800 Subject: [PATCH 227/850] fix wonky line table indent --- src/dwarf/dwarf_dump.c | 339 ++++++++++++++++++++++------------------- 1 file changed, 182 insertions(+), 157 deletions(-) diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index c7759a7c..1a378789 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -946,183 +946,207 @@ DW_PRINTER(dw_print_line) DW_LineVM *vm = dw_line_vm_init(input, &cu_arr[unit_idx]); // rjf: begin logging line table - dw_printf("line_table: // line_table[%I64u]\n{\n", unit_idx); - - // rjf: log line table header - DeferLoop(dw_printf(" header:\n {\n"), dw_printf(" }\n\n")) + dw_printf("line_table: // line_table[%I64u]\n", unit_idx); + dw_printf("{\n"); + dw_indent(); { - String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(vm->header.opcode_lens, vm->header.num_opcode_lens), 1); - String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(", ")}); - dw_printf(" version: %u\n", vm->header.version ); - dw_printf(" line_table_size: %I64u\n", vm->header.unit_length ); - dw_printf(" address_size: %u\n", vm->header.address_size ); - dw_printf(" segment_selector_size: %u\n", vm->header.segment_selector_size); - dw_printf(" header_length: %I64u\n", vm->header.header_length ); - dw_printf(" min_instruction_length: %u\n", vm->header.min_inst_len ); - dw_printf(" max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); - dw_printf(" default_is_stmt: %u\n", vm->header.default_is_stmt ); - dw_printf(" line_base: %d\n", vm->header.line_base ); - dw_printf(" line_range: %u\n", vm->header.line_range ); - dw_printf(" opcode_base: %u\n", vm->header.opcode_base ); - dw_printf(" opcode_lengths: %S\n", opcode_lengths_string ); - } - - // rjf: log directory table - DeferLoop(dw_printf(" directory_table:\n {\n"), dw_printf(" }\n\n")) - { - dw_printf(" // %-4s %-8s\n", "no.", "name"); - for EachIndex(dir_idx, vm->header.dir_table.count) + // rjf: log line table header + dw_printf("header:\n"); + dw_printf("{\n"); + dw_indent(); { - dw_printf(" { %-4I64u %S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); + String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(vm->header.opcode_lens, vm->header.num_opcode_lens), 1); + String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(", ")}); + dw_printf("version: %u\n", vm->header.version ); + dw_printf("line_table_size: %I64u\n", vm->header.unit_length ); + dw_printf("address_size: %u\n", vm->header.address_size ); + dw_printf("segment_selector_size: %u\n", vm->header.segment_selector_size); + dw_printf("header_length: %I64u\n", vm->header.header_length ); + dw_printf("min_instruction_length: %u\n", vm->header.min_inst_len ); + dw_printf("max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); + dw_printf("default_is_stmt: %u\n", vm->header.default_is_stmt ); + dw_printf("line_base: %d\n", vm->header.line_base ); + dw_printf("line_range: %u\n", vm->header.line_range ); + dw_printf("opcode_base: %u\n", vm->header.opcode_base ); + dw_printf("opcode_lengths: { %S }\n", opcode_lengths_string ); } - } + dw_unindent(); + dw_printf("}\n"); - // rjf: log file table - DeferLoop(dw_printf(" file_table:\n {\n"), dw_printf(" }\n\n")) - { - dw_printf(" // %-4s %-8s %-8s %-33s %-8s %-8s\n", "no.", "dir_idx", "time", "md5", "size", "name"); - for EachIndex(file_idx, vm->header.file_table.count) + // rjf: log directory table + dw_printf("directory_table:\n"); + dw_printf("{\n"); + dw_indent(); { - DW_LineFile *file = &vm->header.file_table.v[file_idx]; - dw_printf(" { %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %S }\n", - file_idx, - file->dir_idx, - file->modify_time, - file->md5_digest.u64[1], - file->md5_digest.u64[0], - file->file_size, - file->file_name); + dw_printf("// %-4s %-30s\n", "no.", "name"); + dw_printf("// ---- ------------------------------\n"); + for EachIndex(dir_idx, vm->header.dir_table.count) + { + dw_printf("{ %-4I64u %S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); + } } - } + dw_unindent(); + dw_printf("}\n\n"); - // rjf: log opcodes - DeferLoop(dw_printf(" line_table:\n {\n"), dw_printf(" }\n\n")) - { - dw_printf(" //\n"); - dw_printf(" // %-16s %-8s %-4s %-5s %-3s %-7s %-16s\n", "Address", "Line", "Col", "File", "ISA", "Discrim", "Flags"); - dw_printf(" // ---------------- -------- ---- ----- --- ------- ----------------\n"); - - for(;;) + // rjf: log file table + dw_printf("file_table:\n"); + dw_printf("{\n"); + dw_indent(); { - U64 global_opcode_off = unit_ranges.v[unit_idx].min + vm->cursor; - - if( ! dw_line_vm_step(vm)) { break; } - - Temp opcode_temp = temp_begin(unit_temp.arena); - String8List opcode_fmt = {0}; - - // opcode offset - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); - - // push opcode id - String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); - str8_list_push(arena, &opcode_fmt, opcode_str); - - // print operands - switch(vm->opcode) + dw_printf("// %-4s %-8s %-8s %-33s %-8s %-20s\n", "no.", "dir_idx", "time", "md5", "size", "name"); + dw_printf("// ---- -------- -------- --------------------------------- -------- --------------------\n"); + for EachIndex(file_idx, vm->header.file_table.count) { - default: + DW_LineFile *file = &vm->header.file_table.v[file_idx]; + dw_printf("{ %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %S }\n", + file_idx, + file->dir_idx, + file->modify_time, + file->md5_digest.u64[1], + file->md5_digest.u64[0], + file->file_size, + file->file_name); + } + } + dw_unindent(); + dw_printf("}\n"); + + // rjf: log opcodes + dw_printf("line_table:\n"); + dw_printf("{\n"); + dw_indent(); + { + dw_printf("//\n"); + dw_printf("// %-16s %-8s %-4s %-5s %-3s %-7s %-16s\n", "Address", "Line", "Col", "File", "ISA", "Discrim", "Flags"); + dw_printf("// ---------------- -------- ---- ----- --- ------- ----------------\n"); + + for(;;) { - if(vm->opcode >= vm->header.opcode_base) + U64 global_opcode_off = unit_ranges.v[unit_idx].min + vm->cursor; + + if( ! dw_line_vm_step(vm)) { break; } + + Temp opcode_temp = temp_begin(unit_temp.arena); + String8List opcode_fmt = {0}; + + // opcode offset + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); + + // push opcode id + String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); + str8_list_push(arena, &opcode_fmt, opcode_str); + + // print operands + switch(vm->opcode) { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); - } - else + default: { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); - } - }break; - case DW_StdOpcode_Copy: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); - }break; - case DW_StdOpcode_AdvancePc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); - }break; - case DW_StdOpcode_AdvanceLine: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); - }break; - case DW_StdOpcode_SetFile: - { - DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); - }break; - case DW_StdOpcode_SetColumn: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); - }break; - case DW_StdOpcode_NegateStmt: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); - }break; - case DW_StdOpcode_SetBasicBlock: - { - }break; - case DW_StdOpcode_ConstAddPc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); - }break; - case DW_StdOpcode_FixedAdvancePc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); - }break; - case DW_StdOpcode_SetPrologueEnd: - { - }break; - case DW_StdOpcode_SetEpilogueBegin: - { - }break; - case DW_StdOpcode_SetIsa: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); - }break; - case DW_StdOpcode_ExtendedOpcode: - { - str8_list_push(opcode_temp.arena, &opcode_fmt, dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); - //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); - switch(vm->ext_opcode) - { - case DW_ExtOpcode_EndSequence: {} break; - case DW_ExtOpcode_SetAddress: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); } break; - case DW_ExtOpcode_DefineFile: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", - vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); } break; - case DW_ExtOpcode_SetDiscriminator: { str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); }break; - } + if(vm->opcode >= vm->header.opcode_base) + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); + } + else + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); + } }break; + case DW_StdOpcode_Copy: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); + }break; + case DW_StdOpcode_AdvancePc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); + }break; + case DW_StdOpcode_AdvanceLine: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); + }break; + case DW_StdOpcode_SetFile: + { + DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); + }break; + case DW_StdOpcode_SetColumn: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); + }break; + case DW_StdOpcode_NegateStmt: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); + }break; + case DW_StdOpcode_SetBasicBlock: + { + }break; + case DW_StdOpcode_ConstAddPc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); + }break; + case DW_StdOpcode_FixedAdvancePc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); + }break; + case DW_StdOpcode_SetPrologueEnd: + { + }break; + case DW_StdOpcode_SetEpilogueBegin: + { + }break; + case DW_StdOpcode_SetIsa: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); + }break; + case DW_StdOpcode_ExtendedOpcode: + { + str8_list_push(opcode_temp.arena, &opcode_fmt, dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); + //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); + switch(vm->ext_opcode) + { + case DW_ExtOpcode_EndSequence: {} break; + case DW_ExtOpcode_SetAddress: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); } break; + case DW_ExtOpcode_DefineFile: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", + vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); } break; + case DW_ExtOpcode_SetDiscriminator: { str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); }break; + } + }break; + } + + if(is_verbose) + { + String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("// %S\n", string); + } + + if(vm->new_line) { + String8List l = {0}; + if(vm->state.is_stmt) + { + str8_list_pushf(opcode_temp.arena, &l, "is_stmt"); + } + if(vm->state.end_sequence) + { + str8_list_pushf(opcode_temp.arena, &l, "end_seq"); + } + String8 flags = str8_list_join(opcode_temp.arena, &l, &(StringJoin){.sep = str8_lit("|")}); + + dw_printf("{ %#016I64x %8I64u %4I64u %5I64u %3I64u %7I64u %-16S } %s\n", vm->state.address, vm->state.line, vm->state.column, vm->state.file_index, vm->state.isa, vm->state.discriminator, flags, vm->new_seq ? "// new seq" : ""); + } + + temp_end(opcode_temp); } - if(is_verbose) + if(vm->error.size) { - String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); - dw_printf(" // %S\n", string); + dw_printf("ERROR: Line VM failed stepping @ 0x%I64x\n", vm->cursor); } - - if(vm->new_line) { - String8List l = {0}; - if(vm->state.is_stmt) - { - str8_list_pushf(opcode_temp.arena, &l, "is_stmt"); - } - if(vm->state.end_sequence) - { - str8_list_pushf(opcode_temp.arena, &l, "end_seq"); - } - String8 flags = str8_list_join(opcode_temp.arena, &l, &(StringJoin){.sep = str8_lit("|")}); - - dw_printf(" { %#016I64x %8I64u %4I64u %5I64u %3I64u %7I64u %-16S } %s\n", vm->state.address, vm->state.line, vm->state.column, vm->state.file_index, vm->state.isa, vm->state.discriminator, flags, vm->new_seq ? "// new seq" : ""); - } - - temp_end(opcode_temp); } + dw_unindent(); + dw_printf("}\n"); - if(vm->error.size) - { - dw_printf("ERROR: Line VM failed stepping @ 0x%I64x\n", vm->cursor); - } + temp_end(unit_temp); } - temp_end(unit_temp); + dw_unindent(); + dw_printf("}\n"); } scratch_end(scratch); } @@ -2141,6 +2165,7 @@ read_only struct { { dw_print_info, DW_Section_Info }, { dw_print_strings, DW_Section_Str }, { dw_print_frame, DW_Section_Frame }, + { dw_print_line, DW_Section_Line }, }; internal String8List From a6dd529dd5987e0164d0d3348df101359998be10 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Feb 2026 18:10:04 -0800 Subject: [PATCH 228/850] explicitly handle null terminator in abbrev parse --- src/dwarf/dwarf_parse.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index c6f603b6..bdaae721 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -452,8 +452,17 @@ dw_read_abbrev_tag(String8 data, U64 offset, DW_Abbrev *out_abbrev) U64 cursor = offset; // read tag ID and kind - U64 id, kind; + U64 id = 0; TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); + + // is this null terminator? + if (id == 0) { + total_bytes_read = cursor - offset; + MemoryZeroStruct(out_abbrev); + goto exit; + } + + U64 kind = 0; TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); // read child flag From cfe3cde396757a952c3eb0d92eef7e0dfbfcd0a5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 20 Feb 2026 11:17:12 -0800 Subject: [PATCH 229/850] checkpoint: basic line emission --- src/dwarf/dwarf.h | 1 + src/dwarf/dwarf_writer.c | 733 ++++++++++++++++++++++++++++++------ src/dwarf/dwarf_writer.h | 177 +++++++-- src/linker/hash_table.c | 9 + src/linker/hash_table.h | 6 +- src/natvis/base.natvis | 1 + src/torture/torture_dwarf.c | 136 ++++--- 7 files changed, 853 insertions(+), 210 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 960202a3..5de439be 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -166,6 +166,7 @@ typedef enum DW_StdOpcodeEnum #define X(_N,_ID) DW_StdOpcode_##_N = _ID, DW_StdOpcode_XList #undef X + DW_StdOpcode_Count, } DW_StdOpcodeEnum; #define DW_ExtOpcode_XList \ diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index 420704f5..c76d0c2e 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -49,14 +49,6 @@ dw_size_from_uint(U64 v) return 0; } -internal void -dw_lower_form(DW_WriterFormKind form_kind, - DW_WriterForm form, - DW_FormKind *form_kind_out, - DW_Form *form_out) -{ -} - internal DW_WriterFixupNode * dw_writer_fixup_list_push(Arena *arena, DW_WriterFixupList *list, DW_WriterFixup v) { @@ -110,19 +102,22 @@ dw_writer_begin(DW_Format format, DW_Version version, DW_CompUnitKind cu_kind, A { Arena *arena = arena_alloc(); DW_Writer *writer = push_array(arena, DW_Writer, 1); - writer->arena = arena; - writer->arch = arch; - writer->format = format; - writer->version = version; - writer->cu_kind = cu_kind; - writer->address_size = byte_size_from_arch(arch); - writer->current = 0; - writer->abbrev_id_map = hash_table_init(arena, 0x2000); + writer->arena = arena; + writer->arch = arch; + writer->format = format; + writer->version = version; + writer->cu_kind = cu_kind; + writer->address_size = byte_size_from_arch(arch); + writer->current = 0; + writer->abbrev_id_map = hash_table_init(arena, 0x2000); + writer->line.opcode_base = DW_StdOpcode_Count; + writer->line.line_base = -5; + writer->line.line_range = 14; for EachElement(i, writer->sections) { str8_serial_begin(arena, &writer->sections[i].srl); } - // write .debug_info header + // write info header { String8List *srl = &writer->sections[DW_Section_Info].srl; @@ -158,6 +153,137 @@ dw_writer_end(DW_Writer **writer_ptr) *writer_ptr = 0; } +internal U64 +dw_serial_push_form(Arena *arena, String8List *srl, DW_Version version, DW_Format format, U8 address_size, DW_WriterFixupList *fixups, DW_WriterXForm form) +{ + U64 start_off = srl->total_size; + switch (form.reader.kind) { + case DW_Form_Addr: { + str8_serial_push_string(arena, srl, form.reader.addr); + } break; + case DW_Form_Block1: + case DW_Form_Block2: + case DW_Form_Block4: { + str8_serial_push_string(arena, srl, form.reader.block); + } break; + case DW_Form_Data1: + case DW_Form_Data2: + case DW_Form_Data4: + case DW_Form_Data8: { + str8_serial_push_string(arena, srl, form.reader.data); + } break; + case DW_Form_String: { + str8_serial_push_cstr(arena, srl, form.reader.string); + } break; + case DW_Form_Flag: { + str8_serial_push_u8(arena, srl, form.reader.flag); + } break; + case DW_Form_SData: { + dw_serial_push_sleb128(arena, srl, form.reader.sdata); + } break; + case DW_Form_Strp: { + dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); + } break; + case DW_Form_UData: { + dw_serial_push_uleb128(arena, srl, form.reader.udata); + } break; + case DW_Form_RefAddr: { + if (version < DW_Version_3) { + Assert(address_size <= sizeof(form.reader.ref)); + str8_serial_push_string(arena, srl, str8((U8 *)&form.reader.ref, address_size)); + } else { + dw_serial_push_uint(arena, srl, format, form.reader.ref); + } + } break; + case DW_Form_Ref1: { + str8_serial_push_u8(arena, srl, (U8)form.reader.ref); + } break; + case DW_Form_Ref2: { + str8_serial_push_u16(arena, srl, (U16)form.reader.ref); + } break; + case DW_Form_Ref4: { + str8_serial_push_u32(arena, srl, (U32)form.reader.ref); + } break; + case DW_Form_Ref8: { + if (form.writer.ref->info_off == 0) { + // reserve 8 bytes + void *value = str8_serial_push_u64(arena, srl, 0); + + // push fixup + dw_writer_fixup_list_push(arena, fixups, (DW_WriterFixup){ .ptr = value, .tag = form.writer.ref }); + } + } break; + case DW_Form_RefUData: { + dw_serial_push_uleb128(arena, srl, form.reader.ref); + } break; + case DW_Form_Indirect: { + NotImplemented; + } break; + case DW_Form_SecOffset: { + dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); + } break; + case DW_Form_ExprLoc: { + dw_serial_push_uleb128(arena, srl, form.reader.exprloc.size); + str8_serial_push_string(arena, srl, form.reader.exprloc); + } break; + case DW_Form_FlagPresent: { + } break; + case DW_Form_RefSig8: { + NotImplemented; + } break; + case DW_Form_Strx: + case DW_Form_Addrx: + case DW_Form_RngListx: + case DW_Form_LocListx: { + dw_serial_push_uleb128(arena, srl, form.reader.xval); + } break; + case DW_Form_RefSup4: { + NotImplemented; + } break; + case DW_Form_StrpSup: { + dw_serial_push_uint(arena, srl, format, form.reader.strp_sup); + } break; + case DW_Form_Data16: { + str8_serial_push_string(arena, srl, form.reader.data); + } break; + case DW_Form_LineStrp: { + dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); + } break; + case DW_Form_ImplicitConst: { + // value is stored in the abbrev entry + } break; + case DW_Form_RefSup8: { + NotImplemented; + } break; + case DW_Form_Strx1: + case DW_Form_Addrx1: { + str8_serial_push_u8(arena, srl, (U8)form.reader.xval); + } break; + case DW_Form_Strx2: + case DW_Form_Addrx2: { + str8_serial_push_u16(arena, srl, (U16)form.reader.xval); + } break; + case DW_Form_Strx3: + case DW_Form_Addrx3: { + str8_serial_push_string(arena, srl, str8((U8 *)&form.reader.xval, 3)); + } break; + case DW_Form_Strx4: + case DW_Form_Addrx4: { + str8_serial_push_u32(arena, srl, (U32)form.reader.xval); + } break; + + case DW_Form_GNU_StrpAlt: { + dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); + } break; + case DW_Form_GNU_RefAlt: { + dw_serial_push_uint(arena, srl, format, form.reader.ref); + } break; + + default: InvalidPath; break; + } + return srl->total_size - start_off; +} + internal String8 dw_make_abbrev_entry(Arena *arena, DW_WriterTag *tag) { @@ -174,9 +300,9 @@ dw_make_abbrev_entry(Arena *arena, DW_WriterTag *tag) // attrib abbrev for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { dw_serial_push_uleb128(scratch.arena, &srl, attrib->kind); - dw_serial_push_uleb128(scratch.arena, &srl, attrib->reader.form.kind); - if (attrib->reader.form.kind == DW_Form_ImplicitConst) { - dw_serial_push_sleb128(scratch.arena, &srl, attrib->reader.form.implicit_const); + dw_serial_push_uleb128(scratch.arena, &srl, attrib->form.reader.kind); + if (attrib->form.reader.kind == DW_Form_ImplicitConst) { + dw_serial_push_sleb128(scratch.arena, &srl, attrib->form.reader.implicit_const); } } @@ -251,7 +377,7 @@ dw_writer_push_attrib(DW_Writer *writer, DW_AttribKind kind, DW_WriterForm form) DW_WriterAttrib *attrib = dw_writer_attrib_chunk_list_push(writer->arena, &writer->attrib_chunk_list, 512); attrib->kind = kind; - attrib->writer.form = form; + attrib->form.writer = form; SLLQueuePush(writer->current->first_attrib, writer->current->last_attrib, attrib); writer->current->attrib_count += 1; return attrib; @@ -358,68 +484,230 @@ dw_writer_push_attrib_implicit(DW_Writer *writer, DW_AttribKind kind, S64 implic return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_Implicit, .implicit = implicit }); } +internal void +dw_line_inst_list_push_node(DW_LineInstList *list, DW_LineInstNode *node) +{ + SLLQueuePush(list->first, list->last, node); + list->count += 1; +} + +internal DW_LineInstNode * +dw_line_inst_list_push(Arena *arena, DW_LineInstList *list, DW_LineInst v) +{ + DW_LineInstNode *node = push_array(arena, DW_LineInstNode, 1); + node->v = v; + dw_line_inst_list_push_node(list, node); + return node; +} + +internal String8 +dw_data_from_line_insts(Arena *arena, U8 address_size, DW_LineInstList insts) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + + for EachNode(inst_n, DW_LineInstNode, insts.first) { + DW_LineInst *inst = &inst_n->v; + + str8_serial_push_struct(scratch.arena, &srl, &inst->opcode); + switch (inst->opcode) { + case DW_StdOpcode_Copy: {} break; + case DW_StdOpcode_AdvancePc: { + dw_serial_push_uleb128(arena, &srl, inst->advance_pc); + } break; + case DW_StdOpcode_AdvanceLine: { + dw_serial_push_sleb128(arena, &srl, inst->advance_line); + } break; + case DW_StdOpcode_SetFile: { + dw_serial_push_uleb128(arena, &srl, inst->set_file->file_idx); + } break; + case DW_StdOpcode_SetColumn: { + dw_serial_push_uleb128(arena, &srl, inst->set_column); + } break; + case DW_StdOpcode_NegateStmt: {} break; + case DW_StdOpcode_SetBasicBlock: {} break; + case DW_StdOpcode_ConstAddPc: {} break; + case DW_StdOpcode_FixedAdvancePc: { + str8_serial_push_u16(arena, &srl, inst->fixed_advance_pc); + } break; + case DW_StdOpcode_SetPrologueEnd: {} break; + case DW_StdOpcode_SetEpilogueBegin: {} break; + case DW_StdOpcode_SetIsa: {} break; + case DW_StdOpcode_ExtendedOpcode: { + // get ext size + U64 ext_size = 0; + switch (inst->ext) { + case DW_ExtOpcode_EndSequence: { ext_size = 0; } break; + case DW_ExtOpcode_SetAddress: { ext_size = address_size; } break; + case DW_ExtOpcode_DefineFile: { + NotImplemented; + } break; + case DW_ExtOpcode_SetDiscriminator: { + ext_size = dw_size_from_uleb128(inst->set_discriminator); + } break; + default: { InvalidPath; } break; + } + + // write ext header + dw_serial_push_uleb128(arena, &srl, ext_size); + str8_serial_push_struct(arena, &srl, &inst->ext); + + // write ext operands + switch (inst->ext) { + case DW_ExtOpcode_EndSequence: {} break; + case DW_ExtOpcode_SetAddress: { + dw_serial_push_uleb128(arena, &srl, inst->set_address); + } break; + case DW_ExtOpcode_DefineFile: { + NotImplemented; + } break; + case DW_ExtOpcode_SetDiscriminator: { + dw_serial_push_uleb128(arena, &srl, inst->set_discriminator); + } break; + default: { InvalidPath; } break; + } + } break; + // special opcode + default: {} break; + } + } + + String8 data = str8_serial_end(arena, &srl); + scratch_end(scratch); + return data; +} + +internal void +dw_writer_line_emit(DW_Writer *writer, DW_WriterFile *file, U64 ln, U64 col, U64 addr) +{ + if (writer->line.last_file != file) { + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_file(file)); + } + + Assert(addr <= max_S64); + S64 addr_delta = (S64)addr - (S64)writer->line.addr; + if (addr_delta != 0) { + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_pc(addr_delta)); + } + + S64 ln_delta = (S64)ln - (S64)writer->line.ln; + if (ln_delta != 0) { + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(ln_delta)); + } + + S64 col_delta = (S64)col - (S64)writer->line.col; + if (col_delta != 0) { + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_column(col_delta)); + } + + // append row + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_copy()); + + writer->line.file = file; + writer->line.ln = ln; + writer->line.col = col; + writer->line.addr = addr; +} + +internal void +dw_writer_line_set_address(DW_Writer *writer, U64 address) +{ + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_address(address)); +} + +internal void +dw_writer_line_set_prologue_end(DW_Writer *writer) +{ + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_prologue_end()); +} + +internal void +dw_writer_line_epilogue_begin(DW_Writer *writer) +{ + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_epilogue_begin()); +} + +internal void +dw_writer_line_set_isa(DW_Writer *writer, U64 isa) +{ + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_isa(isa)); +} + +internal DW_WriterFile * +dw_writer_new_file(DW_Writer *writer, String8 path) +{ + DW_WriterFile *file = push_array(writer->arena, DW_WriterFile, 1); + file->path = path; + file->file_idx = writer->line.file_count; + + SLLQueuePush(writer->line.first_file, writer->line.last_file, file); + writer->line.file_count += 1; + return file; +} + internal void dw_lower_attrib_forms(DW_Writer *writer, DW_WriterTag *tag) { for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { - switch (attrib->writer.form.kind) { + switch (attrib->form.writer.kind) { case DW_WriterFormKind_Null: {} break; case DW_WriterFormKind_Flag: { - attrib->reader.form.kind = DW_Form_Flag; - attrib->reader.form.flag = attrib->writer.form.flag; + attrib->form.reader.kind = DW_Form_Flag; + attrib->form.reader.flag = attrib->form.writer.flag; } break; case DW_WriterFormKind_SInt: { - switch (dw_int_enc_from_sint(attrib->writer.form.sint)) { - case DW_IntEnc_Null: attrib->reader.form.kind = 0; break; + switch (dw_int_enc_from_sint(attrib->form.writer.sint)) { + case DW_IntEnc_Null: attrib->form.reader.kind = 0; break; case DW_IntEnc_1Byte: { - attrib->reader.form.kind = DW_Form_Data1; - attrib->reader.form.data = str8((U8 *)&attrib->writer.form.sint, sizeof(S8)); + attrib->form.reader.kind = DW_Form_Data1; + attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(S8)); } break; case DW_IntEnc_2Byte: { - attrib->reader.form.kind = DW_Form_Data2; - attrib->reader.form.data = str8((U8 *)&attrib->writer.form.sint, sizeof(S16)); + attrib->form.reader.kind = DW_Form_Data2; + attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(S16)); } break; case DW_IntEnc_4Byte: { - attrib->reader.form.kind = DW_Form_Data4; - attrib->reader.form.data = str8((U8 *)&attrib->writer.form.sint, sizeof(U32)); + attrib->form.reader.kind = DW_Form_Data4; + attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(U32)); } break; case DW_IntEnc_LEB128: { - attrib->reader.form.kind = DW_Form_SData; - attrib->reader.form.sdata = attrib->writer.form.sint; + attrib->form.reader.kind = DW_Form_SData; + attrib->form.reader.sdata = attrib->form.writer.sint; } break; default: InvalidPath; break; } } break; case DW_WriterFormKind_UInt: { - attrib->reader.form.kind = DW_Form_UData; - attrib->reader.form.udata = attrib->writer.form.uint; + attrib->form.reader.kind = DW_Form_UData; + attrib->form.reader.udata = attrib->form.writer.uint; } break; case DW_WriterFormKind_Address: { - Assert(writer->address_size <= sizeof(attrib->writer.form.address)); - attrib->reader.form.kind = DW_Form_Addr; - attrib->reader.form.addr = push_str8_copy(writer->arena, str8((U8 *)&attrib->writer.form.address, writer->address_size)); + Assert(writer->address_size <= sizeof(attrib->form.writer.address)); + attrib->form.reader.kind = DW_Form_Addr; + attrib->form.reader.addr = push_str8_copy(writer->arena, str8((U8 *)&attrib->form.writer.address, writer->address_size)); } break; case DW_WriterFormKind_Ref: { - if (attrib->writer.form.ref->info_off == 0) { - attrib->reader.form.kind = DW_Form_Ref8; + if (attrib->form.writer.ref->info_off == 0) { + attrib->form.reader.kind = DW_Form_Ref8; } else { - switch (dw_int_enc_from_uint(attrib->writer.form.ref->info_off)) { + switch (dw_int_enc_from_uint(attrib->form.writer.ref->info_off)) { case DW_IntEnc_Null: break; case DW_IntEnc_1Byte: { - attrib->reader.form.kind = DW_Form_Ref1; - attrib->reader.form.ref = (U8)attrib->writer.form.ref->info_off; + attrib->form.reader.kind = DW_Form_Ref1; + attrib->form.reader.ref = (U8)attrib->form.writer.ref->info_off; } break; case DW_IntEnc_2Byte: { - attrib->reader.form.kind = DW_Form_Ref2; - attrib->reader.form.ref = (U16)attrib->writer.form.ref->info_off; + attrib->form.reader.kind = DW_Form_Ref2; + attrib->form.reader.ref = (U16)attrib->form.writer.ref->info_off; } break; case DW_IntEnc_4Byte: { - attrib->reader.form.kind = DW_Form_Ref4; - attrib->reader.form.ref = (U32)attrib->writer.form.ref->info_off; + attrib->form.reader.kind = DW_Form_Ref4; + attrib->form.reader.ref = (U32)attrib->form.writer.ref->info_off; } break; case DW_IntEnc_LEB128: { - attrib->reader.form.kind = DW_Form_RefUData; - attrib->reader.form.ref = attrib->writer.form.ref->info_off; + attrib->form.reader.kind = DW_Form_RefUData; + attrib->form.reader.ref = attrib->form.writer.ref->info_off; } break; default: InvalidPath; break; } @@ -438,26 +726,26 @@ dw_lower_attrib_forms(DW_Writer *writer, DW_WriterTag *tag) NotImplemented; } break; case DW_WriterFormKind_Block: { - attrib->reader.form.block = attrib->writer.form.block; - switch (attrib->writer.form.block.size) { + attrib->form.reader.block = attrib->form.writer.block; + switch (attrib->form.writer.block.size) { case 0 : break; - case 1 : attrib->reader.form.kind = DW_Form_Block1; break; - case 2 : attrib->reader.form.kind = DW_Form_Block2; break; - case 4 : attrib->reader.form.kind = DW_Form_Block4; break; - default: attrib->reader.form.kind = DW_Form_Block; break; + case 1 : attrib->form.reader.kind = DW_Form_Block1; break; + case 2 : attrib->form.reader.kind = DW_Form_Block2; break; + case 4 : attrib->form.reader.kind = DW_Form_Block4; break; + default: attrib->form.reader.kind = DW_Form_Block; break; } } break; case DW_WriterFormKind_String: { - attrib->reader.form.kind = DW_Form_String; - attrib->reader.form.string = attrib->writer.form.string; + attrib->form.reader.kind = DW_Form_String; + attrib->form.reader.string = attrib->form.writer.string; } break; case DW_WriterFormKind_ExprLoc: { - attrib->reader.form.kind = DW_Form_ExprLoc; - attrib->reader.form.exprloc = attrib->writer.form.exprloc; + attrib->form.reader.kind = DW_Form_ExprLoc; + attrib->form.reader.exprloc = attrib->form.writer.exprloc; } break; case DW_WriterFormKind_Implicit: { - attrib->reader.form.kind = DW_Form_ImplicitConst; - attrib->reader.form.implicit_const = attrib->writer.form.implicit; + attrib->form.reader.kind = DW_Form_ImplicitConst; + attrib->form.reader.implicit_const = attrib->form.writer.implicit; } break; default: { InvalidPath; } break; } @@ -500,74 +788,74 @@ dw_writer_emit_tag(DW_Writer *writer, DW_WriterTag *tag) { String8List *debug_info = &writer->sections[DW_Section_Info].srl; for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { - switch (attrib->reader.form.kind) { + switch (attrib->form.reader.kind) { case DW_Form_Addr: { - str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.addr); + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.addr); } break; case DW_Form_Block1: case DW_Form_Block2: case DW_Form_Block4: { - str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.block); + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.block); } break; case DW_Form_Data1: case DW_Form_Data2: case DW_Form_Data4: case DW_Form_Data8: { - str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.data); + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.data); } break; case DW_Form_String: { - str8_serial_push_cstr(writer->arena, debug_info, attrib->reader.form.string); + str8_serial_push_cstr(writer->arena, debug_info, attrib->form.reader.string); } break; case DW_Form_Flag: { - str8_serial_push_u8(writer->arena, debug_info, attrib->reader.form.flag); + str8_serial_push_u8(writer->arena, debug_info, attrib->form.reader.flag); } break; case DW_Form_SData: { - dw_serial_push_sleb128(writer->arena, debug_info, attrib->reader.form.sdata); + dw_serial_push_sleb128(writer->arena, debug_info, attrib->form.reader.sdata); } break; case DW_Form_Strp: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.sec_offset); + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); } break; case DW_Form_UData: { - dw_serial_push_uleb128(writer->arena, debug_info, attrib->reader.form.udata); + dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.udata); } break; case DW_Form_RefAddr: { if (writer->version < DW_Version_3) { - Assert(writer->address_size <= sizeof(attrib->reader.form.ref)); - str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->reader.form.ref, writer->address_size)); + Assert(writer->address_size <= sizeof(attrib->form.reader.ref)); + str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->form.reader.ref, writer->address_size)); } else { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.ref); + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.ref); } } break; case DW_Form_Ref1: { - str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->reader.form.ref); + str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->form.reader.ref); } break; case DW_Form_Ref2: { - str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->reader.form.ref); + str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->form.reader.ref); } break; case DW_Form_Ref4: { - str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->reader.form.ref); + str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->form.reader.ref); } break; case DW_Form_Ref8: { - if (attrib->writer.form.ref->info_off == 0) { + if (attrib->form.writer.ref->info_off == 0) { // reserve 8 bytes void *value = str8_serial_push_u64(writer->arena, debug_info, 0); // push fixup - dw_writer_fixup_list_push(writer->arena, &writer->fixups, (DW_WriterFixup){ .value = value, .attrib = attrib }); + dw_writer_fixup_list_push(writer->arena, &writer->fixups, (DW_WriterFixup){ .tag = attrib->form.writer.ref, .ptr = value }); } } break; case DW_Form_RefUData: { - dw_serial_push_uleb128(writer->arena, debug_info, attrib->reader.form.ref); + dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.ref); } break; case DW_Form_Indirect: { NotImplemented; } break; case DW_Form_SecOffset: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.sec_offset); + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); } break; case DW_Form_ExprLoc: { - dw_serial_push_uleb128(writer->arena, debug_info, attrib->reader.form.exprloc.size); - str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.exprloc); + dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.exprloc.size); + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.exprloc); } break; case DW_Form_FlagPresent: { } break; @@ -578,19 +866,19 @@ dw_writer_emit_tag(DW_Writer *writer, DW_WriterTag *tag) case DW_Form_Addrx: case DW_Form_RngListx: case DW_Form_LocListx: { - dw_serial_push_uleb128(writer->arena, debug_info, attrib->reader.form.xval); + dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.xval); } break; case DW_Form_RefSup4: { NotImplemented; } break; case DW_Form_StrpSup: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.strp_sup); + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.strp_sup); } break; case DW_Form_Data16: { - str8_serial_push_string(writer->arena, debug_info, attrib->reader.form.data); + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.data); } break; case DW_Form_LineStrp: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.sec_offset); + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); } break; case DW_Form_ImplicitConst: { // value is stored in the abbrev entry @@ -600,26 +888,26 @@ dw_writer_emit_tag(DW_Writer *writer, DW_WriterTag *tag) } break; case DW_Form_Strx1: case DW_Form_Addrx1: { - str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->reader.form.xval); + str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->form.reader.xval); } break; case DW_Form_Strx2: case DW_Form_Addrx2: { - str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->reader.form.xval); + str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->form.reader.xval); } break; case DW_Form_Strx3: case DW_Form_Addrx3: { - str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->reader.form.xval, 3)); + str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->form.reader.xval, 3)); } break; case DW_Form_Strx4: case DW_Form_Addrx4: { - str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->reader.form.xval); + str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->form.reader.xval); } break; case DW_Form_GNU_StrpAlt: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.sec_offset); + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); } break; case DW_Form_GNU_RefAlt: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->reader.form.ref); + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.ref); } break; default: InvalidPath; break; @@ -641,36 +929,245 @@ dw_writer_emit_tag(DW_Writer *writer, DW_WriterTag *tag) internal void dw_writer_emit(DW_Writer *writer) { - dw_writer_emit_tag(writer, writer->root); + // line + { + // push line table terminator + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_end_sequence()); - // null terminate .debug_abbrev - dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Abbrev].srl, 0); - dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Abbrev].srl, 0); - - // fixup units lengths - for EachElement(i, writer->sections) { - if (writer->sections[i].length) { - if (writer->format == DW_Format_64Bit) { - U64 *length = writer->sections[i].length; - U64 length_size = sizeof(U64) + sizeof(U32); - Assert(writer->sections[i].srl.total_size >= length_size); - *length = writer->sections[i].srl.total_size - length_size; - } else { - U32 *length = writer->sections[i].length; - U32 length_size = sizeof(U32); - Assert(writer->sections[i].srl.total_size >= length_size); - *length = safe_cast_u32(writer->sections[i].srl.total_size - length_size); + // find comp dir in the compile unit tag + String8 comp_dir = {0}; + String8 comp_name = {0}; + Assert(writer->root->kind == DW_TagKind_CompileUnit); + for EachNode(attrib, DW_WriterAttrib, writer->root->first_attrib) { + if (attrib->kind == DW_AttribKind_CompDir) { + AssertAlways(attrib->form.writer.kind == DW_WriterFormKind_String); + comp_dir = attrib->form.writer.string; + } else if (attrib->kind == DW_AttribKind_Name) { + AssertAlways(attrib->form.writer.kind == DW_WriterFormKind_String); + comp_name = attrib->form.writer.string; } } + + String8List dir_table_srl = {0}; + str8_serial_begin(writer->arena, &dir_table_srl); + { + Temp scratch = scratch_begin(0, 0); + String8List *srl = &dir_table_srl; + + // (13) directory_entry_format_count + str8_serial_push_u8(writer->arena, srl, 1); + // (14) directory_entry_format + dw_serial_push_uleb128(writer->arena, srl, DW_LNCT_Path); + dw_serial_push_uleb128(writer->arena, srl, DW_Form_String); + + // dedup directories + HashTable *dir_ht = hash_table_init(scratch.arena, writer->line.file_count + 1); + // first entry must be compile unit directory + hash_table_push_string_u64(scratch.arena, dir_ht, comp_dir, dir_ht->count); + for EachNode(file, DW_WriterFile, writer->line.first_file) { + String8 path = str8_chop_last_slash(file->path); + if ( ! hash_table_search_string_u64(dir_ht, path, &file->dir_idx)) { + file->dir_idx = hash_table_push_string_u64(scratch.arena, dir_ht, path, dir_ht->count)->v.value_u64; + } + } + KeyValuePair *dirs_kv = key_value_pairs_from_hash_table(scratch.arena, dir_ht); + sort_key_value_pairs_as_string_sensitive(dirs_kv, dir_ht->count); + + // (15) directories_count + dw_serial_push_uleb128(writer->arena, srl, dir_ht->count); + // (16) directories + for (U64 i = 1; i < dir_ht->count; i += 1) { + String8 dir = dirs_kv[i].key_string; + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, (DW_WriterXForm) { .reader = { .kind = DW_Form_String, .string = dir } }); + } + + scratch_end(scratch); + } + + String8List file_table_srl = {0}; + { + Temp scratch = scratch_begin(0, 0); + String8List *srl = &file_table_srl; + + struct { DW_LNCT lnct; DW_FormKind form_kind; } encs[] = { + { DW_LNCT_Path, DW_Form_String }, + { DW_LNCT_DirectoryIndex, DW_Form_UData }, + { DW_LNCT_TimeStamp, DW_Form_Null }, // DW_Form_UData + { DW_LNCT_Size, DW_Form_Null }, // DW_Form_UData + { DW_LNCT_MD5, DW_Form_Null }, // DW_Form_Block + { DW_LNCT_LLVM_Source, DW_Form_Null } // DW_Form_String + }; + + HashTable *encs_ht = hash_table_init(scratch.arena, ArrayCount(encs) * 2); + for EachElement(i, encs) { hash_table_push_u64_raw(scratch.arena, encs_ht, encs[i].lnct, &encs[i].form_kind); } + + // enable encodings in use + for EachNode(file, DW_WriterFile, writer->line.first_file) { + if (file->time_stamp != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_TimeStamp ) = DW_Form_UData; } + if (file->size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Size ) = DW_Form_UData; } + if (file->md5.size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_MD5 ) = DW_Form_Block; } + if (file->source.size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_LLVM_Source) = DW_Form_String; } + } + + // count needed encodings + U64 enc_count = 0; + for EachElement(i, encs) { if (encs[i].form_kind != DW_Form_Null) { enc_count += 1; } } + + // (17) file_name_entry_format_count + str8_serial_push_u16(writer->arena, srl, enc_count); + + // (18) file_name_entry_format + for EachElement(i, encs) { + if (encs[i].form_kind == DW_Form_Null) { continue; } + dw_serial_push_uleb128(writer->arena, srl, encs[i].lnct ); + dw_serial_push_uleb128(writer->arena, srl, encs[i].form_kind); + } + + // (19) file_names_count + dw_serial_push_uleb128(writer->arena, srl, writer->line.file_count); + + // (20) file_names + if (comp_name.size) { + for (DW_WriterFile *n = writer->line.first_file, *p = 0; n != 0; p = n, n = n->next) { + String8 file_name = str8_skip_last_slash(n->path); + if (str8_match(file_name, comp_name, 0)) { + if (p == 0) { + // file is already first + } else { + // move compile unit file to be first entry in the table + p->next = n->next; + n->next = writer->line.first_file; + writer->line.first_file = n; + } + break; + } + } + } + for EachNode(file, DW_WriterFile, writer->line.first_file) { + static DW_WriterXForm null_form_udata = { .reader = { .kind = DW_Form_UData } }; + static DW_WriterXForm null_form_string = { .reader = { .kind = DW_Form_String } }; + static DW_WriterXForm null_form_block = { .reader = { .kind = DW_Form_Block } }; + + // path + Assert(*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Path) == DW_Form_String); + DW_WriterXForm path_form = { .reader = { .kind = DW_Form_String, .string = file->path } }; + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, path_form); + + // directory index + Assert(*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_DirectoryIndex) == DW_Form_UData); + DW_WriterXForm dir_idx_form = { .reader = { .kind = DW_Form_UData, .udata = file->time_stamp } }; + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, dir_idx_form); + + // time stamp + if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_TimeStamp) == DW_Form_UData) { + if (file->time_stamp) { + DW_WriterXForm time_stamp_form = { .reader = { .kind = DW_Form_UData, .udata = file->time_stamp } }; + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, time_stamp_form); + } else { + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, null_form_udata); + } + } + + // size + if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Size) == DW_Form_UData) { + if (file->size) { + DW_WriterXForm size_form = { .reader = { .kind = DW_Form_UData, .udata = file->size } }; + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, size_form); + } else { + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, null_form_udata); + } + } + + // MD5 + if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_MD5) == DW_Form_Block) { + if (file->md5.size) { + DW_WriterXForm md5_form = { .reader = { .kind = DW_Form_Block, .block = file->md5 } }; + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, md5_form); + } else { + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, null_form_block); + } + } + + // LLVM Source + if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_LLVM_Source) == DW_Form_String) { + if (file->source.size) { + DW_WriterXForm source_form = { .reader = { .kind = DW_Form_String, .string = file->source } }; + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, source_form); + } else { + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, null_form_string); + } + } + } + + scratch_end(scratch); + } + + { + String8List *srl = &writer->sections[DW_Section_Line].srl; + // (1) unit_length + writer->sections[DW_Section_Line].length = dw_serial_push_length(writer->arena, srl, writer->format, 0); + // (2) version + str8_serial_push_struct(writer->arena, srl, &writer->version); + // (3) address_size + str8_serial_push_struct(writer->arena, srl, &writer->address_size); + // (4) segment_selector_size + str8_serial_push_struct(writer->arena, srl, &writer->segsel_size); + // (5) header_length + U64 header_size = srl->total_size + dir_table_srl.total_size + file_table_srl.total_size; + dw_serial_push_uint(writer->arena, srl, writer->format, header_size); + // (6) minimum_instruction_length + str8_serial_push_struct(writer->arena, srl, &writer->line.min_inst_len); + // (7) maximum_operations_per_instruction + str8_serial_push_struct(writer->arena, srl, &writer->line.max_ops_per_inst); + // (8) default_is_stmt + str8_serial_push_struct(writer->arena, srl, &writer->line.default_is_stmt); + // (9) line_base + str8_serial_push_struct(writer->arena, srl, &writer->line.line_base); + // (10) line_range + str8_serial_push_struct(writer->arena, srl, &writer->line.line_range); + // (11) opcode_base + str8_serial_push_struct(writer->arena, srl, &writer->line.opcode_base); + // (12) standard_opcode_lengths + str8_serial_push_struct(writer->arena, srl, &writer->line.std_op_lens); + // directory table + str8_list_concat_in_place(srl, &dir_table_srl); + // file table + str8_list_concat_in_place(srl, &file_table_srl); + // line program + String8 line_program_data = dw_data_from_line_insts(writer->arena, writer->address_size, writer->line.line_insts); + str8_serial_push_string(writer->arena, srl, line_program_data); + } } - // fixup forward references in .debug_info - for EachNode(fixup_n, DW_WriterFixupNode, writer->fixups.first) { - DW_WriterFixup *fixup = &fixup_n->v; - if (fixup->attrib->reader.form.kind == DW_Form_Ref8) { - Assert(fixup->attrib->writer.form.ref->info_off != 0); - MemoryCopy(fixup->value, &fixup->attrib->writer.form.ref->info_off, sizeof(U64)); - fixup->attrib->reader.form.ref = fixup->attrib->writer.form.ref->info_off; + // info + { + dw_writer_emit_tag(writer, writer->root); + + // null terminate .debug_abbrev + dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Abbrev].srl, 0); + + // fixup units lengths + for EachElement(i, writer->sections) { + if (writer->sections[i].length) { + if (writer->format == DW_Format_64Bit) { + U64 *length = writer->sections[i].length; + U64 length_size = sizeof(U64) + sizeof(U32); + Assert(writer->sections[i].srl.total_size >= length_size); + *length = writer->sections[i].srl.total_size - length_size; + } else { + U32 *length = writer->sections[i].length; + U32 length_size = sizeof(U32); + Assert(writer->sections[i].srl.total_size >= length_size); + *length = safe_cast_u32(writer->sections[i].srl.total_size - length_size); + } + } + } + + // fixup forward references in .debug_info + for EachNode(fixup_n, DW_WriterFixupNode, writer->fixups.first) { + DW_WriterFixup *fixup = &fixup_n->v; + Assert(fixup->tag->info_off != 0); + MemoryCopy(fixup->ptr, &fixup->tag->info_off, sizeof(U64)); } } } diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index 821c98fd..95b2f913 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -65,15 +65,16 @@ typedef struct DW_WriterForm }; } DW_WriterForm; +typedef struct DW_WriterXForm +{ + DW_WriterForm writer; + DW_Form reader; +} DW_WriterXForm; + typedef struct DW_WriterAttrib { DW_AttribKindEnum kind; - struct { - DW_WriterForm form; - } writer; - struct { - DW_Form form; - } reader; + DW_WriterXForm form; struct DW_WriterAttrib *next; } DW_WriterAttrib; @@ -123,10 +124,58 @@ typedef struct DW_WriterAttribChunkList DW_WriterAttribChunk *last; } DW_WriterAttribChunkList; +typedef struct DW_WriterLine +{ + struct DW_WriterLine *next; +} DW_WriterLine; + +typedef struct DW_WriterFile +{ + struct DW_WriterFile *next; + String8 path; + U64 time_stamp; + U64 size; + String8 md5; + String8 source; + U64 file_idx; + U64 dir_idx; +} DW_WriterFile; + +typedef struct DW_LineInst +{ + DW_StdOpcode opcode; + union { + U64 advance_pc; + S64 advance_line; + DW_WriterFile *set_file; + U64 set_column; + U16 fixed_advance_pc; + U64 set_isa; + struct { + DW_ExtOpcode ext; + U64 set_address; + U64 set_discriminator; + }; + }; +} DW_LineInst; + +typedef struct DW_LineInstNode +{ + DW_LineInst v; + struct DW_LineInstNode *next; +} DW_LineInstNode; + +typedef struct DW_LineInstList +{ + U64 count; + DW_LineInstNode *first; + DW_LineInstNode *last; +} DW_LineInstList; + typedef struct DW_WriterFixup { - struct DW_WriterAttrib *attrib; - U8 *value; + DW_WriterTag *tag; + U8 *ptr; } DW_WriterFixup; typedef struct DW_WriterFixupNode @@ -151,38 +200,67 @@ typedef struct DW_WriterSection typedef struct DW_Writer { Arena *arena; + + // Compile Unit + Arch arch; + DW_Version version; + DW_Format format; + DW_CompUnitKind cu_kind; + U8 address_size; + U8 segsel_size; + + // Abbrev + U64 abbrev_base_info_off; + HashTable *abbrev_id_map; + + // Info DW_WriterTag *root; DW_WriterTag *current; - Arch arch; - DW_Format format; - DW_Version version; - DW_CompUnitKind cu_kind; - U64 address_size; - U64 abbrev_base_info_off; + + // Line + struct { + U8 min_inst_len; + U8 max_ops_per_inst; + U8 default_is_stmt; + S8 line_base; + U8 line_range; + U8 opcode_base; + U8 *std_op_lens; + DW_LineInstList line_insts; + + DW_WriterFile *file; + U64 ln; + U64 col; + U64 addr; + + U64 file_count; + DW_WriterFile *first_file; + DW_WriterFile *last_file; + } line; + + // Emit DW_WriterFixupList fixups; - HashTable *abbrev_id_map; DW_WriterSection sections[DW_Section_Count]; DW_WriterAttribChunkList attrib_chunk_list; DW_WriterTagChunkList tag_chunk_list; } DW_Writer; //////////////////////////////// - -internal DW_IntEnc dw_int_enc_from_sint(S64 v); -internal DW_IntEnc dw_int_enc_from_uint(U64 v); - -internal U64 dw_size_from_sint(S64 v); -internal U64 dw_size_from_uint(U64 v); - -internal void dw_serial_push_form(Arena *arena, String8List *srl, DW_Format format, DW_Version version, U8 address_size, DW_FormKind form_kind, DW_Form form); - -//////////////////////////////// +// Writer internal DW_Writer * dw_writer_begin(DW_Format format, DW_Version version, DW_CompUnitKind cu_kind, Arch arch); -internal void dw_writer_end(DW_Writer **writer_ptr); +internal void dw_writer_end (DW_Writer **writer_ptr); + +//////////////////////////////// +// Form + +internal U64 dw_serial_push_form(Arena *arena, String8List *srl, DW_Version version, DW_Format format, U8 address_size, DW_WriterFixupList *fixups, DW_WriterXForm form); + +//////////////////////////////// +// Info internal DW_WriterTag * dw_writer_tag_begin(DW_Writer *writer, DW_TagKind kind); -internal void dw_writer_tag_end(DW_Writer *writer); +internal void dw_writer_tag_end (DW_Writer *writer); internal DW_WriterAttrib * dw_writer_push_attrib (DW_Writer *writer, DW_AttribKind kind, DW_WriterForm form ); internal DW_WriterAttrib * dw_writer_push_attrib_address (DW_Writer *writer, DW_AttribKind kind, U64 address ); @@ -201,13 +279,56 @@ internal DW_WriterAttrib * dw_writer_push_attrib_line_ptr (DW_Writer *writer, internal DW_WriterAttrib * dw_writer_push_attrib_mac_ptr (DW_Writer *writer, DW_AttribKind kind, void * mac_ptr ); internal DW_WriterAttrib * dw_writer_push_attrib_rng_list_ptr(DW_Writer *writer, DW_AttribKind kind, void * rng_list_ptr); internal DW_WriterAttrib * dw_writer_push_attrib_implicit (DW_Writer *writer, DW_AttribKind kind, S64 implicit ); - #define dw_writer_push_attrib_expressionv(w, k, ...) dw_writer_push_attrib_expression(w, k, (DW_ExprEnc[]){ __VA_ARGS__ }, ArrayCount(((DW_ExprEnc[]){ __VA_ARGS__ })) ) +//////////////////////////////// +// Line + +internal void dw_line_inst_list_push_node(DW_LineInstList *list, DW_LineInstNode *node); +internal DW_LineInstNode * dw_line_inst_list_push (Arena *arena, DW_LineInstList *list, DW_LineInst op); + +// std opcodes +#define DW_LNS_copy() (DW_LineInst){ .opcode = DW_StdOpcode_Copy } +#define DW_LNS_advance_pc(d) (DW_LineInst){ .opcode = DW_StdOpcode_AdvancePc, .advance_pc = d } +#define DW_LNS_advance_line(s) (DW_LineInst){ .opcode = DW_StdOpcode_AdvanceLine, .advance_line = s } +#define DW_LNS_set_file(f) (DW_LineInst){ .opcode = DW_StdOpcode_SetFile, .set_file = f } +#define DW_LNS_set_column(c) (DW_LineInst){ .opcode = DW_StdOpcode_SetColumn, .set_column = c } +#define DW_LNS_negate_stmt() (DW_LineInst){ .opcode = DW_StdOpcode_NegateStmt } +#define DW_LNS_set_basic_block() (DW_LineInst){ .opcode = DW_StdOpcode_SetBasicBlock } +#define DW_LNS_const_add_pc(a) (DW_LineInst){ .opcode = DW_StdOpcode_ConstAddPc } +#define DW_LNS_fixed_advance_pc(a) (DW_LineInst){ .opcode = DW_StdOpcode_FixedAdvancePc, .fixed_advance_pc = a } +#define DW_LNS_set_prologue_end() (DW_LineInst){ .opcode = DW_StdOpcode_SetPrologueEnd } +#define DW_LNS_set_epilogue_begin() (DW_LineInst){ .opcode = DW_StdOpcode_SetEpilogueBegin } +#define DW_LNS_set_isa(i) (DW_LineInst){ .opcode = DW_StdOpcode_SetIsa, .set_isa = i } + +// ext opcodes +#define DW_LNE_end_sequence() (DW_LineInst){ .opcode = DW_StdOpcode_ExtendedOpcode, .ext = DW_ExtOpcode_EndSequence } +#define DW_LNE_set_address(a) (DW_LineInst){ .opcode = DW_StdOpcode_ExtendedOpcode, .ext = DW_ExtOpcode_SetAddress, .set_address = a } +#define DW_LNE_set_discriminator(d) (DW_LineInst){ .opcode = DW_StdOpcode_ExtendedOpcode, .ext = DW_ExtOpcode_SetDiscriminator, .set_discriminator = d } + +internal void dw_writer_line_emit (DW_Writer *writer, DW_WriterFile *file, U64 ln, U64 col, U64 addr); +internal void dw_writer_line_set_address (DW_Writer *writer, U64 address); +internal void dw_writer_line_set_prologue_end(DW_Writer *writer); +internal void dw_writer_line_epilogue_begin (DW_Writer *writer); +internal void dw_writer_line_set_isa (DW_Writer *writer, U64 isa); +internal DW_WriterFile * dw_writer_new_file (DW_Writer *writer, String8 path); + +//////////////////////////////// +// Emit + internal void dw_writer_emit(DW_Writer *writer); #ifdef OBJ_H internal void dw_writer_emit_to_obj(DW_Writer *writer, OBJ *obj); #endif +//////////////////////////////// +// Format Helpers + +internal DW_IntEnc dw_int_enc_from_sint(S64 v); +internal DW_IntEnc dw_int_enc_from_uint(U64 v); + +internal U64 dw_size_from_sint(S64 v); +internal U64 dw_size_from_uint(U64 v); + #endif // DWARF_WRITER_H diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index 25cc5c9f..7cdbbcb7 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -519,3 +519,12 @@ remove_duplicates_str8_list(Arena *arena, String8List list) return result; } +internal String8 ** +str8_from_key_value_pairs(Arena *arena, KeyValuePair *v, U64 count) +{ + String8 **result = push_array(arena, String8 *, count); + for EachIndex(i, count) { + result[i] = &v[i].value_string; + } + return result; +} diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 80f0ea30..326c0b1b 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -94,14 +94,16 @@ internal U32 * keys_from_hash_table_u32 (Arena *arena, HashTable internal U64 * keys_from_hash_table_u64 (Arena *arena, HashTable *ht); internal String8 keys_from_hash_table_str8 (Arena *arena, HashTable *ht); internal KeyValuePair * key_value_pairs_from_hash_table(Arena *arena, HashTable *ht); +internal void * keys_from_hash_table_raw (Arena *arena, HashTable *ht); -internal void * keys_from_hash_table_raw (Arena *arena, HashTable *ht); -internal void * values_from_hash_table_raw(Arena *arena, HashTable *ht); +internal U64 * values_from_hash_table_u64(Arena *arena, HashTable *ht); internal void sort_key_value_pairs_as_u32 (KeyValuePair *pairs, U64 count); internal void sort_key_value_pairs_as_u64 (KeyValuePair *pairs, U64 count); internal void sort_key_value_pairs_as_string_sensitive(KeyValuePair *pairs, U64 count); +internal String8 ** str8_from_key_value_pairs(Arena *arena, KeyValuePair *v, U64 count); + // --- Misc -------------------------------------------------------------------- internal U64Array remove_duplicates_u64_array(Arena *arena, U64Array arr); diff --git a/src/natvis/base.natvis b/src/natvis/base.natvis index 59a43987..4db4ce56 100644 --- a/src/natvis/base.natvis +++ b/src/natvis/base.natvis @@ -154,6 +154,7 @@ + {{ count={count} first={first} }} count diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 567364e4..095b76b9 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -82,8 +82,8 @@ dwt_tags_must_match(DW_WriterTag *writer_tag, DW_TagNode *reader_tag) DW_AttribNode *reader_attrib = reader_tag->tag.attribs.first; while (writer_attrib) { if (writer_attrib->kind != reader_attrib->v.attrib_kind) { goto exit; } - if (writer_attrib->reader.form.kind != reader_attrib->v.form.kind) { goto exit; } - if ( ! dw_form_match(writer_attrib->reader.form, reader_attrib->v.form)) { goto exit; } + if (writer_attrib->form.reader.kind != reader_attrib->v.form.kind) { goto exit; } + if ( ! dw_form_match(writer_attrib->form.reader, reader_attrib->v.form)) { goto exit; } writer_attrib = writer_attrib->next; reader_attrib = reader_attrib->next; } @@ -107,11 +107,23 @@ dwt_make_writer(void) { Temp scratch = scratch_begin(0, 0); - // define debug info layout DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_Last, DW_CompUnitKind_Compile, Arch_x64); + // line + { + DW_WriterFile *b_file = dw_writer_new_file(writer, str8_lit("~/devel/projects/b/b.c")); + DW_WriterFile *a_file = dw_writer_new_file(writer, str8_lit("~/devel/projects/a.c")); + dw_writer_line_set_prologue_end(writer); + dw_writer_line_emit(writer, b_file, 10, 0, 0x140001000); + dw_writer_line_emit(writer, b_file, 11, 0, 0x140001010); + dw_writer_line_emit(writer, a_file, 1, 0, 0x140001016); + dw_writer_line_emit(writer, a_file, 2, 0, 0x140001020); + } + // info { dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, str8_lit("~/devel/projects")); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("a.c")); dw_writer_push_attrib_enum(writer, DW_AttribKind_Language, DW_Language_C99); dw_writer_push_attrib_flag(writer, DW_AttribKind_UseUtf8, 1); { @@ -223,19 +235,19 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *producer_attrib = comp_unit_tag->first_attrib; T_Ok(producer_attrib->kind == DW_AttribKind_Producer); - T_Ok(producer_attrib->reader.form.kind == DW_Form_String); - T_Ok(str8_match(producer_attrib->writer.form.string, str8_lit("RAD DWARF WRITER"), 0)); + T_Ok(producer_attrib->form.reader.kind == DW_Form_String); + T_Ok(str8_match(producer_attrib->form.writer.string, str8_lit("RAD DWARF WRITER"), 0)); DW_WriterAttrib *language_attrib = producer_attrib->next; T_Ok(language_attrib->kind == DW_AttribKind_Language); - T_Ok(language_attrib->reader.form.kind == DW_Form_Data1); - T_Ok(language_attrib->reader.form.data.size == 1); - T_Ok(*(U8 *)language_attrib->reader.form.data.str == DW_Language_C99); + T_Ok(language_attrib->form.reader.kind == DW_Form_Data1); + T_Ok(language_attrib->form.reader.data.size == 1); + T_Ok(*(U8 *)language_attrib->form.reader.data.str == DW_Language_C99); DW_WriterAttrib *use_utf8_attrib = language_attrib->next; T_Ok(use_utf8_attrib->kind == DW_AttribKind_UseUtf8); - T_Ok(use_utf8_attrib->reader.form.kind == DW_Form_Flag); - T_Ok(use_utf8_attrib->reader.form.flag == 1); + T_Ok(use_utf8_attrib->form.reader.kind == DW_Form_Flag); + T_Ok(use_utf8_attrib->form.reader.flag == 1); } DW_WriterTag *char_type_tag = comp_unit_tag->first_child; @@ -250,20 +262,20 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *byte_size_attrib = char_type_tag->first_attrib; T_Ok(byte_size_attrib->kind == DW_AttribKind_ByteSize); - T_Ok(byte_size_attrib->reader.form.kind == DW_Form_Data1); - T_Ok(byte_size_attrib->reader.form.data.size == 1); - T_Ok(*(U8 *)byte_size_attrib->reader.form.data.str == 1); + T_Ok(byte_size_attrib->form.reader.kind == DW_Form_Data1); + T_Ok(byte_size_attrib->form.reader.data.size == 1); + T_Ok(*(U8 *)byte_size_attrib->form.reader.data.str == 1); DW_WriterAttrib *encoding_attrib = byte_size_attrib->next; T_Ok(encoding_attrib->kind == DW_AttribKind_Encoding); - T_Ok(encoding_attrib->reader.form.kind == DW_Form_Data1); - T_Ok(encoding_attrib->reader.form.data.size == 1); - T_Ok(*(U8 *)encoding_attrib->reader.form.data.str == DW_ATE_SignedChar); + T_Ok(encoding_attrib->form.reader.kind == DW_Form_Data1); + T_Ok(encoding_attrib->form.reader.data.size == 1); + T_Ok(*(U8 *)encoding_attrib->form.reader.data.str == DW_ATE_SignedChar); DW_WriterAttrib *name_attrib = encoding_attrib->next; T_Ok(name_attrib->kind == DW_AttribKind_Name); - T_Ok(name_attrib->reader.form.kind == DW_Form_String); - T_Ok(str8_match(name_attrib->reader.form.string, str8_lit("char"), 0)); + T_Ok(name_attrib->form.reader.kind == DW_Form_String); + T_Ok(str8_match(name_attrib->form.reader.string, str8_lit("char"), 0)); } DW_WriterTag *const_type_tag = char_type_tag->next; @@ -278,8 +290,8 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *type_attrib = const_type_tag->first_attrib; T_Ok(type_attrib->kind == DW_AttribKind_Type); - T_Ok(type_attrib->writer.form.kind == DW_WriterFormKind_Ref); - T_Ok(type_attrib->writer.form.ref == char_type_tag); + T_Ok(type_attrib->form.writer.kind == DW_WriterFormKind_Ref); + T_Ok(type_attrib->form.writer.ref == char_type_tag); } DW_WriterTag *dup_char_type_tag = const_type_tag->next; @@ -294,20 +306,20 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *byte_size_attrib = dup_char_type_tag->first_attrib; T_Ok(byte_size_attrib->kind == DW_AttribKind_ByteSize); - T_Ok(byte_size_attrib->reader.form.kind == DW_Form_Data1); - T_Ok(byte_size_attrib->reader.form.data.size == 1); - T_Ok(*(U8 *)byte_size_attrib->reader.form.data.str == 1); + T_Ok(byte_size_attrib->form.reader.kind == DW_Form_Data1); + T_Ok(byte_size_attrib->form.reader.data.size == 1); + T_Ok(*(U8 *)byte_size_attrib->form.reader.data.str == 1); DW_WriterAttrib *encoding_attrib = byte_size_attrib->next; T_Ok(encoding_attrib->kind == DW_AttribKind_Encoding); - T_Ok(encoding_attrib->reader.form.kind == DW_Form_Data1); - T_Ok(encoding_attrib->reader.form.data.size == 1); - T_Ok(*(U8 *)encoding_attrib->reader.form.data.str == DW_ATE_SignedChar); + T_Ok(encoding_attrib->form.reader.kind == DW_Form_Data1); + T_Ok(encoding_attrib->form.reader.data.size == 1); + T_Ok(*(U8 *)encoding_attrib->form.reader.data.str == DW_ATE_SignedChar); DW_WriterAttrib *name_attrib = encoding_attrib->next; T_Ok(name_attrib->kind == DW_AttribKind_Name); - T_Ok(name_attrib->reader.form.kind == DW_Form_String); - T_Ok(str8_match(name_attrib->reader.form.string, str8_lit("char"), 0)); + T_Ok(name_attrib->form.reader.kind == DW_Form_String); + T_Ok(str8_match(name_attrib->form.reader.string, str8_lit("char"), 0)); } DW_WriterTag *simple_struct_tag = dup_char_type_tag->next; @@ -321,8 +333,8 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *simple_struct_name = simple_struct_tag->first_attrib; T_Ok(simple_struct_name->kind == DW_AttribKind_Name); - T_Ok(simple_struct_name->reader.form.kind == DW_Form_String); - T_Ok(str8_match(simple_struct_name->reader.form.string, str8_lit("FooBar"), 0)); + T_Ok(simple_struct_name->form.reader.kind == DW_Form_String); + T_Ok(str8_match(simple_struct_name->form.reader.string, str8_lit("FooBar"), 0)); DW_WriterTag *m0_tag = simple_struct_tag->first_child; { @@ -334,19 +346,19 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *name = m0_tag->first_attrib; T_Ok(name->kind == DW_AttribKind_Name); - T_Ok(name->reader.form.kind == DW_Form_String); - T_Ok(str8_match(name->reader.form.string, str8_lit("m0"), 0)); + T_Ok(name->form.reader.kind == DW_Form_String); + T_Ok(str8_match(name->form.reader.string, str8_lit("m0"), 0)); DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); - T_Ok(type->reader.form.kind == DW_Form_Ref1); - T_Ok(type->reader.form.ref == 0x20); + T_Ok(type->form.reader.kind == DW_Form_Ref1); + T_Ok(type->form.reader.ref == 0x20); DW_WriterAttrib *data_loc = type->next; T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); - T_Ok(data_loc->reader.form.kind == DW_Form_Data1); - T_Ok(data_loc->reader.form.data.size == 1); - T_Ok(*(U8 *)data_loc->reader.form.data.str == 0); + T_Ok(data_loc->form.reader.kind == DW_Form_Data1); + T_Ok(data_loc->form.reader.data.size == 1); + T_Ok(*(U8 *)data_loc->form.reader.data.str == 0); } DW_WriterTag *m1_tag = m0_tag->next; @@ -359,24 +371,24 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *name = m1_tag->first_attrib; T_Ok(name->kind == DW_AttribKind_Name); - T_Ok(name->reader.form.kind == DW_Form_String); - T_Ok(str8_match(name->reader.form.string, str8_lit("m1"), 0)); + T_Ok(name->form.reader.kind == DW_Form_String); + T_Ok(str8_match(name->form.reader.string, str8_lit("m1"), 0)); DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); - T_Ok(type->reader.form.kind == DW_Form_Ref1); - T_Ok(type->reader.form.ref == 0x20); + T_Ok(type->form.reader.kind == DW_Form_Ref1); + T_Ok(type->form.reader.ref == 0x20); DW_WriterAttrib *data_loc = type->next; T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); - T_Ok(data_loc->reader.form.kind == DW_Form_Data1); - T_Ok(data_loc->reader.form.data.size == 1); - T_Ok(*(U8 *)data_loc->reader.form.data.str == 10); + T_Ok(data_loc->form.reader.kind == DW_Form_Data1); + T_Ok(data_loc->form.reader.data.size == 1); + T_Ok(*(U8 *)data_loc->form.reader.data.str == 10); DW_WriterAttrib *byte_size = data_loc->next; T_Ok(byte_size->kind == DW_AttribKind_ByteSize); - T_Ok(byte_size->reader.form.kind == DW_Form_ImplicitConst); - T_Ok(byte_size->reader.form.implicit_const == 123); + T_Ok(byte_size->form.reader.kind == DW_Form_ImplicitConst); + T_Ok(byte_size->form.reader.implicit_const == 123); } } @@ -388,40 +400,40 @@ T_BeginTest(dwarf_writer) { DW_WriterAttrib *external = main_tag->first_attrib; T_Ok(external->kind == DW_AttribKind_External); - T_Ok(external->reader.form.kind == DW_Form_Flag); - T_Ok(external->reader.form.flag); + T_Ok(external->form.reader.kind == DW_Form_Flag); + T_Ok(external->form.reader.flag); DW_WriterAttrib *prototyped = external->next; T_Ok(prototyped->kind == DW_AttribKind_Prototyped); - T_Ok(prototyped->reader.form.kind == DW_Form_Flag); - T_Ok(prototyped->reader.form.flag); + T_Ok(prototyped->form.reader.kind == DW_Form_Flag); + T_Ok(prototyped->form.reader.flag); DW_WriterAttrib *low_pc = prototyped->next; T_Ok(low_pc->kind == DW_AttribKind_LowPc); - T_Ok(low_pc->reader.form.kind == DW_Form_Addr); - T_Ok(low_pc->reader.form.addr.size == sizeof(U64)); - T_Ok(*(U64 *)low_pc->reader.form.addr.str == 0x14012f2f0); + T_Ok(low_pc->form.reader.kind == DW_Form_Addr); + T_Ok(low_pc->form.reader.addr.size == sizeof(U64)); + T_Ok(*(U64 *)low_pc->form.reader.addr.str == 0x14012f2f0); DW_WriterAttrib *high_pc = low_pc->next; T_Ok(high_pc->kind == DW_AttribKind_HighPc); - T_Ok(high_pc->reader.form.kind == DW_Form_Addr); - T_Ok(high_pc->reader.form.addr.size == sizeof(U64)); - T_Ok(*(U64 *)high_pc->reader.form.addr.str == 0x14012f405); + T_Ok(high_pc->form.reader.kind == DW_Form_Addr); + T_Ok(high_pc->form.reader.addr.size == sizeof(U64)); + T_Ok(*(U64 *)high_pc->form.reader.addr.str == 0x14012f405); DW_WriterAttrib *name = high_pc->next; T_Ok(name->kind == DW_AttribKind_Name); - T_Ok(name->reader.form.kind == DW_Form_String); - T_Ok(str8_match(name->reader.form.string, str8_lit("main"), 0)); + T_Ok(name->form.reader.kind == DW_Form_String); + T_Ok(str8_match(name->form.reader.string, str8_lit("main"), 0)); DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); - T_Ok(type->reader.form.kind == DW_Form_Ref1); - T_Ok(type->reader.form.ref == simple_struct_tag->info_off); + T_Ok(type->form.reader.kind == DW_Form_Ref1); + T_Ok(type->form.reader.ref == simple_struct_tag->info_off); DW_WriterAttrib *frame_base = type->next; T_Ok(frame_base->kind == DW_AttribKind_FrameBase); - T_Ok(frame_base->reader.form.kind == DW_Form_ExprLoc); - DW_Expr frame_base_expr = dw_expr_from_data(scratch.arena, writer->format, writer->address_size, frame_base->reader.form.exprloc); + T_Ok(frame_base->form.reader.kind == DW_Form_ExprLoc); + DW_Expr frame_base_expr = dw_expr_from_data(scratch.arena, writer->format, writer->address_size, frame_base->form.reader.exprloc); T_Ok(frame_base_expr.count == 1); T_Ok(frame_base_expr.first->opcode == DW_ExprOp_Reg7); T_Ok(frame_base_expr.first->operands == 0); From 6ece754edd7164d6629d0ea1aadc83a60ace5cb9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 20 Feb 2026 18:05:54 -0800 Subject: [PATCH 230/850] max ops and max size for x64 inst --- src/base/base_core.c | 32 ++++++++++++++++++++++++++++++++ src/base/base_core.h | 2 ++ 2 files changed, 34 insertions(+) diff --git a/src/base/base_core.c b/src/base/base_core.c index 4dbcffcd..372fd6f3 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -459,6 +459,38 @@ byte_size_from_arch(Arch arch) return bit_size_from_arch(arch) / 8; } +internal U64 +max_ops_per_instruction_from_arch(Arch arch) +{ + U64 max_ops = 0; + switch (arch) + { + case Arch_Null: break; + case Arch_x64: max_ops = 1; break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: NotImplemented; break; + default: InvalidPath; + } + return max_ops; +} + +internal U64 +min_instruction_size_from_arch(Arch arch) +{ + U64 min_instruction_size = 0; + switch(arch) + { + case Arch_Null: break; + case Arch_x64: min_instruction_size = 1; break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: NotImplemented; break; + default: InvalidPath; + } + return min_instruction_size; +} + internal U64 max_instruction_size_from_arch(Arch arch) { diff --git a/src/base/base_core.h b/src/base/base_core.h index 2c43fcb7..cace62da 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -1035,6 +1035,8 @@ internal B32 txt_rng_contains(TxtRng r, TxtPt pt); internal U64 bit_size_from_arch(Arch arch); internal U64 byte_size_from_arch(Arch arch); +internal U64 max_ops_per_instruction_from_arch(Arch arch); +internal U64 min_instruction_size_from_arch(Arch arch); internal U64 max_instruction_size_from_arch(Arch arch); //////////////////////////////// From 3637fe359ac738754cb9ece74fd4c19d2485ddf2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 20 Feb 2026 18:06:31 -0800 Subject: [PATCH 231/850] do not create async workers for torture --- src/torture/torture_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 6521832d..b817b229 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -6,6 +6,7 @@ #define BUILD_CONSOLE_INTERFACE 1 #define BUILD_TITLE "TORTURE" +#define NO_ASYNC 1 //////////////////////////////// From fda380c66bd9792837bd9f3af571d63308f6426c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 20 Feb 2026 18:07:06 -0800 Subject: [PATCH 232/850] flush on end sequence opcode and correctly debase addresses --- src/rdi_from_dwarf/rdi_from_dwarf.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index e5020690..c548091b 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2887,7 +2887,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) if (vm->state.file_index >= vm->header.file_table.count) { continue; } // time to flush the buffer? - if ((line_buffer_size >= D2R_LineBufferMax || line_buffer->file_index != vm->state.file_index) && line_buffer_size > 0) { + if (((vm->opcode == DW_StdOpcode_ExtendedOpcode && vm->ext_opcode == DW_ExtOpcode_EndSequence) || + (line_buffer_size >= D2R_LineBufferMax || line_buffer->file_index != vm->state.file_index)) + && line_buffer_size > 0) { // lookup source file DW_LineFile *file = &vm->header.file_table.v[vm->state.file_index]; U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); @@ -2897,7 +2899,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // copy line info U64 *voffs = push_array_no_zero(arena, U64, line_buffer_size + 1); U32 *line_nums = push_array_no_zero(arena, U32, line_buffer_size); - voffs[line_buffer_size] = vm->state.address; + voffs[line_buffer_size] = vm->state.address - image_base; MemoryCopyTyped(voffs, line_buffer->voffs, line_buffer_size); MemoryCopyTyped(line_nums, line_buffer->line_nums, line_buffer_size); @@ -2936,7 +2938,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } else { // append line to the buffer line_buffer->file_index = vm->state.file_index; - line_buffer->voffs[line_buffer_size] = vm->state.address; + line_buffer->voffs[line_buffer_size] = vm->state.address - image_base; line_buffer->line_nums[line_buffer_size] = safe_cast_u32(vm->state.line); line_buffer_size += 1; } From 121c211d812e34799c5f255d78d33d45cb738c46 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 20 Feb 2026 18:07:47 -0800 Subject: [PATCH 233/850] minor changes in DWARF dumper --- src/dwarf/dwarf_dump.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 1a378789..de095b6a 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -5,7 +5,7 @@ #define dw_unindent() do { indent -= 1; } while (0) #define dw_print(string) dw_print_ (arena, strings, indent, string) #define dw_printf(...) dw_printf_(arena, strings, indent, __VA_ARGS__) -static char g_spaces[] = " "; +static char g_spaces[] = " "; internal void dw_print_(Arena *arena, String8List *out, int indent, String8 string) @@ -849,12 +849,14 @@ dw_print_tag(Arena *arena, String8List *strings, int indent, Arch arch, DW_Input for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) { Temp attrib_temp = temp_begin(scratch.arena); - attrib_name_max_size = Max(attrib_name_max_size, dw_string_from_attrib_kind(attrib_temp.arena, cu->version, cu->ext, attrib_n->v.attrib_kind).size); - form_kind_max_size = Max(form_kind_max_size, dw_string_from_form_kind(attrib_temp.arena, cu->version, attrib_n->v.form.kind).size); + attrib_name_max_size = Max(attrib_name_max_size, dw_string_from_attrib_kind (attrib_temp.arena, cu->version, cu->ext, attrib_n->v.attrib_kind).size); + form_kind_max_size = Max(form_kind_max_size, dw_string_from_form_kind (attrib_temp.arena, cu->version, attrib_n->v.form.kind).size); value_max_size = Max(value_max_size, dw_string_from_attrib_value(attrib_temp.arena, input, arch, cu, line_vm, &attrib_n->v).size); temp_end(attrib_temp); } - value_max_size = Min(120, value_max_size); + attrib_name_max_size = Min(40, attrib_name_max_size); + form_kind_max_size = Min(20, form_kind_max_size); + value_max_size = Min(80, value_max_size); dw_printf("tag: // info_off: 0x%I64x abbrev_id: %I64u\n", tag->info_off, tag->abbrev_id); dw_printf("{\n"); @@ -868,9 +870,9 @@ dw_print_tag(Arena *arena, String8List *strings, int indent, Arch arch, DW_Input String8 value_str = dw_string_from_attrib_value(scratch.arena, input, arch, cu, line_vm, attrib); String8List fmt = {0}; - str8_list_pushf(scratch.arena, &fmt, "%S%.*s", attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, g_spaces); - str8_list_pushf(scratch.arena, &fmt, "%S%.*s", form_kind_str, form_kind_max_size - form_kind_str.size, g_spaces); - str8_list_pushf(scratch.arena, &fmt, "%S%.*s", value_str, value_str.size < value_max_size ? value_max_size - value_str.size: 0); + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", attrib_kind_str, attrib_kind_str.size <= attrib_name_max_size ? attrib_name_max_size - attrib_kind_str.size : 0, g_spaces); + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", form_kind_str, form_kind_str.size <= form_kind_max_size ? form_kind_max_size - form_kind_str.size : 0, g_spaces); + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", value_str, value_str.size <= value_max_size ? value_max_size - value_str.size : 0, g_spaces); String8 attrib_str = str8_list_join(scratch.arena, &fmt, &(StringJoin){.sep = str8_lit(" ")}); dw_printf("attrib: { %S } // info_off: 0x%I64x\n", attrib_str, attrib->info_off); @@ -943,7 +945,8 @@ DW_PRINTER(dw_print_line) { Temp unit_temp = temp_begin(scratch.arena); - DW_LineVM *vm = dw_line_vm_init(input, &cu_arr[unit_idx]); + DW_CompUnit *cu = &cu_arr[unit_idx]; + DW_LineVM *vm = dw_line_vm_init(input, cu); // rjf: begin logging line table dw_printf("line_table: // line_table[%I64u]\n", unit_idx); @@ -978,27 +981,29 @@ DW_PRINTER(dw_print_line) dw_printf("{\n"); dw_indent(); { - dw_printf("// %-4s %-30s\n", "no.", "name"); + dw_printf("// %-4s %-30s\n", "No.", "Name"); dw_printf("// ---- ------------------------------\n"); + String8 cu_comp_dir = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_CompDir); + dw_printf("{ %-4I64u %-30S }\n", 0, cu_comp_dir); for EachIndex(dir_idx, vm->header.dir_table.count) { - dw_printf("{ %-4I64u %S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); + dw_printf("{ %-4I64u %-30S }\n", dir_idx+1, vm->header.dir_table.v[dir_idx]); } } dw_unindent(); - dw_printf("}\n\n"); + dw_printf("}\n"); // rjf: log file table dw_printf("file_table:\n"); dw_printf("{\n"); dw_indent(); { - dw_printf("// %-4s %-8s %-8s %-33s %-8s %-20s\n", "no.", "dir_idx", "time", "md5", "size", "name"); + dw_printf("// %-4s %-8s %-8s %-33s %-8s %-20s\n", "No.", "Dir No.", "Time", "MD5", "Size", "Name"); dw_printf("// ---- -------- -------- --------------------------------- -------- --------------------\n"); for EachIndex(file_idx, vm->header.file_table.count) { DW_LineFile *file = &vm->header.file_table.v[file_idx]; - dw_printf("{ %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %S }\n", + dw_printf("{ %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %-20S }\n", file_idx, file->dir_idx, file->modify_time, From 4b88258a3070fa5bbee64517490cb5d192acc1b7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 20 Feb 2026 18:08:45 -0800 Subject: [PATCH 234/850] emit simple DWARF line table --- src/dwarf/dwarf.c | 22 ++++++++ src/dwarf/dwarf.h | 5 ++ src/dwarf/dwarf_parse.c | 21 ++++---- src/dwarf/dwarf_writer.c | 101 ++++++++++++++++++++++-------------- src/dwarf/dwarf_writer.h | 6 +-- src/torture/torture_dwarf.c | 41 +++++++++++---- 6 files changed, 133 insertions(+), 63 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 0ead6dc8..e8179a53 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -1029,3 +1029,25 @@ dw_form_match(DW_Form a, DW_Form b) return is_match; } +internal U64 +dw_length_from_std_opcode(DW_StdOpcode opcode) +{ + switch (opcode) { + case DW_StdOpcode_ExtendedOpcode: return 0; + case DW_StdOpcode_Copy: return 0; + case DW_StdOpcode_AdvancePc: return 1; + case DW_StdOpcode_AdvanceLine: return 1; + case DW_StdOpcode_SetFile: return 1; + case DW_StdOpcode_SetColumn: return 1; + case DW_StdOpcode_NegateStmt: return 0; + case DW_StdOpcode_SetBasicBlock: return 0; + case DW_StdOpcode_ConstAddPc: return 0; + case DW_StdOpcode_FixedAdvancePc: return 1; + case DW_StdOpcode_SetPrologueEnd: return 0; + case DW_StdOpcode_SetEpilogueBegin: return 0; + case DW_StdOpcode_SetIsa: return 1; + default: InvalidPath; break; + } + return 0; +} + diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 5de439be..272f269c 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1829,4 +1829,9 @@ internal void * dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v); internal B32 dw_form_match(DW_Form a, DW_Form b); +//////////////////////////////// +// Line + +internal U64 dw_length_from_std_opcode(DW_StdOpcode opcode); + #endif // DWARF_H diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index bdaae721..c56c2ec4 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -2586,10 +2586,11 @@ dw_line_vm_step(DW_LineVM *vm) // extended opcodes case DW_StdOpcode_ExtendedOpcode: { TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->ext_length), vm->cursor, exit); + String8 ext_data = str8_substr(vm->program, r1u64(vm->cursor, vm->cursor + vm->ext_length)); + vm->cursor += vm->ext_length; - U64 extended_opl = vm->cursor + vm->ext_length; - - TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &vm->ext_opcode), vm->cursor, exit); + U64 ext_cursor = 0; + TryRead(str8_deserial_read_struct(ext_data, ext_cursor, &vm->ext_opcode), vm->cursor, exit); switch (vm->ext_opcode) { case DW_ExtOpcode_EndSequence: { @@ -2599,16 +2600,16 @@ dw_line_vm_step(DW_LineVM *vm) } break; case DW_ExtOpcode_SetAddress: { - TryRead(str8_deserial_read(vm->program, vm->cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), vm->cursor, exit); + TryRead(str8_deserial_read(ext_data, ext_cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), vm->cursor, exit); vm->state.address = vm->operands[0].u64; vm->state.op_index = 0; } break; case DW_ExtOpcode_DefineFile: { - TryRead(str8_deserial_read_cstr (vm->program, vm->cursor, &vm->operands[0].string), vm->cursor, exit); // file name - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[1].u64), vm->cursor, exit); // dir index - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[2].u64), vm->cursor, exit); // modify time - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[3].u64), vm->cursor, exit); // file size + TryRead(str8_deserial_read_cstr (ext_data, ext_cursor, &vm->operands[0].string), vm->cursor, exit); // file name + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[1].u64), vm->cursor, exit); // dir index + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[2].u64), vm->cursor, exit); // modify time + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[3].u64), vm->cursor, exit); // file size if (vm->ext_file_ht == 0) { vm->ext_file_ht = hash_table_init(vm->arena, 512); @@ -2629,14 +2630,12 @@ dw_line_vm_step(DW_LineVM *vm) } break; case DW_ExtOpcode_SetDiscriminator: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[0].u64), vm->cursor, exit); vm->state.discriminator = vm->operands[0].u64; } break; default: { NotImplemented; } break; } - - vm->cursor = extended_opl; } break; default: { diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index c76d0c2e..6fbf357e 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -102,17 +102,21 @@ dw_writer_begin(DW_Format format, DW_Version version, DW_CompUnitKind cu_kind, A { Arena *arena = arena_alloc(); DW_Writer *writer = push_array(arena, DW_Writer, 1); - writer->arena = arena; - writer->arch = arch; - writer->format = format; - writer->version = version; - writer->cu_kind = cu_kind; - writer->address_size = byte_size_from_arch(arch); - writer->current = 0; - writer->abbrev_id_map = hash_table_init(arena, 0x2000); - writer->line.opcode_base = DW_StdOpcode_Count; - writer->line.line_base = -5; - writer->line.line_range = 14; + writer->arena = arena; + writer->arch = arch; + writer->format = format; + writer->version = version; + writer->cu_kind = cu_kind; + writer->address_size = byte_size_from_arch(arch); + writer->current = 0; + writer->abbrev_id_map = hash_table_init(arena, 0x2000); + writer->line.min_inst_len = min_instruction_size_from_arch(arch); + writer->line.max_ops_per_inst = max_ops_per_instruction_from_arch(arch); + writer->line.default_is_stmt = 1; + writer->line.line_base = -5; + writer->line.line_range = 14; + writer->line.opcode_base = DW_StdOpcode_Count; + writer->line.ln = 1; for EachElement(i, writer->sections) { str8_serial_begin(arena, &writer->sections[i].srl); } @@ -461,7 +465,7 @@ dw_writer_push_attrib_expression(DW_Writer *writer, DW_AttribKind kind, DW_ExprE } internal DW_WriterAttrib * -dw_writer_push_attrib_line_ptr(DW_Writer *writer, DW_AttribKind kind, void *line_ptr) +dw_writer_push_attrib_line_ptr(DW_Writer *writer, DW_AttribKind kind, U64 line_ptr) { return dw_writer_push_attrib(writer, kind, (DW_WriterForm){ .kind = DW_WriterFormKind_LinePtr, .line_ptr = line_ptr }); } @@ -548,6 +552,7 @@ dw_data_from_line_insts(Arena *arena, U8 address_size, DW_LineInstList insts) } break; default: { InvalidPath; } break; } + ext_size += sizeof(DW_ExtOpcode); // write ext header dw_serial_push_uleb128(arena, &srl, ext_size); @@ -569,7 +574,7 @@ dw_data_from_line_insts(Arena *arena, U8 address_size, DW_LineInstList insts) } } break; // special opcode - default: {} break; + default: { } break; } } @@ -581,29 +586,27 @@ dw_data_from_line_insts(Arena *arena, U8 address_size, DW_LineInstList insts) internal void dw_writer_line_emit(DW_Writer *writer, DW_WriterFile *file, U64 ln, U64 col, U64 addr) { - if (writer->line.last_file != file) { + if (writer->line.file != file) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_file(file)); } Assert(addr <= max_S64); S64 addr_delta = (S64)addr - (S64)writer->line.addr; - if (addr_delta != 0) { - dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_pc(addr_delta)); - } + S64 ln_delta = (S64)ln - (S64)writer->line.ln; + S64 col_delta = (S64)col - (S64)writer->line.col; - S64 ln_delta = (S64)ln - (S64)writer->line.ln; - if (ln_delta != 0) { - dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(ln_delta)); + if (col_delta == 0 && (ln_delta > 0 || addr_delta > 0) && + writer->line.line_base <= ln_delta && ln_delta < writer->line.line_range+writer->line.line_base && + addr_delta < max_U8 - writer->line.opcode_base) { + U8 opcode = (ln_delta - writer->line.line_base) + (writer->line.line_range * addr_delta) + writer->line.opcode_base; + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, (DW_LineInst){ .opcode = opcode }); + } else { + if (addr_delta != 0) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_pc(addr_delta)); } + if (ln_delta != 0) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(ln_delta)); } + if (col_delta != 0) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_column(col_delta)); } + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_copy()); } - S64 col_delta = (S64)col - (S64)writer->line.col; - if (col_delta != 0) { - dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_column(col_delta)); - } - - // append row - dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_copy()); - writer->line.file = file; writer->line.ln = ln; writer->line.col = col; @@ -714,7 +717,8 @@ dw_lower_attrib_forms(DW_Writer *writer, DW_WriterTag *tag) } } break; case DW_WriterFormKind_LinePtr: { - NotImplemented; + attrib->form.reader.kind = DW_Form_SecOffset; + attrib->form.reader.sec_offset = attrib->form.writer.line_ptr; } break; case DW_WriterFormKind_MacPtr: { NotImplemented; @@ -960,23 +964,29 @@ dw_writer_emit(DW_Writer *writer) dw_serial_push_uleb128(writer->arena, srl, DW_LNCT_Path); dw_serial_push_uleb128(writer->arena, srl, DW_Form_String); + + // dedup directories - HashTable *dir_ht = hash_table_init(scratch.arena, writer->line.file_count + 1); + String8List dirs = {0}; + HashTable *dir_ht = hash_table_init(scratch.arena, writer->line.file_count + 1); // first entry must be compile unit directory hash_table_push_string_u64(scratch.arena, dir_ht, comp_dir, dir_ht->count); + str8_list_push(scratch.arena, &dirs, comp_dir); for EachNode(file, DW_WriterFile, writer->line.first_file) { String8 path = str8_chop_last_slash(file->path); if ( ! hash_table_search_string_u64(dir_ht, path, &file->dir_idx)) { file->dir_idx = hash_table_push_string_u64(scratch.arena, dir_ht, path, dir_ht->count)->v.value_u64; + str8_list_push(scratch.arena, &dirs, path); } } KeyValuePair *dirs_kv = key_value_pairs_from_hash_table(scratch.arena, dir_ht); - sort_key_value_pairs_as_string_sensitive(dirs_kv, dir_ht->count); + //sort_key_value_pairs_as_string_sensitive(dirs_kv, dir_ht->count); // (15) directories_count dw_serial_push_uleb128(writer->arena, srl, dir_ht->count); + // (16) directories - for (U64 i = 1; i < dir_ht->count; i += 1) { + for (U64 i = 0; i < dir_ht->count; i += 1) { String8 dir = dirs_kv[i].key_string; dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, (DW_WriterXForm) { .reader = { .kind = DW_Form_String, .string = dir } }); } @@ -985,6 +995,7 @@ dw_writer_emit(DW_Writer *writer) } String8List file_table_srl = {0}; + str8_serial_begin(writer->arena, &file_table_srl); { Temp scratch = scratch_begin(0, 0); String8List *srl = &file_table_srl; @@ -1010,11 +1021,11 @@ dw_writer_emit(DW_Writer *writer) } // count needed encodings - U64 enc_count = 0; + U8 enc_count = 0; for EachElement(i, encs) { if (encs[i].form_kind != DW_Form_Null) { enc_count += 1; } } // (17) file_name_entry_format_count - str8_serial_push_u16(writer->arena, srl, enc_count); + str8_serial_push_u8(writer->arena, srl, enc_count); // (18) file_name_entry_format for EachElement(i, encs) { @@ -1038,6 +1049,9 @@ dw_writer_emit(DW_Writer *writer) p->next = n->next; n->next = writer->line.first_file; writer->line.first_file = n; + if (writer->line.last_file == n) { + writer->line.last_file = p; + } } break; } @@ -1050,12 +1064,13 @@ dw_writer_emit(DW_Writer *writer) // path Assert(*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Path) == DW_Form_String); - DW_WriterXForm path_form = { .reader = { .kind = DW_Form_String, .string = file->path } }; + String8 file_name = str8_skip_last_slash(file->path); + DW_WriterXForm path_form = { .reader = { .kind = DW_Form_String, .string = file_name } }; dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, path_form); // directory index Assert(*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_DirectoryIndex) == DW_Form_UData); - DW_WriterXForm dir_idx_form = { .reader = { .kind = DW_Form_UData, .udata = file->time_stamp } }; + DW_WriterXForm dir_idx_form = { .reader = { .kind = DW_Form_UData, .udata = file->dir_idx } }; dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, dir_idx_form); // time stamp @@ -1113,8 +1128,8 @@ dw_writer_emit(DW_Writer *writer) // (4) segment_selector_size str8_serial_push_struct(writer->arena, srl, &writer->segsel_size); // (5) header_length - U64 header_size = srl->total_size + dir_table_srl.total_size + file_table_srl.total_size; - dw_serial_push_uint(writer->arena, srl, writer->format, header_size); + void *header_length_ptr = dw_serial_push_uint(writer->arena, srl, writer->format, 0); + U64 header_length_offset = srl->total_size; // (6) minimum_instruction_length str8_serial_push_struct(writer->arena, srl, &writer->line.min_inst_len); // (7) maximum_operations_per_instruction @@ -1128,11 +1143,19 @@ dw_writer_emit(DW_Writer *writer) // (11) opcode_base str8_serial_push_struct(writer->arena, srl, &writer->line.opcode_base); // (12) standard_opcode_lengths - str8_serial_push_struct(writer->arena, srl, &writer->line.std_op_lens); + U8 *std_op_lens = push_array(writer->arena, U8, DW_StdOpcode_Count - 1); + for (U64 i = 1; i < DW_StdOpcode_Count; i += 1) { std_op_lens[i-1] = dw_length_from_std_opcode(i); } + str8_serial_push_string(writer->arena, srl, str8(std_op_lens, DW_StdOpcode_Count - 1)); // directory table str8_list_concat_in_place(srl, &dir_table_srl); // file table str8_list_concat_in_place(srl, &file_table_srl); + + // fixup header length + U64 bytes_to_line_program = srl->total_size - header_length_offset; + if (writer->format == DW_Format_32Bit) { *(U32 *)header_length_ptr = bytes_to_line_program; } + else { *(U64 *)header_length_ptr = bytes_to_line_program; } + // line program String8 line_program_data = dw_data_from_line_insts(writer->arena, writer->address_size, writer->line.line_insts); str8_serial_push_string(writer->arena, srl, line_program_data); diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index 95b2f913..466ad5d5 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -47,7 +47,7 @@ typedef struct DW_WriterForm union { struct { struct DW_WriterTag *ref; - void *line_ptr; + U64 line_ptr; void *mac_ptr; void *rng_list_ptr; }; @@ -137,6 +137,7 @@ typedef struct DW_WriterFile U64 size; String8 md5; String8 source; + // computed during line table emit step U64 file_idx; U64 dir_idx; } DW_WriterFile; @@ -225,7 +226,6 @@ typedef struct DW_Writer S8 line_base; U8 line_range; U8 opcode_base; - U8 *std_op_lens; DW_LineInstList line_insts; DW_WriterFile *file; @@ -275,7 +275,7 @@ internal DW_WriterAttrib * dw_writer_push_attrib_enum (DW_Writer *writer, internal DW_WriterAttrib * dw_writer_push_attrib_ref (DW_Writer *writer, DW_AttribKind kind, DW_WriterTag *ref ); internal DW_WriterAttrib * dw_writer_push_attrib_exprloc (DW_Writer *writer, DW_AttribKind kind, String8 exprloc ); internal DW_WriterAttrib * dw_writer_push_attrib_expression (DW_Writer *writer, DW_AttribKind kind, DW_ExprEnc *encs, U64 encs_count); -internal DW_WriterAttrib * dw_writer_push_attrib_line_ptr (DW_Writer *writer, DW_AttribKind kind, void * line_ptr ); +internal DW_WriterAttrib * dw_writer_push_attrib_line_ptr (DW_Writer *writer, DW_AttribKind kind, U64 line_ptr ); internal DW_WriterAttrib * dw_writer_push_attrib_mac_ptr (DW_Writer *writer, DW_AttribKind kind, void * mac_ptr ); internal DW_WriterAttrib * dw_writer_push_attrib_rng_list_ptr(DW_Writer *writer, DW_AttribKind kind, void * rng_list_ptr); internal DW_WriterAttrib * dw_writer_push_attrib_implicit (DW_Writer *writer, DW_AttribKind kind, S64 implicit ); diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 095b76b9..2641aefd 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -107,25 +107,40 @@ dwt_make_writer(void) { Temp scratch = scratch_begin(0, 0); + String8 comp_dir = t_make_file_path(scratch.arena, str8_lit("")); + String8 comp_name = str8_lit("test_code.txt"); + String8 test_text = str8_lit("nop\nnop\nret\n"); + String8 test_path = t_make_file_path(scratch.arena, comp_name); + t_write_file(comp_name, test_text); + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_Last, DW_CompUnitKind_Compile, Arch_x64); // line { - DW_WriterFile *b_file = dw_writer_new_file(writer, str8_lit("~/devel/projects/b/b.c")); - DW_WriterFile *a_file = dw_writer_new_file(writer, str8_lit("~/devel/projects/a.c")); + DW_WriterFile *a_file = dw_writer_new_file(writer, test_path); dw_writer_line_set_prologue_end(writer); - dw_writer_line_emit(writer, b_file, 10, 0, 0x140001000); - dw_writer_line_emit(writer, b_file, 11, 0, 0x140001010); - dw_writer_line_emit(writer, a_file, 1, 0, 0x140001016); - dw_writer_line_emit(writer, a_file, 2, 0, 0x140001020); + dw_writer_line_emit(writer, a_file, 1, 0, 0x140001000); + dw_writer_line_emit(writer, a_file, 2, 0, 0x140001001); + dw_writer_line_emit(writer, a_file, 3, 0, 0x140001002); + + //DW_WriterFile *b_file = dw_writer_new_file(writer, str8_lit("~/devel/projects/b/b.c")); + //DW_WriterFile *a_file = dw_writer_new_file(writer, str8_lit("~/devel/projects/a.c")); + //dw_writer_line_set_prologue_end(writer); + //dw_writer_line_emit(writer, b_file, 10, 0, 0x140001000); + //dw_writer_line_emit(writer, b_file, 11, 0, 0x140001010); + //dw_writer_line_emit(writer, a_file, 1, 0, 0x140001016); + //dw_writer_line_emit(writer, a_file, 2, 0, 0x140001020); } // info { dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, str8_lit("~/devel/projects")); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("a.c")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); dw_writer_push_attrib_enum(writer, DW_AttribKind_Language, DW_Language_C99); dw_writer_push_attrib_flag(writer, DW_AttribKind_UseUtf8, 1); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140001000); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x140001003); { DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); @@ -167,8 +182,8 @@ dwt_make_writer(void) dw_writer_tag_begin(writer, DW_TagKind_SubProgram); dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x14012f2f0); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x14012f405); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140001000); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x140001003); dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("main")); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, simple_struct_tag); dw_writer_push_attrib_expression(writer, DW_AttribKind_FrameBase, &(DW_ExprEnc)DW_ExprEnc_Op(Reg7), 1); @@ -182,6 +197,8 @@ dwt_make_writer(void) { OBJ *obj = obj_alloc(0, Arch_x64); OBJ_Section *text_section = obj_push_section(obj, str8_lit(".text"), OBJ_SectionFlag_Read|OBJ_SectionFlag_Exec|OBJ_SectionFlag_Load); + str8_serial_push_u8(obj->arena, &text_section->data, 0x90); + str8_serial_push_u8(obj->arena, &text_section->data, 0x90); str8_serial_push_u8(obj->arena, &text_section->data, 0xc3); obj_push_symbol(obj, str8_lit("entry"), OBJ_SymbolScope_Global, OBJ_RefKind_Section, text_section); @@ -195,6 +212,10 @@ dwt_make_writer(void) String8 string_table = str8_substr(raw_coff, obj_coff_header.string_table_range); input = dw_input_from_coff_section_table(scratch.arena, raw_coff, string_table, section_count, section_table); + t_write_file(str8_lit("dwarf.obj"), raw_coff); + + t_invoke(str8_lit("radlink"), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full dwarf.obj"), max_U64); + obj_release(&obj); } From 20d3fa4ddb6337847a7dd79c56cbc94104cde0bc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 20 Feb 2026 22:08:26 -0800 Subject: [PATCH 235/850] normalize paths with inconsistent slashes --- src/dbg_engine/dbg_engine_core.c | 4 ++-- src/lib_rdi_make/rdi_make.c | 14 ++++++++++++++ src/lib_rdi_make/rdi_make.h | 1 + src/raddbg/raddbg_views.c | 2 +- src/rdi_make/rdi_make_local.c | 6 +++--- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 67ff4c22..b7a81a13 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -771,7 +771,7 @@ d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, override_n = override_n->next) { String8 file_path = override_n->string; - String8 file_path_normalized = lower_from_str8(scratch.arena, path_normalized_from_string(scratch.arena, file_path)); + String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); // rjf: binary -> rdi RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); @@ -864,7 +864,7 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 override_n = override_n->next) { String8 file_path = override_n->string; - String8 file_path_normalized = lower_from_str8(scratch.arena, file_path); + String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); for EachIndex(idx, dbgi_keys.count) { Access *access = access_open(); diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 053392ce..23cd540b 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -255,6 +255,20 @@ rdim_lower_from_str8(RDIM_Arena *arena, RDIM_String8 string) return result; } +RDI_PROC RDIM_String8 +rdim_normalize_path_str8(RDIM_Arena *arena, RDIM_String8 path) +{ + RDIM_String8 result = rdim_lower_from_str8(arena, path); + for(RDI_U64 i = 0; i < result.RDIM_String8_SizeMember; i += 1) + { + if(result.RDIM_String8_BaseMember[i] == '\\') + { + result.RDIM_String8_BaseMember[i] = '/'; + } + } + return result; +} + //- rjf: string lists RDI_PROC void diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index fcc3f9fd..814ed301 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1570,6 +1570,7 @@ RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatc #define rdim_str8_struct(S) rdim_str8((RDI_U8*)(S), sizeof(*(S))) #define rdim_str8_struct_array(S, C) rdim_str8((RDI_U8*)(S), sizeof(*(S)) * (C)) RDI_PROC RDIM_String8 rdim_lower_from_str8(RDIM_Arena *arena, RDIM_String8 string); +RDI_PROC RDIM_String8 rdim_normalize_path_str8(RDIM_Arena *arena, RDIM_String8 path); //- rjf: string lists RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index eca984d4..6b8de17a 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2248,7 +2248,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) for EachNode(override_n, String8Node, overrides.first) { String8 file_path = override_n->string; - String8 file_path_normalized = lower_from_str8(scratch.arena, path_normalized_from_string(scratch.arena, file_path)); + String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); B32 good_src_id = 0; U32 src_id = 0; if(rdi != &rdi_parsed_nil) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 3d3e27b1..4f5b1bd6 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -855,7 +855,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - RDIM_String8 normalized_path = rdim_lower_from_str8(arena, n->v[n_idx].path); + RDIM_String8 normalized_path = rdim_normalize_path_str8(arena, n->v[n_idx].path); rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, normalized_path); } } @@ -1141,7 +1141,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, n_range) { RDIM_SrcFile *src_file = &n->v[n_idx]; - RDIM_String8 normalized_path = rdim_lower_from_str8(arena, src_file->path); + RDIM_String8 normalized_path = rdim_normalize_path_str8(arena, src_file->path); rdim_bake_name_map_insert(scratch.arena, top, map, 4, normalized_path, rdim_idx_from_src_file(src_file)); } } @@ -1990,7 +1990,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: fill file info Temp scratch = scratch_begin(&arena, 1); - String8 normalized_path = rdim_lower_from_str8(scratch.arena, src->path); + String8 normalized_path = rdim_normalize_path_str8(scratch.arena, src->path); B32 has_checksum = (RDI_ChecksumKind_NULL < src->checksum_kind && src->checksum_kind < RDI_ChecksumKind_COUNT && src->checksum.size != 0); dst->file_path_node_idx = rdim_bake_path_node_idx_from_string(path_tree, src->path); dst->normal_full_path_string_idx = rdim_bake_idx_from_string(bake_strings, normalized_path); From a7e64c3928dce0056d182eb7d967fa9057c0ed64 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 20 Feb 2026 22:24:39 -0800 Subject: [PATCH 236/850] more reasonable string pad count --- src/rdi/rdi_local.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 55e95f78..c03f6f66 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -702,7 +702,7 @@ lane_sync(); if(flags & RDI_DumpSubsetFlag_##name) ProfScope(#name) StringJoin join = {0}; join.sep = str8_lit(", "); String8 checksum_val_string = str8_list_join(arena, &checksum_vals, &join); - dumpf("\n { file_path_node_idx: %4u, source_line_map: %4u, checksum_kind: %10S, checksum_value: %192S, path: %-192S } // source_file[%I64u]", + dumpf("\n { file_path_node_idx: %4u, source_line_map: %4u, checksum_kind: %10S, checksum_value: %32S, path: %-64S } // source_file[%I64u]", source_file->file_path_node_idx, source_file->source_line_map_idx, checksum_kind_name, From 2a8a1a57413ac678d87aed7c300b1e29ab77f631 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 22 Feb 2026 20:16:54 -0800 Subject: [PATCH 237/850] test all LNCT encoding in the file table, test line instruction encoder, test special opcode encoding --- src/dwarf/dwarf_parse.c | 66 ++-- src/dwarf/dwarf_parse.h | 8 +- src/dwarf/dwarf_writer.c | 103 ++++-- src/dwarf/dwarf_writer.h | 16 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 20 +- src/torture/torture_dwarf.c | 502 +++++++++++++++++++++++----- 6 files changed, 549 insertions(+), 166 deletions(-) diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index c56c2ec4..628099fa 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -2276,7 +2276,7 @@ dw_read_line_vm_header(Arena *arena, // compile unit name is always first in the file table { DW_LineFileNode *node = push_array(scratch.arena, DW_LineFileNode, 1); - node->file.file_name = cu_name; + node->file.path = cu_name; SLLQueuePush(file_list.first, file_list.last, node); file_list.node_count += 1; } @@ -2288,10 +2288,10 @@ dw_read_line_vm_header(Arena *arena, if (first_byte == 0) { break; } DW_LineFile file = {0}; - TryRead(str8_deserial_read_cstr (data, cursor, &file.file_name), cursor, exit); - TryRead(str8_deserial_read_uleb128(data, cursor, &file.dir_idx), cursor, exit); - TryRead(str8_deserial_read_uleb128(data, cursor, &file.modify_time), cursor, exit); - TryRead(str8_deserial_read_uleb128(data, cursor, &file.file_size), cursor, exit); + TryRead(str8_deserial_read_cstr (data, cursor, &file.path), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.dir_idx), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.time_stamp), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.size), cursor, exit); DW_LineFileNode *node = push_array(scratch.arena, DW_LineFileNode, 1); node->file = file; @@ -2309,10 +2309,10 @@ dw_read_line_vm_header(Arena *arena, file_table.v = push_array(arena, DW_LineFile, file_list.node_count); for EachNode(n, DW_LineFileNode, file_list.first) { DW_LineFile *dst = &file_table.v[file_table.count++]; - dst->file_name = push_str8_copy(arena, n->file.file_name); + dst->path = push_str8_copy(arena, n->file.path); dst->dir_idx = n->file.dir_idx; - dst->modify_time = n->file.modify_time; - dst->file_size = n->file.file_size; + dst->time_stamp = n->file.time_stamp; + dst->size = n->file.size; } } // DWARF5 @@ -2379,12 +2379,12 @@ dw_read_line_vm_header(Arena *arena, cursor += form_size; switch (lnct) { - case DW_LNCT_Path: { file->file_name = dw_interp_string(input, format, cu_str_offsets, form); } break; - case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form); } break; - case DW_LNCT_TimeStamp: { file->modify_time = dw_interp_const_u64(form); } break; - case DW_LNCT_Size: { file->file_size = dw_interp_const_u64(form); } break; - case DW_LNCT_MD5: { file->md5_digest = dw_interp_const_u128(form); } break; - case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form); } break; + case DW_LNCT_Path: { file->path = dw_interp_string(input, format, cu_str_offsets, form); } break; + case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form); } break; + case DW_LNCT_TimeStamp: { file->time_stamp = dw_interp_const_u64(form); } break; + case DW_LNCT_Size: { file->size = dw_interp_const_u64(form); } break; + case DW_LNCT_MD5: { file->md5 = dw_interp_const_u128(form); } break; + case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form); } break; default: { Assert(!"unexpected LNTC encoding"); } break; @@ -2565,7 +2565,9 @@ dw_line_vm_step(DW_LineVM *vm) } break; case DW_StdOpcode_FixedAdvancePc: { - TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + U16 fixed_advance = 0; + TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &fixed_advance), vm->cursor, exit); + vm->operands[0].u64 = fixed_advance; vm->state.address += vm->operands[0].u64; vm->state.op_index = 0; } break; @@ -2590,7 +2592,7 @@ dw_line_vm_step(DW_LineVM *vm) vm->cursor += vm->ext_length; U64 ext_cursor = 0; - TryRead(str8_deserial_read_struct(ext_data, ext_cursor, &vm->ext_opcode), vm->cursor, exit); + TryRead(str8_deserial_read_struct(ext_data, ext_cursor, &vm->ext_opcode), ext_cursor, exit); switch (vm->ext_opcode) { case DW_ExtOpcode_EndSequence: { @@ -2600,26 +2602,26 @@ dw_line_vm_step(DW_LineVM *vm) } break; case DW_ExtOpcode_SetAddress: { - TryRead(str8_deserial_read(ext_data, ext_cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), vm->cursor, exit); + TryRead(str8_deserial_read(ext_data, ext_cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), ext_cursor, exit); vm->state.address = vm->operands[0].u64; vm->state.op_index = 0; } break; case DW_ExtOpcode_DefineFile: { - TryRead(str8_deserial_read_cstr (ext_data, ext_cursor, &vm->operands[0].string), vm->cursor, exit); // file name - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[1].u64), vm->cursor, exit); // dir index - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[2].u64), vm->cursor, exit); // modify time - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[3].u64), vm->cursor, exit); // file size + TryRead(str8_deserial_read_cstr (ext_data, ext_cursor, &vm->operands[0].string), ext_cursor, exit); // file name + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[1].u64), ext_cursor, exit); // dir index + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[2].u64), ext_cursor, exit); // modify time + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[3].u64), ext_cursor, exit); // file size if (vm->ext_file_ht == 0) { vm->ext_file_ht = hash_table_init(vm->arena, 512); } DW_LineFile *file = push_array(vm->arena, DW_LineFile, 1); - file->file_name = vm->operands[0].string; - file->dir_idx = vm->operands[1].u64; - file->modify_time = vm->operands[2].u64; - file->file_size = vm->operands[3].u64; + file->path = vm->operands[0].string; + file->dir_idx = vm->operands[1].u64; + file->time_stamp = vm->operands[2].u64; + file->size = vm->operands[3].u64; if (hash_table_search_u64_raw(vm->ext_file_ht, vm->state.file_index) == 0) { vm->error = push_str8f(vm->arena, "file with index %I64d was already defined", vm->state.file_index); @@ -2630,7 +2632,7 @@ dw_line_vm_step(DW_LineVM *vm) } break; case DW_ExtOpcode_SetDiscriminator: { - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[0].u64), vm->cursor, exit); + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[0].u64), ext_cursor, exit); vm->state.discriminator = vm->operands[0].u64; } break; @@ -2675,13 +2677,13 @@ dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file) Assert(dir_table.count > 0); // find directory and file name associated with the file index - String8 dir = dir_table.v[file->dir_idx]; - String8 file_name = file->file_name; + String8 dir = dir_table.v[file->dir_idx]; + String8 path = file->path; // infer path style if directory is empty use file name PathStyle style = path_style_from_str8(dir); if (style == PathStyle_Null || style == PathStyle_Relative) { - style = path_style_from_str8(file->file_name); + style = path_style_from_str8(file->path); } String8List path_list = {0}; @@ -2697,17 +2699,17 @@ dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file) str8_list_concat_in_place(&path_list, &dir_list); // push file name - str8_list_push(scratch.arena, &path_list, file->file_name); + str8_list_push(scratch.arena, &path_list, file->path); // resolve dots in the path str8_path_list_resolve_dots_in_place(&path_list, style); } // join path - String8 path = str8_path_list_join_by_style(arena, &path_list, style); + String8 result = str8_path_list_join_by_style(arena, &path_list, style); scratch_end(scratch); - return path; + return result; } internal DW_PubStringsTable diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index be823410..25efb799 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -173,11 +173,11 @@ typedef struct DW_TagTree typedef struct DW_LineFile { - String8 file_name; + String8 path; U64 dir_idx; - U64 modify_time; - U64 file_size; - U128 md5_digest; + U64 time_stamp; + U64 size; + U128 md5; String8 source; } DW_LineFile; diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index 6fbf357e..e534d1d9 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -117,6 +117,7 @@ dw_writer_begin(DW_Format format, DW_Version version, DW_CompUnitKind cu_kind, A writer->line.line_range = 14; writer->line.opcode_base = DW_StdOpcode_Count; writer->line.ln = 1; + Assert(writer->line.line_base < writer->line.line_range); for EachElement(i, writer->sections) { str8_serial_begin(arena, &writer->sections[i].srl); } @@ -179,6 +180,10 @@ dw_serial_push_form(Arena *arena, String8List *srl, DW_Version version, DW_Forma case DW_Form_String: { str8_serial_push_cstr(arena, srl, form.reader.string); } break; + case DW_Form_Block: { + dw_serial_push_uleb128(arena, srl, form.reader.block.size); + str8_serial_push_string(arena, srl, form.reader.block); + } break; case DW_Form_Flag: { str8_serial_push_u8(arena, srl, form.reader.flag); } break; @@ -537,7 +542,9 @@ dw_data_from_line_insts(Arena *arena, U8 address_size, DW_LineInstList insts) } break; case DW_StdOpcode_SetPrologueEnd: {} break; case DW_StdOpcode_SetEpilogueBegin: {} break; - case DW_StdOpcode_SetIsa: {} break; + case DW_StdOpcode_SetIsa: { + dw_serial_push_uleb128(arena, &srl, inst->set_isa); + } break; case DW_StdOpcode_ExtendedOpcode: { // get ext size U64 ext_size = 0; @@ -562,7 +569,7 @@ dw_data_from_line_insts(Arena *arena, U8 address_size, DW_LineInstList insts) switch (inst->ext) { case DW_ExtOpcode_EndSequence: {} break; case DW_ExtOpcode_SetAddress: { - dw_serial_push_uleb128(arena, &srl, inst->set_address); + str8_serial_push_string(arena, &srl, str8_copy(arena, str8((U8 *)&inst->set_address, address_size))); } break; case DW_ExtOpcode_DefineFile: { NotImplemented; @@ -590,23 +597,29 @@ dw_writer_line_emit(DW_Writer *writer, DW_WriterFile *file, U64 ln, U64 col, U64 dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_file(file)); } + S64 col_delta = (S64)col - (S64)writer->line.col; + if (col_delta != 0) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_column(col_delta)); } + Assert(addr <= max_S64); S64 addr_delta = (S64)addr - (S64)writer->line.addr; S64 ln_delta = (S64)ln - (S64)writer->line.ln; - S64 col_delta = (S64)col - (S64)writer->line.col; - if (col_delta == 0 && (ln_delta > 0 || addr_delta > 0) && - writer->line.line_base <= ln_delta && ln_delta < writer->line.line_range+writer->line.line_base && - addr_delta < max_U8 - writer->line.opcode_base) { - U8 opcode = (ln_delta - writer->line.line_base) + (writer->line.line_range * addr_delta) + writer->line.opcode_base; + S64 max_ln_delta = writer->line.line_range + writer->line.line_base; + S64 max_addr_delta = (max_U8 - writer->line.opcode_base - (ln_delta - writer->line.line_base)) / writer->line.line_range; + if ((ln_delta != 0 || addr_delta != 0) && + writer->line.line_base <= ln_delta && ln_delta < max_ln_delta && // check line number window + 0 <= addr_delta && addr_delta <= max_addr_delta) { // check address window + U8 opcode = (ln_delta - writer->line.line_base) + (addr_delta * writer->line.line_range) + writer->line.opcode_base; dw_line_inst_list_push(writer->arena, &writer->line.line_insts, (DW_LineInst){ .opcode = opcode }); } else { if (addr_delta != 0) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_pc(addr_delta)); } if (ln_delta != 0) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(ln_delta)); } - if (col_delta != 0) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_column(col_delta)); } - dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_copy()); + if (addr_delta != 0 || ln_delta != 0 || col_delta != 0) { + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_copy()); + } } + // update registers writer->line.file = file; writer->line.ln = ln; writer->line.col = col; @@ -619,6 +632,22 @@ dw_writer_line_set_address(DW_Writer *writer, U64 address) dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_address(address)); } +internal void +dw_writer_line_set_discriminator(DW_Writer *writer, U64 d) +{ + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_discriminator(d)); +} + +internal void +dw_writer_line_end_sequence(DW_Writer *writer) +{ + writer->line.file = 0; + writer->line.ln = 1; + writer->line.addr = 0; + writer->line.col = 0; + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_end_sequence()); +} + internal void dw_writer_line_set_prologue_end(DW_Writer *writer) { @@ -641,8 +670,7 @@ internal DW_WriterFile * dw_writer_new_file(DW_Writer *writer, String8 path) { DW_WriterFile *file = push_array(writer->arena, DW_WriterFile, 1); - file->path = path; - file->file_idx = writer->line.file_count; + file->path = path; SLLQueuePush(writer->line.first_file, writer->line.last_file, file); writer->line.file_count += 1; @@ -936,7 +964,7 @@ dw_writer_emit(DW_Writer *writer) // line { // push line table terminator - dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_end_sequence()); + dw_writer_line_end_sequence(writer); // find comp dir in the compile unit tag String8 comp_dir = {0}; @@ -945,7 +973,7 @@ dw_writer_emit(DW_Writer *writer) for EachNode(attrib, DW_WriterAttrib, writer->root->first_attrib) { if (attrib->kind == DW_AttribKind_CompDir) { AssertAlways(attrib->form.writer.kind == DW_WriterFormKind_String); - comp_dir = attrib->form.writer.string; + comp_dir = str8_chop_last_slash(attrib->form.writer.string); } else if (attrib->kind == DW_AttribKind_Name) { AssertAlways(attrib->form.writer.kind == DW_WriterFormKind_String); comp_name = attrib->form.writer.string; @@ -964,31 +992,38 @@ dw_writer_emit(DW_Writer *writer) dw_serial_push_uleb128(writer->arena, srl, DW_LNCT_Path); dw_serial_push_uleb128(writer->arena, srl, DW_Form_String); - - // dedup directories String8List dirs = {0}; HashTable *dir_ht = hash_table_init(scratch.arena, writer->line.file_count + 1); // first entry must be compile unit directory hash_table_push_string_u64(scratch.arena, dir_ht, comp_dir, dir_ht->count); - str8_list_push(scratch.arena, &dirs, comp_dir); + if (comp_dir.size == 2 && char_is_alpha(comp_dir.str[0]) && comp_dir.str[1] == ':') { + str8_list_pushf(scratch.arena, &dirs, "%S/", comp_dir); + } else { + str8_list_push(scratch.arena, &dirs, comp_dir); + } for EachNode(file, DW_WriterFile, writer->line.first_file) { String8 path = str8_chop_last_slash(file->path); + if (path.size == 0) { + continue; + } if ( ! hash_table_search_string_u64(dir_ht, path, &file->dir_idx)) { + // @dir_idx file->dir_idx = hash_table_push_string_u64(scratch.arena, dir_ht, path, dir_ht->count)->v.value_u64; - str8_list_push(scratch.arena, &dirs, path); + if (path.size == 2 && char_is_alpha(path.str[0]) && path.str[1] == ':') { + str8_list_pushf(scratch.arena, &dirs, "%S/", path); + } else { + str8_list_push(scratch.arena, &dirs, path); + } } } - KeyValuePair *dirs_kv = key_value_pairs_from_hash_table(scratch.arena, dir_ht); - //sort_key_value_pairs_as_string_sensitive(dirs_kv, dir_ht->count); // (15) directories_count - dw_serial_push_uleb128(writer->arena, srl, dir_ht->count); + dw_serial_push_uleb128(writer->arena, srl, dirs.node_count); // (16) directories - for (U64 i = 0; i < dir_ht->count; i += 1) { - String8 dir = dirs_kv[i].key_string; - dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, (DW_WriterXForm) { .reader = { .kind = DW_Form_String, .string = dir } }); + for EachNode(dir_n, String8Node, dirs.first) { + dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, (DW_WriterXForm) { .reader = { .kind = DW_Form_String, .string = dir_n->string } }); } scratch_end(scratch); @@ -1014,10 +1049,10 @@ dw_writer_emit(DW_Writer *writer) // enable encodings in use for EachNode(file, DW_WriterFile, writer->line.first_file) { - if (file->time_stamp != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_TimeStamp ) = DW_Form_UData; } - if (file->size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Size ) = DW_Form_UData; } - if (file->md5.size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_MD5 ) = DW_Form_Block; } - if (file->source.size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_LLVM_Source) = DW_Form_String; } + if (file->time_stamp != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_TimeStamp ) = DW_Form_UData; } + if (file->size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Size ) = DW_Form_UData; } + if ( ! u128_match(file->md5, u128_zero())) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_MD5 ) = DW_Form_Block; } + if (file->source.size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_LLVM_Source) = DW_Form_String; } } // count needed encodings @@ -1057,11 +1092,15 @@ dw_writer_emit(DW_Writer *writer) } } } + U64 file_idx = 0; for EachNode(file, DW_WriterFile, writer->line.first_file) { static DW_WriterXForm null_form_udata = { .reader = { .kind = DW_Form_UData } }; static DW_WriterXForm null_form_string = { .reader = { .kind = DW_Form_String } }; static DW_WriterXForm null_form_block = { .reader = { .kind = DW_Form_Block } }; + // @file_idx + file->file_idx = file_idx++; + // path Assert(*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Path) == DW_Form_String); String8 file_name = str8_skip_last_slash(file->path); @@ -1095,8 +1134,8 @@ dw_writer_emit(DW_Writer *writer) // MD5 if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_MD5) == DW_Form_Block) { - if (file->md5.size) { - DW_WriterXForm md5_form = { .reader = { .kind = DW_Form_Block, .block = file->md5 } }; + if ( ! u128_match(file->md5, u128_zero())) { + DW_WriterXForm md5_form = { .reader = { .kind = DW_Form_Block, .block = str8_struct(&file->md5) } }; dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, md5_form); } else { dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, null_form_block); @@ -1143,9 +1182,9 @@ dw_writer_emit(DW_Writer *writer) // (11) opcode_base str8_serial_push_struct(writer->arena, srl, &writer->line.opcode_base); // (12) standard_opcode_lengths - U8 *std_op_lens = push_array(writer->arena, U8, DW_StdOpcode_Count - 1); - for (U64 i = 1; i < DW_StdOpcode_Count; i += 1) { std_op_lens[i-1] = dw_length_from_std_opcode(i); } - str8_serial_push_string(writer->arena, srl, str8(std_op_lens, DW_StdOpcode_Count - 1)); + U8 *std_op_lens = push_array(writer->arena, U8, writer->line.opcode_base - 1); + for (U64 i = 1; i < writer->line.opcode_base; i += 1) { std_op_lens[i-1] = dw_length_from_std_opcode(i); } + str8_serial_push_string(writer->arena, srl, str8(std_op_lens, writer->line.opcode_base - 1)); // directory table str8_list_concat_in_place(srl, &dir_table_srl); // file table diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index 466ad5d5..bff6a141 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -135,7 +135,7 @@ typedef struct DW_WriterFile String8 path; U64 time_stamp; U64 size; - String8 md5; + U128 md5; String8 source; // computed during line table emit step U64 file_idx; @@ -306,12 +306,14 @@ internal DW_LineInstNode * dw_line_inst_list_push (Arena *arena, DW_LineInst #define DW_LNE_set_address(a) (DW_LineInst){ .opcode = DW_StdOpcode_ExtendedOpcode, .ext = DW_ExtOpcode_SetAddress, .set_address = a } #define DW_LNE_set_discriminator(d) (DW_LineInst){ .opcode = DW_StdOpcode_ExtendedOpcode, .ext = DW_ExtOpcode_SetDiscriminator, .set_discriminator = d } -internal void dw_writer_line_emit (DW_Writer *writer, DW_WriterFile *file, U64 ln, U64 col, U64 addr); -internal void dw_writer_line_set_address (DW_Writer *writer, U64 address); -internal void dw_writer_line_set_prologue_end(DW_Writer *writer); -internal void dw_writer_line_epilogue_begin (DW_Writer *writer); -internal void dw_writer_line_set_isa (DW_Writer *writer, U64 isa); -internal DW_WriterFile * dw_writer_new_file (DW_Writer *writer, String8 path); +internal void dw_writer_line_emit (DW_Writer *writer, DW_WriterFile *file, U64 ln, U64 col, U64 addr); +internal void dw_writer_line_set_address (DW_Writer *writer, U64 address); +internal void dw_writer_line_set_discriminator(DW_Writer *writer, U64 d); +internal void dw_writer_line_end_sequence (DW_Writer *writer); +internal void dw_writer_line_set_prologue_end (DW_Writer *writer); +internal void dw_writer_line_epilogue_begin (DW_Writer *writer); +internal void dw_writer_line_set_isa (DW_Writer *writer, U64 isa); +internal DW_WriterFile * dw_writer_new_file (DW_Writer *writer, String8 path); //////////////////////////////// // Emit diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index c548091b..22529068 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2564,7 +2564,7 @@ d2r_src_file_lookup_compar(void *raw_a, void *raw_b) String8 dir_path_b = b->vm->header.dir_table.v[file_b->dir_idx]; int cmp = str8_compar(dir_path_a, dir_path_b, 0); if (cmp == 0) { - cmp = str8_compar(file_a->file_name, file_b->file_name, 0); + cmp = str8_compar(file_a->path, file_b->path, 0); } return cmp; } @@ -2587,9 +2587,9 @@ d2r_hash_line_file(String8 dir_path, DW_LineFile *file) XXH3_state_t hasher = {0}; XXH3_64bits_reset(&hasher); XXH3_64bits_update(&hasher, dir_path.str, dir_path.size); - XXH3_64bits_update(&hasher, file->file_name.str, file->file_name.size); - XXH3_64bits_update(&hasher, &file->modify_time, sizeof(file->modify_time)); - XXH3_64bits_update(&hasher, &file->md5_digest, sizeof(file->md5_digest)); + XXH3_64bits_update(&hasher, file->path.str, file->path.size); + XXH3_64bits_update(&hasher, &file->time_stamp, sizeof(file->time_stamp)); + XXH3_64bits_update(&hasher, &file->md5, sizeof(file->md5)); XXH64_hash_t hash = XXH3_64bits_digest(&hasher); return hash; } @@ -2841,18 +2841,18 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { String8List path_list = {0}; str8_list_push_node(&path_list, &(String8Node){ .string = lookup->vm->header.dir_table.v[src->dir_idx] }); - str8_list_push_node(&path_list, &(String8Node){ .string = src->file_name }); + str8_list_push_node(&path_list, &(String8Node){ .string = src->path }); path = str8_path_list_join_by_style(arena, &path_list, path_style); } // fill out source file dst->path = path; - if ( ! u128_match(src->md5_digest, u128_zero())) { + if ( ! u128_match(src->md5, u128_zero())) { dst->checksum_kind = RDI_ChecksumKind_MD5; - dst->checksum = str8_copy(arena, str8_struct(&src->md5_digest)); - } else if (src->modify_time != 0) { + dst->checksum = str8_copy(arena, str8_struct(&src->md5)); + } else if (src->time_stamp != 0) { dst->checksum_kind = RDI_ChecksumKind_Timestamp; - dst->checksum = str8_copy(arena, str8_struct(&src->modify_time)); + dst->checksum = str8_copy(arena, str8_struct(&src->time_stamp)); } lookup->src_file = dst; @@ -2891,7 +2891,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) (line_buffer_size >= D2R_LineBufferMax || line_buffer->file_index != vm->state.file_index)) && line_buffer_size > 0) { // lookup source file - DW_LineFile *file = &vm->header.file_table.v[vm->state.file_index]; + DW_LineFile *file = &vm->header.file_table.v[line_buffer->file_index]; U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); D2R_SrcFileLookup *lookup = lfht_search(src_file_lfht, hash, &(D2R_SrcFileLookup){ .file = file, .vm = vm }, d2r_src_file_lookup_is_equal, 0); RDIM_SrcFile *src_file = lookup->src_file; diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 2641aefd..820cdfd3 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -34,7 +34,7 @@ t_dw_test_sleb128(U64 v, U64 expected_length) String8 e = dw_write_sleb128(scratch.arena, v0); if (!(expected_length == e.size)) { goto exit; } - U64 v1; + S64 v1; U64 bytes_read = str8_deserial_read_sleb128(e, 0, &v1); if (!(bytes_read == e.size)) { goto exit; } if (!(v0 == v1)) { goto exit; } @@ -55,6 +55,8 @@ T_BeginTest(test_leb128) T_Ok(t_dw_test_sleb128(min_S64, 10)); T_Ok(t_dw_test_sleb128(max_S64, 10)); + T_Ok(t_dw_test_uleb128(0xDEADBEEFCAFEBABE, 10)); + for EachIndex(i, 64) { T_Ok(t_dw_test_uleb128((1ull << i), 1 + (i / 7))); } @@ -102,45 +104,419 @@ exit:; return is_match; } -internal DW_Writer * -dwt_make_writer(void) +internal DW_Input +dw_input_from_writer(Arena *arena, DW_Writer *writer) { - Temp scratch = scratch_begin(0, 0); + Temp scratch = scratch_begin(&arena, 1); - String8 comp_dir = t_make_file_path(scratch.arena, str8_lit("")); - String8 comp_name = str8_lit("test_code.txt"); - String8 test_text = str8_lit("nop\nnop\nret\n"); - String8 test_path = t_make_file_path(scratch.arena, comp_name); - t_write_file(comp_name, test_text); + OBJ *obj = obj_alloc(0, Arch_x64); + OBJ_Section *text_section = obj_push_section(obj, str8_lit(".text"), OBJ_SectionFlag_Read|OBJ_SectionFlag_Exec|OBJ_SectionFlag_Load); + str8_serial_push_u8(obj->arena, &text_section->data, 0x90); + str8_serial_push_u8(obj->arena, &text_section->data, 0x90); + str8_serial_push_u8(obj->arena, &text_section->data, 0x90); + str8_serial_push_u8(obj->arena, &text_section->data, 0xc3); + obj_push_symbol(obj, str8_lit("entry"), OBJ_SymbolScope_Global, OBJ_RefKind_Section, text_section); + + dw_writer_emit_to_obj(writer, obj); + String8 raw_coff = coff_from_obj(scratch.arena, obj); + + t_write_file(str8_lit("dwarf.obj"), raw_coff); + t_invoke(str8_lit("radlink"), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full dwarf.obj"), max_U64); + os_delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); + + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)(exe.str + pe.section_table_range.min); + String8 string_table = str8_substr(exe, pe.string_table_range); + DW_Input input = dw_input_from_coff_section_table(arena, exe, string_table, pe.section_count, section_table); + + obj_release(&obj); + scratch_end(scratch); + return input; +} + +T_BeginTest(dwarf_line_opcodes) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + String8 comp_dir = str8_lit("c:/devel/"); + String8 comp_name = str8_lit("test.c"); + U64 address = 0xDEADBEEFCAFEBABE; + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_tag_end(writer); + + // test directory table and file table + DW_WriterFile *file2 = dw_writer_new_file(writer, str8_lit("d:/foobar/qwe.c")); + file2->time_stamp = 123; + file2->size = max_U64; + file2->md5 = *(U128 *)&((U8[sizeof(U128)]) { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }); + file2->source = str8_lit("a quick brown fox jumps over the lazy dog\n"); + DW_WriterFile *file = dw_writer_new_file(writer, comp_name); + file->time_stamp = max_U64; + file->size = 314; + file->md5 = *(U128 *)&((U8[sizeof(U128)]) { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, }); + file->source = str8_lit("int main() { return 057; }\n"); + + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_copy()); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_pc(7)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_pc(-7)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(4)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(-4)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_file(file)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_column(max_U64)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_column(0)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_negate_stmt()); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_negate_stmt()); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_basic_block()); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_const_add_pc()); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_fixed_advance_pc(max_U16)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_prologue_end()); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_epilogue_begin()); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_isa(max_U64)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_address(address)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_discriminator(2)); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_end_sequence()); + + DW_Input input = dw_input_from_writer(scratch.arena, writer); + Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[DW_Section_Info].data); + DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); + DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); + + T_Ok(line_vm->header.dir_table.count == 2); + T_Ok(line_vm->header.file_table.count == 2); + + T_Ok(str8_match(line_vm->header.dir_table.v[0], str8_lit("c:/devel"), 0)); + T_Ok(str8_match(line_vm->header.dir_table.v[1], str8_lit("d:/foobar"), 0)); + + DW_LineFile *file_reader = &line_vm->header.file_table.v[0]; + T_Ok(str8_match(file_reader->path, comp_name, 0)); + T_Ok(file_reader->dir_idx == 0); + T_Ok(file_reader->time_stamp == file->time_stamp); + T_Ok(u128_match(file_reader->md5, file->md5)); + T_Ok(str8_match(file_reader->source, file->source, 0)); + + DW_LineFile *file2_reader = &line_vm->header.file_table.v[1]; + T_Ok(str8_match(file2_reader->path, str8_lit("qwe.c"), 0)); + T_Ok(file2_reader->dir_idx == 1); + T_Ok(file2_reader->time_stamp == file2->time_stamp); + T_Ok(u128_match(file2_reader->md5, file2->md5)); + T_Ok(str8_match(file2_reader->source, file2->source, 0)); + + T_Ok(line_vm->new_line == 0); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_Copy); + T_Ok(line_vm->new_line == 1); + T_Ok(line_vm->state.discriminator == 0); + T_Ok(line_vm->state.basic_block == 0); + T_Ok(line_vm->state.prologue_end == 0); + T_Ok(line_vm->state.epilogue_begin == 0); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); + T_Ok(line_vm->state.address == 7); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); + T_Ok(line_vm->state.address == 0); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 5); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 1); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_SetFile); + T_Ok(line_vm->state.file_index == 0); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_SetColumn); + T_Ok(line_vm->state.column == max_U64); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_SetColumn); + T_Ok(line_vm->state.column == 0); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_NegateStmt); + T_Ok(line_vm->state.is_stmt == 0); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_NegateStmt); + T_Ok(line_vm->state.is_stmt == 1); + + T_Ok(line_vm->state.basic_block == 0); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_SetBasicBlock); + T_Ok(line_vm->state.basic_block == 1); - DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_Last, DW_CompUnitKind_Compile, Arch_x64); - // line { - DW_WriterFile *a_file = dw_writer_new_file(writer, test_path); - dw_writer_line_set_prologue_end(writer); - dw_writer_line_emit(writer, a_file, 1, 0, 0x140001000); - dw_writer_line_emit(writer, a_file, 2, 0, 0x140001001); - dw_writer_line_emit(writer, a_file, 3, 0, 0x140001002); - - //DW_WriterFile *b_file = dw_writer_new_file(writer, str8_lit("~/devel/projects/b/b.c")); - //DW_WriterFile *a_file = dw_writer_new_file(writer, str8_lit("~/devel/projects/a.c")); - //dw_writer_line_set_prologue_end(writer); - //dw_writer_line_emit(writer, b_file, 10, 0, 0x140001000); - //dw_writer_line_emit(writer, b_file, 11, 0, 0x140001010); - //dw_writer_line_emit(writer, a_file, 1, 0, 0x140001016); - //dw_writer_line_emit(writer, a_file, 2, 0, 0x140001020); + U64 addr_before = line_vm->state.address; + U64 const_advance = (0xffu - line_vm->header.opcode_base) / line_vm->header.line_range; + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(!line_vm->new_line); + T_Ok(line_vm->state.address == addr_before + const_advance); } + + T_Ok(line_vm->state.address == 0x11); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_FixedAdvancePc); + T_Ok(line_vm->state.address == max_U16 + 0x11); + + T_Ok(line_vm->state.prologue_end == 0); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_SetPrologueEnd); + T_Ok(line_vm->state.prologue_end == 1); + + T_Ok(line_vm->state.epilogue_begin == 0); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_SetEpilogueBegin); + T_Ok(line_vm->state.epilogue_begin == 1); + + T_Ok(line_vm->state.isa == 0); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_SetIsa); + T_Ok(line_vm->state.isa == max_U64); + + T_Ok(line_vm->state.address != address); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + T_Ok(line_vm->ext_opcode == DW_ExtOpcode_SetAddress); + T_Ok(line_vm->state.address == address); + + T_Ok(line_vm->state.discriminator == 0); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + T_Ok(line_vm->ext_opcode == DW_ExtOpcode_SetDiscriminator); + T_Ok(line_vm->state.discriminator == 2); + + T_Ok(!line_vm->state.end_sequence); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); + T_Ok(line_vm->state.end_sequence); + + dw_writer_end(&writer); +} +T_EndTest; + +T_BeginTest(dwarf_line_emit) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + String8 comp_dir = str8_lit("c:/devel/"); + String8 comp_name = str8_lit("test.c"); + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_tag_end(writer); + + // test special opcode writer and reader + DW_WriterFile *file = dw_writer_new_file(writer, comp_name); + + // init sequence + dw_writer_line_emit(writer, file, 10000, 0, 1000); + + for EachIndex(i, abs_s64(writer->line.line_base) + 1) { + dw_writer_line_emit(writer, file, writer->line.ln-i, 0, writer->line.addr+1); + + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(i)); + writer->line.ln += i; + } + + // special opcode line window underflow, must emit three instructions to advance + dw_writer_line_emit(writer, file, (writer->line.ln + writer->line.line_base) - 1, 0, writer->line.addr + 1); + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(-(writer->line.line_base - 1))); + + for EachIndex(i, (writer->line.line_range + writer->line.line_base) + 1) { + dw_writer_line_emit(writer, file, writer->line.ln+i, 0, writer->line.addr+1); + + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(-i)); + writer->line.ln -= i; + } + + dw_writer_line_end_sequence(writer); + dw_writer_line_emit(writer, file, 1000, 0, writer->line.addr+1); + + // test address window + S64 c = writer->line.line_range + writer->line.line_base; + U64 line_addr_count = 0; + for (S64 i = 0; i < c; ++i) { + U64 ln_delta = i + writer->line.line_base; + S64 max_ln_delta = writer->line.line_range + writer->line.line_base; + S64 max_addr_delta = (max_U8 - writer->line.opcode_base - (ln_delta - writer->line.line_base)) / writer->line.line_range; + for EachIndex(k, max_addr_delta) { + dw_writer_line_emit(writer, file, writer->line.ln + i, 0, writer->line.addr + k); + line_addr_count += 1; + } + } + + DW_Input input = dw_input_from_writer(scratch.arena, writer); + Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[DW_Section_Info].data); + DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); + DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); + + // check init sequence + { + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_SetFile); + T_Ok(line_vm->state.file_index == 0); + T_Ok(line_vm->new_line == 0); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); + T_Ok(line_vm->state.address == 1000); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->new_line == 0); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_Copy); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->state.address == 1000); + T_Ok(line_vm->new_line == 1); + } + + { + U64 pc = line_vm->state.address; + for EachIndex(i, abs_s64(writer->line.line_base) + 1) { + pc += 1; + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == 0x20 - i); + T_Ok(line_vm->state.line == 10000 - i); + T_Ok(line_vm->state.address == pc); + T_Ok(line_vm->new_line == 1); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->state.address == pc); + } + + // line window underflow check + { + pc += 1; + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->state.address == pc); + T_Ok(!line_vm->new_line); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 9994); + T_Ok(line_vm->state.address == pc); + T_Ok(!line_vm->new_line); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_Copy); + T_Ok(line_vm->state.line == 9994); + T_Ok(line_vm->state.address == pc); + T_Ok(line_vm->new_line); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->state.address == pc); + T_Ok(!line_vm->new_line); + } + + for EachIndex(i, writer->line.line_range + writer->line.line_base) { + pc += 1; + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == 0x20 + i); + T_Ok(line_vm->state.line == 10000 + i); + T_Ok(line_vm->state.address == pc); + T_Ok(line_vm->new_line); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->state.address == pc); + T_Ok(!line_vm->new_line); + } + + // line window overflow check + { + pc += 1; + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->state.address == pc); + T_Ok(!line_vm->new_line); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 10009); + T_Ok(line_vm->state.address == pc); + T_Ok(!line_vm->new_line); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_Copy); + T_Ok(line_vm->state.address == pc); + T_Ok(line_vm->state.line == 10009); + T_Ok(line_vm->new_line); + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->state.address == pc); + T_Ok(!line_vm->new_line); + } + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); + T_Ok(line_vm->state.line == 10000); + T_Ok(line_vm->state.address == pc); + T_Ok(line_vm->new_line); + } + + { + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(dw_line_vm_step(line_vm)); + + for EachIndex(i, line_addr_count/*first line is a noop*/-1) { + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->header.opcode_base < line_vm->opcode); + T_Ok(line_vm->new_line); + } + + T_Ok(dw_line_vm_step(line_vm)); + T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); + T_Ok(line_vm->state.line == 1586); + T_Ok(line_vm->state.address == 1161); + T_Ok(line_vm->new_line); + } +} +T_EndTest; + +T_BeginTest(dwarf_writer) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); // info { dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); dw_writer_push_attrib_enum(writer, DW_AttribKind_Language, DW_Language_C99); dw_writer_push_attrib_flag(writer, DW_AttribKind_UseUtf8, 1); - dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140001000); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x140001003); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x140001004); { DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); @@ -183,7 +559,7 @@ dwt_make_writer(void) dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140001000); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x140001003); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x140001004); dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("main")); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, simple_struct_tag); dw_writer_push_attrib_expression(writer, DW_AttribKind_FrameBase, &(DW_ExprEnc)DW_ExprEnc_Op(Reg7), 1); @@ -192,47 +568,12 @@ dwt_make_writer(void) dw_writer_tag_end(writer); } - { - DW_Input input; - { - OBJ *obj = obj_alloc(0, Arch_x64); - OBJ_Section *text_section = obj_push_section(obj, str8_lit(".text"), OBJ_SectionFlag_Read|OBJ_SectionFlag_Exec|OBJ_SectionFlag_Load); - str8_serial_push_u8(obj->arena, &text_section->data, 0x90); - str8_serial_push_u8(obj->arena, &text_section->data, 0x90); - str8_serial_push_u8(obj->arena, &text_section->data, 0xc3); - obj_push_symbol(obj, str8_lit("entry"), OBJ_SymbolScope_Global, OBJ_RefKind_Section, text_section); + DW_Input input = dw_input_from_writer(scratch.arena, writer); + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); + DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, lu_input, 0, 1); + DW_TagTree tag_tree = dw_tag_tree_from_cu(scratch.arena, &input, &cu); + AssertAlways(dwt_tags_must_match(writer->root, tag_tree.root)); - dw_writer_emit_to_obj(writer, obj); - - String8 raw_coff = coff_from_obj(scratch.arena, obj); - COFF_FileHeaderInfo obj_coff_header = coff_file_header_info_from_data(raw_coff); - String8 raw_sections = str8_substr(raw_coff, obj_coff_header.section_table_range); - U64 section_count = raw_sections.size / sizeof(COFF_SectionHeader); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_sections.str; - String8 string_table = str8_substr(raw_coff, obj_coff_header.string_table_range); - input = dw_input_from_coff_section_table(scratch.arena, raw_coff, string_table, section_count, section_table); - - t_write_file(str8_lit("dwarf.obj"), raw_coff); - - t_invoke(str8_lit("radlink"), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full dwarf.obj"), max_U64); - - obj_release(&obj); - } - - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); - DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, lu_input, 0, 1); - DW_TagTree tag_tree = dw_tag_tree_from_cu(scratch.arena, &input, &cu); - AssertAlways(dwt_tags_must_match(writer->root, tag_tree.root)); - - } - - scratch_end(scratch); - return writer; -} - -T_BeginTest(dwarf_writer) -{ - DW_Writer *writer = dwt_make_writer(); // validate the writer @@ -250,7 +591,7 @@ T_BeginTest(dwarf_writer) T_Ok(comp_unit_tag->kind == DW_TagKind_CompileUnit); T_Ok(comp_unit_tag->next == 0); T_Ok(comp_unit_tag->parent == 0); - T_Ok(comp_unit_tag->attrib_count == 3); + T_Ok(comp_unit_tag->attrib_count == 5); T_Ok(comp_unit_tag->abbrev_id == 1); T_Ok(comp_unit_tag->info_off == 0xc); @@ -278,7 +619,7 @@ T_BeginTest(dwarf_writer) T_Ok(char_type_tag->parent == comp_unit_tag); T_Ok(char_type_tag->attrib_count == 3); T_Ok(char_type_tag->abbrev_id == 2); - T_Ok(char_type_tag->info_off == 0x20); + T_Ok(char_type_tag->info_off == 0x30); T_Ok(char_type_tag->first_attrib != char_type_tag->last_attrib); DW_WriterAttrib *byte_size_attrib = char_type_tag->first_attrib; @@ -306,7 +647,7 @@ T_BeginTest(dwarf_writer) T_Ok(const_type_tag->parent == comp_unit_tag); T_Ok(const_type_tag->attrib_count == 1); T_Ok(const_type_tag->abbrev_id == 3); - T_Ok(const_type_tag->info_off == 0x28); + T_Ok(const_type_tag->info_off == 0x38); T_Ok(const_type_tag->first_attrib && const_type_tag->first_attrib == const_type_tag->last_attrib); DW_WriterAttrib *type_attrib = const_type_tag->first_attrib; @@ -322,7 +663,7 @@ T_BeginTest(dwarf_writer) T_Ok(dup_char_type_tag->parent == comp_unit_tag); T_Ok(dup_char_type_tag->attrib_count == 3); T_Ok(dup_char_type_tag->abbrev_id == 2); - T_Ok(dup_char_type_tag->info_off == 0x2a); + T_Ok(dup_char_type_tag->info_off == 0x3a); T_Ok(dup_char_type_tag->first_attrib != dup_char_type_tag->last_attrib); DW_WriterAttrib *byte_size_attrib = dup_char_type_tag->first_attrib; @@ -350,7 +691,7 @@ T_BeginTest(dwarf_writer) T_Ok(simple_struct_tag->parent == comp_unit_tag); T_Ok(simple_struct_tag->attrib_count == 2); T_Ok(simple_struct_tag->abbrev_id == 4); - T_Ok(simple_struct_tag->info_off == 0x32); + T_Ok(simple_struct_tag->info_off == 0x42); DW_WriterAttrib *simple_struct_name = simple_struct_tag->first_attrib; T_Ok(simple_struct_name->kind == DW_AttribKind_Name); @@ -362,7 +703,7 @@ T_BeginTest(dwarf_writer) T_Ok(m0_tag->kind == DW_TagKind_Member); T_Ok(m0_tag->parent == simple_struct_tag); T_Ok(m0_tag->attrib_count == 3); - T_Ok(m0_tag->info_off == 0x3b); + T_Ok(m0_tag->info_off == 0x4b); T_Ok(m0_tag->abbrev_id == 5); DW_WriterAttrib *name = m0_tag->first_attrib; @@ -373,7 +714,7 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); T_Ok(type->form.reader.kind == DW_Form_Ref1); - T_Ok(type->form.reader.ref == 0x20); + T_Ok(type->form.reader.ref == 0x30); DW_WriterAttrib *data_loc = type->next; T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); @@ -387,7 +728,7 @@ T_BeginTest(dwarf_writer) T_Ok(m1_tag->kind == DW_TagKind_Member); T_Ok(m1_tag->parent == simple_struct_tag); T_Ok(m1_tag->attrib_count == 4); - T_Ok(m1_tag->info_off == 0x41); + T_Ok(m1_tag->info_off == 0x51); T_Ok(m1_tag->abbrev_id == 6); DW_WriterAttrib *name = m1_tag->first_attrib; @@ -398,7 +739,7 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); T_Ok(type->form.reader.kind == DW_Form_Ref1); - T_Ok(type->form.reader.ref == 0x20); + T_Ok(type->form.reader.ref == 0x30); DW_WriterAttrib *data_loc = type->next; T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); @@ -433,13 +774,13 @@ T_BeginTest(dwarf_writer) T_Ok(low_pc->kind == DW_AttribKind_LowPc); T_Ok(low_pc->form.reader.kind == DW_Form_Addr); T_Ok(low_pc->form.reader.addr.size == sizeof(U64)); - T_Ok(*(U64 *)low_pc->form.reader.addr.str == 0x14012f2f0); + T_Ok(*(U64 *)low_pc->form.reader.addr.str == 0x140001000); DW_WriterAttrib *high_pc = low_pc->next; T_Ok(high_pc->kind == DW_AttribKind_HighPc); T_Ok(high_pc->form.reader.kind == DW_Form_Addr); T_Ok(high_pc->form.reader.addr.size == sizeof(U64)); - T_Ok(*(U64 *)high_pc->form.reader.addr.str == 0x14012f405); + T_Ok(*(U64 *)high_pc->form.reader.addr.str == 0x140001004); DW_WriterAttrib *name = high_pc->next; T_Ok(name->kind == DW_AttribKind_Name); @@ -651,4 +992,3 @@ T_EndTest; #endif #undef T_Group - From cc00fe7825657c2c7ecddb146e2ecb8a92a1e24d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 22 Feb 2026 20:18:26 -0800 Subject: [PATCH 238/850] minor fixes and improvements for DWARF dumper --- src/dwarf/dwarf.h | 2 +- src/dwarf/dwarf_dump.c | 48 +++++++++++++++++++++--------------------- src/radbin/radbin.c | 45 +++++++++++++++++++++++++++++---------- 3 files changed, 59 insertions(+), 36 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 272f269c..09b87e27 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -158,7 +158,7 @@ typedef enum DW_InlKindEnum X(FixedAdvancePc, 0x09) \ X(SetPrologueEnd, 0x0A) \ X(SetEpilogueBegin, 0x0B) \ - X(SetIsa, 0x0C) \ + X(SetIsa, 0x0C) typedef U8 DW_StdOpcode; typedef enum DW_StdOpcodeEnum diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index de095b6a..b228f6df 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -960,18 +960,18 @@ DW_PRINTER(dw_print_line) { String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(vm->header.opcode_lens, vm->header.num_opcode_lens), 1); String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(", ")}); - dw_printf("version: %u\n", vm->header.version ); - dw_printf("line_table_size: %I64u\n", vm->header.unit_length ); - dw_printf("address_size: %u\n", vm->header.address_size ); - dw_printf("segment_selector_size: %u\n", vm->header.segment_selector_size); - dw_printf("header_length: %I64u\n", vm->header.header_length ); - dw_printf("min_instruction_length: %u\n", vm->header.min_inst_len ); - dw_printf("max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); - dw_printf("default_is_stmt: %u\n", vm->header.default_is_stmt ); - dw_printf("line_base: %d\n", vm->header.line_base ); - dw_printf("line_range: %u\n", vm->header.line_range ); - dw_printf("opcode_base: %u\n", vm->header.opcode_base ); - dw_printf("opcode_lengths: { %S }\n", opcode_lengths_string ); + dw_printf("version: %u\n", vm->header.version ); + dw_printf("line_table_size: %I64u\n", vm->header.unit_length ); + dw_printf("address_size: %u\n", vm->header.address_size ); + dw_printf("segment_selector_size: %u\n", vm->header.segment_selector_size); + dw_printf("header_length: %I64u\n", vm->header.header_length ); + dw_printf("min_instruction_length: %u\n", vm->header.min_inst_len ); + dw_printf("max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); + dw_printf("default_is_stmt: %u\n", vm->header.default_is_stmt ); + dw_printf("line_base: %d\n", vm->header.line_base ); + dw_printf("line_range: %u\n", vm->header.line_range ); + dw_printf("opcode_base: %u\n", vm->header.opcode_base ); + dw_printf("opcode_lengths: { %S }\n", opcode_lengths_string ); } dw_unindent(); dw_printf("}\n"); @@ -983,11 +983,9 @@ DW_PRINTER(dw_print_line) { dw_printf("// %-4s %-30s\n", "No.", "Name"); dw_printf("// ---- ------------------------------\n"); - String8 cu_comp_dir = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_CompDir); - dw_printf("{ %-4I64u %-30S }\n", 0, cu_comp_dir); for EachIndex(dir_idx, vm->header.dir_table.count) { - dw_printf("{ %-4I64u %-30S }\n", dir_idx+1, vm->header.dir_table.v[dir_idx]); + dw_printf("{ %-4I64u %-30S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); } } dw_unindent(); @@ -998,7 +996,7 @@ DW_PRINTER(dw_print_line) dw_printf("{\n"); dw_indent(); { - dw_printf("// %-4s %-8s %-8s %-33s %-8s %-20s\n", "No.", "Dir No.", "Time", "MD5", "Size", "Name"); + dw_printf("// %-4s %-8s %-8s %-33s %-8s %-20s\n", "No.", "Dir No.", "Time", "MD5", "Size", "Path"); dw_printf("// ---- -------- -------- --------------------------------- -------- --------------------\n"); for EachIndex(file_idx, vm->header.file_table.count) { @@ -1006,11 +1004,11 @@ DW_PRINTER(dw_print_line) dw_printf("{ %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %-20S }\n", file_idx, file->dir_idx, - file->modify_time, - file->md5_digest.u64[1], - file->md5_digest.u64[0], - file->file_size, - file->file_name); + file->time_stamp, + file->md5.u64[1], + file->md5.u64[0], + file->size, + file->path); } } dw_unindent(); @@ -1038,8 +1036,10 @@ DW_PRINTER(dw_print_line) str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); // push opcode id - String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); - str8_list_push(arena, &opcode_fmt, opcode_str); + if (vm->opcode != 0) { + String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); + str8_list_pushf(arena, &opcode_fmt, "%-11S:", opcode_str); + } // print operands switch(vm->opcode) @@ -1103,7 +1103,7 @@ DW_PRINTER(dw_print_line) }break; case DW_StdOpcode_ExtendedOpcode: { - str8_list_push(opcode_temp.arena, &opcode_fmt, dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S*", dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); switch(vm->ext_opcode) { diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 372834f8..99bcd7be 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -341,6 +341,21 @@ rb_thread_entry_point(void *p) } scratch_end(scratch); } + + if(file_format == RB_FileFormat_COFF_OBJ || file_format == RB_FileFormat_COFF_BigOBJ) + { + Temp scratch = scratch_begin(&arena, 1); + COFF_FileHeaderInfo coff_obj = coff_file_header_info_from_data(file_data); + String8 string_table = str8_substr(file_data, coff_obj.string_table_range); + U64 section_count = coff_obj.section_count_no_null; + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(file_data, coff_obj.section_table_range).str; + if(dw_is_dwarf_present_coff_section_table(string_table, section_count, section_table)) + { + log_infof("DWARF data detected in %S (%S)\n", n->string, rb_file_format_display_name_table[file_format]); + file_format_flags |= RB_FileFormatFlag_HasDWARF; + } + scratch_end(scratch); + } ////////////////////////// //- rjf: ELF => check if contains DWARF @@ -1101,22 +1116,30 @@ rb_thread_entry_point(void *p) lane_sync(); //- rjf: unpack file parses - Arch arch = Arch_Null; - PE_BinInfo pe = {0}; - ELF_Bin elf = {0}; - DW_Input dw = {0}; - U64 eh_frame_hdr_vaddr = 0; - U64 eh_frame_vaddr = 0; - String8 eh_frame_hdr = {0}; - String8 eh_frame = {0}; + Arch arch = Arch_Null; + PE_BinInfo pe = {0}; + ELF_Bin elf = {0}; + COFF_FileHeaderInfo coff_obj = {0}; + DW_Input dw = {0}; + U64 eh_frame_hdr_vaddr = 0; + U64 eh_frame_vaddr = 0; + String8 eh_frame_hdr = {0}; + String8 eh_frame = {0}; { if(f->format == RB_FileFormat_PE) { - pe = pe_bin_info_from_data(arena, f->data); + pe = pe_bin_info_from_data(arena, f->data); arch = pe.arch; } - if(f->format == RB_FileFormat_ELF32 || - f->format == RB_FileFormat_ELF64) + else if(f->format == RB_FileFormat_COFF_OBJ || f->format == RB_FileFormat_COFF_BigOBJ) + { + coff_obj = coff_file_header_info_from_data(f->data); + String8 string_table = str8_substr(f->data, coff_obj.string_table_range); + U64 section_count = coff_obj.section_count_no_null; + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(f->data, coff_obj.section_table_range).str; + dw = dw_input_from_coff_section_table(arena, f->data, string_table, section_count, section_table); + } + else if(f->format == RB_FileFormat_ELF32 || f->format == RB_FileFormat_ELF64) { elf = elf_bin_from_data(arena, f->data); arch = arch_from_elf_machine(elf.hdr.e_machine); From 8b7215695b8e8cfb5c9764841a94ec5f24c241de Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 22 Feb 2026 22:34:28 -0800 Subject: [PATCH 239/850] test DWARF32 and DWARF64 unit encodings --- src/base/base_core.c | 6 ++++ src/base/base_core.h | 1 + src/dwarf/dwarf.h | 1 - src/dwarf/dwarf_coff.c | 2 +- src/dwarf/dwarf_parse.c | 40 ++++++++++++++++++------- src/dwarf/dwarf_writer.c | 6 ++-- src/torture/torture_dwarf.c | 59 ++++++++++++++++++++++++++++++++++++- 7 files changed, 98 insertions(+), 17 deletions(-) diff --git a/src/base/base_core.c b/src/base/base_core.c index 372fd6f3..80fc9682 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -300,6 +300,12 @@ memory_write32(void *ptr, U32 v) MemoryCopy(ptr, &v, sizeof(v)); } +internal void UBSAN_NO_ALIGN +memory_write64(void *ptr, U64 v) +{ + MemoryCopy(ptr, &v, sizeof(v)); +} + internal U8 UBSAN_NO_ALIGN memory_read8(void *ptr) { diff --git a/src/base/base_core.h b/src/base/base_core.h index cace62da..b99139ff 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -1011,6 +1011,7 @@ internal B32 memory_is_zero(void *ptr, U64 size); internal void memory_write16(void *ptr, U16 v); internal void memory_write32(void *ptr, U32 v); +internal void memory_write64(void *ptr, U64 v); internal U8 memory_read8(void *ptr); internal U16 memory_read16(void *ptr); diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 09b87e27..7ddd9f1a 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -29,7 +29,6 @@ typedef enum DW_ExtEnum DW_Ext_All = DW_Ext_GNU|DW_Ext_LLVM|DW_Ext_APPLE|DW_Ext_MIPS, } DW_ExtEnum; -#define DW_FormatFromSize(size) ((size) >= max_U32 ? DW_Format_64Bit : DW_Format_32Bit) typedef enum DW_Format { DW_Format_Null, diff --git a/src/dwarf/dwarf_coff.c b/src/dwarf/dwarf_coff.c index 2c6614f9..3cf7bea3 100644 --- a/src/dwarf/dwarf_coff.c +++ b/src/dwarf/dwarf_coff.c @@ -35,7 +35,7 @@ dw_input_from_coff_section_table(Arena *arena, for (U64 i = 0; i < section_count; ++i) { COFF_SectionHeader *header = §ion_table[i]; - Rng1U64 raw_data_range = rng_1u64(header->foff, header->foff + header->fsize); + Rng1U64 raw_data_range = rng_1u64(header->foff, header->vsize ? header->foff + header->vsize : header->foff + header->fsize); String8 name = coff_name_from_section_header(string_table, header); DW_SectionKind s = dw_section_kind_from_string(name); diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 628099fa..6e0c5849 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -12,13 +12,14 @@ internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) { U64 bytes_read = 0; - if (str8_deserial_read(string, off, size_out, sizeof(U32), sizeof(U32))) { - if (*size_out == max_U32) { - if (str8_deserial_read_struct(string, off+sizeof(U32), size_out)) { + U32 first_four_bytes; + if (str8_deserial_read_struct(string, off, &first_four_bytes) == sizeof(first_four_bytes)) { + if (first_four_bytes == max_U32) { + if (str8_deserial_read_struct(string, off+sizeof(U32), size_out) == sizeof(U64)) { bytes_read = sizeof(U32) + sizeof(U64); } } else { - *size_out &= (U64)max_U32; + *size_out = first_four_bytes; bytes_read = sizeof(U32); } } @@ -273,6 +274,10 @@ internal U64 dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out) { U64 header_size = 0; + + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(unit_data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; U64 unit_length = 0; U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); @@ -291,12 +296,13 @@ dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out) lu_out->version = version; lu_out->address_size = 0; lu_out->segment_selector_size = 0; - lu_out->entry_size = dw_size_from_format(DW_FormatFromSize(unit_length)); + lu_out->entry_size = dw_size_from_format(format); lu_out->entries = str8_skip(unit_data, header_size); } } } + exit:; return header_size; } @@ -304,6 +310,10 @@ internal U64 dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) { U64 header_size = 0; + + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(unit_data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; U64 unit_length = 0; U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); @@ -330,7 +340,7 @@ dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) lu_out->version = version; lu_out->address_size = address_size; lu_out->segment_selector_size = segment_selector_size; - lu_out->entry_size = dw_size_from_format(DW_FormatFromSize(unit_length)); + lu_out->entry_size = dw_size_from_format(format); lu_out->entries = str8_skip(unit_data, header_size); } } @@ -338,6 +348,7 @@ dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) } } + exit:; return header_size; } @@ -1972,6 +1983,10 @@ internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 cu_header_offset, B32 relaxed) { DW_CompUnit cu = {0}; + + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; // read unit size in bytes U64 length = 0; @@ -1987,7 +2002,6 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 DW_Version version; TryRead(str8_deserial_read_struct(info, info_cursor, &version), info_cursor, exit); - DW_Format format = DW_FormatFromSize(length); U64 abbrev_base = max_U64; U8 address_size = 0; DW_CompUnitKind unit_kind = DW_CompUnitKind_Reserved; @@ -2202,11 +2216,14 @@ dw_read_line_vm_header(Arena *arena, { Temp scratch = scratch_begin(&arena, 1); + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(cu_stmt_list, 0, &first_four_bytes) != sizeof(U32)) { goto exit; } + // read unit length U64 length = 0; U64 length_size = str8_deserial_read_dwarf_packed_size(cu_stmt_list, 0, &length); - DW_Format format = DW_FormatFromSize(length); + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; U64 cursor = length_size; String8 data = str8_substr(cu_stmt_list, r1u64(0, length + length_size)); @@ -2723,7 +2740,10 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_Sect String8 section_data = input->sec[section_kind].data; for(U64 cursor = 0; cursor < section_data.size; ) { - + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { break; } + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + U64 unit_length = 0; U64 unit_length_size = str8_deserial_read_dwarf_packed_size(section_data, cursor, &unit_length); if (unit_length_size == 0) { @@ -2742,8 +2762,6 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_Sect break; } - DW_Format format = DW_FormatFromSize(unit_length); - U64 debug_info_off = 0; cursor += str8_deserial_read_dwarf_uint(section_data, cursor, format, &debug_info_off); if (cursor >= cursor_opl) { diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index e534d1d9..b5746c1c 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -1212,15 +1212,15 @@ dw_writer_emit(DW_Writer *writer) for EachElement(i, writer->sections) { if (writer->sections[i].length) { if (writer->format == DW_Format_64Bit) { - U64 *length = writer->sections[i].length; + U64 *length = (U64 *)((U8 *)writer->sections[i].length + sizeof(U32)); U64 length_size = sizeof(U64) + sizeof(U32); Assert(writer->sections[i].srl.total_size >= length_size); - *length = writer->sections[i].srl.total_size - length_size; + memory_write64(length, writer->sections[i].srl.total_size - length_size); } else { U32 *length = writer->sections[i].length; U32 length_size = sizeof(U32); Assert(writer->sections[i].srl.total_size >= length_size); - *length = safe_cast_u32(writer->sections[i].srl.total_size - length_size); + memory_write32(length, safe_cast_u32(writer->sections[i].srl.total_size - length_size)); } } } diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 820cdfd3..421d5b98 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -135,6 +135,64 @@ dw_input_from_writer(Arena *arena, DW_Writer *writer) return input; } +T_BeginTest(dwarf_32bit) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_tag_end(writer); + + DW_Input input = dw_input_from_writer(scratch.arena, writer); + + for EachElement(sec_idx, input.sec) { + if (sec_idx == DW_Section_Abbrev) continue; + Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[sec_idx].data); + for EachIndex(range_idx, unit_ranges.count) { + Rng1U64 range = unit_ranges.v[range_idx]; + + U32 first_four_bytes = 0; + T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &first_four_bytes) == sizeof(first_four_bytes)); + T_Ok(first_four_bytes + 4 == dim_1u64(range)); + + U32 unit_length = 0; + T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &unit_length) == sizeof(U32)); + T_Ok(unit_length + 4 == dim_1u64(range)); + } + } + + dw_writer_end(&writer); +} +T_EndTest; + +T_BeginTest(dwarf_64bit) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_64Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_tag_end(writer); + + DW_Input input = dw_input_from_writer(scratch.arena, writer); + + for EachElement(sec_idx, input.sec) { + if (sec_idx == DW_Section_Abbrev) continue; + Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[sec_idx].data); + for EachIndex(range_idx, unit_ranges.count) { + Rng1U64 range = unit_ranges.v[range_idx]; + + U32 first_four_bytes = 0; + T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &first_four_bytes) == sizeof(first_four_bytes)); + T_Ok(first_four_bytes == max_U32); + + U64 unit_length = 0; + T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min + sizeof(U32), &unit_length) == sizeof(U64)); + T_Ok(unit_length + 12 == dim_1u64(range)); + } + } + + dw_writer_end(&writer); +} +T_EndTest; + T_BeginTest(dwarf_line_opcodes) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); @@ -574,7 +632,6 @@ T_BeginTest(dwarf_writer) DW_TagTree tag_tree = dw_tag_tree_from_cu(scratch.arena, &input, &cu); AssertAlways(dwt_tags_must_match(writer->root, tag_tree.root)); - // validate the writer T_Ok(writer->current == 0); From f07ea37df7b40b2d5759e1c3c6b15c0be4785933 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 23 Feb 2026 10:45:05 -0800 Subject: [PATCH 240/850] missed format spot --- src/rdi_from_dwarf/rdi_from_dwarf.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 22529068..8f936466 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2617,9 +2617,12 @@ d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) String8 unit_data = str8_substr(input->sec[DW_Section_ARanges].data, range_n->v); U64 unit_cursor = 0; + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } + DW_Format unit_format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + U64 unit_length; TryRead(str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length), unit_cursor, exit); - DW_Format unit_format = DW_FormatFromSize(unit_length); DW_Version version; TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &version), unit_cursor, exit); From b022492c7b664f3109fe6829c44b3a978c8c2b3a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 23 Feb 2026 11:37:36 -0800 Subject: [PATCH 241/850] use-after-poison fixes --- src/rdi_make/rdi_make_local.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 4f5b1bd6..c41c63d2 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -765,6 +765,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 *arranged_voffs = rdim_shared->baked_line_tables.line_table_voffs + dst_line_table->voffs_base_idx; RDI_Line *arranged_lines = rdim_shared->baked_line_tables.line_table_lines + dst_line_table->lines_base_idx; RDI_Column *arranged_cols = rdim_shared->baked_line_tables.line_table_columns + dst_line_table->cols_base_idx; + if(sorted_line_keys_count > 0) { for EachIndex(idx, sorted_line_keys_count) { @@ -1031,9 +1032,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } + lane_sync(); scratch_end(scratch); } - lane_sync(); RDIM_BakeStringMapTight *bake_strings = &rdim_shared->bake_strings; ////////////////////////////////////////////////////////////// From 6e1816a01c01421d09d331f5d04da1fc12ddf542 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 23 Feb 2026 11:42:30 -0800 Subject: [PATCH 242/850] disable crash handler to diagnose crash in github workflows --- src/torture/torture.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index b4744af6..6aed36e3 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -87,7 +87,8 @@ t_run(T_Run run) { T_RunCtx ctx = {0}; ctx.run = run; - os_safe_call(t_run_caller, t_run_fail_handler, &ctx); + //os_safe_call(t_run_caller, t_run_fail_handler, &ctx); + t_run_caller(&ctx); return ctx.result; } From 2df9a155c6d0fd8f81ae765bfe2f48ce487e7ca8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 23 Feb 2026 11:54:37 -0800 Subject: [PATCH 243/850] build radbin for torture --- .github/workflows/builds.yml | 7 ++++--- src/torture/torture.c | 3 +-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 195f02ce..e459000a 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -31,7 +31,7 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build "${{ matrix.target }}" "${{ matrix.compiler }}" "${{ matrix.mode }}" || exit /b 1 + call build meta "${{ matrix.target }}" "${{ matrix.compiler }}" "${{ matrix.mode }}" || exit /b 1 run-torture: runs-on: windows-2022 @@ -46,7 +46,8 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build radlink san debug no_meta || exit /b 1 - call build torture debug no_meta || exit /b 1 + call build radbin san debug || exit /b 1 + call build radlink san debug || exit /b 1 + call build torture debug || exit /b 1 cd build torture -l:radlink || exit /b 1 diff --git a/src/torture/torture.c b/src/torture/torture.c index 6aed36e3..b4744af6 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -87,8 +87,7 @@ t_run(T_Run run) { T_RunCtx ctx = {0}; ctx.run = run; - //os_safe_call(t_run_caller, t_run_fail_handler, &ctx); - t_run_caller(&ctx); + os_safe_call(t_run_caller, t_run_fail_handler, &ctx); return ctx.result; } From 03ab203fb413cd5a746e909972e46a2e4f440cec Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 23 Feb 2026 11:57:05 -0800 Subject: [PATCH 244/850] warnings --- src/dwarf/dwarf_parse.c | 6 ++++-- src/linker/lnk.c | 2 +- src/linker/pdb_ext/msf_builder.c | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 6e0c5849..ded1b326 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -2216,15 +2216,17 @@ dw_read_line_vm_header(Arena *arena, { Temp scratch = scratch_begin(&arena, 1); + U64 cursor = 0; + U32 first_four_bytes = 0; if (str8_deserial_read_struct(cu_stmt_list, 0, &first_four_bytes) != sizeof(U32)) { goto exit; } // read unit length U64 length = 0; U64 length_size = str8_deserial_read_dwarf_packed_size(cu_stmt_list, 0, &length); - DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - U64 cursor = length_size; + + cursor = length_size; String8 data = str8_substr(cu_stmt_list, r1u64(0, length + length_size)); // read unit version diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 812ecfcb..2732944c 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -4335,7 +4335,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT // compute .bss virtual size - this marks start of the common block lnk_finalize_section_layout(common_block_sect, config->file_align, config->function_pad_min); - U64 common_block_cursor = common_block_sect->vsize; + U32 common_block_cursor = common_block_sect->vsize; // compute and assign offsets into the common block for EachIndex(contrib_idx, common_block_contribs_count) { diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index 40a879d5..bf5f9441 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -1155,9 +1155,9 @@ msf_stream_write_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNumber sn, if (is_write_ok) { U64 expected_pos = stream->pos + buffer_size; - U64 pre_size = Min(AlignPadPow2(stream->pos, msf->page_size), buffer_size); - U64 mid_size = AlignDownPow2(buffer_size - pre_size, msf->page_size); - U64 end_size = buffer_size - (pre_size + mid_size); + MSF_UInt pre_size = Min(AlignPadPow2(stream->pos, msf->page_size), buffer_size); + MSF_UInt mid_size = AlignDownPow2(buffer_size - pre_size, msf->page_size); + MSF_UInt end_size = buffer_size - (pre_size + mid_size); U8 *pre_ptr = (U8*)buffer; U8 *mid_ptr = (U8*)buffer + pre_size; From e942dd0380b2c2347877acf3bf8c315863a649b8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 17 Feb 2026 17:40:06 -0800 Subject: [PATCH 245/850] checkpoint --- src/linker/lnk_debug_info.c | 109 ++++++++++++++---------------------- src/linker/lnk_debug_info.h | 2 +- 2 files changed, 42 insertions(+), 69 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index fda7848f..9cc8d934 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1245,10 +1245,12 @@ lnk_hash_cv_leaf_deep(Arena *arena, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, + CV_TypeIndexSource ti_source, + CV_TypeIndex ti, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, - String8 data) + CV_Leaf leaf) { Temp temp = temp_begin(arena); @@ -1257,20 +1259,17 @@ lnk_hash_cv_leaf_deep(Arena *arena, CV_TypeIndexInfoList ti_info_list; CV_TypeIndexInfo *ti_info; CV_Leaf leaf; - String8 data; CV_TypeIndex ti; CV_TypeIndexSource ti_source; }; // set up root frame - struct stack_s *root_frame = push_array_no_zero(temp.arena, struct stack_s, 1); - root_frame->next = 0; + struct stack_s *root_frame = push_array(temp.arena, struct stack_s, 1); root_frame->ti_info_list = ti_info_list; root_frame->ti_info = ti_info_list.first; - root_frame->data = data; - root_frame->ti = 0; - root_frame->ti_source = CV_TypeIndexSource_NULL; - MemoryZeroStruct(&root_frame->leaf); + root_frame->leaf = leaf; + root_frame->ti = ti; + root_frame->ti_source = ti_source; U64 **curr_hashes = hashes->v[loc_type][loc_idx]; @@ -1283,18 +1282,18 @@ lnk_hash_cv_leaf_deep(Arena *arena, stack->ti_info = stack->ti_info->next; // get type index info - CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (stack->data.str + curr_ti_info->offset); + CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (stack->leaf.data.str + curr_ti_info->offset); CV_TypeIndex ti = memory_read32(ti_ptr); // is index complex? if (ti >= ti_ranges[curr_ti_info->source].min) { // TODO: handle malformed index AssertAlways(ti < ti_ranges[curr_ti_info->source].max); - U64 ti_idx = (ti - ti_ranges[curr_ti_info->source].min); + U64 leaf_idx = (ti - ti_ranges[curr_ti_info->source].min); // was leaf hashed? - if (curr_hashes[curr_ti_info->source][ti_idx] == 0) { // :zero_hash_array - CV_Leaf leaf = cv_debug_t_get_leaf(leaves[curr_ti_info->source], ti_idx); + if (curr_hashes[curr_ti_info->source][leaf_idx] == 0) { // :zero_hash_array + CV_Leaf leaf = cv_debug_t_get_leaf(leaves[curr_ti_info->source], leaf_idx); // find index offsets CV_TypeIndexInfoList sub_ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); @@ -1302,12 +1301,10 @@ lnk_hash_cv_leaf_deep(Arena *arena, // do we have sub leaves? if (sub_ti_info_list.count) { // fill out new frame - struct stack_s *frame = push_array_no_zero(temp.arena, struct stack_s, 1); - frame->next = 0; + struct stack_s *frame = push_array(temp.arena, struct stack_s, 1); frame->ti_info_list = sub_ti_info_list; frame->ti_info = sub_ti_info_list.first; frame->leaf = leaf; - frame->data = leaf.data; frame->ti = ti; frame->ti_source = curr_ti_info->source; @@ -1315,14 +1312,7 @@ lnk_hash_cv_leaf_deep(Arena *arena, SLLStackPush(stack, frame); break; } else { - curr_hashes[curr_ti_info->source][ti_idx] = lnk_hash_cv_leaf(input, - hashes, - loc_type, - loc_idx, - ti_ranges, - CV_TypeIndex_Max, - leaf, - sub_ti_info_list); + curr_hashes[curr_ti_info->source][leaf_idx] = lnk_hash_cv_leaf(input, hashes, loc_type, loc_idx, ti_ranges, CV_TypeIndex_Max, leaf, sub_ti_info_list); } } } @@ -1330,24 +1320,17 @@ lnk_hash_cv_leaf_deep(Arena *arena, // no more type indices, pop frame if (!stack->ti_info) { - - if (stack != root_frame) { - // sub leaves are hashed we can now hash parent leaf - U64 leaf_idx = stack->ti - ti_ranges[stack->ti_source].min; - curr_hashes[stack->ti_source][leaf_idx] = lnk_hash_cv_leaf(input, - hashes, - loc_type, - loc_idx, - ti_ranges, - CV_TypeIndex_Max, - stack->leaf, - stack->ti_info_list); - } - SLLStackPop(stack); } } + // sub leaves are hashed we can now hash parent leaf + { + U64 leaf_idx = ti - ti_ranges[ti_source].min; + curr_hashes[ti_source][leaf_idx] = lnk_hash_cv_leaf(input, hashes, loc_type, loc_idx, ti_ranges, CV_TypeIndex_Max, leaf, ti_info_list); + Assert(curr_hashes[ti_source][leaf_idx] != 0); + } + temp_end(temp); } @@ -1502,39 +1485,25 @@ THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_task) } internal -THREAD_POOL_TASK_FUNC(lnk_hash_type_server_leaves_task) +THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_deep_task) { ProfBeginFunction(); - LNK_CvImportTypes *task = raw_task; - U64 obj_idx = task_id; + LNK_CvImportTypes *task = raw_task; + U64 ts_idx = task_id; + CV_TypeIndexSource ti_source = task->ti_source; + CV_DebugT debug_t = task->debug_t_arr [ts_idx]; + Rng1U64 *ti_ranges = task->input->external_ti_ranges[ts_idx]; + CV_DebugT *leaves = task->input->external_leaves [ts_idx]; - LNK_CodeViewInput *input = task->input; - LNK_LeafHashes *hashes = task->hashes; - - CV_SymbolListArray parsed_symbols = input->external_parsed_symbols[obj_idx]; - CV_DebugS debug_s = input->external_debug_s_arr[obj_idx]; - U64 ts_idx = input->external_obj_to_ts_idx_arr[obj_idx]; - CV_DebugT *leaves = input->external_leaves[ts_idx]; - Rng1U64 *ti_ranges = input->external_ti_ranges[ts_idx]; - - // hash leaves referenced in symbols - for EachIndex(i, parsed_symbols.count) { - CV_SymbolList symbol_list = parsed_symbols.v[i]; - for EachNode(symnode, CV_SymbolNode, symbol_list.first) { - Temp temp = temp_begin(task->fixed_arenas[worker_id]); - CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, symnode->data.kind, symnode->data.data); - lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, hashes, LNK_LeafLocType_External, ts_idx, ti_info_list, symnode->data.data); - temp_end(temp); - } - } - - // hash leaves referenced in inlinees - String8List inline_data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines); - for EachNode(inline_data_node, String8Node, inline_data_list.first) { + for EachIndex(leaf_idx, debug_t.count) { + U64 hash = task->hashes->v[LNK_LeafLocType_External][ts_idx] [ti_source][leaf_idx]; + if (hash != 0) { continue; } Temp temp = temp_begin(task->fixed_arenas[worker_id]); - CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_node->string); - lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, hashes, LNK_LeafLocType_External, ts_idx, ti_info_list, inline_data_node->string); + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); + CV_TypeIndex ti = ti_ranges[ti_source].min + leaf_idx; + lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, task->hashes, ti_source, ti, LNK_LeafLocType_External, ts_idx, ti_info_list, leaf); temp_end(temp); } @@ -2239,9 +2208,13 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); ProfEnd(); - ProfBegin("Hash Type Server Leaves [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, input->external_count))); - tp_for_parallel(tp, 0, input->external_count, lnk_hash_type_server_leaves_task, &task); - ProfEnd(); + task.ti_source = CV_TypeIndexSource_IPI; + task.debug_t_arr = input->external_leaves[task.ti_source]; + tp_for_parallel_prof(tp, 0, input->type_server_count, lnk_hash_debug_t_deep_task, &task, "Hash IPI Type Servers"); + + task.ti_source = CV_TypeIndexSource_TPI; + task.debug_t_arr = input->external_leaves[task.ti_source]; + tp_for_parallel_prof(tp, 0, input->type_server_count, lnk_hash_debug_t_deep_task, &task, "Hash IPI Type Servers"); } ProfEnd(); diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 1a039dc7..76449044 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -469,7 +469,7 @@ internal B32 lnk_match_leaf_ref (LNK_CodeViewInput *in // leaf hashing internal U64 lnk_hash_cv_leaf (LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); -internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, String8 data); +internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, CV_TypeIndexSource ti_source, CV_TypeIndex ti, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, CV_Leaf leaf); internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); // leaf hash table From eb8fd11b205417fd8191fad6bb646650c2144461 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 23 Feb 2026 13:55:04 -0800 Subject: [PATCH 246/850] input for hashing external leaves was assuming different array layout --- src/linker/lnk_debug_info.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 9cc8d934..91f3380d 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1320,17 +1320,15 @@ lnk_hash_cv_leaf_deep(Arena *arena, // no more type indices, pop frame if (!stack->ti_info) { + // sub leaves are hashed we can now hash parent leaf + U64 leaf_idx = stack->ti - ti_ranges[stack->ti_source].min; + curr_hashes[stack->ti_source][leaf_idx] = lnk_hash_cv_leaf(input, hashes, loc_type, loc_idx, ti_ranges, CV_TypeIndex_Max, stack->leaf, stack->ti_info_list); + Assert(curr_hashes[stack->ti_source][leaf_idx] != 0); + SLLStackPop(stack); } } - // sub leaves are hashed we can now hash parent leaf - { - U64 leaf_idx = ti - ti_ranges[ti_source].min; - curr_hashes[ti_source][leaf_idx] = lnk_hash_cv_leaf(input, hashes, loc_type, loc_idx, ti_ranges, CV_TypeIndex_Max, leaf, ti_info_list); - Assert(curr_hashes[ti_source][leaf_idx] != 0); - } - temp_end(temp); } @@ -1492,7 +1490,7 @@ THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_deep_task) LNK_CvImportTypes *task = raw_task; U64 ts_idx = task_id; CV_TypeIndexSource ti_source = task->ti_source; - CV_DebugT debug_t = task->debug_t_arr [ts_idx]; + CV_DebugT debug_t = task->input->external_leaves [ts_idx][ti_source]; Rng1U64 *ti_ranges = task->input->external_ti_ranges[ts_idx]; CV_DebugT *leaves = task->input->external_leaves [ts_idx]; @@ -2198,23 +2196,21 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) ProfEnd(); // hash .debug$P first so we can mix in hashes for precompiled sub leaves when hashing leaves in .debug$T - ProfBeginDynamic("Hash .debug$P [Count: %llu]", input->internal_count); task.debug_t_arr = input->internal_debug_p_arr; - tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); - ProfEnd(); + ProfScope("Hash .debug$P [Count: %llu]", input->internal_count) + tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); - ProfBegin("Hash .debug$T [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, input->internal_count))); task.debug_t_arr = input->internal_debug_t_arr; - tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); - ProfEnd(); + ProfScope("Hash .debug$T [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, input->internal_count))) + tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); - task.ti_source = CV_TypeIndexSource_IPI; - task.debug_t_arr = input->external_leaves[task.ti_source]; - tp_for_parallel_prof(tp, 0, input->type_server_count, lnk_hash_debug_t_deep_task, &task, "Hash IPI Type Servers"); + task.ti_source = CV_TypeIndexSource_IPI; + ProfScope("Hash IPI Type Servers") + tp_for_parallel(tp, 0, input->type_server_count, lnk_hash_debug_t_deep_task, &task); - task.ti_source = CV_TypeIndexSource_TPI; - task.debug_t_arr = input->external_leaves[task.ti_source]; - tp_for_parallel_prof(tp, 0, input->type_server_count, lnk_hash_debug_t_deep_task, &task, "Hash IPI Type Servers"); + task.ti_source = CV_TypeIndexSource_TPI; + ProfScope("Hash TPI Type Servers") + tp_for_parallel(tp, 0, input->type_server_count, lnk_hash_debug_t_deep_task, &task); } ProfEnd(); From 03445022d58d63aca4d0e99c0197ae1c512d9b51 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Feb 2026 18:05:38 -0800 Subject: [PATCH 247/850] make os file read an atomic operation --- src/os/core/win32/os_core_win32.c | 38 ++++++++++++------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index d21bc9af..65f6e3df 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -368,35 +368,25 @@ internal U64 os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) { if(os_handle_match(file, os_handle_zero())) { return 0; } - HANDLE handle = (HANDLE)file.u64[0]; - - // rjf: clamp range by file size - U64 size = 0; - GetFileSizeEx(handle, (LARGE_INTEGER *)&size); - Rng1U64 rng_clamped = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size)); - U64 total_read_size = 0; - - // rjf: read loop + + HANDLE handle = (HANDLE)file.u64[0]; + U8 *ptr = out_data; + U64 off = rng.min; + while(off != rng.max) { - U64 to_read = dim_1u64(rng_clamped); - for(U64 off = rng.min; total_read_size < to_read;) + U64 amt64 = rng.max - off; + U32 amt32 = (U32)Min(MB(32), amt64); + DWORD read_size = 0; + OVERLAPPED overlapped = { .Offset = (U32)off, .OffsetHigh = (U32)(off >> 32) }; + if( ! ReadFile(handle, ptr, amt32, &read_size, &overlapped)) { - U64 amt64 = to_read - total_read_size; - U32 amt32 = u32_from_u64_saturate(amt64); - DWORD read_size = 0; - OVERLAPPED overlapped = {0}; - overlapped.Offset = (off&0x00000000ffffffffull); - overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32; - ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped); - off += read_size; - total_read_size += read_size; - if(read_size != amt32) - { - break; - } + break; } + ptr += read_size; + off += read_size; } + U64 total_read_size = off - rng.min; return total_read_size; } From c7f7e154342052ef542c0c27c08fa476250d6922 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Feb 2026 18:00:48 -0800 Subject: [PATCH 248/850] WIP DWARF line table conversion tester --- src/radbin/radbin.c | 114 +++++++++++++++++++++++++++++++-- src/rdi/rdi_local.c | 18 ++++++ src/rdi/rdi_local.h | 1 + src/torture/torture.c | 131 ++++++++++++++++++++++++++++---------- src/torture/torture_d2r.c | 58 ++++++++++++++++- 5 files changed, 282 insertions(+), 40 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 99bcd7be..2711b9ae 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -417,6 +417,7 @@ rb_thread_entry_point(void *p) OutputKind_RDI, OutputKind_Dump, OutputKind_Breakpad, + OutputKind_VOff2Line, OutputKind_COUNT } OutputKind; @@ -427,10 +428,11 @@ rb_thread_entry_point(void *p) } output_kind_info[] = { - {str8_lit_comp(""), str8_lit_comp("")}, - {str8_lit_comp("rdi"), str8_lit_comp("RAD Debug Info (.rdi) Conversion")}, - {str8_lit_comp("dump"), str8_lit_comp("Textual Dumping")}, - {str8_lit_comp("breakpad"), str8_lit_comp("Breakpad Debug Info Conversion")}, + {str8_lit_comp(""), str8_lit_comp("")}, + {str8_lit_comp("rdi"), str8_lit_comp("RAD Debug Info (.rdi) Conversion")}, + {str8_lit_comp("dump"), str8_lit_comp("Textual Dumping")}, + {str8_lit_comp("breakpad"), str8_lit_comp("Breakpad Debug Info Conversion")}, + {str8_lit_comp("voff2line"), str8_lit_comp("Map virtual offset to a source line")}, }; OutputKind output_kind = OutputKind_Null; String8 output_path = cmd_line_string(cmdline, str8_lit("out")); @@ -533,6 +535,8 @@ rb_thread_entry_point(void *p) fprintf(stderr, "--breakpad Specifies that the utility should convert debug information\n"); fprintf(stderr, " data to the textual Breakpad format.\n\n"); + + fprintf(stderr, "--VOff2Line Specifies that the utility should map virtual offset to source line.\n\n"); fprintf(stderr, "--out: Specifies the path to which output data should be written. If\n"); fprintf(stderr, " not specified, the utility will choose a fallback. If dumping\n"); @@ -587,7 +591,7 @@ rb_thread_entry_point(void *p) { fprintf(stderr, "All input files specified on the command line will be dumped. The following\n"); fprintf(stderr, "formats are currently supported: PE, COFF, RDI, and ELF\n\n"); - } + }break; } //- rjf: unpack subset flags @@ -1276,6 +1280,106 @@ rb_thread_entry_point(void *p) } } }break; + + case OutputKind_VOff2Line: + { + if(lane_idx() != 0) { break; } + + if(cmdline->inputs.node_count == 0) + { + fprintf(stderr, "ARGUMENTS\n\n"); + fprintf(stderr, "--voff:OFFSET Map specified virtual offset to a source line.\n"); + break; + } + + if(cmdline->inputs.node_count > 1) + { + fprintf(stderr, "ERROR: too many input files!\n"); + break; + } + + if(!cmd_line_has_argument(cmdline, str8_lit("voff"))) { + fprintf(stderr, "ERROR: missing -voff\n"); + break; + } + + String8 voff_str = cmd_line_string(cmdline, str8_lit("voff")); + if(voff_str.size == 0) + { + fprintf(stderr, "ERROR: missing argument for -voff\n"); + break; + } + + U64 voff = 0; + if(!try_u64_from_str8_c_rules(voff_str, &voff)) + { + fprintf(stderr, "ERROR: invalid argument for -voff\n"); + break; + } + + RB_File *f = input_files.first->v; + if(f->format != RB_FileFormat_RDI) + { + fprintf(stderr, "ERROR: input file must be RDI.\n"); + break; + } + + RDI_Parsed rdi = {0}; + RDI_ParseStatus rdi_parse_status = rdi_parse(f->data.str, f->data.size, &rdi); + if(rdi_parse_status != RDI_ParseStatus_Good) + { + fprintf(stderr, "ERROR: failed to parse RDI with code %d\n", rdi_parse_status); + break; + } + + RDI_Line line = rdi_line_from_voff(&rdi, voff); + if(line.file_idx == 0 || line.line_num == 0) + { + fprintf(stderr, "ERROR: failed to find mapping for virtual offset 0x%llx.\n", voff); + break; + } + + RDI_SourceFile *src_file = rdi_element_from_name_idx(&rdi, SourceFiles, line.file_idx); + if(src_file == 0) + { + fprintf(stderr, "ERROR: failed to find source file with index %u.\n", line.file_idx); + break; + } + + Temp scratch = scratch_begin(0, 0); + + // format inline site stack + { + RDI_Scope *voff_scope = rdi_scope_from_voff(&rdi, voff); + for(RDI_Scope *scope = voff_scope, *null_scope = rdi_element_from_name_idx(&rdi, Scopes, 0); scope != 0 && scope != null_scope; scope = rdi_parent_from_scope(&rdi, scope)) + { + RDI_InlineSite *inline_site = rdi_inline_site_from_scope(&rdi, scope); + RDI_InlineSite *null_inline_site = rdi_element_from_name_idx(&rdi, InlineSites, 0); + if(inline_site && inline_site != null_inline_site) + { + RDI_LineTable *inline_line_table = rdi_element_from_name_idx(&rdi, LineTables, inline_site->line_table_idx); + RDI_LineTable *null_inline_line_table = rdi_element_from_name_idx(&rdi, LineTables, 0); + if(inline_line_table && inline_line_table != null_inline_line_table) + { + String8 inline_name = str8_from_rdi_string_idx(&rdi, inline_site->name_string_idx); + RDI_Line inline_line = rdi_line_from_line_table_voff(&rdi, inline_line_table, voff); + RDI_SourceFile *inline_src_file = rdi_element_from_name_idx(&rdi, SourceFiles, inline_line.file_idx); + RDI_SourceFile *null_inline_src_file = rdi_element_from_name_idx(&rdi, SourceFiles, 0); + if(inline_src_file && inline_src_file != null_inline_src_file) + { + String8 path = str8_from_rdi_path_node_idx(scratch.arena, &rdi, PathStyle_SystemAbsolute, src_file->file_path_node_idx); + fprintf(stdout, "[inlined] %.*s %.*s:%u\n", str8_varg(inline_name), str8_varg(path), inline_line.line_num); + } + } + } + } + } + + String8 path = str8_from_rdi_path_node_idx(scratch.arena, &rdi, PathStyle_SystemAbsolute, src_file->file_path_node_idx); + fprintf(stdout, "%.*s:%u\n", str8_varg(path), line.line_num); + + scratch_end(scratch); + }break; } ////////////////////////////// diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index c03f6f66..c012fe9a 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -30,6 +30,24 @@ str8_from_rdi_string_idx(RDI_Parsed *rdi, U32 idx) return result; } +internal String8 +str8_from_rdi_path_node_idx(Arena *arena, RDI_Parsed *rdi, PathStyle path_style, U32 path_node_idx) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List path_parts = {0}; + for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, path_node_idx); + fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0); + fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node)) + { + String8 path_part = {0}; + path_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &path_part.size); + str8_list_push_front(scratch.arena, &path_parts, path_part); + } + String8 path = str8_path_list_join_by_style(arena, &path_parts, path_style); + scratch_end(scratch); + return path; +} + //////////////////////////////// //~ rjf: String <=> Enum diff --git a/src/rdi/rdi_local.h b/src/rdi/rdi_local.h index ea69cc8b..85261d10 100644 --- a/src/rdi/rdi_local.h +++ b/src/rdi/rdi_local.h @@ -73,6 +73,7 @@ internal Arch arch_from_rdi_arch(RDI_Arch arch); //~ rjf: Lookup Helpers internal String8 str8_from_rdi_string_idx(RDI_Parsed *rdi, U32 idx); +internal String8 str8_from_rdi_path_node_idx(Arena *arean, RDI_Parsed *rdi, PathStyle path_style, U32 path_node_idx); //////////////////////////////// //~ rjf: String <=> Enum diff --git a/src/torture/torture.c b/src/torture/torture.c index b4744af6..42832dd3 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -91,25 +91,73 @@ t_run(T_Run run) return ctx.result; } -internal B32 -t_invoke(String8 exe_path, String8 cmdline, U64 timeout) +internal String8 +t_radbin_path(void) { - Temp scratch = scratch_begin(0,0); + local_persist String8 path = {0}; + if (path.size == 0) { + local_persist U8 buffer[4096]; + ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; + Arena *arena = arena_alloc_(¶ms); +#if OS_WINDOWS + path = os_full_path_from_path(arena, str8_lit("radbin.exe")); +#else + path = os_full_path_from_path(arena, str8_lit("radbin")); +#endif + AssertAlways(path.size); + } + return path; +} + +internal String8 +t_radlink_path(void) +{ + local_persist String8 path = {0}; + if (path.size == 0) { + local_persist U8 buffer[4096]; + ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; + Arena *arena = arena_alloc_(¶ms); +#if OS_WINDOWS + path = os_full_path_from_path(arena, str8_lit("radlink.exe")); +#else + path = os_full_path_from_path(arena, str8_lit("radlink")); +#endif + AssertAlways(path.size); + } + return path; +} + +internal B32 +t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, String8 *output_out) +{ + Temp scratch = scratch_begin(&output_arena,1); B32 is_ok = 0; - OS_Handle output_redirect = {0}; - if (g_redirect_stdout) { - output_redirect = os_file_open(OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, g_stdout_file_name); + B32 capture_output = output_out || g_redirect_stdout; + + g_last_exit_code = -1; + + OS_Handle read_pipe_handle = {0}, write_pipe_handle = {0}; + if (capture_output) { + HANDLE read_pipe, write_pipe; + SECURITY_ATTRIBUTES at = { .nLength = sizeof(at), .bInheritHandle = 1 }; + if (!CreatePipe(&read_pipe, &write_pipe, &at, 0)) { + AssertAlways(0 && "failed to create a pipe"); + } + read_pipe_handle = (OS_Handle){ .u64[0] = (U64)read_pipe }; + write_pipe_handle = (OS_Handle){ .u64[0] = (U64)write_pipe }; } // Build Launch Options - OS_ProcessLaunchParams launch_opts = { .path = g_wdir, .inherit_env = 1, .stdout_file = output_redirect, .stderr_file = output_redirect }; - str8_list_push(scratch.arena, &launch_opts.cmd_line, exe_path); - { - String8List parsed_cmdline = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline); - str8_list_concat_in_place(&launch_opts.cmd_line, &parsed_cmdline); - } + OS_ProcessLaunchParams launch_opts = { + .path = g_wdir, + .inherit_env = 1, + .stdout_file = write_pipe_handle, + .stderr_file = write_pipe_handle, + .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), + }; + str8_list_push_front(scratch.arena, &launch_opts.cmd_line, exe_path); if (g_verbose) { String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(" ") }); @@ -117,37 +165,54 @@ t_invoke(String8 exe_path, String8 cmdline, U64 timeout) fprintf(stdout, "Working Dir: %.*s\n", str8_varg(g_wdir)); } - // Invoke Exe - int exit_code = -1; - { - OS_Handle process_handle = os_process_launch(&launch_opts); - if (!os_handle_match(process_handle, os_handle_zero())) { - U64 exit_code_u64 = 0; - is_ok = os_process_join(process_handle, timeout, &exit_code_u64); - exit_code = (int)exit_code_u64; - if (!is_ok) { - os_process_kill(process_handle); + // invoke exe + OS_Handle process_handle = os_process_launch(&launch_opts); + + // close handle so last to ReadFile does not block + os_file_close(write_pipe_handle); + + if ( ! os_handle_match(process_handle, os_handle_zero())) { + if (capture_output) { + // capture process output + String8List output = {0}; + for (;;) { + String8 string = os_file_read_cstring(scratch.arena, read_pipe_handle, 0); + if (string.size == 0) { break; } + str8_list_push(scratch.arena, &output, string); + } + os_file_close(read_pipe_handle); + + if (output_out) { + *output_out = str8_list_join(output_arena, &output, 0); + } + + // write to the output file + if (g_redirect_stdout) { + os_write_data_list_to_file_path(g_stdout_file_name, output); } - os_process_detach(process_handle); } - } - // close handles - if (g_redirect_stdout) { - os_file_close(output_redirect); - } + U64 exit_code_u64 = 0; + if (os_process_join(process_handle, timeout, &exit_code_u64)) { + g_last_exit_code = (int)exit_code_u64; + is_ok = 1; + } else { + os_process_kill(process_handle); + } - // update global exit code - if (is_ok) { - g_last_exit_code = exit_code; - } else { - g_last_exit_code = -1; + os_process_detach(process_handle); } scratch_end(scratch); return is_ok; } +internal B32 +t_invoke(String8 exe_path, String8 cmdline, U64 timeout) +{ + return t_invoke_(exe_path, cmdline, timeout, 0, 0); +} + internal int t_test_is_before(void *raw_a, void *raw_b) { diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index c0f5ee47..7833c2f5 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -20,7 +20,7 @@ d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) } Assert(t_write_file(str8_lit("a.obj"), raw_coff)); - t_invoke(str8_lit("radlink.exe"), str8_lit("/subsystem:console /out:a.exe /entry:main /DEBUG:FULL /opt:noref /opt:noicf a.obj"), max_U64); + t_invoke(t_radlink_path(), str8_lit("/subsystem:console /out:a.exe /entry:main /DEBUG:FULL /opt:noref /opt:noicf a.obj"), max_U64); Assert(g_last_exit_code == 0); String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); Assert(exe.size > 0); @@ -28,7 +28,7 @@ d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) B32 was_pdb_deleted = os_delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); Assert(was_pdb_deleted); - t_invoke(str8_lit("radbin.exe"), str8_lit("-rdi a.exe"), max_U64); + t_invoke_(t_radbin_path(), str8_lit("-rdi a.exe -out:a.rdi"), max_U64, 0, 0); Assert(g_last_exit_code == 0); String8 raw_rdi = t_read_file(arena, str8_lit("a.rdi")); @@ -222,6 +222,60 @@ T_BeginTest(d2r_types) } T_EndTest; +#if 0 +T_BeginTest(d2r_line_table) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + String8 comp_dir = str8_lit("c:/devel/"); + String8 comp_name = str8_lit("test.c"); + + DW_WriterFile *file = dw_writer_new_file(writer, comp_name); + file->md5 = *(U128 *)&(U8[]){ 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc }; + + struct { + DW_WriterFile *file; U64 ln; U64 line_size; U64 voff; + } test_table[] = { + { file, 6, 1 }, + { file, 4, 2 }, + { file, 2, 3 }, + { file, 1, 4 }, + { file, 8, 5 }, + }; + + U64 exe_base = coff_default_exe_base_from_machine(COFF_MachineType_X64); + U64 voff = 0x1000; + for EachElement(i, test_table) { + test_table[i].voff = voff; + dw_writer_line_emit(writer, test_table[i].file, test_table[i].ln, 0, exe_base + voff); + voff += test_table[i].line_size; + } + + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, exe_base); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, exe_base + voff); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_tag_end(writer); + + d2r_rdi_from_dwarf_writer(scratch.arena, writer); + + for EachElement(i, test_table) { + for EachIndex(k, test_table[i].line_size) { + String8 cmd_line = str8f(scratch.arena, "-voff2line -voff:%llx, a.rdi", test_table[i].voff + k); + String8 output = {0}; + t_invoke_(str8_lit("radbin.exe"), cmd_line, max_U64, scratch.arena, &output); + T_Ok(g_last_exit_code == 0); + T_MatchLinef(&output, "%S:/%llu", test_table[i].file->path, test_table[i].ln); + } + } + + dw_writer_end(&writer); +} +T_EndTest; +#endif + T_BeginTest(d2r_general) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); From 3759c3eae466c6fabde4bd9abbca3ea08b47fc36 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Feb 2026 18:01:28 -0800 Subject: [PATCH 249/850] string natvis --- src/natvis/base.natvis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/natvis/base.natvis b/src/natvis/base.natvis index 4db4ce56..8009134e 100644 --- a/src/natvis/base.natvis +++ b/src/natvis/base.natvis @@ -1,7 +1,7 @@ - {{ size={size} str={str} }} + {{ size={size} str={str,[size]} }} From 609cbe7288d2b4696d53e9bc4d37f2e8bedae703 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Feb 2026 18:48:26 -0800 Subject: [PATCH 250/850] return invalid line info index on bad virtual offsets --- src/lib_rdi/rdi_parse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib_rdi/rdi_parse.c b/src/lib_rdi/rdi_parse.c index 224ad7c8..8f9515f6 100644 --- a/src/lib_rdi/rdi_parse.c +++ b/src/lib_rdi/rdi_parse.c @@ -414,7 +414,7 @@ rdi_parsed_from_line_table(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_Parse RDI_PROC RDI_U64 rdi_line_info_idx_range_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff, RDI_U64 *n_out) { - RDI_U64 result = 0; + RDI_U64 result = max_U64; RDI_U64 n = 0; if(line_info->count > 0 && line_info->voffs[0] <= voff && voff < line_info->voffs[line_info->count - 1]) { From 732c73deff5528d06b9f3f456d0655088a670af5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Feb 2026 18:56:58 -0800 Subject: [PATCH 251/850] fix divide by zero in the baker --- src/rdi_make/rdi_make_local.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index c41c63d2..9bf5e6e9 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1766,7 +1766,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[file_idx]; // rjf: set up map - map->slots_count = n->v[n_idx].total_line_count; + map->slots_count = Max(n->v[n_idx].total_line_count, 1); map->slots = push_array(arena, RDIM_BakeSrcLineMapSlot, map->slots_count); // rjf: gather line-bucketed info From 2fc4a3472bf965f91a213a2339838a9af62809a9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Feb 2026 19:05:04 -0800 Subject: [PATCH 252/850] finalize DWARF line table conversion test --- src/radbin/radbin.c | 2 +- src/torture/torture.c | 30 ++++++++++++++++++++++++++++++ src/torture/torture.h | 1 + src/torture/torture_d2r.c | 34 +++++++++++++++++++++------------- 4 files changed, 53 insertions(+), 14 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 2711b9ae..fd933399 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -536,7 +536,7 @@ rb_thread_entry_point(void *p) fprintf(stderr, "--breakpad Specifies that the utility should convert debug information\n"); fprintf(stderr, " data to the textual Breakpad format.\n\n"); - fprintf(stderr, "--VOff2Line Specifies that the utility should map virtual offset to source line.\n\n"); + fprintf(stderr, "--voff2line Specifies that the utility should map virtual offset to source line.\n\n"); fprintf(stderr, "--out: Specifies the path to which output data should be written. If\n"); fprintf(stderr, " not specified, the utility will choose a fallback. If dumping\n"); diff --git a/src/torture/torture.c b/src/torture/torture.c index 42832dd3..171ebd53 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -213,6 +213,36 @@ t_invoke(String8 exe_path, String8 cmdline, U64 timeout) return t_invoke_(exe_path, cmdline, timeout, 0, 0); } +internal B32 +t_match_line(String8 *output, String8 expected_line) +{ + U64 new_line_pos = str8_find_needle(*output, 0, str8_lit("\n"), 0); + String8 line = str8_prefix(*output, new_line_pos); + if (str8_ends_with(line, str8_lit("\r"), 0)) { + line = str8_chop(line, 1); + } + + B32 is_match = str8_match(line, expected_line, 0); + if (is_match) { + *output = str8_skip(*output, new_line_pos + 1); + } + + return is_match; +} + +internal B32 +t_match_linef(String8 *output, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 expected_line = push_str8fv(scratch.arena, fmt, args); + B32 is_match = t_match_line(output, expected_line); + va_end(args); + scratch_end(scratch); + return is_match; +} + internal int t_test_is_before(void *raw_a, void *raw_b) { diff --git a/src/torture/torture.h b/src/torture/torture.h index 74f27eb4..647c3471 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -75,6 +75,7 @@ extern T_Test g_torture_tests[0xffffff]; } #define T_Ok(c) do { if (!(c)) { result.fail_file = __FILE__; result.fail_line = __LINE__; result.fail_cond = Stringify(c); goto exit__; } } while(0) +#define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) //////////////////////////////// diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 7833c2f5..57239538 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -222,24 +222,26 @@ T_BeginTest(d2r_types) } T_EndTest; -#if 0 T_BeginTest(d2r_line_table) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - String8 comp_dir = str8_lit("c:/devel/"); + String8 comp_dir = str8_lit("c:/DEVEL/"); String8 comp_name = str8_lit("test.c"); - DW_WriterFile *file = dw_writer_new_file(writer, comp_name); - file->md5 = *(U128 *)&(U8[]){ 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc }; + DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/C/Devel/foo.c")); + DW_WriterFile *comp_file = dw_writer_new_file(writer, str8f(scratch.arena, "%S%S", comp_dir, comp_name)); struct { DW_WriterFile *file; U64 ln; U64 line_size; U64 voff; } test_table[] = { - { file, 6, 1 }, - { file, 4, 2 }, - { file, 2, 3 }, - { file, 1, 4 }, - { file, 8, 5 }, + { comp_file, 6, 1 }, + { comp_file, 4, 2 }, + { comp_file, 2, 3 }, + { comp_file, 1, 4 }, + { comp_file, 8, 5 }, + { foo_file, 1, 3 }, + { foo_file, 100, 1 }, + { comp_file, max_U32 - 0x100, 10 }, }; U64 exe_base = coff_default_exe_base_from_machine(COFF_MachineType_X64); @@ -250,6 +252,13 @@ T_BeginTest(d2r_line_table) voff += test_table[i].line_size; } + // emit one past last line + dw_writer_line_emit(writer, + test_table[ArrayCount(test_table) - 1].file, + test_table[ArrayCount(test_table) - 1].ln, + 0, + exe_base + voff); + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); @@ -263,18 +272,17 @@ T_BeginTest(d2r_line_table) for EachElement(i, test_table) { for EachIndex(k, test_table[i].line_size) { - String8 cmd_line = str8f(scratch.arena, "-voff2line -voff:%llx, a.rdi", test_table[i].voff + k); + String8 cmd_line = str8f(scratch.arena, "-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); String8 output = {0}; - t_invoke_(str8_lit("radbin.exe"), cmd_line, max_U64, scratch.arena, &output); + t_invoke_(t_radbin_path(), cmd_line, max_U64, scratch.arena, &output); T_Ok(g_last_exit_code == 0); - T_MatchLinef(&output, "%S:/%llu", test_table[i].file->path, test_table[i].ln); + T_MatchLinef(&output, "%S:%llu", test_table[i].file->path, test_table[i].ln); } } dw_writer_end(&writer); } T_EndTest; -#endif T_BeginTest(d2r_general) { From 3500b9cab865278e3cfacdaf2acf4508c1f6b93d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Feb 2026 20:02:29 -0800 Subject: [PATCH 253/850] test checksums --- src/torture/torture_d2r.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 57239538..4faddf82 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -284,6 +284,42 @@ T_BeginTest(d2r_line_table) } T_EndTest; +T_BeginTest(d2r_checksums) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + + DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/c/devel/foo.c")); + DW_WriterFile *comp_file = dw_writer_new_file(writer, str8_lit("/home/main.c")); + foo_file->md5 = *(U128 *)&(U8[16]){ 0x04, 0x70, 0xe9, 0x6b, 0xa3, 0x05, 0x2c, 0xc8, 0x2d, 0x70, 0xc5, 0xe9, 0x80, 0x8e, 0x8a, 0x4e, }; + comp_file->md5 = *(U128 *)&(U8[16]){ 0x82, 0x3c, 0xc6, 0x02, 0x82, 0x9e, 0xf6, 0xce, 0x53, 0xff, 0x5a, 0x93, 0xb6, 0x6e, 0x59, 0x38 }; + comp_file->time_stamp = 123; // convert must pick MD5 checksum over time stamp + + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, str8_chop_last_slash(comp_file->path)); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_skip_last_slash(comp_file->path)); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_tag_end(writer); + + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); + U64 checksum_count = 0; + RDI_MD5 *checksums = rdi_table_from_name(rdi, MD5Checksums, &checksum_count); + T_Ok(checksum_count == writer->line.file_count + 1); + + RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, foo_file->path.str); + T_Ok(foo_src_file); + T_Ok(foo_src_file->checksum_kind == RDI_ChecksumKind_MD5); + T_Ok(MemoryMatch(&foo_file->md5, &checksums[foo_src_file->checksum_idx], sizeof(U128))); + + RDI_SourceFile *comp_src_file = rdi_source_file_from_normal_path_cstr(rdi, comp_file->path.cstr); + T_Ok(comp_src_file); + T_Ok(comp_src_file->checksum_kind == RDI_ChecksumKind_MD5); + T_Ok(MemoryMatch(&comp_file->md5, &checksums[comp_src_file->checksum_idx], sizeof(U128))); + + dw_writer_end(&writer); +} +T_EndTest; + T_BeginTest(d2r_general) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); From dce1f3f8f76b5725be3bfec619fd81e803c27936 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 25 Feb 2026 01:39:48 -0800 Subject: [PATCH 254/850] typo --- src/dwarf/dwarf_parse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index ded1b326..bc57b510 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -842,7 +842,7 @@ dw_read_tag(Arena *arena, // fill out node DW_AttribNode *attrib_n = push_array(arena, DW_AttribNode, 1); - attrib_n->v.info_off = tag_info_off + attrib_tag_cursor; + attrib_n->v.info_off = cu_info_range.min + attrib_tag_cursor; attrib_n->v.abbrev_off = attrib_abbrev_off; attrib_n->v.abbrev_id = attrib_abbrev.id; attrib_n->v.attrib_kind = attrib_kind; From 3e7b791e01d47c434a71d30c92f52b13465ef04f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 25 Feb 2026 11:22:13 -0800 Subject: [PATCH 255/850] WIP subprogram conversion test --- src/dwarf/dwarf.h | 21 ++++++++++---- src/torture/torture_d2r.c | 58 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 7ddd9f1a..8edf2366 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -130,11 +130,11 @@ typedef enum DW_LanguageEnum DW_Language_UserHi = 0xffff, } DW_LanguageEnum; -#define DW_Inl_XList \ - X(NotInlined, 0) \ - X(Inlined, 1) \ - X(DeclaredNotInlined, 2) \ - X(DeclaredInlined, 3) +#define DW_Inl_XList \ + X(NotInlined, 0x00) \ + X(Inlined, 0x01) \ + X(DeclaredNotInlined, 0x02) \ + X(DeclaredInlined, 0x03) typedef U32 DW_InlKind; typedef enum DW_InlKindEnum @@ -199,6 +199,17 @@ typedef enum DW_IDCaseKindEnum #undef X } DW_IDCaseKindEnum; +#define DW_Vis_XList \ + X(Local, 0x01) \ + X(Exported, 0x02) \ + X(Qualified, 0x03) +typedef enum DW_Vis +{ +#define X(_N, _ID) DW_Vis_##_N = _ID, + DW_Vis_XList +#undef X +} DW_Vis; + #define DW_TagKind_V3_XList \ X(ArrayType, 0x01) \ X(ClassType, 0x02) \ diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 4faddf82..8760f9e1 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -320,6 +320,64 @@ T_BeginTest(d2r_checksums) } T_EndTest; +#if 0 +T_BeginTest(d2r_subprogram) +{ + DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + + U64 image_lo = 0x1400000; + U64 image_hi = 0x1500000; + U64 subprogram_lo = image_lo + 0x1000; + U64 subprogram_hi = subprogram_lo + 0x100; + U64 subprogram_entry_addr = subprogram_lo + 5; + String8 subprogram_link_name = str8_lit("@FOOBAR!"); + String8 subprogram_name = str8_lit("foobar"); + + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, image_lo); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, image_hi); + dw_writer_tag_end(writer); + + DW_WriterTag *subroutine_type = dw_writer_tag_begin(writer, DW_TagKind_SubroutineType); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Accessibility, DW_AccessKind_Private); + dw_writer_push_attrib_uint(writer, DW_AttribKind_Alignment, 16); + + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Accessibility, DW_AccessKind_Private); + dw_writer_push_attrib_enum(writer, DW_AttribKind_AddressClass, DW_AddrClassKind_None); + dw_writer_push_attrib_uint(writer, DW_AttribKind_Alignment, 32); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Artificial, 1); + dw_writer_push_attrib_enum(writer, DW_AttribKind_CallingConvention, DW_CallingConventionKind_Program); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Deleted, 1); + dw_writer_push_attrib_address(writer, DW_AttribKind_EntryPc, subprogram_entry_addr); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Explicit, 1); + dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); + dw_writer_push_attrib_expressionv(writer, DW_AttribKind_FrameBase, DW_ExprEnc_Op(Reg7)); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, subprogram_hi); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Inline, DW_Inl_DeclaredNotInlined); + dw_writer_push_attrib_string(writer, DW_AttribKind_LinkageName, subprogram_link_name); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, subprogram_lo); + dw_writer_push_attrib_flag(writer, DW_AttribKind_MainSubProgram, 1); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, subprogram_name); + dw_writer_push_attrib_flag(writer, DW_AttribKind_NoReturn, 1); + // TODO: DW_AttribKind_ObjectPointer + dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Pure, 1); + // TODO: DW_AttribKind_Ranges + dw_writer_push_attrib_flag(writer, DW_AttribKind_Recursive, 1); + // TODO: DW_AttribKind_StartScope + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, subroutine_type); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Visibility, DW_Vis_Local); + dw_writer_tag_end(writer); + + dw_writer_end(&writer); +} +T_EndTest; +#endif + T_BeginTest(d2r_general) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); From 1ee8218b0ecb7f3dee5a58301267af58da73b550 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 25 Feb 2026 14:27:59 -0800 Subject: [PATCH 256/850] format visibility attribute --- src/dwarf/dwarf.c | 11 +++++++++++ src/dwarf/dwarf.h | 1 + src/dwarf/dwarf_dump.c | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index e8179a53..b11d7e60 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -724,6 +724,17 @@ dw_string_from_attrib_type_encoding(Arena *arena, DW_ATE kind) return push_str8f(arena, "%llx", kind); } +internal String8 +dw_string_from_attrib_visibility(Arena *arena, DW_Vis vis) +{ + switch (vis) { +#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); + DW_Vis_XList +#undef X + } + return push_str8f(arena, "%llx", vis); +} + internal String8 dw_string_from_std_opcode(Arena *arena, DW_StdOpcode kind) { diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 8edf2366..f714ce40 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1807,6 +1807,7 @@ internal String8 dw_string_from_inl(Arena *arena, DW_InlKind kind); internal String8 dw_string_from_access_kind(Arena *arena, DW_AccessKind kind); internal String8 dw_string_from_calling_convetion(Arena *arena, DW_CallingConventionKind kind); internal String8 dw_string_from_attrib_type_encoding(Arena *arena, DW_ATE kind); +internal String8 dw_string_from_attrib_visibility(Arena *arena, DW_Vis vis); internal String8 dw_string_from_std_opcode(Arena *arena, DW_StdOpcode kind); internal String8 dw_string_from_ext_opcode(Arena *arena, DW_ExtOpcode kind); internal String8 dw_string_from_loc_list_entry_kind(Arena *arena, DW_LLE kind); diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index b228f6df..95318987 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -756,6 +756,11 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni DW_ATE encoding = dw_const_u64_from_attrib(input, cu, attrib); enum_info = dw_string_from_attrib_type_encoding(scratch.arena, encoding); }break; + case DW_AttribKind_Visibility: + { + DW_Vis vis = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_attrib_visibility(scratch.arena, vis); + }break; } if(enum_info.size) From fdd2f4e8f57a2bbfcd8a67d8f6cf86853159b7fd Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 25 Feb 2026 22:27:12 -0800 Subject: [PATCH 257/850] helper for looping over bits in flags --- src/base/base_core.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/base/base_core.h b/src/base/base_core.h index b99139ff..6cc94a5c 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -199,6 +199,7 @@ #define EachNonZeroEnumVal(type, it) (type it = (type)1; it < type##_COUNT; it = (type)(it+1)) #define EachInRange(it, range) (U64 it = (range).min; it < (range).max; it += 1) #define EachNode(it, T, first) (T *it = first; it != 0; it = it->next) +#define EachBit(it, flags) (U64 (_i_) = (flags), it = (flags) & -(flags); (_i_) != 0; (_i_) &= ((_i_) - 1), it = (flags) & -(flags)) //////////////////////////////// //~ rjf: Memory Operation Macros From b67d2fad40e1c3f6acdbfd42e770f46e94cc123d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 25 Feb 2026 22:28:03 -0800 Subject: [PATCH 258/850] convert procedure when it was declared inline but was not inlined --- src/rdi_from_dwarf/rdi_from_dwarf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 8f936466..d0db1640 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2334,6 +2334,7 @@ d2r_convert_symbols(Arena *arena, if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Inline)) { inl = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Inline); } switch (inl) { + case DW_Inl_DeclaredNotInlined: case DW_Inl_NotInlined: { U64 param_count = 0; RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); @@ -2399,7 +2400,6 @@ d2r_convert_symbols(Arena *arena, it->stack->scope = root_scope; } break; - case DW_Inl_DeclaredNotInlined: case DW_Inl_DeclaredInlined: case DW_Inl_Inlined: { d2r_tag_iterator_skip_children(it); From e933df63009ed8d916817f4ef760243530910f16 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 26 Feb 2026 14:34:21 -0800 Subject: [PATCH 259/850] WIP type stringifier --- src/rdi/rdi_local.c | 90 +++++++++++++++++++++++++++++++++++++++++++++ src/rdi/rdi_local.h | 7 +++- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index c012fe9a..e69eb90c 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1362,3 +1362,93 @@ lane_sync(); if(flags & RDI_DumpSubsetFlag_##name) ProfScope(#name) ProfEnd(); return result_strings; } + +#if 0 +internal String8 +rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_TypeNode *type) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List fmt = {0}; + String8List arr_fmt = {0}; + + for (RDI_TypeNode *i = type, *n = 0; i != 0; i = n, n = 0) { + if (RDI_TypeKind_FirstConstructed <= i->kind && i->kind <= RDI_TypeKind_LastConstructed) { + n = rdi_element_from_name_idx(rdi, TypeNodes, i->constructed.direct_type_idx); + } + + if (i->kind == RDI_TypeKind_Variadic) { + str8_list_push_frontf(scratch.arena, &fmt, "..."); + } else if (RDI_TypeKind_FirstBuiltIn <= i->kind && i->kind <= RDI_TypeKind_LastBuiltIn) { + String8 built_in_name = str8_from_rdi_string_idx(rdi, i->built_in.name_string_idx); + str8_list_push_front(scratch.arena, &fmt, built_in_name); + } else if (i->kind == RDI_TypeKind_Alias) { + String8 alias_name = str8_from_rdi_string_idx(rdi, i->user_defined.name_string_idx); + str8_list_push_front(scratch.arena, &fmt, alias_name); + } else if (i->kind == RDI_TypeKind_Modifier) { + for EachBit(f, i->flags) { + str8_list_push_front(scratch.arena, &fmt, rdi_string_from_type_modifier_flags(scratch.arena, f)); + } + } else if (i->kind == RDI_TypeKind_Ptr) { + str8_list_push_front(scratch.arena, &fmt, str8_lit("*")); + } else if (i->kind == RDI_TypeKind_LRef) { + str8_list_push_front(scratch.arena, &fmt, str8_lit("&")); + } else if (i->kind == RDI_TypeKind_RRef) { + str8_list_push_front(scratch.arena, &fmt, str8_lit("&&")); + } else if (i->kind == RDI_TypeKind_Array) { + str8_list_push_frontf(scratch.arena, &arr_fmt, "[%llu]", i->constructed.count); + } else if (i->kind == RDI_TypeKind_Function) { + String8 *param_names = 0; + String8 proc_name = {0}; + if (proc) { + RDI_TypeNode *proc_type = rdi_element_from_name_idx(rdi, TypeNodes, proc->type_idx); + if (proc_type == i) { + proc_name = str8_from_rdi_string_idx(rdi, proc->name_string_idx); + param_names = push_array(scratch.arena, String8, i->constructed.count); + RDI_Scope *root_scope = rdi_element_from_name_idx(rdi, Scopes, proc->root_scope_idx); + U64 param_idx = 0; + for (U64 local_idx = root_scope->local_first; local_idx < root_scope->local_first + root_scope->local_count; local_idx += 1) { + RDI_Local *local = rdi_element_from_name_idx(rdi, Locals, local_idx); + if (local->kind == RDI_LocalKind_Parameter) { + AssertAlways(param_idx < i->constructed.count); + param_names[param_idx++] = str8_from_rdi_string_idx(rdi, local->name_string_idx); + } + } + } + } + + // format parameters + String8List params_fmt = {0}; + U32 check_count = 0; + U32 *idx_run = rdi_idx_run_from_first_count(rdi, i->constructed.param_idx_run_first, i->constructed.count, &check_count); + if (check_count == type->constructed.count) { + for EachIndex(param_idx, i->constructed.count) { + RDI_TypeNode *param_type = rdi_element_from_name_idx(rdi, TypeNodes, idx_run[param_idx]); + String8 param_string = rdi_string_from_type(scratch.arena, rdi, 0, param_type); + if (param_names) { + str8_list_pushf(scratch.arena, ¶ms_fmt, "%S %S", param_string, param_names[param_idx]); + } else { + str8_list_push(scratch.arena, ¶ms_fmt, param_string); + } + } + } else { + str8_list_pushf(scratch.arena, ¶ms_fmt, "???"); + } + + // format signature + String8 params = str8_list_join(scratch.arena, ¶ms_fmt, &(StringJoin){.sep=str8_lit(", ")}); + str8_list_pushf(scratch.arena, &fmt, "(* %S)(%S)", proc_name, params); + } + + if (arr_fmt.node_count && i->kind != RDI_TypeKind_Array) { + str8_list_push_frontf(scratch.arena, &fmt, "("); + str8_list_concat_in_place(&fmt, &arr_fmt); + str8_list_pushf(scratch.arena, &fmt, ")"); + } + } + + String8 result = str8_list_join(arena, &fmt, 0); + scratch_end(scratch); + return result; +} +#endif diff --git a/src/rdi/rdi_local.h b/src/rdi/rdi_local.h index 85261d10..96b8d0e5 100644 --- a/src/rdi/rdi_local.h +++ b/src/rdi/rdi_local.h @@ -89,7 +89,7 @@ internal String8 rdi_string_from_member_kind (Arena *arena, RDI_MemberKind internal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind); internal String8 rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags); -internal String8 rdi_string_from_type_modifier (Arena *arena, RDI_TypeModifierFlags flags); +internal String8 rdi_string_from_type_modifier_flags (Arena *arena, RDI_TypeModifierFlags flags); internal String8 rdi_string_from_udt_flags (Arena *arena, RDI_UDTFlags flags); internal String8 rdi_string_from_link_flags (Arena *arena, RDI_LinkFlags flags); internal String8 rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc); @@ -100,4 +100,9 @@ internal String8List rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, R internal String8List rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags); +//////////////////////////////// +//~ Type Formatter + +internal String8 rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_TypeNode *type); + #endif // RDI_FORMAT_LOCAL_H From 13f189ddcdf38073e6559ecb276aa5428d349ddd Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 26 Feb 2026 14:34:54 -0800 Subject: [PATCH 260/850] WIP subprogram conversion tests --- src/dwarf/dwarf_writer.c | 2 +- src/dwarf/dwarf_writer.h | 4 +- src/torture/torture_d2r.c | 142 ++++++++++++++++++++++++++---------- src/torture/torture_dwarf.c | 2 +- 4 files changed, 107 insertions(+), 43 deletions(-) diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index b5746c1c..6b0835a9 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -463,7 +463,7 @@ dw_writer_push_attrib_exprloc(DW_Writer *writer, DW_AttribKind kind, String8 exp } internal DW_WriterAttrib * -dw_writer_push_attrib_expression(DW_Writer *writer, DW_AttribKind kind, DW_ExprEnc *encs, U64 encs_count) +dw_writer_push_attrib_expr(DW_Writer *writer, DW_AttribKind kind, DW_ExprEnc *encs, U64 encs_count) { String8 exprloc = dw_encode_expr(writer->arena, writer->arch, writer->format, encs, encs_count); return dw_writer_push_attrib_exprloc(writer, kind, exprloc); diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index bff6a141..c4e78b94 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -274,12 +274,12 @@ internal DW_WriterAttrib * dw_writer_push_attrib_uint (DW_Writer *writer, internal DW_WriterAttrib * dw_writer_push_attrib_enum (DW_Writer *writer, DW_AttribKind kind, S64 e ); internal DW_WriterAttrib * dw_writer_push_attrib_ref (DW_Writer *writer, DW_AttribKind kind, DW_WriterTag *ref ); internal DW_WriterAttrib * dw_writer_push_attrib_exprloc (DW_Writer *writer, DW_AttribKind kind, String8 exprloc ); -internal DW_WriterAttrib * dw_writer_push_attrib_expression (DW_Writer *writer, DW_AttribKind kind, DW_ExprEnc *encs, U64 encs_count); +internal DW_WriterAttrib * dw_writer_push_attrib_expr (DW_Writer *writer, DW_AttribKind kind, DW_ExprEnc *encs, U64 encs_count); internal DW_WriterAttrib * dw_writer_push_attrib_line_ptr (DW_Writer *writer, DW_AttribKind kind, U64 line_ptr ); internal DW_WriterAttrib * dw_writer_push_attrib_mac_ptr (DW_Writer *writer, DW_AttribKind kind, void * mac_ptr ); internal DW_WriterAttrib * dw_writer_push_attrib_rng_list_ptr(DW_Writer *writer, DW_AttribKind kind, void * rng_list_ptr); internal DW_WriterAttrib * dw_writer_push_attrib_implicit (DW_Writer *writer, DW_AttribKind kind, S64 implicit ); -#define dw_writer_push_attrib_expressionv(w, k, ...) dw_writer_push_attrib_expression(w, k, (DW_ExprEnc[]){ __VA_ARGS__ }, ArrayCount(((DW_ExprEnc[]){ __VA_ARGS__ })) ) +#define dw_writer_push_attrib_exprv(w, k, ...) dw_writer_push_attrib_expr(w, k, (DW_ExprEnc[]){ __VA_ARGS__ }, ArrayCount(((DW_ExprEnc[]){ __VA_ARGS__ })) ) //////////////////////////////// // Line diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 8760f9e1..c929eb59 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -306,7 +306,7 @@ T_BeginTest(d2r_checksums) RDI_MD5 *checksums = rdi_table_from_name(rdi, MD5Checksums, &checksum_count); T_Ok(checksum_count == writer->line.file_count + 1); - RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, foo_file->path.str); + RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, foo_file->path.cstr); T_Ok(foo_src_file); T_Ok(foo_src_file->checksum_kind == RDI_ChecksumKind_MD5); T_Ok(MemoryMatch(&foo_file->md5, &checksums[foo_src_file->checksum_idx], sizeof(U128))); @@ -325,8 +325,8 @@ T_BeginTest(d2r_subprogram) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - U64 image_lo = 0x1400000; - U64 image_hi = 0x1500000; + U64 image_lo = coff_default_exe_base_from_machine(COFF_MachineType_X64); + U64 image_hi = image_lo + 0x10000; U64 subprogram_lo = image_lo + 0x1000; U64 subprogram_hi = subprogram_lo + 0x100; U64 subprogram_entry_addr = subprogram_lo + 5; @@ -334,44 +334,108 @@ T_BeginTest(d2r_subprogram) String8 subprogram_name = str8_lit("foobar"); dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, image_lo); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, image_hi); - dw_writer_tag_end(writer); - - DW_WriterTag *subroutine_type = dw_writer_tag_begin(writer, DW_TagKind_SubroutineType); - dw_writer_push_attrib_enum(writer, DW_AttribKind_Accessibility, DW_AccessKind_Private); - dw_writer_push_attrib_uint(writer, DW_AttribKind_Alignment, 16); + dw_writer_push_attrib_string (writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, image_lo); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, image_hi); + + DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint (writer, DW_AttribKind_ByteSize, 1); + dw_writer_push_attrib_sint (writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); + dw_writer_tag_end(writer); + + DW_WriterTag *char_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); + dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 8); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, char_type); + dw_writer_tag_end(writer); + + DW_WriterTag *int_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint (writer, DW_AttribKind_ByteSize, 4); + dw_writer_push_attrib_sint (writer, DW_AttribKind_Encoding, DW_ATE_Signed); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "int"); + dw_writer_tag_end(writer); + + DW_WriterTag *int_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); + dw_writer_push_attrib_uint(writer, DW_AttribKind_ByteSize, 8); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_type); + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_enum (writer, DW_AttribKind_Accessibility, DW_AccessKind_Private); + dw_writer_push_attrib_enum (writer, DW_AttribKind_AddressClass, DW_AddrClassKind_None); + dw_writer_push_attrib_uint (writer, DW_AttribKind_Alignment, 32); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Artificial, 1); + dw_writer_push_attrib_enum (writer, DW_AttribKind_CallingConvention, DW_CallingConventionKind_Program); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Deleted, 1); + dw_writer_push_attrib_address(writer, DW_AttribKind_EntryPc, subprogram_entry_addr); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Explicit, 1); + dw_writer_push_attrib_flag (writer, DW_AttribKind_External, 1); + dw_writer_push_attrib_exprv (writer, DW_AttribKind_FrameBase, DW_ExprEnc_Op(Reg7)); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, subprogram_hi); + dw_writer_push_attrib_enum (writer, DW_AttribKind_Inline, DW_Inl_DeclaredNotInlined); + dw_writer_push_attrib_string (writer, DW_AttribKind_LinkageName, subprogram_link_name); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, subprogram_lo); + dw_writer_push_attrib_flag (writer, DW_AttribKind_MainSubProgram, 1); + dw_writer_push_attrib_string (writer, DW_AttribKind_Name, subprogram_name); + dw_writer_push_attrib_flag (writer, DW_AttribKind_NoReturn, 1); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Prototyped, 1); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Pure, 1); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Recursive, 1); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_type); + dw_writer_push_attrib_enum (writer, DW_AttribKind_Visibility, DW_Vis_Local); + // TODO: DW_AttribKind_ObjectPointer + // TODO: DW_AttribKind_Ranges + // TODO: DW_AttribKind_StartScope + dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "a"); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); + dw_writer_push_attrib_exprv (writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg2)); // rcx + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "b"); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, char_ptr_type); + dw_writer_push_attrib_exprv (writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg5)); // rdi + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_UnspecifiedParameters); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); + + // -------------------------------------------------------------------------------- + + DW_WriterTag *my_struct_type = dw_writer_declare_tag(writer); + + DW_WriterTag *const_my_struct_type = dw_writer_tag_begin(writer, DW_TagKind_ConstType); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_type); + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_PointerType); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, const_my_struct_type); + dw_writer_tag_end(writer); + + dw_writer_tag_begin_define(writer, DW_TagKind_StructureType, my_struct_type); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyStructure"); + dw_writer_push_attrib_uint (writer, DW_AttribKind_ByteSize, 0x100); + + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyMethod"); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); + + dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_method_this_type); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); + + // -------------------------------------------------------------------------------- dw_writer_tag_end(writer); - dw_writer_tag_begin(writer, DW_TagKind_SubProgram); - dw_writer_push_attrib_enum(writer, DW_AttribKind_Accessibility, DW_AccessKind_Private); - dw_writer_push_attrib_enum(writer, DW_AttribKind_AddressClass, DW_AddrClassKind_None); - dw_writer_push_attrib_uint(writer, DW_AttribKind_Alignment, 32); - dw_writer_push_attrib_flag(writer, DW_AttribKind_Artificial, 1); - dw_writer_push_attrib_enum(writer, DW_AttribKind_CallingConvention, DW_CallingConventionKind_Program); - dw_writer_push_attrib_flag(writer, DW_AttribKind_Deleted, 1); - dw_writer_push_attrib_address(writer, DW_AttribKind_EntryPc, subprogram_entry_addr); - dw_writer_push_attrib_flag(writer, DW_AttribKind_Explicit, 1); - dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); - dw_writer_push_attrib_expressionv(writer, DW_AttribKind_FrameBase, DW_ExprEnc_Op(Reg7)); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, subprogram_hi); - dw_writer_push_attrib_flag(writer, DW_AttribKind_Inline, DW_Inl_DeclaredNotInlined); - dw_writer_push_attrib_string(writer, DW_AttribKind_LinkageName, subprogram_link_name); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, subprogram_lo); - dw_writer_push_attrib_flag(writer, DW_AttribKind_MainSubProgram, 1); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, subprogram_name); - dw_writer_push_attrib_flag(writer, DW_AttribKind_NoReturn, 1); - // TODO: DW_AttribKind_ObjectPointer - dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); - dw_writer_push_attrib_flag(writer, DW_AttribKind_Pure, 1); - // TODO: DW_AttribKind_Ranges - dw_writer_push_attrib_flag(writer, DW_AttribKind_Recursive, 1); - // TODO: DW_AttribKind_StartScope - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, subroutine_type); - dw_writer_push_attrib_enum(writer, DW_AttribKind_Visibility, DW_Vis_Local); - dw_writer_tag_end(writer); + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); + RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, subprogram_name.cstr); + RDI_TypeNode *proc_type = rdi_element_from_name_idx(rdi, TypeNodes, proc->type_idx); + String8 proc_string = rdi_string_from_type(scratch.arena, rdi, proc, proc_type); dw_writer_end(&writer); } @@ -399,7 +463,7 @@ T_BeginTest(d2r_general) dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "FooBar"); // declare variable dw_writer_tag_begin(writer, DW_TagKind_Variable); - dw_writer_push_attrib_expressionv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); + dw_writer_push_attrib_exprv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestLocal"); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); dw_writer_tag_end(writer); diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 421d5b98..98d92b25 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -620,7 +620,7 @@ T_BeginTest(dwarf_writer) dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x140001004); dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("main")); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, simple_struct_tag); - dw_writer_push_attrib_expression(writer, DW_AttribKind_FrameBase, &(DW_ExprEnc)DW_ExprEnc_Op(Reg7), 1); + dw_writer_push_attrib_expr(writer, DW_AttribKind_FrameBase, &(DW_ExprEnc)DW_ExprEnc_Op(Reg7), 1); dw_writer_tag_end(writer); } dw_writer_tag_end(writer); From a2336b9991eb2da280c42b28df143bdf21dbf468 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 26 Feb 2026 16:21:01 -0800 Subject: [PATCH 261/850] ASAN false-positives when threads access foreign stack addresses --- src/rdi_from_pdb/rdi_from_pdb.c | 37 +++++++++++++++------------------ 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index bd800cff..83c6f7f5 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -389,6 +389,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: setup output buckets MSF_RawStreamTable *msf_raw_stream_table = 0; + U64 *msf_stream_take_counter = 0; if(lane_idx() == 0) { msf_raw_stream_table = msf_raw_stream_table_from_data(scratch2.arena, params->input_pdb_data); @@ -397,18 +398,17 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) msf->page_count = msf_raw_stream_table->total_page_count; msf->stream_count = msf_raw_stream_table->stream_count; msf->streams = push_array(scratch.arena, String8, msf->stream_count); + msf_stream_take_counter = push_array(scratch.arena, U64, 1); } lane_sync_u64(&msf, 0); lane_sync_u64(&msf_raw_stream_table, 0); // rjf: do wide fill { - U64 msf_stream_take_counter = 0; - U64 *msf_stream_take_counter_ptr = &msf_stream_take_counter; - lane_sync_u64(&msf_stream_take_counter_ptr, 0); + lane_sync_u64(&msf_stream_take_counter, 0); for(;;) { - U64 stream_idx = ins_atomic_u64_inc_eval(msf_stream_take_counter_ptr) - 1; + U64 stream_idx = ins_atomic_u64_inc_eval(msf_stream_take_counter) - 1; if(stream_idx >= msf->stream_count) { break; @@ -611,11 +611,13 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) ProfScope("parse all syms & c13 line info streams") { //- rjf: setup outputs + U64 *task_counter = 0; if(lane_idx() == 0) { all_syms_count = comp_units->count+1; // +1 for global symbol stream from DBI all_syms = push_array(scratch.arena, CV_SymParsed *, all_syms_count); all_c13s = push_array(scratch.arena, CV_C13Parsed *, all_syms_count); + task_counter = push_array(scratch.arena, U64, 1); } lane_sync_u64(&all_syms_count, 0); lane_sync_u64(&all_syms, 0); @@ -623,13 +625,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: wide fill { - U64 task_counter = 0; - U64 *task_counter_ptr = &task_counter; - lane_sync_u64(&task_counter_ptr, 0); + lane_sync_u64(&task_counter, 0); U64 task_count = all_syms_count; for(;;) { - U64 task_idx = ins_atomic_u64_inc_eval(task_counter_ptr) - 1; + U64 task_idx = ins_atomic_u64_inc_eval(task_counter) - 1; if(task_idx >= task_count) { break; @@ -831,14 +831,13 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) String8Node **hit_path_slots = push_array(scratch2.arena, String8Node *, hit_path_slots_count); //- rjf: take units across lanes, find all file paths - U64 sym_take_counter = 0; - U64 *sym_take_counter_ptr = &sym_take_counter; - lane_sync_u64(&sym_take_counter_ptr, 0); + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); ProfScope("take units across lanes, find all file paths") for(;;) { //- rjf: take next unit - U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter_ptr) - 1; + U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; if(unit_idx >= comp_units->count) { break; @@ -1217,13 +1216,12 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_SubsetFlag_LineInfo| RDIM_SubsetFlag_InlineLineInfo)) { - U64 sym_take_counter = 0; - U64 *sym_take_counter_ptr = &sym_take_counter; - lane_sync_u64(&sym_take_counter_ptr, 0); + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); ProfScope("wide fill") for(;;) { //- rjf: take next unit - U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter_ptr) - 1; + U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; if(unit_idx >= comp_units->count) { break; @@ -3333,13 +3331,12 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_SubsetFlag_LinkNameProcedureNameMap| RDIM_SubsetFlag_Types)) { - U64 sym_take_counter = 0; - U64 *sym_take_counter_ptr = &sym_take_counter; - lane_sync_u64(&sym_take_counter_ptr, 0); + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); for(;;) { //- rjf: take next sym - U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter_ptr) - 1; + U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; if(sym_idx >= all_syms_count) { break; From 2fbe45cd478b2e0ea7c1079e5298b0f0439f2c5b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 26 Feb 2026 16:22:05 -0800 Subject: [PATCH 262/850] sync before scratch_end to prevent race in the result fill --- src/rdi_from_pdb/rdi_from_pdb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 83c6f7f5..07707dce 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -4411,6 +4411,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) result.procedures = *all_procedures; result.scopes = *all_scopes; result.inline_sites = *all_inline_sites; + + lane_sync(); } scratch_end(scratch); From b49c9029475855bd9cb97952f59d04cd6b028a29 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 27 Feb 2026 00:55:37 -0800 Subject: [PATCH 263/850] remove vim mode line --- src/lib_rdi/rdi_parse.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib_rdi/rdi_parse.c b/src/lib_rdi/rdi_parse.c index 8f9515f6..8cd1d69d 100644 --- a/src/lib_rdi/rdi_parse.c +++ b/src/lib_rdi/rdi_parse.c @@ -2446,5 +2446,3 @@ SINTa rr_lzb_simple_encode_veryfast(rr_lzb_simple_context * fh, #undef DO_FAST_LAZY_MATCH #undef DO_FAST_2ND_HASH -//===================================================== -// vim:noet:sw=4:ts=4 From 8007c158fadf56654e7cca6a4cadf78376c40d82 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 27 Feb 2026 11:06:56 -0800 Subject: [PATCH 264/850] add API to DWARF writer that defines forward references and fix method conversion in the converter --- src/dwarf/dwarf_writer.c | 30 ++++++++++++++------ src/dwarf/dwarf_writer.h | 6 ++-- src/rdi/rdi_local.c | 2 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 43 +++++++++++++++++++++++------ src/torture/torture_d2r.c | 10 +++---- 5 files changed, 65 insertions(+), 26 deletions(-) diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index 6b0835a9..b7de4503 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -327,9 +327,30 @@ dw_make_abbrev_entry(Arena *arena, DW_WriterTag *tag) internal DW_WriterTag * dw_writer_tag_begin(DW_Writer *writer, DW_TagKind kind) +{ + DW_WriterTag *tag = dw_writer_tag_reserve(writer, kind); + dw_writer_tag_begin_reserved(writer, tag); + return tag; +} + +internal void +dw_writer_tag_end(DW_Writer *writer) +{ + // pop to parent + writer->current = writer->current->parent; +} + +internal DW_WriterTag * +dw_writer_tag_reserve(DW_Writer *writer, DW_TagKind kind) { DW_WriterTag *tag = dw_writer_tag_chunk_list_push(writer->arena, &writer->tag_chunk_list, 512); tag->kind = kind; + return tag; +} + +internal void +dw_writer_tag_begin_reserved(DW_Writer *writer, DW_WriterTag *tag) +{ tag->parent = writer->current; // add tag to the tree @@ -339,15 +360,6 @@ dw_writer_tag_begin(DW_Writer *writer, DW_TagKind kind) writer->root = tag; } writer->current = tag; - - return tag; -} - -internal void -dw_writer_tag_end(DW_Writer *writer) -{ - // pop to parent - writer->current = writer->current->parent; } internal DW_WriterAttrib * diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index c4e78b94..eb8a3e84 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -259,8 +259,10 @@ internal U64 dw_serial_push_form(Arena *arena, String8List *srl, DW_Version vers //////////////////////////////// // Info -internal DW_WriterTag * dw_writer_tag_begin(DW_Writer *writer, DW_TagKind kind); -internal void dw_writer_tag_end (DW_Writer *writer); +internal DW_WriterTag * dw_writer_tag_reserve (DW_Writer *writer, DW_TagKind kind); +internal DW_WriterTag * dw_writer_tag_begin (DW_Writer *writer, DW_TagKind kind); +internal void dw_writer_tag_begin_reserved(DW_Writer *writer, DW_WriterTag *tag); +internal void dw_writer_tag_end (DW_Writer *writer); internal DW_WriterAttrib * dw_writer_push_attrib (DW_Writer *writer, DW_AttribKind kind, DW_WriterForm form ); internal DW_WriterAttrib * dw_writer_push_attrib_address (DW_Writer *writer, DW_AttribKind kind, U64 address ); diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index e69eb90c..73fa3c11 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1363,7 +1363,7 @@ lane_sync(); if(flags & RDI_DumpSubsetFlag_##name) ProfScope(#name) return result_strings; } -#if 0 +#if SUBPROGRAM_CONVERSION_TEST internal String8 rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_TypeNode *type) { diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index d0db1640..1919a722 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1706,6 +1706,11 @@ d2r_convert_types(Arena *arena, type->direct_type = enum_base_type; } } break; + case DW_TagKind_SubProgram: { + if ( ! dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Declaration)) { + break; + } + } // fall-through case DW_TagKind_SubroutineType: { RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); @@ -1721,10 +1726,13 @@ d2r_convert_types(Arena *arena, log_user_errorf("unexpected tag @ .debug_info+%llx", tag.info_off); } } + + DW_TagNode *parent = d2r_tag_iterator_parent_tag_node(it); + B32 is_method = parent->tag.kind == DW_TagKind_StructureType || parent->tag.kind == DW_TagKind_ClassType; // init proceudre type RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = RDI_TypeKind_Function; + type->kind = is_method ? RDI_TypeKind_Method : RDI_TypeKind_Function; type->byte_size = cu->address_size; type->direct_type = ret_type; type->count = param_list.count; @@ -2330,6 +2338,12 @@ d2r_convert_symbols(Arena *arena, d2r_tag_iterator_skip_children(it); } break; case DW_TagKind_SubProgram: { + // handled during type conversion step + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Declaration)) { + d2r_tag_iterator_skip_children(it); + break; + } + DW_InlKind inl = DW_Inl_NotInlined; if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Inline)) { inl = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Inline); } @@ -2354,6 +2368,12 @@ d2r_convert_symbols(Arena *arena, RDIM_Type *container_type = 0; if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ContainingType)) { container_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_ContainingType); + } else { + DW_TagNode *parent = d2r_tag_iterator_parent_tag_node(it); + container_type = d2r_type_from_offset(type_table, parent->tag.info_off); + if (container_type == 0) { + log_user_errorf("ERROR: failed to infer parent type of subprogram from .debug_info+0x%llx\n", parent->tag.info_off); + } } // get frame base expression @@ -2380,13 +2400,19 @@ d2r_convert_symbols(Arena *arena, // sub program with user-defined parent tag is a method DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_StructureType) { - RDI_MemberKind member_kind = RDI_MemberKind_NULL; - DW_VirtualityKind virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality); - switch (virtuality) { - case DW_VirtualityKind_None: member_kind = RDI_MemberKind_Method; break; - case DW_VirtualityKind_Virtual: member_kind = RDI_MemberKind_VirtualMethod; break; - case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal - default: { log_user_errorf("unhandled virtuality kind"); } break; + // DW_VirtualityKind -> RDI_MemberKind + RDI_MemberKind member_kind = RDI_MemberKind_NULL; + { + DW_VirtualityKind virtuality = DW_VirtualityKind_None; + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Virtuality)) { + virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality); + switch (virtuality) { + case DW_VirtualityKind_None: member_kind = RDI_MemberKind_Method; break; + case DW_VirtualityKind_Virtual: member_kind = RDI_MemberKind_VirtualMethod; break; + case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal + default: { log_user_errorf("unhandled virtuality kind"); } break; + } + } } RDIM_Type *type = d2r_type_from_offset(type_table, parent_tag.info_off); @@ -2504,7 +2530,6 @@ d2r_convert_symbols(Arena *arena, var->type = type; var->offset = voff; var->container_symbol = 0; - var->container_type = 0; // TODO: NotImplemented; } } break; case DW_TagKind_FormalParameter: { diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index c929eb59..1255e1c1 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -320,7 +320,7 @@ T_BeginTest(d2r_checksums) } T_EndTest; -#if 0 +#if SUBPROGRAM_CONVERSION_TEST T_BeginTest(d2r_subprogram) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); @@ -404,17 +404,17 @@ T_BeginTest(d2r_subprogram) // -------------------------------------------------------------------------------- - DW_WriterTag *my_struct_type = dw_writer_declare_tag(writer); + DW_WriterTag *my_struct_type = dw_writer_tag_reserve(writer, DW_TagKind_StructureType); DW_WriterTag *const_my_struct_type = dw_writer_tag_begin(writer, DW_TagKind_ConstType); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_type); dw_writer_tag_end(writer); - dw_writer_tag_begin(writer, DW_TagKind_PointerType); + DW_WriterTag *my_struct_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, const_my_struct_type); dw_writer_tag_end(writer); - dw_writer_tag_begin_define(writer, DW_TagKind_StructureType, my_struct_type); + dw_writer_tag_begin_reserved(writer, my_struct_type); dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyStructure"); dw_writer_push_attrib_uint (writer, DW_AttribKind_ByteSize, 0x100); @@ -423,7 +423,7 @@ T_BeginTest(d2r_subprogram) dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_method_this_type); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_ptr_type); dw_writer_tag_end(writer); dw_writer_tag_end(writer); dw_writer_tag_end(writer); From 9227e884ac1d8f8e82e603493607b0effc0e2f74 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 2 Mar 2026 12:03:40 -0800 Subject: [PATCH 265/850] san -> asan / ubsan --- build.bat | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build.bat b/build.bat index e274e20f..94711724 100644 --- a/build.bat +++ b/build.bat @@ -15,7 +15,7 @@ cd /D "%~dp0" :: `build raddbg` :: `build raddbg clang` :: `build raddbg release` -:: `build raddbg san telemetry` +:: `build raddbg asan telemetry` :: `build rdi_from_pdb` :: :: For a full list of possible build targets and their build command lines, @@ -23,7 +23,8 @@ cd /D "%~dp0" :: :: Below is a list of all possible non-target command line options: :: -:: - `san`: enable address sanitizer +:: - `asan`: enable address sanitizer +:: - `ubsan`: enable undefined-behavior sanitizer :: - `telemetry`: enable RAD telemetry profiling support :: - `spall`: enable spall profiling support @@ -42,7 +43,8 @@ if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set auto_compile_flags= if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled] if "%spall%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_SPALL=1 && echo [spall profiling enabled] -if "%san%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address -fsanitize=undefined && echo [san enabled] +if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled] +if "%ubsan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=undefined && echo [ubsan enabled] if "%opengl%"=="1" set auto_compile_flags=%auto_compile_flags% -DR_BACKEND=R_BACKEND_OPENGL && echo [opengl render backend] if "%dwarf%"=="1" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gdwarf && echo [dwarf debug info] if "%dwarf%"=="" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gcodeview From 2af3990971462320aae8d3497b056bdd2ce70444 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 2 Mar 2026 12:17:03 -0800 Subject: [PATCH 266/850] do not rely on lane 0 scratch ptrs for results in p2r - prone to races --- src/rdi_from_pdb/rdi_from_pdb.c | 111 ++++++++++++++++++-------------- src/x64/x64.c | 96 +++++++++++++-------------- 2 files changed, 111 insertions(+), 96 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 07707dce..20504b8a 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3701,10 +3701,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: increment procedure counter procedure_num += 1; - + // reset S_REGREL32 index regrel_idx = 0; - + proc_flags = proc32->flags; }break; @@ -3735,7 +3735,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: determine if this is a parameter RDI_LocalKind local_kind = regrel_idx < curr_proc_symbol->type->count ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable; - + // rjf: determine if we need an extra indirection to the value B32 extra_indirection_to_value = 0; if(type != 0) @@ -3748,7 +3748,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) }break; } } - + // If the return local does not fit in a register MSVC does not assign it a type. // So we infer the return type from the signature. // @@ -3799,7 +3799,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) rdim_local_push_location_case(arena, sym_scopes, local, loc2, voff_range); } } - + regrel_idx += 1; }break; @@ -4268,91 +4268,108 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) ////////////////////////////////////////////////////////////// //- rjf: join all lane symbols // - RDIM_LocationChunkList *all_locations = 0; - RDIM_SymbolChunkList *all_procedures = 0; - RDIM_SymbolChunkList *all_global_variables = 0; - RDIM_SymbolChunkList *all_thread_variables = 0; - RDIM_SymbolChunkList *all_constants = 0; - RDIM_ScopeChunkList *all_scopes = 0; - RDIM_InlineSiteChunkList *all_inline_sites = 0; - RDIM_TypeChunkList *all_types = 0; + RDIM_LocationChunkList all_locations = {0}; + RDIM_SymbolChunkList all_procedures = {0}; + RDIM_SymbolChunkList all_global_variables = {0}; + RDIM_SymbolChunkList all_thread_variables = {0}; + RDIM_SymbolChunkList all_constants = {0}; + RDIM_ScopeChunkList all_scopes = {0}; + RDIM_InlineSiteChunkList all_inline_sites = {0}; + RDIM_TypeChunkList all_types = {0}; { + RDIM_LocationChunkList *all_locations_ptr = 0; + RDIM_SymbolChunkList *all_procedures_ptr = 0; + RDIM_SymbolChunkList *all_global_variables_ptr = 0; + RDIM_SymbolChunkList *all_thread_variables_ptr = 0; + RDIM_SymbolChunkList *all_constants_ptr = 0; + RDIM_ScopeChunkList *all_scopes_ptr = 0; + RDIM_InlineSiteChunkList *all_inline_sites_ptr = 0; + RDIM_TypeChunkList *all_types_ptr = 0; if(lane_idx() == 0) { - all_locations = push_array(scratch.arena, RDIM_LocationChunkList, 1); - all_procedures = push_array(scratch.arena, RDIM_SymbolChunkList, 1); - all_global_variables = push_array(scratch.arena, RDIM_SymbolChunkList, 1); - all_thread_variables = push_array(scratch.arena, RDIM_SymbolChunkList, 1); - all_constants = push_array(scratch.arena, RDIM_SymbolChunkList, 1); - all_scopes = push_array(scratch.arena, RDIM_ScopeChunkList, 1); - all_inline_sites = push_array(scratch.arena, RDIM_InlineSiteChunkList, 1); - all_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); + all_locations_ptr = push_array(scratch.arena, RDIM_LocationChunkList, 1); + all_procedures_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_global_variables_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_thread_variables_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_constants_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_scopes_ptr = push_array(scratch.arena, RDIM_ScopeChunkList, 1); + all_inline_sites_ptr = push_array(scratch.arena, RDIM_InlineSiteChunkList, 1); + all_types_ptr = push_array(scratch.arena, RDIM_TypeChunkList, 1); } - lane_sync_u64(&all_locations, 0); - lane_sync_u64(&all_procedures, 0); - lane_sync_u64(&all_global_variables, 0); - lane_sync_u64(&all_thread_variables, 0); - lane_sync_u64(&all_constants, 0); - lane_sync_u64(&all_scopes, 0); - lane_sync_u64(&all_inline_sites, 0); - lane_sync_u64(&all_types, 0); + lane_sync_u64(&all_locations_ptr, 0); + lane_sync_u64(&all_procedures_ptr, 0); + lane_sync_u64(&all_global_variables_ptr, 0); + lane_sync_u64(&all_thread_variables_ptr, 0); + lane_sync_u64(&all_constants_ptr, 0); + lane_sync_u64(&all_scopes_ptr, 0); + lane_sync_u64(&all_inline_sites_ptr, 0); + lane_sync_u64(&all_types_ptr, 0); if(lane_idx() == lane_from_task_idx(0)) ProfScope("join locations") { for EachIndex(idx, all_syms_count) { - rdim_location_chunk_list_concat_in_place(all_locations, &syms_locations[idx]); + rdim_location_chunk_list_concat_in_place(all_locations_ptr, &syms_locations[idx]); } } if(lane_idx() == lane_from_task_idx(1)) ProfScope("join procedures") { for EachIndex(idx, all_syms_count) { - rdim_symbol_chunk_list_concat_in_place(all_procedures, &syms_procedures[idx]); + rdim_symbol_chunk_list_concat_in_place(all_procedures_ptr, &syms_procedures[idx]); } } if(lane_idx() == lane_from_task_idx(2)) ProfScope("join global variables") { for EachIndex(idx, all_syms_count) { - rdim_symbol_chunk_list_concat_in_place(all_global_variables, &syms_global_variables[idx]); + rdim_symbol_chunk_list_concat_in_place(all_global_variables_ptr, &syms_global_variables[idx]); } } if(lane_idx() == lane_from_task_idx(3)) ProfScope("join thread variables") { for EachIndex(idx, all_syms_count) { - rdim_symbol_chunk_list_concat_in_place(all_thread_variables, &syms_thread_variables[idx]); + rdim_symbol_chunk_list_concat_in_place(all_thread_variables_ptr, &syms_thread_variables[idx]); } } if(lane_idx() == lane_from_task_idx(4)) ProfScope("join constants") { for EachIndex(idx, all_syms_count) { - rdim_symbol_chunk_list_concat_in_place(all_constants, &syms_constants[idx]); + rdim_symbol_chunk_list_concat_in_place(all_constants_ptr, &syms_constants[idx]); } } if(lane_idx() == lane_from_task_idx(5)) ProfScope("join scopes") { for EachIndex(idx, all_syms_count) { - rdim_scope_chunk_list_concat_in_place(all_scopes, &syms_scopes[idx]); + rdim_scope_chunk_list_concat_in_place(all_scopes_ptr, &syms_scopes[idx]); } } if(lane_idx() == lane_from_task_idx(6)) ProfScope("join inline sites") { for EachIndex(idx, all_syms_count) { - rdim_inline_site_chunk_list_concat_in_place(all_inline_sites, &syms_inline_sites[idx]); + rdim_inline_site_chunk_list_concat_in_place(all_inline_sites_ptr, &syms_inline_sites[idx]); } } if(lane_idx() == lane_from_task_idx(7)) ProfScope("join typedefs") { for EachIndex(idx, all_syms_count) { - rdim_type_chunk_list_concat_in_place(&all_types__pre_typedefs, &syms_typedefs[idx]); + rdim_type_chunk_list_concat_in_place(all_types__pre_typedefs_ptr, &syms_typedefs[idx]); } - *all_types = all_types__pre_typedefs; + *all_types_ptr = all_types__pre_typedefs; } + lane_sync(); + all_locations = *all_locations_ptr; + all_procedures = *all_procedures_ptr; + all_global_variables = *all_global_variables_ptr; + all_thread_variables = *all_thread_variables_ptr; + all_constants = *all_constants_ptr; + all_scopes = *all_scopes_ptr; + all_inline_sites = *all_inline_sites_ptr; + all_types = *all_types_ptr; } lane_sync(); @@ -4400,19 +4417,17 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) result.top_level_info = top_level_info; result.binary_sections = binary_sections; result.units = all_units; - result.types = *all_types; + result.types = all_types; result.udts = all_udts; result.src_files = all_src_files; result.line_tables = all_line_tables; - result.locations = *all_locations; - result.global_variables = *all_global_variables; - result.thread_variables = *all_thread_variables; - result.constants = *all_constants; - result.procedures = *all_procedures; - result.scopes = *all_scopes; - result.inline_sites = *all_inline_sites; - - lane_sync(); + result.locations = all_locations; + result.global_variables = all_global_variables; + result.thread_variables = all_thread_variables; + result.constants = all_constants; + result.procedures = all_procedures; + result.scopes = all_scopes; + result.inline_sites = all_inline_sites; } scratch_end(scratch); diff --git a/src/x64/x64.c b/src/x64/x64.c index 66ad5961..e099d9de 100644 --- a/src/x64/x64.c +++ b/src/x64/x64.c @@ -119,66 +119,66 @@ x64_set_debug_break(U64 *drs, U64 trap_idx, U64 addr, U64 size, X64_BreakpointTy { // set breakpoint address switch (trap_idx) { - case 0: { drs[0] = addr; } break; - case 1: { drs[1] = addr; } break; - case 2: { drs[2] = addr; } break; - case 3: { drs[3] = addr; } break; - default: { InvalidPath; } break; + case 0: { drs[0] = addr; } break; + case 1: { drs[1] = addr; } break; + case 2: { drs[2] = addr; } break; + case 3: { drs[3] = addr; } break; + default: { InvalidPath; } break; } - + // enable breakpoint drs[7] &= ~(3 << (trap_idx * 2)); switch (bp_type) { - case X64_BreakpointType_Null: break; - case X64_BreakpointType_Local: { drs[7] |= 1 << (trap_idx * 2); } break; - case X64_BreakpointType_Global: { drs[7] |= 2 << (trap_idx * 2); } break; - default: { InvalidPath; } break; + case X64_BreakpointType_Null: break; + case X64_BreakpointType_Local: { drs[7] |= 1 << (trap_idx * 2); } break; + case X64_BreakpointType_Global: { drs[7] |= 2 << (trap_idx * 2); } break; + default: { InvalidPath; } break; } - + // set break access type switch (break_type) { - case X64_DebugBreakType_Exec: + case X64_DebugBreakType_Exec: Assert(size == 0); - case X64_DebugBreakType_Null: { - drs[7] &= ~((1u << 16) << (trap_idx * 4)); - drs[7] &= ~((1u << 17) << (trap_idx * 4)); - } break; - case X64_DebugBreakType_Write: { - drs[7] |= (1u << 16) << (trap_idx * 4); - drs[7] &= ~((1u << 17) << (trap_idx * 4)); - } break; - case X64_DebugBreakType_ReadWriteIO: { - drs[7] &= ~((1u << 16) << (trap_idx * 4)); - drs[7] |= (1u << 17) << (trap_idx * 4); - } break; - case X64_DebugBreakType_ReadWriteNoFetch: { - drs[7] |= (1u << 16) << (trap_idx * 4); - drs[7] |= (1u << 17) << (trap_idx * 4); - } break; - default: { InvalidPath; } break; + case X64_DebugBreakType_Null: { + drs[7] &= ~((1ull << 16) << (trap_idx * 4)); + drs[7] &= ~((1ull << 17) << (trap_idx * 4)); + } break; + case X64_DebugBreakType_Write: { + drs[7] |= (1ull << 16) << (trap_idx * 4); + drs[7] &= ~((1ull << 17) << (trap_idx * 4)); + } break; + case X64_DebugBreakType_ReadWriteIO: { + drs[7] &= ~((1ull << 16) << (trap_idx * 4)); + drs[7] |= (1ull << 17) << (trap_idx * 4); + } break; + case X64_DebugBreakType_ReadWriteNoFetch: { + drs[7] |= (1u << 16) << (trap_idx * 4); + drs[7] |= (1u << 17) << (trap_idx * 4); + } break; + default: { InvalidPath; } break; } - + // set breakpoint size switch (size) { - case 0: - case 1: { - drs[7] &= ~((1u << 18) << (trap_idx * 4)); - drs[7] &= ~((1u << 19) << (trap_idx * 4)); - } break; - case 2: { - drs[7] |= (1 << 18) << (trap_idx * 4); - drs[7] &= ~((1 << 19) << (trap_idx * 4)); - } break; - case 4: { - drs[7] |= (1 << 18) << (trap_idx * 4); - drs[7] |= (1 << 19) << (trap_idx * 4); - } break; - case 8: { - drs[7] &= ~((1 << 18) << (trap_idx * 4)); - drs[7] |= (1 << 19) << (trap_idx * 4); - } break; - default: { InvalidPath; } + case 0: + case 1: { + drs[7] &= ~((1ull << 18) << (trap_idx * 4)); + drs[7] &= ~((1ull << 19) << (trap_idx * 4)); + } break; + case 2: { + drs[7] |= (1 << 18) << (trap_idx * 4); + drs[7] &= ~((1 << 19) << (trap_idx * 4)); + } break; + case 4: { + drs[7] |= (1 << 18) << (trap_idx * 4); + drs[7] |= (1 << 19) << (trap_idx * 4); + } break; + case 8: { + drs[7] &= ~((1 << 18) << (trap_idx * 4)); + drs[7] |= (1 << 19) << (trap_idx * 4); + } break; + default: { InvalidPath; } } } From 4312ee14fd389d4961a98e3e224b33aeb577a4d7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 3 Mar 2026 16:24:54 -0800 Subject: [PATCH 267/850] first pass at (rdi -> loose rdim) path, used in (rdi * ... * rdi) -> rdi joining in radbin; plug in regular conversion path before voff -> line & breakpad paths in radbin, such that PDBs, DWARFs, RDIs, etc. can be used as input; fix up voff -> line path to plug into regular output systems; remove String8 union thing - three reasons: (a) it was only ever introduced for convenience in Linux layers, so let's just keep zero-terminated Linux nonsense in Linux land, (b) it was just alternate syntax for a cast, so let's just cast, (c) it was misleading - 'cstr' implies null-termination, which String8 of course doesn't guarantee. this led to some misuses, where .cstr was trusted to be zero-terminated, when that was not necessarily true (semaphore opening). --- src/base/base_strings.h | 6 +- src/demon/linux/demon_core_linux.c | 588 +++++++++--------- src/lib_rdi/rdi.h | 930 ++++++++++++++--------------- src/lib_rdi_make/rdi_make.c | 82 +-- src/lib_rdi_make/rdi_make.h | 5 + src/linker/lnk_debug_info.c | 4 +- src/msf/msf_parse.c | 3 +- src/os/core/linux/os_core_linux.c | 81 +-- src/radbin/radbin.c | 452 +++++++------- src/rdi_from_pdb/rdi_from_pdb.c | 1 - src/rdi_make/rdi_make_local.c | 230 +++++++ src/rdi_make/rdi_make_local.h | 1 + src/third_party/radsort/radsort.h | 2 +- src/third_party/stb/stb_sprintf.h | 30 +- src/torture/torture.h | 44 +- src/torture/torture_d2r.c | 524 ++++++++-------- src/torture/torture_dwarf.c | 322 +++++----- 17 files changed, 1797 insertions(+), 1508 deletions(-) diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 9692eda4..8912d1e1 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -10,11 +10,7 @@ typedef struct String8 String8; struct String8 { - union - { - U8 *str; - char *cstr; - }; + U8 *str; U64 size; }; diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 12104181..5ba475a8 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -106,21 +106,21 @@ dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) { Temp scratch = scratch_begin(&arena, 1); - String8 exe_link_path = str8f(scratch.arena, "/proc/%d/exe", pid); - String8List parts = {0}; - int readlink_result = 0; + String8 exe_link_path = str8f(scratch.arena, "/proc/%d/exe", pid); + String8List parts = {0}; + int readlink_result = 0; for(S64 r = 0, cap = PATH_MAX; r < 4; cap *= 2, r += 1) { U8 *buffer = push_array(arena, U8, cap); - readlink_result = readlink(exe_link_path.cstr, (char *)buffer, cap); - + readlink_result = readlink((char *)exe_link_path.str, (char *)buffer, cap); + if(readlink_result < 0) { break; } - + str8_list_push(scratch.arena, &parts, str8(buffer, readlink_result)); - + if(readlink_result < cap) { break; @@ -136,32 +136,32 @@ internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) { Temp scratch = scratch_begin(&arena, 1); - + String8 dl_path = {0}; - - int maps_fd = OS_LNX_RETRY_ON_EINTR(open(str8f(scratch.arena, "/proc/%d/maps", pid).cstr, O_RDONLY)); + + int maps_fd = OS_LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY)); if(maps_fd != -1) { // read entire /proc/pid/maps U64 maps_size = dmn_lnx_size_from_fd(maps_fd, MB(1)); U8 *maps_ptr = push_array(scratch.arena, U8, maps_size); U64 read_size = dmn_lnx_read(maps_fd, r1u64(0, maps_size), maps_ptr); - - // split map file on lines + + // split map file on lines String8List lines = str8_split_by_string_chars(scratch.arena, str8(maps_ptr, maps_size), str8_lit("\n"), 0); - + // scan each line until a virtual mapping whose low part matches the DL base address is found for EachNode(n, String8Node, lines.first) { String8 line = n->string; - + // split the string while respecting escape sequences String8List parts = {0}; for EachIndex(cursor, line.size) { if(parts.node_count > 5) { break; } if(line.str[cursor] == ' ') { continue; } - + // scan forward to the closing delimiter U64 token_start = cursor; for(; cursor < line.size; cursor += 1) @@ -173,18 +173,18 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) } if(line.str[cursor] == ' ') { break; } } - + // push sub-string to the list str8_list_push(scratch.arena, &parts, str8_substr(line, r1u64(token_start, cursor))); } - + // was line parsed correctly? if(parts.node_count < 5) { Assert(0 && "failed to parse map line"); continue; } - + // parse map virtual range String8List vaddr_list = str8_split_by_string_chars(scratch.arena, parts.first->string, str8_lit("-"), 0); if(vaddr_list.node_count != 2) { Assert(0 && "failed to parse virtual range portion of map line"); continue; } - + // does the low part match DL base address? U64 lo_vaddr = u64_from_str8(vaddr_list.first->string, 16); if(lo_vaddr == auxv_base) @@ -194,11 +194,11 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) break; } } - + OS_LNX_RETRY_ON_EINTR(close(maps_fd)); } else { Assert(0 && "failed to open DL fd"); } - + scratch_end(scratch); Assert(dl_path.size); return dl_path; @@ -208,19 +208,19 @@ internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid) { Temp scratch = scratch_begin(0, 0); - + ELF_Hdr64 exe = {0}; B32 is_read = 0; - - char *exe_path = push_str8f(scratch.arena, "/proc/%d/exe", pid).cstr; + + char *exe_path = (char *)str8f(scratch.arena, "/proc/%d/exe", pid).str; int exe_fd = OS_LNX_RETRY_ON_EINTR(open(exe_path, O_RDONLY)); - + if(exe_fd >= 0) { is_read = elf_read_ehdr(dmn_lnx_machine_op_mem_read, &exe_fd, 0, &exe); OS_LNX_RETRY_ON_EINTR(close(exe_fd)); } - + Assert(is_read); scratch_end(scratch); return exe; @@ -233,8 +233,8 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) DMN_LNX_Auxv result = {0}; // rjf: open aux data - String8 auxv_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int auxv_fd = OS_LNX_RETRY_ON_EINTR(open(auxv_path.cstr, O_RDONLY)); + String8 auxv_path = str8f(scratch.arena, "/proc/%d/auxv", pid); + int auxv_fd = OS_LNX_RETRY_ON_EINTR(open((char *)auxv_path.str, O_RDONLY)); // rjf: scan aux data if(auxv_fd >= 0) @@ -245,18 +245,18 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) ELF_Auxv64 auxv = {0}; switch(elf_class) { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Auxv32 auxv32 = {0}; - if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) { goto brkloop; } - auxv = elf_auxv64_from_auxv32(auxv32); - }break; - case ELF_Class_64: - { - if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) { goto brkloop; } - }break; - default:{NotImplemented;}break; + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Auxv32 auxv32 = {0}; + if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) { goto brkloop; } + auxv = elf_auxv64_from_auxv32(auxv32); + }break; + case ELF_Class_64: + { + if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) { goto brkloop; } + }break; + default:{NotImplemented;}break; } // rjf: fill result @@ -304,7 +304,7 @@ dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 { Assert(0 && "unable to read a program header"); } - + if(phdr.p_type == ELF_PType_Load) { U64 min = rebase + phdr.p_vaddr; @@ -313,7 +313,7 @@ dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 result.max = Max(result.max, max); } } - + return result; } @@ -326,10 +326,10 @@ dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, // rjf: read next dyn entry ELF_Dyn64 dyn = {0}; if(elf_read_dyn(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_cursor, elf_class, &dyn) != MachineOpResult_Ok) { Assert(0 && "unable to read dynamic"); } - + // rjf: break on zero if(dyn.tag == ELF_DynTag_Null) { break; } - + // extract reuiqred values out of dynamic section if(dyn.tag == ELF_DynTag_Strtab) { @@ -363,7 +363,7 @@ internal U64 dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) { U64 result = max_U64; - + for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) { ELF_Phdr64 phdr = {0}; @@ -371,14 +371,14 @@ dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_ { Assert(0 && "unable to read a program header"); } - + if(phdr.p_type == ELF_PType_Dynamic) { result = rebase + phdr.p_vaddr; break; } } - + return result; } @@ -386,24 +386,24 @@ internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) { Temp scratch = scratch_begin(0, 0); - + U64 rdebug_vaddr = 0; - + // load DL's header ELF_Hdr64 ehdr = {0}; if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, loader_vbase, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); goto exit; } - + U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; - + // find dynamic program header U64 phdr_vaddr = loader_vbase + ehdr.e_phoff; U64 dynamic_vaddr = dmn_lnx_find_dynamic_phdr(memory_fd, elf_class, rebase, phdr_vaddr, ehdr.e_phentsize, ehdr.e_phentsize); - + // extract necessary info out of dynamic program header U64 dynamic_info_rebase = is_rebased ? 0 : rebase; DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, dynamic_info_rebase, dynamic_vaddr); - + // extract symbol table count from available options U64 symbol_count = 0; if(dynamic_info.hash_vaddr) @@ -413,7 +413,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased { hash_entry_size = 8; } - + U64 chain_count = 0; if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) { @@ -429,7 +429,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased // TODO: extract count from GNU_HASH NotImplemented; } - + // scan symbol table for the rendezvous symbol if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) { @@ -441,16 +441,16 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased Assert(0 && "failed to read symbol table"); break; } - + Temp temp = temp_begin(scratch.arena); - + String8 symbol_name = {0}; if(symbol.st_name < dynamic_info.strtab_size) { U64 cap = dynamic_info.strtab_size - symbol.st_name; symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); } - + if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) { ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info); @@ -460,12 +460,12 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased break; } } - + temp_end(temp); } } -exit:; + exit:; scratch_end(scratch); return rdebug_vaddr; } @@ -474,33 +474,33 @@ internal DMN_LNX_ProbeList dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) { Temp scratch = scratch_begin(&arena, 1); - + DMN_LNX_ProbeList probes = {0}; - + ELF_Hdr64 ehdr = {0}; if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &fd, offset, &ehdr) != MachineOpResult_Ok) { goto exit; } - + U64 strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize; ELF_Shdr64 strtab_shdr = {0}; if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr) != MachineOpResult_Ok) { goto exit; } - + B32 found_probes = 0; B32 found_probes_base = 0; ELF_Shdr64 text_shdr = {0}; ELF_Shdr64 stapsdt_base_shdr = {0}; ELF_Shdr64 stapsdt_shdr = {0}; for(U64 shdr_off = offset + ehdr.e_shoff, shdr_opl = shdr_off + ehdr.e_shentsize * ehdr.e_shnum; - shdr_off < shdr_opl; - shdr_off += ehdr.e_shentsize) { + shdr_off < shdr_opl; + shdr_off += ehdr.e_shentsize) { ELF_Shdr64 shdr = {0}; if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr) != MachineOpResult_Ok) { goto exit; } - + if(shdr.sh_type == ELF_ShType_Note) { U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); - + if(str8_match(name, str8_lit(".note.stapsdt"), 0)) { stapsdt_shdr = shdr; @@ -512,7 +512,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); - + if(str8_match(name, str8_lit(".stapsdt.base"), 0)) { stapsdt_base_shdr = shdr; @@ -522,76 +522,76 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) text_shdr = shdr; } } - + if(found_probes && found_probes_base) { break; } } - + if(!found_probes || !found_probes_base) { goto exit; } - + U64 probes_base = stapsdt_base_shdr.sh_addr; Rng1U64 note_range = shift_1u64(r1u64(stapsdt_shdr.sh_offset, stapsdt_shdr.sh_offset + stapsdt_shdr.sh_size), offset); void *raw_note = push_array(arena, U8, stapsdt_shdr.sh_size); U64 note_read_size = dmn_lnx_read(fd, note_range, raw_note); if(note_read_size != dim_1u64(note_range)) { goto exit; } - + Arch arch = arch_from_elf_machine(ehdr.e_machine); ELF_NoteList note = elf_parse_note(scratch.arena, str8(raw_note, dim_1u64(note_range)), ehdr.e_ident[ELF_Identifier_Class], ehdr.e_machine); - + for EachNode(n, ELF_NoteNode, note.first) { ELF_Note *note = &n->v; if(!str8_match(note->owner, str8_lit("stapsdt"), 0)) { continue; } if(note->type != ELF_NoteType_STapSdt) { continue; } - + DMN_LNX_Probe probe = {0}; { U64 cursor = 0; U64 addr_size = ehdr.e_ident[ELF_Identifier_Class] == ELF_Class_64 ? 8 : 4; - + U64 pc = 0; U64 pc_size = str8_deserial_read(note->desc, cursor, &pc, addr_size, addr_size); if (pc_size == 0) { goto exit; } cursor += pc_size; - + U64 base_addr = 0; U64 base_addr_size = str8_deserial_read(note->desc, cursor, &base_addr, addr_size, addr_size); if (base_addr_size == 0) { goto exit; } cursor += base_addr_size; - + U64 semaphore = 0; U64 semaphore_size = str8_deserial_read(note->desc, cursor, &semaphore, addr_size, addr_size); if (semaphore_size == 0) { goto exit; } cursor += semaphore_size; - + String8 provider = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += provider.size + 1; if (cursor > note->desc.size) { goto exit; } - + String8 name = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += name.size + 1; if (cursor > note->desc.size) { goto exit; } - + String8 args = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); cursor += args.size + 1; if (cursor > note->desc.size) { goto exit; } - + U64 probe_rebase = image_base + (base_addr - probes_base); - + probe.provider = provider; probe.name = name; probe.args = stap_arg_array_from_string(arena, arch, args); probe.pc = pc + probe_rebase; probe.semaphore = semaphore ? semaphore + probe_rebase : 0; } - + DMN_LNX_ProbeNode *n = push_array(arena, DMN_LNX_ProbeNode, 1); n->v = probe; SLLQueuePush(probes.first, probes.last, n); probes.count += 1; } - -exit:; + + exit:; scratch_end(scratch); return probes; } @@ -627,28 +627,28 @@ internal DMN_LNX_Process * dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocesses, B32 is_cow) { Temp scratch = scratch_begin(0, 0); - + DMN_LNX_Process *process = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Process)->process; process->pid = pid; - process->fd = OS_LNX_RETRY_ON_EINTR(open(str8f(scratch.arena, "/proc/%d/mem", pid).cstr, O_RDWR)); + process->fd = OS_LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR)); process->state = state; process->debug_subprocesses = debug_subprocesses; process->is_cow = is_cow; process->parent_process = parent_process; - + // update pending process tracker if(state != DMN_LNX_ProcessState_Normal) { dmn_lnx_state->process_pending_creation += 1; } - + // add process to the list DLLPushBack(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); dmn_lnx_state->process_count += 1; - + // push pid -> DMN_LNX_Process mapping hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); - + scratch_end(scratch); return process; } @@ -657,7 +657,7 @@ internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) { DMN_LNX_ProcessCtx *ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; - + ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(process->pid); DMN_LNX_Auxv auxv = dmn_lnx_auxv_from_pid(process->pid, exe_ehdr.e_ident[ELF_Identifier_Class]); Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); @@ -666,14 +666,14 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; Rng1U64 image_vrange = dmn_lnx_compute_image_vrange(process->fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); Arena *ctx_arena = arena_alloc(); - + ELF_Class dl_class; { ELF_Hdr64 ehdr = {0}; if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &process->fd, auxv.base, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); } dl_class = ehdr.e_ident[ELF_Identifier_Class]; } - + // query xsave layout U64 xcr0 = 0; U64 xsave_size = 0; @@ -691,22 +691,22 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) } else { Assert(0 && "failed to get xstate"); } } - + // gather probes DMN_LNX_Probe **known_probes = push_array(ctx_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); { Temp scratch = scratch_begin(0, 0); - + String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, process->pid, auxv.base); - int dl_fd = OS_LNX_RETRY_ON_EINTR(open(dl_path.cstr, O_RDONLY)); - + int dl_fd = OS_LNX_RETRY_ON_EINTR(open((char *)dl_path.str, O_RDONLY)); + DMN_LNX_ProbeList probes = {0}; if(dl_fd >= 0) { probes = dmn_lnx_read_probes(ctx_arena, dl_fd, 0, auxv.base); OS_LNX_RETRY_ON_EINTR(close(dl_fd)); } - + for EachNode(n, DMN_LNX_ProbeNode, probes.first) { DMN_LNX_Probe *p = &n->v; @@ -717,10 +717,10 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) #undef X } } - + scratch_end(scratch); } - + ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; ctx->arena = arena_alloc(); ctx->arch = arch; @@ -731,13 +731,13 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) ctx->xcr0 = xcr0; ctx->xsave_size = Max(xsave_size, sizeof(X64_XSave)); ctx->xsave_layout = xsave_layout; - + // create main module DMN_LNX_Module *main_module = dmn_lnx_module_alloc(ctx, process->fd, base_vaddr, auxv.execfn, 1, 1); - + // glibc has a shortcut mapping for the main module hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, 0, main_module); - + return ctx; } @@ -756,7 +756,7 @@ dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, U64 reg_block_size = regs_block_size_from_arch(process->ctx->arch); reg_block = push_array(process->ctx->arena, U8, reg_block_size); } - + DMN_LNX_Thread *thread = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Thread)->thread; thread->tid = tid; thread->state = thread_state; @@ -766,20 +766,20 @@ dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, { thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); } - + // add thread to the list DLLPushBack(process->first_thread, process->last_thread, thread); process->thread_count += 1; - + // push tid -> thread mapping hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->tid, thread); - + // update global thread counter if(thread_state == DMN_LNX_ThreadState_PendingCreation) { dmn_lnx_state->threads_pending_creation += 1; } - + return thread; } @@ -788,16 +788,16 @@ dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 { DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, base_vaddr); if(module) { goto exit; } - + // parse out module's ELF header ELF_Hdr64 module_ehdr = {0}; if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, base_vaddr, &module_ehdr) != MachineOpResult_Ok) { goto exit; } - + // gather info about module U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; Rng1U64 module_vrange = dmn_lnx_compute_image_vrange(memory_fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); - + // read TLS index and TLS offset U64 tls_index = max_U64; U64 tls_offset = max_U64; @@ -818,7 +818,7 @@ dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 if(!dmn_lnx_read(memory_fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } } } - + module = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; module->base_vaddr = base_vaddr; module->name_vaddr = name_vaddr; @@ -830,15 +830,15 @@ dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 module->tls_index = tls_index; module->tls_offset = tls_offset; module->is_main = is_main; - + // add module to the list DLLPushBack(ctx->first_module, ctx->last_module, module); ctx->module_count += 1; - + // push base address -> module mapping hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, base_vaddr, module); - -exit:; + + exit:; return module; } @@ -858,26 +858,26 @@ dmn_lnx_process_release(DMN_LNX_Process *process) AssertAlways(dmn_lnx_state->process_count > 0); DLLRemove(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); dmn_lnx_state->process_count -= 1; - + // update pending process tracker if(process->state != DMN_LNX_ProcessState_Normal) { Assert(dmn_lnx_state->process_pending_creation > 0); dmn_lnx_state->process_pending_creation -= 1; } - + // close memory handle if(OS_LNX_RETRY_ON_EINTR(close(process->fd)) < 0) { Assert(0 && "failed to close memory descriptor"); } - + // remove pid mapping hash_table_purge_u64(dmn_lnx_state->pid_ht, process->pid); - + // release the context if(process->ctx) { dmn_lnx_process_ctx_release(process->ctx); } - + // release process entity dmn_lnx_entity_release((DMN_LNX_Entity *)process); } @@ -887,7 +887,7 @@ dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *ctx) { Assert(ctx->ref_count > 0); ctx->ref_count -= 1; - + if(ctx->ref_count == 0) { arena_release(ctx->arena); @@ -899,22 +899,22 @@ internal void dmn_lnx_thread_release(DMN_LNX_Thread *thread) { DMN_LNX_Process *process = thread->process; - + // purge tid mapping hash_table_purge_u64(dmn_lnx_state->tid_ht, thread->tid); - + // update global thread counter if(thread->state == DMN_LNX_ThreadState_PendingCreation) { AssertAlways(dmn_lnx_state->threads_pending_creation > 0); dmn_lnx_state->threads_pending_creation -= 1; } - + // remove thread from the list Assert(process->thread_count > 0); DLLRemove(process->first_thread, process->last_thread, thread); process->thread_count -= 1; - + // push reg block to the free list String8Node *reg_block_node; if(process->ctx->free_reg_block_nodes.node_count) @@ -927,7 +927,7 @@ dmn_lnx_thread_release(DMN_LNX_Thread *thread) } reg_block_node->string = str8(thread->reg_block, 0); str8_list_push_node(&process->ctx->free_reg_blocks, reg_block_node); - + dmn_lnx_entity_release((DMN_LNX_Entity *)thread); } @@ -938,10 +938,10 @@ dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module) Assert(ctx->module_count > 0); DLLRemove(ctx->first_module, ctx->last_module, module); ctx->module_count -= 1; - + // purge base addr -> module mapping hash_table_purge_u64(ctx->loaded_modules_ht, module->base_vaddr); - + dmn_lnx_entity_release((DMN_LNX_Entity *)module); } @@ -958,14 +958,14 @@ dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) result->xcr0 = ctx->xcr0; result->xsave_size = ctx->xsave_size; result->xsave_layout = ctx->xsave_layout; - + // clone probes result->probes = push_array(result->arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); for EachIndex(probe_idx, DMN_LNX_ProbeType_Count) { DMN_LNX_Probe *dst = result->probes[probe_idx]; DMN_LNX_Probe *src = ctx->probes[probe_idx]; - + dst->provider = str8_copy(result->arena, src->provider); dst->name = str8_copy(result->arena, src->name); dst->args_string = str8_copy(result->arena, src->args_string); @@ -973,7 +973,7 @@ dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) dst->pc = src->pc; dst->semaphore = src->semaphore; } - + // clone probe traps for EachNode(src, DMN_ActiveTrap, ctx->first_probe_trap) { @@ -984,20 +984,20 @@ dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) dst_trap->id = src_trap->id; dst_trap->flags = src_trap->flags; dst_trap->size = src_trap->size; - + DMN_ActiveTrap *dst = push_array(result->arena, DMN_ActiveTrap, 1); dst->trap = dst_trap; dst->swap_bytes = str8_copy(result->arena, src->swap_bytes); - + SLLQueuePush(result->first_probe_trap, result->last_probe_trap, dst); } - + // clone modules for EachNode(module, DMN_LNX_Module, ctx->first_module) { dmn_lnx_module_clone(result, module); } - + return result; } @@ -1007,14 +1007,14 @@ dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module) DMN_LNX_Module *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; *result = *module; result->next = result->prev = 0; - + // clone base addr mapping hash_table_push_u64_raw(process_ctx->arena, process_ctx->loaded_modules_ht, result->base_vaddr, result); - + // push module to the list DLLPushBack(process_ctx->first_module, process_ctx->last_module, module); process_ctx->module_count += 1; - + return result; } @@ -1105,15 +1105,15 @@ dmn_lnx_process_trap_probes(DMN_LNX_Process *process) for EachIndex(i, DMN_LNX_ProbeType_Count) { if(process->ctx->probes[i] == 0) { continue; } - + DMN_Trap *trap = push_array(process->ctx->arena, DMN_Trap, 1); trap->process = dmn_lnx_handle_from_process(process); trap->vaddr = process->ctx->probes[i]->pc; trap->id = i; - + DMN_ActiveTrap *active_trap = dmn_set_trap(process->ctx->arena, trap); SLLQueuePush(process->ctx->first_probe_trap, process->ctx->last_probe_trap, active_trap); - + if(BUILD_DEBUG && process->ctx->arch == Arch_x64) { Assert(active_trap->swap_bytes.size == 1 && active_trap->swap_bytes.str[0] == 0x90); @@ -1157,9 +1157,9 @@ internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) { AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - + B32 is_reg_block_read = 0; - + switch(thread->process->ctx->arch) { case Arch_Null: {} break; @@ -1173,7 +1173,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) OS_LNX_GprsX64 src; int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(src), .iov_base = &src })); if(ptrace_result < 0) { goto exit; } - + dst->r15.u64 = src.r15; dst->r14.u64 = src.r14; dst->r13.u64 = src.r13; @@ -1206,7 +1206,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) // xsave { Temp scratch = scratch_begin(0, 0); - + X64_XSave *xsave = 0; X64_FXSave *fxsave = 0; @@ -1216,7 +1216,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) void *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process_ctx->xsave_size, .iov_base = xsave_raw })); if(ptrace_result < 0) { goto exit; } - + xsave = xsave_raw; fxsave = &xsave->fxsave; } @@ -1227,7 +1227,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) fxsave = push_array(scratch.arena, X64_FXSave, 1); int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave })); if(ptrace_result < 0) { goto exit; } - + fxsave = 0; } @@ -1235,7 +1235,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) if(fxsave) { X64_FXSave *src = fxsave; - + // copy x87 registers dst->fcw.u16 = src->fcw; dst->fsw.u16 = src->fsw; @@ -1249,7 +1249,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) { MemoryCopy(&dst->st0 + i, src->st_space + i, sizeof(REGS_Reg80)); } - + // SSE registers are always available in x64 { U128 *xmm_d = fxsave->xmm_space; @@ -1260,13 +1260,13 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) } } } - + // copy xsave registers if(xsave) { // compact register layout is not supported AssertAlways(xsave->header.xcomp_bv == 0); - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_AVX) { AssertAlways(process_ctx->xsave_layout.avx_offset + 16*sizeof(REGS_Reg128) <= process_ctx->xsave_size); @@ -1277,7 +1277,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) MemoryCopy(&zmm_d[n].v[16], &avx_s[n], sizeof(REGS_Reg128)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_OPMASK) { AssertAlways(process_ctx->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process_ctx->xsave_size); @@ -1288,7 +1288,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM_H) { AssertAlways(process_ctx->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process_ctx->xsave_size); @@ -1299,7 +1299,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) MemoryCopy(&zmmh_d[n].v[32], &avx512h_s[n], sizeof(REGS_Reg256)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM) { AssertAlways(process_ctx->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process_ctx->xsave_size); @@ -1310,7 +1310,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) MemoryCopy(&zmm_d[n], &avx512_s[n], sizeof(REGS_Reg512)); } } - + if(xsave->header.xstate_bv & X64_XStateComponentFlag_CETU) { AssertAlways(process_ctx->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process_ctx->xsave_size); @@ -1338,7 +1338,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) } } } - + is_reg_block_read = 1; } break; case Arch_x86: @@ -1346,8 +1346,8 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) case Arch_arm32: { NotImplemented; } break; default: { InvalidPath; } break; } - -exit:; + + exit:; return is_reg_block_read; } @@ -1355,9 +1355,9 @@ internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) { AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - + B32 is_reg_block_written = 0; - + switch(thread->process->ctx->arch) { case Arch_Null: {} break; @@ -1403,7 +1403,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) // xsave { Temp scratch = scratch_begin(0, 0); - + X64_FXSave dst_fxsave = {0}; { dst_fxsave.fcw = src->fcw.u16; @@ -1414,14 +1414,14 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) dst_fxsave.fdp = src->fdp.u64; dst_fxsave.mxcsr = src->mxcsr.u32; dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32; - + REGS_Reg128 *st_d = (REGS_Reg128 *)dst_fxsave.st_space; REGS_Reg80 *st_s = &src->st0; for EachIndex(n, 8) { MemoryCopy(&st_d[n], &st_s[n], sizeof(REGS_Reg80)); } - + REGS_Reg128 *xmm_d = (REGS_Reg128 *)dst_fxsave.xmm_space; REGS_Reg512 *xmm_s = &src->zmm0; for EachIndex(n, 16) @@ -1429,7 +1429,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) MemoryCopy(&xmm_d[n], &xmm_s[n], sizeof(REGS_Reg128)); } } - + if(x64_is_xsave_supported()) { U8 *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); @@ -1437,7 +1437,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) dst->fxsave = dst_fxsave; dst->header.xstate_bv |= X64_XStateComponentFlag_FP; dst->header.xstate_bv |= X64_XStateComponentFlag_SSE; - + if(process_ctx->xsave_layout.avx_offset) { if(process_ctx->xsave_layout.avx_offset + sizeof(REGS_Reg128) * 16 <= process_ctx->xsave_size) @@ -1451,7 +1451,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) dst->header.xstate_bv |= X64_XStateComponentFlag_AVX; } } - + if(process_ctx->xsave_layout.opmask_offset) { if(process_ctx->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process_ctx->xsave_size) @@ -1466,7 +1466,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) } else { Assert(0 && "invalid xsave size"); goto exit; } } - + if(process_ctx->xsave_layout.zmm_h_offset) { if(process_ctx->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process_ctx->xsave_size) @@ -1481,7 +1481,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) } else { Assert(0 && "invalid xsave size"); goto exit; } } - + if(process_ctx->xsave_layout.zmm_offset) { if(process_ctx->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process_ctx->xsave_size) @@ -1496,7 +1496,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) } else { Assert(0 && "invalid xsave size"); goto exit; } } - + if(process_ctx->xsave_layout.cet_u_offset) { if(process_ctx->xsave_layout.cet_u_offset + sizeof(REGS_Reg64) * 2 <= process_ctx->xsave_size) @@ -1508,20 +1508,20 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) } else { Assert(0 && "invalid xsave size"); goto exit; } } - + // xsave Assert(dst->header.xcomp_bv == 0); // must always be zero int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process_ctx->xsave_size })); if(ptrace_result < 0) { goto exit; } } - + scratch_end(scratch); } // debug registers { src->dr7.u64 |= (1 << 10); - + REGS_Reg64 *dr_s = &src->dr0; for EachIndex(n, 8) { @@ -1541,8 +1541,8 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) case Arch_x86: { NotImplemented; }break; default: { InvalidPath; } break; } - -exit:; + + exit:; return is_reg_block_written; } @@ -1756,7 +1756,7 @@ dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread 1, // 31 SIGSYS 1, // 32 SIGUNUSED }; - + DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Exception; e->process = dmn_lnx_handle_from_process(thread->process); @@ -1764,7 +1764,7 @@ dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread e->instruction_pointer = dmn_lnx_thread_read_ip(thread); e->signo = signo; e->exception_repeated = signo < ArrayCount(is_repeatable) ? is_repeatable[signo] : 0; - + if(signo == SIGSEGV) { siginfo_t si = {0}; @@ -1801,19 +1801,19 @@ dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 ex { DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); DMN_LNX_Process *process = thread->process; - + // store main thread's exit code if(thread->tid == thread->process->pid) { thread->process->main_thread_exit_code = exit_code; } - + // push exit event dmn_lnx_push_event_exit_thread(arena, events, thread, exit_code); - + // release entity dmn_lnx_thread_release(thread); - + // auto exit process on last thread if(process->thread_count == 0) { @@ -1825,7 +1825,7 @@ internal DMN_LNX_Process * dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags) { DMN_LNX_Process *process = dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Normal, parent_process, !!(flags & DMN_LNX_CreateProcessFlag_DebugSubprocesses), !!(flags & DMN_LNX_CreateProcessFlag_Cow)); - + if(flags & DMN_LNX_CreateProcessFlag_ClonedMemory) { process->ctx = parent_process->ctx; @@ -1835,16 +1835,16 @@ dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN process->ctx = dmn_lnx_process_ctx_alloc(process, !!(flags & DMN_LNX_CreateProcessFlag_Rebased)); } process->ctx->ref_count += 1; - + // install probes in a process that does not have a cloned memory if(!(flags & DMN_LNX_CreateProcessFlag_ClonedMemory)) { dmn_lnx_process_trap_probes(process); } - + // create main thread dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, pid); - + // push events dmn_lnx_push_event_create_process(arena, events, process); for EachNode(thread, DMN_LNX_Thread, process->first_thread) @@ -1856,7 +1856,7 @@ dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN dmn_lnx_push_event_load_module(arena, events, process->first_thread, module); } dmn_lnx_push_event_handshake_complete(arena, events, process); - + return process; } @@ -1865,16 +1865,16 @@ dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) { DMN_LNX_Process *process = dmn_lnx_process_from_pid(pid); AssertAlways(process->thread_count == 0); - + // push module events for EachNode(module, DMN_LNX_Module, process->ctx->first_module) { dmn_lnx_push_event_unload_module(arena, events, process, module); } - + // push process exit event dmn_lnx_push_event_exit_process(arena, events, process); - + // release process dmn_lnx_process_release(process); } @@ -1883,27 +1883,27 @@ internal void dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr) { DMN_LNX_Process *process = thread->process; - + GNU_LinkMap64 map = {0}; for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) { // read out new link map item if(gnu_read_link_map(dmn_lnx_machine_op_mem_read, &process->fd, map_vaddr, process->ctx->dl_class, &map) != MachineOpResult_Ok) { break; } - + // was module already loaded? DMN_LNX_Module *module = hash_table_search_u64_raw(process->ctx->loaded_modules_ht, map.addr_vaddr); if(module) { continue; } - + // clone process ctx if(process->is_cow) { process->is_cow = 0; process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); } - + // alloc module module = dmn_lnx_module_alloc(process->ctx, process->fd, map.addr_vaddr, map.name_vaddr, name_space_id, 0); - + // push load module event dmn_lnx_push_event_load_module(arena, events, thread, module); } @@ -1913,15 +1913,15 @@ internal void dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr) { Temp scratch = scratch_begin(&arena, 1); - + DMN_LNX_ProcessCtx *ctx = process->ctx; - + // flag every module as inactive for EachNode(module, DMN_LNX_Module, ctx->first_module) { module->is_live = 0; } - + // mark live modules B32 is_64bit = ctx->dl_class == ELF_Class_64; GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); @@ -1934,7 +1934,7 @@ dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process module->is_live = 1; } } - + // collect unloaded modules DMN_LNX_ModulePtrList to_release = {0}; for EachNode(module, DMN_LNX_Module, ctx->first_module) @@ -1944,7 +1944,7 @@ dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process dmn_lnx_module_ptr_list_push(scratch.arena, &to_release, module); } } - + // clone process context if(to_release.count > 0) { @@ -1954,14 +1954,14 @@ dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); } } - + // push events and clean up unloaded modules for EachNode(module_n, DMN_LNX_ModulePtrNode, to_release.first) { dmn_lnx_push_event_unload_module(arena, events, process, module_n->v); dmn_lnx_module_release(process->ctx, module_n->v); } - + scratch_end(scratch); } @@ -1971,7 +1971,7 @@ dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); DMN_LNX_Process *process = thread->process; U64 ip = dmn_lnx_thread_read_ip(thread); - + // is this user trap? DMN_ActiveTrap *hit_user_trap = 0; { @@ -1988,7 +1988,7 @@ dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us } } } - + // is this a probe trap? DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; if(hit_user_trap == 0) @@ -2002,22 +2002,22 @@ dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us } } } - + if(probe_type == DMN_LNX_ProbeType_InitComplete) { B32 is_init_completed = 0; - + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_InitComplete]; U64 name_space_id = 0, rdebug_addr = 0; if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto init_complete_exit; } if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } - + GNU_RDebugInfo64 rdebug = {0}; if(gnu_read_r_debug(dmn_lnx_machine_op_mem_read, &process->fd, rdebug_addr, process->ctx->arch, &rdebug) != MachineOpResult_Ok) { goto init_complete_exit; } if(rdebug.r_version < 1) { goto init_complete_exit; } - + dmn_lnx_event_load_module(arena, events, thread, name_space_id, rdebug.r_map); - + is_init_completed = 1; init_complete_exit:; AssertAlways(is_init_completed); @@ -2025,14 +2025,14 @@ dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us else if(probe_type == DMN_LNX_ProbeType_RelocComplete) { B32 is_reloc_completed = 0; - + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_RelocComplete]; U64 name_space_id = 0, new_link_map_addr = 0; if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto reloc_complete_exit; } if(!stap_read_arg_u(probe->args.v[2], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) { goto reloc_complete_exit; } - + dmn_lnx_event_load_module(arena, events, thread, name_space_id, new_link_map_addr); - + is_reloc_completed = 1; reloc_complete_exit:; AssertAlways(is_reloc_completed); @@ -2040,19 +2040,19 @@ dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us else if(probe_type == DMN_LNX_ProbeType_UnmapComplete) { B32 is_unmap_completed = 0; - + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_UnmapComplete]; U64 name_space_id = 0, rdebug_vaddr = 0; if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } - + dmn_lnx_event_unload_module(arena, events, process, rdebug_vaddr); - + is_unmap_completed = 1; unmap_complete_exit:; AssertAlways(is_unmap_completed); } - + if(probe_type == DMN_LNX_ProbeType_Null) { // rollback IP on user traps @@ -2061,7 +2061,7 @@ dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us U64 ip = dmn_lnx_thread_read_ip(thread); dmn_lnx_thread_write_ip(thread, ip - 1); } - + DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Breakpoint; e->process = dmn_lnx_handle_from_process(process); @@ -2074,7 +2074,7 @@ internal void dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) { DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - + B32 is_valid = 1; U64 address = 0; switch(thread->process->ctx->arch) @@ -2110,7 +2110,7 @@ dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) { NotImplemented; } break; default: { InvalidPath; } break; } - + if(is_valid) { dmn_lnx_push_event_breakpoint(arena, events, thread, address); @@ -2127,10 +2127,10 @@ internal void dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid) { DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - + // clear single step flag dmn_lnx_set_single_step_flag(thread, 0); - + // push event dmn_lnx_push_event_single_step(arena, events, thread); } @@ -2139,10 +2139,10 @@ internal void dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo) { DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - + thread->pass_through_signal = 1; thread->pass_through_signo = signo; - + dmn_lnx_push_event_exception(arena, events, thread, signo); } @@ -2150,35 +2150,35 @@ internal DMN_LNX_Process * dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) { Temp scratch = scratch_begin(&arena, 1); - + // create process DMN_LNX_Process *process = dmn_lnx_event_create_process(arena, events, pid, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses|DMN_LNX_CreateProcessFlag_Rebased); - + // extract threads from /proc/pid/task { - String8 task_path = push_str8f(scratch.arena, "/proc/%d/task", pid); - DIR *task_dirp = opendir(task_path.cstr); + String8 task_path = str8f(scratch.arena, "/proc/%d/task", pid); + DIR *task_dirp = opendir((char *)task_path.str); if(task_dirp) { for(;;) { struct dirent *dirent = readdir(task_dirp); if(dirent == 0) { break; } - + String8 tid_str = str8_cstring_capped(dirent->d_name, dirent->d_name + NAME_MAX); if(str8_match(tid_str, str8_lit(".."), 0) || str8_match(tid_str, str8_lit("."), 0)) { continue; } U64 tid_64 = u64_from_str8(tid_str, 10); pid_t tid = (pid_t)tid_64; AssertAlways(tid == tid_64); - + if(tid == pid) { continue; } // main thread was created during create process sequence dmn_lnx_event_create_thread(arena, events, process, tid); } - + OS_LNX_RETRY_ON_EINTR(closedir(task_dirp)); } } - + // extract modules from r_debug { B32 is_64bit = process->ctx->dl_class == ELF_Class_64; @@ -2190,10 +2190,10 @@ dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) name_space_id += 1; } } - + // handshake complete dmn_lnx_push_event_handshake_complete(arena, events, process); - + scratch_end(scratch); return process; } @@ -2208,7 +2208,7 @@ dmn_init(void) { local_persist DMN_LNX_State state; dmn_lnx_state = &state; - + dmn_lnx_state->arena = arena_alloc(); dmn_lnx_state->access_mutex = mutex_alloc(); dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain); @@ -2217,7 +2217,7 @@ dmn_init(void) dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); dmn_lnx_state->halter_mutex = mutex_alloc(); dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Null); - + // find offsets of TLS index and TLS offset in the link_map struct // // TODO: assuming that target is using same libc version as debugger @@ -2271,7 +2271,7 @@ internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) { Temp scratch = scratch_begin(0, 0); - + // setup target command line U64 argc = params->cmd_line.node_count + 1; char **argv = push_array(scratch.arena, char *, argc); @@ -2279,43 +2279,45 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) U64 idx = 0; for EachNode(n, String8Node, params->cmd_line.first) { - argv[idx++] = push_str8_copy(scratch.arena, n->string).cstr; + argv[idx] = (char *)str8_copy(scratch.arena, n->string).str; + idx += 1; } } - + // setup target environment U64 envc = os_lnx_state.default_env_count + params->env.node_count + 1; char **envp = push_array(scratch.arena, char *, envc); { // copy default environment MemoryCopyTyped(envp, os_lnx_state.default_env, os_lnx_state.default_env_count); - + // copy user environment U64 idx = os_lnx_state.default_env_count; for EachNode(n, String8Node, params->env.first) { - envp[idx++] = push_str8_copy(scratch.arena, n->string).cstr; + envp[idx] = (char *)str8_copy(scratch.arena, n->string).str; + idx += 1; } } - + // create zero-terminated work directory path - char *work_dir_path = push_str8_copy(scratch.arena, params->path).cstr; - + char *work_dir_path = (char *)str8_copy(scratch.arena, params->path).str; + // fork process pid_t pid = fork(); - + // child process if(pid == 0) { // wait for seize if(OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)) < 0) { goto child_exit; } - + // change work directory to tracee if(OS_LNX_RETRY_ON_EINTR(chdir(work_dir_path)) < 0) { goto child_exit; } - + // replace process with target program if(OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, envp)) < 0) { goto child_exit; } - + child_exit:; exit(0); } @@ -2393,7 +2395,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { Temp scratch = scratch_begin(&arena, 1); DMN_EventList events = {0}; - + mutex_take(dmn_lnx_state->halter_mutex); // wait for signals from the running threads @@ -2410,34 +2412,34 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // skip hardware breakpoints DMN_Trap *trap = n->v+n_idx; if(trap->flags) { continue; } - + HashTable *active_trap_ht = hash_table_search_u64_raw(process_ht, trap->process.u64[0]); if(active_trap_ht == 0) { active_trap_ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); hash_table_push_u64_raw(scratch.arena, process_ht, trap->process.u64[0], active_trap_ht); } - + // TODO: ctrl sends down duplicate traps DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); if(is_set) { continue; } - + // TODO: ctrl sends down traps for exited process DMN_LNX_Process *process = dmn_lnx_process_from_handle(trap->process); if(!process) { continue; } - + // trap instruction DMN_ActiveTrap *active_trap = dmn_set_trap(scratch.arena, trap); - + // add trap to the active list SLLQueuePush(active_trap_first, active_trap_last, active_trap); - + // add (address -> trap) hash_table_push_u64_raw(scratch.arena, active_trap_ht, trap->vaddr, active_trap); } } } - + // enable single stepping if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) { @@ -2451,7 +2453,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) Assert(0 && "invalid single_step_thread handle"); } } - + // schedule threads to run DMN_LNX_ThreadPtrList running_threads = {0}; { @@ -2470,12 +2472,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } } - + for EachNode(thread, DMN_LNX_Thread, process->first_thread) { //- rjf: determine if this thread is frozen B32 is_frozen = 0; - + // rjf: not single-stepping? determine based on run controls freezing info if(dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) { @@ -2504,18 +2506,18 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { is_frozen = !dmn_handle_match(dmn_lnx_handle_from_thread(thread), ctrls->single_step_thread); } - + // resume thread if(!is_frozen) { AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - + // write registers if(thread->is_reg_block_dirty) { thread->is_reg_block_dirty = !dmn_lnx_thread_write_reg_block(thread); } - + // pass signal to the child process void *sig_code = 0; if(thread->pass_through_signal) @@ -2526,7 +2528,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) sig_code = (void *)(uintptr_t)thread->pass_through_signo; } } - + // resume thread if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, thread->tid, 0, sig_code)) >= 0) { @@ -2555,14 +2557,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } } - + // hash running threads tids HashTable *running_threads_ht = hash_table_init(scratch.arena, running_threads.count * 2); for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) { hash_table_push_u64_raw(scratch.arena, running_threads_ht, n->v->tid, n); } - + B32 is_halt_done = 0; DMN_LNX_ThreadPtrList stopped_threads = {0}; do @@ -2580,18 +2582,18 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } mutex_take(dmn_lnx_state->halter_mutex); } - + // unpack status int wifexited = WIFEXITED(status); int wifsignaled = WIFSIGNALED(status); int wifstopped = WIFSTOPPED(status); int wstopsig = WSTOPSIG(status); int event_code = (status >> 16); - + // intercept initing processes { DMN_LNX_Process *process = dmn_lnx_process_from_pid(wait_id); - + if(process && process->state != DMN_LNX_ProcessState_Normal) { switch(process->state) @@ -2646,7 +2648,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) else { Assert(0 && "unexpected signal"); } } break; } - + // shutdown process { if(OS_LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)) >= 0) @@ -2659,12 +2661,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) dmn_lnx_process_release(process); } } - + wait_for_signal:; continue; } } - + if(wifstopped || wifsignaled || wifexited) { DMN_LNX_ThreadPtrNode *thread_n = hash_table_search_u64_raw(running_threads_ht, wait_id); @@ -2672,14 +2674,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_LNX_Thread *thread = thread_n->v; AssertAlways(thread->state == DMN_LNX_ThreadState_Running); - + // remove mapping hash_table_purge_u64(running_threads_ht, thread->tid); - + // move thread to the stopped list dmn_lnx_thread_ptr_list_remove(&running_threads, thread_n); dmn_lnx_thread_ptr_list_push_node(&stopped_threads, thread_n); - + // update thread state if(wifstopped && !wifsignaled && !wifexited) { @@ -2690,7 +2692,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) thread->state = DMN_LNX_ThreadState_Exited; } else { InvalidPath; } - + // stop all other threads if(stopped_threads.count == 1) { @@ -2701,13 +2703,13 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } } - + // normal child exit via _exit or exit() if(wifexited) { dmn_lnx_event_exit_thread(arena, &events, wait_id, WEXITSTATUS(status)); } - + // exit because child did not handle a signal else if(wifsignaled) { @@ -2725,7 +2727,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) Assert(!thread->is_reg_block_dirty); } } - + if(wstopsig == SIGTRAP) { switch(event_code) @@ -2738,13 +2740,13 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { switch(siginfo.si_code) { - case SI_KERNEL: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; - case TRAP_BRKPT: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; - case TRAP_TRACE: { dmn_lnx_event_single_step(arena, &events, wait_id); } break; - case TRAP_HWBKPT: { dmn_lnx_event_data_breakpoint(arena, &events, wait_id); } break; - case TRAP_BRANCH: { NotImplemented; }break; - case TRAP_UNK: { NotImplemented; }break; - default: { InvalidPath; } break; + case SI_KERNEL: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_BRKPT: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_TRACE: { dmn_lnx_event_single_step(arena, &events, wait_id); } break; + case TRAP_HWBKPT: { dmn_lnx_event_data_breakpoint(arena, &events, wait_id); } break; + case TRAP_BRANCH: { NotImplemented; }break; + case TRAP_UNK: { NotImplemented; }break; + default: { InvalidPath; } break; } } else { Assert(0 && "failed to get signal info"); } }break; @@ -2765,12 +2767,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // kernel stopped the parent just before scheduling the child to // give us a chance to prepare to trace it; next event for the child // will be a PTRACE_EVENT_STOP - + pid_t new_tid; if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid)) >= 0) { DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); - + // create a new partially inited thread dmn_lnx_thread_alloc(thread->process, DMN_LNX_ThreadState_PendingCreation, new_tid); } @@ -2842,39 +2844,39 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } else { Assert(0 && "unexpected stop code"); } } while(running_threads.count > 0 || dmn_lnx_state->process_pending_creation > 0 || dmn_lnx_state->threads_pending_creation > 0); - + // finalize halter state if(is_halt_done) { // push event dmn_lnx_event_halt(arena, &events); - + // reset state dmn_lnx_state->halter_tid = 0; dmn_lnx_state->halt_code = 0; dmn_lnx_state->halt_user_data = 0; dmn_lnx_state->is_halting = 0; } - + // restore original instruction bytes for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) { // skip process that exited during the wait DMN_LNX_Process *process = dmn_lnx_process_from_handle(active_trap->trap->process); if(!process) { continue; } - + if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str)) { Assert(0 && "failed to restore original instruction bytes"); } } } - + if(events.count == 0 && dmn_lnx_state->process_count == 0) { dmn_lnx_push_event_not_attached(arena, &events); } - + mutex_drop(dmn_lnx_state->halter_mutex); scratch_end(scratch); return events; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index d2b6f321..a7b8b476 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -75,428 +75,428 @@ union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; typedef RDI_U32 RDI_SectionKind; typedef enum RDI_SectionKindEnum { -RDI_SectionKind_NULL = 0x0000, -RDI_SectionKind_TopLevelInfo = 0x0001, -RDI_SectionKind_StringData = 0x0002, -RDI_SectionKind_StringTable = 0x0003, -RDI_SectionKind_IndexRuns = 0x0004, -RDI_SectionKind_BinarySections = 0x0005, -RDI_SectionKind_FilePathNodes = 0x0006, -RDI_SectionKind_SourceFiles = 0x0007, -RDI_SectionKind_LineTables = 0x0008, -RDI_SectionKind_LineInfoVOffs = 0x0009, -RDI_SectionKind_LineInfoLines = 0x000A, -RDI_SectionKind_LineInfoColumns = 0x000B, -RDI_SectionKind_SourceLineMaps = 0x000C, -RDI_SectionKind_SourceLineMapNumbers = 0x000D, -RDI_SectionKind_SourceLineMapRanges = 0x000E, -RDI_SectionKind_SourceLineMapVOffs = 0x000F, -RDI_SectionKind_Units = 0x0010, -RDI_SectionKind_UnitVMap = 0x0011, -RDI_SectionKind_TypeNodes = 0x0012, -RDI_SectionKind_UDTs = 0x0013, -RDI_SectionKind_Members = 0x0014, -RDI_SectionKind_EnumMembers = 0x0015, -RDI_SectionKind_GlobalVariables = 0x0016, -RDI_SectionKind_GlobalVMap = 0x0017, -RDI_SectionKind_ThreadVariables = 0x0018, -RDI_SectionKind_Constants = 0x0019, -RDI_SectionKind_Procedures = 0x001A, -RDI_SectionKind_Scopes = 0x001B, -RDI_SectionKind_ScopeVOffData = 0x001C, -RDI_SectionKind_ScopeVMap = 0x001D, -RDI_SectionKind_InlineSites = 0x001E, -RDI_SectionKind_Locals = 0x001F, -RDI_SectionKind_LocationBlocks = 0x0020, -RDI_SectionKind_LocationData = 0x0021, -RDI_SectionKind_ConstantValueData = 0x0022, -RDI_SectionKind_ConstantValueTable = 0x0023, -RDI_SectionKind_MD5Checksums = 0x0024, -RDI_SectionKind_SHA1Checksums = 0x0025, -RDI_SectionKind_SHA256Checksums = 0x0026, -RDI_SectionKind_Timestamps = 0x0027, -RDI_SectionKind_NameMaps = 0x0028, -RDI_SectionKind_NameMapBuckets = 0x0029, -RDI_SectionKind_NameMapNodes = 0x002A, -RDI_SectionKind_COUNT = 0x002B, + RDI_SectionKind_NULL = 0x0000, + RDI_SectionKind_TopLevelInfo = 0x0001, + RDI_SectionKind_StringData = 0x0002, + RDI_SectionKind_StringTable = 0x0003, + RDI_SectionKind_IndexRuns = 0x0004, + RDI_SectionKind_BinarySections = 0x0005, + RDI_SectionKind_FilePathNodes = 0x0006, + RDI_SectionKind_SourceFiles = 0x0007, + RDI_SectionKind_LineTables = 0x0008, + RDI_SectionKind_LineInfoVOffs = 0x0009, + RDI_SectionKind_LineInfoLines = 0x000A, + RDI_SectionKind_LineInfoColumns = 0x000B, + RDI_SectionKind_SourceLineMaps = 0x000C, + RDI_SectionKind_SourceLineMapNumbers = 0x000D, + RDI_SectionKind_SourceLineMapRanges = 0x000E, + RDI_SectionKind_SourceLineMapVOffs = 0x000F, + RDI_SectionKind_Units = 0x0010, + RDI_SectionKind_UnitVMap = 0x0011, + RDI_SectionKind_TypeNodes = 0x0012, + RDI_SectionKind_UDTs = 0x0013, + RDI_SectionKind_Members = 0x0014, + RDI_SectionKind_EnumMembers = 0x0015, + RDI_SectionKind_GlobalVariables = 0x0016, + RDI_SectionKind_GlobalVMap = 0x0017, + RDI_SectionKind_ThreadVariables = 0x0018, + RDI_SectionKind_Constants = 0x0019, + RDI_SectionKind_Procedures = 0x001A, + RDI_SectionKind_Scopes = 0x001B, + RDI_SectionKind_ScopeVOffData = 0x001C, + RDI_SectionKind_ScopeVMap = 0x001D, + RDI_SectionKind_InlineSites = 0x001E, + RDI_SectionKind_Locals = 0x001F, + RDI_SectionKind_LocationBlocks = 0x0020, + RDI_SectionKind_LocationData = 0x0021, + RDI_SectionKind_ConstantValueData = 0x0022, + RDI_SectionKind_ConstantValueTable = 0x0023, + RDI_SectionKind_MD5Checksums = 0x0024, + RDI_SectionKind_SHA1Checksums = 0x0025, + RDI_SectionKind_SHA256Checksums = 0x0026, + RDI_SectionKind_Timestamps = 0x0027, + RDI_SectionKind_NameMaps = 0x0028, + RDI_SectionKind_NameMapBuckets = 0x0029, + RDI_SectionKind_NameMapNodes = 0x002A, + RDI_SectionKind_COUNT = 0x002B, } RDI_SectionKindEnum; typedef RDI_U32 RDI_SectionEncoding; typedef enum RDI_SectionEncodingEnum { -RDI_SectionEncoding_Unpacked = 0, -RDI_SectionEncoding_LZB = 1, + RDI_SectionEncoding_Unpacked = 0, + RDI_SectionEncoding_LZB = 1, } RDI_SectionEncodingEnum; typedef RDI_U32 RDI_Arch; typedef enum RDI_ArchEnum { -RDI_Arch_NULL = 0, -RDI_Arch_X64 = 1, + RDI_Arch_NULL = 0, + RDI_Arch_X64 = 1, } RDI_ArchEnum; typedef RDI_U8 RDI_RegCode; typedef enum RDI_RegCodeEnum { -RDI_RegCode_nil, + RDI_RegCode_nil, } RDI_RegCodeEnum; typedef RDI_U8 RDI_RegCodeX64; typedef enum RDI_RegCodeX64Enum { -RDI_RegCodeX64_nil = 0, -RDI_RegCodeX64_rax = 1, -RDI_RegCodeX64_rcx = 2, -RDI_RegCodeX64_rdx = 3, -RDI_RegCodeX64_rbx = 4, -RDI_RegCodeX64_rsp = 5, -RDI_RegCodeX64_rbp = 6, -RDI_RegCodeX64_rsi = 7, -RDI_RegCodeX64_rdi = 8, -RDI_RegCodeX64_r8 = 9, -RDI_RegCodeX64_r9 = 10, -RDI_RegCodeX64_r10 = 11, -RDI_RegCodeX64_r11 = 12, -RDI_RegCodeX64_r12 = 13, -RDI_RegCodeX64_r13 = 14, -RDI_RegCodeX64_r14 = 15, -RDI_RegCodeX64_r15 = 16, -RDI_RegCodeX64_es = 17, -RDI_RegCodeX64_cs = 18, -RDI_RegCodeX64_ss = 19, -RDI_RegCodeX64_ds = 20, -RDI_RegCodeX64_fs = 21, -RDI_RegCodeX64_gs = 22, -RDI_RegCodeX64_rip = 23, -RDI_RegCodeX64_rflags = 24, -RDI_RegCodeX64_dr0 = 25, -RDI_RegCodeX64_dr1 = 26, -RDI_RegCodeX64_dr2 = 27, -RDI_RegCodeX64_dr3 = 28, -RDI_RegCodeX64_dr4 = 29, -RDI_RegCodeX64_dr5 = 30, -RDI_RegCodeX64_dr6 = 31, -RDI_RegCodeX64_dr7 = 32, -RDI_RegCodeX64_st0 = 33, -RDI_RegCodeX64_st1 = 34, -RDI_RegCodeX64_st2 = 35, -RDI_RegCodeX64_st3 = 36, -RDI_RegCodeX64_st4 = 37, -RDI_RegCodeX64_st5 = 38, -RDI_RegCodeX64_st6 = 39, -RDI_RegCodeX64_st7 = 40, -RDI_RegCodeX64_zmm0 = 41, -RDI_RegCodeX64_zmm1 = 42, -RDI_RegCodeX64_zmm2 = 43, -RDI_RegCodeX64_zmm3 = 44, -RDI_RegCodeX64_zmm4 = 45, -RDI_RegCodeX64_zmm5 = 46, -RDI_RegCodeX64_zmm6 = 47, -RDI_RegCodeX64_zmm7 = 48, -RDI_RegCodeX64_zmm8 = 49, -RDI_RegCodeX64_zmm9 = 50, -RDI_RegCodeX64_zmm10 = 51, -RDI_RegCodeX64_zmm11 = 52, -RDI_RegCodeX64_zmm12 = 53, -RDI_RegCodeX64_zmm13 = 54, -RDI_RegCodeX64_zmm14 = 55, -RDI_RegCodeX64_zmm15 = 56, -RDI_RegCodeX64_zmm16 = 57, -RDI_RegCodeX64_zmm17 = 58, -RDI_RegCodeX64_zmm18 = 59, -RDI_RegCodeX64_zmm19 = 60, -RDI_RegCodeX64_zmm20 = 61, -RDI_RegCodeX64_zmm21 = 62, -RDI_RegCodeX64_zmm22 = 63, -RDI_RegCodeX64_zmm23 = 64, -RDI_RegCodeX64_zmm24 = 65, -RDI_RegCodeX64_zmm25 = 66, -RDI_RegCodeX64_zmm26 = 67, -RDI_RegCodeX64_zmm27 = 68, -RDI_RegCodeX64_zmm28 = 69, -RDI_RegCodeX64_zmm29 = 70, -RDI_RegCodeX64_zmm30 = 71, -RDI_RegCodeX64_zmm31 = 72, -RDI_RegCodeX64_k0 = 73, -RDI_RegCodeX64_k1 = 74, -RDI_RegCodeX64_k2 = 75, -RDI_RegCodeX64_k3 = 76, -RDI_RegCodeX64_k4 = 77, -RDI_RegCodeX64_k5 = 78, -RDI_RegCodeX64_k6 = 79, -RDI_RegCodeX64_k7 = 80, -RDI_RegCodeX64_mxcsr = 81, -RDI_RegCodeX64_fsbase = 82, -RDI_RegCodeX64_gsbase = 83, -RDI_RegCodeX64_fcw = 84, -RDI_RegCodeX64_fsw = 85, -RDI_RegCodeX64_ftw = 86, -RDI_RegCodeX64_fop = 87, -RDI_RegCodeX64_fcs = 88, -RDI_RegCodeX64_fds = 89, -RDI_RegCodeX64_fip = 90, -RDI_RegCodeX64_fdp = 91, -RDI_RegCodeX64_mxcsr_mask = 92, -RDI_RegCodeX64_cetmsr = 93, -RDI_RegCodeX64_cetssp = 94, + RDI_RegCodeX64_nil = 0, + RDI_RegCodeX64_rax = 1, + RDI_RegCodeX64_rcx = 2, + RDI_RegCodeX64_rdx = 3, + RDI_RegCodeX64_rbx = 4, + RDI_RegCodeX64_rsp = 5, + RDI_RegCodeX64_rbp = 6, + RDI_RegCodeX64_rsi = 7, + RDI_RegCodeX64_rdi = 8, + RDI_RegCodeX64_r8 = 9, + RDI_RegCodeX64_r9 = 10, + RDI_RegCodeX64_r10 = 11, + RDI_RegCodeX64_r11 = 12, + RDI_RegCodeX64_r12 = 13, + RDI_RegCodeX64_r13 = 14, + RDI_RegCodeX64_r14 = 15, + RDI_RegCodeX64_r15 = 16, + RDI_RegCodeX64_es = 17, + RDI_RegCodeX64_cs = 18, + RDI_RegCodeX64_ss = 19, + RDI_RegCodeX64_ds = 20, + RDI_RegCodeX64_fs = 21, + RDI_RegCodeX64_gs = 22, + RDI_RegCodeX64_rip = 23, + RDI_RegCodeX64_rflags = 24, + RDI_RegCodeX64_dr0 = 25, + RDI_RegCodeX64_dr1 = 26, + RDI_RegCodeX64_dr2 = 27, + RDI_RegCodeX64_dr3 = 28, + RDI_RegCodeX64_dr4 = 29, + RDI_RegCodeX64_dr5 = 30, + RDI_RegCodeX64_dr6 = 31, + RDI_RegCodeX64_dr7 = 32, + RDI_RegCodeX64_st0 = 33, + RDI_RegCodeX64_st1 = 34, + RDI_RegCodeX64_st2 = 35, + RDI_RegCodeX64_st3 = 36, + RDI_RegCodeX64_st4 = 37, + RDI_RegCodeX64_st5 = 38, + RDI_RegCodeX64_st6 = 39, + RDI_RegCodeX64_st7 = 40, + RDI_RegCodeX64_zmm0 = 41, + RDI_RegCodeX64_zmm1 = 42, + RDI_RegCodeX64_zmm2 = 43, + RDI_RegCodeX64_zmm3 = 44, + RDI_RegCodeX64_zmm4 = 45, + RDI_RegCodeX64_zmm5 = 46, + RDI_RegCodeX64_zmm6 = 47, + RDI_RegCodeX64_zmm7 = 48, + RDI_RegCodeX64_zmm8 = 49, + RDI_RegCodeX64_zmm9 = 50, + RDI_RegCodeX64_zmm10 = 51, + RDI_RegCodeX64_zmm11 = 52, + RDI_RegCodeX64_zmm12 = 53, + RDI_RegCodeX64_zmm13 = 54, + RDI_RegCodeX64_zmm14 = 55, + RDI_RegCodeX64_zmm15 = 56, + RDI_RegCodeX64_zmm16 = 57, + RDI_RegCodeX64_zmm17 = 58, + RDI_RegCodeX64_zmm18 = 59, + RDI_RegCodeX64_zmm19 = 60, + RDI_RegCodeX64_zmm20 = 61, + RDI_RegCodeX64_zmm21 = 62, + RDI_RegCodeX64_zmm22 = 63, + RDI_RegCodeX64_zmm23 = 64, + RDI_RegCodeX64_zmm24 = 65, + RDI_RegCodeX64_zmm25 = 66, + RDI_RegCodeX64_zmm26 = 67, + RDI_RegCodeX64_zmm27 = 68, + RDI_RegCodeX64_zmm28 = 69, + RDI_RegCodeX64_zmm29 = 70, + RDI_RegCodeX64_zmm30 = 71, + RDI_RegCodeX64_zmm31 = 72, + RDI_RegCodeX64_k0 = 73, + RDI_RegCodeX64_k1 = 74, + RDI_RegCodeX64_k2 = 75, + RDI_RegCodeX64_k3 = 76, + RDI_RegCodeX64_k4 = 77, + RDI_RegCodeX64_k5 = 78, + RDI_RegCodeX64_k6 = 79, + RDI_RegCodeX64_k7 = 80, + RDI_RegCodeX64_mxcsr = 81, + RDI_RegCodeX64_fsbase = 82, + RDI_RegCodeX64_gsbase = 83, + RDI_RegCodeX64_fcw = 84, + RDI_RegCodeX64_fsw = 85, + RDI_RegCodeX64_ftw = 86, + RDI_RegCodeX64_fop = 87, + RDI_RegCodeX64_fcs = 88, + RDI_RegCodeX64_fds = 89, + RDI_RegCodeX64_fip = 90, + RDI_RegCodeX64_fdp = 91, + RDI_RegCodeX64_mxcsr_mask = 92, + RDI_RegCodeX64_cetmsr = 93, + RDI_RegCodeX64_cetssp = 94, } RDI_RegCodeX64Enum; typedef RDI_U32 RDI_BinarySectionFlags; typedef enum RDI_BinarySectionFlagsEnum { -RDI_BinarySectionFlag_Read = 1<<0, -RDI_BinarySectionFlag_Write = 1<<1, -RDI_BinarySectionFlag_Execute = 1<<2, + RDI_BinarySectionFlag_Read = 1<<0, + RDI_BinarySectionFlag_Write = 1<<1, + RDI_BinarySectionFlag_Execute = 1<<2, } RDI_BinarySectionFlagsEnum; typedef RDI_U32 RDI_ChecksumKind; typedef enum RDI_ChecksumKindEnum { -RDI_ChecksumKind_NULL = 0, -RDI_ChecksumKind_MD5 = 1, -RDI_ChecksumKind_SHA1 = 2, -RDI_ChecksumKind_SHA256 = 3, -RDI_ChecksumKind_Timestamp = 4, -RDI_ChecksumKind_COUNT = 5, + RDI_ChecksumKind_NULL = 0, + RDI_ChecksumKind_MD5 = 1, + RDI_ChecksumKind_SHA1 = 2, + RDI_ChecksumKind_SHA256 = 3, + RDI_ChecksumKind_Timestamp = 4, + RDI_ChecksumKind_COUNT = 5, } RDI_ChecksumKindEnum; typedef RDI_U32 RDI_Language; typedef enum RDI_LanguageEnum { -RDI_Language_NULL = 0, -RDI_Language_C = 1, -RDI_Language_CPlusPlus = 2, -RDI_Language_Masm = 3, -RDI_Language_COUNT = 4, + RDI_Language_NULL = 0, + RDI_Language_C = 1, + RDI_Language_CPlusPlus = 2, + RDI_Language_Masm = 3, + RDI_Language_COUNT = 4, } RDI_LanguageEnum; typedef RDI_U16 RDI_TypeKind; typedef enum RDI_TypeKindEnum { -RDI_TypeKind_NULL = 0x0000, -RDI_TypeKind_Void = 0x0001, -RDI_TypeKind_Handle = 0x0002, -RDI_TypeKind_HResult = 0x0003, -RDI_TypeKind_Char8 = 0x0004, -RDI_TypeKind_Char16 = 0x0005, -RDI_TypeKind_Char32 = 0x0006, -RDI_TypeKind_UChar8 = 0x0007, -RDI_TypeKind_UChar16 = 0x0008, -RDI_TypeKind_UChar32 = 0x0009, -RDI_TypeKind_U8 = 0x000A, -RDI_TypeKind_U16 = 0x000B, -RDI_TypeKind_U32 = 0x000C, -RDI_TypeKind_U64 = 0x000D, -RDI_TypeKind_U128 = 0x000E, -RDI_TypeKind_U256 = 0x000F, -RDI_TypeKind_U512 = 0x0010, -RDI_TypeKind_S8 = 0x0011, -RDI_TypeKind_S16 = 0x0012, -RDI_TypeKind_S32 = 0x0013, -RDI_TypeKind_S64 = 0x0014, -RDI_TypeKind_S128 = 0x0015, -RDI_TypeKind_S256 = 0x0016, -RDI_TypeKind_S512 = 0x0017, -RDI_TypeKind_Bool = 0x0018, -RDI_TypeKind_BF16 = 0x0019, -RDI_TypeKind_F16 = 0x001A, -RDI_TypeKind_F32 = 0x001B, -RDI_TypeKind_F32PP = 0x001C, -RDI_TypeKind_F48 = 0x001D, -RDI_TypeKind_F64 = 0x001E, -RDI_TypeKind_F80 = 0x001F, -RDI_TypeKind_F96 = 0x0020, -RDI_TypeKind_F128 = 0x0021, -RDI_TypeKind_ComplexF32 = 0x0022, -RDI_TypeKind_ComplexF64 = 0x0023, -RDI_TypeKind_ComplexF80 = 0x0024, -RDI_TypeKind_ComplexF128 = 0x0025, -RDI_TypeKind_Decimal32 = 0x0026, -RDI_TypeKind_Decimal64 = 0x0027, -RDI_TypeKind_Decimal128 = 0x0028, -RDI_TypeKind_Modifier = 0x1000, -RDI_TypeKind_Ptr = 0x1001, -RDI_TypeKind_LRef = 0x1002, -RDI_TypeKind_RRef = 0x1003, -RDI_TypeKind_Array = 0x1004, -RDI_TypeKind_Function = 0x1005, -RDI_TypeKind_Method = 0x1006, -RDI_TypeKind_MemberPtr = 0x1007, -RDI_TypeKind_Struct = 0x2000, -RDI_TypeKind_Class = 0x2001, -RDI_TypeKind_Union = 0x2002, -RDI_TypeKind_Enum = 0x2003, -RDI_TypeKind_Alias = 0x2004, -RDI_TypeKind_IncompleteStruct = 0x2005, -RDI_TypeKind_IncompleteUnion = 0x2006, -RDI_TypeKind_IncompleteClass = 0x2007, -RDI_TypeKind_IncompleteEnum = 0x2008, -RDI_TypeKind_Bitfield = 0xF000, -RDI_TypeKind_Variadic = 0xF001, -RDI_TypeKind_Count = 0xF002, -RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, -RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Decimal128, -RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, -RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, -RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, -RDI_TypeKind_LastRecord = RDI_TypeKind_Union, -RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, -RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, -RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, -RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, + RDI_TypeKind_NULL = 0x0000, + RDI_TypeKind_Void = 0x0001, + RDI_TypeKind_Handle = 0x0002, + RDI_TypeKind_HResult = 0x0003, + RDI_TypeKind_Char8 = 0x0004, + RDI_TypeKind_Char16 = 0x0005, + RDI_TypeKind_Char32 = 0x0006, + RDI_TypeKind_UChar8 = 0x0007, + RDI_TypeKind_UChar16 = 0x0008, + RDI_TypeKind_UChar32 = 0x0009, + RDI_TypeKind_U8 = 0x000A, + RDI_TypeKind_U16 = 0x000B, + RDI_TypeKind_U32 = 0x000C, + RDI_TypeKind_U64 = 0x000D, + RDI_TypeKind_U128 = 0x000E, + RDI_TypeKind_U256 = 0x000F, + RDI_TypeKind_U512 = 0x0010, + RDI_TypeKind_S8 = 0x0011, + RDI_TypeKind_S16 = 0x0012, + RDI_TypeKind_S32 = 0x0013, + RDI_TypeKind_S64 = 0x0014, + RDI_TypeKind_S128 = 0x0015, + RDI_TypeKind_S256 = 0x0016, + RDI_TypeKind_S512 = 0x0017, + RDI_TypeKind_Bool = 0x0018, + RDI_TypeKind_BF16 = 0x0019, + RDI_TypeKind_F16 = 0x001A, + RDI_TypeKind_F32 = 0x001B, + RDI_TypeKind_F32PP = 0x001C, + RDI_TypeKind_F48 = 0x001D, + RDI_TypeKind_F64 = 0x001E, + RDI_TypeKind_F80 = 0x001F, + RDI_TypeKind_F96 = 0x0020, + RDI_TypeKind_F128 = 0x0021, + RDI_TypeKind_ComplexF32 = 0x0022, + RDI_TypeKind_ComplexF64 = 0x0023, + RDI_TypeKind_ComplexF80 = 0x0024, + RDI_TypeKind_ComplexF128 = 0x0025, + RDI_TypeKind_Decimal32 = 0x0026, + RDI_TypeKind_Decimal64 = 0x0027, + RDI_TypeKind_Decimal128 = 0x0028, + RDI_TypeKind_Modifier = 0x1000, + RDI_TypeKind_Ptr = 0x1001, + RDI_TypeKind_LRef = 0x1002, + RDI_TypeKind_RRef = 0x1003, + RDI_TypeKind_Array = 0x1004, + RDI_TypeKind_Function = 0x1005, + RDI_TypeKind_Method = 0x1006, + RDI_TypeKind_MemberPtr = 0x1007, + RDI_TypeKind_Struct = 0x2000, + RDI_TypeKind_Class = 0x2001, + RDI_TypeKind_Union = 0x2002, + RDI_TypeKind_Enum = 0x2003, + RDI_TypeKind_Alias = 0x2004, + RDI_TypeKind_IncompleteStruct = 0x2005, + RDI_TypeKind_IncompleteUnion = 0x2006, + RDI_TypeKind_IncompleteClass = 0x2007, + RDI_TypeKind_IncompleteEnum = 0x2008, + RDI_TypeKind_Bitfield = 0xF000, + RDI_TypeKind_Variadic = 0xF001, + RDI_TypeKind_Count = 0xF002, + RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, + RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Decimal128, + RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, + RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, + RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, + RDI_TypeKind_LastRecord = RDI_TypeKind_Union, + RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, + RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, + RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, + RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, } RDI_TypeKindEnum; typedef RDI_U16 RDI_TypeModifierFlags; typedef enum RDI_TypeModifierFlagsEnum { -RDI_TypeModifierFlag_Const = 1<<0, -RDI_TypeModifierFlag_Volatile = 1<<1, -RDI_TypeModifierFlag_Restrict = 1<<2, + RDI_TypeModifierFlag_Const = 1<<0, + RDI_TypeModifierFlag_Volatile = 1<<1, + RDI_TypeModifierFlag_Restrict = 1<<2, } RDI_TypeModifierFlagsEnum; typedef RDI_U32 RDI_UDTFlags; typedef enum RDI_UDTFlagsEnum { -RDI_UDTFlag_EnumMembers = 1<<0, + RDI_UDTFlag_EnumMembers = 1<<0, } RDI_UDTFlagsEnum; typedef RDI_U16 RDI_MemberKind; typedef enum RDI_MemberKindEnum { -RDI_MemberKind_NULL = 0x0000, -RDI_MemberKind_DataField = 0x0001, -RDI_MemberKind_StaticData = 0x0002, -RDI_MemberKind_Method = 0x0100, -RDI_MemberKind_StaticMethod = 0x0101, -RDI_MemberKind_VirtualMethod = 0x0102, -RDI_MemberKind_VTablePtr = 0x0200, -RDI_MemberKind_Base = 0x0201, -RDI_MemberKind_VirtualBase = 0x0202, -RDI_MemberKind_NestedType = 0x0300, + RDI_MemberKind_NULL = 0x0000, + RDI_MemberKind_DataField = 0x0001, + RDI_MemberKind_StaticData = 0x0002, + RDI_MemberKind_Method = 0x0100, + RDI_MemberKind_StaticMethod = 0x0101, + RDI_MemberKind_VirtualMethod = 0x0102, + RDI_MemberKind_VTablePtr = 0x0200, + RDI_MemberKind_Base = 0x0201, + RDI_MemberKind_VirtualBase = 0x0202, + RDI_MemberKind_NestedType = 0x0300, } RDI_MemberKindEnum; typedef RDI_U32 RDI_LinkFlags; typedef enum RDI_LinkFlagsEnum { -RDI_LinkFlag_External = 1<<0, -RDI_LinkFlag_TypeScoped = 1<<1, -RDI_LinkFlag_ProcScoped = 1<<2, + RDI_LinkFlag_External = 1<<0, + RDI_LinkFlag_TypeScoped = 1<<1, + RDI_LinkFlag_ProcScoped = 1<<2, } RDI_LinkFlagsEnum; typedef RDI_U32 RDI_LocalKind; typedef enum RDI_LocalKindEnum { -RDI_LocalKind_NULL = 0x0, -RDI_LocalKind_Parameter = 0x1, -RDI_LocalKind_Variable = 0x2, + RDI_LocalKind_NULL = 0x0, + RDI_LocalKind_Parameter = 0x1, + RDI_LocalKind_Variable = 0x2, } RDI_LocalKindEnum; typedef RDI_U8 RDI_LocationKind; typedef enum RDI_LocationKindEnum { -RDI_LocationKind_NULL = 0x0, -RDI_LocationKind_AddrBytecodeStream = 0x1, -RDI_LocationKind_ValBytecodeStream = 0x2, -RDI_LocationKind_AddrRegPlusU16 = 0x3, -RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, -RDI_LocationKind_ValReg = 0x5, + RDI_LocationKind_NULL = 0x0, + RDI_LocationKind_AddrBytecodeStream = 0x1, + RDI_LocationKind_ValBytecodeStream = 0x2, + RDI_LocationKind_AddrRegPlusU16 = 0x3, + RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, + RDI_LocationKind_ValReg = 0x5, } RDI_LocationKindEnum; typedef RDI_U8 RDI_EvalOp; typedef enum RDI_EvalOpEnum { -RDI_EvalOp_Stop = 0, -RDI_EvalOp_Noop = 1, -RDI_EvalOp_Cond = 2, -RDI_EvalOp_Skip = 3, -RDI_EvalOp_MemRead = 4, -RDI_EvalOp_RegRead = 5, -RDI_EvalOp_RegReadDyn = 6, -RDI_EvalOp_FrameOff = 7, -RDI_EvalOp_ModuleOff = 8, -RDI_EvalOp_TLSOff = 9, -RDI_EvalOp_ObjectOff = 10, -RDI_EvalOp_CFA = 11, -RDI_EvalOp_ConstU8 = 12, -RDI_EvalOp_ConstU16 = 13, -RDI_EvalOp_ConstU32 = 14, -RDI_EvalOp_ConstU64 = 15, -RDI_EvalOp_ConstU128 = 16, -RDI_EvalOp_ConstString = 17, -RDI_EvalOp_Abs = 18, -RDI_EvalOp_Neg = 19, -RDI_EvalOp_Add = 20, -RDI_EvalOp_Sub = 21, -RDI_EvalOp_Mul = 22, -RDI_EvalOp_Div = 23, -RDI_EvalOp_Mod = 24, -RDI_EvalOp_LShift = 25, -RDI_EvalOp_RShift = 26, -RDI_EvalOp_BitAnd = 27, -RDI_EvalOp_BitOr = 28, -RDI_EvalOp_BitXor = 29, -RDI_EvalOp_BitNot = 30, -RDI_EvalOp_LogAnd = 31, -RDI_EvalOp_LogOr = 32, -RDI_EvalOp_LogNot = 33, -RDI_EvalOp_EqEq = 34, -RDI_EvalOp_NtEq = 35, -RDI_EvalOp_LsEq = 36, -RDI_EvalOp_GrEq = 37, -RDI_EvalOp_Less = 38, -RDI_EvalOp_Grtr = 39, -RDI_EvalOp_Trunc = 40, -RDI_EvalOp_TruncSigned = 41, -RDI_EvalOp_Convert = 42, -RDI_EvalOp_Pick = 43, -RDI_EvalOp_Pop = 44, -RDI_EvalOp_Insert = 45, -RDI_EvalOp_ValueRead = 46, -RDI_EvalOp_ByteSwap = 47, -RDI_EvalOp_CallSiteValue = 48, -RDI_EvalOp_PartialValue = 49, -RDI_EvalOp_PartialValueBit = 50, -RDI_EvalOp_Swap = 51, -RDI_EvalOp_PushCfa = 52, -RDI_EvalOp_COUNT = 53, + RDI_EvalOp_Stop = 0, + RDI_EvalOp_Noop = 1, + RDI_EvalOp_Cond = 2, + RDI_EvalOp_Skip = 3, + RDI_EvalOp_MemRead = 4, + RDI_EvalOp_RegRead = 5, + RDI_EvalOp_RegReadDyn = 6, + RDI_EvalOp_FrameOff = 7, + RDI_EvalOp_ModuleOff = 8, + RDI_EvalOp_TLSOff = 9, + RDI_EvalOp_ObjectOff = 10, + RDI_EvalOp_CFA = 11, + RDI_EvalOp_ConstU8 = 12, + RDI_EvalOp_ConstU16 = 13, + RDI_EvalOp_ConstU32 = 14, + RDI_EvalOp_ConstU64 = 15, + RDI_EvalOp_ConstU128 = 16, + RDI_EvalOp_ConstString = 17, + RDI_EvalOp_Abs = 18, + RDI_EvalOp_Neg = 19, + RDI_EvalOp_Add = 20, + RDI_EvalOp_Sub = 21, + RDI_EvalOp_Mul = 22, + RDI_EvalOp_Div = 23, + RDI_EvalOp_Mod = 24, + RDI_EvalOp_LShift = 25, + RDI_EvalOp_RShift = 26, + RDI_EvalOp_BitAnd = 27, + RDI_EvalOp_BitOr = 28, + RDI_EvalOp_BitXor = 29, + RDI_EvalOp_BitNot = 30, + RDI_EvalOp_LogAnd = 31, + RDI_EvalOp_LogOr = 32, + RDI_EvalOp_LogNot = 33, + RDI_EvalOp_EqEq = 34, + RDI_EvalOp_NtEq = 35, + RDI_EvalOp_LsEq = 36, + RDI_EvalOp_GrEq = 37, + RDI_EvalOp_Less = 38, + RDI_EvalOp_Grtr = 39, + RDI_EvalOp_Trunc = 40, + RDI_EvalOp_TruncSigned = 41, + RDI_EvalOp_Convert = 42, + RDI_EvalOp_Pick = 43, + RDI_EvalOp_Pop = 44, + RDI_EvalOp_Insert = 45, + RDI_EvalOp_ValueRead = 46, + RDI_EvalOp_ByteSwap = 47, + RDI_EvalOp_CallSiteValue = 48, + RDI_EvalOp_PartialValue = 49, + RDI_EvalOp_PartialValueBit = 50, + RDI_EvalOp_Swap = 51, + RDI_EvalOp_PushCfa = 52, + RDI_EvalOp_COUNT = 53, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; typedef enum RDI_EvalTypeGroupEnum { -RDI_EvalTypeGroup_Other = 0, -RDI_EvalTypeGroup_U = 1, -RDI_EvalTypeGroup_S = 2, -RDI_EvalTypeGroup_F32 = 3, -RDI_EvalTypeGroup_F64 = 4, -RDI_EvalTypeGroup_F80 = 5, -RDI_EvalTypeGroup_F128 = 6, -RDI_EvalTypeGroup_COUNT = 7, + RDI_EvalTypeGroup_Other = 0, + RDI_EvalTypeGroup_U = 1, + RDI_EvalTypeGroup_S = 2, + RDI_EvalTypeGroup_F32 = 3, + RDI_EvalTypeGroup_F64 = 4, + RDI_EvalTypeGroup_F80 = 5, + RDI_EvalTypeGroup_F128 = 6, + RDI_EvalTypeGroup_COUNT = 7, } RDI_EvalTypeGroupEnum; typedef RDI_U8 RDI_EvalConversionKind; typedef enum RDI_EvalConversionKindEnum { -RDI_EvalConversionKind_Noop = 0, -RDI_EvalConversionKind_Legal = 1, -RDI_EvalConversionKind_OtherToOther = 2, -RDI_EvalConversionKind_ToOther = 3, -RDI_EvalConversionKind_FromOther = 4, -RDI_EvalConversionKind_COUNT = 5, + RDI_EvalConversionKind_Noop = 0, + RDI_EvalConversionKind_Legal = 1, + RDI_EvalConversionKind_OtherToOther = 2, + RDI_EvalConversionKind_ToOther = 3, + RDI_EvalConversionKind_FromOther = 4, + RDI_EvalConversionKind_COUNT = 5, } RDI_EvalConversionKindEnum; typedef RDI_U32 RDI_NameMapKind; typedef enum RDI_NameMapKindEnum { -RDI_NameMapKind_NULL = 0, -RDI_NameMapKind_GlobalVariables = 1, -RDI_NameMapKind_ThreadVariables = 2, -RDI_NameMapKind_Constants = 3, -RDI_NameMapKind_Procedures = 4, -RDI_NameMapKind_Types = 5, -RDI_NameMapKind_LinkNameProcedures = 6, -RDI_NameMapKind_NormalSourcePaths = 7, -RDI_NameMapKind_COUNT = 8, + RDI_NameMapKind_NULL = 0, + RDI_NameMapKind_GlobalVariables = 1, + RDI_NameMapKind_ThreadVariables = 2, + RDI_NameMapKind_Constants = 3, + RDI_NameMapKind_Procedures = 4, + RDI_NameMapKind_Types = 5, + RDI_NameMapKind_LinkNameProcedures = 6, + RDI_NameMapKind_NormalSourcePaths = 7, + RDI_NameMapKind_COUNT = 8, } RDI_NameMapKindEnum; #define RDI_Header_XList \ @@ -1126,126 +1126,126 @@ typedef RDI_U32_Table RDI_U32_NameMapNodes; typedef struct RDI_Header RDI_Header; struct RDI_Header { -RDI_U64 magic; -RDI_U32 encoding_version; -RDI_U32 data_section_off; -RDI_U32 data_section_count; + RDI_U64 magic; + RDI_U32 encoding_version; + RDI_U32 data_section_off; + RDI_U32 data_section_count; }; typedef struct RDI_Section RDI_Section; struct RDI_Section { -RDI_SectionEncoding encoding; -RDI_U32 pad; -RDI_U64 off; -RDI_U64 encoded_size; -RDI_U64 unpacked_size; + RDI_SectionEncoding encoding; + RDI_U32 pad; + RDI_U64 off; + RDI_U64 encoded_size; + RDI_U64 unpacked_size; }; typedef struct RDI_VMapEntry RDI_VMapEntry; struct RDI_VMapEntry { -RDI_U64 voff; -RDI_U64 idx; + RDI_U64 voff; + RDI_U64 idx; }; typedef struct RDI_TopLevelInfo RDI_TopLevelInfo; struct RDI_TopLevelInfo { -RDI_Arch arch; -RDI_U32 exe_name_string_idx; -RDI_U64 exe_hash; -RDI_U64 voff_max; -RDI_GUID guid; -RDI_U32 producer_name_string_idx; + RDI_Arch arch; + RDI_U32 exe_name_string_idx; + RDI_U64 exe_hash; + RDI_U64 voff_max; + RDI_GUID guid; + RDI_U32 producer_name_string_idx; }; typedef struct RDI_BinarySection RDI_BinarySection; struct RDI_BinarySection { -RDI_U32 name_string_idx; -RDI_BinarySectionFlags flags; -RDI_U64 voff_first; -RDI_U64 voff_opl; -RDI_U64 foff_first; -RDI_U64 foff_opl; + RDI_U32 name_string_idx; + RDI_BinarySectionFlags flags; + RDI_U64 voff_first; + RDI_U64 voff_opl; + RDI_U64 foff_first; + RDI_U64 foff_opl; }; typedef struct RDI_FilePathNode RDI_FilePathNode; struct RDI_FilePathNode { -RDI_U32 name_string_idx; -RDI_U32 parent_path_node; -RDI_U32 first_child; -RDI_U32 next_sibling; -RDI_U32 source_file_idx; + RDI_U32 name_string_idx; + RDI_U32 parent_path_node; + RDI_U32 first_child; + RDI_U32 next_sibling; + RDI_U32 source_file_idx; }; typedef struct RDI_SourceFile RDI_SourceFile; struct RDI_SourceFile { -RDI_U32 file_path_node_idx; -RDI_U32 normal_full_path_string_idx; -RDI_U32 source_line_map_idx; -RDI_ChecksumKind checksum_kind; -RDI_U32 checksum_idx; + RDI_U32 file_path_node_idx; + RDI_U32 normal_full_path_string_idx; + RDI_U32 source_line_map_idx; + RDI_ChecksumKind checksum_kind; + RDI_U32 checksum_idx; }; typedef struct RDI_Unit RDI_Unit; struct RDI_Unit { -RDI_U32 unit_name_string_idx; -RDI_U32 compiler_name_string_idx; -RDI_U32 source_file_path_node; -RDI_U32 object_file_path_node; -RDI_U32 archive_file_path_node; -RDI_U32 build_path_node; -RDI_Language language; -RDI_U32 line_table_idx; + RDI_U32 unit_name_string_idx; + RDI_U32 compiler_name_string_idx; + RDI_U32 source_file_path_node; + RDI_U32 object_file_path_node; + RDI_U32 archive_file_path_node; + RDI_U32 build_path_node; + RDI_Language language; + RDI_U32 line_table_idx; }; typedef struct RDI_LineTable RDI_LineTable; struct RDI_LineTable { -RDI_U32 voffs_base_idx; -RDI_U32 lines_base_idx; -RDI_U32 cols_base_idx; -RDI_U32 lines_count; -RDI_U32 cols_count; + RDI_U32 voffs_base_idx; + RDI_U32 lines_base_idx; + RDI_U32 cols_base_idx; + RDI_U32 lines_count; + RDI_U32 cols_count; }; typedef struct RDI_Line RDI_Line; struct RDI_Line { -RDI_U32 file_idx; -RDI_U32 line_num; + RDI_U32 file_idx; + RDI_U32 line_num; }; typedef struct RDI_Column RDI_Column; struct RDI_Column { -RDI_U16 col_first; -RDI_U16 col_opl; + RDI_U16 col_first; + RDI_U16 col_opl; }; typedef struct RDI_SourceLineMap RDI_SourceLineMap; struct RDI_SourceLineMap { -RDI_U32 line_count; -RDI_U32 voff_count; -RDI_U32 line_map_nums_base_idx; -RDI_U32 line_map_range_base_idx; -RDI_U32 line_map_voff_base_idx; + RDI_U32 line_count; + RDI_U32 voff_count; + RDI_U32 line_map_nums_base_idx; + RDI_U32 line_map_range_base_idx; + RDI_U32 line_map_voff_base_idx; }; typedef struct RDI_TypeNode RDI_TypeNode; struct RDI_TypeNode { -RDI_TypeKind kind; -RDI_U16 flags; -RDI_U32 byte_size; - - union + RDI_TypeKind kind; + RDI_U16 flags; + RDI_U32 byte_size; + + union { // kind is 'built-in' struct @@ -1292,159 +1292,159 @@ RDI_U32 byte_size; typedef struct RDI_UDT RDI_UDT; struct RDI_UDT { -RDI_U32 self_type_idx; -RDI_UDTFlags flags; -RDI_U32 member_first; -RDI_U32 member_count; -RDI_U32 file_idx; -RDI_U32 line; -RDI_U32 col; + RDI_U32 self_type_idx; + RDI_UDTFlags flags; + RDI_U32 member_first; + RDI_U32 member_count; + RDI_U32 file_idx; + RDI_U32 line; + RDI_U32 col; }; typedef struct RDI_Member RDI_Member; struct RDI_Member { -RDI_MemberKind kind; -RDI_U16 pad; -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 off; + RDI_MemberKind kind; + RDI_U16 pad; + RDI_U32 name_string_idx; + RDI_U32 type_idx; + RDI_U32 off; }; typedef struct RDI_EnumMember RDI_EnumMember; struct RDI_EnumMember { -RDI_U32 name_string_idx; -RDI_U32 pad; -RDI_U64 val; + RDI_U32 name_string_idx; + RDI_U32 pad; + RDI_U64 val; }; typedef struct RDI_GlobalVariable RDI_GlobalVariable; struct RDI_GlobalVariable { -RDI_U32 name_string_idx; -RDI_LinkFlags link_flags; -RDI_U64 voff; -RDI_U32 type_idx; -RDI_U32 container_idx; + RDI_U32 name_string_idx; + RDI_LinkFlags link_flags; + RDI_U64 voff; + RDI_U32 type_idx; + RDI_U32 container_idx; }; typedef struct RDI_ThreadVariable RDI_ThreadVariable; struct RDI_ThreadVariable { -RDI_U32 name_string_idx; -RDI_LinkFlags link_flags; -RDI_U32 tls_off; -RDI_U32 type_idx; -RDI_U32 container_idx; + RDI_U32 name_string_idx; + RDI_LinkFlags link_flags; + RDI_U32 tls_off; + RDI_U32 type_idx; + RDI_U32 container_idx; }; typedef struct RDI_Constant RDI_Constant; struct RDI_Constant { -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 constant_value_idx; + RDI_U32 name_string_idx; + RDI_U32 type_idx; + RDI_U32 constant_value_idx; }; typedef struct RDI_Procedure RDI_Procedure; struct RDI_Procedure { -RDI_U32 name_string_idx; -RDI_U32 link_name_string_idx; -RDI_LinkFlags link_flags; -RDI_U32 type_idx; -RDI_U32 root_scope_idx; -RDI_U32 container_idx; -RDI_U32 frame_base_location_first; -RDI_U32 frame_base_location_opl; + RDI_U32 name_string_idx; + RDI_U32 link_name_string_idx; + RDI_LinkFlags link_flags; + RDI_U32 type_idx; + RDI_U32 root_scope_idx; + RDI_U32 container_idx; + RDI_U32 frame_base_location_first; + RDI_U32 frame_base_location_opl; }; typedef struct RDI_Scope RDI_Scope; struct RDI_Scope { -RDI_U32 proc_idx; -RDI_U32 parent_scope_idx; -RDI_U32 first_child_scope_idx; -RDI_U32 next_sibling_scope_idx; -RDI_U32 voff_range_first; -RDI_U32 voff_range_opl; -RDI_U32 local_first; -RDI_U32 local_count; -RDI_U32 inline_site_idx; + RDI_U32 proc_idx; + RDI_U32 parent_scope_idx; + RDI_U32 first_child_scope_idx; + RDI_U32 next_sibling_scope_idx; + RDI_U32 voff_range_first; + RDI_U32 voff_range_opl; + RDI_U32 local_first; + RDI_U32 local_count; + RDI_U32 inline_site_idx; }; typedef struct RDI_InlineSite RDI_InlineSite; struct RDI_InlineSite { -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 owner_type_idx; -RDI_U32 line_table_idx; + RDI_U32 name_string_idx; + RDI_U32 type_idx; + RDI_U32 owner_type_idx; + RDI_U32 line_table_idx; }; typedef struct RDI_Local RDI_Local; struct RDI_Local { -RDI_LocalKind kind; -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 pad; -RDI_U32 location_first; -RDI_U32 location_opl; + RDI_LocalKind kind; + RDI_U32 name_string_idx; + RDI_U32 type_idx; + RDI_U32 pad; + RDI_U32 location_first; + RDI_U32 location_opl; }; typedef struct RDI_LocationBlock RDI_LocationBlock; struct RDI_LocationBlock { -RDI_U32 scope_off_first; -RDI_U32 scope_off_opl; -RDI_U32 location_data_off; + RDI_U32 scope_off_first; + RDI_U32 scope_off_opl; + RDI_U32 location_data_off; }; typedef struct RDI_LocationBytecodeStream RDI_LocationBytecodeStream; struct RDI_LocationBytecodeStream { -RDI_LocationKind kind; + RDI_LocationKind kind; }; typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16; struct RDI_LocationRegPlusU16 { -RDI_LocationKind kind; -RDI_RegCode reg_code; -RDI_U16 offset; + RDI_LocationKind kind; + RDI_RegCode reg_code; + RDI_U16 offset; }; typedef struct RDI_LocationReg RDI_LocationReg; struct RDI_LocationReg { -RDI_LocationKind kind; -RDI_RegCode reg_code; + RDI_LocationKind kind; + RDI_RegCode reg_code; }; typedef struct RDI_NameMap RDI_NameMap; struct RDI_NameMap { -RDI_U32 bucket_base_idx; -RDI_U32 node_base_idx; -RDI_U32 bucket_count; -RDI_U32 node_count; + RDI_U32 bucket_base_idx; + RDI_U32 node_base_idx; + RDI_U32 bucket_count; + RDI_U32 node_count; }; typedef struct RDI_NameMapBucket RDI_NameMapBucket; struct RDI_NameMapBucket { -RDI_U32 first_node; -RDI_U32 node_count; + RDI_U32 first_node; + RDI_U32 node_count; }; typedef struct RDI_NameMapNode RDI_NameMapNode; struct RDI_NameMapNode { -RDI_U32 string_idx; -RDI_U32 match_count; -RDI_U32 match_idx_or_idx_run_first; + RDI_U32 string_idx; + RDI_U32 match_count; + RDI_U32 match_idx_or_idx_run_first; }; typedef RDI_TopLevelInfo RDI_SectionElementType_TopLevelInfo; diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 23cd540b..6537fca1 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -5,51 +5,51 @@ //~ rjf: API Implementation Helper Macros #define RDIM_IdxedChunkListPush(arena, list, chunk_type, element_type, cap_value, result, ...) \ - element_type *result = 0; \ - do \ - { \ - chunk_type *n = list->last; \ - if(n == 0 || n->count >= n->cap) \ - { \ - n = rdim_push_array(arena, chunk_type, 1); \ - n->cap = cap_value; \ - n->base_idx = list->total_count; \ - __VA_ARGS__; \ - n->v = rdim_push_array_no_zero(arena, element_type, n->cap); \ - RDIM_SLLQueuePush(list->first, list->last, n); \ - list->chunk_count += 1; \ - } \ - result = &n->v[n->count]; \ - result->chunk = n; \ - n->count += 1; \ - list->total_count += 1; \ - }while(0) +element_type *result = 0; \ +do \ +{ \ +chunk_type *n = list->last; \ +if(n == 0 || n->count >= n->cap) \ +{ \ +n = rdim_push_array(arena, chunk_type, 1); \ +n->cap = cap_value; \ +n->base_idx = list->total_count; \ +__VA_ARGS__; \ +n->v = rdim_push_array_no_zero(arena, element_type, n->cap); \ +RDIM_SLLQueuePush(list->first, list->last, n); \ +list->chunk_count += 1; \ +} \ +result = &n->v[n->count]; \ +result->chunk = n; \ +n->count += 1; \ +list->total_count += 1; \ +}while(0) #define RDIM_IdxedChunkListElementGetIdx(ptr, result) \ - RDI_U64 idx = 0; \ - if(ptr != 0 && ptr->chunk != 0) \ - { \ - idx = ptr->chunk->base_idx + (ptr - ptr->chunk->v) + 1; \ - } +RDI_U64 idx = 0; \ +if(ptr != 0 && ptr->chunk != 0) \ +{ \ +idx = ptr->chunk->base_idx + (ptr - ptr->chunk->v) + 1; \ +} #define RDIM_IdxedChunkListConcatInPlace(chunk_type, dst, to_push, ...) \ - for(chunk_type *n = to_push->first; n != 0; n = n->next) \ - { \ - n->base_idx += dst->total_count; \ - } \ - if(dst->last != 0 && to_push->first != 0) \ - { \ - dst->last->next = to_push->first; \ - dst->last = to_push->last; \ - dst->chunk_count += to_push->chunk_count; \ - dst->total_count += to_push->total_count; \ - __VA_ARGS__; \ - } \ - else if(dst->first == 0) \ - { \ - rdim_memcpy_struct(dst, to_push); \ - } \ - rdim_memzero_struct(to_push); +for(chunk_type *n = to_push->first; n != 0; n = n->next) \ +{ \ +n->base_idx += dst->total_count; \ +} \ +if(dst->last != 0 && to_push->first != 0) \ +{ \ +dst->last->next = to_push->first; \ +dst->last = to_push->last; \ +dst->chunk_count += to_push->chunk_count; \ +dst->total_count += to_push->total_count; \ +__VA_ARGS__; \ +} \ +else if(dst->first == 0) \ +{ \ +rdim_memcpy_struct(dst, to_push); \ +} \ +rdim_memzero_struct(to_push); //////////////////////////////// //~ rjf: Basic Helpers diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 814ed301..70a82105 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1757,4 +1757,9 @@ RDI_PROC RDIM_SerializedSection rdim_serialized_section_make_unpacked(void *data RDI_PROC RDIM_SerializedSectionBundle rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results); RDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle); +//////////////////////////////// +//~ rjf: [Serializing] Parsed RDI -> Bake Results + +RDI_PROC RDIM_BakeResults *rdim_bake_results_from_rdi(RDIM_Arena *arena, RDI_Parsed *rdi); + #endif // RDI_MAKE_H diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 91f3380d..5c9eea61 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -2432,7 +2432,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) } else { // replace uniuqe type name with hash udt_info.unique_name.str = udt_info.name.str + udt_info.name.size + 1; - udt_info.unique_name.size = raddbg_snprintf(udt_info.unique_name.cstr, udt_info.unique_name.size, "%llx", name_hash); + udt_info.unique_name.size = raddbg_snprintf((char *)udt_info.unique_name.str, udt_info.unique_name.size, "%llx", name_hash); // update leaf header U64 new_size = sizeof(CV_LeafKind) + @@ -2498,7 +2498,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) } // replace name with hash - udt_info.name.size = raddbg_snprintf(udt_info.name.cstr, udt_info.name.size, "%llx", name_hash); + udt_info.name.size = raddbg_snprintf((char *)udt_info.name.str, udt_info.name.size, "%llx", name_hash); // parse struct size CV_NumericParsed dummy; diff --git a/src/msf/msf_parse.c b/src/msf/msf_parse.c index 02912ab7..23f0df63 100644 --- a/src/msf/msf_parse.c +++ b/src/msf/msf_parse.c @@ -9,7 +9,7 @@ msf_raw_stream_table_from_data(Arena *arena, String8 msf_data) { Temp scratch = scratch_begin(&arena, 1); - MSF_RawStreamTable *result = 0; + MSF_RawStreamTable *result = push_array(arena, MSF_RawStreamTable, 1); //- determine msf type U32 index_size = 0; @@ -214,7 +214,6 @@ msf_raw_stream_table_from_data(Arena *arena, String8 msf_data) } if (got_streams) { - result = push_array(arena, MSF_RawStreamTable, 1); result->total_page_count = whole_file_page_count; result->index_size = index_size; result->page_size = page_size; diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 672151e6..b1ea7097 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -159,7 +159,7 @@ os_get_process_start_time_unix(void) pid_t pid = getpid(); String8 path = push_str8f(scratch.arena, "/proc/%u", pid); struct stat st; - int err = stat(path.cstr, &st); + int err = stat((char *)path.str, &st); if(err == 0) { start_time = st.st_mtime; @@ -240,7 +240,7 @@ os_set_thread_name(String8 name) Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); pthread_t current_thread = pthread_self(); - pthread_setname_np(current_thread, name_copy.cstr); + pthread_setname_np(current_thread, (char *)name_copy.str); scratch_end(scratch); } @@ -285,7 +285,7 @@ os_file_open(OS_AccessFlags flags, String8 path) lnx_flags |= O_CREAT; } lnx_flags |= O_CLOEXEC; - int fd = open(path_copy.cstr, lnx_flags, 0755); + int fd = open((char *)path_copy.str, lnx_flags, 0755); OS_Handle handle = {0}; if(fd != -1) { @@ -400,7 +400,7 @@ os_delete_file_at_path(String8 path) Temp scratch = scratch_begin(0, 0); B32 result = 0; String8 path_copy = push_str8_copy(scratch.arena, path); - if(remove(path_copy.cstr) != -1) + if(remove((char *)path_copy.str) != -1) { result = 1; } @@ -447,8 +447,8 @@ os_move_file_path(String8 dst, String8 src) B32 good = 0; Temp scratch = scratch_begin(0, 0); { - char *src_cstr = push_str8_copy(scratch.arena, src).cstr; - char *dst_cstr = push_str8_copy(scratch.arena, dst).cstr; + char *src_cstr = (char *)str8_copy(scratch.arena, src).str; + char *dst_cstr = (char *)str8_copy(scratch.arena, dst).str; int rename_result = rename(src_cstr, dst_cstr); good = (rename_result != -1); } @@ -460,10 +460,10 @@ internal String8 os_full_path_from_path(Arena *arena, String8 path) { Temp scratch = scratch_begin(&arena, 1); - String8 path_copy = push_str8_copy(scratch.arena, path); + String8 path_copy = str8_copy(scratch.arena, path); char buffer[PATH_MAX] = {0}; - realpath(path_copy.cstr, buffer); - String8 result = push_str8_copy(arena, str8_cstring(buffer)); + realpath((char *)path_copy.str, buffer); + String8 result = str8_copy(arena, str8_cstring(buffer)); scratch_end(scratch); return result; } @@ -473,7 +473,7 @@ os_file_path_exists(String8 path) { Temp scratch = scratch_begin(0, 0); String8 path_copy = push_str8_copy(scratch.arena, path); - int access_result = access(path_copy.cstr, F_OK); + int access_result = access((char *)path_copy.str, F_OK); B32 result = 0; if(access_result == 0) { @@ -487,9 +487,9 @@ internal B32 os_folder_path_exists(String8 path) { Temp scratch = scratch_begin(0, 0); - B32 exists = 0; - String8 path_copy = push_str8_copy(scratch.arena, path); - DIR *handle = opendir(path_copy.cstr); + B32 exists = 0; + String8 path_copy = str8_copy(scratch.arena, path); + DIR *handle = opendir((char *)path_copy.str); if(handle) { closedir(handle); @@ -503,9 +503,9 @@ internal FileProperties os_properties_from_file_path(String8 path) { Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); + String8 path_copy = str8_copy(scratch.arena, path); struct stat f_stat = {0}; - int stat_result = stat(path_copy.cstr, &f_stat); + int stat_result = stat((char *)path_copy.str, &f_stat); FileProperties props = {0}; if(stat_result != -1) { @@ -564,7 +564,7 @@ os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory; { String8 path_copy = push_str8_copy(arena, path); - iter->dir = opendir(path_copy.cstr); + iter->dir = opendir((char *)path_copy.str); iter->path = path_copy; } return base_iter; @@ -588,7 +588,7 @@ os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) { Temp scratch = scratch_begin(&arena, 1); String8 full_path = push_str8f(scratch.arena, "%S/%s", lnx_iter->path, lnx_iter->dp->d_name); - stat_result = stat(full_path.cstr, &st); + stat_result = stat((char *)full_path.str, &st); scratch_end(scratch); } @@ -637,7 +637,7 @@ os_make_directory(String8 path) Temp scratch = scratch_begin(0, 0); B32 result = 0; String8 path_copy = push_str8_copy(scratch.arena, path); - if(mkdir(path_copy.cstr, 0755) != -1) + if(mkdir((char *)path_copy.str, 0755) != -1) { result = 1; } @@ -653,7 +653,7 @@ os_shared_memory_alloc(U64 size, String8 name) { Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open(name_copy.cstr, O_RDWR|O_CREAT, 0666); + int id = shm_open((char *)name_copy.str, O_RDWR|O_CREAT, 0666); ftruncate(id, size); OS_Handle result = {(U64)id}; scratch_end(scratch); @@ -665,7 +665,7 @@ os_shared_memory_open(String8 name) { Temp scratch = scratch_begin(0, 0); String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open(name_copy.cstr, O_RDWR, 0); + int id = shm_open((char *)name_copy.str, O_RDWR, 0); OS_Handle result = {(U64)id}; scratch_end(scratch); return result; @@ -802,9 +802,13 @@ os_process_launch(OS_ProcessLaunchParams *params) str8_list_push(scratch.arena, &l, params->cmd_line.first->string); String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); - argv[0] = path_to_exe.cstr; + argv[0] = (char *)path_to_exe.str; U64 arg_idx = 1; - for EachNode(n, String8Node, params->cmd_line.first->next) { argv[arg_idx++] = n->string.cstr; } + for EachNode(n, String8Node, params->cmd_line.first->next) + { + argv[arg_idx] = (char *)n->string.str; + arg_idx += 1; + } } // package envp @@ -819,7 +823,8 @@ os_process_launch(OS_ProcessLaunchParams *params) U64 env_idx = 0; for EachNode(n, String8Node, params->cmd_line.first) { - envp[env_idx] = n->string.cstr; + envp[env_idx] = (char *)n->string.str; + env_idx += 1; } } @@ -1170,15 +1175,17 @@ os_cond_var_broadcast(CondVar cv) internal Semaphore os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) { + Temp scratch = scratch_begin(0, 0); Semaphore result = {0}; - if (name.size > 0) + if(name.size > 0) { for EachIndex(attempt_idx, 64) { - sem_t *s = sem_open(name.cstr, O_CREAT | O_EXCL, 0666, initial_count); + String8 name_copy = str8_copy(scratch.arena, name); + sem_t *s = sem_open((char *)name_copy.str, O_CREAT | O_EXCL, 0666, initial_count); if(s == SEM_FAILED) { - s = sem_open(name.cstr, 0); + s = sem_open((char *)name_copy.str, 0); } if(s != SEM_FAILED) { @@ -1197,6 +1204,7 @@ os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) result.u64[0] = (U64)s; } } + scratch_end(scratch); return result; } @@ -1211,10 +1219,15 @@ internal Semaphore os_semaphore_open(String8 name) { Semaphore result = {0}; - sem_t *s = sem_open(name.cstr, 0); - if(s != SEM_FAILED) { - result.u64[0] = (U64)s; + Temp scratch = scratch_begin(0, 0); + String8 name_copy = str8_copy(scratch.arena, name); + sem_t *s = sem_open((char *)name_copy.str, 0); + if(s != SEM_FAILED) + { + result.u64[0] = (U64)s; + } + scratch_end(scratch); } return result; } @@ -1310,7 +1323,7 @@ internal OS_Handle os_library_open(String8 path) { Temp scratch = scratch_begin(0, 0); - char *path_cstr = push_str8_copy(scratch.arena, path).cstr; + char *path_cstr = (char *)str8_copy(scratch.arena, path).str; void *so = dlopen(path_cstr, RTLD_LAZY|RTLD_LOCAL); OS_Handle lib = { (U64)so }; scratch_end(scratch); @@ -1322,7 +1335,7 @@ os_library_load_proc(OS_Handle lib, String8 name) { Temp scratch = scratch_begin(0, 0); void *so = (void *)lib.u64; - char *name_cstr = push_str8_copy(scratch.arena, name).cstr; + char *name_cstr = (char *)str8_copy(scratch.arena, name).str; VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); scratch_end(scratch); return proc; @@ -1485,15 +1498,15 @@ main(int argc, char **argv) os_lnx_state.arena = arena_alloc(); os_lnx_state.entity_arena = arena_alloc(); pthread_mutex_init(&os_lnx_state.entity_mutex, 0); - + // cache default environment { U64 env_count = 0; for(; __environ[env_count] != 0; env_count += 1) {} char **default_env = push_array(os_lnx_state.arena, char *, env_count+1); - for EachIndex(i, env_count) + for EachIndex(idx, env_count) { - default_env[i] = str8_copy(os_lnx_state.arena, str8_cstring(__environ[i])).cstr; + default_env[idx] = (char *)str8_copy(os_lnx_state.arena, str8_cstring(__environ[idx])).str; } default_env[env_count] = 0; os_lnx_state.default_env_count = env_count; diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index fd933399..3df719c1 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -341,7 +341,7 @@ rb_thread_entry_point(void *p) } scratch_end(scratch); } - + if(file_format == RB_FileFormat_COFF_OBJ || file_format == RB_FileFormat_COFF_BigOBJ) { Temp scratch = scratch_begin(&arena, 1); @@ -432,7 +432,7 @@ rb_thread_entry_point(void *p) {str8_lit_comp("rdi"), str8_lit_comp("RAD Debug Info (.rdi) Conversion")}, {str8_lit_comp("dump"), str8_lit_comp("Textual Dumping")}, {str8_lit_comp("breakpad"), str8_lit_comp("Breakpad Debug Info Conversion")}, - {str8_lit_comp("voff2line"), str8_lit_comp("Map virtual offset to a source line")}, + {str8_lit_comp("voff2line"), str8_lit_comp("Virtual Offset -> Line Mapping")}, }; OutputKind output_kind = OutputKind_Null; String8 output_path = cmd_line_string(cmdline, str8_lit("out")); @@ -535,8 +535,9 @@ rb_thread_entry_point(void *p) fprintf(stderr, "--breakpad Specifies that the utility should convert debug information\n"); fprintf(stderr, " data to the textual Breakpad format.\n\n"); - - fprintf(stderr, "--voff2line Specifies that the utility should map virtual offset to source line.\n\n"); + + fprintf(stderr, "--voff2line Specifies that the utility should map a virtual offset to a\n"); + fprintf(stderr, " line.\n\n"); fprintf(stderr, "--out: Specifies the path to which output data should be written. If\n"); fprintf(stderr, " not specified, the utility will choose a fallback. If dumping\n"); @@ -554,10 +555,11 @@ rb_thread_entry_point(void *p) }break; //////////////////////////// - //- rjf: RDI, Breakpad -> conversion based on inputs + //- rjf: RDI, Breakpad, Debug Info Operations -> conversion based on inputs // case OutputKind_RDI: case OutputKind_Breakpad: + case OutputKind_VOff2Line: { //- rjf: no inputs => help if(lane_idx() == 0 && cmdline->inputs.node_count == 0) switch(output_kind) @@ -592,6 +594,12 @@ rb_thread_entry_point(void *p) fprintf(stderr, "All input files specified on the command line will be dumped. The following\n"); fprintf(stderr, "formats are currently supported: PE, COFF, RDI, and ELF\n\n"); }break; + case OutputKind_VOff2Line: + { + fprintf(stderr, "ARGUMENTS\n\n"); + fprintf(stderr, "--voff: Specifies the virtual offset to map to a source line.\n"); + fprintf(stderr, "\n"); + }break; } //- rjf: unpack subset flags @@ -630,12 +638,24 @@ rb_thread_entry_point(void *p) { subset_flags = (RDIM_SubsetFlag_Units|RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_Scopes|RDIM_SubsetFlag_LineInfo|RDIM_SubsetFlag_InlineLineInfo); }break; + case OutputKind_VOff2Line: + { + subset_flags = (RDIM_SubsetFlag_Units|RDIM_SubsetFlag_LineInfo|RDIM_SubsetFlag_InlineLineInfo|RDIM_SubsetFlag_Procedures); + }break; } //- rjf: convert inputs to RDI info B32 convert_done = 0; RDIM_BakeParams pdb_bake_params = {0}; RDIM_BakeParams dwarf_bake_params = {0}; + typedef struct RDIM_BakeParamsNode RDIM_BakeParamsNode; + struct RDIM_BakeParamsNode + { + RDIM_BakeParamsNode *next; + RDIM_BakeParams v; + }; + RDIM_BakeParamsNode *first_rdi_bake_params = 0; + RDIM_BakeParamsNode *last_rdi_bake_params = 0; { //- rjf: PE inputs w/ DWARF, or ELF inputs => DWARF -> RDI conversion B32 pe_w_dwarf = (input_files_from_format_table[RB_FileFormat_PE].count != 0 && @@ -758,6 +778,43 @@ rb_thread_entry_point(void *p) } ProfScope("convert") pdb_bake_params = p2r_convert(arena, &convert_params); } + + //- rjf: RDI inputs => RDI joining + if(input_files_from_format_table[RB_FileFormat_RDI].count > 1) + { + convert_done = 1; + log_infof("RDIs specified; joining RDIs\n"); + + // rjf: produce bake params for each RDI + for EachNode(n, RB_FileNode, input_files_from_format_table[RB_FileFormat_RDI].first) + { + RB_File *f = n->v; + + // rjf: decompress RDI + RDI_Parsed *rdi = 0; + if(lane_idx() == 0) + { + rdi = push_array(arena, RDI_Parsed, 1); + RDI_ParseStatus rdi_status = rdi_parse(f->data.str, f->data.size, rdi); + U64 decompressed_size = rdi_decompressed_size_from_parsed(rdi); + if(decompressed_size > rdi->raw_data_size) + { + U8 *decompressed_data = push_array_no_zero(arena, U8, decompressed_size); + rdi_decompress_parsed(decompressed_data, decompressed_size, rdi); + rdi_status = rdi_parse(decompressed_data, decompressed_size, rdi); + } + } + lane_sync_u64(&rdi, 0); + + // rjf: RDI -> loose + RDIM_BakeParams rdi_loose = rdim_loose_from_rdi(arena, subset_flags, rdi); + + // rjf: add + RDIM_BakeParamsNode *n = push_array(arena, RDIM_BakeParamsNode, 1); + n->v = rdi_loose; + SLLQueuePush(first_rdi_bake_params, last_rdi_bake_params, n); + } + } } lane_sync(); @@ -768,6 +825,10 @@ rb_thread_entry_point(void *p) bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); + for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) + { + rdim_bake_params_concat_in_place(bake_params, &n->v); + } } lane_sync_u64(&bake_params, 0); @@ -779,24 +840,35 @@ rb_thread_entry_point(void *p) if(output_path__noext.size == 0) { output_path__noext = str8_chop_last_dot(rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PE])->path); } if(output_path__noext.size == 0) { output_path__noext = str8_chop_last_dot(rb_file_list_first(&input_files_from_format_table[RB_FileFormat_ELF64])->path); } if(output_path__noext.size == 0) { output_path__noext = str8_chop_last_dot(rb_file_list_first(&input_files_from_format_table[RB_FileFormat_ELF32])->path); } + if(output_path__noext.size == 0) { output_path__noext = str8_chop_last_dot(rb_file_list_first(&input_files_from_format_table[RB_FileFormat_RDI])->path); } switch(output_kind) { default:{}break; case OutputKind_RDI: { - output_path = push_str8f(arena, "%S.rdi", output_path__noext); + output_path = str8f(arena, "%S.rdi", output_path__noext); }break; case OutputKind_Breakpad: { - output_path = push_str8f(arena, "%S.psym", output_path__noext); + output_path = str8f(arena, "%S.psym", output_path__noext); }break; } } + //- rjf: special case: only a single RDI file passed? all conversion is trivially done, just + // package up RDI data as serialized section bundle, and let the rest of the paths use it. + B32 noop_conversion = 0; + if(input_files.count == 1 && rb_file_list_first(&input_files)->format == RB_FileFormat_RDI) + { + noop_conversion = 1; + convert_done = 1; + log_infof("Single RDI specified; passing through (skipping conversion)"); + } + //- rjf: no viable input paths if(!convert_done && cmdline->inputs.node_count != 0) { - log_user_errorf("Could not load debug info from the specified inputs. You must provide either a valid PDB file or an executable image (PE, ELF) file with DWARF debug info."); + log_user_errorf("Could not load debug info from the specified inputs. You must provide a valid PDB file, an executable image (PE, ELF) file with DWARF debug info, or RDI file(s)."); } //- rjf: bake @@ -806,6 +878,41 @@ rb_thread_entry_point(void *p) bake_results = rdim_bake(arena, bake_params); } + //- rjf: serialize + RDIM_SerializedSectionBundle *serialized_section_bundle = 0; + ProfScope("serialize") if(lane_idx() == 0) + { + serialized_section_bundle = push_array(arena, RDIM_SerializedSectionBundle, 1); + serialized_section_bundle[0] = rdim_serialized_section_bundle_from_bake_results(&bake_results); + } + lane_sync_u64(&serialized_section_bundle, 0); + + //- rjf: special case: no-op conversion (single RDI file) + if(lane_idx() == 0 && noop_conversion) + { + RB_File *f = rb_file_list_first(&input_files); + RDI_Parsed rdi = {0}; + RDI_ParseStatus rdi_status = rdi_parse(f->data.str, f->data.size, &rdi); + U64 decompressed_size = rdi_decompressed_size_from_parsed(&rdi); + if(decompressed_size > rdi.raw_data_size) + { + U8 *decompressed_data = push_array_no_zero(arena, U8, decompressed_size); + rdi_decompress_parsed(decompressed_data, decompressed_size, &rdi); + rdi_status = rdi_parse(decompressed_data, decompressed_size, &rdi); + } + for EachIndex(idx, rdi.sections_count) + { + if(idx < RDI_SectionKind_COUNT) + { + serialized_section_bundle->sections[idx].data = rdi.raw_data + rdi.sections[idx].off; + serialized_section_bundle->sections[idx].encoded_size = rdi.sections[idx].encoded_size; + serialized_section_bundle->sections[idx].unpacked_size = rdi.sections[idx].unpacked_size; + serialized_section_bundle->sections[idx].encoding = rdi.sections[idx].encoding; + } + } + } + lane_sync(); + //- rjf: convert done => generate output if(convert_done) switch(output_kind) { @@ -814,15 +921,6 @@ rb_thread_entry_point(void *p) //- rjf: generate RDI blobs case OutputKind_RDI: { - // rjf: serialize - RDIM_SerializedSectionBundle *serialized_section_bundle = 0; - ProfScope("serialize") if(lane_idx() == 0) - { - serialized_section_bundle = push_array(arena, RDIM_SerializedSectionBundle, 1); - serialized_section_bundle[0] = rdim_serialized_section_bundle_from_bake_results(&bake_results); - } - lane_sync_u64(&serialized_section_bundle, 0); - // rjf: compress RDIM_SerializedSectionBundle serialized_section_bundle__compressed = serialized_section_bundle[0]; if(cmd_line_has_flag(cmdline, str8_lit("compress"))) ProfScope("compress") @@ -838,28 +936,36 @@ rb_thread_entry_point(void *p) //- rjf: generate breakpad text case OutputKind_Breakpad: { + //- rjf: flatten to RDI data + String8List rdi_blobs = rdim_file_blobs_from_section_bundle(arena, serialized_section_bundle); + String8 rdi_data = str8_list_join(arena, &rdi_blobs, 0); + RDI_Parsed rdi_ = {0}; + RDI_Parsed *rdi = &rdi_; + RDI_ParseStatus rdi_status = rdi_parse(rdi_data.str, rdi_data.size, rdi); + //- rjf: set up shared state typedef struct P2B_Shared P2B_Shared; struct P2B_Shared { String8List dump; - String8List *lane_chunk_file_dumps; - String8List *lane_chunk_func_dumps; + String8List *lane_file_dumps; + String8List *lane_func_dumps; }; - local_persist P2B_Shared *p2b_shared = 0; + P2B_Shared *p2b_shared = 0; if(lane_idx() == 0) { p2b_shared = push_array(arena, P2B_Shared, 1); - p2b_shared->lane_chunk_file_dumps = push_array(arena, String8List, lane_count()*bake_params->src_files.chunk_count); - p2b_shared->lane_chunk_func_dumps = push_array(arena, String8List, lane_count()*bake_params->procedures.chunk_count); + p2b_shared->lane_file_dumps = push_array(arena, String8List, lane_count()); + p2b_shared->lane_func_dumps = push_array(arena, String8List, lane_count()); } - lane_sync(); + lane_sync_u64(&p2b_shared, 0); //- rjf: dump MODULE record if(lane_idx() == 0) { // rjf: pick name to identify module - String8 module_name_string = bake_params->top_level_info.exe_name; + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + String8 module_name_string = str8_from_rdi_string_idx(rdi, tli->exe_name_string_idx); if(module_name_string.size == 0 && input_files.first != 0) { module_name_string = input_files.first->v->path; @@ -867,9 +973,9 @@ rb_thread_entry_point(void *p) // rjf: pick string for unique code String8 unique_identifier_string = {0}; - if(unique_identifier_string.size == 0 && bake_params->top_level_info.exe_hash != 0) + if(unique_identifier_string.size == 0 && tli->exe_hash != 0) { - unique_identifier_string = str8f(arena, "%I64x", bake_params->top_level_info.exe_hash); + unique_identifier_string = str8f(arena, "%I64x", tli->exe_hash); } if(unique_identifier_string.size == 0) { @@ -906,86 +1012,74 @@ rb_thread_entry_point(void *p) //- rjf: dump FILE records ProfScope("dump FILE records") { - U64 chunk_idx = 0; - for EachNode(n, RDIM_SrcFileChunkNode, bake_params->src_files.first) + U64 count = 0; + RDI_SourceFile *v = rdi_table_from_name(rdi, SourceFiles, &count); + Rng1U64 range = lane_range(count); + for EachInRange(idx, range) { - Rng1U64 range = lane_range(n->count); - for EachInRange(idx, range) - { - U64 file_idx = rdim_idx_from_src_file(&n->v[idx]); - String8 src_path = n->v[idx].path; - str8_list_pushf(arena, &p2b_shared->lane_chunk_file_dumps[lane_idx()*bake_params->src_files.chunk_count + chunk_idx], "FILE %I64u %S\n", file_idx, src_path); - } - chunk_idx += 1; + String8List *out = &p2b_shared->lane_file_dumps[lane_idx()]; + Temp scratch = scratch_begin(&arena, 1); + String8 src_path = str8_from_rdi_path_node_idx(scratch.arena, rdi, PathStyle_Relative, v[idx].file_path_node_idx); + str8_list_pushf(arena, out, "FILE %I64u %S\n", idx, src_path); + scratch_end(scratch); } } //- rjf: dump FUNC records ProfScope("dump FUNC records") { - U64 chunk_idx = 0; - for EachNode(n, RDIM_SymbolChunkNode, bake_params->procedures.first) + U64 count = 0; + RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count); + Rng1U64 range = lane_range(count); + for EachInRange(idx, range) { - String8List *out = &p2b_shared->lane_chunk_func_dumps[lane_idx()*bake_params->procedures.chunk_count + chunk_idx]; - Rng1U64 range = lane_range(n->count); - for EachInRange(idx, range) + // NOTE(rjf): breakpad does not support multiple voff ranges per procedure. + String8List *out = &p2b_shared->lane_func_dumps[lane_idx()]; + RDI_Procedure *proc = &v[idx]; + RDI_Scope *root_scope = rdi_element_from_name_idx(rdi, Scopes, proc->root_scope_idx); + if(root_scope->voff_range_opl > root_scope->voff_range_first) { - // NOTE(rjf): breakpad does not support multiple voff ranges per procedure. - RDIM_Symbol *proc = &n->v[idx]; - RDIM_Scope *root_scope = proc->root_scope; - if(root_scope != 0 && root_scope->voff_ranges.first != 0) + // rjf: dump function record + RDIM_Rng1U64 voff_range = { - // rjf: dump function record - RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v; - str8_list_pushf(arena, out, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name); - - // rjf: dump function lines - U64 unit_idx = rdi_vmap_idx_from_voff(bake_results.unit_vmap.vmap.vmap, bake_results.unit_vmap.vmap.count, voff_range.min); - if(0 < unit_idx && unit_idx <= bake_results.units.units_count) + *rdi_element_from_name_idx(rdi, ScopeVOffData, root_scope->voff_range_first), + *rdi_element_from_name_idx(rdi, ScopeVOffData, root_scope->voff_range_opl - 1), + }; + str8_list_pushf(arena, out, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, str8_from_rdi_string_idx(rdi, proc->name_string_idx)); + + // rjf: dump function lines + U64 unit_vmap_count = 0; + RDI_VMapEntry *unit_vmap = rdi_table_from_name(rdi, UnitVMap, &unit_vmap_count); + RDI_Unit *unit = rdi_unit_from_voff(rdi, voff_range.min); + RDI_LineTable *line_table = rdi_line_table_from_unit(rdi, unit); + RDI_ParsedLineTable line_info = {0}; + rdi_parsed_from_line_table(rdi, line_table, &line_info); + for(U64 voff = voff_range.min, last_voff = 0; + voff < voff_range.max && voff > last_voff;) + { + RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&line_info, voff); + if(line_info_idx < line_info.count) { - U32 line_table_idx = bake_results.units.units[unit_idx].line_table_idx; - if(0 < line_table_idx && line_table_idx <= bake_results.line_tables.line_tables_count) + RDI_Line *line = &line_info.lines[line_info_idx]; + U64 line_voff_min = line_info.voffs[line_info_idx]; + U64 line_voff_opl = line_info.voffs[line_info_idx+1]; + if(line->file_idx != 0) { - // rjf: unpack unit line info - RDI_LineTable *line_table = &bake_results.line_tables.line_tables[line_table_idx]; - RDI_ParsedLineTable line_info = - { - bake_results.line_tables.line_table_voffs + line_table->voffs_base_idx, - bake_results.line_tables.line_table_lines + line_table->lines_base_idx, - 0, - line_table->lines_count, - 0 - }; - for(U64 voff = voff_range.min, last_voff = 0; - voff < voff_range.max && voff > last_voff;) - { - RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&line_info, voff); - if(line_info_idx < line_info.count) - { - RDI_Line *line = &line_info.lines[line_info_idx]; - U64 line_voff_min = line_info.voffs[line_info_idx]; - U64 line_voff_opl = line_info.voffs[line_info_idx+1]; - if(line->file_idx != 0) - { - str8_list_pushf(arena, out, "%I64x %I64x %I64u %I64u\n", - line_voff_min, - line_voff_opl-line_voff_min, - (U64)line->line_num, - (U64)line->file_idx); - } - last_voff = voff; - voff = line_voff_opl; - } - else - { - break; - } - } + str8_list_pushf(arena, out, "%I64x %I64x %I64u %I64u\n", + line_voff_min, + line_voff_opl-line_voff_min, + (U64)line->line_num, + (U64)line->file_idx); } + last_voff = voff; + voff = line_voff_opl; + } + else + { + break; } } } - chunk_idx += 1; } } @@ -993,24 +1087,74 @@ rb_thread_entry_point(void *p) lane_sync(); if(lane_idx() == 0) { - for EachIndex(chunk_idx, bake_params->src_files.chunk_count) + for EachIndex(ln_idx, lane_count()) { - for EachIndex(ln_idx, lane_count()) - { - str8_list_concat_in_place(&p2b_shared->dump, &p2b_shared->lane_chunk_file_dumps[ln_idx*bake_params->src_files.chunk_count + chunk_idx]); - } + str8_list_concat_in_place(&p2b_shared->dump, &p2b_shared->lane_file_dumps[ln_idx]); } - for EachIndex(chunk_idx, bake_params->procedures.chunk_count) + for EachIndex(ln_idx, lane_count()) { - for EachIndex(ln_idx, lane_count()) - { - str8_list_concat_in_place(&p2b_shared->dump, &p2b_shared->lane_chunk_func_dumps[ln_idx*bake_params->procedures.chunk_count + chunk_idx]); - } + str8_list_concat_in_place(&p2b_shared->dump, &p2b_shared->lane_func_dumps[ln_idx]); } } lane_sync(); output_blobs = p2b_shared->dump; }break; + + //- rjf: generate voff -> line results + case OutputKind_VOff2Line: + { + //- rjf: unpack voff arg + U64 voff = 0; + { + String8 voff_str = cmd_line_string(cmdline, str8_lit("voff")); + try_u64_from_str8_c_rules(voff_str, &voff); + log_infof("User specified \"%S\" as virtual offset; parsed as 0x%I64x", voff_str, voff); + } + + //- rjf: flatten to RDI data + String8List rdi_blobs = rdim_file_blobs_from_section_bundle(arena, serialized_section_bundle); + String8 rdi_data = str8_list_join(arena, &rdi_blobs, 0); + RDI_Parsed rdi_ = {0}; + RDI_Parsed *rdi = &rdi_; + RDI_ParseStatus rdi_status = rdi_parse(rdi_data.str, rdi_data.size, rdi); + + //- rjf: voff -> line + RDI_Line line = rdi_line_from_voff(rdi, voff); + RDI_SourceFile *src_file = rdi_element_from_name_idx(rdi, SourceFiles, line.file_idx); + + //- rjf: dump line info + { + Temp scratch = scratch_begin(0, 0); + RDI_Scope *voff_scope = rdi_scope_from_voff(rdi, voff); + for(RDI_Scope *scope = voff_scope, *null_scope = rdi_element_from_name_idx(rdi, Scopes, 0); + scope != 0 && scope != null_scope; + scope = rdi_parent_from_scope(rdi, scope)) + { + RDI_InlineSite *inline_site = rdi_inline_site_from_scope(rdi, scope); + RDI_InlineSite *null_inline_site = rdi_element_from_name_idx(rdi, InlineSites, 0); + if(inline_site && inline_site != null_inline_site) + { + RDI_LineTable *inline_line_table = rdi_element_from_name_idx(rdi, LineTables, inline_site->line_table_idx); + RDI_LineTable *null_inline_line_table = rdi_element_from_name_idx(rdi, LineTables, 0); + if(inline_line_table && inline_line_table != null_inline_line_table) + { + String8 inline_name = str8_from_rdi_string_idx(rdi, inline_site->name_string_idx); + RDI_Line inline_line = rdi_line_from_line_table_voff(rdi, inline_line_table, voff); + RDI_SourceFile *inline_src_file = rdi_element_from_name_idx(rdi, SourceFiles, inline_line.file_idx); + RDI_SourceFile *null_inline_src_file = rdi_element_from_name_idx(rdi, SourceFiles, 0); + if(inline_src_file && inline_src_file != null_inline_src_file) + { + String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, PathStyle_SystemAbsolute, src_file->file_path_node_idx); + str8_list_pushf(arena, &output_blobs, "[inlined] %S %S:%u\n", inline_name, path, inline_line.line_num); + } + } + } + } + String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, PathStyle_SystemAbsolute, src_file->file_path_node_idx); + str8_list_pushf(arena, &output_blobs, "%S:%u\n", path, line.line_num); + scratch_end(scratch); + } + }break; } }break; @@ -1058,7 +1202,7 @@ rb_thread_entry_point(void *p) #undef X fprintf(stderr, "\n"); } - + B32 verbose = cmd_line_has_flag(cmdline, str8_lit("verbose")); //- rjf: unpack dump subset flags @@ -1147,7 +1291,7 @@ rb_thread_entry_point(void *p) { elf = elf_bin_from_data(arena, f->data); arch = arch_from_elf_machine(elf.hdr.e_machine); - + for EachIndex(sect_idx, elf.hdr.e_shnum) { ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; @@ -1156,7 +1300,7 @@ rb_thread_entry_point(void *p) { eh_frame_hdr = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); eh_frame_hdr_vaddr = shdr->sh_addr; - + } else if(str8_match(name, str8_lit(".eh_frame"), 0)) { @@ -1268,7 +1412,7 @@ rb_thread_entry_point(void *p) } lane_sync(); } - + if(eh_dump_subset_flags) { if(lane_idx() == 0) @@ -1280,106 +1424,6 @@ rb_thread_entry_point(void *p) } } }break; - - case OutputKind_VOff2Line: - { - if(lane_idx() != 0) { break; } - - if(cmdline->inputs.node_count == 0) - { - fprintf(stderr, "ARGUMENTS\n\n"); - fprintf(stderr, "--voff:OFFSET Map specified virtual offset to a source line.\n"); - break; - } - - if(cmdline->inputs.node_count > 1) - { - fprintf(stderr, "ERROR: too many input files!\n"); - break; - } - - if(!cmd_line_has_argument(cmdline, str8_lit("voff"))) { - fprintf(stderr, "ERROR: missing -voff\n"); - break; - } - - String8 voff_str = cmd_line_string(cmdline, str8_lit("voff")); - if(voff_str.size == 0) - { - fprintf(stderr, "ERROR: missing argument for -voff\n"); - break; - } - - U64 voff = 0; - if(!try_u64_from_str8_c_rules(voff_str, &voff)) - { - fprintf(stderr, "ERROR: invalid argument for -voff\n"); - break; - } - - RB_File *f = input_files.first->v; - if(f->format != RB_FileFormat_RDI) - { - fprintf(stderr, "ERROR: input file must be RDI.\n"); - break; - } - - RDI_Parsed rdi = {0}; - RDI_ParseStatus rdi_parse_status = rdi_parse(f->data.str, f->data.size, &rdi); - if(rdi_parse_status != RDI_ParseStatus_Good) - { - fprintf(stderr, "ERROR: failed to parse RDI with code %d\n", rdi_parse_status); - break; - } - - RDI_Line line = rdi_line_from_voff(&rdi, voff); - if(line.file_idx == 0 || line.line_num == 0) - { - fprintf(stderr, "ERROR: failed to find mapping for virtual offset 0x%llx.\n", voff); - break; - } - - RDI_SourceFile *src_file = rdi_element_from_name_idx(&rdi, SourceFiles, line.file_idx); - if(src_file == 0) - { - fprintf(stderr, "ERROR: failed to find source file with index %u.\n", line.file_idx); - break; - } - - Temp scratch = scratch_begin(0, 0); - - // format inline site stack - { - RDI_Scope *voff_scope = rdi_scope_from_voff(&rdi, voff); - for(RDI_Scope *scope = voff_scope, *null_scope = rdi_element_from_name_idx(&rdi, Scopes, 0); scope != 0 && scope != null_scope; scope = rdi_parent_from_scope(&rdi, scope)) - { - RDI_InlineSite *inline_site = rdi_inline_site_from_scope(&rdi, scope); - RDI_InlineSite *null_inline_site = rdi_element_from_name_idx(&rdi, InlineSites, 0); - if(inline_site && inline_site != null_inline_site) - { - RDI_LineTable *inline_line_table = rdi_element_from_name_idx(&rdi, LineTables, inline_site->line_table_idx); - RDI_LineTable *null_inline_line_table = rdi_element_from_name_idx(&rdi, LineTables, 0); - if(inline_line_table && inline_line_table != null_inline_line_table) - { - String8 inline_name = str8_from_rdi_string_idx(&rdi, inline_site->name_string_idx); - RDI_Line inline_line = rdi_line_from_line_table_voff(&rdi, inline_line_table, voff); - RDI_SourceFile *inline_src_file = rdi_element_from_name_idx(&rdi, SourceFiles, inline_line.file_idx); - RDI_SourceFile *null_inline_src_file = rdi_element_from_name_idx(&rdi, SourceFiles, 0); - if(inline_src_file && inline_src_file != null_inline_src_file) - { - String8 path = str8_from_rdi_path_node_idx(scratch.arena, &rdi, PathStyle_SystemAbsolute, src_file->file_path_node_idx); - fprintf(stdout, "[inlined] %.*s %.*s:%u\n", str8_varg(inline_name), str8_varg(path), inline_line.line_num); - } - } - } - } - } - - String8 path = str8_from_rdi_path_node_idx(scratch.arena, &rdi, PathStyle_SystemAbsolute, src_file->file_path_node_idx); - fprintf(stdout, "%.*s:%u\n", str8_varg(path), line.line_num); - - scratch_end(scratch); - }break; } ////////////////////////////// diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 20504b8a..549a8fe4 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -1208,7 +1208,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync_u64(&units_first_inline_site_line_tables, 0); RDIM_Unit *units = all_units_ptr->first ? all_units_ptr->first->v : 0; U64 units_count = all_units_ptr->first ? all_units_ptr->first->count : 0; - Assert(units_count == comp_units->count); //- rjf: do per-lane work if(params->subset_flags & (RDIM_SubsetFlag_Units| diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 9bf5e6e9..d4790190 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -46,6 +46,236 @@ rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_Binar return top_level_info; } +internal RDIM_BakeParams +rdim_loose_from_rdi(Arena *arena, RDIM_SubsetFlags subset_flags, RDI_Parsed *rdi) +{ + //- rjf: setup bake params + RDIM_BakeParams *bp = 0; + if(lane_idx() == 0) + { + bp = push_array(arena, RDIM_BakeParams, 1); + bp->subset_flags = subset_flags; + } + lane_sync_u64(&bp, 0); + + //- rjf: convert top level info + if(lane_idx() == 0) + { + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + bp->top_level_info.arch = tli->arch; + bp->top_level_info.exe_name.str = rdi_string_from_idx(rdi, tli->exe_name_string_idx, &bp->top_level_info.exe_name.size); + bp->top_level_info.exe_hash = tli->exe_hash; + bp->top_level_info.voff_max = tli->voff_max; + bp->top_level_info.guid = tli->guid; + bp->top_level_info.producer_name.str = rdi_string_from_idx(rdi, tli->producer_name_string_idx, &bp->top_level_info.producer_name.size); + } + lane_sync(); + + //- rjf: convert binary sections + if(lane_idx() == 0) + { + U64 count = 0; + RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count); + for EachIndex(idx, count) + { + RDIM_BinarySection *bsec = rdim_binary_section_list_push(arena, &bp->binary_sections); + bsec->name.str = rdi_string_from_idx(rdi, v[idx].name_string_idx, &bsec->name.size); + bsec->flags = v[idx].flags; + bsec->voff_first = v[idx].voff_first; + bsec->voff_opl = v[idx].voff_opl; + bsec->foff_first = v[idx].foff_first; + bsec->foff_opl = v[idx].foff_opl; + } + } + lane_sync(); + + //- rjf: bucket voff ranges by unit idx + RDIM_Rng1U64ChunkList *unit_ranges = 0; + if(lane_idx() == 0) + { + U64 units_count = 0; + rdi_table_from_name(rdi, Units, &units_count); + U64 unit_vmap_count = 0; + RDI_VMapEntry *unit_vmap = rdi_table_from_name(rdi, UnitVMap, &unit_vmap_count); + unit_ranges = push_array(arena, RDIM_Rng1U64ChunkList, units_count); + if(unit_vmap_count > 0) + { + for EachIndex(idx, unit_vmap_count-1) + { + RDIM_Rng1U64 rng = {unit_vmap[idx].voff, unit_vmap[idx+1].voff}; + rdim_rng1u64_chunk_list_push(arena, &unit_ranges[unit_vmap[idx].idx], 256, rng); + } + } + } + lane_sync_u64(&unit_ranges, 0); + + //- rjf: convert src files + RDIM_SrcFileChunkList *src_files = 0; + RDIM_SrcFile **src_file_from_idx_table = 0; + { + U64 src_file_count = 0; + RDI_SourceFile *src_file_v = rdi_table_from_name(rdi, SourceFiles, &src_file_count); + RDIM_SrcFileChunkList *lane_srcfiles = 0; + if(lane_idx() == 0) + { + src_files = push_array(arena, RDIM_SrcFileChunkList, 1); + src_file_from_idx_table = push_array(arena, RDIM_SrcFile *, src_file_count); + lane_srcfiles = push_array(arena, RDIM_SrcFileChunkList, lane_count()); + } + lane_sync_u64(&lane_srcfiles, 0); + { + Rng1U64 range = lane_range(src_file_count); + for EachInRange(idx, range) + { + RDI_SourceFile *src = &src_file_v[idx]; + RDIM_SrcFile *dst = rdim_src_file_chunk_list_push(arena, &lane_srcfiles[lane_idx()], dim_1u64(range)); + + // rjf: get checksum + String8 checksum = {0}; + switch(src->checksum_kind) + { + default:{}break; + case RDI_ChecksumKind_MD5: {checksum = str8(rdi_element_from_name_idx(rdi, MD5Checksums, src->checksum_idx)->u8, sizeof(RDI_MD5));}break; + case RDI_ChecksumKind_SHA1: {checksum = str8(rdi_element_from_name_idx(rdi, SHA1Checksums, src->checksum_idx)->u8, sizeof(RDI_SHA1));}break; + case RDI_ChecksumKind_SHA256: {checksum = str8(rdi_element_from_name_idx(rdi, SHA256Checksums, src->checksum_idx)->u8, sizeof(RDI_SHA256));}break; + case RDI_ChecksumKind_Timestamp:{checksum = str8((U8 *)rdi_element_from_name_idx(rdi, Timestamps, src->checksum_idx), sizeof(RDI_U64));}break; + } + + // rjf: fill basics + dst->path = str8_from_rdi_path_node_idx(arena, rdi, PathStyle_Relative, src->file_path_node_idx); + dst->checksum_kind = src->checksum_kind; + dst->checksum = checksum; + src_file_from_idx_table[idx] = dst; + } + } + lane_sync(); + if(lane_idx() == 0) + { + for EachIndex(lidx, lane_count()) + { + rdim_src_file_chunk_list_concat_in_place(src_files, &lane_srcfiles[lidx]); + } + } + } + lane_sync(); + + //- rjf: convert units + RDIM_UnitChunkList *units = 0; + RDIM_LineTableChunkList *line_tables = 0; + { + RDIM_UnitChunkList *lane_units = 0; + RDIM_LineTableChunkList *lane_linetables = 0; + if(lane_idx() == 0) + { + lane_units = push_array(arena, RDIM_UnitChunkList, lane_count()); + lane_linetables = push_array(arena, RDIM_LineTableChunkList, lane_count()); + units = push_array(arena, RDIM_UnitChunkList, 1); + line_tables = push_array(arena, RDIM_LineTableChunkList, 1); + } + lane_sync_u64(&lane_units, 0); + lane_sync_u64(&lane_linetables, 0); + lane_sync_u64(&units, 0); + lane_sync_u64(&line_tables, 0); + U64 count = 0; + RDI_Unit *v = rdi_table_from_name(rdi, Units, &count); + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= count) + { + break; + } + RDI_Unit *src = &v[unit_idx]; + + // rjf: convert flat top parts + RDIM_Unit *dst = rdim_unit_chunk_list_push(arena, &lane_units[lane_idx()], 64); + dst->unit_name = str8_from_rdi_string_idx(rdi, src->unit_name_string_idx); + dst->compiler_name = str8_from_rdi_string_idx(rdi, src->compiler_name_string_idx); + dst->source_file = str8_from_rdi_path_node_idx(arena, rdi, PathStyle_Relative, src->source_file_path_node); + dst->object_file = str8_from_rdi_path_node_idx(arena, rdi, PathStyle_Relative, src->object_file_path_node); + dst->archive_file = str8_from_rdi_path_node_idx(arena, rdi, PathStyle_Relative, src->archive_file_path_node); + dst->build_path = str8_from_rdi_path_node_idx(arena, rdi, PathStyle_Relative, src->build_path_node); + dst->language = src->language; + dst->voff_ranges = unit_ranges[unit_idx]; + + // rjf: convert line table + dst->line_table = rdim_line_table_chunk_list_push(arena, &lane_linetables[lane_idx()], 64); + { + RDI_LineTable *src_lt_unparsed = rdi_element_from_name_idx(rdi, LineTables, src->line_table_idx); + RDI_ParsedLineTable src_lt = {0}; + rdi_parsed_from_line_table(rdi, src_lt_unparsed, &src_lt); + RDIM_LineTable *dst_lt = dst->line_table; + { + RDIM_SrcFile *seq_src_file = 0; + U64 seq_start_idx = 0; + for(U64 line_idx = 0; line_idx <= src_lt.count; line_idx += 1) + { + // rjf: get next src file + RDIM_SrcFile *next_src_file = 0; + if(line_idx < src_lt.count) + { + next_src_file = src_file_from_idx_table[src_lt.lines[line_idx].file_idx]; + } + + // rjf: next file doesn't match current sequence? -> complete sequence + if(next_src_file != seq_src_file && seq_src_file != 0) + { + U64 seq_line_count = (line_idx - seq_start_idx); + U32 *seq_line_nums = push_array(arena, U32, seq_line_count); + for(U64 line_idx_2 = seq_start_idx; line_idx_2 < line_idx; line_idx_2 += 1) + { + seq_line_nums[line_idx_2] = src_lt.lines[line_idx_2].line_num; + } + rdim_line_table_push_sequence(arena, &lane_linetables[lane_idx()], dst_lt, seq_src_file, + src_lt.voffs + seq_start_idx, + seq_line_nums, + 0, // TODO(rjf): column support + seq_line_count); + } + + // rjf: start next sequence + if(next_src_file != seq_src_file) + { + seq_src_file = next_src_file; + seq_start_idx = line_idx; + } + } + } + } + } + lane_sync(); + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + rdim_unit_chunk_list_concat_in_place(units, &lane_units[l_idx]); + } + for EachIndex(l_idx, lane_count()) + { + rdim_line_table_chunk_list_concat_in_place(line_tables, &lane_linetables[l_idx]); + } + } + } + lane_sync(); + + // TODO(rjf): convert types + // TODO(rjf): convert udts + // TODO(rjf): convert locations + // TODO(rjf): convert global variables + // TODO(rjf): convert thread variables + // TODO(rjf): convert constants + // TODO(rjf): convert procedures + // TODO(rjf): convert scopes + // TODO(rjf): convert inline sites + // TODO(rjf): package & return + + RDIM_BakeParams result = bp[0]; + return result; +} + internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params) { diff --git a/src/rdi_make/rdi_make_local.h b/src/rdi_make/rdi_make_local.h index b7ed9ed9..3e5d6f95 100644 --- a/src/rdi_make/rdi_make_local.h +++ b/src/rdi_make/rdi_make_local.h @@ -162,6 +162,7 @@ global RDIM_Shared *rdim_shared = 0; internal RDIM_DataModel rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch); internal RDIM_TopLevelInfo rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections); +internal RDIM_BakeParams rdim_loose_from_rdi(Arena *arena, RDIM_SubsetFlags subset_flags, RDI_Parsed *rdi); internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params); internal RDIM_SerializedSectionBundle rdim_compress(Arena *arena, RDIM_SerializedSectionBundle *in); diff --git a/src/third_party/radsort/radsort.h b/src/third_party/radsort/radsort.h index 90a971ba..752193e8 100644 --- a/src/third_party/radsort/radsort.h +++ b/src/third_party/radsort/radsort.h @@ -115,7 +115,7 @@ typedef struct RS_MAX_BUBBLE_BUF { char b[RS_SMALL_FLIP_TO_INSERTION_GT_SIZE]; } #if _MSC_VER # define radsort_break_ __debugbreak() #else -# define radsort_break_ ___builtin_trap() +# define radsort_break_ __builtin_trap() #endif #define radsort( start, len, is_before_func ) \ diff --git a/src/third_party/stb/stb_sprintf.h b/src/third_party/stb/stb_sprintf.h index 7614dfbf..9a5fe40d 100644 --- a/src/third_party/stb/stb_sprintf.h +++ b/src/third_party/stb/stb_sprintf.h @@ -631,17 +631,17 @@ cl = lg; \ dp = 0; cs = 0; }goto scopy; - + case 'm': case 'M': { stbsp__flush_cb(); - + static const U64 one_kib = 1ull * 1024; static const U64 one_mib = 1ull * 1024 * 1024; static const U64 one_gib = 1ull * 1024 * 1024 * 1024; static const U64 one_tib = 1ull * 1024 * 1024 * 1024 * 1024; - + U64 size; if(f[0] == 'M') { @@ -651,11 +651,11 @@ cl = lg; \ { size = va_arg(va, U32); } - + U64 lo = 0; U64 hi = 0; char *units = ""; - + if(size < one_kib) { hi = size; @@ -686,7 +686,7 @@ cl = lg; \ lo = ((size * 100) / one_tib) % 100; units = "TiB"; } - + // format high part if(hi > 0) { @@ -707,37 +707,37 @@ cl = lg; \ *bf = '0'; ++bf; } - + // format low part if(lo > 0) { *bf = '.'; ++bf; - + s = num; for(U64 n = lo; n > 0; n /= 10ull) { *s = (char)(n % 10ull) + '0'; ++s; } - + U64 lead_zero_count = 3 - (U64)(s-num); for(U64 i = 1; i < lead_zero_count; ++i) { *bf = '0'; ++bf; } - + for(S64 i = (S64)(s-num)-1; i >= 0; --i) { *bf = num[i]; ++bf; } } - + *bf = ' '; ++bf; - + // copy units for(U64 i = 0; units[i] != 0; ++i) { @@ -745,14 +745,14 @@ cl = lg; \ ++bf; } }break; - + case 'r': { stbsp__flush_cb(); Rng1U64 range = va_arg(va, Rng1U64); - bf += STB_SPRINTF_DECORATE(sprintf)(bf, "[0x%llx, 0x%llx)", range.min, range.max); + bf += STB_SPRINTF_DECORATE(sprintf)(bf, "[0x%llx, 0x%llx)", (unsigned long long)range.min, (unsigned long long)range.max); }break; - + // // NOTE(rjf): DEBUGGER PROJECT ADDITION ^^^ //- diff --git a/src/torture/torture.h b/src/torture/torture.h index 647c3471..a2e90725 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -40,39 +40,39 @@ extern U64 g_torture_test_count; extern T_Test g_torture_tests[0xffffff]; #define T_AddTest(name, l, ...) \ - T_RunResult t_##name(void); \ - __VA_ARGS__ void t_add_test_##name(void) \ - { \ - g_torture_tests[g_torture_test_count].group = T_Group; \ - g_torture_tests[g_torture_test_count].label = Stringify(name); \ - g_torture_tests[g_torture_test_count].r = &t_##name; \ - g_torture_tests[g_torture_test_count].decl_line = l; \ - g_torture_test_count += 1; \ - } +T_RunResult t_##name(void); \ +__VA_ARGS__ void t_add_test_##name(void) \ +{ \ +g_torture_tests[g_torture_test_count].group = T_Group; \ +g_torture_tests[g_torture_test_count].label = Stringify(name); \ +g_torture_tests[g_torture_test_count].r = &t_##name; \ +g_torture_tests[g_torture_test_count].decl_line = l; \ +g_torture_test_count += 1; \ +} #if COMPILER_MSVC #pragma section(".CRT$XCU", read) # define T_BeginTest_(name) \ - T_AddTest(name, __LINE__) \ - __declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ - __pragma(comment(linker, "/include:" Stringify(r_##name))) +T_AddTest(name, __LINE__) \ +__declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ +__pragma(comment(linker, "/include:" Stringify(r_##name))) #else # define T_BeginTest_(name) \ - T_AddTest(name, __LINE__, __attribute__((constructor))) +T_AddTest(name, __LINE__, __attribute__((constructor))) #endif #define T_BeginTest(name) \ - T_BeginTest_(name) \ - T_RunResult t_##name(void) { \ - Temp scratch = scratch_begin(0,0); \ - T_RunResult result = { .status = T_RunStatus_Fail }; +T_BeginTest_(name) \ +T_RunResult t_##name(void) { \ +Temp scratch = scratch_begin(0,0); \ +T_RunResult result = { .status = T_RunStatus_Fail }; #define T_EndTest \ - result.status = T_RunStatus_Pass; \ - exit__:; \ - scratch_end(scratch); \ - return result; \ - } +result.status = T_RunStatus_Pass; \ +exit__:; \ +scratch_end(scratch); \ +return result; \ +} #define T_Ok(c) do { if (!(c)) { result.fail_file = __FILE__; result.fail_line = __LINE__; result.fail_cond = Stringify(c); goto exit__; } } while(0) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 1255e1c1..e2464b35 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -7,7 +7,7 @@ internal RDI_Parsed * d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) { Temp scratch = scratch_begin(&arena, 1); - + String8 raw_coff; { OBJ *obj = obj_alloc(0, Arch_x64); @@ -18,26 +18,26 @@ d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) raw_coff = coff_from_obj(scratch.arena, obj); obj_release(&obj); } - + Assert(t_write_file(str8_lit("a.obj"), raw_coff)); t_invoke(t_radlink_path(), str8_lit("/subsystem:console /out:a.exe /entry:main /DEBUG:FULL /opt:noref /opt:noicf a.obj"), max_U64); Assert(g_last_exit_code == 0); String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); Assert(exe.size > 0); - + B32 was_pdb_deleted = os_delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); Assert(was_pdb_deleted); - + t_invoke_(t_radbin_path(), str8_lit("-rdi a.exe -out:a.rdi"), max_U64, 0, 0); Assert(g_last_exit_code == 0); - + String8 raw_rdi = t_read_file(arena, str8_lit("a.rdi")); Assert(raw_rdi.size > 0); - + RDI_Parsed *rdi = push_array(arena, RDI_Parsed, 1); RDI_ParseStatus rdi_parse_status = rdi_parse(raw_rdi.str, raw_rdi.size, rdi); Assert(rdi_parse_status == RDI_ParseStatus_Good); - + scratch_end(scratch); return rdi; } @@ -47,10 +47,10 @@ d2rt_type_from_name(RDI_Parsed *rdi, RDI_ParsedNameMap *map, char *name) { String8 s = str8_cstring(name); RDI_NameMapNode *node = rdi_name_map_lookup(rdi, map, s.str, s.size); - + U32 id_count = 0; U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - + if (id_count == 1) { return rdi_element_from_name_idx(rdi, TypeNodes, ids[0]); } @@ -63,104 +63,104 @@ T_BeginTest(d2r_types) { dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); - + #define DeclBaseType(tt, n, e, s) \ - DW_WriterTag *tt = dw_writer_tag_begin(writer, DW_TagKind_BaseType); \ - dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, s); \ - dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_##e); \ - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ - dw_writer_tag_end(writer); - DeclBaseType(char_type, "char", SignedChar, 1); - DeclBaseType(unsigned_char_type, "unsigned char", UnsignedChar, 1); - DeclBaseType(char8_type, "char8_t", Utf, 1); - DeclBaseType(char16_type, "char16_t", Utf, 2); - DeclBaseType(char32_type, "char32_t", Utf, 4); - DeclBaseType(wchar_type, "wchar_t", Signed, 4); - DeclBaseType(bool_type, "_Bool", Boolean, 1); - DeclBaseType(short_type, "short", Signed, 2); - DeclBaseType(unsigned_short_type, "unsigned short", Unsigned, 2); - DeclBaseType(short_unsigned_int_type, "short unsigned int", Unsigned, 2); - DeclBaseType(short_int_type, "short int", Signed, 2); - DeclBaseType(unsigned_int_type, "unsigned int", Unsigned, 4); - DeclBaseType(int_type, "int", Signed, 4); - DeclBaseType(long_int_type, "long int", Signed, 8); - DeclBaseType(long_unsigned_int_type, "long unsigned int", Unsigned, 8); - DeclBaseType(long_long_int_type, "long long int", Signed, 8); - DeclBaseType(long_long_unsigned_int, "long long unsigned int", Unsigned, 8); - DeclBaseType(float_type, "float", Float, 4); - DeclBaseType(double_type, "double", Float, 8); - DeclBaseType(long_double_type, "long double", Float, 16); - DeclBaseType(int128_type, "__int128", Signed, 16); - DeclBaseType(uint128_type, "__int128 unsigned", Unsigned, 16); - DeclBaseType(float16_type, "_Float16", Float, 2); - DeclBaseType(bfloat16_type, "__bf16", Float, 2); - DeclBaseType(float80_type, "__float80", Float, 16); - DeclBaseType(float128_type, "_float128", Float, 16); - DeclBaseType(complex_float_type, "complex float", ComplexFloat, 8); - DeclBaseType(complex_doulbe_type, "complex double", ComplexFloat, 16); - DeclBaseType(complex_long_double_type, "complex long double", ComplexFloat, 32); - DeclBaseType(decimal32_type, "_Decimal32", DecimalFloat, 4); - DeclBaseType(decimal64_type, "_Decimal64", DecimalFloat, 8); - DeclBaseType(decimal128_type, "_Decimal128", DecimalFloat, 16); +DW_WriterTag *tt = dw_writer_tag_begin(writer, DW_TagKind_BaseType); \ +dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, s); \ +dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_##e); \ +dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ +dw_writer_tag_end(writer); + DeclBaseType(char_type, "char", SignedChar, 1); + DeclBaseType(unsigned_char_type, "unsigned char", UnsignedChar, 1); + DeclBaseType(char8_type, "char8_t", Utf, 1); + DeclBaseType(char16_type, "char16_t", Utf, 2); + DeclBaseType(char32_type, "char32_t", Utf, 4); + DeclBaseType(wchar_type, "wchar_t", Signed, 4); + DeclBaseType(bool_type, "_Bool", Boolean, 1); + DeclBaseType(short_type, "short", Signed, 2); + DeclBaseType(unsigned_short_type, "unsigned short", Unsigned, 2); + DeclBaseType(short_unsigned_int_type, "short unsigned int", Unsigned, 2); + DeclBaseType(short_int_type, "short int", Signed, 2); + DeclBaseType(unsigned_int_type, "unsigned int", Unsigned, 4); + DeclBaseType(int_type, "int", Signed, 4); + DeclBaseType(long_int_type, "long int", Signed, 8); + DeclBaseType(long_unsigned_int_type, "long unsigned int", Unsigned, 8); + DeclBaseType(long_long_int_type, "long long int", Signed, 8); + DeclBaseType(long_long_unsigned_int, "long long unsigned int", Unsigned, 8); + DeclBaseType(float_type, "float", Float, 4); + DeclBaseType(double_type, "double", Float, 8); + DeclBaseType(long_double_type, "long double", Float, 16); + DeclBaseType(int128_type, "__int128", Signed, 16); + DeclBaseType(uint128_type, "__int128 unsigned", Unsigned, 16); + DeclBaseType(float16_type, "_Float16", Float, 2); + DeclBaseType(bfloat16_type, "__bf16", Float, 2); + DeclBaseType(float80_type, "__float80", Float, 16); + DeclBaseType(float128_type, "_float128", Float, 16); + DeclBaseType(complex_float_type, "complex float", ComplexFloat, 8); + DeclBaseType(complex_doulbe_type, "complex double", ComplexFloat, 16); + DeclBaseType(complex_long_double_type, "complex long double", ComplexFloat, 32); + DeclBaseType(decimal32_type, "_Decimal32", DecimalFloat, 4); + DeclBaseType(decimal64_type, "_Decimal64", DecimalFloat, 8); + DeclBaseType(decimal128_type, "_Decimal128", DecimalFloat, 16); #undef DeclBaseType - + #define DeclStdint(n, a) \ - do { \ - dw_writer_tag_begin(writer, DW_TagKind_Typedef); \ - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, a); \ - dw_writer_tag_end(writer); \ - } while (0) - DeclStdint("uint8_t", unsigned_char_type); - DeclStdint("uint16_t", unsigned_short_type); - DeclStdint("uint32_t", unsigned_int_type); - DeclStdint("uint64_t", long_unsigned_int_type); - DeclStdint("int8_t", char_type); - DeclStdint("int16_t", short_type); - DeclStdint("int32_t", int_type); - DeclStdint("int64_t", long_int_type); +do { \ +dw_writer_tag_begin(writer, DW_TagKind_Typedef); \ +dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ +dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, a); \ +dw_writer_tag_end(writer); \ +} while (0) + DeclStdint("uint8_t", unsigned_char_type); + DeclStdint("uint16_t", unsigned_short_type); + DeclStdint("uint32_t", unsigned_int_type); + DeclStdint("uint64_t", long_unsigned_int_type); + DeclStdint("int8_t", char_type); + DeclStdint("int16_t", short_type); + DeclStdint("int32_t", int_type); + DeclStdint("int64_t", long_int_type); #undef DeclStdInt - // TODO: @native_vector_support - // - // typedef int __attribute__((vector_size(32))) int256 - // typedef unsigned int __attribute__((vector_size(32))) uint256 - // typedef int __attribute__((vector_size(64))) int512 - // typedef unsigned int __attribute__((vector_size(64))) uint512 - // + // TODO: @native_vector_support + // + // typedef int __attribute__((vector_size(32))) int256 + // typedef unsigned int __attribute__((vector_size(32))) uint256 + // typedef int __attribute__((vector_size(64))) int512 + // typedef unsigned int __attribute__((vector_size(64))) uint512 + // #if 0 - dw_writer_tag_begin(writer, DW_TagKind_ArrayType); - dw_writer_push_attrib_flag(writer, DW_AttribKind_GNU_Vector, 1); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, int_type); - dw_writer_tag_begin(writer, DW_TagKind_SubrangeType); - dw_writer_push_attrib_uint(writer, DW_AttribKind_UpperBound, 15); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); + dw_writer_tag_begin(writer, DW_TagKind_ArrayType); + dw_writer_push_attrib_flag(writer, DW_AttribKind_GNU_Vector, 1); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, int_type); + dw_writer_tag_begin(writer, DW_TagKind_SubrangeType); + dw_writer_push_attrib_uint(writer, DW_AttribKind_UpperBound, 15); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); #endif - + dw_writer_tag_end(writer); } - + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); RDI_NameMap *types_nm = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); T_Ok(types_nm); - + RDI_ParsedNameMap types_map = {0}; rdi_parsed_from_name_map(rdi, types_nm, &types_map); - + #define TestBuiltinType(n, bs, r) \ - do { \ - RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ - T_Ok(alias); \ - T_Ok(alias->kind == RDI_TypeKind_Alias); \ - T_Ok(alias->flags == 0); \ - T_Ok(alias->byte_size == bs); \ - RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, alias->user_defined.direct_type_idx); \ - T_Ok(type); \ - T_Ok(type->kind == RDI_TypeKind_##r); \ - T_Ok(type->flags == 0); \ - T_Ok(type->byte_size == alias->byte_size); \ - T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8_lit(Stringify(r)), 0)); \ - } while (0) +do { \ +RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ +T_Ok(alias); \ +T_Ok(alias->kind == RDI_TypeKind_Alias); \ +T_Ok(alias->flags == 0); \ +T_Ok(alias->byte_size == bs); \ +RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, alias->user_defined.direct_type_idx); \ +T_Ok(type); \ +T_Ok(type->kind == RDI_TypeKind_##r); \ +T_Ok(type->flags == 0); \ +T_Ok(type->byte_size == alias->byte_size); \ +T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8_lit(Stringify(r)), 0)); \ +} while (0) TestBuiltinType("char", 1, Char8); TestBuiltinType("char8_t", 1, UChar8); TestBuiltinType("char16_t", 2, UChar16); @@ -193,21 +193,21 @@ T_BeginTest(d2r_types) TestBuiltinType("_Decimal64", 8, Decimal64); TestBuiltinType("_Decimal128", 16, Decimal128); #undef TestBuiltinType - + #define TestStdint(n, s, t) \ - do { \ - RDI_TypeNode *td = d2rt_type_from_name(rdi, &types_map, n); \ - T_Ok(td); \ - T_Ok(td->kind == RDI_TypeKind_Alias); \ - T_Ok(td->flags == 0); \ - T_Ok(td->byte_size == s); \ - RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, td->user_defined.direct_type_idx); \ - T_Ok(type); \ - T_Ok(type->kind == RDI_TypeKind_Alias); \ - T_Ok(type->flags == 0); \ - T_Ok(type->byte_size = td->byte_size); \ - T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8_lit(t), 0)); \ - } while (0) +do { \ +RDI_TypeNode *td = d2rt_type_from_name(rdi, &types_map, n); \ +T_Ok(td); \ +T_Ok(td->kind == RDI_TypeKind_Alias); \ +T_Ok(td->flags == 0); \ +T_Ok(td->byte_size == s); \ +RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, td->user_defined.direct_type_idx); \ +T_Ok(type); \ +T_Ok(type->kind == RDI_TypeKind_Alias); \ +T_Ok(type->flags == 0); \ +T_Ok(type->byte_size = td->byte_size); \ +T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8_lit(t), 0)); \ +} while (0) TestStdint("uint8_t", 1, "unsigned char"); TestStdint("uint16_t", 2, "unsigned short"); TestStdint("uint32_t", 4, "unsigned int"); @@ -217,7 +217,7 @@ T_BeginTest(d2r_types) TestStdint("int32_t", 4, "int"); TestStdint("int64_t", 8, "long int"); #undef TestStdint - + dw_writer_end(&writer); } T_EndTest; @@ -227,10 +227,10 @@ T_BeginTest(d2r_line_table) DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); String8 comp_dir = str8_lit("c:/DEVEL/"); String8 comp_name = str8_lit("test.c"); - + DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/C/Devel/foo.c")); DW_WriterFile *comp_file = dw_writer_new_file(writer, str8f(scratch.arena, "%S%S", comp_dir, comp_name)); - + struct { DW_WriterFile *file; U64 ln; U64 line_size; U64 voff; } test_table[] = { @@ -243,7 +243,7 @@ T_BeginTest(d2r_line_table) { foo_file, 100, 1 }, { comp_file, max_U32 - 0x100, 10 }, }; - + U64 exe_base = coff_default_exe_base_from_machine(COFF_MachineType_X64); U64 voff = 0x1000; for EachElement(i, test_table) { @@ -251,25 +251,25 @@ T_BeginTest(d2r_line_table) dw_writer_line_emit(writer, test_table[i].file, test_table[i].ln, 0, exe_base + voff); voff += test_table[i].line_size; } - + // emit one past last line dw_writer_line_emit(writer, test_table[ArrayCount(test_table) - 1].file, test_table[ArrayCount(test_table) - 1].ln, 0, exe_base + voff); - + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, exe_base); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, exe_base + voff); - dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, exe_base); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, exe_base + voff); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); dw_writer_tag_end(writer); - + d2r_rdi_from_dwarf_writer(scratch.arena, writer); - + for EachElement(i, test_table) { for EachIndex(k, test_table[i].line_size) { String8 cmd_line = str8f(scratch.arena, "-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); @@ -279,7 +279,7 @@ T_BeginTest(d2r_line_table) T_MatchLinef(&output, "%S:%llu", test_table[i].file->path, test_table[i].ln); } } - + dw_writer_end(&writer); } T_EndTest; @@ -287,35 +287,35 @@ T_EndTest; T_BeginTest(d2r_checksums) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - + DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/c/devel/foo.c")); DW_WriterFile *comp_file = dw_writer_new_file(writer, str8_lit("/home/main.c")); foo_file->md5 = *(U128 *)&(U8[16]){ 0x04, 0x70, 0xe9, 0x6b, 0xa3, 0x05, 0x2c, 0xc8, 0x2d, 0x70, 0xc5, 0xe9, 0x80, 0x8e, 0x8a, 0x4e, }; comp_file->md5 = *(U128 *)&(U8[16]){ 0x82, 0x3c, 0xc6, 0x02, 0x82, 0x9e, 0xf6, 0xce, 0x53, 0xff, 0x5a, 0x93, 0xb6, 0x6e, 0x59, 0x38 }; comp_file->time_stamp = 123; // convert must pick MD5 checksum over time stamp - + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, str8_chop_last_slash(comp_file->path)); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_skip_last_slash(comp_file->path)); - dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, str8_chop_last_slash(comp_file->path)); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_skip_last_slash(comp_file->path)); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); dw_writer_tag_end(writer); - + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); U64 checksum_count = 0; RDI_MD5 *checksums = rdi_table_from_name(rdi, MD5Checksums, &checksum_count); T_Ok(checksum_count == writer->line.file_count + 1); - - RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, foo_file->path.cstr); + + RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)foo_file->path.str); T_Ok(foo_src_file); T_Ok(foo_src_file->checksum_kind == RDI_ChecksumKind_MD5); T_Ok(MemoryMatch(&foo_file->md5, &checksums[foo_src_file->checksum_idx], sizeof(U128))); - - RDI_SourceFile *comp_src_file = rdi_source_file_from_normal_path_cstr(rdi, comp_file->path.cstr); + + RDI_SourceFile *comp_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)comp_file->path.str); T_Ok(comp_src_file); T_Ok(comp_src_file->checksum_kind == RDI_ChecksumKind_MD5); T_Ok(MemoryMatch(&comp_file->md5, &checksums[comp_src_file->checksum_idx], sizeof(U128))); - + dw_writer_end(&writer); } T_EndTest; @@ -324,7 +324,7 @@ T_EndTest; T_BeginTest(d2r_subprogram) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - + U64 image_lo = coff_default_exe_base_from_machine(COFF_MachineType_X64); U64 image_hi = image_lo + 0x10000; U64 subprogram_lo = image_lo + 0x1000; @@ -332,111 +332,111 @@ T_BeginTest(d2r_subprogram) U64 subprogram_entry_addr = subprogram_lo + 5; String8 subprogram_link_name = str8_lit("@FOOBAR!"); String8 subprogram_name = str8_lit("foobar"); - + dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string (writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, image_lo); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, image_hi); - - DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); - dw_writer_push_attrib_sint (writer, DW_AttribKind_ByteSize, 1); - dw_writer_push_attrib_sint (writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); - dw_writer_tag_end(writer); - - DW_WriterTag *char_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); - dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 8); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, char_type); - dw_writer_tag_end(writer); - - DW_WriterTag *int_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); - dw_writer_push_attrib_sint (writer, DW_AttribKind_ByteSize, 4); - dw_writer_push_attrib_sint (writer, DW_AttribKind_Encoding, DW_ATE_Signed); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "int"); - dw_writer_tag_end(writer); - - DW_WriterTag *int_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); - dw_writer_push_attrib_uint(writer, DW_AttribKind_ByteSize, 8); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_type); - dw_writer_tag_end(writer); - - dw_writer_tag_begin(writer, DW_TagKind_SubProgram); - dw_writer_push_attrib_enum (writer, DW_AttribKind_Accessibility, DW_AccessKind_Private); - dw_writer_push_attrib_enum (writer, DW_AttribKind_AddressClass, DW_AddrClassKind_None); - dw_writer_push_attrib_uint (writer, DW_AttribKind_Alignment, 32); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Artificial, 1); - dw_writer_push_attrib_enum (writer, DW_AttribKind_CallingConvention, DW_CallingConventionKind_Program); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Deleted, 1); - dw_writer_push_attrib_address(writer, DW_AttribKind_EntryPc, subprogram_entry_addr); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Explicit, 1); - dw_writer_push_attrib_flag (writer, DW_AttribKind_External, 1); - dw_writer_push_attrib_exprv (writer, DW_AttribKind_FrameBase, DW_ExprEnc_Op(Reg7)); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, subprogram_hi); - dw_writer_push_attrib_enum (writer, DW_AttribKind_Inline, DW_Inl_DeclaredNotInlined); - dw_writer_push_attrib_string (writer, DW_AttribKind_LinkageName, subprogram_link_name); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, subprogram_lo); - dw_writer_push_attrib_flag (writer, DW_AttribKind_MainSubProgram, 1); - dw_writer_push_attrib_string (writer, DW_AttribKind_Name, subprogram_name); - dw_writer_push_attrib_flag (writer, DW_AttribKind_NoReturn, 1); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Prototyped, 1); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Pure, 1); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Recursive, 1); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_type); - dw_writer_push_attrib_enum (writer, DW_AttribKind_Visibility, DW_Vis_Local); - // TODO: DW_AttribKind_ObjectPointer - // TODO: DW_AttribKind_Ranges - // TODO: DW_AttribKind_StartScope - dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "a"); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); - dw_writer_push_attrib_exprv (writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg2)); // rcx - dw_writer_tag_end(writer); - - dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "b"); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, char_ptr_type); - dw_writer_push_attrib_exprv (writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg5)); // rdi - dw_writer_tag_end(writer); - - dw_writer_tag_begin(writer, DW_TagKind_UnspecifiedParameters); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); - - // -------------------------------------------------------------------------------- - - DW_WriterTag *my_struct_type = dw_writer_tag_reserve(writer, DW_TagKind_StructureType); - - DW_WriterTag *const_my_struct_type = dw_writer_tag_begin(writer, DW_TagKind_ConstType); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_type); - dw_writer_tag_end(writer); - - DW_WriterTag *my_struct_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, const_my_struct_type); - dw_writer_tag_end(writer); - - dw_writer_tag_begin_reserved(writer, my_struct_type); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyStructure"); - dw_writer_push_attrib_uint (writer, DW_AttribKind_ByteSize, 0x100); - - dw_writer_tag_begin(writer, DW_TagKind_SubProgram); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyMethod"); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); - - dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_ptr_type); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); - - // -------------------------------------------------------------------------------- - + dw_writer_push_attrib_string (writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, image_lo); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, image_hi); + + DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint (writer, DW_AttribKind_ByteSize, 1); + dw_writer_push_attrib_sint (writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); dw_writer_tag_end(writer); - + + DW_WriterTag *char_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); + dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 8); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, char_type); + dw_writer_tag_end(writer); + + DW_WriterTag *int_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint (writer, DW_AttribKind_ByteSize, 4); + dw_writer_push_attrib_sint (writer, DW_AttribKind_Encoding, DW_ATE_Signed); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "int"); + dw_writer_tag_end(writer); + + DW_WriterTag *int_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); + dw_writer_push_attrib_uint(writer, DW_AttribKind_ByteSize, 8); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_type); + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_enum (writer, DW_AttribKind_Accessibility, DW_AccessKind_Private); + dw_writer_push_attrib_enum (writer, DW_AttribKind_AddressClass, DW_AddrClassKind_None); + dw_writer_push_attrib_uint (writer, DW_AttribKind_Alignment, 32); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Artificial, 1); + dw_writer_push_attrib_enum (writer, DW_AttribKind_CallingConvention, DW_CallingConventionKind_Program); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Deleted, 1); + dw_writer_push_attrib_address(writer, DW_AttribKind_EntryPc, subprogram_entry_addr); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Explicit, 1); + dw_writer_push_attrib_flag (writer, DW_AttribKind_External, 1); + dw_writer_push_attrib_exprv (writer, DW_AttribKind_FrameBase, DW_ExprEnc_Op(Reg7)); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, subprogram_hi); + dw_writer_push_attrib_enum (writer, DW_AttribKind_Inline, DW_Inl_DeclaredNotInlined); + dw_writer_push_attrib_string (writer, DW_AttribKind_LinkageName, subprogram_link_name); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, subprogram_lo); + dw_writer_push_attrib_flag (writer, DW_AttribKind_MainSubProgram, 1); + dw_writer_push_attrib_string (writer, DW_AttribKind_Name, subprogram_name); + dw_writer_push_attrib_flag (writer, DW_AttribKind_NoReturn, 1); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Prototyped, 1); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Pure, 1); + dw_writer_push_attrib_flag (writer, DW_AttribKind_Recursive, 1); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_type); + dw_writer_push_attrib_enum (writer, DW_AttribKind_Visibility, DW_Vis_Local); + // TODO: DW_AttribKind_ObjectPointer + // TODO: DW_AttribKind_Ranges + // TODO: DW_AttribKind_StartScope + dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "a"); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); + dw_writer_push_attrib_exprv (writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg2)); // rcx + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "b"); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, char_ptr_type); + dw_writer_push_attrib_exprv (writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg5)); // rdi + dw_writer_tag_end(writer); + + dw_writer_tag_begin(writer, DW_TagKind_UnspecifiedParameters); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); + + // -------------------------------------------------------------------------------- + + DW_WriterTag *my_struct_type = dw_writer_tag_reserve(writer, DW_TagKind_StructureType); + + DW_WriterTag *const_my_struct_type = dw_writer_tag_begin(writer, DW_TagKind_ConstType); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_type); + dw_writer_tag_end(writer); + + DW_WriterTag *my_struct_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, const_my_struct_type); + dw_writer_tag_end(writer); + + dw_writer_tag_begin_reserved(writer, my_struct_type); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyStructure"); + dw_writer_push_attrib_uint (writer, DW_AttribKind_ByteSize, 0x100); + + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyMethod"); + dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); + + dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_ptr_type); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); + + // -------------------------------------------------------------------------------- + + dw_writer_tag_end(writer); + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); - RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, subprogram_name.cstr); + RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, (char *)subprogram_name.str); RDI_TypeNode *proc_type = rdi_element_from_name_idx(rdi, TypeNodes, proc->type_idx); String8 proc_string = rdi_string_from_type(scratch.arena, rdi, proc, proc_type); - + dw_writer_end(&writer); } T_EndTest; @@ -448,53 +448,53 @@ T_BeginTest(d2r_general) { dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); - // declare char type - DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); - dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); - dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); - dw_writer_tag_end(writer); - // declare function - dw_writer_tag_begin(writer, DW_TagKind_SubProgram); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140173f9); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x14017474b); - dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); - dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "FooBar"); - // declare variable - dw_writer_tag_begin(writer, DW_TagKind_Variable); - dw_writer_push_attrib_exprv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestLocal"); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); + // declare char type + DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); + dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); + dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); + dw_writer_tag_end(writer); + // declare function + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); + dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140173f9); + dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x14017474b); + dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); + dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "FooBar"); + // declare variable + dw_writer_tag_begin(writer, DW_TagKind_Variable); + dw_writer_push_attrib_exprv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestLocal"); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); + dw_writer_tag_end(writer); + dw_writer_tag_end(writer); } - + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); - + RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, "FooBar"); T_Ok(proc); T_Ok(proc->link_flags == RDI_LinkFlag_External); String8 proc_name = str8_from_rdi_string_idx(rdi, proc->name_string_idx); T_Ok(str8_match(proc_name, str8_lit("FooBar"), 0)); - + RDI_Scope *root_scope = rdi_root_scope_from_procedure(rdi, proc); T_Ok(root_scope); T_Ok(root_scope->local_count == 1); - + RDI_Local *test_local = rdi_element_from_name_idx(rdi, Locals, root_scope->local_first + 0); T_Ok(test_local); T_Ok(test_local->kind == RDI_LocalKind_Variable); String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); T_Ok(str8_match(test_local_name, str8_lit("TestLocal"), 0)); - + RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); T_Ok(test_local_type); T_Ok(test_local_type->kind == RDI_TypeKind_Alias); T_Ok(test_local_type->flags == 0); String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); T_Ok(str8_match(alias_name, str8_lit("char"), 0)); - + RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); T_Ok(char_type); T_Ok(char_type->kind == RDI_TypeKind_Char8); @@ -502,7 +502,7 @@ T_BeginTest(d2r_general) T_Ok(char_type->byte_size == 1); String8 char_type_name = str8_from_rdi_string_idx(rdi, char_type->built_in.name_string_idx); T_Ok(str8_match(char_type_name, str8_lit("Char8"), 0)); - + dw_writer_end(&writer); } T_EndTest; diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 98d92b25..728cbb58 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -8,18 +8,18 @@ t_dw_test_uleb128(U64 v, U64 expected_length) { Temp scratch = scratch_begin(0, 0); B32 is_ok = 0; - + U64 v0 = v; String8 e = dw_write_uleb128(scratch.arena, v0); if (!(expected_length == e.size)) { goto exit; } - + U64 v1; U64 bytes_read = str8_deserial_read_uleb128(e, 0, &v1); if (!(bytes_read == e.size)) { goto exit; } if (!(v0 == v1)) { goto exit; } - + is_ok = 1; -exit:; + exit:; scratch_end(scratch); return is_ok; } @@ -29,18 +29,18 @@ t_dw_test_sleb128(U64 v, U64 expected_length) { Temp scratch = scratch_begin(0,0); B32 is_ok = 0; - + U64 v0 = v; String8 e = dw_write_sleb128(scratch.arena, v0); if (!(expected_length == e.size)) { goto exit; } - + S64 v1; U64 bytes_read = str8_deserial_read_sleb128(e, 0, &v1); if (!(bytes_read == e.size)) { goto exit; } if (!(v0 == v1)) { goto exit; } - + is_ok = 1; -exit:; + exit:; scratch_end(scratch); return is_ok; } @@ -50,13 +50,13 @@ T_BeginTest(test_leb128) T_Ok(t_dw_test_uleb128(0, 1)); T_Ok(t_dw_test_sleb128(0, 1)); T_Ok(t_dw_test_sleb128(-1, 1)); - + T_Ok(t_dw_test_uleb128(max_U64, 10)); T_Ok(t_dw_test_sleb128(min_S64, 10)); T_Ok(t_dw_test_sleb128(max_S64, 10)); - + T_Ok(t_dw_test_uleb128(0xDEADBEEFCAFEBABE, 10)); - + for EachIndex(i, 64) { T_Ok(t_dw_test_uleb128((1ull << i), 1 + (i / 7))); } @@ -70,7 +70,7 @@ internal B32 dwt_tags_must_match(DW_WriterTag *writer_tag, DW_TagNode *reader_tag) { B32 is_match = 0; - + // match headers B32 writer_has_children = writer_tag->first_child != 0; if (writer_tag->kind != reader_tag->tag.kind) { goto exit; } @@ -78,7 +78,7 @@ dwt_tags_must_match(DW_WriterTag *writer_tag, DW_TagNode *reader_tag) if (writer_tag->attrib_count != reader_tag->tag.attribs.count) { goto exit; } if (writer_tag->info_off != reader_tag->tag.info_off) { goto exit; } if (writer_has_children != reader_tag->tag.has_children) { goto exit; } - + // match attribs DW_WriterAttrib *writer_attrib = writer_tag->first_attrib; DW_AttribNode *reader_attrib = reader_tag->tag.attribs.first; @@ -89,7 +89,7 @@ dwt_tags_must_match(DW_WriterTag *writer_tag, DW_TagNode *reader_tag) writer_attrib = writer_attrib->next; reader_attrib = reader_attrib->next; } - + // visit children DW_WriterTag *writer_child = writer_tag->first_child; DW_TagNode *reader_child = reader_tag->first_child; @@ -98,9 +98,9 @@ dwt_tags_must_match(DW_WriterTag *writer_tag, DW_TagNode *reader_tag) writer_child = writer_child->next; reader_child = reader_child->sibling; } - + is_match = 1; -exit:; + exit:; return is_match; } @@ -108,7 +108,7 @@ internal DW_Input dw_input_from_writer(Arena *arena, DW_Writer *writer) { Temp scratch = scratch_begin(&arena, 1); - + OBJ *obj = obj_alloc(0, Arch_x64); OBJ_Section *text_section = obj_push_section(obj, str8_lit(".text"), OBJ_SectionFlag_Read|OBJ_SectionFlag_Exec|OBJ_SectionFlag_Load); str8_serial_push_u8(obj->arena, &text_section->data, 0x90); @@ -116,20 +116,20 @@ dw_input_from_writer(Arena *arena, DW_Writer *writer) str8_serial_push_u8(obj->arena, &text_section->data, 0x90); str8_serial_push_u8(obj->arena, &text_section->data, 0xc3); obj_push_symbol(obj, str8_lit("entry"), OBJ_SymbolScope_Global, OBJ_RefKind_Section, text_section); - + dw_writer_emit_to_obj(writer, obj); String8 raw_coff = coff_from_obj(scratch.arena, obj); - + t_write_file(str8_lit("dwarf.obj"), raw_coff); t_invoke(str8_lit("radlink"), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full dwarf.obj"), max_U64); os_delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); - + String8 exe = t_read_file(arena, str8_lit("a.exe")); PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)(exe.str + pe.section_table_range.min); String8 string_table = str8_substr(exe, pe.string_table_range); DW_Input input = dw_input_from_coff_section_table(arena, exe, string_table, pe.section_count, section_table); - + obj_release(&obj); scratch_end(scratch); return input; @@ -139,27 +139,27 @@ T_BeginTest(dwarf_32bit) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); dw_writer_tag_end(writer); - + DW_Input input = dw_input_from_writer(scratch.arena, writer); - + for EachElement(sec_idx, input.sec) { if (sec_idx == DW_Section_Abbrev) continue; Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[sec_idx].data); for EachIndex(range_idx, unit_ranges.count) { Rng1U64 range = unit_ranges.v[range_idx]; - + U32 first_four_bytes = 0; T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &first_four_bytes) == sizeof(first_four_bytes)); T_Ok(first_four_bytes + 4 == dim_1u64(range)); - + U32 unit_length = 0; T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &unit_length) == sizeof(U32)); T_Ok(unit_length + 4 == dim_1u64(range)); } } - + dw_writer_end(&writer); } T_EndTest; @@ -170,25 +170,25 @@ T_BeginTest(dwarf_64bit) dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); dw_writer_tag_end(writer); - + DW_Input input = dw_input_from_writer(scratch.arena, writer); - + for EachElement(sec_idx, input.sec) { if (sec_idx == DW_Section_Abbrev) continue; Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[sec_idx].data); for EachIndex(range_idx, unit_ranges.count) { Rng1U64 range = unit_ranges.v[range_idx]; - + U32 first_four_bytes = 0; T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &first_four_bytes) == sizeof(first_four_bytes)); T_Ok(first_four_bytes == max_U32); - + U64 unit_length = 0; T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min + sizeof(U32), &unit_length) == sizeof(U64)); T_Ok(unit_length + 12 == dim_1u64(range)); } } - + dw_writer_end(&writer); } T_EndTest; @@ -200,12 +200,12 @@ T_BeginTest(dwarf_line_opcodes) String8 comp_name = str8_lit("test.c"); U64 address = 0xDEADBEEFCAFEBABE; dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); - dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); dw_writer_tag_end(writer); - + // test directory table and file table DW_WriterFile *file2 = dw_writer_new_file(writer, str8_lit("d:/foobar/qwe.c")); file2->time_stamp = 123; @@ -217,7 +217,7 @@ T_BeginTest(dwarf_line_opcodes) file->size = 314; file->md5 = *(U128 *)&((U8[sizeof(U128)]) { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, }); file->source = str8_lit("int main() { return 057; }\n"); - + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_copy()); dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_pc(7)); dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_pc(-7)); @@ -237,32 +237,32 @@ T_BeginTest(dwarf_line_opcodes) dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_address(address)); dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_discriminator(2)); dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_end_sequence()); - + DW_Input input = dw_input_from_writer(scratch.arena, writer); Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[DW_Section_Info].data); DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); - + T_Ok(line_vm->header.dir_table.count == 2); T_Ok(line_vm->header.file_table.count == 2); - + T_Ok(str8_match(line_vm->header.dir_table.v[0], str8_lit("c:/devel"), 0)); T_Ok(str8_match(line_vm->header.dir_table.v[1], str8_lit("d:/foobar"), 0)); - + DW_LineFile *file_reader = &line_vm->header.file_table.v[0]; T_Ok(str8_match(file_reader->path, comp_name, 0)); T_Ok(file_reader->dir_idx == 0); T_Ok(file_reader->time_stamp == file->time_stamp); T_Ok(u128_match(file_reader->md5, file->md5)); T_Ok(str8_match(file_reader->source, file->source, 0)); - + DW_LineFile *file2_reader = &line_vm->header.file_table.v[1]; T_Ok(str8_match(file2_reader->path, str8_lit("qwe.c"), 0)); T_Ok(file2_reader->dir_idx == 1); T_Ok(file2_reader->time_stamp == file2->time_stamp); T_Ok(u128_match(file2_reader->md5, file2->md5)); T_Ok(str8_match(file2_reader->source, file2->source, 0)); - + T_Ok(line_vm->new_line == 0); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_Copy); @@ -271,48 +271,48 @@ T_BeginTest(dwarf_line_opcodes) T_Ok(line_vm->state.basic_block == 0); T_Ok(line_vm->state.prologue_end == 0); T_Ok(line_vm->state.epilogue_begin == 0); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); T_Ok(line_vm->state.address == 7); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); T_Ok(line_vm->state.address == 0); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); T_Ok(line_vm->state.line == 5); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); T_Ok(line_vm->state.line == 1); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_SetFile); T_Ok(line_vm->state.file_index == 0); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_SetColumn); T_Ok(line_vm->state.column == max_U64); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_SetColumn); T_Ok(line_vm->state.column == 0); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_NegateStmt); T_Ok(line_vm->state.is_stmt == 0); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_NegateStmt); T_Ok(line_vm->state.is_stmt == 1); - + T_Ok(line_vm->state.basic_block == 0); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_SetBasicBlock); T_Ok(line_vm->state.basic_block == 1); - + { U64 addr_before = line_vm->state.address; U64 const_advance = (0xffu - line_vm->header.opcode_base) / line_vm->header.line_range; @@ -320,45 +320,45 @@ T_BeginTest(dwarf_line_opcodes) T_Ok(!line_vm->new_line); T_Ok(line_vm->state.address == addr_before + const_advance); } - + T_Ok(line_vm->state.address == 0x11); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_FixedAdvancePc); T_Ok(line_vm->state.address == max_U16 + 0x11); - + T_Ok(line_vm->state.prologue_end == 0); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_SetPrologueEnd); T_Ok(line_vm->state.prologue_end == 1); - + T_Ok(line_vm->state.epilogue_begin == 0); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_SetEpilogueBegin); T_Ok(line_vm->state.epilogue_begin == 1); - + T_Ok(line_vm->state.isa == 0); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_SetIsa); T_Ok(line_vm->state.isa == max_U64); - + T_Ok(line_vm->state.address != address); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); T_Ok(line_vm->ext_opcode == DW_ExtOpcode_SetAddress); T_Ok(line_vm->state.address == address); - + T_Ok(line_vm->state.discriminator == 0); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); T_Ok(line_vm->ext_opcode == DW_ExtOpcode_SetDiscriminator); T_Ok(line_vm->state.discriminator == 2); - + T_Ok(!line_vm->state.end_sequence); T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); T_Ok(line_vm->state.end_sequence); - + dw_writer_end(&writer); } T_EndTest; @@ -369,39 +369,39 @@ T_BeginTest(dwarf_line_emit) String8 comp_dir = str8_lit("c:/devel/"); String8 comp_name = str8_lit("test.c"); dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); - dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); + dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); + dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); + dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); + dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); dw_writer_tag_end(writer); - + // test special opcode writer and reader DW_WriterFile *file = dw_writer_new_file(writer, comp_name); - + // init sequence dw_writer_line_emit(writer, file, 10000, 0, 1000); - + for EachIndex(i, abs_s64(writer->line.line_base) + 1) { dw_writer_line_emit(writer, file, writer->line.ln-i, 0, writer->line.addr+1); - + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(i)); writer->line.ln += i; } - + // special opcode line window underflow, must emit three instructions to advance dw_writer_line_emit(writer, file, (writer->line.ln + writer->line.line_base) - 1, 0, writer->line.addr + 1); dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(-(writer->line.line_base - 1))); - + for EachIndex(i, (writer->line.line_range + writer->line.line_base) + 1) { dw_writer_line_emit(writer, file, writer->line.ln+i, 0, writer->line.addr+1); - + dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_advance_line(-i)); writer->line.ln -= i; } - + dw_writer_line_end_sequence(writer); dw_writer_line_emit(writer, file, 1000, 0, writer->line.addr+1); - + // test address window S64 c = writer->line.line_range + writer->line.line_base; U64 line_addr_count = 0; @@ -414,40 +414,40 @@ T_BeginTest(dwarf_line_emit) line_addr_count += 1; } } - + DW_Input input = dw_input_from_writer(scratch.arena, writer); Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[DW_Section_Info].data); DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); - + // check init sequence { T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_SetFile); T_Ok(line_vm->state.file_index == 0); T_Ok(line_vm->new_line == 0); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); T_Ok(line_vm->state.address == 1000); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); T_Ok(line_vm->state.line == 10000); T_Ok(line_vm->new_line == 0); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_Copy); T_Ok(line_vm->state.line == 10000); T_Ok(line_vm->state.address == 1000); T_Ok(line_vm->new_line == 1); } - + { U64 pc = line_vm->state.address; for EachIndex(i, abs_s64(writer->line.line_base) + 1) { pc += 1; - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == 0x20 - i); T_Ok(line_vm->state.line == 10000 - i); @@ -459,81 +459,81 @@ T_BeginTest(dwarf_line_emit) T_Ok(line_vm->state.line == 10000); T_Ok(line_vm->state.address == pc); } - + // line window underflow check { pc += 1; - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); T_Ok(line_vm->state.line == 10000); T_Ok(line_vm->state.address == pc); T_Ok(!line_vm->new_line); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); T_Ok(line_vm->state.line == 9994); T_Ok(line_vm->state.address == pc); T_Ok(!line_vm->new_line); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_Copy); T_Ok(line_vm->state.line == 9994); T_Ok(line_vm->state.address == pc); T_Ok(line_vm->new_line); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); T_Ok(line_vm->state.line == 10000); T_Ok(line_vm->state.address == pc); T_Ok(!line_vm->new_line); } - + for EachIndex(i, writer->line.line_range + writer->line.line_base) { pc += 1; - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == 0x20 + i); T_Ok(line_vm->state.line == 10000 + i); T_Ok(line_vm->state.address == pc); T_Ok(line_vm->new_line); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); T_Ok(line_vm->state.line == 10000); T_Ok(line_vm->state.address == pc); T_Ok(!line_vm->new_line); } - + // line window overflow check { pc += 1; - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); T_Ok(line_vm->state.line == 10000); T_Ok(line_vm->state.address == pc); T_Ok(!line_vm->new_line); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); T_Ok(line_vm->state.line == 10009); T_Ok(line_vm->state.address == pc); T_Ok(!line_vm->new_line); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_Copy); T_Ok(line_vm->state.address == pc); T_Ok(line_vm->state.line == 10009); T_Ok(line_vm->new_line); - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); T_Ok(line_vm->state.line == 10000); T_Ok(line_vm->state.address == pc); T_Ok(!line_vm->new_line); } - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); @@ -541,19 +541,19 @@ T_BeginTest(dwarf_line_emit) T_Ok(line_vm->state.address == pc); T_Ok(line_vm->new_line); } - + { T_Ok(dw_line_vm_step(line_vm)); T_Ok(dw_line_vm_step(line_vm)); T_Ok(dw_line_vm_step(line_vm)); T_Ok(dw_line_vm_step(line_vm)); - + for EachIndex(i, line_addr_count/*first line is a noop*/-1) { T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->header.opcode_base < line_vm->opcode); T_Ok(line_vm->new_line); } - + T_Ok(dw_line_vm_step(line_vm)); T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); @@ -581,18 +581,18 @@ T_BeginTest(dwarf_writer) dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("char")); dw_writer_tag_end(writer); - + dw_writer_tag_begin(writer, DW_TagKind_ConstType); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); dw_writer_tag_end(writer); - + // test abbrev dedup DW_WriterTag *dup_char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("char")); dw_writer_tag_end(writer); - + // simple struct test DW_WriterTag *simple_struct_tag = dw_writer_tag_begin(writer, DW_TagKind_StructureType); dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("FooBar")); @@ -603,7 +603,7 @@ T_BeginTest(dwarf_writer) dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); dw_writer_push_attrib_sint(writer, DW_AttribKind_DataMemberLocation, 0); dw_writer_tag_end(writer); - + dw_writer_tag_begin(writer, DW_TagKind_Member); dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_lit("m1")); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); @@ -612,7 +612,7 @@ T_BeginTest(dwarf_writer) dw_writer_tag_end(writer); } dw_writer_tag_end(writer); - + dw_writer_tag_begin(writer, DW_TagKind_SubProgram); dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); @@ -625,15 +625,15 @@ T_BeginTest(dwarf_writer) } dw_writer_tag_end(writer); } - + DW_Input input = dw_input_from_writer(scratch.arena, writer); DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, lu_input, 0, 1); DW_TagTree tag_tree = dw_tag_tree_from_cu(scratch.arena, &input, &cu); AssertAlways(dwt_tags_must_match(writer->root, tag_tree.root)); - + // validate the writer - + T_Ok(writer->current == 0); T_Ok(writer->format == DW_Format_32Bit); T_Ok(writer->cu_kind == DW_CompUnitKind_Compile); @@ -642,7 +642,7 @@ T_BeginTest(dwarf_writer) T_Ok(writer->abbrev_base_info_off == 8); T_Ok(writer->fixups.count == 0); T_Ok(writer->abbrev_id_map->count == 7); - + DW_WriterTag *comp_unit_tag = writer->root; { T_Ok(comp_unit_tag->kind == DW_TagKind_CompileUnit); @@ -651,24 +651,24 @@ T_BeginTest(dwarf_writer) T_Ok(comp_unit_tag->attrib_count == 5); T_Ok(comp_unit_tag->abbrev_id == 1); T_Ok(comp_unit_tag->info_off == 0xc); - + DW_WriterAttrib *producer_attrib = comp_unit_tag->first_attrib; T_Ok(producer_attrib->kind == DW_AttribKind_Producer); T_Ok(producer_attrib->form.reader.kind == DW_Form_String); T_Ok(str8_match(producer_attrib->form.writer.string, str8_lit("RAD DWARF WRITER"), 0)); - + DW_WriterAttrib *language_attrib = producer_attrib->next; T_Ok(language_attrib->kind == DW_AttribKind_Language); T_Ok(language_attrib->form.reader.kind == DW_Form_Data1); T_Ok(language_attrib->form.reader.data.size == 1); T_Ok(*(U8 *)language_attrib->form.reader.data.str == DW_Language_C99); - + DW_WriterAttrib *use_utf8_attrib = language_attrib->next; T_Ok(use_utf8_attrib->kind == DW_AttribKind_UseUtf8); T_Ok(use_utf8_attrib->form.reader.kind == DW_Form_Flag); T_Ok(use_utf8_attrib->form.reader.flag == 1); } - + DW_WriterTag *char_type_tag = comp_unit_tag->first_child; { T_Ok(char_type_tag->kind == DW_TagKind_BaseType); @@ -678,25 +678,25 @@ T_BeginTest(dwarf_writer) T_Ok(char_type_tag->abbrev_id == 2); T_Ok(char_type_tag->info_off == 0x30); T_Ok(char_type_tag->first_attrib != char_type_tag->last_attrib); - + DW_WriterAttrib *byte_size_attrib = char_type_tag->first_attrib; T_Ok(byte_size_attrib->kind == DW_AttribKind_ByteSize); T_Ok(byte_size_attrib->form.reader.kind == DW_Form_Data1); T_Ok(byte_size_attrib->form.reader.data.size == 1); T_Ok(*(U8 *)byte_size_attrib->form.reader.data.str == 1); - + DW_WriterAttrib *encoding_attrib = byte_size_attrib->next; T_Ok(encoding_attrib->kind == DW_AttribKind_Encoding); T_Ok(encoding_attrib->form.reader.kind == DW_Form_Data1); T_Ok(encoding_attrib->form.reader.data.size == 1); T_Ok(*(U8 *)encoding_attrib->form.reader.data.str == DW_ATE_SignedChar); - + DW_WriterAttrib *name_attrib = encoding_attrib->next; T_Ok(name_attrib->kind == DW_AttribKind_Name); T_Ok(name_attrib->form.reader.kind == DW_Form_String); T_Ok(str8_match(name_attrib->form.reader.string, str8_lit("char"), 0)); } - + DW_WriterTag *const_type_tag = char_type_tag->next; { T_Ok(const_type_tag->kind == DW_TagKind_ConstType); @@ -706,13 +706,13 @@ T_BeginTest(dwarf_writer) T_Ok(const_type_tag->abbrev_id == 3); T_Ok(const_type_tag->info_off == 0x38); T_Ok(const_type_tag->first_attrib && const_type_tag->first_attrib == const_type_tag->last_attrib); - + DW_WriterAttrib *type_attrib = const_type_tag->first_attrib; T_Ok(type_attrib->kind == DW_AttribKind_Type); T_Ok(type_attrib->form.writer.kind == DW_WriterFormKind_Ref); T_Ok(type_attrib->form.writer.ref == char_type_tag); } - + DW_WriterTag *dup_char_type_tag = const_type_tag->next; { T_Ok(dup_char_type_tag->kind == DW_TagKind_BaseType); @@ -722,25 +722,25 @@ T_BeginTest(dwarf_writer) T_Ok(dup_char_type_tag->abbrev_id == 2); T_Ok(dup_char_type_tag->info_off == 0x3a); T_Ok(dup_char_type_tag->first_attrib != dup_char_type_tag->last_attrib); - + DW_WriterAttrib *byte_size_attrib = dup_char_type_tag->first_attrib; T_Ok(byte_size_attrib->kind == DW_AttribKind_ByteSize); T_Ok(byte_size_attrib->form.reader.kind == DW_Form_Data1); T_Ok(byte_size_attrib->form.reader.data.size == 1); T_Ok(*(U8 *)byte_size_attrib->form.reader.data.str == 1); - + DW_WriterAttrib *encoding_attrib = byte_size_attrib->next; T_Ok(encoding_attrib->kind == DW_AttribKind_Encoding); T_Ok(encoding_attrib->form.reader.kind == DW_Form_Data1); T_Ok(encoding_attrib->form.reader.data.size == 1); T_Ok(*(U8 *)encoding_attrib->form.reader.data.str == DW_ATE_SignedChar); - + DW_WriterAttrib *name_attrib = encoding_attrib->next; T_Ok(name_attrib->kind == DW_AttribKind_Name); T_Ok(name_attrib->form.reader.kind == DW_Form_String); T_Ok(str8_match(name_attrib->form.reader.string, str8_lit("char"), 0)); } - + DW_WriterTag *simple_struct_tag = dup_char_type_tag->next; { T_Ok(simple_struct_tag->kind == DW_TagKind_StructureType); @@ -749,12 +749,12 @@ T_BeginTest(dwarf_writer) T_Ok(simple_struct_tag->attrib_count == 2); T_Ok(simple_struct_tag->abbrev_id == 4); T_Ok(simple_struct_tag->info_off == 0x42); - + DW_WriterAttrib *simple_struct_name = simple_struct_tag->first_attrib; T_Ok(simple_struct_name->kind == DW_AttribKind_Name); T_Ok(simple_struct_name->form.reader.kind == DW_Form_String); T_Ok(str8_match(simple_struct_name->form.reader.string, str8_lit("FooBar"), 0)); - + DW_WriterTag *m0_tag = simple_struct_tag->first_child; { T_Ok(m0_tag->kind == DW_TagKind_Member); @@ -762,24 +762,24 @@ T_BeginTest(dwarf_writer) T_Ok(m0_tag->attrib_count == 3); T_Ok(m0_tag->info_off == 0x4b); T_Ok(m0_tag->abbrev_id == 5); - + DW_WriterAttrib *name = m0_tag->first_attrib; T_Ok(name->kind == DW_AttribKind_Name); T_Ok(name->form.reader.kind == DW_Form_String); T_Ok(str8_match(name->form.reader.string, str8_lit("m0"), 0)); - + DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); T_Ok(type->form.reader.kind == DW_Form_Ref1); T_Ok(type->form.reader.ref == 0x30); - + DW_WriterAttrib *data_loc = type->next; T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); T_Ok(data_loc->form.reader.kind == DW_Form_Data1); T_Ok(data_loc->form.reader.data.size == 1); T_Ok(*(U8 *)data_loc->form.reader.data.str == 0); } - + DW_WriterTag *m1_tag = m0_tag->next; { T_Ok(m1_tag->kind == DW_TagKind_Member); @@ -787,30 +787,30 @@ T_BeginTest(dwarf_writer) T_Ok(m1_tag->attrib_count == 4); T_Ok(m1_tag->info_off == 0x51); T_Ok(m1_tag->abbrev_id == 6); - + DW_WriterAttrib *name = m1_tag->first_attrib; T_Ok(name->kind == DW_AttribKind_Name); T_Ok(name->form.reader.kind == DW_Form_String); T_Ok(str8_match(name->form.reader.string, str8_lit("m1"), 0)); - + DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); T_Ok(type->form.reader.kind == DW_Form_Ref1); T_Ok(type->form.reader.ref == 0x30); - + DW_WriterAttrib *data_loc = type->next; T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); T_Ok(data_loc->form.reader.kind == DW_Form_Data1); T_Ok(data_loc->form.reader.data.size == 1); T_Ok(*(U8 *)data_loc->form.reader.data.str == 10); - + DW_WriterAttrib *byte_size = data_loc->next; T_Ok(byte_size->kind == DW_AttribKind_ByteSize); T_Ok(byte_size->form.reader.kind == DW_Form_ImplicitConst); T_Ok(byte_size->form.reader.implicit_const == 123); } } - + DW_WriterTag *main_tag = simple_struct_tag->next; T_Ok(main_tag->next == 0); T_Ok(main_tag->kind == DW_TagKind_SubProgram); @@ -821,34 +821,34 @@ T_BeginTest(dwarf_writer) T_Ok(external->kind == DW_AttribKind_External); T_Ok(external->form.reader.kind == DW_Form_Flag); T_Ok(external->form.reader.flag); - + DW_WriterAttrib *prototyped = external->next; T_Ok(prototyped->kind == DW_AttribKind_Prototyped); T_Ok(prototyped->form.reader.kind == DW_Form_Flag); T_Ok(prototyped->form.reader.flag); - + DW_WriterAttrib *low_pc = prototyped->next; T_Ok(low_pc->kind == DW_AttribKind_LowPc); T_Ok(low_pc->form.reader.kind == DW_Form_Addr); T_Ok(low_pc->form.reader.addr.size == sizeof(U64)); T_Ok(*(U64 *)low_pc->form.reader.addr.str == 0x140001000); - + DW_WriterAttrib *high_pc = low_pc->next; T_Ok(high_pc->kind == DW_AttribKind_HighPc); T_Ok(high_pc->form.reader.kind == DW_Form_Addr); T_Ok(high_pc->form.reader.addr.size == sizeof(U64)); T_Ok(*(U64 *)high_pc->form.reader.addr.str == 0x140001004); - + DW_WriterAttrib *name = high_pc->next; T_Ok(name->kind == DW_AttribKind_Name); T_Ok(name->form.reader.kind == DW_Form_String); T_Ok(str8_match(name->form.reader.string, str8_lit("main"), 0)); - + DW_WriterAttrib *type = name->next; T_Ok(type->kind == DW_AttribKind_Type); T_Ok(type->form.reader.kind == DW_Form_Ref1); T_Ok(type->form.reader.ref == simple_struct_tag->info_off); - + DW_WriterAttrib *frame_base = type->next; T_Ok(frame_base->kind == DW_AttribKind_FrameBase); T_Ok(frame_base->form.reader.kind == DW_Form_ExprLoc); @@ -860,7 +860,7 @@ T_BeginTest(dwarf_writer) T_Ok(frame_base_expr.first->next == 0); T_Ok(frame_base_expr.first->prev == 0); } - + dw_writer_end(&writer); } T_EndTest; @@ -873,7 +873,7 @@ T_BeginTest(value_in_register) Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); U64 value = 0xc0ffee; MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); - + // compile a simple program which reads the value from register 3 DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); @@ -882,7 +882,7 @@ T_BeginTest(value_in_register) // evaluate the program DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); - + // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_U64); @@ -898,16 +898,16 @@ T_BeginTest(value_in_x_register) Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); U64 value = 0xc0ffee; MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); - + // compile a simple program which reads the value from register 3 DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(RegX), DW_ExprEnc_ULEB128(DW_RegX64_FsBase) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - + // evaluate the program DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); - + // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_U64); @@ -922,11 +922,11 @@ T_BeginTest(address_of_value) DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_U64(addr) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - + // evaluate the program DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); - + // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_Addr); @@ -942,14 +942,14 @@ T_BeginTest(register_relative_variable) Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); U64 value = 1; MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); - + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BReg11), DW_ExprEnc_SLEB128(44) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - + DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); - + // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_Addr); @@ -962,11 +962,11 @@ T_BeginTest(frame_relative_variable) DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(FBReg), DW_ExprEnc_SLEB128(-50) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - + U64 frame_base = 123; DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); - + T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_Addr); T_Ok(expr_value.addr == frame_base -50); @@ -985,20 +985,20 @@ T_BeginTest(call_by_reference) U8 *memory = push_array(scratch.arena, U8, 128); U64 value = 0xc0ffee; MemoryCopy(memory + 32, &value, sizeof(value)); - + REGS_RegBlockX64 regs = {0}; REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, 58); // fsbase Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); U64 memory_ptr = IntFromPtr(memory); MemoryCopy((U8 *)®s + reg_range.min, &memory_ptr, sizeof(memory_ptr)); - + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BRegX), DW_ExprEnc_ULEB128(58), DW_ExprEnc_SLEB128(32), DW_ExprEnc_Op(Deref) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - + DW_ExprValue expr_value = { 0 }; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, t_machine_op_mem_read, 0, &expr_value); - + T_Ok(expr_value.type == DW_ExprValueType_Generic); T_Ok(expr_value.generic.size == sizeof(U64)); T_Ok(*(U64 *)expr_value.generic.str == value); @@ -1011,10 +1011,10 @@ T_BeginTest(plus_uconst) DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_Addr(struct_addr), DW_ExprEnc_Op(PlusUConst), DW_ExprEnc_ULEB128(4) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - + DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, t_machine_op_mem_read, 0, &expr_value); - + T_Ok(expr_value.type == DW_ExprValueType_Addr); T_Ok(expr_value.addr == 0x123 + 4); } @@ -1037,11 +1037,11 @@ T_BeginTest(reg_split_spill) U64 value = 0xbbbb; MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); } - + DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(4), DW_ExprEnc_Op(Reg10), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(2) }; String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); - + DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); } From 57cbd020a12063b1b507a6cfe6aff80ed7951af9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 2 Mar 2026 11:45:19 -0800 Subject: [PATCH 268/850] debugging extras --- launch.vs.json | 28 ++++++++++++++++++++++++++++ src/natvis/raddbg.natstepfilter | 7 +++++++ 2 files changed, 35 insertions(+) create mode 100644 launch.vs.json create mode 100644 src/natvis/raddbg.natstepfilter diff --git a/launch.vs.json b/launch.vs.json new file mode 100644 index 00000000..f92b78e1 --- /dev/null +++ b/launch.vs.json @@ -0,0 +1,28 @@ +{ + "version": "0.2.1", + "defaults": {}, + "configurations": [ + { + "type": "cppdbg", + "name": "raddbg", + "request": "launch", + "project": "c://windows//system32//cmd.exe", + "program": "build/raddbg", + "args": [ "-no_stdout_buffer" ], + "stopAtEntry": false, + "cwd": ".", + "environment": [], + "externalConsole": true, + "pipeTransport": { + "pipeCwd": "${workspaceRoot}", + "pipeProgram": "wsl", + "pipeArgs": [ "${debuggerCommand}" ] + }, + "setupCommands": + [ + { "text": "handle SIGUSR1 nostop" } + ], + "MIMode": "gdb" + } + ] +} diff --git a/src/natvis/raddbg.natstepfilter b/src/natvis/raddbg.natstepfilter new file mode 100644 index 00000000..585fdbdc --- /dev/null +++ b/src/natvis/raddbg.natstepfilter @@ -0,0 +1,7 @@ + + + + __asan_memcpy + NoStepInto + + From e9a2f36b23b7e6479ee0fc7182107f431746dd14 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 4 Mar 2026 11:27:06 -0800 Subject: [PATCH 269/850] switch to internal debug mode detection macro for the element size check in radsort --- build.bat | 4 ++-- src/mule/mule_main.cpp | 5 +++++ src/third_party/radsort/radsort.h | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/build.bat b/build.bat index 94711724..67c197d3 100644 --- a/build.bat +++ b/build.bat @@ -69,8 +69,8 @@ if "%pgo%"=="1" ( :: --- Compile/Link Line Definitions ------------------------------------------ set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /Zc:preprocessor -set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 /D_DEBUG %cl_common% %auto_compile_flags% -set cl_release= call cl /O2 /DBUILD_DEBUG=0 /DNDEBUG %cl_common% %auto_compile_flags% +set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% +set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" /noexp /nocoffgrpinfo /opt:ref /opt:icf set cl_out= /out: set cl_linker= diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 42204d0e..2d63ea6f 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -6,6 +6,11 @@ ** stepping, breakpoints, evaluation, cross-module calls. */ +#if COMPILER_MSVC && _DEBUG +#pragma comment(linker, "/nodefaultlib:libcmt") +#pragma comment(lib, "libcmtd") +#endif + #include #include #include diff --git a/src/third_party/radsort/radsort.h b/src/third_party/radsort/radsort.h index 752193e8..b1a48fdf 100644 --- a/src/third_party/radsort/radsort.h +++ b/src/third_party/radsort/radsort.h @@ -438,7 +438,7 @@ RSFORCEINLINE void radsortinternal( void * start, size_t len, size_t element_siz if ( len <= 1 ) return; -#if _DEBUG +#if BUILD_DEBUG if ( element_size > sizeof( RS_MAX_SIMPLE_BUF ) ) __debugbreak(); #endif From 0d166b398cc3454d06bb8bbd00d4e7594241ae54 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 4 Mar 2026 11:28:15 -0800 Subject: [PATCH 270/850] add mule_main to the build list --- .github/workflows/builds.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index e459000a..5a29a69f 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -18,6 +18,7 @@ jobs: - raddbg - radlink - radbin + - mule_main compiler: - msvc - clang From 1c6baf18f2c5c99d2e6efbf12f1e013e064cb4a4 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 4 Mar 2026 11:41:51 -0800 Subject: [PATCH 271/850] msf_parsed_from_data now always returns non-null result --- src/linker/lnk_debug_info.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 5c9eea61..434b28cb 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -299,7 +299,11 @@ THREAD_POOL_TASK_FUNC(lnk_msf_parsed_from_data_task) ProfBeginFunction(); LNK_MsfParsedFromDataTask *task = raw_task; // TODO: pick Info, TPI and IPI to flattten to make sure we don't waste compute on throw-away streams - task->msf_parse_arr[task_id] = msf_parsed_from_data(arena, task->data_arr.v[task_id]); + MSF_Parsed *msf = 0; + if (task->data_arr.v[task_id].size > 0) { + msf = msf_parsed_from_data(arena, task->data_arr.v[task_id]); + } + task->msf_parse_arr[task_id] = msf; ProfEnd(); } From f59da0be9c8530a711962aa86ced031dba588a0b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 4 Mar 2026 11:48:56 -0800 Subject: [PATCH 272/850] extend eval language w/ identifier disambiguators - used to pick amongst many identically-named things. for instance, local_static#0 will match the first local_static, local_static#1 will match the second, etc. --- src/dbg_info/dbg_info.c | 5 ++-- src/eval/eval_core.h | 3 +- src/eval/eval_ir.c | 10 ++++++- src/eval/eval_parse.c | 42 +++++++++++++++++++++++---- src/lib_raddbg_markup/raddbg_markup.h | 6 ++-- src/mule/mule_main.cpp | 17 +++++++++-- 6 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 5a4cd680..a49f01b0 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1590,10 +1590,11 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g U32 num = 0; U32 *run = rdi_matches_from_map_node(rdi, map_node, &num); if(num != 0) - { + { + U64 run_idx = (num-1) - Min(index, num-1); lane_matches[lane_idx()].key = dbgi_key; lane_matches[lane_idx()].section_kind = name_map_section_kinds[name_map_kind_idx]; - lane_matches[lane_idx()].idx = run[num-1]; + lane_matches[lane_idx()].idx = run[run_idx]; } } } diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index ed300e59..51eb6c13 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -262,7 +262,8 @@ struct E_Expr E_TypeKey type_key; E_Value value; String8 string; - String8 qualifier; + String8 qualifier; + String8 disambiguator; String8 bytecode; }; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 0293a03d..aee91800 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1696,6 +1696,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I case E_ExprKind_LeafIdentifier: { Temp scratch = scratch_begin(&arena, 1); + String8 disambiguator = expr->disambiguator; String8 qualifier = expr->qualifier; String8 string = expr->string; String8 string__redirected = string; @@ -1890,8 +1891,15 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I { Access *access = access_open(); + // rjf: determine disambiguating index + U64 match_disambiguating_idx = 0; + if(disambiguator.size != 0) + { + try_u64_from_str8_c_rules(disambiguator, &match_disambiguating_idx); + } + // rjf: find match - DI_Match match = di_match_from_string(string, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0); + DI_Match match = di_match_from_string(string, match_disambiguating_idx, e_base_ctx->primary_dbg_info->dbgi_key, 0); if(match.idx == 0) { String8List namespaceified_strings = {0}; diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index d3d0d40f..1eff2b4d 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -113,7 +113,8 @@ e_token_array_from_text(Arena *arena, String8 text) byte == '-' || byte == '=' || byte == '+' || byte == '[' || byte == ']' || byte == '{' || byte == '}' || byte == ':' || byte == ';' || byte == ',' || byte == '.' || byte == '<' || - byte == '>' || byte == '/' || byte == '?' || byte == '|') + byte == '>' || byte == '/' || byte == '?' || byte == '|' || + byte == '#') { active_token_kind = E_TokenKind_Symbol; active_token_start_idx = idx; @@ -224,7 +225,8 @@ e_token_array_from_text(Arena *arena, String8 text) byte != '-' && byte != '=' && byte != '+' && byte != '[' && byte != ']' && byte != '{' && byte != '}' && byte != ':' && byte != ';' && byte != ',' && byte != '.' && byte != '<' && - byte != '>' && byte != '/' && byte != '?' && byte != '|') + byte != '>' && byte != '/' && byte != '?' && byte != '|' && + byte != '#') { advance = 0; token_formed = 1; @@ -361,9 +363,10 @@ e_expr_copy(Arena *arena, E_Expr *src) dst->space = t->src->space; dst->type_key = t->src->type_key; dst->value = t->src->value; - dst->string = push_str8_copy(arena, t->src->string); - dst->bytecode = push_str8_copy(arena, t->src->bytecode); - dst->qualifier = push_str8_copy(arena, t->src->qualifier); + dst->string = str8_copy(arena, t->src->string); + dst->bytecode = str8_copy(arena, t->src->bytecode); + dst->disambiguator = str8_copy(arena, t->src->disambiguator); + dst->qualifier = str8_copy(arena, t->src->qualifier); if(t->dst_parent == &e_expr_nil) { result = dst; @@ -468,6 +471,10 @@ e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8 parent_expr_strin case E_ExprKind_LeafBytecode: case E_ExprKind_LeafIdentifier: { + if(expr->qualifier.size != 0) + { + str8_list_pushf(arena, out, "%S:", expr->qualifier); + } if(str8_match(expr->string, str8_lit("$"), 0) && parent_expr_string.size != 0) { str8_list_push(arena, out, parent_expr_string); @@ -476,6 +483,10 @@ e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8 parent_expr_strin { str8_list_push(arena, out, expr->string); } + if(expr->disambiguator.size != 0) + { + str8_list_pushf(arena, out, "#%S", expr->disambiguator); + } }break; case E_ExprKind_LeafStringLiteral: { @@ -1046,6 +1057,27 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t it += 1; got_new_atom = 1; } + + // rjf: equip disambiguator + if(got_new_atom) + { + E_Token possible_hash = e_token_at_it(it, &tokens); + E_Token possible_numeric = e_token_at_it(it+1, &tokens); + String8 possible_hash_string = str8_substr(text, possible_hash.range); + String8 possible_numeric_string = str8_substr(text, possible_numeric.range); + if(possible_hash.kind == E_TokenKind_Symbol && str8_match(possible_hash_string, str8_lit("#"), 0)) + { + if(possible_numeric.kind == E_TokenKind_Numeric) + { + atom->disambiguator = possible_numeric_string; + it += 2; + } + else + { + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, possible_numeric.range, "Expected disambiguating number after `#`."); + } + } + } } //////////////////////// diff --git a/src/lib_raddbg_markup/raddbg_markup.h b/src/lib_raddbg_markup/raddbg_markup.h index dab7bdba..a12f64b8 100644 --- a/src/lib_raddbg_markup/raddbg_markup.h +++ b/src/lib_raddbg_markup/raddbg_markup.h @@ -22,8 +22,8 @@ #if !defined(RADDBG_MARKUP_STUBS) # define raddbg_is_attached(...) raddbg_is_attached__impl() # define raddbg_thread_id(...) raddbg_thread_id__impl() -# define raddbg_thread_name(fmt, ...) raddbg_thread_name__impl(raddbg_thread_id(), (fmt), __VA_ARGS__) -# define raddbg_thread_id_name(id, fmt, ...) raddbg_thread_name__impl((id), (fmt), __VA_ARGS__) +# define raddbg_thread_name(...) raddbg_thread_name__impl(raddbg_thread_id(), __VA_ARGS__) +# define raddbg_thread_id_name(id, ...) raddbg_thread_name__impl((id), __VA_ARGS__) # define raddbg_thread_color_u32(u32) raddbg_thread_color__impl(raddbg_thread_id(), (u32)) # define raddbg_thread_color_rgba(r, g, b, a) raddbg_thread_color__impl(raddbg_thread_id(), ((unsigned int)((r)*255) << 24) | ((unsigned int)((g)*255) << 16) | ((unsigned int)((b)*255) << 8) | ((unsigned int)(a)*255)) # define raddbg_thread_id_color_u32(id, u32) raddbg_thread_color__impl((id), (u32)) @@ -32,7 +32,7 @@ # define raddbg_break_if(expr, ...) ((expr) ? raddbg_break__impl() : (void)0) # define raddbg_watch(fmt, ...) raddbg_watch__impl((fmt), __VA_ARGS__) # define raddbg_pin(expr, ...) /* NOTE(rjf): inspected by debugger ui - does not change program execution */ -# define raddbg_log(fmt, ...) raddbg_log__impl((fmt), __VA_ARGS__) +# define raddbg_log(...) raddbg_log__impl(__VA_ARGS__) # define raddbg_entry_point(...) raddbg_exe_data char raddbg_gen_data_id()[] = ("entry_point: \"" #__VA_ARGS__ "\"") # define raddbg_type_view(type, ...) raddbg_exe_data char raddbg_gen_data_id()[] = ("type_view: {type: ```" #type "```, expr: ```" #__VA_ARGS__ "```}") # define raddbg_add_breakpoint(ptr, size, r, w, x) raddbg_add_or_remove_breakpoint__impl((ptr), (1), (size), (r), (w), (x)) diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 2d63ea6f..fc7c1d09 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -910,8 +910,6 @@ static int g_abc = 100; static float g_xyz = 21.f; static Alias1 g_kind = Kind_First; -// TODO(allen): more global test types - static void complicated_global_mutation(int *x){ *x = (int)g_xyz; @@ -922,8 +920,19 @@ cross_unit_global_mutation(void){ fixed_frac_bits = 10; } +static int +function_with_duplicate_local_statics(void) +{ + static char *l_abc = "foobar"; + static int l_xyz = 123; + static Kind l_kind = Kind_First; + int x = l_xyz + (int)(int64_t)(l_abc); + return x; +} + static void -global_eval_tests(void){ +global_eval_tests(void) +{ g_abc = 11*11; g_xyz = (float)g_abc - 21.f; @@ -946,6 +955,8 @@ global_eval_tests(void){ l_abc = g_abc*2; l_xyz = g_xyz*2; l_kind = (Alias1)(g_kind + 1); + + function_with_duplicate_local_statics(); } //////////////////////////////// From 953f58fd440e7117b2fd71a01c21bd0960e06382 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 4 Mar 2026 15:35:57 -0800 Subject: [PATCH 273/850] notes for next RDI pass to support namespacing, support scope-based lookups for local-statics, support fully-qualified namespace name resolution, & simplify/merge RDI variable symbol types, & reduce a lot of size in RDIs! --- src/raddbg/raddbg_main.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 1b3bcfb3..b47a98d4 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,20 @@ //////////////////////////////// //~ rjf: post-0.9.20 TODO notes // +//- namespace/locations/variables RDI pass +// [ ] RDI_Local, RDI_GlobalVariable, RDI_ThreadVariable -> RDI_Variable +// [ ] RDI_Variable gets RDI_ContainerFlags, and a container_idx +// [ ] RDI_Namespace can be a container, same as types/procedures +// [ ] If procedure-contained, then index goes to scope now, not procedure +// [ ] Location sections -> split by location kind, fixed tables for simple locations, one catch-all table for bytecode. +// [ ] Location kind -> can be thread-local offset, or module virtual offset, to enclose globals/tlocals cases +// [ ] Referring to one location -> kind * index +// [ ] Referring to many locations, based on scope offsets -> kind = BlockList; BlockList encodes a first/opl pair into Block table, each Block has scope_off_first/opl, location_kind, location_idx - but a block's location kind CANNOT BE BlockList +// [ ] RDI_Variable has location_kind, location_idx +// [ ] symbols only store their *partly-qualified name*, e.g. `x` for A::B::C::x +// [ ] default name maps look up *partly-qualified names* +// [ ] to match a *fully qualified name*, there needs to be a second kind of different lookup - instead of string-matching, we need to match against the *fully qualified names*. the maps must be built by hashing the *fully qualified name*, but redirecting to the symbol with the *partially qualified name*. this is to allow fully-qualified lookups, but avoid storing fully-qualified names. +// //- urgent fixes // [ ] (use msvc assert as an example) show fastfail exception info (code, name, etc.) - comes from ExceptionInformation @fastfail // [ ] stepping w/ spoofs & shadow stack enabled - writing spoof will send a stack buffer overrun event @shadow_stack_step From e2b9618101ee63f302ab183e5f0c069a80b67748 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 9 Mar 2026 09:37:50 -0700 Subject: [PATCH 274/850] rdi format - namespaces --- build.bat | 11 +- src/lib_rdi/rdi.c | 3 +- src/lib_rdi/rdi.h | 967 ++++++++++++++++++---------------- src/lib_rdi_make/rdi_make.c | 24 + src/lib_rdi_make/rdi_make.h | 53 +- src/rdi/rdi.mdesk | 98 +++- src/rdi_make/rdi_make_local.c | 13 + 7 files changed, 665 insertions(+), 504 deletions(-) diff --git a/build.bat b/build.bat index 67c197d3..604bac55 100644 --- a/build.bat +++ b/build.bat @@ -123,13 +123,16 @@ for /f %%i in ('call git describe --always --dirty') do set compile=%compile% for /f %%i in ('call git rev-parse HEAD') do set compile=%compile% -DBUILD_GIT_HASH_FULL=\"%%i\" :: --- Build & Run Metaprogram ------------------------------------------------ +pushd build if "%meta%"=="1" ( - echo [doing metagen] - pushd build + echo [building metagen] %compile_debug% ..\src\metagen\metagen_main.c %compile_link% %out%metagen.exe || exit /b 1 - metagen.exe || exit /b 1 - popd ) +if "%no_meta%"=="" ( + echo [running metagen] + metagen.exe || exit /b 1 +) +popd :: --- Build Everything (@build_targets) -------------------------------------- pushd build diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index adfe99bd..d68158f4 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -10,7 +10,7 @@ #ifndef RDI_C #define RDI_C -RDI_U16 rdi_section_element_size_table[44] = +RDI_U16 rdi_section_element_size_table[45] = { sizeof(RDI_U8), sizeof(RDI_TopLevelInfo), @@ -30,6 +30,7 @@ sizeof(RDI_U32), sizeof(RDI_U64), sizeof(RDI_Unit), sizeof(RDI_VMapEntry), +sizeof(RDI_Namespace), sizeof(RDI_TypeNode), sizeof(RDI_UDT), sizeof(RDI_Member), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index a7b8b476..af756bb7 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -67,7 +67,7 @@ union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; // "raddbg\0\0" #define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 18 +#define RDI_ENCODING_VERSION 19 //////////////////////////////////////////////////////////////// //~ Format Types & Functions @@ -75,428 +75,444 @@ union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; typedef RDI_U32 RDI_SectionKind; typedef enum RDI_SectionKindEnum { - RDI_SectionKind_NULL = 0x0000, - RDI_SectionKind_TopLevelInfo = 0x0001, - RDI_SectionKind_StringData = 0x0002, - RDI_SectionKind_StringTable = 0x0003, - RDI_SectionKind_IndexRuns = 0x0004, - RDI_SectionKind_BinarySections = 0x0005, - RDI_SectionKind_FilePathNodes = 0x0006, - RDI_SectionKind_SourceFiles = 0x0007, - RDI_SectionKind_LineTables = 0x0008, - RDI_SectionKind_LineInfoVOffs = 0x0009, - RDI_SectionKind_LineInfoLines = 0x000A, - RDI_SectionKind_LineInfoColumns = 0x000B, - RDI_SectionKind_SourceLineMaps = 0x000C, - RDI_SectionKind_SourceLineMapNumbers = 0x000D, - RDI_SectionKind_SourceLineMapRanges = 0x000E, - RDI_SectionKind_SourceLineMapVOffs = 0x000F, - RDI_SectionKind_Units = 0x0010, - RDI_SectionKind_UnitVMap = 0x0011, - RDI_SectionKind_TypeNodes = 0x0012, - RDI_SectionKind_UDTs = 0x0013, - RDI_SectionKind_Members = 0x0014, - RDI_SectionKind_EnumMembers = 0x0015, - RDI_SectionKind_GlobalVariables = 0x0016, - RDI_SectionKind_GlobalVMap = 0x0017, - RDI_SectionKind_ThreadVariables = 0x0018, - RDI_SectionKind_Constants = 0x0019, - RDI_SectionKind_Procedures = 0x001A, - RDI_SectionKind_Scopes = 0x001B, - RDI_SectionKind_ScopeVOffData = 0x001C, - RDI_SectionKind_ScopeVMap = 0x001D, - RDI_SectionKind_InlineSites = 0x001E, - RDI_SectionKind_Locals = 0x001F, - RDI_SectionKind_LocationBlocks = 0x0020, - RDI_SectionKind_LocationData = 0x0021, - RDI_SectionKind_ConstantValueData = 0x0022, - RDI_SectionKind_ConstantValueTable = 0x0023, - RDI_SectionKind_MD5Checksums = 0x0024, - RDI_SectionKind_SHA1Checksums = 0x0025, - RDI_SectionKind_SHA256Checksums = 0x0026, - RDI_SectionKind_Timestamps = 0x0027, - RDI_SectionKind_NameMaps = 0x0028, - RDI_SectionKind_NameMapBuckets = 0x0029, - RDI_SectionKind_NameMapNodes = 0x002A, - RDI_SectionKind_COUNT = 0x002B, +RDI_SectionKind_NULL = 0x0000, +RDI_SectionKind_TopLevelInfo = 0x0001, +RDI_SectionKind_StringData = 0x0002, +RDI_SectionKind_StringTable = 0x0003, +RDI_SectionKind_IndexRuns = 0x0004, +RDI_SectionKind_BinarySections = 0x0005, +RDI_SectionKind_FilePathNodes = 0x0006, +RDI_SectionKind_SourceFiles = 0x0007, +RDI_SectionKind_LineTables = 0x0008, +RDI_SectionKind_LineInfoVOffs = 0x0009, +RDI_SectionKind_LineInfoLines = 0x000A, +RDI_SectionKind_LineInfoColumns = 0x000B, +RDI_SectionKind_SourceLineMaps = 0x000C, +RDI_SectionKind_SourceLineMapNumbers = 0x000D, +RDI_SectionKind_SourceLineMapRanges = 0x000E, +RDI_SectionKind_SourceLineMapVOffs = 0x000F, +RDI_SectionKind_Units = 0x0010, +RDI_SectionKind_UnitVMap = 0x0011, +RDI_SectionKind_Namespaces = 0x0012, +RDI_SectionKind_TypeNodes = 0x0013, +RDI_SectionKind_UDTs = 0x0014, +RDI_SectionKind_Members = 0x0015, +RDI_SectionKind_EnumMembers = 0x0016, +RDI_SectionKind_GlobalVariables = 0x0017, +RDI_SectionKind_GlobalVMap = 0x0018, +RDI_SectionKind_ThreadVariables = 0x0019, +RDI_SectionKind_Constants = 0x001A, +RDI_SectionKind_Procedures = 0x001B, +RDI_SectionKind_Scopes = 0x001C, +RDI_SectionKind_ScopeVOffData = 0x001D, +RDI_SectionKind_ScopeVMap = 0x001E, +RDI_SectionKind_InlineSites = 0x001F, +RDI_SectionKind_Locals = 0x0020, +RDI_SectionKind_LocationBlocks = 0x0021, +RDI_SectionKind_LocationData = 0x0022, +RDI_SectionKind_ConstantValueData = 0x0023, +RDI_SectionKind_ConstantValueTable = 0x0024, +RDI_SectionKind_MD5Checksums = 0x0025, +RDI_SectionKind_SHA1Checksums = 0x0026, +RDI_SectionKind_SHA256Checksums = 0x0027, +RDI_SectionKind_Timestamps = 0x0028, +RDI_SectionKind_NameMaps = 0x0029, +RDI_SectionKind_NameMapBuckets = 0x002A, +RDI_SectionKind_NameMapNodes = 0x002B, +RDI_SectionKind_COUNT = 0x002C, } RDI_SectionKindEnum; typedef RDI_U32 RDI_SectionEncoding; typedef enum RDI_SectionEncodingEnum { - RDI_SectionEncoding_Unpacked = 0, - RDI_SectionEncoding_LZB = 1, +RDI_SectionEncoding_Unpacked = 0, +RDI_SectionEncoding_LZB = 1, } RDI_SectionEncodingEnum; typedef RDI_U32 RDI_Arch; typedef enum RDI_ArchEnum { - RDI_Arch_NULL = 0, - RDI_Arch_X64 = 1, +RDI_Arch_NULL = 0, +RDI_Arch_X64 = 1, } RDI_ArchEnum; typedef RDI_U8 RDI_RegCode; typedef enum RDI_RegCodeEnum { - RDI_RegCode_nil, +RDI_RegCode_nil, } RDI_RegCodeEnum; typedef RDI_U8 RDI_RegCodeX64; typedef enum RDI_RegCodeX64Enum { - RDI_RegCodeX64_nil = 0, - RDI_RegCodeX64_rax = 1, - RDI_RegCodeX64_rcx = 2, - RDI_RegCodeX64_rdx = 3, - RDI_RegCodeX64_rbx = 4, - RDI_RegCodeX64_rsp = 5, - RDI_RegCodeX64_rbp = 6, - RDI_RegCodeX64_rsi = 7, - RDI_RegCodeX64_rdi = 8, - RDI_RegCodeX64_r8 = 9, - RDI_RegCodeX64_r9 = 10, - RDI_RegCodeX64_r10 = 11, - RDI_RegCodeX64_r11 = 12, - RDI_RegCodeX64_r12 = 13, - RDI_RegCodeX64_r13 = 14, - RDI_RegCodeX64_r14 = 15, - RDI_RegCodeX64_r15 = 16, - RDI_RegCodeX64_es = 17, - RDI_RegCodeX64_cs = 18, - RDI_RegCodeX64_ss = 19, - RDI_RegCodeX64_ds = 20, - RDI_RegCodeX64_fs = 21, - RDI_RegCodeX64_gs = 22, - RDI_RegCodeX64_rip = 23, - RDI_RegCodeX64_rflags = 24, - RDI_RegCodeX64_dr0 = 25, - RDI_RegCodeX64_dr1 = 26, - RDI_RegCodeX64_dr2 = 27, - RDI_RegCodeX64_dr3 = 28, - RDI_RegCodeX64_dr4 = 29, - RDI_RegCodeX64_dr5 = 30, - RDI_RegCodeX64_dr6 = 31, - RDI_RegCodeX64_dr7 = 32, - RDI_RegCodeX64_st0 = 33, - RDI_RegCodeX64_st1 = 34, - RDI_RegCodeX64_st2 = 35, - RDI_RegCodeX64_st3 = 36, - RDI_RegCodeX64_st4 = 37, - RDI_RegCodeX64_st5 = 38, - RDI_RegCodeX64_st6 = 39, - RDI_RegCodeX64_st7 = 40, - RDI_RegCodeX64_zmm0 = 41, - RDI_RegCodeX64_zmm1 = 42, - RDI_RegCodeX64_zmm2 = 43, - RDI_RegCodeX64_zmm3 = 44, - RDI_RegCodeX64_zmm4 = 45, - RDI_RegCodeX64_zmm5 = 46, - RDI_RegCodeX64_zmm6 = 47, - RDI_RegCodeX64_zmm7 = 48, - RDI_RegCodeX64_zmm8 = 49, - RDI_RegCodeX64_zmm9 = 50, - RDI_RegCodeX64_zmm10 = 51, - RDI_RegCodeX64_zmm11 = 52, - RDI_RegCodeX64_zmm12 = 53, - RDI_RegCodeX64_zmm13 = 54, - RDI_RegCodeX64_zmm14 = 55, - RDI_RegCodeX64_zmm15 = 56, - RDI_RegCodeX64_zmm16 = 57, - RDI_RegCodeX64_zmm17 = 58, - RDI_RegCodeX64_zmm18 = 59, - RDI_RegCodeX64_zmm19 = 60, - RDI_RegCodeX64_zmm20 = 61, - RDI_RegCodeX64_zmm21 = 62, - RDI_RegCodeX64_zmm22 = 63, - RDI_RegCodeX64_zmm23 = 64, - RDI_RegCodeX64_zmm24 = 65, - RDI_RegCodeX64_zmm25 = 66, - RDI_RegCodeX64_zmm26 = 67, - RDI_RegCodeX64_zmm27 = 68, - RDI_RegCodeX64_zmm28 = 69, - RDI_RegCodeX64_zmm29 = 70, - RDI_RegCodeX64_zmm30 = 71, - RDI_RegCodeX64_zmm31 = 72, - RDI_RegCodeX64_k0 = 73, - RDI_RegCodeX64_k1 = 74, - RDI_RegCodeX64_k2 = 75, - RDI_RegCodeX64_k3 = 76, - RDI_RegCodeX64_k4 = 77, - RDI_RegCodeX64_k5 = 78, - RDI_RegCodeX64_k6 = 79, - RDI_RegCodeX64_k7 = 80, - RDI_RegCodeX64_mxcsr = 81, - RDI_RegCodeX64_fsbase = 82, - RDI_RegCodeX64_gsbase = 83, - RDI_RegCodeX64_fcw = 84, - RDI_RegCodeX64_fsw = 85, - RDI_RegCodeX64_ftw = 86, - RDI_RegCodeX64_fop = 87, - RDI_RegCodeX64_fcs = 88, - RDI_RegCodeX64_fds = 89, - RDI_RegCodeX64_fip = 90, - RDI_RegCodeX64_fdp = 91, - RDI_RegCodeX64_mxcsr_mask = 92, - RDI_RegCodeX64_cetmsr = 93, - RDI_RegCodeX64_cetssp = 94, +RDI_RegCodeX64_nil = 0, +RDI_RegCodeX64_rax = 1, +RDI_RegCodeX64_rcx = 2, +RDI_RegCodeX64_rdx = 3, +RDI_RegCodeX64_rbx = 4, +RDI_RegCodeX64_rsp = 5, +RDI_RegCodeX64_rbp = 6, +RDI_RegCodeX64_rsi = 7, +RDI_RegCodeX64_rdi = 8, +RDI_RegCodeX64_r8 = 9, +RDI_RegCodeX64_r9 = 10, +RDI_RegCodeX64_r10 = 11, +RDI_RegCodeX64_r11 = 12, +RDI_RegCodeX64_r12 = 13, +RDI_RegCodeX64_r13 = 14, +RDI_RegCodeX64_r14 = 15, +RDI_RegCodeX64_r15 = 16, +RDI_RegCodeX64_es = 17, +RDI_RegCodeX64_cs = 18, +RDI_RegCodeX64_ss = 19, +RDI_RegCodeX64_ds = 20, +RDI_RegCodeX64_fs = 21, +RDI_RegCodeX64_gs = 22, +RDI_RegCodeX64_rip = 23, +RDI_RegCodeX64_rflags = 24, +RDI_RegCodeX64_dr0 = 25, +RDI_RegCodeX64_dr1 = 26, +RDI_RegCodeX64_dr2 = 27, +RDI_RegCodeX64_dr3 = 28, +RDI_RegCodeX64_dr4 = 29, +RDI_RegCodeX64_dr5 = 30, +RDI_RegCodeX64_dr6 = 31, +RDI_RegCodeX64_dr7 = 32, +RDI_RegCodeX64_st0 = 33, +RDI_RegCodeX64_st1 = 34, +RDI_RegCodeX64_st2 = 35, +RDI_RegCodeX64_st3 = 36, +RDI_RegCodeX64_st4 = 37, +RDI_RegCodeX64_st5 = 38, +RDI_RegCodeX64_st6 = 39, +RDI_RegCodeX64_st7 = 40, +RDI_RegCodeX64_zmm0 = 41, +RDI_RegCodeX64_zmm1 = 42, +RDI_RegCodeX64_zmm2 = 43, +RDI_RegCodeX64_zmm3 = 44, +RDI_RegCodeX64_zmm4 = 45, +RDI_RegCodeX64_zmm5 = 46, +RDI_RegCodeX64_zmm6 = 47, +RDI_RegCodeX64_zmm7 = 48, +RDI_RegCodeX64_zmm8 = 49, +RDI_RegCodeX64_zmm9 = 50, +RDI_RegCodeX64_zmm10 = 51, +RDI_RegCodeX64_zmm11 = 52, +RDI_RegCodeX64_zmm12 = 53, +RDI_RegCodeX64_zmm13 = 54, +RDI_RegCodeX64_zmm14 = 55, +RDI_RegCodeX64_zmm15 = 56, +RDI_RegCodeX64_zmm16 = 57, +RDI_RegCodeX64_zmm17 = 58, +RDI_RegCodeX64_zmm18 = 59, +RDI_RegCodeX64_zmm19 = 60, +RDI_RegCodeX64_zmm20 = 61, +RDI_RegCodeX64_zmm21 = 62, +RDI_RegCodeX64_zmm22 = 63, +RDI_RegCodeX64_zmm23 = 64, +RDI_RegCodeX64_zmm24 = 65, +RDI_RegCodeX64_zmm25 = 66, +RDI_RegCodeX64_zmm26 = 67, +RDI_RegCodeX64_zmm27 = 68, +RDI_RegCodeX64_zmm28 = 69, +RDI_RegCodeX64_zmm29 = 70, +RDI_RegCodeX64_zmm30 = 71, +RDI_RegCodeX64_zmm31 = 72, +RDI_RegCodeX64_k0 = 73, +RDI_RegCodeX64_k1 = 74, +RDI_RegCodeX64_k2 = 75, +RDI_RegCodeX64_k3 = 76, +RDI_RegCodeX64_k4 = 77, +RDI_RegCodeX64_k5 = 78, +RDI_RegCodeX64_k6 = 79, +RDI_RegCodeX64_k7 = 80, +RDI_RegCodeX64_mxcsr = 81, +RDI_RegCodeX64_fsbase = 82, +RDI_RegCodeX64_gsbase = 83, +RDI_RegCodeX64_fcw = 84, +RDI_RegCodeX64_fsw = 85, +RDI_RegCodeX64_ftw = 86, +RDI_RegCodeX64_fop = 87, +RDI_RegCodeX64_fcs = 88, +RDI_RegCodeX64_fds = 89, +RDI_RegCodeX64_fip = 90, +RDI_RegCodeX64_fdp = 91, +RDI_RegCodeX64_mxcsr_mask = 92, +RDI_RegCodeX64_cetmsr = 93, +RDI_RegCodeX64_cetssp = 94, } RDI_RegCodeX64Enum; typedef RDI_U32 RDI_BinarySectionFlags; typedef enum RDI_BinarySectionFlagsEnum { - RDI_BinarySectionFlag_Read = 1<<0, - RDI_BinarySectionFlag_Write = 1<<1, - RDI_BinarySectionFlag_Execute = 1<<2, +RDI_BinarySectionFlag_Read = 1<<0, +RDI_BinarySectionFlag_Write = 1<<1, +RDI_BinarySectionFlag_Execute = 1<<2, } RDI_BinarySectionFlagsEnum; typedef RDI_U32 RDI_ChecksumKind; typedef enum RDI_ChecksumKindEnum { - RDI_ChecksumKind_NULL = 0, - RDI_ChecksumKind_MD5 = 1, - RDI_ChecksumKind_SHA1 = 2, - RDI_ChecksumKind_SHA256 = 3, - RDI_ChecksumKind_Timestamp = 4, - RDI_ChecksumKind_COUNT = 5, +RDI_ChecksumKind_NULL = 0, +RDI_ChecksumKind_MD5 = 1, +RDI_ChecksumKind_SHA1 = 2, +RDI_ChecksumKind_SHA256 = 3, +RDI_ChecksumKind_Timestamp = 4, +RDI_ChecksumKind_COUNT = 5, } RDI_ChecksumKindEnum; typedef RDI_U32 RDI_Language; typedef enum RDI_LanguageEnum { - RDI_Language_NULL = 0, - RDI_Language_C = 1, - RDI_Language_CPlusPlus = 2, - RDI_Language_Masm = 3, - RDI_Language_COUNT = 4, +RDI_Language_NULL = 0, +RDI_Language_C = 1, +RDI_Language_CPlusPlus = 2, +RDI_Language_Masm = 3, +RDI_Language_COUNT = 4, } RDI_LanguageEnum; typedef RDI_U16 RDI_TypeKind; typedef enum RDI_TypeKindEnum { - RDI_TypeKind_NULL = 0x0000, - RDI_TypeKind_Void = 0x0001, - RDI_TypeKind_Handle = 0x0002, - RDI_TypeKind_HResult = 0x0003, - RDI_TypeKind_Char8 = 0x0004, - RDI_TypeKind_Char16 = 0x0005, - RDI_TypeKind_Char32 = 0x0006, - RDI_TypeKind_UChar8 = 0x0007, - RDI_TypeKind_UChar16 = 0x0008, - RDI_TypeKind_UChar32 = 0x0009, - RDI_TypeKind_U8 = 0x000A, - RDI_TypeKind_U16 = 0x000B, - RDI_TypeKind_U32 = 0x000C, - RDI_TypeKind_U64 = 0x000D, - RDI_TypeKind_U128 = 0x000E, - RDI_TypeKind_U256 = 0x000F, - RDI_TypeKind_U512 = 0x0010, - RDI_TypeKind_S8 = 0x0011, - RDI_TypeKind_S16 = 0x0012, - RDI_TypeKind_S32 = 0x0013, - RDI_TypeKind_S64 = 0x0014, - RDI_TypeKind_S128 = 0x0015, - RDI_TypeKind_S256 = 0x0016, - RDI_TypeKind_S512 = 0x0017, - RDI_TypeKind_Bool = 0x0018, - RDI_TypeKind_BF16 = 0x0019, - RDI_TypeKind_F16 = 0x001A, - RDI_TypeKind_F32 = 0x001B, - RDI_TypeKind_F32PP = 0x001C, - RDI_TypeKind_F48 = 0x001D, - RDI_TypeKind_F64 = 0x001E, - RDI_TypeKind_F80 = 0x001F, - RDI_TypeKind_F96 = 0x0020, - RDI_TypeKind_F128 = 0x0021, - RDI_TypeKind_ComplexF32 = 0x0022, - RDI_TypeKind_ComplexF64 = 0x0023, - RDI_TypeKind_ComplexF80 = 0x0024, - RDI_TypeKind_ComplexF128 = 0x0025, - RDI_TypeKind_Decimal32 = 0x0026, - RDI_TypeKind_Decimal64 = 0x0027, - RDI_TypeKind_Decimal128 = 0x0028, - RDI_TypeKind_Modifier = 0x1000, - RDI_TypeKind_Ptr = 0x1001, - RDI_TypeKind_LRef = 0x1002, - RDI_TypeKind_RRef = 0x1003, - RDI_TypeKind_Array = 0x1004, - RDI_TypeKind_Function = 0x1005, - RDI_TypeKind_Method = 0x1006, - RDI_TypeKind_MemberPtr = 0x1007, - RDI_TypeKind_Struct = 0x2000, - RDI_TypeKind_Class = 0x2001, - RDI_TypeKind_Union = 0x2002, - RDI_TypeKind_Enum = 0x2003, - RDI_TypeKind_Alias = 0x2004, - RDI_TypeKind_IncompleteStruct = 0x2005, - RDI_TypeKind_IncompleteUnion = 0x2006, - RDI_TypeKind_IncompleteClass = 0x2007, - RDI_TypeKind_IncompleteEnum = 0x2008, - RDI_TypeKind_Bitfield = 0xF000, - RDI_TypeKind_Variadic = 0xF001, - RDI_TypeKind_Count = 0xF002, - RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, - RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Decimal128, - RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, - RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, - RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, - RDI_TypeKind_LastRecord = RDI_TypeKind_Union, - RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, - RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, - RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, - RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, +RDI_TypeKind_NULL = 0x0000, +RDI_TypeKind_Void = 0x0001, +RDI_TypeKind_Handle = 0x0002, +RDI_TypeKind_HResult = 0x0003, +RDI_TypeKind_Char8 = 0x0004, +RDI_TypeKind_Char16 = 0x0005, +RDI_TypeKind_Char32 = 0x0006, +RDI_TypeKind_UChar8 = 0x0007, +RDI_TypeKind_UChar16 = 0x0008, +RDI_TypeKind_UChar32 = 0x0009, +RDI_TypeKind_U8 = 0x000A, +RDI_TypeKind_U16 = 0x000B, +RDI_TypeKind_U32 = 0x000C, +RDI_TypeKind_U64 = 0x000D, +RDI_TypeKind_U128 = 0x000E, +RDI_TypeKind_U256 = 0x000F, +RDI_TypeKind_U512 = 0x0010, +RDI_TypeKind_S8 = 0x0011, +RDI_TypeKind_S16 = 0x0012, +RDI_TypeKind_S32 = 0x0013, +RDI_TypeKind_S64 = 0x0014, +RDI_TypeKind_S128 = 0x0015, +RDI_TypeKind_S256 = 0x0016, +RDI_TypeKind_S512 = 0x0017, +RDI_TypeKind_Bool = 0x0018, +RDI_TypeKind_BF16 = 0x0019, +RDI_TypeKind_F16 = 0x001A, +RDI_TypeKind_F32 = 0x001B, +RDI_TypeKind_F32PP = 0x001C, +RDI_TypeKind_F48 = 0x001D, +RDI_TypeKind_F64 = 0x001E, +RDI_TypeKind_F80 = 0x001F, +RDI_TypeKind_F96 = 0x0020, +RDI_TypeKind_F128 = 0x0021, +RDI_TypeKind_ComplexF32 = 0x0022, +RDI_TypeKind_ComplexF64 = 0x0023, +RDI_TypeKind_ComplexF80 = 0x0024, +RDI_TypeKind_ComplexF128 = 0x0025, +RDI_TypeKind_Decimal32 = 0x0026, +RDI_TypeKind_Decimal64 = 0x0027, +RDI_TypeKind_Decimal128 = 0x0028, +RDI_TypeKind_Modifier = 0x1000, +RDI_TypeKind_Ptr = 0x1001, +RDI_TypeKind_LRef = 0x1002, +RDI_TypeKind_RRef = 0x1003, +RDI_TypeKind_Array = 0x1004, +RDI_TypeKind_Function = 0x1005, +RDI_TypeKind_Method = 0x1006, +RDI_TypeKind_MemberPtr = 0x1007, +RDI_TypeKind_Struct = 0x2000, +RDI_TypeKind_Class = 0x2001, +RDI_TypeKind_Union = 0x2002, +RDI_TypeKind_Enum = 0x2003, +RDI_TypeKind_Alias = 0x2004, +RDI_TypeKind_IncompleteStruct = 0x2005, +RDI_TypeKind_IncompleteUnion = 0x2006, +RDI_TypeKind_IncompleteClass = 0x2007, +RDI_TypeKind_IncompleteEnum = 0x2008, +RDI_TypeKind_Bitfield = 0xF000, +RDI_TypeKind_Variadic = 0xF001, +RDI_TypeKind_Count = 0xF002, +RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, +RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Decimal128, +RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, +RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, +RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, +RDI_TypeKind_LastRecord = RDI_TypeKind_Union, +RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, +RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, +RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, +RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, } RDI_TypeKindEnum; typedef RDI_U16 RDI_TypeModifierFlags; typedef enum RDI_TypeModifierFlagsEnum { - RDI_TypeModifierFlag_Const = 1<<0, - RDI_TypeModifierFlag_Volatile = 1<<1, - RDI_TypeModifierFlag_Restrict = 1<<2, +RDI_TypeModifierFlag_Const = 1<<0, +RDI_TypeModifierFlag_Volatile = 1<<1, +RDI_TypeModifierFlag_Restrict = 1<<2, } RDI_TypeModifierFlagsEnum; typedef RDI_U32 RDI_UDTFlags; typedef enum RDI_UDTFlagsEnum { - RDI_UDTFlag_EnumMembers = 1<<0, +RDI_UDTFlag_EnumMembers = 1<<0, } RDI_UDTFlagsEnum; typedef RDI_U16 RDI_MemberKind; typedef enum RDI_MemberKindEnum { - RDI_MemberKind_NULL = 0x0000, - RDI_MemberKind_DataField = 0x0001, - RDI_MemberKind_StaticData = 0x0002, - RDI_MemberKind_Method = 0x0100, - RDI_MemberKind_StaticMethod = 0x0101, - RDI_MemberKind_VirtualMethod = 0x0102, - RDI_MemberKind_VTablePtr = 0x0200, - RDI_MemberKind_Base = 0x0201, - RDI_MemberKind_VirtualBase = 0x0202, - RDI_MemberKind_NestedType = 0x0300, +RDI_MemberKind_NULL = 0x0000, +RDI_MemberKind_DataField = 0x0001, +RDI_MemberKind_StaticData = 0x0002, +RDI_MemberKind_Method = 0x0100, +RDI_MemberKind_StaticMethod = 0x0101, +RDI_MemberKind_VirtualMethod = 0x0102, +RDI_MemberKind_VTablePtr = 0x0200, +RDI_MemberKind_Base = 0x0201, +RDI_MemberKind_VirtualBase = 0x0202, +RDI_MemberKind_NestedType = 0x0300, } RDI_MemberKindEnum; +typedef RDI_U8 RDI_ContainerKind; +typedef enum RDI_ContainerKindEnum +{ +RDI_ContainerKind_Type = 0x0, +RDI_ContainerKind_Scope = 0x1, +RDI_ContainerKind_Namespace = 0x2, +} RDI_ContainerKindEnum; + +typedef RDI_U32 RDI_ContainerFlags; +typedef enum RDI_ContainerFlagsEnum +{ +RDI_ContainerFlag_External = 1<<8, +RDI_ContainerFlag_KindMask = 0xff, +} RDI_ContainerFlagsEnum; + typedef RDI_U32 RDI_LinkFlags; typedef enum RDI_LinkFlagsEnum { - RDI_LinkFlag_External = 1<<0, - RDI_LinkFlag_TypeScoped = 1<<1, - RDI_LinkFlag_ProcScoped = 1<<2, +RDI_LinkFlag_External = 1<<0, +RDI_LinkFlag_TypeScoped = 1<<1, +RDI_LinkFlag_ProcScoped = 1<<2, } RDI_LinkFlagsEnum; typedef RDI_U32 RDI_LocalKind; typedef enum RDI_LocalKindEnum { - RDI_LocalKind_NULL = 0x0, - RDI_LocalKind_Parameter = 0x1, - RDI_LocalKind_Variable = 0x2, +RDI_LocalKind_NULL = 0x0, +RDI_LocalKind_Parameter = 0x1, +RDI_LocalKind_Variable = 0x2, } RDI_LocalKindEnum; typedef RDI_U8 RDI_LocationKind; typedef enum RDI_LocationKindEnum { - RDI_LocationKind_NULL = 0x0, - RDI_LocationKind_AddrBytecodeStream = 0x1, - RDI_LocationKind_ValBytecodeStream = 0x2, - RDI_LocationKind_AddrRegPlusU16 = 0x3, - RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, - RDI_LocationKind_ValReg = 0x5, +RDI_LocationKind_NULL = 0x0, +RDI_LocationKind_AddrBytecodeStream = 0x1, +RDI_LocationKind_ValBytecodeStream = 0x2, +RDI_LocationKind_AddrRegPlusU16 = 0x3, +RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, +RDI_LocationKind_ValReg = 0x5, } RDI_LocationKindEnum; typedef RDI_U8 RDI_EvalOp; typedef enum RDI_EvalOpEnum { - RDI_EvalOp_Stop = 0, - RDI_EvalOp_Noop = 1, - RDI_EvalOp_Cond = 2, - RDI_EvalOp_Skip = 3, - RDI_EvalOp_MemRead = 4, - RDI_EvalOp_RegRead = 5, - RDI_EvalOp_RegReadDyn = 6, - RDI_EvalOp_FrameOff = 7, - RDI_EvalOp_ModuleOff = 8, - RDI_EvalOp_TLSOff = 9, - RDI_EvalOp_ObjectOff = 10, - RDI_EvalOp_CFA = 11, - RDI_EvalOp_ConstU8 = 12, - RDI_EvalOp_ConstU16 = 13, - RDI_EvalOp_ConstU32 = 14, - RDI_EvalOp_ConstU64 = 15, - RDI_EvalOp_ConstU128 = 16, - RDI_EvalOp_ConstString = 17, - RDI_EvalOp_Abs = 18, - RDI_EvalOp_Neg = 19, - RDI_EvalOp_Add = 20, - RDI_EvalOp_Sub = 21, - RDI_EvalOp_Mul = 22, - RDI_EvalOp_Div = 23, - RDI_EvalOp_Mod = 24, - RDI_EvalOp_LShift = 25, - RDI_EvalOp_RShift = 26, - RDI_EvalOp_BitAnd = 27, - RDI_EvalOp_BitOr = 28, - RDI_EvalOp_BitXor = 29, - RDI_EvalOp_BitNot = 30, - RDI_EvalOp_LogAnd = 31, - RDI_EvalOp_LogOr = 32, - RDI_EvalOp_LogNot = 33, - RDI_EvalOp_EqEq = 34, - RDI_EvalOp_NtEq = 35, - RDI_EvalOp_LsEq = 36, - RDI_EvalOp_GrEq = 37, - RDI_EvalOp_Less = 38, - RDI_EvalOp_Grtr = 39, - RDI_EvalOp_Trunc = 40, - RDI_EvalOp_TruncSigned = 41, - RDI_EvalOp_Convert = 42, - RDI_EvalOp_Pick = 43, - RDI_EvalOp_Pop = 44, - RDI_EvalOp_Insert = 45, - RDI_EvalOp_ValueRead = 46, - RDI_EvalOp_ByteSwap = 47, - RDI_EvalOp_CallSiteValue = 48, - RDI_EvalOp_PartialValue = 49, - RDI_EvalOp_PartialValueBit = 50, - RDI_EvalOp_Swap = 51, - RDI_EvalOp_PushCfa = 52, - RDI_EvalOp_COUNT = 53, +RDI_EvalOp_Stop = 0, +RDI_EvalOp_Noop = 1, +RDI_EvalOp_Cond = 2, +RDI_EvalOp_Skip = 3, +RDI_EvalOp_MemRead = 4, +RDI_EvalOp_RegRead = 5, +RDI_EvalOp_RegReadDyn = 6, +RDI_EvalOp_FrameOff = 7, +RDI_EvalOp_ModuleOff = 8, +RDI_EvalOp_TLSOff = 9, +RDI_EvalOp_ObjectOff = 10, +RDI_EvalOp_CFA = 11, +RDI_EvalOp_ConstU8 = 12, +RDI_EvalOp_ConstU16 = 13, +RDI_EvalOp_ConstU32 = 14, +RDI_EvalOp_ConstU64 = 15, +RDI_EvalOp_ConstU128 = 16, +RDI_EvalOp_ConstString = 17, +RDI_EvalOp_Abs = 18, +RDI_EvalOp_Neg = 19, +RDI_EvalOp_Add = 20, +RDI_EvalOp_Sub = 21, +RDI_EvalOp_Mul = 22, +RDI_EvalOp_Div = 23, +RDI_EvalOp_Mod = 24, +RDI_EvalOp_LShift = 25, +RDI_EvalOp_RShift = 26, +RDI_EvalOp_BitAnd = 27, +RDI_EvalOp_BitOr = 28, +RDI_EvalOp_BitXor = 29, +RDI_EvalOp_BitNot = 30, +RDI_EvalOp_LogAnd = 31, +RDI_EvalOp_LogOr = 32, +RDI_EvalOp_LogNot = 33, +RDI_EvalOp_EqEq = 34, +RDI_EvalOp_NtEq = 35, +RDI_EvalOp_LsEq = 36, +RDI_EvalOp_GrEq = 37, +RDI_EvalOp_Less = 38, +RDI_EvalOp_Grtr = 39, +RDI_EvalOp_Trunc = 40, +RDI_EvalOp_TruncSigned = 41, +RDI_EvalOp_Convert = 42, +RDI_EvalOp_Pick = 43, +RDI_EvalOp_Pop = 44, +RDI_EvalOp_Insert = 45, +RDI_EvalOp_ValueRead = 46, +RDI_EvalOp_ByteSwap = 47, +RDI_EvalOp_CallSiteValue = 48, +RDI_EvalOp_PartialValue = 49, +RDI_EvalOp_PartialValueBit = 50, +RDI_EvalOp_Swap = 51, +RDI_EvalOp_PushCfa = 52, +RDI_EvalOp_COUNT = 53, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; typedef enum RDI_EvalTypeGroupEnum { - RDI_EvalTypeGroup_Other = 0, - RDI_EvalTypeGroup_U = 1, - RDI_EvalTypeGroup_S = 2, - RDI_EvalTypeGroup_F32 = 3, - RDI_EvalTypeGroup_F64 = 4, - RDI_EvalTypeGroup_F80 = 5, - RDI_EvalTypeGroup_F128 = 6, - RDI_EvalTypeGroup_COUNT = 7, +RDI_EvalTypeGroup_Other = 0, +RDI_EvalTypeGroup_U = 1, +RDI_EvalTypeGroup_S = 2, +RDI_EvalTypeGroup_F32 = 3, +RDI_EvalTypeGroup_F64 = 4, +RDI_EvalTypeGroup_F80 = 5, +RDI_EvalTypeGroup_F128 = 6, +RDI_EvalTypeGroup_COUNT = 7, } RDI_EvalTypeGroupEnum; typedef RDI_U8 RDI_EvalConversionKind; typedef enum RDI_EvalConversionKindEnum { - RDI_EvalConversionKind_Noop = 0, - RDI_EvalConversionKind_Legal = 1, - RDI_EvalConversionKind_OtherToOther = 2, - RDI_EvalConversionKind_ToOther = 3, - RDI_EvalConversionKind_FromOther = 4, - RDI_EvalConversionKind_COUNT = 5, +RDI_EvalConversionKind_Noop = 0, +RDI_EvalConversionKind_Legal = 1, +RDI_EvalConversionKind_OtherToOther = 2, +RDI_EvalConversionKind_ToOther = 3, +RDI_EvalConversionKind_FromOther = 4, +RDI_EvalConversionKind_COUNT = 5, } RDI_EvalConversionKindEnum; typedef RDI_U32 RDI_NameMapKind; typedef enum RDI_NameMapKindEnum { - RDI_NameMapKind_NULL = 0, - RDI_NameMapKind_GlobalVariables = 1, - RDI_NameMapKind_ThreadVariables = 2, - RDI_NameMapKind_Constants = 3, - RDI_NameMapKind_Procedures = 4, - RDI_NameMapKind_Types = 5, - RDI_NameMapKind_LinkNameProcedures = 6, - RDI_NameMapKind_NormalSourcePaths = 7, - RDI_NameMapKind_COUNT = 8, +RDI_NameMapKind_NULL = 0, +RDI_NameMapKind_GlobalVariables = 1, +RDI_NameMapKind_ThreadVariables = 2, +RDI_NameMapKind_Constants = 3, +RDI_NameMapKind_Procedures = 4, +RDI_NameMapKind_Types = 5, +RDI_NameMapKind_LinkNameProcedures = 6, +RDI_NameMapKind_NormalSourcePaths = 7, +RDI_NameMapKind_COUNT = 8, } RDI_NameMapKindEnum; #define RDI_Header_XList \ @@ -524,6 +540,7 @@ X(SourceLineMapRanges, source_line_map_ranges, RDI_U32)\ X(SourceLineMapVOffs, source_line_map_voffs, RDI_U64)\ X(Units, units, RDI_Unit)\ X(UnitVMap, unit_vmap, RDI_VMapEntry)\ +X(Namespaces, namespaces, RDI_Namespace)\ X(TypeNodes, type_nodes, RDI_TypeNode)\ X(UDTs, udts, RDI_UDT)\ X(Members, members, RDI_Member)\ @@ -875,6 +892,11 @@ X(AddrRegPlusU16)\ X(AddrAddrRegPlusU16)\ X(ValReg)\ +#define RDI_Namespace_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_ContainerFlags, container_flags)\ +X(RDI_U32, container_idx)\ + #define RDI_GlobalVariable_XList \ X(RDI_U32, name_string_idx)\ X(RDI_LinkFlags, link_flags)\ @@ -1052,6 +1074,7 @@ typedef struct RDI_U32_SourceLineMapNumbers { RDI_U32 v; } RDI_U32_Source typedef struct RDI_U32_SourceLineMapRanges { RDI_U32 v; } RDI_U32_SourceLineMapRanges; typedef struct RDI_U32_SourceLineMapVOffs { RDI_U32 v; } RDI_U32_SourceLineMapVOffs; typedef struct RDI_U32_Units { RDI_U32 v; } RDI_U32_Units; +typedef struct RDI_U32_Namespaces { RDI_U32 v; } RDI_U32_Namespaces; typedef struct RDI_U32_TypeNodes { RDI_U32 v; } RDI_U32_TypeNodes; typedef struct RDI_U32_UDTs { RDI_U32 v; } RDI_U32_UDTs; typedef struct RDI_U32_Members { RDI_U32 v; } RDI_U32_Members; @@ -1092,6 +1115,7 @@ typedef RDI_U32_Table RDI_U32_SourceLineMapNumbers; typedef RDI_U32_Table RDI_U32_SourceLineMapRanges; typedef RDI_U32_Table RDI_U32_SourceLineMapVOffs; typedef RDI_U32_Table RDI_U32_Units; +typedef RDI_U32_Table RDI_U32_Namespaces; typedef RDI_U32_Table RDI_U32_TypeNodes; typedef RDI_U32_Table RDI_U32_UDTs; typedef RDI_U32_Table RDI_U32_Members; @@ -1126,126 +1150,126 @@ typedef RDI_U32_Table RDI_U32_NameMapNodes; typedef struct RDI_Header RDI_Header; struct RDI_Header { - RDI_U64 magic; - RDI_U32 encoding_version; - RDI_U32 data_section_off; - RDI_U32 data_section_count; +RDI_U64 magic; +RDI_U32 encoding_version; +RDI_U32 data_section_off; +RDI_U32 data_section_count; }; typedef struct RDI_Section RDI_Section; struct RDI_Section { - RDI_SectionEncoding encoding; - RDI_U32 pad; - RDI_U64 off; - RDI_U64 encoded_size; - RDI_U64 unpacked_size; +RDI_SectionEncoding encoding; +RDI_U32 pad; +RDI_U64 off; +RDI_U64 encoded_size; +RDI_U64 unpacked_size; }; typedef struct RDI_VMapEntry RDI_VMapEntry; struct RDI_VMapEntry { - RDI_U64 voff; - RDI_U64 idx; +RDI_U64 voff; +RDI_U64 idx; }; typedef struct RDI_TopLevelInfo RDI_TopLevelInfo; struct RDI_TopLevelInfo { - RDI_Arch arch; - RDI_U32 exe_name_string_idx; - RDI_U64 exe_hash; - RDI_U64 voff_max; - RDI_GUID guid; - RDI_U32 producer_name_string_idx; +RDI_Arch arch; +RDI_U32 exe_name_string_idx; +RDI_U64 exe_hash; +RDI_U64 voff_max; +RDI_GUID guid; +RDI_U32 producer_name_string_idx; }; typedef struct RDI_BinarySection RDI_BinarySection; struct RDI_BinarySection { - RDI_U32 name_string_idx; - RDI_BinarySectionFlags flags; - RDI_U64 voff_first; - RDI_U64 voff_opl; - RDI_U64 foff_first; - RDI_U64 foff_opl; +RDI_U32 name_string_idx; +RDI_BinarySectionFlags flags; +RDI_U64 voff_first; +RDI_U64 voff_opl; +RDI_U64 foff_first; +RDI_U64 foff_opl; }; typedef struct RDI_FilePathNode RDI_FilePathNode; struct RDI_FilePathNode { - RDI_U32 name_string_idx; - RDI_U32 parent_path_node; - RDI_U32 first_child; - RDI_U32 next_sibling; - RDI_U32 source_file_idx; +RDI_U32 name_string_idx; +RDI_U32 parent_path_node; +RDI_U32 first_child; +RDI_U32 next_sibling; +RDI_U32 source_file_idx; }; typedef struct RDI_SourceFile RDI_SourceFile; struct RDI_SourceFile { - RDI_U32 file_path_node_idx; - RDI_U32 normal_full_path_string_idx; - RDI_U32 source_line_map_idx; - RDI_ChecksumKind checksum_kind; - RDI_U32 checksum_idx; +RDI_U32 file_path_node_idx; +RDI_U32 normal_full_path_string_idx; +RDI_U32 source_line_map_idx; +RDI_ChecksumKind checksum_kind; +RDI_U32 checksum_idx; }; typedef struct RDI_Unit RDI_Unit; struct RDI_Unit { - RDI_U32 unit_name_string_idx; - RDI_U32 compiler_name_string_idx; - RDI_U32 source_file_path_node; - RDI_U32 object_file_path_node; - RDI_U32 archive_file_path_node; - RDI_U32 build_path_node; - RDI_Language language; - RDI_U32 line_table_idx; +RDI_U32 unit_name_string_idx; +RDI_U32 compiler_name_string_idx; +RDI_U32 source_file_path_node; +RDI_U32 object_file_path_node; +RDI_U32 archive_file_path_node; +RDI_U32 build_path_node; +RDI_Language language; +RDI_U32 line_table_idx; }; typedef struct RDI_LineTable RDI_LineTable; struct RDI_LineTable { - RDI_U32 voffs_base_idx; - RDI_U32 lines_base_idx; - RDI_U32 cols_base_idx; - RDI_U32 lines_count; - RDI_U32 cols_count; +RDI_U32 voffs_base_idx; +RDI_U32 lines_base_idx; +RDI_U32 cols_base_idx; +RDI_U32 lines_count; +RDI_U32 cols_count; }; typedef struct RDI_Line RDI_Line; struct RDI_Line { - RDI_U32 file_idx; - RDI_U32 line_num; +RDI_U32 file_idx; +RDI_U32 line_num; }; typedef struct RDI_Column RDI_Column; struct RDI_Column { - RDI_U16 col_first; - RDI_U16 col_opl; +RDI_U16 col_first; +RDI_U16 col_opl; }; typedef struct RDI_SourceLineMap RDI_SourceLineMap; struct RDI_SourceLineMap { - RDI_U32 line_count; - RDI_U32 voff_count; - RDI_U32 line_map_nums_base_idx; - RDI_U32 line_map_range_base_idx; - RDI_U32 line_map_voff_base_idx; +RDI_U32 line_count; +RDI_U32 voff_count; +RDI_U32 line_map_nums_base_idx; +RDI_U32 line_map_range_base_idx; +RDI_U32 line_map_voff_base_idx; }; typedef struct RDI_TypeNode RDI_TypeNode; struct RDI_TypeNode { - RDI_TypeKind kind; - RDI_U16 flags; - RDI_U32 byte_size; - - union +RDI_TypeKind kind; +RDI_U16 flags; +RDI_U32 byte_size; + + union { // kind is 'built-in' struct @@ -1292,159 +1316,167 @@ struct RDI_TypeNode typedef struct RDI_UDT RDI_UDT; struct RDI_UDT { - RDI_U32 self_type_idx; - RDI_UDTFlags flags; - RDI_U32 member_first; - RDI_U32 member_count; - RDI_U32 file_idx; - RDI_U32 line; - RDI_U32 col; +RDI_U32 self_type_idx; +RDI_UDTFlags flags; +RDI_U32 member_first; +RDI_U32 member_count; +RDI_U32 file_idx; +RDI_U32 line; +RDI_U32 col; }; typedef struct RDI_Member RDI_Member; struct RDI_Member { - RDI_MemberKind kind; - RDI_U16 pad; - RDI_U32 name_string_idx; - RDI_U32 type_idx; - RDI_U32 off; +RDI_MemberKind kind; +RDI_U16 pad; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 off; }; typedef struct RDI_EnumMember RDI_EnumMember; struct RDI_EnumMember { - RDI_U32 name_string_idx; - RDI_U32 pad; - RDI_U64 val; +RDI_U32 name_string_idx; +RDI_U32 pad; +RDI_U64 val; +}; + +typedef struct RDI_Namespace RDI_Namespace; +struct RDI_Namespace +{ +RDI_U32 name_string_idx; +RDI_ContainerFlags container_flags; +RDI_U32 container_idx; }; typedef struct RDI_GlobalVariable RDI_GlobalVariable; struct RDI_GlobalVariable { - RDI_U32 name_string_idx; - RDI_LinkFlags link_flags; - RDI_U64 voff; - RDI_U32 type_idx; - RDI_U32 container_idx; +RDI_U32 name_string_idx; +RDI_LinkFlags link_flags; +RDI_U64 voff; +RDI_U32 type_idx; +RDI_U32 container_idx; }; typedef struct RDI_ThreadVariable RDI_ThreadVariable; struct RDI_ThreadVariable { - RDI_U32 name_string_idx; - RDI_LinkFlags link_flags; - RDI_U32 tls_off; - RDI_U32 type_idx; - RDI_U32 container_idx; +RDI_U32 name_string_idx; +RDI_LinkFlags link_flags; +RDI_U32 tls_off; +RDI_U32 type_idx; +RDI_U32 container_idx; }; typedef struct RDI_Constant RDI_Constant; struct RDI_Constant { - RDI_U32 name_string_idx; - RDI_U32 type_idx; - RDI_U32 constant_value_idx; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 constant_value_idx; }; typedef struct RDI_Procedure RDI_Procedure; struct RDI_Procedure { - RDI_U32 name_string_idx; - RDI_U32 link_name_string_idx; - RDI_LinkFlags link_flags; - RDI_U32 type_idx; - RDI_U32 root_scope_idx; - RDI_U32 container_idx; - RDI_U32 frame_base_location_first; - RDI_U32 frame_base_location_opl; +RDI_U32 name_string_idx; +RDI_U32 link_name_string_idx; +RDI_LinkFlags link_flags; +RDI_U32 type_idx; +RDI_U32 root_scope_idx; +RDI_U32 container_idx; +RDI_U32 frame_base_location_first; +RDI_U32 frame_base_location_opl; }; typedef struct RDI_Scope RDI_Scope; struct RDI_Scope { - RDI_U32 proc_idx; - RDI_U32 parent_scope_idx; - RDI_U32 first_child_scope_idx; - RDI_U32 next_sibling_scope_idx; - RDI_U32 voff_range_first; - RDI_U32 voff_range_opl; - RDI_U32 local_first; - RDI_U32 local_count; - RDI_U32 inline_site_idx; +RDI_U32 proc_idx; +RDI_U32 parent_scope_idx; +RDI_U32 first_child_scope_idx; +RDI_U32 next_sibling_scope_idx; +RDI_U32 voff_range_first; +RDI_U32 voff_range_opl; +RDI_U32 local_first; +RDI_U32 local_count; +RDI_U32 inline_site_idx; }; typedef struct RDI_InlineSite RDI_InlineSite; struct RDI_InlineSite { - RDI_U32 name_string_idx; - RDI_U32 type_idx; - RDI_U32 owner_type_idx; - RDI_U32 line_table_idx; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 owner_type_idx; +RDI_U32 line_table_idx; }; typedef struct RDI_Local RDI_Local; struct RDI_Local { - RDI_LocalKind kind; - RDI_U32 name_string_idx; - RDI_U32 type_idx; - RDI_U32 pad; - RDI_U32 location_first; - RDI_U32 location_opl; +RDI_LocalKind kind; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 pad; +RDI_U32 location_first; +RDI_U32 location_opl; }; typedef struct RDI_LocationBlock RDI_LocationBlock; struct RDI_LocationBlock { - RDI_U32 scope_off_first; - RDI_U32 scope_off_opl; - RDI_U32 location_data_off; +RDI_U32 scope_off_first; +RDI_U32 scope_off_opl; +RDI_U32 location_data_off; }; typedef struct RDI_LocationBytecodeStream RDI_LocationBytecodeStream; struct RDI_LocationBytecodeStream { - RDI_LocationKind kind; +RDI_LocationKind kind; }; typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16; struct RDI_LocationRegPlusU16 { - RDI_LocationKind kind; - RDI_RegCode reg_code; - RDI_U16 offset; +RDI_LocationKind kind; +RDI_RegCode reg_code; +RDI_U16 offset; }; typedef struct RDI_LocationReg RDI_LocationReg; struct RDI_LocationReg { - RDI_LocationKind kind; - RDI_RegCode reg_code; +RDI_LocationKind kind; +RDI_RegCode reg_code; }; typedef struct RDI_NameMap RDI_NameMap; struct RDI_NameMap { - RDI_U32 bucket_base_idx; - RDI_U32 node_base_idx; - RDI_U32 bucket_count; - RDI_U32 node_count; +RDI_U32 bucket_base_idx; +RDI_U32 node_base_idx; +RDI_U32 bucket_count; +RDI_U32 node_count; }; typedef struct RDI_NameMapBucket RDI_NameMapBucket; struct RDI_NameMapBucket { - RDI_U32 first_node; - RDI_U32 node_count; +RDI_U32 first_node; +RDI_U32 node_count; }; typedef struct RDI_NameMapNode RDI_NameMapNode; struct RDI_NameMapNode { - RDI_U32 string_idx; - RDI_U32 match_count; - RDI_U32 match_idx_or_idx_run_first; +RDI_U32 string_idx; +RDI_U32 match_count; +RDI_U32 match_idx_or_idx_run_first; }; typedef RDI_TopLevelInfo RDI_SectionElementType_TopLevelInfo; @@ -1464,6 +1496,7 @@ typedef RDI_U32 RDI_SectionElementType_SourceLineMapRan typedef RDI_U64 RDI_SectionElementType_SourceLineMapVOffs; typedef RDI_Unit RDI_SectionElementType_Units; typedef RDI_VMapEntry RDI_SectionElementType_UnitVMap; +typedef RDI_Namespace RDI_SectionElementType_Namespaces; typedef RDI_TypeNode RDI_SectionElementType_TypeNodes; typedef RDI_UDT RDI_SectionElementType_UDTs; typedef RDI_Member RDI_SectionElementType_Members; @@ -1498,7 +1531,7 @@ RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_Eva RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); -extern RDI_U16 rdi_section_element_size_table[44]; +extern RDI_U16 rdi_section_element_size_table[45]; extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; #endif // RDI_H diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 6537fca1..413033aa 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -806,6 +806,29 @@ rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList RDIM_IdxedChunkListConcatInPlace(RDIM_UnitChunkNode, dst, to_push); } +//////////////////////////////// +//~ rjf: [Building] Namespace Info Building + +RDI_PROC RDIM_Namespace * +rdim_namespace_chunk_list_push(RDIM_Arena *arena, RDIM_NamespaceChunkList *list, RDI_U64 cap) +{ + RDIM_IdxedChunkListPush(arena, list, RDIM_NamespaceChunkNode, RDIM_Namespace, cap, result); + return result; +} + +RDI_PROC RDI_U64 +rdim_idx_from_namespace(RDIM_Namespace *ns) +{ + RDIM_IdxedChunkListElementGetIdx(ns, idx); + return idx; +} + +RDI_PROC void +rdim_namespace_chunk_list_concat_in_place(RDIM_NamespaceChunkList *dst, RDIM_NamespaceChunkList *to_push) +{ + RDIM_IdxedChunkListConcatInPlace(RDIM_NamespaceChunkNode, dst, to_push); +} + //////////////////////////////// //~ rjf: [Building] Type Info Building @@ -2162,6 +2185,7 @@ rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results) bundle.sections[RDI_SectionKind_SourceLineMapVOffs] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_voffs, results->src_files.source_line_map_voffs_count); bundle.sections[RDI_SectionKind_Units] = rdim_serialized_section_make_unpacked_array(results->units.units, results->units.units_count); bundle.sections[RDI_SectionKind_UnitVMap] = rdim_serialized_section_make_unpacked_array(results->unit_vmap.vmap.vmap, results->unit_vmap.vmap.count); + bundle.sections[RDI_SectionKind_Namespaces] = rdim_serialized_section_make_unpacked_array(results->namespaces.namespaces, results->namespaces.namespaces_count); bundle.sections[RDI_SectionKind_TypeNodes] = rdim_serialized_section_make_unpacked_array(results->type_nodes.type_nodes, results->type_nodes.type_nodes_count); bundle.sections[RDI_SectionKind_UDTs] = rdim_serialized_section_make_unpacked_array(results->udts.udts, results->udts.udts_count); bundle.sections[RDI_SectionKind_Members] = rdim_serialized_section_make_unpacked_array(results->udts.members, results->udts.members_count); diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 70a82105..6ef897af 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -665,6 +665,38 @@ struct RDIM_UnitChunkList RDI_U64 total_count; }; +//////////////////////////////// +//~ rjf: Namespace Types + +typedef struct RDIM_Namespace RDIM_Namespace; +struct RDIM_Namespace +{ + struct RDIM_NamespaceChunkNode *chunk; + RDIM_Namespace *parent_namespace; + struct RDIM_Scope *parent_scope; + struct RDIM_UDT *parent_udt; + RDIM_String8 name; +}; + +typedef struct RDIM_NamespaceChunkNode RDIM_NamespaceChunkNode; +struct RDIM_NamespaceChunkNode +{ + RDIM_NamespaceChunkNode *next; + RDIM_Namespace *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_NamespaceChunkList RDIM_NamespaceChunkList; +struct RDIM_NamespaceChunkList +{ + RDIM_NamespaceChunkNode *first; + RDIM_NamespaceChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + //////////////////////////////// //~ rjf: Type System Node Types @@ -1010,6 +1042,7 @@ struct RDIM_BakeParams RDIM_TopLevelInfo top_level_info; RDIM_BinarySectionList binary_sections; RDIM_UnitChunkList units; + RDIM_NamespaceChunkList namespaces; RDIM_TypeChunkList types; RDIM_UDTChunkList udts; RDIM_SrcFileChunkList src_files; @@ -1349,6 +1382,13 @@ struct RDIM_LineTableBakeResult RDI_U64 line_table_columns_count; }; +typedef struct RDIM_NamespaceBakeResult RDIM_NamespaceBakeResult; +struct RDIM_NamespaceBakeResult +{ + RDI_Namespace *namespaces; + RDI_U64 namespaces_count; +}; + typedef struct RDIM_TypeNodeBakeResult RDIM_TypeNodeBakeResult; struct RDIM_TypeNodeBakeResult { @@ -1492,6 +1532,7 @@ struct RDIM_BakeResults RDIM_SrcFileBakeResult src_files; RDIM_ChecksumBakeResult checksums; RDIM_LineTableBakeResult line_tables; + RDIM_NamespaceBakeResult namespaces; RDIM_TypeNodeBakeResult type_nodes; RDIM_UDTBakeResult udts; RDIM_GlobalVariableBakeResult global_variables; @@ -1626,6 +1667,13 @@ RDI_PROC RDIM_Unit *rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkL RDI_PROC RDI_U64 rdim_idx_from_unit(RDIM_Unit *unit); RDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push); +//////////////////////////////// +//~ rjf: [Building] Namespace Info Building + +RDI_PROC RDIM_Namespace *rdim_namespace_chunk_list_push(RDIM_Arena *arena, RDIM_NamespaceChunkList *list, RDI_U64 cap); +RDI_PROC RDI_U64 rdim_idx_from_namespace(RDIM_Namespace *ns); +RDI_PROC void rdim_namespace_chunk_list_concat_in_place(RDIM_NamespaceChunkList *dst, RDIM_NamespaceChunkList *to_push); + //////////////////////////////// //~ rjf: [Building] Type Info & UDT Building @@ -1757,9 +1805,4 @@ RDI_PROC RDIM_SerializedSection rdim_serialized_section_make_unpacked(void *data RDI_PROC RDIM_SerializedSectionBundle rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results); RDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle); -//////////////////////////////// -//~ rjf: [Serializing] Parsed RDI -> Bake Results - -RDI_PROC RDIM_BakeResults *rdim_bake_results_from_rdi(RDIM_Arena *arena, RDI_Parsed *rdi); - #endif // RDI_MAKE_H diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index f194532b..32188395 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -77,7 +77,7 @@ ""; "// \"raddbg\\0\\0\""; "#define RDI_MAGIC_CONSTANT 0x0000676264646172"; - "#define RDI_ENCODING_VERSION 18"; + "#define RDI_ENCODING_VERSION 19"; ""; "////////////////////////////////////////////////////////////////"; "//~ Format Types & Functions"; @@ -153,32 +153,33 @@ RDI_SectionTable: {SourceLineMapVOffs source_line_map_voffs RDI_U64 0x000F U32 ""} {Units units RDI_Unit 0x0010 U32 ""} {UnitVMap unit_vmap RDI_VMapEntry 0x0011 - ""} - {TypeNodes type_nodes RDI_TypeNode 0x0012 U32 ""} - {UDTs udts RDI_UDT 0x0013 U32 ""} - {Members members RDI_Member 0x0014 U32 ""} - {EnumMembers enum_members RDI_EnumMember 0x0015 U32 ""} - {GlobalVariables global_variables RDI_GlobalVariable 0x0016 U32 ""} - {GlobalVMap global_vmap RDI_VMapEntry 0x0017 - ""} - {ThreadVariables thread_variables RDI_ThreadVariable 0x0018 U32 ""} - {Constants constants RDI_Constant 0x0019 U32 ""} - {Procedures procedures RDI_Procedure 0x001A U32 ""} - {Scopes scopes RDI_Scope 0x001B U32 ""} - {ScopeVOffData scope_voff_data RDI_U64 0x001C U32 ""} - {ScopeVMap scope_vmap RDI_VMapEntry 0x001D - ""} - {InlineSites inline_sites RDI_InlineSite 0x001E U32 ""} - {Locals locals RDI_Local 0x001F U32 ""} - {LocationBlocks location_blocks RDI_LocationBlock 0x0020 U32 ""} - {LocationData location_data RDI_U8 0x0021 U32 ""} - {ConstantValueData constant_value_data RDI_U8 0x0022 U32 ""} - {ConstantValueTable constant_value_table RDI_U32 0x0023 U32 ""} - {MD5Checksums md5_checksums RDI_MD5 0x0024 U32 ""} - {SHA1Checksums sha1_checksums RDI_SHA1 0x0025 U32 ""} - {SHA256Checksums sha256_checksums RDI_SHA256 0x0026 U32 ""} - {Timestamps timestamps RDI_U64 0x0027 U32 ""} - {NameMaps name_maps RDI_NameMap 0x0028 U32 ""} - {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x0029 U32 ""} - {NameMapNodes name_map_nodes RDI_NameMapNode 0x002A U32 ""} - {COUNT count RDI_U8 0x002B - ""} + {Namespaces namespaces RDI_Namespace 0x0012 U32 ""} + {TypeNodes type_nodes RDI_TypeNode 0x0013 U32 ""} + {UDTs udts RDI_UDT 0x0014 U32 ""} + {Members members RDI_Member 0x0015 U32 ""} + {EnumMembers enum_members RDI_EnumMember 0x0016 U32 ""} + {GlobalVariables global_variables RDI_GlobalVariable 0x0017 U32 ""} + {GlobalVMap global_vmap RDI_VMapEntry 0x0018 - ""} + {ThreadVariables thread_variables RDI_ThreadVariable 0x0019 U32 ""} + {Constants constants RDI_Constant 0x001A U32 ""} + {Procedures procedures RDI_Procedure 0x001B U32 ""} + {Scopes scopes RDI_Scope 0x001C U32 ""} + {ScopeVOffData scope_voff_data RDI_U64 0x001D U32 ""} + {ScopeVMap scope_vmap RDI_VMapEntry 0x001E - ""} + {InlineSites inline_sites RDI_InlineSite 0x001F U32 ""} + {Locals locals RDI_Local 0x0020 U32 ""} + {LocationBlocks location_blocks RDI_LocationBlock 0x0021 U32 ""} + {LocationData location_data RDI_U8 0x0022 U32 ""} + {ConstantValueData constant_value_data RDI_U8 0x0023 U32 ""} + {ConstantValueTable constant_value_table RDI_U32 0x0024 U32 ""} + {MD5Checksums md5_checksums RDI_MD5 0x0025 U32 ""} + {SHA1Checksums sha1_checksums RDI_SHA1 0x0026 U32 ""} + {SHA256Checksums sha256_checksums RDI_SHA256 0x0027 U32 ""} + {Timestamps timestamps RDI_U64 0x0028 U32 ""} + {NameMaps name_maps RDI_NameMap 0x0029 U32 ""} + {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x002A U32 ""} + {NameMapNodes name_map_nodes RDI_NameMapNode 0x002B U32 ""} + {COUNT count RDI_U8 0x002C - ""} } @table(name value) @@ -943,6 +944,20 @@ RDI_EnumMemberTable: //- rjf: tables +@table(name value) +RDI_ContainerKindTable: +{ + {Type 0x0} + {Scope 0x1} + {Namespace 0x2} +} + +@table(name value) +RDI_ContainerFlagTable: +{ + {External `1<<8`} +} + @table(name value) RDI_LinkFlagTable: { @@ -970,6 +985,14 @@ RDI_LocationKindTable: {ValReg 0x5} } +@table(name type desc) +RDI_NamespaceMemberTable: +{ + {name_string_idx RDI_U32 ""} + {container_flags RDI_ContainerFlags ""} + {container_idx RDI_U32 ""} +} + @table(name type desc) RDI_GlobalVariableMemberTable: { @@ -1077,6 +1100,17 @@ RDI_LocationRegMemberTable: //- rjf: enums +@enum(RDI_U8) RDI_ContainerKind: +{ + @expand(RDI_ContainerKindTable a) `$(a.name .. =>20) = $(a.value)` +} + +@enum(RDI_U32) RDI_ContainerFlags: +{ + @expand(RDI_ContainerFlagTable a) `$(a.name .. =>20) = $(a.value)`, + `KindMask = 0xff`, +} + @enum(RDI_U32) RDI_LinkFlags: { @expand(RDI_LinkFlagTable a) `$(a.name .. =>20) = $(a.value)` @@ -1109,6 +1143,11 @@ RDI_LocationRegMemberTable: @expand(RDI_LocationKindTable a) `$(a.name != COUNT -> a.name)`; } +@xlist RDI_Namespace_XList: +{ + @expand(RDI_NamespaceMemberTable a) `$(a.type), $(a.name)` +} + @xlist RDI_GlobalVariable_XList: { @expand(RDI_GlobalVariableMemberTable a) `$(a.type), $(a.name)` @@ -1161,6 +1200,11 @@ RDI_LocationRegMemberTable: //- rjf: structs +@struct RDI_Namespace: +{ + @expand(RDI_NamespaceMemberTable a) `$(a.type) $(a.name)` +} + @struct RDI_GlobalVariable: { @expand(RDI_GlobalVariableMemberTable a) `$(a.type) $(a.name)` diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index d4790190..3112eb07 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1110,6 +1110,19 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } + // rjf: push strings from namespaces + ProfScope("namespaces") + { + for EachNode(n, RDIM_NamespaceChunkNode, params->namespaces.first) + { + Rng1U64 range = lane_range(n->count); + for EachInRange(n_idx, range) + { + rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].name); + } + } + } + // rjf: push strings from types ProfScope("types") { From 8db4a09941ce389a5087c0221dad54b31b59f2f9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 9 Mar 2026 11:56:43 -0700 Subject: [PATCH 275/850] eliminate global rdim_shared; just use scratch data --- src/rdi_from_pdb/rdi_from_pdb.c | 7 +- src/rdi_make/rdi_make_local.c | 857 +++++++++++++++++++------------- src/rdi_make/rdi_make_local.h | 100 ---- 3 files changed, 513 insertions(+), 451 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 549a8fe4..c84ea125 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -2601,6 +2601,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } } + //- rjf: gather namespaces + { + + } + //- rjf: store finalized type to this itype's slot itype_type_ptrs[itype] = dst_type; } @@ -4358,7 +4363,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { rdim_type_chunk_list_concat_in_place(all_types__pre_typedefs_ptr, &syms_typedefs[idx]); } - *all_types_ptr = all_types__pre_typedefs; + *all_types_ptr = *all_types__pre_typedefs_ptr; } lane_sync(); all_locations = *all_locations_ptr; diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 3112eb07..2bd1015e 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -279,18 +279,23 @@ rdim_loose_from_rdi(Arena *arena, RDIM_SubsetFlags subset_flags, RDI_Parsed *rdi internal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params) { - ////////////////////////////////////////////////////////////// - //- rjf: set up shared state - // - if(lane_idx() == 0) - { - rdim_shared = push_array(arena, RDIM_Shared, 1); - } - lane_sync(); + Temp scratch = scratch_begin(&arena, 1); ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake vmaps // + RDIM_ScopeVMapBakeResult *baked_scope_vmap = 0; + RDIM_UnitVMapBakeResult *baked_unit_vmap = 0; + RDIM_GlobalVMapBakeResult *baked_global_vmap = 0; + if(lane_idx() == 0) + { + baked_scope_vmap = push_array(scratch.arena, RDIM_ScopeVMapBakeResult, 1); + baked_unit_vmap = push_array(scratch.arena, RDIM_UnitVMapBakeResult, 1); + baked_global_vmap = push_array(scratch.arena, RDIM_GlobalVMapBakeResult, 1); + } + lane_sync_u64(&baked_scope_vmap, 0); + lane_sync_u64(&baked_unit_vmap, 0); + lane_sync_u64(&baked_global_vmap, 0); ProfScope("bake vmaps") { Temp scratch = scratch_begin(&arena, 1); @@ -582,9 +587,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } vmap_tasks[] = { - {str8_lit_comp("scopes"), scope_vmap_records, scope_vmap_records_count, &rdim_shared->baked_scope_vmap.vmap.vmap, &rdim_shared->baked_scope_vmap.vmap.count}, - {str8_lit_comp("globals"), global_vmap_records, global_vmap_records_count, &rdim_shared->baked_global_vmap.vmap.vmap, &rdim_shared->baked_global_vmap.vmap.count}, - {str8_lit_comp("units"), unit_vmap_records, unit_vmap_records_count, &rdim_shared->baked_unit_vmap.vmap.vmap, &rdim_shared->baked_unit_vmap.vmap.count}, + {str8_lit_comp("scopes"), scope_vmap_records, scope_vmap_records_count, &baked_scope_vmap->vmap.vmap, &baked_scope_vmap->vmap.count}, + {str8_lit_comp("globals"), global_vmap_records, global_vmap_records_count, &baked_global_vmap->vmap.vmap, &baked_global_vmap->vmap.count}, + {str8_lit_comp("units"), unit_vmap_records, unit_vmap_records_count, &baked_unit_vmap->vmap.vmap, &baked_unit_vmap->vmap.count}, }; ProfScope("sort & bake all vmaps") { @@ -810,11 +815,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage build interned path tree // + RDIM_BakePathTree *path_tree = 0; if(lane_idx() == 0) ProfScope("build interned path tree") { //- rjf: set up tree - RDIM_BakePathTree *tree = rdim_push_array(arena, RDIM_BakePathTree, 1); - rdim_bake_path_tree_insert(arena, tree, rdim_str8_lit("")); + path_tree = rdim_push_array(arena, RDIM_BakePathTree, 1); + rdim_bake_path_tree_insert(arena, path_tree, rdim_str8_lit("")); //- rjf: bake unit file paths RDIM_ProfScope("bake unit file paths") @@ -823,10 +829,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - rdim_bake_path_tree_insert(arena, tree, n->v[idx].source_file); - rdim_bake_path_tree_insert(arena, tree, n->v[idx].object_file); - rdim_bake_path_tree_insert(arena, tree, n->v[idx].archive_file); - rdim_bake_path_tree_insert(arena, tree, n->v[idx].build_path); + rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].source_file); + rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].object_file); + rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].archive_file); + rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].build_path); } } } @@ -838,20 +844,22 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - RDIM_BakePathNode *node = rdim_bake_path_tree_insert(arena, tree, n->v[idx].path); + RDIM_BakePathNode *node = rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].path); node->src_file = &n->v[idx]; } } } - - rdim_shared->path_tree = tree; } - lane_sync(); - RDIM_BakePathTree *path_tree = rdim_shared->path_tree; + lane_sync_u64(&path_tree, 0); ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage gather all unsorted, joined, line table info; & sort // + U64 line_tables_count = 0; + RDIM_LineTable **src_line_tables = 0; + RDIM_UnsortedJoinedLineTable *unsorted_joined_line_tables = 0; + RDIM_SortKey **sorted_line_table_keys = 0; + RDIM_LineTableBakeResult *baked_line_tables = 0; ProfScope("gather all unsorted, joined, line table info; & sort") { //- rjf: set up outputs @@ -860,8 +868,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: calculate header info if(lane_idx() == 0) { - rdim_shared->line_tables_count = params->line_tables.total_count; - rdim_shared->src_line_tables = push_array(arena, RDIM_LineTable *, rdim_shared->line_tables_count); + line_tables_count = params->line_tables.total_count; + src_line_tables = push_array(arena, RDIM_LineTable *, line_tables_count); ProfScope("flatten chunk list") { U64 joined_idx = 0; @@ -869,43 +877,45 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for EachIndex(idx, n->count) { - rdim_shared->src_line_tables[joined_idx] = &n->v[idx]; + src_line_tables[joined_idx] = &n->v[idx]; joined_idx += 1; } } } - rdim_shared->baked_line_tables.line_tables_count = params->line_tables.total_count + 1; - rdim_shared->baked_line_tables.line_table_voffs_count = params->line_tables.total_line_count + 2*params->line_tables.total_seq_count; - rdim_shared->baked_line_tables.line_table_lines_count = params->line_tables.total_line_count + params->line_tables.total_seq_count; - rdim_shared->baked_line_tables.line_table_columns_count= 1; - rdim_shared->line_table_block_take_counter = 0; + baked_line_tables = push_array(scratch.arena, RDIM_LineTableBakeResult, 1); + baked_line_tables->line_tables_count = params->line_tables.total_count + 1; + baked_line_tables->line_table_voffs_count = params->line_tables.total_line_count + 2*params->line_tables.total_seq_count; + baked_line_tables->line_table_lines_count = params->line_tables.total_line_count + params->line_tables.total_seq_count; + baked_line_tables->line_table_columns_count= 1; } - lane_sync(); + lane_sync_u64(&line_tables_count, 0); + lane_sync_u64(&src_line_tables, 0); + lane_sync_u64(&baked_line_tables, 0); // rjf: allocate outputs ProfScope("allocate outputs") { if(lane_idx() == lane_from_task_idx(0)) { - rdim_shared->unsorted_joined_line_tables = push_array(arena, RDIM_UnsortedJoinedLineTable, rdim_shared->line_tables_count); + unsorted_joined_line_tables = push_array(arena, RDIM_UnsortedJoinedLineTable, line_tables_count); } if(lane_idx() == lane_from_task_idx(1)) { - rdim_shared->sorted_line_table_keys = push_array(arena, RDIM_SortKey *, rdim_shared->line_tables_count); + sorted_line_table_keys = push_array(arena, RDIM_SortKey *, line_tables_count); } if(lane_idx() == lane_from_task_idx(2)) { - rdim_shared->baked_line_tables.line_tables = push_array(arena, RDI_LineTable, rdim_shared->baked_line_tables.line_tables_count); + baked_line_tables->line_tables = push_array(arena, RDI_LineTable, baked_line_tables->line_tables_count); ProfScope("lay out line tables") { U64 voffs_base_idx = 0; U64 lines_base_idx = 0; U64 cols_base_idx = 0; - for EachIndex(idx, rdim_shared->line_tables_count) + for EachIndex(idx, line_tables_count) { U64 final_idx = idx+1; // NOTE(rjf): +1, to reserve [0] for nil - RDIM_LineTable *src = rdim_shared->src_line_tables[idx]; - RDI_LineTable *dst = &rdim_shared->baked_line_tables.line_tables[final_idx]; + RDIM_LineTable *src = src_line_tables[idx]; + RDI_LineTable *dst = &baked_line_tables->line_tables[final_idx]; dst->voffs_base_idx = voffs_base_idx; // TODO(rjf): @u64_to_u32 dst->lines_base_idx = lines_base_idx; // TODO(rjf): @u64_to_u32 dst->cols_base_idx = cols_base_idx; // TODO(rjf): @u64_to_u32 @@ -917,39 +927,43 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } if(lane_idx() == lane_from_task_idx(3)) { - rdim_shared->baked_line_tables.line_table_voffs = push_array(arena, RDI_U64, rdim_shared->baked_line_tables.line_table_voffs_count); + baked_line_tables->line_table_voffs = push_array(arena, RDI_U64, baked_line_tables->line_table_voffs_count); } if(lane_idx() == lane_from_task_idx(4)) { - rdim_shared->baked_line_tables.line_table_lines = push_array(arena, RDI_Line, rdim_shared->baked_line_tables.line_table_lines_count); + baked_line_tables->line_table_lines = push_array(arena, RDI_Line, baked_line_tables->line_table_lines_count); } if(lane_idx() == lane_from_task_idx(5)) { - rdim_shared->baked_line_tables.line_table_columns = push_array(arena, RDI_Column, rdim_shared->baked_line_tables.line_table_columns_count); + baked_line_tables->line_table_columns = push_array(arena, RDI_Column, baked_line_tables->line_table_columns_count); } } } - lane_sync(); + lane_sync_u64(&unsorted_joined_line_tables, lane_from_task_idx(0)); + lane_sync_u64(&sorted_line_table_keys, lane_from_task_idx(1)); //- rjf: wide bake ProfScope("wide bake") { + U64 line_table_block_take_counter_ = 0; + U64 *line_table_block_take_counter = &line_table_block_take_counter_; + lane_sync_u64(&line_table_block_take_counter, 0); U64 line_table_block_size = 4096; - U64 line_table_block_count = (rdim_shared->line_tables_count + line_table_block_size - 1) / line_table_block_size; + U64 line_table_block_count = (line_tables_count + line_table_block_size - 1) / line_table_block_size; for(;;) { - U64 line_table_block_num = ins_atomic_u64_inc_eval(&rdim_shared->line_table_block_take_counter); + U64 line_table_block_num = ins_atomic_u64_inc_eval(line_table_block_take_counter); if(0 == line_table_block_num || line_table_block_count < line_table_block_num) { break; } U64 line_table_block_idx = line_table_block_num-1; Rng1U64 line_table_range = r1u64(line_table_block_idx*line_table_block_size, (line_table_block_idx+1)*line_table_block_size); - line_table_range.max = Min(rdim_shared->line_tables_count, line_table_range.max); + line_table_range.max = Min(line_tables_count, line_table_range.max); for EachInRange(line_table_idx, line_table_range) { - RDIM_LineTable *src = rdim_shared->src_line_tables[line_table_idx]; - RDIM_UnsortedJoinedLineTable *dst = &rdim_shared->unsorted_joined_line_tables[line_table_idx]; + RDIM_LineTable *src = src_line_tables[line_table_idx]; + RDIM_UnsortedJoinedLineTable *dst = &unsorted_joined_line_tables[line_table_idx]; //- rjf: gather dst->line_count = src->line_count; @@ -984,17 +998,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } //- rjf: sort - rdim_shared->sorted_line_table_keys[line_table_idx] = rdim_sort_key_array(arena, - rdim_shared->unsorted_joined_line_tables[line_table_idx].line_keys, - rdim_shared->unsorted_joined_line_tables[line_table_idx].key_count); + sorted_line_table_keys[line_table_idx] = rdim_sort_key_array(arena, + unsorted_joined_line_tables[line_table_idx].line_keys, + unsorted_joined_line_tables[line_table_idx].key_count); //- rjf: fill - RDIM_SortKey *sorted_line_keys = rdim_shared->sorted_line_table_keys[line_table_idx]; - U64 sorted_line_keys_count = rdim_shared->unsorted_joined_line_tables[line_table_idx].key_count; - RDI_LineTable *dst_line_table = &rdim_shared->baked_line_tables.line_tables[line_table_idx+1]; - U64 *arranged_voffs = rdim_shared->baked_line_tables.line_table_voffs + dst_line_table->voffs_base_idx; - RDI_Line *arranged_lines = rdim_shared->baked_line_tables.line_table_lines + dst_line_table->lines_base_idx; - RDI_Column *arranged_cols = rdim_shared->baked_line_tables.line_table_columns + dst_line_table->cols_base_idx; + RDIM_SortKey *sorted_line_keys = sorted_line_table_keys[line_table_idx]; + U64 sorted_line_keys_count = unsorted_joined_line_tables[line_table_idx].key_count; + RDI_LineTable *dst_line_table = &baked_line_tables->line_tables[line_table_idx+1]; + U64 *arranged_voffs = baked_line_tables->line_table_voffs + dst_line_table->voffs_base_idx; + RDI_Line *arranged_lines = baked_line_tables->line_table_lines + dst_line_table->lines_base_idx; + RDI_Column *arranged_cols = baked_line_tables->line_table_columns + dst_line_table->cols_base_idx; if(sorted_line_keys_count > 0) { for EachIndex(idx, sorted_line_keys_count) @@ -1022,17 +1036,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } lane_sync(); - RDI_U64 line_tables_count = rdim_shared->line_tables_count; - RDIM_LineTable **src_line_tables = rdim_shared->src_line_tables; - RDIM_UnsortedJoinedLineTable *unsorted_joined_line_tables = rdim_shared->unsorted_joined_line_tables; - RDIM_SortKey **sorted_line_table_keys = rdim_shared->sorted_line_table_keys; ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage build string map // + RDIM_BakeStringMapTight *bake_strings = 0; ProfScope("build string map") { - Temp scratch = scratch_begin(&arena, 1); + Temp scratch2 = scratch_begin(&scratch.arena, 1); //- rjf: set up per-lane outputs RDIM_BakeStringMapTopology *top = 0; @@ -1040,15 +1051,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_BakeStringMapLoose *map__loose = 0; if(lane_idx() == 0) ProfScope("set up per-lane outputs") { - top = push_array(scratch.arena, RDIM_BakeStringMapTopology, 1); + bake_strings = push_array(scratch.arena, RDIM_BakeStringMapTight, 1); + top = push_array(scratch2.arena, RDIM_BakeStringMapTopology, 1); top->slots_count = (64 + params->procedures.total_count*1 + params->global_variables.total_count*1 + params->thread_variables.total_count*1 + params->types.total_count/2); - lane_maps__loose = push_array(scratch.arena, RDIM_BakeStringMapLoose *, lane_count()); - map__loose = rdim_bake_string_map_loose_make(scratch.arena, top); + lane_maps__loose = push_array(scratch2.arena, RDIM_BakeStringMapLoose *, lane_count()); + map__loose = rdim_bake_string_map_loose_make(scratch2.arena, top); } + lane_sync_u64(&bake_strings, 0); lane_sync_u64(&top, 0); lane_sync_u64(&lane_maps__loose, 0); lane_sync_u64(&map__loose, 0); @@ -1056,7 +1069,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: set up this lane's map ProfScope("set up this lane's map") { - lane_maps__loose[lane_idx()] = rdim_bake_string_map_loose_make(scratch.arena, top); + lane_maps__loose[lane_idx()] = rdim_bake_string_map_loose_make(scratch2.arena, top); } RDIM_BakeStringMapLoose *lane_map = lane_maps__loose[lane_idx()]; @@ -1256,29 +1269,28 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) ProfScope("calc base indices, set up tight map") { RDIM_BakeStringMapBaseIndices bake_string_map_base_indices = rdim_bake_string_map_base_indices_from_map_loose(arena, top, map); - rdim_shared->bake_strings.slots_count = top->slots_count; - rdim_shared->bake_strings.slots = rdim_push_array(arena, RDIM_BakeStringChunkList, rdim_shared->bake_strings.slots_count); - rdim_shared->bake_strings.slots_base_idxs = bake_string_map_base_indices.slots_base_idxs; - rdim_shared->bake_strings.total_count = rdim_shared->bake_strings.slots_base_idxs[rdim_shared->bake_strings.slots_count]; + bake_strings->slots_count = top->slots_count; + bake_strings->slots = rdim_push_array(arena, RDIM_BakeStringChunkList, bake_strings->slots_count); + bake_strings->slots_base_idxs = bake_string_map_base_indices.slots_base_idxs; + bake_strings->total_count = bake_strings->slots_base_idxs[bake_strings->slots_count]; } lane_sync(); ProfScope("fill tight map") { - Rng1U64 slot_range = lane_range(rdim_shared->bake_strings.slots_count); + Rng1U64 slot_range = lane_range(bake_strings->slots_count); for EachInRange(idx, slot_range) { if(map->slots[idx] != 0) { - rdim_memcpy_struct(&rdim_shared->bake_strings.slots[idx], map->slots[idx]); + rdim_memcpy_struct(&bake_strings->slots[idx], map->slots[idx]); } } } } lane_sync(); - scratch_end(scratch); + scratch_end(scratch2); } - RDIM_BakeStringMapTight *bake_strings = &rdim_shared->bake_strings; ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage build name maps @@ -1456,6 +1468,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage build index runs // + RDIM_BakeIdxRunMap *bake_idx_runs = 0; + if(lane_idx() == 0) + { + bake_idx_runs = push_array(scratch.arena, RDIM_BakeIdxRunMap, 1); + } + lane_sync_u64(&bake_idx_runs, 0); B32 need_index_runs = (!!(params->subset_flags & RDIM_SubsetFlag_NameMaps) || !!(params->subset_flags & RDIM_SubsetFlag_Types)); if(need_index_runs) ProfScope("build index runs") @@ -1659,29 +1677,29 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_BakeIdxRunMapLoose *map = map__loose; if(lane_idx() == 0) ProfScope("calc base indices, set up tight map") { - rdim_shared->bake_idx_runs.slots_count = top->slots_count; - rdim_shared->bake_idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunChunkList, rdim_shared->bake_idx_runs.slots_count); - rdim_shared->bake_idx_runs.slots_base_idxs = rdim_push_array(arena, RDI_U64, rdim_shared->bake_idx_runs.slots_count+1); + bake_idx_runs->slots_count = top->slots_count; + bake_idx_runs->slots = rdim_push_array(arena, RDIM_BakeIdxRunChunkList, bake_idx_runs->slots_count); + bake_idx_runs->slots_base_idxs = rdim_push_array(arena, RDI_U64, bake_idx_runs->slots_count+1); RDI_U64 encoding_idx_off = 0; for(RDI_U64 slot_idx = 0; slot_idx < top->slots_count; slot_idx += 1) { - rdim_shared->bake_idx_runs.slots_base_idxs[slot_idx] = encoding_idx_off; + bake_idx_runs->slots_base_idxs[slot_idx] = encoding_idx_off; if(map->slots[slot_idx] != 0) { encoding_idx_off += map->slots_idx_counts[slot_idx]; } } - rdim_shared->bake_idx_runs.slots_base_idxs[top->slots_count] = encoding_idx_off; + bake_idx_runs->slots_base_idxs[top->slots_count] = encoding_idx_off; } lane_sync(); ProfScope("fill tight map") { - Rng1U64 slot_range = lane_range(rdim_shared->bake_idx_runs.slots_count); + Rng1U64 slot_range = lane_range(bake_idx_runs->slots_count); for EachInRange(idx, slot_range) { if(map->slots[idx] != 0) { - rdim_memcpy_struct(&rdim_shared->bake_idx_runs.slots[idx], map->slots[idx]); + rdim_memcpy_struct(&bake_idx_runs->slots[idx], map->slots[idx]); } } } @@ -1691,18 +1709,19 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) scratch_end(scratch); } lane_sync(); - RDIM_BakeIdxRunMap *bake_idx_runs = &rdim_shared->bake_idx_runs; ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake strings // + RDIM_StringBakeResult *baked_strings = 0; ProfScope("bake strings") { // rjf: set up if(lane_idx() == 0) ProfScope("set up; lay out strings") { - rdim_shared->baked_strings.string_offs_count = bake_strings->total_count + 1; - rdim_shared->baked_strings.string_offs = rdim_push_array(arena, RDI_U32, rdim_shared->baked_strings.string_offs_count); + baked_strings = push_array(scratch.arena, RDIM_StringBakeResult, 1); + baked_strings->string_offs_count = bake_strings->total_count + 1; + baked_strings->string_offs = rdim_push_array(arena, RDI_U32, baked_strings->string_offs_count); RDI_U64 off_cursor = 0; for EachIndex(slot_idx, bake_strings->slots_count) { @@ -1712,15 +1731,15 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { RDIM_BakeString *src = &n->v[n_idx]; U64 dst_idx = bake_strings->slots_base_idxs[slot_idx] + n->base_idx + n_idx + 1; - rdim_shared->baked_strings.string_offs[dst_idx] = off_cursor; + baked_strings->string_offs[dst_idx] = off_cursor; off_cursor += src->string.size; } } } - rdim_shared->baked_strings.string_data_size = off_cursor; - rdim_shared->baked_strings.string_data = rdim_push_array(arena, RDI_U8, rdim_shared->baked_strings.string_data_size); + baked_strings->string_data_size = off_cursor; + baked_strings->string_data = rdim_push_array(arena, RDI_U8, baked_strings->string_data_size); } - lane_sync(); + lane_sync_u64(&baked_strings, 0); // rjf: wide fill string data ProfScope("wide fill") @@ -1734,26 +1753,31 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { RDIM_BakeString *src = &n->v[n_idx]; U64 dst_idx = bake_strings->slots_base_idxs[slot_idx] + n->base_idx + n_idx + 1; - U64 dst_off = rdim_shared->baked_strings.string_offs[dst_idx]; - rdim_memcpy(rdim_shared->baked_strings.string_data + dst_off, src->string.str, src->string.size); + U64 dst_off = baked_strings->string_offs[dst_idx]; + rdim_memcpy(baked_strings->string_data + dst_off, src->string.str, src->string.size); } } } } } lane_sync(); - RDIM_StringBakeResult baked_strings = rdim_shared->baked_strings; ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake idx runs // + RDIM_IndexRunBakeResult *baked_idx_runs = 0; + if(lane_idx() == 0) + { + baked_idx_runs = push_array(scratch.arena, RDIM_IndexRunBakeResult, 1); + } + lane_sync_u64(&baked_idx_runs, 0); if(need_index_runs) ProfScope("bake idx runs") { // rjf: set up if(lane_idx() == 0) { - rdim_shared->baked_idx_runs.idx_count = bake_idx_runs->slots_base_idxs[bake_idx_runs->slots_count]; - rdim_shared->baked_idx_runs.idx_runs = push_array(arena, RDI_U32, rdim_shared->baked_idx_runs.idx_count); + baked_idx_runs->idx_count = bake_idx_runs->slots_base_idxs[bake_idx_runs->slots_count]; + baked_idx_runs->idx_runs = push_array(arena, RDI_U32, baked_idx_runs->idx_count); } lane_sync(); @@ -1765,10 +1789,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_U64 off = bake_idx_runs->slots_base_idxs[slot_idx]; for EachNode(n, RDIM_BakeIdxRunChunkNode, bake_idx_runs->slots[slot_idx].first) { - StaticAssert(sizeof(rdim_shared->baked_idx_runs.idx_runs[0]) == sizeof(n->v[0].idxes[0]), idx_run_size_check); + StaticAssert(sizeof(baked_idx_runs->idx_runs[0]) == sizeof(n->v[0].idxes[0]), idx_run_size_check); for EachIndex(n_idx, n->count) { - rdim_memcpy(rdim_shared->baked_idx_runs.idx_runs + off, n->v[n_idx].idxes, sizeof(n->v[n_idx].idxes[0]) * n->v[n_idx].count); + rdim_memcpy(baked_idx_runs->idx_runs + off, n->v[n_idx].idxes, sizeof(n->v[n_idx].idxes[0]) * n->v[n_idx].count); off += n->v[n_idx].count; } } @@ -1776,25 +1800,35 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } lane_sync(); - RDIM_IndexRunBakeResult baked_idx_runs = rdim_shared->baked_idx_runs; ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake name maps // + RDIM_TopLevelNameMapBakeResult *baked_top_level_name_maps = 0; + RDIM_NameMapBakeResult *baked_name_maps = 0; ProfScope("bake name maps") { // rjf: count unique names in all name maps; lay out baked nodes + U64 **lane_name_map_node_counts = 0; // [RDI_NameMapKind_COUNT][..] + U64 **lane_name_map_node_offs = 0; // [RDI_NameMapKind_COUNT][..] + U64 *name_map_node_counts = 0; // [RDI_NameMapKind_COUNT] + U64 total_name_map_node_count = 0; ProfScope("count unique names in all name maps; lay out baked nodes") { if(lane_idx() == 0) { + lane_name_map_node_counts = push_array(scratch.arena, U64 *, RDI_NameMapKind_COUNT); + lane_name_map_node_offs = push_array(scratch.arena, U64 *, RDI_NameMapKind_COUNT); + name_map_node_counts = push_array(scratch.arena, U64, RDI_NameMapKind_COUNT); for EachNonZeroEnumVal(RDI_NameMapKind, k) { - rdim_shared->lane_name_map_node_counts[k] = push_array(arena, U64, lane_count()); - rdim_shared->lane_name_map_node_offs[k] = push_array(arena, U64, lane_count()); + lane_name_map_node_counts[k] = push_array(scratch.arena, U64, lane_count()); + lane_name_map_node_offs[k] = push_array(scratch.arena, U64, lane_count()); } } - lane_sync(); + lane_sync_u64(&lane_name_map_node_counts, 0); + lane_sync_u64(&lane_name_map_node_offs, 0); + lane_sync_u64(&name_map_node_counts, 0); for EachNonZeroEnumVal(RDI_NameMapKind, k) { if(!name_maps_need_build[k]) { continue; } @@ -1818,7 +1852,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } - rdim_shared->lane_name_map_node_counts[k][lane_idx()] += total_unique_name_count; + lane_name_map_node_counts[k][lane_idx()] += total_unique_name_count; } } } @@ -1830,44 +1864,42 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_U64 node_off = 0; for EachIndex(l_idx, lane_count()) { - rdim_shared->name_map_node_counts[k] += rdim_shared->lane_name_map_node_counts[k][l_idx]; - rdim_shared->lane_name_map_node_offs[k][l_idx] = node_off; - node_off += rdim_shared->lane_name_map_node_counts[k][l_idx]; + name_map_node_counts[k] += lane_name_map_node_counts[k][l_idx]; + lane_name_map_node_offs[k][l_idx] = node_off; + node_off += lane_name_map_node_counts[k][l_idx]; } - rdim_shared->total_name_map_node_count += rdim_shared->name_map_node_counts[k]; + total_name_map_node_count += name_map_node_counts[k]; } } + lane_sync_u64(&total_name_map_node_count, 0); } lane_sync(); // rjf: setup - ProfScope("setup") + ProfScope("setup") if(lane_idx() == 0) { - if(lane_idx() == lane_from_task_idx(0)) + baked_top_level_name_maps = push_array(scratch.arena, RDIM_TopLevelNameMapBakeResult, 1); + baked_top_level_name_maps->name_maps_count = RDI_NameMapKind_COUNT; + baked_top_level_name_maps->name_maps = push_array(arena, RDI_NameMap, baked_top_level_name_maps->name_maps_count); + baked_name_maps = push_array(scratch.arena, RDIM_NameMapBakeResult, 1); + RDI_U32 bucket_off = 0; + RDI_U32 node_off = 0; + for EachNonZeroEnumVal(RDI_NameMapKind, k) { - rdim_shared->baked_top_level_name_maps.name_maps_count = RDI_NameMapKind_COUNT; - rdim_shared->baked_top_level_name_maps.name_maps = push_array(arena, RDI_NameMap, rdim_shared->baked_top_level_name_maps.name_maps_count); - RDI_U32 bucket_off = 0; - RDI_U32 node_off = 0; - for EachNonZeroEnumVal(RDI_NameMapKind, k) - { - rdim_shared->baked_top_level_name_maps.name_maps[k].bucket_base_idx = bucket_off; - rdim_shared->baked_top_level_name_maps.name_maps[k].node_base_idx = node_off; - rdim_shared->baked_top_level_name_maps.name_maps[k].bucket_count = (RDI_U32)bake_name_maps_tops[k].slots_count; // TODO(rjf): @u64_to_u32 - rdim_shared->baked_top_level_name_maps.name_maps[k].node_count = (RDI_U32)rdim_shared->name_map_node_counts[k]; // TODO(rjf): @u64_to_u32 - bucket_off += rdim_shared->baked_top_level_name_maps.name_maps[k].bucket_count; - node_off += rdim_shared->baked_top_level_name_maps.name_maps[k].node_count; - } - rdim_shared->baked_name_maps.buckets_count = bucket_off; - rdim_shared->baked_name_maps.buckets = push_array(arena, RDI_NameMapBucket, rdim_shared->baked_name_maps.buckets_count); - } - if(lane_idx() == lane_from_task_idx(1)) - { - rdim_shared->baked_name_maps.nodes_count = rdim_shared->total_name_map_node_count; - rdim_shared->baked_name_maps.nodes = push_array(arena, RDI_NameMapNode, rdim_shared->baked_name_maps.nodes_count); + baked_top_level_name_maps->name_maps[k].bucket_base_idx = bucket_off; + baked_top_level_name_maps->name_maps[k].node_base_idx = node_off; + baked_top_level_name_maps->name_maps[k].bucket_count = (RDI_U32)bake_name_maps_tops[k].slots_count; // TODO(rjf): @u64_to_u32 + baked_top_level_name_maps->name_maps[k].node_count = (RDI_U32)name_map_node_counts[k]; // TODO(rjf): @u64_to_u32 + bucket_off += baked_top_level_name_maps->name_maps[k].bucket_count; + node_off += baked_top_level_name_maps->name_maps[k].node_count; } + baked_name_maps->buckets_count = bucket_off; + baked_name_maps->buckets = push_array(arena, RDI_NameMapBucket, baked_name_maps->buckets_count); + baked_name_maps->nodes_count = total_name_map_node_count; + baked_name_maps->nodes = push_array(arena, RDI_NameMapNode, baked_name_maps->nodes_count); } - lane_sync(); + lane_sync_u64(&baked_top_level_name_maps, 0); + lane_sync_u64(&baked_name_maps, 0); // rjf: wide fill baked name maps ProfScope("wide fill baked name maps") @@ -1875,13 +1907,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachNonZeroEnumVal(RDI_NameMapKind, k) ProfScope("wide fill (%.*s)", str8_varg(rdi_string_from_name_map_kind(k))) { if(!name_maps_need_build[k]) { continue; } - RDI_U64 write_node_off = rdim_shared->lane_name_map_node_offs[k][lane_idx()]; + RDI_U64 write_node_off = lane_name_map_node_offs[k][lane_idx()]; RDIM_BakeNameMapTopology *top = &bake_name_maps_tops[k]; U64 slots_count = top->slots_count; RDIM_BakeNameMap *src_map = bake_name_maps[k]; - RDI_NameMap *dst_map = &rdim_shared->baked_top_level_name_maps.name_maps[k]; - RDI_NameMapBucket *dst_buckets = rdim_shared->baked_name_maps.buckets + dst_map->bucket_base_idx; - RDI_NameMapNode *dst_nodes = rdim_shared->baked_name_maps.nodes + dst_map->node_base_idx; + RDI_NameMap *dst_map = &baked_top_level_name_maps->name_maps[k]; + RDI_NameMapBucket *dst_buckets = baked_name_maps->buckets + dst_map->bucket_base_idx; + RDI_NameMapNode *dst_nodes = baked_name_maps->nodes + dst_map->node_base_idx; Rng1U64 slot_range = lane_range(slots_count); for EachInRange(slot_idx, slot_range) { @@ -1890,7 +1922,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_NameMapBucket *dst_bucket = &dst_buckets[slot_idx]; dst_bucket->first_node = write_node_off; { - Temp scratch = scratch_begin(&arena, 1); + Temp scratch2 = scratch_begin(&scratch.arena, 1); typedef struct IdxRunNode IdxRunNode; struct IdxRunNode { @@ -1929,7 +1961,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { // rjf: flatten idxes RDI_U64 idxs_count = active_idx_count; - RDI_U32 *idxs = rdim_push_array(scratch.arena, RDI_U32, idxs_count); + RDI_U32 *idxs = rdim_push_array(scratch2.arena, RDI_U32, idxs_count); { U64 write_idx = 0; for EachNode(idx_run_n, IdxRunNode, first_idx_run_node) @@ -1960,13 +1992,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) first_idx_run_node = 0; last_idx_run_node = 0; active_idx_count = 0; - temp_end(scratch); + temp_end(scratch2); } // rjf: hash matches the active list -> push if(active_string.size != 0 && str8_match(active_string, string, 0)) { - IdxRunNode *idx_run_n = push_array(scratch.arena, IdxRunNode, 1); + IdxRunNode *idx_run_n = push_array(scratch2.arena, IdxRunNode, 1); idx_run_n->idx = idx; SLLQueuePush(first_idx_run_node, last_idx_run_node, idx_run_n); active_idx_count += 1; @@ -1981,7 +2013,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) break; } } - scratch_end(scratch); + scratch_end(scratch2); } } } @@ -1992,13 +2024,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage gather line-bucketed src line map data // + RDIM_BakeSrcLineMap *bake_src_line_maps = 0; ProfScope("gather line-bucketed src line map data") { if(lane_idx() == 0) { - rdim_shared->bake_src_line_maps = push_array(arena, RDIM_BakeSrcLineMap, params->src_files.total_count); + bake_src_line_maps = push_array(scratch.arena, RDIM_BakeSrcLineMap, params->src_files.total_count); } - lane_sync(); + lane_sync_u64(&bake_src_line_maps, 0); { for EachNode(n, RDIM_SrcFileChunkNode, params->src_files.first) { @@ -2006,7 +2039,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, range) { U64 file_idx = n->base_idx + n_idx; - RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[file_idx]; + RDIM_BakeSrcLineMap *map = &bake_src_line_maps[file_idx]; // rjf: set up map map->slots_count = Max(n->v[n_idx].total_line_count, 1); @@ -2060,27 +2093,31 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage sort line-bucketed src line map data // + RDIM_SortKey **bake_src_line_map_keys = 0; ProfScope("sort line-bucketed src line map data") { + U64 map_take_idx_ = 0; + U64 *map_take_idx = &map_take_idx_; U64 map_count = params->src_files.total_count; if(lane_idx() == 0) { - rdim_shared->bake_src_line_map_keys = push_array(arena, RDIM_SortKey *, map_count); + bake_src_line_map_keys = push_array(arena, RDIM_SortKey *, map_count); } - lane_sync(); + lane_sync_u64(&bake_src_line_map_keys, 0); + lane_sync_u64(&map_take_idx, 0); for(;;) { - U64 map_num = ins_atomic_u64_inc_eval(&rdim_shared->bake_src_line_map_take_counter); + U64 map_num = ins_atomic_u64_inc_eval(map_take_idx); if(map_num < 1 || map_count < map_num) { break; } U64 map_idx = map_num-1; - RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[map_idx]; + RDIM_BakeSrcLineMap *map = &bake_src_line_maps[map_idx]; // rjf: gather keys - rdim_shared->bake_src_line_map_keys[map_idx] = push_array_no_zero(arena, RDIM_SortKey, map->line_count); - RDIM_SortKey *keys = rdim_shared->bake_src_line_map_keys[map_idx]; + bake_src_line_map_keys[map_idx] = push_array_no_zero(arena, RDIM_SortKey, map->line_count); + RDIM_SortKey *keys = bake_src_line_map_keys[map_idx]; { U64 key_idx = 0; for EachIndex(slot_idx, map->slots_count) @@ -2104,24 +2141,41 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute src file / src file line map layout // + typedef struct SrcMapLayout SrcMapLayout; + struct SrcMapLayout + { + RDI_U64 *lane_chunk_src_file_num_counts; // [lane_count * src_file_chunk_count] + RDI_U64 *lane_chunk_src_file_voff_counts; // [lane_count * src_file_chunk_count] + RDI_U64 *lane_chunk_src_file_map_counts; // [lane_count * src_file_chunk_count] + RDI_U64 *lane_chunk_src_file_num_offs; // [lane_count * src_file_chunk_count] + RDI_U64 *lane_chunk_src_file_voff_offs; // [lane_count * src_file_chunk_count] + RDI_U64 *lane_chunk_src_file_map_offs; // [lane_count * src_file_chunk_count] + RDI_U64 *lane_chunk_src_file_checksum_counts[RDI_ChecksumKind_COUNT]; // [lane_count * src_file_chunk_count] + RDI_U64 *lane_chunk_src_file_checksum_offs[RDI_ChecksumKind_COUNT]; // [lane_count * src_file_chunk_count] + U64 total_checksum_counts[RDI_ChecksumKind_COUNT]; + RDI_U64 total_src_map_line_count; + RDI_U64 total_src_map_voff_count; + }; + SrcMapLayout *src_map_layout = 0; ProfScope("compute src file / src file line map layout") { // rjf: set up if(lane_idx() == 0) { - rdim_shared->lane_chunk_src_file_num_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - rdim_shared->lane_chunk_src_file_voff_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - rdim_shared->lane_chunk_src_file_map_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - rdim_shared->lane_chunk_src_file_num_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - rdim_shared->lane_chunk_src_file_voff_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - rdim_shared->lane_chunk_src_file_map_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout = push_array(scratch.arena, SrcMapLayout, 1); + src_map_layout->lane_chunk_src_file_num_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_voff_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_map_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_num_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_voff_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_map_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); for EachEnumVal(RDI_ChecksumKind, k) { - rdim_shared->lane_chunk_src_file_checksum_counts[k] = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - rdim_shared->lane_chunk_src_file_checksum_offs[k] = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_checksum_counts[k] = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_checksum_offs[k] = push_array(arena, U64, lane_count()*params->src_files.chunk_count); } } - lane_sync(); + lane_sync_u64(&src_map_layout, 0); // rjf: wide count { @@ -2132,15 +2186,15 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 slot_idx = lane_idx()*params->src_files.chunk_count + chunk_idx; for EachInRange(idx, range) { - RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[n->base_idx + idx]; - rdim_shared->lane_chunk_src_file_num_counts[slot_idx] += map->line_count; - rdim_shared->lane_chunk_src_file_voff_counts[slot_idx] += map->voff_range_count; - rdim_shared->lane_chunk_src_file_map_counts[slot_idx] += !!map->line_count; + RDIM_BakeSrcLineMap *map = &bake_src_line_maps[n->base_idx + idx]; + src_map_layout->lane_chunk_src_file_num_counts[slot_idx] += map->line_count; + src_map_layout->lane_chunk_src_file_voff_counts[slot_idx] += map->voff_range_count; + src_map_layout->lane_chunk_src_file_map_counts[slot_idx] += !!map->line_count; RDI_ChecksumKind k = n->v[idx].checksum_kind; String8 val = n->v[idx].checksum; if(RDI_ChecksumKind_NULL < k && k < RDI_ChecksumKind_COUNT && val.size != 0) { - rdim_shared->lane_chunk_src_file_checksum_counts[k][slot_idx] += 1; + src_map_layout->lane_chunk_src_file_checksum_counts[k][slot_idx] += 1; } } chunk_idx += 1; @@ -2161,25 +2215,25 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(l_idx, lane_count()) { U64 slot_idx = l_idx*params->src_files.chunk_count + chunk_idx; - rdim_shared->lane_chunk_src_file_num_offs[slot_idx] = num_layout_off; - rdim_shared->lane_chunk_src_file_voff_offs[slot_idx] = voff_layout_off; - rdim_shared->lane_chunk_src_file_map_offs[slot_idx] = map_layout_off; - num_layout_off += rdim_shared->lane_chunk_src_file_num_counts[slot_idx]; - voff_layout_off += rdim_shared->lane_chunk_src_file_voff_counts[slot_idx]; - map_layout_off += rdim_shared->lane_chunk_src_file_map_counts[slot_idx]; + src_map_layout->lane_chunk_src_file_num_offs[slot_idx] = num_layout_off; + src_map_layout->lane_chunk_src_file_voff_offs[slot_idx] = voff_layout_off; + src_map_layout->lane_chunk_src_file_map_offs[slot_idx] = map_layout_off; + num_layout_off += src_map_layout->lane_chunk_src_file_num_counts[slot_idx]; + voff_layout_off += src_map_layout->lane_chunk_src_file_voff_counts[slot_idx]; + map_layout_off += src_map_layout->lane_chunk_src_file_map_counts[slot_idx]; for EachEnumVal(RDI_ChecksumKind, k) { - rdim_shared->lane_chunk_src_file_checksum_offs[k][slot_idx] = checksum_layout_offs[k]; - checksum_layout_offs[k] += rdim_shared->lane_chunk_src_file_checksum_counts[k][slot_idx]; + src_map_layout->lane_chunk_src_file_checksum_offs[k][slot_idx] = checksum_layout_offs[k]; + checksum_layout_offs[k] += src_map_layout->lane_chunk_src_file_checksum_counts[k][slot_idx]; } } chunk_idx += 1; } - rdim_shared->total_src_map_line_count = num_layout_off; - rdim_shared->total_src_map_voff_count = voff_layout_off; + src_map_layout->total_src_map_line_count = num_layout_off; + src_map_layout->total_src_map_voff_count = voff_layout_off; for EachEnumVal(RDI_ChecksumKind, k) { - rdim_shared->total_checksum_counts[k] = checksum_layout_offs[k]; + src_map_layout->total_checksum_counts[k] = checksum_layout_offs[k]; } } } @@ -2188,23 +2242,25 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake src files // + RDIM_SrcFileBakeResult *baked_src_files = 0; ProfScope("bake src files") { //- rjf: set up if(lane_idx() == 0) { - rdim_shared->baked_src_files.source_files_count = params->src_files.total_count+1; - rdim_shared->baked_src_files.source_files = push_array(arena, RDI_SourceFile, rdim_shared->baked_src_files.source_files_count); - rdim_shared->baked_src_files.source_line_maps_count = params->src_files.source_line_map_count+1; - rdim_shared->baked_src_files.source_line_maps = push_array(arena, RDI_SourceLineMap, rdim_shared->baked_src_files.source_line_maps_count); - rdim_shared->baked_src_files.source_line_map_nums_count = rdim_shared->total_src_map_line_count; - rdim_shared->baked_src_files.source_line_map_nums = push_array(arena, RDI_U32, rdim_shared->baked_src_files.source_line_map_nums_count); - rdim_shared->baked_src_files.source_line_map_rngs_count = rdim_shared->total_src_map_line_count + rdim_shared->baked_src_files.source_line_maps_count; - rdim_shared->baked_src_files.source_line_map_rngs = push_array(arena, RDI_U32, rdim_shared->baked_src_files.source_line_map_rngs_count); - rdim_shared->baked_src_files.source_line_map_voffs_count = rdim_shared->total_src_map_voff_count; - rdim_shared->baked_src_files.source_line_map_voffs = push_array(arena, RDI_U64, rdim_shared->baked_src_files.source_line_map_voffs_count); + baked_src_files = push_array(scratch.arena, RDIM_SrcFileBakeResult, 1); + baked_src_files->source_files_count = params->src_files.total_count+1; + baked_src_files->source_files = push_array(arena, RDI_SourceFile, baked_src_files->source_files_count); + baked_src_files->source_line_maps_count = params->src_files.source_line_map_count+1; + baked_src_files->source_line_maps = push_array(arena, RDI_SourceLineMap, baked_src_files->source_line_maps_count); + baked_src_files->source_line_map_nums_count = src_map_layout->total_src_map_line_count; + baked_src_files->source_line_map_nums = push_array(arena, RDI_U32, baked_src_files->source_line_map_nums_count); + baked_src_files->source_line_map_rngs_count = src_map_layout->total_src_map_line_count + baked_src_files->source_line_maps_count; + baked_src_files->source_line_map_rngs = push_array(arena, RDI_U32, baked_src_files->source_line_map_rngs_count); + baked_src_files->source_line_map_voffs_count = src_map_layout->total_src_map_voff_count; + baked_src_files->source_line_map_voffs = push_array(arena, RDI_U64, baked_src_files->source_line_map_voffs_count); } - lane_sync(); + lane_sync_u64(&baked_src_files, 0); //- rjf: bake U64 chunk_idx = 0; @@ -2212,36 +2268,36 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { Rng1U64 range = lane_range(n->count); U64 slot_idx = lane_idx()*params->src_files.chunk_count + chunk_idx; - U64 dst_num_off = rdim_shared->lane_chunk_src_file_num_offs[slot_idx]; - U64 dst_map_off = rdim_shared->lane_chunk_src_file_map_offs[slot_idx]; - U64 dst_voff_off = rdim_shared->lane_chunk_src_file_voff_offs[slot_idx]; + U64 dst_num_off = src_map_layout->lane_chunk_src_file_num_offs[slot_idx]; + U64 dst_map_off = src_map_layout->lane_chunk_src_file_map_offs[slot_idx]; + U64 dst_voff_off = src_map_layout->lane_chunk_src_file_voff_offs[slot_idx]; U64 dst_rng_off = dst_num_off + dst_map_off; U64 dst_checksums_off[RDI_ChecksumKind_COUNT] = {0}; for EachEnumVal(RDI_ChecksumKind, k) { - dst_checksums_off[k] = 1 + rdim_shared->lane_chunk_src_file_checksum_offs[k][slot_idx]; + dst_checksums_off[k] = 1 + src_map_layout->lane_chunk_src_file_checksum_offs[k][slot_idx]; } for EachInRange(idx, range) { - RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[n->base_idx + idx]; - RDIM_SortKey *sorted_map_keys = rdim_shared->bake_src_line_map_keys[n->base_idx + idx]; + RDIM_BakeSrcLineMap *map = &bake_src_line_maps[n->base_idx + idx]; + RDIM_SortKey *sorted_map_keys = bake_src_line_map_keys[n->base_idx + idx]; RDIM_SrcFile *src = &n->v[idx]; - RDI_SourceFile *dst = &rdim_shared->baked_src_files.source_files[n->base_idx + idx + 1]; - RDI_SourceLineMap *dst_map = &rdim_shared->baked_src_files.source_line_maps[dst_map_off]; - RDI_U32 *dst_nums = &rdim_shared->baked_src_files.source_line_map_nums[dst_num_off]; - RDI_U32 *dst_rngs = &rdim_shared->baked_src_files.source_line_map_rngs[dst_rng_off]; - RDI_U64 *dst_voffs = &rdim_shared->baked_src_files.source_line_map_voffs[dst_voff_off]; + RDI_SourceFile *dst = &baked_src_files->source_files[n->base_idx + idx + 1]; + RDI_SourceLineMap *dst_map = &baked_src_files->source_line_maps[dst_map_off]; + RDI_U32 *dst_nums = &baked_src_files->source_line_map_nums[dst_num_off]; + RDI_U32 *dst_rngs = &baked_src_files->source_line_map_rngs[dst_rng_off]; + RDI_U64 *dst_voffs = &baked_src_files->source_line_map_voffs[dst_voff_off]; //- rjf: fill file info - Temp scratch = scratch_begin(&arena, 1); - String8 normalized_path = rdim_normalize_path_str8(scratch.arena, src->path); + Temp scratch2 = scratch_begin(&scratch.arena, 1); + String8 normalized_path = rdim_normalize_path_str8(scratch2.arena, src->path); B32 has_checksum = (RDI_ChecksumKind_NULL < src->checksum_kind && src->checksum_kind < RDI_ChecksumKind_COUNT && src->checksum.size != 0); dst->file_path_node_idx = rdim_bake_path_node_idx_from_string(path_tree, src->path); dst->normal_full_path_string_idx = rdim_bake_idx_from_string(bake_strings, normalized_path); dst->source_line_map_idx = src->total_line_count ? dst_map_off : 0; dst->checksum_kind = src->checksum_kind; dst->checksum_idx = has_checksum ? dst_checksums_off[dst->checksum_kind] : 0; - scratch_end(scratch); + scratch_end(scratch2); //- rjf: advance checksum offset for this kind if(has_checksum) @@ -2288,21 +2344,23 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake checksums // + RDIM_ChecksumBakeResult *baked_checksums = 0; ProfScope("bake checksums") { // rjf: allocate if(lane_idx() == 0) { - rdim_shared->baked_checksums.md5s_count = rdim_shared->total_checksum_counts[RDI_ChecksumKind_MD5] + 1; - rdim_shared->baked_checksums.sha1s_count = rdim_shared->total_checksum_counts[RDI_ChecksumKind_SHA1] + 1; - rdim_shared->baked_checksums.sha256s_count = rdim_shared->total_checksum_counts[RDI_ChecksumKind_SHA256] + 1; - rdim_shared->baked_checksums.timestamps_count = rdim_shared->total_checksum_counts[RDI_ChecksumKind_Timestamp] + 1; - rdim_shared->baked_checksums.md5s = push_array(arena, RDI_MD5, rdim_shared->baked_checksums.md5s_count); - rdim_shared->baked_checksums.sha1s = push_array(arena, RDI_SHA1, rdim_shared->baked_checksums.sha1s_count); - rdim_shared->baked_checksums.sha256s = push_array(arena, RDI_SHA256, rdim_shared->baked_checksums.sha256s_count); - rdim_shared->baked_checksums.timestamps = push_array(arena, RDI_U64, rdim_shared->baked_checksums.timestamps_count); + baked_checksums = push_array(scratch.arena, RDIM_ChecksumBakeResult, 1); + baked_checksums->md5s_count = src_map_layout->total_checksum_counts[RDI_ChecksumKind_MD5] + 1; + baked_checksums->sha1s_count = src_map_layout->total_checksum_counts[RDI_ChecksumKind_SHA1] + 1; + baked_checksums->sha256s_count = src_map_layout->total_checksum_counts[RDI_ChecksumKind_SHA256] + 1; + baked_checksums->timestamps_count = src_map_layout->total_checksum_counts[RDI_ChecksumKind_Timestamp] + 1; + baked_checksums->md5s = push_array(arena, RDI_MD5, baked_checksums->md5s_count); + baked_checksums->sha1s = push_array(arena, RDI_SHA1, baked_checksums->sha1s_count); + baked_checksums->sha256s = push_array(arena, RDI_SHA256, baked_checksums->sha256s_count); + baked_checksums->timestamps = push_array(arena, RDI_U64, baked_checksums->timestamps_count); } - lane_sync(); + lane_sync_u64(&baked_checksums, 0); // rjf: fill { @@ -2314,7 +2372,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 dst_offs[RDI_ChecksumKind_COUNT] = {0}; for EachEnumVal(RDI_ChecksumKind, k) { - dst_offs[k] = 1 + rdim_shared->lane_chunk_src_file_checksum_offs[k][slot_idx]; + dst_offs[k] = 1 + src_map_layout->lane_chunk_src_file_checksum_offs[k][slot_idx]; } for EachInRange(n_idx, range) { @@ -2327,7 +2385,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) case RDI_ChecksumKind_NULL: case RDI_ChecksumKind_COUNT: {}break; -#define Case(name, table_name) case RDI_ChecksumKind_##name:{MemoryCopy(&rdim_shared->baked_checksums.table_name[dst_offs[k]], val.str, Min(val.size, sizeof(rdim_shared->baked_checksums.table_name[0])));}break +#define Case(name, table_name) case RDI_ChecksumKind_##name:{MemoryCopy(&baked_checksums->table_name[dst_offs[k]], val.str, Min(val.size, sizeof(baked_checksums->table_name[0])));}break Case(MD5, md5s); Case(SHA1, sha1s); Case(SHA256, sha256s); @@ -2343,20 +2401,43 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } lane_sync(); + ////////////////////////////////////////////////////////////// + //- rjf: @rdim_bake_stage bake namespaces + // + ProfScope("bake namespaces") + { + // rjf: allocate + if(lane_idx() == 0) + { + + } + lane_sync(); + } + ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute lane UDT member/enum-val layouts // + typedef struct MemberLayout MemberLayout; + struct MemberLayout + { + RDI_U64 *member_chunk_lane_counts; // [lane_count * udt_chunk_count] + RDI_U64 *member_chunk_lane_offs; // [lane_count * udt_chunk_count] + RDI_U64 *enum_val_chunk_lane_counts; // [lane_count * udt_chunk_count] + RDI_U64 *enum_val_chunk_lane_offs; // [lane_count * udt_chunk_count] + }; + MemberLayout *mem_layout = 0; ProfScope("compute lane UDT member/enum-val layouts") { // rjf: allocate if(lane_idx() == 0) { - rdim_shared->member_chunk_lane_counts = push_array(arena, U64, lane_count() * params->udts.chunk_count); - rdim_shared->member_chunk_lane_offs = push_array(arena, U64, lane_count() * params->udts.chunk_count); - rdim_shared->enum_val_chunk_lane_counts = push_array(arena, U64, lane_count() * params->udts.chunk_count); - rdim_shared->enum_val_chunk_lane_offs = push_array(arena, U64, lane_count() * params->udts.chunk_count); + mem_layout = push_array(scratch.arena, MemberLayout, 1); + mem_layout->member_chunk_lane_counts = push_array(arena, U64, lane_count() * params->udts.chunk_count); + mem_layout->member_chunk_lane_offs = push_array(arena, U64, lane_count() * params->udts.chunk_count); + mem_layout->enum_val_chunk_lane_counts = push_array(arena, U64, lane_count() * params->udts.chunk_count); + mem_layout->enum_val_chunk_lane_offs = push_array(arena, U64, lane_count() * params->udts.chunk_count); } - lane_sync(); + lane_sync_u64(&mem_layout, 0); // rjf: count { @@ -2367,8 +2448,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(idx, range) { U64 slot_idx = lane_idx()*params->udts.chunk_count + chunk_idx; - rdim_shared->member_chunk_lane_counts[slot_idx] += n->v[idx].member_count; - rdim_shared->enum_val_chunk_lane_counts[slot_idx] += n->v[idx].enum_val_count; + mem_layout->member_chunk_lane_counts[slot_idx] += n->v[idx].member_count; + mem_layout->enum_val_chunk_lane_counts[slot_idx] += n->v[idx].enum_val_count; } chunk_idx += 1; } @@ -2386,10 +2467,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(l_idx, lane_count()) { U64 slot_idx = l_idx*params->udts.chunk_count + chunk_idx; - rdim_shared->member_chunk_lane_offs[slot_idx] = member_layout_off; - rdim_shared->enum_val_chunk_lane_offs[slot_idx] = enum_val_layout_off; - member_layout_off += rdim_shared->member_chunk_lane_counts[slot_idx]; - enum_val_layout_off += rdim_shared->enum_val_chunk_lane_counts[slot_idx]; + mem_layout->member_chunk_lane_offs[slot_idx] = member_layout_off; + mem_layout->enum_val_chunk_lane_offs[slot_idx] = enum_val_layout_off; + member_layout_off += mem_layout->member_chunk_lane_counts[slot_idx]; + enum_val_layout_off += mem_layout->enum_val_chunk_lane_counts[slot_idx]; } chunk_idx += 1; } @@ -2400,25 +2481,31 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake UDTs // + RDIM_UDTBakeResult *baked_udts = 0; ProfScope("bake UDTs") { //- rjf: set up ProfScope("set up") { + if(lane_idx() == 0) + { + baked_udts = push_array(scratch.arena, RDIM_UDTBakeResult, 1); + } + lane_sync_u64(&baked_udts, 0); if(lane_idx() == lane_from_task_idx(0)) { - rdim_shared->baked_udts.udts_count = params->udts.total_count+1; - rdim_shared->baked_udts.udts = push_array(arena, RDI_UDT, rdim_shared->baked_udts.udts_count); + baked_udts->udts_count = params->udts.total_count+1; + baked_udts->udts = push_array(arena, RDI_UDT, baked_udts->udts_count); } if(lane_idx() == lane_from_task_idx(1)) { - rdim_shared->baked_udts.members_count = params->udts.total_member_count+1; - rdim_shared->baked_udts.members = push_array(arena, RDI_Member, rdim_shared->baked_udts.members_count); + baked_udts->members_count = params->udts.total_member_count+1; + baked_udts->members = push_array(arena, RDI_Member, baked_udts->members_count); } if(lane_idx() == lane_from_task_idx(2)) { - rdim_shared->baked_udts.enum_members_count = params->udts.total_enum_val_count+1; - rdim_shared->baked_udts.enum_members = push_array(arena, RDI_EnumMember, rdim_shared->baked_udts.enum_members_count); + baked_udts->enum_members_count = params->udts.total_enum_val_count+1; + baked_udts->enum_members = push_array(arena, RDI_EnumMember, baked_udts->enum_members_count); } } lane_sync(); @@ -2431,12 +2518,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { Rng1U64 range = lane_range(n->count); U64 layout_slot_idx = lane_idx()*params->udts.chunk_count + chunk_idx; - U64 member_layout_off = rdim_shared->member_chunk_lane_offs[layout_slot_idx]; - U64 enum_val_layout_off = rdim_shared->enum_val_chunk_lane_offs[layout_slot_idx]; + U64 member_layout_off = mem_layout->member_chunk_lane_offs[layout_slot_idx]; + U64 enum_val_layout_off = mem_layout->enum_val_chunk_lane_offs[layout_slot_idx]; for EachInRange(n_idx, range) { RDIM_UDT *src_udt = &n->v[n_idx]; - RDI_UDT *dst_udt = &rdim_shared->baked_udts.udts[n->base_idx + n_idx + 1]; + RDI_UDT *dst_udt = &baked_udts->udts[n->base_idx + n_idx + 1]; //- rjf: fill basics dst_udt->self_type_idx = (RDI_U32)rdim_idx_from_type(src_udt->self_type); // TODO(rjf): @u64_to_u32 @@ -2450,7 +2537,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 member_off_first = member_layout_off; for EachNode(src_member, RDIM_UDTMember, src_udt->first_member) { - RDI_Member *dst_member = &rdim_shared->baked_udts.members[member_layout_off]; + RDI_Member *dst_member = &baked_udts->members[member_layout_off]; dst_member->kind = src_member->kind; dst_member->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_member->name); dst_member->type_idx = (RDI_U32)rdim_idx_from_type(src_member->type); // TODO(rjf): @u64_to_u32 @@ -2468,7 +2555,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 enum_val_off_first = enum_val_layout_off; for EachNode(src_enum_val, RDIM_UDTEnumVal, src_udt->first_enum_val) { - RDI_EnumMember *dst_member = &rdim_shared->baked_udts.enum_members[enum_val_layout_off]; + RDI_EnumMember *dst_member = &baked_udts->enum_members[enum_val_layout_off]; dst_member->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_enum_val->name); dst_member->val = src_enum_val->val; enum_val_layout_off += 1; @@ -2488,16 +2575,25 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute lane location block layout // + typedef struct LocLayout LocLayout; + struct LocLayout + { + RDI_U64 *location_case_chunk_lane_counts; // [lane_count * (scope_chunk_count + procedure_chunk_count) + RDI_U64 *location_case_chunk_lane_offs; // [lane_count * (scope_chunk_count + procedure_chunk_count) + RDI_U64 total_location_case_count; + }; + LocLayout *loc_layout = 0; U64 total_location_case_chunk_count = (params->scopes.chunk_count + params->procedures.chunk_count); ProfScope("compute lane location block layout") { // rjf: set up if(lane_idx() == 0) { - rdim_shared->location_case_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * total_location_case_chunk_count); - rdim_shared->location_case_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * total_location_case_chunk_count); + loc_layout = push_array(scratch.arena, LocLayout, 1); + loc_layout->location_case_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * total_location_case_chunk_count); + loc_layout->location_case_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * total_location_case_chunk_count); } - lane_sync(); + lane_sync_u64(&loc_layout, 0); // rjf: per-chunk-lane count of location cases { @@ -2511,7 +2607,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for EachNode(local, RDIM_Local, n->v[idx].first_local) { - rdim_shared->location_case_chunk_lane_counts[slot_idx] += local->location_cases.count; + loc_layout->location_case_chunk_lane_counts[slot_idx] += local->location_cases.count; } } chunk_idx += 1; @@ -2524,7 +2620,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(idx, range) { - rdim_shared->location_case_chunk_lane_counts[slot_idx] += n->v[idx].location_cases.count; + loc_layout->location_case_chunk_lane_counts[slot_idx] += n->v[idx].location_cases.count; } chunk_idx += 1; } @@ -2541,8 +2637,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(l_idx, lane_count()) { U64 slot_idx = l_idx * total_location_case_chunk_count + chunk_idx; - rdim_shared->location_case_chunk_lane_offs[slot_idx] = location_case_layout_off; - location_case_layout_off += rdim_shared->location_case_chunk_lane_counts[slot_idx]; + loc_layout->location_case_chunk_lane_offs[slot_idx] = location_case_layout_off; + location_case_layout_off += loc_layout->location_case_chunk_lane_counts[slot_idx]; } chunk_idx += 1; } @@ -2551,12 +2647,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(l_idx, lane_count()) { U64 slot_idx = l_idx * total_location_case_chunk_count + chunk_idx; - rdim_shared->location_case_chunk_lane_offs[slot_idx] = location_case_layout_off; - location_case_layout_off += rdim_shared->location_case_chunk_lane_counts[slot_idx]; + loc_layout->location_case_chunk_lane_offs[slot_idx] = location_case_layout_off; + location_case_layout_off += loc_layout->location_case_chunk_lane_counts[slot_idx]; } chunk_idx += 1; } - rdim_shared->total_location_case_count = location_case_layout_off; + loc_layout->total_location_case_count = location_case_layout_off; } } lane_sync(); @@ -2564,15 +2660,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake location blocks // + RDIM_LocationBlockBakeResult *baked_location_blocks = 0; ProfScope("bake location blocks") { // rjf: set up if(lane_idx() == 0) { - rdim_shared->baked_location_blocks.location_blocks_count = rdim_shared->total_location_case_count; - rdim_shared->baked_location_blocks.location_blocks = push_array(arena, RDI_LocationBlock, rdim_shared->baked_location_blocks.location_blocks_count); + baked_location_blocks = push_array(scratch.arena, RDIM_LocationBlockBakeResult, 1); + baked_location_blocks->location_blocks_count = loc_layout->total_location_case_count; + baked_location_blocks->location_blocks = push_array(arena, RDI_LocationBlock, baked_location_blocks->location_blocks_count); } - lane_sync(); + lane_sync_u64(&baked_location_blocks, 0); // rjf: wide fill from scopes U64 chunk_idx = 0; @@ -2581,7 +2679,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) { U64 layout_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; - U64 layout_off = rdim_shared->location_case_chunk_lane_offs[layout_slot_idx]; + U64 layout_off = loc_layout->location_case_chunk_lane_offs[layout_slot_idx]; Rng1U64 range = lane_range(n->count); for EachInRange(idx, range) { @@ -2589,7 +2687,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for EachNode(src, RDIM_LocationCase, local->location_cases.first) { - RDI_LocationBlock *dst = &rdim_shared->baked_location_blocks.location_blocks[layout_off]; + RDI_LocationBlock *dst = &baked_location_blocks->location_blocks[layout_off]; dst->scope_off_first = (RDI_U32)src->voff_range.min; // TODO(rjf): @u64_to_u32 dst->scope_off_opl = (RDI_U32)src->voff_range.max; // TODO(rjf): @u64_to_u32 dst->location_data_off = (RDI_U32)rdim_off_from_location(src->location); // TODO(rjf): @u64_to_u32 @@ -2607,13 +2705,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first) { U64 layout_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; - U64 layout_off = rdim_shared->location_case_chunk_lane_offs[layout_slot_idx]; + U64 layout_off = loc_layout->location_case_chunk_lane_offs[layout_slot_idx]; Rng1U64 range = lane_range(n->count); for EachInRange(idx, range) { for EachNode(src, RDIM_LocationCase, n->v[idx].location_cases.first) { - RDI_LocationBlock *dst = &rdim_shared->baked_location_blocks.location_blocks[layout_off]; + RDI_LocationBlock *dst = &baked_location_blocks->location_blocks[layout_off]; dst->scope_off_first = (RDI_U32)src->voff_range.min; // TODO(rjf): @u64_to_u32 dst->scope_off_opl = (RDI_U32)src->voff_range.max; // TODO(rjf): @u64_to_u32 dst->location_data_off = (RDI_U32)rdim_off_from_location(src->location); // TODO(rjf): @u64_to_u32 @@ -2628,21 +2726,23 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake locations // + RDIM_LocationBakeResult *baked_locations = 0; ProfScope("bake locations") { if(lane_idx() == 0) { - rdim_shared->baked_locations.location_data_size = params->locations.total_encoded_size+1; - rdim_shared->baked_locations.location_data = push_array(arena, RDI_U8, rdim_shared->baked_locations.location_data_size); + baked_locations = push_array(scratch.arena, RDIM_LocationBakeResult, 1); + baked_locations->location_data_size = params->locations.total_encoded_size+1; + baked_locations->location_data = push_array(arena, RDI_U8, baked_locations->location_data_size); } - lane_sync(); + lane_sync_u64(&baked_locations, 0); for EachNode(n, RDIM_LocationChunkNode, params->locations.first) { Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { RDIM_Location *loc = &n->v[n_idx]; - RDI_U8 *dst = &rdim_shared->baked_locations.location_data[n->base_encoding_off + loc->relative_encoding_off + 1]; + RDI_U8 *dst = &baked_locations->location_data[n->base_encoding_off + loc->relative_encoding_off + 1]; switch((RDI_LocationKindEnum)loc->info.kind) { case RDI_LocationKind_NULL:{}break; @@ -2679,17 +2779,27 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute layout for scope sub-lists (locals / voffs) // + typedef struct ScopeLayout ScopeLayout; + struct ScopeLayout + { + RDI_U64 *scope_local_chunk_lane_counts; // [lane_count * scope_chunk_count] + RDI_U64 *scope_local_chunk_lane_offs; // [lane_count * scope_chunk_count] + RDI_U64 *scope_voff_chunk_lane_counts; // [lane_count * scope_chunk_count] + RDI_U64 *scope_voff_chunk_lane_offs; // [lane_count * scope_chunk_count] + }; + ScopeLayout *scope_layout = 0; ProfScope("compute layout for scope sub-lists (locals / voffs)") { // rjf: set up if(lane_idx() == 0) { - rdim_shared->scope_local_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); - rdim_shared->scope_local_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); - rdim_shared->scope_voff_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); - rdim_shared->scope_voff_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); + scope_layout = push_array(scratch.arena, ScopeLayout, 1); + scope_layout->scope_local_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); + scope_layout->scope_local_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); + scope_layout->scope_voff_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); + scope_layout->scope_voff_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); } - lane_sync(); + lane_sync_u64(&scope_layout, 0); // rjf: count per-lane-chunk { @@ -2704,8 +2814,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) num_locals_in_this_lane_and_node += n->v[n_idx].local_count; num_voffs_in_this_lane_and_node += n->v[n_idx].voff_ranges.count*2; } - rdim_shared->scope_local_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_locals_in_this_lane_and_node; - rdim_shared->scope_voff_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_voffs_in_this_lane_and_node; + scope_layout->scope_local_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_locals_in_this_lane_and_node; + scope_layout->scope_voff_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_voffs_in_this_lane_and_node; chunk_idx += 1; } } @@ -2722,10 +2832,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(l_idx, lane_count()) { U64 slot_idx = l_idx*params->scopes.chunk_count + chunk_idx; - rdim_shared->scope_local_chunk_lane_offs[slot_idx] = local_layout_off; - rdim_shared->scope_voff_chunk_lane_offs[slot_idx] = voff_layout_off; - local_layout_off += rdim_shared->scope_local_chunk_lane_counts[slot_idx]; - voff_layout_off += rdim_shared->scope_voff_chunk_lane_counts[slot_idx]; + scope_layout->scope_local_chunk_lane_offs[slot_idx] = local_layout_off; + scope_layout->scope_voff_chunk_lane_offs[slot_idx] = voff_layout_off; + local_layout_off += scope_layout->scope_local_chunk_lane_counts[slot_idx]; + voff_layout_off += scope_layout->scope_voff_chunk_lane_counts[slot_idx]; } chunk_idx += 1; } @@ -2737,23 +2847,29 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake scopes // + RDIM_ScopeBakeResult *baked_scopes = 0; ProfScope("bake scopes") { //- rjf: setup outputs + if(lane_idx() == 0) + { + baked_scopes = push_array(scratch.arena, RDIM_ScopeBakeResult, 1); + } + lane_sync_u64(&baked_scopes, 0); if(lane_idx() == lane_from_task_idx(0)) { - rdim_shared->baked_scopes.scopes_count = params->scopes.total_count+1; - rdim_shared->baked_scopes.scopes = push_array(arena, RDI_Scope, rdim_shared->baked_scopes.scopes_count); + baked_scopes->scopes_count = params->scopes.total_count+1; + baked_scopes->scopes = push_array(arena, RDI_Scope, baked_scopes->scopes_count); } if(lane_idx() == lane_from_task_idx(1)) { - rdim_shared->baked_scopes.scope_voffs_count = params->scopes.scope_voff_count+1; - rdim_shared->baked_scopes.scope_voffs = push_array(arena, RDI_U64, rdim_shared->baked_scopes.scope_voffs_count); + baked_scopes->scope_voffs_count = params->scopes.scope_voff_count+1; + baked_scopes->scope_voffs = push_array(arena, RDI_U64, baked_scopes->scope_voffs_count); } if(lane_idx() == lane_from_task_idx(2)) { - rdim_shared->baked_scopes.locals_count = params->scopes.local_count+1; - rdim_shared->baked_scopes.locals = push_array(arena, RDI_Local, rdim_shared->baked_scopes.locals_count); + baked_scopes->locals_count = params->scopes.local_count+1; + baked_scopes->locals = push_array(arena, RDI_Local, baked_scopes->locals_count); } lane_sync(); @@ -2764,22 +2880,22 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { Rng1U64 range = lane_range(n->count); U64 scope_chunk_lane_slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx; - U64 chunk_local_off = rdim_shared->scope_local_chunk_lane_offs[scope_chunk_lane_slot_idx]; - U64 chunk_voff_off = rdim_shared->scope_voff_chunk_lane_offs[scope_chunk_lane_slot_idx]; + U64 chunk_local_off = scope_layout->scope_local_chunk_lane_offs[scope_chunk_lane_slot_idx]; + U64 chunk_voff_off = scope_layout->scope_voff_chunk_lane_offs[scope_chunk_lane_slot_idx]; U64 location_block_chunk_lane_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; - U64 chunk_location_block_off = rdim_shared->location_case_chunk_lane_offs[location_block_chunk_lane_slot_idx]; + U64 chunk_location_block_off = loc_layout->location_case_chunk_lane_offs[location_block_chunk_lane_slot_idx]; for EachInRange(n_idx, range) { U64 dst_idx = 1 + n->base_idx + n_idx; RDIM_Scope *src_scope = &n->v[n_idx]; - RDI_Scope *dst_scope = &rdim_shared->baked_scopes.scopes[dst_idx]; + RDI_Scope *dst_scope = &baked_scopes->scopes[dst_idx]; //- rjf: fill voff ranges U64 voff_idx_first = chunk_voff_off; for EachNode(rng_n, RDIM_Rng1U64Node, src_scope->voff_ranges.first) { - rdim_shared->baked_scopes.scope_voffs[chunk_voff_off+0] = rng_n->v.min; - rdim_shared->baked_scopes.scope_voffs[chunk_voff_off+1] = rng_n->v.max; + baked_scopes->scope_voffs[chunk_voff_off+0] = rng_n->v.min; + baked_scopes->scope_voffs[chunk_voff_off+1] = rng_n->v.max; chunk_voff_off += 2; } U64 voff_idx_opl = chunk_voff_off; @@ -2788,7 +2904,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 local_idx_first = chunk_local_off; for EachNode(src_local, RDIM_Local, src_scope->first_local) { - RDI_Local *dst_local = &rdim_shared->baked_scopes.locals[chunk_local_off]; + RDI_Local *dst_local = &baked_scopes->locals[chunk_local_off]; dst_local->kind = src_local->kind; dst_local->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_local->name); dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 @@ -2822,25 +2938,27 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake procedures // + RDIM_ProcedureBakeResult *baked_procedures = 0; ProfScope("bake procedures") { if(lane_idx() == 0) { - rdim_shared->baked_procedures.procedures_count = params->procedures.total_count+1; - rdim_shared->baked_procedures.procedures = push_array(arena, RDI_Procedure, rdim_shared->baked_procedures.procedures_count); + baked_procedures = push_array(scratch.arena, RDIM_ProcedureBakeResult, 1); + baked_procedures->procedures_count = params->procedures.total_count+1; + baked_procedures->procedures = push_array(arena, RDI_Procedure, baked_procedures->procedures_count); } - lane_sync(); + lane_sync_u64(&baked_procedures, 0); { U64 chunk_idx = 0; for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first) { U64 location_block_layout_slot_idx = lane_idx()*total_location_case_chunk_count + params->scopes.chunk_count + chunk_idx; - U64 location_block_off = rdim_shared->location_case_chunk_lane_offs[location_block_layout_slot_idx]; + U64 location_block_off = loc_layout->location_case_chunk_lane_offs[location_block_layout_slot_idx]; Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { RDIM_Symbol *src = &n->v[n_idx]; - RDI_Procedure *dst = &rdim_shared->baked_procedures.procedures[n->base_idx + n_idx + 1]; + RDI_Procedure *dst = &baked_procedures->procedures[n->base_idx + n_idx + 1]; dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); dst->link_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->link_name); if(src->is_extern) @@ -2874,15 +2992,23 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute layout for constant data // + typedef struct ConstantLayout ConstantLayout; + struct ConstantLayout + { + RDI_U64 *constant_data_chunk_lane_counts; // [lane_count * constant_chunk_count] + RDI_U64 *constant_data_chunk_lane_offs; // [lane_count * constant_chunk_count] + }; + ConstantLayout *constant_layout = 0; ProfScope("compute layout for constant data") { // rjf: set up if(lane_idx() == 0) { - rdim_shared->constant_data_chunk_lane_counts = push_array(arena, U64, lane_count() * params->constants.chunk_count); - rdim_shared->constant_data_chunk_lane_offs = push_array(arena, U64, lane_count() * params->constants.chunk_count); + constant_layout = push_array(scratch.arena, ConstantLayout, 1); + constant_layout->constant_data_chunk_lane_counts = push_array(arena, U64, lane_count() * params->constants.chunk_count); + constant_layout->constant_data_chunk_lane_offs = push_array(arena, U64, lane_count() * params->constants.chunk_count); } - lane_sync(); + lane_sync_u64(&constant_layout, 0); // rjf: count { @@ -2893,7 +3019,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(idx, range) { - rdim_shared->constant_data_chunk_lane_counts[slot_idx] += n->v[idx].value_data.size; + constant_layout->constant_data_chunk_lane_counts[slot_idx] += n->v[idx].value_data.size; } chunk_idx += 1; } @@ -2910,8 +3036,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(l_idx, lane_count()) { U64 slot_idx = l_idx*params->constants.chunk_count + chunk_idx; - rdim_shared->constant_data_chunk_lane_offs[slot_idx] = layout_off; - layout_off += rdim_shared->constant_data_chunk_lane_counts[slot_idx]; + constant_layout->constant_data_chunk_lane_offs[slot_idx] = layout_off; + layout_off += constant_layout->constant_data_chunk_lane_counts[slot_idx]; } chunk_idx += 1; } @@ -2922,23 +3048,29 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake constants // + RDIM_ConstantsBakeResult *baked_constants = 0; ProfScope("bake constants") { // rjf: set up + if(lane_idx() == 0) + { + baked_constants = push_array(scratch.arena, RDIM_ConstantsBakeResult, 1); + } + lane_sync_u64(&baked_constants, 0); if(lane_idx() == lane_from_task_idx(0)) { - rdim_shared->baked_constants.constant_values_count = params->constants.total_count+1; - rdim_shared->baked_constants.constant_values = push_array(arena, RDI_U32, rdim_shared->baked_constants.constant_values_count); + baked_constants->constant_values_count = params->constants.total_count+1; + baked_constants->constant_values = push_array(arena, RDI_U32, baked_constants->constant_values_count); } if(lane_idx() == lane_from_task_idx(1)) { - rdim_shared->baked_constants.constant_value_data_size = params->constants.total_value_data_size; - rdim_shared->baked_constants.constant_value_data = push_array(arena, RDI_U8, rdim_shared->baked_constants.constant_value_data_size); + baked_constants->constant_value_data_size = params->constants.total_value_data_size; + baked_constants->constant_value_data = push_array(arena, RDI_U8, baked_constants->constant_value_data_size); } if(lane_idx() == lane_from_task_idx(2)) { - rdim_shared->baked_constants.constants_count = params->constants.total_count+1; - rdim_shared->baked_constants.constants = push_array(arena, RDI_Constant, rdim_shared->baked_constants.constants_count); + baked_constants->constants_count = params->constants.total_count+1; + baked_constants->constants = push_array(arena, RDI_Constant, baked_constants->constants_count); } lane_sync(); @@ -2948,14 +3080,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachNode(n, RDIM_SymbolChunkNode, params->constants.first) { U64 slot_idx = lane_idx()*params->constants.chunk_count + chunk_idx; - U64 value_data_off = rdim_shared->constant_data_chunk_lane_offs[slot_idx]; + U64 value_data_off = constant_layout->constant_data_chunk_lane_offs[slot_idx]; Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { RDIM_Symbol *src = &n->v[n_idx]; - RDI_Constant *dst = &rdim_shared->baked_constants.constants[1 + n->base_idx + n_idx]; - RDI_U32 *dst_value_off = &rdim_shared->baked_constants.constant_values[1 + n->base_idx + n_idx]; - RDI_U8 *dst_value_data = rdim_shared->baked_constants.constant_value_data + value_data_off; + RDI_Constant *dst = &baked_constants->constants[1 + n->base_idx + n_idx]; + RDI_U32 *dst_value_off = &baked_constants->constant_values[1 + n->base_idx + n_idx]; + RDI_U8 *dst_value_data = baked_constants->constant_value_data + value_data_off; dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 dst->constant_value_idx = 1 + n->base_idx + n_idx; @@ -2972,34 +3104,48 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake units, symbols, types, UDTs // + RDIM_UnitBakeResult *baked_units = 0; + RDIM_TypeNodeBakeResult *baked_type_nodes = 0; + RDIM_GlobalVariableBakeResult *baked_global_variables = 0; + RDIM_ThreadVariableBakeResult *baked_thread_variables = 0; + RDIM_InlineSiteBakeResult *baked_inline_sites = 0; { //- rjf: setup outputs if(lane_idx() == lane_from_task_idx(0)) { - rdim_shared->baked_units.units_count = params->units.total_count+1; - rdim_shared->baked_units.units = push_array(arena, RDI_Unit, rdim_shared->baked_units.units_count); + baked_units = push_array(scratch.arena, RDIM_UnitBakeResult, 1); + baked_units->units_count = params->units.total_count+1; + baked_units->units = push_array(arena, RDI_Unit, baked_units->units_count); } if(lane_idx() == lane_from_task_idx(1)) { - rdim_shared->baked_type_nodes.type_nodes_count = params->types.total_count+1; - rdim_shared->baked_type_nodes.type_nodes = push_array(arena, RDI_TypeNode, rdim_shared->baked_type_nodes.type_nodes_count); + baked_type_nodes = push_array(scratch.arena, RDIM_TypeNodeBakeResult, 1); + baked_type_nodes->type_nodes_count = params->types.total_count+1; + baked_type_nodes->type_nodes = push_array(arena, RDI_TypeNode, baked_type_nodes->type_nodes_count); } if(lane_idx() == lane_from_task_idx(2)) { - rdim_shared->baked_global_variables.global_variables_count = params->global_variables.total_count+1; - rdim_shared->baked_global_variables.global_variables = push_array(arena, RDI_GlobalVariable, rdim_shared->baked_global_variables.global_variables_count); + baked_global_variables = push_array(scratch.arena, RDIM_GlobalVariableBakeResult, 1); + baked_global_variables->global_variables_count = params->global_variables.total_count+1; + baked_global_variables->global_variables = push_array(arena, RDI_GlobalVariable, baked_global_variables->global_variables_count); } if(lane_idx() == lane_from_task_idx(3)) { - rdim_shared->baked_thread_variables.thread_variables_count = params->thread_variables.total_count+1; - rdim_shared->baked_thread_variables.thread_variables = push_array(arena, RDI_ThreadVariable, rdim_shared->baked_thread_variables.thread_variables_count); + baked_thread_variables = push_array(scratch.arena, RDIM_ThreadVariableBakeResult, 1); + baked_thread_variables->thread_variables_count = params->thread_variables.total_count+1; + baked_thread_variables->thread_variables = push_array(arena, RDI_ThreadVariable, baked_thread_variables->thread_variables_count); } if(lane_idx() == lane_from_task_idx(4)) { - rdim_shared->baked_inline_sites.inline_sites_count = params->inline_sites.total_count+1; - rdim_shared->baked_inline_sites.inline_sites = push_array(arena, RDI_InlineSite, rdim_shared->baked_inline_sites.inline_sites_count); + baked_inline_sites = push_array(scratch.arena, RDIM_InlineSiteBakeResult, 1); + baked_inline_sites->inline_sites_count = params->inline_sites.total_count+1; + baked_inline_sites->inline_sites = push_array(arena, RDI_InlineSite, baked_inline_sites->inline_sites_count); } - lane_sync(); + lane_sync_u64(&baked_units, lane_from_task_idx(0)); + lane_sync_u64(&baked_type_nodes, lane_from_task_idx(1)); + lane_sync_u64(&baked_global_variables, lane_from_task_idx(2)); + lane_sync_u64(&baked_thread_variables, lane_from_task_idx(3)); + lane_sync_u64(&baked_inline_sites, lane_from_task_idx(4)); //- rjf: bake units ProfScope("bake units") @@ -3010,7 +3156,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, range) { RDIM_Unit *src = &n->v[n_idx]; - RDI_Unit *dst = &rdim_shared->baked_units.units[n->base_idx + n_idx + 1]; + RDI_Unit *dst = &baked_units->units[n->base_idx + n_idx + 1]; dst->unit_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->unit_name); dst->compiler_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->compiler_name); dst->source_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->source_file); @@ -3032,7 +3178,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, range) { RDIM_Type *src = &n->v[n_idx]; - RDI_TypeNode *dst = &rdim_shared->baked_type_nodes.type_nodes[n->base_idx + n_idx + 1]; + RDI_TypeNode *dst = &baked_type_nodes->type_nodes[n->base_idx + n_idx + 1]; //- rjf: fill shared type node info dst->kind = src->kind; @@ -3106,7 +3252,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, range) { RDIM_Symbol *src = &n->v[n_idx]; - RDI_GlobalVariable *dst = &rdim_shared->baked_global_variables.global_variables[n->base_idx + n_idx + 1]; + RDI_GlobalVariable *dst = &baked_global_variables->global_variables[n->base_idx + n_idx + 1]; dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); dst->voff = src->offset; dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 @@ -3137,7 +3283,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, range) { RDIM_Symbol *src = &n->v[n_idx]; - RDI_ThreadVariable *dst = &rdim_shared->baked_thread_variables.thread_variables[n->base_idx + n_idx + 1]; + RDI_ThreadVariable *dst = &baked_thread_variables->thread_variables[n->base_idx + n_idx + 1]; dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); @@ -3167,7 +3313,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - RDI_InlineSite *dst = &rdim_shared->baked_inline_sites.inline_sites[n->base_idx + n_idx + 1]; + RDI_InlineSite *dst = &baked_inline_sites->inline_sites[n->base_idx + n_idx + 1]; RDIM_InlineSite *src = &n->v[n_idx]; dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 @@ -3182,32 +3328,36 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake file paths // + RDIM_FilePathBakeResult *baked_file_paths = 0; + RDIM_BakePathNode **baked_file_path_src_nodes = 0; ProfScope("bake file paths") { // rjf: set up if(lane_idx() == 0) { - rdim_shared->baked_file_paths.nodes_count = path_tree->count; - rdim_shared->baked_file_paths.nodes = push_array(arena, RDI_FilePathNode, rdim_shared->baked_file_paths.nodes_count); - rdim_shared->baked_file_path_src_nodes = push_array(arena, RDIM_BakePathNode *, rdim_shared->baked_file_paths.nodes_count); + baked_file_paths = push_array(scratch.arena, RDIM_FilePathBakeResult, 1); + baked_file_paths->nodes_count = path_tree->count; + baked_file_paths->nodes = push_array(arena, RDI_FilePathNode, baked_file_paths->nodes_count); + baked_file_path_src_nodes = push_array(arena, RDIM_BakePathNode *, baked_file_paths->nodes_count); { U64 idx = 0; for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) { - rdim_shared->baked_file_path_src_nodes[idx] = n; + baked_file_path_src_nodes[idx] = n; idx += 1; } } } - lane_sync(); + lane_sync_u64(&baked_file_paths, 0); + lane_sync_u64(&baked_file_path_src_nodes, 0); // rjf: fill { - Rng1U64 range = lane_range(rdim_shared->baked_file_paths.nodes_count); + Rng1U64 range = lane_range(baked_file_paths->nodes_count); for EachInRange(idx, range) { - RDIM_BakePathNode *src = rdim_shared->baked_file_path_src_nodes[idx]; - RDI_FilePathNode *dst = &rdim_shared->baked_file_paths.nodes[idx]; + RDIM_BakePathNode *src = baked_file_path_src_nodes[idx]; + RDI_FilePathNode *dst = &baked_file_paths->nodes[idx]; dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); dst->source_file_idx = rdim_idx_from_src_file(src->src_file); if(src->parent != 0) @@ -3230,20 +3380,24 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage do small final baking tasks // + RDIM_TopLevelInfoBakeResult *baked_top_level_info = 0; + RDIM_BinarySectionBakeResult *baked_binary_sections = 0; ProfScope("do small final baking tasks") { if(lane_idx() == lane_from_task_idx(0)) ProfScope("bake top level info") { - rdim_shared->baked_top_level_info.top_level_info = push_array(arena, RDI_TopLevelInfo, 1); - rdim_shared->baked_top_level_info.top_level_info->arch = params->top_level_info.arch; - rdim_shared->baked_top_level_info.top_level_info->exe_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.exe_name); - rdim_shared->baked_top_level_info.top_level_info->exe_hash = params->top_level_info.exe_hash; - rdim_shared->baked_top_level_info.top_level_info->voff_max = params->top_level_info.voff_max; - rdim_shared->baked_top_level_info.top_level_info->guid = params->top_level_info.guid; - rdim_shared->baked_top_level_info.top_level_info->producer_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.producer_name); + baked_top_level_info = push_array(scratch.arena, RDIM_TopLevelInfoBakeResult, 1); + baked_top_level_info->top_level_info = push_array(arena, RDI_TopLevelInfo, 1); + baked_top_level_info->top_level_info->arch = params->top_level_info.arch; + baked_top_level_info->top_level_info->exe_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.exe_name); + baked_top_level_info->top_level_info->exe_hash = params->top_level_info.exe_hash; + baked_top_level_info->top_level_info->voff_max = params->top_level_info.voff_max; + baked_top_level_info->top_level_info->guid = params->top_level_info.guid; + baked_top_level_info->top_level_info->producer_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.producer_name); } if(lane_idx() == lane_from_task_idx(1)) ProfScope("bake binary sections") { + baked_binary_sections = push_array(scratch.arena, RDIM_BinarySectionBakeResult, 1); RDIM_BinarySectionList *src = ¶ms->binary_sections; RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src->count+1); U64 dst_idx = 1; @@ -3258,43 +3412,46 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->foff_first = src->foff_first; dst->foff_opl = src->foff_opl; } - rdim_shared->baked_binary_sections.binary_sections = dst_base; - rdim_shared->baked_binary_sections.binary_sections_count = dst_idx; + baked_binary_sections->binary_sections = dst_base; + baked_binary_sections->binary_sections_count = dst_idx; } } - lane_sync(); + lane_sync_u64(&baked_top_level_info, lane_from_task_idx(0)); + lane_sync_u64(&baked_binary_sections, lane_from_task_idx(1)); ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage package results // RDIM_BakeResults result = {0}; { - result.top_level_info = rdim_shared->baked_top_level_info; - result.binary_sections = rdim_shared->baked_binary_sections; - result.units = rdim_shared->baked_units; - result.unit_vmap = rdim_shared->baked_unit_vmap; - result.src_files = rdim_shared->baked_src_files; - result.checksums = rdim_shared->baked_checksums; - result.line_tables = rdim_shared->baked_line_tables; - result.type_nodes = rdim_shared->baked_type_nodes; - result.udts = rdim_shared->baked_udts; - result.global_variables = rdim_shared->baked_global_variables; - result.global_vmap = rdim_shared->baked_global_vmap; - result.thread_variables = rdim_shared->baked_thread_variables; - result.constants = rdim_shared->baked_constants; - result.procedures = rdim_shared->baked_procedures; - result.scopes = rdim_shared->baked_scopes; - result.inline_sites = rdim_shared->baked_inline_sites; - result.scope_vmap = rdim_shared->baked_scope_vmap; - result.top_level_name_maps = rdim_shared->baked_top_level_name_maps; - result.name_maps = rdim_shared->baked_name_maps; - result.file_paths = rdim_shared->baked_file_paths; - result.strings = rdim_shared->baked_strings; - result.idx_runs = rdim_shared->baked_idx_runs; - result.locations = rdim_shared->baked_locations; - result.location_blocks = rdim_shared->baked_location_blocks; + result.top_level_info = *baked_top_level_info; + result.binary_sections = *baked_binary_sections; + result.units = *baked_units; + result.unit_vmap = *baked_unit_vmap; + result.src_files = *baked_src_files; + result.checksums = *baked_checksums; + result.line_tables = *baked_line_tables; + result.type_nodes = *baked_type_nodes; + result.udts = *baked_udts; + result.global_variables = *baked_global_variables; + result.global_vmap = *baked_global_vmap; + result.thread_variables = *baked_thread_variables; + result.constants = *baked_constants; + result.procedures = *baked_procedures; + result.scopes = *baked_scopes; + result.inline_sites = *baked_inline_sites; + result.scope_vmap = *baked_scope_vmap; + result.top_level_name_maps = *baked_top_level_name_maps; + result.name_maps = *baked_name_maps; + result.file_paths = *baked_file_paths; + result.strings = *baked_strings; + result.idx_runs = *baked_idx_runs; + result.locations = *baked_locations; + result.location_blocks = *baked_location_blocks; } + lane_sync(); + scratch_end(scratch); return result; } diff --git a/src/rdi_make/rdi_make_local.h b/src/rdi_make/rdi_make_local.h index 3e5d6f95..f28c8daa 100644 --- a/src/rdi_make/rdi_make_local.h +++ b/src/rdi_make/rdi_make_local.h @@ -60,106 +60,6 @@ struct RDIM_UnsortedJoinedLineTable RDIM_LineRec *line_recs; }; -//- rjf: shared state bundle - -typedef struct RDIM_Shared RDIM_Shared; -struct RDIM_Shared -{ - RDIM_ScopeVMapBakeResult baked_scope_vmap; - RDIM_UnitVMapBakeResult baked_unit_vmap; - RDIM_GlobalVMapBakeResult baked_global_vmap; - - RDIM_BakePathTree *path_tree; - - RDI_U64 line_tables_count; - RDI_U64 line_table_block_take_counter; - RDIM_LineTable **src_line_tables; - RDIM_UnsortedJoinedLineTable *unsorted_joined_line_tables; - - RDIM_SortKey **sorted_line_table_keys; - - RDIM_LineTableBakeResult baked_line_tables; - - RDIM_BakeStringMapTight bake_strings; - - RDIM_BakeIdxRunMap bake_idx_runs; - - RDIM_StringBakeResult baked_strings; - - RDIM_IndexRunBakeResult baked_idx_runs; - - RDI_U64 *lane_name_map_node_counts[RDI_NameMapKind_COUNT]; - RDI_U64 *lane_name_map_node_offs[RDI_NameMapKind_COUNT]; - RDI_U64 name_map_node_counts[RDI_NameMapKind_COUNT]; - RDI_U64 total_name_map_node_count; - RDIM_TopLevelNameMapBakeResult baked_top_level_name_maps; - RDIM_NameMapBakeResult baked_name_maps; - - RDIM_BakeSrcLineMap *bake_src_line_maps; - - RDI_U64 bake_src_line_map_take_counter; - RDIM_SortKey **bake_src_line_map_keys; - - RDI_U64 *lane_chunk_src_file_num_counts; // [lane_count * src_file_chunk_count] - RDI_U64 *lane_chunk_src_file_voff_counts; // [lane_count * src_file_chunk_count] - RDI_U64 *lane_chunk_src_file_map_counts; // [lane_count * src_file_chunk_count] - RDI_U64 *lane_chunk_src_file_num_offs; // [lane_count * src_file_chunk_count] - RDI_U64 *lane_chunk_src_file_voff_offs; // [lane_count * src_file_chunk_count] - RDI_U64 *lane_chunk_src_file_map_offs; // [lane_count * src_file_chunk_count] - RDI_U64 *lane_chunk_src_file_checksum_counts[RDI_ChecksumKind_COUNT]; // [lane_count * src_file_chunk_count] - RDI_U64 *lane_chunk_src_file_checksum_offs[RDI_ChecksumKind_COUNT]; // [lane_count * src_file_chunk_count] - U64 total_checksum_counts[RDI_ChecksumKind_COUNT]; - RDI_U64 total_src_map_line_count; - RDI_U64 total_src_map_voff_count; - - RDIM_ChecksumBakeResult baked_checksums; - - RDIM_SrcFileBakeResult baked_src_files; - - RDI_U64 *member_chunk_lane_counts; // [lane_count * udt_chunk_count] - RDI_U64 *member_chunk_lane_offs; // [lane_count * udt_chunk_count] - RDI_U64 *enum_val_chunk_lane_counts; // [lane_count * udt_chunk_count] - RDI_U64 *enum_val_chunk_lane_offs; // [lane_count * udt_chunk_count] - - RDIM_UDTBakeResult baked_udts; - - RDI_U64 *location_case_chunk_lane_counts; // [lane_count * (scope_chunk_count + procedure_chunk_count) - RDI_U64 *location_case_chunk_lane_offs; // [lane_count * (scope_chunk_count + procedure_chunk_count) - RDI_U64 total_location_case_count; - - RDIM_LocationBlockBakeResult baked_location_blocks; - - RDIM_LocationBakeResult baked_locations; - - RDI_U64 *scope_local_chunk_lane_counts; // [lane_count * scope_chunk_count] - RDI_U64 *scope_local_chunk_lane_offs; // [lane_count * scope_chunk_count] - RDI_U64 *scope_voff_chunk_lane_counts; // [lane_count * scope_chunk_count] - RDI_U64 *scope_voff_chunk_lane_offs; // [lane_count * scope_chunk_count] - - RDIM_ScopeBakeResult baked_scopes; - - RDIM_ProcedureBakeResult baked_procedures; - - RDI_U64 *constant_data_chunk_lane_counts; // [lane_count * constant_chunk_count] - RDI_U64 *constant_data_chunk_lane_offs; // [lane_count * constant_chunk_count] - - RDIM_ConstantsBakeResult baked_constants; - - RDIM_UnitBakeResult baked_units; - RDIM_TypeNodeBakeResult baked_type_nodes; - RDIM_GlobalVariableBakeResult baked_global_variables; - RDIM_ThreadVariableBakeResult baked_thread_variables; - RDIM_InlineSiteBakeResult baked_inline_sites; - - RDIM_BakePathNode **baked_file_path_src_nodes; - RDIM_FilePathBakeResult baked_file_paths; - - RDIM_TopLevelInfoBakeResult baked_top_level_info; - RDIM_BinarySectionBakeResult baked_binary_sections; -}; - -global RDIM_Shared *rdim_shared = 0; - internal RDIM_DataModel rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch); internal RDIM_TopLevelInfo rdim_make_top_level_info(String8 image_name, Arch arch, U64 exe_hash, RDIM_BinarySectionList sections); internal RDIM_BakeParams rdim_loose_from_rdi(Arena *arena, RDIM_SubsetFlags subset_flags, RDI_Parsed *rdi); From 408b3af27ce3379272f8c5ead3902fe5c750d3ae Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 9 Mar 2026 14:36:05 -0700 Subject: [PATCH 276/850] rdi namespace baking; cv parsing rec iterator, deduplicate oob-safe cv record iterating --- src/codeview/codeview_parse.c | 28 ++++ src/codeview/codeview_parse.h | 15 ++ src/rdi_from_pdb/rdi_from_pdb.c | 278 +++++++++++--------------------- src/rdi_make/rdi_make_local.c | 35 +++- 4 files changed, 169 insertions(+), 187 deletions(-) diff --git a/src/codeview/codeview_parse.c b/src/codeview/codeview_parse.c index a460de63..1a44b83e 100644 --- a/src/codeview/codeview_parse.c +++ b/src/codeview/codeview_parse.c @@ -1606,3 +1606,31 @@ cv_c13_parsed_from_data(Arena *arena, String8 c13_data, String8 strtbl, COFF_Sec return result; } +//- rjf: record iterator + +internal B32 +cv_rec_next(String8 data, CV_RecRangeArray *recs, B32 is_leaf, CV_RecIter *iter) +{ + B32 result = 0; + { + U64 next_num = iter->num+1; + for(;1 <= next_num && next_num <= recs->count; next_num += 1) + { + CV_RecRange *rec_range = &recs->ranges[next_num-1]; + U64 rec_off_first = rec_range->off + 2; // (skip 2 header bytes) + U64 rec_off_opl = rec_range->off + rec_range->hdr.size; + U16 kind = rec_range->hdr.kind; + U64 header_struct_size = (is_leaf ? cv_header_struct_size_from_leaf_kind(kind) : cv_header_struct_size_from_sym_kind(kind)); + if(rec_off_opl <= data.size && rec_off_first + header_struct_size <= data.size) + { + result = 1; + iter->num = next_num; + iter->kind = kind; + iter->struct_base = data.str + rec_off_first; + iter->opl = data.str + rec_off_opl; + break; + } + } + } + return result; +} diff --git a/src/codeview/codeview_parse.h b/src/codeview/codeview_parse.h index 111d1288..e6a5c6c1 100644 --- a/src/codeview/codeview_parse.h +++ b/src/codeview/codeview_parse.h @@ -236,6 +236,18 @@ struct CV_TypeIdArray U64 count; }; +//////////////////////////////// +//~ Record Iterator + +typedef struct CV_RecIter CV_RecIter; +struct CV_RecIter +{ + U64 num; + U16 kind; + void *struct_base; + void *opl; +}; + //////////////////////////////// //- Hasher @@ -301,5 +313,8 @@ internal CV_SymParsed * cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym internal CV_LeafParsed * cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId first); internal CV_C13Parsed * cv_c13_parsed_from_data(Arena *arena, String8 c13_data, String8 strtbl, COFF_SectionHeaderArray sections); +//- rjf: record iterator +internal B32 cv_rec_next(String8 data, CV_RecRangeArray *recs, B32 is_leaf, CV_RecIter *iter); + #endif // CODEVIEW_PARSE_H diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index c84ea125..912b4cd2 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -757,33 +757,16 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(params->subset_flags & RDIM_SubsetFlag_Procedures) { CV_SymParsed *sym = all_syms[0]; - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = sym->sym_ranges.ranges + sym->sym_ranges.count; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) { - //- rjf: unpack symbol range info - CV_SymKind kind = rec_range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_sym_kind(kind); - U8 *sym_first = sym->data.str + rec_range->off + 2; - U8 *sym_opl = sym_first + rec_range->hdr.size; - - //- rjf: skip bad ranges - if(sym_opl > sym->data.str + sym->data.size || sym_first + header_struct_size > sym->data.str + sym->data.size) - { - continue; - } - - //- rjf: consume symbol - switch(kind) + switch(iter.kind) { default:{}break; case CV_SymKind_PUB32: { // rjf: unpack sym - CV_SymPub32 *pub32 = (CV_SymPub32 *)sym_first; - String8 name = str8_cstring_capped(pub32+1, sym_opl); + CV_SymPub32 *pub32 = (CV_SymPub32 *)iter.struct_base; + String8 name = str8_cstring_capped(pub32+1, iter.opl); COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= coff_sections.count) ? &coff_sections.v[pub32->sec-1] : 0; U64 voff = 0; if(section != 0) @@ -847,8 +830,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) PDB_CompUnit *unit = comp_units->units[unit_idx]; CV_SymParsed *sym = all_syms[unit_idx+1]; CV_C13Parsed *c13 = all_c13s[unit_idx+1]; - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = sym->sym_ranges.ranges + sym->sym_ranges.count; //- rjf: produce obj name/path String8 obj_name = unit->obj_name; @@ -866,34 +847,9 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) P2R_SrcFileStubNode *last_src_file_stub = 0; U64 src_file_stub_count = 0; U64 base_voff = 0; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = sym->data.str + sym_off_first; - void *sym_data_opl = sym->data.str + sym_off_opl; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: process symbol - switch(kind) + switch(iter.kind) { default:{}break; @@ -901,7 +857,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) case CV_SymKind_LPROC32: case CV_SymKind_GPROC32: { - CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0; if(section != 0) { @@ -913,8 +869,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) case CV_SymKind_INLINESITE: { // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)sym_header_struct_base; - String8 binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym)); + CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; + String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); // rjf: map inlinee -> parsed cv c13 inlinee line info CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0; @@ -1331,37 +1287,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: build per-inline-site line tables if(params->subset_flags & RDIM_SubsetFlag_InlineLineInfo) ProfScope("build per-inline-site line tables") { - CV_RecRange *rec_ranges_first = src_unit_sym->sym_ranges.ranges; - CV_RecRange *rec_ranges_opl = src_unit_sym->sym_ranges.ranges + src_unit_sym->sym_ranges.count; U64 base_voff = 0; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) + for(CV_RecIter iter = {0}; cv_rec_next(src_unit_sym->data, &src_unit_sym->sym_ranges, 0, &iter);) { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > src_unit_sym->data.size || sym_off_first > src_unit_sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = src_unit_sym->data.str + sym_off_first; - void *sym_data_opl = src_unit_sym->data.str + sym_off_opl; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: process symbol - switch(kind) + switch(iter.kind) { default:{}break; @@ -1369,7 +1298,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) case CV_SymKind_LPROC32: case CV_SymKind_GPROC32: { - CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0; if(section != 0) { @@ -1381,8 +1310,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) case CV_SymKind_INLINESITE: { // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)sym_header_struct_base; - String8 binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym)); + CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; + String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); // rjf: map inlinee -> parsed cv c13 inlinee line info CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0; @@ -1592,6 +1521,44 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync(); RDIM_SrcFileChunkList all_src_files = *all_src_files__sequenceless; + ////////////////////////////////////////////////////////////// + //- rjf: gather user-defined namespaces + // + ProfScope("gather user-defined namespaces") + { + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + for(;;) + { + //- rjf: take next sym + U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(sym_idx >= all_syms_count) + { + break; + } + + //- rjf: unpack sym + Temp scratch = scratch_begin(&arena, 1); + CV_SymParsed *sym = all_syms[sym_idx]; + + //- rjf: iterate namespaces + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + case CV_SymKind_UNAMESPACE: + { + String8 string = str8_cstring_capped(iter.struct_base, iter.opl); + // TODO(rjf) + }break; + } + } + + scratch_end(scratch); + } + } + ////////////////////////////////////////////////////////////// //- rjf: types pass 1: produce type forward resolution map // @@ -2601,11 +2568,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } } - //- rjf: gather namespaces - { - - } - //- rjf: store finalized type to this itype's slot itype_type_ptrs[itype] = dst_type; } @@ -3349,7 +3311,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: unpack sym Temp scratch = scratch_begin(&arena, 1); CV_SymParsed *sym = all_syms[sym_idx]; - Rng1U64 sym_rec_range = r1u64(0, sym->sym_ranges.count); U64 sym_locations_chunk_cap = 4096; U64 sym_procedures_chunk_cap = 2048; U64 sym_global_variables_chunk_cap = 2048; @@ -3370,40 +3331,14 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) // U64 procedure_frameprocs_count = 0; - U64 procedure_frameprocs_cap = dim_1u64(sym_rec_range); + U64 procedure_frameprocs_cap = sym->sym_ranges.count; CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") { U64 procedure_num = 0; - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges + sym_rec_range.min; - CV_RecRange *rec_ranges_opl = sym->sym_ranges.ranges + sym_rec_range.max; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = sym->data.str + sym_off_first; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) + switch(iter.kind) { default:{}break; @@ -3412,7 +3347,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { if(procedure_num == 0) { break; } if(procedure_num > procedure_frameprocs_cap) { break; } - CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base; + CV_SymFrameproc *frameproc = (CV_SymFrameproc *)iter.struct_base; procedure_frameprocs[procedure_num-1] = frameproc; procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); }break; @@ -3441,8 +3376,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) CV_ProcFlags proc_flags = 0; U64 regrel_idx = 0; RDIM_Symbol *curr_proc_symbol = 0; - CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges + sym_rec_range.min; - CV_RecRange *rec_ranges_opl = sym->sym_ranges.ranges + sym_rec_range.max; typedef struct P2R_ScopeNode P2R_ScopeNode; struct P2R_ScopeNode { @@ -3452,34 +3385,9 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) P2R_ScopeNode *top_scope_node = 0; P2R_ScopeNode *free_scope_node = 0; RDIM_LineTable *inline_site_line_table = sym_idx > 0 ? units_first_inline_site_line_tables[sym_idx-1] : 0; - for(CV_RecRange *rec_range = rec_ranges_first; - rec_range < rec_ranges_opl; - rec_range += 1) + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) { - //- rjf: rec range -> symbol info range - U64 sym_off_first = rec_range->off + 2; - U64 sym_off_opl = rec_range->off + rec_range->hdr.size; - - //- rjf: skip invalid ranges - if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl) - { - continue; - } - - //- rjf: unpack symbol info - CV_SymKind kind = rec_range->hdr.kind; - U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind); - void *sym_header_struct_base = sym->data.str + sym_off_first; - void *sym_data_opl = sym->data.str + sym_off_opl; - - //- rjf: skip bad sizes - if(sym_off_first + sym_header_struct_size > sym_off_opl) - { - continue; - } - - //- rjf: consume symbol based on kind - switch(kind) + switch(iter.kind) { default:{}break; @@ -3500,7 +3408,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) case CV_SymKind_BLOCK32: { // rjf: unpack sym - CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base; + CV_SymBlock32 *block32 = (CV_SymBlock32 *)iter.struct_base; // rjf: build scope, insert into current parent scope RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); @@ -3541,8 +3449,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) case CV_SymKind_GDATA32: { // rjf: unpack sym - CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(data32+1, sym_data_opl); + CV_SymData32 *data32 = (CV_SymData32 *)iter.struct_base; + String8 name = str8_cstring_capped(data32+1, iter.opl); COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= coff_sections.count) ? &coff_sections.v[data32->sec-1] : 0; U64 voff = (section ? section->voff : 0) + data32->off; @@ -3582,7 +3490,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: build symbol RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_global_variables, sym_global_variables_chunk_cap); - symbol->is_extern = (kind == CV_SymKind_GDATA32); + symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); symbol->name = name; symbol->type = type; symbol->offset = voff; @@ -3597,8 +3505,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { if(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs|RDIM_SubsetFlag_TypeNameMap)) { - CV_SymUDT *udt = (CV_SymUDT *)sym_header_struct_base; - String8 name = str8_cstring_capped(udt+1, sym_data_opl); + CV_SymUDT *udt = (CV_SymUDT *)iter.struct_base; + String8 name = str8_cstring_capped(udt+1, iter.opl); RDIM_Type *type = rdim_type_chunk_list_push(arena, typedefs, 4096); type->kind = RDI_TypeKind_Alias; type->name = name; @@ -3615,8 +3523,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) case CV_SymKind_GPROC32: { // rjf: unpack sym - CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(proc32+1, sym_data_opl); + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + String8 name = str8_cstring_capped(proc32+1, iter.opl); RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); // rjf: unpack proc's container type @@ -3680,7 +3588,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(params->subset_flags & (RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_ProcedureNameMap)) { curr_proc_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); - curr_proc_symbol->is_extern = (kind == CV_SymKind_GPROC32); + curr_proc_symbol->is_extern = (iter.kind == CV_SymKind_GPROC32); curr_proc_symbol->name = name; curr_proc_symbol->link_name = link_name; curr_proc_symbol->type = type; @@ -3731,8 +3639,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: unpack sym - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(regrel32+1, sym_data_opl); + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)iter.struct_base; + String8 name = str8_cstring_capped(regrel32+1, iter.opl); RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); CV_Reg cv_reg = regrel32->reg; U32 var_off = regrel32->reg_off; @@ -3813,8 +3721,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(params->subset_flags & (RDIM_SubsetFlag_ThreadVariables|RDIM_SubsetFlag_ThreadVariableNameMap)) { // rjf: unpack sym - CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base; - String8 name = str8_cstring_capped(thread32+1, sym_data_opl); + CV_SymThread32 *thread32 = (CV_SymThread32 *)iter.struct_base; + String8 name = str8_cstring_capped(thread32+1, iter.opl); U32 tls_off = thread32->tls_off; RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); @@ -3839,7 +3747,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, sym_thread_variables, sym_thread_variables_chunk_cap); tvar->name = name; tvar->type = type; - tvar->is_extern = (kind == CV_SymKind_GTHREAD32); + tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); tvar->offset = tls_off; tvar->container_type = container_type; tvar->container_symbol = container_symbol; @@ -3857,8 +3765,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: unpack sym - CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base; - String8 name = str8_cstring_capped(slocal+1, sym_data_opl); + CV_SymLocal *slocal = (CV_SymLocal *)iter.struct_base; + String8 name = str8_cstring_capped(slocal+1, iter.opl); RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); // rjf: determine if this symbol encodes the beginning of a global modification @@ -3911,12 +3819,12 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: unpack sym - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base; + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)iter.struct_base; CV_Reg cv_reg = defrange_register->reg; CV_LvarAddrRange *range = &defrange_register->range; COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); // rjf: build location @@ -3952,11 +3860,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: unpack sym - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base; + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)iter.struct_base; CV_LvarAddrRange *range = &defrange_fprel->range; COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); // rjf: select frame pointer register CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target_is_param); @@ -3985,12 +3893,12 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: unpack sym - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base; + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)iter.struct_base; CV_Reg cv_reg = defrange_subfield_register->reg; CV_LvarAddrRange *range = &defrange_subfield_register->range; COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); // rjf: skip "subfield" location info - currently not supported @@ -4032,7 +3940,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: unpack sym - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base; + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)iter.struct_base; CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target_is_param); RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); @@ -4060,13 +3968,13 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: unpack sym - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base; + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)iter.struct_base; CV_Reg cv_reg = defrange_register_rel->reg; RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); CV_LvarAddrRange *range = &defrange_register_rel->range; COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); - U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); // rjf: build location // TODO(rjf): offset & size from cv_reg code @@ -4084,8 +3992,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: FILESTATIC case CV_SymKind_FILESTATIC: { - CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base; - String8 name = str8_cstring_capped(file_static+1, sym_data_opl); + CV_SymFileStatic *file_static = (CV_SymFileStatic*)iter.struct_base; + String8 name = str8_cstring_capped(file_static+1, iter.opl); RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); // TODO(rjf): emit a global modifier symbol defrange_target = 0; @@ -4097,13 +4005,13 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(params->subset_flags & (RDIM_SubsetFlag_Scopes)) { // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)sym_header_struct_base; - String8 binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym)); + CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; + String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); // rjf: extract external info about inline site - String8 name = str8_zero(); - RDIM_Type *type = 0; - RDIM_Type *owner = 0; + String8 name = {0}; + RDIM_Type *type = 0; + RDIM_Type *owner = 0; if(ipi_leaf != 0 && ipi_leaf->itype_first <= sym->inlinee && sym->inlinee < ipi_leaf->itype_opl) { CV_RecRange rec_range = ipi_leaf->leaf_ranges.ranges[sym->inlinee - ipi_leaf->itype_first]; @@ -4230,13 +4138,13 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(params->subset_flags & RDIM_SubsetFlag_Constants) { // rjf: unpack - CV_SymConstant *sym = (CV_SymConstant *)sym_header_struct_base; + CV_SymConstant *sym = (CV_SymConstant *)iter.struct_base; RDIM_Type *type = p2r_type_ptr_from_itype(sym->itype); U8 *val_ptr = (U8 *)(sym+1); - CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, sym_data_opl); + CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, iter.opl); U64 val64 = cv_u64_from_numeric(&val); U8 *name_ptr = val_ptr + val.encoded_size; - String8 name = str8_cstring_capped(name_ptr, sym_data_opl); + String8 name = str8_cstring_capped(name_ptr, iter.opl); String8 val_data = str8_struct(&val64); U64 container_name_opl = 0; if(type != 0) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 2bd1015e..7301c26e 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2404,14 +2404,45 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake namespaces // + RDIM_NamespaceBakeResult *baked_namespaces = 0; ProfScope("bake namespaces") { // rjf: allocate if(lane_idx() == 0) { - + baked_namespaces = push_array(scratch.arena, RDIM_NamespaceBakeResult, 1); + baked_namespaces->namespaces_count = params->namespaces.total_count + 1; + baked_namespaces->namespaces = push_array(arena, RDI_Namespace, baked_namespaces->namespaces_count); + } + lane_sync_u64(&baked_namespaces, 0); + + // rjf: fill + for EachNode(n, RDIM_NamespaceChunkNode, params->namespaces.first) + { + Rng1U64 range = lane_range(n->count); + for EachInRange(n_idx, range) + { + U64 dst_idx = n->base_idx + n_idx + 1; + RDIM_Namespace *src = &n->v[n_idx]; + RDI_Namespace *dst = &baked_namespaces->namespaces[dst_idx]; + dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); + if(src->parent_namespace != 0) + { + dst->container_flags |= RDI_ContainerKind_Namespace; + dst->container_idx = rdim_idx_from_namespace(src->parent_namespace); + } + else if(src->parent_scope != 0) + { + dst->container_flags |= RDI_ContainerKind_Scope; + dst->container_idx = rdim_idx_from_scope(src->parent_scope); + } + else if(src->parent_udt != 0) + { + dst->container_flags |= RDI_ContainerKind_Type; + dst->container_idx = rdim_idx_from_udt(src->parent_udt); + } + } } - lane_sync(); } ////////////////////////////////////////////////////////////// From 5badc7f32504b07779cd066e87f5bfd59a9142c4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 9 Mar 2026 15:15:48 -0700 Subject: [PATCH 277/850] sketch out unified RDI_Variable to replace RDI_GlobalVariable, RDI_ThreadVariable, RDI_Local, and RDI_Constant, & plug into new RDI structured namespaces --- src/lib_rdi/rdi.h | 42 +++++++++++++++++++++++++++++++- src/lib_rdi_make/rdi_make.h | 1 - src/rdi/rdi.mdesk | 43 ++++++++++++++++++++++++++++++++- src/rdi_from_pdb/rdi_from_pdb.c | 38 ----------------------------- 4 files changed, 83 insertions(+), 41 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index af756bb7..e3f980dd 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -388,7 +388,7 @@ typedef RDI_U32 RDI_ContainerFlags; typedef enum RDI_ContainerFlagsEnum { RDI_ContainerFlag_External = 1<<8, -RDI_ContainerFlag_KindMask = 0xff, +RDI_ContainerFlag_KindMask = 0xff, } RDI_ContainerFlagsEnum; typedef RDI_U32 RDI_LinkFlags; @@ -407,6 +407,15 @@ RDI_LocalKind_Parameter = 0x1, RDI_LocalKind_Variable = 0x2, } RDI_LocalKindEnum; +typedef RDI_U8 RDI_VariableKind; +typedef enum RDI_VariableKindEnum +{ +RDI_VariableKind_Local = 0x0, +RDI_VariableKind_Param = 0x1, +RDI_VariableKind_Global = 0x2, +RDI_VariableKind_Thread = 0x3, +} RDI_VariableKindEnum; + typedef RDI_U8 RDI_LocationKind; typedef enum RDI_LocationKindEnum { @@ -416,6 +425,10 @@ RDI_LocationKind_ValBytecodeStream = 0x2, RDI_LocationKind_AddrRegPlusU16 = 0x3, RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, RDI_LocationKind_ValReg = 0x5, +RDI_LocationKind_ModuleOff = 0x6, +RDI_LocationKind_TLSOff = 0x7, +RDI_LocationKind_ConstantDataOff = 0x8, +RDI_LocationKind_List = 0x9, } RDI_LocationKindEnum; typedef RDI_U8 RDI_EvalOp; @@ -891,12 +904,26 @@ X(ValBytecodeStream)\ X(AddrRegPlusU16)\ X(AddrAddrRegPlusU16)\ X(ValReg)\ +X(ModuleOff)\ +X(TLSOff)\ +X(ConstantDataOff)\ +X(List)\ #define RDI_Namespace_XList \ X(RDI_U32, name_string_idx)\ X(RDI_ContainerFlags, container_flags)\ X(RDI_U32, container_idx)\ +#define RDI_Variable_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_ContainerFlags, container_flags)\ +X(RDI_U32, container_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_VariableKind, variable_kind)\ +X(RDI_LocationKind, location_kind)\ +X(RDI_U16, padding)\ +X(RDI_U32, location_idx)\ + #define RDI_GlobalVariable_XList \ X(RDI_U32, name_string_idx)\ X(RDI_LinkFlags, link_flags)\ @@ -1351,6 +1378,19 @@ RDI_ContainerFlags container_flags; RDI_U32 container_idx; }; +typedef struct RDI_Variable RDI_Variable; +struct RDI_Variable +{ +RDI_U32 name_string_idx; +RDI_ContainerFlags container_flags; +RDI_U32 container_idx; +RDI_U32 type_idx; +RDI_VariableKind variable_kind; +RDI_LocationKind location_kind; +RDI_U16 padding; +RDI_U32 location_idx; +}; + typedef struct RDI_GlobalVariable RDI_GlobalVariable; struct RDI_GlobalVariable { diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 6ef897af..6329e602 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -722,7 +722,6 @@ struct RDIM_Type RDI_U32 off; RDI_U32 count; RDIM_String8 name; - RDIM_String8 link_name; RDIM_Type *direct_type; RDIM_Type **param_types; struct RDIM_UDT *udt; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 32188395..821888cb 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -956,6 +956,7 @@ RDI_ContainerKindTable: RDI_ContainerFlagTable: { {External `1<<8`} + {KindMask `0xff`} } @table(name value) @@ -983,6 +984,19 @@ RDI_LocationKindTable: {AddrRegPlusU16 0x3} {AddrAddrRegPlusU16 0x4} {ValReg 0x5} + {ModuleOff 0x6} + {TLSOff 0x7} + {ConstantDataOff 0x8} + {List 0x9} +} + +@table(name value) +RDI_VariableKindTable: +{ + {Local 0x0} + {Param 0x1} + {Global 0x2} + {Thread 0x3} } @table(name type desc) @@ -993,6 +1007,19 @@ RDI_NamespaceMemberTable: {container_idx RDI_U32 ""} } +@table(name type desc) +RDI_VariableMemberTable: +{ + {name_string_idx RDI_U32 ""} + {container_flags RDI_ContainerFlags ""} + {container_idx RDI_U32 ""} + {type_idx RDI_U32 ""} + {variable_kind RDI_VariableKind ""} + {location_kind RDI_LocationKind ""} + {padding RDI_U16 ""} + {location_idx RDI_U32 ""} +} + @table(name type desc) RDI_GlobalVariableMemberTable: { @@ -1108,7 +1135,6 @@ RDI_LocationRegMemberTable: @enum(RDI_U32) RDI_ContainerFlags: { @expand(RDI_ContainerFlagTable a) `$(a.name .. =>20) = $(a.value)`, - `KindMask = 0xff`, } @enum(RDI_U32) RDI_LinkFlags: @@ -1121,6 +1147,11 @@ RDI_LocationRegMemberTable: @expand(RDI_LocalKindTable a) `$(a.name .. =>20) = $(a.value)` } +@enum(RDI_U8) RDI_VariableKind: +{ + @expand(RDI_VariableKindTable a) `$(a.name .. =>20) = $(a.value)` +} + @enum(RDI_U8) RDI_LocationKind: { @expand(RDI_LocationKindTable a) `$(a.name .. =>20) = $(a.value)` @@ -1148,6 +1179,11 @@ RDI_LocationRegMemberTable: @expand(RDI_NamespaceMemberTable a) `$(a.type), $(a.name)` } +@xlist RDI_Variable_XList: +{ + @expand(RDI_VariableMemberTable a) `$(a.type), $(a.name)` +} + @xlist RDI_GlobalVariable_XList: { @expand(RDI_GlobalVariableMemberTable a) `$(a.type), $(a.name)` @@ -1205,6 +1241,11 @@ RDI_LocationRegMemberTable: @expand(RDI_NamespaceMemberTable a) `$(a.type) $(a.name)` } +@struct RDI_Variable: +{ + @expand(RDI_VariableMemberTable a) `$(a.type) $(a.name)` +} + @struct RDI_GlobalVariable: { @expand(RDI_GlobalVariableMemberTable a) `$(a.type) $(a.name)` diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 912b4cd2..8df02b23 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -1521,44 +1521,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync(); RDIM_SrcFileChunkList all_src_files = *all_src_files__sequenceless; - ////////////////////////////////////////////////////////////// - //- rjf: gather user-defined namespaces - // - ProfScope("gather user-defined namespaces") - { - U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; - lane_sync_u64(&sym_take_counter, 0); - for(;;) - { - //- rjf: take next sym - U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) - { - break; - } - - //- rjf: unpack sym - Temp scratch = scratch_begin(&arena, 1); - CV_SymParsed *sym = all_syms[sym_idx]; - - //- rjf: iterate namespaces - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - case CV_SymKind_UNAMESPACE: - { - String8 string = str8_cstring_capped(iter.struct_base, iter.opl); - // TODO(rjf) - }break; - } - } - - scratch_end(scratch); - } - } - ////////////////////////////////////////////////////////////// //- rjf: types pass 1: produce type forward resolution map // From 38f08922e53fcae8af51f0c520276522e3daaa69 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 10 Mar 2026 16:01:33 -0700 Subject: [PATCH 278/850] rdi: sketch out refined location info sections / types - prereq for RDI_Symbol unification --- src/lib_rdi/rdi.c | 10 ++- src/lib_rdi/rdi.h | 131 ++++++++++++++++++++++++-------- src/rdi/rdi.mdesk | 186 +++++++++++++++++++++++++++++----------------- 3 files changed, 223 insertions(+), 104 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index d68158f4..8ae9131e 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -10,7 +10,7 @@ #ifndef RDI_C #define RDI_C -RDI_U16 rdi_section_element_size_table[45] = +RDI_U16 rdi_section_element_size_table[53] = { sizeof(RDI_U8), sizeof(RDI_TopLevelInfo), @@ -48,6 +48,14 @@ sizeof(RDI_Local), sizeof(RDI_LocationBlock), sizeof(RDI_U8), sizeof(RDI_U8), +sizeof(RDI_LocationRegPlusU16), +sizeof(RDI_LocationReg), +sizeof(RDI_U64), +sizeof(RDI_U32), +sizeof(RDI_U64), +sizeof(RDI_LocationSet), +sizeof(RDI_LocationSetElement), +sizeof(RDI_U8), sizeof(RDI_U32), sizeof(RDI_MD5), sizeof(RDI_SHA1), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index e3f980dd..91d02591 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -67,7 +67,7 @@ union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; // "raddbg\0\0" #define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 19 +#define RDI_ENCODING_VERSION 20 //////////////////////////////////////////////////////////////// //~ Format Types & Functions @@ -110,16 +110,24 @@ RDI_SectionKind_InlineSites = 0x001F, RDI_SectionKind_Locals = 0x0020, RDI_SectionKind_LocationBlocks = 0x0021, RDI_SectionKind_LocationData = 0x0022, -RDI_SectionKind_ConstantValueData = 0x0023, -RDI_SectionKind_ConstantValueTable = 0x0024, -RDI_SectionKind_MD5Checksums = 0x0025, -RDI_SectionKind_SHA1Checksums = 0x0026, -RDI_SectionKind_SHA256Checksums = 0x0027, -RDI_SectionKind_Timestamps = 0x0028, -RDI_SectionKind_NameMaps = 0x0029, -RDI_SectionKind_NameMapBuckets = 0x002A, -RDI_SectionKind_NameMapNodes = 0x002B, -RDI_SectionKind_COUNT = 0x002C, +RDI_SectionKind_LocationsBytecodeData = 0x0023, +RDI_SectionKind_LocationsRegPlusU16 = 0x0024, +RDI_SectionKind_LocationsReg = 0x0025, +RDI_SectionKind_LocationsModuleOff = 0x0026, +RDI_SectionKind_LocationsTLSOff = 0x0027, +RDI_SectionKind_LocationsConstantDataOff = 0x0028, +RDI_SectionKind_LocationsSet = 0x0029, +RDI_SectionKind_LocationsSetElements = 0x002A, +RDI_SectionKind_ConstantValueData = 0x002B, +RDI_SectionKind_ConstantValueTable = 0x002C, +RDI_SectionKind_MD5Checksums = 0x002D, +RDI_SectionKind_SHA1Checksums = 0x002E, +RDI_SectionKind_SHA256Checksums = 0x002F, +RDI_SectionKind_Timestamps = 0x0030, +RDI_SectionKind_NameMaps = 0x0031, +RDI_SectionKind_NameMapBuckets = 0x0032, +RDI_SectionKind_NameMapNodes = 0x0033, +RDI_SectionKind_COUNT = 0x0034, } RDI_SectionKindEnum; typedef RDI_U32 RDI_SectionEncoding; @@ -384,11 +392,11 @@ RDI_ContainerKind_Scope = 0x1, RDI_ContainerKind_Namespace = 0x2, } RDI_ContainerKindEnum; -typedef RDI_U32 RDI_ContainerFlags; +typedef RDI_U8 RDI_ContainerFlags; typedef enum RDI_ContainerFlagsEnum { -RDI_ContainerFlag_External = 1<<8, -RDI_ContainerFlag_KindMask = 0xff, +RDI_ContainerFlag_External = 1u<<7, +RDI_ContainerFlag_KindMask = 0x7f, } RDI_ContainerFlagsEnum; typedef RDI_U32 RDI_LinkFlags; @@ -407,14 +415,11 @@ RDI_LocalKind_Parameter = 0x1, RDI_LocalKind_Variable = 0x2, } RDI_LocalKindEnum; -typedef RDI_U8 RDI_VariableKind; -typedef enum RDI_VariableKindEnum +typedef RDI_U8 RDI_SymbolFlags; +typedef enum RDI_SymbolFlagsEnum { -RDI_VariableKind_Local = 0x0, -RDI_VariableKind_Param = 0x1, -RDI_VariableKind_Global = 0x2, -RDI_VariableKind_Thread = 0x3, -} RDI_VariableKindEnum; +RDI_SymbolFlag_IsParam = 0x1, +} RDI_SymbolFlagsEnum; typedef RDI_U8 RDI_LocationKind; typedef enum RDI_LocationKindEnum @@ -428,7 +433,7 @@ RDI_LocationKind_ValReg = 0x5, RDI_LocationKind_ModuleOff = 0x6, RDI_LocationKind_TLSOff = 0x7, RDI_LocationKind_ConstantDataOff = 0x8, -RDI_LocationKind_List = 0x9, +RDI_LocationKind_Set = 0x9, } RDI_LocationKindEnum; typedef RDI_U8 RDI_EvalOp; @@ -570,6 +575,14 @@ X(InlineSites, inline_sites, RDI_InlineSite)\ X(Locals, locals, RDI_Local)\ X(LocationBlocks, location_blocks, RDI_LocationBlock)\ X(LocationData, location_data, RDI_U8)\ +X(LocationsBytecodeData, locations_bytecode_data, RDI_U8)\ +X(LocationsRegPlusU16, locations_reg_plus_u16, RDI_LocationRegPlusU16)\ +X(LocationsReg, locations_reg, RDI_LocationReg)\ +X(LocationsModuleOff, locations_module_off, RDI_U64)\ +X(LocationsTLSOff, locations_tls_off, RDI_U32)\ +X(LocationsConstantDataOff, locations_constant_data_off, RDI_U64)\ +X(LocationsSet, locations_set, RDI_LocationSet)\ +X(LocationsSetElements, locations_set_elements, RDI_LocationSetElement)\ X(ConstantValueData, constant_value_data, RDI_U8)\ X(ConstantValueTable, constant_value_table, RDI_U32)\ X(MD5Checksums, md5_checksums, RDI_MD5)\ @@ -907,22 +920,25 @@ X(ValReg)\ X(ModuleOff)\ X(TLSOff)\ X(ConstantDataOff)\ -X(List)\ +X(Set)\ #define RDI_Namespace_XList \ X(RDI_U32, name_string_idx)\ X(RDI_ContainerFlags, container_flags)\ X(RDI_U32, container_idx)\ -#define RDI_Variable_XList \ +#define RDI_Symbol_XList \ X(RDI_U32, name_string_idx)\ +X(RDI_SymbolFlags, symbol_flags)\ +X(RDI_LocationKind, location_kind)\ X(RDI_ContainerFlags, container_flags)\ +X(RDI_U8, reserved_0)\ +X(RDI_U32, reserved_1)\ X(RDI_U32, container_idx)\ X(RDI_U32, type_idx)\ -X(RDI_VariableKind, variable_kind)\ -X(RDI_LocationKind, location_kind)\ -X(RDI_U16, padding)\ X(RDI_U32, location_idx)\ +X(RDI_U32, root_scope_idx)\ +X(RDI_U32, link_name_string_idx)\ #define RDI_GlobalVariable_XList \ X(RDI_U32, name_string_idx)\ @@ -990,6 +1006,14 @@ X(RDI_U16, offset)\ X(RDI_LocationKind, kind)\ X(RDI_RegCode, reg_code)\ +#define RDI_LocationSet_XList \ +X(RDI_U32, set_element_idx_first)\ +X(RDI_U32, set_element_idx_opl)\ + +#define RDI_LocationSetElement_XList \ +X(RDI_LocationKind, kind)\ +X(RDI_U32, idx)\ + #define RDI_EvalOp_XList \ X(Stop)\ X(Noop)\ @@ -1116,6 +1140,14 @@ typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_Inline typedef struct RDI_U32_Locals { RDI_U32 v; } RDI_U32_Locals; typedef struct RDI_U32_LocationBlocks { RDI_U32 v; } RDI_U32_LocationBlocks; typedef struct RDI_U32_LocationData { RDI_U32 v; } RDI_U32_LocationData; +typedef struct RDI_U32_LocationsBytecodeData { RDI_U32 v; } RDI_U32_LocationsBytecodeData; +typedef struct RDI_U32_LocationsRegPlusU16 { RDI_U32 v; } RDI_U32_LocationsRegPlusU16; +typedef struct RDI_U32_LocationsReg { RDI_U32 v; } RDI_U32_LocationsReg; +typedef struct RDI_U32_LocationsModuleOff { RDI_U32 v; } RDI_U32_LocationsModuleOff; +typedef struct RDI_U32_LocationsTLSOff { RDI_U32 v; } RDI_U32_LocationsTLSOff; +typedef struct RDI_U32_LocationsConstantDataOff { RDI_U32 v; } RDI_U32_LocationsConstantDataOff; +typedef struct RDI_U32_LocationsSet { RDI_U32 v; } RDI_U32_LocationsSet; +typedef struct RDI_U32_LocationsSetElements { RDI_U32 v; } RDI_U32_LocationsSetElements; typedef struct RDI_U32_ConstantValueData { RDI_U32 v; } RDI_U32_ConstantValueData; typedef struct RDI_U32_ConstantValueTable { RDI_U32 v; } RDI_U32_ConstantValueTable; typedef struct RDI_U32_MD5Checksums { RDI_U32 v; } RDI_U32_MD5Checksums; @@ -1157,6 +1189,14 @@ typedef RDI_U32_Table RDI_U32_InlineSites; typedef RDI_U32_Table RDI_U32_Locals; typedef RDI_U32_Table RDI_U32_LocationBlocks; typedef RDI_U32_Table RDI_U32_LocationData; +typedef RDI_U32_Table RDI_U32_LocationsBytecodeData; +typedef RDI_U32_Table RDI_U32_LocationsRegPlusU16; +typedef RDI_U32_Table RDI_U32_LocationsReg; +typedef RDI_U32_Table RDI_U32_LocationsModuleOff; +typedef RDI_U32_Table RDI_U32_LocationsTLSOff; +typedef RDI_U32_Table RDI_U32_LocationsConstantDataOff; +typedef RDI_U32_Table RDI_U32_LocationsSet; +typedef RDI_U32_Table RDI_U32_LocationsSetElements; typedef RDI_U32_Table RDI_U32_ConstantValueData; typedef RDI_U32_Table RDI_U32_ConstantValueTable; typedef RDI_U32_Table RDI_U32_MD5Checksums; @@ -1378,17 +1418,20 @@ RDI_ContainerFlags container_flags; RDI_U32 container_idx; }; -typedef struct RDI_Variable RDI_Variable; -struct RDI_Variable +typedef struct RDI_Symbol RDI_Symbol; +struct RDI_Symbol { RDI_U32 name_string_idx; +RDI_SymbolFlags symbol_flags; +RDI_LocationKind location_kind; RDI_ContainerFlags container_flags; +RDI_U8 reserved_0; +RDI_U32 reserved_1; RDI_U32 container_idx; RDI_U32 type_idx; -RDI_VariableKind variable_kind; -RDI_LocationKind location_kind; -RDI_U16 padding; RDI_U32 location_idx; +RDI_U32 root_scope_idx; +RDI_U32 link_name_string_idx; }; typedef struct RDI_GlobalVariable RDI_GlobalVariable; @@ -1495,6 +1538,20 @@ RDI_LocationKind kind; RDI_RegCode reg_code; }; +typedef struct RDI_LocationSet RDI_LocationSet; +struct RDI_LocationSet +{ +RDI_U32 set_element_idx_first; +RDI_U32 set_element_idx_opl; +}; + +typedef struct RDI_LocationSetElement RDI_LocationSetElement; +struct RDI_LocationSetElement +{ +RDI_LocationKind kind; +RDI_U32 idx; +}; + typedef struct RDI_NameMap RDI_NameMap; struct RDI_NameMap { @@ -1553,6 +1610,14 @@ typedef RDI_InlineSite RDI_SectionElementType_InlineSites; typedef RDI_Local RDI_SectionElementType_Locals; typedef RDI_LocationBlock RDI_SectionElementType_LocationBlocks; typedef RDI_U8 RDI_SectionElementType_LocationData; +typedef RDI_U8 RDI_SectionElementType_LocationsBytecodeData; +typedef RDI_LocationRegPlusU16 RDI_SectionElementType_LocationsRegPlusU16; +typedef RDI_LocationReg RDI_SectionElementType_LocationsReg; +typedef RDI_U64 RDI_SectionElementType_LocationsModuleOff; +typedef RDI_U32 RDI_SectionElementType_LocationsTLSOff; +typedef RDI_U64 RDI_SectionElementType_LocationsConstantDataOff; +typedef RDI_LocationSet RDI_SectionElementType_LocationsSet; +typedef RDI_LocationSetElement RDI_SectionElementType_LocationsSetElements; typedef RDI_U8 RDI_SectionElementType_ConstantValueData; typedef RDI_U32 RDI_SectionElementType_ConstantValueTable; typedef RDI_MD5 RDI_SectionElementType_MD5Checksums; @@ -1571,7 +1636,7 @@ RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_Eva RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); -extern RDI_U16 rdi_section_element_size_table[45]; +extern RDI_U16 rdi_section_element_size_table[53]; extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; #endif // RDI_H diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 821888cb..ac9e0fce 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -77,7 +77,7 @@ ""; "// \"raddbg\\0\\0\""; "#define RDI_MAGIC_CONSTANT 0x0000676264646172"; - "#define RDI_ENCODING_VERSION 19"; + "#define RDI_ENCODING_VERSION 20"; ""; "////////////////////////////////////////////////////////////////"; "//~ Format Types & Functions"; @@ -135,51 +135,63 @@ RDI_HeaderMemberTable: @table(name name_lower element_type value index_base_type desc) RDI_SectionTable: { - {NULL null RDI_U8 0x0000 - ""} - {TopLevelInfo top_level_info RDI_TopLevelInfo 0x0001 - ""} - {StringData string_data RDI_U8 0x0002 - ""} - {StringTable string_table RDI_U32 0x0003 U32 ""} - {IndexRuns index_runs RDI_U32 0x0004 U32 ""} - {BinarySections binary_sections RDI_BinarySection 0x0005 U32 ""} - {FilePathNodes file_path_nodes RDI_FilePathNode 0x0006 U32 ""} - {SourceFiles source_files RDI_SourceFile 0x0007 U32 ""} - {LineTables line_tables RDI_LineTable 0x0008 U32 ""} - {LineInfoVOffs line_info_voffs RDI_U64 0x0009 U32 ""} - {LineInfoLines line_info_lines RDI_Line 0x000A U32 ""} - {LineInfoColumns line_info_columns RDI_Column 0x000B U32 ""} - {SourceLineMaps source_line_maps RDI_SourceLineMap 0x000C U32 ""} - {SourceLineMapNumbers source_line_map_numbers RDI_U32 0x000D U32 ""} - {SourceLineMapRanges source_line_map_ranges RDI_U32 0x000E U32 ""} - {SourceLineMapVOffs source_line_map_voffs RDI_U64 0x000F U32 ""} - {Units units RDI_Unit 0x0010 U32 ""} - {UnitVMap unit_vmap RDI_VMapEntry 0x0011 - ""} - {Namespaces namespaces RDI_Namespace 0x0012 U32 ""} - {TypeNodes type_nodes RDI_TypeNode 0x0013 U32 ""} - {UDTs udts RDI_UDT 0x0014 U32 ""} - {Members members RDI_Member 0x0015 U32 ""} - {EnumMembers enum_members RDI_EnumMember 0x0016 U32 ""} - {GlobalVariables global_variables RDI_GlobalVariable 0x0017 U32 ""} - {GlobalVMap global_vmap RDI_VMapEntry 0x0018 - ""} - {ThreadVariables thread_variables RDI_ThreadVariable 0x0019 U32 ""} - {Constants constants RDI_Constant 0x001A U32 ""} - {Procedures procedures RDI_Procedure 0x001B U32 ""} - {Scopes scopes RDI_Scope 0x001C U32 ""} - {ScopeVOffData scope_voff_data RDI_U64 0x001D U32 ""} - {ScopeVMap scope_vmap RDI_VMapEntry 0x001E - ""} - {InlineSites inline_sites RDI_InlineSite 0x001F U32 ""} - {Locals locals RDI_Local 0x0020 U32 ""} - {LocationBlocks location_blocks RDI_LocationBlock 0x0021 U32 ""} - {LocationData location_data RDI_U8 0x0022 U32 ""} - {ConstantValueData constant_value_data RDI_U8 0x0023 U32 ""} - {ConstantValueTable constant_value_table RDI_U32 0x0024 U32 ""} - {MD5Checksums md5_checksums RDI_MD5 0x0025 U32 ""} - {SHA1Checksums sha1_checksums RDI_SHA1 0x0026 U32 ""} - {SHA256Checksums sha256_checksums RDI_SHA256 0x0027 U32 ""} - {Timestamps timestamps RDI_U64 0x0028 U32 ""} - {NameMaps name_maps RDI_NameMap 0x0029 U32 ""} - {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x002A U32 ""} - {NameMapNodes name_map_nodes RDI_NameMapNode 0x002B U32 ""} - {COUNT count RDI_U8 0x002C - ""} + {NULL null RDI_U8 0x0000 - ""} + {TopLevelInfo top_level_info RDI_TopLevelInfo 0x0001 - ""} + {StringData string_data RDI_U8 0x0002 - ""} + {StringTable string_table RDI_U32 0x0003 U32 ""} + {IndexRuns index_runs RDI_U32 0x0004 U32 ""} + {BinarySections binary_sections RDI_BinarySection 0x0005 U32 ""} + {FilePathNodes file_path_nodes RDI_FilePathNode 0x0006 U32 ""} + {SourceFiles source_files RDI_SourceFile 0x0007 U32 ""} + {LineTables line_tables RDI_LineTable 0x0008 U32 ""} + {LineInfoVOffs line_info_voffs RDI_U64 0x0009 U32 ""} + {LineInfoLines line_info_lines RDI_Line 0x000A U32 ""} + {LineInfoColumns line_info_columns RDI_Column 0x000B U32 ""} + {SourceLineMaps source_line_maps RDI_SourceLineMap 0x000C U32 ""} + {SourceLineMapNumbers source_line_map_numbers RDI_U32 0x000D U32 ""} + {SourceLineMapRanges source_line_map_ranges RDI_U32 0x000E U32 ""} + {SourceLineMapVOffs source_line_map_voffs RDI_U64 0x000F U32 ""} + {Units units RDI_Unit 0x0010 U32 ""} + {UnitVMap unit_vmap RDI_VMapEntry 0x0011 - ""} + {Namespaces namespaces RDI_Namespace 0x0012 U32 ""} + {TypeNodes type_nodes RDI_TypeNode 0x0013 U32 ""} + {UDTs udts RDI_UDT 0x0014 U32 ""} + {Members members RDI_Member 0x0015 U32 ""} + {EnumMembers enum_members RDI_EnumMember 0x0016 U32 ""} + {GlobalVariables global_variables RDI_GlobalVariable 0x0017 U32 ""} + {GlobalVMap global_vmap RDI_VMapEntry 0x0018 - ""} + {ThreadVariables thread_variables RDI_ThreadVariable 0x0019 U32 ""} + {Constants constants RDI_Constant 0x001A U32 ""} + {Procedures procedures RDI_Procedure 0x001B U32 ""} + {Scopes scopes RDI_Scope 0x001C U32 ""} + {ScopeVOffData scope_voff_data RDI_U64 0x001D U32 ""} + {ScopeVMap scope_vmap RDI_VMapEntry 0x001E - ""} + {InlineSites inline_sites RDI_InlineSite 0x001F U32 ""} + {Locals locals RDI_Local 0x0020 U32 ""} + {LocationBlocks location_blocks RDI_LocationBlock 0x0021 U32 ""} + {LocationData location_data RDI_U8 0x0022 U32 ""} + + //- NOTE(rjf): vvv new story for locations + {LocationsBytecodeData locations_bytecode_data RDI_U8 0x0023 U32 ""} + {LocationsRegPlusU16 locations_reg_plus_u16 RDI_LocationRegPlusU16 0x0024 U32 ""} + {LocationsReg locations_reg RDI_LocationReg 0x0025 U32 ""} + {LocationsModuleOff locations_module_off RDI_U64 0x0026 U32 ""} + {LocationsTLSOff locations_tls_off RDI_U32 0x0027 U32 ""} + {LocationsConstantDataOff locations_constant_data_off RDI_U64 0x0028 U32 ""} + {LocationsSet locations_set RDI_LocationSet 0x0029 U32 ""} + {LocationsSetElements locations_set_elements RDI_LocationSetElement 0x002A U32 ""} + //- NOTE(rjf): ^^^ + + {ConstantValueData constant_value_data RDI_U8 0x002B U32 ""} + {ConstantValueTable constant_value_table RDI_U32 0x002C U32 ""} + {MD5Checksums md5_checksums RDI_MD5 0x002D U32 ""} + {SHA1Checksums sha1_checksums RDI_SHA1 0x002E U32 ""} + {SHA256Checksums sha256_checksums RDI_SHA256 0x002F U32 ""} + {Timestamps timestamps RDI_U64 0x0030 U32 ""} + {NameMaps name_maps RDI_NameMap 0x0031 U32 ""} + {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x0032 U32 ""} + {NameMapNodes name_map_nodes RDI_NameMapNode 0x0033 U32 ""} + {COUNT count RDI_U8 0x0034 - ""} } @table(name value) @@ -955,8 +967,8 @@ RDI_ContainerKindTable: @table(name value) RDI_ContainerFlagTable: { - {External `1<<8`} - {KindMask `0xff`} + {External `1u<<7`} + {KindMask `0x7f`} } @table(name value) @@ -987,16 +999,13 @@ RDI_LocationKindTable: {ModuleOff 0x6} {TLSOff 0x7} {ConstantDataOff 0x8} - {List 0x9} + {Set 0x9} } @table(name value) -RDI_VariableKindTable: +RDI_SymbolFlagTable: { - {Local 0x0} - {Param 0x1} - {Global 0x2} - {Thread 0x3} + {IsParam 0x1} } @table(name type desc) @@ -1008,16 +1017,19 @@ RDI_NamespaceMemberTable: } @table(name type desc) -RDI_VariableMemberTable: +RDI_SymbolMemberTable: { - {name_string_idx RDI_U32 ""} - {container_flags RDI_ContainerFlags ""} - {container_idx RDI_U32 ""} - {type_idx RDI_U32 ""} - {variable_kind RDI_VariableKind ""} - {location_kind RDI_LocationKind ""} - {padding RDI_U16 ""} - {location_idx RDI_U32 ""} + {name_string_idx RDI_U32 ""} + {symbol_flags RDI_SymbolFlags ""} + {location_kind RDI_LocationKind ""} + {container_flags RDI_ContainerFlags ""} + {reserved_0 RDI_U8 ""} + {reserved_1 RDI_U32 ""} + {container_idx RDI_U32 ""} + {type_idx RDI_U32 ""} + {location_idx RDI_U32 ""} + {root_scope_idx RDI_U32 ""} + {link_name_string_idx RDI_U32 ""} } @table(name type desc) @@ -1125,6 +1137,20 @@ RDI_LocationRegMemberTable: {reg_code RDI_RegCode } } +@table(name type desc) +RDI_LocationSetMemberTable: +{ + {set_element_idx_first RDI_U32 ""} + {set_element_idx_opl RDI_U32 ""} +} + +@table(name type desc) +RDI_LocationSetElementMemberTable: +{ + {kind RDI_LocationKind ""} + {idx RDI_U32 ""} +} + //- rjf: enums @enum(RDI_U8) RDI_ContainerKind: @@ -1132,7 +1158,7 @@ RDI_LocationRegMemberTable: @expand(RDI_ContainerKindTable a) `$(a.name .. =>20) = $(a.value)` } -@enum(RDI_U32) RDI_ContainerFlags: +@enum(RDI_U8) RDI_ContainerFlags: { @expand(RDI_ContainerFlagTable a) `$(a.name .. =>20) = $(a.value)`, } @@ -1147,9 +1173,9 @@ RDI_LocationRegMemberTable: @expand(RDI_LocalKindTable a) `$(a.name .. =>20) = $(a.value)` } -@enum(RDI_U8) RDI_VariableKind: +@enum(RDI_U8) RDI_SymbolFlags: { - @expand(RDI_VariableKindTable a) `$(a.name .. =>20) = $(a.value)` + @expand(RDI_SymbolFlagTable a) `$(a.name .. =>20) = $(a.value)` } @enum(RDI_U8) RDI_LocationKind: @@ -1179,9 +1205,9 @@ RDI_LocationRegMemberTable: @expand(RDI_NamespaceMemberTable a) `$(a.type), $(a.name)` } -@xlist RDI_Variable_XList: +@xlist RDI_Symbol_XList: { - @expand(RDI_VariableMemberTable a) `$(a.type), $(a.name)` + @expand(RDI_SymbolMemberTable a) `$(a.type), $(a.name)` } @xlist RDI_GlobalVariable_XList: @@ -1234,6 +1260,16 @@ RDI_LocationRegMemberTable: @expand(RDI_LocationRegMemberTable a) `$(a.type), $(a.name)` } +@xlist RDI_LocationSet_XList: +{ + @expand(RDI_LocationSetMemberTable a) `$(a.type), $(a.name)` +} + +@xlist RDI_LocationSetElement_XList: +{ + @expand(RDI_LocationSetElementMemberTable a) `$(a.type), $(a.name)` +} + //- rjf: structs @struct RDI_Namespace: @@ -1241,9 +1277,9 @@ RDI_LocationRegMemberTable: @expand(RDI_NamespaceMemberTable a) `$(a.type) $(a.name)` } -@struct RDI_Variable: +@struct RDI_Symbol: { - @expand(RDI_VariableMemberTable a) `$(a.type) $(a.name)` + @expand(RDI_SymbolMemberTable a) `$(a.type) $(a.name)` } @struct RDI_GlobalVariable: @@ -1301,6 +1337,16 @@ RDI_LocationRegMemberTable: @expand(RDI_LocationRegMemberTable a) `$(a.type) $(a.name)` } +@struct RDI_LocationSet: +{ + @expand(RDI_LocationSetMemberTable a) `$(a.type) $(a.name)` +} + +@struct RDI_LocationSetElement: +{ + @expand(RDI_LocationSetElementMemberTable a) `$(a.type) $(a.name)` +} + //////////////////////////////// //~ rjf: Evaluation Bytecode Tables From 70677b85d8f28218e9b301ca1d0cdd2fc051ef7e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 4 Mar 2026 11:53:20 -0800 Subject: [PATCH 279/850] align group names --- src/torture/torture.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index 171ebd53..56bdd816 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -371,7 +371,11 @@ t_entry_point(CmdLine *cmdline) radsort(g_torture_tests, g_torture_test_count, t_test_is_before); U64 max_label_size = 0; - for EachIndex(i, g_torture_test_count) { max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[i].label)); } + U64 max_group_size = 0; + for EachIndex(i, g_torture_test_count) { + max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[i].label)); + max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[i].group)); + } U64 dots_min = 10; U64 dots_size = max_label_size+dots_min; @@ -411,8 +415,9 @@ t_entry_point(CmdLine *cmdline) // print run progress U64 dots_count = (max_label_size - cstring8_length((U8*)g_torture_tests[target_idx].label)) + dots_min; + char *spaces = " "; fprintf(stdout, "[%2I64u/%2I64u] ", i+1, target_indices_count); - fprintf(stdout, "(%s) %s", g_torture_tests[target_idx].group, g_torture_tests[target_idx].label); + fprintf(stdout, "(%s) %.*s%s", g_torture_tests[target_idx].group, (int)(max_group_size - cstring8_length((U8*)g_torture_tests[target_idx].group)), spaces, g_torture_tests[target_idx].label); fprintf(stdout, "%.*s", (int)dots_count, dots); // setup output directory From adbd5c911e2728c2025bc16715e6be4e38d710d3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 4 Mar 2026 13:29:41 -0800 Subject: [PATCH 280/850] update torture runner --- .github/workflows/builds.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 5a29a69f..ccca9083 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -47,8 +47,6 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build radbin san debug || exit /b 1 - call build radlink san debug || exit /b 1 - call build torture debug || exit /b 1 + call build asan debug torture radlink radbin || exit /b 1 cd build - torture -l:radlink || exit /b 1 + torture || exit /b 1 From 1a10170485cf4ef8505e6dd078d6b40339c5e7a0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 17 Mar 2026 23:18:25 -0700 Subject: [PATCH 281/850] fix clang build error in mule_main --- src/mule/mule_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index fc7c1d09..17fb4d12 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -6,7 +6,7 @@ ** stepping, breakpoints, evaluation, cross-module calls. */ -#if COMPILER_MSVC && _DEBUG +#if _WIN32 && _DEBUG #pragma comment(linker, "/nodefaultlib:libcmt") #pragma comment(lib, "libcmtd") #endif From 846f174bbd705b31dfc4b51606a63e4c3ae601ea Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 18 Mar 2026 21:20:56 -0700 Subject: [PATCH 282/850] os_process_join on win32 -> CloseHandle of remaining process handle --- src/os/core/win32/os_core_win32.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 65f6e3df..fb0c0185 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -368,7 +368,7 @@ internal U64 os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) { if(os_handle_match(file, os_handle_zero())) { return 0; } - + HANDLE handle = (HANDLE)file.u64[0]; U8 *ptr = out_data; U64 off = rng.min; @@ -1072,6 +1072,10 @@ os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); DWORD result = WaitForSingleObject(process, sleep_ms); B32 process_joined = (result == WAIT_OBJECT_0); + if(process_joined) + { + CloseHandle(process); + } if(process_joined && exit_code_out) { DWORD exit_code = 0; @@ -1564,24 +1568,24 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) #else # error Arch not supported! #endif - + #if BUILD_CONSOLE_INTERFACE buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); #else buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, - L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" - L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); + L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" + L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); #endif buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); - + U64 frame_offset = 0; - + if (frame.AddrPC.Offset == 0) { // if IP address is 0 then most likely we have called indirectly on NULL function pointer // which means no useful stack unwinding will happen, because there's no unwind info for address 0 // but we can try reading 8 bytes of return address from stack, and start unwinding there - + ULONG_PTR hi, lo; GetCurrentThreadStackLimits(&lo, &hi); if (frame.AddrStack.Offset >= lo && frame.AddrStack.Offset <= hi - sizeof(void*)) @@ -1596,11 +1600,11 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) context.Sp = frame.AddrStack.Offset; #endif } - + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"1. [NULL]\n"); frame_offset = 1; } - + for(U32 idx=0; ;idx++) { const U32 max_frames = 32; @@ -1699,7 +1703,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) info.ClientPointers = FALSE; BOOL dump_successful = dbg_MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, MiniDumpNormal, &info, 0, 0); CloseHandle(file); - + if (dump_successful) { #if !BUILD_CONSOLE_INTERFACE From 8c7b3d7356ca14e749bd1993955aff90248e5443 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 12 Mar 2026 13:28:47 -0700 Subject: [PATCH 283/850] project names, remove loaded user viz from top bar (only project is relevant in 99% of cases), clean up loaded project viz --- build.bat | 2 +- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 1 + src/raddbg/raddbg_core.c | 73 +++++++++++++++++------------- 4 files changed, 45 insertions(+), 33 deletions(-) diff --git a/build.bat b/build.bat index 604bac55..f1828547 100644 --- a/build.bat +++ b/build.bat @@ -128,7 +128,7 @@ if "%meta%"=="1" ( echo [building metagen] %compile_debug% ..\src\metagen\metagen_main.c %compile_link% %out%metagen.exe || exit /b 1 ) -if "%no_meta%"=="" ( +if "%no_meta%"=="" if exist metagen.exe ( echo [running metagen] metagen.exe || exit /b 1 ) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index cf9d1d40..7f206a31 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -427,7 +427,7 @@ RD_VocabInfo rd_vocab_info_table[358] = RD_NameSchemaInfo rd_name_schema_info_table[26] = { {str8_lit_comp("user"), str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': query,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, -{str8_lit_comp("project"), str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': query,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, +{str8_lit_comp("project"), str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': query,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, {str8_lit_comp("tab"), str8_lit_comp("@row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\nx:\n{\n @override @display_name('Tab Font Size') @description(\"Controls the tab's font size.\") @no_callee_helper\n 'font_size': @range[6, 72] u64,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index e8e77f06..4d31f2a7 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -312,6 +312,7 @@ RD_VocabTable: ``` @expand_commands(edit_project_theme) x: { + @display_name('Project Name') 'name': string, @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64, //- rjf: visualizers diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 8da90017..2325d4d8 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -7038,40 +7038,43 @@ rd_window_frame(void) ui_spacer(ui_pct(1, 0)); // rjf: loaded user viz - if(do_user_prof) UI_TagF("pop") + if(0) { - ui_set_next_pref_width(ui_children_sum(1)); - ui_set_next_child_layout_axis(Axis2_X); - UI_Box *user_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "###loaded_user_button"); - os_window_push_custom_title_bar_client_area(ws->os, user_box->rect); - UI_Parent(user_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) + if(do_user_prof) UI_TagF("pop") { - String8 user_path = rd_state->user_path; - user_path = str8_chop_last_dot(user_path); - RD_Font(RD_FontSlot_Icons) - UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Icons)) - ui_label(rd_icon_kind_text_table[RD_IconKind_Person]); - ui_label(str8_skip_last_slash(user_path)); + ui_set_next_pref_width(ui_children_sum(1)); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *user_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "###loaded_user_button"); + os_window_push_custom_title_bar_client_area(ws->os, user_box->rect); + UI_Parent(user_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) + { + String8 user_path = rd_state->user_path; + user_path = str8_chop_last_dot(user_path); + RD_Font(RD_FontSlot_Icons) + UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Icons)) + ui_label(rd_icon_kind_text_table[RD_IconKind_Person]); + ui_label(str8_skip_last_slash(user_path)); + } + UI_Signal user_sig = ui_signal_from_box(user_box); + if(ui_clicked(user_sig)) + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string); + } } - UI_Signal user_sig = ui_signal_from_box(user_box); - if(ui_clicked(user_sig)) + + if(do_user_prof) { - rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string); + ui_spacer(ui_em(0.75f, 0)); } } - if(do_user_prof) - { - ui_spacer(ui_em(0.75f, 0)); - } - // rjf: loaded project viz - if(do_user_prof) UI_TagF("pop") + if(do_user_prof) { ui_set_next_pref_width(ui_children_sum(1)); ui_set_next_child_layout_axis(Axis2_X); @@ -7082,13 +7085,21 @@ rd_window_frame(void) UI_BoxFlag_DrawActiveEffects, "###loaded_project_button"); os_window_push_custom_title_bar_client_area(ws->os, prof_box->rect); - UI_Parent(prof_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) + UI_Parent(prof_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) UI_Padding(ui_em(0.5f, 1.f)) { - String8 prof_path = rd_state->project_path; - prof_path = str8_chop_last_dot(prof_path); + CFG_Node *root = cfg_node_root(); + CFG_Node *project = cfg_node_child_from_string(root, str8_lit("project")); + CFG_Node *name = cfg_node_child_from_string(project, str8_lit("name")); + String8 project_name = name->first->string; + if(project_name.size == 0) + { + String8 prof_path = rd_state->project_path; + prof_path = str8_chop_last_dot(prof_path); + project_name = str8_skip_last_slash(prof_path); + } RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[RD_IconKind_Briefcase]); - ui_label(str8_skip_last_slash(prof_path)); + ui_label(project_name); } UI_Signal prof_sig = ui_signal_from_box(prof_box); if(ui_clicked(prof_sig)) @@ -7099,7 +7110,7 @@ rd_window_frame(void) if(do_user_prof) { - ui_spacer(ui_em(0.75f, 0)); + // ui_spacer(ui_em(2.f, 0)); } // rjf: close dropdown From a23375a07001f139e546d45608fa5aab846a158c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 29 Mar 2026 11:05:45 -0700 Subject: [PATCH 284/850] re-plug raddbg markup data section into module image info cache; fix detachment signifying --- project.4coder | 2 +- src/ctrl/ctrl_core.c | 110 ++++++++++++++++++++++--------------------- src/ctrl/ctrl_core.h | 2 +- 3 files changed, 58 insertions(+), 56 deletions(-) diff --git a/project.4coder b/project.4coder index 137f091b..ef4a4fb1 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,7 @@ commands = { //- rjf: [raddbg] // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index bc8cd65c..7142f43e 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1883,7 +1883,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han { Temp scratch = scratch_begin(&arena, 1); CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; - + // gather context for virtual stack unwinder U64 cfi_rebase = 0; B32 is_unwind_eh = 0; @@ -2057,11 +2057,11 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han }break; default: { InvalidPath; }break; } - + // compute CFA for the row U64 cfa = 0; MachineOpResult unwind_status = dw_compute_cfa(arch, cfi_row, mem_read_func, mem_read_ctx, reg_read_func, reg_read_ctx, &cfa); - + // on success fill out output if(unwind_status == MachineOpResult_Ok) { @@ -2069,13 +2069,13 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han ctx_out->cfi_row = cfi_row; ctx_out->ret_addr_reg = cie.ret_addr_reg; } - + // translate unwind status code result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); } } } - + scratch_end(scratch); return result; } @@ -2119,7 +2119,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_ }break; default: { InvalidPath; }break; } - + // apply register rules to the context MachineOpResult unwind_status = dw_cfi_apply_register_rules(arch, frame_ctx->cfa, @@ -2130,7 +2130,7 @@ ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_ reg_read_ctx, reg_write_func, reg_write_ctx); - + // last frame typically has undefined rule for IP if(frame_ctx->cfi_row->regs[frame_ctx->ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) { @@ -3013,16 +3013,16 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U { U64 rip = regs_rip_from_arch_block(arch, regs_block); U64 rsp = regs_rsp_from_arch_block(arch, regs_block); - + // rjf: cancel on 0 rip if(rip == 0) { break; } - + // rip -> module CTRL_Entity *module_entity = ctrl_module_from_process_vaddr(process_entity, rip); - + // establish frame context CTRL_FrameUnwindContext frame_ctx = {0}; CTRL_UnwindStepResult frame_ctx_result = {0}; @@ -3095,7 +3095,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U // stop unwinding on errors or stale data unwind.flags |= step_result.flags; if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error) || - (regs_rsp_from_arch_block(arch, regs_block) == rsp && regs_rip_from_arch_block(arch, regs_block) == rip)) + (regs_rsp_from_arch_block(arch, regs_block) == rsp && regs_rip_from_arch_block(arch, regs_block) == rip)) { break; } @@ -3772,29 +3772,28 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ { Temp scratch = scratch_begin(0,0); - Arena *arena = arena_alloc(); - U64 entry_point_voff = 0; - U32 rdi_dbg_time = 0; - Guid rdi_dbg_guid = {0}; - String8 exe_dbg_path = {0}; - String8 rdi_dbg_path = {0}; - String8 raddbg_data = {0}; - Rng1U64 raddbg_section_voff_range = r1u64(0, 0); - Rng1U64 raddbg_is_attached_section_voff_range = r1u64(0, 0); - - PE_IntelPdata *pdatas = 0; - U64 pdatas_count = 0; - U32 pdb_dbg_time = 0; - U32 pdb_dbg_age = 0; - Guid pdb_dbg_guid = {0}; - String8 pdb_dbg_path = {0}; - - U64 cfi_rebase = 0; - B32 is_unwind_eh = 0; + //- rjf: set up per-module info + Arena *arena = arena_alloc(); + U64 entry_point_voff = 0; + U32 rdi_dbg_time = 0; + Guid rdi_dbg_guid = {0}; + String8 exe_dbg_path = {0}; + String8 rdi_dbg_path = {0}; + String8 raddbg_data = {0}; + Rng1U64 raddbg_section_voff_range = {0}; + Rng1U64 raddbg_is_attached_section_voff_range = {0}; + PE_IntelPdata *pdatas = 0; + U64 pdatas_count = 0; + U32 pdb_dbg_time = 0; + U32 pdb_dbg_age = 0; + Guid pdb_dbg_guid = {0}; + String8 pdb_dbg_path = {0}; + U64 cfi_rebase = 0; + B32 is_unwind_eh = 0; EH_FrameHdr eh_frame_hdr = {0}; - EH_PtrCtx eh_ptr_ctx = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; + EH_PtrCtx eh_ptr_ctx = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; - // read module's signature bytes + //- read module's signature bytes U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); dmn_process_read(process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); @@ -4004,6 +4003,7 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ } } } + ////////////////////////////// //- parse ELF module // @@ -4137,11 +4137,11 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ //- rjf: insert info into cache // { - U64 hash = ctrl_hash_from_handle(module); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 hash = ctrl_hash_from_handle(module); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeW(stripe->rw_mutex) { CTRL_ModuleImageInfoCacheNode *node = 0; @@ -4157,16 +4157,18 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ { node = push_array(arena, CTRL_ModuleImageInfoCacheNode, 1); DLLPushBack(slot->first, slot->last, node); - node->module = module; - node->arena = arena; - node->pdatas = pdatas; - node->pdatas_count = pdatas_count; - node->cfi_rebase = cfi_rebase; - node->is_unwind_eh = is_unwind_eh; - node->eh_frame_hdr = eh_frame_hdr; - node->eh_ptr_ctx = eh_ptr_ctx; - node->entry_point_voff = entry_point_voff; - node->initial_debug_info_path = initial_debug_info_path; + node->module = module; + node->arena = arena; + node->pdatas = pdatas; + node->pdatas_count = pdatas_count; + node->cfi_rebase = cfi_rebase; + node->is_unwind_eh = is_unwind_eh; + node->eh_frame_hdr = eh_frame_hdr; + node->eh_ptr_ctx = eh_ptr_ctx; + node->entry_point_voff = entry_point_voff; + node->initial_debug_info_path = initial_debug_info_path; + node->raddbg_attached_marker_voff = raddbg_is_attached_section_voff_range.min; + node->raddbg_data = str8_copy(arena, raddbg_data); } } } @@ -4180,7 +4182,7 @@ ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr ////////////////////////////// //- rjf: evict module image info from cache // - Rng1U64 raddbg_section_voff_range = {0}; + U64 raddbg_attached_marker_voff = 0; { U64 hash = ctrl_hash_from_handle(module); U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; @@ -4200,7 +4202,7 @@ ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr } if(node) { - raddbg_section_voff_range = node->raddbg_section_voff_range; + raddbg_attached_marker_voff = node->raddbg_attached_marker_voff; DLLRemove(slot->first, slot->last, node); arena_release(node->arena); } @@ -4208,12 +4210,12 @@ ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr } ////////////////////////////// - //- rjf: write 0 into first byte of raddbg data section, to signify detachment + //- rjf: write 0 at attachment market, to signify detachment // - if(raddbg_section_voff_range.max != raddbg_section_voff_range.min) + if(raddbg_attached_marker_voff != 0) { U8 new_value = 0; - dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_section_voff_range.min, &new_value); + dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_attached_marker_voff, &new_value); } } @@ -4399,7 +4401,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, { dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); } - + // rjf: run for new events ProfScope("run for new events") { @@ -4423,7 +4425,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, } } } - + DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls); ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 77870198..fa9b1571 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -634,7 +634,7 @@ struct CTRL_ModuleImageInfoCacheNode EH_PtrCtx eh_ptr_ctx; U64 entry_point_voff; String8 initial_debug_info_path; - Rng1U64 raddbg_section_voff_range; + U64 raddbg_attached_marker_voff; String8 raddbg_data; }; From a768f398cfb6fd362d3d971ebad2155ea39793ea Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 29 Mar 2026 11:46:24 -0700 Subject: [PATCH 285/850] single-press-to-activate in text right-click commands menu --- project.4coder | 3 ++- src/raddbg/generated/raddbg.meta.c | 6 ++++-- src/raddbg/generated/raddbg.meta.h | 7 +++++-- src/raddbg/raddbg.mdesk | 1 + src/raddbg/raddbg_core.c | 14 ++++++++++++++ src/raddbg/raddbg_widgets.c | 1 + 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/project.4coder b/project.4coder index ef4a4fb1..dcef9767 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,8 @@ commands = { //- rjf: [raddbg] // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin debug", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 7f206a31..8dd516c8 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -454,7 +454,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[26] = {str8_lit_comp("thread"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':query}")}, }; -String8 rd_reg_slot_code_name_table[48] = +String8 rd_reg_slot_code_name_table[49] = { {0}, str8_lit_comp("machine"), @@ -500,13 +500,14 @@ str8_lit_comp("do_big_rows"), str8_lit_comp("all_windows"), str8_lit_comp("non_graphical"), str8_lit_comp("prefer_new_tab"), +str8_lit_comp("activate_with_single_click"), str8_lit_comp("dir2"), str8_lit_comp("string"), str8_lit_comp("cmd_name"), str8_lit_comp("os_event"), }; -Rng1U64 rd_reg_slot_range_table[48] = +Rng1U64 rd_reg_slot_range_table[49] = { {0}, {OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(CTRL_Handle)}, @@ -552,6 +553,7 @@ Rng1U64 rd_reg_slot_range_table[48] = {OffsetOf(RD_Regs, all_windows), OffsetOf(RD_Regs, all_windows) + sizeof(B32)}, {OffsetOf(RD_Regs, non_graphical), OffsetOf(RD_Regs, non_graphical) + sizeof(B32)}, {OffsetOf(RD_Regs, prefer_new_tab), OffsetOf(RD_Regs, prefer_new_tab) + sizeof(B32)}, +{OffsetOf(RD_Regs, activate_with_single_click), OffsetOf(RD_Regs, activate_with_single_click) + sizeof(B32)}, {OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)}, {OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)}, {OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index b9bac75c..c82edd1c 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -52,6 +52,7 @@ RD_RegSlot_DoBigRows, RD_RegSlot_AllWindows, RD_RegSlot_NonGraphical, RD_RegSlot_PreferNewTab, +RD_RegSlot_ActivateWithSingleClick, RD_RegSlot_Dir2, RD_RegSlot_String, RD_RegSlot_CmdName, @@ -491,6 +492,7 @@ B32 do_big_rows; B32 all_windows; B32 non_graphical; B32 prefer_new_tab; +B32 activate_with_single_click; Dir2 dir2; String8 string; String8 cmd_name; @@ -590,6 +592,7 @@ Z(getting_started)\ .all_windows = rd_regs()->all_windows,\ .non_graphical = rd_regs()->non_graphical,\ .prefer_new_tab = rd_regs()->prefer_new_tab,\ +.activate_with_single_click = rd_regs()->activate_with_single_click,\ .dir2 = rd_regs()->dir2,\ .string = rd_regs()->string,\ .cmd_name = rd_regs()->cmd_name,\ @@ -600,8 +603,8 @@ extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; extern RD_VocabInfo rd_vocab_info_table[358]; extern RD_NameSchemaInfo rd_name_schema_info_table[26]; -extern String8 rd_reg_slot_code_name_table[48]; -extern Rng1U64 rd_reg_slot_range_table[48]; +extern String8 rd_reg_slot_code_name_table[49]; +extern Rng1U64 rd_reg_slot_range_table[49]; extern String8 rd_binding_version_remap_old_name_table[8]; extern String8 rd_binding_version_remap_new_name_table[8]; extern String8 rd_icon_kind_text_table[75]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 4d31f2a7..e8572ed9 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -799,6 +799,7 @@ RD_RegTable: {B32 all_windows AllWindows } {B32 non_graphical NonGraphical } {B32 prefer_new_tab PreferNewTab } + {B32 activate_with_single_click ActivateWithSingleClick } {Dir2 dir2 Dir2 } {String8 string String } {String8 cmd_name CmdName } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 2325d4d8..0fce0032 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1998,6 +1998,11 @@ rd_view_ui(Rng2F32 rect) // B32 implicit_root = (cfg_node_child_from_string(cfg_node_from_id(rd_regs()->view), str8_lit("explicit_root")) == &cfg_nil_node); + ////////////////////////////// + //- rjf: decide single-click-to-activate preference + // + B32 prefer_single_click_to_activate = (cfg_node_child_from_string(cfg_node_from_id(rd_regs()->view), str8_lit("activate_with_single_click")) != &cfg_nil_node); + ////////////////////////////// //- rjf: determine autocompletion string // @@ -4201,6 +4206,7 @@ rd_view_ui(Rng2F32 rect) // rjf: activation (double-click normally, or single-clicks with special buttons) if((!(cell_info.flags & RD_WatchCellFlag_ActivateWithSingleClick) && ui_double_clicked(sig)) || ((cell_info.flags & RD_WatchCellFlag_ActivateWithSingleClick) && ui_clicked(sig)) || + (prefer_single_click_to_activate && ui_pressed(sig)) || sig.f & UI_SignalFlag_KeyboardPressed) { // rjf: kill if a double-clickable cell @@ -14770,6 +14776,14 @@ rd_frame(void) { cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit("lister")); } + if(!rd_regs()->activate_with_single_click) + { + cfg_node_release(rd_state->cfg, cfg_node_child_from_string(view, str8_lit("activate_with_single_click"))); + } + else + { + cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit("activate_with_single_click")); + } } // rjf: choose initial input string diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 1836dfda..9e94c90c 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2226,6 +2226,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe .expr = txt_pt_match(*cursor, *mark) ? str8_lit("query:text_pt_commands") : str8_lit("query:text_range_commands"), .do_implicit_root = 1, .do_lister = 1, + .activate_with_single_click = 1, .ui_key = ui_get_selected_state()->root->key, .off_px = ui_mouse(), .cursor = *cursor, From 7021d6056a8058b34e7b026e728b5f44346be1a1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 29 Mar 2026 12:07:27 -0700 Subject: [PATCH 286/850] use project name in window titles --- src/raddbg/raddbg_core.c | 40 +++++++++++++++++++++++++++++----------- src/raddbg/raddbg_core.h | 1 + 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 0fce0032..6ae49298 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4827,7 +4827,17 @@ rd_store_view_paramf(String8 key, char *fmt, ...) internal String8 rd_push_window_title(Arena *arena) { - String8 result = push_str8f(arena, "%S - %s", str8_skip_last_slash(rd_state->project_path), BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ")"); + CFG_Node *root = cfg_node_root(); + CFG_Node *project = cfg_node_child_from_string(root, str8_lit("project")); + CFG_Node *name = cfg_node_child_from_string(project, str8_lit("name")); + String8 project_name = name->first->string; + if(project_name.size == 0) + { + String8 prof_path = rd_state->project_path; + prof_path = str8_chop_last_dot(prof_path); + project_name = str8_skip_last_slash(prof_path); + } + String8 result = push_str8f(arena, "%S - %s", project_name, BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ")"); return result; } @@ -12542,16 +12552,6 @@ rd_frame(void) } rd_cmd(RD_CmdKind_OpenProject, .file_path = project_path); } - - //- rjf: update all window titles - if(file_is_okay) - { - String8 window_title = rd_push_window_title(scratch.arena); - for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) - { - os_window_set_title(ws->os, window_title); - } - } }break; case RD_CmdKind_NewUser: case RD_CmdKind_NewProject: @@ -16389,6 +16389,24 @@ rd_frame(void) rd_cmd(RD_CmdKind_FindThread, .thread = find_thread_retry); } + ////////////////////////////// + //- rjf: update window titles + // + if(rd_state->frame_depth == 1) + { + Temp scratch = scratch_begin(0, 0); + String8 window_title = rd_push_window_title(scratch.arena); + if(!str8_match(window_title, rd_state->last_window_title, 0)) + { + for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) + { + os_window_set_title(ws->os, window_title); + } + } + rd_state->last_window_title = str8_copy(rd_frame_arena(), window_title); + scratch_end(scratch); + } + //////////////////////////// //- rjf: rotate command slots, bump command gen counter // diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 56f5b803..84d3f0ac 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -440,6 +440,7 @@ struct RD_State // rjf: frame parameters F32 frame_dt; Access *frame_access; + String8 last_window_title; // rjf: evaluation cache E_Cache *eval_cache; From d986ea6cd9502da920ec3d02804be53c6f7dab72 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 31 Mar 2026 07:05:44 -0700 Subject: [PATCH 287/850] guard against invalid ctrl entity handle resolutions when applying ctrl events; otherwise some edge cases can cause invalid writes. --- src/ctrl/ctrl_core.c | 72 ++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 7142f43e..75ac5ab5 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1270,9 +1270,12 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis case CTRL_EventKind_NewProc: { CTRL_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); - CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); - process->tls_model = event->tls_model; - process->target_os = event->target_os; + if(machine != &ctrl_entity_nil) + { + CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); + process->tls_model = event->tls_model; + process->target_os = event->target_os; + } }break; case CTRL_EventKind_EndProc: { @@ -1294,35 +1297,38 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis case CTRL_EventKind_NewThread: { CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); - CTRL_Entity *first_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); - if(first_thread == thread) + if(process != &ctrl_entity_nil) { - ctrl_entity_equip_string(store, thread, str8_lit("main_thread")); - } - CTRL_EntityArray pending_thread_names = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadName); - for EachIndex(idx, pending_thread_names.count) - { - CTRL_Entity *entity = pending_thread_names.v[idx]; - if(entity->id == event->entity_id) + CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); + CTRL_Entity *first_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); + if(first_thread == thread) { - ctrl_entity_equip_string(store, thread, entity->string); - ctrl_entity_release(store, entity); - break; + ctrl_entity_equip_string(store, thread, str8_lit("main_thread")); } - } - CTRL_EntityArray pending_thread_colors = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadColor); - for EachIndex(idx, pending_thread_colors.count) - { - CTRL_Entity *entity = pending_thread_colors.v[idx]; - if(entity->id == event->entity_id) + CTRL_EntityArray pending_thread_names = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadName); + for EachIndex(idx, pending_thread_names.count) { - thread->rgba = entity->rgba; - ctrl_entity_release(store, entity); - break; + CTRL_Entity *entity = pending_thread_names.v[idx]; + if(entity->id == event->entity_id) + { + ctrl_entity_equip_string(store, thread, entity->string); + ctrl_entity_release(store, entity); + break; + } } + CTRL_EntityArray pending_thread_colors = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadColor); + for EachIndex(idx, pending_thread_colors.count) + { + CTRL_Entity *entity = pending_thread_colors.v[idx]; + if(entity->id == event->entity_id) + { + thread->rgba = entity->rgba; + ctrl_entity_release(store, entity); + break; + } + } + thread->stack_base = event->stack_base; } - thread->stack_base = event->stack_base; //ctrl_rip_from_thread(&store->ctx, event->entity); }break; case CTRL_EventKind_EndThread: @@ -1346,7 +1352,7 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis { ctrl_entity_equip_string(store, thread, event->string); } - else + else if(process != &ctrl_entity_nil) { CTRL_Entity *pending_name = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadName, Arch_Null, ctrl_handle_zero(), event->entity_id); ctrl_entity_equip_string(store, pending_name, event->string); @@ -1368,7 +1374,7 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis { thread->rgba = event->rgba; } - else + else if(process != &ctrl_entity_nil) { CTRL_Entity *pending = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadColor, Arch_Null, ctrl_handle_zero(), event->entity_id); pending->rgba = event->rgba; @@ -1377,12 +1383,18 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis case CTRL_EventKind_ThreadFrozen: { CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); - thread->is_frozen = 1; + if(thread != &ctrl_entity_nil) + { + thread->is_frozen = 1; + } }break; case CTRL_EventKind_ThreadThawed: { CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); - thread->is_frozen = 0; + if(thread != &ctrl_entity_nil) + { + thread->is_frozen = 0; + } }break; //- rjf: modules From 8d67460fa6cd098a224f4f4f8e4dcf591814fef1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 1 Apr 2026 11:06:23 -0600 Subject: [PATCH 288/850] treat errored call stacks as valid call stack results - only reject on stale data. allow 0 rips for the top frames. --- src/ctrl/ctrl_core.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 75ac5ab5..30ae8cd2 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -3026,8 +3026,8 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U U64 rip = regs_rip_from_arch_block(arch, regs_block); U64 rsp = regs_rsp_from_arch_block(arch, regs_block); - // rjf: cancel on 0 rip - if(rip == 0) + // rjf: cancel on zero rip (except the top frame) + if(rip == 0 && frame_node_count > 0) { break; } @@ -3074,34 +3074,22 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U CTRL_UnwindStepResult step_result = {0}; switch(process_entity->target_os) { - case OperatingSystem_Null:{}break; + default:{}break; case OperatingSystem_Windows: { switch(arch) { - case Arch_Null:{}break; + default:{}break; case Arch_x64: { step_result = ctrl_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us); }break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { - NotImplemented; - }break; - default: { InvalidPath; } break; } }break; case OperatingSystem_Linux: { step_result = ctrl_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us); }break; - case OperatingSystem_Mac: - { - NotImplemented; - }break; - default: { InvalidPath; }break; } // stop unwinding on errors or stale data @@ -6983,7 +6971,7 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, pre_reg_gen = ctrl_reg_gen(); pre_mem_gen = ctrl_mem_gen(); unwind = ctrl_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000); - if(unwind.flags == 0) + if(!(unwind.flags & CTRL_UnwindFlag_Stale)) { good = 1; call_stack[0] = ctrl_call_stack_from_unwind(arena, process, &unwind); From da7e3063ae0ac0cd2a3f1fcb317e965f56483779 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 2 Apr 2026 13:44:10 -0600 Subject: [PATCH 289/850] changelog notes --- CHANGELOG.md | 20 ++++++++++++++++++++ src/radbin/radbin_main.c | 2 ++ src/third_party/radsort/radsort.h | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 562dc77c..62a642a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +# v0.9.25-alpha + +## Debugger Changes + +- Fixed the debugger leaking debug info conversion process handles. This + addresses cases where the debugger was preventing stale debug info from being + updated, after a rebuild. +- Fixed the debugger not correctly using target-embedded markup data. +- Fixed the debugger not showing full call stacks when the top instruction + pointer is located at a 0 address. +- Fixed several crashes and instabilities. +- Added optional cursor trails, to visualize cursor motion. Can be turned off + by toggling the `Cursor Trail` setting. +- Added project names. When set, this name is used for displaying the project + instead of the project filename in the UI and window titles. +- Adjusted the rules for explicit file location finding commands (like + `Switch`, or `Switch To Partner File`), such that they prefer creating new + non-transient tabs, even if the target file is found within an existing + transient tab. + # v0.9.24-alpha ## Debugger Changes diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 64e03163..8a2e3a3c 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -12,6 +12,7 @@ //- rjf: [h] #include "base/base_inc.h" +#include "x64/x64.h" #include "linker/hash_table.h" #include "linker/lf_hash_table.h" #include "os/os_inc.h" @@ -39,6 +40,7 @@ //- rjf: [c] #include "base/base_inc.c" +#include "x64/x64.c" #include "linker/hash_table.c" #include "linker/lf_hash_table.c" #include "os/os_inc.c" diff --git a/src/third_party/radsort/radsort.h b/src/third_party/radsort/radsort.h index b1a48fdf..ee84f863 100644 --- a/src/third_party/radsort/radsort.h +++ b/src/third_party/radsort/radsort.h @@ -440,7 +440,7 @@ RSFORCEINLINE void radsortinternal( void * start, size_t len, size_t element_siz #if BUILD_DEBUG if ( element_size > sizeof( RS_MAX_SIMPLE_BUF ) ) - __debugbreak(); + radsort_break_; #endif // stack for no recursion From 45f0b011aa9d6627cb730638cd5f207a2bc092fc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 2 Apr 2026 13:45:04 -0600 Subject: [PATCH 290/850] changelog notes --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62a642a5..5ff77b5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ `Switch`, or `Switch To Partner File`), such that they prefer creating new non-transient tabs, even if the target file is found within an existing transient tab. +- Adjusted the source code context menu to activate commands with a single + press, rather than the usual double click behavior from general palettes. # v0.9.24-alpha From 7cf8c00947ff71e697112ded2f047bfad90713f6 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 16 Mar 2026 16:31:42 -0700 Subject: [PATCH 291/850] improve test for import_export and fix compile errors in merge_duplicates due to API changes in debug info --- src/torture/torture_radlink.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 2c7bec87..55144234 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -2206,6 +2206,7 @@ T_BeginTest(import_export) PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, dll); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(dll, pe.section_table_range).str; PE_ParsedExportTable export_table = pe_exports_from_data(scratch.arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]); + COFF_SectionHeader *data_sect = coff_section_header_from_name(str8_zero(), section_table, pe.section_count, str8_lit(".data")); // validate header T_Ok(export_table.flags == 0); @@ -2236,14 +2237,12 @@ T_BeginTest(import_export) T_Ok(export_table.exports[7].forwarder.size == 0); // validate voffs - T_Ok(export_table.exports[0].voff == 0x17ff0); - T_Ok(export_table.exports[1].voff == 0x19000); - T_Ok(export_table.exports[2].voff == 0x17ff7); - T_Ok(export_table.exports[3].voff == 0x19000); - T_Ok(export_table.exports[4].voff == 0x19001); - T_Ok(export_table.exports[5].voff == 0x19002); - T_Ok(export_table.exports[6].voff == 0x19009); - T_Ok(export_table.exports[7].voff == 0x1900a); + T_Ok(export_table.exports[1].voff == data_sect->voff + 0x0); + T_Ok(export_table.exports[3].voff == data_sect->voff + 0x0); + T_Ok(export_table.exports[4].voff == data_sect->voff + 0x1); + T_Ok(export_table.exports[5].voff == data_sect->voff + 0x2); + T_Ok(export_table.exports[6].voff == data_sect->voff + 0x9); + T_Ok(export_table.exports[7].voff == data_sect->voff + 0xa); // validate ordinals T_Ok(export_table.exports[0].ordinal == 9); @@ -4044,7 +4043,7 @@ T_BeginTest(merge_duplicate_types) T_Ok(debug_t.count == type_count); { - CV_Leaf ptr_leaf = cv_debug_t_get_leaf(debug_t, 0); + CV_Leaf ptr_leaf = cv_debug_t_get_leaf(&debug_t, 0); T_Ok(ptr_leaf.kind == CV_LeafKind_POINTER); T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer)); @@ -4054,7 +4053,7 @@ T_BeginTest(merge_duplicate_types) } { - CV_Leaf proc_leaf = cv_debug_t_get_leaf(debug_t, 1); + CV_Leaf proc_leaf = cv_debug_t_get_leaf(&debug_t, 1); T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure)); @@ -4064,7 +4063,7 @@ T_BeginTest(merge_duplicate_types) } { - CV_Leaf ptr_leaf = cv_debug_t_get_leaf(debug_t, 2); + CV_Leaf ptr_leaf = cv_debug_t_get_leaf(&debug_t, 2); T_Ok(ptr_leaf.kind == CV_LeafKind_POINTER); T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer)); @@ -4074,7 +4073,7 @@ T_BeginTest(merge_duplicate_types) } { - CV_Leaf proc_leaf = cv_debug_t_get_leaf(debug_t, 3); + CV_Leaf proc_leaf = cv_debug_t_get_leaf(&debug_t, 3); T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure)); From 8f2ec234dc3a857738d826c9375aabd73548015d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 16 Mar 2026 16:31:58 -0700 Subject: [PATCH 292/850] update .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c1dcca67..20020ce7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ /build/ /local/ *~ +.vs +tags \ No newline at end of file From 401ba47ac29cc041011b8811e6e664f4384b0e58 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 16 Mar 2026 16:32:18 -0700 Subject: [PATCH 293/850] telemetry mark up --- src/linker/lnk_io.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index 02853e43..a7d00d9a 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -226,6 +226,7 @@ THREAD_POOL_TASK_FUNC(lnk_memory_map_file_task) internal String8Array lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, LNK_IO_Flags io_flags, String8Array path_arr) { + ProfBeginFunction(); LNK_DiskReader reader = {0}; if (io_flags & LNK_IO_Flags_MemoryMapFiles) { @@ -273,6 +274,7 @@ lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, LNK_IO_Flags } } + ProfEnd(); return result; } From c0418b736d806984c63d75581746499952bb4463 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 17 Mar 2026 12:48:47 -0700 Subject: [PATCH 294/850] WIP: internal and external type servers are functioning except for the PCH indirection --- src/linker/codeview_ext/codeview.c | 122 +- src/linker/codeview_ext/codeview.h | 41 +- src/linker/lnk.c | 18 +- src/linker/lnk_debug_info.c | 2559 ++++++++++------------------ src/linker/lnk_debug_info.h | 290 ++-- src/linker/pdb_ext/pdb_builder.c | 67 +- src/msf/msf_parse.c | 74 +- src/msf/msf_parse.h | 2 + src/torture/torture_radlink.c | 88 +- 9 files changed, 1301 insertions(+), 1960 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 7f61df28..a41b8fc8 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -396,6 +396,12 @@ cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list) return proc_ref_list; } +internal B32 +cv_is_obj_info(CV_Symbol symbol) +{ + return symbol.kind == CV_SymKind_OBJNAME; +} + internal CV_ObjInfo cv_obj_info_from_symbol(CV_Symbol symbol) { @@ -406,12 +412,7 @@ cv_obj_info_from_symbol(CV_Symbol symbol) result.sig = obj_name->sig; str8_deserial_read_cstr(symbol.data, sizeof(CV_SymObjName), &result.name); } break; - case CV_SymKind_OBJNAME_ST: { - NotImplemented; - } break; - default: { - InvalidPath; - } break; + default: { InvalidPath; } break; } return result; } @@ -1092,76 +1093,123 @@ cv_dedup_symbol_ptr_array(TP_Context *tp, CV_SymbolPtrArray *symbols) internal CV_DebugT cv_debug_t_from_data(Arena *arena, String8 data, U64 align) { - ProfBegin("Upfront parse"); - U64 count = 0; - for (U64 cursor = 0; cursor < data.size; count += 1) { - CV_Leaf leaf; - cursor += cv_read_leaf(data, cursor, align, &leaf); + CV_DebugT debug_t = { .data = data }; + + ProfBegin("Upfront parse for counts"); + for (U64 cursor = 0, prev_cursor = 0, ti = CV_MinComplexTypeIndex; cursor < data.size; ti += 1) { + CV_Leaf leaf = {0}; + TryRead(cv_read_leaf(data, cursor, align, &leaf), cursor, count_stop); + debug_t.source_counts[cv_type_index_source_from_leaf_kind(leaf.kind)] += 1; } +count_stop: ProfEnd(); - U32 *offsets = push_array_no_zero(arena, U32, count); + for EachElement(i, debug_t.source_counts) { debug_t.count += debug_t.source_counts[i]; } + + ProfBegin("store leaf offsets"); + debug_t.offsets = push_array_no_zero(arena, U32, debug_t.count); for (U64 cursor = 0, idx = 0; cursor < data.size;) { - offsets[idx++] = cursor; - + debug_t.offsets[idx++] = cursor; CV_Leaf leaf; - cursor += cv_read_leaf(data, cursor, align, &leaf); + TryRead(cv_read_leaf(data, cursor, align, &leaf), cursor, store_stop); } +store_stop: - return (CV_DebugT){ .count = count, .data = data, .offsets = offsets }; + for EachElement(i, debug_t.ti_ranges) { debug_t.ti_ranges[i] = r1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + debug_t.count); } + + ProfEnd(); + return debug_t; } internal CV_Leaf -cv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx) +cv_debug_t_get_leaf(CV_DebugT *debug_t, U64 leaf_idx) { CV_Leaf leaf = {0}; - if (debug_t.count > 0) { - Assert(leaf_idx < debug_t.count); - cv_read_leaf(debug_t.data, debug_t.offsets[leaf_idx], 1, &leaf); + if (debug_t->count > 0) { + Assert(leaf_idx < debug_t->count); + cv_read_leaf(debug_t->data, debug_t->offsets[leaf_idx], 1, &leaf); Assert(cv_header_struct_size_from_leaf_kind(leaf.kind) <= leaf.data.size); } return leaf; } -internal String8 -cv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx) +internal U64 +cv_leaf_idx_from_ti(CV_DebugT *debug_t, CV_TypeIndexSource source, CV_TypeIndex ti) { - Assert(leaf_idx < debug_t.count); - U8 *leaf_ptr = debug_t.data.str + debug_t.offsets[leaf_idx]; + Assert(contains_1u64(debug_t->ti_ranges[source], ti)); // validate TI + Assert(!contains_1u64(debug_t->pch_ti_range[source], ti)); // no PCH indirection + U64 leaf_idx = ti; + Assert(leaf_idx >= debug_t->ti_ranges[source].min); + leaf_idx -= debug_t->ti_ranges[source].min; // strip type index range + Assert(leaf_idx >= dim_1u64(debug_t->pch_ti_range[source])); + leaf_idx -= dim_1u64(debug_t->pch_ti_range[source]); // strip PCH indirection + leaf_idx += debug_t->source_offsets[source]; + Assert(leaf_idx < debug_t->count); + return leaf_idx; +} + +internal CV_TypeIndex +cv_ti_from_leaf_idx(CV_DebugT *debug_t, CV_TypeIndexSource source, U64 leaf_idx) +{ + U64 pch_count = dim_1u64(debug_t->pch_ti_range[source]); + CV_TypeIndex ti = debug_t->ti_ranges[source].min + pch_count + leaf_idx; + return ti; +} + +internal CV_Leaf +cv_leaf_from_ti(CV_DebugT *debug_t, CV_TypeIndexSource source, CV_TypeIndex ti) +{ + U64 leaf_idx = cv_leaf_idx_from_ti(debug_t, source, ti); + return cv_debug_t_get_leaf(debug_t, leaf_idx); +} + +internal String8 +cv_debug_t_get_raw_leaf(CV_DebugT *debug_t, U64 leaf_idx) +{ + Assert(leaf_idx < debug_t->count); + U8 *leaf_ptr = debug_t->data.str + debug_t->offsets[leaf_idx]; CV_LeafSize leaf_size = memory_read16(leaf_ptr); return str8(leaf_ptr, leaf_size + sizeof(leaf_size)); } internal CV_LeafHeader * -cv_debug_t_get_leaf_header(CV_DebugT debug_t, U64 leaf_idx) +cv_debug_t_get_leaf_header(CV_DebugT *debug_t, U64 leaf_idx) { CV_LeafHeader *header = 0; - if (leaf_idx < debug_t.count) { - header = (CV_LeafHeader *)(debug_t.data.str + debug_t.offsets[leaf_idx]); + if (leaf_idx < debug_t->count) { + header = (CV_LeafHeader *)(debug_t->data.str + debug_t->offsets[leaf_idx]); } return header; } +internal CV_TypeIndex +cv_debug_t_get_type_index(CV_DebugT *debug_t, CV_TypeIndexSource ti_source, U64 leaf_idx) +{ + CV_TypeIndex ti = debug_t->ti_ranges[ti_source].min + leaf_idx; + Assert(contains_1u64(debug_t->ti_ranges[ti_source], ti)); + return ti; +} + +internal U64 +cv_debug_t_get_leaf_index(CV_DebugT *debug_t, CV_TypeIndexSource ti_source, CV_TypeIndex ti) +{ + Assert(contains_1u64(debug_t->ti_ranges[ti_source], ti)); + U64 leaf_idx = ti - debug_t->ti_ranges[ti_source].min; + return leaf_idx; +} + internal B32 -cv_debug_t_is_pch(CV_DebugT debug_t) +cv_debug_t_is_pch(CV_DebugT *debug_t) { return cv_is_leaf_pch(cv_debug_t_get_leaf(debug_t, 0).kind); } internal B32 -cv_debug_t_is_type_server(CV_DebugT debug_t) +cv_debug_t_is_type_server_ref(CV_DebugT *debug_t) { return cv_is_leaf_type_server(cv_debug_t_get_leaf(debug_t, 0).kind); } -internal U64 -cv_debug_t_array_count_leaves(U64 count, CV_DebugT *debug_t) -{ - U64 total = 0; - for EachIndex(i, count) { total += debug_t[i].count; } - return total; -} - // $$Symbols internal void diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index 916609e7..73306b4b 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -253,11 +253,27 @@ typedef struct CV_DebugS String8List data_list[CV_C13SubSectionIdxKind_COUNT]; } CV_DebugS; +typedef struct CV_DebugH +{ + U64 count; + U64 *v; +} CV_DebugH; + typedef struct CV_DebugT { - U64 count; - String8 data; - U32 *offsets; + String8 data; + U64 count; + U32 *offsets; + + // type server + U64 source_counts [CV_TypeIndexSource_COUNT]; + U64 source_offsets[CV_TypeIndexSource_COUNT]; + U32 ti_base [CV_TypeIndexSource_COUNT]; + Rng1U64 ti_ranges [CV_TypeIndexSource_COUNT]; + + // PCH + Rng1U64 pch_ti_range[CV_TypeIndexSource_COUNT]; + U32 pch_obj_idx; } CV_DebugT; //////////////////////////////// @@ -393,6 +409,7 @@ internal CV_SymbolList cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_Symb internal U64 cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out); internal CV_Symbol cv_symbol_from_string(String8 raw_data); +internal B32 cv_is_obj_info(CV_Symbol symbol); internal CV_ObjInfo cv_obj_info_from_symbol(CV_Symbol symbol); //////////////////////////////// @@ -416,13 +433,17 @@ internal String8 cv_file_chksms_from_debug_s(CV_DebugS debug_s); //////////////////////////////// //~ .debug$T helpers -internal CV_DebugT cv_debug_t_from_data(Arena *arena, String8 data, U64 align); -internal CV_Leaf cv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx); -internal String8 cv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx); -internal CV_LeafHeader * cv_debug_t_get_leaf_header(CV_DebugT debug_t, U64 leaf_idx); -internal B32 cv_debug_t_is_pch(CV_DebugT debug_t); -internal B32 cv_debug_t_is_type_server(CV_DebugT debug_t); -internal U64 cv_debug_t_array_count_leaves(U64 count, CV_DebugT *arr); +internal CV_DebugT cv_debug_t_from_data (Arena *arena, String8 data, U64 align); +internal U64 cv_leaf_idx_from_ti (CV_DebugT *debug_t, CV_TypeIndexSource source, CV_TypeIndex ti); +internal CV_TypeIndex cv_ti_from_leaf_idx (CV_DebugT *debug_t, CV_TypeIndexSource source, U64 leaf_idx); +internal CV_Leaf cv_debug_t_get_leaf (CV_DebugT *debug_t, U64 leaf_idx); +internal CV_Leaf cv_debug_t_get_leaf_from_ti (CV_DebugT *debug_t, CV_TypeIndexSource source, CV_TypeIndex ti); +internal String8 cv_debug_t_get_raw_leaf (CV_DebugT *debug_t, U64 leaf_idx); +internal CV_LeafHeader * cv_debug_t_get_leaf_header (CV_DebugT *debug_t, U64 leaf_idx); +internal CV_TypeIndex cv_debug_t_get_type_index (CV_DebugT *debug_t, CV_TypeIndexSource ti_source, U64 leaf_idx); +internal U64 cv_debug_t_get_leaf_index (CV_DebugT *debug_t, CV_TypeIndexSource ti_source, CV_TypeIndex ti); +internal B32 cv_debug_t_is_pch (CV_DebugT *debug_t); +internal B32 cv_debug_t_is_type_server_ref(CV_DebugT *debug_t); //////////////////////////////// //~ Sub Section helpers diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 2732944c..122db98a 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -5161,14 +5161,13 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) rdi_arch_from_coff_machine(config->machine), config->image_name, image_ctx.image_data, - input.count, - input.obj_arr, + debug_info_objs_count, + debug_info_objs, input.debug_s_arr, - input.total_symbol_input_count, + input.symbol_input_count, input.symbol_inputs, input.parsed_symbols, - merged_types.count, - merged_types.v); + merged_types); lnk_write_data_list_to_file_path(config->rad_debug_name, config->temp_rad_debug_name, rdi_data); @@ -5198,14 +5197,13 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) image_ctx.image_data, config, symtab, - input.count, - input.obj_arr, + debug_info_objs_count, + debug_info_objs, input.debug_s_arr, - input.total_symbol_input_count, + input.symbol_input_count, input.symbol_inputs, input.parsed_symbols, - merged_types.count, - merged_types.v); + merged_types); lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data); lnk_timer_end(LNK_Timer_Pdb); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 434b28cb..70e272e5 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -60,7 +60,7 @@ lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_O } internal -THREAD_POOL_TASK_FUNC(lnk_check_debug_t_sig_and_get_data_task) +THREAD_POOL_TASK_FUNC(lnk_strip_debug_t_sig_task) { U64 obj_idx = task_id; LNK_CheckDebugTSigTaskData *task = raw_task; @@ -68,39 +68,22 @@ THREAD_POOL_TASK_FUNC(lnk_check_debug_t_sig_and_get_data_task) String8Array data_arr = task->data_arr_arr[obj_idx]; LNK_Obj *obj = task->obj_arr[obj_idx]; - for (String8 *data_ptr = &data_arr.v[0], *data_opl = data_arr.v + data_arr.count; - data_ptr < data_opl; - ++data_ptr) { - if (data_ptr->size == 0) { - continue; - } + for EachIndex(i, data_arr.count) { + String8 *d = data_arr.v + i; + if (d->size == 0) { continue; } - if (data_ptr->size < sizeof(CV_Signature)) { - // TODO: print section index + if (d->size < sizeof(CV_Signature)) { lnk_error_obj(LNK_Error_IllData, obj, ".debug$T must have at least 4 bytes for CodeView signature"); } - CV_Signature sig = cv_signature_from_debug_s(*data_ptr); + CV_Signature sig = cv_signature_from_debug_s(*d); switch (sig) { default: { lnk_error_obj(LNK_Warning_IllData, obj, "unknown CodeView type signature in section (TODO: print section index)"); - *data_ptr = str8(0,0); - } break; - case CV_Signature_C6: { - lnk_not_implemented("TODO: C6 types"); - *data_ptr = str8(0,0); - } break; - case CV_Signature_C7: { - lnk_not_implemented("TODO: C7 types"); - *data_ptr = str8(0,0); - } break; - case CV_Signature_C11: { - lnk_not_implemented("TODO: C11 types"); - *data_ptr = str8(0,0); + *d = str8(0,0); } break; case CV_Signature_C13: { - data_ptr->str += sizeof(CV_Signature); - data_ptr->size -= sizeof(CV_Signature); + *d = str8_skip(*d, sizeof(CV_Signature)); } break; } } @@ -110,13 +93,11 @@ internal THREAD_POOL_TASK_FUNC(lnk_parse_debug_t_task) { ProfBeginFunction(); - U64 obj_idx = task_id; - LNK_ParseDebugTTaskData *task = raw_task; - String8Array data_arr = task->data_arr_arr[obj_idx]; - if (data_arr.count > 0) { - task->debug_t_arr[obj_idx] = cv_debug_t_from_data(arena, data_arr.v[0], CV_LeafAlign); + LNK_ParseDebugTTaskData *task = raw_task; + if (task->data_arr_arr[task_id].count > 0) { + task->debug_t_arr[task_id] = cv_debug_t_from_data(arena, task->data_arr_arr[task_id].v[0], CV_LeafAlign); } else { - MemoryZeroStruct(&task->debug_t_arr[obj_idx]); + MemoryZeroStruct(&task->debug_t_arr[task_id]); } ProfEnd(); } @@ -133,7 +114,7 @@ lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_O LNK_CheckDebugTSigTaskData check_sig; check_sig.obj_arr = obj_arr; check_sig.data_arr_arr = data_arr_arr; - tp_for_parallel(tp, 0, obj_count, lnk_check_debug_t_sig_and_get_data_task, &check_sig); + tp_for_parallel(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &check_sig); // parse debug types LNK_ParseDebugTTaskData parse; @@ -149,240 +130,119 @@ internal THREAD_POOL_TASK_FUNC(lnk_parse_cv_symbols_task) { LNK_ParseCVSymbolsTaskData *task = raw_task; - LNK_CodeViewSymbolsInput *input = &task->inputs[task_id]; + LNK_SymbolInput *input = &task->inputs[task_id]; cv_parse_symbol_sub_section(arena, input->symbol_list, 0, input->raw_symbols, CV_SymbolAlign); } -internal LNK_PchInfo * -lnk_setup_pch(Arena *arena, U64 obj_count, LNK_Obj **obj_arr, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr, CV_SymbolListArray *parsed_symbols, String8List alt_pch_dirs) +internal +THREAD_POOL_TASK_FUNC(lnk_read_type_servers_task) { + ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); + LNK_CodeViewInput *task = raw_task; - String8 work_dir = os_get_current_path(scratch.arena); + B32 discard_debug_info = 1; + U64 ts_idx = task_id; + LNK_TypeServer *ts = &task->ts_arr.v[ts_idx]; - HashTable *debug_p_ht = hash_table_init(scratch.arena, obj_count); - CV_LeafHeader **endprecomp_arr = push_array(scratch.arena, CV_LeafHeader *, obj_count); + // read PDB from disk + String8 msf_data = lnk_read_data_from_file_path(scratch.arena, task->io_flags, ts->ts_path); - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { - CV_DebugT *debug_p = &debug_p_arr[obj_idx]; - CV_DebugT *debug_t = &debug_t_arr[obj_idx]; + // check magic + if (!msf_check_magic_70(msf_data) && msf_check_magic_20(msf_data)) { goto exit; } - if (debug_t->count && debug_p->count) { - lnk_error_obj(LNK_Warning_MultipleDebugTAndDebugP, - obj_arr[obj_idx], - "multiple sections with debug types detected, obj must have either .debug$T or .debug$P (using .debug$T for type server)"); - continue; - } + // read the stream table + MSF_RawStreamTable *st = msf_raw_stream_table_from_data(scratch.arena, msf_data); + if (st == 0) { goto exit; } - if (debug_p->count) { - String8 obj_path = obj_arr[obj_idx]->path; - obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_path, work_dir); - if (hash_table_search_path(debug_p_ht, obj_path)) { - lnk_error_obj(LNK_Warning_DuplicateObjPath, obj_arr[obj_idx], "duplicate obj path %S", obj_path); - } else { - hash_table_push_path_u64(scratch.arena, debug_p_ht, obj_path, obj_idx); - } + // PDB must have these streams + if (PDB_FixedStream_Tpi >= st->stream_count || PDB_FixedStream_Ipi >= st->stream_count || PDB_FixedStream_Info >= st->stream_count) { goto exit; } + + // read info stream + String8 info_data = msf_data_from_stream_number(scratch.arena, msf_data, st, PDB_FixedStream_Info); + PDB_InfoParse info_parse = {0}; + pdb_info_parse_from_data(info_data, &info_parse); + + // match GUID from obj against one in the type server + if (!MemoryMatchStruct(&info_parse.guid, &ts->ts_info.sig)) { + lnk_error(LNK_Warning_MismatchedTypeServerSignature, + "%S: signature mismatch in type server read from disk, expected %S, got %S", + ts->ts_info.name, + string_from_guid(scratch.arena, ts->ts_info.sig), + string_from_guid(scratch.arena, info_parse.guid)); + goto exit; + } + + MSF_StreamNumber type_streams[CV_TypeIndexSource_COUNT] = {}; + type_streams[CV_TypeIndexSource_TPI] = PDB_FixedStream_Tpi; + type_streams[CV_TypeIndexSource_IPI] = PDB_FixedStream_Ipi; + + Rng1U64 ti_ranges [CV_TypeIndexSource_COUNT] = {0}; + Rng1U64 leaf_ranges[CV_TypeIndexSource_COUNT] = {0}; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + MSF_StreamNumber sn = type_streams[ti_source]; + if (sn == 0) { continue; } + if (!pdb_extract_type_server_info(msf_data, st, sn, &ti_ranges[ti_source], &leaf_ranges[ti_source])) { goto exit; } + } + + // alloc buffer where TPI and IPI are adjecent + U64 buffer_size = 0; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { buffer_size += dim_1u64(leaf_ranges[ti_source]); } + buffer_size = AlignPow2(buffer_size, 4) + ARENA_HEADER_SIZE; + U8 *buffer = push_array(arena, U8, buffer_size); + Arena *fixed = arena_alloc( .reserve_size = buffer_size, .commit_size = buffer_size, .optional_backing_buffer = buffer ); + + // read both streams into a contiguous buffer + String8 source_data_arr[CV_TypeIndexSource_COUNT] = {0}; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + MSF_StreamNumber sn = type_streams[ti_source]; + if (sn == 0) { continue; } + source_data_arr[ti_source] = msf_data_from_stream_number_ex(fixed, msf_data, st, sn, leaf_ranges[ti_source], PDB_LEAF_ALIGN); + Assert(source_data_arr[ti_source].size == dim_1u64(leaf_ranges[ti_source])); + } + // assert streams are adjecent in the buffer + for (U64 i = 1; i+1 < CV_TypeIndexSource_COUNT; i += 1) { AssertAlways(source_data_arr[i].str + source_data_arr[i].size == source_data_arr[i+1].str); } + String8 type_data = str8(buffer + ARENA_HEADER_SIZE, buffer_size - ARENA_HEADER_SIZE); + + // map type server to -> .debug$T + U64 obj_idx = task->type_server_indices.v[task_id]; + CV_DebugT *debug_t = &task->debug_t_arr[obj_idx]; + + // read types + CV_DebugT d = cv_debug_t_from_data(arena, type_data, PDB_LEAF_ALIGN); + + // @type_server .debug$T + debug_t->count = d.count; + debug_t->data = d.data; + debug_t->offsets = d.offsets; + for EachIndex(i, CV_TypeIndexSource_COUNT) { debug_t->ti_ranges[i] = ti_ranges[i]; } + for EachIndex(i, CV_TypeIndexSource_COUNT) { debug_t->ti_base[i] = IntFromPtr(source_data_arr[i].str - type_data.str); } + MemoryCopyTyped(debug_t->source_counts, d.source_counts, CV_TypeIndexSource_COUNT); + MemoryCopyTyped(debug_t->source_offsets, d.source_counts, CV_TypeIndexSource_COUNT); + u64_array_counts_to_offsets(CV_TypeIndexSource_COUNT, debug_t->source_offsets); + + discard_debug_info = 0; + exit:; + if (discard_debug_info) { + // an error occurred while loading external type server, discard + // parts debug info in dependent objs that rely on types + for EachNode(n, U64Node, task->ts_arr.v[ts_idx].obj_indices.first) { + U64 obj_idx = n->data; + + // discard symbols + String8List *symbols_ptr = cv_sub_section_ptr_from_debug_s(&task->debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + MemoryZeroStruct(symbols_ptr); + + // discard inline sites + String8List *inlineelines_ptr = cv_sub_section_ptr_from_debug_s(&task->debug_s_arr[obj_idx], CV_C13SubSectionKind_InlineeLines); + MemoryZeroStruct(inlineelines_ptr); } } - LNK_PchInfo* pch_arr = push_array_no_zero(arena, LNK_PchInfo, obj_count); - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { - CV_DebugT debug_t = debug_t_arr[obj_idx]; - if (cv_debug_t_is_pch(debug_t)) { - CV_Leaf precomp_leaf = cv_debug_t_get_leaf(debug_t, 0); - CV_PrecompInfo precomp = cv_precomp_info_from_leaf(precomp_leaf); - - String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir); - - // map obj name in LF_PRECOMP to obj index - U64 debug_p_obj_idx = max_U64; - if (!hash_table_search_path_u64(debug_p_ht, obj_path, &debug_p_obj_idx)) { - String8 obj_name = str8_skip_last_slash(obj_path); - for EachNode(alt_dir_n, String8Node, alt_pch_dirs.first) { - String8 alt_obj_path = str8f(scratch.arena, "%S/%S", alt_dir_n->string, obj_name); - if (hash_table_search_path_u64(debug_p_ht, alt_obj_path, &debug_p_obj_idx)) { - break; - } - } - } - - if (debug_p_obj_idx == max_U64) { - lnk_error_obj(LNK_Error_PrecompObjNotFound, obj_arr[obj_idx], "LF_PRECOMP references non-existent obj %S", obj_path); - lnk_exit(LNK_Error_PrecompObjNotFound); - } - - // get LF_PRECOMP - CV_DebugT debug_p = debug_p_arr[debug_p_obj_idx]; - CV_Leaf endprecomp_leaf = cv_debug_t_get_leaf(debug_p, precomp.leaf_count); - CV_LeafEndPreComp *endprecomp = (CV_LeafEndPreComp*) endprecomp_leaf.data.str; - - // error check LF_PRECOMP - if (precomp.start_index > CV_MinComplexTypeIndex) { - lnk_error_obj(LNK_Warning_AtypicalStartIndex, obj_arr[obj_idx], "atypical start index 0x%X in LF_PRECOMP", precomp.start_index); - } - if (precomp.start_index < CV_MinComplexTypeIndex) { - lnk_error_obj(LNK_Error_InvalidStartIndex, obj_arr[obj_idx], "invalid start index 0x%X in LF_PRECOMP; must be >= 0x%X", precomp.start_index, CV_MinComplexTypeIndex); - } - if (precomp.leaf_count > debug_p.count) { - lnk_error_obj(LNK_Error_InvalidPrecompLeafCount, obj_arr[obj_idx], "leaf count %u LF_PRECOMP exceeds leaf count %u in .debug$P in %S", precomp.leaf_count, debug_p.count, obj_arr[debug_p_obj_idx]->path); - } - - // error check LF_ENDPRECOMP - if (endprecomp_leaf.kind != CV_LeafKind_ENDPRECOMP) { - lnk_error_obj(LNK_Error_EndprecompNotFound, obj_arr[obj_idx], "unable to find LF_ENDPRECOMP @ 0x%X in %S", precomp.leaf_count, obj_arr[debug_p_obj_idx]->path); - } - if (endprecomp_leaf.data.size != sizeof(CV_LeafEndPreComp)) { - lnk_error_obj(LNK_Error_IllData, obj_arr[obj_idx], "invalid size 0x%X for LF_ENDPRECOMP", endprecomp_leaf.data.size); - } - if (endprecomp->sig != precomp.sig) { - lnk_error_obj(LNK_Error_PrecompSigMismatch, obj_arr[obj_idx], "signature mismatch between LF_PRECOMP(0x%X) and LF_ENDPRECOMP(0x%X); precomp obj %S", precomp.sig, endprecomp->sig, obj_arr[debug_p_obj_idx]->path); - } - { // check against S_OBJNAME sig in precompiled obj $$SYMBOLS - CV_SymbolList symbol_list = parsed_symbols[debug_p_obj_idx].v[0]; - if (symbol_list.count) { - CV_ObjInfo obj_info = cv_obj_info_from_symbol(symbol_list.first->data); - if (obj_info.sig != 0 && obj_info.sig != precomp.sig) { - lnk_error_obj(LNK_Error_PrecompSigMismatch, obj_arr[obj_idx], "signature mismatch between LF_PRECOMP(0x%X) and S_OBJNAME(0x%X) in %S", precomp.sig, obj_info.sig, obj_arr[debug_p_obj_idx]->path); - } - } else { - lnk_error_obj(LNK_Warning_PrecompObjSymbolsNotFound, obj_arr[obj_idx], "symbols not found, unable to chceck LF_PRECOMP signature against S_OBJ"); - } - } - - // see :pch_check - LNK_PchInfo *pch = &pch_arr[obj_idx]; - pch->ti_lo = precomp.start_index; - pch->ti_hi = precomp.start_index + precomp.leaf_count; - pch->debug_p_obj_idx = debug_p_obj_idx; - - // [start_index, start_index+type_index_count) - debug_t_arr[obj_idx].count -= 1; - debug_t_arr[obj_idx].offsets += 1; - - endprecomp_arr[debug_p_obj_idx] = cv_debug_t_get_leaf_header(debug_p, precomp.leaf_count); - } else { - LNK_PchInfo *pch = &pch_arr[obj_idx]; - pch->ti_lo = CV_MinComplexTypeIndex; - pch->ti_hi = CV_MinComplexTypeIndex; - pch->debug_p_obj_idx = 0; // :null_obj - } - } - - // remove LF_ENDPRECOMP - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { - if (endprecomp_arr[obj_idx]) { - endprecomp_arr[obj_idx]->kind = CV_LeafKind_NOTYPE; - endprecomp_arr[obj_idx]->size = sizeof(CV_LeafKind); - } - } + task->is_type_server_discarded[task_id] = discard_debug_info; + ProfEnd(); scratch_end(scratch); - return pch_arr; -} - -internal void -lnk_do_debug_info_discard(CV_DebugS *debug_s_arr, CV_SymbolListArray *parsed_symbols, U64 obj_idx) -{ - // remove symbols - for (U64 i = 0; i < parsed_symbols[obj_idx].count; ++i) { - MemoryZeroStruct(&parsed_symbols[obj_idx].v[i]); - } - - // remove inline sites - String8List *inlineelines_ptr = cv_sub_section_ptr_from_debug_s(&debug_s_arr[obj_idx], CV_C13SubSectionKind_InlineeLines); - MemoryZeroStruct(inlineelines_ptr); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_msf_parsed_from_data_task) -{ - ProfBeginFunction(); - LNK_MsfParsedFromDataTask *task = raw_task; - // TODO: pick Info, TPI and IPI to flattten to make sure we don't waste compute on throw-away streams - MSF_Parsed *msf = 0; - if (task->data_arr.v[task_id].size > 0) { - msf = msf_parsed_from_data(arena, task->data_arr.v[task_id]); - } - task->msf_parse_arr[task_id] = msf; - ProfEnd(); -} - -internal MSF_Parsed ** -lnk_msf_parsed_from_data_parallel(TP_Arena *arena, TP_Context *tp, String8Array data_arr) -{ - ProfBeginFunction(); - LNK_MsfParsedFromDataTask task = {0}; - task.data_arr = data_arr; - task.msf_parse_arr = push_array_no_zero(arena->v[0], MSF_Parsed *, data_arr.count); - tp_for_parallel(tp, arena, data_arr.count, lnk_msf_parsed_from_data_task, &task); - ProfEnd(); - return task.msf_parse_arr; -} - -internal -THREAD_POOL_TASK_FUNC(lnk_get_external_leaves_task) -{ - ProfBeginFunction(); - - U64 ts_idx = task_id; - LNK_GetExternalLeavesTask *task = raw_task; - MSF_Parsed *msf_parse = task->msf_parse_arr[ts_idx]; - - task->external_ti_ranges[ts_idx] = push_array(arena, Rng1U64, CV_TypeIndexSource_COUNT); - task->external_leaves[ts_idx] = push_array(arena, CV_DebugT, CV_TypeIndexSource_COUNT); - task->is_corrupted[ts_idx] = 1; - - if (msf_parse) { - PDB_OpenTypeServerError tpi_error = PDB_OpenTypeServerError_UNKNOWN; - PDB_OpenTypeServerError ipi_error = PDB_OpenTypeServerError_UNKNOWN; - - PDB_TypeServerParse tpi_parse, ipi_parse; - if (PDB_FixedStream_Tpi < msf_parse->stream_count && PDB_FixedStream_Ipi < msf_parse->stream_count) { - tpi_error = pdb_type_server_parse_from_data(msf_parse->streams[PDB_FixedStream_Tpi], &tpi_parse); - ipi_error = pdb_type_server_parse_from_data(msf_parse->streams[PDB_FixedStream_Ipi], &ipi_parse); - } - - if (tpi_error == PDB_OpenTypeServerError_OK && ipi_error == PDB_OpenTypeServerError_OK) { - task->is_corrupted[ts_idx] = 0; - - task->external_ti_ranges[ts_idx][CV_TypeIndexSource_NULL] = rng_1u64(0,0); - task->external_ti_ranges[ts_idx][CV_TypeIndexSource_TPI ] = tpi_parse.ti_range; - task->external_ti_ranges[ts_idx][CV_TypeIndexSource_IPI ] = ipi_parse.ti_range; - - MemoryZeroStruct(&task->external_leaves[ts_idx][CV_TypeIndexSource_NULL]); - task->external_leaves[ts_idx][CV_TypeIndexSource_TPI] = cv_debug_t_from_data(arena, tpi_parse.leaf_data, PDB_LEAF_ALIGN); - task->external_leaves[ts_idx][CV_TypeIndexSource_IPI] = cv_debug_t_from_data(arena, ipi_parse.leaf_data, PDB_LEAF_ALIGN); - } else { - if (tpi_error != PDB_OpenTypeServerError_OK) { - lnk_error(LNK_Error_UnableToOpenTypeServer, "failed to open TPI in %S, reson %S", task->ts_info_arr[ts_idx].name, pdb_string_from_open_type_server_error(tpi_error)); - } - if (ipi_error != PDB_OpenTypeServerError_OK) { - lnk_error(LNK_Error_UnableToOpenTypeServer, "failed to open IPI in %S, reason %S", task->ts_info_arr[ts_idx].name, pdb_string_from_open_type_server_error(ipi_error)); - } - } - } - - ProfEnd(); -} - -internal CV_DebugT * -lnk_merge_debug_t_and_debug_p(Arena *arena, U64 obj_count, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr) -{ - CV_DebugT *result = push_array_no_zero(arena, CV_DebugT, obj_count); - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { - CV_DebugT *debug_p = &debug_p_arr[obj_idx]; - CV_DebugT *debug_t = &debug_t_arr[obj_idx]; - if (debug_p->count) { - Assert(!debug_t->count); - result[obj_idx] = *debug_p; - } else if (debug_t->count) { - Assert(!debug_p->count); - result[obj_idx] = *debug_t; - } else { - MemoryZeroStruct(&result[obj_idx]); - } - } - return result; } internal LNK_CodeViewInput @@ -390,28 +250,22 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla { ProfBegin("Extract CodeView"); Temp scratch = scratch_begin(0,0); + + LNK_CodeViewInput input = { .io_flags = io_flags, .count = obj_count, .obj_arr = obj_arr, .ts_obj_range = r1u64(0,0) }; - // gather debug info sections from objs ProfBegin("Collect CodeView"); // TODO: fix memory leak, we need a Temp wrapper for pool arena - B32 collect_discarded_flag = 0; - String8List *debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$S"), collect_discarded_flag); - String8List *debug_p_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$P"), collect_discarded_flag); - String8List *debug_t_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$T"), collect_discarded_flag); + String8List *debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$S"), 0); + String8List *debug_p_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$P"), 0); + String8List *debug_t_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$T"), 0); ProfEnd(); if (lnk_get_log_status(LNK_Log_Debug) || PROFILE_TELEMETRY) { U64 total_debug_s_size = 0, total_debug_t_size = 0, total_debug_p_size = 0; - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { - for (String8Node *chunk = debug_s_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) { - total_debug_s_size += chunk->string.size; - } - for (String8Node *chunk = debug_t_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) { - total_debug_t_size += chunk->string.size; - } - for (String8Node *chunk = debug_p_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) { - total_debug_p_size += chunk->string.size; - } + for EachIndex(obj_idx, obj_count) { + for EachNode(n, String8Node, debug_s_list_arr[obj_idx].first) { total_debug_s_size += n->string.size; } + for EachNode(n, String8Node, debug_t_list_arr[obj_idx].first) { total_debug_t_size += n->string.size; } + for EachNode(n, String8Node, debug_p_list_arr[obj_idx].first) { total_debug_p_size += n->string.size; } } ProfNoteV("Total .debug$S Input Size: %M", total_debug_s_size); @@ -426,733 +280,378 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } ProfBegin("Parse CodeView"); - CV_DebugS *debug_s_arr = lnk_parse_debug_s_sections(tp, tp_arena, obj_count, obj_arr, debug_s_list_arr); - CV_DebugT *debug_p_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_p_list_arr); - CV_DebugT *debug_t_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_t_list_arr); - ProfEnd(); - - ProfBegin("Sort Type Servers"); - - U64 external_count = 0, internal_count = 0; - LNK_Obj **sorted_obj_arr = push_array_no_zero(tp_arena->v[0], LNK_Obj *, obj_count); - CV_DebugS *sorted_debug_s_arr = push_array_no_zero(tp_arena->v[0], CV_DebugS, obj_count); - CV_DebugT *sorted_debug_t_arr = push_array_no_zero(tp_arena->v[0], CV_DebugT, obj_count); - CV_DebugT *sorted_debug_p_arr = push_array_no_zero(tp_arena->v[0], CV_DebugT, obj_count); - for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) { - B32 is_type_server = cv_debug_t_is_type_server(debug_t_arr[obj_idx]); - if (is_type_server) { - Assert(internal_count + external_count < obj_count); - U64 slot_idx = (obj_count - external_count - 1); - ++external_count; - - // TODO: report error: somehow obj was compiled with /Zi and /Yc - Assert(debug_p_arr[obj_idx].count == 0); - - sorted_obj_arr[slot_idx] = obj_arr[obj_idx]; - sorted_debug_s_arr[slot_idx] = debug_s_arr[obj_idx]; - sorted_debug_t_arr[slot_idx] = debug_t_arr[obj_idx]; - MemoryZeroStruct(&sorted_debug_p_arr[slot_idx]); - } else { - Assert(internal_count + external_count < obj_count); - U64 slot_idx = internal_count; - ++internal_count; - - sorted_obj_arr[slot_idx] = obj_arr[obj_idx]; - sorted_debug_s_arr[slot_idx] = debug_s_arr[obj_idx]; - sorted_debug_t_arr[slot_idx] = debug_t_arr[obj_idx]; - sorted_debug_p_arr[slot_idx] = debug_p_arr[obj_idx]; - } - } - - ProfEnd(); - - // setup pointers to arrays - LNK_Obj **internal_obj_arr = sorted_obj_arr; - LNK_Obj **external_obj_arr = sorted_obj_arr + internal_count; - CV_DebugS *internal_debug_s_arr = sorted_debug_s_arr; - CV_DebugS *external_debug_s_arr = sorted_debug_s_arr + internal_count; - CV_DebugT *internal_debug_t_arr = sorted_debug_t_arr; - CV_DebugT *external_debug_t_arr = sorted_debug_t_arr + internal_count; - CV_DebugT *internal_debug_p_arr = sorted_debug_p_arr; - CV_DebugT *external_debug_p_arr = sorted_debug_p_arr + internal_count; - - ProfBegin("Parse Symbols"); - - ProfBegin("Count Symbol Inputs"); - U64 internal_total_symbol_input_count = 0; - U64 external_total_symbol_input_count = 0; - for (U64 obj_idx = 0; obj_idx < internal_count; ++obj_idx) { - String8List raw_symbols = cv_sub_section_from_debug_s(internal_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); - internal_total_symbol_input_count += raw_symbols.node_count; - } - for (U64 obj_idx = 0; obj_idx < external_count; ++obj_idx) { - String8List raw_symbols = cv_sub_section_from_debug_s(external_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); - external_total_symbol_input_count += raw_symbols.node_count; - } + input.debug_s_arr = lnk_parse_debug_s_sections(tp, tp_arena, obj_count, obj_arr, debug_s_list_arr); + input.debug_p_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_p_list_arr); + input.debug_t_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_t_list_arr); + input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, obj_count); // TODO: collect & parse .debug$H ProfEnd(); - ProfBegin("Prepare Symbol Inputs"); - U64 total_symbol_input_count = internal_total_symbol_input_count + external_total_symbol_input_count; - LNK_CodeViewSymbolsInput *symbol_inputs = push_array_no_zero(tp_arena->v[0], LNK_CodeViewSymbolsInput, total_symbol_input_count); - CV_SymbolListArray *parsed_symbols = push_array_no_zero(tp_arena->v[0], CV_SymbolListArray, obj_count); + ProfBegin("Set up symbol parsing"); + for EachIndex(obj_idx, obj_count) { input.symbol_input_count += cv_sub_section_from_debug_s(input.debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols).node_count; } + input.symbol_inputs = push_array_no_zero(tp_arena->v[0], LNK_SymbolInput, input.symbol_input_count); + input.parsed_symbols = push_array_no_zero(tp_arena->v[0], CV_SymbolListArray, obj_count); { - CV_SymbolList *reserved_lists = push_array(tp_arena->v[0], CV_SymbolList, total_symbol_input_count); + CV_SymbolList *reserved_lists = push_array(tp_arena->v[0], CV_SymbolList, input.symbol_input_count); for (U64 obj_idx = 0, input_idx = 0; obj_idx < obj_count; ++obj_idx) { - String8List raw_symbols = cv_sub_section_from_debug_s(sorted_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + String8List raw_symbols = cv_sub_section_from_debug_s(input.debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); // init parse output if (raw_symbols.node_count > 0) { - parsed_symbols[obj_idx].count = raw_symbols.node_count; - parsed_symbols[obj_idx].v = reserved_lists + input_idx; + input.parsed_symbols[obj_idx].count = raw_symbols.node_count; + input.parsed_symbols[obj_idx].v = reserved_lists + input_idx; } else { - parsed_symbols[obj_idx].count = 0; - parsed_symbols[obj_idx].v = 0; + input.parsed_symbols[obj_idx].count = 0; + input.parsed_symbols[obj_idx].v = 0; } // init worker input for (String8Node *data_n = raw_symbols.first; data_n != 0; data_n = data_n->next, ++input_idx) { - Assert(input_idx < total_symbol_input_count); - LNK_CodeViewSymbolsInput *in = &symbol_inputs[input_idx]; + Assert(input_idx < input.symbol_input_count); + LNK_SymbolInput *in = &input.symbol_inputs[input_idx]; in->obj_idx = obj_idx; in->symbol_list = &reserved_lists[input_idx]; in->raw_symbols = data_n->string; } } + + tp_for_parallel_prof(tp, tp_arena, input.symbol_input_count, lnk_parse_cv_symbols_task, &(LNK_ParseCVSymbolsTaskData){ .inputs = input.symbol_inputs }, "Symbol Parse"); } ProfEnd(); - tp_for_parallel_prof(tp, tp_arena, total_symbol_input_count, lnk_parse_cv_symbols_task, &(LNK_ParseCVSymbolsTaskData){ .inputs = symbol_inputs }, "Symbol Parse"); + // sort objs based on type: PCH, /Zi (external), /Z7 (internal) + input.debug_p_indices.v = push_array(tp_arena->v[0], U32, obj_count); + input.ext_obj_indices.v = push_array(tp_arena->v[0], U32, obj_count); + input.int_obj_indices.v = push_array(tp_arena->v[0], U32, obj_count); + for EachIndex(obj_idx, obj_count) { + CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; + CV_DebugT *debug_p = &input.debug_p_arr[obj_idx]; + U32Array *arr_ptr; - // TODO: do we rely on this behaviour? - // - // :zero_out_symbol_sub_section - ProfBegin("Zero-out Symbols Sub-sections"); - for (U64 i = 0; i < obj_count; ++i) { - CV_DebugS *debug_s = &sorted_debug_s_arr[i]; - String8List *symbols_ptr = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); - MemoryZeroStruct(symbols_ptr); + if (debug_t->count && debug_p->count) { + lnk_error_obj(LNK_Warning_MultipleDebugTAndDebugP, obj_arr[obj_idx], "multiple sections with debug types detected, obj must have either .debug$T or .debug$P (using .debug$T for type server)"); + } + + if (debug_p->count > 0) { arr_ptr = &input.debug_p_indices; } + else if (cv_debug_t_is_type_server_ref(debug_t)) { arr_ptr = &input.ext_obj_indices; } + else { arr_ptr = &input.int_obj_indices; } + arr_ptr->v[arr_ptr->count++] = obj_idx; } - ProfEnd(); - ProfEnd(); - - CV_SymbolListArray *internal_parsed_symbols = parsed_symbols; - CV_SymbolListArray *external_parsed_symbols = parsed_symbols + internal_count; - LNK_CodeViewSymbolsInput *internal_symbol_inputs = symbol_inputs; - LNK_CodeViewSymbolsInput *external_symbol_inputs = symbol_inputs + internal_count; - - LNK_PchInfo *pch_arr = lnk_setup_pch(tp_arena->v[0], - internal_count, - internal_obj_arr, - internal_debug_t_arr, - internal_debug_p_arr, - internal_parsed_symbols, - alt_pch_dirs); - - CV_DebugT *merged_debug_t_p_arr = lnk_merge_debug_t_and_debug_p(tp_arena->v[0], internal_count, internal_debug_t_arr, internal_debug_p_arr); - - ProfBegin("Analyze & Read External Type Server Files"); - String8Array ts_path_arr; - Rng1U64 **external_ti_ranges; - CV_DebugT **external_leaves; - U64 *obj_to_ts_idx_arr = push_array_no_zero(tp_arena->v[0], U64, external_count + 1); - U64List *ts_to_obj_arr = push_array(tp_arena->v[0], U64List, external_count + 1); + ProfScope("Set up type servers") { - HashTable *type_server_path_ht = hash_table_init(scratch.arena, 256); - HashTable *ignored_path_ht = hash_table_init(scratch.arena, 256); - CV_TypeServerInfoList ts_info_list = {0}; + input.obj_to_ts = push_array(tp_arena->v[0], U64, input.count); + LNK_TypeServerList ts_list = {0}; + HashTable *ts_ht = hash_table_init(scratch.arena, 256); - // push null - CV_TypeServerInfoNode *null_ts_info = push_array(scratch.arena, CV_TypeServerInfoNode, 1); - null_ts_info->data.name = str8_lit("\0"); - SLLQueuePush(ts_info_list.first, ts_info_list.last, null_ts_info); - ++ts_info_list.count; + // push null so unopened type servers are resolved to this type server + LNK_TypeServerNode *null_ts = push_array(scratch.arena, LNK_TypeServerNode, 1); + SLLQueuePush(ts_list.first, ts_list.last, null_ts); + ts_list.count += 1; + null_ts->v.ts_path = str8_lit(""); + hash_table_push_path_raw(scratch.arena, ts_ht, str8_lit(""), null_ts); - for (U64 obj_idx = 0; obj_idx < external_count; ++obj_idx) { - // first leaf always type server - CV_DebugT debug_t = external_debug_t_arr[obj_idx]; - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); - CV_TypeServerInfo ts = cv_type_server_info_from_leaf(leaf); + for EachIndex(i, input.ext_obj_indices.count) { + // first leaf is always type server + U64 obj_idx = input.ext_obj_indices.v[i]; + CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); + CV_TypeServerInfo ts_info = cv_type_server_info_from_leaf(leaf); + String8 ts_path = lnk_find_first_file(scratch.arena, lib_dir_list, ts_info.name); - // search disk for type server - String8 type_server_path = lnk_find_first_file(scratch.arena, lib_dir_list, ts.name); - - // report no match - B32 do_debug_info_discard = 0; - if (type_server_path.size == 0) { - if (!hash_table_search_path(ignored_path_ht, ts.name)) { - hash_table_push_string_u64(scratch.arena, ignored_path_ht, ts.name, 0); - lnk_error_obj(LNK_Warning_MissingExternalTypeServer, obj_arr[obj_idx], "unable to open external type server %S", ts.name); - } - do_debug_info_discard = 1; + // insert new type server + LNK_TypeServer *ts = hash_table_search_path_raw(ts_ht, ts_path); + if (ts == 0) { + LNK_TypeServerNode *n = push_array(scratch.arena, LNK_TypeServerNode, 1); + SLLQueuePush(ts_list.first, ts_list.last, n); + ts_list.count += 1; + ts = &n->v; + ts->ts_info = ts_info; + ts->ts_idx = ts_ht->count; + ts->ts_path = push_str8_copy(tp_arena->v[0], ts_path); + hash_table_push_path_raw(scratch.arena, ts_ht, ts->ts_path, ts); } - - // external type server is missing, discard parts of debug info that need types - if (do_debug_info_discard) { - lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, obj_idx); + + // signature check + if ( ! MemoryMatchStruct(&ts_info.sig, &ts->ts_info.sig)) { + lnk_error_obj(LNK_Error_ExternalTypeServerConflict, + obj_arr[obj_idx], + "type server signature conflicts with type server from '%S'", + obj_arr[ts->obj_indices.first->data]->path); continue; } - { - struct HT_Value { - CV_TypeServerInfo ts; - LNK_Obj *obj; - U64 ts_idx; - }; + // type server -> obj + u64_list_push(tp_arena->v[0], &ts->obj_indices, obj_idx); - // was this type server queued? - BucketNode *is_path_queued = hash_table_search_path(type_server_path_ht, type_server_path); - if (is_path_queued) { - struct HT_Value *present = is_path_queued->v.value_raw; - - // make sure type servers sigs match - if (MemoryMatchStruct(&ts.sig, &present->ts.sig)) { - // wire obj to type server data - obj_to_ts_idx_arr[obj_idx] = present->ts_idx; + // obj -> type server + input.obj_to_ts[obj_idx] = ts->ts_idx; + } - // wire type server to obj - u64_list_push(tp_arena->v[0], &ts_to_obj_arr[present->ts_idx], obj_idx); - } else { - lnk_error_obj(LNK_Error_ExternalTypeServerConflict, - obj_arr[obj_idx], - "external type server signature conflicts with type server loaded from '%S'", - present->obj->path); - } - } else { - U64 ts_idx = ts_info_list.count; + // list -> array + LNK_TypeServerArray ts_arr = { .v = push_array(tp_arena->v[0], LNK_TypeServer, ts_list.count) }; + for EachNode(n, LNK_TypeServerNode, ts_list.first) { ts_arr.v[ts_arr.count++] = n->v; } - // when we search matches on disk we store path on scratch, - // make path copy in case we need it for error reporting - type_server_path = push_str8_copy(tp_arena->v[0], type_server_path); + // extend arrays to include type servers + if (ts_arr.count) { + LNK_CodeViewInput prev = input; - // fill out type server info we read from obj - CV_TypeServerInfoNode *ts_info_node = push_array(scratch.arena, CV_TypeServerInfoNode, 1); - ts_info_node->data = ts; - ts_info_node->data.name = type_server_path; + input.count += ts_arr.count; + input.obj_arr = push_array(tp_arena->v[0], LNK_Obj *, input.count); + input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, input.count); + input.debug_p_arr = push_array(tp_arena->v[0], CV_DebugT, input.count); + input.debug_t_arr = push_array(tp_arena->v[0], CV_DebugT, input.count); + input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, input.count); + input.parsed_symbols = push_array(tp_arena->v[0], CV_SymbolListArray, input.count); + input.obj_to_ts = push_array(tp_arena->v[0], U64, input.count); - // push to type server info list - SLLQueuePush(ts_info_list.first, ts_info_list.last, ts_info_node); - ts_info_list.count += 1; - - // wire obj to type server - obj_to_ts_idx_arr[obj_idx] = ts_idx; + MemoryCopyTyped(input.obj_arr, prev.obj_arr, prev.count); + MemoryCopyTyped(input.debug_s_arr, prev.debug_s_arr, prev.count); + MemoryCopyTyped(input.debug_p_arr, prev.debug_p_arr, prev.count); + MemoryCopyTyped(input.debug_t_arr, prev.debug_t_arr, prev.count); + MemoryCopyTyped(input.parsed_symbols, prev.parsed_symbols, prev.count); + MemoryCopyTyped(input.obj_to_ts, prev.obj_to_ts, prev.count); - // wire type server to obj - u64_list_push(tp_arena->v[0], &ts_to_obj_arr[ts_idx], obj_idx); - - // fill out value - struct HT_Value *value = push_array(scratch.arena, struct HT_Value, 1); - value->ts = ts; - value->obj = obj_arr[obj_idx]; - value->ts_idx = ts_idx; - - // update hash table - hash_table_push_path_raw(scratch.arena, type_server_path_ht, type_server_path, value); - } + input.ts_obj_range = r1u64(prev.count, input.count); + + // alloc dummy objs with for each loaded type server + for EachIndex(i, ts_arr.count) { + LNK_Obj *ts_obj = push_array(tp_arena->v[0], LNK_Obj, ts_arr.count); + ts_obj->path = ts_arr.v[i].ts_path; + input.obj_arr[prev.count + i] = ts_obj; + } + + // make type server indices + input.type_server_indices.count = ts_arr.count; + input.type_server_indices.v = push_array(tp_arena->v[0], U32, ts_arr.count); + for EachIndex(i, ts_arr.count) { input.type_server_indices.v[i] = prev.count + i; } + } + + input.ts_arr = ts_arr; + input.is_type_server_discarded = push_array(tp_arena->v[0], B32, input.ts_arr.count); + tp_for_parallel_prof(tp, tp_arena, input.ts_arr.count, lnk_read_type_servers_task, &input, "read type servers"); + + // fixup null type server + input.is_type_server_discarded[0] = 0; + + // report bad type servers + String8List unopen_type_server_list = {0}; + for EachIndex(ts_idx, ts_arr.count) { + if ( ! input.is_type_server_discarded[ts_idx]) { continue; } + str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t%S\n", ts_arr.v[ts_idx].ts_path); + str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\tDependent obj(s):\n"); + for EachNode(n, U64Node, input.ts_arr.v[ts_idx].obj_indices.first) { + str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\t\t%S\n", obj_arr[n->data]->path); + } + } + if (unopen_type_server_list.node_count) { + String8List error_msg_list = {0}; + str8_list_pushf(scratch.arena, &error_msg_list, "unable to open external type server(s):\n"); + str8_list_concat_in_place(&error_msg_list, &unopen_type_server_list); + lnk_error(LNK_Error_UnableToOpenTypeServer, "%S", str8_list_join(scratch.arena, &error_msg_list, 0)); + } + } + + ProfBegin("Set up PCH indirection"); + { + // hash_table + String8 work_dir = os_get_current_path(scratch.arena); + HashTable *debug_p_ht = hash_table_init(scratch.arena, obj_count); + for EachIndex(i, input.debug_p_indices.count) { + U64 obj_idx = input.debug_p_indices.v[i]; + String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_arr[obj_idx]->path, work_dir); + if (hash_table_search_path(debug_p_ht, obj_path)) { + lnk_error_obj(LNK_Warning_DuplicateObjPath, obj_arr[obj_idx], "duplicate obj path %S", obj_path); + } else { + hash_table_push_path_u64(scratch.arena, debug_p_ht, obj_path, obj_idx); } } - // type server info list -> array - ts_path_arr.count = ts_info_list.count; - ts_path_arr.v = push_array(tp_arena->v[0], String8, ts_info_list.count); - CV_TypeServerInfo *ts_info_arr = push_array(scratch.arena, CV_TypeServerInfo, ts_info_list.count); - { - U64 idx = 0; - for (CV_TypeServerInfoNode *n = ts_info_list.first; n != 0; n = n->next, ++idx) { - ts_path_arr.v[idx] = n->data.name; - ts_info_arr[idx] = n->data; + for EachIndex(i, input.int_obj_indices.count) { + U64 obj_idx = input.int_obj_indices.v[i]; + LNK_Obj *obj = obj_arr[obj_idx]; + CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; + + // skip non-PCH objs + if ( ! cv_debug_t_is_pch(debug_t)) { continue; } + + // get PCH ref info + CV_PrecompInfo precomp = cv_precomp_info_from_leaf(cv_debug_t_get_leaf(debug_t, 0)); + + // find PCH obj + String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir); + U64 debug_p_obj_idx = max_U64; + if (!hash_table_search_path_u64(debug_p_ht, obj_path, &debug_p_obj_idx)) { + // try alternative directory for the PCH + String8 obj_name = str8_skip_last_slash(obj_path); + for EachNode(alt_dir_n, String8Node, alt_pch_dirs.first) { + String8 alt_obj_path = str8f(scratch.arena, "%S/%S", alt_dir_n->string, obj_name); + if (hash_table_search_path_u64(debug_p_ht, alt_obj_path, &debug_p_obj_idx)) { break; } + } + if (debug_p_obj_idx == max_U64) { + lnk_error_obj(LNK_Error_PrecompObjNotFound, obj, "LF_PRECOMP references non-existent obj %S", obj_path); + lnk_exit(LNK_Error_PrecompObjNotFound); + } } + + // get PCH leaf data + CV_DebugT *debug_p = &input.debug_p_arr[debug_p_obj_idx]; + + // error check LF_PRECOMP + if (precomp.start_index > CV_MinComplexTypeIndex) { lnk_error_obj(LNK_Warning_AtypicalStartIndex, obj, "atypical start index 0x%x in LF_PRECOMP", precomp.start_index); } + if (precomp.start_index < CV_MinComplexTypeIndex) { lnk_error_obj(LNK_Error_InvalidStartIndex, obj, "invalid start index 0x%x in LF_PRECOMP; must be >= 0x%x", precomp.start_index, CV_MinComplexTypeIndex); continue; } + if (precomp.leaf_count > debug_p->count) { lnk_error_obj(LNK_Error_InvalidPrecompLeafCount, obj, "leaf count %u LF_PRECOMP exceeds leaf count %u in .debug$P in %S", precomp.leaf_count, debug_p->count, obj_arr[debug_p_obj_idx]->path); continue; } + + // get LF_PRECOMP + CV_Leaf endprecomp_leaf = cv_debug_t_get_leaf(debug_p, precomp.leaf_count-1); + CV_LeafEndPreComp *endprecomp = str8_deserial_get_raw_ptr(endprecomp_leaf.data, 0, sizeof(*endprecomp)); + + // error check LF_ENDPRECOMP + if (endprecomp_leaf.kind != CV_LeafKind_ENDPRECOMP) { lnk_error_obj(LNK_Error_EndprecompNotFound, obj, "missing LF_ENDPRECOMP [0x%x] in %S", precomp.leaf_count, obj_arr[debug_p_obj_idx]->path); continue; } + if (endprecomp_leaf.data.size != sizeof(CV_LeafEndPreComp)) { lnk_error_obj(LNK_Error_IllData, obj, "invalid size 0x%x for LF_ENDPRECOMP", endprecomp_leaf.data.size); continue; } + if (endprecomp->sig != precomp.sig) { lnk_error_obj(LNK_Error_PrecompSigMismatch, obj, "signature mismatch between LF_PRECOMP(0x%x) and LF_ENDPRECOMP(0x%x); precomp obj %S", precomp.sig, endprecomp->sig, obj_arr[debug_p_obj_idx]->path); continue; } + + { // PCH and OBJ signatures must match + String8List symbols = cv_sub_section_from_debug_s(input.debug_s_arr[debug_p_obj_idx], CV_C13SubSectionKind_Symbols); + CV_SymbolList symbol_list = {0}; + cv_parse_symbol_sub_section_capped(scratch.arena, &symbol_list, 0, str8_list_first(&symbols), CV_SymbolAlign, 1); + CV_Symbol symbol = symbol_list.count ? symbol_list.first->data : (CV_Symbol){0}; + if (cv_is_obj_info(symbol)) { + CV_ObjInfo obj_info = cv_obj_info_from_symbol(symbol); + if (obj_info.sig != 0 && obj_info.sig != precomp.sig) { + lnk_error_obj(LNK_Error_PrecompSigMismatch, obj, "signature mismatch between LF_PRECOMP(0x%X) and S_OBJNAME(0x%X) in %S", precomp.sig, obj_info.sig, obj_arr[debug_p_obj_idx]->path); + continue; + } + } else { + lnk_error_obj(LNK_Error_PrecompSigMismatch, obj, "missing S_OBJNAME, unable to validate PCH signature"); + continue; + } + } + + for (U64 i = 1; i < CV_TypeIndexSource_COUNT; i += 1) { debug_t->pch_ti_range[i] = r1u64(precomp.start_index, precomp.start_index + precomp.leaf_count); } + debug_t->pch_obj_idx = debug_p_obj_idx; + + // remove CV_LeafKind_PRECOMP + debug_t->count -= 1; + debug_t->offsets += 1; } - // read type servers from disk in parallel - { - ProfBegin("Read External Type Servers"); - String8Array msf_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, 0, ts_path_arr); - ProfEnd(); - - MSF_Parsed **msf_parse_arr = lnk_msf_parsed_from_data_parallel(tp_arena, tp, msf_data_arr); - - ProfBegin("Error check type servers"); - for (U64 ts_idx = 0; ts_idx < msf_data_arr.count; ++ts_idx) { - MSF_Parsed *msf_parse = msf_parse_arr[ts_idx]; - - B32 do_debug_info_discard = 0; - - if (!msf_parse) { - do_debug_info_discard = 1; - } else { - PDB_InfoParse info_parse = {0}; - pdb_info_parse_from_data(msf_parse->streams[PDB_FixedStream_Info], &info_parse); - if (!MemoryMatchStruct(&info_parse.guid, &ts_info_arr[ts_idx].sig)) { - Temp scratch = scratch_begin(0,0); - String8 expected_sig_str = string_from_guid(scratch.arena, ts_info_arr[ts_idx].sig); - String8 on_disk_sig_str = string_from_guid(scratch.arena, info_parse.guid); - lnk_error(LNK_Warning_MismatchedTypeServerSignature, "%S: signature mismatch in type server read from disk, expected %S, got %S", - ts_info_arr[ts_idx].name, expected_sig_str, on_disk_sig_str); - scratch_end(scratch); - - do_debug_info_discard = 1; - } - } - - if (do_debug_info_discard) { - U64List obj_idx_list = ts_to_obj_arr[ts_idx]; - for (U64Node *obj_idx_n = obj_idx_list.first; obj_idx_n != 0; obj_idx_n = obj_idx_n->next) { - lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, obj_idx_n->data); - } + // remove CV_LeafKind_ENDPRECOMP from .debug$P + for EachIndex(i, input.debug_p_indices.count) { + U64 debug_p_idx = input.debug_p_indices.v[i]; + CV_DebugT *debug_p = &input.debug_p_arr[debug_p_idx]; + for EachIndex(i, debug_p->count) { + U64 lf_idx = debug_p->count - (i + 1); + CV_LeafHeader *lf = cv_debug_t_get_leaf_header(debug_p, lf_idx); + if (lf->kind == CV_LeafKind_ENDPRECOMP) { + memory_write16(&lf->kind, CV_LeafKind_NOTYPE); + memory_write16(&lf->size, 0); + break; } } - ProfEnd(); - - ProfBeginDynamic("Open External Type Servers [Count %llu]", ts_path_arr.count); - LNK_GetExternalLeavesTask task = {0}; - task.ts_info_arr = ts_info_arr; - task.msf_parse_arr = msf_parse_arr; - task.external_ti_ranges = push_array_no_zero(tp_arena->v[0], Rng1U64 *, msf_data_arr.count); - task.external_leaves = push_array_no_zero(tp_arena->v[0], CV_DebugT *, msf_data_arr.count); - task.is_corrupted = push_array_no_zero(scratch.arena, B8, msf_data_arr.count); - tp_for_parallel(tp, tp_arena, msf_data_arr.count, lnk_get_external_leaves_task, &task); - ProfEnd(); - - String8List unopen_type_server_list = {0}; - - // discard debug info that depends on the missing type server - for (U64 ts_idx = 1; ts_idx < msf_data_arr.count; ++ts_idx) { - if (task.is_corrupted[ts_idx]) { - U64List obj_idx_list = ts_to_obj_arr[ts_idx]; - for (U64Node *node = obj_idx_list.first; node != 0; node = node->next) { - lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, node->data); - } - } - } - - // format error - for (U64 ts_idx = 1; ts_idx < msf_data_arr.count; ++ts_idx) { - if (task.is_corrupted[ts_idx]) { - U64List obj_idx_list = ts_to_obj_arr[ts_idx]; - str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t%S\n", ts_path_arr.v[ts_idx]); - str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\tDependent obj(s):\n"); - for (U64Node *obj_idx_node = obj_idx_list.first; obj_idx_node != 0; obj_idx_node = obj_idx_node->next) { - String8 obj_path = external_obj_arr[obj_idx_node->data]->path; - str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\t\t%S\n", obj_path); - } - } - } - if (unopen_type_server_list.node_count) { - String8List error_msg_list = { 0 }; - str8_list_pushf(scratch.arena, &error_msg_list, "unable to open external type server(s):\n"); - str8_list_concat_in_place(&error_msg_list, &unopen_type_server_list); - String8 error_msg = str8_list_join(scratch.arena, &error_msg_list, 0); - lnk_error(LNK_Error_UnableToOpenTypeServer, "%S", error_msg); - } - - // output - external_ti_ranges = task.external_ti_ranges; - external_leaves = task.external_leaves; } } ProfEnd(); - // fill out result - LNK_CodeViewInput cv = {0}; - cv.count = obj_count; - cv.internal_count = internal_count; - cv.external_count = external_count; - cv.type_server_count = ts_path_arr.count; - cv.type_server_path_arr = ts_path_arr.v; - cv.ts_to_obj_arr = ts_to_obj_arr; - cv.obj_arr = sorted_obj_arr; - cv.pch_arr = pch_arr; - cv.debug_s_arr = sorted_debug_s_arr; - cv.debug_p_arr = sorted_debug_p_arr; - cv.debug_t_arr = sorted_debug_t_arr; - cv.merged_debug_t_p_arr = merged_debug_t_p_arr; - cv.total_symbol_input_count = total_symbol_input_count; - cv.symbol_inputs = symbol_inputs; - cv.parsed_symbols = parsed_symbols; - cv.internal_obj_arr = internal_obj_arr; - cv.external_obj_arr = external_obj_arr; - cv.internal_debug_s_arr = internal_debug_s_arr; - cv.external_debug_s_arr = external_debug_s_arr; - cv.internal_debug_t_arr = internal_debug_t_arr; - cv.external_debug_t_arr = external_debug_t_arr; - cv.internal_debug_p_arr = internal_debug_p_arr; - cv.external_debug_p_arr = external_debug_p_arr; - cv.internal_total_symbol_input_count = internal_total_symbol_input_count; - cv.internal_symbol_inputs = internal_symbol_inputs; - cv.internal_parsed_symbols = internal_parsed_symbols; - cv.external_total_symbol_input_count = external_total_symbol_input_count; - cv.external_symbol_inputs = external_symbol_inputs; - cv.external_parsed_symbols = external_parsed_symbols; - cv.external_ti_ranges = external_ti_ranges; - cv.external_leaves = external_leaves; - cv.external_obj_to_ts_idx_arr = obj_to_ts_idx_arr; - cv.external_obj_range = rng_1u64(internal_count, internal_count + external_count); - + // PCH and /Z7 objs have default min type index set to CV_MinComplexTypeIndex + // but type servers can bump up the lower bound. In practice nobody does this. + // However, to cover all our bases loop through type servers and compute + // max lower bound. + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { input.min_type_indices[ti_source] = CV_MinComplexTypeIndex; } + for EachInRange(ts_idx, input.ts_obj_range) { + CV_DebugT *debug_t = &input.debug_t_arr[ts_idx]; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + input.min_type_indices[ti_source] = Max(input.min_type_indices[ti_source], debug_t->ti_ranges[ti_source].min); + } + } + + // :zero_out_symbol_sub_section + ProfBegin("Zero-out Symbols Sub-sections"); + for EachIndex(i, obj_count) { MemoryZeroStruct(cv_sub_section_ptr_from_debug_s(&input.debug_s_arr[i], CV_C13SubSectionKind_Symbols)); } + ProfEnd(); + scratch_end(scratch); ProfEnd(); - return cv; + return input; } internal LNK_LeafRef -lnk_leaf_ref(U32 enc_loc_idx, U32 enc_leaf_idx) +lnk_leaf_ref_from_ti(LNK_CodeViewInput *input, U32 obj_idx, CV_TypeIndexSource source, CV_TypeIndex ti) { - LNK_LeafRef ref; - ref.enc_loc_idx = enc_loc_idx; - ref.enc_leaf_idx = enc_leaf_idx; - return ref; -} - -internal LNK_LeafRef -lnk_obj_leaf_ref(U32 obj_idx, U32 leaf_idx) -{ - return lnk_leaf_ref(obj_idx, leaf_idx); -} - -internal LNK_LeafRef -lnk_ts_leaf_ref(CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx) -{ - ts_idx |= LNK_LeafRefFlag_LocIdxExternal; - - if (ti_source == CV_TypeIndexSource_IPI) { - leaf_idx |= LNK_LeafRefFlag_LeafIdxIPI; - } - - return lnk_leaf_ref(ts_idx, leaf_idx); -} - -internal int -lnk_leaf_ref_is_before(void *raw_a, void *raw_b) -{ - LNK_LeafRef **a = raw_a; - LNK_LeafRef **b = raw_b; - int is_before; - if ((*a)->enc_loc_idx == (*b)->enc_loc_idx) { - is_before = (*a)->enc_leaf_idx < (*b)->enc_leaf_idx; + LNK_LeafRef leaf_ref; + CV_DebugT *debug_t = &input->debug_t_arr[obj_idx]; + if (contains_1u64(debug_t->pch_ti_range[source], ti)) { + leaf_ref = (LNK_LeafRef){ + .obj_idx = debug_t->pch_obj_idx, + .leaf_idx = cv_leaf_idx_from_ti(&input->debug_t_arr[debug_t->pch_obj_idx], source, ti) + }; } else { - is_before = (*a)->enc_loc_idx < (*b)->enc_loc_idx; + U64 ts_idx = input->obj_to_ts[obj_idx]; + if (ts_idx != 0) { + U64 ts_obj_idx = input->ts_obj_range.min + ts_idx; + CV_DebugT *ts_debug_t = &input->debug_t_arr[ts_obj_idx]; + leaf_ref = (LNK_LeafRef){ + .obj_idx = ts_obj_idx, + .leaf_idx = cv_leaf_idx_from_ti(ts_debug_t, source, ti) + }; + } else { + leaf_ref = (LNK_LeafRef){ + .obj_idx = obj_idx, + .leaf_idx = cv_leaf_idx_from_ti(debug_t, source, ti) + }; + } } - return is_before; -} - -internal LNK_LeafLocType -lnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref) -{ - if (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) { - return LNK_LeafLocType_External; - } - return LNK_LeafLocType_Internal; + return leaf_ref; } internal int lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b) { int cmp = 0; - if (a.enc_loc_idx < b.enc_loc_idx) { + if (a.obj_idx < b.obj_idx) { cmp = -1; - } else if (a.enc_loc_idx > b.enc_loc_idx) { + } else if (a.obj_idx > b.obj_idx) { cmp = +1; } else { - if (a.enc_leaf_idx < b.enc_leaf_idx) { + if (a.leaf_idx < b.leaf_idx) { cmp = -1; - } else if (a.enc_leaf_idx > b.enc_leaf_idx) { + } else if (a.leaf_idx > b.leaf_idx) { cmp = +1; } } return cmp; } -internal LNK_LeafLocType -lnk_loc_type_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx) +internal int +lnk_leaf_ref_is_before(void *raw_a, void *raw_b) { - if (input->external_obj_range.min <= obj_idx && obj_idx < input->external_obj_range.max) { - return LNK_LeafLocType_External; - } - return LNK_LeafLocType_Internal; -} - -internal U64 -lnk_loc_idx_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx) -{ - if (input->external_obj_range.min <= obj_idx && obj_idx < input->external_obj_range.max) { - return input->external_obj_to_ts_idx_arr[obj_idx - input->external_obj_range.min]; - } - return obj_idx; -} - -internal CV_TypeIndex -lnk_ti_lo_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) -{ - CV_TypeIndex ti_lo; - - LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref); - switch (loc_type) { - case LNK_LeafLocType_Internal: { - ti_lo = CV_MinComplexTypeIndex; - } break; - case LNK_LeafLocType_External: { - U64 ts_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; - CV_TypeIndexSource ti_source = (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LeafIdxIPI) ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI; - ti_lo = input->external_ti_ranges[ts_idx][ti_source].min; - } break; - default: ti_lo = 0; break; - } - - return ti_lo; -} - -internal CV_TypeIndex -lnk_ti_lo_from_loc(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, U64 loc_idx, CV_TypeIndexSource ti_source) -{ - CV_TypeIndex ti_lo = 0; - if (loc_type == LNK_LeafLocType_Internal) { - ti_lo = CV_MinComplexTypeIndex; - } else if (loc_type == LNK_LeafLocType_External) { - ti_lo = input->external_ti_ranges[loc_idx][ti_source].min; - } - return ti_lo; -} - -internal String8 -lnk_data_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) -{ - String8 data; - - LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref); - switch (loc_type) { - case LNK_LeafLocType_Internal: { - U32 obj_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; - U32 leaf_idx = leaf_ref.enc_leaf_idx; - CV_DebugT debug_t = input->merged_debug_t_p_arr[obj_idx]; - data = cv_debug_t_get_raw_leaf(debug_t, leaf_idx); - } break; - - case LNK_LeafLocType_External: { - U64 ts_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; - U64 leaf_idx = leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI; - CV_TypeIndexSource ti_source = leaf_ref.enc_leaf_idx & LNK_LeafRefFlag_LeafIdxIPI ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI; - CV_DebugT debug_t = input->external_leaves[ts_idx][ti_source]; - data = cv_debug_t_get_raw_leaf(debug_t, leaf_idx); - } break; - - default: data = str8(0,0); break; - } - - return data; -} - -internal CV_TypeIndex -lnk_type_index_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) -{ - CV_TypeIndex type_index = 0; - LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref); - switch (loc_type) { - case LNK_LeafLocType_Internal: { - LNK_PchInfo pch_info = input->pch_arr[leaf_ref.enc_loc_idx]; - type_index = pch_info.ti_hi + leaf_ref.enc_leaf_idx; - } break; - case LNK_LeafLocType_External: { - CV_TypeIndex lo = lnk_ti_lo_from_leaf_ref(input, leaf_ref); - type_index = lo + leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI; - } break; - default: InvalidPath; - } - return type_index; -} - -internal U64 -lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref) -{ - LNK_LeafLocType loc_type; - CV_TypeIndexSource ti_source; - if (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) { - loc_type = LNK_LeafLocType_External; - ti_source = (leaf_ref.enc_leaf_idx & LNK_LeafRefFlag_LeafIdxIPI) ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI; - } else { - loc_type = LNK_LeafLocType_Internal; - ti_source = CV_TypeIndexSource_TPI; - } - - U32 loc_idx = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; - U32 leaf_idx = leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI; - U64 hash = hashes->v[loc_type][loc_idx][ti_source][leaf_idx]; - - return hash; -} - -internal LNK_LeafRef -lnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput *input, - LNK_LeafLocType loc_type, - CV_TypeIndexSource ti_source, - U64 loc_idx, - CV_TypeIndex obj_ti) -{ - LNK_LeafRef leaf_ref; - - switch (loc_type) { - case LNK_LeafLocType_External: { - U64 ts_idx = loc_idx; - - CV_TypeIndex ti_lo = input->external_ti_ranges[ts_idx][ti_source].min; - Assert(obj_ti >= ti_lo); - - // encode leaf index for type server - leaf_ref = lnk_ts_leaf_ref(ti_source, ts_idx, obj_ti - ti_lo); - } break; - - case LNK_LeafLocType_Internal: { - U64 obj_idx = loc_idx; - - LNK_PchInfo pch = input->pch_arr[obj_idx]; - if (obj_ti < pch.ti_lo) { - CV_TypeIndex ti_lo = CV_MinComplexTypeIndex; - Assert(obj_ti >= ti_lo); - leaf_ref = lnk_obj_leaf_ref(obj_idx, obj_ti - ti_lo); - } - // PCH indirection - else if (obj_ti < pch.ti_hi) { - // we don't support nested precompiled types - Assert(input->pch_arr[pch.debug_p_obj_idx].debug_p_obj_idx == /* null_obj: */ 0); - Assert(input->pch_arr[pch.debug_p_obj_idx].ti_lo == input->pch_arr[pch.debug_p_obj_idx].ti_hi); - leaf_ref = lnk_obj_leaf_ref(pch.debug_p_obj_idx, obj_ti - pch.ti_lo); - } else { - leaf_ref = lnk_obj_leaf_ref(obj_idx, pch.ti_lo + (obj_ti - pch.ti_hi) - CV_MinComplexTypeIndex); - } - } break; - - default: leaf_ref = lnk_leaf_ref(0, 0); break; - } - - return leaf_ref; + return lnk_leaf_ref_compare(**(LNK_LeafRef **)raw_a, **(LNK_LeafRef **)raw_b) < 0; } internal B32 -lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b) +lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef a, LNK_LeafRef b) { - B32 are_same = 0; - - U64 a_hash = lnk_hash_from_leaf_ref(hashes, a); - U64 b_hash = lnk_hash_from_leaf_ref(hashes, b); - + B32 is_match = 0; + CV_DebugT *a_debug_t = &input->debug_t_arr[a.obj_idx]; + CV_DebugT *b_debug_t = &input->debug_t_arr[b.obj_idx]; + U64 a_hash = input->debug_h_arr[a.obj_idx].v[a.leaf_idx]; + U64 b_hash = input->debug_h_arr[b.obj_idx].v[b.leaf_idx]; if (a_hash == b_hash) { - CV_Leaf a_leaf; - cv_read_leaf(lnk_data_from_leaf_ref(input, a), 0, 1, &a_leaf); - - CV_Leaf b_leaf; - cv_read_leaf(lnk_data_from_leaf_ref(input, b), 0, 1, &b_leaf); - + CV_Leaf a_leaf = cv_debug_t_get_leaf(a_debug_t, a.leaf_idx); + CV_Leaf b_leaf = cv_debug_t_get_leaf(b_debug_t, b.leaf_idx); Assert(a_leaf.kind == b_leaf.kind); - -#if 0 - { - Temp scratch = scratch_begin(0,0); - CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(scratch.arena, a_leaf.kind, a_leaf.data); - String8Array a_raw_data_arr = cv_get_data_around_type_indices(scratch.arena, ti_info_list, a_leaf.data); - String8Array b_raw_data_arr = cv_get_data_around_type_indices(scratch.arena, ti_info_list, b_leaf.data); - for (U64 i = 0; i < a_raw_data_arr.count; ++i) { - String8 a_chunk = a_raw_data_arr.v[i]; - String8 b_chunk = b_raw_data_arr.v[i]; - Assert(str8_match(a_chunk, b_chunk, 0)); - } - scratch_end(scratch); - } -#endif - - are_same = 1; + is_match = 1; } - - return are_same; + return is_match; } -#if 0 -internal B32 -lnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b) -{ - B32 are_equal = 0; - - U64 a_hash = lnk_hash_from_leaf_ref(hashes, a); - U64 b_hash = lnk_hash_from_leaf_ref(hashes, b); - - if (a_hash == b_hash) { - String8 a_raw_leaf = lnk_data_from_leaf_ref(input, a); - String8 b_raw_leaf = lnk_data_from_leaf_ref(input, b); - - CV_LeafHeader *a_header = (CV_LeafHeader *) a_raw_leaf.str; - CV_LeafHeader *b_header = (CV_LeafHeader *) b_raw_leaf.str; - - if (a_header->kind == b_header->kind && a_header->size == b_header->size) { - CV_Leaf a_leaf = cv_leaf_from_string(a_raw_leaf); - CV_Leaf b_leaf = cv_leaf_from_string(b_raw_leaf); - - Temp temp = temp_begin(arena); - - CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, a_leaf.kind, a_leaf.data); - String8Array a_raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, a_leaf.data); - String8Array b_raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, b_leaf.data); - - are_equal = 1; - - for (U64 i = 0; i < a_raw_data_arr.count; ++i) { - String8 a_chunk = a_raw_data_arr.v[i]; - String8 b_chunk = b_raw_data_arr.v[i]; - Assert(a_chunk.size == b_chunk.size); - are_equal = str8_match(a_chunk, b_chunk, 0); - if (!are_equal) { - goto skip_type_index_compare; - } - } - - CV_TypeIndex a_ti_lo = lnk_ti_lo_from_leaf_ref(input, a); - CV_TypeIndex b_ti_lo = lnk_ti_lo_from_leaf_ref(input, b); - AssertAlways(a_ti_lo == b_ti_lo); - - for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) { - CV_TypeIndex *a_ti_ptr = (CV_TypeIndex *) (a_leaf.data.str + ti_info->offset); - CV_TypeIndex *b_ti_ptr = (CV_TypeIndex *)(b_leaf.data.str + ti_info->offset); - - if (*a_ti_ptr >= a_ti_lo && *b_ti_ptr >= b_ti_lo) { - LNK_LeafLocType a_loc_type = (a.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) >> 31; - LNK_LeafLocType b_loc_type = (b.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) >> 31; - - U64 a_loc_idx = a.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; - U64 b_loc_idx = b.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; - - LNK_LeafRef a_sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, a_loc_type, ti_info->source, a_loc_idx, *a_ti_ptr); - LNK_LeafRef b_sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, b_loc_type, ti_info->source, b_loc_idx, *b_ti_ptr); - - are_equal = lnk_match_leaf_ref_deep(arena, input, hashes, a_sub_leaf_ref, b_sub_leaf_ref); - if (!are_equal) { - break; - } - } - // compare simple leaves - else { - are_equal = *a_ti_ptr == *b_ti_ptr; - if (!are_equal) { - break; - } - } - } - -skip_type_index_compare:; - temp_end(temp); - } - } - - return are_equal; -} -#endif - internal U64 -lnk_hash_cv_leaf(LNK_CodeViewInput *input, - LNK_LeafHashes *hashes, - LNK_LeafLocType loc_type, - U32 loc_idx, - Rng1U64 *ti_ranges, - CV_TypeIndex curr_ti, - CV_Leaf leaf, - CV_TypeIndexInfoList ti_info_list) +lnk_hash_cv_leaf(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInfoList ti_info_list, B32 discard_cycles) { + CV_DebugT *debug_t = &input->debug_t_arr[leaf_ref.obj_idx]; + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_ref.leaf_idx); + CV_TypeIndexSource curr_ti_source = cv_type_index_source_from_leaf_kind(leaf.kind); + CV_TypeIndex curr_ti = cv_ti_from_leaf_idx(debug_t, curr_ti_source, leaf_ref.leaf_idx); + // init hasher blake3_hasher hasher; blake3_hasher_init(&hasher); @@ -1181,154 +680,130 @@ lnk_hash_cv_leaf(LNK_CodeViewInput *input, } // mix-in sub leaf hashes - for EachNode(ti_n, CV_TypeIndexInfo, ti_info_list.first) { - CV_TypeIndex sub_ti = memory_read32(leaf.data.str + ti_n->offset); - - // is type index complex? - if (sub_ti >= ti_ranges[ti_n->source].min) { - // Mostly leaves are laid out as DAG and we can get to sub leaf hash through index lookup, - // however MASM doesn't follow DAG rule, for example: - // - // Engine\Source\Developer\Windows\LiveCoding\Private\External\LC_JumpToSelf.asm - // .debug$T (No. 4): - // LF_PROCEDURE (0x1000) [0008-0014] - // Return type: 3 - // Call Convention: Near C - // Function Attribs: NULL - // Argumnet Count: 0 - // Argument List Type: 1001 - // LF_ARGLIST (0x1001) [0018-001C] - // Types 0 - // LF_LABEL (0x1002) [0020-0024] - // $UNDEFINED: E - // - // Note: LF_ARGLIST(0x1001) > LF_PROCEDURE(0x1000) - // - // Luckily we don't have many leaves that break DAG rule and we can skip without - // much memory and perf penalty (In Ancient Game we skip 7 leaves) - if (sub_ti < curr_ti) { - LNK_LeafRef sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, loc_type, ti_n->source, loc_idx, sub_ti); - - // query sub hash - U64 sub_hash = lnk_hash_from_leaf_ref(hashes, sub_leaf_ref); - - // make sure sub hash was computed (:zero_hash_array) - Assert(sub_hash != 0); - - // mix-in sub hash - blake3_hasher_update(&hasher, &sub_hash, sizeof(sub_hash)); - } else { - Temp scratch = scratch_begin(0,0); - String8 leaf_kind_str = cv_string_from_leaf_kind(leaf.kind); - String8 leaf_info = push_str8f(scratch.arena, "LF_%S(type_index: 0x%x) forward refs member type index 0x%x (leaf struct offset: 0x%llx)", leaf_kind_str, curr_ti, sub_ti, ti_n->offset); - if (loc_type == LNK_LeafLocType_Internal) { - lnk_error_obj(LNK_Error_InvalidTypeIndex, input->internal_obj_arr[loc_idx], "%S", leaf_info); - } else if (loc_type == LNK_LeafLocType_External) { - lnk_error(LNK_Error_InvalidTypeIndex, "%S: %S", input->type_server_path_arr[loc_idx], leaf_info); - } else { - InvalidPath; - } - scratch_end(scratch); - } - } + for EachNode(sub_ti_n, CV_TypeIndexInfo, ti_info_list.first) { + CV_TypeIndex *sub_ti_ptr = str8_deserial_get_raw_ptr(leaf.data, sub_ti_n->offset, sizeof(*sub_ti_ptr)); + CV_TypeIndex sub_ti = memory_read32(sub_ti_ptr); + // simple indices are stable across compile units - else { + if (sub_ti < debug_t->ti_ranges[sub_ti_n->source].min) { blake3_hasher_update(&hasher, &sub_ti, sizeof(sub_ti)); + continue; } + + if (sub_ti >= debug_t->ti_ranges[sub_ti_n->source].max) { + Temp scratch = scratch_begin(0,0); + + String8 out_of_bounds_data = push_str8f(scratch.arena, "out_of_bounds_ti_%u_in_%u", sub_ti, leaf_ref.obj_idx); + blake3_hasher_update(&hasher, out_of_bounds_data.str, out_of_bounds_data.size); + + String8 leaf_kind_str = cv_string_from_leaf_kind(leaf.kind); + String8 error_msg = push_str8f(scratch.arena, "LF_%S(type_index: 0x%x) out of bounds type index 0x%x (leaf struct offset: 0x%llx)", leaf_kind_str, curr_ti, sub_ti, sub_ti_n->offset); + lnk_error_obj(LNK_Error_InvalidTypeIndex, input->obj_arr[leaf_ref.obj_idx], "%S", error_msg); + + scratch_end(scratch); + continue; + } + + // discard type with a cyclic-ref + B32 is_type_graph_cyclic = discard_cycles && sub_ti > 0 && sub_ti > curr_ti; + if (is_type_graph_cyclic) { + // discard type + U32 leaf_idx = curr_ti - debug_t->ti_ranges[curr_ti_source].min; + U8 *leaf_header = debug_t->data.str + debug_t->offsets[leaf_idx]; + memory_write16(leaf_header + OffsetOf(CV_LeafHeader, kind), CV_LeafKind_NOTYPE); + memory_write16(leaf_header + OffsetOf(CV_LeafHeader, size), 0); + + // log error + Temp scratch = scratch_begin(0,0); + String8 leaf_kind_str = cv_string_from_leaf_kind(leaf.kind); + String8 error_msg = push_str8f(scratch.arena, "LF_%S(type_index: 0x%x) forward refs member type index 0x%x (leaf struct offset: 0x%llx)", leaf_kind_str, curr_ti, sub_ti, sub_ti_n->offset); + lnk_error_obj(LNK_Error_InvalidTypeIndex, input->obj_arr[leaf_ref.obj_idx], "%S", error_msg); + scratch_end(scratch); + + continue; + } + + // type index -> hash + LNK_LeafRef sub_ref = lnk_leaf_ref_from_ti(input, leaf_ref.obj_idx, sub_ti_n->source, sub_ti); + U64 sub_hash = input->debug_h_arr[sub_ref.obj_idx].v[sub_ref.leaf_idx]; + + // mix-in sub-type hash + blake3_hasher_update(&hasher, &sub_hash, sizeof(sub_hash)); } U64 hash; blake3_hasher_finalize(&hasher, (U8 *) &hash, sizeof(hash)); + Assert(hash != 0); + Assert(input->debug_h_arr[leaf_ref.obj_idx].v[leaf_ref.leaf_idx] == 0 || + input->debug_h_arr[leaf_ref.obj_idx].v[leaf_ref.leaf_idx] == 1); + input->debug_h_arr[leaf_ref.obj_idx].v[leaf_ref.leaf_idx] = hash; return hash; } internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, - Rng1U64 *ti_ranges, - CV_DebugT *leaves, - LNK_LeafHashes *hashes, - CV_TypeIndexSource ti_source, - CV_TypeIndex ti, - LNK_LeafLocType loc_type, - U32 loc_idx, - CV_TypeIndexInfoList ti_info_list, - CV_Leaf leaf) + LNK_LeafRef root_leaf_ref, + CV_TypeIndexInfoList root_ti_info_list) { Temp temp = temp_begin(arena); - struct stack_s { - struct stack_s *next; + typedef struct HashStack { + struct HashStack *next; + LNK_LeafRef leaf_ref; CV_TypeIndexInfoList ti_info_list; CV_TypeIndexInfo *ti_info; CV_Leaf leaf; CV_TypeIndex ti; CV_TypeIndexSource ti_source; - }; + } HashStack; // set up root frame - struct stack_s *root_frame = push_array(temp.arena, struct stack_s, 1); - root_frame->ti_info_list = ti_info_list; - root_frame->ti_info = ti_info_list.first; - root_frame->leaf = leaf; - root_frame->ti = ti; - root_frame->ti_source = ti_source; + CV_DebugT *root_debug_t = &input->debug_t_arr[root_leaf_ref.obj_idx]; + HashStack *root_frame = push_array(temp.arena, HashStack, 1); + root_frame->leaf_ref = root_leaf_ref; + root_frame->ti_info_list = root_ti_info_list; + root_frame->ti_info = root_ti_info_list.first; + root_frame->leaf = cv_debug_t_get_leaf(root_debug_t, root_leaf_ref.leaf_idx); + root_frame->ti_source = cv_type_index_source_from_leaf_kind(root_frame->leaf.kind); + root_frame->ti = cv_ti_from_leaf_idx(root_debug_t, root_frame->ti_source, root_leaf_ref.leaf_idx); - U64 **curr_hashes = hashes->v[loc_type][loc_idx]; - - struct stack_s *stack = root_frame; + HashStack *stack = root_frame; while (stack) { while (stack->ti_info) { - CV_TypeIndexInfo *curr_ti_info = stack->ti_info; + CV_TypeIndexInfo *ti_info = stack->ti_info; // advance iterator stack->ti_info = stack->ti_info->next; // get type index info - CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (stack->leaf.data.str + curr_ti_info->offset); + CV_TypeIndex *ti_ptr = str8_deserial_get_raw_ptr(stack->leaf.data, ti_info->offset, sizeof(*ti_ptr)); CV_TypeIndex ti = memory_read32(ti_ptr); - // is index complex? - if (ti >= ti_ranges[curr_ti_info->source].min) { - // TODO: handle malformed index - AssertAlways(ti < ti_ranges[curr_ti_info->source].max); - U64 leaf_idx = (ti - ti_ranges[curr_ti_info->source].min); + // skip out of bounds indices + if ( ! contains_1u64(input->debug_t_arr[root_leaf_ref.obj_idx].ti_ranges[ti_info->source], ti)) { continue; } - // was leaf hashed? - if (curr_hashes[curr_ti_info->source][leaf_idx] == 0) { // :zero_hash_array - CV_Leaf leaf = cv_debug_t_get_leaf(leaves[curr_ti_info->source], leaf_idx); + // skip hashed types + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_ti(input, root_leaf_ref.obj_idx, ti_info->source, ti); + if (input->debug_h_arr[leaf_ref.obj_idx].v[leaf_ref.leaf_idx] != 0) { continue; } + input->debug_h_arr[leaf_ref.obj_idx].v[leaf_ref.leaf_idx] = 1; - // find index offsets - CV_TypeIndexInfoList sub_ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); - - // do we have sub leaves? - if (sub_ti_info_list.count) { - // fill out new frame - struct stack_s *frame = push_array(temp.arena, struct stack_s, 1); - frame->ti_info_list = sub_ti_info_list; - frame->ti_info = sub_ti_info_list.first; - frame->leaf = leaf; - frame->ti = ti; - frame->ti_source = curr_ti_info->source; - - // recurse to sub leaf - SLLStackPush(stack, frame); - break; - } else { - curr_hashes[curr_ti_info->source][leaf_idx] = lnk_hash_cv_leaf(input, hashes, loc_type, loc_idx, ti_ranges, CV_TypeIndex_Max, leaf, sub_ti_info_list); - } - } - } + // recurse down to sub types + HashStack *frame = push_array(temp.arena, HashStack, 1); + frame->leaf_ref = leaf_ref; + frame->leaf = cv_debug_t_get_leaf(&input->debug_t_arr[leaf_ref.obj_idx], leaf_ref.leaf_idx); + frame->ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, frame->leaf.kind, frame->leaf.data); + frame->ti_info = frame->ti_info_list.first; + frame->ti = ti; + frame->ti_source = ti_info->source; + SLLStackPush(stack, frame); + break; } // no more type indices, pop frame - if (!stack->ti_info) { - // sub leaves are hashed we can now hash parent leaf - U64 leaf_idx = stack->ti - ti_ranges[stack->ti_source].min; - curr_hashes[stack->ti_source][leaf_idx] = lnk_hash_cv_leaf(input, hashes, loc_type, loc_idx, ti_ranges, CV_TypeIndex_Max, stack->leaf, stack->ti_info_list); - Assert(curr_hashes[stack->ti_source][leaf_idx] != 0); - + if ( ! stack->ti_info) { + lnk_hash_cv_leaf(input, stack->leaf_ref, stack->ti_info_list, 0); SLLStackPop(stack); } } @@ -1337,78 +812,20 @@ lnk_hash_cv_leaf_deep(Arena *arena, } internal LNK_LeafRef * -lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 new_hash, LNK_LeafRef *new_bucket) -{ - LNK_LeafRef *result = 0; - B32 is_inserted_or_updated = 0; - - U64 best_idx = new_hash % leaf_ht->cap; - U64 idx = best_idx; - - do { -retry:; - LNK_LeafRef *curr_bucket = leaf_ht->bucket_arr[idx]; - - if (curr_bucket == 0) { - LNK_LeafRef *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket); - - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - is_inserted_or_updated = 1; - break; - } - - // another thread took the bucket... - goto retry; - } else if (lnk_match_leaf_ref(input, hashes, *curr_bucket, *new_bucket)) { - int leaf_cmp = lnk_leaf_ref_compare(*curr_bucket, *new_bucket); - - if (leaf_cmp <= 0) { - // are we inserting bucket that was already inserterd? - Assert(leaf_cmp < 0); - - result = new_bucket; - - is_inserted_or_updated = 1; - - // don't need to update, more recent leaf is in the bucket - break; - } - - LNK_LeafRef *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - result = compare_bucket; - - is_inserted_or_updated = 1; - break; - } - - // another thread took the bucket... - goto retry; - } - - // advance - idx = ((idx + 1) == leaf_ht->cap ? 0 : (idx + 1)); - } while (idx != best_idx); - - Assert(is_inserted_or_updated); - return result; -} - -internal LNK_LeafRef * -lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref) +lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) { LNK_LeafRef *match = 0; - U64 hash = lnk_hash_from_leaf_ref(hashes, leaf_ref); - U64 best_bucket_idx = hash % ht->cap; - U64 bucket_idx = best_bucket_idx; - + CV_DebugT *debug_t = &input->debug_t_arr[leaf_ref.obj_idx]; + CV_DebugH *debug_h = &input->debug_h_arr[leaf_ref.obj_idx]; + U64 hash = debug_h->v[leaf_ref.leaf_idx]; + U64 best_bucket_idx = hash % ht->cap; + U64 bucket_idx = best_bucket_idx; do { LNK_LeafRef *bucket = ht->bucket_arr[bucket_idx]; if (bucket == 0) { break; } - if (lnk_match_leaf_ref(input, hashes, *bucket, leaf_ref)) { + if (lnk_match_leaf_ref(input, *bucket, leaf_ref)) { match = bucket; break; } @@ -1419,70 +836,20 @@ lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_ return match; } -internal -THREAD_POOL_TASK_FUNC(lnk_count_per_source_leaf_task) -{ - ProfBeginFunction(); - - LNK_CvImportTypes *task = raw_task; - - U64 counts[CV_TypeIndexSource_COUNT] = {0}; - for EachNode(leaf_range, LNK_LeafRange, task->leaf_ranges_per_task[task_id].first) { - CV_DebugT debug_t = *leaf_range->debug_t; - for EachInRange(leaf_idx, leaf_range->range) { - CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - CV_LeafKind kind = memory_read16(MemberFromPtr(CV_LeafHeader, leaf_header, kind)); - CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(kind); - counts[leaf_source] += 1; - } - } - - for EachElement(i, counts) { - ins_atomic_u64_add_eval(&task->internal_per_source_count[i], counts[i]); - } - - ProfEnd(); -} - internal THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_task) { ProfBeginFunction(); - - U64 obj_idx = task_id; - LNK_CvImportTypes *task = raw_task; - - Arena *fixed_arena = task->fixed_arenas[worker_id]; - CV_DebugT debug_t = task->debug_t_arr[obj_idx]; - U64 *out_hashes = task->hashes->v[LNK_LeafLocType_Internal][obj_idx][CV_TypeIndexSource_TPI]; - - Rng1U64 ti_ranges[CV_TypeIndexSource_COUNT]; - for EachElement(ti_source, ti_ranges) { - ti_ranges[ti_source] = rng_1u64(task->input->pch_arr[obj_idx].ti_lo, task->input->pch_arr[obj_idx].ti_hi + debug_t.count); - } - - for EachIndex(leaf_idx, debug_t.count) { - Temp temp = temp_begin(fixed_arena); - - // :debug_zero_hash_assert make sure we don't write same hash more than once - //Assert(MemoryIsZeroStruct(&out_hash_arr.v[leaf_idx])); - - CV_TypeIndex curr_ti = lnk_type_index_from_leaf_ref(task->input, lnk_leaf_ref(obj_idx, leaf_idx)); - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); - CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); - - out_hashes[leaf_idx] = lnk_hash_cv_leaf(task->input, - task->hashes, - LNK_LeafLocType_Internal, - obj_idx, - ti_ranges, - curr_ti, - leaf, - ti_info_list); - + LNK_MergeTypes *task = raw_task; + U32 obj_idx = task->indices.v[task_id]; + CV_DebugT *debug_t = &task->input->debug_t_arr[obj_idx]; + for EachIndex(leaf_idx, debug_t->count) { + Temp temp = temp_begin(task->fixed_arenas[worker_id]); + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + CV_TypeIndexInfoList ti_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); + lnk_hash_cv_leaf(task->input, (LNK_LeafRef){ obj_idx, leaf_idx }, ti_list, 1); temp_end(temp); } - ProfEnd(); } @@ -1490,92 +857,89 @@ internal THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_deep_task) { ProfBeginFunction(); - - LNK_CvImportTypes *task = raw_task; - U64 ts_idx = task_id; - CV_TypeIndexSource ti_source = task->ti_source; - CV_DebugT debug_t = task->input->external_leaves [ts_idx][ti_source]; - Rng1U64 *ti_ranges = task->input->external_ti_ranges[ts_idx]; - CV_DebugT *leaves = task->input->external_leaves [ts_idx]; - - for EachIndex(leaf_idx, debug_t.count) { - U64 hash = task->hashes->v[LNK_LeafLocType_External][ts_idx] [ti_source][leaf_idx]; - if (hash != 0) { continue; } - Temp temp = temp_begin(task->fixed_arenas[worker_id]); - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); - CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); - CV_TypeIndex ti = ti_ranges[ti_source].min + leaf_idx; - lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, task->hashes, ti_source, ti, LNK_LeafLocType_External, ts_idx, ti_info_list, leaf); + LNK_MergeTypes *task = raw_task; + U64 obj_idx = task->indices.v[task_id]; + CV_DebugT *debug_t = &task->input->debug_t_arr[obj_idx]; + for EachIndex(leaf_idx, debug_t->count) { + if (task->input->debug_h_arr[obj_idx].v[leaf_idx] != 0) { continue; } + Temp temp = temp_begin(task->fixed_arenas[worker_id]); + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + CV_TypeIndexInfoList ti_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); + lnk_hash_cv_leaf_deep(temp.arena, task->input, (LNK_LeafRef){ obj_idx, leaf_idx }, ti_list); temp_end(temp); } - ProfEnd(); } internal -THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_internal_task) +THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_task) { - LNK_CvImportTypes *task = raw_task; - U64 obj_idx = task_id; - CV_DebugT debug_t = task->debug_t_arr[obj_idx]; - - ProfBeginDynamic("Leaf Dedup Task 0x%X [Leaf Count %u]", obj_idx, task->debug_t_arr[obj_idx].count); - - LNK_LeafRef *bucket = 0; - for EachIndex(leaf_idx, debug_t.count) { - CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - CV_LeafKind leaf_kind = memory_read16(MemberFromPtr(CV_LeafHeader, leaf_header, kind)); - CV_TypeIndexSource ti_source = cv_type_index_source_from_leaf_kind(leaf_kind); - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[ti_source]; - - LNK_LeafRef leaf_ref = lnk_obj_leaf_ref(obj_idx, leaf_idx); - U64 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); - - if (bucket == 0) { - bucket = push_array_no_zero(arena, LNK_LeafRef, 1); - } - *bucket = leaf_ref; - - LNK_LeafRef *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket); - - if (inserted_or_updated != bucket) { - bucket = 0; - } - } - - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_external_task) -{ - ProfBeginFunction(); - - LNK_CvImportTypes *task = raw_task; - U64 ts_idx = task_id; - - LNK_CodeViewInput *input = task->input; - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[task->ti_source]; - U64 *hashes = task->hashes->external_hashes[ts_idx][task->ti_source]; - U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][task->ti_source]); + LNK_MergeTypes *task = raw_task; + U64 obj_idx = task->indices.v[task_id]; + CV_DebugT *debug_t = &task->input->debug_t_arr[obj_idx]; + CV_DebugH *debug_h = &task->input->debug_h_arr[obj_idx]; + ProfBeginDynamic("dedup in obj 0x%x (%S) leaf count %u", obj_idx, task->input->obj_arr[obj_idx]->path, debug_t->count); LNK_LeafRef *bucket = 0; + for EachIndex(leaf_idx, debug_t->count) { + // read leaf header + CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - for EachIndex(leaf_idx, leaf_count) { - if (hashes[leaf_idx] != 0) { // :zero_hash_check - LNK_LeafRef leaf_ref = lnk_ts_leaf_ref(task->ti_source, ts_idx, leaf_idx); - U64 leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref); + // read leaf kind + CV_LeafKind kind = memory_read16(MemberFromPtr(CV_LeafHeader, header, kind)); - if (bucket == 0) { - bucket = push_array_no_zero(arena, LNK_LeafRef, 1); - } - *bucket = leaf_ref; + // alloc new bucket and assign type ref + if (bucket == 0) { bucket = push_array_no_zero(arena, LNK_LeafRef, 1); } + *bucket = (LNK_LeafRef){ .obj_idx = obj_idx, .leaf_idx = leaf_idx }; - LNK_LeafRef *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket); + CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(kind); + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[leaf_source]; - if (inserted_or_updated != bucket) { - bucket = 0; - } + { + B32 is_inserted_or_updated = 0; + U64 best_idx = debug_h->v[leaf_idx] % leaf_ht->cap; + U64 idx = best_idx; + U64 loop_count = 0; + do { + retry:; + LNK_LeafRef *curr_bucket = leaf_ht->bucket_arr[idx]; + if (curr_bucket == 0) { + LNK_LeafRef *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], bucket, curr_bucket); + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + bucket = 0; + is_inserted_or_updated = 1; + break; + } + // another thread took the bucket... + goto retry; + } else if (lnk_match_leaf_ref(task->input, *curr_bucket, *bucket)) { + int leaf_cmp = lnk_leaf_ref_compare(*curr_bucket, *bucket); + + if (leaf_cmp <= 0) { + // are we inserting bucket that was already inserterd? + Assert(leaf_cmp < 0); + is_inserted_or_updated = 1; + // don't need to update, more recent leaf is in the bucket + break; + } + + LNK_LeafRef *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], bucket, curr_bucket); + if (compare_bucket == curr_bucket) { + // reuse replaced bucket + bucket = compare_bucket; + is_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; + } + + // advance + idx = ((idx + 1) == leaf_ht->cap ? 0 : (idx + 1)); + } while (idx != best_idx); + Assert(is_inserted_or_updated); } } @@ -1587,7 +951,7 @@ THREAD_POOL_TASK_FUNC(lnk_count_present_buckets_task) { ProfBeginFunction(); - LNK_CvImportTypes *task = raw_task; + LNK_MergeTypes *task = raw_task; LNK_LeafHashTable *ht = &task->leaf_ht_arr[task->ti_source]; for EachInRange(bucket_idx, task->ranges[task_id]) { @@ -1604,7 +968,7 @@ THREAD_POOL_TASK_FUNC(lnk_get_present_buckets_task) { ProfBeginFunction(); - LNK_CvImportTypes *task = raw_task; + LNK_MergeTypes *task = raw_task; U64 cursor = task->offsets[task->ti_source][task_id]; LNK_LeafHashTable *ht = &task->leaf_ht_arr[task->ti_source]; @@ -1624,62 +988,58 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_ref_histo_task) { ProfBeginFunction(); - LNK_LeafRadixSortTask *task = raw_task; - Rng1U64 range = task->ranges[task_id]; - U32 *counts_ptr = task->counts_arr[task_id]; + LNK_MergeTypes *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + U32 *counts_ptr = task->counts_arr[task_id]; - U32 loc_idx_bit_count_0 = task->loc_idx_bit_count_0; - U32 loc_idx_bit_count_1 = task->loc_idx_bit_count_1; - U32 loc_idx_bit_count_2 = task->loc_idx_bit_count_2; + U32 obj_idx_bit_count_0 = task->obj_idx_bit_count_0; + U32 obj_idx_bit_count_1 = task->obj_idx_bit_count_1; + U32 obj_idx_bit_count_2 = task->obj_idx_bit_count_2; MemoryZeroTyped(task->counts_arr[task_id], task->counts_max); switch (task->pass_idx) { case 0: { - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 leaf_digit0 = BitExtract(bucket->enc_leaf_idx, 10, 0); - ++counts_ptr[leaf_digit0]; + U64 leaf_digit0 = BitExtract(bucket->leaf_idx, 10, 0); + counts_ptr[leaf_digit0] += 1; } } break; case 1: { - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 leaf_digit1 = BitExtract(bucket->enc_leaf_idx, 11, 10); - ++counts_ptr[leaf_digit1]; + U64 leaf_digit1 = BitExtract(bucket->leaf_idx, 11, 10); + counts_ptr[leaf_digit1] += 1; } } break; case 2: { - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 leaf_digit2 = BitExtract(bucket->enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag - ++counts_ptr[leaf_digit2]; + U64 leaf_digit2 = BitExtract(bucket->leaf_idx, 11, 21); + counts_ptr[leaf_digit2] += 1; } } break; case 3: { - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 digit0 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_0, 0); - ++counts_ptr[digit0]; + U64 digit0 = BitExtract(bucket->obj_idx, obj_idx_bit_count_0, 0); + counts_ptr[digit0] += 1; } } break; case 4: { - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 digit1 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0); - ++counts_ptr[digit1]; + U64 digit1 = BitExtract(bucket->obj_idx, obj_idx_bit_count_1, obj_idx_bit_count_0); + counts_ptr[digit1] += 1; } } break; case 5: { - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 digit2 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1); - - U64 loc_bit = !!(bucket->enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal); - digit2 |= loc_bit << loc_idx_bit_count_2; - - ++counts_ptr[digit2]; + U64 digit2 = BitExtract(bucket->obj_idx, obj_idx_bit_count_2, obj_idx_bit_count_0 + obj_idx_bit_count_1); + counts_ptr[digit2] += 1; } } break; default: InvalidPath; @@ -1693,12 +1053,12 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) { ProfBeginFunction(); - LNK_LeafRadixSortTask *task = raw_task; - Rng1U64 range = task->ranges[task_id]; - U32 *counts_ptr = task->counts_arr[task_id]; - U32 loc_idx_bit_count_0 = task->loc_idx_bit_count_0; - U32 loc_idx_bit_count_1 = task->loc_idx_bit_count_1; - U32 loc_idx_bit_count_2 = task->loc_idx_bit_count_2; + LNK_MergeTypes *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + U32 *counts_ptr = task->counts_arr[task_id]; + U32 obj_idx_bit_count_0 = task->obj_idx_bit_count_0; + U32 obj_idx_bit_count_1 = task->obj_idx_bit_count_1; + U32 obj_idx_bit_count_2 = task->obj_idx_bit_count_2; switch (task->pass_idx) { // @@ -1706,27 +1066,27 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) // case 0: { ProfBegin("Leaf Sort Low"); - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 leaf_digit0 = BitExtract(bucket->enc_leaf_idx, 10, 0); + U64 leaf_digit0 = BitExtract(bucket->leaf_idx, 10, 0); task->dst[counts_ptr[leaf_digit0]++] = bucket; } ProfEnd(); } break; case 1: { ProfBegin("Leaf Sort Mid"); - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 leaf_digit1 = BitExtract(bucket->enc_leaf_idx, 11, 10); + U64 leaf_digit1 = BitExtract(bucket->leaf_idx, 11, 10); task->dst[counts_ptr[leaf_digit1]++] = bucket; } ProfEnd(); } break; case 2: { ProfBegin("Leaf Sort High"); - for (U64 i = range.min; i < range.max; ++i) { + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 leaf_digit2 = BitExtract(bucket->enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag + U64 leaf_digit2 = BitExtract(bucket->leaf_idx, 11, 21); task->dst[counts_ptr[leaf_digit2]++] = bucket; } ProfEnd(); @@ -1736,32 +1096,28 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) // Sort items on obj and type server index // case 3: { - ProfBegin("Loc Sort Low"); - for (U64 i = range.min; i < range.max; ++i) { + ProfBegin("Obj Sort Low"); + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 digit0 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_0, 0); + U64 digit0 = BitExtract(bucket->obj_idx, obj_idx_bit_count_0, 0); task->dst[counts_ptr[digit0]++] = bucket; } ProfEnd(); } break; case 4: { - ProfBegin("Loc Sort Mid"); - for (U64 i = range.min; i < range.max; ++i) { + ProfBegin("Obj Sort Mid"); + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 digit1 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0); + U64 digit1 = BitExtract(bucket->obj_idx, obj_idx_bit_count_1, obj_idx_bit_count_0); task->dst[counts_ptr[digit1]++] = bucket; } ProfEnd(); } break; case 5: { - ProfBegin("Loc Sort High"); - for (U64 i = range.min; i < range.max; ++i) { + ProfBegin("Obj Sort High"); + for EachInRange(i, range) { LNK_LeafRef *bucket = task->src[i]; - U64 digit2 = BitExtract(bucket->enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1); - - U64 loc_bit = !!(bucket->enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal); - digit2 |= loc_bit << loc_idx_bit_count_2; - + U64 digit2 = BitExtract(bucket->obj_idx, obj_idx_bit_count_2, obj_idx_bit_count_0 + obj_idx_bit_count_1); Assert(counts_ptr[digit2] != max_U32); task->dst[counts_ptr[digit2]++] = bucket; } @@ -1775,96 +1131,12 @@ THREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task) } internal void -lnk_leaf_ref_array_sort(TP_Context *tp, LNK_LeafRefArray arr, U64 obj_count, U64 type_server_count) +lnk_leaf_ref_array_sort(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafRefArray arr, U64 debug_t_count) { Temp scratch = scratch_begin(0,0); -#if PROFILE_TELEMETRY - String8 leaf_count_string = str8_from_count(scratch.arena, arr.count); - String8 obj_count_string = str8_from_count(scratch.arena, obj_count); - String8 type_server_count_string = str8_from_count(scratch.arena, type_server_count); - ProfBeginDynamic("Leaf Sort [Leaf Count: %.*s, Obj Count: %.*s, Type Server Count: %.*s]", str8_varg(leaf_count_string), str8_varg(obj_count_string), str8_varg(type_server_count_string)); -#endif + ProfBeginDynamic("Leaf Sort [Leaf Count: %.*s]", str8_varg(str8_from_count(scratch.arena, arr.count))); - if (arr.count > 140000) { - ProfBegin("Radix"); - - U32 loc_idx_max_bits = 32 - clz32(Max(obj_count, type_server_count)); - - LNK_LeafRadixSortTask task = {0}; - task.loc_idx_bit_count_0 = Clamp(0, (S32)loc_idx_max_bits - 21, 11); - task.loc_idx_bit_count_1 = Clamp(0, (S32)loc_idx_max_bits - 10, 11); - task.loc_idx_bit_count_2 = Clamp(0, (S32)loc_idx_max_bits, 10); - task.counts_max = (1 << 11); - task.loc_idx_max = arr.count; - task.ranges = tp_divide_work(scratch.arena, arr.count, tp->worker_count); - task.dst = push_array_no_zero(scratch.arena, LNK_LeafRef *, arr.count); - task.src = arr.v; - - ProfBegin("Push Counts"); - task.counts_arr = push_array_no_zero(scratch.arena, U32 *, tp->worker_count); - for (U64 i = 0; i < tp->worker_count; ++i) { - // zero-out happens in histogram step - task.counts_arr[i] = push_array_no_zero(scratch.arena, U32, task.counts_max); - } - ProfEnd(); - - for (task.pass_idx = 0; task.pass_idx < 6; ++task.pass_idx) { - ProfBeginDynamic("Pass: %u", task.pass_idx); - - ProfBegin("Histo"); - tp_for_parallel(tp, 0, tp->worker_count, lnk_leaf_ref_histo_task, &task); - ProfEnd(); - - B32 is_range_not_empty = 0; - for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) { - is_range_not_empty = task.counts_arr[task_id][0] != dim_1u64(task.ranges[task_id]); - if (is_range_not_empty) { - break; - } - } - - ProfBegin("Counts -> Offsets"); - { - U64 digit_cursor = 0; - for (U64 digit_idx = 0; digit_idx < task.counts_max; ++digit_idx) { - for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) { - U64 count = task.counts_arr[task_id][digit_idx]; - task.counts_arr[task_id][digit_idx] = digit_cursor; - digit_cursor += count; - } - } - Assert(digit_cursor == arr.count); - } - ProfEnd(); - - ProfBegin("Sort"); - tp_for_parallel(tp, 0, tp->worker_count, lnk_loc_idx_radix_sort_task, &task); - Swap(LNK_LeafRef **, task.src, task.dst); - ProfEnd(); - - ProfEnd(); - } - - if (task.src != arr.v) { - MemoryCopyTyped(arr.v, task.dst, arr.count); - } - -#if 0 - for (U64 i = 1; i < arr.count; ++i) { - AssertAlways(arr.v[i-1]->leaf_ref.enc_loc_idx <= arr.v[i]->leaf_ref.enc_loc_idx); - if (arr.v[i-1]->leaf_ref.enc_loc_idx == arr.v[i]->leaf_ref.enc_loc_idx) { - AssertAlways(arr.v[i-1]->leaf_ref.enc_leaf_idx <= arr.v[i]->leaf_ref.enc_leaf_idx); - } - } -#endif - - ProfEnd(); - } else { - ProfBegin("Radsort"); - radsort(arr.v, arr.count, lnk_leaf_ref_is_before); - ProfEnd(); - } scratch_end(scratch); ProfEnd(); @@ -1873,7 +1145,7 @@ lnk_leaf_ref_array_sort(TP_Context *tp, LNK_LeafRefArray arr, U64 obj_count, U64 internal THREAD_POOL_TASK_FUNC(lnk_assign_type_indices_task) { - LNK_CvImportTypes *task = raw_task; + LNK_MergeTypes *task = raw_task; CV_TypeIndexSource ti_source = task->ti_source; LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_source]; @@ -1885,7 +1157,7 @@ THREAD_POOL_TASK_FUNC(lnk_assign_type_indices_task) LNK_LeafRef *leaf_ref = unique_leaf_refs.v[i]; CV_TypeIndex type_index = min_type_index + i; - U64 hash = u64_hash_from_str8(str8_struct(&leaf_ref)); + U64 hash = u64_hash_from_str8(str8_struct(leaf_ref)); U64 best_idx = hash % assigned_type_cap; U64 idx = best_idx; @@ -1917,7 +1189,7 @@ lnk_assigned_type_ht_search(U64 cap, CV_TypeIndex *ht, CV_TypeIndex min_type_ind U64 leaf_idx = type_index - min_type_index; LNK_LeafRef *compar = unique_leaf_refs.v[leaf_idx]; - if (compar == v) { return type_index; } + if (MemoryMatchStruct(compar,v)) { return type_index; } idx = (idx + 1) == cap ? 0 : (idx + 1); } while(idx != best_idx); @@ -1926,55 +1198,53 @@ lnk_assigned_type_ht_search(U64 cap, CV_TypeIndex *ht, CV_TypeIndex min_type_ind return 0; } +internal void +lnk_fixup_cv_type_indices(LNK_MergeTypes *ctx, U32 obj_idx, String8 data, CV_TypeIndexInfoList ti_info_list) +{ + for EachNode(n, CV_TypeIndexInfo, ti_info_list.first) { + CV_TypeIndex *ti_ptr = str8_deserial_get_raw_ptr(data, n->offset, sizeof(*ti_ptr)); + CV_TypeIndex ti = memory_read32(ti_ptr); + + // skip basic types + if (ti < ctx->input->min_type_indices[n->source]) { continue; } + + U64 ts_idx = ctx->input->obj_to_ts[obj_idx]; + CV_DebugT *debug_t = ts_idx ? &ctx->input->debug_t_arr[ctx->input->ts_obj_range.min + ts_idx] : &ctx->input->debug_t_arr[obj_idx]; + + CV_TypeIndex final_ti = 0; + if (contains_1u64(debug_t->ti_ranges[n->source], ti)) { + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_ti(ctx->input, obj_idx, n->source, ti); + LNK_LeafHashTable *leaf_ht = &ctx->leaf_ht_arr[n->source]; + LNK_LeafRef *final_leaf = lnk_leaf_hash_table_search(leaf_ht, ctx->input, leaf_ref); + U64 final_hash = u64_hash_from_str8(str8_struct(final_leaf)); + final_ti = lnk_assigned_type_ht_search(ctx->assigned_type_caps [n->source], + ctx->assigned_type_hts [n->source], + ctx->min_type_indices [n->source], + ctx->unique_leaf_refs_arr[n->source], + final_leaf, + final_hash); + } else { + Assert(0 && "invalid type index"); + } + + memory_write32(ti_ptr, final_ti); + } +} + internal THREAD_POOL_TASK_FUNC(lnk_cv_patcher_symbols_task) { ProfBeginFunction(); - LNK_CvImportTypes *task = raw_task; - - for EachInRange(symbol_input_idx, task->ranges[task_id]) { - LNK_CodeViewSymbolsInput symbol_input = task->input->symbol_inputs[symbol_input_idx]; - LNK_LeafLocType loc_type = lnk_loc_type_from_obj_idx(task->input, symbol_input.obj_idx); - U64 loc_idx = lnk_loc_idx_from_obj_idx (task->input, symbol_input.obj_idx); - - CV_TypeIndex ti_lo_arr[CV_TypeIndexSource_COUNT] = {0}; - for EachElement(ti_source, ti_lo_arr) { ti_lo_arr[ti_source] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, ti_source); } - - for EachNode(symbol_n, CV_SymbolNode, symbol_input.symbol_list->first) { + LNK_MergeTypes *task = raw_task; + for EachInRange(i, task->ranges[task_id]) { + LNK_SymbolInput symbols = task->input->symbol_inputs[i]; + for EachNode(n, CV_SymbolNode, symbols.symbol_list->first) { Temp temp = temp_begin(task->fixed_arenas[task_id]); - - // find type index offsets in symbol - CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, symbol_n->data.kind, symbol_n->data.data); - - // overwrite type indices in symbol - for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { - CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(symbol_n->data.data.str + ti_info->offset); - CV_TypeIndex ti = memory_read32(ti_ptr); - - // skip simple type indices - if (ti < ti_lo_arr[ti_info->source]) { continue; } - - U64 assigned_types_cap = task->assigned_type_caps [ti_info->source]; - CV_TypeIndex *assigned_types_ht = task->assigned_type_hts [ti_info->source]; - CV_TypeIndex min_type_index = task->min_type_indices [ti_info->source]; - LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr [ti_info->source]; - - // find unique leaf refernece - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, ti); - LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); - U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); - - CV_TypeIndex final_ti = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); - - // we overwrite section memory directly - memory_write32(ti_ptr, final_ti); - } - + CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, n->data.kind, n->data.data); + lnk_fixup_cv_type_indices(task, symbols.obj_idx, n->data.data, ti_info_list); temp_end(temp); } } - ProfEnd(); } @@ -1982,49 +1252,15 @@ internal THREAD_POOL_TASK_FUNC(lnk_cv_patcher_inlines_task) { ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - LNK_CvImportTypes *task = raw_task; - - U64 loc_idx = lnk_loc_idx_from_obj_idx(task->input, task_id); - LNK_LeafLocType loc_type = lnk_loc_type_from_obj_idx(task->input, task_id); - String8List inline_data_list = cv_sub_section_from_debug_s(task->debug_s_arr[task_id], CV_C13SubSectionKind_InlineeLines); - - for EachNode(inline_data_node, String8Node, inline_data_list.first) { + LNK_MergeTypes *task = raw_task; + U64 obj_idx = task_id; + String8List inlinee_lines = cv_sub_section_from_debug_s(task->input->debug_s_arr[obj_idx], CV_C13SubSectionKind_InlineeLines); + for EachNode(inline_data_n, String8Node, inlinee_lines.first) { Temp temp = temp_begin(task->fixed_arenas[worker_id]); - - // get indices offsets - CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_node->string); - - for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { - CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(inline_data_node->string.str + ti_info->offset); - CV_TypeIndex ti = memory_read32(ti_ptr); - - // skip simple type indices - CV_TypeIndex ti_lo = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, ti_info->source); - if (ti < ti_lo) { continue; } - - U64 assigned_types_cap = task->assigned_type_caps [ti_info->source]; - CV_TypeIndex *assigned_types_ht = task->assigned_type_hts [ti_info->source]; - CV_TypeIndex min_type_index = task->min_type_indices [ti_info->source]; - LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr [ti_info->source]; - - // find unique leaf refernece - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, ti); - LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); - U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); - - CV_TypeIndex final_ti = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); - - // patch index - memory_write32(ti_ptr, final_ti); - } - + CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_n->string); + lnk_fixup_cv_type_indices(task, obj_idx, inline_data_n->string, ti_info_list); temp_end(temp); } - - scratch_end(scratch); ProfEnd(); } @@ -2032,71 +1268,39 @@ internal THREAD_POOL_TASK_FUNC(lnk_cv_patcher_leaves_task) { ProfBeginFunction(); - LNK_CvImportTypes *task = raw_task; - + LNK_MergeTypes *task = raw_task; for EachInRange(leaf_ref_idx, task->ranges[task_id]) { Temp temp = temp_begin(task->fixed_arenas[task_id]); - - LNK_LeafRef *patch = task->unique_leaf_refs_arr[task->ti_source].v[leaf_ref_idx]; - - // patch leaf ref -> leaf record - U64 loc_idx = patch->enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal; - LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(*patch); - CV_TypeIndex ti_lo = lnk_ti_lo_from_leaf_ref(task->input, *patch); - String8 raw_leaf = lnk_data_from_leaf_ref(task->input, *patch); - CV_Leaf leaf = cv_leaf_from_string(raw_leaf); - - // get type indices offsets - CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); - - for EachNode(ti_info, CV_TypeIndexInfo, ti_info_list.first) { - CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(leaf.data.str + ti_info->offset); - CV_TypeIndex ti = memory_read32(ti_ptr); - - // skip simple type indices - if (ti < ti_lo) { continue; } - - U64 assigned_types_cap = task->assigned_type_caps [ti_info->source]; - CV_TypeIndex *assigned_types_ht = task->assigned_type_hts [ti_info->source]; - CV_TypeIndex min_type_index = task->min_type_indices [ti_info->source]; - LNK_LeafRefArray unique_leaf_refs = task->unique_leaf_refs_arr[ti_info->source]; - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr [ti_info->source]; - - // find unique leaf ref - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, ti); - LNK_LeafRef *leaf_ref_unique = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref); - U64 leaf_ref_unique_hash = u64_hash_from_str8(str8_struct(&leaf_ref_unique)); - - CV_TypeIndex final_ti = lnk_assigned_type_ht_search(assigned_types_cap, assigned_types_ht, min_type_index, unique_leaf_refs, leaf_ref_unique, leaf_ref_unique_hash); - - // patch index - memory_write32(ti_ptr, final_ti); - } - + LNK_LeafRef *patch = task->unique_leaf_refs_arr[task->ti_source].v[leaf_ref_idx]; + CV_DebugT *debug_t = &task->input->debug_t_arr[patch->obj_idx]; + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, patch->leaf_idx); + CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data); + lnk_fixup_cv_type_indices(task, patch->obj_idx, leaf.data, ti_info_list); temp_end(temp); } - ProfEnd(); } internal THREAD_POOL_TASK_FUNC(lnk_unbucket_raw_leaves_task) { - LNK_CvImportTypes *task = raw_task; + LNK_MergeTypes *task = raw_task; for EachInRange(i, task->ranges[task_id]) { - LNK_LeafRef *leaf_ref_ptr = task->unique_leaf_refs_arr[task->ti_source].v[i]; - task->merged_types.v[task->ti_source][i] = lnk_data_from_leaf_ref(task->input, *leaf_ref_ptr).str; + LNK_LeafRef leaf_ref = *task->unique_leaf_refs_arr[task->ti_source].v[i]; + CV_DebugT *debug_t = &task->input->debug_t_arr[leaf_ref.obj_idx]; + String8 raw_leaf = cv_debug_t_get_raw_leaf(debug_t, leaf_ref.leaf_idx); + task->result.v[task->ti_source][i] = raw_leaf.str; } } internal THREAD_POOL_TASK_FUNC(lnk_fixup_symbols_task) { - LNK_CvImportTypes *task = raw_task; + LNK_MergeTypes *task = raw_task; - U64 leaf_count_ipi = task->merged_types.count[CV_TypeIndexSource_IPI]; - U8 **leaf_arr_ipi = task->merged_types.v [CV_TypeIndexSource_IPI]; - CV_TypeIndex min_ti_ipi = task->min_type_indices [CV_TypeIndexSource_IPI]; + U64 leaf_count_ipi = task->result.count [CV_TypeIndexSource_IPI]; + U8 **leaf_arr_ipi = task->result.v [CV_TypeIndexSource_IPI]; + CV_TypeIndex min_ti_ipi = task->min_type_indices[CV_TypeIndexSource_IPI]; for EachNode(symnode, CV_SymbolNode, task->input->symbol_inputs[task_id].symbol_list->first) { CV_Symbol *symbol = &symnode->data; @@ -2154,150 +1358,91 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) ProfBeginFunction(); Temp scratch = temp_begin(lnk_get_huge_arena()); - U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex)); - Arena **fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_ti_list_size, max_ti_list_size); + LNK_MergeTypes task = { .input = input, }; + U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex)); + task.fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_ti_list_size, max_ti_list_size); - LNK_CvImportTypes task = {0}; - task.input = input; - task.hashes = push_array(scratch.arena, LNK_LeafHashes, 1); - task.fixed_arenas = fixed_arenas; - - ProfBegin("Hash Leaves"); + ProfBegin("Produce Hashes"); { - // push internal hash arrays - // - // TPI and IPI leaves in .debug$T are stored in one array (we don't move them - // to respective arrays before this point to save on memory move) - ProfBegin("Push Internal Hash Arrays"); - task.hashes->internal_hashes = push_array_no_zero(scratch.arena, U64 **, input->internal_count); - for EachIndex(obj_idx, input->internal_count) { - CV_DebugT debug_t = input->merged_debug_t_p_arr[obj_idx]; - - U64 *arr = push_array_no_zero(scratch.arena, U64, debug_t.count); - - // :debug_zero_hash_assert - #if BUILD_DEBUG - MemoryZeroTyped(arr, debug_t.count); - #endif - - task.hashes->internal_hashes[obj_idx] = push_array(scratch.arena, U64 *, CV_TypeIndexSource_COUNT); - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - task.hashes->internal_hashes[obj_idx][ti_source] = arr; + ProfBegin("Alloc Hashes"); + U32Array indices[] = { + input->int_obj_indices, + input->debug_p_indices, + input->type_server_indices + // TODO: explain + // input->ext_obj_indices, + }; + for EachElement(i, indices) { + for EachIndex(k, indices[i].count) { + U64 obj_idx = indices[i].v[k]; + CV_DebugH *debug_h = &input->debug_h_arr[obj_idx]; + debug_h->count = input->debug_t_arr[obj_idx].count; + debug_h->v = push_array(scratch.arena, U64, debug_h->count); } } ProfEnd(); - - // push external hash arrays - ProfBegin("Push External Hash Arrays"); - task.hashes->external_hashes = push_array_no_zero(scratch.arena, U64 **, input->type_server_count); - for EachIndex(ts_idx, input->type_server_count) { - task.hashes->external_hashes[ts_idx] = push_array_no_zero(scratch.arena, U64 *, CV_TypeIndexSource_COUNT); - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - U64 type_count = dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); - task.hashes->external_hashes[ts_idx][ti_source] = push_array(scratch.arena, U64, type_count); // :zero_hash_check - } - } - ProfEnd(); - + // hash .debug$P first so we can mix in hashes for precompiled sub leaves when hashing leaves in .debug$T - task.debug_t_arr = input->internal_debug_p_arr; - ProfScope("Hash .debug$P [Count: %llu]", input->internal_count) - tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); + ProfBegin("Hash"); + task.indices = input->debug_p_indices; + ProfScope(".debug$P [Count: %llu]", input->debug_p_indices.count) + tp_for_parallel(tp, 0, task.indices.count, lnk_hash_debug_t_task, &task); - task.debug_t_arr = input->internal_debug_t_arr; - ProfScope("Hash .debug$T [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, input->internal_count))) - tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task); + task.indices = input->int_obj_indices; + ProfScope(".debug$T [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, task.indices.count))) + tp_for_parallel(tp, 0, task.indices.count, lnk_hash_debug_t_task, &task); - task.ti_source = CV_TypeIndexSource_IPI; - ProfScope("Hash IPI Type Servers") - tp_for_parallel(tp, 0, input->type_server_count, lnk_hash_debug_t_deep_task, &task); + task.indices = input->type_server_indices; + ProfScope("Type Servers [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, task.indices.count))); + tp_for_parallel(tp, 0, task.indices.count, lnk_hash_debug_t_deep_task, &task); + ProfEnd(); - task.ti_source = CV_TypeIndexSource_TPI; - ProfScope("Hash TPI Type Servers") - tp_for_parallel(tp, 0, input->type_server_count, lnk_hash_debug_t_deep_task, &task); +#if BUILD_DEBUG + for EachIndex(i, input->count) { + for EachIndex(k, input->debug_h_arr[i].count) { + Assert(input->debug_h_arr[i].v[k] != 0 && + input->debug_h_arr[i].v[k] != 1); + } + } +#endif + + // for external objs wire hash sections to type servers hashes + for EachIndex(i, input->ext_obj_indices.count) { + U64 dst_obj_idx = input->ext_obj_indices.v[i]; + U64 src_obj_idx = input->obj_to_ts[dst_obj_idx]; + CV_DebugH *dst_debug_h = &input->debug_h_arr[dst_obj_idx]; + CV_DebugH *src_debug_h = &input->debug_h_arr[src_obj_idx]; + *dst_debug_h = *src_debug_h; + } } ProfEnd(); ProfBegin("Leaf Hash Table Init"); - { - ProfBegin("Count Types Per Source"); - { - Temp temp = temp_begin(scratch.arena); - - ProfBegin("Compute Per Task Ranges"); - U64 per_task_type_count = 10000; - LNK_LeafRangeList *leaf_ranges_per_task = push_array(temp.arena, LNK_LeafRangeList, tp->worker_count); - for (U64 i = 0, task_weight = 0, task_id = 0; i < input->internal_count; i += 1) { - CV_DebugT *debug_t = &input->merged_debug_t_p_arr[i]; - for (U64 k = 0; k < debug_t->count; k += per_task_type_count) { - U64 cap = per_task_type_count - task_weight; - - LNK_LeafRange *leaf_range = push_array(temp.arena, LNK_LeafRange, 1); - leaf_range->range = rng_1u64(k, Min(k + cap, debug_t->count)); - leaf_range->debug_t = debug_t; - - LNK_LeafRangeList *list = &leaf_ranges_per_task[task_id]; - SLLQueuePush(list->first, list->last, leaf_range); - list->count += 1; - - task_weight += dim_1u64(leaf_range->range); - if (task_weight >= per_task_type_count) { - task_id = (task_id + 1) % tp->worker_count; - task_weight = 0; - } - } - } - ProfEnd(); - - task.leaf_ranges_per_task = leaf_ranges_per_task; - tp_for_parallel(tp, 0, tp->worker_count, lnk_count_per_source_leaf_task, &task); - - temp_end(temp); - } - ProfEnd(); - - // count external leaves - for EachIndex(ts_idx, input->type_server_count) { - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - task.external_per_source_count[ti_source] += dim_1u64(input->external_ti_ranges[ts_idx][ti_source]); - } - } - - // push buckets per source - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - task.leaf_ht_arr[ti_source].cap = 0; - task.leaf_ht_arr[ti_source].cap += task.internal_per_source_count[ti_source]; - task.leaf_ht_arr[ti_source].cap += task.external_per_source_count[ti_source]; - task.leaf_ht_arr[ti_source].cap = (task.leaf_ht_arr[ti_source].cap * 13) / 10; // * 1.3 - task.leaf_ht_arr[ti_source].bucket_arr = push_array(scratch.arena, LNK_LeafRef *, task.leaf_ht_arr[ti_source].cap); - - #if PROFILE_TELEMETRY - tmMessage(0, TMMF_ICON_NOTE, "%.*s Bucket Count: %.*s", str8_varg(cv_string_from_type_index_source(ti_source)), str8_varg(str8_from_count(scratch.arena, task.leaf_ht_arr[ti_source].cap))); - #endif - } - } - ProfEnd(); - - ProfBeginDynamic("Internal Leaf Dedup [Obj Count: %.*s, TPI: %.*s, IPI: %.*s]", - str8_varg(str8_from_count(scratch.arena, input->internal_count)), - str8_varg(str8_from_count(scratch.arena, task.internal_per_source_count[CV_TypeIndexSource_TPI])), - str8_varg(str8_from_count(scratch.arena, task.internal_per_source_count[CV_TypeIndexSource_IPI]))); - - task.debug_t_arr = input->internal_debug_p_arr; - tp_for_parallel_prof(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task, "Dedup .debug$P"); - - task.debug_t_arr = input->internal_debug_t_arr; - tp_for_parallel_prof(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task, "Dedup .debug$T"); - - ProfEnd(); - - ProfBeginDynamic("External Leaf Import [Type Server Count: %llu, Dependent Obj Count: %llu]", input->type_server_count, input->external_count); for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - task.ti_source = ti_source; - tp_for_parallel(tp, tp_temp, input->type_server_count, lnk_leaf_dedup_external_task, &task); + U64 total_count = 0; + for EachIndex(obj_idx, input->count) { total_count += input->debug_t_arr[obj_idx].source_counts[ti_source]; } + + task.leaf_ht_arr[ti_source].cap = total_count; + task.leaf_ht_arr[ti_source].cap = (task.leaf_ht_arr[ti_source].cap * 13) / 10; // * 1.3 + task.leaf_ht_arr[ti_source].bucket_arr = push_array(scratch.arena, LNK_LeafRef *, task.leaf_ht_arr[ti_source].cap); + +#if PROFILE_TELEMETRY + tmMessage(0, TMMF_ICON_NOTE, "%.*s Bucket Count: %.*s", str8_varg(cv_string_from_type_index_source(ti_source)), str8_varg(str8_from_count(scratch.arena, task.leaf_ht_arr[ti_source].cap))); +#endif } ProfEnd(); + ProfBegin("Leaf Dedup"); + task.indices = input->debug_p_indices; + tp_for_parallel_prof(tp, tp_temp, task.indices.count, lnk_leaf_dedup_task, &task, ".debug$P"); + + task.indices = input->int_obj_indices; + tp_for_parallel_prof(tp, tp_temp, task.indices.count, lnk_leaf_dedup_task, &task, ".debug$T"); + + task.indices = input->type_server_indices; + tp_for_parallel_prof(tp, tp_temp, task.indices.count, lnk_leaf_dedup_task, &task, "Type Servers"); + ProfEnd(); + ProfBegin("Extract present buckets from the leaf hash tables"); for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { @@ -2312,7 +1457,86 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_get_present_buckets_task, &task, "Copy present buckets"); // sort output leaves based on { location index, leaf index } to guarantee determinism - lnk_leaf_ref_array_sort(tp, task.unique_leaf_refs_arr[ti_source], input->internal_count, input->type_server_count); + { + LNK_LeafRefArray arr = task.unique_leaf_refs_arr[ti_source]; + if (arr.count > 140000) { + ProfBegin("Radix"); + + U32 obj_idx_max_bits = 32 - clz32(input->count); + + task.obj_idx_bit_count_0 = Clamp(0, (S32)obj_idx_max_bits - 21, 11); + task.obj_idx_bit_count_1 = Clamp(0, (S32)obj_idx_max_bits - 10, 11); + task.obj_idx_bit_count_2 = Clamp(0, (S32)obj_idx_max_bits, 10); + task.counts_max = (1 << 11); + task.ranges = tp_divide_work(scratch.arena, arr.count, tp->worker_count); + task.dst = push_array_no_zero(scratch.arena, LNK_LeafRef *, arr.count); + task.src = arr.v; + + ProfBegin("Push Counts"); + task.counts_arr = push_array_no_zero(scratch.arena, U32 *, tp->worker_count); + for (U64 i = 0; i < tp->worker_count; ++i) { + // zero-out happens in histogram step + task.counts_arr[i] = push_array_no_zero(scratch.arena, U32, task.counts_max); + } + ProfEnd(); + + for (task.pass_idx = 0; task.pass_idx < 6; ++task.pass_idx) { + ProfBeginDynamic("Pass: %u", task.pass_idx); + + ProfBegin("Histo"); + tp_for_parallel(tp, 0, tp->worker_count, lnk_leaf_ref_histo_task, &task); + ProfEnd(); + + B32 is_range_not_empty = 0; + for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) { + is_range_not_empty = task.counts_arr[task_id][0] != dim_1u64(task.ranges[task_id]); + if (is_range_not_empty) { + break; + } + } + + ProfBegin("Counts -> Offsets"); + { + U64 digit_cursor = 0; + for EachIndex(digit_idx, task.counts_max) { + for EachIndex(task_id, tp->worker_count) { + U64 count = task.counts_arr[task_id][digit_idx]; + task.counts_arr[task_id][digit_idx] = digit_cursor; + digit_cursor += count; + } + } + Assert(digit_cursor == arr.count); + } + ProfEnd(); + + ProfBegin("Sort"); + tp_for_parallel(tp, 0, tp->worker_count, lnk_loc_idx_radix_sort_task, &task); + Swap(LNK_LeafRef **, task.src, task.dst); + ProfEnd(); + + ProfEnd(); + } + + if (task.src != arr.v) { + MemoryCopyTyped(arr.v, task.dst, arr.count); + } + + ProfEnd(); + } else { + ProfBegin("Radsort"); + radsort(arr.v, arr.count, lnk_leaf_ref_is_before); + ProfEnd(); + } + +#if 0 + for (U64 i = 1; i < arr.count; ++i) { + AssertAlways(arr.v[i-1]->obj_idx <= arr.v[i]->obj_idx); + if (arr.v[i-1]->obj_idx == arr.v[i]->obj_idx) { + AssertAlways(arr.v[i-1]->obj_idx <= arr.v[i]->obj_idx); + } + } +#endif + } } #if PROFILE_TELEMETRY @@ -2335,7 +1559,7 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) ProfBegin("Patch Type Indices"); { - task.ranges = tp_divide_work(scratch.arena, input->total_symbol_input_count, tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, input->symbol_input_count, tp->worker_count); tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_symbols_task, &task, "Symbols"); task.ranges = 0; @@ -2352,18 +1576,20 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { LNK_LeafRefArray unique_leaf_refs = task.unique_leaf_refs_arr[ti_source]; - task.ti_source = ti_source; - task.merged_types.count[ti_source] = unique_leaf_refs.count; - task.merged_types.v [ti_source] = push_array(tp_temp->v[0], U8 *, unique_leaf_refs.count); - task.ranges = tp_divide_work(scratch.arena, unique_leaf_refs.count, tp->worker_count); + task.ti_source = ti_source; + task.result.count[ti_source] = unique_leaf_refs.count; + task.result.v [ti_source] = push_array(tp_temp->v[0], U8 *, unique_leaf_refs.count); + task.ranges = tp_divide_work(scratch.arena, unique_leaf_refs.count, tp->worker_count); tp_for_parallel(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task); } - tp_for_parallel_prof(tp, 0, input->total_symbol_input_count, lnk_fixup_symbols_task, &task, "fixup type indices in symbols"); + tp_for_parallel_prof(tp, 0, input->symbol_input_count, lnk_fixup_symbols_task, &task, "fixup type indices in symbols"); + + MemoryCopyTyped(task.result.min_type_indices, input->min_type_indices, CV_TypeIndexSource_COUNT); temp_end(scratch); ProfEnd(); - return task.merged_types; + return task.result; } internal @@ -2976,11 +2202,10 @@ lnk_build_pdb(TP_Context *tp, U64 obj_count, LNK_Obj **obj_arr, CV_DebugS *debug_s_arr, - U64 total_symbol_input_count, - LNK_CodeViewSymbolsInput *symbol_inputs, + U64 symbol_input_count, + LNK_SymbolInput *symbol_inputs, CV_SymbolListArray *parsed_symbols, - U64 leaf_count[CV_TypeIndexSource_COUNT], - U8 **leaf_arr [CV_TypeIndexSource_COUNT]) + LNK_MergedTypes types) { ProfBegin("PDB"); Temp scratch = scratch_begin(tp_arena->v, tp_arena->count); @@ -2994,12 +2219,15 @@ lnk_build_pdb(TP_Context *tp, PDB_Context *pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid); ProfEnd(); + // set min type indices + for EachElement(ti_source, types.min_type_indices) { pdb->type_servers[ti_source]->ti_lo = types.min_type_indices[ti_source]; } + // move patched type data // // leaf data is stored in g_file_arena which has linker's life-time // and this way we skip redundant leaf copy to the type server to make things faster - pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_IPI], leaf_count[CV_TypeIndexSource_IPI], leaf_arr[CV_TypeIndexSource_IPI]); - pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_TPI], leaf_count[CV_TypeIndexSource_TPI], leaf_arr[CV_TypeIndexSource_TPI]); + pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_IPI], types.count[CV_TypeIndexSource_IPI], types.v[CV_TypeIndexSource_IPI]); + pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_TPI], types.count[CV_TypeIndexSource_TPI], types.v[CV_TypeIndexSource_TPI]); ProfBegin("Collect Symbols for GSI"); CV_SymbolList *gsi_list_arr = push_array(scratch.arena, CV_SymbolList, obj_count); @@ -3261,39 +2489,39 @@ THREAD_POOL_TASK_FUNC(lnk_build_udt_name_hash_table_task) B32 is_inserted_or_updated = 0; do { retry:; - LNK_UDTNameBucket *curr_bucket = task->buckets[bucket_idx]; + LNK_UDTNameBucket *curr_bucket = task->buckets[bucket_idx]; - if (curr_bucket == 0) { - LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); + if (curr_bucket == 0) { + LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - is_inserted_or_updated = 1; - break; - } + if (compare_bucket == curr_bucket) { + // success, bucket was inserted + is_inserted_or_updated = 1; + break; + } - // another thread took the bucket... - goto retry; - } else if (str8_match(curr_bucket->name, name, 0)) { - // there is more than one UDT with identical name, pick most recent and ignore others + // another thread took the bucket... + goto retry; + } else if (str8_match(curr_bucket->name, name, 0)) { + // there is more than one UDT with identical name, pick most recent and ignore others - if (leaf_idx < curr_bucket->leaf_idx) { - LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - is_inserted_or_updated = 1; - break; - } - } else { - // don't need to update, more recent leaf is in the bucket - break; - } + if (leaf_idx < curr_bucket->leaf_idx) { + LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); + if (compare_bucket == curr_bucket) { + is_inserted_or_updated = 1; + break; + } + } else { + // don't need to update, more recent leaf is in the bucket + break; + } - // another thread took the bucket... - goto retry; - } + // another thread took the bucket... + goto retry; + } - // advance - bucket_idx = (bucket_idx + 1) % task->buckets_cap; + // advance + bucket_idx = (bucket_idx + 1) % task->buckets_cap; } while (bucket_idx != best_idx); if (is_inserted_or_updated) { @@ -4502,7 +3730,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) Temp scratch = scratch_begin(&arena, 1); LNK_ConvertUnitToRDITask *task = raw_task; - LNK_CodeViewSymbolsInput symbols_input = task->symbol_inputs[task_id]; + LNK_SymbolInput symbols_input = task->symbol_inputs[task_id]; LNK_Obj *obj = task->obj_arr[symbols_input.obj_idx]; LNK_CodeViewCompilerInfo comp_info = task->comp_info_arr[symbols_input.obj_idx]; CV_InlineeLinesAccel *inlinee_lines_accel = task->inlinee_lines_accel_arr[symbols_input.obj_idx]; @@ -5217,11 +4445,10 @@ lnk_build_rad_debug_info(TP_Context *tp, U64 obj_count, LNK_Obj **obj_arr, CV_DebugS *debug_s_arr, - U64 total_symbol_input_count, - LNK_CodeViewSymbolsInput *symbol_inputs, + U64 symbol_input_count, + LNK_SymbolInput *symbol_inputs, CV_SymbolListArray *parsed_symbols, - U64 leaf_count[CV_TypeIndexSource_COUNT], - U8 **leaf_arr [CV_TypeIndexSource_COUNT]) + LNK_MergedTypes types) { ProfBegin("RDI"); Temp scratch = scratch_begin(tp_arena->v,tp_arena->count); @@ -5275,7 +4502,7 @@ lnk_build_rad_debug_info(TP_Context *tp, // assing low and high type indices per source Rng1U64 itype_ranges[CV_TypeIndexSource_COUNT]; for (U64 i = 0; i < ArrayCount(itype_ranges); ++i) { - itype_ranges[i] = rng_1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + leaf_count[i]); + itype_ranges[i] = rng_1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + types.count[i]); } ProfBegin("Convert Types"); @@ -5298,14 +4525,14 @@ lnk_build_rad_debug_info(TP_Context *tp, ProfBegin("Build UDT Name Hash Table"); // TODO: fix memory life-time udt_name_buckets_cap = 0; - udt_name_buckets = lnk_udt_name_hash_table_from_leaf_arr(tp, tp_arena, leaf_count[CV_TypeIndexSource_TPI], leaf_arr[CV_TypeIndexSource_TPI], &udt_name_buckets_cap); + udt_name_buckets = lnk_udt_name_hash_table_from_leaf_arr(tp, tp_arena, types.count[CV_TypeIndexSource_TPI], types.v[CV_TypeIndexSource_TPI], &udt_name_buckets_cap); ProfEnd(); ProfBegin("Convert CodeView types to RDIB Types"); LNK_ConvertTypesToRDI task = {0}; - MemoryCopyTyped(&task.leaf_count[0], &leaf_count[0], CV_TypeIndexSource_COUNT); - MemoryCopyTyped(&task.leaf_arr[0], &leaf_arr[0], CV_TypeIndexSource_COUNT); + MemoryCopyTyped(task.leaf_count, types.count, CV_TypeIndexSource_COUNT); + MemoryCopyTyped(task.leaf_arr, types.v, CV_TypeIndexSource_COUNT); task.type_cap = input.type_cap; task.udt_cap = input.udt_cap; task.variadic_type_ref = rdib_make_type_ref(scratch.arena, input.variadic_type); @@ -5322,7 +4549,7 @@ lnk_build_rad_debug_info(TP_Context *tp, task.rdib_types_params_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); task.rdib_udt_members_lists = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count); task.rdib_enum_members_lists = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count); - task.ranges = tp_divide_work(scratch.arena, leaf_count[CV_TypeIndexSource_TPI], tp->worker_count); + task.ranges = tp_divide_work(scratch.arena, types.count[CV_TypeIndexSource_TPI], tp->worker_count); tp_for_parallel(tp, tp_arena, tp->worker_count, lnk_convert_types_to_rdi_task, &task); ProfEnd(); @@ -5405,8 +4632,8 @@ lnk_build_rad_debug_info(TP_Context *tp, task.image_sects = image_sects; task.obj_arr = obj_arr; task.debug_s_arr = debug_s_arr; - task.leaf_arr_count_ipi = leaf_count[CV_TypeIndexSource_IPI]; - task.leaf_arr_ipi = leaf_arr[CV_TypeIndexSource_IPI]; + task.leaf_arr_count_ipi = types.count[CV_TypeIndexSource_IPI]; + task.leaf_arr_ipi = types.v[CV_TypeIndexSource_IPI]; task.symbol_inputs = symbol_inputs; task.parsed_symbols = parsed_symbols; task.ipi_itype_range = itype_ranges[CV_TypeIndexSource_IPI]; @@ -5450,7 +4677,7 @@ lnk_build_rad_debug_info(TP_Context *tp, ProfEnd(); ProfBegin("Convert Symbols"); - tp_for_parallel(tp, tp_arena, total_symbol_input_count, lnk_convert_symbols_to_rdi_task, &task); + tp_for_parallel(tp, tp_arena, symbol_input_count, lnk_convert_symbols_to_rdi_task, &task); ProfEnd(); ProfBegin("Convert Inline Sites Line Tables"); diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 76449044..eb8364d7 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -3,84 +3,89 @@ #pragma once +// --- Symbol Parsing Tasks ---------------------------------------------------- + +typedef struct +{ + LNK_Obj **obj_arr; + String8List *sect_list_arr; + CV_DebugS *debug_s_arr; +} LNK_ParseDebugSTaskData; + +typedef struct +{ + LNK_Obj **obj_arr; + String8Array *data_arr_arr; +} LNK_CheckDebugTSigTaskData; + +typedef struct +{ + LNK_Obj **obj_arr; + String8Array *data_arr_arr; + CV_DebugT *debug_t_arr; +} LNK_ParseDebugTTaskData; + // --- Code View Input --------------------------------------------------------- -typedef struct LNK_PchInfo -{ - CV_TypeIndex ti_lo; - CV_TypeIndex ti_hi; - U64 debug_p_obj_idx; -} LNK_PchInfo; - -typedef struct LNK_CodeViewSymbolsInput +typedef struct LNK_SymbolInput { U64 obj_idx; + CV_DebugS *debug_s; CV_SymbolList *symbol_list; String8 raw_symbols; -} LNK_CodeViewSymbolsInput; +} LNK_SymbolInput; -typedef struct LNK_CodeViewInput +typedef struct { - U64 count; - U64 internal_count; - U64 external_count; - U64 type_server_count; - String8 *type_server_path_arr; // [type_server_count] - String8 *type_server_data_arr; // [type_server_count] - U64List *ts_to_obj_arr; // [type_server_count] - LNK_Obj **obj_arr; // [count] - LNK_PchInfo *pch_arr; // [count] - CV_DebugS *debug_s_arr; // [count] - CV_DebugT *debug_p_arr; // [count] - CV_DebugT *debug_t_arr; // [count] - CV_DebugT *merged_debug_t_p_arr; // [count] + CV_TypeServerInfo ts_info; + U64 ts_idx; + String8 ts_path; + U64List obj_indices; +} LNK_TypeServer; +typedef struct LNK_TypeServerNode { LNK_TypeServer v; struct LNK_TypeServerNode *next; } LNK_TypeServerNode; +typedef struct LNK_TypeServerList { U64 count; LNK_TypeServerNode *first; LNK_TypeServerNode *last; } LNK_TypeServerList; +typedef struct LNK_TypeServerArray { U64 count; LNK_TypeServer *v; } LNK_TypeServerArray; - U64 total_symbol_input_count; - LNK_CodeViewSymbolsInput *symbol_inputs; // [total_symbol_input_count] - CV_SymbolListArray *parsed_symbols; // [count] - - LNK_Obj **internal_obj_arr; // [internal_count] - CV_DebugS *internal_debug_s_arr; // [internal_count] - CV_DebugT *internal_debug_t_arr; // [internal_count] - CV_DebugT *internal_debug_p_arr; // [internal_count] - U64 internal_total_symbol_input_count; - LNK_CodeViewSymbolsInput *internal_symbol_inputs; // [internal_total_symbol_input_count] - CV_SymbolListArray *internal_parsed_symbols; // [internal_count] - - LNK_Obj **external_obj_arr; // [external_count] - CV_DebugS *external_debug_s_arr; // [external_count] - CV_DebugT *external_debug_t_arr; // [external_count] - CV_DebugT *external_debug_p_arr; // [external_count] - U64 external_total_symbol_input_count; - LNK_CodeViewSymbolsInput *external_symbol_inputs; // [exteranl_total_symbol_input_count] - CV_SymbolListArray *external_parsed_symbols; // [external_count] - Rng1U64 **external_ti_ranges; // [type_server_count] - CV_DebugT **external_leaves; // [type_server_count] - U64 *external_obj_to_ts_idx_arr; // [external_count] - Rng1U64 external_obj_range; -} LNK_CodeViewInput; - -typedef struct LNK_MergedTypes +typedef struct { + CV_TypeIndex min_type_indices[CV_TypeIndexSource_COUNT]; U64 count[CV_TypeIndexSource_COUNT]; U8 **v [CV_TypeIndexSource_COUNT]; } LNK_MergedTypes; -// --- Leaf Ref ---------------------------------------------------------------- - -typedef enum -{ - LNK_LeafLocType_Internal, - LNK_LeafLocType_External, - LNK_LeafLocType_Count -} LNK_LeafLocType; - -#define LNK_LeafRefFlag_LocIdxExternal (1u << 31) -#define LNK_LeafRefFlag_LeafIdxIPI (1u << 31) typedef struct { - U32 enc_loc_idx; - U32 enc_leaf_idx; + LNK_IO_Flags io_flags; + U64 count; + LNK_Obj **obj_arr; + CV_DebugS *debug_s_arr; + CV_DebugT *debug_p_arr; + CV_DebugT *debug_t_arr; + CV_DebugH *debug_h_arr; + U64 *obj_to_ts; + CV_SymbolListArray *parsed_symbols; // [count] + + U32Array int_obj_indices; + U32Array ext_obj_indices; + U32Array debug_p_indices; + U32Array type_server_indices; + + Rng1U64 ts_obj_range; + LNK_TypeServerArray ts_arr; + B32 *is_type_server_discarded; // [ts_arr.count] + + CV_TypeIndex min_type_indices[CV_TypeIndexSource_COUNT]; + + U64 symbol_input_count; + LNK_SymbolInput *symbol_inputs; // [symbol_input_count] +} LNK_CodeViewInput; + +// --- Leaf Deduping Tasks ----------------------------------------------------- + +typedef struct +{ + U32 obj_idx; + U32 leaf_idx; } LNK_LeafRef; typedef struct LNK_LeafRange @@ -109,107 +114,43 @@ typedef struct LNK_LeafRef **bucket_arr; } LNK_LeafHashTable; -typedef union -{ - struct { - U64 ***internal_hashes; - U64 ***external_hashes; - }; - U64 ***v[CV_TypeIndexSource_COUNT]; -} LNK_LeafHashes; - -// --- Symbol Parsing Tasks ---------------------------------------------------- - -typedef struct -{ - LNK_Obj **obj_arr; - String8List *sect_list_arr; - CV_DebugS *debug_s_arr; -} LNK_ParseDebugSTaskData; - -typedef struct -{ - LNK_Obj **obj_arr; - String8Array *data_arr_arr; -} LNK_CheckDebugTSigTaskData; - -typedef struct -{ - LNK_Obj **obj_arr; - String8Array *data_arr_arr; - CV_DebugT *debug_t_arr; -} LNK_ParseDebugTTaskData; - -typedef struct -{ - String8Array data_arr; - MSF_Parsed **msf_parse_arr; -} LNK_MsfParsedFromDataTask; - -typedef struct -{ - CV_TypeServerInfo *ts_info_arr; - MSF_Parsed **msf_parse_arr; - Rng1U64 **external_ti_ranges; - CV_DebugT **external_leaves; - B8 *is_corrupted; -} LNK_GetExternalLeavesTask; - -// --- Leaf Deduping Tasks ----------------------------------------------------- - -typedef struct -{ - U64 loc_idx_bit_count_0; - U64 loc_idx_bit_count_1; - U64 loc_idx_bit_count_2; - U64 counts_max; - U32 **counts_arr; - Rng1U64 *ranges; - LNK_LeafRef **dst; - LNK_LeafRef **src; - U64 loc_idx_max; - U64 pass_idx; -} LNK_LeafRadixSortTask; - -typedef struct -{ - U32 *counts; - U32 *offsets; - LNK_LeafRef **dst; - LNK_LeafRef **src; - Rng1U64 *ranges; -} LNK_LeafLocRadixSortTask; - typedef struct { LNK_CodeViewInput *input; - LNK_LeafHashes *hashes; - Arena **fixed_arenas; - Rng1U64 *ranges; + CV_DebugS *debug_s_arr; + CV_SymbolList *symbol_list_arr; LNK_LeafHashTable leaf_ht_arr[CV_TypeIndexSource_COUNT]; - CV_DebugT *debug_t_arr; + Arena **fixed_arenas; CV_TypeIndexSource ti_source; + U32Array indices; + Rng1U64 *ranges; // count types per source LNK_LeafRangeList *leaf_ranges_per_task; - U64 internal_per_source_count[CV_TypeIndexSource_COUNT]; - U64 external_per_source_count[CV_TypeIndexSource_COUNT]; + U64 per_source_count[CV_TypeIndexSource_COUNT]; // extract present buckets U64 *counts [CV_TypeIndexSource_COUNT]; U64 *offsets[CV_TypeIndexSource_COUNT]; + // leaf ref radix sort + U64 obj_idx_bit_count_0; + U64 obj_idx_bit_count_1; + U64 obj_idx_bit_count_2; + U64 counts_max; + U32 **counts_arr; + LNK_LeafRef **dst; + LNK_LeafRef **src; + U64 pass_idx; + // assign type indices U64 assigned_type_caps [CV_TypeIndexSource_COUNT]; CV_TypeIndex *assigned_type_hts [CV_TypeIndexSource_COUNT]; CV_TypeIndex min_type_indices [CV_TypeIndexSource_COUNT]; LNK_LeafRefArray unique_leaf_refs_arr[CV_TypeIndexSource_COUNT]; - CV_SymbolList *symbol_list_arr; - CV_DebugS *debug_s_arr; - - LNK_MergedTypes merged_types; -} LNK_CvImportTypes; + LNK_MergedTypes result; +} LNK_MergeTypes; // --- Code View Processing Trasks --------------------------------------------- @@ -226,16 +167,16 @@ typedef struct typedef struct { - LNK_CodeViewSymbolsInput *inputs; + LNK_SymbolInput *inputs; } LNK_ParseCVSymbolsTaskData; typedef struct { - U64 total_symbol_input_count; + U64 symbol_input_count; CV_SymbolListArray *parsed_symbols; U64 *serialized_symbol_data_sizes; - LNK_CodeViewSymbolsInput *symbol_inputs; + LNK_SymbolInput *symbol_inputs; PDB_DbiModule **mod_arr; String8List *symbol_data_arr; CV_SymbolList *gsi_list_arr; @@ -298,7 +239,7 @@ typedef struct { CV_TypeIndex ipi_min_type_index; CV_DebugT ipi_types; - LNK_CodeViewSymbolsInput *symbol_inputs; + LNK_SymbolInput *symbol_inputs; CV_SymbolListArray *parsed_symbols; } LNK_PostProcessCvSymbolsTask; @@ -410,7 +351,7 @@ typedef struct CV_DebugS *debug_s_arr; U64 leaf_arr_count_ipi; U8 **leaf_arr_ipi; - LNK_CodeViewSymbolsInput *symbol_inputs; + LNK_SymbolInput *symbol_inputs; CV_SymbolListArray *parsed_symbols; Rng1U64 ipi_itype_range; Rng1U64 tpi_itype_range; @@ -449,35 +390,18 @@ typedef struct internal CV_DebugS * lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *sect_list_arr); internal CV_DebugT * lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *debug_t_list_arr); -internal LNK_PchInfo * lnk_setup_pch (Arena *arena, U64 obj_count, LNK_Obj **obj_arr, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr, CV_SymbolListArray *parsed_symbols, String8List alt_pch_dirs); - internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_flags, String8List lib_dir_list, String8List alt_pch_dirs, U64 objs_count, LNK_Obj **objs); -internal LNK_LeafRef lnk_leaf_ref (U32 idx, U32 leaf_idx); -internal LNK_LeafRef lnk_obj_leaf_ref (U32 obj_idx, U32 leaf_idx); -internal LNK_LeafRef lnk_ts_leaf_ref (CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx); -internal LNK_LeafLocType lnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref); -internal int lnk_leaf_ref_compare (LNK_LeafRef a, LNK_LeafRef b); - -internal LNK_LeafLocType lnk_loc_type_from_obj_idx (LNK_CodeViewInput *input, U64 obj_idx); -internal U64 lnk_loc_idx_from_obj_idx (LNK_CodeViewInput *input, U64 obj_idx); -internal CV_TypeIndex lnk_ti_lo_from_loc (LNK_CodeViewInput *input, LNK_LeafLocType loc_type, U64 loc_idx, CV_TypeIndexSource ti_source); -internal CV_TypeIndex lnk_ti_lo_from_leaf_ref (LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); -internal String8 lnk_data_from_leaf_ref (LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); -internal LNK_LeafRef lnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, CV_TypeIndexSource ti_source, U64 loc_idx, CV_TypeIndex obj_ti); -internal B32 lnk_match_leaf_ref (LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b); - -// leaf hashing -internal U64 lnk_hash_cv_leaf (LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list); -internal void lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, CV_TypeIndexSource ti_source, CV_TypeIndex ti, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, CV_Leaf leaf); -internal U64 lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); - -// leaf hash table -internal LNK_LeafRef * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U64 hash, LNK_LeafRef *new_bucket); -internal LNK_LeafRef * lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref); - -internal LNK_MergedTypes lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); -internal void lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); +// type merging +internal int lnk_leaf_ref_compare (LNK_LeafRef a, LNK_LeafRef b); +internal int lnk_leaf_ref_is_before (void *raw_a, void *raw_b); +internal B32 lnk_match_leaf_ref (LNK_CodeViewInput *input, LNK_LeafRef a, LNK_LeafRef b); +internal U64 lnk_hash_cv_leaf (LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInfoList ti_info_list, B32 discard_cycles); +internal void lnk_hash_cv_leaf_deep (Arena *arena, LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInfoList ti_info_list); +internal LNK_LeafRef * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, CV_DebugH *hashes, U64 hash, LNK_LeafRef *new_bucket); +internal LNK_LeafRef * lnk_leaf_hash_table_search (LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); +internal LNK_MergedTypes lnk_merge_types (TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); +internal void lnk_replace_type_names_with_hashes (TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); // --- RAD Debug info ---------------------------------------------------------- @@ -501,11 +425,10 @@ lnk_build_rad_debug_info(TP_Context *tp, U64 obj_count, LNK_Obj **obj_arr, CV_DebugS *debug_s_arr, - U64 total_symbol_input_count, - LNK_CodeViewSymbolsInput *symbol_inputs, + U64 symbol_input_count, + LNK_SymbolInput *symbol_inputs, CV_SymbolListArray *parsed_symbols, - U64 leaf_count[CV_TypeIndexSource_COUNT], - U8 **leaf_arr [CV_TypeIndexSource_COUNT]); + LNK_MergedTypes types); // --- PDB --------------------------------------------------------------------- @@ -522,11 +445,10 @@ internal String8List lnk_build_pdb(TP_Context *tp, U64 obj_count, LNK_Obj **obj_arr, CV_DebugS *debug_s_arr, - U64 total_symbol_input_count, - LNK_CodeViewSymbolsInput *symbol_inputs, + U64 symbol_input_count, + LNK_SymbolInput *symbol_inputs, CV_SymbolListArray *parsed_symbols, - U64 leaf_count[CV_TypeIndexSource_COUNT], - U8 **leaf_arr [CV_TypeIndexSource_COUNT]); + LNK_MergedTypes types); // --- RAD Debug Info ---------------------------------------------------------- diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 65835a4a..9f4e21e5 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -946,6 +946,39 @@ pdb_type_server_parse_from_data_v80(String8 data, PDB_TypeServerParse *parse) return error; } +internal B32 +pdb_extract_type_server_info(String8 raw_msf, MSF_RawStreamTable *st, MSF_StreamNumber sn, Rng1U64 *ti_range_out, Rng1U64 *leaf_range_out) +{ + Temp scratch = scratch_begin(0,0); + B32 is_ok = 0; + String8 version_data = msf_data_from_stream_number_ex(scratch.arena, raw_msf, st, sn, r1u64(0, sizeof(PDB_TpiVersion)), 8); + PDB_TpiVersion *version = str8_deserial_get_raw_ptr(version_data, 0, sizeof(*version)); + if (version) { + switch (*version) { + case PDB_TpiVersion_IMPV80: { + String8 header_size_data = msf_data_from_stream_number_ex(scratch.arena, raw_msf, st, sn, r1u64(sizeof(*version), sizeof(*version) + sizeof(U32)), 8); + U32 *header_size = str8_deserial_get_raw_ptr(header_size_data, 0, sizeof(*header_size)); + if (header_size && *header_size >= sizeof(PDB_TpiVersion) + sizeof(U32)) { + String8 header_data = msf_data_from_stream_number_ex(scratch.arena, raw_msf, st, sn, r1u64(0, *header_size), 8); + PDB_TpiHeader *header = str8_deserial_get_raw_ptr(header_data, 0, sizeof(*header)); + if (*header_size + header->leaf_data_size <= st->streams[sn].size) { + *ti_range_out = r1u64(header->ti_lo, header->ti_hi); + *leaf_range_out = r1u64(*header_size, *header_size + header->leaf_data_size); + is_ok = 1; + } else { + NotImplemented; // TODO: handle error + } + } else { + NotImplemented; // TODO: handle error + } + } break; + default: break; + } + } + scratch_end(scratch); + return is_ok; +} + internal PDB_OpenTypeServerError pdb_type_server_parse_from_data(String8 data, PDB_TypeServerParse *parse_out) { @@ -1027,42 +1060,42 @@ pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable if (header.hash_vals.off + header.hash_vals.size > hash_stream_size) { goto exit; } - + ts = pdb_type_server_alloc(header.hash_bucket_count); - + // read & parse code view types String8 types_data = msf_stream_read_block(ts->arena, msf, sn, header.leaf_data_size); CV_DebugT debug_t = cv_debug_t_from_data(scratch.arena, types_data, PDB_LEAF_ALIGN); - + // read hash data U8 *hash_buffer = push_array(scratch.arena, U8, header.hash_vals.size); msf_stream_seek(msf, header.hash_sn, header.hash_vals.off); MSF_UInt hash_buffer_size = msf_stream_read(msf, header.hash_sn, hash_buffer, header.hash_vals.size); Assert(hash_buffer_size == header.hash_vals.size); - + // rebuild type buckets for (U64 cursor = 0, leaf_idx = 0; - cursor + header.hash_key_size <= hash_buffer_size; - cursor += header.hash_key_size, leaf_idx += 1) { - String8 raw_leaf = cv_debug_t_get_raw_leaf(debug_t, leaf_idx); + cursor + header.hash_key_size <= hash_buffer_size; + cursor += header.hash_key_size, leaf_idx += 1) { + String8 raw_leaf = cv_debug_t_get_raw_leaf(&debug_t, leaf_idx); str8_list_push(ts->arena, &ts->leaf_list, raw_leaf); - + // read out bucket hash U64 hash = 0; MemoryCopy(&hash, hash_buffer + cursor, header.hash_key_size); - + // push bucket PDB_TypeBucket *bucket = push_array(ts->arena, PDB_TypeBucket, 1); bucket->raw_leaf = raw_leaf; bucket->type_index = header.ti_lo + leaf_idx; SLLStackPush(ts->buckets[hash], bucket); } - + // adjust type buckets msf_stream_seek(msf, header.hash_sn, header.hash_adj.off); String8 adjust_data = msf_stream_read_block(scratch.arena, msf, header.hash_sn, header.hash_adj.size); - + // open adjust hash table PDB_HashTableParseError hash_adj_parse_error = pdb_hash_adj_hash_table_from_data(&ts->hash_adj, adjust_data, strtab, 0); if (hash_adj_parse_error == PDB_HashTableParseError_OUT_OF_BYTES) { @@ -1075,7 +1108,7 @@ pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable String8Array key_arr = {0}; String8Array value_arr = {0}; pdb_hash_table_get_present_keys_and_values(scratch.arena, &ts->hash_adj, &key_arr, &value_arr); - + // adjust type buckets for (U64 i = 0; i < ts->hash_adj.count; i += 1) { String8 type_name = key_arr.v[i]; @@ -1084,7 +1117,7 @@ pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable // name -> hash U64 hash = pdb_hash_v1(type_name); hash %= ts->bucket_cap; - + // search for type bucket PDB_TypeBucket *curr, *prev; for (curr = ts->buckets[hash], prev = 0; curr != 0; prev = curr, curr = curr->next) { @@ -1092,18 +1125,18 @@ pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable break; } } - + // move type to the head if (prev && curr) { prev->next = curr->next; curr->next = ts->buckets[hash]; ts->buckets[hash] = curr; } - + Assert(curr); } - - exit:; + +exit: scratch_end(scratch); ProfEnd(); return ts; diff --git a/src/msf/msf_parse.c b/src/msf/msf_parse.c index 23f0df63..40c84813 100644 --- a/src/msf/msf_parse.c +++ b/src/msf/msf_parse.c @@ -227,51 +227,63 @@ msf_raw_stream_table_from_data(Arena *arena, String8 msf_data) } internal String8 -msf_data_from_stream_number(Arena *arena, String8 msf_data, MSF_RawStreamTable *st, MSF_StreamNumber sn) +msf_data_from_stream_number_ex(Arena *arena, String8 msf_data, MSF_RawStreamTable *st, MSF_StreamNumber sn, Rng1U64 range, U64 align) { ProfBeginFunction(); String8 result = {0}; if(sn < st->stream_count) { - MSF_RawStream stream = st->streams[sn]; - U8 *stream_buf = push_array_no_zero(arena, U8, stream.size); - U8 *stream_out_ptr = stream_buf; - for (U32 i = 0; i < stream.page_count; ++i) { - U64 page_idx; - if (st->index_size == 4) { - page_idx = stream.u.page_indices_u32[i]; - } else { - page_idx = stream.u.page_indices_u16[i]; + MSF_RawStream stream = st->streams[sn]; + Rng1U64 range_clamped = { .min = Min(range.min, stream.size), .max = Min(range.max, stream.size) }; + U64 page_count = CeilIntegerDiv(dim_1u64(range_clamped), st->page_size); + U64 pn_base = range_clamped.min / st->page_size; + + result = (String8){ .str = push_array_aligned(arena, U8, dim_1u64(range_clamped), align) }; + + for EachIndex(page_idx, page_count) { + U64 pn_begin; + if (st->index_size == 4) { pn_begin = stream.u.page_indices_u32[pn_base + page_idx]; } + else { pn_begin = stream.u.page_indices_u16[pn_base + page_idx]; } + + U64 pn_end = pn_begin; + for (; page_idx+1 < page_count; page_idx += 1) { + U64 next_pn = 0; + if (st->index_size == 4) { next_pn = stream.u.page_indices_u32[pn_base + page_idx + 1]; } + else { next_pn = stream.u.page_indices_u16[pn_base + page_idx + 1]; } + if ((pn_end + 1) != next_pn) { break; } + pn_end = next_pn; } - - U64 stream_page_off = (U64)page_idx * st->page_size; - if (stream_page_off + st->page_size > msf_data.size) { - break; - } - - U8 *stream_page_base = msf_data.str + stream_page_off; - - // clamp copy size by end of stream - U32 stream_pos = (U32) (stream_out_ptr - stream_buf); - U32 remaining_size = stream.size - stream_pos; - U32 copy_size = ClampTop(st->page_size, remaining_size); - + pn_end += 1; + + U64 read_off = result.size + range_clamped.min; + U64 to_read = dim_1u64(range_clamped) - result.size; + U64 read_size = Min(to_read, (pn_end - pn_begin) * st->page_size - (read_off % st->page_size)); + + U64 page_off = (pn_begin * st->page_size) + (read_off % st->page_size); + String8 page = str8_substr(msf_data, r1u64(page_off, page_off + read_size)); + if (page.size != read_size) { break; } + // copy page data - MemoryCopy(stream_out_ptr, stream_page_base, copy_size); - stream_out_ptr += copy_size; + Assert(result.size + read_size <= dim_1u64(range_clamped)); + U8 *ptr = result.str + result.size; + MemoryCopy(ptr, page.str, read_size); + result.size += read_size; } - - U64 copy_size = (U64)(stream_out_ptr - stream_buf); - - U64 unused_buf_size = stream.size - copy_size; + + // release unused bytes + U64 unused_buf_size = dim_1u64(range_clamped) - result.size; arena_pop(arena, unused_buf_size); - - result = str8(stream_buf, copy_size); } ProfEnd(); return result; } +internal String8 +msf_data_from_stream_number(Arena *arena, String8 msf_data, MSF_RawStreamTable *st, MSF_StreamNumber sn) +{ + return msf_data_from_stream_number_ex(arena, msf_data, st, sn, r1u64(0, max_U64), 8); +} + internal MSF_Parsed * msf_parsed_from_data(Arena *arena, String8 msf_data) { diff --git a/src/msf/msf_parse.h b/src/msf/msf_parse.h index df4afb85..afd1c3c2 100644 --- a/src/msf/msf_parse.h +++ b/src/msf/msf_parse.h @@ -41,6 +41,8 @@ struct MSF_Parsed //~ rjf: MSF Parser Functions internal MSF_RawStreamTable* msf_raw_stream_table_from_data(Arena *arena, String8 msf_data); +internal U64 msf_size_from_stream_number(MSF_RawStreamTable *st, MSF_StreamNumber sn); +internal String8 msf_data_from_stream_number_ex(Arena *arena, String8 msf_data, MSF_RawStreamTable *st, MSF_StreamNumber sn, Rng1U64 range, U64 align); internal String8 msf_data_from_stream_number(Arena *arena, String8 msf_data, MSF_RawStreamTable *st, MSF_StreamNumber sn); internal MSF_Parsed* msf_parsed_from_data(Arena *arena, String8 msf_data); internal String8 msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn); diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 55144234..022d0a2e 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -3943,6 +3943,67 @@ T_EndTest; T_BeginTest(merge_duplicate_types) { { + U32 pch_sig = 0xCAFEBABE; + + String8 debug_s; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = pch_sig; + String8 obj_name_string = str8_lit("a.obj"); + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(scratch.arena, &srl, &obj_name); + str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + + debug_s = str8_serial_end(scratch.arena, &srl); + } + String8 debug_p; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + // signature + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + // duplicate in a.obj + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(scratch.arena, &srl, &ptr); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + // unique procedure type + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearPascal }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(proc)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(scratch.arena, &srl, &proc); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + // PCH ender + CV_LeafEndPreComp endprecomp = { .sig = pch_sig }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_ENDPRECOMP); + str8_serial_push_struct(scratch.arena, &srl, &endprecomp); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + debug_p = str8_serial_end(scratch.arena, &srl); + } + String8 debug_t; { String8List srl; @@ -3951,17 +4012,25 @@ T_BeginTest(merge_duplicate_types) CV_Signature sig = CV_Signature_C13; str8_serial_push_struct(scratch.arena, &srl, &sig); + CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 3, sig = pch_sig }; + String8 pch_obj_name = str8_lit("pch.obj"); + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPreComp) + pch_obj_name.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP); + str8_serial_push_struct(scratch.arena, &srl, &precomp); + str8_serial_push_cstr(scratch.arena, &srl, pch_obj_name); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, 4); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); str8_serial_push_struct(scratch.arena, &srl, &proc); - str8_serial_push_align(scratch.arena, &srl, 4); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); debug_t = str8_serial_end(scratch.arena, &srl); } @@ -3978,17 +4047,25 @@ T_BeginTest(merge_duplicate_types) str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, 4); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); str8_serial_push_struct(scratch.arena, &srl, &proc); - str8_serial_push_align(scratch.arena, &srl, 4); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); same_but_different = str8_serial_end(scratch.arena, &srl); } + String8 pch_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_p); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_s); + pch_obj = coff_obj_writer_serialize(scratch.arena, cow); + } + String8 a_obj; { COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -4013,11 +4090,12 @@ T_BeginTest(merge_duplicate_types) String8 entry_obj = t_make_entry_obj(scratch.arena); T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_file(str8_lit("pch.obj"), pch_obj)); T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); T_Ok(t_write_file(str8_lit("c.obj"), c_obj)); - t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe a.obj b.obj c.obj entry.obj"); + t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe a.obj b.obj c.obj pch.obj entry.obj"); T_Ok(g_last_exit_code == 0); } From d1594f796d7b3a2d100989ac22a48c2798d9fa81 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 17 Mar 2026 18:34:17 -0700 Subject: [PATCH 295/850] fix type source for PCH type indices --- src/linker/lnk_debug_info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 70e272e5..1bc63f1e 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -582,7 +582,7 @@ lnk_leaf_ref_from_ti(LNK_CodeViewInput *input, U32 obj_idx, CV_TypeIndexSource s if (contains_1u64(debug_t->pch_ti_range[source], ti)) { leaf_ref = (LNK_LeafRef){ .obj_idx = debug_t->pch_obj_idx, - .leaf_idx = cv_leaf_idx_from_ti(&input->debug_t_arr[debug_t->pch_obj_idx], source, ti) + .leaf_idx = cv_leaf_idx_from_ti(&input->debug_p_arr[debug_t->pch_obj_idx], source, ti) }; } else { U64 ts_idx = input->obj_to_ts[obj_idx]; From fb0b516aa3ce96426acbfafd7cd73f2cbb295930 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 17 Mar 2026 18:34:34 -0700 Subject: [PATCH 296/850] objs use 1 byte alignment for leaf data --- src/codeview/codeview.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index a3f5ee19..f8693d13 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -33,7 +33,7 @@ read_only global CV_TypeId cv_type_id_variadic = 0xFFFFFFFF; //////////////////////////////// //~ Aligns -#define CV_LeafAlign 4 +#define CV_LeafAlign 1 #define CV_SymbolAlign 1 #define CV_C13SubSectionAlign 4 #define CV_FileCheckSumsAlign 4 From 3d805af7df23afd4186aa77f7149072dc29b7f67 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 17 Mar 2026 18:35:09 -0700 Subject: [PATCH 297/850] WIP test PCH type merging --- src/torture/torture_radlink.c | 154 +++++++++++++++++++++++++++++++--- 1 file changed, 143 insertions(+), 11 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 022d0a2e..f5952139 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -3944,8 +3944,10 @@ T_BeginTest(merge_duplicate_types) { { U32 pch_sig = 0xCAFEBABE; + String8 pch_obj_name = str8_lit("C:\\devel\\raddebugger\\build\\torture\\merge_duplicate_types\\pch.obj"); + String8 a_obj_name = str8_lit("C:\\devel\\raddebugger\\build\\torture\\merge_duplicate_types\\a.obj"); - String8 debug_s; + String8 pch_debug_s; { String8List srl; str8_serial_begin(scratch.arena, &srl); @@ -3958,18 +3960,36 @@ T_BeginTest(merge_duplicate_types) CV_SymObjName obj_name = {0}; obj_name.sig = pch_sig; - String8 obj_name_string = str8_lit("a.obj"); + String8 obj_name_string = pch_obj_name; str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); str8_serial_push_struct(scratch.arena, &srl, &obj_name); str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + String8 comp3_data = cv_make_comp3(scratch.arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(scratch.arena, &srl, comp3_data); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + ss_header->kind = CV_C13SubSectionKind_Symbols; ss_header->size = srl.total_size - ss_start_off; str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); - debug_s = str8_serial_end(scratch.arena, &srl); + pch_debug_s = str8_serial_end(scratch.arena, &srl); } String8 debug_p; { @@ -4004,6 +4024,51 @@ T_BeginTest(merge_duplicate_types) debug_p = str8_serial_end(scratch.arena, &srl); } + String8 a_debug_s; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = pch_sig; + String8 obj_name_string = a_obj_name; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(scratch.arena, &srl, &obj_name); + str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + String8 comp3_data = cv_make_comp3(scratch.arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(scratch.arena, &srl, comp3_data); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + + a_debug_s = str8_serial_end(scratch.arena, &srl); + } + String8 debug_t; { String8List srl; @@ -4012,9 +4077,8 @@ T_BeginTest(merge_duplicate_types) CV_Signature sig = CV_Signature_C13; str8_serial_push_struct(scratch.arena, &srl, &sig); - CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 3, sig = pch_sig }; - String8 pch_obj_name = str8_lit("pch.obj"); - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPreComp) + pch_obj_name.size + 1); + CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 2, sig = pch_sig }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + pch_obj_name.size + 1); str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP); str8_serial_push_struct(scratch.arena, &srl, &precomp); str8_serial_push_cstr(scratch.arena, &srl, pch_obj_name); @@ -4035,7 +4099,7 @@ T_BeginTest(merge_duplicate_types) debug_t = str8_serial_end(scratch.arena, &srl); } - String8 same_but_different; + String8 c_debug_t; { String8List srl; str8_serial_begin(scratch.arena, &srl); @@ -4055,14 +4119,79 @@ T_BeginTest(merge_duplicate_types) str8_serial_push_struct(scratch.arena, &srl, &proc); str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); - same_but_different = str8_serial_end(scratch.arena, &srl); + c_debug_t = str8_serial_end(scratch.arena, &srl); + } + + String8 c_debug_s; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + // S_OBJNAME + CV_SymObjName obj_name = {0}; + obj_name.sig = pch_sig; + String8 obj_name_string = a_obj_name; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(scratch.arena, &srl, &obj_name); + str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + // S_COMPILE3 + String8 comp3_data = cv_make_comp3(scratch.arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(scratch.arena, &srl, comp3_data); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + // S_LPROC32 + U16 *foo_size = str8_serial_push_size(scratch.arena, &srl, sizeof(*foo_size)); + U64 foo_off = srl.total_size; + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_LPROC32); + CV_SymProc32 *foo_proc = str8_serial_push_size(scratch.arena, &srl, sizeof(*foo_proc)); + foo_proc->itype = 0x1001; + foo_proc->sec = 1; + foo_proc->len = 1; + str8_serial_push_cstr(scratch.arena, &srl, str8_lit("foo")); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + *foo_size = srl.total_size - foo_off; + + // S_PROC_ID_END + str8_serial_push_u16(scratch.arena, &srl, 2); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_END); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + // $$Symbols header + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + + c_debug_s = str8_serial_end(scratch.arena, &srl); } String8 pch_obj; { COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_p); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_s); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_s); pch_obj = coff_obj_writer_serialize(scratch.arena, cow); } @@ -4070,6 +4199,7 @@ T_BeginTest(merge_duplicate_types) { COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_s); a_obj = coff_obj_writer_serialize(scratch.arena, cow); } @@ -4083,7 +4213,9 @@ T_BeginTest(merge_duplicate_types) String8 c_obj; { COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, same_but_different); + coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_lit((U8[]){ 0xc3 })); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, c_debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, c_debug_s); c_obj = coff_obj_writer_serialize(scratch.arena, cow); } @@ -4095,7 +4227,7 @@ T_BeginTest(merge_duplicate_types) T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); T_Ok(t_write_file(str8_lit("c.obj"), c_obj)); - t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe a.obj b.obj c.obj pch.obj entry.obj"); + t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe pch.obj a.obj c.obj entry.obj"); T_Ok(g_last_exit_code == 0); } From 8a1203ed35c94cf126cf74e3c2047e849dd3aec9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Mar 2026 16:50:06 -0700 Subject: [PATCH 298/850] add mutex around fprintf to linearize log --- src/linker/lnk.c | 13 ++- src/linker/lnk_config.c | 26 +++--- src/linker/lnk_error.c | 147 --------------------------------- src/linker/lnk_error.h | 140 ------------------------------- src/linker/lnk_log.c | 163 ++++++++++++++++++++++++++++++++++++- src/linker/lnk_log.h | 136 +++++++++++++++++++++++++++++++ src/torture/torture_main.c | 2 +- 7 files changed, 317 insertions(+), 310 deletions(-) delete mode 100644 src/linker/lnk_error.c delete mode 100644 src/linker/lnk_error.h diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 122db98a..ac84657d 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -88,7 +88,6 @@ // --- Linker ------------------------------------------------------------------ -#include "lnk_error.h" #include "lnk_log.h" #include "lnk_timer.h" #include "lnk_io.h" @@ -102,7 +101,6 @@ #include "lnk_debug_info.h" #include "lnk.h" -#include "lnk_error.c" #include "lnk_log.c" #include "lnk_timer.c" #include "lnk_io.c" @@ -5069,10 +5067,10 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) if (lnk_get_log_status(LNK_Log_Debug)) { String8 full_cmd_line = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); - fprintf(stderr, "--------------------------------------------------------------------------------\n"); - fprintf(stderr, "Command Line: %.*s\n", str8_varg(full_cmd_line)); - fprintf(stderr, "Work Dir : %.*s\n", str8_varg(config->work_dir)); - fprintf(stderr, "--------------------------------------------------------------------------------\n"); + lnk_fprintf(stderr, "--------------------------------------------------------------------------------\n"); + lnk_fprintf(stderr, "Command Line: %.*s\n", str8_varg(full_cmd_line)); + lnk_fprintf(stderr, "Work Dir : %.*s\n", str8_varg(config->work_dir)); + lnk_fprintf(stderr, "--------------------------------------------------------------------------------\n"); } // @@ -5231,11 +5229,12 @@ internal void entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0,0); - lnk_init_error_handler(); + lnk_log_begin(); LNK_Config *config = lnk_config_from_argcv(scratch.arena, cmdline->argc, cmdline->argv); TP_Context *tp = tp_alloc(scratch.arena, config->worker_count, config->max_worker_count, config->shared_thread_pool_name); TP_Arena *tp_arena = tp_arena_alloc(tp); lnk_run(tp, tp_arena, config); + lnk_log_end(); scratch_end(scratch); } diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 1088368f..7e72e2f1 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -976,10 +976,10 @@ lnk_include_symbol(LNK_Config *config, String8 name, LNK_Obj *obj) internal void lnk_print_build_info() { - fprintf(stdout, " Compiler: %s\n", COMPILER_STRING); - fprintf(stdout, " Mode : %s\n", BUILD_MODE_STRING); - fprintf(stdout, " Date : %s %s\n", __TIME__, __DATE__); - fprintf(stdout, " Version : %s\n", BUILD_VERSION_STRING_LITERAL); + lnk_fprintf(stdout, " Compiler: %s\n", COMPILER_STRING); + lnk_fprintf(stdout, " Mode : %s\n", BUILD_MODE_STRING); + lnk_fprintf(stdout, " Date : %s %s\n", __TIME__, __DATE__); + lnk_fprintf(stdout, " Version : %s\n", BUILD_VERSION_STRING_LITERAL); } internal void @@ -997,13 +997,13 @@ lnk_print_help(void) desc_max_size = Max(desc_max_size, strlen(g_cmd_switch_map[i].desc)); } - fprintf(stdout, "--- Help -------------------------------------------------------------------------------------------------------------------\n"); - fprintf(stdout, " %s\n", BUILD_TITLE_STRING_LITERAL); - fprintf(stdout, "\n"); - fprintf(stdout, " Usage: radlink.exe [Options] [Files] [@rsp]\n"); - fprintf(stdout, "\n"); + lnk_fprintf(stdout, "--- Help -------------------------------------------------------------------------------------------------------------------\n"); + lnk_fprintf(stdout, " %s\n", BUILD_TITLE_STRING_LITERAL); + lnk_fprintf(stdout, "\n"); + lnk_fprintf(stdout, " Usage: radlink.exe [Options] [Files] [@rsp]\n"); + lnk_fprintf(stdout, "\n"); - fprintf(stdout, " Options:\n"); + lnk_fprintf(stdout, " Options:\n"); U64 option_indent_size = 4; U64 option_name_max_size = 60; for EachElement(i, g_cmd_switch_map) { @@ -1047,12 +1047,12 @@ lnk_print_help(void) } String8 line = str8_list_join(temp.arena, &fmt, 0); - fprintf(stdout, "%.*s", str8_varg(line)); + lnk_fprintf(stdout, "%.*s", str8_varg(line)); temp_end(temp); } - fprintf(stdout, "\n"); + lnk_fprintf(stdout, "\n"); scratch_end(scratch); } @@ -2040,7 +2040,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } break; case LNK_CmdSwitch_Rad_Version: { - fprintf(stdout, "%s\n", BUILD_TITLE_STRING_LITERAL); + lnk_fprintf(stdout, "%s\n", BUILD_TITLE_STRING_LITERAL); os_abort(0); } break; diff --git a/src/linker/lnk_error.c b/src/linker/lnk_error.c deleted file mode 100644 index 6a1272ef..00000000 --- a/src/linker/lnk_error.c +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -static LNK_ErrorMode g_error_mode_arr [LNK_Error_Count]; -static LNK_ErrorCodeStatus g_error_code_status_arr[LNK_Error_Count]; -static B32 g_log_status [LNK_Log_Count]; - -internal void -lnk_exit(int code) -{ - exit(code); -} - -internal void -lnk_init_error_handler(void) -{ - for (int i = LNK_Error_StopFirst; i < LNK_Error_StopLast; ++i) { - g_error_mode_arr[i] = LNK_ErrorMode_Stop; - } - for (int i = LNK_Error_First; i < LNK_Error_Last; ++i) { - g_error_mode_arr[i] = LNK_ErrorMode_Continue; - } - for (int i = LNK_Warning_First; i < LNK_Warning_Last; ++i) { - g_error_mode_arr[i] = LNK_ErrorMode_Warn; - } -} - -internal String8 -lnk_string_from_error_mode(LNK_ErrorMode mode) -{ - switch (mode) { - case LNK_ErrorMode_Ignore: return str8_lit("Ignore"); - case LNK_ErrorMode_Continue: return str8_lit("Error"); - case LNK_ErrorMode_Stop: return str8_lit("Error"); - case LNK_ErrorMode_Warn: return str8_lit("Warning"); - } - return str8_zero(); -} - -internal void -lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args) -{ - if (lnk_is_error_code_ignored(code)) { return; } - - Temp scratch = scratch_begin(0,0); - String8 message = push_str8fv(scratch.arena, fmt, args); - String8 string = push_str8f(scratch.arena, "%S(%03d): %S\n", lnk_string_from_error_mode(g_error_mode_arr[code]), code, message); - fprintf(stderr, "%.*s", str8_varg(string)); - scratch_end(scratch); - - if (g_error_mode_arr[code] == LNK_ErrorMode_Stop) { - lnk_exit(code); - } -} - -internal void -lnk_error(LNK_ErrorCode code, char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - lnk_errorfv(code, fmt, args); - va_end(args); -} - -internal void -lnk_error_with_loc_fv(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, va_list args) -{ - Temp scratch = scratch_begin(0, 0); - String8 text = push_str8fv(scratch.arena, fmt, args); - if (obj_path.size) { - if (lib_path.size) { - lnk_error(code, "%S(%S): %S", lib_path, str8_skip_last_slash(obj_path), text); - } else { - lnk_error(code, "%S: %S", obj_path, text); - } - } else { - lnk_error(code, "RADLINK: %S", text); - } - scratch_end(scratch); -} - -internal void -lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...) -{ - va_list args; va_start(args, fmt); - lnk_error_with_loc_fv(code, obj_path, lib_path, fmt, args); - va_end(args); -} - -internal void -lnk_supplement_error(char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - - Temp scratch = scratch_begin(0,0); - String8 string = push_str8fv(scratch.arena, fmt, args); - - fprintf(stderr, "\t"); - fprintf(stderr, "%.*s", str8_varg(string)); - fprintf(stderr, "\n"); - - va_end(args); - scratch_end(scratch); -} - -internal void -lnk_supplement_error_list(String8List list) -{ - for (String8Node *node = list.first; node != 0; node = node->next) { - lnk_supplement_error("%.*s", str8_varg(node->string)); - } -} - -internal void -lnk_ignore_error(LNK_ErrorCode code) -{ - g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Ignore; -} - -internal void -lnk_activate_error(LNK_ErrorCode code) -{ - g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Active; -} - -internal LNK_ErrorCodeStatus -lnk_get_error_code_status(LNK_ErrorCode code) -{ - return g_error_code_status_arr[code]; -} - -internal void -lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...) -{ - Temp scratch = scratch_begin(0,0); - va_list args; - va_start(args, fmt); - - String8 issue = push_str8fv(scratch.arena, fmt, args); - fprintf(stderr, "internal error #%03d in %s:%u\n", code, file, line); - fprintf(stderr, "\t%.*s\n", str8_varg(issue)); - - va_end(args); - scratch_end(scratch); -} - diff --git a/src/linker/lnk_error.h b/src/linker/lnk_error.h deleted file mode 100644 index d7a58531..00000000 --- a/src/linker/lnk_error.h +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma once - -typedef enum -{ - LNK_Error_Null, - - LNK_Error_StopFirst, - LNK_Error_Cmdl, - LNK_Error_EndprecompNotFound, - LNK_Error_EntryPoint, - LNK_Error_ExternalTypeServerConflict, - LNK_Error_FileNotFound, - LNK_Error_IllData, - LNK_Error_IllExport, - LNK_Error_IncomatibleCmdOptions, - LNK_Error_IncompatibleMachine, - LNK_Error_InvalidPrecompLeafCount, - LNK_Error_InvalidStartIndex, - LNK_Error_NoAccess, - LNK_Error_NoSubsystem, - LNK_Error_OutOfExportOrdinals, - LNK_Error_PrecompObjNotFound, - LNK_Error_PrecompSigMismatch, - LNK_Error_Telemetry, - LNK_Error_UnsupportedMachine, - LNK_Error_Mt, - LNK_Error_UnableToSerializeMsf, - LNK_Error_LoadRes, - LNK_Error_IO, - LNK_Error_LargeAddrAwareRequired, - LNK_Error_InvalidPath, - LNK_Error_MultiplyDefinedSymbol, - LNK_Error_SectRefsDiscardedMemory, - LNK_Error_IllegalSectionMerge, - LNK_Error_IllegalRelocation, - LNK_Error_CircularMerge, - LNK_Error_AssociativeLoop, - LNK_Error_AlternateNameConflict, - LNK_Error_RelocationAgainstRemovedSection, - LNK_Error_FailIfMismatch, - LNK_Error_StopLast, - - LNK_Error_First, - LNK_Error_AlreadyDefinedSymbol, - LNK_Error_CvPrecomp, - LNK_Error_Natvis, - LNK_Error_TooManyFiles, - LNK_Error_UnableToOpenTypeServer, - LNK_Error_UnexpectedCodePath, - LNK_Error_CvIllSymbolData, - LNK_Error_InvalidTypeIndex, - LNK_Error_UndefinedIsWeak, - LNK_Error_WeakCycle, - LNK_Error_InvalidLib, - LNK_Error_UnresolvedSymbol, - LNK_Error_Last, - - LNK_Warning_First, - LNK_Warning_InvalidMergeDirectiveFormat, - LNK_Warning_AmbiguousMerge, - LNK_Warning_AtypicalStartIndex, - LNK_Warning_Cmdl, - LNK_Warning_Directive, - LNK_Warning_DuplicateObjPath, - LNK_Warning_ExternalTypeServerAgeMismatch, - LNK_Warning_FileNotFound, - LNK_Warning_IllData, - LNK_Warning_IllExport, - LNK_Warning_InvalidNatvisFileExt, - LNK_Warning_LargePages, - LNK_Warning_LargePagesNotEnabled, - LNK_Warning_MismatchedTypeServerSignature, - LNK_Warning_MissingExternalTypeServer, - LNK_Warning_MultipleDebugTAndDebugP, - LNK_Warning_MultipleExternalTypeServers, - LNK_Warning_MultipleLibMatch, - LNK_Warning_MultiplyDefinedImport, - LNK_Warning_Natvis, - LNK_Warning_PrecompObjSymbolsNotFound, - LNK_Warning_SectionFlagsConflict, - LNK_Warning_Subsystem, - LNK_Warning_UnknownDirective, - LNK_Warning_IllegalDirective, - LNK_Warning_UnresolvedComdat, - LNK_Warning_UnusedDelayLoadDll, - LNK_Warning_LongSectionName, - LNK_Warning_UnknownSwitch, - LNK_Warning_TLSAlign, - LNK_Warning_DirectiveSectionWithRelocs, - LNK_Warning_NoLargeAddressAwarenessForDll, - LNK_Warning_TryingToExportEntryPoint, - LNK_Warning_Last, - - LNK_Error_Count -} LNK_ErrorCode; - -typedef enum -{ - LNK_ErrorMode_Ignore, - LNK_ErrorMode_Stop, - LNK_ErrorMode_Continue, - LNK_ErrorMode_Warn, -} LNK_ErrorMode; - -typedef enum -{ - LNK_InternalError_Null, - LNK_InternalError_NotImplemented, - LNK_InternalError_InvalidPath, - LNK_InternalError_IncompleteSwitch, - LNK_InternalError_OutOfMemory -} LNK_InternalError; - -typedef enum -{ - LNK_ErrorCodeStatus_Active, - LNK_ErrorCodeStatus_Ignore, -} LNK_ErrorCodeStatus; - -internal void lnk_init_error_handler(void); -internal void lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args); -internal void lnk_error(LNK_ErrorCode code, char *fmt, ...); -internal void lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...); -internal void lnk_supplement_error(char *fmt, ...); -internal void lnk_supplement_error_list(String8List list); -internal void lnk_ignore_error(LNK_ErrorCode code); -internal void lnk_activate_error(LNK_ErrorCode code); - -#define lnk_is_error_code_active(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Active) -#define lnk_is_error_code_ignored(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Ignore) -internal LNK_ErrorCodeStatus lnk_get_error_code_status(LNK_ErrorCode code); - -internal void lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...); -#define lnk_invalid_path(...) lnk_internal_error(LNK_InternalError_InvalidPath, __FILE__, __LINE__, __VA_ARGS__) -#define lnk_not_implemented(...) lnk_internal_error(LNK_InternalError_NotImplemented, __FILE__, __LINE__, __VA_ARGS__) -#define lnk_incomplete_switch(...) lnk_internal_error(LNK_InternalError_IncompleteSwitch, __FILE__, __LINE__, __VA_ARGS__) - diff --git a/src/linker/lnk_log.c b/src/linker/lnk_log.c index 1904996c..17777ec0 100644 --- a/src/linker/lnk_log.c +++ b/src/linker/lnk_log.c @@ -1,6 +1,165 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +static Mutex g_log_mutex; +static B32 g_log_status [LNK_Log_Count]; +static LNK_ErrorMode g_error_mode_arr [LNK_Error_Count]; +static LNK_ErrorCodeStatus g_error_code_status_arr[LNK_Error_Count]; + +internal void +lnk_fprintf(FILE *f, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + mutex_take(g_log_mutex); + fprintf(f, "%.*s", str8_varg(string)); + mutex_drop(g_log_mutex); + va_end(args); + scratch_end(scratch); +} + +internal void +lnk_exit(int code) +{ + mutex_take(g_log_mutex); + fflush(stdout); + fflush(stderr); + _exit(code); + InvalidPath; +} + +internal void +lnk_log_begin(void) +{ + for (int i = LNK_Error_StopFirst; i < LNK_Error_StopLast; ++i) { g_error_mode_arr[i] = LNK_ErrorMode_Stop; } + for (int i = LNK_Error_ContinueFirst; i < LNK_Error_ContinueLast; ++i) { g_error_mode_arr[i] = LNK_ErrorMode_Continue; } + for (int i = LNK_Warning_First; i < LNK_Warning_Last; ++i) { g_error_mode_arr[i] = LNK_ErrorMode_Warn; } + g_log_mutex = mutex_alloc(); +} + +internal void +lnk_log_end(void) +{ + mutex_release(g_log_mutex); +} + +internal String8 +lnk_string_from_error_mode(LNK_ErrorMode mode) +{ + switch (mode) { + case LNK_ErrorMode_Ignore: return str8_lit("Ignore"); + case LNK_ErrorMode_Continue: return str8_lit("Error"); + case LNK_ErrorMode_Stop: return str8_lit("Error"); + case LNK_ErrorMode_Warn: return str8_lit("Warning"); + } + return str8_zero(); +} + +internal void +lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args) +{ + if (lnk_is_error_code_ignored(code)) { return; } + Temp scratch = scratch_begin(0,0); + String8 message = push_str8fv(scratch.arena, fmt, args); + lnk_fprintf(stderr, "%S(%03d): %S\n", lnk_string_from_error_mode(g_error_mode_arr[code]), code, message); + scratch_end(scratch); + if (g_error_mode_arr[code] == LNK_ErrorMode_Stop) { lnk_exit(code); } +} + +internal void +lnk_error(LNK_ErrorCode code, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + lnk_errorfv(code, fmt, args); + va_end(args); +} + +internal void +lnk_error_with_loc_fv(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, va_list args) +{ + Temp scratch = scratch_begin(0, 0); + String8 text = push_str8fv(scratch.arena, fmt, args); + if (obj_path.size) { + if (lib_path.size) { + lnk_error(code, "%S(%S): %S", lib_path, str8_skip_last_slash(obj_path), text); + } else { + lnk_error(code, "%S: %S", obj_path, text); + } + } else { + lnk_error(code, "RADLINK: %S", text); + } + scratch_end(scratch); +} + +internal void +lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...) +{ + va_list args; va_start(args, fmt); + lnk_error_with_loc_fv(code, obj_path, lib_path, fmt, args); + va_end(args); +} + +internal void +lnk_supplement_error(char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + Temp scratch = scratch_begin(0,0); + String8 string = push_str8fv(scratch.arena, fmt, args); + + lnk_fprintf(stderr, "\t"); + lnk_fprintf(stderr, "%.*s", str8_varg(string)); + lnk_fprintf(stderr, "\n"); + + va_end(args); + scratch_end(scratch); +} + +internal void +lnk_supplement_error_list(String8List list) +{ + for (String8Node *node = list.first; node != 0; node = node->next) { + lnk_supplement_error("%.*s", str8_varg(node->string)); + } +} + +internal void +lnk_ignore_error(LNK_ErrorCode code) +{ + g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Ignore; +} + +internal void +lnk_activate_error(LNK_ErrorCode code) +{ + g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Active; +} + +internal LNK_ErrorCodeStatus +lnk_get_error_code_status(LNK_ErrorCode code) +{ + return g_error_code_status_arr[code]; +} + +internal void +lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + + String8 issue = push_str8fv(scratch.arena, fmt, args); + lnk_fprintf(stderr, "internal error #%03d in %s:%u\n", code, file, line); + lnk_fprintf(stderr, "\t%.*s\n", str8_varg(issue)); + + va_end(args); + scratch_end(scratch); +} + internal void lnk_set_log_status(LNK_LogType type, B32 is_enabled) { @@ -23,7 +182,7 @@ lnk_log(LNK_LogType type, char *fmt, ...) va_list args; va_start(args, fmt); String8 string = push_str8fv(scratch.arena, fmt, args); - fprintf(stdout, "%.*s\n", str8_varg(string)); + lnk_fprintf(stdout, "%.*s\n", str8_varg(string)); va_end(args); scratch_end(scratch); } @@ -49,7 +208,7 @@ lnk_log_type_from_string(String8 string) }; Assert(ArrayCount(map) == LNK_Log_Count); - for (U64 i = 0; i < ArrayCount(map); ++i) { + for EachElement(i, map) { if (str8_match(str8_cstring(map[i].name), string, StringMatchFlag_CaseInsensitive)) { return map[i].type; } diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index a1e24157..c92b0e52 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -18,9 +18,145 @@ typedef enum LNK_Log_Count } LNK_LogType; +typedef enum +{ + LNK_Error_Null, + + LNK_Error_StopFirst, + LNK_Error_Cmdl, + LNK_Error_EndprecompNotFound, + LNK_Error_EntryPoint, + LNK_Error_ExternalTypeServerConflict, + LNK_Error_FileNotFound, + LNK_Error_IllData, + LNK_Error_IllExport, + LNK_Error_IncomatibleCmdOptions, + LNK_Error_IncompatibleMachine, + LNK_Error_InvalidPrecompLeafCount, + LNK_Error_InvalidStartIndex, + LNK_Error_NoAccess, + LNK_Error_NoSubsystem, + LNK_Error_OutOfExportOrdinals, + LNK_Error_PrecompObjNotFound, + LNK_Error_Telemetry, + LNK_Error_UnsupportedMachine, + LNK_Error_Mt, + LNK_Error_UnableToSerializeMsf, + LNK_Error_LoadRes, + LNK_Error_IO, + LNK_Error_LargeAddrAwareRequired, + LNK_Error_InvalidPath, + LNK_Error_MultiplyDefinedSymbol, + LNK_Error_SectRefsDiscardedMemory, + LNK_Error_IllegalSectionMerge, + LNK_Error_IllegalRelocation, + LNK_Error_CircularMerge, + LNK_Error_AssociativeLoop, + LNK_Error_AlternateNameConflict, + LNK_Error_RelocationAgainstRemovedSection, + LNK_Error_FailIfMismatch, + LNK_Error_StopLast, + + LNK_Error_ContinueFirst, + LNK_Error_AlreadyDefinedSymbol, + LNK_Error_CvPrecomp, + LNK_Error_Natvis, + LNK_Error_TooManyFiles, + LNK_Error_UnableToOpenTypeServer, + LNK_Error_UnexpectedCodePath, + LNK_Error_CvIllSymbolData, + LNK_Error_InvalidTypeIndex, + LNK_Error_UndefinedIsWeak, + LNK_Error_WeakCycle, + LNK_Error_InvalidLib, + LNK_Error_UnresolvedSymbol, + LNK_Error_PrecompSigMismatch, + LNK_Error_ContinueLast, + + LNK_Warning_First, + LNK_Warning_InvalidMergeDirectiveFormat, + LNK_Warning_AmbiguousMerge, + LNK_Warning_AtypicalStartIndex, + LNK_Warning_Cmdl, + LNK_Warning_Directive, + LNK_Warning_DuplicateObjPath, + LNK_Warning_ExternalTypeServerAgeMismatch, + LNK_Warning_FileNotFound, + LNK_Warning_IllData, + LNK_Warning_IllExport, + LNK_Warning_InvalidNatvisFileExt, + LNK_Warning_LargePages, + LNK_Warning_LargePagesNotEnabled, + LNK_Warning_MismatchedTypeServerSignature, + LNK_Warning_MissingExternalTypeServer, + LNK_Warning_MultipleDebugTAndDebugP, + LNK_Warning_MultipleExternalTypeServers, + LNK_Warning_MultipleLibMatch, + LNK_Warning_MultiplyDefinedImport, + LNK_Warning_Natvis, + LNK_Warning_PrecompObjSymbolsNotFound, + LNK_Warning_SectionFlagsConflict, + LNK_Warning_Subsystem, + LNK_Warning_UnknownDirective, + LNK_Warning_IllegalDirective, + LNK_Warning_UnresolvedComdat, + LNK_Warning_UnusedDelayLoadDll, + LNK_Warning_LongSectionName, + LNK_Warning_UnknownSwitch, + LNK_Warning_TLSAlign, + LNK_Warning_DirectiveSectionWithRelocs, + LNK_Warning_NoLargeAddressAwarenessForDll, + LNK_Warning_TryingToExportEntryPoint, + LNK_Warning_Last, + + LNK_Error_Count +} LNK_ErrorCode; + +typedef enum +{ + LNK_ErrorMode_Ignore, + LNK_ErrorMode_Stop, + LNK_ErrorMode_Continue, + LNK_ErrorMode_Warn, +} LNK_ErrorMode; + +typedef enum +{ + LNK_InternalError_Null, + LNK_InternalError_NotImplemented, + LNK_InternalError_InvalidPath, + LNK_InternalError_IncompleteSwitch, + LNK_InternalError_OutOfMemory +} LNK_InternalError; + +typedef enum +{ + LNK_ErrorCodeStatus_Active, + LNK_ErrorCodeStatus_Ignore, +} LNK_ErrorCodeStatus; + +internal void lnk_log_begin(void); +internal void lnk_log_end(void); internal void set_log_level(LNK_LogType type, B32 is_enabled); internal B32 lnk_get_log_status(LNK_LogType type); internal void lnk_log(LNK_LogType type, char *fmt, ...); +internal void lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args); +internal void lnk_error(LNK_ErrorCode code, char *fmt, ...); +internal void lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...); +internal void lnk_supplement_error(char *fmt, ...); +internal void lnk_supplement_error_list(String8List list); +internal void lnk_ignore_error(LNK_ErrorCode code); +internal void lnk_activate_error(LNK_ErrorCode code); + internal LNK_LogType lnk_log_type_from_string(String8 string); +#define lnk_is_error_code_active(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Active) +#define lnk_is_error_code_ignored(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Ignore) +internal LNK_ErrorCodeStatus lnk_get_error_code_status(LNK_ErrorCode code); + +internal void lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...); +#define lnk_invalid_path(...) lnk_internal_error(LNK_InternalError_InvalidPath, __FILE__, __LINE__, __VA_ARGS__) +#define lnk_not_implemented(...) lnk_internal_error(LNK_InternalError_NotImplemented, __FILE__, __LINE__, __VA_ARGS__) +#define lnk_incomplete_switch(...) lnk_internal_error(LNK_InternalError_IncompleteSwitch, __FILE__, __LINE__, __VA_ARGS__) + diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index b817b229..fec9f504 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -40,7 +40,7 @@ #include "linker/codeview_ext/codeview.h" #include "linker/lnk_cmd_line.h" #include "linker/lnk_cmd_line.c" -#include "linker/lnk_error.h" +#include "linker/lnk_log.h" #include "torture.h" #include "torture_radlink.h" From 44a0efd207315b1601a266d848a4f69391a93f1e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Mar 2026 17:14:52 -0700 Subject: [PATCH 299/850] test mismatched PCH signatures and presence of .debug$P and .debug$T in same obj --- src/linker/lnk_debug_info.c | 50 ++--- src/linker/lnk_debug_info.h | 1 - src/torture/torture.c | 19 +- src/torture/torture_radlink.c | 339 +++++++++++++++++++++++++++++++++- 4 files changed, 368 insertions(+), 41 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 1bc63f1e..3599d86c 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -280,8 +280,8 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } ProfBegin("Parse CodeView"); + CV_DebugT *debug_p_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_p_list_arr); input.debug_s_arr = lnk_parse_debug_s_sections(tp, tp_arena, obj_count, obj_arr, debug_s_list_arr); - input.debug_p_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_p_list_arr); input.debug_t_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_t_list_arr); input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, obj_count); // TODO: collect & parse .debug$H ProfEnd(); @@ -324,17 +324,20 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla input.int_obj_indices.v = push_array(tp_arena->v[0], U32, obj_count); for EachIndex(obj_idx, obj_count) { CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; - CV_DebugT *debug_p = &input.debug_p_arr[obj_idx]; + CV_DebugT *debug_p = &debug_p_arr[obj_idx]; U32Array *arr_ptr; - - if (debug_t->count && debug_p->count) { - lnk_error_obj(LNK_Warning_MultipleDebugTAndDebugP, obj_arr[obj_idx], "multiple sections with debug types detected, obj must have either .debug$T or .debug$P (using .debug$T for type server)"); - } - - if (debug_p->count > 0) { arr_ptr = &input.debug_p_indices; } - else if (cv_debug_t_is_type_server_ref(debug_t)) { arr_ptr = &input.ext_obj_indices; } - else { arr_ptr = &input.int_obj_indices; } + if (debug_p->count > 0 && debug_t->count == 0) { arr_ptr = &input.debug_p_indices; } + else if (cv_debug_t_is_type_server_ref(debug_t)) { arr_ptr = &input.ext_obj_indices; } + else { arr_ptr = &input.int_obj_indices; } arr_ptr->v[arr_ptr->count++] = obj_idx; + + if (debug_t->count == 0 && debug_p->count > 0) { + *debug_t = *debug_p; + } else if (debug_t->count && debug_p->count) { + lnk_error_obj(LNK_Warning_MultipleDebugTAndDebugP, obj_arr[obj_idx], "multiple sections with debug types detected, obj must have either .debug$T or .debug$P; discarding both sections"); + MemoryZeroStruct(debug_t); + MemoryZeroStruct(debug_p); + } } ProfScope("Set up type servers") @@ -398,7 +401,6 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla input.count += ts_arr.count; input.obj_arr = push_array(tp_arena->v[0], LNK_Obj *, input.count); input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, input.count); - input.debug_p_arr = push_array(tp_arena->v[0], CV_DebugT, input.count); input.debug_t_arr = push_array(tp_arena->v[0], CV_DebugT, input.count); input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, input.count); input.parsed_symbols = push_array(tp_arena->v[0], CV_SymbolListArray, input.count); @@ -406,7 +408,6 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla MemoryCopyTyped(input.obj_arr, prev.obj_arr, prev.count); MemoryCopyTyped(input.debug_s_arr, prev.debug_s_arr, prev.count); - MemoryCopyTyped(input.debug_p_arr, prev.debug_p_arr, prev.count); MemoryCopyTyped(input.debug_t_arr, prev.debug_t_arr, prev.count); MemoryCopyTyped(input.parsed_symbols, prev.parsed_symbols, prev.count); MemoryCopyTyped(input.obj_to_ts, prev.obj_to_ts, prev.count); @@ -494,21 +495,21 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } // get PCH leaf data - CV_DebugT *debug_p = &input.debug_p_arr[debug_p_obj_idx]; + CV_DebugT *debug_p = &input.debug_t_arr[debug_p_obj_idx]; // error check LF_PRECOMP if (precomp.start_index > CV_MinComplexTypeIndex) { lnk_error_obj(LNK_Warning_AtypicalStartIndex, obj, "atypical start index 0x%x in LF_PRECOMP", precomp.start_index); } if (precomp.start_index < CV_MinComplexTypeIndex) { lnk_error_obj(LNK_Error_InvalidStartIndex, obj, "invalid start index 0x%x in LF_PRECOMP; must be >= 0x%x", precomp.start_index, CV_MinComplexTypeIndex); continue; } - if (precomp.leaf_count > debug_p->count) { lnk_error_obj(LNK_Error_InvalidPrecompLeafCount, obj, "leaf count %u LF_PRECOMP exceeds leaf count %u in .debug$P in %S", precomp.leaf_count, debug_p->count, obj_arr[debug_p_obj_idx]->path); continue; } + if (precomp.leaf_count >= debug_p->count) { lnk_error_obj(LNK_Error_InvalidPrecompLeafCount, obj, "leaf count %u LF_PRECOMP exceeds leaf count %u in .debug$P in %S", precomp.leaf_count, debug_p->count, obj_arr[debug_p_obj_idx]->path); continue; } // get LF_PRECOMP - CV_Leaf endprecomp_leaf = cv_debug_t_get_leaf(debug_p, precomp.leaf_count-1); + CV_Leaf endprecomp_leaf = cv_debug_t_get_leaf(debug_p, precomp.leaf_count); CV_LeafEndPreComp *endprecomp = str8_deserial_get_raw_ptr(endprecomp_leaf.data, 0, sizeof(*endprecomp)); // error check LF_ENDPRECOMP if (endprecomp_leaf.kind != CV_LeafKind_ENDPRECOMP) { lnk_error_obj(LNK_Error_EndprecompNotFound, obj, "missing LF_ENDPRECOMP [0x%x] in %S", precomp.leaf_count, obj_arr[debug_p_obj_idx]->path); continue; } if (endprecomp_leaf.data.size != sizeof(CV_LeafEndPreComp)) { lnk_error_obj(LNK_Error_IllData, obj, "invalid size 0x%x for LF_ENDPRECOMP", endprecomp_leaf.data.size); continue; } - if (endprecomp->sig != precomp.sig) { lnk_error_obj(LNK_Error_PrecompSigMismatch, obj, "signature mismatch between LF_PRECOMP(0x%x) and LF_ENDPRECOMP(0x%x); precomp obj %S", precomp.sig, endprecomp->sig, obj_arr[debug_p_obj_idx]->path); continue; } + if (endprecomp->sig != precomp.sig) { lnk_error_obj(LNK_Error_PrecompSigMismatch, obj, "PCH signature mismatch, expected 0x%x got 0x%x; PCH obj %S", precomp.sig, endprecomp->sig, obj_arr[debug_p_obj_idx]->path); continue; } { // PCH and OBJ signatures must match String8List symbols = cv_sub_section_from_debug_s(input.debug_s_arr[debug_p_obj_idx], CV_C13SubSectionKind_Symbols); @@ -538,13 +539,13 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla // remove CV_LeafKind_ENDPRECOMP from .debug$P for EachIndex(i, input.debug_p_indices.count) { U64 debug_p_idx = input.debug_p_indices.v[i]; - CV_DebugT *debug_p = &input.debug_p_arr[debug_p_idx]; + CV_DebugT *debug_p = &input.debug_t_arr[debug_p_idx]; for EachIndex(i, debug_p->count) { U64 lf_idx = debug_p->count - (i + 1); CV_LeafHeader *lf = cv_debug_t_get_leaf_header(debug_p, lf_idx); if (lf->kind == CV_LeafKind_ENDPRECOMP) { memory_write16(&lf->kind, CV_LeafKind_NOTYPE); - memory_write16(&lf->size, 0); + memory_write16(&lf->size, sizeof(CV_LeafKind)); break; } } @@ -582,7 +583,7 @@ lnk_leaf_ref_from_ti(LNK_CodeViewInput *input, U32 obj_idx, CV_TypeIndexSource s if (contains_1u64(debug_t->pch_ti_range[source], ti)) { leaf_ref = (LNK_LeafRef){ .obj_idx = debug_t->pch_obj_idx, - .leaf_idx = cv_leaf_idx_from_ti(&input->debug_p_arr[debug_t->pch_obj_idx], source, ti) + .leaf_idx = cv_leaf_idx_from_ti(&input->debug_t_arr[debug_t->pch_obj_idx], source, ti) }; } else { U64 ts_idx = input->obj_to_ts[obj_idx]; @@ -1366,17 +1367,16 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) { ProfBegin("Alloc Hashes"); U32Array indices[] = { - input->int_obj_indices, input->debug_p_indices, - input->type_server_indices - // TODO: explain - // input->ext_obj_indices, + input->int_obj_indices, + input->type_server_indices, }; for EachElement(i, indices) { for EachIndex(k, indices[i].count) { U64 obj_idx = indices[i].v[k]; + CV_DebugT *debug_t = &input->debug_t_arr[obj_idx]; CV_DebugH *debug_h = &input->debug_h_arr[obj_idx]; - debug_h->count = input->debug_t_arr[obj_idx].count; + debug_h->count = debug_t->count; debug_h->v = push_array(scratch.arena, U64, debug_h->count); } } @@ -1423,7 +1423,7 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) for EachIndex(obj_idx, input->count) { total_count += input->debug_t_arr[obj_idx].source_counts[ti_source]; } task.leaf_ht_arr[ti_source].cap = total_count; - task.leaf_ht_arr[ti_source].cap = (task.leaf_ht_arr[ti_source].cap * 13) / 10; // * 1.3 + task.leaf_ht_arr[ti_source].cap = 1 + ((task.leaf_ht_arr[ti_source].cap * 13) / 10); // * 1.3 task.leaf_ht_arr[ti_source].bucket_arr = push_array(scratch.arena, LNK_LeafRef *, task.leaf_ht_arr[ti_source].cap); #if PROFILE_TELEMETRY diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index eb8364d7..e37c2500 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -59,7 +59,6 @@ typedef struct U64 count; LNK_Obj **obj_arr; CV_DebugS *debug_s_arr; - CV_DebugT *debug_p_arr; CV_DebugT *debug_t_arr; CV_DebugH *debug_h_arr; U64 *obj_to_ts; diff --git a/src/torture/torture.c b/src/torture/torture.c index 56bdd816..7bae4739 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -213,20 +213,27 @@ t_invoke(String8 exe_path, String8 cmdline, U64 timeout) return t_invoke_(exe_path, cmdline, timeout, 0, 0); } -internal B32 -t_match_line(String8 *output, String8 expected_line) +internal String8 +t_chop_line(String8 *output) { U64 new_line_pos = str8_find_needle(*output, 0, str8_lit("\n"), 0); String8 line = str8_prefix(*output, new_line_pos); if (str8_ends_with(line, str8_lit("\r"), 0)) { line = str8_chop(line, 1); } + *output = str8_skip(*output, new_line_pos + 1); + return line; +} - B32 is_match = str8_match(line, expected_line, 0); - if (is_match) { - *output = str8_skip(*output, new_line_pos + 1); +internal B32 +t_match_line(String8 *output, String8 expected_line) +{ + String8 before_chop = *output; + String8 line = t_chop_line(output); + B32 is_match = str8_match(line, expected_line, 0); + if ( ! is_match) { + *output = before_chop; } - return is_match; } diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index f5952139..3a344134 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -3940,12 +3940,323 @@ T_BeginTest(long_section_name) } T_EndTest; +T_BeginTest(debug_p_sig_mismatch) +{ + String8 a_obj_name = str8_lit("a.obj"); + String8 b_obj_name = str8_lit("b.obj"); + U32 a_sig = 0xCAFEBABE; + U32 b_sig = 0xDEADBEEF; + + String8 a_debug_s; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = a_sig; + String8 obj_name_string = a_obj_name; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(scratch.arena, &srl, &obj_name); + str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + String8 comp3_data = cv_make_comp3(scratch.arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(scratch.arena, &srl, comp3_data); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + + a_debug_s = str8_serial_end(scratch.arena, &srl); + } + String8 a_debug_p; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + // signature + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + // duplicate in a.obj + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(scratch.arena, &srl, &ptr); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + // unique procedure type + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearPascal }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(proc)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(scratch.arena, &srl, &proc); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + // PCH ender + CV_LeafEndPreComp endprecomp = { .sig = a_sig }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_ENDPRECOMP); + str8_serial_push_struct(scratch.arena, &srl, &endprecomp); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + a_debug_p = str8_serial_end(scratch.arena, &srl); + } + + String8 b_debug_s; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = b_sig; + String8 obj_name_string = a_obj_name; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(scratch.arena, &srl, &obj_name); + str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + String8 comp3_data = cv_make_comp3(scratch.arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(scratch.arena, &srl, comp3_data); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + + b_debug_s = str8_serial_end(scratch.arena, &srl); + } + + String8 b_debug_t; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 2, sig = b_sig }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + a_obj_name.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP); + str8_serial_push_struct(scratch.arena, &srl, &precomp); + str8_serial_push_cstr(scratch.arena, &srl, a_obj_name); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(scratch.arena, &srl, &ptr); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(scratch.arena, &srl, &proc); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + b_debug_t = str8_serial_end(scratch.arena, &srl); + } + + String8 a_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_p); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_s); + a_obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + String8 b_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, b_debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, b_debug_s); + b_obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); + T_Ok(t_write_entry_obj()); + + String8 output = {0}; + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full a.obj b.obj entry.obj"), max_U64, scratch.arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 found_error = 0; + String8 a_obj_path = t_make_file_path(scratch.arena, str8_lit("a.obj")); + String8 b_obj_path = t_make_file_path(scratch.arena, str8_lit("b.obj")); + String8 expected_line = str8f(scratch.arena, "Error(%03d): %S: PCH signature mismatch, expected 0x%x got 0x%x; PCH obj %S", LNK_Error_PrecompSigMismatch, b_obj_path, b_sig, a_sig, a_obj_path); + while (output.size) { + String8 line = t_chop_line(&output); + found_error = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive); + if (found_error) { break; } + } + T_Ok(found_error); +} +T_EndTest; + +T_BeginTest(debug_p_and_debug_t_in_obj) +{ + U32 pch_sig = 0xCAFEBABE; + String8 pch_obj_name = str8_lit("pch.obj"); + + String8 pch_debug_s; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = pch_sig; + String8 obj_name_string = pch_obj_name; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(scratch.arena, &srl, &obj_name); + str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); + str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + + pch_debug_s = str8_serial_end(scratch.arena, &srl); + } + + String8 pch_debug_p; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + // signature + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(scratch.arena, &srl, &ptr); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + // PCH ender + CV_LeafEndPreComp endprecomp = { .sig = pch_sig }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_ENDPRECOMP); + str8_serial_push_struct(scratch.arena, &srl, &endprecomp); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + pch_debug_p = str8_serial_end(scratch.arena, &srl); + } + + String8 pch_debug_t; + { + String8List srl; + str8_serial_begin(scratch.arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(scratch.arena, &srl, &sig); + + CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 1, sig = pch_sig }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + pch_obj_name.size + 1); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP); + str8_serial_push_struct(scratch.arena, &srl, &precomp); + str8_serial_push_cstr(scratch.arena, &srl, pch_obj_name); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(scratch.arena, &srl, &ptr); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; + str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(scratch.arena, &srl, &proc); + str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + + pch_debug_t = str8_serial_end(scratch.arena, &srl); + } + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_p); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_s); + String8 raw_coff = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("pch.obj"), raw_coff)); + T_Ok(t_write_entry_obj()); + String8 output = {0}; + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full pch.obj entry.obj"), max_U64, scratch.arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 found_warning = 0; + String8 pch_obj_path = t_make_file_path(scratch.arena, str8_lit("pch.obj")); + String8 expected_line = str8f(scratch.arena, "Warning(%03d): %S: multiple sections with debug types detected, obj must have either .debug$T or .debug$P; discarding both sections", LNK_Warning_MultipleDebugTAndDebugP, pch_obj_path); + while (output.size) { + String8 line = t_chop_line(&output); + found_warning = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive); + if (found_warning) { break; } + } + T_Ok(found_warning); +} +T_EndTest; + T_BeginTest(merge_duplicate_types) { { - U32 pch_sig = 0xCAFEBABE; - String8 pch_obj_name = str8_lit("C:\\devel\\raddebugger\\build\\torture\\merge_duplicate_types\\pch.obj"); - String8 a_obj_name = str8_lit("C:\\devel\\raddebugger\\build\\torture\\merge_duplicate_types\\a.obj"); + U32 pch_sig = 0xCAFEBABE; + String8 pch_obj_name = str8_lit("pch.obj"); + String8 a_obj_name = str8_lit("a.obj"); + String8 c_obj_name = str8_lit("c.obj"); String8 pch_debug_s; { @@ -4136,7 +4447,7 @@ T_BeginTest(merge_duplicate_types) // S_OBJNAME CV_SymObjName obj_name = {0}; obj_name.sig = pch_sig; - String8 obj_name_string = a_obj_name; + String8 obj_name_string = c_obj_name; str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); str8_serial_push_struct(scratch.arena, &srl, &obj_name); @@ -4227,7 +4538,7 @@ T_BeginTest(merge_duplicate_types) T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); T_Ok(t_write_file(str8_lit("c.obj"), c_obj)); - t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe pch.obj a.obj c.obj entry.obj"); + t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe pch.obj a.obj b.obj c.obj entry.obj"); T_Ok(g_last_exit_code == 0); } @@ -4247,7 +4558,7 @@ T_BeginTest(merge_duplicate_types) PDB_TpiParsed *tpi = pdb_tpi_from_data(scratch.arena, tpi_data); U64 type_count = tpi->itype_opl - tpi->itype_first; - T_Ok(type_count == 4); + T_Ok(type_count == 5); CV_DebugT debug_t = cv_debug_t_from_data(scratch.arena, pdb_leaf_data_from_tpi(tpi), 4); T_Ok(debug_t.count == type_count); @@ -4267,13 +4578,23 @@ T_BeginTest(merge_duplicate_types) T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure)); + CV_LeafProcedure *proc = (CV_LeafProcedure *)proc_leaf.data.str; + T_Ok(proc->ret_itype == 0x1000); + T_Ok(proc->call_kind == CV_CallKind_NearPascal); + } + + { + CV_Leaf proc_leaf = cv_debug_t_get_leaf(&debug_t, 2); + T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); + T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure)); + CV_LeafProcedure *proc = (CV_LeafProcedure *)proc_leaf.data.str; T_Ok(proc->ret_itype == 0x1000); T_Ok(proc->call_kind == CV_CallKind_NearC); } { - CV_Leaf ptr_leaf = cv_debug_t_get_leaf(&debug_t, 2); + CV_Leaf ptr_leaf = cv_debug_t_get_leaf(&debug_t, 3); T_Ok(ptr_leaf.kind == CV_LeafKind_POINTER); T_Ok(ptr_leaf.data.size == sizeof(CV_LeafPointer)); @@ -4283,12 +4604,12 @@ T_BeginTest(merge_duplicate_types) } { - CV_Leaf proc_leaf = cv_debug_t_get_leaf(&debug_t, 3); + CV_Leaf proc_leaf = cv_debug_t_get_leaf(&debug_t, 4); T_Ok(proc_leaf.kind == CV_LeafKind_PROCEDURE); T_Ok(proc_leaf.data.size == sizeof(CV_LeafProcedure)); CV_LeafProcedure *proc = (CV_LeafProcedure *)proc_leaf.data.str; - T_Ok(proc->ret_itype == 0x1002); + T_Ok(proc->ret_itype == 0x1003); T_Ok(proc->call_kind == CV_CallKind_NearC); } } From b764a838df15161e909441bef080f98007206df0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Mar 2026 17:23:50 -0700 Subject: [PATCH 300/850] build meta for torture run; fix base core in metagen --- .github/workflows/builds.yml | 2 +- src/base/base_core.h | 2 -- src/metagen/metagen_base/metagen_base_core.h | 10 +++++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index ccca9083..ba444da3 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -47,6 +47,6 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build asan debug torture radlink radbin || exit /b 1 + call build asan debug meta torture radlink radbin || exit /b 1 cd build torture || exit /b 1 diff --git a/src/base/base_core.h b/src/base/base_core.h index 6cc94a5c..a644d1a7 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -370,8 +370,6 @@ CheckNil(nil,p) ? \ # if defined(__SANITIZE_ADDRESS__) # define ASAN_ENABLED 1 # define ASAN_NO_ADDR __declspec(no_sanitize_address) -# else -# define UBSAN_NO_ALIGN # endif #elif COMPILER_CLANG # if defined(__has_feature) diff --git a/src/metagen/metagen_base/metagen_base_core.h b/src/metagen/metagen_base/metagen_base_core.h index 4a5277bf..f76e2693 100644 --- a/src/metagen/metagen_base/metagen_base_core.h +++ b/src/metagen/metagen_base/metagen_base_core.h @@ -291,8 +291,6 @@ CheckNil(nil,p) ? \ # if defined(__SANITIZE_ADDRESS__) # define ASAN_ENABLED 1 # define ASAN_NO_ADDR __declspec(no_sanitize_address) -# else -# define UBSAN_NO_ALIGN # endif #elif COMPILER_CLANG # if defined(__has_feature) @@ -304,8 +302,14 @@ CheckNil(nil,p) ? \ # define UBSAN_NO_ALIGN __attribute__((no_sanitize("alignment"))) #endif +#ifndef ASAN_NO_ADDR +# define ASAN_NO_ADDR +#endif +#ifndef UBSAN_NO_ALIGN +# define UBSAN_NO_ALIGN +#endif + #if ASAN_ENABLED -#pragma comment(lib, "clang_rt.asan-x86_64.lib") C_LINKAGE void __asan_poison_memory_region(void const volatile *addr, size_t size); C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t size); # define AsanPoisonMemoryRegion(addr, size) __asan_poison_memory_region((addr), (size)) From ec1619f357a3b506733c90bae8087f362c6b0ad8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Mar 2026 17:28:02 -0700 Subject: [PATCH 301/850] ASAN freaks out when threads access foreign stack --- src/rdi_make/rdi_make_local.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 7301c26e..9a3a669b 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -945,8 +945,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: wide bake ProfScope("wide bake") { - U64 line_table_block_take_counter_ = 0; - U64 *line_table_block_take_counter = &line_table_block_take_counter_; + U64 *line_table_block_take_counter = push_array(scratch.arena, U64, 1); lane_sync_u64(&line_table_block_take_counter, 0); U64 line_table_block_size = 4096; U64 line_table_block_count = (line_tables_count + line_table_block_size - 1) / line_table_block_size; @@ -2096,8 +2095,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_SortKey **bake_src_line_map_keys = 0; ProfScope("sort line-bucketed src line map data") { - U64 map_take_idx_ = 0; - U64 *map_take_idx = &map_take_idx_; + U64 *map_take_idx = push_array(scratch.arena, U64, 1); U64 map_count = params->src_files.total_count; if(lane_idx() == 0) { From f703699a59c8cd0e8c7766f08c0da111831471a0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Mar 2026 17:37:56 -0700 Subject: [PATCH 302/850] for mule build tell clang to write objs with .obj extension --- build.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.bat b/build.bat index f1828547..d68d95fe 100644 --- a/build.bat +++ b/build.bat @@ -148,7 +148,7 @@ if "%convertperf%"=="1" set didbuild=1 && %compile% ..\src\scratc if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\debugstringperf.c %compile_link% %out%debugstringperf.exe || exit /b 1 if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% %out%parse_inline_sites.exe || exit /b 1 if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_lib_debug\strip_lib_debug.c %compile_link% %out%strip_lib_debug.exe || exit /b 1 -if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 +if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp %out%mule_inline.obj && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp %out%mule_o2.obj && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1 if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% %out%torture.exe || exit /b1 From 91b50bab00f6d2b3b93ef1c4850db46ebb76116b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Mar 2026 13:32:15 -0700 Subject: [PATCH 303/850] no need to validate signature in S_OBJ; discard debug info if PCH is missing instead of exiting --- src/linker/lnk_debug_info.c | 80 +++++++++++++++---------------------- 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 3599d86c..7ed3b011 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -12,6 +12,18 @@ lnk_get_huge_arena(void) return g_huge_arena; } +internal void +lnk_discard_cv_debug_info(LNK_CodeViewInput *input, U64 obj_idx) +{ + // discard symbols + String8List *symbols_ptr = cv_sub_section_ptr_from_debug_s(&input->debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + MemoryZeroStruct(symbols_ptr); + + // discard inline sites + String8List *inlineelines_ptr = cv_sub_section_ptr_from_debug_s(&input->debug_s_arr[obj_idx], CV_C13SubSectionKind_InlineeLines); + MemoryZeroStruct(inlineelines_ptr); +} + internal THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) { @@ -227,15 +239,7 @@ THREAD_POOL_TASK_FUNC(lnk_read_type_servers_task) // an error occurred while loading external type server, discard // parts debug info in dependent objs that rely on types for EachNode(n, U64Node, task->ts_arr.v[ts_idx].obj_indices.first) { - U64 obj_idx = n->data; - - // discard symbols - String8List *symbols_ptr = cv_sub_section_ptr_from_debug_s(&task->debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); - MemoryZeroStruct(symbols_ptr); - - // discard inline sites - String8List *inlineelines_ptr = cv_sub_section_ptr_from_debug_s(&task->debug_s_arr[obj_idx], CV_C13SubSectionKind_InlineeLines); - MemoryZeroStruct(inlineelines_ptr); + lnk_discard_cv_debug_info(task, n->data); } } @@ -455,8 +459,8 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla ProfBegin("Set up PCH indirection"); { // hash_table - String8 work_dir = os_get_current_path(scratch.arena); - HashTable *debug_p_ht = hash_table_init(scratch.arena, obj_count); + String8 work_dir = os_get_current_path(scratch.arena); + HashTable *debug_p_ht = hash_table_init(scratch.arena, obj_count); for EachIndex(i, input.debug_p_indices.count) { U64 obj_idx = input.debug_p_indices.v[i]; String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_arr[obj_idx]->path, work_dir); @@ -469,19 +473,16 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla for EachIndex(i, input.int_obj_indices.count) { U64 obj_idx = input.int_obj_indices.v[i]; - LNK_Obj *obj = obj_arr[obj_idx]; CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; - // skip non-PCH objs + // skip objs that do not depend on PCH if ( ! cv_debug_t_is_pch(debug_t)) { continue; } - // get PCH ref info - CV_PrecompInfo precomp = cv_precomp_info_from_leaf(cv_debug_t_get_leaf(debug_t, 0)); - // find PCH obj - String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir); - U64 debug_p_obj_idx = max_U64; - if (!hash_table_search_path_u64(debug_p_ht, obj_path, &debug_p_obj_idx)) { + CV_PrecompInfo precomp = cv_precomp_info_from_leaf(cv_debug_t_get_leaf(debug_t, 0)); + String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir); + U64 debug_p_obj_idx = max_U64; + if ( ! hash_table_search_path_u64(debug_p_ht, obj_path, &debug_p_obj_idx)) { // try alternative directory for the PCH String8 obj_name = str8_skip_last_slash(obj_path); for EachNode(alt_dir_n, String8Node, alt_pch_dirs.first) { @@ -489,8 +490,8 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla if (hash_table_search_path_u64(debug_p_ht, alt_obj_path, &debug_p_obj_idx)) { break; } } if (debug_p_obj_idx == max_U64) { - lnk_error_obj(LNK_Error_PrecompObjNotFound, obj, "LF_PRECOMP references non-existent obj %S", obj_path); - lnk_exit(LNK_Error_PrecompObjNotFound); + lnk_error_obj(LNK_Error_PrecompObjNotFound, obj_arr[obj_idx], "LF_PRECOMP references non-existent obj %S; discarding debug info", obj_path); + lnk_discard_cv_debug_info(&input, obj_idx); } } @@ -498,35 +499,18 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla CV_DebugT *debug_p = &input.debug_t_arr[debug_p_obj_idx]; // error check LF_PRECOMP - if (precomp.start_index > CV_MinComplexTypeIndex) { lnk_error_obj(LNK_Warning_AtypicalStartIndex, obj, "atypical start index 0x%x in LF_PRECOMP", precomp.start_index); } - if (precomp.start_index < CV_MinComplexTypeIndex) { lnk_error_obj(LNK_Error_InvalidStartIndex, obj, "invalid start index 0x%x in LF_PRECOMP; must be >= 0x%x", precomp.start_index, CV_MinComplexTypeIndex); continue; } - if (precomp.leaf_count >= debug_p->count) { lnk_error_obj(LNK_Error_InvalidPrecompLeafCount, obj, "leaf count %u LF_PRECOMP exceeds leaf count %u in .debug$P in %S", precomp.leaf_count, debug_p->count, obj_arr[debug_p_obj_idx]->path); continue; } + if (precomp.start_index > CV_MinComplexTypeIndex) { lnk_error_obj(LNK_Warning_AtypicalStartIndex, obj_arr[obj_idx], "atypical start index 0x%x in LF_PRECOMP", precomp.start_index); } + if (precomp.start_index < CV_MinComplexTypeIndex) { lnk_error_obj(LNK_Error_InvalidStartIndex, obj_arr[obj_idx], "invalid start index 0x%x in LF_PRECOMP; must be >= 0x%x", precomp.start_index, CV_MinComplexTypeIndex); continue; } + if (precomp.leaf_count >= debug_p->count) { lnk_error_obj(LNK_Error_InvalidPrecompLeafCount, obj_arr[obj_idx], "leaf count %u LF_PRECOMP exceeds leaf count %u in .debug$P in %S", precomp.leaf_count, debug_p->count, obj_arr[debug_p_obj_idx]->path); continue; } // get LF_PRECOMP CV_Leaf endprecomp_leaf = cv_debug_t_get_leaf(debug_p, precomp.leaf_count); CV_LeafEndPreComp *endprecomp = str8_deserial_get_raw_ptr(endprecomp_leaf.data, 0, sizeof(*endprecomp)); // error check LF_ENDPRECOMP - if (endprecomp_leaf.kind != CV_LeafKind_ENDPRECOMP) { lnk_error_obj(LNK_Error_EndprecompNotFound, obj, "missing LF_ENDPRECOMP [0x%x] in %S", precomp.leaf_count, obj_arr[debug_p_obj_idx]->path); continue; } - if (endprecomp_leaf.data.size != sizeof(CV_LeafEndPreComp)) { lnk_error_obj(LNK_Error_IllData, obj, "invalid size 0x%x for LF_ENDPRECOMP", endprecomp_leaf.data.size); continue; } - if (endprecomp->sig != precomp.sig) { lnk_error_obj(LNK_Error_PrecompSigMismatch, obj, "PCH signature mismatch, expected 0x%x got 0x%x; PCH obj %S", precomp.sig, endprecomp->sig, obj_arr[debug_p_obj_idx]->path); continue; } - - { // PCH and OBJ signatures must match - String8List symbols = cv_sub_section_from_debug_s(input.debug_s_arr[debug_p_obj_idx], CV_C13SubSectionKind_Symbols); - CV_SymbolList symbol_list = {0}; - cv_parse_symbol_sub_section_capped(scratch.arena, &symbol_list, 0, str8_list_first(&symbols), CV_SymbolAlign, 1); - CV_Symbol symbol = symbol_list.count ? symbol_list.first->data : (CV_Symbol){0}; - if (cv_is_obj_info(symbol)) { - CV_ObjInfo obj_info = cv_obj_info_from_symbol(symbol); - if (obj_info.sig != 0 && obj_info.sig != precomp.sig) { - lnk_error_obj(LNK_Error_PrecompSigMismatch, obj, "signature mismatch between LF_PRECOMP(0x%X) and S_OBJNAME(0x%X) in %S", precomp.sig, obj_info.sig, obj_arr[debug_p_obj_idx]->path); - continue; - } - } else { - lnk_error_obj(LNK_Error_PrecompSigMismatch, obj, "missing S_OBJNAME, unable to validate PCH signature"); - continue; - } - } + if (endprecomp_leaf.kind != CV_LeafKind_ENDPRECOMP) { lnk_error_obj(LNK_Error_EndprecompNotFound, obj_arr[obj_idx], "missing LF_ENDPRECOMP [0x%x] in %S", precomp.leaf_count, obj_arr[debug_p_obj_idx]->path); continue; } + if (endprecomp_leaf.data.size != sizeof(CV_LeafEndPreComp)) { lnk_error_obj(LNK_Error_IllData, obj_arr[obj_idx], "invalid size 0x%x for LF_ENDPRECOMP", endprecomp_leaf.data.size); continue; } + if (endprecomp->sig != precomp.sig) { lnk_error_obj(LNK_Error_PrecompSigMismatch, obj_arr[obj_idx], "PCH signature mismatch, expected 0x%x got 0x%x; PCH obj %S", precomp.sig, endprecomp->sig, obj_arr[debug_p_obj_idx]->path); continue; } for (U64 i = 1; i < CV_TypeIndexSource_COUNT; i += 1) { debug_t->pch_ti_range[i] = r1u64(precomp.start_index, precomp.start_index + precomp.leaf_count); } debug_t->pch_obj_idx = debug_p_obj_idx; @@ -538,8 +522,8 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla // remove CV_LeafKind_ENDPRECOMP from .debug$P for EachIndex(i, input.debug_p_indices.count) { - U64 debug_p_idx = input.debug_p_indices.v[i]; - CV_DebugT *debug_p = &input.debug_t_arr[debug_p_idx]; + U64 debug_p_idx = input.debug_p_indices.v[i]; + CV_DebugT *debug_p = &input.debug_t_arr[debug_p_idx]; for EachIndex(i, debug_p->count) { U64 lf_idx = debug_p->count - (i + 1); CV_LeafHeader *lf = cv_debug_t_get_leaf_header(debug_p, lf_idx); @@ -555,8 +539,8 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla // PCH and /Z7 objs have default min type index set to CV_MinComplexTypeIndex // but type servers can bump up the lower bound. In practice nobody does this. - // However, to cover all our bases loop through type servers and compute - // max lower bound. + // But to cover all our bases loop through type servers and compute max + // lower bound. for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { input.min_type_indices[ti_source] = CV_MinComplexTypeIndex; } for EachInRange(ts_idx, input.ts_obj_range) { CV_DebugT *debug_t = &input.debug_t_arr[ts_idx]; From f119e8cffcaba3e6cf423b9a898d60f116ecd66e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Mar 2026 13:41:00 -0700 Subject: [PATCH 304/850] test torture with clang --- .github/workflows/builds.yml | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index ba444da3..8f8bdcc0 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -10,7 +10,7 @@ on: jobs: build-windows-2022: - runs-on: windows-2022 + runs-on: windows-2025 strategy: fail-fast: false matrix: @@ -27,7 +27,7 @@ jobs: - release steps: - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v6 - name: build (vs 2022) shell: cmd run: | @@ -35,18 +35,24 @@ jobs: call build meta "${{ matrix.target }}" "${{ matrix.compiler }}" "${{ matrix.mode }}" || exit /b 1 run-torture: - runs-on: windows-2022 + runs-on: windows-2025 + strategy: + fail-fast: false + matrix: + compiler: + - msvc + - clang + mode: + - debug + - release steps: - # - name: Install ASAN - # shell: cmd - # run: | - # "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vs_installer.exe" modify --installPath "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" --quiet --force --norestart --add Microsoft.VisualStudio.Component.VC.ASAN - name: checkout - uses: actions/checkout@v2 + uses: actions/checkout@v6 - name: run-torture shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build asan debug meta torture radlink radbin || exit /b 1 + call build asan meta torture radlink radbin "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 cd build torture || exit /b 1 + From 2331425e20434a77f1a5afcb9ec6870adfc97f8b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Mar 2026 16:07:30 -0700 Subject: [PATCH 305/850] removed duplicate clang sets; disable ICF with lld-link because it erroneously merges string literals and makes ASAN panic --- build.bat | 4 +--- src/torture/torture_radlink.c | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/build.bat b/build.bat index d68d95fe..002d4370 100644 --- a/build.bat +++ b/build.bat @@ -75,11 +75,9 @@ set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%% set cl_out= /out: set cl_linker= set clang_common= -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -mcx16 -msha -set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% -set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% -set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:icf +set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:noicf set clang_out= -o set clang_linker= -Xlinker diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 3a344134..4af47845 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -3537,9 +3537,9 @@ T_BeginTest(delay_import_user32) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".str"), PE_DATA_SECTION_FLAGS, str8_zero()); U64 msg_off = data_sect->data.total_size; - str8_list_pushf(obj_writer->arena, &data_sect->data, "test\0"); + str8_list_push(obj_writer->arena, &data_sect->data, push_cstr(scratch.arena, str8_lit("test"))); U64 caption_off = data_sect->data.total_size; - str8_list_pushf(obj_writer->arena, &data_sect->data, "foo\0"); + str8_list_push(obj_writer->arena, &data_sect->data, push_cstr(scratch.arena, str8_lit("foo"))); COFF_ObjSymbol *msg_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("msg"), msg_off, data_sect); COFF_ObjSymbol *caption_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("caption"), caption_off, data_sect); From 3834c9be6f664c4896b9db69435317875d962db5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Mar 2026 16:15:08 -0700 Subject: [PATCH 306/850] torture build with clang release runs out of memory --- .github/workflows/builds.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 8f8bdcc0..d3ea041d 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -45,6 +45,9 @@ jobs: mode: - debug - release + exclude: + # clang runs OOM in release with ASAN + - { compiler: clang mode: release } steps: - name: checkout uses: actions/checkout@v6 From f57b14993998f75d49be4d952bb707181cfbd65a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 19 Mar 2026 16:16:40 -0700 Subject: [PATCH 307/850] syntax error fix yaml --- .github/workflows/builds.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index d3ea041d..8465c29d 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -46,8 +46,7 @@ jobs: - debug - release exclude: - # clang runs OOM in release with ASAN - - { compiler: clang mode: release } + - { compiler: clang, mode: release } # clang runs OOM in release with ASAN steps: - name: checkout uses: actions/checkout@v6 From e0c6df710faebff89ca69b1748bd339ce66bbb4e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Mar 2026 11:14:56 -0700 Subject: [PATCH 308/850] WIP change symbol extraction approach --- src/base/base_core.h | 1 + src/linker/base_ext/base_arrays.c | 10 + src/linker/base_ext/base_arrays.h | 49 +- src/linker/codeview_ext/codeview.c | 273 +++--- src/linker/codeview_ext/codeview.h | 27 +- src/linker/lnk.c | 32 +- src/linker/lnk_debug_info.c | 1157 +++++++++++++------------- src/linker/lnk_debug_info.h | 325 +++----- src/linker/pdb_ext/pdb_builder.c | 28 +- src/linker/pdb_ext/pdb_builder.h | 2 +- src/linker/thread_pool/thread_pool.c | 8 +- src/linker/thread_pool/thread_pool.h | 3 +- 12 files changed, 921 insertions(+), 994 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index a644d1a7..52a27343 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -448,6 +448,7 @@ C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t s #endif #define TryRead(func__, cursor__, label__) do { U64 size__ = (func__); if (size__ == 0) { Assert(0 && "failed read"); goto label__; } cursor__ += size__; } while (0) +#define TryReadBreak(func__, cursor__) { U64 size__ = (func__); if (size__ == 0) { Assert(0 && "failed read"); break; } cursor__ += size__; } //////////////////////////////// //~ rjf: Base Types diff --git a/src/linker/base_ext/base_arrays.c b/src/linker/base_ext/base_arrays.c index 96e715b5..603c46b4 100644 --- a/src/linker/base_ext/base_arrays.c +++ b/src/linker/base_ext/base_arrays.c @@ -24,6 +24,16 @@ void_node_concat_atomic(VoidNode **head, VoidNode *node) node->next = ins_atomic_ptr_eval_assign(head, node); } +internal VoidNode * +void_list_push(Arena *arena, VoidList *list, void *v) +{ + VoidNode *n = push_array(arena, VoidNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; +} + internal void u64_list_push_node(U64List *list, U64Node *n) { diff --git a/src/linker/base_ext/base_arrays.h b/src/linker/base_ext/base_arrays.h index 4d51fd96..97350685 100644 --- a/src/linker/base_ext/base_arrays.h +++ b/src/linker/base_ext/base_arrays.h @@ -3,49 +3,16 @@ #pragma once -typedef struct VoidNode -{ - struct VoidNode *next; - void *v; -} VoidNode; +typedef struct VoidNode { void *v; struct VoidNode *next; } VoidNode; +typedef struct U32Node { U32 data; struct U32Node *next; } U32Node; +typedef struct U64Node { U64 data; struct U64Node *next; } U64Node; +typedef struct S64Node { S64 v; struct S64Node *next; } S64Node; -typedef struct U32Node -{ - struct U32Node *next; - U32 data; -} U32Node; +typedef struct VoidList { U64 count; VoidNode *first, *last; } VoidList; +typedef struct U64List { U64 count; U64Node *first, *last; } U64List; +typedef struct S64List { U64 count; S64Node *first, *last; } S64List; -typedef struct U64Node -{ - struct U64Node *next; - U64 data; -} U64Node; - -typedef struct U64List -{ - U64 count; - U64Node *first; - U64Node *last; -} U64List; - -typedef struct S64Node -{ - S64 v; - struct S64Node *next; -} S64Node; - -typedef struct S64List -{ - U64 count; - S64Node *first; - S64Node *last; -} S64List; - -typedef struct S64Array -{ - U64 count; - S64 *v; -} S64Array; +typedef struct S64Array { U64 count; S64 *v; } S64Array; //////////////////////////////// diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index a41b8fc8..33a7b688 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -241,6 +241,67 @@ cv_data_from_symbol(Arena *arena, CV_Symbol *symbol, U64 align) return result; } +internal U64 +cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out) +{ + Assert(raw_data.size >= sizeof(CV_SymbolHeader)); + + U8 *symbol_ptr = raw_data.str + off; + CV_SymbolHeader header = { .v = memory_read32(symbol_ptr) }; + + Assert(header.size >= sizeof(CV_SymKind)); + Assert(sizeof(CV_SymSize) + header.size <= raw_data.size); + + symbol_out->kind = header.kind; + symbol_out->data = str8(symbol_ptr + sizeof(CV_SymbolHeader), header.size - sizeof(CV_SymKind)); + + U64 symbol_size = AlignPow2(sizeof(CV_SymbolHeader) + symbol_out->data.size, align); + Assert(symbol_size <= raw_data.size); + return symbol_size; +} + +internal U8 * +cv_ptr_from_symbol(CV_Symbol symbol) +{ + return symbol.data.str - sizeof(CV_SymbolHeader); +} + +internal CV_SymKind * +cv_kind_ptr_from_symbol(CV_Symbol symbol) +{ + return &((CV_SymbolHeader *)cv_ptr_from_symbol(symbol))->kind; +} + +internal CV_Symbol +cv_symbol_from_ptr(U8 *ptr) +{ + CV_Symbol symbol = {0}; + cv_read_symbol(str8(ptr, max_U64), 0, 1, &symbol); + return symbol; +} + +internal String8 +cv_raw_from_symbol(void *ptr) +{ + CV_SymbolHeader *header = ptr; + return str8(ptr, header->size + sizeof(header->size)); +} + +internal B32 +cv_symbol_match(CV_Symbol a, CV_Symbol b) +{ + B32 is_match = 0; + + CV_SymbolHeader *a_ptr = (CV_SymbolHeader *)cv_ptr_from_symbol(a); + CV_SymbolHeader *b_ptr = (CV_SymbolHeader *)cv_ptr_from_symbol(b); + + if (a_ptr->size == b_ptr->size) { + is_match = MemoryMatch(a_ptr + sizeof(CV_SymSize), b_ptr + sizeof(CV_SymSize), a_ptr->size); + } + + return is_match; +} + internal String8 cv_make_symbol(Arena *arena, CV_SymKind kind, String8 data) { @@ -949,144 +1010,58 @@ cv_pack_string_hash_table(Arena *arena, TP_Context *tp, CV_StringHashTable strin //////////////////////////////// //~ Symbol Deduper -internal int -cv_symbol_deduper_is_before(void *raw_a, void *raw_b) +internal void * +cv_symbol_deduper_insert_or_update(void **buckets, U64 bucket_cap, U64 hash, void *symbol_ptr) { - return raw_a < raw_b; -} - -internal CV_SymbolNode ** -cv_symbol_deduper_insert_or_update(CV_SymbolNode ***buckets, U64 cap, U64 hash, CV_SymbolNode **new_bucket) -{ - CV_SymbolNode **result = 0; - B32 is_inserted_or_updated = 0; - - U64 best_idx = hash % cap; - U64 idx = best_idx; - + CV_Symbol symbol = cv_symbol_from_ptr(symbol_ptr); + U8 *result = 0; + B32 is_inserted_or_updated = 0; + U64 best_idx = hash % bucket_cap; + U64 bucket_idx = best_idx; do { retry:; - CV_SymbolNode **curr_bucket = buckets[idx]; + void *curr_ptr = buckets + bucket_idx; + Assert(curr_ptr != symbol_ptr); - Assert(curr_bucket != new_bucket); - - if (curr_bucket == 0) { - CV_SymbolNode **compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); - - if (compare_bucket == curr_bucket) { + if (curr_ptr == 0) { + U8 *cmp = ins_atomic_ptr_eval_cond_assign(&buckets[bucket_idx], symbol_ptr, curr_ptr); + if (cmp == curr_ptr) { // success, bucket was inserted is_inserted_or_updated = 1; break; } - // another thread took the bucket... goto retry; - } else if ((*curr_bucket)->data.kind == (*new_bucket)->data.kind && - (*curr_bucket)->data.data.size == (*new_bucket)->data.data.size && - MemoryMatch((*curr_bucket)->data.data.str, (*new_bucket)->data.data.str, (*new_bucket)->data.data.size)) { - if (cv_symbol_deduper_is_before(curr_bucket, new_bucket)) { - result = new_bucket; + } else { + CV_Symbol curr = cv_symbol_from_ptr(curr_ptr); - is_inserted_or_updated = 1; + if (cv_symbol_match(curr, symbol)) { + if (curr_ptr < symbol_ptr) { + // do not update, more recent symbol is in the bucket + result = symbol_ptr; + is_inserted_or_updated = 1; + break; + } - // don't need to update, more recent leaf is in the bucket - break; + void *cmp = ins_atomic_ptr_eval_cond_assign(&buckets[bucket_idx], symbol_ptr, curr_ptr); + if (cmp == curr_ptr) { + result = cmp; + is_inserted_or_updated = 1; + break; + } + + // another thread took the bucket... + goto retry; } - - CV_SymbolNode **compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - result = compare_bucket; - - is_inserted_or_updated = 1; - break; - } - - // another thread took the bucket... - goto retry; } // advance - idx = (idx + 1) % cap; - } while (idx != best_idx); - + bucket_idx = (bucket_idx + 1) == bucket_cap ? 0 : bucket_idx + 1; + } while (bucket_idx != best_idx); Assert(is_inserted_or_updated); - return result; } -internal -THREAD_POOL_TASK_FUNC(cv_symbol_deduper_insert_task) -{ - ProfBeginFunction(); - CV_SymbolDeduperTask *task = raw_task; - Rng1U64 range = task->ranges[task_id]; - for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) { - CV_SymbolNode **symbol_node = &task->symbols[symbol_idx]; - U64 hash = hash_from_cv_symbol(&(*symbol_node)->data); - cv_symbol_deduper_insert_or_update(task->u.buckets, task->cap, hash, symbol_node); - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(cv_symbol_deduper_deref_buckets_task) -{ - ProfBeginFunction(); - CV_SymbolDeduperTask *task = raw_task; - Rng1U64 range = task->ranges[task_id]; - for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) { - CV_SymbolNode **bucket = task->u.buckets[bucket_idx]; - if (bucket) { - task->u.deref_buckets[bucket_idx] = *bucket; - } - } - ProfEnd(); -} - -internal void -cv_dedup_symbol_ptr_array(TP_Context *tp, CV_SymbolPtrArray *symbols) -{ - ProfBeginDynamic("Dedup Symbols [Count %llu]", symbols->count); - Temp scratch = scratch_begin(0, 0); - - ProfBegin("Setup Task"); - CV_SymbolDeduperTask task = {0}; - task.symbols = symbols->v; - task.cap = (U64)((F64)symbols->count * 1.3); - task.u.buckets = push_array(scratch.arena, CV_SymbolNode **, task.cap); - ProfEnd(); - - ProfBegin("Dedup"); - task.ranges = tp_divide_work(scratch.arena, symbols->count, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_deduper_insert_task, &task); - ProfEnd(); - - ProfBegin("Deref Buckets"); - task.ranges = tp_divide_work(scratch.arena, task.cap, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_deduper_deref_buckets_task, &task); - ProfEnd(); - - ProfBegin("Copy Extant Buckets"); - U64 unique_symbol_count = 0; - for (U64 bucket_idx = 0; bucket_idx < task.cap; ++bucket_idx) { - CV_SymbolNode *bucket = task.u.deref_buckets[bucket_idx]; - if (bucket) { - symbols->v[unique_symbol_count++] = bucket; - } - } - ProfEnd(); - - Assert(unique_symbol_count <= symbols->count); - symbols->count = unique_symbol_count; - - ProfBeginDynamic("Sort [Count %llu]", symbols->count); - radsort(symbols->v, symbols->count, cv_symbol_deduper_is_before); - ProfEnd(); - - scratch_end(scratch); - ProfEnd(); -} - //////////////////////////////// //~ .debug$T helpers @@ -1528,6 +1503,68 @@ cv_patch_symbol_tree_offsets(CV_SymbolList list, U64 base_offset, U64 align) return serial_size; } +internal U64 +cv_patch_symbol_tree_offsets_new(String8List raw_symbols, U64 base_offset, U64 align) +{ + Temp scratch = scratch_begin(0, 0); + struct Stack { struct Stack *next; CV_Symbol symbol; U64 offset; }; + struct Stack *stack = 0, *free_list = 0; + U64 symbol_offset = safe_cast_u32(base_offset); + for EachNode(n, String8Node, raw_symbols.first) { + for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + CV_Symbol symbol = {0}; + U64 read_size = cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol); + if (read_size == 0) { break; } + cursor += read_size; + + if (symbol.kind == CV_SymKind_SKIP) { continue; } + + if (cv_is_scope_symbol(symbol.kind)) { + // NOTE: We don't patch 'next' offset in PROC symbols because + // it's not used by visual studio and MSVC leaves the offsets + // zeroed. LLD is on the same page. + Assert(symbol.data.size >= sizeof(U32)*2); + + // patch parent symbol offset + if (stack) { + memory_write32(symbol.data.str, stack->offset); + } + + // reuse/alloc frame + struct Stack *frame = free_list; + if (frame) { SLLStackPop(free_list); } + else { frame = push_array_no_zero(scratch.arena, struct Stack, 1); } + + // push frame to the stack + frame->symbol = symbol; + frame->offset = symbol_offset; + SLLStackPush(stack, frame); + + depth += 1; + } else if (cv_is_end_symbol(symbol.kind)) { + // patch symbol end + U32 *end_off_ptr = (U32 *)stack->symbol.data.str + /* skip parent off */ 1; + memory_write32(end_off_ptr, symbol_offset); + + // recycle frame + struct Stack *free_frame = stack; + SLLStackPop(stack); + SLLStackPush(free_list, free_frame); + + if (depth == 0) { Assert(0 && "malformed symbol stream"); goto next_block; } + depth -= 1; + } + + // advance tree offset + symbol_offset += cv_size_from_symbol(&symbol, align); + } + next_block:; + } + + scratch_end(scratch); + return symbol_offset - base_offset; +} + // $$FileChksms internal void diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index 73306b4b..f160ab36 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -14,10 +14,13 @@ typedef union CV_LeafHeader U32 v; } CV_LeafHeader; -typedef struct CV_SymbolHeader +typedef union CV_SymbolHeader { - CV_SymSize size; - CV_SymKind kind; + struct { + CV_SymSize size; + CV_SymKind kind; + }; + U32 v; } CV_SymbolHeader; //////////////////////////////// @@ -337,17 +340,6 @@ typedef struct CV_StringHashTableResult //////////////////////////////// //~ Task Contexts -typedef struct -{ - U64 cap; - union { - CV_SymbolNode ***buckets; - CV_SymbolNode **deref_buckets; - } u; - Rng1U64 *ranges; - CV_SymbolNode **symbols; -} CV_SymbolDeduperTask; - typedef struct { CV_SymbolList *list_arr; @@ -398,6 +390,13 @@ internal U64 cv_size_from_symbol(CV_Symbol *symbol, U64 align); internal U64 cv_write_symbol(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align); internal String8 cv_data_from_symbol(Arena *arena, CV_Symbol *symbol, U64 align); +internal U64 cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out); +internal U8 * cv_ptr_from_symbol(CV_Symbol symbol); +internal CV_SymKind * cv_kind_ptr_from_symbol(CV_Symbol symbol); +internal CV_Symbol cv_symbol_from_ptr(U8 *ptr); +internal String8 cv_raw_from_symbol(void *ptr); +internal B32 cv_symbol_match(CV_Symbol a, CV_Symbol b); + internal String8 cv_make_symbol(Arena *arena, CV_SymKind kind, String8 data); internal String8 cv_make_obj_name(Arena *arena, String8 obj_path, U32 sig); internal String8 cv_make_comp3(Arena *arena, CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe, U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe, String8 version_string); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index ac84657d..14920524 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -5144,8 +5144,8 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) // // CodeView // - LNK_CodeViewInput input = lnk_make_code_view_input(tp, arena, config->io_flags, config->lib_dir_list, config->alt_pch_dirs, debug_info_objs_count, debug_info_objs); - LNK_MergedTypes merged_types = lnk_merge_types(tp, arena, &input); + LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config->io_flags, config->lib_dir_list, config->alt_pch_dirs, debug_info_objs_count, debug_info_objs); + LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv); // // RDI @@ -5161,11 +5161,11 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) image_ctx.image_data, debug_info_objs_count, debug_info_objs, - input.debug_s_arr, - input.symbol_input_count, - input.symbol_inputs, - input.parsed_symbols, - merged_types); + cv.debug_s_arr, + cv.symbol_input_count, + cv.symbol_inputs, + (CV_SymbolListArray[]){0}, + cv_types); lnk_write_data_list_to_file_path(config->rad_debug_name, config->temp_rad_debug_name, rdi_data); @@ -5183,26 +5183,14 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) { lnk_replace_type_names_with_hashes(tp, arena, - merged_types.count[CV_TypeIndexSource_TPI], - merged_types.v [CV_TypeIndexSource_TPI], + cv_types.count[CV_TypeIndexSource_TPI], + cv_types.v [CV_TypeIndexSource_TPI], config->pdb_hash_type_names, config->pdb_hash_type_name_length, config->pdb_hash_type_name_map); } - String8List pdb_data = lnk_build_pdb(tp, - arena, - image_ctx.image_data, - config, - symtab, - debug_info_objs_count, - debug_info_objs, - input.debug_s_arr, - input.symbol_input_count, - input.symbol_inputs, - input.parsed_symbols, - merged_types); - + String8List pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &cv, cv_types); lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data); lnk_timer_end(LNK_Timer_Pdb); } diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 7ed3b011..2bd98ac6 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -27,16 +27,16 @@ lnk_discard_cv_debug_info(LNK_CodeViewInput *input, U64 obj_idx) internal THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) { - U64 obj_idx = task_id; - LNK_ParseDebugSTaskData *task = raw_task; + U64 obj_idx = task_id; + LNK_CodeViewInput *task = raw_task; - LNK_Obj *obj = task->obj_arr[obj_idx]; - String8List sect_list = task->sect_list_arr[obj_idx]; - CV_DebugS *debug_s = &task->debug_s_arr[obj_idx]; + LNK_Obj *obj = task->obj_arr [obj_idx]; + String8List sect_list = task->debug_s_list_arr[obj_idx]; + CV_DebugS *debug_s = &task->debug_s_arr [obj_idx]; - for (String8Node *node = sect_list.first; node != 0; node = node->next) { + for EachNode(n, String8Node, sect_list.first) { // parse & merge sub sections - CV_DebugS ds = cv_debug_s_from_data(arena, node->string); + CV_DebugS ds = cv_debug_s_from_data(arena, n->string); cv_debug_s_concat_in_place(debug_s, &ds); // make sure there is one string table @@ -55,43 +55,24 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) } } -internal CV_DebugS * -lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *sect_list_arr) -{ - ProfBeginFunction(); - - LNK_ParseDebugSTaskData task_data = {0}; - task_data.obj_arr = obj_arr; - task_data.sect_list_arr = sect_list_arr; - task_data.debug_s_arr = push_array(arena->v[0], CV_DebugS, obj_count); - - tp_for_parallel(tp, arena, obj_count, lnk_parse_debug_s_task, &task_data); - - ProfEnd(); - return task_data.debug_s_arr; -} - internal THREAD_POOL_TASK_FUNC(lnk_strip_debug_t_sig_task) { - U64 obj_idx = task_id; - LNK_CheckDebugTSigTaskData *task = raw_task; + U64 obj_idx = task_id; + LNK_ParseCvTypes *task = raw_task; - String8Array data_arr = task->data_arr_arr[obj_idx]; - LNK_Obj *obj = task->obj_arr[obj_idx]; - - for EachIndex(i, data_arr.count) { - String8 *d = data_arr.v + i; + for EachIndex(i, task->raw_types[obj_idx].count) { + String8 *d = task->raw_types[obj_idx].v + i; if (d->size == 0) { continue; } if (d->size < sizeof(CV_Signature)) { - lnk_error_obj(LNK_Error_IllData, obj, ".debug$T must have at least 4 bytes for CodeView signature"); + lnk_error_obj(LNK_Error_IllData, task->input->obj_arr[obj_idx], ".debug$T must have at least 4 bytes for CodeView signature"); } CV_Signature sig = cv_signature_from_debug_s(*d); switch (sig) { default: { - lnk_error_obj(LNK_Warning_IllData, obj, "unknown CodeView type signature in section (TODO: print section index)"); + lnk_error_obj(LNK_Warning_IllData, task->input->obj_arr[obj_idx], "unknown CodeView type signature in section (TODO: print section index)"); *d = str8(0,0); } break; case CV_Signature_C13: { @@ -105,47 +86,15 @@ internal THREAD_POOL_TASK_FUNC(lnk_parse_debug_t_task) { ProfBeginFunction(); - LNK_ParseDebugTTaskData *task = raw_task; - if (task->data_arr_arr[task_id].count > 0) { - task->debug_t_arr[task_id] = cv_debug_t_from_data(arena, task->data_arr_arr[task_id].v[0], CV_LeafAlign); + LNK_ParseCvTypes *task = raw_task; + if (task->raw_types[task_id].count > 0) { + task->out_types[task_id] = cv_debug_t_from_data(arena, task->raw_types[task_id].v[0], CV_LeafAlign); } else { - MemoryZeroStruct(&task->debug_t_arr[task_id]); + MemoryZeroStruct(&task->out_types[task_id]); } ProfEnd(); } -internal CV_DebugT * -lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *debug_t_list_arr) -{ - ProfBeginFunction(); - - // list -> array - String8Array *data_arr_arr = str8_array_from_list_arr(arena->v[0], debug_t_list_arr, obj_count); - - // validate signatures - LNK_CheckDebugTSigTaskData check_sig; - check_sig.obj_arr = obj_arr; - check_sig.data_arr_arr = data_arr_arr; - tp_for_parallel(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &check_sig); - - // parse debug types - LNK_ParseDebugTTaskData parse; - parse.data_arr_arr = data_arr_arr; - parse.debug_t_arr = push_array_no_zero(arena->v[0], CV_DebugT, obj_count); - tp_for_parallel(tp, arena, obj_count, lnk_parse_debug_t_task, &parse); - - ProfEnd(); - return parse.debug_t_arr; -} - -internal -THREAD_POOL_TASK_FUNC(lnk_parse_cv_symbols_task) -{ - LNK_ParseCVSymbolsTaskData *task = raw_task; - LNK_SymbolInput *input = &task->inputs[task_id]; - cv_parse_symbol_sub_section(arena, input->symbol_list, 0, input->raw_symbols, CV_SymbolAlign); -} - internal THREAD_POOL_TASK_FUNC(lnk_read_type_servers_task) { @@ -255,21 +204,20 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla ProfBegin("Extract CodeView"); Temp scratch = scratch_begin(0,0); - LNK_CodeViewInput input = { .io_flags = io_flags, .count = obj_count, .obj_arr = obj_arr, .ts_obj_range = r1u64(0,0) }; + LNK_CodeViewInput input = { .io_flags = io_flags, .obj_count = obj_count, .count = obj_count, .obj_arr = obj_arr, .ts_obj_range = r1u64(0,0) }; ProfBegin("Collect CodeView"); - // TODO: fix memory leak, we need a Temp wrapper for pool arena - String8List *debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$S"), 0); - String8List *debug_p_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$P"), 0); - String8List *debug_t_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$T"), 0); + input.debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$S"), 0); + input.debug_p_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$P"), 0); + input.debug_t_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$T"), 0); ProfEnd(); if (lnk_get_log_status(LNK_Log_Debug) || PROFILE_TELEMETRY) { U64 total_debug_s_size = 0, total_debug_t_size = 0, total_debug_p_size = 0; for EachIndex(obj_idx, obj_count) { - for EachNode(n, String8Node, debug_s_list_arr[obj_idx].first) { total_debug_s_size += n->string.size; } - for EachNode(n, String8Node, debug_t_list_arr[obj_idx].first) { total_debug_t_size += n->string.size; } - for EachNode(n, String8Node, debug_p_list_arr[obj_idx].first) { total_debug_p_size += n->string.size; } + for EachNode(n, String8Node, input.debug_s_list_arr[obj_idx].first) { total_debug_s_size += n->string.size; } + for EachNode(n, String8Node, input.debug_t_list_arr[obj_idx].first) { total_debug_t_size += n->string.size; } + for EachNode(n, String8Node, input.debug_p_list_arr[obj_idx].first) { total_debug_p_size += n->string.size; } } ProfNoteV("Total .debug$S Input Size: %M", total_debug_s_size); @@ -284,41 +232,26 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } ProfBegin("Parse CodeView"); - CV_DebugT *debug_p_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_p_list_arr); - input.debug_s_arr = lnk_parse_debug_s_sections(tp, tp_arena, obj_count, obj_arr, debug_s_list_arr); - input.debug_t_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_t_list_arr); - input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, obj_count); // TODO: collect & parse .debug$H - ProfEnd(); - - ProfBegin("Set up symbol parsing"); - for EachIndex(obj_idx, obj_count) { input.symbol_input_count += cv_sub_section_from_debug_s(input.debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols).node_count; } - input.symbol_inputs = push_array_no_zero(tp_arena->v[0], LNK_SymbolInput, input.symbol_input_count); - input.parsed_symbols = push_array_no_zero(tp_arena->v[0], CV_SymbolListArray, obj_count); + CV_DebugT *debug_p_arr; { - CV_SymbolList *reserved_lists = push_array(tp_arena->v[0], CV_SymbolList, input.symbol_input_count); - for (U64 obj_idx = 0, input_idx = 0; obj_idx < obj_count; ++obj_idx) { - String8List raw_symbols = cv_sub_section_from_debug_s(input.debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, obj_count); + tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_s_task, &input, "Parse .debug$S"); - // init parse output - if (raw_symbols.node_count > 0) { - input.parsed_symbols[obj_idx].count = raw_symbols.node_count; - input.parsed_symbols[obj_idx].v = reserved_lists + input_idx; - } else { - input.parsed_symbols[obj_idx].count = 0; - input.parsed_symbols[obj_idx].v = 0; - } + input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, obj_count); // TODO: collect & parse .debug$H - // init worker input - for (String8Node *data_n = raw_symbols.first; data_n != 0; data_n = data_n->next, ++input_idx) { - Assert(input_idx < input.symbol_input_count); - LNK_SymbolInput *in = &input.symbol_inputs[input_idx]; - in->obj_idx = obj_idx; - in->symbol_list = &reserved_lists[input_idx]; - in->raw_symbols = data_n->string; - } - } + LNK_ParseCvTypes parse_types = { .input = &input }; - tp_for_parallel_prof(tp, tp_arena, input.symbol_input_count, lnk_parse_cv_symbols_task, &(LNK_ParseCVSymbolsTaskData){ .inputs = input.symbol_inputs }, "Symbol Parse"); + debug_p_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); + parse_types.raw_types = str8_array_from_list_arr(scratch.arena, input.debug_p_list_arr, obj_count); + parse_types.out_types = debug_p_arr; + tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$P"); + tp_for_parallel_prof(tp, 0, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$P"); + + input.debug_t_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); + parse_types.raw_types = str8_array_from_list_arr(scratch.arena, input.debug_t_list_arr, obj_count); + parse_types.out_types = input.debug_t_arr; + tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$T"); + tp_for_parallel_prof(tp, 0, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$T"); } ProfEnd(); @@ -344,13 +277,13 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } } - ProfScope("Set up type servers") + ProfScope("Set up /Zi") { input.obj_to_ts = push_array(tp_arena->v[0], U64, input.count); LNK_TypeServerList ts_list = {0}; HashTable *ts_ht = hash_table_init(scratch.arena, 256); - // push null so unopened type servers are resolved to this type server + // push null type server (slots with broken type servers are set to null) LNK_TypeServerNode *null_ts = push_array(scratch.arena, LNK_TypeServerNode, 1); SLLQueuePush(ts_list.first, ts_list.last, null_ts); ts_list.count += 1; @@ -403,17 +336,15 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla LNK_CodeViewInput prev = input; input.count += ts_arr.count; - input.obj_arr = push_array(tp_arena->v[0], LNK_Obj *, input.count); - input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, input.count); - input.debug_t_arr = push_array(tp_arena->v[0], CV_DebugT, input.count); - input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, input.count); - input.parsed_symbols = push_array(tp_arena->v[0], CV_SymbolListArray, input.count); - input.obj_to_ts = push_array(tp_arena->v[0], U64, input.count); + input.obj_arr = push_array(tp_arena->v[0], LNK_Obj *, input.count); + input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, input.count); + input.debug_t_arr = push_array(tp_arena->v[0], CV_DebugT, input.count); + input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, input.count); + input.obj_to_ts = push_array(tp_arena->v[0], U64, input.count); MemoryCopyTyped(input.obj_arr, prev.obj_arr, prev.count); MemoryCopyTyped(input.debug_s_arr, prev.debug_s_arr, prev.count); MemoryCopyTyped(input.debug_t_arr, prev.debug_t_arr, prev.count); - MemoryCopyTyped(input.parsed_symbols, prev.parsed_symbols, prev.count); MemoryCopyTyped(input.obj_to_ts, prev.obj_to_ts, prev.count); input.ts_obj_range = r1u64(prev.count, input.count); @@ -435,7 +366,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla input.is_type_server_discarded = push_array(tp_arena->v[0], B32, input.ts_arr.count); tp_for_parallel_prof(tp, tp_arena, input.ts_arr.count, lnk_read_type_servers_task, &input, "read type servers"); - // fixup null type server + // undiscard null type server input.is_type_server_discarded[0] = 0; // report bad type servers @@ -443,7 +374,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla for EachIndex(ts_idx, ts_arr.count) { if ( ! input.is_type_server_discarded[ts_idx]) { continue; } str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t%S\n", ts_arr.v[ts_idx].ts_path); - str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\tDependent obj(s):\n"); + str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\tDependent objs:\n"); for EachNode(n, U64Node, input.ts_arr.v[ts_idx].obj_indices.first) { str8_list_pushf(scratch.arena, &unopen_type_server_list, "\t\t\t%S\n", obj_arr[n->data]->path); } @@ -456,7 +387,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } } - ProfBegin("Set up PCH indirection"); + ProfBegin("Set up PCH"); { // hash_table String8 work_dir = os_get_current_path(scratch.arena); @@ -520,7 +451,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla debug_t->offsets += 1; } - // remove CV_LeafKind_ENDPRECOMP from .debug$P + // remove LF_ENDPRECOMP from .debug$P for EachIndex(i, input.debug_p_indices.count) { U64 debug_p_idx = input.debug_p_indices.v[i]; CV_DebugT *debug_p = &input.debug_t_arr[debug_p_idx]; @@ -537,11 +468,13 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } ProfEnd(); + // set default min type index + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { input.min_type_indices[ti_source] = CV_MinComplexTypeIndex; } + // PCH and /Z7 objs have default min type index set to CV_MinComplexTypeIndex // but type servers can bump up the lower bound. In practice nobody does this. // But to cover all our bases loop through type servers and compute max // lower bound. - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { input.min_type_indices[ti_source] = CV_MinComplexTypeIndex; } for EachInRange(ts_idx, input.ts_obj_range) { CV_DebugT *debug_t = &input.debug_t_arr[ts_idx]; for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { @@ -554,6 +487,31 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla for EachIndex(i, obj_count) { MemoryZeroStruct(cv_sub_section_ptr_from_debug_s(&input.debug_s_arr[i], CV_C13SubSectionKind_Symbols)); } ProfEnd(); + ProfBegin("Make Symbol Inputs"); + { + for EachIndex(obj_idx, input.count) { + String8List s = cv_sub_section_from_debug_s(input.debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + input.symbol_input_count += s.node_count; + } + + input.symbol_inputs = push_array_no_zero(tp_arena->v[0], LNK_SymbolInput, input.symbol_input_count); + + U64 symbol_input_count = 0; + for EachIndex(obj_idx, input.count) { + String8List s = cv_sub_section_from_debug_s(input.debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + for EachNode(block_n, String8Node, s.first) { + Assert(symbol_input_count < input.symbol_input_count); + LNK_SymbolInput *in = input.symbol_inputs + symbol_input_count; + in->obj_idx = obj_idx; + in->raw_symbols = block_n->string; + symbol_input_count += 1; + } + } + + input.symbol_input_ranges = tp_divide_work(tp_arena->v[0], input.symbol_input_count, tp->worker_count); + } + ProfEnd(); + scratch_end(scratch); ProfEnd(); return input; @@ -562,48 +520,35 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla internal LNK_LeafRef lnk_leaf_ref_from_ti(LNK_CodeViewInput *input, U32 obj_idx, CV_TypeIndexSource source, CV_TypeIndex ti) { - LNK_LeafRef leaf_ref; - CV_DebugT *debug_t = &input->debug_t_arr[obj_idx]; + CV_DebugT *debug_t = input->debug_t_arr + obj_idx; + + // ti_range: PCH if (contains_1u64(debug_t->pch_ti_range[source], ti)) { - leaf_ref = (LNK_LeafRef){ - .obj_idx = debug_t->pch_obj_idx, - .leaf_idx = cv_leaf_idx_from_ti(&input->debug_t_arr[debug_t->pch_obj_idx], source, ti) - }; - } else { - U64 ts_idx = input->obj_to_ts[obj_idx]; - if (ts_idx != 0) { - U64 ts_obj_idx = input->ts_obj_range.min + ts_idx; - CV_DebugT *ts_debug_t = &input->debug_t_arr[ts_obj_idx]; - leaf_ref = (LNK_LeafRef){ - .obj_idx = ts_obj_idx, - .leaf_idx = cv_leaf_idx_from_ti(ts_debug_t, source, ti) - }; - } else { - leaf_ref = (LNK_LeafRef){ - .obj_idx = obj_idx, - .leaf_idx = cv_leaf_idx_from_ti(debug_t, source, ti) - }; - } + return (LNK_LeafRef){ debug_t->pch_obj_idx, + cv_leaf_idx_from_ti(&input->debug_t_arr[debug_t->pch_obj_idx], source, ti) }; } - return leaf_ref; + + // ti range: external type server + U64 ts_idx = input->obj_to_ts[obj_idx]; + if (ts_idx) { + U64 ts_obj_idx = input->ts_obj_range.min + ts_idx; + CV_DebugT *ts_debug_t = input->debug_t_arr + ts_obj_idx; + return (LNK_LeafRef){ ts_obj_idx, cv_leaf_idx_from_ti(ts_debug_t, source, ti) }; + } + + // ti range: internal type server + return (LNK_LeafRef){ obj_idx, cv_leaf_idx_from_ti(debug_t, source, ti) }; } internal int lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b) { - int cmp = 0; - if (a.obj_idx < b.obj_idx) { - cmp = -1; - } else if (a.obj_idx > b.obj_idx) { - cmp = +1; - } else { - if (a.leaf_idx < b.leaf_idx) { - cmp = -1; - } else if (a.leaf_idx > b.leaf_idx) { - cmp = +1; - } + if (a.obj_idx == b.obj_idx) { + return a.leaf_idx < b.leaf_idx ? -1 : + a.leaf_idx > b.leaf_idx ? +1 : 0; } - return cmp; + return a.obj_idx < b.obj_idx ? -1 : + a.obj_idx > b.obj_idx ? +1 : 0; } internal int @@ -1221,12 +1166,18 @@ THREAD_POOL_TASK_FUNC(lnk_cv_patcher_symbols_task) { ProfBeginFunction(); LNK_MergeTypes *task = raw_task; - for EachInRange(i, task->ranges[task_id]) { + for EachInRange(i, task->input->symbol_input_ranges[task_id]) { LNK_SymbolInput symbols = task->input->symbol_inputs[i]; - for EachNode(n, CV_SymbolNode, symbols.symbol_list->first) { + + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { Temp temp = temp_begin(task->fixed_arenas[task_id]); - CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, n->data.kind, n->data.data); - lnk_fixup_cv_type_indices(task, symbols.obj_idx, n->data.data, ti_info_list); + + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); + + CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, symbol.kind, symbol.data); + lnk_fixup_cv_type_indices(task, symbols.obj_idx, symbol.data, ti_info_list); + temp_end(temp); } } @@ -1287,52 +1238,57 @@ THREAD_POOL_TASK_FUNC(lnk_fixup_symbols_task) U8 **leaf_arr_ipi = task->result.v [CV_TypeIndexSource_IPI]; CV_TypeIndex min_ti_ipi = task->min_type_indices[CV_TypeIndexSource_IPI]; - for EachNode(symnode, CV_SymbolNode, task->input->symbol_inputs[task_id].symbol_list->first) { - CV_Symbol *symbol = &symnode->data; + for EachInRange(i, task->input->symbol_input_ranges[task_id]) { + LNK_SymbolInput symbols = task->input->symbol_inputs[i]; - // convert symbol to final type - switch (symbol->kind) { - case CV_SymKind_LPROC32_ID: symbol->kind = CV_SymKind_LPROC32; goto fixup_id; - case CV_SymKind_GPROC32_ID: symbol->kind = CV_SymKind_GPROC32; goto fixup_id; - case CV_SymKind_LPROC32_DPC_ID: symbol->kind = CV_SymKind_LPROC32_DPC; goto fixup_id; - case CV_SymKind_LPROCMIPS_ID: symbol->kind = CV_SymKind_LPROCMIPS; goto fixup_id; - case CV_SymKind_GPROCMIPS_ID: symbol->kind = CV_SymKind_GPROCMIPS; goto fixup_id; - case CV_SymKind_LPROCIA64_ID: symbol->kind = CV_SymKind_LPROCIA64; goto fixup_id; - case CV_SymKind_GPROCIA64_ID: symbol->kind = CV_SymKind_GPROCIA64; goto fixup_id; - fixup_id:; { - CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol->data.str; - if (proc32->itype < min_ti_ipi) { - // TODO: in some cases destructors don't have a type, need a repro - break; + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); + + // convert symbol to final type + switch (symbol.kind) { + case CV_SymKind_LPROC32_ID: symbol.kind = CV_SymKind_LPROC32; goto fixup_id; + case CV_SymKind_GPROC32_ID: symbol.kind = CV_SymKind_GPROC32; goto fixup_id; + case CV_SymKind_LPROC32_DPC_ID: symbol.kind = CV_SymKind_LPROC32_DPC; goto fixup_id; + case CV_SymKind_LPROCMIPS_ID: symbol.kind = CV_SymKind_LPROCMIPS; goto fixup_id; + case CV_SymKind_GPROCMIPS_ID: symbol.kind = CV_SymKind_GPROCMIPS; goto fixup_id; + case CV_SymKind_LPROCIA64_ID: symbol.kind = CV_SymKind_LPROCIA64; goto fixup_id; + case CV_SymKind_GPROCIA64_ID: symbol.kind = CV_SymKind_GPROCIA64; goto fixup_id; + fixup_id:; { + CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol.data.str; + if (proc32->itype < min_ti_ipi) { + // TODO: in some cases destructors don't have a type, need a repro + break; + } + + if ((proc32->itype - min_ti_ipi) > leaf_count_ipi) { + Assert("TODO: error handle corrupted type index"); + break; + } + + U64 leaf_idx = proc32->itype - min_ti_ipi; + String8 leaf_data = str8(leaf_arr_ipi[leaf_idx], max_U64); + + CV_Leaf leaf; + cv_read_leaf(leaf_data, 0, 1, &leaf); + + U64 min_leaf_size = cv_header_struct_size_from_leaf_kind(leaf.kind); + if (min_leaf_size > leaf.data.size) { + Assert(!"TODO: error handle corrupt leaf"); + break; + } + + if (leaf.kind == CV_LeafKind_FUNC_ID) { + proc32->itype = ((CV_LeafFuncId *) leaf.data.str)->itype; + } else if (leaf.kind == CV_LeafKind_MFUNC_ID) { + proc32->itype = ((CV_LeafMFuncId *) leaf.data.str)->itype; + } else { + Assert(!"TODO: erorr handle unexpected leaf type"); + break; + } + } break; + case CV_SymKind_PROC_ID_END: symbol.kind = CV_SymKind_END; break; } - - if ((proc32->itype - min_ti_ipi) > leaf_count_ipi) { - Assert("TODO: error handle corrupted type index"); - break; - } - - U64 leaf_idx = proc32->itype - min_ti_ipi; - String8 leaf_data = str8(leaf_arr_ipi[leaf_idx], max_U64); - - CV_Leaf leaf; - cv_read_leaf(leaf_data, 0, 1, &leaf); - - U64 min_leaf_size = cv_header_struct_size_from_leaf_kind(leaf.kind); - if (min_leaf_size > leaf.data.size) { - Assert(!"TODO: error handle corrupt leaf"); - break; - } - - if (leaf.kind == CV_LeafKind_FUNC_ID) { - proc32->itype = ((CV_LeafFuncId *) leaf.data.str)->itype; - } else if (leaf.kind == CV_LeafKind_MFUNC_ID) { - proc32->itype = ((CV_LeafMFuncId *) leaf.data.str)->itype; - } else { - Assert(!"TODO: erorr handle unexpected leaf type"); - break; - } - } break; - case CV_SymKind_PROC_ID_END: symbol->kind = CV_SymKind_END; break; } } } @@ -1780,89 +1736,251 @@ lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, U64 leaf_cou } internal -THREAD_POOL_TASK_FUNC(lnk_filter_out_gsi_symbols_task) +THREAD_POOL_TASK_FUNC(lnk_process_and_populate_gsi_and_psi_task) { - U64 obj_idx = task_id; - LNK_ProcessSymDataTaskData *task = raw_task; - CV_SymbolList *gsi_list = &task->gsi_list_arr[obj_idx]; - CV_SymbolListArray parsed_symbols = task->parsed_symbols[obj_idx]; + Temp scratch = scratch_begin(&arena, 1); - CV_SymbolList global_list = {0}; - CV_SymbolList typedef_list = {0}; - for (U64 i = 0; i < parsed_symbols.count; ++i) { - CV_SymbolList *list = &parsed_symbols.v[i]; - U64 depth = 0; - for (CV_SymbolNode *curr = list->first, *next; curr != 0; curr = next) { - next = curr->next; + U64 obj_idx = task_id; + LNK_BuildPdb *task = raw_task; + PDB_GsiContext *gsi = task->pdb->gsi; + PDB_PsiContext *psi = task->pdb->psi; - if (cv_is_global_symbol(curr->data.kind)) { - cv_symbol_list_remove_node(list, curr); - cv_symbol_list_push_node(&global_list, curr); - } else if (cv_is_typedef(curr->data.kind)) { + if (task_id == 0) { + task->proc_ref_sizes = push_array(scratch.arena, U64, tp->worker_count); + task->proc_ref_counts = push_array(scratch.arena, U64, tp->worker_count); + } + barrier_wait(tp->barrier); + + // collect global data and global typedefs + VoidList global_symbols = {0}; + for EachInRange(i, task->cv->symbol_input_ranges[task_id]) { + LNK_SymbolInput symbols = task->cv->symbol_inputs[i]; + for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { + CV_Symbol symbol = {0}; + U64 symbol_read_size = cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol); + if (symbol_read_size == 0) { break; } + cursor += symbol_read_size; + + if (cv_is_global_symbol(symbol.kind)) { + void *ptr = cv_ptr_from_symbol(symbol); + void_list_push(scratch.arena, &global_symbols, ptr); + } else if (cv_is_typedef(symbol.kind)) { if (depth == 0) { - cv_symbol_list_remove_node(list, curr); - cv_symbol_list_push_node(&typedef_list, curr); + void *ptr = cv_ptr_from_symbol(symbol); + void_list_push(scratch.arena, &global_symbols, ptr); } - } - // Undocumented symbol that appears only in objs. - // MSVC removes these symbols from output. - // - // LLD-link replaces symbol with S_SKIP: - // https://github.com/llvm/llvm-project/blob/main/lld/COFF/PDB.cpp#L575 - else if (curr->data.kind == 0x1176) { - cv_symbol_list_remove_node(list, curr); + } else if (symbol.kind == 0x1176) { + CV_SymKind *kind_ptr = cv_kind_ptr_from_symbol(symbol); + *kind_ptr = CV_SymKind_SKIP; + } else if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { + String8 name = cv_name_from_symbol(symbol.kind, symbol.data); + task->proc_ref_sizes[task_id] += sizeof(CV_SymRef2) + name.size + 1; + task->proc_ref_counts[task_id] += 1; } - if (cv_is_scope_symbol(curr->data.kind)) { - ++depth; - } else if (cv_is_end_symbol(curr->data.kind)) { - Assert(depth > 0); - --depth; + if (cv_is_scope_symbol(symbol.kind)) { + depth += 1; + } else if (cv_is_end_symbol(symbol.kind)) { + if (depth == 0) { Assert(0 && "malformed symbol stream"); break; } + depth -= 1; } } } - - // collect GSI symbols - Assert(gsi_list->count == 0); - cv_symbol_list_concat_in_place(gsi_list, &global_list); - cv_symbol_list_concat_in_place(gsi_list, &typedef_list); + ins_atomic_u64_add_eval(&task->total_symbol_count, global_symbols.count); + barrier_wait(tp->barrier); + + if (task_id == 0) { + task->bucket_cap = (U64)((F64)task->total_symbol_count * 1.3); + task->buckets = push_array(scratch.arena, void *, task->bucket_cap); + task->insert_count = push_array(scratch.arena, U64, tp->worker_count); + } + barrier_wait(tp->barrier); + + // insert symbols into hash table + for EachNode(n, VoidNode, global_symbols.first) { + String8 raw = cv_raw_from_symbol(n->v); + U64 hash = u64_hash_from_str8(raw); + void *slot_ptr = cv_symbol_deduper_insert_or_update(task->buckets, task->bucket_cap, hash, n->v); + if (slot_ptr == 0) { + task->insert_count[task_id] += 1; + } + } + barrier_wait(tp->barrier); + + // compact buckets + for (U64 i = 1, k = 0; i < task->bucket_cap; i += 1) { + if (task->buckets[i] != 0 && task->buckets[i-1] == 0) { + while (task->buckets[k] != 0) { k += 1; } + task->buckets[k] = task->buckets[i]; + task->buckets[i] = 0; + } + } + barrier_wait(tp->barrier); + + if (task_id == 0) { + task->symbol_count = sum_array_u64(tp->worker_count, task->insert_count); + task->symbol_arr = task->buckets; + + // divide symbol per worker + task->symbol_ranges = tp_divide_work(scratch.arena, task->symbol_count, tp->worker_count); + + // alloc memory for hashes + task->symbol_hashes = push_array_no_zero(scratch.arena, U32, task->symbol_count); + } + barrier_wait(tp->barrier); + + // hash symbols + for EachInRange(i, task->symbol_ranges[task_id]) { + CV_Symbol symbol = cv_symbol_from_ptr(task->symbol_arr[i]); + String8 name = cv_name_from_symbol(symbol.kind, symbol.data); + task->symbol_hashes[i] = gsi_hash(gsi, name); + } + barrier_wait(tp->barrier); + + if (task_id == 0) { + // prealloc symbol nodes + CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, task->symbol_count); + + // push symbols to GSI + for EachIndex(i, task->symbol_count) { + CV_SymbolNode *n = &nodes[i]; + n->prev = n->next = 0; + n->data = cv_symbol_from_ptr(task->symbol_arr[i]); + gsi_push_(gsi, task->symbol_hashes[i], n); + } + + // prealloc output buffer for the proc refs + task->proc_refs.size = sum_array_u64(tp->worker_count, task->proc_ref_sizes); + task->proc_refs.str = push_array(gsi->arena, U8, task->proc_refs.size); + task->proc_ref_offs = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_sizes, tp->worker_count); + } + barrier_wait(tp->barrier); + + { + U64 proc_refs_size = task->proc_ref_sizes[task_id]; + U64 proc_refs_off = task->proc_ref_offs[task_id]; + U8 *proc_refs = task->proc_refs.str + proc_refs_off; + Arena *proc_ref_arena = arena_alloc_(&(ArenaParams){ .optional_backing_buffer = proc_refs, + .reserve_size = proc_refs_size, + .commit_size = proc_refs_size + }); + U64 hash_idx = 0; + for EachInRange(i, task->cv->symbol_input_ranges[task_id]) { + LNK_SymbolInput *in = &task->cv->symbol_inputs[i]; + String8 raw_symbols = in->raw_symbols; + CV_ModIndex imod = task->mod_arr[in->obj_idx]->imod; + for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= raw_symbols.size; ) { + CV_Symbol symbol = {0}; + U64 read_size = cv_read_symbol(raw_symbols, cursor, CV_SymbolAlign, &symbol); + if (read_size == 0) { break; } + cursor += read_size; + if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { + String8 name = cv_name_from_symbol(symbol.kind, symbol.data); + CV_Symbol proc_ref = cv_make_proc_ref(proc_ref_arena, imod, safe_cast_u32(symbol.offset), name, /* is_local */ 1); + task->proc_ref_hashes[hash_idx] = hash_from_cv_symbol(&proc_ref); + hash_idx += 1; + } + } + } + barrier_wait(tp->barrier); + + if (task_id == 0) { + U64 *offsets = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_sizes, tp->worker_count); + for EachIndex(i, tp->worker_count) { + CV_SymbolNode *nodes = push_array(gsi->arena, CV_SymbolNode, task->proc_ref_counts[i]); + U64 node_idx = 0; + for (U64 cursor = offsets[i]; cursor < offsets[i+1]; ) { + U64 read_size = cv_read_symbol(task->proc_refs, cursor, PDB_SYMBOL_ALIGN, &nodes[node_idx].data); + if (read_size == 0) { break; } + cursor += read_size; + gsi_push_(gsi, task->proc_ref_hashes[node_idx], &nodes[node_idx]); + } + } + } + barrier_wait(tp->barrier); + } + + { + for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { + task->public_symbol_node_counts[task_id] += chunk->count; + } + barrier_wait(tp->barrier); + + if (task_id == 0) { + task->public_symbol_node_offsets = offsets_from_counts_array_u64(scratch.arena, task->public_symbol_node_counts, tp->worker_count); + U64 public_symbol_total_count = sum_array_u64(tp->worker_count, task->public_symbol_node_offsets); + task->public_symbol_nodes = push_array(psi->gsi->arena, CV_SymbolNode, public_symbol_total_count); + task->public_symbols = push_array(scratch.arena, CV_SymbolList, tp->worker_count); + task->public_symbols = push_array(scratch.arena, CV_SymbolList, tp->worker_count); + } + barrier_wait(tp->barrier); + + for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { + U64 node_idx = task->public_symbol_node_offsets[task_id]; + for EachIndex(i, chunk->count) { + LNK_Symbol *symbol = chunk->v[i].symbol; + LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); + + if (symbol_parsed.section_number == lnk_obj_get_removed_section_number(symbol_ref.obj)) { continue; } + + COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); + if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } + + CV_Pub32Flags flags = 0; + if (COFF_SymbolType_IsFunc(symbol_parsed.type)) { flags |= CV_Pub32Flag_Function; } + + ISectOff sc = lnk_sc_from_symbol(symbol); + U16 symbol_isect16 = safe_cast_u16(sc.isect); + U32 symbol_off32 = safe_cast_u32(sc.off); + + task->public_symbol_nodes[node_idx].data = cv_make_pub32(arena, flags, symbol_off32, symbol_isect16, symbol->name); + cv_symbol_list_push_node(&task->public_symbols[task_id], &task->public_symbol_nodes[node_idx]); + node_idx += 1; + } + } + barrier_wait(tp->barrier); + + if (task_id == 0) { + task->public_symbol_hashes = push_array(scratch.arena, U32 *, tp->worker_count); + } + barrier_wait(tp->barrier); + + { + U64 n_idx = 0; + task->public_symbol_hashes[task_id] = push_array(scratch.arena, U32, task->public_symbols[task_id].count); + for EachNode(n, CV_SymbolNode, task->public_symbols[task_id].first) { + String8 name = cv_name_from_symbol(n->data.kind, n->data.data); + task->public_symbol_hashes[task_id][n_idx] = gsi_hash(gsi, name); + n += 1; + } + } + barrier_wait(tp->barrier); + + if (task_id == 0) { + for EachIndex(i, tp->worker_count) { + U64 curr_idx = 0; + for (CV_SymbolNode *curr = task->public_symbols[i].first, *next = 0; curr != 0; curr = next, curr_idx += 1) { + next = curr->next; + gsi_push_(psi->gsi, task->public_symbol_hashes[i][curr_idx], curr); + } + } + } + barrier_wait(tp->barrier); + } + + scratch_end(scratch); } internal -THREAD_POOL_TASK_FUNC(lnk_make_proc_refs_task) +THREAD_POOL_TASK_FUNC(lnk_fixup_debug_s_task) { ProfBeginFunction(); - - U64 obj_idx = task_id; - LNK_ProcessSymDataTaskData *task = raw_task; - PDB_DbiModule *mod = task->mod_arr[obj_idx]; - CV_SymbolList *gsi_list = &task->gsi_list_arr[obj_idx]; - CV_SymbolListArray parsed_symbols = task->parsed_symbols[obj_idx]; - - for (U64 i = 0; i < parsed_symbols.count; ++i) { - CV_SymbolList list = parsed_symbols.v[i]; - CV_SymbolList proc_refs = cv_make_proc_refs(arena, mod->imod, list); - cv_symbol_list_concat_in_place(gsi_list, &proc_refs); - } - - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_fixup_symbol_offsets_task) -{ - ProfBeginFunction(); - - LNK_ProcessSymDataTaskData *task = raw_task; - CV_SymbolListArray symbols = task->parsed_symbols[task_id]; - - // fixup symbol offsets and estimate symbol data size - U64 size = sizeof(CV_Signature); - for EachIndex(i, symbols.count) { - size += cv_patch_symbol_tree_offsets(symbols.v[i], size, PDB_SYMBOL_ALIGN); - } - task->serialized_symbol_data_sizes[task_id] = AlignPow2(size, CV_C13SubSectionAlign); - + U64 obj_idx = task_id; + LNK_BuildPdb *task = raw_task; + String8List raw_symbols = cv_sub_section_from_debug_s(task->cv->debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); + task->symbol_sizes[obj_idx] = sizeof(CV_Signature); + task->symbol_sizes[obj_idx] += cv_patch_symbol_tree_offsets_new(raw_symbols, task->symbol_sizes[obj_idx], PDB_SYMBOL_ALIGN); ProfEnd(); } @@ -1872,9 +1990,9 @@ THREAD_POOL_TASK_FUNC(lnk_process_c13_data_task) ProfBeginFunction(); Temp scratch = scratch_begin(&arena,1); - U64 obj_idx = task_id; - LNK_ProcessC13DataTask *task = raw_task; - CV_DebugS debug_s = task->debug_s_arr[obj_idx]; + U64 obj_idx = task_id; + LNK_BuildPdb *task = raw_task; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; // parse checksum data String8List checksum_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); @@ -1887,7 +2005,7 @@ THREAD_POOL_TASK_FUNC(lnk_process_c13_data_task) String8List source_file_names_list = cv_c13_collect_source_file_names(arena, checksum_list, string_data); // relocate checksum data - cv_c13_patch_string_offsets_in_checksum_list(checksum_list, string_data, task->string_data_base_offset, task->string_ht); + cv_c13_patch_string_offsets_in_checksum_list(checksum_list, string_data, task->pdb->info->strtab.size, task->string_ht); // store for later pass task->source_file_names_list_arr[obj_idx] = source_file_names_list; @@ -1897,54 +2015,58 @@ THREAD_POOL_TASK_FUNC(lnk_process_c13_data_task) } internal -THREAD_POOL_TASK_FUNC(lnk_write_module_data_task) +THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) { - LNK_WriteModuleDataTask *task = raw_task; + LNK_BuildPdb *task = raw_task; - U64 obj_idx = task_id; - PDB_DbiModule *mod = task->mod_arr [obj_idx]; - CV_DebugS *debug_s = &task->debug_s_arr [obj_idx]; - CV_SymbolListArray parsed_symbols = task->parsed_symbols [obj_idx]; - String8List globrefs = task->globrefs_arr [obj_idx]; - U64 sym_data_size = task->serialized_symbol_data_sizes[obj_idx]; - - MSF_UInt stream_cap = msf_stream_get_cap(task->msf, mod->sn); + U64 obj_idx = task_id; + PDB_DbiModule *mod = task->mod_arr [obj_idx]; + CV_DebugS debug_s = task->cv->debug_s_arr [obj_idx]; + String8List globrefs = task->globrefs_arr [obj_idx]; + U64 sym_data_size = task->serialized_symbol_data_sizes[obj_idx]; + MSF_Context *msf = task->pdb->msf; + MSF_UInt stream_cap = msf_stream_get_cap(task->pdb->msf, mod->sn); // write symbols if (sym_data_size > 0) { Temp scratch = scratch_begin(&arena, 1); - U64 temp_max = max_U16; - U64 temp_size = 0; - U8 *temp = push_array(scratch.arena, U8, temp_max); + msf_stream_write_u32(msf, mod->sn, CV_Signature_C13); - msf_stream_write_u32(task->msf, mod->sn, CV_Signature_C13); + String8List raw_symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + U64 temp_max = max_U16; + U64 temp_size = 0; + U8 *temp = push_array(scratch.arena, U8, temp_max); + for EachNode(n, String8Node, raw_symbols.first) { + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + // read symbol + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); - for EachIndex(i, parsed_symbols.count) { - for EachNode(symbol_n, CV_SymbolNode, parsed_symbols.v[i].first) { - U64 symbol_size = cv_size_from_symbol(&symbol_n->data, PDB_SYMBOL_ALIGN); + U64 symbol_size = cv_size_from_symbol(&symbol, PDB_SYMBOL_ALIGN); - // flush temp + // flush temp to MSF if (temp_size + symbol_size > temp_max) { - Assert(temp_size <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); - msf_stream_write(task->msf, mod->sn, temp, temp_size); + Assert(temp_size <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write(msf, mod->sn, temp, temp_size); temp_size = 0; } - U64 serial_size = cv_write_symbol(temp, temp_size, temp_max, &symbol_n->data, PDB_SYMBOL_ALIGN); + // acc serialized symbols in temp + U64 serial_size = cv_write_symbol(temp, temp_size, temp_max, &symbol, PDB_SYMBOL_ALIGN); Assert(serial_size == symbol_size); temp_size += serial_size; } } // flush remaining temp - Assert(temp_size <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); - msf_stream_write(task->msf, mod->sn, temp, temp_size); - msf_stream_align(task->msf, mod->sn, CV_C13SubSectionAlign); + Assert(temp_size <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write(msf, mod->sn, temp, temp_size); + msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); - U64 size = msf_stream_get_pos(task->msf, mod->sn); + U64 size = msf_stream_get_pos(msf, mod->sn); // assert our symbol size estimate was correct - Assert(sym_data_size == msf_stream_get_pos(task->msf, mod->sn)); + Assert(sym_data_size == msf_stream_get_pos(msf, mod->sn)); scratch_end(scratch); } @@ -1952,41 +2074,41 @@ THREAD_POOL_TASK_FUNC(lnk_write_module_data_task) // write rest of c13 data U64 c13_data_size; { - U64 c13_start_pos = msf_stream_get_pos(task->msf, mod->sn); + U64 c13_start_pos = msf_stream_get_pos(msf, mod->sn); - for EachElement(layout_idx, debug_s->data_list) { + for EachElement(layout_idx, debug_s.data_list) { if (layout_idx == CV_C13SubSectionIdxKind_Lines || layout_idx == CV_C13SubSectionIdxKind_Symbols) { continue; } CV_C13SubSectionKind kind = cv_c13_sub_section_kind_from_idx(layout_idx); - String8List *data = cv_sub_section_ptr_from_debug_s(debug_s, kind); + String8List *data = cv_sub_section_ptr_from_debug_s(&debug_s, kind); if (data->total_size == 0) { continue; } - Assert(AlignPow2(sizeof(U32)*2 + data->total_size, PDB_SYMBOL_ALIGN) <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); - msf_stream_write_u32 (task->msf, mod->sn, kind); - msf_stream_write_u32 (task->msf, mod->sn, safe_cast_u32(data->total_size)); - msf_stream_write_list(task->msf, mod->sn, *data); - msf_stream_align(task->msf, mod->sn, CV_C13SubSectionAlign); + Assert(AlignPow2(sizeof(U32)*2 + data->total_size, PDB_SYMBOL_ALIGN) <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write_u32 (msf, mod->sn, kind); + msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(data->total_size)); + msf_stream_write_list(msf, mod->sn, *data); + msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); } - String8List *line_data = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + String8List *line_data = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Lines); for EachNode(line_n, String8Node, line_data->first) { if (line_n->string.size == 0) { continue; } - Assert(AlignPow2(sizeof(U32)*2 + line_n->string.size, PDB_SYMBOL_ALIGN) <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); - msf_stream_write_u32 (task->msf, mod->sn, CV_C13SubSectionKind_Lines); - msf_stream_write_u32 (task->msf, mod->sn, safe_cast_u32(line_n->string.size)); - msf_stream_write_string(task->msf, mod->sn, line_n->string); - msf_stream_align(task->msf, mod->sn, CV_C13SubSectionAlign); + Assert(AlignPow2(sizeof(U32)*2 + line_n->string.size, PDB_SYMBOL_ALIGN) <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write_u32 (msf, mod->sn, CV_C13SubSectionKind_Lines); + msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(line_n->string.size)); + msf_stream_write_string(msf, mod->sn, line_n->string); + msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); } - U64 c13_end_pos = msf_stream_get_pos(task->msf, mod->sn); + U64 c13_end_pos = msf_stream_get_pos(msf, mod->sn); c13_data_size = c13_end_pos - c13_start_pos; - Assert(c13_data_size == cv_size_from_debug_s(debug_s, CV_C13SubSectionAlign)); + Assert(c13_data_size == cv_size_from_debug_s(&debug_s, CV_C13SubSectionAlign)); } // write global refs - Assert(globrefs.total_size <= (stream_cap - msf_stream_get_pos(task->msf, mod->sn))); - msf_stream_write_list(task->msf, mod->sn, globrefs); + Assert(globrefs.total_size <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write_list(msf, mod->sn, globrefs); // update module data sizes mod->sym_data_size = safe_cast_u32(sym_data_size); @@ -1996,34 +2118,7 @@ THREAD_POOL_TASK_FUNC(lnk_write_module_data_task) // make stream has enough memory so it doens't trigger memory allocations in MSF // during multi-thread write - AssertAlways(task->mod_sizes[obj_idx] == msf_stream_get_pos(task->msf, mod->sn)); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_cv_symbol_ptr_array_hasher) -{ - LNK_CvSymbolPtrArrayHasher *task = raw_task; - Rng1U64 range = task->range_arr[task_id]; - for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) { - task->hash_arr[symbol_idx] = XXH3_64bits(task->arr[symbol_idx]->data.data.str, task->arr[symbol_idx]->data.data.size); - } -} - -internal U64 * -lnk_hash_cv_symbol_ptr_arr(TP_Context *tp, Arena *arena, CV_SymbolPtrArray arr) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - LNK_CvSymbolPtrArrayHasher task = {0}; - task.hash_arr = push_array_no_zero(arena, U64, arr.count); - task.arr = arr.v; - task.range_arr = tp_divide_work(scratch.arena, arr.count, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, lnk_cv_symbol_ptr_array_hasher, &task); - - scratch_end(scratch); - ProfEnd(); - return task.hash_arr; + AssertAlways(task->mod_sizes[obj_idx] == msf_stream_get_pos(msf, mod->sn)); } internal @@ -2033,10 +2128,10 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) // TODO: put back unused sc nodes // TODO: compute CRC for relocations - U64 obj_idx = task_id; - LNK_PushDbiSecContribTaskData *task = raw_task; - PDB_DbiModule *mod = task->mod_arr[obj_idx]; - LNK_Obj *obj = task->obj_arr[obj_idx]; + U64 obj_idx = task_id; + LNK_BuildPdb *task = raw_task; + PDB_DbiModule *mod = task->mod_arr [obj_idx]; + LNK_Obj *obj = task->cv->obj_arr[obj_idx]; COFF_SectionHeader *obj_section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; PDB_DbiSectionContribNode *sc_arr = push_array_no_zero(arena, PDB_DbiSectionContribNode, obj->header.section_count_no_null); @@ -2104,8 +2199,8 @@ THREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task) { ProfBeginFunction(); - LNK_BuildPublicSymbolsTask *task = raw_task; - for (LNK_SymbolHashTrieChunk *chunk = task->chunk_lists[task_id].first; chunk != 0; chunk = chunk->next) { + LNK_BuildPdb *task = raw_task; + for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { CV_SymbolNode *nodes = push_array_no_zero(arena, CV_SymbolNode, chunk->count); U64 node_idx = 0; for EachIndex(i, chunk->count) { @@ -2134,131 +2229,77 @@ THREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task) ProfEnd(); } -internal -THREAD_POOL_TASK_FUNC(lnk_gsi_hash_cv_list_task) -{ - ProfBeginFunction(); - - LNK_BuildPublicSymbolsTask *task = raw_task; - Rng1U64 range = task->symbol_ranges[task_id]; - - for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) { - CV_Symbol *symbol = &task->symbols.v[symbol_idx]->data; - String8 name = cv_name_from_symbol(symbol->kind, symbol->data); - task->hashes[symbol_idx] = gsi_hash(task->gsi, name); - } - - ProfEnd(); -} - -internal void -lnk_build_pdb_public_symbols(TP_Context *tp, - TP_Arena *arena, - LNK_SymbolTable *symtab, - PDB_PsiContext *psi) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(arena->v, arena->count); - - ProfBegin("Defined"); - LNK_BuildPublicSymbolsTask task = {0}; - task.pub_list_arr = push_array(scratch.arena, CV_SymbolList, tp->worker_count); - task.chunk_lists = symtab->chunks; - tp_for_parallel(tp, arena, tp->worker_count, lnk_build_pdb_public_symbols_defined_task, &task); - ProfEnd(); - - CV_SymbolPtrArray symbols = cv_symbol_ptr_array_from_list(scratch.arena, tp, tp->worker_count, task.pub_list_arr); - - ProfBegin("GSI Push"); - gsi_push_many_arr(tp, psi->gsi, symbols.count, symbols.v); - ProfEnd(); - - scratch_end(scratch); - ProfEnd(); -} - internal String8List -lnk_build_pdb(TP_Context *tp, - TP_Arena *tp_arena, - String8 image_data, - LNK_Config *config, - LNK_SymbolTable *symtab, - U64 obj_count, - LNK_Obj **obj_arr, - CV_DebugS *debug_s_arr, - U64 symbol_input_count, - LNK_SymbolInput *symbol_inputs, - CV_SymbolListArray *parsed_symbols, - LNK_MergedTypes types) +lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types) { - ProfBegin("PDB"); + ProfBeginFunction(); + Temp scratch = scratch_begin(tp_arena->v, tp_arena->count); Temp huge_arena_temp = temp_begin(lnk_get_huge_arena()); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, image_data); - COFF_SectionHeader **image_section_table = coff_section_table_from_data(scratch.arena, image_data, pe.section_table_range); - U64 image_section_table_count = pe.section_count+1; + U64 obj_count = cv->obj_count; - ProfBegin("Setup PDB Context"); - PDB_Context *pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid); - ProfEnd(); + LNK_BuildPdb task = { + .image_data = image_data, + .symtab = symtab, + .cv = cv, + .pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), + }; // set min type indices - for EachElement(ti_source, types.min_type_indices) { pdb->type_servers[ti_source]->ti_lo = types.min_type_indices[ti_source]; } - - // move patched type data - // - // leaf data is stored in g_file_arena which has linker's life-time - // and this way we skip redundant leaf copy to the type server to make things faster - pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_IPI], types.count[CV_TypeIndexSource_IPI], types.v[CV_TypeIndexSource_IPI]); - pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_TPI], types.count[CV_TypeIndexSource_TPI], types.v[CV_TypeIndexSource_TPI]); - - ProfBegin("Collect Symbols for GSI"); - CV_SymbolList *gsi_list_arr = push_array(scratch.arena, CV_SymbolList, obj_count); - { - LNK_ProcessSymDataTaskData task = {0}; - task.gsi_list_arr = gsi_list_arr; - task.parsed_symbols = parsed_symbols; - tp_for_parallel(tp, 0, obj_count, lnk_filter_out_gsi_symbols_task, &task); - } - ProfEnd(); + for EachElement(ti_source, cv_types.min_type_indices) { task.pdb->type_servers[ti_source]->ti_lo = cv_types.min_type_indices[ti_source]; } ProfBegin("Reserve DBI Modules"); - PDB_DbiModule **mod_arr = push_array(tp_arena->v[0], PDB_DbiModule *, obj_count); + task.mod_arr = push_array(tp_arena->v[0], PDB_DbiModule *, obj_count); for EachIndex(obj_idx, obj_count) { - LNK_Obj *obj = obj_arr[obj_idx]; - mod_arr[obj_idx] = dbi_push_module(pdb->dbi, obj->path, lnk_obj_get_lib_path(obj)); + LNK_Obj *obj = cv->obj_arr[obj_idx]; + task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, obj->path, lnk_obj_get_lib_path(obj)); // we don't support symbol append - Assert(mod_arr[obj_idx]->sn == MSF_INVALID_STREAM_NUMBER); + Assert(task.mod_arr[obj_idx]->sn == MSF_INVALID_STREAM_NUMBER); } ProfEnd(); + task.serialized_symbol_data_sizes = push_array(scratch.arena, U64, obj_count); + ProfScope("Make GSI/PSI") + { + ProfScope("Process & Populate GSI/PSI") tp_for_parallel(tp, 0, tp->worker_count, lnk_process_and_populate_gsi_and_psi_task, &task); + + ProfBegin("Build and write GSI/PSI"); + PDB_Context *pdb = task.pdb; + Assert(pdb->dbi->globals_sn == MSF_INVALID_STREAM_NUMBER && + pdb->dbi->publics_sn == MSF_INVALID_STREAM_NUMBER && + pdb->dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER); + pdb->dbi->globals_sn = msf_stream_alloc(pdb->msf); + pdb->dbi->publics_sn = msf_stream_alloc(pdb->msf); + pdb->dbi->symbols_sn = msf_stream_alloc(pdb->msf); + psi_build(tp, pdb->psi, pdb->msf, pdb->dbi->publics_sn, pdb->dbi->symbols_sn); + gsi_build(tp, pdb->gsi, pdb->msf, pdb->dbi->globals_sn, pdb->dbi->symbols_sn); + ProfEnd(); + + ProfScope("fixup_symbol_streams") tp_for_parallel(tp, tp_arena, obj_count, lnk_fixup_debug_s_task, &task); + } + ProfBegin("Build String Table"); - CV_StringHashTable string_ht = cv_dedup_string_tables(tp_arena, tp, obj_count, debug_s_arr); - cv_string_hash_table_assign_buffer_offsets(tp, string_ht); - U64 string_data_base_offset = pdb->info->strtab.size; - pdb_strtab_add_cv_string_hash_table(&pdb->info->strtab, string_ht); + task.string_ht = cv_dedup_string_tables(tp_arena, tp, obj_count, cv->debug_s_arr); + cv_string_hash_table_assign_buffer_offsets(tp, task.string_ht); + pdb_strtab_add_cv_string_hash_table(&task.pdb->info->strtab, task.string_ht); ProfEnd(); ProfBegin("Build Source Files List"); { // push source files per module info - LNK_ProcessC13DataTask task = {0}; - task.debug_s_arr = debug_s_arr; - task.string_data_base_offset = string_data_base_offset; task.source_file_names_list_arr = push_array_no_zero(tp_arena->v[0], String8List, obj_count); - task.string_ht = string_ht; tp_for_parallel(tp, tp_arena, obj_count, lnk_process_c13_data_task, &task); for EachIndex(obj_idx, obj_count) { - String8List source_file_list = str8_list_copy(pdb->dbi->arena, &task.source_file_names_list_arr[obj_idx]); - str8_list_concat_in_place(&mod_arr[obj_idx]->source_file_list, &source_file_list); + String8List source_file_list = str8_list_copy(task.pdb->dbi->arena, &task.source_file_names_list_arr[obj_idx]); + str8_list_concat_in_place(&task.mod_arr[obj_idx]->source_file_list, &source_file_list); } // zero out string table sub section for EachIndex(obj_idx, obj_count) { - MemoryZeroStruct(&debug_s_arr[obj_idx].data_list[CV_C13SubSectionIdxKind_StringTable]); + MemoryZeroStruct(&cv->debug_s_arr[obj_idx].data_list[CV_C13SubSectionIdxKind_StringTable]); } } ProfEnd(); @@ -2266,110 +2307,78 @@ lnk_build_pdb(TP_Context *tp, ProfBegin("Build DBI Modules"); { TP_Temp temp = tp_temp_begin(tp_arena); - { - ProfBegin("Fixup Symbol Offsets"); - U64 *serialized_symbol_data_sizes = push_array(scratch.arena, U64, obj_count); - tp_for_parallel(tp, tp_arena, obj_count, lnk_fixup_symbol_offsets_task, &(LNK_ProcessSymDataTaskData){ .parsed_symbols = parsed_symbols, .serialized_symbol_data_sizes = serialized_symbol_data_sizes }); - ProfEnd(); - // TODO: actually collect offsets and pass them here - ProfBegin("Build Empty Global Reference Array"); - String8List *globrefs_arr = push_array(tp_arena->v[0], String8List, obj_count); - for EachIndex(obj_idx, obj_count) { - String8List *globrefs = &globrefs_arr[obj_idx]; - str8_serial_begin(tp_arena->v[0], globrefs); - Assert(globrefs->total_size == 0); - str8_serial_push_u32(tp_arena->v[0], globrefs, globrefs->total_size); - } - ProfEnd(); - - // reserve memory for module streams - ProfBegin("Reserve Modules Memory"); - U32 *mod_sizes = push_array(scratch.arena, U32, obj_count); - for EachIndex(obj_idx, obj_count) { - // compute number of bytes needed for module data - U64 mod_size = 0; - mod_size += cv_size_from_debug_s(&debug_s_arr[obj_idx], CV_C13SubSectionAlign); - mod_size += serialized_symbol_data_sizes[obj_idx]; - mod_size += globrefs_arr[obj_idx].total_size; - - mod_sizes[obj_idx] = safe_cast_u32(mod_size); - - // allocate stream for module - mod_arr[obj_idx]->sn = msf_stream_alloc_ex(pdb->msf, mod_sizes[obj_idx]); - } - ProfEnd(); - - // copy data to module streams - ProfBegin("Write Modules Data"); - LNK_WriteModuleDataTask write_module_data_task_data = {0}; - write_module_data_task_data.msf = pdb->msf; - write_module_data_task_data.mod_arr = mod_arr; - write_module_data_task_data.debug_s_arr = debug_s_arr; - write_module_data_task_data.serialized_symbol_data_sizes = serialized_symbol_data_sizes; - write_module_data_task_data.parsed_symbols = parsed_symbols; - write_module_data_task_data.globrefs_arr = globrefs_arr; - write_module_data_task_data.mod_sizes = mod_sizes; - tp_for_parallel(tp, 0, obj_count, lnk_write_module_data_task, &write_module_data_task_data); - ProfEnd(); + // TODO: actually collect offsets and pass them here + ProfBegin("Build Empty Global Reference Array"); + task.globrefs_arr = push_array(tp_arena->v[0], String8List, obj_count); + for EachIndex(obj_idx, obj_count) { + String8List *srl = &task.globrefs_arr[obj_idx]; + str8_serial_begin(tp_arena->v[0], srl); + Assert(srl->total_size == 0); + str8_serial_push_u32(tp_arena->v[0], srl, srl->total_size); } + ProfEnd(); + + // reserve memory for module streams + ProfBegin("Reserve Modules Memory"); + task.mod_sizes = push_array(scratch.arena, U32, obj_count); + for EachIndex(obj_idx, obj_count) { + // compute number of bytes needed for module data + U64 mod_size = 0; + mod_size += cv_size_from_debug_s(&cv->debug_s_arr[obj_idx], CV_C13SubSectionAlign); + mod_size += task.serialized_symbol_data_sizes[obj_idx]; + mod_size += task.globrefs_arr[obj_idx].total_size; + + task.mod_sizes[obj_idx] = safe_cast_u32(mod_size); + task.mod_arr [obj_idx]->sn = msf_stream_alloc_ex(task.pdb->msf, task.mod_sizes[obj_idx]); + } + ProfEnd(); + + tp_for_parallel_prof(tp, 0, obj_count, lnk_write_pdb_module_stream, &task, "Write Module Data"); + tp_temp_end(temp); } ProfEnd(); - - ProfBegin("Make Proc Refs"); + + ProfBegin("Build Section Contrib Map"); { - LNK_ProcessSymDataTaskData task = {0}; - task.mod_arr = mod_arr; - task.gsi_list_arr = gsi_list_arr; - task.parsed_symbols = parsed_symbols; - tp_for_parallel(tp, tp_arena, obj_count, lnk_make_proc_refs_task, &task); - } - ProfEnd(); + task.pe = pe_bin_info_from_data(scratch.arena, image_data); + task.image_section_table = coff_section_table_from_data(scratch.arena, image_data, task.pe.section_table_range); + task.image_section_table_count = task.pe.section_count+1; - ProfBegin("Push Global Symbols"); - { - CV_SymbolPtrArray global_symbols = cv_symbol_ptr_array_from_list(scratch.arena, tp, obj_count, gsi_list_arr); - cv_dedup_symbol_ptr_array(tp, &global_symbols); - gsi_push_many_arr(tp, pdb->gsi, global_symbols.count, global_symbols.v); + ProfBegin("Build DBI Section Headers"); + for (U64 sect_idx = 1; sect_idx < task.image_section_table_count; sect_idx += 1) { + dbi_push_section(task.pdb->dbi, task.image_section_table[sect_idx]); + } + ProfEnd(); + + task.image_section_virt_ranges.count = task.image_section_table_count; + task.image_section_virt_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count); + task.image_section_file_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count); + for EachIndex(i, task.image_section_table_count) { + COFF_SectionHeader *sect_header = task.image_section_table[i]; + if (~sect_header->flags & COFF_SectionFlag_CntUninitializedData) { + task.image_section_file_ranges.v[task.image_section_file_ranges.count++] = rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize); + } + task.image_section_virt_ranges.v[i] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize); + } + + task.sc_list = push_array(scratch.arena, PDB_DbiSectionContribList, obj_count); + tp_for_parallel(tp, tp_arena, obj_count, lnk_push_dbi_sec_contrib_task, &task); + + dbi_sec_list_concat_arr(&task.pdb->dbi->sec_contrib_list, obj_count, task.sc_list); } ProfEnd(); - ProfBegin("Build DBI Section Headers"); + ProfBegin("Make Public Symbols"); { - for (U64 sect_idx = 1; sect_idx < image_section_table_count; sect_idx += 1) { - dbi_push_section(pdb->dbi, image_section_table[sect_idx]); - } - } - ProfEnd(); + task.pub_list_arr = push_array(scratch.arena, CV_SymbolList, tp->worker_count); + tp_for_parallel_prof(tp, tp_arena, tp->worker_count, lnk_build_pdb_public_symbols_defined_task, &task, "Defined"); - ProfBegin("Build Section Contrib Map"); - { - - Rng1U64Array image_section_file_ranges = {0}; - image_section_file_ranges.count = 0; - image_section_file_ranges.v = push_array(scratch.arena, Rng1U64, image_section_table_count); - Rng1U64Array image_section_virt_ranges = {0}; - image_section_virt_ranges.count = image_section_table_count; - image_section_virt_ranges.v = push_array(scratch.arena, Rng1U64, image_section_table_count); - for (U64 i = 0; i < image_section_table_count; i += 1) { - COFF_SectionHeader *sect_header = image_section_table[i]; - if (~sect_header->flags & COFF_SectionFlag_CntUninitializedData) { - image_section_file_ranges.v[image_section_file_ranges.count++] = rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize); - } - image_section_virt_ranges.v[i] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize); - } - - LNK_PushDbiSecContribTaskData task = {0}; - task.obj_arr = obj_arr; - task.mod_arr = mod_arr; - task.sc_list = push_array(scratch.arena, PDB_DbiSectionContribList, obj_count); - task.image_data = image_data; - task.image_section_file_ranges = image_section_file_ranges; - task.image_section_virt_ranges = image_section_virt_ranges; - tp_for_parallel(tp, tp_arena, obj_count, lnk_push_dbi_sec_contrib_task, &task); - - dbi_sec_list_concat_arr(&pdb->dbi->sec_contrib_list, obj_count, task.sc_list); + ProfBegin("GSI Push"); + CV_SymbolPtrArray symbols = cv_symbol_ptr_array_from_list(scratch.arena, tp, tp->worker_count, task.pub_list_arr); + gsi_push_many_arr(tp, task.pdb->psi->gsi, symbols.count, symbols.v); + ProfEnd(); } ProfEnd(); @@ -2395,27 +2404,31 @@ lnk_build_pdb(TP_Context *tp, } // add natvis to PDB - PDB_SrcError error = pdb_add_src(pdb->info, pdb->msf, natvis_file_path, natvis_file_data, PDB_SrcComp_NULL); + PDB_SrcError error = pdb_add_src(task.pdb->info, task.pdb->msf, natvis_file_path, natvis_file_data, PDB_SrcComp_NULL); if (error != PDB_SrcError_OK) { lnk_error(LNK_Error_Natvis, "%S", pdb_string_from_src_error(error)); } } } ProfEnd(); - - lnk_build_pdb_public_symbols(tp, tp_arena, symtab, pdb->psi); - - pdb_build(tp, tp_arena, pdb, string_ht); - MSF_Error msf_err = msf_build(pdb->msf); + // move patched type data + // + // leaf data is stored in g_file_arena which has linker's life-time + // and this way we skip redundant leaf copy to the type server to make things faster + pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_IPI], cv_types.count[CV_TypeIndexSource_IPI], cv_types.v[CV_TypeIndexSource_IPI]); + pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_TPI], cv_types.count[CV_TypeIndexSource_TPI], cv_types.v[CV_TypeIndexSource_TPI]); + + pdb_build(tp, tp_arena, task.pdb, task.string_ht, 0); + + MSF_Error msf_err = msf_build(task.pdb->msf); if (msf_err != MSF_Error_OK) { lnk_error(LNK_Error_UnableToSerializeMsf, "unable to serialize MSF: %s", msf_error_to_string(msf_err)); } ProfBegin("Get Page Nodes"); - String8List page_data_list = msf_get_page_data_nodes(tp_arena->v[0], pdb->msf); + String8List page_data_list = msf_get_page_data_nodes(tp_arena->v[0], task.pdb->msf); ProfEnd(); - // NOTE: linker is about to exit so we can skip memory release // and let windows free memory since it does this faster @@ -3552,19 +3565,19 @@ THREAD_POOL_TASK_FUNC(lnk_find_obj_compiler_info_task) { ProfBeginFunction(); - LNK_ConvertUnitToRDITask *task = raw_task; - CV_SymbolListArray parsed_symbols = task->parsed_symbols[task_id]; - LNK_CodeViewCompilerInfo *comp_info = &task->comp_info_arr[task_id]; + LNK_ConvertUnitToRDITask *task = raw_task; + LNK_CodeViewCompilerInfo *comp_info = &task->comp_info_arr[task_id]; comp_info->arch = (CV_Arch)~0u; comp_info->language = (CV_Language)~0u; comp_info->compiler_name = str8_zero(); + String8List symbols = cv_sub_section_from_debug_s(task->debug_s_arr[task_id], CV_C13SubSectionKind_Symbols); + // infer unit compiler data from S_COMPILE* which always follows S_OBJ - for (U64 symbol_list_idx = 0; symbol_list_idx < parsed_symbols.count; ++symbol_list_idx) { - CV_SymbolList symbol_list = parsed_symbols.v[symbol_list_idx]; - for (CV_SymbolNode *symbol_n = symbol_list.first; symbol_n != 0; symbol_n = symbol_n->next) { - CV_Symbol symbol = symbol_n->data; + for EachNode(n, String8Node, symbols.first) { + for (U64 cursor = 0; cursor < n->string.size; ) { + CV_Symbol symbol = {0}; NotImplemented; // TODO: @symbol_pass if (symbol.kind == CV_SymKind_COMPILE) { AssertAlways(sizeof(CV_SymCompile) <= symbol.data.size); CV_SymCompile *compile = (CV_SymCompile *)symbol.data.str; @@ -3714,7 +3727,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) Temp scratch = scratch_begin(&arena, 1); LNK_ConvertUnitToRDITask *task = raw_task; - LNK_SymbolInput symbols_input = task->symbol_inputs[task_id]; + LNK_SymbolInput symbols_input = task->symbol_inputs[task_id]; LNK_Obj *obj = task->obj_arr[symbols_input.obj_idx]; LNK_CodeViewCompilerInfo comp_info = task->comp_info_arr[symbols_input.obj_idx]; CV_InlineeLinesAccel *inlinee_lines_accel = task->inlinee_lines_accel_arr[symbols_input.obj_idx]; @@ -3748,8 +3761,9 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) // root frame push_scope_frame(); - for (CV_SymbolNode *symbol_n = symbols_input.symbol_list->first; symbol_n != 0; symbol_n = symbol_n->next) { - CV_Symbol symbol = symbol_n->data; + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= symbols_input.raw_symbols.size; ) { + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(symbols_input.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); switch (symbol.kind) { case CV_SymKind_COMPILE: @@ -3916,14 +3930,17 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) CV_SymFrameproc *frameproc = 0; { U64 depth = 1; - for (CV_SymbolNode *lookahead = symbol_n->next; lookahead != 0; lookahead = lookahead->next) { - if (lookahead->data.kind == CV_SymKind_FRAMEPROC) { - frameproc = (CV_SymFrameproc *) lookahead->data.data.str; + for (U64 lookahead_off = cursor; lookahead_off + sizeof(CV_SymbolHeader) <= symbols_input.raw_symbols.size; ) { + CV_Symbol lookahead = {0}; + TryReadBreak(cv_read_symbol(symbols_input.raw_symbols, lookahead_off, CV_SymbolAlign, &lookahead), lookahead_off); + + if (lookahead.kind == CV_SymKind_FRAMEPROC) { + frameproc = str8_deserial_get_raw_ptr(lookahead.data, 0, sizeof(*frameproc)); break; } - if (cv_is_scope_symbol(lookahead->data.kind)) { + if (cv_is_scope_symbol(lookahead.kind)) { ++depth; - } else if (cv_is_end_symbol(lookahead->data.kind)) { + } else if (cv_is_end_symbol(lookahead.kind)) { --depth; if (depth == 0) { break; @@ -3999,14 +4016,17 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) CV_SymFrameproc *frameproc = 0; { U64 depth = 1; - for (CV_SymbolNode *lookahead = symbol_n->next; lookahead != 0; lookahead = lookahead->next) { - if (lookahead->data.kind == CV_SymKind_FRAMEPROC) { - frameproc = (CV_SymFrameproc *) lookahead->data.data.str; + for (U64 lookahead_off = cursor; lookahead_off + sizeof(CV_SymbolHeader) <= symbols_input.raw_symbols.size; ) { + CV_Symbol lookahead = {0}; + TryReadBreak(cv_read_symbol(symbols_input.raw_symbols, lookahead_off, CV_SymbolAlign, &lookahead), lookahead_off); + + if (lookahead.kind == CV_SymKind_FRAMEPROC) { + frameproc = str8_deserial_get_raw_ptr(lookahead.data, 0, sizeof(*frameproc)); break; } - if (cv_is_scope_symbol(lookahead->data.kind)) { + if (cv_is_scope_symbol(lookahead.kind)) { ++depth; - } else if (cv_is_end_symbol(lookahead->data.kind)) { + } else if (cv_is_end_symbol(lookahead.kind)) { --depth; if (depth == 0) { break; @@ -4619,7 +4639,6 @@ lnk_build_rad_debug_info(TP_Context *tp, task.leaf_arr_count_ipi = types.count[CV_TypeIndexSource_IPI]; task.leaf_arr_ipi = types.v[CV_TypeIndexSource_IPI]; task.symbol_inputs = symbol_inputs; - task.parsed_symbols = parsed_symbols; task.ipi_itype_range = itype_ranges[CV_TypeIndexSource_IPI]; task.tpi_itype_range = itype_ranges[CV_TypeIndexSource_TPI]; task.tpi_itype_map = tpi_itype_map; diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index e37c2500..524dbca0 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -3,38 +3,8 @@ #pragma once -// --- Symbol Parsing Tasks ---------------------------------------------------- - -typedef struct -{ - LNK_Obj **obj_arr; - String8List *sect_list_arr; - CV_DebugS *debug_s_arr; -} LNK_ParseDebugSTaskData; - -typedef struct -{ - LNK_Obj **obj_arr; - String8Array *data_arr_arr; -} LNK_CheckDebugTSigTaskData; - -typedef struct -{ - LNK_Obj **obj_arr; - String8Array *data_arr_arr; - CV_DebugT *debug_t_arr; -} LNK_ParseDebugTTaskData; - // --- Code View Input --------------------------------------------------------- -typedef struct LNK_SymbolInput -{ - U64 obj_idx; - CV_DebugS *debug_s; - CV_SymbolList *symbol_list; - String8 raw_symbols; -} LNK_SymbolInput; - typedef struct { CV_TypeServerInfo ts_info; @@ -43,8 +13,71 @@ typedef struct U64List obj_indices; } LNK_TypeServer; typedef struct LNK_TypeServerNode { LNK_TypeServer v; struct LNK_TypeServerNode *next; } LNK_TypeServerNode; -typedef struct LNK_TypeServerList { U64 count; LNK_TypeServerNode *first; LNK_TypeServerNode *last; } LNK_TypeServerList; -typedef struct LNK_TypeServerArray { U64 count; LNK_TypeServer *v; } LNK_TypeServerArray; +typedef struct LNK_TypeServerList { U64 count; LNK_TypeServerNode *first, *last; } LNK_TypeServerList; +typedef struct LNK_TypeServerArray { U64 count; LNK_TypeServer *v; } LNK_TypeServerArray; + +typedef struct LNK_SymbolInput +{ + U64 obj_idx; + String8 raw_symbols; +} LNK_SymbolInput; + +typedef struct +{ + LNK_IO_Flags io_flags; + U64 obj_count; + + U64 count; + LNK_Obj **obj_arr; + CV_DebugS *debug_s_arr; + CV_DebugT *debug_t_arr; + CV_DebugH *debug_h_arr; + U64 *obj_to_ts; + + String8List *debug_s_list_arr; + String8List *debug_p_list_arr; + String8List *debug_t_list_arr; + + U32Array int_obj_indices; + U32Array ext_obj_indices; + U32Array debug_p_indices; + U32Array type_server_indices; + + Rng1U64 ts_obj_range; + LNK_TypeServerArray ts_arr; + B32 *is_type_server_discarded; // [ts_arr.count] + CV_TypeIndex min_type_indices[CV_TypeIndexSource_COUNT]; + + U64 symbol_input_count; + struct LNK_SymbolInput *symbol_inputs; // [symbol_input_count] + Rng1U64 *symbol_input_ranges; // [worker_count] +} LNK_CodeViewInput; + +typedef struct +{ + LNK_CodeViewInput *input; + String8Array *raw_types; // [obj_count] + CV_DebugT *out_types; // [obj_count] +} LNK_ParseCvTypes; + +// --- Leaf Deduping Tasks ----------------------------------------------------- + +typedef struct { U32 obj_idx; U32 leaf_idx; } LNK_LeafRef; +typedef struct { U64 count; LNK_LeafRef **v; } LNK_LeafRefArray; + +typedef struct +{ + U64 cap; + LNK_LeafRef **bucket_arr; +} LNK_LeafHashTable; + +typedef struct LNK_LeafRange +{ + struct LNK_LeafRange *next; + Rng1U64 range; + CV_DebugT *debug_t; +} LNK_LeafRange; +typedef struct { U64 count; LNK_LeafRange *first, *last; } LNK_LeafRangeList; typedef struct { @@ -53,71 +86,10 @@ typedef struct U8 **v [CV_TypeIndexSource_COUNT]; } LNK_MergedTypes; -typedef struct -{ - LNK_IO_Flags io_flags; - U64 count; - LNK_Obj **obj_arr; - CV_DebugS *debug_s_arr; - CV_DebugT *debug_t_arr; - CV_DebugH *debug_h_arr; - U64 *obj_to_ts; - CV_SymbolListArray *parsed_symbols; // [count] - - U32Array int_obj_indices; - U32Array ext_obj_indices; - U32Array debug_p_indices; - U32Array type_server_indices; - - Rng1U64 ts_obj_range; - LNK_TypeServerArray ts_arr; - B32 *is_type_server_discarded; // [ts_arr.count] - - CV_TypeIndex min_type_indices[CV_TypeIndexSource_COUNT]; - - U64 symbol_input_count; - LNK_SymbolInput *symbol_inputs; // [symbol_input_count] -} LNK_CodeViewInput; - -// --- Leaf Deduping Tasks ----------------------------------------------------- - -typedef struct -{ - U32 obj_idx; - U32 leaf_idx; -} LNK_LeafRef; - -typedef struct LNK_LeafRange -{ - struct LNK_LeafRange *next; - Rng1U64 range; - CV_DebugT *debug_t; -} LNK_LeafRange; - -typedef struct LNK_LeafRangeList -{ - U64 count; - LNK_LeafRange *first; - LNK_LeafRange *last; -} LNK_LeafRangeList; - -typedef struct -{ - U64 count; - LNK_LeafRef **v; -} LNK_LeafRefArray; - -typedef struct -{ - U64 cap; - LNK_LeafRef **bucket_arr; -} LNK_LeafHashTable; - typedef struct { LNK_CodeViewInput *input; CV_DebugS *debug_s_arr; - CV_SymbolList *symbol_list_arr; LNK_LeafHashTable leaf_ht_arr[CV_TypeIndexSource_COUNT]; Arena **fixed_arenas; CV_TypeIndexSource ti_source; @@ -151,112 +123,63 @@ typedef struct LNK_MergedTypes result; } LNK_MergeTypes; -// --- Code View Processing Trasks --------------------------------------------- +// --- Build PDB --------------------------------------------- typedef struct { - String8List *data_list_arr; -} LNK_ProcessedCodeViewC11Data; + String8 image_data; + LNK_SymbolTable *symtab; + LNK_CodeViewInput *cv; -typedef struct -{ - String8List *data_list_arr; - String8List *source_file_names_list_arr; -} LNK_ProcessedCodeViewC13Data; + PDB_Context *pdb; + PDB_DbiModule **mod_arr; // [obj_count] -typedef struct -{ - LNK_SymbolInput *inputs; -} LNK_ParseCVSymbolsTaskData; + U64 total_symbol_count; -typedef struct -{ - U64 symbol_input_count; - CV_SymbolListArray *parsed_symbols; - U64 *serialized_symbol_data_sizes; + // GSI symbol dedup + U64 bucket_cap; + void **buckets; // [bucket_count] + U64 *insert_count; // [worker_count] - LNK_SymbolInput *symbol_inputs; - PDB_DbiModule **mod_arr; - String8List *symbol_data_arr; - CV_SymbolList *gsi_list_arr; -} LNK_ProcessSymDataTaskData; + Rng1U64 *symbol_ranges; // [worker_count] + U64 symbol_count; + void **symbol_arr; + U32 *symbol_hashes; // [symbol_count] -typedef struct -{ - CV_DebugS *debug_s_arr; + U64 *proc_ref_counts; // [worker_count] + U64 *proc_ref_sizes; // [worker_count] + U64 *proc_ref_hashes; // [total_proc_ref_count] + U64 *proc_ref_offs; // [worker_count] + String8 proc_refs; + + U64 *public_symbol_node_counts; // [worker_count] + U64 *public_symbol_node_offsets; // [worker_count] + CV_SymbolNode *public_symbol_nodes; // [public_symbol_total_count] + CV_SymbolList *public_symbols; // [worker_count] + U32 **public_symbol_hashes; // [worker_count][public_symbol.count] + + U64 *symbol_sizes; // [obj_count] + + // process C13 data String8List *source_file_names_list_arr; - U64 string_data_base_offset; CV_StringHashTable string_ht; -} LNK_ProcessC13DataTask; -typedef struct -{ - MSF_Context *msf; - PDB_DbiModule **mod_arr; - CV_DebugS *debug_s_arr; - U64 *serialized_symbol_data_sizes; - CV_SymbolListArray *parsed_symbols; - String8List *globrefs_arr; - U32 *mod_sizes; -} LNK_WriteModuleDataTask; + // build DBI modules + String8List *globrefs_arr; // [obj_count] + U32 *mod_sizes; // [obj_count] + U64 *serialized_symbol_data_sizes; // [obj_count] -typedef struct -{ - LNK_Obj **obj_arr; - PDB_DbiModule **mod_arr; - PDB_DbiSectionContribList *sc_list; - String8 image_data; + // push DBI SC Map + PE_BinInfo pe; + COFF_SectionHeader **image_section_table; + U64 image_section_table_count; Rng1U64Array image_section_file_ranges; Rng1U64Array image_section_virt_ranges; -} LNK_PushDbiSecContribTaskData; + PDB_DbiSectionContribList *sc_list; // [obj_count] -typedef struct -{ - U32Array *hash_arr_arr; - CV_SymbolList *list_arr; -} LNK_HashCVSymbolListTask; - -typedef struct -{ - U64 *hash_arr; - CV_SymbolNode **arr; - Rng1U64 *range_arr; -} LNK_CvSymbolPtrArrayHasher; - -typedef struct -{ - LNK_SymbolHashTrieChunkList *chunk_lists; - CV_SymbolList *pub_list_arr; - - Rng1U64 *symbol_ranges; - PDB_GsiContext *gsi; - CV_SymbolPtrArray symbols; - U32 *hashes; -} LNK_BuildPublicSymbolsTask; - -typedef struct -{ - CV_TypeIndex ipi_min_type_index; - CV_DebugT ipi_types; - LNK_SymbolInput *symbol_inputs; - CV_SymbolListArray *parsed_symbols; -} LNK_PostProcessCvSymbolsTask; - -typedef struct -{ - Rng1U64 *range_arr; - CV_SymbolPtrNode **bucket_arr; - CV_SymbolPtrNode **out_arr; - U64 *out_count_arr; -} LNK_GsiDeduper; - -typedef struct -{ - Rng1U64 *range_arr; - CV_SymbolPtrNode **bucket_arr; - U64 *symbol_base_arr; - CV_SymbolNode **symbol_arr; -} LNK_GsiUnbucket; + // make public symbols + CV_SymbolList *pub_list_arr; +} LNK_BuildPdb; typedef struct { @@ -350,8 +273,7 @@ typedef struct CV_DebugS *debug_s_arr; U64 leaf_arr_count_ipi; U8 **leaf_arr_ipi; - LNK_SymbolInput *symbol_inputs; - CV_SymbolListArray *parsed_symbols; + LNK_SymbolInput *symbol_inputs; Rng1U64 ipi_itype_range; Rng1U64 tpi_itype_range; RDIB_Type **tpi_itype_map; @@ -387,11 +309,8 @@ typedef struct // --- CodeView ---------------------------------------------------------------- -internal CV_DebugS * lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *sect_list_arr); -internal CV_DebugT * lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *debug_t_list_arr); internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_flags, String8List lib_dir_list, String8List alt_pch_dirs, U64 objs_count, LNK_Obj **objs); -// type merging internal int lnk_leaf_ref_compare (LNK_LeafRef a, LNK_LeafRef b); internal int lnk_leaf_ref_is_before (void *raw_a, void *raw_b); internal B32 lnk_match_leaf_ref (LNK_CodeViewInput *input, LNK_LeafRef a, LNK_LeafRef b); @@ -402,7 +321,11 @@ internal LNK_LeafRef * lnk_leaf_hash_table_search (LNK_LeafHashTable internal LNK_MergedTypes lnk_merge_types (TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); internal void lnk_replace_type_names_with_hashes (TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); -// --- RAD Debug info ---------------------------------------------------------- +// --- PDB --------------------------------------------------------------------- + +internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types); + +// --- RDI --------------------------------------------------------------------- internal U64 lnk_udt_name_hash_table_hash (String8 string); internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out); @@ -429,28 +352,6 @@ lnk_build_rad_debug_info(TP_Context *tp, CV_SymbolListArray *parsed_symbols, LNK_MergedTypes types); -// --- PDB --------------------------------------------------------------------- - -internal U64 * lnk_hash_cv_symbol_ptr_arr(TP_Context *tp, Arena *arena, CV_SymbolPtrArray arr); -internal CV_SymbolPtrArray lnk_dedup_gsi_symbols (TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 obj_count, CV_SymbolList *symbol_list_arr); - -internal void lnk_build_pdb_public_symbols(TP_Context *tp, TP_Arena *arena, LNK_SymbolTable *symtab, PDB_PsiContext *psi); - -internal String8List lnk_build_pdb(TP_Context *tp, - TP_Arena *tp_arena, - String8 image_data, - LNK_Config *config, - LNK_SymbolTable *symtab, - U64 obj_count, - LNK_Obj **obj_arr, - CV_DebugS *debug_s_arr, - U64 symbol_input_count, - LNK_SymbolInput *symbol_inputs, - CV_SymbolListArray *parsed_symbols, - LNK_MergedTypes types); - -// --- RAD Debug Info ---------------------------------------------------------- - internal U64 lnk_udt_name_hash_table_hash (String8 string); internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out); internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 9f4e21e5..dc3bafbc 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -3725,7 +3725,7 @@ pdb_get_guid(PDB_Context *pdb) } internal void -pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht) +pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi) { ProfBeginFunction(); @@ -3735,26 +3735,28 @@ pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTa PDB_TypeServer *tpi = pdb->type_servers[CV_TypeIndexSource_TPI]; PDB_TypeServer *ipi = pdb->type_servers[CV_TypeIndexSource_IPI]; - if (dbi->globals_sn == MSF_INVALID_STREAM_NUMBER) { - dbi->globals_sn = msf_stream_alloc(pdb->msf); - } - if (dbi->publics_sn == MSF_INVALID_STREAM_NUMBER) { - dbi->publics_sn = msf_stream_alloc(pdb->msf); - } - if (dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER) { - dbi->symbols_sn = msf_stream_alloc(pdb->msf); - } - pdb_type_server_build(tp, tpi, strtab, pdb->msf, PDB_FixedStream_Tpi); if (info->flags & PDB_FeatureFlag_HAS_ID_STREAM) { pdb_type_server_build(tp, ipi, strtab, pdb->msf, PDB_FixedStream_Ipi); } - psi_build(tp, pdb->psi, pdb->msf, dbi->publics_sn, dbi->symbols_sn); - gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); dbi_build(tp, pdb->dbi, pdb->msf, PDB_FixedStream_Dbi, string_ht); pdb_info_build(pdb->info, pdb->msf, PDB_FixedStream_Info); + if (build_gsi) { + if (dbi->globals_sn == MSF_INVALID_STREAM_NUMBER) { + dbi->globals_sn = msf_stream_alloc(pdb->msf); + } + if (dbi->publics_sn == MSF_INVALID_STREAM_NUMBER) { + dbi->publics_sn = msf_stream_alloc(pdb->msf); + } + if (dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER) { + dbi->symbols_sn = msf_stream_alloc(pdb->msf); + } + psi_build(tp, pdb->psi, pdb->msf, dbi->publics_sn, dbi->symbols_sn); + gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); + } + ProfEnd(); } diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h index 529e75ab..80f6c02f 100644 --- a/src/linker/pdb_ext/pdb_builder.h +++ b/src/linker/pdb_ext/pdb_builder.h @@ -351,7 +351,7 @@ typedef struct internal PDB_Context * pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid); internal PDB_Context * pdb_open(String8 data); internal void pdb_release(PDB_Context **pdb_ptr); -internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht); +internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi); internal void pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine); internal void pdb_set_guid(PDB_Context *pdb, Guid guid); internal void pdb_set_time_stamp(PDB_Context *pdb, COFF_TimeStamp time_stamp); diff --git a/src/linker/thread_pool/thread_pool.c b/src/linker/thread_pool/thread_pool.c index e8f76277..0be6a35e 100644 --- a/src/linker/thread_pool/thread_pool.c +++ b/src/linker/thread_pool/thread_pool.c @@ -15,7 +15,7 @@ tp_run_tasks(TP_Context *pool, TP_Worker *worker) // run task Arena *arena = pool->task_arena ? pool->task_arena->v[worker->id] : 0; U64 task_id = pool->task_count - (task_left+1); - pool->task_func(arena, worker->id, task_id, pool->task_data); + pool->task_func(arena, worker->id, task_id, pool->task_data, pool); // cache task count so we dont touch pool memory after atomic inc U64 task_count = pool->task_count; @@ -85,6 +85,7 @@ tp_alloc(Arena *arena, U32 worker_count, U32 max_worker_count, String8 name) pool->exec_semaphore = exec_semaphore; pool->task_semaphore = task_semaphore; pool->main_semaphore = main_semaphore; + pool->barrier = barrier_alloc(worker_count); pool->is_live = 1; pool->worker_count = worker_count; pool->worker_arr = push_array(arena, TP_Worker, worker_count); @@ -113,11 +114,11 @@ tp_release(TP_Context *pool) B32 is_shared = pool->exec_semaphore.u64[0] != 0; if (is_shared) { - for (U64 i = 0; i < pool->worker_count; ++i) { + for EachIndex(i, pool->worker_count) { semaphore_drop(pool->exec_semaphore); } } - for (U64 i = 0; i < pool->worker_count; ++i) { + for EachIndex(i, pool->worker_count) { semaphore_drop(pool->task_semaphore); } for (U64 i = 1; i < pool->worker_count; i += 1) { @@ -126,6 +127,7 @@ tp_release(TP_Context *pool) if (is_shared) { semaphore_release(pool->exec_semaphore); } + barrier_release(pool->barrier); semaphore_release(pool->task_semaphore); semaphore_release(pool->main_semaphore); diff --git a/src/linker/thread_pool/thread_pool.h b/src/linker/thread_pool/thread_pool.h index abae8606..0dd840a0 100644 --- a/src/linker/thread_pool/thread_pool.h +++ b/src/linker/thread_pool/thread_pool.h @@ -3,7 +3,7 @@ #pragma once -#define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, U64 worker_id, U64 task_id, void *raw_task) +#define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, U64 worker_id, U64 task_id, void *raw_task, struct TP_Context *tp) typedef THREAD_POOL_TASK_FUNC(TP_TaskFunc); typedef struct TP_Arena @@ -31,6 +31,7 @@ typedef struct TP_Context Semaphore exec_semaphore; Semaphore task_semaphore; Semaphore main_semaphore; + Barrier barrier; U32 worker_count; TP_Worker *worker_arr; From 12a1e28fff96a2a963366b0e675c565271ed1675 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Mar 2026 16:49:31 -0700 Subject: [PATCH 309/850] do not round up commit and reserve sizes on optional buffers --- src/base/base_arena.c | 49 ++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 7b7e72d0..5ed1ca64 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -8,25 +8,26 @@ internal Arena * arena_alloc_(ArenaParams *params) -{ - // rjf: round up reserve/commit sizes +{ U64 reserve_size = params->reserve_size; - U64 commit_size = params->commit_size; - if(params->flags & ArenaFlag_LargePages) - { - reserve_size = AlignPow2(reserve_size, os_get_system_info()->large_page_size); - commit_size = AlignPow2(commit_size, os_get_system_info()->large_page_size); - } - else - { - reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size); - commit_size = AlignPow2(commit_size, os_get_system_info()->page_size); - } - + U64 commit_size = params->commit_size; + // rjf: reserve/commit initial block void *base = params->optional_backing_buffer; if(base == 0) { + // rjf: round up reserve/commit sizes + if(params->flags & ArenaFlag_LargePages) + { + reserve_size = AlignPow2(reserve_size, os_get_system_info()->large_page_size); + commit_size = AlignPow2(commit_size, os_get_system_info()->large_page_size); + } + else + { + reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size); + commit_size = AlignPow2(commit_size, os_get_system_info()->page_size); + } + if(params->flags & ArenaFlag_LargePages) { base = os_reserve_large(reserve_size); @@ -56,18 +57,18 @@ arena_alloc_(ArenaParams *params) // rjf: extract arena header & fill AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE); - Arena *arena = (Arena *)base; - arena->current = arena; - arena->flags = params->flags; - arena->cmt_size = params->commit_size; - arena->res_size = params->reserve_size; - arena->base_pos = 0; - arena->pos = ARENA_HEADER_SIZE; - arena->cmt = commit_size; - arena->res = reserve_size; + Arena *arena = base; + arena->current = arena; + arena->flags = params->flags; + arena->cmt_size = params->commit_size; + arena->res_size = params->reserve_size; + arena->base_pos = 0; + arena->pos = ARENA_HEADER_SIZE; + arena->cmt = commit_size; + arena->res = reserve_size; arena->allocation_site_file = params->allocation_site_file; arena->allocation_site_line = params->allocation_site_line; - arena->name = params->name; + arena->name = params->name; #if ARENA_FREE_LIST arena->free_last = 0; #endif From f7ac6767cfec7ac73b0239eaac866253b6e7d77d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 24 Mar 2026 16:59:18 -0700 Subject: [PATCH 310/850] WIP symbol plumbing --- src/linker/codeview_ext/codeview.c | 25 +- src/linker/codeview_ext/codeview.h | 1 + src/linker/lnk_debug_info.c | 377 ++++++++++++++--------------- src/linker/lnk_debug_info.h | 48 ++-- 4 files changed, 233 insertions(+), 218 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 33a7b688..38a5e78e 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -457,6 +457,25 @@ cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list) return proc_ref_list; } +internal B32 +cv_is_lproc(CV_Symbol symbol) +{ + return symbol.kind == CV_SymKind_LPROC32 || + symbol.kind == CV_SymKind_LPROCMIPS || + symbol.kind == CV_SymKind_LPROCIA64 || + symbol.kind == CV_SymKind_LPROC32_ID || + symbol.kind == CV_SymKind_LPROCMIPS_ID || + symbol.kind == CV_SymKind_LPROCIA64_ID || + symbol.kind == CV_SymKind_LPROC32_DPC || + symbol.kind == CV_SymKind_LPROC32_DPC_ID || + symbol.kind == CV_SymKind_LPROC16 || + symbol.kind == CV_SymKind_LPROC32_16t || + symbol.kind == CV_SymKind_LPROCMIPS_16t || + symbol.kind == CV_SymKind_LPROC32_ST || + symbol.kind == CV_SymKind_LPROCMIPS_ST || + symbol.kind == CV_SymKind_LPROCIA64_ST; +} + internal B32 cv_is_obj_info(CV_Symbol symbol) { @@ -1020,7 +1039,7 @@ cv_symbol_deduper_insert_or_update(void **buckets, U64 bucket_cap, U64 hash, voi U64 bucket_idx = best_idx; do { retry:; - void *curr_ptr = buckets + bucket_idx; + void *curr_ptr = buckets[bucket_idx]; Assert(curr_ptr != symbol_ptr); if (curr_ptr == 0) { @@ -1513,9 +1532,7 @@ cv_patch_symbol_tree_offsets_new(String8List raw_symbols, U64 base_offset, U64 a for EachNode(n, String8Node, raw_symbols.first) { for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { CV_Symbol symbol = {0}; - U64 read_size = cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol); - if (read_size == 0) { break; } - cursor += read_size; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); if (symbol.kind == CV_SymKind_SKIP) { continue; } diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index f160ab36..fa1e2e00 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -408,6 +408,7 @@ internal CV_SymbolList cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_Symb internal U64 cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out); internal CV_Symbol cv_symbol_from_string(String8 raw_data); +internal B32 cv_is_lproc(CV_Symbol symbol); internal B32 cv_is_obj_info(CV_Symbol symbol); internal CV_ObjInfo cv_obj_info_from_symbol(CV_Symbol symbol); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 2bd98ac6..4f29a538 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -30,7 +30,6 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) U64 obj_idx = task_id; LNK_CodeViewInput *task = raw_task; - LNK_Obj *obj = task->obj_arr [obj_idx]; String8List sect_list = task->debug_s_list_arr[obj_idx]; CV_DebugS *debug_s = &task->debug_s_arr [obj_idx]; @@ -43,14 +42,14 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) String8List string_data_list = cv_sub_section_from_debug_s(*debug_s, CV_C13SubSectionKind_StringTable); if (string_data_list.node_count > 1) { // TODO: print section index - lnk_error_obj(LNK_Warning_IllData, obj, ".debug$S has %u string table sub-sections defined, picking first sub-section", string_data_list.node_count); + lnk_error_obj(LNK_Warning_IllData, task->obj_arr[obj_idx], ".debug$S has %u string table sub-sections defined, picking first sub-section", string_data_list.node_count); } // make sure there is one file checksum table String8List checksum_data_list = cv_sub_section_from_debug_s(*debug_s, CV_C13SubSectionKind_FileChksms); if (checksum_data_list.node_count > 1) { // TODO: print section index - lnk_error_obj(LNK_Warning_IllData, obj, ".debug$S has %u file checksum sub-sections defined, picking first sub-section", checksum_data_list.node_count); + lnk_error_obj(LNK_Warning_IllData, task->obj_arr[obj_idx], ".debug$S has %u file checksum sub-sections defined, picking first sub-section", checksum_data_list.node_count); } } } @@ -244,14 +243,14 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla debug_p_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); parse_types.raw_types = str8_array_from_list_arr(scratch.arena, input.debug_p_list_arr, obj_count); parse_types.out_types = debug_p_arr; - tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$P"); - tp_for_parallel_prof(tp, 0, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$P"); + tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$P"); + tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$P"); input.debug_t_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); parse_types.raw_types = str8_array_from_list_arr(scratch.arena, input.debug_t_list_arr, obj_count); parse_types.out_types = input.debug_t_arr; - tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$T"); - tp_for_parallel_prof(tp, 0, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$T"); + tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$T"); + tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$T"); } ProfEnd(); @@ -482,29 +481,25 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } } - // :zero_out_symbol_sub_section - ProfBegin("Zero-out Symbols Sub-sections"); - for EachIndex(i, obj_count) { MemoryZeroStruct(cv_sub_section_ptr_from_debug_s(&input.debug_s_arr[i], CV_C13SubSectionKind_Symbols)); } - ProfEnd(); - ProfBegin("Make Symbol Inputs"); { + // count symbol blocks for EachIndex(obj_idx, input.count) { String8List s = cv_sub_section_from_debug_s(input.debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); input.symbol_input_count += s.node_count; } - + + // alloc block pointers input.symbol_inputs = push_array_no_zero(tp_arena->v[0], LNK_SymbolInput, input.symbol_input_count); U64 symbol_input_count = 0; for EachIndex(obj_idx, input.count) { String8List s = cv_sub_section_from_debug_s(input.debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); - for EachNode(block_n, String8Node, s.first) { + for EachNode(n, String8Node, s.first) { Assert(symbol_input_count < input.symbol_input_count); - LNK_SymbolInput *in = input.symbol_inputs + symbol_input_count; + LNK_SymbolInput *in = &input.symbol_inputs[symbol_input_count++]; in->obj_idx = obj_idx; - in->raw_symbols = block_n->string; - symbol_input_count += 1; + in->raw_symbols = n->string; } } @@ -1234,61 +1229,59 @@ THREAD_POOL_TASK_FUNC(lnk_fixup_symbols_task) { LNK_MergeTypes *task = raw_task; - U64 leaf_count_ipi = task->result.count [CV_TypeIndexSource_IPI]; - U8 **leaf_arr_ipi = task->result.v [CV_TypeIndexSource_IPI]; - CV_TypeIndex min_ti_ipi = task->min_type_indices[CV_TypeIndexSource_IPI]; + LNK_SymbolInput symbols = task->input->symbol_inputs[task_id]; + U64 leaf_count_ipi = task->result.count [CV_TypeIndexSource_IPI]; + U8 **leaf_arr_ipi = task->result.v [CV_TypeIndexSource_IPI]; + CV_TypeIndex min_ti_ipi = task->min_type_indices[CV_TypeIndexSource_IPI]; - for EachInRange(i, task->input->symbol_input_ranges[task_id]) { - LNK_SymbolInput symbols = task->input->symbol_inputs[i]; + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); - for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { - CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); + // convert symbol to final type + CV_SymKind *sym_kind_ptr = cv_kind_ptr_from_symbol(symbol); + switch (*sym_kind_ptr) { + case CV_SymKind_PROC_ID_END: *sym_kind_ptr = CV_SymKind_END; break; - // convert symbol to final type - switch (symbol.kind) { - case CV_SymKind_LPROC32_ID: symbol.kind = CV_SymKind_LPROC32; goto fixup_id; - case CV_SymKind_GPROC32_ID: symbol.kind = CV_SymKind_GPROC32; goto fixup_id; - case CV_SymKind_LPROC32_DPC_ID: symbol.kind = CV_SymKind_LPROC32_DPC; goto fixup_id; - case CV_SymKind_LPROCMIPS_ID: symbol.kind = CV_SymKind_LPROCMIPS; goto fixup_id; - case CV_SymKind_GPROCMIPS_ID: symbol.kind = CV_SymKind_GPROCMIPS; goto fixup_id; - case CV_SymKind_LPROCIA64_ID: symbol.kind = CV_SymKind_LPROCIA64; goto fixup_id; - case CV_SymKind_GPROCIA64_ID: symbol.kind = CV_SymKind_GPROCIA64; goto fixup_id; - fixup_id:; { - CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol.data.str; - if (proc32->itype < min_ti_ipi) { - // TODO: in some cases destructors don't have a type, need a repro - break; - } - - if ((proc32->itype - min_ti_ipi) > leaf_count_ipi) { - Assert("TODO: error handle corrupted type index"); - break; - } - - U64 leaf_idx = proc32->itype - min_ti_ipi; - String8 leaf_data = str8(leaf_arr_ipi[leaf_idx], max_U64); - - CV_Leaf leaf; - cv_read_leaf(leaf_data, 0, 1, &leaf); - - U64 min_leaf_size = cv_header_struct_size_from_leaf_kind(leaf.kind); - if (min_leaf_size > leaf.data.size) { - Assert(!"TODO: error handle corrupt leaf"); - break; - } - - if (leaf.kind == CV_LeafKind_FUNC_ID) { - proc32->itype = ((CV_LeafFuncId *) leaf.data.str)->itype; - } else if (leaf.kind == CV_LeafKind_MFUNC_ID) { - proc32->itype = ((CV_LeafMFuncId *) leaf.data.str)->itype; - } else { - Assert(!"TODO: erorr handle unexpected leaf type"); - break; - } - } break; - case CV_SymKind_PROC_ID_END: symbol.kind = CV_SymKind_END; break; + case CV_SymKind_LPROC32_ID: *sym_kind_ptr = CV_SymKind_LPROC32; goto fixup_id; + case CV_SymKind_GPROC32_ID: *sym_kind_ptr = CV_SymKind_GPROC32; goto fixup_id; + case CV_SymKind_LPROC32_DPC_ID: *sym_kind_ptr = CV_SymKind_LPROC32_DPC; goto fixup_id; + case CV_SymKind_LPROCMIPS_ID: *sym_kind_ptr = CV_SymKind_LPROCMIPS; goto fixup_id; + case CV_SymKind_GPROCMIPS_ID: *sym_kind_ptr = CV_SymKind_GPROCMIPS; goto fixup_id; + case CV_SymKind_LPROCIA64_ID: *sym_kind_ptr = CV_SymKind_LPROCIA64; goto fixup_id; + case CV_SymKind_GPROCIA64_ID: *sym_kind_ptr = CV_SymKind_GPROCIA64; goto fixup_id; + fixup_id:; { + CV_SymProc32 *proc32 = str8_deserial_get_raw_ptr(symbol.data, 0, sizeof(*proc32)); + if (proc32->itype < min_ti_ipi) { + // TODO: in some cases destructors don't have a type, need a repro + break; } + + if ((proc32->itype - min_ti_ipi) > leaf_count_ipi) { + Assert(0 && "TODO: error handle corrupted type index"); + break; + } + + U64 leaf_idx = proc32->itype - min_ti_ipi; + String8 leaf_data = str8(leaf_arr_ipi[leaf_idx], max_U64); + + CV_Leaf leaf; + if (cv_read_leaf(leaf_data, 0, 1, &leaf) == 0) { InvalidPath; } + + U64 min_leaf_size = cv_header_struct_size_from_leaf_kind(leaf.kind); + if (min_leaf_size > leaf.data.size) { Assert(!"TODO: error handle corrupt leaf"); break; } + + if (leaf.kind == CV_LeafKind_FUNC_ID) { + CV_LeafFuncId *func_id = str8_deserial_get_raw_ptr(leaf.data, 0, sizeof(*func_id)); + proc32->itype = func_id->itype; + } else if (leaf.kind == CV_LeafKind_MFUNC_ID) { + CV_LeafMFuncId *mfunc_id = str8_deserial_get_raw_ptr(leaf.data, 0, sizeof(*mfunc_id)); + proc32->itype = mfunc_id->itype; + } else { + Assert(!"TODO: erorr handle unexpected leaf type"); + break; + } + } break; } } } @@ -1486,30 +1479,30 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) ProfEnd(); - ProfBegin("Assign type indices"); - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - task.ti_source = ti_source; - task.assigned_type_caps[ti_source] = (task.unique_leaf_refs_arr[ti_source].count * 13) / 10; - task.assigned_type_hts [ti_source] = push_array(scratch.arena, CV_TypeIndex, task.assigned_type_caps[ti_source]); - task.min_type_indices [ti_source] = CV_MinComplexTypeIndex; - task.ranges = tp_divide_work(scratch.arena, task.unique_leaf_refs_arr[ti_source].count, tp->worker_count); - tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_assign_type_indices_task, &task, "Assign Type Indices"); - } - ProfEnd(); - - ProfBegin("Patch Type Indices"); + ProfBegin("Fixup Type Indices"); { + ProfBegin("Assign type indices"); + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + task.ti_source = ti_source; + task.assigned_type_caps[ti_source] = (task.unique_leaf_refs_arr[ti_source].count * 13) / 10; + task.assigned_type_hts [ti_source] = push_array(scratch.arena, CV_TypeIndex, task.assigned_type_caps[ti_source]); + task.min_type_indices [ti_source] = CV_MinComplexTypeIndex; + task.ranges = tp_divide_work(scratch.arena, task.unique_leaf_refs_arr[ti_source].count, tp->worker_count); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_assign_type_indices_task, &task, "Assign Type Indices"); + } + ProfEnd(); + task.ranges = tp_divide_work(scratch.arena, input->symbol_input_count, tp->worker_count); - tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_symbols_task, &task, "Symbols"); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_symbols_task, &task, "Fixup Symbol Type Indices"); task.ranges = 0; task.debug_s_arr = input->debug_s_arr; - tp_for_parallel_prof(tp, 0, input->count, lnk_cv_patcher_inlines_task, &task, "Inlines"); + tp_for_parallel_prof(tp, 0, input->count, lnk_cv_patcher_inlines_task, &task, "Fixup Inlines Type Indices"); for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { task.ti_source = ti_source; task.ranges = tp_divide_work(scratch.arena, task.unique_leaf_refs_arr[ti_source].count, tp->worker_count); - tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_leaves_task, &task, "Leaves"); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_leaves_task, &task, "Fixup Types Type Indices"); } } ProfEnd(); @@ -1523,7 +1516,7 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) tp_for_parallel(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task); } - tp_for_parallel_prof(tp, 0, input->symbol_input_count, lnk_fixup_symbols_task, &task, "fixup type indices in symbols"); + tp_for_parallel_prof(tp, 0, input->symbol_input_count, lnk_fixup_symbols_task, &task, "Fixup ID Symbols"); MemoryCopyTyped(task.result.min_type_indices, input->min_type_indices, CV_TypeIndexSource_COUNT); @@ -1736,7 +1729,7 @@ lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, U64 leaf_cou } internal -THREAD_POOL_TASK_FUNC(lnk_process_and_populate_gsi_and_psi_task) +THREAD_POOL_TASK_FUNC(lnk_build_gsi_psi) { Temp scratch = scratch_begin(&arena, 1); @@ -1757,9 +1750,7 @@ THREAD_POOL_TASK_FUNC(lnk_process_and_populate_gsi_and_psi_task) LNK_SymbolInput symbols = task->cv->symbol_inputs[i]; for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { CV_Symbol symbol = {0}; - U64 symbol_read_size = cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol); - if (symbol_read_size == 0) { break; } - cursor += symbol_read_size; + TryReadBreak(cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); if (cv_is_global_symbol(symbol.kind)) { void *ptr = cv_ptr_from_symbol(symbol); @@ -1774,7 +1765,10 @@ THREAD_POOL_TASK_FUNC(lnk_process_and_populate_gsi_and_psi_task) *kind_ptr = CV_SymKind_SKIP; } else if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - task->proc_ref_sizes[task_id] += sizeof(CV_SymRef2) + name.size + 1; + task->proc_ref_sizes[task_id] += sizeof(CV_SymbolHeader); + task->proc_ref_sizes[task_id] += sizeof(CV_SymRef2); + task->proc_ref_sizes[task_id] += name.size + 1; + task->proc_ref_sizes[task_id] = AlignPow2(task->proc_ref_sizes[task_id], sizeof(void *)); task->proc_ref_counts[task_id] += 1; } @@ -1786,11 +1780,11 @@ THREAD_POOL_TASK_FUNC(lnk_process_and_populate_gsi_and_psi_task) } } } - ins_atomic_u64_add_eval(&task->total_symbol_count, global_symbols.count); + ins_atomic_u64_add_eval(&task->global_symbol_count, global_symbols.count); barrier_wait(tp->barrier); if (task_id == 0) { - task->bucket_cap = (U64)((F64)task->total_symbol_count * 1.3); + task->bucket_cap = (U64)((F64)task->global_symbol_count * 1.3); task->buckets = push_array(scratch.arena, void *, task->bucket_cap); task->insert_count = push_array(scratch.arena, U64, tp->worker_count); } @@ -1838,21 +1832,18 @@ THREAD_POOL_TASK_FUNC(lnk_process_and_populate_gsi_and_psi_task) barrier_wait(tp->barrier); if (task_id == 0) { - // prealloc symbol nodes - CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, task->symbol_count); - - // push symbols to GSI - for EachIndex(i, task->symbol_count) { - CV_SymbolNode *n = &nodes[i]; - n->prev = n->next = 0; - n->data = cv_symbol_from_ptr(task->symbol_arr[i]); - gsi_push_(gsi, task->symbol_hashes[i], n); - } + // take into account arena header + for EachIndex(i, tp->worker_count) { task->proc_ref_sizes[i] += ARENA_HEADER_SIZE; } + U64 total_proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); // prealloc output buffer for the proc refs - task->proc_refs.size = sum_array_u64(tp->worker_count, task->proc_ref_sizes); - task->proc_refs.str = push_array(gsi->arena, U8, task->proc_refs.size); - task->proc_ref_offs = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_sizes, tp->worker_count); + task->proc_refs.size = sum_array_u64(tp->worker_count, task->proc_ref_sizes); + task->proc_refs.str = push_array(gsi->arena, U8, task->proc_refs.size); + task->proc_ref_hashes = push_array(scratch.arena, U64, total_proc_ref_count); + task->proc_ref_offs = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_sizes, tp->worker_count); + + task->proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); + task->proc_ref_nodes = push_array(gsi->arena, CV_SymbolNode, task->proc_ref_count); } barrier_wait(tp->barrier); @@ -1860,61 +1851,100 @@ THREAD_POOL_TASK_FUNC(lnk_process_and_populate_gsi_and_psi_task) U64 proc_refs_size = task->proc_ref_sizes[task_id]; U64 proc_refs_off = task->proc_ref_offs[task_id]; U8 *proc_refs = task->proc_refs.str + proc_refs_off; - Arena *proc_ref_arena = arena_alloc_(&(ArenaParams){ .optional_backing_buffer = proc_refs, - .reserve_size = proc_refs_size, - .commit_size = proc_refs_size - }); - U64 hash_idx = 0; + Arena *proc_ref_arena = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .optional_backing_buffer = proc_refs, .reserve_size = proc_refs_size, .commit_size = proc_refs_size }); + + U64 proc_ref_idx = task->proc_ref_offs[task_id]; for EachInRange(i, task->cv->symbol_input_ranges[task_id]) { LNK_SymbolInput *in = &task->cv->symbol_inputs[i]; String8 raw_symbols = in->raw_symbols; CV_ModIndex imod = task->mod_arr[in->obj_idx]->imod; - for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= raw_symbols.size; ) { + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= raw_symbols.size; ) { CV_Symbol symbol = {0}; - U64 read_size = cv_read_symbol(raw_symbols, cursor, CV_SymbolAlign, &symbol); - if (read_size == 0) { break; } - cursor += read_size; + TryReadBreak(cv_read_symbol(raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { - String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - CV_Symbol proc_ref = cv_make_proc_ref(proc_ref_arena, imod, safe_cast_u32(symbol.offset), name, /* is_local */ 1); - task->proc_ref_hashes[hash_idx] = hash_from_cv_symbol(&proc_ref); - hash_idx += 1; + Temp temp = temp_begin(task->fixed_arenas[task_id]); + + String8 name = cv_name_from_symbol(symbol.kind, symbol.data); + CV_Symbol proc_ref_symbol = cv_make_proc_ref(temp.arena, imod, safe_cast_u32(symbol.offset), name, cv_is_lproc(symbol)); + String8 proc_ref_raw = cv_data_from_symbol(proc_ref_arena, &proc_ref_symbol, 1); + + CV_SymbolNode *n = &task->proc_ref_nodes[proc_ref_idx++]; + n->data = cv_symbol_from_ptr(proc_ref_raw.str); + + task->proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&n->data); + + temp_end(temp); } } } barrier_wait(tp->barrier); if (task_id == 0) { - U64 *offsets = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_sizes, tp->worker_count); - for EachIndex(i, tp->worker_count) { - CV_SymbolNode *nodes = push_array(gsi->arena, CV_SymbolNode, task->proc_ref_counts[i]); - U64 node_idx = 0; - for (U64 cursor = offsets[i]; cursor < offsets[i+1]; ) { - U64 read_size = cv_read_symbol(task->proc_refs, cursor, PDB_SYMBOL_ALIGN, &nodes[node_idx].data); - if (read_size == 0) { break; } - cursor += read_size; - gsi_push_(gsi, task->proc_ref_hashes[node_idx], &nodes[node_idx]); + // push global symbols + { + CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, task->symbol_count); + for EachIndex(i, task->symbol_count) { + CV_SymbolNode *n = &nodes[i]; + n->prev = n->next = 0; + n->data = cv_symbol_from_ptr(task->symbol_arr[i]); + gsi_push_(gsi, task->symbol_hashes[i], n); } } + + // push proc refs + for EachIndex(i, task->proc_ref_count) { + gsi_push_(gsi, task->proc_ref_hashes[i], &task->proc_ref_nodes[i]); + } } barrier_wait(tp->barrier); } { + if (task_id == 0) { + task->public_symbol_sizes = push_array(scratch.arena, U64, tp->worker_count); + task->public_symbol_node_counts = push_array(scratch.arena, U64, tp->worker_count); + } + barrier_wait(tp->barrier); + + // compute buffer size for CV public symbols for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { - task->public_symbol_node_counts[task_id] += chunk->count; + for EachIndex(i, chunk->count) { + LNK_Symbol *symbol = chunk->v[i].symbol; + LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); + COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); + + if (symbol_parsed.section_number == lnk_obj_get_removed_section_number(symbol_ref.obj)) { continue; } + COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); + if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } + + task->public_symbol_sizes[task_id] += sizeof(CV_SymbolHeader); + task->public_symbol_sizes[task_id] += sizeof(CV_SymPub32); + task->public_symbol_sizes[task_id] += symbol->name.size + 1; + task->public_symbol_sizes[task_id] = AlignPow2(task->public_symbol_sizes[task_id], sizeof(void *)); + + task->public_symbol_node_counts[task_id] += 1; + } } barrier_wait(tp->barrier); if (task_id == 0) { + for EachIndex(i, tp->worker_count) { task->public_symbol_sizes[i] += ARENA_HEADER_SIZE; } + U64 public_symbol_buffer_size = sum_array_u64(tp->worker_count, task->public_symbol_sizes); + task->public_symbol_offs = offsets_from_counts_array_u64(scratch.arena, task->public_symbol_sizes, tp->worker_count); + task->public_symbol_buffer = push_array(task->pdb->psi->arena, U8, public_symbol_buffer_size); + + U64 public_symbol_total_count = sum_array_u64(tp->worker_count, task->public_symbol_node_counts); task->public_symbol_node_offsets = offsets_from_counts_array_u64(scratch.arena, task->public_symbol_node_counts, tp->worker_count); - U64 public_symbol_total_count = sum_array_u64(tp->worker_count, task->public_symbol_node_offsets); task->public_symbol_nodes = push_array(psi->gsi->arena, CV_SymbolNode, public_symbol_total_count); task->public_symbols = push_array(scratch.arena, CV_SymbolList, tp->worker_count); - task->public_symbols = push_array(scratch.arena, CV_SymbolList, tp->worker_count); + task->public_symbol_hashes = push_array(scratch.arena, U32 *, tp->worker_count); } barrier_wait(tp->barrier); + // make CV public symbols + U64 public_symbol_buffer_chunk_size = task->public_symbol_sizes[task_id]; + U8 *public_symbol_buffer_chunk = task->public_symbol_buffer + task->public_symbol_offs[task_id]; + Arena *public_symbol_arena = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .optional_backing_buffer = public_symbol_buffer_chunk, .reserve_size = public_symbol_buffer_chunk_size, .commit_size = public_symbol_buffer_chunk_size }); for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { U64 node_idx = task->public_symbol_node_offsets[task_id]; for EachIndex(i, chunk->count) { @@ -1922,47 +1952,46 @@ THREAD_POOL_TASK_FUNC(lnk_process_and_populate_gsi_and_psi_task) LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); + // discard removed and non-section symbols if (symbol_parsed.section_number == lnk_obj_get_removed_section_number(symbol_ref.obj)) { continue; } - COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } - CV_Pub32Flags flags = 0; - if (COFF_SymbolType_IsFunc(symbol_parsed.type)) { flags |= CV_Pub32Flag_Function; } + Temp temp = temp_begin(task->fixed_arenas[task_id]); - ISectOff sc = lnk_sc_from_symbol(symbol); - U16 symbol_isect16 = safe_cast_u16(sc.isect); - U32 symbol_off32 = safe_cast_u32(sc.off); + CV_Pub32Flags flags = COFF_SymbolType_IsFunc(symbol_parsed.type) ? CV_Pub32Flag_Function : 0; + ISectOff sc = lnk_sc_from_symbol(symbol); + CV_Symbol pub_symbol = cv_make_pub32(temp.arena, flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); + String8 pub_raw = cv_data_from_symbol(public_symbol_arena, &pub_symbol, 1); - task->public_symbol_nodes[node_idx].data = cv_make_pub32(arena, flags, symbol_off32, symbol_isect16, symbol->name); + task->public_symbol_nodes[node_idx].data = cv_symbol_from_ptr(pub_raw.str); cv_symbol_list_push_node(&task->public_symbols[task_id], &task->public_symbol_nodes[node_idx]); node_idx += 1; + + temp_end(temp); } } barrier_wait(tp->barrier); - if (task_id == 0) { - task->public_symbol_hashes = push_array(scratch.arena, U32 *, tp->worker_count); - } - barrier_wait(tp->barrier); - + // hash public symbols { U64 n_idx = 0; task->public_symbol_hashes[task_id] = push_array(scratch.arena, U32, task->public_symbols[task_id].count); for EachNode(n, CV_SymbolNode, task->public_symbols[task_id].first) { String8 name = cv_name_from_symbol(n->data.kind, n->data.data); - task->public_symbol_hashes[task_id][n_idx] = gsi_hash(gsi, name); - n += 1; + task->public_symbol_hashes[task_id][n_idx++] = gsi_hash(gsi, name); } } barrier_wait(tp->barrier); + // insert public symbols into PSI if (task_id == 0) { for EachIndex(i, tp->worker_count) { U64 curr_idx = 0; - for (CV_SymbolNode *curr = task->public_symbols[i].first, *next = 0; curr != 0; curr = next, curr_idx += 1) { + for (CV_SymbolNode *curr = task->public_symbols[i].first, *next = 0; curr != 0; curr = next) { next = curr->next; gsi_push_(psi->gsi, task->public_symbol_hashes[i][curr_idx], curr); + curr_idx += 1; } } } @@ -2043,6 +2072,8 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) CV_Symbol symbol = {0}; TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + if (symbol.kind == CV_SymKind_SKIP) { continue; } + U64 symbol_size = cv_size_from_symbol(&symbol, PDB_SYMBOL_ALIGN); // flush temp to MSF @@ -2194,41 +2225,6 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) } } -internal -THREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task) -{ - ProfBeginFunction(); - - LNK_BuildPdb *task = raw_task; - for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { - CV_SymbolNode *nodes = push_array_no_zero(arena, CV_SymbolNode, chunk->count); - U64 node_idx = 0; - for EachIndex(i, chunk->count) { - LNK_Symbol *symbol = chunk->v[i].symbol; - LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); - COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); - - if (symbol_parsed.section_number == lnk_obj_get_removed_section_number(symbol_ref.obj)) { continue; } - - COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); - if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } - - CV_Pub32Flags flags = 0; - if (COFF_SymbolType_IsFunc(symbol_parsed.type)) { flags |= CV_Pub32Flag_Function; } - - ISectOff sc = lnk_sc_from_symbol(symbol); - U16 symbol_isect16 = safe_cast_u16(sc.isect); - U32 symbol_off32 = safe_cast_u32(sc.off); - - nodes[node_idx].data = cv_make_pub32(arena, flags, symbol_off32, symbol_isect16, symbol->name); - cv_symbol_list_push_node(&task->pub_list_arr[task_id], &nodes[node_idx]); - node_idx += 1; - } - } - - ProfEnd(); -} - internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types) { @@ -2240,10 +2236,11 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config U64 obj_count = cv->obj_count; LNK_BuildPdb task = { - .image_data = image_data, - .symtab = symtab, - .cv = cv, - .pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), + .image_data = image_data, + .symtab = symtab, + .cv = cv, + .pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), + .fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_U16, max_U16), }; // set min type indices @@ -2263,7 +2260,7 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config task.serialized_symbol_data_sizes = push_array(scratch.arena, U64, obj_count); ProfScope("Make GSI/PSI") { - ProfScope("Process & Populate GSI/PSI") tp_for_parallel(tp, 0, tp->worker_count, lnk_process_and_populate_gsi_and_psi_task, &task); + ProfScope("Process & Populate GSI/PSI") tp_for_parallel(tp, 0, tp->worker_count, lnk_build_gsi_psi, &task); ProfBegin("Build and write GSI/PSI"); PDB_Context *pdb = task.pdb; @@ -2369,18 +2366,6 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config dbi_sec_list_concat_arr(&task.pdb->dbi->sec_contrib_list, obj_count, task.sc_list); } ProfEnd(); - - ProfBegin("Make Public Symbols"); - { - task.pub_list_arr = push_array(scratch.arena, CV_SymbolList, tp->worker_count); - tp_for_parallel_prof(tp, tp_arena, tp->worker_count, lnk_build_pdb_public_symbols_defined_task, &task, "Defined"); - - ProfBegin("GSI Push"); - CV_SymbolPtrArray symbols = cv_symbol_ptr_array_from_list(scratch.arena, tp, tp->worker_count, task.pub_list_arr); - gsi_push_many_arr(tp, task.pdb->psi->gsi, symbols.count, symbols.v); - ProfEnd(); - } - ProfEnd(); ProfBegin("Build NatVis"); { diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 524dbca0..e27c6875 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -3,7 +3,8 @@ #pragma once -// --- Code View Input --------------------------------------------------------- +//////////////////////////////// +// CodeView typedef struct { @@ -48,9 +49,9 @@ typedef struct B32 *is_type_server_discarded; // [ts_arr.count] CV_TypeIndex min_type_indices[CV_TypeIndexSource_COUNT]; - U64 symbol_input_count; - struct LNK_SymbolInput *symbol_inputs; // [symbol_input_count] - Rng1U64 *symbol_input_ranges; // [worker_count] + U64 symbol_input_count; + LNK_SymbolInput *symbol_inputs; // [symbol_input_count] + Rng1U64 *symbol_input_ranges; // [worker_count] } LNK_CodeViewInput; typedef struct @@ -60,7 +61,8 @@ typedef struct CV_DebugT *out_types; // [obj_count] } LNK_ParseCvTypes; -// --- Leaf Deduping Tasks ----------------------------------------------------- +//////////////////////////////// +// Type Merging typedef struct { U32 obj_idx; U32 leaf_idx; } LNK_LeafRef; typedef struct { U64 count; LNK_LeafRef **v; } LNK_LeafRefArray; @@ -123,7 +125,8 @@ typedef struct LNK_MergedTypes result; } LNK_MergeTypes; -// --- Build PDB --------------------------------------------- +//////////////////////////////// +// PDB typedef struct { @@ -134,9 +137,10 @@ typedef struct PDB_Context *pdb; PDB_DbiModule **mod_arr; // [obj_count] - U64 total_symbol_count; + Arena **fixed_arenas; // GSI symbol dedup + U64 global_symbol_count; U64 bucket_cap; void **buckets; // [bucket_count] U64 *insert_count; // [worker_count] @@ -146,12 +150,18 @@ typedef struct void **symbol_arr; U32 *symbol_hashes; // [symbol_count] - U64 *proc_ref_counts; // [worker_count] - U64 *proc_ref_sizes; // [worker_count] - U64 *proc_ref_hashes; // [total_proc_ref_count] - U64 *proc_ref_offs; // [worker_count] - String8 proc_refs; + U64 *proc_ref_counts; // [worker_count] + U64 *proc_ref_sizes; // [worker_count] + U64 *proc_ref_hashes; // [total_proc_ref_count] + U64 *proc_ref_offs; // [worker_count] + String8 proc_refs; + U64 proc_ref_count; + CV_SymbolNode *proc_ref_nodes; // [proc_ref_count] + Arena *proc_ref_arena; + U64 *public_symbol_sizes; // [worker_count] + U64 *public_symbol_offs; // [worker_count] + U8 *public_symbol_buffer; U64 *public_symbol_node_counts; // [worker_count] U64 *public_symbol_node_offsets; // [worker_count] CV_SymbolNode *public_symbol_nodes; // [public_symbol_total_count] @@ -192,7 +202,8 @@ typedef struct String8List *maps; } LNK_TypeNameReplacer; -// --- RAD Debug Info ---------------------------------------------------------- +//////////////////////////////// +// RDI typedef struct { @@ -219,8 +230,6 @@ typedef struct CV_TypeIndex *fwdmap; } LNK_BuildUDTFwdMapTask; -// --- RDI Conversion Tasks ---------------------------------------------------- - typedef struct { U64 leaf_count[CV_TypeIndexSource_COUNT]; @@ -307,7 +316,8 @@ typedef struct RDIB_LineTableChunkList *line_tables; } LNK_ConvertUnitToRDITask; -// --- CodeView ---------------------------------------------------------------- +//////////////////////////////// +// CodeView internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_flags, String8List lib_dir_list, String8List alt_pch_dirs, U64 objs_count, LNK_Obj **objs); @@ -321,11 +331,13 @@ internal LNK_LeafRef * lnk_leaf_hash_table_search (LNK_LeafHashTable internal LNK_MergedTypes lnk_merge_types (TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); internal void lnk_replace_type_names_with_hashes (TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); -// --- PDB --------------------------------------------------------------------- +//////////////////////////////// +// PDB internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types); -// --- RDI --------------------------------------------------------------------- +//////////////////////////////// +// RDI internal U64 lnk_udt_name_hash_table_hash (String8 string); internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out); From 883935d44e6fa6d6ef45c71ff46634e0e18993ea Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 25 Mar 2026 11:13:57 -0700 Subject: [PATCH 311/850] WIP simplifying module stream layout step --- src/codeview/codeview.h | 3 +- src/linker/lnk_debug_info.c | 321 ++++++++++++++++++++------- src/linker/lnk_debug_info.h | 13 +- src/linker/pdb_ext/pdb_builder.h | 2 +- src/linker/thread_pool/thread_pool.h | 1 + 5 files changed, 252 insertions(+), 88 deletions(-) diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index f8693d13..f4a6a12f 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -2542,7 +2542,8 @@ X(TypeMDTokenMap, 0xFB) \ X(MergedAssemblyInput, 0xFC) \ X(CoffSymbolRVA, 0xFD) \ X(XfgHashType, 0xFF) \ -X(XfgHashVirtual, 0x100) +X(XfgHashVirtual, 0x100) \ +X(GlobalRefs, 0xCAFE) \ typedef U32 CV_C13SubSectionKind; typedef enum CV_C13SubSectionKindEnum diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 4f29a538..3923650f 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -62,11 +62,8 @@ THREAD_POOL_TASK_FUNC(lnk_strip_debug_t_sig_task) for EachIndex(i, task->raw_types[obj_idx].count) { String8 *d = task->raw_types[obj_idx].v + i; - if (d->size == 0) { continue; } - - if (d->size < sizeof(CV_Signature)) { - lnk_error_obj(LNK_Error_IllData, task->input->obj_arr[obj_idx], ".debug$T must have at least 4 bytes for CodeView signature"); - } + if (d->size == 0) { continue; } + if (d->size < sizeof(CV_Signature)) { lnk_error_obj(LNK_Error_IllData, task->input->obj_arr[obj_idx], ".debug$T must have at least 4 bytes for CodeView signature"); continue; } CV_Signature sig = cv_signature_from_debug_s(*d); switch (sig) { @@ -2002,14 +1999,17 @@ THREAD_POOL_TASK_FUNC(lnk_build_gsi_psi) } internal -THREAD_POOL_TASK_FUNC(lnk_fixup_debug_s_task) +THREAD_POOL_TASK_FUNC(lnk_fixup_cv_symbol_tree_offsets) { ProfBeginFunction(); U64 obj_idx = task_id; LNK_BuildPdb *task = raw_task; + String8List raw_symbols = cv_sub_section_from_debug_s(task->cv->debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); - task->symbol_sizes[obj_idx] = sizeof(CV_Signature); - task->symbol_sizes[obj_idx] += cv_patch_symbol_tree_offsets_new(raw_symbols, task->symbol_sizes[obj_idx], PDB_SYMBOL_ALIGN); + U64 symbol_base = sizeof(CV_Signature); + cv_patch_symbol_tree_offsets_new(raw_symbols, symbol_base, PDB_SYMBOL_ALIGN); + + ProfEnd(); } @@ -2043,29 +2043,201 @@ THREAD_POOL_TASK_FUNC(lnk_process_c13_data_task) ProfEnd(); } +internal +THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) +{ + LNK_BuildPdb *task = raw_task; + MSF_Context *msf = task->pdb->msf; + U32Array obj_indices = task->balanced_obj_indices_arr[task_id]; + + CV_C13SubSectionIdxKind mod_c13_layout[] = { + CV_C13SubSectionIdxKind_StringTable, + CV_C13SubSectionIdxKind_FileChksms, + CV_C13SubSectionIdxKind_FrameData, + CV_C13SubSectionIdxKind_InlineeLines, + CV_C13SubSectionIdxKind_CrossScopeImports, + CV_C13SubSectionIdxKind_CrossScopeExports, + CV_C13SubSectionIdxKind_IlLines, + CV_C13SubSectionIdxKind_FuncMDTokenMap, + CV_C13SubSectionIdxKind_TypeMDTokenMap, + CV_C13SubSectionIdxKind_MergedAssemblyInput, + CV_C13SubSectionIdxKind_CoffSymbolRVA, + CV_C13SubSectionIdxKind_XfgHashType, + CV_C13SubSectionIdxKind_XfgHashVirtual, + }; + + for EachIndex(i, obj_indices.count) { + U64 obj_idx = obj_indices.v[i]; + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8List raw_symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + U64 symbol_base = sizeof(CV_Signature); + mod->sym_data_size = cv_patch_symbol_tree_offsets_new(raw_symbols, symbol_base, PDB_SYMBOL_ALIGN); + + U64 mod_c13_sizes[ArrayCount(mod_c13_layout)] = {0}; + for EachElement(layout_idx, mod_c13_layout) { + CV_C13SubSectionIdxKind layout_kind = mod_c13_layout[layout_idx]; + + if (debug_s.data_list[layout_kind].total_size) { + mod->c13_data_size += sizeof(U32); // kind + mod->c13_data_size += sizeof(U32); // size + mod->c13_data_size += debug_s.data_list[layout_kind].total_size; + mod->c13_data_size = AlignPow2(mod->c13_data_size, CV_C13SubSectionAlign); + } + } + + String8List *line_data = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Lines); + for EachNode(n, String8Node, line_data->first) { + if (n->string.size == 0) { continue; } + + mod->c13_data_size += sizeof(U32); // kind + mod->c13_data_size += sizeof(U32); // size + mod->c13_data_size += n->string.size; + mod->c13_data_size = AlignPow2(mod->c13_data_size, CV_C13SubSectionAlign); + } + + mod->globrefs_size += debug_s.data_list[CV_C13SubSectionKind_GlobalRefs].total_size; + } + barrier_wait(tp->barrier); + + if (task_id == 0) { + for EachIndex(obj_idx, task->cv->obj_count) { + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + U64 mod_size = mod->sym_data_size + mod->c11_data_size + mod->c13_data_size + mod->globrefs_size; + if (mod_size > 0) { + task->mod_arr[obj_idx]->sn = msf_stream_alloc_ex(msf, mod_size); + } + } + } + barrier_wait(tp->barrier); + + Temp scratch = scratch_begin(&arena, 1); + U64 temp_max = max_U16; + U64 temp_size = 0; + U8 *temp = push_array(scratch.arena, U8, temp_max); + + for EachIndex(i, obj_indices.count) { + U64 obj_idx = obj_indices.v[obj_idx]; + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + U64 mod_cap = msf_stream_get_size(msf, mod->sn); + + // write symbols + { + // skip empty modules + if (mod->sn == MSF_INVALID_STREAM_NUMBER) { continue; } + + msf_stream_write_u32(msf, mod->sn, CV_Signature_C13); + + String8List raw_symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + for EachNode(n, String8Node, raw_symbols.first) { + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + // read symbol + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + + if (symbol.kind == CV_SymKind_SKIP) { continue; } + + U64 symbol_size = cv_size_from_symbol(&symbol, PDB_SYMBOL_ALIGN); + + // flush temp to MSF + if (temp_size + symbol_size > temp_max) { + Assert(temp_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write(msf, mod->sn, temp, temp_size); + temp_size = 0; + } + + // acc serialized symbols in temp + U64 serial_size = cv_write_symbol(temp, temp_size, temp_max, &symbol, PDB_SYMBOL_ALIGN); + Assert(serial_size == symbol_size); + temp_size += serial_size; + } + } + + // flush remaining temp + Assert(temp_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write(msf, mod->sn, temp, temp_size); + msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); + + // assert our symbol size estimate was correct + Assert(mod->sym_data_size == msf_stream_get_pos(msf, mod->sn)); + } + + // write rest of c13 data + { + U64 c13_start_pos = msf_stream_get_pos(msf, mod->sn); + + for EachElement(i, mod_c13_layout) { + String8List *data = cv_sub_section_ptr_from_debug_s(&debug_s, mod_c13_layout[i]); + if (data->total_size == 0) { continue; } + + Assert(AlignPow2(sizeof(U32)*2 + data->total_size, PDB_SYMBOL_ALIGN) <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write_u32 (msf, mod->sn, mod_c13_layout[i]); + msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(data->total_size)); + msf_stream_write_list(msf, mod->sn, *data); + msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); + } + + String8List *line_data = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Lines); + for EachNode(line_n, String8Node, line_data->first) { + if (line_n->string.size == 0) { continue; } + + Assert(AlignPow2(sizeof(U32)*2 + line_n->string.size, PDB_SYMBOL_ALIGN) <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write_u32 (msf, mod->sn, CV_C13SubSectionKind_Lines); + msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(line_n->string.size)); + msf_stream_write_string(msf, mod->sn, line_n->string); + msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); + } + + U64 c13_end_pos = msf_stream_get_pos(msf, mod->sn); + Assert(mod->c13_data_size == cv_size_from_debug_s(&debug_s, CV_C13SubSectionAlign)); + + // write global refs + String8List global_refs = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_GlobalRefs); + Assert(global_refs.total_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write_list(msf, mod->sn, global_refs); + } + + // make stream has enough memory so it doens't trigger memory allocations in MSF + // during multi-thread write + U64 mod_size = mod->sym_data_size + mod->c11_data_size + mod->c13_data_size + mod->globrefs_size; + AssertAlways(mod_size == msf_stream_get_pos(msf, mod->sn)); + } + barrier_wait(tp->barrier); + + scratch_end(scratch); +} + +#if 0 internal THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) { LNK_BuildPdb *task = raw_task; - U64 obj_idx = task_id; - PDB_DbiModule *mod = task->mod_arr [obj_idx]; - CV_DebugS debug_s = task->cv->debug_s_arr [obj_idx]; - String8List globrefs = task->globrefs_arr [obj_idx]; - U64 sym_data_size = task->serialized_symbol_data_sizes[obj_idx]; - MSF_Context *msf = task->pdb->msf; - MSF_UInt stream_cap = msf_stream_get_cap(task->pdb->msf, mod->sn); + U64 obj_idx = task_id; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + MSF_Context *msf = task->pdb->msf; + + if (task_id == 0) { + for EachIndex(i, task->cv->obj_count) { + task->mod_arr[i]->sn = msf_stream_alloc_ex(msf, task->module_data[i].total_size); + } + } + barrier_wait(tp->barrier); + + MSF_UInt mod_cap = msf_stream_get_cap(task->pdb->msf, mod->sn); + Assert(task->module_data[obj_idx].total_size == mod_cap); // write symbols - if (sym_data_size > 0) { + String8List raw_symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + if (raw_symbols.total_size) { Temp scratch = scratch_begin(&arena, 1); msf_stream_write_u32(msf, mod->sn, CV_Signature_C13); - String8List raw_symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); - U64 temp_max = max_U16; - U64 temp_size = 0; - U8 *temp = push_array(scratch.arena, U8, temp_max); + U64 temp_max = max_U16; + U64 temp_size = 0; + U8 *temp = push_array(scratch.arena, U8, temp_max); for EachNode(n, String8Node, raw_symbols.first) { for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { // read symbol @@ -2078,7 +2250,7 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) // flush temp to MSF if (temp_size + symbol_size > temp_max) { - Assert(temp_size <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + Assert(temp_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); msf_stream_write(msf, mod->sn, temp, temp_size); temp_size = 0; } @@ -2091,13 +2263,13 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) } // flush remaining temp - Assert(temp_size <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + Assert(temp_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); msf_stream_write(msf, mod->sn, temp, temp_size); msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); U64 size = msf_stream_get_pos(msf, mod->sn); // assert our symbol size estimate was correct - Assert(sym_data_size == msf_stream_get_pos(msf, mod->sn)); + Assert(raw_symbols.total_size == msf_stream_get_pos(msf, mod->sn)); scratch_end(scratch); } @@ -2107,14 +2279,27 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) { U64 c13_start_pos = msf_stream_get_pos(msf, mod->sn); - for EachElement(layout_idx, debug_s.data_list) { - if (layout_idx == CV_C13SubSectionIdxKind_Lines || layout_idx == CV_C13SubSectionIdxKind_Symbols) { continue; } - - CV_C13SubSectionKind kind = cv_c13_sub_section_kind_from_idx(layout_idx); - String8List *data = cv_sub_section_ptr_from_debug_s(&debug_s, kind); + CV_C13SubSectionIdxKind c13_data_layout[] = { + CV_C13SubSectionIdxKind_StringTable, + CV_C13SubSectionIdxKind_FileChksms, + CV_C13SubSectionIdxKind_FrameData, + CV_C13SubSectionIdxKind_InlineeLines, + CV_C13SubSectionIdxKind_CrossScopeImports, + CV_C13SubSectionIdxKind_CrossScopeExports, + CV_C13SubSectionIdxKind_IlLines, + CV_C13SubSectionIdxKind_FuncMDTokenMap, + CV_C13SubSectionIdxKind_TypeMDTokenMap, + CV_C13SubSectionIdxKind_MergedAssemblyInput, + CV_C13SubSectionIdxKind_CoffSymbolRVA, + CV_C13SubSectionIdxKind_XfgHashType, + CV_C13SubSectionIdxKind_XfgHashVirtual, + }; + for EachElement(i, c13_data_layout) { + CV_C13SubSectionIdxKind kind = c13_data_layout[i]; + String8List *data = cv_sub_section_ptr_from_debug_s(&debug_s, kind); if (data->total_size == 0) { continue; } - Assert(AlignPow2(sizeof(U32)*2 + data->total_size, PDB_SYMBOL_ALIGN) <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + Assert(AlignPow2(sizeof(U32)*2 + data->total_size, PDB_SYMBOL_ALIGN) <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); msf_stream_write_u32 (msf, mod->sn, kind); msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(data->total_size)); msf_stream_write_list(msf, mod->sn, *data); @@ -2125,7 +2310,7 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) for EachNode(line_n, String8Node, line_data->first) { if (line_n->string.size == 0) { continue; } - Assert(AlignPow2(sizeof(U32)*2 + line_n->string.size, PDB_SYMBOL_ALIGN) <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); + Assert(AlignPow2(sizeof(U32)*2 + line_n->string.size, PDB_SYMBOL_ALIGN) <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); msf_stream_write_u32 (msf, mod->sn, CV_C13SubSectionKind_Lines); msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(line_n->string.size)); msf_stream_write_string(msf, mod->sn, line_n->string); @@ -2135,22 +2320,23 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) U64 c13_end_pos = msf_stream_get_pos(msf, mod->sn); c13_data_size = c13_end_pos - c13_start_pos; Assert(c13_data_size == cv_size_from_debug_s(&debug_s, CV_C13SubSectionAlign)); + + // write global refs + String8List global_refs = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_GlobalRefs); + Assert(global_refs.total_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); + msf_stream_write_list(msf, mod->sn, global_refs); } - // write global refs - Assert(globrefs.total_size <= (stream_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write_list(msf, mod->sn, globrefs); - // update module data sizes - mod->sym_data_size = safe_cast_u32(sym_data_size); + mod->sym_data_size = safe_cast_u32(raw_symbols.total_size); mod->c11_data_size = 0; mod->c13_data_size = safe_cast_u32(c13_data_size); - mod->globrefs_size = safe_cast_u32(globrefs.total_size); // make stream has enough memory so it doens't trigger memory allocations in MSF // during multi-thread write - AssertAlways(task->mod_sizes[obj_idx] == msf_stream_get_pos(msf, mod->sn)); + AssertAlways(mod_size == msf_stream_get_pos(msf, mod->sn)); } +#endif internal THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) @@ -2246,18 +2432,16 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config // set min type indices for EachElement(ti_source, cv_types.min_type_indices) { task.pdb->type_servers[ti_source]->ti_lo = cv_types.min_type_indices[ti_source]; } - ProfBegin("Reserve DBI Modules"); + ProfBegin("Reserve Modules"); task.mod_arr = push_array(tp_arena->v[0], PDB_DbiModule *, obj_count); for EachIndex(obj_idx, obj_count) { - LNK_Obj *obj = cv->obj_arr[obj_idx]; - task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, obj->path, lnk_obj_get_lib_path(obj)); - - // we don't support symbol append - Assert(task.mod_arr[obj_idx]->sn == MSF_INVALID_STREAM_NUMBER); + LNK_Obj *obj = cv->obj_arr[obj_idx]; + String8 lib_path = lnk_obj_get_lib_path(obj); + task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, obj->path, lib_path); } ProfEnd(); - task.serialized_symbol_data_sizes = push_array(scratch.arena, U64, obj_count); + task.c13_symbol_sizes = push_array(scratch.arena, U64, obj_count); ProfScope("Make GSI/PSI") { ProfScope("Process & Populate GSI/PSI") tp_for_parallel(tp, 0, tp->worker_count, lnk_build_gsi_psi, &task); @@ -2274,9 +2458,20 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config gsi_build(tp, pdb->gsi, pdb->msf, pdb->dbi->globals_sn, pdb->dbi->symbols_sn); ProfEnd(); - ProfScope("fixup_symbol_streams") tp_for_parallel(tp, tp_arena, obj_count, lnk_fixup_debug_s_task, &task); + // TODO: actually collect offsets and pass them here + ProfBegin("Build Empty Global Reference Array"); + for EachIndex(obj_idx, obj_count) { + CV_DebugS *debug_s = &cv->debug_s_arr[obj_idx]; + String8List *srl = &debug_s->data_list[CV_C13SubSectionKind_GlobalRefs]; + str8_serial_begin(tp_arena->v[0], srl); + Assert(srl->total_size == 0); + str8_serial_push_u32(scratch.arena, srl, srl->total_size); + } + ProfEnd(); } + ProfScope("Write Modules") tp_for_parallel(tp, 0, obj_count, lnk_write_pdb_modules, &task); + ProfBegin("Build String Table"); task.string_ht = cv_dedup_string_tables(tp_arena, tp, obj_count, cv->debug_s_arr); cv_string_hash_table_assign_buffer_offsets(tp, task.string_ht); @@ -2300,42 +2495,6 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config } } ProfEnd(); - - ProfBegin("Build DBI Modules"); - { - TP_Temp temp = tp_temp_begin(tp_arena); - - // TODO: actually collect offsets and pass them here - ProfBegin("Build Empty Global Reference Array"); - task.globrefs_arr = push_array(tp_arena->v[0], String8List, obj_count); - for EachIndex(obj_idx, obj_count) { - String8List *srl = &task.globrefs_arr[obj_idx]; - str8_serial_begin(tp_arena->v[0], srl); - Assert(srl->total_size == 0); - str8_serial_push_u32(tp_arena->v[0], srl, srl->total_size); - } - ProfEnd(); - - // reserve memory for module streams - ProfBegin("Reserve Modules Memory"); - task.mod_sizes = push_array(scratch.arena, U32, obj_count); - for EachIndex(obj_idx, obj_count) { - // compute number of bytes needed for module data - U64 mod_size = 0; - mod_size += cv_size_from_debug_s(&cv->debug_s_arr[obj_idx], CV_C13SubSectionAlign); - mod_size += task.serialized_symbol_data_sizes[obj_idx]; - mod_size += task.globrefs_arr[obj_idx].total_size; - - task.mod_sizes[obj_idx] = safe_cast_u32(mod_size); - task.mod_arr [obj_idx]->sn = msf_stream_alloc_ex(task.pdb->msf, task.mod_sizes[obj_idx]); - } - ProfEnd(); - - tp_for_parallel_prof(tp, 0, obj_count, lnk_write_pdb_module_stream, &task, "Write Module Data"); - - tp_temp_end(temp); - } - ProfEnd(); ProfBegin("Build Section Contrib Map"); { diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index e27c6875..5d32a1e7 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -139,6 +139,8 @@ typedef struct Arena **fixed_arenas; + U32Array *balanced_obj_indices_arr; // [obj_count] + // GSI symbol dedup U64 global_symbol_count; U64 bucket_cap; @@ -168,16 +170,17 @@ typedef struct CV_SymbolList *public_symbols; // [worker_count] U32 **public_symbol_hashes; // [worker_count][public_symbol.count] - U64 *symbol_sizes; // [obj_count] - // process C13 data String8List *source_file_names_list_arr; CV_StringHashTable string_ht; // build DBI modules - String8List *globrefs_arr; // [obj_count] - U32 *mod_sizes; // [obj_count] - U64 *serialized_symbol_data_sizes; // [obj_count] + String8List *module_data; // obj_count] + + U64 **module_sizes; // [obj_count][CV_C13SubSectionIdxKind_COUNT] + String8List *globrefs_arr; // [obj_count] + U32 *mod_sizes; // [obj_count] + U64 *c13_symbol_sizes; // [obj_count] // push DBI SC Map PE_BinInfo pe; diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h index 80f6c02f..b2a9edf5 100644 --- a/src/linker/pdb_ext/pdb_builder.h +++ b/src/linker/pdb_ext/pdb_builder.h @@ -258,7 +258,7 @@ typedef struct PDB_DbiModule U64 sym_data_size; U64 c11_data_size; U64 c13_data_size; - U64 globrefs_size; // TODO: what is this for? + U64 globrefs_size; String8 obj_path; String8 lib_path; String8List source_file_list; diff --git a/src/linker/thread_pool/thread_pool.h b/src/linker/thread_pool/thread_pool.h index 0dd840a0..6d338a8f 100644 --- a/src/linker/thread_pool/thread_pool.h +++ b/src/linker/thread_pool/thread_pool.h @@ -3,6 +3,7 @@ #pragma once +struct TP_Context; #define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, U64 worker_id, U64 task_id, void *raw_task, struct TP_Context *tp) typedef THREAD_POOL_TASK_FUNC(TP_TaskFunc); From d7cfd5f55a7220151a1b7c6f425530c7eaa04484 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 26 Mar 2026 17:46:30 -0700 Subject: [PATCH 312/850] WIP rework GSI and PSI symbol writer --- src/base/base_strings.c | 62 +++ src/base/base_strings.h | 9 + src/linker/codeview_ext/codeview.c | 50 +- src/linker/codeview_ext/codeview.h | 1 - src/linker/lnk_debug_info.c | 827 +++++++++++------------------ src/linker/lnk_debug_info.h | 19 +- src/linker/pdb_ext/msf_builder.c | 30 ++ src/linker/pdb_ext/msf_builder.h | 2 + 8 files changed, 432 insertions(+), 568 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index b59c0323..9d489476 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -2904,6 +2904,68 @@ str8_is_before_case_sensitive(const void *a, const void *b) return cmp < 0; } +//////////////////////////////// +// string buffer + +internal U64 +str8_buffer_write(String8Node *buf, U64 *pos, String8 data) +{ + U64 copy_size = 0; + if (buf) { + for (copy_size = 0; copy_size < data.size; ) { + U64 data_size = data.size - copy_size; + + U64 available_size = buf->string.size - *pos; + U64 to_copy = Min(available_size, data_size); + if (data.str == 0) { + MemorySet(buf->string.str, 0, to_copy); + } else { + U8 *data_ptr = data.str + copy_size; + MemoryCopy(buf->string.str, data_ptr, to_copy); + } + *pos += to_copy; + + if (*pos >= buf->string.size) { + if (buf->next) { + *buf = *buf->next; + *pos = 0; + } + } + + copy_size += to_copy; + } + } else { + copy_size = data.size; + } + return copy_size; +} + +internal U64 +str8_buffer_write_u16(String8Node *buf, U64 *pos, U16 v) +{ + return str8_buffer_write(buf, pos, str8_struct(&v)); +} + +internal U64 +str8_buffer_write_u32(String8Node *buf, U64 *pos, U32 v) +{ + return str8_buffer_write(buf, pos, str8_struct(&v)); +} + +internal U64 +str8_buffer_write_zeroes(String8Node *buf, U64 *pos, U64 size) +{ + return str8_buffer_write(buf, pos, str8(0, size)); +} + +internal U64 +str8_buffer_write_string_list(String8Node *buf, U64 *pos, String8List list) +{ + U64 copy_size = 0; + for EachNode(n, String8Node, list.first) { copy_size += str8_buffer_write(buf, pos, n->string); } + return copy_size; +} + //////////////////////////////// //~ rjf: Basic String Hashes diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 8912d1e1..635bc9ee 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -445,6 +445,15 @@ internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, Stri #define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) #define str8_deserial_read_struct(string, off, ptr) str8_deserial_read_array(string, off, ptr, 1) +//////////////////////////////// +//~ string buffer + +internal U64 str8_buffer_write(String8Node *buf, U64 *pos, String8 data); +internal U64 str8_buffer_write_u16(String8Node *buf, U64 *pos, U16 v); +internal U64 str8_buffer_write_u32(String8Node *buf, U64 *pos, U32 v); +internal U64 str8_buffer_write_zeroes(String8Node *buf, U64 *pos, U64 size); +internal U64 str8_buffer_write_string_list(String8Node *buf, U64 *pos, String8List list); + //////////////////////////////// //~ rjf: Basic String Hashes diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 38a5e78e..9b2a8d93 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -192,21 +192,8 @@ cv_precomp_info_from_leaf(CV_Leaf leaf) //~ Symbol Helpers internal U64 -cv_size_from_symbol(CV_Symbol *symbol, U64 align) +cv_write_symbol_buf(String8Node *buf, U64 *buf_pos, CV_Symbol *symbol, U64 align) { - U64 size = 0; - size += sizeof(CV_SymSize); - size += sizeof(CV_SymKind); - size += AlignPow2(symbol->data.size, align); - return size; -} - -internal U64 -cv_write_symbol(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align) -{ - U64 write_size = cv_size_from_symbol(symbol, align); - Assert(buffer_cursor + write_size <= buffer_size); - U64 record_size = 0; record_size += sizeof(symbol->kind); record_size += AlignPow2(symbol->data.size, align); @@ -214,23 +201,28 @@ cv_write_symbol(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbo Assert(record_size <= CV_SymSize_Max); CV_SymSize record_size16 = (CV_SymSize)record_size; - // init header - CV_SymbolHeader *header = (CV_SymbolHeader *)(buffer + buffer_cursor); - header->size = record_size16; - header->kind = symbol->kind; - - // copy symbol data - U8 *data_dst = (U8 *)(header + 1); - MemoryCopy(data_dst, symbol->data.str, symbol->data.size); - - // set pad bytes - U64 pad_size = AlignPadPow2(symbol->data.size, align); - U8 *pad_dst = data_dst + symbol->data.size; - MemorySet(&pad_dst[0], 0, pad_size); + U64 write_size = 0; + write_size += str8_buffer_write(buf, buf_pos, str8((U8 *)&(CV_SymbolHeader){ .size = record_size16, .kind = symbol->kind }, sizeof(CV_SymbolHeader))); + write_size += str8_buffer_write(buf, buf_pos, symbol->data); + write_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(symbol->data.size, align)); return write_size; } +internal U64 +cv_write_symbol(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align) +{ + String8Node dummy_curr = { .string = str8(buffer + buffer_cursor, buffer_size - buffer_cursor) }; + U64 dummy_pos = 0; + return cv_write_symbol_buf(&dummy_curr, &dummy_pos, symbol, align); +} + +internal U64 +cv_size_from_symbol(CV_Symbol *symbol, U64 align) +{ + return cv_write_symbol_buf(0, 0, symbol, align); +} + internal String8 cv_data_from_symbol(Arena *arena, CV_Symbol *symbol, U64 align) { @@ -1532,9 +1524,7 @@ cv_patch_symbol_tree_offsets_new(String8List raw_symbols, U64 base_offset, U64 a for EachNode(n, String8Node, raw_symbols.first) { for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); - - if (symbol.kind == CV_SymKind_SKIP) { continue; } + TryReadBreak(cv_read_symbol(n->string, cursor, align, &symbol), cursor); if (cv_is_scope_symbol(symbol.kind)) { // NOTE: We don't patch 'next' offset in PROC symbols because diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index fa1e2e00..4cc68079 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -403,7 +403,6 @@ internal String8 cv_make_comp3(Arena *arena, CV_Compile3Flags flags, CV_La internal String8 cv_make_envblock(Arena *arena, String8List string_list); internal CV_Symbol cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local); internal CV_Symbol cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name); -internal CV_SymbolList cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list); internal U64 cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out); internal CV_Symbol cv_symbol_from_string(String8 raw_data); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 3923650f..433686c2 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1726,176 +1726,196 @@ lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, U64 leaf_cou } internal -THREAD_POOL_TASK_FUNC(lnk_build_gsi_psi) +THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) { Temp scratch = scratch_begin(&arena, 1); - U64 obj_idx = task_id; - LNK_BuildPdb *task = raw_task; - PDB_GsiContext *gsi = task->pdb->gsi; - PDB_PsiContext *psi = task->pdb->psi; - - if (task_id == 0) { - task->proc_ref_sizes = push_array(scratch.arena, U64, tp->worker_count); - task->proc_ref_counts = push_array(scratch.arena, U64, tp->worker_count); - } - barrier_wait(tp->barrier); - - // collect global data and global typedefs - VoidList global_symbols = {0}; - for EachInRange(i, task->cv->symbol_input_ranges[task_id]) { - LNK_SymbolInput symbols = task->cv->symbol_inputs[i]; - for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { - CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); - - if (cv_is_global_symbol(symbol.kind)) { - void *ptr = cv_ptr_from_symbol(symbol); - void_list_push(scratch.arena, &global_symbols, ptr); - } else if (cv_is_typedef(symbol.kind)) { - if (depth == 0) { - void *ptr = cv_ptr_from_symbol(symbol); - void_list_push(scratch.arena, &global_symbols, ptr); - } - } else if (symbol.kind == 0x1176) { - CV_SymKind *kind_ptr = cv_kind_ptr_from_symbol(symbol); - *kind_ptr = CV_SymKind_SKIP; - } else if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { - String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - task->proc_ref_sizes[task_id] += sizeof(CV_SymbolHeader); - task->proc_ref_sizes[task_id] += sizeof(CV_SymRef2); - task->proc_ref_sizes[task_id] += name.size + 1; - task->proc_ref_sizes[task_id] = AlignPow2(task->proc_ref_sizes[task_id], sizeof(void *)); - task->proc_ref_counts[task_id] += 1; - } - - if (cv_is_scope_symbol(symbol.kind)) { - depth += 1; - } else if (cv_is_end_symbol(symbol.kind)) { - if (depth == 0) { Assert(0 && "malformed symbol stream"); break; } - depth -= 1; - } - } - } - ins_atomic_u64_add_eval(&task->global_symbol_count, global_symbols.count); - barrier_wait(tp->barrier); - - if (task_id == 0) { - task->bucket_cap = (U64)((F64)task->global_symbol_count * 1.3); - task->buckets = push_array(scratch.arena, void *, task->bucket_cap); - task->insert_count = push_array(scratch.arena, U64, tp->worker_count); - } - barrier_wait(tp->barrier); - - // insert symbols into hash table - for EachNode(n, VoidNode, global_symbols.first) { - String8 raw = cv_raw_from_symbol(n->v); - U64 hash = u64_hash_from_str8(raw); - void *slot_ptr = cv_symbol_deduper_insert_or_update(task->buckets, task->bucket_cap, hash, n->v); - if (slot_ptr == 0) { - task->insert_count[task_id] += 1; - } - } - barrier_wait(tp->barrier); - - // compact buckets - for (U64 i = 1, k = 0; i < task->bucket_cap; i += 1) { - if (task->buckets[i] != 0 && task->buckets[i-1] == 0) { - while (task->buckets[k] != 0) { k += 1; } - task->buckets[k] = task->buckets[i]; - task->buckets[i] = 0; - } - } - barrier_wait(tp->barrier); - - if (task_id == 0) { - task->symbol_count = sum_array_u64(tp->worker_count, task->insert_count); - task->symbol_arr = task->buckets; - - // divide symbol per worker - task->symbol_ranges = tp_divide_work(scratch.arena, task->symbol_count, tp->worker_count); - - // alloc memory for hashes - task->symbol_hashes = push_array_no_zero(scratch.arena, U32, task->symbol_count); - } - barrier_wait(tp->barrier); - - // hash symbols - for EachInRange(i, task->symbol_ranges[task_id]) { - CV_Symbol symbol = cv_symbol_from_ptr(task->symbol_arr[i]); - String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - task->symbol_hashes[i] = gsi_hash(gsi, name); - } - barrier_wait(tp->barrier); - - if (task_id == 0) { - // take into account arena header - for EachIndex(i, tp->worker_count) { task->proc_ref_sizes[i] += ARENA_HEADER_SIZE; } - - U64 total_proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); - // prealloc output buffer for the proc refs - task->proc_refs.size = sum_array_u64(tp->worker_count, task->proc_ref_sizes); - task->proc_refs.str = push_array(gsi->arena, U8, task->proc_refs.size); - task->proc_ref_hashes = push_array(scratch.arena, U64, total_proc_ref_count); - task->proc_ref_offs = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_sizes, tp->worker_count); - - task->proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); - task->proc_ref_nodes = push_array(gsi->arena, CV_SymbolNode, task->proc_ref_count); - } - barrier_wait(tp->barrier); + LNK_BuildPdb *task = raw_task; + PDB_GsiContext *gsi = task->pdb->gsi; + PDB_PsiContext *psi = task->pdb->psi; + U32Array obj_indices = task->obj_indices[task_id]; + // + // global symbols + // { - U64 proc_refs_size = task->proc_ref_sizes[task_id]; - U64 proc_refs_off = task->proc_ref_offs[task_id]; - U8 *proc_refs = task->proc_refs.str + proc_refs_off; - Arena *proc_ref_arena = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .optional_backing_buffer = proc_refs, .reserve_size = proc_refs_size, .commit_size = proc_refs_size }); - - U64 proc_ref_idx = task->proc_ref_offs[task_id]; + // collect global data and global typedefs + VoidList global_symbols = {0}; for EachInRange(i, task->cv->symbol_input_ranges[task_id]) { - LNK_SymbolInput *in = &task->cv->symbol_inputs[i]; - String8 raw_symbols = in->raw_symbols; - CV_ModIndex imod = task->mod_arr[in->obj_idx]->imod; - for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= raw_symbols.size; ) { + LNK_SymbolInput symbols = task->cv->symbol_inputs[i]; + for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); - if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { - Temp temp = temp_begin(task->fixed_arenas[task_id]); + TryReadBreak(cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); - String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - CV_Symbol proc_ref_symbol = cv_make_proc_ref(temp.arena, imod, safe_cast_u32(symbol.offset), name, cv_is_lproc(symbol)); - String8 proc_ref_raw = cv_data_from_symbol(proc_ref_arena, &proc_ref_symbol, 1); + if (cv_is_global_symbol(symbol.kind)) { + void *ptr = cv_ptr_from_symbol(symbol); + void_list_push(scratch.arena, &global_symbols, ptr); + } else if (cv_is_typedef(symbol.kind)) { + if (depth == 0) { + void *ptr = cv_ptr_from_symbol(symbol); + void_list_push(scratch.arena, &global_symbols, ptr); + } + } else if (symbol.kind == 0x1176) { + CV_SymKind *kind_ptr = cv_kind_ptr_from_symbol(symbol); + *kind_ptr = CV_SymKind_SKIP; + } - CV_SymbolNode *n = &task->proc_ref_nodes[proc_ref_idx++]; - n->data = cv_symbol_from_ptr(proc_ref_raw.str); + if (cv_is_scope_symbol(symbol.kind)) { + depth += 1; + } else if (cv_is_end_symbol(symbol.kind)) { + if (depth == 0) { Assert(0 && "malformed symbol stream"); break; } + depth -= 1; + } + } + } + ins_atomic_u64_add_eval(&task->global_symbol_count, global_symbols.count); + barrier_wait(tp->barrier); - task->proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&n->data); + if (task_id == 0) { + task->bucket_cap = (U64)((F64)task->global_symbol_count * 1.3); + task->buckets = push_array(scratch.arena, void *, task->bucket_cap); + } + barrier_wait(tp->barrier); - temp_end(temp); + // insert symbols into hash table + for EachNode(n, VoidNode, global_symbols.first) { + String8 raw = cv_raw_from_symbol(n->v); + U64 hash = u64_hash_from_str8(raw); + cv_symbol_deduper_insert_or_update(task->buckets, task->bucket_cap, hash, n->v); + } + barrier_wait(tp->barrier); + + // compact buckets + if (task_id == 0) { + for (U64 i = 1; i < task->bucket_cap; i += 1) { + if (task->buckets[i] != 0 && task->buckets[i-1] == 0) { + while (task->buckets[task->symbol_count] != 0) { task->symbol_count += 1; } + task->buckets[task->symbol_count] = task->buckets[i]; + task->buckets[i] = 0; + } + } + + task->symbol_arr = task->buckets; + + // divide symbol per worker + task->symbol_ranges = tp_divide_work(scratch.arena, task->symbol_count, tp->worker_count); + + // alloc memory for hashes + task->symbol_hashes = push_array_no_zero(scratch.arena, U32, task->symbol_count); + } + barrier_wait(tp->barrier); + + // hash symbols + for EachInRange(i, task->symbol_ranges[task_id]) { + CV_Symbol symbol = cv_symbol_from_ptr(task->symbol_arr[i]); + String8 name = cv_name_from_symbol(symbol.kind, symbol.data); + task->symbol_hashes[i] = gsi_hash(gsi, name); + } + barrier_wait(tp->barrier); + + // push global symbols + if (task_id == 0) { + CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, task->symbol_count); + for EachIndex(i, task->symbol_count) { + CV_SymbolNode *n = &nodes[i]; + n->prev = n->next = 0; + n->data = cv_symbol_from_ptr(task->symbol_arr[i]); + gsi_push_(gsi, task->symbol_hashes[i], n); + } + } + } + + // + // proc refs + // + { + if (task_id == 0) { + task->proc_ref_sizes = push_array(scratch.arena, U64, tp->worker_count); + task->proc_ref_counts = push_array(scratch.arena, U64, tp->worker_count); + } + barrier_wait(tp->barrier); + + for EachIndex(i, obj_indices.count) { + U64 obj_idx = obj_indices.v[i]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + for EachNode(n, String8Node, symbols.first) { + for (U64 cursor = 0, symbol_cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + + if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { + String8 name = cv_name_from_symbol(symbol.kind, symbol.data); + task->proc_ref_sizes[task_id] += sizeof(CV_SymRef2); + task->proc_ref_sizes[task_id] += name.size + 1; + task->proc_ref_sizes[task_id] = AlignPow2(task->proc_ref_sizes[task_id], sizeof(void *)); + task->proc_ref_counts[task_id] += 1; + } } } } barrier_wait(tp->barrier); if (task_id == 0) { - // push global symbols - { - CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, task->symbol_count); - for EachIndex(i, task->symbol_count) { - CV_SymbolNode *n = &nodes[i]; - n->prev = n->next = 0; - n->data = cv_symbol_from_ptr(task->symbol_arr[i]); - gsi_push_(gsi, task->symbol_hashes[i], n); + // take into account arena header + for EachIndex(i, tp->worker_count) { task->proc_ref_sizes[i] += ARENA_HEADER_SIZE; } + + U64 total_proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); + // prealloc output buffer for the proc refs + task->proc_refs.size = sum_array_u64(tp->worker_count, task->proc_ref_sizes); + task->proc_refs.str = push_array(gsi->arena, U8, task->proc_refs.size); + task->proc_ref_hashes = push_array(scratch.arena, U64, total_proc_ref_count); + task->proc_ref_offs = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_sizes, tp->worker_count); + task->proc_ref_indices = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_counts, tp->worker_count); + + task->proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); + task->proc_ref_nodes = push_array(gsi->arena, CV_SymbolNode, task->proc_ref_count); + } + barrier_wait(tp->barrier); + + U64 proc_refs_size = task->proc_ref_sizes[task_id]; + U64 proc_refs_off = task->proc_ref_offs[task_id]; + U64 proc_ref_idx = task->proc_ref_indices[task_id]; + U8 *proc_refs = task->proc_refs.str + proc_refs_off; + Arena *proc_ref_arena = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .optional_backing_buffer = proc_refs, .reserve_size = proc_refs_size, .commit_size = proc_refs_size }); + + for EachIndex(i, obj_indices.count) { + U64 obj_idx = obj_indices.v[i]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + CV_ModIndex imod = task->mod_arr[obj_idx]->imod; + for EachNode(n, String8Node, symbols.first) { + for (U64 cursor = 0, symbol_cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + if (symbol.kind == CV_SymKind_SKIP) { continue; } + + if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { + String8 name = cv_name_from_symbol(symbol.kind, symbol.data); + CV_SymbolNode *n = &task->proc_ref_nodes[proc_ref_idx++]; + n->data = cv_make_proc_ref(proc_ref_arena, imod, symbol_cursor, name, cv_is_lproc(symbol)); + + task->proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&n->data); + } + + symbol_cursor += cv_write_symbol_buf(0, 0, &symbol, PDB_SYMBOL_ALIGN); } } + } + barrier_wait(tp->barrier); - // push proc refs + // push proc refs + if (task_id == 0) { for EachIndex(i, task->proc_ref_count) { gsi_push_(gsi, task->proc_ref_hashes[i], &task->proc_ref_nodes[i]); } } barrier_wait(tp->barrier); } - + + // + // public symbols + // { if (task_id == 0) { task->public_symbol_sizes = push_array(scratch.arena, U64, tp->worker_count); @@ -1914,7 +1934,6 @@ THREAD_POOL_TASK_FUNC(lnk_build_gsi_psi) COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } - task->public_symbol_sizes[task_id] += sizeof(CV_SymbolHeader); task->public_symbol_sizes[task_id] += sizeof(CV_SymPub32); task->public_symbol_sizes[task_id] += symbol->name.size + 1; task->public_symbol_sizes[task_id] = AlignPow2(task->public_symbol_sizes[task_id], sizeof(void *)); @@ -1954,18 +1973,13 @@ THREAD_POOL_TASK_FUNC(lnk_build_gsi_psi) COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } - Temp temp = temp_begin(task->fixed_arenas[task_id]); - CV_Pub32Flags flags = COFF_SymbolType_IsFunc(symbol_parsed.type) ? CV_Pub32Flag_Function : 0; ISectOff sc = lnk_sc_from_symbol(symbol); - CV_Symbol pub_symbol = cv_make_pub32(temp.arena, flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); - String8 pub_raw = cv_data_from_symbol(public_symbol_arena, &pub_symbol, 1); + CV_Symbol pub_symbol = cv_make_pub32(public_symbol_arena, flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); - task->public_symbol_nodes[node_idx].data = cv_symbol_from_ptr(pub_raw.str); + task->public_symbol_nodes[node_idx].data = pub_symbol; cv_symbol_list_push_node(&task->public_symbols[task_id], &task->public_symbol_nodes[node_idx]); node_idx += 1; - - temp_end(temp); } } barrier_wait(tp->barrier); @@ -1998,60 +2012,34 @@ THREAD_POOL_TASK_FUNC(lnk_build_gsi_psi) scratch_end(scratch); } -internal -THREAD_POOL_TASK_FUNC(lnk_fixup_cv_symbol_tree_offsets) +internal U64 +lnk_write_debug_s_to_pdb_module(PDB_DbiModule *mod, CV_DebugS debug_s, String8Node *buf, U64 *buf_pos) { - ProfBeginFunction(); - U64 obj_idx = task_id; - LNK_BuildPdb *task = raw_task; + U64 mod_cursor = 0; - String8List raw_symbols = cv_sub_section_from_debug_s(task->cv->debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); - U64 symbol_base = sizeof(CV_Signature); - cv_patch_symbol_tree_offsets_new(raw_symbols, symbol_base, PDB_SYMBOL_ALIGN); + mod->sym_data_size = 0; + mod->c11_data_size = 0; + mod->c13_data_size = 0; + mod->globrefs_size = 0; + // signature + mod_cursor += str8_buffer_write_u32(buf, buf_pos, CV_Signature_C13); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_process_c13_data_task) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena,1); - - U64 obj_idx = task_id; - LNK_BuildPdb *task = raw_task; - CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; - - // parse checksum data - String8List checksum_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); - CV_ChecksumList checksum_list = cv_c13_parse_checksum_data_list(scratch.arena, checksum_data); - - // get strings sub-section - String8 string_data = cv_string_table_from_debug_s(debug_s); - - // collect source file names from checksum headers - String8List source_file_names_list = cv_c13_collect_source_file_names(arena, checksum_list, string_data); - - // relocate checksum data - cv_c13_patch_string_offsets_in_checksum_list(checksum_list, string_data, task->pdb->info->strtab.size, task->string_ht); - - // store for later pass - task->source_file_names_list_arr[obj_idx] = source_file_names_list; - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) -{ - LNK_BuildPdb *task = raw_task; - MSF_Context *msf = task->pdb->msf; - U32Array obj_indices = task->balanced_obj_indices_arr[task_id]; + // write symbols + String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + for EachNode(n, String8Node, symbols.first) { + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + if (symbol.kind == CV_SymKind_SKIP) { continue; } + U64 symbol_size = cv_write_symbol_buf(buf, buf_pos, &symbol, PDB_SYMBOL_ALIGN); + mod_cursor += symbol_size; + mod->sym_data_size += symbol_size; + } + } + // write file checksums, inlinee lines etc. CV_C13SubSectionIdxKind mod_c13_layout[] = { - CV_C13SubSectionIdxKind_StringTable, CV_C13SubSectionIdxKind_FileChksms, CV_C13SubSectionIdxKind_FrameData, CV_C13SubSectionIdxKind_InlineeLines, @@ -2065,279 +2053,109 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) CV_C13SubSectionIdxKind_XfgHashType, CV_C13SubSectionIdxKind_XfgHashVirtual, }; + for EachElement(i, mod_c13_layout) { + String8List data = cv_sub_section_from_debug_s(debug_s, mod_c13_layout[i]); + if (data.total_size == 0) { continue; } + U64 ss_size = 0; + ss_size += str8_buffer_write(buf, buf_pos, str8_struct((&(CV_C13SubSectionHeader ){ .kind = mod_c13_layout[i], .size = safe_cast_u32(data.total_size) }))); + ss_size += str8_buffer_write_string_list(buf, buf_pos, data); + ss_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(mod_cursor, CV_C13SubSectionAlign)); + mod_cursor += ss_size; + mod->c13_data_size += ss_size; + } + // write line tables + String8List lines = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); + for EachNode(n, String8Node, lines.first) { + if (n->string.size == 0) { continue; } + U64 ss_size = 0; + ss_size += str8_buffer_write(buf, buf_pos, str8_struct((&(CV_C13SubSectionHeader){ .kind = CV_C13SubSectionKind_Lines, .size = safe_cast_u32(n->string.size) }))); + ss_size += str8_buffer_write(buf, buf_pos, n->string); + ss_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(mod_cursor, CV_C13SubSectionAlign)); + mod_cursor += ss_size; + mod->c13_data_size += ss_size; + } + + // write global refs + String8List globrefs = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_GlobalRefs); + U64 globrefs_size = 0; + globrefs_size += str8_buffer_write_u32(buf, buf_pos, safe_cast_u32(globrefs.total_size)); + globrefs_size += str8_buffer_write_string_list(buf, buf_pos, globrefs); + mod_cursor += globrefs_size; + mod->globrefs_size += globrefs_size; + + return mod_cursor; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) +{ + Temp scratch = scratch_begin(&arena, 1); + + LNK_BuildPdb *task = raw_task; + U32Array obj_indices = task->obj_indices[task_id]; + + // compute sizes for module streams for EachIndex(i, obj_indices.count) { - U64 obj_idx = obj_indices.v[i]; - PDB_DbiModule *mod = task->mod_arr[obj_idx]; - CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; - String8List raw_symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); - U64 symbol_base = sizeof(CV_Signature); - mod->sym_data_size = cv_patch_symbol_tree_offsets_new(raw_symbols, symbol_base, PDB_SYMBOL_ALIGN); - - U64 mod_c13_sizes[ArrayCount(mod_c13_layout)] = {0}; - for EachElement(layout_idx, mod_c13_layout) { - CV_C13SubSectionIdxKind layout_kind = mod_c13_layout[layout_idx]; - - if (debug_s.data_list[layout_kind].total_size) { - mod->c13_data_size += sizeof(U32); // kind - mod->c13_data_size += sizeof(U32); // size - mod->c13_data_size += debug_s.data_list[layout_kind].total_size; - mod->c13_data_size = AlignPow2(mod->c13_data_size, CV_C13SubSectionAlign); - } - } - - String8List *line_data = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Lines); - for EachNode(n, String8Node, line_data->first) { - if (n->string.size == 0) { continue; } - - mod->c13_data_size += sizeof(U32); // kind - mod->c13_data_size += sizeof(U32); // size - mod->c13_data_size += n->string.size; - mod->c13_data_size = AlignPow2(mod->c13_data_size, CV_C13SubSectionAlign); - } - - mod->globrefs_size += debug_s.data_list[CV_C13SubSectionKind_GlobalRefs].total_size; + U64 obj_idx = obj_indices.v[i]; + lnk_write_debug_s_to_pdb_module(task->mod_arr[obj_idx], task->cv->debug_s_arr[obj_idx], 0, 0); } barrier_wait(tp->barrier); + // alloc module streams if (task_id == 0) { for EachIndex(obj_idx, task->cv->obj_count) { PDB_DbiModule *mod = task->mod_arr[obj_idx]; U64 mod_size = mod->sym_data_size + mod->c11_data_size + mod->c13_data_size + mod->globrefs_size; if (mod_size > 0) { - task->mod_arr[obj_idx]->sn = msf_stream_alloc_ex(msf, mod_size); + task->mod_arr[obj_idx]->sn = msf_stream_alloc_ex(task->pdb->msf, mod_size); } } } barrier_wait(tp->barrier); - Temp scratch = scratch_begin(&arena, 1); - U64 temp_max = max_U16; - U64 temp_size = 0; - U8 *temp = push_array(scratch.arena, U8, temp_max); - + // write .debug$S to modules for EachIndex(i, obj_indices.count) { - U64 obj_idx = obj_indices.v[obj_idx]; + Temp temp = temp_begin(scratch.arena); + + U64 obj_idx = obj_indices.v[i]; PDB_DbiModule *mod = task->mod_arr[obj_idx]; CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; - U64 mod_cap = msf_stream_get_size(msf, mod->sn); - // write symbols - { - // skip empty modules - if (mod->sn == MSF_INVALID_STREAM_NUMBER) { continue; } + String8List mod_pages = msf_raw_pages_from_sn(temp.arena, task->pdb->msf, mod->sn); + if (mod_pages.node_count == 0) { continue; } - msf_stream_write_u32(msf, mod->sn, CV_Signature_C13); + String8Node buf = *mod_pages.first; + U64 pos = 0; + lnk_write_debug_s_to_pdb_module(mod, debug_s, &buf, &pos); - String8List raw_symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); - for EachNode(n, String8Node, raw_symbols.first) { - for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { - // read symbol - CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + // patch symbol offsets + //cv_patch_symbol_tree_offsets_new(dummy, sizeof(CV_Signature), PDB_SYMBOL_ALIGN); - if (symbol.kind == CV_SymKind_SKIP) { continue; } - - U64 symbol_size = cv_size_from_symbol(&symbol, PDB_SYMBOL_ALIGN); - - // flush temp to MSF - if (temp_size + symbol_size > temp_max) { - Assert(temp_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write(msf, mod->sn, temp, temp_size); - temp_size = 0; - } - - // acc serialized symbols in temp - U64 serial_size = cv_write_symbol(temp, temp_size, temp_max, &symbol, PDB_SYMBOL_ALIGN); - Assert(serial_size == symbol_size); - temp_size += serial_size; - } - } - - // flush remaining temp - Assert(temp_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write(msf, mod->sn, temp, temp_size); - msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); - - // assert our symbol size estimate was correct - Assert(mod->sym_data_size == msf_stream_get_pos(msf, mod->sn)); - } - - // write rest of c13 data - { - U64 c13_start_pos = msf_stream_get_pos(msf, mod->sn); - - for EachElement(i, mod_c13_layout) { - String8List *data = cv_sub_section_ptr_from_debug_s(&debug_s, mod_c13_layout[i]); - if (data->total_size == 0) { continue; } - - Assert(AlignPow2(sizeof(U32)*2 + data->total_size, PDB_SYMBOL_ALIGN) <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write_u32 (msf, mod->sn, mod_c13_layout[i]); - msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(data->total_size)); - msf_stream_write_list(msf, mod->sn, *data); - msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); - } - - String8List *line_data = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Lines); - for EachNode(line_n, String8Node, line_data->first) { - if (line_n->string.size == 0) { continue; } - - Assert(AlignPow2(sizeof(U32)*2 + line_n->string.size, PDB_SYMBOL_ALIGN) <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write_u32 (msf, mod->sn, CV_C13SubSectionKind_Lines); - msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(line_n->string.size)); - msf_stream_write_string(msf, mod->sn, line_n->string); - msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); - } - - U64 c13_end_pos = msf_stream_get_pos(msf, mod->sn); - Assert(mod->c13_data_size == cv_size_from_debug_s(&debug_s, CV_C13SubSectionAlign)); - - // write global refs - String8List global_refs = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_GlobalRefs); - Assert(global_refs.total_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write_list(msf, mod->sn, global_refs); - } - - // make stream has enough memory so it doens't trigger memory allocations in MSF - // during multi-thread write - U64 mod_size = mod->sym_data_size + mod->c11_data_size + mod->c13_data_size + mod->globrefs_size; - AssertAlways(mod_size == msf_stream_get_pos(msf, mod->sn)); + temp_end(temp); } barrier_wait(tp->barrier); +#if 0 + // parse checksum data + String8List checksum_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); + CV_ChecksumList checksum_list = cv_c13_parse_checksum_data_list(scratch.arena, checksum_data); + + // get strings sub-section + String8 string_data = cv_string_table_from_debug_s(debug_s); + + // collect source file names from checksum headers + String8List source_file_names_list = cv_c13_collect_source_file_names(arena, checksum_list, string_data); + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + str8_list_concat_in_place(&mod->source_file_list, &source_file_names_list); + + // relocate checksum data + cv_c13_patch_string_offsets_in_checksum_list(checksum_list, string_data, task->pdb->info->strtab.size, task->string_ht); +#endif + scratch_end(scratch); } -#if 0 -internal -THREAD_POOL_TASK_FUNC(lnk_write_pdb_module_stream) -{ - LNK_BuildPdb *task = raw_task; - - U64 obj_idx = task_id; - CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; - MSF_Context *msf = task->pdb->msf; - - if (task_id == 0) { - for EachIndex(i, task->cv->obj_count) { - task->mod_arr[i]->sn = msf_stream_alloc_ex(msf, task->module_data[i].total_size); - } - } - barrier_wait(tp->barrier); - - MSF_UInt mod_cap = msf_stream_get_cap(task->pdb->msf, mod->sn); - Assert(task->module_data[obj_idx].total_size == mod_cap); - - // write symbols - String8List raw_symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); - if (raw_symbols.total_size) { - Temp scratch = scratch_begin(&arena, 1); - - msf_stream_write_u32(msf, mod->sn, CV_Signature_C13); - - U64 temp_max = max_U16; - U64 temp_size = 0; - U8 *temp = push_array(scratch.arena, U8, temp_max); - for EachNode(n, String8Node, raw_symbols.first) { - for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { - // read symbol - CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); - - if (symbol.kind == CV_SymKind_SKIP) { continue; } - - U64 symbol_size = cv_size_from_symbol(&symbol, PDB_SYMBOL_ALIGN); - - // flush temp to MSF - if (temp_size + symbol_size > temp_max) { - Assert(temp_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write(msf, mod->sn, temp, temp_size); - temp_size = 0; - } - - // acc serialized symbols in temp - U64 serial_size = cv_write_symbol(temp, temp_size, temp_max, &symbol, PDB_SYMBOL_ALIGN); - Assert(serial_size == symbol_size); - temp_size += serial_size; - } - } - - // flush remaining temp - Assert(temp_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write(msf, mod->sn, temp, temp_size); - msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); - - U64 size = msf_stream_get_pos(msf, mod->sn); - // assert our symbol size estimate was correct - Assert(raw_symbols.total_size == msf_stream_get_pos(msf, mod->sn)); - - scratch_end(scratch); - } - - // write rest of c13 data - U64 c13_data_size; - { - U64 c13_start_pos = msf_stream_get_pos(msf, mod->sn); - - CV_C13SubSectionIdxKind c13_data_layout[] = { - CV_C13SubSectionIdxKind_StringTable, - CV_C13SubSectionIdxKind_FileChksms, - CV_C13SubSectionIdxKind_FrameData, - CV_C13SubSectionIdxKind_InlineeLines, - CV_C13SubSectionIdxKind_CrossScopeImports, - CV_C13SubSectionIdxKind_CrossScopeExports, - CV_C13SubSectionIdxKind_IlLines, - CV_C13SubSectionIdxKind_FuncMDTokenMap, - CV_C13SubSectionIdxKind_TypeMDTokenMap, - CV_C13SubSectionIdxKind_MergedAssemblyInput, - CV_C13SubSectionIdxKind_CoffSymbolRVA, - CV_C13SubSectionIdxKind_XfgHashType, - CV_C13SubSectionIdxKind_XfgHashVirtual, - }; - for EachElement(i, c13_data_layout) { - CV_C13SubSectionIdxKind kind = c13_data_layout[i]; - String8List *data = cv_sub_section_ptr_from_debug_s(&debug_s, kind); - if (data->total_size == 0) { continue; } - - Assert(AlignPow2(sizeof(U32)*2 + data->total_size, PDB_SYMBOL_ALIGN) <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write_u32 (msf, mod->sn, kind); - msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(data->total_size)); - msf_stream_write_list(msf, mod->sn, *data); - msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); - } - - String8List *line_data = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Lines); - for EachNode(line_n, String8Node, line_data->first) { - if (line_n->string.size == 0) { continue; } - - Assert(AlignPow2(sizeof(U32)*2 + line_n->string.size, PDB_SYMBOL_ALIGN) <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write_u32 (msf, mod->sn, CV_C13SubSectionKind_Lines); - msf_stream_write_u32 (msf, mod->sn, safe_cast_u32(line_n->string.size)); - msf_stream_write_string(msf, mod->sn, line_n->string); - msf_stream_align(msf, mod->sn, CV_C13SubSectionAlign); - } - - U64 c13_end_pos = msf_stream_get_pos(msf, mod->sn); - c13_data_size = c13_end_pos - c13_start_pos; - Assert(c13_data_size == cv_size_from_debug_s(&debug_s, CV_C13SubSectionAlign)); - - // write global refs - String8List global_refs = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_GlobalRefs); - Assert(global_refs.total_size <= (mod_cap - msf_stream_get_pos(msf, mod->sn))); - msf_stream_write_list(msf, mod->sn, global_refs); - } - - // update module data sizes - mod->sym_data_size = safe_cast_u32(raw_symbols.total_size); - mod->c11_data_size = 0; - mod->c13_data_size = safe_cast_u32(c13_data_size); - - // make stream has enough memory so it doens't trigger memory allocations in MSF - // during multi-thread write - AssertAlways(mod_size == msf_stream_get_pos(msf, mod->sn)); -} -#endif - internal THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) { @@ -2419,98 +2237,67 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config Temp scratch = scratch_begin(tp_arena->v, tp_arena->count); Temp huge_arena_temp = temp_begin(lnk_get_huge_arena()); - U64 obj_count = cv->obj_count; - LNK_BuildPdb task = { - .image_data = image_data, - .symtab = symtab, - .cv = cv, - .pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), - .fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_U16, max_U16), + .image_data = image_data, + .symtab = symtab, + .cv = cv, + .pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), + .fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_U16, max_U16), + .mod_arr = push_array(scratch.arena, PDB_DbiModule *, cv->obj_count), + .pe = pe_bin_info_from_data(scratch.arena, image_data), + .image_section_table = coff_section_table_from_data(scratch.arena, image_data, task.pe.section_table_range), + .image_section_table_count = task.pe.section_count+1, + .image_section_virt_ranges.count = task.image_section_table_count, + .image_section_virt_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count), + .image_section_file_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count), }; - // set min type indices for EachElement(ti_source, cv_types.min_type_indices) { task.pdb->type_servers[ti_source]->ti_lo = cv_types.min_type_indices[ti_source]; } - ProfBegin("Reserve Modules"); - task.mod_arr = push_array(tp_arena->v[0], PDB_DbiModule *, obj_count); - for EachIndex(obj_idx, obj_count) { - LNK_Obj *obj = cv->obj_arr[obj_idx]; - String8 lib_path = lnk_obj_get_lib_path(obj); - task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, obj->path, lib_path); - } - ProfEnd(); - - task.c13_symbol_sizes = push_array(scratch.arena, U64, obj_count); - ProfScope("Make GSI/PSI") { - ProfScope("Process & Populate GSI/PSI") tp_for_parallel(tp, 0, tp->worker_count, lnk_build_gsi_psi, &task); - - ProfBegin("Build and write GSI/PSI"); - PDB_Context *pdb = task.pdb; - Assert(pdb->dbi->globals_sn == MSF_INVALID_STREAM_NUMBER && - pdb->dbi->publics_sn == MSF_INVALID_STREAM_NUMBER && - pdb->dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER); - pdb->dbi->globals_sn = msf_stream_alloc(pdb->msf); - pdb->dbi->publics_sn = msf_stream_alloc(pdb->msf); - pdb->dbi->symbols_sn = msf_stream_alloc(pdb->msf); - psi_build(tp, pdb->psi, pdb->msf, pdb->dbi->publics_sn, pdb->dbi->symbols_sn); - gsi_build(tp, pdb->gsi, pdb->msf, pdb->dbi->globals_sn, pdb->dbi->symbols_sn); - ProfEnd(); - - // TODO: actually collect offsets and pass them here - ProfBegin("Build Empty Global Reference Array"); - for EachIndex(obj_idx, obj_count) { - CV_DebugS *debug_s = &cv->debug_s_arr[obj_idx]; - String8List *srl = &debug_s->data_list[CV_C13SubSectionKind_GlobalRefs]; - str8_serial_begin(tp_arena->v[0], srl); - Assert(srl->total_size == 0); - str8_serial_push_u32(scratch.arena, srl, srl->total_size); + U64 objs_per_worker = CeilIntegerDiv(cv->obj_count, tp->worker_count); + task.obj_indices = push_array(scratch.arena, U32Array, tp->worker_count); + for EachIndex(i, tp->worker_count) { task.obj_indices[i].v = push_array(scratch.arena, U32, objs_per_worker); } + for EachIndex(obj_idx, cv->obj_count) { + U32Array *obj_indices = &task.obj_indices[obj_idx % tp->worker_count]; + obj_indices->v[obj_indices->count++] = obj_idx; } - ProfEnd(); } - ProfScope("Write Modules") tp_for_parallel(tp, 0, obj_count, lnk_write_pdb_modules, &task); + // move patched type data + // + // leaf data is stored in g_file_arena which has linker's life-time + // and this way we skip redundant leaf copy to the type server to make things faster + pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_IPI], cv_types.count[CV_TypeIndexSource_IPI], cv_types.v[CV_TypeIndexSource_IPI]); + pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_TPI], cv_types.count[CV_TypeIndexSource_TPI], cv_types.v[CV_TypeIndexSource_TPI]); - ProfBegin("Build String Table"); - task.string_ht = cv_dedup_string_tables(tp_arena, tp, obj_count, cv->debug_s_arr); + ProfBegin("Merge String Tables"); + task.string_ht = cv_dedup_string_tables(tp_arena, tp, cv->obj_count, cv->debug_s_arr); cv_string_hash_table_assign_buffer_offsets(tp, task.string_ht); pdb_strtab_add_cv_string_hash_table(&task.pdb->info->strtab, task.string_ht); ProfEnd(); - ProfBegin("Build Source Files List"); + ProfScope ("Alloc Modules") for EachIndex(obj_idx, cv->obj_count) { task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, cv->obj_arr[obj_idx]->path, lnk_obj_get_lib_path(cv->obj_arr[obj_idx])); } + ProfScope("Move Global Symbols") tp_for_parallel(tp, 0, tp->worker_count, lnk_move_global_symbols_to_gsi, &task); { - // push source files per module info - task.source_file_names_list_arr = push_array_no_zero(tp_arena->v[0], String8List, obj_count); - tp_for_parallel(tp, tp_arena, obj_count, lnk_process_c13_data_task, &task); - - for EachIndex(obj_idx, obj_count) { - String8List source_file_list = str8_list_copy(task.pdb->dbi->arena, &task.source_file_names_list_arr[obj_idx]); - str8_list_concat_in_place(&task.mod_arr[obj_idx]->source_file_list, &source_file_list); - } - - // zero out string table sub section - for EachIndex(obj_idx, obj_count) { - MemoryZeroStruct(&cv->debug_s_arr[obj_idx].data_list[CV_C13SubSectionIdxKind_StringTable]); - } + PDB_Context *pdb = task.pdb; + PDB_DbiContext *dbi = pdb->dbi; + dbi->globals_sn = msf_stream_alloc(pdb->msf); + dbi->publics_sn = msf_stream_alloc(pdb->msf); + dbi->symbols_sn = msf_stream_alloc(pdb->msf); + psi_build(tp, pdb->psi, pdb->msf, dbi->publics_sn, dbi->symbols_sn); + gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); } - ProfEnd(); + ProfScope("Write Modules") tp_for_parallel(tp, 0, tp->worker_count, lnk_write_pdb_modules, &task); ProfBegin("Build Section Contrib Map"); { - task.pe = pe_bin_info_from_data(scratch.arena, image_data); - task.image_section_table = coff_section_table_from_data(scratch.arena, image_data, task.pe.section_table_range); - task.image_section_table_count = task.pe.section_count+1; - ProfBegin("Build DBI Section Headers"); for (U64 sect_idx = 1; sect_idx < task.image_section_table_count; sect_idx += 1) { dbi_push_section(task.pdb->dbi, task.image_section_table[sect_idx]); } ProfEnd(); - task.image_section_virt_ranges.count = task.image_section_table_count; - task.image_section_virt_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count); - task.image_section_file_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count); for EachIndex(i, task.image_section_table_count) { COFF_SectionHeader *sect_header = task.image_section_table[i]; if (~sect_header->flags & COFF_SectionFlag_CntUninitializedData) { @@ -2519,10 +2306,9 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config task.image_section_virt_ranges.v[i] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize); } - task.sc_list = push_array(scratch.arena, PDB_DbiSectionContribList, obj_count); - tp_for_parallel(tp, tp_arena, obj_count, lnk_push_dbi_sec_contrib_task, &task); - - dbi_sec_list_concat_arr(&task.pdb->dbi->sec_contrib_list, obj_count, task.sc_list); + task.sc_list = push_array(scratch.arena, PDB_DbiSectionContribList, cv->obj_count); + tp_for_parallel(tp, tp_arena, cv->obj_count, lnk_push_dbi_sec_contrib_task, &task); + dbi_sec_list_concat_arr(&task.pdb->dbi->sec_contrib_list, cv->obj_count, task.sc_list); } ProfEnd(); @@ -2531,7 +2317,7 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config String8Array natvis_file_path_arr = str8_array_from_list(scratch.arena, &config->natvis_list); String8Array natvis_file_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, config->io_flags, natvis_file_path_arr); - for (U64 i = 0; i < natvis_file_data_arr.count; ++i) { + for EachIndex(i, natvis_file_data_arr.count) { String8 natvis_file_path = natvis_file_path_arr.v[i]; String8 natvis_file_data = natvis_file_data_arr.v[i]; @@ -2556,13 +2342,6 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config } ProfEnd(); - // move patched type data - // - // leaf data is stored in g_file_arena which has linker's life-time - // and this way we skip redundant leaf copy to the type server to make things faster - pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_IPI], cv_types.count[CV_TypeIndexSource_IPI], cv_types.v[CV_TypeIndexSource_IPI]); - pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_TPI], cv_types.count[CV_TypeIndexSource_TPI], cv_types.v[CV_TypeIndexSource_TPI]); - pdb_build(tp, tp_arena, task.pdb, task.string_ht, 0); MSF_Error msf_err = msf_build(task.pdb->msf); diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 5d32a1e7..31b42819 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -139,7 +139,7 @@ typedef struct Arena **fixed_arenas; - U32Array *balanced_obj_indices_arr; // [obj_count] + U32Array *obj_indices; // [obj_count] // GSI symbol dedup U64 global_symbol_count; @@ -152,10 +152,11 @@ typedef struct void **symbol_arr; U32 *symbol_hashes; // [symbol_count] - U64 *proc_ref_counts; // [worker_count] - U64 *proc_ref_sizes; // [worker_count] - U64 *proc_ref_hashes; // [total_proc_ref_count] - U64 *proc_ref_offs; // [worker_count] + U64 *proc_ref_counts; // [worker_count] + U64 *proc_ref_sizes; // [worker_count] + U64 *proc_ref_hashes; // [total_proc_ref_count] + U64 *proc_ref_offs; // [worker_count] + U64 *proc_ref_indices; // [worker_count] String8 proc_refs; U64 proc_ref_count; CV_SymbolNode *proc_ref_nodes; // [proc_ref_count] @@ -174,14 +175,6 @@ typedef struct String8List *source_file_names_list_arr; CV_StringHashTable string_ht; - // build DBI modules - String8List *module_data; // obj_count] - - U64 **module_sizes; // [obj_count][CV_C13SubSectionIdxKind_COUNT] - String8List *globrefs_arr; // [obj_count] - U32 *mod_sizes; // [obj_count] - U64 *c13_symbol_sizes; // [obj_count] - // push DBI SC Map PE_BinInfo pe; COFF_SectionHeader **image_section_table; diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index bf5f9441..6d82d45d 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -1211,6 +1211,32 @@ msf_stream_write_string_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNum return msf_stream_write_parallel(tp, msf, sn, string.str, string.size); } +internal String8List +msf_raw_pages_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) +{ + String8List result = {0}; + + MSF_Stream *stream = msf_find_stream(msf, sn); + String8 acc = {0}; + for EachNode(n, MSF_PageNode, stream->page_list.first) { + String8 p = msf_data_from_pn(msf->page_data_list, msf->page_size, n->pn); + if (acc.str + acc.size == p.str) { + acc.size += p.size; + } else { + str8_list_push(arena, &result, acc); + acc = p; + } + } + + if (result.node_count && result.last->string.str + result.last->string.size == acc.str) { + result.last->string.size += acc.size; + } else { + str8_list_push(arena, &result, acc); + } + + return result; +} + //////////////////////////////// internal MSF_UInt @@ -1878,6 +1904,8 @@ msf_build(MSF_Context *msf) internal String8List msf_get_page_data_nodes(Arena *arena, MSF_Context *msf) { + ProfBeginFunction(); + String8List list; MemoryZeroStruct(&list); U64 total_size = msf_get_save_size(msf); @@ -1892,6 +1920,8 @@ msf_get_page_data_nodes(Arena *arena, MSF_Context *msf) String8 data = str8(data_node->data, to_copy); str8_list_push(arena, &list, data); } + + ProfEnd(); return list; } diff --git a/src/linker/pdb_ext/msf_builder.h b/src/linker/pdb_ext/msf_builder.h index e39ef838..ebbdc1f1 100644 --- a/src/linker/pdb_ext/msf_builder.h +++ b/src/linker/pdb_ext/msf_builder.h @@ -188,6 +188,8 @@ internal B32 msf_stream_write_parallel(TP_Context *tp, MSF_Context *msf, MSF_Str #define msf_stream_write_array(m, s, v, c) msf_stream_write(m, s, (void*)(v), sizeof(*(v)) * (c)) #define msf_stream_write_struct(m, s, v ) msf_stream_write_array(m, s, v, 1) +internal String8List msf_raw_pages_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn); + internal MSF_UInt msf_count_pages(MSF_UInt page_size, U64 data_size); internal MSF_PageNumber msf_get_page_count_cap(MSF_PageDataList page_data_list, MSF_UInt page_size); internal MSF_UInt msf_get_fpm_interval_correct(MSF_UInt page_size); From acce76aa4c87017f3b668a07011ff55fbca411f3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 27 Mar 2026 11:13:10 -0700 Subject: [PATCH 313/850] string list sub range helper --- src/base/base_strings.c | 36 +++++++++++++++++++ src/base/base_strings.h | 1 + src/torture/torture.h | 30 ++++++++-------- src/torture/torture_base.c | 73 ++++++++++++++++++++++++++++++++++++++ src/torture/torture_main.c | 1 + 5 files changed, 126 insertions(+), 15 deletions(-) create mode 100644 src/torture/torture_base.c diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 9d489476..57c908fd 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1143,6 +1143,42 @@ str8_list_copy(Arena *arena, String8List *list) return result; } +internal String8List +str8_list_substr(Arena *arena, String8List list, Rng1U64 range) +{ + String8List result = {0}; + + String8Node *n = list.first; + + U64 front_min = 0; + { + U64 cursor = 0; + for (; n != 0; cursor += n->string.size, n = n->next) { + if (cursor + n->string.size > range.min) { + front_min = range.min - cursor; + break; + } + } + } + + if (front_min > 0) { + U64 front_max = front_min + Min(dim_1u64(range), n->string.size); + str8_list_push(arena, &result, str8_substr(n->string, r1u64(front_max, front_max))); + n = n->next; + } + + for (; n != 0; n = n->next) { + if (result.total_size >= dim_1u64(range)) { + break; + } + U64 copy_max = dim_1u64(range) - result.total_size; + U64 copy_size = Min(copy_max, n->string.size); + str8_list_push(arena, &result, str8_substr(n->string, r1u64(0, copy_size))); + } + + return result; +} + //////////////////////////////// //~ rjf: String Splitting & Joining diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 635bc9ee..e86c4dee 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -269,6 +269,7 @@ internal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt internal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...); internal String8Node* str8_list_pop_front(String8List *list); internal String8List str8_list_copy(Arena *arena, String8List *list); +internal String8List str8_list_substr(Arena *arena, String8List list, Rng1U64 range); #define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero()) //////////////////////////////// diff --git a/src/torture/torture.h b/src/torture/torture.h index a2e90725..7a1638f6 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -39,10 +39,10 @@ typedef struct extern U64 g_torture_test_count; extern T_Test g_torture_tests[0xffffff]; -#define T_AddTest(name, l, ...) \ -T_RunResult t_##name(void); \ -__VA_ARGS__ void t_add_test_##name(void) \ -{ \ +#define T_AddTest(name, l, ...) \ +T_RunResult t_##name(void); \ +__VA_ARGS__ void t_add_test_##name(void) \ +{ \ g_torture_tests[g_torture_test_count].group = T_Group; \ g_torture_tests[g_torture_test_count].label = Stringify(name); \ g_torture_tests[g_torture_test_count].r = &t_##name; \ @@ -52,7 +52,7 @@ g_torture_test_count += 1; \ #if COMPILER_MSVC #pragma section(".CRT$XCU", read) -# define T_BeginTest_(name) \ +# define T_BeginTest_(name) \ T_AddTest(name, __LINE__) \ __declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ __pragma(comment(linker, "/include:" Stringify(r_##name))) @@ -61,20 +61,20 @@ __pragma(comment(linker, "/include:" Stringify(r_##name))) T_AddTest(name, __LINE__, __attribute__((constructor))) #endif -#define T_BeginTest(name) \ -T_BeginTest_(name) \ -T_RunResult t_##name(void) { \ +#define T_BeginTest(name) \ +T_BeginTest_(name) \ +T_RunResult t_##name(void) { \ Temp scratch = scratch_begin(0,0); \ -T_RunResult result = { .status = T_RunStatus_Fail }; +T_RunResult result_ = { .status = T_RunStatus_Fail }; -#define T_EndTest \ -result.status = T_RunStatus_Pass; \ -exit__:; \ -scratch_end(scratch); \ -return result; \ +#define T_EndTest \ +result_.status = T_RunStatus_Pass; \ +exit__:; \ +scratch_end(scratch); \ +return result_; \ } -#define T_Ok(c) do { if (!(c)) { result.fail_file = __FILE__; result.fail_line = __LINE__; result.fail_cond = Stringify(c); goto exit__; } } while(0) +#define T_Ok(c) do { if (!(c)) { result_.fail_file = __FILE__; result_.fail_line = __LINE__; result_.fail_cond = Stringify(c); goto exit__; } } while(0) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) //////////////////////////////// diff --git a/src/torture/torture_base.c b/src/torture/torture_base.c new file mode 100644 index 00000000..724820ed --- /dev/null +++ b/src/torture/torture_base.c @@ -0,0 +1,73 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#define T_Group "Base" + +T_BeginTest(str8_list_substr) +{ + String8List zero_list = {0}; + + { + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "a"); + str8_list_pushf(scratch.arena, &list, "b"); + str8_list_pushf(scratch.arena, &list, "c"); + String8List sub = str8_list_substr(scratch.arena, list, r1u64(0, 3)); + String8 result = str8_list_join(scratch.arena, &list, 0); + T_Ok(str8_match(result, str8_lit("abc"), 0)); + } + + { + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "a"); + str8_list_pushf(scratch.arena, &list, "b"); + str8_list_pushf(scratch.arena, &list, "c"); + String8List sub = str8_list_substr(scratch.arena, list, r1u64(0, max_U64)); + String8 result = str8_list_join(scratch.arena, &list, 0); + T_Ok(str8_match(result, str8_lit("abc"), 0)); + } + + { + + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "a"); + str8_list_pushf(scratch.arena, &list, "bcd"); + String8List sub = str8_list_substr(scratch.arena, list, r1u64(2, 3)); + String8 result = str8_list_join(scratch.arena, &sub, 0); + T_Ok(str8_match(result, str8_lit("c"), 0)); + } + + { + + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "a"); + str8_list_pushf(scratch.arena, &list, "bcd"); + String8List sub = str8_list_substr(scratch.arena, list, r1u64(1, 2)); + String8 result = str8_list_join(scratch.arena, &sub, 0); + T_Ok(str8_match(result, str8_lit("b"), 0)); + } + + { + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "ab"); + str8_list_pushf(scratch.arena, &list, "cd"); + str8_list_pushf(scratch.arena, &list, "ef"); + String8List sub = str8_list_substr(scratch.arena, list, r1u64(1, 5)); + String8 result = str8_list_join(scratch.arena, &sub, 0); + T_Ok(str8_match(result, str8_lit("bcde"), 0)); + } + + { + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "abc"); + + String8List zero = str8_list_substr(scratch.arena, list, r1u64(0, 0)); + T_Ok(MemoryMatchStruct(&zero, &zero_list)); + + String8List out_of_bounds_range = str8_list_substr(scratch.arena, list, r1u64(max_U64/2, max_U64)); + T_Ok(MemoryMatchStruct(&out_of_bounds_range, &zero_list)); + } +} +T_EndTest; + +#undef T_Group diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index fec9f504..3fab8992 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -72,6 +72,7 @@ #include "linker/thread_pool/thread_pool.c" #include "linker/codeview_ext/codeview.c" #include "torture.c" +#include "torture_base.c" #include "torture_radlink.c" #include "torture_dwarf.c" #include "torture_d2r.c" From 46243548f31d34e3245a95fc35dc9e811a16a404 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 27 Mar 2026 11:14:11 -0700 Subject: [PATCH 314/850] fixup symbol tree offsets in module stream --- src/linker/lnk_debug_info.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 433686c2..ae9505a5 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -2129,29 +2129,30 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) U64 pos = 0; lnk_write_debug_s_to_pdb_module(mod, debug_s, &buf, &pos); - // patch symbol offsets - //cv_patch_symbol_tree_offsets_new(dummy, sizeof(CV_Signature), PDB_SYMBOL_ALIGN); + // sub range symbol data pages and patch symbol tree offsets + String8List mod_symbols = str8_list_substr(temp.arena, mod_pages, r1u64(sizeof(CV_Signature), sizeof(CV_Signature) + mod->sym_data_size)); + cv_patch_symbol_tree_offsets_new(mod_symbols, sizeof(CV_Signature), PDB_SYMBOL_ALIGN); temp_end(temp); } barrier_wait(tp->barrier); -#if 0 - // parse checksum data - String8List checksum_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); - CV_ChecksumList checksum_list = cv_c13_parse_checksum_data_list(scratch.arena, checksum_data); + for EachIndex(i, obj_indices.count) { + U64 obj_idx = obj_indices.v[i]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8 string_table = cv_string_table_from_debug_s(debug_s); + String8List file_chksms_raw = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); + CV_ChecksumList file_chksms = cv_c13_parse_checksum_data_list(scratch.arena, file_chksms_raw); + String8List src_file_names = cv_c13_collect_source_file_names(arena, file_chksms, string_table); - // get strings sub-section - String8 string_data = cv_string_table_from_debug_s(debug_s); + // collect source files module refs + str8_list_concat_in_place(&task->mod_arr[obj_idx]->source_file_list, &src_file_names); - // collect source file names from checksum headers - String8List source_file_names_list = cv_c13_collect_source_file_names(arena, checksum_list, string_data); - PDB_DbiModule *mod = task->mod_arr[obj_idx]; - str8_list_concat_in_place(&mod->source_file_list, &source_file_names_list); - - // relocate checksum data - cv_c13_patch_string_offsets_in_checksum_list(checksum_list, string_data, task->pdb->info->strtab.size, task->string_ht); -#endif + // patch path offsets in file checksum headers (in obj the offsets point to a string table in .debug$S, + // and because linker merges string tables the old offsets need to be fixed up) + cv_c13_patch_string_offsets_in_checksum_list(file_chksms, string_table, task->pdb->info->strtab.size, task->string_ht); + } + barrier_wait(tp->barrier); scratch_end(scratch); } From e89041fd5934a540cc81b671251f6fef9f54ab63 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 17:51:03 -0700 Subject: [PATCH 315/850] helper for reading/writing discontinuous memory --- src/base/base_strings.c | 68 +++++++++++++++++++++++++++++++++++++---- src/base/base_strings.h | 3 ++ 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 57c908fd..274eceb9 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1163,7 +1163,7 @@ str8_list_substr(Arena *arena, String8List list, Rng1U64 range) if (front_min > 0) { U64 front_max = front_min + Min(dim_1u64(range), n->string.size); - str8_list_push(arena, &result, str8_substr(n->string, r1u64(front_max, front_max))); + str8_list_push(arena, &result, str8_substr(n->string, r1u64(front_min, front_max))); n = n->next; } @@ -2943,6 +2943,60 @@ str8_is_before_case_sensitive(const void *a, const void *b) //////////////////////////////// // string buffer +internal B32 +str8_buffer_skip(String8Node *buf, U64 *pos, U64 skip) +{ + S64 to_skip; + for (to_skip = skip; to_skip > 0;) { + if (buf == 0) { break; } + + U64 left = Min(to_skip, buf->string.size - *pos); + *pos += left; + + if (*pos == buf->string.size) { + if (buf->next) { *buf = *buf->next; } + else { *buf = (String8Node){0}; buf = 0; } + *pos = 0; + } + + to_skip -= (S64)left; + } + Assert(to_skip == 0); + return (to_skip == 0); +} + +internal U64 +str8_buffer_read(String8Node *buf, U64 *pos, U64 read_size, void *out) +{ + U64 cursor = 0; + for (; cursor < read_size ;) { + if (buf == 0) { break; } + + U64 copy_size = Min(read_size - cursor, (buf->string.size - *pos)); + void *dst = (U8 *)out + cursor; + void *src = buf->string.str + *pos; + MemoryCopy(dst, src, copy_size); + + *pos += copy_size; + cursor += copy_size; + + if (*pos >= buf->string.size) { + if (buf->next) { *buf = *buf->next; } + else { *buf = (String8Node){0}; buf = 0; } + *pos = 0; + } + } + return cursor; +} + +internal U64 +str8_buffer_peek(String8Node *buf, U64 *pos, U64 read_size, void *out) +{ + String8Node buf_copy = *buf; + U64 pos_copy = *pos; + return str8_buffer_read(&buf_copy, &pos_copy, read_size, out); +} + internal U64 str8_buffer_write(String8Node *buf, U64 *pos, String8 data) { @@ -2954,22 +3008,24 @@ str8_buffer_write(String8Node *buf, U64 *pos, String8 data) U64 available_size = buf->string.size - *pos; U64 to_copy = Min(available_size, data_size); if (data.str == 0) { - MemorySet(buf->string.str, 0, to_copy); + MemorySet(buf->string.str + *pos, 0, to_copy); } else { U8 *data_ptr = data.str + copy_size; - MemoryCopy(buf->string.str, data_ptr, to_copy); + MemoryCopy(buf->string.str + *pos, data_ptr, to_copy); } - *pos += to_copy; + *pos += to_copy; + copy_size += to_copy; if (*pos >= buf->string.size) { if (buf->next) { *buf = *buf->next; *pos = 0; + } else { + break; } } - - copy_size += to_copy; } + Assert(copy_size == data.size); } else { copy_size = data.size; } diff --git a/src/base/base_strings.h b/src/base/base_strings.h index e86c4dee..95755092 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -449,6 +449,9 @@ internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, Stri //////////////////////////////// //~ string buffer +internal B32 str8_buffer_skip(String8Node *buf, U64 *pos, U64 skip); +internal U64 str8_buffer_read(String8Node *buf, U64 *pos, U64 read_size, void *out); +internal U64 str8_buffer_peek(String8Node *buf, U64 *pos, U64 read_size, void *out); internal U64 str8_buffer_write(String8Node *buf, U64 *pos, String8 data); internal U64 str8_buffer_write_u16(String8Node *buf, U64 *pos, U16 v); internal U64 str8_buffer_write_u32(String8Node *buf, U64 *pos, U32 v); From 30e21a84eaa757b8cab18323b48e6b69713abd48 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 17:51:55 -0700 Subject: [PATCH 316/850] arena helper for dealing with buffer preallocation for workers --- src/linker/base_ext/base_arena.c | 48 +++++++++++++++++--------------- src/linker/base_ext/base_arena.h | 10 +++---- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/linker/base_ext/base_arena.c b/src/linker/base_ext/base_arena.c index 166d3ea6..c6e25fe4 100644 --- a/src/linker/base_ext/base_arena.c +++ b/src/linker/base_ext/base_arena.c @@ -25,16 +25,35 @@ push_array_copy_u64(Arena *arena, U64 *v, U64 count) return result; } -internal U64 ** -push_matrix_u64(Arena *arena, U64 rows, U64 columns) +internal Arena ** +alloc_arena_many(Arena *arena, U64 count, U64 *sizes) { - U64 **result = push_array_no_zero(arena, U64 *, rows); - for (U64 row_idx = 0; row_idx < rows; row_idx += 1) { - result[row_idx] = push_array(arena, U64, columns); + Arena **result = push_array(arena, Arena *, count); + U64 total_size = sum_array_u64(count, sizes); + U8 *buffer = push_array(arena, U8, total_size + (ARENA_HEADER_SIZE * count)); + U64 offset = 0; + for EachIndex(i, count) { + if (sizes[i] > 0) { + void *backing_buffer = buffer + offset; + result[i] = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .optional_backing_buffer = backing_buffer, .reserve_size = ARENA_HEADER_SIZE + sizes[i], .commit_size = ARENA_HEADER_SIZE + sizes[i] }); + offset += ARENA_HEADER_SIZE; + offset += sizes[i]; + } } return result; } +internal Arena ** +alloc_arena_array_(Arena *arena, U64 count, U64 *counts, U64 element_size) +{ + Temp scratch = scratch_begin(&arena, 1); + U64 *sizes = push_array(scratch.arena, U64, count); + for EachIndex(i, count) { sizes[i] = counts[i] * element_size; } + Arena **result = alloc_arena_many(arena, count, sizes); + scratch_end(scratch); + return result; +} + internal Arena ** alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt) { @@ -44,26 +63,11 @@ alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt) Arena **arr = (Arena **)(count_ptr + 1); *count_ptr = count; - ArenaParams params = {0}; - params.reserve_size = res; - params.commit_size = cmt; - - for (U64 i = 0; i < count; i += 1) { - Arena *fixed_arena = arena_alloc_(¶ms); + for EachIndex(i, count) { + Arena *fixed_arena = arena_alloc_(&(ArenaParams){ .reserve_size = res, .commit_size = cmt }); arr[i] = fixed_arena; } return arr; } -internal void -release_arena_array(Arena **arr) -{ - U64 *count_ptr = (U64 *)arr - 1; - U64 count = *count_ptr; - for (U64 i = 0; i < count; i += 1) { - arena_release(arr[i]); - arr[i] = 0; - } -} - diff --git a/src/linker/base_ext/base_arena.h b/src/linker/base_ext/base_arena.h index 4cb25d21..f8996eb6 100644 --- a/src/linker/base_ext/base_arena.h +++ b/src/linker/base_ext/base_arena.h @@ -3,11 +3,9 @@ #pragma once -internal U64 * push_u64 (Arena *arena, U64 value); -internal U32 * push_array_copy_u32(Arena *arena, U32 *v, U64 count); -internal U64 * push_array_copy_u64(Arena *arena, U64 *v, U64 count); -internal U64 ** push_matrix_u64 (Arena *arena, U64 rows, U64 columns); - +internal U64 * push_u64 (Arena *arena, U64 value); +internal U32 * push_array_copy_u32(Arena *arena, U32 *v, U64 count); +internal U64 * push_array_copy_u64(Arena *arena, U64 *v, U64 count); internal Arena ** alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt); -internal void release_arena_array(Arena **arr); +#define alloc_arena_array(_arena_, _arena_count_, _counts_, T) alloc_arena_array_(_arena_, _arena_count_, _counts_, sizeof(T)) From 6b7cd39ff1be8e4037b355002066c531e447ccc3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 17:52:26 -0700 Subject: [PATCH 317/850] msf and cv tree patcher tests --- src/torture/torture_main.c | 4 ++ src/torture/torture_radlink.c | 106 ++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 3fab8992..8c8f6eca 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -36,8 +36,10 @@ #include "linker/base_ext/base_core.h" #include "linker/base_ext/base_arena.h" #include "linker/base_ext/base_arrays.h" +#include "linker/base_ext/base_bit_array.h" #include "linker/thread_pool/thread_pool.h" #include "linker/codeview_ext/codeview.h" +#include "linker/pdb_ext/msf_builder.h" #include "linker/lnk_cmd_line.h" #include "linker/lnk_cmd_line.c" #include "linker/lnk_log.h" @@ -69,8 +71,10 @@ #include "linker/base_ext/base_core.c" #include "linker/base_ext/base_arena.c" #include "linker/base_ext/base_arrays.c" +#include "linker/base_ext/base_bit_array.c" #include "linker/thread_pool/thread_pool.c" #include "linker/codeview_ext/codeview.c" +#include "linker/pdb_ext/msf_builder.c" #include "torture.c" #include "torture_base.c" #include "torture_radlink.c" diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 4af47845..86725808 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4615,6 +4615,112 @@ T_BeginTest(merge_duplicate_types) } T_EndTest; +T_BeginTest(get_msf_stream_pages) +{ + MSF_Context *msf = msf_alloc(MSF_DEFAULT_PAGE_SIZE, MSF_DEFAULT_FPM); + + { + U64 stream_size = MB(150) + 1; + + MSF_StreamNumber sn = msf_stream_alloc_ex(msf, stream_size); + + U8 *test = push_array(scratch.arena, U8, stream_size); + MemorySet(test, 0xca, stream_size/2); + MemorySet(test + stream_size/2, 0xbe, stream_size/2); + + String8List stream_data = msf_data_from_sn(scratch.arena, msf, sn); + T_Ok(stream_data.total_size == stream_size); + T_Ok(stream_data.node_count == 11); + + String8Array a = str8_array_from_list(scratch.arena, &stream_data); + T_Ok(a.v[0].size == 0xffd000); + T_Ok(a.v[1].size == 0xffe000); + T_Ok(a.v[2].size == 0xffe000); + T_Ok(a.v[3].size == 0xffe000); + T_Ok(a.v[4].size == 0xffe000); + T_Ok(a.v[5].size == 0xffe000); + T_Ok(a.v[6].size == 0xffe000); + T_Ok(a.v[7].size == 0xffd000); + T_Ok(a.v[8].size == 0x1000); + T_Ok(a.v[9].size == 0xffe000); + T_Ok(a.v[10].size == 0x613001); + + String8Node buf = *stream_data.first; + U64 buf_pos = 0; + str8_buffer_write(&buf, &buf_pos, str8(test, stream_size)); + + String8 cmp = msf_stream_read_block(scratch.arena, msf, sn, stream_size); + T_Ok(cmp.size == stream_size); + T_Ok(MemoryCompare(cmp.str, test, stream_size) == 0); + } + + { + MSF_StreamNumber sn = msf_stream_alloc_ex(msf, 1); + String8List stream_data = msf_data_from_sn(scratch.arena, msf, sn); + T_Ok(stream_data.node_count == 1); + T_Ok(stream_data.total_size == 1); + T_Ok(stream_data.first->string.size == 1); + } + + msf_release(&msf); +} +T_EndTest; + +T_BeginTest(patch_cv_symbol_tree) +{ + String8List raw_symbols = {0}; + str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_OBJNAME, cv_make_obj_name(scratch.arena, str8_lit("foo.obj"), 123))); + str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_GPROC32, cv_make_proc32(scratch.arena, (CV_SymProc32){0}, str8_lit("Proc")))); + str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_INLINESITE, cv_make_inline_site(scratch.arena, (CV_SymInlineSite){0}, str8_zero()))); + str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_INLINESITE_END, cv_make_inline_site_end(scratch.arena))); + str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_END, cv_make_end(scratch.arena))); + + U64 tree_size = cv_patch_symbol_tree_offsets(raw_symbols, sizeof(CV_Signature), 4); + T_Ok(tree_size == 84); + + { + String8Node buf = *raw_symbols.first; + U64 buf_pos = 0; + + CV_SymbolHeader obj_header; + T_Ok(str8_buffer_read(&buf, &buf_pos, sizeof(obj_header), &obj_header) == sizeof(obj_header)); + T_Ok(obj_header.kind == CV_SymKind_OBJNAME); + T_Ok(str8_buffer_skip(&buf, &buf_pos, obj_header.size - sizeof(CV_SymKind))); + + CV_SymbolHeader proc_header; + T_Ok(str8_buffer_read(&buf, &buf_pos, sizeof(proc_header), &proc_header) == sizeof(proc_header)); + T_Ok(proc_header.kind == CV_SymKind_GPROC32); + + CV_SymProc32 proc; + T_Ok(str8_buffer_read(&buf, &buf_pos, sizeof(proc), &proc) == sizeof(proc)); + T_Ok(proc.end == 0x54); + T_Ok(str8_buffer_skip(&buf, &buf_pos, proc_header.size - sizeof(CV_SymKind) - sizeof(proc))); + + CV_SymbolHeader inline_site_header; + T_Ok(str8_buffer_read(&buf, &buf_pos, sizeof(inline_site_header), &inline_site_header) == sizeof(inline_site_header)); + T_Ok(inline_site_header.kind == CV_SymKind_INLINESITE); + + CV_SymInlineSite inline_site; + T_Ok(str8_buffer_read(&buf, &buf_pos, sizeof(inline_site), &inline_site)); + T_Ok(inline_site.parent == 0x14); + T_Ok(inline_site.end == 0x50); + T_Ok(str8_buffer_skip(&buf, &buf_pos, inline_site_header.size - sizeof(CV_SymKind) - sizeof(inline_site))); + + CV_SymbolHeader inline_end_header; + T_Ok(str8_buffer_read(&buf, &buf_pos, sizeof(inline_end_header), &inline_end_header) == sizeof(inline_end_header)); + T_Ok(inline_end_header.kind == CV_SymKind_INLINESITE_END); + + CV_SymbolHeader proc_end_header; + T_Ok(str8_buffer_read(&buf, &buf_pos, sizeof(proc_end_header), &proc_end_header) == sizeof(proc_end_header)); + T_Ok(proc_end_header.kind == CV_SymKind_END); + + T_Ok(buf.string.size == 0); + T_Ok(buf.string.str == 0); + T_Ok(buf_pos == 0); + } +} +T_EndTest; + #if 0 T_BeginTest(fold_two_funcs) From b5f0862a915e2711705b025f1579984d6bc7a87b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 17:53:23 -0700 Subject: [PATCH 318/850] fixup file checksums in the MSF streams --- src/linker/codeview_ext/codeview.c | 441 ++++++----------------------- src/linker/codeview_ext/codeview.h | 62 +--- src/linker/lnk.c | 25 +- src/linker/lnk_debug_helper.c | 57 ++-- src/linker/lnk_debug_helper.h | 2 +- src/linker/lnk_debug_info.c | 305 ++++++++++++-------- src/linker/lnk_debug_info.h | 14 +- src/linker/lnk_obj.c | 18 +- src/linker/pdb_ext/msf_builder.c | 40 ++- src/linker/pdb_ext/msf_builder.h | 2 +- 10 files changed, 360 insertions(+), 606 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 9b2a8d93..66435866 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -202,6 +202,7 @@ cv_write_symbol_buf(String8Node *buf, U64 *buf_pos, CV_Symbol *symbol, U64 align CV_SymSize record_size16 = (CV_SymSize)record_size; U64 write_size = 0; + write_size += str8_buffer_write(buf, buf_pos, str8((U8 *)&(CV_SymbolHeader){ .size = record_size16, .kind = symbol->kind }, sizeof(CV_SymbolHeader))); write_size += str8_buffer_write(buf, buf_pos, symbol->data); write_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(symbol->data.size, align)); @@ -383,6 +384,43 @@ cv_make_envblock(Arena *arena, String8List string_list) return result; } +internal String8 +cv_make_proc32(Arena *arena, CV_SymProc32 proc, String8 name) +{ + U64 buf_size = sizeof(proc) + name.size + 1; + U8 *buf = push_array(arena, U8, buf_size); + CV_SymProc32 *proc_dst = (CV_SymProc32 *)buf; + MemoryCopy(proc_dst, &proc, sizeof(proc)); + MemoryCopy(proc_dst + 1, name.str, name.size); + MemorySet((U8 *)(proc_dst + 1) + name.size , 0, 1); + String8 result = str8(buf, buf_size); + return result; +} + +internal String8 +cv_make_end(Arena *arena) +{ (void)arena; + return str8_zero(); +} + +internal String8 +cv_make_inline_site(Arena *arena, CV_SymInlineSite inline_site, String8 annots) +{ + U64 buf_size = sizeof(inline_site) + annots.size; + U8 *buf = push_array(arena, U8, buf_size); + CV_SymInlineSite *inline_dst = (CV_SymInlineSite *)buf; + MemoryCopy(inline_dst, &inline_site, sizeof(inline_site)); + MemoryCopy(inline_dst + 1, annots.str, annots.size); + String8 result = str8(buf, buf_size); + return result; +} + +internal String8 +cv_make_inline_site_end(Arena *arena) +{ (void)arena; + return str8_zero(); +} + internal CV_Symbol cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local) { @@ -428,27 +466,6 @@ cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 nam return symbol; } -internal CV_SymbolList -cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list) -{ - CV_SymbolList proc_ref_list = {0}; - for (CV_SymbolNode *symbol_node = symbol_list.first; symbol_node != 0; symbol_node = symbol_node->next) { - CV_Symbol *symbol = &symbol_node->data; - if (symbol->kind == CV_SymKind_GPROC32) { - String8 name = cv_name_from_symbol(symbol->kind, symbol->data); - CV_Symbol ref = cv_make_proc_ref(arena, imod, safe_cast_u32(symbol->offset), name, /* is_local: */ 0); - CV_SymbolNode *proc_ref_node = cv_symbol_list_push(arena, &proc_ref_list); - proc_ref_node->data = ref; - } else if (symbol->kind == CV_SymKind_LPROC32) { - String8 name = cv_name_from_symbol(symbol->kind, symbol->data); - CV_Symbol ref = cv_make_proc_ref(arena, imod, safe_cast_u32(symbol->offset), name, /* is_local */ 1); - CV_SymbolNode *proc_ref_node = cv_symbol_list_push(arena, &proc_ref_list); - proc_ref_node->data = ref; - } - } - return proc_ref_list; -} - internal B32 cv_is_lproc(CV_Symbol symbol) { @@ -1198,61 +1215,6 @@ cv_debug_t_is_type_server_ref(CV_DebugT *debug_t) // $$Symbols -internal void -cv_parse_symbol_sub_section_capped(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align, U64 cap) -{ - U64 count = 0; - for (U64 cursor = 0, opl = data.size; cursor < opl && count < cap; count += 1) { - // read symbol header - CV_SymbolHeader header; - cursor += str8_deserial_read_struct(data, cursor, &header); - - // size from header has to be larger than 2 bytes - if (header.size < sizeof(header.kind)) { - Assert(!"TODO: error handle invalid symbol data"); - break; - } - - // is there enough bytes in the range? - U64 symbol_opl = cursor + (header.size - sizeof(header.kind)); - if (symbol_opl > opl) { - Assert(!"TODO: error handle corrupted symbol data"); - break; - } - - // get symbol data - Rng1U64 symbol_data_range = r1u64(cursor, symbol_opl); - String8 symbol_data = str8_substr(data, symbol_data_range); - - // init symbol - CV_SymbolNode *node = cv_symbol_list_push(arena, list); - node->data.offset = offset_base + cursor; - node->data.kind = header.kind; - node->data.data = symbol_data; - - // advance cursor - cursor = symbol_opl; - cursor = AlignPow2(cursor, align); - } -} - -internal void -cv_parse_symbol_sub_section(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align) -{ - cv_parse_symbol_sub_section_capped(arena, list, offset_base, data, align, max_U64); -} - -internal CV_SymbolList -cv_symbol_list_from_data_list(Arena *arena, String8List data_list, U64 align) -{ - CV_SymbolList symbol_list = {0}; - U64 cursor = 0; - for (String8Node *sect = data_list.first; sect != 0; cursor += sect->string.size, sect = sect->next) { - cv_parse_symbol_sub_section(arena, &symbol_list, cursor, sect->string, align); - } - return symbol_list; -} - internal void cv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node) { @@ -1263,309 +1225,77 @@ cv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node) } internal CV_SymbolNode * -cv_symbol_list_push(Arena *arena, CV_SymbolList *list) +cv_symbol_list_push(Arena *arena, CV_SymbolList *list, CV_Symbol v) { CV_SymbolNode *node = push_array(arena, CV_SymbolNode, 1); + node->data = v; cv_symbol_list_push_node(list, node); return node; } -internal CV_SymbolNode * -cv_symbol_list_push_data(Arena *arena, CV_SymbolList *list, CV_SymKind kind, String8 data) -{ - CV_SymbolNode *node = cv_symbol_list_push(arena, list); - node->data.kind = kind; - node->data.data = data; - return node; -} - -internal CV_SymbolNode * -cv_symbol_list_push_many(Arena *arena, CV_SymbolList *list, U64 count) -{ - CV_SymbolNode *node_arr = push_array_no_zero(arena, CV_SymbolNode, 1); - for (U64 node_idx = 0; node_idx < count; node_idx += 1) { - cv_symbol_list_push_node(list, &node_arr[node_idx]); - } - return node_arr; -} - -internal void -cv_symbol_list_remove_node(CV_SymbolList *list, CV_SymbolNode *node) -{ - Assert(list->count > 0); - list->count -= 1; - DLLRemove(list->first, list->last, node); -} - -internal void -cv_symbol_list_concat_in_place(CV_SymbolList *list, CV_SymbolList *to_concat) -{ - SLLConcatInPlace(list, to_concat); -} - -internal void -cv_symbol_list_concat_in_place_arr(CV_SymbolList *list, U64 count, CV_SymbolList *to_concat) -{ - SLLConcatInPlaceArray(list, to_concat, count); -} - internal U64 -cv_symbol_list_arr_get_count(U64 count, CV_SymbolList *list_arr) +cv_patch_symbol_tree_offsets(String8List raw_symbols, U64 base_offset, U64 align) { - U64 result = 0; - for (U64 idx = 0; idx < count; idx += 1) { - result += list_arr[idx].count; - } - return result; -} - -internal String8List -cv_write_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align) -{ - String8List data_list = {0}; - for (CV_SymbolNode *node = symbol_list.first; node != 0; node = node->next) { - String8 data = cv_data_from_symbol(arena, &node->data, align); - str8_list_push(arena, &data_list, data); - } - return data_list; -} - -internal -THREAD_POOL_TASK_FUNC(cv_symbol_list_syncer) -{ - ProfBeginFunction(); - - CV_SymbolListSyncer *task = raw_task; - - // context shortcuts - Rng1U64 list_range = task->list_range_arr[task_id]; - U64 symbol_base = task->symbol_base_arr[task_id]; - - for (U64 list_idx = list_range.min, symbol_idx = symbol_base; list_idx < list_range.max; list_idx += 1) { - // pick up assigned list - CV_SymbolList list = task->list_arr[list_idx]; - - // fill out assigned range in the symbol array - for (CV_SymbolNode *node = list.first; node != 0; node = node->next, symbol_idx += 1) { - task->symbol_arr[symbol_idx] = node; - } - } - - ProfEnd(); -} - -internal CV_SymbolPtrArray -cv_symbol_ptr_array_from_list(Arena *arena, TP_Context *tp, U64 count, CV_SymbolList *list_arr) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - U64 total_count = cv_symbol_list_arr_get_count(count, list_arr); - - CV_SymbolListSyncer task = {0}; - task.list_arr = list_arr; - task.symbol_arr = push_array_no_zero(arena, CV_SymbolNode *, total_count); - task.symbol_base_arr = push_array_no_zero(scratch.arena, U64, tp->worker_count); - task.list_range_arr = tp_divide_work(scratch.arena, count, tp->worker_count); - - for (U64 thread_idx = 0, symbol_base = 0; thread_idx < tp->worker_count; thread_idx += 1) { - task.symbol_base_arr[thread_idx] = symbol_base; - Rng1U64 range = task.list_range_arr[thread_idx]; - for (U64 list_idx = range.min; list_idx < range.max; list_idx += 1) { - symbol_base += list_arr[list_idx].count; - } - } - - tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_list_syncer, &task); - - CV_SymbolPtrArray result = {0}; - result.count = total_count; - result.v = task.symbol_arr; - - scratch_end(scratch); - ProfEnd(); - return result; -} - -internal CV_Scope * -cv_scope_list_push(Arena *arena, CV_ScopeList *list) -{ - CV_Scope *node = push_array(arena, CV_Scope, 1); - SLLQueuePush(list->first, list->last, node); - return node; -} - -internal CV_SymbolList -cv_global_scope_symbols_from_list(Arena *arena, CV_SymbolList list) -{ - CV_SymbolList gsym_list = {0}; - S64 scope_depth = 0; - for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) { - CV_Symbol symbol = symbol_n->data; - if (cv_is_global_symbol(symbol.kind) && scope_depth == 0) { - cv_symbol_list_push_data(arena, &gsym_list, symbol.kind, symbol.data); - } else if (cv_is_scope_symbol(symbol.kind)) { - scope_depth += 1; - } else if (cv_is_end_symbol(symbol.kind)) { - scope_depth -= 1; - if (scope_depth < 0) { - break; - } - } - } - return gsym_list; -} - -internal CV_ScopeList -cv_symbol_tree_from_symbol_list(Arena *arena, CV_SymbolList list) -{ - Temp scratch = scratch_begin(&arena, 1); - - CV_ScopeList root = {0}; - - // setup root frame - CV_ScopeFrame *stack = push_array(scratch.arena, CV_ScopeFrame, 1); - stack->list = &root; - - for (CV_SymbolNode *symbol_node = list.first; symbol_node != 0; symbol_node = symbol_node->next) { - // store symbol in current scope - CV_Scope *scope = cv_scope_list_push(arena, stack->list); - scope->symbol = symbol_node->data; - - // does this symbol define a new scope? - if (cv_is_scope_symbol(symbol_node->data.kind)) { - CV_ScopeFrame *frame = push_array(scratch.arena, CV_ScopeFrame, 1); - frame->list = push_array(arena, CV_ScopeList, 1); - SLLStackPush(stack, frame); - } - // does this symbol end current scope? - else if (cv_is_end_symbol(symbol_node->data.kind)) { - CV_ScopeFrame *prev_stack_frame = stack->next; - if (prev_stack_frame) { - // set children in parent scope - CV_Scope *parent_scope = prev_stack_frame->list->last; - parent_scope->children = stack->list; - } - - // pop frame - SLLStackPop(stack); - } - } - - scratch_end(scratch); - return root; -} - -internal U64 -cv_patch_symbol_tree_offsets(CV_SymbolList list, U64 base_offset, U64 align) -{ - struct Stack { - struct Stack *next; - CV_Symbol *symbol; - U64 offset; - }; Temp scratch = scratch_begin(0, 0); - struct Stack *stack = 0; - struct Stack *free_list = 0; - U32 cursor = safe_cast_u32(base_offset); - for EachNode(symbol_n, CV_SymbolNode, list.first) { - CV_Symbol symbol = symbol_n->data; - if (cv_is_scope_symbol(symbol.kind)) { + + struct Stack { struct Stack *next; String8Node symbol_buf; U64 symbol_pos; U64 offset; }; + struct Stack *stack = 0, *free_list = 0; + + String8Node buf = *raw_symbols.first; + U64 buf_pos = 0; + U64 symbol_offset = base_offset; + U64 depth = 0; + + for (;;) { + CV_SymbolHeader symbol_header; + if (str8_buffer_read(&buf, &buf_pos, sizeof(symbol_header), &symbol_header) != sizeof(symbol_header)) { break; } + + if (cv_is_scope_symbol(symbol_header.kind)) { // NOTE: We don't patch 'next' offset in PROC symbols because // it's not used by visual studio and MSVC leaves the offsets // zeroed. LLD is on the same page. - Assert(symbol.data.size >= sizeof(U32)*2); + Assert(symbol_header.size >= sizeof(CV_SymKind) + sizeof(U32)*2); // patch parent symbol offset if (stack) { - memory_write32(symbol.data.str, stack->offset); + String8Node temp_buf = buf; + U64 temp_pos = buf_pos; + str8_buffer_write_u32(&temp_buf, &temp_pos, stack->offset); } // reuse/alloc frame - struct Stack *frame; - if (free_list) { - frame = free_list; - SLLStackPop(free_list); - } else { - frame = push_array_no_zero(scratch.arena, struct Stack, 1); - } + struct Stack *frame = free_list; + if (frame) { SLLStackPop(free_list); } + else { frame = push_array_no_zero(scratch.arena, struct Stack, 1); } // push frame to the stack - frame->symbol = &symbol_n->data; - frame->offset = cursor; + frame->symbol_buf = buf; + frame->symbol_pos = buf_pos; + frame->offset = safe_cast_u32(symbol_offset); SLLStackPush(stack, frame); - } else if (cv_is_end_symbol(symbol.kind)) { + + depth += 1; + } else if (cv_is_end_symbol(symbol_header.kind)) { // patch symbol end - U32 *end_off_ptr = (U32 *)stack->symbol->data.str + /* skip parent off */ 1; - memory_write32(end_off_ptr, cursor); + String8Node temp_buf = stack->symbol_buf; + U64 temp_pos = stack->symbol_pos; + str8_buffer_skip(&temp_buf, &temp_pos, sizeof(U32)); // skip parent offset + str8_buffer_write_u32(&temp_buf, &temp_pos, symbol_offset); // recycle frame struct Stack *free_frame = stack; SLLStackPop(stack); SLLStackPush(free_list, free_frame); + + if (depth == 0) { Assert(0 && "malformed symbol stream"); continue; } + depth -= 1; } - // advance cursor - cursor += cv_size_from_symbol(&symbol, align); - } + // advance symbol offset + symbol_offset += sizeof(CV_SymSize) + symbol_header.size; + symbol_offset = AlignPow2(symbol_offset, align); - scratch_end(scratch); - U64 serial_size = cursor - base_offset; - return serial_size; -} - -internal U64 -cv_patch_symbol_tree_offsets_new(String8List raw_symbols, U64 base_offset, U64 align) -{ - Temp scratch = scratch_begin(0, 0); - struct Stack { struct Stack *next; CV_Symbol symbol; U64 offset; }; - struct Stack *stack = 0, *free_list = 0; - U64 symbol_offset = safe_cast_u32(base_offset); - for EachNode(n, String8Node, raw_symbols.first) { - for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { - CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(n->string, cursor, align, &symbol), cursor); - - if (cv_is_scope_symbol(symbol.kind)) { - // NOTE: We don't patch 'next' offset in PROC symbols because - // it's not used by visual studio and MSVC leaves the offsets - // zeroed. LLD is on the same page. - Assert(symbol.data.size >= sizeof(U32)*2); - - // patch parent symbol offset - if (stack) { - memory_write32(symbol.data.str, stack->offset); - } - - // reuse/alloc frame - struct Stack *frame = free_list; - if (frame) { SLLStackPop(free_list); } - else { frame = push_array_no_zero(scratch.arena, struct Stack, 1); } - - // push frame to the stack - frame->symbol = symbol; - frame->offset = symbol_offset; - SLLStackPush(stack, frame); - - depth += 1; - } else if (cv_is_end_symbol(symbol.kind)) { - // patch symbol end - U32 *end_off_ptr = (U32 *)stack->symbol.data.str + /* skip parent off */ 1; - memory_write32(end_off_ptr, symbol_offset); - - // recycle frame - struct Stack *free_frame = stack; - SLLStackPop(stack); - SLLStackPush(free_list, free_frame); - - if (depth == 0) { Assert(0 && "malformed symbol stream"); goto next_block; } - depth -= 1; - } - - // advance tree offset - symbol_offset += cv_size_from_symbol(&symbol, align); - } - next_block:; + str8_buffer_skip(&buf, &buf_pos, symbol_header.size - sizeof(CV_SymKind)); } scratch_end(scratch); @@ -1618,13 +1348,12 @@ cv_c13_parse_checksum_data_list(Arena *arena, String8List checksum_data_list) internal void cv_c13_patch_string_offsets_in_checksum_list(CV_ChecksumList checksum_list, String8 string_data, U64 string_data_base_offset, CV_StringHashTable string_ht) { - for (CV_ChecksumNode *node = checksum_list.first; node != 0; node = node->next) { - CV_Checksum *checksum = &node->data; - CV_C13Checksum *header = checksum->header; - String8 name = str8_cstring_capped(string_data.str + header->name_off, string_data.str + string_data.size); - CV_StringBucket *bucket = cv_string_hash_table_lookup(string_ht, name); - - U64 name_off64 = string_data_base_offset + bucket->u.offset; + for EachNode(node, CV_ChecksumNode, checksum_list.first) { + CV_Checksum *checksum = &node->data; + CV_C13Checksum *header = checksum->header; + String8 name = str8_cstring_capped(string_data.str + header->name_off, string_data.str + string_data.size); + CV_StringBucket *bucket = cv_string_hash_table_lookup(string_ht, name); + U64 name_off64 = string_data_base_offset + bucket->u.offset; header->name_off = safe_cast_u32(name_off64); } } diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index 4cc68079..3b477148 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -42,12 +42,6 @@ typedef struct CV_SymbolNode CV_Symbol data; } CV_SymbolNode; -typedef struct CV_SymbolPtrNode -{ - struct CV_SymbolPtrNode *next; - CV_Symbol *data; -} CV_SymbolPtrNode; - typedef struct CV_SymbolList { U64 count; @@ -62,36 +56,6 @@ typedef struct CV_SymbolListArray CV_SymbolList *v; } CV_SymbolListArray; -typedef struct CV_SymbolPtrArray -{ - U64 count; - CV_SymbolNode **v; -} CV_SymbolPtrArray; - -typedef struct CV_Scope -{ - struct CV_ScopeList *children; - struct CV_Scope *next; - struct CV_Scope *prev; - CV_Symbol symbol; -} CV_Scope; - -typedef struct CV_ScopeList -{ - CV_Scope *first; - CV_Scope *last; -} CV_ScopeList; - -typedef struct CV_ScopeFrame -{ - struct CV_ScopeFrame *next; - CV_ScopeList *list; - CV_Scope *curr; - U64 symbol_off; - U32 *parent_off_ptr; - U32 *end_off_ptr; -} CV_ScopeFrame; - //- $$FileChksms typedef struct CV_Checksum @@ -340,14 +304,6 @@ typedef struct CV_StringHashTableResult //////////////////////////////// //~ Task Contexts -typedef struct -{ - CV_SymbolList *list_arr; - Rng1U64 *list_range_arr; - U64 *symbol_base_arr; - CV_SymbolNode **symbol_arr; -} CV_SymbolListSyncer; - typedef struct { CV_DebugS *arr; @@ -401,6 +357,7 @@ internal String8 cv_make_symbol(Arena *arena, CV_SymKind kind, String8 dat internal String8 cv_make_obj_name(Arena *arena, String8 obj_path, U32 sig); internal String8 cv_make_comp3(Arena *arena, CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe, U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe, String8 version_string); internal String8 cv_make_envblock(Arena *arena, String8List string_list); +internal String8 cv_make_end(Arena *arena); internal CV_Symbol cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local); internal CV_Symbol cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name); @@ -448,21 +405,10 @@ internal B32 cv_debug_t_is_type_server_ref(CV_DebugT *debug_t); //~ Sub Section helpers // $$Symbols -internal void cv_parse_symbol_sub_section_capped(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align, U64 cap); -internal void cv_parse_symbol_sub_section(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align); +internal void cv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node); +internal CV_SymbolNode * cv_symbol_list_push(Arena *arena, CV_SymbolList *list, CV_Symbol v); -internal void cv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node); -internal CV_SymbolNode * cv_symbol_list_push(Arena *arena, CV_SymbolList *list); -internal CV_SymbolNode * cv_symbol_list_push_data(Arena *arena, CV_SymbolList *list, CV_SymKind kind, String8 data); -internal CV_SymbolNode * cv_symbol_list_push_many(Arena *arena, CV_SymbolList *list, U64 count); -internal void cv_symbol_list_remove_node(CV_SymbolList *list, CV_SymbolNode *node); -internal void cv_symbol_list_concat_in_place(CV_SymbolList *list, CV_SymbolList *to_concat); -internal void cv_symbol_list_concat_in_place_arr(CV_SymbolList *list, U64 count, CV_SymbolList *to_concat); -internal U64 cv_symbol_list_arr_get_count(U64 count, CV_SymbolList *list_arr); - -internal String8List cv_write_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align); -internal CV_SymbolList cv_global_scope_symbols_from_list(Arena *arena, CV_SymbolList list); -internal CV_SymbolPtrArray cv_symbol_ptr_array_from_list(Arena *arena, TP_Context *tp, U64 count, CV_SymbolList *symbol_list_arr); +internal U64 cv_patch_symbol_tree_offsets(String8List raw_symbols, U64 base_offset, U64 align); // $$FileChksms #define CV_MAP_STRING_TO_OFFSET_FUNC(name) U64 name(void *ud, String8 string) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 14920524..68c061bd 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -842,16 +842,11 @@ lnk_make_linker_coff_obj(Arena *arena, String8 debug_symbols = {0}; { - CV_SymbolList symbol_list = { .signature = CV_Signature_C13 }; - - // S_OBJ - String8 obj_data = cv_make_obj_name(scratch.arena, obj_name, 0); - cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_OBJNAME, obj_data); - - // S_COMPILE3 - String8 comp3_data = lnk_make_linker_compile3(scratch.arena, machine); - cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_COMPILE3, comp3_data); + String8List symbols = {0}; + str8_list_push(scratch.arena, &symbols, cv_make_symbol(scratch.arena, CV_SymKind_OBJNAME, cv_make_obj_name(scratch.arena, obj_name, 0))); + str8_list_push(scratch.arena, &symbols, cv_make_symbol(scratch.arena, CV_SymKind_COMPILE3, lnk_make_linker_compile3(scratch.arena, machine))); + // S_ENVBLOCK String8List env_list = {0}; str8_list_push(scratch.arena, &env_list, str8_lit("cwd")); @@ -864,12 +859,12 @@ lnk_make_linker_coff_obj(Arena *arena, str8_list_push(scratch.arena, &env_list, cmd_line); str8_list_push(scratch.arena, &env_list, str8_lit("")); str8_list_push(scratch.arena, &env_list, str8_lit("")); - cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_ENVBLOCK, cv_make_envblock(scratch.arena, env_list)); + str8_list_push(scratch.arena, &symbols, cv_make_symbol(scratch.arena, CV_SymKind_ENVBLOCK, cv_make_envblock(scratch.arena, env_list))); // TODO: emit S_SECTION and S_COFFGROUP // TODO: emit S_TRAMPOLINE - debug_symbols = lnk_make_debug_s(scratch.arena, symbol_list); + debug_symbols = lnk_make_debug_s(scratch.arena, symbols); } String8 obj; @@ -1863,8 +1858,8 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer for (String8Node *dll_name_n = delayed_dll_names.first; dll_name_n != 0; dll_name_n = dll_name_n->next) { PE_MakeImportList *imports = hash_table_search_path_raw(delayed_imports_ht, dll_name_n->string); - String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string); - String8 import_obj = pe_make_import_dll_obj_delayed(arena->v[0], time_stamp, config->machine, dll_name_n->string, config->delay_load_helper_name, import_debug_symbols, *imports, emit_biat, emit_uiat); + String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string); + String8 import_obj = pe_make_import_dll_obj_delayed(arena->v[0], time_stamp, config->machine, dll_name_n->string, config->delay_load_helper_name, import_debug_symbols, *imports, emit_biat, emit_uiat); lnk_inputer_push_obj(inputer, 0, dll_name_n->string, import_obj); } @@ -1885,8 +1880,8 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer for (String8Node *dll_name_n = static_dll_names.first; dll_name_n != 0; dll_name_n = dll_name_n->next) { PE_MakeImportList *imports = hash_table_search_path_raw(static_imports_ht, dll_name_n->string); - String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string); - String8 import_obj = pe_make_import_dll_obj_static(arena->v[0], time_stamp, config->machine, dll_name_n->string, import_debug_symbols, *imports); + String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string); + String8 import_obj = pe_make_import_dll_obj_static(arena->v[0], time_stamp, config->machine, dll_name_n->string, import_debug_symbols, *imports); lnk_inputer_push_obj(inputer, 0, dll_name_n->string, import_obj); } diff --git a/src/linker/lnk_debug_helper.c b/src/linker/lnk_debug_helper.c index 7cbfe291..fbf9bb36 100644 --- a/src/linker/lnk_debug_helper.c +++ b/src/linker/lnk_debug_helper.c @@ -4,31 +4,29 @@ internal String8 lnk_make_linker_compile3(Arena *arena, COFF_MachineType machine) { - String8 comp3_data = cv_make_comp3(arena, - 0, - CV_Language_LINK, - cv_arch_from_coff_machine(machine), - /* ver_fe_major */ 0, - /* ver_fe_minor */ 0, - /* ver_fe_build */ 0, - /* ver_feqfe */ 0, - /* ver_major */ 14, - /* ver_minor */ 36, - /* ver_build */ 32537, - /* ver_qfe */ 0, - str8_lit(BUILD_TITLE)); - return comp3_data; + return cv_make_comp3(arena, + 0, + CV_Language_LINK, + cv_arch_from_coff_machine(machine), + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); } internal String8 -lnk_make_debug_s(Arena *arena, CV_SymbolList symbol_list) +lnk_make_debug_s(Arena *arena, String8List symbols) { Temp scratch = scratch_begin(&arena, 1); - CV_DebugS debug_s = {0}; - String8List *symbol_list_ptr = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Symbols); - *symbol_list_ptr = cv_write_symbol_list(scratch.arena, symbol_list, CV_SymbolAlign); + cv_patch_symbol_tree_offsets(symbols, sizeof(CV_Signature), CV_SymbolAlign); + CV_DebugS debug_s = { .data_list[CV_C13SubSectionIdxKind_Symbols] = symbols }; String8List debug_s_data_list = cv_data_from_debug_s_c13(scratch.arena, &debug_s, 1); String8 debug_s_data = str8_list_join(arena, &debug_s_data_list, 0); @@ -40,10 +38,11 @@ internal String8 lnk_make_linker_debug_symbols(Arena *arena, COFF_MachineType machine) { Temp scratch = scratch_begin(&arena, 1); - CV_SymbolList symbol_list = { .signature = CV_Signature_C13 }; - String8 comp3_data = lnk_make_linker_compile3(scratch.arena, machine); - cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_COMPILE3, comp3_data); - String8 debug_symbols = lnk_make_debug_s(arena, symbol_list); + + String8List symbols = {0}; + str8_list_push(scratch.arena, &symbols, cv_make_symbol(scratch.arena, CV_SymKind_COMPILE3, lnk_make_linker_compile3(scratch.arena, machine))); + String8 debug_symbols = lnk_make_debug_s(arena, symbols); + scratch_end(scratch); return debug_symbols; } @@ -53,20 +52,14 @@ lnk_make_dll_import_debug_symbols(Arena *arena, COFF_MachineType machine, String { Temp scratch = scratch_begin(&arena,1); - CV_SymbolList symbol_list = { .signature = CV_Signature_C13 }; - - // S_OBJ - String8 obj_data = cv_make_obj_name(scratch.arena, dll_name, 0); - cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_OBJNAME, obj_data); - - // S_COMPILE3 - String8 comp3_data = lnk_make_linker_compile3(scratch.arena, machine); - cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_COMPILE3, comp3_data); + String8List symbols = {0}; + str8_list_push(scratch.arena, &symbols, cv_make_symbol(scratch.arena, CV_SymKind_OBJNAME, cv_make_obj_name(scratch.arena, dll_name, 0))); + str8_list_push(scratch.arena, &symbols, cv_make_symbol(scratch.arena, CV_SymKind_COMPILE3, lnk_make_linker_compile3(scratch.arena, machine))); // TODO: add thunks // serialize symbols - String8 debug_symbols = lnk_make_debug_s(arena, symbol_list); + String8 debug_symbols = lnk_make_debug_s(arena, symbols); scratch_end(scratch); return debug_symbols; diff --git a/src/linker/lnk_debug_helper.h b/src/linker/lnk_debug_helper.h index dd1df4b3..14904168 100644 --- a/src/linker/lnk_debug_helper.h +++ b/src/linker/lnk_debug_helper.h @@ -4,5 +4,5 @@ #pragma once internal String8 lnk_make_linker_compile3(Arena *arena, COFF_MachineType machine); -internal String8 lnk_make_debug_s(Arena *arena, CV_SymbolList symbol_list); +internal String8 lnk_make_debug_s(Arena *arena, String8List symbols); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index ae9505a5..9d4696c1 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -15,6 +15,9 @@ lnk_get_huge_arena(void) internal void lnk_discard_cv_debug_info(LNK_CodeViewInput *input, U64 obj_idx) { + // discard types + MemoryZeroStruct(&input->debug_t_arr[obj_idx]); + // discard symbols String8List *symbols_ptr = cv_sub_section_ptr_from_debug_s(&input->debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols); MemoryZeroStruct(symbols_ptr); @@ -276,6 +279,8 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla ProfScope("Set up /Zi") { input.obj_to_ts = push_array(tp_arena->v[0], U64, input.count); + MemorySet(input.obj_to_ts, 0xff, input.count * sizeof(input.obj_to_ts[0])); + LNK_TypeServerList ts_list = {0}; HashTable *ts_ht = hash_table_init(scratch.arena, 256); @@ -294,6 +299,11 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla CV_TypeServerInfo ts_info = cv_type_server_info_from_leaf(leaf); String8 ts_path = lnk_find_first_file(scratch.arena, lib_dir_list, ts_info.name); + if (ts_path.size == 0) { + lnk_discard_cv_debug_info(&input, obj_idx); + continue; + } + // insert new type server LNK_TypeServer *ts = hash_table_search_path_raw(ts_ht, ts_path); if (ts == 0) { @@ -313,6 +323,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla obj_arr[obj_idx], "type server signature conflicts with type server from '%S'", obj_arr[ts->obj_indices.first->data]->path); + lnk_discard_cv_debug_info(&input, obj_idx); continue; } @@ -342,6 +353,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla MemoryCopyTyped(input.debug_s_arr, prev.debug_s_arr, prev.count); MemoryCopyTyped(input.debug_t_arr, prev.debug_t_arr, prev.count); MemoryCopyTyped(input.obj_to_ts, prev.obj_to_ts, prev.count); + MemorySet(input.obj_to_ts + input.obj_count, 0xff, ts_arr.count * sizeof(input.obj_to_ts[0])); input.ts_obj_range = r1u64(prev.count, input.count); @@ -522,10 +534,10 @@ lnk_leaf_ref_from_ti(LNK_CodeViewInput *input, U32 obj_idx, CV_TypeIndexSource s // ti range: external type server U64 ts_idx = input->obj_to_ts[obj_idx]; - if (ts_idx) { - U64 ts_obj_idx = input->ts_obj_range.min + ts_idx; - CV_DebugT *ts_debug_t = input->debug_t_arr + ts_obj_idx; - return (LNK_LeafRef){ ts_obj_idx, cv_leaf_idx_from_ti(ts_debug_t, source, ti) }; + if (ts_idx != max_U64) { + U64 ts_debug_t_idx = input->ts_obj_range.min + ts_idx; + CV_DebugT *ts_debug_t = input->debug_t_arr + ts_debug_t_idx; + return (LNK_LeafRef){ ts_debug_t_idx, cv_leaf_idx_from_ti(ts_debug_t, source, ti) }; } // ti range: internal type server @@ -553,14 +565,10 @@ internal B32 lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef a, LNK_LeafRef b) { B32 is_match = 0; - CV_DebugT *a_debug_t = &input->debug_t_arr[a.obj_idx]; - CV_DebugT *b_debug_t = &input->debug_t_arr[b.obj_idx]; - U64 a_hash = input->debug_h_arr[a.obj_idx].v[a.leaf_idx]; - U64 b_hash = input->debug_h_arr[b.obj_idx].v[b.leaf_idx]; + U64 a_hash = input->debug_h_arr[a.obj_idx].v[a.leaf_idx]; + U64 b_hash = input->debug_h_arr[b.obj_idx].v[b.leaf_idx]; if (a_hash == b_hash) { - CV_Leaf a_leaf = cv_debug_t_get_leaf(a_debug_t, a.leaf_idx); - CV_Leaf b_leaf = cv_debug_t_get_leaf(b_debug_t, b.leaf_idx); - Assert(a_leaf.kind == b_leaf.kind); + Assert(cv_debug_t_get_leaf(&input->debug_t_arr[a.obj_idx], a.leaf_idx).kind == cv_debug_t_get_leaf(&input->debug_t_arr[b.obj_idx], b.leaf_idx).kind); is_match = 1; } return is_match; @@ -633,7 +641,7 @@ lnk_hash_cv_leaf(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInf U32 leaf_idx = curr_ti - debug_t->ti_ranges[curr_ti_source].min; U8 *leaf_header = debug_t->data.str + debug_t->offsets[leaf_idx]; memory_write16(leaf_header + OffsetOf(CV_LeafHeader, kind), CV_LeafKind_NOTYPE); - memory_write16(leaf_header + OffsetOf(CV_LeafHeader, size), 0); + memory_write16(leaf_header + OffsetOf(CV_LeafHeader, size), sizeof(CV_LeafKind)); // log error Temp scratch = scratch_begin(0,0); @@ -1130,21 +1138,29 @@ lnk_fixup_cv_type_indices(LNK_MergeTypes *ctx, U32 obj_idx, String8 data, CV_Typ // skip basic types if (ti < ctx->input->min_type_indices[n->source]) { continue; } - U64 ts_idx = ctx->input->obj_to_ts[obj_idx]; - CV_DebugT *debug_t = ts_idx ? &ctx->input->debug_t_arr[ctx->input->ts_obj_range.min + ts_idx] : &ctx->input->debug_t_arr[obj_idx]; + CV_DebugT *debug_t; + if (ctx->input->obj_to_ts[obj_idx] != max_U64) { + U64 ts_idx = ctx->input->obj_to_ts[obj_idx]; + U64 debug_t_idx = ctx->input->ts_obj_range.min + ts_idx; + debug_t = ctx->input->debug_t_arr + debug_t_idx; + } else { + debug_t = ctx->input->debug_t_arr + obj_idx; + } CV_TypeIndex final_ti = 0; if (contains_1u64(debug_t->ti_ranges[n->source], ti)) { LNK_LeafRef leaf_ref = lnk_leaf_ref_from_ti(ctx->input, obj_idx, n->source, ti); LNK_LeafHashTable *leaf_ht = &ctx->leaf_ht_arr[n->source]; LNK_LeafRef *final_leaf = lnk_leaf_hash_table_search(leaf_ht, ctx->input, leaf_ref); - U64 final_hash = u64_hash_from_str8(str8_struct(final_leaf)); - final_ti = lnk_assigned_type_ht_search(ctx->assigned_type_caps [n->source], - ctx->assigned_type_hts [n->source], - ctx->min_type_indices [n->source], - ctx->unique_leaf_refs_arr[n->source], - final_leaf, - final_hash); + if (final_leaf) { + U64 final_hash = u64_hash_from_str8(str8_struct(final_leaf)); + final_ti = lnk_assigned_type_ht_search(ctx->assigned_type_caps [n->source], + ctx->assigned_type_hts [n->source], + ctx->min_type_indices [n->source], + ctx->unique_leaf_refs_arr[n->source], + final_leaf, + final_hash); + } } else { Assert(0 && "invalid type index"); } @@ -1323,7 +1339,7 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) tp_for_parallel(tp, 0, task.indices.count, lnk_hash_debug_t_task, &task); task.indices = input->type_server_indices; - ProfScope("Type Servers [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, task.indices.count))); + ProfScope("Type Servers [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, task.indices.count))) tp_for_parallel(tp, 0, task.indices.count, lnk_hash_debug_t_deep_task, &task); ProfEnd(); @@ -1755,9 +1771,6 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) void *ptr = cv_ptr_from_symbol(symbol); void_list_push(scratch.arena, &global_symbols, ptr); } - } else if (symbol.kind == 0x1176) { - CV_SymKind *kind_ptr = cv_kind_ptr_from_symbol(symbol); - *kind_ptr = CV_SymKind_SKIP; } if (cv_is_scope_symbol(symbol.kind)) { @@ -1840,7 +1853,7 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); for EachNode(n, String8Node, symbols.first) { - for (U64 cursor = 0, symbol_cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { CV_Symbol symbol = {0}; TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); @@ -1857,35 +1870,26 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) barrier_wait(tp->barrier); if (task_id == 0) { - // take into account arena header - for EachIndex(i, tp->worker_count) { task->proc_ref_sizes[i] += ARENA_HEADER_SIZE; } - U64 total_proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); - // prealloc output buffer for the proc refs - task->proc_refs.size = sum_array_u64(tp->worker_count, task->proc_ref_sizes); - task->proc_refs.str = push_array(gsi->arena, U8, task->proc_refs.size); task->proc_ref_hashes = push_array(scratch.arena, U64, total_proc_ref_count); - task->proc_ref_offs = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_sizes, tp->worker_count); task->proc_ref_indices = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_counts, tp->worker_count); - - task->proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); - task->proc_ref_nodes = push_array(gsi->arena, CV_SymbolNode, task->proc_ref_count); + task->proc_ref_arenas = alloc_arena_many(gsi->arena, tp->worker_count, task->proc_ref_sizes); + task->proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); + task->proc_ref_nodes = push_array(gsi->arena, CV_SymbolNode, task->proc_ref_count); } barrier_wait(tp->barrier); - U64 proc_refs_size = task->proc_ref_sizes[task_id]; - U64 proc_refs_off = task->proc_ref_offs[task_id]; U64 proc_ref_idx = task->proc_ref_indices[task_id]; - U8 *proc_refs = task->proc_refs.str + proc_refs_off; - Arena *proc_ref_arena = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .optional_backing_buffer = proc_refs, .reserve_size = proc_refs_size, .commit_size = proc_refs_size }); + Arena *proc_ref_arena = task->proc_ref_arenas[task_id]; for EachIndex(i, obj_indices.count) { - U64 obj_idx = obj_indices.v[i]; - CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; - String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); - CV_ModIndex imod = task->mod_arr[obj_idx]->imod; + U64 obj_idx = obj_indices.v[i]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + CV_ModIndex imod = task->mod_arr[obj_idx]->imod; + U64 symbol_cursor = sizeof(CV_Signature); for EachNode(n, String8Node, symbols.first) { - for (U64 cursor = 0, symbol_cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { CV_Symbol symbol = {0}; TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); if (symbol.kind == CV_SymKind_SKIP) { continue; } @@ -1944,25 +1948,16 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) barrier_wait(tp->barrier); if (task_id == 0) { - for EachIndex(i, tp->worker_count) { task->public_symbol_sizes[i] += ARENA_HEADER_SIZE; } - U64 public_symbol_buffer_size = sum_array_u64(tp->worker_count, task->public_symbol_sizes); - task->public_symbol_offs = offsets_from_counts_array_u64(scratch.arena, task->public_symbol_sizes, tp->worker_count); - task->public_symbol_buffer = push_array(task->pdb->psi->arena, U8, public_symbol_buffer_size); - U64 public_symbol_total_count = sum_array_u64(tp->worker_count, task->public_symbol_node_counts); - task->public_symbol_node_offsets = offsets_from_counts_array_u64(scratch.arena, task->public_symbol_node_counts, tp->worker_count); - task->public_symbol_nodes = push_array(psi->gsi->arena, CV_SymbolNode, public_symbol_total_count); - task->public_symbols = push_array(scratch.arena, CV_SymbolList, tp->worker_count); - task->public_symbol_hashes = push_array(scratch.arena, U32 *, tp->worker_count); + task->public_symbol_arenas = alloc_arena_many(psi->gsi->arena, tp->worker_count, task->public_symbol_sizes); + task->public_symbol_node_arenas = alloc_arena_array(psi->gsi->arena, tp->worker_count, task->public_symbol_node_counts, CV_SymbolNode); + task->public_symbols = push_array(scratch.arena, CV_SymbolList, tp->worker_count); + task->public_symbol_hashes = push_array(scratch.arena, U32 *, tp->worker_count); } barrier_wait(tp->barrier); // make CV public symbols - U64 public_symbol_buffer_chunk_size = task->public_symbol_sizes[task_id]; - U8 *public_symbol_buffer_chunk = task->public_symbol_buffer + task->public_symbol_offs[task_id]; - Arena *public_symbol_arena = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .optional_backing_buffer = public_symbol_buffer_chunk, .reserve_size = public_symbol_buffer_chunk_size, .commit_size = public_symbol_buffer_chunk_size }); for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { - U64 node_idx = task->public_symbol_node_offsets[task_id]; for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); @@ -1975,11 +1970,8 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) CV_Pub32Flags flags = COFF_SymbolType_IsFunc(symbol_parsed.type) ? CV_Pub32Flag_Function : 0; ISectOff sc = lnk_sc_from_symbol(symbol); - CV_Symbol pub_symbol = cv_make_pub32(public_symbol_arena, flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); - - task->public_symbol_nodes[node_idx].data = pub_symbol; - cv_symbol_list_push_node(&task->public_symbols[task_id], &task->public_symbol_nodes[node_idx]); - node_idx += 1; + CV_Symbol pub_symbol = cv_make_pub32(task->public_symbol_arenas[task_id], flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); + cv_symbol_list_push(task->public_symbol_node_arenas[task_id], &task->public_symbols[task_id], pub_symbol); } } barrier_wait(tp->barrier); @@ -1998,11 +1990,11 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // insert public symbols into PSI if (task_id == 0) { for EachIndex(i, tp->worker_count) { - U64 curr_idx = 0; - for (CV_SymbolNode *curr = task->public_symbols[i].first, *next = 0; curr != 0; curr = next) { + U64 k = 0; + for (CV_SymbolNode *curr = task->public_symbols[i].first, *next = 0; curr != 0; curr = next, k += 1) { next = curr->next; - gsi_push_(psi->gsi, task->public_symbol_hashes[i][curr_idx], curr); - curr_idx += 1; + curr->next = 0; + gsi_push_(psi->gsi, task->public_symbol_hashes[i][k], curr); } } } @@ -2023,15 +2015,26 @@ lnk_write_debug_s_to_pdb_module(PDB_DbiModule *mod, CV_DebugS debug_s, String8No mod->globrefs_size = 0; // signature - mod_cursor += str8_buffer_write_u32(buf, buf_pos, CV_Signature_C13); + U64 sig_size = str8_buffer_write_u32(buf, buf_pos, CV_Signature_C13); + mod->sym_data_size += sig_size; + mod_cursor += sig_size; // write symbols String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + U64 scope_depth = 0; for EachNode(n, String8Node, symbols.first) { for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { CV_Symbol symbol = {0}; TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); if (symbol.kind == CV_SymKind_SKIP) { continue; } + + if (cv_is_global_symbol(symbol.kind)) { continue; } + else if (cv_is_typedef(symbol.kind) && scope_depth == 0) { continue; } + else if (symbol.kind == 0x1176) { continue; } + + if (cv_is_scope_symbol(symbol.kind)) { scope_depth += 1; } + else if (cv_is_end_symbol(symbol.kind)) { scope_depth -= 1; } + U64 symbol_size = cv_write_symbol_buf(buf, buf_pos, &symbol, PDB_SYMBOL_ALIGN); mod_cursor += symbol_size; mod->sym_data_size += symbol_size; @@ -2039,19 +2042,19 @@ lnk_write_debug_s_to_pdb_module(PDB_DbiModule *mod, CV_DebugS debug_s, String8No } // write file checksums, inlinee lines etc. - CV_C13SubSectionIdxKind mod_c13_layout[] = { - CV_C13SubSectionIdxKind_FileChksms, - CV_C13SubSectionIdxKind_FrameData, - CV_C13SubSectionIdxKind_InlineeLines, - CV_C13SubSectionIdxKind_CrossScopeImports, - CV_C13SubSectionIdxKind_CrossScopeExports, - CV_C13SubSectionIdxKind_IlLines, - CV_C13SubSectionIdxKind_FuncMDTokenMap, - CV_C13SubSectionIdxKind_TypeMDTokenMap, - CV_C13SubSectionIdxKind_MergedAssemblyInput, - CV_C13SubSectionIdxKind_CoffSymbolRVA, - CV_C13SubSectionIdxKind_XfgHashType, - CV_C13SubSectionIdxKind_XfgHashVirtual, + CV_C13SubSectionKind mod_c13_layout[] = { + CV_C13SubSectionKind_FileChksms, + CV_C13SubSectionKind_FrameData, + CV_C13SubSectionKind_InlineeLines, + CV_C13SubSectionKind_CrossScopeImports, + CV_C13SubSectionKind_CrossScopeExports, + CV_C13SubSectionKind_IlLines, + CV_C13SubSectionKind_FuncMDTokenMap, + CV_C13SubSectionKind_TypeMDTokenMap, + CV_C13SubSectionKind_MergedAssemblyInput, + CV_C13SubSectionKind_CoffSymbolRVA, + CV_C13SubSectionKind_XfgHashType, + CV_C13SubSectionKind_XfgHashVirtual, }; for EachElement(i, mod_c13_layout) { String8List data = cv_sub_section_from_debug_s(debug_s, mod_c13_layout[i]); @@ -2059,7 +2062,7 @@ lnk_write_debug_s_to_pdb_module(PDB_DbiModule *mod, CV_DebugS debug_s, String8No U64 ss_size = 0; ss_size += str8_buffer_write(buf, buf_pos, str8_struct((&(CV_C13SubSectionHeader ){ .kind = mod_c13_layout[i], .size = safe_cast_u32(data.total_size) }))); ss_size += str8_buffer_write_string_list(buf, buf_pos, data); - ss_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(mod_cursor, CV_C13SubSectionAlign)); + ss_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(mod_cursor + ss_size, CV_C13SubSectionAlign)); mod_cursor += ss_size; mod->c13_data_size += ss_size; } @@ -2071,18 +2074,16 @@ lnk_write_debug_s_to_pdb_module(PDB_DbiModule *mod, CV_DebugS debug_s, String8No U64 ss_size = 0; ss_size += str8_buffer_write(buf, buf_pos, str8_struct((&(CV_C13SubSectionHeader){ .kind = CV_C13SubSectionKind_Lines, .size = safe_cast_u32(n->string.size) }))); ss_size += str8_buffer_write(buf, buf_pos, n->string); - ss_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(mod_cursor, CV_C13SubSectionAlign)); + ss_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(mod_cursor + ss_size, CV_C13SubSectionAlign)); mod_cursor += ss_size; mod->c13_data_size += ss_size; } // write global refs String8List globrefs = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_GlobalRefs); - U64 globrefs_size = 0; - globrefs_size += str8_buffer_write_u32(buf, buf_pos, safe_cast_u32(globrefs.total_size)); - globrefs_size += str8_buffer_write_string_list(buf, buf_pos, globrefs); - mod_cursor += globrefs_size; - mod->globrefs_size += globrefs_size; + mod->globrefs_size += str8_buffer_write_u32(buf, buf_pos, safe_cast_u32(globrefs.total_size)); + mod->globrefs_size += str8_buffer_write_string_list(buf, buf_pos, globrefs); + mod_cursor += mod->globrefs_size; return mod_cursor; } @@ -2118,41 +2119,114 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) for EachIndex(i, obj_indices.count) { Temp temp = temp_begin(scratch.arena); - U64 obj_idx = obj_indices.v[i]; - PDB_DbiModule *mod = task->mod_arr[obj_idx]; - CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + U64 obj_idx = obj_indices.v[i]; + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8List mod_data = msf_data_from_sn(temp.arena, task->pdb->msf, mod->sn); - String8List mod_pages = msf_raw_pages_from_sn(temp.arena, task->pdb->msf, mod->sn); - if (mod_pages.node_count == 0) { continue; } + if (mod_data.node_count) { + String8Node buf = *mod_data.first; + U64 pos = 0; + lnk_write_debug_s_to_pdb_module(mod, debug_s, &buf, &pos); - String8Node buf = *mod_pages.first; - U64 pos = 0; - lnk_write_debug_s_to_pdb_module(mod, debug_s, &buf, &pos); - - // sub range symbol data pages and patch symbol tree offsets - String8List mod_symbols = str8_list_substr(temp.arena, mod_pages, r1u64(sizeof(CV_Signature), sizeof(CV_Signature) + mod->sym_data_size)); - cv_patch_symbol_tree_offsets_new(mod_symbols, sizeof(CV_Signature), PDB_SYMBOL_ALIGN); + // sub range symbol data pages and patch symbol tree offsets + Rng1U64 sym_data_range = r1u64(sizeof(CV_Signature), mod->sym_data_size); + String8List mod_symbols = str8_list_substr(temp.arena, mod_data, sym_data_range); + Assert(mod_symbols.total_size == dim_1u64(sym_data_range)); + cv_patch_symbol_tree_offsets(mod_symbols, sizeof(CV_Signature), PDB_SYMBOL_ALIGN); + } temp_end(temp); } barrier_wait(tp->barrier); - for EachIndex(i, obj_indices.count) { - U64 obj_idx = obj_indices.v[i]; - CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; - String8 string_table = cv_string_table_from_debug_s(debug_s); - String8List file_chksms_raw = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); - CV_ChecksumList file_chksms = cv_c13_parse_checksum_data_list(scratch.arena, file_chksms_raw); - String8List src_file_names = cv_c13_collect_source_file_names(arena, file_chksms, string_table); + { + // count strings in string tables + { + if (task_id == 0) { + task->string_counts = push_array(scratch.arena, U64, tp->worker_count); + } + barrier_wait(tp->barrier); - // collect source files module refs - str8_list_concat_in_place(&task->mod_arr[obj_idx]->source_file_list, &src_file_names); + for EachIndex(i, obj_indices.count) { + U64 obj_idx = obj_indices.v[i]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8 string_table = cv_string_table_from_debug_s(debug_s); + U64 string_count = 0; + for (U64 cursor = 0; cursor < string_table.size; cursor += 1) { + if (string_table.str[cursor] == '\0') { + task->string_counts[task_id] += 1; + } + } + } + barrier_wait(tp->barrier); + } - // patch path offsets in file checksum headers (in obj the offsets point to a string table in .debug$S, - // and because linker merges string tables the old offsets need to be fixed up) - cv_c13_patch_string_offsets_in_checksum_list(file_chksms, string_table, task->pdb->info->strtab.size, task->string_ht); + if (task_id == 0) { + task->string_arenas = alloc_arena_array(task->pdb->dbi->arena, tp->worker_count, task->string_counts, String8Node); + } + barrier_wait(tp->barrier); + + for EachIndex(i, obj_indices.count) { + Temp temp = temp_begin(scratch.arena); + + U64 obj_idx = obj_indices.v[i]; + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + String8List mod_data = msf_data_from_sn(temp.arena, task->pdb->msf, mod->sn); + Rng1U64 c13_data_range = r1u64(mod->sym_data_size + mod->c11_data_size, mod->sym_data_size + mod->c11_data_size + mod->c13_data_size); + String8List c13_data = str8_list_substr(temp.arena, mod_data, c13_data_range); + + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8 string_table = cv_string_table_from_debug_s(debug_s); + + // checksum is always at the head of C13 data + String8List file_chksms_raw = {0}; + { + String8Node buf = *c13_data.first; + U64 buf_pos = 0; + + CV_C13SubSectionHeader header = {0}; + str8_buffer_read(&buf, &buf_pos, sizeof(header), &header); + + if (header.kind == CV_C13SubSectionKind_FileChksms) { + Rng1U64 file_chksms_range = r1u64(sizeof(CV_C13SubSectionHeader), sizeof(CV_C13SubSectionHeader) + header.size); + file_chksms_raw = str8_list_substr(temp.arena, c13_data, file_chksms_range); + } + } + + // fixup file name offsets in checksum headers + if (file_chksms_raw.total_size) { + String8Node buf = *file_chksms_raw.first; + U64 buf_pos = 0; + U64 cursor = 0; + for (;;) { + CV_C13Checksum header = {0}; + if (str8_buffer_peek(&buf, &buf_pos, sizeof(header), &header) != sizeof(header)) { break; } + + String8 name = str8_cstring_capped(string_table.str + header.name_off, string_table.str + string_table.size); + CV_StringBucket *bucket = cv_string_hash_table_lookup(task->string_ht, name); + U64 name_off = task->pdb->info->strtab.size + bucket->u.offset; + + // update name offset + { + String8Node buf_copy = buf; + U64 buf_pos_copy = buf_pos; + str8_buffer_skip(&buf_copy, &buf_pos_copy, OffsetOf(CV_C13Checksum, name_off)); + str8_buffer_write_u32(&buf_copy, &buf_pos_copy, safe_cast_u32(name_off)); + } + + str8_buffer_skip(&buf, &buf_pos, AlignPow2(sizeof(header) + header.len, CV_FileCheckSumsAlign)); + } + } + + // collect mod source files + String8List source_file_list = str8_split_by_string_chars(task->string_arenas[task_id], string_table, str8_lit("\0"), 0); + str8_list_concat_in_place(&mod->source_file_list, &source_file_list); + + temp_end(temp); + } + barrier_wait(tp->barrier); } - barrier_wait(tp->barrier); scratch_end(scratch); } @@ -2275,7 +2349,6 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config ProfBegin("Merge String Tables"); task.string_ht = cv_dedup_string_tables(tp_arena, tp, cv->obj_count, cv->debug_s_arr); cv_string_hash_table_assign_buffer_offsets(tp, task.string_ht); - pdb_strtab_add_cv_string_hash_table(&task.pdb->info->strtab, task.string_ht); ProfEnd(); ProfScope ("Alloc Modules") for EachIndex(obj_idx, cv->obj_count) { task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, cv->obj_arr[obj_idx]->path, lnk_obj_get_lib_path(cv->obj_arr[obj_idx])); } @@ -2290,6 +2363,10 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); } ProfScope("Write Modules") tp_for_parallel(tp, 0, tp->worker_count, lnk_write_pdb_modules, &task); + + ProfBegin("Add string tables"); + pdb_strtab_add_cv_string_hash_table(&task.pdb->info->strtab, task.string_ht); + ProfEnd(); ProfBegin("Build Section Contrib Map"); { diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 31b42819..1591d0a8 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -130,7 +130,7 @@ typedef struct typedef struct { - String8 image_data; + String8 image_data; LNK_SymbolTable *symtab; LNK_CodeViewInput *cv; @@ -155,25 +155,23 @@ typedef struct U64 *proc_ref_counts; // [worker_count] U64 *proc_ref_sizes; // [worker_count] U64 *proc_ref_hashes; // [total_proc_ref_count] - U64 *proc_ref_offs; // [worker_count] U64 *proc_ref_indices; // [worker_count] String8 proc_refs; U64 proc_ref_count; CV_SymbolNode *proc_ref_nodes; // [proc_ref_count] - Arena *proc_ref_arena; + Arena **proc_ref_arenas; U64 *public_symbol_sizes; // [worker_count] - U64 *public_symbol_offs; // [worker_count] - U8 *public_symbol_buffer; + Arena **public_symbol_arenas; + Arena **public_symbol_node_arenas; U64 *public_symbol_node_counts; // [worker_count] - U64 *public_symbol_node_offsets; // [worker_count] - CV_SymbolNode *public_symbol_nodes; // [public_symbol_total_count] CV_SymbolList *public_symbols; // [worker_count] U32 **public_symbol_hashes; // [worker_count][public_symbol.count] // process C13 data - String8List *source_file_names_list_arr; CV_StringHashTable string_ht; + U64 *string_counts; + Arena **string_arenas; // push DBI SC Map PE_BinInfo pe; diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index b128b177..90bf0464 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -302,14 +302,16 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) String8 debug_s_data = str8_substr(input->data, rng_1u64(sect_header->foff, sect_header->foff+sect_header->fsize)); CV_DebugS debug_s = cv_debug_s_from_data(temp.arena, debug_s_data); for EachNode(symbols_n, String8Node, debug_s.data_list[CV_C13SubSectionIdxKind_Symbols].first) { - CV_SymbolList symbol_list = {0}; - cv_parse_symbol_sub_section_capped(scratch.arena, &symbol_list, 0, symbols_n->string, CV_SymbolAlign, 2); - if (symbol_list.first->data.kind == CV_SymKind_COMPILE3) { - comp_symbol = symbol_list.first->data; - goto found_comp_symbol; - } else if (symbol_list.last->data.kind == CV_SymKind_COMPILE3) { - comp_symbol = symbol_list.last->data; - goto found_comp_symbol; + for (U64 cursor = 0, count = 0; cursor < symbols_n->string.size && count < 2; count += 1) { + CV_SymbolHeader symbol_header; + TryReadBreak(str8_deserial_read_struct(symbols_n->string, cursor, &symbol_header), cursor); + if (symbol_header.kind == CV_SymKind_COMPILE3) { + String8 raw_symbol = str8_substr(symbols_n->string, r1u64(cursor, cursor + symbol_header.size + sizeof(CV_SymSize))); + comp_symbol = cv_symbol_from_ptr(raw_symbol.str); + goto found_comp_symbol; + } + cursor += symbol_header.size + sizeof(CV_SymSize); + cursor = AlignPow2(cursor, CV_SymbolAlign); } } temp_end(temp); diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index 6d82d45d..fbbe28e0 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -830,8 +830,8 @@ msf_stream_resize_ex(MSF_Context *msf, MSF_Stream *stream, MSF_UInt size) } // update stream - stream->size = Min(stream->size, stream->page_list.count * msf->page_size); - stream->pos = Min(stream->pos, stream->size); + stream->size = size; + stream->pos = Min(stream->pos, stream->size); stream->pos_page = 0; return 1; @@ -1212,26 +1212,40 @@ msf_stream_write_string_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNum } internal String8List -msf_raw_pages_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) +msf_data_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) { String8List result = {0}; MSF_Stream *stream = msf_find_stream(msf, sn); String8 acc = {0}; - for EachNode(n, MSF_PageNode, stream->page_list.first) { - String8 p = msf_data_from_pn(msf->page_data_list, msf->page_size, n->pn); - if (acc.str + acc.size == p.str) { - acc.size += p.size; + + MSF_PageNode *n; + for (n = stream->page_list.first; n != stream->page_list.last; n = n->next) { + String8 page = msf_data_from_pn(msf->page_data_list, msf->page_size, n->pn); + + if (acc.str + acc.size != page.str) { + if (acc.size > 0) { + str8_list_push(arena, &result, acc); + } + acc = page; } else { - str8_list_push(arena, &result, acc); - acc = p; + acc.size += page.size; } } - if (result.node_count && result.last->string.str + result.last->string.size == acc.str) { - result.last->string.size += acc.size; - } else { - str8_list_push(arena, &result, acc); + if (n) { + String8 page = msf_data_from_pn(msf->page_data_list, msf->page_size, n->pn); + if (acc.str + acc.size != page.str) { + acc = page; + } else { + acc.size += page.size; + } + + acc.size = Min(stream->size - result.total_size, acc.size); + + if (acc.size > 0) { + str8_list_push(arena, &result, acc); + } } return result; diff --git a/src/linker/pdb_ext/msf_builder.h b/src/linker/pdb_ext/msf_builder.h index ebbdc1f1..7364cf7f 100644 --- a/src/linker/pdb_ext/msf_builder.h +++ b/src/linker/pdb_ext/msf_builder.h @@ -188,7 +188,7 @@ internal B32 msf_stream_write_parallel(TP_Context *tp, MSF_Context *msf, MSF_Str #define msf_stream_write_array(m, s, v, c) msf_stream_write(m, s, (void*)(v), sizeof(*(v)) * (c)) #define msf_stream_write_struct(m, s, v ) msf_stream_write_array(m, s, v, 1) -internal String8List msf_raw_pages_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn); +internal String8List msf_data_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn); internal MSF_UInt msf_count_pages(MSF_UInt page_size, U64 data_size); internal MSF_PageNumber msf_get_page_count_cap(MSF_PageDataList page_data_list, MSF_UInt page_size); From c853082e61635ba9e61d3a957c500ab1d919366f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 19:54:58 -0700 Subject: [PATCH 319/850] test cyclic type detection --- src/torture/torture_radlink.c | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 86725808..9eb1eefc 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4615,6 +4615,43 @@ T_BeginTest(merge_duplicate_types) } T_EndTest; +T_BeginTest(cyclic_type) +{ + String8List *debug_t = push_array(scratch.arena, String8List, 1); + str8_serial_begin(scratch.arena, debug_t); + str8_serial_push_u32(scratch.arena, debug_t, CV_Signature_C13); + str8_serial_push_string(scratch.arena, debug_t, cv_make_leaf(scratch.arena, CV_LeafKind_POINTER, str8_struct((&(CV_LeafPointer){ .itype = 0x1001 })), CV_LeafAlign)); + str8_serial_push_string(scratch.arena, debug_t, cv_make_leaf(scratch.arena, CV_LeafKind_POINTER, str8_struct((&(CV_LeafPointer){ .itype = 0x1000 })), CV_LeafAlign)); + + CV_DebugS debug_s = {0}; + str8_list_push(scratch.arena, &debug_s.data_list[CV_C13SubSectionIdxKind_Symbols], cv_make_symbol(scratch.arena, CV_SymKind_GPROC32, cv_make_proc32(scratch.arena, (CV_SymProc32){ .itype = 0x1001 }, str8_lit("foo")))); + String8List debug_s_string = cv_data_from_debug_s_c13(scratch.arena, &debug_s, 1); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_serial_end(scratch.arena, debug_t)); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_list_join(scratch.arena, &debug_s_string, 0)); + String8 raw_coff = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_entry_obj()); + T_Ok(t_write_file(str8_lit("cycle.obj"), raw_coff)); + + String8 cmd_line = str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full cycle.obj entry.obj"); + String8 output = {0}; + t_invoke_(t_radlink_path(), cmd_line, max_U64, scratch.arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 is_cycle_detected = 0; + while (output.size && !is_cycle_detected) { + is_cycle_detected = t_match_linef(&output, + "Error(043): %S: LF_POINTER(type_index: 0x1000) forward refs member type index 0x1001 (leaf struct offset: 0x0)", + t_make_file_path(scratch.arena, str8_lit("cycle.obj"))); + t_chop_line(&output); + } + T_Ok(is_cycle_detected); +} +T_EndTest; + T_BeginTest(get_msf_stream_pages) { MSF_Context *msf = msf_alloc(MSF_DEFAULT_PAGE_SIZE, MSF_DEFAULT_FPM); From 99335959b09df9e4734a83312cb266e9ecffabca Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 20:13:25 -0700 Subject: [PATCH 320/850] ignore invalid type index errors in release --- src/linker/lnk.c | 5 +++-- src/torture/torture_radlink.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 68c061bd..cb7e5f3b 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -195,8 +195,9 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) } #endif - // in release build ignore unknown switches - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Warning_UnknownSwitch * (BUILD_DEBUG * -1)); + // errors that are too verbose in release build + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Warning_UnknownSwitch * (BUILD_DEBUG * -1)); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Error_InvalidTypeIndex * (BUILD_DEBUG * -1)); return cmd_line; } diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 9eb1eefc..90df9e12 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4636,7 +4636,7 @@ T_BeginTest(cyclic_type) T_Ok(t_write_entry_obj()); T_Ok(t_write_file(str8_lit("cycle.obj"), raw_coff)); - String8 cmd_line = str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full cycle.obj entry.obj"); + String8 cmd_line = str8f(scratch.arena, "/subsystem:console /entry:entry /out:a.exe /debug:full /rad_ignore:-%u cycle.obj entry.obj", LNK_Error_InvalidTypeIndex); String8 output = {0}; t_invoke_(t_radlink_path(), cmd_line, max_U64, scratch.arena, &output); T_Ok(g_last_exit_code == 0); From ef712a36e7366dfcb841d20ebee0181872b70ce7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 20:40:20 -0700 Subject: [PATCH 321/850] minor bugfix --- src/linker/lnk_debug_info.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 9d4696c1..89c41ef3 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1896,10 +1896,10 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - CV_SymbolNode *n = &task->proc_ref_nodes[proc_ref_idx++]; + CV_SymbolNode *n = &task->proc_ref_nodes[proc_ref_idx]; n->data = cv_make_proc_ref(proc_ref_arena, imod, symbol_cursor, name, cv_is_lproc(symbol)); - task->proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&n->data); + proc_ref_idx += 1; } symbol_cursor += cv_write_symbol_buf(0, 0, &symbol, PDB_SYMBOL_ALIGN); From e9ac0abdf9bfdf1d27e6f22623c7d591733b4516 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 20:53:34 -0700 Subject: [PATCH 322/850] thread broadcast --- src/linker/thread_pool/thread_pool.c | 14 ++++++++++++++ src/linker/thread_pool/thread_pool.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/src/linker/thread_pool/thread_pool.c b/src/linker/thread_pool/thread_pool.c index 0be6a35e..f7b2883f 100644 --- a/src/linker/thread_pool/thread_pool.c +++ b/src/linker/thread_pool/thread_pool.c @@ -245,3 +245,17 @@ tp_divide_work(Arena *arena, U64 item_count, U32 worker_count) return range_arr; } + +internal void * +tp_broadcast_(TP_Context *tp, U64 task_id, void *ptr) +{ + if (task_id == 0) { + tp->broadcast = ptr; + } + barrier_wait(tp->barrier); + + void *result = tp->broadcast; + barrier_wait(tp->barrier); + + return result; +} diff --git a/src/linker/thread_pool/thread_pool.h b/src/linker/thread_pool/thread_pool.h index 6d338a8f..7797e9ce 100644 --- a/src/linker/thread_pool/thread_pool.h +++ b/src/linker/thread_pool/thread_pool.h @@ -33,6 +33,7 @@ typedef struct TP_Context Semaphore task_semaphore; Semaphore main_semaphore; Barrier barrier; + void *broadcast; U32 worker_count; TP_Worker *worker_arr; @@ -54,4 +55,5 @@ internal void tp_temp_end(TP_Temp temp); #define tp_for_parallel_prof(pool, arena, task_count, task_func, task_data, zone_name) ProfBegin(zone_name); tp_for_parallel(pool, arena, task_count, task_func, task_data); ProfEnd(); internal void tp_for_parallel(TP_Context *pool, TP_Arena *arena, U64 task_count, TP_TaskFunc *task_func, void *task_data); internal Rng1U64 * tp_divide_work(Arena *arena, U64 item_count, U32 worker_count); +#define tp_broadcast(p) *(p) = tp_broadcast_(tp, task_id, *(p)) From 129f0326f7b912078f03f9e1b5fb9c21ba9e8da5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 21:21:28 -0700 Subject: [PATCH 323/850] use thread broadcasts to simplify global symbol mover --- src/linker/lnk_debug_info.c | 190 +++++++++++++++++++++--------------- src/linker/lnk_debug_info.h | 52 ++-------- 2 files changed, 116 insertions(+), 126 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 89c41ef3..078232be 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1756,6 +1756,12 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // { // collect global data and global typedefs + U64 *global_symbol_count = 0; + if (task_id == 0) { + global_symbol_count = push_array(scratch.arena, U64, 1); + } + tp_broadcast(&global_symbol_count); + VoidList global_symbols = {0}; for EachInRange(i, task->cv->symbol_input_ranges[task_id]) { LNK_SymbolInput symbols = task->cv->symbol_inputs[i]; @@ -1781,59 +1787,65 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) } } } - ins_atomic_u64_add_eval(&task->global_symbol_count, global_symbols.count); + ins_atomic_u64_add_eval(global_symbol_count, global_symbols.count); barrier_wait(tp->barrier); + U64 *bucket_cap; + void **buckets; + U64 *symbol_count; if (task_id == 0) { - task->bucket_cap = (U64)((F64)task->global_symbol_count * 1.3); - task->buckets = push_array(scratch.arena, void *, task->bucket_cap); + bucket_cap = push_u64(scratch.arena, *global_symbol_count * 13 / 10); + buckets = push_array(scratch.arena, void *, *bucket_cap); + symbol_count = push_array(scratch.arena, U64, 1); } - barrier_wait(tp->barrier); + tp_broadcast(&bucket_cap); + tp_broadcast(&buckets); + tp_broadcast(&symbol_count); // insert symbols into hash table for EachNode(n, VoidNode, global_symbols.first) { - String8 raw = cv_raw_from_symbol(n->v); - U64 hash = u64_hash_from_str8(raw); - cv_symbol_deduper_insert_or_update(task->buckets, task->bucket_cap, hash, n->v); + String8 raw = cv_raw_from_symbol(n->v); + U64 hash = u64_hash_from_str8(raw); + cv_symbol_deduper_insert_or_update(buckets, *bucket_cap, hash, n->v); } barrier_wait(tp->barrier); - // compact buckets + void **symbol_arr; + Rng1U64 *symbol_ranges; // [worker_count] + U32 *symbol_hashes; // [symbol_count] if (task_id == 0) { - for (U64 i = 1; i < task->bucket_cap; i += 1) { - if (task->buckets[i] != 0 && task->buckets[i-1] == 0) { - while (task->buckets[task->symbol_count] != 0) { task->symbol_count += 1; } - task->buckets[task->symbol_count] = task->buckets[i]; - task->buckets[i] = 0; + // compact buckets + for (U64 i = 1; i < *bucket_cap; i += 1) { + if (buckets[i] != 0 && buckets[i-1] == 0) { + while (buckets[*symbol_count] != 0) { *symbol_count += 1; } + buckets[*symbol_count] = buckets[i]; + buckets[i] = 0; } } - - task->symbol_arr = task->buckets; - - // divide symbol per worker - task->symbol_ranges = tp_divide_work(scratch.arena, task->symbol_count, tp->worker_count); - - // alloc memory for hashes - task->symbol_hashes = push_array_no_zero(scratch.arena, U32, task->symbol_count); + symbol_arr = buckets; + symbol_ranges = tp_divide_work(scratch.arena, *symbol_count, tp->worker_count); + symbol_hashes = push_array_no_zero(scratch.arena, U32, *symbol_count); } - barrier_wait(tp->barrier); + tp_broadcast(&symbol_arr); + tp_broadcast(&symbol_ranges); + tp_broadcast(&symbol_hashes); // hash symbols - for EachInRange(i, task->symbol_ranges[task_id]) { - CV_Symbol symbol = cv_symbol_from_ptr(task->symbol_arr[i]); + for EachInRange(i, symbol_ranges[task_id]) { + CV_Symbol symbol = cv_symbol_from_ptr(symbol_arr[i]); String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - task->symbol_hashes[i] = gsi_hash(gsi, name); + symbol_hashes[i] = gsi_hash(gsi, name); } barrier_wait(tp->barrier); // push global symbols if (task_id == 0) { - CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, task->symbol_count); - for EachIndex(i, task->symbol_count) { + CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, *symbol_count); + for EachIndex(i, *symbol_count) { CV_SymbolNode *n = &nodes[i]; n->prev = n->next = 0; - n->data = cv_symbol_from_ptr(task->symbol_arr[i]); - gsi_push_(gsi, task->symbol_hashes[i], n); + n->data = cv_symbol_from_ptr(symbol_arr[i]); + gsi_push_(gsi, symbol_hashes[i], n); } } } @@ -1842,11 +1854,14 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // proc refs // { + U64 *proc_ref_sizes; + U64 *proc_ref_counts; if (task_id == 0) { - task->proc_ref_sizes = push_array(scratch.arena, U64, tp->worker_count); - task->proc_ref_counts = push_array(scratch.arena, U64, tp->worker_count); + proc_ref_sizes = push_array(scratch.arena, U64, tp->worker_count); + proc_ref_counts = push_array(scratch.arena, U64, tp->worker_count); } - barrier_wait(tp->barrier); + tp_broadcast(&proc_ref_sizes); + tp_broadcast(&proc_ref_counts); for EachIndex(i, obj_indices.count) { U64 obj_idx = obj_indices.v[i]; @@ -1859,29 +1874,34 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - task->proc_ref_sizes[task_id] += sizeof(CV_SymRef2); - task->proc_ref_sizes[task_id] += name.size + 1; - task->proc_ref_sizes[task_id] = AlignPow2(task->proc_ref_sizes[task_id], sizeof(void *)); - task->proc_ref_counts[task_id] += 1; + proc_ref_sizes[task_id] += sizeof(CV_SymRef2); + proc_ref_sizes[task_id] += name.size + 1; + proc_ref_sizes[task_id] = AlignPow2(proc_ref_sizes[task_id], sizeof(void *)); + proc_ref_counts[task_id] += 1; } } } } barrier_wait(tp->barrier); + U64 *proc_ref_hashes; + U64 *proc_ref_indices; + Arena **proc_ref_arenas; + CV_SymbolNode *proc_ref_nodes; if (task_id == 0) { - U64 total_proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); - task->proc_ref_hashes = push_array(scratch.arena, U64, total_proc_ref_count); - task->proc_ref_indices = offsets_from_counts_array_u64(scratch.arena, task->proc_ref_counts, tp->worker_count); - task->proc_ref_arenas = alloc_arena_many(gsi->arena, tp->worker_count, task->proc_ref_sizes); - task->proc_ref_count = sum_array_u64(tp->worker_count, task->proc_ref_counts); - task->proc_ref_nodes = push_array(gsi->arena, CV_SymbolNode, task->proc_ref_count); + U64 total_proc_ref_count = sum_array_u64(tp->worker_count, proc_ref_counts); + proc_ref_hashes = push_array(scratch.arena, U64, total_proc_ref_count); + proc_ref_indices = offsets_from_counts_array_u64(scratch.arena, proc_ref_counts, tp->worker_count); + proc_ref_arenas = alloc_arena_many(gsi->arena, tp->worker_count, proc_ref_sizes); + proc_ref_nodes = push_array(gsi->arena, CV_SymbolNode, total_proc_ref_count); } - barrier_wait(tp->barrier); - - U64 proc_ref_idx = task->proc_ref_indices[task_id]; - Arena *proc_ref_arena = task->proc_ref_arenas[task_id]; + tp_broadcast(&proc_ref_hashes); + tp_broadcast(&proc_ref_indices); + tp_broadcast(&proc_ref_arenas); + tp_broadcast(&proc_ref_nodes); + U64 proc_ref_idx = proc_ref_indices[task_id]; + Arena *proc_ref_arena = proc_ref_arenas[task_id]; for EachIndex(i, obj_indices.count) { U64 obj_idx = obj_indices.v[i]; CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; @@ -1895,10 +1915,9 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) if (symbol.kind == CV_SymKind_SKIP) { continue; } if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { - String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - CV_SymbolNode *n = &task->proc_ref_nodes[proc_ref_idx]; - n->data = cv_make_proc_ref(proc_ref_arena, imod, symbol_cursor, name, cv_is_lproc(symbol)); - task->proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&n->data); + String8 name = cv_name_from_symbol(symbol.kind, symbol.data); + proc_ref_nodes[proc_ref_idx].data = cv_make_proc_ref(proc_ref_arena, imod, symbol_cursor, name, cv_is_lproc(symbol)); + proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&proc_ref_nodes[proc_ref_idx].data); proc_ref_idx += 1; } @@ -1910,9 +1929,8 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // push proc refs if (task_id == 0) { - for EachIndex(i, task->proc_ref_count) { - gsi_push_(gsi, task->proc_ref_hashes[i], &task->proc_ref_nodes[i]); - } + U64 total_proc_ref_count = sum_array_u64(tp->worker_count, proc_ref_counts); + for EachIndex(i, total_proc_ref_count) { gsi_push_(gsi, proc_ref_hashes[i], &proc_ref_nodes[i]); } } barrier_wait(tp->barrier); } @@ -1921,11 +1939,14 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // public symbols // { + U64 *public_symbol_sizes; // [worker_count] + U64 *public_symbol_node_counts; // [worker_count] if (task_id == 0) { - task->public_symbol_sizes = push_array(scratch.arena, U64, tp->worker_count); - task->public_symbol_node_counts = push_array(scratch.arena, U64, tp->worker_count); + public_symbol_sizes = push_array(scratch.arena, U64, tp->worker_count); + public_symbol_node_counts = push_array(scratch.arena, U64, tp->worker_count); } - barrier_wait(tp->barrier); + tp_broadcast(&public_symbol_sizes); + tp_broadcast(&public_symbol_node_counts); // compute buffer size for CV public symbols for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { @@ -1938,23 +1959,29 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } - task->public_symbol_sizes[task_id] += sizeof(CV_SymPub32); - task->public_symbol_sizes[task_id] += symbol->name.size + 1; - task->public_symbol_sizes[task_id] = AlignPow2(task->public_symbol_sizes[task_id], sizeof(void *)); - - task->public_symbol_node_counts[task_id] += 1; + public_symbol_sizes[task_id] += sizeof(CV_SymPub32); + public_symbol_sizes[task_id] += symbol->name.size + 1; + public_symbol_sizes[task_id] = AlignPow2(public_symbol_sizes[task_id], sizeof(void *)); + public_symbol_node_counts[task_id] += 1; } } barrier_wait(tp->barrier); + Arena **public_symbol_arenas; + Arena **public_symbol_node_arenas; + CV_SymbolList *public_symbols; // [worker_count] + U32 **public_symbol_hashes; // [worker_count][public_symbol.count] if (task_id == 0) { - U64 public_symbol_total_count = sum_array_u64(tp->worker_count, task->public_symbol_node_counts); - task->public_symbol_arenas = alloc_arena_many(psi->gsi->arena, tp->worker_count, task->public_symbol_sizes); - task->public_symbol_node_arenas = alloc_arena_array(psi->gsi->arena, tp->worker_count, task->public_symbol_node_counts, CV_SymbolNode); - task->public_symbols = push_array(scratch.arena, CV_SymbolList, tp->worker_count); - task->public_symbol_hashes = push_array(scratch.arena, U32 *, tp->worker_count); + U64 public_symbol_total_count = sum_array_u64(tp->worker_count, public_symbol_node_counts); + public_symbol_arenas = alloc_arena_many(psi->gsi->arena, tp->worker_count, public_symbol_sizes); + public_symbol_node_arenas = alloc_arena_array(psi->gsi->arena, tp->worker_count, public_symbol_node_counts, CV_SymbolNode); + public_symbols = push_array(scratch.arena, CV_SymbolList, tp->worker_count); + public_symbol_hashes = push_array(scratch.arena, U32 *, tp->worker_count); } - barrier_wait(tp->barrier); + tp_broadcast(&public_symbol_arenas); + tp_broadcast(&public_symbol_node_arenas); + tp_broadcast(&public_symbols); + tp_broadcast(&public_symbol_hashes); // make CV public symbols for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { @@ -1970,8 +1997,8 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) CV_Pub32Flags flags = COFF_SymbolType_IsFunc(symbol_parsed.type) ? CV_Pub32Flag_Function : 0; ISectOff sc = lnk_sc_from_symbol(symbol); - CV_Symbol pub_symbol = cv_make_pub32(task->public_symbol_arenas[task_id], flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); - cv_symbol_list_push(task->public_symbol_node_arenas[task_id], &task->public_symbols[task_id], pub_symbol); + CV_Symbol pub_symbol = cv_make_pub32(public_symbol_arenas[task_id], flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); + cv_symbol_list_push(public_symbol_node_arenas[task_id], &public_symbols[task_id], pub_symbol); } } barrier_wait(tp->barrier); @@ -1979,10 +2006,10 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // hash public symbols { U64 n_idx = 0; - task->public_symbol_hashes[task_id] = push_array(scratch.arena, U32, task->public_symbols[task_id].count); - for EachNode(n, CV_SymbolNode, task->public_symbols[task_id].first) { + public_symbol_hashes[task_id] = push_array(scratch.arena, U32, public_symbols[task_id].count); + for EachNode(n, CV_SymbolNode, public_symbols[task_id].first) { String8 name = cv_name_from_symbol(n->data.kind, n->data.data); - task->public_symbol_hashes[task_id][n_idx++] = gsi_hash(gsi, name); + public_symbol_hashes[task_id][n_idx++] = gsi_hash(gsi, name); } } barrier_wait(tp->barrier); @@ -1991,10 +2018,10 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) if (task_id == 0) { for EachIndex(i, tp->worker_count) { U64 k = 0; - for (CV_SymbolNode *curr = task->public_symbols[i].first, *next = 0; curr != 0; curr = next, k += 1) { + for (CV_SymbolNode *curr = public_symbols[i].first, *next = 0; curr != 0; curr = next, k += 1) { next = curr->next; curr->next = 0; - gsi_push_(psi->gsi, task->public_symbol_hashes[i][k], curr); + gsi_push_(psi->gsi, public_symbol_hashes[i][k], curr); } } } @@ -2142,11 +2169,12 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) { // count strings in string tables + U64 *string_counts; { if (task_id == 0) { - task->string_counts = push_array(scratch.arena, U64, tp->worker_count); + string_counts = push_array(scratch.arena, U64, tp->worker_count); } - barrier_wait(tp->barrier); + tp_broadcast(&string_counts); for EachIndex(i, obj_indices.count) { U64 obj_idx = obj_indices.v[i]; @@ -2155,17 +2183,18 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) U64 string_count = 0; for (U64 cursor = 0; cursor < string_table.size; cursor += 1) { if (string_table.str[cursor] == '\0') { - task->string_counts[task_id] += 1; + string_counts[task_id] += 1; } } } barrier_wait(tp->barrier); } + Arena **string_arenas; if (task_id == 0) { - task->string_arenas = alloc_arena_array(task->pdb->dbi->arena, tp->worker_count, task->string_counts, String8Node); + string_arenas = alloc_arena_array(task->pdb->dbi->arena, tp->worker_count, string_counts, String8Node); } - barrier_wait(tp->barrier); + tp_broadcast(&string_arenas); for EachIndex(i, obj_indices.count) { Temp temp = temp_begin(scratch.arena); @@ -2220,7 +2249,7 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) } // collect mod source files - String8List source_file_list = str8_split_by_string_chars(task->string_arenas[task_id], string_table, str8_lit("\0"), 0); + String8List source_file_list = str8_split_by_string_chars(string_arenas[task_id], string_table, str8_lit("\0"), 0); str8_list_concat_in_place(&mod->source_file_list, &source_file_list); temp_end(temp); @@ -2317,7 +2346,6 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config .symtab = symtab, .cv = cv, .pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), - .fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_U16, max_U16), .mod_arr = push_array(scratch.arena, PDB_DbiModule *, cv->obj_count), .pe = pe_bin_info_from_data(scratch.arena, image_data), .image_section_table = coff_section_table_from_data(scratch.arena, image_data, task.pe.section_table_range), diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 1591d0a8..65d88de0 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -130,48 +130,13 @@ typedef struct typedef struct { - String8 image_data; - LNK_SymbolTable *symtab; - LNK_CodeViewInput *cv; - - PDB_Context *pdb; - PDB_DbiModule **mod_arr; // [obj_count] - - Arena **fixed_arenas; - - U32Array *obj_indices; // [obj_count] - - // GSI symbol dedup - U64 global_symbol_count; - U64 bucket_cap; - void **buckets; // [bucket_count] - U64 *insert_count; // [worker_count] - - Rng1U64 *symbol_ranges; // [worker_count] - U64 symbol_count; - void **symbol_arr; - U32 *symbol_hashes; // [symbol_count] - - U64 *proc_ref_counts; // [worker_count] - U64 *proc_ref_sizes; // [worker_count] - U64 *proc_ref_hashes; // [total_proc_ref_count] - U64 *proc_ref_indices; // [worker_count] - String8 proc_refs; - U64 proc_ref_count; - CV_SymbolNode *proc_ref_nodes; // [proc_ref_count] - Arena **proc_ref_arenas; - - U64 *public_symbol_sizes; // [worker_count] - Arena **public_symbol_arenas; - Arena **public_symbol_node_arenas; - U64 *public_symbol_node_counts; // [worker_count] - CV_SymbolList *public_symbols; // [worker_count] - U32 **public_symbol_hashes; // [worker_count][public_symbol.count] - - // process C13 data - CV_StringHashTable string_ht; - U64 *string_counts; - Arena **string_arenas; + String8 image_data; + LNK_SymbolTable *symtab; + LNK_CodeViewInput *cv; + PDB_Context *pdb; + CV_StringHashTable string_ht; + PDB_DbiModule **mod_arr; // [obj_count] + U32Array *obj_indices; // [obj_count] // push DBI SC Map PE_BinInfo pe; @@ -180,9 +145,6 @@ typedef struct Rng1U64Array image_section_file_ranges; Rng1U64Array image_section_virt_ranges; PDB_DbiSectionContribList *sc_list; // [obj_count] - - // make public symbols - CV_SymbolList *pub_list_arr; } LNK_BuildPdb; typedef struct From f72d127aaa229696d180b2f85d3322650ad84eb3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 21:48:44 -0700 Subject: [PATCH 324/850] report unknown directives in debug build --- src/linker/lnk.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index cb7e5f3b..4eebee03 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -196,8 +196,10 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) #endif // errors that are too verbose in release build - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Warning_UnknownSwitch * (BUILD_DEBUG * -1)); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Error_InvalidTypeIndex * (BUILD_DEBUG * -1)); + U64 debug_opt = BUILD_DEBUG ? -1 : 1; + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Warning_UnknownSwitch * debug_opt); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Warning_UnknownDirective * debug_opt); + lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Error_InvalidTypeIndex * debug_opt); return cmd_line; } From 77ece3193e067dbaef422d00517937e89ec219ab Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 31 Mar 2026 23:12:34 -0700 Subject: [PATCH 325/850] fix clang /O2 --- src/linker/lnk_debug_info.c | 71 +++++++++++++++------------- src/linker/lnk_debug_info.h | 2 + src/linker/thread_pool/thread_pool.c | 17 +++++++ src/linker/thread_pool/thread_pool.h | 3 +- 4 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 078232be..10cdad24 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1792,15 +1792,12 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) U64 *bucket_cap; void **buckets; - U64 *symbol_count; if (task_id == 0) { bucket_cap = push_u64(scratch.arena, *global_symbol_count * 13 / 10); buckets = push_array(scratch.arena, void *, *bucket_cap); - symbol_count = push_array(scratch.arena, U64, 1); } tp_broadcast(&bucket_cap); tp_broadcast(&buckets); - tp_broadcast(&symbol_count); // insert symbols into hash table for EachNode(n, VoidNode, global_symbols.first) { @@ -1810,22 +1807,29 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) } barrier_wait(tp->barrier); + U64 *symbol_count; void **symbol_arr; Rng1U64 *symbol_ranges; // [worker_count] U32 *symbol_hashes; // [symbol_count] if (task_id == 0) { // compact buckets - for (U64 i = 1; i < *bucket_cap; i += 1) { - if (buckets[i] != 0 && buckets[i-1] == 0) { - while (buckets[*symbol_count] != 0) { *symbol_count += 1; } - buckets[*symbol_count] = buckets[i]; - buckets[i] = 0; + { + U64 k = 0; + for (U64 i = 1; i < *bucket_cap; i += 1) { + if (buckets[i] != 0 && buckets[i-1] == 0) { + while (buckets[k] != 0) { k += 1; } + buckets[k] = buckets[i]; + buckets[i] = 0; + } } + symbol_count = push_u64(scratch.arena, k); } + symbol_arr = buckets; symbol_ranges = tp_divide_work(scratch.arena, *symbol_count, tp->worker_count); symbol_hashes = push_array_no_zero(scratch.arena, U32, *symbol_count); } + tp_broadcast(&symbol_count); tp_broadcast(&symbol_arr); tp_broadcast(&symbol_ranges); tp_broadcast(&symbol_hashes); @@ -1854,8 +1858,8 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // proc refs // { - U64 *proc_ref_sizes; - U64 *proc_ref_counts; + U64 *proc_ref_sizes = 0; + U64 *proc_ref_counts = 0; if (task_id == 0) { proc_ref_sizes = push_array(scratch.arena, U64, tp->worker_count); proc_ref_counts = push_array(scratch.arena, U64, tp->worker_count); @@ -1863,10 +1867,12 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) tp_broadcast(&proc_ref_sizes); tp_broadcast(&proc_ref_counts); + U64 proc_ref_size = 0; + U64 proc_ref_count = 0; for EachIndex(i, obj_indices.count) { - U64 obj_idx = obj_indices.v[i]; - CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; - String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); + U64 obj_idx = obj_indices.v[i]; + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; + String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); for EachNode(n, String8Node, symbols.first) { for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { CV_Symbol symbol = {0}; @@ -1874,22 +1880,24 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - proc_ref_sizes[task_id] += sizeof(CV_SymRef2); - proc_ref_sizes[task_id] += name.size + 1; - proc_ref_sizes[task_id] = AlignPow2(proc_ref_sizes[task_id], sizeof(void *)); - proc_ref_counts[task_id] += 1; + proc_ref_size += AlignPow2(sizeof(CV_SymRef2) + name.size + 1, sizeof(void *)); + proc_ref_count += 1; } } } } + proc_ref_sizes[task_id] = proc_ref_size; + proc_ref_counts[task_id] = proc_ref_count; barrier_wait(tp->barrier); - U64 *proc_ref_hashes; - U64 *proc_ref_indices; - Arena **proc_ref_arenas; - CV_SymbolNode *proc_ref_nodes; + U64 total_proc_ref_size = tp_sum_u64(tp, task_id, proc_ref_size); + U64 total_proc_ref_count = tp_sum_u64(tp, task_id, proc_ref_count); + + U64 *proc_ref_hashes = 0; + U64 *proc_ref_indices = 0; + Arena **proc_ref_arenas = 0; + CV_SymbolNode *proc_ref_nodes = 0; if (task_id == 0) { - U64 total_proc_ref_count = sum_array_u64(tp->worker_count, proc_ref_counts); proc_ref_hashes = push_array(scratch.arena, U64, total_proc_ref_count); proc_ref_indices = offsets_from_counts_array_u64(scratch.arena, proc_ref_counts, tp->worker_count); proc_ref_arenas = alloc_arena_many(gsi->arena, tp->worker_count, proc_ref_sizes); @@ -1900,8 +1908,7 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) tp_broadcast(&proc_ref_arenas); tp_broadcast(&proc_ref_nodes); - U64 proc_ref_idx = proc_ref_indices[task_id]; - Arena *proc_ref_arena = proc_ref_arenas[task_id]; + U64 proc_ref_idx = proc_ref_indices[task_id]; for EachIndex(i, obj_indices.count) { U64 obj_idx = obj_indices.v[i]; CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; @@ -1916,7 +1923,7 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - proc_ref_nodes[proc_ref_idx].data = cv_make_proc_ref(proc_ref_arena, imod, symbol_cursor, name, cv_is_lproc(symbol)); + proc_ref_nodes[proc_ref_idx].data = cv_make_proc_ref(proc_ref_arenas[task_id], imod, symbol_cursor, name, cv_is_lproc(symbol)); proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&proc_ref_nodes[proc_ref_idx].data); proc_ref_idx += 1; } @@ -1939,8 +1946,8 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // public symbols // { - U64 *public_symbol_sizes; // [worker_count] - U64 *public_symbol_node_counts; // [worker_count] + U64 *public_symbol_sizes = 0; // [worker_count] + U64 *public_symbol_node_counts = 0; // [worker_count] if (task_id == 0) { public_symbol_sizes = push_array(scratch.arena, U64, tp->worker_count); public_symbol_node_counts = push_array(scratch.arena, U64, tp->worker_count); @@ -1967,10 +1974,10 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) } barrier_wait(tp->barrier); - Arena **public_symbol_arenas; - Arena **public_symbol_node_arenas; - CV_SymbolList *public_symbols; // [worker_count] - U32 **public_symbol_hashes; // [worker_count][public_symbol.count] + Arena **public_symbol_arenas = 0; + Arena **public_symbol_node_arenas = 0; + CV_SymbolList *public_symbols = 0; // [worker_count] + U32 **public_symbol_hashes = 0; // [worker_count][public_symbol.count] if (task_id == 0) { U64 public_symbol_total_count = sum_array_u64(tp->worker_count, public_symbol_node_counts); public_symbol_arenas = alloc_arena_many(psi->gsi->arena, tp->worker_count, public_symbol_sizes); @@ -2190,7 +2197,7 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) barrier_wait(tp->barrier); } - Arena **string_arenas; + Arena **string_arenas = 0; if (task_id == 0) { string_arenas = alloc_arena_array(task->pdb->dbi->arena, tp->worker_count, string_counts, String8Node); } diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 65d88de0..b70bf6a0 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -138,6 +138,8 @@ typedef struct PDB_DbiModule **mod_arr; // [obj_count] U32Array *obj_indices; // [obj_count] + U64 symbol_count; + // push DBI SC Map PE_BinInfo pe; COFF_SectionHeader **image_section_table; diff --git a/src/linker/thread_pool/thread_pool.c b/src/linker/thread_pool/thread_pool.c index f7b2883f..7350ceb6 100644 --- a/src/linker/thread_pool/thread_pool.c +++ b/src/linker/thread_pool/thread_pool.c @@ -259,3 +259,20 @@ tp_broadcast_(TP_Context *tp, U64 task_id, void *ptr) return result; } + +internal U64 +tp_sum_u64(TP_Context *tp, U64 task_id, U64 v) +{ + if (task_id == 0) { + tp->sum = 0; + } + barrier_wait(tp->barrier); + + ins_atomic_u64_add_eval(&tp->sum, v); + barrier_wait(tp->barrier); + + U64 result = tp->sum; + barrier_wait(tp->barrier); + return result; +} + diff --git a/src/linker/thread_pool/thread_pool.h b/src/linker/thread_pool/thread_pool.h index 7797e9ce..033df0d0 100644 --- a/src/linker/thread_pool/thread_pool.h +++ b/src/linker/thread_pool/thread_pool.h @@ -4,7 +4,7 @@ #pragma once struct TP_Context; -#define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, U64 worker_id, U64 task_id, void *raw_task, struct TP_Context *tp) +#define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, volatile U64 worker_id, volatile U64 task_id, void *raw_task, struct TP_Context *tp) typedef THREAD_POOL_TASK_FUNC(TP_TaskFunc); typedef struct TP_Arena @@ -34,6 +34,7 @@ typedef struct TP_Context Semaphore main_semaphore; Barrier barrier; void *broadcast; + U64 sum; U32 worker_count; TP_Worker *worker_arr; From f69532e11d28acee3e3d5de2531b5de345de5a61 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 1 Apr 2026 15:50:58 -0700 Subject: [PATCH 326/850] tweak thread broadcasting and balance symbol inputs --- src/linker/lnk_debug_info.c | 154 +++++++++++++++------------ src/linker/thread_pool/thread_pool.c | 13 +-- src/linker/thread_pool/thread_pool.h | 5 +- 3 files changed, 98 insertions(+), 74 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 10cdad24..57704a7f 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -512,7 +512,24 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla } } - input.symbol_input_ranges = tp_divide_work(tp_arena->v[0], input.symbol_input_count, tp->worker_count); + ProfBegin("Make Ranges"); + U64 total_input_size = 0; + for EachIndex(i, input.symbol_input_count) { total_input_size += input.symbol_inputs[i].raw_symbols.size; } + + U64 max_weight = CeilIntegerDiv(total_input_size, tp->worker_count); + U64 cursor = 0; + input.symbol_input_ranges = push_array(tp_arena->v[0], Rng1U64, tp->worker_count); + for EachIndex(i, tp->worker_count) { + if (cursor >= input.symbol_input_count) { break; } + U64 begin = cursor; + U64 weight = 0; + for (; cursor < input.symbol_input_count; cursor += 1) { + if (weight >= max_weight) { break; } + weight += input.symbol_inputs[cursor].raw_symbols.size; + } + input.symbol_input_ranges[i] = r1u64(begin, cursor); + } + ProfEnd(); } ProfEnd(); @@ -1174,9 +1191,9 @@ THREAD_POOL_TASK_FUNC(lnk_cv_patcher_symbols_task) { ProfBeginFunction(); LNK_MergeTypes *task = raw_task; - for EachInRange(i, task->input->symbol_input_ranges[task_id]) { + Rng1U64 range = task->input->symbol_input_ranges[task_id]; + for EachInRange(i, range) { LNK_SymbolInput symbols = task->input->symbol_inputs[i]; - for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { Temp temp = temp_begin(task->fixed_arenas[task_id]); @@ -1199,8 +1216,9 @@ THREAD_POOL_TASK_FUNC(lnk_cv_patcher_inlines_task) LNK_MergeTypes *task = raw_task; U64 obj_idx = task_id; String8List inlinee_lines = cv_sub_section_from_debug_s(task->input->debug_s_arr[obj_idx], CV_C13SubSectionKind_InlineeLines); + Arena *fixed_arena = task->fixed_arenas[worker_id]; for EachNode(inline_data_n, String8Node, inlinee_lines.first) { - Temp temp = temp_begin(task->fixed_arenas[worker_id]); + Temp temp = temp_begin(fixed_arena); CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_n->string); lnk_fixup_cv_type_indices(task, obj_idx, inline_data_n->string, ti_info_list); temp_end(temp); @@ -1212,9 +1230,11 @@ internal THREAD_POOL_TASK_FUNC(lnk_cv_patcher_leaves_task) { ProfBeginFunction(); - LNK_MergeTypes *task = raw_task; - for EachInRange(leaf_ref_idx, task->ranges[task_id]) { - Temp temp = temp_begin(task->fixed_arenas[task_id]); + LNK_MergeTypes *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + Arena *fixed_arena = task->fixed_arenas[task_id]; + for EachInRange(leaf_ref_idx, range) { + Temp temp = temp_begin(fixed_arena); LNK_LeafRef *patch = task->unique_leaf_refs_arr[task->ti_source].v[leaf_ref_idx]; CV_DebugT *debug_t = &task->input->debug_t_arr[patch->obj_idx]; CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, patch->leaf_idx); @@ -1229,7 +1249,8 @@ internal THREAD_POOL_TASK_FUNC(lnk_unbucket_raw_leaves_task) { LNK_MergeTypes *task = raw_task; - for EachInRange(i, task->ranges[task_id]) { + Rng1U64 range = task->ranges[task_id]; + for EachInRange(i, range) { LNK_LeafRef leaf_ref = *task->unique_leaf_refs_arr[task->ti_source].v[i]; CV_DebugT *debug_t = &task->input->debug_t_arr[leaf_ref.obj_idx]; String8 raw_leaf = cv_debug_t_get_raw_leaf(debug_t, leaf_ref.leaf_idx); @@ -1751,19 +1772,11 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) PDB_PsiContext *psi = task->pdb->psi; U32Array obj_indices = task->obj_indices[task_id]; - // - // global symbols - // + ProfBegin("Global Symbols"); { - // collect global data and global typedefs - U64 *global_symbol_count = 0; - if (task_id == 0) { - global_symbol_count = push_array(scratch.arena, U64, 1); - } - tp_broadcast(&global_symbol_count); - - VoidList global_symbols = {0}; - for EachInRange(i, task->cv->symbol_input_ranges[task_id]) { + VoidList global_symbols = {0}; + Rng1U64 symbol_input_range = task->cv->symbol_input_ranges[task_id]; + for EachInRange(i, symbol_input_range) { LNK_SymbolInput symbols = task->cv->symbol_inputs[i]; for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { CV_Symbol symbol = {0}; @@ -1787,47 +1800,47 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) } } } - ins_atomic_u64_add_eval(global_symbol_count, global_symbols.count); - barrier_wait(tp->barrier); - U64 *bucket_cap; + // collect global data and global typedefs + U64 global_symbol_count = tp_sum_u64(tp, task_id, global_symbols.count); + + U64 bucket_cap; void **buckets; if (task_id == 0) { - bucket_cap = push_u64(scratch.arena, *global_symbol_count * 13 / 10); - buckets = push_array(scratch.arena, void *, *bucket_cap); + bucket_cap = global_symbol_count * 13 / 10; + buckets = push_array(scratch.arena, void *, bucket_cap); } tp_broadcast(&bucket_cap); tp_broadcast(&buckets); // insert symbols into hash table for EachNode(n, VoidNode, global_symbols.first) { - String8 raw = cv_raw_from_symbol(n->v); - U64 hash = u64_hash_from_str8(raw); - cv_symbol_deduper_insert_or_update(buckets, *bucket_cap, hash, n->v); + String8 raw = cv_raw_from_symbol(n->v); + U64 hash = u64_hash_from_str8(raw); + cv_symbol_deduper_insert_or_update(buckets, bucket_cap, hash, n->v); } barrier_wait(tp->barrier); - U64 *symbol_count; - void **symbol_arr; - Rng1U64 *symbol_ranges; // [worker_count] - U32 *symbol_hashes; // [symbol_count] + U64 symbol_count = 0; + void **symbol_arr = 0; // [symbol_count] + Rng1U64 *symbol_ranges = 0; // [worker_count] + U32 *symbol_hashes = 0; // [symbol_count] if (task_id == 0) { - // compact buckets + ProfBeginV("Compact Buckets [bucket_cap %llu]", bucket_cap); { - U64 k = 0; - for (U64 i = 1; i < *bucket_cap; i += 1) { - if (buckets[i] != 0 && buckets[i-1] == 0) { - while (buckets[k] != 0) { k += 1; } - buckets[k] = buckets[i]; - buckets[i] = 0; + U64 dst = 0; + for EachIndex(src, bucket_cap) { + if (buckets[src] != 0) { + buckets[dst++] = buckets[src]; } } - symbol_count = push_u64(scratch.arena, k); + symbol_count = dst; } + ProfEnd(); symbol_arr = buckets; - symbol_ranges = tp_divide_work(scratch.arena, *symbol_count, tp->worker_count); - symbol_hashes = push_array_no_zero(scratch.arena, U32, *symbol_count); + symbol_ranges = tp_divide_work(scratch.arena, symbol_count, tp->worker_count); + symbol_hashes = push_array_no_zero(scratch.arena, U32, symbol_count); } tp_broadcast(&symbol_count); tp_broadcast(&symbol_arr); @@ -1835,7 +1848,8 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) tp_broadcast(&symbol_hashes); // hash symbols - for EachInRange(i, symbol_ranges[task_id]) { + Rng1U64 symbol_range = symbol_ranges[task_id]; + for EachInRange(i, symbol_range) { CV_Symbol symbol = cv_symbol_from_ptr(symbol_arr[i]); String8 name = cv_name_from_symbol(symbol.kind, symbol.data); symbol_hashes[i] = gsi_hash(gsi, name); @@ -1844,8 +1858,8 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) // push global symbols if (task_id == 0) { - CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, *symbol_count); - for EachIndex(i, *symbol_count) { + CV_SymbolNode *nodes = push_array_no_zero(gsi->arena, CV_SymbolNode, symbol_count); + for EachIndex(i, symbol_count) { CV_SymbolNode *n = &nodes[i]; n->prev = n->next = 0; n->data = cv_symbol_from_ptr(symbol_arr[i]); @@ -1853,10 +1867,9 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) } } } + ProfEnd(); - // - // proc refs - // + ProfBegin("Proc Refs"); { U64 *proc_ref_sizes = 0; U64 *proc_ref_counts = 0; @@ -1886,7 +1899,7 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) } } } - proc_ref_sizes[task_id] = proc_ref_size; + proc_ref_sizes[task_id] = proc_ref_size; proc_ref_counts[task_id] = proc_ref_count; barrier_wait(tp->barrier); @@ -1908,7 +1921,8 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) tp_broadcast(&proc_ref_arenas); tp_broadcast(&proc_ref_nodes); - U64 proc_ref_idx = proc_ref_indices[task_id]; + Arena *proc_ref_arena = proc_ref_arenas[task_id]; + U64 proc_ref_idx = proc_ref_indices[task_id]; for EachIndex(i, obj_indices.count) { U64 obj_idx = obj_indices.v[i]; CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; @@ -1923,7 +1937,7 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - proc_ref_nodes[proc_ref_idx].data = cv_make_proc_ref(proc_ref_arenas[task_id], imod, symbol_cursor, name, cv_is_lproc(symbol)); + proc_ref_nodes[proc_ref_idx].data = cv_make_proc_ref(proc_ref_arena, imod, symbol_cursor, name, cv_is_lproc(symbol)); proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&proc_ref_nodes[proc_ref_idx].data); proc_ref_idx += 1; } @@ -1941,13 +1955,12 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) } barrier_wait(tp->barrier); } + ProfEnd(); - // - // public symbols - // + ProfBegin("Public Symbols"); { - U64 *public_symbol_sizes = 0; // [worker_count] - U64 *public_symbol_node_counts = 0; // [worker_count] + U64 *public_symbol_sizes = 0; // [worker_count] + U64 *public_symbol_node_counts = 0; // [worker_count] if (task_id == 0) { public_symbol_sizes = push_array(scratch.arena, U64, tp->worker_count); public_symbol_node_counts = push_array(scratch.arena, U64, tp->worker_count); @@ -1956,7 +1969,10 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) tp_broadcast(&public_symbol_node_counts); // compute buffer size for CV public symbols - for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { + LNK_SymbolHashTrieChunkList symbol_chunks = task->symtab->chunks[task_id]; + U64 public_symbol_size = 0; + U64 public_symbol_count = 0; + for EachNode(chunk, LNK_SymbolHashTrieChunk, symbol_chunks.first) { for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); @@ -1966,12 +1982,13 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed); if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; } - public_symbol_sizes[task_id] += sizeof(CV_SymPub32); - public_symbol_sizes[task_id] += symbol->name.size + 1; - public_symbol_sizes[task_id] = AlignPow2(public_symbol_sizes[task_id], sizeof(void *)); + public_symbol_size += AlignPow2(sizeof(CV_SymPub32) + symbol->name.size + 1, sizeof(void *)); + public_symbol_count += 1; public_symbol_node_counts[task_id] += 1; } } + public_symbol_sizes [task_id] += public_symbol_size; + public_symbol_node_counts[task_id] += public_symbol_count; barrier_wait(tp->barrier); Arena **public_symbol_arenas = 0; @@ -1991,7 +2008,10 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) tp_broadcast(&public_symbol_hashes); // make CV public symbols - for EachNode(chunk, LNK_SymbolHashTrieChunk, task->symtab->chunks[task_id].first) { + Arena *public_symbol_arena = public_symbol_arenas [task_id]; + Arena *public_symbol_node_arena = public_symbol_node_arenas[task_id]; + CV_SymbolList *public_symbol_list = &public_symbols [task_id]; + for EachNode(chunk, LNK_SymbolHashTrieChunk, symbol_chunks.first) { for EachIndex(i, chunk->count) { LNK_Symbol *symbol = chunk->v[i].symbol; LNK_ObjSymbolRef symbol_ref = lnk_ref_from_symbol(symbol); @@ -2004,20 +2024,21 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) CV_Pub32Flags flags = COFF_SymbolType_IsFunc(symbol_parsed.type) ? CV_Pub32Flag_Function : 0; ISectOff sc = lnk_sc_from_symbol(symbol); - CV_Symbol pub_symbol = cv_make_pub32(public_symbol_arenas[task_id], flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); - cv_symbol_list_push(public_symbol_node_arenas[task_id], &public_symbols[task_id], pub_symbol); + CV_Symbol pub_symbol = cv_make_pub32(public_symbol_arena, flags, safe_cast_u32(sc.off), safe_cast_u16(sc.isect), symbol->name); + cv_symbol_list_push(public_symbol_node_arena, public_symbol_list, pub_symbol); } } barrier_wait(tp->barrier); // hash public symbols { - U64 n_idx = 0; - public_symbol_hashes[task_id] = push_array(scratch.arena, U32, public_symbols[task_id].count); + U64 hash_idx = 0; + U32 *hashes = push_array(scratch.arena, U32, public_symbols[task_id].count); for EachNode(n, CV_SymbolNode, public_symbols[task_id].first) { String8 name = cv_name_from_symbol(n->data.kind, n->data.data); - public_symbol_hashes[task_id][n_idx++] = gsi_hash(gsi, name); + hashes[hash_idx++] = gsi_hash(gsi, name); } + public_symbol_hashes[task_id] = hashes; } barrier_wait(tp->barrier); @@ -2034,6 +2055,7 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) } barrier_wait(tp->barrier); } + ProfEnd(); scratch_end(scratch); } diff --git a/src/linker/thread_pool/thread_pool.c b/src/linker/thread_pool/thread_pool.c index 7350ceb6..63fcd527 100644 --- a/src/linker/thread_pool/thread_pool.c +++ b/src/linker/thread_pool/thread_pool.c @@ -246,18 +246,19 @@ tp_divide_work(Arena *arena, U64 item_count, U32 worker_count) return range_arr; } -internal void * -tp_broadcast_(TP_Context *tp, U64 task_id, void *ptr) +internal void +tp_broadcast_(TP_Context *tp, U64 task_id, void *ptr, U64 ptr_size) { if (task_id == 0) { - tp->broadcast = ptr; + tp->broadcast = ptr; + tp->broadcast_size = ptr_size; } barrier_wait(tp->barrier); - void *result = tp->broadcast; + if (task_id != 0) { + MemoryCopy(ptr, tp->broadcast, tp->broadcast_size); + } barrier_wait(tp->barrier); - - return result; } internal U64 diff --git a/src/linker/thread_pool/thread_pool.h b/src/linker/thread_pool/thread_pool.h index 033df0d0..8d7f8f22 100644 --- a/src/linker/thread_pool/thread_pool.h +++ b/src/linker/thread_pool/thread_pool.h @@ -4,7 +4,7 @@ #pragma once struct TP_Context; -#define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, volatile U64 worker_id, volatile U64 task_id, void *raw_task, struct TP_Context *tp) +#define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, U64 worker_id, U64 task_id, void *raw_task, struct TP_Context *tp) typedef THREAD_POOL_TASK_FUNC(TP_TaskFunc); typedef struct TP_Arena @@ -34,6 +34,7 @@ typedef struct TP_Context Semaphore main_semaphore; Barrier barrier; void *broadcast; + U64 broadcast_size; U64 sum; U32 worker_count; @@ -56,5 +57,5 @@ internal void tp_temp_end(TP_Temp temp); #define tp_for_parallel_prof(pool, arena, task_count, task_func, task_data, zone_name) ProfBegin(zone_name); tp_for_parallel(pool, arena, task_count, task_func, task_data); ProfEnd(); internal void tp_for_parallel(TP_Context *pool, TP_Arena *arena, U64 task_count, TP_TaskFunc *task_func, void *task_data); internal Rng1U64 * tp_divide_work(Arena *arena, U64 item_count, U32 worker_count); -#define tp_broadcast(p) *(p) = tp_broadcast_(tp, task_id, *(p)) +#define tp_broadcast(p) tp_broadcast_(tp, task_id, p, sizeof(*p)) From 85ec2c63179aab0d3367cb94c2ec422043a4dc07 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 3 Apr 2026 11:35:07 -0700 Subject: [PATCH 327/850] remove vestige *open functionality from the MSF and PDB --- src/linker/pdb_ext/msf_builder.c | 269 --------------- src/linker/pdb_ext/msf_builder.h | 1 - src/linker/pdb_ext/pdb_builder.c | 572 ------------------------------- src/linker/pdb_ext/pdb_builder.h | 30 -- 4 files changed, 872 deletions(-) diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index fbbe28e0..3112daaa 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -1452,275 +1452,6 @@ msf_find_stream(MSF_Context *msf, MSF_StreamNumber sn) return data; } -internal MSF_Error -msf_open_header(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList *page_list) -{ - ProfBeginFunction(); - msf_page_list_push_extant_page(arena, page_list, page_data_list, page_size, 0); - ProfEnd(); - return MSF_Error_OK; -} - -internal MSF_Error -msf_open_root(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber root_pn, MSF_UInt stream_table_size, MSF_PageList *page_list) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - MSF_PageNumber st_page_count = msf_count_pages(page_size, stream_table_size); - MSF_UInt st_pn_size = sizeof(MSF_PageNumber) * st_page_count; - MSF_PageNumber root_pn_count = msf_count_pages(page_size, st_pn_size); - MSF_PageNumber *root_pn_arr = push_array(scratch.arena, MSF_PageNumber, root_pn_count); - for (MSF_UInt i = 0; i < root_pn_count; i += 1) { - root_pn_arr[i] = root_pn + i; - } - msf_page_list_push_extant_page_arr(arena, page_list, page_data_list, page_size, root_pn_arr, root_pn_count); - scratch_end(scratch); - ProfEnd(); - return MSF_Error_OK; -} - -internal MSF_Error -msf_open_stream_table_page_list(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList root_page_list, MSF_UInt stream_table_size, MSF_PageList *page_list) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - MSF_Error error = MSF_Error_OK; - MSF_UInt st_pn_count = msf_count_pages(page_size, stream_table_size); - MSF_UInt st_pn_size = st_pn_count * sizeof(MSF_PageNumber); - MSF_PageNumber *st_pn_arr = push_array(scratch.arena, MSF_PageNumber, st_pn_count); - MSF_UInt st_pn_read_size = msf_read(page_data_list, page_size, root_page_list, 0, st_pn_arr, st_pn_size); - if (st_pn_read_size == st_pn_size) { - msf_page_list_push_extant_page_arr(arena, page_list, page_data_list, page_size, st_pn_arr, st_pn_count); - } else { - error = MSF_OpenError_UNABLE_TO_READ_STREAM_TABLE_PAGE_NUMBERS; - } - scratch_end(scratch); - ProfEnd(); - return error; -} - -internal MSF_Error -msf_open_stream_table(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList st_page_list, MSF_UInt stream_table_size, MSF_StreamList *stream_list) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - MSF_Error error = MSF_Error_OK; - - // read out entire stream table - U8 *st_buffer = push_array(scratch.arena, U8, stream_table_size); - MSF_UInt st_read_size = msf_read(page_data_list, page_size, st_page_list, 0, st_buffer, stream_table_size); - if (st_read_size != stream_table_size) { - error = MSF_OpenError_INVALID_STREAM_TABLE; - goto exit; - } - - // setup buffer reader - String8 st_data = str8(st_buffer, st_read_size); - U64 st_cursor = 0; - - MSF_UInt stream_count = 0; - st_cursor += str8_deserial_read_struct(st_data, st_cursor, &stream_count); - - // stream count is a 32-bit but stream number is 16-bit?! - if (stream_count > MSF_STREAM_NUMBER_MAX) { - error = MSF_OpenError_STREAM_COUNT_OVERFLOW; - goto exit; - } - - // is there enoguh bytes to read streams sizes? - U64 size_arr_end = st_cursor + (U64)stream_count * sizeof(MSF_UInt); - if (size_arr_end > st_data.size) { - error = MSF_OpenError_UNABLE_TO_READ_STREAM_SIZES; - goto exit; - } - - // make pointer to stream sizes array - MSF_UInt *stream_size_arr = (MSF_UInt*)(st_buffer + st_cursor); - st_cursor += sizeof(stream_size_arr[0]) * stream_count; - - U64 arena_pos_before_stream_allocations = arena_pos(arena); - - // open streams - for (MSF_UInt stream_idx = 0; stream_idx < stream_count; stream_idx += 1) { - MSF_UInt stream_size = stream_size_arr[stream_idx]; - B32 is_present = stream_size != MSF_DELETED_STREAM_STAMP; - if (is_present) { - MSF_PageNumber pn_count = msf_count_pages(page_size, stream_size); - - // is there enough bytes in buffer to build stream page list? - MSF_UInt st_pn_end = st_cursor + pn_count * sizeof(MSF_PageNumber); - if (st_pn_end > stream_table_size) { - break; - } - - // setup page number array - MSF_PageNumber *pn_arr = (MSF_PageNumber*)(st_buffer + st_cursor); - st_cursor += sizeof(pn_arr[0]) * pn_count; - - // build stream page list - MSF_PageList page_list = {0}; - msf_page_list_push_extant_page_arr(arena, &page_list, page_data_list, page_size, pn_arr, pn_count); - - // alloc stream with opened pages - MSF_StreamNode *stream_node = msf_stream_alloc_(arena, stream_list); - stream_node->data.size = stream_size; - stream_node->data.page_list = page_list; - } - // stream was deleted but slot was kept to be reused in subsequent allocations - else { - MSF_StreamNode *stream_node = msf_stream_alloc_(arena, stream_list); - stream_node->data.size = stream_size; - } - } - - if (stream_list->count != stream_count) { - arena_pop_to(arena, arena_pos_before_stream_allocations); - error = MSF_OpenError_INVALID_STREAM_TABLE; - goto exit; - } - -exit:; - scratch_end(scratch); - ProfEnd(); - return error; -} - -internal MSF_Error -msf_open(String8 data, MSF_Context **msf_out) -{ - ProfBeginFunction(); - - MSF_Error error = MSF_Error_OK; - MSF_Context *msf = 0; - MSF_PageDataList page_data_list = {0}; - - // are there enough bytes for header? - if (sizeof(MSF_Header70) > data.size) { - error = MSF_OpenError_NOT_ENOUGH_BYTES_TO_READ_HEADER; - goto exit; - } - - // is this MSF 7.0? - MSF_Header70 *header = (MSF_Header70*)data.str; - if (MemoryCompare(header->magic, msf_msf70_magic, sizeof(msf_msf70_magic)) != 0) { - error = MSF_OpenError_INVALID_MAGIC; - goto exit; - } - - // validate page size - if (!IsPow2(header->page_size)) { - error = MSF_OpenError_PAGE_SIZE_IS_NOT_POW2; - goto exit; - } - - // validate page count - MSF_UInt file_page_count = msf_count_pages(header->page_size, data.size); - if (file_page_count != header->page_count) { - error = MSF_OpenError_PAGE_COUNT_DOESNT_MATCH_DATA_SIZE; - goto exit; - } - - // validate FPM - if (header->page_size < MSF_MIN_PAGE_SIZE) { - error = MSF_OpenError_INVALID_PAGE_SIZE; - goto exit; - } - if (header->page_size > MSF_MAX_PAGE_SIZE) { - error = MSF_OpenError_INVALID_PAGE_SIZE; - goto exit; - } - - // is there enough bytes to initialize PDB? - MSF_UInt check_size = header->page_size*3 + header->stream_table_size; - if (check_size > data.size) { - error = MSF_OpenError_NOT_ENOUGH_PAGES_TO_INIT; - goto exit; - } - - // validate FPM - if (header->active_fpm != MSF_FPM0 && header->active_fpm != MSF_FPM1) { - error = MSF_OpenError_INVALID_ACTIVE_FPM; - goto exit; - } - - // is there enough bytes to initialize root stream? - MSF_UInt root_pn_offset = OffsetOf(MSF_Header70, root_pn); - if (root_pn_offset + header->stream_table_size > data.size) { - error = MSF_OpenError_INVALID_ROOT_STREAM_PAGE_NUMBER; - goto exit; - } - - // validate root directory - MSF_UInt root_directory_page_count = msf_count_pages(header->page_size, header->stream_table_size); - MSF_UInt root_directory_max_page_count = header->page_size / sizeof(MSF_UInt); - if (root_directory_page_count > root_directory_max_page_count) { - error = MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES; - goto exit; - } - - // allocate MSF context and don't reserve special pages - msf = msf_alloc__(arena_alloc(.name = "MSF"), header->page_size, header->active_fpm); - - // divide data into fixed size nodes (with 4KB page each node is 128MB) - msf_set_page_data_list(msf->arena, &page_data_list, header->page_size, data); - - do { - MSF_PageList header_page_list = {0}; - error = msf_open_header(msf->arena, page_data_list, header->page_size, &header_page_list); - if (error != MSF_Error_OK) { - break; - } - - MSF_PageList root_page_list = {0}; - error = msf_open_root(msf->arena, page_data_list, header->page_size, header->root_pn, header->stream_table_size, &root_page_list); - if (error != MSF_Error_OK) { - break; - } - - MSF_PageList st_page_list = {0}; - error = msf_open_stream_table_page_list(msf->arena, page_data_list, header->page_size, root_page_list, header->stream_table_size, &st_page_list); - if (error != MSF_Error_OK) { - break; - } - - MSF_StreamList stream_list = {0}; - error = msf_open_stream_table(msf->arena, page_data_list, header->page_size, st_page_list, header->stream_table_size, &stream_list); - if (error != MSF_Error_OK) { - break; - } - - Assert(msf->page_size == header->page_size); - Assert(msf->active_fpm == header->active_fpm); - msf->page_count = header->page_count; - msf->page_data_list = page_data_list; - msf->header_page_list = header_page_list; - msf->root_page_list = root_page_list; - msf->st_page_list = st_page_list; - msf->sectab = stream_list; - - *msf_out = msf; - -#if LNK_PARANOID - msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, header_page_list, MSF_PAGE_STATE_ALLOC); - msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, root_page_list, MSF_PAGE_STATE_ALLOC); - msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, st_page_list, MSF_PAGE_STATE_ALLOC); - for (MSF_StreamNode *stream_node = stream_list.first; stream_node != 0; stream_node = stream_node->next) { - msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, stream_node->data.page_list, MSF_PAGE_STATE_ALLOC); - } -#endif - } while(0); - -exit:; - if (error != MSF_Error_OK) { - if (msf) { - msf_release(&msf); - } - } - - ProfEnd(); - return error; -} - internal void msf_release(MSF_Context **msf_ptr) { diff --git a/src/linker/pdb_ext/msf_builder.h b/src/linker/pdb_ext/msf_builder.h index 7364cf7f..5dd24660 100644 --- a/src/linker/pdb_ext/msf_builder.h +++ b/src/linker/pdb_ext/msf_builder.h @@ -127,7 +127,6 @@ typedef struct //////////////////////////////// internal MSF_Context * msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm); -internal MSF_Error msf_open(String8 data, MSF_Context **msf_out); internal void msf_release(MSF_Context **msf_ptr); internal MSF_Error msf_build(MSF_Context *msf); internal U64 msf_get_save_size(MSF_Context *msf); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index dc3bafbc..4cd7fdf3 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -531,130 +531,6 @@ pdb_strtab_alloc(PDB_StringTable *strtab, U32 max) ProfEnd(); } -internal PDB_StringTableOpenError -pdb_strtab_open(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn) -{ - ProfBeginFunction(); - - PDB_StringTableOpenError err = PDB_StringTableOpenError_OK; - - Arena *arena = 0; - String8 string_buffer; - U32 bucket_max; - U32 bucket_count; - U32 *ibucket_array; - PDB_StringTableBucket **bucket_array; - - PDB_StringTableHeader header = {0}; - msf_stream_read_struct(msf, sn, &header); - - if (header.magic == PDB_StringTableHeader_MAGIC) { - if (header.version == PDB_StringTableHeader_CurrentVersion) { - Temp scratch = scratch_begin(0,0); - - arena = arena_alloc(); - - U32 string_size; - String8 offset_buffer; - - // read table data - string_size = msf_stream_read_u32(msf, sn); - string_buffer = msf_stream_read_block(arena, msf, sn, string_size); - bucket_max = msf_stream_read_u32(msf, sn); - offset_buffer = msf_stream_read_block(scratch.arena, msf, sn, bucket_max * sizeof(U32)); - bucket_count = msf_stream_read_u32(msf, sn); - - U64 expected_size = sizeof(PDB_StringTableHeader) + - string_buffer.size + - sizeof(bucket_max) + - offset_buffer.size + - sizeof(bucket_count); - U64 actual_size = msf_stream_get_size(msf, sn); - - if (expected_size <= actual_size && - string_buffer.size == string_size && - offset_buffer.size == sizeof(U32)*bucket_max && - bucket_count <= bucket_max) { - // init string table - ibucket_array = push_array_no_zero(arena, U32, bucket_max); - bucket_array = push_array_no_zero(arena, PDB_StringTableBucket *, bucket_max); - - // open buckets - PDB_StringTableBucket *node_arr = push_array_no_zero(arena, PDB_StringTableBucket, bucket_count); - U8 *string_buffer_ptr = string_buffer.str; - U8 *string_buffer_opl = string_buffer.str + string_buffer.size; - U32 *offset_array = (U32*)offset_buffer.str; - U32 bucket_read_idx = 0; - - for (U32 bucket_idx = 0; bucket_idx < bucket_max; bucket_idx += 1) { - U32 string_offset = offset_array[bucket_idx]; - - // sanity check offset - if (string_offset >= string_buffer.size) { - err = PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS; - break; - } - - // empty bucket - else if (string_offset == 0) { - ibucket_array[bucket_idx] = 0; - bucket_array[bucket_idx] = 0; - } - - // bucket with string - else { - if (bucket_read_idx >= bucket_count) { - err = PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT; - break; - } - - // get bucket - PDB_StringTableBucket *bucket = &node_arr[bucket_read_idx]; - - // init bucket - bucket->data = str8_cstring_capped(string_buffer_ptr + string_offset, string_buffer_opl); - bucket->offset = string_offset; - bucket->istr = bucket_read_idx; - - // assign bucket - bucket_array[bucket_idx] = bucket; - ibucket_array[bucket_idx] = bucket_read_idx; - - // advance - bucket_read_idx += 1; - } - } - } else { - err = PDB_StringTableOpenError_CORRUPTED; - } - - scratch_end(scratch); - } else { - err = PDB_StringTableOpenError_UNKNOWN_VERSION; - } - } else { - err = PDB_StringTableOpenError_BAD_MAGIC; - } - - if (err == PDB_StringTableOpenError_OK) { - strtab->arena = arena; - strtab->version = header.version; - strtab->size = string_buffer.size; - strtab->bucket_count = bucket_count; - strtab->bucket_max = bucket_max; - strtab->ibucket_array = ibucket_array; - strtab->bucket_array = bucket_array; - } else { - if (arena) { - arena_release(arena); - } - } - - ProfEnd(); - - return err; -} - internal void pdb_strtab_build(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn) { @@ -900,52 +776,8 @@ pdb_strtab_string_to_offset(PDB_StringTable *strtab, PDB_StringIndex stridx) return offset; } -internal String8 -pdb_string_from_string_table_open_error(PDB_StringTableOpenError err) -{ - String8 result = str8(0,0); - switch (err) { - case PDB_StringTableOpenError_OK: break; - case PDB_StringTableOpenError_BAD_MAGIC: result = str8_lit("BAD_MAGIC"); break; - case PDB_StringTableOpenError_UNKNOWN_VERSION: result = str8_lit("UNKNOWN_VERSION"); break; - case PDB_StringTableOpenError_CORRUPTED: result = str8_lit("CORRUPTED"); break; - case PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT: result = str8_lit("OFFSETS_EXCEED_BUCKET_COUNT"); break; - case PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS: result = str8_lit("STRING_OFFSET_OUT_OF_BOUNDS"); break; - } - return result; -} - //////////////////////////////// -internal PDB_OpenTypeServerError -pdb_type_server_parse_from_data_v80(String8 data, PDB_TypeServerParse *parse) -{ - ProfBeginFunction(); - - PDB_OpenTypeServerError error = PDB_OpenTypeServerError_UNKNOWN; - - PDB_TpiHeader header; MemoryZeroStruct(&header); - str8_deserial_read_struct(data, 0, &header); - Assert(header.version == PDB_TpiVersion_IMPV80); - - if (header.ti_lo >= CV_MinComplexTypeIndex && - header.ti_lo <= header.ti_hi) { - if (header.hash_bucket_count > 0 && - header.hash_bucket_count <= PDB_TYPE_SERVER_HASH_BUCKET_COUNT_MAX) { - parse->ti_range = rng_1u64(header.ti_lo, header.ti_hi); - parse->leaf_data = str8_substr(data, rng_1u64(sizeof(PDB_TpiHeader), sizeof(PDB_TpiHeader) + header.leaf_data_size )); - error = PDB_OpenTypeServerError_OK; - } else { - error = PDB_OpenTypeServerError_INVALID_BUCKET_COUNT; - } - } else { - error = PDB_OpenTypeServerError_INVALID_TI_RANGE; - } - - ProfEnd(); - return error; -} - internal B32 pdb_extract_type_server_info(String8 raw_msf, MSF_RawStreamTable *st, MSF_StreamNumber sn, Rng1U64 *ti_range_out, Rng1U64 *leaf_range_out) { @@ -979,30 +811,6 @@ pdb_extract_type_server_info(String8 raw_msf, MSF_RawStreamTable *st, MSF_Stream return is_ok; } -internal PDB_OpenTypeServerError -pdb_type_server_parse_from_data(String8 data, PDB_TypeServerParse *parse_out) -{ - PDB_OpenTypeServerError error = PDB_OpenTypeServerError_UNKNOWN; - - PDB_TpiVersion version = 0; - str8_deserial_read_struct(data, 0, &version); - - switch (version) { - case PDB_TpiVersion_IMPV80: - error = pdb_type_server_parse_from_data_v80(data, parse_out); - break; - case PDB_TpiVersion_INTV_VC2: - case PDB_TpiVersion_IMPV40: - case PDB_TpiVersion_IMPV50_INTERIM: - case PDB_TpiVersion_IMPV70: - error = PDB_OpenTypeServerError_UNSUPPORTED_VERSION; - break; - default: Assert(!"unknown TPI version"); break; - } - - return error; -} - internal PDB_TypeServer * pdb_type_server_alloc(U64 bucket_cap) { @@ -1142,34 +950,6 @@ exit: return ts; } -internal PDB_TypeServer * -pdb_type_server_open(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab) -{ - ProfBeginFunction(); - - PDB_TypeServer *ts = NULL; - - PDB_TpiVersion version = 0; - msf_stream_seek(msf, sn, 0); - msf_stream_read_struct(msf, sn, &version); - - switch (version) { - case PDB_TpiVersion_IMPV80: { - ts = pdb_type_server_open_v80(msf, sn, strtab); - } break; - case PDB_TpiVersion_INTV_VC2: - case PDB_TpiVersion_IMPV40: - case PDB_TpiVersion_IMPV50_INTERIM: - case PDB_TpiVersion_IMPV70: { - NotImplemented; - } break; - default: Assert(!"unknown TPI version"); break; - } - - ProfEnd(); - return ts; -} - internal THREAD_POOL_TASK_FUNC(pdb_write_type_to_bucket_map_32_task) { @@ -1770,86 +1550,6 @@ pdb_info_parse_from_data(String8 data, PDB_InfoParse *parse_out) } } -internal PDB_InfoContext * -pdb_info_open(MSF_Context *msf, MSF_StreamNumber sn) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - U64 info_size = msf_stream_get_size(msf, sn); - String8 info_data = msf_stream_read_block(scratch.arena, msf, sn, info_size); - - PDB_InfoParse parse = {0}; - pdb_info_parse_from_data(info_data, &parse); - - PDB_FeatureFlags flags = 0; - PDB_HashTable named_stream_ht = {0}; - if (parse.version == PDB_InfoVersion_VC70) { - // open named stream hash table - U64 cursor = 0; - U64 named_stream_ht_size = 0; - PDB_HashTableParseError named_stream_ht_error = pdb_named_stream_ht_from_data(&named_stream_ht, parse.extra_info, &named_stream_ht_size); - if (named_stream_ht_error == PDB_HashTableParseError_OK) { - cursor += named_stream_ht_size; - - // read PDB features - while (cursor < info_data.size) { - PDB_FeatureSig sig = 0; - cursor += str8_deserial_read_struct(parse.extra_info, cursor, &sig); - switch (sig) { - case PDB_FeatureSig_NULL: break; - case PDB_FeatureSig_VC140: { - flags |= PDB_FeatureFlag_HAS_ID_STREAM; - } break; - case PDB_FeatureSig_NO_TYPE_MERGE: { - flags |= PDB_FeatureFlag_NO_TYPE_MERGE; - } break; - case PDB_FeatureSig_MINIMAL_DEBUG_INFO: { - flags |= PDB_FeatureFlag_MINIMAL_DBG_INFO; - } break; - default: Assert(!"unknown feature sig"); break; - } - } - } else { - Assert(!"unable to open named stream hash table"); - } - } - - // open string table - PDB_StringTable strtab = {0}; - MSF_StreamNumber strtab_sn = pdb_find_named_stream(&named_stream_ht, PDB_NAMES_STREAM_NAME); - if (strtab_sn != MSF_INVALID_STREAM_NUMBER) { - PDB_StringTableOpenError err = pdb_strtab_open(&strtab, msf, strtab_sn); - Assert(err == PDB_StringTableOpenError_OK); - } - - // open injected source files - PDB_HashTable src_header_block_ht = {0}; - MSF_StreamNumber src_header_block_sn = pdb_find_named_stream(&named_stream_ht, PDB_SRC_HEADER_BLOCK_STREAM_NAME); - if (src_header_block_sn != MSF_INVALID_STREAM_NUMBER) { - U64 src_header_block_stream_size = msf_stream_get_size(msf, src_header_block_sn); - String8 src_header_block_data = msf_stream_read_block(scratch.arena, msf, src_header_block_sn, src_header_block_stream_size); - PDB_HashTableParseError err = pdb_src_header_block_ht_from_data(&src_header_block_ht, src_header_block_data, &strtab, 0); - Assert(err == PDB_HashTableParseError_OK); - } - - // fill out info - Arena *arena = arena_alloc(); - PDB_InfoContext *info = push_array_no_zero(arena, PDB_InfoContext, 1); - info->arena = arena; - info->time_stamp = parse.time_stamp; - info->age = parse.age; - info->guid = parse.guid; - info->flags = flags; - info->named_stream_ht = named_stream_ht; - info->src_header_block_ht = src_header_block_ht; - info->strtab = strtab; - - scratch_end(scratch); - ProfEnd(); - return info; -} - internal void pdb_info_build_src_header_block(PDB_InfoContext *info, MSF_Context *msf) { @@ -2084,113 +1784,6 @@ gsi_alloc(void) return gsi; } -internal PDB_GsiContext * -gsi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data) -{ - ProfBeginFunction(); - - PDB_GsiHeader header = {0}; - msf_stream_read_struct(msf, sn, &header); - - Arena *arena = arena_alloc(); - PDB_GsiContext *gsi = push_array(arena, PDB_GsiContext, 1); - gsi->arena = arena; - gsi->word_size = PDB_GSI_V70_WORD_SIZE; - gsi->symbol_align = PDB_GSI_V70_SYMBOL_ALIGN; - gsi->bucket_count = PDB_GSI_V70_BUCKET_COUNT; - gsi->bucket_arr = push_array(gsi->arena, CV_SymbolList, gsi->bucket_count); - - if (header.signature == PDB_GsiSignature_Basic) { - if (header.version == PDB_GsiVersion_V70) { - Temp scratch = scratch_begin(0, 0); - - Assert(header.bucket_data_size >= PDB_GSI_V70_BITMAP_SIZE); // TODO: error handle - - U64 hash_record_count = header.hash_record_arr_size / sizeof(PDB_GsiHashRecord); - PDB_GsiHashRecord *hash_record_array = push_array(scratch.arena, PDB_GsiHashRecord, hash_record_count); - msf_stream_read_array(msf, sn, &hash_record_array[0], hash_record_count); - - U32 *bitmap = push_array(scratch.arena, U32, PDB_GSI_V70_BITMAP_COUNT); - msf_stream_read_array(msf, sn, &bitmap[0], PDB_GSI_V70_BITMAP_COUNT); - - U32 compressed_offset_count = (header.bucket_data_size - PDB_GSI_V70_BITMAP_SIZE) / sizeof(U32); - U32 *compressed_offset_array = push_array(scratch.arena, U32, compressed_offset_count); - msf_stream_read_array(msf, sn, &compressed_offset_array[0], compressed_offset_count); - - U32 *compressed_offset_ptr = &compressed_offset_array[0]; - U32 *compressed_offset_opl = &compressed_offset_array[0] + compressed_offset_count; - - U32 compressed_offset_max = (header.bucket_data_size / sizeof(PDB_GsiHashRecord)) * sizeof(PDB_GsiHashRecordOffsetCalc); - - for (U32 imask = 0; imask < PDB_GSI_V70_BITMAP_COUNT; imask += 1) { - for (U32 ibit = 0; ibit < PDB_GSI_V70_WORD_SIZE; ibit += 1) { - B32 is_bucket_compressed = !!(bitmap[imask] & (1 << ibit)); - if (is_bucket_compressed) { - Assert(compressed_offset_ptr < compressed_offset_opl); - - U32 next_compressed_offset = compressed_offset_max; - if (compressed_offset_ptr + 1 < compressed_offset_opl) { - next_compressed_offset = compressed_offset_ptr[1]; - } - U32 compressed_count = (next_compressed_offset - *compressed_offset_ptr) / sizeof(PDB_GsiHashRecordOffsetCalc); - - U64 hash_record_index = *compressed_offset_ptr / sizeof(PDB_GsiHashRecordOffsetCalc); - Assert(hash_record_index < hash_record_count); - - for (PDB_GsiHashRecord *hash_record_ptr = &hash_record_array[hash_record_index], *hash_record_opl = hash_record_ptr + compressed_count; - hash_record_ptr < hash_record_opl; - hash_record_ptr += 1) { - Assert(hash_record_ptr->symbol_off > 0); - Assert(hash_record_ptr->cref > 0); - - U32 symbol_off = hash_record_ptr->symbol_off -1; - U8 *symbol_ptr = symbol_data.str + symbol_off; - U16 *size_ptr = (U16*)symbol_ptr; - CV_SymKind *kind_ptr = (CV_SymKind*)(size_ptr + 1); - U8 *data_ptr = (U8*)(kind_ptr + 1); - - if (*size_ptr >= sizeof(*kind_ptr)) { - CV_Symbol symbol; - symbol.kind = *kind_ptr; - symbol.data = str8(data_ptr, *size_ptr - sizeof(*kind_ptr)); - gsi_push(gsi, &symbol); - } else { - Assert(!"invalid global codeview symbol"); - } - } - - compressed_offset_ptr += 1; - } - } - } - - scratch_end(scratch); - } else { - Assert(!"unknown GSI version"); - } - } - - // check if buckets are sorted -#if 0 - { - for (U64 i = 0; i < gsi->bucket_count; ++i) { - CV_SymbolList *bucket = &gsi->bucket_arr[i]; - for (CV_SymbolNode *prev = bucket->first, *curr = bucket->first ? bucket->first->next : NULL; - curr != NULL; - prev = curr, curr = curr->next) { - String8 a = pdb_get_symbol_name(prev->symbol.kind, prev->symbol.data); - String8 b = pdb_get_symbol_name(curr->symbol.kind, curr->symbol.data); - int compar = string_compar(a, b, false); - Assert(compar >= 0); - } - } - } -#endif - - ProfEnd(); - return gsi; -} - internal void gsi_release(PDB_GsiContext **gsi_ptr) { @@ -2624,26 +2217,6 @@ psi_alloc(void) return psi; } -internal PDB_PsiContext * -psi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data) -{ - ProfBeginFunction(); - - Arena *arena = arena_alloc(); - PDB_PsiContext *psi = push_array(arena, PDB_PsiContext, 1); - psi->arena = arena; - - // TODO: read out address table - - PDB_PsiHeader header = {0}; - msf_stream_read_struct(msf, sn, &header); - - psi->gsi = gsi_open(msf, sn, symbol_data); - - ProfEnd(); - return psi; -} - internal void psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn) { @@ -2901,102 +2474,6 @@ dbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_Db return sec_contrib; } -internal PDB_StringTable -dbi_open_ec_names(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header) -{ - ProfBeginFunction(); - PDB_StringTable ec_names = {0}; - if (dbi_header->ec_info_size >= sizeof(PDB_StringTableHeader)) { - MSF_UInt ec_names_pos = sizeof(PDB_DbiHeader) - + dbi_header->module_info_size - + dbi_header->sec_con_size - + dbi_header->sec_map_size - + dbi_header->file_info_size - + dbi_header->tsm_size; - msf_stream_seek(msf, sn, ec_names_pos); - pdb_strtab_open(&ec_names, msf, sn); - } - ProfEnd(); - return ec_names; -} - -internal void -dbi_open_dbg_streams(MSF_StreamNumber *dbg_streams, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header) -{ - ProfBeginFunction(); - Assert(dbi_header->dbg_header_size % sizeof(dbg_streams[0]) == 0); // TODO: error handle - MSF_UInt dbg_stream_pos = sizeof(PDB_DbiHeader) - + dbi_header->module_info_size - + dbi_header->sec_con_size - + dbi_header->sec_map_size - + dbi_header->file_info_size - + dbi_header->tsm_size - + dbi_header->ec_info_size; - msf_stream_seek(msf, sn, dbg_stream_pos); - msf_stream_read(msf, sn, &dbg_streams[0], dbi_header->dbg_header_size); - ProfEnd(); -} - -internal PDB_DbiSectionList -dbi_open_section_headers(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) -{ - ProfBeginFunction(); - PDB_DbiSectionList sec_list = {0}; - U64 sec_count = msf_stream_get_size(msf, sn) / sizeof(PDB_DbiSectionNode); - PDB_DbiSectionNode *sec_nodes = push_array(arena, PDB_DbiSectionNode, sec_count); - for (U64 isec = 0; isec < sec_count; isec += 1) { - PDB_DbiSectionNode *sec = &sec_nodes[isec]; - msf_stream_read_struct(msf, sn, &sec->data); - SLLQueuePush(sec_list.first, sec_list.last, sec); - sec_list.count += 1; - } - ProfEnd(); - return sec_list; -} - -internal PDB_DbiContext * -dbi_open(MSF_Context *msf, MSF_StreamNumber sn) -{ - ProfBeginFunction(); - - PDB_DbiHeader header = {0}; - msf_stream_read_struct(msf, sn, &header); - - Arena *arena = arena_alloc(); - PDB_DbiContext *dbi = push_array(arena, PDB_DbiContext, 1); - dbi->arena = arena; - dbi->age = header.age; - dbi->machine = header.machine; - dbi->globals_sn = header.gsi_sn; - dbi->publics_sn = header.psi_sn; - dbi->symbols_sn = header.sym_sn; - - if (header.sig == PDB_DbiHeaderSignature_V1) { - switch (header.version) { - case PDB_DbiVersion_41: - case PDB_DbiVersion_50: - case PDB_DbiVersion_60: - case PDB_DbiVersion_110: { - Assert(!"TODO: support for older DBI versions"); - } break; - case PDB_DbiVersion_70: { - String8List *file_info = dbi_open_file_info(dbi->arena, msf, sn, &header); - dbi->module_list = dbi_open_module_info(dbi->arena, msf, sn, &header, file_info); - dbi->sec_contrib_list = dbi_open_sec_contrib(dbi->arena, msf, sn, &header); - // TODO: section map - //dbi->sec_map = dbi_open_sec_map(dbi->arena, msf, sn, &header); - dbi->ec_names = dbi_open_ec_names(dbi->arena, msf, sn, &header); - dbi_open_dbg_streams(&dbi->dbg_streams[0], msf, sn, &header); - dbi->section_list = dbi_open_section_headers(dbi->arena, msf, dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]); - } break; - } - } - - ProfEnd(); - return dbi; - -} - internal void dbi_build_section_header_stream(PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber sn) { @@ -3623,42 +3100,6 @@ pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U3 return pdb_alloc_(arena_alloc(.name = "PDB"), page_size, machine, time_stamp, age, guid); } -internal PDB_Context * -pdb_open(String8 data) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - PDB_Context *pdb = 0; - - MSF_Context *msf = 0; - MSF_Error msf_err = msf_open(data, &msf); - if (msf_err == MSF_Error_OK) { - Arena *arena = arena_alloc(); - pdb = push_array(arena, PDB_Context, 1); - pdb->arena = arena; - pdb->msf = msf; - pdb->info = pdb_info_open(pdb->msf, PDB_FixedStream_Info); - pdb->dbi = dbi_open(pdb->msf, PDB_FixedStream_Dbi); - if (pdb->dbi) { - MSF_UInt sym_data_size = msf_stream_get_size(pdb->msf, pdb->dbi->symbols_sn); - String8 symbol_data = msf_stream_read_block(scratch.arena, pdb->msf, pdb->dbi->symbols_sn, sym_data_size); - pdb->gsi = gsi_open(pdb->msf, pdb->dbi->globals_sn, symbol_data); - pdb->psi = psi_open(pdb->msf, pdb->dbi->publics_sn, symbol_data); - } - PDB_StringTable *strtab = &pdb->info->strtab; - pdb->type_servers[CV_TypeIndexSource_NULL] = push_array(pdb->arena, PDB_TypeServer, 1); - pdb->type_servers[CV_TypeIndexSource_TPI] = pdb_type_server_open(pdb->msf, PDB_FixedStream_Tpi, strtab); - if (pdb->info->flags & PDB_FeatureFlag_HAS_ID_STREAM) { - pdb->type_servers[CV_TypeIndexSource_IPI] = pdb_type_server_open(pdb->msf, PDB_FixedStream_Ipi, strtab); - } - } - - scratch_end(scratch); - ProfEnd(); - return pdb; -} - internal void pdb_release(PDB_Context **pdb_ptr) { @@ -3776,16 +3217,3 @@ pdb_string_from_src_error(PDB_SrcError error) return str8(0,0); } -internal String8 -pdb_string_from_open_type_server_error(PDB_OpenTypeServerError error) -{ - switch (error) { - case PDB_OpenTypeServerError_OK: return str8_lit("OK"); - case PDB_OpenTypeServerError_UNKNOWN: return str8_lit("UNKNOWN"); - case PDB_OpenTypeServerError_INVALID_BUCKET_COUNT: return str8_lit("INVALID_BUCKET_COUNT"); - case PDB_OpenTypeServerError_INVALID_TI_RANGE: return str8_lit("INVALID_TI_RANGE"); - case PDB_OpenTypeServerError_UNSUPPORTED_VERSION: return str8_lit("UNSUPPORTED_VERSION"); - } - return str8(0,0); -} - diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h index b2a9edf5..9f6f7a70 100644 --- a/src/linker/pdb_ext/pdb_builder.h +++ b/src/linker/pdb_ext/pdb_builder.h @@ -61,31 +61,12 @@ typedef struct PDB_StringTable PDB_StringTableBucket **bucket_array; } PDB_StringTable; -typedef enum -{ - PDB_StringTableOpenError_OK, - PDB_StringTableOpenError_BAD_MAGIC, - PDB_StringTableOpenError_UNKNOWN_VERSION, - PDB_StringTableOpenError_CORRUPTED, - PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS, - PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT -} PDB_StringTableOpenError; - //////////////////////////////// // Type Server #define PDB_TYPE_HINT_STEP 128 #define PDB_LEAF_ALIGN PDB_NATURAL_ALIGN -typedef enum -{ - PDB_OpenTypeServerError_OK, - PDB_OpenTypeServerError_UNKNOWN, - PDB_OpenTypeServerError_INVALID_BUCKET_COUNT, - PDB_OpenTypeServerError_INVALID_TI_RANGE, - PDB_OpenTypeServerError_UNSUPPORTED_VERSION, -} PDB_OpenTypeServerError; - typedef struct PDB_TypeBucket { struct PDB_TypeBucket *next; @@ -349,7 +330,6 @@ typedef struct // PDB internal PDB_Context * pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid); -internal PDB_Context * pdb_open(String8 data); internal void pdb_release(PDB_Context **pdb_ptr); internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi); internal void pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine); @@ -366,7 +346,6 @@ internal Guid pdb_get_guid(PDB_Context *pdb); internal PDB_InfoContext * pdb_info_alloc(U32 age, COFF_TimeStamp time_stamp, Guid guid); internal void pdb_info_parse_from_data(String8 data, PDB_InfoParse *parse_out); -internal PDB_InfoContext * pdb_info_open(MSF_Context *msf, MSF_StreamNumber sn); internal void pdb_info_build(PDB_InfoContext *info, MSF_Context *msf, MSF_StreamNumber sn); internal void pdb_info_release(PDB_InfoContext **info_ptr); internal MSF_StreamNumber pdb_push_named_stream(PDB_HashTable *named_stream_ht, MSF_Context *msf, String8 name); @@ -377,7 +356,6 @@ internal PDB_SrcError pdb_add_src(PDB_InfoContext *info, MSF_Context *msf, // GSI internal PDB_GsiContext * gsi_alloc(void); -internal PDB_GsiContext * gsi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data); internal void gsi_build(TP_Context *tp, PDB_GsiContext *gsi, MSF_Context *msf, MSF_StreamNumber gsi_sn, MSF_StreamNumber symbols_sn); internal void gsi_release(PDB_GsiContext **gsi_ptr); internal void gsi_write_build_result(TP_Context *tp, PDB_GsiBuildResult build, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn); @@ -392,7 +370,6 @@ internal CV_SymbolNode * gsi_search(PDB_GsiContext *gsi, CV_Symbol *symbol); // PSI internal PDB_PsiContext * psi_alloc(void); -internal PDB_PsiContext * psi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data); internal void psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn); internal void psi_release(PDB_PsiContext **psi_ptr); internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String8 name); @@ -405,7 +382,6 @@ internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 // DBI internal PDB_DbiContext * dbi_alloc(COFF_MachineType machine, U32 age); -internal PDB_DbiContext * dbi_open(MSF_Context *msf, MSF_StreamNumber sn); internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht); internal void dbi_release(PDB_DbiContext **dbi_ptr); internal PDB_DbiModule * dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path); @@ -452,7 +428,6 @@ internal String8 pdb_data_from_named_stream_ht(Arena *arena, PDB_HashTable *ht); // String Table internal void pdb_strtab_alloc(PDB_StringTable *strtab, U32 max); -internal PDB_StringTableOpenError pdb_strtab_open(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn); internal void pdb_strtab_build(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn); internal void pdb_strtab_release(PDB_StringTable *strtab); internal PDB_StringIndex pdb_strtab_add(PDB_StringTable *strtab, String8 string); @@ -467,16 +442,12 @@ internal U32 pdb_strtab_hash(PDB_StringTable *strtab, Strin //////////////////////////////// // Type Server -internal PDB_OpenTypeServerError pdb_type_server_parse_from_data_v80(String8 data, PDB_TypeServerParse *parse_out); -internal PDB_OpenTypeServerError pdb_type_server_parse_from_data(String8 data, PDB_TypeServerParse *parse_out); internal PDB_TypeServer * pdb_type_server_alloc(U64 bucket_count); internal PDB_TypeServer * pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab); -internal PDB_TypeServer * pdb_type_server_open(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab); internal void pdb_type_server_build(TP_Context *tp, PDB_TypeServer *ts, PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn); internal void pdb_type_server_release(PDB_TypeServer **serv_ptr); internal void pdb_type_server_push(PDB_TypeServer *ts, String8 raw_leaf); internal void pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *ts, U64 leaf_count, U8 **leaf_arr); -//internal CV_LeafNode * pdb_type_server_leaf_from_string(PDB_TypeServer *ts, String8 string); internal String8Node * pdb_type_server_reserve(PDB_TypeServer *ts, U64 count); internal String8Node * pdb_type_server_make_leaf(PDB_TypeServer *ts, CV_LeafKind kind, String8 data); internal void pdb_type_server_push_bucket(PDB_TypeServer *ts, CV_Leaf *leaf); @@ -486,6 +457,5 @@ internal PDB_TypeHashStreamInfo pdb_type_hash_stream_build(TP_Context *tp, PDB_ // Enum -> String internal String8 pdb_string_from_src_error(PDB_SrcError error); -internal String8 pdb_string_from_open_type_server_error(PDB_OpenTypeServerError error); From 232815dbe6b145a1ba8be6aec32875b46272d438 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 3 Apr 2026 11:38:22 -0700 Subject: [PATCH 328/850] branchless compact --- src/linker/lnk_debug_info.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 57704a7f..9d7ce0b4 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1827,14 +1827,9 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) U32 *symbol_hashes = 0; // [symbol_count] if (task_id == 0) { ProfBeginV("Compact Buckets [bucket_cap %llu]", bucket_cap); - { - U64 dst = 0; - for EachIndex(src, bucket_cap) { - if (buckets[src] != 0) { - buckets[dst++] = buckets[src]; - } - } - symbol_count = dst; + for EachIndex(src, bucket_cap) { + buckets[symbol_count] = buckets[src]; + symbol_count += buckets[src] != 0; } ProfEnd(); From 608a0df058348b5bb03a5a6ce7515b7288af6f9d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 6 Apr 2026 11:55:05 -0700 Subject: [PATCH 329/850] fix race in the type merger --- src/linker/lnk_debug_info.c | 89 ++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 51 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 9d7ce0b4..f126e35f 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -829,65 +829,47 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_task) LNK_LeafRef *bucket = 0; for EachIndex(leaf_idx, debug_t->count) { - // read leaf header - CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); - - // read leaf kind - CV_LeafKind kind = memory_read16(MemberFromPtr(CV_LeafHeader, header, kind)); - // alloc new bucket and assign type ref if (bucket == 0) { bucket = push_array_no_zero(arena, LNK_LeafRef, 1); } + + // fill bucket *bucket = (LNK_LeafRef){ .obj_idx = obj_idx, .leaf_idx = leaf_idx }; - CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(kind); - LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[leaf_source]; + B32 is_inserted_or_updated = 1; - { - B32 is_inserted_or_updated = 0; - U64 best_idx = debug_h->v[leaf_idx] % leaf_ht->cap; - U64 idx = best_idx; - U64 loop_count = 0; - do { - retry:; - LNK_LeafRef *curr_bucket = leaf_ht->bucket_arr[idx]; - if (curr_bucket == 0) { - LNK_LeafRef *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - bucket = 0; - is_inserted_or_updated = 1; - break; - } - // another thread took the bucket... - goto retry; - } else if (lnk_match_leaf_ref(task->input, *curr_bucket, *bucket)) { - int leaf_cmp = lnk_leaf_ref_compare(*curr_bucket, *bucket); + CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); // leaf index -> leaf header + CV_LeafKind kind = memory_read16(MemberFromPtr(CV_LeafHeader, header, kind)); // leaf header -> leaf kind + CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(kind); // leaf kind -> type stream + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[leaf_source]; // type stream -> hash table + U64 best_idx = debug_h->v[leaf_idx] % leaf_ht->cap; // leaf ref -> hash -> bucket index + U64 idx = best_idx; + do { + // load leaf ref + LNK_LeafRef *curr = ins_atomic_ptr_eval(&leaf_ht->bucket_arr[idx]); - if (leaf_cmp <= 0) { - // are we inserting bucket that was already inserterd? - Assert(leaf_cmp < 0); - is_inserted_or_updated = 1; - // don't need to update, more recent leaf is in the bucket - break; - } - - LNK_LeafRef *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - // reuse replaced bucket - bucket = compare_bucket; - is_inserted_or_updated = 1; - break; - } - - // another thread took the bucket... - goto retry; + while (curr == 0 || lnk_match_leaf_ref(task->input, *curr, *bucket)) { + // exit if leaf ref is not recent + if (curr != 0 && lnk_leaf_ref_compare(*bucket, *curr) >= 0) { + goto exit; } - // advance - idx = ((idx + 1) == leaf_ht->cap ? 0 : (idx + 1)); - } while (idx != best_idx); - Assert(is_inserted_or_updated); - } + // try to update the bucket + LNK_LeafRef *cmp = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], bucket, curr); + if (cmp == curr) { + bucket = 0; + goto exit; + } + + // another thread updated the bucket -- retry + curr = cmp; + } + + // advance to next bucket + idx = ((idx + 1) == leaf_ht->cap ? 0 : (idx + 1)); + } while (idx != best_idx); + is_inserted_or_updated = 0; + exit:; + Assert(is_inserted_or_updated); } ProfEnd(); @@ -1178,6 +1160,11 @@ lnk_fixup_cv_type_indices(LNK_MergeTypes *ctx, U32 obj_idx, String8 data, CV_Typ final_leaf, final_hash); } +#if BUILD_DEBUG + else { + lnk_error_obj(LNK_Error_InvalidTypeIndex, ctx->input->obj_arr[obj_idx], "no itype 0x%x", ti); + } +#endif } else { Assert(0 && "invalid type index"); } From aad1805124490cb4f17c310b0edf97c17bbf2579 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 6 Apr 2026 11:55:51 -0700 Subject: [PATCH 330/850] make GSI and PSI serialization deterministic --- src/linker/lnk_debug_info.c | 14 +-- src/linker/pdb_ext/pdb_builder.c | 145 ++++++++++++++++++++++--------- 2 files changed, 108 insertions(+), 51 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index f126e35f..59f28680 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1313,7 +1313,7 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) ProfBeginFunction(); Temp scratch = temp_begin(lnk_get_huge_arena()); - LNK_MergeTypes task = { .input = input, }; + LNK_MergeTypes task = { .input = input }; U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex)); task.fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_ti_list_size, max_ti_list_size); @@ -1761,22 +1761,16 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) ProfBegin("Global Symbols"); { - VoidList global_symbols = {0}; - Rng1U64 symbol_input_range = task->cv->symbol_input_ranges[task_id]; - for EachInRange(i, symbol_input_range) { + VoidList global_symbols = {0}; + for EachInRange(i, task->cv->symbol_input_ranges[task_id]) { LNK_SymbolInput symbols = task->cv->symbol_inputs[i]; for (U64 cursor = 0, depth = 0; cursor + sizeof(CV_SymbolHeader) <= symbols.raw_symbols.size; ) { CV_Symbol symbol = {0}; TryReadBreak(cv_read_symbol(symbols.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); - if (cv_is_global_symbol(symbol.kind)) { + if (cv_is_global_symbol(symbol.kind) || (depth == 0 && cv_is_typedef(symbol.kind))) { void *ptr = cv_ptr_from_symbol(symbol); void_list_push(scratch.arena, &global_symbols, ptr); - } else if (cv_is_typedef(symbol.kind)) { - if (depth == 0) { - void *ptr = cv_ptr_from_symbol(symbol); - void_list_push(scratch.arena, &global_symbols, ptr); - } } if (cv_is_scope_symbol(symbol.kind)) { diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 4cd7fdf3..63c8d163 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1903,13 +1903,73 @@ THREAD_POOL_TASK_FUNC(gsi_size_buckets_task) } } +force_inline int +gsi_symbol_is_before(void *raw_a, void *raw_b) +{ + CV_Symbol *a = *(CV_Symbol **)raw_a; + CV_Symbol *b = *(CV_Symbol **)raw_b; + + String8 a_name = cv_name_from_symbol(a->kind, a->data); + String8 b_name = cv_name_from_symbol(b->kind, b->data); + + int is_before; + if (a_name.size != b_name.size) { + is_before = a_name.size < b_name.size; + } else { + is_before = str8_compar_ignore_case(&a_name, &b_name) < 0; + } + + return is_before; +} + +internal int +gsi_pub_symbol_is_before(void *raw_a, void *raw_b) +{ + CV_Symbol *a = *(CV_Symbol **)raw_a; + CV_Symbol *b = *(CV_Symbol **)raw_b; + + String8 a_name = cv_name_from_symbol(a->kind, a->data); + String8 b_name = cv_name_from_symbol(b->kind, b->data); + + int is_before; + if (a_name.size != b_name.size) { + is_before = a_name.size < b_name.size; + } else { + int cmp = str8_compar_ignore_case(&a_name, &b_name); + if (cmp == 0) { + CV_SymPub32 *a_sym = (CV_SymPub32 *)a->data.str; + CV_SymPub32 *b_sym = (CV_SymPub32 *)b->data.str; + cmp = u16_compar(&a_sym->sec, &b_sym->sec); + if (cmp == 0) { + cmp = u32_compar(&a_sym->off, &b_sym->off); + } + } + + is_before = cmp < 0; + } + + return is_before; +} + internal THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) { + Temp scratch = scratch_begin(&arena, 1); + U64 bucket_idx = task_id; PDB_GsiSerializeSymbolsTask *task = raw_task; - CV_SymbolList bucket_list = task->bucket_arr[bucket_idx]; + CV_SymbolList bucket = task->bucket_arr[bucket_idx]; + + CV_Symbol **symbol_arr = push_array(scratch.arena, CV_Symbol *, bucket.count); + { + U64 i = 0; + for EachNode(n, CV_SymbolNode, bucket.first) { symbol_arr[i++] = &n->data; } + } + + // sort symbols within bucket + radsort(symbol_arr, bucket.count, gsi_pub_symbol_is_before); + PDB_GsiSortRecord *sort_record_arr = task->sort_record_arr_arr[bucket_idx]; U64 buffer_size = task->bucket_size_arr[bucket_idx]; U64 buffer_base = task->bucket_off_arr[bucket_idx]; @@ -1917,14 +1977,12 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) U64 sort_idx = 0; U64 buffer_cursor = 0; + for EachIndex(i, bucket.count) { + Assert(symbol_arr[i]->kind == CV_SymKind_PUB32); - for (CV_SymbolNode *node = bucket_list.first; node != 0; node = node->next) { - CV_Symbol *symbol = &node->data; - Assert(symbol->kind == CV_SymKind_PUB32); - - CV_SymPub32 *pub32 = (CV_SymPub32 *)symbol->data.str; + CV_SymPub32 *pub32 = (CV_SymPub32 *)symbol_arr[i]->data.str; U8 *str_ptr = (U8 *)(pub32 + 1); - U64 str_size = symbol->data.size - sizeof(*pub32); + U64 str_size = symbol_arr[i]->data.size - sizeof(*pub32); String8 name = str8(str_ptr, str_size); // init sort record @@ -1934,57 +1992,62 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) sr->offset = buffer_cursor; // serialize symbol - U64 serial_size = cv_write_symbol(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align); + U64 serial_size = cv_write_symbol(buffer, buffer_cursor, buffer_size, symbol_arr[i], task->symbol_align); // advance sort_idx += 1; buffer_cursor += serial_size; } - - Assert(sort_idx == bucket_list.count); + Assert(sort_idx == bucket.count); Assert(buffer_cursor == buffer_size); - // sort symbols by name within bucket - gsi_record_sort_by_name(sort_record_arr, bucket_list.count); + scratch_end(scratch); } internal THREAD_POOL_TASK_FUNC(gsi_serialize_symbols_task) { - U64 bucket_idx = task_id; - PDB_GsiSerializeSymbolsTask *task = raw_task; + Temp scratch = scratch_begin(&arena, 1); - CV_SymbolList bucket_list = task->bucket_arr[bucket_idx]; - PDB_GsiSortRecord *sort_record_arr = task->sort_record_arr_arr[bucket_idx]; - U64 buffer_size = task->bucket_size_arr[bucket_idx]; - U64 buffer_base = task->bucket_off_arr[bucket_idx]; - U8 *buffer = task->buffer + buffer_base; + U64 bucket_idx = task_id; + PDB_GsiSerializeSymbolsTask *task = raw_task; + CV_SymbolList bucket = task->bucket_arr[bucket_idx]; - U64 sort_idx = 0; - U64 buffer_cursor = 0; - - for (CV_SymbolNode *node = bucket_list.first; node != 0; node = node->next) { - CV_Symbol *symbol = &node->data; - - // init sort record - PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx]; - //sr->isect_off = isect_off(0,0); - sr->name = cv_name_from_symbol(symbol->kind, symbol->data); - sr->offset = buffer_cursor; - - // serialize symbol - U64 serial_size = cv_write_symbol(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align); - - // advance - sort_idx += 1; - buffer_cursor += serial_size; + CV_Symbol **symbol_arr = push_array(scratch.arena, CV_Symbol *, bucket.count); + { + U64 i = 0; + for EachNode(n, CV_SymbolNode, bucket.first) { symbol_arr[i++] = &n->data; } } - Assert(sort_idx == bucket_list.count); - Assert(buffer_cursor == buffer_size); + // sort symbols within bucket + radsort(symbol_arr, bucket.count, gsi_symbol_is_before); - // sort symbols by name within bucket - gsi_record_sort_by_name(sort_record_arr, bucket_list.count); + // symbol -> GSI sort record + { + PDB_GsiSortRecord *sort_record_arr = task->sort_record_arr_arr[bucket_idx]; + U64 buffer_size = task->bucket_size_arr[bucket_idx]; + U64 buffer_base = task->bucket_off_arr[bucket_idx]; + U8 *buffer = task->buffer + buffer_base; + + U64 sort_idx = 0; + U64 buffer_cursor = 0; + for EachIndex(i, bucket.count) { + // init sort record + PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx]; + sr->name = cv_name_from_symbol(symbol_arr[i]->kind, symbol_arr[i]->data); + sr->offset = buffer_cursor; + sort_idx += 1; + + // serialize symbol + U64 serial_size = cv_write_symbol(buffer, buffer_cursor, buffer_size, symbol_arr[i], task->symbol_align); + buffer_cursor += serial_size; + } + + Assert(sort_idx == bucket.count); + Assert(buffer_cursor == buffer_size); + } + + scratch_end(scratch); } internal PDB_GsiBuildResult From 8cc89861977741a68fd4dcf0b236a3ab498d750f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 6 Apr 2026 11:56:37 -0700 Subject: [PATCH 331/850] WIP test PDB determinism --- src/torture/torture.c | 10 ++++++++++ src/torture/torture.h | 1 + src/torture/torture_radlink.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/src/torture/torture.c b/src/torture/torture.c index 7bae4739..6edc083a 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -60,6 +60,16 @@ t_read_file(Arena *arena, String8 name) return data; } +internal B32 +t_delete_file(String8 name) +{ + Temp scratch = scratch_begin(0,0); + String8 path = t_make_file_path(scratch.arena, name); + B32 is_deleted = os_delete_file_at_path(path); + scratch_end(scratch); + return is_deleted; +} + internal String8 t_make_file_path(Arena *arena, String8 name) { diff --git a/src/torture/torture.h b/src/torture/torture.h index 7a1638f6..2c5b5a89 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -83,6 +83,7 @@ return result_; \ internal B32 t_write_file_list(String8 name, String8List data); internal B32 t_write_file(String8 name, String8 data); internal String8 t_read_file(Arena *arena, String8 name); +internal B32 t_delete_file(String8 name); internal String8 t_make_file_path(Arena *arena, String8 name); // test runner diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 90df9e12..b3f8506d 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4758,6 +4758,36 @@ T_BeginTest(patch_cv_symbol_tree) } T_EndTest; +#if 0 +T_BeginTest(pdb_determ_test) +{ + T_Ok(os_copy_file_path(t_make_file_path(scratch.arena, str8_lit("torture_main.obj")), str8_lit("torture_main.obj"))); + + t_delete_file(str8_lit("a.pdb")); + t_delete_file(str8_lit("b.pdb")); + + String8 refs_path = t_make_file_path(scratch.arena, str8_lit("b.types")); + t_invoke_linkerf("torture_main.obj /debug:full /rad_time_stamp:0 /rad_workers:1 /rad_store_types:%S /out:a.exe", refs_path); + T_Ok(g_last_exit_code == 0); + T_Ok(os_move_file_path(t_make_file_path(scratch.arena, str8_lit("b.pdb")), t_make_file_path(scratch.arena, str8_lit("a.pdb")))); + String8 b = t_read_file(scratch.arena, str8_lit("b.pdb")); + + for EachIndex(i, 50) { + Temp temp = temp_begin(scratch.arena); + + t_delete_file(str8_lit("a.pdb")); + t_invoke_linkerf("torture_main.obj /debug:full /rad_time_stamp:0 /out:a.exe"); + T_Ok(g_last_exit_code == 0); + + String8 a = t_read_file(temp.arena, str8_lit("a.pdb")); + T_Ok(str8_match(a, b, 0)); + + temp_end(temp); + } +} +T_EndTest; +#endif + #if 0 T_BeginTest(fold_two_funcs) From 890f7afcccfc6ca383260b71942910689fa87922 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 6 Apr 2026 12:17:25 -0700 Subject: [PATCH 332/850] take exit code before closing process handle --- src/os/core/win32/os_core_win32.c | 8 ++++---- src/torture/torture.c | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index fb0c0185..47761924 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1072,10 +1072,6 @@ os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); DWORD result = WaitForSingleObject(process, sleep_ms); B32 process_joined = (result == WAIT_OBJECT_0); - if(process_joined) - { - CloseHandle(process); - } if(process_joined && exit_code_out) { DWORD exit_code = 0; @@ -1084,6 +1080,10 @@ os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) *exit_code_out = exit_code; } } + if(process_joined) + { + CloseHandle(process); + } return process_joined; } diff --git a/src/torture/torture.c b/src/torture/torture.c index 6edc083a..e458edb9 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -209,8 +209,6 @@ t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, S } else { os_process_kill(process_handle); } - - os_process_detach(process_handle); } scratch_end(scratch); From 3bb8983461aed16e071d2a48e670bb07e50542ff Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 6 Apr 2026 14:35:38 -0700 Subject: [PATCH 333/850] implement /WHOLEARCHIVE --- src/linker/lnk.c | 30 +++++++-- src/linker/lnk_config.c | 122 +++++++++++++++++++--------------- src/linker/lnk_config.h | 3 + src/torture/torture_radlink.c | 79 ++++++++++++++++++++++ 4 files changed, 175 insertions(+), 59 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 4eebee03..ff9b235b 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1603,14 +1603,34 @@ lnk_link_inputs(TP_Context *tp, lib_member_infos = push_array(link->arena, LNK_LibMemberInfo, lib->member_count); hash_table_push_raw_raw(link->arena, link->lib_member_infos_ht, lib, lib_member_infos); } - + + B32 link_whole_archive = config->whole_archive_all; + if ( ! link_whole_archive) { + String8 lib_name = str8_chop_last_dot(str8_skip_last_slash(lib->path)); + link_whole_archive = hash_table_search_path(config->whole_archive_ht, lib_name) != 0; + } + ProfBeginV("Search %S", str8_skip_last_slash(lib->path)); do { lnk_load_inputs(tp, arena, config, inputer, symtab, link); - // search symbols in lib - MemoryZeroTyped(member_ref_lists, tp->worker_count); - tp_for_parallel(tp, arena, tp->worker_count, lnk_search_lib_task, &(LNK_SearchLibTask){ .search_anti_deps = search_anti_deps, .lib = lib, .symtab = symtab, .lib_member_infos = lib_member_infos, .member_ref_lists = member_ref_lists }); + if (link_whole_archive) { + LNK_LibMemberRef *member_refs = push_array(scratch.arena, LNK_LibMemberRef, lib->member_count); + for EachIndex(member_idx, lib->member_count) { + static LNK_Symbol *null_symbol = 0; + if (null_symbol == 0) { + null_symbol = push_array(inputer->arena, LNK_Symbol, 1); + null_symbol->refs = push_array(inputer->arena, LNK_ObjSymbolRefNode, 1); + null_symbol->refs->v.obj = &link->objs.first->data; + } + lnk_queue_lib_member(scratch.arena, &member_ref_lists[0], null_symbol, lib, lib_member_infos, member_idx); + } + } else { + // search symbols in lib + MemoryZeroTyped(member_ref_lists, tp->worker_count); + LNK_SearchLibTask search_task = { .search_anti_deps = search_anti_deps, .lib = lib, .symtab = symtab, .lib_member_infos = lib_member_infos, .member_ref_lists = member_ref_lists }; + tp_for_parallel(tp, arena, tp->worker_count, lnk_search_lib_task, &search_task); + } LNK_LibMemberRefList queued_members = {0}; lnk_lib_member_ref_list_concat_in_place_array(&queued_members, member_ref_lists, tp->worker_count); @@ -1646,7 +1666,7 @@ lnk_link_inputs(TP_Context *tp, temp_end(temp); } } - + // push inputs for lib member refs for EachIndex(i, queued_members.count) { LNK_LibMemberRef *member_ref = member_refs[i]; diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 7e72e2f1..6d5d7496 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -3,61 +3,62 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { - { LNK_CmdSwitch_Null, 0, "", "", "" }, - { LNK_CmdSwitch_NotImplemented, 0, "NOT_IMPLEMENTED", "", "" }, - { LNK_CmdSwitch_Align, 0, "ALIGN", ":#", "Set section alignment in the virtual address space." }, - { LNK_CmdSwitch_AllowBind, 0, "ALLOWBIND", "[:NO]", "Toggles bind bit in the image header." }, - { LNK_CmdSwitch_AllowIsolation, 0, "ALLOWISOLATION", "[:NO]", "Toggles isolation bit in the image header." }, - { LNK_CmdSwitch_AlternateName, 1, "ALTERNATENAME", ":FROM=TO", "Creates a symbol alias \"FROM=TO\"." }, - { LNK_CmdSwitch_AppContainer, 0, "APPCONTAINER", "[:NO]", "Toggles app container bit in the image header." }, - { LNK_CmdSwitch_Base, 0, "BASE", "{ADDRESS[,SIZE]|@FILENAME,KEY}", "Set default image base address." }, - { LNK_CmdSwitch_Brepro, 0, "BREPRO", "", "No support." }, - { LNK_CmdSwitch_Debug, 0, "DEBUG", "[:{FULL|NONE}]", "Controls debug info level." }, - { LNK_CmdSwitch_DefaultLib, 1, "DEFAULTLIB", ":LIBNAME", "Set default library." }, - { LNK_CmdSwitch_Delay, 0, "DELAY", ":{NOBIND|UNLOAD}", "Controls emission of unload and bind tables." }, - { LNK_CmdSwitch_DelayLoad, 0, "DELAYLOAD", ":DLL", "Delay load DLL." }, - { LNK_CmdSwitch_Dll, 0, "DLL", "", "Link to a DLL." }, - { LNK_CmdSwitch_DisallowLib, 1, "DISALLOWLIB", ":LIBRARY", "Prevents LIBRARY from being linked.", }, - { LNK_CmdSwitch_DynamicBase, 0, "DYNAMICBASE", "[:NO]", "Enable random base address in the linked image." }, - { LNK_CmdSwitch_Entry, 1, "ENTRY", ":FUNCTION", "Name of the entry point symbol." }, - { LNK_CmdSwitch_Export, 1, "EXPORT", ":SYMBOL", "Create an export entry for SYMBOL." }, - { LNK_CmdSwitch_FailIfMismatch, 1, "FAILIFMISMATCH", "{id=value}", "Fails to link if same ids have conflicting values." }, - { LNK_CmdSwitch_FileAlign, 0, "FILEALIGN", ":#", "Set section alignment in the file." }, - { LNK_CmdSwitch_Fixed, 0, "FIXED", "[:NO]", "Load the image at the default base address." }, - { LNK_CmdSwitch_FunctionPadMin, 0, "FUNCTIONPADMIN", ":#", "Minimum function byte size." }, - { LNK_CmdSwitch_Heap, 0, "HEAP", "RESERVE[,COMMIT]", "Set reserve and commit size for the heap." }, - { LNK_CmdSwitch_HighEntropyVa, 0, "HIGHENTROPYVA", "[:NO]", "Indicate that image supports full 64-bit address space ASLR." }, - { LNK_CmdSwitch_Ignore, 0, "IGNORE", ":#", "Ignore a warning." }, - { LNK_CmdSwitch_ImpLib, 0, "IMPLIB", ":FILENAME", "Set file name for the import library." }, - { LNK_CmdSwitch_Include, 1, "INCLUDE", ":SYMBOL", "Force a link against SYMBOL." }, - { LNK_CmdSwitch_InferAsanLibs, 1, "INFERASANLIBS", "[:NO]", "No support." }, - { LNK_CmdSwitch_InferAsanLibsNo, 1, "INFERASANLIBSNO", "", "No support.", }, - { LNK_CmdSwitch_LargeAddressAware, 0, "LARGEADDRESSAWARE", "[:NO]", "For images that can handle addresses > 2GiB." }, - { LNK_CmdSwitch_Lib, 0, "LIB", "", "Turn linker into lib.exe." }, - { LNK_CmdSwitch_LibPath, 0, "LIBPATH", ":DIR", "Add DIR for the linker to search for libraries." }, - { LNK_CmdSwitch_Machine, 0, "MACHINE", ":{X64|X86}", "Image target platform." }, - { LNK_CmdSwitch_Manifest, 0, "MANIFEST", "[:{EMBED[,ID=#]|NO]", "Controls whether the linker should create a side manifest." }, - { LNK_CmdSwitch_ManifestDependency, 1, "MANIFESTDEPENDENCY", ":\"manifest dependency XML string\"", "Add a manifest dependency." }, - { LNK_CmdSwitch_ManifestFile, 0, "MANIFESTFILE", ":FILENAME", "Specifies a manifest file." }, - { LNK_CmdSwitch_ManifestInput, 0, "MANIFESTINPUT", ":FILENAME", "Manifest that is embedded in the image." }, + { LNK_CmdSwitch_Null, 0, "", "", "" }, + { LNK_CmdSwitch_NotImplemented, 0, "NOT_IMPLEMENTED", "", "" }, + { LNK_CmdSwitch_Align, 0, "ALIGN", ":#", "Set section alignment in the virtual address space." }, + { LNK_CmdSwitch_AllowBind, 0, "ALLOWBIND", "[:NO]", "Toggles bind bit in the image header." }, + { LNK_CmdSwitch_AllowIsolation, 0, "ALLOWISOLATION", "[:NO]", "Toggles isolation bit in the image header." }, + { LNK_CmdSwitch_AlternateName, 1, "ALTERNATENAME", ":FROM=TO", "Creates a symbol alias \"FROM=TO\"." }, + { LNK_CmdSwitch_AppContainer, 0, "APPCONTAINER", "[:NO]", "Toggles app container bit in the image header." }, + { LNK_CmdSwitch_Base, 0, "BASE", "{ADDRESS[,SIZE]|@FILENAME,KEY}", "Set default image base address." }, + { LNK_CmdSwitch_Brepro, 0, "BREPRO", "", "No support." }, + { LNK_CmdSwitch_Debug, 0, "DEBUG", "[:{FULL|NONE}]", "Controls debug info level." }, + { LNK_CmdSwitch_DefaultLib, 1, "DEFAULTLIB", ":LIBNAME", "Set default library." }, + { LNK_CmdSwitch_Delay, 0, "DELAY", ":{NOBIND|UNLOAD}", "Controls emission of unload and bind tables." }, + { LNK_CmdSwitch_DelayLoad, 0, "DELAYLOAD", ":DLL", "Delay load DLL." }, + { LNK_CmdSwitch_Dll, 0, "DLL", "", "Link to a DLL." }, + { LNK_CmdSwitch_DisallowLib, 1, "DISALLOWLIB", ":LIBRARY", "Prevents LIBRARY from being linked.", }, + { LNK_CmdSwitch_DynamicBase, 0, "DYNAMICBASE", "[:NO]", "Enable random base address in the linked image." }, + { LNK_CmdSwitch_Entry, 1, "ENTRY", ":FUNCTION", "Name of the entry point symbol." }, + { LNK_CmdSwitch_Export, 1, "EXPORT", ":SYMBOL", "Create an export entry for SYMBOL." }, + { LNK_CmdSwitch_FailIfMismatch, 1, "FAILIFMISMATCH", "{id=value}", "Fails to link if same ids have conflicting values." }, + { LNK_CmdSwitch_FileAlign, 0, "FILEALIGN", ":#", "Set section alignment in the file." }, + { LNK_CmdSwitch_Fixed, 0, "FIXED", "[:NO]", "Load the image at the default base address." }, + { LNK_CmdSwitch_FunctionPadMin, 0, "FUNCTIONPADMIN", ":#", "Minimum function byte size." }, + { LNK_CmdSwitch_Heap, 0, "HEAP", "RESERVE[,COMMIT]", "Set reserve and commit size for the heap." }, + { LNK_CmdSwitch_HighEntropyVa, 0, "HIGHENTROPYVA", "[:NO]", "Indicate that image supports full 64-bit address space ASLR." }, + { LNK_CmdSwitch_Ignore, 0, "IGNORE", ":#", "Ignore a warning." }, + { LNK_CmdSwitch_ImpLib, 0, "IMPLIB", ":FILENAME", "Set file name for the import library." }, + { LNK_CmdSwitch_Include, 1, "INCLUDE", ":SYMBOL", "Force a link against SYMBOL." }, + { LNK_CmdSwitch_InferAsanLibs, 1, "INFERASANLIBS", "[:NO]", "No support." }, + { LNK_CmdSwitch_InferAsanLibsNo, 1, "INFERASANLIBSNO", "", "No support.", }, + { LNK_CmdSwitch_LargeAddressAware, 0, "LARGEADDRESSAWARE", "[:NO]", "For images that can handle addresses > 2GiB." }, + { LNK_CmdSwitch_Lib, 0, "LIB", "", "Turn linker into lib.exe." }, + { LNK_CmdSwitch_LibPath, 0, "LIBPATH", ":DIR", "Add DIR for the linker to search for libraries." }, + { LNK_CmdSwitch_Machine, 0, "MACHINE", ":{X64|X86}", "Image target platform." }, + { LNK_CmdSwitch_Manifest, 0, "MANIFEST", "[:{EMBED[,ID=#]|NO]", "Controls whether the linker should create a side manifest." }, + { LNK_CmdSwitch_ManifestDependency, 1, "MANIFESTDEPENDENCY", ":\"manifest dependency XML string\"", "Add a manifest dependency." }, + { LNK_CmdSwitch_ManifestFile, 0, "MANIFESTFILE", ":FILENAME", "Specifies a manifest file." }, + { LNK_CmdSwitch_ManifestInput, 0, "MANIFESTINPUT", ":FILENAME", "Manifest that is embedded in the image." }, { LNK_CmdSwitch_ManifestUac, 0, "MANIFESTUAC", ":{NO|{'level'={'asInvoker'|'highestAvailable'|'requireAdministrator'} ['uiAccess'={'true'|'false'}]}}", "Controls UAC information in the manifest." }, - { LNK_CmdSwitch_Merge, 1, "MERGE", ":FROM=TO", "Merges sections." }, - { LNK_CmdSwitch_Natvis, 0, "NATVIS", ":FILENAME", "NATVIS to embed in the PDB." }, - { LNK_CmdSwitch_NoDefaultLib, 1, "NODEFAULTLIB", ":LIBNAME", "Ignore a /DEFAULTLIB." }, - { LNK_CmdSwitch_NoDefaultLib, 0, "NOD", ":LIBNAME", "Alias for /NODEFAULTLIB." }, - { LNK_CmdSwitch_NoExp, 0, "NOEXP", "", "No support." }, - { LNK_CmdSwitch_NoImpLib, 0, "NOIMPLIB", "", "Do not create the import library." }, - { LNK_CmdSwitch_NxCompat, 0, "NXCOMPAT", "[:NO]", "Image is compatible with data execution prevention." }, - { LNK_CmdSwitch_Opt, 0, "OPT", "{REF|ICF}", "Optimizations." }, - { LNK_CmdSwitch_Out, 0, "OUT", ":FILENAME", "File name of the output image." }, - { LNK_CmdSwitch_Pdb, 0, "PDB", ":FILENAME", "File name of the output PDB." }, - { LNK_CmdSwitch_PdbAltPath, 0, "PDBALTPATH", ":PATH", "Alternative output path for the PDB." }, - { LNK_CmdSwitch_PdbPageSize, 0, "PDBPAGESIZE", ":#", "Page size must be power of two." }, - { LNK_CmdSwitch_Release, 1, "RELEASE", "", "Write image checksum." }, - { LNK_CmdSwitch_Stack, 1, "STACK", ":RESERVE[,COMMIT]", "Set reserve and commit size for the stack." }, - { LNK_CmdSwitch_SubSystem, 1, "SUBSYSTEM", ":{CONSOLE|NATIVE|WINDOWS}[,#[.##]]", "Set subsystem for the image." }, - { LNK_CmdSwitch_TsAware, 0, "TSAWARE", "[:NO]", "Image is terminal server aware." }, - { LNK_CmdSwitch_Version, 0, "VERSION", "", "Image version." }, + { LNK_CmdSwitch_Merge, 1, "MERGE", ":FROM=TO", "Merges sections." }, + { LNK_CmdSwitch_Natvis, 0, "NATVIS", ":FILENAME", "NATVIS to embed in the PDB." }, + { LNK_CmdSwitch_NoDefaultLib, 1, "NODEFAULTLIB", ":LIBNAME", "Ignore a /DEFAULTLIB." }, + { LNK_CmdSwitch_NoDefaultLib, 0, "NOD", ":LIBNAME", "Alias for /NODEFAULTLIB." }, + { LNK_CmdSwitch_NoExp, 0, "NOEXP", "", "No support." }, + { LNK_CmdSwitch_NoImpLib, 0, "NOIMPLIB", "", "Do not create the import library." }, + { LNK_CmdSwitch_NxCompat, 0, "NXCOMPAT", "[:NO]", "Image is compatible with data execution prevention." }, + { LNK_CmdSwitch_Opt, 0, "OPT", "{REF|ICF}", "Optimizations." }, + { LNK_CmdSwitch_Out, 0, "OUT", ":FILENAME", "File name of the output image." }, + { LNK_CmdSwitch_Pdb, 0, "PDB", ":FILENAME", "File name of the output PDB." }, + { LNK_CmdSwitch_PdbAltPath, 0, "PDBALTPATH", ":PATH", "Alternative output path for the PDB." }, + { LNK_CmdSwitch_PdbPageSize, 0, "PDBPAGESIZE", ":#", "Page size must be power of two." }, + { LNK_CmdSwitch_Release, 1, "RELEASE", "", "Write image checksum." }, + { LNK_CmdSwitch_Stack, 1, "STACK", ":RESERVE[,COMMIT]", "Set reserve and commit size for the stack." }, + { LNK_CmdSwitch_SubSystem, 1, "SUBSYSTEM", ":{CONSOLE|NATIVE|WINDOWS}[,#[.##]]", "Set subsystem for the image." }, + { LNK_CmdSwitch_TsAware, 0, "TSAWARE", "[:NO]", "Image is terminal server aware." }, + { LNK_CmdSwitch_Version, 0, "VERSION", "", "Image version." }, + { LNK_CmdSwitch_WholeArchive, 0, "WHOLEARCHIVE", "[:LIBNAME]", "Force linker to pull in all objs from the specified lib." }, { LNK_CmdSwitch_Rad_Age, 0, "RAD_AGE", ":#", "Age embeded in EXE and PDB, used to validate incremental build. Default is 1." }, { LNK_CmdSwitch_Rad_AltPchDir, 0, "RAD_ALT_PCH_DIR", ":PATH", "Alternative directory to search for PCH object files." }, @@ -1775,6 +1776,18 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_cmd_switch_parse_version(obj, cmd_switch, value_strings, &config->image_ver); } break; + case LNK_CmdSwitch_WholeArchive: { + if (value_strings.node_count == 0) { + config->whole_archive_all = 1; + } else { + String8 lib_name; + if (lnk_cmd_switch_parse_string(obj, cmd_switch, value_strings, &lib_name)) { + lib_name = str8_chop_last_dot(str8_skip_last_slash(lib_name)); + hash_table_push_path_string(config->arena, config->whole_archive_ht, lib_name, str8_zero()); + } + } + } break; + case LNK_CmdSwitch_Rad_Age: { lnk_cmd_switch_parse_u32(obj, cmd_switch, value_strings, &config->age, 0); } break; @@ -2086,6 +2099,7 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) config->delay_load_ht = hash_table_init(arena, 0x100); config->disallow_lib_ht = hash_table_init(arena, 0x100); config->fail_if_mismatch_ht = hash_table_init(arena, 0x100); + config->whole_archive_ht = hash_table_init(arena, 0x100); // process command line switches for (LNK_CmdOption *cmd = cmd_line.first_option; cmd != 0; cmd = cmd->next) { diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 401a578f..70d20ffb 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -85,6 +85,7 @@ typedef enum LNK_CmdSwitch_Time, LNK_CmdSwitch_TsAware, LNK_CmdSwitch_Version, + LNK_CmdSwitch_WholeArchive, LNK_CmdSwitch_Rad_Age, LNK_CmdSwitch_Rad_AltPchDir, @@ -350,6 +351,8 @@ typedef struct LNK_Config HashTable *delay_load_ht; HashTable *disallow_lib_ht; HashTable *fail_if_mismatch_ht; + HashTable *whole_archive_ht; + B32 whole_archive_all; U64 unresolved_symbol_limit; U64 unresolved_symbol_ref_limit; LNK_SwitchState map_lines_for_unresolved_symbols; diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index b3f8506d..8bbf6846 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4758,6 +4758,85 @@ T_BeginTest(patch_cv_symbol_tree) } T_EndTest; +T_BeginTest(whole_archive) +{ + String8 a_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); + a_obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + String8 b_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".b"), PE_DATA_SECTION_FLAGS, str8_lit("b")); + b_obj = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_release(&cow); + } + + String8 a_lib; + { + COFF_LibWriter *ciw = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(ciw, str8_lit("a.obj"), a_obj); + a_lib = coff_lib_writer_serialize(scratch.arena, ciw, 0, 0, 1); + coff_lib_writer_release(&ciw); + } + + String8 b_lib; + { + COFF_LibWriter *ciw = coff_lib_writer_alloc(); + coff_lib_writer_push_obj(ciw, str8_lit("b.obj"), b_obj); + b_lib = coff_lib_writer_serialize(scratch.arena, ciw, 0, 0, 1); + coff_lib_writer_release(&ciw); + } + + T_Ok(t_write_entry_obj()); + T_Ok(t_write_file(str8_lit("a.lib"), a_lib)); + T_Ok(t_write_file(str8_lit("b.lib"), b_lib)); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:all_libs.exe entry.obj /wholearchive a.lib b.lib"); + T_Ok(g_last_exit_code == 0); + { + String8 exe = t_read_file(scratch.arena, str8_lit("all_libs.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *a_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); + COFF_SectionHeader *b_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".b")); + T_Ok(a_sect != 0); + T_Ok(b_sect != 0); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:only_a.exe entry.obj /wholearchive:a.lib a.lib b.lib"); + T_Ok(g_last_exit_code == 0); + { + String8 exe = t_read_file(scratch.arena, str8_lit("only_a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *a_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); + COFF_SectionHeader *b_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".b")); + T_Ok(a_sect != 0); + T_Ok(b_sect == 0); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:only_b.exe /wholearchive:b.lib a.lib b.lib entry.obj"); + T_Ok(g_last_exit_code == 0); + { + String8 exe = t_read_file(scratch.arena, str8_lit("only_b.exe")); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *a_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); + COFF_SectionHeader *b_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".b")); + T_Ok(a_sect == 0); + T_Ok(b_sect != 0); + } +} +T_EndTest; + #if 0 T_BeginTest(pdb_determ_test) { From e54bef58dfb047c5056f7cb30128b9de46421a8e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 6 Apr 2026 22:18:26 -0700 Subject: [PATCH 334/850] implement /INFERASANLIBS --- src/linker/lnk.c | 101 ++++++++++++++++++++++++++++++--- src/linker/lnk.h | 2 +- src/linker/lnk_config.c | 13 +++++ src/linker/lnk_config.h | 3 + src/linker/lnk_log.h | 1 + src/linker/lnk_obj.c | 2 +- src/linker/lnk_obj.h | 4 +- src/torture/torture.c | 18 ++++++ src/torture/torture.h | 4 ++ src/torture/torture_radlink.c | 102 ++++++++++++++++++++++++++++++++-- 10 files changed, 233 insertions(+), 17 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index ff9b235b..0ae43fdc 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1350,7 +1350,7 @@ lnk_load_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer AssertAlways(include_obj_count == 1); if (obj_with_includes) { - DLLInsert(link->objs.first, link->objs.last, obj_with_includes->node, include_obj); + DLLInsert(link->objs.first, link->objs.last, obj_with_includes->self, include_obj); link->objs.count += 1; } else { lnk_obj_list_push_node(&link->objs, include_obj); @@ -1579,6 +1579,40 @@ THREAD_POOL_TASK_FUNC(lnk_search_lib_task) } } +internal LNK_Lib * +lnk_find_first_crt_lib(LNK_Config *config, LNK_Inputer *inputer) +{ + Temp scratch = scratch_begin(0, 0); + + LNK_Lib *result = 0; + + String8 crt_lib_names[] = { + str8_lit("msvcrt"), + str8_lit("msvcrtd"), + str8_lit("libcmt"), + str8_lit("libcmtd"), + }; + + for EachNode(n, LNK_Input, inputer->libs.first) { + String8 lib_name = str8_chop_last_dot(str8_skip_last_slash(n->path)); + for EachElement(i, crt_lib_names) { + if (str8_match(lib_name, crt_lib_names[i], StringMatchFlag_CaseInsensitive)) { + if (result == 0) { + result = hash_table_search_path_raw(inputer->libs_ht, n->path); + break; + } else { + LNK_Lib *lib = hash_table_search_path_raw(inputer->libs_ht, n->path); + result = lib->input_idx < result->input_idx ? lib : result; + break; + } + } + } + } + + scratch_end(scratch); + return result; +} + internal void lnk_link_inputs(TP_Context *tp, TP_Arena *arena, @@ -1598,6 +1632,57 @@ lnk_link_inputs(TP_Context *tp, for EachNode(lib_n, LNK_LibNode, link->libs.first) { LNK_Lib *lib = &lib_n->data; + if (config->machine != COFF_MachineType_Unknown) { + if (config->infer_asan_libs == LNK_SwitchState_Yes) { + if ( ! link->asan_libs_resolved) { + LNK_Lib *crt_lib = lnk_find_first_crt_lib(config, inputer); + if (crt_lib != 0) { + String8 crt_lib_name = str8_chop_last_dot(str8_skip_last_slash(crt_lib->path)); + + String8 arch_name = {0}; + if (config->machine == COFF_MachineType_X64) { + arch_name = str8_lit("x86_64"); + } else if (config->machine == COFF_MachineType_X86) { + arch_name = str8_lit("i386"); + } + + if (arch_name.size) { + B32 link_vc_libs = lnk_symbol_table_searchf(symtab, "__you_must_link_with_VCAsan_lib") != 0 || + lnk_symbol_table_searchf(symtab, "___you_must_link_with_VCAsan_lib") != 0; + if (str8_match(crt_lib_name, str8_lit("msvcrt"), StringMatchFlag_CaseInsensitive) || str8_match(crt_lib_name, str8_lit("msvcrtd"), StringMatchFlag_CaseInsensitive)) { + String8 dynamic_lib_name = str8f(inputer->arena, "clang_rt.asan_dynamic-%S.lib", arch_name); + String8 thunk_lib_name = str8f(inputer->arena, "clang_rt.asan_static_runtime_thunk-%S.lib", arch_name); + lnk_whole_archive(config, thunk_lib_name); + lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, dynamic_lib_name); + lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, thunk_lib_name); + if (link_vc_libs) { + if (str8_match(crt_lib_name, str8_lit("msvcrtd"), StringMatchFlag_CaseInsensitive)) { + lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, str8_lit("libvcasand.lib")); + } else { + lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, str8_lit("libvcasan.lib")); + } + } + } else if (str8_match(crt_lib_name, str8_lit("libcmt"), StringMatchFlag_CaseInsensitive) || str8_match(crt_lib_name, str8_lit("libcmtd"), StringMatchFlag_CaseInsensitive)) { + String8 dynamic_lib_name = str8f(inputer->arena, "clang_rt.asan_dynamic-%S.lib", arch_name); + String8 thunk_lib_name = str8f(inputer->arena, "clang_rt.asan_dynamic_runtime_thunk-%S.lib", arch_name); + lnk_whole_archive(config, thunk_lib_name); + lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, dynamic_lib_name); + lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, thunk_lib_name); + if (link_vc_libs) { + if (str8_match(crt_lib_name, str8_lit("libcmtd"), StringMatchFlag_CaseInsensitive)) { + lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, str8_lit("vcasand.lib")); + } else { + lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, str8_lit("vcasan.lib")); + } + } + } + link->asan_libs_resolved = 1; + } + } + } + } + } + LNK_LibMemberInfo *lib_member_infos = hash_table_search_raw_raw(link->lib_member_infos_ht, lib); if (lib_member_infos == 0) { lib_member_infos = push_array(link->arena, LNK_LibMemberInfo, lib->member_count); @@ -1615,15 +1700,15 @@ lnk_link_inputs(TP_Context *tp, lnk_load_inputs(tp, arena, config, inputer, symtab, link); if (link_whole_archive) { + local_persist LNK_Symbol *null_symbol = 0; + if (null_symbol == 0) { + null_symbol = push_array(inputer->arena, LNK_Symbol, 1); + null_symbol->refs = push_array(inputer->arena, LNK_ObjSymbolRefNode, 1); + null_symbol->refs->v.obj = &link->objs.first->data; + } LNK_LibMemberRef *member_refs = push_array(scratch.arena, LNK_LibMemberRef, lib->member_count); for EachIndex(member_idx, lib->member_count) { - static LNK_Symbol *null_symbol = 0; - if (null_symbol == 0) { - null_symbol = push_array(inputer->arena, LNK_Symbol, 1); - null_symbol->refs = push_array(inputer->arena, LNK_ObjSymbolRefNode, 1); - null_symbol->refs->v.obj = &link->objs.first->data; - } - lnk_queue_lib_member(scratch.arena, &member_ref_lists[0], null_symbol, lib, lib_member_infos, member_idx); + lnk_queue_lib_member(arena->v[0], &member_ref_lists[0], null_symbol, lib, lib_member_infos, member_idx); } } else { // search symbols in lib diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 2f8b8fbf..7ce1ebe3 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -37,7 +37,6 @@ typedef struct LNK_Input B32 has_disk_read_failed; B32 exclude_from_debug_info; LNK_LibMemberRef *link_member; - void *loaded_input; struct LNK_Input *next; } LNK_Input; @@ -104,6 +103,7 @@ typedef struct LNK_Link HashTable *lib_member_infos_ht; LNK_LibMemberRefList imports; B32 try_to_resolve_entry_point; + B32 asan_libs_resolved; } LNK_Link; typedef struct LNK_LinkResult diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 6d5d7496..ffb665b5 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -974,6 +974,15 @@ lnk_include_symbol(LNK_Config *config, String8 name, LNK_Obj *obj) hash_table_push_string_raw(config->arena, config->include_symbol_ht, name, node); } +internal void +lnk_whole_archive(LNK_Config *config, String8 lib_name) +{ + String8Node value = { .string = lib_name }; + String8List value_strings = {0}; + str8_list_push_node(&value_strings, &value); + lnk_apply_cmd_option_to_config(config, str8_lit("wholearchive"), value_strings, 0); +} + internal void lnk_print_build_info() { @@ -1443,6 +1452,10 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; + case LNK_CmdSwitch_InferAsanLibs: { + lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->infer_asan_libs); + } break; + case LNK_CmdSwitch_LargeAddressAware: { lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->file_characteristics, PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE); } break; diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 70d20ffb..56b1eb4a 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -293,6 +293,7 @@ typedef struct LNK_Config U64 function_pad_min; U64 *manifest_resource_id; B32 no_default_libs; + LNK_SwitchState infer_asan_libs; Version link_ver; Version os_ver; Version image_ver; @@ -550,6 +551,8 @@ internal B32 lnk_is_lib_disallowed(LNK_Config *config, String8 path); internal void lnk_include_symbol(LNK_Config *config, String8 name, struct LNK_Obj *obj); +internal void lnk_whole_archive(LNK_Config *config, String8 lib_name); + // --- Config ------------------------------------------------------------------ internal void lnk_apply_cmd_option_to_config(LNK_Config *config, String8 name, String8List value_list, struct LNK_Obj *obj); diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index c92b0e52..75080f98 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -107,6 +107,7 @@ typedef enum LNK_Warning_DirectiveSectionWithRelocs, LNK_Warning_NoLargeAddressAwarenessForDll, LNK_Warning_TryingToExportEntryPoint, + LNK_Warning_InferAsanFail, LNK_Warning_Last, LNK_Error_Count diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 90bf0464..220af7f3 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -336,7 +336,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) obj->exclude_from_debug_info = input->exclude_from_debug_info; obj->hotpatch = hotpatch; obj->associated_sections = associated_sections; - obj->node = &task->objs[task_id]; + obj->self = &task->objs[task_id]; obj->link_member = input->link_member; } diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h index 9fca1cb5..b852bce7 100644 --- a/src/linker/lnk_obj.h +++ b/src/linker/lnk_obj.h @@ -16,10 +16,8 @@ typedef struct LNK_Obj B8 exclude_from_debug_info; U32Node **associated_sections; LNK_SymbolHashTrie **symlinks; - struct LNK_LibMemberRef *link_member; - - struct LNK_ObjNode *node; + struct LNK_ObjNode *self; } LNK_Obj; typedef struct LNK_ObjNode diff --git a/src/torture/torture.c b/src/torture/torture.c index e458edb9..a9b5668f 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -119,6 +119,24 @@ t_radbin_path(void) return path; } +internal String8 +t_cl_path(void) +{ + local_persist String8 path = {0}; + if (path.size == 0) { + local_persist U8 buffer[4096]; + ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; + Arena *arena = arena_alloc_(¶ms); +#if OS_WINDOWS + path = str8_lit("cl.exe"); +#else + path = str8_lit("cl"); +#endif + AssertAlways(path.size); + } + return path; +} + internal String8 t_radlink_path(void) { diff --git a/src/torture/torture.h b/src/torture/torture.h index 2c5b5a89..f0e1fe8b 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -91,6 +91,10 @@ internal void t_run_caller(void *raw_ctx); internal void t_run_fail_handler(void *raw_ctx); internal T_RunResult t_run(T_Run run); +internal String8 t_radbin_path(void); +internal String8 t_cl_path(void); +internal String8 t_radlink_path(void); + internal B32 t_invoke(String8 exe, String8 cmdline, U64 timeout); diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 8bbf6846..49c38e74 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4837,19 +4837,111 @@ T_BeginTest(whole_archive) } T_EndTest; +#if OS_WINDOWS + +internal B32 +t_radlink_validate_asan_out(String8 obj_name) +{ + Temp scratch = scratch_begin(0,0); + B32 is_ok = 0; + + t_invoke_(t_radlink_path(), str8f(scratch.arena, "%S /debug:full", obj_name), max_U64, 0, 0); + if (g_last_exit_code != 0) { goto exit; } + + String8 exe_path = t_make_file_path(scratch.arena, str8f(scratch.arena, "%S.exe", str8_chop_last_dot(obj_name))); + String8 out = {0}; + t_invoke_(exe_path, str8_zero(), max_U64, scratch.arena, &out); + if (g_last_exit_code == 0) { + goto exit; + } + + String8 s = out; + + String8 header = t_chop_line(&s); + if ( ! str8_match(header, str8_lit("================================================================="), 0)) { + goto exit; + } + + String8 cause = t_chop_line(&s); + if ( str8_find_needle(cause, 0, str8_lit("AddressSanitizer: heap-use-after-free on address"), 0) >= cause.size) { + goto exit; + } + + is_ok = 1; + exit:; + scratch_end(scratch); + return is_ok; +} + +T_BeginTest(infer_asan) +{ + char *program = + "#include \n" + " int main(void) {\n" + "int *foo = malloc(sizeof(*foo));\n" + "free(foo);\n" + "*foo = 1;\n" + "}\n" + ; + + // /MD + { + T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); + String8 cl_output = {0}; + t_invoke_(t_cl_path(), str8_lit("/MD /fsanitize=address /Z7 /c /Fo:main_md.obj main.c"), max_U64, scratch.arena, &cl_output); + T_Ok(g_last_exit_code == 0); + T_Ok(t_radlink_validate_asan_out(str8_lit("main_md.obj"))); + } + + // /MDd + { + T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); + String8 cl_output = {0}; + t_invoke_(t_cl_path(), str8_lit("/MDd /fsanitize=address /Z7 /c /Fo:main_mdd.obj main.c"), max_U64, scratch.arena, &cl_output); + T_Ok(g_last_exit_code == 0); + T_Ok(t_radlink_validate_asan_out(str8_lit("main_mdd.obj"))); + } + + // /MT + { + T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); + String8 cl_output = {0}; + t_invoke_(t_cl_path(), str8_lit("/MT /fsanitize=address /Z7 /c /Fo:main_mt.obj main.c"), max_U64, scratch.arena, &cl_output); + T_Ok(g_last_exit_code == 0); + T_Ok(t_radlink_validate_asan_out(str8_lit("main_mt.obj"))); + } + + // /MTd + { + T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); + String8 cl_output = {0}; + t_invoke_(t_cl_path(), str8_lit("/MT /fsanitize=address /Z7 /c /Fo:main_mtd.obj main.c"), max_U64, scratch.arena, &cl_output); + T_Ok(g_last_exit_code == 0); + T_Ok(t_radlink_validate_asan_out(str8_lit("main_mtd.obj"))); + } +} +T_EndTest; +#endif + #if 0 -T_BeginTest(pdb_determ_test) +T_BeginTest(determ_test) { T_Ok(os_copy_file_path(t_make_file_path(scratch.arena, str8_lit("torture_main.obj")), str8_lit("torture_main.obj"))); + t_delete_file(str8_lit("a.exe")); + t_delete_file(str8_lit("b.exe")); t_delete_file(str8_lit("a.pdb")); t_delete_file(str8_lit("b.pdb")); String8 refs_path = t_make_file_path(scratch.arena, str8_lit("b.types")); t_invoke_linkerf("torture_main.obj /debug:full /rad_time_stamp:0 /rad_workers:1 /rad_store_types:%S /out:a.exe", refs_path); T_Ok(g_last_exit_code == 0); + + T_Ok(os_move_file_path(t_make_file_path(scratch.arena, str8_lit("b.exe")), t_make_file_path(scratch.arena, str8_lit("a.exe")))); T_Ok(os_move_file_path(t_make_file_path(scratch.arena, str8_lit("b.pdb")), t_make_file_path(scratch.arena, str8_lit("a.pdb")))); - String8 b = t_read_file(scratch.arena, str8_lit("b.pdb")); + + String8 b_exe = t_read_file(scratch.arena, str8_lit("b.exe")); + String8 b_pdb = t_read_file(scratch.arena, str8_lit("b.pdb")); for EachIndex(i, 50) { Temp temp = temp_begin(scratch.arena); @@ -4858,8 +4950,10 @@ T_BeginTest(pdb_determ_test) t_invoke_linkerf("torture_main.obj /debug:full /rad_time_stamp:0 /out:a.exe"); T_Ok(g_last_exit_code == 0); - String8 a = t_read_file(temp.arena, str8_lit("a.pdb")); - T_Ok(str8_match(a, b, 0)); + String8 a_exe = t_read_file(temp.arena, str8_lit("a.exe")); + String8 a_pdb = t_read_file(temp.arena, str8_lit("a.pdb")); + T_Ok(str8_match(a_exe, b_exe, 0)); + T_Ok(str8_match(a_pdb, b_pdb, 0)); temp_end(temp); } From 44d09410ebf9dc311dc6ce8f1422ec78fc7e501a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 7 Apr 2026 10:49:48 -0700 Subject: [PATCH 335/850] bugfix global symbol dedup --- src/linker/codeview_ext/codeview.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 66435866..fe24e48b 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -289,7 +289,7 @@ cv_symbol_match(CV_Symbol a, CV_Symbol b) CV_SymbolHeader *b_ptr = (CV_SymbolHeader *)cv_ptr_from_symbol(b); if (a_ptr->size == b_ptr->size) { - is_match = MemoryMatch(a_ptr + sizeof(CV_SymSize), b_ptr + sizeof(CV_SymSize), a_ptr->size); + is_match = MemoryMatch((U8*)a_ptr + sizeof(CV_SymSize), (U8*)b_ptr + sizeof(CV_SymSize), a_ptr->size); } return is_match; From 5a0bddafad7b9d7ca67521b7e14035a63f788cc8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 7 Apr 2026 11:27:20 -0700 Subject: [PATCH 336/850] test EXE and PDB determinism --- src/torture/torture.c | 16 ++++++++++++++++ src/torture/torture.h | 2 ++ src/torture/torture_radlink.c | 17 +++++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index a9b5668f..468b0f14 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -155,6 +155,22 @@ t_radlink_path(void) return path; } +internal String8 +t_src_path(void) +{ + local_persist U8 path[4096] = {0}; + if (path[0] == 0) { + Temp scratch = scratch_begin(0, 0); + String8 cwd = os_get_current_path(scratch.arena); + cwd = str8_chop_last_slash(cwd); + cwd = str8f(scratch.arena, "%S/src", cwd); + MemoryCopyStr8(path, cwd); + path[cwd.size] = 0; + scratch_end(scratch); + } + return str8_cstring_capped(path, path+sizeof(path)); +} + internal B32 t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, String8 *output_out) { diff --git a/src/torture/torture.h b/src/torture/torture.h index f0e1fe8b..be2f10de 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -94,7 +94,9 @@ internal T_RunResult t_run(T_Run run); internal String8 t_radbin_path(void); internal String8 t_cl_path(void); internal String8 t_radlink_path(void); +internal String8 t_src_path(void); internal B32 t_invoke(String8 exe, String8 cmdline, U64 timeout); +#define t_invoke_cl(f, ...) t_invoke_(t_cl_path(), str8f(scratch.arena, f, ## __VA_ARGS__), max_U64, 0, 0) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 49c38e74..56fbf39b 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4923,31 +4923,40 @@ T_BeginTest(infer_asan) T_EndTest; #endif -#if 0 +#if OS_WINDOWS T_BeginTest(determ_test) { - T_Ok(os_copy_file_path(t_make_file_path(scratch.arena, str8_lit("torture_main.obj")), str8_lit("torture_main.obj"))); + // compile the test target (torture) + String8 cl_line = str8f(scratch.arena, "/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); + String8 cl_out = {0}; + t_invoke_(t_cl_path(), cl_line, max_U64, scratch.arena, &cl_out); + T_Ok(g_last_exit_code == 0); + // clean up t_delete_file(str8_lit("a.exe")); t_delete_file(str8_lit("b.exe")); t_delete_file(str8_lit("a.pdb")); t_delete_file(str8_lit("b.pdb")); + // single-threaded link String8 refs_path = t_make_file_path(scratch.arena, str8_lit("b.types")); - t_invoke_linkerf("torture_main.obj /debug:full /rad_time_stamp:0 /rad_workers:1 /rad_store_types:%S /out:a.exe", refs_path); + t_invoke_linkerf("test.obj /debug:full /rad_time_stamp:0 /rad_workers:1 /rad_store_types:%S /out:a.exe", refs_path); T_Ok(g_last_exit_code == 0); + // rename a -> b T_Ok(os_move_file_path(t_make_file_path(scratch.arena, str8_lit("b.exe")), t_make_file_path(scratch.arena, str8_lit("a.exe")))); T_Ok(os_move_file_path(t_make_file_path(scratch.arena, str8_lit("b.pdb")), t_make_file_path(scratch.arena, str8_lit("a.pdb")))); + // read b String8 b_exe = t_read_file(scratch.arena, str8_lit("b.exe")); String8 b_pdb = t_read_file(scratch.arena, str8_lit("b.pdb")); + // multi-threaded links for EachIndex(i, 50) { Temp temp = temp_begin(scratch.arena); t_delete_file(str8_lit("a.pdb")); - t_invoke_linkerf("torture_main.obj /debug:full /rad_time_stamp:0 /out:a.exe"); + t_invoke_linkerf("test.obj /debug:full /rad_time_stamp:0 /out:a.exe"); T_Ok(g_last_exit_code == 0); String8 a_exe = t_read_file(temp.arena, str8_lit("a.exe")); From 960f439a59e1daa4d7fcd76e1fabb6623745ccfa Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 7 Apr 2026 15:26:35 -0600 Subject: [PATCH 337/850] notes --- src/eval/eval_core.h | 4 ++-- src/raddbg/raddbg_main.c | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 51eb6c13..c48e0d29 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -262,8 +262,8 @@ struct E_Expr E_TypeKey type_key; E_Value value; String8 string; - String8 qualifier; - String8 disambiguator; + String8 qualifier; + String8 disambiguator; String8 bytecode; }; diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index b47a98d4..b418308f 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,23 @@ //////////////////////////////// //~ rjf: post-0.9.20 TODO notes // +//- fabian complaints / reports +// [ ] eval: pointer casts of register space should promote to process space +// [ ] simplified default layout +// [ ] signify empty watch window "expression" slot more as a text field? +// [ ] ambiguous parsing cases - need to re-introduce identifier resolution into eval parse. (foo *)&bar +// [ ] more control over string visualization; specifically, when *not* to do it, even when using e.g. char *s +// [ ] broadly, view discoverability / docs +// [ ] memory view deserves larger spot, in default layout +// [ ] broadly, need to complete memory view & fix issues +// [ ] dumb panel click-through thing +// [ ] correct type interpretations; togglable interpretations +// [ ] make address editable; specialized version of the cursor address editor in tab right-click menu +// [ ] `foo, x` needs to correctly match `hex(foo)`, e.g. in application to expansions +// [ ] sign bits should not display on unsigned integers? +// [ ] fix for-loop stepping oddities, likely single-line for-loop stepping +// [ ] source/disasm ctx menu should include options for e.g. "go to selected thread" +// //- namespace/locations/variables RDI pass // [ ] RDI_Local, RDI_GlobalVariable, RDI_ThreadVariable -> RDI_Variable // [ ] RDI_Variable gets RDI_ContainerFlags, and a container_idx From fee9f9a2c35ed117f1e9ea90672e783ad21dd6a1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 7 Apr 2026 17:16:56 -0600 Subject: [PATCH 338/850] when resolving irtrees to values, promote register spaces -> containing process space; fixes pointer casts to register values --- project.4coder | 2 +- src/ctrl/ctrl_core.c | 2 ++ src/eval/eval_core.h | 1 + src/eval/eval_ir.c | 5 +++++ src/raddbg/raddbg_core.c | 1 + 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/project.4coder b/project.4coder index dcef9767..0d66816b 100644 --- a/project.4coder +++ b/project.4coder @@ -48,7 +48,7 @@ commands = //- rjf: [raddbg] // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin debug", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 30ae8cd2..97d7e1ac 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -4892,6 +4892,8 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C ctx->thread_arch = thread->arch; ctx->thread_reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); ctx->thread_reg_space.u64_0 = (U64)thread; + ctx->thread_process_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->thread_process_space.u64_0 = (U64)process; //- rjf: fill debug infos ctx->dbg_infos = eval_dbg_infos; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index c48e0d29..bf376b9d 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -768,6 +768,7 @@ struct E_BaseCtx U64 thread_ip_vaddr; U64 thread_ip_voff; E_Space thread_reg_space; + E_Space thread_process_space; Arch thread_arch; U64 thread_unwind_count; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index aee91800..5ed0b8c5 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -305,6 +305,10 @@ e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_Type { result = e_irtree_mem_read_type(arena, tree, type_key); } + if(from_mode == E_Mode_Offset && e_space_match(tree->space, e_base_ctx->thread_reg_space)) + { + result = e_irtree_set_space(arena, e_base_ctx->thread_process_space, result); + } if(e_type_kind_from_key(type_key) == E_TypeKind_Bitfield) { E_Type *type = e_type_from_key(type_key); @@ -2651,6 +2655,7 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space { e_append_oplist_from_irtree(arena, child, current_space, out); } + e_oplist_push_set_space(arena, out, space); }break; case RDI_EvalOp_Cond: diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 6ae49298..6eda13da 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11121,6 +11121,7 @@ rd_frame(void) ctx->thread_ip_vaddr = rip_vaddr; ctx->thread_ip_voff = rip_voff; ctx->thread_reg_space = rd_eval_space_from_ctrl_entity(thread, CTRL_EvalSpaceKind_Entity); + ctx->thread_process_space= rd_eval_space_from_ctrl_entity(process, CTRL_EvalSpaceKind_Entity); ctx->thread_arch = thread->arch; ctx->thread_unwind_count = unwind_count; From 77afc94cee4bbb7ab6acc0be4cb5853eba715c69 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 7 Apr 2026 17:37:06 -0600 Subject: [PATCH 339/850] correctly apply lens type flags in shorthand chained exprs (fixes foo,x hex inheriatnce) --- src/eval/eval_ir.c | 6 +++++- src/raddbg/raddbg_main.c | 12 ++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 5ed0b8c5..43b74c8d 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -2404,9 +2404,13 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I if(str8_match(chained_expr->string, shorthand_lens_pair_table[shorthand_idx].shorthand, 0)) { String8 full_name = shorthand_lens_pair_table[shorthand_idx].full_name; + E_Expr *lens_spec_expr = e_string2expr_map_lookup(e_ir_ctx->macro_map, full_name); + E_TypeKey lens_spec_type_key = lens_spec_expr->type_key; + E_Type *lens_spec_type = e_type_from_key(lens_spec_type_key); result.type_key = e_type_key_cons(.kind = E_TypeKind_Lens, .direct_key = result.type_key, - .name = full_name); + .name = full_name, + .flags = lens_spec_type->flags); matches_shorthand = 1; break; } diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index b418308f..2373b425 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -5,18 +5,18 @@ //~ rjf: post-0.9.20 TODO notes // //- fabian complaints / reports -// [ ] eval: pointer casts of register space should promote to process space +// [x] `foo, x` needs to correctly match `hex(foo)`, e.g. in application to expansions +// [ ] broadly, need to complete memory view & fix issues +// [ ] dumb panel click-through thing +// [ ] correct type interpretations; togglable interpretations +// [ ] make address editable; specialized version of the cursor address editor in tab right-click menu +// [x] eval: pointer casts of register space should promote to process space // [ ] simplified default layout // [ ] signify empty watch window "expression" slot more as a text field? // [ ] ambiguous parsing cases - need to re-introduce identifier resolution into eval parse. (foo *)&bar // [ ] more control over string visualization; specifically, when *not* to do it, even when using e.g. char *s // [ ] broadly, view discoverability / docs // [ ] memory view deserves larger spot, in default layout -// [ ] broadly, need to complete memory view & fix issues -// [ ] dumb panel click-through thing -// [ ] correct type interpretations; togglable interpretations -// [ ] make address editable; specialized version of the cursor address editor in tab right-click menu -// [ ] `foo, x` needs to correctly match `hex(foo)`, e.g. in application to expansions // [ ] sign bits should not display on unsigned integers? // [ ] fix for-loop stepping oddities, likely single-line for-loop stepping // [ ] source/disasm ctx menu should include options for e.g. "go to selected thread" From 33b121215b43fabfb9175e7482a1aa09503b46af Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 7 Apr 2026 21:17:05 -0700 Subject: [PATCH 340/850] remove T_EndTest --- src/torture/torture.c | 5 +- src/torture/torture.h | 51 +- src/torture/torture_base.c | 53 +- src/torture/torture_d2r.c | 23 +- src/torture/torture_dwarf.c | 94 ++- src/torture/torture_radlink.c | 1192 +++++++++++++++------------------ src/torture/torture_radlink.h | 4 +- 7 files changed, 660 insertions(+), 762 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index 468b0f14..31ce4f0a 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -79,8 +79,11 @@ t_make_file_path(Arena *arena, String8 name) internal void t_run_caller(void *raw_ctx) { + Temp scratch = scratch_begin(0,0); T_RunCtx *ctx = raw_ctx; - ctx->result = ctx->run(); + ctx->result.status = T_RunStatus_Pass; + ctx->run(scratch.arena, &ctx->result); + scratch_end(scratch); } internal void diff --git a/src/torture/torture.h b/src/torture/torture.h index be2f10de..44c68d4b 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -20,7 +20,8 @@ typedef struct char *fail_cond; } T_RunResult; -typedef T_RunResult (*T_Run)(void); +#define T_RunSig(name) void t_##name(Arena *arena, T_RunResult *result_out) +typedef void (*T_Run)(Arena *arena, T_RunResult *result_out); typedef struct { @@ -39,42 +40,34 @@ typedef struct extern U64 g_torture_test_count; extern T_Test g_torture_tests[0xffffff]; -#define T_AddTest(name, l, ...) \ -T_RunResult t_##name(void); \ -__VA_ARGS__ void t_add_test_##name(void) \ -{ \ -g_torture_tests[g_torture_test_count].group = T_Group; \ -g_torture_tests[g_torture_test_count].label = Stringify(name); \ -g_torture_tests[g_torture_test_count].r = &t_##name; \ -g_torture_tests[g_torture_test_count].decl_line = l; \ -g_torture_test_count += 1; \ -} +#define T_AddTest(name, l, ...) \ + T_RunSig(name); \ + __VA_ARGS__ void t_add_test_##name(void) \ + { \ + g_torture_tests[g_torture_test_count].group = T_Group; \ + g_torture_tests[g_torture_test_count].label = Stringify(name); \ + g_torture_tests[g_torture_test_count].r = &t_##name; \ + g_torture_tests[g_torture_test_count].decl_line = l; \ + g_torture_test_count += 1; \ + } #if COMPILER_MSVC #pragma section(".CRT$XCU", read) -# define T_BeginTest_(name) \ -T_AddTest(name, __LINE__) \ -__declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ -__pragma(comment(linker, "/include:" Stringify(r_##name))) +# define T_BeginTest_(name) \ + T_AddTest(name, __LINE__) \ + __declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ + __pragma(comment(linker, "/include:" Stringify(r_##name))) #else # define T_BeginTest_(name) \ -T_AddTest(name, __LINE__, __attribute__((constructor))) + T_AddTest(name, __LINE__, __attribute__((constructor))) #endif -#define T_BeginTest(name) \ -T_BeginTest_(name) \ -T_RunResult t_##name(void) { \ -Temp scratch = scratch_begin(0,0); \ -T_RunResult result_ = { .status = T_RunStatus_Fail }; +#define T_BeginTest(name) \ + T_BeginTest_(name) \ + T_RunSig(name) -#define T_EndTest \ -result_.status = T_RunStatus_Pass; \ -exit__:; \ -scratch_end(scratch); \ -return result_; \ -} - -#define T_Ok(c) do { if (!(c)) { result_.fail_file = __FILE__; result_.fail_line = __LINE__; result_.fail_cond = Stringify(c); goto exit__; } } while(0) +#define T_Ok(c) do { if (!(c)) { result_out->fail_file = __FILE__; result_out->fail_line = __LINE__; result_out->fail_cond = Stringify(c); result_out->status = T_RunStatus_Fail; return; } } while(0) +#define T_Fail() T_Ok(!(c)) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) //////////////////////////////// diff --git a/src/torture/torture_base.c b/src/torture/torture_base.c index 724820ed..730356ad 100644 --- a/src/torture/torture_base.c +++ b/src/torture/torture_base.c @@ -9,65 +9,64 @@ T_BeginTest(str8_list_substr) { String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "a"); - str8_list_pushf(scratch.arena, &list, "b"); - str8_list_pushf(scratch.arena, &list, "c"); - String8List sub = str8_list_substr(scratch.arena, list, r1u64(0, 3)); - String8 result = str8_list_join(scratch.arena, &list, 0); + str8_list_pushf(arena, &list, "a"); + str8_list_pushf(arena, &list, "b"); + str8_list_pushf(arena, &list, "c"); + String8List sub = str8_list_substr(arena, list, r1u64(0, 3)); + String8 result = str8_list_join(arena, &list, 0); T_Ok(str8_match(result, str8_lit("abc"), 0)); } { String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "a"); - str8_list_pushf(scratch.arena, &list, "b"); - str8_list_pushf(scratch.arena, &list, "c"); - String8List sub = str8_list_substr(scratch.arena, list, r1u64(0, max_U64)); - String8 result = str8_list_join(scratch.arena, &list, 0); + str8_list_pushf(arena, &list, "a"); + str8_list_pushf(arena, &list, "b"); + str8_list_pushf(arena, &list, "c"); + String8List sub = str8_list_substr(arena, list, r1u64(0, max_U64)); + String8 result = str8_list_join(arena, &list, 0); T_Ok(str8_match(result, str8_lit("abc"), 0)); } { String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "a"); - str8_list_pushf(scratch.arena, &list, "bcd"); - String8List sub = str8_list_substr(scratch.arena, list, r1u64(2, 3)); - String8 result = str8_list_join(scratch.arena, &sub, 0); + str8_list_pushf(arena, &list, "a"); + str8_list_pushf(arena, &list, "bcd"); + String8List sub = str8_list_substr(arena, list, r1u64(2, 3)); + String8 result = str8_list_join(arena, &sub, 0); T_Ok(str8_match(result, str8_lit("c"), 0)); } { String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "a"); - str8_list_pushf(scratch.arena, &list, "bcd"); - String8List sub = str8_list_substr(scratch.arena, list, r1u64(1, 2)); - String8 result = str8_list_join(scratch.arena, &sub, 0); + str8_list_pushf(arena, &list, "a"); + str8_list_pushf(arena, &list, "bcd"); + String8List sub = str8_list_substr(arena, list, r1u64(1, 2)); + String8 result = str8_list_join(arena, &sub, 0); T_Ok(str8_match(result, str8_lit("b"), 0)); } { String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "ab"); - str8_list_pushf(scratch.arena, &list, "cd"); - str8_list_pushf(scratch.arena, &list, "ef"); - String8List sub = str8_list_substr(scratch.arena, list, r1u64(1, 5)); - String8 result = str8_list_join(scratch.arena, &sub, 0); + str8_list_pushf(arena, &list, "ab"); + str8_list_pushf(arena, &list, "cd"); + str8_list_pushf(arena, &list, "ef"); + String8List sub = str8_list_substr(arena, list, r1u64(1, 5)); + String8 result = str8_list_join(arena, &sub, 0); T_Ok(str8_match(result, str8_lit("bcde"), 0)); } { String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "abc"); + str8_list_pushf(arena, &list, "abc"); - String8List zero = str8_list_substr(scratch.arena, list, r1u64(0, 0)); + String8List zero = str8_list_substr(arena, list, r1u64(0, 0)); T_Ok(MemoryMatchStruct(&zero, &zero_list)); - String8List out_of_bounds_range = str8_list_substr(scratch.arena, list, r1u64(max_U64/2, max_U64)); + String8List out_of_bounds_range = str8_list_substr(arena, list, r1u64(max_U64/2, max_U64)); T_Ok(MemoryMatchStruct(&out_of_bounds_range, &zero_list)); } } -T_EndTest; #undef T_Group diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index e2464b35..88ec815f 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -140,7 +140,7 @@ dw_writer_tag_end(writer); \ dw_writer_tag_end(writer); } - RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); RDI_NameMap *types_nm = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); T_Ok(types_nm); @@ -220,7 +220,6 @@ T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), s dw_writer_end(&writer); } -T_EndTest; T_BeginTest(d2r_line_table) { @@ -229,7 +228,7 @@ T_BeginTest(d2r_line_table) String8 comp_name = str8_lit("test.c"); DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/C/Devel/foo.c")); - DW_WriterFile *comp_file = dw_writer_new_file(writer, str8f(scratch.arena, "%S%S", comp_dir, comp_name)); + DW_WriterFile *comp_file = dw_writer_new_file(writer, str8f(arena, "%S%S", comp_dir, comp_name)); struct { DW_WriterFile *file; U64 ln; U64 line_size; U64 voff; @@ -268,13 +267,13 @@ T_BeginTest(d2r_line_table) dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); dw_writer_tag_end(writer); - d2r_rdi_from_dwarf_writer(scratch.arena, writer); + d2r_rdi_from_dwarf_writer(arena, writer); for EachElement(i, test_table) { for EachIndex(k, test_table[i].line_size) { - String8 cmd_line = str8f(scratch.arena, "-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); + String8 cmd_line = str8f(arena, "-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); String8 output = {0}; - t_invoke_(t_radbin_path(), cmd_line, max_U64, scratch.arena, &output); + t_invoke_(t_radbin_path(), cmd_line, max_U64, arena, &output); T_Ok(g_last_exit_code == 0); T_MatchLinef(&output, "%S:%llu", test_table[i].file->path, test_table[i].ln); } @@ -282,7 +281,6 @@ T_BeginTest(d2r_line_table) dw_writer_end(&writer); } -T_EndTest; T_BeginTest(d2r_checksums) { @@ -301,7 +299,7 @@ T_BeginTest(d2r_checksums) dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); dw_writer_tag_end(writer); - RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); U64 checksum_count = 0; RDI_MD5 *checksums = rdi_table_from_name(rdi, MD5Checksums, &checksum_count); T_Ok(checksum_count == writer->line.file_count + 1); @@ -318,7 +316,6 @@ T_BeginTest(d2r_checksums) dw_writer_end(&writer); } -T_EndTest; #if SUBPROGRAM_CONVERSION_TEST T_BeginTest(d2r_subprogram) @@ -432,14 +429,13 @@ T_BeginTest(d2r_subprogram) dw_writer_tag_end(writer); - RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, (char *)subprogram_name.str); RDI_TypeNode *proc_type = rdi_element_from_name_idx(rdi, TypeNodes, proc->type_idx); - String8 proc_string = rdi_string_from_type(scratch.arena, rdi, proc, proc_type); + String8 proc_string = rdi_string_from_type(arena, rdi, proc, proc_type); dw_writer_end(&writer); } -T_EndTest; #endif T_BeginTest(d2r_general) @@ -470,7 +466,7 @@ T_BeginTest(d2r_general) dw_writer_tag_end(writer); } - RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(scratch.arena, writer); + RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, "FooBar"); T_Ok(proc); @@ -505,6 +501,5 @@ T_BeginTest(d2r_general) dw_writer_end(&writer); } -T_EndTest; #undef T_Group diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 728cbb58..00aa9999 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -64,7 +64,6 @@ T_BeginTest(test_leb128) T_Ok(t_dw_test_sleb128((1ull << i), 1 + (i + 1) / 7)); } } -T_EndTest; internal B32 dwt_tags_must_match(DW_WriterTag *writer_tag, DW_TagNode *reader_tag) @@ -142,11 +141,11 @@ T_BeginTest(dwarf_32bit) dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); dw_writer_tag_end(writer); - DW_Input input = dw_input_from_writer(scratch.arena, writer); + DW_Input input = dw_input_from_writer(arena, writer); for EachElement(sec_idx, input.sec) { if (sec_idx == DW_Section_Abbrev) continue; - Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[sec_idx].data); + Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(arena, input.sec[sec_idx].data); for EachIndex(range_idx, unit_ranges.count) { Rng1U64 range = unit_ranges.v[range_idx]; @@ -162,7 +161,6 @@ T_BeginTest(dwarf_32bit) dw_writer_end(&writer); } -T_EndTest; T_BeginTest(dwarf_64bit) { @@ -171,11 +169,11 @@ T_BeginTest(dwarf_64bit) dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); dw_writer_tag_end(writer); - DW_Input input = dw_input_from_writer(scratch.arena, writer); + DW_Input input = dw_input_from_writer(arena, writer); for EachElement(sec_idx, input.sec) { if (sec_idx == DW_Section_Abbrev) continue; - Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[sec_idx].data); + Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(arena, input.sec[sec_idx].data); for EachIndex(range_idx, unit_ranges.count) { Rng1U64 range = unit_ranges.v[range_idx]; @@ -191,7 +189,6 @@ T_BeginTest(dwarf_64bit) dw_writer_end(&writer); } -T_EndTest; T_BeginTest(dwarf_line_opcodes) { @@ -238,9 +235,9 @@ T_BeginTest(dwarf_line_opcodes) dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_discriminator(2)); dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_end_sequence()); - DW_Input input = dw_input_from_writer(scratch.arena, writer); - Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[DW_Section_Info].data); - DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); + DW_Input input = dw_input_from_writer(arena, writer); + Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(arena, input.sec[DW_Section_Info].data); + DW_CompUnit cu = dw_cu_from_info_off(arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); T_Ok(line_vm->header.dir_table.count == 2); @@ -361,7 +358,6 @@ T_BeginTest(dwarf_line_opcodes) dw_writer_end(&writer); } -T_EndTest; T_BeginTest(dwarf_line_emit) { @@ -415,9 +411,9 @@ T_BeginTest(dwarf_line_emit) } } - DW_Input input = dw_input_from_writer(scratch.arena, writer); - Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input.sec[DW_Section_Info].data); - DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); + DW_Input input = dw_input_from_writer(arena, writer); + Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(arena, input.sec[DW_Section_Info].data); + DW_CompUnit cu = dw_cu_from_info_off(arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); // check init sequence @@ -562,7 +558,6 @@ T_BeginTest(dwarf_line_emit) T_Ok(line_vm->new_line); } } -T_EndTest; T_BeginTest(dwarf_writer) { @@ -626,10 +621,10 @@ T_BeginTest(dwarf_writer) dw_writer_tag_end(writer); } - DW_Input input = dw_input_from_writer(scratch.arena, writer); - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); - DW_CompUnit cu = dw_cu_from_info_off(scratch.arena, &input, lu_input, 0, 1); - DW_TagTree tag_tree = dw_tag_tree_from_cu(scratch.arena, &input, &cu); + DW_Input input = dw_input_from_writer(arena, writer); + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(arena, &input); + DW_CompUnit cu = dw_cu_from_info_off(arena, &input, lu_input, 0, 1); + DW_TagTree tag_tree = dw_tag_tree_from_cu(arena, &input, &cu); AssertAlways(dwt_tags_must_match(writer->root, tag_tree.root)); // validate the writer @@ -852,7 +847,7 @@ T_BeginTest(dwarf_writer) DW_WriterAttrib *frame_base = type->next; T_Ok(frame_base->kind == DW_AttribKind_FrameBase); T_Ok(frame_base->form.reader.kind == DW_Form_ExprLoc); - DW_Expr frame_base_expr = dw_expr_from_data(scratch.arena, writer->format, writer->address_size, frame_base->form.reader.exprloc); + DW_Expr frame_base_expr = dw_expr_from_data(arena, writer->format, writer->address_size, frame_base->form.reader.exprloc); T_Ok(frame_base_expr.count == 1); T_Ok(frame_base_expr.first->opcode == DW_ExprOp_Reg7); T_Ok(frame_base_expr.first->operands == 0); @@ -863,7 +858,6 @@ T_BeginTest(dwarf_writer) dw_writer_end(&writer); } -T_EndTest; T_BeginTest(value_in_register) { @@ -876,19 +870,18 @@ T_BeginTest(value_in_register) // compile a simple program which reads the value from register 3 DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); // evaluate the program DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_U64); T_Ok(expr_value.u64 == value); } -T_EndTest; T_BeginTest(value_in_x_register) { @@ -901,38 +894,36 @@ T_BeginTest(value_in_x_register) // compile a simple program which reads the value from register 3 DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(RegX), DW_ExprEnc_ULEB128(DW_RegX64_FsBase) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); // evaluate the program DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_U64); T_Ok(expr_value.u64 == value); } -T_EndTest; T_BeginTest(address_of_value) { // compile a simple program which reads address U64 addr = 0xdeadbeef; DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_U64(addr) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); // evaluate the program DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_Addr); T_Ok(expr_value.addr == addr); } -T_EndTest; T_BeginTest(register_relative_variable) { @@ -944,34 +935,32 @@ T_BeginTest(register_relative_variable) MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BReg11), DW_ExprEnc_SLEB128(44) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_Addr); T_Ok(expr_value.addr == (1 + 44)); } -T_EndTest; T_BeginTest(frame_relative_variable) { DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(FBReg), DW_ExprEnc_SLEB128(-50) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); U64 frame_base = 123; DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_Addr); T_Ok(expr_value.addr == frame_base -50); } -T_EndTest; internal MACHINE_OP_MEM_READ(t_machine_op_mem_read) @@ -982,7 +971,7 @@ MACHINE_OP_MEM_READ(t_machine_op_mem_read) T_BeginTest(call_by_reference) { - U8 *memory = push_array(scratch.arena, U8, 128); + U8 *memory = push_array(arena, U8, 128); U64 value = 0xc0ffee; MemoryCopy(memory + 32, &value, sizeof(value)); @@ -993,32 +982,30 @@ T_BeginTest(call_by_reference) MemoryCopy((U8 *)®s + reg_range.min, &memory_ptr, sizeof(memory_ptr)); DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BRegX), DW_ExprEnc_ULEB128(58), DW_ExprEnc_SLEB128(32), DW_ExprEnc_Op(Deref) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); DW_ExprValue expr_value = { 0 }; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, t_machine_op_mem_read, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, t_machine_op_mem_read, 0, &expr_value); T_Ok(expr_value.type == DW_ExprValueType_Generic); T_Ok(expr_value.generic.size == sizeof(U64)); T_Ok(*(U64 *)expr_value.generic.str == value); } -T_EndTest; T_BeginTest(plus_uconst) { U64 struct_addr = 0x123; DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_Addr(struct_addr), DW_ExprEnc_Op(PlusUConst), DW_ExprEnc_ULEB128(4) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, t_machine_op_mem_read, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, t_machine_op_mem_read, 0, &expr_value); T_Ok(expr_value.type == DW_ExprValueType_Addr); T_Ok(expr_value.addr == 0x123 + 4); } -T_EndTest; #if 0 T_BeginTest(reg_split_spill) @@ -1039,13 +1026,12 @@ T_BeginTest(reg_split_spill) } DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Reg3), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(4), DW_ExprEnc_Op(Reg10), DW_ExprEnc_Op(Piece), DW_ExprEnc_ULEB128(2) }; - String8 expr_data = dw_encode_expr(scratch.arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); + String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); + DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(scratch.arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); } -T_EndTest; #endif #undef T_Group diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 56fbf39b..404aa8d9 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -88,7 +88,7 @@ T_BeginTest(machine_compat_check) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown); t_push_data_section(obj_writer, str8_lit("unknown")); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("unknown.obj"), obj)); } @@ -97,7 +97,7 @@ T_BeginTest(machine_compat_check) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); t_push_data_section(obj_writer, str8_lit("x64")); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("x64.obj"), obj)); } @@ -108,7 +108,7 @@ T_BeginTest(machine_compat_check) U8 text[] = { 0xC3 }; COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -117,7 +117,7 @@ T_BeginTest(machine_compat_check) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Arm64); t_push_data_section(obj_writer, str8_lit("arm64")); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("arm64.obj"), obj)); } @@ -133,7 +133,6 @@ T_BeginTest(machine_compat_check) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /machine:amd64 arm64.obj entry.obj"); T_Ok(g_last_exit_code != 0); } -T_EndTest; T_BeginTest(simple_link_test) { @@ -146,7 +145,7 @@ T_BeginTest(simple_link_test) coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_lit("qwe")); coff_obj_writer_push_section(obj_writer, str8_lit(".zero"), PE_BSS_SECTION_FLAGS, str8(0, 5)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + main_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -159,8 +158,8 @@ T_BeginTest(simple_link_test) t_invoke_linkerf("/entry:my_entry /subsystem:console /fixed /filealign:%d /align:%d /out:%S %S", file_align, virt_align, out_name, main_obj_name); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, out_name); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, out_name); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -212,7 +211,7 @@ T_BeginTest(simple_link_test) T_Ok(opt->dll_characteristics == 0x8120); T_Ok(opt->loader_flags == 0); } -T_EndTest; + T_BeginTest(out_of_bounds_section_number) { @@ -221,7 +220,7 @@ T_BeginTest(out_of_bounds_section_number) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *foo = coff_obj_writer_push_section(obj_writer, str8_lit(".foo"), PE_DATA_SECTION_FLAGS, str8_lit("foo")); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, foo); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); { COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj); @@ -245,7 +244,7 @@ T_BeginTest(out_of_bounds_section_number) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -253,14 +252,14 @@ T_BeginTest(out_of_bounds_section_number) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj"); T_Ok(g_last_exit_code != 0); } -T_EndTest; + T_BeginTest(merge) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_DATA_SECTION_FLAGS, str8_lit("hello, world")); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("test.obj"), obj)); } @@ -290,8 +289,8 @@ T_BeginTest(merge) T_Ok(g_last_exit_code == 0); // make sure linker created .qwe and merged .test into it - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".qwe")); @@ -325,8 +324,8 @@ T_BeginTest(merge) T_Ok(g_last_exit_code == 0); // make sure linker merged .test into .data - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".data")); @@ -336,7 +335,6 @@ T_BeginTest(merge) T_Ok(str8_match(data, str8_lit("hello, world"),0)); } } -T_EndTest; T_BeginTest(link_undef) { @@ -344,7 +342,7 @@ T_BeginTest(link_undef) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); - undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + undef_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -359,7 +357,7 @@ T_BeginTest(link_undef) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -370,7 +368,6 @@ T_BeginTest(link_undef) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj"); T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } -T_EndTest; T_BeginTest(link_unref_undef) { @@ -378,7 +375,7 @@ T_BeginTest(link_unref_undef) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); - undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + undef_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -388,7 +385,7 @@ T_BeginTest(link_unref_undef) U8 text[] = { 0xc3 }; COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -399,7 +396,6 @@ T_BeginTest(link_unref_undef) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj"); T_Ok(g_last_exit_code != 0); } -T_EndTest; T_BeginTest(weak_lib_vs_weak_lib) { @@ -408,7 +404,7 @@ T_BeginTest(weak_lib_vs_weak_lib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -424,7 +420,7 @@ T_BeginTest(weak_lib_vs_weak_lib) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -436,8 +432,8 @@ T_BeginTest(weak_lib_vs_weak_lib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -453,8 +449,8 @@ T_BeginTest(weak_lib_vs_weak_lib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -465,7 +461,6 @@ T_BeginTest(weak_lib_vs_weak_lib) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_lib_vs_weak_nolib) { @@ -474,7 +469,7 @@ T_BeginTest(weak_lib_vs_weak_nolib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -490,7 +485,7 @@ T_BeginTest(weak_lib_vs_weak_nolib) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -502,8 +497,8 @@ T_BeginTest(weak_lib_vs_weak_nolib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -514,7 +509,6 @@ T_BeginTest(weak_lib_vs_weak_nolib) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_lib_vs_weak_alias) { @@ -523,7 +517,7 @@ T_BeginTest(weak_lib_vs_weak_alias) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -539,7 +533,7 @@ T_BeginTest(weak_lib_vs_weak_alias) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -550,7 +544,6 @@ T_BeginTest(weak_lib_vs_weak_alias) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } -T_EndTest; T_BeginTest(weak_lib_vs_weak_antidep) { @@ -559,7 +552,7 @@ T_BeginTest(weak_lib_vs_weak_antidep) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -575,7 +568,7 @@ T_BeginTest(weak_lib_vs_weak_antidep) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -587,8 +580,8 @@ T_BeginTest(weak_lib_vs_weak_antidep) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -599,7 +592,6 @@ T_BeginTest(weak_lib_vs_weak_antidep) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_alias_vs_weak_alias) { @@ -608,7 +600,7 @@ T_BeginTest(weak_alias_vs_weak_alias) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *qwe = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("qwe"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("sym"), COFF_WeakExt_SearchAlias, qwe); - a = coff_obj_writer_serialize(scratch.arena, obj_writer); + a = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -617,7 +609,7 @@ T_BeginTest(weak_alias_vs_weak_alias) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *ewq = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("ewq"), 0x222, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("sym"), COFF_WeakExt_SearchAlias, ewq); - b = coff_obj_writer_serialize(scratch.arena, obj_writer); + b = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -632,7 +624,7 @@ T_BeginTest(weak_alias_vs_weak_alias) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("sym")); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -643,7 +635,6 @@ T_BeginTest(weak_alias_vs_weak_alias) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } -T_EndTest; T_BeginTest(weak_alias_vs_weak_lib) { @@ -652,7 +643,7 @@ T_BeginTest(weak_alias_vs_weak_lib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -668,7 +659,7 @@ T_BeginTest(weak_alias_vs_weak_lib) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -680,8 +671,8 @@ T_BeginTest(weak_alias_vs_weak_lib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -692,7 +683,6 @@ T_BeginTest(weak_alias_vs_weak_lib) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_alias_vs_weak_nolib) { @@ -701,7 +691,7 @@ T_BeginTest(weak_alias_vs_weak_nolib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -717,7 +707,7 @@ T_BeginTest(weak_alias_vs_weak_nolib) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -729,8 +719,8 @@ T_BeginTest(weak_alias_vs_weak_nolib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -741,7 +731,6 @@ T_BeginTest(weak_alias_vs_weak_nolib) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_alias_vs_weak_antidep) { @@ -750,7 +739,7 @@ T_BeginTest(weak_alias_vs_weak_antidep) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -766,7 +755,7 @@ T_BeginTest(weak_alias_vs_weak_antidep) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -778,8 +767,8 @@ T_BeginTest(weak_alias_vs_weak_antidep) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -790,7 +779,6 @@ T_BeginTest(weak_alias_vs_weak_antidep) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_nolib_vs_weak_nolib) { @@ -799,7 +787,7 @@ T_BeginTest(weak_nolib_vs_weak_nolib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -815,7 +803,7 @@ T_BeginTest(weak_nolib_vs_weak_nolib) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -826,8 +814,8 @@ T_BeginTest(weak_nolib_vs_weak_nolib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -838,7 +826,6 @@ T_BeginTest(weak_nolib_vs_weak_nolib) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_nolib_vs_weak_lib) { @@ -847,7 +834,7 @@ T_BeginTest(weak_nolib_vs_weak_lib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -863,7 +850,7 @@ T_BeginTest(weak_nolib_vs_weak_lib) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -874,8 +861,8 @@ T_BeginTest(weak_nolib_vs_weak_lib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -886,7 +873,6 @@ T_BeginTest(weak_nolib_vs_weak_lib) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_nolib_vs_weak_alias) { @@ -895,7 +881,7 @@ T_BeginTest(weak_nolib_vs_weak_alias) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -911,7 +897,7 @@ T_BeginTest(weak_nolib_vs_weak_alias) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -921,7 +907,6 @@ T_BeginTest(weak_nolib_vs_weak_alias) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } -T_EndTest; T_BeginTest(weak_nolib_vs_weak_antidep) { @@ -930,7 +915,7 @@ T_BeginTest(weak_nolib_vs_weak_antidep) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -946,7 +931,7 @@ T_BeginTest(weak_nolib_vs_weak_antidep) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -957,8 +942,8 @@ T_BeginTest(weak_nolib_vs_weak_antidep) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -969,7 +954,6 @@ T_BeginTest(weak_nolib_vs_weak_antidep) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_antidep_vs_weak_antidep) { @@ -978,7 +962,7 @@ T_BeginTest(weak_antidep_vs_weak_antidep) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -994,7 +978,7 @@ T_BeginTest(weak_antidep_vs_weak_antidep) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1006,8 +990,8 @@ T_BeginTest(weak_antidep_vs_weak_antidep) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -1023,8 +1007,8 @@ T_BeginTest(weak_antidep_vs_weak_antidep) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -1035,7 +1019,6 @@ T_BeginTest(weak_antidep_vs_weak_antidep) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_antidep_vs_weak_nolib) { @@ -1044,7 +1027,7 @@ T_BeginTest(weak_antidep_vs_weak_nolib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1060,7 +1043,7 @@ T_BeginTest(weak_antidep_vs_weak_nolib) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1071,8 +1054,8 @@ T_BeginTest(weak_antidep_vs_weak_nolib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -1083,7 +1066,6 @@ T_BeginTest(weak_antidep_vs_weak_nolib) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_antidep_vs_weak_lib) { @@ -1092,7 +1074,7 @@ T_BeginTest(weak_antidep_vs_weak_lib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1108,7 +1090,7 @@ T_BeginTest(weak_antidep_vs_weak_lib) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1119,8 +1101,8 @@ T_BeginTest(weak_antidep_vs_weak_lib) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -1131,7 +1113,6 @@ T_BeginTest(weak_antidep_vs_weak_lib) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_antidep_vs_weak_alias) { @@ -1140,7 +1121,7 @@ T_BeginTest(weak_antidep_vs_weak_alias) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1156,7 +1137,7 @@ T_BeginTest(weak_antidep_vs_weak_alias) COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1167,8 +1148,8 @@ T_BeginTest(weak_antidep_vs_weak_alias) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -1179,7 +1160,6 @@ T_BeginTest(weak_antidep_vs_weak_alias) T_Ok(str8_match(imm, str8_struct(&expected), 0)); } } -T_EndTest; T_BeginTest(weak_vs_common) { @@ -1189,7 +1169,7 @@ T_BeginTest(weak_vs_common) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); COFF_ObjSymbol *sect_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("_a"), 0, sect); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, sect_symbol); - weak_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + weak_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1197,7 +1177,7 @@ T_BeginTest(weak_vs_common) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_common(obj_writer, str8_lit("w"), 2); - common_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + common_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1212,7 +1192,7 @@ T_BeginTest(weak_vs_common) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("w")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1226,8 +1206,8 @@ T_BeginTest(weak_vs_common) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe weak.obj common.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -1236,7 +1216,6 @@ T_BeginTest(weak_vs_common) T_Ok(bss->fsize == 0); T_Ok(bss->vsize == 2); } -T_EndTest; T_BeginTest(abs_vs_weak) { @@ -1247,7 +1226,7 @@ T_BeginTest(abs_vs_weak) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), abs_value, COFF_SymStorageClass_External); - abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + abs_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1263,7 +1242,7 @@ T_BeginTest(abs_vs_weak) coff_obj_writer_section_push_reloc(obj_writer, text, 2, foo, COFF_Reloc_X64_Addr64); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text); - text_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + text_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1276,8 +1255,8 @@ T_BeginTest(abs_vs_weak) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe text.obj abs.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -1292,7 +1271,6 @@ T_BeginTest(abs_vs_weak) U64 expected_imm = abs_value; T_Ok(str8_match(imm, str8_struct(&expected_imm), 0)); } -T_EndTest; T_BeginTest(abs_vs_regular) { @@ -1304,7 +1282,7 @@ T_BeginTest(abs_vs_regular) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(regular_payload)); coff_obj_writer_push_symbol_extern(obj_writer, shared_symbol_name, 0, data_sect); - String8 regular_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 regular_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(regular_obj_name, regular_obj)); } @@ -1313,7 +1291,7 @@ T_BeginTest(abs_vs_regular) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External); - String8 abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 abs_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(abs_obj_name, abs_obj)); } @@ -1329,7 +1307,7 @@ T_BeginTest(abs_vs_regular) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); COFF_ObjSymbol *shared_symbol = coff_obj_writer_push_symbol_undef(obj_writer, shared_symbol_name); coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, shared_symbol, COFF_Reloc_X64_Addr32Nb); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -1343,7 +1321,6 @@ T_BeginTest(abs_vs_regular) // linker should complain even in case regular is before abs T_Ok(g_last_exit_code != 0); } -T_EndTest; T_BeginTest(abs_vs_common) { @@ -1353,7 +1330,7 @@ T_BeginTest(abs_vs_common) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_common(obj_writer, shared_symbol_name, 321); - String8 common_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 common_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(common_obj_name, common_obj)); } @@ -1362,7 +1339,7 @@ T_BeginTest(abs_vs_common) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External); - String8 abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 abs_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(abs_obj_name, abs_obj)); } @@ -1373,7 +1350,7 @@ T_BeginTest(abs_vs_common) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -1389,7 +1366,6 @@ T_BeginTest(abs_vs_common) } } } -T_EndTest; T_BeginTest(abs_vs_abs) { @@ -1397,7 +1373,7 @@ T_BeginTest(abs_vs_abs) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), 'a', COFF_SymStorageClass_External); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1405,7 +1381,7 @@ T_BeginTest(abs_vs_abs) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), 'b', COFF_SymStorageClass_External); - b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + b_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1416,7 +1392,6 @@ T_BeginTest(abs_vs_abs) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } -T_EndTest; T_BeginTest(undef_weak_lib) { @@ -1425,7 +1400,7 @@ T_BeginTest(undef_weak_lib) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); COFF_ObjSymbol *b = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("b"), 0xc3000000, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("a"), COFF_WeakExt_SearchLibrary, b); - weak = coff_obj_writer_serialize(scratch.arena, obj_writer); + weak = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1437,7 +1412,7 @@ T_BeginTest(undef_weak_lib) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, sym); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry = coff_obj_writer_serialize(arena, obj_writer); } T_Ok(t_write_file(str8_lit("weak.obj"), weak)); @@ -1447,7 +1422,6 @@ T_BeginTest(undef_weak_lib) t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry entry.obj weak.obj"); T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } -T_EndTest; T_BeginTest(undef_weak_search_alias) { @@ -1460,7 +1434,7 @@ T_BeginTest(undef_weak_search_alias) COFF_ObjSection *weak_sect = t_push_data_section(obj_writer, str8_array_fixed(weak_payload)); COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("ptr")); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("foo"), COFF_WeakExt_SearchAlias, tag); - weak_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + weak_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1469,7 +1443,7 @@ T_BeginTest(undef_weak_search_alias) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("entry")); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("ptr"), COFF_WeakExt_SearchAlias, tag); - ptr_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + ptr_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1480,7 +1454,7 @@ T_BeginTest(undef_weak_search_alias) COFF_ObjSection *undef_sect = t_push_data_section(obj_writer, str8_array_fixed(undef_obj_payload)); COFF_ObjSymbol *undef_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); coff_obj_writer_section_push_reloc(obj_writer, undef_sect, 0, undef_symbol, COFF_Reloc_X64_Addr32Nb); - undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + undef_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1490,7 +1464,7 @@ T_BeginTest(undef_weak_search_alias) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1502,7 +1476,6 @@ T_BeginTest(undef_weak_search_alias) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe weak.obj entry.obj ptr.obj undef.obj"); T_Ok(g_last_exit_code == 0); } -T_EndTest; T_BeginTest(weak_cycle) { @@ -1511,7 +1484,7 @@ T_BeginTest(weak_cycle) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *b = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("B")); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("A"), COFF_WeakExt_SearchAlias, b); - String8 ab_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 ab_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(ab_obj_name, ab_obj)); } @@ -1521,7 +1494,7 @@ T_BeginTest(weak_cycle) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSymbol *a = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("A")); coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("B"), COFF_WeakExt_SearchAlias, a); - String8 ba_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 ba_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(ba_obj_name, ba_obj)); } @@ -1532,7 +1505,7 @@ T_BeginTest(weak_cycle) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -1540,7 +1513,6 @@ T_BeginTest(weak_cycle) U64 timeout = os_now_microseconds() + 3 * 1000 * 1000; // give a generous 3 seconds t_invoke_linker_timeoutf(timeout, "/subsystem:console /entry:my_entry %S %S %S", entry_obj_name, ab_obj_name, ba_obj_name); } -T_EndTest; T_BeginTest(weak_tag) { @@ -1556,7 +1528,7 @@ T_BeginTest(weak_tag) COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(sect_data)); coff_obj_writer_section_push_reloc(obj_writer, sect, 0, weak_second, COFF_Reloc_X64_Addr32); - String8 weak_tag_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 weak_tag_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(weak_tag_obj_name, weak_tag_obj)); } @@ -1568,7 +1540,7 @@ T_BeginTest(weak_tag) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -1576,8 +1548,8 @@ T_BeginTest(weak_tag) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe %S %S", weak_tag_obj_name, entry_obj_name); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *data_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); @@ -1586,7 +1558,6 @@ T_BeginTest(weak_tag) T_Ok(data_section->vsize == 4); T_Ok(str8_match(data, str8_struct(&weak_tag_expected_value), 0)); } -T_EndTest; T_BeginTest(undef_section) { @@ -1603,20 +1574,20 @@ T_BeginTest(undef_section) COFF_ObjSection *text_section = t_push_text_section(obj_writer, str8_array_fixed(text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_section); - main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + main_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } U8 payload[] = { 1, 2, 3 }; - String8 sec_defn_obj = t_make_sec_defn_obj(scratch.arena, str8_array_fixed(payload)); + String8 sec_defn_obj = t_make_sec_defn_obj(arena, str8_array_fixed(payload)); t_write_file(str8_lit("main.obj"), main_obj); t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj"); if (g_last_exit_code == 0) { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -1631,7 +1602,6 @@ T_BeginTest(undef_section) } } } -T_EndTest; T_BeginTest(sect_symbol) { @@ -1641,7 +1611,7 @@ T_BeginTest(sect_symbol) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect$1"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, sect_payload); coff_obj_writer_push_directive(obj_writer, str8_lit("/merge:.mysect=.data")); - String8 sect_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 sect_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(sect_obj_name, sect_obj)); } @@ -1658,7 +1628,7 @@ T_BeginTest(sect_symbol) COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 main_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(main_obj_name, main_obj)); @@ -1667,8 +1637,8 @@ T_BeginTest(sect_symbol) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sect.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); @@ -1686,7 +1656,6 @@ T_BeginTest(sect_symbol) String8 payload_got = str8_substr(sect_data, rng_1u64(8, sect_data.size)); T_Ok(str8_match(payload_got, sect_payload, 0)); } -T_EndTest; T_BeginTest(undef_reloc_section) { @@ -1703,13 +1672,13 @@ T_BeginTest(undef_reloc_section) COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".reloc"), PE_RELOC_SECTION_FLAGS); coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr64); - main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + main_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } U8 payload[] = { 1, 2, 3 }; - String8 sec_defn_obj = t_make_sec_defn_obj(scratch.arena, str8_array_fixed(payload)); + String8 sec_defn_obj = t_make_sec_defn_obj(arena, str8_array_fixed(payload)); T_Ok(t_write_file(str8_lit("main.obj"), main_obj)); T_Ok(t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj)); @@ -1721,7 +1690,6 @@ T_BeginTest(undef_reloc_section) T_Ok(g_last_exit_code != 0); } } -T_EndTest; T_BeginTest(find_merged_pdata) { @@ -1762,7 +1730,7 @@ T_BeginTest(find_merged_pdata) coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_one_past_last), foobar_symbol, COFF_Reloc_X64_Addr32Nb); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text); - main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + main_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -1771,11 +1739,10 @@ T_BeginTest(find_merged_pdata) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj /merge:.pdata=.rdata"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); T_Ok(dim_1u64(pe.data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS]) == 0xC); } -T_EndTest; T_BeginTest(section_sort) { @@ -1790,7 +1757,7 @@ T_BeginTest(section_sort) coff_obj_writer_push_section(obj_writer, str8_lit(".data$"), data_flags, str8_lit("two")); coff_obj_writer_push_section(obj_writer, str8_lit(".data"), data_flags, str8_lit("one")); - String8 data_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 data_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(data_obj_name, data_obj)); } @@ -1801,7 +1768,7 @@ T_BeginTest(section_sort) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -1809,8 +1776,8 @@ T_BeginTest(section_sort) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe data.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -1821,7 +1788,6 @@ T_BeginTest(section_sort) String8 expected_data = str8_lit("onetwothreefourfive"); T_Ok(str8_match(data, expected_data, 0)); } -T_EndTest; T_BeginTest(flag_conf) { @@ -1832,7 +1798,7 @@ T_BeginTest(flag_conf) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *a_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), my_sect0_flags, str8_lit("one")); COFF_ObjSection *b_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), my_sect1_flags, str8_lit("two")); - String8 conf_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 conf_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(conf_obj_name, conf_obj)); } @@ -1843,7 +1809,7 @@ T_BeginTest(flag_conf) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -1851,12 +1817,12 @@ T_BeginTest(flag_conf) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe conf.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeaderArray my_sects = coff_section_header_array_from_name(scratch.arena, string_table, section_table, pe.section_count, str8_lit(".mysect")); + COFF_SectionHeaderArray my_sects = coff_section_header_array_from_name(arena, string_table, section_table, pe.section_count, str8_lit(".mysect")); T_Ok(my_sects.count == 2); COFF_SectionHeader *my_sect0 = &my_sects.v[0]; @@ -1864,7 +1830,6 @@ T_BeginTest(flag_conf) T_Ok(my_sect0->flags == my_sect0_flags); T_Ok(my_sect1->flags == my_sect1_flags); } -T_EndTest; T_BeginTest(invalid_bss) { @@ -1874,7 +1839,7 @@ T_BeginTest(invalid_bss) { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(obj_writer, str8_lit(".bss"), bss_flags, bss_data); - String8 bss_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 bss_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(bss_obj_name, bss_obj)); } @@ -1885,7 +1850,7 @@ T_BeginTest(invalid_bss) U8 text[] = { 0xC3 }; COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -1893,8 +1858,8 @@ T_BeginTest(invalid_bss) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe bss.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -1905,7 +1870,6 @@ T_BeginTest(invalid_bss) String8 data = str8_substr(exe, rng_1u64(bss_sect->foff, bss_sect->foff + bss_sect->vsize)); T_Ok(str8_match(data, bss_data, 0)); } -T_EndTest; T_BeginTest(common_block) { @@ -1918,7 +1882,7 @@ T_BeginTest(common_block) data_sect->flags |= COFF_SectionFlag_Align1Bytes; coff_obj_writer_push_section(obj_writer, str8_lit(".bss"), PE_BSS_SECTION_FLAGS, str8(0, 1)); // shift common block's initial position coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr32); - String8 a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(a_obj_name, a_obj)); } @@ -1931,7 +1895,7 @@ T_BeginTest(common_block) data_sect->flags |= COFF_SectionFlag_Align1Bytes; COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit("B"), 6); coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr64); - String8 b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 b_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(b_obj_name, b_obj)); } @@ -1942,7 +1906,7 @@ T_BeginTest(common_block) U8 text[] = { 0xC3 }; COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -1950,8 +1914,8 @@ T_BeginTest(common_block) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /fixed /largeaddressaware:no /merge:.bss=.comm a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; COFF_SectionHeader *comm_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".comm")); @@ -1969,7 +1933,6 @@ T_BeginTest(common_block) T_Ok(*a_addr == (pe.image_base + comm_sect->voff + 0x10)); T_Ok(*b_addr == (pe.image_base + comm_sect->voff + 0x8)); } -T_EndTest; T_BeginTest(base_relocs) { @@ -2005,7 +1968,7 @@ T_BeginTest(base_relocs) coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, abs_symbol, COFF_Reloc_X64_Addr32); coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect); - String8 main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 main_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(main_obj_name, main_obj)); } @@ -2015,7 +1978,7 @@ T_BeginTest(base_relocs) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(func_text)); coff_obj_writer_push_symbol_extern(obj_writer, func_name, 0, text_sect); - String8 func_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 func_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(func_obj_name, func_obj)); } @@ -2040,7 +2003,6 @@ T_BeginTest(base_relocs) T_Ok(g_last_exit_code != 0); } } -T_EndTest; T_BeginTest(simple_lib_test) { @@ -2050,7 +2012,7 @@ T_BeginTest(simple_lib_test) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_Unknown); COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8(test_payload.str, test_payload.size+1)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, data_sect); - test_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + test_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2058,7 +2020,7 @@ T_BeginTest(simple_lib_test) { COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); coff_lib_writer_push_obj(lib_writer, str8_lit("test.obj"), test_obj); - String8 test_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + String8 test_lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); coff_lib_writer_release(&lib_writer); T_Ok(t_write_file(test_lib_name, test_lib)); } @@ -2074,7 +2036,7 @@ T_BeginTest(simple_lib_test) COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("test")); coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, test_symbol, COFF_Reloc_X64_Addr32Nb); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 7, text_sect); - String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(entry_obj_name, entry_obj)); } @@ -2082,8 +2044,8 @@ T_BeginTest(simple_lib_test) t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj test.lib"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -2104,7 +2066,6 @@ T_BeginTest(simple_lib_test) U32 *data_addr32nb = (U32 *)(text_data.str+3); T_Ok(*data_addr32nb == data_sect->voff); } -T_EndTest; T_BeginTest(import_export) { @@ -2135,7 +2096,7 @@ T_BeginTest(import_export) coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord4,@8,NONAME,DATA")); coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baz=BAZ.qwe")); coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baf=BAZ.#1")); - export_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + export_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2167,7 +2128,7 @@ T_BeginTest(import_export) coff_obj_writer_section_push_reloc_voff(obj_writer, data_sect, i * 4, symbol); } - import_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + import_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2182,7 +2143,7 @@ T_BeginTest(import_export) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("s2"), 0, s2); coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baf=s1")); coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baz=s2")); - baz_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + baz_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2202,10 +2163,10 @@ T_BeginTest(import_export) if (t_id_linker() == T_Linker_RAD) { // validate export table in export.dll { - String8 dll = t_read_file(scratch.arena, str8_lit("export.dll")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, dll); + String8 dll = t_read_file(arena, str8_lit("export.dll")); + PE_BinInfo pe = pe_bin_info_from_data(arena, dll); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(dll, pe.section_table_range).str; - PE_ParsedExportTable export_table = pe_exports_from_data(scratch.arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]); + PE_ParsedExportTable export_table = pe_exports_from_data(arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]); COFF_SectionHeader *data_sect = coff_section_header_from_name(str8_zero(), section_table, pe.section_count, str8_lit(".data")); // validate header @@ -2257,10 +2218,10 @@ T_BeginTest(import_export) // validate export table in baz.dll { - String8 dll = t_read_file(scratch.arena, str8_lit("baz.dll")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, dll); + String8 dll = t_read_file(arena, str8_lit("baz.dll")); + PE_BinInfo pe = pe_bin_info_from_data(arena, dll); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(dll, pe.section_table_range).str; - PE_ParsedExportTable export_table = pe_exports_from_data(scratch.arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]); + PE_ParsedExportTable export_table = pe_exports_from_data(arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]); // validate header T_Ok(export_table.flags == 0); @@ -2326,7 +2287,6 @@ T_BeginTest(import_export) //T_Ok(t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /delayload:export.dll /export:entry kernel32.Lib delayimp.lib libcmt.lib export.lib import.obj entry.obj") == 0); // TODO: check import table } -T_EndTest; T_BeginTest(image_base) { @@ -2345,7 +2305,7 @@ T_BeginTest(image_base) coff_obj_writer_section_push_reloc(obj_writer, text_sect, 9, image_base_symbol, COFF_Reloc_X64_Addr64); coff_obj_writer_section_push_reloc(obj_writer, text_sect, 18, image_base_symbol, COFF_Reloc_X64_Addr32Nb); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(obj_name, obj)); } @@ -2353,8 +2313,8 @@ T_BeginTest(image_base) t_invoke_linkerf("/subsystem:console /entry:my_entry /base:0x2000000140000000 /out:a.exe image_base.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -2369,7 +2329,6 @@ T_BeginTest(image_base) String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + sizeof(expected_text))); T_Ok(str8_match(text_data, str8_array_fixed(expected_text), 0)); } -T_EndTest; T_BeginTest(comdat_any) { @@ -2379,7 +2338,7 @@ T_BeginTest(comdat_any) coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any); COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); test->type.u.msb = COFF_SymDType_Func; - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("1.obj"), obj)); } @@ -2389,7 +2348,7 @@ T_BeginTest(comdat_any) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test$mn"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("2")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any); COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("2.obj"), obj)); } @@ -2404,7 +2363,7 @@ T_BeginTest(comdat_any) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2412,8 +2371,8 @@ T_BeginTest(comdat_any) { t_invoke_linkerf("/subsystem:console /entry:entry /out:1.exe 1.obj 2.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("1.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("1.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); @@ -2424,8 +2383,8 @@ T_BeginTest(comdat_any) { t_invoke_linkerf("/subsystem:console /entry:entry /out:2.exe 2.obj 1.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("2.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("2.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); @@ -2433,7 +2392,6 @@ T_BeginTest(comdat_any) T_Ok(str8_match(data, str8_lit("2"), 0)); } } -T_EndTest; T_BeginTest(comdat_no_duplicates) { @@ -2443,7 +2401,7 @@ T_BeginTest(comdat_no_duplicates) COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); coff_obj_writer_push_symbol_secdef(obj_writer, test_sect, COFF_ComdatSelect_NoDuplicates); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("a"), 0, test_sect); - test_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + test_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2458,7 +2416,7 @@ T_BeginTest(comdat_no_duplicates) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("a")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2473,8 +2431,8 @@ T_BeginTest(comdat_no_duplicates) t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe a.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("b.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".test")); @@ -2482,7 +2440,6 @@ T_BeginTest(comdat_no_duplicates) String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize)); T_Ok(str8_match(data, str8_lit("a"), 0)); } -T_EndTest; T_BeginTest(comdat_same_size) { @@ -2491,7 +2448,7 @@ T_BeginTest(comdat_same_size) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("a.obj"), obj)); } @@ -2501,7 +2458,7 @@ T_BeginTest(comdat_same_size) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("b")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("b.obj"), obj)); } @@ -2511,7 +2468,7 @@ T_BeginTest(comdat_same_size) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".c"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("cc")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("c.obj"), obj)); } @@ -2526,7 +2483,7 @@ T_BeginTest(comdat_same_size) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2535,8 +2492,8 @@ T_BeginTest(comdat_same_size) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); @@ -2549,7 +2506,6 @@ T_BeginTest(comdat_same_size) T_Ok(g_last_exit_code != 0); if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } } -T_EndTest; T_BeginTest(comdat_exact_match) { @@ -2558,7 +2514,7 @@ T_BeginTest(comdat_exact_match) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("a.obj"), obj)); } @@ -2568,7 +2524,7 @@ T_BeginTest(comdat_exact_match) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a2"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("a2.obj"), obj)); } @@ -2578,7 +2534,7 @@ T_BeginTest(comdat_exact_match) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("b")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("b.obj"), obj)); } @@ -2593,7 +2549,7 @@ T_BeginTest(comdat_exact_match) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2605,8 +2561,8 @@ T_BeginTest(comdat_exact_match) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("b.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a2")); @@ -2615,7 +2571,6 @@ T_BeginTest(comdat_exact_match) T_Ok(str8_match(data, str8_lit("a"), 0)); } } -T_EndTest; T_BeginTest(comdat_largest) { @@ -2624,7 +2579,7 @@ T_BeginTest(comdat_largest) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("a.obj"), obj)); } @@ -2634,7 +2589,7 @@ T_BeginTest(comdat_largest) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bb")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("b.obj"), obj)); } @@ -2644,7 +2599,7 @@ T_BeginTest(comdat_largest) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".c"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("c")); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("c.obj"), obj)); } @@ -2659,7 +2614,7 @@ T_BeginTest(comdat_largest) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2668,8 +2623,8 @@ T_BeginTest(comdat_largest) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *discard_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); @@ -2684,8 +2639,8 @@ T_BeginTest(comdat_largest) T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("b.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".c")); @@ -2694,7 +2649,6 @@ T_BeginTest(comdat_largest) T_Ok(str8_match(data, str8_lit("c"), 0)); } } -T_EndTest; T_BeginTest(comdat_associative) { @@ -2705,7 +2659,7 @@ T_BeginTest(comdat_associative) coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("a.obj"), obj)); } @@ -2719,7 +2673,7 @@ T_BeginTest(comdat_associative) coff_obj_writer_push_symbol_associative(obj_writer, b, bb); coff_obj_writer_push_symbol_associative(obj_writer, bbb, bb); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, bb); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("b.obj"), obj)); } @@ -2734,7 +2688,7 @@ T_BeginTest(comdat_associative) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2742,8 +2696,8 @@ T_BeginTest(comdat_associative) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -2764,7 +2718,6 @@ T_BeginTest(comdat_associative) T_Ok(str8_match(bb_data, str8_lit("bb"), 0)); T_Ok(str8_match(bbb_data, str8_lit("bbb"), 0)); } -T_EndTest; T_BeginTest(comdat_associative_loop) { @@ -2778,7 +2731,7 @@ T_BeginTest(comdat_associative_loop) coff_obj_writer_push_symbol_associative(obj_writer, aaaa, aaa); coff_obj_writer_push_symbol_associative(obj_writer, a, aa); coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("loop.obj"), obj)); } @@ -2793,7 +2746,7 @@ T_BeginTest(comdat_associative_loop) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2802,7 +2755,6 @@ T_BeginTest(comdat_associative_loop) T_Ok(g_last_exit_code != 0); if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_AssociativeLoop); } } -T_EndTest; T_BeginTest(comdat_associative_non_comdat) { @@ -2812,7 +2764,7 @@ T_BeginTest(comdat_associative_non_comdat) COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS, str8_lit("b")); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); coff_obj_writer_push_symbol_associative(obj_writer, b, a); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("test.obj"), obj)); } @@ -2827,7 +2779,7 @@ T_BeginTest(comdat_associative_non_comdat) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2835,8 +2787,8 @@ T_BeginTest(comdat_associative_non_comdat) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj test.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *a = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); @@ -2848,7 +2800,6 @@ T_BeginTest(comdat_associative_non_comdat) T_Ok(str8_match(a_data, str8_lit("a"), 0)); T_Ok(str8_match(b_data, str8_lit("b"), 0)); } -T_EndTest; T_BeginTest(comdat_associative_out_of_bounds) { @@ -2859,7 +2810,7 @@ T_BeginTest(comdat_associative_out_of_bounds) coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Any); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); { COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj); String8 string_table = str8_substr(obj, header.string_table_range); @@ -2885,7 +2836,7 @@ T_BeginTest(comdat_associative_out_of_bounds) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2894,7 +2845,6 @@ T_BeginTest(comdat_associative_out_of_bounds) T_Ok(g_last_exit_code != 0); if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_IllData); } } -T_EndTest; T_BeginTest(comdat_with_offset) { @@ -2904,7 +2854,7 @@ T_BeginTest(comdat_with_offset) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("a.obj"), obj)); } @@ -2915,7 +2865,7 @@ T_BeginTest(comdat_with_offset) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("b.obj"), obj)); } @@ -2930,7 +2880,7 @@ T_BeginTest(comdat_with_offset) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -2938,7 +2888,6 @@ T_BeginTest(comdat_with_offset) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == 0); } -T_EndTest; T_BeginTest(reloc_against_removed_comdat) { @@ -2949,7 +2898,7 @@ T_BeginTest(reloc_against_removed_comdat) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2966,7 +2915,7 @@ T_BeginTest(reloc_against_removed_comdat) COFF_ObjSection *regular_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS, str8_array_fixed(rdata)); coff_obj_writer_section_push_reloc_voff(obj_writer, regular_sect, 0, static_symbol); - b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + b_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2981,7 +2930,7 @@ T_BeginTest(reloc_against_removed_comdat) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -2992,7 +2941,6 @@ T_BeginTest(reloc_against_removed_comdat) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == LNK_Error_RelocationAgainstRemovedSection); } -T_EndTest; T_BeginTest(sect_align) { @@ -3020,15 +2968,15 @@ T_BeginTest(sect_align) COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("test.obj"), obj)); } t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /align:8192 test.obj"); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -3069,7 +3017,6 @@ T_BeginTest(sect_align) String8 a_8192 = str8_substr(sect_data, rng_1u64(16384, 16385)); T_Ok(str8_match(a_8192, str8_lit("z"), 0)); } -T_EndTest; T_BeginTest(alt_name) { @@ -3077,7 +3024,7 @@ T_BeginTest(alt_name) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("test.obj"), obj)); } @@ -3086,7 +3033,7 @@ T_BeginTest(alt_name) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("foo")); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("foo.obj"), obj)); } @@ -3101,7 +3048,7 @@ T_BeginTest(alt_name) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -3152,7 +3099,6 @@ T_BeginTest(alt_name) t_invoke_linkerf("/subsystem:console /entry:entry /out:g.exe /alternatename:qwe=ewq foo.obj entry.obj"); T_Ok(g_last_exit_code == 0); } -T_EndTest; T_BeginTest(include) { @@ -3160,13 +3106,13 @@ T_BeginTest(include) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("foo")); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("include.obj"), obj)); COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); coff_lib_writer_push_obj(lib_writer, str8_lit("include.obj"), obj); - String8 lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + String8 lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); coff_lib_writer_release(&lib_writer); T_Ok(t_write_file(str8_lit("include.lib"), lib)); } @@ -3180,7 +3126,7 @@ T_BeginTest(include) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -3191,8 +3137,8 @@ T_BeginTest(include) // validate that linker pulled-in include.obj { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *foo_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); @@ -3206,14 +3152,13 @@ T_BeginTest(include) T_Ok(g_last_exit_code != 0); if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } } -T_EndTest; T_BeginTest(communal_var_vs_regular) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_common(obj_writer, str8_lit("TEST"), 1); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("communal.obj"), obj)); } @@ -3222,7 +3167,7 @@ T_BeginTest(communal_var_vs_regular) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("defn.obj"), obj)); } @@ -3237,7 +3182,7 @@ T_BeginTest(communal_var_vs_regular) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -3252,8 +3197,8 @@ T_BeginTest(communal_var_vs_regular) char *exes[] = { "a.exe", "b.exe" }; for EachElement(i, exes) { - String8 exe = t_read_file(scratch.arena, str8_cstring(exes[i])); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_cstring(exes[i])); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *data_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); @@ -3262,14 +3207,13 @@ T_BeginTest(communal_var_vs_regular) T_Ok(str8_match(data, str8_lit("test"), 0)); } } -T_EndTest; T_BeginTest(communal_var_vs_regular_comdat) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_symbol_common(obj_writer, str8_lit("TEST"), 1); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("communal.obj"), obj)); } @@ -3280,7 +3224,7 @@ T_BeginTest(communal_var_vs_regular_comdat) sect->flags |= COFF_SectionFlag_LnkCOMDAT; coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("large.obj"), obj)); } @@ -3295,7 +3239,7 @@ T_BeginTest(communal_var_vs_regular_comdat) coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -3309,8 +3253,8 @@ T_BeginTest(communal_var_vs_regular_comdat) char *exes[] = { "a.exe", "b.exe" }; for EachElement(i, exes) { - String8 exe = t_read_file(scratch.arena, str8_cstring(exes[i])); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_cstring(exes[i])); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *data_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".data")); @@ -3319,7 +3263,6 @@ T_BeginTest(communal_var_vs_regular_comdat) T_Ok(str8_match(data, str8_lit("test"), 0)); } } -T_EndTest; T_BeginTest(import_kernel32) { @@ -3354,7 +3297,7 @@ T_BeginTest(import_kernel32) coff_obj_writer_section_push_reloc(obj_writer, text_sect, 70, data_symbol, COFF_Reloc_X64_Rel32); coff_obj_writer_section_push_reloc(obj_writer, text_sect, 76, create_file_symbol, COFF_Reloc_X64_Rel32); coff_obj_writer_section_push_reloc(obj_writer, text_sect, 85, close_handle_symbol, COFF_Reloc_X64_Rel32); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("import.obj"), obj)); } @@ -3364,13 +3307,13 @@ T_BeginTest(import_kernel32) #if OS_WINDOWS { - String8 test_file_path = push_str8f(scratch.arena, "%S/test", g_wdir); + String8 test_file_path = push_str8f(arena, "%S/test", g_wdir); os_delete_file_at_path(test_file_path); OS_ProcessLaunchParams launch_opts = {0}; launch_opts.inherit_env = 0; launch_opts.path = g_wdir; - str8_list_pushf(scratch.arena, &launch_opts.cmd_line, "%S/a.exe", g_wdir); + str8_list_pushf(arena, &launch_opts.cmd_line, "%S/a.exe", g_wdir); OS_Handle handle = os_process_launch(&launch_opts); AssertAlways(!os_handle_match(handle, os_handle_zero())); U64 exit_code = max_U64; @@ -3381,7 +3324,6 @@ T_BeginTest(import_kernel32) } #endif } -T_EndTest; T_BeginTest(delay_import) { @@ -3404,7 +3346,7 @@ T_BeginTest(delay_import) COFF_ObjSection *return_2_sect = t_push_text_section(obj_writer, str8_array_fixed(return_2)); coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_1"), 0, return_1_sect); coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_2"), 0, return_2_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("a.obj"), obj)); } @@ -3428,7 +3370,7 @@ T_BeginTest(delay_import) COFF_ObjSection *return_321_sect = t_push_text_section(obj_writer, str8_array_fixed(return_321)); coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_123"), 0, return_123_sect); coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_321"), 0, return_321_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("b.obj"), obj)); } @@ -3464,7 +3406,7 @@ T_BeginTest(delay_import) coff_obj_writer_section_push_reloc(obj_writer, text_sect, 14, return_2_symbol, COFF_Reloc_X64_Rel32); coff_obj_writer_section_push_reloc(obj_writer, text_sect, 23, return_123_symbol, COFF_Reloc_X64_Rel32); coff_obj_writer_section_push_reloc(obj_writer, text_sect, 30, return_321_symbol, COFF_Reloc_X64_Rel32); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("main.obj"), obj)); } @@ -3478,12 +3420,12 @@ T_BeginTest(delay_import) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed /debug:full main.obj a.lib b.lib kernel32.lib delayimp.lib libcmt.lib /delayload:a.dll /delayload:b.dll"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); - PE_ParsedDelayImportTable delay_import_table = pe_delay_imports_from_data(scratch.arena, pe.is_pe32, pe.section_count, section_table, exe, pe.data_dir_franges[PE_DataDirectoryIndex_DELAY_IMPORT]); + PE_ParsedDelayImportTable delay_import_table = pe_delay_imports_from_data(arena, pe.is_pe32, pe.section_count, section_table, exe, pe.data_dir_franges[PE_DataDirectoryIndex_DELAY_IMPORT]); PE_ParsedDelayDLLImport *a_import = &delay_import_table.v[0]; T_Ok(a_import->attributes == 1); @@ -3529,7 +3471,6 @@ T_BeginTest(delay_import) T_Ok(str8_match(return_321->u.name.string, str8_lit("return_321"), 0)); T_Ok(return_321->u.name.hint == 1); } -T_EndTest; T_BeginTest(delay_import_user32) { @@ -3537,9 +3478,9 @@ T_BeginTest(delay_import_user32) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".str"), PE_DATA_SECTION_FLAGS, str8_zero()); U64 msg_off = data_sect->data.total_size; - str8_list_push(obj_writer->arena, &data_sect->data, push_cstr(scratch.arena, str8_lit("test"))); + str8_list_push(obj_writer->arena, &data_sect->data, push_cstr(arena, str8_lit("test"))); U64 caption_off = data_sect->data.total_size; - str8_list_push(obj_writer->arena, &data_sect->data, push_cstr(scratch.arena, str8_lit("foo"))); + str8_list_push(obj_writer->arena, &data_sect->data, push_cstr(arena, str8_lit("foo"))); COFF_ObjSymbol *msg_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("msg"), msg_off, data_sect); COFF_ObjSymbol *caption_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("caption"), caption_off, data_sect); @@ -3561,7 +3502,7 @@ T_BeginTest(delay_import_user32) coff_obj_writer_section_push_reloc(obj_writer, text_sect, 17, caption_symbol, COFF_Reloc_X64_Rel32); coff_obj_writer_section_push_reloc(obj_writer, text_sect, 25, message_box_symbol, COFF_Reloc_X64_Rel32); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("delay_import.obj"), obj)); } @@ -3569,7 +3510,6 @@ T_BeginTest(delay_import_user32) t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry /fixed /delayload:user32.dll kernel32.lib user32.lib libcmt.lib delayimp.lib delay_import.obj /debug:full"); T_Ok(g_last_exit_code == 0); } -T_EndTest; T_BeginTest(empty_section) { @@ -3577,7 +3517,7 @@ T_BeginTest(empty_section) COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); COFF_ObjSection *test = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_TEXT_SECTION_FLAGS, str8(0,0)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, test); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("empty_section.obj"), obj)); } @@ -3592,7 +3532,7 @@ T_BeginTest(empty_section) COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -3600,7 +3540,6 @@ T_BeginTest(empty_section) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe empty_section.obj entry.obj"); T_Ok(g_last_exit_code != 0); } -T_EndTest; T_BeginTest(removed_section) { @@ -3609,7 +3548,7 @@ T_BeginTest(removed_section) U8 test_text[] = { 0xc3 }; COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkRemove, str8_array_fixed(test_text)); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, test_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("test.obj"), obj)); } @@ -3624,7 +3563,7 @@ T_BeginTest(removed_section) COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -3632,7 +3571,6 @@ T_BeginTest(removed_section) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.obj entry.obj"); T_Ok(g_last_exit_code != 0); } -T_EndTest; T_BeginTest(function_pad_min) { @@ -3647,7 +3585,7 @@ T_BeginTest(function_pad_min) coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("A"), 0, text_sect_0); coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("B"), 0, text_sect_1); coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("C"), 0, text_sect_2); - String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + String8 obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("funcs.obj"), obj)); } @@ -3655,8 +3593,8 @@ T_BeginTest(function_pad_min) t_invoke_linkerf("/subsystem:console /entry:A /functionpadmin:1 /out:a.exe funcs.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -3670,7 +3608,6 @@ T_BeginTest(function_pad_min) }; T_Ok(str8_match(text_data, str8_array_fixed(expected_text), 0)); } -T_EndTest; T_BeginTest(first_member_header) { @@ -3686,7 +3623,7 @@ T_BeginTest(first_member_header) coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("2"), 0x2, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("3"), 0x3, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("6"), 0x6, COFF_SymStorageClass_External); - obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -3694,7 +3631,7 @@ T_BeginTest(first_member_header) { COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); coff_lib_writer_push_obj(lib_writer, str8_lit("obj.obj"), obj); - lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 0); + lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 0); coff_lib_writer_release(&lib_writer); } @@ -3704,7 +3641,6 @@ T_BeginTest(first_member_header) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9"); T_Ok(g_last_exit_code == 0); } -T_EndTest; T_BeginTest(second_member_header) { @@ -3720,7 +3656,7 @@ T_BeginTest(second_member_header) coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("2"), 0x2, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("3"), 0x3, COFF_SymStorageClass_External); coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("6"), 0x6, COFF_SymStorageClass_External); - obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -3728,7 +3664,7 @@ T_BeginTest(second_member_header) { COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); coff_lib_writer_push_obj(lib_writer, str8_lit("obj.obj"), obj); - lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); coff_lib_writer_release(&lib_writer); } @@ -3738,7 +3674,6 @@ T_BeginTest(second_member_header) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9"); T_Ok(g_last_exit_code == 0); } -T_EndTest; T_BeginTest(defer_impl_link_to_second_search_pass) { @@ -3750,7 +3685,7 @@ T_BeginTest(defer_impl_link_to_second_search_pass) coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("entry"), 0, sect); coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_foo")); coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("func")); // force linker to pull obj from the lib - imp_ref_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + imp_ref_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -3761,7 +3696,7 @@ T_BeginTest(defer_impl_link_to_second_search_pass) COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("func"), 0, sect); coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); // on a second search pass force linker to look up same import - impl_ref_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + impl_ref_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -3769,7 +3704,7 @@ T_BeginTest(defer_impl_link_to_second_search_pass) { COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); coff_lib_writer_push_obj(lib_writer, str8_lit("impl_ref.obj"), impl_ref_obj); - impl_ref_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + impl_ref_lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); coff_lib_writer_release(&lib_writer); } @@ -3777,7 +3712,7 @@ T_BeginTest(defer_impl_link_to_second_search_pass) { COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); coff_lib_writer_push_import(lib_writer, COFF_MachineType_X64, ~0u, str8_lit("foo.dll"), COFF_ImportBy_Name, str8_lit("foo"), 0, COFF_ImportHeader_Code); - foo_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + foo_lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); coff_lib_writer_release(&lib_writer); } @@ -3789,7 +3724,6 @@ T_BeginTest(defer_impl_link_to_second_search_pass) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe foo.lib foo2.lib imp_ref.obj impl_ref.lib"); T_Ok(g_last_exit_code == 0); } -T_EndTest; T_BeginTest(opt_ref_dangling_section) { @@ -3804,7 +3738,7 @@ T_BeginTest(opt_ref_dangling_section) COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("f")); coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + entry_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -3820,7 +3754,7 @@ T_BeginTest(opt_ref_dangling_section) coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("f"), 0, sect); - a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + a_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -3837,7 +3771,7 @@ T_BeginTest(opt_ref_dangling_section) coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("f"), 0, sect); - b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer); + b_obj = coff_obj_writer_serialize(arena, obj_writer); coff_obj_writer_release(&obj_writer); } @@ -3845,7 +3779,7 @@ T_BeginTest(opt_ref_dangling_section) { COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); coff_lib_writer_push_obj(lib_writer, str8_lit("b.obj"), b_obj); - b_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1); + b_lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); coff_lib_writer_release(&lib_writer); } @@ -3856,14 +3790,13 @@ T_BeginTest(opt_ref_dangling_section) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.lib"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".q")); T_Ok(sect != 0); } -T_EndTest; T_BeginTest(fail_if_mismatch) { @@ -3872,8 +3805,8 @@ T_BeginTest(fail_if_mismatch) // ------------------------------------------------------------ // try linking two objs with mismatching directives - String8 a1 = t_make_obj_with_directive(scratch.arena, str8_lit("/FAILIFMISMATCH:a=1")); - String8 a2 = t_make_obj_with_directive(scratch.arena, str8_lit("/FAILIFMISMATCH:a=2")); + String8 a1 = t_make_obj_with_directive(arena, str8_lit("/FAILIFMISMATCH:a=1")); + String8 a2 = t_make_obj_with_directive(arena, str8_lit("/FAILIFMISMATCH:a=2")); T_Ok(t_write_file(str8_lit("a1.obj"), a1)); T_Ok(t_write_file(str8_lit("a2.obj"), a2)); @@ -3892,7 +3825,7 @@ T_BeginTest(fail_if_mismatch) // ------------------------------------------------------------ // test conflicting directives in obj - String8 conf_dirs = t_make_obj_with_directive(scratch.arena, str8_lit("/FAILIFMISMATCH:a=1 /FAILIFMISMATCH:a=2")); + String8 conf_dirs = t_make_obj_with_directive(arena, str8_lit("/FAILIFMISMATCH:a=1 /FAILIFMISMATCH:a=2")); T_Ok(t_write_file(str8_lit("conf_dirs.obj"), conf_dirs)); t_invoke_linkerf("entry.obj conf_dirs.obj /entry:entry /subsystem:console /out:conf_dirs.exe"); @@ -3906,7 +3839,6 @@ T_BeginTest(fail_if_mismatch) if (t_id_linker() == T_Linker_RAD) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); else T_Ok(g_last_exit_code != 0); } -T_EndTest; T_BeginTest(long_section_name) { @@ -3918,7 +3850,7 @@ T_BeginTest(long_section_name) coff_obj_writer_push_section(cow, str8_lit(".debug_info"), PE_DATA_SECTION_FLAGS, str8_lit("DEBUG_INFO")); coff_obj_writer_push_section(cow, str8_lit(".debug_abbrev"), PE_DATA_SECTION_FLAGS, str8_lit("DEBUG_ABBREV")); coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, text_sect); - String8 raw_coff = coff_obj_writer_serialize(scratch.arena, cow); + String8 raw_coff = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); // link test.obj @@ -3927,8 +3859,8 @@ T_BeginTest(long_section_name) T_Ok(g_last_exit_code == 0); // load linked exe - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); @@ -3938,7 +3870,6 @@ T_BeginTest(long_section_name) COFF_SectionHeader *debug_abbrev = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".debug_abbrev")); T_Ok(debug_abbrev); } -T_EndTest; T_BeginTest(debug_p_sig_mismatch) { @@ -3950,24 +3881,24 @@ T_BeginTest(debug_p_sig_mismatch) String8 a_debug_s; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); - CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); U64 ss_start_off = srl.total_size; CV_SymObjName obj_name = {0}; obj_name.sig = a_sig; String8 obj_name_string = a_obj_name; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); - str8_serial_push_struct(scratch.arena, &srl, &obj_name); - str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); - String8 comp3_data = cv_make_comp3(scratch.arena, + String8 comp3_data = cv_make_comp3(arena, 0, CV_Language_C, CV_Arch_X64, @@ -3980,71 +3911,71 @@ T_BeginTest(debug_p_sig_mismatch) /* ver_build */ 32537, /* ver_qfe */ 0, str8_lit(BUILD_TITLE)); - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); - str8_serial_push_string(scratch.arena, &srl, comp3_data); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); ss_header->kind = CV_C13SubSectionKind_Symbols; ss_header->size = srl.total_size - ss_start_off; - str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); - a_debug_s = str8_serial_end(scratch.arena, &srl); + a_debug_s = str8_serial_end(arena, &srl); } String8 a_debug_p; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); // signature CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); // duplicate in a.obj CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); - str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); // unique procedure type CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearPascal }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(proc)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); - str8_serial_push_struct(scratch.arena, &srl, &proc); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(proc)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); // PCH ender CV_LeafEndPreComp endprecomp = { .sig = a_sig }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_ENDPRECOMP); - str8_serial_push_struct(scratch.arena, &srl, &endprecomp); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_ENDPRECOMP); + str8_serial_push_struct(arena, &srl, &endprecomp); + str8_serial_push_align(arena, &srl, CV_LeafAlign); - a_debug_p = str8_serial_end(scratch.arena, &srl); + a_debug_p = str8_serial_end(arena, &srl); } String8 b_debug_s; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); - CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); U64 ss_start_off = srl.total_size; CV_SymObjName obj_name = {0}; obj_name.sig = b_sig; String8 obj_name_string = a_obj_name; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); - str8_serial_push_struct(scratch.arena, &srl, &obj_name); - str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); - String8 comp3_data = cv_make_comp3(scratch.arena, + String8 comp3_data = cv_make_comp3(arena, 0, CV_Language_C, CV_Arch_X64, @@ -4057,46 +3988,46 @@ T_BeginTest(debug_p_sig_mismatch) /* ver_build */ 32537, /* ver_qfe */ 0, str8_lit(BUILD_TITLE)); - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); - str8_serial_push_string(scratch.arena, &srl, comp3_data); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); ss_header->kind = CV_C13SubSectionKind_Symbols; ss_header->size = srl.total_size - ss_start_off; - str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); - b_debug_s = str8_serial_end(scratch.arena, &srl); + b_debug_s = str8_serial_end(arena, &srl); } String8 b_debug_t; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 2, sig = b_sig }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + a_obj_name.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP); - str8_serial_push_struct(scratch.arena, &srl, &precomp); - str8_serial_push_cstr(scratch.arena, &srl, a_obj_name); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + a_obj_name.size + 1); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PRECOMP); + str8_serial_push_struct(arena, &srl, &precomp); + str8_serial_push_cstr(arena, &srl, a_obj_name); + str8_serial_push_align(arena, &srl, CV_LeafAlign); CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); - str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); - str8_serial_push_struct(scratch.arena, &srl, &proc); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); - b_debug_t = str8_serial_end(scratch.arena, &srl); + b_debug_t = str8_serial_end(arena, &srl); } String8 a_obj; @@ -4104,7 +4035,7 @@ T_BeginTest(debug_p_sig_mismatch) COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_p); coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_s); - a_obj = coff_obj_writer_serialize(scratch.arena, cow); + a_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -4113,7 +4044,7 @@ T_BeginTest(debug_p_sig_mismatch) COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, b_debug_t); coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, b_debug_s); - b_obj = coff_obj_writer_serialize(scratch.arena, cow); + b_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -4122,13 +4053,13 @@ T_BeginTest(debug_p_sig_mismatch) T_Ok(t_write_entry_obj()); String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full a.obj b.obj entry.obj"), max_U64, scratch.arena, &output); + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full a.obj b.obj entry.obj"), max_U64, arena, &output); T_Ok(g_last_exit_code == 0); B32 found_error = 0; - String8 a_obj_path = t_make_file_path(scratch.arena, str8_lit("a.obj")); - String8 b_obj_path = t_make_file_path(scratch.arena, str8_lit("b.obj")); - String8 expected_line = str8f(scratch.arena, "Error(%03d): %S: PCH signature mismatch, expected 0x%x got 0x%x; PCH obj %S", LNK_Error_PrecompSigMismatch, b_obj_path, b_sig, a_sig, a_obj_path); + String8 a_obj_path = t_make_file_path(arena, str8_lit("a.obj")); + String8 b_obj_path = t_make_file_path(arena, str8_lit("b.obj")); + String8 expected_line = str8f(arena, "Error(%03d): %S: PCH signature mismatch, expected 0x%x got 0x%x; PCH obj %S", LNK_Error_PrecompSigMismatch, b_obj_path, b_sig, a_sig, a_obj_path); while (output.size) { String8 line = t_chop_line(&output); found_error = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive); @@ -4136,7 +4067,6 @@ T_BeginTest(debug_p_sig_mismatch) } T_Ok(found_error); } -T_EndTest; T_BeginTest(debug_p_and_debug_t_in_obj) { @@ -4146,101 +4076,101 @@ T_BeginTest(debug_p_and_debug_t_in_obj) String8 pch_debug_s; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); - CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); U64 ss_start_off = srl.total_size; CV_SymObjName obj_name = {0}; obj_name.sig = pch_sig; String8 obj_name_string = pch_obj_name; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); - str8_serial_push_struct(scratch.arena, &srl, &obj_name); - str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); ss_header->kind = CV_C13SubSectionKind_Symbols; ss_header->size = srl.total_size - ss_start_off; - str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); - pch_debug_s = str8_serial_end(scratch.arena, &srl); + pch_debug_s = str8_serial_end(arena, &srl); } String8 pch_debug_p; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); // signature CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); - str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); // PCH ender CV_LeafEndPreComp endprecomp = { .sig = pch_sig }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_ENDPRECOMP); - str8_serial_push_struct(scratch.arena, &srl, &endprecomp); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_ENDPRECOMP); + str8_serial_push_struct(arena, &srl, &endprecomp); + str8_serial_push_align(arena, &srl, CV_LeafAlign); - pch_debug_p = str8_serial_end(scratch.arena, &srl); + pch_debug_p = str8_serial_end(arena, &srl); } String8 pch_debug_t; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 1, sig = pch_sig }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + pch_obj_name.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP); - str8_serial_push_struct(scratch.arena, &srl, &precomp); - str8_serial_push_cstr(scratch.arena, &srl, pch_obj_name); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + pch_obj_name.size + 1); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PRECOMP); + str8_serial_push_struct(arena, &srl, &precomp); + str8_serial_push_cstr(arena, &srl, pch_obj_name); + str8_serial_push_align(arena, &srl, CV_LeafAlign); CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); - str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); - str8_serial_push_struct(scratch.arena, &srl, &proc); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); - pch_debug_t = str8_serial_end(scratch.arena, &srl); + pch_debug_t = str8_serial_end(arena, &srl); } COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_p); coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_t); coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_s); - String8 raw_coff = coff_obj_writer_serialize(scratch.arena, cow); + String8 raw_coff = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); T_Ok(t_write_file(str8_lit("pch.obj"), raw_coff)); T_Ok(t_write_entry_obj()); String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full pch.obj entry.obj"), max_U64, scratch.arena, &output); + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full pch.obj entry.obj"), max_U64, arena, &output); T_Ok(g_last_exit_code == 0); B32 found_warning = 0; - String8 pch_obj_path = t_make_file_path(scratch.arena, str8_lit("pch.obj")); - String8 expected_line = str8f(scratch.arena, "Warning(%03d): %S: multiple sections with debug types detected, obj must have either .debug$T or .debug$P; discarding both sections", LNK_Warning_MultipleDebugTAndDebugP, pch_obj_path); + String8 pch_obj_path = t_make_file_path(arena, str8_lit("pch.obj")); + String8 expected_line = str8f(arena, "Warning(%03d): %S: multiple sections with debug types detected, obj must have either .debug$T or .debug$P; discarding both sections", LNK_Warning_MultipleDebugTAndDebugP, pch_obj_path); while (output.size) { String8 line = t_chop_line(&output); found_warning = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive); @@ -4248,7 +4178,6 @@ T_BeginTest(debug_p_and_debug_t_in_obj) } T_Ok(found_warning); } -T_EndTest; T_BeginTest(merge_duplicate_types) { @@ -4261,24 +4190,24 @@ T_BeginTest(merge_duplicate_types) String8 pch_debug_s; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); - CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); U64 ss_start_off = srl.total_size; CV_SymObjName obj_name = {0}; obj_name.sig = pch_sig; String8 obj_name_string = pch_obj_name; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); - str8_serial_push_struct(scratch.arena, &srl, &obj_name); - str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); - String8 comp3_data = cv_make_comp3(scratch.arena, + String8 comp3_data = cv_make_comp3(arena, 0, CV_Language_C, CV_Arch_X64, @@ -4291,71 +4220,71 @@ T_BeginTest(merge_duplicate_types) /* ver_build */ 32537, /* ver_qfe */ 0, str8_lit(BUILD_TITLE)); - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); - str8_serial_push_string(scratch.arena, &srl, comp3_data); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); ss_header->kind = CV_C13SubSectionKind_Symbols; ss_header->size = srl.total_size - ss_start_off; - str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); - pch_debug_s = str8_serial_end(scratch.arena, &srl); + pch_debug_s = str8_serial_end(arena, &srl); } String8 debug_p; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); // signature CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); // duplicate in a.obj CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); - str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); // unique procedure type CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearPascal }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(proc)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); - str8_serial_push_struct(scratch.arena, &srl, &proc); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(proc)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); // PCH ender CV_LeafEndPreComp endprecomp = { .sig = pch_sig }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_ENDPRECOMP); - str8_serial_push_struct(scratch.arena, &srl, &endprecomp); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_ENDPRECOMP); + str8_serial_push_struct(arena, &srl, &endprecomp); + str8_serial_push_align(arena, &srl, CV_LeafAlign); - debug_p = str8_serial_end(scratch.arena, &srl); + debug_p = str8_serial_end(arena, &srl); } String8 a_debug_s; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); - CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); U64 ss_start_off = srl.total_size; CV_SymObjName obj_name = {0}; obj_name.sig = pch_sig; String8 obj_name_string = a_obj_name; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); - str8_serial_push_struct(scratch.arena, &srl, &obj_name); - str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); - String8 comp3_data = cv_make_comp3(scratch.arena, + String8 comp3_data = cv_make_comp3(arena, 0, CV_Language_C, CV_Arch_X64, @@ -4368,94 +4297,94 @@ T_BeginTest(merge_duplicate_types) /* ver_build */ 32537, /* ver_qfe */ 0, str8_lit(BUILD_TITLE)); - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); - str8_serial_push_string(scratch.arena, &srl, comp3_data); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); ss_header->kind = CV_C13SubSectionKind_Symbols; ss_header->size = srl.total_size - ss_start_off; - str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); - a_debug_s = str8_serial_end(scratch.arena, &srl); + a_debug_s = str8_serial_end(arena, &srl); } String8 debug_t; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 2, sig = pch_sig }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + pch_obj_name.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PRECOMP); - str8_serial_push_struct(scratch.arena, &srl, &precomp); - str8_serial_push_cstr(scratch.arena, &srl, pch_obj_name); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + pch_obj_name.size + 1); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PRECOMP); + str8_serial_push_struct(arena, &srl, &precomp); + str8_serial_push_cstr(arena, &srl, pch_obj_name); + str8_serial_push_align(arena, &srl, CV_LeafAlign); CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); - str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); - str8_serial_push_struct(scratch.arena, &srl, &proc); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); - debug_t = str8_serial_end(scratch.arena, &srl); + debug_t = str8_serial_end(arena, &srl); } String8 c_debug_t; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); CV_LeafPointer ptr = { .itype = CV_BasicType_SHORT }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_POINTER); - str8_serial_push_struct(scratch.arena, &srl, &ptr); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); - str8_serial_push_u16(scratch.arena, &srl, CV_LeafKind_PROCEDURE); - str8_serial_push_struct(scratch.arena, &srl, &proc); - str8_serial_push_align(scratch.arena, &srl, CV_LeafAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); - c_debug_t = str8_serial_end(scratch.arena, &srl); + c_debug_t = str8_serial_end(arena, &srl); } String8 c_debug_s; { String8List srl; - str8_serial_begin(scratch.arena, &srl); + str8_serial_begin(arena, &srl); CV_Signature sig = CV_Signature_C13; - str8_serial_push_struct(scratch.arena, &srl, &sig); + str8_serial_push_struct(arena, &srl, &sig); - CV_C13SubSectionHeader *ss_header = str8_serial_push_size(scratch.arena, &srl, sizeof(*ss_header)); + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); U64 ss_start_off = srl.total_size; // S_OBJNAME CV_SymObjName obj_name = {0}; obj_name.sig = pch_sig; String8 obj_name_string = c_obj_name; - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_OBJNAME); - str8_serial_push_struct(scratch.arena, &srl, &obj_name); - str8_serial_push_cstr(scratch.arena, &srl, obj_name_string); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); // S_COMPILE3 - String8 comp3_data = cv_make_comp3(scratch.arena, + String8 comp3_data = cv_make_comp3(arena, 0, CV_Language_C, CV_Arch_X64, @@ -4468,34 +4397,34 @@ T_BeginTest(merge_duplicate_types) /* ver_build */ 32537, /* ver_qfe */ 0, str8_lit(BUILD_TITLE)); - str8_serial_push_u16(scratch.arena, &srl, sizeof(CV_SymKind) + comp3_data.size); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_COMPILE3); - str8_serial_push_string(scratch.arena, &srl, comp3_data); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); // S_LPROC32 - U16 *foo_size = str8_serial_push_size(scratch.arena, &srl, sizeof(*foo_size)); + U16 *foo_size = str8_serial_push_size(arena, &srl, sizeof(*foo_size)); U64 foo_off = srl.total_size; - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_LPROC32); - CV_SymProc32 *foo_proc = str8_serial_push_size(scratch.arena, &srl, sizeof(*foo_proc)); + str8_serial_push_u16(arena, &srl, CV_SymKind_LPROC32); + CV_SymProc32 *foo_proc = str8_serial_push_size(arena, &srl, sizeof(*foo_proc)); foo_proc->itype = 0x1001; foo_proc->sec = 1; foo_proc->len = 1; - str8_serial_push_cstr(scratch.arena, &srl, str8_lit("foo")); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_cstr(arena, &srl, str8_lit("foo")); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); *foo_size = srl.total_size - foo_off; // S_PROC_ID_END - str8_serial_push_u16(scratch.arena, &srl, 2); - str8_serial_push_u16(scratch.arena, &srl, CV_SymKind_END); - str8_serial_push_align(scratch.arena, &srl, CV_SymbolAlign); + str8_serial_push_u16(arena, &srl, 2); + str8_serial_push_u16(arena, &srl, CV_SymKind_END); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); // $$Symbols header ss_header->kind = CV_C13SubSectionKind_Symbols; ss_header->size = srl.total_size - ss_start_off; - str8_serial_push_align(scratch.arena, &srl, CV_C13SubSectionAlign); + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); - c_debug_s = str8_serial_end(scratch.arena, &srl); + c_debug_s = str8_serial_end(arena, &srl); } String8 pch_obj; @@ -4503,7 +4432,7 @@ T_BeginTest(merge_duplicate_types) COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_p); coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_s); - pch_obj = coff_obj_writer_serialize(scratch.arena, cow); + pch_obj = coff_obj_writer_serialize(arena, cow); } String8 a_obj; @@ -4511,14 +4440,14 @@ T_BeginTest(merge_duplicate_types) COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t); coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_s); - a_obj = coff_obj_writer_serialize(scratch.arena, cow); + a_obj = coff_obj_writer_serialize(arena, cow); } String8 b_obj; { COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t); - b_obj = coff_obj_writer_serialize(scratch.arena, cow); + b_obj = coff_obj_writer_serialize(arena, cow); } String8 c_obj; @@ -4527,10 +4456,10 @@ T_BeginTest(merge_duplicate_types) coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_lit((U8[]){ 0xc3 })); coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, c_debug_t); coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, c_debug_s); - c_obj = coff_obj_writer_serialize(scratch.arena, cow); + c_obj = coff_obj_writer_serialize(arena, cow); } - String8 entry_obj = t_make_entry_obj(scratch.arena); + String8 entry_obj = t_make_entry_obj(arena); T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); T_Ok(t_write_file(str8_lit("pch.obj"), pch_obj)); @@ -4543,24 +4472,24 @@ T_BeginTest(merge_duplicate_types) } // load msf - String8 pdb = t_read_file(scratch.arena, str8_lit("a.pdb")); - MSF_Parsed *msf = msf_parsed_from_data(scratch.arena, pdb); + String8 pdb = t_read_file(arena, str8_lit("a.pdb")); + MSF_Parsed *msf = msf_parsed_from_data(arena, pdb); // find named streams String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_Info); - PDB_Info *pdb_info = pdb_info_from_data(scratch.arena, info_data); - PDB_NamedStreamTable *named_streams = pdb_named_stream_table_from_info(scratch.arena, pdb_info); + PDB_Info *pdb_info = pdb_info_from_data(arena, info_data); + PDB_NamedStreamTable *named_streams = pdb_named_stream_table_from_info(arena, pdb_info); // find string table MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_StringTable]; String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); - PDB_Strtbl *strtbl = pdb_strtbl_from_data(scratch.arena, strtbl_data); + PDB_Strtbl *strtbl = pdb_strtbl_from_data(arena, strtbl_data); // find TPI String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi); - PDB_TpiParsed *tpi = pdb_tpi_from_data(scratch.arena, tpi_data); + PDB_TpiParsed *tpi = pdb_tpi_from_data(arena, tpi_data); U64 type_count = tpi->itype_opl - tpi->itype_first; T_Ok(type_count == 5); - CV_DebugT debug_t = cv_debug_t_from_data(scratch.arena, pdb_leaf_data_from_tpi(tpi), 4); + CV_DebugT debug_t = cv_debug_t_from_data(arena, pdb_leaf_data_from_tpi(tpi), 4); T_Ok(debug_t.count == type_count); { @@ -4613,44 +4542,42 @@ T_BeginTest(merge_duplicate_types) T_Ok(proc->call_kind == CV_CallKind_NearC); } } -T_EndTest; T_BeginTest(cyclic_type) { - String8List *debug_t = push_array(scratch.arena, String8List, 1); - str8_serial_begin(scratch.arena, debug_t); - str8_serial_push_u32(scratch.arena, debug_t, CV_Signature_C13); - str8_serial_push_string(scratch.arena, debug_t, cv_make_leaf(scratch.arena, CV_LeafKind_POINTER, str8_struct((&(CV_LeafPointer){ .itype = 0x1001 })), CV_LeafAlign)); - str8_serial_push_string(scratch.arena, debug_t, cv_make_leaf(scratch.arena, CV_LeafKind_POINTER, str8_struct((&(CV_LeafPointer){ .itype = 0x1000 })), CV_LeafAlign)); + String8List *debug_t = push_array(arena, String8List, 1); + str8_serial_begin(arena, debug_t); + str8_serial_push_u32(arena, debug_t, CV_Signature_C13); + str8_serial_push_string(arena, debug_t, cv_make_leaf(arena, CV_LeafKind_POINTER, str8_struct((&(CV_LeafPointer){ .itype = 0x1001 })), CV_LeafAlign)); + str8_serial_push_string(arena, debug_t, cv_make_leaf(arena, CV_LeafKind_POINTER, str8_struct((&(CV_LeafPointer){ .itype = 0x1000 })), CV_LeafAlign)); CV_DebugS debug_s = {0}; - str8_list_push(scratch.arena, &debug_s.data_list[CV_C13SubSectionIdxKind_Symbols], cv_make_symbol(scratch.arena, CV_SymKind_GPROC32, cv_make_proc32(scratch.arena, (CV_SymProc32){ .itype = 0x1001 }, str8_lit("foo")))); - String8List debug_s_string = cv_data_from_debug_s_c13(scratch.arena, &debug_s, 1); + str8_list_push(arena, &debug_s.data_list[CV_C13SubSectionIdxKind_Symbols], cv_make_symbol(arena, CV_SymKind_GPROC32, cv_make_proc32(arena, (CV_SymProc32){ .itype = 0x1001 }, str8_lit("foo")))); + String8List debug_s_string = cv_data_from_debug_s_c13(arena, &debug_s, 1); COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_serial_end(scratch.arena, debug_t)); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_list_join(scratch.arena, &debug_s_string, 0)); - String8 raw_coff = coff_obj_writer_serialize(scratch.arena, cow); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_serial_end(arena, debug_t)); + coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_list_join(arena, &debug_s_string, 0)); + String8 raw_coff = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); T_Ok(t_write_entry_obj()); T_Ok(t_write_file(str8_lit("cycle.obj"), raw_coff)); - String8 cmd_line = str8f(scratch.arena, "/subsystem:console /entry:entry /out:a.exe /debug:full /rad_ignore:-%u cycle.obj entry.obj", LNK_Error_InvalidTypeIndex); + String8 cmd_line = str8f(arena, "/subsystem:console /entry:entry /out:a.exe /debug:full /rad_ignore:-%u cycle.obj entry.obj", LNK_Error_InvalidTypeIndex); String8 output = {0}; - t_invoke_(t_radlink_path(), cmd_line, max_U64, scratch.arena, &output); + t_invoke_(t_radlink_path(), cmd_line, max_U64, arena, &output); T_Ok(g_last_exit_code == 0); B32 is_cycle_detected = 0; while (output.size && !is_cycle_detected) { is_cycle_detected = t_match_linef(&output, "Error(043): %S: LF_POINTER(type_index: 0x1000) forward refs member type index 0x1001 (leaf struct offset: 0x0)", - t_make_file_path(scratch.arena, str8_lit("cycle.obj"))); + t_make_file_path(arena, str8_lit("cycle.obj"))); t_chop_line(&output); } T_Ok(is_cycle_detected); } -T_EndTest; T_BeginTest(get_msf_stream_pages) { @@ -4661,15 +4588,15 @@ T_BeginTest(get_msf_stream_pages) MSF_StreamNumber sn = msf_stream_alloc_ex(msf, stream_size); - U8 *test = push_array(scratch.arena, U8, stream_size); + U8 *test = push_array(arena, U8, stream_size); MemorySet(test, 0xca, stream_size/2); MemorySet(test + stream_size/2, 0xbe, stream_size/2); - String8List stream_data = msf_data_from_sn(scratch.arena, msf, sn); + String8List stream_data = msf_data_from_sn(arena, msf, sn); T_Ok(stream_data.total_size == stream_size); T_Ok(stream_data.node_count == 11); - String8Array a = str8_array_from_list(scratch.arena, &stream_data); + String8Array a = str8_array_from_list(arena, &stream_data); T_Ok(a.v[0].size == 0xffd000); T_Ok(a.v[1].size == 0xffe000); T_Ok(a.v[2].size == 0xffe000); @@ -4686,14 +4613,14 @@ T_BeginTest(get_msf_stream_pages) U64 buf_pos = 0; str8_buffer_write(&buf, &buf_pos, str8(test, stream_size)); - String8 cmp = msf_stream_read_block(scratch.arena, msf, sn, stream_size); + String8 cmp = msf_stream_read_block(arena, msf, sn, stream_size); T_Ok(cmp.size == stream_size); T_Ok(MemoryCompare(cmp.str, test, stream_size) == 0); } { MSF_StreamNumber sn = msf_stream_alloc_ex(msf, 1); - String8List stream_data = msf_data_from_sn(scratch.arena, msf, sn); + String8List stream_data = msf_data_from_sn(arena, msf, sn); T_Ok(stream_data.node_count == 1); T_Ok(stream_data.total_size == 1); T_Ok(stream_data.first->string.size == 1); @@ -4701,16 +4628,15 @@ T_BeginTest(get_msf_stream_pages) msf_release(&msf); } -T_EndTest; T_BeginTest(patch_cv_symbol_tree) { String8List raw_symbols = {0}; - str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_OBJNAME, cv_make_obj_name(scratch.arena, str8_lit("foo.obj"), 123))); - str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_GPROC32, cv_make_proc32(scratch.arena, (CV_SymProc32){0}, str8_lit("Proc")))); - str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_INLINESITE, cv_make_inline_site(scratch.arena, (CV_SymInlineSite){0}, str8_zero()))); - str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_INLINESITE_END, cv_make_inline_site_end(scratch.arena))); - str8_list_push(scratch.arena, &raw_symbols, cv_make_symbol(scratch.arena, CV_SymKind_END, cv_make_end(scratch.arena))); + str8_list_push(arena, &raw_symbols, cv_make_symbol(arena, CV_SymKind_OBJNAME, cv_make_obj_name(arena, str8_lit("foo.obj"), 123))); + str8_list_push(arena, &raw_symbols, cv_make_symbol(arena, CV_SymKind_GPROC32, cv_make_proc32(arena, (CV_SymProc32){0}, str8_lit("Proc")))); + str8_list_push(arena, &raw_symbols, cv_make_symbol(arena, CV_SymKind_INLINESITE, cv_make_inline_site(arena, (CV_SymInlineSite){0}, str8_zero()))); + str8_list_push(arena, &raw_symbols, cv_make_symbol(arena, CV_SymKind_INLINESITE_END, cv_make_inline_site_end(arena))); + str8_list_push(arena, &raw_symbols, cv_make_symbol(arena, CV_SymKind_END, cv_make_end(arena))); U64 tree_size = cv_patch_symbol_tree_offsets(raw_symbols, sizeof(CV_Signature), 4); T_Ok(tree_size == 84); @@ -4756,7 +4682,6 @@ T_BeginTest(patch_cv_symbol_tree) T_Ok(buf_pos == 0); } } -T_EndTest; T_BeginTest(whole_archive) { @@ -4764,7 +4689,7 @@ T_BeginTest(whole_archive) { COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); - a_obj = coff_obj_writer_serialize(scratch.arena, cow); + a_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -4772,7 +4697,7 @@ T_BeginTest(whole_archive) { COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); coff_obj_writer_push_section(cow, str8_lit(".b"), PE_DATA_SECTION_FLAGS, str8_lit("b")); - b_obj = coff_obj_writer_serialize(scratch.arena, cow); + b_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -4780,7 +4705,7 @@ T_BeginTest(whole_archive) { COFF_LibWriter *ciw = coff_lib_writer_alloc(); coff_lib_writer_push_obj(ciw, str8_lit("a.obj"), a_obj); - a_lib = coff_lib_writer_serialize(scratch.arena, ciw, 0, 0, 1); + a_lib = coff_lib_writer_serialize(arena, ciw, 0, 0, 1); coff_lib_writer_release(&ciw); } @@ -4788,7 +4713,7 @@ T_BeginTest(whole_archive) { COFF_LibWriter *ciw = coff_lib_writer_alloc(); coff_lib_writer_push_obj(ciw, str8_lit("b.obj"), b_obj); - b_lib = coff_lib_writer_serialize(scratch.arena, ciw, 0, 0, 1); + b_lib = coff_lib_writer_serialize(arena, ciw, 0, 0, 1); coff_lib_writer_release(&ciw); } @@ -4799,8 +4724,8 @@ T_BeginTest(whole_archive) t_invoke_linkerf("/subsystem:console /entry:entry /out:all_libs.exe entry.obj /wholearchive a.lib b.lib"); T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("all_libs.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("all_libs.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *a_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); @@ -4812,8 +4737,8 @@ T_BeginTest(whole_archive) t_invoke_linkerf("/subsystem:console /entry:entry /out:only_a.exe entry.obj /wholearchive:a.lib a.lib b.lib"); T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("only_a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("only_a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *a_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); @@ -4825,8 +4750,8 @@ T_BeginTest(whole_archive) t_invoke_linkerf("/subsystem:console /entry:entry /out:only_b.exe /wholearchive:b.lib a.lib b.lib entry.obj"); T_Ok(g_last_exit_code == 0); { - String8 exe = t_read_file(scratch.arena, str8_lit("only_b.exe")); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + String8 exe = t_read_file(arena, str8_lit("only_b.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *a_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".a")); @@ -4835,8 +4760,6 @@ T_BeginTest(whole_archive) T_Ok(b_sect != 0); } } -T_EndTest; - #if OS_WINDOWS internal B32 @@ -4888,7 +4811,7 @@ T_BeginTest(infer_asan) { T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); String8 cl_output = {0}; - t_invoke_(t_cl_path(), str8_lit("/MD /fsanitize=address /Z7 /c /Fo:main_md.obj main.c"), max_U64, scratch.arena, &cl_output); + t_invoke_(t_cl_path(), str8_lit("/MD /fsanitize=address /Z7 /c /Fo:main_md.obj main.c"), max_U64, arena, &cl_output); T_Ok(g_last_exit_code == 0); T_Ok(t_radlink_validate_asan_out(str8_lit("main_md.obj"))); } @@ -4897,7 +4820,7 @@ T_BeginTest(infer_asan) { T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); String8 cl_output = {0}; - t_invoke_(t_cl_path(), str8_lit("/MDd /fsanitize=address /Z7 /c /Fo:main_mdd.obj main.c"), max_U64, scratch.arena, &cl_output); + t_invoke_(t_cl_path(), str8_lit("/MDd /fsanitize=address /Z7 /c /Fo:main_mdd.obj main.c"), max_U64, arena, &cl_output); T_Ok(g_last_exit_code == 0); T_Ok(t_radlink_validate_asan_out(str8_lit("main_mdd.obj"))); } @@ -4906,7 +4829,7 @@ T_BeginTest(infer_asan) { T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); String8 cl_output = {0}; - t_invoke_(t_cl_path(), str8_lit("/MT /fsanitize=address /Z7 /c /Fo:main_mt.obj main.c"), max_U64, scratch.arena, &cl_output); + t_invoke_(t_cl_path(), str8_lit("/MT /fsanitize=address /Z7 /c /Fo:main_mt.obj main.c"), max_U64, arena, &cl_output); T_Ok(g_last_exit_code == 0); T_Ok(t_radlink_validate_asan_out(str8_lit("main_mt.obj"))); } @@ -4915,21 +4838,21 @@ T_BeginTest(infer_asan) { T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); String8 cl_output = {0}; - t_invoke_(t_cl_path(), str8_lit("/MT /fsanitize=address /Z7 /c /Fo:main_mtd.obj main.c"), max_U64, scratch.arena, &cl_output); + t_invoke_(t_cl_path(), str8_lit("/MT /fsanitize=address /Z7 /c /Fo:main_mtd.obj main.c"), max_U64, arena, &cl_output); T_Ok(g_last_exit_code == 0); T_Ok(t_radlink_validate_asan_out(str8_lit("main_mtd.obj"))); } } -T_EndTest; + #endif #if OS_WINDOWS T_BeginTest(determ_test) { // compile the test target (torture) - String8 cl_line = str8f(scratch.arena, "/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); + String8 cl_line = str8f(arena, "/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); String8 cl_out = {0}; - t_invoke_(t_cl_path(), cl_line, max_U64, scratch.arena, &cl_out); + t_invoke_(t_cl_path(), cl_line, max_U64, arena, &cl_out); T_Ok(g_last_exit_code == 0); // clean up @@ -4939,21 +4862,21 @@ T_BeginTest(determ_test) t_delete_file(str8_lit("b.pdb")); // single-threaded link - String8 refs_path = t_make_file_path(scratch.arena, str8_lit("b.types")); + String8 refs_path = t_make_file_path(arena, str8_lit("b.types")); t_invoke_linkerf("test.obj /debug:full /rad_time_stamp:0 /rad_workers:1 /rad_store_types:%S /out:a.exe", refs_path); T_Ok(g_last_exit_code == 0); // rename a -> b - T_Ok(os_move_file_path(t_make_file_path(scratch.arena, str8_lit("b.exe")), t_make_file_path(scratch.arena, str8_lit("a.exe")))); - T_Ok(os_move_file_path(t_make_file_path(scratch.arena, str8_lit("b.pdb")), t_make_file_path(scratch.arena, str8_lit("a.pdb")))); + T_Ok(os_move_file_path(t_make_file_path(arena, str8_lit("b.exe")), t_make_file_path(arena, str8_lit("a.exe")))); + T_Ok(os_move_file_path(t_make_file_path(arena, str8_lit("b.pdb")), t_make_file_path(arena, str8_lit("a.pdb")))); // read b - String8 b_exe = t_read_file(scratch.arena, str8_lit("b.exe")); - String8 b_pdb = t_read_file(scratch.arena, str8_lit("b.pdb")); + String8 b_exe = t_read_file(arena, str8_lit("b.exe")); + String8 b_pdb = t_read_file(arena, str8_lit("b.pdb")); // multi-threaded links for EachIndex(i, 50) { - Temp temp = temp_begin(scratch.arena); + Temp temp = temp_begin(arena); t_delete_file(str8_lit("a.pdb")); t_invoke_linkerf("test.obj /debug:full /rad_time_stamp:0 /out:a.exe"); @@ -4967,7 +4890,7 @@ T_BeginTest(determ_test) temp_end(temp); } } -T_EndTest; + #endif #if 0 @@ -4999,7 +4922,7 @@ T_BeginTest(fold_two_funcs) coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); - ident_funcs_obj = coff_obj_writer_serialize(scratch.arena, cow); + ident_funcs_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -5008,10 +4931,10 @@ T_BeginTest(fold_two_funcs) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /opt:icf ident_funcs.obj"); T_Ok(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("ident_funcs.exe")); + String8 exe = t_read_file(arena, str8_lit("ident_funcs.exe")); T_Ok(exe.size); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_sect = coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(".text")); @@ -5039,7 +4962,7 @@ T_BeginTest(fold_two_funcs) }; T_Ok(str8_match(text_data, str8_array_fixed(expected_text), 0)); } -T_EndTest; + T_BeginTest(same_but_different) { @@ -5096,7 +5019,7 @@ T_BeginTest(same_but_different) coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); - obj = coff_obj_writer_serialize(scratch.arena, cow); + obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -5125,10 +5048,10 @@ T_BeginTest(same_but_different) 0xc3, }; - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + String8 exe = t_read_file(arena, str8_lit("a.exe")); T_Ok(exe.size); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -5140,7 +5063,7 @@ T_BeginTest(same_but_different) T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); } } -T_EndTest; + T_BeginTest(fold_diamond) { @@ -5189,7 +5112,7 @@ T_BeginTest(fold_diamond) // c -> d coff_obj_writer_section_push_reloc_rel32(cow, c_sect, 1, d_symbol); - a_obj = coff_obj_writer_serialize(scratch.arena, cow); + a_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -5215,10 +5138,10 @@ T_BeginTest(fold_diamond) 0xc3 }; - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + String8 exe = t_read_file(arena, str8_lit("a.exe")); T_Ok(exe.size); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -5230,7 +5153,7 @@ T_BeginTest(fold_diamond) T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); } } -T_EndTest; + T_BeginTest(cyclic_icf) { @@ -5250,7 +5173,7 @@ T_BeginTest(cyclic_icf) coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 1, b_symbol); coff_obj_writer_section_push_reloc_rel32(cow, b_sect, 1, a_symbol); - a_obj = coff_obj_writer_serialize(scratch.arena, cow); + a_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -5270,10 +5193,10 @@ T_BeginTest(cyclic_icf) 0xc3, }; - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + String8 exe = t_read_file(arena, str8_lit("a.exe")); T_Ok(exe.size); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -5285,7 +5208,7 @@ T_BeginTest(cyclic_icf) T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); } } -T_EndTest; + T_BeginTest(fold_with_largest_align) { @@ -5316,7 +5239,7 @@ T_BeginTest(fold_with_largest_align) coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); - a_obj = coff_obj_writer_serialize(scratch.arena, cow); + a_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -5348,7 +5271,7 @@ T_BeginTest(fold_with_largest_align) coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); - b_obj = coff_obj_writer_serialize(scratch.arena, cow); + b_obj = coff_obj_writer_serialize(arena, cow); coff_obj_writer_release(&cow); } @@ -5377,10 +5300,10 @@ T_BeginTest(fold_with_largest_align) // validate output in a.exe { - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); + String8 exe = t_read_file(arena, str8_lit("a.exe")); T_Ok(exe.size); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -5394,10 +5317,10 @@ T_BeginTest(fold_with_largest_align) // validate output in b.exe { - String8 exe = t_read_file(scratch.arena, str8_lit("b.exe")); + String8 exe = t_read_file(arena, str8_lit("b.exe")); T_Ok(exe.size); - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; String8 string_table = str8_substr(exe, pe.string_table_range); COFF_SectionHeader *text_section = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".text")); @@ -5409,7 +5332,6 @@ T_BeginTest(fold_with_largest_align) T_Ok(str8_match(text, str8_array_fixed(expected_text), 0)); } } -T_EndTest; #endif diff --git a/src/torture/torture_radlink.h b/src/torture/torture_radlink.h index 57cd8b32..fcfd5820 100644 --- a/src/torture/torture_radlink.h +++ b/src/torture/torture_radlink.h @@ -23,9 +23,9 @@ typedef enum //////////////////////////////// #define t_invoke_linker_timeout(c, t) T_Ok(t_invoke(g_linker, c, t)) -#define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(scratch.arena, f, ##__VA_ARGS__), t) +#define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(arena, f, ##__VA_ARGS__), t) #define t_invoke_linker(c) t_invoke_linker_timeout(c, max_U64) -#define t_invoke_linkerf(f, ...) t_invoke_linker(push_str8f(scratch.arena, f, ##__VA_ARGS__)) +#define t_invoke_linkerf(f, ...) t_invoke_linker(push_str8f(arena, f, ##__VA_ARGS__)) internal T_Linker t_id_linker(void); From 1f5bbb970259883291754ad7a78d27e061209b0e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 8 Apr 2026 12:39:15 -0700 Subject: [PATCH 341/850] minor cleanup --- src/torture/torture.h | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/torture/torture.h b/src/torture/torture.h index 44c68d4b..1c8cda0a 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -40,15 +40,11 @@ typedef struct extern U64 g_torture_test_count; extern T_Test g_torture_tests[0xffffff]; -#define T_AddTest(name, l, ...) \ - T_RunSig(name); \ - __VA_ARGS__ void t_add_test_##name(void) \ - { \ - g_torture_tests[g_torture_test_count].group = T_Group; \ - g_torture_tests[g_torture_test_count].label = Stringify(name); \ - g_torture_tests[g_torture_test_count].r = &t_##name; \ - g_torture_tests[g_torture_test_count].decl_line = l; \ - g_torture_test_count += 1; \ +#define T_AddTest(name, l, ...) \ + T_RunSig(name); \ + __VA_ARGS__ void t_add_test_##name(void) \ + { \ + g_torture_tests[g_torture_test_count++] = (T_Test){ .group = T_Group, .label = Stringify(name), .r = &t_##name, .decl_line = l }; \ } #if COMPILER_MSVC @@ -58,8 +54,7 @@ extern T_Test g_torture_tests[0xffffff]; __declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ __pragma(comment(linker, "/include:" Stringify(r_##name))) #else -# define T_BeginTest_(name) \ - T_AddTest(name, __LINE__, __attribute__((constructor))) +# define T_BeginTest_(name) T_AddTest(name, __LINE__, __attribute__((constructor))) #endif #define T_BeginTest(name) \ @@ -67,7 +62,6 @@ extern T_Test g_torture_tests[0xffffff]; T_RunSig(name) #define T_Ok(c) do { if (!(c)) { result_out->fail_file = __FILE__; result_out->fail_line = __LINE__; result_out->fail_cond = Stringify(c); result_out->status = T_RunStatus_Fail; return; } } while(0) -#define T_Fail() T_Ok(!(c)) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) //////////////////////////////// From e9a142b5362a344dd9481ce5a83c9de671bec177 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 8 Apr 2026 13:44:05 -0700 Subject: [PATCH 342/850] fix eval commit rules for strings; do not treat inputs as textual data when committing to pointers unless contents are quoted - fixes inability to change string pointer values --- src/mule/mule_main.cpp | 1 + src/raddbg/raddbg_core.c | 22 ++++++++++++---------- src/raddbg/raddbg_main.c | 19 +++++++++++-------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 17fb4d12..64a47e14 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -431,6 +431,7 @@ type_coverage_eval_tests(void) char data[4]; }; SomeDataStructured *some_data = (SomeDataStructured *)&some_data_with_a_string[0]; + char *string_ptr = &string[0]; const char *const_string = "Hello, World!"; const char const_string_array[] = "Hello, World!"; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 6eda13da..79b925fe 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1237,10 +1237,18 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string) commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key)); } + //- rjf: determine if commit string is quoted + B32 is_quoted = 0; + if(string.size >= 1 && string.str[0] == '"') + { + string = str8_skip(string, 1); + is_quoted = 1; + } + //- rjf: pointer or array to characters/integers? -> try to treat // new value string as textual data if(!got_commit_data && - ((type_kind == E_TypeKind_Ptr || type_kind == E_TypeKind_Array) && + (((is_quoted && type_kind == E_TypeKind_Ptr) || type_kind == E_TypeKind_Array) && (direct_type_kind == E_TypeKind_Char8 || direct_type_kind == E_TypeKind_Char16 || direct_type_kind == E_TypeKind_Char32 || @@ -1250,12 +1258,6 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string) e_type_kind_is_integer(direct_type_kind)))) { got_commit_data = 1; - B32 is_quoted = 0; - if(string.size >= 1 && string.str[0] == '"') - { - string = str8_skip(string, 1); - is_quoted = 1; - } if(string.size >= 1 && string.str[string.size-1] == '"') { string = str8_chop(string, 1); @@ -1306,9 +1308,9 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string) src_eval_value.irtree.mode == E_Mode_Value) { got_commit_data = 1; - commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value)); - commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(src_eval.irtree.type_key)); - commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key)); + commit_data = str8_copy(scratch.arena, str8_struct(&src_eval.value)); + commit_data.size = Max(commit_data.size, e_type_byte_size_from_key(src_eval.irtree.type_key)); + commit_data.size = Max(commit_data.size, e_type_byte_size_from_key(type_key)); } } } diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 2373b425..9d252378 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -5,21 +5,24 @@ //~ rjf: post-0.9.20 TODO notes // //- fabian complaints / reports -// [x] `foo, x` needs to correctly match `hex(foo)`, e.g. in application to expansions // [ ] broadly, need to complete memory view & fix issues // [ ] dumb panel click-through thing // [ ] correct type interpretations; togglable interpretations // [ ] make address editable; specialized version of the cursor address editor in tab right-click menu -// [x] eval: pointer casts of register space should promote to process space // [ ] simplified default layout -// [ ] signify empty watch window "expression" slot more as a text field? -// [ ] ambiguous parsing cases - need to re-introduce identifier resolution into eval parse. (foo *)&bar -// [ ] more control over string visualization; specifically, when *not* to do it, even when using e.g. char *s -// [ ] broadly, view discoverability / docs -// [ ] memory view deserves larger spot, in default layout -// [ ] sign bits should not display on unsigned integers? +// [ ] memory view deserves larger spot, in default layout // [ ] fix for-loop stepping oddities, likely single-line for-loop stepping +// [x] `foo, x` needs to correctly match `hex(foo)`, e.g. in application to expansions +// [x] eval: pointer casts of register space should promote to process space +// [x] more control over string visualization; specifically, when *not* to do it, even when using e.g. char *s +// [x] sign bits should not display on unsigned integers? +// [ ] ambiguous parsing cases - need to re-introduce identifier resolution into eval parse. (foo *)&bar +// [ ] broadly, view discoverability / docs // [ ] source/disasm ctx menu should include options for e.g. "go to selected thread" +// [ ] signify empty watch window "expression" slot more as a text field? +// +//- jeff viz notes +// [ ] single-line viz for pointers w/ bad (unmapped) addresses // //- namespace/locations/variables RDI pass // [ ] RDI_Local, RDI_GlobalVariable, RDI_ThreadVariable -> RDI_Variable From 5bc791566b5102f35225a77866103c94ed1da485 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 8 Apr 2026 13:44:17 -0700 Subject: [PATCH 343/850] go to selected thread in ctx menus --- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 +- src/raddbg/raddbg_main.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 8dd516c8..cd0820e6 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -726,7 +726,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[248] = { str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), CTRL_EntityKind_Null}}, { str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index e8572ed9..c57884fd 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1029,7 +1029,7 @@ RD_CmdTable: // | | | | //- rjf: thread finding {FindThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } - {FindSelectedThread 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "" "" } + {FindSelectedThread 1 1 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "" } //- rjf: name finding {GoToName 1 1 0 0 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "$text_pt," } diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 9d252378..bffd2304 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -16,9 +16,9 @@ // [x] eval: pointer casts of register space should promote to process space // [x] more control over string visualization; specifically, when *not* to do it, even when using e.g. char *s // [x] sign bits should not display on unsigned integers? +// [x] source/disasm ctx menu should include options for e.g. "go to selected thread" // [ ] ambiguous parsing cases - need to re-introduce identifier resolution into eval parse. (foo *)&bar // [ ] broadly, view discoverability / docs -// [ ] source/disasm ctx menu should include options for e.g. "go to selected thread" // [ ] signify empty watch window "expression" slot more as a text field? // //- jeff viz notes From be270a8f8d2d32cc38b1b040ff4e04335f468ba2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 8 Apr 2026 14:42:30 -0700 Subject: [PATCH 344/850] fix step over/into line operations when source line maps to multiple (potentially) discontiguous code ranges, or at least line info records; this fixes weird stepping with Clang-generated line info for for loops, function prologues in Odin, amongst other similar issues --- CHANGELOG.md | 10 +++ src/dbg_engine/dbg_engine_core.c | 115 +++++++++++++++++++++++++++---- 2 files changed, 112 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ff77b5b..97a0fe65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ ## Debugger Changes +- Fixed the debugger incorrectly evaluating pointer casts of registers in + register space, rather than promoting them to process address space + evaluations. This fixes cases where expressions like `(int *)rax` were not + displaying correctly. +- Fixed the debugger incorrectly requiring multiple step operations when source + lines mapped to multiple discontiguous ranges of instructions. This most + notably showed up with certain styles of `for`-loops, especially with Clang + and other non-C/C++ languages, and function prologues in non-C/C++ languages. +- Fixed the debugger treating the `foo, x` fastpath for `hex(foo)` differently + than `hex(foo)`, in that the hexadecimal setting was not being inherited. - Fixed the debugger leaking debug info conversion process handles. This addresses cases where the debugger was preventing stale debug info from being updated, after a rebuild. diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index b7a81a13..8baa5c00 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -345,7 +345,9 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr); log_infof("dbgi_key: {0x%I64x, 0x%I64x}\n", dbgi_key.u64[0], dbgi_key.u64[1]); - // rjf: ip => line vaddr range + // rjf: ip => line info + String8 file_path = {0}; + S64 line_num = 0; Rng1U64 line_vaddr_rng = {0}; { U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); @@ -354,6 +356,8 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) if(lines.first != 0) { line_voff_rng = lines.first->v.voff_range; + file_path = lines.first->v.file_path; + line_num = lines.first->v.pt.line; line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); } @@ -361,6 +365,18 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) log_infof("vaddr_range: {0x%I64x, 0x%I64x}\n", line_vaddr_rng.min, line_vaddr_rng.max); } + // rjf: gather other ranges on this same textual line, which we don't want to return to + Rng1U64List all_vaddr_ranges_on_same_line = {0}; + { + D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num); + for EachNode(n, D_LineNode, lines.first) + { + Rng1U64 voff_range = n->v.voff_range; + Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); + rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); + } + } + // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range // // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging @@ -446,6 +462,16 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) add = 0; } + // rjf: omit if this jump stays inside of any range on this same textual line + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(contains_1u64(n->v, point->jump_dest_vaddr)) + { + add = 0; + break; + } + } + // rjf: trap @ destination, if we can - we can avoid a single-step this way. if(point->jump_dest_vaddr != 0) { @@ -475,11 +501,28 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) } } - // rjf: push trap for natural linear flow + // rjf: push traps for natural linear flow if(good_line_info && good_machine_code) { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, line_vaddr_rng.max}; - ctrl_trap_list_push(arena, &result.traps, &trap); + U64 line_opl_vaddr = line_vaddr_rng.max; + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + U64 opl = n->v.max; + B32 opl_in_line = 0; + for EachNode(n2, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(n != n2 && opl == n2->v.min) + { + opl_in_line = 1; + break; + } + } + if(!opl_in_line) + { + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, opl}; + ctrl_trap_list_push(arena, &result.traps, &trap); + } + } } // rjf: store goodness @@ -513,7 +556,9 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - // rjf: ip => line vaddr range + // rjf: ip => line info + String8 file_path = {0}; + S64 line_num = 0; Rng1U64 line_vaddr_rng = {0}; { U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); @@ -522,7 +567,24 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) if(lines.first != 0) { line_voff_rng = lines.first->v.voff_range; + file_path = lines.first->v.file_path; + line_num = lines.first->v.pt.line; line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); + log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); + } + log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); + log_infof("vaddr_range: {0x%I64x, 0x%I64x}\n", line_vaddr_rng.min, line_vaddr_rng.max); + } + + // rjf: gather other ranges on this same textual line, which we don't want to return to + Rng1U64List all_vaddr_ranges_on_same_line = {0}; + { + D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num); + for EachNode(n, D_LineNode, lines.first) + { + Rng1U64 voff_range = n->v.voff_range; + Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); + rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); } } @@ -616,6 +678,16 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) add = 0; } + // rjf: omit if this jump stays inside of any range on this same textual line + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(contains_1u64(n->v, point->jump_dest_vaddr)) + { + add = 0; + break; + } + } + // rjf: trap @ destination, if we can - we can avoid a single-step this way. if(point->jump_dest_vaddr != 0) { @@ -638,11 +710,28 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) } } - // rjf: push trap for natural linear flow + // rjf: push traps for natural linear flow if(good_line_info && good_machine_code) { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, line_vaddr_rng.max}; - ctrl_trap_list_push(arena, &result.traps, &trap); + U64 line_opl_vaddr = line_vaddr_rng.max; + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + U64 opl = n->v.max; + B32 opl_in_line = 0; + for EachNode(n2, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(n != n2 && opl == n2->v.min) + { + opl_in_line = 1; + break; + } + } + if(!opl_in_line) + { + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, opl}; + ctrl_trap_list_push(arena, &result.traps, &trap); + } + } } // rjf: store goodness @@ -987,11 +1076,11 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 if(!d_ctrl_targets_running()) { Temp scratch = scratch_begin(0, 0); - + //- rjf: unpack module info CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); U64 addr_size = byte_size_from_arch(process->arch); - + switch(process->tls_model) { case CTRL_TlsModel_Null: {}break; @@ -1006,7 +1095,7 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 { U64 tls_array_vaddr = 0; MemoryCopyStr8(&tls_array_vaddr, tls_array_vaddr_data); - + // read thread local storage pointer (array of TLS pointers, one per module) U64 tls_ptr_vaddr = tls_array_vaddr + module->tls_index * addr_size; CTRL_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); @@ -1031,7 +1120,7 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 { U64 dtv_pointer = 0; MemoryCopyStr8(&dtv_pointer, dtv_pointer_data); - + // verify that TLS block was allocated U64 tls_dtv_unallocated = addr_size == 4 ? max_U32 : max_U64; if(dtv_pointer != tls_dtv_unallocated) @@ -1043,7 +1132,7 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 }break; default: {InvalidPath;}break; } - + scratch_end(scratch); } ProfEnd(); From 9aa63bc86cce3a35019cd6e48ef26bdaa20339f2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 9 Apr 2026 11:07:00 -0700 Subject: [PATCH 345/850] checkpoint on memory view improvements; bugfixes, improved visualizations, & mutation controls --- CHANGELOG.md | 2 +- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 4 +- src/raddbg/raddbg_main.c | 2 +- src/raddbg/raddbg_views.c | 170 ++++++++++++++++++++++++----- 5 files changed, 147 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97a0fe65..cb74ef70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ - Fixed the debugger incorrectly evaluating pointer casts of registers in register space, rather than promoting them to process address space evaluations. This fixes cases where expressions like `(int *)rax` were not - displaying correctly. + evaluating correctly. - Fixed the debugger incorrectly requiring multiple step operations when source lines mapped to multiple discontiguous ranges of instructions. This most notably showed up with certain styles of `for`-loops, especially with Clang diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index cd0820e6..964762f0 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -435,7 +435,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[26] = {str8_lit_comp("list"), str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, {str8_lit_comp("text"), str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, {str8_lit_comp("disasm"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n 'arch': code_string,\n 'syntax': code_string,\n 'size': expr_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n\n}\n")}, -{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n}\n")}, +{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(0) @display_name(\"Edit Mode\") @description(\"Enables editing operations on memory contents.\")\n 'edit_mode': bool,\n}\n")}, {str8_lit_comp("bitmap"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, {str8_lit_comp("color"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, {str8_lit_comp("geo3d"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index c57884fd..052c445e 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -546,12 +546,14 @@ RD_VocabTable: 'size': expr_string, @display_name("Cursor Address") @description("The address of the cursor.") 'cursor': expr_string, - @display_name("Cursor Size") @description("The size, in bytes, of the cursor.") + @default(1) @display_name("Cursor Size") @description("The size, in bytes, of the cursor.") 'cursor_size': @range[1, 16] u64, @default(16) @description("The number of columns to build before building new rows.") 'num_columns': @range[1, 64] u64, @default(1) @display_name("Track Mark To Cursor") @description("Ensures that the mark always follows the cursor, if the cursor value is updated.") 'track_mark_to_cursor': bool, + @default(0) @display_name("Edit Mode") @description("Enables editing operations on memory contents.") + 'edit_mode': bool, } ``` } diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index bffd2304..f857a0e9 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -11,7 +11,7 @@ // [ ] make address editable; specialized version of the cursor address editor in tab right-click menu // [ ] simplified default layout // [ ] memory view deserves larger spot, in default layout -// [ ] fix for-loop stepping oddities, likely single-line for-loop stepping +// [x] fix for-loop stepping oddities, likely single-line for-loop stepping // [x] `foo, x` needs to correctly match `hex(foo)`, e.g. in application to expansions // [x] eval: pointer casts of register space should promote to process space // [x] more control over string visualization; specifically, when *not* to do it, even when using e.g. char *s diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 6b8de17a..26fbd91b 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2637,6 +2637,8 @@ struct RD_MemoryViewState B32 center_cursor; B32 contain_cursor; B32 snap_scroll; + B32 cell_value_edit_in_progress; + U8 cell_value_edit_first_digit; }; EV_EXPAND_RULE_INFO_FUNCTION_DEF(memory) @@ -2652,6 +2654,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); RD_MemoryViewState *mv = rd_view_state(RD_MemoryViewState); + B32 edit_mode = rd_view_setting_b32_from_name(str8_lit("edit_mode")); ////////////////////////////// //- rjf: if memory views are parameterized by a register-space evaluation, @@ -2821,16 +2824,83 @@ RD_VIEW_UI_FUNCTION_DEF(memory) U64 next_mark_base_vaddr = mark_base_vaddr; for(UI_Event *evt = 0; ui_next_event(&evt);) { + B32 good_action = 0; Vec2S64 cell_delta = {0}; - switch(evt->delta_unit) + B32 allow_cell_movement = 1; + + // rjf: edit mode toggling + if(evt->slot == UI_EventActionSlot_Edit) + { + rd_store_view_param_s64(str8_lit("edit_mode"), !edit_mode); + edit_mode ^= 1; + good_action = 1; + } + + // rjf: cell-granularity deletions + if(edit_mode && !mv->cell_value_edit_in_progress && evt->flags & UI_EventFlag_Delete) + { + Rng1U64 range = union_1u64(r1u64(cursor_base_vaddr, cursor_base_vaddr+cursor_size), + r1u64(mark_base_vaddr, mark_base_vaddr+cursor_size)); + U8 *data = push_array(scratch.arena, U8, dim_1u64(range)); + if(!e_space_write(eval.space, data, range)) + { + log_user_errorf("Could not successfully write to memory."); + } + good_action = 1; + } + + // rjf: in-progress cell value edit deletions -> delete existing cell half-byte + if(edit_mode && mv->cell_value_edit_in_progress && evt->flags & UI_EventFlag_Delete) + { + mv->cell_value_edit_in_progress = 0; + allow_cell_movement = 0; + good_action = 1; + } + + // rjf: byte digit -> cell value insertion. if first digit, store, if 2nd, commit + if(edit_mode && evt->string.size != 0 && evt->kind == UI_EventKind_Text) + { + good_action = 1; + if(!mv->cell_value_edit_in_progress) + { + mv->cell_value_edit_in_progress = 1; + mv->cell_value_edit_first_digit = evt->string.str[0]; + } + else + { + U8 digits[] = {mv->cell_value_edit_first_digit, evt->string.str[0]}; + String8 byte_string = str8(digits, 2); + U8 byte_value = (U8)u64_from_str8(byte_string, 16); + if(!e_space_write(eval.space, &byte_value, r1u64(cursor_base_vaddr, cursor_base_vaddr+1))) + { + log_user_errorf("Could not successfully write to memory."); + } + cell_delta.x = 1; + mv->cell_value_edit_in_progress = 0; + } + } + + // rjf: determine cell movement delta from cell-granularity operations + if(allow_cell_movement) switch(evt->delta_unit) { default:{}break; case UI_EventDeltaUnit_Char: { - cell_delta.x = (S64)evt->delta_2s32.x; + cell_delta.x = (S64)evt->delta_2s32.x * cursor_size; cell_delta.y = (S64)evt->delta_2s32.y; }break; case UI_EventDeltaUnit_Word: + { + if(evt->delta_2s32.x < 0) + { + cell_delta.x = -cursor_size; + } + else if(evt->delta_2s32.x > 0) + { + cell_delta.x = +cursor_size; + } + }break; + case UI_EventDeltaUnit_Line: case UI_EventDeltaUnit_Page: { if(evt->delta_2s32.x < 0) @@ -2851,37 +2921,48 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } }break; } - B32 good_action = 0; - if(evt->delta_2s32.x != 0 || evt->delta_2s32.y != 0) + + // rjf: apply movements { - good_action = 1; - } - if(good_action && evt->flags & UI_EventFlag_ZeroDeltaOnSelect && cursor_base_vaddr != mark_base_vaddr) - { - MemoryZeroStruct(&cell_delta); - } - if(good_action) - { - cell_delta.x = ClampBot(cell_delta.x, (S64)-next_cursor_base_vaddr); - cell_delta.y = ClampBot(cell_delta.y, (S64)-(next_cursor_base_vaddr/num_columns)); - next_cursor_base_vaddr += cell_delta.x; - next_cursor_base_vaddr += cell_delta.y*num_columns; - } - if(good_action && evt->flags & UI_EventFlag_PickSelectSide && cursor_base_vaddr != mark_base_vaddr) - { - if(evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) + if(evt->delta_2s32.x != 0 || evt->delta_2s32.y != 0) { - next_cursor_base_vaddr = Min(cursor_base_vaddr, mark_base_vaddr); + good_action = 1; } - else + if(good_action && evt->flags & UI_EventFlag_ZeroDeltaOnSelect && cursor_base_vaddr != mark_base_vaddr) { - next_cursor_base_vaddr = Max(cursor_base_vaddr, mark_base_vaddr); + MemoryZeroStruct(&cell_delta); + } + if(good_action) + { + cell_delta.x = ClampBot(cell_delta.x, (S64)-next_cursor_base_vaddr); + cell_delta.y = ClampBot(cell_delta.y, (S64)-(next_cursor_base_vaddr/num_columns)); + next_cursor_base_vaddr += cell_delta.x; + next_cursor_base_vaddr += cell_delta.y*num_columns; + } + if(good_action && evt->flags & UI_EventFlag_PickSelectSide && cursor_base_vaddr != mark_base_vaddr) + { + if(evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) + { + next_cursor_base_vaddr = Min(cursor_base_vaddr, mark_base_vaddr); + } + else + { + next_cursor_base_vaddr = Max(cursor_base_vaddr, mark_base_vaddr); + } + } + if(good_action && !(evt->flags & UI_EventFlag_KeepMark)) + { + next_mark_base_vaddr = next_cursor_base_vaddr; } } - if(good_action && !(evt->flags & UI_EventFlag_KeepMark)) + + // rjf: abort cell editing on address changes + if(next_cursor_base_vaddr != cursor_base_vaddr) { - next_mark_base_vaddr = next_cursor_base_vaddr; + mv->cell_value_edit_in_progress = 0; } + + // rjf: take event if(good_action) { need_update = 1; @@ -2999,12 +3080,19 @@ RD_VIEW_UI_FUNCTION_DEF(memory) // DR_FStrList byte_fstrs[256] = {0}; DR_FStrList byte_fstrs_selected[256] = {0}; + DR_FStrList byte_fstrs_changed[256] = {0}; { Vec4F32 selected_color = ui_color_from_name(str8_lit("text")); + if(edit_mode) UI_TagF("bad") + { + selected_color = ui_color_from_name(str8_lit("text")); + } Vec4F32 full_color = {0}; UI_TagF("neutral") full_color = ui_color_from_name(str8_lit("text")); Vec4F32 zero_color = full_color; UI_TagF("weak") zero_color = ui_color_from_name(str8_lit("text")); + Vec4F32 changed_color = full_color; + UI_TagF("neutral") changed_color = ui_color_from_name(str8_lit("text")); for(U64 idx = 0; idx < ArrayCount(byte_fstrs); idx += 1) { U8 byte = (U8)idx; @@ -3022,6 +3110,10 @@ RD_VIEW_UI_FUNCTION_DEF(memory) DR_FStr fstr = {push_str8f(scratch.arena, "%02x", byte), {font, font_raster_flags, selected_color, font_size, 0, 0}}; dr_fstrs_push(scratch.arena, &byte_fstrs_selected[idx], &fstr); } + { + DR_FStr fstr = {push_str8f(scratch.arena, "%02x", byte), {font, font_raster_flags, changed_color, font_size, 0, 0}}; + dr_fstrs_push(scratch.arena, &byte_fstrs_changed[idx], &fstr); + } } } @@ -3387,7 +3479,8 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_BoxFlag_DrawBackground| UI_BoxFlag_DrawDropShadow| UI_BoxFlag_DrawBackgroundBlur| - UI_BoxFlag_Floating, "table_header"); + UI_BoxFlag_Floating| + UI_BoxFlag_Clickable, "table_header"); UI_Parent(header_box) RD_Font(RD_FontSlot_Code) UI_FontSize(font_size) @@ -3406,6 +3499,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); UI_WidthFill ui_labelf("ASCII"); } + ui_signal_from_box(header_box); } ////////////////////////////// @@ -3418,7 +3512,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ui_set_next_fixed_y(footer_rect.y0); ui_set_next_fixed_width(dim_2f32(footer_rect).x); ui_set_next_fixed_height(dim_2f32(footer_rect).y); - footer_box = ui_build_box_from_stringf(UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawDropShadow, "footer"); + footer_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawDropShadow, "footer"); UI_Parent(footer_box) RD_Font(RD_FontSlot_Code) { UI_PrefWidth(ui_em(7.5f, 1.f)) UI_HeightFill UI_Column UI_TagF("weak") @@ -3450,6 +3544,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } } + ui_signal_from_box(footer_box); } ////////////////////////////// @@ -3629,6 +3724,10 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_BoxFlags cell_flags = 0; Vec4F32 cell_bg_rgba = {0}; Vec4F32 cell_bd_rgba = ui_color_from_name(str8_lit("text")); + if(edit_mode) UI_TagF("bad") + { + cell_bd_rgba = ui_color_from_name(str8_lit("text")); + } if(global_byte_num == mouse_hover_byte_num) { cell_flags |= UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawDropShadow; @@ -3676,10 +3775,23 @@ RD_VIEW_UI_FUNCTION_DEF(memory) if(cell_bd_rgba.w != 0) { ui_set_next_border_color(cell_bd_rgba); } if(cell_bg_rgba.w != 0) { ui_set_next_background_color(cell_bg_rgba); } UI_Box *cell_box = ui_build_box_from_key(UI_BoxFlag_DrawText|cell_flags, ui_key_zero()); - if(byte_is_selected || byte_is_changed) + if(global_byte_idx == cursor_base_vaddr && mv->cell_value_edit_in_progress) + { + Vec4F32 color = {0}; + UI_TagF("bad") color = ui_color_from_name(str8_lit("text")); + DR_FStrList fstrs = {0}; + DR_FStr fstr = {str8f(scratch.arena, "%c", mv->cell_value_edit_first_digit), {font, font_raster_flags, color, font_size, 0, 0}}; + dr_fstrs_push(scratch.arena, &fstrs, &fstr); + ui_box_equip_display_fstrs(cell_box, &fstrs); + } + else if(byte_is_selected) { ui_box_equip_display_fstrs(cell_box, &byte_fstrs_selected[byte_value]); } + else if(byte_is_changed) + { + ui_box_equip_display_fstrs(cell_box, &byte_fstrs_changed[byte_value]); + } else { ui_box_equip_display_fstrs(cell_box, &byte_fstrs[byte_value]); @@ -3748,7 +3860,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); - UI_WidthFill + UI_WidthFill UI_TextPadding(0) { MemoryZero(row_ascii_buffer, num_columns); U64 num_bytes_this_row = 0; From 5f5120144bc53142409a306bd5f257cba3f7291f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 9 Apr 2026 12:08:35 -0700 Subject: [PATCH 346/850] memory copy/paste --- src/raddbg/raddbg_core.c | 1 + src/raddbg/raddbg_views.c | 68 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 79b925fe..6640c9b1 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -16004,6 +16004,7 @@ rd_frame(void) RD_WindowState *ws = rd_window_state_from_cfg(window); UI_Event evt = zero_struct; evt.kind = UI_EventKind_Text; + evt.flags = UI_EventFlag_Paste; evt.string = os_get_clipboard_text(scratch.arena); ui_event_list_push(scratch.arena, &ws->ui_events, &evt); }break; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 26fbd91b..f55e02d8 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2836,6 +2836,72 @@ RD_VIEW_UI_FUNCTION_DEF(memory) good_action = 1; } + // rjf: copies + if(evt->flags & UI_EventFlag_Copy) + { + Rng1U64 range = union_1u64(r1u64(cursor_base_vaddr, cursor_base_vaddr+cursor_size), + r1u64(mark_base_vaddr, mark_base_vaddr+cursor_size)); + range.max = Min(range.max, range.min+MB(1)); + String8 data = {0}; + data.size = dim_1u64(range); + data.str = push_array(scratch.arena, U8, data.size); + if(!e_space_read(eval.space, data.str, range)) + { + log_user_errorf("Could not successfully read memory."); + } + else + { + String8List data_textified_parts = {0}; + U64 column_num = 1 + (range.min - view_range.min) % num_columns; + for EachIndex(idx, data.size) + { + str8_list_pushf(scratch.arena, &data_textified_parts, "%02x%s", (U8)data.str[idx], + idx+1 >= data.size ? "" : + column_num+1 <= num_columns ? " " : + "\n"); + column_num += 1; + if(column_num > num_columns) + { + column_num = 1; + } + } + String8 data_textified = str8_list_join(scratch.arena, &data_textified_parts, 0); + os_set_clipboard_text(data_textified); + } + good_action = 1; + } + + // rjf: pastes + if(edit_mode && evt->flags & UI_EventFlag_Paste) + { + String8 data_textified = evt->string; + U8 split_chars[] = {' ', '\n', '\r'}; + String8List byte_pieces = str8_split(scratch.arena, data_textified, split_chars, ArrayCount(split_chars), 0); + String8 data = {0}; + data.size = Min(byte_pieces.node_count, MB(1)); + data.str = push_array(scratch.arena, U8, data.size); + Rng1U64 range = union_1u64(r1u64(cursor_base_vaddr, cursor_base_vaddr+cursor_size), + r1u64(mark_base_vaddr, mark_base_vaddr+cursor_size)); + U64 byte_idx = 0; + for EachNode(n, String8Node, byte_pieces.first) + { + if(byte_idx > data.size) + { + break; + } + String8 byte_textified = n->string; + U8 byte_value = (U8)u64_from_str8(byte_textified, 16); + data.str[byte_idx] = byte_value; + byte_idx += 1; + } + if(!e_space_write(eval.space, data.str, r1u64(range.min, range.min + data.size))) + { + log_user_errorf("Could not successfully write to memory."); + } + good_action = 1; + cell_delta.x = data.size; + } + // rjf: cell-granularity deletions if(edit_mode && !mv->cell_value_edit_in_progress && evt->flags & UI_EventFlag_Delete) { @@ -2858,7 +2924,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } // rjf: byte digit -> cell value insertion. if first digit, store, if 2nd, commit - if(edit_mode && evt->string.size != 0 && evt->kind == UI_EventKind_Text) + if(edit_mode && evt->string.size != 0 && evt->kind == UI_EventKind_Text && !(evt->flags & UI_EventFlag_Paste)) { good_action = 1; if(!mv->cell_value_edit_in_progress) From 85bbfa755a1c462e5c59f31a6d0b7ad2a06978c5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 9 Apr 2026 10:14:52 -0700 Subject: [PATCH 347/850] port pdb -> rdi determinism test --- .github/workflows/builds.yml | 13 +++- build.bat | 5 +- src/radbin/radbin.c | 7 +- src/torture/torture.c | 67 ++++++++++++++++-- src/torture/torture.h | 6 +- src/torture/torture_main.c | 1 + src/torture/torture_p2r.c | 123 ++++++++++++++++++++++++++++++++++ src/torture/torture_radlink.c | 9 +-- 8 files changed, 215 insertions(+), 16 deletions(-) create mode 100644 src/torture/torture_p2r.c diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 8465c29d..3f26623a 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -53,8 +53,19 @@ jobs: - name: run-torture shell: cmd run: | + rem find path to clang + for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build asan meta torture radlink radbin "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 + + rem set clang path before MSVC's clang path + set PATH=%clang_path%;%PATH% + + rem parse out clang version number out of --version to build path to the folder with ASAN DLL + for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v + if "${{matrix.compiler}}" == "clang" set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;%PATH% + + call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 cd build torture || exit /b 1 diff --git a/build.bat b/build.bat index 002d4370..f4d482a6 100644 --- a/build.bat +++ b/build.bat @@ -82,7 +82,6 @@ set clang_out= -o set clang_linker= -Xlinker :: --- Per-Build Settings ----------------------------------------------------- -set link_dll=-DLL set link_icon=logo.res if "%msvc%"=="1" set linker=%cl_linker% if "%clang%"=="1" set linker=%clang_linker% @@ -94,6 +93,8 @@ if "%msvc%"=="1" set no_aslr=/DYNAMICBASE:NO if "%clang%"=="1" set no_aslr=-Wl,/DYNAMICBASE:NO if "%msvc%"=="1" set rc=call rc if "%clang%"=="1" set rc=call llvm-rc +if "%msvc%"=="1" set link_dll=/link /DLL +if "%clang%"=="1" set link_dll=-Xlinker -DLL :: --- Choose Compile/Link Lines ---------------------------------------------- if "%msvc%"=="1" set compile_debug=%cl_debug% @@ -147,7 +148,7 @@ if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratc if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% %out%parse_inline_sites.exe || exit /b 1 if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_lib_debug\strip_lib_debug.c %compile_link% %out%strip_lib_debug.exe || exit /b 1 if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp %out%mule_inline.obj && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp %out%mule_o2.obj && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 -if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %compile_link% %link_dll% %out%mule_module.dll || exit /b 1 +if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %link_dll% %out%mule_module.dll || exit /b 1 if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% %out%torture.exe || exit /b1 if "%dwarf_expr_test%"=="1" set didbuild=1 && %compile% ..\src\torture\dwarf_expr_test.c %compile_link% %out%dwarf_expr_test.exe || exit /b1 diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 3df719c1..9918af6e 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1253,13 +1253,16 @@ rb_thread_entry_point(void *p) } } - //- rjf: dump input files in order + //- rjf: dump input files in ordere for(RB_FileNode *n = input_files.first; n != 0; n = n->next) { RB_File *f = n->v; if(lane_idx() == 0) { - str8_list_pushf(arena, &output_blobs, "// %S (%S)\n\n", deterministic ? str8_skip_last_slash(f->path) : f->path, f->format ? rb_file_format_display_name_table[f->format] : str8_lit("Unsupported format")); + if(!deterministic) + { + str8_list_pushf(arena, &output_blobs, "// %S (%S)\n\n", f->path, f->format ? rb_file_format_display_name_table[f->format] : str8_lit("Unsupported format")); + } } lane_sync(); diff --git a/src/torture/torture.c b/src/torture/torture.c index 31ce4f0a..702caa4f 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -9,6 +9,7 @@ global B32 g_verbose; global B32 g_redirect_stdout = 1; global B32 g_stop_on_first_fail_or_crash = 1; global String8 g_linker; +global String8 g_test_data; // tests U64 g_torture_test_count; @@ -76,13 +77,28 @@ t_make_file_path(Arena *arena, String8 name) return push_str8f(arena, "%S\\%S", g_wdir, name); } +internal B32 +t_make_dir(String8 name) +{ + Temp scratch = scratch_begin(0,0); + B32 is_ok = os_make_directory(t_make_file_path(scratch.arena, name)); + scratch_end(scratch); + return is_ok; +} + internal void t_run_caller(void *raw_ctx) { Temp scratch = scratch_begin(0,0); T_RunCtx *ctx = raw_ctx; + String8List test_out = {0}; ctx->result.status = T_RunStatus_Pass; - ctx->run(scratch.arena, &ctx->result); + ctx->run(scratch.arena, &ctx->result, &test_out); + if (ctx->result.status == T_RunStatus_Fail) { + for EachNode(n, String8Node, test_out.first) { + fprintf(stderr, "%.*s", str8_varg(n->string)); + } + } scratch_end(scratch); } @@ -131,7 +147,9 @@ t_cl_path(void) ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); #if OS_WINDOWS - path = str8_lit("cl.exe"); + wchar_t full_cl_path[MAX_PATH]; + DWORD full_cl_path_size = SearchPathW(0, L"cl.exe", 0, ArrayCount(full_cl_path), full_cl_path, 0); + path = str8_from_16(arena, str16((U16*)full_cl_path, full_cl_path_size)); #else path = str8_lit("cl"); #endif @@ -159,14 +177,14 @@ t_radlink_path(void) } internal String8 -t_src_path(void) +t_cwd_path(void) { local_persist U8 path[4096] = {0}; if (path[0] == 0) { Temp scratch = scratch_begin(0, 0); String8 cwd = os_get_current_path(scratch.arena); cwd = str8_chop_last_slash(cwd); - cwd = str8f(scratch.arena, "%S/src", cwd); + cwd = str8f(scratch.arena, "%S", cwd); MemoryCopyStr8(path, cwd); path[cwd.size] = 0; scratch_end(scratch); @@ -174,8 +192,22 @@ t_src_path(void) return str8_cstring_capped(path, path+sizeof(path)); } +internal String8 +t_src_path(void) +{ + local_persist U8 path[4096] = {0}; + if (path[0] == 0) { + Temp scratch = scratch_begin(0, 0); + String8 src = str8f(scratch.arena, "%S/src", t_cwd_path()); + MemoryCopyStr8(path, src); + path[src.size] = 0; + scratch_end(scratch); + } + return str8_cstring_capped(path, path+sizeof(path)); +} + internal B32 -t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, String8 *output_out) +t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout, Arena *output_arena, String8 *output_out) { Temp scratch = scratch_begin(&output_arena,1); @@ -200,6 +232,7 @@ t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, S OS_ProcessLaunchParams launch_opts = { .path = g_wdir, .inherit_env = 1, + .env = env, .stdout_file = write_pipe_handle, .stderr_file = write_pipe_handle, .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), @@ -252,6 +285,12 @@ t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, S return is_ok; } +internal B32 +t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, String8 *output_out) +{ + return t_invoke_env(exe_path, cmdline, (String8List){0}, timeout, output_arena, output_out); +} + internal B32 t_invoke(String8 exe_path, String8 cmdline, U64 timeout) { @@ -368,6 +407,17 @@ t_entry_point(CmdLine *cmdline) } } + // + // Handle -test_data + // + { + g_test_data = cmd_line_string(cmdline, str8_lit("test_data")); + if (g_test_data.size == 0) { + g_test_data = str8f(scratch.arena, "%S/build", t_cwd_path()); + //fprintf(stderr, "WARNING: The test data folder path was not specified. Specify the path when running the program, assuming: %.*s --test_data:%.*s\n", str8_varg(cmdline->exe_name), str8_varg(g_test_data)); + } + } + // // Handle optional -target // @@ -390,6 +440,13 @@ t_entry_point(CmdLine *cmdline) g_redirect_stdout = !cmd_line_has_flag(cmdline, str8_lit("print_stdout")); g_stop_on_first_fail_or_crash = !cmd_line_has_flag(cmdline, str8_lit("keep_going")); + // default options when running under debugger +#if OS_WINDOWS + if (!cmd_line_has_flag(cmdline, str8_lit("print_stdout")) && IsDebuggerPresent()) { + g_redirect_stdout = 0; + } +#endif + // Handle -out { CmdLineOpt *out_opt = cmd_line_opt_from_string(cmdline, str8_lit("out")); diff --git a/src/torture/torture.h b/src/torture/torture.h index 1c8cda0a..161f1024 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -20,8 +20,8 @@ typedef struct char *fail_cond; } T_RunResult; -#define T_RunSig(name) void t_##name(Arena *arena, T_RunResult *result_out) -typedef void (*T_Run)(Arena *arena, T_RunResult *result_out); +#define T_RunSig(name) void t_##name(Arena *arena, T_RunResult *result_out, String8List *test_out) +typedef void (*T_Run)(Arena *arena, T_RunResult *result_out, String8List *test_out); typedef struct { @@ -63,6 +63,7 @@ extern T_Test g_torture_tests[0xffffff]; #define T_Ok(c) do { if (!(c)) { result_out->fail_file = __FILE__; result_out->fail_line = __LINE__; result_out->fail_cond = Stringify(c); result_out->status = T_RunStatus_Fail; return; } } while(0) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) +#define t_outf(...) str8_list_pushf(arena, test_out, ## __VA_ARGS__) //////////////////////////////// @@ -81,6 +82,7 @@ internal T_RunResult t_run(T_Run run); internal String8 t_radbin_path(void); internal String8 t_cl_path(void); internal String8 t_radlink_path(void); +internal String8 t_cwd_path(void); internal String8 t_src_path(void); internal B32 t_invoke(String8 exe, String8 cmdline, U64 timeout); diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 8c8f6eca..760b1bb9 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -80,6 +80,7 @@ #include "torture_radlink.c" #include "torture_dwarf.c" #include "torture_d2r.c" +#include "torture_p2r.c" //////////////////////////////// diff --git a/src/torture/torture_p2r.c b/src/torture/torture_p2r.c new file mode 100644 index 00000000..7b478705 --- /dev/null +++ b/src/torture/torture_p2r.c @@ -0,0 +1,123 @@ +#define T_Group "p2r" + +#if OS_WINDOWS +T_BeginTest(p2r_determ) +{ + U64 num_repeats_per_pdb = 32; + String8 pdb_paths[] = + { + push_str8f(arena, "%S/mule_main.pdb", g_test_data), + push_str8f(arena, "%S/mule_module.pdb", g_test_data), + }; + for EachElement(pdb_idx, pdb_paths) + { + // rjf: unpack paths, make output directory + String8 pdb_path = path_normalized_from_string(arena, pdb_paths[pdb_idx]); + + // rjf: generate all RDIs + String8List rdi_paths = {0}; + String8List dump_paths = {0}; + { + OS_HandleList processes = {0}; + for EachIndex(repeat_idx, num_repeats_per_pdb) + { + String8 rdi_name = push_str8f(arena, "repeat_%I64u.rdi", repeat_idx); + String8 rdi_path = t_make_file_path(arena, rdi_name); + str8_list_push(arena, &rdi_paths, rdi_path); + String8 cmdl = str8f(arena, "radbin -rdi -deterministic %S -out:%S", pdb_path, rdi_path); + OS_Handle process_handle = os_cmd_line_launch(cmdl); + T_Ok(!os_handle_match(os_handle_zero(), process_handle)); + os_handle_list_push(arena, &processes, process_handle); + } + + // wait on the converters + for EachNode(n, OS_HandleNode, processes.first) { os_process_join(n->v, max_U64, 0); } + } + + // rjf: generate all dumps + { + OS_HandleList processes = {0}; + for EachNode(n, String8Node, rdi_paths.first) + { + String8 rdi_path = n->string; + String8 dump_path = push_str8f(arena, "%S.dump", rdi_path); + str8_list_push(arena, &dump_paths, dump_path); + OS_Handle process_handle = os_cmd_line_launchf("radbin -dump -deterministic %S -out:%S", rdi_path, dump_path); + T_Ok(!os_handle_match(os_handle_zero(), process_handle)); + os_handle_list_push(arena, &processes, process_handle); + } + for EachNode(n, OS_HandleNode, processes.first) { os_process_join(n->v, max_U64, 0); } + } + + // rjf: gather all hashes/paths + U64 rdi_hashes_count = rdi_paths.node_count; + U128 *rdi_hashes = push_array(arena, U128, rdi_hashes_count); + String8 *rdi_paths_array = push_array(arena, String8, rdi_hashes_count); + U64 dump_hashes_count = dump_paths.node_count; + U128 *dump_hashes = push_array(arena, U128, dump_hashes_count); + String8 *dump_paths_array = push_array(arena, String8, dump_hashes_count); + { + U64 idx = 0; + for EachNode(n, String8Node, rdi_paths.first) + { + Temp scratch = scratch_begin(0, 0); + String8 rdi_path = n->string; + String8 path = rdi_path; + T_Ok(path.size); + String8 data = os_data_from_file_path(scratch.arena, path); + T_Ok(data.size); + rdi_hashes [idx] = u128_hash_from_str8(data); + rdi_paths_array[idx] = path; + scratch_end(scratch); + idx += 1; + } + } + { + U64 idx = 0; + for EachNode(n, String8Node, dump_paths.first) + { + Temp scratch = scratch_begin(0, 0); + String8 path = n->string; + T_Ok(path.size); + String8 data = os_data_from_file_path(scratch.arena, path); + T_Ok(data.size); + dump_hashes [idx] = u128_hash_from_str8(data); + dump_paths_array[idx] = path; + scratch_end(scratch); + idx += 1; + } + } + + // rjf: determine if all hashes match + U64 mismatch_idx = max_U64; + for EachIndex(idx, rdi_hashes_count) + { + if(!u128_match(rdi_hashes[idx], rdi_hashes[0])) + { + mismatch_idx = idx; + break; + } + } + for EachIndex(idx, dump_hashes_count) + { + if(!u128_match(dump_hashes[idx], dump_hashes[0])) + { + mismatch_idx = idx; + break; + } + } + + // rjf: output bad case info + if (mismatch_idx != max_U64) { + U64 idx = mismatch_idx; + t_outf(" pdb[%I64u] \"%S\"\n", idx, pdb_path); + t_outf(" rdi[%I64u] 0x%I64x:%I64x \"%S\"\n", idx, rdi_hashes[idx].u64[0], rdi_hashes[idx].u64[1], rdi_paths_array[idx]); + t_outf(" dump[%I64u] 0x%I64x:%I64x \"%S\"\n", idx, dump_hashes[idx].u64[0], dump_hashes[idx].u64[1], dump_paths_array[idx]); + T_Ok(0); + } + } +} +#endif + +#undef T_Group + diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 404aa8d9..69936fef 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4773,10 +4773,11 @@ t_radlink_validate_asan_out(String8 obj_name) String8 exe_path = t_make_file_path(scratch.arena, str8f(scratch.arena, "%S.exe", str8_chop_last_dot(obj_name))); String8 out = {0}; - t_invoke_(exe_path, str8_zero(), max_U64, scratch.arena, &out); - if (g_last_exit_code == 0) { - goto exit; - } + + char *old_path_cstr = getenv("PATH"); + String8List env = {0}; + str8_list_pushf(scratch.arena, &env, "PATH=%S;%S", str8_chop_last_slash(t_cl_path()), str8_cstring(old_path_cstr)); + t_invoke_env(exe_path, str8_zero(), env, max_U64, scratch.arena, &out); String8 s = out; From 38afd6260d10042fa7ec0de8be5ae504cf518444 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 9 Apr 2026 14:06:33 -0700 Subject: [PATCH 348/850] port eval test --- src/eval/eval_parse.c | 2 +- src/torture/torture_eval.c | 105 +++++++++++++++++++++++++++++++++++++ src/torture/torture_main.c | 94 ++++++++++++++++++++++++++++++--- 3 files changed, 193 insertions(+), 8 deletions(-) create mode 100644 src/torture/torture_eval.c diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 1eff2b4d..00374472 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -1578,7 +1578,7 @@ internal E_Parse e_push_parse_from_string(Arena *arena, String8 text) { Temp scratch = scratch_begin(&arena, 1); - E_TokenArray tokens = e_token_array_from_text(scratch.arena, text); + E_TokenArray tokens = e_token_array_from_text(arena, text); E_Parse parse = e_push_parse_from_string_tokens__prec(arena, text, tokens, e_max_precedence, max_U64); scratch_end(scratch); return parse; diff --git a/src/torture/torture_eval.c b/src/torture/torture_eval.c new file mode 100644 index 00000000..da461a9e --- /dev/null +++ b/src/torture/torture_eval.c @@ -0,0 +1,105 @@ +#define T_Group "eval" + +T_BeginTest(eval_compiler_basics) +{ + E_Cache *eval_cache = e_cache_alloc(); + e_select_cache(eval_cache); + E_BaseCtx *base_ctx = push_array(arena, E_BaseCtx, 1); + e_select_base_ctx(base_ctx); + E_IRCtx *ir_ctx = push_array(arena, E_IRCtx, 1); + e_select_ir_ctx(ir_ctx); + E_InterpretCtx *interpret_ctx = push_array(arena, E_InterpretCtx, 1); + e_select_interpret_ctx(interpret_ctx, 0, 0); + + String8 exprs[] = + { + str8_lit("123"), + str8_lit("1 + 2"), + str8_lit("foo"), + str8_lit("foo(bar)"), + str8_lit("foo(bar(baz))"), + }; + String8List logs = {0}; + for EachElement(idx, exprs) + { + String8 log = e_debug_log_from_expr_string(arena, exprs[idx]); + str8_list_push(arena, &logs, log); + } + String8 log = str8_list_join(arena, &logs, 0); + + String8 expected_log = str8_lit( +"`123`\n" +" tokens:\n" +" Numeric: `123`\n" +" expr:\n" +" LeafU64 (123)\n" +" type:\n" +" int32\n" +" ir_tree:\n" +" ConstU8 (123)\n" +"\n" +"`1 + 2`\n" +" tokens:\n" +" Numeric: `1`\n" +" Symbol: `+`\n" +" Numeric: `2`\n" +" expr:\n" +" Add\n" +" LeafU64 (1)\n" +" LeafU64 (2)\n" +" type:\n" +" int32\n" +" ir_tree:\n" +" Add (1026)\n" +" ConstU8 (1)\n" +" ConstU8 (2)\n" +"\n" +"`foo`\n" +" tokens:\n" +" Identifier: `foo`\n" +" expr:\n" +" LeafIdentifier (`foo`)\n" +" type:\n" +" ir_tree:\n" +" Stop\n" +"\n" +"`foo(bar)`\n" +" tokens:\n" +" Identifier: `foo`\n" +" Symbol: `(`\n" +" Identifier: `bar`\n" +" Symbol: `)`\n" +" expr:\n" +" Call\n" +" LeafIdentifier (`foo`)\n" +" LeafIdentifier (`bar`)\n" +" type:\n" +" ir_tree:\n" +" Stop\n" +"\n" +"`foo(bar(baz))`\n" +" tokens:\n" +" Identifier: `foo`\n" +" Symbol: `(`\n" +" Identifier: `bar`\n" +" Symbol: `(`\n" +" Identifier: `baz`\n" +" Symbol: `)`\n" +" Symbol: `)`\n" +" expr:\n" +" Call\n" +" LeafIdentifier (`foo`)\n" +" Call\n" +" LeafIdentifier (`bar`)\n" +" LeafIdentifier (`baz`)\n" +" type:\n" +" ir_tree:\n" +" Stop\n" +"\n" +); + + T_Ok(str8_match(log, expected_log, 0)); +} + +#undef T_Group + diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 760b1bb9..207c88f8 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -4,35 +4,78 @@ //////////////////////////////// // Build Options -#define BUILD_CONSOLE_INTERFACE 1 #define BUILD_TITLE "TORTURE" + +#define BUILD_CONSOLE_INTERFACE 1 +#define OS_FEATURE_GRAPHICAL 1 +#define DMN_INIT_MANUAL 1 +#define CTRL_INIT_MANUAL 1 +#define OS_GFX_INIT_MANUAL 1 +#define FP_INIT_MANUAL 1 +#define R_INIT_MANUAL 1 +#define FNT_INIT_MANUAL 1 +#define D_INIT_MANUAL 1 +#define RD_INIT_MANUAL 1 #define NO_ASYNC 1 //////////////////////////////// #include "base/base_inc.h" +#include "x64/x64.h" #include "linker/hash_table.h" +#include "linker/lf_hash_table.h" #include "os/os_inc.h" +#include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" -#include "obj/obj.h" +#include "mdesk/mdesk.h" +#include "config/config_inc.h" +#include "content/content.h" +#include "file_stream/file_stream.h" +#include "text/text.h" +#include "mutable_text/mutable_text.h" #include "coff/coff.h" #include "coff/coff_parse.h" #include "coff/coff_obj_writer.h" #include "coff/coff_lib_writer.h" #include "pe/pe.h" #include "pe/pe_section_flags.h" +#include "elf/elf.h" +#include "gnu/gnu.h" +#include "gnu/gnu_parse.h" +#include "elf/elf_parse.h" +#include "elf/elf_dump.h" #include "codeview/codeview.h" #include "codeview/codeview_parse.h" #include "msf/msf.h" #include "msf/msf_parse.h" #include "pdb/pdb.h" #include "pdb/pdb_parse.h" -#include "elf/elf.h" -#include "elf/elf_parse.h" +#include "pdb/pdb_stringize.h" #include "dwarf/dwarf_inc.h" +#include "rdi_from_coff/rdi_from_coff.h" +#include "rdi_from_elf/rdi_from_elf.h" +#include "rdi_from_pdb/rdi_from_pdb.h" +#include "rdi_from_dwarf/rdi_from_dwarf.h" +#include "obj/obj.h" +#include "radbin/radbin.h" #include "regs/regs.h" +#include "regs/rdi/regs_rdi.h" #include "regs/dwarf/regs_dwarf.h" +#include "dbg_info/dbg_info.h" +#include "disasm/disasm.h" +#include "stap/stap_parse.h" +#include "demon/demon_inc.h" +#include "eval/eval_inc.h" +#include "eval_visualization/eval_visualization_inc.h" +#include "ctrl/ctrl_inc.h" +#include "font_provider/font_provider_inc.h" +#include "render/render_inc.h" +#include "font_cache/font_cache.h" +#include "draw/draw.h" +#include "ui/ui_inc.h" +#include "dbg_engine/dbg_engine_inc.h" +#include "raddbg/raddbg_inc.h" #include "linker/base_ext/base_core.h" #include "linker/base_ext/base_arena.h" #include "linker/base_ext/base_arrays.h" @@ -47,27 +90,60 @@ #include "torture_radlink.h" #include "base/base_inc.c" +#include "x64/x64.c" #include "linker/hash_table.c" +#include "linker/lf_hash_table.c" #include "os/os_inc.c" +#include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" -#include "obj/obj.c" +#include "mdesk/mdesk.c" +#include "config/config_inc.c" +#include "content/content.c" +#include "file_stream/file_stream.c" +#include "text/text.c" +#include "mutable_text/mutable_text.c" #include "coff/coff.c" #include "coff/coff_parse.c" #include "coff/coff_obj_writer.c" #include "coff/coff_lib_writer.c" #include "pe/pe.c" +#include "elf/elf.c" +#include "gnu/gnu.c" +#include "gnu/gnu_parse.c" +#include "elf/elf_parse.c" +#include "elf/elf_dump.c" #include "codeview/codeview.c" #include "codeview/codeview_parse.c" #include "msf/msf.c" #include "msf/msf_parse.c" #include "pdb/pdb.c" #include "pdb/pdb_parse.c" -#include "elf/elf.c" -#include "elf/elf_parse.c" +#include "pdb/pdb_stringize.c" #include "dwarf/dwarf_inc.c" +#include "rdi_from_coff/rdi_from_coff.c" +#include "rdi_from_elf/rdi_from_elf.c" +#include "rdi_from_pdb/rdi_from_pdb.c" +#include "rdi_from_dwarf/rdi_from_dwarf.c" +#include "obj/obj.c" +#include "radbin/radbin.c" #include "regs/regs.c" +#include "regs/rdi/regs_rdi.c" #include "regs/dwarf/regs_dwarf.c" +#include "dbg_info/dbg_info.c" +#include "disasm/disasm.c" +#include "stap/stap_parse.c" +#include "demon/demon_inc.c" +#include "eval/eval_inc.c" +#include "eval_visualization/eval_visualization_inc.c" +#include "ctrl/ctrl_inc.c" +#include "font_provider/font_provider_inc.c" +#include "render/render_inc.c" +#include "font_cache/font_cache.c" +#include "draw/draw.c" +#include "ui/ui_inc.c" +#include "dbg_engine/dbg_engine_inc.c" +#include "raddbg/raddbg_inc.c" #include "linker/base_ext/base_core.c" #include "linker/base_ext/base_arena.c" #include "linker/base_ext/base_arrays.c" @@ -75,12 +151,16 @@ #include "linker/thread_pool/thread_pool.c" #include "linker/codeview_ext/codeview.c" #include "linker/pdb_ext/msf_builder.c" + #include "torture.c" #include "torture_base.c" #include "torture_radlink.c" #include "torture_dwarf.c" #include "torture_d2r.c" #include "torture_p2r.c" +#include "torture_eval.c" + +internal B32 frame(void) { return 0; } //////////////////////////////// From 120cc529efcaa572d113900402d2c405b033418b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 9 Apr 2026 15:27:20 -0700 Subject: [PATCH 349/850] update run_tests.bat to use torture --- build.bat | 1 - run_tests.bat | 52 +++++--- src/tester/tester_main.c | 260 --------------------------------------- 3 files changed, 35 insertions(+), 278 deletions(-) delete mode 100644 src/tester/tester_main.c diff --git a/build.bat b/build.bat index f4d482a6..36d142ae 100644 --- a/build.bat +++ b/build.bat @@ -139,7 +139,6 @@ if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% %linker% /NOIMPLIB %linker% /NATVIS:"%~dp0\src\linker\linker.natvis" %out%radlink.exe || exit /b 1 if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% %out%radbin.exe || exit /b 1 if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% %out%raddump.exe || exit /b 1 -if "%tester%"=="1" set didbuild=1 && %compile% ..\src\tester\tester_main.c %compile_link% %out%tester.exe || exit /b 1 if "%ryan_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 if "%eval_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\eval_scratch.c %compile_link% %out%eval_scratch.exe || exit /b 1 if "%textperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\textperf.c %compile_link% %out%textperf.exe || exit /b 1 diff --git a/run_tests.bat b/run_tests.bat index e8bc4c1a..f314b283 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -1,21 +1,39 @@ @echo off -setlocal -cd /D "%~dp0" +setlocal enabledelayedexpansion -echo --- getting test data folder path --------------------------------------------- -if not exist .\local\test_data_path.txt ( - echo error: You must first store the full path of your test data folder inside of `local/test_data_path.txt`. - goto :EOF +rem Make sure that your VS install does not have LLVM included otherwise this script will use VS clang + +set TARGET_VALUES=raddbg radlink radbin mule_main mule_module torture +set CC_VALUES=msvc clang +set MODE_VALUES=debug release + +rem find path to clang +for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi + +rem parse out clang version number out of --version to build path to the folder with ASAN DLL +for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v + +for %%c in (%CC_VALUES%) do for %%m in (%MODE_VALUES%) do ( + setlocal + + echo -------------------------------------------------------------------------------- + echo Build %%c+%%m + + if "%%c" equ "clang" ( + set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;!PATH! + ) + + rem clang does not compile with asan in release mode because it runs out of memory + if "%%c::%%m" neq "clang::release" ( + call build.bat meta %%c %%m %TARGET_VALUES% || exit /b 1 + ) else ( + call build.bat asan meta %%c %%m %TARGET_VALUES% || exit /b 1 + ) + + pushd build + torture || exit /b 1 + popd + + endlocal ) -set /p test_data_folder=<.\local\test_data_path.txt -echo test data path: %test_data_folder% -echo: -echo --- building all testing executables ------------------------------------------ -call build rdi_from_pdb rdi_dump raddbg radlink tester -echo: - -echo --- running tests ------------------------------------------------------------- -pushd build -call tester.exe --test_data:%test_data_folder% -popd diff --git a/src/tester/tester_main.c b/src/tester/tester_main.c deleted file mode 100644 index 9d34aad4..00000000 --- a/src/tester/tester_main.c +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Build Options - -#define BUILD_TITLE "tester" -#define BUILD_CONSOLE_INTERFACE 1 -#define OS_FEATURE_GRAPHICAL 1 - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: [h] -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "content/content.h" -#include "rdi_format/rdi_format_local.h" -#include "regs/regs.h" -#include "regs/rdi/regs_rdi.h" -#include "eval/eval_inc.h" - -//- rjf: [c] -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "content/content.c" -#include "rdi_format/rdi_format_local.c" -#include "regs/regs.c" -#include "regs/rdi/regs_rdi.c" -#include "eval/eval_inc.c" - -//////////////////////////////// -//~ rjf: Entry Points - -internal B32 frame(void) { return 0; } - -internal void -entry_point(CmdLine *cmdline) -{ - Arena *arena = arena_alloc(); - E_Cache *eval_cache = e_cache_alloc(); - e_select_cache(eval_cache); - E_BaseCtx *base_ctx = push_array(arena, E_BaseCtx, 1); - e_select_base_ctx(base_ctx); - E_IRCtx *ir_ctx = push_array(arena, E_IRCtx, 1); - e_select_ir_ctx(ir_ctx); - E_InterpretCtx *interpret_ctx = push_array(arena, E_InterpretCtx, 1); - e_select_interpret_ctx(interpret_ctx, 0, 0); - - ////////////////////////////// - //- rjf: unpack command line - // - String8 test_data_folder_path = cmd_line_string(cmdline, str8_lit("test_data")); - if(test_data_folder_path.size == 0) - { - fprintf(stderr, "error(input): The test data folder path was not specified. Specify the path when running the program, like: %.*s --test_data:C:/foo/bar/baz\n", str8_varg(cmdline->exe_name)); - os_abort(1); - } - - ////////////////////////////// - //- rjf: make artifacts directory - // - String8 artifacts_path = path_normalized_from_string(arena, str8_lit("./tester_artifacts")); - os_make_directory(artifacts_path); - - ////////////////////////////// - //- rjf: set up list of test artifacts - // - typedef struct Test Test; - struct Test - { - Test *next; - String8 name; - String8List out; - B32 good; - }; - Test *first_test = 0; - Test *last_test = 0; -#define Test(name_identifier) \ -Test *test_##name_identifier = push_array(arena, Test, 1);\ -test_##name_identifier->name = str8_lit(#name_identifier);\ -test_##name_identifier->good = 1;\ -SLLQueuePush(first_test, last_test, test_##name_identifier);\ -for(Test *test = test_##name_identifier; test != 0; test = 0) - - ////////////////////////////// - //- rjf: PDB -> RDI determinism - // - Test(pdb2rdi_determinism) - { - U64 num_repeats_per_pdb = 32; - String8 pdb_paths[] = - { - push_str8f(arena, "%S/mule_main/mule_main.pdb", test_data_folder_path), - push_str8f(arena, "%S/mule_main/mule_module.pdb", test_data_folder_path), - }; - for EachElement(pdb_idx, pdb_paths) - { - // rjf: unpack paths, make output directory - String8 pdb_path = path_normalized_from_string(arena, pdb_paths[pdb_idx]); - String8 repeat_folder = push_str8f(arena, "%S/%S", artifacts_path, test->name); - os_make_directory(repeat_folder); - - // rjf: generate all RDIs - String8List rdi_paths = {0}; - String8List dump_paths = {0}; - { - OS_HandleList processes = {0}; - for EachIndex(repeat_idx, num_repeats_per_pdb) - { - String8 rdi_path = push_str8f(arena, "%S/repeat_%I64u.rdi", repeat_folder, repeat_idx); - str8_list_push(arena, &rdi_paths, rdi_path); - os_handle_list_push(arena, &processes, os_cmd_line_launchf("rdi_from_pdb --deterministic --pdb:%S --out:%S", pdb_path, rdi_path)); - } - for(OS_HandleNode *n = processes.first; n != 0; n = n->next) - { - os_process_join(n->v, max_U64, 0); - } - } - - // rjf: generate all dumps - { - OS_HandleList processes = {0}; - for(String8Node *n = rdi_paths.first; n != 0; n = n->next) - { - String8 rdi_path = n->string; - String8 dump_path = push_str8f(arena, "%S.dump", rdi_path); - str8_list_push(arena, &dump_paths, dump_path); - os_handle_list_push(arena, &processes, os_cmd_line_launchf("rdi_dump %S > %S", rdi_path, dump_path)); - } - for(OS_HandleNode *n = processes.first; n != 0; n = n->next) - { - os_process_join(n->v, max_U64, 0); - } - } - - // rjf: gather all hashes/paths - U64 rdi_hashes_count = rdi_paths.node_count; - U128 *rdi_hashes = push_array(arena, U128, rdi_hashes_count); - String8 *rdi_paths_array = push_array(arena, String8, rdi_hashes_count); - U64 dump_hashes_count = dump_paths.node_count; - U128 *dump_hashes = push_array(arena, U128, dump_hashes_count); - String8 *dump_paths_array = push_array(arena, String8, dump_hashes_count); - { - U64 idx = 0; - for(String8Node *n = rdi_paths.first; n != 0; n = n->next, idx += 1) - { - Temp scratch = scratch_begin(0, 0); - String8 path = n->string; - String8 data = os_data_from_file_path(scratch.arena, path); - rdi_hashes[idx] = u128_hash_from_str8(data); - rdi_paths_array[idx] = path; - scratch_end(scratch); - } - } - { - U64 idx = 0; - for(String8Node *n = dump_paths.first; n != 0; n = n->next, idx += 1) - { - Temp scratch = scratch_begin(0, 0); - String8 path = n->string; - String8 data = os_data_from_file_path(scratch.arena, path); - dump_hashes[idx] = u128_hash_from_str8(data); - dump_paths_array[idx] = path; - scratch_end(scratch); - } - } - - // rjf: determine if all hashes match - B32 matches = 1; - for EachIndex(idx, rdi_hashes_count) - { - if(!u128_match(rdi_hashes[idx], rdi_hashes[0])) - { - matches = 0; - break; - } - } - for EachIndex(idx, dump_hashes_count) - { - if(!u128_match(dump_hashes[idx], dump_hashes[0])) - { - matches = 0; - break; - } - } - - // rjf: output bad case info - if(!matches) - { - test->good = 0; - str8_list_pushf(arena, &test->out, " pdb[%I64u] \"%S\"\n", pdb_idx, pdb_path); - for EachIndex(idx, rdi_hashes_count) - { - str8_list_pushf(arena, &test->out, " rdi[%I64u] \"%S\": 0x%I64x:%I64x\n", idx, rdi_paths_array[idx], rdi_hashes[idx].u64[0], rdi_hashes[idx].u64[1]); - } - for EachIndex(idx, dump_hashes_count) - { - str8_list_pushf(arena, &test->out, " dump[%I64u] \"%S\": 0x%I64x:%I64x\n", idx, dump_paths_array[idx], dump_hashes[idx].u64[0], dump_hashes[idx].u64[1]); - } - } - } - } - - ////////////////////////////// - //- rjf: eval compiler basics - // - Test(eval_compiler_basics) - { - String8 exprs[] = - { - str8_lit("123"), - str8_lit("1 + 2"), - str8_lit("foo"), - str8_lit("foo(bar)"), - str8_lit("foo(bar(baz))"), - }; - String8List logs = {0}; - for EachElement(idx, exprs) - { - String8 log = e_debug_log_from_expr_string(arena, exprs[idx]); - str8_list_push(arena, &logs, log); - } - String8 log = str8_list_join(arena, &logs, 0); - String8 test_artifacts_path = push_str8f(arena, "%S/%S", artifacts_path, test->name); - os_make_directory(test_artifacts_path); - String8 current_file_path = push_str8f(arena, "%S/current.txt", test_artifacts_path); - String8 correct_file_path = push_str8f(arena, "%S/%S/correct.txt", test_data_folder_path, test->name); - os_write_data_to_file_path(current_file_path, log); - String8 current_file_data = log; - String8 correct_file_data = os_data_from_file_path(arena, correct_file_path); - test->good = str8_match(correct_file_data, current_file_data, 0); - } - - ////////////////////////////// - //- rjf: dump results - // - B32 all_good = 1; - for(Test *t = first_test; t != 0; t = t->next) - { - if(!t->good) - { - all_good = 0; - break; - } - } - fprintf(stderr, "[%s]\n", all_good ? "." : "X"); - for(Test *t = first_test; t != 0; t = t->next) - { - fprintf(stderr, " [%s] \"%.*s\"\n", t->good ? "." : "X", str8_varg(t->name)); - if(!t->good) - { - for(String8Node *n = t->out.first; n != 0; n = n->next) - { - fprintf(stderr, " %.*s", str8_varg(n->string)); - } - } - } - -} From 686b64c357e5e5c34fc5cf1075730a44604a538c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 9 Apr 2026 16:24:15 -0700 Subject: [PATCH 350/850] start work on more sophisticated memory type interpretation capabilities in memory view --- src/eval/eval_ir.c | 6 +- src/raddbg/generated/raddbg.meta.c | 14 ++-- src/raddbg/generated/raddbg.meta.h | 2 +- src/raddbg/raddbg.mdesk | 17 +++-- src/raddbg/raddbg_core.c | 62 +++++++++++++--- src/raddbg/raddbg_eval.c | 114 +++++++++++++++++++++++++++++ src/raddbg/raddbg_eval.h | 10 +++ src/raddbg/raddbg_views.c | 105 +++++++++++++++++--------- 8 files changed, 270 insertions(+), 60 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 43b74c8d..8c8db833 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -661,7 +661,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I E_Type *lhs_type = e_type_from_key(lhs_irtree_try_chain->type_key); E_TypeAccessFunctionType *lhs_access = lhs_type->access; for(E_Type *lens_type = lhs_type; - lens_type->kind == E_TypeKind_Lens || lens_type->kind == E_TypeKind_Set; + lens_type->kind == E_TypeKind_Lens || lens_type->kind == E_TypeKind_Set || (E_TypeKind_FirstMeta <= lens_type->kind && lens_type->kind <= E_TypeKind_LastMeta); lens_type = e_type_from_key(lens_type->direct_type_key)) { if(lens_type->access != 0) @@ -2444,7 +2444,9 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I E_Type *type = e_type_from_key(result.type_key); { E_TypeIRExtFunctionType *irext = type->irext; - for(E_Type *t = type; t->kind == E_TypeKind_Lens || t->kind == E_TypeKind_Set; t = e_type_from_key(t->direct_type_key)) + for(E_Type *t = type; + t->kind == E_TypeKind_Lens || t->kind == E_TypeKind_Set || (E_TypeKind_FirstMeta <= t->kind && t->kind <= E_TypeKind_LastMeta); + t = e_type_from_key(t->direct_type_key)) { if(t->irext != 0) { diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 964762f0..34ed91f3 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[358] = +RD_VocabInfo rd_vocab_info_table[359] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -175,6 +175,7 @@ RD_VocabInfo rd_vocab_info_table[358] = {str8_lit_comp("rgba"), str8_lit_comp(""), str8_lit_comp("RGBA"), str8_lit_comp(""), RD_IconKind_Palette}, {str8_lit_comp("path"), str8_lit_comp(""), str8_lit_comp("Path"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("guid"), str8_lit_comp(""), str8_lit_comp("GUID"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("peek_type"), str8_lit_comp("peek_types"), str8_lit_comp("Peek Type"), str8_lit_comp("Peek Types"), RD_IconKind_Null}, {str8_lit_comp("launch_and_run"), str8_lit_comp(""), str8_lit_comp("Launch and Run"), str8_lit_comp(""), RD_IconKind_Play}, {str8_lit_comp("launch_and_step_into"), str8_lit_comp(""), str8_lit_comp("Launch and Step Into"), str8_lit_comp(""), RD_IconKind_PlayStepForward}, {str8_lit_comp("kill"), str8_lit_comp(""), str8_lit_comp("Kill"), str8_lit_comp(""), RD_IconKind_X}, @@ -264,7 +265,7 @@ RD_VocabInfo rd_vocab_info_table[358] = {str8_lit_comp("move_view"), str8_lit_comp(""), str8_lit_comp("Move View"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("tab_bar_top"), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Top"), str8_lit_comp(""), RD_IconKind_UpArrow}, {str8_lit_comp("tab_bar_bottom"), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Bottom"), str8_lit_comp(""), RD_IconKind_DownArrow}, -{str8_lit_comp("tab_settings"), str8_lit_comp(""), str8_lit_comp("Tab Settings"), str8_lit_comp(""), RD_IconKind_Gear}, +{str8_lit_comp("tab_settings"), str8_lit_comp(""), str8_lit_comp("Selected Tab Settings"), str8_lit_comp(""), RD_IconKind_Gear}, {str8_lit_comp("set_current_path"), str8_lit_comp(""), str8_lit_comp("Set Current Path"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("open"), str8_lit_comp(""), str8_lit_comp("Open"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("switch"), str8_lit_comp(""), str8_lit_comp("Switch"), str8_lit_comp(""), RD_IconKind_FileOutline}, @@ -434,8 +435,8 @@ RD_NameSchemaInfo rd_name_schema_info_table[26] = {str8_lit_comp("watch"), str8_lit_comp("@inherit(tab) x:\n{\n @override @display_name('Tab Row Height') @description(\"Controls the tab's row height, in multiples of the font size.\")\n 'row_height': @range[1.75f, 5.f] f32,\n 'label': code_string,\n @description(\"The root expression which is evaluated to produce the watch window.\")\n 'expression': expr_string,\n @no_expand 'watches': query,\n}\n")}, {str8_lit_comp("list"), str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, {str8_lit_comp("text"), str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, -{str8_lit_comp("disasm"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n 'arch': code_string,\n 'syntax': code_string,\n 'size': expr_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n\n}\n")}, -{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(0) @display_name(\"Edit Mode\") @description(\"Enables editing operations on memory contents.\")\n 'edit_mode': bool,\n}\n")}, +{str8_lit_comp("disasm"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n 'arch': code_string,\n 'syntax': code_string,\n 'size': expr_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, +{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @display_name(\"Peek Types\") @description(\"A list of types to interpret selected and hovered memory as.\")\n 'peek_types': query,\n}\n")}, {str8_lit_comp("bitmap"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, {str8_lit_comp("color"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, {str8_lit_comp("geo3d"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, @@ -652,7 +653,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[248] = { str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, +{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("switch"), str8_lit_comp("Switches to a recent file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_files, query:source_files"), str8_lit_comp(""), CTRL_EntityKind_Null}}, @@ -812,7 +813,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[248] = { str8_lit_comp("geo3d"), str8_lit_comp("Opens a Geometry (3D) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, }; -struct {String8 string; CFG_Binding binding;} rd_default_binding_table[116] = +struct {String8 string; CFG_Binding binding;} rd_default_binding_table[117] = { {str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_Modifier_Shift }}, {str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_Modifier_Alt}}, @@ -854,6 +855,7 @@ struct {String8 string; CFG_Binding binding;} rd_default_binding_table[116] = {str8_lit_comp("tab_bar_top"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, {str8_lit_comp("tab_bar_bottom"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, {str8_lit_comp("open_tab"), {OS_Key_T, 0 |OS_Modifier_Ctrl }}, +{str8_lit_comp("tab_settings"), {OS_Key_T, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, {str8_lit_comp("open"), {OS_Key_O, 0 |OS_Modifier_Ctrl }}, {str8_lit_comp("switch"), {OS_Key_I, 0 |OS_Modifier_Ctrl }}, {str8_lit_comp("switch_to_partner_file"), {OS_Key_O, 0 |OS_Modifier_Alt}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index c82edd1c..dda99eec 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -601,7 +601,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[358]; +extern RD_VocabInfo rd_vocab_info_table[359]; extern RD_NameSchemaInfo rd_name_schema_info_table[26]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 052c445e..45e5f582 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -200,6 +200,7 @@ RD_VocabTable: {rgba "" "RGBA" "" Palette } {path "" "Path" "" FileOutline } {guid "" "GUID" "" Null } + {peek_type _ "Peek Type" _ Null } } @struct RD_VocabInfo: @@ -531,7 +532,6 @@ RD_VocabTable: 'show_symbol_names': bool, @no_callee_helper @default(1) @description("Controls whether or not line numbers are shown.") 'show_line_numbers': bool, - } ``` } @@ -540,7 +540,7 @@ RD_VocabTable: ``` @inherit(tab) x: { - @description("An expression which refers to the base address of data which should be viewed as memory.") + @display_name("Base Address") @description("An expression which refers to the base address of data which should be viewed as memory.") 'expression': expr_string, @display_name("Address Range Size") @description("The number of bytes of the viewed memory range.") 'size': expr_string, @@ -548,12 +548,16 @@ RD_VocabTable: 'cursor': expr_string, @default(1) @display_name("Cursor Size") @description("The size, in bytes, of the cursor.") 'cursor_size': @range[1, 16] u64, - @default(16) @description("The number of columns to build before building new rows.") + @expand_if("!$.auto_columns") @default(16) @description("The number of columns to build before building new rows.") 'num_columns': @range[1, 64] u64, @default(1) @display_name("Track Mark To Cursor") @description("Ensures that the mark always follows the cursor, if the cursor value is updated.") 'track_mark_to_cursor': bool, - @default(0) @display_name("Edit Mode") @description("Enables editing operations on memory contents.") - 'edit_mode': bool, + @default(1) @display_name("Allow Mutation") @description("Allows operations which mutate memory.") + 'allow_mutation': bool, + @default(0) @display_name("Automatically Size Columns") @description("Determines the number of columns based on the available space.") + 'auto_columns': bool, + @display_name("Peek Types") @description("A list of types to interpret selected and hovered memory as.") + 'peek_types': query, } ``` } @@ -935,7 +939,7 @@ RD_CmdTable: // | | | | {MoveView 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } {TabBarTop 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "$tab," } {TabBarBottom 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "$tab," } - {TabSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Tab Settings" "Opens settings for a tab." "" "" } + {TabSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } //- rjf: files {SetCurrentPath 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } @@ -1241,6 +1245,7 @@ RD_DefaultBindingTable: { "tab_bar_top" Up ctrl shift alt } { "tab_bar_bottom" Down ctrl shift alt } { "open_tab" T ctrl 0 0 } + { "tab_settings" T ctrl 0 alt } //- rjf: files { "open" O ctrl 0 0 } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 6640c9b1..be59c832 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -8095,6 +8095,11 @@ rd_window_frame(void) t->tab = tab; t->fstrs = rd_title_fstrs_from_cfg(scratch.arena, tab, 0); F32 tab_width_target = dr_dim_from_fstrs(ui_top_tab_size(), &t->fstrs).x + tab_close_width_px + ui_top_font_size()*1.f; + B32 tab_is_selected = (tab == panel->selected_tab); + if(tab_is_selected && panel_tree.focused == panel) + { + tab_width_target += tab_close_width_px; + } tab_width_target = Min(max_tab_width_px, tab_width_target); t->tab_width = floor_f32(ui_anim(ui_key_from_stringf(ui_key_zero(), "tab_width_%p", tab), tab_width_target, .initial = reset ? tab_width_target : 0, .rate = rd_state->menu_animation_rate)); SLLQueuePush(first_tab_task, last_tab_task, t); @@ -8238,6 +8243,38 @@ rd_window_frame(void) ui_box_equip_display_fstrs(name_box, &tab_fstrs); } } + if(tab_is_selected && panel_tree.focused == panel) + { + UI_PrefWidth(ui_px(tab_close_width_px, 1.f)) UI_TextAlignment(UI_TextAlign_Center) + RD_Font(RD_FontSlot_Icons) + UI_FontSize(ui_top_font_size()*0.75f) + UI_TagF(".") UI_TagF("tab") UI_TagF("weak") UI_TagF("implicit") + UI_CornerRadius(0) + { + UI_Box *edit_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawText| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "%S###edit_view_%p", rd_icon_kind_text_table[RD_IconKind_Gear], tab); + UI_Signal sig = ui_signal_from_box(edit_box); + if(ui_pressed(sig)) + { + if(ws->query_is_active && + ui_key_match(sig.box->key, ws->query_regs->ui_key)) + { + rd_cmd(RD_CmdKind_CancelQuery); + } + else + { + rd_cmd(RD_CmdKind_PushQuery, + .ui_key = sig.box->key, + .expr = push_str8f(scratch.arena, "query:config.$%I64x", tab->id)); + } + } + } + } UI_PrefWidth(ui_px(tab_close_width_px, 1.f)) UI_TextAlignment(UI_TextAlign_Center) RD_Font(RD_FontSlot_Icons) UI_FontSize(ui_top_font_size()*0.75f) @@ -11577,6 +11614,19 @@ rd_frame(void) .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches), .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches), })); + e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit("peek_types"), + e_type_key_cons(.kind = E_TypeKind_Set, + .flags = E_TypeFlag_EditableChildren, + .name = str8_lit("peek_types"), + .irext = E_TYPE_IREXT_FUNCTION_NAME(peek_types), + .access = E_TYPE_ACCESS_FUNCTION_NAME(peek_types), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(peek_types), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(peek_types), + .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(peek_types), + .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(peek_types), + })); e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit("call_stack"), @@ -11601,18 +11651,6 @@ rd_frame(void) .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs_slice), .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs_slice), })); - e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit("environment"), - e_type_key_cons(.kind = E_TypeKind_Set, - .name = str8_lit("environment"), - .irext = E_TYPE_IREXT_FUNCTION_NAME(environment), - .access = E_TYPE_ACCESS_FUNCTION_NAME(environment), - .expand = - { - .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(environment), - .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(environment), - .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(environment), - .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(environment), - })); } //- rjf: add macro for collections with specific lookup rules (but no unique id rules) diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 7d8237b0..e41320d2 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -1248,6 +1248,120 @@ E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches) return num; } +//////////////////////////////// +//~ rjf: `peek_types` Type Hooks + +typedef struct RD_PeekTypesAccel RD_PeekTypesAccel; +struct RD_PeekTypesAccel +{ + CFG_NodePtrArray cfgs; +}; + +E_TYPE_IREXT_FUNCTION_DEF(peek_types) +{ + RD_PeekTypesAccel *accel = push_array(arena, RD_PeekTypesAccel, 1); + { + Temp scratch = scratch_begin(&arena, 1); + E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root); + String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); + E_Interpretation interpret = e_interpret(bytecode); + E_Space space = interpret.space; + CFG_Node *target = rd_cfg_from_eval_space(space); + CFG_NodePtrList env_strings = {0}; + for(CFG_Node *child = target->first; child != &cfg_nil_node; child = child->next) + { + if(str8_match(child->string, str8_lit("peek_type"), 0)) + { + cfg_node_ptr_list_push(scratch.arena, &env_strings, child); + } + } + accel->cfgs = cfg_node_ptr_array_from_list(arena, &env_strings); + scratch_end(scratch); + } + E_IRExt result = {accel}; + return result; +} + +E_TYPE_ACCESS_FUNCTION_DEF(peek_types) +{ + E_IRTreeAndType result = {&e_irnode_nil}; + if(expr->kind == E_ExprKind_ArrayIndex) + { + RD_PeekTypesAccel *accel = (RD_PeekTypesAccel *)lhs_irtree->user_data; + CFG_NodePtrArray *cfgs = &accel->cfgs; + E_Value rhs_value = e_value_from_expr(expr->first->next); + if(0 <= rhs_value.u64 && rhs_value.u64 < cfgs->count) + { + CFG_Node *cfg = cfgs->v[rhs_value.u64]; + result.root = e_irtree_set_space(arena, rd_eval_space_from_cfg(cfg), e_irtree_const_u(arena, 0)); + result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), cfg->first->string.size, E_TypeFlag_IsCodeText); + result.mode = E_Mode_Offset; + } + } + return result; +} + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(peek_types) +{ + RD_PeekTypesAccel *accel = (RD_PeekTypesAccel *)eval.irtree.user_data; + E_TypeExpandInfo result = {accel, accel->cfgs.count + 1}; + return result; +} + +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(peek_types) +{ + RD_PeekTypesAccel *accel = (RD_PeekTypesAccel *)user_data; + Rng1U64 legal_idx_range = r1u64(0, accel->cfgs.count); + Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range); + U64 read_range_count = dim_1u64(read_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) + { + U64 cfg_idx = read_range.min + idx; + if(cfg_idx < accel->cfgs.count) + { + evals_out[idx] = e_eval_wrapf(eval, "$[%I64u]", cfg_idx); + } + } +} + +E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(peek_types) +{ + U64 id = 0; + RD_PeekTypesAccel *accel = (RD_PeekTypesAccel *)user_data; + if(1 <= num && num <= accel->cfgs.count) + { + U64 idx = (num-1); + id = accel->cfgs.v[idx]->id; + } + else if(num == accel->cfgs.count+1) + { + id = max_U64; + } + return id; +} + +E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(peek_types) +{ + U64 num = 0; + RD_PeekTypesAccel *accel = (RD_PeekTypesAccel *)user_data; + if(id != 0 && id != max_U64) + { + for EachIndex(idx, accel->cfgs.count) + { + if(accel->cfgs.v[idx]->id == id) + { + num = idx+1; + break; + } + } + } + else if(id == max_U64) + { + num = accel->cfgs.count + 1; + } + return num; +} + //////////////////////////////// //~ rjf: `unattached_processes` Type Hooks diff --git a/src/raddbg/raddbg_eval.h b/src/raddbg/raddbg_eval.h index b2269be9..216f514b 100644 --- a/src/raddbg/raddbg_eval.h +++ b/src/raddbg/raddbg_eval.h @@ -86,6 +86,16 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(watches); E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches); E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches); +//////////////////////////////// +//~ rjf: `peek_types` Type Hooks + +E_TYPE_IREXT_FUNCTION_DEF(peek_types); +E_TYPE_ACCESS_FUNCTION_DEF(peek_types); +E_TYPE_EXPAND_INFO_FUNCTION_DEF(peek_types); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(peek_types); +E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(peek_types); +E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(peek_types); + //////////////////////////////// //~ rjf: `unattached_processes` Type Hooks diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index f55e02d8..a5dad0b5 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1085,9 +1085,11 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) // if(!block_is_root) { + // TODO(rjf): @hack special-casing these specific hook checks... not good if(info.group_cfg_name.size != 0 && (block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs_slice) || block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches) || - block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(environment))) + block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(environment) || + block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(peek_types))) { CFG_ID id = row->key.child_id; info.group_cfg_child = cfg_node_from_id(id); @@ -2654,7 +2656,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); RD_MemoryViewState *mv = rd_view_state(RD_MemoryViewState); - B32 edit_mode = rd_view_setting_b32_from_name(str8_lit("edit_mode")); + B32 allow_edits = rd_view_setting_b32_from_name(str8_lit("allow_mutation")); ////////////////////////////// //- rjf: if memory views are parameterized by a register-space evaluation, @@ -2677,6 +2679,17 @@ RD_VIEW_UI_FUNCTION_DEF(memory) view_range = rd_whole_range_from_eval_space(eval.space); } + ////////////////////////////// + //- rjf: unpack visual params + // + FNT_Tag font = rd_font_from_slot(RD_FontSlot_Code); + FNT_RasterFlags font_raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code); + F32 font_size = ui_top_font_size(); + F32 big_glyph_advance = fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("H")).x; + F32 row_height_px = floor_f32(font_size*2.f); + F32 cell_width_px = floor_f32(font_size*2.f); + F32 address_margin_width_px = big_glyph_advance*20.f; + ////////////////////////////// //- rjf: unpack parameterization info // @@ -2693,10 +2706,15 @@ RD_VIEW_UI_FUNCTION_DEF(memory) U64 initial_mark_base_vaddr = mark_base_vaddr; U64 num_columns = rd_view_setting_u64_from_name(str8_lit("num_columns")); B32 track_mark_to_cursor = rd_view_setting_b32_from_name(str8_lit("track_mark_to_cursor")); + B32 auto_columns = rd_view_setting_b32_from_name(str8_lit("auto_columns")); if(num_columns == 0) { num_columns = 16; } + if(auto_columns) + { + num_columns = (U64)((dim_2f32(rect).x - address_margin_width_px - big_glyph_advance*4.f) / (cell_width_px + big_glyph_advance)); + } num_columns = ClampBot(1, num_columns); UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); Vec4F32 selection_color = ui_color_from_name(str8_lit("selection")); @@ -2739,16 +2757,6 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } - ////////////////////////////// - //- rjf: unpack visual params - // - FNT_Tag font = rd_font_from_slot(RD_FontSlot_Code); - FNT_RasterFlags font_raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code); - F32 font_size = ui_top_font_size(); - F32 big_glyph_advance = fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("H")).x; - F32 row_height_px = floor_f32(font_size*2.f); - F32 cell_width_px = floor_f32(font_size*2.f); - ////////////////////////////// //- rjf: calculate rectangles // @@ -2828,14 +2836,6 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Vec2S64 cell_delta = {0}; B32 allow_cell_movement = 1; - // rjf: edit mode toggling - if(evt->slot == UI_EventActionSlot_Edit) - { - rd_store_view_param_s64(str8_lit("edit_mode"), !edit_mode); - edit_mode ^= 1; - good_action = 1; - } - // rjf: copies if(evt->flags & UI_EventFlag_Copy) { @@ -2872,7 +2872,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } // rjf: pastes - if(edit_mode && evt->flags & UI_EventFlag_Paste) + if(allow_edits && evt->flags & UI_EventFlag_Paste) { String8 data_textified = evt->string; U8 split_chars[] = {' ', '\n', '\r'}; @@ -2903,7 +2903,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } // rjf: cell-granularity deletions - if(edit_mode && !mv->cell_value_edit_in_progress && evt->flags & UI_EventFlag_Delete) + if(allow_edits && !mv->cell_value_edit_in_progress && evt->flags & UI_EventFlag_Delete) { Rng1U64 range = union_1u64(r1u64(cursor_base_vaddr, cursor_base_vaddr+cursor_size), r1u64(mark_base_vaddr, mark_base_vaddr+cursor_size)); @@ -2913,10 +2913,14 @@ RD_VIEW_UI_FUNCTION_DEF(memory) log_user_errorf("Could not successfully write to memory."); } good_action = 1; + if(cursor_base_vaddr != mark_base_vaddr) + { + allow_cell_movement = 0; + } } // rjf: in-progress cell value edit deletions -> delete existing cell half-byte - if(edit_mode && mv->cell_value_edit_in_progress && evt->flags & UI_EventFlag_Delete) + if(allow_edits && mv->cell_value_edit_in_progress && evt->flags & UI_EventFlag_Delete) { mv->cell_value_edit_in_progress = 0; allow_cell_movement = 0; @@ -2924,7 +2928,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } // rjf: byte digit -> cell value insertion. if first digit, store, if 2nd, commit - if(edit_mode && evt->string.size != 0 && evt->kind == UI_EventKind_Text && !(evt->flags & UI_EventFlag_Paste)) + if(allow_edits && evt->string.size != 0 && evt->kind == UI_EventKind_Text && !(evt->flags & UI_EventFlag_Paste)) { good_action = 1; if(!mv->cell_value_edit_in_progress) @@ -3005,7 +3009,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) next_cursor_base_vaddr += cell_delta.x; next_cursor_base_vaddr += cell_delta.y*num_columns; } - if(good_action && evt->flags & UI_EventFlag_PickSelectSide && cursor_base_vaddr != mark_base_vaddr) + if(allow_cell_movement && good_action && evt->flags & UI_EventFlag_PickSelectSide && cursor_base_vaddr != mark_base_vaddr) { if(evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0) { @@ -3016,7 +3020,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) next_cursor_base_vaddr = Max(cursor_base_vaddr, mark_base_vaddr); } } - if(good_action && !(evt->flags & UI_EventFlag_KeepMark)) + if(allow_cell_movement && good_action && !(evt->flags & UI_EventFlag_KeepMark)) { next_mark_base_vaddr = next_cursor_base_vaddr; } @@ -3149,7 +3153,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) DR_FStrList byte_fstrs_changed[256] = {0}; { Vec4F32 selected_color = ui_color_from_name(str8_lit("text")); - if(edit_mode) UI_TagF("bad") + if(!allow_edits) UI_TagF("weak") { selected_color = ui_color_from_name(str8_lit("text")); } @@ -3551,14 +3555,15 @@ RD_VIEW_UI_FUNCTION_DEF(memory) RD_Font(RD_FontSlot_Code) UI_FontSize(font_size) { - UI_PrefWidth(ui_px(big_glyph_advance*20.f, 1.f)) ui_labelf("Address"); + UI_PrefWidth(ui_px(address_margin_width_px, 1.f)) ui_labelf("Address"); UI_PrefWidth(ui_px(cell_width_px, 1.f)) UI_TextAlignment(UI_TextAlign_Center) { - Rng1U64 col_selection_rng = r1u64(cursor_base_vaddr%num_columns, mark_base_vaddr%num_columns); + Rng1U64 col_selection_rng = r1u64((cursor_base_vaddr - view_range.min) % num_columns, + (mark_base_vaddr - view_range.min) % num_columns); for(U64 row_off = 0; row_off < num_columns; row_off += 1) { - B32 column_is_selected = (selection.min%num_columns <= row_off && row_off <= selection.max%num_columns); + B32 column_is_selected = ((selection.min - view_range.min) % num_columns <= row_off && row_off <= (selection.max - view_range.min) % num_columns); UI_TagF(column_is_selected ? "" : "weak") ui_labelf("%I64X", row_off); } } @@ -3650,8 +3655,10 @@ RD_VIEW_UI_FUNCTION_DEF(memory) //- rjf: interact with row container // U64 mouse_hover_byte_num = 0; + B32 dragging_is_active = 0; { UI_Signal sig = ui_signal_from_box(row_container_box); + dragging_is_active = ui_dragging(sig); // rjf: calculate hovered byte if(ui_hovering(sig) || ui_dragging(sig)) @@ -3790,7 +3797,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_BoxFlags cell_flags = 0; Vec4F32 cell_bg_rgba = {0}; Vec4F32 cell_bd_rgba = ui_color_from_name(str8_lit("text")); - if(edit_mode) UI_TagF("bad") + if(!allow_edits) UI_TagF("weak") { cell_bd_rgba = ui_color_from_name(str8_lit("text")); } @@ -3898,9 +3905,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } } - if(annotation_node != 0 && mouse_hover_byte_num == global_byte_num) + if(annotation_node != 0 && mouse_hover_byte_num == global_byte_num && !byte_is_selected && !dragging_is_active) { - UI_Tooltip UI_FontSize(ui_top_font_size()) UI_PrefHeight(ui_px(ui_top_font_size()*1.75f, 1.f)) + UI_Tooltip UI_PrefHeight(ui_px(ui_top_font_size()*1.75f, 1.f)) { for(AnnotationNode *a_n = annotation_node; a_n != 0; a_n = a_n->next) { @@ -3922,6 +3929,38 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } } + if(mouse_hover_byte_num == global_byte_num && byte_is_selected && !dragging_is_active) + { + UI_Tooltip + { + CFG_Node *view = cfg_node_from_id(rd_regs()->view); + CFG_NodePtrList peek_types = cfg_node_child_list_from_string(scratch.arena, view, str8_lit("peek_type")); + for EachNode(n, CFG_NodePtrNode, peek_types.first) + { + String8 type_string = n->v->first->string; + E_Eval type_size_eval = e_eval_from_stringf("sizeof(%S)", type_string); + if(type_size_eval.msgs.max_kind == E_MsgKind_Null && dim_1u64(selection)+1 >= type_size_eval.value.u64) + { + String8 casted_expr = str8f(scratch.arena, "*(((%S) *)((((uint8 *)(&(%S)) + 0x%I64x))))", + type_string, + eval.string.size ? eval.string : str8_lit("0"), + selection.min - view_range.min); + E_Eval peek_eval = e_eval_from_string(casted_expr); + UI_PrefWidth(ui_children_sum(1)) UI_Row + { + EV_StringParams params = + { + .flags = EV_StringFlag_ReadOnlyDisplayRules, + .radix = 10, + }; + String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), ¶ms, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, peek_eval); + UI_TextAlignment(UI_TextAlign_Left) UI_PrefWidth(ui_em(4.f, 1.f)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), type_string); + UI_PrefWidth(ui_text_dim(10, 1)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), value_string); + } + } + } + } + } } } } From c5dc7bee3e243b8b481168b2eac015ea5a972fe4 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 10 Apr 2026 16:53:01 -0700 Subject: [PATCH 351/850] fix info stream layout --- src/linker/base_ext/base_bit_array.c | 231 +------- src/linker/base_ext/base_bit_array.h | 16 +- src/linker/pdb_ext/pdb_builder.c | 281 ++++----- src/linker/pdb_ext/pdb_builder.h | 21 +- src/third_party/martins_bitscan/bitscan.h | 664 ++++++++++++++++++++++ src/torture/torture_base.c | 25 + src/torture/torture_main.c | 8 + 7 files changed, 818 insertions(+), 428 deletions(-) create mode 100644 src/third_party/martins_bitscan/bitscan.h diff --git a/src/linker/base_ext/base_bit_array.c b/src/linker/base_ext/base_bit_array.c index 8c0a8d1e..3cb4f7c4 100644 --- a/src/linker/base_ext/base_bit_array.c +++ b/src/linker/base_ext/base_bit_array.c @@ -1,234 +1,25 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +#include "third_party/martins_bitscan/bitscan.h" + internal U32Array -bit_array_init32(Arena *arena, U64 word_count) +bit_array_init32(Arena *arena, U64 bit_count) { - U32Array result; - result.count = CeilIntegerDiv(word_count, 32); - result.v = push_array(arena, U32, word_count); - return result; + U64 count = CeilIntegerDiv(bit_count, 32); + return (U32Array){ .count = count, .v = push_array(arena, U32, count) }; } internal U64 bit_array_scan_left_to_right32(U32Array bit_array, U64 lo, U64 hi, B32 state) { - Assert(lo < bit_array.count*32); - Assert(hi <= bit_array.count*32); - Assert(lo <= hi); - Assert(state == 0 || state == 1); - - U64 word_lo = lo / 32; - U64 word_hi = CeilIntegerDiv(hi, 32) - 1; - - U64 word_idx = word_lo; - U64 bit_idx = 0; - - U64 scan_count = hi - lo; - if (scan_count < 32) { - U64 bit_lo = lo % 32; - U64 bit_hi = hi % 32; - U64 word = bit_array.v[word_idx]; - word ^= state - 1; - word &= (1U << bit_hi) - (1U << bit_lo); - if (word) { - bit_idx = ctz32(word); - goto exit; - } - } else { - U32 first_word = bit_array.v[word_idx]; - first_word ^= state - 1; - first_word &= ~0u << (lo % 32); - if (first_word) { - bit_idx = ctz32(first_word); - goto exit; - } - - for (word_idx += 1; word_idx < word_hi; word_idx += 1) { - U32 word = bit_array.v[word_idx]; - word ^= state - 1; - if (word != 0) { - bit_idx = ctz32(word); - goto exit; - } - } - - U64 bit_hi = hi - (word_idx * 32); - U32 last_word = bit_array.v[word_idx]; - last_word ^= state - 1; - last_word &= (1 << bit_hi) - 1; - if (last_word) { - bit_idx = ctz32(last_word); - goto exit; - } - } - - word_idx = 0; - bit_idx = max_U32; - - exit:; - - U64 result = word_idx * 32 + bit_idx; - return result; + return bitscan_lsb_index32(bit_array.v, lo, hi, state); } internal U64 bit_array_scan_right_to_left32(U32Array bit_array, U64 lo, U64 hi, B32 state) { - Assert(lo <= hi); - Assert(state == 0 || state == 1); - - S64 word_lo = lo / 32; - S64 word_hi = CeilIntegerDiv(hi, 32) - 1; - - S64 word_idx = word_hi; - S64 bit_idx = -1; - - U64 scan_count = hi - lo; - if (scan_count < 32) { - S64 bit_lo = lo % 32; - S64 bit_hi = bit_lo + scan_count; - U32 word = bit_array.v[word_idx]; - for (bit_idx = bit_hi; bit_idx >= bit_lo; bit_idx -= 1) { - U32 bit = ExtractBit(word, bit_idx); - if (bit == state) { - goto exit; - } - } - } else { - U32 last_word = bit_array.v[word_idx]; - S64 bit_hi = hi % 32; - for (bit_idx = bit_hi; bit_idx >= 0; bit_idx -= 1) { - U32 bit = ExtractBit(last_word, bit_idx); - if (bit == state) { - goto exit; - } - } - - for (word_idx -= 1; word_idx > word_lo; word_idx -= 1) { - U32 word = bit_array.v[word_idx]; - for (bit_idx = 32 - 1; bit_idx >= 0; bit_idx -= 1) { - U32 bit = ExtractBit(word, bit_idx); - if (bit == state) { - goto exit; - } - } - } - - U32 first_word = bit_array.v[word_idx]; - S64 bit_lo = lo % 32; - for (bit_idx = 32 - 1; bit_idx >= bit_lo; bit_idx -= 1) { - U32 bit = ExtractBit(first_word, bit_idx); - if (bit == state) { - goto exit; - } - } - } - - word_idx = 0; - bit_idx = max_U32; - - exit:; - - S64 result_s64 = word_idx * 32 + bit_idx; - U64 result_u64 = (U64)result_s64; - return result_u64; -} - -internal Rng1U64 -bit_array_scan_left_to_right32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count) -{ - Rng1U64 result = rng_1u64(max_U64, max_U64); - - U64 curr_count = 0, rover = lo; - while (curr_count < in_row_count) { - rover = bit_array_scan_left_to_right32(bit_array, rover, hi, state); - - // no more bits in range - if (rover >= hi) { - break; - } - - // set first match - if (result.v[0] == max_U64) { - result = rng_1u64(rover, rover); - continue; - } - - // reset on non-contiguous range - B32 is_bit_index_not_adjoined = (result.v[0] + 1 < rover); - if (is_bit_index_not_adjoined) { - curr_count = 0; - result = rng_1u64(max_U64, max_U64); - continue; - } - - // advance - result.v[1] = rover; - curr_count -= 1; - } - - // did we allocate enough bits? - if (curr_count != in_row_count) { - result = rng_1u64(max_U64, max_U64); - } - - return result; -} - -internal Rng1U64 -bit_array_scan_right_to_left32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count) -{ - Rng1U64 result = rng_1u64(max_U64, max_U64); - - U64 curr_count = 0, rover = lo; - while (curr_count < in_row_count) { - rover = bit_array_scan_right_to_left32(bit_array, lo, rover, state); - - // no more bits in range - if (rover >= hi) { - break; - } - - // set first match - if (result.v[0] == max_U64) { - result = rng_1u64(rover, rover); - continue; - } - - // reset on non-contiguous range - B32 is_bit_index_not_adjoined = (result.v[0] + 1 < rover); - if (is_bit_index_not_adjoined) { - curr_count = 0; - result = rng_1u64(max_U64, max_U64); - continue; - } - - // advance - result.v[0] = rover; - curr_count -= 1; - } - - // did we allocate enough bits? - if (curr_count != in_row_count) { - result = rng_1u64(max_U64, max_U64); - } - - return result; -} - -internal U64 -bit_array_find_next_unset_bit32(U32Array bit_array) -{ - U64 result = bit_array_scan_left_to_right32(bit_array, 0, bit_array.count*32, 0); - return result; -} - -internal U64 -bit_array_find_next_set_bit32(U32Array bit_array) -{ - U64 result = bit_array_scan_left_to_right32(bit_array, 0, bit_array.count*32, 1); - return result; + return bitscan_msb_index32(bit_array.v, lo, hi, state); } internal void @@ -244,14 +35,6 @@ bit_array_set_bit32(U32Array bit_array, U64 idx, B32 state) } } -internal void -bit_array_set_bit_range32(U32Array bit_array, Rng1U64 range, B32 state) -{ - for (U64 idx = range.min ; idx < range.max; idx += 1) { - bit_array_set_bit32(bit_array, idx, state); - } -} - internal U32 bit_array_get_bit32(U32Array bit_array, U64 idx) { diff --git a/src/linker/base_ext/base_bit_array.h b/src/linker/base_ext/base_bit_array.h index 995facd7..5c76ef32 100644 --- a/src/linker/base_ext/base_bit_array.h +++ b/src/linker/base_ext/base_bit_array.h @@ -3,16 +3,10 @@ #pragma once -internal U32Array bit_array_init32 (Arena *arena, U64 word_count); -internal U64 bit_array_scan_left_to_right32 (U32Array bit_array, U64 lo, U64 hi, B32 state); -internal U64 bit_array_scan_right_to_left32 (U32Array bit_array, U64 lo, U64 hi, B32 state); -internal Rng1U64 bit_array_scan_left_to_right32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count); -internal Rng1U64 bit_array_scan_right_to_left32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count); -internal B32 byte_scan_right_to_left (U8 *start, U8 *opl, U8 byte, U64 *offset_out); -internal U64 bit_array_find_next_unset_bit32 (U32Array bit_array); -internal U64 bit_array_find_next_set_bit32 (U32Array bit_array); -internal void bit_array_set_bit32 (U32Array bit_array, U64 idx, B32 state); -internal void bit_array_set_bit_range32 (U32Array bit_array, Rng1U64 range, B32 state); -internal U32 bit_array_get_bit32 (U32Array bit_array, U64 idx); +internal U32Array bit_array_init32 (Arena *arena, U64 word_count); +internal U64 bit_array_scan_left_to_right32(U32Array bit_array, U64 lo, U64 hi, B32 state); +internal U64 bit_array_scan_right_to_left32(U32Array bit_array, U64 lo, U64 hi, B32 state); +internal void bit_array_set_bit32 (U32Array bit_array, U64 idx, B32 state); +internal U32 bit_array_get_bit32 (U32Array bit_array, U64 idx); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 63c8d163..768d3dd6 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -21,7 +21,6 @@ pdb_hash_table_alloc(PDB_HashTable *ht, U32 max) ht->deleted_bits = bit_array_init32(ht->arena, max); ht->max = max; ht->count = 0; - bit_array_set_bit_range32(ht->deleted_bits, rng_1u64(0, max), 1); ProfEnd(); } @@ -148,51 +147,48 @@ pdb_hash_table_from_data(PDB_HashTable *ht, return error; } +internal int +pdb_hash_table_bucket_is_before(void *raw_a, void *raw_b) +{ + PDB_HashTableBucket *a = *(PDB_HashTableBucket **)raw_a, *b = *(PDB_HashTableBucket **)raw_b; + return a->insert_idx < b->insert_idx; +} + internal String8 -pdb_data_from_hash_table(Arena *arena, - PDB_HashTable *ht, - B32 has_local_data, - PDB_HashTablePackFunc *pack_func, - void *pack_ud) +pdb_data_from_hash_table(Arena *arena, PDB_HashTable *ht, PDB_HashTablePackFunc *pack_func, void *pack_ud) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); - String8Array key_arr = {0}; - String8Array value_arr = {0}; - pdb_hash_table_get_present_keys_and_values(scratch.arena, ht, &key_arr, &value_arr); + String8List kv_srl = {0}; str8_serial_begin(scratch.arena, &kv_srl); + PDB_HashTableBucket **buckets = pdb_hash_table_get_present_buckets(scratch.arena, ht); + for EachIndex(i, ht->count) { pack_func(scratch.arena, &kv_srl, buckets[i], buckets[i]->key, buckets[i]->value, pack_ud); } - String8List local_data_srl = {0}; - String8List key_value_srl = {0}; - str8_serial_begin(scratch.arena, &local_data_srl); - str8_serial_begin(scratch.arena, &key_value_srl); + // compute count of present words that are needed + U64 present_word_count = 0; + U64 present_msb = bit_array_scan_right_to_left32(ht->present_bits, 0, ht->present_bits.count*32, 1); + if (present_msb < ht->present_bits.count*32) { present_word_count = present_msb / 32 + 1; } - for (U64 i = 0; i < ht->count; i += 1) { - String8 key = key_arr.v[i]; - String8 value = value_arr.v[i]; - pack_func(scratch.arena, &local_data_srl, &key_value_srl, key, value, pack_ud); - } + // compute count of deleted words that are needed + U64 deleted_word_count = 0; + U64 deleted_msb = bit_array_scan_right_to_left32(ht->deleted_bits, 0, ht->deleted_bits.count*32, 1); + if (deleted_msb < ht->deleted_bits.count*32) { deleted_word_count = deleted_msb / 32 + 1; } - // serialize hash table - String8List srl = {0}; - str8_serial_begin(scratch.arena, &srl); - if (has_local_data) { - U32 local_data_size32 = safe_cast_u32(local_data_srl.total_size); - str8_serial_push_u32(scratch.arena, &srl, local_data_size32); - str8_list_concat_in_place(&srl, &local_data_srl); - } - str8_serial_push_u32(scratch.arena, &srl, ht->count); - str8_serial_push_u32(scratch.arena, &srl, ht->max); - str8_serial_push_u32(scratch.arena, &srl, ht->present_bits.count); - str8_serial_push_array(scratch.arena, &srl, &ht->present_bits.v[0], ht->present_bits.count); - str8_serial_push_u32(scratch.arena, &srl, ht->deleted_bits.count); - str8_serial_push_array(scratch.arena, &srl, &ht->deleted_bits.v[0], ht->deleted_bits.count); - str8_list_concat_in_place(&srl, &key_value_srl); - String8 data = str8_serial_end(arena, &srl); + // write hash table + String8List ht_srl = {0}; str8_serial_begin(scratch.arena, &ht_srl); + str8_serial_push_u32 (scratch.arena, &ht_srl, ht->count); + str8_serial_push_u32 (scratch.arena, &ht_srl, ht->max); + str8_serial_push_u32 (scratch.arena, &ht_srl, present_word_count); + str8_serial_push_array(scratch.arena, &ht_srl, &ht->present_bits.v[0], present_word_count); + str8_serial_push_u32 (scratch.arena, &ht_srl, deleted_word_count); + str8_serial_push_array(scratch.arena, &ht_srl, &ht->deleted_bits.v[0], deleted_word_count); + str8_list_concat_in_place(&ht_srl, &kv_srl); + + String8 result = str8_serial_end(arena, &ht_srl); scratch_end(scratch); ProfEnd(); - return data; + return result; } internal void @@ -230,8 +226,9 @@ pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value) B32 is_present = pdb_hash_table_is_present(ht, ibucket); if ( ! is_present) { PDB_HashTableBucket *bucket = &ht->bucket_arr[ibucket]; - bucket->key = push_str8_copy(ht->arena, key); - bucket->value = push_str8_copy(ht->arena, value); + bucket->key = push_str8_copy(ht->arena, key); + bucket->value = push_str8_copy(ht->arena, value); + bucket->insert_idx = ht->count; bit_array_set_bit32(ht->present_bits, ibucket, 1); bit_array_set_bit32(ht->deleted_bits, ibucket, 0); @@ -254,7 +251,7 @@ pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value) // should resize? U64 load_factor = pdb_hash_table_compute_load_factor(ht->max); if (ht->count + 1 >= load_factor) { - pdb_hash_table_grow(ht, ht->max * 2); + pdb_hash_table_grow(ht, load_factor * 2); } // set new item @@ -328,6 +325,21 @@ pdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k) return bit_array_is_bit_set(ht->deleted_bits, k); } +internal PDB_HashTableBucket ** +pdb_hash_table_get_present_buckets(Arena *arena, PDB_HashTable *ht) +{ + U64 result_count = 0; + PDB_HashTableBucket **result = push_array(arena, PDB_HashTableBucket *, ht->count); + for EachIndex(bucket_idx, ht->max) { + if (bit_array_is_bit_set(ht->present_bits, bucket_idx)) { + PDB_HashTableBucket *bucket = &ht->bucket_arr[bucket_idx]; + Assert(result_count < ht->count); + result[result_count++] = bucket; + } + } + return result; +} + internal void pdb_hash_table_get_present_keys_and_values(Arena *arena, PDB_HashTable *ht, String8Array *keys_out, String8Array *values_out) { @@ -422,12 +434,7 @@ PDB_HASH_TABLE_PACK_FUNC(pdb_named_stream_ht_pack) { Assert(!ud); Assert(value.size == sizeof(U32)); - - U64 key_data_offset = local_data_srl->total_size; - str8_serial_push_cstr(arena, local_data_srl, key); - - U32 key_data_offset32 = safe_cast_u32(key_data_offset); - str8_serial_push_u32(arena, key_value_srl, key_data_offset32); + str8_serial_push_u32(arena, key_value_srl, bucket->key_offset); str8_serial_push_string(arena, key_value_srl, value); } @@ -436,7 +443,7 @@ PDB_HASH_TABLE_PACK_FUNC(pdb_hash_adj_ht_pack) { Assert(value.size == sizeof(CV_TypeIndex)); - PDB_StringTable *strtab = (PDB_StringTable*)ud; + PDB_StringTable *strtab = ud; PDB_StringIndex string_idx = PDB_INVALID_STRING_INDEX; B32 is_found = pdb_strtab_search(strtab, key, &string_idx); @@ -453,7 +460,7 @@ PDB_HASH_TABLE_PACK_FUNC(pdb_src_header_block_ht_pack) { Assert(value.size == sizeof(PDB_SrcHeaderBlockEntry)); - PDB_StringTable *strtab = (PDB_StringTable*)ud; + PDB_StringTable *strtab = ud; PDB_StringIndex path_idx = 0; B32 is_found = pdb_strtab_search(strtab, key, &path_idx); @@ -488,22 +495,44 @@ pdb_named_stream_ht_from_data(PDB_HashTable *ht, String8 data, U64 *read_bytes_o internal String8 pdb_data_from_hash_adj_hash_table(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab) { - String8 data = pdb_data_from_hash_table(arena, ht, 0, pdb_hash_adj_ht_pack, strtab); - return data; + return pdb_data_from_hash_table(arena, ht, pdb_hash_adj_ht_pack, strtab); } internal String8 pdb_data_from_src_header_block_ht(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab) { - String8 data = pdb_data_from_hash_table(arena, ht, 0, pdb_src_header_block_ht_pack, strtab); - return data; + return pdb_data_from_hash_table(arena, ht, pdb_src_header_block_ht_pack, strtab); } internal String8 pdb_data_from_named_stream_ht(Arena *arena, PDB_HashTable *ht) { - String8 data = pdb_data_from_hash_table(arena, ht, 1, pdb_named_stream_ht_pack, 0); - return data; + Temp scratch = scratch_begin(&arena, 1); + + // serialize names (layout must be in insert order) + String8List key_data_srl = {0}; str8_serial_begin(scratch.arena, &key_data_srl); + { + PDB_HashTableBucket **buckets = pdb_hash_table_get_present_buckets(scratch.arena, ht); + radsort(buckets, ht->count, pdb_hash_table_bucket_is_before); + for EachIndex(i, ht->count) { + buckets[i]->key_offset = key_data_srl.total_size; + str8_serial_push_cstr(scratch.arena, &key_data_srl, buckets[i]->key); + } + } + + // serialize hash table + String8 ht_data = pdb_data_from_hash_table(arena, ht, pdb_named_stream_ht_pack, 0); + + // put names and hash table together + String8List srl = {0}; str8_serial_begin(scratch.arena, &srl); + str8_serial_push_u32(scratch.arena, &srl, safe_cast_u32(key_data_srl.total_size)); + str8_serial_push_data_list(scratch.arena, &srl, key_data_srl.first); + str8_serial_push_string(scratch.arena, &srl, ht_data); + + String8 result = str8_serial_end(arena, &srl); + + scratch_end(scratch); + return result; } //////////////////////////////// @@ -830,126 +859,6 @@ pdb_type_server_alloc(U64 bucket_cap) return ts; } -internal PDB_TypeServer * -pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - PDB_TypeServer *ts = NULL; - - PDB_TpiHeader header = {0}; - msf_stream_seek(msf, sn, 0); - MSF_UInt read_header_size = msf_stream_read_struct(msf, sn, &header); - - // have we read enough bytes? - if (read_header_size != sizeof(PDB_TpiHeader)) { - goto exit; - } - // is lowest non-simple type index valid? - if (header.ti_lo < CV_MinComplexTypeIndex) { - goto exit; - } - // is high non-simple type index valid? - if (header.ti_lo > header.ti_hi) { - goto exit; - } - - // validate hash bucket count - if (header.hash_bucket_count == 0) { - goto exit; - } - if (header.hash_bucket_count > PDB_TYPE_SERVER_HASH_BUCKET_COUNT_MAX) { - goto exit; - } - - // are there enough bytes in the stream to read hash values? - U64 hash_stream_size = msf_stream_get_size(msf, header.hash_sn); - if (header.hash_vals.off + header.hash_vals.size > hash_stream_size) { - goto exit; - } - - ts = pdb_type_server_alloc(header.hash_bucket_count); - - // read & parse code view types - String8 types_data = msf_stream_read_block(ts->arena, msf, sn, header.leaf_data_size); - CV_DebugT debug_t = cv_debug_t_from_data(scratch.arena, types_data, PDB_LEAF_ALIGN); - - // read hash data - U8 *hash_buffer = push_array(scratch.arena, U8, header.hash_vals.size); - msf_stream_seek(msf, header.hash_sn, header.hash_vals.off); - MSF_UInt hash_buffer_size = msf_stream_read(msf, header.hash_sn, hash_buffer, header.hash_vals.size); - Assert(hash_buffer_size == header.hash_vals.size); - - // rebuild type buckets - for (U64 cursor = 0, leaf_idx = 0; - cursor + header.hash_key_size <= hash_buffer_size; - cursor += header.hash_key_size, leaf_idx += 1) { - String8 raw_leaf = cv_debug_t_get_raw_leaf(&debug_t, leaf_idx); - - str8_list_push(ts->arena, &ts->leaf_list, raw_leaf); - - // read out bucket hash - U64 hash = 0; - MemoryCopy(&hash, hash_buffer + cursor, header.hash_key_size); - - // push bucket - PDB_TypeBucket *bucket = push_array(ts->arena, PDB_TypeBucket, 1); - bucket->raw_leaf = raw_leaf; - bucket->type_index = header.ti_lo + leaf_idx; - SLLStackPush(ts->buckets[hash], bucket); - } - - // adjust type buckets - msf_stream_seek(msf, header.hash_sn, header.hash_adj.off); - String8 adjust_data = msf_stream_read_block(scratch.arena, msf, header.hash_sn, header.hash_adj.size); - - // open adjust hash table - PDB_HashTableParseError hash_adj_parse_error = pdb_hash_adj_hash_table_from_data(&ts->hash_adj, adjust_data, strtab, 0); - if (hash_adj_parse_error == PDB_HashTableParseError_OUT_OF_BYTES) { - pdb_hash_table_alloc(&ts->hash_adj, 16); - } else { - Assert(hash_adj_parse_error == PDB_HashTableParseError_OK); - } - - // grab keys and values - String8Array key_arr = {0}; - String8Array value_arr = {0}; - pdb_hash_table_get_present_keys_and_values(scratch.arena, &ts->hash_adj, &key_arr, &value_arr); - - // adjust type buckets - for (U64 i = 0; i < ts->hash_adj.count; i += 1) { - String8 type_name = key_arr.v[i]; - CV_TypeIndex type_index = *(CV_TypeIndex*)value_arr.v[i].str; - - // name -> hash - U64 hash = pdb_hash_v1(type_name); - hash %= ts->bucket_cap; - - // search for type bucket - PDB_TypeBucket *curr, *prev; - for (curr = ts->buckets[hash], prev = 0; curr != 0; prev = curr, curr = curr->next) { - if (curr->type_index == type_index) { - break; - } - } - - // move type to the head - if (prev && curr) { - prev->next = curr->next; - curr->next = ts->buckets[hash]; - ts->buckets[hash] = curr; - } - - Assert(curr); - } - -exit: - scratch_end(scratch); - ProfEnd(); - return ts; -} - internal THREAD_POOL_TASK_FUNC(pdb_write_type_to_bucket_map_32_task) { @@ -1509,7 +1418,7 @@ pdb_info_alloc(U32 age, COFF_TimeStamp time_stamp, Guid guid) info->age = age; info->guid = guid; pdb_strtab_alloc(&info->strtab, 0x3fff); - pdb_hash_table_alloc(&info->named_stream_ht, 4); + pdb_hash_table_alloc(&info->named_stream_ht, 1); pdb_hash_table_alloc(&info->src_header_block_ht, 8); ProfEnd(); return info; @@ -1615,9 +1524,13 @@ pdb_info_build(PDB_InfoContext *info, MSF_Context *msf, MSF_StreamNumber sn) Temp scratch = scratch_begin(0,0); // finalize named streams - pdb_info_build_src_header_block(info, msf); + if (info->src_header_block_ht.count) { + pdb_info_build_src_header_block(info, msf); + } pdb_info_build_link_info(info, msf); - pdb_info_build_names(info, msf); + if (info->strtab.bucket_count > 1) { + pdb_info_build_names(info, msf); + } // serialize named streams hash table String8 named_stream_ht_data = pdb_data_from_named_stream_ht(scratch.arena, &info->named_stream_ht); @@ -1634,6 +1547,7 @@ pdb_info_build(PDB_InfoContext *info, MSF_Context *msf, MSF_StreamNumber sn) str8_serial_begin(scratch.arena, &info_srl); str8_serial_push_struct(scratch.arena, &info_srl, &header); str8_serial_push_string(scratch.arena, &info_srl, named_stream_ht_data); + str8_serial_push_u32(scratch.arena, &info_srl, 0); if (info->flags & PDB_FeatureFlag_HAS_ID_STREAM) { str8_serial_push_u32(scratch.arena, &info_srl, PDB_FeatureSig_VC140); } @@ -1666,12 +1580,9 @@ internal MSF_StreamNumber pdb_push_named_stream(PDB_HashTable *named_stream_ht, MSF_Context *msf, String8 name) { ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); MSF_StreamNumber sn = msf_stream_alloc(msf); - String8 name_cstr = push_cstr(scratch.arena, name); U32 sn32 = (U32)sn; - pdb_hash_table_set(named_stream_ht, name_cstr, str8_struct(&sn32)); - scratch_end(scratch); + pdb_hash_table_set(named_stream_ht, name, str8_struct(&sn32)); ProfEnd(); return sn; } @@ -2665,8 +2576,6 @@ dbi_build_module_info(Arena *arena, PDB_DbiContext *dbi, MSF_Context *msf) // TODO: generate EC info header->src_file = 0; header->pdb_file = 0; - - Assert(header->sn != MSF_INVALID_STREAM_NUMBER); // push module info str8_serial_push_struct(arena, &module_info_list, header); @@ -2941,7 +2850,7 @@ dbi_build_dbg_header(Arena *arena, PDB_DbiContext *dbi, MSF_Context *msf) } internal void -dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht) +dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht, B32 is_stripped) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -2976,6 +2885,10 @@ dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumbe header.flags = 0; header.machine = dbi->machine; header.reserved = 0; + + if (is_stripped) { + header.flags |= PDB_DbiHeaderFlag_Stripped; + } ProfBegin("MSF Write"); @@ -3229,7 +3142,7 @@ pdb_get_guid(PDB_Context *pdb) } internal void -pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi) +pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi, B32 is_stripped) { ProfBeginFunction(); @@ -3244,7 +3157,7 @@ pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTa pdb_type_server_build(tp, ipi, strtab, pdb->msf, PDB_FixedStream_Ipi); } - dbi_build(tp, pdb->dbi, pdb->msf, PDB_FixedStream_Dbi, string_ht); + dbi_build(tp, pdb->dbi, pdb->msf, PDB_FixedStream_Dbi, string_ht, is_stripped); pdb_info_build(pdb->info, pdb->msf, PDB_FixedStream_Info); if (build_gsi) { diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h index 9f6f7a70..527d82a2 100644 --- a/src/linker/pdb_ext/pdb_builder.h +++ b/src/linker/pdb_ext/pdb_builder.h @@ -11,16 +11,12 @@ //////////////////////////////// // Hash table -#define PDB_HASH_TABLE_PACK_FUNC(name) void name(Arena *arena, String8List *local_data_srl, String8List *key_value_srl, String8 key, String8 value, void *ud) -typedef PDB_HASH_TABLE_PACK_FUNC(PDB_HashTablePackFunc); - -#define PDB_HASH_TABLE_UNPACK_FUNC(name) B32 name(void *ud, String8 local_data, String8 key_value_data, U64 *key_value_cursor, String8 *key_out, String8 *value_out) -typedef PDB_HASH_TABLE_UNPACK_FUNC(PDB_HashTableUnpackFunc); - typedef struct PDB_HashTableBucket { String8 key; String8 value; + U32 key_offset; + U32 insert_idx; } PDB_HashTableBucket; typedef struct PDB_HashTable @@ -33,6 +29,12 @@ typedef struct PDB_HashTable U32 count; } PDB_HashTable; +#define PDB_HASH_TABLE_PACK_FUNC(name) void name(Arena *arena, String8List *key_value_srl, PDB_HashTableBucket *bucket, String8 key, String8 value, void *ud) +typedef PDB_HASH_TABLE_PACK_FUNC(PDB_HashTablePackFunc); + +#define PDB_HASH_TABLE_UNPACK_FUNC(name) B32 name(void *ud, String8 local_data, String8 key_value_data, U64 *key_value_cursor, String8 *key_out, String8 *value_out) +typedef PDB_HASH_TABLE_UNPACK_FUNC(PDB_HashTableUnpackFunc); + typedef enum { PDB_HashTableParseError_OK, @@ -331,7 +333,7 @@ typedef struct internal PDB_Context * pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid); internal void pdb_release(PDB_Context **pdb_ptr); -internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi); +internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi, B32 is_stripped); internal void pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine); internal void pdb_set_guid(PDB_Context *pdb, Guid guid); internal void pdb_set_time_stamp(PDB_Context *pdb, COFF_TimeStamp time_stamp); @@ -382,7 +384,7 @@ internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 // DBI internal PDB_DbiContext * dbi_alloc(COFF_MachineType machine, U32 age); -internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht); +internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht, B32 is_stripped); internal void dbi_release(PDB_DbiContext **dbi_ptr); internal PDB_DbiModule * dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path); internal String8 dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); @@ -403,7 +405,7 @@ internal void dbi_build_section_header_stream(PDB_DbiContex internal void pdb_hash_table_alloc(PDB_HashTable *ht, U32 max); internal void pdb_hash_table_release(PDB_HashTable *ht); internal PDB_HashTableParseError pdb_hash_table_from_data(PDB_HashTable *ht, String8 data, B32 has_local_data, PDB_HashTableUnpackFunc *unpack_func, void *unpack_ud, U64 *read_bytes_out); -internal String8 pdb_data_from_hash_table(Arena *arena, PDB_HashTable *ht, B32 has_local_data, PDB_HashTablePackFunc *pack_func, void *pack_ud); +internal String8 pdb_data_from_hash_table(Arena *arena, PDB_HashTable *ht, PDB_HashTablePackFunc *pack_func, void *pack_ud); internal void pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value); internal B32 pdb_hash_table_get(PDB_HashTable *ht, String8 key, String8 *value_out); internal void pdb_hash_table_delete(PDB_HashTable *ht, String8 key); @@ -412,6 +414,7 @@ internal B32 pdb_hash_table_is_present(PDB_HashTable *ht, U3 internal B32 pdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k); internal U32 pdb_hash_table_hash(String8 key); internal void pdb_hash_table_grow(PDB_HashTable *ht, U64 new_capacity); +internal PDB_HashTableBucket ** pdb_hash_table_get_present_buckets(Arena *arena, PDB_HashTable *ht); internal void pdb_hash_table_get_present_keys_and_values(Arena *arena, PDB_HashTable *ht, String8Array *keys_out, String8Array *values_out); //////////////////////////////// diff --git a/src/third_party/martins_bitscan/bitscan.h b/src/third_party/martins_bitscan/bitscan.h new file mode 100644 index 00000000..1945f627 --- /dev/null +++ b/src/third_party/martins_bitscan/bitscan.h @@ -0,0 +1,664 @@ +#pragma once + +#include +#include + +// returns index of bit that is equal to "bit" value in [lo,hi) interval starting from lo position (lsb->msb) +// returns "hi" value if none found, or interval is empty +// "bit" value must be 0 or 1 +// "bits" array should be large enough to allow indexing it with [hi/32] or [hi/64] index + +static inline size_t bitscan_lsb_index32(const uint32_t* bits, size_t lo, size_t hi, int bit); +static inline size_t bitscan_lsb_index64(const uint64_t* bits, size_t lo, size_t hi, int bit); + +// returns index of bit that is equal to "bit" value in [lo,hi) interval starting from hi position (msb->lsb) +// returns "hi" value if none found, or interval is empty +// "bit" value must be 0 or 1 +// "bits" array should be large enough to allow indexing it with [hi/32] or [hi/64] index + +static inline size_t bitscan_msb_index32(const uint32_t* bits, size_t lo, size_t hi, int bit); +static inline size_t bitscan_msb_index64(const uint64_t* bits, size_t lo, size_t hi, int bit); + +// +// implementation +// + +// to run tests: +// cl.exe -O2 -fsanitize=address -DBITSCAN_TEST=1 -TC bitscan.h && bitscan.exe +// clang.exe -O2 -fsanitize=address,undefined -DBITSCAN_TEST=1 -x c bitscan.h && a.exe + +#if !(defined(__GNUC__) || defined(__clang__)) +# include // _BitScanForward/Reverse +#endif + +#if defined(_M_AMD64) || defined(__x86_64__) +# include // SSE2 +#endif + +// count of zero bits, either starting from lsb (trailing), or from msb (leading) +// input value must be non-zero +// bit index is from 0 (lsb) to 31/63 (msb) + +static inline size_t bitscan__ctz32(uint32_t x) +{ +#if defined(__GNUC__) || defined(__clang__) + return __builtin_ctz(x); +#else + unsigned long index; + _BitScanForward(&index, x); + return index; +#endif +} + +static inline size_t bitscan__ctz64(uint64_t x) +{ +#if defined(__GNUC__) || defined(__clang__) + return __builtin_ctzll(x); +#else + unsigned long index; + _BitScanForward64(&index, x); + return index; +#endif +} + +static inline size_t bitscan__clz32(uint32_t x) +{ +#if defined(__GNUC__) || defined(__clang__) + return __builtin_clz(x); +#else + unsigned long index; + _BitScanReverse(&index, x); + return 31 - index; +#endif +} + +static inline size_t bitscan__clz64(uint64_t x) +{ +#if defined(__GNUC__) || defined(__clang__) + return __builtin_clzll(x); +#else + unsigned long index; + _BitScanReverse64(&index, x); + return 63 - index; +#endif +} + +// returns index of first bit "1" in x when scanning from msb downwards +// bit index is from 0 (lsb) to 31/63 (msb) + +static inline size_t bitscan__lindex32(uint32_t x) +{ + return 31 - bitscan__clz32(x); +} +static inline size_t bitscan__lindex64(uint64_t x) +{ + return 63 - bitscan__clz64(x); +} + +size_t bitscan_lsb_index32(const uint32_t* bits, size_t lo, size_t hi, int bit) +{ +#if 0 + + // reference implementation + for (size_t i = lo; i> (i%32)) & 1) == bit) + { + return i; + } + } + +#else + + if (lo >= hi) + { + return hi; + } + + // to be able to use "ctz" for "find first zero bit" + // do xor with this mask, it will flip all bit values + // thus changing operation to "find first set bit" - which allows to use "ctz" + const uint32_t mask = bit ? 0U : ~0U; + + size_t count = hi - lo; + size_t offset = lo / 32; + size_t first = (unsigned)(-(int)lo) % 32; // 0 if lo%32 == 0, otherwise (32 - lo%32) % 32 + + if (first) // first < 32, how many max bits to use in top of first word + { + uint32_t word = bits[offset] ^ mask; + + // first = lo%32 = 18 + // count = 10 + // in cases count > first, clamp it to first + // + // 3 2 1 0 + // 10987654321098765432109876543210 bit index + // ....xxxxxxxxxx.................. + // ^ ^ ^ + // | | | + // | | +------------------ lo%32 = 18 + // | | | + // | +- count -+ count = 10 bits to process + // | | + // +--- first ---+ first = 32 - lo%32 = 14 + + size_t n = (count < first ? count : first); + word &= (~0U >> (32 - n)) << (lo % 32); + + if (word) + { + return offset * 32 + bitscan__ctz32(word); + } + offset += 1; + count -= n; + } + +#if defined(_M_AMD64) || defined(__x86_64__) + while (count >= 128) + { + __m128i words = _mm_loadu_si128((const __m128i*)&bits[offset]); + __m128i cmp = _mm_cmpeq_epi32(words, _mm_set1_epi32(mask)); + + // if all 16-bytes of "words" are same as mask, then m will be 0 + uint16_t m = 1 + (uint16_t)_mm_movemask_epi8(cmp); + if (m) + { + // find word index to use [0,4) + size_t n = bitscan__ctz32(m) / 4; + + uint32_t word = bits[offset + n] ^ mask; + return offset * 32 + n * 32 + bitscan__ctz32(word); + } + + offset += 4; + count -= 128; + } +#endif + + while (count >= 32) + { + uint32_t word = bits[offset] ^ mask; + if (word) + { + return offset * 32 + bitscan__ctz32(word); + } + offset += 1; + count -= 32; + } + + if (count) // now count < 32, how many bits to process in bottom of last word + { + uint32_t word = bits[offset] ^ mask; + + // use first count bits, rest of bits are masked out to 1 + word |= ~0U << count; + + if (word) + { + return offset * 32 + bitscan__ctz32(word); + } + } + +#endif + + return hi; +} + +size_t bitscan_lsb_index64(const uint64_t* bits, size_t lo, size_t hi, int bit) +{ +#if 0 + + // reference implementation + for (size_t i = lo; i < hi; i++) + { + uint64_t word = bits[i / 64]; + if (((word >> (i % 64)) & 1) == bit) + { + return i; + } + } + +#else + + if (lo >= hi) + { + return hi; + } + + const uint64_t mask = bit ? 0ULL : ~0ULL; + + size_t count = hi - lo; + size_t offset = lo / 64; + size_t first = (unsigned)(-(int)lo) % 64; + + if (first) + { + uint64_t word = bits[offset] ^ mask; + + size_t n = (count < first ? count : first); + word &= (~0ULL >> (64 - n)) << (lo % 64); + + if (word) + { + return offset * 64 + bitscan__ctz64(word); + } + offset += 1; + count -= n; + } + +#if defined(_M_AMD64) || defined(__x86_64__) + while (count >= 128) + { + __m128i words = _mm_loadu_si128((const __m128i*)&bits[offset]); + __m128i cmp = _mm_cmpeq_epi32(words, _mm_set1_epi32((uint32_t)mask)); + uint16_t m = 1 + (uint16_t)_mm_movemask_epi8(cmp); + if (m) + { + size_t n = bitscan__ctz32(m) / 8; + + uint64_t word = bits[offset + n] ^ mask; + return offset * 64 + n * 64 + bitscan__ctz64(word); + } + + offset += 2; + count -= 128; + } +#endif + + while (count >= 64) + { + uint64_t word = bits[offset] ^ mask; + if (word) + { + return offset * 64 + bitscan__ctz64(word); + } + offset += 1; + count -= 64; + } + + if (count) + { + uint64_t word = bits[offset] ^ mask; + word |= ~0ULL << count; + + if (word) + { + return offset * 64 + bitscan__ctz64(word); + } + } + +#endif + + return hi; +} + +size_t bitscan_msb_index32(const uint32_t* bits, size_t lo, size_t hi, int bit) +{ +#if 0 + + // reference implementation + for (size_t i = hi; i-- > lo; ) + { + uint32_t word = bits[i/32]; + if (((word >> (i%32)) & 1) == bit) + { + return i; + } + } + +#else + + if (lo >= hi) + { + return hi; + } + + // to be able to use "clz" for "find last zero bit" + // do xor with this mask, it will flip all bit values + // thus changing operation to "find last set bit" - which allows to use "clz" + const uint32_t mask = bit ? 0U : ~0U; + + size_t count = hi - lo; + size_t offset = (hi - 1) / 32; + size_t first = hi % 32; + + if (first) // first < 32, how many max bits to use in bottom of first word + { + uint32_t word = bits[offset] ^ mask; + + // first = hi%32 = 14 + // count = 10 + // in cases count > first, clamp it to first + // + // 3 2 1 0 + // 10987654321098765432109876543210 bit index + // ..................xxxxxxxxxx.... + // ^ ^ + // | | + // +- count -+ count = 10 bits to process + // | + // +-------------- first = 14 + + size_t n = (count < first ? count : first); + word &= (1U << first) - (1U << (first - n)); + + if (word) + { + return offset * 32 + bitscan__lindex32(word); + } + offset -= 1; + count -= n; + } + +#if defined(_M_AMD64) || defined(__x86_64__) + while (count >= 128) + { + __m128i words = _mm_loadu_si128((const __m128i*)&bits[offset - 3]); + __m128i cmp = _mm_cmpeq_epi32(words, _mm_set1_epi32(mask)); + + // if all 16-bytes of "words" are same as mask, then m will be 0xffff + uint16_t m = (uint16_t)_mm_movemask_epi8(cmp); + + if ((uint16_t)(m + 1)) + { + // find word index to use [0,4) + size_t n = bitscan__lindex32((uint16_t)~m) / 4; + + uint32_t word = bits[offset + n - 3] ^ mask; + return offset * 32 + (n - 3) * 32 + bitscan__lindex32(word); + } + offset -= 4; + count -= 128; + } +#endif + + while (count >= 32) + { + uint32_t word = bits[offset] ^ mask; + if (word) + { + return offset * 32 + bitscan__lindex32(word); + } + offset -= 1; + count -= 32; + } + + if (count) // now count < 32, how many bits to process in top of last word + { + uint32_t word = bits[offset] ^ mask; + + // use last count bits, rest of bits are masked out to 0 + word &= ~0U << (32 - count); + + if (word) + { + return offset * 32 + bitscan__lindex32(word); + } + } + +#endif + + return hi; +} + +size_t bitscan_msb_index64(const uint64_t* bits, size_t lo, size_t hi, int bit) +{ +#if 0 + + // reference implementation + for (size_t i = hi; i-- > lo; ) + { + uint64_t word = bits[i/64]; + if (((word >> (i%64)) & 1) == bit) + { + return i; + } + } + +#else + + if (lo >= hi) + { + return hi; + } + + const uint64_t mask = bit ? 0ULL : ~0ULL; + + size_t count = hi - lo; + size_t offset = (hi - 1) / 64; + size_t first = hi % 64; + + if (first) + { + uint64_t word = bits[offset] ^ mask; + + size_t n = (count < first ? count : first); + word &= (1ULL << first) - (1ULL << (first - n)); + + if (word) + { + return offset * 64 + bitscan__lindex64(word); + } + offset -= 1; + count -= n; + } + +#if defined(_M_AMD64) || defined(__x86_64__) + while (count >= 128) + { + __m128i words = _mm_loadu_si128((const __m128i*)&bits[offset - 1]); + __m128i cmp = _mm_cmpeq_epi32(words, _mm_set1_epi32(mask)); + uint16_t m = (uint16_t)_mm_movemask_epi8(cmp); + if ((uint16_t)(m + 1)) + { + size_t n = bitscan__lindex32((uint16_t)~m) / 8; + + uint64_t word = bits[offset + n - 1] ^ mask; + return offset * 64 + (n - 1) * 64 + bitscan__lindex64(word); + } + offset -= 2; + count -= 128; + } +#endif + + while (count >= 64) + { + uint64_t word = bits[offset] ^ mask; + if (word) + { + return offset * 64 + bitscan__lindex64(word); + } + offset -= 1; + count -= 64; + } + + if (count) + { + uint64_t word = bits[offset] ^ mask; + word &= ~0ULL << (64 - count); + + if (word) + { + return offset * 64 + bitscan__lindex64(word); + } + } + +#endif + + return hi; +} + +#if defined(BITSCAN_TEST) + +#include +#include + +static uint64_t random64() +{ + static uint64_t x = 0, w = 0; + x = x*x + (w += 0xb5ad4eceda1ce2a9); + return x = (x>>32) | (x<<32); +} + +#define BIT32_SET(v,i) v[(i)/32] |= 1U << ((i)%32) +#define BIT32_CLEAR(v,i) v[(i)/32] &= ~(1U << ((i)%32)) + +#define BIT64_SET(v,i) v[(i)/64] |= 1ULL << ((i)%64) +#define BIT64_CLEAR(v,i) v[(i)/64] &= ~(1ULL << ((i)%64)) + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define MAX(a,b) ((a) > (b) ? (a) : (b)) + +int main() +{ + enum { kBitCount = 512 }; + enum { kRngCount = 32 }; + + static const size_t offsets[] = + { + 0, 1, 10, 31, 32, 33, 50, 63, 64, 65, 130, kBitCount-65, kBitCount-64, kBitCount-63, kBitCount-33, kBitCount-32, kBitCount-31, kBitCount-1, kBitCount, + }; + size_t offset_count = sizeof(offsets) / sizeof(offsets[0]); + + for (size_t n=0; n<=kBitCount; n++) + { + printf("."); fflush(stdout); + + // bitscan_lsb_index32 + + for (size_t r=0; r= n) continue; + + size_t r; + size_t expected = lo >= hi || hi < n ? hi : n; + + // first n bits are 0, then bit 1 when possible + for (size_t i=0; i= hi || lo >= kBitCount-n ? hi : MIN(hi-1, kBitCount-1-n); + + // last n bits are 0, then bit 1 when possible + for (size_t i=kBitCount-n; i= n) continue; + + size_t r; + size_t expected = lo >= hi || hi < n ? hi : n; + + // first n bits are 0, then bit 1 when possible + for (size_t i = 0; i < n; i++) BIT64_CLEAR(v, i); + if (n < kBitCount) BIT64_SET(v, n); + + r = bitscan_lsb_index64(v, lo, hi, 1); + assert(r == expected); + + // first n bits are 1, then bit 0 when possible + for (size_t i = 0; i < n; i++) BIT64_SET(v, i); + if (n < kBitCount) BIT64_CLEAR(v, n); + + r = bitscan_lsb_index64(v, lo, hi, 0); + assert(r == expected); + } + } + + // bitscan_msb_index64 + + for (size_t r = 0; r < kRngCount; r++) + { + uint64_t v[kBitCount / 64]; + for (size_t i = 0; i < kBitCount / 64; i++) v[i] = random64(); + + for (size_t olo = 0; olo < offset_count; olo++) + for (size_t ohi = 0; ohi < offset_count; ohi++) + { + size_t lo = offsets[olo]; + size_t hi = offsets[ohi]; + if (hi < kBitCount - n) continue; + + size_t r; + size_t expected = lo >= hi || lo >= kBitCount-n ? hi : MIN(hi-1, kBitCount-1-n); + + // last n bits are 0, then bit 1 when possible + for (size_t i = kBitCount - n; i < kBitCount; i++) BIT64_CLEAR(v, i); + if (n < kBitCount) BIT64_SET(v, kBitCount-n-1); + + r = bitscan_msb_index64(v, lo, hi, 1); + assert(r == expected); + + // last n bits are 1, then bit 0 when possible + for (size_t i = kBitCount - n; i < kBitCount; i++) BIT64_SET(v, i); + if (n < kBitCount) BIT64_CLEAR(v, kBitCount-n-1); + + r = bitscan_msb_index64(v, lo, hi, 0); + assert(r == expected); + } + } + } + printf(" OK!\n"); +} + +#endif diff --git a/src/torture/torture_base.c b/src/torture/torture_base.c index 730356ad..ba8e46d4 100644 --- a/src/torture/torture_base.c +++ b/src/torture/torture_base.c @@ -69,4 +69,29 @@ T_BeginTest(str8_list_substr) } } +T_BeginTest(bit_array) +{ + for (U64 start=0; start<32*3; start++) { + for (U64 end=start; end<32*3; end++) { + U32 v[3] = { 0 }; + for (U64 i=start; i= end || lo >= hi || start >= end ? 0 : 1; + U64 idx = bit_array_scan_right_to_left32((U32Array){.v=v, .count=ArrayCount(v)}, lo, hi, 1); + B32 r = idx < hi; + T_Ok(r == expected_r); + if (r) { + T_Ok(idx == expected_idx); + + } + } + } + } + } +} + #undef T_Group diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 207c88f8..51e63860 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -76,6 +76,7 @@ #include "ui/ui_inc.h" #include "dbg_engine/dbg_engine_inc.h" #include "raddbg/raddbg_inc.h" +#include "linker/base_ext/base_crc32.h" #include "linker/base_ext/base_core.h" #include "linker/base_ext/base_arena.h" #include "linker/base_ext/base_arrays.h" @@ -83,6 +84,9 @@ #include "linker/thread_pool/thread_pool.h" #include "linker/codeview_ext/codeview.h" #include "linker/pdb_ext/msf_builder.h" +#include "linker/pdb_ext/pdb.h" +#include "linker/pdb_ext/pdb_helpers.h" +#include "linker/pdb_ext/pdb_builder.h" #include "linker/lnk_cmd_line.h" #include "linker/lnk_cmd_line.c" #include "linker/lnk_log.h" @@ -148,9 +152,13 @@ #include "linker/base_ext/base_arena.c" #include "linker/base_ext/base_arrays.c" #include "linker/base_ext/base_bit_array.c" +#include "linker/base_ext/base_crc32.c" #include "linker/thread_pool/thread_pool.c" #include "linker/codeview_ext/codeview.c" #include "linker/pdb_ext/msf_builder.c" +#include "linker/pdb_ext/pdb.c" +#include "linker/pdb_ext/pdb_helpers.c" +#include "linker/pdb_ext/pdb_builder.c" #include "torture.c" #include "torture_base.c" From b4bbc38ab22f67fc4764b98b52f434809c6aa3f5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 10 Apr 2026 16:42:34 -0700 Subject: [PATCH 352/850] validate info stream --- src/linker/pdb_ext/msf_builder.c | 5 ++- src/linker/pdb_ext/msf_builder.h | 2 +- src/linker/pdb_ext/pdb_builder.c | 41 ++++++++++-------------- src/linker/pdb_ext/pdb_builder.h | 10 +++--- src/torture/torture.c | 16 ++++++++-- src/torture/torture_radlink.c | 53 +++++++++++++++++++++++++++++++- 6 files changed, 90 insertions(+), 37 deletions(-) diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index 3112daaa..eaa2f146 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -1453,10 +1453,9 @@ msf_find_stream(MSF_Context *msf, MSF_StreamNumber sn) } internal void -msf_release(MSF_Context **msf_ptr) +msf_release(MSF_Context *msf) { - arena_release((*msf_ptr)->arena); - *msf_ptr = 0; + arena_release(msf->arena); } internal String8List diff --git a/src/linker/pdb_ext/msf_builder.h b/src/linker/pdb_ext/msf_builder.h index 5dd24660..c07b582a 100644 --- a/src/linker/pdb_ext/msf_builder.h +++ b/src/linker/pdb_ext/msf_builder.h @@ -127,7 +127,7 @@ typedef struct //////////////////////////////// internal MSF_Context * msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm); -internal void msf_release(MSF_Context **msf_ptr); +internal void msf_release(MSF_Context *msf_ptr); internal MSF_Error msf_build(MSF_Context *msf); internal U64 msf_get_save_size(MSF_Context *msf); internal String8List msf_get_page_data_nodes(Arena *arena, MSF_Context *msf); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 768d3dd6..dd670423 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -200,7 +200,8 @@ pdb_hash_table_grow(PDB_HashTable *ht, U64 new_capacity) for (U32 i = 0; i < ht->max; ++i) { if (bit_array_is_bit_set(ht->present_bits, i)) { PDB_HashTableBucket *bucket = &ht->bucket_arr[i]; - B32 is_set = pdb_hash_table_try_set(&new_ht, bucket->key, bucket->value); + PDB_HashTableBucket *is_set = pdb_hash_table_try_set(&new_ht, bucket->key, bucket->value); + is_set->insert_idx = bucket->insert_idx; Assert(is_set); } } @@ -215,11 +216,11 @@ pdb_hash_table_hash(String8 key) return (U16)pdb_hash_v1(key); } -internal B32 +internal PDB_HashTableBucket * pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value) { ProfBeginFunction(); - B32 is_set = 0; + PDB_HashTableBucket *is_set = 0; U32 best_ibucket = pdb_hash_table_hash(key) % ht->max; U32 ibucket = best_ibucket; do { @@ -234,7 +235,7 @@ pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value) bit_array_set_bit32(ht->deleted_bits, ibucket, 0); ht->count += 1; - is_set = 1; + is_set = bucket; break; } ibucket = (ibucket + 1) % ht->max; @@ -255,7 +256,7 @@ pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value) } // set new item - B32 is_set = pdb_hash_table_try_set(ht, key, value); + PDB_HashTableBucket *is_set = pdb_hash_table_try_set(ht, key, value); AssertAlways(is_set); ProfEnd(); @@ -1696,11 +1697,10 @@ gsi_alloc(void) } internal void -gsi_release(PDB_GsiContext **gsi_ptr) +gsi_release(PDB_GsiContext *gsi) { ProfBeginFunction(); - arena_release((*gsi_ptr)->arena); - *gsi_ptr = NULL; + arena_release(gsi->arena); ProfEnd(); } @@ -2238,12 +2238,11 @@ psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumbe } internal void -psi_release(PDB_PsiContext **psi_ptr) +psi_release(PDB_PsiContext *psi) { ProfBeginFunction(); - gsi_release(&(*psi_ptr)->gsi); - arena_release((*psi_ptr)->arena); - *psi_ptr = NULL; + gsi_release(psi->gsi); + arena_release(psi->arena); ProfEnd(); } @@ -2916,11 +2915,10 @@ dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumbe } internal void -dbi_release(PDB_DbiContext **dbi_ptr) +dbi_release(PDB_DbiContext *dbi) { ProfBeginFunction(); - arena_release((*dbi_ptr)->arena); - *dbi_ptr = 0; + arena_release(dbi->arena); ProfEnd(); } @@ -3077,18 +3075,13 @@ pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U3 } internal void -pdb_release(PDB_Context **pdb_ptr) +pdb_release(PDB_Context *pdb) { ProfBeginFunction(); - PDB_Context *pdb = *pdb_ptr; - msf_release(&pdb->msf); - dbi_release(&pdb->dbi); - gsi_release(&pdb->gsi); - for (U64 i = 1; i < ArrayCount(pdb->type_servers); ++i) { - pdb_type_server_release(&pdb->type_servers[i]); - } + dbi_release(pdb->dbi); + gsi_release(pdb->gsi); + for (U64 i = 1; i < ArrayCount(pdb->type_servers); ++i) { pdb_type_server_release(&pdb->type_servers[i]); } arena_release(pdb->arena); - *pdb_ptr = 0; ProfEnd(); } diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h index 527d82a2..a62c2694 100644 --- a/src/linker/pdb_ext/pdb_builder.h +++ b/src/linker/pdb_ext/pdb_builder.h @@ -332,7 +332,7 @@ typedef struct // PDB internal PDB_Context * pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid); -internal void pdb_release(PDB_Context **pdb_ptr); +internal void pdb_release(PDB_Context *pdb); internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi, B32 is_stripped); internal void pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine); internal void pdb_set_guid(PDB_Context *pdb, Guid guid); @@ -359,7 +359,7 @@ internal PDB_SrcError pdb_add_src(PDB_InfoContext *info, MSF_Context *msf, internal PDB_GsiContext * gsi_alloc(void); internal void gsi_build(TP_Context *tp, PDB_GsiContext *gsi, MSF_Context *msf, MSF_StreamNumber gsi_sn, MSF_StreamNumber symbols_sn); -internal void gsi_release(PDB_GsiContext **gsi_ptr); +internal void gsi_release(PDB_GsiContext *gsi); internal void gsi_write_build_result(TP_Context *tp, PDB_GsiBuildResult build, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn); internal PDB_GsiBuildResult gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_base, B32 export_symbol_ptr_arr, U64 msf_page_size); internal U32 gsi_hash(PDB_GsiContext *gsi, String8 input); @@ -373,7 +373,7 @@ internal CV_SymbolNode * gsi_search(PDB_GsiContext *gsi, CV_Symbol *symbol); internal PDB_PsiContext * psi_alloc(void); internal void psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn); -internal void psi_release(PDB_PsiContext **psi_ptr); +internal void psi_release(PDB_PsiContext *psi); internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String8 name); // TODO: @@ -385,7 +385,7 @@ internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 internal PDB_DbiContext * dbi_alloc(COFF_MachineType machine, U32 age); internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht, B32 is_stripped); -internal void dbi_release(PDB_DbiContext **dbi_ptr); +internal void dbi_release(PDB_DbiContext *dbi); internal PDB_DbiModule * dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path); internal String8 dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); internal String8 dbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); @@ -409,7 +409,7 @@ internal String8 pdb_data_from_hash_table(Arena *arena, PDB_Hash internal void pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value); internal B32 pdb_hash_table_get(PDB_HashTable *ht, String8 key, String8 *value_out); internal void pdb_hash_table_delete(PDB_HashTable *ht, String8 key); -internal B32 pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value); +internal PDB_HashTableBucket * pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value); internal B32 pdb_hash_table_is_present(PDB_HashTable *ht, U32 k); internal B32 pdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k); internal U32 pdb_hash_table_hash(String8 key); diff --git a/src/torture/torture.c b/src/torture/torture.c index 702caa4f..f6a332e7 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -114,9 +114,19 @@ t_run_fail_handler(void *raw_ctx) internal T_RunResult t_run(T_Run run) { - T_RunCtx ctx = {0}; - ctx.run = run; - os_safe_call(t_run_caller, t_run_fail_handler, &ctx); + T_RunCtx ctx = { .run = run }; + + B32 do_safe_call = 1; +#if OS_WINDOWS + if (IsDebuggerPresent()) { + do_safe_call = 0; + } +#endif + if (do_safe_call) { + os_safe_call(t_run_caller, t_run_fail_handler, &ctx); + } else { + t_run_caller(&ctx); + } return ctx.result; } diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 69936fef..d3ec8d7f 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4626,7 +4626,58 @@ T_BeginTest(get_msf_stream_pages) T_Ok(stream_data.first->string.size == 1); } - msf_release(&msf); + msf_release(msf); +} + +T_BeginTest(validate_info_stream) +{ + COFF_TimeStamp time_stamp = 123; + U32 age = 1; + Guid guid = { .data1 = max_U32, .data2 = max_U16 - 1, .data3 = max_U16 - 2, .data4 = { 1, 2, 3, 4, 5, 6, 7, 8 } }; + PDB_Context *pdb = pdb_alloc(MSF_DEFAULT_PAGE_SIZE, COFF_MachineType_X64, time_stamp, age, guid); + + char *stream_names[] = { "one", "two", "three", "four", "five" }; + MSF_StreamNumber stream_numbers[ArrayCount(stream_names)] = {0}; + + for EachElement(i, stream_names) { + stream_numbers[i] = pdb_push_named_stream(&pdb->info->named_stream_ht, pdb->msf, str8_cstring(stream_names[i])); + T_Ok(stream_numbers[i] != MSF_INVALID_STREAM_NUMBER); + } + + TP_Context *tp = tp_alloc(arena, 1, 1, str8_lit("foo")); + TP_Arena *tp_arena = tp_arena_alloc(tp); + pdb_build(tp, tp_arena, pdb, (CV_StringHashTable){0}, 1, 0); + + T_Ok(msf_build(pdb->msf) == MSF_Error_OK); + String8List raw_msf_list = msf_get_page_data_nodes(arena, pdb->msf); + T_Ok(t_write_file_list(str8_lit("test.pdb"), raw_msf_list)); + + String8 raw_msf = t_read_file(arena, str8_lit("test.pdb")); + MSF_Parsed *msf_parsed = msf_parsed_from_data(arena, raw_msf); + String8 info_data = msf_data_from_stream(msf_parsed, PDB_FixedStream_Info); + +#if 0 + fprintf(stderr, "\n"); + for EachIndex(i, info_data.size) { + fprintf(stderr, "0x%02x, ", info_data.str[i]); + if (i % 19 == 18 && i > 0) { fprintf(stderr, "\n"); } + } +#endif + U8 expected_info_data[] = { + 0x94, 0x2e, 0x31, 0x01, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfd, + 0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x22, 0x00, 0x00, 0x00, 0x6f, 0x6e, 0x65, 0x00, 0x74, 0x77, + 0x6f, 0x00, 0x74, 0x68, 0x72, 0x65, 0x65, 0x00, 0x66, 0x6f, 0x75, 0x72, 0x00, 0x66, 0x69, 0x76, 0x65, 0x00, 0x2f, + 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x51, 0x33, 0x01, + }; + T_Ok(str8_match(info_data, str8_array_fixed(expected_info_data), 0)); + + pdb_release(pdb); + tp_arena_release(&tp_arena); + tp_release(tp); } T_BeginTest(patch_cv_symbol_tree) From 89a5acba2cab38cb05cffbcf4b7d0b3850498c7f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 10 Apr 2026 16:45:50 -0700 Subject: [PATCH 353/850] WIP stripped PDB --- src/linker/codeview_ext/codeview.c | 17 ++++++ src/linker/codeview_ext/codeview.h | 1 + src/linker/lnk.c | 73 ++++++++++++++++++++++++- src/linker/lnk_config.c | 8 +++ src/linker/lnk_config.h | 4 +- src/linker/lnk_debug_info.c | 88 +++++++++++++++++------------- src/linker/lnk_debug_info.h | 1 + 7 files changed, 152 insertions(+), 40 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index fe24e48b..235d0b45 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -466,6 +466,23 @@ cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 nam return symbol; } +internal B32 +cv_is_gproc(CV_Symbol symbol) +{ + return symbol.kind == CV_SymKind_GPROC32 || + symbol.kind == CV_SymKind_GPROCMIPS || + symbol.kind == CV_SymKind_GPROCIA64 || + symbol.kind == CV_SymKind_GPROC32_ID || + symbol.kind == CV_SymKind_GPROCMIPS_ID || + symbol.kind == CV_SymKind_GPROCIA64_ID || + symbol.kind == CV_SymKind_GPROC16 || + symbol.kind == CV_SymKind_GPROC32_16t || + symbol.kind == CV_SymKind_GPROCMIPS_16t || + symbol.kind == CV_SymKind_GPROC32_ST || + symbol.kind == CV_SymKind_GPROCMIPS_ST || + symbol.kind == CV_SymKind_GPROCIA64_ST; +} + internal B32 cv_is_lproc(CV_Symbol symbol) { diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index 3b477148..6c0219c6 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -364,6 +364,7 @@ internal CV_Symbol cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, internal U64 cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out); internal CV_Symbol cv_symbol_from_string(String8 raw_data); +internal B32 cv_is_gproc(CV_Symbol symbol); internal B32 cv_is_lproc(CV_Symbol symbol); internal B32 cv_is_obj_info(CV_Symbol symbol); internal CV_ObjInfo cv_obj_info_from_symbol(CV_Symbol symbol); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 0ae43fdc..14642ae5 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -2123,7 +2123,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer } ProfBegin("Build * Debug Directories *"); - if (config->debug_mode != LNK_DebugMode_None && config->debug_mode != LNK_DebugMode_Null) { + if (lnk_do_debug_info(config)) { String8 pdb_dir_obj = pe_make_debug_directory_pdb_obj(arena->v[0], config->machine, config->guid, config->age, config->time_stamp, config->pdb_alt_path); lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit("* Debug Directory PDB *"), pdb_dir_obj); } @@ -5298,6 +5298,77 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) lnk_timer_end(LNK_Timer_Pdb); } + // + // stripped PDB + // + if (config->pdb_stripped_name.size != 0) { + CV_DebugS *debug_s_arr = push_array(scratch.arena, CV_DebugS, cv.obj_count); + for EachIndex(obj_idx, cv.obj_count) { + + CV_DebugS *debug_s_dst = &debug_s_arr[obj_idx]; + CV_DebugS *debug_s_src = &cv.debug_s_arr[obj_idx]; + String8List *dst = &debug_s_dst->data_list[CV_C13SubSectionIdxKind_Symbols]; + String8List *src = &debug_s_src->data_list[CV_C13SubSectionIdxKind_Symbols]; + + U64 proc_count = 0; + U64 proc_size = 0; + U64 section = 0; + for EachNode(n, String8Node, src->first) { + for (U64 cursor = 0; cursor < n->string.size; ) { + U64 c = cursor; + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + if (symbol.kind == CV_SymKind_SKIP) { continue; } + if (cv_is_lproc(symbol)) { + proc_count += 1; + proc_size += AlignPow2(symbol.data.size, CV_SymbolAlign); + } + } + section += 1; + } + + if (proc_count) { + U64 end_count = proc_count; + U64 symbol_count = proc_count + end_count; + U64 buffer_size = proc_size + sizeof(CV_SymbolHeader) * symbol_count; + U8 *buffer = push_array(scratch.arena, U8, buffer_size); + U64 buffer_cursor = 0; + + for EachNode(n, String8Node, src->first) { + for (U64 cursor = 0; cursor < n->string.size; ) { + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + if (symbol.kind == CV_SymKind_SKIP) { continue; } + if (cv_is_lproc(symbol)) { + CV_SymProc32 *src_proc = (CV_SymProc32 *)symbol.data.str; + src_proc->itype = 0; + + CV_Symbol end_symbol = { .kind = CV_SymKind_END }; + + buffer_cursor += cv_write_symbol(buffer, buffer_cursor, buffer_size, &symbol, CV_SymbolAlign); + buffer_cursor += cv_write_symbol(buffer, buffer_cursor, buffer_size, &end_symbol, CV_SymbolAlign); + } + } + } + Assert(buffer_cursor == buffer_size); + + str8_list_push(scratch.arena, dst, str8(buffer, buffer_size)); + } + } + + LNK_CodeViewInput stripped_cv = {0}; + stripped_cv.io_flags = config->io_flags; + stripped_cv.is_stripped = 1; + stripped_cv.obj_arr = cv.obj_arr; + stripped_cv.obj_count = cv.obj_count; + stripped_cv.count = cv.obj_count; + stripped_cv.debug_s_arr = debug_s_arr; + stripped_cv.symbol_input_ranges = push_array(scratch.arena, Rng1U64, tp->worker_count); + + String8List pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &stripped_cv, (LNK_MergedTypes){0}); + lnk_write_data_list_to_file_path(config->pdb_stripped_name, str8f(scratch.arena, "%S.tmp", config->pdb_stripped_name), pdb_data); + } + lnk_timer_end(LNK_Timer_Debug); ProfEnd(); } diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index ffb665b5..62b84851 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -53,6 +53,7 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Pdb, 0, "PDB", ":FILENAME", "File name of the output PDB." }, { LNK_CmdSwitch_PdbAltPath, 0, "PDBALTPATH", ":PATH", "Alternative output path for the PDB." }, { LNK_CmdSwitch_PdbPageSize, 0, "PDBPAGESIZE", ":#", "Page size must be power of two." }, + { LNK_CmdSwitch_PdbStripped, 0, "PDBSTRIPPED", ":FILENAME", "Create a stripped PDB containing public symbols, a section map, and a list of object files." }, { LNK_CmdSwitch_Release, 1, "RELEASE", "", "Write image checksum." }, { LNK_CmdSwitch_Stack, 1, "STACK", ":RESERVE[,COMMIT]", "Set reserve and commit size for the stack." }, { LNK_CmdSwitch_SubSystem, 1, "SUBSYSTEM", ":{CONSOLE|NATIVE|WINDOWS}[,#[.##]]", "Set subsystem for the image." }, @@ -1721,6 +1722,13 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; + case LNK_CmdSwitch_PdbStripped: { + String8 file_name; + if (lnk_cmd_switch_parse_string(obj, cmd_switch, value_strings, &file_name)) { + config->pdb_stripped_name = str8_copy(config->arena, file_name); + } + } break; + case LNK_CmdSwitch_Release: { if (value_strings.node_count == 0) { config->flags |= LNK_ConfigFlag_WriteImageChecksum; diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 56b1eb4a..e3bb81ba 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -50,8 +50,8 @@ typedef enum LNK_CmdSwitch_FailIfMismatch, LNK_CmdSwitch_FileAlign, LNK_CmdSwitch_Fixed, - LNK_CmdSwitch_FunctionPadMin, LNK_CmdSwitch_Force, + LNK_CmdSwitch_FunctionPadMin, LNK_CmdSwitch_Heap, LNK_CmdSwitch_HighEntropyVa, LNK_CmdSwitch_Ignore, @@ -79,6 +79,7 @@ typedef enum LNK_CmdSwitch_Pdb, LNK_CmdSwitch_PdbAltPath, LNK_CmdSwitch_PdbPageSize, + LNK_CmdSwitch_PdbStripped, LNK_CmdSwitch_Release, LNK_CmdSwitch_Stack, LNK_CmdSwitch_SubSystem, @@ -312,6 +313,7 @@ typedef struct LNK_Config String8List raw_cmd_line; String8 pdb_name; String8 pdb_alt_path; + String8 pdb_stripped_name; String8 mt_path; LNK_TypeNameHashMode pdb_hash_type_names; String8 pdb_hash_type_name_map; diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 59f28680..1f720f57 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -2046,30 +2046,33 @@ lnk_write_debug_s_to_pdb_module(PDB_DbiModule *mod, CV_DebugS debug_s, String8No mod->c13_data_size = 0; mod->globrefs_size = 0; - // signature - U64 sig_size = str8_buffer_write_u32(buf, buf_pos, CV_Signature_C13); - mod->sym_data_size += sig_size; - mod_cursor += sig_size; - - // write symbols String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); - U64 scope_depth = 0; - for EachNode(n, String8Node, symbols.first) { - for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { - CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); - if (symbol.kind == CV_SymKind_SKIP) { continue; } - if (cv_is_global_symbol(symbol.kind)) { continue; } - else if (cv_is_typedef(symbol.kind) && scope_depth == 0) { continue; } - else if (symbol.kind == 0x1176) { continue; } + if (symbols.total_size) { + // signature + U64 sig_size = str8_buffer_write_u32(buf, buf_pos, CV_Signature_C13); + mod->sym_data_size += sig_size; + mod_cursor += sig_size; - if (cv_is_scope_symbol(symbol.kind)) { scope_depth += 1; } - else if (cv_is_end_symbol(symbol.kind)) { scope_depth -= 1; } + // write symbols + U64 scope_depth = 0; + for EachNode(n, String8Node, symbols.first) { + for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { + CV_Symbol symbol = {0}; + TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); + if (symbol.kind == CV_SymKind_SKIP) { continue; } - U64 symbol_size = cv_write_symbol_buf(buf, buf_pos, &symbol, PDB_SYMBOL_ALIGN); - mod_cursor += symbol_size; - mod->sym_data_size += symbol_size; + if (cv_is_global_symbol(symbol.kind)) { continue; } + else if (cv_is_typedef(symbol.kind) && scope_depth == 0) { continue; } + else if (symbol.kind == 0x1176) { continue; } + + if (cv_is_scope_symbol(symbol.kind)) { scope_depth += 1; } + else if (cv_is_end_symbol(symbol.kind)) { scope_depth -= 1; } + + U64 symbol_size = cv_write_symbol_buf(buf, buf_pos, &symbol, PDB_SYMBOL_ALIGN); + mod_cursor += symbol_size; + mod->sym_data_size += symbol_size; + } } } @@ -2112,10 +2115,12 @@ lnk_write_debug_s_to_pdb_module(PDB_DbiModule *mod, CV_DebugS debug_s, String8No } // write global refs - String8List globrefs = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_GlobalRefs); - mod->globrefs_size += str8_buffer_write_u32(buf, buf_pos, safe_cast_u32(globrefs.total_size)); - mod->globrefs_size += str8_buffer_write_string_list(buf, buf_pos, globrefs); - mod_cursor += mod->globrefs_size; + if (mod->sym_data_size) { + String8List globrefs = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_GlobalRefs); + mod->globrefs_size += str8_buffer_write_u32(buf, buf_pos, safe_cast_u32(globrefs.total_size)); + mod->globrefs_size += str8_buffer_write_string_list(buf, buf_pos, globrefs); + mod_cursor += mod->globrefs_size; + } return mod_cursor; } @@ -2153,6 +2158,9 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) U64 obj_idx = obj_indices.v[i]; PDB_DbiModule *mod = task->mod_arr[obj_idx]; + + if (mod->sn == MSF_INVALID_STREAM_NUMBER) { continue; } + CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; String8List mod_data = msf_data_from_sn(temp.arena, task->pdb->msf, mod->sn); @@ -2162,10 +2170,12 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) lnk_write_debug_s_to_pdb_module(mod, debug_s, &buf, &pos); // sub range symbol data pages and patch symbol tree offsets - Rng1U64 sym_data_range = r1u64(sizeof(CV_Signature), mod->sym_data_size); - String8List mod_symbols = str8_list_substr(temp.arena, mod_data, sym_data_range); - Assert(mod_symbols.total_size == dim_1u64(sym_data_range)); - cv_patch_symbol_tree_offsets(mod_symbols, sizeof(CV_Signature), PDB_SYMBOL_ALIGN); + if (mod->sym_data_size) { + Rng1U64 sym_data_range = r1u64(sizeof(CV_Signature), mod->sym_data_size); + String8List mod_symbols = str8_list_substr(temp.arena, mod_data, sym_data_range); + Assert(mod_symbols.total_size == dim_1u64(sym_data_range)); + cv_patch_symbol_tree_offsets(mod_symbols, sizeof(CV_Signature), PDB_SYMBOL_ALIGN); + } } temp_end(temp); @@ -2204,11 +2214,14 @@ THREAD_POOL_TASK_FUNC(lnk_write_pdb_modules) for EachIndex(i, obj_indices.count) { Temp temp = temp_begin(scratch.arena); - U64 obj_idx = obj_indices.v[i]; - PDB_DbiModule *mod = task->mod_arr[obj_idx]; - String8List mod_data = msf_data_from_sn(temp.arena, task->pdb->msf, mod->sn); - Rng1U64 c13_data_range = r1u64(mod->sym_data_size + mod->c11_data_size, mod->sym_data_size + mod->c11_data_size + mod->c13_data_size); - String8List c13_data = str8_list_substr(temp.arena, mod_data, c13_data_range); + U64 obj_idx = obj_indices.v[i]; + PDB_DbiModule *mod = task->mod_arr[obj_idx]; + + if (mod->sn == MSF_INVALID_STREAM_NUMBER) { continue; } + + String8List mod_data = msf_data_from_sn(temp.arena, task->pdb->msf, mod->sn); + Rng1U64 c13_data_range = r1u64(mod->sym_data_size + mod->c11_data_size, mod->sym_data_size + mod->c11_data_size + mod->c13_data_size); + String8List c13_data = str8_list_substr(temp.arena, mod_data, c13_data_range); CV_DebugS debug_s = task->cv->debug_s_arr[obj_idx]; String8 string_table = cv_string_table_from_debug_s(debug_s); @@ -2359,9 +2372,11 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config .image_section_virt_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count), .image_section_file_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count), }; + // set min type indices for EachElement(ti_source, cv_types.min_type_indices) { task.pdb->type_servers[ti_source]->ti_lo = cv_types.min_type_indices[ti_source]; } + // per worker obj indices { U64 objs_per_worker = CeilIntegerDiv(cv->obj_count, tp->worker_count); task.obj_indices = push_array(scratch.arena, U32Array, tp->worker_count); @@ -2372,10 +2387,7 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config } } - // move patched type data - // - // leaf data is stored in g_file_arena which has linker's life-time - // and this way we skip redundant leaf copy to the type server to make things faster + // push types pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_IPI], cv_types.count[CV_TypeIndexSource_IPI], cv_types.v[CV_TypeIndexSource_IPI]); pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_TPI], cv_types.count[CV_TypeIndexSource_TPI], cv_types.v[CV_TypeIndexSource_TPI]); @@ -2453,7 +2465,7 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config } ProfEnd(); - pdb_build(tp, tp_arena, task.pdb, task.string_ht, 0); + pdb_build(tp, tp_arena, task.pdb, task.string_ht, 0, cv->is_stripped); MSF_Error msf_err = msf_build(task.pdb->msf); if (msf_err != MSF_Error_OK) { diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index b70bf6a0..3ab66c4a 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -27,6 +27,7 @@ typedef struct { LNK_IO_Flags io_flags; U64 obj_count; + B32 is_stripped; U64 count; LNK_Obj **obj_arr; From 40763c06cfdf9321c549bbac18dc245b8ae0c9b4 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 11 Apr 2026 12:50:41 -0700 Subject: [PATCH 354/850] swap dynamic and static libs --- src/linker/lnk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 14642ae5..1798e071 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1651,7 +1651,7 @@ lnk_link_inputs(TP_Context *tp, lnk_symbol_table_searchf(symtab, "___you_must_link_with_VCAsan_lib") != 0; if (str8_match(crt_lib_name, str8_lit("msvcrt"), StringMatchFlag_CaseInsensitive) || str8_match(crt_lib_name, str8_lit("msvcrtd"), StringMatchFlag_CaseInsensitive)) { String8 dynamic_lib_name = str8f(inputer->arena, "clang_rt.asan_dynamic-%S.lib", arch_name); - String8 thunk_lib_name = str8f(inputer->arena, "clang_rt.asan_static_runtime_thunk-%S.lib", arch_name); + String8 thunk_lib_name = str8f(inputer->arena, "clang_rt.asan_dynamic_runtime_thunk-%S.lib", arch_name); lnk_whole_archive(config, thunk_lib_name); lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, dynamic_lib_name); lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, thunk_lib_name); @@ -1664,7 +1664,7 @@ lnk_link_inputs(TP_Context *tp, } } else if (str8_match(crt_lib_name, str8_lit("libcmt"), StringMatchFlag_CaseInsensitive) || str8_match(crt_lib_name, str8_lit("libcmtd"), StringMatchFlag_CaseInsensitive)) { String8 dynamic_lib_name = str8f(inputer->arena, "clang_rt.asan_dynamic-%S.lib", arch_name); - String8 thunk_lib_name = str8f(inputer->arena, "clang_rt.asan_dynamic_runtime_thunk-%S.lib", arch_name); + String8 thunk_lib_name = str8f(inputer->arena, "clang_rt.asan_static_runtime_thunk-%S.lib", arch_name); lnk_whole_archive(config, thunk_lib_name); lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, dynamic_lib_name); lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, thunk_lib_name); From 36d18e440bfcca389c2fe3812b5d283b15bc6bb2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 11 Apr 2026 12:51:00 -0700 Subject: [PATCH 355/850] delete exes to appease windows defender --- src/torture/torture_radlink.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index d3ec8d7f..9d724928 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4901,18 +4901,18 @@ T_BeginTest(infer_asan) #if OS_WINDOWS T_BeginTest(determ_test) { - // compile the test target (torture) - String8 cl_line = str8f(arena, "/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); - String8 cl_out = {0}; - t_invoke_(t_cl_path(), cl_line, max_U64, arena, &cl_out); - T_Ok(g_last_exit_code == 0); - // clean up t_delete_file(str8_lit("a.exe")); t_delete_file(str8_lit("b.exe")); t_delete_file(str8_lit("a.pdb")); t_delete_file(str8_lit("b.pdb")); + // compile the test target (torture) + String8 cl_line = str8f(arena, "/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); + String8 cl_out = {0}; + t_invoke_(t_cl_path(), cl_line, max_U64, arena, &cl_out); + T_Ok(g_last_exit_code == 0); + // single-threaded link String8 refs_path = t_make_file_path(arena, str8_lit("b.types")); t_invoke_linkerf("test.obj /debug:full /rad_time_stamp:0 /rad_workers:1 /rad_store_types:%S /out:a.exe", refs_path); @@ -4930,7 +4930,9 @@ T_BeginTest(determ_test) for EachIndex(i, 50) { Temp temp = temp_begin(arena); + t_delete_file(str8_lit("a.exe")); t_delete_file(str8_lit("a.pdb")); + t_invoke_linkerf("test.obj /debug:full /rad_time_stamp:0 /out:a.exe"); T_Ok(g_last_exit_code == 0); From 1839187a3cac152d4ed8ef8aaa1edc4c8bdcb814 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 11 Apr 2026 13:41:44 -0700 Subject: [PATCH 356/850] sort records must be rebased --- src/linker/pdb_ext/pdb_builder.c | 24 +++++++++--------------- src/linker/pdb_ext/pdb_builder.h | 1 + 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index dd670423..e0a83335 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1900,7 +1900,7 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx]; sr->isect_off = isect_off(pub32->sec, pub32->off); sr->name = name; - sr->offset = buffer_cursor; + sr->offset = task->symbol_data_base + buffer_base + buffer_cursor; // serialize symbol U64 serial_size = cv_write_symbol(buffer, buffer_cursor, buffer_size, symbol_arr[i], task->symbol_align); @@ -1946,7 +1946,7 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_symbols_task) // init sort record PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx]; sr->name = cv_name_from_symbol(symbol_arr[i]->kind, symbol_arr[i]->data); - sr->offset = buffer_cursor; + sr->offset = task->symbol_data_base + buffer_base + buffer_cursor; sort_idx += 1; // serialize symbol @@ -1969,10 +1969,11 @@ gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_ ProfBegin("Serialize & Sort Symbols"); - PDB_GsiSerializeSymbolsTask serial_task; - serial_task.symbol_align = gsi->symbol_align; - serial_task.bucket_arr = gsi->bucket_arr; - serial_task.bucket_size_arr = push_array(scratch.arena, U64, gsi->bucket_count); + PDB_GsiSerializeSymbolsTask serial_task = {0}; + serial_task.symbol_data_base = symbol_data_base; + serial_task.symbol_align = gsi->symbol_align; + serial_task.bucket_arr = gsi->bucket_arr; + serial_task.bucket_size_arr = push_array(scratch.arena, U64, gsi->bucket_count); // estimate each bucket size tp_for_parallel(tp, 0, gsi->bucket_count, gsi_size_buckets_task, &serial_task); @@ -2004,12 +2005,8 @@ gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_ U32 *compressed_offset_arr = push_array_no_zero(arena, U32, gsi->bucket_count); PDB_GsiHashRecord *hash_record_arr = push_array_no_zero(arena, PDB_GsiHashRecord, hash_record_count); - // offsets for symbol stream are shifted by one to tell apart from null and zero (see GSI1::fixSymRecs) - U64 offset_cursor = (1 + symbol_data_base); - U64 hash_idx = 0; - ProfBegin("Write Bitmap & Record Offsets"); - for (U64 bucket_idx = 0; bucket_idx < gsi->bucket_count; bucket_idx += 1) { + for (U64 bucket_idx = 0, hash_idx = 0; bucket_idx < gsi->bucket_count; bucket_idx += 1) { // set bit for each occupied bucket CV_SymbolList bucket_list = gsi->bucket_arr[bucket_idx]; if (bucket_list.count) { @@ -2024,12 +2021,9 @@ gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_ PDB_GsiSortRecord *sort_record_arr = serial_task.sort_record_arr_arr[bucket_idx]; for (U64 sr_idx = 0; sr_idx < gsi->bucket_arr[bucket_idx].count; sr_idx += 1, hash_idx += 1) { PDB_GsiHashRecord *hr = &hash_record_arr[hash_idx]; - hr->symbol_off = offset_cursor + sort_record_arr[sr_idx].offset; + hr->symbol_off = sort_record_arr[sr_idx].offset + 1; // off-by-one because 0 is reserved for null hr->cref = 1; } - - // advance offset cursor - offset_cursor += serial_task.bucket_size_arr[bucket_idx]; } ProfEnd(); diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h index a62c2694..b4d0909e 100644 --- a/src/linker/pdb_ext/pdb_builder.h +++ b/src/linker/pdb_ext/pdb_builder.h @@ -209,6 +209,7 @@ typedef struct PDB_GsiBuildResult typedef struct PDB_GsiSerializeSymbolsTask { + U64 symbol_data_base; U64 symbol_align; CV_SymbolList *bucket_arr; U64 *bucket_size_arr; From 0299b6922f93e0cca36bdbba9d3c12a7b29c281f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 11 Apr 2026 13:42:26 -0700 Subject: [PATCH 357/850] sort global symbols deterministically within GSI bucket --- src/linker/lnk_debug_info.c | 1 + src/linker/pdb_ext/pdb_builder.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 1f720f57..b5ecceb0 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1839,6 +1839,7 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) CV_SymbolNode *n = &nodes[i]; n->prev = n->next = 0; n->data = cv_symbol_from_ptr(symbol_arr[i]); + n->data.offset = i; gsi_push_(gsi, symbol_hashes[i], n); } } diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index e0a83335..e88b40b2 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1827,7 +1827,11 @@ gsi_symbol_is_before(void *raw_a, void *raw_b) if (a_name.size != b_name.size) { is_before = a_name.size < b_name.size; } else { - is_before = str8_compar_ignore_case(&a_name, &b_name) < 0; + int cmp = str8_compar_ignore_case(&a_name, &b_name); + if (cmp == 0) { + cmp = u64_compar(&a->offset, &b->offset); + } + is_before = cmp < 0; } return is_before; From e5664faccea512eee4714cc30dd573e0ab4f223b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 11 Apr 2026 13:46:49 -0700 Subject: [PATCH 358/850] delete existing files before running test --- src/torture/torture.c | 33 +++++++++++++++++++++++++++++++++ src/torture/torture_radlink.c | 6 ------ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index f6a332e7..762aca4b 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -71,6 +71,33 @@ t_delete_file(String8 name) return is_deleted; } +internal void +t_delete_dir(String8 path) +{ + Temp scratch = scratch_begin(0,0); + + OS_FileIter *file_iter = os_file_iter_begin(scratch.arena, path, 0); + for (;;) { + OS_FileInfo info = {0}; + if ( ! os_file_iter_next(scratch.arena, file_iter, &info)) { break; } + + if (info.props.flags & FilePropertyFlag_IsFolder) { + t_delete_dir(str8f(scratch.arena, "%S/%S", path, info.name)); + continue; + } + + String8 file_path = str8f(scratch.arena, "%S/%S", path, info.name); + if ( ! os_delete_file_at_path(file_path)) { + fprintf(stderr, "ERROR: unable to delete file %.*s\n", str8_varg(file_path)); + } + } + os_file_iter_end(file_iter); + + // TODO: delete directories + + scratch_end(scratch); +} + internal String8 t_make_file_path(Arena *arena, String8 name) { @@ -542,7 +569,13 @@ t_entry_point(CmdLine *cmdline) // setup output directory g_wdir = push_str8f(scratch.arena, "%S\\%s", g_out, g_torture_tests[target_idx].label); g_wdir = os_full_path_from_path(scratch.arena, g_wdir); + + // delete files from last run in the work directory + if (os_folder_path_exists(g_wdir)) { + t_delete_dir(g_wdir); + } os_make_directory(g_wdir); + if (!os_folder_path_exists(g_out)) { fprintf(stderr, "ERROR: unable to create output directory for test run %.*s\n", str8_varg(g_wdir)); continue; diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 9d724928..61a2db4c 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4901,12 +4901,6 @@ T_BeginTest(infer_asan) #if OS_WINDOWS T_BeginTest(determ_test) { - // clean up - t_delete_file(str8_lit("a.exe")); - t_delete_file(str8_lit("b.exe")); - t_delete_file(str8_lit("a.pdb")); - t_delete_file(str8_lit("b.pdb")); - // compile the test target (torture) String8 cl_line = str8f(arena, "/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); String8 cl_out = {0}; From 294ede01a2f7b7e16489cef077808508d03937b5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 11 Apr 2026 14:16:07 -0700 Subject: [PATCH 359/850] skip empty hash table adjuster --- src/linker/pdb_ext/pdb_builder.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index e88b40b2..782fb53c 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -904,8 +904,6 @@ pdb_type_hash_stream_build(TP_Context *tp, ProfEnd(); } - // write bucket adjust info - String8 hash_adj_data = pdb_data_from_hash_adj_hash_table(scratch.arena, &ts->hash_adj, strtab); ProfBegin("MSF Write"); @@ -925,10 +923,14 @@ pdb_type_hash_stream_build(TP_Context *tp, hint_offs.size = sizeof(hint_arr[0]) * hint_count; msf_stream_write(msf, ts->hash_sn, &hint_arr[0], hint_offs.size); - PDB_OffsetSize hash_adj; - hash_adj.off = msf_stream_get_pos(msf, ts->hash_sn); - hash_adj.size = hash_adj_data.size; - msf_stream_write_string(msf, ts->hash_sn, hash_adj_data); + PDB_OffsetSize hash_adj = {0}; + if (ts->hash_adj.count) { + // write bucket adjust info + String8 hash_adj_data = pdb_data_from_hash_adj_hash_table(scratch.arena, &ts->hash_adj, strtab); + hash_adj.off = msf_stream_get_pos(msf, ts->hash_sn); + hash_adj.size = hash_adj_data.size; + msf_stream_write_string(msf, ts->hash_sn, hash_adj_data); + } ProfEnd(); From 21eb134f24f4a6859949cc69ea0b8146e1ab6d13 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 13 Apr 2026 14:39:09 -0700 Subject: [PATCH 360/850] formalized addr bar in memory view, complete first pass of memory view peek types, various fixes --- src/eval/eval_core.c | 2 +- src/raddbg/generated/raddbg.meta.c | 11 +- src/raddbg/generated/raddbg.meta.h | 3 +- src/raddbg/raddbg.mdesk | 10 +- src/raddbg/raddbg_core.c | 31 +++ src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_views.c | 388 ++++++++++++++++++++++++----- src/raddbg/raddbg_widgets.c | 5 + src/ui/ui_core.h | 1 + 9 files changed, 377 insertions(+), 75 deletions(-) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 0adf8c3c..80150fd6 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -1094,7 +1094,7 @@ e_value_eval_from_eval(E_Eval eval) // rjf: manually sign-extend switch(type_kind) { - default: break; + default:{}break; case E_TypeKind_Char8: case E_TypeKind_S8: {eval.value.s64 = (S64)*((S8 *)&eval.value.u64);}break; case E_TypeKind_Char16: diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 34ed91f3..5e7195d4 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[359] = +RD_VocabInfo rd_vocab_info_table[360] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -291,6 +291,7 @@ RD_VocabInfo rd_vocab_info_table[359] = {str8_lit_comp("edit"), str8_lit_comp(""), str8_lit_comp("Edit"), str8_lit_comp(""), RD_IconKind_Pencil}, {str8_lit_comp("accept"), str8_lit_comp(""), str8_lit_comp("Accept"), str8_lit_comp(""), RD_IconKind_CheckFilled}, {str8_lit_comp("cancel"), str8_lit_comp(""), str8_lit_comp("Cancel"), str8_lit_comp(""), RD_IconKind_X}, +{str8_lit_comp("focus_menu"), str8_lit_comp(""), str8_lit_comp("Focus Menu"), str8_lit_comp(""), RD_IconKind_List}, {str8_lit_comp("move_left"), str8_lit_comp(""), str8_lit_comp("Move Left"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("move_right"), str8_lit_comp(""), str8_lit_comp("Move Right"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("move_up"), str8_lit_comp(""), str8_lit_comp("Move Up"), str8_lit_comp(""), RD_IconKind_Null}, @@ -436,7 +437,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[26] = {str8_lit_comp("list"), str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, {str8_lit_comp("text"), str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, {str8_lit_comp("disasm"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n 'arch': code_string,\n 'syntax': code_string,\n 'size': expr_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, -{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @display_name(\"Peek Types\") @description(\"A list of types to interpret selected and hovered memory as.\")\n 'peek_types': query,\n}\n")}, +{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': query,\n}\n")}, {str8_lit_comp("bitmap"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, {str8_lit_comp("color"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, {str8_lit_comp("geo3d"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, @@ -561,7 +562,7 @@ Rng1U64 rd_reg_slot_range_table[49] = {OffsetOf(RD_Regs, os_event), OffsetOf(RD_Regs, os_event) + sizeof(OS_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[248] = +RD_CmdKindInfo rd_cmd_kind_info_table[249] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}}, @@ -679,6 +680,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[248] = { str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, +{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, @@ -813,7 +815,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[248] = { str8_lit_comp("geo3d"), str8_lit_comp("Opens a Geometry (3D) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, }; -struct {String8 string; CFG_Binding binding;} rd_default_binding_table[117] = +struct {String8 string; CFG_Binding binding;} rd_default_binding_table[118] = { {str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_Modifier_Shift }}, {str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_Modifier_Alt}}, @@ -869,6 +871,7 @@ struct {String8 string; CFG_Binding binding;} rd_default_binding_table[117] = {str8_lit_comp("accept"), {OS_Key_Return, 0 }}, {str8_lit_comp("accept"), {OS_Key_Space, 0 }}, {str8_lit_comp("cancel"), {OS_Key_Esc, 0 }}, +{str8_lit_comp("focus_menu"), {OS_Key_D, 0 |OS_Modifier_Alt}}, {str8_lit_comp("move_left"), {OS_Key_Left, 0 }}, {str8_lit_comp("move_right"), {OS_Key_Right, 0 }}, {str8_lit_comp("move_up"), {OS_Key_Up, 0 }}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index dda99eec..9f2cd81c 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -178,6 +178,7 @@ RD_CmdKind_ProjectSettings, RD_CmdKind_Edit, RD_CmdKind_Accept, RD_CmdKind_Cancel, +RD_CmdKind_FocusMenu, RD_CmdKind_MoveLeft, RD_CmdKind_MoveRight, RD_CmdKind_MoveUp, @@ -601,7 +602,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[359]; +extern RD_VocabInfo rd_vocab_info_table[360]; extern RD_NameSchemaInfo rd_name_schema_info_table[26]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 45e5f582..006362ee 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -550,13 +550,19 @@ RD_VocabTable: 'cursor_size': @range[1, 16] u64, @expand_if("!$.auto_columns") @default(16) @description("The number of columns to build before building new rows.") 'num_columns': @range[1, 64] u64, + @default(16) @display_name("Default Radix") @description("The default radix with which numeric values should be displayed, when peeking.") + @or(2, 8, 10, 16) + 'default_radix': u64, @default(1) @display_name("Track Mark To Cursor") @description("Ensures that the mark always follows the cursor, if the cursor value is updated.") 'track_mark_to_cursor': bool, @default(1) @display_name("Allow Mutation") @description("Allows operations which mutate memory.") 'allow_mutation': bool, @default(0) @display_name("Automatically Size Columns") @description("Determines the number of columns based on the available space.") 'auto_columns': bool, - @display_name("Peek Types") @description("A list of types to interpret selected and hovered memory as.") + @default(1) @display_name("Peek As Unsigned") 'peek_as_unsigned': bool, + @default(1) @display_name("Peek As Signed") 'peek_as_signed': bool, + @default(1) @display_name("Peek As Float") 'peek_as_float': bool, + @display_name("Extra Peek Types") @description("A list of types as which to interpret selected memory.") 'peek_types': query, } ``` @@ -979,6 +985,7 @@ RD_CmdTable: // | | | | {Edit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } {Accept 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } {Cancel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } + {FocusMenu 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } //- rjf: directional movement & text controls {MoveLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } @@ -1265,6 +1272,7 @@ RD_DefaultBindingTable: { "accept" Return 0 0 0 } { "accept" Space 0 0 0 } { "cancel" Esc 0 0 0 } + { "focus_menu" D 0 0 alt } //- rjf: directional movement & text controls { "move_left" Left 0 0 0 } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index be59c832..45599767 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4676,6 +4676,28 @@ rd_view_setting_f32_from_name(String8 name) return result; } +internal U64 +rd_view_setting_addr_from_name(String8 name) +{ + U64 result = 0; + String8 string = rd_view_setting_from_name(name); + E_Eval eval = e_eval_from_string(string); + E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(eval.irtree.mode == E_Mode_Offset && + (type_kind == E_TypeKind_Struct || + type_kind == E_TypeKind_Union || + type_kind == E_TypeKind_Class)) + { + result = eval.value.u64; + } + else + { + result = e_value_eval_from_eval(eval).value.u64; + } + return result; +} + //- rjf: evaluation & tag (a view's 'call') parameter extraction internal Rng1U64 @@ -15623,6 +15645,15 @@ rd_frame(void) evt.slot = UI_EventActionSlot_Cancel; ui_event_list_push(scratch.arena, &ws->ui_events, &evt); }break; + case RD_CmdKind_FocusMenu: + { + CFG_Node *window = cfg_node_from_id(rd_regs()->window); + RD_WindowState *ws = rd_window_state_from_cfg(window); + UI_Event evt = zero_struct; + evt.kind = UI_EventKind_Press; + evt.slot = UI_EventActionSlot_FocusMenu; + ui_event_list_push(scratch.arena, &ws->ui_events, &evt); + }break; //- rjf: directional movement & text controls // diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 84d3f0ac..cfd8d2ac 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -700,6 +700,7 @@ internal E_Value rd_view_setting_value_from_name(String8 string); internal B32 rd_view_setting_b32_from_name(String8 string); internal U64 rd_view_setting_u64_from_name(String8 string); internal F32 rd_view_setting_f32_from_name(String8 string); +internal U64 rd_view_setting_addr_from_name(String8 string); //- rjf: evaluation & tag (a view's 'call') parameter extraction internal Rng1U64 rd_space_range_from_eval(E_Eval eval); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index a5dad0b5..8cace0af 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2641,6 +2641,11 @@ struct RD_MemoryViewState B32 snap_scroll; B32 cell_value_edit_in_progress; U8 cell_value_edit_first_digit; + TxtPt addrbar_cursor; + TxtPt addrbar_mark; + U8 addrbar_buffer[1024]; + U64 addrbar_string_size; + B32 addrbar_is_focused; }; EV_EXPAND_RULE_INFO_FUNCTION_DEF(memory) @@ -2698,8 +2703,8 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Vec4F32 main_tx_color_rgba = ui_color_from_name(str8_lit("text")); Vec4F32 main_tx_color_hsva = hsva_from_rgba(main_tx_color_rgba); F32 main_font_size = ui_bottom_font_size(); - U64 cursor_base_vaddr = rd_view_setting_u64_from_name(str8_lit("cursor")); - U64 mark_base_vaddr = rd_view_setting_u64_from_name(str8_lit("mark")); + U64 cursor_base_vaddr = rd_view_setting_addr_from_name(str8_lit("cursor")); + U64 mark_base_vaddr = rd_view_setting_addr_from_name(str8_lit("mark")); U64 cursor_size = rd_view_setting_u64_from_name(str8_lit("cursor_size")); cursor_size = ClampBot(1, cursor_size); U64 initial_cursor_base_vaddr = cursor_base_vaddr; @@ -2763,9 +2768,11 @@ RD_VIEW_UI_FUNCTION_DEF(memory) F32 scroll_bar_dim = floor_f32(main_font_size*1.5f); Vec2F32 panel_dim = dim_2f32(rect); F32 footer_dim = floor_f32(main_font_size*10.f); - Rng2F32 header_rect = r2f32p(0, 0, panel_dim.x, row_height_px); + Rng2F32 addrbar_rect = r2f32p(0, 0, panel_dim.x, main_font_size*3.f); + Rng2F32 peekbar_rect = r2f32p(0, addrbar_rect.y1, panel_dim.x, addrbar_rect.y1 + main_font_size*3.f); + Rng2F32 header_rect = r2f32p(0, peekbar_rect.y1, panel_dim.x, peekbar_rect.y1 + row_height_px); Rng2F32 footer_rect = r2f32p(0, panel_dim.y-footer_dim, panel_dim.x-scroll_bar_dim, panel_dim.y); - Rng2F32 content_rect = r2f32p(0, row_height_px, panel_dim.x-scroll_bar_dim, panel_dim.y); + Rng2F32 content_rect = r2f32p(0, header_rect.y1, panel_dim.x-scroll_bar_dim, panel_dim.y); ////////////////////////////// //- rjf: determine visible range of rows (occluded & non-occluded) @@ -2814,6 +2821,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ////////////////////////////// //- rjf: loop: compute boundaries, take events, repeat // + B32 focus_addrbar = 0; B32 need_update = 1; Rng1U64 cursor_valid_rng = {0}; for(;;) @@ -2826,7 +2834,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) need_update = 0; //- rjf: take keyboard controls - UI_Focus(UI_FocusKind_On) if(ui_is_focus_active()) + UI_Focus(!mv->addrbar_is_focused ? UI_FocusKind_On : UI_FocusKind_Off) if(ui_is_focus_active()) { U64 next_cursor_base_vaddr = cursor_base_vaddr; U64 next_mark_base_vaddr = mark_base_vaddr; @@ -2836,6 +2844,13 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Vec2S64 cell_delta = {0}; B32 allow_cell_movement = 1; + // rjf: menu bar focuses + if(evt->slot == UI_EventActionSlot_FocusMenu) + { + good_action = 1; + focus_addrbar = 1; + } + // rjf: copies if(evt->flags & UI_EventFlag_Copy) { @@ -3526,9 +3541,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_Parent(container_box) UI_FontSize(main_font_size) { ui_set_next_fixed_x(content_rect.x1); - ui_set_next_fixed_y(0); + ui_set_next_fixed_y(header_rect.y0); ui_set_next_fixed_width(scroll_bar_dim); - ui_set_next_fixed_height(dim_2f32(rect).y); + ui_set_next_fixed_height(dim_2f32(rect).y - dim_2f32(addrbar_rect).y); { scroll_pos.y = ui_scroll_bar(Axis2_Y, ui_px(scroll_bar_dim, 1.f), @@ -3538,14 +3553,212 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } + ////////////////////////////// + //- rjf: build address bar + // + B32 commit_addrbar = 0; + UI_Box *addrbar_box = &ui_nil_box; + UI_Parent(container_box) UI_TagF("floating") + { + CFG_Node *view = cfg_node_from_id(rd_regs()->view); + RD_ViewState *view_state = rd_view_state_from_cfg(view); + B32 query_is_open = view_state->query_is_open; + CFG_Node *cursor_addr = cfg_node_child_from_string(view, str8_lit("cursor")); + UI_Signal cell_sig = {0}; + UI_Rect(addrbar_rect) + addrbar_box = ui_build_box_from_stringf(UI_BoxFlag_DrawSideBottom| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawDropShadow| + UI_BoxFlag_DrawBackgroundBlur| + UI_BoxFlag_Floating| + UI_BoxFlag_Clickable, "addrbar_box"); + UI_Parent(addrbar_box) + RD_Font(RD_FontSlot_Code) + UI_FontSize(font_size) + { + UI_Flags(UI_BoxFlag_DrawSideRight) + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_TagF("weak") + ui_labelf("Cursor Address"); + UI_Focus(!query_is_open && mv->addrbar_is_focused ? UI_FocusKind_On : UI_FocusKind_Off) + { + UI_Key addrbar_edit_key = {0}; + RD_CellParams cell_params = {0}; + { + String8 value_string = cursor_addr->first->string; + DR_FStrList value_fstrs = {0}; + { + DR_FStr value_fstr = + { + value_string, + { + ui_top_font(), + ui_top_text_raster_flags(), + ui_color_from_name(str8_lit("text")), + ui_top_font_size(), + } + }; + dr_fstrs_push(scratch.arena, &value_fstrs, &value_fstr); + } + cell_params.flags = RD_CellFlag_NoBackground|RD_CellFlag_CodeContents|RD_CellFlag_Bindings; + cell_params.pre_edit_value = value_string; + cell_params.value_fstrs = value_fstrs; + cell_params.cursor = &mv->addrbar_cursor; + cell_params.mark = &mv->addrbar_mark; + cell_params.edit_buffer = mv->addrbar_buffer; + cell_params.edit_buffer_size = sizeof(mv->addrbar_buffer); + cell_params.edit_string_size_out = &mv->addrbar_string_size; + cell_params.line_edit_key_out = &addrbar_edit_key; + cell_params.bindings_name = rd_cmd_kind_info_table[RD_CmdKind_FocusMenu].string; + } + cell_sig = rd_cellf(&cell_params, "%S###cursor_addr", cursor_addr->first->string); + if(ui_is_focus_active()) + { + rd_set_autocomp_regs(e_eval_nil, .ui_key = addrbar_edit_key, .string = str8(mv->addrbar_buffer, mv->addrbar_string_size), .cursor = mv->addrbar_cursor); + if(ui_slot_press(UI_EventActionSlot_Cancel)) + { + mv->addrbar_is_focused = 0; + } + if(ui_slot_press(UI_EventActionSlot_Accept)) + { + commit_addrbar = 1; + } + } + } + } + UI_Signal addrbar_sig = ui_signal_from_box(addrbar_box); + if(ui_pressed(addrbar_sig) || ui_pressed(cell_sig)) + { + rd_cmd(RD_CmdKind_FocusPanel); + if(!mv->addrbar_is_focused) + { + ui_kill_action(); + focus_addrbar = 1; + } + } + } + + ////////////////////////////// + //- rjf: build peekbar + // + UI_Box *peekbar_box = &ui_nil_box; + UI_Parent(container_box) UI_FontSize(main_font_size) UI_TagF("floating") + { + ui_set_next_fixed_x(peekbar_rect.x0); + ui_set_next_fixed_y(peekbar_rect.y0); + ui_set_next_fixed_width(dim_2f32(peekbar_rect).x); + ui_set_next_fixed_height(dim_2f32(peekbar_rect).y); + ui_set_next_child_layout_axis(Axis2_Y); + peekbar_box = ui_build_box_from_stringf(UI_BoxFlag_AllowOverflowX|UI_BoxFlag_ViewClampX|UI_BoxFlag_ViewScrollX|UI_BoxFlag_Clickable|UI_BoxFlag_Clip, "footer"); + UI_Parent(peekbar_box) RD_Font(RD_FontSlot_Code) UI_TextAlignment(UI_TextAlign_Center) + { + CFG_Node *view = cfg_node_from_id(rd_regs()->view); + CFG_NodePtrList extra_peek_types = cfg_node_child_list_from_string(scratch.arena, view, str8_lit("peek_type")); + String8List peek_type_list = {0}; + if(rd_view_setting_b32_from_name(str8_lit("peek_as_unsigned"))) + { + str8_list_pushf(scratch.arena, &peek_type_list, "uint8"); + str8_list_pushf(scratch.arena, &peek_type_list, "uint16"); + str8_list_pushf(scratch.arena, &peek_type_list, "uint32"); + str8_list_pushf(scratch.arena, &peek_type_list, "uint64"); + } + if(rd_view_setting_b32_from_name(str8_lit("peek_as_signed"))) + { + str8_list_pushf(scratch.arena, &peek_type_list, "int8"); + str8_list_pushf(scratch.arena, &peek_type_list, "int16"); + str8_list_pushf(scratch.arena, &peek_type_list, "int32"); + str8_list_pushf(scratch.arena, &peek_type_list, "int64"); + } + if(rd_view_setting_b32_from_name(str8_lit("peek_as_float"))) + { + str8_list_pushf(scratch.arena, &peek_type_list, "float32"); + str8_list_pushf(scratch.arena, &peek_type_list, "float64"); + } + for EachNode(n, CFG_NodePtrNode, extra_peek_types.first) + { + str8_list_push(scratch.arena, &peek_type_list, n->v->first->string); + } + ui_set_next_pref_width(ui_children_sum(1)); + ui_row_begin(); + F32 x_off_px = 0; + F32 x_max_px = dim_2f32(rect).x - scroll_bar_dim; + for EachNode(n, String8Node, peek_type_list.first) + { + String8 type_string = n->string; + E_Eval type_eval = e_eval_from_string(type_string); + if(type_eval.msgs.max_kind == E_MsgKind_Null) + { + String8 casted_expr = str8f(scratch.arena, "*(((%S) *)((((uint8 *)(&(%S)) + 0x%I64x))))", + type_string, + eval.string.size ? eval.string : str8_lit("0"), + selection.min - view_range.min); + E_Eval peek_eval = e_eval_from_string(casted_expr); + if(peek_eval.msgs.max_kind == E_MsgKind_Null) + { + EV_StringParams params = + { + .flags = EV_StringFlag_ReadOnlyDisplayRules, + .radix = rd_view_setting_u64_from_name(str8_lit("default_radix")), + }; + String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), ¶ms, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, peek_eval); + F32 type_string_width_px = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, type_string).x + ui_top_font_size()*0.5f; + F32 value_string_width_px = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, value_string).x + ui_top_font_size()*0.5f; + type_string_width_px = Min(type_string_width_px, ui_top_font_size()*10.f); + value_string_width_px = Min(value_string_width_px, ui_top_font_size()*20.f); + F32 padding_px = ui_top_font_size()*0.5f; + x_off_px += type_string_width_px + value_string_width_px + padding_px*2.f; + if(0 && x_off_px >= x_max_px) + { + x_off_px = 0; + ui_row_end(); + ui_row_begin(); + } + UI_PrefWidth(ui_children_sum(1)) UI_TagF(".") UI_TagF("implicit") + { + UI_Box *peek_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "peek_type_%I64x", u64_hash_from_str8(type_string)); + UI_Parent(peek_box) UI_Padding(ui_px(padding_px, 1)) UI_Flags(UI_BoxFlag_DisableTruncatedHover) + { + UI_PrefWidth(ui_px(type_string_width_px, 1)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), type_string); + UI_PrefWidth(ui_px(value_string_width_px, 1)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), value_string); + } + UI_Signal peek_sig = ui_signal_from_box(peek_box); + if(ui_hovering(peek_sig)) + { + rd_set_hover_eval(v2f32(peek_box->rect.x0, peek_box->rect.y1-2.f), casted_expr); + } + if(ui_clicked(peek_sig)) + { + rd_cmd(RD_CmdKind_PushQuery, .expr = casted_expr); + } + } + } + } + } + ui_row_end(); + } + UI_Signal sig = ui_signal_from_box(peekbar_box); + if(ui_pressed(sig)) + { + rd_cmd(RD_CmdKind_FocusPanel); + commit_addrbar = mv->addrbar_is_focused; + mv->addrbar_is_focused = 0; + } + } + ////////////////////////////// //- rjf: build header // UI_Box *header_box = &ui_nil_box; UI_Parent(container_box) UI_TagF("floating") { - UI_Rect(r2f32p(0, 0, dim_2f32(rect).x - scroll_bar_dim, row_height_px)) + UI_Rect(header_rect) header_box = ui_build_box_from_stringf(UI_BoxFlag_DrawSideBottom| + UI_BoxFlag_DrawSideTop| UI_BoxFlag_DrawBackground| UI_BoxFlag_DrawDropShadow| UI_BoxFlag_DrawBackgroundBlur| @@ -3570,12 +3783,19 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); UI_WidthFill ui_labelf("ASCII"); } - ui_signal_from_box(header_box); + UI_Signal sig = ui_signal_from_box(header_box); + if(ui_pressed(sig)) + { + rd_cmd(RD_CmdKind_FocusPanel); + commit_addrbar = mv->addrbar_is_focused; + mv->addrbar_is_focused = 0; + } } ////////////////////////////// //- rjf: build footer // +#if 0 UI_Box *footer_box = &ui_nil_box; UI_Parent(container_box) UI_FontSize(main_font_size) UI_TagF("floating") { @@ -3583,40 +3803,82 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ui_set_next_fixed_y(footer_rect.y0); ui_set_next_fixed_width(dim_2f32(footer_rect).x); ui_set_next_fixed_height(dim_2f32(footer_rect).y); + ui_set_next_child_layout_axis(Axis2_Y); footer_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawDropShadow, "footer"); - UI_Parent(footer_box) RD_Font(RD_FontSlot_Code) + UI_Parent(footer_box) RD_Font(RD_FontSlot_Code) UI_WidthFill UI_TextAlignment(UI_TextAlign_Center) { - UI_PrefWidth(ui_em(7.5f, 1.f)) UI_HeightFill UI_Column UI_TagF("weak") - UI_PrefHeight(ui_em(2.f, 0.f)) + CFG_Node *view = cfg_node_from_id(rd_regs()->view); + CFG_NodePtrList peek_types = cfg_node_child_list_from_string(scratch.arena, view, str8_lit("peek_type")); + ui_row_begin(); + F32 x_off_px = 0; + F32 x_max_px = dim_2f32(rect).x - scroll_bar_dim; + for EachNode(n, CFG_NodePtrNode, peek_types.first) { - ui_labelf("Address:"); - ui_labelf("U8:"); - ui_labelf("U16:"); - ui_labelf("U32:"); - ui_labelf("U64:"); - } - UI_PrefWidth(ui_em(45.f, 1.f)) UI_HeightFill UI_Column - UI_PrefHeight(ui_em(2.f, 0.f)) - { - ui_labelf("%016I64X", cursor_base_vaddr); + String8 type_string = n->v->first->string; + E_Eval type_eval = e_eval_from_string(type_string); + if(type_eval.msgs.max_kind == E_MsgKind_Null) { - U64 as_u8 = 0; - U64 as_u16 = 0; - U64 as_u32 = 0; - U64 as_u64 = 0; - e_space_read(eval.space, &as_u64, r1u64(cursor_base_vaddr, cursor_base_vaddr+1)); - as_u32 = *(U32 *)&as_u64; - as_u16 = *(U16 *)&as_u64; - as_u8 = *(U8 *)&as_u64; - ui_labelf("%02X (%I64u)", as_u8, as_u8); - ui_labelf("%04X (%I64u)", as_u16, as_u16); - ui_labelf("%08X (%I64u)", as_u32, as_u32); - ui_labelf("%016I64X (%I64u)", as_u64, as_u64); + String8 casted_expr = str8f(scratch.arena, "*(((%S) *)((((uint8 *)(&(%S)) + 0x%I64x))))", + type_string, + eval.string.size ? eval.string : str8_lit("0"), + selection.min - view_range.min); + E_Eval peek_eval = e_eval_from_string(casted_expr); + if(peek_eval.msgs.max_kind == E_MsgKind_Null) + { + EV_StringParams params = + { + .flags = EV_StringFlag_ReadOnlyDisplayRules, + .radix = rd_view_setting_u64_from_name(str8_lit("default_radix")), + }; + String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), ¶ms, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, peek_eval); + F32 type_string_width_px = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, type_string).x + ui_top_font_size()*0.5f; + F32 value_string_width_px = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, value_string).x + ui_top_font_size()*0.5f; + type_string_width_px = Min(type_string_width_px, ui_top_font_size()*10.f); + value_string_width_px = Min(value_string_width_px, ui_top_font_size()*20.f); + F32 padding_px = ui_top_font_size()*0.5f; + x_off_px += type_string_width_px + value_string_width_px + padding_px*2.f; + if(x_off_px >= x_max_px) + { + x_off_px = 0; + ui_row_end(); + ui_row_begin(); + } + UI_PrefWidth(ui_children_sum(0)) UI_TagF(".") UI_TagF("implicit") + { + UI_Box *peek_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects, + "peek_type_%I64x", n->v->id); + UI_Parent(peek_box) UI_Padding(ui_px(padding_px, 0)) UI_Flags(UI_BoxFlag_DisableTruncatedHover) + { + UI_PrefWidth(ui_px(type_string_width_px, 0)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), type_string); + UI_PrefWidth(ui_px(value_string_width_px, 0)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), value_string); + } + UI_Signal peek_sig = ui_signal_from_box(peek_box); + if(ui_hovering(peek_sig)) + { + rd_set_hover_eval(v2f32(peek_box->rect.x0, peek_box->rect.y1-2.f), casted_expr); + } + if(ui_clicked(peek_sig)) + { + rd_cmd(RD_CmdKind_PushQuery, .expr = casted_expr); + } + } + } } } + ui_row_end(); + } + UI_Signal sig = ui_signal_from_box(footer_box); + if(ui_pressed(sig)) + { + rd_cmd(RD_CmdKind_FocusPanel); + commit_addrbar = mv->addrbar_is_focused; + mv->addrbar_is_focused = 0; } - ui_signal_from_box(footer_box); } +#endif ////////////////////////////// //- rjf: build scrollable box @@ -3691,6 +3953,8 @@ RD_VIEW_UI_FUNCTION_DEF(memory) if(ui_pressed(sig)) { rd_cmd(RD_CmdKind_FocusPanel); + commit_addrbar = mv->addrbar_is_focused; + mv->addrbar_is_focused = 0; } // rjf: click & drag -> select @@ -3905,7 +4169,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } } - if(annotation_node != 0 && mouse_hover_byte_num == global_byte_num && !byte_is_selected && !dragging_is_active) + if(annotation_node != 0 && mouse_hover_byte_num == global_byte_num && !dragging_is_active) { UI_Tooltip UI_PrefHeight(ui_px(ui_top_font_size()*1.75f, 1.f)) { @@ -3929,38 +4193,6 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } } - if(mouse_hover_byte_num == global_byte_num && byte_is_selected && !dragging_is_active) - { - UI_Tooltip - { - CFG_Node *view = cfg_node_from_id(rd_regs()->view); - CFG_NodePtrList peek_types = cfg_node_child_list_from_string(scratch.arena, view, str8_lit("peek_type")); - for EachNode(n, CFG_NodePtrNode, peek_types.first) - { - String8 type_string = n->v->first->string; - E_Eval type_size_eval = e_eval_from_stringf("sizeof(%S)", type_string); - if(type_size_eval.msgs.max_kind == E_MsgKind_Null && dim_1u64(selection)+1 >= type_size_eval.value.u64) - { - String8 casted_expr = str8f(scratch.arena, "*(((%S) *)((((uint8 *)(&(%S)) + 0x%I64x))))", - type_string, - eval.string.size ? eval.string : str8_lit("0"), - selection.min - view_range.min); - E_Eval peek_eval = e_eval_from_string(casted_expr); - UI_PrefWidth(ui_children_sum(1)) UI_Row - { - EV_StringParams params = - { - .flags = EV_StringFlag_ReadOnlyDisplayRules, - .radix = 10, - }; - String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), ¶ms, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, peek_eval); - UI_TextAlignment(UI_TextAlign_Left) UI_PrefWidth(ui_em(4.f, 1.f)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), type_string); - UI_PrefWidth(ui_text_dim(10, 1)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), value_string); - } - } - } - } - } } } } @@ -4023,6 +4255,26 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } + ////////////////////////////// + //- rjf: commit addrbar changes + // + if(focus_addrbar) + { + CFG_Node *view = cfg_node_from_id(rd_regs()->view); + CFG_Node *cursor_addr = cfg_node_child_from_string(view, str8_lit("cursor")); + mv->addrbar_is_focused = 1; + mv->addrbar_string_size = Min(sizeof(mv->addrbar_buffer), cursor_addr->first->string.size); + MemoryCopy(mv->addrbar_buffer, cursor_addr->first->string.str, mv->addrbar_string_size); + mv->addrbar_cursor = txt_pt(1, mv->addrbar_string_size+1); + mv->addrbar_mark = txt_pt(1, 1); + } + if(commit_addrbar) + { + String8 string = str8(mv->addrbar_buffer, mv->addrbar_string_size); + rd_store_view_param(str8_lit("cursor"), string); + mv->addrbar_is_focused = 0; + } + ////////////////////////////// //- rjf: scroll // diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 9e94c90c..4a99be51 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -3656,6 +3656,11 @@ rd_cell(RD_CellParams *params, String8 string) UI_BoxFlag_Clickable, "%S##revert", rd_icon_kind_text_table[RD_IconKind_Undo]); UI_Signal sig = ui_signal_from_box(revert_box); + if(ui_hovering(sig)) UI_Tooltip RD_Font(RD_FontSlot_Main) + { + ui_state->tooltip_anchor_key = revert_box->key; + ui_label(str8_lit("Revert To Default")); + } if(ui_pressed(sig) && params->revert_out) { params->revert_out[0] = 1; diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index 79c6f3e9..f5acb805 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -103,6 +103,7 @@ typedef enum UI_EventActionSlot UI_EventActionSlot_Accept, UI_EventActionSlot_Cancel, UI_EventActionSlot_Edit, + UI_EventActionSlot_FocusMenu, UI_EventActionSlot_COUNT } UI_EventActionSlot; From ee6d9b3a32ac9b80f3180f1f523ae1ac02190904 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 13 Apr 2026 14:52:09 -0700 Subject: [PATCH 361/850] fix bad auto column calculating in min edge case --- src/raddbg/raddbg_views.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 8cace0af..289c913c 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2718,7 +2718,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } if(auto_columns) { - num_columns = (U64)((dim_2f32(rect).x - address_margin_width_px - big_glyph_advance*4.f) / (cell_width_px + big_glyph_advance)); + F32 num_columns_f = ((dim_2f32(rect).x - address_margin_width_px - big_glyph_advance*4.f) / (cell_width_px + big_glyph_advance)); + num_columns_f = ClampBot(1.f, num_columns_f); + num_columns = (U64)num_columns_f; } num_columns = ClampBot(1, num_columns); UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); From 3161fda9826231a8e686a0f5fffa5c661b7fe8d8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 14 Apr 2026 15:35:12 -0700 Subject: [PATCH 362/850] further memory view work: tighter byte context viz, fix missing callstack frames, fix zooming, struct member annotations --- src/base/base_strings.c | 28 +- src/draw/draw.c | 10 + src/draw/draw.h | 1 + src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 + src/raddbg/raddbg_main.c | 9 + src/raddbg/raddbg_views.c | 491 ++++++++++++++++++----------- 7 files changed, 339 insertions(+), 204 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 274eceb9..b3d279e8 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -731,7 +731,7 @@ str8_from_memory_size(Arena *arena, U64 size) { if(size < KB(1)) { - result = push_str8f(arena, "%llu Bytes", size); + result = push_str8f(arena, "%llu byte%s", size, size == 1 ? "" : "s"); } else if(size < MB(1)) { @@ -1147,9 +1147,9 @@ internal String8List str8_list_substr(Arena *arena, String8List list, Rng1U64 range) { String8List result = {0}; - + String8Node *n = list.first; - + U64 front_min = 0; { U64 cursor = 0; @@ -1160,13 +1160,13 @@ str8_list_substr(Arena *arena, String8List list, Rng1U64 range) } } } - + if (front_min > 0) { U64 front_max = front_min + Min(dim_1u64(range), n->string.size); str8_list_push(arena, &result, str8_substr(n->string, r1u64(front_min, front_max))); n = n->next; } - + for (; n != 0; n = n->next) { if (result.total_size >= dim_1u64(range)) { break; @@ -1175,7 +1175,7 @@ str8_list_substr(Arena *arena, String8List list, Rng1U64 range) U64 copy_size = Min(copy_max, n->string.size); str8_list_push(arena, &result, str8_substr(n->string, r1u64(0, copy_size))); } - + return result; } @@ -2949,16 +2949,16 @@ str8_buffer_skip(String8Node *buf, U64 *pos, U64 skip) S64 to_skip; for (to_skip = skip; to_skip > 0;) { if (buf == 0) { break; } - + U64 left = Min(to_skip, buf->string.size - *pos); *pos += left; - + if (*pos == buf->string.size) { if (buf->next) { *buf = *buf->next; } else { *buf = (String8Node){0}; buf = 0; } *pos = 0; } - + to_skip -= (S64)left; } Assert(to_skip == 0); @@ -2971,15 +2971,15 @@ str8_buffer_read(String8Node *buf, U64 *pos, U64 read_size, void *out) U64 cursor = 0; for (; cursor < read_size ;) { if (buf == 0) { break; } - + U64 copy_size = Min(read_size - cursor, (buf->string.size - *pos)); void *dst = (U8 *)out + cursor; void *src = buf->string.str + *pos; MemoryCopy(dst, src, copy_size); - + *pos += copy_size; cursor += copy_size; - + if (*pos >= buf->string.size) { if (buf->next) { *buf = *buf->next; } else { *buf = (String8Node){0}; buf = 0; } @@ -3004,7 +3004,7 @@ str8_buffer_write(String8Node *buf, U64 *pos, String8 data) if (buf) { for (copy_size = 0; copy_size < data.size; ) { U64 data_size = data.size - copy_size; - + U64 available_size = buf->string.size - *pos; U64 to_copy = Min(available_size, data_size); if (data.str == 0) { @@ -3015,7 +3015,7 @@ str8_buffer_write(String8Node *buf, U64 *pos, String8 data) } *pos += to_copy; copy_size += to_copy; - + if (*pos >= buf->string.size) { if (buf->next) { *buf = *buf->next; diff --git a/src/draw/draw.c b/src/draw/draw.c index 1f870c21..b4276f8b 100644 --- a/src/draw/draw.c +++ b/src/draw/draw.c @@ -44,6 +44,16 @@ dr_hash_from_string(String8 string) //////////////////////////////// //~ rjf: Fancy String Type Functions +internal void +dr_fstrs_push_front(Arena *arena, DR_FStrList *list, DR_FStr *str) +{ + DR_FStrNode *n = push_array_no_zero(arena, DR_FStrNode, 1); + MemoryCopyStruct(&n->v, str); + SLLQueuePushFront(list->first, list->last, n); + list->node_count += 1; + list->total_size += str->string.size; +} + internal void dr_fstrs_push(Arena *arena, DR_FStrList *list, DR_FStr *str) { diff --git a/src/draw/draw.h b/src/draw/draw.h index acc7ce64..78b4c080 100644 --- a/src/draw/draw.h +++ b/src/draw/draw.h @@ -117,6 +117,7 @@ internal U64 dr_hash_from_string(String8 string); //////////////////////////////// //~ rjf: Fancy String Type Functions +internal void dr_fstrs_push_front(Arena *arena, DR_FStrList *list, DR_FStr *str); internal void dr_fstrs_push(Arena *arena, DR_FStrList *list, DR_FStr *str); internal void dr_fstrs_push_new_(Arena *arena, DR_FStrList *list, DR_FStrParams *params, DR_FStrParams *overrides, String8 string); #define dr_fstrs_push_new(arena, list, params, string, ...) dr_fstrs_push_new_((arena), (list), (params), &(DR_FStrParams){.size = 0, __VA_ARGS__}, (string)) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 5e7195d4..4484749e 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -437,7 +437,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[26] = {str8_lit_comp("list"), str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, {str8_lit_comp("text"), str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, {str8_lit_comp("disasm"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n 'arch': code_string,\n 'syntax': code_string,\n 'size': expr_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, -{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': query,\n}\n")}, +{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1) 'zoom': @range[0.25, 2] f32,\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': query,\n}\n")}, {str8_lit_comp("bitmap"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, {str8_lit_comp("color"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, {str8_lit_comp("geo3d"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 006362ee..ad103e6c 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -540,6 +540,8 @@ RD_VocabTable: ``` @inherit(tab) x: { + @display_name("Zoom") @description("The zoom level for displaying bytes in the memory view.") + @default(1) 'zoom': @range[0.25, 2] f32, @display_name("Base Address") @description("An expression which refers to the base address of data which should be viewed as memory.") 'expression': expr_string, @display_name("Address Range Size") @description("The number of bytes of the viewed memory range.") diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index f857a0e9..7a6599f6 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,15 @@ //////////////////////////////// //~ rjf: post-0.9.20 TODO notes // +//- memory view pass +// [ ] scroll bar +// [ ] horizontal scrolling? +// [ ] toggleable ascii column +// [ ] toggleable hierarchy column? +// [x] cursor info at bottom? # of selected bytes, address range, cursor hierarchical location? +// [x] clean up tooltip? it's a bit big/noisy (maybe remove it after above?) +// [x] missing call stack frames? +// //- fabian complaints / reports // [ ] broadly, need to complete memory view & fix issues // [ ] dumb panel click-through thing diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 289c913c..9058fb07 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2689,11 +2689,15 @@ RD_VIEW_UI_FUNCTION_DEF(memory) // FNT_Tag font = rd_font_from_slot(RD_FontSlot_Code); FNT_RasterFlags font_raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code); - F32 font_size = ui_top_font_size(); - F32 big_glyph_advance = fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit("H")).x; - F32 row_height_px = floor_f32(font_size*2.f); - F32 cell_width_px = floor_f32(font_size*2.f); - F32 address_margin_width_px = big_glyph_advance*20.f; + F32 tab_font_size = ui_top_font_size(); + F32 zoom_target = rd_view_setting_f32_from_name(str8_lit("zoom")); + zoom_target = Clamp(0.25f, zoom_target, 2.f); + F32 zoom = ui_anim(ui_key_from_stringf(ui_key_zero(), "%I64x_zoom", rd_regs()->view), zoom_target, .initial = zoom_target); + F32 cell_font_size = tab_font_size * zoom; + F32 cell_big_glyph_advance = fnt_dim_from_tag_size_string(font, cell_font_size, 0, 0, str8_lit("H")).x; + F32 row_height_px = floor_f32(cell_font_size*2.f); + F32 cell_width_px = floor_f32(cell_font_size*2.f); + F32 address_margin_width_px = cell_big_glyph_advance*20.f; ////////////////////////////// //- rjf: unpack parameterization info @@ -2702,7 +2706,6 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Vec4F32 main_bg_color_hsva = hsva_from_rgba(main_bg_color_rgba); Vec4F32 main_tx_color_rgba = ui_color_from_name(str8_lit("text")); Vec4F32 main_tx_color_hsva = hsva_from_rgba(main_tx_color_rgba); - F32 main_font_size = ui_bottom_font_size(); U64 cursor_base_vaddr = rd_view_setting_addr_from_name(str8_lit("cursor")); U64 mark_base_vaddr = rd_view_setting_addr_from_name(str8_lit("mark")); U64 cursor_size = rd_view_setting_u64_from_name(str8_lit("cursor_size")); @@ -2718,7 +2721,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } if(auto_columns) { - F32 num_columns_f = ((dim_2f32(rect).x - address_margin_width_px - big_glyph_advance*4.f) / (cell_width_px + big_glyph_advance)); + F32 num_columns_f = ((dim_2f32(rect).x - address_margin_width_px - cell_big_glyph_advance*4.f) / (cell_width_px + cell_big_glyph_advance)); num_columns_f = ClampBot(1.f, num_columns_f); num_columns = (U64)num_columns_f; } @@ -2767,11 +2770,11 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ////////////////////////////// //- rjf: calculate rectangles // - F32 scroll_bar_dim = floor_f32(main_font_size*1.5f); + F32 scroll_bar_dim = floor_f32(ui_bottom_font_size()*1.5f); Vec2F32 panel_dim = dim_2f32(rect); - F32 footer_dim = floor_f32(main_font_size*10.f); - Rng2F32 addrbar_rect = r2f32p(0, 0, panel_dim.x, main_font_size*3.f); - Rng2F32 peekbar_rect = r2f32p(0, addrbar_rect.y1, panel_dim.x, addrbar_rect.y1 + main_font_size*3.f); + F32 footer_dim = floor_f32(tab_font_size*3.f); + Rng2F32 addrbar_rect = r2f32p(0, 0, panel_dim.x, tab_font_size*3.f); + Rng2F32 peekbar_rect = r2f32p(0, addrbar_rect.y1, panel_dim.x, addrbar_rect.y1 + tab_font_size*3.f); Rng2F32 header_rect = r2f32p(0, peekbar_rect.y1, panel_dim.x, peekbar_rect.y1 + row_height_px); Rng2F32 footer_rect = r2f32p(0, panel_dim.y-footer_dim, panel_dim.x-scroll_bar_dim, panel_dim.y); Rng2F32 content_rect = r2f32p(0, header_rect.y1, panel_dim.x-scroll_bar_dim, panel_dim.y); @@ -3190,15 +3193,15 @@ RD_VIEW_UI_FUNCTION_DEF(memory) text_color.w *= 0.5f; } { - DR_FStr fstr = {push_str8f(scratch.arena, "%02x", byte), {font, font_raster_flags, text_color, font_size, 0, 0}}; + DR_FStr fstr = {push_str8f(scratch.arena, "%02x", byte), {font, font_raster_flags, text_color, cell_font_size, 0, 0}}; dr_fstrs_push(scratch.arena, &byte_fstrs[idx], &fstr); } { - DR_FStr fstr = {push_str8f(scratch.arena, "%02x", byte), {font, font_raster_flags, selected_color, font_size, 0, 0}}; + DR_FStr fstr = {push_str8f(scratch.arena, "%02x", byte), {font, font_raster_flags, selected_color, cell_font_size, 0, 0}}; dr_fstrs_push(scratch.arena, &byte_fstrs_selected[idx], &fstr); } { - DR_FStr fstr = {push_str8f(scratch.arena, "%02x", byte), {font, font_raster_flags, changed_color, font_size, 0, 0}}; + DR_FStr fstr = {push_str8f(scratch.arena, "%02x", byte), {font, font_raster_flags, changed_color, cell_font_size, 0, 0}}; dr_fstrs_push(scratch.arena, &byte_fstrs_changed[idx], &fstr); } } @@ -3232,15 +3235,17 @@ RD_VIEW_UI_FUNCTION_DEF(memory) struct Annotation { String8 name_string; - String8 kind_string; - String8 type_string; - Vec4F32 color; + Vec4F32 bg_color; + Vec4F32 txt_color; Rng1U64 vaddr_range; + B32 dot_access; + E_TypeKey type_key; }; typedef struct AnnotationNode AnnotationNode; struct AnnotationNode { AnnotationNode *next; + AnnotationNode *prev; Annotation *v; }; typedef struct AnnotationList AnnotationList; @@ -3260,48 +3265,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { eval_process = rd_ctrl_entity_from_eval_space(eval.space); } - - //- rjf: fill unwind frame annotations - if(selected_call_stack.concrete_frames_count != 0) UI_Tag(str8_lit("weak")) - { - U64 last_stack_top = regs_rsp_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs); - for(U64 idx = 1; idx < selected_call_stack.concrete_frames_count; idx += 1) - { - CTRL_CallStackFrame *f = selected_call_stack.concrete_frames[idx]; - U64 f_stack_top = regs_rsp_from_arch_block(selected_thread->arch, f->regs); - Rng1U64 frame_vaddr_range = r1u64(last_stack_top, f_stack_top); - Rng1U64 frame_vaddr_range_in_viz = intersect_1u64(frame_vaddr_range, viz_range_bytes); - last_stack_top = f_stack_top; - if(dim_1u64(frame_vaddr_range_in_viz) != 0) - { - Access *access = access_open(); - U64 f_rip_vaddr = regs_rip_from_arch_block(selected_thread->arch, f->regs); - CTRL_Entity *module = ctrl_module_from_process_vaddr(selected_process, f_rip_vaddr); - U64 f_rip_voff = ctrl_voff_from_vaddr(module, f_rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, f_rip_voff); - String8 procedure_name = {0}; - procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); - access_close(access); - if(procedure_name.size != 0) - { - Annotation *annotation = push_array(scratch.arena, Annotation, 1); - annotation->name_string = push_str8_copy(scratch.arena, procedure_name); - annotation->kind_string = str8_lit("Call Stack Frame"); - annotation->color = v4f32(0, 0, 0, 0); - annotation->vaddr_range = frame_vaddr_range; - for(U64 vaddr = frame_vaddr_range_in_viz.min; vaddr < frame_vaddr_range_in_viz.max; vaddr += 1) - { - U64 visible_byte_idx = vaddr - viz_range_bytes.min; - AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); - n->v = annotation; - SLLQueuePush(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, n); - } - } - } - } - } + AnnotationList variable_annotations = {0}; //- rjf: fill selected thread stack range annotation if(selected_call_stack.concrete_frames_count > 0) @@ -3314,56 +3278,56 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { Annotation *annotation = push_array(scratch.arena, Annotation, 1); annotation->name_string = selected_thread->string.size ? selected_thread->string : push_str8f(scratch.arena, "TID: %I64u", selected_thread->id); - annotation->kind_string = str8_lit("Stack"); - annotation->color = rd_color_from_ctrl_entity(selected_thread); + annotation->txt_color = rd_color_from_ctrl_entity(selected_thread); annotation->vaddr_range = stack_vaddr_range; for(U64 vaddr = stack_vaddr_range_in_viz.min; vaddr < stack_vaddr_range_in_viz.max; vaddr += 1) { U64 visible_byte_idx = vaddr - viz_range_bytes.min; AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); n->v = annotation; - SLLQueuePush(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, n); + DLLPushBack(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, n); } } } - //- rjf: fill local variable annotations - if(e_space_match(rd_eval_space_from_ctrl_entity(selected_process, CTRL_EvalSpaceKind_Entity), eval.space)) + //- rjf: fill unwind frame annotations + if(selected_call_stack.concrete_frames_count != 0) UI_Tag(str8_lit("weak")) { - Vec4F32 local_color = ui_color_from_name(str8_lit("code_local")); - Vec4F32 color_gen_table[] = + Vec4F32 symbol_color = ui_color_from_name(str8_lit("code_symbol")); + U64 last_rip = regs_rip_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs); + U64 last_stack_top = regs_rsp_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs); + for(U64 idx = 1; idx < selected_call_stack.concrete_frames_count; idx += 1) { - mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.2f), - mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.4f), - mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.6f), - mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.8f), - }; - U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count); - for(E_String2NumMapNode *n = e_ir_ctx->locals_map->first; n != 0; n = n->order_next) - { - String8 local_name = n->string; - E_Eval local_eval = e_eval_from_string(local_name); - if(local_eval.irtree.mode == E_Mode_Offset) + CTRL_CallStackFrame *f = selected_call_stack.concrete_frames[idx]; + U64 f_stack_top = regs_rsp_from_arch_block(selected_thread->arch, f->regs); + Rng1U64 frame_vaddr_range = r1u64(last_stack_top, f_stack_top); + Rng1U64 frame_vaddr_range_in_viz = intersect_1u64(frame_vaddr_range, viz_range_bytes); + last_stack_top = f_stack_top; + if(dim_1u64(frame_vaddr_range_in_viz) != 0) { - E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.irtree.type_key); - U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.irtree.type_key); - Rng1U64 vaddr_rng = r1u64(local_eval.value.u64, local_eval.value.u64+local_eval_type_size); - Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng); - if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min) + Access *access = access_open(); + U64 f_rip_vaddr = last_rip; + last_rip = regs_rip_from_arch_block(selected_thread->arch, f->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(selected_process, f_rip_vaddr); + U64 f_rip_voff = ctrl_voff_from_vaddr(module, f_rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, f_rip_voff); + String8 procedure_name = {0}; + procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); + access_close(access); + if(procedure_name.size != 0) { Annotation *annotation = push_array(scratch.arena, Annotation, 1); + annotation->name_string = str8_copy(scratch.arena, procedure_name); + annotation->txt_color = symbol_color; + annotation->vaddr_range = frame_vaddr_range; + for(U64 vaddr = frame_vaddr_range_in_viz.min; vaddr < frame_vaddr_range_in_viz.max; vaddr += 1) { - annotation->name_string = push_str8_copy(scratch.arena, local_name); - annotation->kind_string = str8_lit("Local"); - annotation->type_string = e_type_string_from_key(scratch.arena, local_eval.irtree.type_key); - annotation->color = color_gen_table[(vaddr_rng.min/7)%ArrayCount(color_gen_table)]; - annotation->vaddr_range = vaddr_rng; - } - for(U64 vaddr = vaddr_rng_in_visible.min; vaddr < vaddr_rng_in_visible.max; vaddr += 1) - { + U64 visible_byte_idx = vaddr - viz_range_bytes.min; AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); n->v = annotation; - SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); + DLLPushBack(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, n); } } } @@ -3410,15 +3374,15 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Annotation *annotation = push_array(scratch.arena, Annotation, 1); { annotation->name_string = push_str8_copy(scratch.arena, procedure_name); - annotation->kind_string = str8_lit("Procedure"); - annotation->color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)]; + annotation->bg_color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)]; + annotation->txt_color = symbol_color; annotation->vaddr_range = vaddr_range; } for(U64 vaddr = vaddr_range_in_visible.min; vaddr < vaddr_range_in_visible.max; vaddr += 1) { AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); n->v = annotation; - SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); + DLLPushBack(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); } } } @@ -3444,18 +3408,19 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { next_vaddr = vaddr+1; Access *access = access_open(); - CTRL_Entity *module = ctrl_module_from_process_vaddr(eval_process, vaddr); - if(module != &ctrl_entity_nil) + E_Module *module = e_base_ctx->primary_module; + if(module != &e_module_nil) { - U64 voff = ctrl_voff_from_vaddr(module, vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 voff = (vaddr - module->vaddr_range.min); + E_DbgInfo *dbg_info = e_dbg_info_from_module(module); + DI_Key dbgi_key = dbg_info->dbgi_key; RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); if(gvar->voff != 0) { RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, gvar->type_idx); Rng1U64 voff_range = r1u64(gvar->voff, gvar->voff + type_node->byte_size); - Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); + Rng1U64 vaddr_range = r1u64(voff_range.min + module->vaddr_range.min, voff_range.max + module->vaddr_range.min); next_vaddr = vaddr_range.max; next_vaddr = Max(next_vaddr, vaddr+1); Rng1U64 vaddr_range_in_visible = intersect_1u64(vaddr_range, viz_range_bytes); @@ -3466,15 +3431,21 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Annotation *annotation = push_array(scratch.arena, Annotation, 1); { annotation->name_string = push_str8_copy(scratch.arena, gvar_name); - annotation->kind_string = str8_lit("Global"); - annotation->color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)]; + annotation->bg_color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)]; + annotation->txt_color = symbol_color; annotation->vaddr_range = vaddr_range; + annotation->type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), gvar->type_idx, module->dbg_info_num); + } + { + AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); + n->v = annotation; + DLLPushBack(variable_annotations.first, variable_annotations.last, n); } for(U64 vaddr = vaddr_range_in_visible.min; vaddr < vaddr_range_in_visible.max; vaddr += 1) { AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); n->v = annotation; - SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); + DLLPushBack(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); } } } @@ -3483,9 +3454,58 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } + //- rjf: fill local variable annotations + if(e_space_match(rd_eval_space_from_ctrl_entity(selected_process, CTRL_EvalSpaceKind_Entity), eval.space)) + { + Vec4F32 local_color = ui_color_from_name(str8_lit("code_local")); + Vec4F32 color_gen_table[] = + { + mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.2f), + mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.4f), + mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.6f), + mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.8f), + }; + U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count); + for(E_String2NumMapNode *n = e_ir_ctx->locals_map->first; n != 0; n = n->order_next) + { + String8 local_name = n->string; + E_Eval local_eval = e_eval_from_string(local_name); + if(local_eval.irtree.mode == E_Mode_Offset) + { + E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.irtree.type_key); + U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.irtree.type_key); + Rng1U64 vaddr_rng = r1u64(local_eval.value.u64, local_eval.value.u64+local_eval_type_size); + Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng); + if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min) + { + Annotation *annotation = push_array(scratch.arena, Annotation, 1); + { + annotation->name_string = str8_copy(scratch.arena, local_name); + annotation->bg_color = color_gen_table[(vaddr_rng.min/7)%ArrayCount(color_gen_table)]; + annotation->txt_color = local_color; + annotation->vaddr_range = vaddr_rng; + annotation->type_key = local_eval.irtree.type_key; + } + { + AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); + n->v = annotation; + DLLPushBack(variable_annotations.first, variable_annotations.last, n); + } + for(U64 vaddr = vaddr_rng_in_visible.min; vaddr < vaddr_rng_in_visible.max; vaddr += 1) + { + AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); + n->v = annotation; + DLLPushBack(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); + } + } + } + } + } + //- rjf: fill debuggee-specified annotations if(eval_process != &ctrl_entity_nil) UI_TagF(".") UI_TagF("pop") { + Vec4F32 text_color = ui_color_from_name(str8_lit("text")); Vec4F32 symbol_color = ui_color_from_name(str8_lit("background")); Vec4F32 color_gen_table[] = { @@ -3508,15 +3528,72 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Annotation *annotation = push_array(scratch.arena, Annotation, 1); { annotation->name_string = push_str8_copy(scratch.arena, name); - annotation->kind_string = str8_lit("Annotation"); - annotation->color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)]; + annotation->bg_color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)]; + annotation->txt_color = text_color; annotation->vaddr_range = vaddr_range; } for(U64 vaddr = vaddr_range_in_visible.min; vaddr < vaddr_range_in_visible.max; vaddr += 1) { AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); n->v = annotation; - SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); + DLLPushBack(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); + } + } + } + } + + //- rjf: for any variable annotations, unpack type info, create additional annotations for + // structure members + for(AnnotationNode *n = variable_annotations.first; n != 0; n = n->next) + { + Annotation *a = n->v; + E_TypeKey type_key = a->type_key; + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class) + { + E_Type *type = e_type_from_key(type_key); + for EachIndex(member_idx, type->count) + { + E_Member *member = &type->members[member_idx]; + if(member->kind != E_MemberKind_DataField) + { + continue; + } + E_TypeKey member_type_key = member->type_key; + E_TypeKind member_type_kind = e_type_kind_from_key(member_type_key); + U64 member_size = e_type_byte_size_from_key(member_type_key); + Rng1U64 member_vaddr_range = r1u64(a->vaddr_range.min + member->off, a->vaddr_range.min + member->off + member_size); + Rng1U64 member_vaddr_range_in_visible = intersect_1u64(member_vaddr_range, viz_range_bytes); + if(member_vaddr_range_in_visible.max > member_vaddr_range_in_visible.min) + { + // rjf: create annotation for member + Annotation *member_annotation = push_array(scratch.arena, Annotation, 1); + { + member_annotation->name_string = member->name; + member_annotation->txt_color = a->txt_color; + member_annotation->bg_color = a->bg_color; + member_annotation->vaddr_range = member_vaddr_range; + member_annotation->dot_access = 1; + member_annotation->type_key = member_type_key; + } + + // rjf: push member annotation to associated bytes + { + for EachInRange(vaddr, member_vaddr_range_in_visible) + { + AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); + n->v = member_annotation; + DLLPushBack(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n); + } + } + + // rjf: push this member onto the variable annotations list + if(member_type_kind == E_TypeKind_Struct || member_type_kind == E_TypeKind_Class) + { + AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1); + n->v = member_annotation; + DLLPushBack(variable_annotations.first, variable_annotations.last, n); + } } } } @@ -3540,12 +3617,12 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ////////////////////////////// //- rjf: build scroll bar // - UI_Parent(container_box) UI_FontSize(main_font_size) + UI_Parent(container_box) UI_FontSize(ui_bottom_font_size()) { ui_set_next_fixed_x(content_rect.x1); ui_set_next_fixed_y(header_rect.y0); ui_set_next_fixed_width(scroll_bar_dim); - ui_set_next_fixed_height(dim_2f32(rect).y - dim_2f32(addrbar_rect).y); + ui_set_next_fixed_height(dim_2f32(rect).y - dim_2f32(addrbar_rect).y - dim_2f32(peekbar_rect).y); { scroll_pos.y = ui_scroll_bar(Axis2_Y, ui_px(scroll_bar_dim, 1.f), @@ -3576,7 +3653,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_BoxFlag_Clickable, "addrbar_box"); UI_Parent(addrbar_box) RD_Font(RD_FontSlot_Code) - UI_FontSize(font_size) + UI_FontSize(tab_font_size) { UI_Flags(UI_BoxFlag_DrawSideRight) UI_TextAlignment(UI_TextAlign_Center) @@ -3645,14 +3722,14 @@ RD_VIEW_UI_FUNCTION_DEF(memory) //- rjf: build peekbar // UI_Box *peekbar_box = &ui_nil_box; - UI_Parent(container_box) UI_FontSize(main_font_size) UI_TagF("floating") + UI_Parent(container_box) UI_FontSize(tab_font_size) UI_TagF("floating") { ui_set_next_fixed_x(peekbar_rect.x0); ui_set_next_fixed_y(peekbar_rect.y0); ui_set_next_fixed_width(dim_2f32(peekbar_rect).x); ui_set_next_fixed_height(dim_2f32(peekbar_rect).y); ui_set_next_child_layout_axis(Axis2_Y); - peekbar_box = ui_build_box_from_stringf(UI_BoxFlag_AllowOverflowX|UI_BoxFlag_ViewClampX|UI_BoxFlag_ViewScrollX|UI_BoxFlag_Clickable|UI_BoxFlag_Clip, "footer"); + peekbar_box = ui_build_box_from_stringf(UI_BoxFlag_AllowOverflowX|UI_BoxFlag_ViewClampX|UI_BoxFlag_ViewScrollX|UI_BoxFlag_Clickable|UI_BoxFlag_Clip, "peekbar"); UI_Parent(peekbar_box) RD_Font(RD_FontSlot_Code) UI_TextAlignment(UI_TextAlign_Center) { CFG_Node *view = cfg_node_from_id(rd_regs()->view); @@ -3768,7 +3845,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_BoxFlag_Clickable, "table_header"); UI_Parent(header_box) RD_Font(RD_FontSlot_Code) - UI_FontSize(font_size) + UI_FontSize(cell_font_size) { UI_PrefWidth(ui_px(address_margin_width_px, 1.f)) ui_labelf("Address"); UI_PrefWidth(ui_px(cell_width_px, 1.f)) @@ -3782,7 +3859,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_TagF(column_is_selected ? "" : "weak") ui_labelf("%I64X", row_off); } } - ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); + ui_spacer(ui_px(cell_big_glyph_advance*1.5f, 1.f)); UI_WidthFill ui_labelf("ASCII"); } UI_Signal sig = ui_signal_from_box(header_box); @@ -3797,80 +3874,110 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ////////////////////////////// //- rjf: build footer // -#if 0 UI_Box *footer_box = &ui_nil_box; - UI_Parent(container_box) UI_FontSize(main_font_size) UI_TagF("floating") + UI_Parent(container_box) UI_FontSize(tab_font_size) UI_TagF("floating") { ui_set_next_fixed_x(footer_rect.x0); ui_set_next_fixed_y(footer_rect.y0); ui_set_next_fixed_width(dim_2f32(footer_rect).x); ui_set_next_fixed_height(dim_2f32(footer_rect).y); - ui_set_next_child_layout_axis(Axis2_Y); footer_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawDropShadow, "footer"); - UI_Parent(footer_box) RD_Font(RD_FontSlot_Code) UI_WidthFill UI_TextAlignment(UI_TextAlign_Center) + UI_Parent(footer_box) RD_Font(RD_FontSlot_Code) { - CFG_Node *view = cfg_node_from_id(rd_regs()->view); - CFG_NodePtrList peek_types = cfg_node_child_list_from_string(scratch.arena, view, str8_lit("peek_type")); - ui_row_begin(); - F32 x_off_px = 0; - F32 x_max_px = dim_2f32(rect).x - scroll_bar_dim; - for EachNode(n, CFG_NodePtrNode, peek_types.first) + //- rjf: annotations for cursor position + if(contains_1u64(viz_range_bytes, cursor_base_vaddr)) UI_PrefWidth(ui_text_dim(2, 1)) UI_TextAlignment(UI_TextAlign_Center) { - String8 type_string = n->v->first->string; - E_Eval type_eval = e_eval_from_string(type_string); - if(type_eval.msgs.max_kind == E_MsgKind_Null) + U64 cursor_vaddr_visible_byte_idx = cursor_base_vaddr - viz_range_bytes.min; + AnnotationList cursor_byte_annotations = visible_memory_annotations[cursor_vaddr_visible_byte_idx]; + Vec4F32 divider_color = {0}; + UI_TagF("weak") divider_color = ui_color_from_name(str8_lit("text")); + + // rjf: build fstrs for . accessed annotations + DR_FStrList annotation_dot_accessed_fstrs = {0}; + AnnotationNode *first_non_dot_annotation = cursor_byte_annotations.last; { - String8 casted_expr = str8f(scratch.arena, "*(((%S) *)((((uint8 *)(&(%S)) + 0x%I64x))))", - type_string, - eval.string.size ? eval.string : str8_lit("0"), - selection.min - view_range.min); - E_Eval peek_eval = e_eval_from_string(casted_expr); - if(peek_eval.msgs.max_kind == E_MsgKind_Null) + for(AnnotationNode *n = cursor_byte_annotations.last; n != 0; n = n->prev) { - EV_StringParams params = + Annotation *a = n->v; + if(!a->dot_access) {break;} + first_non_dot_annotation = n->prev; + DR_FStr a_fstr = { - .flags = EV_StringFlag_ReadOnlyDisplayRules, - .radix = rd_view_setting_u64_from_name(str8_lit("default_radix")), + a->name_string, + { + ui_top_font(), + ui_top_text_raster_flags(), + a->txt_color, + ui_top_font_size(), + }, }; - String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), ¶ms, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, peek_eval); - F32 type_string_width_px = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, type_string).x + ui_top_font_size()*0.5f; - F32 value_string_width_px = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, value_string).x + ui_top_font_size()*0.5f; - type_string_width_px = Min(type_string_width_px, ui_top_font_size()*10.f); - value_string_width_px = Min(value_string_width_px, ui_top_font_size()*20.f); - F32 padding_px = ui_top_font_size()*0.5f; - x_off_px += type_string_width_px + value_string_width_px + padding_px*2.f; - if(x_off_px >= x_max_px) + dr_fstrs_push_front(scratch.arena, &annotation_dot_accessed_fstrs, &a_fstr); + DR_FStr dot_fstr = { - x_off_px = 0; - ui_row_end(); - ui_row_begin(); + str8_lit("."), + { + ui_top_font(), + ui_top_text_raster_flags(), + divider_color, + ui_top_font_size(), + }, + }; + dr_fstrs_push_front(scratch.arena, &annotation_dot_accessed_fstrs, &dot_fstr); + } + } + + // rjf: build fstrs for / 'accessed' annotations + DR_FStrList annotation_fstrs = {0}; + { + for(AnnotationNode *n = first_non_dot_annotation; n != 0; n = n->prev) + { + Annotation *a = n->v; + DR_FStr a_fstr = + { + a->name_string, + { + ui_top_font(), + ui_top_text_raster_flags(), + a->txt_color, + ui_top_font_size(), + }, + }; + dr_fstrs_push(scratch.arena, &annotation_fstrs, &a_fstr); + if(annotation_dot_accessed_fstrs.node_count != 0) + { + dr_fstrs_concat_in_place(&annotation_fstrs, &annotation_dot_accessed_fstrs); } - UI_PrefWidth(ui_children_sum(0)) UI_TagF(".") UI_TagF("implicit") + if(n->prev != 0) { - UI_Box *peek_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects, - "peek_type_%I64x", n->v->id); - UI_Parent(peek_box) UI_Padding(ui_px(padding_px, 0)) UI_Flags(UI_BoxFlag_DisableTruncatedHover) + DR_FStr slash_fstr = { - UI_PrefWidth(ui_px(type_string_width_px, 0)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), type_string); - UI_PrefWidth(ui_px(value_string_width_px, 0)) rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), value_string); - } - UI_Signal peek_sig = ui_signal_from_box(peek_box); - if(ui_hovering(peek_sig)) - { - rd_set_hover_eval(v2f32(peek_box->rect.x0, peek_box->rect.y1-2.f), casted_expr); - } - if(ui_clicked(peek_sig)) - { - rd_cmd(RD_CmdKind_PushQuery, .expr = casted_expr); - } + str8_lit(" / "), + { + ui_top_font(), + ui_top_text_raster_flags(), + divider_color, + ui_top_font_size(), + }, + }; + dr_fstrs_push(scratch.arena, &annotation_fstrs, &slash_fstr); } } } + + // rjf: build annotation label + UI_Box *a_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); + ui_box_equip_display_fstrs(a_box, &annotation_fstrs); + } + + ui_spacer(ui_pct(1, 0)); + + //- rjf: selection size + UI_PrefWidth(ui_text_dim(2, 1)) + { + U64 selection_size = dim_1u64(selection) + 1; + String8 selection_size_string = str8_from_memory_size(scratch.arena, selection_size); + ui_labelf("%S selected", selection_size_string); } - ui_row_end(); } UI_Signal sig = ui_signal_from_box(footer_box); if(ui_pressed(sig)) @@ -3880,7 +3987,6 @@ RD_VIEW_UI_FUNCTION_DEF(memory) mv->addrbar_is_focused = 0; } } -#endif ////////////////////////////// //- rjf: build scrollable box @@ -3933,7 +4039,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) // rjf: try from cells if(mouse_hover_byte_num == 0) { - U64 col_idx = ClampBot(mouse_rel.x-big_glyph_advance*20.f, 0)/cell_width_px; + U64 col_idx = ClampBot(mouse_rel.x-cell_big_glyph_advance*20.f, 0)/cell_width_px; if(col_idx < num_columns) { mouse_hover_byte_num = viz_range_bytes.min + row_idx*num_columns + col_idx + 1; @@ -3943,7 +4049,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) // rjf: try from ascii if(mouse_hover_byte_num == 0) { - U64 col_idx = ClampBot(mouse_rel.x - (big_glyph_advance*20.f + cell_width_px*num_columns + big_glyph_advance*1.5f), 0)/big_glyph_advance; + U64 col_idx = ClampBot(mouse_rel.x - (cell_big_glyph_advance*20.f + cell_width_px*num_columns + cell_big_glyph_advance*1.5f), 0)/cell_big_glyph_advance; col_idx = ClampTop(col_idx, num_columns-1); mouse_hover_byte_num = viz_range_bytes.min + row_idx*num_columns + col_idx + 1; } @@ -3983,11 +4089,11 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ui_eat_event(evt); if(evt->delta_2f32.y < 0) { - rd_cmd(RD_CmdKind_IncViewFontSize); + zoom_target += 0.1f; } else if(evt->delta_2f32.y > 0) { - rd_cmd(RD_CmdKind_DecViewFontSize); + zoom_target -= 0.1f; } } } @@ -4009,7 +4115,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ////////////////////////////// //- rjf: build rows // - UI_Parent(row_container_box) RD_Font(RD_FontSlot_Code) UI_FontSize(font_size) + UI_Parent(row_container_box) RD_Font(RD_FontSlot_Code) UI_FontSize(cell_font_size) { U8 *row_ascii_buffer = push_array(scratch.arena, U8, num_columns); UI_WidthFill UI_PrefHeight(ui_px(row_height_px, 1.f)) @@ -4024,7 +4130,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_Box *row = ui_build_box_from_stringf(row_flags, "row_%I64x", row_range_bytes.min); UI_Parent(row) { - UI_PrefWidth(ui_px(big_glyph_advance*20.f, 1.f)) + UI_PrefWidth(ui_px(cell_big_glyph_advance*20.f, 1.f)) { if(!(selection.max >= row_range_bytes.min && selection.min < row_range_bytes.max)) { @@ -4057,7 +4163,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) U8 byte_value = visible_memory[visible_byte_idx]; B32 byte_is_bad = !!(visible_memory_bad_flags[visible_byte_idx/64] & (1ull<<(visible_byte_idx%64))); B32 byte_is_changed = !!(visible_memory_change_flags[visible_byte_idx/64] & (1ull<<(visible_byte_idx%64))); - AnnotationNode *annotation_node = visible_memory_annotations[visible_byte_idx].first; + AnnotationNode *annotation_node = visible_memory_annotations[visible_byte_idx].last; // rjf: unpack visual cell info UI_BoxFlags cell_flags = 0; @@ -4074,7 +4180,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) if(annotation_node != 0) { cell_flags |= UI_BoxFlag_DrawBackground; - Vec4F32 cell_bg_color_rgba = annotation_node->v->color; + Vec4F32 cell_bg_color_rgba = annotation_node->v->bg_color; Vec4F32 cell_bg_color_hsva = hsva_from_rgba(cell_bg_color_rgba); cell_bg_rgba = mix_4f32(cell_bg_color_rgba, main_bg_color_rgba, clamp_1f32(r1f32(0, 1), 1.f - abs_f32(cell_bg_color_hsva.z - main_tx_color_hsva.z)*0.5f)); } @@ -4119,7 +4225,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Vec4F32 color = {0}; UI_TagF("bad") color = ui_color_from_name(str8_lit("text")); DR_FStrList fstrs = {0}; - DR_FStr fstr = {str8f(scratch.arena, "%c", mv->cell_value_edit_first_digit), {font, font_raster_flags, color, font_size, 0, 0}}; + DR_FStr fstr = {str8f(scratch.arena, "%c", mv->cell_value_edit_first_digit), {font, font_raster_flags, color, cell_font_size, 0, 0}}; dr_fstrs_push(scratch.arena, &fstrs, &fstr); ui_box_equip_display_fstrs(cell_box, &fstrs); } @@ -4136,16 +4242,19 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ui_box_equip_display_fstrs(cell_box, &byte_fstrs[byte_value]); } { - for(AnnotationNode *a_n = annotation_node; a_n != 0; a_n = a_n->next) + B32 did_opener = 0; + B32 did_closer = 0; + for(AnnotationNode *a_n = annotation_node; a_n != 0 && (!did_opener || !did_closer); a_n = a_n->next) { Annotation *a = a_n->v; - if(global_byte_idx == a->vaddr_range.min) UI_Parent(row_overlay_box) + if(!did_opener && global_byte_idx == a->vaddr_range.min) UI_Parent(row_overlay_box) { + did_opener = 1; F32 size = cell_width_px/4.f + cell_width_px/8.f*ui_anim(ui_key_from_stringf(ui_active_seed_key(), "###annotation_hovered_%I64x_%I64x", a->vaddr_range.min, a->vaddr_range.max), (F32)!!(a->vaddr_range.min+1 <= mouse_hover_byte_num && mouse_hover_byte_num <= a->vaddr_range.max)); - ui_set_next_border_color(a->color); - ui_set_next_fixed_x(big_glyph_advance*20.f + col_idx*cell_width_px + -size*0.5f); - ui_set_next_fixed_y((row_idx-viz_range_rows.min)*row_height_px + -size*0.5f); + ui_set_next_border_color(a->bg_color); + ui_set_next_fixed_x(cell_big_glyph_advance*20.f + col_idx*cell_width_px + -size*0.125f); + ui_set_next_fixed_y((row_idx-viz_range_rows.min)*row_height_px + -size*0.125f); ui_set_next_fixed_width(size); ui_set_next_fixed_height(size); ui_set_next_corner_radius_00(cell_width_px/8.f); @@ -4154,13 +4263,14 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ui_set_next_corner_radius_11(cell_width_px/8.f); ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawSideLeft|UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawDropShadow, ui_key_zero()); } - if(global_byte_idx+1 == a->vaddr_range.max) UI_Parent(row_overlay_box) + if(0 && !did_closer && global_byte_idx+1 == a->vaddr_range.max) UI_Parent(row_overlay_box) { + did_closer = 1; F32 size = cell_width_px/4.f + cell_width_px/8.f*ui_anim(ui_key_from_stringf(ui_active_seed_key(), "###annotation_hovered_%I64x_%I64x", a->vaddr_range.min, a->vaddr_range.max), (F32)!!(a->vaddr_range.min+1 <= mouse_hover_byte_num && mouse_hover_byte_num <= a->vaddr_range.max)); - ui_set_next_border_color(a->color); - ui_set_next_fixed_x(big_glyph_advance*20.f + (col_idx+1)*cell_width_px + -size*0.5f); - ui_set_next_fixed_y((row_idx-viz_range_rows.min)*row_height_px + row_height_px + -size*0.5f); + ui_set_next_border_color(a->bg_color); + ui_set_next_fixed_x(cell_big_glyph_advance*20.f + (col_idx+1)*cell_width_px + -size*0.125f); + ui_set_next_fixed_y((row_idx-viz_range_rows.min)*row_height_px + row_height_px + -size*0.125f); ui_set_next_fixed_width(size); ui_set_next_fixed_height(size); ui_set_next_corner_radius_00(cell_width_px/8.f); @@ -4171,6 +4281,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } } +#if 0 if(annotation_node != 0 && mouse_hover_byte_num == global_byte_num && !dragging_is_active) { UI_Tooltip UI_PrefHeight(ui_px(ui_top_font_size()*1.75f, 1.f)) @@ -4195,10 +4306,11 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } } +#endif } } } - ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f)); + ui_spacer(ui_px(cell_big_glyph_advance*1.5f, 1.f)); UI_WidthFill UI_TextPadding(0) { MemoryZero(row_ascii_buffer, num_columns); @@ -4227,9 +4339,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { Vec2F32 text_pos = ui_box_text_position(ascii_box); Vec4F32 color = selection_color; - dr_rect(r2f32p(text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.min+0-row_range_bytes.min)).x - font_size/8.f, + dr_rect(r2f32p(text_pos.x + fnt_dim_from_tag_size_string(font, cell_font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.min+0-row_range_bytes.min)).x - cell_font_size/8.f, ascii_box->rect.y0, - text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.max+1-row_range_bytes.min)).x + font_size/4.f, + text_pos.x + fnt_dim_from_tag_size_string(font, cell_font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.max+1-row_range_bytes.min)).x + cell_font_size/4.f, ascii_box->rect.y1), color, 0, 0, 1.f); @@ -4243,9 +4355,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { Vec2F32 text_pos = ui_box_text_position(ascii_box); Vec4F32 color = border_color; - dr_rect(r2f32p(text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num-1-row_range_bytes.min)).x - font_size/8.f, + dr_rect(r2f32p(text_pos.x + fnt_dim_from_tag_size_string(font, cell_font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num-1-row_range_bytes.min)).x - cell_font_size/8.f, ascii_box->rect.y0, - text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num+0-row_range_bytes.min)).x + font_size/4.f, + text_pos.x + fnt_dim_from_tag_size_string(font, cell_font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num+0-row_range_bytes.min)).x + cell_font_size/4.f, ascii_box->rect.y1), color, 1.f, 3.f, 1.f); @@ -4315,6 +4427,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { rd_store_view_param_u64(str8_lit("mark"), mark_base_vaddr); } + rd_store_view_param_f32(str8_lit("zoom"), zoom_target); rd_store_view_scroll_pos(scroll_pos); scratch_end(scratch); From 0a10e855a5ee1e793d7677c2cd142c59db1c9c41 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 14 Apr 2026 19:52:10 -0700 Subject: [PATCH 363/850] memory view fixes, changelog, notes --- CHANGELOG.md | 18 +++++++++++++ src/base/base_arena.c | 17 ++++++------ src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 +- src/raddbg/raddbg_main.c | 43 ++++++++++++++++++------------ src/raddbg/raddbg_views.c | 11 ++++---- 6 files changed, 61 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb74ef70..0fba8b26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ ## Debugger Changes +- Added a dedicated cursor address bar to the memory view. This can be focused + with the keyboard with the `Focus Menu` command. By default, this command is + bound to `Alt + D`, but if you have existing configuration, you may need to + bind it yourself manually (this can be done in the palette). This address bar + accepts any expression, and controls the cursor's address. All other + configuration options are still available in the memory view settings. +- Added "Peek Types" to the memory view. These control the set of types which + are used to interpret bytes at the cursor. Options exist for basic cases, + like integers and floats, but the view also supports entering a list of + full type expressions, which can include user-defined types like structures. +- Added annotations for members of structure variables to the memory view. +- Added a dedicated zoom setting for the memory view. +- Added a setting for automatically determining the number of columns in the + memory view based on the available space. +- Fixed many bugs and improved visuals in the memory view. - Fixed the debugger incorrectly evaluating pointer casts of registers in register space, rather than promoting them to process address space evaluations. This fixes cases where expressions like `(int *)rax` were not @@ -19,6 +34,9 @@ - Fixed the debugger not showing full call stacks when the top instruction pointer is located at a 0 address. - Fixed several crashes and instabilities. +- Added a dedicated settings button to the focused tab. This opens the same + menu as right-clicking the tab, but this makes this menu (and thus all + options for all tabs and views) more discoverable. - Added optional cursor trails, to visualize cursor motion. Can be turned off by toggling the `Cursor Trail` setting. - Added project names. When set, this name is used for displaying the project diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 5ed1ca64..c9e76289 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -11,7 +11,7 @@ arena_alloc_(ArenaParams *params) { U64 reserve_size = params->reserve_size; U64 commit_size = params->commit_size; - + // rjf: reserve/commit initial block void *base = params->optional_backing_buffer; if(base == 0) @@ -27,7 +27,7 @@ arena_alloc_(ArenaParams *params) reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size); commit_size = AlignPow2(commit_size, os_get_system_info()->page_size); } - + if(params->flags & ArenaFlag_LargePages) { base = os_reserve_large(reserve_size); @@ -39,7 +39,8 @@ arena_alloc_(ArenaParams *params) os_commit(base, commit_size); } AsanPoisonMemoryRegion(base, commit_size); - raddbg_annotate_vaddr_range(base, reserve_size, "arena %s:%i", params->allocation_site_file, params->allocation_site_line); + // TODO(rjf): we need to reintroduce this later when we have the ability to remove annotations... + // raddbg_annotate_vaddr_range(base, reserve_size, "arena %s:%i", params->allocation_site_file, params->allocation_site_line); } else { @@ -85,7 +86,7 @@ arena_release(Arena *arena) tmPlot(0, TM_PLOT_UNITS_MEMORY, TM_PLOT_DRAW_LINE, 0, "%s/%p", base_arena->name, base_arena); } #endif - + for(Arena *n = arena->current, *prev = 0; n != 0; n = prev) { prev = n->prev; @@ -152,7 +153,7 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) .flags = current->flags, .allocation_site_file = current->allocation_site_file, .allocation_site_line = current->allocation_site_line); - + size_to_zero = 0; } else @@ -197,7 +198,7 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) AsanUnpoisonMemoryRegion(result, size); MemoryZero(result, size_to_zero); } - + #if PROFILE_TELEMETRY if(size > KB(1)) { @@ -253,7 +254,7 @@ arena_pop_to(Arena *arena, U64 pos) AssertAlways(new_pos <= current->pos); AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos)); current->pos = new_pos; - + #if PROFILE_TELEMETRY if((pos - (new_pos + current->base_pos)) > KB(1)) { @@ -262,7 +263,7 @@ arena_pop_to(Arena *arena, U64 pos) tmPlot(0, TM_PLOT_UNITS_MEMORY, TM_PLOT_DRAW_LINE, (double)(current->base_pos + current->pos) / 1024.0 / 1024.0, "%s/%p", base_arena->name, base_arena); } #endif - + } //- rjf: arena push/pop helpers diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 4484749e..8101e7fc 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -437,7 +437,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[26] = {str8_lit_comp("list"), str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, {str8_lit_comp("text"), str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, {str8_lit_comp("disasm"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n 'arch': code_string,\n 'syntax': code_string,\n 'size': expr_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, -{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1) 'zoom': @range[0.25, 2] f32,\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': query,\n}\n")}, +{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1.0) 'zoom': @range[0.5, 2] f32,\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': query,\n}\n")}, {str8_lit_comp("bitmap"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, {str8_lit_comp("color"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, {str8_lit_comp("geo3d"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index ad103e6c..a3fc863b 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -541,7 +541,7 @@ RD_VocabTable: @inherit(tab) x: { @display_name("Zoom") @description("The zoom level for displaying bytes in the memory view.") - @default(1) 'zoom': @range[0.25, 2] f32, + @default(1.0) 'zoom': @range[0.5, 2] f32, @display_name("Base Address") @description("An expression which refers to the base address of data which should be viewed as memory.") 'expression': expr_string, @display_name("Address Range Size") @description("The number of bytes of the viewed memory range.") diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 7a6599f6..28e3bb92 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -2,30 +2,21 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: post-0.9.20 TODO notes +//~ rjf: post-0.9.25 TODO notes +// +//- evaluation space coverage pass +// [ ] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces +// [ ] need concrete ways of referring into a space at any offset - e.g. `process.memory + 0x1234`, `file:"foo".data + 0x1234`, `thread.regs + 0x80`, etc. +// [ ] memory view needs to take advantage of above when peeking; ensure peeking works on files etc. // //- memory view pass -// [ ] scroll bar -// [ ] horizontal scrolling? // [ ] toggleable ascii column -// [ ] toggleable hierarchy column? -// [x] cursor info at bottom? # of selected bytes, address range, cursor hierarchical location? -// [x] clean up tooltip? it's a bit big/noisy (maybe remove it after above?) -// [x] missing call stack frames? +// [ ] toggleable annotation tree column +// [ ] horizontal scrolling // //- fabian complaints / reports -// [ ] broadly, need to complete memory view & fix issues -// [ ] dumb panel click-through thing -// [ ] correct type interpretations; togglable interpretations -// [ ] make address editable; specialized version of the cursor address editor in tab right-click menu // [ ] simplified default layout // [ ] memory view deserves larger spot, in default layout -// [x] fix for-loop stepping oddities, likely single-line for-loop stepping -// [x] `foo, x` needs to correctly match `hex(foo)`, e.g. in application to expansions -// [x] eval: pointer casts of register space should promote to process space -// [x] more control over string visualization; specifically, when *not* to do it, even when using e.g. char *s -// [x] sign bits should not display on unsigned integers? -// [x] source/disasm ctx menu should include options for e.g. "go to selected thread" // [ ] ambiguous parsing cases - need to re-introduce identifier resolution into eval parse. (foo *)&bar // [ ] broadly, view discoverability / docs // [ ] signify empty watch window "expression" slot more as a text field? @@ -217,6 +208,24 @@ // [ ] font cache eviction (both for font tags, closing fp handles, and // rasterizations) +//////////////////////////////// +//~ rjf: Recently Completed +// +// [x] fix for-loop stepping oddities, likely single-line for-loop stepping +// [x] `foo, x` needs to correctly match `hex(foo)`, e.g. in application to expansions +// [x] eval: pointer casts of register space should promote to process space +// [x] more control over string visualization; specifically, when *not* to do it, even when using e.g. char *s +// [x] sign bits should not display on unsigned integers? +// [x] source/disasm ctx menu should include options for e.g. "go to selected thread" +// [x] correct type interpretations; togglable interpretations +// [x] make address editable; specialized version of the cursor address editor in tab right-click menu +// [x] broadly, need to complete memory view & fix issues +// [x] dumb panel click-through thing +// [x] cursor info at bottom? # of selected bytes, address range, cursor hierarchical location? +// [x] clean up tooltip? it's a bit big/noisy (maybe remove it after above?) +// [x] missing call stack frames? +// [x] scroll bar + //////////////////////////////// //~ rjf: Build Options diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 9058fb07..00540cce 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2691,7 +2691,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) FNT_RasterFlags font_raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code); F32 tab_font_size = ui_top_font_size(); F32 zoom_target = rd_view_setting_f32_from_name(str8_lit("zoom")); - zoom_target = Clamp(0.25f, zoom_target, 2.f); + zoom_target = Clamp(0.5f, zoom_target, 2.f); F32 zoom = ui_anim(ui_key_from_stringf(ui_key_zero(), "%I64x_zoom", rd_regs()->view), zoom_target, .initial = zoom_target); F32 cell_font_size = tab_font_size * zoom; F32 cell_big_glyph_advance = fnt_dim_from_tag_size_string(font, cell_font_size, 0, 0, str8_lit("H")).x; @@ -2724,6 +2724,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) F32 num_columns_f = ((dim_2f32(rect).x - address_margin_width_px - cell_big_glyph_advance*4.f) / (cell_width_px + cell_big_glyph_advance)); num_columns_f = ClampBot(1.f, num_columns_f); num_columns = (U64)num_columns_f; + num_columns = ClampTop(128, num_columns); } num_columns = ClampBot(1, num_columns); UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); @@ -2782,8 +2783,8 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ////////////////////////////// //- rjf: determine visible range of rows (occluded & non-occluded) // - S64 num_possible_visible_rows = num_possible_visible_rows = dim_2f32(rect).y/row_height_px;; - S64 num_possible_nonoccluded_visible_rows = (dim_2f32(content_rect).y - dim_2f32(footer_rect).y) / row_height_px; + S64 num_possible_visible_rows = dim_2f32(rect).y/row_height_px; + S64 num_possible_nonoccluded_visible_rows = (dim_2f32(content_rect).y - dim_2f32(header_rect).y - dim_2f32(footer_rect).y) / row_height_px - 1; ////////////////////////////// //- rjf: determine legal scroll range @@ -2804,7 +2805,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) (mv->last_cursor_range.min != cursor_range.min || mv->last_cursor_range.max != cursor_range.max)) { - mv->contain_cursor = 1; + mv->center_cursor = 1; if(track_mark_to_cursor) { mark_base_vaddr = cursor_base_vaddr; @@ -3104,7 +3105,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { mv->contain_cursor = 0; Rng1S64 viz_range_nonoccluded_rows = {0}; - viz_range_nonoccluded_rows.min = scroll_pos.y.idx + (S64)(content_rect.y0 / row_height_px); + viz_range_nonoccluded_rows.min = scroll_pos.y.idx + (S64)((content_rect.y0 - header_rect.y0) / row_height_px); viz_range_nonoccluded_rows.max = viz_range_nonoccluded_rows.min + num_possible_nonoccluded_visible_rows; viz_range_nonoccluded_rows.min = clamp_1s64(scroll_idx_rng, viz_range_nonoccluded_rows.min); viz_range_nonoccluded_rows.max = clamp_1s64(scroll_idx_rng, viz_range_nonoccluded_rows.max); From 7106265a148e54b68788847de05a1d2d996622a0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 14 Apr 2026 20:10:14 -0700 Subject: [PATCH 364/850] fix duplicate downstream marks of text artifacts; use cancel signal in text processing --- src/disasm/disasm.c | 5 ++++- src/text/text.c | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index 43874135..eb930f1b 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -470,7 +470,10 @@ dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_o } //- rjf: mark dependency on data hash - c_hash_downstream_inc(hash); + if(info_arena != 0) + { + c_hash_downstream_inc(hash); + } //- rjf: fill result if(info_arena != 0) diff --git a/src/text/text.c b/src/text/text.c index d8bac644..8d9a0bc3 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -2731,6 +2731,10 @@ txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_ou Rng1U64 range = lane_range(data.size); for EachInRange(idx, range) { + if(idx%1000 == 0 && ins_atomic_u32_eval(cancel_signal)) + { + break; + } if(data.str[idx] == '\n') { lane_line_count += 1; @@ -2753,6 +2757,10 @@ txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_ou U64 line_start_idx = 0; for(U64 idx = 0; idx <= data.size; idx += 1) { + if(idx%1000 == 0 && ins_atomic_u32_eval(cancel_signal)) + { + break; + } if(idx == data.size || data.str[idx] == '\n') { Rng1U64 line_range = r1u64(line_start_idx, idx); @@ -2838,6 +2846,10 @@ txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_ou U64 scope_idx = 0; for EachIndex(token_idx, tokens.count) { + if(token_idx%1000 == 0 && ins_atomic_u32_eval(cancel_signal)) + { + break; + } if(tokens.v[token_idx].kind == TXT_TokenKind_Symbol) { String8 token_string = str8_substr(data, tokens.v[token_idx].range); @@ -2910,8 +2922,18 @@ txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_ou lane_sync(); } + //- rjf: cancel -> release + if(lane_idx() == 0 && ins_atomic_u32_eval(cancel_signal)) + { + arena_release(shared->arena); + shared->arena = 0; + } + //- rjf: mark dependency on hash - c_hash_downstream_inc(hash); + if(lane_idx() == 0 && shared->arena != 0) + { + c_hash_downstream_inc(hash); + } //- rjf: package as artifact if(lane_idx() == 0 && shared->arena != 0) From 6a3638269079a3290a0471ffd9b0d0b7d17191bd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 15 Apr 2026 12:07:14 -0700 Subject: [PATCH 365/850] eval: remove incorrect truncate ops --- src/eval/eval_ir.c | 17 +---------------- src/mule/mule_main.cpp | 3 +++ 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 8c8db833..7beb8014 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -228,19 +228,8 @@ e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key) read_node->value.u64 = byte_size; e_irnode_push_child(read_node, c); - // rjf: build a signed trunc node if needed - U64 bit_size = byte_size << 3; - E_IRNode *with_trunc = read_node; - E_TypeKind kind = e_type_kind_from_key(type_key); - if(bit_size < 64 && e_type_kind_is_signed(kind)) - { - with_trunc = e_push_irnode(arena, RDI_EvalOp_TruncSigned); - with_trunc->value.u64 = bit_size; - e_irnode_push_child(with_trunc, read_node); - } - // rjf: fill - result = with_trunc; + result = read_node; return result; } @@ -898,10 +887,6 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I { new_tree = e_irtree_trunc(arena, in_tree, cast_type); } - if(e_type_kind_is_signed(cast_type_unwrapped_kind) && e_type_kind_is_integer(casted_type_unwrapped_kind) && !e_type_kind_is_signed(casted_type_unwrapped_kind)) - { - new_tree = e_irtree_trunc(arena, in_tree, cast_type); - } result.root = new_tree; result.type_key = cast_type; result.mode = E_Mode_Value; diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 64a47e14..1c81f570 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -413,6 +413,9 @@ type_coverage_eval_tests(void) uint32_t a = (1<<31); int32_t b = (1<<31); + uint32_t abcd = 0xaabbccdd; + int64_t abcd64 = (int64_t)abcd; + char string[] = "Hello World!"; char longer_text[] = "Suppose there was some text\n" From 8513ef8a4f77f7ee9be420ede75987ac218ece0e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 15 Apr 2026 12:28:42 -0700 Subject: [PATCH 366/850] pdb -> rdi conversion: be robust to zero itypes in function type parameter lists. was causing, in some cases, local variables to be incorrectly interpreted as parameters, because there was a (nonexistent) parameter to the function recorded in the type info. --- src/rdi_from_pdb/rdi_from_pdb.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 8df02b23..c777f199 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -2312,15 +2312,32 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); U32 arglist_itypes_count = arglist->count; - // rjf: build param type array - RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count); + // rjf: count non-zero arguments + U32 arglist_itypes_nonzero_count = 0; for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) { - params[idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + if(arglist_itypes_base[idx] != 0) + { + arglist_itypes_nonzero_count += 1; + } + } + + // rjf: build param type array + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_nonzero_count); + { + U64 dst_idx = 0; + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + if(arglist_itypes_base[idx] != 0) + { + params[dst_idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + dst_idx += 1; + } + } } // rjf: fill dst type - dst_type->count = arglist_itypes_count; + dst_type->count = arglist_itypes_nonzero_count; dst_type->param_types = params; }break; From 471abb99ca026d7138b81f0b504dc02805f07366 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 15 Apr 2026 12:30:21 -0700 Subject: [PATCH 367/850] fix ood readmeg --- src/raddbg/raddbg.mdesk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index a3fc863b..f4fe2100 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -2551,7 +2551,7 @@ raddbg_readme: @p "`range1(expr, min, max)`: Expresses that `expr` is a bounded numeric value between `min` and `max`. Interpreted by the debugger to build slider UI for an evaluation."; @p "`array(expr, count)`: Expresses that `expr` points to `count` values, rather than 1, or the fixed size implied by a static array. When expanded, displays only that many values."; @p "`slice(expr)`: Expresses that `expr` evaluates to a structure type which bundles a base pointer and a count (encoding how many elements to which the base pointer points). This count can be expressed either as an integer, or as an 'end pointer'. When expanded, displays that many elements following that base pointer."; - @p "`table(expr, ...)`: Expresses that `expr` should be expanded normally, but interprets all post-`expr` arguments as expressions which should be used to form cells for rows which are generated by this expression's expansions. This replaces the normal cells which are generated for an expansion in a Watch table."; + @p "`columns(expr, ...)`: Expresses that `expr` should be expanded normally, but interprets all post-`expr` arguments as expressions which should be used to form cells for rows which are generated by this expression's expansions. This replaces the normal cells which are generated for an expansion in a Watch table."; @p "`text(expr, [lang = ...])`: Generates a text visualizer, interpreting `expr` as (being or pointing to) text."; @p "`disasm(expr, [size = ...]`: Generates a disassembly visualizer, interpreting `expr` as (being or pointing to) machine code."; @p "`memory(expr, [size = ...])`: Generates a memory visualizer, interpreting `expr` as (being or pointing to) raw bytes."; From 3bef72f09f26e66cf7056cefe0cbfbe466c42ccc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 15 Apr 2026 12:43:52 -0700 Subject: [PATCH 368/850] changelog work --- CHANGELOG.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fba8b26..b68d8552 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,11 +29,16 @@ than `hex(foo)`, in that the hexadecimal setting was not being inherited. - Fixed the debugger leaking debug info conversion process handles. This addresses cases where the debugger was preventing stale debug info from being - updated, after a rebuild. -- Fixed the debugger not correctly using target-embedded markup data. + updated, after a rebuild. (#736) +- Fixed the debugger not correctly using target-embedded markup data. (#702) - Fixed the debugger not showing full call stacks when the top instruction pointer is located at a 0 address. -- Fixed several crashes and instabilities. +- Fixed integer casts producing incorrect values. (#754) +- Fixed the PDB -> RDI converter's interpretation of certain empty argument + lists in function types in PDB. This fixes some cases where local variables + were being interpreted as parameters, which resulted in incorrect evaluation + results. (#751) +- Fixed several crashes and instabilities. (#735) - Added a dedicated settings button to the focused tab. This opens the same menu as right-clicking the tab, but this makes this menu (and thus all options for all tabs and views) more discoverable. From dae90f0053c7789b0105d3da8a18df08bc3d212e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 15 Apr 2026 12:54:30 -0700 Subject: [PATCH 369/850] changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b68d8552..1c16d159 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,11 +16,11 @@ - Added a dedicated zoom setting for the memory view. - Added a setting for automatically determining the number of columns in the memory view based on the available space. -- Fixed many bugs and improved visuals in the memory view. +- Fixed many bugs and improved visuals in the memory view. (#690) - Fixed the debugger incorrectly evaluating pointer casts of registers in register space, rather than promoting them to process address space evaluations. This fixes cases where expressions like `(int *)rax` were not - evaluating correctly. + evaluating correctly. (#659) - Fixed the debugger incorrectly requiring multiple step operations when source lines mapped to multiple discontiguous ranges of instructions. This most notably showed up with certain styles of `for`-loops, especially with Clang From 5f3e7e71757dca9a58af1df818c85f7faa1e48e4 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 14 Apr 2026 23:54:32 -0700 Subject: [PATCH 370/850] whoops proc refences were pointing to stale symbols ideally linker parse module streams for proc references --- src/linker/lnk_debug_info.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index b5ecceb0..76c3ad8b 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1906,16 +1906,25 @@ THREAD_POOL_TASK_FUNC(lnk_move_global_symbols_to_gsi) String8List symbols = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols); CV_ModIndex imod = task->mod_arr[obj_idx]->imod; U64 symbol_cursor = sizeof(CV_Signature); + U64 scope_depth = 0; for EachNode(n, String8Node, symbols.first) { for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { CV_Symbol symbol = {0}; TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); - if (symbol.kind == CV_SymKind_SKIP) { continue; } + + if (symbol.kind == CV_SymKind_SKIP) { continue; } + else if (cv_is_global_symbol(symbol.kind)) { continue; } + else if (cv_is_typedef(symbol.kind) && scope_depth == 0) { continue; } + else if (symbol.kind == 0x1176) { continue; } + + if (cv_is_scope_symbol(symbol.kind)) { scope_depth += 1; } + else if (cv_is_end_symbol(symbol.kind)) { scope_depth -= 1; } if (symbol.kind == CV_SymKind_GPROC32 || symbol.kind == CV_SymKind_LPROC32) { String8 name = cv_name_from_symbol(symbol.kind, symbol.data); - proc_ref_nodes[proc_ref_idx].data = cv_make_proc_ref(proc_ref_arena, imod, symbol_cursor, name, cv_is_lproc(symbol)); - proc_ref_hashes[proc_ref_idx] = hash_from_cv_symbol(&proc_ref_nodes[proc_ref_idx].data); + proc_ref_nodes [proc_ref_idx].data = cv_make_proc_ref(proc_ref_arena, imod, symbol_cursor, name, cv_is_lproc(symbol)); + proc_ref_nodes [proc_ref_idx].data.offset = symbol_cursor; + proc_ref_hashes[proc_ref_idx] = gsi_hash(gsi, name); proc_ref_idx += 1; } @@ -2061,9 +2070,9 @@ lnk_write_debug_s_to_pdb_module(PDB_DbiModule *mod, CV_DebugS debug_s, String8No for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= n->string.size; ) { CV_Symbol symbol = {0}; TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); - if (symbol.kind == CV_SymKind_SKIP) { continue; } - if (cv_is_global_symbol(symbol.kind)) { continue; } + if (symbol.kind == CV_SymKind_SKIP) { continue; } + else if (cv_is_global_symbol(symbol.kind)) { continue; } else if (cv_is_typedef(symbol.kind) && scope_depth == 0) { continue; } else if (symbol.kind == 0x1176) { continue; } From d1d42102dde8c0e36419de2b7c147fe95d6597d2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 15 Apr 2026 10:29:41 -0700 Subject: [PATCH 371/850] discard trailing free page maps --- src/linker/pdb_ext/msf_builder.c | 56 +++++++++++++++----------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index eaa2f146..af5e8305 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -626,32 +626,31 @@ msf_find_max_pn_(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNu for (MSF_Int fpm_pn_idx = (MSF_Int)fpm_pn_arr.count - 1; fpm_pn_idx >= 0; fpm_pn_idx -= 1) { MSF_PageNumber fpm_pn = fpm_pn_arr.v[fpm_pn_idx]; U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn); - - // we have to work around the fact that FPM bits are always alloced - // and also there is a trail of unused FPM groups too - U32 bit_idx = max_U32; - for (MSF_Int i = fpm_page_count - 1; i >= 0; i -= 1) { - U32 fpm_lo = i * fpm_interval_wrong + 3; // skip first page bit and FPM group bits - U32 fpm_hi = i * fpm_interval_wrong + fpm_interval_wrong; - bit_idx = bit_array_scan_right_to_left32(fpm_data, fpm_lo, fpm_hi, MSF_PAGE_STATE_ALLOC); - if (bit_idx <= fpm_interval_correct) { - break; - } - } - - // check first page bit - if (bit_idx >= fpm_interval_correct) { - bit_idx = bit_array_scan_left_to_right32(fpm_data, 0, 1, MSF_PAGE_STATE_ALLOC); - if (bit_idx >= fpm_interval_correct) { + + U64 bit_idx = max_U64; + U64 hi = fpm_data.count*32; + while (hi > 0) { + U64 msb_idx = bit_array_scan_right_to_left32(fpm_data, 0, hi, MSF_PAGE_STATE_ALLOC); + + // FPM is empty + if (msb_idx >= hi) { break; } + + // hit FPM page -- keep going + U64 k = msb_idx % fpm_interval_wrong; + if (k < 3) { + hi = msb_idx; continue; } + + bit_idx = msb_idx; + break; + } + + // stop if there is a page + if (bit_idx != max_U64) { + max_pn = Max(bit_idx, 2) + fpm_pn_idx * fpm_interval_correct; + break; } - - // compute max page number - MSF_PageNumber pn = bit_idx + (MSF_UInt)fpm_pn_idx * fpm_interval_correct; - max_pn = Max(max_pn, pn); - - break; } return max_pn; @@ -666,6 +665,7 @@ msf_find_max_pn(MSF_PageDataList page_data_list, MSF_UInt page_size) MSF_PageNumber fpm0_max = msf_find_max_pn_(page_data_list, page_size, fpm0_pn_arr); MSF_PageNumber fpm1_max = msf_find_max_pn_(page_data_list, page_size, fpm1_pn_arr); MSF_PageNumber max_pn = Max(fpm0_max, fpm1_max); + Assert(max_pn > 1); scratch_end(scratch); return max_pn; } @@ -1672,13 +1672,9 @@ msf_get_page_data_nodes(Arena *arena, MSF_Context *msf) internal U64 msf_get_save_size(MSF_Context *msf) { -#if 0 - MSF_PageNumber max_pn = msf_find_max_pn(msf->page_data_list, msf->page_size); - U64 size = ((U64)max_pn + 1) * (U64)msf->page_size; - Assert(msf_count_pages(size, msf->page_size) == msf->page_count); -#else - U64 size = (U64)msf->page_count * msf->page_size; -#endif + MSF_PageNumber max_pn = msf_find_max_pn(msf->page_data_list, msf->page_size); + U64 page_count = max_pn + 1; + U64 size = page_count * msf->page_size; return size; } From 4eee46764e4d579dc29a8c5441d2dff1df3621f5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 15 Apr 2026 13:13:51 -0700 Subject: [PATCH 372/850] update the change log --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c16d159..242ba133 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,16 @@ - Adjusted the source code context menu to activate commands with a single press, rather than the usual double click behavior from general palettes. +## Linker Changes + +- Optimized debug info generation to reduce memory usage in large links by 25%. +- Fixed a determinism issue that caused linker to write unreliable debug info. +- Fixed over-reservetaion of PDB pages, reducing the PDB size. +- Implemented /INFERASANLIBS +- Implemented /WHOLEARCHIVE +- Implemented /PDBSTRIPPED +- Set correct defaults for unload and bind import tables. + # v0.9.24-alpha ## Debugger Changes From 7872ba5542f64a7bdc92ac7a4ed923f30d4bab19 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 15 Apr 2026 13:14:20 -0700 Subject: [PATCH 373/850] disable ASAN for clang (need to figure out how to locate LLVM DLL) --- run_tests.bat | 4 ++-- src/torture/torture_p2r.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/run_tests.bat b/run_tests.bat index f314b283..e736426f 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -24,10 +24,10 @@ for %%c in (%CC_VALUES%) do for %%m in (%MODE_VALUES%) do ( ) rem clang does not compile with asan in release mode because it runs out of memory - if "%%c::%%m" neq "clang::release" ( + if "%%c" equ "clang" ( call build.bat meta %%c %%m %TARGET_VALUES% || exit /b 1 ) else ( - call build.bat asan meta %%c %%m %TARGET_VALUES% || exit /b 1 + call build.bat meta asan %%c %%m %TARGET_VALUES% || exit /b 1 ) pushd build diff --git a/src/torture/torture_p2r.c b/src/torture/torture_p2r.c index 7b478705..9fb67705 100644 --- a/src/torture/torture_p2r.c +++ b/src/torture/torture_p2r.c @@ -1,6 +1,9 @@ #define T_Group "p2r" #if OS_WINDOWS + +// TODO: location is not baked consistently +#if !COMPILER_CLANG || (COMPILER_CLANG && BUILD_DEBUG) T_BeginTest(p2r_determ) { U64 num_repeats_per_pdb = 32; @@ -118,6 +121,7 @@ T_BeginTest(p2r_determ) } } #endif +#endif #undef T_Group From 437e242260864169c3c9de3dd1a969046e08d29c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 15 Apr 2026 13:15:30 -0700 Subject: [PATCH 374/850] dial down run count in determ_test --- src/torture/torture_radlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 61a2db4c..62478a8b 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4921,7 +4921,7 @@ T_BeginTest(determ_test) String8 b_pdb = t_read_file(arena, str8_lit("b.pdb")); // multi-threaded links - for EachIndex(i, 50) { + for EachIndex(i, 25) { Temp temp = temp_begin(arena); t_delete_file(str8_lit("a.exe")); From ae99355c1dca2067a5b5d5595b7295c3aca2dbd8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 15 Apr 2026 15:10:22 -0700 Subject: [PATCH 375/850] shift upper type index bound --- src/linker/codeview_ext/codeview.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 235d0b45..74e7938f 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -1137,6 +1137,13 @@ store_stop: for EachElement(i, debug_t.ti_ranges) { debug_t.ti_ranges[i] = r1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + debug_t.count); } + // shift upper type index bound to include precompiled types + CV_Leaf leaf = cv_debug_t_get_leaf(&debug_t, 0); + if (leaf.kind == CV_LeafKind_PRECOMP) { + CV_PrecompInfo precomp_info = cv_precomp_info_from_leaf(leaf); + for EachElement(i, debug_t.ti_ranges) { debug_t.ti_ranges[i].max += precomp_info.leaf_count; } + } + ProfEnd(); return debug_t; } From 18f468bc97d5879f26be821233d2e7a946a2e61d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 15 Apr 2026 15:10:37 -0700 Subject: [PATCH 376/850] os_process_join closes handle --- src/linker/lnk.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 1798e071..9c65833d 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -396,7 +396,6 @@ lnk_merge_manifest_files(String8 mt_path, String8 out_name, String8List manifest lnk_error(LNK_Error_Mt, "unable to start process: %S", mt_path); } else { os_process_join(mt_handle, max_U64, 0); - os_process_detach(mt_handle); } scratch_end(scratch); From d0364dc39cba59e05a2051f8b107881879b8565c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 15 Apr 2026 15:21:39 -0700 Subject: [PATCH 377/850] minor fixes for handling cyclic and corrupted types --- src/linker/lnk_debug_info.c | 35 ++++++++++++++++++-------------- src/linker/pdb_ext/msf_builder.c | 10 +++++++-- src/torture/torture_radlink.c | 5 +++-- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 76c3ad8b..2cdef26f 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -467,8 +467,8 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla U64 lf_idx = debug_p->count - (i + 1); CV_LeafHeader *lf = cv_debug_t_get_leaf_header(debug_p, lf_idx); if (lf->kind == CV_LeafKind_ENDPRECOMP) { + memory_write16(&lf->size, sizeof(lf->kind)); memory_write16(&lf->kind, CV_LeafKind_NOTYPE); - memory_write16(&lf->size, sizeof(CV_LeafKind)); break; } } @@ -602,14 +602,6 @@ lnk_hash_cv_leaf(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInf // init hasher blake3_hasher hasher; blake3_hasher_init(&hasher); - // hash leaf header - { - CV_LeafHeader header; - header.size = (U16)leaf.data.size; - header.kind = leaf.kind; - blake3_hasher_update(&hasher, &header, sizeof(header)); - } - // hash bytes around indices { U64 last_ti_off = 0; @@ -638,17 +630,23 @@ lnk_hash_cv_leaf(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInf } if (sub_ti >= debug_t->ti_ranges[sub_ti_n->source].max) { - Temp scratch = scratch_begin(0,0); + // discard type + U32 leaf_idx = curr_ti - debug_t->ti_ranges[curr_ti_source].min; + U8 *leaf_header = debug_t->data.str + debug_t->offsets[leaf_idx]; + memory_write16(leaf_header + OffsetOf(CV_LeafHeader, kind), CV_LeafKind_NOTYPE); + memory_write16(leaf_header + OffsetOf(CV_LeafHeader, size), sizeof(CV_LeafKind)); - String8 out_of_bounds_data = push_str8f(scratch.arena, "out_of_bounds_ti_%u_in_%u", sub_ti, leaf_ref.obj_idx); - blake3_hasher_update(&hasher, out_of_bounds_data.str, out_of_bounds_data.size); + // reset hasher + blake3_hasher_init(&hasher); + // log error + Temp scratch = scratch_begin(0,0); String8 leaf_kind_str = cv_string_from_leaf_kind(leaf.kind); String8 error_msg = push_str8f(scratch.arena, "LF_%S(type_index: 0x%x) out of bounds type index 0x%x (leaf struct offset: 0x%llx)", leaf_kind_str, curr_ti, sub_ti, sub_ti_n->offset); lnk_error_obj(LNK_Error_InvalidTypeIndex, input->obj_arr[leaf_ref.obj_idx], "%S", error_msg); - scratch_end(scratch); - continue; + + break; } // discard type with a cyclic-ref @@ -660,6 +658,9 @@ lnk_hash_cv_leaf(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInf memory_write16(leaf_header + OffsetOf(CV_LeafHeader, kind), CV_LeafKind_NOTYPE); memory_write16(leaf_header + OffsetOf(CV_LeafHeader, size), sizeof(CV_LeafKind)); + // reset hasher + blake3_hasher_init(&hasher); + // log error Temp scratch = scratch_begin(0,0); String8 leaf_kind_str = cv_string_from_leaf_kind(leaf.kind); @@ -667,7 +668,7 @@ lnk_hash_cv_leaf(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInf lnk_error_obj(LNK_Error_InvalidTypeIndex, input->obj_arr[leaf_ref.obj_idx], "%S", error_msg); scratch_end(scratch); - continue; + break; } // type index -> hash @@ -678,6 +679,10 @@ lnk_hash_cv_leaf(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInf blake3_hasher_update(&hasher, &sub_hash, sizeof(sub_hash)); } + // hash leaf header + CV_LeafHeader *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_ref.leaf_idx); + blake3_hasher_update(&hasher, leaf_header, sizeof(*leaf_header)); + U64 hash; blake3_hasher_finalize(&hasher, (U8 *) &hash, sizeof(hash)); diff --git a/src/linker/pdb_ext/msf_builder.c b/src/linker/pdb_ext/msf_builder.c index af5e8305..b19560af 100644 --- a/src/linker/pdb_ext/msf_builder.c +++ b/src/linker/pdb_ext/msf_builder.c @@ -1224,7 +1224,7 @@ msf_data_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) String8 page = msf_data_from_pn(msf->page_data_list, msf->page_size, n->pn); if (acc.str + acc.size != page.str) { - if (acc.size > 0) { + if (acc.size) { str8_list_push(arena, &result, acc); } acc = page; @@ -1233,6 +1233,11 @@ msf_data_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) } } + if (acc.size) { + str8_list_push(arena, &result, acc); + MemoryZeroStruct(&acc); + } + if (n) { String8 page = msf_data_from_pn(msf->page_data_list, msf->page_size, n->pn); if (acc.str + acc.size != page.str) { @@ -1243,11 +1248,12 @@ msf_data_from_sn(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn) acc.size = Min(stream->size - result.total_size, acc.size); - if (acc.size > 0) { + if (acc.size) { str8_list_push(arena, &result, acc); } } + Assert(result.total_size == stream->size); return result; } diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 62478a8b..ab332910 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4594,7 +4594,7 @@ T_BeginTest(get_msf_stream_pages) String8List stream_data = msf_data_from_sn(arena, msf, sn); T_Ok(stream_data.total_size == stream_size); - T_Ok(stream_data.node_count == 11); + T_Ok(stream_data.node_count == 12); String8Array a = str8_array_from_list(arena, &stream_data); T_Ok(a.v[0].size == 0xffd000); @@ -4607,7 +4607,8 @@ T_BeginTest(get_msf_stream_pages) T_Ok(a.v[7].size == 0xffd000); T_Ok(a.v[8].size == 0x1000); T_Ok(a.v[9].size == 0xffe000); - T_Ok(a.v[10].size == 0x613001); + T_Ok(a.v[10].size == 0x613000); + T_Ok(a.v[11].size == 1); String8Node buf = *stream_data.first; U64 buf_pos = 0; From 15ff96f4a1f084703dd47bfd8b963f22646baf21 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Apr 2026 11:52:59 -0700 Subject: [PATCH 378/850] rename macro for declaring tests --- src/torture/torture.h | 10 +- src/torture/torture_base.c | 4 +- src/torture/torture_d2r.c | 24 ++--- src/torture/torture_dwarf.c | 28 +++--- src/torture/torture_eval.c | 2 +- src/torture/torture_p2r.c | 2 +- src/torture/torture_radlink.c | 172 +++++++++++++++++----------------- 7 files changed, 121 insertions(+), 121 deletions(-) diff --git a/src/torture/torture.h b/src/torture/torture.h index 161f1024..d3c2718c 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -48,17 +48,17 @@ extern T_Test g_torture_tests[0xffffff]; } #if COMPILER_MSVC -#pragma section(".CRT$XCU", read) -# define T_BeginTest_(name) \ +# pragma section(".CRT$XCU", read) +# define TEST_(name) \ T_AddTest(name, __LINE__) \ __declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ __pragma(comment(linker, "/include:" Stringify(r_##name))) #else -# define T_BeginTest_(name) T_AddTest(name, __LINE__, __attribute__((constructor))) +# define TEST_(name) T_AddTest(name, __LINE__, __attribute__((constructor))) #endif -#define T_BeginTest(name) \ - T_BeginTest_(name) \ +#define TEST(name) \ + TEST_(name) \ T_RunSig(name) #define T_Ok(c) do { if (!(c)) { result_out->fail_file = __FILE__; result_out->fail_line = __LINE__; result_out->fail_cond = Stringify(c); result_out->status = T_RunStatus_Fail; return; } } while(0) diff --git a/src/torture/torture_base.c b/src/torture/torture_base.c index ba8e46d4..a79a57f9 100644 --- a/src/torture/torture_base.c +++ b/src/torture/torture_base.c @@ -3,7 +3,7 @@ #define T_Group "Base" -T_BeginTest(str8_list_substr) +TEST(str8_list_substr) { String8List zero_list = {0}; @@ -69,7 +69,7 @@ T_BeginTest(str8_list_substr) } } -T_BeginTest(bit_array) +TEST(bit_array) { for (U64 start=0; start<32*3; start++) { for (U64 end=start; end<32*3; end++) { diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 88ec815f..eadda433 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -57,14 +57,14 @@ d2rt_type_from_name(RDI_Parsed *rdi, RDI_ParsedNameMap *map, char *name) return 0; } -T_BeginTest(d2r_types) +TEST(d2r_types) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); { dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); -#define DeclBaseType(tt, n, e, s) \ +#define DeclBaseType(tt, n, e, s) \ DW_WriterTag *tt = dw_writer_tag_begin(writer, DW_TagKind_BaseType); \ dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, s); \ dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_##e); \ @@ -104,8 +104,8 @@ dw_writer_tag_end(writer); DeclBaseType(decimal128_type, "_Decimal128", DecimalFloat, 16); #undef DeclBaseType -#define DeclStdint(n, a) \ -do { \ +#define DeclStdint(n, a) \ +do { \ dw_writer_tag_begin(writer, DW_TagKind_Typedef); \ dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, a); \ @@ -147,8 +147,8 @@ dw_writer_tag_end(writer); \ RDI_ParsedNameMap types_map = {0}; rdi_parsed_from_name_map(rdi, types_nm, &types_map); -#define TestBuiltinType(n, bs, r) \ -do { \ +#define TestBuiltinType(n, bs, r) \ +do { \ RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ T_Ok(alias); \ T_Ok(alias->kind == RDI_TypeKind_Alias); \ @@ -194,8 +194,8 @@ T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), s TestBuiltinType("_Decimal128", 16, Decimal128); #undef TestBuiltinType -#define TestStdint(n, s, t) \ -do { \ +#define TestStdint(n, s, t) \ +do { \ RDI_TypeNode *td = d2rt_type_from_name(rdi, &types_map, n); \ T_Ok(td); \ T_Ok(td->kind == RDI_TypeKind_Alias); \ @@ -221,7 +221,7 @@ T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), s dw_writer_end(&writer); } -T_BeginTest(d2r_line_table) +TEST(d2r_line_table) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); String8 comp_dir = str8_lit("c:/DEVEL/"); @@ -282,7 +282,7 @@ T_BeginTest(d2r_line_table) dw_writer_end(&writer); } -T_BeginTest(d2r_checksums) +TEST(d2r_checksums) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); @@ -318,7 +318,7 @@ T_BeginTest(d2r_checksums) } #if SUBPROGRAM_CONVERSION_TEST -T_BeginTest(d2r_subprogram) +TEST(d2r_subprogram) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); @@ -438,7 +438,7 @@ T_BeginTest(d2r_subprogram) } #endif -T_BeginTest(d2r_general) +TEST(d2r_general) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); { diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 00aa9999..0cf63150 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -45,7 +45,7 @@ t_dw_test_sleb128(U64 v, U64 expected_length) return is_ok; } -T_BeginTest(test_leb128) +TEST(test_leb128) { T_Ok(t_dw_test_uleb128(0, 1)); T_Ok(t_dw_test_sleb128(0, 1)); @@ -134,7 +134,7 @@ dw_input_from_writer(Arena *arena, DW_Writer *writer) return input; } -T_BeginTest(dwarf_32bit) +TEST(dwarf_32bit) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); @@ -162,7 +162,7 @@ T_BeginTest(dwarf_32bit) dw_writer_end(&writer); } -T_BeginTest(dwarf_64bit) +TEST(dwarf_64bit) { DW_Writer *writer = dw_writer_begin(DW_Format_64Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); @@ -190,7 +190,7 @@ T_BeginTest(dwarf_64bit) dw_writer_end(&writer); } -T_BeginTest(dwarf_line_opcodes) +TEST(dwarf_line_opcodes) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); String8 comp_dir = str8_lit("c:/devel/"); @@ -359,7 +359,7 @@ T_BeginTest(dwarf_line_opcodes) dw_writer_end(&writer); } -T_BeginTest(dwarf_line_emit) +TEST(dwarf_line_emit) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); String8 comp_dir = str8_lit("c:/devel/"); @@ -559,7 +559,7 @@ T_BeginTest(dwarf_line_emit) } } -T_BeginTest(dwarf_writer) +TEST(dwarf_writer) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); // info @@ -859,7 +859,7 @@ T_BeginTest(dwarf_writer) dw_writer_end(&writer); } -T_BeginTest(value_in_register) +TEST(value_in_register) { // setup register context REGS_RegBlockX64 regs = {0}; @@ -883,7 +883,7 @@ T_BeginTest(value_in_register) T_Ok(expr_value.u64 == value); } -T_BeginTest(value_in_x_register) +TEST(value_in_x_register) { // setup register context REGS_RegBlockX64 regs = {0}; @@ -907,7 +907,7 @@ T_BeginTest(value_in_x_register) T_Ok(expr_value.u64 == value); } -T_BeginTest(address_of_value) +TEST(address_of_value) { // compile a simple program which reads address U64 addr = 0xdeadbeef; @@ -925,7 +925,7 @@ T_BeginTest(address_of_value) T_Ok(expr_value.addr == addr); } -T_BeginTest(register_relative_variable) +TEST(register_relative_variable) { // setup register context REGS_RegBlockX64 regs = {0}; @@ -947,7 +947,7 @@ T_BeginTest(register_relative_variable) T_Ok(expr_value.addr == (1 + 44)); } -T_BeginTest(frame_relative_variable) +TEST(frame_relative_variable) { DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(FBReg), DW_ExprEnc_SLEB128(-50) }; String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); @@ -969,7 +969,7 @@ MACHINE_OP_MEM_READ(t_machine_op_mem_read) return MachineOpResult_Ok; } -T_BeginTest(call_by_reference) +TEST(call_by_reference) { U8 *memory = push_array(arena, U8, 128); U64 value = 0xc0ffee; @@ -993,7 +993,7 @@ T_BeginTest(call_by_reference) T_Ok(*(U64 *)expr_value.generic.str == value); } -T_BeginTest(plus_uconst) +TEST(plus_uconst) { U64 struct_addr = 0x123; DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_Addr(struct_addr), DW_ExprEnc_Op(PlusUConst), DW_ExprEnc_ULEB128(4) }; @@ -1008,7 +1008,7 @@ T_BeginTest(plus_uconst) } #if 0 -T_BeginTest(reg_split_spill) +TEST(reg_split_spill) { // setup register context REGS_RegBlockX64 regs = {0}; diff --git a/src/torture/torture_eval.c b/src/torture/torture_eval.c index da461a9e..617974b7 100644 --- a/src/torture/torture_eval.c +++ b/src/torture/torture_eval.c @@ -1,6 +1,6 @@ #define T_Group "eval" -T_BeginTest(eval_compiler_basics) +TEST(eval_compiler_basics) { E_Cache *eval_cache = e_cache_alloc(); e_select_cache(eval_cache); diff --git a/src/torture/torture_p2r.c b/src/torture/torture_p2r.c index 9fb67705..17f76c5e 100644 --- a/src/torture/torture_p2r.c +++ b/src/torture/torture_p2r.c @@ -4,7 +4,7 @@ // TODO: location is not baked consistently #if !COMPILER_CLANG || (COMPILER_CLANG && BUILD_DEBUG) -T_BeginTest(p2r_determ) +TEST(p2r_determ) { U64 num_repeats_per_pdb = 32; String8 pdb_paths[] = diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index ab332910..9ff94e09 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -82,7 +82,7 @@ t_write_entry_obj(void) #define T_Group "Linker" -T_BeginTest(machine_compat_check) +TEST(machine_compat_check) { // unknown.obj { @@ -134,7 +134,7 @@ T_BeginTest(machine_compat_check) T_Ok(g_last_exit_code != 0); } -T_BeginTest(simple_link_test) +TEST(simple_link_test) { U8 text_payload[] = { 0xC3 }; @@ -213,7 +213,7 @@ T_BeginTest(simple_link_test) } -T_BeginTest(out_of_bounds_section_number) +TEST(out_of_bounds_section_number) { // bad.obj { @@ -254,7 +254,7 @@ T_BeginTest(out_of_bounds_section_number) } -T_BeginTest(merge) +TEST(merge) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -336,7 +336,7 @@ T_BeginTest(merge) } } -T_BeginTest(link_undef) +TEST(link_undef) { String8 undef_obj; { @@ -369,7 +369,7 @@ T_BeginTest(link_undef) T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } -T_BeginTest(link_unref_undef) +TEST(link_unref_undef) { String8 undef_obj; { @@ -397,7 +397,7 @@ T_BeginTest(link_unref_undef) T_Ok(g_last_exit_code != 0); } -T_BeginTest(weak_lib_vs_weak_lib) +TEST(weak_lib_vs_weak_lib) { String8 a_obj; { @@ -462,7 +462,7 @@ T_BeginTest(weak_lib_vs_weak_lib) } } -T_BeginTest(weak_lib_vs_weak_nolib) +TEST(weak_lib_vs_weak_nolib) { String8 a_obj; { @@ -510,7 +510,7 @@ T_BeginTest(weak_lib_vs_weak_nolib) } } -T_BeginTest(weak_lib_vs_weak_alias) +TEST(weak_lib_vs_weak_alias) { String8 a_obj; { @@ -545,7 +545,7 @@ T_BeginTest(weak_lib_vs_weak_alias) T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } -T_BeginTest(weak_lib_vs_weak_antidep) +TEST(weak_lib_vs_weak_antidep) { String8 a_obj; { @@ -593,7 +593,7 @@ T_BeginTest(weak_lib_vs_weak_antidep) } } -T_BeginTest(weak_alias_vs_weak_alias) +TEST(weak_alias_vs_weak_alias) { String8 a; { @@ -636,7 +636,7 @@ T_BeginTest(weak_alias_vs_weak_alias) T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } -T_BeginTest(weak_alias_vs_weak_lib) +TEST(weak_alias_vs_weak_lib) { String8 a_obj; { @@ -684,7 +684,7 @@ T_BeginTest(weak_alias_vs_weak_lib) } } -T_BeginTest(weak_alias_vs_weak_nolib) +TEST(weak_alias_vs_weak_nolib) { String8 a_obj; { @@ -732,7 +732,7 @@ T_BeginTest(weak_alias_vs_weak_nolib) } } -T_BeginTest(weak_alias_vs_weak_antidep) +TEST(weak_alias_vs_weak_antidep) { String8 a_obj; { @@ -780,7 +780,7 @@ T_BeginTest(weak_alias_vs_weak_antidep) } } -T_BeginTest(weak_nolib_vs_weak_nolib) +TEST(weak_nolib_vs_weak_nolib) { String8 a_obj; { @@ -827,7 +827,7 @@ T_BeginTest(weak_nolib_vs_weak_nolib) } } -T_BeginTest(weak_nolib_vs_weak_lib) +TEST(weak_nolib_vs_weak_lib) { String8 a_obj; { @@ -874,7 +874,7 @@ T_BeginTest(weak_nolib_vs_weak_lib) } } -T_BeginTest(weak_nolib_vs_weak_alias) +TEST(weak_nolib_vs_weak_alias) { String8 a_obj; { @@ -908,7 +908,7 @@ T_BeginTest(weak_nolib_vs_weak_alias) T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } -T_BeginTest(weak_nolib_vs_weak_antidep) +TEST(weak_nolib_vs_weak_antidep) { String8 a_obj; { @@ -955,7 +955,7 @@ T_BeginTest(weak_nolib_vs_weak_antidep) } } -T_BeginTest(weak_antidep_vs_weak_antidep) +TEST(weak_antidep_vs_weak_antidep) { String8 a_obj; { @@ -1020,7 +1020,7 @@ T_BeginTest(weak_antidep_vs_weak_antidep) } } -T_BeginTest(weak_antidep_vs_weak_nolib) +TEST(weak_antidep_vs_weak_nolib) { String8 a_obj; { @@ -1067,7 +1067,7 @@ T_BeginTest(weak_antidep_vs_weak_nolib) } } -T_BeginTest(weak_antidep_vs_weak_lib) +TEST(weak_antidep_vs_weak_lib) { String8 a_obj; { @@ -1114,7 +1114,7 @@ T_BeginTest(weak_antidep_vs_weak_lib) } } -T_BeginTest(weak_antidep_vs_weak_alias) +TEST(weak_antidep_vs_weak_alias) { String8 a_obj; { @@ -1161,7 +1161,7 @@ T_BeginTest(weak_antidep_vs_weak_alias) } } -T_BeginTest(weak_vs_common) +TEST(weak_vs_common) { String8 weak_obj; { @@ -1217,7 +1217,7 @@ T_BeginTest(weak_vs_common) T_Ok(bss->vsize == 2); } -T_BeginTest(abs_vs_weak) +TEST(abs_vs_weak) { U32 abs_value = 0x123; U8 text_code[] = { 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3 }; @@ -1272,7 +1272,7 @@ T_BeginTest(abs_vs_weak) T_Ok(str8_match(imm, str8_struct(&expected_imm), 0)); } -T_BeginTest(abs_vs_regular) +TEST(abs_vs_regular) { String8 shared_symbol_name = str8_lit("foo"); @@ -1322,7 +1322,7 @@ T_BeginTest(abs_vs_regular) T_Ok(g_last_exit_code != 0); } -T_BeginTest(abs_vs_common) +TEST(abs_vs_common) { String8 shared_symbol_name = str8_lit("foo"); @@ -1367,7 +1367,7 @@ T_BeginTest(abs_vs_common) } } -T_BeginTest(abs_vs_abs) +TEST(abs_vs_abs) { String8 a_obj; { @@ -1393,7 +1393,7 @@ T_BeginTest(abs_vs_abs) T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } -T_BeginTest(undef_weak_lib) +TEST(undef_weak_lib) { String8 weak; { @@ -1423,7 +1423,7 @@ T_BeginTest(undef_weak_lib) T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } -T_BeginTest(undef_weak_search_alias) +TEST(undef_weak_search_alias) { Temp scratch = scratch_begin(0,0); @@ -1477,7 +1477,7 @@ T_BeginTest(undef_weak_search_alias) T_Ok(g_last_exit_code == 0); } -T_BeginTest(weak_cycle) +TEST(weak_cycle) { String8 ab_obj_name = str8_lit("ab.obj"); { @@ -1514,7 +1514,7 @@ T_BeginTest(weak_cycle) t_invoke_linker_timeoutf(timeout, "/subsystem:console /entry:my_entry %S %S %S", entry_obj_name, ab_obj_name, ba_obj_name); } -T_BeginTest(weak_tag) +TEST(weak_tag) { U32 weak_tag_expected_value = 0x12345678; String8 weak_tag_obj_name = str8_lit("weak_tag.obj"); @@ -1559,7 +1559,7 @@ T_BeginTest(weak_tag) T_Ok(str8_match(data, str8_struct(&weak_tag_expected_value), 0)); } -T_BeginTest(undef_section) +TEST(undef_section) { String8 main_obj; { @@ -1603,7 +1603,7 @@ T_BeginTest(undef_section) } } -T_BeginTest(sect_symbol) +TEST(sect_symbol) { String8 sect_payload = str8_lit("hello, world"); String8 sect_obj_name = str8_lit("sect.obj"); @@ -1657,7 +1657,7 @@ T_BeginTest(sect_symbol) T_Ok(str8_match(payload_got, sect_payload, 0)); } -T_BeginTest(undef_reloc_section) +TEST(undef_reloc_section) { String8 main_obj; { @@ -1691,7 +1691,7 @@ T_BeginTest(undef_reloc_section) } } -T_BeginTest(find_merged_pdata) +TEST(find_merged_pdata) { U8 foobar_payload[] = { 0x40, 0x57, 0x48, 0x81, 0xEC, 0x00, 0x02, 0x00, 0x00, 0x48, 0x8B, 0x05, 0x00, 0x00, 0x00, 0x00, @@ -1744,7 +1744,7 @@ T_BeginTest(find_merged_pdata) T_Ok(dim_1u64(pe.data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS]) == 0xC); } -T_BeginTest(section_sort) +TEST(section_sort) { String8 data_obj_name = str8_lit("data.obj"); { @@ -1789,7 +1789,7 @@ T_BeginTest(section_sort) T_Ok(str8_match(data, expected_data, 0)); } -T_BeginTest(flag_conf) +TEST(flag_conf) { COFF_SectionFlags my_sect0_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute; COFF_SectionFlags my_sect1_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemWrite; @@ -1831,7 +1831,7 @@ T_BeginTest(flag_conf) T_Ok(my_sect1->flags == my_sect1_flags); } -T_BeginTest(invalid_bss) +TEST(invalid_bss) { COFF_SectionFlags bss_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead; String8 bss_obj_name = str8_lit("bss.obj"); @@ -1871,7 +1871,7 @@ T_BeginTest(invalid_bss) T_Ok(str8_match(data, bss_data, 0)); } -T_BeginTest(common_block) +TEST(common_block) { String8 a_obj_name = str8_lit("a.obj"); U8 a_data[6] = {0}; @@ -1934,7 +1934,7 @@ T_BeginTest(common_block) T_Ok(*b_addr == (pe.image_base + comm_sect->voff + 0x8)); } -T_BeginTest(base_relocs) +TEST(base_relocs) { // main.obj String8 entry_name = str8_lit("my_entry"); @@ -2004,7 +2004,7 @@ T_BeginTest(base_relocs) } } -T_BeginTest(simple_lib_test) +TEST(simple_lib_test) { String8 test_payload = str8_lit("The quick brown fox jumps over the lazy dog"); String8 test_obj = {0}; @@ -2067,7 +2067,7 @@ T_BeginTest(simple_lib_test) T_Ok(*data_addr32nb == data_sect->voff); } -T_BeginTest(import_export) +TEST(import_export) { String8 export_obj; { @@ -2288,7 +2288,7 @@ T_BeginTest(import_export) // TODO: check import table } -T_BeginTest(image_base) +TEST(image_base) { String8 obj_name = str8_lit("image_base.obj"); { @@ -2330,7 +2330,7 @@ T_BeginTest(image_base) T_Ok(str8_match(text_data, str8_array_fixed(expected_text), 0)); } -T_BeginTest(comdat_any) +TEST(comdat_any) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -2393,7 +2393,7 @@ T_BeginTest(comdat_any) } } -T_BeginTest(comdat_no_duplicates) +TEST(comdat_no_duplicates) { String8 test_obj; { @@ -2441,7 +2441,7 @@ T_BeginTest(comdat_no_duplicates) T_Ok(str8_match(data, str8_lit("a"), 0)); } -T_BeginTest(comdat_same_size) +TEST(comdat_same_size) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -2507,7 +2507,7 @@ T_BeginTest(comdat_same_size) if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } } -T_BeginTest(comdat_exact_match) +TEST(comdat_exact_match) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -2572,7 +2572,7 @@ T_BeginTest(comdat_exact_match) } } -T_BeginTest(comdat_largest) +TEST(comdat_largest) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -2650,7 +2650,7 @@ T_BeginTest(comdat_largest) } } -T_BeginTest(comdat_associative) +TEST(comdat_associative) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); @@ -2719,7 +2719,7 @@ T_BeginTest(comdat_associative) T_Ok(str8_match(bbb_data, str8_lit("bbb"), 0)); } -T_BeginTest(comdat_associative_loop) +TEST(comdat_associative_loop) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -2756,7 +2756,7 @@ T_BeginTest(comdat_associative_loop) if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_AssociativeLoop); } } -T_BeginTest(comdat_associative_non_comdat) +TEST(comdat_associative_non_comdat) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -2801,7 +2801,7 @@ T_BeginTest(comdat_associative_non_comdat) T_Ok(str8_match(b_data, str8_lit("b"), 0)); } -T_BeginTest(comdat_associative_out_of_bounds) +TEST(comdat_associative_out_of_bounds) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); @@ -2846,7 +2846,7 @@ T_BeginTest(comdat_associative_out_of_bounds) if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_IllData); } } -T_BeginTest(comdat_with_offset) +TEST(comdat_with_offset) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -2889,7 +2889,7 @@ T_BeginTest(comdat_with_offset) T_Ok(g_last_exit_code == 0); } -T_BeginTest(reloc_against_removed_comdat) +TEST(reloc_against_removed_comdat) { String8 a_obj; { @@ -2942,7 +2942,7 @@ T_BeginTest(reloc_against_removed_comdat) T_Ok(g_last_exit_code == LNK_Error_RelocationAgainstRemovedSection); } -T_BeginTest(sect_align) +TEST(sect_align) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3018,7 +3018,7 @@ T_BeginTest(sect_align) T_Ok(str8_match(a_8192, str8_lit("z"), 0)); } -T_BeginTest(alt_name) +TEST(alt_name) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3100,7 +3100,7 @@ T_BeginTest(alt_name) T_Ok(g_last_exit_code == 0); } -T_BeginTest(include) +TEST(include) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3153,7 +3153,7 @@ T_BeginTest(include) if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } } -T_BeginTest(communal_var_vs_regular) +TEST(communal_var_vs_regular) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3208,7 +3208,7 @@ T_BeginTest(communal_var_vs_regular) } } -T_BeginTest(communal_var_vs_regular_comdat) +TEST(communal_var_vs_regular_comdat) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3264,7 +3264,7 @@ T_BeginTest(communal_var_vs_regular_comdat) } } -T_BeginTest(import_kernel32) +TEST(import_kernel32) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3325,7 +3325,7 @@ T_BeginTest(import_kernel32) #endif } -T_BeginTest(delay_import) +TEST(delay_import) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3472,7 +3472,7 @@ T_BeginTest(delay_import) T_Ok(return_321->u.name.hint == 1); } -T_BeginTest(delay_import_user32) +TEST(delay_import_user32) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3511,7 +3511,7 @@ T_BeginTest(delay_import_user32) T_Ok(g_last_exit_code == 0); } -T_BeginTest(empty_section) +TEST(empty_section) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3541,7 +3541,7 @@ T_BeginTest(empty_section) T_Ok(g_last_exit_code != 0); } -T_BeginTest(removed_section) +TEST(removed_section) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3572,7 +3572,7 @@ T_BeginTest(removed_section) T_Ok(g_last_exit_code != 0); } -T_BeginTest(function_pad_min) +TEST(function_pad_min) { { COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); @@ -3609,7 +3609,7 @@ T_BeginTest(function_pad_min) T_Ok(str8_match(text_data, str8_array_fixed(expected_text), 0)); } -T_BeginTest(first_member_header) +TEST(first_member_header) { String8 obj; { @@ -3642,7 +3642,7 @@ T_BeginTest(first_member_header) T_Ok(g_last_exit_code == 0); } -T_BeginTest(second_member_header) +TEST(second_member_header) { String8 obj; { @@ -3675,7 +3675,7 @@ T_BeginTest(second_member_header) T_Ok(g_last_exit_code == 0); } -T_BeginTest(defer_impl_link_to_second_search_pass) +TEST(defer_impl_link_to_second_search_pass) { String8 imp_ref_obj; { @@ -3725,7 +3725,7 @@ T_BeginTest(defer_impl_link_to_second_search_pass) T_Ok(g_last_exit_code == 0); } -T_BeginTest(opt_ref_dangling_section) +TEST(opt_ref_dangling_section) { String8 entry_obj; { @@ -3798,7 +3798,7 @@ T_BeginTest(opt_ref_dangling_section) T_Ok(sect != 0); } -T_BeginTest(fail_if_mismatch) +TEST(fail_if_mismatch) { T_Ok(t_write_entry_obj()); @@ -3840,7 +3840,7 @@ T_BeginTest(fail_if_mismatch) else T_Ok(g_last_exit_code != 0); } -T_BeginTest(long_section_name) +TEST(long_section_name) { Arch arch = Arch_x64; @@ -3871,7 +3871,7 @@ T_BeginTest(long_section_name) T_Ok(debug_abbrev); } -T_BeginTest(debug_p_sig_mismatch) +TEST(debug_p_sig_mismatch) { String8 a_obj_name = str8_lit("a.obj"); String8 b_obj_name = str8_lit("b.obj"); @@ -4068,7 +4068,7 @@ T_BeginTest(debug_p_sig_mismatch) T_Ok(found_error); } -T_BeginTest(debug_p_and_debug_t_in_obj) +TEST(debug_p_and_debug_t_in_obj) { U32 pch_sig = 0xCAFEBABE; String8 pch_obj_name = str8_lit("pch.obj"); @@ -4179,7 +4179,7 @@ T_BeginTest(debug_p_and_debug_t_in_obj) T_Ok(found_warning); } -T_BeginTest(merge_duplicate_types) +TEST(merge_duplicate_types) { { U32 pch_sig = 0xCAFEBABE; @@ -4543,7 +4543,7 @@ T_BeginTest(merge_duplicate_types) } } -T_BeginTest(cyclic_type) +TEST(cyclic_type) { String8List *debug_t = push_array(arena, String8List, 1); str8_serial_begin(arena, debug_t); @@ -4579,7 +4579,7 @@ T_BeginTest(cyclic_type) T_Ok(is_cycle_detected); } -T_BeginTest(get_msf_stream_pages) +TEST(get_msf_stream_pages) { MSF_Context *msf = msf_alloc(MSF_DEFAULT_PAGE_SIZE, MSF_DEFAULT_FPM); @@ -4630,7 +4630,7 @@ T_BeginTest(get_msf_stream_pages) msf_release(msf); } -T_BeginTest(validate_info_stream) +TEST(validate_info_stream) { COFF_TimeStamp time_stamp = 123; U32 age = 1; @@ -4681,7 +4681,7 @@ T_BeginTest(validate_info_stream) tp_release(tp); } -T_BeginTest(patch_cv_symbol_tree) +TEST(patch_cv_symbol_tree) { String8List raw_symbols = {0}; str8_list_push(arena, &raw_symbols, cv_make_symbol(arena, CV_SymKind_OBJNAME, cv_make_obj_name(arena, str8_lit("foo.obj"), 123))); @@ -4735,7 +4735,7 @@ T_BeginTest(patch_cv_symbol_tree) } } -T_BeginTest(whole_archive) +TEST(whole_archive) { String8 a_obj; { @@ -4849,7 +4849,7 @@ t_radlink_validate_asan_out(String8 obj_name) return is_ok; } -T_BeginTest(infer_asan) +TEST(infer_asan) { char *program = "#include \n" @@ -4900,7 +4900,7 @@ T_BeginTest(infer_asan) #endif #if OS_WINDOWS -T_BeginTest(determ_test) +TEST(determ_test) { // compile the test target (torture) String8 cl_line = str8f(arena, "/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); @@ -4944,7 +4944,7 @@ T_BeginTest(determ_test) #if 0 -T_BeginTest(fold_two_funcs) +TEST(fold_two_funcs) { String8 ident_funcs_obj; { @@ -5013,7 +5013,7 @@ T_BeginTest(fold_two_funcs) } -T_BeginTest(same_but_different) +TEST(same_but_different) { String8 obj; { @@ -5114,7 +5114,7 @@ T_BeginTest(same_but_different) } -T_BeginTest(fold_diamond) +TEST(fold_diamond) { String8 a_obj; { @@ -5204,7 +5204,7 @@ T_BeginTest(fold_diamond) } -T_BeginTest(cyclic_icf) +TEST(cyclic_icf) { String8 a_obj; { @@ -5259,7 +5259,7 @@ T_BeginTest(cyclic_icf) } -T_BeginTest(fold_with_largest_align) +TEST(fold_with_largest_align) { String8 a_obj; { From 9bf0f77391bd3c3597519012a46e9d5a16e5e632 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Apr 2026 16:42:22 -0700 Subject: [PATCH 379/850] size in symbol header was incorrectly including alignment bytes --- src/linker/codeview_ext/codeview.c | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 74e7938f..a065f069 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -194,19 +194,13 @@ cv_precomp_info_from_leaf(CV_Leaf leaf) internal U64 cv_write_symbol_buf(String8Node *buf, U64 *buf_pos, CV_Symbol *symbol, U64 align) { - U64 record_size = 0; - record_size += sizeof(symbol->kind); - record_size += AlignPow2(symbol->data.size, align); - - Assert(record_size <= CV_SymSize_Max); - CV_SymSize record_size16 = (CV_SymSize)record_size; - + CV_SymbolHeader header = { .size = sizeof(CV_SymKind) + symbol->data.size, .kind = symbol->kind }; + U64 pad_size = AlignPadPow2(header.size + sizeof(CV_SymSize), align); U64 write_size = 0; - - write_size += str8_buffer_write(buf, buf_pos, str8((U8 *)&(CV_SymbolHeader){ .size = record_size16, .kind = symbol->kind }, sizeof(CV_SymbolHeader))); + write_size += str8_buffer_write(buf, buf_pos, str8_struct(&header)); write_size += str8_buffer_write(buf, buf_pos, symbol->data); - write_size += str8_buffer_write_zeroes(buf, buf_pos, AlignPadPow2(symbol->data.size, align)); - + write_size += str8_buffer_write_zeroes(buf, buf_pos, pad_size); + Assert(write_size == header.size + sizeof(CV_SymSize) + pad_size); return write_size; } @@ -248,7 +242,7 @@ cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out) symbol_out->kind = header.kind; symbol_out->data = str8(symbol_ptr + sizeof(CV_SymbolHeader), header.size - sizeof(CV_SymKind)); - U64 symbol_size = AlignPow2(sizeof(CV_SymbolHeader) + symbol_out->data.size, align); + U64 symbol_size = AlignPow2(sizeof(CV_SymSize) + header.size, align); Assert(symbol_size <= raw_data.size); return symbol_size; } @@ -1272,7 +1266,7 @@ cv_patch_symbol_tree_offsets(String8List raw_symbols, U64 base_offset, U64 align for (;;) { CV_SymbolHeader symbol_header; - if (str8_buffer_read(&buf, &buf_pos, sizeof(symbol_header), &symbol_header) != sizeof(symbol_header)) { break; } + if (str8_buffer_peek(&buf, &buf_pos, sizeof(symbol_header), &symbol_header) != sizeof(symbol_header)) { break; } if (cv_is_scope_symbol(symbol_header.kind)) { // NOTE: We don't patch 'next' offset in PROC symbols because @@ -1283,7 +1277,7 @@ cv_patch_symbol_tree_offsets(String8List raw_symbols, U64 base_offset, U64 align // patch parent symbol offset if (stack) { String8Node temp_buf = buf; - U64 temp_pos = buf_pos; + U64 temp_pos = buf_pos + sizeof(CV_SymbolHeader); str8_buffer_write_u32(&temp_buf, &temp_pos, stack->offset); } @@ -1294,7 +1288,7 @@ cv_patch_symbol_tree_offsets(String8List raw_symbols, U64 base_offset, U64 align // push frame to the stack frame->symbol_buf = buf; - frame->symbol_pos = buf_pos; + frame->symbol_pos = buf_pos + sizeof(CV_SymbolHeader); frame->offset = safe_cast_u32(symbol_offset); SLLStackPush(stack, frame); @@ -1316,10 +1310,8 @@ cv_patch_symbol_tree_offsets(String8List raw_symbols, U64 base_offset, U64 align } // advance symbol offset - symbol_offset += sizeof(CV_SymSize) + symbol_header.size; - symbol_offset = AlignPow2(symbol_offset, align); - - str8_buffer_skip(&buf, &buf_pos, symbol_header.size - sizeof(CV_SymKind)); + symbol_offset += AlignPow2(sizeof(CV_SymSize) + symbol_header.size, align); + str8_buffer_skip(&buf, &buf_pos, AlignPow2(symbol_header.size + sizeof(CV_SymSize), align)); } scratch_end(scratch); From 217b761c9b57019bbd2072d2c73cbb3400997b76 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Apr 2026 16:43:04 -0700 Subject: [PATCH 380/850] build GSI and PSI before DBI --- src/linker/pdb_ext/pdb_builder.c | 6 +++--- src/torture/torture_radlink.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 782fb53c..56cb02c5 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -3150,9 +3150,6 @@ pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTa pdb_type_server_build(tp, ipi, strtab, pdb->msf, PDB_FixedStream_Ipi); } - dbi_build(tp, pdb->dbi, pdb->msf, PDB_FixedStream_Dbi, string_ht, is_stripped); - pdb_info_build(pdb->info, pdb->msf, PDB_FixedStream_Info); - if (build_gsi) { if (dbi->globals_sn == MSF_INVALID_STREAM_NUMBER) { dbi->globals_sn = msf_stream_alloc(pdb->msf); @@ -3167,6 +3164,9 @@ pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTa gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); } + dbi_build(tp, pdb->dbi, pdb->msf, PDB_FixedStream_Dbi, string_ht, is_stripped); + pdb_info_build(pdb->info, pdb->msf, PDB_FixedStream_Info); + ProfEnd(); } diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 9ff94e09..107aeb25 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4670,9 +4670,9 @@ TEST(validate_info_stream) 0x6f, 0x00, 0x74, 0x68, 0x72, 0x65, 0x65, 0x00, 0x66, 0x6f, 0x75, 0x72, 0x00, 0x66, 0x69, 0x76, 0x65, 0x00, 0x2f, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x51, 0x33, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x51, 0x33, 0x01 }; T_Ok(str8_match(info_data, str8_array_fixed(expected_info_data), 0)); From e1ab7f4955fb2deb4189a4b1d3c97a7731a742ba Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Apr 2026 16:46:00 -0700 Subject: [PATCH 381/850] GSI parser discarded last symbol in the chain --- src/pdb/pdb_parse.c | 59 ++++++++++++-------------------------- src/radbin/radbin_main.c | 2 ++ src/raddbg/raddbg_main.c | 2 ++ src/torture/torture_main.c | 4 +-- 4 files changed, 25 insertions(+), 42 deletions(-) diff --git a/src/pdb/pdb_parse.c b/src/pdb/pdb_parse.c index 8ac51adc..e8833598 100644 --- a/src/pdb/pdb_parse.c +++ b/src/pdb/pdb_parse.c @@ -476,56 +476,35 @@ pdb_gsi_from_data(Arena *arena, String8 data) // array offsets U32 bitmask_u32_count = CeilIntegerDiv(slot_count, 32); U32 bitmask_byte_size = bitmask_u32_count*4; - U32 bitmask_off = hash_record_array_off + header->hash_record_arr_size; - U32 offsets_off = bitmask_off + bitmask_byte_size; + U32 bitmask_off = hash_record_array_off + header->hash_record_arr_size; + U32 offsets_off = bitmask_off + bitmask_byte_size; // get bitmask & packed offset arrays - U8 *bitmasks = 0; - U8 *packed_offsets = 0; + U32Array bitmask = {0}; + U32 *packed_offsets = 0; + U64 packed_offset_count = 0; if(bitmask_off + bitmask_byte_size <= data.size) { - bitmasks = (data.str + bitmask_off); - packed_offsets = (data.str + offsets_off); + bitmask = (U32Array){ .v = (U32 *)(data.str + bitmask_off), .count = bitmask_u32_count }; + packed_offsets = (U32 *)(data.str + offsets_off); + packed_offset_count = (data.size - offsets_off)/4; } - U32 packed_offset_count = (data.size - offsets_off)/4; // unpack U32 *unpacked_offsets = 0; if(packed_offsets != 0) { - unpacked_offsets = push_array(scratch.arena, U32, slot_count); + unpacked_offsets = push_array_no_zero(scratch.arena, U32, slot_count); + MemorySet(unpacked_offsets, 0xff, sizeof(unpacked_offsets[0]) * slot_count); - U32 *bitmask_ptr = (U32*)bitmasks; - U32 *bitmask_opl = bitmask_ptr + bitmask_u32_count; - U32 *src_ptr = (U32*)packed_offsets; - U32 *src_opl = src_ptr + packed_offset_count; - U32 *dst_ptr = unpacked_offsets; - U32 *dst_opl = dst_ptr + slot_count; - for(; bitmask_ptr < bitmask_opl && src_ptr < src_opl; bitmask_ptr += 1) - { - U32 bits = *bitmask_ptr; - U32 src_max = (U32)(src_opl - src_ptr); - U32 dst_max = (U32)(dst_opl - dst_ptr); - U32 k_max0 = ClampTop(32, dst_max); - U32 k_max = ClampTop(k_max0, src_max); - for(U32 k = 0; k < k_max; k += 1) - { - if((bits & 1) == 1) - { - *dst_ptr = *src_ptr; - src_ptr += 1; - } - else - { - *dst_ptr = 0xFFFFFFFF; - } - dst_ptr += 1; - bits >>= 1; - } - } - for(; dst_ptr < dst_opl; dst_ptr += 1) - { - *dst_ptr = 0xFFFFFFFF; + U32 *off_ptr = (U32 *)packed_offsets; + U32 *off_opl = off_ptr + packed_offset_count; + for (U64 slot_idx = 0; ; slot_idx += 1) { + slot_idx = bit_array_scan_left_to_right32(bitmask, slot_idx, slot_count, 1); + if (slot_idx >= slot_count) { break; } + if (off_ptr >= off_opl) { Assert(0 && "corrupted GSI"); break; } + unpacked_offsets[slot_idx] = *off_ptr; + off_ptr += 1; } } @@ -613,7 +592,7 @@ pdb_gsi_symbol_from_string(PDB_GsiParsed *gsi, String8 symbol_data, String8 stri sym_opl = symbol_data.str + opl_off; } - Rng1U64 raw_symbol_range = rng_1u64(off + sizeof(*sym_header), off + (sym_header->size - sizeof(sym_header->kind))); + Rng1U64 raw_symbol_range = rng_1u64(off + sizeof(*sym_header), opl_off); String8 raw_symbol = str8_substr(symbol_data, raw_symbol_range); String8 sym_name = cv_name_from_symbol(sym_header->kind, raw_symbol); diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 8a2e3a3c..b87e6502 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -15,6 +15,7 @@ #include "x64/x64.h" #include "linker/hash_table.h" #include "linker/lf_hash_table.h" +#include "linker/base_ext/base_bit_array.h" #include "os/os_inc.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" @@ -43,6 +44,7 @@ #include "x64/x64.c" #include "linker/hash_table.c" #include "linker/lf_hash_table.c" +#include "linker/base_ext/base_bit_array.c" #include "os/os_inc.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 28e3bb92..5e2daede 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -249,6 +249,7 @@ #include "x64/x64.h" #include "linker/hash_table.h" #include "linker/lf_hash_table.h" +#include "linker/base_ext/base_bit_array.h" #include "os/os_inc.h" #include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" @@ -303,6 +304,7 @@ #include "x64/x64.c" #include "linker/hash_table.c" #include "linker/lf_hash_table.c" +#include "linker/base_ext/base_bit_array.c" #include "os/os_inc.c" #include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 51e63860..7571fa37 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -24,6 +24,7 @@ #include "x64/x64.h" #include "linker/hash_table.h" #include "linker/lf_hash_table.h" +#include "linker/base_ext/base_bit_array.h" #include "os/os_inc.h" #include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" @@ -80,7 +81,6 @@ #include "linker/base_ext/base_core.h" #include "linker/base_ext/base_arena.h" #include "linker/base_ext/base_arrays.h" -#include "linker/base_ext/base_bit_array.h" #include "linker/thread_pool/thread_pool.h" #include "linker/codeview_ext/codeview.h" #include "linker/pdb_ext/msf_builder.h" @@ -97,6 +97,7 @@ #include "x64/x64.c" #include "linker/hash_table.c" #include "linker/lf_hash_table.c" +#include "linker/base_ext/base_bit_array.c" #include "os/os_inc.c" #include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" @@ -151,7 +152,6 @@ #include "linker/base_ext/base_core.c" #include "linker/base_ext/base_arena.c" #include "linker/base_ext/base_arrays.c" -#include "linker/base_ext/base_bit_array.c" #include "linker/base_ext/base_crc32.c" #include "linker/thread_pool/thread_pool.c" #include "linker/codeview_ext/codeview.c" From 270d73220f2316fb406114184b103851843f5042 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Apr 2026 16:46:45 -0700 Subject: [PATCH 382/850] test GSI --- src/linker/codeview_ext/codeview.c | 37 +++++++++++++++++ src/linker/codeview_ext/codeview.h | 17 ++++---- src/torture/torture_radlink.c | 64 +++++++++++++++++++++++++----- 3 files changed, 100 insertions(+), 18 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index a065f069..198d6675 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -397,6 +397,43 @@ cv_make_end(Arena *arena) return str8_zero(); } +internal String8 +cv_make_data32(Arena *arena, CV_SymData32 data, String8 name) +{ + U64 buf_size = sizeof(data) + name.size + 1; + U8 *buf = push_array(arena, U8, buf_size); + CV_SymData32 *data_dst = (CV_SymData32 *)buf; + MemoryCopy(data_dst, &data, sizeof(data)); + MemoryCopy(data_dst + 1, name.str, name.size); + buf[sizeof(data) + name.size] = 0; + return str8(buf, buf_size); +} + +internal String8 +cv_make_const(Arena *arena, CV_SymConstant v, U16 value, String8 name) +{ + U64 buf_size = sizeof(v) + sizeof(value) + name.size + 1; + U8 *buf = push_array(arena, U8, buf_size); + CV_SymConstant *data_dst = (CV_SymConstant *)buf; + MemoryCopy(buf, &v, sizeof(v)); + MemoryCopy(buf + sizeof(v), &value, sizeof(value)); + MemoryCopy(buf + sizeof(v) + sizeof(value), name.str, name.size); + buf[sizeof(v) + sizeof(value) + name.size] = 0; + return str8(buf, buf_size); +} + +internal String8 +cv_make_udt(Arena *arena, CV_SymUDT v, String8 name) +{ + U64 buf_size = sizeof(v) + name.size + 1; + U8 *buf = push_array(arena, U8, buf_size); + CV_SymUDT *data_dst = (CV_SymUDT *)buf; + MemoryCopy(data_dst, &v, sizeof(v)); + MemoryCopy(data_dst + 1, name.str, name.size); + buf[sizeof(v) + name.size] = 0; + return str8(buf, buf_size); +} + internal String8 cv_make_inline_site(Arena *arena, CV_SymInlineSite inline_site, String8 annots) { diff --git a/src/linker/codeview_ext/codeview.h b/src/linker/codeview_ext/codeview.h index 6c0219c6..985f2dce 100644 --- a/src/linker/codeview_ext/codeview.h +++ b/src/linker/codeview_ext/codeview.h @@ -353,13 +353,16 @@ internal CV_Symbol cv_symbol_from_ptr(U8 *ptr); internal String8 cv_raw_from_symbol(void *ptr); internal B32 cv_symbol_match(CV_Symbol a, CV_Symbol b); -internal String8 cv_make_symbol(Arena *arena, CV_SymKind kind, String8 data); -internal String8 cv_make_obj_name(Arena *arena, String8 obj_path, U32 sig); -internal String8 cv_make_comp3(Arena *arena, CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe, U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe, String8 version_string); -internal String8 cv_make_envblock(Arena *arena, String8List string_list); -internal String8 cv_make_end(Arena *arena); -internal CV_Symbol cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local); -internal CV_Symbol cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name); +internal String8 cv_make_symbol(Arena *arena, CV_SymKind kind, String8 data); +internal String8 cv_make_obj_name(Arena *arena, String8 obj_path, U32 sig); +internal String8 cv_make_comp3(Arena *arena, CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe, U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe, String8 version_string); +internal String8 cv_make_envblock(Arena *arena, String8List string_list); +internal String8 cv_make_end(Arena *arena); +internal String8 cv_make_data32(Arena *arena, CV_SymData32 data, String8 name); +internal String8 cv_make_const(Arena *arena, CV_SymConstant v, U16 value, String8 name); +internal String8 cv_make_udt(Arena *arena, CV_SymUDT v, String8 name); +internal CV_Symbol cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local); +internal CV_Symbol cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name); internal U64 cv_read_symbol(String8 raw_data, U64 off, U64 align, CV_Symbol *symbol_out); internal CV_Symbol cv_symbol_from_string(String8 raw_data); diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 107aeb25..55ad47be 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4630,6 +4630,25 @@ TEST(get_msf_stream_pages) msf_release(msf); } +internal String8 +data_from_pdb(Arena *arena, PDB_Context *pdb) +{ + TP_Context *tp = tp_alloc(arena, 1, 1, str8_lit("foo")); + TP_Arena *tp_arena = tp_arena_alloc(tp); + pdb_build(tp, tp_arena, pdb, (CV_StringHashTable){0}, 1, 0); + + AssertAlways(msf_build(pdb->msf) == MSF_Error_OK); + String8List raw_msf_list = msf_get_page_data_nodes(arena, pdb->msf); + AssertAlways(t_write_file_list(str8_lit("test.pdb"), raw_msf_list)); + + String8 data = str8_list_join(arena, &raw_msf_list, 0); + + tp_arena_release(&tp_arena); + tp_release(tp); + + return data; +} + TEST(validate_info_stream) { COFF_TimeStamp time_stamp = 123; @@ -4644,16 +4663,8 @@ TEST(validate_info_stream) stream_numbers[i] = pdb_push_named_stream(&pdb->info->named_stream_ht, pdb->msf, str8_cstring(stream_names[i])); T_Ok(stream_numbers[i] != MSF_INVALID_STREAM_NUMBER); } - - TP_Context *tp = tp_alloc(arena, 1, 1, str8_lit("foo")); - TP_Arena *tp_arena = tp_arena_alloc(tp); - pdb_build(tp, tp_arena, pdb, (CV_StringHashTable){0}, 1, 0); - - T_Ok(msf_build(pdb->msf) == MSF_Error_OK); - String8List raw_msf_list = msf_get_page_data_nodes(arena, pdb->msf); - T_Ok(t_write_file_list(str8_lit("test.pdb"), raw_msf_list)); - String8 raw_msf = t_read_file(arena, str8_lit("test.pdb")); + String8 raw_msf = data_from_pdb(arena, pdb); MSF_Parsed *msf_parsed = msf_parsed_from_data(arena, raw_msf); String8 info_data = msf_data_from_stream(msf_parsed, PDB_FixedStream_Info); @@ -4677,8 +4688,39 @@ TEST(validate_info_stream) T_Ok(str8_match(info_data, str8_array_fixed(expected_info_data), 0)); pdb_release(pdb); - tp_arena_release(&tp_arena); - tp_release(tp); +} + +TEST(validate_gsi) +{ + PDB_Context *pdb = pdb_alloc(MSF_DEFAULT_PAGE_SIZE, COFF_MachineType_X64, 123, 1, (Guid){ .data1 = max_U32, .data2 = max_U16 - 1, .data3 = max_U16 - 2, .data4 = { 1, 2, 3, 4, 5, 6, 7, 8 } }); + CV_Symbol symbols[] = { + cv_symbol_from_ptr(cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32){ .itype = 0x41bd, .off = 0x25440, .sec = 2 }, str8_lit("__newclmap"))).str), + cv_symbol_from_ptr(cv_make_symbol(arena, CV_SymKind_CONSTANT, cv_make_const(arena, (CV_SymConstant){ .itype = 0x2348 }, 263, str8_lit("CV_SymKind_BLOCK16"))).str), + cv_symbol_from_ptr(cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32){ .itype = 0, .off = 123, .sec = 1 }, str8_lit("coffeebabe"))).str), + cv_symbol_from_ptr(cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32){ .itype = 0, .off = 123, .sec = 1 }, str8_lit("deadbeef"))).str), + }; + for EachElement(i, symbols) { gsi_push(pdb->gsi, &symbols[i]); } + + String8 raw_pdb = data_from_pdb(arena, pdb); + MSF_Parsed *msf = msf_parsed_from_data(arena, raw_pdb); + String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); + PDB_DbiParsed *dbi = pdb_dbi_from_data(arena, dbi_data); + String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn); + PDB_GsiParsed *gsi = pdb_gsi_from_data(arena, gsi_data); + String8 symbol_data = msf_data_from_stream(msf, dbi->sym_sn); + + for EachElement(i, symbols) { + String8 string = cv_name_from_symbol(symbols[i].kind, symbols[i].data); + U64 symbol_off = pdb_gsi_symbol_from_string(gsi, symbol_data, string); + T_Ok(symbol_off < symbol_data.size); + + CV_Symbol test_symbol = {0}; + U64 test_symbol_size = cv_read_symbol(str8_skip(symbol_data, symbol_off), 0, 1, &test_symbol); + T_Ok(test_symbol_size > 0); + T_Ok(cv_symbol_match(test_symbol, symbols[i])); + } + + pdb_release(pdb); } TEST(patch_cv_symbol_tree) From eff693244b34eb77cdf325097e5850b1e91599cc Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 11 Mar 2026 12:04:29 -0700 Subject: [PATCH 383/850] sketch out first part of new unified symbol table baking pass, sketch out new simplified sections --- src/lib_rdi/rdi.c | 15 +- src/lib_rdi/rdi.h | 120 +++++++++----- src/lib_rdi_make/rdi_make.h | 4 +- src/rdi/rdi.mdesk | 120 ++++++++++---- src/rdi_from_dwarf/rdi_from_dwarf.c | 238 ++++++++++++++-------------- src/rdi_from_pdb/rdi_from_pdb.c | 22 +-- src/rdi_make/rdi_make_local.c | 78 ++++++++- 7 files changed, 385 insertions(+), 212 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 8ae9131e..5a777206 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -10,7 +10,7 @@ #ifndef RDI_C #define RDI_C -RDI_U16 rdi_section_element_size_table[53] = +RDI_U16 rdi_section_element_size_table[58] = { sizeof(RDI_U8), sizeof(RDI_TopLevelInfo), @@ -36,20 +36,25 @@ sizeof(RDI_UDT), sizeof(RDI_Member), sizeof(RDI_EnumMember), sizeof(RDI_GlobalVariable), -sizeof(RDI_VMapEntry), sizeof(RDI_ThreadVariable), sizeof(RDI_Constant), sizeof(RDI_Procedure), +sizeof(RDI_Local), +sizeof(RDI_VMapEntry), sizeof(RDI_Scope), sizeof(RDI_U64), sizeof(RDI_VMapEntry), sizeof(RDI_InlineSite), -sizeof(RDI_Local), sizeof(RDI_LocationBlock), sizeof(RDI_U8), +sizeof(RDI_Symbol), +sizeof(RDI_Symbol), +sizeof(RDI_Symbol), +sizeof(RDI_Symbol), +sizeof(RDI_Symbol), sizeof(RDI_U8), -sizeof(RDI_LocationRegPlusU16), -sizeof(RDI_LocationReg), +sizeof(RDI_RegAndOffsetU16), +sizeof(RDI_RegCode), sizeof(RDI_U64), sizeof(RDI_U32), sizeof(RDI_U64), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 91d02591..eeab41d9 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -99,35 +99,40 @@ RDI_SectionKind_UDTs = 0x0014, RDI_SectionKind_Members = 0x0015, RDI_SectionKind_EnumMembers = 0x0016, RDI_SectionKind_GlobalVariables = 0x0017, -RDI_SectionKind_GlobalVMap = 0x0018, -RDI_SectionKind_ThreadVariables = 0x0019, -RDI_SectionKind_Constants = 0x001A, -RDI_SectionKind_Procedures = 0x001B, -RDI_SectionKind_Scopes = 0x001C, -RDI_SectionKind_ScopeVOffData = 0x001D, -RDI_SectionKind_ScopeVMap = 0x001E, -RDI_SectionKind_InlineSites = 0x001F, -RDI_SectionKind_Locals = 0x0020, +RDI_SectionKind_ThreadVariables = 0x0018, +RDI_SectionKind_Constants = 0x0019, +RDI_SectionKind_Procedures = 0x001A, +RDI_SectionKind_Locals = 0x001B, +RDI_SectionKind_GlobalVMap = 0x001C, +RDI_SectionKind_Scopes = 0x001D, +RDI_SectionKind_ScopeVOffData = 0x001E, +RDI_SectionKind_ScopeVMap = 0x001F, +RDI_SectionKind_InlineSites = 0x0020, RDI_SectionKind_LocationBlocks = 0x0021, RDI_SectionKind_LocationData = 0x0022, -RDI_SectionKind_LocationsBytecodeData = 0x0023, -RDI_SectionKind_LocationsRegPlusU16 = 0x0024, -RDI_SectionKind_LocationsReg = 0x0025, -RDI_SectionKind_LocationsModuleOff = 0x0026, -RDI_SectionKind_LocationsTLSOff = 0x0027, -RDI_SectionKind_LocationsConstantDataOff = 0x0028, -RDI_SectionKind_LocationsSet = 0x0029, -RDI_SectionKind_LocationsSetElements = 0x002A, -RDI_SectionKind_ConstantValueData = 0x002B, -RDI_SectionKind_ConstantValueTable = 0x002C, -RDI_SectionKind_MD5Checksums = 0x002D, -RDI_SectionKind_SHA1Checksums = 0x002E, -RDI_SectionKind_SHA256Checksums = 0x002F, -RDI_SectionKind_Timestamps = 0x0030, -RDI_SectionKind_NameMaps = 0x0031, -RDI_SectionKind_NameMapBuckets = 0x0032, -RDI_SectionKind_NameMapNodes = 0x0033, -RDI_SectionKind_COUNT = 0x0034, +RDI_SectionKind_GlobalVariableSymbols = 0x0023, +RDI_SectionKind_ThreadVariableSymbols = 0x0024, +RDI_SectionKind_ConstantSymbols = 0x0025, +RDI_SectionKind_ProcedureSymbols = 0x0026, +RDI_SectionKind_LocalSymbols = 0x0027, +RDI_SectionKind_LocationsBytecodeData = 0x0028, +RDI_SectionKind_LocationsRegPlusU16 = 0x0029, +RDI_SectionKind_LocationsReg = 0x002A, +RDI_SectionKind_LocationsModuleOff = 0x002B, +RDI_SectionKind_LocationsTLSOff = 0x002C, +RDI_SectionKind_LocationsConstantDataOff = 0x002D, +RDI_SectionKind_LocationsSet = 0x002E, +RDI_SectionKind_LocationsSetElements = 0x002F, +RDI_SectionKind_ConstantValueData = 0x0030, +RDI_SectionKind_ConstantValueTable = 0x0031, +RDI_SectionKind_MD5Checksums = 0x0032, +RDI_SectionKind_SHA1Checksums = 0x0033, +RDI_SectionKind_SHA256Checksums = 0x0034, +RDI_SectionKind_Timestamps = 0x0035, +RDI_SectionKind_NameMaps = 0x0036, +RDI_SectionKind_NameMapBuckets = 0x0037, +RDI_SectionKind_NameMapNodes = 0x0038, +RDI_SectionKind_COUNT = 0x0039, } RDI_SectionKindEnum; typedef RDI_U32 RDI_SectionEncoding; @@ -564,20 +569,25 @@ X(UDTs, udts, RDI_UDT)\ X(Members, members, RDI_Member)\ X(EnumMembers, enum_members, RDI_EnumMember)\ X(GlobalVariables, global_variables, RDI_GlobalVariable)\ -X(GlobalVMap, global_vmap, RDI_VMapEntry)\ X(ThreadVariables, thread_variables, RDI_ThreadVariable)\ X(Constants, constants, RDI_Constant)\ X(Procedures, procedures, RDI_Procedure)\ +X(Locals, locals, RDI_Local)\ +X(GlobalVMap, global_vmap, RDI_VMapEntry)\ X(Scopes, scopes, RDI_Scope)\ X(ScopeVOffData, scope_voff_data, RDI_U64)\ X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ X(InlineSites, inline_sites, RDI_InlineSite)\ -X(Locals, locals, RDI_Local)\ X(LocationBlocks, location_blocks, RDI_LocationBlock)\ X(LocationData, location_data, RDI_U8)\ +X(GlobalVariableSymbols, global_variable_symbols, RDI_Symbol)\ +X(ThreadVariableSymbols, thread_variable_symbols, RDI_Symbol)\ +X(ConstantSymbols, constant_symbols, RDI_Symbol)\ +X(ProcedureSymbols, procedure_symbols, RDI_Symbol)\ +X(LocalSymbols, local_symbols, RDI_Symbol)\ X(LocationsBytecodeData, locations_bytecode_data, RDI_U8)\ -X(LocationsRegPlusU16, locations_reg_plus_u16, RDI_LocationRegPlusU16)\ -X(LocationsReg, locations_reg, RDI_LocationReg)\ +X(LocationsRegPlusU16, locations_reg_plus_u16, RDI_RegAndOffsetU16)\ +X(LocationsReg, locations_reg, RDI_RegCode)\ X(LocationsModuleOff, locations_module_off, RDI_U64)\ X(LocationsTLSOff, locations_tls_off, RDI_U32)\ X(LocationsConstantDataOff, locations_constant_data_off, RDI_U64)\ @@ -1006,13 +1016,21 @@ X(RDI_U16, offset)\ X(RDI_LocationKind, kind)\ X(RDI_RegCode, reg_code)\ +#define RDI_RegAndOffsetU16_XList \ +X(RDI_RegCode, reg_code)\ +X(RDI_U16, offset)\ + #define RDI_LocationSet_XList \ X(RDI_U32, set_element_idx_first)\ X(RDI_U32, set_element_idx_opl)\ #define RDI_LocationSetElement_XList \ X(RDI_LocationKind, kind)\ +X(RDI_U8, reserved_0)\ +X(RDI_U16, reserved_1)\ X(RDI_U32, idx)\ +X(RDI_U32, scope_off_first)\ +X(RDI_U32, scope_off_opl)\ #define RDI_EvalOp_XList \ X(Stop)\ @@ -1134,12 +1152,17 @@ typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_Global typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; typedef struct RDI_U32_Constants { RDI_U32 v; } RDI_U32_Constants; typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; +typedef struct RDI_U32_Locals { RDI_U32 v; } RDI_U32_Locals; typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; -typedef struct RDI_U32_Locals { RDI_U32 v; } RDI_U32_Locals; typedef struct RDI_U32_LocationBlocks { RDI_U32 v; } RDI_U32_LocationBlocks; typedef struct RDI_U32_LocationData { RDI_U32 v; } RDI_U32_LocationData; +typedef struct RDI_U32_GlobalVariableSymbols { RDI_U32 v; } RDI_U32_GlobalVariableSymbols; +typedef struct RDI_U32_ThreadVariableSymbols { RDI_U32 v; } RDI_U32_ThreadVariableSymbols; +typedef struct RDI_U32_ConstantSymbols { RDI_U32 v; } RDI_U32_ConstantSymbols; +typedef struct RDI_U32_ProcedureSymbols { RDI_U32 v; } RDI_U32_ProcedureSymbols; +typedef struct RDI_U32_LocalSymbols { RDI_U32 v; } RDI_U32_LocalSymbols; typedef struct RDI_U32_LocationsBytecodeData { RDI_U32 v; } RDI_U32_LocationsBytecodeData; typedef struct RDI_U32_LocationsRegPlusU16 { RDI_U32 v; } RDI_U32_LocationsRegPlusU16; typedef struct RDI_U32_LocationsReg { RDI_U32 v; } RDI_U32_LocationsReg; @@ -1183,12 +1206,17 @@ typedef RDI_U32_Table RDI_U32_GlobalVariables; typedef RDI_U32_Table RDI_U32_ThreadVariables; typedef RDI_U32_Table RDI_U32_Constants; typedef RDI_U32_Table RDI_U32_Procedures; +typedef RDI_U32_Table RDI_U32_Locals; typedef RDI_U32_Table RDI_U32_Scopes; typedef RDI_U32_Table RDI_U32_ScopeVOffData; typedef RDI_U32_Table RDI_U32_InlineSites; -typedef RDI_U32_Table RDI_U32_Locals; typedef RDI_U32_Table RDI_U32_LocationBlocks; typedef RDI_U32_Table RDI_U32_LocationData; +typedef RDI_U32_Table RDI_U32_GlobalVariableSymbols; +typedef RDI_U32_Table RDI_U32_ThreadVariableSymbols; +typedef RDI_U32_Table RDI_U32_ConstantSymbols; +typedef RDI_U32_Table RDI_U32_ProcedureSymbols; +typedef RDI_U32_Table RDI_U32_LocalSymbols; typedef RDI_U32_Table RDI_U32_LocationsBytecodeData; typedef RDI_U32_Table RDI_U32_LocationsRegPlusU16; typedef RDI_U32_Table RDI_U32_LocationsReg; @@ -1538,6 +1566,13 @@ RDI_LocationKind kind; RDI_RegCode reg_code; }; +typedef struct RDI_RegAndOffsetU16 RDI_RegAndOffsetU16; +struct RDI_RegAndOffsetU16 +{ +RDI_RegCode reg_code; +RDI_U16 offset; +}; + typedef struct RDI_LocationSet RDI_LocationSet; struct RDI_LocationSet { @@ -1549,7 +1584,11 @@ typedef struct RDI_LocationSetElement RDI_LocationSetElement; struct RDI_LocationSetElement { RDI_LocationKind kind; +RDI_U8 reserved_0; +RDI_U16 reserved_1; RDI_U32 idx; +RDI_U32 scope_off_first; +RDI_U32 scope_off_opl; }; typedef struct RDI_NameMap RDI_NameMap; @@ -1599,20 +1638,25 @@ typedef RDI_UDT RDI_SectionElementType_UDTs; typedef RDI_Member RDI_SectionElementType_Members; typedef RDI_EnumMember RDI_SectionElementType_EnumMembers; typedef RDI_GlobalVariable RDI_SectionElementType_GlobalVariables; -typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; typedef RDI_ThreadVariable RDI_SectionElementType_ThreadVariables; typedef RDI_Constant RDI_SectionElementType_Constants; typedef RDI_Procedure RDI_SectionElementType_Procedures; +typedef RDI_Local RDI_SectionElementType_Locals; +typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; typedef RDI_Scope RDI_SectionElementType_Scopes; typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; typedef RDI_InlineSite RDI_SectionElementType_InlineSites; -typedef RDI_Local RDI_SectionElementType_Locals; typedef RDI_LocationBlock RDI_SectionElementType_LocationBlocks; typedef RDI_U8 RDI_SectionElementType_LocationData; +typedef RDI_Symbol RDI_SectionElementType_GlobalVariableSymbols; +typedef RDI_Symbol RDI_SectionElementType_ThreadVariableSymbols; +typedef RDI_Symbol RDI_SectionElementType_ConstantSymbols; +typedef RDI_Symbol RDI_SectionElementType_ProcedureSymbols; +typedef RDI_Symbol RDI_SectionElementType_LocalSymbols; typedef RDI_U8 RDI_SectionElementType_LocationsBytecodeData; -typedef RDI_LocationRegPlusU16 RDI_SectionElementType_LocationsRegPlusU16; -typedef RDI_LocationReg RDI_SectionElementType_LocationsReg; +typedef RDI_RegAndOffsetU16 RDI_SectionElementType_LocationsRegPlusU16; +typedef RDI_RegCode RDI_SectionElementType_LocationsReg; typedef RDI_U64 RDI_SectionElementType_LocationsModuleOff; typedef RDI_U32 RDI_SectionElementType_LocationsTLSOff; typedef RDI_U64 RDI_SectionElementType_LocationsConstantDataOff; @@ -1636,7 +1680,7 @@ RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_Eva RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); -extern RDI_U16 rdi_section_element_size_table[53]; +extern RDI_U16 rdi_section_element_size_table[58]; extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; #endif // RDI_H diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 6329e602..acd9f510 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -737,9 +737,9 @@ struct RDIM_TypeNode typedef struct RDIM_TypeList RDIM_TypeList; struct RDIM_TypeList { - U64 count; RDIM_TypeNode *first; RDIM_TypeNode *last; + U64 count; }; typedef struct RDIM_TypeChunkNode RDIM_TypeChunkNode; @@ -919,7 +919,7 @@ struct RDIM_Symbol RDIM_String8 link_name; RDIM_Type *type; RDI_U64 offset; - RDIM_Symbol *container_symbol; + struct RDIM_Scope *container_scope; RDIM_Type *container_type; struct RDIM_Scope *root_scope; RDIM_LocationCaseList location_cases; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index ac9e0fce..d6921efe 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -136,62 +136,99 @@ RDI_HeaderMemberTable: RDI_SectionTable: { {NULL null RDI_U8 0x0000 - ""} + + //- rjf: top-level-info {TopLevelInfo top_level_info RDI_TopLevelInfo 0x0001 - ""} + + //- rjf: strings {StringData string_data RDI_U8 0x0002 - ""} {StringTable string_table RDI_U32 0x0003 U32 ""} + + //- rjf: index runs {IndexRuns index_runs RDI_U32 0x0004 U32 ""} + + //- rjf: binary sections {BinarySections binary_sections RDI_BinarySection 0x0005 U32 ""} + + //- rjf: filesystem / source files {FilePathNodes file_path_nodes RDI_FilePathNode 0x0006 U32 ""} {SourceFiles source_files RDI_SourceFile 0x0007 U32 ""} + + //- rjf: voff -> line info {LineTables line_tables RDI_LineTable 0x0008 U32 ""} {LineInfoVOffs line_info_voffs RDI_U64 0x0009 U32 ""} {LineInfoLines line_info_lines RDI_Line 0x000A U32 ""} {LineInfoColumns line_info_columns RDI_Column 0x000B U32 ""} + + //- rjf: line -> voff info {SourceLineMaps source_line_maps RDI_SourceLineMap 0x000C U32 ""} {SourceLineMapNumbers source_line_map_numbers RDI_U32 0x000D U32 ""} {SourceLineMapRanges source_line_map_ranges RDI_U32 0x000E U32 ""} {SourceLineMapVOffs source_line_map_voffs RDI_U64 0x000F U32 ""} + + //- rjf: units {Units units RDI_Unit 0x0010 U32 ""} {UnitVMap unit_vmap RDI_VMapEntry 0x0011 - ""} + + //- rjf: namespaces {Namespaces namespaces RDI_Namespace 0x0012 U32 ""} + + //- rjf: type info {TypeNodes type_nodes RDI_TypeNode 0x0013 U32 ""} {UDTs udts RDI_UDT 0x0014 U32 ""} {Members members RDI_Member 0x0015 U32 ""} {EnumMembers enum_members RDI_EnumMember 0x0016 U32 ""} + + //- TODO(rjf): vvv old story for symbols {GlobalVariables global_variables RDI_GlobalVariable 0x0017 U32 ""} - {GlobalVMap global_vmap RDI_VMapEntry 0x0018 - ""} - {ThreadVariables thread_variables RDI_ThreadVariable 0x0019 U32 ""} - {Constants constants RDI_Constant 0x001A U32 ""} - {Procedures procedures RDI_Procedure 0x001B U32 ""} - {Scopes scopes RDI_Scope 0x001C U32 ""} - {ScopeVOffData scope_voff_data RDI_U64 0x001D U32 ""} - {ScopeVMap scope_vmap RDI_VMapEntry 0x001E - ""} - {InlineSites inline_sites RDI_InlineSite 0x001F U32 ""} - {Locals locals RDI_Local 0x0020 U32 ""} + {ThreadVariables thread_variables RDI_ThreadVariable 0x0018 U32 ""} + {Constants constants RDI_Constant 0x0019 U32 ""} + {Procedures procedures RDI_Procedure 0x001A U32 ""} + {Locals locals RDI_Local 0x001B U32 ""} + {GlobalVMap global_vmap RDI_VMapEntry 0x001C - ""} + + //- rjf: scope info + {Scopes scopes RDI_Scope 0x001D U32 ""} + {ScopeVOffData scope_voff_data RDI_U64 0x001E U32 ""} + {ScopeVMap scope_vmap RDI_VMapEntry 0x001F - ""} + {InlineSites inline_sites RDI_InlineSite 0x0020 U32 ""} + + //- TODO(rjf): vvv old story for locations {LocationBlocks location_blocks RDI_LocationBlock 0x0021 U32 ""} {LocationData location_data RDI_U8 0x0022 U32 ""} - //- NOTE(rjf): vvv new story for locations - {LocationsBytecodeData locations_bytecode_data RDI_U8 0x0023 U32 ""} - {LocationsRegPlusU16 locations_reg_plus_u16 RDI_LocationRegPlusU16 0x0024 U32 ""} - {LocationsReg locations_reg RDI_LocationReg 0x0025 U32 ""} - {LocationsModuleOff locations_module_off RDI_U64 0x0026 U32 ""} - {LocationsTLSOff locations_tls_off RDI_U32 0x0027 U32 ""} - {LocationsConstantDataOff locations_constant_data_off RDI_U64 0x0028 U32 ""} - {LocationsSet locations_set RDI_LocationSet 0x0029 U32 ""} - {LocationsSetElements locations_set_elements RDI_LocationSetElement 0x002A U32 ""} - //- NOTE(rjf): ^^^ + //- NOTE(rjf): vvv new story for symbols + {GlobalVariableSymbols global_variable_symbols RDI_Symbol 0x0023 U32 ""} + {ThreadVariableSymbols thread_variable_symbols RDI_Symbol 0x0024 U32 ""} + {ConstantSymbols constant_symbols RDI_Symbol 0x0025 U32 ""} + {ProcedureSymbols procedure_symbols RDI_Symbol 0x0026 U32 ""} + {LocalSymbols local_symbols RDI_Symbol 0x0027 U32 ""} - {ConstantValueData constant_value_data RDI_U8 0x002B U32 ""} - {ConstantValueTable constant_value_table RDI_U32 0x002C U32 ""} - {MD5Checksums md5_checksums RDI_MD5 0x002D U32 ""} - {SHA1Checksums sha1_checksums RDI_SHA1 0x002E U32 ""} - {SHA256Checksums sha256_checksums RDI_SHA256 0x002F U32 ""} - {Timestamps timestamps RDI_U64 0x0030 U32 ""} - {NameMaps name_maps RDI_NameMap 0x0031 U32 ""} - {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x0032 U32 ""} - {NameMapNodes name_map_nodes RDI_NameMapNode 0x0033 U32 ""} - {COUNT count RDI_U8 0x0034 - ""} + //- NOTE(rjf): vvv new story for locations + {LocationsBytecodeData locations_bytecode_data RDI_U8 0x0028 U32 ""} + {LocationsRegPlusU16 locations_reg_plus_u16 RDI_RegAndOffsetU16 0x0029 U32 ""} + {LocationsReg locations_reg RDI_RegCode 0x002A U32 ""} + {LocationsModuleOff locations_module_off RDI_U64 0x002B U32 ""} + {LocationsTLSOff locations_tls_off RDI_U32 0x002C U32 ""} + {LocationsConstantDataOff locations_constant_data_off RDI_U64 0x002D U32 ""} + {LocationsSet locations_set RDI_LocationSet 0x002E U32 ""} + {LocationsSetElements locations_set_elements RDI_LocationSetElement 0x002F U32 ""} + + //- TODO(rjf): vvv old story for locations (constants) + {ConstantValueData constant_value_data RDI_U8 0x0030 U32 ""} + {ConstantValueTable constant_value_table RDI_U32 0x0031 U32 ""} + + //- rjf: checksums / timestamps + {MD5Checksums md5_checksums RDI_MD5 0x0032 U32 ""} + {SHA1Checksums sha1_checksums RDI_SHA1 0x0033 U32 ""} + {SHA256Checksums sha256_checksums RDI_SHA256 0x0034 U32 ""} + {Timestamps timestamps RDI_U64 0x0035 U32 ""} + + //- rjf: name maps + {NameMaps name_maps RDI_NameMap 0x0036 U32 ""} + {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x0037 U32 ""} + {NameMapNodes name_map_nodes RDI_NameMapNode 0x0038 U32 ""} + {COUNT count RDI_U8 0x0039 - ""} } @table(name value) @@ -1137,6 +1174,13 @@ RDI_LocationRegMemberTable: {reg_code RDI_RegCode } } +@table(name type desc) +RDI_RegAndOffsetU16MemberTable: +{ + {reg_code RDI_RegCode } + {offset RDI_U16 } +} + @table(name type desc) RDI_LocationSetMemberTable: { @@ -1147,8 +1191,12 @@ RDI_LocationSetMemberTable: @table(name type desc) RDI_LocationSetElementMemberTable: { - {kind RDI_LocationKind ""} - {idx RDI_U32 ""} + {kind RDI_LocationKind ""} + {reserved_0 RDI_U8 ""} + {reserved_1 RDI_U16 ""} + {idx RDI_U32 ""} + {scope_off_first RDI_U32 ""} + {scope_off_opl RDI_U32 ""} } //- rjf: enums @@ -1260,6 +1308,11 @@ RDI_LocationSetElementMemberTable: @expand(RDI_LocationRegMemberTable a) `$(a.type), $(a.name)` } +@xlist RDI_RegAndOffsetU16_XList: +{ + @expand(RDI_RegAndOffsetU16MemberTable a) `$(a.type), $(a.name)` +} + @xlist RDI_LocationSet_XList: { @expand(RDI_LocationSetMemberTable a) `$(a.type), $(a.name)` @@ -1337,6 +1390,11 @@ RDI_LocationSetElementMemberTable: @expand(RDI_LocationRegMemberTable a) `$(a.type) $(a.name)` } +@struct RDI_RegAndOffsetU16: +{ + @expand(RDI_RegAndOffsetU16MemberTable a) `$(a.type) $(a.name)` +} + @struct RDI_LocationSet: { @expand(RDI_LocationSetMemberTable a) `$(a.type) $(a.name)` diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 1919a722..6ca1235e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -395,7 +395,7 @@ rdim_static_eval_bytecode_to_voff(RDIM_EvalBytecode bc, U64 image_base, U64 *vof } is_ok = 1; -exit:; + exit:; scratch_end(scratch); return is_ok; } @@ -563,13 +563,13 @@ d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type) if (value_type == D2R_ValueType_Address) { return addr_size; } - + switch (value_type) { #define X(_N, _AT, _S) case D2R_ValueType_##_N: return _S; D2R_ValueType_XList #undef X } - + return 0; } @@ -642,19 +642,19 @@ d2r_value_type_to_rdi(D2R_ValueType v) if (v == D2R_ValueType_Generic) { return RDI_EvalTypeGroup_Other; } - + if (v == D2R_ValueType_Address) { return RDI_EvalTypeGroup_U; } - + if (d2r_is_value_type_unsigned(v)) { return RDI_EvalTypeGroup_U; } - + if (d2r_is_value_type_signed(v)) { return RDI_EvalTypeGroup_S; } - + if (d2r_is_value_type_float(v)) { if (v == D2R_ValueType_F16) { NotImplemented; } else if (v == D2R_ValueType_F32) { return RDI_EvalTypeGroup_F32; } @@ -665,7 +665,7 @@ d2r_value_type_to_rdi(D2R_ValueType v) else if (v == D2R_ValueType_F128) { return RDI_EvalTypeGroup_F128; } else { InvalidPath; } } - + InvalidPath; return RDI_EvalTypeGroup_Other; } @@ -728,7 +728,7 @@ d2r_bytecode_from_expression(Arena *arena, Temp scratch = scratch_begin(&arena, 1); Temp temp = temp_begin(arena); B32 is_ok = 0; - + RDIM_EvalBytecode bc = {0}; DW_Expr expr = dw_expr_from_data(scratch.arena, cu->format, cu->address_size, raw_expr); @@ -805,7 +805,7 @@ d2r_bytecode_from_expression(Arena *arena, Assert(!"invalid address"); goto exit; } - + U64 voff = inst->operands[0].u64 - image_base; rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff); d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); @@ -914,7 +914,7 @@ d2r_bytecode_from_expression(Arena *arena, cursor += i->size; inst_count += 1; } - + if (cursor != delta) { Assert(!"skip landed in middle of an instruction"); goto exit; } if (inst_count > min_S16) { Assert(!"operand overflow"); goto exit; } if (inst_idx > max_U32) { Assert(!"index overflow"); goto exit; } @@ -931,11 +931,11 @@ d2r_bytecode_from_expression(Arena *arena, cursor += i->size; inst_count += 1; } - + if (cursor != delta) { Assert(!"cond landed in middle of an instruction"); goto exit; } if (inst_count > min_S16) { Assert(!"operand overflow"); goto exit; } if (inst_idx > max_U32) { Assert(!"index overflow"); goto exit; } - + U64 imm = Compose64Bit(inst_idx, skip_fwd ? inst_count : (U16)(-(S16)inst_count)); rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Cond, imm); } break; @@ -1042,38 +1042,38 @@ d2r_bytecode_from_expression(Arena *arena, Assert(!"invalid .debug_info offset"); goto exit; } - + DW_Tag tag = tag_node->tag; if (tag.kind == DW_TagKind_BaseType) { // extract encoding attribute DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); - + // DW_ATE -> RDI_EvalTypeGroup switch (encoding) { - case DW_ATE_Null: { - out = D2R_ValueType_Generic; - } break; - case DW_ATE_Address: { - out = D2R_ValueType_Address; - } break; - case DW_ATE_Boolean: { - out = D2R_ValueType_S8; - } break; - case DW_ATE_SignedChar: - case DW_ATE_Signed: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_signed_value_type_from_bit_size(byte_size * 8); - } break; - case DW_ATE_UnsignedChar: - case DW_ATE_Unsigned: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_unsigned_value_type_from_bit_size(byte_size * 8); - } break; - case DW_ATE_Float: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_float_type_from_bit_size(byte_size * 8); - } break; - default: InvalidPath; break; + case DW_ATE_Null: { + out = D2R_ValueType_Generic; + } break; + case DW_ATE_Address: { + out = D2R_ValueType_Address; + } break; + case DW_ATE_Boolean: { + out = D2R_ValueType_S8; + } break; + case DW_ATE_SignedChar: + case DW_ATE_Signed: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_signed_value_type_from_bit_size(byte_size * 8); + } break; + case DW_ATE_UnsignedChar: + case DW_ATE_Unsigned: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_unsigned_value_type_from_bit_size(byte_size * 8); + } break; + case DW_ATE_Float: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_float_type_from_bit_size(byte_size * 8); + } break; + default: InvalidPath; break; } } else { Assert(!"unexpected tag"); @@ -1300,9 +1300,9 @@ d2r_bytecode_from_expression(Arena *arena, if (result_type_out) { *result_type_out = d2r_value_type_stack_peek(stack); } - + is_ok = 1; -exit:; + exit:; if (!is_ok) { MemoryZeroStruct(&bc); temp_end(temp); @@ -1584,13 +1584,13 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *inpu if (ref.cu == cu) { // find type type = d2r_type_from_offset(type_table, ref.info_off); - + // was type converted? if (type == 0) { // issue type conversion DW_TagNode *ref_node = dw_tag_node_from_info_off(cu, ref.info_off); d2r_convert_types(arena, type_table, input, cu, cu_lang, arch, ref_node); - + // if we do not have a converted type at this point then debug info is malformed type = d2r_type_from_offset(type_table, ref.info_off); if (type == 0) { @@ -1726,7 +1726,7 @@ d2r_convert_types(Arena *arena, log_user_errorf("unexpected tag @ .debug_info+%llx", tag.info_off); } } - + DW_TagNode *parent = d2r_tag_iterator_parent_tag_node(it); B32 is_method = parent->tag.kind == DW_TagKind_StructureType || parent->tag.kind == DW_TagKind_ClassType; @@ -1759,7 +1759,7 @@ d2r_convert_types(Arena *arena, // convert base type encoding to RDI version RDI_TypeKind kind = RDI_TypeKind_NULL; - #define X(t,g,s) case s: kind = RDI_TypeKind_##t; break; +#define X(t,g,s) case s: kind = RDI_TypeKind_##t; break; switch (encoding) { case DW_ATE_Null: kind = RDI_TypeKind_NULL; break; case DW_ATE_Address: kind = RDI_TypeKind_Void; break; @@ -1787,19 +1787,19 @@ d2r_convert_types(Arena *arena, } if (kind != RDI_TypeKind_NULL) { break; } } - + switch (byte_size) { D2R_ValueType_Float_XList - default: log_user_errorf("unexpected size"); break; + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_Signed: { String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); if (str8_match(name, str8_lit("wchar_t"), 0)) { goto do_signed_char; } - + switch (byte_size) { D2R_ValueType_Signed_XList - default: log_user_errorf("unexpected size"); break; + default: log_user_errorf("unexpected size"); break; } } break; do_signed_char:; @@ -1814,7 +1814,7 @@ d2r_convert_types(Arena *arena, case DW_ATE_Unsigned: { switch (byte_size) { D2R_ValueType_Unsigned_XList - default: log_user_errorf("unexpected size"); break; + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_Utf: @@ -1828,10 +1828,10 @@ d2r_convert_types(Arena *arena, } break; case DW_ATE_DecimalFloat: { switch (byte_size) { - case 4: kind = RDI_TypeKind_Decimal32; break; - case 8: kind = RDI_TypeKind_Decimal64; break; - case 16: kind = RDI_TypeKind_Decimal128; break; - default: log_user_errorf("unexpected size"); break; + case 4: kind = RDI_TypeKind_Decimal32; break; + case 8: kind = RDI_TypeKind_Decimal64; break; + case 16: kind = RDI_TypeKind_Decimal128; break; + default: log_user_errorf("unexpected size"); break; } } break; case DW_ATE_ImaginaryFloat: { @@ -1860,7 +1860,7 @@ d2r_convert_types(Arena *arena, } break; default: log_user_errorf("unexpected base type encoding"); break; } - #undef X +#undef X RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); type->kind = RDI_TypeKind_Alias; @@ -1946,9 +1946,9 @@ d2r_convert_types(Arena *arena, // and convert to U256, U512, S256 and S512 B32 is_vector = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_GNU_Vector); if (is_vector) { NotImplemented; } - + B32 error = 1; - + // * DWARF vs RDI Array Type Graph * // // For example lets take following decl: @@ -2035,13 +2035,13 @@ d2r_convert_types(Arena *arena, error = 0; array_type_exit:; - + // in case of an error, assign null to the array type if (error) { Assert(d2r_type_from_offset(type_table, tag.info_off) == 0); // this should the first time this type is being parsed hash_table_push_u64_raw(arena, type_table->ht, tag.info_off, type_table->builtin_types[RDI_TypeKind_NULL]); } - + d2r_tag_iterator_skip_children(it); } break; case DW_TagKind_SubrangeType: { @@ -2101,18 +2101,18 @@ d2r_convert_udts(Arena *arena, DW_TagNode *root) { Temp scratch = scratch_begin(&arena, 1); - + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { DW_TagNode *tag_node = it->tag_node; DW_Tag tag = tag_node->tag; - + // skip converted tags if (d2r_is_udt_tag_converted(tag_node)) { d2r_tag_iterator_skip_children(it); continue; } d2r_flag_converted_udt_tag(tag_node); - + if (tag.kind == DW_TagKind_ClassType || tag.kind == DW_TagKind_StructureType || tag.kind == DW_TagKind_UnionType) { B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { @@ -2136,8 +2136,8 @@ d2r_convert_udts(Arena *arena, } else if (tag.kind == DW_TagKind_Member) { DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType || - parent_tag.kind == DW_TagKind_ClassType || - parent_tag.kind == DW_TagKind_UnionType; + parent_tag.kind == DW_TagKind_ClassType || + parent_tag.kind == DW_TagKind_UnionType; if (is_parent_udt) { RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); @@ -2293,7 +2293,7 @@ d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 imag } } else if ((lo_pc_attrib->attrib_kind == DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) || (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind == DW_AttribKind_Null)) { - log_user_errorf("invalid range @ .debug_info+%llx", tag.info_off); + log_user_errorf("invalid range @ .debug_info+%llx", tag.info_off); } } @@ -2343,7 +2343,7 @@ d2r_convert_symbols(Arena *arena, d2r_tag_iterator_skip_children(it); break; } - + DW_InlKind inl = DW_Inl_NotInlined; if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Inline)) { inl = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Inline); } @@ -2392,7 +2392,7 @@ d2r_convert_symbols(Arena *arena, proc->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); proc->link_name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName); proc->type = proc_type; - proc->container_symbol = 0; + proc->container_scope = 0; proc->container_type = container_type; proc->root_scope = root_scope; proc->location_cases = d2r_locset_from_attrib(arena, &g_d2r_shared.scopes, root_scope, &g_d2r_shared.locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); @@ -2407,10 +2407,10 @@ d2r_convert_symbols(Arena *arena, if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Virtuality)) { virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality); switch (virtuality) { - case DW_VirtualityKind_None: member_kind = RDI_MemberKind_Method; break; - case DW_VirtualityKind_Virtual: member_kind = RDI_MemberKind_VirtualMethod; break; - case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal - default: { log_user_errorf("unhandled virtuality kind"); } break; + case DW_VirtualityKind_None: member_kind = RDI_MemberKind_Method; break; + case DW_VirtualityKind_Virtual: member_kind = RDI_MemberKind_VirtualMethod; break; + case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal + default: { log_user_errorf("unhandled virtuality kind"); } break; } } } @@ -2485,7 +2485,7 @@ d2r_convert_symbols(Arena *arena, // NOTE: due to a bug in clang in stb_sprintf.h local variables // are declared in global scope without a name if (name.size == 0) { break; } - + // decls do not have location info B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); if (is_decl) { break; } @@ -2529,7 +2529,7 @@ d2r_convert_symbols(Arena *arena, var->link_name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName); var->type = type; var->offset = voff; - var->container_symbol = 0; + var->container_scope = 0; } } break; case DW_TagKind_FormalParameter: { @@ -2641,14 +2641,14 @@ d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) for EachNode(range_n, Rng1U64Node, unit_range_list.first) { String8 unit_data = str8_substr(input->sec[DW_Section_ARanges].data, range_n->v); U64 unit_cursor = 0; - + U32 first_four_bytes = 0; if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } DW_Format unit_format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - + U64 unit_length; TryRead(str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length), unit_cursor, exit); - + DW_Version version; TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &version), unit_cursor, exit); @@ -2656,10 +2656,10 @@ d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) log_user_errorf("unknown .debug_aranges version %u @ 0x%llx", version, range_n->v.min); continue; } - + U64 cu_info_off; TryRead(str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &cu_info_off), unit_cursor, exit); - + U8 address_size = 0; TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &address_size), unit_cursor, exit); @@ -2726,7 +2726,7 @@ internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); - + if (lane_idx() == 0) { //////////////////////////////// @@ -2742,30 +2742,30 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); String8 string_table = str8_substr(params->exe_data, pe.string_table_range); - + arch = pe.arch; image_base = pe.image_base; input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); path_style = PathStyle_WindowsAbsolute; - + g_d2r_shared.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); } break; case ExecutableImageKind_Elf32: case ExecutableImageKind_Elf64: { ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data); - + arch = arch_from_elf_machine(bin.hdr.e_machine); image_base = elf_base_addr_from_bin(&bin); input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); path_style = PathStyle_UnixAbsolute; - + g_d2r_shared.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); } break; default: { InvalidPath; } break; } //////////////////////////////// - + ProfBegin("compute exe hash"); U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); ProfEnd(); @@ -2797,12 +2797,12 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) ProfEnd(); //////////////////////////////// - + ProfBeginV("Convert Line Tables [Count: %llu]", cu_ranges.count); RDIM_LineTable **cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); { Temp temp = temp_begin(scratch.arena); - + // TODO: per thread task ProfBegin("Up front parse line VM headers"); DW_LineVM **line_vms = push_array(temp.arena, DW_LineVM *, cu_ranges.count); @@ -2810,18 +2810,18 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) line_vms[cu_idx] = dw_line_vm_init(&input, &cu_arr[cu_idx]); } ProfEnd(); - + // TODO: sync // // sum all source files (including duplicates) U64 total_file_count = 0; for EachIndex(cu_idx, cu_ranges.count) { total_file_count += line_vms[cu_idx]->header.file_table.count; } - + // TODO: sync ProfBeginV("Dedup source files [Count: %llu]", total_file_count); LFHT_NodeChunkList *src_file_lfht_nodes = push_array(temp.arena, LFHT_NodeChunkList, lane_count()); LFHT_Node *src_file_lfht = 0; - + // TODO: per thread { D2R_SrcFileLookup *lookup = 0; @@ -2829,11 +2829,11 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW_LineVM *vm = line_vms[cu_idx]; for EachIndex(file_idx, vm->header.file_table.count) { DW_LineFile *file = &vm->header.file_table.v[file_idx]; - + if (lookup == 0) { lookup = push_array(temp.arena, D2R_SrcFileLookup, 1); } lookup->vm = vm; lookup->file = file; - + LFHT_NodeChunkList *node_chunks = &src_file_lfht_nodes[lane_idx()]; U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); B32 was_inserted = lfht_insert(temp.arena, node_chunks, &src_file_lfht, hash, lookup, d2r_src_file_lookup_is_equal, 0); @@ -2844,26 +2844,26 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } ProfEnd(); - + // TODO: sync ProfBegin("Extract source file lookups"); U64 unique_file_count = lfht_total_count_from_node_chunk_lists(lane_count(), src_file_lfht_nodes); void **lookups = lfht_data_from_node_chunk_lists(temp.arena, unique_file_count, lane_count(), src_file_lfht_nodes); ProfEnd(); - + // TODO: sync ProfBeginV("Sort unique source files [Count: %llu]", unique_file_count); d2r_sort_ptrs(lookups, unique_file_count, d2r_src_file_lfht_key_value_is_before); ProfEnd(); - + // TODO: per thread task ProfBegin("Convert source files"); for EachIndex(i, unique_file_count) { D2R_SrcFileLookup *lookup = lookups[i]; - + DW_LineFile *src = lookup->file; RDIM_SrcFile *dst = rdim_src_file_chunk_list_push(arena, &g_d2r_shared.src_files, D2R_SRC_FILE_CAP); - + // make file path String8 path; { @@ -2872,7 +2872,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) str8_list_push_node(&path_list, &(String8Node){ .string = src->path }); path = str8_path_list_join_by_style(arena, &path_list, path_style); } - + // fill out source file dst->path = path; if ( ! u128_match(src->md5, u128_zero())) { @@ -2882,30 +2882,30 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) dst->checksum_kind = RDI_ChecksumKind_Timestamp; dst->checksum = str8_copy(arena, str8_struct(&src->time_stamp)); } - + lookup->src_file = dst; } ProfEnd(); // TODO: sync RDIM_LineTableChunkList *lane_line_table_chunks = push_array(temp.arena, RDIM_LineTableChunkList, lane_count()); - + // TODO: per thread task ProfBegin("Convert line sequences"); U64 *line_seq_counts_per_lane = push_array(scratch.arena, U64, lane_count()); for EachIndex(cu_idx, cu_ranges.count) { RDIM_LineTableChunkList *lane_line_table_chunk_list = &lane_line_table_chunks[lane_idx()]; - + // push new line table for the compile unit RDIM_LineTable *line_table = rdim_line_table_chunk_list_push(arena, lane_line_table_chunk_list, D2R_LINE_TABLE_CAP); cu_line_tables_rdi[cu_idx] = line_table; - + // push line buffer #define D2R_LineBufferMax 1024 struct LineBuffer { U64 file_index; U64 voffs[D2R_LineBufferMax]; U32 line_nums[D2R_LineBufferMax]; U32 col_nums[D2R_LineBufferMax]; } LineBuffer; struct LineBuffer *line_buffer = push_array(temp.arena, struct LineBuffer, 1); U64 line_buffer_size = 0; - + // decode line sequences DW_LineVM *vm = line_vms[cu_idx]; U64 *line_seq_counts_per_file = push_array(temp.arena, U64, vm->header.file_table.count); @@ -2913,32 +2913,32 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) if (vm->new_line) { // lazy defined files are not supported if (vm->state.file_index >= vm->header.file_table.count) { continue; } - + // time to flush the buffer? if (((vm->opcode == DW_StdOpcode_ExtendedOpcode && vm->ext_opcode == DW_ExtOpcode_EndSequence) || - (line_buffer_size >= D2R_LineBufferMax || line_buffer->file_index != vm->state.file_index)) + (line_buffer_size >= D2R_LineBufferMax || line_buffer->file_index != vm->state.file_index)) && line_buffer_size > 0) { // lookup source file DW_LineFile *file = &vm->header.file_table.v[line_buffer->file_index]; U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); D2R_SrcFileLookup *lookup = lfht_search(src_file_lfht, hash, &(D2R_SrcFileLookup){ .file = file, .vm = vm }, d2r_src_file_lookup_is_equal, 0); RDIM_SrcFile *src_file = lookup->src_file; - + // copy line info U64 *voffs = push_array_no_zero(arena, U64, line_buffer_size + 1); U32 *line_nums = push_array_no_zero(arena, U32, line_buffer_size); voffs[line_buffer_size] = vm->state.address - image_base; MemoryCopyTyped(voffs, line_buffer->voffs, line_buffer_size); MemoryCopyTyped(line_nums, line_buffer->line_nums, line_buffer_size); - + RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, lane_line_table_chunk_list, line_table, src_file, voffs, line_nums, 0, line_buffer_size); - + // atomic implementation of @rdim_src_file_push_line_sequence { // associate line fragment with source file RDIM_SrcFileLineMapFragment *line_frag = push_array(arena, RDIM_SrcFileLineMapFragment, 1); line_frag->seq = line_seq; - + // insert line fragment node for (;;) { RDIM_SrcFileLineMapFragment *next = src_file->first_line_map_fragment; @@ -2949,18 +2949,18 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } if (curr == next) { break; } } - + // accumulate line sequence counts per file line_seq_counts_per_file[vm->state.file_index] += line_seq->line_count; - + // accumulate line sequence counts per lane line_seq_counts_per_lane[lane_idx()] += line_seq->line_count; } - + // reset line buffer size tracker line_buffer_size = 0; } - + if (line_buffer_size > 0 && line_buffer->voffs[line_buffer_size - 1] == vm->state.address) { line_buffer->line_nums[line_buffer_size - 1] = Min(line_buffer->line_nums[line_buffer_size - 1], safe_cast_u32(vm->state.line)); } else { @@ -2972,7 +2972,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } } - + // update line sequence counts per source file @rdim_src_file_push_line_sequence for EachIndex(file_idx, vm->header.file_table.count) { if (line_seq_counts_per_file[file_idx] > 0) { @@ -2984,26 +2984,26 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } } - + // TODO: sync // // update total line sequences count in shared @rdim_src_file_push_line_sequence for EachIndex(i, lane_count()) { g_d2r_shared.src_files.total_line_count += line_seq_counts_per_lane[i]; } - + // TODO: sync for EachIndex(i, lane_count()) { rdim_line_table_chunk_list_concat_in_place(&g_d2r_shared.line_tables, &lane_line_table_chunks[i]); } - + // TODO: per thread task ProfBegin("Relase line VMs"); for EachIndex(i, cu_ranges.count) { dw_line_vm_release(line_vms[i]); } ProfEnd(); - + temp_end(temp); } ProfEnd(); @@ -3022,7 +3022,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) type->byte_size = rdi_size_from_basic_type_kind(type_kind); builtin_types[type_kind] = type; } - + // fixup float80 size if (arch == Arch_x64 || arch == Arch_arm64) { builtin_types[RDI_TypeKind_F80]->byte_size = 16; @@ -3041,7 +3041,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) Temp comp_temp = temp_begin(scratch.arena); DW_CompUnit *cu = &cu_arr[cu_idx]; - + // skip DWO { if (cu->dwo_id) { goto next_cu; } diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index c777f199..4d76106f 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3460,11 +3460,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) container_type = p2r_type_ptr_from_itype(cv_type_id); } - // rjf: unpack global's container symbol - RDIM_Symbol *container_symbol = 0; + // rjf: unpack global's container scope + RDIM_Scope *container_scope = 0; if(container_type == 0 && top_scope_node != 0) { - container_symbol = top_scope_node->scope->symbol; + container_scope = top_scope_node->scope; } // rjf: build symbol @@ -3473,7 +3473,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) symbol->name = name; symbol->type = type; symbol->offset = voff; - symbol->container_symbol = container_symbol; + symbol->container_scope = container_scope; symbol->container_type = container_type; } }break; @@ -3516,11 +3516,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) container_type = p2r_type_ptr_from_itype(cv_type_id); } - // rjf: unpack proc's container symbol - RDIM_Symbol *container_symbol = 0; + // rjf: unpack proc's container scope + RDIM_Scope *container_scope = 0; if(container_type == 0 && top_scope_node != 0) { - container_symbol = top_scope_node->scope->symbol; + container_scope = top_scope_node->scope; } // rjf: build procedure's root scope @@ -3571,7 +3571,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) curr_proc_symbol->name = name; curr_proc_symbol->link_name = link_name; curr_proc_symbol->type = type; - curr_proc_symbol->container_symbol = container_symbol; + curr_proc_symbol->container_scope = container_scope; curr_proc_symbol->container_type = container_type; curr_proc_symbol->root_scope = procedure_root_scope; if(procedure_root_scope != 0) @@ -3716,10 +3716,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: unpack thread variable's container symbol - RDIM_Symbol *container_symbol = 0; + RDIM_Scope *container_scope = 0; if(container_type == 0 && top_scope_node != 0) { - container_symbol = top_scope_node->scope->symbol; + container_scope = top_scope_node->scope; } // rjf: build symbol @@ -3729,7 +3729,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); tvar->offset = tls_off; tvar->container_type = container_type; - tvar->container_symbol = container_symbol; + tvar->container_scope = container_scope; }break; //- rjf: LOCAL diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 9a3a669b..a99b54a2 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2999,10 +2999,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->link_flags |= RDI_LinkFlag_TypeScoped; dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 } - else if(src->container_symbol != 0) + else if(src->container_scope != 0) { dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_scope->symbol); // TODO(rjf): @u64_to_u32 } dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 @@ -3294,10 +3294,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->link_flags |= RDI_LinkFlag_TypeScoped; dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 } - else if(src->container_symbol != 0) + else if(src->container_scope != 0) { dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_scope->symbol); // TODO(rjf): @u64_to_u32 } } } @@ -3325,10 +3325,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->link_flags |= RDI_LinkFlag_TypeScoped; dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 } - else if(src->container_symbol != 0) + else if(src->container_scope != 0) { dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32 + dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_scope->symbol); // TODO(rjf): @u64_to_u32 } } } @@ -3354,6 +3354,72 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } lane_sync(); + ////////////////////////////////////////////////////////////// + //- rjf: @rdim_bake_stage bake symbols (NEW) + // + ProfScope("bake symbols") + { + //////////////////////////// + //- rjf: set up all symbol table baking tasks + // + struct + { + RDIM_SymbolChunkList *symbols; + } + tasks[] = + { + {¶ms->global_variables}, + {¶ms->thread_variables}, + }; + + //////////////////////////// + //- rjf: bake flat symbol tables + // + for EachElement(task_idx, tasks) + { + RDIM_SymbolChunkList *src_symbols = tasks[task_idx].symbols; + U64 dst_symbols_count = src_symbols->total_count + 1; + RDI_Symbol *dst_symbols = 0; + if(lane_idx() == 0) + { + dst_symbols = push_array(arena, RDI_Symbol, dst_symbols_count); + } + lane_sync_u64(&dst_symbols, 0); + for EachNode(n, RDIM_SymbolChunkNode, src_symbols->first) + { + Rng1U64 range = lane_range(n->count); + for EachInRange(n_idx, range) + { + RDIM_Symbol *src = &n->v[n_idx]; + RDI_Symbol *dst = &dst_symbols[n->base_idx + n_idx + 1]; + + // rjf: fill basics + dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 + dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 + dst->link_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->link_name); + + // rjf: fill container info + if(src->is_extern) + { + dst->container_flags |= RDI_ContainerFlag_External; + } + if(src->container_scope != 0) + { + dst->container_flags |= RDI_ContainerKind_Scope; + dst->container_idx = rdim_idx_from_scope(src->container_scope); + } + else if(src->container_type != 0) + { + dst->container_flags |= RDI_ContainerKind_Type; + dst->container_idx = rdim_idx_from_udt(src->container_type->udt); + } + } + } + } + } + lane_sync(); + ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake file paths // From 424549b562f9ae16c255856e757bce1178980c8b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 11 Mar 2026 16:10:06 -0700 Subject: [PATCH 384/850] sketch out new location representation --- src/lib_rdi/rdi.h | 33 +++++++++++++++++++------ src/rdi/rdi.mdesk | 31 ++++++++++++++++++++--- src/rdi_make/rdi_make_local.c | 46 +++++++++++++++++++++++------------ 3 files changed, 83 insertions(+), 27 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index eeab41d9..e887e6e5 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -940,13 +940,11 @@ X(RDI_U32, container_idx)\ #define RDI_Symbol_XList \ X(RDI_U32, name_string_idx)\ X(RDI_SymbolFlags, symbol_flags)\ -X(RDI_LocationKind, location_kind)\ X(RDI_ContainerFlags, container_flags)\ -X(RDI_U8, reserved_0)\ -X(RDI_U32, reserved_1)\ +X(RDI_U16, reserved_0)\ +X(RDI_Location, location)\ X(RDI_U32, container_idx)\ X(RDI_U32, type_idx)\ -X(RDI_U32, location_idx)\ X(RDI_U32, root_scope_idx)\ X(RDI_U32, link_name_string_idx)\ @@ -1236,6 +1234,27 @@ typedef RDI_U32_Table RDI_U32_NameMapBuckets; typedef RDI_U32_Table RDI_U32_NameMapNodes; #endif +typedef RDI_U64 RDI_Location; +#define RDI_Location_KindMask 0xff00000000000000ull +#define RDI_Location_KindShift 56 +#define RDI_Location_OffMask 0x00ffffffffffffffull +#define RDI_Location_OffShift 0 +#define RDI_Location_SetFirstIndexMask 0x00000000ffffffffull +#define RDI_Location_SetFirstIndexShift 0 +#define RDI_Location_SetCountMask 0x00ffffff00000000ull +#define RDI_Location_SetCountShift 32 +#define RDI_Location_RegCodeMask 0x00ff000000000000ull +#define RDI_Location_RegCodeShift 48 +#define RDI_Location_RegOffMask 0x0000ffff00000000ull +#define RDI_Location_RegOffShift 32 +#define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift)) +#define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) +#define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) +#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) +#define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0) +#define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0) +#define rdi_regcode_from_location(l) ((((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift)) +#define rdi_regoff_from_location(l) ((((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift)) #define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) #define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) #define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) @@ -1451,13 +1470,11 @@ struct RDI_Symbol { RDI_U32 name_string_idx; RDI_SymbolFlags symbol_flags; -RDI_LocationKind location_kind; RDI_ContainerFlags container_flags; -RDI_U8 reserved_0; -RDI_U32 reserved_1; +RDI_U16 reserved_0; +RDI_Location location; RDI_U32 container_idx; RDI_U32 type_idx; -RDI_U32 location_idx; RDI_U32 root_scope_idx; RDI_U32 link_name_string_idx; }; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index d6921efe..2075c795 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1058,13 +1058,11 @@ RDI_SymbolMemberTable: { {name_string_idx RDI_U32 ""} {symbol_flags RDI_SymbolFlags ""} - {location_kind RDI_LocationKind ""} {container_flags RDI_ContainerFlags ""} - {reserved_0 RDI_U8 ""} - {reserved_1 RDI_U32 ""} + {reserved_0 RDI_U16 ""} + {location RDI_Location ""} {container_idx RDI_U32 ""} {type_idx RDI_U32 ""} - {location_idx RDI_U32 ""} {root_scope_idx RDI_U32 ""} {link_name_string_idx RDI_U32 ""} } @@ -1231,6 +1229,31 @@ RDI_LocationSetElementMemberTable: @expand(RDI_LocationKindTable a) `$(a.name .. =>20) = $(a.value)` } +@gen(enums) +{ + `typedef RDI_U64 RDI_Location;`; + `#define RDI_Location_KindMask 0xff00000000000000ull`; + `#define RDI_Location_KindShift 56`; + `#define RDI_Location_OffMask 0x00ffffffffffffffull`; + `#define RDI_Location_OffShift 0`; + `#define RDI_Location_SetFirstIndexMask 0x00000000ffffffffull`; + `#define RDI_Location_SetFirstIndexShift 0`; + `#define RDI_Location_SetCountMask 0x00ffffff00000000ull`; + `#define RDI_Location_SetCountShift 32`; + `#define RDI_Location_RegCodeMask 0x00ff000000000000ull`; + `#define RDI_Location_RegCodeShift 48`; + `#define RDI_Location_RegOffMask 0x0000ffff00000000ull`; + `#define RDI_Location_RegOffShift 32`; + `#define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift))`; + `#define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; + `#define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; + `#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; + `#define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0)`; + `#define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0)`; + `#define rdi_regcode_from_location(l) ((((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift))`; + `#define rdi_regoff_from_location(l) ((((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift))`; +} + //- rjf: xlists @xlist RDI_LinkFlags_XList: diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index a99b54a2..19417b86 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1709,6 +1709,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } lane_sync(); + ////////////////////////////////////////////////////////////// + //- rjf: @rdim_bake_stage build deduplicated location maps + // + RDIM_BakeStringMapTight *bake_locs__regs = 0; + RDIM_BakeStringMapTight *bake_locs__reg_plus_u16 = 0; + RDIM_BakeStringMapTight *bake_locs__bytecode = 0; + { + + } + lane_sync(); + ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake strings // @@ -3354,30 +3365,30 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } lane_sync(); + ////////////////////////////// + //- rjf: gather all lists which form symbol tables + // + struct + { + RDIM_SymbolChunkList *symbols; + } + symbol_table_lists[] = + { + {¶ms->global_variables}, + {¶ms->thread_variables}, + }; + ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake symbols (NEW) // ProfScope("bake symbols") { - //////////////////////////// - //- rjf: set up all symbol table baking tasks - // - struct - { - RDIM_SymbolChunkList *symbols; - } - tasks[] = - { - {¶ms->global_variables}, - {¶ms->thread_variables}, - }; - //////////////////////////// //- rjf: bake flat symbol tables // - for EachElement(task_idx, tasks) + for EachElement(symbol_table_list_idx, symbol_table_lists) { - RDIM_SymbolChunkList *src_symbols = tasks[task_idx].symbols; + RDIM_SymbolChunkList *src_symbols = symbol_table_lists[symbol_table_list_idx].symbols; U64 dst_symbols_count = src_symbols->total_count + 1; RDI_Symbol *dst_symbols = 0; if(lane_idx() == 0) @@ -3414,6 +3425,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->container_flags |= RDI_ContainerKind_Type; dst->container_idx = rdim_idx_from_udt(src->container_type->udt); } + + // rjf: fill location + { + // TODO(rjf) + } } } } From 911e8c135ef70e15ca3f7b7d29d905d52531d163 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 12 Mar 2026 14:59:06 -0700 Subject: [PATCH 385/850] new location info baking layout computation - symbol-inlined locations in most cases, + indirected to set elements / bytecode / constant data as needed --- src/lib_rdi/rdi.c | 9 +--- src/lib_rdi/rdi.h | 84 +++++++++------------------------ src/rdi/rdi.mdesk | 55 ++++++--------------- src/rdi_from_pdb/rdi_from_pdb.c | 6 +-- src/rdi_make/rdi_make_local.c | 83 ++++++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 113 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 5a777206..c1f2bc9a 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -10,7 +10,7 @@ #ifndef RDI_C #define RDI_C -RDI_U16 rdi_section_element_size_table[58] = +RDI_U16 rdi_section_element_size_table[53] = { sizeof(RDI_U8), sizeof(RDI_TopLevelInfo), @@ -53,12 +53,7 @@ sizeof(RDI_Symbol), sizeof(RDI_Symbol), sizeof(RDI_Symbol), sizeof(RDI_U8), -sizeof(RDI_RegAndOffsetU16), -sizeof(RDI_RegCode), -sizeof(RDI_U64), -sizeof(RDI_U32), -sizeof(RDI_U64), -sizeof(RDI_LocationSet), +sizeof(RDI_U8), sizeof(RDI_LocationSetElement), sizeof(RDI_U8), sizeof(RDI_U32), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index e887e6e5..2a87f828 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -116,23 +116,18 @@ RDI_SectionKind_ConstantSymbols = 0x0025, RDI_SectionKind_ProcedureSymbols = 0x0026, RDI_SectionKind_LocalSymbols = 0x0027, RDI_SectionKind_LocationsBytecodeData = 0x0028, -RDI_SectionKind_LocationsRegPlusU16 = 0x0029, -RDI_SectionKind_LocationsReg = 0x002A, -RDI_SectionKind_LocationsModuleOff = 0x002B, -RDI_SectionKind_LocationsTLSOff = 0x002C, -RDI_SectionKind_LocationsConstantDataOff = 0x002D, -RDI_SectionKind_LocationsSet = 0x002E, -RDI_SectionKind_LocationsSetElements = 0x002F, -RDI_SectionKind_ConstantValueData = 0x0030, -RDI_SectionKind_ConstantValueTable = 0x0031, -RDI_SectionKind_MD5Checksums = 0x0032, -RDI_SectionKind_SHA1Checksums = 0x0033, -RDI_SectionKind_SHA256Checksums = 0x0034, -RDI_SectionKind_Timestamps = 0x0035, -RDI_SectionKind_NameMaps = 0x0036, -RDI_SectionKind_NameMapBuckets = 0x0037, -RDI_SectionKind_NameMapNodes = 0x0038, -RDI_SectionKind_COUNT = 0x0039, +RDI_SectionKind_LocationsConstantData = 0x0029, +RDI_SectionKind_LocationsSetElements = 0x002A, +RDI_SectionKind_ConstantValueData = 0x002B, +RDI_SectionKind_ConstantValueTable = 0x002C, +RDI_SectionKind_MD5Checksums = 0x002D, +RDI_SectionKind_SHA1Checksums = 0x002E, +RDI_SectionKind_SHA256Checksums = 0x002F, +RDI_SectionKind_Timestamps = 0x0030, +RDI_SectionKind_NameMaps = 0x0031, +RDI_SectionKind_NameMapBuckets = 0x0032, +RDI_SectionKind_NameMapNodes = 0x0033, +RDI_SectionKind_COUNT = 0x0034, } RDI_SectionKindEnum; typedef RDI_U32 RDI_SectionEncoding; @@ -586,12 +581,7 @@ X(ConstantSymbols, constant_symbols, RDI_Symbol)\ X(ProcedureSymbols, procedure_symbols, RDI_Symbol)\ X(LocalSymbols, local_symbols, RDI_Symbol)\ X(LocationsBytecodeData, locations_bytecode_data, RDI_U8)\ -X(LocationsRegPlusU16, locations_reg_plus_u16, RDI_RegAndOffsetU16)\ -X(LocationsReg, locations_reg, RDI_RegCode)\ -X(LocationsModuleOff, locations_module_off, RDI_U64)\ -X(LocationsTLSOff, locations_tls_off, RDI_U32)\ -X(LocationsConstantDataOff, locations_constant_data_off, RDI_U64)\ -X(LocationsSet, locations_set, RDI_LocationSet)\ +X(LocationsConstantData, locations_constant_data, RDI_U8)\ X(LocationsSetElements, locations_set_elements, RDI_LocationSetElement)\ X(ConstantValueData, constant_value_data, RDI_U8)\ X(ConstantValueTable, constant_value_table, RDI_U32)\ @@ -1018,17 +1008,10 @@ X(RDI_RegCode, reg_code)\ X(RDI_RegCode, reg_code)\ X(RDI_U16, offset)\ -#define RDI_LocationSet_XList \ -X(RDI_U32, set_element_idx_first)\ -X(RDI_U32, set_element_idx_opl)\ - #define RDI_LocationSetElement_XList \ -X(RDI_LocationKind, kind)\ -X(RDI_U8, reserved_0)\ -X(RDI_U16, reserved_1)\ -X(RDI_U32, idx)\ X(RDI_U32, scope_off_first)\ X(RDI_U32, scope_off_opl)\ +X(RDI_Location, location)\ #define RDI_EvalOp_XList \ X(Stop)\ @@ -1162,12 +1145,7 @@ typedef struct RDI_U32_ConstantSymbols { RDI_U32 v; } RDI_U32_Consta typedef struct RDI_U32_ProcedureSymbols { RDI_U32 v; } RDI_U32_ProcedureSymbols; typedef struct RDI_U32_LocalSymbols { RDI_U32 v; } RDI_U32_LocalSymbols; typedef struct RDI_U32_LocationsBytecodeData { RDI_U32 v; } RDI_U32_LocationsBytecodeData; -typedef struct RDI_U32_LocationsRegPlusU16 { RDI_U32 v; } RDI_U32_LocationsRegPlusU16; -typedef struct RDI_U32_LocationsReg { RDI_U32 v; } RDI_U32_LocationsReg; -typedef struct RDI_U32_LocationsModuleOff { RDI_U32 v; } RDI_U32_LocationsModuleOff; -typedef struct RDI_U32_LocationsTLSOff { RDI_U32 v; } RDI_U32_LocationsTLSOff; -typedef struct RDI_U32_LocationsConstantDataOff { RDI_U32 v; } RDI_U32_LocationsConstantDataOff; -typedef struct RDI_U32_LocationsSet { RDI_U32 v; } RDI_U32_LocationsSet; +typedef struct RDI_U32_LocationsConstantData { RDI_U32 v; } RDI_U32_LocationsConstantData; typedef struct RDI_U32_LocationsSetElements { RDI_U32 v; } RDI_U32_LocationsSetElements; typedef struct RDI_U32_ConstantValueData { RDI_U32 v; } RDI_U32_ConstantValueData; typedef struct RDI_U32_ConstantValueTable { RDI_U32 v; } RDI_U32_ConstantValueTable; @@ -1216,12 +1194,7 @@ typedef RDI_U32_Table RDI_U32_ConstantSymbols; typedef RDI_U32_Table RDI_U32_ProcedureSymbols; typedef RDI_U32_Table RDI_U32_LocalSymbols; typedef RDI_U32_Table RDI_U32_LocationsBytecodeData; -typedef RDI_U32_Table RDI_U32_LocationsRegPlusU16; -typedef RDI_U32_Table RDI_U32_LocationsReg; -typedef RDI_U32_Table RDI_U32_LocationsModuleOff; -typedef RDI_U32_Table RDI_U32_LocationsTLSOff; -typedef RDI_U32_Table RDI_U32_LocationsConstantDataOff; -typedef RDI_U32_Table RDI_U32_LocationsSet; +typedef RDI_U32_Table RDI_U32_LocationsConstantData; typedef RDI_U32_Table RDI_U32_LocationsSetElements; typedef RDI_U32_Table RDI_U32_ConstantValueData; typedef RDI_U32_Table RDI_U32_ConstantValueTable; @@ -1253,8 +1226,8 @@ typedef RDI_U64 RDI_Location; #define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0) #define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0) -#define rdi_regcode_from_location(l) ((((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift)) -#define rdi_regoff_from_location(l) ((((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift)) +#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0) +#define rdi_regoff_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) #define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) #define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) #define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) @@ -1590,22 +1563,12 @@ RDI_RegCode reg_code; RDI_U16 offset; }; -typedef struct RDI_LocationSet RDI_LocationSet; -struct RDI_LocationSet -{ -RDI_U32 set_element_idx_first; -RDI_U32 set_element_idx_opl; -}; - typedef struct RDI_LocationSetElement RDI_LocationSetElement; struct RDI_LocationSetElement { -RDI_LocationKind kind; -RDI_U8 reserved_0; -RDI_U16 reserved_1; -RDI_U32 idx; RDI_U32 scope_off_first; RDI_U32 scope_off_opl; +RDI_Location location; }; typedef struct RDI_NameMap RDI_NameMap; @@ -1672,12 +1635,7 @@ typedef RDI_Symbol RDI_SectionElementType_ConstantSymbols; typedef RDI_Symbol RDI_SectionElementType_ProcedureSymbols; typedef RDI_Symbol RDI_SectionElementType_LocalSymbols; typedef RDI_U8 RDI_SectionElementType_LocationsBytecodeData; -typedef RDI_RegAndOffsetU16 RDI_SectionElementType_LocationsRegPlusU16; -typedef RDI_RegCode RDI_SectionElementType_LocationsReg; -typedef RDI_U64 RDI_SectionElementType_LocationsModuleOff; -typedef RDI_U32 RDI_SectionElementType_LocationsTLSOff; -typedef RDI_U64 RDI_SectionElementType_LocationsConstantDataOff; -typedef RDI_LocationSet RDI_SectionElementType_LocationsSet; +typedef RDI_U8 RDI_SectionElementType_LocationsConstantData; typedef RDI_LocationSetElement RDI_SectionElementType_LocationsSetElements; typedef RDI_U8 RDI_SectionElementType_ConstantValueData; typedef RDI_U32 RDI_SectionElementType_ConstantValueTable; @@ -1697,7 +1655,7 @@ RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_Eva RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); -extern RDI_U16 rdi_section_element_size_table[58]; +extern RDI_U16 rdi_section_element_size_table[53]; extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; #endif // RDI_H diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 2075c795..4691ddae 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -206,29 +206,24 @@ RDI_SectionTable: //- NOTE(rjf): vvv new story for locations {LocationsBytecodeData locations_bytecode_data RDI_U8 0x0028 U32 ""} - {LocationsRegPlusU16 locations_reg_plus_u16 RDI_RegAndOffsetU16 0x0029 U32 ""} - {LocationsReg locations_reg RDI_RegCode 0x002A U32 ""} - {LocationsModuleOff locations_module_off RDI_U64 0x002B U32 ""} - {LocationsTLSOff locations_tls_off RDI_U32 0x002C U32 ""} - {LocationsConstantDataOff locations_constant_data_off RDI_U64 0x002D U32 ""} - {LocationsSet locations_set RDI_LocationSet 0x002E U32 ""} - {LocationsSetElements locations_set_elements RDI_LocationSetElement 0x002F U32 ""} + {LocationsConstantData locations_constant_data RDI_U8 0x0029 U32 ""} + {LocationsSetElements locations_set_elements RDI_LocationSetElement 0x002A U32 ""} //- TODO(rjf): vvv old story for locations (constants) - {ConstantValueData constant_value_data RDI_U8 0x0030 U32 ""} - {ConstantValueTable constant_value_table RDI_U32 0x0031 U32 ""} + {ConstantValueData constant_value_data RDI_U8 0x002B U32 ""} + {ConstantValueTable constant_value_table RDI_U32 0x002C U32 ""} //- rjf: checksums / timestamps - {MD5Checksums md5_checksums RDI_MD5 0x0032 U32 ""} - {SHA1Checksums sha1_checksums RDI_SHA1 0x0033 U32 ""} - {SHA256Checksums sha256_checksums RDI_SHA256 0x0034 U32 ""} - {Timestamps timestamps RDI_U64 0x0035 U32 ""} + {MD5Checksums md5_checksums RDI_MD5 0x002D U32 ""} + {SHA1Checksums sha1_checksums RDI_SHA1 0x002E U32 ""} + {SHA256Checksums sha256_checksums RDI_SHA256 0x002F U32 ""} + {Timestamps timestamps RDI_U64 0x0030 U32 ""} //- rjf: name maps - {NameMaps name_maps RDI_NameMap 0x0036 U32 ""} - {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x0037 U32 ""} - {NameMapNodes name_map_nodes RDI_NameMapNode 0x0038 U32 ""} - {COUNT count RDI_U8 0x0039 - ""} + {NameMaps name_maps RDI_NameMap 0x0031 U32 ""} + {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x0032 U32 ""} + {NameMapNodes name_map_nodes RDI_NameMapNode 0x0033 U32 ""} + {COUNT count RDI_U8 0x0034 - ""} } @table(name value) @@ -1179,22 +1174,12 @@ RDI_RegAndOffsetU16MemberTable: {offset RDI_U16 } } -@table(name type desc) -RDI_LocationSetMemberTable: -{ - {set_element_idx_first RDI_U32 ""} - {set_element_idx_opl RDI_U32 ""} -} - @table(name type desc) RDI_LocationSetElementMemberTable: { - {kind RDI_LocationKind ""} - {reserved_0 RDI_U8 ""} - {reserved_1 RDI_U16 ""} - {idx RDI_U32 ""} {scope_off_first RDI_U32 ""} {scope_off_opl RDI_U32 ""} + {location RDI_Location ""} } //- rjf: enums @@ -1250,8 +1235,8 @@ RDI_LocationSetElementMemberTable: `#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0)`; `#define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0)`; - `#define rdi_regcode_from_location(l) ((((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift))`; - `#define rdi_regoff_from_location(l) ((((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift))`; + `#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0)`; + `#define rdi_regoff_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0)`; } //- rjf: xlists @@ -1336,11 +1321,6 @@ RDI_LocationSetElementMemberTable: @expand(RDI_RegAndOffsetU16MemberTable a) `$(a.type), $(a.name)` } -@xlist RDI_LocationSet_XList: -{ - @expand(RDI_LocationSetMemberTable a) `$(a.type), $(a.name)` -} - @xlist RDI_LocationSetElement_XList: { @expand(RDI_LocationSetElementMemberTable a) `$(a.type), $(a.name)` @@ -1418,11 +1398,6 @@ RDI_LocationSetElementMemberTable: @expand(RDI_RegAndOffsetU16MemberTable a) `$(a.type) $(a.name)` } -@struct RDI_LocationSet: -{ - @expand(RDI_LocationSetMemberTable a) `$(a.type) $(a.name)` -} - @struct RDI_LocationSetElement: { @expand(RDI_LocationSetElementMemberTable a) `$(a.type) $(a.name)` diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 4d76106f..82ef4928 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -69,8 +69,8 @@ p2r_rdi_arch_from_cv_arch(CV_Arch cv_arch) RDI_Arch result = 0; switch(cv_arch) { - case CV_Arch_8086: NotImplemented; break; - case CV_Arch_X64: result = RDI_Arch_X64; break; + case CV_Arch_8086:{}break; + case CV_Arch_X64:{result = RDI_Arch_X64;}break; //case CV_Arch_8080: break; //case CV_Arch_80286: break; //case CV_Arch_80386: break; @@ -130,7 +130,7 @@ p2r_rdi_arch_from_cv_arch(CV_Arch cv_arch) //case CV_Arch_ARM64: break; //case CV_Arch_D3D11_SHADER: break; } - return(result); + return result; } internal RDI_RegCode diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 19417b86..810ec628 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3383,6 +3383,89 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // ProfScope("bake symbols") { + //////////////////////////// + //- rjf: count chunks + // + U64 chunk_count = 0; + for EachElement(symbol_table_list_idx, symbol_table_lists) + { + chunk_count += symbol_table_lists[symbol_table_list_idx].symbols->chunk_count; + } + + //////////////////////////// + //- rjf: count indirected location data - bytecode, constants, set elements + // + U64 *lane_chunk_bytecode_data_counts = 0; + U64 *lane_chunk_constant_data_counts = 0; + U64 *lane_chunk_set_element_counts = 0; + if(lane_idx() == 0) + { + lane_chunk_bytecode_data_counts = push_array(scratch.arena, U64, lane_count() * chunk_count); + lane_chunk_constant_data_counts = push_array(scratch.arena, U64, lane_count() * chunk_count); + lane_chunk_set_element_counts = push_array(scratch.arena, U64, lane_count() * chunk_count); + } + lane_sync_u64(&lane_chunk_bytecode_data_counts, 0); + lane_sync_u64(&lane_chunk_constant_data_counts, 0); + lane_sync_u64(&lane_chunk_set_element_counts, 0); + { + U64 chunk_idx = 0; + for EachElement(symbol_table_list_idx, symbol_table_lists) + { + RDIM_SymbolChunkList *src_symbols = symbol_table_lists[symbol_table_list_idx].symbols; + for EachNode(n, RDIM_SymbolChunkNode, src_symbols->first) + { + U64 slot_idx = lane_idx()*chunk_count + chunk_idx; + Rng1U64 range = lane_range(n->count); + for EachInRange(n_idx, range) + { + RDIM_Symbol *s = &n->v[n_idx]; + if(s->location_cases.count > 1) + { + lane_chunk_set_element_counts[slot_idx] += s->location_cases.count; + } + lane_chunk_constant_data_counts[slot_idx] += s->value_data.size; + for EachNode(case_n, RDIM_LocationCase, s->location_cases.first) + { + lane_chunk_bytecode_data_counts[slot_idx] += case_n->location->info.bytecode.encoded_size; + } + } + chunk_idx += 1; + } + } + } + + //////////////////////////// + //- rjf: lay out indirected location data + // + U64 *lane_chunk_bytecode_data_offs = 0; + U64 *lane_chunk_constant_data_offs = 0; + U64 *lane_chunk_set_element_offs = 0; + if(lane_idx() == 0) + { + U64 bytecode_data_off = 0; + U64 constant_data_off = 0; + U64 set_element_off = 0; + lane_chunk_bytecode_data_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); + lane_chunk_constant_data_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); + lane_chunk_set_element_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); + for EachIndex(chunk_idx, chunk_count) + { + for EachIndex(l_idx, lane_count()) + { + U64 slot_idx = l_idx*chunk_count + chunk_idx; + lane_chunk_bytecode_data_offs[slot_idx] = bytecode_data_off; + lane_chunk_constant_data_offs[slot_idx] = constant_data_off; + lane_chunk_set_element_offs[slot_idx] = set_element_off; + bytecode_data_off += lane_chunk_bytecode_data_counts[slot_idx]; + constant_data_off += lane_chunk_constant_data_counts[slot_idx]; + set_element_off += lane_chunk_set_element_counts[slot_idx]; + } + } + } + lane_sync_u64(&lane_chunk_bytecode_data_offs, 0); + lane_sync_u64(&lane_chunk_constant_data_offs, 0); + lane_sync_u64(&lane_chunk_set_element_offs, 0); + //////////////////////////// //- rjf: bake flat symbol tables // From 131d14907e8138bb2cea39a6bd93cb25a1c307b9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 12 Mar 2026 15:50:00 -0700 Subject: [PATCH 386/850] first pass at new unified & tighter symbol location info baking --- src/lib_rdi/rdi.h | 8 +- src/lib_rdi_make/rdi_make.h | 2 +- src/rdi/rdi.mdesk | 4 +- src/rdi_make/rdi_make_local.c | 235 +++++++++++++++++++++++++--------- 4 files changed, 179 insertions(+), 70 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 2a87f828..c45695ae 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -1009,8 +1009,8 @@ X(RDI_RegCode, reg_code)\ X(RDI_U16, offset)\ #define RDI_LocationSetElement_XList \ -X(RDI_U32, scope_off_first)\ -X(RDI_U32, scope_off_opl)\ +X(RDI_U64, voff_first)\ +X(RDI_U64, voff_opl)\ X(RDI_Location, location)\ #define RDI_EvalOp_XList \ @@ -1566,8 +1566,8 @@ RDI_U16 offset; typedef struct RDI_LocationSetElement RDI_LocationSetElement; struct RDI_LocationSetElement { -RDI_U32 scope_off_first; -RDI_U32 scope_off_opl; +RDI_U64 voff_first; +RDI_U64 voff_opl; RDI_Location location; }; diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index acd9f510..1fb935f8 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -855,7 +855,7 @@ struct RDIM_LocationInfo { RDI_LocationKind kind; RDI_U8 reg_code; - RDI_U16 offset; + RDI_U64 offset; RDIM_EvalBytecode bytecode; }; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 4691ddae..2ddcf3c1 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1177,8 +1177,8 @@ RDI_RegAndOffsetU16MemberTable: @table(name type desc) RDI_LocationSetElementMemberTable: { - {scope_off_first RDI_U32 ""} - {scope_off_opl RDI_U32 ""} + {voff_first RDI_U64 ""} + {voff_opl RDI_U64 ""} {location RDI_Location ""} } diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 810ec628..992f90e6 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3407,6 +3407,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) lane_sync_u64(&lane_chunk_bytecode_data_counts, 0); lane_sync_u64(&lane_chunk_constant_data_counts, 0); lane_sync_u64(&lane_chunk_set_element_counts, 0); + ProfScope("count indirected location data") { U64 chunk_idx = 0; for EachElement(symbol_table_list_idx, symbol_table_lists) @@ -3440,80 +3441,188 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 *lane_chunk_bytecode_data_offs = 0; U64 *lane_chunk_constant_data_offs = 0; U64 *lane_chunk_set_element_offs = 0; + U64 total_bytecode_data_count = 0; + U64 total_constant_data_count = 0; + U64 total_set_element_count = 0; + ProfScope("lay out indirected location data") + { + if(lane_idx() == 0) + { + U64 bytecode_data_off = 0; + U64 constant_data_off = 0; + U64 set_element_off = 0; + lane_chunk_bytecode_data_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); + lane_chunk_constant_data_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); + lane_chunk_set_element_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); + for EachIndex(chunk_idx, chunk_count) + { + for EachIndex(l_idx, lane_count()) + { + U64 slot_idx = l_idx*chunk_count + chunk_idx; + lane_chunk_bytecode_data_offs[slot_idx] = bytecode_data_off; + lane_chunk_constant_data_offs[slot_idx] = constant_data_off; + lane_chunk_set_element_offs[slot_idx] = set_element_off; + bytecode_data_off += lane_chunk_bytecode_data_counts[slot_idx]; + constant_data_off += lane_chunk_constant_data_counts[slot_idx]; + set_element_off += lane_chunk_set_element_counts[slot_idx]; + } + } + total_bytecode_data_count = bytecode_data_off; + total_constant_data_count = constant_data_off; + total_set_element_count = set_element_off; + } + lane_sync_u64(&lane_chunk_bytecode_data_offs, 0); + lane_sync_u64(&lane_chunk_constant_data_offs, 0); + lane_sync_u64(&lane_chunk_set_element_offs, 0); + lane_sync_u64(&total_bytecode_data_count, 0); + lane_sync_u64(&total_constant_data_count, 0); + lane_sync_u64(&total_set_element_count, 0); + } + + //////////////////////////// + //- rjf: set up location outputs + // + RDI_U8 *loc_bytecode_data = 0; + RDI_U8 *loc_constant_data = 0; + RDI_LocationSetElement *loc_set_elements = 0; if(lane_idx() == 0) { - U64 bytecode_data_off = 0; - U64 constant_data_off = 0; - U64 set_element_off = 0; - lane_chunk_bytecode_data_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); - lane_chunk_constant_data_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); - lane_chunk_set_element_offs = push_array(scratch.arena, U64, lane_count() * chunk_count); - for EachIndex(chunk_idx, chunk_count) - { - for EachIndex(l_idx, lane_count()) - { - U64 slot_idx = l_idx*chunk_count + chunk_idx; - lane_chunk_bytecode_data_offs[slot_idx] = bytecode_data_off; - lane_chunk_constant_data_offs[slot_idx] = constant_data_off; - lane_chunk_set_element_offs[slot_idx] = set_element_off; - bytecode_data_off += lane_chunk_bytecode_data_counts[slot_idx]; - constant_data_off += lane_chunk_constant_data_counts[slot_idx]; - set_element_off += lane_chunk_set_element_counts[slot_idx]; - } - } + loc_bytecode_data = push_array(arena, RDI_U8, total_bytecode_data_count); + loc_constant_data = push_array(arena, RDI_U8, total_constant_data_count); + loc_set_elements = push_array(arena, RDI_LocationSetElement, total_set_element_count); } - lane_sync_u64(&lane_chunk_bytecode_data_offs, 0); - lane_sync_u64(&lane_chunk_constant_data_offs, 0); - lane_sync_u64(&lane_chunk_set_element_offs, 0); + lane_sync_u64(&loc_bytecode_data, 0); + lane_sync_u64(&loc_constant_data, 0); + lane_sync_u64(&loc_set_elements, 0); //////////////////////////// //- rjf: bake flat symbol tables // - for EachElement(symbol_table_list_idx, symbol_table_lists) + ProfScope("bake flat symbol tables") { - RDIM_SymbolChunkList *src_symbols = symbol_table_lists[symbol_table_list_idx].symbols; - U64 dst_symbols_count = src_symbols->total_count + 1; - RDI_Symbol *dst_symbols = 0; - if(lane_idx() == 0) + U64 chunk_idx = 0; + for EachElement(symbol_table_list_idx, symbol_table_lists) { - dst_symbols = push_array(arena, RDI_Symbol, dst_symbols_count); - } - lane_sync_u64(&dst_symbols, 0); - for EachNode(n, RDIM_SymbolChunkNode, src_symbols->first) - { - Rng1U64 range = lane_range(n->count); - for EachInRange(n_idx, range) + ProfBegin("table %I64u", symbol_table_list_idx); + RDIM_SymbolChunkList *src_symbols = symbol_table_lists[symbol_table_list_idx].symbols; + U64 dst_symbols_count = src_symbols->total_count + 1; + RDI_Symbol *dst_symbols = 0; + if(lane_idx() == 0) { - RDIM_Symbol *src = &n->v[n_idx]; - RDI_Symbol *dst = &dst_symbols[n->base_idx + n_idx + 1]; - - // rjf: fill basics - dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 - dst->link_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->link_name); - - // rjf: fill container info - if(src->is_extern) - { - dst->container_flags |= RDI_ContainerFlag_External; - } - if(src->container_scope != 0) - { - dst->container_flags |= RDI_ContainerKind_Scope; - dst->container_idx = rdim_idx_from_scope(src->container_scope); - } - else if(src->container_type != 0) - { - dst->container_flags |= RDI_ContainerKind_Type; - dst->container_idx = rdim_idx_from_udt(src->container_type->udt); - } - - // rjf: fill location - { - // TODO(rjf) - } + dst_symbols = push_array(arena, RDI_Symbol, dst_symbols_count); } + lane_sync_u64(&dst_symbols, 0); + for EachNode(n, RDIM_SymbolChunkNode, src_symbols->first) + { + U64 slot_idx = lane_idx()*chunk_count + chunk_idx; + U64 dst_bytecode_off = lane_chunk_bytecode_data_offs[slot_idx]; + U64 dst_constant_off = lane_chunk_constant_data_offs[slot_idx]; + U64 dst_set_element_idx = lane_chunk_set_element_offs[slot_idx]; + Rng1U64 range = lane_range(n->count); + for EachInRange(n_idx, range) + { + RDIM_Symbol *src = &n->v[n_idx]; + RDI_Symbol *dst = &dst_symbols[n->base_idx + n_idx + 1]; + + // rjf: fill basics + dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); + dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 + dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 + dst->link_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->link_name); + + // rjf: fill container info + if(src->is_extern) + { + dst->container_flags |= RDI_ContainerFlag_External; + } + if(src->container_scope != 0) + { + dst->container_flags |= RDI_ContainerKind_Scope; + dst->container_idx = rdim_idx_from_scope(src->container_scope); + } + else if(src->container_type != 0) + { + dst->container_flags |= RDI_ContainerKind_Type; + dst->container_idx = rdim_idx_from_udt(src->container_type->udt); + } + + // rjf: fill location set info, if applicable - get set elements to fill + RDI_LocationSetElement *dst_loc_set_elements = loc_set_elements + dst_set_element_idx; + U64 dst_loc_set_elements_count = 0; + if(src->location_cases.count > 1) + { + dst->location |= (((U64)RDI_LocationKind_Set) << RDI_Location_KindShift); + dst->location |= ((src->location_cases.count << RDI_Location_SetCountShift) & RDI_Location_SetCountMask); + dst->location |= ((dst_set_element_idx << RDI_Location_SetFirstIndexShift) & RDI_Location_SetFirstIndexMask); + dst_loc_set_elements_count = src->location_cases.count; + dst_set_element_idx += dst_loc_set_elements_count; + } + + // rjf: fill virtual offset ranges of location set elements + U64 loc_set_element_idx = 0; + for EachNode(c, RDIM_LocationCase, src->location_cases.first) + { + dst_loc_set_elements[loc_set_element_idx].voff_first = c->voff_range.min; + dst_loc_set_elements[loc_set_element_idx].voff_opl = c->voff_range.max; + loc_set_element_idx += 1; + } + + // rjf: fill location(s) + RDI_Location *dst_loc_first = &dst->location; + U64 dst_loc_count = 1; + if(dst_loc_set_elements_count > 0) + { + dst_loc_first = &dst_loc_set_elements[0].location; + dst_loc_count = dst_loc_set_elements_count; + } + { + RDI_Location *dst_loc = dst_loc_first; + for EachNode(c, RDIM_LocationCase, src->location_cases.first) + { + RDIM_Location *src_loc = c->location; + dst_loc[0] |= ((U64)src_loc->info.kind << RDI_Location_KindShift) & RDI_Location_KindMask; + switch(src_loc->info.kind) + { + default:{}break; + case RDI_LocationKind_AddrRegPlusU16: + case RDI_LocationKind_AddrAddrRegPlusU16: + { + dst_loc[0] |= ((U64)src_loc->info.reg_code << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask; + dst_loc[0] |= ((U64)src_loc->info.offset << RDI_Location_RegOffShift) & RDI_Location_RegOffMask; + }break; + case RDI_LocationKind_ValReg: + { + dst_loc[0] |= ((U64)src_loc->info.reg_code << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask; + }break; + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: + { + dst_loc[0] |= ((U64)dst_bytecode_off << RDI_Location_OffShift) & RDI_Location_OffMask; + dst_bytecode_off += src_loc->info.bytecode.encoded_size; + // TODO(rjf): serialize bytecode + }break; + case RDI_LocationKind_ModuleOff: + case RDI_LocationKind_TLSOff: + { + dst_loc[0] |= ((U64)src_loc->info.offset << RDI_Location_OffShift) & RDI_Location_OffMask; + }break; + case RDI_LocationKind_ConstantDataOff: + { + dst_loc[0] |= ((U64)src_loc->info.offset << RDI_Location_OffShift) & RDI_Location_OffMask; + // TODO(rjf): need to move constant data, currently called "value_data", into + // location cases, to make this case work... + }break; + } + if(c->next != 0) + { + dst_loc = &(CastFromMember(RDI_LocationSetElement, location, dst_loc) + 1)->location; + } + } + } + } + chunk_idx += 1; + } + ProfEnd(); } } } From 4db9a47d461ac4d066b27f4fce20f63b8c1469e5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 13 Mar 2026 15:55:32 -0700 Subject: [PATCH 387/850] new packed location constructions; namespace container baking; feed procedures/constants into new symbol baking path --- src/lib_rdi/rdi.h | 9 +++++++-- src/lib_rdi_make/rdi_make.h | 3 ++- src/rdi/rdi.mdesk | 9 +++++++-- src/rdi_make/rdi_make_local.c | 7 +++++++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index c45695ae..85d2432e 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -1221,13 +1221,18 @@ typedef RDI_U64 RDI_Location; #define RDI_Location_RegOffMask 0x0000ffff00000000ull #define RDI_Location_RegOffShift 32 #define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift)) +#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0) +#define rdi_regoff_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) #define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0) #define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0) -#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0) -#define rdi_regoff_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) +#define rdi_location_voff(voff) ((((RDI_U64)RDI_LocationKind_ModuleOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((voff) & ~RDI_Location_KindMask)) +#define rdi_location_toff(toff) ((((RDI_U64)RDI_LocationKind_TLSOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((toff) & ~RDI_Location_KindMask)) +#define rdi_location_constant_data_off(off) ((((RDI_U64)RDI_LocationKind_ConstantDataOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((off) & ~RDI_Location_KindMask)) +#define rdi_location_reg(kind, reg, off) ((((RDI_U64)(kind) << RDI_Location_KindShift) & RDI_Location_KindMask) | (((RDI_U64)(reg) << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask) | (((RDI_U64)(off) << RDI_Location_RegOffShift) & RDI_Location_RegOffMask)) +#define rdi_location_bytecode(kind, off) ((((RDI_U64)(kind) << RDI_Location_KindShift) & RDI_Location_KindMask) | (((RDI_U64)(off) << RDI_Location_OffShift) & RDI_Location_OffMask)) #define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) #define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) #define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 1fb935f8..2071ad11 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -9,7 +9,7 @@ // proper flattened RDI format. // // Requires prior inclusion of the RAD Debug Info, (R)AD(D)BG(I) -// Format Library, in rdi_format.h. +// Format Library, in rdi.h. #ifndef RDI_MAKE_H #define RDI_MAKE_H @@ -921,6 +921,7 @@ struct RDIM_Symbol RDI_U64 offset; struct RDIM_Scope *container_scope; RDIM_Type *container_type; + RDIM_Namespace *container_namespace; struct RDIM_Scope *root_scope; RDIM_LocationCaseList location_cases; RDIM_String8 value_data; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 2ddcf3c1..51426887 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1230,13 +1230,18 @@ RDI_LocationSetElementMemberTable: `#define RDI_Location_RegOffMask 0x0000ffff00000000ull`; `#define RDI_Location_RegOffShift 32`; `#define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift))`; + `#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0)`; + `#define rdi_regoff_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0)`; `#define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0)`; `#define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0)`; - `#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0)`; - `#define rdi_regoff_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0)`; + `#define rdi_location_voff(voff) ((((RDI_U64)RDI_LocationKind_ModuleOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((voff) & ~RDI_Location_KindMask))`; + `#define rdi_location_toff(toff) ((((RDI_U64)RDI_LocationKind_TLSOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((toff) & ~RDI_Location_KindMask))`; + `#define rdi_location_constant_data_off(off) ((((RDI_U64)RDI_LocationKind_ConstantDataOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((off) & ~RDI_Location_KindMask))`; + `#define rdi_location_reg(kind, reg, off) ((((RDI_U64)(kind) << RDI_Location_KindShift) & RDI_Location_KindMask) | (((RDI_U64)(reg) << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask) | (((RDI_U64)(off) << RDI_Location_RegOffShift) & RDI_Location_RegOffMask))`; + `#define rdi_location_bytecode(kind, off) ((((RDI_U64)(kind) << RDI_Location_KindShift) & RDI_Location_KindMask) | (((RDI_U64)(off) << RDI_Location_OffShift) & RDI_Location_OffMask))`; } //- rjf: xlists diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 992f90e6..93e40f17 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3376,6 +3376,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { {¶ms->global_variables}, {¶ms->thread_variables}, + {¶ms->procedures}, + {¶ms->constants}, }; ////////////////////////////////////////////////////////////// @@ -3545,6 +3547,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->container_flags |= RDI_ContainerKind_Type; dst->container_idx = rdim_idx_from_udt(src->container_type->udt); } + else if(src->container_namespace != 0) + { + dst->container_flags |= RDI_ContainerKind_Namespace; + dst->container_idx = rdim_idx_from_namespace(src->container_namespace); + } // rjf: fill location set info, if applicable - get set elements to fill RDI_LocationSetElement *dst_loc_set_elements = loc_set_elements + dst_set_element_idx; From 4ea7f86d924ca8e57c6e8e0021df772112e4a0d2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 13 Mar 2026 22:50:27 -0700 Subject: [PATCH 388/850] checkpoint on new simplified location info baking. plug in constant data baking, bytecode baking --- src/lib_rdi_make/rdi_make.c | 70 +---------------------------- src/lib_rdi_make/rdi_make.h | 49 +++----------------- src/rdi_from_dwarf/rdi_from_dwarf.c | 50 +++++++++------------ src/rdi_from_dwarf/rdi_from_dwarf.h | 63 +++++++++++++------------- src/rdi_from_pdb/rdi_from_pdb.c | 55 +++++++---------------- src/rdi_from_pdb/rdi_from_pdb.h | 2 +- src/rdi_make/rdi_make_local.c | 43 +++++++++++------- 7 files changed, 103 insertions(+), 229 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 413033aa..c8645377 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -976,8 +976,6 @@ rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_ //////////////////////////////// //~ rjf: [Building] Location Info Building -//- rjf: bytecode - RDI_PROC RDIM_EvalBytecodeOp * rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) { @@ -1082,71 +1080,6 @@ rdim_is_bytecode_tls_dependent(RDIM_EvalBytecode bytecode) return result; } -//- rjf: locations - -RDI_PROC RDI_U64 -rdim_encoded_size_from_location_info(RDIM_LocationInfo *info) -{ - RDI_U64 result = 0; - switch((RDI_LocationKindEnum)info->kind) - { - case RDI_LocationKind_NULL:{}break; - - case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_ValBytecodeStream: - { - result = sizeof(RDI_LocationBytecodeStream) + info->bytecode.encoded_size + 1; - }break; - - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: - { - result = sizeof(RDI_LocationRegPlusU16); - }break; - - case RDI_LocationKind_ValReg: - { - result = sizeof(RDI_LocationReg); - }break; - } - return result; -} - -RDI_PROC RDIM_Location * -rdim_location_chunk_list_push_new(RDIM_Arena *arena, RDIM_LocationChunkList *list, RDI_U64 cap, RDIM_LocationInfo *info) -{ - RDIM_IdxedChunkListPush(arena, list, RDIM_LocationChunkNode, RDIM_Location, cap, result, n->base_encoding_off = list->total_encoded_size); - { - RDI_U64 encoded_size = rdim_encoded_size_from_location_info(info); - rdim_memcpy_struct(&result->info, info); - result->relative_encoding_off = list->last->encoded_size; - list->last->encoded_size += encoded_size; - list->total_encoded_size += encoded_size; - } - return result; -} - -RDI_PROC RDI_U64 -rdim_off_from_location(RDIM_Location *location) -{ - RDI_U64 off = 0; - if(location != 0 && location->chunk != 0) - { - off = location->chunk->base_encoding_off + location->relative_encoding_off + 1; - } - return off; -} - -RDI_PROC void -rdim_location_chunk_list_concat_in_place(RDIM_LocationChunkList *dst, RDIM_LocationChunkList *to_push) -{ - for(RDIM_LocationChunkNode *n = to_push->first; n != 0; n = n->next) - { - n->base_encoding_off += dst->total_encoded_size; - } - RDIM_IdxedChunkListConcatInPlace(RDIM_LocationChunkNode, dst, to_push, dst->total_encoded_size += to_push->total_encoded_size); -} - //////////////////////////////// //~ rjf: [Building] Scope Info Building @@ -1196,7 +1129,7 @@ rdim_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Loc RDIM_LocationCase *n = rdim_push_array(arena, RDIM_LocationCase, 1); RDIM_SLLQueuePush(list->first, list->last, n); list->count += 1; - n->location = location; + n->location = *location; n->voff_range = voff_range; scopes->location_case_count += 1; return n; @@ -1287,7 +1220,6 @@ rdim_bake_params_concat_in_place(RDIM_BakeParams *dst, RDIM_BakeParams *src) rdim_udt_chunk_list_concat_in_place(&dst->udts, &src->udts); rdim_src_file_chunk_list_concat_in_place(&dst->src_files, &src->src_files); rdim_line_table_chunk_list_concat_in_place(&dst->line_tables, &src->line_tables); - rdim_location_chunk_list_concat_in_place(&dst->locations, &src->locations); rdim_symbol_chunk_list_concat_in_place(&dst->global_variables, &src->global_variables); rdim_symbol_chunk_list_concat_in_place(&dst->thread_variables, &src->thread_variables); rdim_symbol_chunk_list_concat_in_place(&dst->constants, &src->constants); diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 2071ad11..364f9d91 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -850,52 +850,21 @@ struct RDIM_EvalBytecode //- rjf: location types -typedef struct RDIM_LocationInfo RDIM_LocationInfo; -struct RDIM_LocationInfo +typedef struct RDIM_Location RDIM_Location; +struct RDIM_Location { RDI_LocationKind kind; RDI_U8 reg_code; RDI_U64 offset; RDIM_EvalBytecode bytecode; + String8 value_data; }; -typedef struct RDIM_Location RDIM_Location; -struct RDIM_Location -{ - struct RDIM_LocationChunkNode *chunk; - RDIM_LocationInfo info; - RDI_U64 relative_encoding_off; -}; - -typedef struct RDIM_LocationChunkNode RDIM_LocationChunkNode; -struct RDIM_LocationChunkNode -{ - RDIM_LocationChunkNode *next; - RDIM_Location *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; - RDI_U64 base_encoding_off; - RDI_U64 encoded_size; -}; - -typedef struct RDIM_LocationChunkList RDIM_LocationChunkList; -struct RDIM_LocationChunkList -{ - RDIM_LocationChunkNode *first; - RDIM_LocationChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; - RDI_U64 total_encoded_size; -}; - -//- rjf: location cases - typedef struct RDIM_LocationCase RDIM_LocationCase; struct RDIM_LocationCase { RDIM_LocationCase *next; - RDIM_Location *location; + RDIM_Location location; RDIM_Rng1U64 voff_range; }; @@ -1047,7 +1016,6 @@ struct RDIM_BakeParams RDIM_UDTChunkList udts; RDIM_SrcFileChunkList src_files; RDIM_LineTableChunkList line_tables; - RDIM_LocationChunkList locations; RDIM_SymbolChunkList global_variables; RDIM_SymbolChunkList thread_variables; RDIM_SymbolChunkList constants; @@ -1707,20 +1675,13 @@ RDI_PROC void rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkLi //////////////////////////////// //~ rjf: [Building] Location Info Building -//- rjf: bytecode -RDI_PROC RDIM_EvalBytecodeOp * rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); +RDI_PROC RDIM_EvalBytecodeOp *rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); RDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x); RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x); RDI_PROC void rdim_bytecode_push_convert(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); RDI_PROC B32 rdim_is_bytecode_tls_dependent(RDIM_EvalBytecode bytecode); -//- rjf: locations -RDI_PROC RDI_U64 rdim_encoded_size_from_location_info(RDIM_LocationInfo *info); -RDI_PROC RDIM_Location *rdim_location_chunk_list_push_new(RDIM_Arena *arena, RDIM_LocationChunkList *list, RDI_U64 cap, RDIM_LocationInfo *info); -RDI_PROC RDI_U64 rdim_off_from_location(RDIM_Location *location); -RDI_PROC void rdim_location_chunk_list_concat_in_place(RDIM_LocationChunkList *dst, RDIM_LocationChunkList *to_push); - //////////////////////////////// //~ rjf: [Building] Scope Info Building diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 6ca1235e..6334078f 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1311,28 +1311,24 @@ d2r_bytecode_from_expression(Arena *arena, return bc; } -internal RDIM_Location * -d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) +internal RDIM_Location +d2r_transpile_expression(Arena *arena, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) { - RDIM_Location *loc = 0; + RDIM_Location loc = {0}; if (expr.size) { D2R_ValueType result_type = 0; RDIM_EvalBytecode bytecode = d2r_bytecode_from_expression(arena, input, image_base, arch, addr_lu, expr, cu, &result_type); - - RDIM_LocationInfo *loc_info = push_array(arena, RDIM_LocationInfo, 1); - loc_info->kind = result_type == D2R_ValueType_Address ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; - loc_info->bytecode = bytecode; - - loc = rdim_location_chunk_list_push_new(arena, locations, D2R_LOCATIONS_CAP, loc_info); + loc.kind = result_type == D2R_ValueType_Address ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; + loc.bytecode = bytecode; } return loc; } -internal RDIM_Location * -d2r_location_from_attrib(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) +internal RDIM_Location +d2r_location_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) { String8 expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, kind); - RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, arch, cu->addr_lu, cu, expr); + RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, expr); return location; } @@ -1340,7 +1336,6 @@ internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, - RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, @@ -1362,9 +1357,9 @@ d2r_locset_from_attrib(Arena *arena, // convert location list to RDIM location set for EachNode(loc_n, DW_LocNode, loclist.first) { - RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, arch, cu->addr_lu, cu, loc_n->v.expr); - RDIM_Rng1U64 voff_range = { .min = loc_n->v.range.min - image_base, .max = loc_n->v.range.max - image_base }; - rdim_push_location_case(arena, scopes, &locset, location, voff_range); + RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, loc_n->v.expr); + RDIM_Rng1U64 voff_range = { .min = loc_n->v.range.min - image_base, .max = loc_n->v.range.max - image_base }; + rdim_push_location_case(arena, scopes, &locset, &location, voff_range); } scratch_end(scratch); @@ -1373,9 +1368,9 @@ d2r_locset_from_attrib(Arena *arena, String8 expr = dw_exprloc_from_attrib(input, cu, attrib); // convert expression and inherit life-time ranges from enclosed scope - RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, arch, cu->addr_lu, cu, expr); + RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, expr); for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { - rdim_push_location_case(arena, scopes, &locset, location, range_n->v); + rdim_push_location_case(arena, scopes, &locset, &location, range_n->v); } } else if (attrib_class != DW_AttribClass_Null) { log_user_errorf("unexpected attrib class @ .debug_info+%llx", tag.info_off); @@ -1388,7 +1383,6 @@ internal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, - RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, @@ -1414,17 +1408,16 @@ d2r_var_locset_from_tag(Arena *arena, rdim_bytecode_push_uconst(arena, &bc, const_value); // fill out location - RDIM_LocationInfo *loc_info = push_array(arena, RDIM_LocationInfo, 1); - loc_info->kind = RDI_LocationKind_ValBytecodeStream; - loc_info->bytecode = bc; - RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, locations, D2R_LOCATIONS_CAP, loc_info); + RDIM_Location loc = {0}; + loc.kind = RDI_LocationKind_ValBytecodeStream; + loc.bytecode = bc; // push location cases for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { - rdim_push_location_case(arena, scopes, &locset, loc, range_n->v); + rdim_push_location_case(arena, scopes, &locset, &loc, range_n->v); } } else if (has_location) { - locset = d2r_locset_from_attrib(arena, scopes, curr_scope, locations, input, cu, image_base, arch, tag, DW_AttribKind_Location); + locset = d2r_locset_from_attrib(arena, scopes, curr_scope, input, cu, image_base, arch, tag, DW_AttribKind_Location); } return locset; @@ -2395,7 +2388,7 @@ d2r_convert_symbols(Arena *arena, proc->container_scope = 0; proc->container_type = container_type; proc->root_scope = root_scope; - proc->location_cases = d2r_locset_from_attrib(arena, &g_d2r_shared.scopes, root_scope, &g_d2r_shared.locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); + proc->location_cases = d2r_locset_from_attrib(arena, &g_d2r_shared.scopes, root_scope, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); // sub program with user-defined parent tag is a method DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); @@ -2479,7 +2472,7 @@ d2r_convert_symbols(Arena *arena, local->kind = RDI_LocalKind_Variable; local->name = name; local->type = type; - local->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, &g_d2r_shared.locations, input, cu, image_base, arch, tag); + local->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, input, cu, image_base, arch, tag); } else { // NOTE: due to a bug in clang in stb_sprintf.h local variables @@ -2540,7 +2533,7 @@ d2r_convert_symbols(Arena *arena, param->kind = RDI_LocalKind_Parameter; param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - param->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, &g_d2r_shared.locations, input, cu, image_base, arch, tag); + param->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, input, cu, image_base, arch, tag); } else { Assert(!"this is a local variable"); log_user_errorf(".debug_info+%llx out of scope formal parameter", tag.info_off); @@ -3118,7 +3111,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) bake_params.udts = g_d2r_shared.udts; bake_params.src_files = g_d2r_shared.src_files; bake_params.line_tables = g_d2r_shared.line_tables; - bake_params.locations = g_d2r_shared.locations; bake_params.global_variables = g_d2r_shared.gvars; bake_params.thread_variables = g_d2r_shared.tvars; bake_params.procedures = g_d2r_shared.procs; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index e715cc3d..8c05863e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -40,7 +40,6 @@ typedef struct D2R_Shared RDIM_TypeChunkList types; RDIM_SrcFileChunkList src_files; RDIM_LineTableChunkList line_tables; - RDIM_LocationChunkList locations; RDIM_SymbolChunkList gvars; RDIM_SymbolChunkList tvars; RDIM_SymbolChunkList procs; @@ -60,39 +59,39 @@ typedef enum } D2R_ArithmeticType; #define D2R_ValueType_Signed_XList \ - X(S8, Signed, 1 ) \ - X(S16, Signed, 2 ) \ - X(S32, Signed, 4 ) \ - X(S64, Signed, 8 ) \ - X(S128, Signed, 16) \ - X(S256, Signed, 32) \ - X(S512, Signed, 64) +X(S8, Signed, 1 ) \ +X(S16, Signed, 2 ) \ +X(S32, Signed, 4 ) \ +X(S64, Signed, 8 ) \ +X(S128, Signed, 16) \ +X(S256, Signed, 32) \ +X(S512, Signed, 64) #define D2R_ValueType_Unsigned_XList \ - X(U8, Unsigned, 1 ) \ - X(U16, Unsigned, 2 ) \ - X(U32, Unsigned, 4 ) \ - X(U64, Unsigned, 8 ) \ - X(U128, Unsigned, 16) \ - X(U256, Unsigned, 32) \ - X(U512, Unsigned, 64) +X(U8, Unsigned, 1 ) \ +X(U16, Unsigned, 2 ) \ +X(U32, Unsigned, 4 ) \ +X(U64, Unsigned, 8 ) \ +X(U128, Unsigned, 16) \ +X(U256, Unsigned, 32) \ +X(U512, Unsigned, 64) #define D2R_ValueType_Float_XList \ - X(F16, Float, 2 ) \ - X(F32, Float, 4 ) \ - X(F48, Float, 6 ) \ - X(F64, Float, 8 ) \ - X(F80, Float, 10) \ - X(F96, Float, 12) \ - X(F128, Float, 16) +X(F16, Float, 2 ) \ +X(F32, Float, 4 ) \ +X(F48, Float, 6 ) \ +X(F64, Float, 8 ) \ +X(F80, Float, 10) \ +X(F96, Float, 12) \ +X(F128, Float, 16) #define D2R_ValueType_XList \ - X(Generic, Null, 0 ) \ - X(ImplicitValue, Null, 0 ) \ - X(Address, Unsigned, 0 ) \ - D2R_ValueType_Signed_XList \ - D2R_ValueType_Unsigned_XList \ - D2R_ValueType_Float_XList +X(Generic, Null, 0 ) \ +X(ImplicitValue, Null, 0 ) \ +X(Address, Unsigned, 0 ) \ +D2R_ValueType_Signed_XList \ +D2R_ValueType_Unsigned_XList \ +D2R_ValueType_Float_XList typedef enum { @@ -214,10 +213,10 @@ internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack * //~ Expression Conversion internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); -internal RDIM_Location * d2r_transpile_expression (Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); -internal RDIM_Location * d2r_location_from_attrib (Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_locset_from_attrib (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_var_locset_from_tag (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); +internal RDIM_Location d2r_transpile_expression (Arena *arena, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); +internal RDIM_Location d2r_location_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_locset_from_attrib (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_var_locset_from_tag (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); //////////////////////////////// //~ Type Table diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 82ef4928..8d167be2 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -297,13 +297,13 @@ p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encod } }break; } - return(result); + return result; } -internal RDIM_LocationInfo -p2r_location_info_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection) +internal RDIM_Location +p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection) { - RDIM_LocationInfo result = {0}; + RDIM_Location result = {0}; if(0 <= offset && offset <= (S64)max_U16) { if(extra_indirection) @@ -3226,7 +3226,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) ////////////////////////////////////////////////////////////// //- rjf: produce symbols from all streams // - RDIM_LocationChunkList *syms_locations = 0; RDIM_SymbolChunkList *syms_procedures = 0; RDIM_SymbolChunkList *syms_global_variables = 0; RDIM_SymbolChunkList *syms_thread_variables = 0; @@ -3243,7 +3242,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // if(lane_idx() == 0) { - syms_locations = push_array(arena, RDIM_LocationChunkList, all_syms_count); syms_procedures = push_array(arena, RDIM_SymbolChunkList, all_syms_count); syms_global_variables = push_array(arena, RDIM_SymbolChunkList, all_syms_count); syms_thread_variables = push_array(arena, RDIM_SymbolChunkList, all_syms_count); @@ -3252,7 +3250,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) syms_inline_sites = push_array(arena, RDIM_InlineSiteChunkList, all_syms_count); syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); } - lane_sync_u64(&syms_locations, 0); lane_sync_u64(&syms_procedures, 0); lane_sync_u64(&syms_global_variables, 0); lane_sync_u64(&syms_thread_variables, 0); @@ -3297,7 +3294,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 sym_constants_chunk_cap = 2048; U64 sym_scopes_chunk_cap = 4096; U64 sym_inline_sites_chunk_cap = 2048; - RDIM_LocationChunkList *sym_locations = &syms_locations[sym_idx]; RDIM_SymbolChunkList *sym_procedures = &syms_procedures[sym_idx]; RDIM_SymbolChunkList *sym_global_variables = &syms_global_variables[sym_idx]; RDIM_SymbolChunkList *sym_thread_variables = &syms_thread_variables[sym_idx]; @@ -3684,10 +3680,9 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U32 byte_pos = 0; // rjf: build location - RDIM_LocationInfo loc_info = p2r_location_info_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RDIM_Location *loc2 = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_local_push_location_case(arena, sym_scopes, local, loc2, voff_range); + rdim_local_push_location_case(arena, sym_scopes, local, &loc, voff_range); } } @@ -3807,11 +3802,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); // rjf: build location - RDIM_LocationInfo loc_info = {RDI_LocationKind_ValReg, reg_code}; - RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); + RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; // rjf: emit locations over ranges - p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, loc, range, range_section, gaps, gap_count); + p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_FRAMEPOINTER_REL @@ -3854,11 +3848,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U32 byte_size = rdi_addr_size_from_arch(arch); U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel->off; - RDIM_LocationInfo location_info = p2r_location_info_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - RDIM_Location *location = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &location_info); + RDIM_Location location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); // rjf: emit locations over ranges - p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, location, range, range_section, gaps, gap_count); + p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &location, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_SUBFIELD_REGISTER @@ -3887,11 +3880,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: build location - RDIM_LocationInfo loc_info = {RDI_LocationKind_ValReg, reg_code}; - RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); + RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; // rjf: emit locations over ranges - p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, loc, range, range_section, gaps, gap_count); + p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE @@ -3928,12 +3920,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U32 byte_size = rdi_addr_size_from_arch(arch); U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel_full_scope->off; - RDIM_LocationInfo loc_info = p2r_location_info_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); // rjf: emit location over ranges RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_local_push_location_case(arena, sym_scopes, defrange_target, loc, voff_range); + rdim_local_push_location_case(arena, sym_scopes, defrange_target, &loc, voff_range); }break; //- rjf: DEFRANGE_REGISTER_REL @@ -3961,11 +3952,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U32 byte_pos = 0; B32 extra_indirection_to_value = 0; S64 var_off = defrange_register_rel->reg_off; - RDIM_LocationInfo loc_info = p2r_location_info_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); - RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info); + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); // rjf: emit locations over ranges - p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, loc, range, range_section, gaps, gap_count); + p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count); }break; //- rjf: FILESTATIC @@ -4159,7 +4149,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) ////////////////////////////////////////////////////////////// //- rjf: join all lane symbols // - RDIM_LocationChunkList all_locations = {0}; RDIM_SymbolChunkList all_procedures = {0}; RDIM_SymbolChunkList all_global_variables = {0}; RDIM_SymbolChunkList all_thread_variables = {0}; @@ -4168,7 +4157,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_InlineSiteChunkList all_inline_sites = {0}; RDIM_TypeChunkList all_types = {0}; { - RDIM_LocationChunkList *all_locations_ptr = 0; RDIM_SymbolChunkList *all_procedures_ptr = 0; RDIM_SymbolChunkList *all_global_variables_ptr = 0; RDIM_SymbolChunkList *all_thread_variables_ptr = 0; @@ -4178,7 +4166,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_TypeChunkList *all_types_ptr = 0; if(lane_idx() == 0) { - all_locations_ptr = push_array(scratch.arena, RDIM_LocationChunkList, 1); all_procedures_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); all_global_variables_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); all_thread_variables_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); @@ -4187,7 +4174,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) all_inline_sites_ptr = push_array(scratch.arena, RDIM_InlineSiteChunkList, 1); all_types_ptr = push_array(scratch.arena, RDIM_TypeChunkList, 1); } - lane_sync_u64(&all_locations_ptr, 0); lane_sync_u64(&all_procedures_ptr, 0); lane_sync_u64(&all_global_variables_ptr, 0); lane_sync_u64(&all_thread_variables_ptr, 0); @@ -4195,13 +4181,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync_u64(&all_scopes_ptr, 0); lane_sync_u64(&all_inline_sites_ptr, 0); lane_sync_u64(&all_types_ptr, 0); - if(lane_idx() == lane_from_task_idx(0)) ProfScope("join locations") - { - for EachIndex(idx, all_syms_count) - { - rdim_location_chunk_list_concat_in_place(all_locations_ptr, &syms_locations[idx]); - } - } if(lane_idx() == lane_from_task_idx(1)) ProfScope("join procedures") { for EachIndex(idx, all_syms_count) @@ -4253,7 +4232,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) *all_types_ptr = *all_types__pre_typedefs_ptr; } lane_sync(); - all_locations = *all_locations_ptr; all_procedures = *all_procedures_ptr; all_global_variables = *all_global_variables_ptr; all_thread_variables = *all_thread_variables_ptr; @@ -4312,7 +4290,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) result.udts = all_udts; result.src_files = all_src_files; result.line_tables = all_line_tables; - result.locations = all_locations; result.global_variables = all_global_variables; result.thread_variables = all_thread_variables; result.constants = all_constants; diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index 97aa831b..a2a6bd5c 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -111,7 +111,7 @@ internal RDI_ChecksumKind p2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k //~ rjf: Location Info Building Helpers internal RDI_RegCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); -internal RDIM_LocationInfo p2r_location_info_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); +internal RDIM_Location p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); internal void p2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); //////////////////////////////// diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 93e40f17..dcd372ba 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2700,6 +2700,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake location blocks // +#if 0 // TODO(rjf): @locpass RDIM_LocationBlockBakeResult *baked_location_blocks = 0; ProfScope("bake location blocks") { @@ -2762,10 +2763,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } +#endif ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage bake locations + //- rjf: @rdim_bake_stage bake locations (OLD) // +#if 0 // TODO(rjf): @locpass RDIM_LocationBakeResult *baked_locations = 0; ProfScope("bake locations") { @@ -2815,6 +2818,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } +#endif ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute layout for scope sub-lists (locals / voffs) @@ -3426,10 +3430,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { lane_chunk_set_element_counts[slot_idx] += s->location_cases.count; } - lane_chunk_constant_data_counts[slot_idx] += s->value_data.size; for EachNode(case_n, RDIM_LocationCase, s->location_cases.first) { - lane_chunk_bytecode_data_counts[slot_idx] += case_n->location->info.bytecode.encoded_size; + lane_chunk_constant_data_counts[slot_idx] += case_n->location.value_data.size; + lane_chunk_bytecode_data_counts[slot_idx] += case_n->location.bytecode.encoded_size; } } chunk_idx += 1; @@ -3586,38 +3590,45 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_Location *dst_loc = dst_loc_first; for EachNode(c, RDIM_LocationCase, src->location_cases.first) { - RDIM_Location *src_loc = c->location; - dst_loc[0] |= ((U64)src_loc->info.kind << RDI_Location_KindShift) & RDI_Location_KindMask; - switch(src_loc->info.kind) + RDIM_Location *src_loc = &c->location; + dst_loc[0] |= ((U64)src_loc->kind << RDI_Location_KindShift) & RDI_Location_KindMask; + switch(src_loc->kind) { default:{}break; case RDI_LocationKind_AddrRegPlusU16: case RDI_LocationKind_AddrAddrRegPlusU16: { - dst_loc[0] |= ((U64)src_loc->info.reg_code << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask; - dst_loc[0] |= ((U64)src_loc->info.offset << RDI_Location_RegOffShift) & RDI_Location_RegOffMask; + dst_loc[0] |= ((U64)src_loc->reg_code << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask; + dst_loc[0] |= ((U64)src_loc->offset << RDI_Location_RegOffShift) & RDI_Location_RegOffMask; }break; case RDI_LocationKind_ValReg: { - dst_loc[0] |= ((U64)src_loc->info.reg_code << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask; + dst_loc[0] |= ((U64)src_loc->reg_code << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask; }break; case RDI_LocationKind_AddrBytecodeStream: case RDI_LocationKind_ValBytecodeStream: { dst_loc[0] |= ((U64)dst_bytecode_off << RDI_Location_OffShift) & RDI_Location_OffMask; - dst_bytecode_off += src_loc->info.bytecode.encoded_size; - // TODO(rjf): serialize bytecode + for EachNode(op_node, RDIM_EvalBytecodeOp, src_loc->bytecode.first_op) + { + MemoryCopy(loc_bytecode_data + dst_bytecode_off, &op_node->op, 1); + dst_bytecode_off += 1; + MemoryCopy(loc_bytecode_data + dst_bytecode_off, &op_node->p, op_node->p_size); + dst_bytecode_off += op_node->p_size; + } + loc_bytecode_data[dst_bytecode_off] = 0; + dst_bytecode_off += 1; }break; case RDI_LocationKind_ModuleOff: case RDI_LocationKind_TLSOff: { - dst_loc[0] |= ((U64)src_loc->info.offset << RDI_Location_OffShift) & RDI_Location_OffMask; + dst_loc[0] |= ((U64)src_loc->offset << RDI_Location_OffShift) & RDI_Location_OffMask; }break; case RDI_LocationKind_ConstantDataOff: { - dst_loc[0] |= ((U64)src_loc->info.offset << RDI_Location_OffShift) & RDI_Location_OffMask; - // TODO(rjf): need to move constant data, currently called "value_data", into - // location cases, to make this case work... + dst_loc[0] |= ((U64)dst_constant_off << RDI_Location_OffShift) & RDI_Location_OffMask; + MemoryCopy(loc_constant_data + dst_constant_off, src_loc->value_data.str, src_loc->value_data.size); + dst_constant_off += src_loc->value_data.size; }break; } if(c->next != 0) @@ -3756,8 +3767,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) result.file_paths = *baked_file_paths; result.strings = *baked_strings; result.idx_runs = *baked_idx_runs; +#if 0 // TODO(rjf): @locpass result.locations = *baked_locations; result.location_blocks = *baked_location_blocks; +#endif } lane_sync(); From cff7a786b3e556ed18cfd03745f5eb15004f3e06 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 13 Mar 2026 23:06:20 -0700 Subject: [PATCH 389/850] fold voffs/toffs/constants into location case list, plug into converters --- src/lib_rdi/rdi.h | 10 ++++---- src/lib_rdi_make/rdi_make.c | 23 +++++++++--------- src/lib_rdi_make/rdi_make.h | 6 +---- src/rdi/rdi.mdesk | 2 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 4 +++- src/rdi_from_pdb/rdi_from_pdb.c | 12 +++++++--- src/rdi_make/rdi_make_local.c | 37 ++++++++++++++++++++++------- 7 files changed, 60 insertions(+), 34 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 85d2432e..a751e167 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -114,7 +114,7 @@ RDI_SectionKind_GlobalVariableSymbols = 0x0023, RDI_SectionKind_ThreadVariableSymbols = 0x0024, RDI_SectionKind_ConstantSymbols = 0x0025, RDI_SectionKind_ProcedureSymbols = 0x0026, -RDI_SectionKind_LocalSymbols = 0x0027, +RDI_SectionKind_LocalVariableSymbols = 0x0027, RDI_SectionKind_LocationsBytecodeData = 0x0028, RDI_SectionKind_LocationsConstantData = 0x0029, RDI_SectionKind_LocationsSetElements = 0x002A, @@ -579,7 +579,7 @@ X(GlobalVariableSymbols, global_variable_symbols, RDI_Symbol)\ X(ThreadVariableSymbols, thread_variable_symbols, RDI_Symbol)\ X(ConstantSymbols, constant_symbols, RDI_Symbol)\ X(ProcedureSymbols, procedure_symbols, RDI_Symbol)\ -X(LocalSymbols, local_symbols, RDI_Symbol)\ +X(LocalVariableSymbols, local_variable_symbols, RDI_Symbol)\ X(LocationsBytecodeData, locations_bytecode_data, RDI_U8)\ X(LocationsConstantData, locations_constant_data, RDI_U8)\ X(LocationsSetElements, locations_set_elements, RDI_LocationSetElement)\ @@ -1143,7 +1143,7 @@ typedef struct RDI_U32_GlobalVariableSymbols { RDI_U32 v; } RDI_U32_Global typedef struct RDI_U32_ThreadVariableSymbols { RDI_U32 v; } RDI_U32_ThreadVariableSymbols; typedef struct RDI_U32_ConstantSymbols { RDI_U32 v; } RDI_U32_ConstantSymbols; typedef struct RDI_U32_ProcedureSymbols { RDI_U32 v; } RDI_U32_ProcedureSymbols; -typedef struct RDI_U32_LocalSymbols { RDI_U32 v; } RDI_U32_LocalSymbols; +typedef struct RDI_U32_LocalVariableSymbols { RDI_U32 v; } RDI_U32_LocalVariableSymbols; typedef struct RDI_U32_LocationsBytecodeData { RDI_U32 v; } RDI_U32_LocationsBytecodeData; typedef struct RDI_U32_LocationsConstantData { RDI_U32 v; } RDI_U32_LocationsConstantData; typedef struct RDI_U32_LocationsSetElements { RDI_U32 v; } RDI_U32_LocationsSetElements; @@ -1192,7 +1192,7 @@ typedef RDI_U32_Table RDI_U32_GlobalVariableSymbols; typedef RDI_U32_Table RDI_U32_ThreadVariableSymbols; typedef RDI_U32_Table RDI_U32_ConstantSymbols; typedef RDI_U32_Table RDI_U32_ProcedureSymbols; -typedef RDI_U32_Table RDI_U32_LocalSymbols; +typedef RDI_U32_Table RDI_U32_LocalVariableSymbols; typedef RDI_U32_Table RDI_U32_LocationsBytecodeData; typedef RDI_U32_Table RDI_U32_LocationsConstantData; typedef RDI_U32_Table RDI_U32_LocationsSetElements; @@ -1638,7 +1638,7 @@ typedef RDI_Symbol RDI_SectionElementType_GlobalVariableSy typedef RDI_Symbol RDI_SectionElementType_ThreadVariableSymbols; typedef RDI_Symbol RDI_SectionElementType_ConstantSymbols; typedef RDI_Symbol RDI_SectionElementType_ProcedureSymbols; -typedef RDI_Symbol RDI_SectionElementType_LocalSymbols; +typedef RDI_Symbol RDI_SectionElementType_LocalVariableSymbols; typedef RDI_U8 RDI_SectionElementType_LocationsBytecodeData; typedef RDI_U8 RDI_SectionElementType_LocationsConstantData; typedef RDI_LocationSetElement RDI_SectionElementType_LocationsSetElements; diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index c8645377..a38d653f 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -940,14 +940,7 @@ rdim_idx_from_symbol(RDIM_Symbol *symbol) RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push) { - RDIM_IdxedChunkListConcatInPlace(RDIM_SymbolChunkNode, dst, to_push, dst->total_value_data_size += to_push->total_value_data_size); -} - -internal void -rdim_symbol_push_value_data(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDIM_Symbol *symbol, RDIM_String8 data) -{ - symbol->value_data = rdim_str8_copy(arena, data); - list->total_value_data_size += data.size; + RDIM_IdxedChunkListConcatInPlace(RDIM_SymbolChunkNode, dst, to_push); } //////////////////////////////// @@ -1080,6 +1073,16 @@ rdim_is_bytecode_tls_dependent(RDIM_EvalBytecode bytecode) return result; } +RDI_PROC void +rdim_location_case_list_push(RDIM_Arena *arena, RDIM_LocationCaseList *cases, RDIM_Location loc, RDIM_Rng1U64 range) +{ + RDIM_LocationCase *n = rdim_push_array(arena, RDIM_LocationCase, 1); + RDIM_SLLQueuePush(cases->first, cases->last, n); + cases->count += 1; + n->location = loc; + n->voff_range = range; +} + //////////////////////////////// //~ rjf: [Building] Scope Info Building @@ -1102,8 +1105,7 @@ rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkL { RDIM_IdxedChunkListConcatInPlace(RDIM_ScopeChunkNode, dst, to_push, dst->scope_voff_count += to_push->scope_voff_count, - dst->local_count += to_push->local_count, - dst->location_case_count += to_push->location_case_count); + dst->local_count += to_push->local_count); } RDI_PROC void @@ -1131,7 +1133,6 @@ rdim_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Loc list->count += 1; n->location = *location; n->voff_range = voff_range; - scopes->location_case_count += 1; return n; } diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 364f9d91..a1699916 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -887,13 +887,11 @@ struct RDIM_Symbol RDIM_String8 name; RDIM_String8 link_name; RDIM_Type *type; - RDI_U64 offset; struct RDIM_Scope *container_scope; RDIM_Type *container_type; RDIM_Namespace *container_namespace; struct RDIM_Scope *root_scope; RDIM_LocationCaseList location_cases; - RDIM_String8 value_data; }; typedef struct RDIM_SymbolChunkNode RDIM_SymbolChunkNode; @@ -913,7 +911,6 @@ struct RDIM_SymbolChunkList RDIM_SymbolChunkNode *last; RDI_U64 chunk_count; RDI_U64 total_count; - RDI_U64 total_value_data_size; }; //////////////////////////////// @@ -996,7 +993,6 @@ struct RDIM_ScopeChunkList RDI_U64 total_count; RDI_U64 scope_voff_count; RDI_U64 local_count; - RDI_U64 location_case_count; }; //////////////////////////////// @@ -1663,7 +1659,6 @@ RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChun RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap); RDI_PROC RDI_U64 rdim_idx_from_symbol(RDIM_Symbol *symbol); RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push); -internal void rdim_symbol_push_value_data(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDIM_Symbol *symbol, RDIM_String8 data); //////////////////////////////// //~ rjf: [Building] Inline Site Info Building @@ -1681,6 +1676,7 @@ RDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *by RDI_PROC void rdim_bytecode_push_convert(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); RDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed); RDI_PROC B32 rdim_is_bytecode_tls_dependent(RDIM_EvalBytecode bytecode); +RDI_PROC void rdim_location_case_list_push(RDIM_Arena *arena, RDIM_LocationCaseList *cases, RDIM_Location loc, RDIM_Rng1U64 range); //////////////////////////////// //~ rjf: [Building] Scope Info Building diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 51426887..b44f23b1 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -202,7 +202,7 @@ RDI_SectionTable: {ThreadVariableSymbols thread_variable_symbols RDI_Symbol 0x0024 U32 ""} {ConstantSymbols constant_symbols RDI_Symbol 0x0025 U32 ""} {ProcedureSymbols procedure_symbols RDI_Symbol 0x0026 U32 ""} - {LocalSymbols local_symbols RDI_Symbol 0x0027 U32 ""} + {LocalVariableSymbols local_variable_symbols RDI_Symbol 0x0027 U32 ""} //- NOTE(rjf): vvv new story for locations {LocationsBytecodeData locations_bytecode_data RDI_U8 0x0028 U32 ""} diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 6334078f..027a76ce 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2521,8 +2521,10 @@ d2r_convert_symbols(Arena *arena, var->name = name; var->link_name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName); var->type = type; - var->offset = voff; var->container_scope = 0; + RDIM_Location loc = {.kind = RDI_LocationKind_ModuleOff, .offset = voff}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &var->location_cases, loc, range); } } break; case DW_TagKind_FormalParameter: { diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 8d167be2..e0e05b05 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3468,9 +3468,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); symbol->name = name; symbol->type = type; - symbol->offset = voff; symbol->container_scope = container_scope; symbol->container_type = container_type; + RDIM_Location loc = {.kind = RDI_LocationKind_ModuleOff, .offset = voff}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &symbol->location_cases, loc, range); } }break; @@ -3722,9 +3724,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) tvar->name = name; tvar->type = type; tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); - tvar->offset = tls_off; tvar->container_type = container_type; tvar->container_scope = container_scope; + RDIM_Location loc = {.kind = RDI_LocationKind_TLSOff, .offset = tls_off}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &tvar->location_cases, loc, range); }break; //- rjf: LOCAL @@ -4132,7 +4136,9 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Symbol *cnst = rdim_symbol_chunk_list_push(arena, sym_constants, sym_constants_chunk_cap); cnst->name = name_qualified; cnst->type = type; - rdim_symbol_push_value_data(arena, sym_constants, cnst, val_data); + RDIM_Location loc = {.kind = RDI_LocationKind_ConstantDataOff, .value_data = str8_copy(arena, val_data)}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &cnst->location_cases, loc, range); } }break; } diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index dcd372ba..f6dc0adb 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -423,7 +423,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { U64 slot_idx = lane_idx()*params->global_variables.chunk_count + chunk_idx; Rng1U64 range = lane_range(n->count); - lane_chunk_range_counts[slot_idx] += dim_1u64(range); + for EachIndex(n_idx, n->count) + { + if(n->v[n_idx].location_cases.count == 1 && + n->v[n_idx].location_cases.first->location.kind == RDI_LocationKind_ModuleOff) + { + lane_chunk_range_counts[slot_idx] += 1; + } + } chunk_idx += 1; } } @@ -471,13 +478,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - RDI_U32 global_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[n_idx]); // TODO(rjf): @u64_to_u32 - RDI_U32 global_size = (RDI_U32)(n->v[n_idx].type ? n->v[n_idx].type->byte_size : 1); - RDI_U64 global_voff = n->v[n_idx].offset; - global_vmap_records[off].key.voff = global_voff; - global_vmap_records[off].key.negative_size = -global_size; - global_vmap_records[off].idx = global_idx; - off += 1; + if(n->v[n_idx].location_cases.count == 1 && + n->v[n_idx].location_cases.first->location.kind == RDI_LocationKind_ModuleOff) + { + RDI_U32 global_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[n_idx]); // TODO(rjf): @u64_to_u32 + RDI_U32 global_size = (RDI_U32)(n->v[n_idx].type ? n->v[n_idx].type->byte_size : 1); + RDI_U64 global_voff = n->v[n_idx].location_cases.first->location.offset; + global_vmap_records[off].key.voff = global_voff; + global_vmap_records[off].key.negative_size = -global_size; + global_vmap_records[off].idx = global_idx; + off += 1; + } } chunk_idx += 1; } @@ -3036,6 +3047,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute layout for constant data // +#if 0 // TODO(rjf): @locpass typedef struct ConstantLayout ConstantLayout; struct ConstantLayout { @@ -3088,10 +3100,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } lane_sync(); +#endif ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake constants // +#if 0 // TODO(rjf): @locpass RDIM_ConstantsBakeResult *baked_constants = 0; ProfScope("bake constants") { @@ -3144,6 +3158,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } lane_sync(); +#endif ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake units, symbols, types, UDTs @@ -3288,6 +3303,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } //- rjf: bake global variables +#if 0 // TODO(rjf): @locpass ProfScope("bake global variables") { for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first) @@ -3317,8 +3333,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } +#endif //- rjf: bake thread variables +#if 0 // TODO(rjf): @locpass ProfScope("bake thread variables") { for EachNode(n, RDIM_SymbolChunkNode, params->thread_variables.first) @@ -3348,6 +3366,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } +#endif //- rjf: bake inline sites ProfScope("bake inline sites") @@ -3757,7 +3776,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) result.global_variables = *baked_global_variables; result.global_vmap = *baked_global_vmap; result.thread_variables = *baked_thread_variables; +#if 0 // TODO(rjf): @locpass result.constants = *baked_constants; +#endif result.procedures = *baked_procedures; result.scopes = *baked_scopes; result.inline_sites = *baked_inline_sites; From a190051d61ad631df1d5afb7682aab657ddccf2c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 15 Mar 2026 03:21:57 -0700 Subject: [PATCH 390/850] checkpoint on new symbol serialization --- src/lib_rdi/rdi.c | 2 +- src/lib_rdi/rdi.h | 6 +- src/lib_rdi_make/rdi_make.c | 2 + src/lib_rdi_make/rdi_make.h | 167 +------------------- src/radbin/radbin.c | 2 +- src/rdi/rdi.mdesk | 3 +- src/rdi_make/rdi_make_local.c | 287 ++++++++++++++++++++++------------ 7 files changed, 205 insertions(+), 264 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index c1f2bc9a..d03f248e 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -40,7 +40,6 @@ sizeof(RDI_ThreadVariable), sizeof(RDI_Constant), sizeof(RDI_Procedure), sizeof(RDI_Local), -sizeof(RDI_VMapEntry), sizeof(RDI_Scope), sizeof(RDI_U64), sizeof(RDI_VMapEntry), @@ -48,6 +47,7 @@ sizeof(RDI_InlineSite), sizeof(RDI_LocationBlock), sizeof(RDI_U8), sizeof(RDI_Symbol), +sizeof(RDI_VMapEntry), sizeof(RDI_Symbol), sizeof(RDI_Symbol), sizeof(RDI_Symbol), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index a751e167..e41014ee 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -103,7 +103,6 @@ RDI_SectionKind_ThreadVariables = 0x0018, RDI_SectionKind_Constants = 0x0019, RDI_SectionKind_Procedures = 0x001A, RDI_SectionKind_Locals = 0x001B, -RDI_SectionKind_GlobalVMap = 0x001C, RDI_SectionKind_Scopes = 0x001D, RDI_SectionKind_ScopeVOffData = 0x001E, RDI_SectionKind_ScopeVMap = 0x001F, @@ -111,6 +110,7 @@ RDI_SectionKind_InlineSites = 0x0020, RDI_SectionKind_LocationBlocks = 0x0021, RDI_SectionKind_LocationData = 0x0022, RDI_SectionKind_GlobalVariableSymbols = 0x0023, +RDI_SectionKind_GlobalVMap = 0x001C, RDI_SectionKind_ThreadVariableSymbols = 0x0024, RDI_SectionKind_ConstantSymbols = 0x0025, RDI_SectionKind_ProcedureSymbols = 0x0026, @@ -568,7 +568,6 @@ X(ThreadVariables, thread_variables, RDI_ThreadVariable)\ X(Constants, constants, RDI_Constant)\ X(Procedures, procedures, RDI_Procedure)\ X(Locals, locals, RDI_Local)\ -X(GlobalVMap, global_vmap, RDI_VMapEntry)\ X(Scopes, scopes, RDI_Scope)\ X(ScopeVOffData, scope_voff_data, RDI_U64)\ X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ @@ -576,6 +575,7 @@ X(InlineSites, inline_sites, RDI_InlineSite)\ X(LocationBlocks, location_blocks, RDI_LocationBlock)\ X(LocationData, location_data, RDI_U8)\ X(GlobalVariableSymbols, global_variable_symbols, RDI_Symbol)\ +X(GlobalVMap, global_vmap, RDI_VMapEntry)\ X(ThreadVariableSymbols, thread_variable_symbols, RDI_Symbol)\ X(ConstantSymbols, constant_symbols, RDI_Symbol)\ X(ProcedureSymbols, procedure_symbols, RDI_Symbol)\ @@ -1627,7 +1627,6 @@ typedef RDI_ThreadVariable RDI_SectionElementType_ThreadVariables; typedef RDI_Constant RDI_SectionElementType_Constants; typedef RDI_Procedure RDI_SectionElementType_Procedures; typedef RDI_Local RDI_SectionElementType_Locals; -typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; typedef RDI_Scope RDI_SectionElementType_Scopes; typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; @@ -1635,6 +1634,7 @@ typedef RDI_InlineSite RDI_SectionElementType_InlineSites; typedef RDI_LocationBlock RDI_SectionElementType_LocationBlocks; typedef RDI_U8 RDI_SectionElementType_LocationData; typedef RDI_Symbol RDI_SectionElementType_GlobalVariableSymbols; +typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; typedef RDI_Symbol RDI_SectionElementType_ThreadVariableSymbols; typedef RDI_Symbol RDI_SectionElementType_ConstantSymbols; typedef RDI_Symbol RDI_SectionElementType_ProcedureSymbols; diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index a38d653f..d45dc36e 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -2096,6 +2096,7 @@ rdim_serialized_section_make_unpacked(void *data, RDI_U64 size) return s; } +#if 0 // TODO(rjf): @locpass RDI_PROC RDIM_SerializedSectionBundle rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results) { @@ -2145,6 +2146,7 @@ rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results) bundle.sections[RDI_SectionKind_NameMapNodes] = rdim_serialized_section_make_unpacked_array(results->name_maps.nodes, results->name_maps.nodes_count); return bundle; } +#endif RDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle) diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index a1699916..6837b788 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1279,47 +1279,6 @@ struct RDIM_LineRec //- rjf: baking results -typedef struct RDIM_TopLevelInfoBakeResult RDIM_TopLevelInfoBakeResult; -struct RDIM_TopLevelInfoBakeResult -{ - RDI_TopLevelInfo *top_level_info; -}; - -typedef struct RDIM_BinarySectionBakeResult RDIM_BinarySectionBakeResult; -struct RDIM_BinarySectionBakeResult -{ - RDI_BinarySection *binary_sections; - RDI_U64 binary_sections_count; -}; - -typedef struct RDIM_UnitBakeResult RDIM_UnitBakeResult; -struct RDIM_UnitBakeResult -{ - RDI_Unit *units; - RDI_U64 units_count; -}; - -typedef struct RDIM_UnitVMapBakeResult RDIM_UnitVMapBakeResult; -struct RDIM_UnitVMapBakeResult -{ - RDIM_BakeVMap vmap; -}; - -typedef struct RDIM_SrcFileBakeResult RDIM_SrcFileBakeResult; -struct RDIM_SrcFileBakeResult -{ - RDI_SourceFile *source_files; - RDI_U64 source_files_count; - RDI_SourceLineMap *source_line_maps; - RDI_U64 source_line_maps_count; - RDI_U32 *source_line_map_nums; - RDI_U32 *source_line_map_rngs; - RDI_U64 *source_line_map_voffs; - RDI_U64 source_line_map_nums_count; - RDI_U64 source_line_map_rngs_count; - RDI_U64 source_line_map_voffs_count; -}; - typedef struct RDIM_ChecksumBakeResult RDIM_ChecksumBakeResult; struct RDIM_ChecksumBakeResult { @@ -1333,44 +1292,6 @@ struct RDIM_ChecksumBakeResult RDI_U64 timestamps_count; }; -typedef struct RDIM_LineTableBakeResult RDIM_LineTableBakeResult; -struct RDIM_LineTableBakeResult -{ - RDI_LineTable *line_tables; - RDI_U64 line_tables_count; - RDI_U64 *line_table_voffs; - RDI_U64 line_table_voffs_count; - RDI_Line *line_table_lines; - RDI_U64 line_table_lines_count; - RDI_Column *line_table_columns; - RDI_U64 line_table_columns_count; -}; - -typedef struct RDIM_NamespaceBakeResult RDIM_NamespaceBakeResult; -struct RDIM_NamespaceBakeResult -{ - RDI_Namespace *namespaces; - RDI_U64 namespaces_count; -}; - -typedef struct RDIM_TypeNodeBakeResult RDIM_TypeNodeBakeResult; -struct RDIM_TypeNodeBakeResult -{ - RDI_TypeNode *type_nodes; - RDI_U64 type_nodes_count; -}; - -typedef struct RDIM_UDTBakeResult RDIM_UDTBakeResult; -struct RDIM_UDTBakeResult -{ - RDI_UDT *udts; - RDI_U64 udts_count; - RDI_Member *members; - RDI_U64 members_count; - RDI_EnumMember *enum_members; - RDI_U64 enum_members_count; -}; - typedef struct RDIM_LocationBakeResult RDIM_LocationBakeResult; struct RDIM_LocationBakeResult { @@ -1423,30 +1344,6 @@ struct RDIM_ProcedureBakeResult RDI_U64 procedures_count; }; -typedef struct RDIM_ScopeBakeResult RDIM_ScopeBakeResult; -struct RDIM_ScopeBakeResult -{ - RDI_Scope *scopes; - RDI_U64 scopes_count; - RDI_U64 *scope_voffs; - RDI_U64 scope_voffs_count; - RDI_Local *locals; - RDI_U64 locals_count; -}; - -typedef struct RDIM_ScopeVMapBakeResult RDIM_ScopeVMapBakeResult; -struct RDIM_ScopeVMapBakeResult -{ - RDIM_BakeVMap vmap; -}; - -typedef struct RDIM_InlineSiteBakeResult RDIM_InlineSiteBakeResult; -struct RDIM_InlineSiteBakeResult -{ - RDI_InlineSite *inline_sites; - RDI_U64 inline_sites_count; -}; - typedef struct RDIM_TopLevelNameMapBakeResult RDIM_TopLevelNameMapBakeResult; struct RDIM_TopLevelNameMapBakeResult { @@ -1463,62 +1360,6 @@ struct RDIM_NameMapBakeResult RDI_U64 nodes_count; }; -typedef struct RDIM_FilePathBakeResult RDIM_FilePathBakeResult; -struct RDIM_FilePathBakeResult -{ - RDI_FilePathNode *nodes; - RDI_U64 nodes_count; -}; - -typedef struct RDIM_StringBakeResult RDIM_StringBakeResult; -struct RDIM_StringBakeResult -{ - RDI_U32 *string_offs; - RDI_U64 string_offs_count; - RDI_U8 *string_data; - RDI_U64 string_data_size; -}; - -typedef struct RDIM_IndexRunBakeResult RDIM_IndexRunBakeResult; -struct RDIM_IndexRunBakeResult -{ - RDI_U32 *idx_runs; - RDI_U64 idx_count; -}; - -typedef struct RDIM_BakeResults RDIM_BakeResults; -struct RDIM_BakeResults -{ - RDIM_TopLevelInfoBakeResult top_level_info; - RDIM_BinarySectionBakeResult binary_sections; - RDIM_UnitBakeResult units; - RDIM_UnitVMapBakeResult unit_vmap; - RDIM_SrcFileBakeResult src_files; - RDIM_ChecksumBakeResult checksums; - RDIM_LineTableBakeResult line_tables; - RDIM_NamespaceBakeResult namespaces; - RDIM_TypeNodeBakeResult type_nodes; - RDIM_UDTBakeResult udts; - RDIM_GlobalVariableBakeResult global_variables; - RDIM_GlobalVMapBakeResult global_vmap; - RDIM_ThreadVariableBakeResult thread_variables; - RDIM_ConstantsBakeResult constants; - RDIM_ProcedureBakeResult procedures; - RDIM_ScopeBakeResult scopes; - RDIM_InlineSiteBakeResult inline_sites; - RDIM_ScopeVMapBakeResult scope_vmap; - RDIM_TopLevelNameMapBakeResult top_level_name_maps; - RDIM_NameMapBakeResult name_maps; - RDIM_FilePathBakeResult file_paths; - RDIM_StringBakeResult strings; - RDIM_IndexRunBakeResult idx_runs; - RDIM_LocationBakeResult locations; - RDIM_LocationBlockBakeResult location_blocks; -}; - -//////////////////////////////// -//~ rjf: Serialization Types - typedef struct RDIM_SerializedSection RDIM_SerializedSection; struct RDIM_SerializedSection { @@ -1534,6 +1375,12 @@ struct RDIM_SerializedSectionBundle RDIM_SerializedSection sections[RDI_SectionKind_COUNT]; }; +typedef struct RDIM_BakeResults RDIM_BakeResults; +struct RDIM_BakeResults +{ + RDIM_SerializedSectionBundle section_bundle; +}; + //////////////////////////////// //~ rjf: Basic Helpers @@ -1759,7 +1606,9 @@ RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDI_PROC RDIM_SerializedSection rdim_serialized_section_make_unpacked(void *data, RDI_U64 size); #define rdim_serialized_section_make_unpacked_struct(ptr) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))) #define rdim_serialized_section_make_unpacked_array(ptr, count) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))*(count)) +#if 0 // TODO(rjf): @locpass RDI_PROC RDIM_SerializedSectionBundle rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results); +#endif RDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle); #endif // RDI_MAKE_H diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 9918af6e..e3c1ed65 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -883,7 +883,7 @@ rb_thread_entry_point(void *p) ProfScope("serialize") if(lane_idx() == 0) { serialized_section_bundle = push_array(arena, RDIM_SerializedSectionBundle, 1); - serialized_section_bundle[0] = rdim_serialized_section_bundle_from_bake_results(&bake_results); + serialized_section_bundle[0] = bake_results.section_bundle; } lane_sync_u64(&serialized_section_bundle, 0); diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index b44f23b1..20f0ce80 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -185,7 +185,7 @@ RDI_SectionTable: {Constants constants RDI_Constant 0x0019 U32 ""} {Procedures procedures RDI_Procedure 0x001A U32 ""} {Locals locals RDI_Local 0x001B U32 ""} - {GlobalVMap global_vmap RDI_VMapEntry 0x001C - ""} + //- rjf: scope info {Scopes scopes RDI_Scope 0x001D U32 ""} @@ -199,6 +199,7 @@ RDI_SectionTable: //- NOTE(rjf): vvv new story for symbols {GlobalVariableSymbols global_variable_symbols RDI_Symbol 0x0023 U32 ""} + {GlobalVMap global_vmap RDI_VMapEntry 0x001C - ""} {ThreadVariableSymbols thread_variable_symbols RDI_Symbol 0x0024 U32 ""} {ConstantSymbols constant_symbols RDI_Symbol 0x0025 U32 ""} {ProcedureSymbols procedure_symbols RDI_Symbol 0x0026 U32 ""} diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index f6dc0adb..40f3d4be 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -284,13 +284,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake vmaps // - RDIM_ScopeVMapBakeResult *baked_scope_vmap = 0; - RDIM_UnitVMapBakeResult *baked_unit_vmap = 0; + RDIM_BakeVMap *baked_scope_vmap = 0; + RDIM_BakeVMap *baked_unit_vmap = 0; RDIM_GlobalVMapBakeResult *baked_global_vmap = 0; if(lane_idx() == 0) { - baked_scope_vmap = push_array(scratch.arena, RDIM_ScopeVMapBakeResult, 1); - baked_unit_vmap = push_array(scratch.arena, RDIM_UnitVMapBakeResult, 1); + baked_scope_vmap = push_array(scratch.arena, RDIM_BakeVMap, 1); + baked_unit_vmap = push_array(scratch.arena, RDIM_BakeVMap, 1); baked_global_vmap = push_array(scratch.arena, RDIM_GlobalVMapBakeResult, 1); } lane_sync_u64(&baked_scope_vmap, 0); @@ -598,9 +598,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } vmap_tasks[] = { - {str8_lit_comp("scopes"), scope_vmap_records, scope_vmap_records_count, &baked_scope_vmap->vmap.vmap, &baked_scope_vmap->vmap.count}, + {str8_lit_comp("scopes"), scope_vmap_records, scope_vmap_records_count, &baked_scope_vmap->vmap, &baked_scope_vmap->count}, {str8_lit_comp("globals"), global_vmap_records, global_vmap_records_count, &baked_global_vmap->vmap.vmap, &baked_global_vmap->vmap.count}, - {str8_lit_comp("units"), unit_vmap_records, unit_vmap_records_count, &baked_unit_vmap->vmap.vmap, &baked_unit_vmap->vmap.count}, + {str8_lit_comp("units"), unit_vmap_records, unit_vmap_records_count, &baked_unit_vmap->vmap, &baked_unit_vmap->count}, }; ProfScope("sort & bake all vmaps") { @@ -866,11 +866,23 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage gather all unsorted, joined, line table info; & sort // + typedef struct BakedLineTables BakedLineTables; + struct BakedLineTables + { + RDI_LineTable *line_tables; + RDI_U64 line_tables_count; + RDI_U64 *line_table_voffs; + RDI_U64 line_table_voffs_count; + RDI_Line *line_table_lines; + RDI_U64 line_table_lines_count; + RDI_Column *line_table_columns; + RDI_U64 line_table_columns_count; + }; U64 line_tables_count = 0; RDIM_LineTable **src_line_tables = 0; RDIM_UnsortedJoinedLineTable *unsorted_joined_line_tables = 0; RDIM_SortKey **sorted_line_table_keys = 0; - RDIM_LineTableBakeResult *baked_line_tables = 0; + BakedLineTables *baked_line_tables = 0; ProfScope("gather all unsorted, joined, line table info; & sort") { //- rjf: set up outputs @@ -893,7 +905,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } - baked_line_tables = push_array(scratch.arena, RDIM_LineTableBakeResult, 1); + baked_line_tables = push_array(scratch.arena, BakedLineTables, 1); baked_line_tables->line_tables_count = params->line_tables.total_count + 1; baked_line_tables->line_table_voffs_count = params->line_tables.total_line_count + 2*params->line_tables.total_seq_count; baked_line_tables->line_table_lines_count = params->line_tables.total_line_count + params->line_tables.total_seq_count; @@ -1734,13 +1746,21 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake strings // - RDIM_StringBakeResult *baked_strings = 0; + typedef struct BakedStrings BakedStrings; + struct BakedStrings + { + RDI_U32 *string_offs; + RDI_U64 string_offs_count; + RDI_U8 *string_data; + RDI_U64 string_data_size; + }; + BakedStrings *baked_strings = 0; ProfScope("bake strings") { // rjf: set up if(lane_idx() == 0) ProfScope("set up; lay out strings") { - baked_strings = push_array(scratch.arena, RDIM_StringBakeResult, 1); + baked_strings = push_array(scratch.arena, BakedStrings, 1); baked_strings->string_offs_count = bake_strings->total_count + 1; baked_strings->string_offs = rdim_push_array(arena, RDI_U32, baked_strings->string_offs_count); RDI_U64 off_cursor = 0; @@ -1786,10 +1806,16 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake idx runs // - RDIM_IndexRunBakeResult *baked_idx_runs = 0; + typedef struct BakedIdxRuns BakedIdxRuns; + struct BakedIdxRuns + { + RDI_U32 *idx_runs; + RDI_U64 idx_count; + }; + BakedIdxRuns *baked_idx_runs = 0; if(lane_idx() == 0) { - baked_idx_runs = push_array(scratch.arena, RDIM_IndexRunBakeResult, 1); + baked_idx_runs = push_array(scratch.arena, BakedIdxRuns, 1); } lane_sync_u64(&baked_idx_runs, 0); if(need_index_runs) ProfScope("bake idx runs") @@ -2262,13 +2288,27 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake src files // - RDIM_SrcFileBakeResult *baked_src_files = 0; + typedef struct BakedSrcFiles BakedSrcFiles; + struct BakedSrcFiles + { + RDI_SourceFile *source_files; + RDI_U64 source_files_count; + RDI_SourceLineMap *source_line_maps; + RDI_U64 source_line_maps_count; + RDI_U32 *source_line_map_nums; + RDI_U32 *source_line_map_rngs; + RDI_U64 *source_line_map_voffs; + RDI_U64 source_line_map_nums_count; + RDI_U64 source_line_map_rngs_count; + RDI_U64 source_line_map_voffs_count; + }; + BakedSrcFiles *baked_src_files = 0; ProfScope("bake src files") { //- rjf: set up if(lane_idx() == 0) { - baked_src_files = push_array(scratch.arena, RDIM_SrcFileBakeResult, 1); + baked_src_files = push_array(scratch.arena, BakedSrcFiles, 1); baked_src_files->source_files_count = params->src_files.total_count+1; baked_src_files->source_files = push_array(arena, RDI_SourceFile, baked_src_files->source_files_count); baked_src_files->source_line_maps_count = params->src_files.source_line_map_count+1; @@ -2424,13 +2464,19 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake namespaces // - RDIM_NamespaceBakeResult *baked_namespaces = 0; + typedef struct BakedNamespaces BakedNamespaces; + struct BakedNamespaces + { + RDI_Namespace *namespaces; + RDI_U64 namespaces_count; + }; + BakedNamespaces *baked_namespaces = 0; ProfScope("bake namespaces") { // rjf: allocate if(lane_idx() == 0) { - baked_namespaces = push_array(scratch.arena, RDIM_NamespaceBakeResult, 1); + baked_namespaces = push_array(scratch.arena, BakedNamespaces, 1); baked_namespaces->namespaces_count = params->namespaces.total_count + 1; baked_namespaces->namespaces = push_array(arena, RDI_Namespace, baked_namespaces->namespaces_count); } @@ -2532,7 +2578,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake UDTs // - RDIM_UDTBakeResult *baked_udts = 0; + typedef struct BakedUDTs BakedUDTs; + struct BakedUDTs + { + RDI_UDT *udts; + RDI_U64 udts_count; + RDI_Member *members; + RDI_U64 members_count; + RDI_EnumMember *enum_members; + RDI_U64 enum_members_count; + }; + BakedUDTs *baked_udts = 0; ProfScope("bake UDTs") { //- rjf: set up @@ -2540,7 +2596,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { if(lane_idx() == 0) { - baked_udts = push_array(scratch.arena, RDIM_UDTBakeResult, 1); + baked_udts = push_array(scratch.arena, BakedUDTs, 1); } lane_sync_u64(&baked_udts, 0); if(lane_idx() == lane_from_task_idx(0)) @@ -2902,13 +2958,23 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake scopes // - RDIM_ScopeBakeResult *baked_scopes = 0; + typedef struct BakedScopes BakedScopes; + struct BakedScopes + { + RDI_Scope *scopes; + RDI_U64 scopes_count; + RDI_U64 *scope_voffs; + RDI_U64 scope_voffs_count; + RDI_Local *locals; + RDI_U64 locals_count; + }; + BakedScopes *baked_scopes = 0; ProfScope("bake scopes") { //- rjf: setup outputs if(lane_idx() == 0) { - baked_scopes = push_array(scratch.arena, RDIM_ScopeBakeResult, 1); + baked_scopes = push_array(scratch.arena, BakedScopes, 1); } lane_sync_u64(&baked_scopes, 0); if(lane_idx() == lane_from_task_idx(0)) @@ -2993,6 +3059,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake procedures // +#if 0 // TODO(rjf): @locpass RDIM_ProcedureBakeResult *baked_procedures = 0; ProfScope("bake procedures") { @@ -3043,6 +3110,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } +#endif ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute layout for constant data @@ -3163,48 +3231,35 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake units, symbols, types, UDTs // - RDIM_UnitBakeResult *baked_units = 0; - RDIM_TypeNodeBakeResult *baked_type_nodes = 0; - RDIM_GlobalVariableBakeResult *baked_global_variables = 0; - RDIM_ThreadVariableBakeResult *baked_thread_variables = 0; - RDIM_InlineSiteBakeResult *baked_inline_sites = 0; + RDI_Unit *baked_units = 0; + U64 baked_units_count = 0; + RDI_TypeNode *baked_type_nodes = 0; + U64 baked_type_nodes_count = 0; + RDI_InlineSite *baked_inline_sites = 0; + RDI_U64 baked_inline_sites_count = 0; { //- rjf: setup outputs if(lane_idx() == lane_from_task_idx(0)) { - baked_units = push_array(scratch.arena, RDIM_UnitBakeResult, 1); - baked_units->units_count = params->units.total_count+1; - baked_units->units = push_array(arena, RDI_Unit, baked_units->units_count); + baked_units_count = params->units.total_count+1; + baked_units = push_array(arena, RDI_Unit, baked_units_count); } if(lane_idx() == lane_from_task_idx(1)) { - baked_type_nodes = push_array(scratch.arena, RDIM_TypeNodeBakeResult, 1); - baked_type_nodes->type_nodes_count = params->types.total_count+1; - baked_type_nodes->type_nodes = push_array(arena, RDI_TypeNode, baked_type_nodes->type_nodes_count); + baked_type_nodes_count = params->types.total_count+1; + baked_type_nodes = push_array(arena, RDI_TypeNode, baked_type_nodes_count); } if(lane_idx() == lane_from_task_idx(2)) { - baked_global_variables = push_array(scratch.arena, RDIM_GlobalVariableBakeResult, 1); - baked_global_variables->global_variables_count = params->global_variables.total_count+1; - baked_global_variables->global_variables = push_array(arena, RDI_GlobalVariable, baked_global_variables->global_variables_count); - } - if(lane_idx() == lane_from_task_idx(3)) - { - baked_thread_variables = push_array(scratch.arena, RDIM_ThreadVariableBakeResult, 1); - baked_thread_variables->thread_variables_count = params->thread_variables.total_count+1; - baked_thread_variables->thread_variables = push_array(arena, RDI_ThreadVariable, baked_thread_variables->thread_variables_count); - } - if(lane_idx() == lane_from_task_idx(4)) - { - baked_inline_sites = push_array(scratch.arena, RDIM_InlineSiteBakeResult, 1); - baked_inline_sites->inline_sites_count = params->inline_sites.total_count+1; - baked_inline_sites->inline_sites = push_array(arena, RDI_InlineSite, baked_inline_sites->inline_sites_count); + baked_inline_sites_count = params->inline_sites.total_count+1; + baked_inline_sites = push_array(arena, RDI_InlineSite, baked_inline_sites_count); } lane_sync_u64(&baked_units, lane_from_task_idx(0)); + lane_sync_u64(&baked_units_count, lane_from_task_idx(0)); lane_sync_u64(&baked_type_nodes, lane_from_task_idx(1)); - lane_sync_u64(&baked_global_variables, lane_from_task_idx(2)); - lane_sync_u64(&baked_thread_variables, lane_from_task_idx(3)); - lane_sync_u64(&baked_inline_sites, lane_from_task_idx(4)); + lane_sync_u64(&baked_type_nodes_count, lane_from_task_idx(1)); + lane_sync_u64(&baked_inline_sites, lane_from_task_idx(2)); + lane_sync_u64(&baked_inline_sites_count, lane_from_task_idx(2)); //- rjf: bake units ProfScope("bake units") @@ -3215,7 +3270,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, range) { RDIM_Unit *src = &n->v[n_idx]; - RDI_Unit *dst = &baked_units->units[n->base_idx + n_idx + 1]; + RDI_Unit *dst = &baked_units[n->base_idx + n_idx + 1]; dst->unit_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->unit_name); dst->compiler_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->compiler_name); dst->source_file_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->source_file); @@ -3237,7 +3292,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, range) { RDIM_Type *src = &n->v[n_idx]; - RDI_TypeNode *dst = &baked_type_nodes->type_nodes[n->base_idx + n_idx + 1]; + RDI_TypeNode *dst = &baked_type_nodes[n->base_idx + n_idx + 1]; //- rjf: fill shared type node info dst->kind = src->kind; @@ -3376,7 +3431,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - RDI_InlineSite *dst = &baked_inline_sites->inline_sites[n->base_idx + n_idx + 1]; + RDI_InlineSite *dst = &baked_inline_sites[n->base_idx + n_idx + 1]; RDIM_InlineSite *src = &n->v[n_idx]; dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 @@ -3391,16 +3446,26 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////// //- rjf: gather all lists which form symbol tables // + RDI_Symbol *baked_global_variables = 0; + U64 baked_global_variables_count = 0; + RDI_Symbol *baked_thread_variables = 0; + U64 baked_thread_variables_count = 0; + RDI_Symbol *baked_procedures = 0; + U64 baked_procedures_count = 0; + RDI_Symbol *baked_constants = 0; + U64 baked_constants_count = 0; struct { RDIM_SymbolChunkList *symbols; + RDI_Symbol **baked_symbols_out; + U64 *baked_symbols_count_out; } symbol_table_lists[] = { - {¶ms->global_variables}, - {¶ms->thread_variables}, - {¶ms->procedures}, - {¶ms->constants}, + {¶ms->global_variables, &baked_global_variables, &baked_global_variables_count}, + {¶ms->thread_variables, &baked_thread_variables, &baked_thread_variables_count}, + {¶ms->procedures, &baked_procedures, &baked_procedures_count}, + {¶ms->constants, &baked_constants, &baked_constants_count}, }; ////////////////////////////////////////////////////////////// @@ -3537,6 +3602,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst_symbols = push_array(arena, RDI_Symbol, dst_symbols_count); } lane_sync_u64(&dst_symbols, 0); + symbol_table_lists[symbol_table_list_idx].baked_symbols_out[0] = dst_symbols; + symbol_table_lists[symbol_table_list_idx].baked_symbols_count_out[0] = dst_symbols_count; for EachNode(n, RDIM_SymbolChunkNode, src_symbols->first) { U64 slot_idx = lane_idx()*chunk_count + chunk_idx; @@ -3668,14 +3735,20 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake file paths // - RDIM_FilePathBakeResult *baked_file_paths = 0; + typedef struct BakedFilePaths BakedFilePaths; + struct BakedFilePaths + { + RDI_FilePathNode *nodes; + RDI_U64 nodes_count; + }; + BakedFilePaths *baked_file_paths = 0; RDIM_BakePathNode **baked_file_path_src_nodes = 0; ProfScope("bake file paths") { // rjf: set up if(lane_idx() == 0) { - baked_file_paths = push_array(scratch.arena, RDIM_FilePathBakeResult, 1); + baked_file_paths = push_array(scratch.arena, BakedFilePaths, 1); baked_file_paths->nodes_count = path_tree->count; baked_file_paths->nodes = push_array(arena, RDI_FilePathNode, baked_file_paths->nodes_count); baked_file_path_src_nodes = push_array(arena, RDIM_BakePathNode *, baked_file_paths->nodes_count); @@ -3720,24 +3793,23 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage do small final baking tasks // - RDIM_TopLevelInfoBakeResult *baked_top_level_info = 0; - RDIM_BinarySectionBakeResult *baked_binary_sections = 0; + RDI_TopLevelInfo *baked_top_level_info = 0; + RDI_BinarySection *baked_binary_sections = 0; + U64 baked_binary_sections_count = 0; ProfScope("do small final baking tasks") { if(lane_idx() == lane_from_task_idx(0)) ProfScope("bake top level info") { - baked_top_level_info = push_array(scratch.arena, RDIM_TopLevelInfoBakeResult, 1); - baked_top_level_info->top_level_info = push_array(arena, RDI_TopLevelInfo, 1); - baked_top_level_info->top_level_info->arch = params->top_level_info.arch; - baked_top_level_info->top_level_info->exe_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.exe_name); - baked_top_level_info->top_level_info->exe_hash = params->top_level_info.exe_hash; - baked_top_level_info->top_level_info->voff_max = params->top_level_info.voff_max; - baked_top_level_info->top_level_info->guid = params->top_level_info.guid; - baked_top_level_info->top_level_info->producer_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.producer_name); + baked_top_level_info = push_array(arena, RDI_TopLevelInfo, 1); + baked_top_level_info->arch = params->top_level_info.arch; + baked_top_level_info->exe_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.exe_name); + baked_top_level_info->exe_hash = params->top_level_info.exe_hash; + baked_top_level_info->voff_max = params->top_level_info.voff_max; + baked_top_level_info->guid = params->top_level_info.guid; + baked_top_level_info->producer_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.producer_name); } if(lane_idx() == lane_from_task_idx(1)) ProfScope("bake binary sections") { - baked_binary_sections = push_array(scratch.arena, RDIM_BinarySectionBakeResult, 1); RDIM_BinarySectionList *src = ¶ms->binary_sections; RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src->count+1); U64 dst_idx = 1; @@ -3752,46 +3824,63 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->foff_first = src->foff_first; dst->foff_opl = src->foff_opl; } - baked_binary_sections->binary_sections = dst_base; - baked_binary_sections->binary_sections_count = dst_idx; + baked_binary_sections = dst_base; + baked_binary_sections_count = dst_idx; } } lane_sync_u64(&baked_top_level_info, lane_from_task_idx(0)); lane_sync_u64(&baked_binary_sections, lane_from_task_idx(1)); + lane_sync_u64(&baked_binary_sections_count, lane_from_task_idx(1)); ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage package results // RDIM_BakeResults result = {0}; { - result.top_level_info = *baked_top_level_info; - result.binary_sections = *baked_binary_sections; - result.units = *baked_units; - result.unit_vmap = *baked_unit_vmap; - result.src_files = *baked_src_files; - result.checksums = *baked_checksums; - result.line_tables = *baked_line_tables; - result.type_nodes = *baked_type_nodes; - result.udts = *baked_udts; - result.global_variables = *baked_global_variables; - result.global_vmap = *baked_global_vmap; - result.thread_variables = *baked_thread_variables; -#if 0 // TODO(rjf): @locpass - result.constants = *baked_constants; -#endif - result.procedures = *baked_procedures; - result.scopes = *baked_scopes; - result.inline_sites = *baked_inline_sites; - result.scope_vmap = *baked_scope_vmap; - result.top_level_name_maps = *baked_top_level_name_maps; - result.name_maps = *baked_name_maps; - result.file_paths = *baked_file_paths; - result.strings = *baked_strings; - result.idx_runs = *baked_idx_runs; -#if 0 // TODO(rjf): @locpass - result.locations = *baked_locations; - result.location_blocks = *baked_location_blocks; -#endif +#define Map(kind, ptr, count) result.section_bundle.sections[RDI_SectionKind_##kind] = rdim_serialized_section_make_unpacked_array((ptr), (count)) + Map(TopLevelInfo, baked_top_level_info, 1); + Map(StringData, baked_strings->string_data, baked_strings->string_data_size); + Map(StringTable, baked_strings->string_offs, baked_strings->string_offs_count); + Map(IndexRuns, baked_idx_runs->idx_runs, baked_idx_runs->idx_count); + Map(BinarySections, baked_binary_sections, baked_binary_sections_count); + Map(FilePathNodes, baked_file_paths->nodes, baked_file_paths->nodes_count); + Map(SourceFiles, baked_src_files->source_files, baked_src_files->source_files_count); + Map(LineTables, baked_line_tables->line_tables, baked_line_tables->line_tables_count); + Map(LineInfoVOffs, baked_line_tables->line_table_voffs, baked_line_tables->line_table_voffs_count); + Map(LineInfoLines, baked_line_tables->line_table_lines, baked_line_tables->line_table_lines_count); + Map(LineInfoColumns, baked_line_tables->line_table_columns, baked_line_tables->line_table_columns_count); + Map(SourceLineMaps, baked_src_files->source_line_maps, baked_src_files->source_line_maps_count); + Map(SourceLineMapNumbers, baked_src_files->source_line_map_nums, baked_src_files->source_line_map_nums_count); + Map(SourceLineMapRanges, baked_src_files->source_line_map_rngs, baked_src_files->source_line_map_rngs_count); + Map(SourceLineMapVOffs, baked_src_files->source_line_map_voffs, baked_src_files->source_line_map_voffs_count); + Map(Units, baked_units, baked_units_count); + Map(UnitVMap, baked_unit_vmap->vmap, baked_unit_vmap->count); + Map(Namespaces, baked_namespaces->namespaces, baked_namespaces->namespaces_count); + Map(TypeNodes, baked_type_nodes, baked_type_nodes_count); + Map(UDTs, baked_udts->udts, baked_udts->udts_count); + Map(Members, baked_udts->members, baked_udts->members_count); + Map(EnumMembers, baked_udts->enum_members, baked_udts->enum_members_count); + Map(Scopes, baked_scopes->scopes, baked_scopes->scopes_count); + Map(ScopeVOffData, baked_scopes->scope_voffs, baked_scopes->scope_voffs_count); + Map(ScopeVMap, baked_scope_vmap->vmap, baked_scope_vmap->count); + Map(InlineSites, baked_inline_sites, baked_inline_sites_count); + Map(GlobalVariableSymbols, baked_global_variables, baked_global_variables_count); + // Map(GlobalVMap, ); + Map(ThreadVariableSymbols, baked_thread_variables, baked_thread_variables_count); + Map(ConstantSymbols, baked_constants, baked_constants_count); + Map(ProcedureSymbols, baked_procedures, baked_procedures_count); + // Map(LocalVariableSymbols, ); + // Map(LocationsBytecodeData, ); + // Map(LocationsConstantData, ); + // Map(LocationsSetElements, ); + // Map(MD5Checksums, ); + // Map(SHA1Checksums, ); + // Map(SHA256Checksums, ); + // Map(Timestamps, ); + // Map(NameMaps, ); + // Map(NameMapBuckets, ); + // Map(NameMapNodes, ); +#undef Map } lane_sync(); From d68e19db8b43646202b1b5477d87dcdc91e57209 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 15 Mar 2026 03:33:54 -0700 Subject: [PATCH 391/850] finish almost all new baking for new symbols/location-info, just missing locals --- src/lib_rdi_make/rdi_make.h | 35 ------------- src/rdi_make/rdi_make_local.c | 92 +++++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 66 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 6837b788..fe4e196a 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1279,19 +1279,6 @@ struct RDIM_LineRec //- rjf: baking results -typedef struct RDIM_ChecksumBakeResult RDIM_ChecksumBakeResult; -struct RDIM_ChecksumBakeResult -{ - RDI_MD5 *md5s; - RDI_U64 md5s_count; - RDI_SHA1 *sha1s; - RDI_U64 sha1s_count; - RDI_SHA256 *sha256s; - RDI_U64 sha256s_count; - RDI_U64 *timestamps; - RDI_U64 timestamps_count; -}; - typedef struct RDIM_LocationBakeResult RDIM_LocationBakeResult; struct RDIM_LocationBakeResult { @@ -1313,12 +1300,6 @@ struct RDIM_GlobalVariableBakeResult RDI_U64 global_variables_count; }; -typedef struct RDIM_GlobalVMapBakeResult RDIM_GlobalVMapBakeResult; -struct RDIM_GlobalVMapBakeResult -{ - RDIM_BakeVMap vmap; -}; - typedef struct RDIM_ThreadVariableBakeResult RDIM_ThreadVariableBakeResult; struct RDIM_ThreadVariableBakeResult { @@ -1344,22 +1325,6 @@ struct RDIM_ProcedureBakeResult RDI_U64 procedures_count; }; -typedef struct RDIM_TopLevelNameMapBakeResult RDIM_TopLevelNameMapBakeResult; -struct RDIM_TopLevelNameMapBakeResult -{ - RDI_NameMap *name_maps; - RDI_U64 name_maps_count; -}; - -typedef struct RDIM_NameMapBakeResult RDIM_NameMapBakeResult; -struct RDIM_NameMapBakeResult -{ - RDI_NameMapBucket *buckets; - RDI_U64 buckets_count; - RDI_NameMapNode *nodes; - RDI_U64 nodes_count; -}; - typedef struct RDIM_SerializedSection RDIM_SerializedSection; struct RDIM_SerializedSection { diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 40f3d4be..8aa104eb 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -286,12 +286,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // RDIM_BakeVMap *baked_scope_vmap = 0; RDIM_BakeVMap *baked_unit_vmap = 0; - RDIM_GlobalVMapBakeResult *baked_global_vmap = 0; + RDIM_BakeVMap *baked_global_vmap = 0; if(lane_idx() == 0) { baked_scope_vmap = push_array(scratch.arena, RDIM_BakeVMap, 1); baked_unit_vmap = push_array(scratch.arena, RDIM_BakeVMap, 1); - baked_global_vmap = push_array(scratch.arena, RDIM_GlobalVMapBakeResult, 1); + baked_global_vmap = push_array(scratch.arena, RDIM_BakeVMap, 1); } lane_sync_u64(&baked_scope_vmap, 0); lane_sync_u64(&baked_unit_vmap, 0); @@ -599,7 +599,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) vmap_tasks[] = { {str8_lit_comp("scopes"), scope_vmap_records, scope_vmap_records_count, &baked_scope_vmap->vmap, &baked_scope_vmap->count}, - {str8_lit_comp("globals"), global_vmap_records, global_vmap_records_count, &baked_global_vmap->vmap.vmap, &baked_global_vmap->vmap.count}, + {str8_lit_comp("globals"), global_vmap_records, global_vmap_records_count, &baked_global_vmap->vmap, &baked_global_vmap->count}, {str8_lit_comp("units"), unit_vmap_records, unit_vmap_records_count, &baked_unit_vmap->vmap, &baked_unit_vmap->count}, }; ProfScope("sort & bake all vmaps") @@ -1851,8 +1851,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake name maps // - RDIM_TopLevelNameMapBakeResult *baked_top_level_name_maps = 0; - RDIM_NameMapBakeResult *baked_name_maps = 0; + typedef struct BakedNameMaps BakedNameMaps; + struct BakedNameMaps + { + RDI_NameMap *name_maps; + RDI_U64 name_maps_count; + RDI_NameMapBucket *buckets; + RDI_U64 buckets_count; + RDI_NameMapNode *nodes; + RDI_U64 nodes_count; + }; + BakedNameMaps *baked_name_maps = 0; ProfScope("bake name maps") { // rjf: count unique names in all name maps; lay out baked nodes @@ -1925,27 +1934,25 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: setup ProfScope("setup") if(lane_idx() == 0) { - baked_top_level_name_maps = push_array(scratch.arena, RDIM_TopLevelNameMapBakeResult, 1); - baked_top_level_name_maps->name_maps_count = RDI_NameMapKind_COUNT; - baked_top_level_name_maps->name_maps = push_array(arena, RDI_NameMap, baked_top_level_name_maps->name_maps_count); - baked_name_maps = push_array(scratch.arena, RDIM_NameMapBakeResult, 1); + baked_name_maps = push_array(scratch.arena, BakedNameMaps, 1); + baked_name_maps->name_maps_count = RDI_NameMapKind_COUNT; + baked_name_maps->name_maps = push_array(arena, RDI_NameMap, baked_name_maps->name_maps_count); RDI_U32 bucket_off = 0; RDI_U32 node_off = 0; for EachNonZeroEnumVal(RDI_NameMapKind, k) { - baked_top_level_name_maps->name_maps[k].bucket_base_idx = bucket_off; - baked_top_level_name_maps->name_maps[k].node_base_idx = node_off; - baked_top_level_name_maps->name_maps[k].bucket_count = (RDI_U32)bake_name_maps_tops[k].slots_count; // TODO(rjf): @u64_to_u32 - baked_top_level_name_maps->name_maps[k].node_count = (RDI_U32)name_map_node_counts[k]; // TODO(rjf): @u64_to_u32 - bucket_off += baked_top_level_name_maps->name_maps[k].bucket_count; - node_off += baked_top_level_name_maps->name_maps[k].node_count; + baked_name_maps->name_maps[k].bucket_base_idx = bucket_off; + baked_name_maps->name_maps[k].node_base_idx = node_off; + baked_name_maps->name_maps[k].bucket_count = (RDI_U32)bake_name_maps_tops[k].slots_count; // TODO(rjf): @u64_to_u32 + baked_name_maps->name_maps[k].node_count = (RDI_U32)name_map_node_counts[k]; // TODO(rjf): @u64_to_u32 + bucket_off += baked_name_maps->name_maps[k].bucket_count; + node_off += baked_name_maps->name_maps[k].node_count; } baked_name_maps->buckets_count = bucket_off; baked_name_maps->buckets = push_array(arena, RDI_NameMapBucket, baked_name_maps->buckets_count); baked_name_maps->nodes_count = total_name_map_node_count; baked_name_maps->nodes = push_array(arena, RDI_NameMapNode, baked_name_maps->nodes_count); } - lane_sync_u64(&baked_top_level_name_maps, 0); lane_sync_u64(&baked_name_maps, 0); // rjf: wide fill baked name maps @@ -1958,7 +1965,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_BakeNameMapTopology *top = &bake_name_maps_tops[k]; U64 slots_count = top->slots_count; RDIM_BakeNameMap *src_map = bake_name_maps[k]; - RDI_NameMap *dst_map = &baked_top_level_name_maps->name_maps[k]; + RDI_NameMap *dst_map = &baked_name_maps->name_maps[k]; RDI_NameMapBucket *dst_buckets = baked_name_maps->buckets + dst_map->bucket_base_idx; RDI_NameMapNode *dst_nodes = baked_name_maps->nodes + dst_map->node_base_idx; Rng1U64 slot_range = lane_range(slots_count); @@ -2404,13 +2411,25 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake checksums // - RDIM_ChecksumBakeResult *baked_checksums = 0; + typedef struct BakedChecksums BakedChecksums; + struct BakedChecksums + { + RDI_MD5 *md5s; + RDI_U64 md5s_count; + RDI_SHA1 *sha1s; + RDI_U64 sha1s_count; + RDI_SHA256 *sha256s; + RDI_U64 sha256s_count; + RDI_U64 *timestamps; + RDI_U64 timestamps_count; + }; + BakedChecksums *baked_checksums = 0; ProfScope("bake checksums") { // rjf: allocate if(lane_idx() == 0) { - baked_checksums = push_array(scratch.arena, RDIM_ChecksumBakeResult, 1); + baked_checksums = push_array(scratch.arena, BakedChecksums, 1); baked_checksums->md5s_count = src_map_layout->total_checksum_counts[RDI_ChecksumKind_MD5] + 1; baked_checksums->sha1s_count = src_map_layout->total_checksum_counts[RDI_ChecksumKind_SHA1] + 1; baked_checksums->sha256s_count = src_map_layout->total_checksum_counts[RDI_ChecksumKind_SHA256] + 1; @@ -3111,7 +3130,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } #endif - ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute layout for constant data // @@ -3471,6 +3489,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake symbols (NEW) // + RDI_U8 *baked_location_bytecode_data = 0; + RDI_U8 *baked_location_constant_data = 0; + RDI_LocationSetElement *baked_location_set_elements = 0; + U64 baked_location_bytecode_data_size = 0; + U64 baked_location_constant_data_size = 0; + U64 baked_location_set_elements_count = 0; ProfScope("bake symbols") { //////////////////////////// @@ -3584,6 +3608,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) lane_sync_u64(&loc_bytecode_data, 0); lane_sync_u64(&loc_constant_data, 0); lane_sync_u64(&loc_set_elements, 0); + baked_location_bytecode_data = loc_bytecode_data; + baked_location_bytecode_data_size = total_bytecode_data_count; + baked_location_constant_data = loc_constant_data; + baked_location_constant_data_size = total_constant_data_count; + baked_location_set_elements = loc_set_elements; + baked_location_set_elements_count = total_set_element_count; //////////////////////////// //- rjf: bake flat symbol tables @@ -3865,21 +3895,21 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Map(ScopeVMap, baked_scope_vmap->vmap, baked_scope_vmap->count); Map(InlineSites, baked_inline_sites, baked_inline_sites_count); Map(GlobalVariableSymbols, baked_global_variables, baked_global_variables_count); - // Map(GlobalVMap, ); + Map(GlobalVMap, baked_global_vmap->vmap, baked_global_vmap->count); Map(ThreadVariableSymbols, baked_thread_variables, baked_thread_variables_count); Map(ConstantSymbols, baked_constants, baked_constants_count); Map(ProcedureSymbols, baked_procedures, baked_procedures_count); // Map(LocalVariableSymbols, ); - // Map(LocationsBytecodeData, ); - // Map(LocationsConstantData, ); - // Map(LocationsSetElements, ); - // Map(MD5Checksums, ); - // Map(SHA1Checksums, ); - // Map(SHA256Checksums, ); - // Map(Timestamps, ); - // Map(NameMaps, ); - // Map(NameMapBuckets, ); - // Map(NameMapNodes, ); + Map(LocationsBytecodeData, baked_location_bytecode_data, baked_location_bytecode_data_size); + Map(LocationsConstantData, baked_location_constant_data, baked_location_constant_data_size); + Map(LocationsSetElements, baked_location_set_elements, baked_location_set_elements_count); + Map(MD5Checksums, baked_checksums->md5s, baked_checksums->md5s_count); + Map(SHA1Checksums, baked_checksums->sha1s, baked_checksums->sha1s_count); + Map(SHA256Checksums, baked_checksums->sha256s, baked_checksums->sha256s_count); + Map(Timestamps, baked_checksums->timestamps, baked_checksums->timestamps_count); + Map(NameMaps, baked_name_maps->name_maps, baked_name_maps->name_maps_count); + Map(NameMapBuckets, baked_name_maps->buckets, baked_name_maps->buckets_count); + Map(NameMapNodes, baked_name_maps->nodes, baked_name_maps->nodes_count); #undef Map } lane_sync(); From abb01999369cad13890dd1bc100500bc4a20f03a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 18 Mar 2026 13:28:17 -0700 Subject: [PATCH 392/850] checkpoint on new local baking --- src/lib_rdi_make/rdi_make.c | 2 + src/lib_rdi_make/rdi_make.h | 7 +++ src/rdi_from_pdb/rdi_from_pdb.c | 96 +++++++++++++++++++++++++++------ src/rdi_from_pdb/rdi_from_pdb.h | 1 + src/rdi_make/rdi_make_local.c | 43 +++++++++------ 5 files changed, 117 insertions(+), 32 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index d45dc36e..ba585674 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1115,6 +1115,7 @@ rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Sc list->scope_voff_count += 2; } +#if 0 // TODO(rjf): @locpass RDI_PROC RDIM_Local * rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope) { @@ -1141,6 +1142,7 @@ rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RD { return rdim_push_location_case(arena, scopes, &local->location_cases, location, voff_range); } +#endif //////////////////////////////// //~ rjf: [Building] Bake Parameter Joining diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index fe4e196a..01914b08 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -884,6 +884,7 @@ struct RDIM_Symbol { struct RDIM_SymbolChunkNode *chunk; RDI_S32 is_extern; + RDI_S32 is_param; RDIM_String8 name; RDIM_String8 link_name; RDIM_Type *type; @@ -968,10 +969,13 @@ struct RDIM_Scope RDIM_Scope *last_child; RDIM_Scope *next_sibling; RDIM_Rng1U64List voff_ranges; +#if 0 // TODO(rjf): @locpass RDIM_Local *first_local; RDIM_Local *last_local; RDI_U32 local_count; +#endif RDIM_InlineSite *inline_site; + RDIM_SymbolChunkList locals; }; typedef struct RDIM_ScopeChunkNode RDIM_ScopeChunkNode; @@ -1497,8 +1501,11 @@ RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChu RDI_PROC RDI_U64 rdim_idx_from_scope(RDIM_Scope *scope); RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push); RDI_PROC void rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range); +#if 0 // TODO(rjf): @locpass RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope); +RDI_PROC RDIM_LocationCase *rdim_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationCaseList *list, RDIM_Location *location, RDIM_Rng1U64 voff_range); RDI_PROC RDIM_LocationCase *rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *location, RDIM_Rng1U64 voff_range); +#endif //////////////////////////////// //~ rjf: [Building] Bake Parameter Joining diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index e0e05b05..45c50949 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -372,6 +372,41 @@ p2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunk } } +internal void +p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) +{ + //- rjf: extract range info + U64 voff_first = 0; + U64 voff_opl = 0; + if(section != 0) + { + voff_first = section->voff + range->off; + voff_opl = voff_first + range->len; + } + + //- rjf: emit location for ranges not coverd by gaps + CV_LvarAddrGap *gap_ptr = gaps; + U64 voff_cursor = voff_first; + for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) + { + U64 voff_gap_first = voff_first + gap_ptr->off; + U64 voff_gap_opl = voff_gap_first + gap_ptr->len; + if(voff_cursor < voff_gap_first) + { + RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first}; + rdim_location_case_list_push(arena, loc_cases, loc, voff_range); + } + voff_cursor = voff_gap_opl; + } + + //- rjf: emit remaining range + if(voff_cursor < voff_opl) + { + RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl}; + rdim_location_case_list_push(arena, loc_cases, loc, voff_range); + } +} + //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point @@ -3344,8 +3379,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") { - RDIM_Local *defrange_target = 0; - B32 defrange_target_is_param = 0; + RDIM_Symbol *defrange_target = 0; U64 procedure_num = 0; U64 procedure_base_voff = 0; CV_ProcFlags proc_flags = 0; @@ -3376,7 +3410,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) SLLStackPush(free_scope_node, n); } defrange_target = 0; - defrange_target_is_param = 0; }break; //- rjf: BLOCK32 @@ -3623,7 +3656,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U32 var_off = regrel32->reg_off; // rjf: determine if this is a parameter - RDI_LocalKind local_kind = regrel_idx < curr_proc_symbol->type->count ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable; + B32 is_param = (regrel_idx < curr_proc_symbol->type->count); + RDI_LocalKind local_kind = is_param ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable; // rjf: determine if we need an extra indirection to the value B32 extra_indirection_to_value = 0; @@ -3666,6 +3700,30 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } } + // rjf: build local + { + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + local->is_param = is_param; + local->name = name; + local->type = type; + + // rjf: equip location info + { + // rjf: get raddbg register code + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + // TODO(rjf): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // rjf: build location + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_case_list_push(arena, &local->location_cases, loc, voff_range); + } + } + +#if 0 // TODO(rjf): @locpass // rjf: build local RDIM_Scope *scope = top_scope_node->scope; RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope); @@ -3686,6 +3744,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Rng1U64 voff_range = {0, max_U64}; rdim_local_push_location_case(arena, sym_scopes, local, &loc, voff_range); } +#endif } regrel_idx += 1; @@ -3760,7 +3819,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { // TODO(rjf): add global modification symbols defrange_target = 0; - defrange_target_is_param = 0; } // rjf: is not a global modification -> emit a local variable @@ -3773,16 +3831,26 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) local_kind = RDI_LocalKind_Parameter; } + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + { + local->is_param = !!(slocal->flags & CV_LocalFlag_Param); + local->name = name; + local->type = type; + } + +#if 0 // TODO(rjf): @locpass // rjf: build local RDIM_Scope *scope = top_scope_node->scope; RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope); local->kind = local_kind; local->name = name; local->type = type; +#endif // rjf: save defrange target, for subsequent defrange symbols defrange_target = local; - defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter); } }break; @@ -3809,7 +3877,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; // rjf: emit locations over ranges - p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count); + p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_FRAMEPOINTER_REL @@ -3844,7 +3912,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); // rjf: select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target_is_param); + CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); // rjf: build location @@ -3855,7 +3923,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Location location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); // rjf: emit locations over ranges - p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &location, range, range_section, gaps, gap_count); + p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, location, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_SUBFIELD_REGISTER @@ -3887,7 +3955,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; // rjf: emit locations over ranges - p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count); + p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); }break; //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE @@ -3916,7 +3984,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: unpack sym CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)iter.struct_base; - CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target_is_param); + CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); // rjf: build location @@ -3928,7 +3996,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: emit location over ranges RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_local_push_location_case(arena, sym_scopes, defrange_target, &loc, voff_range); + rdim_location_case_list_push(arena, &defrange_target->location_cases, loc, voff_range); }break; //- rjf: DEFRANGE_REGISTER_REL @@ -3959,7 +4027,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); // rjf: emit locations over ranges - p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, &loc, range, range_section, gaps, gap_count); + p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); }break; //- rjf: FILESTATIC @@ -3970,7 +4038,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); // TODO(rjf): emit a global modifier symbol defrange_target = 0; - defrange_target_is_param = 0; }break; //- rjf: INLINESITE @@ -4103,7 +4170,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) SLLStackPush(free_scope_node, n); } defrange_target = 0; - defrange_target_is_param = 0; }break; //- rjf: CONSTANT diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index a2a6bd5c..bbb61055 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -113,6 +113,7 @@ internal RDI_ChecksumKind p2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k internal RDI_RegCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); internal RDIM_Location p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); internal void p2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); +internal void p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 8aa104eb..035a5b5b 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1236,9 +1236,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - for EachNode(local, RDIM_Local, n->v[n_idx].first_local) + for EachNode(local_n, RDIM_SymbolChunkNode, n->v[n_idx].locals.first) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, local->name); + for EachIndex(local_n_idx, local_n->count) + { + rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, local_n->v[local_n_idx].name); + } } } } @@ -2701,6 +2704,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute lane location block layout // +#if 0 // TODO(rjf): @locpass typedef struct LocLayout LocLayout; struct LocLayout { @@ -2782,6 +2786,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } lane_sync(); +#endif ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake location blocks @@ -2941,7 +2946,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - num_locals_in_this_lane_and_node += n->v[n_idx].local_count; + num_locals_in_this_lane_and_node += n->v[n_idx].locals.total_count; num_voffs_in_this_lane_and_node += n->v[n_idx].voff_ranges.count*2; } scope_layout->scope_local_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_locals_in_this_lane_and_node; @@ -2984,7 +2989,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_U64 scopes_count; RDI_U64 *scope_voffs; RDI_U64 scope_voffs_count; - RDI_Local *locals; + RDI_Symbol *locals; RDI_U64 locals_count; }; BakedScopes *baked_scopes = 0; @@ -3009,7 +3014,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == lane_from_task_idx(2)) { baked_scopes->locals_count = params->scopes.local_count+1; - baked_scopes->locals = push_array(arena, RDI_Local, baked_scopes->locals_count); + baked_scopes->locals = push_array(arena, RDI_Symbol, baked_scopes->locals_count); } lane_sync(); @@ -3022,8 +3027,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 scope_chunk_lane_slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx; U64 chunk_local_off = scope_layout->scope_local_chunk_lane_offs[scope_chunk_lane_slot_idx]; U64 chunk_voff_off = scope_layout->scope_voff_chunk_lane_offs[scope_chunk_lane_slot_idx]; - U64 location_block_chunk_lane_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; - U64 chunk_location_block_off = loc_layout->location_case_chunk_lane_offs[location_block_chunk_lane_slot_idx]; for EachInRange(n_idx, range) { U64 dst_idx = 1 + n->base_idx + n_idx; @@ -3042,19 +3045,25 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: fill locals U64 local_idx_first = chunk_local_off; - for EachNode(src_local, RDIM_Local, src_scope->first_local) + for EachNode(src_local_n, RDIM_SymbolChunkNode, src_scope->locals.first) { - RDI_Local *dst_local = &baked_scopes->locals[chunk_local_off]; - dst_local->kind = src_local->kind; - dst_local->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_local->name); - dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 - if(src_local->location_cases.count != 0) + for EachIndex(src_local_idx, src_local_n->count) { - dst_local->location_first = chunk_location_block_off; - dst_local->location_opl = chunk_location_block_off + src_local->location_cases.count; - chunk_location_block_off += src_local->location_cases.count; + RDIM_Symbol *src_local = &src_local_n->v[src_local_idx]; + RDI_Symbol *dst_local = &baked_scopes->locals[chunk_local_off]; +#if 0 + dst_local->kind = src_local->kind; + dst_local->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_local->name); + dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 + if(src_local->location_cases.count != 0) + { + dst_local->location_first = chunk_location_block_off; + dst_local->location_opl = chunk_location_block_off + src_local->location_cases.count; + chunk_location_block_off += src_local->location_cases.count; + } +#endif + chunk_local_off += 1; } - chunk_local_off += 1; } U64 local_idx_opl = chunk_local_off; From a1978d9fe91adb0219335dd61af680da1e9f5408 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 18 Mar 2026 16:46:18 -0700 Subject: [PATCH 393/850] sketch out more locals baking stuff, + notes for unit-arrangement pass --- src/lib_rdi/rdi.h | 7 ++++--- src/raddbg/raddbg_main.c | 22 +++++++++++++--------- src/rdi/rdi.mdesk | 7 ++++--- src/rdi_from_dwarf/rdi_from_dwarf.c | 21 ++++++++++----------- src/rdi_make/rdi_make_local.c | 25 +++++++++++-------------- 5 files changed, 42 insertions(+), 40 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index e41014ee..63dc2a67 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -387,9 +387,10 @@ RDI_MemberKind_NestedType = 0x0300, typedef RDI_U8 RDI_ContainerKind; typedef enum RDI_ContainerKindEnum { -RDI_ContainerKind_Type = 0x0, -RDI_ContainerKind_Scope = 0x1, -RDI_ContainerKind_Namespace = 0x2, +RDI_ContainerKind_Unit = 0x0, +RDI_ContainerKind_Type = 0x1, +RDI_ContainerKind_Scope = 0x2, +RDI_ContainerKind_Namespace = 0x3, } RDI_ContainerKindEnum; typedef RDI_U8 RDI_ContainerFlags; diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 5e2daede..8da853c1 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -25,15 +25,19 @@ // [ ] single-line viz for pointers w/ bad (unmapped) addresses // //- namespace/locations/variables RDI pass -// [ ] RDI_Local, RDI_GlobalVariable, RDI_ThreadVariable -> RDI_Variable -// [ ] RDI_Variable gets RDI_ContainerFlags, and a container_idx -// [ ] RDI_Namespace can be a container, same as types/procedures -// [ ] If procedure-contained, then index goes to scope now, not procedure -// [ ] Location sections -> split by location kind, fixed tables for simple locations, one catch-all table for bytecode. -// [ ] Location kind -> can be thread-local offset, or module virtual offset, to enclose globals/tlocals cases -// [ ] Referring to one location -> kind * index -// [ ] Referring to many locations, based on scope offsets -> kind = BlockList; BlockList encodes a first/opl pair into Block table, each Block has scope_off_first/opl, location_kind, location_idx - but a block's location kind CANNOT BE BlockList -// [ ] RDI_Variable has location_kind, location_idx +// [x] RDI_Local, RDI_GlobalVariable, RDI_ThreadVariable -> RDI_Variable +// [x] RDI_Variable gets RDI_ContainerFlags, and a container_idx +// [x] RDI_Namespace can be a container, same as types/procedures +// [x] If procedure-contained, then index goes to scope now, not procedure +// [x] Location sections -> split by location kind, fixed tables for simple locations, one catch-all table for bytecode. +// [x] Location kind -> can be thread-local offset, or module virtual offset, to enclose globals/tlocals cases +// [x] Referring to one location -> kind * index +// [x] Referring to many locations, based on scope offsets -> kind = BlockList; BlockList encodes a first/opl pair into Block table, each Block has scope_off_first/opl, location_kind, location_idx - but a block's location kind CANNOT BE BlockList +// [x] RDI_Variable has location_kind, location_idx +// +// [ ] we keep flat tables of symbols, *but*, "sort" by containing unit. unit -> [f, opl) of procedures, globals, threadvars, constants, etc. +// [ ] container can also be a unit, so you can also go from procedure/global/tvar -> unit +// // [ ] symbols only store their *partly-qualified name*, e.g. `x` for A::B::C::x // [ ] default name maps look up *partly-qualified names* // [ ] to match a *fully qualified name*, there needs to be a second kind of different lookup - instead of string-matching, we need to match against the *fully qualified names*. the maps must be built by hashing the *fully qualified name*, but redirecting to the symbol with the *partially qualified name*. this is to allow fully-qualified lookups, but avoid storing fully-qualified names. diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 20f0ce80..907fec25 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -992,9 +992,10 @@ RDI_EnumMemberTable: @table(name value) RDI_ContainerKindTable: { - {Type 0x0} - {Scope 0x1} - {Namespace 0x2} + {Unit 0x0} + {Type 0x1} + {Scope 0x2} + {Namespace 0x3} } @table(name value) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 027a76ce..043ae534 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1359,7 +1359,7 @@ d2r_locset_from_attrib(Arena *arena, for EachNode(loc_n, DW_LocNode, loclist.first) { RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, loc_n->v.expr); RDIM_Rng1U64 voff_range = { .min = loc_n->v.range.min - image_base, .max = loc_n->v.range.max - image_base }; - rdim_push_location_case(arena, scopes, &locset, &location, voff_range); + rdim_location_case_list_push(arena, &locset, location, voff_range); } scratch_end(scratch); @@ -1370,7 +1370,7 @@ d2r_locset_from_attrib(Arena *arena, // convert expression and inherit life-time ranges from enclosed scope RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, expr); for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { - rdim_push_location_case(arena, scopes, &locset, &location, range_n->v); + rdim_location_case_list_push(arena, &locset, location, range_n->v); } } else if (attrib_class != DW_AttribClass_Null) { log_user_errorf("unexpected attrib class @ .debug_info+%llx", tag.info_off); @@ -1414,7 +1414,7 @@ d2r_var_locset_from_tag(Arena *arena, // push location cases for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { - rdim_push_location_case(arena, scopes, &locset, &loc, range_n->v); + rdim_location_case_list_push(arena, &locset, loc, range_n->v); } } else if (has_location) { locset = d2r_locset_from_attrib(arena, scopes, curr_scope, input, cu, image_base, arch, tag, DW_AttribKind_Location); @@ -2468,10 +2468,9 @@ d2r_convert_symbols(Arena *arena, parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_LexicalBlock) { RDIM_Scope *scope = it->stack->next->scope; - RDIM_Local *local = rdim_scope_push_local(arena, &g_d2r_shared.scopes, scope); - local->kind = RDI_LocalKind_Variable; - local->name = name; - local->type = type; + RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + local->name = name; + local->type = type; local->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, input, cu, image_base, arch, tag); } else { @@ -2531,10 +2530,10 @@ d2r_convert_symbols(Arena *arena, DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) { RDIM_Scope *scope = it->stack->next->scope; - RDIM_Local *param = rdim_scope_push_local(arena, &g_d2r_shared.scopes, scope); - param->kind = RDI_LocalKind_Parameter; - param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); + RDIM_Symbol *param = rdim_symbol_chunk_list_push(arena, &scope->locals, 4); + param->is_param = 1; + param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); param->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, input, cu, image_base, arch, tag); } else { Assert(!"this is a local variable"); diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 035a5b5b..eb955b23 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2980,7 +2980,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) lane_sync(); ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage bake scopes + //- rjf: @rdim_bake_stage bake scopes, gather locals // typedef struct BakedScopes BakedScopes; struct BakedScopes @@ -2989,8 +2989,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_U64 scopes_count; RDI_U64 *scope_voffs; RDI_U64 scope_voffs_count; - RDI_Symbol *locals; - RDI_U64 locals_count; + RDIM_SymbolChunkList arranged_locals; }; BakedScopes *baked_scopes = 0; ProfScope("bake scopes") @@ -3011,11 +3010,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) baked_scopes->scope_voffs_count = params->scopes.scope_voff_count+1; baked_scopes->scope_voffs = push_array(arena, RDI_U64, baked_scopes->scope_voffs_count); } - if(lane_idx() == lane_from_task_idx(2)) - { - baked_scopes->locals_count = params->scopes.local_count+1; - baked_scopes->locals = push_array(arena, RDI_Symbol, baked_scopes->locals_count); - } lane_sync(); //- rjf: wide fill @@ -3050,8 +3044,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(src_local_idx, src_local_n->count) { RDIM_Symbol *src_local = &src_local_n->v[src_local_idx]; - RDI_Symbol *dst_local = &baked_scopes->locals[chunk_local_off]; #if 0 + RDI_Symbol *dst_local = &baked_scopes->locals[chunk_local_off]; dst_local->kind = src_local->kind; dst_local->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_local->name); dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 @@ -3481,6 +3475,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 baked_procedures_count = 0; RDI_Symbol *baked_constants = 0; U64 baked_constants_count = 0; + RDI_Symbol *baked_locals = 0; + U64 baked_locals_count = 0; struct { RDIM_SymbolChunkList *symbols; @@ -3489,10 +3485,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } symbol_table_lists[] = { - {¶ms->global_variables, &baked_global_variables, &baked_global_variables_count}, - {¶ms->thread_variables, &baked_thread_variables, &baked_thread_variables_count}, - {¶ms->procedures, &baked_procedures, &baked_procedures_count}, - {¶ms->constants, &baked_constants, &baked_constants_count}, + {¶ms->global_variables, &baked_global_variables, &baked_global_variables_count}, + {¶ms->thread_variables, &baked_thread_variables, &baked_thread_variables_count}, + {¶ms->procedures, &baked_procedures, &baked_procedures_count}, + {¶ms->constants, &baked_constants, &baked_constants_count}, + {&baked_scopes->arranged_locals, &baked_locals, &baked_locals_count}, }; ////////////////////////////////////////////////////////////// @@ -3908,7 +3905,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Map(ThreadVariableSymbols, baked_thread_variables, baked_thread_variables_count); Map(ConstantSymbols, baked_constants, baked_constants_count); Map(ProcedureSymbols, baked_procedures, baked_procedures_count); - // Map(LocalVariableSymbols, ); + Map(LocalVariableSymbols, baked_locals, baked_locals_count); Map(LocationsBytecodeData, baked_location_bytecode_data, baked_location_bytecode_data_size); Map(LocationsConstantData, baked_location_constant_data, baked_location_constant_data_size); Map(LocationsSetElements, baked_location_set_elements, baked_location_set_elements_count); From b7644a1d34d3e0c3fa49acd7f1cbfcad039109d6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 18 Mar 2026 16:56:20 -0700 Subject: [PATCH 394/850] notes --- src/raddbg/raddbg_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 8da853c1..49c8ba04 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -37,6 +37,7 @@ // // [ ] we keep flat tables of symbols, *but*, "sort" by containing unit. unit -> [f, opl) of procedures, globals, threadvars, constants, etc. // [ ] container can also be a unit, so you can also go from procedure/global/tvar -> unit +// [ ] *OR*, because we can guarantee that the units themselves will be sorted from lowest -> highest in all symbol tables, we can simply binary search the unit table (small) with a symbol's index to find its corresponding unit. that way, no need to duplicate e.g. namespaces and so on across units. and actually, we have to do this, because containers can be types, and those cannot be unit-locked. // // [ ] symbols only store their *partly-qualified name*, e.g. `x` for A::B::C::x // [ ] default name maps look up *partly-qualified names* From 57e4b69e644517258a08a0bac17d859b9847b8e8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 18 Mar 2026 22:46:34 -0700 Subject: [PATCH 395/850] adjust rdi make to keep per-unit info organization - flatten / join in baker, to ensure unit-sorted order --- src/lib_rdi_make/rdi_make.c | 29 ++++-- src/lib_rdi_make/rdi_make.h | 87 ++++++++--------- src/rdi_from_pdb/rdi_from_pdb.c | 117 +++------------------- src/rdi_make/rdi_make_local.c | 165 ++++++++++++++++++++------------ 4 files changed, 181 insertions(+), 217 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index ba585674..a61f7583 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -51,6 +51,23 @@ rdim_memcpy_struct(dst, to_push); \ } \ rdim_memzero_struct(to_push); +#define RDIM_IdxedChunkListShallowCopy(list_type, chunk_type, src, ...) \ +list_type dst = {0};\ +RDI_U64 base_idx = 0;\ +for(chunk_type *src_n = src->first; src_n != 0; src_n = src_n->next)\ +{\ +chunk_type *dst_n = rdim_push_array(arena, chunk_type, 1);\ +RDIM_SLLQueuePush(dst.first, dst.last, dst_n);\ +dst.total_count += src_n->count;\ +dst.chunk_count += 1;\ +dst_n->count = src_n->count;\ +dst_n->cap = dst_n->count;\ +dst_n->base_idx = base_idx;\ +dst_n->v = src_n->v;\ +base_idx += dst_n->count;\ +}\ +return dst; + //////////////////////////////// //~ rjf: Basic Helpers @@ -943,6 +960,12 @@ rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChu RDIM_IdxedChunkListConcatInPlace(RDIM_SymbolChunkNode, dst, to_push); } +RDI_PROC RDIM_SymbolChunkList +rdim_symbol_chunk_list_shallow_copy(RDIM_Arena *arena, RDIM_SymbolChunkList *src) +{ + RDIM_IdxedChunkListShallowCopy(RDIM_SymbolChunkList, RDIM_SymbolChunkNode, src); +} + //////////////////////////////// //~ rjf: [Building] Inline Site Info Building @@ -1223,12 +1246,6 @@ rdim_bake_params_concat_in_place(RDIM_BakeParams *dst, RDIM_BakeParams *src) rdim_udt_chunk_list_concat_in_place(&dst->udts, &src->udts); rdim_src_file_chunk_list_concat_in_place(&dst->src_files, &src->src_files); rdim_line_table_chunk_list_concat_in_place(&dst->line_tables, &src->line_tables); - rdim_symbol_chunk_list_concat_in_place(&dst->global_variables, &src->global_variables); - rdim_symbol_chunk_list_concat_in_place(&dst->thread_variables, &src->thread_variables); - rdim_symbol_chunk_list_concat_in_place(&dst->constants, &src->constants); - rdim_symbol_chunk_list_concat_in_place(&dst->procedures, &src->procedures); - rdim_scope_chunk_list_concat_in_place(&dst->scopes, &src->scopes); - rdim_inline_site_chunk_list_concat_in_place(&dst->inline_sites, &src->inline_sites); } } diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 01914b08..9af381b5 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -628,43 +628,6 @@ struct RDIM_LineTableChunkList RDI_U64 total_col_count; }; -//////////////////////////////// -//~ rjf: Per-Compilation-Unit Info Types - -typedef struct RDIM_Unit RDIM_Unit; -struct RDIM_Unit -{ - struct RDIM_UnitChunkNode *chunk; - RDIM_String8 unit_name; - RDIM_String8 compiler_name; - RDIM_String8 source_file; - RDIM_String8 object_file; - RDIM_String8 archive_file; - RDIM_String8 build_path; - RDI_Language language; - RDIM_LineTable *line_table; - RDIM_Rng1U64ChunkList voff_ranges; -}; - -typedef struct RDIM_UnitChunkNode RDIM_UnitChunkNode; -struct RDIM_UnitChunkNode -{ - RDIM_UnitChunkNode *next; - RDIM_Unit *v; - RDI_U64 count; - RDI_U64 cap; - RDI_U64 base_idx; -}; - -typedef struct RDIM_UnitChunkList RDIM_UnitChunkList; -struct RDIM_UnitChunkList -{ - RDIM_UnitChunkNode *first; - RDIM_UnitChunkNode *last; - RDI_U64 chunk_count; - RDI_U64 total_count; -}; - //////////////////////////////// //~ rjf: Namespace Types @@ -999,6 +962,49 @@ struct RDIM_ScopeChunkList RDI_U64 local_count; }; +//////////////////////////////// +//~ rjf: Per-Compilation-Unit Info Types + +typedef struct RDIM_Unit RDIM_Unit; +struct RDIM_Unit +{ + struct RDIM_UnitChunkNode *chunk; + RDIM_String8 unit_name; + RDIM_String8 compiler_name; + RDIM_String8 source_file; + RDIM_String8 object_file; + RDIM_String8 archive_file; + RDIM_String8 build_path; + RDI_Language language; + RDIM_LineTable *line_table; + RDIM_Rng1U64ChunkList voff_ranges; + RDIM_SymbolChunkList global_variables; + RDIM_SymbolChunkList thread_variables; + RDIM_SymbolChunkList constants; + RDIM_SymbolChunkList procedures; + RDIM_ScopeChunkList scopes; + RDIM_InlineSiteChunkList inline_sites; +}; + +typedef struct RDIM_UnitChunkNode RDIM_UnitChunkNode; +struct RDIM_UnitChunkNode +{ + RDIM_UnitChunkNode *next; + RDIM_Unit *v; + RDI_U64 count; + RDI_U64 cap; + RDI_U64 base_idx; +}; + +typedef struct RDIM_UnitChunkList RDIM_UnitChunkList; +struct RDIM_UnitChunkList +{ + RDIM_UnitChunkNode *first; + RDIM_UnitChunkNode *last; + RDI_U64 chunk_count; + RDI_U64 total_count; +}; + //////////////////////////////// //~ rjf: Baking Types @@ -1016,12 +1022,6 @@ struct RDIM_BakeParams RDIM_UDTChunkList udts; RDIM_SrcFileChunkList src_files; RDIM_LineTableChunkList line_tables; - RDIM_SymbolChunkList global_variables; - RDIM_SymbolChunkList thread_variables; - RDIM_SymbolChunkList constants; - RDIM_SymbolChunkList procedures; - RDIM_ScopeChunkList scopes; - RDIM_InlineSiteChunkList inline_sites; }; //- rjf: data sections @@ -1475,6 +1475,7 @@ RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChun RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap); RDI_PROC RDI_U64 rdim_idx_from_symbol(RDIM_Symbol *symbol); RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push); +RDI_PROC RDIM_SymbolChunkList rdim_symbol_chunk_list_shallow_copy(RDIM_Arena *arena, RDIM_SymbolChunkList *src); //////////////////////////////// //~ rjf: [Building] Inline Site Info Building diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 45c50949..4484b78c 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -1173,12 +1173,12 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync_u64(&src_file_map, 0); ////////////////////////////////////////////////////////////// - //- rjf: convert unit info + //- rjf: convert unit header info // RDIM_UnitChunkList *all_units_ptr = 0; RDIM_LineTableChunkList *units_line_tables = 0; RDIM_LineTable **units_first_inline_site_line_tables = 0; - ProfScope("convert unit info") + ProfScope("convert unit header info") { //- rjf: set up outputs ProfScope("set up outputs") if(lane_idx() == 0) @@ -3259,14 +3259,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) all_udts = *all_udts_ptr; ////////////////////////////////////////////////////////////// - //- rjf: produce symbols from all streams + //- rjf: convert symbols from all units // - RDIM_SymbolChunkList *syms_procedures = 0; - RDIM_SymbolChunkList *syms_global_variables = 0; - RDIM_SymbolChunkList *syms_thread_variables = 0; - RDIM_SymbolChunkList *syms_constants = 0; - RDIM_ScopeChunkList *syms_scopes = 0; - RDIM_InlineSiteChunkList *syms_inline_sites = 0; RDIM_TypeChunkList *syms_typedefs = 0; ProfScope("produce symbols from all streams") { @@ -3277,20 +3271,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // if(lane_idx() == 0) { - syms_procedures = push_array(arena, RDIM_SymbolChunkList, all_syms_count); - syms_global_variables = push_array(arena, RDIM_SymbolChunkList, all_syms_count); - syms_thread_variables = push_array(arena, RDIM_SymbolChunkList, all_syms_count); - syms_constants = push_array(arena, RDIM_SymbolChunkList, all_syms_count); - syms_scopes = push_array(arena, RDIM_ScopeChunkList, all_syms_count); - syms_inline_sites = push_array(arena, RDIM_InlineSiteChunkList, all_syms_count); syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); } - lane_sync_u64(&syms_procedures, 0); - lane_sync_u64(&syms_global_variables, 0); - lane_sync_u64(&syms_thread_variables, 0); - lane_sync_u64(&syms_constants, 0); - lane_sync_u64(&syms_scopes, 0); - lane_sync_u64(&syms_inline_sites, 0); lane_sync_u64(&syms_typedefs, 0); //////////////////////////// @@ -3329,12 +3311,13 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 sym_constants_chunk_cap = 2048; U64 sym_scopes_chunk_cap = 4096; U64 sym_inline_sites_chunk_cap = 2048; - RDIM_SymbolChunkList *sym_procedures = &syms_procedures[sym_idx]; - RDIM_SymbolChunkList *sym_global_variables = &syms_global_variables[sym_idx]; - RDIM_SymbolChunkList *sym_thread_variables = &syms_thread_variables[sym_idx]; - RDIM_SymbolChunkList *sym_constants = &syms_constants[sym_idx]; - RDIM_ScopeChunkList *sym_scopes = &syms_scopes[sym_idx]; - RDIM_InlineSiteChunkList *sym_inline_sites = &syms_inline_sites[sym_idx]; + RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; + RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; + RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; + RDIM_SymbolChunkList *sym_thread_variables = &sym_unit->thread_variables; + RDIM_SymbolChunkList *sym_constants = &sym_unit->constants; + RDIM_ScopeChunkList *sym_scopes = &sym_unit->scopes; + RDIM_InlineSiteChunkList *sym_inline_sites = &sym_unit->inline_sites; RDIM_TypeChunkList *typedefs = &syms_typedefs[sym_idx]; ////////////////////////// @@ -4219,82 +4202,16 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync(); ////////////////////////////////////////////////////////////// - //- rjf: join all lane symbols + //- rjf: join extra types from units // - RDIM_SymbolChunkList all_procedures = {0}; - RDIM_SymbolChunkList all_global_variables = {0}; - RDIM_SymbolChunkList all_thread_variables = {0}; - RDIM_SymbolChunkList all_constants = {0}; - RDIM_ScopeChunkList all_scopes = {0}; - RDIM_InlineSiteChunkList all_inline_sites = {0}; RDIM_TypeChunkList all_types = {0}; { - RDIM_SymbolChunkList *all_procedures_ptr = 0; - RDIM_SymbolChunkList *all_global_variables_ptr = 0; - RDIM_SymbolChunkList *all_thread_variables_ptr = 0; - RDIM_SymbolChunkList *all_constants_ptr = 0; - RDIM_ScopeChunkList *all_scopes_ptr = 0; - RDIM_InlineSiteChunkList *all_inline_sites_ptr = 0; RDIM_TypeChunkList *all_types_ptr = 0; if(lane_idx() == 0) { - all_procedures_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); - all_global_variables_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); - all_thread_variables_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); - all_constants_ptr = push_array(scratch.arena, RDIM_SymbolChunkList, 1); - all_scopes_ptr = push_array(scratch.arena, RDIM_ScopeChunkList, 1); - all_inline_sites_ptr = push_array(scratch.arena, RDIM_InlineSiteChunkList, 1); all_types_ptr = push_array(scratch.arena, RDIM_TypeChunkList, 1); } - lane_sync_u64(&all_procedures_ptr, 0); - lane_sync_u64(&all_global_variables_ptr, 0); - lane_sync_u64(&all_thread_variables_ptr, 0); - lane_sync_u64(&all_constants_ptr, 0); - lane_sync_u64(&all_scopes_ptr, 0); - lane_sync_u64(&all_inline_sites_ptr, 0); lane_sync_u64(&all_types_ptr, 0); - if(lane_idx() == lane_from_task_idx(1)) ProfScope("join procedures") - { - for EachIndex(idx, all_syms_count) - { - rdim_symbol_chunk_list_concat_in_place(all_procedures_ptr, &syms_procedures[idx]); - } - } - if(lane_idx() == lane_from_task_idx(2)) ProfScope("join global variables") - { - for EachIndex(idx, all_syms_count) - { - rdim_symbol_chunk_list_concat_in_place(all_global_variables_ptr, &syms_global_variables[idx]); - } - } - if(lane_idx() == lane_from_task_idx(3)) ProfScope("join thread variables") - { - for EachIndex(idx, all_syms_count) - { - rdim_symbol_chunk_list_concat_in_place(all_thread_variables_ptr, &syms_thread_variables[idx]); - } - } - if(lane_idx() == lane_from_task_idx(4)) ProfScope("join constants") - { - for EachIndex(idx, all_syms_count) - { - rdim_symbol_chunk_list_concat_in_place(all_constants_ptr, &syms_constants[idx]); - } - } - if(lane_idx() == lane_from_task_idx(5)) ProfScope("join scopes") - { - for EachIndex(idx, all_syms_count) - { - rdim_scope_chunk_list_concat_in_place(all_scopes_ptr, &syms_scopes[idx]); - } - } - if(lane_idx() == lane_from_task_idx(6)) ProfScope("join inline sites") - { - for EachIndex(idx, all_syms_count) - { - rdim_inline_site_chunk_list_concat_in_place(all_inline_sites_ptr, &syms_inline_sites[idx]); - } - } if(lane_idx() == lane_from_task_idx(7)) ProfScope("join typedefs") { for EachIndex(idx, all_syms_count) @@ -4304,12 +4221,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) *all_types_ptr = *all_types__pre_typedefs_ptr; } lane_sync(); - all_procedures = *all_procedures_ptr; - all_global_variables = *all_global_variables_ptr; - all_thread_variables = *all_thread_variables_ptr; - all_constants = *all_constants_ptr; - all_scopes = *all_scopes_ptr; - all_inline_sites = *all_inline_sites_ptr; all_types = *all_types_ptr; } lane_sync(); @@ -4362,12 +4273,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) result.udts = all_udts; result.src_files = all_src_files; result.line_tables = all_line_tables; - result.global_variables = all_global_variables; - result.thread_variables = all_thread_variables; - result.constants = all_constants; - result.procedures = all_procedures; - result.scopes = all_scopes; - result.inline_sites = all_inline_sites; } scratch_end(scratch); diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index eb955b23..771d0e7f 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -281,6 +281,47 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { Temp scratch = scratch_begin(&arena, 1); + ////////////////////////////////////////////////////////////// + //- rjf: @rdim_bake_stage form joined symbol lists, from all units + // + RDIM_SymbolChunkList *all_global_variables = 0; + RDIM_SymbolChunkList *all_thread_variables = 0; + RDIM_SymbolChunkList *all_constants = 0; + RDIM_SymbolChunkList *all_procedures = 0; + RDIM_ScopeChunkList *all_scopes = 0; + RDIM_InlineSiteChunkList *all_inline_sites = 0; + if(lane_idx() == 0) + { + all_global_variables = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_thread_variables = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_constants = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_procedures = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_scopes = push_array(scratch.arena, RDIM_ScopeChunkList, 1); + all_inline_sites = push_array(scratch.arena, RDIM_InlineSiteChunkList, 1); + for EachNode(unit_n, RDIM_UnitChunkNode, params->units.first) + { + for EachIndex(unit_n_idx, unit_n->count) + { + RDIM_Unit *unit = &unit_n->v[unit_n_idx]; + RDIM_SymbolChunkList global_variables_shallow_copy = rdim_symbol_chunk_list_shallow_copy(scratch.arena, &unit->global_variables); + RDIM_SymbolChunkList thread_variables_shallow_copy = rdim_symbol_chunk_list_shallow_copy(scratch.arena, &unit->thread_variables); + RDIM_SymbolChunkList constants_shallow_copy = rdim_symbol_chunk_list_shallow_copy(scratch.arena, &unit->constants); + RDIM_SymbolChunkList procedures_shallow_copy = rdim_symbol_chunk_list_shallow_copy(scratch.arena, &unit->procedures); + rdim_symbol_chunk_list_concat_in_place(all_global_variables, &global_variables_shallow_copy); + rdim_symbol_chunk_list_concat_in_place(all_thread_variables, &thread_variables_shallow_copy); + rdim_symbol_chunk_list_concat_in_place(all_constants, &constants_shallow_copy); + rdim_symbol_chunk_list_concat_in_place(all_procedures, &procedures_shallow_copy); + // TODO(rjf): @locpass scopes, inline sites + } + } + } + lane_sync_u64(&all_global_variables, 0); + lane_sync_u64(&all_thread_variables, 0); + lane_sync_u64(&all_constants, 0); + lane_sync_u64(&all_procedures, 0); + lane_sync_u64(&all_scopes, 0); + lane_sync_u64(&all_inline_sites, 0); + ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake vmaps // @@ -328,14 +369,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 *lane_chunk_range_counts = 0; if(lane_idx() == 0) { - lane_chunk_range_counts = push_array(scratch.arena, U64, params->scopes.chunk_count * lane_count()); + lane_chunk_range_counts = push_array(scratch.arena, U64, all_scopes->chunk_count * lane_count()); } lane_sync_u64(&lane_chunk_range_counts, 0); { U64 chunk_idx = 0; - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { - U64 slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx; + U64 slot_idx = lane_idx()*all_scopes->chunk_count + chunk_idx; Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { @@ -351,14 +392,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 total_range_count = 0; if(lane_idx() == 0) { - lane_chunk_range_offs = push_array(scratch.arena, U64, params->scopes.chunk_count * lane_count()); + lane_chunk_range_offs = push_array(scratch.arena, U64, all_scopes->chunk_count * lane_count()); U64 off = 0; U64 chunk_idx = 0; - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { for EachIndex(l_idx, lane_count()) { - U64 slot_idx = l_idx*params->scopes.chunk_count + chunk_idx; + U64 slot_idx = l_idx*all_scopes->chunk_count + chunk_idx; lane_chunk_range_offs[slot_idx] = off; off += lane_chunk_range_counts[slot_idx]; } @@ -381,9 +422,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: fill records { U64 chunk_idx = 0; - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { - U64 slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx; + U64 slot_idx = lane_idx()*all_scopes->chunk_count + chunk_idx; U64 off = lane_chunk_range_offs[slot_idx]; Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) @@ -414,14 +455,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 *lane_chunk_range_counts = 0; if(lane_idx() == 0) { - lane_chunk_range_counts = push_array(scratch.arena, U64, params->global_variables.chunk_count * lane_count()); + lane_chunk_range_counts = push_array(scratch.arena, U64, all_global_variables->chunk_count * lane_count()); } lane_sync_u64(&lane_chunk_range_counts, 0); { U64 chunk_idx = 0; - for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first) + for EachNode(n, RDIM_SymbolChunkNode, all_global_variables->first) { - U64 slot_idx = lane_idx()*params->global_variables.chunk_count + chunk_idx; + U64 slot_idx = lane_idx()*all_global_variables->chunk_count + chunk_idx; Rng1U64 range = lane_range(n->count); for EachIndex(n_idx, n->count) { @@ -441,14 +482,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 total_range_count = 0; if(lane_idx() == 0) { - lane_chunk_range_offs = push_array(scratch.arena, U64, params->global_variables.chunk_count * lane_count()); + lane_chunk_range_offs = push_array(scratch.arena, U64, all_global_variables->chunk_count * lane_count()); U64 off = 0; U64 chunk_idx = 0; - for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first) + for EachNode(n, RDIM_SymbolChunkNode, all_global_variables->first) { for EachIndex(l_idx, lane_count()) { - U64 slot_idx = l_idx*params->global_variables.chunk_count + chunk_idx; + U64 slot_idx = l_idx*all_global_variables->chunk_count + chunk_idx; lane_chunk_range_offs[slot_idx] = off; off += lane_chunk_range_counts[slot_idx]; } @@ -471,9 +512,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: fill records { U64 chunk_idx = 0; - for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first) + for EachNode(n, RDIM_SymbolChunkNode, all_global_variables->first) { - U64 slot_idx = lane_idx()*params->global_variables.chunk_count + chunk_idx; + U64 slot_idx = lane_idx()*all_global_variables->chunk_count + chunk_idx; U64 off = lane_chunk_range_offs[slot_idx]; Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) @@ -1076,9 +1117,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) bake_strings = push_array(scratch.arena, RDIM_BakeStringMapTight, 1); top = push_array(scratch2.arena, RDIM_BakeStringMapTopology, 1); top->slots_count = (64 + - params->procedures.total_count*1 + - params->global_variables.total_count*1 + - params->thread_variables.total_count*1 + + all_procedures->total_count*1 + + all_global_variables->total_count*1 + + all_thread_variables->total_count*1 + params->types.total_count/2); lane_maps__loose = push_array(scratch2.arena, RDIM_BakeStringMapLoose *, lane_count()); map__loose = rdim_bake_string_map_loose_make(scratch2.arena, top); @@ -1194,10 +1235,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: push strings from symbols RDIM_SymbolChunkList *symbol_lists[] = { - ¶ms->global_variables, - ¶ms->thread_variables, - ¶ms->procedures, - ¶ms->constants, + all_global_variables, + all_thread_variables, + all_procedures, + all_constants, }; ProfScope("symbols") { @@ -1218,7 +1259,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: push strings from inline sites ProfScope("inline sites") { - for EachNode(n, RDIM_InlineSiteChunkNode, params->inline_sites.first) + for EachNode(n, RDIM_InlineSiteChunkNode, all_inline_sites->first) { Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) @@ -1231,7 +1272,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: push strings from scopes ProfScope("scopes") { - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) @@ -1352,11 +1393,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) case RDI_NameMapKind_COUNT: {}break; #define Case(name, total_count) case RDI_NameMapKind_##name:{slot_count = ((total_count) + (total_count)/4);}break - Case(GlobalVariables, params->global_variables.total_count); - Case(ThreadVariables, params->thread_variables.total_count); - Case(Constants, params->constants.total_count); - Case(Procedures, params->procedures.total_count); - Case(LinkNameProcedures, params->procedures.total_count); + Case(GlobalVariables, all_global_variables->total_count); + Case(ThreadVariables, all_thread_variables->total_count); + Case(Constants, all_constants->total_count); + Case(Procedures, all_procedures->total_count); + Case(LinkNameProcedures, all_procedures->total_count); Case(Types, params->types.total_count); Case(NormalSourcePaths, params->src_files.total_count); #undef Case @@ -1383,11 +1424,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) case RDI_NameMapKind_NULL: case RDI_NameMapKind_COUNT: {}break; - case RDI_NameMapKind_GlobalVariables: {symbols = ¶ms->global_variables;}goto symbol_name_map_build; - case RDI_NameMapKind_ThreadVariables: {symbols = ¶ms->thread_variables;}goto symbol_name_map_build; - case RDI_NameMapKind_Constants: {symbols = ¶ms->constants;}goto symbol_name_map_build; - case RDI_NameMapKind_Procedures: {symbols = ¶ms->procedures;}goto symbol_name_map_build; - case RDI_NameMapKind_LinkNameProcedures:{symbols = ¶ms->procedures; link_names = 1;}goto symbol_name_map_build; + case RDI_NameMapKind_GlobalVariables: {symbols = all_global_variables;}goto symbol_name_map_build; + case RDI_NameMapKind_ThreadVariables: {symbols = all_thread_variables;}goto symbol_name_map_build; + case RDI_NameMapKind_Constants: {symbols = all_constants;}goto symbol_name_map_build; + case RDI_NameMapKind_Procedures: {symbols = all_procedures;}goto symbol_name_map_build; + case RDI_NameMapKind_LinkNameProcedures:{symbols = all_procedures; link_names = 1;}goto symbol_name_map_build; symbol_name_map_build:; { for EachNode(n, RDIM_SymbolChunkNode, symbols->first) @@ -1512,9 +1553,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) ProfScope("set up per-lane outputs") { top = push_array(scratch.arena, RDIM_BakeIdxRunMapTopology, 1); - top->slots_count = 64 + ((params->procedures.total_count + - params->global_variables.total_count + - params->thread_variables.total_count + + top->slots_count = 64 + ((all_procedures->total_count + + all_global_variables->total_count + + all_thread_variables->total_count + params->udts.total_count) * 3) / 4; lane_maps__loose = push_array(scratch.arena, RDIM_BakeIdxRunMapLoose *, lane_count()); map__loose = rdim_bake_idx_run_map_loose_make(scratch.arena, top); @@ -2713,7 +2754,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_U64 total_location_case_count; }; LocLayout *loc_layout = 0; - U64 total_location_case_chunk_count = (params->scopes.chunk_count + params->procedures.chunk_count); + U64 total_location_case_chunk_count = (all_scopes->chunk_count + params->procedures.chunk_count); ProfScope("compute lane location block layout") { // rjf: set up @@ -2729,7 +2770,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { // rjf: count location cases in scopes U64 chunk_idx = 0; - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { U64 slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; Rng1U64 range = lane_range(n->count); @@ -2762,7 +2803,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { U64 chunk_idx = 0; U64 location_case_layout_off = 1; - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { for EachIndex(l_idx, lane_count()) { @@ -2808,7 +2849,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 chunk_idx = 0; ProfScope("wide fill from scopes") { - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { U64 layout_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; U64 layout_off = loc_layout->location_case_chunk_lane_offs[layout_slot_idx]; @@ -2929,17 +2970,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) { scope_layout = push_array(scratch.arena, ScopeLayout, 1); - scope_layout->scope_local_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); - scope_layout->scope_local_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); - scope_layout->scope_voff_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); - scope_layout->scope_voff_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count); + scope_layout->scope_local_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * all_scopes->chunk_count); + scope_layout->scope_local_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * all_scopes->chunk_count); + scope_layout->scope_voff_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * all_scopes->chunk_count); + scope_layout->scope_voff_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * all_scopes->chunk_count); } lane_sync_u64(&scope_layout, 0); // rjf: count per-lane-chunk { U64 chunk_idx = 0; - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { U64 num_locals_in_this_lane_and_node = 0; U64 num_voffs_in_this_lane_and_node = 0; @@ -2949,8 +2990,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) num_locals_in_this_lane_and_node += n->v[n_idx].locals.total_count; num_voffs_in_this_lane_and_node += n->v[n_idx].voff_ranges.count*2; } - scope_layout->scope_local_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_locals_in_this_lane_and_node; - scope_layout->scope_voff_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_voffs_in_this_lane_and_node; + scope_layout->scope_local_chunk_lane_counts[lane_idx()*all_scopes->chunk_count + chunk_idx] = num_locals_in_this_lane_and_node; + scope_layout->scope_voff_chunk_lane_counts[lane_idx()*all_scopes->chunk_count + chunk_idx] = num_voffs_in_this_lane_and_node; chunk_idx += 1; } } @@ -2962,11 +3003,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 local_layout_off = 1; U64 voff_layout_off = 1; U64 chunk_idx = 0; - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { for EachIndex(l_idx, lane_count()) { - U64 slot_idx = l_idx*params->scopes.chunk_count + chunk_idx; + U64 slot_idx = l_idx*all_scopes->chunk_count + chunk_idx; scope_layout->scope_local_chunk_lane_offs[slot_idx] = local_layout_off; scope_layout->scope_voff_chunk_lane_offs[slot_idx] = voff_layout_off; local_layout_off += scope_layout->scope_local_chunk_lane_counts[slot_idx]; @@ -3002,12 +3043,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) lane_sync_u64(&baked_scopes, 0); if(lane_idx() == lane_from_task_idx(0)) { - baked_scopes->scopes_count = params->scopes.total_count+1; + baked_scopes->scopes_count = all_scopes->total_count+1; baked_scopes->scopes = push_array(arena, RDI_Scope, baked_scopes->scopes_count); } if(lane_idx() == lane_from_task_idx(1)) { - baked_scopes->scope_voffs_count = params->scopes.scope_voff_count+1; + baked_scopes->scope_voffs_count = all_scopes->scope_voff_count+1; baked_scopes->scope_voffs = push_array(arena, RDI_U64, baked_scopes->scope_voffs_count); } lane_sync(); @@ -3015,10 +3056,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: wide fill { U64 chunk_idx = 0; - for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first) + for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) { Rng1U64 range = lane_range(n->count); - U64 scope_chunk_lane_slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx; + U64 scope_chunk_lane_slot_idx = lane_idx()*all_scopes->chunk_count + chunk_idx; U64 chunk_local_off = scope_layout->scope_local_chunk_lane_offs[scope_chunk_lane_slot_idx]; U64 chunk_voff_off = scope_layout->scope_voff_chunk_lane_offs[scope_chunk_lane_slot_idx]; for EachInRange(n_idx, range) @@ -3096,7 +3137,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 chunk_idx = 0; for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first) { - U64 location_block_layout_slot_idx = lane_idx()*total_location_case_chunk_count + params->scopes.chunk_count + chunk_idx; + U64 location_block_layout_slot_idx = lane_idx()*total_location_case_chunk_count + all_scopes->chunk_count + chunk_idx; U64 location_block_off = loc_layout->location_case_chunk_lane_offs[location_block_layout_slot_idx]; Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) @@ -3272,7 +3313,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } if(lane_idx() == lane_from_task_idx(2)) { - baked_inline_sites_count = params->inline_sites.total_count+1; + baked_inline_sites_count = all_inline_sites->total_count+1; baked_inline_sites = push_array(arena, RDI_InlineSite, baked_inline_sites_count); } lane_sync_u64(&baked_units, lane_from_task_idx(0)); @@ -3447,7 +3488,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: bake inline sites ProfScope("bake inline sites") { - for EachNode(n, RDIM_InlineSiteChunkNode, params->inline_sites.first) + for EachNode(n, RDIM_InlineSiteChunkNode, all_inline_sites->first) { Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) @@ -3485,10 +3526,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } symbol_table_lists[] = { - {¶ms->global_variables, &baked_global_variables, &baked_global_variables_count}, - {¶ms->thread_variables, &baked_thread_variables, &baked_thread_variables_count}, - {¶ms->procedures, &baked_procedures, &baked_procedures_count}, - {¶ms->constants, &baked_constants, &baked_constants_count}, + {all_global_variables, &baked_global_variables, &baked_global_variables_count}, + {all_thread_variables, &baked_thread_variables, &baked_thread_variables_count}, + {all_procedures, &baked_procedures, &baked_procedures_count}, + {all_constants, &baked_constants, &baked_constants_count}, {&baked_scopes->arranged_locals, &baked_locals, &baked_locals_count}, }; From b1e69485767e06a4dd19676cbc67c04207bacad1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 19 Mar 2026 22:14:02 -0700 Subject: [PATCH 396/850] rdi: extend per-unit info with symbol ranges; build into baker --- src/lib_rdi/rdi.h | 16 +++++++++ src/lib_rdi_make/rdi_make.c | 23 ------------- src/lib_rdi_make/rdi_make.h | 1 - src/rdi/rdi.mdesk | 8 +++++ src/rdi_from_dwarf/rdi_from_dwarf.c | 2 ++ src/rdi_from_pdb/rdi_from_pdb.c | 2 +- src/rdi_make/rdi_make_local.c | 52 ++++++++++++++++++++++++----- 7 files changed, 70 insertions(+), 34 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 63dc2a67..bc51dfdb 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -762,6 +762,14 @@ X(RDI_U32, archive_file_path_node)\ X(RDI_U32, build_path_node)\ X(RDI_Language, language)\ X(RDI_U32, line_table_idx)\ +X(RDI_U32, procedures_first_idx)\ +X(RDI_U32, procedures_count)\ +X(RDI_U32, global_variables_first_idx)\ +X(RDI_U32, global_variables_count)\ +X(RDI_U32, thread_variables_first_idx)\ +X(RDI_U32, thread_variables_count)\ +X(RDI_U32, constants_first_idx)\ +X(RDI_U32, constants_count)\ #define RDI_LineTable_XList \ X(RDI_U32, voffs_base_idx)\ @@ -1319,6 +1327,14 @@ RDI_U32 archive_file_path_node; RDI_U32 build_path_node; RDI_Language language; RDI_U32 line_table_idx; +RDI_U32 procedures_first_idx; +RDI_U32 procedures_count; +RDI_U32 global_variables_first_idx; +RDI_U32 global_variables_count; +RDI_U32 thread_variables_first_idx; +RDI_U32 thread_variables_count; +RDI_U32 constants_first_idx; +RDI_U32 constants_count; }; typedef struct RDI_LineTable RDI_LineTable; diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index a61f7583..79352f0b 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -51,23 +51,6 @@ rdim_memcpy_struct(dst, to_push); \ } \ rdim_memzero_struct(to_push); -#define RDIM_IdxedChunkListShallowCopy(list_type, chunk_type, src, ...) \ -list_type dst = {0};\ -RDI_U64 base_idx = 0;\ -for(chunk_type *src_n = src->first; src_n != 0; src_n = src_n->next)\ -{\ -chunk_type *dst_n = rdim_push_array(arena, chunk_type, 1);\ -RDIM_SLLQueuePush(dst.first, dst.last, dst_n);\ -dst.total_count += src_n->count;\ -dst.chunk_count += 1;\ -dst_n->count = src_n->count;\ -dst_n->cap = dst_n->count;\ -dst_n->base_idx = base_idx;\ -dst_n->v = src_n->v;\ -base_idx += dst_n->count;\ -}\ -return dst; - //////////////////////////////// //~ rjf: Basic Helpers @@ -960,12 +943,6 @@ rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChu RDIM_IdxedChunkListConcatInPlace(RDIM_SymbolChunkNode, dst, to_push); } -RDI_PROC RDIM_SymbolChunkList -rdim_symbol_chunk_list_shallow_copy(RDIM_Arena *arena, RDIM_SymbolChunkList *src) -{ - RDIM_IdxedChunkListShallowCopy(RDIM_SymbolChunkList, RDIM_SymbolChunkNode, src); -} - //////////////////////////////// //~ rjf: [Building] Inline Site Info Building diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 9af381b5..2610f8b8 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1475,7 +1475,6 @@ RDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChun RDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap); RDI_PROC RDI_U64 rdim_idx_from_symbol(RDIM_Symbol *symbol); RDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push); -RDI_PROC RDIM_SymbolChunkList rdim_symbol_chunk_list_shallow_copy(RDIM_Arena *arena, RDIM_SymbolChunkList *src); //////////////////////////////// //~ rjf: [Building] Inline Site Info Building diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 907fec25..2f5775a1 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -600,6 +600,14 @@ RDI_UnitMemberTable: {build_path_node RDI_U32 ""} {language RDI_Language ""} {line_table_idx RDI_U32 ""} + {procedures_first_idx RDI_U32 ""} + {procedures_count RDI_U32 ""} + {global_variables_first_idx RDI_U32 ""} + {global_variables_count RDI_U32 ""} + {thread_variables_first_idx RDI_U32 ""} + {thread_variables_count RDI_U32 ""} + {constants_first_idx RDI_U32 ""} + {constants_count RDI_U32 ""} } @xlist RDI_Unit_XList: diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 043ae534..d72ac799 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -3112,11 +3112,13 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) bake_params.udts = g_d2r_shared.udts; bake_params.src_files = g_d2r_shared.src_files; bake_params.line_tables = g_d2r_shared.line_tables; +#if 0 // TODO(rjf): @locpass bake_params.global_variables = g_d2r_shared.gvars; bake_params.thread_variables = g_d2r_shared.tvars; bake_params.procedures = g_d2r_shared.procs; bake_params.scopes = g_d2r_shared.scopes; bake_params.inline_sites = g_d2r_shared.inline_sites; +#endif scratch_end(scratch); return bake_params; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 4484b78c..1dc27823 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3311,7 +3311,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 sym_constants_chunk_cap = 2048; U64 sym_scopes_chunk_cap = 4096; U64 sym_inline_sites_chunk_cap = 2048; - RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; + RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx > 0 ? sym_idx-1 : 0]; RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; RDIM_SymbolChunkList *sym_thread_variables = &sym_unit->thread_variables; diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 771d0e7f..cb07db6d 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -284,12 +284,25 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage form joined symbol lists, from all units // + typedef struct UnitSymbolRanges UnitSymbolRanges; + struct UnitSymbolRanges + { + U64 procedures_first_idx; + U64 procedures_count; + U64 global_variables_first_idx; + U64 global_variables_count; + U64 thread_variables_first_idx; + U64 thread_variables_count; + U64 constants_first_idx; + U64 constants_count; + }; RDIM_SymbolChunkList *all_global_variables = 0; RDIM_SymbolChunkList *all_thread_variables = 0; RDIM_SymbolChunkList *all_constants = 0; RDIM_SymbolChunkList *all_procedures = 0; RDIM_ScopeChunkList *all_scopes = 0; RDIM_InlineSiteChunkList *all_inline_sites = 0; + UnitSymbolRanges *unit_symbol_ranges = 0; if(lane_idx() == 0) { all_global_variables = push_array(scratch.arena, RDIM_SymbolChunkList, 1); @@ -298,20 +311,28 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) all_procedures = push_array(scratch.arena, RDIM_SymbolChunkList, 1); all_scopes = push_array(scratch.arena, RDIM_ScopeChunkList, 1); all_inline_sites = push_array(scratch.arena, RDIM_InlineSiteChunkList, 1); + unit_symbol_ranges = push_array(scratch.arena, UnitSymbolRanges, params->units.total_count); + U64 unit_idx = 0; for EachNode(unit_n, RDIM_UnitChunkNode, params->units.first) { for EachIndex(unit_n_idx, unit_n->count) { RDIM_Unit *unit = &unit_n->v[unit_n_idx]; - RDIM_SymbolChunkList global_variables_shallow_copy = rdim_symbol_chunk_list_shallow_copy(scratch.arena, &unit->global_variables); - RDIM_SymbolChunkList thread_variables_shallow_copy = rdim_symbol_chunk_list_shallow_copy(scratch.arena, &unit->thread_variables); - RDIM_SymbolChunkList constants_shallow_copy = rdim_symbol_chunk_list_shallow_copy(scratch.arena, &unit->constants); - RDIM_SymbolChunkList procedures_shallow_copy = rdim_symbol_chunk_list_shallow_copy(scratch.arena, &unit->procedures); - rdim_symbol_chunk_list_concat_in_place(all_global_variables, &global_variables_shallow_copy); - rdim_symbol_chunk_list_concat_in_place(all_thread_variables, &thread_variables_shallow_copy); - rdim_symbol_chunk_list_concat_in_place(all_constants, &constants_shallow_copy); - rdim_symbol_chunk_list_concat_in_place(all_procedures, &procedures_shallow_copy); - // TODO(rjf): @locpass scopes, inline sites + unit_symbol_ranges[unit_idx].procedures_first_idx = all_procedures->total_count + 1; + unit_symbol_ranges[unit_idx].procedures_count = unit->procedures.total_count; + unit_symbol_ranges[unit_idx].global_variables_first_idx = all_global_variables->total_count + 1; + unit_symbol_ranges[unit_idx].global_variables_count = unit->global_variables.total_count; + unit_symbol_ranges[unit_idx].thread_variables_first_idx = all_thread_variables->total_count + 1; + unit_symbol_ranges[unit_idx].thread_variables_count = unit->thread_variables.total_count; + unit_symbol_ranges[unit_idx].constants_first_idx = all_constants->total_count + 1; + unit_symbol_ranges[unit_idx].constants_count = unit->constants.total_count; + rdim_symbol_chunk_list_concat_in_place(all_global_variables, &unit->global_variables); + rdim_symbol_chunk_list_concat_in_place(all_thread_variables, &unit->thread_variables); + rdim_symbol_chunk_list_concat_in_place(all_constants, &unit->constants); + rdim_symbol_chunk_list_concat_in_place(all_procedures, &unit->procedures); + rdim_scope_chunk_list_concat_in_place(all_scopes, &unit->scopes); + rdim_inline_site_chunk_list_concat_in_place(all_inline_sites, &unit->inline_sites); + unit_idx += 1; } } } @@ -321,6 +342,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) lane_sync_u64(&all_procedures, 0); lane_sync_u64(&all_scopes, 0); lane_sync_u64(&all_inline_sites, 0); + lane_sync_u64(&unit_symbol_ranges, 0); ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake vmaps @@ -3326,11 +3348,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: bake units ProfScope("bake units") { + U64 base_unit_idx = 0; for EachNode(n, RDIM_UnitChunkNode, params->units.first) { Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { + U64 unit_idx = base_unit_idx + n_idx; + UnitSymbolRanges *symbol_ranges = &unit_symbol_ranges[unit_idx]; RDIM_Unit *src = &n->v[n_idx]; RDI_Unit *dst = &baked_units[n->base_idx + n_idx + 1]; dst->unit_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->unit_name); @@ -3341,7 +3366,16 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->build_path_node = rdim_bake_path_node_idx_from_string(path_tree, src->build_path); dst->language = src->language; dst->line_table_idx = (RDI_U32)rdim_idx_from_line_table(src->line_table); // TODO(rjf): @u64_to_u32 + dst->procedures_first_idx = (RDI_U32)symbol_ranges->procedures_first_idx; // TODO(rjf): @u64_to_u32 + dst->procedures_count = (RDI_U32)symbol_ranges->procedures_count; // TODO(rjf): @u64_to_u32 + dst->global_variables_first_idx = (RDI_U32)symbol_ranges->global_variables_first_idx; // TODO(rjf): @u64_to_u32 + dst->global_variables_count = (RDI_U32)symbol_ranges->global_variables_count; // TODO(rjf): @u64_to_u32 + dst->thread_variables_first_idx = (RDI_U32)symbol_ranges->thread_variables_first_idx; // TODO(rjf): @u64_to_u32 + dst->thread_variables_count = (RDI_U32)symbol_ranges->thread_variables_count; // TODO(rjf): @u64_to_u32 + dst->constants_first_idx = (RDI_U32)symbol_ranges->constants_first_idx; // TODO(rjf): @u64_to_u32 + dst->constants_count = (RDI_U32)symbol_ranges->constants_count; // TODO(rjf): @u64_to_u32 } + base_unit_idx += n->count; } } From 2218649801248553ebdf72dacffa3812a13b3ac9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 19 Mar 2026 22:45:05 -0700 Subject: [PATCH 397/850] fix busted section codes --- src/lib_rdi/rdi.h | 18 +++++++++--------- src/raddbg/raddbg_main.c | 6 +++--- src/rdi/rdi.mdesk | 18 +++++++++--------- src/rdi_from_pdb/rdi_from_pdb.c | 4 ++-- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index bc51dfdb..c676bb89 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -103,14 +103,14 @@ RDI_SectionKind_ThreadVariables = 0x0018, RDI_SectionKind_Constants = 0x0019, RDI_SectionKind_Procedures = 0x001A, RDI_SectionKind_Locals = 0x001B, -RDI_SectionKind_Scopes = 0x001D, -RDI_SectionKind_ScopeVOffData = 0x001E, -RDI_SectionKind_ScopeVMap = 0x001F, -RDI_SectionKind_InlineSites = 0x0020, -RDI_SectionKind_LocationBlocks = 0x0021, -RDI_SectionKind_LocationData = 0x0022, -RDI_SectionKind_GlobalVariableSymbols = 0x0023, -RDI_SectionKind_GlobalVMap = 0x001C, +RDI_SectionKind_Scopes = 0x001C, +RDI_SectionKind_ScopeVOffData = 0x001D, +RDI_SectionKind_ScopeVMap = 0x001E, +RDI_SectionKind_InlineSites = 0x001F, +RDI_SectionKind_LocationBlocks = 0x0020, +RDI_SectionKind_LocationData = 0x0021, +RDI_SectionKind_GlobalVariableSymbols = 0x0022, +RDI_SectionKind_GlobalVMap = 0x0023, RDI_SectionKind_ThreadVariableSymbols = 0x0024, RDI_SectionKind_ConstantSymbols = 0x0025, RDI_SectionKind_ProcedureSymbols = 0x0026, @@ -387,7 +387,7 @@ RDI_MemberKind_NestedType = 0x0300, typedef RDI_U8 RDI_ContainerKind; typedef enum RDI_ContainerKindEnum { -RDI_ContainerKind_Unit = 0x0, +RDI_ContainerKind_NULL = 0x0, RDI_ContainerKind_Type = 0x1, RDI_ContainerKind_Scope = 0x2, RDI_ContainerKind_Namespace = 0x3, diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 49c8ba04..3fc9e08e 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -35,9 +35,9 @@ // [x] Referring to many locations, based on scope offsets -> kind = BlockList; BlockList encodes a first/opl pair into Block table, each Block has scope_off_first/opl, location_kind, location_idx - but a block's location kind CANNOT BE BlockList // [x] RDI_Variable has location_kind, location_idx // -// [ ] we keep flat tables of symbols, *but*, "sort" by containing unit. unit -> [f, opl) of procedures, globals, threadvars, constants, etc. -// [ ] container can also be a unit, so you can also go from procedure/global/tvar -> unit -// [ ] *OR*, because we can guarantee that the units themselves will be sorted from lowest -> highest in all symbol tables, we can simply binary search the unit table (small) with a symbol's index to find its corresponding unit. that way, no need to duplicate e.g. namespaces and so on across units. and actually, we have to do this, because containers can be types, and those cannot be unit-locked. +// [x] we keep flat tables of symbols, *but*, "sort" by containing unit. unit -> [f, opl) of procedures, globals, threadvars, constants, etc. +// [x] container can also be a unit, so you can also go from procedure/global/tvar -> unit +// [x] *OR*, because we can guarantee that the units themselves will be sorted from lowest -> highest in all symbol tables, we can simply binary search the unit table (small) with a symbol's index to find its corresponding unit. that way, no need to duplicate e.g. namespaces and so on across units. and actually, we have to do this, because containers can be types, and those cannot be unit-locked. // // [ ] symbols only store their *partly-qualified name*, e.g. `x` for A::B::C::x // [ ] default name maps look up *partly-qualified names* diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 2f5775a1..abce6094 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -188,18 +188,18 @@ RDI_SectionTable: //- rjf: scope info - {Scopes scopes RDI_Scope 0x001D U32 ""} - {ScopeVOffData scope_voff_data RDI_U64 0x001E U32 ""} - {ScopeVMap scope_vmap RDI_VMapEntry 0x001F - ""} - {InlineSites inline_sites RDI_InlineSite 0x0020 U32 ""} + {Scopes scopes RDI_Scope 0x001C U32 ""} + {ScopeVOffData scope_voff_data RDI_U64 0x001D U32 ""} + {ScopeVMap scope_vmap RDI_VMapEntry 0x001E - ""} + {InlineSites inline_sites RDI_InlineSite 0x001F U32 ""} //- TODO(rjf): vvv old story for locations - {LocationBlocks location_blocks RDI_LocationBlock 0x0021 U32 ""} - {LocationData location_data RDI_U8 0x0022 U32 ""} + {LocationBlocks location_blocks RDI_LocationBlock 0x0020 U32 ""} + {LocationData location_data RDI_U8 0x0021 U32 ""} //- NOTE(rjf): vvv new story for symbols - {GlobalVariableSymbols global_variable_symbols RDI_Symbol 0x0023 U32 ""} - {GlobalVMap global_vmap RDI_VMapEntry 0x001C - ""} + {GlobalVariableSymbols global_variable_symbols RDI_Symbol 0x0022 U32 ""} + {GlobalVMap global_vmap RDI_VMapEntry 0x0023 - ""} {ThreadVariableSymbols thread_variable_symbols RDI_Symbol 0x0024 U32 ""} {ConstantSymbols constant_symbols RDI_Symbol 0x0025 U32 ""} {ProcedureSymbols procedure_symbols RDI_Symbol 0x0026 U32 ""} @@ -1000,7 +1000,7 @@ RDI_EnumMemberTable: @table(name value) RDI_ContainerKindTable: { - {Unit 0x0} + {NULL 0x0} {Type 0x1} {Scope 0x2} {Namespace 0x3} diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 1dc27823..39d2e5ec 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3688,8 +3688,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Scope *scope = top_scope_node->scope; RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); local->is_param = is_param; - local->name = name; - local->type = type; + local->name = name; + local->type = type; // rjf: equip location info { From e6d28d40e24981fea1d56bdda9c1d31fcf71ab9a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 19 Mar 2026 22:54:57 -0700 Subject: [PATCH 398/850] start plugging in new rdi symbols to dumper --- src/rdi/rdi_local.c | 60 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 73fa3c11..e86ff47f 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -550,17 +550,18 @@ rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags fla String8List *strings = 0; #define dump(str) str8_list_push(arena, strings, (str)) #define dumpf(...) str8_list_pushf(arena, strings, __VA_ARGS__) -#define DumpSubset(name) \ +#define DumpSubsetKind(kind) \ if(lane_idx() == 0)\ {\ DumpSubsetOutputNode *n = push_array(scratch.arena, DumpSubsetOutputNode, 1);\ SLLQueuePush(first_output_node, last_output_node, n);\ -n->subset = RDI_DumpSubset_##name;\ +n->subset = (kind);\ n->lane_strings = push_array(scratch.arena, String8List, lane_count());\ }\ lane_sync();\ strings = &last_output_node->lane_strings[lane_idx()];\ -lane_sync(); if(flags & RDI_DumpSubsetFlag_##name) ProfScope(#name) +lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subset_table[kind].str) +#define DumpSubset(name) DumpSubsetKind(RDI_DumpSubset_##name) ////////////////////////////// //- rjf: dump data sections @@ -1103,6 +1104,45 @@ lane_sync(); if(flags & RDI_DumpSubsetFlag_##name) ProfScope(#name) } } + ////////////////////////////// + //- rjf: dump symbols + // + struct + { + RDI_DumpSubset subset; + RDI_SectionKind section; + } + symbol_tables[] = + { + {RDI_DumpSubset_Procedures, RDI_SectionKind_ProcedureSymbols}, + {RDI_DumpSubset_GlobalVariables, RDI_SectionKind_GlobalVariableSymbols}, + {RDI_DumpSubset_ThreadVariables, RDI_SectionKind_ThreadVariableSymbols}, + {RDI_DumpSubset_Constants, RDI_SectionKind_ConstantSymbols}, + }; + for EachElement(symbol_table_idx, symbol_tables) + { + DumpSubsetKind(symbol_tables[symbol_table_idx].subset) + { + String8 table_name = rdi_name_lowercase_from_dump_subset_table[symbol_tables[symbol_table_idx].subset]; + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + U64 count = 0; + RDI_Symbol *v = (RDI_Symbol *)rdi_section_raw_table_from_kind(rdi, symbol_tables[symbol_table_idx].section, &count); + Rng1U64 range = lane_range(count); + for EachInRange(idx, range) + { + RDI_Symbol *symbol = &v[idx]; + Temp scratch = scratch_begin(&arena, 1); + dumpf("\n '%S': // %S[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, symbol->name_string_idx), table_name, idx); + dumpf(" link_name: '%S'\n", str8_from_rdi_string_idx(rdi, symbol->link_name_string_idx)); + dumpf(" type_idx: %u\n", symbol->type_idx); + dumpf(" root_scope_idx: %u\n", symbol->root_scope_idx); + dumpf(" container_idx: %u\n", symbol->container_idx); + dumpf(" }\n"); + scratch_end(scratch); + } + } + } + ////////////////////////////// //- rjf: dump scopes // @@ -1368,15 +1408,15 @@ internal String8 rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_TypeNode *type) { Temp scratch = scratch_begin(&arena, 1); - + String8List fmt = {0}; String8List arr_fmt = {0}; - + for (RDI_TypeNode *i = type, *n = 0; i != 0; i = n, n = 0) { if (RDI_TypeKind_FirstConstructed <= i->kind && i->kind <= RDI_TypeKind_LastConstructed) { n = rdi_element_from_name_idx(rdi, TypeNodes, i->constructed.direct_type_idx); } - + if (i->kind == RDI_TypeKind_Variadic) { str8_list_push_frontf(scratch.arena, &fmt, "..."); } else if (RDI_TypeKind_FirstBuiltIn <= i->kind && i->kind <= RDI_TypeKind_LastBuiltIn) { @@ -1416,7 +1456,7 @@ rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_Typ } } } - + // format parameters String8List params_fmt = {0}; U32 check_count = 0; @@ -1434,19 +1474,19 @@ rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_Typ } else { str8_list_pushf(scratch.arena, ¶ms_fmt, "???"); } - + // format signature String8 params = str8_list_join(scratch.arena, ¶ms_fmt, &(StringJoin){.sep=str8_lit(", ")}); str8_list_pushf(scratch.arena, &fmt, "(* %S)(%S)", proc_name, params); } - + if (arr_fmt.node_count && i->kind != RDI_TypeKind_Array) { str8_list_push_frontf(scratch.arena, &fmt, "("); str8_list_concat_in_place(&fmt, &arr_fmt); str8_list_pushf(scratch.arena, &fmt, ")"); } } - + String8 result = str8_list_join(arena, &fmt, 0); scratch_end(scratch); return result; From 290590b8859188b3adcc57235d45216c6de2fd07 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 20 Mar 2026 09:42:22 -0700 Subject: [PATCH 399/850] extend udts w/ container info --- src/lib_rdi/rdi.h | 10 ++++++++-- src/rdi/rdi.mdesk | 21 ++++++++++++--------- src/rdi_make/rdi_make_local.c | 12 +----------- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index c676bb89..c37753f9 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -67,7 +67,7 @@ union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; // "raddbg\0\0" #define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 20 +#define RDI_ENCODING_VERSION 21 //////////////////////////////////////////////////////////////// //~ Format Types & Functions @@ -363,7 +363,7 @@ RDI_TypeModifierFlag_Volatile = 1<<1, RDI_TypeModifierFlag_Restrict = 1<<2, } RDI_TypeModifierFlagsEnum; -typedef RDI_U32 RDI_UDTFlags; +typedef RDI_U8 RDI_UDTFlags; typedef enum RDI_UDTFlagsEnum { RDI_UDTFlag_EnumMembers = 1<<0, @@ -879,11 +879,14 @@ X(EnumMembers)\ #define RDI_UDT_XList \ X(RDI_U32, self_type_idx)\ X(RDI_UDTFlags, flags)\ +X(RDI_ContainerFlags, container_flags)\ +X(RDI_U16, reserved_0)\ X(RDI_U32, member_first)\ X(RDI_U32, member_count)\ X(RDI_U32, file_idx)\ X(RDI_U32, line)\ X(RDI_U32, col)\ +X(RDI_U32, container_idx)\ #define RDI_MemberKind_XList \ X(NULL)\ @@ -1427,11 +1430,14 @@ struct RDI_UDT { RDI_U32 self_type_idx; RDI_UDTFlags flags; +RDI_ContainerFlags container_flags; +RDI_U16 reserved_0; RDI_U32 member_first; RDI_U32 member_count; RDI_U32 file_idx; RDI_U32 line; RDI_U32 col; +RDI_U32 container_idx; }; typedef struct RDI_Member RDI_Member; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index abce6094..fd324eb8 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -77,7 +77,7 @@ ""; "// \"raddbg\\0\\0\""; "#define RDI_MAGIC_CONSTANT 0x0000676264646172"; - "#define RDI_ENCODING_VERSION 20"; + "#define RDI_ENCODING_VERSION 21"; ""; "////////////////////////////////////////////////////////////////"; "//~ Format Types & Functions"; @@ -825,13 +825,16 @@ RDI_UDTFlagTable: @table(name type desc) RDI_UDTMemberTable: { - {self_type_idx RDI_U32 ""} - {flags RDI_UDTFlags ""} - {member_first RDI_U32 ""} - {member_count RDI_U32 ""} - {file_idx RDI_U32 ""} - {line RDI_U32 ""} - {col RDI_U32 ""} + {self_type_idx RDI_U32 ""} + {flags RDI_UDTFlags ""} + {container_flags RDI_ContainerFlags ""} + {reserved_0 RDI_U16 ""} + {member_first RDI_U32 ""} + {member_count RDI_U32 ""} + {file_idx RDI_U32 ""} + {line RDI_U32 ""} + {col RDI_U32 ""} + {container_idx RDI_U32 ""} } @table(name value) @@ -942,7 +945,7 @@ RDI_EnumMemberTable: ``` } -@enum(RDI_U32) RDI_UDTFlags: +@enum(RDI_U8) RDI_UDTFlags: { @expand(RDI_UDTFlagTable a) `$(a.name .. =>20) = $(a.value)` } diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index cb07db6d..948b08ac 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1798,17 +1798,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } lane_sync(); - ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage build deduplicated location maps - // - RDIM_BakeStringMapTight *bake_locs__regs = 0; - RDIM_BakeStringMapTight *bake_locs__reg_plus_u16 = 0; - RDIM_BakeStringMapTight *bake_locs__bytecode = 0; - { - - } - lane_sync(); - ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake strings // @@ -3196,6 +3185,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } #endif + ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute layout for constant data // From e281528d570c0e7bbeb1d7bb79e1a3ad30a7042b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 16 Apr 2026 11:50:02 -0700 Subject: [PATCH 400/850] rdi pass checkpoint: rdi baking; scope-organized locals gathering / sorting / organizing; plug into serialization path --- build.bat | 2 +- project.4coder | 2 +- src/rdi/rdi_local.c | 18 +++-------- src/rdi/rdi_local.h | 1 + src/rdi_make/rdi_make_local.c | 58 ++++++++++++++++++++++++----------- 5 files changed, 47 insertions(+), 34 deletions(-) diff --git a/build.bat b/build.bat index 36d142ae..052085c8 100644 --- a/build.bat +++ b/build.bat @@ -146,7 +146,7 @@ if "%convertperf%"=="1" set didbuild=1 && %compile% ..\src\scratc if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\debugstringperf.c %compile_link% %out%debugstringperf.exe || exit /b 1 if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% %out%parse_inline_sites.exe || exit /b 1 if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_lib_debug\strip_lib_debug.c %compile_link% %out%strip_lib_debug.exe || exit /b 1 -if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp %out%mule_inline.obj && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp %out%mule_o2.obj && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 +if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %link_dll% %out%mule_module.dll || exit /b 1 if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% %out%torture.exe || exit /b1 diff --git a/project.4coder b/project.4coder index 0d66816b..a3fc4681 100644 --- a/project.4coder +++ b/project.4coder @@ -48,7 +48,7 @@ commands = //- rjf: [raddbg] // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index e86ff47f..191ac4de 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1117,6 +1117,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse {RDI_DumpSubset_Procedures, RDI_SectionKind_ProcedureSymbols}, {RDI_DumpSubset_GlobalVariables, RDI_SectionKind_GlobalVariableSymbols}, {RDI_DumpSubset_ThreadVariables, RDI_SectionKind_ThreadVariableSymbols}, + {RDI_DumpSubset_LocalVariables, RDI_SectionKind_LocalVariableSymbols}, {RDI_DumpSubset_Constants, RDI_SectionKind_ConstantSymbols}, }; for EachElement(symbol_table_idx, symbol_tables) @@ -1137,6 +1138,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse dumpf(" type_idx: %u\n", symbol->type_idx); dumpf(" root_scope_idx: %u\n", symbol->root_scope_idx); dumpf(" container_idx: %u\n", symbol->container_idx); + // TODO(rjf): location info dumpf(" }\n"); scratch_end(scratch); } @@ -1153,7 +1155,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse U64 scope_voffs_count = 0; U64 *scope_voffs = rdi_table_from_name(rdi, ScopeVOffData, &scope_voffs_count); U64 locals_count = 0; - RDI_Local *locals = rdi_table_from_name(rdi, Locals, &locals_count); + RDI_Symbol *locals = rdi_table_from_name(rdi, LocalVariableSymbols, &locals_count); U64 count = 0; RDI_Scope *v = rdi_table_from_name(rdi, Scopes, &count); RDI_Scope *nil = &v[0]; @@ -1217,22 +1219,10 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse for(U32 local_idx = local_lo; local_idx < local_hi; local_idx += 1) { Temp scratch = scratch_begin(&arena, 1); - RDI_Local *local_ptr = &locals[local_idx]; + RDI_Symbol *local_ptr = &locals[local_idx]; dumpf("%.*s '%S': // local[%u]\n", depth*2, indent.str, str8_from_rdi_string_idx(rdi, local_ptr->name_string_idx), local_idx); dumpf("%.*s {\n", depth*2, indent.str); - dumpf("%.*s kind: %S\n", depth*2, indent.str, rdi_string_from_local_kind(scratch.arena, local_ptr->kind)); dumpf("%.*s type_idx: %u\n", depth*2, indent.str, local_ptr->type_idx); - dumpf("%.*s locations:\n", depth*2, indent.str); - dumpf("%.*s {\n", depth*2, indent.str); - if(local_ptr->location_first < local_ptr->location_opl) - { - String8List locations_strings = rdi_strings_from_locations(arena, rdi, tli->arch, r1u64(local_ptr->location_first, local_ptr->location_opl)); - for(String8Node *n = locations_strings.first; n != 0; n = n->next) - { - dumpf("%.*s %S\n", depth*2, indent.str, n->string); - } - } - dumpf("%.*s }\n", depth*2, indent.str); dumpf("%.*s }\n", depth*2, indent.str); scratch_end(scratch); } diff --git a/src/rdi/rdi_local.h b/src/rdi/rdi_local.h index 96b8d0e5..98dd57bc 100644 --- a/src/rdi/rdi_local.h +++ b/src/rdi/rdi_local.h @@ -25,6 +25,7 @@ X(UserDefinedTypes, user_defined_types, "USER DEFINED TYPES")\ X(GlobalVariables, global_variables, "GLOBAL VARIABLES")\ X(GlobalVariablesVMap, global_variables_vmap, "GLOBAL VARIABLE VMAP")\ X(ThreadVariables, thread_variables, "THREAD VARIABLES")\ +X(LocalVariables, local_variables, "LOCAL VARIABLES")\ X(Constants, constants, "CONSTANTS")\ X(Procedures, procedures, "PROCEDURES")\ X(Scopes, scopes, "SCOPES")\ diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 948b08ac..f72597fc 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2973,6 +2973,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_U64 *scope_local_chunk_lane_offs; // [lane_count * scope_chunk_count] RDI_U64 *scope_voff_chunk_lane_counts; // [lane_count * scope_chunk_count] RDI_U64 *scope_voff_chunk_lane_offs; // [lane_count * scope_chunk_count] + U64 total_local_count; }; ScopeLayout *scope_layout = 0; ProfScope("compute layout for scope sub-lists (locals / voffs)") @@ -3026,6 +3027,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } chunk_idx += 1; } + scope_layout->total_local_count = local_layout_off; } lane_sync(); } @@ -3041,7 +3043,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_U64 scopes_count; RDI_U64 *scope_voffs; RDI_U64 scope_voffs_count; - RDIM_SymbolChunkList arranged_locals; + RDIM_SymbolChunkNode arranged_locals_chunk; }; BakedScopes *baked_scopes = 0; ProfScope("bake scopes") @@ -3062,6 +3064,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) baked_scopes->scope_voffs_count = all_scopes->scope_voff_count+1; baked_scopes->scope_voffs = push_array(arena, RDI_U64, baked_scopes->scope_voffs_count); } + if(lane_idx() == lane_from_task_idx(2)) + { + baked_scopes->arranged_locals_chunk.count = scope_layout->total_local_count; + baked_scopes->arranged_locals_chunk.cap = baked_scopes->arranged_locals_chunk.count; + baked_scopes->arranged_locals_chunk.base_idx = 0; + baked_scopes->arranged_locals_chunk.v = push_array(scratch.arena, RDIM_Symbol, baked_scopes->arranged_locals_chunk.count); + } lane_sync(); //- rjf: wide fill @@ -3096,18 +3105,18 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(src_local_idx, src_local_n->count) { RDIM_Symbol *src_local = &src_local_n->v[src_local_idx]; -#if 0 - RDI_Symbol *dst_local = &baked_scopes->locals[chunk_local_off]; - dst_local->kind = src_local->kind; - dst_local->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_local->name); - dst_local->type_idx = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32 - if(src_local->location_cases.count != 0) - { - dst_local->location_first = chunk_location_block_off; - dst_local->location_opl = chunk_location_block_off + src_local->location_cases.count; - chunk_location_block_off += src_local->location_cases.count; - } -#endif + RDIM_Symbol *dst_local = &baked_scopes->arranged_locals_chunk.v[chunk_local_off]; + dst_local->chunk = &baked_scopes->arranged_locals_chunk; + dst_local->is_extern = src_local->is_extern; + dst_local->is_param = src_local->is_param; + dst_local->name = src_local->name; + dst_local->link_name = src_local->link_name; + dst_local->type = src_local->type; + dst_local->container_scope = src_local->container_scope; + dst_local->container_type = src_local->container_type; + dst_local->container_namespace = src_local->container_namespace; + dst_local->root_scope = src_local->root_scope; + dst_local->location_cases = src_local->location_cases; chunk_local_off += 1; } } @@ -3130,6 +3139,19 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } lane_sync(); + ////////////////////////////////////////////////////////////// + //- rjf: @rdim_bake_stage form local chunk list for all arranged locals + // + RDIM_SymbolChunkList *all_locals = 0; + if(lane_idx() == 0) + { + all_locals = push_array(scratch.arena, RDIM_SymbolChunkList, 1); + all_locals[0].first = all_locals[0].last = &baked_scopes->arranged_locals_chunk; + all_locals[0].chunk_count = 1; + all_locals[0].total_count = baked_scopes->arranged_locals_chunk.count; + } + lane_sync_u64(&all_locals, 0); + ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake procedures // @@ -3550,11 +3572,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } symbol_table_lists[] = { - {all_global_variables, &baked_global_variables, &baked_global_variables_count}, - {all_thread_variables, &baked_thread_variables, &baked_thread_variables_count}, - {all_procedures, &baked_procedures, &baked_procedures_count}, - {all_constants, &baked_constants, &baked_constants_count}, - {&baked_scopes->arranged_locals, &baked_locals, &baked_locals_count}, + {all_global_variables, &baked_global_variables, &baked_global_variables_count}, + {all_thread_variables, &baked_thread_variables, &baked_thread_variables_count}, + {all_procedures, &baked_procedures, &baked_procedures_count}, + {all_constants, &baked_constants, &baked_constants_count}, + {all_locals, &baked_locals, &baked_locals_count}, }; ////////////////////////////////////////////////////////////// From bec7e630ba27f990a791de59a19ce9badcbbd084 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 16 Apr 2026 12:35:53 -0700 Subject: [PATCH 401/850] fix duplicate nil local, equip locals with their scopes as symbol containers --- src/rdi/rdi_local.c | 21 ++++++++++++--------- src/rdi_from_pdb/rdi_from_pdb.c | 4 ++-- src/rdi_make/rdi_make_local.c | 8 +++----- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 191ac4de..9ccc12df 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1134,10 +1134,16 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse RDI_Symbol *symbol = &v[idx]; Temp scratch = scratch_begin(&arena, 1); dumpf("\n '%S': // %S[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, symbol->name_string_idx), table_name, idx); - dumpf(" link_name: '%S'\n", str8_from_rdi_string_idx(rdi, symbol->link_name_string_idx)); - dumpf(" type_idx: %u\n", symbol->type_idx); - dumpf(" root_scope_idx: %u\n", symbol->root_scope_idx); - dumpf(" container_idx: %u\n", symbol->container_idx); + dumpf(" type_idx: %u\n", symbol->type_idx); + if(symbol->link_name_string_idx != 0) + { + dumpf(" link_name: '%S'\n", str8_from_rdi_string_idx(rdi, symbol->link_name_string_idx)); + } + if(symbol->root_scope_idx != 0) + { + dumpf(" root_scope_idx: %u\n", symbol->root_scope_idx); + } + dumpf(" container_idx: %u\n", symbol->container_idx); // TODO(rjf): location info dumpf(" }\n"); scratch_end(scratch); @@ -1185,7 +1191,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse } // rjf: scope procedure -> name - String8 procedure_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx)->name_string_idx); + String8 procedure_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, ProcedureSymbols, scope->proc_idx)->name_string_idx); if(procedure_name.size == 0) { procedure_name = str8_lit("???"); @@ -1220,10 +1226,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse { Temp scratch = scratch_begin(&arena, 1); RDI_Symbol *local_ptr = &locals[local_idx]; - dumpf("%.*s '%S': // local[%u]\n", depth*2, indent.str, str8_from_rdi_string_idx(rdi, local_ptr->name_string_idx), local_idx); - dumpf("%.*s {\n", depth*2, indent.str); - dumpf("%.*s type_idx: %u\n", depth*2, indent.str, local_ptr->type_idx); - dumpf("%.*s }\n", depth*2, indent.str); + dumpf("%.*s '%S': {type_idx: %u} // local_variable #%u\n", depth*2, indent.str, str8_from_rdi_string_idx(rdi, local_ptr->name_string_idx), local_ptr->type_idx, local_idx); scratch_end(scratch); } } diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 39d2e5ec..fc95c8c1 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3819,8 +3819,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); { local->is_param = !!(slocal->flags & CV_LocalFlag_Param); - local->name = name; - local->type = type; + local->name = name; + local->type = type; } #if 0 // TODO(rjf): @locpass diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index f72597fc..f4ee7f59 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3066,7 +3066,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } if(lane_idx() == lane_from_task_idx(2)) { - baked_scopes->arranged_locals_chunk.count = scope_layout->total_local_count; + baked_scopes->arranged_locals_chunk.count = scope_layout->total_local_count - 1; baked_scopes->arranged_locals_chunk.cap = baked_scopes->arranged_locals_chunk.count; baked_scopes->arranged_locals_chunk.base_idx = 0; baked_scopes->arranged_locals_chunk.v = push_array(scratch.arena, RDIM_Symbol, baked_scopes->arranged_locals_chunk.count); @@ -3105,16 +3105,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachIndex(src_local_idx, src_local_n->count) { RDIM_Symbol *src_local = &src_local_n->v[src_local_idx]; - RDIM_Symbol *dst_local = &baked_scopes->arranged_locals_chunk.v[chunk_local_off]; + RDIM_Symbol *dst_local = &baked_scopes->arranged_locals_chunk.v[chunk_local_off - 1]; dst_local->chunk = &baked_scopes->arranged_locals_chunk; dst_local->is_extern = src_local->is_extern; dst_local->is_param = src_local->is_param; dst_local->name = src_local->name; dst_local->link_name = src_local->link_name; dst_local->type = src_local->type; - dst_local->container_scope = src_local->container_scope; - dst_local->container_type = src_local->container_type; - dst_local->container_namespace = src_local->container_namespace; + dst_local->container_scope = src_scope; dst_local->root_scope = src_local->root_scope; dst_local->location_cases = src_local->location_cases; chunk_local_off += 1; From 7383cdc5aed4a893658e7b38ebe0ddeda15b7df7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 16 Apr 2026 16:45:34 -0700 Subject: [PATCH 402/850] fix dumper for new symbols/locations format; produce dummy global unit for global stream pdb info - avoid stomping on 0 unit; fix stomping of location info, from missing lane sync --- src/raddbg/raddbg_main.c | 7 +- src/rdi/rdi_local.c | 37 ++++-- src/rdi_from_pdb/rdi_from_pdb.c | 202 ++++++++++++++++++-------------- src/rdi_make/rdi_make_local.c | 16 ++- 4 files changed, 159 insertions(+), 103 deletions(-) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 3fc9e08e..6982e501 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,8 @@ //////////////////////////////// //~ rjf: post-0.9.25 TODO notes // +// [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! +// //- evaluation space coverage pass // [ ] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces // [ ] need concrete ways of referring into a space at any offset - e.g. `process.memory + 0x1234`, `file:"foo".data + 0x1234`, `thread.regs + 0x80`, etc. @@ -21,7 +23,10 @@ // [ ] broadly, view discoverability / docs // [ ] signify empty watch window "expression" slot more as a text field? // -//- jeff viz notes +//- jeff notes +// [ ] option to prefer addresses first with string ptrs +// [ ] focus changing on f10/f11? may be related to auto_run/auto_step - look at a bin/jeffr +// [ ] option to turn off transient tabs altogether // [ ] single-line viz for pointers w/ bad (unmapped) addresses // //- namespace/locations/variables RDI pass diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 9ccc12df..df17d233 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -747,12 +747,16 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse dumpf("\n // unit[%I64u]\n {\n", idx); dumpf(" unit_name: '%S'\n", str8_from_rdi_string_idx(rdi, unit->unit_name_string_idx)); dumpf(" compiler_name: '%S'\n", str8_from_rdi_string_idx(rdi, unit->compiler_name_string_idx)); - dumpf(" source_file_path: %u\n", unit->source_file_path_node); - dumpf(" object_file_path: %u\n", unit->object_file_path_node); - dumpf(" archive_file_path: %u\n", unit->archive_file_path_node); - dumpf(" build_path: %u\n", unit->build_path_node); - dumpf(" language: %S\n", rdi_string_from_language(scratch.arena, unit->language)); - dumpf(" line_table_idx: %u\n", unit->line_table_idx); + dumpf(" source_file_path: %u\n", unit->source_file_path_node); + dumpf(" object_file_path: %u\n", unit->object_file_path_node); + dumpf(" archive_file_path: %u\n", unit->archive_file_path_node); + dumpf(" build_path: %u\n", unit->build_path_node); + dumpf(" language: %S\n", rdi_string_from_language(scratch.arena, unit->language)); + dumpf(" line_table_idx: %u\n", unit->line_table_idx); + dumpf(" procedures_idx_range: [%u, %u)\n", unit->procedures_first_idx, unit->procedures_first_idx + unit->procedures_count); + dumpf(" global_variables_idx_range: [%u, %u)\n", unit->global_variables_first_idx, unit->global_variables_first_idx + unit->global_variables_count); + dumpf(" thread_variables_idx_range: [%u, %u)\n", unit->thread_variables_first_idx, unit->thread_variables_first_idx + unit->thread_variables_count); + dumpf(" constants_idx_range: [%u, %u)\n", unit->constants_first_idx, unit->constants_first_idx + unit->constants_count); dumpf(" }\n"); scratch_end(scratch); } @@ -996,6 +1000,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse ////////////////////////////// //- rjf: dump global variables // +#if 0 // TODO(rjf): @locpass DumpSubset(GlobalVariables) { U64 count = 0; @@ -1014,6 +1019,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse scratch_end(scratch); } } +#endif ////////////////////////////// //- rjf: dump global variables vmap @@ -1033,6 +1039,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse ////////////////////////////// //- rjf: dump thread variables // +#if 0 // TODO(rjf): @locpass DumpSubset(ThreadVariables) { U64 count = 0; @@ -1051,10 +1058,12 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse scratch_end(scratch); } } +#endif ////////////////////////////// //- rjf: dump constants // +#if 0 // TODO(rjf): @locpass DumpSubset(Constants) { U64 count = 0; @@ -1068,10 +1077,12 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse dumpf(" }\n"); } } +#endif ////////////////////////////// //- rjf: dump procedures // +#if 0 // TODO(rjf): @locpass DumpSubset(Procedures) { RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); @@ -1103,6 +1114,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse scratch_end(scratch); } } +#endif ////////////////////////////// //- rjf: dump symbols @@ -1143,7 +1155,18 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse { dumpf(" root_scope_idx: %u\n", symbol->root_scope_idx); } - dumpf(" container_idx: %u\n", symbol->container_idx); + if(symbol->container_idx != 0 && (symbol->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Type) + { + dumpf(" container_type_idx: %u\n", symbol->container_idx); + } + if(symbol->container_idx != 0 && (symbol->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Scope) + { + dumpf(" container_scope_idx: %u\n", symbol->container_idx); + } + if(symbol->container_idx != 0 && (symbol->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Namespace) + { + dumpf(" container_namespace_idx: %u\n", symbol->container_idx); + } // TODO(rjf): location info dumpf(" }\n"); scratch_end(scratch); diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index fc95c8c1..a5c02b6d 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -624,14 +624,14 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Rng1U64ChunkList *unit_ranges = 0; ProfScope("bucket compilation unit contributions") if(lane_idx() == 0) { - unit_ranges = push_array(scratch.arena, RDIM_Rng1U64ChunkList, comp_units->count); - for(U64 idx = 0; idx < comp_unit_contributions->count; idx += 1) + unit_ranges = push_array(scratch.arena, RDIM_Rng1U64ChunkList, comp_units->count + 1); + for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_contributions->count; comp_unit_idx += 1) { - PDB_CompUnitContribution *contribution = &comp_unit_contributions->contributions[idx]; + PDB_CompUnitContribution *contribution = &comp_unit_contributions->contributions[comp_unit_idx]; if(contribution->mod < comp_units->count) { RDIM_Rng1U64 r = {contribution->voff_first, contribution->voff_opl}; - rdim_rng1u64_chunk_list_push(arena, &unit_ranges[contribution->mod], 256, r); + rdim_rng1u64_chunk_list_push(arena, &unit_ranges[contribution->mod + 1], 256, r); } } } @@ -833,8 +833,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: prep outputs ProfScope("prep outputs") if(lane_idx() == 0) { - unit_file_stubs = push_array(scratch.arena, P2R_SrcFileStubArray, comp_units->count); - unit_file_paths_hashes = push_array(scratch.arena, U64Array, comp_units->count); + unit_file_stubs = push_array(scratch.arena, P2R_SrcFileStubArray, comp_units->count + 1); + unit_file_paths_hashes = push_array(scratch.arena, U64Array, comp_units->count + 1); } lane_sync_u64(&unit_file_stubs, 0); lane_sync_u64(&unit_file_paths_hashes, 0); @@ -856,19 +856,21 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { //- rjf: take next unit U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(unit_idx >= comp_units->count) + if(unit_idx >= comp_units->count + 1) { break; } //- rjf: unpack unit - PDB_CompUnit *unit = comp_units->units[unit_idx]; - CV_SymParsed *sym = all_syms[unit_idx+1]; - CV_C13Parsed *c13 = all_c13s[unit_idx+1]; + CV_SymParsed *sym = all_syms[unit_idx]; + CV_C13Parsed *c13 = all_c13s[unit_idx]; //- rjf: produce obj name/path - String8 obj_name = unit->obj_name; + String8 obj_name = str8_lit("*global*"); + if(unit_idx > 0) { + PDB_CompUnit *comp_unit = comp_units->units[unit_idx-1]; + obj_name = comp_unit->obj_name; if(str8_match(obj_name, str8_lit("* Linker *"), 0) || str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) { @@ -1026,57 +1028,60 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } // rjf: find all files in this unit's (non-inline) line info - ProfScope("find all files in this unit's (non-inline) line info") - for(CV_C13SubSectionNode *node = c13->first_sub_section; - node != 0; - node = node->next) + if(c13 != 0) { - if(node->kind == CV_C13SubSectionKind_Lines) + ProfScope("find all files in this unit's (non-inline) line info") + for(CV_C13SubSectionNode *node = c13->first_sub_section; + node != 0; + node = node->next) { - for(CV_C13LinesParsedNode *lines_n = node->lines_first; - lines_n != 0; - lines_n = lines_n->next) + if(node->kind == CV_C13SubSectionKind_Lines) { - // rjf: file name -> sanitized file path - String8 file_path = lines_n->v.file_name; - String8 file_path_sanitized = str8_copy(scratch2.arena, str8_skip_chop_whitespace(file_path)); + for(CV_C13LinesParsedNode *lines_n = node->lines_first; + lines_n != 0; + lines_n = lines_n->next) { - PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); - String8List file_path_sanitized_parts = str8_split_path(scratch2.arena, file_path_sanitized); - if(file_path_sanitized_style == PathStyle_Relative) + // rjf: file name -> sanitized file path + String8 file_path = lines_n->v.file_name; + String8 file_path_sanitized = str8_copy(scratch2.arena, str8_skip_chop_whitespace(file_path)); { - String8List obj_folder_path_parts = str8_split_path(scratch2.arena, obj_folder_path); - str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); - file_path_sanitized_parts = obj_folder_path_parts; - file_path_sanitized_style = path_style_from_str8(obj_folder_path); + PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); + String8List file_path_sanitized_parts = str8_split_path(scratch2.arena, file_path_sanitized); + if(file_path_sanitized_style == PathStyle_Relative) + { + String8List obj_folder_path_parts = str8_split_path(scratch2.arena, obj_folder_path); + str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); + file_path_sanitized_parts = obj_folder_path_parts; + file_path_sanitized_style = path_style_from_str8(obj_folder_path); + } + str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); + file_path_sanitized = str8_path_list_join_by_style(scratch2.arena, &file_path_sanitized_parts, file_path_sanitized_style); } - str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); - file_path_sanitized = str8_path_list_join_by_style(scratch2.arena, &file_path_sanitized_parts, file_path_sanitized_style); - } - - // rjf: sanitized file path -> source file node - U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); - U64 hit_path_slot = file_path_sanitized_hash%hit_path_slots_count; - String8Node *hit_path_node = 0; - for(String8Node *n = hit_path_slots[hit_path_slot]; n != 0; n = n->next) - { - if(str8_match(n->string, file_path_sanitized, 0)) + + // rjf: sanitized file path -> source file node + U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); + U64 hit_path_slot = file_path_sanitized_hash%hit_path_slots_count; + String8Node *hit_path_node = 0; + for(String8Node *n = hit_path_slots[hit_path_slot]; n != 0; n = n->next) { - hit_path_node = n; - break; + if(str8_match(n->string, file_path_sanitized, 0)) + { + hit_path_node = n; + break; + } + } + if(hit_path_node == 0) + { + hit_path_node = push_array(scratch2.arena, String8Node, 1); + SLLStackPush(hit_path_slots[hit_path_slot], hit_path_node); + hit_path_node->string = file_path_sanitized; + P2R_SrcFileStubNode *stub_n = push_array(scratch2.arena, P2R_SrcFileStubNode, 1); + SLLQueuePush(first_src_file_stub, last_src_file_stub, stub_n); + src_file_stub_count += 1; + stub_n->v.file_path = str8_copy(scratch.arena, file_path_sanitized); + stub_n->v.checksum_kind = lines_n->v.checksum_kind; + stub_n->v.checksum = str8_copy(scratch.arena, lines_n->v.checksum); } - } - if(hit_path_node == 0) - { - hit_path_node = push_array(scratch2.arena, String8Node, 1); - SLLStackPush(hit_path_slots[hit_path_slot], hit_path_node); - hit_path_node->string = file_path_sanitized; - P2R_SrcFileStubNode *stub_n = push_array(scratch2.arena, P2R_SrcFileStubNode, 1); - SLLQueuePush(first_src_file_stub, last_src_file_stub, stub_n); - src_file_stub_count += 1; - stub_n->v.file_path = str8_copy(scratch.arena, file_path_sanitized); - stub_n->v.checksum_kind = lines_n->v.checksum_kind; - stub_n->v.checksum = str8_copy(scratch.arena, lines_n->v.checksum); } } } @@ -1186,13 +1191,13 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) all_units_ptr = push_array(scratch.arena, RDIM_UnitChunkList, 1); if(params->subset_flags & RDIM_SubsetFlag_Units) { - for EachIndex(idx, comp_units->count) + for EachIndex(idx, comp_units->count + 1) { - rdim_unit_chunk_list_push(arena, all_units_ptr, comp_units->count); + rdim_unit_chunk_list_push(arena, all_units_ptr, comp_units->count + 1); } } - units_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, comp_units->count); - units_first_inline_site_line_tables = push_array(scratch.arena, RDIM_LineTable *, comp_units->count); + units_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, comp_units->count + 1); + units_first_inline_site_line_tables = push_array(scratch.arena, RDIM_LineTable *, comp_units->count + 1); } lane_sync_u64(&all_units_ptr, 0); lane_sync_u64(&units_line_tables, 0); @@ -1212,42 +1217,61 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { //- rjf: take next unit U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(unit_idx >= comp_units->count) + if(unit_idx >= units_count) { break; } Temp scratch = scratch_begin(&arena, 1); RDIM_LineTableChunkList *dst_line_tables = &units_line_tables[unit_idx]; - PDB_CompUnit *src_unit = comp_units->units[unit_idx]; - CV_SymParsed *src_unit_sym = all_syms[unit_idx+1]; - CV_C13Parsed *src_unit_c13 = all_c13s[unit_idx+1]; + PDB_CompUnit *src_unit = (unit_idx > 0 ? comp_units->units[unit_idx-1] : 0); + CV_SymParsed *src_unit_sym = all_syms[unit_idx]; + CV_C13Parsed *src_unit_c13 = all_c13s[unit_idx]; RDIM_Unit *dst_unit = 0; if(params->subset_flags & RDIM_SubsetFlag_Units) { dst_unit = &units[unit_idx]; } // rjf: extract unit name - String8 unit_name = src_unit->obj_name; - if(unit_name.size != 0) + String8 unit_name = {0}; + if(src_unit != 0) { - String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); - if(unit_name_past_last_slash.size != 0) + unit_name = src_unit->obj_name; + if(unit_name.size != 0) { - unit_name = unit_name_past_last_slash; + String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); + if(unit_name_past_last_slash.size != 0) + { + unit_name = unit_name_past_last_slash; + } } } + else + { + unit_name = str8_lit("*global*"); + } // rjf: produce obj name/path - String8 obj_name = src_unit->obj_name; - if(str8_match(obj_name, str8_lit("* Linker *"), 0) || - str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) + String8 obj_name = {0}; + if(src_unit != 0) { - MemoryZeroStruct(&obj_name); + obj_name = src_unit->obj_name; + if(str8_match(obj_name, str8_lit("* Linker *"), 0) || + str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) + { + MemoryZeroStruct(&obj_name); + } } String8 obj_folder_path = backslashed_from_str8(scratch.arena, str8_chop_last_slash(obj_name)); + // rjf: extract unit group name + String8 group_name = {0}; + if(src_unit != 0) + { + group_name = src_unit->group_name; + } + //- rjf: main unit line table conversion - if(params->subset_flags & RDIM_SubsetFlag_LineInfo) ProfScope("main unit line table conversion") + RDIM_LineTable *line_table = 0; + if(params->subset_flags & RDIM_SubsetFlag_LineInfo && src_unit_c13 != 0) ProfScope("main unit line table conversion") { - RDIM_LineTable *line_table = 0; for(CV_C13SubSectionNode *node = src_unit_c13->first_sub_section; node != 0; node = node->next) @@ -1305,18 +1329,18 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } } } - - // rjf: fill unit - if(dst_unit != 0) - { - dst_unit->unit_name = unit_name; - dst_unit->compiler_name = src_unit_sym->info.compiler_name; - dst_unit->object_file = obj_name; - dst_unit->archive_file = src_unit->group_name; - dst_unit->language = p2r_rdi_language_from_cv_language(src_unit_sym->info.language); - dst_unit->line_table = line_table; - dst_unit->voff_ranges = unit_ranges[unit_idx]; - } + } + + //- rjf: fill unit + if(dst_unit != 0) + { + dst_unit->unit_name = unit_name; + dst_unit->compiler_name = src_unit_sym->info.compiler_name; + dst_unit->object_file = obj_name; + dst_unit->archive_file = group_name; + dst_unit->language = p2r_rdi_language_from_cv_language(src_unit_sym->info.language); + dst_unit->line_table = line_table; + dst_unit->voff_ranges = unit_ranges[unit_idx]; } //- rjf: build per-inline-site line tables @@ -1526,7 +1550,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_LineTableChunkList *all_line_tables_ptr = &all_line_tables; ProfScope("join all line tables") if(lane_idx() == 0) { - for EachIndex(idx, comp_units->count) + for EachIndex(idx, comp_units->count + 1) { rdim_line_table_chunk_list_concat_in_place(&all_line_tables, &units_line_tables[idx]); } @@ -3271,7 +3295,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // if(lane_idx() == 0) { - syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); + syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); } lane_sync_u64(&syms_typedefs, 0); @@ -3311,7 +3335,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 sym_constants_chunk_cap = 2048; U64 sym_scopes_chunk_cap = 4096; U64 sym_inline_sites_chunk_cap = 2048; - RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx > 0 ? sym_idx-1 : 0]; + RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; RDIM_SymbolChunkList *sym_thread_variables = &sym_unit->thread_variables; @@ -3474,7 +3498,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: unpack global's container scope RDIM_Scope *container_scope = 0; - if(container_type == 0 && top_scope_node != 0) + if(container_type == 0 && top_scope_node != 0 && iter.kind == CV_SymKind_LDATA32) { container_scope = top_scope_node->scope; } diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index f4ee7f59..a2dc7532 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3323,7 +3323,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) #endif ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage bake units, symbols, types, UDTs + //- rjf: @rdim_bake_stage bake units, types, inline sites // RDI_Unit *baked_units = 0; U64 baked_units_count = 0; @@ -3639,6 +3639,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } + lane_sync(); //////////////////////////// //- rjf: lay out indirected location data @@ -3777,12 +3778,15 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } // rjf: fill virtual offset ranges of location set elements - U64 loc_set_element_idx = 0; - for EachNode(c, RDIM_LocationCase, src->location_cases.first) + if(src->location_cases.count > 1) { - dst_loc_set_elements[loc_set_element_idx].voff_first = c->voff_range.min; - dst_loc_set_elements[loc_set_element_idx].voff_opl = c->voff_range.max; - loc_set_element_idx += 1; + U64 loc_set_element_idx = 0; + for EachNode(c, RDIM_LocationCase, src->location_cases.first) + { + dst_loc_set_elements[loc_set_element_idx].voff_first = c->voff_range.min; + dst_loc_set_elements[loc_set_element_idx].voff_opl = c->voff_range.max; + loc_set_element_idx += 1; + } } // rjf: fill location(s) From 2bf57c065afa4fd8083c9bea2b2498ba13049220 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 16 Apr 2026 17:10:39 -0700 Subject: [PATCH 403/850] new location info format dumping --- src/lib_rdi/rdi.h | 1 + src/rdi/rdi.mdesk | 1 + src/rdi/rdi_local.c | 95 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index c37753f9..0ab0fcb2 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -1238,6 +1238,7 @@ typedef RDI_U64 RDI_Location; #define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) +#define rdi_bytecode_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_AddrBytecodeStream || rdi_kind_from_location(l) == RDI_LocationKind_ValBytecodeStream ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0) #define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0) #define rdi_location_voff(voff) ((((RDI_U64)RDI_LocationKind_ModuleOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((voff) & ~RDI_Location_KindMask)) diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index fd324eb8..fc476d53 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1248,6 +1248,7 @@ RDI_LocationSetElementMemberTable: `#define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; + `#define rdi_bytecode_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_AddrBytecodeStream || rdi_kind_from_location(l) == RDI_LocationKind_ValBytecodeStream ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0)`; `#define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0)`; `#define rdi_location_voff(voff) ((((RDI_U64)RDI_LocationKind_ModuleOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((voff) & ~RDI_Location_KindMask))`; diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index df17d233..493a3524 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1134,6 +1134,8 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse }; for EachElement(symbol_table_idx, symbol_tables) { + U64 all_bytecode_size = 0; + RDI_U8 *all_bytecode = rdi_table_from_name(rdi, LocationsBytecodeData, &all_bytecode_size); DumpSubsetKind(symbol_tables[symbol_table_idx].subset) { String8 table_name = rdi_name_lowercase_from_dump_subset_table[symbol_tables[symbol_table_idx].subset]; @@ -1167,7 +1169,98 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse { dumpf(" container_namespace_idx: %u\n", symbol->container_idx); } - // TODO(rjf): location info + if(rdi_kind_from_location(symbol->location) != RDI_LocationKind_NULL) + { + RDI_Location *locations = &symbol->location; + RDI_LocationSetElement *locations_set_elements = 0; + U64 locations_count = 1; + U64 stride = sizeof(RDI_LocationSetElement); + if(rdi_kind_from_location(symbol->location) == RDI_LocationKind_Set) + { + U64 set_element_first_idx = rdi_set_first_index_from_location(symbol->location); + U64 set_element_count = rdi_set_count_from_location(symbol->location); + locations_set_elements = rdi_element_from_name_idx(rdi, LocationsSetElements, set_element_first_idx); + locations = &locations_set_elements[0].location; + locations_count = set_element_count; + } + for EachIndex(location_idx, locations_count) + { + RDI_Location location = *(RDI_Location *)((RDI_U8 *)locations + stride*location_idx); + Rng1U64 location_vaddr_range = r1u64(0, max_U64); + if(locations_set_elements) + { + location_vaddr_range = r1u64(locations_set_elements[location_idx].voff_first, locations_set_elements[location_idx].voff_opl); + } + String8 location_kind_string = {0}; + if(0){} +#define X(n) else if(rdi_kind_from_location(location) == RDI_LocationKind_##n) { location_kind_string = str8_lit(#n); } + RDI_LocationKind_XList +#undef X + dumpf(" location:\n"); + dumpf(" {\n"); + dumpf(" kind: %S\n", location_kind_string); + if(location_vaddr_range.min == 0 && location_vaddr_range.max == max_U64) + { + dumpf(" range: *always*\n"); + } + else + { + dumpf(" range: [0x%I64x, 0x%I64x)\n", location_vaddr_range.min, location_vaddr_range.max); + } + switch((RDI_LocationKindEnum)rdi_kind_from_location(location)) + { + case RDI_LocationKind_NULL: + { + dumpf(" *invalid* // null location kind\n"); + }break; + case RDI_LocationKind_Set: + { + dumpf(" *invalid* // set inside of set\n"); + }break; + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: + { + U64 bytecode_data_off = rdi_bytecode_data_off_from_location(location); + U64 bytecode_data_opl = all_bytecode_size; + RDI_U8 *bytecode_ptr = rdi_element_from_name_idx(rdi, LocationsBytecodeData, bytecode_data_off); + String8 bytecode = str8(bytecode_ptr, bytecode_data_opl - bytecode_data_off); + String8 bytecode_stringification = rdi_string_from_bytecode(scratch.arena, tli->arch, bytecode); + dumpf(" bytecode: { %S }\n", bytecode_stringification); + }break; + case RDI_LocationKind_AddrRegPlusU16: + case RDI_LocationKind_AddrAddrRegPlusU16: + { + RDI_RegCode reg_code = rdi_regcode_from_location(location); + U64 reg_off = rdi_regoff_from_location(location); + String8 reg_code_string = rdi_string_from_reg_code(scratch.arena, tli->arch, reg_code); + dumpf(" reg: %S\n", reg_code_string); + dumpf(" reg_off: 0x%I64x\n", reg_off); + }break; + case RDI_LocationKind_ValReg: + { + RDI_RegCode reg_code = rdi_regcode_from_location(location); + String8 reg_code_string = rdi_string_from_reg_code(scratch.arena, tli->arch, reg_code); + dumpf(" reg: %S\n", reg_code_string); + }break; + case RDI_LocationKind_ModuleOff: + { + U64 off = rdi_voff_from_location(location); + dumpf(" voff: 0x%I64x\n", off); + }break; + case RDI_LocationKind_TLSOff: + { + U64 off = rdi_toff_from_location(location); + dumpf(" toff: 0x%I64x\n", off); + }break; + case RDI_LocationKind_ConstantDataOff: + { + U64 off = rdi_constant_data_off_from_location(location); + dumpf(" constant_data_off: 0x%I64x\n", off); + }break; + } + dumpf(" }\n"); + } + } dumpf(" }\n"); scratch_end(scratch); } From 6764e1281efbcfdd94ae0f374dcc73980d93a807 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 17 Apr 2026 05:31:07 -0700 Subject: [PATCH 404/850] setting for preferring displaying pointer addresses before contents --- .../eval_visualization_core.c | 46 ++++++++++++++----- .../eval_visualization_core.h | 13 +++--- src/mule/mule_main.cpp | 11 +++++ src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 6 ++- src/raddbg/raddbg_core.c | 11 +++-- src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_views.c | 2 +- src/raddbg/raddbg_widgets.c | 2 +- 9 files changed, 68 insertions(+), 26 deletions(-) diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index dc2493f4..27660cf8 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1812,6 +1812,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) B32 did_prefix_content; B32 did_prefix_string; B32 did_redirect; + B32 did_pre_prefix_ptr; }; EV_StringPtrData *ptr_data = it->top_task->user_data; if(ptr_data == 0) @@ -1833,10 +1834,29 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) { default:{}break; - //- rjf: step 0 -> try "prefix content", which we want to print before the pointer value, - // like strings or symbol names + //- rjf: step 0: do pre-prefix pointer value if requested case 0: { + if(!(params->flags & EV_StringFlag_DisableAddresses) && + params->flags & EV_StringFlag_AddressesBeforeContent) + { + *out_string = str8_from_u64(arena, ptr_data->value_eval.value.u64, 16, 0, 0); + ptr_data->did_pre_prefix_ptr = 1; + } + need_pop = 0; + }break; + + //- rjf: step 1 -> try "prefix content", which we want to print before the pointer value, + // like strings or symbol names + case 1: + { + // rjf: choose prefix + String8 pre_prefix = {0}; + if(ptr_data->did_pre_prefix_ptr) + { + pre_prefix = str8_lit(" -> "); + } + // rjf: try strings if(!(ptr_data->type->flags & E_TypeFlag_IsNotText) && !ptr_data->did_prefix_content && ptr_data->ptee_has_string && @@ -1899,7 +1919,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) } // rjf: report - *out_string = push_str8_copy(arena, string__escaped_and_quoted); + *out_string = str8f(arena, "%S%S", pre_prefix, string__escaped_and_quoted); ptr_data->did_prefix_content = 1; ptr_data->did_prefix_string = 1; @@ -2017,11 +2037,12 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0); str8_list_push(scratch.arena, &list, name); e_type_rhs_string_from_key(scratch.arena, type, &list, 0); - *out_string = str8_list_join(arena, &list, 0); + String8 joined = str8_list_join(scratch.arena, &list, 0); + *out_string = str8f(arena, "%S%S", pre_prefix, joined); } else { - *out_string = push_str8_copy(arena, name); + *out_string = str8f(arena, "%S%S", pre_prefix, name); } good_symbol_match = (out_string->size != 0); @@ -2031,7 +2052,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) // rjf: if we have a function type, but we did not generate any name, then just put a ??? if(out_string->size == 0 && e_type_kind_from_key(ptr_data->type->direct_type_key) == E_TypeKind_Function) { - *out_string = str8_lit("???"); + *out_string = str8f(arena, "%S???", pre_prefix); good_symbol_match = 1; } } @@ -2048,7 +2069,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) String8 procedure_name = {0}; procedure_name.str = rdi_name_from_procedure(rdi, procedure, &procedure_name.size); - *out_string = procedure_name; + *out_string = str8f(arena, "%S%S", pre_prefix, procedure_name); good_symbol_match = (procedure_name.size != 0); } @@ -2081,8 +2102,8 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) } }break; - //- rjf: step 1 -> do pointer value + descend if needed - case 1: + //- rjf: step 2 -> do pointer value + descend if needed + case 2: { Temp scratch = scratch_begin(&arena, 1); String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, 16, 0, 0); @@ -2093,7 +2114,8 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) // // rjf: [read only] if we did prefix content, do a parenthesized pointer value - if(!(params->flags & EV_StringFlag_DisableAddresses) && params->flags & EV_StringFlag_ReadOnlyDisplayRules && + if(!ptr_data->did_pre_prefix_ptr && + !(params->flags & EV_StringFlag_DisableAddresses) && params->flags & EV_StringFlag_ReadOnlyDisplayRules && ptr_data->did_prefix_content) { *out_string = push_str8f(arena, " (%S)", ptr_value_string); @@ -2101,7 +2123,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) // rjf: [read only] if we did *not* do any prefix content, but we have content, // do " -> " then descend - else if(params->flags & EV_StringFlag_ReadOnlyDisplayRules && !ptr_data->did_prefix_content && ptr_data->ptee_has_content) + else if(!ptr_data->did_pre_prefix_ptr && params->flags & EV_StringFlag_ReadOnlyDisplayRules && !ptr_data->did_prefix_content && ptr_data->ptee_has_content) { if(!(params->flags & EV_StringFlag_DisableAddresses)) { @@ -2126,7 +2148,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) } // rjf: [writeable, catchall] if we did *not* do any prefix content, do "" - else if(!ptr_data->did_prefix_content) + else if(!ptr_data->did_pre_prefix_ptr && !ptr_data->did_prefix_content) { *out_string = push_str8_copy(arena, ptr_value_string); } diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index daf46c2e..0d9a788b 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -227,12 +227,13 @@ struct EV_WindowedRowList typedef U32 EV_StringFlags; enum { - EV_StringFlag_ReadOnlyDisplayRules = (1<<0), - EV_StringFlag_PrettyNames = (1<<1), - EV_StringFlag_DisableAddresses = (1<<2), - EV_StringFlag_DisableStrings = (1<<3), - EV_StringFlag_DisableChars = (1<<4), - EV_StringFlag_DisableStringQuotes = (1<<5), + EV_StringFlag_ReadOnlyDisplayRules = (1<<0), + EV_StringFlag_PrettyNames = (1<<1), + EV_StringFlag_DisableAddresses = (1<<2), + EV_StringFlag_DisableStrings = (1<<3), + EV_StringFlag_DisableChars = (1<<4), + EV_StringFlag_DisableStringQuotes = (1<<5), + EV_StringFlag_AddressesBeforeContent = (1<<6), }; typedef struct EV_StringParams EV_StringParams; diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 1c81f570..97fe3be8 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -404,6 +404,15 @@ few_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){ } +// +// NOTE(rjf): this doesn't work because MSVC - despite GENERATING DEBUG INFO +// FOR THE MyByte TYPEDEF - does not actually *reference* this typedef +// anywhere, and instead treats all `MyByte *`s as `char *`s, thus completely +// eliminating the point of the typedef and view. :( +// +typedef char MyByte; +raddbg_type_view(MyByte *, no_string($)); + static void type_coverage_eval_tests(void) { @@ -440,6 +449,8 @@ type_coverage_eval_tests(void) const char const_string_array[] = "Hello, World!"; const char *const const_ptr_const_string = "Hello, World!"; + MyByte *non_string_byte_ptr = "Hello, World!"; + void *pointer = &basics; Basics *pointer_to_basics = &basics; Basics **pointer_to_pointer_to_basics = &pointer_to_basics; diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 8101e7fc..72f090c4 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -429,7 +429,7 @@ RD_VocabInfo rd_vocab_info_table[360] = RD_NameSchemaInfo rd_name_schema_info_table[26] = { {str8_lit_comp("user"), str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': query,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, -{str8_lit_comp("project"), str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': query,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, +{str8_lit_comp("project"), str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': query,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, {str8_lit_comp("tab"), str8_lit_comp("@row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\nx:\n{\n @override @display_name('Tab Font Size') @description(\"Controls the tab's font size.\") @no_callee_helper\n 'font_size': @range[6, 72] u64,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index f4fe2100..0f83ea5d 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -228,8 +228,8 @@ RD_VocabTable: { //- rjf: users / projects { - user - ``` + user, + ``` @expand_commands(edit_user_theme) x: { //- rjf: animations @@ -317,6 +317,8 @@ RD_VocabTable: @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64, //- rjf: visualizers + @display_name('Display Pointer Addresses Before Contents') @description("When visualizing pointers, always shows the address first, before showing contents at the pointer's address.") + @default(0) display_pointer_addresses_before_contents: bool, @display_name('Use Default C++ STL Type Visualizers') @description("Enables the built-in type views for C++ STL types.") @default(1) use_default_stl_type_views: bool, @display_name('Use Default Unreal Engine Type Visualizers') @description("Enables the built-in type views for Unreal Engine types.") diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 45599767..8e1d89c9 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1972,7 +1972,7 @@ rd_view_ui(Rng2F32 rect) F32 row_height_px = ui_top_px_height(); S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); F32 row_string_max_size_px = dim_2f32(rect).x; - EV_StringFlags string_flags = EV_StringFlag_ReadOnlyDisplayRules; + EV_StringFlags string_flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags; String8 filter = rd_view_query_input(); Vec4F32 pop_background_rgba = {0}; UI_TagF("pop") pop_background_rgba = ui_color_from_name(str8_lit("background")); @@ -5559,7 +5559,7 @@ rd_window_frame(void) { ui_spacer(ui_em(1.5f, 1.f)); } - EV_StringParams string_params = {EV_StringFlag_ReadOnlyDisplayRules, .radix = 16}; + EV_StringParams string_params = {EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = 16}; String8 thread_handle_string = ctrl_string_from_handle(scratch.arena, ctrl_entity->handle); for(U64 idx = 0; idx < 16; idx += 1) { @@ -5589,7 +5589,7 @@ rd_window_frame(void) E_Eval eval = e_eval_from_string(rd_state->drag_drop_regs->expr); if(eval.irtree.mode != E_Mode_Null) { - EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10}; + EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = 10}; String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval); if(value_string.size != 0) { @@ -12013,6 +12013,11 @@ rd_frame(void) rd_state->alt_menu_bar_enabled = rd_setting_b32_from_name(str8_lit("focus_menu_bar_with_alt")); rd_state->use_default_stl_type_views = rd_setting_b32_from_name(str8_lit("use_default_stl_type_views")); rd_state->use_default_ue_type_views = rd_setting_b32_from_name(str8_lit("use_default_ue_type_views")); + rd_state->eval_viz_base_string_flags = 0; + if(rd_setting_b32_from_name(str8_lit("display_pointer_addresses_before_contents"))) + { + rd_state->eval_viz_base_string_flags |= EV_StringFlag_AddressesBeforeContent; + } //////////////////////////// //- rjf: autosave if needed diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index cfd8d2ac..03a579fa 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -403,6 +403,7 @@ struct RD_State B32 alt_menu_bar_enabled; B32 use_default_stl_type_views; B32 use_default_ue_type_views; + EV_StringFlags eval_viz_base_string_flags; // rjf: animation rates F32 catchall_animation_rate; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 00540cce..fa5b52e0 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -3778,7 +3778,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { EV_StringParams params = { - .flags = EV_StringFlag_ReadOnlyDisplayRules, + .flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = rd_view_setting_u64_from_name(str8_lit("default_radix")), }; String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), ¶ms, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, peek_eval); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 4a99be51..e4ad86f4 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2119,7 +2119,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe String8 eval_string = {0}; if(!e_type_key_match(e_type_key_zero(), eval.irtree.type_key)) { - EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10}; + EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = 10}; eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, params->font_size*60.f, eval); } ui_spacer(ui_em(1.5f, 1.f)); From 881e19c8429fb309278e89163008bf62c9cb1a88 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 18 Apr 2026 11:40:06 -0700 Subject: [PATCH 405/850] get debugger onto new location info & symbol format --- project.4coder | 2 +- src/ctrl/ctrl_core.c | 18 +- src/dbg_info/dbg_info.c | 22 +- src/disasm/disasm.c | 2 +- src/eval/eval_core.c | 97 +++- src/eval/eval_core.h | 7 +- src/eval/eval_interpret.c | 43 +- src/eval/eval_ir.c | 138 +++--- src/eval/eval_ir.h | 2 +- .../eval_visualization_core.c | 4 +- src/lib_rdi/rdi.c | 11 +- src/lib_rdi/rdi.h | 262 +--------- src/lib_rdi/rdi_parse.c | 77 ++- src/lib_rdi/rdi_parse.h | 32 +- src/lib_rdi_make/rdi_make.c | 81 ---- src/lib_rdi_make/rdi_make.h | 69 --- src/mule/mule_main.cpp | 11 +- src/radbin/radbin.c | 4 +- src/raddbg/raddbg_core.c | 18 +- src/raddbg/raddbg_eval.c | 38 +- src/raddbg/raddbg_views.c | 11 +- src/raddbg/raddbg_widgets.c | 2 +- src/rdi/rdi.mdesk | 284 +---------- src/rdi/rdi_local.c | 232 +-------- src/rdi/rdi_local.h | 5 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 7 - src/rdi_from_pdb/rdi_from_pdb.c | 77 +-- src/rdi_from_pdb/rdi_from_pdb.h | 1 - src/rdi_make/rdi_make_local.c | 448 ------------------ 29 files changed, 352 insertions(+), 1653 deletions(-) diff --git a/project.4coder b/project.4coder index a3fc4681..a83c192c 100644 --- a/project.4coder +++ b/project.4coder @@ -48,7 +48,7 @@ commands = //- rjf: [raddbg] // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 97d7e1ac..61170bc7 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -4329,9 +4329,9 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]); - U64 global_var_voff = global_var->voff; - U64 global_var_vaddr = global_var->voff + module->vaddr_range.min; + RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariableSymbols, ids[0]); + U64 global_var_voff = rdi_voff_from_location(global_var->location); + U64 global_var_vaddr = global_var_voff + module->vaddr_range.min; Arch arch = process->arch; U64 addr_size = bit_size_from_arch(arch)/8; dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); @@ -5709,7 +5709,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5743,7 +5743,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5773,7 +5773,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5801,7 +5801,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5835,7 +5835,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5880,7 +5880,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index a49f01b0..fb7ade6e 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1157,17 +1157,11 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * switch(section_kind) { default:{}break; - case RDI_SectionKind_Procedures: + case RDI_SectionKind_ProcedureSymbols: + case RDI_SectionKind_GlobalVariableSymbols: + case RDI_SectionKind_ThreadVariableSymbols: { - element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx); - }break; - case RDI_SectionKind_GlobalVariables: - { - element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx); - }break; - case RDI_SectionKind_ThreadVariables: - { - element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx); + element_name_idx_off = OffsetOf(RDI_Symbol, name_string_idx); }break; case RDI_SectionKind_UDTs: { @@ -1568,10 +1562,10 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g }; read_only local_persist RDI_SectionKind name_map_section_kinds[] = { - RDI_SectionKind_GlobalVariables, - RDI_SectionKind_ThreadVariables, - RDI_SectionKind_Constants, - RDI_SectionKind_Procedures, + RDI_SectionKind_GlobalVariableSymbols, + RDI_SectionKind_ThreadVariableSymbols, + RDI_SectionKind_ConstantSymbols, + RDI_SectionKind_ProcedureSymbols, RDI_SectionKind_TypeNodes, }; Rng1U64 range = lane_range(dbgi_keys.count); diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index eb930f1b..1b201b81 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -419,7 +419,7 @@ dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_o { RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); RDI_U32 procedure_idx = scope->proc_idx; - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_idx); String8 procedure_name = {0}; procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); if(procedure_name.size != 0) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 80150fd6..ba562364 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -590,7 +590,7 @@ e_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) U32 local_opl_idx = scope->local_first + scope->local_count; for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1) { - RDI_Local *local_var = rdi_element_from_name_idx(rdi, Locals, local_idx); + RDI_Symbol *local_var = rdi_element_from_name_idx(rdi, LocalVariableSymbols, local_idx); U64 local_name_size = 0; U8 *local_name_str = rdi_string_from_idx(rdi, local_var->name_string_idx, &local_name_size); String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size)); @@ -612,10 +612,10 @@ e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) //- rjf: tightest scope -> procedure U32 proc_idx = tightest_scope->proc_idx; - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, proc_idx); //- rjf: procedure -> udt - U32 udt_idx = procedure->container_idx; + U32 udt_idx = procedure->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Type ? procedure->container_idx : 0; RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx); //- rjf: build blank map @@ -644,6 +644,97 @@ e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) return map; } +//////////////////////////////// +//~ rjf: RDI Location Info -> Eval Op List + +internal E_OpList +e_oplist_from_location(Arena *arena, RDI_Parsed *rdi, RDI_Location loc) +{ + E_OpList result = {0}; + B32 need_extra_memread = 0; + switch((RDI_LocationKindEnum)rdi_kind_from_location(loc)) + { + case RDI_LocationKind_NULL: + case RDI_LocationKind_Set:{}break; + + //- rjf: bytecode + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_ValBytecodeStream: + { + U64 all_bytecode_size = 0; + U8 *all_bytecode = rdi_table_from_name(rdi, LocationsBytecodeData, &all_bytecode_size); + U64 bytecode_first_idx = rdi_bytecode_data_off_from_location(loc); + bytecode_first_idx = Min(bytecode_first_idx, all_bytecode_size); + U64 bytecode_opl_idx = bytecode_first_idx; + for(U64 off = bytecode_first_idx, next_off = all_bytecode_size; off < all_bytecode_size; off = next_off) + { + next_off = all_bytecode_size; + U8 opcode = all_bytecode[off]; + if(opcode == 0) + { + break; + } + U16 ctrlbits = rdi_eval_op_ctrlbits_table[opcode]; + U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + bytecode_opl_idx += (1 + p_size); + next_off = (off + 1 + p_size); + } + String8 bytecode = str8(all_bytecode + bytecode_first_idx, (bytecode_opl_idx - bytecode_first_idx)); + e_oplist_push_bytecode(arena, &result, bytecode); + }break; + + //- rjf: reg + off + case RDI_LocationKind_AddrRegPlusU16: goto reg_plus_off; + case RDI_LocationKind_AddrAddrRegPlusU16: need_extra_memread = 1; goto reg_plus_off; + reg_plus_off:; + { + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + Arch arch = arch_from_rdi_arch(tli->arch); + U64 arch_addr_bytesize = byte_size_from_arch(arch); + RDI_RegCode regcode = rdi_regcode_from_location(loc); + U64 reg_off = rdi_regoff_from_location(loc); + e_oplist_push_op(arena, &result, RDI_EvalOp_RegRead, e_value_u64(RDI_EncodeRegReadParam(regcode, arch_addr_bytesize, 0))); + e_oplist_push_uconst(arena, &result, reg_off); + e_oplist_push_op(arena, &result, RDI_EvalOp_Add, e_value_u64(0)); + if(need_extra_memread) + { + e_oplist_push_op(arena, &result, RDI_EvalOp_MemRead, e_value_u64(arch_addr_bytesize)); + } + }break; + + //- rjf: reg + case RDI_LocationKind_ValReg: + { + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + Arch arch = arch_from_rdi_arch(tli->arch); + RDI_RegCode rdi_regcode = rdi_regcode_from_location(loc); + REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, rdi_regcode); + REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(arch)[regs_reg_code]; + U64 byte_size = (U64)reg_rng.byte_size; + U64 byte_pos = 0; + e_oplist_push_op(arena, &result, RDI_EvalOp_RegRead, e_value_u64(RDI_EncodeRegReadParam(rdi_regcode, byte_size, byte_pos))); + }break; + + //- rjf: space offsets + case RDI_LocationKind_ModuleOff: + { + U64 voff = rdi_voff_from_location(loc); + e_oplist_push_op(arena, &result, RDI_EvalOp_ModuleOff, e_value_u64(voff)); + }break; + case RDI_LocationKind_TLSOff: + { + U64 toff = rdi_toff_from_location(loc); + e_oplist_push_op(arena, &result, RDI_EvalOp_TLSOff, e_value_u64(toff)); + }break; + case RDI_LocationKind_ConstantDataOff: + { + U64 constant_data_off = rdi_constant_data_off_from_location(loc); + e_oplist_push_uconst(arena, &result, constant_data_off); + }break; + } + return result; +} + //////////////////////////////// //~ rjf: Cache Creation & Selection diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index bf376b9d..0da549be 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -1075,7 +1075,7 @@ struct E_Cache E_CacheParentNode *free_parent_node; //- rjf: unpacked context - RDI_Procedure *thread_ip_procedure; + RDI_Symbol *thread_ip_procedure; //- rjf: [types] JIT-constructed types tables U64 cons_id_gen; @@ -1208,6 +1208,11 @@ internal void e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_Au internal E_String2NumMap *e_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); internal E_String2NumMap *e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff); +//////////////////////////////// +//~ rjf: RDI Location Info -> Eval Op List + +internal E_OpList e_oplist_from_location(Arena *arena, RDI_Parsed *rdi, RDI_Location loc); + //////////////////////////////// //~ rjf: Cache Creation & Selection diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 19f69266..58a81717 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -12,43 +12,22 @@ e_select_interpret_ctx(E_InterpretCtx *ctx, RDI_Parsed *primary_rdi, U64 ip_voff // compute and apply frame base if(primary_rdi != 0) { - E_Interpretation frame_base = { .code = ~0 }; - - RDI_Procedure *proc = rdi_procedure_from_voff(primary_rdi, ip_voff); - for(U64 loc_block_idx = proc->frame_base_location_first; loc_block_idx < proc->frame_base_location_opl; loc_block_idx += 1) + Temp scratch = scratch_begin(0, 0); + RDI_Symbol *proc = rdi_procedure_from_voff(primary_rdi, ip_voff); + RDI_Location location = rdi_location_from_location_voff(primary_rdi, proc->location, ip_voff); + E_OpList oplist = e_oplist_from_location(scratch.arena, primary_rdi, location); + String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); + E_Interpretation frame_base_interpretation = e_interpret(bytecode); + U64 frame_base = frame_base_interpretation.value.u64; + if(frame_base_interpretation.code == E_InterpretationCode_Good) { - RDI_LocationBlock *block = rdi_element_from_name_idx(primary_rdi, LocationBlocks, loc_block_idx); - if (block->scope_off_first <= ip_voff && ip_voff < block->scope_off_opl) { - U64 all_location_data_size = 0; - U8 *all_location_data = rdi_table_from_name(primary_rdi, LocationData, &all_location_data_size); - if(block->location_data_off + sizeof(RDI_LocationKind) <= all_location_data_size) - { - RDI_LocationKind loc_kind = *(RDI_LocationKind *)(all_location_data + block->location_data_off); - if(loc_kind == RDI_LocationKind_ValBytecodeStream || loc_kind == RDI_LocationKind_AddrBytecodeStream) - { - U8 *bytecode_ptr = all_location_data + block->location_data_off; - U8 *bytecode_opl = all_location_data + all_location_data_size; - U64 bytecode_size = rdi_size_from_bytecode_stream(bytecode_ptr, bytecode_opl); - String8 bytecode = str8(bytecode_ptr + sizeof(RDI_LocationKind), bytecode_size); - frame_base = e_interpret(bytecode); - } - else if(loc_kind != RDI_LocationKind_NULL) - { - NotImplemented; - } - } - break; - } - } - - if(frame_base.code == E_InterpretationCode_Good) - { - *ctx->frame_base = frame_base.value.u64; + *ctx->frame_base = frame_base; } else { ctx->frame_base = 0; } + scratch_end(scratch); } } @@ -960,7 +939,7 @@ e_interpret(String8 bytecode) // TODO: add support for pushing multiple values onto the stack NotImplemented; }break; - + case RDI_EvalOp_PushCfa: { nval.u64 = e_interpret_ctx->cfa; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 7beb8014..16585e97 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -971,18 +971,18 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I E_DbgInfo *dbg_info = e_dbg_info_from_module(module); U64 voff = interpretation.value.u64 - module->vaddr_range.min; U64 new_vaddr = 0; - RDI_Procedure *p = rdi_procedure_from_voff(dbg_info->rdi, voff); - RDI_GlobalVariable *g = rdi_global_variable_from_voff(dbg_info->rdi, voff); + RDI_Symbol *p = rdi_procedure_from_voff(dbg_info->rdi, voff); + RDI_Symbol *g = rdi_global_variable_from_voff(dbg_info->rdi, voff); U32 type_idx = 0; if(p->name_string_idx != 0) { type_idx = p->type_idx; new_vaddr = module->vaddr_range.min + rdi_first_voff_from_procedure(dbg_info->rdi, p); } - else if(g->name_string_idx != 0) + else if(g->name_string_idx != 0 && rdi_kind_from_location(g->location) == RDI_LocationKind_ModuleOff) { type_idx = g->type_idx; - new_vaddr = module->vaddr_range.min + g->voff; + new_vaddr = module->vaddr_range.min + rdi_voff_from_location(g->location); } if(type_idx != 0) { @@ -1692,8 +1692,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I B32 string_mapped = 0; B32 string_is_implicit_member_name = 0; E_TypeKey mapped_type_key = zero_struct; - E_Module *mapped_location_block_module = &e_module_nil; - RDI_LocationBlock *mapped_location_block = 0; + E_Module *mapped_location_module = &e_module_nil; + RDI_Location mapped_location = 0; E_Mode mapped_bytecode_mode = E_Mode_Offset; E_Space mapped_bytecode_space = zero_struct; String8 mapped_bytecode = {0}; @@ -1788,7 +1788,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I E_Module *module = e_base_ctx->primary_module; E_DbgInfo *dbg_info = e_dbg_info_from_module(module); RDI_Parsed *rdi = dbg_info->rdi; - RDI_Procedure *procedure = e_cache->thread_ip_procedure; + RDI_Symbol *procedure = e_cache->thread_ip_procedure; RDI_UDT *udt = rdi_container_udt_from_procedure(rdi, procedure); RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); E_TypeKey container_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, module->dbg_info_num); @@ -1810,7 +1810,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I U64 local_num = e_num_from_string(e_ir_ctx->locals_map, string__redirected); if(local_num != 0) { - RDI_Local *local = rdi_element_from_name_idx(rdi, Locals, local_num-1); + RDI_Symbol *local = rdi_element_from_name_idx(rdi, LocalVariableSymbols, local_num-1); // rjf: extract local's type key RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local->type_idx); @@ -1819,16 +1819,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I // rjf: extract local's location block B32 got_location_block = 0; U64 ip_voff = e_base_ctx->thread_ip_voff; - for(U32 loc_block_idx = local->location_first; - loc_block_idx < local->location_opl; - loc_block_idx += 1) { - RDI_LocationBlock *block = rdi_element_from_name_idx(rdi, LocationBlocks, loc_block_idx); - if(block->scope_off_first <= ip_voff && ip_voff < block->scope_off_opl) + mapped_location = rdi_location_from_location_voff(rdi, local->location, ip_voff); + if(mapped_location != 0) { - mapped_location_block_module = module; - mapped_location_block = block; got_location_block = 1; + mapped_location_module = module; } } @@ -1896,7 +1892,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I E_Module *module = e_base_ctx->primary_module; E_DbgInfo *dbg_info = e_dbg_info_from_module(module); RDI_Parsed *rdi = dbg_info->rdi; - RDI_Procedure *procedure = e_cache->thread_ip_procedure; + RDI_Symbol *procedure = e_cache->thread_ip_procedure; U64 name_size = 0; U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); String8 containing_procedure_name = str8(name_ptr, name_size); @@ -1962,72 +1958,30 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I switch(match.section_kind) { default:{}break; - case RDI_SectionKind_GlobalVariables: + case RDI_SectionKind_GlobalVariableSymbols: + case RDI_SectionKind_ThreadVariableSymbols: + case RDI_SectionKind_ConstantSymbols: { - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, match.idx); - U32 type_idx = global_var->type_idx; + RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); + U64 ip_voff = e_base_ctx->thread_ip_voff; + RDI_Location location = rdi_location_from_location_voff(rdi, symbol->location, ip_voff); + U32 type_idx = symbol->type_idx; RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + global_var->voff)); string_mapped = 1; mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); + mapped_location = location; + mapped_location_module = module; mapped_bytecode_mode = E_Mode_Offset; - mapped_bytecode_space = module->space; }break; - case RDI_SectionKind_ThreadVariables: + case RDI_SectionKind_ProcedureSymbols: { - RDI_ThreadVariable *thread_var = rdi_element_from_name_idx(rdi, ThreadVariables, match.idx); - U32 type_idx = thread_var->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(thread_var->tls_off)); - string_mapped = 1; - mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); - mapped_bytecode_mode = E_Mode_Offset; - mapped_bytecode_space = module->space; - }break; - case RDI_SectionKind_Constants: - { - RDI_Constant *constant = rdi_element_from_name_idx(rdi, Constants, match.idx); - U32 type_idx = constant->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); - RDI_U32 constant_value_off = *rdi_element_from_name_idx(rdi, ConstantValueTable, constant->constant_value_idx); - RDI_U32 constant_value_size = *rdi_element_from_name_idx(rdi, ConstantValueTable, constant->constant_value_idx+1) - constant_value_off; - if(constant_value_size <= 8) - { - RDI_U64 constant_value_data_size = 0; - RDI_U8 *constant_value_data = rdi_table_from_name(rdi, ConstantValueData, &constant_value_data_size); - if(0 <= constant_value_off && constant_value_off + constant_value_size <= constant_value_data_size) - { - RDI_U64 value = 0; - MemoryCopy(&value, constant_value_data+constant_value_off, constant_value_size); - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(value)); - string_mapped = 1; - mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); - mapped_bytecode_mode = E_Mode_Value; - mapped_bytecode_space = module->space; - break; - } - } - }break; - case RDI_SectionKind_Procedures: - { - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, match.idx); - RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx); - U64 voff = *rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first); - U32 type_idx = procedure->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); - string_mapped = 1; - mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); + RDI_Symbol *procedure = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); + U64 procedure_base_voff = rdi_first_voff_from_procedure(rdi, procedure); + mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, dbg_info_num); + mapped_location = rdi_location_voff(procedure_base_voff); + mapped_location_module = module; mapped_bytecode_mode = E_Mode_Value; - mapped_bytecode_space = module->space; }break; case RDI_SectionKind_TypeNodes: { @@ -2114,14 +2068,39 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I }break; } - //- rjf: mapped to location block -> extract or produce bytecode for this mapping - if(!generated && mapped_location_block != 0) + //- rjf: mapped to location -> extract or produce bytecode for this mapping + if(!generated && mapped_location != 0 && mapped_bytecode.size == 0) { - E_Module *module = mapped_location_block_module; + E_Module *module = mapped_location_module; E_DbgInfo *dbg_info = e_dbg_info_from_module(module); E_Space space = module->space; Arch arch = module->arch; RDI_Parsed *rdi = dbg_info->rdi; + RDI_Location location = mapped_location; + E_OpList oplist = e_oplist_from_location(scratch.arena, rdi, location); + // TODO(rjf): @locpass `space` needs to be set to the constant data space if needed + mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); + mapped_bytecode_space = space; + if(mapped_bytecode_mode == E_Mode_Null) + { + switch(rdi_kind_from_location(mapped_location)) + { + default:{}break; + case RDI_LocationKind_ValBytecodeStream: + case RDI_LocationKind_ValReg: + { + mapped_bytecode_mode = E_Mode_Value; + }break; + case RDI_LocationKind_AddrBytecodeStream: + case RDI_LocationKind_AddrRegPlusU16: + case RDI_LocationKind_AddrAddrRegPlusU16: + { + mapped_bytecode_mode = E_Mode_Offset; + }break; + } + } + +#if 0 //~TODO(rjf): OLD vvvvvvvvvvvv RDI_LocationBlock *block = mapped_location_block; U64 all_location_data_size = 0; U8 *all_location_data = rdi_table_from_name(rdi, LocationData, &all_location_data_size); @@ -2204,6 +2183,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I }break; } } +#endif } //- rjf: generate IR trees for bytecode @@ -2499,8 +2479,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I { U64 vtable_voff = vtable_vaddr - module_base; U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff); - RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); - if(global_var->link_flags & RDI_LinkFlag_TypeScoped) + RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariableSymbols, global_idx); + if(global_var->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Type) { RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 96e4194f..26a921a8 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -59,7 +59,7 @@ struct E_IRState E_IRCtx *ctx; // rjf: unpacked ctx - RDI_Procedure *thread_ip_procedure; + RDI_Symbol *thread_ip_procedure; // rjf: overridden irtree E_IRTreeAndType *overridden_irtree; diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 27660cf8..49524205 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -2026,7 +2026,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) Temp scratch = scratch_begin(&arena, 1); RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); U64 proc_idx = scope->proc_idx; - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, proc_idx); RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); E_TypeKey type = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, dbg_info_num); String8 name = {0}; @@ -2065,7 +2065,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); // rjf: scope -> procedure / string - RDI_Procedure *procedure = rdi_procedure_from_scope(rdi, scope); + RDI_Symbol *procedure = rdi_procedure_from_scope(rdi, scope); String8 procedure_name = {0}; procedure_name.str = rdi_name_from_procedure(rdi, procedure, &procedure_name.size); diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index d03f248e..eadf21dd 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -10,7 +10,7 @@ #ifndef RDI_C #define RDI_C -RDI_U16 rdi_section_element_size_table[53] = +RDI_U16 rdi_section_element_size_table[44] = { sizeof(RDI_U8), sizeof(RDI_TopLevelInfo), @@ -35,17 +35,10 @@ sizeof(RDI_TypeNode), sizeof(RDI_UDT), sizeof(RDI_Member), sizeof(RDI_EnumMember), -sizeof(RDI_GlobalVariable), -sizeof(RDI_ThreadVariable), -sizeof(RDI_Constant), -sizeof(RDI_Procedure), -sizeof(RDI_Local), sizeof(RDI_Scope), sizeof(RDI_U64), sizeof(RDI_VMapEntry), sizeof(RDI_InlineSite), -sizeof(RDI_LocationBlock), -sizeof(RDI_U8), sizeof(RDI_Symbol), sizeof(RDI_VMapEntry), sizeof(RDI_Symbol), @@ -55,8 +48,6 @@ sizeof(RDI_Symbol), sizeof(RDI_U8), sizeof(RDI_U8), sizeof(RDI_LocationSetElement), -sizeof(RDI_U8), -sizeof(RDI_U32), sizeof(RDI_MD5), sizeof(RDI_SHA1), sizeof(RDI_SHA256), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 0ab0fcb2..b354a04f 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -67,7 +67,7 @@ union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; // "raddbg\0\0" #define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 21 +#define RDI_ENCODING_VERSION 22 //////////////////////////////////////////////////////////////// //~ Format Types & Functions @@ -98,36 +98,27 @@ RDI_SectionKind_TypeNodes = 0x0013, RDI_SectionKind_UDTs = 0x0014, RDI_SectionKind_Members = 0x0015, RDI_SectionKind_EnumMembers = 0x0016, -RDI_SectionKind_GlobalVariables = 0x0017, -RDI_SectionKind_ThreadVariables = 0x0018, -RDI_SectionKind_Constants = 0x0019, -RDI_SectionKind_Procedures = 0x001A, -RDI_SectionKind_Locals = 0x001B, -RDI_SectionKind_Scopes = 0x001C, -RDI_SectionKind_ScopeVOffData = 0x001D, -RDI_SectionKind_ScopeVMap = 0x001E, -RDI_SectionKind_InlineSites = 0x001F, -RDI_SectionKind_LocationBlocks = 0x0020, -RDI_SectionKind_LocationData = 0x0021, -RDI_SectionKind_GlobalVariableSymbols = 0x0022, -RDI_SectionKind_GlobalVMap = 0x0023, -RDI_SectionKind_ThreadVariableSymbols = 0x0024, -RDI_SectionKind_ConstantSymbols = 0x0025, -RDI_SectionKind_ProcedureSymbols = 0x0026, -RDI_SectionKind_LocalVariableSymbols = 0x0027, -RDI_SectionKind_LocationsBytecodeData = 0x0028, -RDI_SectionKind_LocationsConstantData = 0x0029, -RDI_SectionKind_LocationsSetElements = 0x002A, -RDI_SectionKind_ConstantValueData = 0x002B, -RDI_SectionKind_ConstantValueTable = 0x002C, -RDI_SectionKind_MD5Checksums = 0x002D, -RDI_SectionKind_SHA1Checksums = 0x002E, -RDI_SectionKind_SHA256Checksums = 0x002F, -RDI_SectionKind_Timestamps = 0x0030, -RDI_SectionKind_NameMaps = 0x0031, -RDI_SectionKind_NameMapBuckets = 0x0032, -RDI_SectionKind_NameMapNodes = 0x0033, -RDI_SectionKind_COUNT = 0x0034, +RDI_SectionKind_Scopes = 0x0017, +RDI_SectionKind_ScopeVOffData = 0x0018, +RDI_SectionKind_ScopeVMap = 0x0019, +RDI_SectionKind_InlineSites = 0x001A, +RDI_SectionKind_GlobalVariableSymbols = 0x001B, +RDI_SectionKind_GlobalVMap = 0x001C, +RDI_SectionKind_ThreadVariableSymbols = 0x001D, +RDI_SectionKind_ConstantSymbols = 0x001E, +RDI_SectionKind_ProcedureSymbols = 0x001F, +RDI_SectionKind_LocalVariableSymbols = 0x0020, +RDI_SectionKind_LocationsBytecodeData = 0x0021, +RDI_SectionKind_LocationsConstantData = 0x0022, +RDI_SectionKind_LocationsSetElements = 0x0023, +RDI_SectionKind_MD5Checksums = 0x0024, +RDI_SectionKind_SHA1Checksums = 0x0025, +RDI_SectionKind_SHA256Checksums = 0x0026, +RDI_SectionKind_Timestamps = 0x0027, +RDI_SectionKind_NameMaps = 0x0028, +RDI_SectionKind_NameMapBuckets = 0x0029, +RDI_SectionKind_NameMapNodes = 0x002A, +RDI_SectionKind_COUNT = 0x002B, } RDI_SectionKindEnum; typedef RDI_U32 RDI_SectionEncoding; @@ -400,22 +391,6 @@ RDI_ContainerFlag_External = 1u<<7, RDI_ContainerFlag_KindMask = 0x7f, } RDI_ContainerFlagsEnum; -typedef RDI_U32 RDI_LinkFlags; -typedef enum RDI_LinkFlagsEnum -{ -RDI_LinkFlag_External = 1<<0, -RDI_LinkFlag_TypeScoped = 1<<1, -RDI_LinkFlag_ProcScoped = 1<<2, -} RDI_LinkFlagsEnum; - -typedef RDI_U32 RDI_LocalKind; -typedef enum RDI_LocalKindEnum -{ -RDI_LocalKind_NULL = 0x0, -RDI_LocalKind_Parameter = 0x1, -RDI_LocalKind_Variable = 0x2, -} RDI_LocalKindEnum; - typedef RDI_U8 RDI_SymbolFlags; typedef enum RDI_SymbolFlagsEnum { @@ -564,17 +539,10 @@ X(TypeNodes, type_nodes, RDI_TypeNode)\ X(UDTs, udts, RDI_UDT)\ X(Members, members, RDI_Member)\ X(EnumMembers, enum_members, RDI_EnumMember)\ -X(GlobalVariables, global_variables, RDI_GlobalVariable)\ -X(ThreadVariables, thread_variables, RDI_ThreadVariable)\ -X(Constants, constants, RDI_Constant)\ -X(Procedures, procedures, RDI_Procedure)\ -X(Locals, locals, RDI_Local)\ X(Scopes, scopes, RDI_Scope)\ X(ScopeVOffData, scope_voff_data, RDI_U64)\ X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ X(InlineSites, inline_sites, RDI_InlineSite)\ -X(LocationBlocks, location_blocks, RDI_LocationBlock)\ -X(LocationData, location_data, RDI_U8)\ X(GlobalVariableSymbols, global_variable_symbols, RDI_Symbol)\ X(GlobalVMap, global_vmap, RDI_VMapEntry)\ X(ThreadVariableSymbols, thread_variable_symbols, RDI_Symbol)\ @@ -584,8 +552,6 @@ X(LocalVariableSymbols, local_variable_symbols, RDI_Symbol)\ X(LocationsBytecodeData, locations_bytecode_data, RDI_U8)\ X(LocationsConstantData, locations_constant_data, RDI_U8)\ X(LocationsSetElements, locations_set_elements, RDI_LocationSetElement)\ -X(ConstantValueData, constant_value_data, RDI_U8)\ -X(ConstantValueTable, constant_value_table, RDI_U32)\ X(MD5Checksums, md5_checksums, RDI_MD5)\ X(SHA1Checksums, sha1_checksums, RDI_SHA1)\ X(SHA256Checksums, sha256_checksums, RDI_SHA256)\ @@ -913,14 +879,7 @@ X(RDI_U32, pad)\ X(RDI_U64, val)\ #define RDI_LinkFlags_XList \ -X(External)\ -X(TypeScoped)\ -X(ProcScoped)\ - -#define RDI_LocalKind_XList \ -X(NULL)\ -X(Parameter)\ -X(Variable)\ +X($(a.name != COUNT -> a.name))\ #define RDI_LocationKind_XList \ X(NULL)\ @@ -950,30 +909,6 @@ X(RDI_U32, type_idx)\ X(RDI_U32, root_scope_idx)\ X(RDI_U32, link_name_string_idx)\ -#define RDI_GlobalVariable_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_LinkFlags, link_flags)\ -X(RDI_U64, voff)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, container_idx)\ - -#define RDI_ThreadVariable_XList \ -X(type, name_string_idx)\ -X(type, link_flags)\ -X(type, tls_off)\ -X(type, type_idx)\ -X(type, container_idx)\ - -#define RDI_Procedure_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, link_name_string_idx)\ -X(RDI_LinkFlags, link_flags)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, root_scope_idx)\ -X(RDI_U32, container_idx)\ -X(RDI_U32, frame_base_location_first)\ -X(RDI_U32, frame_base_location_opl)\ - #define RDI_Scope_XList \ X(RDI_U32, proc_idx)\ X(RDI_U32, parent_scope_idx)\ @@ -991,40 +926,6 @@ X(RDI_U32, type_idx)\ X(RDI_U32, owner_type_idx)\ X(RDI_U32, line_table_idx)\ -#define RDI_Local_XList \ -X(RDI_LocalKind, kind)\ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, pad)\ -X(RDI_U32, location_first)\ -X(RDI_U32, location_opl)\ - -#define RDI_LocationBlock_XList \ -X(RDI_U32, scope_off_first)\ -X(RDI_U32, scope_off_opl)\ -X(RDI_U32, location_data_off)\ - -#define RDI_LocationBytecodeStream_XList \ -X(RDI_LocationKind, kind)\ - -#define RDI_LocationRegPlusU16_XList \ -X(RDI_LocationKind, kind)\ -X(RDI_RegCode, reg_code)\ -X(RDI_U16, offset)\ - -#define RDI_LocationReg_XList \ -X(RDI_LocationKind, kind)\ -X(RDI_RegCode, reg_code)\ - -#define RDI_RegAndOffsetU16_XList \ -X(RDI_RegCode, reg_code)\ -X(RDI_U16, offset)\ - -#define RDI_LocationSetElement_XList \ -X(RDI_U64, voff_first)\ -X(RDI_U64, voff_opl)\ -X(RDI_Location, location)\ - #define RDI_EvalOp_XList \ X(Stop)\ X(Noop)\ @@ -1141,16 +1042,9 @@ typedef struct RDI_U32_TypeNodes { RDI_U32 v; } RDI_U32_TypeNo typedef struct RDI_U32_UDTs { RDI_U32 v; } RDI_U32_UDTs; typedef struct RDI_U32_Members { RDI_U32 v; } RDI_U32_Members; typedef struct RDI_U32_EnumMembers { RDI_U32 v; } RDI_U32_EnumMembers; -typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_GlobalVariables; -typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; -typedef struct RDI_U32_Constants { RDI_U32 v; } RDI_U32_Constants; -typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; -typedef struct RDI_U32_Locals { RDI_U32 v; } RDI_U32_Locals; typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; -typedef struct RDI_U32_LocationBlocks { RDI_U32 v; } RDI_U32_LocationBlocks; -typedef struct RDI_U32_LocationData { RDI_U32 v; } RDI_U32_LocationData; typedef struct RDI_U32_GlobalVariableSymbols { RDI_U32 v; } RDI_U32_GlobalVariableSymbols; typedef struct RDI_U32_ThreadVariableSymbols { RDI_U32 v; } RDI_U32_ThreadVariableSymbols; typedef struct RDI_U32_ConstantSymbols { RDI_U32 v; } RDI_U32_ConstantSymbols; @@ -1159,8 +1053,6 @@ typedef struct RDI_U32_LocalVariableSymbols { RDI_U32 v; } RDI_U32_LocalV typedef struct RDI_U32_LocationsBytecodeData { RDI_U32 v; } RDI_U32_LocationsBytecodeData; typedef struct RDI_U32_LocationsConstantData { RDI_U32 v; } RDI_U32_LocationsConstantData; typedef struct RDI_U32_LocationsSetElements { RDI_U32 v; } RDI_U32_LocationsSetElements; -typedef struct RDI_U32_ConstantValueData { RDI_U32 v; } RDI_U32_ConstantValueData; -typedef struct RDI_U32_ConstantValueTable { RDI_U32 v; } RDI_U32_ConstantValueTable; typedef struct RDI_U32_MD5Checksums { RDI_U32 v; } RDI_U32_MD5Checksums; typedef struct RDI_U32_SHA1Checksums { RDI_U32 v; } RDI_U32_SHA1Checksums; typedef struct RDI_U32_SHA256Checksums { RDI_U32 v; } RDI_U32_SHA256Checksums; @@ -1190,16 +1082,9 @@ typedef RDI_U32_Table RDI_U32_TypeNodes; typedef RDI_U32_Table RDI_U32_UDTs; typedef RDI_U32_Table RDI_U32_Members; typedef RDI_U32_Table RDI_U32_EnumMembers; -typedef RDI_U32_Table RDI_U32_GlobalVariables; -typedef RDI_U32_Table RDI_U32_ThreadVariables; -typedef RDI_U32_Table RDI_U32_Constants; -typedef RDI_U32_Table RDI_U32_Procedures; -typedef RDI_U32_Table RDI_U32_Locals; typedef RDI_U32_Table RDI_U32_Scopes; typedef RDI_U32_Table RDI_U32_ScopeVOffData; typedef RDI_U32_Table RDI_U32_InlineSites; -typedef RDI_U32_Table RDI_U32_LocationBlocks; -typedef RDI_U32_Table RDI_U32_LocationData; typedef RDI_U32_Table RDI_U32_GlobalVariableSymbols; typedef RDI_U32_Table RDI_U32_ThreadVariableSymbols; typedef RDI_U32_Table RDI_U32_ConstantSymbols; @@ -1208,8 +1093,6 @@ typedef RDI_U32_Table RDI_U32_LocalVariableSymbols; typedef RDI_U32_Table RDI_U32_LocationsBytecodeData; typedef RDI_U32_Table RDI_U32_LocationsConstantData; typedef RDI_U32_Table RDI_U32_LocationsSetElements; -typedef RDI_U32_Table RDI_U32_ConstantValueData; -typedef RDI_U32_Table RDI_U32_ConstantValueTable; typedef RDI_U32_Table RDI_U32_MD5Checksums; typedef RDI_U32_Table RDI_U32_SHA1Checksums; typedef RDI_U32_Table RDI_U32_SHA256Checksums; @@ -1481,47 +1364,6 @@ RDI_U32 root_scope_idx; RDI_U32 link_name_string_idx; }; -typedef struct RDI_GlobalVariable RDI_GlobalVariable; -struct RDI_GlobalVariable -{ -RDI_U32 name_string_idx; -RDI_LinkFlags link_flags; -RDI_U64 voff; -RDI_U32 type_idx; -RDI_U32 container_idx; -}; - -typedef struct RDI_ThreadVariable RDI_ThreadVariable; -struct RDI_ThreadVariable -{ -RDI_U32 name_string_idx; -RDI_LinkFlags link_flags; -RDI_U32 tls_off; -RDI_U32 type_idx; -RDI_U32 container_idx; -}; - -typedef struct RDI_Constant RDI_Constant; -struct RDI_Constant -{ -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 constant_value_idx; -}; - -typedef struct RDI_Procedure RDI_Procedure; -struct RDI_Procedure -{ -RDI_U32 name_string_idx; -RDI_U32 link_name_string_idx; -RDI_LinkFlags link_flags; -RDI_U32 type_idx; -RDI_U32 root_scope_idx; -RDI_U32 container_idx; -RDI_U32 frame_base_location_first; -RDI_U32 frame_base_location_opl; -}; - typedef struct RDI_Scope RDI_Scope; struct RDI_Scope { @@ -1545,53 +1387,6 @@ RDI_U32 owner_type_idx; RDI_U32 line_table_idx; }; -typedef struct RDI_Local RDI_Local; -struct RDI_Local -{ -RDI_LocalKind kind; -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 pad; -RDI_U32 location_first; -RDI_U32 location_opl; -}; - -typedef struct RDI_LocationBlock RDI_LocationBlock; -struct RDI_LocationBlock -{ -RDI_U32 scope_off_first; -RDI_U32 scope_off_opl; -RDI_U32 location_data_off; -}; - -typedef struct RDI_LocationBytecodeStream RDI_LocationBytecodeStream; -struct RDI_LocationBytecodeStream -{ -RDI_LocationKind kind; -}; - -typedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16; -struct RDI_LocationRegPlusU16 -{ -RDI_LocationKind kind; -RDI_RegCode reg_code; -RDI_U16 offset; -}; - -typedef struct RDI_LocationReg RDI_LocationReg; -struct RDI_LocationReg -{ -RDI_LocationKind kind; -RDI_RegCode reg_code; -}; - -typedef struct RDI_RegAndOffsetU16 RDI_RegAndOffsetU16; -struct RDI_RegAndOffsetU16 -{ -RDI_RegCode reg_code; -RDI_U16 offset; -}; - typedef struct RDI_LocationSetElement RDI_LocationSetElement; struct RDI_LocationSetElement { @@ -1646,17 +1441,10 @@ typedef RDI_TypeNode RDI_SectionElementType_TypeNodes; typedef RDI_UDT RDI_SectionElementType_UDTs; typedef RDI_Member RDI_SectionElementType_Members; typedef RDI_EnumMember RDI_SectionElementType_EnumMembers; -typedef RDI_GlobalVariable RDI_SectionElementType_GlobalVariables; -typedef RDI_ThreadVariable RDI_SectionElementType_ThreadVariables; -typedef RDI_Constant RDI_SectionElementType_Constants; -typedef RDI_Procedure RDI_SectionElementType_Procedures; -typedef RDI_Local RDI_SectionElementType_Locals; typedef RDI_Scope RDI_SectionElementType_Scopes; typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; typedef RDI_InlineSite RDI_SectionElementType_InlineSites; -typedef RDI_LocationBlock RDI_SectionElementType_LocationBlocks; -typedef RDI_U8 RDI_SectionElementType_LocationData; typedef RDI_Symbol RDI_SectionElementType_GlobalVariableSymbols; typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; typedef RDI_Symbol RDI_SectionElementType_ThreadVariableSymbols; @@ -1666,8 +1454,6 @@ typedef RDI_Symbol RDI_SectionElementType_LocalVariableSym typedef RDI_U8 RDI_SectionElementType_LocationsBytecodeData; typedef RDI_U8 RDI_SectionElementType_LocationsConstantData; typedef RDI_LocationSetElement RDI_SectionElementType_LocationsSetElements; -typedef RDI_U8 RDI_SectionElementType_ConstantValueData; -typedef RDI_U32 RDI_SectionElementType_ConstantValueTable; typedef RDI_MD5 RDI_SectionElementType_MD5Checksums; typedef RDI_SHA1 RDI_SectionElementType_SHA1Checksums; typedef RDI_SHA256 RDI_SectionElementType_SHA256Checksums; @@ -1684,7 +1470,7 @@ RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_Eva RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); -extern RDI_U16 rdi_section_element_size_table[53]; +extern RDI_U16 rdi_section_element_size_table[44]; extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; #endif // RDI_H diff --git a/src/lib_rdi/rdi_parse.c b/src/lib_rdi/rdi_parse.c index 8cd1d69d..0b0204a9 100644 --- a/src/lib_rdi/rdi_parse.c +++ b/src/lib_rdi/rdi_parse.c @@ -728,7 +728,7 @@ rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out) //- procedures -RDI_PROC RDI_Procedure * +RDI_PROC RDI_Symbol * rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size) { RDI_NameMap *map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); @@ -742,35 +742,35 @@ rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size) { procedure_idx = ids[0]; } - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_idx); return procedure; } -RDI_PROC RDI_Procedure * +RDI_PROC RDI_Symbol * rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr) { - RDI_Procedure *result = rdi_procedure_from_name(rdi, (RDI_U8 *)cstr, rdi_cstring_length(cstr)); + RDI_Symbol *result = rdi_procedure_from_name(rdi, (RDI_U8 *)cstr, rdi_cstring_length(cstr)); return result; } RDI_PROC RDI_U8 * -rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out) +rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure, RDI_U64 *len_out) { return rdi_string_from_idx(rdi, procedure->name_string_idx, len_out); } RDI_PROC RDI_Scope * -rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure) +rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx); return scope; } RDI_PROC RDI_UDT * -rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure) +rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { RDI_U64 idx = 0; - if(procedure->link_flags & RDI_LinkFlag_TypeScoped) + if(procedure->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Type) { idx = procedure->container_idx; } @@ -778,20 +778,20 @@ rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure) return udt; } -RDI_PROC RDI_Procedure * -rdi_container_procedure_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure) +RDI_PROC RDI_Scope * +rdi_container_scope_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { RDI_U64 idx = 0; - if(procedure->link_flags & RDI_LinkFlag_ProcScoped) + if(procedure->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Scope) { idx = procedure->container_idx; } - RDI_Procedure *container_procedure = rdi_element_from_name_idx(rdi, Procedures, idx); - return container_procedure; + RDI_Scope *container_scope = rdi_element_from_name_idx(rdi, Scopes, idx); + return container_scope; } RDI_PROC RDI_U64 -rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure) +rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { RDI_Scope *scope = rdi_root_scope_from_procedure(rdi, procedure); RDI_U64 result = rdi_first_voff_from_scope(rdi, scope); @@ -799,18 +799,18 @@ rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure) } RDI_PROC RDI_U64 -rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure) +rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { RDI_Scope *scope = rdi_root_scope_from_procedure(rdi, procedure); RDI_U64 result = rdi_opl_voff_from_scope(rdi, scope); return result; } -RDI_PROC RDI_Procedure * +RDI_PROC RDI_Symbol * rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff) { RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); - RDI_Procedure *procedure = rdi_procedure_from_scope(rdi, scope); + RDI_Symbol *procedure = rdi_procedure_from_scope(rdi, scope); return procedure; } @@ -851,10 +851,10 @@ rdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) return parent; } -RDI_PROC RDI_Procedure * +RDI_PROC RDI_Symbol * rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) { - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, scope->proc_idx); return procedure; } @@ -867,14 +867,49 @@ rdi_inline_site_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) //- global variables -RDI_PROC RDI_GlobalVariable * +RDI_PROC RDI_Symbol * rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff) { RDI_U32 idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff); - RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, idx); + RDI_Symbol *gvar = rdi_element_from_name_idx(rdi, GlobalVariableSymbols, idx); return gvar; } +//- location picking + +RDI_PROC RDI_Location +rdi_location_from_location_voff(RDI_Parsed *rdi, RDI_Location location, RDI_U64 voff) +{ + RDI_Location result = 0; + if(rdi_kind_from_location(location) != RDI_LocationKind_Set) + { + result = location; + } + else + { + RDI_U64 set_first_idx = rdi_set_first_index_from_location(location); + RDI_U64 set_count = rdi_set_count_from_location(location); + RDI_U64 set_opl_idx = set_first_idx + set_count; + RDI_U64 all_elems_count = 0; + RDI_LocationSetElement *all_elems = rdi_table_from_name(rdi, LocationsSetElements, &all_elems_count); + if(set_opl_idx > all_elems_count) + { + set_opl_idx = all_elems_count; + } + RDI_LocationSetElement *set_first = all_elems + set_first_idx; + RDI_LocationSetElement *set_opl = all_elems + set_opl_idx; + for(RDI_LocationSetElement *e = set_first; e < set_opl; e += 1) + { + if(e->voff_first <= voff && voff <= e->voff_opl) + { + result = e->location; + break; + } + } + } + return result; +} + //- units RDI_PROC RDI_Unit * diff --git a/src/lib_rdi/rdi_parse.h b/src/lib_rdi/rdi_parse.h index c4427445..5349348d 100644 --- a/src/lib_rdi/rdi_parse.h +++ b/src/lib_rdi/rdi_parse.h @@ -122,13 +122,10 @@ static union RDI_UDT udt; RDI_Member member; RDI_EnumMember enum_member; - RDI_GlobalVariable global_variable; - RDI_ThreadVariable thread_variable; - RDI_Procedure procedure; + RDI_Symbol symbol; RDI_Scope scope; RDI_U64 voff; - RDI_LocationBlock location_block; - RDI_Local local; + RDI_LocationSetElement location_set_element; } rdi_nil_element_union = {0}; static RDI_Parsed rdi_parsed_nil = {0}; @@ -179,26 +176,29 @@ RDI_PROC RDI_U32 *rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node //~ High-Level Composite Lookup Functions //- procedures -RDI_PROC RDI_Procedure *rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); -RDI_PROC RDI_Procedure *rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr); -RDI_PROC RDI_U8 *rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out); -RDI_PROC RDI_Scope *rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_UDT *rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_Procedure *rdi_container_procedure_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_U64 rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_U64 rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure); -RDI_PROC RDI_Procedure *rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff); +RDI_PROC RDI_Symbol *rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size); +RDI_PROC RDI_Symbol *rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr); +RDI_PROC RDI_U8 *rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure, RDI_U64 *len_out); +RDI_PROC RDI_Scope *rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure); +RDI_PROC RDI_UDT *rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure); +RDI_PROC RDI_Scope *rdi_container_scope_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure); +RDI_PROC RDI_U64 rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure); +RDI_PROC RDI_U64 rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure); +RDI_PROC RDI_Symbol *rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff); //- scopes RDI_PROC RDI_U64 rdi_first_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); RDI_PROC RDI_U64 rdi_opl_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); RDI_PROC RDI_Scope *rdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff); RDI_PROC RDI_Scope *rdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); -RDI_PROC RDI_Procedure *rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); +RDI_PROC RDI_Symbol *rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); RDI_PROC RDI_InlineSite *rdi_inline_site_from_scope(RDI_Parsed *rdi, RDI_Scope *scope); //- global variables -RDI_PROC RDI_GlobalVariable *rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff); +RDI_PROC RDI_Symbol *rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff); + +//- location picking +RDI_PROC RDI_Location rdi_location_from_location_voff(RDI_Parsed *rdi, RDI_Location location, RDI_U64 voff); //- units RDI_PROC RDI_Unit *rdi_unit_from_voff(RDI_Parsed *rdi, RDI_U64 voff); diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 79352f0b..a2576e9e 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1115,35 +1115,6 @@ rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Sc list->scope_voff_count += 2; } -#if 0 // TODO(rjf): @locpass -RDI_PROC RDIM_Local * -rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope) -{ - RDIM_Local *local = rdim_push_array(arena, RDIM_Local, 1); - RDIM_SLLQueuePush(scope->first_local, scope->last_local, local); - scope->local_count += 1; - scopes->local_count += 1; - return local; -} - -RDI_PROC RDIM_LocationCase * -rdim_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationCaseList *list, RDIM_Location *location, RDIM_Rng1U64 voff_range) -{ - RDIM_LocationCase *n = rdim_push_array(arena, RDIM_LocationCase, 1); - RDIM_SLLQueuePush(list->first, list->last, n); - list->count += 1; - n->location = *location; - n->voff_range = voff_range; - return n; -} - -RDI_PROC RDIM_LocationCase * -rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *location, RDIM_Rng1U64 voff_range) -{ - return rdim_push_location_case(arena, scopes, &local->location_cases, location, voff_range); -} -#endif - //////////////////////////////// //~ rjf: [Building] Bake Parameter Joining @@ -2092,58 +2063,6 @@ rdim_serialized_section_make_unpacked(void *data, RDI_U64 size) return s; } -#if 0 // TODO(rjf): @locpass -RDI_PROC RDIM_SerializedSectionBundle -rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results) -{ - RDIM_SerializedSectionBundle bundle; - rdim_memzero_struct(&bundle); - bundle.sections[RDI_SectionKind_TopLevelInfo] = rdim_serialized_section_make_unpacked_struct(results->top_level_info.top_level_info); - bundle.sections[RDI_SectionKind_StringData] = rdim_serialized_section_make_unpacked_array(results->strings.string_data, results->strings.string_data_size); - bundle.sections[RDI_SectionKind_StringTable] = rdim_serialized_section_make_unpacked_array(results->strings.string_offs, results->strings.string_offs_count); - bundle.sections[RDI_SectionKind_IndexRuns] = rdim_serialized_section_make_unpacked_array(results->idx_runs.idx_runs, results->idx_runs.idx_count); - bundle.sections[RDI_SectionKind_BinarySections] = rdim_serialized_section_make_unpacked_array(results->binary_sections.binary_sections, results->binary_sections.binary_sections_count); - bundle.sections[RDI_SectionKind_FilePathNodes] = rdim_serialized_section_make_unpacked_array(results->file_paths.nodes, results->file_paths.nodes_count); - bundle.sections[RDI_SectionKind_SourceFiles] = rdim_serialized_section_make_unpacked_array(results->src_files.source_files, results->src_files.source_files_count); - bundle.sections[RDI_SectionKind_LineTables] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_tables, results->line_tables.line_tables_count); - bundle.sections[RDI_SectionKind_LineInfoVOffs] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_voffs, results->line_tables.line_table_voffs_count); - bundle.sections[RDI_SectionKind_LineInfoLines] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_lines, results->line_tables.line_table_lines_count); - bundle.sections[RDI_SectionKind_LineInfoColumns] = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_columns, results->line_tables.line_table_columns_count); - bundle.sections[RDI_SectionKind_SourceLineMaps] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_maps, results->src_files.source_line_maps_count); - bundle.sections[RDI_SectionKind_SourceLineMapNumbers] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_nums, results->src_files.source_line_map_nums_count); - bundle.sections[RDI_SectionKind_SourceLineMapRanges] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_rngs, results->src_files.source_line_map_rngs_count); - bundle.sections[RDI_SectionKind_SourceLineMapVOffs] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_voffs, results->src_files.source_line_map_voffs_count); - bundle.sections[RDI_SectionKind_Units] = rdim_serialized_section_make_unpacked_array(results->units.units, results->units.units_count); - bundle.sections[RDI_SectionKind_UnitVMap] = rdim_serialized_section_make_unpacked_array(results->unit_vmap.vmap.vmap, results->unit_vmap.vmap.count); - bundle.sections[RDI_SectionKind_Namespaces] = rdim_serialized_section_make_unpacked_array(results->namespaces.namespaces, results->namespaces.namespaces_count); - bundle.sections[RDI_SectionKind_TypeNodes] = rdim_serialized_section_make_unpacked_array(results->type_nodes.type_nodes, results->type_nodes.type_nodes_count); - bundle.sections[RDI_SectionKind_UDTs] = rdim_serialized_section_make_unpacked_array(results->udts.udts, results->udts.udts_count); - bundle.sections[RDI_SectionKind_Members] = rdim_serialized_section_make_unpacked_array(results->udts.members, results->udts.members_count); - bundle.sections[RDI_SectionKind_EnumMembers] = rdim_serialized_section_make_unpacked_array(results->udts.enum_members, results->udts.enum_members_count); - bundle.sections[RDI_SectionKind_GlobalVariables] = rdim_serialized_section_make_unpacked_array(results->global_variables.global_variables, results->global_variables.global_variables_count); - bundle.sections[RDI_SectionKind_GlobalVMap] = rdim_serialized_section_make_unpacked_array(results->global_vmap.vmap.vmap, results->global_vmap.vmap.count); - bundle.sections[RDI_SectionKind_ThreadVariables] = rdim_serialized_section_make_unpacked_array(results->thread_variables.thread_variables, results->thread_variables.thread_variables_count); - bundle.sections[RDI_SectionKind_Constants] = rdim_serialized_section_make_unpacked_array(results->constants.constants, results->constants.constants_count); - bundle.sections[RDI_SectionKind_Procedures] = rdim_serialized_section_make_unpacked_array(results->procedures.procedures, results->procedures.procedures_count); - bundle.sections[RDI_SectionKind_Scopes] = rdim_serialized_section_make_unpacked_array(results->scopes.scopes, results->scopes.scopes_count); - bundle.sections[RDI_SectionKind_ScopeVOffData] = rdim_serialized_section_make_unpacked_array(results->scopes.scope_voffs, results->scopes.scope_voffs_count); - bundle.sections[RDI_SectionKind_ScopeVMap] = rdim_serialized_section_make_unpacked_array(results->scope_vmap.vmap.vmap, results->scope_vmap.vmap.count); - bundle.sections[RDI_SectionKind_InlineSites] = rdim_serialized_section_make_unpacked_array(results->inline_sites.inline_sites, results->inline_sites.inline_sites_count); - bundle.sections[RDI_SectionKind_Locals] = rdim_serialized_section_make_unpacked_array(results->scopes.locals, results->scopes.locals_count); - bundle.sections[RDI_SectionKind_LocationBlocks] = rdim_serialized_section_make_unpacked_array(results->location_blocks.location_blocks, results->location_blocks.location_blocks_count); - bundle.sections[RDI_SectionKind_LocationData] = rdim_serialized_section_make_unpacked_array(results->locations.location_data, results->locations.location_data_size); - bundle.sections[RDI_SectionKind_ConstantValueData] = rdim_serialized_section_make_unpacked_array(results->constants.constant_value_data, results->constants.constant_value_data_size); - bundle.sections[RDI_SectionKind_ConstantValueTable] = rdim_serialized_section_make_unpacked_array(results->constants.constant_values, results->constants.constant_values_count); - bundle.sections[RDI_SectionKind_MD5Checksums] = rdim_serialized_section_make_unpacked_array(results->checksums.md5s, results->checksums.md5s_count); - bundle.sections[RDI_SectionKind_SHA1Checksums] = rdim_serialized_section_make_unpacked_array(results->checksums.sha1s, results->checksums.sha1s_count); - bundle.sections[RDI_SectionKind_SHA256Checksums] = rdim_serialized_section_make_unpacked_array(results->checksums.sha256s, results->checksums.sha256s_count); - bundle.sections[RDI_SectionKind_NameMaps] = rdim_serialized_section_make_unpacked_array(results->top_level_name_maps.name_maps, results->top_level_name_maps.name_maps_count); - bundle.sections[RDI_SectionKind_NameMapBuckets] = rdim_serialized_section_make_unpacked_array(results->name_maps.buckets, results->name_maps.buckets_count); - bundle.sections[RDI_SectionKind_NameMapNodes] = rdim_serialized_section_make_unpacked_array(results->name_maps.nodes, results->name_maps.nodes_count); - return bundle; -} -#endif - RDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle) { diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 2610f8b8..d59cd929 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -912,16 +912,6 @@ struct RDIM_InlineSiteChunkList //////////////////////////////// //~ rjf: Scope Info Types -typedef struct RDIM_Local RDIM_Local; -struct RDIM_Local -{ - RDIM_Local *next; - RDI_LocalKind kind; - RDIM_String8 name; - RDIM_Type *type; - RDIM_LocationCaseList location_cases; -}; - typedef struct RDIM_Scope RDIM_Scope; struct RDIM_Scope { @@ -932,11 +922,6 @@ struct RDIM_Scope RDIM_Scope *last_child; RDIM_Scope *next_sibling; RDIM_Rng1U64List voff_ranges; -#if 0 // TODO(rjf): @locpass - RDIM_Local *first_local; - RDIM_Local *last_local; - RDI_U32 local_count; -#endif RDIM_InlineSite *inline_site; RDIM_SymbolChunkList locals; }; @@ -1283,52 +1268,6 @@ struct RDIM_LineRec //- rjf: baking results -typedef struct RDIM_LocationBakeResult RDIM_LocationBakeResult; -struct RDIM_LocationBakeResult -{ - RDI_U8 *location_data; - RDI_U64 location_data_size; -}; - -typedef struct RDIM_LocationBlockBakeResult RDIM_LocationBlockBakeResult; -struct RDIM_LocationBlockBakeResult -{ - RDI_LocationBlock *location_blocks; - RDI_U64 location_blocks_count; -}; - -typedef struct RDIM_GlobalVariableBakeResult RDIM_GlobalVariableBakeResult; -struct RDIM_GlobalVariableBakeResult -{ - RDI_GlobalVariable *global_variables; - RDI_U64 global_variables_count; -}; - -typedef struct RDIM_ThreadVariableBakeResult RDIM_ThreadVariableBakeResult; -struct RDIM_ThreadVariableBakeResult -{ - RDI_ThreadVariable *thread_variables; - RDI_U64 thread_variables_count; -}; - -typedef struct RDIM_ConstantsBakeResult RDIM_ConstantsBakeResult; -struct RDIM_ConstantsBakeResult -{ - RDI_Constant *constants; - RDI_U64 constants_count; - RDI_U32 *constant_values; - RDI_U64 constant_values_count; - RDI_U8 *constant_value_data; - RDI_U64 constant_value_data_size; -}; - -typedef struct RDIM_ProcedureBakeResult RDIM_ProcedureBakeResult; -struct RDIM_ProcedureBakeResult -{ - RDI_Procedure *procedures; - RDI_U64 procedures_count; -}; - typedef struct RDIM_SerializedSection RDIM_SerializedSection; struct RDIM_SerializedSection { @@ -1501,11 +1440,6 @@ RDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChu RDI_PROC RDI_U64 rdim_idx_from_scope(RDIM_Scope *scope); RDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push); RDI_PROC void rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range); -#if 0 // TODO(rjf): @locpass -RDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope); -RDI_PROC RDIM_LocationCase *rdim_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationCaseList *list, RDIM_Location *location, RDIM_Rng1U64 voff_range); -RDI_PROC RDIM_LocationCase *rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *location, RDIM_Rng1U64 voff_range); -#endif //////////////////////////////// //~ rjf: [Building] Bake Parameter Joining @@ -1578,9 +1512,6 @@ RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDI_PROC RDIM_SerializedSection rdim_serialized_section_make_unpacked(void *data, RDI_U64 size); #define rdim_serialized_section_make_unpacked_struct(ptr) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))) #define rdim_serialized_section_make_unpacked_array(ptr, count) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))*(count)) -#if 0 // TODO(rjf): @locpass -RDI_PROC RDIM_SerializedSectionBundle rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results); -#endif RDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle); #endif // RDI_MAKE_H diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 97fe3be8..8c7d6b33 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -6,6 +6,8 @@ ** stepping, breakpoints, evaluation, cross-module calls. */ +#define EvalTest(expr, match) + #if _WIN32 && _DEBUG #pragma comment(linker, "/nodefaultlib:libcmt") #pragma comment(lib, "libcmtd") @@ -416,14 +418,14 @@ raddbg_type_view(MyByte *, no_string($)); static void type_coverage_eval_tests(void) { - Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; EvalTest(basics.a, -1); Basics_Stdint basics_stdint = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; uint32_t a = (1<<31); int32_t b = (1<<31); - uint32_t abcd = 0xaabbccdd; - int64_t abcd64 = (int64_t)abcd; + uint32_t abcd = 0xaabbccdd; EvalTest(abcd, 0xaabbccdd); + int64_t abcd64 = (int64_t)abcd; EvalTest(abcd64, 0xaabbccdd); EvalTest(abcd64, abcd); char string[] = "Hello World!"; char longer_text[] = @@ -484,6 +486,9 @@ type_coverage_eval_tests(void) memory_, 6 }; + EvalTest(dynamic[0].i, 100); EvalTest(dynamic[0].f, 1.f); + EvalTest(dynamic[1].i, 101); EvalTest(dynamic[1].f, 2.f); + EvalTest(dynamic[2].i, 102); EvalTest(dynamic[2].f, 4.f); TemplatedDynamicArray templated_dynamic = {dynamic.pairs, dynamic.count}; TemplatedDynamicArray templated_dynamics[] = diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index e3c1ed65..91fbde6a 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1029,13 +1029,13 @@ rb_thread_entry_point(void *p) ProfScope("dump FUNC records") { U64 count = 0; - RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count); + RDI_Symbol *v = rdi_table_from_name(rdi, ProcedureSymbols, &count); Rng1U64 range = lane_range(count); for EachInRange(idx, range) { // NOTE(rjf): breakpad does not support multiple voff ranges per procedure. String8List *out = &p2b_shared->lane_func_dumps[lane_idx()]; - RDI_Procedure *proc = &v[idx]; + RDI_Symbol *proc = &v[idx]; RDI_Scope *root_scope = rdi_element_from_name_idx(rdi, Scopes, proc->root_scope_idx); if(root_scope->voff_range_opl > root_scope->voff_range_first) { diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 8e1d89c9..7934fbd2 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2284,12 +2284,12 @@ rd_view_ui(Rng2F32 rect) String8 name = {0}; if(name.size == 0) { - RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); name.str = rdi_name_from_procedure(rdi, procedure, &name.size); } if(name.size == 0) { - RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); + RDI_Symbol *gvar = rdi_global_variable_from_voff(rdi, voff); name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size); } if(name.size != 0) @@ -2370,12 +2370,12 @@ rd_view_ui(Rng2F32 rect) RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); if(name.size == 0) { - RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); name.str = rdi_name_from_procedure(rdi, procedure, &name.size); } if(name.size == 0) { - RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); + RDI_Symbol *gvar = rdi_global_variable_from_voff(rdi, voff); name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size); } access_close(access); @@ -9508,9 +9508,9 @@ rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 switch(section_kind) { default:{mapped = 0;}break; - case RDI_SectionKind_Procedures: - case RDI_SectionKind_GlobalVariables: - case RDI_SectionKind_ThreadVariables: + case RDI_SectionKind_ProcedureSymbols: + case RDI_SectionKind_GlobalVariableSymbols: + case RDI_SectionKind_ThreadVariableSymbols: { color = RD_CodeColorSlot_CodeSymbol; }break; @@ -14060,13 +14060,13 @@ rd_frame(void) { match = di_match_from_string(name, 0, di_key_zero(), rd_state->frame_eval_memread_endt_us); } - if(match.section_kind == RDI_SectionKind_Procedures) + if(match.section_kind == RDI_SectionKind_ProcedureSymbols) { Access *access = access_open(); { name_resolved = 1; RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0); - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, match.idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, match.idx); voff = rdi_first_voff_from_procedure(rdi, procedure); voff_dbgi_key = match.key; } diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index e41320d2..11bbf9ec 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -1751,10 +1751,10 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table) E_TypeKey lhs_type_key = eval.irtree.type_key; E_Type *lhs_type = e_type_from_key(lhs_type_key); if(0){} - else if(str8_match(lhs_type->name, str8_lit("procedures"), 0)) {section = RDI_SectionKind_Procedures;} - else if(str8_match(lhs_type->name, str8_lit("globals"), 0)) {section = RDI_SectionKind_GlobalVariables;} - else if(str8_match(lhs_type->name, str8_lit("thread_locals"), 0)) {section = RDI_SectionKind_ThreadVariables;} - else if(str8_match(lhs_type->name, str8_lit("constants"), 0)) {section = RDI_SectionKind_Constants;} + else if(str8_match(lhs_type->name, str8_lit("procedures"), 0)) {section = RDI_SectionKind_ProcedureSymbols;} + else if(str8_match(lhs_type->name, str8_lit("globals"), 0)) {section = RDI_SectionKind_GlobalVariableSymbols;} + else if(str8_match(lhs_type->name, str8_lit("thread_locals"), 0)) {section = RDI_SectionKind_ThreadVariableSymbols;} + else if(str8_match(lhs_type->name, str8_lit("constants"), 0)) {section = RDI_SectionKind_ConstantSymbols;} else if(str8_match(lhs_type->name, str8_lit("types"), 0)) {section = RDI_SectionKind_UDTs;} else if(str8_match(lhs_type->name, str8_lit("source_files"), 0)) {section = RDI_SectionKind_SourceFiles;} } @@ -1806,32 +1806,14 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) switch(accel->section) { default:{}break; - case RDI_SectionKind_Procedures: + case RDI_SectionKind_ProcedureSymbols: + case RDI_SectionKind_GlobalVariableSymbols: + case RDI_SectionKind_ThreadVariableSymbols: + case RDI_SectionKind_ConstantSymbols: { - RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, element_idx); + RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, accel->section, element_idx); String8 symbol_name = {0}; - symbol_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &symbol_name.size); - item_string = symbol_name; - }break; - case RDI_SectionKind_GlobalVariables: - { - RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, element_idx); - String8 symbol_name = {0}; - symbol_name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &symbol_name.size); - item_string = symbol_name; - }break; - case RDI_SectionKind_ThreadVariables: - { - RDI_ThreadVariable *tvar = rdi_element_from_name_idx(rdi, ThreadVariables, element_idx); - String8 symbol_name = {0}; - symbol_name.str = rdi_string_from_idx(rdi, tvar->name_string_idx, &symbol_name.size); - item_string = symbol_name; - }break; - case RDI_SectionKind_Constants: - { - RDI_Constant *cnst = rdi_element_from_name_idx(rdi, Constants, element_idx); - String8 symbol_name = {0}; - symbol_name.str = rdi_string_from_idx(rdi, cnst->name_string_idx, &symbol_name.size); + symbol_name.str = rdi_string_from_idx(rdi, symbol->name_string_idx, &symbol_name.size); item_string = symbol_name; }break; case RDI_SectionKind_UDTs: diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index fa5b52e0..5885076a 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -3313,7 +3313,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) U64 f_rip_voff = ctrl_voff_from_vaddr(module, f_rip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, f_rip_voff); + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, f_rip_voff); String8 procedure_name = {0}; procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); access_close(access); @@ -3358,7 +3358,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) U64 voff = ctrl_voff_from_vaddr(module, vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff); + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); RDI_Scope *root_scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx); if(procedure->root_scope_idx != 0) { @@ -3416,11 +3416,12 @@ RD_VIEW_UI_FUNCTION_DEF(memory) E_DbgInfo *dbg_info = e_dbg_info_from_module(module); DI_Key dbgi_key = dbg_info->dbgi_key; RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff); - if(gvar->voff != 0) + RDI_Symbol *gvar = rdi_global_variable_from_voff(rdi, voff); + U64 gvar_voff = rdi_voff_from_location(gvar->location); + if(gvar_voff != 0) { RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, gvar->type_idx); - Rng1U64 voff_range = r1u64(gvar->voff, gvar->voff + type_node->byte_size); + Rng1U64 voff_range = r1u64(gvar_voff, gvar_voff + type_node->byte_size); Rng1U64 vaddr_range = r1u64(voff_range.min + module->vaddr_range.min, voff_range.max + module->vaddr_range.min); next_vaddr = vaddr_range.max; next_vaddr = Max(next_vaddr, vaddr+1); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index e4ad86f4..2f3772e2 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -567,7 +567,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi != &rdi_parsed_nil) { - RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, rip_voff); + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, rip_voff); name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size); name = push_str8_copy(arena, name); } diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index fc476d53..b19941ec 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -77,7 +77,7 @@ ""; "// \"raddbg\\0\\0\""; "#define RDI_MAGIC_CONSTANT 0x0000676264646172"; - "#define RDI_ENCODING_VERSION 21"; + "#define RDI_ENCODING_VERSION 22"; ""; "////////////////////////////////////////////////////////////////"; "//~ Format Types & Functions"; @@ -179,52 +179,36 @@ RDI_SectionTable: {Members members RDI_Member 0x0015 U32 ""} {EnumMembers enum_members RDI_EnumMember 0x0016 U32 ""} - //- TODO(rjf): vvv old story for symbols - {GlobalVariables global_variables RDI_GlobalVariable 0x0017 U32 ""} - {ThreadVariables thread_variables RDI_ThreadVariable 0x0018 U32 ""} - {Constants constants RDI_Constant 0x0019 U32 ""} - {Procedures procedures RDI_Procedure 0x001A U32 ""} - {Locals locals RDI_Local 0x001B U32 ""} - - //- rjf: scope info - {Scopes scopes RDI_Scope 0x001C U32 ""} - {ScopeVOffData scope_voff_data RDI_U64 0x001D U32 ""} - {ScopeVMap scope_vmap RDI_VMapEntry 0x001E - ""} - {InlineSites inline_sites RDI_InlineSite 0x001F U32 ""} + {Scopes scopes RDI_Scope 0x0017 U32 ""} + {ScopeVOffData scope_voff_data RDI_U64 0x0018 U32 ""} + {ScopeVMap scope_vmap RDI_VMapEntry 0x0019 - ""} + {InlineSites inline_sites RDI_InlineSite 0x001A U32 ""} - //- TODO(rjf): vvv old story for locations - {LocationBlocks location_blocks RDI_LocationBlock 0x0020 U32 ""} - {LocationData location_data RDI_U8 0x0021 U32 ""} + //- rjf: symbols + {GlobalVariableSymbols global_variable_symbols RDI_Symbol 0x001B U32 ""} + {GlobalVMap global_vmap RDI_VMapEntry 0x001C - ""} + {ThreadVariableSymbols thread_variable_symbols RDI_Symbol 0x001D U32 ""} + {ConstantSymbols constant_symbols RDI_Symbol 0x001E U32 ""} + {ProcedureSymbols procedure_symbols RDI_Symbol 0x001F U32 ""} + {LocalVariableSymbols local_variable_symbols RDI_Symbol 0x0020 U32 ""} - //- NOTE(rjf): vvv new story for symbols - {GlobalVariableSymbols global_variable_symbols RDI_Symbol 0x0022 U32 ""} - {GlobalVMap global_vmap RDI_VMapEntry 0x0023 - ""} - {ThreadVariableSymbols thread_variable_symbols RDI_Symbol 0x0024 U32 ""} - {ConstantSymbols constant_symbols RDI_Symbol 0x0025 U32 ""} - {ProcedureSymbols procedure_symbols RDI_Symbol 0x0026 U32 ""} - {LocalVariableSymbols local_variable_symbols RDI_Symbol 0x0027 U32 ""} - - //- NOTE(rjf): vvv new story for locations - {LocationsBytecodeData locations_bytecode_data RDI_U8 0x0028 U32 ""} - {LocationsConstantData locations_constant_data RDI_U8 0x0029 U32 ""} - {LocationsSetElements locations_set_elements RDI_LocationSetElement 0x002A U32 ""} - - //- TODO(rjf): vvv old story for locations (constants) - {ConstantValueData constant_value_data RDI_U8 0x002B U32 ""} - {ConstantValueTable constant_value_table RDI_U32 0x002C U32 ""} + //- rjf: locations + {LocationsBytecodeData locations_bytecode_data RDI_U8 0x0021 U32 ""} + {LocationsConstantData locations_constant_data RDI_U8 0x0022 U32 ""} + {LocationsSetElements locations_set_elements RDI_LocationSetElement 0x0023 U32 ""} //- rjf: checksums / timestamps - {MD5Checksums md5_checksums RDI_MD5 0x002D U32 ""} - {SHA1Checksums sha1_checksums RDI_SHA1 0x002E U32 ""} - {SHA256Checksums sha256_checksums RDI_SHA256 0x002F U32 ""} - {Timestamps timestamps RDI_U64 0x0030 U32 ""} + {MD5Checksums md5_checksums RDI_MD5 0x0024 U32 ""} + {SHA1Checksums sha1_checksums RDI_SHA1 0x0025 U32 ""} + {SHA256Checksums sha256_checksums RDI_SHA256 0x0026 U32 ""} + {Timestamps timestamps RDI_U64 0x0027 U32 ""} //- rjf: name maps - {NameMaps name_maps RDI_NameMap 0x0031 U32 ""} - {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x0032 U32 ""} - {NameMapNodes name_map_nodes RDI_NameMapNode 0x0033 U32 ""} - {COUNT count RDI_U8 0x0034 - ""} + {NameMaps name_maps RDI_NameMap 0x0028 U32 ""} + {NameMapBuckets name_map_buckets RDI_NameMapBucket 0x0029 U32 ""} + {NameMapNodes name_map_nodes RDI_NameMapNode 0x002A U32 ""} + {COUNT count RDI_U8 0x002B - ""} } @table(name value) @@ -1016,22 +1000,6 @@ RDI_ContainerFlagTable: {KindMask `0x7f`} } -@table(name value) -RDI_LinkFlagTable: -{ - {External `1<<0`} - {TypeScoped `1<<1`} - {ProcScoped `1<<2`} -} - -@table(name value) -RDI_LocalKindTable: -{ - {NULL 0x0} - {Parameter 0x1} - {Variable 0x2} -} - @table(name value) RDI_LocationKindTable: { @@ -1075,47 +1043,6 @@ RDI_SymbolMemberTable: {link_name_string_idx RDI_U32 ""} } -@table(name type desc) -RDI_GlobalVariableMemberTable: -{ - {name_string_idx RDI_U32 ""} - {link_flags RDI_LinkFlags ""} - {voff RDI_U64 ""} - {type_idx RDI_U32 ""} - {container_idx RDI_U32 ""} -} - -@table(name type desc) -RDI_ThreadVariableMemberTable: -{ - {name_string_idx RDI_U32 ""} - {link_flags RDI_LinkFlags ""} - {tls_off RDI_U32 ""} - {type_idx RDI_U32 ""} - {container_idx RDI_U32 ""} -} - -@table(name type desc) -RDI_ConstantMemberTable: -{ - {name_string_idx RDI_U32 ""} - {type_idx RDI_U32 ""} - {constant_value_idx RDI_U32 ""} -} - -@table(name type desc) -RDI_ProcedureMemberTable: -{ - {name_string_idx RDI_U32 ""} - {link_name_string_idx RDI_U32 ""} - {link_flags RDI_LinkFlags ""} - {type_idx RDI_U32 ""} - {root_scope_idx RDI_U32 ""} - {container_idx RDI_U32 ""} - {frame_base_location_first RDI_U32 ""} - {frame_base_location_opl RDI_U32 ""} -} - @table(name type desc) RDI_ScopeMemberTable: { @@ -1139,54 +1066,6 @@ RDI_InlineSiteMemberTable: {line_table_idx RDI_U32 ""} } -@table(name type desc) -RDI_LocalMemberTable: -{ - {kind RDI_LocalKind ""} - {name_string_idx RDI_U32 ""} - {type_idx RDI_U32 ""} - {pad RDI_U32 ""} - {location_first RDI_U32 ""} - {location_opl RDI_U32 ""} -} - -@table(name type desc) -RDI_LocationBlockMemberTable: -{ - {scope_off_first RDI_U32 } - {scope_off_opl RDI_U32 } - {location_data_off RDI_U32 } -} - -@table(name type desc) -RDI_LocationBytecodeStreamMemberTable: -{ - {kind RDI_LocationKind ""} - // [... 0] null terminated byte sequence RDI_EvalBytecodeStream -} - -@table(name type desc) -RDI_LocationRegPlusU16MemberTable: -{ - {kind RDI_LocationKind } - {reg_code RDI_RegCode } - {offset RDI_U16 } -} - -@table(name type desc) -RDI_LocationRegMemberTable: -{ - {kind RDI_LocationKind } - {reg_code RDI_RegCode } -} - -@table(name type desc) -RDI_RegAndOffsetU16MemberTable: -{ - {reg_code RDI_RegCode } - {offset RDI_U16 } -} - @table(name type desc) RDI_LocationSetElementMemberTable: { @@ -1207,16 +1086,6 @@ RDI_LocationSetElementMemberTable: @expand(RDI_ContainerFlagTable a) `$(a.name .. =>20) = $(a.value)`, } -@enum(RDI_U32) RDI_LinkFlags: -{ - @expand(RDI_LinkFlagTable a) `$(a.name .. =>20) = $(a.value)` -} - -@enum(RDI_U32) RDI_LocalKind: -{ - @expand(RDI_LocalKindTable a) `$(a.name .. =>20) = $(a.value)` -} - @enum(RDI_U8) RDI_SymbolFlags: { @expand(RDI_SymbolFlagTable a) `$(a.name .. =>20) = $(a.value)` @@ -1265,11 +1134,6 @@ RDI_LocationSetElementMemberTable: @expand(RDI_LinkFlagTable a) `$(a.name != COUNT -> a.name)`; } -@xlist RDI_LocalKind_XList: -{ - @expand(RDI_LocalKindTable a) `$(a.name != COUNT -> a.name)`; -} - @xlist RDI_LocationKind_XList: { @expand(RDI_LocationKindTable a) `$(a.name != COUNT -> a.name)`; @@ -1285,21 +1149,6 @@ RDI_LocationSetElementMemberTable: @expand(RDI_SymbolMemberTable a) `$(a.type), $(a.name)` } -@xlist RDI_GlobalVariable_XList: -{ - @expand(RDI_GlobalVariableMemberTable a) `$(a.type), $(a.name)` -} - -@xlist RDI_ThreadVariable_XList: -{ - @expand(RDI_ThreadVariableMemberTable a) `$(type), $(a.name)` -} - -@xlist RDI_Procedure_XList: -{ - @expand(RDI_ProcedureMemberTable a) `$(a.type), $(a.name)` -} - @xlist RDI_Scope_XList: { @expand(RDI_ScopeMemberTable a) `$(a.type), $(a.name)` @@ -1310,41 +1159,6 @@ RDI_LocationSetElementMemberTable: @expand(RDI_InlineSiteMemberTable a) `$(a.type), $(a.name)` } -@xlist RDI_Local_XList: -{ - @expand(RDI_LocalMemberTable a) `$(a.type), $(a.name)` -} - -@xlist RDI_LocationBlock_XList: -{ - @expand(RDI_LocationBlockMemberTable a) `$(a.type), $(a.name)` -} - -@xlist RDI_LocationBytecodeStream_XList: -{ - @expand(RDI_LocationBytecodeStreamMemberTable a) `$(a.type), $(a.name)` -} - -@xlist RDI_LocationRegPlusU16_XList: -{ - @expand(RDI_LocationRegPlusU16MemberTable a) `$(a.type), $(a.name)` -} - -@xlist RDI_LocationReg_XList: -{ - @expand(RDI_LocationRegMemberTable a) `$(a.type), $(a.name)` -} - -@xlist RDI_RegAndOffsetU16_XList: -{ - @expand(RDI_RegAndOffsetU16MemberTable a) `$(a.type), $(a.name)` -} - -@xlist RDI_LocationSetElement_XList: -{ - @expand(RDI_LocationSetElementMemberTable a) `$(a.type), $(a.name)` -} - //- rjf: structs @struct RDI_Namespace: @@ -1357,26 +1171,6 @@ RDI_LocationSetElementMemberTable: @expand(RDI_SymbolMemberTable a) `$(a.type) $(a.name)` } -@struct RDI_GlobalVariable: -{ - @expand(RDI_GlobalVariableMemberTable a) `$(a.type) $(a.name)` -} - -@struct RDI_ThreadVariable: -{ - @expand(RDI_ThreadVariableMemberTable a) `$(a.type) $(a.name)` -} - -@struct RDI_Constant: -{ - @expand(RDI_ConstantMemberTable a) `$(a.type) $(a.name)` -} - -@struct RDI_Procedure: -{ - @expand(RDI_ProcedureMemberTable a) `$(a.type) $(a.name)` -} - @struct RDI_Scope: { @expand(RDI_ScopeMemberTable a) `$(a.type) $(a.name)` @@ -1387,36 +1181,6 @@ RDI_LocationSetElementMemberTable: @expand(RDI_InlineSiteMemberTable a) `$(a.type) $(a.name)` } -@struct RDI_Local: -{ - @expand(RDI_LocalMemberTable a) `$(a.type) $(a.name)` -} - -@struct RDI_LocationBlock: -{ - @expand(RDI_LocationBlockMemberTable a) `$(a.type) $(a.name)` -} - -@struct RDI_LocationBytecodeStream: -{ - @expand(RDI_LocationBytecodeStreamMemberTable a) `$(a.type) $(a.name)` -} - -@struct RDI_LocationRegPlusU16: -{ - @expand(RDI_LocationRegPlusU16MemberTable a) `$(a.type) $(a.name)` -} - -@struct RDI_LocationReg: -{ - @expand(RDI_LocationRegMemberTable a) `$(a.type) $(a.name)` -} - -@struct RDI_RegAndOffsetU16: -{ - @expand(RDI_RegAndOffsetU16MemberTable a) `$(a.type) $(a.name)` -} - @struct RDI_LocationSetElement: { @expand(RDI_LocationSetElementMemberTable a) `$(a.type) $(a.name)` diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 493a3524..f9971972 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -93,20 +93,6 @@ rdi_string_from_language(Arena *arena, RDI_Language v) return result; } -internal String8 -rdi_string_from_local_kind(Arena *arena, RDI_LocalKind v) -{ - String8 result = {0}; - switch(v) - { - default:{result = push_str8f(arena, "", v);}break; -#define X(name) case RDI_LocalKind_##name:{result = str8_lit(#name);}break; - RDI_LocalKind_XList -#undef X - } - return result; -} - #if 0 internal String8 rdi_string_from_type_kind(Arena *arena, RDI_TypeKind v) @@ -251,21 +237,6 @@ rdi_string_from_udt_flags(Arena *arena, RDI_UDTFlags flags) return result; } -internal String8 -rdi_string_from_link_flags(Arena *arena, RDI_LinkFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; -#define X(name) if (flags & RDI_LinkFlag_##name) { flags &= ~RDI_LinkFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); } - RDI_LinkFlags_XList; -#undef X - StringJoin join = {.sep = str8_lit("|")}; - String8 result = str8_list_join(arena, &list, &join); - if(result.size == 0) { result = str8_lit("None"); } - scratch_end(scratch); - return result; -} - internal String8 rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc) { @@ -427,103 +398,6 @@ rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc) return result; } -internal String8List -rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range) -{ - String8List strings = {0}; - Temp scratch = scratch_begin(&arena, 1); - U64 location_block_count = 0; - U64 location_data_size = 0; - RDI_LocationBlock *location_block_array = rdi_table_from_name(rdi, LocationBlocks, &location_block_count); - RDI_U8 *location_data = rdi_table_from_name(rdi, LocationData, &location_data_size); - Rng1U64 location_block_range_clamped = r1u64(ClampTop(location_block_range.min, location_block_count), - ClampTop(location_block_range.max, location_block_count)); - for(U64 block_idx = location_block_range_clamped.min; - block_idx < location_block_range_clamped.max; - block_idx +=1) - { - String8 qualifier = {0}; - String8 location_info = {0}; - RDI_LocationBlock *block_ptr = &location_block_array[block_idx]; - if(block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32) - { - qualifier = str8_lit("*always*"); - } - else - { - qualifier = push_str8f(scratch.arena, "[%#08x, %#08x): ", block_ptr->scope_off_first, block_ptr->scope_off_opl); - } - if(block_ptr->location_data_off >= location_data_size) - { - location_info = push_str8f(scratch.arena, "", block_ptr->location_data_off); - } - else - { - U8 *loc_data_opl = location_data + location_data_size; - U8 *loc_base_ptr = location_data + block_ptr->location_data_off; - RDI_LocationKind kind = *(RDI_LocationKind *)loc_base_ptr; - switch(kind) - { - default: - { - location_info = push_str8f(scratch.arena, "\?\?\? (%u)", kind); - }break; - case RDI_LocationKind_AddrBytecodeStream: - { - String8 bc = str8_range(loc_base_ptr + 1, loc_data_opl); - String8 bc_str = rdi_string_from_bytecode(scratch.arena, arch, bc); - location_info = push_str8f(scratch.arena, "AddrBytecodeStream(%S)", bc_str); - }break; - case RDI_LocationKind_ValBytecodeStream: - { - String8 bc = str8_range(loc_base_ptr + 1, loc_data_opl); - String8 bc_str = rdi_string_from_bytecode(scratch.arena, arch, bc); - location_info = push_str8f(scratch.arena, "ValBytecodeStream(%S)", bc_str); - }break; - case RDI_LocationKind_AddrRegPlusU16: - { - if(loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl) - { - location_info = push_str8f(scratch.arena, "AddrRegPlusU16(\?\?\?)"); - } - else - { - RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr; - location_info = push_str8f(scratch.arena, "AddrRegPlusU16(reg: %S, off: %u)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); - } - }break; - case RDI_LocationKind_AddrAddrRegPlusU16: - { - if(loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl) - { - location_info = push_str8f(scratch.arena, "AddrAddrRegPlusU16(\?\?\?)"); - } - else - { - RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16 *)loc_base_ptr; - location_info = push_str8f(scratch.arena, "AddrAddrRegisterPlusU16(reg: %S, off: %u)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code), loc->offset); - } - }break; - case RDI_LocationKind_ValReg: - { - if(loc_base_ptr + sizeof(RDI_LocationReg) > loc_data_opl) - { - location_info = push_str8f(scratch.arena, "ValReg(\?\?\?)"); - } - else - { - RDI_LocationReg *loc = (RDI_LocationReg*)loc_base_ptr; - location_info = push_str8f(scratch.arena, "ValReg(reg: %S)", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code)); - } - } break; - } - } - str8_list_pushf(arena, &strings, "%S: %S", qualifier, location_info); - } - scratch_end(scratch); - return strings; -} - //////////////////////////////// //~ rjf: RDI Dumping @@ -997,30 +871,6 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse } } - ////////////////////////////// - //- rjf: dump global variables - // -#if 0 // TODO(rjf): @locpass - DumpSubset(GlobalVariables) - { - U64 count = 0; - RDI_GlobalVariable *v = rdi_table_from_name(rdi, GlobalVariables, &count); - Rng1U64 range = lane_range(count); - for EachInRange(idx, range) - { - RDI_GlobalVariable *gvar = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - dumpf("\n '%S': // global_variable[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, gvar->name_string_idx), idx); - dumpf(" link_flags: `%S`\n", rdi_string_from_link_flags(scratch.arena, gvar->link_flags)); - dumpf(" voff: %#08x\n", gvar->voff); - dumpf(" type_idx: %u\n", gvar->type_idx); - dumpf(" container_idx: %u\n", gvar->container_idx); - dumpf(" }\n"); - scratch_end(scratch); - } - } -#endif - ////////////////////////////// //- rjf: dump global variables vmap // @@ -1036,86 +886,6 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse } } - ////////////////////////////// - //- rjf: dump thread variables - // -#if 0 // TODO(rjf): @locpass - DumpSubset(ThreadVariables) - { - U64 count = 0; - RDI_ThreadVariable *v = rdi_table_from_name(rdi, ThreadVariables, &count); - Rng1U64 range = lane_range(count); - for EachInRange(idx, range) - { - RDI_ThreadVariable *tvar = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - dumpf("\n '%S': // thread_variable[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, tvar->name_string_idx), idx); - dumpf(" link_flags: `%S`\n", rdi_string_from_link_flags(scratch.arena, tvar->link_flags)); - dumpf(" tls_off: %#08x\n", tvar->tls_off); - dumpf(" type_idx: %u\n", tvar->type_idx); - dumpf(" container_idx: %u\n", tvar->container_idx); - dumpf(" }\n"); - scratch_end(scratch); - } - } -#endif - - ////////////////////////////// - //- rjf: dump constants - // -#if 0 // TODO(rjf): @locpass - DumpSubset(Constants) - { - U64 count = 0; - RDI_Constant *v = rdi_table_from_name(rdi, Constants, &count); - Rng1U64 range = lane_range(count); - for EachInRange(idx, range) - { - RDI_Constant *cnst = &v[idx]; - dumpf("\n '%S': // constant[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, cnst->name_string_idx), idx); - dumpf(" type_idx: %u\n", cnst->type_idx); - dumpf(" }\n"); - } - } -#endif - - ////////////////////////////// - //- rjf: dump procedures - // -#if 0 // TODO(rjf): @locpass - DumpSubset(Procedures) - { - RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); - U64 count = 0; - RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count); - Rng1U64 range = lane_range(count); - for EachInRange(idx, range) - { - RDI_Procedure *proc = &v[idx]; - Temp scratch = scratch_begin(&arena, 1); - dumpf("\n '%S': // procedure[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, proc->name_string_idx), idx); - dumpf(" link_name: '%S'\n", str8_from_rdi_string_idx(rdi, proc->link_name_string_idx)); - dumpf(" link_flags: `%S`\n", rdi_string_from_link_flags(scratch.arena, proc->link_flags)); - dumpf(" type_idx: %u\n", proc->type_idx); - dumpf(" root_scope_idx: %u\n", proc->root_scope_idx); - dumpf(" container_idx: %u\n", proc->container_idx); - if(proc->frame_base_location_first != 0) - { - String8List frame_base_location_strings = rdi_strings_from_locations(scratch.arena, rdi, tli->arch, r1u64(proc->frame_base_location_first, proc->frame_base_location_opl)); - dumpf(" frame_base: // (first: %u, opl: %u)\n", proc->frame_base_location_first, proc->frame_base_location_opl); - dumpf(" {\n"); - for(String8Node *n = frame_base_location_strings.first; n != 0; n = n->next) - { - dumpf(" %S\n", n->string); - } - dumpf(" }\n"); - } - dumpf(" }\n"); - scratch_end(scratch); - } - } -#endif - ////////////////////////////// //- rjf: dump symbols // @@ -1514,7 +1284,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse #if SUBPROGRAM_CONVERSION_TEST internal String8 -rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_TypeNode *type) +rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Symbol *proc, RDI_TypeNode *type) { Temp scratch = scratch_begin(&arena, 1); diff --git a/src/rdi/rdi_local.h b/src/rdi/rdi_local.h index 98dd57bc..dde001e1 100644 --- a/src/rdi/rdi_local.h +++ b/src/rdi/rdi_local.h @@ -82,7 +82,6 @@ internal String8 str8_from_rdi_path_node_idx(Arena *arean, RDI_Parsed *rdi, Path internal String8 rdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v); internal String8 rdi_string_from_arch (Arena *arena, RDI_Arch v); internal String8 rdi_string_from_language (Arena *arena, RDI_Language v); -internal String8 rdi_string_from_local_kind (Arena *arena, RDI_LocalKind v); #if 0 // TODO(rjf): conflicts with RDI... internal String8 rdi_string_from_type_kind (Arena *arena, RDI_TypeKind v); #endif @@ -92,9 +91,7 @@ internal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind); internal String8 rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags); internal String8 rdi_string_from_type_modifier_flags (Arena *arena, RDI_TypeModifierFlags flags); internal String8 rdi_string_from_udt_flags (Arena *arena, RDI_UDTFlags flags); -internal String8 rdi_string_from_link_flags (Arena *arena, RDI_LinkFlags flags); internal String8 rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc); -internal String8List rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range); //////////////////////////////// //~ rjf: RDI Dumping @@ -104,6 +101,6 @@ internal String8List rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RD //////////////////////////////// //~ Type Formatter -internal String8 rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Procedure *proc, RDI_TypeNode *type); +internal String8 rdi_string_from_type(Arena *arena, RDI_Parsed *rdi, RDI_Symbol *proc, RDI_TypeNode *type); #endif // RDI_FORMAT_LOCAL_H diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index d72ac799..09f79400 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -3112,13 +3112,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) bake_params.udts = g_d2r_shared.udts; bake_params.src_files = g_d2r_shared.src_files; bake_params.line_tables = g_d2r_shared.line_tables; -#if 0 // TODO(rjf): @locpass - bake_params.global_variables = g_d2r_shared.gvars; - bake_params.thread_variables = g_d2r_shared.tvars; - bake_params.procedures = g_d2r_shared.procs; - bake_params.scopes = g_d2r_shared.scopes; - bake_params.inline_sites = g_d2r_shared.inline_sites; -#endif scratch_end(scratch); return bake_params; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index a5c02b6d..7486e253 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -337,41 +337,6 @@ p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code return result; } -internal void -p2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) -{ - //- rjf: extract range info - U64 voff_first = 0; - U64 voff_opl = 0; - if(section != 0) - { - voff_first = section->voff + range->off; - voff_opl = voff_first + range->len; - } - - //- rjf: emit location for ranges not coverd by gaps - CV_LvarAddrGap *gap_ptr = gaps; - U64 voff_cursor = voff_first; - for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) - { - U64 voff_gap_first = voff_first + gap_ptr->off; - U64 voff_gap_opl = voff_gap_first + gap_ptr->len; - if(voff_cursor < voff_gap_first) - { - RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first}; - rdim_local_push_location_case(arena, scopes, local, loc, voff_range); - } - voff_cursor = voff_gap_opl; - } - - //- rjf: emit remaining range - if(voff_cursor < voff_opl) - { - RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl}; - rdim_local_push_location_case(arena, scopes, local, loc, voff_range); - } -} - internal void p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) { @@ -3664,7 +3629,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: determine if this is a parameter B32 is_param = (regrel_idx < curr_proc_symbol->type->count); - RDI_LocalKind local_kind = is_param ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable; // rjf: determine if we need an extra indirection to the value B32 extra_indirection_to_value = 0; @@ -3674,7 +3638,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { case RDI_Arch_X64: { - extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); + extra_indirection_to_value = (is_param && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); }break; } } @@ -3729,29 +3693,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) rdim_location_case_list_push(arena, &local->location_cases, loc, voff_range); } } - -#if 0 // TODO(rjf): @locpass - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; - - // rjf: add location info to local - { - // rjf: get raddbg register code - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - // TODO(rjf): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; - - // rjf: build location - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_local_push_location_case(arena, sym_scopes, local, &loc, voff_range); - } -#endif } regrel_idx += 1; @@ -3831,13 +3772,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: is not a global modification -> emit a local variable if(!is_global_modification) { - // rjf: determine local kind - RDI_LocalKind local_kind = RDI_LocalKind_Variable; - if(slocal->flags & CV_LocalFlag_Param) - { - local_kind = RDI_LocalKind_Parameter; - } - // rjf: build local RDIM_Scope *scope = top_scope_node->scope; RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); @@ -3847,15 +3781,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) local->type = type; } -#if 0 // TODO(rjf): @locpass - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope); - local->kind = local_kind; - local->name = name; - local->type = type; -#endif - // rjf: save defrange target, for subsequent defrange symbols defrange_target = local; } diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index bbb61055..5a34c69c 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -112,7 +112,6 @@ internal RDI_ChecksumKind p2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k internal RDI_RegCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); internal RDIM_Location p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); -internal void p2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); internal void p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); //////////////////////////////// diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index a2dc7532..a0f69ce8 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2753,216 +2753,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } lane_sync(); - ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage compute lane location block layout - // -#if 0 // TODO(rjf): @locpass - typedef struct LocLayout LocLayout; - struct LocLayout - { - RDI_U64 *location_case_chunk_lane_counts; // [lane_count * (scope_chunk_count + procedure_chunk_count) - RDI_U64 *location_case_chunk_lane_offs; // [lane_count * (scope_chunk_count + procedure_chunk_count) - RDI_U64 total_location_case_count; - }; - LocLayout *loc_layout = 0; - U64 total_location_case_chunk_count = (all_scopes->chunk_count + params->procedures.chunk_count); - ProfScope("compute lane location block layout") - { - // rjf: set up - if(lane_idx() == 0) - { - loc_layout = push_array(scratch.arena, LocLayout, 1); - loc_layout->location_case_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * total_location_case_chunk_count); - loc_layout->location_case_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * total_location_case_chunk_count); - } - lane_sync_u64(&loc_layout, 0); - - // rjf: per-chunk-lane count of location cases - { - // rjf: count location cases in scopes - U64 chunk_idx = 0; - for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) - { - U64 slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; - Rng1U64 range = lane_range(n->count); - for EachInRange(idx, range) - { - for EachNode(local, RDIM_Local, n->v[idx].first_local) - { - loc_layout->location_case_chunk_lane_counts[slot_idx] += local->location_cases.count; - } - } - chunk_idx += 1; - } - - // rjf: count location cases in procedures - for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first) - { - U64 slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; - Rng1U64 range = lane_range(n->count); - for EachInRange(idx, range) - { - loc_layout->location_case_chunk_lane_counts[slot_idx] += n->v[idx].location_cases.count; - } - chunk_idx += 1; - } - } - lane_sync(); - - // rjf: lay out location case offsets - if(lane_idx() == 0) - { - U64 chunk_idx = 0; - U64 location_case_layout_off = 1; - for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) - { - for EachIndex(l_idx, lane_count()) - { - U64 slot_idx = l_idx * total_location_case_chunk_count + chunk_idx; - loc_layout->location_case_chunk_lane_offs[slot_idx] = location_case_layout_off; - location_case_layout_off += loc_layout->location_case_chunk_lane_counts[slot_idx]; - } - chunk_idx += 1; - } - for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first) - { - for EachIndex(l_idx, lane_count()) - { - U64 slot_idx = l_idx * total_location_case_chunk_count + chunk_idx; - loc_layout->location_case_chunk_lane_offs[slot_idx] = location_case_layout_off; - location_case_layout_off += loc_layout->location_case_chunk_lane_counts[slot_idx]; - } - chunk_idx += 1; - } - loc_layout->total_location_case_count = location_case_layout_off; - } - } - lane_sync(); -#endif - - ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage bake location blocks - // -#if 0 // TODO(rjf): @locpass - RDIM_LocationBlockBakeResult *baked_location_blocks = 0; - ProfScope("bake location blocks") - { - // rjf: set up - if(lane_idx() == 0) - { - baked_location_blocks = push_array(scratch.arena, RDIM_LocationBlockBakeResult, 1); - baked_location_blocks->location_blocks_count = loc_layout->total_location_case_count; - baked_location_blocks->location_blocks = push_array(arena, RDI_LocationBlock, baked_location_blocks->location_blocks_count); - } - lane_sync_u64(&baked_location_blocks, 0); - - // rjf: wide fill from scopes - U64 chunk_idx = 0; - ProfScope("wide fill from scopes") - { - for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) - { - U64 layout_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; - U64 layout_off = loc_layout->location_case_chunk_lane_offs[layout_slot_idx]; - Rng1U64 range = lane_range(n->count); - for EachInRange(idx, range) - { - for EachNode(local, RDIM_Local, n->v[idx].first_local) - { - for EachNode(src, RDIM_LocationCase, local->location_cases.first) - { - RDI_LocationBlock *dst = &baked_location_blocks->location_blocks[layout_off]; - dst->scope_off_first = (RDI_U32)src->voff_range.min; // TODO(rjf): @u64_to_u32 - dst->scope_off_opl = (RDI_U32)src->voff_range.max; // TODO(rjf): @u64_to_u32 - dst->location_data_off = (RDI_U32)rdim_off_from_location(src->location); // TODO(rjf): @u64_to_u32 - layout_off += 1; - } - } - } - chunk_idx += 1; - } - } - - // rjf: wide fill from procedures - ProfScope("wide fill from procedures") - { - for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first) - { - U64 layout_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx; - U64 layout_off = loc_layout->location_case_chunk_lane_offs[layout_slot_idx]; - Rng1U64 range = lane_range(n->count); - for EachInRange(idx, range) - { - for EachNode(src, RDIM_LocationCase, n->v[idx].location_cases.first) - { - RDI_LocationBlock *dst = &baked_location_blocks->location_blocks[layout_off]; - dst->scope_off_first = (RDI_U32)src->voff_range.min; // TODO(rjf): @u64_to_u32 - dst->scope_off_opl = (RDI_U32)src->voff_range.max; // TODO(rjf): @u64_to_u32 - dst->location_data_off = (RDI_U32)rdim_off_from_location(src->location); // TODO(rjf): @u64_to_u32 - layout_off += 1; - } - } - chunk_idx += 1; - } - } - } -#endif - - ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage bake locations (OLD) - // -#if 0 // TODO(rjf): @locpass - RDIM_LocationBakeResult *baked_locations = 0; - ProfScope("bake locations") - { - if(lane_idx() == 0) - { - baked_locations = push_array(scratch.arena, RDIM_LocationBakeResult, 1); - baked_locations->location_data_size = params->locations.total_encoded_size+1; - baked_locations->location_data = push_array(arena, RDI_U8, baked_locations->location_data_size); - } - lane_sync_u64(&baked_locations, 0); - for EachNode(n, RDIM_LocationChunkNode, params->locations.first) - { - Rng1U64 range = lane_range(n->count); - for EachInRange(n_idx, range) - { - RDIM_Location *loc = &n->v[n_idx]; - RDI_U8 *dst = &baked_locations->location_data[n->base_encoding_off + loc->relative_encoding_off + 1]; - switch((RDI_LocationKindEnum)loc->info.kind) - { - case RDI_LocationKind_NULL:{}break; - case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_ValBytecodeStream: - { - MemoryCopy(dst+0, &loc->info.kind, sizeof(loc->info.kind)); - RDI_U64 write_off = sizeof(loc->info.kind); - for EachNode(op_node, RDIM_EvalBytecodeOp, loc->info.bytecode.first_op) - { - MemoryCopy(dst + write_off, &op_node->op, 1); - write_off += 1; - MemoryCopy(dst + write_off, &op_node->p, op_node->p_size); - write_off += op_node->p_size; - } - dst[write_off] = 0; - }break; - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: - { - RDI_LocationRegPlusU16 baked = {loc->info.kind, loc->info.reg_code, loc->info.offset}; - MemoryCopy(dst, &baked, sizeof(baked)); - }break; - case RDI_LocationKind_ValReg: - { - RDI_LocationReg baked = {loc->info.kind, loc->info.reg_code}; - MemoryCopy(dst, &baked, sizeof(baked)); - }break; - } - } - } - } -#endif - ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute layout for scope sub-lists (locals / voffs) // @@ -3150,178 +2940,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } lane_sync_u64(&all_locals, 0); - ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage bake procedures - // -#if 0 // TODO(rjf): @locpass - RDIM_ProcedureBakeResult *baked_procedures = 0; - ProfScope("bake procedures") - { - if(lane_idx() == 0) - { - baked_procedures = push_array(scratch.arena, RDIM_ProcedureBakeResult, 1); - baked_procedures->procedures_count = params->procedures.total_count+1; - baked_procedures->procedures = push_array(arena, RDI_Procedure, baked_procedures->procedures_count); - } - lane_sync_u64(&baked_procedures, 0); - { - U64 chunk_idx = 0; - for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first) - { - U64 location_block_layout_slot_idx = lane_idx()*total_location_case_chunk_count + all_scopes->chunk_count + chunk_idx; - U64 location_block_off = loc_layout->location_case_chunk_lane_offs[location_block_layout_slot_idx]; - Rng1U64 range = lane_range(n->count); - for EachInRange(n_idx, range) - { - RDIM_Symbol *src = &n->v[n_idx]; - RDI_Procedure *dst = &baked_procedures->procedures[n->base_idx + n_idx + 1]; - dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); - dst->link_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->link_name); - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_scope != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_scope->symbol); // TODO(rjf): @u64_to_u32 - } - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 - if(src->location_cases.count != 0) - { - dst->frame_base_location_first = location_block_off; - dst->frame_base_location_opl = location_block_off + src->location_cases.count; - location_block_off += src->location_cases.count; - } - } - chunk_idx += 1; - } - } - } -#endif - - ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage compute layout for constant data - // -#if 0 // TODO(rjf): @locpass - typedef struct ConstantLayout ConstantLayout; - struct ConstantLayout - { - RDI_U64 *constant_data_chunk_lane_counts; // [lane_count * constant_chunk_count] - RDI_U64 *constant_data_chunk_lane_offs; // [lane_count * constant_chunk_count] - }; - ConstantLayout *constant_layout = 0; - ProfScope("compute layout for constant data") - { - // rjf: set up - if(lane_idx() == 0) - { - constant_layout = push_array(scratch.arena, ConstantLayout, 1); - constant_layout->constant_data_chunk_lane_counts = push_array(arena, U64, lane_count() * params->constants.chunk_count); - constant_layout->constant_data_chunk_lane_offs = push_array(arena, U64, lane_count() * params->constants.chunk_count); - } - lane_sync_u64(&constant_layout, 0); - - // rjf: count - { - U64 chunk_idx = 0; - for EachNode(n, RDIM_SymbolChunkNode, params->constants.first) - { - U64 slot_idx = lane_idx()*params->constants.chunk_count + chunk_idx; - Rng1U64 range = lane_range(n->count); - for EachInRange(idx, range) - { - constant_layout->constant_data_chunk_lane_counts[slot_idx] += n->v[idx].value_data.size; - } - chunk_idx += 1; - } - } - lane_sync(); - - // rjf: layout - if(lane_idx() == 0) - { - U64 chunk_idx = 0; - U64 layout_off = 0; - for EachNode(n, RDIM_SymbolChunkNode, params->constants.first) - { - for EachIndex(l_idx, lane_count()) - { - U64 slot_idx = l_idx*params->constants.chunk_count + chunk_idx; - constant_layout->constant_data_chunk_lane_offs[slot_idx] = layout_off; - layout_off += constant_layout->constant_data_chunk_lane_counts[slot_idx]; - } - chunk_idx += 1; - } - } - } - lane_sync(); -#endif - - ////////////////////////////////////////////////////////////// - //- rjf: @rdim_bake_stage bake constants - // -#if 0 // TODO(rjf): @locpass - RDIM_ConstantsBakeResult *baked_constants = 0; - ProfScope("bake constants") - { - // rjf: set up - if(lane_idx() == 0) - { - baked_constants = push_array(scratch.arena, RDIM_ConstantsBakeResult, 1); - } - lane_sync_u64(&baked_constants, 0); - if(lane_idx() == lane_from_task_idx(0)) - { - baked_constants->constant_values_count = params->constants.total_count+1; - baked_constants->constant_values = push_array(arena, RDI_U32, baked_constants->constant_values_count); - } - if(lane_idx() == lane_from_task_idx(1)) - { - baked_constants->constant_value_data_size = params->constants.total_value_data_size; - baked_constants->constant_value_data = push_array(arena, RDI_U8, baked_constants->constant_value_data_size); - } - if(lane_idx() == lane_from_task_idx(2)) - { - baked_constants->constants_count = params->constants.total_count+1; - baked_constants->constants = push_array(arena, RDI_Constant, baked_constants->constants_count); - } - lane_sync(); - - // rjf: wide bake - { - U64 chunk_idx = 0; - for EachNode(n, RDIM_SymbolChunkNode, params->constants.first) - { - U64 slot_idx = lane_idx()*params->constants.chunk_count + chunk_idx; - U64 value_data_off = constant_layout->constant_data_chunk_lane_offs[slot_idx]; - Rng1U64 range = lane_range(n->count); - for EachInRange(n_idx, range) - { - RDIM_Symbol *src = &n->v[n_idx]; - RDI_Constant *dst = &baked_constants->constants[1 + n->base_idx + n_idx]; - RDI_U32 *dst_value_off = &baked_constants->constant_values[1 + n->base_idx + n_idx]; - RDI_U8 *dst_value_data = baked_constants->constant_value_data + value_data_off; - dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - dst->constant_value_idx = 1 + n->base_idx + n_idx; - dst_value_off[0] = (RDI_U32)value_data_off; // TODO(rjf): @u64_to_u32 - rdim_memcpy(dst_value_data, src->value_data.str, src->value_data.size); - value_data_off += src->value_data.size; - } - chunk_idx += 1; - } - } - } - lane_sync(); -#endif - ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage bake units, types, inline sites // @@ -3463,72 +3081,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } - //- rjf: bake global variables -#if 0 // TODO(rjf): @locpass - ProfScope("bake global variables") - { - for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first) - { - Rng1U64 range = lane_range(n->count); - for EachInRange(n_idx, range) - { - RDIM_Symbol *src = &n->v[n_idx]; - RDI_GlobalVariable *dst = &baked_global_variables->global_variables[n->base_idx + n_idx + 1]; - dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); - dst->voff = src->offset; - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_scope != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_scope->symbol); // TODO(rjf): @u64_to_u32 - } - } - } - } -#endif - - //- rjf: bake thread variables -#if 0 // TODO(rjf): @locpass - ProfScope("bake thread variables") - { - for EachNode(n, RDIM_SymbolChunkNode, params->thread_variables.first) - { - Rng1U64 range = lane_range(n->count); - for EachInRange(n_idx, range) - { - RDIM_Symbol *src = &n->v[n_idx]; - RDI_ThreadVariable *dst = &baked_thread_variables->thread_variables[n->base_idx + n_idx + 1]; - dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name); - dst->tls_off = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32 - dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); - if(src->is_extern) - { - dst->link_flags |= RDI_LinkFlag_External; - } - if(src->container_type != 0) - { - dst->link_flags |= RDI_LinkFlag_TypeScoped; - dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32 - } - else if(src->container_scope != 0) - { - dst->link_flags |= RDI_LinkFlag_ProcScoped; - dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_scope->symbol); // TODO(rjf): @u64_to_u32 - } - } - } - } -#endif - //- rjf: bake inline sites ProfScope("bake inline sites") { From 7a59548d5bb50b5409a91c7a5301b028a39c71a4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 18 Apr 2026 11:44:11 -0700 Subject: [PATCH 406/850] remove 'Symbols' from section titles, now that old sections are gone --- src/ctrl/ctrl_core.c | 14 +++--- src/dbg_info/dbg_info.c | 14 +++--- src/disasm/disasm.c | 2 +- src/eval/eval_core.c | 4 +- src/eval/eval_ir.c | 12 ++--- .../eval_visualization_core.c | 2 +- src/lib_rdi/rdi.h | 50 +++++++++---------- src/lib_rdi/rdi_parse.c | 6 +-- src/radbin/radbin.c | 2 +- src/raddbg/raddbg_core.c | 10 ++-- src/raddbg/raddbg_eval.c | 16 +++--- src/rdi/rdi.mdesk | 10 ++-- src/rdi/rdi_local.c | 14 +++--- src/rdi_make/rdi_make_local.c | 10 ++-- 14 files changed, 83 insertions(+), 83 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 61170bc7..2ecfd9ad 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -4329,7 +4329,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); if(id_count > 0) { - RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariableSymbols, ids[0]); + RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]); U64 global_var_voff = rdi_voff_from_location(global_var->location); U64 global_var_vaddr = global_var_voff + module->vaddr_range.min; Arch arch = process->arch; @@ -5709,7 +5709,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5743,7 +5743,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5773,7 +5773,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5801,7 +5801,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5835,7 +5835,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { @@ -5880,7 +5880,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) procedure_id = ids[0]; } } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_id); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index fb7ade6e..a558e5f8 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1157,9 +1157,9 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * switch(section_kind) { default:{}break; - case RDI_SectionKind_ProcedureSymbols: - case RDI_SectionKind_GlobalVariableSymbols: - case RDI_SectionKind_ThreadVariableSymbols: + case RDI_SectionKind_Procedures: + case RDI_SectionKind_GlobalVariables: + case RDI_SectionKind_ThreadVariables: { element_name_idx_off = OffsetOf(RDI_Symbol, name_string_idx); }break; @@ -1562,10 +1562,10 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g }; read_only local_persist RDI_SectionKind name_map_section_kinds[] = { - RDI_SectionKind_GlobalVariableSymbols, - RDI_SectionKind_ThreadVariableSymbols, - RDI_SectionKind_ConstantSymbols, - RDI_SectionKind_ProcedureSymbols, + RDI_SectionKind_GlobalVariables, + RDI_SectionKind_ThreadVariables, + RDI_SectionKind_Constants, + RDI_SectionKind_Procedures, RDI_SectionKind_TypeNodes, }; Rng1U64 range = lane_range(dbgi_keys.count); diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index 1b201b81..5de6a860 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -419,7 +419,7 @@ dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_o { RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); RDI_U32 procedure_idx = scope->proc_idx; - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx); String8 procedure_name = {0}; procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); if(procedure_name.size != 0) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index ba562364..0164b02a 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -590,7 +590,7 @@ e_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) U32 local_opl_idx = scope->local_first + scope->local_count; for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1) { - RDI_Symbol *local_var = rdi_element_from_name_idx(rdi, LocalVariableSymbols, local_idx); + RDI_Symbol *local_var = rdi_element_from_name_idx(rdi, LocalVariables, local_idx); U64 local_name_size = 0; U8 *local_name_str = rdi_string_from_idx(rdi, local_var->name_string_idx, &local_name_size); String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size)); @@ -612,7 +612,7 @@ e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) //- rjf: tightest scope -> procedure U32 proc_idx = tightest_scope->proc_idx; - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, proc_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); //- rjf: procedure -> udt U32 udt_idx = procedure->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Type ? procedure->container_idx : 0; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 16585e97..eba59fca 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1810,7 +1810,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I U64 local_num = e_num_from_string(e_ir_ctx->locals_map, string__redirected); if(local_num != 0) { - RDI_Symbol *local = rdi_element_from_name_idx(rdi, LocalVariableSymbols, local_num-1); + RDI_Symbol *local = rdi_element_from_name_idx(rdi, LocalVariables, local_num-1); // rjf: extract local's type key RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local->type_idx); @@ -1958,9 +1958,9 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I switch(match.section_kind) { default:{}break; - case RDI_SectionKind_GlobalVariableSymbols: - case RDI_SectionKind_ThreadVariableSymbols: - case RDI_SectionKind_ConstantSymbols: + case RDI_SectionKind_GlobalVariables: + case RDI_SectionKind_ThreadVariables: + case RDI_SectionKind_Constants: { RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); U64 ip_voff = e_base_ctx->thread_ip_voff; @@ -1973,7 +1973,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I mapped_location_module = module; mapped_bytecode_mode = E_Mode_Offset; }break; - case RDI_SectionKind_ProcedureSymbols: + case RDI_SectionKind_Procedures: { RDI_Symbol *procedure = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); @@ -2479,7 +2479,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I { U64 vtable_voff = vtable_vaddr - module_base; U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff); - RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariableSymbols, global_idx); + RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); if(global_var->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Type) { RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 49524205..f41df3a5 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -2026,7 +2026,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) Temp scratch = scratch_begin(&arena, 1); RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); U64 proc_idx = scope->proc_idx; - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, proc_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); E_TypeKey type = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, dbg_info_num); String8 name = {0}; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index b354a04f..31aee8c7 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -102,12 +102,12 @@ RDI_SectionKind_Scopes = 0x0017, RDI_SectionKind_ScopeVOffData = 0x0018, RDI_SectionKind_ScopeVMap = 0x0019, RDI_SectionKind_InlineSites = 0x001A, -RDI_SectionKind_GlobalVariableSymbols = 0x001B, +RDI_SectionKind_GlobalVariables = 0x001B, RDI_SectionKind_GlobalVMap = 0x001C, -RDI_SectionKind_ThreadVariableSymbols = 0x001D, -RDI_SectionKind_ConstantSymbols = 0x001E, -RDI_SectionKind_ProcedureSymbols = 0x001F, -RDI_SectionKind_LocalVariableSymbols = 0x0020, +RDI_SectionKind_ThreadVariables = 0x001D, +RDI_SectionKind_Constants = 0x001E, +RDI_SectionKind_Procedures = 0x001F, +RDI_SectionKind_LocalVariables = 0x0020, RDI_SectionKind_LocationsBytecodeData = 0x0021, RDI_SectionKind_LocationsConstantData = 0x0022, RDI_SectionKind_LocationsSetElements = 0x0023, @@ -543,12 +543,12 @@ X(Scopes, scopes, RDI_Scope)\ X(ScopeVOffData, scope_voff_data, RDI_U64)\ X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ X(InlineSites, inline_sites, RDI_InlineSite)\ -X(GlobalVariableSymbols, global_variable_symbols, RDI_Symbol)\ +X(GlobalVariables, global_variables, RDI_Symbol)\ X(GlobalVMap, global_vmap, RDI_VMapEntry)\ -X(ThreadVariableSymbols, thread_variable_symbols, RDI_Symbol)\ -X(ConstantSymbols, constant_symbols, RDI_Symbol)\ -X(ProcedureSymbols, procedure_symbols, RDI_Symbol)\ -X(LocalVariableSymbols, local_variable_symbols, RDI_Symbol)\ +X(ThreadVariables, thread_variables, RDI_Symbol)\ +X(Constants, constants, RDI_Symbol)\ +X(Procedures, procedures, RDI_Symbol)\ +X(LocalVariables, local_variables, RDI_Symbol)\ X(LocationsBytecodeData, locations_bytecode_data, RDI_U8)\ X(LocationsConstantData, locations_constant_data, RDI_U8)\ X(LocationsSetElements, locations_set_elements, RDI_LocationSetElement)\ @@ -1045,11 +1045,11 @@ typedef struct RDI_U32_EnumMembers { RDI_U32 v; } RDI_U32_EnumMe typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; -typedef struct RDI_U32_GlobalVariableSymbols { RDI_U32 v; } RDI_U32_GlobalVariableSymbols; -typedef struct RDI_U32_ThreadVariableSymbols { RDI_U32 v; } RDI_U32_ThreadVariableSymbols; -typedef struct RDI_U32_ConstantSymbols { RDI_U32 v; } RDI_U32_ConstantSymbols; -typedef struct RDI_U32_ProcedureSymbols { RDI_U32 v; } RDI_U32_ProcedureSymbols; -typedef struct RDI_U32_LocalVariableSymbols { RDI_U32 v; } RDI_U32_LocalVariableSymbols; +typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_GlobalVariables; +typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; +typedef struct RDI_U32_Constants { RDI_U32 v; } RDI_U32_Constants; +typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; +typedef struct RDI_U32_LocalVariables { RDI_U32 v; } RDI_U32_LocalVariables; typedef struct RDI_U32_LocationsBytecodeData { RDI_U32 v; } RDI_U32_LocationsBytecodeData; typedef struct RDI_U32_LocationsConstantData { RDI_U32 v; } RDI_U32_LocationsConstantData; typedef struct RDI_U32_LocationsSetElements { RDI_U32 v; } RDI_U32_LocationsSetElements; @@ -1085,11 +1085,11 @@ typedef RDI_U32_Table RDI_U32_EnumMembers; typedef RDI_U32_Table RDI_U32_Scopes; typedef RDI_U32_Table RDI_U32_ScopeVOffData; typedef RDI_U32_Table RDI_U32_InlineSites; -typedef RDI_U32_Table RDI_U32_GlobalVariableSymbols; -typedef RDI_U32_Table RDI_U32_ThreadVariableSymbols; -typedef RDI_U32_Table RDI_U32_ConstantSymbols; -typedef RDI_U32_Table RDI_U32_ProcedureSymbols; -typedef RDI_U32_Table RDI_U32_LocalVariableSymbols; +typedef RDI_U32_Table RDI_U32_GlobalVariables; +typedef RDI_U32_Table RDI_U32_ThreadVariables; +typedef RDI_U32_Table RDI_U32_Constants; +typedef RDI_U32_Table RDI_U32_Procedures; +typedef RDI_U32_Table RDI_U32_LocalVariables; typedef RDI_U32_Table RDI_U32_LocationsBytecodeData; typedef RDI_U32_Table RDI_U32_LocationsConstantData; typedef RDI_U32_Table RDI_U32_LocationsSetElements; @@ -1445,12 +1445,12 @@ typedef RDI_Scope RDI_SectionElementType_Scopes; typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; typedef RDI_InlineSite RDI_SectionElementType_InlineSites; -typedef RDI_Symbol RDI_SectionElementType_GlobalVariableSymbols; +typedef RDI_Symbol RDI_SectionElementType_GlobalVariables; typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; -typedef RDI_Symbol RDI_SectionElementType_ThreadVariableSymbols; -typedef RDI_Symbol RDI_SectionElementType_ConstantSymbols; -typedef RDI_Symbol RDI_SectionElementType_ProcedureSymbols; -typedef RDI_Symbol RDI_SectionElementType_LocalVariableSymbols; +typedef RDI_Symbol RDI_SectionElementType_ThreadVariables; +typedef RDI_Symbol RDI_SectionElementType_Constants; +typedef RDI_Symbol RDI_SectionElementType_Procedures; +typedef RDI_Symbol RDI_SectionElementType_LocalVariables; typedef RDI_U8 RDI_SectionElementType_LocationsBytecodeData; typedef RDI_U8 RDI_SectionElementType_LocationsConstantData; typedef RDI_LocationSetElement RDI_SectionElementType_LocationsSetElements; diff --git a/src/lib_rdi/rdi_parse.c b/src/lib_rdi/rdi_parse.c index 0b0204a9..bb977fbf 100644 --- a/src/lib_rdi/rdi_parse.c +++ b/src/lib_rdi/rdi_parse.c @@ -742,7 +742,7 @@ rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size) { procedure_idx = ids[0]; } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, procedure_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx); return procedure; } @@ -854,7 +854,7 @@ rdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) RDI_PROC RDI_Symbol * rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope) { - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, scope->proc_idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx); return procedure; } @@ -871,7 +871,7 @@ RDI_PROC RDI_Symbol * rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff) { RDI_U32 idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff); - RDI_Symbol *gvar = rdi_element_from_name_idx(rdi, GlobalVariableSymbols, idx); + RDI_Symbol *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, idx); return gvar; } diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 91fbde6a..a9034803 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1029,7 +1029,7 @@ rb_thread_entry_point(void *p) ProfScope("dump FUNC records") { U64 count = 0; - RDI_Symbol *v = rdi_table_from_name(rdi, ProcedureSymbols, &count); + RDI_Symbol *v = rdi_table_from_name(rdi, Procedures, &count); Rng1U64 range = lane_range(count); for EachInRange(idx, range) { diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 7934fbd2..b6c9b6d0 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9508,9 +9508,9 @@ rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 switch(section_kind) { default:{mapped = 0;}break; - case RDI_SectionKind_ProcedureSymbols: - case RDI_SectionKind_GlobalVariableSymbols: - case RDI_SectionKind_ThreadVariableSymbols: + case RDI_SectionKind_Procedures: + case RDI_SectionKind_GlobalVariables: + case RDI_SectionKind_ThreadVariables: { color = RD_CodeColorSlot_CodeSymbol; }break; @@ -14060,13 +14060,13 @@ rd_frame(void) { match = di_match_from_string(name, 0, di_key_zero(), rd_state->frame_eval_memread_endt_us); } - if(match.section_kind == RDI_SectionKind_ProcedureSymbols) + if(match.section_kind == RDI_SectionKind_Procedures) { Access *access = access_open(); { name_resolved = 1; RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0); - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, ProcedureSymbols, match.idx); + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, match.idx); voff = rdi_first_voff_from_procedure(rdi, procedure); voff_dbgi_key = match.key; } diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 11bbf9ec..bc82c903 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -1751,10 +1751,10 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table) E_TypeKey lhs_type_key = eval.irtree.type_key; E_Type *lhs_type = e_type_from_key(lhs_type_key); if(0){} - else if(str8_match(lhs_type->name, str8_lit("procedures"), 0)) {section = RDI_SectionKind_ProcedureSymbols;} - else if(str8_match(lhs_type->name, str8_lit("globals"), 0)) {section = RDI_SectionKind_GlobalVariableSymbols;} - else if(str8_match(lhs_type->name, str8_lit("thread_locals"), 0)) {section = RDI_SectionKind_ThreadVariableSymbols;} - else if(str8_match(lhs_type->name, str8_lit("constants"), 0)) {section = RDI_SectionKind_ConstantSymbols;} + else if(str8_match(lhs_type->name, str8_lit("procedures"), 0)) {section = RDI_SectionKind_Procedures;} + else if(str8_match(lhs_type->name, str8_lit("globals"), 0)) {section = RDI_SectionKind_GlobalVariables;} + else if(str8_match(lhs_type->name, str8_lit("thread_locals"), 0)) {section = RDI_SectionKind_ThreadVariables;} + else if(str8_match(lhs_type->name, str8_lit("constants"), 0)) {section = RDI_SectionKind_Constants;} else if(str8_match(lhs_type->name, str8_lit("types"), 0)) {section = RDI_SectionKind_UDTs;} else if(str8_match(lhs_type->name, str8_lit("source_files"), 0)) {section = RDI_SectionKind_SourceFiles;} } @@ -1806,10 +1806,10 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) switch(accel->section) { default:{}break; - case RDI_SectionKind_ProcedureSymbols: - case RDI_SectionKind_GlobalVariableSymbols: - case RDI_SectionKind_ThreadVariableSymbols: - case RDI_SectionKind_ConstantSymbols: + case RDI_SectionKind_Procedures: + case RDI_SectionKind_GlobalVariables: + case RDI_SectionKind_ThreadVariables: + case RDI_SectionKind_Constants: { RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, accel->section, element_idx); String8 symbol_name = {0}; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index b19941ec..443e82bd 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -186,12 +186,12 @@ RDI_SectionTable: {InlineSites inline_sites RDI_InlineSite 0x001A U32 ""} //- rjf: symbols - {GlobalVariableSymbols global_variable_symbols RDI_Symbol 0x001B U32 ""} + {GlobalVariables global_variables RDI_Symbol 0x001B U32 ""} {GlobalVMap global_vmap RDI_VMapEntry 0x001C - ""} - {ThreadVariableSymbols thread_variable_symbols RDI_Symbol 0x001D U32 ""} - {ConstantSymbols constant_symbols RDI_Symbol 0x001E U32 ""} - {ProcedureSymbols procedure_symbols RDI_Symbol 0x001F U32 ""} - {LocalVariableSymbols local_variable_symbols RDI_Symbol 0x0020 U32 ""} + {ThreadVariables thread_variables RDI_Symbol 0x001D U32 ""} + {Constants constants RDI_Symbol 0x001E U32 ""} + {Procedures procedures RDI_Symbol 0x001F U32 ""} + {LocalVariables local_variables RDI_Symbol 0x0020 U32 ""} //- rjf: locations {LocationsBytecodeData locations_bytecode_data RDI_U8 0x0021 U32 ""} diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index f9971972..2e1343f1 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -896,11 +896,11 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse } symbol_tables[] = { - {RDI_DumpSubset_Procedures, RDI_SectionKind_ProcedureSymbols}, - {RDI_DumpSubset_GlobalVariables, RDI_SectionKind_GlobalVariableSymbols}, - {RDI_DumpSubset_ThreadVariables, RDI_SectionKind_ThreadVariableSymbols}, - {RDI_DumpSubset_LocalVariables, RDI_SectionKind_LocalVariableSymbols}, - {RDI_DumpSubset_Constants, RDI_SectionKind_ConstantSymbols}, + {RDI_DumpSubset_Procedures, RDI_SectionKind_Procedures}, + {RDI_DumpSubset_GlobalVariables, RDI_SectionKind_GlobalVariables}, + {RDI_DumpSubset_ThreadVariables, RDI_SectionKind_ThreadVariables}, + {RDI_DumpSubset_LocalVariables, RDI_SectionKind_LocalVariables}, + {RDI_DumpSubset_Constants, RDI_SectionKind_Constants}, }; for EachElement(symbol_table_idx, symbol_tables) { @@ -1047,7 +1047,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse U64 scope_voffs_count = 0; U64 *scope_voffs = rdi_table_from_name(rdi, ScopeVOffData, &scope_voffs_count); U64 locals_count = 0; - RDI_Symbol *locals = rdi_table_from_name(rdi, LocalVariableSymbols, &locals_count); + RDI_Symbol *locals = rdi_table_from_name(rdi, LocalVariables, &locals_count); U64 count = 0; RDI_Scope *v = rdi_table_from_name(rdi, Scopes, &count); RDI_Scope *nil = &v[0]; @@ -1077,7 +1077,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse } // rjf: scope procedure -> name - String8 procedure_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, ProcedureSymbols, scope->proc_idx)->name_string_idx); + String8 procedure_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx)->name_string_idx); if(procedure_name.size == 0) { procedure_name = str8_lit("???"); diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index a0f69ce8..c60e6fa8 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3541,12 +3541,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Map(ScopeVOffData, baked_scopes->scope_voffs, baked_scopes->scope_voffs_count); Map(ScopeVMap, baked_scope_vmap->vmap, baked_scope_vmap->count); Map(InlineSites, baked_inline_sites, baked_inline_sites_count); - Map(GlobalVariableSymbols, baked_global_variables, baked_global_variables_count); + Map(GlobalVariables, baked_global_variables, baked_global_variables_count); Map(GlobalVMap, baked_global_vmap->vmap, baked_global_vmap->count); - Map(ThreadVariableSymbols, baked_thread_variables, baked_thread_variables_count); - Map(ConstantSymbols, baked_constants, baked_constants_count); - Map(ProcedureSymbols, baked_procedures, baked_procedures_count); - Map(LocalVariableSymbols, baked_locals, baked_locals_count); + Map(ThreadVariables, baked_thread_variables, baked_thread_variables_count); + Map(Constants, baked_constants, baked_constants_count); + Map(Procedures, baked_procedures, baked_procedures_count); + Map(LocalVariables, baked_locals, baked_locals_count); Map(LocationsBytecodeData, baked_location_bytecode_data, baked_location_bytecode_data_size); Map(LocationsConstantData, baked_location_constant_data, baked_location_constant_data_size); Map(LocationsSetElements, baked_location_set_elements, baked_location_set_elements_count); From 5e81f124dc3c9889cbce56184114fb4c4013e860 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 18 Apr 2026 12:22:12 -0700 Subject: [PATCH 407/850] debug constant data evaluation spaces -> read from rdi data directly --- project.4coder | 2 +- src/eval/eval_core.h | 1 + src/eval/eval_interpret.c | 17 +++++++ src/eval/eval_ir.c | 96 +++++---------------------------------- 4 files changed, 31 insertions(+), 85 deletions(-) diff --git a/project.4coder b/project.4coder index a83c192c..a3fc4681 100644 --- a/project.4coder +++ b/project.4coder @@ -48,7 +48,7 @@ commands = //- rjf: [raddbg] // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 0da549be..5539a60a 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -136,6 +136,7 @@ enum E_SpaceKind_File, E_SpaceKind_FileSystem, E_SpaceKind_HashStoreKey, + E_SpaceKind_DebugConstantData, E_SpaceKind_FirstUserDefined, }; diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 58a81717..4c9a2949 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -107,6 +107,23 @@ e_space_read(E_Space space, void *out, Rng1U64 range) access_close(access); }break; + //- rjf: debug info constant data + case E_SpaceKind_DebugConstantData: + { + U32 dbg_info_num = space.u64s[0]; + if(1 <= dbg_info_num && dbg_info_num <= e_base_ctx->dbg_infos_count) + { + E_DbgInfo *dbg_info = &e_base_ctx->dbg_infos[dbg_info_num-1]; + RDI_Parsed *rdi = dbg_info->rdi; + U64 all_constant_data_size = 0; + U8 *all_constant_data_ptr = rdi_table_from_name(rdi, LocationsConstantData, &all_constant_data_size); + String8 all_constant_data = str8(all_constant_data_ptr, all_constant_data_size); + String8 read_memory = str8_substr(all_constant_data, range); + result = (dim_1u64(range) == read_memory.size); + MemoryCopy(out, read_memory.str, read_memory.size); + } + }break; + //- rjf: default -> use hooks default: if(e_base_ctx->space_read != 0) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index eba59fca..03e18625 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1692,6 +1692,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I B32 string_mapped = 0; B32 string_is_implicit_member_name = 0; E_TypeKey mapped_type_key = zero_struct; + E_DbgInfo *mapped_dbg_info = &e_dbg_info_nil; E_Module *mapped_location_module = &e_module_nil; RDI_Location mapped_location = 0; E_Mode mapped_bytecode_mode = E_Mode_Offset; @@ -1824,6 +1825,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I if(mapped_location != 0) { got_location_block = 1; + mapped_dbg_info = dbg_info; mapped_location_module = module; } } @@ -1970,6 +1972,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I string_mapped = 1; mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); mapped_location = location; + mapped_dbg_info = dbg_info; mapped_location_module = module; mapped_bytecode_mode = E_Mode_Offset; }break; @@ -1980,6 +1983,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I U64 procedure_base_voff = rdi_first_voff_from_procedure(rdi, procedure); mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, dbg_info_num); mapped_location = rdi_location_voff(procedure_base_voff); + mapped_dbg_info = dbg_info; mapped_location_module = module; mapped_bytecode_mode = E_Mode_Value; }break; @@ -1988,6 +1992,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I U32 type_idx = match.idx; RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); + mapped_dbg_info = dbg_info; string_mapped = 1; }break; } @@ -2072,15 +2077,19 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I if(!generated && mapped_location != 0 && mapped_bytecode.size == 0) { E_Module *module = mapped_location_module; - E_DbgInfo *dbg_info = e_dbg_info_from_module(module); + E_DbgInfo *dbg_info = mapped_dbg_info; E_Space space = module->space; Arch arch = module->arch; RDI_Parsed *rdi = dbg_info->rdi; RDI_Location location = mapped_location; E_OpList oplist = e_oplist_from_location(scratch.arena, rdi, location); - // TODO(rjf): @locpass `space` needs to be set to the constant data space if needed mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); mapped_bytecode_space = space; + if(rdi_kind_from_location(location) == RDI_LocationKind_ConstantDataOff) + { + mapped_bytecode_space = e_space_make(E_SpaceKind_DebugConstantData); + mapped_bytecode_space.u64s[0] = (dbg_info != &e_dbg_info_nil ? (dbg_info - e_base_ctx->dbg_infos) + 1 : 0); + } if(mapped_bytecode_mode == E_Mode_Null) { switch(rdi_kind_from_location(mapped_location)) @@ -2097,93 +2106,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I { mapped_bytecode_mode = E_Mode_Offset; }break; - } - } - -#if 0 //~TODO(rjf): OLD vvvvvvvvvvvv - RDI_LocationBlock *block = mapped_location_block; - U64 all_location_data_size = 0; - U8 *all_location_data = rdi_table_from_name(rdi, LocationData, &all_location_data_size); - if(block->location_data_off + sizeof(RDI_LocationKind) <= all_location_data_size) - { - RDI_LocationKind loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off)); - switch(loc_kind) - { - default:{}break; - case RDI_LocationKind_ValBytecodeStream: {mapped_bytecode_mode = E_Mode_Value;}goto bytecode_stream; - case RDI_LocationKind_AddrBytecodeStream:{mapped_bytecode_mode = E_Mode_Offset;}goto bytecode_stream; - bytecode_stream:; + case RDI_LocationKind_ConstantDataOff: { - string_mapped = 1; - U64 bytecode_size = 0; - U64 off_first = block->location_data_off + sizeof(RDI_LocationKind); - U64 off_opl = all_location_data_size; - for(U64 off = off_first, next_off = off_opl; - off < all_location_data_size; - off = next_off) - { - next_off = off_opl; - U8 op = all_location_data[off]; - if(op == 0) - { - break; - } - U16 ctrlbits = rdi_eval_op_ctrlbits_table[op]; - U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - bytecode_size += (1 + p_size); - next_off = (off + 1 + p_size); - } - mapped_bytecode = str8(all_location_data + off_first, bytecode_size); - }break; - case RDI_LocationKind_AddrRegPlusU16: - if(block->location_data_off + sizeof(RDI_LocationRegPlusU16) <= all_location_data_size) - { - string_mapped = 1; - RDI_LocationRegPlusU16 loc = *(RDI_LocationRegPlusU16 *)(all_location_data + block->location_data_off); - E_OpList oplist = {0}; - U64 byte_size = bit_size_from_arch(arch)/8; - U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, 0); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param)); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc.offset)); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0)); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); mapped_bytecode_mode = E_Mode_Offset; - mapped_bytecode_space = space; - }break; - case RDI_LocationKind_AddrAddrRegPlusU16: - { - string_mapped = 1; - RDI_LocationRegPlusU16 loc = *(RDI_LocationRegPlusU16 *)(all_location_data + block->location_data_off); - E_OpList oplist = {0}; - U64 byte_size = bit_size_from_arch(arch)/8; - U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, 0); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param)); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc.offset)); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0)); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, e_value_u64(bit_size_from_arch(arch)/8)); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); - mapped_bytecode_mode = E_Mode_Offset; - mapped_bytecode_space = space; - }break; - case RDI_LocationKind_ValReg: - if(block->location_data_off + sizeof(RDI_LocationReg) <= all_location_data_size) - { - string_mapped = 1; - RDI_LocationReg loc = *(RDI_LocationReg *)(all_location_data + block->location_data_off); - REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, loc.reg_code); - REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(arch)[regs_reg_code]; - E_OpList oplist = {0}; - U64 byte_size = (U64)reg_rng.byte_size; - U64 byte_pos = 0; - U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, byte_pos); - e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param)); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); - mapped_bytecode_mode = E_Mode_Value; - mapped_bytecode_space = space; }break; } } -#endif } //- rjf: generate IR trees for bytecode From 03d1575c85d845292308626f4a3566f76305a357 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 18 Apr 2026 14:17:36 -0700 Subject: [PATCH 408/850] non-scope, non-type namespace gathering / gathering from pdb & baking & dumping --- src/lib_rdi/rdi.h | 4 + src/lib_rdi_make/rdi_make.c | 1 + src/rdi/rdi.mdesk | 2 + src/rdi/rdi_local.c | 33 + src/rdi/rdi_local.h | 1 + src/rdi_from_pdb/rdi_from_pdb.c | 2143 +++++++++++++++++-------------- src/rdi_make/rdi_make_local.c | 1 + 7 files changed, 1254 insertions(+), 931 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 31aee8c7..d870dd2b 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -896,6 +896,8 @@ X(Set)\ #define RDI_Namespace_XList \ X(RDI_U32, name_string_idx)\ X(RDI_ContainerFlags, container_flags)\ +X(RDI_U8, padding_0)\ +X(RDI_U16, padding_1)\ X(RDI_U32, container_idx)\ #define RDI_Symbol_XList \ @@ -1347,6 +1349,8 @@ struct RDI_Namespace { RDI_U32 name_string_idx; RDI_ContainerFlags container_flags; +RDI_U8 padding_0; +RDI_U16 padding_1; RDI_U32 container_idx; }; diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index a2576e9e..fe1d3ef9 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1194,6 +1194,7 @@ rdim_bake_params_concat_in_place(RDIM_BakeParams *dst, RDIM_BakeParams *src) rdim_udt_chunk_list_concat_in_place(&dst->udts, &src->udts); rdim_src_file_chunk_list_concat_in_place(&dst->src_files, &src->src_files); rdim_line_table_chunk_list_concat_in_place(&dst->line_tables, &src->line_tables); + rdim_namespace_chunk_list_concat_in_place(&dst->namespaces, &src->namespaces); } } diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 443e82bd..b98f8e6c 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1026,6 +1026,8 @@ RDI_NamespaceMemberTable: { {name_string_idx RDI_U32 ""} {container_flags RDI_ContainerFlags ""} + {padding_0 RDI_U8 ""} + {padding_1 RDI_U16 ""} {container_idx RDI_U32 ""} } diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 2e1343f1..c76067a9 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1236,6 +1236,39 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse scratch_end(scratch); } + ////////////////////////////// + //- rjf: dump namespaces + // + DumpSubset(Namespaces) + { + U64 count = 0; + RDI_Namespace *v = rdi_table_from_name(rdi, Namespaces, &count); + Rng1U64 range = lane_range(count); + for EachInRange(idx, range) + { + RDI_Namespace *ns = &v[idx]; + String8 container_kind_name = str8_lit("container_idx"); + switch(ns->container_flags & RDI_ContainerFlag_KindMask) + { + default:{}break; + case RDI_ContainerKind_Type: + { + container_kind_name = str8_lit("container_udt_idx"); + }break; + case RDI_ContainerKind_Namespace: + { + container_kind_name = str8_lit("container_namespace_idx"); + }break; + case RDI_ContainerKind_Scope: + { + container_kind_name = str8_lit("container_scope_idx"); + }break; + } + dumpf("\n '%S': {%S: %I64u} // namespaces[%I64u]", str8_from_rdi_string_idx(rdi, ns->name_string_idx), container_kind_name, ns->container_idx, idx); + } + if(lane_idx() == lane_count()-1) { dumpf("\n"); } + } + ////////////////////////////// //- rjf: dump strings // diff --git a/src/rdi/rdi_local.h b/src/rdi/rdi_local.h index dde001e1..c3aec22c 100644 --- a/src/rdi/rdi_local.h +++ b/src/rdi/rdi_local.h @@ -32,6 +32,7 @@ X(Scopes, scopes, "SCOPES")\ X(ScopeVMap, scope_vmap, "SCOPE VMAP")\ X(InlineSites, inline_sites, "INLINE SITES")\ X(NameMaps, name_maps, "NAME MAPS")\ +X(Namespaces, namespaces, "NAMESPACES")\ X(Strings, strings, "STRINGS")\ typedef enum RDI_DumpSubset diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 7486e253..61a8e2af 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -2015,7 +2015,186 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync(); ////////////////////////////////////////////////////////////// - //- rjf: types pass 3: construct all types from TPI + //- rjf: types pass 3: gather all unique namespaces from types + // + typedef struct NamespaceNode NamespaceNode; + struct NamespaceNode + { + NamespaceNode *next; + String8 string; + RDIM_Scope *scope; + }; + NamespaceNode **all_type_namespace_slots = 0; + U64 all_type_namespace_slots_count = 0; + ProfScope("gather all unique namespaces from types") + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: find all unique namespaces on this lane + U64 namespace_slots_count = (U64)itype_opl / lane_count(); + String8Node **namespace_slots = push_array(scratch2.arena, String8Node *, namespace_slots_count); + U64 namespace_count = 0; + Rng1U64 range = lane_range(itype_opl); + for EachInRange(idx, range) + { + CV_TypeId itype = (CV_TypeId)idx; + if(itype < itype_first) { continue; } + + // rjf: unpack itype info + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + + // rjf: gather names from types + String8 name = {0}; + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: CLASS/STRUCT + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + CV_LeafUnion *lf_struct = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf_enum = (CV_LeafEnum *)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf_enum+1); + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + } + } + + // rjf: add namespaces from strings + String8 name_before_templates = str8_prefix(name, str8_find_needle(name, 0, str8_lit("<"), 0)); + for(U64 scope_resolution_operator_pos = 0; + scope_resolution_operator_pos < name_before_templates.size; + scope_resolution_operator_pos = str8_find_needle(name_before_templates, scope_resolution_operator_pos+1, str8_lit("::"), 0)) + { + String8 namespace_fully_qualified_name = str8_substr(name_before_templates, r1u64(0, scope_resolution_operator_pos)); + if(namespace_fully_qualified_name.size != 0) + { + U64 hash = u64_hash_from_str8(namespace_fully_qualified_name); + U64 slot_idx = hash%namespace_slots_count; + B32 already_exists = 0; + for(String8Node *n = namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, namespace_fully_qualified_name, 0)) + { + already_exists = 1; + break; + } + } + if(!already_exists) + { + String8Node *node = push_array(scratch2.arena, String8Node, 1); + SLLStackPush(namespace_slots[slot_idx], node); + node->string = namespace_fully_qualified_name; + namespace_count += 1; + } + } + } + } + + //- rjf: on lane 0 -> combine all unique namespaces to singular map + { + // rjf: gather lane maps + typedef struct LaneNamespaceTable LaneNamespaceTable; + struct LaneNamespaceTable + { + String8Node **slots; + U64 slots_count; + }; + U64 total_namespace_count = 0; + U64 *total_namespace_count_ptr = &total_namespace_count; + LaneNamespaceTable *lane_namespace_tables = 0; + if(lane_idx() == 0) + { + lane_namespace_tables = push_array(scratch2.arena, LaneNamespaceTable, lane_count()); + } + lane_sync_u64(&total_namespace_count_ptr, 0); + lane_sync_u64(&lane_namespace_tables, 0); + lane_namespace_tables[lane_idx()].slots = namespace_slots; + lane_namespace_tables[lane_idx()].slots_count = namespace_slots_count; + ins_atomic_u64_add_eval(total_namespace_count_ptr, namespace_count); + lane_sync(); + + // rjf: combine + if(lane_idx() == 0) + { + all_type_namespace_slots_count = *total_namespace_count_ptr / 3; + all_type_namespace_slots = push_array(scratch.arena, NamespaceNode *, all_type_namespace_slots_count); + for EachIndex(l_idx, lane_count()) + { + LaneNamespaceTable *tbl = &lane_namespace_tables[l_idx]; + for EachIndex(slot_idx, tbl->slots_count) + { + for(String8Node *n = tbl->slots[slot_idx]; n != 0; n = n->next) + { + U64 hash = u64_hash_from_str8(n->string); + U64 dst_slot_idx = hash%all_type_namespace_slots_count; + B32 already_exists = 0; + for(NamespaceNode *dst_n = all_type_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) + { + if(str8_match(dst_n->string, n->string, 0)) + { + already_exists = 1; + break; + } + } + if(!already_exists) + { + NamespaceNode *dst_n = push_array(scratch.arena, NamespaceNode, 1); + dst_n->string = n->string; + SLLStackPush(all_type_namespace_slots[dst_slot_idx], dst_n); + } + } + } + } + } + lane_sync_u64(&all_type_namespace_slots_count, 0); + lane_sync_u64(&all_type_namespace_slots, 0); + } + scratch_end(scratch2); + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 4: construct all types from TPI // // this doesn't gather struct/class/union/enum members, which is done by // subsequent passes, to build RDI "UDT" information, which is distinct @@ -2025,7 +2204,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_TypeChunkList *all_types__pre_typedefs_ptr = &all_types__pre_typedefs; RDIM_Type **itype_type_ptrs = 0; RDIM_Type **basic_type_ptrs = 0; - if(lane_idx() == 0) ProfScope("types pass 3: construct all root/stub types from TPI") + if(lane_idx() == 0) ProfScope("types pass 4: construct all root/stub types from TPI") { #define p2r_builtin_type_ptr_from_kind(kind) ((basic_type_ptrs && RDI_TypeKind_FirstBuiltIn <= (kind) && (kind) <= RDI_TypeKind_LastBuiltIn) ? (basic_type_ptrs[(kind) - RDI_TypeKind_FirstBuiltIn]) : 0) #define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) @@ -2586,10 +2765,1038 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) all_types__pre_typedefs = *all_types__pre_typedefs_ptr; ////////////////////////////////////////////////////////////// - //- rjf: types pass 4: build UDTs + //- rjf: convert symbols from all units + // + typedef struct ScopeNamespaceNode ScopeNamespaceNode; + struct ScopeNamespaceNode + { + ScopeNamespaceNode *next; + String8 string; + RDIM_Scope *scope; + }; + typedef struct ScopeNamespaceList ScopeNamespaceList; + struct ScopeNamespaceList + { + ScopeNamespaceNode *first; + ScopeNamespaceNode *last; + }; + RDIM_TypeChunkList *syms_typedefs = 0; + ScopeNamespaceList *syms_scopes_that_are_namespaces = 0; + ProfScope("produce symbols from all streams") + { +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + + //////////////////////////// + //- rjf: set up + // + if(lane_idx() == 0) + { + syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); + syms_scopes_that_are_namespaces = push_array(arena, ScopeNamespaceList, all_syms_count); + } + lane_sync_u64(&syms_typedefs, 0); + lane_sync_u64(&syms_scopes_that_are_namespaces, 0); + + //////////////////////////// + //- rjf: fill outputs for all unit sym blocks in this lane + // + if(params->subset_flags & (RDIM_SubsetFlag_Procedures| + RDIM_SubsetFlag_GlobalVariables| + RDIM_SubsetFlag_ThreadVariables| + RDIM_SubsetFlag_Scopes| + RDIM_SubsetFlag_Locals| + RDIM_SubsetFlag_GlobalVariableNameMap| + RDIM_SubsetFlag_ThreadVariableNameMap| + RDIM_SubsetFlag_ProcedureNameMap| + RDIM_SubsetFlag_ConstantNameMap| + RDIM_SubsetFlag_LinkNameProcedureNameMap| + RDIM_SubsetFlag_Types)) + { + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + for(;;) + { + //- rjf: take next sym + U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(sym_idx >= all_syms_count) + { + break; + } + + //- rjf: unpack sym + Temp scratch = scratch_begin(&arena, 1); + CV_SymParsed *sym = all_syms[sym_idx]; + U64 sym_locations_chunk_cap = 4096; + U64 sym_procedures_chunk_cap = 2048; + U64 sym_global_variables_chunk_cap = 2048; + U64 sym_thread_variables_chunk_cap = 2048; + U64 sym_constants_chunk_cap = 2048; + U64 sym_scopes_chunk_cap = 4096; + U64 sym_inline_sites_chunk_cap = 2048; + RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; + RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; + RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; + RDIM_SymbolChunkList *sym_thread_variables = &sym_unit->thread_variables; + RDIM_SymbolChunkList *sym_constants = &sym_unit->constants; + RDIM_ScopeChunkList *sym_scopes = &sym_unit->scopes; + RDIM_InlineSiteChunkList *sym_inline_sites = &sym_unit->inline_sites; + RDIM_TypeChunkList *typedefs = &syms_typedefs[sym_idx]; + + ////////////////////////// + //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) + // + U64 procedure_frameprocs_count = 0; + U64 procedure_frameprocs_cap = sym->sym_ranges.count; + CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); + ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") + { + U64 procedure_num = 0; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + + //- rjf: FRAMEPROC + case CV_SymKind_FRAMEPROC: + { + if(procedure_num == 0) { break; } + if(procedure_num > procedure_frameprocs_cap) { break; } + CV_SymFrameproc *frameproc = (CV_SymFrameproc *)iter.struct_base; + procedure_frameprocs[procedure_num-1] = frameproc; + procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + procedure_num += 1; + }break; + } + } + U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); + arena_pop(scratch.arena, scratch_overkill); + } + + ////////////////////////// + //- rjf: symbols pass 2: construct all symbols, given procedure frame info map + // + ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") + { + RDIM_Symbol *defrange_target = 0; + U64 procedure_num = 0; + U64 procedure_base_voff = 0; + CV_ProcFlags proc_flags = 0; + U64 regrel_idx = 0; + RDIM_Symbol *curr_proc_symbol = 0; + typedef struct P2R_ScopeNode P2R_ScopeNode; + struct P2R_ScopeNode + { + P2R_ScopeNode *next; + RDIM_Scope *scope; + }; + P2R_ScopeNode *top_scope_node = 0; + P2R_ScopeNode *free_scope_node = 0; + RDIM_LineTable *inline_site_line_table = sym_idx > 0 ? units_first_inline_site_line_tables[sym_idx-1] : 0; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + + //- rjf: END + case CV_SymKind_END: + { + P2R_ScopeNode *n = top_scope_node; + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } + defrange_target = 0; + }break; + + //- rjf: BLOCK32 + case CV_SymKind_BLOCK32: + { + // rjf: unpack sym + CV_SymBlock32 *block32 = (CV_SymBlock32 *)iter.struct_base; + + // rjf: build scope, insert into current parent scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); + { + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= coff_sections.count) ? &coff_sections.v[block32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + block32->off; + U64 voff_last = voff_first + block32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range); + } + } + + // rjf: push this scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + }break; + + //- rjf: LDATA32/GDATA32 + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + // rjf: unpack sym + CV_SymData32 *data32 = (CV_SymData32 *)iter.struct_base; + String8 name = str8_cstring_capped(data32+1, iter.opl); + COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= coff_sections.count) ? &coff_sections.v[data32->sec-1] : 0; + U64 voff = (section ? section->voff : 0) + data32->off; + + // rjf: determine if this is an exact duplicate global + // + // PDB likes to have duplicates of these spread across different + // symbol streams so we deduplicate across the entire translation + // context. + // + B32 is_duplicate = 0; + { + // TODO(rjf): @important global symbol dedup + } + + // rjf: is not duplicate -> push new global + if(!is_duplicate) + { + // rjf: unpack global variable's type + RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); + + // rjf: unpack global's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack global's container scope + RDIM_Scope *container_scope = 0; + if(container_type == 0 && top_scope_node != 0 && iter.kind == CV_SymKind_LDATA32) + { + container_scope = top_scope_node->scope; + } + + // rjf: build symbol + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_global_variables, sym_global_variables_chunk_cap); + symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); + symbol->name = name; + symbol->type = type; + symbol->container_scope = container_scope; + symbol->container_type = container_type; + RDIM_Location loc = {.kind = RDI_LocationKind_ModuleOff, .offset = voff}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &symbol->location_cases, loc, range); + } + }break; + + //- rjf: UDT (typedefs) + case CV_SymKind_UDT: + if(sym == all_syms[0] && top_scope_node == 0) + { + if(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs|RDIM_SubsetFlag_TypeNameMap)) + { + CV_SymUDT *udt = (CV_SymUDT *)iter.struct_base; + String8 name = str8_cstring_capped(udt+1, iter.opl); + RDIM_Type *type = rdim_type_chunk_list_push(arena, typedefs, 4096); + type->kind = RDI_TypeKind_Alias; + type->name = name; + type->direct_type = p2r_type_ptr_from_itype(udt->itype); + if(type->direct_type != 0) + { + type->byte_size = type->direct_type->byte_size; + } + } + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + // rjf: unpack sym + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + String8 name = str8_cstring_capped(proc32+1, iter.opl); + RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); + + // rjf: unpack proc's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2 && tpi_hash != 0 && tpi_leaf != 0) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack proc's container scope + RDIM_Scope *container_scope = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_scope = top_scope_node->scope; + } + + // rjf: build procedure's root scope + // + // NOTE: even if there could be a containing scope at this point (which should be + // illegal in C/C++ but not necessarily in another language) we would not use + // it here because these scopes refer to the ranges of code that make up a + // procedure *not* the namespaces, so a procedure's root scope always has + // no parent. + RDIM_Scope *procedure_root_scope = 0; + if(params->subset_flags & RDIM_SubsetFlag_Scopes) + { + procedure_root_scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); + COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0; + if(section != 0) + { + U64 voff_first = section->voff + proc32->off; + U64 voff_last = voff_first + proc32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, sym_scopes, procedure_root_scope, voff_range); + procedure_base_voff = voff_first; + } + } + + // rjf: root scope voff minimum range -> link name + String8 link_name = {0}; + if(procedure_root_scope && procedure_root_scope->voff_ranges.min != 0) + { + U64 voff = procedure_root_scope->voff_ranges.min; + U64 hash = p2r_hash_from_voff(voff); + U64 bucket_idx = hash%link_name_map->buckets_count; + P2R_LinkNameNode *node = 0; + for(P2R_LinkNameNode *n = link_name_map->buckets[bucket_idx]; n != 0; n = n->next) + { + if(n->voff == voff) + { + link_name = n->name; + break; + } + } + } + + // rjf: build procedure symbol + if(params->subset_flags & (RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_ProcedureNameMap)) + { + curr_proc_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); + curr_proc_symbol->is_extern = (iter.kind == CV_SymKind_GPROC32); + curr_proc_symbol->name = name; + curr_proc_symbol->link_name = link_name; + curr_proc_symbol->type = type; + curr_proc_symbol->container_scope = container_scope; + curr_proc_symbol->container_type = container_type; + curr_proc_symbol->root_scope = procedure_root_scope; + if(procedure_root_scope != 0) + { + procedure_root_scope->symbol = curr_proc_symbol; + } + } + + // rjf: push scope to scope stack + if(procedure_root_scope) + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = procedure_root_scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: determine if this procedure is a namespace used for types; if so, gather + if(procedure_root_scope != 0) + { + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%all_type_namespace_slots_count; + for(NamespaceNode *n = all_type_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, name, 0)) + { + ScopeNamespaceNode *node = push_array(arena, ScopeNamespaceNode, 1); + node->scope = procedure_root_scope; + node->string = name; + SLLQueuePush(syms_scopes_that_are_namespaces[sym_idx].first, + syms_scopes_that_are_namespaces[sym_idx].last, + node); + break; + } + } + } + + // rjf: increment procedure counter + procedure_num += 1; + + // reset S_REGREL32 index + regrel_idx = 0; + + proc_flags = proc32->flags; + }break; + + //- rjf: REGREL32 + case CV_SymKind_REGREL32: + { + if(params->subset_flags & RDIM_SubsetFlag_Locals && !(proc_flags & CV_ProcFlag_OptDbgInfo)) + { + // TODO(rjf): apparently some of the information here may end up being + // redundant with "better" information from CV_SymKind_LOCAL record. + // we don't currently handle this, but if those cases arise then it + // will obviously be better to prefer the better information from both + // records. + + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)iter.struct_base; + String8 name = str8_cstring_capped(regrel32+1, iter.opl); + RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); + CV_Reg cv_reg = regrel32->reg; + U32 var_off = regrel32->reg_off; + + // rjf: determine if this is a parameter + B32 is_param = (regrel_idx < curr_proc_symbol->type->count); + + // rjf: determine if we need an extra indirection to the value + B32 extra_indirection_to_value = 0; + if(type != 0) + { + switch(arch) + { + case RDI_Arch_X64: + { + extra_indirection_to_value = (is_param && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); + }break; + } + } + + // If the return local does not fit in a register MSVC does not assign it a type. + // So we infer the return type from the signature. + // + // rjf: redirect type, if 0, and if outside frame, to the return type of the + // containing procedure + { + B32 is_stack_reg = 0; + switch(arch) + { + default:{}break; + case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP || cv_reg == CV_Regx64_RBP);}break; + } + if(is_stack_reg) + { + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num <= procedure_frameprocs_count) + { + CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; + if(var_off > frameproc->frame_size && regrel32->itype == 0 && + top_scope_node->scope->symbol != 0 && + top_scope_node->scope->symbol->type != 0) + { + type = top_scope_node->scope->symbol->type->direct_type; + extra_indirection_to_value = 1; + } + } + } + } + + // rjf: build local + { + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + local->is_param = is_param; + local->name = name; + local->type = type; + + // rjf: equip location info + { + // rjf: get raddbg register code + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + // TODO(rjf): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // rjf: build location + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_case_list_push(arena, &local->location_cases, loc, voff_range); + } + } + } + + regrel_idx += 1; + }break; + + //- rjf: LTHREAD32/GTHREAD32 + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + if(params->subset_flags & (RDIM_SubsetFlag_ThreadVariables|RDIM_SubsetFlag_ThreadVariableNameMap)) + { + // rjf: unpack sym + CV_SymThread32 *thread32 = (CV_SymThread32 *)iter.struct_base; + String8 name = str8_cstring_capped(thread32+1, iter.opl); + U32 tls_off = thread32->tls_off; + RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); + + // rjf: unpack thread variable's container type + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + if(container_name_opl > 2) + { + String8 container_name = str8(name.str, container_name_opl - 2); + CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + } + + // rjf: unpack thread variable's container symbol + RDIM_Scope *container_scope = 0; + if(container_type == 0 && top_scope_node != 0) + { + container_scope = top_scope_node->scope; + } + + // rjf: build symbol + RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, sym_thread_variables, sym_thread_variables_chunk_cap); + tvar->name = name; + tvar->type = type; + tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); + tvar->container_type = container_type; + tvar->container_scope = container_scope; + RDIM_Location loc = {.kind = RDI_LocationKind_TLSOff, .offset = tls_off}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &tvar->location_cases, loc, range); + }break; + + //- rjf: LOCAL + case CV_SymKind_LOCAL: + if(params->subset_flags & (RDIM_SubsetFlag_Locals)) + { + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymLocal *slocal = (CV_SymLocal *)iter.struct_base; + String8 name = str8_cstring_capped(slocal+1, iter.opl); + RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); + + // rjf: determine if this symbol encodes the beginning of a global modification + B32 is_global_modification = 0; + if((slocal->flags & CV_LocalFlag_Global) || + (slocal->flags & CV_LocalFlag_Static)) + { + is_global_modification = 1; + } + + // rjf: is global modification -> emit global modification symbol + if(is_global_modification) + { + // TODO(rjf): add global modification symbols + defrange_target = 0; + } + + // rjf: is not a global modification -> emit a local variable + if(!is_global_modification) + { + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + { + local->is_param = !!(slocal->flags & CV_LocalFlag_Param); + local->name = name; + local->type = type; + } + + // rjf: save defrange target, for subsequent defrange symbols + defrange_target = local; + } + }break; + + //- rjf: DEFRANGE_REGISTER + case CV_SymKind_DEFRANGE_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)iter.struct_base; + CV_Reg cv_reg = defrange_register->reg; + CV_LvarAddrRange *range = &defrange_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + + // rjf: build location + RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; + + // rjf: emit locations over ranges + p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)iter.struct_base; + CV_LvarAddrRange *range = &defrange_fprel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: select frame pointer register + CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); + RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel->off; + RDIM_Location location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit locations over ranges + p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, location, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_SUBFIELD_REGISTER + case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)iter.struct_base; + CV_Reg cv_reg = defrange_subfield_register->reg; + CV_LvarAddrRange *range = &defrange_subfield_register->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + + // rjf: skip "subfield" location info - currently not supported + if(defrange_subfield_register->field_offset != 0) + { + break; + } + + // rjf: build location + RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; + + // rjf: emit locations over ranges + p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)iter.struct_base; + CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); + RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel_full_scope->off; + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit location over ranges + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_case_list_push(arena, &defrange_target->location_cases, loc, voff_range); + }break; + + //- rjf: DEFRANGE_REGISTER_REL + case CV_SymKind_DEFRANGE_REGISTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)iter.struct_base; + CV_Reg cv_reg = defrange_register_rel->reg; + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + CV_LvarAddrRange *range = &defrange_register_rel->range; + COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: build location + // TODO(rjf): offset & size from cv_reg code + U32 byte_size = rdi_addr_size_from_arch(arch); + U32 byte_pos = 0; + B32 extra_indirection_to_value = 0; + S64 var_off = defrange_register_rel->reg_off; + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); + + // rjf: emit locations over ranges + p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); + }break; + + //- rjf: FILESTATIC + case CV_SymKind_FILESTATIC: + { + CV_SymFileStatic *file_static = (CV_SymFileStatic*)iter.struct_base; + String8 name = str8_cstring_capped(file_static+1, iter.opl); + RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); + // TODO(rjf): emit a global modifier symbol + defrange_target = 0; + }break; + + //- rjf: INLINESITE + case CV_SymKind_INLINESITE: + if(params->subset_flags & (RDIM_SubsetFlag_Scopes)) + { + // rjf: unpack sym + CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; + String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); + + // rjf: extract external info about inline site + String8 name = {0}; + RDIM_Type *type = 0; + RDIM_Type *owner = 0; + if(ipi_leaf != 0 && ipi_leaf->itype_first <= sym->inlinee && sym->inlinee < ipi_leaf->itype_opl) + { + CV_RecRange rec_range = ipi_leaf->leaf_ranges.ranges[sym->inlinee - ipi_leaf->itype_first]; + String8 rec_data = str8_substr(ipi_leaf->data, rng_1u64(rec_range.off, rec_range.off + rec_range.hdr.size)); + void *raw_leaf = rec_data.str + sizeof(U16); + + // rjf: extract method inline info + if(rec_range.hdr.kind == CV_LeafKind_MFUNC_ID && + rec_range.hdr.size >= sizeof(CV_LeafMFuncId)) + { + CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)raw_leaf; + name = str8_cstring_capped(mfunc_id + 1, rec_data.str + rec_data.size); + type = p2r_type_ptr_from_itype(mfunc_id->itype); + owner = mfunc_id->owner_itype != 0 ? p2r_type_ptr_from_itype(mfunc_id->owner_itype) : 0; + } + + // rjf: extract non-method function inline info + else if(rec_range.hdr.kind == CV_LeafKind_FUNC_ID && + rec_range.hdr.size >= sizeof(CV_LeafFuncId)) + { + CV_LeafFuncId *func_id = (CV_LeafFuncId*)raw_leaf; + name = str8_cstring_capped(func_id + 1, rec_data.str + rec_data.size); + type = p2r_type_ptr_from_itype(func_id->itype); + owner = func_id->scope_string_id != 0 ? p2r_type_ptr_from_itype(func_id->scope_string_id) : 0; + } + } + + // rjf: build inline site + RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, sym_inline_sites, sym_inline_sites_chunk_cap); + inline_site->name = name; + inline_site->type = type; + inline_site->owner = owner; + inline_site->line_table = inline_site_line_table; + + // rjf: increment to next inline site line table in this unit + if(inline_site_line_table != 0 && inline_site_line_table->chunk != 0) + { + RDIM_LineTableChunkNode *chunk = inline_site_line_table->chunk; + U64 current_idx = (U64)(inline_site_line_table - chunk->v); + if(current_idx+1 < chunk->count) + { + inline_site_line_table += 1; + } + else + { + chunk = chunk->next; + inline_site_line_table = 0; + if(chunk != 0) + { + inline_site_line_table = chunk->v; + } + } + } + + // rjf: build scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); + scope->inline_site = inline_site; + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + + // rjf: push this scope to scope stack + { + P2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: parse offset ranges of this inline site - attach to scope + { + CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(0, 0, procedure_base_voff); + for(;;) + { + CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots); + + if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitRange) + { + // rjf: build new range & add to scope + RDIM_Rng1U64 voff_range = { step.range.min, step.range.max }; + rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range); + } + + if(step.flags & CV_C13InlineSiteDecoderStepFlag_ExtendLastRange) + { + if(scope->voff_ranges.last != 0) + { + scope->voff_ranges.last->v.max = step.range.max; + } + } + + if(step.flags == 0) + { + break; + } + } + } + }break; + + //- rjf: INLINESITE_END + case CV_SymKind_INLINESITE_END: + { + P2R_ScopeNode *n = top_scope_node; + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } + defrange_target = 0; + }break; + + //- rjf: CONSTANT + case CV_SymKind_CONSTANT: + if(params->subset_flags & RDIM_SubsetFlag_Constants) + { + // rjf: unpack + CV_SymConstant *sym = (CV_SymConstant *)iter.struct_base; + RDIM_Type *type = p2r_type_ptr_from_itype(sym->itype); + U8 *val_ptr = (U8 *)(sym+1); + CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, iter.opl); + U64 val64 = cv_u64_from_numeric(&val); + U8 *name_ptr = val_ptr + val.encoded_size; + String8 name = str8_cstring_capped(name_ptr, iter.opl); + String8 val_data = str8_struct(&val64); + U64 container_name_opl = 0; + if(type != 0) + { + container_name_opl = p2r_end_of_cplusplus_container_name(type->name); + } + String8 name_qualified = name; + if(container_name_opl != 0) + { + name_qualified = push_str8f(arena, "%S%S", str8_prefix(type->name, container_name_opl), name); + } + + // rjf: build constant symbol + if(name_qualified.size != 0) + { + RDIM_Symbol *cnst = rdim_symbol_chunk_list_push(arena, sym_constants, sym_constants_chunk_cap); + cnst->name = name_qualified; + cnst->type = type; + RDIM_Location loc = {.kind = RDI_LocationKind_ConstantDataOff, .value_data = str8_copy(arena, val_data)}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &cnst->location_cases, loc, range); + } + }break; + } + } + } + + scratch_end(scratch); + } + } +#undef p2r_type_ptr_from_itype + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: upgrade namespace nodes with scopes info, if they match a scope + // + if(lane_idx() == 0) + { + for EachIndex(sym_idx, all_syms_count) + { + ScopeNamespaceList *scopes_that_are_namespaces = &syms_scopes_that_are_namespaces[sym_idx]; + for(ScopeNamespaceNode *scope_n = scopes_that_are_namespaces->first; scope_n != 0; scope_n = scope_n->next) + { + U64 hash = u64_hash_from_str8(scope_n->string); + U64 slot_idx = hash%all_type_namespace_slots_count; + for(NamespaceNode *n = all_type_namespace_slots[slot_idx]; n != 0; n = n->next) + { + n->scope = scope_n->scope; + } + } + } + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: build namespaces, that are not scopes, nor types + // + RDIM_NamespaceChunkList all_namespaces = {0}; + { + // rjf: gather all per-lane namespaces + RDIM_NamespaceChunkList lane_namespaces = {0}; + Rng1U64 range = lane_range(all_type_namespace_slots_count); + for EachInRange(slot_idx, range) + { + for(NamespaceNode *n = all_type_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(n->scope != 0) { continue; } + String8 string = n->string; + RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 32); + ns->name = string; + } + } + + // rjf: combine all per-lane namespaces + RDIM_NamespaceChunkList *lanes_namespaces = 0; + if(lane_idx() == 0) + { + lanes_namespaces = push_array(scratch.arena, RDIM_NamespaceChunkList, lane_count()); + } + lane_sync_u64(&lanes_namespaces, 0); + lanes_namespaces[lane_idx()] = lane_namespaces; + lane_sync(); + + // rjf: join all per-lane namespaces + RDIM_NamespaceChunkList *all_namespaces_ptr = &all_namespaces; + lane_sync_u64(&all_namespaces_ptr, 0); + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + rdim_namespace_chunk_list_concat_in_place(all_namespaces_ptr, &lanes_namespaces[l_idx]); + } + } + lane_sync(); + all_namespaces = *all_namespaces_ptr; + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: join extra types from units + // + RDIM_TypeChunkList all_types = {0}; + { + RDIM_TypeChunkList *all_types_ptr = 0; + if(lane_idx() == 0) + { + all_types_ptr = push_array(scratch.arena, RDIM_TypeChunkList, 1); + } + lane_sync_u64(&all_types_ptr, 0); + if(lane_idx() == lane_from_task_idx(7)) ProfScope("join typedefs") + { + for EachIndex(idx, all_syms_count) + { + rdim_type_chunk_list_concat_in_place(all_types__pre_typedefs_ptr, &syms_typedefs[idx]); + } + *all_types_ptr = *all_types__pre_typedefs_ptr; + } + lane_sync(); + all_types = *all_types_ptr; + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: build UDTs // RDIM_UDTChunkList *lanes_udts = 0; - ProfScope("types pass 4: build UDTs") + ProfScope("build UDTs") { #define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) @@ -3247,933 +4454,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync_u64(&all_udts_ptr, 0); all_udts = *all_udts_ptr; - ////////////////////////////////////////////////////////////// - //- rjf: convert symbols from all units - // - RDIM_TypeChunkList *syms_typedefs = 0; - ProfScope("produce symbols from all streams") - { -#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) - - //////////////////////////// - //- rjf: set up - // - if(lane_idx() == 0) - { - syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); - } - lane_sync_u64(&syms_typedefs, 0); - - //////////////////////////// - //- rjf: fill outputs for all unit sym blocks in this lane - // - if(params->subset_flags & (RDIM_SubsetFlag_Procedures| - RDIM_SubsetFlag_GlobalVariables| - RDIM_SubsetFlag_ThreadVariables| - RDIM_SubsetFlag_Scopes| - RDIM_SubsetFlag_Locals| - RDIM_SubsetFlag_GlobalVariableNameMap| - RDIM_SubsetFlag_ThreadVariableNameMap| - RDIM_SubsetFlag_ProcedureNameMap| - RDIM_SubsetFlag_ConstantNameMap| - RDIM_SubsetFlag_LinkNameProcedureNameMap| - RDIM_SubsetFlag_Types)) - { - U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; - lane_sync_u64(&sym_take_counter, 0); - for(;;) - { - //- rjf: take next sym - U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) - { - break; - } - - //- rjf: unpack sym - Temp scratch = scratch_begin(&arena, 1); - CV_SymParsed *sym = all_syms[sym_idx]; - U64 sym_locations_chunk_cap = 4096; - U64 sym_procedures_chunk_cap = 2048; - U64 sym_global_variables_chunk_cap = 2048; - U64 sym_thread_variables_chunk_cap = 2048; - U64 sym_constants_chunk_cap = 2048; - U64 sym_scopes_chunk_cap = 4096; - U64 sym_inline_sites_chunk_cap = 2048; - RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; - RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; - RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; - RDIM_SymbolChunkList *sym_thread_variables = &sym_unit->thread_variables; - RDIM_SymbolChunkList *sym_constants = &sym_unit->constants; - RDIM_ScopeChunkList *sym_scopes = &sym_unit->scopes; - RDIM_InlineSiteChunkList *sym_inline_sites = &sym_unit->inline_sites; - RDIM_TypeChunkList *typedefs = &syms_typedefs[sym_idx]; - - ////////////////////////// - //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) - // - U64 procedure_frameprocs_count = 0; - U64 procedure_frameprocs_cap = sym->sym_ranges.count; - CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); - ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") - { - U64 procedure_num = 0; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - - //- rjf: FRAMEPROC - case CV_SymKind_FRAMEPROC: - { - if(procedure_num == 0) { break; } - if(procedure_num > procedure_frameprocs_cap) { break; } - CV_SymFrameproc *frameproc = (CV_SymFrameproc *)iter.struct_base; - procedure_frameprocs[procedure_num-1] = frameproc; - procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - procedure_num += 1; - }break; - } - } - U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); - arena_pop(scratch.arena, scratch_overkill); - } - - ////////////////////////// - //- rjf: symbols pass 2: construct all symbols, given procedure frame info map - // - ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") - { - RDIM_Symbol *defrange_target = 0; - U64 procedure_num = 0; - U64 procedure_base_voff = 0; - CV_ProcFlags proc_flags = 0; - U64 regrel_idx = 0; - RDIM_Symbol *curr_proc_symbol = 0; - typedef struct P2R_ScopeNode P2R_ScopeNode; - struct P2R_ScopeNode - { - P2R_ScopeNode *next; - RDIM_Scope *scope; - }; - P2R_ScopeNode *top_scope_node = 0; - P2R_ScopeNode *free_scope_node = 0; - RDIM_LineTable *inline_site_line_table = sym_idx > 0 ? units_first_inline_site_line_tables[sym_idx-1] : 0; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - - //- rjf: END - case CV_SymKind_END: - { - P2R_ScopeNode *n = top_scope_node; - if(n != 0) - { - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); - } - defrange_target = 0; - }break; - - //- rjf: BLOCK32 - case CV_SymKind_BLOCK32: - { - // rjf: unpack sym - CV_SymBlock32 *block32 = (CV_SymBlock32 *)iter.struct_base; - - // rjf: build scope, insert into current parent scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); - { - if(top_scope_node == 0) - { - // TODO(rjf): log - } - if(top_scope_node != 0) - { - RDIM_Scope *top_scope = top_scope_node->scope; - SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); - scope->parent_scope = top_scope; - scope->symbol = top_scope->symbol; - } - COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= coff_sections.count) ? &coff_sections.v[block32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + block32->off; - U64 voff_last = voff_first + block32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range); - } - } - - // rjf: push this scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = scope; - SLLStackPush(top_scope_node, node); - } - }break; - - //- rjf: LDATA32/GDATA32 - case CV_SymKind_LDATA32: - case CV_SymKind_GDATA32: - { - // rjf: unpack sym - CV_SymData32 *data32 = (CV_SymData32 *)iter.struct_base; - String8 name = str8_cstring_capped(data32+1, iter.opl); - COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= coff_sections.count) ? &coff_sections.v[data32->sec-1] : 0; - U64 voff = (section ? section->voff : 0) + data32->off; - - // rjf: determine if this is an exact duplicate global - // - // PDB likes to have duplicates of these spread across different - // symbol streams so we deduplicate across the entire translation - // context. - // - B32 is_duplicate = 0; - { - // TODO(rjf): @important global symbol dedup - } - - // rjf: is not duplicate -> push new global - if(!is_duplicate) - { - // rjf: unpack global variable's type - RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); - - // rjf: unpack global's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack global's container scope - RDIM_Scope *container_scope = 0; - if(container_type == 0 && top_scope_node != 0 && iter.kind == CV_SymKind_LDATA32) - { - container_scope = top_scope_node->scope; - } - - // rjf: build symbol - RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_global_variables, sym_global_variables_chunk_cap); - symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); - symbol->name = name; - symbol->type = type; - symbol->container_scope = container_scope; - symbol->container_type = container_type; - RDIM_Location loc = {.kind = RDI_LocationKind_ModuleOff, .offset = voff}; - RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; - rdim_location_case_list_push(arena, &symbol->location_cases, loc, range); - } - }break; - - //- rjf: UDT (typedefs) - case CV_SymKind_UDT: - if(sym == all_syms[0] && top_scope_node == 0) - { - if(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs|RDIM_SubsetFlag_TypeNameMap)) - { - CV_SymUDT *udt = (CV_SymUDT *)iter.struct_base; - String8 name = str8_cstring_capped(udt+1, iter.opl); - RDIM_Type *type = rdim_type_chunk_list_push(arena, typedefs, 4096); - type->kind = RDI_TypeKind_Alias; - type->name = name; - type->direct_type = p2r_type_ptr_from_itype(udt->itype); - if(type->direct_type != 0) - { - type->byte_size = type->direct_type->byte_size; - } - } - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - // rjf: unpack sym - CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; - String8 name = str8_cstring_capped(proc32+1, iter.opl); - RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); - - // rjf: unpack proc's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2 && tpi_hash != 0 && tpi_leaf != 0) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack proc's container scope - RDIM_Scope *container_scope = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_scope = top_scope_node->scope; - } - - // rjf: build procedure's root scope - // - // NOTE: even if there could be a containing scope at this point (which should be - // illegal in C/C++ but not necessarily in another language) we would not use - // it here because these scopes refer to the ranges of code that make up a - // procedure *not* the namespaces, so a procedure's root scope always has - // no parent. - RDIM_Scope *procedure_root_scope = 0; - if(params->subset_flags & RDIM_SubsetFlag_Scopes) - { - procedure_root_scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + proc32->off; - U64 voff_last = voff_first + proc32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, sym_scopes, procedure_root_scope, voff_range); - procedure_base_voff = voff_first; - } - } - - // rjf: root scope voff minimum range -> link name - String8 link_name = {0}; - if(procedure_root_scope && procedure_root_scope->voff_ranges.min != 0) - { - U64 voff = procedure_root_scope->voff_ranges.min; - U64 hash = p2r_hash_from_voff(voff); - U64 bucket_idx = hash%link_name_map->buckets_count; - P2R_LinkNameNode *node = 0; - for(P2R_LinkNameNode *n = link_name_map->buckets[bucket_idx]; n != 0; n = n->next) - { - if(n->voff == voff) - { - link_name = n->name; - break; - } - } - } - - // rjf: build procedure symbol - if(params->subset_flags & (RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_ProcedureNameMap)) - { - curr_proc_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); - curr_proc_symbol->is_extern = (iter.kind == CV_SymKind_GPROC32); - curr_proc_symbol->name = name; - curr_proc_symbol->link_name = link_name; - curr_proc_symbol->type = type; - curr_proc_symbol->container_scope = container_scope; - curr_proc_symbol->container_type = container_type; - curr_proc_symbol->root_scope = procedure_root_scope; - if(procedure_root_scope != 0) - { - procedure_root_scope->symbol = curr_proc_symbol; - } - } - - // rjf: push scope to scope stack - if(procedure_root_scope) - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = procedure_root_scope; - SLLStackPush(top_scope_node, node); - } - - // rjf: increment procedure counter - procedure_num += 1; - - // reset S_REGREL32 index - regrel_idx = 0; - - proc_flags = proc32->flags; - }break; - - //- rjf: REGREL32 - case CV_SymKind_REGREL32: - { - if(params->subset_flags & RDIM_SubsetFlag_Locals && !(proc_flags & CV_ProcFlag_OptDbgInfo)) - { - // TODO(rjf): apparently some of the information here may end up being - // redundant with "better" information from CV_SymKind_LOCAL record. - // we don't currently handle this, but if those cases arise then it - // will obviously be better to prefer the better information from both - // records. - - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)iter.struct_base; - String8 name = str8_cstring_capped(regrel32+1, iter.opl); - RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); - CV_Reg cv_reg = regrel32->reg; - U32 var_off = regrel32->reg_off; - - // rjf: determine if this is a parameter - B32 is_param = (regrel_idx < curr_proc_symbol->type->count); - - // rjf: determine if we need an extra indirection to the value - B32 extra_indirection_to_value = 0; - if(type != 0) - { - switch(arch) - { - case RDI_Arch_X64: - { - extra_indirection_to_value = (is_param && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); - }break; - } - } - - // If the return local does not fit in a register MSVC does not assign it a type. - // So we infer the return type from the signature. - // - // rjf: redirect type, if 0, and if outside frame, to the return type of the - // containing procedure - { - B32 is_stack_reg = 0; - switch(arch) - { - default:{}break; - case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP || cv_reg == CV_Regx64_RBP);}break; - } - if(is_stack_reg) - { - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num <= procedure_frameprocs_count) - { - CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; - if(var_off > frameproc->frame_size && regrel32->itype == 0 && - top_scope_node->scope->symbol != 0 && - top_scope_node->scope->symbol->type != 0) - { - type = top_scope_node->scope->symbol->type->direct_type; - extra_indirection_to_value = 1; - } - } - } - } - - // rjf: build local - { - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); - local->is_param = is_param; - local->name = name; - local->type = type; - - // rjf: equip location info - { - // rjf: get raddbg register code - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - // TODO(rjf): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; - - // rjf: build location - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_case_list_push(arena, &local->location_cases, loc, voff_range); - } - } - } - - regrel_idx += 1; - }break; - - //- rjf: LTHREAD32/GTHREAD32 - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - if(params->subset_flags & (RDIM_SubsetFlag_ThreadVariables|RDIM_SubsetFlag_ThreadVariableNameMap)) - { - // rjf: unpack sym - CV_SymThread32 *thread32 = (CV_SymThread32 *)iter.struct_base; - String8 name = str8_cstring_capped(thread32+1, iter.opl); - U32 tls_off = thread32->tls_off; - RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); - - // rjf: unpack thread variable's container type - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) - { - String8 container_name = str8(name.str, container_name_opl - 2); - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - } - - // rjf: unpack thread variable's container symbol - RDIM_Scope *container_scope = 0; - if(container_type == 0 && top_scope_node != 0) - { - container_scope = top_scope_node->scope; - } - - // rjf: build symbol - RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, sym_thread_variables, sym_thread_variables_chunk_cap); - tvar->name = name; - tvar->type = type; - tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); - tvar->container_type = container_type; - tvar->container_scope = container_scope; - RDIM_Location loc = {.kind = RDI_LocationKind_TLSOff, .offset = tls_off}; - RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; - rdim_location_case_list_push(arena, &tvar->location_cases, loc, range); - }break; - - //- rjf: LOCAL - case CV_SymKind_LOCAL: - if(params->subset_flags & (RDIM_SubsetFlag_Locals)) - { - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymLocal *slocal = (CV_SymLocal *)iter.struct_base; - String8 name = str8_cstring_capped(slocal+1, iter.opl); - RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); - - // rjf: determine if this symbol encodes the beginning of a global modification - B32 is_global_modification = 0; - if((slocal->flags & CV_LocalFlag_Global) || - (slocal->flags & CV_LocalFlag_Static)) - { - is_global_modification = 1; - } - - // rjf: is global modification -> emit global modification symbol - if(is_global_modification) - { - // TODO(rjf): add global modification symbols - defrange_target = 0; - } - - // rjf: is not a global modification -> emit a local variable - if(!is_global_modification) - { - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); - { - local->is_param = !!(slocal->flags & CV_LocalFlag_Param); - local->name = name; - local->type = type; - } - - // rjf: save defrange target, for subsequent defrange symbols - defrange_target = local; - } - }break; - - //- rjf: DEFRANGE_REGISTER - case CV_SymKind_DEFRANGE_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)iter.struct_base; - CV_Reg cv_reg = defrange_register->reg; - CV_LvarAddrRange *range = &defrange_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); - U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - - // rjf: build location - RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; - - // rjf: emit locations over ranges - p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)iter.struct_base; - CV_LvarAddrRange *range = &defrange_fprel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); - U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); - RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = rdi_addr_size_from_arch(arch); - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel->off; - RDIM_Location location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit locations over ranges - p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_SUBFIELD_REGISTER - case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)iter.struct_base; - CV_Reg cv_reg = defrange_subfield_register->reg; - CV_LvarAddrRange *range = &defrange_subfield_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); - U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - - // rjf: skip "subfield" location info - currently not supported - if(defrange_subfield_register->field_offset != 0) - { - break; - } - - // rjf: build location - RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; - - // rjf: emit locations over ranges - p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)iter.struct_base; - CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); - RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = rdi_addr_size_from_arch(arch); - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel_full_scope->off; - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit location over ranges - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_case_list_push(arena, &defrange_target->location_cases, loc, voff_range); - }break; - - //- rjf: DEFRANGE_REGISTER_REL - case CV_SymKind_DEFRANGE_REGISTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)iter.struct_base; - CV_Reg cv_reg = defrange_register_rel->reg; - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - CV_LvarAddrRange *range = &defrange_register_rel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); - U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: build location - // TODO(rjf): offset & size from cv_reg code - U32 byte_size = rdi_addr_size_from_arch(arch); - U32 byte_pos = 0; - B32 extra_indirection_to_value = 0; - S64 var_off = defrange_register_rel->reg_off; - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); - - // rjf: emit locations over ranges - p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); - }break; - - //- rjf: FILESTATIC - case CV_SymKind_FILESTATIC: - { - CV_SymFileStatic *file_static = (CV_SymFileStatic*)iter.struct_base; - String8 name = str8_cstring_capped(file_static+1, iter.opl); - RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); - // TODO(rjf): emit a global modifier symbol - defrange_target = 0; - }break; - - //- rjf: INLINESITE - case CV_SymKind_INLINESITE: - if(params->subset_flags & (RDIM_SubsetFlag_Scopes)) - { - // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; - String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); - - // rjf: extract external info about inline site - String8 name = {0}; - RDIM_Type *type = 0; - RDIM_Type *owner = 0; - if(ipi_leaf != 0 && ipi_leaf->itype_first <= sym->inlinee && sym->inlinee < ipi_leaf->itype_opl) - { - CV_RecRange rec_range = ipi_leaf->leaf_ranges.ranges[sym->inlinee - ipi_leaf->itype_first]; - String8 rec_data = str8_substr(ipi_leaf->data, rng_1u64(rec_range.off, rec_range.off + rec_range.hdr.size)); - void *raw_leaf = rec_data.str + sizeof(U16); - - // rjf: extract method inline info - if(rec_range.hdr.kind == CV_LeafKind_MFUNC_ID && - rec_range.hdr.size >= sizeof(CV_LeafMFuncId)) - { - CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)raw_leaf; - name = str8_cstring_capped(mfunc_id + 1, rec_data.str + rec_data.size); - type = p2r_type_ptr_from_itype(mfunc_id->itype); - owner = mfunc_id->owner_itype != 0 ? p2r_type_ptr_from_itype(mfunc_id->owner_itype) : 0; - } - - // rjf: extract non-method function inline info - else if(rec_range.hdr.kind == CV_LeafKind_FUNC_ID && - rec_range.hdr.size >= sizeof(CV_LeafFuncId)) - { - CV_LeafFuncId *func_id = (CV_LeafFuncId*)raw_leaf; - name = str8_cstring_capped(func_id + 1, rec_data.str + rec_data.size); - type = p2r_type_ptr_from_itype(func_id->itype); - owner = func_id->scope_string_id != 0 ? p2r_type_ptr_from_itype(func_id->scope_string_id) : 0; - } - } - - // rjf: build inline site - RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, sym_inline_sites, sym_inline_sites_chunk_cap); - inline_site->name = name; - inline_site->type = type; - inline_site->owner = owner; - inline_site->line_table = inline_site_line_table; - - // rjf: increment to next inline site line table in this unit - if(inline_site_line_table != 0 && inline_site_line_table->chunk != 0) - { - RDIM_LineTableChunkNode *chunk = inline_site_line_table->chunk; - U64 current_idx = (U64)(inline_site_line_table - chunk->v); - if(current_idx+1 < chunk->count) - { - inline_site_line_table += 1; - } - else - { - chunk = chunk->next; - inline_site_line_table = 0; - if(chunk != 0) - { - inline_site_line_table = chunk->v; - } - } - } - - // rjf: build scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); - scope->inline_site = inline_site; - if(top_scope_node == 0) - { - // TODO(rjf): log - } - if(top_scope_node != 0) - { - RDIM_Scope *top_scope = top_scope_node->scope; - SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); - scope->parent_scope = top_scope; - scope->symbol = top_scope->symbol; - } - - // rjf: push this scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = scope; - SLLStackPush(top_scope_node, node); - } - - // rjf: parse offset ranges of this inline site - attach to scope - { - CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(0, 0, procedure_base_voff); - for(;;) - { - CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots); - - if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitRange) - { - // rjf: build new range & add to scope - RDIM_Rng1U64 voff_range = { step.range.min, step.range.max }; - rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range); - } - - if(step.flags & CV_C13InlineSiteDecoderStepFlag_ExtendLastRange) - { - if(scope->voff_ranges.last != 0) - { - scope->voff_ranges.last->v.max = step.range.max; - } - } - - if(step.flags == 0) - { - break; - } - } - } - }break; - - //- rjf: INLINESITE_END - case CV_SymKind_INLINESITE_END: - { - P2R_ScopeNode *n = top_scope_node; - if(n != 0) - { - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); - } - defrange_target = 0; - }break; - - //- rjf: CONSTANT - case CV_SymKind_CONSTANT: - if(params->subset_flags & RDIM_SubsetFlag_Constants) - { - // rjf: unpack - CV_SymConstant *sym = (CV_SymConstant *)iter.struct_base; - RDIM_Type *type = p2r_type_ptr_from_itype(sym->itype); - U8 *val_ptr = (U8 *)(sym+1); - CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, iter.opl); - U64 val64 = cv_u64_from_numeric(&val); - U8 *name_ptr = val_ptr + val.encoded_size; - String8 name = str8_cstring_capped(name_ptr, iter.opl); - String8 val_data = str8_struct(&val64); - U64 container_name_opl = 0; - if(type != 0) - { - container_name_opl = p2r_end_of_cplusplus_container_name(type->name); - } - String8 name_qualified = name; - if(container_name_opl != 0) - { - name_qualified = push_str8f(arena, "%S%S", str8_prefix(type->name, container_name_opl), name); - } - - // rjf: build constant symbol - if(name_qualified.size != 0) - { - RDIM_Symbol *cnst = rdim_symbol_chunk_list_push(arena, sym_constants, sym_constants_chunk_cap); - cnst->name = name_qualified; - cnst->type = type; - RDIM_Location loc = {.kind = RDI_LocationKind_ConstantDataOff, .value_data = str8_copy(arena, val_data)}; - RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; - rdim_location_case_list_push(arena, &cnst->location_cases, loc, range); - } - }break; - } - } - } - - scratch_end(scratch); - } - } -#undef p2r_type_ptr_from_itype - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: join extra types from units - // - RDIM_TypeChunkList all_types = {0}; - { - RDIM_TypeChunkList *all_types_ptr = 0; - if(lane_idx() == 0) - { - all_types_ptr = push_array(scratch.arena, RDIM_TypeChunkList, 1); - } - lane_sync_u64(&all_types_ptr, 0); - if(lane_idx() == lane_from_task_idx(7)) ProfScope("join typedefs") - { - for EachIndex(idx, all_syms_count) - { - rdim_type_chunk_list_concat_in_place(all_types__pre_typedefs_ptr, &syms_typedefs[idx]); - } - *all_types_ptr = *all_types__pre_typedefs_ptr; - } - lane_sync(); - all_types = *all_types_ptr; - } - lane_sync(); - ////////////////////////////////////////////////////////////// //- rjf: bundle all outputs // @@ -4218,6 +4498,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) result.top_level_info = top_level_info; result.binary_sections = binary_sections; result.units = all_units; + result.namespaces = all_namespaces; result.types = all_types; result.udts = all_udts; result.src_files = all_src_files; diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index c60e6fa8..6db2ea93 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2584,6 +2584,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } + lane_sync(); ////////////////////////////////////////////////////////////// //- rjf: @rdim_bake_stage compute lane UDT member/enum-val layouts From ee2dcbee48aedb3c235c3d282e31f653fc8d41c6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 19 Apr 2026 17:00:07 -0700 Subject: [PATCH 409/850] fix idx shadowing lookup bug in rdim_bake_name_map_insert --- src/lib_rdi_make/rdi_make.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index fe1d3ef9..b95aa3fb 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1810,10 +1810,10 @@ rdim_bake_name_map_insert(RDIM_Arena *arena, RDIM_BakeNameMapTopology *map_topol RDI_S32 is_duplicate = 0; for(RDIM_BakeNameChunkNode *n = slot->first; n != 0; n = n->next) { - for(RDI_U64 idx = 0; idx < n->count; idx += 1) + for(RDI_U64 n_idx = 0; n_idx < n->count; n_idx += 1) { - if(rdim_str8_match(n->v[idx].string, string, 0) && - n->v[idx].idx == idx) + if(rdim_str8_match(n->v[n_idx].string, string, 0) && + n->v[n_idx].idx == idx) { is_duplicate = 1; goto break_all; From 897ffc6b69f704265d335697127b95b303b652a4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 19 Apr 2026 19:07:29 -0700 Subject: [PATCH 410/850] file path evaluation activation in watch windows -> switch to file --- src/raddbg/raddbg_core.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index b6c9b6d0..7eed0982 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4390,6 +4390,12 @@ rd_view_ui(Rng2F32 rect) { rd_cmd(RD_CmdKind_PushQuery, .expr = e_full_expr_string_from_key(scratch.arena, cell->eval.key)); } + + // rjf: is file eval? -> switch to file + else if(cell_info.file_path.size != 0) + { + rd_cmd(RD_CmdKind_Switch, .cfg = 0, .file_path = cell_info.file_path); + } } // rjf: hovering with inheritance string -> show tooltip From bc43fe9b3128b0a33b07d615215acfe1369327cd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 20 Apr 2026 10:22:56 -0700 Subject: [PATCH 411/850] only enable cursor trails if not click+dragging; redundant animation in that case --- src/raddbg/raddbg_widgets.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 2f3772e2..11b3eac4 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2805,7 +2805,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } trail_color.w *= 0.25f; dr_rect(cursor_rect, cursor_color, 1.f, 0, 0.f); - if(do_cursor_trail) + if(do_cursor_trail && !ui_key_match(ui_active_key(UI_MouseButtonKind_Left), text_container_box->key)) { R_Rect2DInst *trail_inst = dr_rect(trail_rect, trail_color, ui_top_font_size()*0.2f, 0, 1.f); trail_inst->shear = cursor_y - cursor_y__animated; @@ -4157,7 +4157,7 @@ rd_cell(RD_CellParams *params, String8 string) draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string); draw_data->cursor = params->cursor[0]; draw_data->mark = params->mark[0]; - draw_data->trail = do_cursor_trail; + draw_data->trail = do_cursor_trail && !ui_dragging(sig); ui_box_equip_custom_draw(text_box, ui_line_edit_draw, draw_data); Vec2F32 text2mouse = sub_2f32(ui_mouse(), ui_box_text_position(text_box)); FNT_Tag font = ui_top_font(); From 4decc0d9f09b1e8f4130dcf073bb55d025ccf99a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Apr 2026 19:59:40 -0700 Subject: [PATCH 412/850] test GSI procs and typedefs --- src/torture/torture_radlink.c | 132 +++++++++++++++++++++++++++++++--- 1 file changed, 123 insertions(+), 9 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 55ad47be..a403f6d0 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -29,6 +29,12 @@ t_push_rdata_section(COFF_ObjWriter *obj_writer, String8 data) return coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS, data); } +internal COFF_ObjSection * +t_push_debug_s_section(COFF_ObjWriter *obj_writer, String8 data) +{ + return coff_obj_writer_push_section(obj_writer, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS, data); +} + internal String8 t_make_sec_defn_obj(Arena *arena, String8 payload) { @@ -4692,16 +4698,33 @@ TEST(validate_info_stream) TEST(validate_gsi) { - PDB_Context *pdb = pdb_alloc(MSF_DEFAULT_PAGE_SIZE, COFF_MachineType_X64, 123, 1, (Guid){ .data1 = max_U32, .data2 = max_U16 - 1, .data3 = max_U16 - 2, .data4 = { 1, 2, 3, 4, 5, 6, 7, 8 } }); - CV_Symbol symbols[] = { - cv_symbol_from_ptr(cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32){ .itype = 0x41bd, .off = 0x25440, .sec = 2 }, str8_lit("__newclmap"))).str), - cv_symbol_from_ptr(cv_make_symbol(arena, CV_SymKind_CONSTANT, cv_make_const(arena, (CV_SymConstant){ .itype = 0x2348 }, 263, str8_lit("CV_SymKind_BLOCK16"))).str), - cv_symbol_from_ptr(cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32){ .itype = 0, .off = 123, .sec = 1 }, str8_lit("coffeebabe"))).str), - cv_symbol_from_ptr(cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32){ .itype = 0, .off = 123, .sec = 1 }, str8_lit("deadbeef"))).str), + String8 raw_symbols[] = { + cv_make_symbol(arena, CV_SymKind_CONSTANT, cv_make_const(arena, (CV_SymConstant){ .itype = 0 }, 263, str8_lit("CV_SymKind_BLOCK16"))), + cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32) { .itype = 0, .off = 0x25440, .sec = 2 }, str8_lit("__newclmap"))), + cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32) { .itype = 0, .off = 123, .sec = 1 }, str8_lit("coffeebabe"))), + cv_make_symbol(arena, CV_SymKind_GDATA32, cv_make_data32(arena, (CV_SymData32) { .itype = 0, .off = 123, .sec = 1 }, str8_lit("deadbeef"))), }; - for EachElement(i, symbols) { gsi_push(pdb->gsi, &symbols[i]); } - String8 raw_pdb = data_from_pdb(arena, pdb); + CV_Symbol symbols[ArrayCount(raw_symbols)] = {0}; + for EachElement(i, raw_symbols) { symbols[i] = cv_symbol_from_ptr(raw_symbols[i].str); } + + CV_DebugS debug_s = {0}; + for EachElement(i, symbols) { str8_list_push(arena, &debug_s.data_list[CV_C13SubSectionIdxKind_Symbols], cv_data_from_symbol(arena, &symbols[i], CV_SymbolAlign)); } + String8List raw_debug_s_list = cv_data_from_debug_s_c13(arena, &debug_s, 1); + String8 raw_debug_s = str8_list_join(arena, &raw_debug_s_list, 0); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + t_push_debug_s_section(cow, raw_debug_s); + String8 obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("debug.obj"), obj)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe entry.obj debug.obj"); + T_Ok(g_last_exit_code == 0); + + String8 raw_pdb = t_read_file(arena, str8_lit("a.pdb")); MSF_Parsed *msf = msf_parsed_from_data(arena, raw_pdb); String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); PDB_DbiParsed *dbi = pdb_dbi_from_data(arena, dbi_data); @@ -4710,6 +4733,8 @@ TEST(validate_gsi) String8 symbol_data = msf_data_from_stream(msf, dbi->sym_sn); for EachElement(i, symbols) { + CV_Symbol symbol = symbols[i]; + String8 string = cv_name_from_symbol(symbols[i].kind, symbols[i].data); U64 symbol_off = pdb_gsi_symbol_from_string(gsi, symbol_data, string); T_Ok(symbol_off < symbol_data.size); @@ -4719,8 +4744,97 @@ TEST(validate_gsi) T_Ok(test_symbol_size > 0); T_Ok(cv_symbol_match(test_symbol, symbols[i])); } +} - pdb_release(pdb); +TEST(validate_gsi_procs_and_typedefs) +{ + String8 raw_symbols[] = { + cv_make_symbol(arena, CV_SymKind_OBJNAME, cv_make_obj_name(arena, str8_lit("debug.obj"), 0x123)), + cv_make_symbol(arena, CV_SymKind_GPROC32_ID, cv_make_proc32(arena, (CV_SymProc32){0}, str8_lit("global_proc"))), + cv_make_symbol(arena, CV_SymKind_PROC_ID_END, cv_make_end(arena)), + + cv_make_symbol(arena, CV_SymKind_UDT, cv_make_udt(arena, (CV_SymUDT){0}, str8_lit("global_typedef"))), + + cv_make_symbol(arena, CV_SymKind_OBJNAME, cv_make_obj_name(arena, str8_lit("debug.obj"), 0x123)), + cv_make_symbol(arena, CV_SymKind_LPROC32_ID, cv_make_proc32(arena, (CV_SymProc32){0}, str8_lit("local_proc"))), + cv_make_symbol(arena, CV_SymKind_UDT, cv_make_udt(arena, (CV_SymUDT){0}, str8_lit("local_typedef"))), + cv_make_symbol(arena, CV_SymKind_PROC_ID_END, cv_make_end(arena)), + }; + + CV_Symbol symbols[ArrayCount(raw_symbols)] = {0}; + for EachElement(i, raw_symbols) { symbols[i] = cv_symbol_from_ptr(raw_symbols[i].str); } + + CV_DebugS debug_s = {0}; + for EachElement(i, symbols) { str8_list_push(arena, &debug_s.data_list[CV_C13SubSectionIdxKind_Symbols], cv_data_from_symbol(arena, &symbols[i], CV_SymbolAlign)); } + String8List raw_debug_s_list = cv_data_from_debug_s_c13(arena, &debug_s, 1); + String8 raw_debug_s = str8_list_join(arena, &raw_debug_s_list, 0); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + t_push_debug_s_section(cow, raw_debug_s); + String8 obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("debug.obj"), obj)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe entry.obj debug.obj"); + T_Ok(g_last_exit_code == 0); + + String8 raw_pdb = t_read_file(arena, str8_lit("a.pdb")); + MSF_Parsed *msf = msf_parsed_from_data(arena, raw_pdb); + String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); + PDB_DbiParsed *dbi = pdb_dbi_from_data(arena, dbi_data); + String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn); + PDB_GsiParsed *gsi = pdb_gsi_from_data(arena, gsi_data); + String8 symbol_data = msf_data_from_stream(msf, dbi->sym_sn); + + struct { + char *name; + B32 is_global; + U64 offset; + U64 imod; + } procs[] = { + { "global_proc", 1, 0x18, 2, }, + { "local_proc", 0, 0x64, 2, }, + }; + for EachElement(i, procs) { + U64 symbol_off = pdb_gsi_symbol_from_string(gsi, symbol_data, str8_cstring(procs[i].name)); + T_Ok(symbol_off < symbol_data.size); + + CV_Symbol test_symbol = {0}; + U64 test_symbol_size = cv_read_symbol(str8_skip(symbol_data, symbol_off), 0, 1, &test_symbol); + String8 test_symbol_name = cv_name_from_symbol(test_symbol.kind, test_symbol.data); + T_Ok(test_symbol_size > 0); + T_Ok(str8_match(str8_cstring(procs[i].name), test_symbol_name, 0)); + T_Ok(test_symbol.kind == (procs[i].is_global ? CV_SymKind_PROCREF : CV_SymKind_LPROCREF)); + + CV_SymRef2 *proc_ref = str8_deserial_get_raw_ptr(test_symbol.data, 0, sizeof(*proc_ref)); + T_Ok(proc_ref->suc_name == 0); + T_Ok(proc_ref->sym_off == procs[i].offset); + T_Ok(proc_ref->imod == procs[i].imod); + } + + struct { + char *name; + B32 is_global; + } typedefs[] = { + { "global_typedef", 1 }, + { "local_typedef", 0 }, + }; + for EachElement(i, typedefs) { + U64 symbol_off = pdb_gsi_symbol_from_string(gsi, symbol_data, str8_cstring(typedefs[i].name)); + if (typedefs[i].is_global) { + T_Ok(symbol_off < symbol_data.size); + CV_Symbol test_symbol = {0}; + U64 test_symbol_size = cv_read_symbol(str8_skip(symbol_data, symbol_off), 0, 1, &test_symbol); + String8 test_symbol_name = cv_name_from_symbol(test_symbol.kind, test_symbol.data); + T_Ok(test_symbol_size > 0); + T_Ok(str8_match(str8_cstring(typedefs[i].name), test_symbol_name, 0)); + T_Ok(test_symbol.kind == CV_SymKind_UDT); + } else { + T_Ok(symbol_off >= symbol_data.size); + } + } } TEST(patch_cv_symbol_tree) From aefd73e551d2c7d014d4b4b926d7909226f43c54 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 16 Apr 2026 21:01:18 -0700 Subject: [PATCH 413/850] test public symbols --- src/torture/torture_radlink.c | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index a403f6d0..8fdf9eb1 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4837,6 +4837,73 @@ TEST(validate_gsi_procs_and_typedefs) } } +TEST(validate_psi) +{ + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_lit("FOOBAR")); + COFF_ObjSection *data = coff_obj_writer_push_section(cow, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_lit("QWE")); + coff_obj_writer_push_symbol_extern_func(cow, str8_lit("global_func"), 1, text); + coff_obj_writer_push_symbol_extern(cow, str8_lit("global_var"), 1, data); + coff_obj_writer_push_symbol_static(cow, str8_lit("static_var"), 1, data); + String8 test_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("test.obj"), test_obj)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj test.obj"); + T_Ok(g_last_exit_code == 0); + + String8 raw_pdb = t_read_file(arena, str8_lit("a.pdb")); + MSF_Parsed *msf = msf_parsed_from_data(arena, raw_pdb); + String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); + PDB_DbiParsed *dbi = pdb_dbi_from_data(arena, dbi_data); + String8 psi_data = msf_data_from_stream(msf, dbi->psi_sn); + String8 psi_gsi_data = str8_range(psi_data.str + sizeof(PDB_PsiHeader), psi_data.str+psi_data.size); + PDB_GsiParsed *psi = pdb_gsi_from_data(arena, psi_gsi_data); + String8 symbol_data = msf_data_from_stream(msf, dbi->sym_sn); + + struct { + char *name; + B32 is_global; + CV_Pub32Flags flags; + } pubs[] = { + { "global_func", 1, CV_Pub32Flag_Function }, + { "global_var", 1, 0 }, + { "static_var", 0, 0 }, + }; + for EachElement(i, pubs) { + U64 symbol_off = pdb_gsi_symbol_from_string(psi, symbol_data, str8_cstring(pubs[i].name)); + if (pubs[i].is_global) { + T_Ok(symbol_off < symbol_data.size); + CV_Symbol test_symbol = {0}; + U64 test_symbol_size = cv_read_symbol(str8_skip(symbol_data, symbol_off), 0, 1, &test_symbol); + String8 test_symbol_name = cv_name_from_symbol(test_symbol.kind, test_symbol.data); + T_Ok(test_symbol_size > 0); + T_Ok(str8_match(str8_cstring(pubs[i].name), test_symbol_name, 0)); + T_Ok(test_symbol.kind == CV_SymKind_PUB32); + CV_SymPub32 *pub32 = str8_deserial_get_raw_ptr(test_symbol.data, 0, sizeof(*pub32)); + T_Ok(pub32->sec > 0); + T_Ok(pubs[i].flags == pub32->flags); + } else { + T_Ok(symbol_off >= symbol_data.size); + } + } + + U64 pub32_count = 0; + for EachElement(i, psi->buckets) { + PDB_GsiBucket bucket = psi->buckets[i]; + for EachIndex(k, bucket.count) { + CV_Symbol test_symbol = {0}; + U64 test_symbol_size = cv_read_symbol(str8_skip(symbol_data, bucket.offs[k]), 0, 1, &test_symbol); + T_Ok(test_symbol_size >= sizeof(CV_SymPub32)); + T_Ok(test_symbol.kind == CV_SymKind_PUB32); + pub32_count += 1; + } + } + T_Ok(pub32_count > 0); +} + TEST(patch_cv_symbol_tree) { String8List raw_symbols = {0}; From e6f49aaded52775e61c902b497d5afa867d556f7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 17 Apr 2026 18:01:54 -0700 Subject: [PATCH 414/850] test stripped PDB --- src/linker/codeview_ext/codeview.c | 4 +- src/linker/lnk.c | 14 ++-- src/linker/lnk_debug_info.c | 25 +++---- src/linker/pdb_ext/pdb_builder.c | 30 +++++--- src/torture/torture_radlink.c | 108 ++++++++++++++++++++++++++++- 5 files changed, 146 insertions(+), 35 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 198d6675..dc1e7d88 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -196,11 +196,13 @@ cv_write_symbol_buf(String8Node *buf, U64 *buf_pos, CV_Symbol *symbol, U64 align { CV_SymbolHeader header = { .size = sizeof(CV_SymKind) + symbol->data.size, .kind = symbol->kind }; U64 pad_size = AlignPadPow2(header.size + sizeof(CV_SymSize), align); + header.size += pad_size; + U64 write_size = 0; write_size += str8_buffer_write(buf, buf_pos, str8_struct(&header)); write_size += str8_buffer_write(buf, buf_pos, symbol->data); write_size += str8_buffer_write_zeroes(buf, buf_pos, pad_size); - Assert(write_size == header.size + sizeof(CV_SymSize) + pad_size); + return write_size; } diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 9c65833d..7d8b1917 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -5320,7 +5320,8 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) if (symbol.kind == CV_SymKind_SKIP) { continue; } if (cv_is_lproc(symbol)) { proc_count += 1; - proc_size += AlignPow2(symbol.data.size, CV_SymbolAlign); + proc_size += AlignPow2(sizeof(CV_SymbolHeader) + symbol.data.size, CV_SymbolAlign); + proc_size += AlignPow2(sizeof(CV_SymbolHeader), CV_SymbolAlign); // S_END } } section += 1; @@ -5329,7 +5330,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) if (proc_count) { U64 end_count = proc_count; U64 symbol_count = proc_count + end_count; - U64 buffer_size = proc_size + sizeof(CV_SymbolHeader) * symbol_count; + U64 buffer_size = proc_size; U8 *buffer = push_array(scratch.arena, U8, buffer_size); U64 buffer_cursor = 0; @@ -5339,13 +5340,10 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) TryReadBreak(cv_read_symbol(n->string, cursor, CV_SymbolAlign, &symbol), cursor); if (symbol.kind == CV_SymKind_SKIP) { continue; } if (cv_is_lproc(symbol)) { - CV_SymProc32 *src_proc = (CV_SymProc32 *)symbol.data.str; - src_proc->itype = 0; - - CV_Symbol end_symbol = { .kind = CV_SymKind_END }; - + CV_SymProc32 *src_proc = str8_deserial_get_raw_ptr(symbol.data, 0, sizeof(*src_proc)); + memory_write32(&src_proc->itype, 0); // strip type index buffer_cursor += cv_write_symbol(buffer, buffer_cursor, buffer_size, &symbol, CV_SymbolAlign); - buffer_cursor += cv_write_symbol(buffer, buffer_cursor, buffer_size, &end_symbol, CV_SymbolAlign); + buffer_cursor += cv_write_symbol(buffer, buffer_cursor, buffer_size, &(CV_Symbol){ .kind = CV_SymKind_END }, CV_SymbolAlign); } } } diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 2cdef26f..7a66c940 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -2411,18 +2411,19 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config cv_string_hash_table_assign_buffer_offsets(tp, task.string_ht); ProfEnd(); - ProfScope ("Alloc Modules") for EachIndex(obj_idx, cv->obj_count) { task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, cv->obj_arr[obj_idx]->path, lnk_obj_get_lib_path(cv->obj_arr[obj_idx])); } - ProfScope("Move Global Symbols") tp_for_parallel(tp, 0, tp->worker_count, lnk_move_global_symbols_to_gsi, &task); - { - PDB_Context *pdb = task.pdb; - PDB_DbiContext *dbi = pdb->dbi; - dbi->globals_sn = msf_stream_alloc(pdb->msf); - dbi->publics_sn = msf_stream_alloc(pdb->msf); - dbi->symbols_sn = msf_stream_alloc(pdb->msf); - psi_build(tp, pdb->psi, pdb->msf, dbi->publics_sn, dbi->symbols_sn); - gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); - } - ProfScope("Write Modules") tp_for_parallel(tp, 0, tp->worker_count, lnk_write_pdb_modules, &task); + ProfScope ("Alloc Modules") + for EachIndex(obj_idx, cv->obj_count) { + task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, cv->obj_arr[obj_idx]->path, lnk_obj_get_lib_path(cv->obj_arr[obj_idx])); + } + + ProfScope("Move Global Symbols") + tp_for_parallel(tp, 0, tp->worker_count, lnk_move_global_symbols_to_gsi, &task); + + ProfScope("Build GSI and PSI") + pdb_build_gsi_psi(tp, task.pdb); + + ProfScope("Write Modules") + tp_for_parallel(tp, 0, tp->worker_count, lnk_write_pdb_modules, &task); ProfBegin("Add string tables"); pdb_strtab_add_cv_string_hash_table(&task.pdb->info->strtab, task.string_ht); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 56cb02c5..f7de6cdb 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -3134,6 +3134,24 @@ pdb_get_guid(PDB_Context *pdb) return pdb->info->guid; } +internal void +pdb_build_gsi_psi(TP_Context *tp, PDB_Context *pdb) +{ + PDB_DbiContext *dbi = pdb->dbi; + + if (pdb->psi->gsi->symbol_count) { + if (dbi->publics_sn == MSF_INVALID_STREAM_NUMBER) { dbi->publics_sn = msf_stream_alloc(pdb->msf); } + if (dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER) { dbi->symbols_sn = msf_stream_alloc(pdb->msf); } + psi_build(tp, pdb->psi, pdb->msf, dbi->publics_sn, dbi->symbols_sn); + } + + if (pdb->gsi->symbol_count) { + if (dbi->globals_sn == MSF_INVALID_STREAM_NUMBER) { dbi->globals_sn = msf_stream_alloc(pdb->msf); } + if (dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER) { dbi->symbols_sn = msf_stream_alloc(pdb->msf); } + gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); + } +} + internal void pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht, B32 build_gsi, B32 is_stripped) { @@ -3151,17 +3169,7 @@ pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTa } if (build_gsi) { - if (dbi->globals_sn == MSF_INVALID_STREAM_NUMBER) { - dbi->globals_sn = msf_stream_alloc(pdb->msf); - } - if (dbi->publics_sn == MSF_INVALID_STREAM_NUMBER) { - dbi->publics_sn = msf_stream_alloc(pdb->msf); - } - if (dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER) { - dbi->symbols_sn = msf_stream_alloc(pdb->msf); - } - psi_build(tp, pdb->psi, pdb->msf, dbi->publics_sn, dbi->symbols_sn); - gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn); + pdb_build_gsi_psi(tp, pdb); } dbi_build(tp, pdb->dbi, pdb->msf, PDB_FixedStream_Dbi, string_ht, is_stripped); diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 8fdf9eb1..d9beebde 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4687,9 +4687,9 @@ TEST(validate_info_stream) 0x6f, 0x00, 0x74, 0x68, 0x72, 0x65, 0x65, 0x00, 0x66, 0x6f, 0x75, 0x72, 0x00, 0x66, 0x69, 0x76, 0x65, 0x00, 0x2f, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x51, 0x33, 0x01 + 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x51, 0x33, 0x01, }; T_Ok(str8_match(info_data, str8_array_fixed(expected_info_data), 0)); @@ -4742,7 +4742,9 @@ TEST(validate_gsi) CV_Symbol test_symbol = {0}; U64 test_symbol_size = cv_read_symbol(str8_skip(symbol_data, symbol_off), 0, 1, &test_symbol); T_Ok(test_symbol_size > 0); - T_Ok(cv_symbol_match(test_symbol, symbols[i])); + + String8 test_symbol_name = cv_name_from_symbol(test_symbol.kind, test_symbol.data); + T_Ok(str8_match(test_symbol_name, string, 0)); } } @@ -4904,6 +4906,106 @@ TEST(validate_psi) T_Ok(pub32_count > 0); } +TEST(pdbstripped) +{ + String8 debug_obj; + { + String8 raw_symbols[] = { + cv_make_symbol(arena, CV_SymKind_OBJNAME, cv_make_obj_name(arena, str8_lit("debug.obj"), 0x123)), + cv_make_symbol(arena, CV_SymKind_GPROC32_ID, cv_make_proc32(arena, (CV_SymProc32){0}, str8_lit("global_proc"))), + cv_make_symbol(arena, CV_SymKind_PROC_ID_END, cv_make_end(arena)), + + cv_make_symbol(arena, CV_SymKind_UDT, cv_make_udt(arena, (CV_SymUDT){0}, str8_lit("global_typedef"))), + + cv_make_symbol(arena, CV_SymKind_LPROC32_ID, cv_make_proc32(arena, (CV_SymProc32){0}, str8_lit("local_proc"))), + cv_make_symbol(arena, CV_SymKind_UDT, cv_make_udt(arena, (CV_SymUDT){0}, str8_lit("local_typedef"))), + cv_make_symbol(arena, CV_SymKind_PROC_ID_END, cv_make_end(arena)), + }; + + CV_Symbol symbols[ArrayCount(raw_symbols)] = {0}; + for EachElement(i, raw_symbols) { symbols[i] = cv_symbol_from_ptr(raw_symbols[i].str); } + + CV_DebugS debug_s = {0}; + for EachElement(i, symbols) { str8_list_push(arena, &debug_s.data_list[CV_C13SubSectionIdxKind_Symbols], cv_data_from_symbol(arena, &symbols[i], CV_SymbolAlign)); } + String8List raw_debug_s_list = cv_data_from_debug_s_c13(arena, &debug_s, 1); + String8 raw_debug_s = str8_list_join(arena, &raw_debug_s_list, 0); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + t_push_debug_s_section(cow, raw_debug_s); + debug_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + } + + String8 pub_obj; + { + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_ObjSection *text = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_lit("FOOBAR")); + COFF_ObjSection *data = coff_obj_writer_push_section(cow, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_lit("QWE")); + coff_obj_writer_push_symbol_extern_func(cow, str8_lit("global_func"), 1, text); + coff_obj_writer_push_symbol_extern(cow, str8_lit("global_var"), 1, data); + coff_obj_writer_push_symbol_static(cow, str8_lit("static_var"), 1, data); + pub_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + } + + T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); + T_Ok(t_write_file(str8_lit("pub.obj"), pub_obj)); + T_Ok(t_write_entry_obj()); + t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe /pdbstripped:a.stripped.pdb entry.obj pub.obj debug.obj"); + T_Ok(g_last_exit_code == 0); + + String8 raw_pdb = t_read_file(arena, str8_lit("a.stripped.pdb")); + MSF_Parsed *msf = msf_parsed_from_data(arena, raw_pdb); + String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); + PDB_DbiParsed *dbi = pdb_dbi_from_data(arena, dbi_data); + + String8 mods_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); + PDB_CompUnitArray *mods = pdb_comp_unit_array_from_data(arena, mods_data); + T_Ok(mods->count > 0); + + // modules must contain only stubs for static procs + for EachIndex(i, mods->count) { + PDB_CompUnit *mod = mods->units[i]; + U64 sym_data_size = mod->range_off[PDB_DbiCompUnitRange_Symbols + 1] - mod->range_off[PDB_DbiCompUnitRange_Symbols]; + U64 c11_data_size = mod->range_off[PDB_DbiCompUnitRange_C11 + 1] - mod->range_off[PDB_DbiCompUnitRange_C11]; + U64 c13_data_size = mod->range_off[PDB_DbiCompUnitRange_C13 + 1] - mod->range_off[PDB_DbiCompUnitRange_C13]; + T_Ok(c11_data_size == 0); + T_Ok(c13_data_size == 0); + if (str8_match(str8_skip_last_slash(mod->obj_name), str8_lit("debug.obj"), 0)) { + T_Ok(sym_data_size > 0); + } else { + T_Ok(sym_data_size == 0); + } + + String8 mod_data = msf_data_from_stream(msf, mod->sn); + String8 sym_data = str8_substr(mod_data, r1u64(mod->range_off[PDB_DbiCompUnitRange_Symbols], mod->range_off[PDB_DbiCompUnitRange_Symbols + 1])); + for (U64 cursor = 0; cursor < sym_data_size; ) { + CV_Symbol symbol = {0}; + U64 read_size = cv_read_symbol(sym_data, cursor, PDB_SYMBOL_ALIGN, &symbol); + T_Ok(read_size > 0); + cursor += read_size; + T_Ok(symbol.kind == CV_SymKind_LPROC32 || symbol.kind == CV_SymKind_END); + } + } + + // global symbol stream must have public and references to the static stubs + String8 symbol_data = msf_data_from_stream(msf, dbi->sym_sn); + for (U64 cursor = 0; cursor < symbol_data.size; ) { + CV_Symbol symbol = {0}; + U64 read_size = cv_read_symbol(symbol_data, cursor, PDB_SYMBOL_ALIGN, &symbol); + T_Ok(read_size > 0); + cursor += read_size; + T_Ok(symbol.kind == CV_SymKind_PUB32 || + symbol.kind == CV_SymKind_LPROCREF); + } + + // types must be stripped + String8 tpi = msf_data_from_stream(msf, PDB_FixedStream_Tpi); + T_Ok(tpi.size == sizeof(PDB_TpiHeader)); + String8 ipi = msf_data_from_stream(msf, PDB_FixedStream_Ipi); + T_Ok(ipi.size == sizeof(PDB_TpiHeader)); +} + TEST(patch_cv_symbol_tree) { String8List raw_symbols = {0}; From 9e19fe51939a4a41a55ce61937ce534afd825fb5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 17 Apr 2026 20:16:25 -0700 Subject: [PATCH 415/850] prettify elapsed time formatter --- src/base/base_strings.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index b3d279e8..8256648a 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -2282,24 +2282,31 @@ string_from_elapsed_time(Arena *arena, DateTime dt) { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; - if(dt.year) - { + if (dt.year) { str8_list_pushf(scratch.arena, &list, "%dy", dt.year); str8_list_pushf(scratch.arena, &list, "%um", dt.mon); str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } - else if(dt.mon) - { + } else if (dt.mon) { str8_list_pushf(scratch.arena, &list, "%um", dt.mon); str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } - else if (dt.day) - { + } else if (dt.day) { str8_list_pushf(scratch.arena, &list, "%ud", dt.day); } - str8_list_pushf(scratch.arena, &list, "%u:%u:%u:%u ms", dt.hour, dt.min, dt.sec, dt.msec); - StringJoin join = { str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }; - String8 result = str8_list_join(arena, &list, &join); + + if (dt.hour) { + str8_list_pushf(scratch.arena, &list, "%uh %um %u.%us", dt.hour, dt.min, dt.sec, dt.msec); + } else if (dt.min) { + str8_list_pushf(scratch.arena, &list, "%um %u.%us", dt.min, dt.sec, dt.msec); + } else if (dt.sec) { + str8_list_pushf(scratch.arena, &list, "%u.%us", dt.sec, dt.msec); + } else if (dt.msec) { + str8_list_pushf(scratch.arena, &list, "%ums", dt.msec); + } else if (dt.micro_sec) { + str8_list_pushf(scratch.arena, &list, "%uus", dt.micro_sec); + } + + String8 result = str8_list_join(arena, &list, &(StringJoin){ str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }); + scratch_end(scratch); return result; } From cd4f81d47399477e8aabcd0f8aa52bdfa49f734f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 17 Apr 2026 20:18:45 -0700 Subject: [PATCH 416/850] time tests --- src/base/base_core.c | 9 +++++++ src/base/base_core.h | 1 + src/torture/torture.c | 52 +++++++++++++++++++++++++------------- src/torture/torture_base.c | 10 ++++++++ 4 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/base/base_core.c b/src/base/base_core.c index 80fc9682..c450648a 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -714,6 +714,15 @@ index_of_zero_u64(U64 *ptr, U64 count) return max_U64; } +internal U64 +count_digits_u64(U64 v, U64 radix) +{ + if (v == 0) { return 1; } + U64 count = 0; + for (U64 x = v; x > 0; x /= radix) { count += 1; } + return count; +} + //////////////////////////////// //~ rjf: Third Party Includes diff --git a/src/base/base_core.h b/src/base/base_core.h index 52a27343..cdb8c4f4 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -1069,5 +1069,6 @@ internal U64 u64_array_bsearch(U64 *arr, U64 count, U64 value); internal U64 index_of_zero_u32(U32 *ptr, U64 count); internal U64 index_of_zero_u64(U64 *ptr, U64 count); +internal U64 count_digits_u64(U64 v, U64 radix); #endif // BASE_CORE_H diff --git a/src/torture/torture.c b/src/torture/torture.c index 762aca4b..843dd9e6 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -516,18 +516,6 @@ t_entry_point(CmdLine *cmdline) { radsort(g_torture_tests, g_torture_test_count, t_test_is_before); - U64 max_label_size = 0; - U64 max_group_size = 0; - for EachIndex(i, g_torture_test_count) { - max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[i].label)); - max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[i].group)); - } - - U64 dots_min = 10; - U64 dots_size = max_label_size+dots_min; - U8 *dots = push_array(scratch.arena, U8, dots_size); - MemorySet(dots, '.', dots_size); - U64 target_indices_count; U64 *target_indices; if (target.node_count == 0) { @@ -553,16 +541,33 @@ t_entry_point(CmdLine *cmdline) } } + U64 max_label_size = 0; + U64 max_group_size = 0; + for EachIndex(i, target_indices_count) { + U64 test_idx = target_indices[i]; + max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[test_idx].label)); + max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[test_idx].group)); + } + + U64 dots_min = 15; + U64 dots_size = max_label_size+dots_min; + U8 *dots = push_array(scratch.arena, U8, dots_size); + MemorySet(dots, '.', dots_size); + U64 pass_count = 0; U64 fail_count = 0; U64 crash_count = 0; + U64 max_digit_count = count_digits_u64(target_indices_count, 10); + U64 total_time_start = os_now_microseconds(); for EachIndex(i, target_indices_count) { U64 target_idx = target_indices[i]; // print run progress U64 dots_count = (max_label_size - cstring8_length((U8*)g_torture_tests[target_idx].label)) + dots_min; char *spaces = " "; - fprintf(stdout, "[%2I64u/%2I64u] ", i+1, target_indices_count); + U64 curr_digit_count = count_digits_u64(i+1, 10); + int idx_align_space_count = (int)(max_digit_count - curr_digit_count); + fprintf(stdout, "[%.*s%I64u/%I64u] ", idx_align_space_count, spaces, i+1, target_indices_count); fprintf(stdout, "(%s) %.*s%s", g_torture_tests[target_idx].group, (int)(max_group_size - cstring8_length((U8*)g_torture_tests[target_idx].group)), spaces, g_torture_tests[target_idx].label); fprintf(stdout, "%.*s", (int)dots_count, dots); @@ -582,20 +587,30 @@ t_entry_point(CmdLine *cmdline) } // run test + U64 run_start_time = os_now_microseconds(); T_RunResult result = t_run(g_torture_tests[target_idx].r); + U64 run_end_time = os_now_microseconds(); // print result if (result.status == T_RunStatus_Pass) { - fprintf(stdout, "\x1b[32m" "%s" "\x1b[0m" "\n", t_string_from_result(result.status)); + fprintf(stdout, "\x1b[32m" "%s" "\x1b[0m", t_string_from_result(result.status)); pass_count += 1; } else if (result.status == T_RunStatus_Fail) { - fprintf(stdout, "\x1b[31m" "%s" "\x1b[0m" "\n", t_string_from_result(result.status)); + fprintf(stdout, "\x1b[31m" "%s" "\x1b[0m", t_string_from_result(result.status)); fail_count += 1; } else if (result.status == T_RunStatus_Crash) { - fprintf(stdout, "\x1b[33m" "%s" "\x1b[0m" "\n", t_string_from_result(result.status)); + fprintf(stdout, "\x1b[33m" "%s" "\x1b[0m", t_string_from_result(result.status)); crash_count += 1; } + if (result.status == T_RunStatus_Pass) { + U64 d = run_end_time - run_start_time; + DateTime t = date_time_from_micro_seconds(d); + String8 s = string_from_elapsed_time(scratch.arena, t); + fprintf(stdout, " | %.*s", str8_varg(s)); + } + fprintf(stdout, "\n"); + if (result.status == T_RunStatus_Fail) { fprintf(stdout, " ERROR: %s:%d: condition: \"%s\"\n", result.fail_file, result.fail_line, result.fail_cond); } @@ -604,8 +619,11 @@ t_entry_point(CmdLine *cmdline) if (g_stop_on_first_fail_or_crash) { goto exit; } } } + U64 total_time_end = os_now_microseconds(); - fprintf(stdout, "*** Passed: %I64u, Failed: %I64u, Crashed: %I64u ***\n", pass_count, fail_count, crash_count); + U64 total_time_dt = total_time_end - total_time_start; + String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); + fprintf(stdout, "*** Passed: %I64u, Failed: %I64u, Crashed: %I64u, Time: %.*s***\n", pass_count, fail_count, crash_count, str8_varg(total_time_str)); exit:; if (fail_count + crash_count != 0) { diff --git a/src/torture/torture_base.c b/src/torture/torture_base.c index a79a57f9..b55e13f6 100644 --- a/src/torture/torture_base.c +++ b/src/torture/torture_base.c @@ -94,4 +94,14 @@ TEST(bit_array) } } +TEST(count_digits) +{ + T_Ok(count_digits_u64(0, 10) == 1); + T_Ok(count_digits_u64(99, 10) == 2); + T_Ok(count_digits_u64(999, 10) == 3); + T_Ok(count_digits_u64(9999, 10) == 4); + T_Ok(count_digits_u64(99999, 10) == 5); + T_Ok(count_digits_u64(999999, 10) == 6); +} + #undef T_Group From 0a791e5876b95a72b9a743930d458ab9980d5058 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 20 Apr 2026 10:38:18 -0700 Subject: [PATCH 417/850] add support for LLVM ghash sections --- src/linker/lnk.c | 9 +- src/linker/lnk_config.c | 12 ++ src/linker/lnk_config.h | 2 + src/linker/lnk_debug_info.c | 153 ++++++++++++++++----- src/linker/lnk_debug_info.h | 5 +- src/linker/lnk_log.h | 1 + src/llvm/llvm.c | 24 ++++ src/llvm/llvm.h | 29 ++++ src/torture/torture_main.c | 2 + src/torture/torture_radlink.c | 251 ++++++++++++++++++++++++++++++++++ 10 files changed, 449 insertions(+), 39 deletions(-) create mode 100644 src/llvm/llvm.c create mode 100644 src/llvm/llvm.h diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 7d8b1917..d506f377 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -34,6 +34,7 @@ #include "msf/msf_parse.h" #include "pdb/pdb.h" #include "msvc_crt/msvc_crt.h" +#include "llvm/llvm.h" #include "base/base_inc.c" #include "os/os_inc.c" @@ -52,6 +53,7 @@ #include "msf/msf_parse.c" #include "pdb/pdb.c" #include "msvc_crt/msvc_crt.c" +#include "llvm/llvm.c" // --- RDI --------------------------------------------------------------------- @@ -120,7 +122,7 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) { LNK_CmdLine cmd_line = {0}; - // setup default flags + // default flags lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Align, "%u", KB(4)); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Debug, "none"); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_FileAlign, "%u", 512); @@ -136,6 +138,7 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) if (!lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Brepro)) { lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", os_get_process_start_time_unix()); } + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_TypeHashAlg, "BLAKE3"); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Age, "%u", 1); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, ""); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_DoMerge, ""); @@ -5246,7 +5249,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) // // CodeView // - LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config->io_flags, config->lib_dir_list, config->alt_pch_dirs, debug_info_objs_count, debug_info_objs); + LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config, debug_info_objs_count, debug_info_objs); LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv); // @@ -5354,7 +5357,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) } LNK_CodeViewInput stripped_cv = {0}; - stripped_cv.io_flags = config->io_flags; + stripped_cv.config = config; stripped_cv.is_stripped = 1; stripped_cv.obj_arr = cv.obj_arr; stripped_cv.obj_count = cv.obj_count; diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 62b84851..78eee9f2 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -92,6 +92,7 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Rad_Ignore, 0, "RAD_IGNORE", ":#", "Ignore the specified RAD linker warning." }, { LNK_CmdSwitch_Rad_WriteTempFiles, 0, "RAD_WRITE_TEMP_FILES", "[:NO]", "When speicifed linker writes image and debug info to temporary files and renames after link is done." }, { LNK_CmdSwitch_Rad_TimeStamp, 0, "RAD_TIME_STAMP", ":#", "Time stamp embeded in EXE and PDB." }, + { LNK_CmdSwitch_Rad_TypeHashAlg, 0, "RAD_TPYE_HASH_ALG", ":{BLAKE3}", "Sets hashing algorithm for type merging." }, { LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, 0, "RAD_UNRESOLVED_SYMBOL_LIMIT", ":#", "Limits number of unresolved symbol errors linker reports." }, { LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, 0, "RAD_UNRESOLVED_SYMBOL_REF_LIMIT", ":#", "Limit number of unresolved symbol references linker reports." }, { LNK_CmdSwitch_Rad_Version, 0, "RAD_VERSION", "", "Print version and exit." }, @@ -2065,6 +2066,17 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_cmd_switch_parse_u32(obj, cmd_switch, value_strings, &config->time_stamp, 0); } break; + case LNK_CmdSwitch_Rad_TypeHashAlg: { + String8 alg = {0}; + if (lnk_cmd_switch_parse_string(obj, cmd_switch, value_strings, &alg)) { + if (str8_match(alg, str8_lit("BLAKE3"), StringMatchFlag_CaseInsensitive)) { + config->type_hash_alg = LLVM_GHashAlg_BLAKE3; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unknown hash alg: %S", alg); + } + } + } break; + case LNK_CmdSwitch_Rad_UnresolvedSymbolLimit: { lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->unresolved_symbol_limit, 0); } break; diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index e3bb81ba..513a3f9d 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -119,6 +119,7 @@ typedef enum LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, LNK_CmdSwitch_Rad_Ignore, LNK_CmdSwitch_Rad_TimeStamp, + LNK_CmdSwitch_Rad_TypeHashAlg, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, LNK_CmdSwitch_Rad_Version, @@ -360,6 +361,7 @@ typedef struct LNK_Config U64 unresolved_symbol_ref_limit; LNK_SwitchState map_lines_for_unresolved_symbols; String8List alt_pch_dirs; + LLVM_GHashAlg type_hash_alg; } LNK_Config; // --- MSVC Error Codes -------------------------------------------------------- diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 7a66c940..232d776d 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -57,6 +57,76 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task) } } +internal +THREAD_POOL_TASK_FUNC(lnk_parse_debug_h_task) +{ + U64 obj_idx = task_id; + LNK_CodeViewInput *task = raw_task; + + String8List sect_list = task->debug_h_list_arr[obj_idx]; + CV_DebugH *debug_h = &task->debug_h_arr [obj_idx]; + + if (sect_list.node_count > 0) { + if (sect_list.node_count > 1) { + lnk_error_obj(LNK_Warning_GHash, task->obj_arr[obj_idx], + "obj contains multiple .debug$H sections; using first one"); + } + + // select first .debug$H + String8 raw_debug_h = sect_list.first->string; + LLVM_GHash ghash = {0}; + U64 ghash_read_size = str8_deserial_read_struct(raw_debug_h, 0, &ghash); + + // was header read completely? + if (ghash_read_size != sizeof(ghash)) { + lnk_error_obj(LNK_Warning_GHash, task->obj_arr[obj_idx], + ".debug$H section is too small to contain the header"); + goto exit; + } + + // validate magic + if (ghash.magic != LLVM_GHash_Magic) { + lnk_error_obj(LNK_Warning_GHash, task->obj_arr[obj_idx], + ".debug$H contains invalid magic: got 0x%x, expected 0x%x", ghash.magic, LLVM_GHash_Magic); + goto exit; + } + + // validate version + if (ghash.version != LLVM_GHash_CurrentVersion) { + lnk_error_obj(LNK_Warning_GHash, task->obj_arr[obj_idx], + "mismatched .debug$H version: got %u, expected %u", + ghash.version, LLVM_GHash_CurrentVersion); + goto exit; + } + + // validate hashing algorithm + if (ghash.hash_alg != task->config->type_hash_alg) { + lnk_error_obj(LNK_Warning_GHash, task->obj_arr[obj_idx], + "mismatched .debug$H hash algorithm: got %S, expected %S", + llvm_string_from_ghash_alg(ghash.hash_alg), + llvm_string_from_ghash_alg(task->config->type_hash_alg)); + goto exit; + } + + // input.debug_h_arr must be 1:1 with input.debug_t_arr + U64 hash_size = llvm_hash_size_from_alg(ghash.hash_alg); + U64 hash_count = (raw_debug_h.size - sizeof(ghash)) / hash_size; + if (hash_count != task->debug_t_arr[obj_idx].count) { + lnk_error_obj(LNK_Warning_GHash, task->obj_arr[obj_idx], + "mismatched .debug$H hash count and type count: got %llu hashes for %llu types", + hash_count, task->debug_t_arr[obj_idx].count); + goto exit; + } + + // load hashes + String8 hashes = str8_substr(raw_debug_h, r1u64(sizeof(ghash), raw_debug_h.size)); + debug_h->count = hash_count; + debug_h->v = (U64 *)hashes.str; + + exit:; + } +} + internal THREAD_POOL_TASK_FUNC(lnk_strip_debug_t_sig_task) { @@ -106,7 +176,7 @@ THREAD_POOL_TASK_FUNC(lnk_read_type_servers_task) LNK_TypeServer *ts = &task->ts_arr.v[ts_idx]; // read PDB from disk - String8 msf_data = lnk_read_data_from_file_path(scratch.arena, task->io_flags, ts->ts_path); + String8 msf_data = lnk_read_data_from_file_path(scratch.arena, task->config->io_flags, ts->ts_path); // check magic if (!msf_check_magic_70(msf_data) && msf_check_magic_20(msf_data)) { goto exit; } @@ -198,48 +268,49 @@ THREAD_POOL_TASK_FUNC(lnk_read_type_servers_task) } internal LNK_CodeViewInput -lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_flags, String8List lib_dir_list, String8List alt_pch_dirs, U64 obj_count, LNK_Obj **obj_arr) +lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 obj_count, LNK_Obj **obj_arr) { ProfBegin("Extract CodeView"); Temp scratch = scratch_begin(0,0); - LNK_CodeViewInput input = { .io_flags = io_flags, .obj_count = obj_count, .count = obj_count, .obj_arr = obj_arr, .ts_obj_range = r1u64(0,0) }; + LNK_CodeViewInput input = { .config = config, .obj_count = obj_count, .count = obj_count, .obj_arr = obj_arr, .ts_obj_range = r1u64(0,0) }; ProfBegin("Collect CodeView"); input.debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$S"), 0); input.debug_p_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$P"), 0); input.debug_t_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$T"), 0); + input.debug_h_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$H"), 0); ProfEnd(); if (lnk_get_log_status(LNK_Log_Debug) || PROFILE_TELEMETRY) { - U64 total_debug_s_size = 0, total_debug_t_size = 0, total_debug_p_size = 0; + U64 total_debug_s_size = 0, total_debug_t_size = 0, total_debug_p_size = 0, total_debug_h_size = 0; for EachIndex(obj_idx, obj_count) { for EachNode(n, String8Node, input.debug_s_list_arr[obj_idx].first) { total_debug_s_size += n->string.size; } for EachNode(n, String8Node, input.debug_t_list_arr[obj_idx].first) { total_debug_t_size += n->string.size; } for EachNode(n, String8Node, input.debug_p_list_arr[obj_idx].first) { total_debug_p_size += n->string.size; } + for EachNode(n, String8Node, input.debug_h_list_arr[obj_idx].first) { total_debug_h_size += n->string.size; } } ProfNoteV("Total .debug$S Input Size: %M", total_debug_s_size); ProfNoteV("Total .debug$T Input Size: %M", total_debug_t_size); ProfNoteV("Total .debug$P Input Size: %M", total_debug_p_size); + ProfNoteV("Total .debug$H Input Size: %M", total_debug_H_size); if (lnk_get_log_status(LNK_Log_Debug)) { lnk_log(LNK_Log_Debug, "[Total .debug$S Input Size %M]", total_debug_s_size); lnk_log(LNK_Log_Debug, "[Total .debug$T Input Size %M]", total_debug_t_size); lnk_log(LNK_Log_Debug, "[Total .debug$P Input Size %M]", total_debug_p_size); + lnk_log(LNK_Log_Debug, "[Total .debug$H Input Size %M]", total_debug_h_size); } } ProfBegin("Parse CodeView"); CV_DebugT *debug_p_arr; { - input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, obj_count); + input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, input.obj_count); tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_s_task, &input, "Parse .debug$S"); - input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, obj_count); // TODO: collect & parse .debug$H - LNK_ParseCvTypes parse_types = { .input = &input }; - debug_p_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); parse_types.raw_types = str8_array_from_list_arr(scratch.arena, input.debug_p_list_arr, obj_count); parse_types.out_types = debug_p_arr; @@ -251,6 +322,9 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla parse_types.out_types = input.debug_t_arr; tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$T"); tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$T"); + + input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, input.obj_count); + tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_h_task, &input, "Parse .debug$H"); } ProfEnd(); @@ -297,7 +371,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); CV_TypeServerInfo ts_info = cv_type_server_info_from_leaf(leaf); - String8 ts_path = lnk_find_first_file(scratch.arena, lib_dir_list, ts_info.name); + String8 ts_path = lnk_find_first_file(scratch.arena, config->lib_dir_list, ts_info.name); if (ts_path.size == 0) { lnk_discard_cv_debug_info(&input, obj_idx); @@ -424,7 +498,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_fla if ( ! hash_table_search_path_u64(debug_p_ht, obj_path, &debug_p_obj_idx)) { // try alternative directory for the PCH String8 obj_name = str8_skip_last_slash(obj_path); - for EachNode(alt_dir_n, String8Node, alt_pch_dirs.first) { + for EachNode(alt_dir_n, String8Node, config->alt_pch_dirs.first) { String8 alt_obj_path = str8f(scratch.arena, "%S/%S", alt_dir_n->string, obj_name); if (hash_table_search_path_u64(debug_p_ht, alt_obj_path, &debug_p_obj_idx)) { break; } } @@ -1325,36 +1399,47 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) ProfBegin("Produce Hashes"); { ProfBegin("Alloc Hashes"); - U32Array indices[] = { - input->debug_p_indices, - input->int_obj_indices, - input->type_server_indices, + struct HashTarget { + TP_TaskFunc *hasher_task; + U32Array indices; + U32Array hash_indices; + } hash_targets[] = { + { lnk_hash_debug_t_task, input->debug_p_indices }, // hash .debug$P first so we can mix in hashes for precompiled sub leaves when hashing leaves in .debug$T + { lnk_hash_debug_t_task, input->int_obj_indices }, + { lnk_hash_debug_t_deep_task, input->type_server_indices }, }; - for EachElement(i, indices) { - for EachIndex(k, indices[i].count) { - U64 obj_idx = indices[i].v[k]; - CV_DebugT *debug_t = &input->debug_t_arr[obj_idx]; + + for EachElement(i, hash_targets) { + // reserve array for obj indices that need hashing + U32Array *h = &hash_targets[i].hash_indices; + h->count = 0; + h->v = push_array(scratch.arena, U32, hash_targets[i].indices.count); + + for EachIndex(k, hash_targets[i].indices.count) { + U32 obj_idx = hash_targets[i].indices.v[k]; CV_DebugH *debug_h = &input->debug_h_arr[obj_idx]; - debug_h->count = debug_t->count; - debug_h->v = push_array(scratch.arena, U64, debug_h->count); + + if (debug_h->count == 0) { + // alloc hashes + CV_DebugT *debug_t = &input->debug_t_arr[obj_idx]; + debug_h->count = debug_t->count; + debug_h->v = push_array(scratch.arena, U64, debug_h->count); + + // schedule obj types to be hashed + h->v[h->count++] = obj_idx; + } else { + // hash was loaded from .debug$H + } } } ProfEnd(); - - // hash .debug$P first so we can mix in hashes for precompiled sub leaves when hashing leaves in .debug$T - ProfBegin("Hash"); - task.indices = input->debug_p_indices; - ProfScope(".debug$P [Count: %llu]", input->debug_p_indices.count) - tp_for_parallel(tp, 0, task.indices.count, lnk_hash_debug_t_task, &task); - task.indices = input->int_obj_indices; - ProfScope(".debug$T [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, task.indices.count))) - tp_for_parallel(tp, 0, task.indices.count, lnk_hash_debug_t_task, &task); - - task.indices = input->type_server_indices; - ProfScope("Type Servers [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, task.indices.count))) - tp_for_parallel(tp, 0, task.indices.count, lnk_hash_debug_t_deep_task, &task); - ProfEnd(); + for EachElement(i, hash_targets) { + task.indices = hash_targets[i].hash_indices; + ProfBegin("Hash [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, task.indices.count))); + tp_for_parallel(tp, 0, hash_targets[i].indices.count, hash_targets[i].hasher_task, &task); + ProfEnd(); + } #if BUILD_DEBUG for EachIndex(i, input->count) { diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 3ab66c4a..1f97fa23 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -25,7 +25,7 @@ typedef struct LNK_SymbolInput typedef struct { - LNK_IO_Flags io_flags; + LNK_Config *config; U64 obj_count; B32 is_stripped; @@ -39,6 +39,7 @@ typedef struct String8List *debug_s_list_arr; String8List *debug_p_list_arr; String8List *debug_t_list_arr; + String8List *debug_h_list_arr; U32Array int_obj_indices; U32Array ext_obj_indices; @@ -278,7 +279,7 @@ typedef struct //////////////////////////////// // CodeView -internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_flags, String8List lib_dir_list, String8List alt_pch_dirs, U64 objs_count, LNK_Obj **objs); +internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 objs_count, LNK_Obj **objs); internal int lnk_leaf_ref_compare (LNK_LeafRef a, LNK_LeafRef b); internal int lnk_leaf_ref_is_before (void *raw_a, void *raw_b); diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index 75080f98..781a4a20 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -108,6 +108,7 @@ typedef enum LNK_Warning_NoLargeAddressAwarenessForDll, LNK_Warning_TryingToExportEntryPoint, LNK_Warning_InferAsanFail, + LNK_Warning_GHash, LNK_Warning_Last, LNK_Error_Count diff --git a/src/llvm/llvm.c b/src/llvm/llvm.c new file mode 100644 index 00000000..d7337bde --- /dev/null +++ b/src/llvm/llvm.c @@ -0,0 +1,24 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal String8 +llvm_string_from_ghash_alg(LLVM_GHashAlg v) +{ + switch (v) { + case LLVM_GHashAlg_SHA1: return str8_lit("SHA1"); + case LLVM_GHashAlg_SHA1_8: return str8_lit("SHA1_8"); + case LLVM_GHashAlg_BLAKE3: return str8_lit("BALK3"); + } + return str8_zero(); +} + +internal U64 +llvm_hash_size_from_alg(LLVM_GHashAlg v) +{ + switch (v) { + case LLVM_GHashAlg_SHA1: return 20; + case LLVM_GHashAlg_SHA1_8: return 8; + case LLVM_GHashAlg_BLAKE3: return 8; + } + return 0; +} diff --git a/src/llvm/llvm.h b/src/llvm/llvm.h new file mode 100644 index 00000000..e0b61cc7 --- /dev/null +++ b/src/llvm/llvm.h @@ -0,0 +1,29 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef LLVM_H +#define LLVM_H + +#define LLVM_GHash_Magic 0x133c9c5 +#define LLVM_GHash_CurrentVersion 0 + +typedef U16 LLVM_GHashAlg; +typedef enum LLVM_GHashAlgEnum +{ + LLVM_GHashAlg_SHA1 = 0, + LLVM_GHashAlg_SHA1_8 = 1, + LLVM_GHashAlg_BLAKE3 = 2, +} LLVM_GHashAlgEnum; + +typedef struct LLVM_GHash +{ + U32 magic; + LLVM_GHashAlg hash_alg; + U16 version; + // * hashes[] +} LLVM_GHash; + +internal String8 llvm_string_from_ghash_alg(LLVM_GHashAlg v); + +#endif // LLVM_H + diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 7571fa37..e38f8199 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -54,6 +54,7 @@ #include "pdb/pdb_parse.h" #include "pdb/pdb_stringize.h" #include "dwarf/dwarf_inc.h" +#include "llvm/llvm.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" @@ -126,6 +127,7 @@ #include "pdb/pdb_parse.c" #include "pdb/pdb_stringize.c" #include "dwarf/dwarf_inc.c" +#include "llvm/llvm.c" #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index d9beebde..3cb0c418 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -5006,6 +5006,257 @@ TEST(pdbstripped) T_Ok(ipi.size == sizeof(PDB_TpiHeader)); } +TEST(ghash_check_corrupt) +{ + String8List t = {0}; str8_serial_begin(arena, &t); + str8_serial_push_u32(arena, &t, CV_Signature_C13); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_STRUCTURE, str8_struct(&(CV_LeafStruct){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_UNION, str8_struct(&(CV_LeafUnion){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_ENUM, str8_struct(&(CV_LeafEnum){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + String8 debug_t = str8_serial_end(arena, &t); + + String8List h = {0}; str8_serial_begin(arena, &h); + String8 debug_h = str8_serial_end(arena, &h); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); + String8 debug_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); + T_Ok(t_write_entry_obj()); + + String8 output = {0}; + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 is_warning_found = 0; + String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); + String8 expected_line = str8f(arena, "Warning(%03u): %S: .debug$H section is too small to contain the header", LNK_Warning_GHash, debug_obj_path, LLVM_GHash_Magic); + for (String8 i = output; i.size > 0 && !is_warning_found; ) { + String8 line = t_chop_line(&i); + is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + } + T_Ok(is_warning_found); +} + +TEST(ghash_check_magic) +{ + String8List t = {0}; str8_serial_begin(arena, &t); + str8_serial_push_u32(arena, &t, CV_Signature_C13); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_STRUCTURE, str8_struct(&(CV_LeafStruct){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_UNION, str8_struct(&(CV_LeafUnion){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_ENUM, str8_struct(&(CV_LeafEnum){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + String8 debug_t = str8_serial_end(arena, &t); + +#if 0 + U64 *hashes = push_array(arena, U64, t.node_count); + U64 i = 0; + for EachNode(n, String8Node, t.first->next) { + blake3(&hashes[i], sizeof(hashes[i]), n->string.str, n->string.size); + i += 1; + } +#endif + String8List h = {0}; str8_serial_begin(arena, &h); + str8_serial_push_struct(arena, &h, (&(LLVM_GHash){ .magic = 123, .hash_alg = LLVM_GHashAlg_BLAKE3, .version = LLVM_GHash_CurrentVersion })); + str8_serial_push_u64(arena, &h, 0x6ebacae08af4fda5ull); + str8_serial_push_u64(arena, &h, 0xc385876694f9769aull); + str8_serial_push_u64(arena, &h, 0x7ea8a529a89b2288ull); + String8 debug_h = str8_serial_end(arena, &h); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); + String8 debug_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); + T_Ok(t_write_entry_obj()); + + String8 output = {0}; + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 is_warning_found = 0; + String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); + String8 expected_line = str8f(arena, "Warning(%03u): %S: .debug$H contains invalid magic: got 0x7b, expected 0x%x", LNK_Warning_GHash, debug_obj_path, LLVM_GHash_Magic); + for (String8 i = output; i.size > 0 && !is_warning_found; ) { + String8 line = t_chop_line(&i); + is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + } + T_Ok(is_warning_found); +} + +TEST(ghash_check_version) +{ + String8List t = {0}; str8_serial_begin(arena, &t); + str8_serial_push_u32(arena, &t, CV_Signature_C13); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_STRUCTURE, str8_struct(&(CV_LeafStruct){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_UNION, str8_struct(&(CV_LeafUnion){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_ENUM, str8_struct(&(CV_LeafEnum){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + String8 debug_t = str8_serial_end(arena, &t); + +#if 0 + U64 *hashes = push_array(arena, U64, t.node_count); + U64 i = 0; + for EachNode(n, String8Node, t.first->next) { + blake3(&hashes[i], sizeof(hashes[i]), n->string.str, n->string.size); + i += 1; + } +#endif + String8List h = {0}; str8_serial_begin(arena, &h); + str8_serial_push_struct(arena, &h, (&(LLVM_GHash){ .magic = LLVM_GHash_Magic, .hash_alg = LLVM_GHashAlg_BLAKE3, .version = 0xbeef })); + str8_serial_push_u64(arena, &h, 0x6ebacae08af4fda5ull); + str8_serial_push_u64(arena, &h, 0xc385876694f9769aull); + str8_serial_push_u64(arena, &h, 0x7ea8a529a89b2288ull); + String8 debug_h = str8_serial_end(arena, &h); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); + String8 debug_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); + T_Ok(t_write_entry_obj()); + + String8 output = {0}; + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 is_warning_found = 0; + String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); + String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H version: got %u, expected %u", LNK_Warning_GHash, debug_obj_path, 0xbeef, LLVM_GHash_CurrentVersion); + for (String8 i = output; i.size > 0 && !is_warning_found; ) { + String8 line = t_chop_line(&i); + is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + } + T_Ok(is_warning_found); +} + +TEST(ghash_check_hash_alg) +{ + String8List t = {0}; str8_serial_begin(arena, &t); + str8_serial_push_u32(arena, &t, CV_Signature_C13); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_STRUCTURE, str8_struct(&(CV_LeafStruct){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_UNION, str8_struct(&(CV_LeafUnion){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_ENUM, str8_struct(&(CV_LeafEnum){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + String8 debug_t = str8_serial_end(arena, &t); + + String8List h = {0}; str8_serial_begin(arena, &h); + str8_serial_push_struct(arena, &h, (&(LLVM_GHash){ .magic = LLVM_GHash_Magic, .hash_alg = LLVM_GHashAlg_SHA1_8, .version = LLVM_GHash_CurrentVersion })); + str8_serial_push_u64(arena, &h, 0x6ebacae08af4fda5ull); + str8_serial_push_u64(arena, &h, 0xc385876694f9769aull); + str8_serial_push_u64(arena, &h, 0x7ea8a529a89b2288ull); + String8 debug_h = str8_serial_end(arena, &h); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); + String8 debug_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); + T_Ok(t_write_entry_obj()); + + String8 output = {0}; + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 is_warning_found = 0; + String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); + String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash algorithm: got SHA1_8, expected BALK3", LNK_Warning_GHash, debug_obj_path); + for (String8 i = output; i.size > 0 && !is_warning_found; ) { + String8 line = t_chop_line(&i); + is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + } + T_Ok(is_warning_found); +} + +TEST(ghash_match_debug_t) +{ + String8List t = {0}; str8_serial_begin(arena, &t); + str8_serial_push_u32(arena, &t, CV_Signature_C13); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_STRUCTURE, str8_struct(&(CV_LeafStruct){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_UNION, str8_struct(&(CV_LeafUnion){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + //str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_ENUM, str8_struct(&(CV_LeafEnum){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + String8 debug_t = str8_serial_end(arena, &t); + + String8List h = {0}; str8_serial_begin(arena, &h); + str8_serial_push_struct(arena, &h, (&(LLVM_GHash){ .magic = LLVM_GHash_Magic, .hash_alg = LLVM_GHashAlg_BLAKE3, .version = LLVM_GHash_CurrentVersion })); + str8_serial_push_u64(arena, &h, 0x6ebacae08af4fda5ull); + str8_serial_push_u64(arena, &h, 0xc385876694f9769aull); + str8_serial_push_u64(arena, &h, 0x7ea8a529a89b2288ull); + String8 debug_h = str8_serial_end(arena, &h); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); + String8 debug_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + + T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); + T_Ok(t_write_entry_obj()); + + String8 output = {0}; + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 is_warning_found = 0; + String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); + String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash count and type count: got 3 hashes for 2 types", LNK_Warning_GHash, debug_obj_path); + for (String8 i = output; i.size > 0 && !is_warning_found; ) { + String8 line = t_chop_line(&i); + is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + } + T_Ok(is_warning_found); +} + +#if 0 +TEST(ghash_basic) +{ + String8 a_obj; + { + String8List t = {0}; str8_serial_begin(arena, &t); + str8_serial_push_u32(arena, &t, CV_Signature_C13); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_STRUCTURE, str8_struct(&(CV_LeafStruct){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_UNION, str8_struct(&(CV_LeafUnion){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_ENUM, str8_struct(&(CV_LeafEnum){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + String8 debug_t = str8_serial_end(arena, &t); + + String8List h = {0}; str8_serial_begin(arena, &h); + str8_serial_push_struct(arena, &h, (&(LLVM_GHash){ .magic = LLVM_GHash_Magic, .hash_alg = LLVM_GHashAlg_BLAKE3, .version = LLVM_GHash_CurrentVersion })); + str8_serial_push_u64(arena, &h, 1); + str8_serial_push_u64(arena, &h, 2); + str8_serial_push_u64(arena, &h, 3); + String8 debug_h = str8_serial_end(arena, &h); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); + a_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + } + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_entry_obj()); + + String8 output = {0}; + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj a.obj"), max_U64, arena, &output); + T_Ok(g_last_exit_code == 0); + + B32 is_warning_found = 0; + String8 a_obj_path = t_make_file_path(arena, str8_lit("a.obj")); + String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash count and type count: got 3 hashes for 2 types", LNK_Warning_GHash, a_obj_path); + for (String8 i = output; i.size > 0 && !is_warning_found; ) { + String8 line = t_chop_line(&i); + is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + } + T_Ok(is_warning_found); +} +#endif + TEST(patch_cv_symbol_tree) { String8List raw_symbols = {0}; From d7cc06f5d5471f9ce83c8563607fd9fb1d228940 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 20 Apr 2026 10:39:12 -0700 Subject: [PATCH 418/850] show top five slow tests in the summary --- run_tests.bat | 3 + src/base/base_strings.c | 4 ++ src/torture/torture.c | 144 ++++++++++++++++++++++++++++++++++++---- src/torture/torture.h | 1 + 4 files changed, 138 insertions(+), 14 deletions(-) diff --git a/run_tests.bat b/run_tests.bat index e736426f..fdc75add 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -19,6 +19,9 @@ for %%c in (%CC_VALUES%) do for %%m in (%MODE_VALUES%) do ( echo -------------------------------------------------------------------------------- echo Build %%c+%%m + rem nuke artifacts from last run + rmdir /s /q build\torture + if "%%c" equ "clang" ( set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;!PATH! ) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 8256648a..bcfe297f 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -2305,6 +2305,10 @@ string_from_elapsed_time(Arena *arena, DateTime dt) str8_list_pushf(scratch.arena, &list, "%uus", dt.micro_sec); } + if (list.node_count == 0) { + str8_list_pushf(scratch.arena, &list, "0"); + } + String8 result = str8_list_join(arena, &list, &(StringJoin){ str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }); scratch_end(scratch); diff --git a/src/torture/torture.c b/src/torture/torture.c index 843dd9e6..fb10e3b5 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -195,6 +195,40 @@ t_cl_path(void) return path; } +internal String8 +t_cl_version(void) +{ + local_persist String8 version; + + if ( ! version.size) { + Temp scratch = scratch_begin(0, 0); + + String8 output = {0}; + t_invoke_(t_cl_path(), str8_zero(), max_U64, scratch.arena, &output); + AssertAlways(g_last_exit_code == 0); + + String8 needle = str8_lit("Version"); + U64 version_lo = str8_find_needle(output, 0, needle, 0); + version_lo += needle.size + 1; + AssertAlways(version_lo < output.size); + + U64 version_hi = str8_find_needle(output, version_lo, str8_lit(" "), 0); + AssertAlways(version_hi < output.size); + + version = str8_substr(output, r1u64(version_lo, version_hi)); + AssertAlways(version.size > 0); + + local_persist U8 buffer[4096]; + ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; + Arena *arena = arena_alloc_(¶ms); + version = str8_copy(arena, version); + + scratch_end(scratch); + } + + return version; +} + internal String8 t_radlink_path(void) { @@ -387,14 +421,26 @@ t_entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0,0); + U64 dashes_size = 9999; + U8 *dashes = push_array(scratch.arena, U8, dashes_size); + MemorySet(dashes, '-', dashes_size); + + U64 dots_size = 9999; + U8 *dots = push_array(scratch.arena, U8, dots_size); + MemorySet(dots, '.', dots_size); + + char *spaces = " "; + +#define PrintHeader(p) fprintf(stderr, "--- %s %.*s\n", p, Max((80-4) - (int)strlen(p), 3), dashes) + // // Handle -help // { B32 print_help = cmd_line_has_flag(cmdline, str8_lit("help")) || cmd_line_has_flag(cmdline, str8_lit("h")); - if (print_help) { - fprintf(stderr, "--- Help -----------------------------------------------------------------------\n"); + if (print_help) { + PrintHeader("Help"); fprintf(stderr, " %s\n\n", BUILD_TITLE_STRING_LITERAL); fprintf(stderr, " Usage: torture [Options] [Files]\n\n"); fprintf(stderr, " Options:\n"); @@ -409,12 +455,37 @@ t_entry_point(CmdLine *cmdline) } } +#if 0 + // + // config + // + { + DateTime start_time_uni = os_now_universal_time(); + DateTime start_time_loc = os_local_time_from_universal(&start_time_uni); + PrintHeader("Config"); + fprintf(stderr, " Build %s\n", BUILD_TITLE_STRING_LITERAL); + fprintf(stderr, " Start %.*s\n", str8_varg(string_from_date_time(scratch.arena, &start_time_loc))); + fprintf(stderr, "\n"); + fprintf(stderr, " Tools\n"); +#if OS_WINDOWS + AssertAlways(t_cl_path().size && t_cl_version().size); + fprintf(stderr, " MSVC %.*s\n", str8_varg(t_cl_version())); + fprintf(stderr, " %.*s\n", str8_varg(t_cl_path())); +#endif + fprintf(stderr, " radlink %.*s\n", str8_varg(t_radlink_version())); + fprintf(stderr, " %.*s\n", str8_varg(t_radlink_path())); + fprintf(stderr, " radbin %.*s\n", str8_varg(t_radbin_version())); + fprintf(stderr, " %.*s\n", str8_varg(t_radbin_path())); + fprintf(stderr, "\n"); + } +#endif + // // Handle -list // { if (cmd_line_has_flag(cmdline, str8_lit("list"))) { - fprintf(stdout, "--- Tests --------------------------------------------------------------------\n"); + PrintHeader("Tests"); for EachIndex(i, g_torture_test_count) { fprintf(stdout, " %s\n", g_torture_tests[i].label); } @@ -422,7 +493,6 @@ t_entry_point(CmdLine *cmdline) } } - // // Handle -linker // @@ -549,27 +619,26 @@ t_entry_point(CmdLine *cmdline) max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[test_idx].group)); } - U64 dots_min = 15; - U64 dots_size = max_label_size+dots_min; - U8 *dots = push_array(scratch.arena, U8, dots_size); - MemorySet(dots, '.', dots_size); - + PrintHeader("Tests"); U64 pass_count = 0; U64 fail_count = 0; U64 crash_count = 0; U64 max_digit_count = count_digits_u64(target_indices_count, 10); U64 total_time_start = os_now_microseconds(); + typedef struct { U64 target_idx, d; } Slowest; + Slowest slowest[5] = {0}; + for EachElement(i, slowest) { slowest[i].target_idx = max_U64; } for EachIndex(i, target_indices_count) { U64 target_idx = target_indices[i]; // print run progress + U64 dots_min = 10; U64 dots_count = (max_label_size - cstring8_length((U8*)g_torture_tests[target_idx].label)) + dots_min; - char *spaces = " "; U64 curr_digit_count = count_digits_u64(i+1, 10); int idx_align_space_count = (int)(max_digit_count - curr_digit_count); fprintf(stdout, "[%.*s%I64u/%I64u] ", idx_align_space_count, spaces, i+1, target_indices_count); - fprintf(stdout, "(%s) %.*s%s", g_torture_tests[target_idx].group, (int)(max_group_size - cstring8_length((U8*)g_torture_tests[target_idx].group)), spaces, g_torture_tests[target_idx].label); - fprintf(stdout, "%.*s", (int)dots_count, dots); + fprintf(stdout, "%s %.*s:: %s", g_torture_tests[target_idx].group, (int)(max_group_size - cstring8_length((U8*)g_torture_tests[target_idx].group)), spaces, g_torture_tests[target_idx].label); + fprintf(stdout, " %.*s ", (int)dots_count, dots); // setup output directory g_wdir = push_str8f(scratch.arena, "%S\\%s", g_out, g_torture_tests[target_idx].label); @@ -607,7 +676,22 @@ t_entry_point(CmdLine *cmdline) U64 d = run_end_time - run_start_time; DateTime t = date_time_from_micro_seconds(d); String8 s = string_from_elapsed_time(scratch.arena, t); - fprintf(stdout, " | %.*s", str8_varg(s)); + fprintf(stdout, " %.*s", str8_varg(s)); + + U64 insert_idx = max_U64; + for EachElement(i, slowest) { + if (d > slowest[i].d) { + insert_idx = i; + break; + } + } + if (insert_idx < ArrayCount(slowest)) { + for (U64 i = ArrayCount(slowest) - 1; i > insert_idx; i -= 1) { + slowest[i] = slowest[i - 1]; + } + slowest[insert_idx].target_idx = target_idx; + slowest[insert_idx].d = d; + } } fprintf(stdout, "\n"); @@ -619,11 +703,43 @@ t_entry_point(CmdLine *cmdline) if (g_stop_on_first_fail_or_crash) { goto exit; } } } + fprintf(stderr, "\n"); U64 total_time_end = os_now_microseconds(); + PrintHeader("Summary"); U64 total_time_dt = total_time_end - total_time_start; String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); - fprintf(stdout, "*** Passed: %I64u, Failed: %I64u, Crashed: %I64u, Time: %.*s***\n", pass_count, fail_count, crash_count, str8_varg(total_time_str)); + fprintf(stderr, " Passed %u\n", (int)pass_count); + fprintf(stderr, " Failed %u\n", (int)fail_count); + fprintf(stderr, " Crashed %u\n", (int)crash_count); + fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); + fprintf(stderr, "\n"); + + { + fprintf(stderr, " Slow Tests\n"); + U64 label_max = 0; + U64 group_max = 0; + for EachElement(i, slowest) { + Slowest s = slowest[i]; + if (s.target_idx >= g_torture_test_count) { break; } + label_max = Max(strlen(g_torture_tests[s.target_idx].label), label_max); + group_max = Max(strlen(g_torture_tests[s.target_idx].group), group_max); + } + + for EachElement(i, slowest) { + Slowest s = slowest[i]; + if (s.target_idx >= g_torture_test_count) { break; } + String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); + fprintf(stderr, " %s %.*s:: %s %.*s %.*s\n", + g_torture_tests[s.target_idx].group, + (int)(group_max - strlen(g_torture_tests[s.target_idx].group)), spaces, + g_torture_tests[s.target_idx].label, + (int)(label_max - strlen(g_torture_tests[s.target_idx].label)) + 4, dots, + str8_varg(elapsed_time)); + } + + fprintf(stderr, "\n"); + } exit:; if (fail_count + crash_count != 0) { diff --git a/src/torture/torture.h b/src/torture/torture.h index d3c2718c..993ad818 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -85,6 +85,7 @@ internal String8 t_radlink_path(void); internal String8 t_cwd_path(void); internal String8 t_src_path(void); +internal B32 t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, String8 *output_out); internal B32 t_invoke(String8 exe, String8 cmdline, U64 timeout); #define t_invoke_cl(f, ...) t_invoke_(t_cl_path(), str8f(scratch.arena, f, ## __VA_ARGS__), max_U64, 0, 0) From d607d6377d0643f1349edc2f20eb1be55abf013c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 20 Apr 2026 11:00:54 -0700 Subject: [PATCH 419/850] build fixes --- src/eval/eval_core.c | 2 +- src/eval/eval_ir.c | 2 +- src/lib_rdi/rdi_parse.c | 16 ++---------- src/linker/lnk_debug_info.c | 15 ++--------- src/linker/rdi/rdi_builder.c | 50 +++++++++++++++--------------------- src/linker/rdi/rdi_builder.h | 7 ++--- src/torture/torture_d2r.c | 7 +++-- 7 files changed, 31 insertions(+), 68 deletions(-) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 0164b02a..656783e3 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -615,7 +615,7 @@ e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff) RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); //- rjf: procedure -> udt - U32 udt_idx = procedure->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Type ? procedure->container_idx : 0; + U32 udt_idx = (procedure->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Type ? procedure->container_idx : 0; RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx); //- rjf: build blank map diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 03e18625..d7563cb3 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -2408,7 +2408,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I U64 vtable_voff = vtable_vaddr - module_base; U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff); RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx); - if(global_var->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Type) + if((global_var->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Type) { RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); diff --git a/src/lib_rdi/rdi_parse.c b/src/lib_rdi/rdi_parse.c index bb977fbf..dd298947 100644 --- a/src/lib_rdi/rdi_parse.c +++ b/src/lib_rdi/rdi_parse.c @@ -769,25 +769,13 @@ rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) RDI_PROC RDI_UDT * rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { - RDI_U64 idx = 0; - if(procedure->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Type) - { - idx = procedure->container_idx; - } - RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, idx); - return udt; + return 0; } RDI_PROC RDI_Scope * rdi_container_scope_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { - RDI_U64 idx = 0; - if(procedure->container_flags & RDI_ContainerFlag_KindMask == RDI_ContainerKind_Scope) - { - idx = procedure->container_idx; - } - RDI_Scope *container_scope = rdi_element_from_name_idx(rdi, Scopes, idx); - return container_scope; + return 0; } RDI_PROC RDI_U64 diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 232d776d..942606ff 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -4001,7 +4001,6 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) // push new node RDIB_Variable *gvar = rdib_variable_chunk_list_push(arena, var_chunk_list, task->symbol_chunk_cap); - gvar->link_flags = symbol.kind == CV_SymKind_GDATA32 ? RDI_LinkFlag_External : 0; gvar->name = name; gvar->link_name = link_name; gvar->type = type; @@ -4035,7 +4034,6 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) RDIB_Variable *tvar = rdib_variable_chunk_list_push(arena, tvar_list, task->symbol_chunk_cap); // fill out thread variable - tvar->link_flags = symbol.kind == CV_SymKind_GTHREAD32 ? RDI_LinkFlag_External : 0; tvar->name = name; tvar->link_name = str8(0,0); tvar->type = type; @@ -4110,7 +4108,6 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) rng1u64_list_push(arena, &root_scope->ranges, virt_range); // fill out procedure - proc->link_flags = symbol.kind == CV_SymKind_GPROC32 ? RDI_LinkFlag_External : 0; proc->name = name; proc->link_name = link_name; proc->type = type; @@ -4213,10 +4210,8 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) String8 name = str8_cstring_capped(regrel32 + 1, symbol.data.str + symbol.data.size); RDIB_Type *type = lnk_type_from_itype(regrel32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - RDI_LocalKind local_kind = RDI_LocalKind_Variable; B32 is_ref = 0; if (scope_stack->regrel32_idx < scope_stack->param_count) { - local_kind = RDI_LocalKind_Parameter; if (type != 0) { U64 byte_size = rdib_size_from_type(type); switch (comp_info.arch) { @@ -4233,9 +4228,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) ++scope_stack->scope->local_count; // fill out local - local->link_flags = 0; local->name = name; - local->kind = local_kind; local->type = type; // encode location @@ -4268,8 +4261,6 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) ++scope_stack->scope->local_count; // fill out local - local->link_flags = 0; - local->kind = sym_local->flags & CV_LocalFlag_Param ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable; local->name = name; local->type = type; @@ -4286,8 +4277,6 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) ++scope_stack->scope->local_count; // fill out local - local->link_flags = 0; - local->kind = RDI_LocalKind_Variable; local->name = name; local->type = type; @@ -4325,7 +4314,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_fprel + 1); U64 gap_count = (symbol.data.size - sizeof(*defrange_fprel)) / sizeof(gaps[0]); - B32 is_local_param = scope_stack->defrange_target->kind == RDI_LocalKind_Parameter; + B32 is_local_param = 0; CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(scope_stack->frameproc, is_local_param); CV_Reg fp_reg = cv_decode_fp_reg(comp_info.arch, encoded_fp_reg); RDI_RegCode fp_reg_rdi = rdi_reg_code_from_cv(comp_info.arch, fp_reg); @@ -4364,7 +4353,7 @@ THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) } CV_SymDefrangeFramepointerRelFullScope *defrange_fprelfs = (CV_SymDefrangeFramepointerRelFullScope *) symbol.data.str; - B32 is_local_param = scope_stack->defrange_target->kind == RDI_LocalKind_Parameter; + B32 is_local_param = 0; //scope_stack->defrange_target->kind == RDI_LocalKind_Parameter; CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(scope_stack->frameproc, is_local_param); CV_Reg fp_reg = cv_decode_fp_reg(comp_info.arch, encoded_fp_reg); RDI_RegCode fp_reg_rdi = rdi_reg_code_from_cv(comp_info.arch, fp_reg); diff --git a/src/linker/rdi/rdi_builder.c b/src/linker/rdi/rdi_builder.c index 0f91a97d..b79e0bcc 100644 --- a/src/linker/rdi/rdi_builder.c +++ b/src/linker/rdi/rdi_builder.c @@ -3866,11 +3866,11 @@ THREAD_POOL_TASK_FUNC(rdib_build_var_section_task) for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { RDIB_VariableChunk *chunk = task->gvars_rdib[chunk_idx]; - RDI_GlobalVariable *vars = push_array_no_zero(arena, RDI_GlobalVariable, chunk->count); + RDI_Symbol *vars = push_array_no_zero(arena, RDI_Symbol, chunk->count); for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Variable *src = &chunk->v[i]; - RDI_GlobalVariable *dst = &vars[i]; + RDIB_Variable *src = &chunk->v[i]; + RDI_Symbol *dst = &vars[i]; // TODO: temporary hack while we don't have bytecode eval in RDI_GlobalVariable U64 voff = 0; @@ -3881,18 +3881,14 @@ THREAD_POOL_TASK_FUNC(rdib_build_var_section_task) } dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); - dst->voff = voff; dst->type_idx = rdib_idx_from_type(src->type); - dst->link_flags = src->link_flags; if (src->container_type != 0) { Assert(!src->container_proc); - dst->link_flags |= RDI_LinkFlag_TypeScoped; dst->container_idx = rdib_idx_from_udt_type(src->container_type); } if (src->container_proc != 0) { Assert(!src->container_type); - dst->link_flags |= RDI_LinkFlag_ProcScoped; dst->container_idx = rdib_idx_from_procedure(src->container_proc); } } @@ -3940,11 +3936,11 @@ THREAD_POOL_TASK_FUNC(rdib_build_tvar_section_task) for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { RDIB_VariableChunk *chunk = task->tvars_rdib[chunk_idx]; - RDI_ThreadVariable *vars = push_array_no_zero(arena, RDI_ThreadVariable, chunk->count); + RDI_Symbol *vars = push_array_no_zero(arena, RDI_Symbol, chunk->count); for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Variable *src = &chunk->v[i]; - RDI_ThreadVariable *dst = &vars[i]; + RDIB_Variable *src = &chunk->v[i]; + RDI_Symbol *dst = &vars[i]; U32 tls_off = 0; if (src->locations.first != 0) { @@ -3954,17 +3950,14 @@ THREAD_POOL_TASK_FUNC(rdib_build_tvar_section_task) } dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); - dst->tls_off = tls_off; dst->type_idx = rdib_idx_from_type(src->type); if (src->container_type != 0) { Assert(!src->container_proc); - dst->link_flags |= RDI_LinkFlag_TypeScoped; dst->container_idx = rdib_idx_from_udt_type(src->container_type); } if (src->container_proc != 0) { Assert(!src->container_type); - dst->link_flags |= RDI_LinkFlag_ProcScoped; dst->container_idx = rdib_idx_from_procedure(src->container_proc); } } @@ -4012,27 +4005,24 @@ THREAD_POOL_TASK_FUNC(rdib_build_procs_section_task) for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { RDIB_ProcedureChunk *chunk = task->procs_rdib[chunk_idx]; - RDI_Procedure *procs = push_array_no_zero(arena, RDI_Procedure, chunk->count); + RDI_Symbol *procs = push_array_no_zero(arena, RDI_Symbol, chunk->count); for (U64 i = 0; i < chunk->count; ++i) { RDIB_Procedure *src = &chunk->v[i]; - RDI_Procedure *dst = &procs[i]; + RDI_Symbol *dst = &procs[i]; dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); dst->link_name_string_idx = rdib_idx_from_string_map(task->string_map, src->link_name); - dst->link_flags = src->link_flags; dst->type_idx = rdib_idx_from_type(src->type); dst->root_scope_idx = rdib_idx_from_scope(src->scope); if (src->container_type != 0) { AssertAlways(!src->container_proc); - dst->link_flags |= RDI_LinkFlag_TypeScoped; dst->container_idx = rdib_idx_from_udt_type(src->container_type); } if (src->container_proc != 0) { AssertAlways(!src->container_type); - dst->link_flags |= RDI_LinkFlag_ProcScoped; dst->container_idx = rdib_idx_from_procedure(0); Assert(!"TODO"); // src->container_proc } } @@ -4094,11 +4084,11 @@ THREAD_POOL_TASK_FUNC(rdib_count_scopes_task) task->loc_data_sizes[task_id] += loc_n->v.bytecode.size + /* stream ender: */ 1; } break; case RDI_LocationKind_ValReg: { - task->loc_data_sizes[task_id] += sizeof(RDI_LocationReg); + //task->loc_data_sizes[task_id] += sizeof(RDI_LocationReg); } break; case RDI_LocationKind_AddrRegPlusU16: case RDI_LocationKind_AddrAddrRegPlusU16: { - task->loc_data_sizes[task_id] += sizeof(RDI_LocationRegPlusU16); + //task->loc_data_sizes[task_id] += sizeof(RDI_LocationRegPlusU16); } break; default: InvalidPath; } @@ -4115,6 +4105,7 @@ THREAD_POOL_TASK_FUNC(rdib_count_scopes_task) internal THREAD_POOL_TASK_FUNC(rdib_build_scopes_task) { +#if 0 RDIB_BuildSymbolSectionTask *task = raw_task; ProfBeginDynamic("Scopes [Chunk Count: %llu]", task->ranges[task_id].max - task->ranges[task_id].min); @@ -4126,7 +4117,7 @@ THREAD_POOL_TASK_FUNC(rdib_build_scopes_task) // local fill info U64 local_cursor = task->local_offsets[task_id]; U64 local_max = task->local_offsets[task_id] + task->local_counts[task_id]; - RDI_Local *locals = task->locals_rdi; + RDI_Symbol *locals = task->locals_rdi; // location data fill info U64 loc_data_max = task->loc_data_offsets[task_id] + task->loc_data_sizes[task_id]; @@ -4136,7 +4127,7 @@ THREAD_POOL_TASK_FUNC(rdib_build_scopes_task) // location block fill info U64 loc_block_cursor = task->loc_block_offsets[task_id]; U64 loc_block_max = task->loc_block_offsets[task_id] + task->loc_block_counts[task_id]; - RDI_LocationBlock *loc_blocks = task->loc_blocks_rdi; + void *loc_blocks = task->loc_blocks_rdi; for (U64 ichunk = task->ranges[task_id].min; ichunk < task->ranges[task_id].max; ++ichunk) { RDIB_ScopeChunk *chunk = task->scopes_rdib[ichunk]; @@ -4258,6 +4249,7 @@ THREAD_POOL_TASK_FUNC(rdib_build_scopes_task) Assert(loc_data_cursor == loc_data_max); ProfEnd(); +#endif } internal void @@ -4299,8 +4291,8 @@ rdib_data_sections_from_scopes(TP_Context *tp, ProfBegin("Push"); task.scope_voffs_rdi = push_array_no_zero(arena->v[0], U64, total_scope_voff_count); task.scopes_rdi = push_array_no_zero(arena->v[0], RDI_Scope, total_scope_count ); - task.locals_rdi = push_array_no_zero(arena->v[0], RDI_Local, total_local_count ); - task.loc_blocks_rdi = push_array_no_zero(arena->v[0], RDI_LocationBlock, total_loc_block_count ); + //task.locals_rdi = push_array_no_zero(arena->v[0], RDI_Local, total_local_count ); + //task.loc_blocks_rdi = push_array_no_zero(arena->v[0], RDI_LocationBlock, total_loc_block_count ); task.loc_data_rdi = push_array_no_zero(arena->v[0], U8, total_loc_data_size ); ProfEnd(); @@ -4309,14 +4301,14 @@ rdib_data_sections_from_scopes(TP_Context *tp, RDIB_DataSection scopes_sect = { .tag = RDI_SectionKind_Scopes }; RDIB_DataSection scope_voffs_sect = { .tag = RDI_SectionKind_ScopeVOffData }; - RDIB_DataSection locals_sect = { .tag = RDI_SectionKind_Locals }; - RDIB_DataSection loc_blocks_sect = { .tag = RDI_SectionKind_LocationBlocks }; - RDIB_DataSection loc_data_sect = { .tag = RDI_SectionKind_LocationData }; + RDIB_DataSection locals_sect = { .tag = RDI_SectionKind_NULL }; + RDIB_DataSection loc_blocks_sect = { .tag = RDI_SectionKind_NULL }; + RDIB_DataSection loc_data_sect = { .tag = RDI_SectionKind_NULL }; str8_list_push(arena->v[0], &scopes_sect.data, str8_array(task.scopes_rdi, total_scope_count )); str8_list_push(arena->v[0], &scope_voffs_sect.data, str8_array(task.scope_voffs_rdi, total_scope_voff_count)); str8_list_push(arena->v[0], &locals_sect.data, str8_array(task.locals_rdi, total_local_count )); - str8_list_push(arena->v[0], &loc_blocks_sect.data, str8_array(task.loc_blocks_rdi, total_loc_block_count )); + //str8_list_push(arena->v[0], &loc_blocks_sect.data, str8_array(task.loc_blocks_rdi, total_loc_block_count )); str8_list_push(arena->v[0], &loc_data_sect.data, str8_array(task.loc_data_rdi, total_loc_data_size )); rdib_data_section_list_push(arena->v[0], sect_list, scopes_sect ); @@ -4998,12 +4990,10 @@ rdib_init_input(Arena *arena) null_proc->scope = null_scope; // Global Var - null_gvar->link_flags = RDI_LinkFlag_External; null_gvar->type = null_type; null_gvar->locations = null_loc_list; // Thread Var - null_tvar->link_flags = RDI_LinkFlag_External; null_tvar->type = null_type; null_tvar->locations = null_loc_list; diff --git a/src/linker/rdi/rdi_builder.h b/src/linker/rdi/rdi_builder.h index fa529f71..38379683 100644 --- a/src/linker/rdi/rdi_builder.h +++ b/src/linker/rdi/rdi_builder.h @@ -78,10 +78,8 @@ typedef struct RDIB_LocationList typedef struct RDIB_Variable { - RDI_LinkFlags link_flags; String8 name; String8 link_name; - RDI_LocalKind kind; struct RDIB_Type *type; struct RDIB_Type *container_type; struct RDIB_Procedure *container_proc; @@ -211,7 +209,6 @@ typedef struct RDIB_SourceFileChunkList typedef struct RDIB_Procedure { - RDI_LinkFlags link_flags; String8 name; String8 link_name; struct RDIB_Type *type; @@ -896,8 +893,8 @@ typedef struct U64 *loc_data_offsets; U64 *scope_voffs_rdi; RDI_Scope *scopes_rdi; - RDI_Local *locals_rdi; - RDI_LocationBlock *loc_blocks_rdi; + RDI_Symbol *locals_rdi; + void *loc_blocks_rdi; U8 *loc_data_rdi; }; }; diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index eadda433..2cc85513 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -468,9 +468,8 @@ TEST(d2r_general) RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); - RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, "FooBar"); + RDI_Symbol *proc = rdi_procedure_from_name_cstr(rdi, "FooBar"); T_Ok(proc); - T_Ok(proc->link_flags == RDI_LinkFlag_External); String8 proc_name = str8_from_rdi_string_idx(rdi, proc->name_string_idx); T_Ok(str8_match(proc_name, str8_lit("FooBar"), 0)); @@ -478,9 +477,9 @@ TEST(d2r_general) T_Ok(root_scope); T_Ok(root_scope->local_count == 1); - RDI_Local *test_local = rdi_element_from_name_idx(rdi, Locals, root_scope->local_first + 0); + RDI_Symbol *test_local = rdi_element_from_name_idx(rdi, LocalVariables, root_scope->local_first + 0); T_Ok(test_local); - T_Ok(test_local->kind == RDI_LocalKind_Variable); + T_Ok(test_local->symbol_flags & RDI_SymbolFlag_IsParam); String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); T_Ok(str8_match(test_local_name, str8_lit("TestLocal"), 0)); From 01682dee0737cfc3e7e5e3d78ee212368b6000d5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 20 Apr 2026 11:12:11 -0700 Subject: [PATCH 420/850] bump to 26 --- src/base/base_context_cracking.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index f584c551..b3e979c0 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -159,7 +159,7 @@ #endif #if !defined(BUILD_VERSION_PATCH) -# define BUILD_VERSION_PATCH 25 +# define BUILD_VERSION_PATCH 26 #endif #define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) From e4bd6d5029f469b212fb944ee50cd0cd229bf80d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 20 Apr 2026 11:35:04 -0700 Subject: [PATCH 421/850] revert commit that deleted container-from-procedure APIs for whatever reason --- src/lib_rdi/rdi_parse.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/lib_rdi/rdi_parse.c b/src/lib_rdi/rdi_parse.c index dd298947..375a07fb 100644 --- a/src/lib_rdi/rdi_parse.c +++ b/src/lib_rdi/rdi_parse.c @@ -769,13 +769,25 @@ rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) RDI_PROC RDI_UDT * rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { - return 0; + RDI_U64 idx = 0; + if((procedure->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Type) + { + idx = procedure->container_idx; + } + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, idx); + return udt; } RDI_PROC RDI_Scope * rdi_container_scope_from_procedure(RDI_Parsed *rdi, RDI_Symbol *procedure) { - return 0; + RDI_U64 idx = 0; + if((procedure->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Scope) + { + idx = procedure->container_idx; + } + RDI_Scope *container_scope = rdi_element_from_name_idx(rdi, Scopes, idx); + return container_scope; } RDI_PROC RDI_U64 From e8e9ad204a63c1902d12db012157fe9a61ca7c2c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 20 Apr 2026 13:53:50 -0700 Subject: [PATCH 422/850] further pdb namespaces progress; fix compile-only output for /o MSVC deprecation --- build.bat | 6 +- src/lib_rdi_make/rdi_make.h | 3 + src/rdi/rdi_local.c | 14 +- src/rdi_from_pdb/rdi_from_pdb.c | 474 +++++++++++++++++++++++++++----- src/rdi_make/rdi_make_local.c | 17 ++ 5 files changed, 441 insertions(+), 73 deletions(-) diff --git a/build.bat b/build.bat index 052085c8..7aead3f9 100644 --- a/build.bat +++ b/build.bat @@ -73,12 +73,14 @@ set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_fl set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" /noexp /nocoffgrpinfo /opt:ref /opt:icf set cl_out= /out: +set cl_obj_out= /Fo: set cl_linker= set clang_common= -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -mcx16 -msha set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:noicf set clang_out= -o +set clang_obj_out= -o set clang_linker= -Xlinker :: --- Per-Build Settings ----------------------------------------------------- @@ -101,10 +103,12 @@ if "%msvc%"=="1" set compile_debug=%cl_debug% if "%msvc%"=="1" set compile_release=%cl_release% if "%msvc%"=="1" set compile_link=%cl_link% if "%msvc%"=="1" set out=%cl_out% +if "%msvc%"=="1" set obj_out=%cl_obj_out% if "%clang%"=="1" set compile_debug=%clang_debug% if "%clang%"=="1" set compile_release=%clang_release% if "%clang%"=="1" set compile_link=%clang_link% if "%clang%"=="1" set out=%clang_out% +if "%clang%"=="1" set obj_out=%clang_obj_out% if "%debug%"=="1" set compile=%compile_debug% if "%release%"=="1" set compile=%compile_release% @@ -146,7 +150,7 @@ if "%convertperf%"=="1" set didbuild=1 && %compile% ..\src\scratc if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\debugstringperf.c %compile_link% %out%debugstringperf.exe || exit /b 1 if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% %out%parse_inline_sites.exe || exit /b 1 if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_lib_debug\strip_lib_debug.c %compile_link% %out%strip_lib_debug.exe || exit /b 1 -if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 +if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp %obj_out%mule_inline.obj && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp %obj_out%mule_o2.obj && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %link_dll% %out%mule_module.dll || exit /b 1 if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% %out%torture.exe || exit /b1 diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index d59cd929..214599e9 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -765,6 +765,9 @@ struct RDIM_UDT RDIM_SrcFile *src_file; RDI_U32 line; RDI_U32 col; + struct RDIM_Scope *container_scope; + RDIM_Namespace *container_namespace; + RDIM_Type *container_type; }; typedef struct RDIM_UDTChunkNode RDIM_UDTChunkNode; diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index c76067a9..75309bc4 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -828,6 +828,18 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse dumpf("\n // udt[%I64u]\n {\n", idx); dumpf(" self_type: %u\n", udt->self_type_idx); dumpf(" flags: `%S`\n", rdi_string_from_udt_flags(scratch.arena, udt->flags)); + if(udt->container_idx != 0 && (udt->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Type) + { + dumpf(" container_type_idx: %u\n", udt->container_idx); + } + if(udt->container_idx != 0 && (udt->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Scope) + { + dumpf(" container_scope_idx: %u\n", udt->container_idx); + } + if(udt->container_idx != 0 && (udt->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Namespace) + { + dumpf(" container_namespace_idx: %u\n", udt->container_idx); + } if(udt->file_idx != 0) { dumpf(" loc: {file: %u, line: %u, col: %u}\n", udt->file_idx, udt->line, udt->col); @@ -1264,7 +1276,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse container_kind_name = str8_lit("container_scope_idx"); }break; } - dumpf("\n '%S': {%S: %I64u} // namespaces[%I64u]", str8_from_rdi_string_idx(rdi, ns->name_string_idx), container_kind_name, ns->container_idx, idx); + dumpf("\n '%S': {%S: %u} // namespaces[%I64u]", str8_from_rdi_string_idx(rdi, ns->name_string_idx), container_kind_name, ns->container_idx, idx); } if(lane_idx() == lane_count()-1) { dumpf("\n"); } } diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 61a8e2af..5089378b 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -19,16 +19,17 @@ p2r_end_of_cplusplus_container_name(String8 str) U64 result = 0; if(str.size >= 2) { - for(U64 i = str.size; i >= 2; i -= 1) + String8 str_before_templates = str8_prefix(str, str8_find_needle(str, 0, str8_lit("<"), 0)); + for(U64 i = str_before_templates.size; i >= 2; i -= 1) { - if(str.str[i - 2] == ':' && str.str[i - 1] == ':') + if(str_before_templates.str[i - 2] == ':' && str_before_templates.str[i - 1] == ':') { result = i; break; } } } - return(result); + return result; } internal U64 @@ -2022,10 +2023,13 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { NamespaceNode *next; String8 string; + B32 corresponds_to_scope; RDIM_Scope *scope; + RDIM_Type *type; + RDIM_Namespace *ns; }; - NamespaceNode **all_type_namespace_slots = 0; - U64 all_type_namespace_slots_count = 0; + NamespaceNode **all_namespace_slots = 0; + U64 all_namespace_slots_count = 0; ProfScope("gather all unique namespaces from types") { Temp scratch2 = scratch_begin(&scratch.arena, 1); @@ -2156,8 +2160,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: combine if(lane_idx() == 0) { - all_type_namespace_slots_count = *total_namespace_count_ptr / 3; - all_type_namespace_slots = push_array(scratch.arena, NamespaceNode *, all_type_namespace_slots_count); + all_namespace_slots_count = *total_namespace_count_ptr / 3; + all_namespace_slots = push_array(scratch.arena, NamespaceNode *, all_namespace_slots_count); for EachIndex(l_idx, lane_count()) { LaneNamespaceTable *tbl = &lane_namespace_tables[l_idx]; @@ -2166,9 +2170,9 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) for(String8Node *n = tbl->slots[slot_idx]; n != 0; n = n->next) { U64 hash = u64_hash_from_str8(n->string); - U64 dst_slot_idx = hash%all_type_namespace_slots_count; + U64 dst_slot_idx = hash%all_namespace_slots_count; B32 already_exists = 0; - for(NamespaceNode *dst_n = all_type_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) + for(NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) { if(str8_match(dst_n->string, n->string, 0)) { @@ -2180,14 +2184,14 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { NamespaceNode *dst_n = push_array(scratch.arena, NamespaceNode, 1); dst_n->string = n->string; - SLLStackPush(all_type_namespace_slots[dst_slot_idx], dst_n); + SLLStackPush(all_namespace_slots[dst_slot_idx], dst_n); } } } } } - lane_sync_u64(&all_type_namespace_slots_count, 0); - lane_sync_u64(&all_type_namespace_slots, 0); + lane_sync_u64(&all_namespace_slots_count, 0); + lane_sync_u64(&all_namespace_slots, 0); } scratch_end(scratch2); } @@ -2764,6 +2768,282 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync_u64(&all_types__pre_typedefs_ptr, 0); all_types__pre_typedefs = *all_types__pre_typedefs_ptr; + ////////////////////////////////////////////////////////////// + //- rjf: upgrade namespace nodes with type info, if they match a type + // + ProfScope("upgrade namespace nodes with type info, if they match a type") + { +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + Rng1U64 range = lane_range(all_namespace_slots_count); + for EachInRange(slot_idx, range) + { + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + String8 container_string = n->string; + CV_TypeId container_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_string, 0); + if(container_type_id != 0) + { + n->type = p2r_type_ptr_from_itype(container_type_id); + } + } + } +#undef p2r_type_ptr_from_itype + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: set bit in all namespace nodes that correspond to scopes + // + if(params->subset_flags & (RDIM_SubsetFlag_Procedures| + RDIM_SubsetFlag_GlobalVariables| + RDIM_SubsetFlag_ThreadVariables| + RDIM_SubsetFlag_Scopes| + RDIM_SubsetFlag_Locals| + RDIM_SubsetFlag_GlobalVariableNameMap| + RDIM_SubsetFlag_ThreadVariableNameMap| + RDIM_SubsetFlag_ProcedureNameMap| + RDIM_SubsetFlag_ConstantNameMap| + RDIM_SubsetFlag_LinkNameProcedureNameMap| + RDIM_SubsetFlag_Types)) + ProfScope("determine which namespace nodes correspond to scopes") + { + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + for(;;) + { + U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(sym_idx >= all_syms_count) + { + break; + } + CV_SymParsed *sym = all_syms[sym_idx]; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + String8 name = str8_cstring_capped(proc32+1, iter.opl); + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%all_namespace_slots_count; + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, name, 0)) + { + ins_atomic_u32_eval_assign(&n->corresponds_to_scope, 1); + break; + } + } + }break; + } + } + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: gather all namespaces which are only encoded in symbols (not found in types) + // + if(params->subset_flags & (RDIM_SubsetFlag_Procedures| + RDIM_SubsetFlag_GlobalVariables| + RDIM_SubsetFlag_ThreadVariables| + RDIM_SubsetFlag_Scopes| + RDIM_SubsetFlag_Locals| + RDIM_SubsetFlag_GlobalVariableNameMap| + RDIM_SubsetFlag_ThreadVariableNameMap| + RDIM_SubsetFlag_ProcedureNameMap| + RDIM_SubsetFlag_ConstantNameMap| + RDIM_SubsetFlag_LinkNameProcedureNameMap| + RDIM_SubsetFlag_Types)) + ProfScope("gather all namespaces which are only encoded in symbols (not found in types)") + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 lane_namespace_slots_count = 4096; + String8Node **lane_namespace_slots = push_array(scratch2.arena, String8Node *, lane_namespace_slots_count); + + //- rjf: gather from syms + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch2.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + for(;;) + { + U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(sym_idx >= all_syms_count) + { + break; + } + CV_SymParsed *sym = all_syms[sym_idx]; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + // rjf: get global symbol name + String8 symbol_name = {0}; + switch(iter.kind) + { + default:{}break; + case CV_SymKind_GDATA32: + { + CV_SymData32 *data32 = (CV_SymData32 *)iter.struct_base; + symbol_name = str8_cstring_capped(data32+1, iter.opl); + }break; + case CV_SymKind_GPROC32: + { + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + symbol_name = str8_cstring_capped(proc32+1, iter.opl); + }break; + case CV_SymKind_GTHREAD32: + { + CV_SymThread32 *thread32 = (CV_SymThread32 *)iter.struct_base; + symbol_name = str8_cstring_capped(thread32+1, iter.opl); + }break; + } + + // rjf: symbol name -> container name + String8 container_name = str8_chop(str8_prefix(symbol_name, p2r_end_of_cplusplus_container_name(symbol_name)), 2); + U64 container_name_hash = u64_hash_from_str8(container_name); + + // rjf: first, check if this container already showed up from type info + B32 already_exists = 0; + if(!already_exists) + { + U64 slot_idx = container_name_hash%all_namespace_slots_count; + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, container_name, 0)) + { + already_exists = 1; + break; + } + } + } + + // rjf: next, check if we've already gathered this namespace for this lane + if(!already_exists) + { + U64 slot_idx = container_name_hash%lane_namespace_slots_count; + for(String8Node *n = lane_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, container_name, 0)) + { + already_exists = 1; + break; + } + } + } + + // rjf: if we didn't find this namespace in either those from types, or already found in this lane, then gather + if(!already_exists) + { + U64 slot_idx = container_name_hash%lane_namespace_slots_count; + String8Node *n = push_array(scratch2.arena, String8Node, 1); + SLLStackPush(lane_namespace_slots[slot_idx], n); + n->string = container_name; + } + } + } + lane_sync(); + + //- rjf: combine + fold into the all_namespaces table + { + // rjf: gather lane maps + typedef struct LaneNamespaceTable LaneNamespaceTable; + struct LaneNamespaceTable + { + String8Node **slots; + U64 slots_count; + }; + LaneNamespaceTable *lane_namespace_tables = 0; + if(lane_idx() == 0) + { + lane_namespace_tables = push_array(scratch2.arena, LaneNamespaceTable, lane_count()); + } + lane_sync_u64(&lane_namespace_tables, 0); + lane_namespace_tables[lane_idx()].slots = lane_namespace_slots; + lane_namespace_tables[lane_idx()].slots_count = lane_namespace_slots_count; + lane_sync(); + + // rjf: combine + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + LaneNamespaceTable *tbl = &lane_namespace_tables[l_idx]; + for EachIndex(slot_idx, tbl->slots_count) + { + for(String8Node *n = tbl->slots[slot_idx]; n != 0; n = n->next) + { + U64 hash = u64_hash_from_str8(n->string); + U64 dst_slot_idx = hash%all_namespace_slots_count; + B32 already_exists = 0; + for(NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) + { + if(str8_match(dst_n->string, n->string, 0)) + { + already_exists = 1; + break; + } + } + if(!already_exists) + { + NamespaceNode *dst_n = push_array(scratch.arena, NamespaceNode, 1); + dst_n->string = n->string; + SLLStackPush(all_namespace_slots[dst_slot_idx], dst_n); + } + } + } + } + } + } + lane_sync(); + scratch_end(scratch2); + } + + ////////////////////////////////////////////////////////////// + //- rjf: build namespaces, that are not scopes, nor types + // + RDIM_NamespaceChunkList all_namespaces = {0}; + { + // rjf: gather all per-lane namespaces + RDIM_NamespaceChunkList lane_namespaces = {0}; + Rng1U64 range = lane_range(all_namespace_slots_count); + for EachInRange(slot_idx, range) + { + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + raddbg_log("%S%s\n", n->string, n->corresponds_to_scope ? " (is scope)" : n->type != 0 ? " (is type)" : ""); + if(n->corresponds_to_scope || n->scope != 0 || n->type != 0) { continue; } + String8 string = n->string; + RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 32); + ns->name = string; + n->ns = ns; + } + } + + // rjf: combine all per-lane namespaces + RDIM_NamespaceChunkList *lanes_namespaces = 0; + if(lane_idx() == 0) + { + lanes_namespaces = push_array(scratch.arena, RDIM_NamespaceChunkList, lane_count()); + } + lane_sync_u64(&lanes_namespaces, 0); + lanes_namespaces[lane_idx()] = lane_namespaces; + lane_sync(); + + // rjf: join all per-lane namespaces + RDIM_NamespaceChunkList *all_namespaces_ptr = &all_namespaces; + lane_sync_u64(&all_namespaces_ptr, 0); + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + rdim_namespace_chunk_list_concat_in_place(all_namespaces_ptr, &lanes_namespaces[l_idx]); + } + } + lane_sync(); + all_namespaces = *all_namespaces_ptr; + } + lane_sync(); + ////////////////////////////////////////////////////////////// //- rjf: convert symbols from all units // @@ -2985,29 +3265,50 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); // rjf: unpack global's container type + B32 got_container = 0; RDIM_Type *container_type = 0; U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) + String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); + if(!got_container && container_name.size != 0) { - String8 container_name = str8(name.str, container_name_opl - 2); CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); container_type = p2r_type_ptr_from_itype(cv_type_id); + got_container = (container_type != 0); } // rjf: unpack global's container scope RDIM_Scope *container_scope = 0; - if(container_type == 0 && top_scope_node != 0 && iter.kind == CV_SymKind_LDATA32) + if(!got_container && top_scope_node != 0 && iter.kind == CV_SymKind_LDATA32) { container_scope = top_scope_node->scope; + got_container = (container_scope != 0); + } + + // rjf: unpack global's container namespace + RDIM_Namespace *container_namespace = 0; + if(!got_container && container_name.size != 0) + { + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(container_name, n->string, 0) && + n->ns != 0) + { + container_namespace = n->ns; + break; + } + } } // rjf: build symbol RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_global_variables, sym_global_variables_chunk_cap); - symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); - symbol->name = name; - symbol->type = type; - symbol->container_scope = container_scope; - symbol->container_type = container_type; + symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); + symbol->name = name; + symbol->type = type; + symbol->container_scope = container_scope; + symbol->container_type = container_type; + symbol->container_namespace = container_namespace; RDIM_Location loc = {.kind = RDI_LocationKind_ModuleOff, .offset = voff}; RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; rdim_location_case_list_push(arena, &symbol->location_cases, loc, range); @@ -3043,20 +3344,40 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); // rjf: unpack proc's container type + B32 got_container = 0; RDIM_Type *container_type = 0; U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2 && tpi_hash != 0 && tpi_leaf != 0) + String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); + if(!got_container && container_name.size != 0 && tpi_hash != 0 && tpi_leaf != 0) { - String8 container_name = str8(name.str, container_name_opl - 2); CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); container_type = p2r_type_ptr_from_itype(cv_type_id); + got_container = (container_type != 0); } // rjf: unpack proc's container scope RDIM_Scope *container_scope = 0; - if(container_type == 0 && top_scope_node != 0) + if(!got_container && top_scope_node != 0) { container_scope = top_scope_node->scope; + got_container = 1; + } + + // rjf: unpack proc's container namespace + RDIM_Namespace *container_namespace = 0; + if(!got_container && container_name.size != 0) + { + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(container_name, n->string, 0) && + n->ns != 0) + { + container_namespace = n->ns; + break; + } + } } // rjf: build procedure's root scope @@ -3130,8 +3451,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(procedure_root_scope != 0) { U64 hash = u64_hash_from_str8(name); - U64 slot_idx = hash%all_type_namespace_slots_count; - for(NamespaceNode *n = all_type_namespace_slots[slot_idx]; n != 0; n = n->next) + U64 slot_idx = hash%all_namespace_slots_count; + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { if(str8_match(n->string, name, 0)) { @@ -3714,8 +4035,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) for(ScopeNamespaceNode *scope_n = scopes_that_are_namespaces->first; scope_n != 0; scope_n = scope_n->next) { U64 hash = u64_hash_from_str8(scope_n->string); - U64 slot_idx = hash%all_type_namespace_slots_count; - for(NamespaceNode *n = all_type_namespace_slots[slot_idx]; n != 0; n = n->next) + U64 slot_idx = hash%all_namespace_slots_count; + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { n->scope = scope_n->scope; } @@ -3724,50 +4045,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } lane_sync(); - ////////////////////////////////////////////////////////////// - //- rjf: build namespaces, that are not scopes, nor types - // - RDIM_NamespaceChunkList all_namespaces = {0}; - { - // rjf: gather all per-lane namespaces - RDIM_NamespaceChunkList lane_namespaces = {0}; - Rng1U64 range = lane_range(all_type_namespace_slots_count); - for EachInRange(slot_idx, range) - { - for(NamespaceNode *n = all_type_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(n->scope != 0) { continue; } - String8 string = n->string; - RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 32); - ns->name = string; - } - } - - // rjf: combine all per-lane namespaces - RDIM_NamespaceChunkList *lanes_namespaces = 0; - if(lane_idx() == 0) - { - lanes_namespaces = push_array(scratch.arena, RDIM_NamespaceChunkList, lane_count()); - } - lane_sync_u64(&lanes_namespaces, 0); - lanes_namespaces[lane_idx()] = lane_namespaces; - lane_sync(); - - // rjf: join all per-lane namespaces - RDIM_NamespaceChunkList *all_namespaces_ptr = &all_namespaces; - lane_sync_u64(&all_namespaces_ptr, 0); - if(lane_idx() == 0) - { - for EachIndex(l_idx, lane_count()) - { - rdim_namespace_chunk_list_concat_in_place(all_namespaces_ptr, &lanes_namespaces[l_idx]); - } - } - lane_sync(); - all_namespaces = *all_namespaces_ptr; - } - lane_sync(); - ////////////////////////////////////////////////////////////// //- rjf: join extra types from units // @@ -3832,6 +4109,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } //- rjf: build UDT + String8 udt_name = {0}; CV_TypeId field_itype = 0; switch(kind) { @@ -3849,6 +4127,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) break; } field_itype = lf->field_itype; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); }goto equip_members; case CV_LeafKind_UNION: { @@ -3858,6 +4140,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) break; } field_itype = lf->field_itype; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); }goto equip_members; case CV_LeafKind_CLASS2: case CV_LeafKind_STRUCT2: @@ -3867,6 +4153,10 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { break; } + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); field_itype = lf->field_itype; }goto equip_members; equip_members: @@ -4286,6 +4576,8 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { break; } + U8 *name_ptr = (U8 *)(lf + 1); + udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); field_itype = lf->field_itype; }goto equip_enum_vals; equip_enum_vals:; @@ -4424,6 +4716,46 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) scratch_end(scratch); }break; } + + //- rjf: find container, given name's namespaces + if(dst_type != 0 && dst_type->udt != 0 && udt_name.size != 0) + { + // rjf: unpack fully qualified namespace from udt name + String8 container_name = str8_chop(str8_prefix(udt_name, p2r_end_of_cplusplus_container_name(udt_name)), 2); + + // rjf: look up namespace node associated with namespace + NamespaceNode *ns_node = 0; + { + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, container_name, 0)) + { + ns_node = n; + break; + } + } + } + + // rjf: equip container info to udt + if(ns_node != 0) + { + RDIM_UDT *udt = dst_type->udt; + if(ns_node->scope != 0) + { + udt->container_scope = ns_node->scope; + } + else if(ns_node->ns != 0) + { + udt->container_namespace = ns_node->ns; + } + else if(ns_node->type != 0) + { + udt->container_type = ns_node->type; + } + } + } } } diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 6db2ea93..db504bcc 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2713,6 +2713,23 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst_udt->line = src_udt->line; dst_udt->col = src_udt->col; + //- rjf: fill container info + if(src_udt->container_scope != 0) + { + dst_udt->container_flags |= (RDI_ContainerKind_Scope & RDI_ContainerFlag_KindMask); + dst_udt->container_idx = (RDI_U32)rdim_idx_from_scope(src_udt->container_scope); // TODO(rjf): @u64_to_u32 + } + else if(src_udt->container_namespace != 0) + { + dst_udt->container_flags |= (RDI_ContainerKind_Namespace & RDI_ContainerFlag_KindMask); + dst_udt->container_idx = (RDI_U32)rdim_idx_from_namespace(src_udt->container_namespace); // TODO(rjf): @u64_to_u32 + } + else if(src_udt->container_type != 0) + { + dst_udt->container_flags |= (RDI_ContainerKind_Type & RDI_ContainerFlag_KindMask); + dst_udt->container_idx = (RDI_U32)rdim_idx_from_udt(src_udt->container_type->udt); // TODO(rjf): @u64_to_u32 + } + //- rjf: fill member info if(src_udt->first_member != 0) { From 52875a2d93f2292e33a308f9ebaed8d32b7f064f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 20 Apr 2026 13:15:07 -0700 Subject: [PATCH 423/850] fix regression in RDI make local --- src/rdi_make/rdi_make_local.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index db504bcc..e641be7c 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3313,6 +3313,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 dst->link_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->link_name); + if (src->is_param) + { + dst->symbol_flags |= RDI_SymbolFlag_IsParam; + } // rjf: fill container info if(src->is_extern) From 43c3d5e348ce4772da6e283719fcef7e63d56ae5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 20 Apr 2026 13:19:34 -0700 Subject: [PATCH 424/850] test param flag --- src/rdi_from_dwarf/rdi_from_dwarf.c | 57 ++++++++++------------ src/rdi_from_dwarf/rdi_from_dwarf.h | 4 +- src/torture/torture_d2r.c | 75 ++++++++++++++++++++--------- 3 files changed, 80 insertions(+), 56 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 09f79400..72d937a4 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2296,13 +2296,13 @@ d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 imag internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, - RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, Arch arch, - DW_TagNode *root) + DW_TagNode *root, + RDIM_Unit *unit_rdi) { Temp scratch = scratch_begin(&arena, 1); for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { @@ -2373,11 +2373,11 @@ d2r_convert_symbols(Arena *arena, String8 frame_base_expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_FrameBase); // get proc container symbol - RDIM_Symbol *proc = rdim_symbol_chunk_list_push(arena, &g_d2r_shared.procs, D2R_PROC_CHUNK_CAP); + RDIM_Symbol *proc = rdim_symbol_chunk_list_push(arena, &unit_rdi->procedures, D2R_PROC_CHUNK_CAP); // make scope Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - RDIM_Scope *root_scope = d2r_push_scope(arena, &g_d2r_shared.scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); + RDIM_Scope *root_scope = d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); root_scope->symbol = proc; // fill out proc @@ -2388,7 +2388,7 @@ d2r_convert_symbols(Arena *arena, proc->container_scope = 0; proc->container_type = container_type; proc->root_scope = root_scope; - proc->location_cases = d2r_locset_from_attrib(arena, &g_d2r_shared.scopes, root_scope, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); + proc->location_cases = d2r_locset_from_attrib(arena, &unit_rdi->scopes, root_scope, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); // sub program with user-defined parent tag is a method DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); @@ -2456,7 +2456,7 @@ d2r_convert_symbols(Arena *arena, // make scope Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - RDIM_Scope *root_scope = d2r_push_scope(arena, &g_d2r_shared.scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); + RDIM_Scope *root_scope = d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); root_scope->inline_site = inline_site; } break; case DW_TagKind_Variable: { @@ -2471,7 +2471,7 @@ d2r_convert_symbols(Arena *arena, RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); local->name = name; local->type = type; - local->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, input, cu, image_base, arch, tag); + local->location_cases = d2r_var_locset_from_tag(arena, &unit_rdi->scopes, scope, input, cu, image_base, arch, tag); } else { // NOTE: due to a bug in clang in stb_sprintf.h local variables @@ -2534,7 +2534,7 @@ d2r_convert_symbols(Arena *arena, param->is_param = 1; param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - param->location_cases = d2r_var_locset_from_tag(arena, &g_d2r_shared.scopes, scope, input, cu, image_base, arch, tag); + param->location_cases = d2r_var_locset_from_tag(arena, &unit_rdi->scopes, scope, input, cu, image_base, arch, tag); } else { Assert(!"this is a local variable"); log_user_errorf(".debug_info+%llx out of scope formal parameter", tag.info_off); @@ -2546,7 +2546,7 @@ d2r_convert_symbols(Arena *arena, parent_tag.kind == DW_TagKind_InlinedSubroutine || parent_tag.kind == DW_TagKind_LexicalBlock) { Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - d2r_push_scope(arena, &g_d2r_shared.scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); + d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); } } break; case DW_TagKind_CallSite: { @@ -3002,10 +3002,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } ProfEnd(); - //////////////////////////////// - - RDIM_Scope *global_scope = rdim_scope_chunk_list_push(arena, &g_d2r_shared.scopes, D2R_SCOPE_CHUNK_CAP); - //////////////////////////////// RDIM_Type *builtin_types[RDI_TypeKind_Count] = {0}; @@ -3058,32 +3054,26 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); String8 cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer); DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language); - + // init type table D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); type_table->ht = hash_table_init(comp_temp.arena, 0x4000); type_table->types = &g_d2r_shared.types; type_table->type_chunk_cap = D2R_TYPE_CHUNK_CAP; type_table->builtin_types = builtin_types; - - // convert debug info - d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch, tag_tree.root); - d2r_convert_udts(arena, type_table, &input, cu, cu_lang, tag_tree.root); - d2r_convert_symbols(arena, type_table, global_scope, &input, cu, cu_lang, image_base, arch, tag_tree.root); - - RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; - if (cu_idx < cu_contrib_map.count) { - cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); - } else { - Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); - for EachNode(n, Rng1U64Node, range_list.first) { - rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); - } - } - + // convert compile unit + RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &g_d2r_shared.units, D2R_UNIT_CHUNK_CAP); { - RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &g_d2r_shared.units, D2R_UNIT_CHUNK_CAP); + RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; + if (cu_idx < cu_contrib_map.count) { + cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); + } else { + Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); + for EachNode(n, Rng1U64Node, range_list.first) { + rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); + } + } unit->unit_name = cu_name; unit->compiler_name = cu_prod; unit->source_file = str8_zero(); // TODO @@ -3094,6 +3084,11 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) unit->line_table = cu_line_tables_rdi[cu_idx]; unit->voff_ranges = cu_voff_ranges; } + + // convert debug info + d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch, tag_tree.root); + d2r_convert_udts(arena, type_table, &input, cu, cu_lang, tag_tree.root); + d2r_convert_symbols(arena, type_table, &input, cu, cu_lang, image_base, arch, tag_tree.root, unit); next_cu:; temp_end(comp_temp); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 8c05863e..63ccf208 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -42,8 +42,6 @@ typedef struct D2R_Shared RDIM_LineTableChunkList line_tables; RDIM_SymbolChunkList gvars; RDIM_SymbolChunkList tvars; - RDIM_SymbolChunkList procs; - RDIM_ScopeChunkList scopes; RDIM_InlineSiteChunkList inline_sites; } D2R_Shared; @@ -257,7 +255,7 @@ internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input internal RDIM_Scope * d2r_push_scope (Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges); internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); -internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, RDIM_Scope *global_scope, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, Arch arch, DW_TagNode *root); +internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, Arch arch, DW_TagNode *root, RDIM_Unit *unit_rdi); //////////////////////////////// //~ Line Table Conversion diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 2cc85513..cf667d49 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -457,12 +457,18 @@ TEST(d2r_general) dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "FooBar"); - // declare variable + // declare local dw_writer_tag_begin(writer, DW_TagKind_Variable); dw_writer_push_attrib_exprv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestLocal"); dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); dw_writer_tag_end(writer); + // declare param + dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); + dw_writer_push_attrib_exprv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); + dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestParam"); + dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); + dw_writer_tag_end(writer); dw_writer_tag_end(writer); } @@ -475,28 +481,53 @@ TEST(d2r_general) RDI_Scope *root_scope = rdi_root_scope_from_procedure(rdi, proc); T_Ok(root_scope); - T_Ok(root_scope->local_count == 1); + T_Ok(root_scope->local_count == 2); - RDI_Symbol *test_local = rdi_element_from_name_idx(rdi, LocalVariables, root_scope->local_first + 0); - T_Ok(test_local); - T_Ok(test_local->symbol_flags & RDI_SymbolFlag_IsParam); - String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); - T_Ok(str8_match(test_local_name, str8_lit("TestLocal"), 0)); - - RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); - T_Ok(test_local_type); - T_Ok(test_local_type->kind == RDI_TypeKind_Alias); - T_Ok(test_local_type->flags == 0); - String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); - T_Ok(str8_match(alias_name, str8_lit("char"), 0)); - - RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); - T_Ok(char_type); - T_Ok(char_type->kind == RDI_TypeKind_Char8); - T_Ok(char_type->flags == 0); - T_Ok(char_type->byte_size == 1); - String8 char_type_name = str8_from_rdi_string_idx(rdi, char_type->built_in.name_string_idx); - T_Ok(str8_match(char_type_name, str8_lit("Char8"), 0)); + { + RDI_Symbol *test_local = rdi_element_from_name_idx(rdi, LocalVariables, root_scope->local_first + 0); + T_Ok(test_local); + T_Ok((test_local->symbol_flags & RDI_SymbolFlag_IsParam) == 0); + String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); + T_Ok(str8_match(test_local_name, str8_lit("TestLocal"), 0)); + + RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); + T_Ok(test_local_type); + T_Ok(test_local_type->kind == RDI_TypeKind_Alias); + T_Ok(test_local_type->flags == 0); + String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); + T_Ok(str8_match(alias_name, str8_lit("char"), 0)); + + RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); + T_Ok(char_type); + T_Ok(char_type->kind == RDI_TypeKind_Char8); + T_Ok(char_type->flags == 0); + T_Ok(char_type->byte_size == 1); + String8 char_type_name = str8_from_rdi_string_idx(rdi, char_type->built_in.name_string_idx); + T_Ok(str8_match(char_type_name, str8_lit("Char8"), 0)); + } + + { + RDI_Symbol *test_local = rdi_element_from_name_idx(rdi, LocalVariables, root_scope->local_first + 1); + T_Ok(test_local); + T_Ok((test_local->symbol_flags & RDI_SymbolFlag_IsParam) != 0); + String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); + T_Ok(str8_match(test_local_name, str8_lit("TestParam"), 0)); + + RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); + T_Ok(test_local_type); + T_Ok(test_local_type->kind == RDI_TypeKind_Alias); + T_Ok(test_local_type->flags == 0); + String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); + T_Ok(str8_match(alias_name, str8_lit("char"), 0)); + + RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); + T_Ok(char_type); + T_Ok(char_type->kind == RDI_TypeKind_Char8); + T_Ok(char_type->flags == 0); + T_Ok(char_type->byte_size == 1); + String8 char_type_name = str8_from_rdi_string_idx(rdi, char_type->built_in.name_string_idx); + T_Ok(str8_match(char_type_name, str8_lit("Char8"), 0)); + } dw_writer_end(&writer); } From 16ea060382e52db998f883337b412cf8253c8180 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 20 Apr 2026 14:06:34 -0700 Subject: [PATCH 425/850] fix source of vmap baking determinism issue, + fix use-after-free from cross-lane scratch usage --- src/rdi_from_pdb/rdi_from_pdb.c | 1 + src/rdi_make/rdi_make_local.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 5089378b..fa5de982 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -4837,6 +4837,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) result.line_tables = all_line_tables; } + lane_sync(); scratch_end(scratch); return result; } diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index e641be7c..f228b117 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -881,7 +881,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } - + lane_sync(); scratch_end(scratch); } lane_sync(); @@ -3202,7 +3202,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachNode(case_n, RDIM_LocationCase, s->location_cases.first) { lane_chunk_constant_data_counts[slot_idx] += case_n->location.value_data.size; - lane_chunk_bytecode_data_counts[slot_idx] += case_n->location.bytecode.encoded_size; + lane_chunk_bytecode_data_counts[slot_idx] += case_n->location.bytecode.encoded_size + 1; // NOTE(rjf): +1 for the `stop` op } } chunk_idx += 1; From 5fb1ef4df98341976f03302aaf604cba3d5caa17 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 20 Apr 2026 14:15:38 -0700 Subject: [PATCH 426/850] fix global vmap baking determinism - eliminate dupes --- src/rdi_from_pdb/rdi_from_pdb.c | 2 +- src/rdi_make/rdi_make_local.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index fa5de982..d973f57d 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3010,7 +3010,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { - raddbg_log("%S%s\n", n->string, n->corresponds_to_scope ? " (is scope)" : n->type != 0 ? " (is type)" : ""); + // raddbg_log("%S%s\n", n->string, n->corresponds_to_scope ? " (is scope)" : n->type != 0 ? " (is type)" : ""); if(n->corresponds_to_scope || n->scope != 0 || n->type != 0) { continue; } String8 string = n->string; RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 32); diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index f228b117..0cff69ae 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -486,7 +486,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { U64 slot_idx = lane_idx()*all_global_variables->chunk_count + chunk_idx; Rng1U64 range = lane_range(n->count); - for EachIndex(n_idx, n->count) + for EachInRange(n_idx, range) { if(n->v[n_idx].location_cases.count == 1 && n->v[n_idx].location_cases.first->location.kind == RDI_LocationKind_ModuleOff) From 581c102bfd87a1bf2b827a1b1259514504fac4bd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 20 Apr 2026 14:43:03 -0700 Subject: [PATCH 427/850] sort deduplicated namespace map before producing namespaces --- src/rdi_from_pdb/rdi_from_pdb.c | 68 ++++++++++++++++++++------------- src/rdi_from_pdb/rdi_from_pdb.h | 14 +++++++ 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index d973f57d..43c4bbf0 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -39,6 +39,12 @@ p2r_hash_from_voff(U64 voff) return hash; } +internal int +p2r_namespace_node_is_before(P2R_NamespaceNode **a, P2R_NamespaceNode **b) +{ + return (str8_compar(a[0]->string, b[0]->string, 0) < 0); +} + //////////////////////////////// //~ rjf: COFF <-> RDI Canonical Conversions @@ -2018,17 +2024,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) ////////////////////////////////////////////////////////////// //- rjf: types pass 3: gather all unique namespaces from types // - typedef struct NamespaceNode NamespaceNode; - struct NamespaceNode - { - NamespaceNode *next; - String8 string; - B32 corresponds_to_scope; - RDIM_Scope *scope; - RDIM_Type *type; - RDIM_Namespace *ns; - }; - NamespaceNode **all_namespace_slots = 0; + P2R_NamespaceNode **all_namespace_slots = 0; U64 all_namespace_slots_count = 0; ProfScope("gather all unique namespaces from types") { @@ -2112,6 +2108,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) String8 namespace_fully_qualified_name = str8_substr(name_before_templates, r1u64(0, scope_resolution_operator_pos)); if(namespace_fully_qualified_name.size != 0) { + namespace_count += 1; U64 hash = u64_hash_from_str8(namespace_fully_qualified_name); U64 slot_idx = hash%namespace_slots_count; B32 already_exists = 0; @@ -2128,7 +2125,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) String8Node *node = push_array(scratch2.arena, String8Node, 1); SLLStackPush(namespace_slots[slot_idx], node); node->string = namespace_fully_qualified_name; - namespace_count += 1; } } } @@ -2161,7 +2157,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(lane_idx() == 0) { all_namespace_slots_count = *total_namespace_count_ptr / 3; - all_namespace_slots = push_array(scratch.arena, NamespaceNode *, all_namespace_slots_count); + all_namespace_slots = push_array(scratch.arena, P2R_NamespaceNode *, all_namespace_slots_count); for EachIndex(l_idx, lane_count()) { LaneNamespaceTable *tbl = &lane_namespace_tables[l_idx]; @@ -2172,7 +2168,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 hash = u64_hash_from_str8(n->string); U64 dst_slot_idx = hash%all_namespace_slots_count; B32 already_exists = 0; - for(NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) + for(P2R_NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) { if(str8_match(dst_n->string, n->string, 0)) { @@ -2182,7 +2178,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } if(!already_exists) { - NamespaceNode *dst_n = push_array(scratch.arena, NamespaceNode, 1); + P2R_NamespaceNode *dst_n = push_array(scratch.arena, P2R_NamespaceNode, 1); dst_n->string = n->string; SLLStackPush(all_namespace_slots[dst_slot_idx], dst_n); } @@ -2777,7 +2773,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) Rng1U64 range = lane_range(all_namespace_slots_count); for EachInRange(slot_idx, range) { - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { String8 container_string = n->string; CV_TypeId container_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_string, 0); @@ -2829,7 +2825,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) String8 name = str8_cstring_capped(proc32+1, iter.opl); U64 hash = u64_hash_from_str8(name); U64 slot_idx = hash%all_namespace_slots_count; - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { if(str8_match(n->string, name, 0)) { @@ -2907,7 +2903,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(!already_exists) { U64 slot_idx = container_name_hash%all_namespace_slots_count; - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { if(str8_match(n->string, container_name, 0)) { @@ -2975,7 +2971,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 hash = u64_hash_from_str8(n->string); U64 dst_slot_idx = hash%all_namespace_slots_count; B32 already_exists = 0; - for(NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) + for(P2R_NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) { if(str8_match(dst_n->string, n->string, 0)) { @@ -2985,7 +2981,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } if(!already_exists) { - NamespaceNode *dst_n = push_array(scratch.arena, NamespaceNode, 1); + P2R_NamespaceNode *dst_n = push_array(scratch.arena, P2R_NamespaceNode, 1); dst_n->string = n->string; SLLStackPush(all_namespace_slots[dst_slot_idx], dst_n); } @@ -3008,8 +3004,25 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) Rng1U64 range = lane_range(all_namespace_slots_count); for EachInRange(slot_idx, range) { - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + Temp scratch = scratch_begin(&arena, 1); + + // rjf: gather nodes, sort + U64 node_count = 0; + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { node_count += 1; } + P2R_NamespaceNode **nodes = push_array(scratch.arena, P2R_NamespaceNode *, node_count); { + U64 idx = 0; + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next, idx += 1) + { + nodes[idx] = n; + } + } + radsort(nodes, node_count, p2r_namespace_node_is_before); + + // rjf: build namespaces for this slot + for EachIndex(node_in_slot_idx, node_count) + { + P2R_NamespaceNode *n = nodes[node_in_slot_idx]; // raddbg_log("%S%s\n", n->string, n->corresponds_to_scope ? " (is scope)" : n->type != 0 ? " (is type)" : ""); if(n->corresponds_to_scope || n->scope != 0 || n->type != 0) { continue; } String8 string = n->string; @@ -3017,6 +3030,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) ns->name = string; n->ns = ns; } + scratch_end(scratch); } // rjf: combine all per-lane namespaces @@ -3290,7 +3304,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { U64 hash = u64_hash_from_str8(container_name); U64 slot_idx = hash%all_namespace_slots_count; - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { if(str8_match(container_name, n->string, 0) && n->ns != 0) @@ -3369,7 +3383,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { U64 hash = u64_hash_from_str8(container_name); U64 slot_idx = hash%all_namespace_slots_count; - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { if(str8_match(container_name, n->string, 0) && n->ns != 0) @@ -3452,7 +3466,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { U64 hash = u64_hash_from_str8(name); U64 slot_idx = hash%all_namespace_slots_count; - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { if(str8_match(n->string, name, 0)) { @@ -4036,7 +4050,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { U64 hash = u64_hash_from_str8(scope_n->string); U64 slot_idx = hash%all_namespace_slots_count; - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { n->scope = scope_n->scope; } @@ -4724,11 +4738,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) String8 container_name = str8_chop(str8_prefix(udt_name, p2r_end_of_cplusplus_container_name(udt_name)), 2); // rjf: look up namespace node associated with namespace - NamespaceNode *ns_node = 0; + P2R_NamespaceNode *ns_node = 0; { U64 hash = u64_hash_from_str8(container_name); U64 slot_idx = hash%all_namespace_slots_count; - for(NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { if(str8_match(n->string, container_name, 0)) { diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index 5a34c69c..9b2dfcda 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -40,6 +40,19 @@ struct P2R_LinkNameMap U64 link_name_count; }; +//- rjf: deduplicated namespace map type + +typedef struct P2R_NamespaceNode P2R_NamespaceNode; +struct P2R_NamespaceNode +{ + P2R_NamespaceNode *next; + String8 string; + B32 corresponds_to_scope; + RDIM_Scope *scope; + RDIM_Type *type; + RDIM_Namespace *ns; +}; + //- rjf: normalized file path -> source file map typedef struct P2R_SrcFileStub P2R_SrcFileStub; @@ -92,6 +105,7 @@ struct P2R_TypeIdChain internal U64 p2r_end_of_cplusplus_container_name(String8 str); internal U64 p2r_hash_from_voff(U64 voff); +internal int p2r_namespace_node_is_before(P2R_NamespaceNode **a, P2R_NamespaceNode **b); //////////////////////////////// //~ rjf: COFF => RDI Canonical Conversions From fda0a9751bde14fa08d7c906e2f55500d9984b13 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 20 Apr 2026 15:14:01 -0700 Subject: [PATCH 428/850] equip namespace records with container info --- src/lib_rdi_make/rdi_make.h | 2 +- src/rdi/rdi_local.c | 4 +- src/rdi_from_pdb/rdi_from_pdb.c | 75 ++++++++++++++++++++++----------- src/rdi_make/rdi_make_local.c | 4 +- 4 files changed, 56 insertions(+), 29 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 214599e9..52c24443 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -637,7 +637,7 @@ struct RDIM_Namespace struct RDIM_NamespaceChunkNode *chunk; RDIM_Namespace *parent_namespace; struct RDIM_Scope *parent_scope; - struct RDIM_UDT *parent_udt; + struct RDIM_Type *parent_type; RDIM_String8 name; }; diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 75309bc4..3e09527d 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -830,7 +830,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse dumpf(" flags: `%S`\n", rdi_string_from_udt_flags(scratch.arena, udt->flags)); if(udt->container_idx != 0 && (udt->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Type) { - dumpf(" container_type_idx: %u\n", udt->container_idx); + dumpf(" container_udt_idx: %u\n", udt->container_idx); } if(udt->container_idx != 0 && (udt->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Scope) { @@ -941,7 +941,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse } if(symbol->container_idx != 0 && (symbol->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Type) { - dumpf(" container_type_idx: %u\n", symbol->container_idx); + dumpf(" container_udt_idx: %u\n", symbol->container_idx); } if(symbol->container_idx != 0 && (symbol->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Scope) { diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 43c4bbf0..73a4b1e2 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -2764,29 +2764,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync_u64(&all_types__pre_typedefs_ptr, 0); all_types__pre_typedefs = *all_types__pre_typedefs_ptr; - ////////////////////////////////////////////////////////////// - //- rjf: upgrade namespace nodes with type info, if they match a type - // - ProfScope("upgrade namespace nodes with type info, if they match a type") - { -#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) - Rng1U64 range = lane_range(all_namespace_slots_count); - for EachInRange(slot_idx, range) - { - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - String8 container_string = n->string; - CV_TypeId container_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_string, 0); - if(container_type_id != 0) - { - n->type = p2r_type_ptr_from_itype(container_type_id); - } - } - } -#undef p2r_type_ptr_from_itype - } - lane_sync(); - ////////////////////////////////////////////////////////////// //- rjf: set bit in all namespace nodes that correspond to scopes // @@ -2994,6 +2971,29 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) scratch_end(scratch2); } + ////////////////////////////////////////////////////////////// + //- rjf: upgrade namespace nodes with type info, if they match a type + // + ProfScope("upgrade namespace nodes with type info, if they match a type") + { +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + Rng1U64 range = lane_range(all_namespace_slots_count); + for EachInRange(slot_idx, range) + { + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + String8 container_string = n->string; + CV_TypeId container_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_string, 0); + if(container_type_id != 0) + { + n->type = p2r_type_ptr_from_itype(container_type_id); + } + } + } +#undef p2r_type_ptr_from_itype + } + lane_sync(); + ////////////////////////////////////////////////////////////// //- rjf: build namespaces, that are not scopes, nor types // @@ -3023,13 +3023,14 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) for EachIndex(node_in_slot_idx, node_count) { P2R_NamespaceNode *n = nodes[node_in_slot_idx]; - // raddbg_log("%S%s\n", n->string, n->corresponds_to_scope ? " (is scope)" : n->type != 0 ? " (is type)" : ""); + raddbg_log("%S%s\n", n->string, n->corresponds_to_scope ? " (is scope)" : n->type != 0 ? " (is type)" : ""); if(n->corresponds_to_scope || n->scope != 0 || n->type != 0) { continue; } String8 string = n->string; RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 32); ns->name = string; n->ns = ns; } + scratch_end(scratch); } @@ -4059,6 +4060,32 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } lane_sync(); + ////////////////////////////////////////////////////////////// + //- rjf: upgrade namespaces with container info + // + for EachNode(n, RDIM_NamespaceChunkNode, all_namespaces.first) + { + Rng1U64 range = lane_range(n->count); + for EachInRange(n_idx, range) + { + RDIM_Namespace *ns = &n->v[n_idx]; + String8 container_name = str8_chop(str8_prefix(ns->name, p2r_end_of_cplusplus_container_name(ns->name)), 2); + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(P2R_NamespaceNode *ns_n = all_namespace_slots[slot_idx]; ns_n != 0; ns_n = ns_n->next) + { + if(str8_match(ns_n->string, container_name, 0)) + { + ns->parent_scope = ns_n->scope; + ns->parent_type = ns_n->type; + ns->parent_namespace = ns_n->ns; + break; + } + } + } + } + lane_sync(); + ////////////////////////////////////////////////////////////// //- rjf: join extra types from units // diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 0cff69ae..26ef4a48 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2576,10 +2576,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->container_flags |= RDI_ContainerKind_Scope; dst->container_idx = rdim_idx_from_scope(src->parent_scope); } - else if(src->parent_udt != 0) + else if(src->parent_type != 0 && src->parent_type->udt != 0) { dst->container_flags |= RDI_ContainerKind_Type; - dst->container_idx = rdim_idx_from_udt(src->parent_udt); + dst->container_idx = rdim_idx_from_udt(src->parent_type->udt); } } } From 8cf14b5acb1c12912078318f4fac287390160615 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 20 Apr 2026 14:15:17 -0700 Subject: [PATCH 429/850] minor fix --- src/linker/lnk_debug_info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 942606ff..6466705f 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -203,7 +203,7 @@ THREAD_POOL_TASK_FUNC(lnk_read_type_servers_task) goto exit; } - MSF_StreamNumber type_streams[CV_TypeIndexSource_COUNT] = {}; + MSF_StreamNumber type_streams[CV_TypeIndexSource_COUNT] = {0}; type_streams[CV_TypeIndexSource_TPI] = PDB_FixedStream_Tpi; type_streams[CV_TypeIndexSource_IPI] = PDB_FixedStream_Ipi; From 6f2b8540eb7c1fe06d810e7d42a80fb31090d983 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 21 Apr 2026 19:36:38 -0700 Subject: [PATCH 430/850] store partially-qualified names in generated RDIs; adjust debugger to do fully-qualified lookups when appropriate --- project.4coder | 2 +- src/dbg_info/dbg_info.c | 481 ++++++++++++++++++++------------ src/eval/eval_ir.c | 7 + src/rdi/rdi_local.c | 67 ++++- src/rdi/rdi_local.h | 7 +- src/rdi_from_pdb/rdi_from_pdb.c | 174 ++++++++---- 6 files changed, 498 insertions(+), 240 deletions(-) diff --git a/project.4coder b/project.4coder index a3fc4681..a83c192c 100644 --- a/project.4coder +++ b/project.4coder @@ -48,7 +48,7 @@ commands = //- rjf: [raddbg] // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index a558e5f8..6a17d6f2 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -314,7 +314,7 @@ di_open(DI_Key key) internal void di_close(DI_Key key, B32 force_closed) -{ +{ //- rjf: unpack key U64 hash = u64_hash_from_str8(str8_struct(&key)); U64 slot_idx = hash%di_shared->slots_count; @@ -340,15 +340,15 @@ di_close(DI_Key key, B32 force_closed) } } if(node) - { - if(force_closed) - { - node->refcount = 0; - } - else - { - node->refcount -= 1; - } + { + if(force_closed) + { + node->refcount = 0; + } + else + { + node->refcount -= 1; + } if(node->refcount == 0) { for(;;) @@ -374,9 +374,9 @@ di_close(DI_Key key, B32 force_closed) //- rjf: release node's resources if needed if(node_released) - { - ins_atomic_u64_dec_eval(&di_shared->load_count); - ins_atomic_u64_inc_eval(&di_shared->load_gen); + { + ins_atomic_u64_dec_eval(&di_shared->load_count); + ins_atomic_u64_inc_eval(&di_shared->load_gen); os_file_map_view_close(file_map, file_base, r1u64(0, file_props.size)); os_file_map_close(file_map); os_file_close(file); @@ -384,7 +384,7 @@ di_close(DI_Key key, B32 force_closed) { arena_release(arena); } - } + } } //////////////////////////////// @@ -396,13 +396,13 @@ di_load_gen(void) U64 result = ins_atomic_u64_eval(&di_shared->load_gen); return result; } - -internal U64 -di_load_count(void) -{ + +internal U64 +di_load_count(void) +{ U64 result = ins_atomic_u64_eval(&di_shared->load_count); - return result; -} + return result; +} internal DI_KeyArray di_push_all_loaded_keys(Arena *arena) @@ -598,14 +598,14 @@ di_async_tick(void) //////////////////////////// //- rjf: generate load tasks for all unique requests - // - for EachElement(priority_idx, first_req) - { + // + for EachElement(priority_idx, first_req) + { for EachNode(n, DI_RequestNode, first_req[priority_idx]) { // rjf: unpack request DI_Key key = n->v.key; - + // rjf: determine if this request is a duplicate B32 request_is_duplicate = 1; { @@ -625,7 +625,7 @@ di_async_tick(void) } } } - + // rjf: if not a duplicate, create new task if(!request_is_duplicate) { @@ -642,25 +642,25 @@ di_async_tick(void) DLLPushBack(di_shared->first_load_task[priority_idx], di_shared->last_load_task[priority_idx], t); t->key = key; } - } - } + } + } //////////////////////////// //- rjf: update tasks: configure, launch if we can, & retire if we can - // - for EachElement(priority_idx, di_shared->first_load_task) - { + // + for EachElement(priority_idx, di_shared->first_load_task) + { for(DI_LoadTask *t = di_shared->first_load_task[priority_idx], *next = 0; t != 0; t = next) { next = t->next; - + //- rjf: unpack key DI_Key key = t->key; U64 key_hash = u64_hash_from_str8(str8_struct(&key)); U64 key_slot_idx = key_hash%di_shared->key2path_slots_count; DI_KeySlot *key_slot = &di_shared->key2path_slots[key_slot_idx]; Stripe *key_stripe = stripe_from_slot_idx(&di_shared->key2path_stripes, key_slot_idx); - + //- rjf: get key's O.G. path String8 og_path = {0}; U64 og_min_timestamp = 0; @@ -676,13 +676,13 @@ di_async_tick(void) } } } - - //- rjf: analyze O.G. debug info + + //- rjf: analyze O.G. debug info if(!t->og_analyzed) { t->og_analyzed = 1; OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, og_path); - FileProperties props = os_properties_from_file(file); + FileProperties props = os_properties_from_file(file); t->og_size = props.size; U64 rdi_magic_maybe = 0; if(os_file_read_struct(file, 0, &rdi_magic_maybe) == 8 && @@ -692,12 +692,12 @@ di_async_tick(void) } os_file_close(file); } - U64 og_size = t->og_size; + U64 og_size = t->og_size; B32 og_is_rdi = t->og_is_rdi; - B32 og_is_good = (og_size > 0); - + B32 og_is_good = (og_size > 0); + //- rjf: compute key's RDI path - String8 rdi_path = {0}; + String8 rdi_path = {0}; { if(og_is_rdi) { @@ -708,7 +708,7 @@ di_async_tick(void) rdi_path = str8f(scratch.arena, "%S.rdi", str8_chop_last_dot(og_path)); } } - + //- rjf: determine if RDI is stale if(!t->rdi_analyzed) { @@ -731,16 +731,16 @@ di_async_tick(void) os_file_close(file); } B32 rdi_is_stale = t->rdi_is_stale; - + //- rjf: calculate thread counts for conversion processes if(!og_is_rdi && rdi_is_stale && t->thread_count == 0) { U64 thread_count = 1; - U64 max_thread_count = os_get_system_info()->logical_processor_count/2; - if(priority_idx > 0) - { - max_thread_count = Max(1, max_thread_count/2); - } + U64 max_thread_count = os_get_system_info()->logical_processor_count/2; + if(priority_idx > 0) + { + max_thread_count = Max(1, max_thread_count/2); + } { if(0){} else if(og_size <= MB(4)) {thread_count = 1;} @@ -752,7 +752,7 @@ di_async_tick(void) thread_count = Max(1, thread_count); t->thread_count = thread_count; } - + //- rjf: determine if there are threads available B32 threads_available = 0; { @@ -761,30 +761,30 @@ di_async_tick(void) U64 needed_threads = (current_threads + t->thread_count); threads_available = (max_threads >= needed_threads); } - - //- rjf: if this conversion will overwrite an RDI we already have in cache, - // then we need to evict the old one from the cache. - B32 ready_to_launch_conversion = (threads_available && !og_is_rdi && rdi_is_stale && t->thread_count != 0 && t->status != DI_LoadTaskStatus_Active); - if(ready_to_launch_conversion) - { + + //- rjf: if this conversion will overwrite an RDI we already have in cache, + // then we need to evict the old one from the cache. + B32 ready_to_launch_conversion = (threads_available && !og_is_rdi && rdi_is_stale && t->thread_count != 0 && t->status != DI_LoadTaskStatus_Active); + if(ready_to_launch_conversion) + { U64 path2key_hash = u64_hash_from_str8(og_path); U64 path2key_slot_idx = path2key_hash%di_shared->path2key_slots_count; DI_KeySlot *path2key_slot = &di_shared->path2key_slots[path2key_slot_idx]; - Stripe *path2key_stripe = stripe_from_slot_idx(&di_shared->path2key_stripes, path2key_slot_idx); - RWMutexScope(path2key_stripe->rw_mutex, 0) - { - // NOTE(rjf): we need to iterate from last -> first, since we want to evict the - // most recent key. - for(DI_KeyPathNode *n = path2key_slot->last; n != 0; n = n->prev) - { - if(str8_match(n->path, og_path, 0) && !di_key_match(key, n->key)) - { - di_close(n->key, 1); - } - } - } - } - + Stripe *path2key_stripe = stripe_from_slot_idx(&di_shared->path2key_stripes, path2key_slot_idx); + RWMutexScope(path2key_stripe->rw_mutex, 0) + { + // NOTE(rjf): we need to iterate from last -> first, since we want to evict the + // most recent key. + for(DI_KeyPathNode *n = path2key_slot->last; n != 0; n = n->prev) + { + if(str8_match(n->path, og_path, 0) && !di_key_match(key, n->key)) + { + di_close(n->key, 1); + } + } + } + } + //- rjf: launch conversion processes if(og_is_good && ready_to_launch_conversion) { @@ -812,7 +812,7 @@ di_async_tick(void) t->status = DI_LoadTaskStatus_Active; di_shared->conversion_process_count += 1; di_shared->conversion_thread_count += t->thread_count; - + // rjf: send event MutexScope(di_shared->event_mutex) { @@ -823,7 +823,7 @@ di_async_tick(void) n->v.string = str8_copy(di_shared->event_arena, rdi_path); } } - + //- rjf: if active & process has completed, mark as done { U64 exit_code = 0; @@ -849,21 +849,21 @@ di_async_tick(void) di_shared->conversion_thread_count -= t->thread_count; } } - } - - //- rjf: ready to launch, but bad O.G. file -> just immediately mark as done - if(!og_is_good && ready_to_launch_conversion) - { - t->status = DI_LoadTaskStatus_Done; - } - + } + + //- rjf: ready to launch, but bad O.G. file -> just immediately mark as done + if(!og_is_good && ready_to_launch_conversion) + { + t->status = DI_LoadTaskStatus_Done; + } + //- rjf: if the RDI for this task is not stale, then we're already done - mark this // task as done & prepped for storing into the cache if(!rdi_is_stale) { t->status = DI_LoadTaskStatus_Done; } - + //- rjf: if the RDI for this task *is* stale, but the O.G. path is actually RDI, // then we can't actually re-convert to produce a non-stale RDI. in this case, just // mark as done. @@ -871,7 +871,7 @@ di_async_tick(void) { t->status = DI_LoadTaskStatus_Done; } - + //- rjf: if task is done, retire & recycle task; gather path to load if(t->status == DI_LoadTaskStatus_Done) { @@ -891,8 +891,8 @@ di_async_tick(void) SLLQueuePush(first_parse_task, last_parse_task, n); parse_tasks_count += 1; } - } - } + } + } //////////////////////////// //- rjf: join all parse tasks @@ -997,12 +997,12 @@ di_async_tick(void) node->arena = rdi_parsed_arena; MemoryCopyStruct(&node->rdi, &rdi_parsed); node->completion_count += 1; - node->working_count -= 1; - if(node->rdi.raw_data_size != 0) - { - ins_atomic_u64_inc_eval(&di_shared->load_gen); - } - ins_atomic_u64_inc_eval(&di_shared->load_count); + node->working_count -= 1; + if(node->rdi.raw_data_size != 0) + { + ins_atomic_u64_inc_eval(&di_shared->load_gen); + } + ins_atomic_u64_inc_eval(&di_shared->load_count); } else { @@ -1122,16 +1122,16 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * } lane_sync(); - //- rjf: do wide search on all lanes - Arena *arena = arena_alloc(); - Arena **arenas = 0; - U64 arenas_count = lane_count(); - if(lane_idx() == 0) - { - arenas = push_array(arena, Arena *, arenas_count); - } - lane_sync_u64(&arenas, 0); - arenas[lane_idx()] = arena; + //- rjf: do wide search on all lanes + Arena *arena = arena_alloc(); + Arena **arenas = 0; + U64 arenas_count = lane_count(); + if(lane_idx() == 0) + { + arenas = push_array(arena, Arena *, arenas_count); + } + lane_sync_u64(&arenas, 0); + arenas[lane_idx()] = arena; DI_SearchItemChunkList *lanes_items = 0; ProfScope("do wide search on all lanes") { @@ -1176,10 +1176,10 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * Rng1U64 range = lane_range(element_count); for EachInRange(idx, range) { - //- rjf: every so often, check if we need to cancel, and cancel - if(idx%10000 == 0 && !!ins_atomic_u32_eval(cancel_signal)) + //- rjf: every so often, check if we need to cancel, and cancel + if(idx%10000 == 0 && !!ins_atomic_u32_eval(cancel_signal)) { - break; + break; } //- rjf: get element, map to string; if empty, continue to next element @@ -1279,15 +1279,15 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * } } lane_sync(); - - //- rjf: decide if we cancelled - B32 cancelled = 0; - if(lane_idx() == 0 && !!ins_atomic_u32_eval(cancel_signal)) - { - cancelled = 1; - } - lane_sync_u64(&cancelled, 0); - + + //- rjf: decide if we cancelled + B32 cancelled = 0; + if(lane_idx() == 0 && !!ins_atomic_u32_eval(cancel_signal)) + { + cancelled = 1; + } + lane_sync_u64(&cancelled, 0); + //- rjf: produce sort records typedef struct SortRecord SortRecord; struct SortRecord @@ -1444,20 +1444,20 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * } lane_sync(); - //- rjf: bundle as artifact - if(!cancelled) - { - artifact.u64[0] = (U64)arenas; - artifact.u64[1] = arenas_count; + //- rjf: bundle as artifact + if(!cancelled) + { + artifact.u64[0] = (U64)arenas; + artifact.u64[1] = arenas_count; artifact.u64[2] = (U64)items.v; - artifact.u64[3] = items.count; - } - - //- rjf: release results on cancel - else - { - arena_release(arena); - } + artifact.u64[3] = items.count; + } + + //- rjf: release results on cancel + else + { + arena_release(arena); + } } scratch_end(scratch); access_close(access); @@ -1467,20 +1467,20 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * internal void di_search_artifact_destroy(AC_Artifact artifact) -{ - Temp scratch = scratch_begin(0, 0); - Arena **arenas = (Arena **)artifact.u64[0]; - U64 arenas_count = artifact.u64[1]; - Arena **arenas_copy = push_array(scratch.arena, Arena *, arenas_count); - MemoryCopy(arenas_copy, arenas, sizeof(Arena *) * arenas_count); - for EachIndex(idx, arenas_count) - { - if(arenas_copy[idx]) - { - arena_release(arenas_copy[idx]); - } - } - scratch_end(scratch); +{ + Temp scratch = scratch_begin(0, 0); + Arena **arenas = (Arena **)artifact.u64[0]; + U64 arenas_count = artifact.u64[1]; + Arena **arenas_copy = push_array(scratch.arena, Arena *, arenas_count); + MemoryCopy(arenas_copy, arenas, sizeof(Arena *) * arenas_count); + for EachIndex(idx, arenas_count) + { + if(arenas_copy[idx]) + { + arena_release(arenas_copy[idx]); + } + } + scratch_end(scratch); } internal DI_SearchItemArray @@ -1520,32 +1520,103 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g //- rjf: unpack key U64 index = 0; - String8 name = {0}; - DI_Key preferred_key = {0}; + String8 name = {0}; + DI_Key preferred_key = {0}; { U64 key_read_off = 0; - key_read_off += str8_deserial_read_struct(key, key_read_off, &index); - key_read_off += str8_deserial_read_struct(key, key_read_off, &preferred_key); - key_read_off += str8_deserial_read_struct(key, key_read_off, &name.size); + key_read_off += str8_deserial_read_struct(key, key_read_off, &index); + key_read_off += str8_deserial_read_struct(key, key_read_off, &preferred_key); + key_read_off += str8_deserial_read_struct(key, key_read_off, &name.size); name.str = push_array_no_zero(scratch.arena, U8, name.size); key_read_off += str8_deserial_read(key, key_read_off, name.str, name.size, 1); } + //- rjf: find split point between container part of name & "leaf" + U64 container_part_opl = 0; + U64 leaf_part_first = 0; + for(U64 off = 0; off+1 < name.size; off += 1) + { + if(name.str[off] == '.') + { + container_part_opl = off; + leaf_part_first = off+1; + } + else if(name.str[off] == ':' && name.str[off+1] == ':') + { + container_part_opl = off; + leaf_part_first = off+2; + } + } + + //- rjf: unpack container/leaf + String8 container_part_of_name = str8_prefix(name, container_part_opl); + String8 leaf_part_of_name = str8_skip(name, leaf_part_first); + + //- rjf: produce the fully qualified name, sanitize the container part (convert all `.`s to `::`s) + String8 fully_qualified_name = name; + if(container_part_of_name.size != 0) + { + // rjf: gather parts of container + String8List parts = {0}; + for(U64 off = 0, next_off = 0; off < container_part_of_name.size; off = next_off) + { + // rjf: find the next separator + U64 next_separator_pos = container_part_of_name.size; + U64 next_separator_size = 0; + { + S64 template_nest_depth = 0; + for(U64 off2 = off; off2+1 < container_part_of_name.size; off2 += 1) + { + if(template_nest_depth == 0 && container_part_of_name.str[off2] == '.') + { + next_separator_pos = off2; + next_separator_size = 1; + break; + } + else if(template_nest_depth == 0 && container_part_of_name.str[off2] == ':' && container_part_of_name.str[off2+1] == ':') + { + next_separator_pos = off2; + next_separator_size = 2; + break; + } + else if(container_part_of_name.str[off2] == '<') + { + template_nest_depth += 1; + } + else if(container_part_of_name.str[off2] == '>') + { + template_nest_depth -= 1; + template_nest_depth = ClampBot(0, template_nest_depth); + } + } + } + + // rjf: gather portions of container + str8_list_push(scratch.arena, &parts, str8_substr(container_part_of_name, r1u64(off, next_separator_pos))); + next_off = next_separator_pos + next_separator_size; + } + + // rjf: add leaf & join + str8_list_push(scratch.arena, &parts, leaf_part_of_name); + StringJoin join = {.sep = str8_lit("::")}; + fully_qualified_name = str8_list_join(scratch.arena, &parts, &join); + } + //- rjf: get all loaded keys DI_KeyArray dbgi_keys = di_push_all_loaded_keys(scratch.arena); - - //- rjf: take cancellation signal - B32 cancelled = 0; - if(lane_idx() == 0) - { - cancelled = ins_atomic_u32_eval(cancel_signal); - } - lane_sync_u64(&cancelled, 0); - + + //- rjf: take cancellation signal + B32 cancelled = 0; + if(lane_idx() == 0) + { + cancelled = ins_atomic_u32_eval(cancel_signal); + } + lane_sync_u64(&cancelled, 0); + //- rjf: wide search across all debug infos - DI_Match *lane_matches = 0; - if(!cancelled) - { + DI_Match *lane_matches = 0; + if(!cancelled) + { if(lane_idx() == 0) { lane_matches = push_array(scratch.arena, DI_Match, lane_count()); @@ -1577,44 +1648,94 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); for EachElement(name_map_kind_idx, name_map_kinds) { + // rjf: unpack name map RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, name_map_kinds[name_map_kind_idx]); RDI_ParsedNameMap parsed_name_map = {0}; rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map); - RDI_NameMapNode *map_node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size); - U32 num = 0; - U32 *run = rdi_matches_from_map_node(rdi, map_node, &num); - if(num != 0) - { - U64 run_idx = (num-1) - Min(index, num-1); + + // rjf: find matches for (possibly leaf) name + RDI_NameMapNode *map_node = rdi_name_map_lookup(rdi, &parsed_name_map, leaf_part_of_name.str, leaf_part_of_name.size); + U32 matches_count = 0; + U32 *matches = rdi_matches_from_map_node(rdi, map_node, &matches_count); + + // rjf: do we have a container? -> filter matches according to container string also + if(container_part_of_name.size != 0) + { + U32 *filtered_matches = push_array(scratch.arena, U32, matches_count); + U32 filtered_matches_count = 0; + for EachIndex(match_idx, matches_count) + { + Temp scratch = scratch_begin(0, 0); + String8 match_fully_qualified_name = {0}; + switch(name_map_section_kinds[name_map_kind_idx]) + { + default:{}break; + case RDI_SectionKind_GlobalVariables: + case RDI_SectionKind_ThreadVariables: + case RDI_SectionKind_Constants: + case RDI_SectionKind_Procedures: + { + RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, name_map_section_kinds[name_map_kind_idx], matches[match_idx]); + String8 match_fully_qualified_name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, symbol); + if(str8_match(match_fully_qualified_name, fully_qualified_name, 0)) + { + filtered_matches[filtered_matches_count] = matches[match_idx]; + filtered_matches_count += 1; + } + }break; + case RDI_SectionKind_TypeNodes: + { + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, match_idx); + if(RDI_TypeKind_FirstUserDefined <= type_node->kind && type_node->kind <= RDI_TypeKind_LastUserDefined) + { + String8 match_fully_qualified_name = fully_qualified_str8_from_rdi_type(scratch.arena, rdi, type_node); + if(str8_match(match_fully_qualified_name, fully_qualified_name, 0)) + { + filtered_matches[filtered_matches_count] = matches[match_idx]; + filtered_matches_count += 1; + } + } + }break; + } + scratch_end(scratch); + } + matches = filtered_matches; + matches_count = filtered_matches_count; + } + + // rjf: given matches, pick selected & return as result + if(matches_count != 0) + { + U64 selected_match_idx = (matches_count-1) - Min(index, matches_count-1); lane_matches[lane_idx()].key = dbgi_key; lane_matches[lane_idx()].section_kind = name_map_section_kinds[name_map_kind_idx]; - lane_matches[lane_idx()].idx = run[run_idx]; + lane_matches[lane_idx()].idx = matches[selected_match_idx]; } } } access_close(access); } - } - } - lane_sync(); - + } + } + lane_sync(); + //- rjf: pick match - DI_Match match = {0}; - if(lane_matches != 0) - { + DI_Match match = {0}; + if(lane_matches != 0) + { for EachIndex(idx, lane_count()) { if(lane_matches[idx].idx != 0) { - match = lane_matches[idx]; - if(di_key_match(di_key_zero(), preferred_key) || di_key_match(match.key, preferred_key)) - { - break; - } + match = lane_matches[idx]; + if(di_key_match(di_key_zero(), preferred_key) || di_key_match(match.key, preferred_key)) + { + break; + } } } - } - + } + //- rjf: package as artifact AC_Artifact artifact = {0}; { @@ -1640,12 +1761,12 @@ di_match_from_string(String8 string, U64 index, DI_Key preferred_dbgi_key, U64 e { String8List key_parts = {0}; str8_list_push(scratch.arena, &key_parts, str8_struct(&index)); - str8_list_push(scratch.arena, &key_parts, str8_struct(&preferred_dbgi_key)); - str8_list_push(scratch.arena, &key_parts, str8_struct(&string.size)); + str8_list_push(scratch.arena, &key_parts, str8_struct(&preferred_dbgi_key)); + str8_list_push(scratch.arena, &key_parts, str8_struct(&string.size)); str8_list_push(scratch.arena, &key_parts, string); - String8 key = str8_list_join(scratch.arena, &key_parts, 0); - U64 dbgi_count = di_load_count(); - B32 wide = (dbgi_count > 256); + String8 key = str8_list_join(scratch.arena, &key_parts, 0); + U64 dbgi_count = di_load_count(); + B32 wide = (dbgi_count > 256); AC_Artifact artifact = ac_artifact_from_key(access, key, di_match_artifact_create, 0, endt_us, .flags = wide ? AC_Flag_Wide : 0, .gen = di_load_gen(), .evict_threshold_us = wide ? 20000000 : 10000000); result.key.u64[0] = artifact.u64[0]; result.key.u64[1] = artifact.u64[1]; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index d7563cb3..b8f671b7 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1887,6 +1887,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I // rjf: find match DI_Match match = di_match_from_string(string, match_disambiguating_idx, e_base_ctx->primary_dbg_info->dbgi_key, 0); + +#if 0 + //~ TODO(rjf): vvvvv this used to be used for namespaceifying partially-qualified strings. + // now, the debugger just stores partially-qualified strings, so we instead need to do the + // reverse: given a fully-qualified name, try to parse out the leaf, and look up the partial + // qualified name. if(match.idx == 0) { String8List namespaceified_strings = {0}; @@ -1923,6 +1929,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I } } } +#endif // rjf: match -> RDI RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0); diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 3e09527d..948c1c75 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -48,6 +48,59 @@ str8_from_rdi_path_node_idx(Arena *arena, RDI_Parsed *rdi, PathStyle path_style, return path; } +internal String8 +fully_qualified_from_rdi_string_and_container(Arena *arena, RDI_Parsed *rdi, U32 name_string_idx, U32 start_container_idx, RDI_ContainerFlags start_container_flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List parts = {0}; + { + str8_list_push(scratch.arena, &parts, str8_from_rdi_string_idx(rdi, name_string_idx)); + RDI_ContainerFlags container_flags = start_container_flags; + RDI_ContainerFlags next_container_flags = 0; + for(U32 container_idx = start_container_idx, next_container_idx = 0; + container_idx != 0; + container_idx = next_container_idx, container_flags = next_container_flags) + { + next_container_idx = 0; + next_container_flags = 0; + switch(container_flags & RDI_ContainerFlag_KindMask) + { + default:{}break; + case RDI_ContainerKind_Type: + { + RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, container_idx); + RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); + String8 type_name = str8_from_rdi_string_idx(rdi, type->user_defined.name_string_idx); + str8_list_push_front(scratch.arena, &parts, type_name); + next_container_idx = udt->container_idx; + next_container_flags = udt->container_flags; + }break; + case RDI_ContainerKind_Scope: + { + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, container_idx); + RDI_Symbol *symbol = rdi_procedure_from_scope(rdi, scope); + String8 name = str8_from_rdi_string_idx(rdi, symbol->name_string_idx); + str8_list_push_front(scratch.arena, &parts, name); + next_container_idx = symbol->container_idx; + next_container_flags = symbol->container_flags; + }break; + case RDI_ContainerKind_Namespace: + { + RDI_Namespace *ns = rdi_element_from_name_idx(rdi, Namespaces, container_idx); + String8 name = str8_from_rdi_string_idx(rdi, ns->name_string_idx); + str8_list_push_front(scratch.arena, &parts, name); + next_container_idx = ns->container_idx; + next_container_flags = ns->container_flags; + }break; + } + } + } + StringJoin join = {.sep = str8_lit("::")}; + String8 result = str8_list_join(arena, &parts, &join); + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: String <=> Enum @@ -795,7 +848,8 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse } else if(RDI_TypeKind_FirstUserDefined <= type->kind && type->kind <= RDI_TypeKind_LastUserDefined) { - dumpf(" name: '%S'\n", str8_from_rdi_string_idx(rdi, type->user_defined.name_string_idx)); + String8 fully_qualified_name = fully_qualified_str8_from_rdi_type(scratch.arena, rdi, type); + dumpf(" name: '%S'\n", fully_qualified_name); dumpf(" user_defined__direct_type: %u\n", type->user_defined.direct_type_idx); dumpf(" user_defined__udt: %u\n", type->user_defined.udt_idx); } @@ -825,7 +879,8 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse { RDI_UDT *udt = &v[idx]; Temp scratch = scratch_begin(&arena, 1); - dumpf("\n // udt[%I64u]\n {\n", idx); + String8 fully_qualified_name = fully_qualified_str8_from_rdi_udt(scratch.arena, rdi, udt); + dumpf("\n // udt[%I64u]\n '%S':\n {\n", idx, fully_qualified_name); dumpf(" self_type: %u\n", udt->self_type_idx); dumpf(" flags: `%S`\n", rdi_string_from_udt_flags(scratch.arena, udt->flags)); if(udt->container_idx != 0 && (udt->container_flags & RDI_ContainerFlag_KindMask) == RDI_ContainerKind_Type) @@ -929,7 +984,8 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse { RDI_Symbol *symbol = &v[idx]; Temp scratch = scratch_begin(&arena, 1); - dumpf("\n '%S': // %S[%I64u]\n {\n", str8_from_rdi_string_idx(rdi, symbol->name_string_idx), table_name, idx); + String8 fully_qualified_name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, symbol); + dumpf("\n '%S': // %S[%I64u]\n {\n", fully_qualified_name, table_name, idx); dumpf(" type_idx: %u\n", symbol->type_idx); if(symbol->link_name_string_idx != 0) { @@ -1258,6 +1314,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse Rng1U64 range = lane_range(count); for EachInRange(idx, range) { + Temp scratch = scratch_begin(&arena, 1); RDI_Namespace *ns = &v[idx]; String8 container_kind_name = str8_lit("container_idx"); switch(ns->container_flags & RDI_ContainerFlag_KindMask) @@ -1276,7 +1333,9 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse container_kind_name = str8_lit("container_scope_idx"); }break; } - dumpf("\n '%S': {%S: %u} // namespaces[%I64u]", str8_from_rdi_string_idx(rdi, ns->name_string_idx), container_kind_name, ns->container_idx, idx); + String8 fully_qualified_name = fully_qualified_str8_from_rdi_namespace(scratch.arena, rdi, ns); + dumpf("\n '%S': {%S: %u} // namespaces[%I64u]", fully_qualified_name, container_kind_name, ns->container_idx, idx); + scratch_end(scratch); } if(lane_idx() == lane_count()-1) { dumpf("\n"); } } diff --git a/src/rdi/rdi_local.h b/src/rdi/rdi_local.h index c3aec22c..adc5f180 100644 --- a/src/rdi/rdi_local.h +++ b/src/rdi/rdi_local.h @@ -75,7 +75,12 @@ internal Arch arch_from_rdi_arch(RDI_Arch arch); //~ rjf: Lookup Helpers internal String8 str8_from_rdi_string_idx(RDI_Parsed *rdi, U32 idx); -internal String8 str8_from_rdi_path_node_idx(Arena *arean, RDI_Parsed *rdi, PathStyle path_style, U32 path_node_idx); +internal String8 str8_from_rdi_path_node_idx(Arena *arena, RDI_Parsed *rdi, PathStyle path_style, U32 path_node_idx); +internal String8 fully_qualified_from_rdi_string_and_container(Arena *arena, RDI_Parsed *rdi, U32 name_string_idx, U32 start_container_idx, RDI_ContainerFlags start_container_flags); +#define fully_qualified_str8_from_rdi_symbol(arena, rdi, symbol) fully_qualified_from_rdi_string_and_container((arena), (rdi), (symbol)->name_string_idx, (symbol)->container_idx, (symbol)->container_flags) +#define fully_qualified_str8_from_rdi_udt(arena, rdi, udt) fully_qualified_from_rdi_string_and_container((arena), (rdi), rdi_element_from_name_idx((rdi), TypeNodes, (udt)->self_type_idx)->user_defined.name_string_idx, (udt)->container_idx, (udt)->container_flags) +#define fully_qualified_str8_from_rdi_type(arena, rdi, type) fully_qualified_from_rdi_string_and_container((arena), (rdi), (type)->user_defined.name_string_idx, rdi_element_from_name_idx((rdi), UDTs, (type)->user_defined.udt_idx)->container_idx, rdi_element_from_name_idx((rdi), UDTs, (type)->user_defined.udt_idx)->container_flags) +#define fully_qualified_str8_from_rdi_namespace(arena, rdi, ns) fully_qualified_from_rdi_string_and_container((arena), (rdi), (ns)->name_string_idx, (ns)->container_idx, (ns)->container_flags) //////////////////////////////// //~ rjf: String <=> Enum diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 73a4b1e2..d28ac7bf 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -19,14 +19,23 @@ p2r_end_of_cplusplus_container_name(String8 str) U64 result = 0; if(str.size >= 2) { - String8 str_before_templates = str8_prefix(str, str8_find_needle(str, 0, str8_lit("<"), 0)); - for(U64 i = str_before_templates.size; i >= 2; i -= 1) + S64 template_nest_depth = 0; + for(U64 i = str.size; i >= 2; i -= 1) { - if(str_before_templates.str[i - 2] == ':' && str_before_templates.str[i - 1] == ':') + if(template_nest_depth == 0 && str.str[i - 2] == ':' && str.str[i - 1] == ':') { result = i; break; } + if(str.str[i-1] == '>') + { + template_nest_depth += 1; + } + else if(str.str[i-1] == '<') + { + template_nest_depth -= 1; + template_nest_depth = ClampBot(template_nest_depth, 0); + } } } return result; @@ -2873,44 +2882,49 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // rjf: symbol name -> container name String8 container_name = str8_chop(str8_prefix(symbol_name, p2r_end_of_cplusplus_container_name(symbol_name)), 2); - U64 container_name_hash = u64_hash_from_str8(container_name); - // rjf: first, check if this container already showed up from type info - B32 already_exists = 0; - if(!already_exists) + // rjf: non-empty container name -> gather + if(container_name.size != 0) { - U64 slot_idx = container_name_hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + U64 container_name_hash = u64_hash_from_str8(container_name); + + // rjf: first, check if this container already showed up from type info + B32 already_exists = 0; + if(!already_exists) { - if(str8_match(n->string, container_name, 0)) + U64 slot_idx = container_name_hash%all_namespace_slots_count; + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { - already_exists = 1; - break; + if(str8_match(n->string, container_name, 0)) + { + already_exists = 1; + break; + } } } - } - - // rjf: next, check if we've already gathered this namespace for this lane - if(!already_exists) - { - U64 slot_idx = container_name_hash%lane_namespace_slots_count; - for(String8Node *n = lane_namespace_slots[slot_idx]; n != 0; n = n->next) + + // rjf: next, check if we've already gathered this namespace for this lane + if(!already_exists) { - if(str8_match(n->string, container_name, 0)) + U64 slot_idx = container_name_hash%lane_namespace_slots_count; + for(String8Node *n = lane_namespace_slots[slot_idx]; n != 0; n = n->next) { - already_exists = 1; - break; + if(str8_match(n->string, container_name, 0)) + { + already_exists = 1; + break; + } } } - } - - // rjf: if we didn't find this namespace in either those from types, or already found in this lane, then gather - if(!already_exists) - { - U64 slot_idx = container_name_hash%lane_namespace_slots_count; - String8Node *n = push_array(scratch2.arena, String8Node, 1); - SLLStackPush(lane_namespace_slots[slot_idx], n); - n->string = container_name; + + // rjf: if we didn't find this namespace in either those from types, or already found in this lane, then gather + if(!already_exists) + { + U64 slot_idx = container_name_hash%lane_namespace_slots_count; + String8Node *n = push_array(scratch2.arena, String8Node, 1); + SLLStackPush(lane_namespace_slots[slot_idx], n); + n->string = container_name; + } } } } @@ -3023,7 +3037,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) for EachIndex(node_in_slot_idx, node_count) { P2R_NamespaceNode *n = nodes[node_in_slot_idx]; - raddbg_log("%S%s\n", n->string, n->corresponds_to_scope ? " (is scope)" : n->type != 0 ? " (is type)" : ""); if(n->corresponds_to_scope || n->scope != 0 || n->type != 0) { continue; } String8 string = n->string; RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 32); @@ -3316,10 +3329,17 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } } + // rjf: un-namespaceify the symbol name + String8 name__maybe_partially_qualified = name; + if(got_container) + { + name__maybe_partially_qualified = str8_skip(name, container_name_opl); + } + // rjf: build symbol RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_global_variables, sym_global_variables_chunk_cap); symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); - symbol->name = name; + symbol->name = name__maybe_partially_qualified; symbol->type = type; symbol->container_scope = container_scope; symbol->container_type = container_type; @@ -3435,12 +3455,19 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } } + // rjf: un-namespaceify the symbol name + String8 name__maybe_partially_qualified = name; + if(got_container) + { + name__maybe_partially_qualified = str8_skip(name, container_name_opl); + } + // rjf: build procedure symbol if(params->subset_flags & (RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_ProcedureNameMap)) { curr_proc_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); curr_proc_symbol->is_extern = (iter.kind == CV_SymKind_GPROC32); - curr_proc_symbol->name = name; + curr_proc_symbol->name = name__maybe_partially_qualified; curr_proc_symbol->link_name = link_name; curr_proc_symbol->type = type; curr_proc_symbol->container_scope = container_scope; @@ -3564,6 +3591,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { RDIM_Scope *scope = top_scope_node->scope; RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + local->container_scope = scope; local->is_param = is_param; local->name = name; local->type = type; @@ -3599,29 +3627,57 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); // rjf: unpack thread variable's container type + B32 got_container = 0; RDIM_Type *container_type = 0; U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - if(container_name_opl > 2) + String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); + if(!got_container && container_name.size != 0) { - String8 container_name = str8(name.str, container_name_opl - 2); CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); container_type = p2r_type_ptr_from_itype(cv_type_id); + got_container = (container_type != 0); } // rjf: unpack thread variable's container symbol RDIM_Scope *container_scope = 0; - if(container_type == 0 && top_scope_node != 0) + if(!got_container && top_scope_node != 0) { + got_container = 1; container_scope = top_scope_node->scope; } + // rjf: unpack proc's container namespace + RDIM_Namespace *container_namespace = 0; + if(!got_container && container_name.size != 0) + { + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(container_name, n->string, 0) && + n->ns != 0) + { + container_namespace = n->ns; + break; + } + } + } + + // rjf: un-namespaceify the symbol name + String8 name__maybe_partially_qualified = name; + if(got_container) + { + name__maybe_partially_qualified = str8_skip(name, container_name_opl); + } + // rjf: build symbol RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, sym_thread_variables, sym_thread_variables_chunk_cap); - tvar->name = name; - tvar->type = type; - tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); - tvar->container_type = container_type; - tvar->container_scope = container_scope; + tvar->name = name__maybe_partially_qualified; + tvar->type = type; + tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); + tvar->container_type = container_type; + tvar->container_scope = container_scope; + tvar->container_namespace = container_namespace; RDIM_Location loc = {.kind = RDI_LocationKind_TLSOff, .offset = tls_off}; RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; rdim_location_case_list_push(arena, &tvar->location_cases, loc, range); @@ -3665,6 +3721,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_Scope *scope = top_scope_node->scope; RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); { + local->container_scope = scope; local->is_param = !!(slocal->flags & CV_LocalFlag_Param); local->name = name; local->type = type; @@ -4061,7 +4118,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) lane_sync(); ////////////////////////////////////////////////////////////// - //- rjf: upgrade namespaces with container info + //- rjf: upgrade namespaces with container info; trim off container names // for EachNode(n, RDIM_NamespaceChunkNode, all_namespaces.first) { @@ -4069,18 +4126,24 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) for EachInRange(n_idx, range) { RDIM_Namespace *ns = &n->v[n_idx]; - String8 container_name = str8_chop(str8_prefix(ns->name, p2r_end_of_cplusplus_container_name(ns->name)), 2); - U64 hash = u64_hash_from_str8(container_name); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *ns_n = all_namespace_slots[slot_idx]; ns_n != 0; ns_n = ns_n->next) + U64 container_name_opl = p2r_end_of_cplusplus_container_name(ns->name); + String8 container_name = str8_chop(str8_prefix(ns->name, container_name_opl), 2); + if(container_name.size != 0) { - if(str8_match(ns_n->string, container_name, 0)) + String8 leaf_name = str8_skip(ns->name, container_name_opl); + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(P2R_NamespaceNode *ns_n = all_namespace_slots[slot_idx]; ns_n != 0; ns_n = ns_n->next) { - ns->parent_scope = ns_n->scope; - ns->parent_type = ns_n->type; - ns->parent_namespace = ns_n->ns; - break; + if(str8_match(ns_n->string, container_name, 0)) + { + ns->parent_scope = ns_n->scope; + ns->parent_type = ns_n->type; + ns->parent_namespace = ns_n->ns; + break; + } } + ns->name = leaf_name; } } } @@ -4762,7 +4825,9 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(dst_type != 0 && dst_type->udt != 0 && udt_name.size != 0) { // rjf: unpack fully qualified namespace from udt name - String8 container_name = str8_chop(str8_prefix(udt_name, p2r_end_of_cplusplus_container_name(udt_name)), 2); + U64 container_name_opl = p2r_end_of_cplusplus_container_name(udt_name); + String8 container_name = str8_chop(str8_prefix(udt_name, container_name_opl), 2); + String8 leaf_name = str8_skip(udt_name, container_name_opl); // rjf: look up namespace node associated with namespace P2R_NamespaceNode *ns_node = 0; @@ -4779,7 +4844,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } } - // rjf: equip container info to udt + // rjf: equip container info to udt, equip partial name to type if(ns_node != 0) { RDIM_UDT *udt = dst_type->udt; @@ -4795,6 +4860,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { udt->container_type = ns_node->type; } + dst_type->name = leaf_name; } } } From 21a150a1813102c64d26f3bd141c1bb98ab4ad02 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 21 Apr 2026 20:13:54 -0700 Subject: [PATCH 431/850] turn off symbol-lookup highlighting following dot operators --- src/raddbg/raddbg_widgets.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 11b3eac4..78c738a7 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2327,6 +2327,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { TXT_Token *line_tokens_first = line_tokens->v; TXT_Token *line_tokens_opl = line_tokens->v + line_tokens->count; + B32 preceded_by_dot = 0; for(TXT_Token *token = line_tokens_first; token < line_tokens_opl; token += 1) { // rjf: token -> token string @@ -2346,7 +2347,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: token -> token color RD_CodeColorSlot token_color_slot = rd_code_color_slot_from_txt_token_kind(token->kind); - RD_CodeColorSlot lookup_color_slot = rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string); + RD_CodeColorSlot lookup_color_slot = preceded_by_dot ? token_color_slot : rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string); Vec4F32 token_color = rd_rgba_from_code_color_slot(token_color_slot); if(lookup_color_slot != RD_CodeColorSlot_CodeDefault) { @@ -2370,6 +2371,9 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: push fancy string dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, token_string, .color = token_color); + + // rjf: . -> mark next token as preceded by dot + preceded_by_dot = (token->kind == TXT_TokenKind_Symbol && str8_match(token_string, str8_lit("."), 0)); } } lines_fstrs[line_idx] = fstrs; @@ -3190,6 +3194,7 @@ rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, TXT_Token *tokens_opl = tokens.v+tokens.count; S32 indirection_counter = 0; indirection_size_change = 0; + B32 preceded_by_dot = 0; for(TXT_Token *token = tokens.v; token < tokens_opl; token += 1) { RD_CodeColorSlot token_color_slot = rd_code_color_slot_from_txt_token_kind(token->kind); @@ -3218,7 +3223,11 @@ rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, case TXT_TokenKind_Identifier: case TXT_TokenKind_Keyword: { - RD_CodeColorSlot lookup_theme_color_slot = rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string); + RD_CodeColorSlot lookup_theme_color_slot = RD_CodeColorSlot_CodeDefault; + if(!preceded_by_dot) + { + lookup_theme_color_slot = rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string); + } if(lookup_theme_color_slot != RD_CodeColorSlot_CodeDefault) { Vec4F32 lookup_color = rd_rgba_from_code_color_slot(lookup_theme_color_slot); @@ -3346,6 +3355,14 @@ rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, }break; } + if(token->kind == TXT_TokenKind_Symbol && str8_match(token_string, str8_lit("."), 0)) + { + preceded_by_dot = 1; + } + else + { + preceded_by_dot = 0; + } if(str8_match(token_string, str8_lit("}"), 0)) { indirection_counter -= 1; } if(str8_match(token_string, str8_lit("]"), 0)) { indirection_counter -= 1; } indirection_counter = ClampBot(0, indirection_counter); From 4815007ac198900896c0021e33bbfb19bd5695dd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 09:09:41 -0700 Subject: [PATCH 432/850] use fully qualified type names in unpacked eval types - fixes namespaced type views --- src/eval/eval_types.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 7a395e3b..ad6a1935 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -714,7 +714,7 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) type = push_array(arena, E_Type, 1); type->kind = e_type_kind_from_key(node->key); type->flags = node->params.flags; - type->name = push_str8_copy(arena, node->params.name); + type->name = str8_copy(arena, node->params.name); type->direct_type_key = node->params.direct_key; type->count = node->params.count; type->depth = node->params.depth; @@ -775,9 +775,10 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) //- rjf: record types => unpack name * members & produce if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord) { + Temp scratch = scratch_begin(&arena, 1); + // rjf: unpack name - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); + String8 name = fully_qualified_str8_from_rdi_type(scratch.arena, rdi, rdi_type); // rjf: unpack UDT info RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, rdi_type->user_defined.udt_idx); @@ -810,19 +811,22 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) // rjf: produce type = push_array(arena, E_Type, 1); type->kind = kind; - type->name = push_str8_copy(arena, name); + type->name = str8_copy(arena, name); type->byte_size = (U64)rdi_type->byte_size; type->count = members_count; type->arch = arch; type->members = members; + + scratch_end(scratch); } //- rjf: enum types => unpack name * values & produce else if(rdi_type->kind == RDI_TypeKind_Enum) { + Temp scratch = scratch_begin(&arena, 1); + // rjf: unpack name - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); + String8 name = fully_qualified_str8_from_rdi_type(scratch.arena, rdi, rdi_type); // rjf: unpack direct type E_TypeKey direct_type_key = zero_struct; @@ -861,6 +865,8 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) type->arch = arch; type->enum_vals = enum_vals; type->direct_type_key = direct_type_key; + + scratch_end(scratch); } //- rjf: constructed types @@ -1019,9 +1025,10 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) //- rjf: alias types else if(rdi_type->kind == RDI_TypeKind_Alias) { + Temp scratch = scratch_begin(&arena, 1); + // rjf: unpack name - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); + String8 name = fully_qualified_str8_from_rdi_type(scratch.arena, rdi, rdi_type); // rjf: unpack direct type E_TypeKey direct_type_key = zero_struct; @@ -1041,6 +1048,8 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) type->byte_size = direct_type_byte_size; type->direct_type_key = direct_type_key; type->arch = arch; + + scratch_end(scratch); } //- rjf: bitfields @@ -1070,17 +1079,19 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) //- rjf: incomplete types else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete) { + Temp scratch = scratch_begin(&arena, 1); + // rjf: unpack name - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size); + String8 name = fully_qualified_str8_from_rdi_type(scratch.arena, rdi, rdi_type); // rjf: produce type = push_array(arena, E_Type, 1); type->kind = kind; type->name = push_str8_copy(arena, name); type->arch = arch; + + scratch_end(scratch); } - } } }break; From a2aab5967c7a575080928022a2eeed2e3f2469fd Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 20 Apr 2026 16:02:04 -0700 Subject: [PATCH 433/850] add support for /DEBUG:GHASH --- CHANGELOG.md | 6 ++++ src/linker/lnk_config.c | 2 +- src/linker/lnk_config.h | 1 + src/linker/lnk_debug_info.c | 18 ++++++---- src/llvm/llvm.h | 3 +- src/torture/torture_radlink.c | 65 ++++++++++++++++++++++++++--------- 6 files changed, 71 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 242ba133..809c77b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v0.9.26-alpha + +## Linker Changes + +- Implemented /DEBUG:GHASH + # v0.9.25-alpha ## Debugger Changes diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 78eee9f2..81fe3b13 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -1237,7 +1237,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List LNK_DebugMode debug_mode = lnk_debug_mode_from_string(value_strings.first->string); if (debug_mode == LNK_DebugMode_GHash) { config->debug_mode = LNK_DebugMode_Full; - lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "GHASH is not supported, switching to FULL"); + config->ghash = 1; } else if (debug_mode == LNK_DebugMode_FastLink) { config->debug_mode = LNK_DebugMode_Full; lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "FASTLINK is not supported, switching to FULL"); diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 513a3f9d..45817553 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -266,6 +266,7 @@ typedef struct LNK_Config Arena *arena; LNK_ConfigFlags flags; LNK_DebugMode debug_mode; + B32 ghash; LNK_SwitchState opt_ref; LNK_SwitchState opt_icf; LNK_SwitchState opt_lbr; diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 6466705f..51e30c05 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -279,7 +279,9 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, input.debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$S"), 0); input.debug_p_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$P"), 0); input.debug_t_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$T"), 0); - input.debug_h_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$H"), 0); + if (config->ghash) { + input.debug_h_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$H"), 0); + } ProfEnd(); if (lnk_get_log_status(LNK_Log_Debug) || PROFILE_TELEMETRY) { @@ -288,7 +290,9 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, for EachNode(n, String8Node, input.debug_s_list_arr[obj_idx].first) { total_debug_s_size += n->string.size; } for EachNode(n, String8Node, input.debug_t_list_arr[obj_idx].first) { total_debug_t_size += n->string.size; } for EachNode(n, String8Node, input.debug_p_list_arr[obj_idx].first) { total_debug_p_size += n->string.size; } - for EachNode(n, String8Node, input.debug_h_list_arr[obj_idx].first) { total_debug_h_size += n->string.size; } + if (config->ghash) { + for EachNode(n, String8Node, input.debug_h_list_arr[obj_idx].first) { total_debug_h_size += n->string.size; } + } } ProfNoteV("Total .debug$S Input Size: %M", total_debug_s_size); @@ -324,7 +328,9 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$T"); input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, input.obj_count); - tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_h_task, &input, "Parse .debug$H"); + if (config->ghash) { + tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_h_task, &input, "Parse .debug$H"); + } } ProfEnd(); @@ -426,6 +432,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, MemoryCopyTyped(input.obj_arr, prev.obj_arr, prev.count); MemoryCopyTyped(input.debug_s_arr, prev.debug_s_arr, prev.count); MemoryCopyTyped(input.debug_t_arr, prev.debug_t_arr, prev.count); + MemoryCopyTyped(input.debug_h_arr, prev.debug_h_arr, prev.count); MemoryCopyTyped(input.obj_to_ts, prev.obj_to_ts, prev.count); MemorySet(input.obj_to_ts + input.obj_count, 0xff, ts_arr.count * sizeof(input.obj_to_ts[0])); @@ -1437,15 +1444,14 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) for EachElement(i, hash_targets) { task.indices = hash_targets[i].hash_indices; ProfBegin("Hash [Count: %.*s]", str8_varg(str8_from_count(scratch.arena, task.indices.count))); - tp_for_parallel(tp, 0, hash_targets[i].indices.count, hash_targets[i].hasher_task, &task); + tp_for_parallel(tp, 0, task.indices.count, hash_targets[i].hasher_task, &task); ProfEnd(); } #if BUILD_DEBUG for EachIndex(i, input->count) { for EachIndex(k, input->debug_h_arr[i].count) { - Assert(input->debug_h_arr[i].v[k] != 0 && - input->debug_h_arr[i].v[k] != 1); + Assert(input->debug_h_arr[i].v[k] != 0); } } #endif diff --git a/src/llvm/llvm.h b/src/llvm/llvm.h index e0b61cc7..0ddc399f 100644 --- a/src/llvm/llvm.h +++ b/src/llvm/llvm.h @@ -18,12 +18,13 @@ typedef enum LLVM_GHashAlgEnum typedef struct LLVM_GHash { U32 magic; - LLVM_GHashAlg hash_alg; U16 version; + LLVM_GHashAlg hash_alg; // * hashes[] } LLVM_GHash; internal String8 llvm_string_from_ghash_alg(LLVM_GHashAlg v); +internal U64 llvm_hash_size_from_alg(LLVM_GHashAlg v); #endif // LLVM_H diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 3cb0c418..cd9557a7 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -5028,7 +5028,7 @@ TEST(ghash_check_corrupt) T_Ok(t_write_entry_obj()); String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); T_Ok(g_last_exit_code == 0); B32 is_warning_found = 0; @@ -5075,7 +5075,7 @@ TEST(ghash_check_magic) T_Ok(t_write_entry_obj()); String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); T_Ok(g_last_exit_code == 0); B32 is_warning_found = 0; @@ -5122,7 +5122,7 @@ TEST(ghash_check_version) T_Ok(t_write_entry_obj()); String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); T_Ok(g_last_exit_code == 0); B32 is_warning_found = 0; @@ -5161,7 +5161,7 @@ TEST(ghash_check_hash_alg) T_Ok(t_write_entry_obj()); String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); T_Ok(g_last_exit_code == 0); B32 is_warning_found = 0; @@ -5200,7 +5200,7 @@ TEST(ghash_match_debug_t) T_Ok(t_write_entry_obj()); String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); T_Ok(g_last_exit_code == 0); B32 is_warning_found = 0; @@ -5213,7 +5213,6 @@ TEST(ghash_match_debug_t) T_Ok(is_warning_found); } -#if 0 TEST(ghash_basic) { String8 a_obj; @@ -5239,23 +5238,57 @@ TEST(ghash_basic) coff_obj_writer_release(&cow); } + String8 b_obj; + { + String8List t = {0}; str8_serial_begin(arena, &t); + str8_serial_push_u32(arena, &t, CV_Signature_C13); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_STRUCTURE, str8_struct(&(CV_LeafStruct){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_UNION, str8_struct(&(CV_LeafUnion){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + str8_serial_push_string(arena, &t, cv_make_leaf(arena, CV_LeafKind_ENUM, str8_struct(&(CV_LeafEnum){ .props = CV_TypeProp_FwdRef }), CV_LeafAlign)); + String8 debug_t = str8_serial_end(arena, &t); + + String8List h = {0}; str8_serial_begin(arena, &h); + str8_serial_push_struct(arena, &h, (&(LLVM_GHash){ .magic = LLVM_GHash_Magic, .hash_alg = LLVM_GHashAlg_BLAKE3, .version = LLVM_GHash_CurrentVersion })); + str8_serial_push_u64(arena, &h, 4); + str8_serial_push_u64(arena, &h, 5); + str8_serial_push_u64(arena, &h, 6); + String8 debug_h = str8_serial_end(arena, &h); + + COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); + coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); + coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); + b_obj = coff_obj_writer_serialize(arena, cow); + coff_obj_writer_release(&cow); + } + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); T_Ok(t_write_entry_obj()); - String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj a.obj"), max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj a.obj b.obj"); T_Ok(g_last_exit_code == 0); - B32 is_warning_found = 0; - String8 a_obj_path = t_make_file_path(arena, str8_lit("a.obj")); - String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash count and type count: got 3 hashes for 2 types", LNK_Warning_GHash, a_obj_path); - for (String8 i = output; i.size > 0 && !is_warning_found; ) { - String8 line = t_chop_line(&i); - is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + { + String8 raw_pdb = t_read_file(arena, str8_lit("a.pdb")); + MSF_Parsed *msf_parsed = msf_parsed_from_data(arena, raw_pdb); + String8 raw_tpi = msf_data_from_stream(msf_parsed, PDB_FixedStream_Tpi); + PDB_TpiParsed *tpi = pdb_tpi_from_data(arena, raw_tpi); + U64 leaf_count = tpi->itype_opl - tpi->itype_first; + T_Ok(leaf_count == 6); + } + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj a.obj b.obj"); + T_Ok(g_last_exit_code == 0); + + { + String8 raw_pdb = t_read_file(arena, str8_lit("a.pdb")); + MSF_Parsed *msf_parsed = msf_parsed_from_data(arena, raw_pdb); + String8 raw_tpi = msf_data_from_stream(msf_parsed, PDB_FixedStream_Tpi); + PDB_TpiParsed *tpi = pdb_tpi_from_data(arena, raw_tpi); + U64 leaf_count = tpi->itype_opl - tpi->itype_first; + T_Ok(leaf_count == 3); } - T_Ok(is_warning_found); } -#endif TEST(patch_cv_symbol_tree) { From 48f2a931ce42adeed16c1d9400893dd274c61a15 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 21 Apr 2026 11:42:48 -0700 Subject: [PATCH 434/850] clang build fix --- src/rdi_from_pdb/rdi_from_pdb.c | 3 ++- src/rdi_from_pdb/rdi_from_pdb.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index d28ac7bf..aefaad9e 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -49,8 +49,9 @@ p2r_hash_from_voff(U64 voff) } internal int -p2r_namespace_node_is_before(P2R_NamespaceNode **a, P2R_NamespaceNode **b) +p2r_namespace_node_is_before(void *raw_a, void *raw_b) { + P2R_NamespaceNode **a = (P2R_NamespaceNode **)raw_a, **b = (P2R_NamespaceNode **)raw_b; return (str8_compar(a[0]->string, b[0]->string, 0) < 0); } diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index 9b2dfcda..ae7e102b 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -105,7 +105,7 @@ struct P2R_TypeIdChain internal U64 p2r_end_of_cplusplus_container_name(String8 str); internal U64 p2r_hash_from_voff(U64 voff); -internal int p2r_namespace_node_is_before(P2R_NamespaceNode **a, P2R_NamespaceNode **b); +internal int p2r_namespace_node_is_before(void *raw_a, void *raw_b); //////////////////////////////// //~ rjf: COFF => RDI Canonical Conversions From 60c4518d6505c2a9e1c9b765baa4f967806e8942 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 21 Apr 2026 11:42:57 -0700 Subject: [PATCH 435/850] run debug tests first --- run_tests.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_tests.bat b/run_tests.bat index fdc75add..2f708838 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -13,7 +13,7 @@ for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi rem parse out clang version number out of --version to build path to the folder with ASAN DLL for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v -for %%c in (%CC_VALUES%) do for %%m in (%MODE_VALUES%) do ( +for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( setlocal echo -------------------------------------------------------------------------------- From ffc6905b0693eb3fb537f0467cafd375a52ae43a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 21 Apr 2026 11:58:11 -0700 Subject: [PATCH 436/850] kind mask should be const value --- src/rdi_make/rdi_make_local.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 26ef4a48..c51d452f 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2716,17 +2716,17 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: fill container info if(src_udt->container_scope != 0) { - dst_udt->container_flags |= (RDI_ContainerKind_Scope & RDI_ContainerFlag_KindMask); + dst_udt->container_flags |= (RDI_ContainerKind_Scope & (RDI_U32)RDI_ContainerFlag_KindMask); dst_udt->container_idx = (RDI_U32)rdim_idx_from_scope(src_udt->container_scope); // TODO(rjf): @u64_to_u32 } else if(src_udt->container_namespace != 0) { - dst_udt->container_flags |= (RDI_ContainerKind_Namespace & RDI_ContainerFlag_KindMask); + dst_udt->container_flags |= (RDI_ContainerKind_Namespace & (RDI_U32)RDI_ContainerFlag_KindMask); dst_udt->container_idx = (RDI_U32)rdim_idx_from_namespace(src_udt->container_namespace); // TODO(rjf): @u64_to_u32 } else if(src_udt->container_type != 0) { - dst_udt->container_flags |= (RDI_ContainerKind_Type & RDI_ContainerFlag_KindMask); + dst_udt->container_flags |= (RDI_ContainerKind_Type & (RDI_U32)RDI_ContainerFlag_KindMask); dst_udt->container_idx = (RDI_U32)rdim_idx_from_udt(src_udt->container_type->udt); // TODO(rjf): @u64_to_u32 } From 4786dc419ad758de2d160e2563d92002aba854c8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 21 Apr 2026 14:16:45 -0700 Subject: [PATCH 437/850] wildcard matcher --- src/base/base_strings.c | 70 ++++++++++++++++++++++++++++++++++++ src/base/base_strings.h | 1 + src/torture/torture_base.c | 72 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index bcfe297f..d327e952 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -325,6 +325,76 @@ str8_match(String8 a, String8 b, StringMatchFlags flags) return result; } +internal B32 +str8_char_match(U8 a, U8 b, StringMatchFlags flags) +{ + U8 at = a; + U8 bt = b; + if (flags & StringMatchFlag_CaseInsensitive) { + at = upper_from_char(at); + bt = upper_from_char(bt); + } + if (flags & StringMatchFlag_SlashInsensitive) { + if (at == '\\') { at = '/'; } + if (bt == '\\') { bt = '/'; } + } + return (at == bt); +} + +internal B32 +str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags) +{ + B32 matched = 0; + + U64 pattern_cursor = 0; + U64 string_cursor = 0; + + U64 pattern_start = max_U64; + U64 string_start = 0; + + for (;;) { + if (pattern_cursor == pattern.size) { + if (string_cursor == string.size || (flags & StringMatchFlag_RightSideSloppy)) { + matched = 1; + break; + } + } + + if (string_cursor == string.size) { + while (pattern_cursor < pattern.size && pattern.str[pattern_cursor] == '*') { + pattern_cursor += 1; + } + matched = (pattern_cursor == pattern.size); + break; + } + + if (pattern_cursor < pattern.size && pattern.str[pattern_cursor] == '*') { + pattern_start = pattern_cursor; + string_start = string_cursor; + pattern_cursor += 1; + continue; + } + + + if (pattern_cursor < pattern.size && (pattern.str[pattern_cursor] == '?' || str8_char_match(string.str[string_cursor], pattern.str[pattern_cursor], flags))) { + string_cursor += 1; + pattern_cursor += 1; + continue; + } + + if (pattern_start != max_U64) { + pattern_cursor = pattern_start + 1; + string_start += 1; + string_cursor = string_start; + continue; + } + + break; + } + + return matched; +} + internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 95755092..dd078d8b 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -197,6 +197,7 @@ internal String8 backslashed_from_str8(Arena *arena, String8 string); #define str8_match_lit(a_lit, b, flags) str8_match(str8_lit(a_lit), (b), (flags)) #define str8_match_cstr(a_cstr, b, flags) str8_match(str8_cstring(a_cstr), (b), (flags)) internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); +internal B32 str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags); internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); internal U64 str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); internal B32 str8_is_before(String8 a, String8 b); diff --git a/src/torture/torture_base.c b/src/torture/torture_base.c index b55e13f6..ee6e7ca8 100644 --- a/src/torture/torture_base.c +++ b/src/torture/torture_base.c @@ -104,4 +104,76 @@ TEST(count_digits) T_Ok(count_digits_u64(999999, 10) == 6); } +TEST(match_wildcard) +{ + // empty strings + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit(""), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("*"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("**"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("?"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("*?"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("?*"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit(""), 0) == 0); + + // exact + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("a"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("A"), 0) == 0); + + // ? + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("?"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("?"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit("ab"), str8_lit("?"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit("ab"), str8_lit("a?"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("ab"), str8_lit("?b"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("ab"), str8_lit("??"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("a?c"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("ab"), str8_lit("???"), 0) == 0); + + // * + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("*"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("*"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("a*"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*c"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*b*"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("a*c"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("b*"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("**"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("a**c"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("a*b*c"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*a*d*"), 0) == 0); + + T_Ok(str8_match_wildcard(str8_lit("abcd"), str8_lit("a*d"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abefcdgiescdfimde"), str8_lit("ab*cd?i*de"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("mississippi"), str8_lit("m*iss*ppi"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*b"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("aa"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit("aa"), str8_lit("a"), 0) == 0); + + // case insensitive + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("A"), StringMatchFlag_CaseInsensitive) == 1); + T_Ok(str8_match_wildcard(str8_lit("FooBar"), str8_lit("foobar"), StringMatchFlag_CaseInsensitive) == 1); + T_Ok(str8_match_wildcard(str8_lit("Foobar"), str8_lit("foo*"), StringMatchFlag_CaseInsensitive) == 1); + + // right side sloppy + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("ab"), StringMatchFlag_RightSideSloppy) == 1); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit(""), StringMatchFlag_RightSideSloppy) == 1); + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("a"), StringMatchFlag_RightSideSloppy) == 0); + + // slash insensitive + T_Ok(str8_match_wildcard(str8_lit("a/b"), str8_lit("a\\b"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit("a/b"), str8_lit("a\\b"), StringMatchFlag_SlashInsensitive) == 1); + T_Ok(str8_match_wildcard(str8_lit("a/b/c"), str8_lit("a\\*\\c"), StringMatchFlag_SlashInsensitive) == 1); + + // combined + T_Ok(str8_match_wildcard(str8_lit("Ab\\Cde"), str8_lit("ab/*e"), StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive) == 1); + + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*?*"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("*?*"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("*?*"), 0) == 0); + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("?*?"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("ab"), str8_lit("?*?"), 0) == 1); + T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("?*?"), 0) == 0); +} + #undef T_Group From ffd6f10b3186482d8af2d6387af8f84eb9a28ad5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 21 Apr 2026 14:31:08 -0700 Subject: [PATCH 438/850] wildcard match target tests --- src/torture/torture.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index fb10e3b5..ce861bac 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -535,8 +535,27 @@ t_entry_point(CmdLine *cmdline) target_opt = cmd_line_opt_from_string(cmdline, str8_lit("t")); } if (target_opt) { + HashTable *ht = hash_table_init(scratch.arena, g_torture_test_count*2); if (target_opt->value_strings.node_count > 0) { - str8_list_concat_in_place(&target, &target_opt->value_strings); + for EachNode(pattern_n, String8Node, target_opt->value_strings.first) { + for EachIndex(test_idx, g_torture_test_count) { + String8 name = str8f(scratch.arena, "%s::%s", g_torture_tests[test_idx].group, g_torture_tests[test_idx].label); + if (str8_match_wildcard(name, pattern_n->string, 0)) { + if ( ! hash_table_search_string(ht, name)) { + hash_table_push_string_raw(scratch.arena, ht, name, 0); + str8_list_push(scratch.arena, &target, str8_cstring(g_torture_tests[test_idx].label)); + } + } + } + } + + if (ht->count == 0) { + fprintf(stderr, "ERROR: -target matches not found for the following patterns: "); + for EachNode(n, String8Node, target_opt->value_strings.first) { + fprintf(stderr, "\"%.*s\"\n", str8_varg(n->string)); + } + os_abort(1); + } } else { fprintf(stderr, "ERROR: -target has invalid number of arguments\n"); } From 4b7dd960d900e2f8720f481384324786f8d2aa42 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 21 Apr 2026 14:41:36 -0700 Subject: [PATCH 439/850] pass args to the torture --- run_tests.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_tests.bat b/run_tests.bat index 2f708838..75e29493 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -34,7 +34,7 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( ) pushd build - torture || exit /b 1 + torture %* || exit /b 1 popd endlocal From 86066018e728c7041eeae86f913261cd0aa913a8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 22 Apr 2026 11:54:35 -0700 Subject: [PATCH 440/850] helper for writing COFF objs and libs --- src/torture/torture_radlink.c | 851 +++++++++++++++++++++++++++++++++- 1 file changed, 850 insertions(+), 1 deletion(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index cd9557a7..982d7423 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -35,6 +35,790 @@ t_push_debug_s_section(COFF_ObjWriter *obj_writer, String8 data) return coff_obj_writer_push_section(obj_writer, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS, data); } +//////////////////////////////// +// string -> COFF + +typedef enum T_COFF_TokenKind +{ + T_COFF_TokenKind_Null, + T_COFF_TokenKind_EOF, + T_COFF_TokenKind_String, + T_COFF_TokenKind_Number, + T_COFF_TokenKind_Ident, + T_COFF_TokenKind_Punct, +} T_COFF_TokenKind; + +typedef struct T_COFF_Token +{ + T_COFF_TokenKind kind; + String8 string; + U8 punct; +} T_COFF_Token; + +typedef struct T_COFF_Parser +{ + String8 source; + U64 off; + T_COFF_Token token; +} T_COFF_Parser; + +typedef struct T_COFF_IdNode +{ + struct T_COFF_IdNode *next; + String8 id; + void *ptr; +} T_COFF_IdNode; + +typedef struct T_COFF_IdMap +{ + Arena *arena; + T_COFF_IdNode *first; + T_COFF_IdNode *last; +} T_COFF_IdMap; + +typedef struct T_COFF_ObjParseCtx +{ + Arena *arena; + COFF_ObjWriter *writer; + T_COFF_IdMap sections; + T_COFF_IdMap symbols; + struct T_COFF_PendingRelocNode *pending_reloc_first; + struct T_COFF_PendingRelocNode *pending_reloc_last; +} T_COFF_ObjParseCtx; + +typedef struct T_COFF_PendingRelocNode +{ + struct T_COFF_PendingRelocNode *next; + T_COFF_Parser parser; + String8 section_id; +} T_COFF_PendingRelocNode; + +internal B32 +t_coff_is_ident_start(U8 c) +{ + return char_is_alpha(c) || c == '_'; +} + +internal B32 +t_coff_is_ident_continue(U8 c) +{ + return char_is_alpha(c) || char_is_digit(c, 10) || c == '_'; +} + +internal void +t_coff_parser_skip_ws(T_COFF_Parser *parser) +{ + for (;;) { + while (parser->off < parser->source.size && char_is_space(parser->source.str[parser->off])) { + parser->off += 1; + } + + if (parser->off + 1 < parser->source.size && + parser->source.str[parser->off] == '/' && + parser->source.str[parser->off + 1] == '/') { + parser->off += 2; + while (parser->off < parser->source.size) { + U8 c = parser->source.str[parser->off]; + parser->off += 1; + if (c == '\n') { + break; + } + } + continue; + } + + break; + } +} + +internal void +t_coff_parser_next(T_COFF_Parser *parser) +{ + t_coff_parser_skip_ws(parser); + if (parser->off >= parser->source.size) { + parser->token.kind = T_COFF_TokenKind_EOF; + parser->token.string = str8_zero(); + parser->token.punct = 0; + return; + } + + U64 start = parser->off; + U8 c = parser->source.str[parser->off]; + if (c == '\'') { + parser->off += 1; + start = parser->off; + while (parser->off < parser->source.size && parser->source.str[parser->off] != '\'') { + parser->off += 1; + } + AssertAlways(parser->off < parser->source.size); + parser->token.kind = T_COFF_TokenKind_String; + parser->token.string = str8_substr(parser->source, rng_1u64(start, parser->off)); + parser->token.punct = 0; + parser->off += 1; + return; + } + + if (char_is_digit(c, 10)) { + parser->off += 1; + while (parser->off < parser->source.size) { + U8 d = parser->source.str[parser->off]; + if (!(char_is_alpha(d) || char_is_digit(d, 10) || d == '_')) { + break; + } + parser->off += 1; + } + parser->token.kind = T_COFF_TokenKind_Number; + parser->token.string = str8_substr(parser->source, rng_1u64(start, parser->off)); + parser->token.punct = 0; + return; + } + + if (t_coff_is_ident_start(c)) { + parser->off += 1; + while (parser->off < parser->source.size && t_coff_is_ident_continue(parser->source.str[parser->off])) { + parser->off += 1; + } + parser->token.kind = T_COFF_TokenKind_Ident; + parser->token.string = str8_substr(parser->source, rng_1u64(start, parser->off)); + parser->token.punct = 0; + return; + } + + switch (c) { + case '{': case '}': case '[': case ']': case ':': case ',': { + parser->token.kind = T_COFF_TokenKind_Punct; + parser->token.string = str8_zero(); + parser->token.punct = c; + parser->off += 1; + } break; + default: { + InvalidPath; + } break; + } +} + +internal B32 +t_coff_parser_accept_punct(T_COFF_Parser *parser, U8 punct) +{ + if (parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == punct) { + t_coff_parser_next(parser); + return 1; + } + return 0; +} + +internal void +t_coff_parser_require_punct(T_COFF_Parser *parser, U8 punct) +{ + AssertAlways(t_coff_parser_accept_punct(parser, punct)); +} + +internal String8 +t_coff_parser_require_name(T_COFF_Parser *parser) +{ + AssertAlways(parser->token.kind == T_COFF_TokenKind_String || parser->token.kind == T_COFF_TokenKind_Ident); + String8 result = parser->token.string; + t_coff_parser_next(parser); + return result; +} + +internal U64 +t_coff_parser_require_u64(T_COFF_Parser *parser) +{ + AssertAlways(parser->token.kind == T_COFF_TokenKind_Number || parser->token.kind == T_COFF_TokenKind_String); + U64 result = 0; + AssertAlways(try_u64_from_str8_c_rules(parser->token.string, &result)); + t_coff_parser_next(parser); + return result; +} + +internal void +t_coff_parse_object_begin(T_COFF_Parser *parser) +{ + t_coff_parser_require_punct(parser, '{'); +} + +internal B32 +t_coff_parse_object_next(T_COFF_Parser *parser, String8 *key_out) +{ + if (t_coff_parser_accept_punct(parser, '}')) { + return 0; + } + *key_out = t_coff_parser_require_name(parser); + t_coff_parser_require_punct(parser, ':'); + return 1; +} + +internal void +t_coff_parse_object_finish_field(T_COFF_Parser *parser) +{ + if (!(parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == '}')) { + t_coff_parser_require_punct(parser, ','); + } +} + +internal void +t_coff_parse_array_begin(T_COFF_Parser *parser) +{ + t_coff_parser_require_punct(parser, '['); +} + +internal B32 +t_coff_parse_array_next(T_COFF_Parser *parser) +{ + if (t_coff_parser_accept_punct(parser, ']')) { + return 0; + } + return 1; +} + +internal void +t_coff_parse_array_finish_item(T_COFF_Parser *parser) +{ + if (!(parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == ']')) { + t_coff_parser_require_punct(parser, ','); + } +} + +internal void +t_coff_skip_value(T_COFF_Parser *parser) +{ + if (parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == '{') { + t_coff_parse_object_begin(parser); + for (String8 key = {0}; t_coff_parse_object_next(parser, &key);) { + t_coff_skip_value(parser); + t_coff_parse_object_finish_field(parser); + } + } else if (parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == '[') { + t_coff_parse_array_begin(parser); + for (;;) { + if (!t_coff_parse_array_next(parser)) break; + t_coff_skip_value(parser); + t_coff_parse_array_finish_item(parser); + } + } else { + t_coff_parser_next(parser); + } +} + +internal void +t_coff_id_map_insert(T_COFF_IdMap *map, String8 id, void *ptr) +{ + T_COFF_IdNode *node = push_array(map->arena, T_COFF_IdNode, 1); + node->id = push_str8_copy(map->arena, id); + node->ptr = ptr; + SLLQueuePush(map->first, map->last, node); +} + +internal void * +t_coff_id_map_find(T_COFF_IdMap *map, String8 id) +{ + for (T_COFF_IdNode *node = map->first; node != 0; node = node->next) { + if (str8_match(node->id, id, 0)) { + return node->ptr; + } + } + return 0; +} + +internal String8 +t_coff_parse_data_bytes(Arena *arena, T_COFF_Parser *parser) +{ + T_COFF_Parser probe = *parser; + U64 byte_count = 0; + t_coff_parse_array_begin(&probe); + for (;;) { + if (!t_coff_parse_array_next(&probe)) { + break; + } + U64 value = t_coff_parser_require_u64(&probe); + AssertAlways(value <= max_U8); + byte_count += 1; + t_coff_parse_array_finish_item(&probe); + } + + U8 *buffer = push_array(arena, U8, byte_count); + U64 idx = 0; + t_coff_parse_array_begin(parser); + for (;;) { + if (!t_coff_parse_array_next(parser)) { + break; + } + U64 value = t_coff_parser_require_u64(parser); + AssertAlways(value <= max_U8); + buffer[idx] = (U8)value; + idx += 1; + t_coff_parse_array_finish_item(parser); + } + AssertAlways(idx == byte_count); + return str8(buffer, byte_count); +} + +internal COFF_SectionFlags +t_coff_section_flag_from_name(String8 string) +{ + if (str8_match(string, str8_lit("type_no_pad"), 0)) return COFF_SectionFlag_TypeNoPad; + if (str8_match(string, str8_lit("cnt_code"), 0)) return COFF_SectionFlag_CntCode; + if (str8_match(string, str8_lit("cnt_init_data"), 0)) return COFF_SectionFlag_CntInitializedData; + if (str8_match(string, str8_lit("cnt_uninit_data"), 0)) return COFF_SectionFlag_CntUninitializedData; + if (str8_match(string, str8_lit("lnk_other"), 0)) return COFF_SectionFlag_LnkOther; + if (str8_match(string, str8_lit("lnk_info"), 0)) return COFF_SectionFlag_LnkInfo; + if (str8_match(string, str8_lit("lnk_remove"), 0)) return COFF_SectionFlag_LnkRemove; + if (str8_match(string, str8_lit("lnk_comdat"), 0)) return COFF_SectionFlag_LnkCOMDAT; + if (str8_match(string, str8_lit("gp_rel"), 0)) return COFF_SectionFlag_GpRel; + if (str8_match(string, str8_lit("mem_16bit"), 0)) return COFF_SectionFlag_Mem16Bit; + if (str8_match(string, str8_lit("mem_locked"), 0)) return COFF_SectionFlag_MemLocked; + if (str8_match(string, str8_lit("mem_preload"), 0)) return COFF_SectionFlag_MemPreload; + if (str8_match(string, str8_lit("align_1"), 0)) return COFF_SectionFlag_Align1Bytes; + if (str8_match(string, str8_lit("align_2"), 0)) return COFF_SectionFlag_Align2Bytes; + if (str8_match(string, str8_lit("align_4"), 0)) return COFF_SectionFlag_Align4Bytes; + if (str8_match(string, str8_lit("align_8"), 0)) return COFF_SectionFlag_Align8Bytes; + if (str8_match(string, str8_lit("align_16"), 0)) return COFF_SectionFlag_Align16Bytes; + if (str8_match(string, str8_lit("align_32"), 0)) return COFF_SectionFlag_Align32Bytes; + if (str8_match(string, str8_lit("align_64"), 0)) return COFF_SectionFlag_Align64Bytes; + if (str8_match(string, str8_lit("align_128"), 0)) return COFF_SectionFlag_Align128Bytes; + if (str8_match(string, str8_lit("align_256"), 0)) return COFF_SectionFlag_Align256Bytes; + if (str8_match(string, str8_lit("align_512"), 0)) return COFF_SectionFlag_Align512Bytes; + if (str8_match(string, str8_lit("align_1024"), 0)) return COFF_SectionFlag_Align1024Bytes; + if (str8_match(string, str8_lit("align_2048"), 0)) return COFF_SectionFlag_Align2048Bytes; + if (str8_match(string, str8_lit("align_4096"), 0)) return COFF_SectionFlag_Align4096Bytes; + if (str8_match(string, str8_lit("align_8192"), 0)) return COFF_SectionFlag_Align8192Bytes; + if (str8_match(string, str8_lit("lnk_nreloc_ovfl"), 0)) return COFF_SectionFlag_LnkNRelocOvfl; + if (str8_match(string, str8_lit("mem_discardable"), 0)) return COFF_SectionFlag_MemDiscardable; + if (str8_match(string, str8_lit("mem_not_cached"), 0)) return COFF_SectionFlag_MemNotCached; + if (str8_match(string, str8_lit("mem_not_paged"), 0)) return COFF_SectionFlag_MemNotPaged; + if (str8_match(string, str8_lit("mem_shared"), 0)) return COFF_SectionFlag_MemShared; + if (str8_match(string, str8_lit("mem_execute"), 0)) return COFF_SectionFlag_MemExecute; + if (str8_match(string, str8_lit("mem_read"), 0)) return COFF_SectionFlag_MemRead; + if (str8_match(string, str8_lit("mem_write"), 0)) return COFF_SectionFlag_MemWrite; + InvalidPath; + return 0; +} + +internal COFF_SectionFlags +t_coff_parse_section_flags(T_COFF_Parser *parser) +{ + if (parser->token.kind == T_COFF_TokenKind_Number) { + return safe_cast_u32(t_coff_parser_require_u64(parser)); + } + if (parser->token.kind == T_COFF_TokenKind_String || parser->token.kind == T_COFF_TokenKind_Ident) { + String8 name = t_coff_parser_require_name(parser); + if (str8_match(name, str8_lit("code"), 0)) return PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_Align1Bytes; + if (str8_match(name, str8_lit("data"), 0)) return PE_DATA_SECTION_FLAGS; + if (str8_match(name, str8_lit("rdata"), 0)) return PE_RDATA_SECTION_FLAGS; + if (str8_match(name, str8_lit("bss"), 0)) return PE_BSS_SECTION_FLAGS; + return t_coff_section_flag_from_name(name); + } + + COFF_SectionFlags flags = 0; + t_coff_parse_array_begin(parser); + for (;;) { + if (!t_coff_parse_array_next(parser)) { + break; + } + flags |= t_coff_section_flag_from_name(t_coff_parser_require_name(parser)); + t_coff_parse_array_finish_item(parser); + } + return flags; +} + +internal COFF_ComdatSelectType +t_coff_comdat_select_from_string(String8 string) +{ + if (str8_match(string, str8_lit("null"), 0)) return COFF_ComdatSelect_Null; + if (str8_match(string, str8_lit("no_duplicates"), 0)) return COFF_ComdatSelect_NoDuplicates; + if (str8_match(string, str8_lit("any"), 0)) return COFF_ComdatSelect_Any; + if (str8_match(string, str8_lit("same_size"), 0)) return COFF_ComdatSelect_SameSize; + if (str8_match(string, str8_lit("exact_match"), 0)) return COFF_ComdatSelect_ExactMatch; + if (str8_match(string, str8_lit("associative"), 0)) return COFF_ComdatSelect_Associative; + if (str8_match(string, str8_lit("largest"), 0)) return COFF_ComdatSelect_Largest; + InvalidPath; + return 0; +} + +internal COFF_WeakExtType +t_coff_weak_type_from_string(String8 string) +{ + if (str8_match(string, str8_lit("null"), 0)) return COFF_WeakExt_Null; + if (str8_match(string, str8_lit("no_library"), 0)) return COFF_WeakExt_NoLibrary; + if (str8_match(string, str8_lit("search_library"), 0)) return COFF_WeakExt_SearchLibrary; + if (str8_match(string, str8_lit("search_alias"), 0)) return COFF_WeakExt_SearchAlias; + if (str8_match(string, str8_lit("anti_dependency"), 0)) return COFF_WeakExt_AntiDependency; + InvalidPath; + return 0; +} + +internal COFF_SymStorageClass +t_coff_storage_class_from_string(String8 string) +{ + if (str8_match(string, str8_lit("external"), 0)) return COFF_SymStorageClass_External; + if (str8_match(string, str8_lit("static"), 0)) return COFF_SymStorageClass_Static; + if (str8_match(string, str8_lit("section"), 0)) return COFF_SymStorageClass_Section; + if (str8_match(string, str8_lit("weak_external"), 0)) return COFF_SymStorageClass_WeakExternal; + InvalidPath; + return 0; +} + +internal COFF_ImportByType +t_coff_import_by_from_string(String8 string) +{ + if (str8_match(string, str8_lit("ordinal"), 0)) return COFF_ImportBy_Ordinal; + if (str8_match(string, str8_lit("name"), 0)) return COFF_ImportBy_Name; + if (str8_match(string, str8_lit("name_no_prefix"), 0)) return COFF_ImportBy_NameNoPrefix; + if (str8_match(string, str8_lit("undecorate"), 0)) return COFF_ImportBy_Undecorate; + InvalidPath; + return 0; +} + +internal COFF_RelocType +t_coff_x64_reloc_type_from_string(String8 string) +{ + if (str8_match(string, str8_lit("abs"), 0)) return COFF_Reloc_X64_Abs; + if (str8_match(string, str8_lit("addr64"), 0)) return COFF_Reloc_X64_Addr64; + if (str8_match(string, str8_lit("addr32"), 0)) return COFF_Reloc_X64_Addr32; + if (str8_match(string, str8_lit("addr32nb"), 0)) return COFF_Reloc_X64_Addr32Nb; + if (str8_match(string, str8_lit("rel"), 0) || str8_match(string, str8_lit("rel32"), 0)) return COFF_Reloc_X64_Rel32; + if (str8_match(string, str8_lit("section"), 0)) return COFF_Reloc_X64_Section; + if (str8_match(string, str8_lit("secrel"), 0)) return COFF_Reloc_X64_SecRel; + if (str8_match(string, str8_lit("token"), 0)) return COFF_Reloc_X64_Token; + if (str8_match(string, str8_lit("pair"), 0)) return COFF_Reloc_X64_Pair; + InvalidPath; + return 0; +} + +internal COFF_ObjSection * +t_coff_require_section(T_COFF_IdMap *map, String8 id) +{ + COFF_ObjSection *section = t_coff_id_map_find(map, id); + AssertAlways(section != 0); + return section; +} + +internal COFF_ObjSymbol * +t_coff_require_symbol(T_COFF_IdMap *map, String8 id) +{ + COFF_ObjSymbol *symbol = t_coff_id_map_find(map, id); + AssertAlways(symbol != 0); + return symbol; +} + +internal void +t_coff_enqueue_section_relocs(T_COFF_ObjParseCtx *ctx, T_COFF_Parser parser, String8 section_id) +{ + T_COFF_PendingRelocNode *node = push_array(ctx->arena, T_COFF_PendingRelocNode, 1); + node->parser = parser; + node->section_id = push_str8_copy(ctx->arena, section_id); + SLLQueuePush(ctx->pending_reloc_first, ctx->pending_reloc_last, node); +} + +internal void +t_coff_parse_obj_section(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) +{ + String8 id = {0}; + String8 name = {0}; + String8 data = {0}; + COFF_SectionFlags flags = 0; + T_COFF_Parser relocs_parser = {0}; + B32 has_relocs = 0; + + t_coff_parse_object_begin(parser); + for (String8 key = {0}; t_coff_parse_object_next(parser, &key); t_coff_parse_object_finish_field(parser)) { + if (str8_match(key, str8_lit("id"), 0)) { id = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("name"), 0)) { name = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("flags"), 0)) { flags = t_coff_parse_section_flags(parser); } + else if (str8_match(key, str8_lit("data"), 0)) { data = t_coff_parse_data_bytes(ctx->arena, parser); } + else if (str8_match(key, str8_lit("relocs"), 0)) { + relocs_parser = *parser; + t_coff_skip_value(parser); + has_relocs = 1; + } + else { InvalidPath; } + } + + // must be defined: + AssertAlways(name.size); + AssertAlways(id.size); + + t_coff_id_map_insert(&ctx->sections, id, coff_obj_writer_push_section(ctx->writer, name, flags, data)); + if (has_relocs) { + t_coff_enqueue_section_relocs(ctx, relocs_parser, id); + } +} + +internal void +t_coff_parse_obj_symbol(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser, String8 default_kind) +{ + String8 kind = default_kind; + String8 name = {0}; + String8 section_id = {0}; + String8 head = {0}; + String8 associate = {0}; + String8 tag = {0}; + U32 value = 0; + U32 size = 0; + COFF_ComdatSelectType selection = COFF_ComdatSelect_Null; + COFF_WeakExtType characteristics = COFF_WeakExt_Null; + COFF_SymStorageClass storage_class = COFF_SymStorageClass_External; + + t_coff_parse_object_begin(parser); + for (String8 key = {0}; t_coff_parse_object_next(parser, &key);) { + if (str8_match(key, str8_lit("kind"), 0 )) { kind = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("name"), 0 )) { name = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("value"), 0 )) { value = safe_cast_u32(t_coff_parser_require_u64(parser)); } + else if (str8_match(key, str8_lit("size"), 0 )) { size = safe_cast_u32(t_coff_parser_require_u64(parser)); } + else if (str8_match(key, str8_lit("section"), 0 )) { section_id = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("head"), 0 )) { head = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("associate"), 0 )) { associate = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("selection"), 0 )) { selection = t_coff_comdat_select_from_string(t_coff_parser_require_name(parser)); } + else if (str8_match(key, str8_lit("characteristics"), 0 )) { characteristics = t_coff_weak_type_from_string(t_coff_parser_require_name(parser)); } + else if (str8_match(key, str8_lit("tag"), 0 )) { tag = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("storage_class"), 0 )) { storage_class = t_coff_storage_class_from_string(t_coff_parser_require_name(parser)); } + else InvalidPath; + t_coff_parse_object_finish_field(parser); + } + + COFF_ObjSymbol *symbol = 0; + if (str8_match(kind, str8_lit("extern_func"), 0 )) { symbol = coff_obj_writer_push_symbol_extern_func(ctx->writer, name, value, t_coff_require_section(&ctx->sections, section_id)); } + else if (str8_match(kind, str8_lit("extern"), 0 )) { symbol = coff_obj_writer_push_symbol_extern (ctx->writer, name, value, t_coff_require_section(&ctx->sections, section_id)); } + else if (str8_match(kind, str8_lit("static"), 0 )) { symbol = coff_obj_writer_push_symbol_static (ctx->writer, name, value, t_coff_require_section(&ctx->sections, section_id)); } + else if (str8_match(kind, str8_lit("secdef"), 0 )) { symbol = coff_obj_writer_push_symbol_secdef (ctx->writer, t_coff_require_section(&ctx->sections, section_id), selection); } + else if (str8_match(kind, str8_lit("associative"), 0 )) { symbol = coff_obj_writer_push_symbol_associative(ctx->writer, t_coff_require_section(&ctx->sections, head), t_coff_require_section(&ctx->sections, associate)); } + else if (str8_match(kind, str8_lit("weak"), 0 )) { symbol = coff_obj_writer_push_symbol_weak (ctx->writer, name, characteristics, t_coff_require_symbol(&ctx->symbols, tag)); } + else if (str8_match(kind, str8_lit("abs"), 0 )) { symbol = coff_obj_writer_push_symbol_abs (ctx->writer, name, value, storage_class); } + else if (str8_match(kind, str8_lit("undef"), 0 )) { symbol = coff_obj_writer_push_symbol_undef (ctx->writer, name); } + else if (str8_match(kind, str8_lit("undef_func"), 0 )) { symbol = coff_obj_writer_push_symbol_undef_func (ctx->writer, name); } + else if (str8_match(kind, str8_lit("undef_sect"), 0 )) { symbol = coff_obj_writer_push_symbol_undef_sect (ctx->writer, name, value); } + else if (str8_match(kind, str8_lit("sect"), 0 )) { symbol = coff_obj_writer_push_symbol_sect (ctx->writer, name, t_coff_require_section(&ctx->sections, section_id)); } + else if (str8_match(kind, str8_lit("common"), 0 )) { symbol = coff_obj_writer_push_symbol_common (ctx->writer, name, size); } + else { InvalidPath; } + + if (name.size) { + t_coff_id_map_insert(&ctx->symbols, name, symbol); + } +} + +internal void +t_coff_parse_obj_reloc(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser, String8 default_kind, String8 implicit_section_id) +{ + String8 kind = default_kind; + String8 section_id = implicit_section_id; + String8 symbol_id = {0}; + String8 type_name = {0}; + U32 apply_off = 0; + t_coff_parse_object_begin(parser); + for (String8 key = {0}; t_coff_parse_object_next(parser, &key); t_coff_parse_object_finish_field(parser)) { + if (str8_match(key, str8_lit("kind"), 0)) { kind = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("section"), 0)) { section_id = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("symbol"), 0)) { symbol_id = t_coff_parser_require_name(parser); } + else if (str8_match(key, str8_lit("apply_off"), 0)) { apply_off = safe_cast_u32(t_coff_parser_require_u64(parser)); } + else if (str8_match(key, str8_lit("type"), 0)) { type_name = t_coff_parser_require_name(parser); } + else { InvalidPath; } + } + + switch (ctx->writer->machine) { + case COFF_MachineType_Unknown: break; + case COFF_MachineType_X64: { + COFF_ObjSection *section = t_coff_require_section(&ctx->sections, section_id); + COFF_ObjSymbol *symbol = t_coff_require_symbol(&ctx->symbols, symbol_id); + if (str8_match(kind, str8_lit("generic"), 0) || str8_match(kind, str8_lit("reloc"), 0)) { + coff_obj_writer_section_push_reloc(ctx->writer, section, apply_off, symbol, t_coff_x64_reloc_type_from_string(type_name)); + } else if (str8_match(kind, str8_lit("rel32"), 0)) { + coff_obj_writer_section_push_reloc_rel32(ctx->writer, section, apply_off, symbol); + } else if (str8_match(kind, str8_lit("addr32"), 0)) { + coff_obj_writer_section_push_reloc_addr32(ctx->writer, section, apply_off, symbol); + } else if (str8_match(kind, str8_lit("addr"), 0) || str8_match(kind, str8_lit("addr64"), 0)) { + coff_obj_writer_section_push_reloc_addr(ctx->writer, section, apply_off, symbol); + } else if (str8_match(kind, str8_lit("voff"), 0) || str8_match(kind, str8_lit("addr32nb"), 0)) { + coff_obj_writer_section_push_reloc_voff(ctx->writer, section, apply_off, symbol); + } else { + InvalidPath; + } + } break; + } +} + +internal void +t_coff_parse_obj_directive(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) +{ + String8 value = {0}; + if (parser->token.kind == T_COFF_TokenKind_String || parser->token.kind == T_COFF_TokenKind_Ident) { + value = t_coff_parser_require_name(parser); + } else { + t_coff_parse_object_begin(parser); + for (;;) { + String8 key = {0}; + if (!t_coff_parse_object_next(parser, &key)) break; + if (str8_match(key, str8_lit("value"), 0)) value = t_coff_parser_require_name(parser); + else InvalidPath; + t_coff_parse_object_finish_field(parser); + } + } + coff_obj_writer_push_directive(ctx->writer, value); +} + +internal void +t_coff_parse_obj_sections(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) +{ + t_coff_parse_array_begin(parser); + for (;;) { + if (!t_coff_parse_array_next(parser)) break; + t_coff_parse_obj_section(ctx, parser); + t_coff_parse_array_finish_item(parser); + } +} + +internal void +t_coff_parse_obj_symbols(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) +{ + t_coff_parse_array_begin(parser); + for (;;) { + if (!t_coff_parse_array_next(parser)) break; + t_coff_parse_obj_symbol(ctx, parser, str8_zero()); + t_coff_parse_array_finish_item(parser); + } +} + +internal void +t_coff_parse_obj_directives(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) +{ + t_coff_parse_array_begin(parser); + for (;;) { + if (!t_coff_parse_array_next(parser)) break; + t_coff_parse_obj_directive(ctx, parser); + t_coff_parse_array_finish_item(parser); + } +} + +internal String8 +t_coff_parse_obj(Arena *arena, T_COFF_Parser *parser) +{ + T_COFF_ObjParseCtx ctx = { + .arena = arena, + .writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown), + .sections.arena = arena, + .symbols.arena = arena + }; + + t_coff_parse_object_begin(parser); + for (String8 key = {0}; t_coff_parse_object_next(parser, &key); t_coff_parse_object_finish_field(parser)) { + if (str8_match(key, str8_lit("machine"), 0)) { ctx.writer->machine = coff_machine_from_string(t_coff_parser_require_name(parser)); } + else if (str8_match(key, str8_lit("time_stamp"), 0)) { ctx.writer->time_stamp = safe_cast_u32(t_coff_parser_require_u64(parser)); } + else if (str8_match(key, str8_lit("sections"), 0)) { t_coff_parse_obj_sections(&ctx, parser); } + else if (str8_match(key, str8_lit("symbols"), 0)) { t_coff_parse_obj_symbols(&ctx, parser); } + else if (str8_match(key, str8_lit("directives"), 0)) { t_coff_parse_obj_directives(&ctx, parser); } + else { InvalidPath; } + } + + String8 result = coff_obj_writer_serialize(arena, ctx.writer); + coff_obj_writer_release(&ctx.writer); + return result; +} + +internal String8 +t_coff_parse_lib(Arena *arena, T_COFF_Parser *parser) +{ + COFF_TimeStamp time_stamp = 0; + U16 mode = 0; + B32 emit_second_member = 1; + COFF_LibWriter *writer = coff_lib_writer_alloc(); + + t_coff_parse_object_begin(parser); + for (String8 key = {0}; t_coff_parse_object_next(parser, &key); t_coff_parse_object_finish_field(parser)) { + if (str8_match(key, str8_lit("time_stamp"), 0)) { + time_stamp = safe_cast_u32(t_coff_parser_require_u64(parser)); + } else if (str8_match(key, str8_lit("mode"), 0)) { + mode = safe_cast_u16(t_coff_parser_require_u64(parser)); + } else if (str8_match(key, str8_lit("emit_second_member"), 0)) { + emit_second_member = !!t_coff_parser_require_u64(parser); + } else if (str8_match(key, str8_lit("import"), 0)) { + String8 dll_name = {0}; + String8 name = {0}; + COFF_ImportByType import_by = COFF_ImportBy_Name; + U16 hint_or_ordinal = 0; + COFF_ImportType type = COFF_ImportHeader_Code; + t_coff_parse_object_begin(parser); + for (String8 field = {0}; t_coff_parse_object_next(parser, &field); t_coff_parse_object_finish_field(parser)) { + if (str8_match(field, str8_lit("dll_name"), 0)) { dll_name = t_coff_parser_require_name(parser); } + else if (str8_match(field, str8_lit("name"), 0)) { name = t_coff_parser_require_name(parser); } + else if (str8_match(field, str8_lit("import_by"), 0)) { import_by = t_coff_import_by_from_string(t_coff_parser_require_name(parser)); } + else if (str8_match(field, str8_lit("hint_or_ordinal"), 0)) { hint_or_ordinal = safe_cast_u16(t_coff_parser_require_u64(parser)); } + else if (str8_match(field, str8_lit("type"), 0)) { type = coff_import_header_type_from_string(t_coff_parser_require_name(parser)); } + else { InvalidPath; } + } + coff_lib_writer_push_import(writer, COFF_MachineType_X64, time_stamp, dll_name, import_by, name, hint_or_ordinal, type); + } else if (str8_match(key, str8_lit("obj"), 0)) { + String8 path = {0}; + String8 data = {0}; + t_coff_parse_object_begin(parser); + for (String8 field = {0}; t_coff_parse_object_next(parser, &field); t_coff_parse_object_finish_field(parser)) { + if (str8_match(field, str8_lit("path"), 0)) path = t_coff_parser_require_name(parser); + else if (str8_match(field, str8_lit("data"), 0)) data = t_coff_parse_obj(arena, parser); + else InvalidPath; + } + coff_lib_writer_push_obj(writer, path, data); + } else { + InvalidPath; + } + } + + String8 result = coff_lib_writer_serialize(arena, writer, time_stamp, mode, emit_second_member); + coff_lib_writer_release(&writer); + return result; +} + +internal String8 +t_coff_parse_root(Arena *arena, T_COFF_Parser *parser) +{ + String8 root_name = t_coff_parser_require_name(parser); + t_coff_parser_require_punct(parser, ':'); + if (str8_match(root_name, str8_lit("obj"), 0)) { return t_coff_parse_obj(arena, parser); } + if (str8_match(root_name, str8_lit("lib"), 0)) { return t_coff_parse_lib(arena, parser); } + return str8_zero(); +} + +internal String8 +t_coff_from_string(Arena *arena, String8 string) +{ + T_COFF_Parser parser = { .source = string }; + t_coff_parser_next(&parser); + String8 result = t_coff_parse_root(arena, &parser); + if (parser.token.kind == T_COFF_TokenKind_Punct && parser.token.punct == '}') { + t_coff_parser_next(&parser); + } + AssertAlways(parser.token.kind == T_COFF_TokenKind_EOF); + return result; +} + +internal String8 +t_coff_lib_from_string(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "'lib': {"); + str8_list_push(scratch.arena, &list, string); + str8_list_pushf(scratch.arena, &list, "}"); + String8 wrapped = str8_list_join(scratch.arena, &list, &(StringJoin){ .sep = str8_lit("\n") }); + String8 result = t_coff_from_string(arena, wrapped); + scratch_end(scratch); + return result; +} + +internal String8 +t_coff_obj_from_string(Arena *arena, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + str8_list_pushf(scratch.arena, &list, "'obj': {"); + str8_list_push(scratch.arena, &list, string); + str8_list_pushf(scratch.arena, &list, "}"); + String8 wrapped = str8_list_join(scratch.arena, &list, &(StringJoin){ .sep = str8_lit("\n") }); + String8 result = t_coff_from_string(arena, wrapped); + scratch_end(scratch); + return result; +} + +//////////////////////////////// + internal String8 t_make_sec_defn_obj(Arena *arena, String8 payload) { @@ -3681,6 +4465,72 @@ TEST(second_member_header) T_Ok(g_last_exit_code == 0); } +#if 0 +TEST(multibyte) +{ + String8 a_obj = t_coff_obj_from_string(arena, str8_lit("'machine': 'x64', \n\ + 'sections': [ \n\ + { \n\ + 'id': 'text', \n\ + 'name': '.text', \n\ + 'flags': 'code', \n\ + 'data': [ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, \n\ + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 ], \n\ + 'relocs': [ \n\ + { 'kind': 'rel32', 'apply_off': 2, 'symbol': 'foo' }, \n\ + ], \n\ + }, \n\ + ], \n\ + 'symbols': [ \n\ + { 'kind': 'extern_func', 'name': 'use_imports', 'value': 0, 'section': 'text' }, \n\ + { 'kind': 'undef', 'name': 'foo' }, \n\ + ]")); + + String8 aa_obj = t_coff_obj_from_string(arena, str8_lit("'machine': 'x64', \n\ + 'sections': [ \n\ + { \n\ + 'id': 'text', \n\ + 'name': '.text', \n\ + 'flags': 'code', \n\ + 'data': [ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, \n\ + 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 ], \n\ + 'relocs': [ \n\ + { 'kind': 'rel32', 'apply_off': 2, 'symbol': '__imp_foo' }, \n\ + ], \n\ + }, \n\ + ], \n\ + 'symbols': [ \n\ + { 'kind': 'extern_func', 'name': 'use_imports', 'value': 0, 'section': 'text' }, \n\ + { 'kind': 'undef', 'name': '__imp_foo' }, \n\ + ]")); + + String8 b_lib = t_coff_lib_from_string(arena, str8_lit("'import': { \n\ + 'dll_name': 'foo.dll', \n\ + 'name': 'foo', \n\ + 'import_by': 'name', \n\ + 'hint_or_ordinal': 0, \n\ + 'type': 'code', \n\ + }")); + + String8 c_lib = t_coff_lib_from_string(arena, str8_lit("'import': { \n\ + 'dll_name': 'foo.dll', \n\ + 'name': '__imp_foo', \n\ + 'import_by': 'name', \n\ + 'hint_or_ordinal': 0, \n\ + 'type': 'code', \n\ + }")); + + T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + T_Ok(t_write_file(str8_lit("aa.obj"), aa_obj)); + T_Ok(t_write_file(str8_lit("b.lib"), b_lib)); + T_Ok(t_write_file(str8_lit("c.lib"), c_lib)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.lib c.lib entry.obj /include:use_imports"); + T_Ok(g_last_exit_code == 0); +} +#endif + TEST(defer_impl_link_to_second_search_pass) { String8 imp_ref_obj; @@ -5994,4 +6844,3 @@ TEST(fold_with_largest_align) #endif #undef T_Group - From d2eb9628ba118a37a3048576971b9640a577dd1a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 12:31:42 -0700 Subject: [PATCH 441/850] test cases for ambiguous statics across many units; comments in exprs --- src/dbg_info/dbg_info.c | 40 +++++---- src/dbg_info/dbg_info.h | 2 +- src/eval/eval.mdesk | 1 + src/eval/eval_parse.c | 150 +++++++++++---------------------- src/eval/eval_parse.h | 1 - src/eval/generated/eval.meta.c | 3 +- src/eval/generated/eval.meta.h | 3 +- src/mule/mule_c.c | 11 ++- 8 files changed, 89 insertions(+), 122 deletions(-) diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 6a17d6f2..8e90de47 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1519,12 +1519,12 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g Temp scratch = scratch_begin(0, 0); //- rjf: unpack key - U64 index = 0; + U64 index = 0; String8 name = {0}; DI_Key preferred_key = {0}; { U64 key_read_off = 0; - key_read_off += str8_deserial_read_struct(key, key_read_off, &index); + key_read_off += str8_deserial_read_struct(key, key_read_off, &index); key_read_off += str8_deserial_read_struct(key, key_read_off, &preferred_key); key_read_off += str8_deserial_read_struct(key, key_read_off, &name.size); name.str = push_array_no_zero(scratch.arena, U8, name.size); @@ -1657,12 +1657,14 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g RDI_NameMapNode *map_node = rdi_name_map_lookup(rdi, &parsed_name_map, leaf_part_of_name.str, leaf_part_of_name.size); U32 matches_count = 0; U32 *matches = rdi_matches_from_map_node(rdi, map_node, &matches_count); - - // rjf: do we have a container? -> filter matches according to container string also + + // rjf: do we have a container? -> filter matches according to container string also + U32 *filtered_matches = matches; + U32 filtered_matches_count = matches_count; if(container_part_of_name.size != 0) - { - U32 *filtered_matches = push_array(scratch.arena, U32, matches_count); - U32 filtered_matches_count = 0; + { + filtered_matches = push_array(scratch.arena, U32, matches_count); + filtered_matches_count = 0; for EachIndex(match_idx, matches_count) { Temp scratch = scratch_begin(0, 0); @@ -1699,17 +1701,23 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g } scratch_end(scratch); } - matches = filtered_matches; - matches_count = filtered_matches_count; - } - + } + + // rjf: do we have a specific unit queried? -> filter matches according to containing unit +#if 0 + if(target_unit_index != 0) + { + + } +#endif + // rjf: given matches, pick selected & return as result - if(matches_count != 0) + if(filtered_matches_count != 0) { - U64 selected_match_idx = (matches_count-1) - Min(index, matches_count-1); + U64 selected_match_idx = (filtered_matches_count-1) - Min(index, filtered_matches_count-1); lane_matches[lane_idx()].key = dbgi_key; lane_matches[lane_idx()].section_kind = name_map_section_kinds[name_map_kind_idx]; - lane_matches[lane_idx()].idx = matches[selected_match_idx]; + lane_matches[lane_idx()].idx = filtered_matches[selected_match_idx]; } } } @@ -1753,14 +1761,14 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g } internal DI_Match -di_match_from_string(String8 string, U64 index, DI_Key preferred_dbgi_key, U64 endt_us) +di_match_from_string(String8 string, U64 match_index, DI_Key preferred_dbgi_key, U64 endt_us) { DI_Match result = {0}; Access *access = access_open(); Temp scratch = scratch_begin(0, 0); { String8List key_parts = {0}; - str8_list_push(scratch.arena, &key_parts, str8_struct(&index)); + str8_list_push(scratch.arena, &key_parts, str8_struct(&match_index)); str8_list_push(scratch.arena, &key_parts, str8_struct(&preferred_dbgi_key)); str8_list_push(scratch.arena, &key_parts, str8_struct(&string.size)); str8_list_push(scratch.arena, &key_parts, string); diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index f2ff52f5..5355e6c0 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -360,6 +360,6 @@ internal DI_SearchItemArray di_search_item_array_from_target_query(Access *acces //~ rjf: Match Artifact Cache Hooks / Lookups internal AC_Artifact di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal DI_Match di_match_from_string(String8 string, U64 index, DI_Key preferred_dbgi_key, U64 endt_us); +internal DI_Match di_match_from_string(String8 string, U64 match_index, DI_Key preferred_dbgi_key, U64 endt_us); #endif // DBG_INFO_H diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index ae0e0459..3bf48031 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -10,6 +10,7 @@ E_TokenKindTable: {StringLiteral} {CharLiteral} {Symbol} + {Comment} } @table(name basic_string basic_byte_size) diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 00374472..bb44589f 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -74,6 +74,7 @@ e_token_array_from_text(Arena *arena, String8 text) B32 active_token_kind_started_with_tick = 0; B32 escaped = 0; B32 exp = 0; + B32 comment_is_explicit_ender = 0; for(U64 idx = 0, advance = 0; idx <= text.size; idx += advance) { U8 byte = (idx+0 < text.size) ? text.str[idx+0] : 0; @@ -114,11 +115,23 @@ e_token_array_from_text(Arena *arena, String8 text) byte == ']' || byte == '{' || byte == '}' || byte == ':' || byte == ';' || byte == ',' || byte == '.' || byte == '<' || byte == '>' || byte == '/' || byte == '?' || byte == '|' || - byte == '#') + byte == '#' || byte == '@') { active_token_kind = E_TokenKind_Symbol; active_token_start_idx = idx; } + else if(byte == '/' && byte_next == '/') + { + active_token_kind = E_TokenKind_Comment; + active_token_start_idx = idx; + comment_is_explicit_ender = 0; + } + else if(byte == '/' && byte_next == '*') + { + active_token_kind = E_TokenKind_Comment; + active_token_start_idx = idx; + comment_is_explicit_ender = 1; + } }break; //- rjf: active tokens -> seek enders @@ -226,12 +239,24 @@ e_token_array_from_text(Arena *arena, String8 text) byte != ']' && byte != '{' && byte != '}' && byte != ':' && byte != ';' && byte != ',' && byte != '.' && byte != '<' && byte != '>' && byte != '/' && byte != '?' && byte != '|' && - byte != '#') + byte != '#' && byte != '@') { advance = 0; token_formed = 1; } }break; + case E_TokenKind_Comment: + { + if(byte == 0) + { + token_formed = 1; + } + else if(comment_is_explicit_ender && byte == '*' && byte_next == '/') + { + token_formed = 1; + advance = 2; + } + }break; } //- rjf: token formed -> push new formed token(s) @@ -650,97 +675,6 @@ e_type_key_from_expr(E_Expr *expr) return result; } -internal E_Parse -e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens) -{ - E_Parse parse = {tokens, 0, &e_expr_nil, &e_expr_nil}; - E_Token *token_it = tokens.v; - - //- rjf: parse unsigned marker - B32 unsigned_marker = 0; - { - E_Token token = e_token_at_it(token_it, &tokens); - if(token.kind == E_TokenKind_Identifier) - { - String8 token_string = str8_substr(text, token.range); - if(str8_match(token_string, str8_lit("unsigned"), 0)) - { - token_it += 1; - unsigned_marker = 1; - } - } - } - - //- rjf: parse base type - { - E_Token token = e_token_at_it(token_it, &tokens); - if(token.kind == E_TokenKind_Identifier) - { - String8 token_string = str8_substr(text, token.range); - if(token_string.size >= 2 && - token_string.str[0] == '`' && - token_string.str[token_string.size-1] == '`') - { - token_string = str8_substr(token_string, r1u64(1, token_string.size-1)); - } - E_TypeKey type_key = e_leaf_type_key_from_name(token_string); - if(!e_type_key_match(e_type_key_zero(), type_key)) - { - token_it += 1; - - // rjf: apply unsigned marker to base type - if(unsigned_marker) switch(e_type_kind_from_key(type_key)) - { - default:{}break; - case E_TypeKind_Char8: {type_key = e_type_key_basic(E_TypeKind_UChar8);}break; - case E_TypeKind_Char16:{type_key = e_type_key_basic(E_TypeKind_UChar16);}break; - case E_TypeKind_Char32:{type_key = e_type_key_basic(E_TypeKind_UChar32);}break; - case E_TypeKind_S8: {type_key = e_type_key_basic(E_TypeKind_U8);}break; - case E_TypeKind_S16: {type_key = e_type_key_basic(E_TypeKind_U16);}break; - case E_TypeKind_S32: {type_key = e_type_key_basic(E_TypeKind_U32);}break; - case E_TypeKind_S64: {type_key = e_type_key_basic(E_TypeKind_U64);}break; - case E_TypeKind_S128:{type_key = e_type_key_basic(E_TypeKind_U128);}break; - case E_TypeKind_S256:{type_key = e_type_key_basic(E_TypeKind_U256);}break; - case E_TypeKind_S512:{type_key = e_type_key_basic(E_TypeKind_U512);}break; - } - - // rjf: construct leaf type - parse.expr = e_push_expr(arena, E_ExprKind_TypeIdent, token.range); - parse.expr->type_key = type_key; - } - } - } - - //- rjf: parse extensions - if(parse.expr != &e_expr_nil) - { - for(;;) - { - E_Token token = e_token_at_it(token_it, &tokens); - if(token.kind != E_TokenKind_Symbol) - { - break; - } - String8 token_string = str8_substr(text, token.range); - if(str8_match(token_string, str8_lit("*"), 0)) - { - token_it += 1; - E_Expr *ptee = parse.expr; - parse.expr = e_push_expr(arena, E_ExprKind_Ptr, token.range); - e_expr_push_child(parse.expr, ptee); - } - else - { - break; - } - } - } - - //- rjf: fill parse & end - parse.last_token = token_it; - return parse; -} - internal E_Parse e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count) { @@ -847,14 +781,14 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t } // rjf: try 'unsigned' marker - if(str8_match(token_string, str8_lit("unsigned"), 0)) + if(token.kind == E_TokenKind_Identifier && str8_match(token_string, str8_lit("unsigned"), 0)) { prefix_unary_kind = E_ExprKind_Unsigned; prefix_unary_precedence = 2; } // rjf: try explicit cast - if(str8_match(token_string, str8_lit("cast"), 0)) + if(token.kind == E_TokenKind_Identifier && str8_match(token_string, str8_lit("cast"), 0)) { // rjf: consume cast & open paren E_Token open_paren_maybe = e_token_at_it(it+1, &tokens); @@ -923,14 +857,28 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { E_Token token = e_token_at_it(it, &tokens); String8 token_string = str8_substr(text, token.range); - if(token.kind == E_TokenKind_Identifier) + if(token.kind == E_TokenKind_Identifier || token.kind == E_TokenKind_StringLiteral) { - E_Token next_token = e_token_at_it(it+1, &tokens); - String8 next_token_string = str8_substr(text, next_token.range); - if(next_token.range.min == token.range.max && next_token.kind == E_TokenKind_Symbol && str8_match(next_token_string, str8_lit(":"), 0)) + // rjf: look for extensions - for qualifiers of the form `foo.dll!bar` + U64 token_ext_count = 0; + E_Token dot_maybe_token = e_token_at_it(it+1, &tokens); + String8 dot_maybe_token_string = str8_substr(text, dot_maybe_token.range); + E_Token ext_maybe_token = e_token_at_it(it+2, &tokens); + String8 ext_maybe_token_string = str8_substr(text, ext_maybe_token.range); + if(dot_maybe_token.kind == E_TokenKind_Symbol && + ext_maybe_token.kind == E_TokenKind_Identifier && + str8_match(dot_maybe_token_string, str8_lit("."), 0)) { - it += 2; - resolution_qualifier = token_string; + token_ext_count = 2; + } + + // rjf: look for : or ! + E_Token next_token = e_token_at_it(it+1+token_ext_count, &tokens); + String8 next_token_string = str8_substr(text, next_token.range); + if(next_token.kind == E_TokenKind_Symbol && (str8_match(next_token_string, str8_lit(":"), 0) || str8_match(next_token_string, str8_lit("!"), 0))) + { + it += 2 + token_ext_count; + resolution_qualifier = str8_substr(text, union_1u64(token.range, r1u64(token.range.min, next_token.range.min))); } } } diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 1f14b160..f9f8f22f 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -37,7 +37,6 @@ internal String8 e_string_from_expr(Arena *arena, E_Expr *expr, String8 parent_e internal E_TypeKey e_leaf_builtin_type_key_from_name(String8 name); internal E_TypeKey e_leaf_type_key_from_name(String8 name); internal E_TypeKey e_type_key_from_expr(E_Expr *expr); -internal E_Parse e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens); internal E_Parse e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count); internal E_Parse e_push_parse_from_string(Arena *arena, String8 text); diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index 5459b3a4..caab4db9 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -4,7 +4,7 @@ //- GENERATED CODE C_LINKAGE_BEGIN -String8 e_token_kind_strings[6] = +String8 e_token_kind_strings[7] = { str8_lit_comp("Null"), str8_lit_comp("Identifier"), @@ -12,6 +12,7 @@ str8_lit_comp("Numeric"), str8_lit_comp("StringLiteral"), str8_lit_comp("CharLiteral"), str8_lit_comp("Symbol"), +str8_lit_comp("Comment"), }; String8 e_type_kind_basic_string_table[61] = diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 26785c11..65847eb1 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -14,6 +14,7 @@ E_TokenKind_Numeric, E_TokenKind_StringLiteral, E_TokenKind_CharLiteral, E_TokenKind_Symbol, +E_TokenKind_Comment, E_TokenKind_COUNT, } E_TokenKind; @@ -168,7 +169,7 @@ E_InterpretationCode_COUNT, } E_InterpretationCode; C_LINKAGE_BEGIN -extern String8 e_token_kind_strings[6]; +extern String8 e_token_kind_strings[7]; extern String8 e_type_kind_basic_string_table[61]; extern U8 e_type_kind_basic_byte_size_table[61]; extern String8 e_expr_kind_strings[50]; diff --git a/src/mule/mule_c.c b/src/mule/mule_c.c index e67e42fd..50a0f206 100644 --- a/src/mule/mule_c.c +++ b/src/mule/mule_c.c @@ -98,6 +98,9 @@ struct BitfieldType64 uint64_t is_free : 1; }; +static int mut_xarray[4] = {100, 101, 102, 103}; +static float mut_farray[4] = {100.5f, 101.5f, 102.5f, 103.5f}; + void c_type_with_bitfield_usage(void) { @@ -113,5 +116,11 @@ c_type_with_bitfield_usage(void) BitfieldType64 b64 = {0}; b64.size = 524288; b64.is_free = 1; - int abc = 0; + int abc = mut_xarray[0]; + mut_xarray[0] += 1; + abc += mut_xarray[0]; + abc += mut_xarray[1]; + abc += mut_xarray[2]; + float f = mut_farray[0] + mut_farray[1] + mut_farray[2] + mut_farray[3]; + int w = 0; } From 2388db39988349768dbda3fe3b470dbfd35a9463 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 12:44:08 -0700 Subject: [PATCH 442/850] fold ctrl layer into dbg engine - no benefit to disallowing dependence on debug engine types inside of ctrl, and it has been causing unnecessary barriers for eventual eval magic. --- src/ctrl/ctrl.mdesk | 192 - src/ctrl/ctrl_inc.c | 7 - src/ctrl/ctrl_inc.h | 77 - src/ctrl/generated/ctrl.meta.c | 208 - src/ctrl/generated/ctrl.meta.h | 79 - src/dbg_engine/dbg_engine.mdesk | 190 + src/dbg_engine/dbg_engine_core.c | 2255 +-- src/dbg_engine/dbg_engine_core.h | 549 +- .../dbg_engine_ctrl.c} | 14379 ++++++++-------- .../dbg_engine_ctrl.h} | 1697 +- src/dbg_engine/dbg_engine_inc.c | 2 + src/dbg_engine/dbg_engine_inc.h | 2 + src/dbg_engine/dbg_engine_user.c | 2255 +++ src/dbg_engine/dbg_engine_user.h | 486 + src/dbg_engine/generated/dbg_engine.meta.c | 203 + src/dbg_engine/generated/dbg_engine.meta.h | 70 + src/raddbg/raddbg_main.c | 6 +- 17 files changed, 11279 insertions(+), 11378 deletions(-) delete mode 100644 src/ctrl/ctrl.mdesk delete mode 100644 src/ctrl/ctrl_inc.c delete mode 100644 src/ctrl/ctrl_inc.h delete mode 100644 src/ctrl/generated/ctrl.meta.c delete mode 100644 src/ctrl/generated/ctrl.meta.h rename src/{ctrl/ctrl_core.c => dbg_engine/dbg_engine_ctrl.c} (97%) rename src/{ctrl/ctrl_core.h => dbg_engine/dbg_engine_ctrl.h} (69%) create mode 100644 src/dbg_engine/dbg_engine_user.c create mode 100644 src/dbg_engine/dbg_engine_user.h diff --git a/src/ctrl/ctrl.mdesk b/src/ctrl/ctrl.mdesk deleted file mode 100644 index 9f5d3fa6..00000000 --- a/src/ctrl/ctrl.mdesk +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Entity Kinds - -@table(name code_name display_string) -CTRL_EntityKindTable: -{ - {Root root "Root" } - {Machine machine "Machine" } - {Process process "Process" } - {Thread thread "Thread" } - {Module module "Module" } - {EntryPoint entry_point "Entry Point" } - {DebugInfoPath debug_info_path "Debug Info Path" } - {PendingThreadName pending_thread_name "Pending Thread Name" } - {PendingThreadColor pending_thread_color "Pending Thread Color" } - {Breakpoint breakpoint "Breakpoint" } - {AddressRangeAnnotation address_range_annotation "Address Range Annotation" } -} - -@enum CTRL_EntityKind: -{ - Null, - @expand(CTRL_EntityKindTable a) `$(a.name)`, - COUNT, -} - -@data(String8) ctrl_entity_kind_code_name_table: -{ - `{0}`, - @expand(CTRL_EntityKindTable a) `str8_lit_comp("$(a.code_name)")` -} - -@data(String8) ctrl_entity_kind_display_string_table: -{ - `{0}`, - @expand(CTRL_EntityKindTable a) `str8_lit_comp("$(a.display_name)")` -} - -//////////////////////////////// -//~ rjf: Exception Codes - -@table(name lower_name code default display_string) -CTRL_ExceptionCodeKindTable: -{ - {Win32CtrlC win32_ctrl_c 0x40010005 1 "(Win32) Control-C" } - {Win32CtrlBreak win32_ctrl_break 0x40010008 1 "(Win32) Control-Break" } - {Win32WinRTOriginateError win32_win_rt_originate_error 0x40080201 0 "(Win32) WinRT Originate Error" } - {Win32WinRTTransformError win32_win_rt_transform_error 0x40080202 0 "(Win32) WinRT Transform Error" } - {Win32RPCCallCancelled win32_rpc_call_cancelled 0x0000071a 0 "(Win32) RPC Call Cancelled" } - {Win32DatatypeMisalignment win32_datatype_misalignment 0x80000002 0 "(Win32) Data Type Misalignment" } - {Win32AccessViolation win32_access_violation 0xc0000005 1 "(Win32) Access Violation" } - {Win32InPageError win32_in_page_error 0xc0000006 0 "(Win32) In Page Error" } - {Win32InvalidHandle win32_invalid_handle 0xc0000008 1 "(Win32) Invalid Handle Specified" } - {Win32NotEnoughQuota win32_not_enough_quota 0xc0000017 0 "(Win32) Not Enough Quota" } - {Win32IllegalInstruction win32_illegal_instruction 0xc000001d 0 "(Win32) Illegal Instruction" } - {Win32CannotContinueException win32_cannot_continue_exception 0xc0000025 0 "(Win32) Cannot Continue From Exception" } - {Win32InvalidExceptionDisposition win32_invalid_exception_disposition 0xc0000026 0 "(Win32) Invalid Exception Disposition Returned By Handler" } - {Win32ArrayBoundsExceeded win32_array_bounds_exceeded 0xc000008c 0 "(Win32) Array Bounds Exceeded" } - {Win32FloatingPointDenormalOperand win32_floating_point_denormal_operand 0xc000008d 0 "(Win32) Floating-Point Denormal Operand" } - {Win32FloatingPointDivisionByZero win32_floating_point_division_by_zero 0xc000008e 0 "(Win32) Floating-Point Division By Zero" } - {Win32FloatingPointInexactResult win32_floating_point_inexact_result 0xc000008f 0 "(Win32) Floating-Point Inexact Result" } - {Win32FloatingPointInvalidOperation win32_floating_point_invalid_operation 0xc0000090 0 "(Win32) Floating-Point Invalid Operation" } - {Win32FloatingPointOverflow win32_floating_point_overflow 0xc0000091 0 "(Win32) Floating-Point Overflow" } - {Win32FloatingPointStackCheck win32_floating_point_stack_check 0xc0000092 0 "(Win32) Floating-Point Stack Check" } - {Win32FloatingPointUnderflow win32_floating_point_underflow 0xc0000093 0 "(Win32) Floating-Point Underflow" } - {Win32IntegerDivisionByZero win32_integer_division_by_zero 0xc0000094 0 "(Win32) Integer Division By Zero" } - {Win32IntegerOverflow win32_integer_overflow 0xc0000095 0 "(Win32) Integer Overflow" } - {Win32PrivilegedInstruction win32_privileged_instruction 0xc0000096 0 "(Win32) Privileged Instruction" } - {Win32StackOverflow win32_stack_overflow 0xc00000fd 0 "(Win32) Stack Overflow" } - {Win32UnableToLocateDLL win32_unable_to_locate_dll 0xc0000135 0 "(Win32) Unable To Locate DLL" } - {Win32OrdinalNotFound win32_ordinal_not_found 0xc0000138 0 "(Win32) Ordinal Not Found" } - {Win32EntryPointNotFound win32_entry_point_not_found 0xc0000139 0 "(Win32) Entry Point Not Found" } - {Win32DLLInitializationFailed win32_dll_initialization_failed 0xc0000142 0 "(Win32) DLL Initialization Failed" } - {Win32FloatingPointSSEMultipleFaults win32_floating_point_sse_multiple_faults 0xc00002b4 0 "(Win32) Floating Point SSE Multiple Faults" } - {Win32FloatingPointSSEMultipleTraps win32_floating_point_sse_multiple_traps 0xc00002b5 0 "(Win32) Floating Point SSE Multiple Traps" } - {Win32AssertionFailed win32_assertion_failed 0xc0000420 1 "(Win32) Assertion Failed" } - {Win32ModuleNotFound win32_module_not_found 0xc06d007e 0 "(Win32) Module Not Found" } - {Win32ProcedureNotFound win32_procedure_not_found 0xc06d007f 0 "(Win32) Procedure Not Found" } - {Win32SanitizerErrorDetected win32_sanitizer_error_detected 0xe073616e 1 "(Win32) Sanitizer Error Detected" } - {Win32SanitizerRawAccessViolation win32_sanitizer_raw_access_violation 0xe0736171 0 "(Win32) Sanitizer Raw Access Violation" } - {Win32DirectXDebugLayer win32_directx_debug_layer 0x0000087a 1 "(Win32) DirectX Debug Layer" } -} - -@enum CTRL_ExceptionCodeKind: -{ - Null, - @expand(CTRL_ExceptionCodeKindTable a) `$(a.name)`, - COUNT, -} - -@data(U32) ctrl_exception_code_kind_code_table: -{ - `0`; - @expand(CTRL_ExceptionCodeKindTable a) `$(a.code)`; -} - -@data(String8) ctrl_exception_code_kind_display_string_table: -{ - `{0}`; - @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)")`; -} - -@data(String8) ctrl_exception_code_kind_lowercase_code_string_table: -{ - `{0}`; - @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)")`; -} - -@data(B8) ctrl_exception_code_kind_default_enable_table: -{ - `0`; - @expand(CTRL_ExceptionCodeKindTable a) `$(a.default)`; -} - -//////////////////////////////// -//~ rjf: Exception Sub-Codes - -@table(name, value) -CTRL_ExceptionSubCodeKindTable: -{ - { W32_FAST_FAIL_LEGACY_GS_VIOLATION 0 } - { W32_FAST_FAIL_VTGUARD_CHECK_FAILURE 1 } - { W32_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2 } - { W32_FAST_FAIL_CORRUPT_LIST_ENTRY 3 } - { W32_FAST_FAIL_INCORRECT_STACK 4 } - { W32_FAST_FAIL_INVALID_ARG 5 } - { W32_FAST_FAIL_GS_COOKIE_INIT 6 } - { W32_FAST_FAIL_FATAL_APP_EXIT 7 } - { W32_FAST_FAIL_RANGE_CHECK_FAILURE 8 } - { W32_FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9 } - { W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10 } - { W32_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11 } - { W32_FAST_FAIL_INVALID_FIBER_SWITCH 12 } - { W32_FAST_FAIL_INVALID_SET_OF_CONTEXT 13 } - { W32_FAST_FAIL_INVALID_REFERENCE_COUNT 14 } - { W32_FAST_FAIL_INVALID_JUMP_BUFFER 18 } - { W32_FAST_FAIL_MRDATA_MODIFIED 19 } - { W32_FAST_FAIL_CERTIFICATION_FAILURE 20 } - { W32_FAST_FAIL_INVALID_EXCEPTION_CHAIN 21 } - { W32_FAST_FAIL_CRYPTO_LIBRARY 22 } - { W32_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23 } - { W32_FAST_FAIL_INVALID_IMAGE_BASE 24 } - { W32_FAST_FAIL_DLOAD_PROTECTION_FAILURE 25 } - { W32_FAST_FAIL_UNSAFE_EXTENSION_CALL 26 } - { W32_FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27 } - { W32_FAST_FAIL_INVALID_BUFFER_ACCESS 28 } - { W32_FAST_FAIL_INVALID_BALANCED_TREE 29 } - { W32_FAST_FAIL_INVALID_NEXT_THREAD 30 } - { W32_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 } - { W32_FAST_FAIL_APCS_DISABLED 32 } - { W32_FAST_FAIL_INVALID_IDLE_STATE 33 } - { W32_FAST_FAIL_MRDATA_PROTECTION_FAILURE 34 } - { W32_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35 } - { W32_FAST_FAIL_INVALID_LOCK_STATE 36 } - { W32_FAST_FAIL_GUARD_JUMPTABLE 37 } - { W32_FAST_FAIL_INVALID_LONGJUMP_TARGET 38 } - { W32_FAST_FAIL_INVALID_DISPATCH_CONTEXT 39 } - { W32_FAST_FAIL_INVALID_THREAD 40 } - { W32_FAST_FAIL_INVALID_SYSCALL_NUMBER 41 } - { W32_FAST_FAIL_INVALID_FILE_OPERATION 42 } - { W32_FAST_FAIL_LPAC_ACCESS_DENIED 43 } - { W32_FAST_FAIL_GUARD_SS_FAILURE 44 } - { W32_FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 } - { W32_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46 } - { W32_FAST_FAIL_INVALID_CONTROL_STACK 47 } - { W32_FAST_FAIL_SET_CONTEXT_DENIED 48 } - { W32_FAST_FAIL_INVALID_IAT 49 } - { W32_FAST_FAIL_HEAP_METADATA_CORRUPTION 50 } - { W32_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51 } - { W32_FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 } - { W32_FAST_FAIL_ENCLAVE_CALL_FAILURE 53 } - { W32_FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54 } - { W32_FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 } - { W32_FAST_FAIL_UNEXPECTED_CALL 56 } - { W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57 } - { W32_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58 } - { W32_FAST_FAIL_FLAGS_CORRUPTION 59 } - { W32_FAST_FAIL_VEH_CORRUPTION 60 } - { W32_FAST_FAIL_ETW_CORRUPTION 61 } - { W32_FAST_FAIL_RIO_ABORT 62 } - { W32_FAST_FAIL_INVALID_PFN 63 } - { W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG 64 } - { W32_FAST_FAIL_CAST_GUARD 65 } - { W32_FAST_FAIL_HOST_VISIBILITY_CHANGE 66 } - { W32_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST 67 } - { W32_FAST_FAIL_PATCH_CALLBACK_FAILED 68 } - { W32_FAST_FAIL_NTDLL_PATCH_FAILED 69 } - { W32_FAST_FAIL_INVALID_FLS_DATA 70 } -} diff --git a/src/ctrl/ctrl_inc.c b/src/ctrl/ctrl_inc.c deleted file mode 100644 index 45213b22..00000000 --- a/src/ctrl/ctrl_inc.c +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#undef LAYER_COLOR -#define LAYER_COLOR 0x969696ff - -#include "ctrl_core.c" diff --git a/src/ctrl/ctrl_inc.h b/src/ctrl/ctrl_inc.h deleted file mode 100644 index 3226e1b2..00000000 --- a/src/ctrl/ctrl_inc.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef CTRL_INC_H -#define CTRL_INC_H - -//////////////////////////////// -//~ NOTE(rjf): Control Layer Overview (2023/8/29) -// -// This layer's purpose is to provide access to the asynchronously-running, low -// level parts of a debugger, running on the debugger client. This primarily -// consists of process control, using the Demon layer (the lower level -// abstraction layer for process control, across multiple OSes), but including -// higher-level concepts, like stepping, breakpoint resolution, conditional -// breakpoint evaluation, and so on. Right now, this just includes process -// control *local to the debugger client machine*. But in the future, this can -// also include communication to multiple target machines, all running their -// own process controller, using the Demon layer. -// -// This part of a debugger must run asynchronously to prevent blocking the UI - -// ideally our debugger is designed such that, if targets are running, the -// debugger frontend is still usable for a variety of purposes. So, in short, -// the asynchronously-running "control thread", implemented by this layer, is -// tasked with communicating with a separately executing "user thread". This -// communication happens in two directions - `user -> ctrl`, and the reverse, -// `ctrl -> user`. -// -// In the case of `user -> ctrl` communication, this is done with a ring buffer -// of "messages" (`CTRL_Msg`), pushed via `ctrl_u2c_push_msgs`. These messages -// include commands like: launching targets, attaching to targets, killing -// targets, detaching from targets, stepping/running, or single stepping. -// -// In the case of `ctrl -> user` communication, this is done with a ring buffer -// of "events" (`CTRL_Event`), popped via `ctrl_c2u_pop_events`. These events -// include information about what happened during the execution of targets - -// including: process/module/thread creation, process/module/thread deletion, -// debug strings, thread name events, memory allocation events, and stop events -// (where stops can be caused by: user breakpoints, traps set for stepping, -// exceptions, halts, or errors). -// -// The various stepping algorithms are implemented with two concepts: (a) the -// "trap net", and (b) "spoofs". -// -// A "trap net" is a term which refers to a set of addresses paired with a set -// of behavioral flags. Before targets run, trap instructions are written to -// these addresses. After targets stop, these addresses are reset to their -// original bytes. These trap instructions cause the debugger's targets to -// stop executing, and based on which behavioral flags are associated with -// the instruction causing the stop, the control thread may adjust parameters -// used for running, then continue execution, or it will not resume target -// execution, and will report stopped events. These behavioral flags can -// include: single-stepping the stopped thread to execute the instruction at -// the trap location, saving a stack pointer "check value" (where this check -// value is compared against when making decisions about whether to continue -// running or not), and so on. It's complicated to unpack why exactly these -// behaviors are useful, but the TL;DR of it is that they are used for a -// variety of stepping behaviors. For example, when doing a "step into" step, -// a `call` instruction can have a trap set at it, and will be marked with -// a "single-step-after" trap flag, as well as the "end stepping" trap flag, -// such that the step operation will complete after the `call` has executed. -// -// A "spoof" is a feature the control layer uses to detect when some thread -// returns from a particular sub-callstack. This is useful when implementing -// "step over" in functions that may be recursive. In short, unlike a trap, -// which writes a trap instruction (like `int3`) into an instruction stream, -// a spoof overwrites a *return address* on some thread's *stack*. This return -// address is not a valid address for executing code -- it is simply a value -// that the debugger can recognize, such that it is notified when the thread -// returns from some level in a callstack. When the thread exits some function, -// it will return to the "spoofed" address, and it will immediately hit an -// exception, because the spoofed address will not be a valid address for -// code execution. At that point, the debugger can move the thread back to -// the pre-spoof return address, and resume execution. - -#include "ctrl_core.h" - -#endif // CTRL_INC_H diff --git a/src/ctrl/generated/ctrl.meta.c b/src/ctrl/generated/ctrl.meta.c deleted file mode 100644 index 09d20976..00000000 --- a/src/ctrl/generated/ctrl.meta.c +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 ctrl_entity_kind_code_name_table[12] = -{ -{0}, -str8_lit_comp("root"), -str8_lit_comp("machine"), -str8_lit_comp("process"), -str8_lit_comp("thread"), -str8_lit_comp("module"), -str8_lit_comp("entry_point"), -str8_lit_comp("debug_info_path"), -str8_lit_comp("pending_thread_name"), -str8_lit_comp("pending_thread_color"), -str8_lit_comp("breakpoint"), -str8_lit_comp("address_range_annotation"), -}; - -String8 ctrl_entity_kind_display_string_table[12] = -{ -{0}, -str8_lit_comp("Root"), -str8_lit_comp("Machine"), -str8_lit_comp("Process"), -str8_lit_comp("Thread"), -str8_lit_comp("Module"), -str8_lit_comp("EntryPoint"), -str8_lit_comp("DebugInfoPath"), -str8_lit_comp("PendingThreadName"), -str8_lit_comp("PendingThreadColor"), -str8_lit_comp("Breakpoint"), -str8_lit_comp("AddressRangeAnnotation"), -}; - -U32 ctrl_exception_code_kind_code_table[38] = -{ -0, -0x40010005, -0x40010008, -0x40080201, -0x40080202, -0x0000071a, -0x80000002, -0xc0000005, -0xc0000006, -0xc0000008, -0xc0000017, -0xc000001d, -0xc0000025, -0xc0000026, -0xc000008c, -0xc000008d, -0xc000008e, -0xc000008f, -0xc0000090, -0xc0000091, -0xc0000092, -0xc0000093, -0xc0000094, -0xc0000095, -0xc0000096, -0xc00000fd, -0xc0000135, -0xc0000138, -0xc0000139, -0xc0000142, -0xc00002b4, -0xc00002b5, -0xc0000420, -0xc06d007e, -0xc06d007f, -0xe073616e, -0xe0736171, -0x0000087a, -}; - -String8 ctrl_exception_code_kind_display_string_table[38] = -{ -{0}, -str8_lit_comp("(Win32) Control-C"), -str8_lit_comp("(Win32) Control-Break"), -str8_lit_comp("(Win32) WinRT Originate Error"), -str8_lit_comp("(Win32) WinRT Transform Error"), -str8_lit_comp("(Win32) RPC Call Cancelled"), -str8_lit_comp("(Win32) Data Type Misalignment"), -str8_lit_comp("(Win32) Access Violation"), -str8_lit_comp("(Win32) In Page Error"), -str8_lit_comp("(Win32) Invalid Handle Specified"), -str8_lit_comp("(Win32) Not Enough Quota"), -str8_lit_comp("(Win32) Illegal Instruction"), -str8_lit_comp("(Win32) Cannot Continue From Exception"), -str8_lit_comp("(Win32) Invalid Exception Disposition Returned By Handler"), -str8_lit_comp("(Win32) Array Bounds Exceeded"), -str8_lit_comp("(Win32) Floating-Point Denormal Operand"), -str8_lit_comp("(Win32) Floating-Point Division By Zero"), -str8_lit_comp("(Win32) Floating-Point Inexact Result"), -str8_lit_comp("(Win32) Floating-Point Invalid Operation"), -str8_lit_comp("(Win32) Floating-Point Overflow"), -str8_lit_comp("(Win32) Floating-Point Stack Check"), -str8_lit_comp("(Win32) Floating-Point Underflow"), -str8_lit_comp("(Win32) Integer Division By Zero"), -str8_lit_comp("(Win32) Integer Overflow"), -str8_lit_comp("(Win32) Privileged Instruction"), -str8_lit_comp("(Win32) Stack Overflow"), -str8_lit_comp("(Win32) Unable To Locate DLL"), -str8_lit_comp("(Win32) Ordinal Not Found"), -str8_lit_comp("(Win32) Entry Point Not Found"), -str8_lit_comp("(Win32) DLL Initialization Failed"), -str8_lit_comp("(Win32) Floating Point SSE Multiple Faults"), -str8_lit_comp("(Win32) Floating Point SSE Multiple Traps"), -str8_lit_comp("(Win32) Assertion Failed"), -str8_lit_comp("(Win32) Module Not Found"), -str8_lit_comp("(Win32) Procedure Not Found"), -str8_lit_comp("(Win32) Sanitizer Error Detected"), -str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), -str8_lit_comp("(Win32) DirectX Debug Layer"), -}; - -String8 ctrl_exception_code_kind_lowercase_code_string_table[38] = -{ -{0}, -str8_lit_comp("win32_ctrl_c"), -str8_lit_comp("win32_ctrl_break"), -str8_lit_comp("win32_win_rt_originate_error"), -str8_lit_comp("win32_win_rt_transform_error"), -str8_lit_comp("win32_rpc_call_cancelled"), -str8_lit_comp("win32_datatype_misalignment"), -str8_lit_comp("win32_access_violation"), -str8_lit_comp("win32_in_page_error"), -str8_lit_comp("win32_invalid_handle"), -str8_lit_comp("win32_not_enough_quota"), -str8_lit_comp("win32_illegal_instruction"), -str8_lit_comp("win32_cannot_continue_exception"), -str8_lit_comp("win32_invalid_exception_disposition"), -str8_lit_comp("win32_array_bounds_exceeded"), -str8_lit_comp("win32_floating_point_denormal_operand"), -str8_lit_comp("win32_floating_point_division_by_zero"), -str8_lit_comp("win32_floating_point_inexact_result"), -str8_lit_comp("win32_floating_point_invalid_operation"), -str8_lit_comp("win32_floating_point_overflow"), -str8_lit_comp("win32_floating_point_stack_check"), -str8_lit_comp("win32_floating_point_underflow"), -str8_lit_comp("win32_integer_division_by_zero"), -str8_lit_comp("win32_integer_overflow"), -str8_lit_comp("win32_privileged_instruction"), -str8_lit_comp("win32_stack_overflow"), -str8_lit_comp("win32_unable_to_locate_dll"), -str8_lit_comp("win32_ordinal_not_found"), -str8_lit_comp("win32_entry_point_not_found"), -str8_lit_comp("win32_dll_initialization_failed"), -str8_lit_comp("win32_floating_point_sse_multiple_faults"), -str8_lit_comp("win32_floating_point_sse_multiple_traps"), -str8_lit_comp("win32_assertion_failed"), -str8_lit_comp("win32_module_not_found"), -str8_lit_comp("win32_procedure_not_found"), -str8_lit_comp("win32_sanitizer_error_detected"), -str8_lit_comp("win32_sanitizer_raw_access_violation"), -str8_lit_comp("win32_directx_debug_layer"), -}; - -B8 ctrl_exception_code_kind_default_enable_table[38] = -{ -0, -1, -1, -0, -0, -0, -0, -1, -0, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -0, -0, -1, -0, -1, -}; - -C_LINKAGE_END - diff --git a/src/ctrl/generated/ctrl.meta.h b/src/ctrl/generated/ctrl.meta.h deleted file mode 100644 index 5495f320..00000000 --- a/src/ctrl/generated/ctrl.meta.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef CTRL_META_H -#define CTRL_META_H - -typedef enum CTRL_EntityKind -{ -CTRL_EntityKind_Null, -CTRL_EntityKind_Root, -CTRL_EntityKind_Machine, -CTRL_EntityKind_Process, -CTRL_EntityKind_Thread, -CTRL_EntityKind_Module, -CTRL_EntityKind_EntryPoint, -CTRL_EntityKind_DebugInfoPath, -CTRL_EntityKind_PendingThreadName, -CTRL_EntityKind_PendingThreadColor, -CTRL_EntityKind_Breakpoint, -CTRL_EntityKind_AddressRangeAnnotation, -CTRL_EntityKind_COUNT, -} CTRL_EntityKind; - -typedef enum CTRL_ExceptionCodeKind -{ -CTRL_ExceptionCodeKind_Null, -CTRL_ExceptionCodeKind_Win32CtrlC, -CTRL_ExceptionCodeKind_Win32CtrlBreak, -CTRL_ExceptionCodeKind_Win32WinRTOriginateError, -CTRL_ExceptionCodeKind_Win32WinRTTransformError, -CTRL_ExceptionCodeKind_Win32RPCCallCancelled, -CTRL_ExceptionCodeKind_Win32DatatypeMisalignment, -CTRL_ExceptionCodeKind_Win32AccessViolation, -CTRL_ExceptionCodeKind_Win32InPageError, -CTRL_ExceptionCodeKind_Win32InvalidHandle, -CTRL_ExceptionCodeKind_Win32NotEnoughQuota, -CTRL_ExceptionCodeKind_Win32IllegalInstruction, -CTRL_ExceptionCodeKind_Win32CannotContinueException, -CTRL_ExceptionCodeKind_Win32InvalidExceptionDisposition, -CTRL_ExceptionCodeKind_Win32ArrayBoundsExceeded, -CTRL_ExceptionCodeKind_Win32FloatingPointDenormalOperand, -CTRL_ExceptionCodeKind_Win32FloatingPointDivisionByZero, -CTRL_ExceptionCodeKind_Win32FloatingPointInexactResult, -CTRL_ExceptionCodeKind_Win32FloatingPointInvalidOperation, -CTRL_ExceptionCodeKind_Win32FloatingPointOverflow, -CTRL_ExceptionCodeKind_Win32FloatingPointStackCheck, -CTRL_ExceptionCodeKind_Win32FloatingPointUnderflow, -CTRL_ExceptionCodeKind_Win32IntegerDivisionByZero, -CTRL_ExceptionCodeKind_Win32IntegerOverflow, -CTRL_ExceptionCodeKind_Win32PrivilegedInstruction, -CTRL_ExceptionCodeKind_Win32StackOverflow, -CTRL_ExceptionCodeKind_Win32UnableToLocateDLL, -CTRL_ExceptionCodeKind_Win32OrdinalNotFound, -CTRL_ExceptionCodeKind_Win32EntryPointNotFound, -CTRL_ExceptionCodeKind_Win32DLLInitializationFailed, -CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults, -CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps, -CTRL_ExceptionCodeKind_Win32AssertionFailed, -CTRL_ExceptionCodeKind_Win32ModuleNotFound, -CTRL_ExceptionCodeKind_Win32ProcedureNotFound, -CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected, -CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation, -CTRL_ExceptionCodeKind_Win32DirectXDebugLayer, -CTRL_ExceptionCodeKind_COUNT, -} CTRL_ExceptionCodeKind; - -C_LINKAGE_BEGIN -extern String8 ctrl_entity_kind_code_name_table[12]; -extern String8 ctrl_entity_kind_display_string_table[12]; -extern U32 ctrl_exception_code_kind_code_table[38]; -extern String8 ctrl_exception_code_kind_display_string_table[38]; -extern String8 ctrl_exception_code_kind_lowercase_code_string_table[38]; -extern B8 ctrl_exception_code_kind_default_enable_table[38]; - -C_LINKAGE_END - -#endif // CTRL_META_H diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 7ab14cad..225af11b 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -88,3 +88,193 @@ D_DevToggleTable: @expand(D_DevToggleTable a) `{&DEV_$(a.name), str8_lit_comp("$(a.name)")},` `};`; } + +//////////////////////////////// +//~ rjf: Entity Kinds + +@table(name code_name display_string) +CTRL_EntityKindTable: +{ + {Root root "Root" } + {Machine machine "Machine" } + {Process process "Process" } + {Thread thread "Thread" } + {Module module "Module" } + {EntryPoint entry_point "Entry Point" } + {DebugInfoPath debug_info_path "Debug Info Path" } + {PendingThreadName pending_thread_name "Pending Thread Name" } + {PendingThreadColor pending_thread_color "Pending Thread Color" } + {Breakpoint breakpoint "Breakpoint" } + {AddressRangeAnnotation address_range_annotation "Address Range Annotation" } +} + +@enum CTRL_EntityKind: +{ + Null, + @expand(CTRL_EntityKindTable a) `$(a.name)`, + COUNT, +} + +@data(String8) ctrl_entity_kind_code_name_table: +{ + `{0}`, + @expand(CTRL_EntityKindTable a) `str8_lit_comp("$(a.code_name)")` +} + +@data(String8) ctrl_entity_kind_display_string_table: +{ + `{0}`, + @expand(CTRL_EntityKindTable a) `str8_lit_comp("$(a.display_name)")` +} + +//////////////////////////////// +//~ rjf: Exception Codes + +@table(name lower_name code default display_string) +CTRL_ExceptionCodeKindTable: +{ + {Win32CtrlC win32_ctrl_c 0x40010005 1 "(Win32) Control-C" } + {Win32CtrlBreak win32_ctrl_break 0x40010008 1 "(Win32) Control-Break" } + {Win32WinRTOriginateError win32_win_rt_originate_error 0x40080201 0 "(Win32) WinRT Originate Error" } + {Win32WinRTTransformError win32_win_rt_transform_error 0x40080202 0 "(Win32) WinRT Transform Error" } + {Win32RPCCallCancelled win32_rpc_call_cancelled 0x0000071a 0 "(Win32) RPC Call Cancelled" } + {Win32DatatypeMisalignment win32_datatype_misalignment 0x80000002 0 "(Win32) Data Type Misalignment" } + {Win32AccessViolation win32_access_violation 0xc0000005 1 "(Win32) Access Violation" } + {Win32InPageError win32_in_page_error 0xc0000006 0 "(Win32) In Page Error" } + {Win32InvalidHandle win32_invalid_handle 0xc0000008 1 "(Win32) Invalid Handle Specified" } + {Win32NotEnoughQuota win32_not_enough_quota 0xc0000017 0 "(Win32) Not Enough Quota" } + {Win32IllegalInstruction win32_illegal_instruction 0xc000001d 0 "(Win32) Illegal Instruction" } + {Win32CannotContinueException win32_cannot_continue_exception 0xc0000025 0 "(Win32) Cannot Continue From Exception" } + {Win32InvalidExceptionDisposition win32_invalid_exception_disposition 0xc0000026 0 "(Win32) Invalid Exception Disposition Returned By Handler" } + {Win32ArrayBoundsExceeded win32_array_bounds_exceeded 0xc000008c 0 "(Win32) Array Bounds Exceeded" } + {Win32FloatingPointDenormalOperand win32_floating_point_denormal_operand 0xc000008d 0 "(Win32) Floating-Point Denormal Operand" } + {Win32FloatingPointDivisionByZero win32_floating_point_division_by_zero 0xc000008e 0 "(Win32) Floating-Point Division By Zero" } + {Win32FloatingPointInexactResult win32_floating_point_inexact_result 0xc000008f 0 "(Win32) Floating-Point Inexact Result" } + {Win32FloatingPointInvalidOperation win32_floating_point_invalid_operation 0xc0000090 0 "(Win32) Floating-Point Invalid Operation" } + {Win32FloatingPointOverflow win32_floating_point_overflow 0xc0000091 0 "(Win32) Floating-Point Overflow" } + {Win32FloatingPointStackCheck win32_floating_point_stack_check 0xc0000092 0 "(Win32) Floating-Point Stack Check" } + {Win32FloatingPointUnderflow win32_floating_point_underflow 0xc0000093 0 "(Win32) Floating-Point Underflow" } + {Win32IntegerDivisionByZero win32_integer_division_by_zero 0xc0000094 0 "(Win32) Integer Division By Zero" } + {Win32IntegerOverflow win32_integer_overflow 0xc0000095 0 "(Win32) Integer Overflow" } + {Win32PrivilegedInstruction win32_privileged_instruction 0xc0000096 0 "(Win32) Privileged Instruction" } + {Win32StackOverflow win32_stack_overflow 0xc00000fd 0 "(Win32) Stack Overflow" } + {Win32UnableToLocateDLL win32_unable_to_locate_dll 0xc0000135 0 "(Win32) Unable To Locate DLL" } + {Win32OrdinalNotFound win32_ordinal_not_found 0xc0000138 0 "(Win32) Ordinal Not Found" } + {Win32EntryPointNotFound win32_entry_point_not_found 0xc0000139 0 "(Win32) Entry Point Not Found" } + {Win32DLLInitializationFailed win32_dll_initialization_failed 0xc0000142 0 "(Win32) DLL Initialization Failed" } + {Win32FloatingPointSSEMultipleFaults win32_floating_point_sse_multiple_faults 0xc00002b4 0 "(Win32) Floating Point SSE Multiple Faults" } + {Win32FloatingPointSSEMultipleTraps win32_floating_point_sse_multiple_traps 0xc00002b5 0 "(Win32) Floating Point SSE Multiple Traps" } + {Win32AssertionFailed win32_assertion_failed 0xc0000420 1 "(Win32) Assertion Failed" } + {Win32ModuleNotFound win32_module_not_found 0xc06d007e 0 "(Win32) Module Not Found" } + {Win32ProcedureNotFound win32_procedure_not_found 0xc06d007f 0 "(Win32) Procedure Not Found" } + {Win32SanitizerErrorDetected win32_sanitizer_error_detected 0xe073616e 1 "(Win32) Sanitizer Error Detected" } + {Win32SanitizerRawAccessViolation win32_sanitizer_raw_access_violation 0xe0736171 0 "(Win32) Sanitizer Raw Access Violation" } + {Win32DirectXDebugLayer win32_directx_debug_layer 0x0000087a 1 "(Win32) DirectX Debug Layer" } +} + +@enum CTRL_ExceptionCodeKind: +{ + Null, + @expand(CTRL_ExceptionCodeKindTable a) `$(a.name)`, + COUNT, +} + +@data(U32) ctrl_exception_code_kind_code_table: +{ + `0`; + @expand(CTRL_ExceptionCodeKindTable a) `$(a.code)`; +} + +@data(String8) ctrl_exception_code_kind_display_string_table: +{ + `{0}`; + @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)")`; +} + +@data(String8) ctrl_exception_code_kind_lowercase_code_string_table: +{ + `{0}`; + @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)")`; +} + +@data(B8) ctrl_exception_code_kind_default_enable_table: +{ + `0`; + @expand(CTRL_ExceptionCodeKindTable a) `$(a.default)`; +} + +//////////////////////////////// +//~ rjf: Exception Sub-Codes + +@table(name, value) +CTRL_ExceptionSubCodeKindTable: +{ + { W32_FAST_FAIL_LEGACY_GS_VIOLATION 0 } + { W32_FAST_FAIL_VTGUARD_CHECK_FAILURE 1 } + { W32_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2 } + { W32_FAST_FAIL_CORRUPT_LIST_ENTRY 3 } + { W32_FAST_FAIL_INCORRECT_STACK 4 } + { W32_FAST_FAIL_INVALID_ARG 5 } + { W32_FAST_FAIL_GS_COOKIE_INIT 6 } + { W32_FAST_FAIL_FATAL_APP_EXIT 7 } + { W32_FAST_FAIL_RANGE_CHECK_FAILURE 8 } + { W32_FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9 } + { W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10 } + { W32_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11 } + { W32_FAST_FAIL_INVALID_FIBER_SWITCH 12 } + { W32_FAST_FAIL_INVALID_SET_OF_CONTEXT 13 } + { W32_FAST_FAIL_INVALID_REFERENCE_COUNT 14 } + { W32_FAST_FAIL_INVALID_JUMP_BUFFER 18 } + { W32_FAST_FAIL_MRDATA_MODIFIED 19 } + { W32_FAST_FAIL_CERTIFICATION_FAILURE 20 } + { W32_FAST_FAIL_INVALID_EXCEPTION_CHAIN 21 } + { W32_FAST_FAIL_CRYPTO_LIBRARY 22 } + { W32_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23 } + { W32_FAST_FAIL_INVALID_IMAGE_BASE 24 } + { W32_FAST_FAIL_DLOAD_PROTECTION_FAILURE 25 } + { W32_FAST_FAIL_UNSAFE_EXTENSION_CALL 26 } + { W32_FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27 } + { W32_FAST_FAIL_INVALID_BUFFER_ACCESS 28 } + { W32_FAST_FAIL_INVALID_BALANCED_TREE 29 } + { W32_FAST_FAIL_INVALID_NEXT_THREAD 30 } + { W32_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 } + { W32_FAST_FAIL_APCS_DISABLED 32 } + { W32_FAST_FAIL_INVALID_IDLE_STATE 33 } + { W32_FAST_FAIL_MRDATA_PROTECTION_FAILURE 34 } + { W32_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35 } + { W32_FAST_FAIL_INVALID_LOCK_STATE 36 } + { W32_FAST_FAIL_GUARD_JUMPTABLE 37 } + { W32_FAST_FAIL_INVALID_LONGJUMP_TARGET 38 } + { W32_FAST_FAIL_INVALID_DISPATCH_CONTEXT 39 } + { W32_FAST_FAIL_INVALID_THREAD 40 } + { W32_FAST_FAIL_INVALID_SYSCALL_NUMBER 41 } + { W32_FAST_FAIL_INVALID_FILE_OPERATION 42 } + { W32_FAST_FAIL_LPAC_ACCESS_DENIED 43 } + { W32_FAST_FAIL_GUARD_SS_FAILURE 44 } + { W32_FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 } + { W32_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46 } + { W32_FAST_FAIL_INVALID_CONTROL_STACK 47 } + { W32_FAST_FAIL_SET_CONTEXT_DENIED 48 } + { W32_FAST_FAIL_INVALID_IAT 49 } + { W32_FAST_FAIL_HEAP_METADATA_CORRUPTION 50 } + { W32_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51 } + { W32_FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 } + { W32_FAST_FAIL_ENCLAVE_CALL_FAILURE 53 } + { W32_FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54 } + { W32_FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 } + { W32_FAST_FAIL_UNEXPECTED_CALL 56 } + { W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57 } + { W32_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58 } + { W32_FAST_FAIL_FLAGS_CORRUPTION 59 } + { W32_FAST_FAIL_VEH_CORRUPTION 60 } + { W32_FAST_FAIL_ETW_CORRUPTION 61 } + { W32_FAST_FAIL_RIO_ABORT 62 } + { W32_FAST_FAIL_INVALID_PFN 63 } + { W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG 64 } + { W32_FAST_FAIL_CAST_GUARD 65 } + { W32_FAST_FAIL_HOST_VISIBILITY_CHANGE 66 } + { W32_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST 67 } + { W32_FAST_FAIL_PATCH_CALLBACK_FAILED 68 } + { W32_FAST_FAIL_NTDLL_PATCH_FAILED 69 } + { W32_FAST_FAIL_INVALID_FLS_DATA 70 } +} diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 8baa5c00..d2143055 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -1,2260 +1,7 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#undef LAYER_COLOR -#define LAYER_COLOR 0x4d9ae3ff - //////////////////////////////// //~ rjf: Generated Code -#include "dbg_engine/generated/dbg_engine.meta.c" - -//////////////////////////////// -//~ rjf: Basic Helpers - -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - -internal U64 -d_hash_from_seed_string(U64 seed, String8 string) -{ - U64 result = XXH3_64bits_withSeed(string.str, string.size, seed); - return result; -} - -internal U64 -d_hash_from_string(String8 string) -{ - return d_hash_from_seed_string(5381, string); -} - -internal U64 -d_hash_from_seed_string__case_insensitive(U64 seed, String8 string) -{ - U64 result = seed; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + lower_from_char(string.str[i]); - } - return result; -} - -internal U64 -d_hash_from_string__case_insensitive(String8 string) -{ - return d_hash_from_seed_string__case_insensitive(5381, string); -} - -//////////////////////////////// -//~ rjf: Breakpoints - -internal D_BreakpointArray -d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src) -{ - D_BreakpointArray dst = {0}; - dst.count = src->count; - dst.v = push_array(arena, D_Breakpoint, dst.count); - MemoryCopy(dst.v, src->v, sizeof(dst.v[0])*dst.count); - for(U64 idx = 0; idx < dst.count; idx += 1) - { - dst.v[idx].file_path = push_str8_copy(arena, dst.v[idx].file_path); - dst.v[idx].vaddr_expr = push_str8_copy(arena, dst.v[idx].vaddr_expr); - dst.v[idx].condition = push_str8_copy(arena, dst.v[idx].condition); - } - return dst; -} - -//////////////////////////////// -//~ rjf: Path Map Application - -internal String8List -d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path) -{ - // NOTE(rjf): This path, given some target file path, scans all file path map - // overrides, and collects the set of file paths which could've redirected - // to the target file path given the set of file path maps. - // - // For example, if I have a rule saying D:/devel/ maps to C:/devel/, and I - // feed in C:/devel/foo/bar.txt, then this path will construct - // D:/devel/foo/bar.txt, as a possible option. - // - // It will also preserve C:/devel/foo/bar.txt in the resultant list, so that - // overrideless files still work through this path, and both redirected - // files and non-redirected files can go through the same path. - // - String8List result = {0}; - str8_list_push(arena, &result, file_path); - Temp scratch = scratch_begin(&arena, 1); - PathStyle pth_style = PathStyle_Relative; - String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style); - { - for(U64 idx = 0; idx < path_maps->count; idx += 1) - { - //- rjf: unpack link - D_PathMap *map = &path_maps->v[idx]; - PathStyle src_style = PathStyle_Relative; - PathStyle dst_style = PathStyle_Relative; - String8List src_parts = path_normalized_list_from_string(scratch.arena, map->src, &src_style); - String8List dst_parts = path_normalized_list_from_string(scratch.arena, map->dst, &dst_style); - - //- rjf: determine if this link can possibly redirect to the target file path - B32 dst_redirects_to_pth = 0; - String8Node *non_redirected_pth_first = 0; - if(dst_style == pth_style && dst_parts.first != 0 && pth_parts.first != 0) - { - dst_redirects_to_pth = 1; - String8Node *dst_n = dst_parts.first; - String8Node *pth_n = pth_parts.first; - for(;dst_n != 0 && pth_n != 0; dst_n = dst_n->next, pth_n = pth_n->next) - { - if(!str8_match(dst_n->string, pth_n->string, StringMatchFlag_CaseInsensitive)) - { - dst_redirects_to_pth = 0; - break; - } - non_redirected_pth_first = pth_n->next; - } - } - - //- rjf: if this link can redirect to this path via `src` -> `dst`, compute - // possible full source path, by taking `src` and appending non-redirected - // suffix (which did not show up in `dst`) - if(dst_redirects_to_pth) - { - String8List candidate_parts = src_parts; - for(String8Node *p = non_redirected_pth_first; p != 0; p = p->next) - { - str8_list_push(scratch.arena, &candidate_parts, p->string); - } - StringJoin join = {0}; - join.sep = str8_lit("/"); - String8 candidate_path = str8_list_join(arena, &candidate_parts, &join); - str8_list_push(arena, &result, candidate_path); - } - } - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Debug Info Extraction Type Pure Functions - -internal D_LineList -d_line_list_copy(Arena *arena, D_LineList *list) -{ - D_LineList dst = {0}; - for(D_LineNode *src_n = list->first; src_n != 0; src_n = src_n->next) - { - D_LineNode *dst_n = push_array(arena, D_LineNode, 1); - MemoryCopyStruct(dst_n, src_n); - dst_n->v.file_path = push_str8_copy(arena, dst_n->v.file_path); - SLLQueuePush(dst.first, dst.last, dst_n); - dst.count += 1; - } - return dst; -} - -//////////////////////////////// -//~ rjf: Command Type Functions - -//- rjf: command parameters - -internal D_CmdParams -d_cmd_params_copy(Arena *arena, D_CmdParams *src) -{ - D_CmdParams dst = {0}; - MemoryCopyStruct(&dst, src); - dst.file_path = push_str8_copy(arena, dst.file_path); - dst.targets.v = push_array(arena, D_Target, dst.targets.count); - MemoryCopy(dst.targets.v, src->targets.v, sizeof(D_Target)*dst.targets.count); - for(U64 idx = 0; idx < dst.targets.count; idx += 1) - { - D_Target *target = &dst.targets.v[idx]; - target->exe = push_str8_copy(arena, target->exe); - target->args = push_str8_copy(arena, target->args); - target->working_directory = push_str8_copy(arena, target->working_directory); - target->custom_entry_point_name = push_str8_copy(arena, target->custom_entry_point_name); - target->env = str8_list_copy(arena, &target->env); - } - return dst; -} - -//- rjf: command lists - -internal void -d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params) -{ - D_CmdNode *n = push_array(arena, D_CmdNode, 1); - n->cmd.kind = kind; - n->cmd.params = d_cmd_params_copy(arena, params); - DLLPushBack(cmds->first, cmds->last, n); - cmds->count += 1; -} - -//////////////////////////////// -//~ rjf: Stepping "Trap Net" Builders - -// NOTE(rjf): Stepping Algorithm Overview (2024/01/17) -// -// The basic idea behind all stepping algorithms in the debugger are setting up -// a "trap net". A "trap net" is just a collection of high-level traps that are -// meant to "catch" a thread after letting it run. This trap net is submitted -// when the debugger frontend sends a "run" command (it is just empty if doing -// an actual 'run' or 'continue'). The debugger control thread then uses this -// trap net to program a state machine, to appropriately respond to a variety -// of debug events which it is passed from the OS. -// -// These are "high-level traps" because they can have specific behavioral info -// attached to them. These are encoded via the `CTRL_TrapFlags` type, which -// allow expression of the following behaviors: -// -// - end-stepping: when this trap is hit, it will end the stepping operation, -// and the target will not continue. -// - ignore-stack-pointer-check: when a trap in the trap net is hit, it will -// by-default be ignored if the thread's stack pointer has changed. this -// flag disables that behavior, for when the stack pointer is expected to -// change (e.g. step-out). -// - single-step-after-hit: when a trap with this flag is hit, the debugger -// will immediately single-step the thread which hit it. -// - save-stack-pointer: when a trap with this flag is hit, it will rewrite -// the stack pointer which is used to compare against, when deciding -// whether or not to filter a trap (based on stack pointer changes). -// - begin-spoof-mode: this enables "spoof mode". "spoof mode" is a special -// mode that disables the trap net entirely, and lets the thread run -// freely - but it catches the thread not with a trap, but a false return -// address. the debugger will overwrite a specific return address on the -// stack. this address will be overwritten with an address which does NOT -// point to a valid page, such that when the thread returns out of a -// particular call frame, the debugger will receive a debug event, at -// which point it can move the thread back to the correct return address, -// and resume with the trap net enabled. this is used in "step over" -// operations, because it avoids target <-> debugger "roundtrips" (e.g. -// target being stopped, debugger being called with debug events, then -// target resumes when debugger's control thread is done running) for -// recursions. (it doesn't make a difference with non-recursive calls, -// but the debugger can't detect the difference). -// -// Each stepping command prepares its trap net differently. -// -// --- Instruction Step Into -------------------------------------------------- -// In this case, no trap net is prepared, and only a low-level single-step is -// performed. -// -// --- Instruction Step Over -------------------------------------------------- -// To build a trap net for an instruction-level step-over, the next instruction -// at the thread's current instruction pointer is decoded. If it is a call -// instruction, or if it is a repeating instruction, then a trap with the -// 'end-stepping' behavior is placed at the instruction immediately following -// the 'call' instruction. -// -// --- Line Step Into --------------------------------------------------------- -// For a source-line step-into, the thread's instruction pointer is first used -// to look up into the debug info's line info, to find the machine code in the -// thread's current source line. Every instruction in this range is decoded. -// Traps are then built in the following way: -// -// - 'call' instruction -> if can decode call destination address, place -// "end-stepping | ignore-stack-pointer-check" trap at destination. if -// can't, "end-stepping | single-step-after | ignore-stack-pointer-check" -// trap at call. -// - 'jmp' (both unconditional & conditional) -> if can decode jump destination -// address, AND if jump leaves the line, place "end-stepping | ignore- -// stack-pointer-check" trap at destination. if can't, "end-stepping | -// single-step-after | ignore-stack-pointer-check" trap at jmp. if jump -// stays within the line, do nothing. -// - 'return' -> place "end-stepping | single-step-after" trap at return inst. -// - "end-stepping" trap is placed at the first address after the line, to -// catch all steps which simply proceed linearly through the instruction -// stream. -// -// --- Line Step Over --------------------------------------------------------- -// For a source-line step-over, the thread's instruction pointer is first used -// to look up into the debug info's line info, to find the machine code in the -// thread's current source line. Every instruction in this range is decoded. -// Traps are then built in the following way: -// -// - 'call' instruction -> place "single-step-after | begin-spoof-mode" trap at -// call instruction. -// - 'jmp' (both unconditional & conditional) -> if can decode jump destination -// address, AND if jump leaves the line, place "end-stepping" trap at -// destination. if can't, "end-stepping | single-step-after" trap at jmp. -// if jump stays within the line, do nothing. -// - 'return' -> place "end-stepping | single-step-after" trap at return inst. -// - "end-stepping" trap is placed at the first address after the line, to -// catch all steps which simply proceed linearly through the instruction -// stream. -// - for any instructions which may change the stack pointer, traps are placed -// at them with the "save-stack-pointer | single-step-after" behaviors. - -internal D_TrapNet -d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread) -{ - Temp scratch = scratch_begin(&arena, 1); - D_TrapNet result = {0}; - - // rjf: thread => unpacked info - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); - - // rjf: ip => machine code - String8 machine_code = {0}; - { - Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, os_now_microseconds()+5000); - machine_code = machine_code_slice.data; - } - - // rjf: build traps if machine code was read successfully - if(machine_code.size != 0) - { - result.good_read = 1; - - // rjf: decode instruction - DASM_Inst inst = dasm_inst_from_code(scratch.arena, arch, ip_vaddr, machine_code, DASM_Syntax_Intel); - - // rjf: call => run until call returns - if(inst.flags & DASM_InstFlag_Call || inst.flags & DASM_InstFlag_Repeats) - { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, ip_vaddr+inst.size}; - ctrl_trap_list_push(arena, &result.traps, &trap); - } - } - - scratch_end(scratch); - return result; -} - -internal D_TrapNet -d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) -{ - Temp scratch = scratch_begin(&arena, 1); - log_infof("step_over_line:\n{\n"); - D_TrapNet result = {0}; - - // rjf: thread => info - Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr); - log_infof("dbgi_key: {0x%I64x, 0x%I64x}\n", dbgi_key.u64[0], dbgi_key.u64[1]); - - // rjf: ip => line info - String8 file_path = {0}; - S64 line_num = 0; - Rng1U64 line_vaddr_rng = {0}; - { - U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); - D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, ip_voff); - Rng1U64 line_voff_rng = {0}; - if(lines.first != 0) - { - line_voff_rng = lines.first->v.voff_range; - file_path = lines.first->v.file_path; - line_num = lines.first->v.pt.line; - line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); - log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); - } - log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); - log_infof("vaddr_range: {0x%I64x, 0x%I64x}\n", line_vaddr_rng.min, line_vaddr_rng.max); - } - - // rjf: gather other ranges on this same textual line, which we don't want to return to - Rng1U64List all_vaddr_ranges_on_same_line = {0}; - { - D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num); - for EachNode(n, D_LineNode, lines.first) - { - Rng1U64 voff_range = n->v.voff_range; - Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); - rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); - } - } - - // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range - // - // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging - // is enabled. This is enabled by default normally. - { - U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max); - D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, opl_line_voff_rng); - if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) - { - line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max); - } - } - - // rjf: line vaddr range => did we find anything successfully? - B32 good_line_info = (line_vaddr_rng.max != 0); - - // rjf: line vaddr range => line's machine code - String8 machine_code = {0}; - B32 good_machine_code = 0; - if(good_line_info) - { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+50000); - machine_code = machine_code_slice.data; - good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); - LogInfoNamedBlockF("machine_code_slice") - { - log_infof("stale: %i\n", machine_code_slice.stale); - log_infof("any_byte_bad: %i\n", machine_code_slice.any_byte_bad); - log_infof("any_byte_changed: %i\n", machine_code_slice.any_byte_changed); - log_infof("bytes:\n[\n"); - for(U64 idx = 0; idx < machine_code_slice.data.size; idx += 1) - { - log_infof("0x%x,", machine_code_slice.data.str[idx]); - if(idx%16 == 15 || idx+1 == machine_code_slice.data.size) - { - log_infof("\n"); - } - } - log_infof("]\n"); - } - } - - // rjf: machine code => ctrl flow analysis - DASM_CtrlFlowInfo ctrl_flow_info = {0}; - if(good_machine_code) - { - ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, - DASM_InstFlag_Call| - DASM_InstFlag_Branch| - DASM_InstFlag_UnconditionalJump| - DASM_InstFlag_ChangesStackPointer| - DASM_InstFlag_Return, - arch, - line_vaddr_rng.min, - machine_code); - LogInfoNamedBlockF("ctrl_flow_info") - { - LogInfoNamedBlockF("exit_points") for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) - { - log_infof("{vaddr:0x%I64x, jump_dest_vaddr:0x%I64x, inst_flags:%x}\n", n->v.vaddr, n->v.jump_dest_vaddr, n->v.inst_flags); - } - } - } - - // rjf: push traps for all exit points - if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) - { - DASM_CtrlFlowPoint *point = &n->v; - CTRL_TrapFlags flags = 0; - B32 add = 1; - U64 trap_addr = point->vaddr; - - // rjf: branches/jumps/returns => single-step & end, OR trap @ destination. - if(point->inst_flags & (DASM_InstFlag_Branch| - DASM_InstFlag_UnconditionalJump| - DASM_InstFlag_Return)) - { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping); - - // rjf: omit if this jump stays inside of this line - if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) - { - add = 0; - } - - // rjf: omit if this jump stays inside of any range on this same textual line - for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) - { - if(contains_1u64(n->v, point->jump_dest_vaddr)) - { - add = 0; - break; - } - } - - // rjf: trap @ destination, if we can - we can avoid a single-step this way. - if(point->jump_dest_vaddr != 0) - { - trap_addr = point->jump_dest_vaddr; - flags &= ~CTRL_TrapFlag_SingleStepAfterHit; - } - - } - - // rjf: call => place spoof at return spot in stack, single-step after hitting - else if(point->inst_flags & DASM_InstFlag_Call) - { - flags |= (CTRL_TrapFlag_BeginSpoofMode|CTRL_TrapFlag_SingleStepAfterHit); - } - - // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping - else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) - { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); - } - - // rjf: add if appropriate - if(add) - { - CTRL_Trap trap = {flags, trap_addr}; - ctrl_trap_list_push(arena, &result.traps, &trap); - } - } - - // rjf: push traps for natural linear flow - if(good_line_info && good_machine_code) - { - U64 line_opl_vaddr = line_vaddr_rng.max; - for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) - { - U64 opl = n->v.max; - B32 opl_in_line = 0; - for EachNode(n2, Rng1U64Node, all_vaddr_ranges_on_same_line.first) - { - if(n != n2 && opl == n2->v.min) - { - opl_in_line = 1; - break; - } - } - if(!opl_in_line) - { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, opl}; - ctrl_trap_list_push(arena, &result.traps, &trap); - } - } - } - - // rjf: store goodness - if(good_machine_code) - { - result.good_line_info = good_line_info; - result.good_read = good_machine_code; - } - - // rjf: log - LogInfoNamedBlockF("traps") for(CTRL_TrapNode *n = result.traps.first; n != 0; n = n->next) - { - log_infof("{flags:0x%x, vaddr:0x%I64x}\n", n->v.flags, n->v.vaddr); - } - - scratch_end(scratch); - log_infof("}\n\n"); - return result; -} - -internal D_TrapNet -d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) -{ - Temp scratch = scratch_begin(&arena, 1); - D_TrapNet result = {0}; - - // rjf: thread => info - Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - - // rjf: ip => line info - String8 file_path = {0}; - S64 line_num = 0; - Rng1U64 line_vaddr_rng = {0}; - { - U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); - D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, ip_voff); - Rng1U64 line_voff_rng = {0}; - if(lines.first != 0) - { - line_voff_rng = lines.first->v.voff_range; - file_path = lines.first->v.file_path; - line_num = lines.first->v.pt.line; - line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); - log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); - } - log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); - log_infof("vaddr_range: {0x%I64x, 0x%I64x}\n", line_vaddr_rng.min, line_vaddr_rng.max); - } - - // rjf: gather other ranges on this same textual line, which we don't want to return to - Rng1U64List all_vaddr_ranges_on_same_line = {0}; - { - D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num); - for EachNode(n, D_LineNode, lines.first) - { - Rng1U64 voff_range = n->v.voff_range; - Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); - rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); - } - } - - // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range - // - // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging - // is enabled. This is enabled by default normally. - { - U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max); - D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, opl_line_voff_rng); - if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) - { - line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max); - } - } - - // rjf: line vaddr range => did we find anything successfully? - B32 good_line_info = (line_vaddr_rng.max != 0); - - // rjf: line vaddr range => line's machine code - String8 machine_code = {0}; - B32 good_machine_code = 0; - if(good_line_info) - { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+5000); - machine_code = machine_code_slice.data; - good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); - } - - // rjf: machine code => ctrl flow analysis - DASM_CtrlFlowInfo ctrl_flow_info = {0}; - if(good_machine_code) - { - ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, - DASM_InstFlag_Call| - DASM_InstFlag_Branch| - DASM_InstFlag_UnconditionalJump| - DASM_InstFlag_ChangesStackPointer| - DASM_InstFlag_Return, - arch, - line_vaddr_rng.min, - machine_code); - } - - // rjf: determine last - DASM_CtrlFlowPoint *last_call_point = 0; - if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) - { - if(n->v.inst_flags & DASM_InstFlag_Call) - { - last_call_point = &n->v; - } - } - - // rjf: push traps for all exit points - if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) - { - DASM_CtrlFlowPoint *point = &n->v; - CTRL_TrapFlags flags = 0; - B32 add = 1; - U64 trap_addr = point->vaddr; - - // rjf: if this is not the last call instruction in the control flow, - // and if we have no line info for this address, then do not add. - if(point != last_call_point && - point->inst_flags & DASM_InstFlag_Call && - point->jump_dest_vaddr != 0) - { - U64 jump_dest_vaddr = point->jump_dest_vaddr; - CTRL_Entity *jump_dest_module = ctrl_module_from_process_vaddr(process, jump_dest_vaddr); - U64 jump_dest_voff = ctrl_voff_from_vaddr(jump_dest_module, jump_dest_vaddr); - DI_Key jump_dest_dbgi_key = ctrl_dbgi_key_from_module(jump_dest_module); - D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, jump_dest_dbgi_key, jump_dest_voff); - if(lines.count == 0) - { - add = 0; - } - } - - // rjf: branches/jumps/returns => single-step & end, OR trap @ destination. - if(point->inst_flags & (DASM_InstFlag_Call| - DASM_InstFlag_Branch| - DASM_InstFlag_UnconditionalJump| - DASM_InstFlag_Return)) - { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck); - - // rjf: omit if this jump stays inside of this line - if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) - { - add = 0; - } - - // rjf: omit if this jump stays inside of any range on this same textual line - for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) - { - if(contains_1u64(n->v, point->jump_dest_vaddr)) - { - add = 0; - break; - } - } - - // rjf: trap @ destination, if we can - we can avoid a single-step this way. - if(point->jump_dest_vaddr != 0) - { - trap_addr = point->jump_dest_vaddr; - flags &= ~CTRL_TrapFlag_SingleStepAfterHit; - } - } - - // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping - else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) - { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); - } - - // rjf: add if appropriate - if(add) - { - CTRL_Trap trap = {flags, trap_addr}; - ctrl_trap_list_push(arena, &result.traps, &trap); - } - } - - // rjf: push traps for natural linear flow - if(good_line_info && good_machine_code) - { - U64 line_opl_vaddr = line_vaddr_rng.max; - for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) - { - U64 opl = n->v.max; - B32 opl_in_line = 0; - for EachNode(n2, Rng1U64Node, all_vaddr_ranges_on_same_line.first) - { - if(n != n2 && opl == n2->v.min) - { - opl_in_line = 1; - break; - } - } - if(!opl_in_line) - { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, opl}; - ctrl_trap_list_push(arena, &result.traps, &trap); - } - } - } - - // rjf: store goodness - { - result.good_line_info = good_line_info; - result.good_read = good_machine_code; - } - - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Debug Info Lookups - -//- rjf: voff -> line info - -internal D_LineList -d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff) -{ - Temp scratch = scratch_begin(&arena, 1); - Access *access = access_open(); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); - D_LineList result = {0}; - { - //- rjf: gather line tables - typedef struct LineTableNode LineTableNode; - struct LineTableNode - { - LineTableNode *next; - RDI_ParsedLineTable parsed_line_table; - }; - LineTableNode start_line_table = {0}; - RDI_Unit *unit = rdi_unit_from_voff(rdi, voff); - RDI_LineTable *unit_line_table = rdi_line_table_from_unit(rdi, unit); - rdi_parsed_from_line_table(rdi, unit_line_table, &start_line_table.parsed_line_table); - LineTableNode *top_line_table = 0; - RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); - { - for(RDI_Scope *s = scope; - s->inline_site_idx != 0; - s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx)) - { - RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx); - if(inline_site->line_table_idx != 0) - { - LineTableNode *n = push_array(scratch.arena, LineTableNode, 1); - SLLStackPush(top_line_table, n); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, inline_site->line_table_idx); - rdi_parsed_from_line_table(rdi, line_table, &n->parsed_line_table); - } - } - } - SLLStackPush(top_line_table, &start_line_table); - - //- rjf: gather lines in each line table - Rng1U64 shallowest_voff_range = {0}; - for(LineTableNode *line_table_n = top_line_table; line_table_n != 0; line_table_n = line_table_n->next) - { - RDI_ParsedLineTable parsed_line_table = line_table_n->parsed_line_table; - U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed_line_table, voff); - if(line_info_idx < parsed_line_table.count) - { - RDI_Line *line = &parsed_line_table.lines[line_info_idx]; - RDI_Column *column = (line_info_idx < parsed_line_table.col_count) ? &parsed_line_table.cols[line_info_idx] : 0; - RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); - String8List path_parts = {0}; - for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, file->file_path_node_idx); - fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0); - fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node)) - { - String8 path_part = {0}; - path_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &path_part.size); - str8_list_push_front(scratch.arena, &path_parts, path_part); - } - StringJoin join = {0}; - join.sep = str8_lit("/"); - String8 file_normalized_full_path = str8_list_join(arena, &path_parts, &join); - D_LineNode *n = push_array(arena, D_LineNode, 1); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - if(line->file_idx != 0 && file_normalized_full_path.size != 0) - { - n->v.file_path = file_normalized_full_path; - } - n->v.pt = txt_pt(line->line_num, column ? column->col_first : 1); - n->v.voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]); - n->v.dbgi_key = dbgi_key; - if(line_table_n == top_line_table) - { - shallowest_voff_range = n->v.voff_range; - } - } - } - - //- rjf: clamp all lines from all tables by shallowest (most unwound) range - for(D_LineNode *n = result.first; n != 0; n = n->next) - { - n->v.voff_range = intersect_1u64(n->v.voff_range, shallowest_voff_range); - } - } - access_close(access); - scratch_end(scratch); - return result; -} - -//- rjf: file:line -> line info - -// TODO(rjf): this depends on file path maps, needs to move - -internal D_LineListArray -d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range) -{ - D_LineListArray array = {0}; - { - array.count = dim_1s64(line_num_range)+1; - array.v = push_array(arena, D_LineList, array.count); - di_key_list_push(arena, &array.dbgi_keys, dbgi_key); - } - Temp scratch = scratch_begin(&arena, 1); - U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count); - Access *access = access_open(); - String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path); - for(String8Node *override_n = overrides.first; - override_n != 0; - override_n = override_n->next) - { - String8 file_path = override_n->string; - String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); - - // rjf: binary -> rdi - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - - // rjf: file_path_normalized * rdi -> src_id - B32 good_src_id = 0; - U32 src_id = 0; - if(rdi != &rdi_parsed_nil) ProfScope("file_path_normalized * rdi -> src_id") - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - good_src_id = 1; - src_id = ids[0]; - } - } - } - - // rjf: good src-id -> look up line info for visible range - if(good_src_id) ProfScope("good src-id -> look up line info for visible range") - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); - U64 line_idx = 0; - for(S64 line_num = line_num_range.min; - line_num <= line_num_range.max; - line_num += 1, line_idx += 1) - { - D_LineList *list = &array.v[line_idx]; - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); - if(lines_num_voffs[line_idx] < 8) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) - { - U64 base_voff = voffs[idx]; - U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); - RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); - RDI_ParsedLineTable unit_line_info = {0}; - rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); - U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); - if(unit_line_info.voffs != 0) - { - Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); - S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; - D_LineNode *n = push_array(arena, D_LineNode, 1); - n->v.voff_range = range; - n->v.pt.line = (S64)actual_line; - n->v.pt.column = 1; - n->v.dbgi_key = dbgi_key; - SLLQueuePush(list->first, list->last, n); - list->count += 1; - lines_num_voffs[line_idx] += 1; - if(lines_num_voffs[line_idx] >= 8) - { - break; - } - } - } - } - } - } - access_close(access); - scratch_end(scratch); - return array; -} - -internal D_LineListArray -d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range) -{ - D_LineListArray array = {0}; - { - array.count = dim_1s64(line_num_range)+1; - array.v = push_array(arena, D_LineList, array.count); - } - Temp scratch = scratch_begin(&arena, 1); - U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count); - DI_KeyArray dbgi_keys = di_push_all_loaded_keys(scratch.arena); - String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path); - for(String8Node *override_n = overrides.first; - override_n != 0; - override_n = override_n->next) - { - String8 file_path = override_n->string; - String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); - for EachIndex(idx, dbgi_keys.count) - { - Access *access = access_open(); - - // rjf: binary -> rdi - DI_Key key = dbgi_keys.v[idx]; - RDI_Parsed *rdi = di_rdi_from_key(access, key, 1, 0); - - // rjf: file_path_normalized * rdi -> src_id - B32 good_src_id = 0; - U32 src_id = 0; - if(rdi != &rdi_parsed_nil) ProfScope("file_path_normalized * rdi -> src_id") - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - good_src_id = 1; - src_id = ids[0]; - } - } - } - - // rjf: good src-id -> look up line info for visible range - if(good_src_id) ProfScope("good src-id -> look up line info for visible range") - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); - U64 line_idx = 0; - for(S64 line_num = line_num_range.min; - line_num <= line_num_range.max; - line_num += 1, line_idx += 1) - { - D_LineList *list = &array.v[line_idx]; - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); - if(lines_num_voffs[line_idx] < 8) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) - { - U64 base_voff = voffs[idx]; - U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); - RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); - RDI_ParsedLineTable unit_line_info = {0}; - rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); - U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); - if(unit_line_info.voffs != 0) - { - Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); - S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; - D_LineNode *n = push_array(arena, D_LineNode, 1); - n->v.voff_range = range; - n->v.pt.line = (S64)actual_line; - n->v.pt.column = 1; - n->v.dbgi_key = key; - SLLQueuePush(list->first, list->last, n); - list->count += 1; - lines_num_voffs[line_idx] += 1; - if(lines_num_voffs[line_idx] >= 8) - { - break; - } - } - } - } - } - - // rjf: good src id -> push to relevant dbgi keys - if(good_src_id) - { - di_key_list_push(arena, &array.dbgi_keys, key); - } - - access_close(access); - } - } - scratch_end(scratch); - return array; -} - -internal D_LineList -d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num) -{ - D_LineListArray array = d_lines_array_from_dbgi_key_file_path_line_range(arena, dbgi_key, file_path, r1s64(line_num, line_num+1)); - D_LineList list = {0}; - if(array.count != 0) - { - list = array.v[0]; - } - return list; -} - -internal D_LineList -d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num) -{ - D_LineListArray array = d_lines_array_from_file_path_line_range(arena, file_path, r1s64(line_num, line_num+1)); - D_LineList list = {0}; - if(array.count != 0) - { - list = array.v[0]; - } - return list; -} - -//////////////////////////////// -//~ rjf: Process/Thread/Module Info Lookups - -internal U64 -d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) -{ - ProfBeginFunction(); - U64 base_vaddr = 0; - if(!d_ctrl_targets_running()) - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: unpack module info - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - U64 addr_size = byte_size_from_arch(process->arch); - - switch(process->tls_model) - { - case CTRL_TlsModel_Null: {}break; - case CTRL_TlsModel_WinodwsNt: - { - // read thread local base pointer out of TEB - U64 thread_local_base = root_vaddr; - U64 tls_addr_array = 0; - CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_local_base, thread_local_base + addr_size), 0, 0); - String8 tls_array_vaddr_data = tls_addr_array_slice.data; - if(tls_array_vaddr_data.size == addr_size) - { - U64 tls_array_vaddr = 0; - MemoryCopyStr8(&tls_array_vaddr, tls_array_vaddr_data); - - // read thread local storage pointer (array of TLS pointers, one per module) - U64 tls_ptr_vaddr = tls_array_vaddr + module->tls_index * addr_size; - CTRL_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); - String8 result_data = result_slice.data; - if(result_data.size == addr_size) - { - MemoryCopyStr8(&base_vaddr, result_data); - } - } - }break; - case CTRL_TlsModel_Gnu: - { - if(module->tls_index > 0) // zero is reserved for the generation counter - { - // read dynamic thread vector pointer (one per dynamic module) - U64 dtv_base = root_vaddr; - U64 dtv_size = addr_size * 2; // union dtv { size_t counter; struct dtv_pointer { void *val, *to_free; }; }; - U64 dtv_pointer_vaddr = dtv_base + module->tls_index * dtv_size; - CTRL_ProcessMemorySlice dtv_pointer_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(dtv_pointer_vaddr, dtv_pointer_vaddr + dtv_size), 0, 0); - String8 dtv_pointer_data = dtv_pointer_slice.data; - if(dtv_pointer_data.size == dtv_size) - { - U64 dtv_pointer = 0; - MemoryCopyStr8(&dtv_pointer, dtv_pointer_data); - - // verify that TLS block was allocated - U64 tls_dtv_unallocated = addr_size == 4 ? max_U32 : max_U64; - if(dtv_pointer != tls_dtv_unallocated) - { - base_vaddr = dtv_pointer + module->tls_offset; // add tls_offset because DT_NEEDED modules share TLS block with the main exe - } - } - } - }break; - default: {InvalidPath;}break; - } - - scratch_end(scratch); - } - ProfEnd(); - return base_vaddr; -} - -//////////////////////////////// -//~ rjf: Target Controls - -//- rjf: stopped info from the control thread - -internal CTRL_Event -d_ctrl_last_stop_event(void) -{ - return d_state->ctrl_last_stop_event; -} - -//////////////////////////////// -//~ rjf: Main State Accessors/Mutators - -//- rjf: frame data - -internal U64 -d_frame_index(void) -{ - return d_state->frame_index; -} - -//- rjf: control state - -internal D_RunKind -d_ctrl_last_run_kind(void) -{ - return d_state->ctrl_last_run_kind; -} - -internal U64 -d_ctrl_last_run_frame_idx(void) -{ - return d_state->ctrl_last_run_frame_idx; -} - -internal B32 -d_ctrl_targets_running(void) -{ - return d_state->ctrl_is_running; -} - -//- rjf: active entity based queries - -internal DI_KeyList -d_push_active_dbgi_key_list(Arena *arena) -{ - DI_KeyList dbgis = {0}; - CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); - for EachIndex(idx, modules.count) - { - CTRL_Entity *module = modules.v[idx]; - DI_Key key = ctrl_dbgi_key_from_module(module); - di_key_list_push(arena, &dbgis, key); - } - return dbgis; -} - -//- rjf: per-run caches - -internal U64 -d_query_cached_rip_from_thread(CTRL_Entity *thread) -{ - U64 result = d_query_cached_rip_from_thread_unwind(thread, 0); - return result; -} - -internal U64 -d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) -{ - U64 result = 0; - if(unwind_count == 0) - { - result = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); - } - else - { - Access *access = access_open(); - CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); - if(callstack.concrete_frames_count != 0) - { - result = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->regs); - } - access_close(access); - } - return result; -} - -internal U64 -d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) -{ - U64 cfa = 0; - Access *access = access_open(); - CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); - if(callstack.concrete_frames_count != 0) - { - cfa = callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->cfa; - } - access_close(access); - return cfa; -} - -internal U64 -d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) -{ - U64 result = 0; - for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->tls_base_caches); cache_idx += 1) - { - D_RunTLSBaseCache *cache = &d_state->tls_base_caches[(d_state->tls_base_cache_gen+cache_idx)%ArrayCount(d_state->tls_base_caches)]; - if(cache_idx == 0 && cache->slots_count == 0) - { - cache->slots_count = 256; - cache->slots = push_array(cache->arena, D_RunTLSBaseCacheSlot, cache->slots_count); - } - else if(cache->slots_count == 0) - { - break; - } - CTRL_Handle handle = process->handle; - U64 hash = d_hash_from_seed_string(d_hash_from_string(str8_struct(&handle)), str8_struct(&rip_vaddr)); - U64 slot_idx = hash%cache->slots_count; - D_RunTLSBaseCacheSlot *slot = &cache->slots[slot_idx]; - D_RunTLSBaseCacheNode *node = 0; - for(D_RunTLSBaseCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(ctrl_handle_match(n->process, handle) && n->root_vaddr == root_vaddr && n->rip_vaddr == rip_vaddr) - { - node = n; - break; - } - } - if(node == 0) - { - U64 tls_base_vaddr = d_tls_base_vaddr_from_process_root_rip(process, root_vaddr, rip_vaddr); - if(tls_base_vaddr != 0) - { - node = push_array(cache->arena, D_RunTLSBaseCacheNode, 1); - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - node->process = handle; - node->root_vaddr = root_vaddr; - node->rip_vaddr = rip_vaddr; - node->tls_base_vaddr = tls_base_vaddr; - } - } - if(node != 0 && node->tls_base_vaddr != 0) - { - result = node->tls_base_vaddr; - break; - } - } - return result; -} - -internal E_String2NumMap * -d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) -{ - ProfBeginFunction(); - E_String2NumMap *map = &e_string2num_map_nil; - for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->locals_caches); cache_idx += 1) - { - D_RunLocalsCache *cache = &d_state->locals_caches[(d_state->locals_cache_gen+cache_idx)%ArrayCount(d_state->locals_caches)]; - if(cache_idx == 0 && cache->table_size == 0) - { - cache->table_size = 256; - cache->table = push_array(cache->arena, D_RunLocalsCacheSlot, cache->table_size); - } - else if(cache->table_size == 0) - { - break; - } - U64 hash = u64_hash_from_str8(str8_struct(&dbgi_key)); - U64 slot_idx = hash % cache->table_size; - D_RunLocalsCacheSlot *slot = &cache->table[slot_idx]; - D_RunLocalsCacheNode *node = 0; - for(D_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(di_key_match(n->dbgi_key, dbgi_key) && n->voff == voff) - { - node = n; - break; - } - } - if(node == 0) - { - Access *access = access_open(); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); - E_String2NumMap *map = e_push_locals_map_from_rdi_voff(cache->arena, rdi, voff); - if(map->slots_count != 0) - { - node = push_array(cache->arena, D_RunLocalsCacheNode, 1); - node->dbgi_key = dbgi_key; - node->voff = voff; - node->locals_map = map; - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - } - access_close(access); - } - if(node != 0 && node->locals_map->slots_count != 0) - { - map = node->locals_map; - break; - } - } - ProfEnd(); - return map; -} - -internal E_String2NumMap * -d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) -{ - ProfBeginFunction(); - E_String2NumMap *map = &e_string2num_map_nil; - for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->member_caches); cache_idx += 1) - { - D_RunLocalsCache *cache = &d_state->member_caches[(d_state->member_cache_gen+cache_idx)%ArrayCount(d_state->member_caches)]; - if(cache_idx == 0 && cache->table_size == 0) - { - cache->table_size = 256; - cache->table = push_array(cache->arena, D_RunLocalsCacheSlot, cache->table_size); - } - else if(cache->table_size == 0) - { - break; - } - U64 hash = u64_hash_from_str8(str8_struct(&dbgi_key)); - U64 slot_idx = hash % cache->table_size; - D_RunLocalsCacheSlot *slot = &cache->table[slot_idx]; - D_RunLocalsCacheNode *node = 0; - for(D_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(di_key_match(n->dbgi_key, dbgi_key) && n->voff == voff) - { - node = n; - break; - } - } - if(node == 0) - { - Access *access = access_open(); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); - E_String2NumMap *map = e_push_member_map_from_rdi_voff(cache->arena, rdi, voff); - if(map->slots_count != 0) - { - node = push_array(cache->arena, D_RunLocalsCacheNode, 1); - node->dbgi_key = dbgi_key; - node->voff = voff; - node->locals_map = map; - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - } - access_close(access); - } - if(node != 0 && node->locals_map->slots_count != 0) - { - map = node->locals_map; - break; - } - } - ProfEnd(); - return map; -} - -//- rjf: top-level command dispatch - -internal void -d_push_cmd(D_CmdKind kind, D_CmdParams *params) -{ - d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, kind, params); -} - -//- rjf: command iteration - -internal B32 -d_next_cmd(D_Cmd **cmd) -{ - D_CmdNode *start_node = d_state->cmds.first; - if(cmd[0] != 0) - { - start_node = CastFromMember(D_CmdNode, cmd, cmd[0]); - start_node = start_node->next; - } - cmd[0] = 0; - if(start_node != 0) - { - cmd[0] = &start_node->cmd; - } - return !!cmd[0]; -} - -//////////////////////////////// -//~ rjf: Main Layer Top-Level Calls - -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - -internal void -d_init(void) -{ - Arena *arena = arena_alloc(); - d_state = push_array(arena, D_State, 1); - d_state->arena = arena; - d_state->cmds_arena = arena_alloc(); - d_state->output_log_key = c_key_make(c_root_alloc(), c_id_make(0, 0)); - c_submit_data(d_state->output_log_key, 0, str8_zero()); - d_state->ctrl_entity_store = ctrl_entity_ctx_rw_store_alloc(); - d_state->ctrl_stop_arena = arena_alloc(); - d_state->ctrl_msg_arena = arena_alloc(); - - // rjf: set up caches - for(U64 idx = 0; idx < ArrayCount(d_state->tls_base_caches); idx += 1) - { - d_state->tls_base_caches[idx].arena = arena_alloc(); - } - for(U64 idx = 0; idx < ArrayCount(d_state->locals_caches); idx += 1) - { - d_state->locals_caches[idx].arena = arena_alloc(); - } - for(U64 idx = 0; idx < ArrayCount(d_state->member_caches); idx += 1) - { - d_state->member_caches[idx].arena = arena_alloc(); - } - - // rjf: set up run state - d_state->ctrl_last_run_arena = arena_alloc(); -} - -internal D_EventList -d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - D_EventList result = {0}; - d_state->frame_index += 1; - - ////////////////////////////// - //- rjf: sync with ctrl thread - // - ProfScope("sync with ctrl thread") - { - //- rjf: grab next reggen/memgen - U64 new_mem_gen = ctrl_mem_gen(); - U64 new_reg_gen = ctrl_reg_gen(); - - //- rjf: consume & process events - CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); - ctrl_entity_store_apply_events(d_state->ctrl_entity_store, &events); - for(CTRL_EventNode *event_n = events.first; - event_n != 0; - event_n = event_n->next) - { - CTRL_Event *event = &event_n->v; - log_infof("ctrl_event:\n{\n"); - log_infof("kind: \"%S\"\n", ctrl_string_from_event_kind(event->kind)); - log_infof("entity_id: %u\n", event->entity_id); - switch(event->kind) - { - default:{}break; - - //- rjf: errors - - case CTRL_EventKind_Error: - { - log_user_error(event->string); - }break; - - //- rjf: starts/stops - - case CTRL_EventKind_Started: - { - d_state->ctrl_is_running = 1; - d_state->ctrl_thread_run_state = 1; - }break; - - case CTRL_EventKind_Stopped: - { - B32 should_snap = !(d_state->ctrl_soft_halt_issued); - d_state->ctrl_is_running = 0; - d_state->ctrl_thread_run_state = 0; - d_state->ctrl_soft_halt_issued = 0; - - // rjf: exception or unexpected trap -> push error - if(event->cause == CTRL_EventCause_InterruptedByException || - event->cause == CTRL_EventCause_InterruptedByTrap) - { - log_user_error(str8_zero()); - } - - // rjf: gather stop info - { - arena_clear(d_state->ctrl_stop_arena); - MemoryCopyStruct(&d_state->ctrl_last_stop_event, event); - d_state->ctrl_last_stop_event.string = push_str8_copy(d_state->ctrl_stop_arena, d_state->ctrl_last_stop_event.string); - } - - // rjf: push stop event to caller, if this is not a soft-halt - if(should_snap) - { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, event->entity); - D_EventCause cause = D_EventCause_Null; - switch(event->cause) - { - default:{}break; - case CTRL_EventCause_InterruptedByHalt: - { - if(should_snap) - { - cause = D_EventCause_Halt; - } - else - { - cause = D_EventCause_SoftHalt; - } - }break; - case CTRL_EventCause_UserBreakpoint: {cause = D_EventCause_UserBreakpoint;}break; - } - D_EventNode *n = push_array(arena, D_EventNode, 1); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - D_Event *evt = &n->v; - evt->kind = D_EventKind_Stop; - evt->cause = cause; - evt->thread = thread->kind == CTRL_EntityKind_Thread ? thread->handle : ctrl_handle_zero(); - evt->vaddr = event->rip_vaddr; - evt->id = event->u64_code; - } - }break; - - //- rjf: entity creation/deletion - - case CTRL_EventKind_NewProc: - { - // rjf: the first process? -> clear session output - CTRL_EntityArray existing_processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); - if(existing_processes.count == 1) - { - MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; - mtx_push_op(d_state->output_log_key, op); - } - }break; - - case CTRL_EventKind_EndProc: - { - D_EventNode *n = push_array(arena, D_EventNode, 1); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - D_Event *evt = &n->v; - evt->kind = D_EventKind_ProcessEnd; - evt->code = event->u64_code; - }break; - - case CTRL_EventKind_NewModule: - { - D_EventNode *n = push_array(arena, D_EventNode, 1); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - D_Event *evt = &n->v; - evt->kind = D_EventKind_ModuleLoad; - evt->module = event->entity; - }break; - - //- rjf: debug strings - - case CTRL_EventKind_DebugString: - { - MTX_Op op = {r1u64(max_U64, max_U64), event->string}; - mtx_push_op(d_state->output_log_key, op); - }break; - - //- rjf: memory - - case CTRL_EventKind_MemReserve:{}break; - case CTRL_EventKind_MemCommit:{}break; - case CTRL_EventKind_MemDecommit:{}break; - case CTRL_EventKind_MemRelease:{}break; - } - log_infof("}\n\n"); - } - - //- rjf: clear tls base cache - if((d_state->tls_base_cache_reggen_idx != new_reg_gen || - d_state->tls_base_cache_memgen_idx != new_mem_gen) && - !d_ctrl_targets_running()) - { - d_state->tls_base_cache_gen += 1; - D_RunTLSBaseCache *cache = &d_state->tls_base_caches[d_state->tls_base_cache_gen%ArrayCount(d_state->tls_base_caches)]; - arena_clear(cache->arena); - cache->slots_count = 0; - cache->slots = 0; - d_state->tls_base_cache_reggen_idx = new_reg_gen; - d_state->tls_base_cache_memgen_idx = new_mem_gen; - } - - //- rjf: clear locals cache - if(d_state->locals_cache_reggen_idx != new_reg_gen && - !d_ctrl_targets_running()) - { - d_state->locals_cache_gen += 1; - D_RunLocalsCache *cache = &d_state->locals_caches[d_state->locals_cache_gen%ArrayCount(d_state->locals_caches)]; - arena_clear(cache->arena); - cache->table_size = 0; - cache->table = 0; - d_state->locals_cache_reggen_idx = new_reg_gen; - } - - //- rjf: clear members cache - if(d_state->member_cache_reggen_idx != new_reg_gen && - !d_ctrl_targets_running()) - { - d_state->member_cache_gen += 1; - D_RunLocalsCache *cache = &d_state->member_caches[d_state->member_cache_gen%ArrayCount(d_state->member_caches)]; - arena_clear(cache->arena); - cache->table_size = 0; - cache->table = 0; - d_state->member_cache_reggen_idx = new_reg_gen; - } - } - - ////////////////////////////// - //- rjf: hash ctrl parameterization state - // - U128 ctrl_param_state_hash = {0}; - { - // rjf: build data strings of all param data - String8List strings = {0}; - { - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); - for EachIndex(idx, threads.count) - { - CTRL_Entity *thread = threads.v[idx]; - if(thread->is_frozen) - { - str8_list_push(scratch.arena, &strings, str8_struct(&thread->id)); - str8_list_push(scratch.arena, &strings, str8_struct(&thread->is_frozen)); - } - } - for(U64 idx = 0; idx < breakpoints->count; idx += 1) - { - D_Breakpoint *bp = &breakpoints->v[idx]; - str8_list_push(scratch.arena, &strings, bp->file_path); - str8_list_push(scratch.arena, &strings, str8_struct(&bp->pt)); - str8_list_push(scratch.arena, &strings, bp->vaddr_expr); - str8_list_push(scratch.arena, &strings, bp->condition); - } - } - - // rjf: join & hash to produce result - String8 string = str8_list_join(scratch.arena, &strings, 0); - XXH128_hash_t hash = XXH3_128bits(string.str, string.size); - MemoryCopy(&ctrl_param_state_hash, &hash, sizeof(ctrl_param_state_hash)); - } - - ////////////////////////////// - //- rjf: if ctrl thread is running, and our ctrl parameterization - // state hash has changed since the last run, we should soft- - // halt-refresh to inform the ctrl thread about the updated - // state - // - if(d_ctrl_targets_running() && !u128_match(ctrl_param_state_hash, d_state->ctrl_last_run_param_state_hash)) - { - d_cmd(D_CmdKind_SoftHaltRefresh); - } - - ////////////////////////////// - //- rjf: process top-level commands - // - D_CmdList deferred_cmds = {0}; - CTRL_MsgList ctrl_msgs = {0}; - ProfScope("process top-level commands") - { - D_BreakpointArray run_extra_bps = {0}; - for(D_Cmd *cmd = 0; d_next_cmd(&cmd);) - { - // rjf: unpack command - D_CmdParams *params = &cmd->params; - - // rjf: prep ctrl running arguments - B32 need_run = 0; - D_RunKind run_kind = D_RunKind_Run; - CTRL_Entity *run_thread = &ctrl_entity_nil; - CTRL_RunFlags run_flags = 0; - CTRL_TrapList run_traps = {0}; - - // rjf: process command - switch(cmd->kind) - { - default:{}break; - - //- rjf: low-level target control operations - case D_CmdKind_LaunchAndRun: - case D_CmdKind_LaunchAndStepInto: - { - // rjf: get list of targets to launch - D_TargetArray *targets_to_launch = ¶ms->targets; - - // rjf: no targets => assume all active targets - if(targets_to_launch->count == 0) - { - targets_to_launch = targets; - } - - // rjf: launch - if(targets_to_launch->count != 0) - { - for(U64 idx = 0; idx < targets_to_launch->count; idx += 1) - { - // rjf: unpack target - D_Target *target = &targets_to_launch->v[idx]; - String8 exe = str8_skip_chop_whitespace(target->exe); - String8 args = str8_skip_chop_whitespace(target->args); - String8 working_directory = str8_skip_chop_whitespace(target->working_directory); - String8 custom_entry_point_name = str8_skip_chop_whitespace(target->custom_entry_point_name); - String8 stdout_path = str8_skip_chop_whitespace(target->stdout_path); - String8 stderr_path = str8_skip_chop_whitespace(target->stderr_path); - String8 stdin_path = str8_skip_chop_whitespace(target->stdin_path); - String8List env = target->env; - if(working_directory.size == 0) - { - working_directory = os_get_current_path(scratch.arena); - } - - // rjf: build launch options - String8List cmdln_strings = {0}; - { - str8_list_push(scratch.arena, &cmdln_strings, exe); - { - U64 start_split_idx = 0; - B32 quoted = 0; - for(U64 idx = 0; idx <= args.size; idx += 1) - { - U8 byte = idx < args.size ? args.str[idx] : 0; - if(byte == '"') - { - quoted ^= 1; - } - B32 splitter_found = (!quoted && (byte == 0 || char_is_space(byte))); - if(splitter_found) - { - String8 string = str8_substr(args, r1u64(start_split_idx, idx)); - if(string.size > 0) - { - str8_list_push(scratch.arena, &cmdln_strings, string); - } - start_split_idx = idx+1; - } - } - } - } - - // rjf: push message to launch - { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_Launch; - msg->path = working_directory; - msg->cmd_line_string_list = cmdln_strings; - msg->stdout_path = stdout_path; - msg->stderr_path = stderr_path; - msg->stdin_path = stdin_path; - msg->debug_subprocesses = target->debug_subprocesses; - msg->env_inherit = 1; - MemoryCopyArray(msg->exception_code_filters, exception_code_filters); - str8_list_push(scratch.arena, &msg->entry_points, custom_entry_point_name); - msg->env_string_list = env; - } - } - - // rjf: run - need_run = 1; - run_kind = D_RunKind_Run; - run_thread = &ctrl_entity_nil; - run_flags = (cmd->kind == D_CmdKind_LaunchAndStepInto) ? CTRL_RunFlag_StopOnEntryPoint : 0; - } - - // rjf: no targets -> error - if(targets_to_launch->count == 0) - { - log_user_error(str8_lit("No active targets exist; cannot launch. You must select a target first.")); - } - }break; - case D_CmdKind_Kill: - { - CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->process); - if(process == &ctrl_entity_nil) - { - log_user_error(str8_lit("Cannot kill; no process was specified.")); - } - else - { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_Kill; - msg->exit_code = 1; - msg->entity = process->handle; - MemoryCopyArray(msg->exception_code_filters, exception_code_filters); - } - }break; - case D_CmdKind_KillAll: - { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_KillAll; - msg->exit_code = 1; - MemoryCopyArray(msg->exception_code_filters, exception_code_filters); - }break; - case D_CmdKind_Detach: - { - CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->process); - if(process == &ctrl_entity_nil) - { - log_user_error(str8_lit("Cannot detach; no process specified.")); - } - else - { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_Detach; - msg->entity = process->handle; - MemoryCopyArray(msg->exception_code_filters, exception_code_filters); - } - }break; - case D_CmdKind_Continue: - { - B32 good_to_run = 0; - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); - if(threads.count > 0) - { - for EachIndex(idx, threads.count) - { - CTRL_Entity *thread = threads.v[idx]; - if(!thread->is_frozen) - { - good_to_run = 1; - break; - } - } - if(good_to_run) - { - need_run = 1; - run_kind = D_RunKind_Run; - run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); - } - else - { - log_user_error(str8_lit("Cannot run with all threads frozen.")); - } - } - }break; - case D_CmdKind_StepIntoInst: - case D_CmdKind_StepOverInst: - case D_CmdKind_StepIntoLine: - case D_CmdKind_StepOverLine: - case D_CmdKind_StepOut: - { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); - if(thread == &ctrl_entity_nil) - { - log_user_error(str8_lit("Must have a selected thread to step.")); - } - else if(d_ctrl_targets_running()) - { - if(d_ctrl_last_run_kind() == D_RunKind_Run) - { - log_user_error(str8_lit("Must halt before stepping.")); - } - } - else if(thread->is_frozen) - { - log_user_error(str8_lit("Must thaw selected thread before stepping.")); - } - else - { - D_TrapNet trap_net = {0}; - switch(cmd->kind) - { - default: break; - case D_CmdKind_StepIntoInst: {trap_net.good_read = 1;}break; - case D_CmdKind_StepOverInst: {trap_net = d_trap_net_from_thread__step_over_inst(scratch.arena, thread);}break; - case D_CmdKind_StepIntoLine: {trap_net = d_trap_net_from_thread__step_into_line(scratch.arena, thread);}break; - case D_CmdKind_StepOverLine: {trap_net = d_trap_net_from_thread__step_over_line(scratch.arena, thread);}break; - case D_CmdKind_StepOut: - { - Access *access = access_open(); - - // rjf: thread => call stack - CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); - - // rjf: use first unwind frame to generate trap - if(callstack.concrete_frames_count > 1) - { - U64 vaddr = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[1]->regs); - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck, vaddr}; - ctrl_trap_list_push(scratch.arena, &trap_net.traps, &trap); - trap_net.good_read = 1; - } - else - { - log_user_error(str8_lit("Could not find the return address of the current callstack frame successfully.")); - } - - access_close(access); - }break; - } - B32 good_trap_net = (trap_net.good_read || !trap_net.good_line_info); - if(good_trap_net && trap_net.traps.count != 0) - { - need_run = 1; - run_kind = D_RunKind_Step; - run_thread = thread; - run_flags = 0; - run_traps = trap_net.traps; - } - else if(good_trap_net && trap_net.traps.count == 0) - { - need_run = 1; - run_kind = D_RunKind_SingleStep; - run_thread = thread; - run_flags = 0; - run_traps = trap_net.traps; - } - else if(!good_trap_net && params->retry_idx < 100) - { - D_CmdParams params_copy = *params; - params_copy.retry_idx += 1; - d_cmd_list_push_new(scratch.arena, &deferred_cmds, cmd->kind, ¶ms_copy); - } - else if(!good_trap_net) - { - log_user_error(str8_lit("Could not successfully step.")); - } - } - }break; - case D_CmdKind_Halt: - if(d_ctrl_targets_running()) - { - ctrl_halt(); - }break; - case D_CmdKind_SoftHaltRefresh: - if(d_ctrl_targets_running()) - { - need_run = 1; - run_kind = d_state->ctrl_last_run_kind; - run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, d_state->ctrl_last_run_thread_handle); - run_flags = d_state->ctrl_last_run_flags; - run_traps = d_state->ctrl_last_run_traps; - }break; - case D_CmdKind_SetThreadIP: - { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); - U64 vaddr = params->vaddr; - void *block = ctrl_reg_block_from_thread(scratch.arena, &d_state->ctrl_entity_store->ctx, thread->handle); - regs_arch_block_write_rip(thread->arch, block, vaddr); - B32 result = ctrl_thread_write_reg_block(thread->handle, block); - (void)result; - }break; - - //- rjf: high-level composite target control operations - case D_CmdKind_RunToLine: - { - run_extra_bps.count = 1; - run_extra_bps.v = push_array(scratch.arena, D_Breakpoint, 1); - if(params->file_path.size != 0) - { - run_extra_bps.v[0].file_path = params->file_path; - run_extra_bps.v[0].pt = params->cursor; - } - else if(params->vaddr != 0) - { - run_extra_bps.v[0].vaddr_expr = push_str8f(scratch.arena, "0x%I64x", params->vaddr); - } - d_cmd(D_CmdKind_Run); - }break; - case D_CmdKind_Run: - { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); - if(processes.count != 0) - { - d_cmd(D_CmdKind_Continue, .machine = params->machine, .process = params->process, .thread = params->thread); - } - else if(!d_ctrl_targets_running()) - { - d_cmd(D_CmdKind_LaunchAndRun); - } - }break; - case D_CmdKind_Restart: - { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); - if(processes.count != 0) - { - d_cmd(D_CmdKind_KillAll); - } - d_cmd(D_CmdKind_LaunchAndRun); - }break; - case D_CmdKind_StepInto: - case D_CmdKind_StepOver: - { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); - if(processes.count != 0) - { - D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto - ? D_CmdKind_StepIntoLine - : D_CmdKind_StepOverLine); - B32 prefer_disasm = params->prefer_disasm; - if(prefer_disasm) - { - step_cmd_kind = (cmd->kind == D_CmdKind_StepInto - ? D_CmdKind_StepIntoInst - : D_CmdKind_StepOverInst); - } - d_cmd(step_cmd_kind, .thread = params->thread); - } - else if(!d_ctrl_targets_running()) - { - d_cmd(D_CmdKind_LaunchAndStepInto, .targets = *targets); - } - }break; - - //- rjf: debug control context management operations - case D_CmdKind_FreezeThread: - case D_CmdKind_ThawThread: - case D_CmdKind_FreezeProcess: - case D_CmdKind_ThawProcess: - case D_CmdKind_FreezeMachine: - case D_CmdKind_ThawMachine: - { - D_CmdKind disptch_kind = ((cmd->kind == D_CmdKind_FreezeThread || - cmd->kind == D_CmdKind_FreezeProcess || - cmd->kind == D_CmdKind_FreezeMachine) - ? D_CmdKind_FreezeEntity - : D_CmdKind_ThawEntity); - d_push_cmd(disptch_kind, params); - }break; - case D_CmdKind_FreezeLocalMachine: - { - CTRL_MachineID machine_id = CTRL_MachineID_Local; - d_cmd(D_CmdKind_FreezeMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero())); - }break; - case D_CmdKind_ThawLocalMachine: - { - CTRL_MachineID machine_id = CTRL_MachineID_Local; - d_cmd(D_CmdKind_ThawMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero())); - }break; - case D_CmdKind_FreezeEntity: - case D_CmdKind_ThawEntity: - { - B32 should_freeze = (cmd->kind == D_CmdKind_FreezeEntity); - CTRL_Entity *root = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); - for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) - { - if(e->kind == CTRL_EntityKind_Thread) - { - e->is_frozen = should_freeze; - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = (should_freeze ? CTRL_MsgKind_FreezeThread : CTRL_MsgKind_ThawThread); - msg->entity = e->handle; - } - } - if(d_ctrl_targets_running()) - { - need_run = 1; - run_kind = d_state->ctrl_last_run_kind; - run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, d_state->ctrl_last_run_thread_handle); - run_flags = d_state->ctrl_last_run_flags; - run_traps = d_state->ctrl_last_run_traps; - } - }break; - - //- rjf: entity decoration - case D_CmdKind_SetEntityColor: - { - CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); - entity->rgba = params->rgba; - }break; - case D_CmdKind_SetEntityName: - { - CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); - ctrl_entity_equip_string(d_state->ctrl_entity_store, entity, params->string); - }break; - - //- rjf: attaching - case D_CmdKind_Attach: - { - U32 pid = params->pid; - if(pid != 0) - { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_Attach; - msg->entity_id = pid; - MemoryCopyArray(msg->exception_code_filters, exception_code_filters); - } - }break; - } - - // rjf: do run if needed - if(need_run) - { - // rjf: compute hash of all run-parameterization entities, store - { - d_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash; - } - - // rjf: push & fill run message - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - { - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, CTRL_EntityKind_Process); - msg->kind = (run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? CTRL_MsgKind_Run : CTRL_MsgKind_SingleStep; - msg->run_flags = run_flags; - msg->entity = run_thread->handle; - msg->parent = process->handle; - MemoryCopyArray(msg->exception_code_filters, exception_code_filters); - MemoryCopyStruct(&msg->traps, &run_traps); - D_BreakpointArray *bp_batches[] = - { - breakpoints, - &run_extra_bps, - }; - for(U64 batch_idx = 0; batch_idx < ArrayCount(bp_batches); batch_idx += 1) - { - D_BreakpointArray *batch_breakpoints = bp_batches[batch_idx]; - for(U64 idx = 0; idx < batch_breakpoints->count; idx += 1) - { - // rjf: unpack user breakpoint entity - D_Breakpoint *bp = &batch_breakpoints->v[idx]; - - // rjf: d -> ctrl flags - CTRL_UserBreakpointFlags ctrl_bp_flags = 0; - if(bp->flags & D_BreakpointFlag_BreakOnWrite) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnWrite; } - if(bp->flags & D_BreakpointFlag_BreakOnRead) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnRead; } - if(bp->flags & D_BreakpointFlag_BreakOnExecute) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnExecute; } - - // rjf: textual location -> add breakpoints for all possible override locations - if(bp->file_path.size != 0 && bp->pt.line != 0) - { - String8List overrides = d_possible_path_overrides_from_maps_path(scratch.arena, path_maps, bp->file_path); - for(String8Node *n = overrides.first; n != 0; n = n->next) - { - CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_FileNameAndLineColNumber}; - ctrl_user_bp.flags = ctrl_bp_flags; - ctrl_user_bp.id = bp->id; - ctrl_user_bp.string = n->string; - ctrl_user_bp.pt = bp->pt; - ctrl_user_bp.condition = bp->condition; - ctrl_user_bp.size = bp->size; - ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); - } - } - - // rjf: virtual address expression -> add expression breakpoint - else if(bp->vaddr_expr.size != 0) - { - CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_Expression}; - ctrl_user_bp.flags = ctrl_bp_flags; - ctrl_user_bp.id = bp->id; - ctrl_user_bp.string = bp->vaddr_expr; - ctrl_user_bp.condition = bp->condition; - ctrl_user_bp.size = bp->size; - ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); - } - } - } - } - - // rjf: copy run traps to scratch (needed, if run_traps can be `d_state->ctrl_last_run_traps`) - CTRL_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps); - D_BreakpointArray run_extra_bps_copy = d_breakpoint_array_copy(scratch.arena, &run_extra_bps); - - // rjf: store last run info - arena_clear(d_state->ctrl_last_run_arena); - d_state->ctrl_last_run_kind = run_kind; - d_state->ctrl_last_run_frame_idx = d_frame_index(); - d_state->ctrl_last_run_thread_handle = run_thread->handle; - d_state->ctrl_last_run_flags = run_flags; - d_state->ctrl_last_run_traps = ctrl_trap_list_copy(d_state->ctrl_last_run_arena, &run_traps_copy); - d_state->ctrl_last_run_extra_bps = d_breakpoint_array_copy(d_state->ctrl_last_run_arena, &run_extra_bps_copy); - d_state->ctrl_is_running = 1; - } - } - } - - ////////////////////////////// - //- rjf: clear command batch - // - { - arena_clear(d_state->cmds_arena); - MemoryZeroStruct(&d_state->cmds); - } - - ////////////////////////////// - //- rjf: push deferred commands - // - for EachNode(n, D_CmdNode, deferred_cmds.first) - { - d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, n->cmd.kind, &n->cmd.params); - } - - ////////////////////////////// - //- rjf: push new control messages to queue - try to send queue to control, - // clear queue if successful (if not, we'll just keep them around until - // the next tick) - // - { - CTRL_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_state->ctrl_msg_arena, &ctrl_msgs); - ctrl_msg_list_concat_in_place(&d_state->ctrl_msgs, &msgs_copy); - if(d_state->ctrl_msgs.count != 0) - { - if(!d_state->ctrl_soft_halt_issued && d_state->ctrl_thread_run_state) - { - d_state->ctrl_soft_halt_issued = 1; - ctrl_halt(); - } - if(ctrl_u2c_push_msgs(&d_state->ctrl_msgs, os_now_microseconds()+100)) - { - MemoryZeroStruct(&d_state->ctrl_msgs); - arena_clear(d_state->ctrl_msg_arena); - } - } - } - - ProfEnd(); - scratch_end(scratch); - return result; -} +#include "generated/dbg_engine.meta.c" diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 03b4a8f8..6fe61679 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -4,6 +4,231 @@ #ifndef DBG_ENGINE_CORE_H #define DBG_ENGINE_CORE_H +//////////////////////////////// +//~ rjf: ID Types + +typedef U64 CTRL_MsgID; +typedef U64 CTRL_MachineID; + +#define CTRL_MachineID_Local (1) + +//////////////////////////////// +//~ rjf: Entity Handle Types + +typedef struct CTRL_Handle CTRL_Handle; +struct CTRL_Handle +{ + CTRL_MachineID machine_id; + DMN_Handle dmn_handle; +}; + +typedef struct CTRL_HandleNode CTRL_HandleNode; +struct CTRL_HandleNode +{ + CTRL_HandleNode *next; + CTRL_Handle v; +}; + +typedef struct CTRL_HandleList CTRL_HandleList; +struct CTRL_HandleList +{ + CTRL_HandleNode *first; + CTRL_HandleNode *last; + U64 count; +}; + +typedef struct CTRL_HandleArray CTRL_HandleArray; +struct CTRL_HandleArray +{ + CTRL_Handle *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "generated/dbg_engine.meta.h" + +//////////////////////////////// +//~ rjf: User Breakpoint Types + +typedef U32 CTRL_UserBreakpointFlags; +enum +{ + CTRL_UserBreakpointFlag_BreakOnWrite = (1<<0), + CTRL_UserBreakpointFlag_BreakOnRead = (1<<1), + CTRL_UserBreakpointFlag_BreakOnExecute = (1<<2), +}; + +typedef enum CTRL_UserBreakpointKind +{ + CTRL_UserBreakpointKind_Null, + CTRL_UserBreakpointKind_FileNameAndLineColNumber, + CTRL_UserBreakpointKind_Expression, + CTRL_UserBreakpointKind_COUNT +} +CTRL_UserBreakpointKind; + +typedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint; +struct CTRL_UserBreakpoint +{ + CTRL_UserBreakpointKind kind; + CTRL_UserBreakpointFlags flags; + U64 id; + String8 string; + TxtPt pt; + U64 size; + String8 condition; +}; + +typedef struct CTRL_UserBreakpointNode CTRL_UserBreakpointNode; +struct CTRL_UserBreakpointNode +{ + CTRL_UserBreakpointNode *next; + CTRL_UserBreakpoint v; +}; + +typedef struct CTRL_UserBreakpointList CTRL_UserBreakpointList; +struct CTRL_UserBreakpointList +{ + CTRL_UserBreakpointNode *first; + CTRL_UserBreakpointNode *last; + U64 count; +}; + +//////////////////////////////// +//~ Dynamic Linker Types + +typedef U32 CTRL_TlsModel; +enum +{ + CTRL_TlsModel_Null, + CTRL_TlsModel_WinodwsNt, + CTRL_TlsModel_Gnu +}; + +//////////////////////////////// +//~ rjf: Entity Types + +typedef struct CTRL_Entity CTRL_Entity; +struct CTRL_Entity +{ + CTRL_Entity *first; + CTRL_Entity *last; + CTRL_Entity *next; + CTRL_Entity *prev; + CTRL_Entity *parent; + CTRL_EntityKind kind; + Arch arch; + B32 is_frozen; + B32 is_soloed; + U32 rgba; + CTRL_Handle handle; + U64 id; + Rng1U64 vaddr_range; + U64 stack_base; + U64 timestamp; + CTRL_UserBreakpointFlags bp_flags; + String8 string; + CTRL_TlsModel tls_model; + U64 tls_index; + U64 tls_offset; + OperatingSystem target_os; +}; + +typedef struct CTRL_EntityNode CTRL_EntityNode; +struct CTRL_EntityNode +{ + CTRL_EntityNode *next; + CTRL_Entity *v; +}; + +typedef struct CTRL_EntityList CTRL_EntityList; +struct CTRL_EntityList +{ + CTRL_EntityNode *first; + CTRL_EntityNode *last; + U64 count; +}; + +typedef struct CTRL_EntityArray CTRL_EntityArray; +struct CTRL_EntityArray +{ + CTRL_Entity **v; + U64 count; +}; + +typedef struct CTRL_EntityRec CTRL_EntityRec; +struct CTRL_EntityRec +{ + CTRL_Entity *next; + S32 push_count; + S64 pop_count; +}; + +typedef struct CTRL_EntityHashNode CTRL_EntityHashNode; +struct CTRL_EntityHashNode +{ + CTRL_EntityHashNode *next; + CTRL_EntityHashNode *prev; + CTRL_Entity *entity; +}; + +typedef struct CTRL_EntityHashSlot CTRL_EntityHashSlot; +struct CTRL_EntityHashSlot +{ + CTRL_EntityHashNode *first; + CTRL_EntityHashNode *last; +}; + +typedef struct CTRL_EntityStringChunkNode CTRL_EntityStringChunkNode; +struct CTRL_EntityStringChunkNode +{ + CTRL_EntityStringChunkNode *next; + U64 size; +}; + +read_only global U64 ctrl_entity_string_bucket_chunk_sizes[] = +{ + 16, + 64, + 256, + 1024, + 4096, + 16384, + 65536, + 0xffffffffffffffffull, +}; + +typedef struct CTRL_EntityCtx CTRL_EntityCtx; +struct CTRL_EntityCtx +{ + CTRL_Entity *root; + U64 hash_slots_count; + CTRL_EntityHashSlot *hash_slots; + U64 entity_kind_counts[CTRL_EntityKind_COUNT]; + U64 entity_kind_alloc_gens[CTRL_EntityKind_COUNT]; +}; + +typedef struct CTRL_EntityCtxRWStore CTRL_EntityCtxRWStore; +struct CTRL_EntityCtxRWStore +{ + Arena *arena; + CTRL_EntityCtx ctx; + CTRL_Entity *free; + CTRL_EntityHashNode *hash_node_free; + CTRL_EntityStringChunkNode *free_string_chunks[ArrayCount(ctrl_entity_string_bucket_chunk_sizes)]; +}; + +typedef struct CTRL_EntityCtxLookupAccel CTRL_EntityCtxLookupAccel; +struct CTRL_EntityCtxLookupAccel +{ + Arena *arena; + Arena *entity_kind_arrays_arenas[CTRL_EntityKind_COUNT]; + CTRL_EntityArray entity_kind_arrays[CTRL_EntityKind_COUNT]; + U64 entity_kind_arrays_gens[CTRL_EntityKind_COUNT]; +}; + //////////////////////////////// //~ rjf: Tick Input Types @@ -69,17 +294,6 @@ struct D_PathMapArray U64 count; }; -//////////////////////////////// -//~ rjf: Trap Nets - -typedef struct D_TrapNet D_TrapNet; -struct D_TrapNet -{ - CTRL_TrapList traps; - B32 good_line_info; - B32 good_read; -}; - //////////////////////////////// //~ rjf: Tick Output Types @@ -131,309 +345,58 @@ struct D_EventList }; //////////////////////////////// -//~ rjf: Line Info Types +//~ rjf: Trap Types -typedef struct D_Line D_Line; -struct D_Line +typedef U32 CTRL_TrapFlags; +enum { - String8 file_path; - TxtPt pt; - Rng1U64 voff_range; - DI_Key dbgi_key; + CTRL_TrapFlag_IgnoreStackPointerCheck = (1<<0), + CTRL_TrapFlag_SingleStepAfterHit = (1<<1), + CTRL_TrapFlag_SaveStackPointer = (1<<2), + CTRL_TrapFlag_BeginSpoofMode = (1<<3), + CTRL_TrapFlag_EndStepping = (1<<4), }; -typedef struct D_LineNode D_LineNode; -struct D_LineNode +typedef struct CTRL_Trap CTRL_Trap; +struct CTRL_Trap { - D_LineNode *next; - D_Line v; -}; - -typedef struct D_LineList D_LineList; -struct D_LineList -{ - D_LineNode *first; - D_LineNode *last; - U64 count; -}; - -typedef struct D_LineListArray D_LineListArray; -struct D_LineListArray -{ - D_LineList *v; - U64 count; - DI_KeyList dbgi_keys; -}; - -//////////////////////////////// -//~ rjf: Debug Engine Control Communication Types - -typedef enum D_RunKind -{ - D_RunKind_Run, - D_RunKind_SingleStep, - D_RunKind_Step, - D_RunKind_COUNT -} -D_RunKind; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "dbg_engine/generated/dbg_engine.meta.h" - -//////////////////////////////// -//~ rjf: Command Types - -typedef struct D_CmdParams D_CmdParams; -struct D_CmdParams -{ - CTRL_Handle machine; - CTRL_Handle process; - CTRL_Handle thread; - CTRL_Handle entity; - String8 string; - String8 file_path; - TxtPt cursor; + CTRL_TrapFlags flags; U64 vaddr; - B32 prefer_disasm; - U32 pid; - U32 rgba; - D_TargetArray targets; - U64 retry_idx; }; -typedef struct D_Cmd D_Cmd; -struct D_Cmd +typedef struct CTRL_TrapNode CTRL_TrapNode; +struct CTRL_TrapNode { - D_CmdKind kind; - D_CmdParams params; + CTRL_TrapNode *next; + CTRL_Trap v; }; -typedef struct D_CmdNode D_CmdNode; -struct D_CmdNode +typedef struct CTRL_TrapList CTRL_TrapList; +struct CTRL_TrapList { - D_CmdNode *next; - D_CmdNode *prev; - D_Cmd cmd; -}; - -typedef struct D_CmdList D_CmdList; -struct D_CmdList -{ - D_CmdNode *first; - D_CmdNode *last; + CTRL_TrapNode *first; + CTRL_TrapNode *last; U64 count; }; -//////////////////////////////// -//~ rjf: Main State Caches - -//- rjf: per-run tls-base-vaddr cache - -typedef struct D_RunTLSBaseCacheNode D_RunTLSBaseCacheNode; -struct D_RunTLSBaseCacheNode +typedef struct CTRL_Spoof CTRL_Spoof; +struct CTRL_Spoof { - D_RunTLSBaseCacheNode *hash_next; - CTRL_Handle process; - U64 root_vaddr; - U64 rip_vaddr; - U64 tls_base_vaddr; -}; - -typedef struct D_RunTLSBaseCacheSlot D_RunTLSBaseCacheSlot; -struct D_RunTLSBaseCacheSlot -{ - D_RunTLSBaseCacheNode *first; - D_RunTLSBaseCacheNode *last; -}; - -typedef struct D_RunTLSBaseCache D_RunTLSBaseCache; -struct D_RunTLSBaseCache -{ - Arena *arena; - U64 slots_count; - D_RunTLSBaseCacheSlot *slots; -}; - -//- rjf: per-run locals cache - -typedef struct D_RunLocalsCacheNode D_RunLocalsCacheNode; -struct D_RunLocalsCacheNode -{ - D_RunLocalsCacheNode *hash_next; - DI_Key dbgi_key; - U64 voff; - E_String2NumMap *locals_map; -}; - -typedef struct D_RunLocalsCacheSlot D_RunLocalsCacheSlot; -struct D_RunLocalsCacheSlot -{ - D_RunLocalsCacheNode *first; - D_RunLocalsCacheNode *last; -}; - -typedef struct D_RunLocalsCache D_RunLocalsCache; -struct D_RunLocalsCache -{ - Arena *arena; - U64 table_size; - D_RunLocalsCacheSlot *table; + DMN_Handle process; + DMN_Handle thread; + U64 vaddr; + U64 new_ip_value; }; //////////////////////////////// -//~ rjf: Main State Types +//~ rjf: Trap Nets -typedef struct D_State D_State; -struct D_State +typedef struct D_TrapNet D_TrapNet; +struct D_TrapNet { - // rjf: top-level state - Arena *arena; - U64 frame_index; - - // rjf: commands - Arena *cmds_arena; - D_CmdList cmds; - - // rjf: output log key - C_Key output_log_key; - - // rjf: per-run caches - U64 tls_base_cache_reggen_idx; - U64 tls_base_cache_memgen_idx; - D_RunTLSBaseCache tls_base_caches[2]; - U64 tls_base_cache_gen; - U64 locals_cache_reggen_idx; - D_RunLocalsCache locals_caches[2]; - U64 locals_cache_gen; - U64 member_cache_reggen_idx; - D_RunLocalsCache member_caches[2]; - U64 member_cache_gen; - - // rjf: user -> ctrl driving state - Arena *ctrl_last_run_arena; - D_RunKind ctrl_last_run_kind; - U64 ctrl_last_run_frame_idx; - CTRL_Handle ctrl_last_run_thread_handle; - CTRL_RunFlags ctrl_last_run_flags; - CTRL_TrapList ctrl_last_run_traps; - D_BreakpointArray ctrl_last_run_extra_bps; - U128 ctrl_last_run_param_state_hash; - B32 ctrl_is_running; - B32 ctrl_thread_run_state; - B32 ctrl_soft_halt_issued; - Arena *ctrl_msg_arena; - CTRL_MsgList ctrl_msgs; - - // rjf: ctrl -> user reading state - CTRL_EntityCtxRWStore *ctrl_entity_store; - Arena *ctrl_stop_arena; - CTRL_Event ctrl_last_stop_event; + CTRL_TrapList traps; + B32 good_line_info; + B32 good_read; }; -//////////////////////////////// -//~ rjf: Globals - -global D_State *d_state = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 d_hash_from_seed_string(U64 seed, String8 string); -internal U64 d_hash_from_string(String8 string); -internal U64 d_hash_from_seed_string__case_insensitive(U64 seed, String8 string); -internal U64 d_hash_from_string__case_insensitive(String8 string); - -//////////////////////////////// -//~ rjf: Breakpoints - -internal D_BreakpointArray d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src); - -//////////////////////////////// -//~ rjf: Path Map Application - -internal String8List d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path); - -//////////////////////////////// -//~ rjf: Debug Info Extraction Type Pure Functions - -internal D_LineList d_line_list_copy(Arena *arena, D_LineList *list); - -//////////////////////////////// -//~ rjf: Command Type Functions - -//- rjf: command parameters -internal D_CmdParams d_cmd_params_copy(Arena *arena, D_CmdParams *src); - -//- rjf: command lists -internal void d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params); - -//////////////////////////////// -//~ rjf: Stepping "Trap Net" Builders - -internal D_TrapNet d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread); -internal D_TrapNet d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread); -internal D_TrapNet d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread); - -//////////////////////////////// -//~ rjf: Debug Info Lookups - -//- rjf: voff -> line info -internal D_LineList d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff); - -//- rjf: file:line -> line info -// TODO(rjf): this depends on file path maps, needs to move -// TODO(rjf): need to clean this up & dedup -internal D_LineListArray d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range); -internal D_LineListArray d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range); -internal D_LineList d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num); -internal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num); - -//////////////////////////////// -//~ rjf: Process/Thread/Module Info Lookups - -internal U64 d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); - -//////////////////////////////// -//~ rjf: Target Controls - -//- rjf: stopped info from the control thread -internal CTRL_Event d_ctrl_last_stop_event(void); - -//////////////////////////////// -//~ rjf: Main State Accessors/Mutators - -//- rjf: frame data -internal U64 d_frame_index(void); - -//- rjf: control state -internal D_RunKind d_ctrl_last_run_kind(void); -internal U64 d_ctrl_last_run_frame_idx(void); -internal B32 d_ctrl_targets_running(void); - -//- rjf: active entity based queries -internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); - -//- rjf: per-run caches -internal U64 d_query_cached_rip_from_thread(CTRL_Entity *thread); -internal U64 d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); -internal U64 d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); -internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); -internal E_String2NumMap *d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); -internal E_String2NumMap *d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); - -//- rjf: top-level command dispatch -internal void d_push_cmd(D_CmdKind kind, D_CmdParams *params); -#define d_cmd(kind, ...) d_push_cmd((kind), &(D_CmdParams){.thread = {0}, __VA_ARGS__}) - -//- rjf: command iteration -internal B32 d_next_cmd(D_Cmd **cmd); - -//////////////////////////////// -//~ rjf: Main Layer Top-Level Calls - -internal void d_init(void); -internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]); - #endif // DBG_ENGINE_CORE_H diff --git a/src/ctrl/ctrl_core.c b/src/dbg_engine/dbg_engine_ctrl.c similarity index 97% rename from src/ctrl/ctrl_core.c rename to src/dbg_engine/dbg_engine_ctrl.c index 2ecfd9ad..32357e0e 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1,7192 +1,7187 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/ctrl.meta.c" - -//////////////////////////////// -//~ rjf: Basic Type Functions - -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - -internal U64 -ctrl_hash_from_string(String8 string) -{ - U64 result = XXH3_64bits_withSeed(string.str, string.size, 5381); - return result; -} - -internal U64 -ctrl_hash_from_handle(CTRL_Handle handle) -{ - U64 buf[] = {handle.machine_id, handle.dmn_handle.u64[0]}; - U64 hash = ctrl_hash_from_string(str8((U8 *)buf, sizeof(buf))); - return hash; -} - -internal CTRL_EventCause -ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) -{ - CTRL_EventCause cause = CTRL_EventCause_Null; - switch(event_kind) - { - default:{}break; - case DMN_EventKind_Error: {cause = CTRL_EventCause_Error;}break; - case DMN_EventKind_Exception:{cause = CTRL_EventCause_InterruptedByException;}break; - case DMN_EventKind_Trap: {cause = CTRL_EventCause_InterruptedByTrap;}break; - case DMN_EventKind_Halt: {cause = CTRL_EventCause_InterruptedByHalt;}break; - } - return cause; -} - -internal CTRL_ExceptionKind -ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind) -{ - CTRL_ExceptionKind result = CTRL_ExceptionKind_Null; - switch(kind) - { - default:{}break; - case DMN_ExceptionKind_MemoryRead: {result = CTRL_ExceptionKind_MemoryRead;}break; - case DMN_ExceptionKind_MemoryWrite: {result = CTRL_ExceptionKind_MemoryWrite;}break; - case DMN_ExceptionKind_MemoryExecute: {result = CTRL_ExceptionKind_MemoryExecute;}break; - case DMN_ExceptionKind_CppThrow: {result = CTRL_ExceptionKind_CppThrow;}break; - } - return result; -} - -internal CTRL_TlsModel -ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type) -{ - CTRL_TlsModel result = CTRL_TlsModel_Null; - switch(type) - { - default:{}break; - case DMN_TlsModel_Null: {result = CTRL_TlsModel_Null;}break; - case DMN_TlsModel_WinodwsNt: {result = CTRL_TlsModel_WinodwsNt;}break; - case DMN_TlsModel_Gnu: {result = CTRL_TlsModel_Gnu;}break; - } - return result; -} - -internal String8 -ctrl_string_from_event_kind(CTRL_EventKind kind) -{ - String8 result = {0}; - switch(kind) - { - default:{}break; - case CTRL_EventKind_Null: { result = str8_lit("Null");}break; - case CTRL_EventKind_Error: { result = str8_lit("Error");}break; - case CTRL_EventKind_Started: { result = str8_lit("Started");}break; - case CTRL_EventKind_Stopped: { result = str8_lit("Stopped");}break; - case CTRL_EventKind_NewProc: { result = str8_lit("NewProc");}break; - case CTRL_EventKind_NewThread: { result = str8_lit("NewThread");}break; - case CTRL_EventKind_NewModule: { result = str8_lit("NewModule");}break; - case CTRL_EventKind_EndProc: { result = str8_lit("EndProc");}break; - case CTRL_EventKind_EndThread: { result = str8_lit("EndThread");}break; - case CTRL_EventKind_EndModule: { result = str8_lit("EndModule");}break; - case CTRL_EventKind_ModuleDebugInfoPathChange: { result = str8_lit("ModuleDebugInfoPathChange");}break; - case CTRL_EventKind_DebugString: { result = str8_lit("DebugString");}break; - case CTRL_EventKind_ThreadName: { result = str8_lit("ThreadName");}break; - case CTRL_EventKind_MemReserve: { result = str8_lit("MemReserve");}break; - case CTRL_EventKind_MemCommit: { result = str8_lit("MemCommit");}break; - case CTRL_EventKind_MemDecommit: { result = str8_lit("MemDecommit");}break; - case CTRL_EventKind_MemRelease: { result = str8_lit("MemRelease");}break; - } - return result; -} - -internal String8 -ctrl_string_from_msg_kind(CTRL_MsgKind kind) -{ - String8 result = {0}; - switch(kind) - { - default:{}break; - case CTRL_MsgKind_Launch: {result = str8_lit("Launch");}break; - case CTRL_MsgKind_Attach: {result = str8_lit("Attach");}break; - case CTRL_MsgKind_Kill: {result = str8_lit("Kill");}break; - case CTRL_MsgKind_KillAll: {result = str8_lit("KillAll");}break; - case CTRL_MsgKind_Detach: {result = str8_lit("Detach");}break; - case CTRL_MsgKind_Run: {result = str8_lit("Run");}break; - case CTRL_MsgKind_SingleStep: {result = str8_lit("SingleStep");}break; - case CTRL_MsgKind_SetUserEntryPoints: {result = str8_lit("SetUserEntryPoints");}break; - case CTRL_MsgKind_SetModuleDebugInfoPath: {result = str8_lit("SetModuleDebugInfoPath");}break; - } - return result; -} - -internal CTRL_EntityKind -ctrl_entity_kind_from_string(String8 string) -{ - CTRL_EntityKind result = CTRL_EntityKind_Null; - for EachNonZeroEnumVal(CTRL_EntityKind, k) - { - if(str8_match(ctrl_entity_kind_code_name_table[k], string, 0)) - { - result = k; - break; - } - } - return result; -} - -internal DMN_TrapFlags -ctrl_dmn_trap_flags_from_user_breakpoint_flags(CTRL_UserBreakpointFlags flags) -{ - DMN_TrapFlags result = 0; - if(flags & CTRL_UserBreakpointFlag_BreakOnWrite) { result |= DMN_TrapFlag_BreakOnWrite; } - if(flags & CTRL_UserBreakpointFlag_BreakOnRead) { result |= DMN_TrapFlag_BreakOnRead; } - if(flags & CTRL_UserBreakpointFlag_BreakOnExecute) { result |= DMN_TrapFlag_BreakOnExecute; } - return result; -} - -internal CTRL_UserBreakpointFlags -ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags) -{ - CTRL_UserBreakpointFlags result = 0; - if(flags & DMN_TrapFlag_BreakOnWrite) { result |= CTRL_UserBreakpointFlag_BreakOnWrite; } - if(flags & DMN_TrapFlag_BreakOnRead) { result |= CTRL_UserBreakpointFlag_BreakOnRead; } - if(flags & DMN_TrapFlag_BreakOnExecute) { result |= CTRL_UserBreakpointFlag_BreakOnExecute; } - return result; -} - -//////////////////////////////// -//~ rjf: Machine/Handle Pair Type Functions - -internal CTRL_Handle -ctrl_handle_zero(void) -{ - CTRL_Handle handle = {0}; - return handle; -} - -internal CTRL_Handle -ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle) -{ - CTRL_Handle handle = {machine_id, dmn_handle}; - return handle; -} - -internal B32 -ctrl_handle_match(CTRL_Handle a, CTRL_Handle b) -{ - B32 result = (a.machine_id == b.machine_id && - dmn_handle_match(a.dmn_handle, b.dmn_handle)); - return result; -} - -internal void -ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair) -{ - CTRL_HandleNode *n = push_array(arena, CTRL_HandleNode, 1); - MemoryCopyStruct(&n->v, pair); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal CTRL_HandleList -ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src) -{ - CTRL_HandleList dst = {0}; - for(CTRL_HandleNode *n = src->first; n != 0; n = n->next) - { - ctrl_handle_list_push(arena, &dst, &n->v); - } - return dst; -} - -internal CTRL_HandleArray -ctrl_handle_array_from_list(Arena *arena, CTRL_HandleList *src) -{ - CTRL_HandleArray array = {0}; - array.count = src->count; - array.v = push_array_no_zero(arena, CTRL_Handle, array.count); - { - U64 idx = 0; - for(CTRL_HandleNode *n = src->first; n != 0; n = n->next, idx += 1) - { - array.v[idx] = n->v; - } - } - return array; -} - -internal String8 -ctrl_string_from_handle(Arena *arena, CTRL_Handle handle) -{ - String8 result = push_str8f(arena, "$%I64x$%I64x", handle.machine_id, handle.dmn_handle.u64[0]); - return result; -} - -internal CTRL_Handle -ctrl_handle_from_string(String8 string) -{ - CTRL_Handle handle = {0}; - { - Temp scratch = scratch_begin(0, 0); - U8 split = '$'; - String8List parts = str8_split(scratch.arena, string, &split, 1, 0); - if(parts.first && parts.first->next) - { - CTRL_MachineID machine_id = u64_from_str8(parts.first->string, 16); - DMN_Handle dmn_handle = {0}; - dmn_handle.u64[0] = u64_from_str8(parts.first->next->string, 16); - handle.machine_id = machine_id; - handle.dmn_handle = dmn_handle; - } - scratch_end(scratch); - } - return handle; -} - -//////////////////////////////// -//~ rjf: Trap Type Functions - -internal void -ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap) -{ - CTRL_TrapNode *node = push_array(arena, CTRL_TrapNode, 1); - MemoryCopyStruct(&node->v, trap); - SLLQueuePush(list->first, list->last, node); - list->count += 1; -} - -internal CTRL_TrapList -ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src) -{ - CTRL_TrapList dst = {0}; - for(CTRL_TrapNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - ctrl_trap_list_push(arena, &dst, &src_n->v); - } - return dst; -} - -//////////////////////////////// -//~ rjf: User Breakpoint Type Functions - -internal void -ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp) -{ - CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); - MemoryCopyStruct(&n->v, bp); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal CTRL_UserBreakpointList -ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src) -{ - CTRL_UserBreakpointList dst = {0}; - for(CTRL_UserBreakpointNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - CTRL_UserBreakpoint dst_bp = zero_struct; - MemoryCopyStruct(&dst_bp, &src_n->v); - dst_bp.string = push_str8_copy(arena, src_n->v.string); - dst_bp.condition = push_str8_copy(arena, src_n->v.condition); - ctrl_user_breakpoint_list_push(arena, &dst, &dst_bp); - } - return dst; -} - -//////////////////////////////// -//~ rjf: Message Type Functions - -//- rjf: deep copying - -internal void -ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src) -{ - MemoryCopyStruct(dst, src); - dst->path = push_str8_copy(arena, src->path); - dst->entry_points = str8_list_copy(arena, &src->entry_points); - dst->cmd_line_string_list = str8_list_copy(arena, &src->cmd_line_string_list); - dst->env_string_list = str8_list_copy(arena, &src->env_string_list); - dst->traps = ctrl_trap_list_copy(arena, &src->traps); - dst->user_bps = ctrl_user_breakpoint_list_copy(arena, &src->user_bps); -} - -//- rjf: list building - -internal CTRL_Msg * -ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list) -{ - CTRL_MsgNode *n = push_array(arena, CTRL_MsgNode, 1); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - CTRL_Msg *msg = &n->v; - return msg; -} - -internal CTRL_MsgList -ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src) -{ - CTRL_MsgList dst = {0}; - for(CTRL_MsgNode *n = src->first; n != 0; n = n->next) - { - CTRL_Msg *src_msg = &n->v; - CTRL_Msg *dst_msg = ctrl_msg_list_push(arena, &dst); - ctrl_msg_deep_copy(arena, dst_msg, src_msg); - } - return dst; -} - -internal void -ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src) -{ - if(dst->last && src->first) - { - dst->last->next = src->first; - dst->last = src->last; - dst->count += src->count; - } - else if(src->first) - { - MemoryCopyStruct(dst, src); - } - MemoryZeroStruct(src); -} - -//- rjf: serialization - -internal String8 -ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List msgs_srlzed = {0}; - str8_serial_begin(scratch.arena, &msgs_srlzed); - { - // rjf: write message count - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msgs->count); - - // rjf: write all message data - for(CTRL_MsgNode *msg_n = msgs->first; msg_n != 0; msg_n = msg_n->next) - { - CTRL_Msg *msg = &msg_n->v; - - // rjf: write flat parts - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->kind); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->run_flags); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->msg_id); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->parent); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity_id); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->exit_code); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_inherit); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->debug_subprocesses); - str8_serial_push_array (scratch.arena, &msgs_srlzed, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); - - // rjf: write path string - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->path.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, msg->path.str, msg->path.size); - - // rjf: write entry point string list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entry_points.node_count); - for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) - { - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); - } - - // rjf: write command line string list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->cmd_line_string_list.node_count); - for(String8Node *n = msg->cmd_line_string_list.first; n != 0; n = n->next) - { - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); - } - - // rjf: write environment string list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_string_list.node_count); - for(String8Node *n = msg->env_string_list.first; n != 0; n = n->next) - { - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); - } - - // rjf: write stdout/stderr/stdin paths - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdout_path.size); - str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdout_path); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stderr_path.size); - str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stderr_path); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdin_path.size); - str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdin_path); - - // rjf: write trap list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->traps.count); - for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) - { - CTRL_Trap *trap = &n->v; - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->flags); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->vaddr); - } - - // rjf: write user breakpoint list - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->user_bps.count); - for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) - { - CTRL_UserBreakpoint *bp = &n->v; - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->kind); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->flags); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->id); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->string.str, bp->string.size); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->pt); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->size); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->condition.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->condition.str, bp->condition.size); - } - } - } - String8 string = str8_serial_end(arena, &msgs_srlzed); - scratch_end(scratch); - return string; -} - -internal CTRL_MsgList -ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) -{ - CTRL_MsgList msgs = {0}; - { - U64 read_off = 0; - - // rjf: read message count - U64 msg_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &msg_count); - - // rjf: read data for all messages - for(U64 msg_idx = 0; msg_idx < msg_count; msg_idx += 1) - { - // rjf: construct message - CTRL_MsgNode *msg_node = push_array(arena, CTRL_MsgNode, 1); - SLLQueuePush(msgs.first, msgs.last, msg_node); - msgs.count += 1; - CTRL_Msg *msg = &msg_node->v; - - // rjf: read flat data - read_off += str8_deserial_read_struct(string, read_off, &msg->kind); - read_off += str8_deserial_read_struct(string, read_off, &msg->run_flags); - read_off += str8_deserial_read_struct(string, read_off, &msg->msg_id); - read_off += str8_deserial_read_struct(string, read_off, &msg->entity); - read_off += str8_deserial_read_struct(string, read_off, &msg->parent); - read_off += str8_deserial_read_struct(string, read_off, &msg->entity_id); - read_off += str8_deserial_read_struct(string, read_off, &msg->exit_code); - read_off += str8_deserial_read_struct(string, read_off, &msg->env_inherit); - read_off += str8_deserial_read_struct(string, read_off, &msg->debug_subprocesses); - read_off += str8_deserial_read_array (string, read_off, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); - - // rjf: read path string - read_off += str8_deserial_read_struct(string, read_off, &msg->path.size); - msg->path.str = push_array_no_zero(arena, U8, msg->path.size); - read_off += str8_deserial_read(string, read_off, msg->path.str, msg->path.size, 1); - - // rjf: read entry point string list - U64 entry_point_list_string_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &entry_point_list_string_count); - for(U64 idx = 0; idx < entry_point_list_string_count; idx += 1) - { - String8 str = {0}; - read_off += str8_deserial_read_struct(string, read_off, &str.size); - str.str = push_array_no_zero(arena, U8, str.size); - read_off += str8_deserial_read(string, read_off, str.str, str.size, 1); - str8_list_push(arena, &msg->entry_points, str); - } - - // rjf: read command line string list - U64 cmd_line_string_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &cmd_line_string_count); - for(U64 idx = 0; idx < cmd_line_string_count; idx += 1) - { - String8 cmd_line_str = {0}; - read_off += str8_deserial_read_struct(string, read_off, &cmd_line_str.size); - cmd_line_str.str = push_array_no_zero(arena, U8, cmd_line_str.size); - read_off += str8_deserial_read(string, read_off, cmd_line_str.str, cmd_line_str.size, 1); - str8_list_push(arena, &msg->cmd_line_string_list, cmd_line_str); - } - - // rjf: read environment string list - U64 env_string_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &env_string_count); - for(U64 idx = 0; idx < env_string_count; idx += 1) - { - String8 env_str = {0}; - read_off += str8_deserial_read_struct(string, read_off, &env_str.size); - env_str.str = push_array_no_zero(arena, U8, env_str.size); - read_off += str8_deserial_read(string, read_off, env_str.str, env_str.size, 1); - str8_list_push(arena, &msg->env_string_list, env_str); - } - - // rjf: read stdout/stderr/stdin paths - read_off += str8_deserial_read_struct(string, read_off, &msg->stdout_path.size); - msg->stdout_path.str = push_array(arena, U8, msg->stdout_path.size); - read_off += str8_deserial_read(string, read_off, msg->stdout_path.str, msg->stdout_path.size, 1); - read_off += str8_deserial_read_struct(string, read_off, &msg->stderr_path.size); - msg->stderr_path.str = push_array(arena, U8, msg->stderr_path.size); - read_off += str8_deserial_read(string, read_off, msg->stderr_path.str, msg->stderr_path.size, 1); - read_off += str8_deserial_read_struct(string, read_off, &msg->stdin_path.size); - msg->stdin_path.str = push_array(arena, U8, msg->stdin_path.size); - read_off += str8_deserial_read(string, read_off, msg->stdin_path.str, msg->stdin_path.size, 1); - - // rjf: read trap list - U64 trap_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &trap_count); - for(U64 idx = 0; idx < trap_count; idx += 1) - { - CTRL_TrapNode *n = push_array(arena, CTRL_TrapNode, 1); - SLLQueuePush(msg->traps.first, msg->traps.last, n); - msg->traps.count += 1; - CTRL_Trap *trap = &n->v; - read_off += str8_deserial_read_struct(string, read_off, &trap->flags); - read_off += str8_deserial_read_struct(string, read_off, &trap->vaddr); - } - - // rjf: read user breakpoint list - U64 user_bp_count = 0; - read_off += str8_deserial_read_struct(string, read_off, &user_bp_count); - for(U64 idx = 0; idx < user_bp_count; idx += 1) - { - CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); - SLLQueuePush(msg->user_bps.first, msg->user_bps.last, n); - msg->user_bps.count += 1; - CTRL_UserBreakpoint *bp = &n->v; - read_off += str8_deserial_read_struct(string, read_off, &bp->kind); - read_off += str8_deserial_read_struct(string, read_off, &bp->flags); - read_off += str8_deserial_read_struct(string, read_off, &bp->id); - read_off += str8_deserial_read_struct(string, read_off, &bp->string.size); - bp->string.str = push_array_no_zero(arena, U8, bp->string.size); - read_off += str8_deserial_read(string, read_off, bp->string.str, bp->string.size, 1); - read_off += str8_deserial_read_struct(string, read_off, &bp->pt); - read_off += str8_deserial_read_struct(string, read_off, &bp->size); - read_off += str8_deserial_read_struct(string, read_off, &bp->condition.size); - bp->condition.str = push_array_no_zero(arena, U8, bp->condition.size); - read_off += str8_deserial_read(string, read_off, bp->condition.str, bp->condition.size, 1); - } - } - } - return msgs; -} - -//////////////////////////////// -//~ rjf: Event Type Functions - -//- rjf: list building - -internal CTRL_Event * -ctrl_event_list_push(Arena *arena, CTRL_EventList *list) -{ - CTRL_EventNode *n = push_array(arena, CTRL_EventNode, 1); - SLLQueuePush(list->first, list->last, n); - list->count += 1; - CTRL_Event *event = &n->v; - return event; -} - -internal void -ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push) -{ - if(dst->last == 0) - { - MemoryCopyStruct(dst, to_push); - } - else if(to_push->first != 0) - { - dst->last->next = to_push->first; - dst->last = to_push->last; - dst->count += to_push->count; - } - MemoryZeroStruct(to_push); -} - -//- rjf: serialization - -internal String8 -ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List srl = {0}; - str8_serial_begin(scratch.arena, &srl); - { - str8_serial_push_struct(scratch.arena, &srl, &event->kind); - str8_serial_push_struct(scratch.arena, &srl, &event->cause); - str8_serial_push_struct(scratch.arena, &srl, &event->exception_kind); - str8_serial_push_struct(scratch.arena, &srl, &event->msg_id); - str8_serial_push_struct(scratch.arena, &srl, &event->entity); - str8_serial_push_struct(scratch.arena, &srl, &event->parent); - str8_serial_push_struct(scratch.arena, &srl, &event->arch); - str8_serial_push_struct(scratch.arena, &srl, &event->u64_code); - str8_serial_push_struct(scratch.arena, &srl, &event->entity_id); - str8_serial_push_struct(scratch.arena, &srl, &event->vaddr_rng); - str8_serial_push_struct(scratch.arena, &srl, &event->rip_vaddr); - str8_serial_push_struct(scratch.arena, &srl, &event->stack_base); - str8_serial_push_struct(scratch.arena, &srl, &event->tls_root); - str8_serial_push_struct(scratch.arena, &srl, &event->timestamp); - str8_serial_push_struct(scratch.arena, &srl, &event->exception_code); - str8_serial_push_struct(scratch.arena, &srl, &event->rgba); - str8_serial_push_struct(scratch.arena, &srl, &event->bp_flags); - str8_serial_push_struct(scratch.arena, &srl, &event->target_os); - str8_serial_push_struct(scratch.arena, &srl, &event->tls_model); - str8_serial_push_struct(scratch.arena, &srl, &event->tls_index); - str8_serial_push_struct(scratch.arena, &srl, &event->tls_offset); - String8 string = event->string; - string.size = Min(string.size, max-srl.total_size); - str8_serial_push_struct(scratch.arena, &srl, &string.size); - str8_serial_push_data(scratch.arena, &srl, string.str, string.size); - } - String8 string = str8_serial_end(arena, &srl); - scratch_end(scratch); - return string; -} - -internal CTRL_Event -ctrl_event_from_serialized_string(Arena *arena, String8 string) -{ - CTRL_Event event = zero_struct; - { - U64 read_off = 0; - read_off += str8_deserial_read_struct(string, read_off, &event.kind); - read_off += str8_deserial_read_struct(string, read_off, &event.cause); - read_off += str8_deserial_read_struct(string, read_off, &event.exception_kind); - read_off += str8_deserial_read_struct(string, read_off, &event.msg_id); - read_off += str8_deserial_read_struct(string, read_off, &event.entity); - read_off += str8_deserial_read_struct(string, read_off, &event.parent); - read_off += str8_deserial_read_struct(string, read_off, &event.arch); - read_off += str8_deserial_read_struct(string, read_off, &event.u64_code); - read_off += str8_deserial_read_struct(string, read_off, &event.entity_id); - read_off += str8_deserial_read_struct(string, read_off, &event.vaddr_rng); - read_off += str8_deserial_read_struct(string, read_off, &event.rip_vaddr); - read_off += str8_deserial_read_struct(string, read_off, &event.stack_base); - read_off += str8_deserial_read_struct(string, read_off, &event.tls_root); - read_off += str8_deserial_read_struct(string, read_off, &event.timestamp); - read_off += str8_deserial_read_struct(string, read_off, &event.exception_code); - read_off += str8_deserial_read_struct(string, read_off, &event.rgba); - read_off += str8_deserial_read_struct(string, read_off, &event.bp_flags); - read_off += str8_deserial_read_struct(string, read_off, &event.target_os); - read_off += str8_deserial_read_struct(string, read_off, &event.tls_model); - read_off += str8_deserial_read_struct(string, read_off, &event.tls_index); - read_off += str8_deserial_read_struct(string, read_off, &event.tls_offset); - read_off += str8_deserial_read_struct(string, read_off, &event.string.size); - event.string.str = push_array_no_zero(arena, U8, event.string.size); - read_off += str8_deserial_read(string, read_off, event.string.str, event.string.size, 1); - } - return event; -} - -//////////////////////////////// -//~ rjf: Entity Type Functions - -//- rjf: entity list data structures - -internal void -ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity) -{ - CTRL_EntityNode *n = push_array(arena, CTRL_EntityNode, 1); - n->v = entity; - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal CTRL_EntityList -ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_HandleList *list) -{ - CTRL_EntityList result = {0}; - for(CTRL_HandleNode *n = list->first; n != 0; n = n->next) - { - CTRL_Entity *entity = ctrl_entity_from_handle(ctx, n->v); - ctrl_entity_list_push(arena, &result, entity); - } - return result; -} - -//- rjf: entity array data structure - -internal CTRL_EntityArray -ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list) -{ - CTRL_EntityArray result = {0}; - result.count = list->count; - result.v = push_array_no_zero(arena, CTRL_Entity *, result.count); - U64 idx = 0; - for(CTRL_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->v; - } - return result; -} - -//- rjf: entity context (entity group read-only) functions - -internal CTRL_Entity * -ctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle) -{ - CTRL_Entity *entity = &ctrl_entity_nil; - if(!ctrl_handle_match(handle, ctrl_handle_zero())) - { - U64 hash = ctrl_hash_from_handle(handle); - U64 slot_idx = hash%ctx->hash_slots_count; - CTRL_EntityHashSlot *slot = &ctx->hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->entity->handle, handle)) - { - entity = n->entity; - break; - } - } - } - return entity; -} - -internal CTRL_Entity * -ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind) -{ - CTRL_Entity *result = &ctrl_entity_nil; - for(CTRL_Entity *child = parent->first; - child != &ctrl_entity_nil; - child = child->next) - { - if(child->kind == kind) - { - result = child; - break; - } - } - return result; -} - -internal CTRL_Entity * -ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind) -{ - CTRL_Entity *result = &ctrl_entity_nil; - for(CTRL_Entity *p = entity->parent; p != &ctrl_entity_nil; p = p->parent) - { - if(p->kind == kind) - { - result = p; - break; - } - } - return result; -} - -internal CTRL_Entity * -ctrl_process_from_entity(CTRL_Entity *entity) -{ - CTRL_Entity *result = &ctrl_entity_nil; - if(entity->kind == CTRL_EntityKind_Process) - { - result = entity; - } - else - { - result = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); - } - return result; -} - -internal CTRL_Entity * -ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr) -{ - CTRL_Entity *result = &ctrl_entity_nil; - for(CTRL_Entity *child = process->first; - child != &ctrl_entity_nil; - child = child->next) - { - if(child->kind == CTRL_EntityKind_Module && contains_1u64(child->vaddr_range, vaddr)) - { - result = child; - break; - } - } - return result; -} - -internal DI_Key -ctrl_dbgi_key_from_module(CTRL_Entity *module) -{ - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - DI_Key dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); - return dbgi_key; -} - -internal CTRL_Entity * -ctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTRL_EntityList *candidates) -{ - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - U64 thread_rip_vaddr = ctrl_rip_from_thread(ctx, thread->handle); - CTRL_Entity *src_module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); - CTRL_Entity *module = &ctrl_entity_nil; - for(CTRL_EntityNode *n = candidates->first; n != 0; n = n->next) - { - CTRL_Entity *candidate_module = n->v; - CTRL_Entity *candidate_process = ctrl_entity_ancestor_from_kind(candidate_module, CTRL_EntityKind_Process); - if(candidate_process == process) - { - module = candidate_module; - } - if(candidate_module == src_module) - { - break; - } - } - return module; -} - -internal U64 -ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff) -{ - U64 result = voff + module->vaddr_range.min; - return result; -} - -internal U64 -ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr) -{ - U64 result = vaddr - module->vaddr_range.min; - return result; -} - -internal Rng1U64 -ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range) -{ - U64 dim = dim_1u64(voff_range); - U64 min = ctrl_vaddr_from_voff(module, voff_range.min); - Rng1U64 result = {min, min+dim}; - return result; -} - -internal Rng1U64 -ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range) -{ - U64 dim = dim_1u64(vaddr_range); - U64 min = ctrl_voff_from_vaddr(module, vaddr_range.min); - Rng1U64 result = {min, min+dim}; - return result; -} - -internal B32 -ctrl_entity_tree_is_frozen(CTRL_Entity *root) -{ - B32 is_frozen = 1; - for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) - { - if(e->kind == CTRL_EntityKind_Thread && !e->is_frozen) - { - is_frozen = 0; - break; - } - } - return is_frozen; -} - -//- rjf: entity ctx r/w store state functions - -internal CTRL_EntityCtxRWStore * -ctrl_entity_ctx_rw_store_alloc(void) -{ - Arena *arena = arena_alloc(); - CTRL_EntityCtxRWStore *store = push_array(arena, CTRL_EntityCtxRWStore, 1); - store->arena = arena; - store->ctx.hash_slots_count = 1024; - store->ctx.hash_slots = push_array(arena, CTRL_EntityHashSlot, store->ctx.hash_slots_count); - CTRL_Entity *root = store->ctx.root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Arch_Null, ctrl_handle_zero(), 0); - CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, Arch_CURRENT, ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero()), 0); - Temp scratch = scratch_begin(0, 0); - String8 local_machine_name = push_str8f(scratch.arena, "This PC (%S)", os_get_system_info()->machine_name); - ctrl_entity_equip_string(store, local_machine, local_machine_name); - scratch_end(scratch); - return store; -} - -internal void -ctrl_entity_ctx_rw_store_release(CTRL_EntityCtxRWStore *store) -{ - arena_release(store->arena); -} - -//- rjf: string allocation/deletion - -internal U64 -ctrl_name_bucket_num_from_string_size(U64 size) -{ - U64 bucket_num = 0; - if(size > 0) - { - for EachElement(idx, ctrl_entity_string_bucket_chunk_sizes) - { - if(size <= ctrl_entity_string_bucket_chunk_sizes[idx]) - { - bucket_num = idx+1; - break; - } - } - } - return bucket_num; -} - -internal String8 -ctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string) -{ - //- rjf: allocate node - CTRL_EntityStringChunkNode *node = 0; - { - U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size); - if(bucket_num == ArrayCount(ctrl_entity_string_bucket_chunk_sizes)) - { - CTRL_EntityStringChunkNode *best_node = 0; - CTRL_EntityStringChunkNode *best_node_prev = 0; - U64 best_node_size = max_U64; - { - for(CTRL_EntityStringChunkNode *n = store->free_string_chunks[bucket_num-1], *prev = 0; n != 0; (prev = n, n = n->next)) - { - if(n->size >= string.size && n->size < best_node_size) - { - best_node = n; - best_node_prev = prev; - best_node_size = n->size; - } - } - } - if(best_node != 0) - { - node = best_node; - if(best_node_prev) - { - best_node_prev->next = best_node->next; - } - else - { - store->free_string_chunks[bucket_num-1] = best_node->next; - } - } - else - { - U64 chunk_size = u64_up_to_pow2(string.size); - node = (CTRL_EntityStringChunkNode *)push_array(store->arena, U8, chunk_size); - } - } - else if(bucket_num != 0) - { - node = store->free_string_chunks[bucket_num-1]; - if(node != 0) - { - SLLStackPop(store->free_string_chunks[bucket_num-1]); - } - else - { - node = (CTRL_EntityStringChunkNode *)push_array(store->arena, U8, ctrl_entity_string_bucket_chunk_sizes[bucket_num-1]); - } - } - } - - //- rjf: fill node - String8 result = {0}; - if(node != 0) - { - result.str = (U8 *)node; - result.size = string.size; - MemoryCopy(result.str, string.str, result.size); - } - return result; -} - -internal void -ctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string) -{ - U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size); - if(1 <= bucket_num && bucket_num <= ArrayCount(ctrl_entity_string_bucket_chunk_sizes)) - { - U64 bucket_idx = bucket_num-1; - CTRL_EntityStringChunkNode *node = (CTRL_EntityStringChunkNode *)string.str; - SLLStackPush(store->free_string_chunks[bucket_idx], node); - node->size = u64_up_to_pow2(string.size); - } -} - -//- rjf: entity construction/deletion - -internal CTRL_Entity * -ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id) -{ - CTRL_Entity *entity = &ctrl_entity_nil; - { - // rjf: allocate - entity = store->free; - { - if(entity != 0) - { - SLLStackPop(store->free); - } - else - { - entity = push_array_no_zero(store->arena, CTRL_Entity, 1); - } - MemoryZeroStruct(entity); - } - - // rjf: fill - { - entity->kind = kind; - entity->arch = arch; - entity->handle = handle; - entity->id = id; - entity->parent = parent; - entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; - if(parent != &ctrl_entity_nil) - { - DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); - } - } - - // rjf: insert into hash map - { - U64 hash = ctrl_hash_from_handle(handle); - U64 slot_idx = hash%store->ctx.hash_slots_count; - CTRL_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->entity->handle, handle)) - { - node = n; - break; - } - } - if(node == 0) - { - node = store->hash_node_free; - if(node != 0) - { - SLLStackPop(store->hash_node_free); - } - else - { - node = push_array_no_zero(store->arena, CTRL_EntityHashNode, 1); - } - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->entity = entity; - } - } - - // rjf: bump counters - store->ctx.entity_kind_counts[kind] += 1; - store->ctx.entity_kind_alloc_gens[kind] += 1; - } - return entity; -} - -internal void -ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity) -{ - // rjf: unhook root - if(entity->parent != &ctrl_entity_nil) - { - DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); - } - - // rjf: walk every entity in this tree, free each - if(entity != &ctrl_entity_nil) - { - Temp scratch = scratch_begin(0, 0); - typedef struct Task Task; - struct Task - { - Task *next; - CTRL_Entity *e; - }; - Task start_task = {0, entity}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *t = first_task; t != 0; t = t->next) - { - for(CTRL_Entity *child = t->e->first; child != &ctrl_entity_nil; child = child->next) - { - Task *t = push_array(scratch.arena, Task, 1); - t->e = child; - SLLQueuePush(first_task, last_task, t); - } - - // rjf: free entity - SLLStackPush(store->free, t->e); - - // rjf: remove from hash map - { - U64 hash = ctrl_hash_from_handle(t->e->handle); - U64 slot_idx = hash%store->ctx.hash_slots_count; - CTRL_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->entity->handle, t->e->handle)) - { - DLLRemove(slot->first, slot->last, n); - SLLStackPush(store->hash_node_free, n); - break; - } - } - } - - // rjf: dec counter - store->ctx.entity_kind_counts[t->e->kind] -= 1; - store->ctx.entity_kind_alloc_gens[t->e->kind] += 1; - } - scratch_end(scratch); - } -} - -//- rjf: entity equipment - -internal void -ctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, String8 string) -{ - if(entity->string.size != 0) - { - ctrl_entity_string_release(store, entity->string); - } - entity->string = ctrl_entity_string_alloc(store, string); -} - -//- rjf: accelerated entity context lookups - -internal CTRL_EntityCtxLookupAccel * -ctrl_thread_entity_ctx_lookup_accel(void) -{ - if(ctrl_entity_ctx_lookup_accel == 0) - { - Arena *arena = arena_alloc(); - ctrl_entity_ctx_lookup_accel = push_array(arena, CTRL_EntityCtxLookupAccel, 1); - ctrl_entity_ctx_lookup_accel->arena = arena; - for EachEnumVal(CTRL_EntityKind, k) - { - ctrl_entity_ctx_lookup_accel->entity_kind_arrays_arenas[k] = arena_alloc(); - } - } - return ctrl_entity_ctx_lookup_accel; -} - -internal CTRL_EntityArray -ctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind) -{ - CTRL_EntityCtxLookupAccel *accel = ctrl_thread_entity_ctx_lookup_accel(); - if(accel->entity_kind_arrays_gens[kind] != ctx->entity_kind_alloc_gens[kind]) - { - Temp scratch = scratch_begin(0, 0); - CTRL_EntityList entities = {0}; - for(CTRL_Entity *e = ctx->root; - e != &ctrl_entity_nil; - e = ctrl_entity_rec_depth_first_pre(e, ctx->root).next) - { - if(e->kind == kind) - { - ctrl_entity_list_push(scratch.arena, &entities, e); - } - } - accel->entity_kind_arrays_gens[kind] = ctx->entity_kind_alloc_gens[kind]; - arena_clear(accel->entity_kind_arrays_arenas[kind]); - accel->entity_kind_arrays[kind] = ctrl_entity_array_from_list(accel->entity_kind_arrays_arenas[kind], &entities); - scratch_end(scratch); - } - return accel->entity_kind_arrays[kind]; -} - -internal CTRL_EntityList -ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key) -{ - CTRL_EntityList list = {0}; - CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Module); - for EachIndex(idx, all_modules.count) - { - CTRL_Entity *module = all_modules.v[idx]; - DI_Key module_dbgi_key = ctrl_dbgi_key_from_module(module); - if(di_key_match(module_dbgi_key, dbgi_key)) - { - ctrl_entity_list_push(arena, &list, module); - } - } - return list; -} - -internal CTRL_Entity * -ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id) -{ - CTRL_Entity *thread = &ctrl_entity_nil; - CTRL_EntityArray threads = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread); - for EachIndex(idx, threads.count) - { - if(threads.v[idx]->id == id) - { - thread = threads.v[idx]; - } - } - return thread; -} - -//- rjf: entity tree iteration - -internal CTRL_EntityRec -ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off) -{ - CTRL_EntityRec result = {0}; - result.next = &ctrl_entity_nil; - if((*MemberFromOffset(CTRL_Entity **, entity, child_off)) != &ctrl_entity_nil) - { - result.next = *MemberFromOffset(CTRL_Entity **, entity, child_off); - result.push_count = 1; - } - else for(CTRL_Entity *parent = entity; parent != subtree_root && parent != &ctrl_entity_nil; parent = parent->parent) - { - if(parent != subtree_root && (*MemberFromOffset(CTRL_Entity **, parent, sib_off)) != &ctrl_entity_nil) - { - result.next = *MemberFromOffset(CTRL_Entity **, parent, sib_off); - break; - } - result.pop_count += 1; - } - return result; -} - -//- rjf: applying events to entity caches - -internal void -ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list) -{ - //- rjf: scan events & construct entities - for(CTRL_EventNode *n = list->first; n != 0; n = n->next) - { - CTRL_Event *event = &n->v; - switch(event->kind) - { - default:{}break; - - //- rjf: processes - case CTRL_EventKind_NewProc: - { - CTRL_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); - if(machine != &ctrl_entity_nil) - { - CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); - process->tls_model = event->tls_model; - process->target_os = event->target_os; - } - }break; - case CTRL_EventKind_EndProc: - { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->entity); - ctrl_entity_release(store, process); - for(CTRL_Entity *entry = store->ctx.root->first, *next = &ctrl_entity_nil; - entry != &ctrl_entity_nil; - entry = next) - { - next = entry->next; - if(entry->kind == CTRL_EntityKind_EntryPoint && entry->id == process->id) - { - ctrl_entity_release(store, entry); - } - } - }break; - - //- rjf: threads - case CTRL_EventKind_NewThread: - { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - if(process != &ctrl_entity_nil) - { - CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); - CTRL_Entity *first_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); - if(first_thread == thread) - { - ctrl_entity_equip_string(store, thread, str8_lit("main_thread")); - } - CTRL_EntityArray pending_thread_names = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadName); - for EachIndex(idx, pending_thread_names.count) - { - CTRL_Entity *entity = pending_thread_names.v[idx]; - if(entity->id == event->entity_id) - { - ctrl_entity_equip_string(store, thread, entity->string); - ctrl_entity_release(store, entity); - break; - } - } - CTRL_EntityArray pending_thread_colors = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadColor); - for EachIndex(idx, pending_thread_colors.count) - { - CTRL_Entity *entity = pending_thread_colors.v[idx]; - if(entity->id == event->entity_id) - { - thread->rgba = entity->rgba; - ctrl_entity_release(store, entity); - break; - } - } - thread->stack_base = event->stack_base; - } - //ctrl_rip_from_thread(&store->ctx, event->entity); - }break; - case CTRL_EventKind_EndThread: - { - CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); - ctrl_entity_release(store, thread); - }break; - case CTRL_EventKind_ThreadName: - { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *thread = &ctrl_entity_nil; - if(event->entity_id == 0) - { - thread = ctrl_entity_from_handle(&store->ctx, event->entity); - } - else - { - thread = ctrl_thread_from_id(&store->ctx, event->entity_id); - } - if(thread != &ctrl_entity_nil) - { - ctrl_entity_equip_string(store, thread, event->string); - } - else if(process != &ctrl_entity_nil) - { - CTRL_Entity *pending_name = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadName, Arch_Null, ctrl_handle_zero(), event->entity_id); - ctrl_entity_equip_string(store, pending_name, event->string); - } - }break; - case CTRL_EventKind_ThreadColor: - { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *thread = &ctrl_entity_nil; - if(event->entity_id == 0) - { - thread = ctrl_entity_from_handle(&store->ctx, event->entity); - } - else - { - thread = ctrl_thread_from_id(&store->ctx, event->entity_id); - } - if(thread != &ctrl_entity_nil) - { - thread->rgba = event->rgba; - } - else if(process != &ctrl_entity_nil) - { - CTRL_Entity *pending = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadColor, Arch_Null, ctrl_handle_zero(), event->entity_id); - pending->rgba = event->rgba; - } - }break; - case CTRL_EventKind_ThreadFrozen: - { - CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); - if(thread != &ctrl_entity_nil) - { - thread->is_frozen = 1; - } - }break; - case CTRL_EventKind_ThreadThawed: - { - CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); - if(thread != &ctrl_entity_nil) - { - thread->is_frozen = 0; - } - }break; - - //- rjf: modules - case CTRL_EventKind_NewModule: - { - Temp scratch = scratch_begin(0, 0); - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min); - ctrl_entity_equip_string(store, module, event->string); - module->timestamp = event->timestamp; - module->vaddr_range = event->vaddr_rng; - module->tls_index = event->tls_index; - module->tls_offset = event->tls_offset; - CTRL_Entity *first_module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module); - if(first_module == module) - { - ctrl_entity_equip_string(store, process, str8_skip_last_slash(event->string)); - } - scratch_end(scratch); - }break; - case CTRL_EventKind_EndModule: - { - CTRL_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); - ctrl_entity_release(store, module); - }break; - case CTRL_EventKind_ModuleDebugInfoPathChange: - { - Temp scratch = scratch_begin(0, 0); - CTRL_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - if(debug_info_path == &ctrl_entity_nil) - { - debug_info_path = ctrl_entity_alloc(store, module, CTRL_EntityKind_DebugInfoPath, Arch_Null, ctrl_handle_zero(), 0); - } - ctrl_entity_equip_string(store, debug_info_path, path_normalized_from_string(scratch.arena, event->string)); - debug_info_path->timestamp = event->timestamp; - scratch_end(scratch); - }break; - - //- rjf: dynamic, program-created breakpoints - case CTRL_EventKind_SetBreakpoint: - { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *bp = ctrl_entity_alloc(store, process, CTRL_EntityKind_Breakpoint, Arch_Null, ctrl_handle_zero(), 0); - bp->vaddr_range = event->vaddr_rng; - bp->bp_flags = event->bp_flags; - }break; - case CTRL_EventKind_UnsetBreakpoint: - { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) - { - if(child->kind == CTRL_EntityKind_Breakpoint && - child->vaddr_range.min == event->vaddr_rng.min && - child->vaddr_range.max == event->vaddr_rng.max && - child->bp_flags == event->bp_flags) - { - ctrl_entity_release(store, child); - break; - } - } - }break; - - //- rjf: address range annotations - case CTRL_EventKind_SetVAddrRangeNote: - { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *annotation = ctrl_entity_alloc(store, process, CTRL_EntityKind_AddressRangeAnnotation, Arch_Null, ctrl_handle_zero(), 0); - annotation->vaddr_range = event->vaddr_rng; - ctrl_entity_equip_string(store, annotation, event->string); - }break; - } - } -} - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -ctrl_init(void) -{ - Arena *arena = arena_alloc(); - ctrl_state = push_array(arena, CTRL_State, 1); - ctrl_state->arena = arena; - for(Arch arch = (Arch)0; arch < Arch_COUNT; arch = (Arch)(arch+1)) - { - String8 *reg_names = regs_reg_code_string_table_from_arch(arch); - U64 reg_count = regs_reg_code_count_from_arch(arch); - String8 *alias_names = regs_alias_code_string_table_from_arch(arch); - U64 alias_count = regs_alias_code_count_from_arch(arch); - ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); - ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); - for(U64 idx = 1; idx < reg_count; idx += 1) - { - e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); - } - for(U64 idx = 1; idx < alias_count; idx += 1) - { - e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); - } - } - ctrl_state->thread_reg_cache.slots_count = 1024; - ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); - ctrl_state->thread_reg_cache.stripes_count = os_get_system_info()->logical_processor_count; - ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) - { - ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); - ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); - } - ctrl_state->module_image_info_cache.slots_count = 1024; - ctrl_state->module_image_info_cache.slots = push_array(arena, CTRL_ModuleImageInfoCacheSlot, ctrl_state->module_image_info_cache.slots_count); - ctrl_state->module_image_info_cache.stripes_count = os_get_system_info()->logical_processor_count; - ctrl_state->module_image_info_cache.stripes = push_array(arena, CTRL_ModuleImageInfoCacheStripe, ctrl_state->module_image_info_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->module_image_info_cache.stripes_count; idx += 1) - { - ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc(); - ctrl_state->module_image_info_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); - } - ctrl_state->u2c_ring_size = KB(64); - ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); - ctrl_state->u2c_ring_mutex = mutex_alloc(); - ctrl_state->u2c_ring_cv = cond_var_alloc(); - ctrl_state->c2u_ring_size = KB(64); - ctrl_state->c2u_ring_max_string_size = ctrl_state->c2u_ring_size/2; - ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); - ctrl_state->c2u_ring_mutex = mutex_alloc(); - ctrl_state->c2u_ring_cv = cond_var_alloc(); - { - Temp scratch = scratch_begin(0, 0); - String8 user_program_data_path = os_get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); - os_make_directory(user_data_folder); - ctrl_state->ctrl_thread_log_path = push_str8f(ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); - os_write_data_to_file_path(ctrl_state->ctrl_thread_log_path, str8_zero()); - scratch_end(scratch); - } - ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc(); - ctrl_state->ctrl_thread_entity_store = ctrl_entity_ctx_rw_store_alloc(); - ctrl_state->ctrl_thread_eval_cache = e_cache_alloc(); - ctrl_state->ctrl_thread_msg_process_arena = arena_alloc(); - ctrl_state->dmn_event_arena = arena_alloc(); - ctrl_state->user_entry_point_arena = arena_alloc(); - ctrl_state->dbg_dir_arena = arena_alloc(); - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(ctrl_exception_code_kind_default_enable_table[k]) - { - ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); - } - } - ctrl_state->ctrl_thread_log = log_alloc(); - ctrl_state->ctrl_thread = thread_launch(ctrl_thread__entry_point, 0); -} - -//////////////////////////////// -//~ rjf: Wakeup Callback Registration - -internal void -ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) -{ - ctrl_state->wakeup_hook = wakeup_hook; -} - -//////////////////////////////// -//~ rjf: Thread Register Functions - -//- rjf: thread register cache reading - -internal void * -ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle) -{ - CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache; - CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); - Arch arch = thread_entity->arch; - U64 reg_block_size = regs_block_size_from_arch(arch); - U64 hash = ctrl_hash_from_handle(handle); - U64 slot_idx = hash%cache->slots_count; - U64 stripe_idx = slot_idx%cache->stripes_count; - CTRL_ThreadRegCacheSlot *slot = &cache->slots[slot_idx]; - CTRL_ThreadRegCacheStripe *stripe = &cache->stripes[stripe_idx]; - void *result = push_array(arena, U8, reg_block_size); - MutexScopeW(stripe->rw_mutex) - { - // rjf: find existing node - CTRL_ThreadRegCacheNode *node = 0; - for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->handle, handle)) - { - node = n; - break; - } - } - - // rjf: allocate existing node - if(!node) - { - node = push_array(stripe->arena, CTRL_ThreadRegCacheNode, 1); - DLLPushBack(slot->first, slot->last, node); - node->handle = handle; - node->block_size = reg_block_size; - node->block = push_array(stripe->arena, U8, reg_block_size); - } - - // rjf: copy from node - if(node) - { - U64 current_reg_gen = ctrl_reg_gen(); - B32 need_stale = 1; - if(node->reg_gen != current_reg_gen && - dmn_thread_read_reg_block(handle.dmn_handle, result)) - { - if(node != 0) - { - need_stale = 0; - node->reg_gen = current_reg_gen; - MemoryCopy(node->block, result, reg_block_size); - } - } - if(need_stale) - { - MemoryCopy(result, node->block, reg_block_size); - } - } - } - return result; -} - -internal U64 -ctrl_tls_root_vaddr_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) -{ - U64 result = dmn_tls_root_vaddr_from_thread(handle.dmn_handle); - return result; -} - -internal U64 -ctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) -{ - Temp scratch = scratch_begin(0, 0); - CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); - Arch arch = thread_entity->arch; - void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle); - U64 result = regs_rip_from_arch_block(arch, block); - scratch_end(scratch); - return result; -} - -internal U64 -ctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) -{ - Temp scratch = scratch_begin(0, 0); - CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); - Arch arch = thread_entity->arch; - void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle); - U64 result = regs_rsp_from_arch_block(arch, block); - scratch_end(scratch); - return result; -} - -//- rjf: thread register writing - -internal B32 -ctrl_thread_write_reg_block(CTRL_Handle thread, void *block) -{ - // TODO(rjf): @callstacks immediately reflect this in the call stack cache - B32 good = dmn_thread_write_reg_block(thread.dmn_handle, block); - if(good) - { - ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); - } - return good; -} - -//////////////////////////////// -//~ rjf: Module Image Info Functions - -//- rjf: cache lookups - -internal PE_IntelPdata * -ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff) -{ - PE_IntelPdata *first_pdata = 0; - { - U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->module, module_handle)) - { - PE_IntelPdata *pdatas = n->pdatas; - U64 pdatas_count = n->pdatas_count; - if(n->pdatas_count != 0 && voff >= n->pdatas[0].voff_first) - { - // NOTE(rjf): - // - // binary search: - // find max index s.t. pdata_array[index].voff_first <= voff - // we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first) - U64 index = pdatas_count; - U64 min = 0; - U64 opl = pdatas_count; - for(;;) - { - U64 mid = (min + opl)/2; - PE_IntelPdata *pdata = pdatas + mid; - if(voff < pdata->voff_first) - { - opl = mid; - } - else if(pdata->voff_first < voff) - { - min = mid; - } - else - { - index = mid; - break; - } - if(min + 1 >= opl) - { - index = min; - break; - } - } - - // rjf: if we are in range fill result - { - PE_IntelPdata *pdata = pdatas + index; - if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last) - { - first_pdata = push_array(arena, PE_IntelPdata, 1); - MemoryCopyStruct(first_pdata, pdata); - } - } - } - break; - } - } - } - return first_pdata; -} - -internal U64 -ctrl_entry_point_voff_from_module(CTRL_Handle module_handle) -{ - U64 result = 0; - U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->module, module_handle)) - { - result = n->entry_point_voff; - break; - } - } - return result; -} - -internal String8 -ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle) -{ - String8 result = {0}; - U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->module, module_handle)) - { - result = push_str8_copy(arena, n->initial_debug_info_path); - break; - } - } - return result; -} - -internal String8 -ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle) -{ - String8 result = {0}; - U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->module, module_handle)) - { - result = push_str8_copy(arena, n->raddbg_data); - break; - } - } - return result; -} - -//////////////////////////////// -//~ Process Info Functions - -internal Arch -ctrl_arch_from_process_handle(CTRL_Handle process_handle) -{ - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_Entity *process_entity = ctrl_entity_from_handle(entity_ctx, process_handle); - return process_entity->arch; -} - -//////////////////////////////// -//~ rjf: Unwinding Functions - -//- rjf: unwind deep copier - -internal CTRL_Unwind -ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src) -{ - CTRL_Unwind dst = {0}; - { - dst.flags = src->flags; - dst.frames.count = src->frames.count; - dst.frames.v = push_array(arena, CTRL_UnwindFrame, dst.frames.count); - MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count); - U64 block_size = regs_block_size_from_arch(arch); - for(U64 idx = 0; idx < dst.frames.count; idx += 1) - { - dst.frames.v[idx].regs = push_array_no_zero(arena, U8, block_size); - MemoryCopy(dst.frames.v[idx].regs, src->frames.v[idx].regs, block_size); - } - } - return dst; -} - -//- DWARF - -typedef struct -{ - CTRL_Handle process_handle; - U64 endt_us; -} CTRL_MemoryReadContextDwarfX64; - -internal -MACHINE_OP_MEM_READ(ctrl_machine_mem_read) -{ - CTRL_MemoryReadContextDwarfX64 *ctx = ud; - - B32 is_stale = 0; - B32 is_read = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + buffer_size), &is_stale, buffer, ctx->endt_us); - - MachineOpResult status = MachineOpResult_Fail; - if(is_stale) - { - status = MachineOpResult_Maybe; - } - else if(is_read) - { - status = MachineOpResult_Ok; - } - - return status; -} - -internal CTRL_UnwindStepResult -ctrl_unwind_step_result_from_machine_op_result(MachineOpResult s) -{ - CTRL_UnwindStepResult result = {0}; - switch(s) - { - case MachineOpResult_Null: {} break; - case MachineOpResult_Ok: - { - result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); - }break; - case MachineOpResult_Fail: - { - result.flags |= CTRL_UnwindFlag_Error; - }break; - case MachineOpResult_Maybe: - { - result.flags &= ~CTRL_UnwindFlag_Error; - result.flags |= CTRL_UnwindFlag_Stale; - }break; - default: { InvalidPath; } break; - } - return result; -} - -internal CTRL_UnwindStepResult -ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out) -{ - Temp scratch = scratch_begin(&arena, 1); - CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; - - // gather context for virtual stack unwinder - U64 cfi_rebase = 0; - B32 is_unwind_eh = 0; - String8 unwind_data = {0}; - EH_FrameHdr eh_frame_hdr = {0}; - EH_PtrCtx eh_ptr_ctx = {0}; - { - U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash % ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx % ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) - { - if(ctrl_handle_match(n->module, module_handle)) - { - cfi_rebase = n->cfi_rebase; - is_unwind_eh = n->is_unwind_eh; - unwind_data = n->dwarf_unwind_data; - eh_frame_hdr = n->eh_frame_hdr; - eh_ptr_ctx = n->eh_ptr_ctx; - break; - } - } - } - - // grab IP - U64 ip = regs_rip_from_arch_block(arch, regs); - - // use .eh_frame_hdr to quickly locate nearest FDE - U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, ip); - - if(fde_addr != max_U64) - { - // parse call frame info - DW_CIE cie = {0}; - DW_FDE fde = {0}; - B32 is_cfi_parsed = 0; - if(is_unwind_eh) - { - B32 is_stale = 0; - - // extract FDE info - Rng1U64 fde_vrange = {0}; - DW_Format fde_format = DW_Format_Null; - String8 fde_data = {0}; - U64 cie_addr = 0; - { - // parse FDE length - U32 first_four_bytes = 0; - if(!ctrl_process_memory_read_struct(process_handle, fde_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } - if(first_four_bytes == max_U32) - { - U64 length = 0; - if(!ctrl_process_memory_read_struct(process_handle, fde_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } - fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + length); - fde_format = DW_Format_64Bit; - } - else - { - fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + first_four_bytes); - fde_format = DW_Format_32Bit; - } - - // read out whole FDE - void *fde_raw = push_array(scratch.arena, U8, dim_1u64(fde_vrange)); - if(!ctrl_process_memory_read(process_handle, fde_vrange, &is_stale, fde_raw, endt_us)) { goto eh_parse_exit; } - fde_data = str8(fde_raw, dim_1u64(fde_vrange)); - - // compute CIE address - U64 cie_delta_off = fde_format == DW_Format_32Bit ? 4 : 12; - U64 cie_delta = 0; - U64 cie_delta_size = str8_deserial_read_dwarf_uint(fde_data, cie_delta_off, fde_format, &cie_delta); - if (cie_delta_size == 0) { goto eh_parse_exit; } - cie_addr = (fde_addr + cie_delta_off) - cie_delta; - } - - // extract CIE info - Rng1U64 cie_vrange = {0}; - DW_Format cie_format = DW_Format_Null; - String8 cie_data = {0}; - { - // parse CIE length - U32 first_four_bytes = 0; - if(!ctrl_process_memory_read_struct(process_handle, cie_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } - if(first_four_bytes == max_U32) - { - U64 length = 0; - if(!ctrl_process_memory_read_struct(process_handle, cie_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } - cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + length); - cie_format = DW_Format_64Bit; - } - else - { - cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + first_four_bytes); - cie_format = DW_Format_32Bit; - } - - // read out whole CIE - void *cie_raw = push_array(scratch.arena, U8, dim_1u64(cie_vrange)); - if(!ctrl_process_memory_read(process_handle, cie_vrange, &is_stale, cie_raw, endt_us)) { goto eh_parse_exit; } - cie_data = str8(cie_raw, dim_1u64(cie_vrange)); - } - - // parse CIE and FDE - if(eh_parse_cie(cie_data, cie_format, arch, cie_vrange.min, &eh_ptr_ctx, &cie)) - { - is_cfi_parsed = eh_parse_fde(fde_data, fde_format, fde_vrange.min, &cie, &eh_ptr_ctx, &fde); - } - - eh_parse_exit:; - if(is_stale) - { - result.flags = CTRL_UnwindFlag_Stale; - } - } - else - { - is_cfi_parsed = dw_parse_cfi(unwind_data, fde_addr, arch, &cie, &fde); - } - - if(is_cfi_parsed && contains_1u64(fde.pc_range, ip)) - { - // setup pointer decoder ops - DW_DecodePtr *decode_ptr_func = 0; - void *decode_ptr_ctx = 0; - if(is_unwind_eh) - { - EH_DecodePtrCtx *decode_ptr_ctx_eh = push_array(scratch.arena, EH_DecodePtrCtx, 1); - decode_ptr_ctx_eh->ptr_ctx = &eh_ptr_ctx; - decode_ptr_ctx_eh->addr_enc = cie.ext[EH_CIE_Ext_AddrEnc]; - - decode_ptr_func = eh_decode_ptr; - decode_ptr_ctx = decode_ptr_ctx_eh; - } - else - { - decode_ptr_func = dw_decode_ptr_debug_frame; - decode_ptr_ctx = &cie; - } - - // find register rules for IP - DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, ip); - if(cfi_row) - { - // setup machine ops - void *mem_read_ctx = 0; - void *reg_read_ctx = 0; - MachineOp_MemRead *mem_read_func = 0; - MachineOp_RegRead *reg_read_func = 0; - switch(arch) - { - case Arch_Null: break; - case Arch_x64: - { - CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); - mem_read_ctx_x64->process_handle = process_handle; - mem_read_ctx_x64->endt_us = endt_us; - - mem_read_ctx = mem_read_ctx_x64; - reg_read_ctx = regs; - - mem_read_func = ctrl_machine_mem_read; - reg_read_func = regs_read_dwarf_x64; - }break; - case Arch_x86: - case Arch_arm64: - case Arch_arm32: - { - NotImplemented; - }break; - default: { InvalidPath; }break; - } - - // compute CFA for the row - U64 cfa = 0; - MachineOpResult unwind_status = dw_compute_cfa(arch, cfi_row, mem_read_func, mem_read_ctx, reg_read_func, reg_read_ctx, &cfa); - - // on success fill out output - if(unwind_status == MachineOpResult_Ok) - { - ctx_out->cfa = cfa; - ctx_out->cfi_row = cfi_row; - ctx_out->ret_addr_reg = cie.ret_addr_reg; - } - - // translate unwind status code - result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); - } - } - } - - scratch_end(scratch); - return result; -} - -internal CTRL_UnwindStepResult -ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us) -{ - Temp scratch = scratch_begin(0, 0); - - CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; - - // setup machine ops - void *mem_read_ctx = 0; - void *reg_read_ctx = 0; - void *reg_write_ctx = 0; - MachineOp_MemRead *mem_read_func = 0; - MachineOp_RegRead *reg_read_func = 0; - MachineOp_RegWrite *reg_write_func = 0; - switch(arch) - { - case Arch_Null: break; - case Arch_x64: - { - CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); - mem_read_ctx_x64->process_handle = process_handle; - mem_read_ctx_x64->endt_us = endt_us; - - mem_read_ctx = mem_read_ctx_x64; - reg_read_ctx = regs; - reg_write_ctx = regs; - - mem_read_func = ctrl_machine_mem_read; - reg_read_func = regs_read_dwarf_x64; - reg_write_func = regs_write_dwarf_x64; - }break; - case Arch_x86: - case Arch_arm64: - case Arch_arm32: - { - NotImplemented; - }break; - default: { InvalidPath; }break; - } - - // apply register rules to the context - MachineOpResult unwind_status = dw_cfi_apply_register_rules(arch, - frame_ctx->cfa, - frame_ctx->cfi_row, - mem_read_func, - mem_read_ctx, - reg_read_func, - reg_read_ctx, - reg_write_func, - reg_write_ctx); - - // last frame typically has undefined rule for IP - if(frame_ctx->cfi_row->regs[frame_ctx->ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) - { - regs_arch_block_write_rip(arch, regs, 0); - } - - // translate unwind status code - result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); - - scratch_end(scratch); - return result; -} - -//- rjf: [x64] - -internal REGS_Reg64 * -ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg) -{ - local_persist REGS_Reg64 dummy = {0}; - REGS_Reg64 *result = &dummy; - switch(gpr_reg) - { - case PE_UnwindGprRegX64_RAX:{result = ®s->rax;}break; - case PE_UnwindGprRegX64_RCX:{result = ®s->rcx;}break; - case PE_UnwindGprRegX64_RDX:{result = ®s->rdx;}break; - case PE_UnwindGprRegX64_RBX:{result = ®s->rbx;}break; - case PE_UnwindGprRegX64_RSP:{result = ®s->rsp;}break; - case PE_UnwindGprRegX64_RBP:{result = ®s->rbp;}break; - case PE_UnwindGprRegX64_RSI:{result = ®s->rsi;}break; - case PE_UnwindGprRegX64_RDI:{result = ®s->rdi;}break; - case PE_UnwindGprRegX64_R8 :{result = ®s->r8 ;}break; - case PE_UnwindGprRegX64_R9 :{result = ®s->r9 ;}break; - case PE_UnwindGprRegX64_R10:{result = ®s->r10;}break; - case PE_UnwindGprRegX64_R11:{result = ®s->r11;}break; - case PE_UnwindGprRegX64_R12:{result = ®s->r12;}break; - case PE_UnwindGprRegX64_R13:{result = ®s->r13;}break; - case PE_UnwindGprRegX64_R14:{result = ®s->r14;}break; - case PE_UnwindGprRegX64_R15:{result = ®s->r15;}break; - } - return result; -} - -internal CTRL_UnwindStepResult -ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us) -{ - B32 is_stale = 0; - B32 is_good = 1; - Temp scratch = scratch_begin(0, 0); - - ////////////////////////////// - //- rjf: unpack parameters - // - U64 rip_voff = regs->rip.u64 - module_base_vaddr; - - ////////////////////////////// - //- rjf: rip_voff -> first pdata - // - PE_IntelPdata *first_pdata = ctrl_intel_pdata_from_module_voff(scratch.arena, module_handle, rip_voff); - - ////////////////////////////// - //- rjf: pdata -> detect if in epilog - // - B32 has_pdata_and_in_epilog = 0; - if(first_pdata) ProfScope("pdata -> detect if in epilog") - { - // NOTE(allen): There are restrictions placed on how an epilog is allowed - // to be formed (https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-160) - // Here we interpret machine code directly according to the rules - // given there to determine if the code we're looking at looks like an epilog. - - //- rjf: set up parsing state - B32 is_epilog = 0; - B32 keep_parsing = 1; - U64 read_vaddr = regs->rip.u64; - U64 read_vaddr_opl = read_vaddr + 256; - - //- rjf: check first instruction - { - B32 inst_good = 0; - U8 inst[4] = {0}; - if(read_vaddr + sizeof(inst) <= read_vaddr_opl) - { - inst_good = ctrl_process_memory_read(process_handle, r1u64(read_vaddr, read_vaddr+sizeof(inst)), &is_stale, inst, endt_us); - inst_good = inst_good && !is_stale; - } - if(!inst_good) - { - keep_parsing = 0; - } - else if((inst[0] & 0xF8) == 0x48) - { - switch(inst[1]) - { - // rjf: add $nnnn,%rsp - case 0x81: - { - if(inst[0] == 0x48 && inst[2] == 0xC4) - { - read_vaddr += 7; - } - else - { - keep_parsing = 0; - } - }break; - - // rjf: add $n,%rsp - case 0x83: - { - if(inst[0] == 0x48 && inst[2] == 0xC4) - { - read_vaddr += 4; - } - else - { - keep_parsing = 0; - } - }break; - - // rjf: lea n(reg),%rsp - case 0x8D: - { - if((inst[0] & 0x06) == 0 && - ((inst[2] >> 3) & 0x07) == 0x04 && - (inst[2] & 0x07) != 0x04) - { - U8 imm_size = (inst[2] >> 6); - - // rjf: 1-byte immediate - if(imm_size == 1) - { - read_vaddr += 4; - } - - // rjf: 4-byte immediate - else if(imm_size == 2) - { - read_vaddr += 7; - } - - // rjf: other case - else - { - keep_parsing = 0; - } - } - else - { - keep_parsing = 0; - } - }break; - } - } - } - - //- rjf: continue parsing instructions - for(;keep_parsing;) - { - // rjf: read next instruction byte - B32 inst_byte_good = 0; - U8 inst_byte = 0; - if(read_vaddr + sizeof(inst_byte) <= read_vaddr_opl) - { - inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); - } - if(!inst_byte_good || is_stale) - { - keep_parsing = 0; - } - - // rjf: when (... I don't know ...) rely on the next byte - B32 check_inst_byte_good = inst_byte_good; - U64 check_vaddr = read_vaddr; - U8 check_inst_byte = inst_byte; - if(inst_byte_good && (inst_byte & 0xF0) == 0x40) - { - check_vaddr = read_vaddr + 1; - if(read_vaddr + sizeof(check_inst_byte) <= read_vaddr_opl) - { - check_inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &check_inst_byte, endt_us); - } - if(!check_inst_byte_good || is_stale) - { - keep_parsing = 0; - } - } - - // rjf: check instruction byte - if(check_inst_byte_good) - { - switch(check_inst_byte) - { - // rjf: pop - case 0x58:case 0x59:case 0x5A:case 0x5B: - case 0x5C:case 0x5D:case 0x5E:case 0x5F: - { - read_vaddr = check_vaddr + 1; - }break; - - // rjf: ret - case 0xC2: - case 0xC3: - { - is_epilog = 1; - keep_parsing = 0; - }break; - - // rjf: jmp nnnn - case 0xE9: - { - U64 imm_vaddr = check_vaddr + 1; - S32 imm = 0; - B32 imm_good = 0; - if(read_vaddr + sizeof(imm) <= read_vaddr_opl) - { - imm_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us); - } - if(!imm_good || is_stale) - { - keep_parsing = 0; - } - if(imm_good) - { - U64 next_vaddr = (U64)(imm_vaddr + sizeof(imm) + imm); - U64 next_voff = next_vaddr - module_base_vaddr; // TODO(rjf): verify that this offset is from module base vaddr, not section - if(!(first_pdata->voff_first <= next_voff && next_voff < first_pdata->voff_one_past_last)) - { - keep_parsing = 0; - } - else - { - read_vaddr = next_vaddr; - } - } - // TODO(allen): why isn't this just the end of the epilog? - }break; - - // rjf: rep; ret (for amd64 prediction bug) - case 0xF3: - { - U8 next_inst_byte = 0; - B32 next_inst_byte_good = 0; - if(read_vaddr + sizeof(next_inst_byte) <= read_vaddr_opl) - { - next_inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &next_inst_byte, endt_us); - } - if(next_inst_byte_good) - { - is_epilog = (next_inst_byte == 0xC3); - } - keep_parsing = 0; - }break; - - default:{keep_parsing = 0;}break; - } - } - } - has_pdata_and_in_epilog = is_epilog; - } - - ////////////////////////////// - //- rjf: pdata & in epilog -> epilog unwind - // - if(first_pdata && has_pdata_and_in_epilog) ProfScope("pdata & in epilog -> epilog unwind") - { - U64 read_vaddr = regs->rip.u64; - for(B32 keep_parsing = 1;keep_parsing != 0;) - { - //- rjf: assume no more parsing after this instruction - keep_parsing = 0; - - //- rjf: read next instruction byte - U8 inst_byte = 0; - is_good = is_good && ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); - is_good = is_good && !is_stale; - read_vaddr += 1; - - //- rjf: extract rex from instruction byte - U8 rex = 0; - if((inst_byte & 0xF0) == 0x40) - { - rex = inst_byte & 0xF; // rex prefix - is_good = is_good && ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); - is_good = is_good && !is_stale; - read_vaddr += 1; - } - - //- rjf: parse remainder of instruction - switch(inst_byte) - { - // rjf: pop - case 0x58: - case 0x59: - case 0x5A: - case 0x5B: - case 0x5C: - case 0x5D: - case 0x5E: - case 0x5F: - { - // rjf: read value at rsp - U64 sp = regs->rsp.u64; - U64 value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &value, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: modify registers - PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); - reg->u64 = value; - regs->rsp.u64 = sp + 8; - - // rjf: not a final instruction, so keep mparsing - keep_parsing = 1; - }break; - - // rjf: add $nnnn,%rsp - case 0x81: - { - // rjf: skip one byte (we already know what it is in this scenario) - read_vaddr += 1; - - // rjf: read the 4-byte immediate - S32 imm = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 4; - - // rjf: update stack pointer - regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: add $n,%rsp - case 0x83: - { - // rjf: skip one byte (we already know what it is in this scenario) - read_vaddr += 1; - - // rjf: read the 4-byte immediate - S8 imm = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - - // rjf: update stack pointer - regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: lea imm8/imm32,$rsp - case 0x8D: - { - // rjf: read source register - U8 modrm = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &modrm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); - U64 reg_value = reg->u64; - - // rjf: read immediate - S32 imm = 0; - { - // rjf: read 1-byte immediate - if((modrm >> 6) == 1) - { - S8 imm8 = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm8, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - imm = (S32)imm8; - } - - // rjf: read 4-byte immediate - else - { - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 4; - } - } - - // rjf: update stack pointer - regs->rsp.u64 = (U64)(reg_value + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: ret $nn - case 0xC2: - { - // rjf: read new ip - U64 sp = regs->rsp.u64; - U64 new_ip = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: read 2-byte immediate & advance stack pointer - U16 imm = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - U64 new_sp = sp + 8 + imm; - - // rjf: commit registers - regs->rip.u64 = new_ip; - regs->rsp.u64 = new_sp; - }break; - - // rjf: ret / rep; ret - case 0xF3: - { - // Assert(!"Hit me!"); - }break; - case 0xC3: - { - // rjf: read new ip - U64 sp = regs->rsp.u64; - U64 new_ip = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: advance stack pointer - U64 new_sp = sp + 8; - - // rjf: commit registers - regs->rip.u64 = new_ip; - regs->rsp.u64 = new_sp; - }break; - - // rjf: jmp nnnn - case 0xE9: - { - // Assert(!"Hit Me"); - // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done - // we don't have any cases to exercise this right now. no guess implementation! - }break; - - // rjf: Sjmp n - case 0xEB: - { - // Assert(!"Hit Me"); - // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done - // we don't have any cases to exercise this right now. no guess implementation! - }break; - } - } - } - - ////////////////////////////// - //- rjf: pdata & not in epilog -> xdata unwind - // - B32 xdata_unwind_did_machframe = 0; - if(first_pdata && !has_pdata_and_in_epilog) ProfScope("pdata & not in epilog -> xdata unwind") - { - //- rjf: get frame reg - B32 bad_frame_reg_info = 0; - REGS_Reg64 *frame_reg = 0; - U64 frame_off = 0; - { - U64 unwind_info_off = first_pdata->voff_unwind_info; - PE_UnwindInfo unwind_info = {0}; - if(!ctrl_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us) || - is_stale) - { - is_good = 0; - } - U32 frame_reg_id = PE_UNWIND_INFO_REG_FROM_FRAME(unwind_info.frame); - U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info.frame); - if(frame_reg_id != 0) - { - frame_reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, frame_reg_id); - bad_frame_reg_info = (frame_reg == 0); // NOTE(rjf): frame_reg should never be 0 at this point, in valid exe - } - frame_off = frame_off_val; - } - - //- rjf: iterate pdatas, apply opcodes - PE_IntelPdata *last_pdata = 0; - PE_IntelPdata *pdata = first_pdata; - if(!bad_frame_reg_info) for(B32 keep_parsing = 1; keep_parsing && pdata != last_pdata;) - { - //- rjf: unpack unwind info & codes - B32 good_unwind_info = 1; - U64 unwind_info_off = pdata->voff_unwind_info; - PE_UnwindInfo unwind_info = {0}; - good_unwind_info = good_unwind_info && ctrl_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us); - PE_UnwindCode *unwind_codes = push_array(scratch.arena, PE_UnwindCode, unwind_info.codes_num); - good_unwind_info = good_unwind_info && ctrl_process_memory_read(process_handle, r1u64(module_base_vaddr+unwind_info_off+sizeof(unwind_info), - module_base_vaddr+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num), - &is_stale, unwind_codes, endt_us); - good_unwind_info = good_unwind_info && !is_stale; - - //- rjf: bad unwind info -> abort - if(!good_unwind_info) - { - is_good = 0; - break; - } - - //- rjf: unpack frame base - U64 frame_base = regs->rsp.u64; - if(frame_reg != 0) - { - U64 raw_frame_base = frame_reg->u64; - U64 adjusted_frame_base = raw_frame_base - frame_off*16; - frame_base = adjusted_frame_base; - } - - //- rjf: apply opcodes - PE_UnwindCode *code_ptr = unwind_codes; - PE_UnwindCode *code_opl = unwind_codes + unwind_info.codes_num; - for(PE_UnwindCode *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr) - { - // rjf: unpack opcode info - U32 op_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr->flags); - U32 op_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr->flags); - U32 slot_count = pe_slot_count_from_unwind_op_code(op_code); - if(op_code == PE_UnwindOpCode_ALLOC_LARGE && op_info == 1) - { - slot_count += 1; - } - - // rjf: detect bad slot counts - if(slot_count == 0 || code_ptr+slot_count > code_opl) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: set next op code pointer - next_code_ptr = code_ptr + slot_count; - - // rjf: interpret this op code - U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog; - if(code_voff <= rip_voff) - { - switch(op_code) - { - case PE_UnwindOpCode_PUSH_NONVOL: - { - // rjf: read value from stack pointer - U64 rsp = regs->rsp.u64; - U64 value = 0; - if(!ctrl_process_memory_read_struct(process_handle, rsp, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: advance stack ptr - U64 new_rsp = rsp + 8; - - // rjf: commit registers - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; - regs->rsp.u64 = new_rsp; - }break; - - case PE_UnwindOpCode_ALLOC_LARGE: - { - // rjf: read alloc size - U64 size = 0; - if(op_info == 0) - { - size = code_ptr[1].u16*8; - } - else if(op_info == 1) - { - size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - } - else - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: advance stack pointer - U64 rsp = regs->rsp.u64; - U64 new_rsp = rsp + size; - - // rjf: advance stack pointer - regs->rsp.u64 = new_rsp; - }break; - - case PE_UnwindOpCode_ALLOC_SMALL: - { - // rjf: advance stack pointer - regs->rsp.u64 += op_info*8 + 8; - }break; - - case PE_UnwindOpCode_SET_FPREG: - { - // rjf: put stack pointer back to the frame base - regs->rsp.u64 = frame_base; - }break; - - case PE_UnwindOpCode_SAVE_NONVOL: - { - // rjf: read value from frame base - U64 off = code_ptr[1].u16*8; - U64 addr = frame_base + off; - U64 value = 0; - if(!ctrl_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; - }break; - - case PE_UnwindOpCode_SAVE_NONVOL_FAR: - { - // rjf: read value from frame base - U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - U64 addr = frame_base + off; - U64 value = 0; - if(!ctrl_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; - }break; - - case PE_UnwindOpCode_EPILOG: - { - keep_parsing = 1; - }break; - - case PE_UnwindOpCode_SPARE_CODE: - { - // TODO(rjf): ??? - keep_parsing = 0; - is_good = 0; - }break; - - case PE_UnwindOpCode_SAVE_XMM128: - { - // rjf: read new register values - U8 buf[16]; - U64 off = code_ptr[1].u16*16; - U64 addr = frame_base + off; - if(!ctrl_process_memory_read(process_handle, r1u64(addr, addr+sizeof(buf)), &is_stale, buf, endt_us)) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - void *xmm_reg = (®s->zmm0) + op_info; - MemoryCopy(xmm_reg, buf, sizeof(buf)); - }break; - - case PE_UnwindOpCode_SAVE_XMM128_FAR: - { - // rjf: read new register values - U8 buf[16]; - U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - U64 addr = frame_base + off; - if(!ctrl_process_memory_read(process_handle, r1u64(addr, addr+16), &is_stale, buf, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - void *xmm_reg = (®s->zmm0) + op_info; - MemoryCopy(xmm_reg, buf, sizeof(buf)); - }break; - - case PE_UnwindOpCode_PUSH_MACHFRAME: - { - // NOTE(rjf): this was found by stepping through kernel code after an exception was - // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main - if(op_info > 1) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: read values - U64 sp_og = regs->rsp.u64; - U64 sp_adj = sp_og; - if(op_info == 1) - { - sp_adj += 8; - } - U64 ip_value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp_adj, &is_stale, &ip_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_ip = sp_adj + 8; - U16 ss_value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp_after_ip, &is_stale, &ss_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_ss = sp_after_ip + 8; - U64 rflags_value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp_after_ss, &is_stale, &rflags_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_rflags = sp_after_ss + 8; - U64 sp_value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp_after_rflags, &is_stale, &sp_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit registers - regs->rip.u64 = ip_value; - regs->ss.u16 = ss_value; - regs->rflags.u64 = rflags_value; - regs->rsp.u64 = sp_value; - - // rjf: mark machine frame - xdata_unwind_did_machframe = 1; - }break; - } - } - } - - //- rjf: iterate to next pdata - if(keep_parsing) - { - U32 flags = PE_UNWIND_INFO_FLAGS_FROM_HDR(unwind_info.header); - if(!(flags & PE_UnwindInfoFlag_CHAINED)) - { - break; - } - U64 code_count_rounded = AlignPow2(unwind_info.codes_num, sizeof(PE_UnwindCode)); - U64 code_size = code_count_rounded*sizeof(PE_UnwindCode); - U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size; - last_pdata = pdata; - pdata = push_array(scratch.arena, PE_IntelPdata, 1); - if(!ctrl_process_memory_read_struct(process_handle, module_base_vaddr+chained_pdata_off, &is_stale, pdata, endt_us) || - is_stale) - { - is_good = 0; - break; - } - } - } - } - - ////////////////////////////// - //- rjf: no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer - // - if(!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe)) ProfScope("no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer") - { - // rjf: read rip from stack pointer - U64 rsp = regs->rsp.u64; - U64 new_rip = 0; - if(!ctrl_process_memory_read_struct(process_handle, rsp, &is_stale, &new_rip, endt_us) || - is_stale) - { - is_good = 0; - } - - // rjf: commit registers - if(is_good) - { - U64 new_rsp = rsp + 8; - regs->rip.u64 = new_rip; - regs->rsp.u64 = new_rsp; - } - } - - ////////////////////////////// - //- rjf: fill & return - // - scratch_end(scratch); - CTRL_UnwindStepResult result = {0}; - if(!is_good) {result.flags |= CTRL_UnwindFlag_Error;} - if(is_stale) {result.flags |= CTRL_UnwindFlag_Stale;} - return result; -} - -//- rjf: abstracted full unwind - -internal CTRL_Unwind -ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - CTRL_Unwind unwind = { .flags = CTRL_UnwindFlag_Error }; - - //- rjf: unpack args - CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, thread); - CTRL_Entity *process_entity = thread_entity->parent; - Arch arch = thread_entity->arch; - U64 arch_reg_block_size = regs_block_size_from_arch(arch); - - //- rjf: grab initial register block - void *regs_block = ctrl_reg_block_from_thread(scratch.arena, ctx, thread); - B32 regs_block_good = (arch != Arch_Null && regs_block != 0); - - //- rjf: loop & unwind - CTRL_UnwindFrameNode *first_frame_node = 0; - CTRL_UnwindFrameNode *last_frame_node = 0; - U64 frame_node_count = 0; - if(regs_block_good) - { - for(unwind.flags = 0;;) - { - U64 rip = regs_rip_from_arch_block(arch, regs_block); - U64 rsp = regs_rsp_from_arch_block(arch, regs_block); - - // rjf: cancel on zero rip (except the top frame) - if(rip == 0 && frame_node_count > 0) - { - break; - } - - // rip -> module - CTRL_Entity *module_entity = ctrl_module_from_process_vaddr(process_entity, rip); - - // establish frame context - CTRL_FrameUnwindContext frame_ctx = {0}; - CTRL_UnwindStepResult frame_ctx_result = {0}; - switch(process_entity->target_os) - { - case OperatingSystem_Null:{}break; - case OperatingSystem_Windows: - { - // no concept of frame unwind context - }break; - case OperatingSystem_Linux: - { - frame_ctx_result = ctrl_establish_frame_unwind_context__dwarf(arena, process_entity->handle, module_entity->handle, arch, regs_block, endt_us, &frame_ctx); - }break; - case OperatingSystem_Mac: - { - NotImplemented; - }break; - default: { InvalidPath; }break; - } - unwind.flags |= frame_ctx_result.flags; - if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error)) - { - break; - } - - // rjf: valid step -> push frame - CTRL_UnwindFrameNode *frame_node = push_array(scratch.arena, CTRL_UnwindFrameNode, 1); - CTRL_UnwindFrame *frame = &frame_node->v; - frame->cfa = frame_ctx.cfa; - frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); - MemoryCopy(frame->regs, regs_block, arch_reg_block_size); - DLLPushBack(first_frame_node, last_frame_node, frame_node); - frame_node_count += 1; - - // rjf: unwind one step - CTRL_UnwindStepResult step_result = {0}; - switch(process_entity->target_os) - { - default:{}break; - case OperatingSystem_Windows: - { - switch(arch) - { - default:{}break; - case Arch_x64: - { - step_result = ctrl_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us); - }break; - } - }break; - case OperatingSystem_Linux: - { - step_result = ctrl_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us); - }break; - } - - // stop unwinding on errors or stale data - unwind.flags |= step_result.flags; - if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error) || - (regs_rsp_from_arch_block(arch, regs_block) == rsp && regs_rip_from_arch_block(arch, regs_block) == rip)) - { - break; - } - } - } - - //- rjf: bake frames list into result array - { - unwind.frames.count = frame_node_count; - unwind.frames.v = push_array(arena, CTRL_UnwindFrame, unwind.frames.count); - U64 idx = 0; - for(CTRL_UnwindFrameNode *n = first_frame_node; n != 0; n = n->next, idx += 1) - { - unwind.frames.v[idx] = n->v; - } - } - - scratch_end(scratch); - ProfEnd(); - return unwind; -} - -//////////////////////////////// -//~ rjf: Call Stack Building Functions - -internal CTRL_CallStack -ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *base_unwind) -{ - Temp scratch = scratch_begin(&arena, 1); - Access *access = access_open(); - Arch arch = process->arch; - CTRL_CallStack result = {0}; - { - typedef struct FrameNode FrameNode; - struct FrameNode - { - FrameNode *next; - CTRL_CallStackFrame v; - }; - - //- rjf: gather all frames - FrameNode *first_frame = 0; - FrameNode *last_frame = 0; - U64 frame_count = 0; - for(U64 base_frame_idx = 0; base_frame_idx < base_unwind->frames.count; base_frame_idx += 1) - { - // rjf: unpack - CTRL_UnwindFrame *src = &base_unwind->frames.v[base_frame_idx]; - U64 rip_vaddr = regs_rip_from_arch_block(arch, src->regs); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - RDI_Scope *scope = rdi_scope_from_voff(rdi, rip_voff); - - // rjf: build inline frames (minus parent & inline depth) - FrameNode *first_inline_frame = 0; - FrameNode *last_inline_frame = 0; - U64 inline_frame_count = 0; - for(RDI_Scope *s = scope; - s->inline_site_idx != 0; - s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx)) - { - FrameNode *dst_inline = push_array(scratch.arena, FrameNode, 1); - if(first_inline_frame == 0) - { - first_inline_frame = dst_inline; - } - last_inline_frame = dst_inline; - SLLQueuePush(first_frame, last_frame, dst_inline); - dst_inline->v.unwind_count = base_frame_idx; - dst_inline->v.regs = src->regs; - dst_inline->v.cfa = src->cfa; - frame_count += 1; - inline_frame_count += 1; - } - - // rjf: build concrete frame - FrameNode *dst_base = push_array(scratch.arena, FrameNode, 1); - SLLQueuePush(first_frame, last_frame, dst_base); - dst_base->v.unwind_count = base_frame_idx; - dst_base->v.regs = src->regs; - dst_base->v.cfa = src->cfa; - frame_count += 1; - - // rjf: hook up inline frames to point to concrete frame, and to account for inline depth - U64 inline_frame_idx = 0; - for(FrameNode *inline_frame = first_inline_frame; inline_frame != 0; inline_frame = inline_frame->next, inline_frame_idx += 1) - { - inline_frame->v.inline_depth = inline_frame_count - inline_frame_idx; - if(inline_frame == last_inline_frame) - { - break; - } - } - } - - //- rjf: package - result.frames_count = frame_count; - result.frames = push_array(arena, CTRL_CallStackFrame, result.frames_count); - result.concrete_frames_count = base_unwind->frames.count; - result.concrete_frames = push_array(arena, CTRL_CallStackFrame *, result.concrete_frames_count); - { - U64 idx = 0; - U64 concrete_idx = 0; - for(FrameNode *n = first_frame; n != 0; n = n->next, idx += 1) - { - MemoryCopyStruct(&result.frames[idx], &n->v); - if(n->v.inline_depth == 0 && concrete_idx < result.concrete_frames_count) - { - result.concrete_frames[concrete_idx] = &result.frames[idx]; - concrete_idx += 1; - } - } - } - } - access_close(access); - scratch_end(scratch); - return result; -} - -internal CTRL_CallStackFrame * -ctrl_call_stack_frame_from_unwind_and_inline_depth(CTRL_CallStack *call_stack, U64 unwind_count, U64 inline_depth) -{ - CTRL_CallStackFrame *f = 0; - { - U64 base_frame_idx = 0; - for(U64 idx = 0; idx < call_stack->frames_count; idx += 1) - { - if(call_stack->frames[idx].inline_depth == 0) - { - if(base_frame_idx == unwind_count) - { - f = &call_stack->frames[idx]; - break; - } - base_frame_idx += 1; - } - } - if(f != 0 && call_stack->frames + inline_depth < f) - { - f -= inline_depth; - } - } - return f; -} - -//////////////////////////////// -//~ rjf: Halting All Attached Processes - -internal void -ctrl_halt(void) -{ - dmn_halt(0, 0); -} - -//////////////////////////////// -//~ rjf: Shared Accessor Functions - -//- rjf: generation counters - -internal U64 -ctrl_run_gen(void) -{ - U64 result = ins_atomic_u64_eval(&ctrl_state->run_gen); - return result; -} - -internal U64 -ctrl_mem_gen(void) -{ - U64 result = ins_atomic_u64_eval(&ctrl_state->mem_gen); - return result; -} - -internal U64 -ctrl_reg_gen(void) -{ - U64 result = ins_atomic_u64_eval(&ctrl_state->reg_gen); - return result; -} - -//- rjf: name -> register/alias hash tables, for eval - -internal E_String2NumMap * -ctrl_string2reg_from_arch(Arch arch) -{ - return &ctrl_state->arch_string2reg_tables[arch]; -} - -internal E_String2NumMap * -ctrl_string2alias_from_arch(Arch arch) -{ - return &ctrl_state->arch_string2alias_tables[arch]; -} - -//////////////////////////////// -//~ rjf: Control-Thread Functions - -//- rjf: user -> control thread communication - -internal B32 -ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) -{ - Temp scratch = scratch_begin(0, 0); - String8 msgs_srlzed_baked = ctrl_serialized_string_from_msg_list(scratch.arena, msgs); - B32 good = 0; - MutexScope(ctrl_state->u2c_ring_mutex) for(;;) - { - U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); - U64 available_size = ctrl_state->u2c_ring_size-unconsumed_size; - U64 needed_size = sizeof(msgs_srlzed_baked.size) + msgs_srlzed_baked.size; - if(available_size >= needed_size) - { - ctrl_state->u2c_ring_write_pos += ring_write_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size); - ctrl_state->u2c_ring_write_pos += ring_write(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size); - good = 1; - break; - } - if(os_now_microseconds() >= endt_us) - { - break; - } - cond_var_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, endt_us); - } - if(good) - { - cond_var_broadcast(ctrl_state->u2c_ring_cv); - } - scratch_end(scratch); - return good; -} - -internal CTRL_MsgList -ctrl_u2c_pop_msgs(Arena *arena) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 msgs_srlzed_baked = {0}; - MutexScope(ctrl_state->u2c_ring_mutex) for(;;) - { - U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); - if(unconsumed_size >= sizeof(U64)) - { - U64 size_to_decode = 0; - ctrl_state->u2c_ring_read_pos += ring_read_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, &size_to_decode); - msgs_srlzed_baked.size = size_to_decode; - msgs_srlzed_baked.str = push_array_no_zero(scratch.arena, U8, msgs_srlzed_baked.size); - ctrl_state->u2c_ring_read_pos += ring_read(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode); - break; - } - cond_var_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, max_U64); - } - cond_var_broadcast(ctrl_state->u2c_ring_cv); - CTRL_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked); - scratch_end(scratch); - return msgs; -} - -//- rjf: control -> user thread communication - -internal void -ctrl_c2u_push_events(CTRL_EventList *events) -{ - if(events->count != 0) ProfScope("ctrl_c2u_push_events") - { - MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) - { - ctrl_entity_store_apply_events(ctrl_state->ctrl_thread_entity_store, events); - } - for(CTRL_EventNode *n = events->first; n != 0; n = n ->next) - { - Temp scratch = scratch_begin(0, 0); - String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, ctrl_state->c2u_ring_size-sizeof(U64)); - MutexScope(ctrl_state->c2u_ring_mutex) for(;;) - { - U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); - U64 available_size = ctrl_state->c2u_ring_size-unconsumed_size; - U64 needed_size = sizeof(event_srlzed.size) + event_srlzed.size; - if(available_size >= needed_size) - { - ctrl_state->c2u_ring_write_pos += ring_write_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, &event_srlzed.size); - ctrl_state->c2u_ring_write_pos += ring_write(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); - break; - } - cond_var_wait(ctrl_state->c2u_ring_cv, ctrl_state->c2u_ring_mutex, os_now_microseconds()+100); - } - cond_var_broadcast(ctrl_state->c2u_ring_cv); - if(ctrl_state->wakeup_hook != 0) - { - ctrl_state->wakeup_hook(); - } - scratch_end(scratch); - } - } -} - -internal CTRL_EventList -ctrl_c2u_pop_events(Arena *arena) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - CTRL_EventList events = {0}; - MutexScope(ctrl_state->c2u_ring_mutex) for(;;) - { - U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); - if(unconsumed_size >= sizeof(U64)) - { - U64 size_to_decode = 0; - ctrl_state->c2u_ring_read_pos += ring_read_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, &size_to_decode); - String8 event_srlzed = {0}; - event_srlzed.size = size_to_decode; - event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size); - ctrl_state->c2u_ring_read_pos += ring_read(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); - CTRL_Event *new_event = ctrl_event_list_push(arena, &events); - *new_event = ctrl_event_from_serialized_string(arena, event_srlzed); - } - else - { - break; - } - } - cond_var_broadcast(ctrl_state->c2u_ring_cv); - scratch_end(scratch); - ProfEnd(); - return events; -} - -//- rjf: entry point - -internal void -ctrl_thread__entry_point(void *p) -{ - ThreadNameF("ctrl_thread"); - ProfBeginFunction(); - DMN_CtrlCtx *ctrl_ctx = dmn_ctrl_begin(); - log_select(ctrl_state->ctrl_thread_log); - - //- rjf: loop - Temp scratch = scratch_begin(0, 0); - for(;;) - { - temp_end(scratch); - log_scope_begin(); - - //- rjf: get next messages - CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); - - //- rjf: process messages - DMN_CtrlExclusiveAccessScope - { - ins_atomic_u64_eval_assign(&ctrl_state->ctrl_thread_run_state, 1); - for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0; msg_n = msg_n->next) - { - CTRL_Msg *msg = &msg_n->v; - { - log_infof("user2ctrl_msg:{kind:\"%S\"}\n", ctrl_string_from_msg_kind(msg->kind)); - } - - //- rjf: reset per-message state - ProfScope("reset per-message state") - { - arena_clear(ctrl_state->ctrl_thread_msg_process_arena); - ctrl_state->module_req_cache_slots_count = 4096; - ctrl_state->module_req_cache_slots = push_array(ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode *, ctrl_state->module_req_cache_slots_count); - MemoryZeroStruct(&ctrl_state->msg_user_bp_touched_files); - MemoryZeroStruct(&ctrl_state->msg_user_bp_touched_symbols); - MemoryCopyArray(ctrl_state->exception_code_filters, msg->exception_code_filters); - } - - //- rjf: gather all touched symbols by user breakpoints - { - Temp scratch = scratch_begin(0, 0); - for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) - { - if(n->v.kind != CTRL_UserBreakpointKind_Expression) - { - continue; - } - E_Parse addr_parse = e_push_parse_from_string(scratch.arena, n->v.string); - E_Parse cnd_parse = e_push_parse_from_string(scratch.arena, n->v.condition); - E_Expr *exprs[] = {addr_parse.expr, cnd_parse.expr}; - for EachElement(idx, exprs) - { - typedef struct ExprWalkTask ExprWalkTask; - struct ExprWalkTask - { - ExprWalkTask *next; - E_Expr *expr; - }; - ExprWalkTask start_task = {0, exprs[idx]}; - ExprWalkTask *first_task = &start_task; - for(ExprWalkTask *t = first_task; t != 0; t = t->next) - { - E_Expr *expr = t->expr; - if(expr->ref != &e_expr_nil) - { - expr = expr->ref; - } - if(expr->kind == E_ExprKind_LeafIdentifier) - { - str8_list_push(ctrl_state->ctrl_thread_msg_process_arena, &ctrl_state->msg_user_bp_touched_symbols, expr->string); - } - if(expr->next != &e_expr_nil) - { - ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1); - task->expr = expr->next; - task->next = t->next; - t->next = task; - } - if(expr->first != &e_expr_nil) - { - ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1); - task->expr = expr->first; - task->next = t->next; - t->next = task; - } - } - } - } - scratch_end(scratch); - } - - - - - - //- rjf: gather all touched files by user breakpoints - for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) - { - if(n->v.kind != CTRL_UserBreakpointKind_FileNameAndLineColNumber) - { - continue; - } - str8_list_push(ctrl_state->ctrl_thread_msg_process_arena, &ctrl_state->msg_user_bp_touched_files, n->v.string); - } - - //- rjf: process message - switch(msg->kind) - { - case CTRL_MsgKind_Null: - case CTRL_MsgKind_COUNT:{}break; - - //- rjf: target operations - case CTRL_MsgKind_Launch: {ctrl_thread__launch (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; - case CTRL_MsgKind_KillAll: {ctrl_thread__kill_all (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Run: {ctrl_thread__run (ctrl_ctx, msg);}break; - case CTRL_MsgKind_SingleStep: {ctrl_thread__single_step (ctrl_ctx, msg);}break; - - //- rjf: configuration - case CTRL_MsgKind_SetUserEntryPoints: - { - arena_clear(ctrl_state->user_entry_point_arena); - MemoryZeroStruct(&ctrl_state->user_entry_points); - for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) - { - str8_list_push(ctrl_state->user_entry_point_arena, &ctrl_state->user_entry_points, n->string); - } - }break; - case CTRL_MsgKind_SetModuleDebugInfoPath: - { - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - String8 path = msg->path; - CTRL_Entity *module = ctrl_entity_from_handle(entity_ctx, msg->entity); - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); - di_close(old_dbgi_key, 0); - MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) - { - ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); - } - U64 new_dbgi_timestamp = os_properties_from_file_path(path).modified; - debug_info_path->timestamp = new_dbgi_timestamp; - DI_Key new_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, new_dbgi_timestamp); - di_open(new_dbgi_key); - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_ModuleDebugInfoPathChange; - evt->entity = msg->entity; - evt->string = path; - evt->timestamp = new_dbgi_timestamp; - ctrl_c2u_push_events(&evts); - }break; - case CTRL_MsgKind_FreezeThread: - { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_ThreadFrozen; - evt->entity = msg->entity; - ctrl_c2u_push_events(&evts); - }break; - case CTRL_MsgKind_ThawThread: - { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_ThreadThawed; - evt->entity = msg->entity; - ctrl_c2u_push_events(&evts); - }break; - } - } - ins_atomic_u64_eval_assign(&ctrl_state->ctrl_thread_run_state, 0); - } - ins_atomic_u64_inc_eval(&ctrl_state->run_gen); - ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); - ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); - - //- rjf: update thread register cache - ProfScope("update thread register cache") - { - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_EntityArray threads = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Thread); - REGS_RegBlockX64 *blocks = push_array(scratch.arena, REGS_RegBlockX64, threads.count); - { - for EachIndex(idx, threads.count) - { - Temp scratch = scratch_begin(0, 0); - ctrl_reg_block_from_thread(scratch.arena, entity_ctx, threads.v[idx]->handle); - scratch_end(scratch); - } - } - } - - //- rjf: gather & output logs - ctrl_thread__end_and_flush_log(); - } - - scratch_end(scratch); - ProfEnd(); -} - -//- rjf: breakpoint resolution - -internal void -ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) -{ - if(user_bps->first == 0) { return; } - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - Access *access = eval_scope->access; - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_Entity *module_entity = ctrl_entity_from_handle(entity_ctx, module); - CTRL_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, CTRL_EntityKind_DebugInfoPath); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_entity); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - U64 base_vaddr = module_entity->vaddr_range.min; - for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) - { - CTRL_UserBreakpoint *bp = &n->v; - switch(bp->kind) - { - default:{}break; - - //- rjf: file:line-based breakpoints - case CTRL_UserBreakpointKind_FileNameAndLineColNumber: - { - // rjf: unpack & normalize - TxtPt pt = bp->pt; - String8 filename = bp->string; - String8 filename_normalized = push_str8_copy(scratch.arena, filename); - for(U64 idx = 0; idx < filename_normalized.size; idx += 1) - { - filename_normalized.str[idx] = lower_from_char(filename_normalized.str[idx]); - filename_normalized.str[idx] = correct_slash_from_char(filename_normalized.str[idx]); - } - - // rjf: filename -> src_id - U32 src_id = 0; - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - if(mapptr != 0) - { - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - src_id = ids[0]; - } - } - } - } - - // rjf: src_id * pt -> push - if(src_id != 0) - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); - for(U32 i = 0; i < voff_count; i += 1) - { - U64 vaddr = voffs[i] + base_vaddr; - DMN_Trap trap = {process.dmn_handle, vaddr, (U64)bp}; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } - }break; - - //- rjf: expression-based breakpoints - case CTRL_UserBreakpointKind_Expression: - { - String8 expr = bp->string; - E_Value value = e_value_from_string(expr); - if(value.u64 != 0 || bp->flags != 0) - { - DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; - trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags); - trap.size = bp->size; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - }break; - } - } - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) -{ - for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) - { - CTRL_UserBreakpoint *bp = &n->v; - if(bp->kind == CTRL_UserBreakpointKind_Expression) - { - String8 expr = bp->string; - E_Value value = e_value_from_string(expr); - if(value.u64 != 0 || bp->flags != 0) - { - DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; - trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags); - trap.size = bp->size; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } - } -} - -internal void -ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out) -{ - CTRL_Entity *process = bp->parent; - DMN_Trap trap = - { - .process = process->handle.dmn_handle, - .vaddr = bp->vaddr_range.min, - .id = ((U64)bp|bit64), - .flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->bp_flags), - .size = (U32)dim_1u64(bp->vaddr_range), - }; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); -} - -//- rjf: module lifetime open/close work - -internal -MACHINE_OP_MEM_READ(ctrl_dmn_mem_read) -{ - U64 read = dmn_process_read(((CTRL_Handle *)ud)->dmn_handle, r1u64(addr, addr + buffer_size), buffer); - return read == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; -} - -internal void -ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) -{ - Temp scratch = scratch_begin(0,0); - - //- rjf: set up per-module info - Arena *arena = arena_alloc(); - U64 entry_point_voff = 0; - U32 rdi_dbg_time = 0; - Guid rdi_dbg_guid = {0}; - String8 exe_dbg_path = {0}; - String8 rdi_dbg_path = {0}; - String8 raddbg_data = {0}; - Rng1U64 raddbg_section_voff_range = {0}; - Rng1U64 raddbg_is_attached_section_voff_range = {0}; - PE_IntelPdata *pdatas = 0; - U64 pdatas_count = 0; - U32 pdb_dbg_time = 0; - U32 pdb_dbg_age = 0; - Guid pdb_dbg_guid = {0}; - String8 pdb_dbg_path = {0}; - U64 cfi_rebase = 0; - B32 is_unwind_eh = 0; - EH_FrameHdr eh_frame_hdr = {0}; - EH_PtrCtx eh_ptr_ctx = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; - - //- read module's signature bytes - U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); - U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); - dmn_process_read(process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); - - ////////////////////////////// - //- parse PE module - // - PE_DosMagic dos_magic = *(PE_DosMagic *)module_sig_bytes; - if(dos_magic == PE_DOS_MAGIC) - { - ProfScope("unpack relevant PE info") - { - B32 is_valid = 1; - - //- rjf: read DOS header - PE_DosHeader dos_header = {0}; - if(is_valid) - { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min, &dos_header) || - dos_header.magic != PE_DOS_MAGIC) - { - is_valid = 0; - } - } - - //- rjf: read PE magic - U32 pe_magic = 0; - if(is_valid) - { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || - pe_magic != PE_MAGIC) - { - is_valid = 0; - } - } - - //- rjf: read COFF header - U64 file_header_off = dos_header.coff_file_offset + sizeof(pe_magic); - COFF_FileHeader file_header = {0}; - if(is_valid) - { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + file_header_off, &file_header)) - { - is_valid = 0; - } - } - - //- rjf: unpack range of optional extension header - U32 opt_ext_size = file_header.optional_header_size; - Rng1U64 opt_ext_off_range = r1u64(file_header_off + sizeof(COFF_FileHeader), - file_header_off + sizeof(COFF_FileHeader) + opt_ext_size); - - //- rjf: read optional header - U64 entry_point = 0; - U32 data_dir_count = 0; - if(opt_ext_size > 0) - { - // rjf: read magic number - U16 opt_ext_magic = 0; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); - - // rjf: read info - U32 reported_data_dir_offset = 0; - U32 reported_data_dir_count = 0; - switch(opt_ext_magic) - { - case PE_PE32_MAGIC: - { - PE_OptionalHeader32 pe_optional = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - entry_point = pe_optional.entry_point_va; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - case PE_PE32PLUS_MAGIC: - { - PE_OptionalHeader32Plus pe_optional = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - entry_point = pe_optional.entry_point_va; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - } - - // rjf: find number of data directories - U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); - data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); - - // rjf: grab pdatas from exceptions section - if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) - { - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); - Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); - pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); - pdatas = push_array(arena, PE_IntelPdata, pdatas_count); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); - } - - // rjf: extract sections - U64 sec_array_off = opt_ext_off_range.max; - U64 sec_count = file_header.section_count; - COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); - - // rjf: grab entry point vaddr - entry_point_voff = entry_point; - - // rjf: grab data about debug info - if(data_dir_count > PE_DataDirectoryIndex_DEBUG) - { - // rjf: read data dir - PE_DataDirectory dir = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); - - U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); - for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) - { - // rjf: read debug directory - U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); - PE_DebugDirectory dbg_data = {0}; - dmn_process_read_struct(process.dmn_handle, dir_addr, &dbg_data); - - // rjf: extract external file info from codeview header - if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) - { - U32 cv_magic = 0; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv_magic); - switch(cv_magic) - { - default:break; - case PE_CODEVIEW_PDB20_MAGIC: - { - PE_CvHeaderPDB20 cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min+dbg_data.voff, &cv); - if(read_size == sizeof(cv)) - { - pdb_dbg_time = cv.time_stamp; - pdb_dbg_age = cv.age; - pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); - } - }break; - case PE_CODEVIEW_PDB70_MAGIC: - { - PE_CvHeaderPDB70 cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); - if(read_size == sizeof(cv)) - { - pdb_dbg_guid = cv.guid; - pdb_dbg_age = cv.age; - pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); - } - }break; - case PE_CODEVIEW_RDI_MAGIC: - { - PE_CvHeaderRDI cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); - if(read_size == sizeof(cv)) - { - rdi_dbg_guid = cv.guid; - rdi_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); - } - }break; - } - } - } - } - - // rjf: look for DWARF debug info - { - U64 symbol_array_off = file_header.symbol_table_foff; - U64 symbol_count = file_header.symbol_count; - if(symbol_array_off != 0) - { - exe_dbg_path = path; - } - } - - // rjf: extract copy of module's raddbg data - { - for EachIndex(idx, sec_count) - { - String8 section_name = str8_cstring((char *)sec[idx].name); - if(str8_match(section_name, str8_lit(".raddbg"), 0)) - { - raddbg_section_voff_range.min = sec[idx].voff; - raddbg_section_voff_range.max = sec[idx].voff + sec[idx].vsize; - } - else if(str8_match(section_name, str8_lit(".rdbgia"), 0)) - { - raddbg_is_attached_section_voff_range.min = sec[idx].voff; - raddbg_is_attached_section_voff_range.max = sec[idx].voff + sec[idx].vsize; - } - } - raddbg_data.size = dim_1u64(raddbg_section_voff_range); - raddbg_data.str = push_array(arena, U8, raddbg_data.size); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + raddbg_section_voff_range.min, - vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); - } - - // rjf: if we have a "raddbg is attached" section, mark the first byte as 1, to signify attachment - if(raddbg_is_attached_section_voff_range.max != raddbg_is_attached_section_voff_range.min) - { - U8 new_value = 1; - dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); - } - } - } - } - - ////////////////////////////// - //- parse ELF module - // - else if(str8_match(str8(module_sig_bytes, elf_magic_string.size), elf_magic_string, 0)) - { - U64 e_entry = 0; - ELF_Type e_type = ELF_Type_None; - { - U8 *elf_sig = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max)); - if(elf_sig == 0) { goto elf_exit; } - switch(elf_sig[ELF_Identifier_Class]) - { - default: - case ELF_Class_None:{}break; - case ELF_Class_32: - { - NotImplemented; - }break; - case ELF_Class_64: - { - ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr))); - if(ehdr == 0) { goto elf_exit; } - e_entry = ehdr->e_entry; - e_type = ehdr->e_type; - }break; - } - } - - if(e_type == ELF_Type_Dyn) - { - cfi_rebase = vaddr_range.min; - } - - // find and parse .eh_frame_hdr - Rng1U64 eh_frame_hdr_vrange = {0}; - String8 eh_frame_hdr_data = {0}; - { - void *phdrs_raw = dmn_process_read_raw(scratch.arena, process.dmn_handle, elf_phdr_vrange); - if(phdrs_raw == 0) { goto elf_exit; } - - if(elf_phdr_entsize == sizeof(ELF_Phdr32)) - { - NotImplemented; - } - else if(elf_phdr_entsize == sizeof(ELF_Phdr64)) - { - U64 elf_phcount = dim_1u64(elf_phdr_vrange) / elf_phdr_entsize; - ELF_Phdr64 *phdrs64 = phdrs_raw; - for EachIndex(phdr_idx, elf_phcount) - { - ELF_Phdr64 *phdr = phdrs64 + phdr_idx; - if(phdr->p_type == ELF_PType_GnuEHFrame) - { - eh_frame_hdr_vrange = r1u64(cfi_rebase + phdr->p_vaddr, cfi_rebase + phdr->p_vaddr + phdr->p_memsz); - eh_frame_hdr_data = dmn_process_read_block(arena, process.dmn_handle, eh_frame_hdr_vrange); - is_unwind_eh = 1; - break; - } - } - } - } - - // parse .eh_frame_hdr - Arch arch = ctrl_arch_from_process_handle(process); - eh_ptr_ctx.pc_vaddr = eh_frame_hdr_vrange.min; - eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min; - eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx); - - // set entry point - if (e_entry != 0) - { - entry_point_voff = e_entry - vaddr_range.min; - } - - // TODO: is there a way to detect DWARF in runtime ELF? - if(1) - { - exe_dbg_path = path; - } - elf_exit:; - } - - ////////////////////////////// - //- rjf: pick default initial debug info path - // - String8 initial_debug_info_path = str8_zero(); - { - String8 exe_folder = str8_chop_last_slash(path); - String8List dbg_path_candidates = {0}; - // - //~ TODO(rjf): @linux_port PLEASE READ RYAN vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - // - // TODO(rjf): trying "exe_folder/embedded_path" as the first option is only a valid - // heuristic on Windows, because we know that two absolute paths concatted together - // are necessarily invalid. however, on Linux, this is not the case - you could stitch - // two paths together and get a third path that is completely valid. so, in that case, - // we will need to infer if the path is relative, and then use either the embedded - // path as-is, or the exe-relative-path accordingly, depending on that. - // - if(rdi_dbg_path.size != 0) - { - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S/%S", exe_folder, rdi_dbg_path); - str8_list_push(scratch.arena, &dbg_path_candidates, rdi_dbg_path); - } - if(exe_dbg_path.size != 0) - { - str8_list_push(scratch.arena, &dbg_path_candidates, path); - } - if(pdb_dbg_path.size != 0) - { - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S/%S", exe_folder, pdb_dbg_path); - str8_list_push(scratch.arena, &dbg_path_candidates, pdb_dbg_path); - } - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.pdb", str8_chop_last_dot(path)); - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.pdb", path); - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.rdi", str8_chop_last_dot(path)); - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.rdi", path); - for(String8Node *n = dbg_path_candidates.first; n != 0; n = n->next) - { - String8 candidate_path = n->string; - FileProperties props = os_properties_from_file_path(candidate_path); - if(props.modified != 0 && props.size != 0) - { - initial_debug_info_path = push_str8_copy(arena, path_normalized_from_string(scratch.arena, candidate_path)); - break; - } - } - } - - ////////////////////////////// - //- rjf: insert info into cache - // - { - U64 hash = ctrl_hash_from_handle(module); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeW(stripe->rw_mutex) - { - CTRL_ModuleImageInfoCacheNode *node = 0; - for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) - { - if(ctrl_handle_match(n->module, module)) - { - node = n; - break; - } - } - if(!node) - { - node = push_array(arena, CTRL_ModuleImageInfoCacheNode, 1); - DLLPushBack(slot->first, slot->last, node); - node->module = module; - node->arena = arena; - node->pdatas = pdatas; - node->pdatas_count = pdatas_count; - node->cfi_rebase = cfi_rebase; - node->is_unwind_eh = is_unwind_eh; - node->eh_frame_hdr = eh_frame_hdr; - node->eh_ptr_ctx = eh_ptr_ctx; - node->entry_point_voff = entry_point_voff; - node->initial_debug_info_path = initial_debug_info_path; - node->raddbg_attached_marker_voff = raddbg_is_attached_section_voff_range.min; - node->raddbg_data = str8_copy(arena, raddbg_data); - } - } - } - - scratch_end(scratch); -} - -internal void -ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range) -{ - ////////////////////////////// - //- rjf: evict module image info from cache - // - U64 raddbg_attached_marker_voff = 0; - { - U64 hash = ctrl_hash_from_handle(module); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeW(stripe->rw_mutex) - { - CTRL_ModuleImageInfoCacheNode *node = 0; - for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->module, module)) - { - node = n; - break; - } - } - if(node) - { - raddbg_attached_marker_voff = node->raddbg_attached_marker_voff; - DLLRemove(slot->first, slot->last, node); - arena_release(node->arena); - } - } - } - - ////////////////////////////// - //- rjf: write 0 at attachment market, to signify detachment - // - if(raddbg_attached_marker_voff != 0) - { - U8 new_value = 0; - dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_attached_marker_voff, &new_value); - } -} - -//- rjf: attached process running/event gathering - -internal DMN_Event * -ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof) -{ - ProfBeginFunction(); - DMN_Event *event = push_array(arena, DMN_Event, 1); - Temp scratch = scratch_begin(&arena, 1); - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - - //- rjf: loop -> try to get event, run, repeat - U64 spoof_old_ip_value = 0; - ProfScope("loop -> try to get event, run, repeat") for(B32 got_event = 0; got_event == 0;) - { - //- rjf: get next event - ProfScope("get next event") - { - // rjf: grab first event - DMN_EventNode *next_event_node = ctrl_state->first_dmn_event_node; - - // rjf: log event - if(next_event_node != 0) - { - DMN_Event *ev = &next_event_node->v; - LogInfoNamedBlockF("dmn_event") - { - log_infof("kind: %S\n", dmn_event_kind_string_table[ev->kind]); - log_infof("exception_kind: %S\n", dmn_exception_kind_string_table[ev->exception_kind]); - log_infof("process: [%I64u]\n", ev->process.u64[0]); - log_infof("thread: [%I64u]\n", ev->thread.u64[0]); - log_infof("module: [%I64u]\n", ev->module.u64[0]); - log_infof("arch: %S\n", string_from_arch(ev->arch)); - log_infof("address: 0x%I64x\n", ev->address); - log_infof("string: \"%S\"\n", ev->string); - log_infof("ip_vaddr: 0x%I64x\n", ev->instruction_pointer); - } - } - - // rjf: determine if we should filter - B32 should_filter_event = 0; - if(next_event_node != 0) - { - DMN_Event *ev = &next_event_node->v; - switch(ev->kind) - { - default:{}break; - case DMN_EventKind_Exception: - { - // NOTE(rjf): first chance exceptions -> try ignoring - should_filter_event = (ev->exception_repeated == 0 && (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)); - - // rjf: exception code -> kind - CTRL_ExceptionCodeKind code_kind = CTRL_ExceptionCodeKind_Null; - if(should_filter_event) - { - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(ctrl_exception_code_kind_code_table[k] == ev->code) - { - code_kind = k; - break; - } - } - } - - // rjf: exception code kind -> shouldn't stop? if so, do not filter - if(should_filter_event) - { - B32 shouldnt_filter = !!(ctrl_state->exception_code_filters[code_kind/64] & (1ull<<(code_kind%64))); - if(should_filter_event && shouldnt_filter) - { - should_filter_event = 0; - } - } - - // rjf: special case: be gracious with ASan modules or symbols if - // they do their cute little 0xc0000005 exception trick... - if(!should_filter_event && ev->code == 0xc0000005 && - (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) - { - Access *access = access_open(); - CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, ev->process)); - CTRL_Entity *module = &ctrl_entity_nil; - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) - { - if(child->kind == CTRL_EntityKind_Module) - { - module = child; - break; - } - } - if(module != &ctrl_entity_nil) - { - // rjf: determine base address of asan shadow space - U64 asan_shadow_base_vaddr = 0; - B32 asan_shadow_variable_exists_but_is_zero = 0; - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64); - RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables); - { - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, unparsed_map, &map); - String8 name = str8_lit("__asan_shadow_memory_dynamic_address"); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - if(node != 0) - { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]); - U64 global_var_voff = rdi_voff_from_location(global_var->location); - U64 global_var_vaddr = global_var_voff + module->vaddr_range.min; - Arch arch = process->arch; - U64 addr_size = bit_size_from_arch(arch)/8; - dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); - asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0); - } - } - } - - // rjf: determine if this was a read/write to the shadow space - B32 violation_in_shadow_space = 0; - if(asan_shadow_base_vaddr != 0) - { - U64 asan_shadow_space_size = TB(128)/8; - if(asan_shadow_base_vaddr <= ev->address && ev->address < asan_shadow_base_vaddr+asan_shadow_space_size) - { - violation_in_shadow_space = 1; - } - } - - // rjf: filter event if this violation occurred in asan's shadow space - if(violation_in_shadow_space || asan_shadow_variable_exists_but_is_zero) - { - should_filter_event = 1; - } - } - - access_close(access); - } - }break; - } - } - - // rjf: good event & unfiltered? -> pop from queue & grab as result - if(next_event_node != 0 && !should_filter_event) - { - got_event = 1; - SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); - MemoryCopyStruct(event, &next_event_node->v); - event->string = push_str8_copy(arena, event->string); - run_ctrls->ignore_previous_exception = 1; - } - - // rjf: good event but filtered? pop from queue - if(next_event_node != 0 && should_filter_event) - { - SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); - run_ctrls->ignore_previous_exception = 0; - } - } - - //- rjf: no event -> dmn_ctrl_run for a new one - if(got_event == 0) ProfScope("no event -> dmn_ctrl_run for a new one") - { - // rjf: prep spoof - B32 do_spoof = (spoof != 0 && dmn_handle_match(run_ctrls->single_step_thread, dmn_handle_zero())); - U64 size_of_spoof = 0; - if(do_spoof) ProfScope("prep spoof") - { - CTRL_Entity *spoof_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, spoof->process)); - Arch arch = spoof_process->arch; - size_of_spoof = bit_size_from_arch(arch)/8; - dmn_process_read(spoof_process->handle.dmn_handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); - } - - // rjf: set spoof - if(do_spoof) ProfScope("set spoof") - { - dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); - } - - // rjf: run for new events - ProfScope("run for new events") - { - LogInfoNamedBlockF("dmn_ctrl_run") - { - log_infof("single_step_thread: [0x%I64x]\n", run_ctrls->single_step_thread); - log_infof("ignore_previous_exception: %i\n", !!run_ctrls->ignore_previous_exception); - log_infof("run_entities_are_unfrozen: %i\n", !!run_ctrls->run_entities_are_unfrozen); - log_infof("run_entities_are_processes: %i\n", !!run_ctrls->run_entities_are_processes); - log_infof("run_entity_count: %I64u\n", run_ctrls->run_entity_count); - LogInfoNamedBlockF("run_entities") for(U64 idx = 0; idx < run_ctrls->run_entity_count; idx += 1) - { - log_infof("[0x%I64x]\n", run_ctrls->run_entities[idx]); - } - log_infof("trap_count: %I64u\n", run_ctrls->traps.trap_count); - LogInfoNamedBlockF("traps") for(DMN_TrapChunkNode *n = run_ctrls->traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - log_infof("{process:[0x%I64x], vaddr:0x%I64x, id:0x%I64x}\n", n->v[idx].process.u64[0], n->v[idx].vaddr, n->v[idx].id); - } - } - } - - DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls); - ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); - ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); - ins_atomic_u64_inc_eval(&ctrl_state->run_gen); - for(DMN_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next) - { - DMN_EventNode *dst_n = ctrl_state->free_dmn_event_node; - if(dst_n != 0) - { - SLLStackPop(ctrl_state->free_dmn_event_node); - } - else - { - dst_n = push_array(ctrl_state->dmn_event_arena, DMN_EventNode, 1); - } - MemoryCopyStruct(&dst_n->v, &src_n->v); - dst_n->v.string = push_str8_copy(ctrl_state->dmn_event_arena, dst_n->v.string); - SLLQueuePush(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node, dst_n); - } - } - - // rjf: unset spoof - if(do_spoof) ProfScope("unset spoof") - { - dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); - } - } - } - - //- rjf: irrespective of what event came back, we should ALWAYS check the - // spoof's thread and see if it hit the spoof address, because we may have - // simply been sent other debug events first - if(spoof != 0) - { - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, spoof->thread)); - Arch arch = thread->arch; - void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch)); - dmn_thread_read_reg_block(spoof->thread, regs_block); - U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block); - if(spoof_thread_rip == spoof->new_ip_value) - { - regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value); - ctrl_thread_write_reg_block(ctrl_handle_make(CTRL_MachineID_Local, spoof->thread), regs_block); - } - } - - //- rjf: push ctrl events associated with this demon event - CTRL_EventList evts = {0}; - ProfScope("push ctrl events associated with this demon event") switch(event->kind) - { - default:{}break; - case DMN_EventKind_CreateProcess: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_NewProc; - out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->arch = event->arch; - out_evt->entity_id = event->code; - out_evt->tls_model = ctrl_dynamic_linker_type_from_dmn(event->tls_model); - out_evt->target_os = OperatingSystem_CURRENT; // TODO: operating system of the remote target machine - ctrl_state->process_counter += 1; - }break; - case DMN_EventKind_CreateThread: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_NewThread; - out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->arch = event->arch; - out_evt->entity_id = event->code; - out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); - out_evt->tls_root = dmn_tls_root_vaddr_from_thread(event->thread); - out_evt->rip_vaddr = event->instruction_pointer; - out_evt->string = event->string; - }break; - case DMN_EventKind_LoadModule: - { - CTRL_Handle process_handle = ctrl_handle_make(CTRL_MachineID_Local, event->process); - CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); - CTRL_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts); - String8 module_path = path_normalized_from_string(scratch.arena, event->string); - U64 exe_timestamp = os_properties_from_file_path(module_path).modified; - ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize); - out_evt1->kind = CTRL_EventKind_NewModule; - out_evt1->msg_id = msg->msg_id; - out_evt1->entity = module_handle; - out_evt1->parent = process_handle; - out_evt1->arch = event->arch; - out_evt1->entity_id = event->code; - out_evt1->vaddr_rng = r1u64(event->address, event->address+event->size); - out_evt1->rip_vaddr = event->address; - out_evt1->timestamp = exe_timestamp; - out_evt1->string = module_path; - out_evt1->tls_index = event->tls_index; - out_evt1->tls_offset = event->tls_offset; - CTRL_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts); - String8 initial_debug_info_path = ctrl_initial_debug_info_path_from_module(scratch.arena, module_handle); - U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified; - out_evt2->kind = CTRL_EventKind_ModuleDebugInfoPathChange; - out_evt2->msg_id = msg->msg_id; - out_evt2->entity = module_handle; - out_evt2->parent = process_handle; - out_evt2->timestamp = debug_info_timestamp; - out_evt2->string = initial_debug_info_path; - DI_Key initial_dbgi_key = di_key_from_path_timestamp(initial_debug_info_path, debug_info_timestamp); - di_open(initial_dbgi_key); - }break; - case DMN_EventKind_ExitProcess: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_EndProc; - out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->u64_code = event->code; - ctrl_state->process_counter -= 1; - }break; - case DMN_EventKind_ExitThread: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_EndThread; - out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->entity_id = event->code; - }break; - case DMN_EventKind_UnloadModule: - ProfScope("unload module %.*s", str8_varg(event->string)) - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); - CTRL_Entity *module_ent = ctrl_entity_from_handle(entity_ctx, module_handle); - CTRL_Entity *process_ent = ctrl_process_from_entity(module_ent); - String8 module_path = event->string; - ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range); - out_evt->kind = CTRL_EventKind_EndModule; - out_evt->msg_id = msg->msg_id; - out_evt->entity = module_handle; - out_evt->string = module_path; - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_ent); - di_close(dbgi_key, 0); - }break; - case DMN_EventKind_DebugString: - { - U64 num_strings = (event->string.size + ctrl_state->c2u_ring_max_string_size-1) / ctrl_state->c2u_ring_max_string_size; - for(U64 string_idx = 0; string_idx < num_strings; string_idx += 1) - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_DebugString; - out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->string = str8_substr(event->string, r1u64(string_idx*ctrl_state->c2u_ring_max_string_size, (string_idx+1)*ctrl_state->c2u_ring_max_string_size)); - } - }break; - case DMN_EventKind_SetThreadName: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_ThreadName; - out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->string = event->string; - out_evt->entity_id = event->code; - }break; - case DMN_EventKind_SetThreadColor: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_ThreadColor; - out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->entity_id = event->code; - out_evt->rgba = event->user_data; - }break; - case DMN_EventKind_SetVAddrRangeNote: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_SetVAddrRangeNote; - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->msg_id = msg->msg_id; - out_evt->vaddr_rng = r1u64(event->address, event->address + event->size); - out_evt->string = event->string; - }break; - case DMN_EventKind_SetBreakpoint: - { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_SetBreakpoint; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); - out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); - }break; - case DMN_EventKind_UnsetBreakpoint: - { - // TODO(rjf): this needs to be reflected in the resolved trap list too!!!!!!!! - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_UnsetBreakpoint; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); - out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); - }break; - } - ctrl_c2u_push_events(&evts); - - //- rjf: if this is the first process in a session, clear the debug directory - // cache state - if(ctrl_state->process_counter == 1 && event->kind == DMN_EventKind_CreateProcess) - { - arena_clear(ctrl_state->dbg_dir_arena); - ctrl_state->dbg_dir_root = push_array(ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1); - } - - //- rjf: out of queued up demon events -> clear event arena - if(ctrl_state->first_dmn_event_node == 0) - { - ctrl_state->free_dmn_event_node = 0; - arena_clear(ctrl_state->dmn_event_arena); - } - - scratch_end(scratch); - ProfEnd(); - return(event); -} - -//- rjf: eval helpers - -internal U64 -ctrl_eval_space_gen(E_Space space) -{ - U64 result = 0; - switch(space.kind) - { - default:{}break; - case CTRL_EvalSpaceKind_Entity: - { - result = ctrl_mem_gen(); - }break; - } - return result; -} - -internal B32 -ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) -{ - B32 result = 0; - switch(space.kind) - { - default:{}break; - - //- rjf: intra-entity reads (process memory or thread registers) - case CTRL_EvalSpaceKind_Entity: - { - CTRL_Entity *entity = (CTRL_Entity *)space.u64_0; - switch(entity->kind) - { - default:{}break; - case CTRL_EntityKind_Process: - { - U64 read_size = dmn_process_read(entity->handle.dmn_handle, range, out); - result = (read_size == dim_1u64(range)); - }break; - case CTRL_EntityKind_Thread: - { - Temp scratch = scratch_begin(0, 0); - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - U64 regs_size = regs_block_size_from_arch(entity->arch); - void *regs = ctrl_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle); - Rng1U64 legal_range = r1u64(0, regs_size); - Rng1U64 read_range = intersect_1u64(legal_range, range); - U64 read_size = dim_1u64(read_range); - MemoryCopy(out, (U8 *)regs + read_range.min, read_size); - result = (read_size == dim_1u64(range)); - scratch_end(scratch); - }break; - } - }break; - } - return result; -} - -//- rjf: control thread eval scopes - -internal CTRL_EvalScope * -ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread) -{ - ProfBeginFunction(); - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_EvalScope *scope = push_array(arena, CTRL_EvalScope, 1); - scope->access = access_open(); - - ////////////////////////////// - //- rjf: unpack thread - // - Arch arch = thread->arch; - U64 thread_rip_vaddr = dmn_rip_from_thread(thread->handle.dmn_handle); - CTRL_Entity *process = ctrl_process_from_entity(thread); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); - U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); - - ////////////////////////////// - //- rjf: gather evaluation debug infos & modules - // - U64 eval_modules_count = Max(1, entity_ctx->entity_kind_counts[CTRL_EntityKind_Module]); - E_Module *eval_modules = push_array(arena, E_Module, eval_modules_count); - E_Module *eval_modules_primary = &eval_modules[0]; - eval_modules_primary->vaddr_range = r1u64(0, max_U64); - U64 eval_dbg_infos_count = Max(1, entity_ctx->entity_kind_counts[CTRL_EntityKind_Module]); - E_DbgInfo *eval_dbg_infos = push_array(arena, E_DbgInfo, eval_dbg_infos_count); - E_DbgInfo *eval_dbg_infos_primary = &eval_dbg_infos[0]; - MemoryCopyStruct(eval_dbg_infos_primary, &e_dbg_info_nil); - { - U64 eval_module_idx = 0; - U64 eval_dbg_info_idx = 0; - for(CTRL_Entity *machine = entity_ctx->root->first; - machine != &ctrl_entity_nil; - machine = machine->next) - { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; - process != &ctrl_entity_nil; - process = process->next) - { - if(process->kind != CTRL_EntityKind_Process) { continue; } - for(CTRL_Entity *mod = process->first; - mod != &ctrl_entity_nil; - mod = mod->next) - { - if(mod->kind != CTRL_EntityKind_Module) { continue; } - DI_Key dbgi_key = ctrl_dbgi_key_from_module(mod); - - //- rjf: try to obtain this module's RDI - RDI_Parsed *rdi = di_rdi_from_key(scope->access, dbgi_key, 0, 0); - - //- rjf: if this RDI is not yet ready => determine if we need to wait for it - // - // (we *always* wait for the initial module) - // - B32 rdi_is_necessary = 1; - if(user_bps->count == 0) - { - rdi_is_necessary = 0; - } - else if(rdi == &rdi_parsed_nil) ProfScope("determine if RDI is necessary") - { - // rjf: find cached result - U64 hash = ctrl_hash_from_handle(mod->handle); - U64 slot_idx = hash%ctrl_state->module_req_cache_slots_count; - CTRL_ModuleReqCacheNode *slot = ctrl_state->module_req_cache_slots[slot_idx]; - CTRL_ModuleReqCacheNode *node = 0; - for(CTRL_ModuleReqCacheNode *n = slot; n != 0; n = n->next) - { - if(ctrl_handle_match(n->module, mod->handle)) - { - node = n; - break; - } - } - - // rjf: cached? -> take cached result - if(node != 0) - { - rdi_is_necessary = node->required; - } - - // rjf: not cached -> compute & store - else ProfScope("cache miss") - { - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(mod, CTRL_EntityKind_DebugInfoPath); - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, debug_info_path->string); - ProfScope("determine if %.*s is necessary", str8_varg(debug_info_path->string)) - { - //- rjf: determine if file is PDB - B32 file_is_pdb = 0; - if(!file_is_pdb) - { - U8 msf70_magic_maybe[sizeof(msf_msf70_magic)] = {0}; - os_file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe); - if(MemoryMatch(msf70_magic_maybe, msf_msf70_magic, sizeof(msf70_magic_maybe))) - { - file_is_pdb = 1; - } - } - if(!file_is_pdb) - { - U8 msf20_magic_maybe[sizeof(msf_msf20_magic)] = {0}; - os_file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe); - if(MemoryMatch(msf20_magic_maybe, msf_msf20_magic, sizeof(msf20_magic_maybe))) - { - file_is_pdb = 1; - } - } - - //- rjf: file is PDB -> do thin parse & lookup of all breakpoint files/symbols. - // if any are found in the PDB, then this RDI is necessary. - if(file_is_pdb) - { - FileProperties props = os_properties_from_file(file); - OS_Handle map = os_file_map_open(OS_AccessFlag_Read, file); - void *file_base = os_file_map_view_open(map, OS_AccessFlag_Read, r1u64(0, props.size)); - String8 file_data = str8(file_base, props.size); - { - rdi_is_necessary = pdb_has_symbol_or_file_ref(file_data, ctrl_state->msg_user_bp_touched_symbols, ctrl_state->msg_user_bp_touched_files); - } - os_file_map_view_close(map, file_base, r1u64(0, props.size)); - os_file_map_close(map); - } - } - os_file_close(file); - node = push_array(ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode, 1); - node->next = slot; - ctrl_state->module_req_cache_slots[slot_idx] = node; - node->module = mod->handle; - node->required = rdi_is_necessary; - } - } - - //- rjf: if this RDI is necessary, but we do not have it => wait for it forever - if(rdi == &rdi_parsed_nil && rdi_is_necessary) ProfScope("RDI is necessary -> wait") - { - rdi = di_rdi_from_key(scope->access, dbgi_key, 1, max_U64); - } - - //- rjf: fill debug info - eval_dbg_infos[eval_dbg_info_idx].dbgi_key = dbgi_key; - eval_dbg_infos[eval_dbg_info_idx].rdi = rdi; - if(mod == module) - { - eval_dbg_infos_primary = &eval_dbg_infos[eval_dbg_info_idx]; - } - eval_dbg_info_idx += 1; - - //- rjf: fill evaluation module info - eval_modules[eval_module_idx].arch = arch; - eval_modules[eval_module_idx].dbg_info_num= (U32)eval_dbg_info_idx; - eval_modules[eval_module_idx].vaddr_range = mod->vaddr_range; - eval_modules[eval_module_idx].space = e_space_make(CTRL_EvalSpaceKind_Entity); - eval_modules[eval_module_idx].space.u64_0 = (U64)process; - if(mod == module) - { - eval_modules_primary = &eval_modules[eval_module_idx]; - } - eval_module_idx += 1; - } - } - } - } - - ////////////////////////////// - //- rjf: select evaluation cache - // - e_select_cache(ctrl_state->ctrl_thread_eval_cache); - - ////////////////////////////// - //- rjf: build base evaluation context - // - { - E_BaseCtx *ctx = &scope->base_ctx; - - //- rjf: fill instruction pointer info - ctx->thread_ip_vaddr = thread_rip_vaddr; - ctx->thread_ip_voff = thread_rip_voff; - ctx->thread_arch = thread->arch; - ctx->thread_reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); - ctx->thread_reg_space.u64_0 = (U64)thread; - ctx->thread_process_space = e_space_make(CTRL_EvalSpaceKind_Entity); - ctx->thread_process_space.u64_0 = (U64)process; - - //- rjf: fill debug infos - ctx->dbg_infos = eval_dbg_infos; - ctx->dbg_infos_count = eval_dbg_infos_count; - ctx->primary_dbg_info = eval_dbg_infos_primary; - - //- rjf: fill modules - ctx->modules = eval_modules; - ctx->modules_count = eval_modules_count; - ctx->primary_module = eval_modules_primary; - - //- rjf: fill space hooks - ctx->space_gen = ctrl_eval_space_gen; - ctx->space_read = ctrl_eval_space_read; - } - e_select_base_ctx(&scope->base_ctx); - - ////////////////////////////// - //- rjf: build IR evaluation context - // - { - E_IRCtx *ctx = &scope->ir_ctx; - ctx->regs_map = ctrl_string2reg_from_arch(arch); - ctx->reg_alias_map = ctrl_string2alias_from_arch(arch); - ctx->locals_map = e_push_locals_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff); - ctx->member_map = e_push_member_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff); - ctx->macro_map = push_array(arena, E_String2ExprMap, 1); - ctx->macro_map[0] = e_string2expr_map_make(arena, 512); - ctx->auto_hook_map = push_array(arena, E_AutoHookMap, 1); - ctx->auto_hook_map[0] = e_auto_hook_map_make(arena, 512); - } - e_select_ir_ctx(&scope->ir_ctx); - - ////////////////////////////// - //- rjf: build eval interpretation context - // - { - E_InterpretCtx *ctx = &scope->interpret_ctx; - ctx->primary_space = eval_modules_primary->space; - ctx->reg_arch = eval_modules_primary->arch; - ctx->reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); - ctx->reg_space.u64_0 = (U64)thread; - ctx->module_base = push_array(arena, U64, 1); - ctx->module_base[0]= module->vaddr_range.min; - ctx->frame_base = push_array(arena, U64, 1); - // TODO(rjf): need to compute this out here somehow... ctx->frame_base[0] = ; - ctx->tls_base = push_array(arena, U64, 1); - // TODO: compute CFA - ctx->cfa = 0; - } - e_select_interpret_ctx(&scope->interpret_ctx, eval_dbg_infos_primary->rdi, thread_rip_voff); - - ProfEnd(); - return scope; -} - -internal void -ctrl_thread__eval_scope_end(CTRL_EvalScope *scope) -{ - access_close(scope->access); -} - -//- rjf: log flusher - -internal void -ctrl_thread__end_and_flush_log(void) -{ - Temp scratch = scratch_begin(0, 0); - LogScopeResult log = log_scope_end(scratch.arena); - os_append_data_to_file_path(ctrl_state->ctrl_thread_log_path, log.strings[LogMsgKind_Info]); - if(log.strings[LogMsgKind_UserError].size != 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_Error; - evt->string = log.strings[LogMsgKind_UserError]; - ctrl_c2u_push_events(&evts); - } - scratch_end(scratch); -} - -//- rjf: msg kind implementations - -internal void -ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - Temp scratch = scratch_begin(0, 0); - - //- rjf: produce full stdout/stderr/stdin paths - String8 stdout_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stdout_path, msg->path); - String8 stdin_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stdin_path, msg->path); - String8 stderr_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stderr_path, msg->path); - - //- rjf: obtain stdout/stderr/stdin handles - OS_Handle stdout_handle = {0}; - OS_Handle stderr_handle = {0}; - OS_Handle stdin_handle = {0}; - if(stdout_path.size != 0) - { - OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path); - os_file_close(f); - stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stdout_path); - } - if(stderr_path.size != 0) - { - OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stderr_path); - os_file_close(f); - stderr_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stderr_path); - } - if(stdin_path.size != 0) - { - stdin_handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdin_path); - } - - //- rjf: launch - OS_ProcessLaunchParams params = {0}; - { - params.cmd_line = msg->cmd_line_string_list; - params.path = msg->path; - params.env = msg->env_string_list; - params.inherit_env = msg->env_inherit; - params.debug_subprocesses = msg->debug_subprocesses; - params.stdout_file = stdout_handle; - params.stderr_file = stderr_handle; - params.stdin_file = stdin_handle; - } - U32 id = dmn_ctrl_launch(ctrl_ctx, ¶ms); - - //- rjf: close stdout/stderr/stdin files - os_file_close(stdout_handle); - os_file_close(stderr_handle); - os_file_close(stdin_handle); - - //- rjf: record (id -> entry points), so that we know custom entry points for this PID - CTRL_EntityCtxRWStore *entity_ctx_rw_store = ctrl_state->ctrl_thread_entity_store; - MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) - { - for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) - { - String8 string = n->string; - CTRL_Entity *entry = ctrl_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, CTRL_EntityKind_EntryPoint, Arch_Null, ctrl_handle_zero(), (U64)id); - ctrl_entity_equip_string(entity_ctx_rw_store, entry, string); - } - } - - scratch_end(scratch); -} - -internal void -ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - //- rjf: attach - B32 attach_successful = dmn_ctrl_attach(ctrl_ctx, msg->entity_id); - - //- rjf: run to handshake - if(attach_successful) - { - DMN_Handle unfrozen_process = {0}; - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - for(B32 done = 0; done == 0;) - { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_CreateProcess: - { - unfrozen_process = event->process; - run_ctrls.run_entities = &unfrozen_process; - run_ctrls.run_entity_count = 1; - }break; - case DMN_EventKind_Halt: - case DMN_EventKind_Exception: - case DMN_EventKind_Error: - case DMN_EventKind_HandshakeComplete: - { - done = 1; - }break; - } - } - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = CTRL_EventCause_Finished; - event->msg_id = msg->msg_id; - event->entity_id = !!attach_successful * msg->entity_id; - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DMN_Handle process = msg->entity.dmn_handle; - U32 exit_code = msg->exit_code; - - //- rjf: send kill - B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code); - - //- rjf: wait for process to be dead - CTRL_EventCause cause = CTRL_EventCause_Finished; - if(kill_worked) - { - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - run_ctrls.run_entities = &process; - run_ctrls.run_entity_count = 1; - for(B32 done = 0; done == 0;) - { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_ExitProcess: - if(dmn_handle_match(event->process, process)) - { - done = 1; - }break; - case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break; - case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break; - } - } - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = cause; - event->msg_id = msg->msg_id; - if(kill_worked) - { - event->entity = msg->entity; - } - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - U32 exit_code = msg->exit_code; - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - - //- rjf: gather all currently existing processes - CTRL_EntityArray initial_processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process); - typedef struct Task Task; - struct Task - { - Task *next; - Task *prev; - CTRL_Entity *process; - }; - Task *first_task = 0; - Task *last_task = 0; - for EachIndex(idx, initial_processes.count) - { - CTRL_Entity *entity = initial_processes.v[idx]; - Task *t = push_array(scratch.arena, Task, 1); - t->process = entity; - DLLPushBack(first_task, last_task, t); - } - - //- rjf: kill processes as needed, wait for all processes to be dead - CTRL_EventCause cause = CTRL_EventCause_Finished; - if(first_task != 0) - { - DMN_RunCtrls run_ctrls = {0}; - for(B32 done = 0; !done;) - { - // rjf: kill remaining processes - for(Task *t = first_task, *next = 0; t != 0; t = next) - { - next = t->next; - B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, t->process->handle.dmn_handle, exit_code); - if(kill_worked) - { - DLLRemove(first_task, last_task, t); - } - } - - // rjf: get next event - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - - // rjf: process event - switch(event->kind) - { - default:{}break; - case DMN_EventKind_CreateProcess: - { - CTRL_Entity *new_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); - Task *t = push_array(scratch.arena, Task, 1); - t->process = new_process; - DLLPushBack(first_task, last_task, t); - }break; - case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break; - case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break; - } - - // rjf: end if all processes are gone - CTRL_EntityArray processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process); - if(processes.count == 0) - { - done = 1; - } - } - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = cause; - event->msg_id = msg->msg_id; - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DMN_Handle process = msg->entity.dmn_handle; - - //- rjf: detach - B32 detach_worked = dmn_ctrl_detach(ctrl_ctx, process); - - //- rjf: wait for process to be dead - if(detach_worked) - { - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - run_ctrls.run_entities = &process; - run_ctrls.run_entity_count = 1; - for(B32 done = 0; done == 0;) - { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) - { - done = 1; - } - if(event->kind == DMN_EventKind_Halt) - { - done = 1; - } - } - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = CTRL_EventCause_Finished; - event->msg_id = msg->msg_id; - if(detach_worked) - { - event->entity = msg->entity; - } - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - DMN_Event *stop_event = 0; - CTRL_EventCause stop_cause = CTRL_EventCause_Null; - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_Handle target_thread = msg->entity; - CTRL_Handle target_process = msg->parent; - CTRL_Entity *target_process_entity = ctrl_entity_from_handle(entity_ctx, target_process); - U64 spoof_ip_vaddr = 911; - log_infof("ctrl_thread__run:\n{\n"); - - ////////////////////////////// - //- rjf: gather all initial breakpoints - // - DMN_TrapChunkList user_traps = {0}; - { - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, target_thread); - CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); - for(CTRL_Entity *machine = entity_ctx->root->first; - machine != &ctrl_entity_nil; - machine = machine->next) - { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) - { - if(process->kind != CTRL_EntityKind_Process) { continue; } - - // rjf: resolve module-dependent user bps - for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) - { - if(module->kind != CTRL_EntityKind_Module) { continue; } - ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, process->handle, module->handle, &msg->user_bps, &user_traps); - } - - // rjf: push process-declared breakpoins - for(CTRL_Entity *bp = process->first; bp != &ctrl_entity_nil; bp = bp->next) - { - if(bp->kind != CTRL_EntityKind_Breakpoint) { continue; } - ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &user_traps); - } - - // rjf: push virtual-address user breakpoints per-process - ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, process->handle, &msg->user_bps, &user_traps); - } - } - ctrl_thread__eval_scope_end(eval_scope); - } - - ////////////////////////////// - //- rjf: read initial stack-pointer-check value - // - // This MUST happen before any threads move, including single-stepping stuck - // threads, because otherwise, their stack pointer may change, if single-stepping - // causes e.g. entrance into a function via a call instruction. - // - U64 sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle); - log_infof("sp_check_value := 0x%I64x\n", sp_check_value); - - ////////////////////////////// - //- rjf: single step "stuck threads" - // - // "Stuck threads" are threads that are already on a User BP and would hit - // it immediately if resumed with all User BPs enabled. To get them "unstuck" - // we just need to single step them to get them off their current instruction. - // - // This only applies to threads OTHER THAN the target thread. If the target - // thread is on a user breakpoint, then we need to let trap net logic run, - // which may include features put on a trap net trap at the same address as - // the user breakpoint. - // - B32 target_thread_is_on_user_bp_and_trap_net_trap = 0; - if(stop_event == 0) - { - // rjf: gather stuck threads - DMN_HandleList stuck_threads = {0}; - for(CTRL_Entity *machine = entity_ctx->root->first; - machine != &ctrl_entity_nil; - machine = machine->next) - { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) - { - if(process->kind != CTRL_EntityKind_Process) { continue; } - for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) - { - if(thread->kind != CTRL_EntityKind_Thread) { continue; } - U64 rip = dmn_rip_from_thread(thread->handle.dmn_handle); - - // rjf: determine if thread is frozen - B32 thread_is_frozen = thread->is_frozen; - - // rjf: not frozen? -> check if stuck & gather if so - if(!thread_is_frozen) - { - for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) - { - B32 is_on_user_bp = 0; - for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) - { - if(dmn_handle_match(trap_ptr->process, process->handle.dmn_handle) && trap_ptr->vaddr == rip) - { - is_on_user_bp = 1; - } - } - - B32 is_on_net_trap = 0; - for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) - { - if(n->v.vaddr == rip) - { - is_on_net_trap = 1; - } - } - - if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle))) - { - dmn_handle_list_push(scratch.arena, &stuck_threads, thread->handle.dmn_handle); - } - - if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle)) - { - target_thread_is_on_user_bp_and_trap_net_trap = 1; - } - } - } - } - } - } - - // rjf: actually step stuck threads - for(DMN_HandleNode *node = stuck_threads.first; - node != 0; - node = node->next) - { - DMN_Handle thread = node->v; - U64 thread_pre_rip = dmn_rip_from_thread(thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 done = 0; !done;) - { - log_infof("single_step_stuck_thread([0x%I64x])\n", thread.u64[0]); - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities = &thread; - run_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - run_ctrls.single_step_thread = thread; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_ExitThread: - if(dmn_handle_match(event->thread, thread)) - { - stop_cause = CTRL_EventCause_Error; - goto stop; - }break; - case DMN_EventKind_Error: stop_cause = CTRL_EventCause_Error; goto stop; - case DMN_EventKind_Exception: stop_cause = CTRL_EventCause_InterruptedByException; goto stop; - case DMN_EventKind_Trap: stop_cause = CTRL_EventCause_InterruptedByTrap; goto stop; - case DMN_EventKind_Halt: stop_cause = CTRL_EventCause_InterruptedByHalt; goto stop; - stop:; - { - stop_event = event; - done = 1; - }break; - case DMN_EventKind_SingleStep: - { - done = dmn_handle_match(node->v, event->thread); - }break; - } - } - } - } - - ////////////////////////////// - //- rjf: gather frozen threads - // - CTRL_EntityList frozen_threads = {0}; - for(CTRL_Entity *machine = entity_ctx->root->first; - machine != &ctrl_entity_nil; - machine = machine->next) - { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) - { - if(process->kind != CTRL_EntityKind_Process) { continue; } - for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) - { - if(thread->is_frozen) - { - ctrl_entity_list_push(scratch.arena, &frozen_threads, thread); - } - } - } - } - - ////////////////////////////// - //- rjf: resolve trap net - // - DMN_TrapChunkList trap_net_traps = {0}; - for(CTRL_TrapNode *node = msg->traps.first; - node != 0; - node = node->next) - { - DMN_Trap trap = {target_process.dmn_handle, node->v.vaddr}; - dmn_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap); - } - - ////////////////////////////// - //- rjf: join user breakpoints and trap net traps - // - DMN_TrapChunkList joined_traps = {0}; - { - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &user_traps); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); - } - - ////////////////////////////// - //- rjf: record start - // - if(stop_event == 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Started; - ctrl_c2u_push_events(&evts); - } - - ////////////////////////////// - //- rjf: run loop - // - if(stop_event == 0) - { - B32 spoof_mode = 0; - CTRL_Spoof spoof = {0}; - DMN_TrapChunkList entry_traps = {0}; - for(U64 run_loop_idx = 0;; run_loop_idx += 1) - { - ////////////////////////// - //- rjf: choose low level traps - // - DMN_TrapChunkList *trap_list = &joined_traps; - if(spoof_mode) - { - trap_list = &user_traps; - } - - ////////////////////////// - //- rjf: choose spoof - // - CTRL_Spoof *run_spoof = 0; - if(spoof_mode) - { - run_spoof = &spoof; - } - - ////////////////////////// - //- rjf: setup run controls - // - DMN_RunCtrls run_ctrls = {0}; - if(run_loop_idx == 0) - { - run_ctrls.priority_thread = target_thread.dmn_handle; - } - run_ctrls.ignore_previous_exception = 1; - run_ctrls.run_entity_count = frozen_threads.count; - run_ctrls.run_entities = push_array(scratch.arena, DMN_Handle, run_ctrls.run_entity_count); - run_ctrls.run_entities_are_unfrozen = 0; - { - U64 idx = 0; - for(CTRL_EntityNode *n = frozen_threads.first; n != 0; n = n->next) - { - run_ctrls.run_entities[idx] = n->v->handle.dmn_handle; - idx += 1; - } - } - run_ctrls.traps = *trap_list; - - ////////////////////////// - //- rjf: get next run-related event - // - log_infof("get_next_event:\n{\n"); - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, run_spoof); - log_infof("}\n\n"); - - ////////////////////////// - //- rjf: determine event handling - // - B32 launch_done_first_module = 0; - B32 hard_stop = 0; - CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - B32 use_stepping_logic = 0; - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: - case DMN_EventKind_Halt: - case DMN_EventKind_SingleStep: - case DMN_EventKind_Trap: - { - hard_stop = 1; - log_infof("step_rule: unexpected -> hard_stop\n"); - }break; - case DMN_EventKind_Exception: - case DMN_EventKind_Breakpoint: - { - use_stepping_logic = 1; - log_infof("step_rule: exception/breakpoint -> stepping_logic\n"); - }break; - case DMN_EventKind_CreateProcess: - { - CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, &ctrl_entity_nil); - { - DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(CTRL_MachineID_Local, event->process), &msg->user_bps, &new_traps); - log_infof("step_rule: create_process -> resolve traps\n"); - log_infof("new_traps:\n{\n"); - for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - DMN_Trap *trap = &n->v[idx]; - log_infof("{process:[0x%I64x], vaddr:0x%I64x}\n", trap->process.u64[0], trap->vaddr); - } - } - log_infof("}\n\n"); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); - } - ctrl_thread__eval_scope_end(eval_scope); - }break; - case DMN_EventKind_LoadModule: - { - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->thread)); - CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); - { - DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(CTRL_MachineID_Local, event->process), ctrl_handle_make(CTRL_MachineID_Local, event->module), &msg->user_bps, &new_traps); - log_infof("step_rule: load_module -> resolve traps\n"); - log_infof("new_traps:\n{\n"); - for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - DMN_Trap *trap = &n->v[idx]; - log_infof("{process:[0x%I64x], vaddr:0x%I64x}\n", trap->process.u64[0], trap->vaddr); - } - } - log_infof("}\n\n"); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); - } - ctrl_thread__eval_scope_end(eval_scope); - }break; - case DMN_EventKind_SetBreakpoint: - { - CTRL_Entity *bp = &ctrl_entity_nil; - { - CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) - { - if(child->kind == CTRL_EntityKind_Breakpoint && - child->vaddr_range.min == event->address && - child->vaddr_range.max == event->address + event->size && - child->bp_flags == ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags)) - { - bp = child; - break; - } - } - } - if(bp != &ctrl_entity_nil) - { - DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &new_traps); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); - } - }break; - } - - ////////////////////////// - //- rjf: on launches, detect entry points, place traps - // - if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && !launch_done_first_module && event->kind == DMN_EventKind_HandshakeComplete) - { - launch_done_first_module = 1; - Access *access = access_open(); - - //- rjf: unpack process/module info - CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); - CTRL_Entity *module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module); - U64 module_base_vaddr = module->vaddr_range.min; - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64); - RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, unparsed_map, &map); - - //- rjf: add traps for user-specified entry points on this message, if specified - B32 entries_found = 0; - if(!entries_found) - { - for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) - { - U32 procedure_id = 0; - { - String8 name = n->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - - //- rjf: add traps for module-baked entry points, if specified - if(!entries_found) - { - String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle); - U8 split_char = 0; - String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); - for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next) - { - String8 text = text_n->string; - MD_Node *root = md_tree_from_string(scratch.arena, text); - if(str8_match(root->first->string, str8_lit("entry_point"), 0)) - { - String8 name = root->first->first->string; - U32 procedure_id = 0; - { - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - } - - //- rjf: add traps for PID-correllated entry points - if(!entries_found) - { - for(CTRL_Entity *e = entity_ctx->root->first; e != &ctrl_entity_nil; e = e->next) - { - if(e->id == process->id) - { - U32 procedure_id = 0; - { - String8 name = e->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - } - - //- rjf: add traps for all custom user entry points - if(!entries_found) - { - for(String8Node *n = ctrl_state->user_entry_points.first; n != 0; n = n->next) - { - U32 procedure_id = 0; - { - String8 name = n->string; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - break; - } - } - } - - //- rjf: add traps for all high-level entry points - if(!entries_found) - { - String8 hi_entry_points[] = - { - str8_lit("WinMain"), - str8_lit("wWinMain"), - str8_lit("main"), - str8_lit("wmain"), - }; - for(U64 idx = 0; idx < ArrayCount(hi_entry_points); idx += 1) - { - U32 procedure_id = 0; - { - String8 name = hi_entry_points[idx]; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - - //- rjf: add trap for PE header entry - if(!entries_found) - { - U64 voff = ctrl_entry_point_voff_from_module(module->handle); - if(voff != 0) - { - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - - //- rjf: add traps for all low-level entry points - if(!entries_found) - { - String8 lo_entry_points[] = - { - str8_lit("WinMainCRTStartup"), - str8_lit("wWinMainCRTStartup"), - str8_lit("mainCRTStartup"), - str8_lit("wmainCRTStartup"), - }; - for(U64 idx = 0; idx < ArrayCount(lo_entry_points); idx += 1) - { - U32 procedure_id = 0; - { - String8 name = lo_entry_points[idx]; - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - procedure_id = ids[0]; - } - } - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); - U64 voff = rdi_first_voff_from_procedure(rdi, procedure); - if(voff != 0) - { - entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; - dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); - } - } - } - - //- rjf: no entry point found -> done - if(entry_traps.trap_count == 0) - { - hard_stop = 1; - } - - //- rjf: found entry points -> add to joined traps - dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &entry_traps); - - access_close(access); - } - - ////////////////////////// - //- rjf: unpack info about thread attached to event - // - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->thread)); - CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); - Arch arch = thread->arch; - U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); - - ////////////////////////// - //- rjf: extract module-dependent info - // - U64 thread_rip_voff = thread_rip_vaddr - module->vaddr_range.min; - - ////////////////////////// - //- rjf: stepping logic - // - //{ - - ////////////////////////// - //- rjf: handle if hitting a spoof - // - B32 exception_stop = 0; - B32 hit_spoof = 0; - if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Exception) - { - if(spoof_mode && - dmn_handle_match(target_process.dmn_handle, event->process) && - dmn_handle_match(target_thread.dmn_handle, event->thread) && - spoof.new_ip_value == event->address) - { - hit_spoof = 1; - log_infof("hit_spoof\n"); - } - else - { - exception_stop = 1; - use_stepping_logic = 0; - } - } - - //- rjf: handle spoof hit - if(hit_spoof) - { - log_infof("exit_spoof_mode\n"); - - // rjf: clear spoof mode - spoof_mode = 0; - MemoryZeroStruct(&spoof); - - // rjf: skip remainder of handling - use_stepping_logic = 0; - } - - //- rjf: for breakpoint events, gather bp info - B32 hit_entry = 0; - B32 hit_user_bp = 0; - B32 hit_trap_net_bp = 0; - B32 hit_conditional_bp_but_filtered = 0; - CTRL_TrapFlags hit_trap_flags = 0; - if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Breakpoint) - ProfScope("for breakpoint events, gather bp info") - { - Temp temp = temp_begin(scratch.arena); - String8List conditions = {0}; - - // rjf: entry breakpoints - for(DMN_TrapChunkNode *n = entry_traps.first; n != 0; n = n->next) - { - DMN_Trap *trap = n->v; - DMN_Trap *opl = n->v + n->count; - for(;trap < opl; trap += 1) - { - if(dmn_handle_match(trap->process, event->process) && trap->vaddr == event->instruction_pointer) - { - hit_entry = 1; - } - } - } - - // rjf: user breakpoints - { - if(event->user_data != 0) - { - hit_user_bp = 1; - } - for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) - { - DMN_Trap *trap = n->v; - DMN_Trap *opl = n->v + n->count; - for(;trap < opl; trap += 1) - { - if(dmn_handle_match(trap->process, event->process) && - trap->vaddr == event->instruction_pointer && - (!dmn_handle_match(event->thread, target_thread.dmn_handle) || !target_thread_is_on_user_bp_and_trap_net_trap)) - { - CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)trap->id; - hit_user_bp = 1; - if(user_bp != 0 && !(trap->id & bit64) && user_bp->condition.size != 0) - { - str8_list_push(temp.arena, &conditions, user_bp->condition); - } - } - } - } - } - - // rjf: programmatic user breakpoints (we do not have state for it, - // but the target program(s) did something breakpoint-like, and we - // want to treat it as if we did) - if(event->address != 0) - { - hit_user_bp = 1; - } - - // rjf: evaluate hit stop conditions - if(conditions.node_count != 0) ProfScope("evaluate hit stop conditions") - { - CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(temp.arena, &msg->user_bps, thread); - for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) - { - // rjf: evaluate - E_Eval eval = zero_struct; - ProfScope("evaluate expression") - { - eval = e_eval_from_string(condition_n->string); - } - - // rjf: interpret evaluation - if(eval.code == E_InterpretationCode_Good && eval.value.u64 == 0) - { - hit_user_bp = 0; - hit_conditional_bp_but_filtered = 1; - log_infof("conditional_breakpoint_hit: 'condition eval'd to 0, and so filtered'\n"); - } - else - { - hit_user_bp = 1; - hit_conditional_bp_but_filtered = 0; - log_infof("conditional_breakpoint_hit: 'conditional eval'd to nonzero, hit'\n"); - break; - } - } - ctrl_thread__eval_scope_end(eval_scope); - } - - // rjf: gather trap net hits - ProfScope("gather trap net hits") - { - if(!hit_user_bp && dmn_handle_match(event->process, target_process.dmn_handle)) - { - for(CTRL_TrapNode *node = msg->traps.first; - node != 0; - node = node->next) - { - if(node->v.vaddr == event->instruction_pointer) - { - hit_trap_net_bp = 1; - hit_trap_flags |= node->v.flags; - } - } - } - } - - log_infof("user_breakpoint_hit: %i\n", hit_user_bp); - log_infof("entry_point_hit: %i\n", hit_entry); - temp_end(temp); - } - - //- rjf: hit conditional user bp but filtered -> single step - B32 cond_bp_single_step_stop = 0; - CTRL_EventCause cond_bp_single_step_stop_cause = CTRL_EventCause_Null; - if(hit_conditional_bp_but_filtered) LogInfoNamedBlockF("conditional_bp_hit_single_step") - { - DMN_Handle thread = event->thread; - U64 thread_pre_rip = dmn_rip_from_thread(thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 single_step_done = 0; !single_step_done;) - { - DMN_RunCtrls single_step_ctrls = {0}; - single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &thread; - single_step_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - single_step_ctrls.single_step_thread = thread; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: - case DMN_EventKind_Exception: - case DMN_EventKind_Halt: - case DMN_EventKind_Trap: - { - cond_bp_single_step_stop = 1; - single_step_done = 1; - use_stepping_logic = 0; - cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - case DMN_EventKind_SingleStep: - { - single_step_done = dmn_handle_match(event->thread, thread); - cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - } - } - } - - //- rjf: hit entry points on *any thread* cause a stop, if this msg says as such - B32 entry_stop = 0; - if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && hit_entry) - { - entry_stop = 1; - use_stepping_logic = 0; - } - - //- rjf: user breakpoints on *any thread* cause a stop - B32 user_bp_stop = 0; - if(!hard_stop && use_stepping_logic && hit_user_bp) - { - user_bp_stop = 1; - use_stepping_logic = 0; - } - - //- rjf: trap net on off-target threads are ignored - B32 step_past_trap_net = 0; - if(!hard_stop && use_stepping_logic && hit_trap_net_bp) - { - if(!dmn_handle_match(event->thread, target_thread.dmn_handle)) - { - step_past_trap_net = 1; - use_stepping_logic = 0; - } - } - - //- rjf: trap net on on-target threads trigger trap net logic - B32 use_trap_net_logic = 0; - if(!hard_stop && use_stepping_logic && hit_trap_net_bp) - { - if(dmn_handle_match(event->thread, target_thread.dmn_handle)) - { - use_trap_net_logic = 1; - } - } - - //- rjf: trap net logic: stack pointer check - B32 stack_pointer_matches = 0; - if(use_trap_net_logic) - { - U64 sp = dmn_rsp_from_thread(target_thread.dmn_handle); - stack_pointer_matches = (sp == sp_check_value); - } - - //- rjf: trap net logic: single step after hit - B32 single_step_stop = 0; - CTRL_EventCause single_step_stop_cause = CTRL_EventCause_Null; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & CTRL_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF("trap_net__single_step_after_hit") - { - U64 thread_pre_rip = dmn_rip_from_thread(target_thread.dmn_handle); - U64 thread_post_rip = thread_pre_rip; - for(B32 single_step_done = 0; single_step_done == 0;) - { - DMN_RunCtrls single_step_ctrls = {0}; - single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &target_thread.dmn_handle; - single_step_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - single_step_ctrls.single_step_thread = target_thread.dmn_handle; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(target_thread.dmn_handle); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: - case DMN_EventKind_Exception: - case DMN_EventKind_Halt: - case DMN_EventKind_Trap: - { - single_step_stop = 1; - single_step_done = 1; - use_stepping_logic = 0; - use_trap_net_logic = 0; - single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - case DMN_EventKind_SingleStep: - { - single_step_done = dmn_handle_match(event->thread, target_thread.dmn_handle); - single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - } - } - } - } - - //- rjf: trap net logic: begin spoof mode - B32 begin_spoof_mode = 0; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & CTRL_TrapFlag_BeginSpoofMode) LogInfoNamedBlockF("trap_net__begin_spoof_mode") - { - // rjf: setup spoof mode - begin_spoof_mode = 1; - U64 spoof_sp = dmn_rsp_from_thread(target_thread.dmn_handle); - spoof_mode = 1; - spoof.process = target_process.dmn_handle; - spoof.thread = target_thread.dmn_handle; - spoof.vaddr = spoof_sp; - spoof.new_ip_value = spoof_ip_vaddr; - log_infof("spoof:{process:[0x%I64x], thread:[0x%I64x], vaddr:0x%I64x, new_ip_value:0x%I64x}\n", spoof.process.u64[0], spoof.thread.u64[0], spoof.vaddr, spoof.new_ip_value); - } - } - - //- rjf: trap net logic: save stack pointer - B32 save_stack_pointer = 0; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & CTRL_TrapFlag_SaveStackPointer) - { - if(stack_pointer_matches) LogInfoNamedBlockF("trap_net__save_sp") - { - save_stack_pointer = 1; - sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle); - log_infof("sp_check_value = 0x%I64x\n", sp_check_value); - } - } - } - - //- rjf: trap net logic: end stepping - B32 trap_net_stop = 0; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & CTRL_TrapFlag_EndStepping) LogInfoNamedBlockF("trap_net__end_step") - { - if((hit_trap_flags & CTRL_TrapFlag_IgnoreStackPointerCheck) || - stack_pointer_matches) - { - trap_net_stop = 1; - use_trap_net_logic = 0; - } - } - } - - //} - // - //- rjf: stepping logic - //////////////////////////////// - - //- rjf: handle step past trap net - B32 step_past_trap_net_stop = 0; - CTRL_EventCause step_past_trap_net_stop_cause = CTRL_EventCause_Null; - if(step_past_trap_net) LogInfoNamedBlockF("trap_net__single_step_past_trap_net") - { - DMN_Handle thread = event->thread; - U64 thread_pre_rip = dmn_rip_from_thread(thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 single_step_done = 0; single_step_done == 0;) - { - DMN_RunCtrls single_step_ctrls = {0}; - single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &thread; - single_step_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - single_step_ctrls.single_step_thread = thread; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: - case DMN_EventKind_Exception: - case DMN_EventKind_Halt: - case DMN_EventKind_Trap: - { - step_past_trap_net_stop = 1; - single_step_done = 1; - step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - case DMN_EventKind_SingleStep: - { - single_step_done = dmn_handle_match(event->thread, thread); - step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); - }break; - } - } - } - - //- rjf: loop exit condition - CTRL_EventCause stage_stop_cause = CTRL_EventCause_Null; - if(hard_stop) - { - stage_stop_cause = hard_stop_cause; - } - else if(cond_bp_single_step_stop) - { - stage_stop_cause = cond_bp_single_step_stop_cause; - } - else if(single_step_stop) - { - stage_stop_cause = single_step_stop_cause; - } - else if(step_past_trap_net_stop) - { - stage_stop_cause = step_past_trap_net_stop_cause; - } - else if(exception_stop) - { - stage_stop_cause = CTRL_EventCause_InterruptedByException; - } - else if(user_bp_stop) - { - stage_stop_cause = CTRL_EventCause_UserBreakpoint; - } - else if(entry_stop) - { - stage_stop_cause = CTRL_EventCause_EntryPoint; - } - else if(trap_net_stop) - { - stage_stop_cause = CTRL_EventCause_Finished; - } - log_infof("stop_cause: %i\n", stage_stop_cause); - if(stage_stop_cause != CTRL_EventCause_Null) - { - stop_event = event; - stop_cause = stage_stop_cause; - break; - } - } - } - - ////////////////////////////// - //- rjf: record stop - // - if(stop_event != 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = stop_cause; - event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread); - event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process); - event->exception_code = stop_event->code; - event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind); - event->vaddr_rng = r1u64(stop_event->address, stop_event->address); - event->rip_vaddr = stop_event->instruction_pointer; - if(stop_cause == CTRL_EventCause_UserBreakpoint && stop_event->user_data != 0) - { - if(!(stop_event->user_data & bit64)) - { - CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)stop_event->user_data; - event->u64_code = user_bp->id; - } - } - ctrl_c2u_push_events(&evts); - } - - log_infof("}\n\n"); - scratch_end(scratch); - ProfEnd(); -} - -internal void -ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - //- rjf: record start - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Started; - ctrl_c2u_push_events(&evts); - } - - //- rjf: single step - DMN_Handle thread = msg->entity.dmn_handle; - B32 thread_is_valid = !dmn_handle_match(thread, dmn_handle_zero()); - DMN_Event *stop_event = 0; - CTRL_EventCause stop_cause = CTRL_EventCause_Null; - if(thread_is_valid) - { - U64 thread_pre_rip = dmn_rip_from_thread(thread); - U64 thread_post_rip = thread_pre_rip; - for(B32 done = 0; done == 0;) - { - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities = &thread; - run_ctrls.run_entity_count = 1; - if(thread_post_rip == thread_pre_rip) - { - run_ctrls.single_step_thread = msg->entity.dmn_handle; - } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(msg->entity.dmn_handle); - switch(event->kind) - { - default:{}break; - case DMN_EventKind_Error: {stop_cause = CTRL_EventCause_Error;}goto end_single_step; - case DMN_EventKind_Exception: {stop_cause = CTRL_EventCause_InterruptedByException;}goto end_single_step; - case DMN_EventKind_Halt: {stop_cause = CTRL_EventCause_InterruptedByHalt;}goto end_single_step; - case DMN_EventKind_Trap: {stop_cause = CTRL_EventCause_InterruptedByTrap;}goto end_single_step; - case DMN_EventKind_Breakpoint: {stop_cause = CTRL_EventCause_UserBreakpoint;}goto end_single_step; - case DMN_EventKind_SingleStep: {stop_cause = CTRL_EventCause_Finished;}goto end_single_step; - end_single_step: - { - stop_event = event; - done = 1; - }break; - } - } - } - - //- rjf: record stop - { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = stop_cause; - if(stop_event != 0) - { - event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread); - event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process); - event->exception_code = stop_event->code; - event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind); - event->vaddr_rng = r1u64(stop_event->address, stop_event->address); - event->rip_vaddr = stop_event->instruction_pointer; - } - ctrl_c2u_push_events(&evts); - } - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// -//~ rjf: Process Memory Artifact Cache Hooks / Lookups - -internal AC_Artifact -ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) -{ - AC_Artifact artifact = {0}; - { - //- rjf: unpack key - CTRL_Handle process = {0}; - Rng1U64 vaddr_range = {0}; - B32 zero_terminated = 0; - { - U64 key_read_off = 0; - key_read_off += str8_deserial_read_struct(key, key_read_off, &process); - key_read_off += str8_deserial_read_struct(key, key_read_off, &vaddr_range); - key_read_off += str8_deserial_read_struct(key, key_read_off, &zero_terminated); - } - - //- rjf: clamp vaddr range - Rng1U64 vaddr_range_clamped = vaddr_range; - { - vaddr_range_clamped.max = Max(vaddr_range_clamped.max, vaddr_range_clamped.min); - U64 max_size_cap = Min(max_U64-vaddr_range_clamped.min, GB(1)); - vaddr_range_clamped.max = Min(vaddr_range_clamped.max, vaddr_range_clamped.min+max_size_cap); - } - - //- rjf: do read - U64 range_size = dim_1u64(vaddr_range_clamped); - Arena *range_arena = 0; - void *range_base = 0; - U64 zero_terminated_size = 0; - U64 pre_read_mem_gen = ctrl_mem_gen(); - B32 pre_run_state = ins_atomic_u64_eval(&ctrl_state->ctrl_thread_run_state); - if(range_size != 0) - { - // rjf: set up arena - U64 page_size = os_get_system_info()->page_size; // TODO(rjf): @page_size_from_process - U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, page_size); - range_arena = arena_alloc(.reserve_size = range_size+ARENA_HEADER_SIZE, .commit_size = range_size+ARENA_HEADER_SIZE); - - // rjf: if we got an arena -> push buffer & read - if(range_arena != 0) - { - // rjf: read as much as possible - range_base = push_array_no_zero(range_arena, U8, range_size); - U64 bytes_read = 0; - U64 retry_count = 0; - U64 retry_limit = range_size > page_size ? 64 : 0; - for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped; - retry_count <= retry_limit; - retry_count += 1) - { - bytes_read = dmn_process_read(process.dmn_handle, vaddr_range_clamped_retry, range_base); - if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min) - { - U64 diff = (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2; - vaddr_range_clamped_retry.max -= diff; - vaddr_range_clamped_retry.max = AlignDownPow2(vaddr_range_clamped_retry.max, page_size); - if(diff == 0) - { - break; - } - } - else - { - break; - } - } - - // rjf: if we read nothing, release arena - if(bytes_read == 0) - { - arena_release(range_arena); - range_base = 0; - range_arena = 0; - } - - // rjf: if we only got a partial read, zero the rest - else if(bytes_read < range_size) - { - MemoryZero((U8 *)range_base + bytes_read, range_size-bytes_read); - } - - // rjf: determine final size; zero terminate if needed; pop any unneeded bytes if zero-terminating - zero_terminated_size = bytes_read; - if(zero_terminated && range_base != 0) - { - for(U64 idx = 0; idx < bytes_read; idx += 1) - { - if(((U8 *)range_base)[idx] == 0) - { - zero_terminated_size = idx; - break; - } - } - U64 bytes_overkill = (bytes_read - zero_terminated_size); - arena_pop(range_arena, bytes_overkill); - } - } - } - U64 post_read_mem_gen = ctrl_mem_gen(); - B32 post_run_state = ins_atomic_u64_eval(&ctrl_state->ctrl_thread_run_state); - - //- rjf: form content key - C_Key content_key = {0}; - { - content_key.id.u128[0] = u128_hash_from_str8(key); - } - - //- rjf: determine if we have any history for this key - B32 key_has_history = 0; - { - U128 last_hash = c_hash_from_key(content_key, 0); - if(!u128_match(last_hash, u128_zero())) - { - key_has_history = 1; - } - } - - //- rjf: read successful, OR we have no history -> submit to hash store - U128 hash = {0}; - if((zero_terminated_size > 0 || !key_has_history) && range_base != 0 && range_size != 0 && pre_read_mem_gen == post_read_mem_gen) - { - hash = c_submit_data(content_key, &range_arena, str8((U8 *)range_base, zero_terminated_size)); - gen_out[0] = pre_read_mem_gen; - } - - //- rjf: wakeup on new submissions - if(!u128_match(u128_zero(), hash)) - { - if(ctrl_state->wakeup_hook != 0) - { - ctrl_state->wakeup_hook(); - } - } - - //- rjf: always release leftover arenas - if(range_arena != 0) - { - arena_release(range_arena); - } - - //- rjf: retry on mem gen "tearing", and if the range is non-empty - if(pre_read_mem_gen != post_read_mem_gen && range_size != 0) - { - retry_out[0] = 1; - } - - //- rjf: bundle content key as artifact - StaticAssert(sizeof(content_key) == sizeof(artifact), artifact_key_size_check); - MemoryCopyStruct(&artifact, &content_key); - } - return artifact; -} - -internal void -ctrl_memory_artifact_destroy(AC_Artifact artifact) -{ - C_Key key = {0}; - MemoryCopyStruct(&key, &artifact); - c_close_key(key); -} - -internal C_Key -ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale) -{ - ProfBeginFunction(); -#pragma pack(push, 1) - struct - { - CTRL_Handle process; - Rng1U64 vaddr_range; - B32 zero_terminated; - } key_data = {process, vaddr_range, zero_terminated}; -#pragma pack(pop) - String8 key = str8_struct(&key_data); - Access *access = access_open(); - AC_Artifact artifact = ac_artifact_from_key(access, key, ctrl_memory_artifact_create, ctrl_memory_artifact_destroy, endt_us, - .flags = AC_Flag_HighPriority | (wait_for_fresh ? AC_Flag_WaitForFresh : 0), - .gen = ctrl_mem_gen(), - .slots_count = 2048, - .stale_out = out_is_stale, - .evict_threshold_us = 10000000); - C_Key content_key = {0}; - MemoryCopyStruct(&content_key, &artifact); - access_close(access); - ProfEnd(); - return content_key; -} - -//- rjf: process memory reading helpers - -internal CTRL_ProcessMemorySlice -ctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us) -{ - ProfBeginFunction(); - CTRL_ProcessMemorySlice result = {0}; - if(range.max > range.min && - dim_1u64(range) <= MB(256) && - range.min <= 0x000FFFFFFFFFFFFFull && - range.max <= 0x000FFFFFFFFFFFFFull) - { - Temp scratch = scratch_begin(&arena, 1); - Access *access = access_open(); - - //- rjf: unpack address range, prepare per-touched-page info - U64 page_size = KB(4); - Rng1U64 page_range = r1u64(AlignDownPow2(range.min, page_size), AlignPow2(range.max, page_size)); - U64 page_count = dim_1u64(page_range)/page_size; - U128 *page_hashes = push_array(scratch.arena, U128, page_count); - U128 *page_last_hashes = push_array(scratch.arena, U128, page_count); - - //- rjf: gather hashes & last-hashes for each page - ProfScope("gather hashes & last-hashes for each page") - { - for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) - { - U64 page_base_vaddr = page_range.min + page_idx*page_size; - B32 page_is_stale = 0; - C_Key page_key = ctrl_key_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, wait_for_fresh, endt_us, &page_is_stale); - U128 page_hash = c_hash_from_key(page_key, 0); - U128 page_last_hash = c_hash_from_key(page_key, 1); - result.stale = (result.stale || page_is_stale); - page_hashes[page_idx] = page_hash; - page_last_hashes[page_idx] = page_last_hash; - } - } - - //- rjf: setup output buffers - void *read_out = push_array(arena, U8, dim_1u64(range)); - U64 *byte_bad_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); - U64 *byte_changed_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); - - //- rjf: iterate pages, fill output - ProfScope("iterate pages, fill output") - { - U64 write_off = 0; - for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) - { - // rjf: read data for this page - String8 data = c_data_from_hash(access, page_hashes[page_idx]); - Rng1U64 data_vaddr_range = r1u64(page_range.min + page_idx*page_size, page_range.min + page_idx*page_size+data.size); - - // rjf: skip/chop bytes which are irrelevant for the actual requested read - String8 in_range_data = data; - if(page_idx == page_count-1 && data_vaddr_range.max > range.max) - { - in_range_data = str8_chop(in_range_data, data_vaddr_range.max-range.max); - } - if(page_idx == 0 && range.min > data_vaddr_range.min) - { - in_range_data = str8_skip(in_range_data, range.min-data_vaddr_range.min); - } - - // rjf: write this chunk - MemoryCopy((U8*)read_out+write_off, in_range_data.str, in_range_data.size); - - // rjf; if this page's data doesn't fill the entire range, mark - // missing bytes as bad - if(data.size < page_size) ProfScope("mark missing bytes as bad") - { - Rng1U64 invalid_range = r1u64(data_vaddr_range.min+data.size, data_vaddr_range.min + page_size); - Rng1U64 in_range_invalid_range = intersect_1u64(invalid_range, range); - for(U64 invalid_vaddr = in_range_invalid_range.min; - invalid_vaddr < in_range_invalid_range.max; - invalid_vaddr += 1) - { - U64 idx_in_range = invalid_vaddr - range.min; - byte_bad_flags[idx_in_range/64] |= (1ull<<(idx_in_range%64)); - } - } - - // rjf: if this page's hash & last_hash don't match, diff each byte & - // fill out changed flags - if(!u128_match(page_hashes[page_idx], page_last_hashes[page_idx])) ProfScope("hashes don't match; diff each byte") - { - String8 last_data = c_data_from_hash(access, page_last_hashes[page_idx]); - String8 in_range_last_data = last_data; - if(page_idx == page_count-1 && data_vaddr_range.max > range.max) - { - in_range_last_data = str8_chop(in_range_last_data, data_vaddr_range.max-range.max); - } - if(page_idx == 0 && range.min > data_vaddr_range.min) - { - in_range_last_data = str8_skip(in_range_last_data, range.min-data_vaddr_range.min); - } - for(U64 idx = 0; idx < in_range_data.size; idx += 1) - { - U8 last_byte = idx < in_range_last_data.size ? in_range_last_data.str[idx] : 0; - U8 now_byte = idx < in_range_data.size ? in_range_data.str[idx] : 0; - if(last_byte != now_byte) - { - U64 idx_in_read_out = write_off+idx; - byte_changed_flags[idx_in_read_out/64] |= (1ull<<(idx_in_read_out%64)); - } - } - } - - // rjf: increment past this chunk - U64 bytes_to_skip = page_size; - if(page_idx == 0 && range.min > data_vaddr_range.min) - { - bytes_to_skip -= (range.min-data_vaddr_range.min); - } - write_off += bytes_to_skip; - } - } - - //- rjf: fill result - result.data.str = (U8*)read_out; - result.data.size = dim_1u64(range); - result.byte_bad_flags = byte_bad_flags; - result.byte_changed_flags = byte_changed_flags; - if(byte_bad_flags != 0) - { - for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) - { - result.any_byte_bad = result.any_byte_bad || !!result.byte_bad_flags[idx]; - } - } - if(byte_changed_flags != 0) - { - for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) - { - result.any_byte_changed = result.any_byte_changed || !!result.byte_changed_flags[idx]; - } - } - - access_close(access); - scratch_end(scratch); - } - ProfEnd(); - return result; -} - -internal B32 -ctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us) -{ - Temp scratch = scratch_begin(0, 0); - U64 needed_size = dim_1u64(range); - CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, range, 0, endt_us); - B32 good = (slice.data.size >= needed_size && !slice.any_byte_bad); - if(good) - { - MemoryCopy(out, slice.data.str, needed_size); - } - if(slice.stale && is_stale_out) - { - *is_stale_out = 1; - } - scratch_end(scratch); - return good; -} - -//- rjf: process memory writing - -internal B32 -ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src) -{ - ProfBeginFunction(); - B32 result = dmn_process_write(process.dmn_handle, range, src); - - //- rjf: success -> bump generation - if(result) - { - ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); - } - - //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless - // writes within calling frame's "view" of the memory, at the expense of a small amount of - // time. - if(result) - { - U64 endt_us = os_now_microseconds()+10000; - U64 page_size = os_get_system_info()->page_size; // TODO(rjf): @page_size_from_process - Rng1U64 page_range = r1u64(range.min/page_size, (range.max+page_size-1)/page_size); - for EachInRange(page_idx, page_range) - { - Temp scratch = scratch_begin(0, 0); - CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); - scratch_end(scratch); - if(!slice.stale || os_now_microseconds() >= endt_us) - { - break; - } - } - } - - ProfEnd(); - return result; -} - -//////////////////////////////// -//~ rjf: Call Stack Artifact Cache Hooks / Lookups - -internal AC_Artifact -ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) -{ - AC_Artifact artifact = {0}; - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: unpack key - CTRL_Handle thread_handle = {0}; - str8_deserial_read_struct(key, 0, &thread_handle); - - //- rjf: produce mini entity context for just this call stack build - CTRL_EntityCtx *entity_ctx = push_array(scratch.arena, CTRL_EntityCtx, 1); - MutexScopeR(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) - { - CTRL_EntityCtx *src_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_EntityCtx *dst_ctx = entity_ctx; - { - dst_ctx->root = &ctrl_entity_nil; - dst_ctx->hash_slots_count = 1024; - dst_ctx->hash_slots = push_array(scratch.arena, CTRL_EntityHashSlot, dst_ctx->hash_slots_count); - MemoryCopyArray(dst_ctx->entity_kind_counts, src_ctx->entity_kind_counts); - MemoryCopyArray(dst_ctx->entity_kind_alloc_gens, src_ctx->entity_kind_alloc_gens); - } - CTRL_Entity *src_thread = ctrl_entity_from_handle(src_ctx, thread_handle); - CTRL_Entity *src_process = ctrl_process_from_entity(src_thread); - { - CTRL_EntityRec rec = {0}; - CTRL_Entity *dst_parent = &ctrl_entity_nil; - for(CTRL_Entity *src_e = src_process; src_e != &ctrl_entity_nil; src_e = rec.next) - { - rec = ctrl_entity_rec_depth_first_pre(src_e, src_process); - - // rjf: determine if we need this entity - B32 need_this_entity = (ctrl_handle_match(thread_handle, src_e->handle) || src_e->kind == CTRL_EntityKind_Module || src_e->kind == CTRL_EntityKind_Process || src_e->kind == CTRL_EntityKind_DebugInfoPath); - - // rjf: copy this entity - CTRL_Entity *dst_e = &ctrl_entity_nil; - if(need_this_entity) - { - dst_e = push_array(scratch.arena, CTRL_Entity, 1); - { - dst_e->first = dst_e->last = dst_e->next = dst_e->prev = &ctrl_entity_nil; - dst_e->parent = dst_parent; - dst_e->kind = src_e->kind; - dst_e->arch = src_e->arch; - dst_e->is_frozen = src_e->is_frozen; - dst_e->is_soloed = src_e->is_soloed; - dst_e->rgba = src_e->rgba; - dst_e->handle = src_e->handle; - dst_e->id = src_e->id; - dst_e->vaddr_range = src_e->vaddr_range; - dst_e->stack_base = src_e->stack_base; - dst_e->timestamp = src_e->timestamp; - dst_e->bp_flags = src_e->bp_flags; - dst_e->string = push_str8_copy(scratch.arena, src_e->string); - dst_e->tls_index = src_e->tls_index; - dst_e->tls_offset = src_e->tls_offset; - dst_e->target_os = src_e->target_os; - dst_e->tls_model = src_e->tls_model; - } - if(dst_parent == &ctrl_entity_nil) - { - dst_ctx->root = dst_e; - } - else - { - DLLPushBack_NPZ(&ctrl_entity_nil, dst_parent->first, dst_parent->last, dst_e, next, prev); - } - } - - // rjf: insert into hash map - if(dst_e != &ctrl_entity_nil) - { - U64 hash = ctrl_hash_from_handle(dst_e->handle); - U64 slot_idx = hash%dst_ctx->hash_slots_count; - CTRL_EntityHashSlot *slot = &dst_ctx->hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) - { - if(ctrl_handle_match(n->entity->handle, dst_e->handle)) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(scratch.arena, CTRL_EntityHashNode, 1); - MemoryZeroStruct(node); - DLLPushBack(slot->first, slot->last, node); - node->entity = dst_e; - } - } - - // rjf: push/pop - if(rec.push_count) - { - dst_parent = dst_e; - } - else for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1) - { - dst_parent = dst_parent->parent; - } - } - } - } - - //- rjf: compute call stack - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, thread_handle); - B32 good = 1; - B32 retry = 0; - Arena *arena = 0; - CTRL_CallStack *call_stack = 0; - if(thread != &ctrl_entity_nil) - { - good = 0; - arena = arena_alloc(); - call_stack = push_array(arena, CTRL_CallStack, 1); - CTRL_Entity *process = ctrl_process_from_entity(thread); - U64 pre_reg_gen = 0; - U64 post_reg_gen = 0; - U64 pre_mem_gen = 0; - U64 post_mem_gen = 0; - CTRL_Unwind unwind = {0}; - { - pre_reg_gen = ctrl_reg_gen(); - pre_mem_gen = ctrl_mem_gen(); - unwind = ctrl_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000); - if(!(unwind.flags & CTRL_UnwindFlag_Stale)) - { - good = 1; - call_stack[0] = ctrl_call_stack_from_unwind(arena, process, &unwind); - } - if(unwind.flags & CTRL_UnwindFlag_Stale) - { - retry = 1; - } - post_reg_gen = ctrl_reg_gen(); - post_mem_gen = ctrl_mem_gen(); - } - if(pre_reg_gen != post_reg_gen || pre_mem_gen != post_mem_gen) - { - good = 0; - retry = 1; - } - if(!good) - { - arena_release(arena); - } - } - - //- rjf: broadcast update - if(good && ctrl_state->wakeup_hook != 0) - { - ctrl_state->wakeup_hook(); - } - - //- rjf: bundle call stack as artifact - if(good) - { - artifact.u64[0] = (U64)arena; - artifact.u64[1] = (U64)call_stack; - } - - //- rjf: mark retry - retry_out[0] = retry; - - scratch_end(scratch); - } - return artifact; -} - -internal void -ctrl_call_stack_artifact_destroy(AC_Artifact artifact) -{ - Arena *arena = (Arena *)artifact.u64[0]; - if(arena != 0) - { - arena_release(arena); - } -} - -internal CTRL_CallStack -ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us) -{ - CTRL_CallStack result = {0}; - { - AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&thread_handle), ctrl_call_stack_artifact_create, ctrl_call_stack_artifact_destroy, endt_us, - .gen = ctrl_mem_gen() + ctrl_reg_gen(), - .evict_threshold_us = 10000000, - .flags = high_priority ? AC_Flag_HighPriority : 0); - if(artifact.u64[1] != 0) - { - MemoryCopyStruct(&result, (CTRL_CallStack *)artifact.u64[1]); - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups - -internal AC_Artifact -ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) -{ - Temp scratch = scratch_begin(0, 0); - Access *access = access_open(); - - //- rjf: gather list of all thread handles - U64 threads_count = 0; - CTRL_Handle *threads = 0; - CTRL_Handle *threads_processes = 0; - Arch *threads_arches = 0; - MutexScopeR(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) - { - CTRL_EntityCtx *ctx = &ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_EntityArray thread_entities = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread); - threads_count = thread_entities.count; - threads = push_array(scratch.arena, CTRL_Handle, threads_count); - threads_processes = push_array(scratch.arena, CTRL_Handle, threads_count); - threads_arches = push_array(scratch.arena, Arch, threads_count); - for EachIndex(idx, threads_count) - { - threads[idx] = thread_entities.v[idx]->handle; - threads_processes[idx] = thread_entities.v[idx]->parent->handle; - threads_arches[idx] = thread_entities.v[idx]->arch; - } - } - - //- rjf: gather all callstacks - B32 stale = 0; - U64 pre_mem_gen = ctrl_mem_gen(); - U64 pre_reg_gen = ctrl_reg_gen(); - CTRL_CallStack *call_stacks = push_array(scratch.arena, CTRL_CallStack, threads_count); - { - for EachIndex(idx, threads_count) - { - call_stacks[idx] = ctrl_call_stack_from_thread(access, threads[idx], 0, 0); - if(call_stacks[idx].concrete_frames_count == 0) - { - stale = 1; - break; - } - } - } - U64 post_mem_gen = ctrl_mem_gen(); - U64 post_reg_gen = ctrl_reg_gen(); - stale = (stale || pre_mem_gen != post_mem_gen || pre_reg_gen != post_reg_gen); - - //- rjf: build call stack tree - Arena *arena = 0; - CTRL_CallStackTree *tree = 0; - if(!stale) - { - U64 id_gen = 0; - arena = arena_alloc(); - tree = push_array(arena, CTRL_CallStackTree, 1); - tree->root = push_array(arena, CTRL_CallStackTreeNode, 1); - MemoryCopyStruct(tree->root, &ctrl_call_stack_tree_node_nil); - tree->root->id = id_gen; - tree->slots_count = Max(1, threads_count); - tree->slots = push_array(arena, CTRL_CallStackTreeNode *, tree->slots_count); - id_gen += 1; - for EachIndex(thread_idx, threads_count) - { - CTRL_Handle thread = threads[thread_idx]; - CTRL_Handle process = threads_processes[thread_idx]; - Arch arch = threads_arches[thread_idx]; - CTRL_CallStack call_stack = call_stacks[thread_idx]; - CTRL_CallStackTreeNode *thread_node = tree->root; - for EachIndex(frame_idx, call_stack.frames_count) - { - U64 vaddr = regs_rip_from_arch_block(arch, call_stack.frames[frame_idx].regs); - U64 depth = call_stack.frames[frame_idx].inline_depth; - CTRL_CallStackTreeNode *next_node = &ctrl_call_stack_tree_node_nil; - for(CTRL_CallStackTreeNode *child = thread_node->first; child != &ctrl_call_stack_tree_node_nil; child = child->next) - { - if(ctrl_handle_match(child->process, process) && child->vaddr == vaddr && child->depth == depth) - { - next_node = child; - break; - } - } - if(next_node == &ctrl_call_stack_tree_node_nil) - { - next_node = push_array(arena, CTRL_CallStackTreeNode, 1); - MemoryCopyStruct(next_node, &ctrl_call_stack_tree_node_nil); - next_node->id = id_gen; - SLLStackPush_N(tree->slots[next_node->id%tree->slots_count], next_node, hash_next); - id_gen += 1; - SLLQueuePush_NZ(&ctrl_call_stack_tree_node_nil, thread_node->first, thread_node->last, next_node, next); - next_node->parent = thread_node; - thread_node->child_count += 1; - } - thread_node = next_node; - } - ctrl_handle_list_push(arena, &thread_node->threads, &thread); - for(CTRL_CallStackTreeNode *n = thread_node; n != &ctrl_call_stack_tree_node_nil; n = n->parent) - { - n->all_descendant_threads_count += 1; - } - } - } - - //- rjf: produce artifact - AC_Artifact artifact = {0}; - { - artifact.u64[0] = (U64)arena; - artifact.u64[1] = (U64)tree; - } - - //- rjf: retry on stale - if(stale) - { - retry_out[0] = 1; - } - - access_close(access); - scratch_end(scratch); - return artifact; -} - -internal void -ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact) -{ - Arena *arena = (Arena *)artifact.u64[0]; - if(arena != 0) - { - arena_release(arena); - } -} - -internal CTRL_CallStackTree -ctrl_call_stack_tree(Access *access, U64 endt_us) -{ - CTRL_CallStackTree result = {&ctrl_call_stack_tree_node_nil}; - { - AC_Artifact artifact = ac_artifact_from_key(access, str8_zero(), ctrl_call_stack_tree_artifact_create, ctrl_call_stack_tree_artifact_destroy, endt_us); - if(artifact.u64[1] != 0) - { - MemoryCopyStruct(&result, (CTRL_CallStackTree *)artifact.u64[1]); - } - } - return result; -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Type Functions + +#if !defined(XXH_IMPLEMENTATION) +# define XXH_IMPLEMENTATION +# define XXH_STATIC_LINKING_ONLY +# include "third_party/xxHash/xxhash.h" +#endif + +internal U64 +ctrl_hash_from_string(String8 string) +{ + U64 result = XXH3_64bits_withSeed(string.str, string.size, 5381); + return result; +} + +internal U64 +ctrl_hash_from_handle(CTRL_Handle handle) +{ + U64 buf[] = {handle.machine_id, handle.dmn_handle.u64[0]}; + U64 hash = ctrl_hash_from_string(str8((U8 *)buf, sizeof(buf))); + return hash; +} + +internal CTRL_EventCause +ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) +{ + CTRL_EventCause cause = CTRL_EventCause_Null; + switch(event_kind) + { + default:{}break; + case DMN_EventKind_Error: {cause = CTRL_EventCause_Error;}break; + case DMN_EventKind_Exception:{cause = CTRL_EventCause_InterruptedByException;}break; + case DMN_EventKind_Trap: {cause = CTRL_EventCause_InterruptedByTrap;}break; + case DMN_EventKind_Halt: {cause = CTRL_EventCause_InterruptedByHalt;}break; + } + return cause; +} + +internal CTRL_ExceptionKind +ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind) +{ + CTRL_ExceptionKind result = CTRL_ExceptionKind_Null; + switch(kind) + { + default:{}break; + case DMN_ExceptionKind_MemoryRead: {result = CTRL_ExceptionKind_MemoryRead;}break; + case DMN_ExceptionKind_MemoryWrite: {result = CTRL_ExceptionKind_MemoryWrite;}break; + case DMN_ExceptionKind_MemoryExecute: {result = CTRL_ExceptionKind_MemoryExecute;}break; + case DMN_ExceptionKind_CppThrow: {result = CTRL_ExceptionKind_CppThrow;}break; + } + return result; +} + +internal CTRL_TlsModel +ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type) +{ + CTRL_TlsModel result = CTRL_TlsModel_Null; + switch(type) + { + default:{}break; + case DMN_TlsModel_Null: {result = CTRL_TlsModel_Null;}break; + case DMN_TlsModel_WinodwsNt: {result = CTRL_TlsModel_WinodwsNt;}break; + case DMN_TlsModel_Gnu: {result = CTRL_TlsModel_Gnu;}break; + } + return result; +} + +internal String8 +ctrl_string_from_event_kind(CTRL_EventKind kind) +{ + String8 result = {0}; + switch(kind) + { + default:{}break; + case CTRL_EventKind_Null: { result = str8_lit("Null");}break; + case CTRL_EventKind_Error: { result = str8_lit("Error");}break; + case CTRL_EventKind_Started: { result = str8_lit("Started");}break; + case CTRL_EventKind_Stopped: { result = str8_lit("Stopped");}break; + case CTRL_EventKind_NewProc: { result = str8_lit("NewProc");}break; + case CTRL_EventKind_NewThread: { result = str8_lit("NewThread");}break; + case CTRL_EventKind_NewModule: { result = str8_lit("NewModule");}break; + case CTRL_EventKind_EndProc: { result = str8_lit("EndProc");}break; + case CTRL_EventKind_EndThread: { result = str8_lit("EndThread");}break; + case CTRL_EventKind_EndModule: { result = str8_lit("EndModule");}break; + case CTRL_EventKind_ModuleDebugInfoPathChange: { result = str8_lit("ModuleDebugInfoPathChange");}break; + case CTRL_EventKind_DebugString: { result = str8_lit("DebugString");}break; + case CTRL_EventKind_ThreadName: { result = str8_lit("ThreadName");}break; + case CTRL_EventKind_MemReserve: { result = str8_lit("MemReserve");}break; + case CTRL_EventKind_MemCommit: { result = str8_lit("MemCommit");}break; + case CTRL_EventKind_MemDecommit: { result = str8_lit("MemDecommit");}break; + case CTRL_EventKind_MemRelease: { result = str8_lit("MemRelease");}break; + } + return result; +} + +internal String8 +ctrl_string_from_msg_kind(CTRL_MsgKind kind) +{ + String8 result = {0}; + switch(kind) + { + default:{}break; + case CTRL_MsgKind_Launch: {result = str8_lit("Launch");}break; + case CTRL_MsgKind_Attach: {result = str8_lit("Attach");}break; + case CTRL_MsgKind_Kill: {result = str8_lit("Kill");}break; + case CTRL_MsgKind_KillAll: {result = str8_lit("KillAll");}break; + case CTRL_MsgKind_Detach: {result = str8_lit("Detach");}break; + case CTRL_MsgKind_Run: {result = str8_lit("Run");}break; + case CTRL_MsgKind_SingleStep: {result = str8_lit("SingleStep");}break; + case CTRL_MsgKind_SetUserEntryPoints: {result = str8_lit("SetUserEntryPoints");}break; + case CTRL_MsgKind_SetModuleDebugInfoPath: {result = str8_lit("SetModuleDebugInfoPath");}break; + } + return result; +} + +internal CTRL_EntityKind +ctrl_entity_kind_from_string(String8 string) +{ + CTRL_EntityKind result = CTRL_EntityKind_Null; + for EachNonZeroEnumVal(CTRL_EntityKind, k) + { + if(str8_match(ctrl_entity_kind_code_name_table[k], string, 0)) + { + result = k; + break; + } + } + return result; +} + +internal DMN_TrapFlags +ctrl_dmn_trap_flags_from_user_breakpoint_flags(CTRL_UserBreakpointFlags flags) +{ + DMN_TrapFlags result = 0; + if(flags & CTRL_UserBreakpointFlag_BreakOnWrite) { result |= DMN_TrapFlag_BreakOnWrite; } + if(flags & CTRL_UserBreakpointFlag_BreakOnRead) { result |= DMN_TrapFlag_BreakOnRead; } + if(flags & CTRL_UserBreakpointFlag_BreakOnExecute) { result |= DMN_TrapFlag_BreakOnExecute; } + return result; +} + +internal CTRL_UserBreakpointFlags +ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags) +{ + CTRL_UserBreakpointFlags result = 0; + if(flags & DMN_TrapFlag_BreakOnWrite) { result |= CTRL_UserBreakpointFlag_BreakOnWrite; } + if(flags & DMN_TrapFlag_BreakOnRead) { result |= CTRL_UserBreakpointFlag_BreakOnRead; } + if(flags & DMN_TrapFlag_BreakOnExecute) { result |= CTRL_UserBreakpointFlag_BreakOnExecute; } + return result; +} + +//////////////////////////////// +//~ rjf: Machine/Handle Pair Type Functions + +internal CTRL_Handle +ctrl_handle_zero(void) +{ + CTRL_Handle handle = {0}; + return handle; +} + +internal CTRL_Handle +ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle) +{ + CTRL_Handle handle = {machine_id, dmn_handle}; + return handle; +} + +internal B32 +ctrl_handle_match(CTRL_Handle a, CTRL_Handle b) +{ + B32 result = (a.machine_id == b.machine_id && + dmn_handle_match(a.dmn_handle, b.dmn_handle)); + return result; +} + +internal void +ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair) +{ + CTRL_HandleNode *n = push_array(arena, CTRL_HandleNode, 1); + MemoryCopyStruct(&n->v, pair); + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal CTRL_HandleList +ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src) +{ + CTRL_HandleList dst = {0}; + for(CTRL_HandleNode *n = src->first; n != 0; n = n->next) + { + ctrl_handle_list_push(arena, &dst, &n->v); + } + return dst; +} + +internal CTRL_HandleArray +ctrl_handle_array_from_list(Arena *arena, CTRL_HandleList *src) +{ + CTRL_HandleArray array = {0}; + array.count = src->count; + array.v = push_array_no_zero(arena, CTRL_Handle, array.count); + { + U64 idx = 0; + for(CTRL_HandleNode *n = src->first; n != 0; n = n->next, idx += 1) + { + array.v[idx] = n->v; + } + } + return array; +} + +internal String8 +ctrl_string_from_handle(Arena *arena, CTRL_Handle handle) +{ + String8 result = push_str8f(arena, "$%I64x$%I64x", handle.machine_id, handle.dmn_handle.u64[0]); + return result; +} + +internal CTRL_Handle +ctrl_handle_from_string(String8 string) +{ + CTRL_Handle handle = {0}; + { + Temp scratch = scratch_begin(0, 0); + U8 split = '$'; + String8List parts = str8_split(scratch.arena, string, &split, 1, 0); + if(parts.first && parts.first->next) + { + CTRL_MachineID machine_id = u64_from_str8(parts.first->string, 16); + DMN_Handle dmn_handle = {0}; + dmn_handle.u64[0] = u64_from_str8(parts.first->next->string, 16); + handle.machine_id = machine_id; + handle.dmn_handle = dmn_handle; + } + scratch_end(scratch); + } + return handle; +} + +//////////////////////////////// +//~ rjf: Trap Type Functions + +internal void +ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap) +{ + CTRL_TrapNode *node = push_array(arena, CTRL_TrapNode, 1); + MemoryCopyStruct(&node->v, trap); + SLLQueuePush(list->first, list->last, node); + list->count += 1; +} + +internal CTRL_TrapList +ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src) +{ + CTRL_TrapList dst = {0}; + for(CTRL_TrapNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + ctrl_trap_list_push(arena, &dst, &src_n->v); + } + return dst; +} + +//////////////////////////////// +//~ rjf: User Breakpoint Type Functions + +internal void +ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp) +{ + CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); + MemoryCopyStruct(&n->v, bp); + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal CTRL_UserBreakpointList +ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src) +{ + CTRL_UserBreakpointList dst = {0}; + for(CTRL_UserBreakpointNode *src_n = src->first; src_n != 0; src_n = src_n->next) + { + CTRL_UserBreakpoint dst_bp = zero_struct; + MemoryCopyStruct(&dst_bp, &src_n->v); + dst_bp.string = push_str8_copy(arena, src_n->v.string); + dst_bp.condition = push_str8_copy(arena, src_n->v.condition); + ctrl_user_breakpoint_list_push(arena, &dst, &dst_bp); + } + return dst; +} + +//////////////////////////////// +//~ rjf: Message Type Functions + +//- rjf: deep copying + +internal void +ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src) +{ + MemoryCopyStruct(dst, src); + dst->path = push_str8_copy(arena, src->path); + dst->entry_points = str8_list_copy(arena, &src->entry_points); + dst->cmd_line_string_list = str8_list_copy(arena, &src->cmd_line_string_list); + dst->env_string_list = str8_list_copy(arena, &src->env_string_list); + dst->traps = ctrl_trap_list_copy(arena, &src->traps); + dst->user_bps = ctrl_user_breakpoint_list_copy(arena, &src->user_bps); +} + +//- rjf: list building + +internal CTRL_Msg * +ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list) +{ + CTRL_MsgNode *n = push_array(arena, CTRL_MsgNode, 1); + SLLQueuePush(list->first, list->last, n); + list->count += 1; + CTRL_Msg *msg = &n->v; + return msg; +} + +internal CTRL_MsgList +ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src) +{ + CTRL_MsgList dst = {0}; + for(CTRL_MsgNode *n = src->first; n != 0; n = n->next) + { + CTRL_Msg *src_msg = &n->v; + CTRL_Msg *dst_msg = ctrl_msg_list_push(arena, &dst); + ctrl_msg_deep_copy(arena, dst_msg, src_msg); + } + return dst; +} + +internal void +ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src) +{ + if(dst->last && src->first) + { + dst->last->next = src->first; + dst->last = src->last; + dst->count += src->count; + } + else if(src->first) + { + MemoryCopyStruct(dst, src); + } + MemoryZeroStruct(src); +} + +//- rjf: serialization + +internal String8 +ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List msgs_srlzed = {0}; + str8_serial_begin(scratch.arena, &msgs_srlzed); + { + // rjf: write message count + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msgs->count); + + // rjf: write all message data + for(CTRL_MsgNode *msg_n = msgs->first; msg_n != 0; msg_n = msg_n->next) + { + CTRL_Msg *msg = &msg_n->v; + + // rjf: write flat parts + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->kind); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->run_flags); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->msg_id); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->parent); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity_id); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->exit_code); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_inherit); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->debug_subprocesses); + str8_serial_push_array (scratch.arena, &msgs_srlzed, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); + + // rjf: write path string + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->path.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, msg->path.str, msg->path.size); + + // rjf: write entry point string list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entry_points.node_count); + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); + } + + // rjf: write command line string list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->cmd_line_string_list.node_count); + for(String8Node *n = msg->cmd_line_string_list.first; n != 0; n = n->next) + { + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); + } + + // rjf: write environment string list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_string_list.node_count); + for(String8Node *n = msg->env_string_list.first; n != 0; n = n->next) + { + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size); + } + + // rjf: write stdout/stderr/stdin paths + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdout_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdout_path); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stderr_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stderr_path); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdin_path.size); + str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdin_path); + + // rjf: write trap list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->traps.count); + for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) + { + CTRL_Trap *trap = &n->v; + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->flags); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->vaddr); + } + + // rjf: write user breakpoint list + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->user_bps.count); + for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) + { + CTRL_UserBreakpoint *bp = &n->v; + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->kind); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->flags); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->id); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->string.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->string.str, bp->string.size); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->pt); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->size); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->condition.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->condition.str, bp->condition.size); + } + } + } + String8 string = str8_serial_end(arena, &msgs_srlzed); + scratch_end(scratch); + return string; +} + +internal CTRL_MsgList +ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) +{ + CTRL_MsgList msgs = {0}; + { + U64 read_off = 0; + + // rjf: read message count + U64 msg_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &msg_count); + + // rjf: read data for all messages + for(U64 msg_idx = 0; msg_idx < msg_count; msg_idx += 1) + { + // rjf: construct message + CTRL_MsgNode *msg_node = push_array(arena, CTRL_MsgNode, 1); + SLLQueuePush(msgs.first, msgs.last, msg_node); + msgs.count += 1; + CTRL_Msg *msg = &msg_node->v; + + // rjf: read flat data + read_off += str8_deserial_read_struct(string, read_off, &msg->kind); + read_off += str8_deserial_read_struct(string, read_off, &msg->run_flags); + read_off += str8_deserial_read_struct(string, read_off, &msg->msg_id); + read_off += str8_deserial_read_struct(string, read_off, &msg->entity); + read_off += str8_deserial_read_struct(string, read_off, &msg->parent); + read_off += str8_deserial_read_struct(string, read_off, &msg->entity_id); + read_off += str8_deserial_read_struct(string, read_off, &msg->exit_code); + read_off += str8_deserial_read_struct(string, read_off, &msg->env_inherit); + read_off += str8_deserial_read_struct(string, read_off, &msg->debug_subprocesses); + read_off += str8_deserial_read_array (string, read_off, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); + + // rjf: read path string + read_off += str8_deserial_read_struct(string, read_off, &msg->path.size); + msg->path.str = push_array_no_zero(arena, U8, msg->path.size); + read_off += str8_deserial_read(string, read_off, msg->path.str, msg->path.size, 1); + + // rjf: read entry point string list + U64 entry_point_list_string_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &entry_point_list_string_count); + for(U64 idx = 0; idx < entry_point_list_string_count; idx += 1) + { + String8 str = {0}; + read_off += str8_deserial_read_struct(string, read_off, &str.size); + str.str = push_array_no_zero(arena, U8, str.size); + read_off += str8_deserial_read(string, read_off, str.str, str.size, 1); + str8_list_push(arena, &msg->entry_points, str); + } + + // rjf: read command line string list + U64 cmd_line_string_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &cmd_line_string_count); + for(U64 idx = 0; idx < cmd_line_string_count; idx += 1) + { + String8 cmd_line_str = {0}; + read_off += str8_deserial_read_struct(string, read_off, &cmd_line_str.size); + cmd_line_str.str = push_array_no_zero(arena, U8, cmd_line_str.size); + read_off += str8_deserial_read(string, read_off, cmd_line_str.str, cmd_line_str.size, 1); + str8_list_push(arena, &msg->cmd_line_string_list, cmd_line_str); + } + + // rjf: read environment string list + U64 env_string_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &env_string_count); + for(U64 idx = 0; idx < env_string_count; idx += 1) + { + String8 env_str = {0}; + read_off += str8_deserial_read_struct(string, read_off, &env_str.size); + env_str.str = push_array_no_zero(arena, U8, env_str.size); + read_off += str8_deserial_read(string, read_off, env_str.str, env_str.size, 1); + str8_list_push(arena, &msg->env_string_list, env_str); + } + + // rjf: read stdout/stderr/stdin paths + read_off += str8_deserial_read_struct(string, read_off, &msg->stdout_path.size); + msg->stdout_path.str = push_array(arena, U8, msg->stdout_path.size); + read_off += str8_deserial_read(string, read_off, msg->stdout_path.str, msg->stdout_path.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &msg->stderr_path.size); + msg->stderr_path.str = push_array(arena, U8, msg->stderr_path.size); + read_off += str8_deserial_read(string, read_off, msg->stderr_path.str, msg->stderr_path.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &msg->stdin_path.size); + msg->stdin_path.str = push_array(arena, U8, msg->stdin_path.size); + read_off += str8_deserial_read(string, read_off, msg->stdin_path.str, msg->stdin_path.size, 1); + + // rjf: read trap list + U64 trap_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &trap_count); + for(U64 idx = 0; idx < trap_count; idx += 1) + { + CTRL_TrapNode *n = push_array(arena, CTRL_TrapNode, 1); + SLLQueuePush(msg->traps.first, msg->traps.last, n); + msg->traps.count += 1; + CTRL_Trap *trap = &n->v; + read_off += str8_deserial_read_struct(string, read_off, &trap->flags); + read_off += str8_deserial_read_struct(string, read_off, &trap->vaddr); + } + + // rjf: read user breakpoint list + U64 user_bp_count = 0; + read_off += str8_deserial_read_struct(string, read_off, &user_bp_count); + for(U64 idx = 0; idx < user_bp_count; idx += 1) + { + CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); + SLLQueuePush(msg->user_bps.first, msg->user_bps.last, n); + msg->user_bps.count += 1; + CTRL_UserBreakpoint *bp = &n->v; + read_off += str8_deserial_read_struct(string, read_off, &bp->kind); + read_off += str8_deserial_read_struct(string, read_off, &bp->flags); + read_off += str8_deserial_read_struct(string, read_off, &bp->id); + read_off += str8_deserial_read_struct(string, read_off, &bp->string.size); + bp->string.str = push_array_no_zero(arena, U8, bp->string.size); + read_off += str8_deserial_read(string, read_off, bp->string.str, bp->string.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &bp->pt); + read_off += str8_deserial_read_struct(string, read_off, &bp->size); + read_off += str8_deserial_read_struct(string, read_off, &bp->condition.size); + bp->condition.str = push_array_no_zero(arena, U8, bp->condition.size); + read_off += str8_deserial_read(string, read_off, bp->condition.str, bp->condition.size, 1); + } + } + } + return msgs; +} + +//////////////////////////////// +//~ rjf: Event Type Functions + +//- rjf: list building + +internal CTRL_Event * +ctrl_event_list_push(Arena *arena, CTRL_EventList *list) +{ + CTRL_EventNode *n = push_array(arena, CTRL_EventNode, 1); + SLLQueuePush(list->first, list->last, n); + list->count += 1; + CTRL_Event *event = &n->v; + return event; +} + +internal void +ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push) +{ + if(dst->last == 0) + { + MemoryCopyStruct(dst, to_push); + } + else if(to_push->first != 0) + { + dst->last->next = to_push->first; + dst->last = to_push->last; + dst->count += to_push->count; + } + MemoryZeroStruct(to_push); +} + +//- rjf: serialization + +internal String8 +ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + { + str8_serial_push_struct(scratch.arena, &srl, &event->kind); + str8_serial_push_struct(scratch.arena, &srl, &event->cause); + str8_serial_push_struct(scratch.arena, &srl, &event->exception_kind); + str8_serial_push_struct(scratch.arena, &srl, &event->msg_id); + str8_serial_push_struct(scratch.arena, &srl, &event->entity); + str8_serial_push_struct(scratch.arena, &srl, &event->parent); + str8_serial_push_struct(scratch.arena, &srl, &event->arch); + str8_serial_push_struct(scratch.arena, &srl, &event->u64_code); + str8_serial_push_struct(scratch.arena, &srl, &event->entity_id); + str8_serial_push_struct(scratch.arena, &srl, &event->vaddr_rng); + str8_serial_push_struct(scratch.arena, &srl, &event->rip_vaddr); + str8_serial_push_struct(scratch.arena, &srl, &event->stack_base); + str8_serial_push_struct(scratch.arena, &srl, &event->tls_root); + str8_serial_push_struct(scratch.arena, &srl, &event->timestamp); + str8_serial_push_struct(scratch.arena, &srl, &event->exception_code); + str8_serial_push_struct(scratch.arena, &srl, &event->rgba); + str8_serial_push_struct(scratch.arena, &srl, &event->bp_flags); + str8_serial_push_struct(scratch.arena, &srl, &event->target_os); + str8_serial_push_struct(scratch.arena, &srl, &event->tls_model); + str8_serial_push_struct(scratch.arena, &srl, &event->tls_index); + str8_serial_push_struct(scratch.arena, &srl, &event->tls_offset); + String8 string = event->string; + string.size = Min(string.size, max-srl.total_size); + str8_serial_push_struct(scratch.arena, &srl, &string.size); + str8_serial_push_data(scratch.arena, &srl, string.str, string.size); + } + String8 string = str8_serial_end(arena, &srl); + scratch_end(scratch); + return string; +} + +internal CTRL_Event +ctrl_event_from_serialized_string(Arena *arena, String8 string) +{ + CTRL_Event event = zero_struct; + { + U64 read_off = 0; + read_off += str8_deserial_read_struct(string, read_off, &event.kind); + read_off += str8_deserial_read_struct(string, read_off, &event.cause); + read_off += str8_deserial_read_struct(string, read_off, &event.exception_kind); + read_off += str8_deserial_read_struct(string, read_off, &event.msg_id); + read_off += str8_deserial_read_struct(string, read_off, &event.entity); + read_off += str8_deserial_read_struct(string, read_off, &event.parent); + read_off += str8_deserial_read_struct(string, read_off, &event.arch); + read_off += str8_deserial_read_struct(string, read_off, &event.u64_code); + read_off += str8_deserial_read_struct(string, read_off, &event.entity_id); + read_off += str8_deserial_read_struct(string, read_off, &event.vaddr_rng); + read_off += str8_deserial_read_struct(string, read_off, &event.rip_vaddr); + read_off += str8_deserial_read_struct(string, read_off, &event.stack_base); + read_off += str8_deserial_read_struct(string, read_off, &event.tls_root); + read_off += str8_deserial_read_struct(string, read_off, &event.timestamp); + read_off += str8_deserial_read_struct(string, read_off, &event.exception_code); + read_off += str8_deserial_read_struct(string, read_off, &event.rgba); + read_off += str8_deserial_read_struct(string, read_off, &event.bp_flags); + read_off += str8_deserial_read_struct(string, read_off, &event.target_os); + read_off += str8_deserial_read_struct(string, read_off, &event.tls_model); + read_off += str8_deserial_read_struct(string, read_off, &event.tls_index); + read_off += str8_deserial_read_struct(string, read_off, &event.tls_offset); + read_off += str8_deserial_read_struct(string, read_off, &event.string.size); + event.string.str = push_array_no_zero(arena, U8, event.string.size); + read_off += str8_deserial_read(string, read_off, event.string.str, event.string.size, 1); + } + return event; +} + +//////////////////////////////// +//~ rjf: Entity Type Functions + +//- rjf: entity list data structures + +internal void +ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity) +{ + CTRL_EntityNode *n = push_array(arena, CTRL_EntityNode, 1); + n->v = entity; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal CTRL_EntityList +ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_HandleList *list) +{ + CTRL_EntityList result = {0}; + for(CTRL_HandleNode *n = list->first; n != 0; n = n->next) + { + CTRL_Entity *entity = ctrl_entity_from_handle(ctx, n->v); + ctrl_entity_list_push(arena, &result, entity); + } + return result; +} + +//- rjf: entity array data structure + +internal CTRL_EntityArray +ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list) +{ + CTRL_EntityArray result = {0}; + result.count = list->count; + result.v = push_array_no_zero(arena, CTRL_Entity *, result.count); + U64 idx = 0; + for(CTRL_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) + { + result.v[idx] = n->v; + } + return result; +} + +//- rjf: entity context (entity group read-only) functions + +internal CTRL_Entity * +ctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + if(!ctrl_handle_match(handle, ctrl_handle_zero())) + { + U64 hash = ctrl_hash_from_handle(handle); + U64 slot_idx = hash%ctx->hash_slots_count; + CTRL_EntityHashSlot *slot = &ctx->hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->entity->handle, handle)) + { + entity = n->entity; + break; + } + } + } + return entity; +} + +internal CTRL_Entity * +ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind) +{ + CTRL_Entity *result = &ctrl_entity_nil; + for(CTRL_Entity *child = parent->first; + child != &ctrl_entity_nil; + child = child->next) + { + if(child->kind == kind) + { + result = child; + break; + } + } + return result; +} + +internal CTRL_Entity * +ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind) +{ + CTRL_Entity *result = &ctrl_entity_nil; + for(CTRL_Entity *p = entity->parent; p != &ctrl_entity_nil; p = p->parent) + { + if(p->kind == kind) + { + result = p; + break; + } + } + return result; +} + +internal CTRL_Entity * +ctrl_process_from_entity(CTRL_Entity *entity) +{ + CTRL_Entity *result = &ctrl_entity_nil; + if(entity->kind == CTRL_EntityKind_Process) + { + result = entity; + } + else + { + result = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + } + return result; +} + +internal CTRL_Entity * +ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr) +{ + CTRL_Entity *result = &ctrl_entity_nil; + for(CTRL_Entity *child = process->first; + child != &ctrl_entity_nil; + child = child->next) + { + if(child->kind == CTRL_EntityKind_Module && contains_1u64(child->vaddr_range, vaddr)) + { + result = child; + break; + } + } + return result; +} + +internal DI_Key +ctrl_dbgi_key_from_module(CTRL_Entity *module) +{ + CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + DI_Key dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); + return dbgi_key; +} + +internal CTRL_Entity * +ctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTRL_EntityList *candidates) +{ + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + U64 thread_rip_vaddr = ctrl_rip_from_thread(ctx, thread->handle); + CTRL_Entity *src_module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + CTRL_Entity *module = &ctrl_entity_nil; + for(CTRL_EntityNode *n = candidates->first; n != 0; n = n->next) + { + CTRL_Entity *candidate_module = n->v; + CTRL_Entity *candidate_process = ctrl_entity_ancestor_from_kind(candidate_module, CTRL_EntityKind_Process); + if(candidate_process == process) + { + module = candidate_module; + } + if(candidate_module == src_module) + { + break; + } + } + return module; +} + +internal U64 +ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff) +{ + U64 result = voff + module->vaddr_range.min; + return result; +} + +internal U64 +ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr) +{ + U64 result = vaddr - module->vaddr_range.min; + return result; +} + +internal Rng1U64 +ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range) +{ + U64 dim = dim_1u64(voff_range); + U64 min = ctrl_vaddr_from_voff(module, voff_range.min); + Rng1U64 result = {min, min+dim}; + return result; +} + +internal Rng1U64 +ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range) +{ + U64 dim = dim_1u64(vaddr_range); + U64 min = ctrl_voff_from_vaddr(module, vaddr_range.min); + Rng1U64 result = {min, min+dim}; + return result; +} + +internal B32 +ctrl_entity_tree_is_frozen(CTRL_Entity *root) +{ + B32 is_frozen = 1; + for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) + { + if(e->kind == CTRL_EntityKind_Thread && !e->is_frozen) + { + is_frozen = 0; + break; + } + } + return is_frozen; +} + +//- rjf: entity ctx r/w store state functions + +internal CTRL_EntityCtxRWStore * +ctrl_entity_ctx_rw_store_alloc(void) +{ + Arena *arena = arena_alloc(); + CTRL_EntityCtxRWStore *store = push_array(arena, CTRL_EntityCtxRWStore, 1); + store->arena = arena; + store->ctx.hash_slots_count = 1024; + store->ctx.hash_slots = push_array(arena, CTRL_EntityHashSlot, store->ctx.hash_slots_count); + CTRL_Entity *root = store->ctx.root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Arch_Null, ctrl_handle_zero(), 0); + CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, Arch_CURRENT, ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero()), 0); + Temp scratch = scratch_begin(0, 0); + String8 local_machine_name = push_str8f(scratch.arena, "This PC (%S)", os_get_system_info()->machine_name); + ctrl_entity_equip_string(store, local_machine, local_machine_name); + scratch_end(scratch); + return store; +} + +internal void +ctrl_entity_ctx_rw_store_release(CTRL_EntityCtxRWStore *store) +{ + arena_release(store->arena); +} + +//- rjf: string allocation/deletion + +internal U64 +ctrl_name_bucket_num_from_string_size(U64 size) +{ + U64 bucket_num = 0; + if(size > 0) + { + for EachElement(idx, ctrl_entity_string_bucket_chunk_sizes) + { + if(size <= ctrl_entity_string_bucket_chunk_sizes[idx]) + { + bucket_num = idx+1; + break; + } + } + } + return bucket_num; +} + +internal String8 +ctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string) +{ + //- rjf: allocate node + CTRL_EntityStringChunkNode *node = 0; + { + U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size); + if(bucket_num == ArrayCount(ctrl_entity_string_bucket_chunk_sizes)) + { + CTRL_EntityStringChunkNode *best_node = 0; + CTRL_EntityStringChunkNode *best_node_prev = 0; + U64 best_node_size = max_U64; + { + for(CTRL_EntityStringChunkNode *n = store->free_string_chunks[bucket_num-1], *prev = 0; n != 0; (prev = n, n = n->next)) + { + if(n->size >= string.size && n->size < best_node_size) + { + best_node = n; + best_node_prev = prev; + best_node_size = n->size; + } + } + } + if(best_node != 0) + { + node = best_node; + if(best_node_prev) + { + best_node_prev->next = best_node->next; + } + else + { + store->free_string_chunks[bucket_num-1] = best_node->next; + } + } + else + { + U64 chunk_size = u64_up_to_pow2(string.size); + node = (CTRL_EntityStringChunkNode *)push_array(store->arena, U8, chunk_size); + } + } + else if(bucket_num != 0) + { + node = store->free_string_chunks[bucket_num-1]; + if(node != 0) + { + SLLStackPop(store->free_string_chunks[bucket_num-1]); + } + else + { + node = (CTRL_EntityStringChunkNode *)push_array(store->arena, U8, ctrl_entity_string_bucket_chunk_sizes[bucket_num-1]); + } + } + } + + //- rjf: fill node + String8 result = {0}; + if(node != 0) + { + result.str = (U8 *)node; + result.size = string.size; + MemoryCopy(result.str, string.str, result.size); + } + return result; +} + +internal void +ctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string) +{ + U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size); + if(1 <= bucket_num && bucket_num <= ArrayCount(ctrl_entity_string_bucket_chunk_sizes)) + { + U64 bucket_idx = bucket_num-1; + CTRL_EntityStringChunkNode *node = (CTRL_EntityStringChunkNode *)string.str; + SLLStackPush(store->free_string_chunks[bucket_idx], node); + node->size = u64_up_to_pow2(string.size); + } +} + +//- rjf: entity construction/deletion + +internal CTRL_Entity * +ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id) +{ + CTRL_Entity *entity = &ctrl_entity_nil; + { + // rjf: allocate + entity = store->free; + { + if(entity != 0) + { + SLLStackPop(store->free); + } + else + { + entity = push_array_no_zero(store->arena, CTRL_Entity, 1); + } + MemoryZeroStruct(entity); + } + + // rjf: fill + { + entity->kind = kind; + entity->arch = arch; + entity->handle = handle; + entity->id = id; + entity->parent = parent; + entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; + if(parent != &ctrl_entity_nil) + { + DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); + } + } + + // rjf: insert into hash map + { + U64 hash = ctrl_hash_from_handle(handle); + U64 slot_idx = hash%store->ctx.hash_slots_count; + CTRL_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->entity->handle, handle)) + { + node = n; + break; + } + } + if(node == 0) + { + node = store->hash_node_free; + if(node != 0) + { + SLLStackPop(store->hash_node_free); + } + else + { + node = push_array_no_zero(store->arena, CTRL_EntityHashNode, 1); + } + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->entity = entity; + } + } + + // rjf: bump counters + store->ctx.entity_kind_counts[kind] += 1; + store->ctx.entity_kind_alloc_gens[kind] += 1; + } + return entity; +} + +internal void +ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity) +{ + // rjf: unhook root + if(entity->parent != &ctrl_entity_nil) + { + DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + } + + // rjf: walk every entity in this tree, free each + if(entity != &ctrl_entity_nil) + { + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + CTRL_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *t = first_task; t != 0; t = t->next) + { + for(CTRL_Entity *child = t->e->first; child != &ctrl_entity_nil; child = child->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + + // rjf: free entity + SLLStackPush(store->free, t->e); + + // rjf: remove from hash map + { + U64 hash = ctrl_hash_from_handle(t->e->handle); + U64 slot_idx = hash%store->ctx.hash_slots_count; + CTRL_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->entity->handle, t->e->handle)) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(store->hash_node_free, n); + break; + } + } + } + + // rjf: dec counter + store->ctx.entity_kind_counts[t->e->kind] -= 1; + store->ctx.entity_kind_alloc_gens[t->e->kind] += 1; + } + scratch_end(scratch); + } +} + +//- rjf: entity equipment + +internal void +ctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, String8 string) +{ + if(entity->string.size != 0) + { + ctrl_entity_string_release(store, entity->string); + } + entity->string = ctrl_entity_string_alloc(store, string); +} + +//- rjf: accelerated entity context lookups + +internal CTRL_EntityCtxLookupAccel * +ctrl_thread_entity_ctx_lookup_accel(void) +{ + if(ctrl_entity_ctx_lookup_accel == 0) + { + Arena *arena = arena_alloc(); + ctrl_entity_ctx_lookup_accel = push_array(arena, CTRL_EntityCtxLookupAccel, 1); + ctrl_entity_ctx_lookup_accel->arena = arena; + for EachEnumVal(CTRL_EntityKind, k) + { + ctrl_entity_ctx_lookup_accel->entity_kind_arrays_arenas[k] = arena_alloc(); + } + } + return ctrl_entity_ctx_lookup_accel; +} + +internal CTRL_EntityArray +ctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind) +{ + CTRL_EntityCtxLookupAccel *accel = ctrl_thread_entity_ctx_lookup_accel(); + if(accel->entity_kind_arrays_gens[kind] != ctx->entity_kind_alloc_gens[kind]) + { + Temp scratch = scratch_begin(0, 0); + CTRL_EntityList entities = {0}; + for(CTRL_Entity *e = ctx->root; + e != &ctrl_entity_nil; + e = ctrl_entity_rec_depth_first_pre(e, ctx->root).next) + { + if(e->kind == kind) + { + ctrl_entity_list_push(scratch.arena, &entities, e); + } + } + accel->entity_kind_arrays_gens[kind] = ctx->entity_kind_alloc_gens[kind]; + arena_clear(accel->entity_kind_arrays_arenas[kind]); + accel->entity_kind_arrays[kind] = ctrl_entity_array_from_list(accel->entity_kind_arrays_arenas[kind], &entities); + scratch_end(scratch); + } + return accel->entity_kind_arrays[kind]; +} + +internal CTRL_EntityList +ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key) +{ + CTRL_EntityList list = {0}; + CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Module); + for EachIndex(idx, all_modules.count) + { + CTRL_Entity *module = all_modules.v[idx]; + DI_Key module_dbgi_key = ctrl_dbgi_key_from_module(module); + if(di_key_match(module_dbgi_key, dbgi_key)) + { + ctrl_entity_list_push(arena, &list, module); + } + } + return list; +} + +internal CTRL_Entity * +ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id) +{ + CTRL_Entity *thread = &ctrl_entity_nil; + CTRL_EntityArray threads = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread); + for EachIndex(idx, threads.count) + { + if(threads.v[idx]->id == id) + { + thread = threads.v[idx]; + } + } + return thread; +} + +//- rjf: entity tree iteration + +internal CTRL_EntityRec +ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off) +{ + CTRL_EntityRec result = {0}; + result.next = &ctrl_entity_nil; + if((*MemberFromOffset(CTRL_Entity **, entity, child_off)) != &ctrl_entity_nil) + { + result.next = *MemberFromOffset(CTRL_Entity **, entity, child_off); + result.push_count = 1; + } + else for(CTRL_Entity *parent = entity; parent != subtree_root && parent != &ctrl_entity_nil; parent = parent->parent) + { + if(parent != subtree_root && (*MemberFromOffset(CTRL_Entity **, parent, sib_off)) != &ctrl_entity_nil) + { + result.next = *MemberFromOffset(CTRL_Entity **, parent, sib_off); + break; + } + result.pop_count += 1; + } + return result; +} + +//- rjf: applying events to entity caches + +internal void +ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list) +{ + //- rjf: scan events & construct entities + for(CTRL_EventNode *n = list->first; n != 0; n = n->next) + { + CTRL_Event *event = &n->v; + switch(event->kind) + { + default:{}break; + + //- rjf: processes + case CTRL_EventKind_NewProc: + { + CTRL_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); + if(machine != &ctrl_entity_nil) + { + CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); + process->tls_model = event->tls_model; + process->target_os = event->target_os; + } + }break; + case CTRL_EventKind_EndProc: + { + CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->entity); + ctrl_entity_release(store, process); + for(CTRL_Entity *entry = store->ctx.root->first, *next = &ctrl_entity_nil; + entry != &ctrl_entity_nil; + entry = next) + { + next = entry->next; + if(entry->kind == CTRL_EntityKind_EntryPoint && entry->id == process->id) + { + ctrl_entity_release(store, entry); + } + } + }break; + + //- rjf: threads + case CTRL_EventKind_NewThread: + { + CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + if(process != &ctrl_entity_nil) + { + CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); + CTRL_Entity *first_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); + if(first_thread == thread) + { + ctrl_entity_equip_string(store, thread, str8_lit("main_thread")); + } + CTRL_EntityArray pending_thread_names = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadName); + for EachIndex(idx, pending_thread_names.count) + { + CTRL_Entity *entity = pending_thread_names.v[idx]; + if(entity->id == event->entity_id) + { + ctrl_entity_equip_string(store, thread, entity->string); + ctrl_entity_release(store, entity); + break; + } + } + CTRL_EntityArray pending_thread_colors = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadColor); + for EachIndex(idx, pending_thread_colors.count) + { + CTRL_Entity *entity = pending_thread_colors.v[idx]; + if(entity->id == event->entity_id) + { + thread->rgba = entity->rgba; + ctrl_entity_release(store, entity); + break; + } + } + thread->stack_base = event->stack_base; + } + //ctrl_rip_from_thread(&store->ctx, event->entity); + }break; + case CTRL_EventKind_EndThread: + { + CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); + ctrl_entity_release(store, thread); + }break; + case CTRL_EventKind_ThreadName: + { + CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + CTRL_Entity *thread = &ctrl_entity_nil; + if(event->entity_id == 0) + { + thread = ctrl_entity_from_handle(&store->ctx, event->entity); + } + else + { + thread = ctrl_thread_from_id(&store->ctx, event->entity_id); + } + if(thread != &ctrl_entity_nil) + { + ctrl_entity_equip_string(store, thread, event->string); + } + else if(process != &ctrl_entity_nil) + { + CTRL_Entity *pending_name = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadName, Arch_Null, ctrl_handle_zero(), event->entity_id); + ctrl_entity_equip_string(store, pending_name, event->string); + } + }break; + case CTRL_EventKind_ThreadColor: + { + CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + CTRL_Entity *thread = &ctrl_entity_nil; + if(event->entity_id == 0) + { + thread = ctrl_entity_from_handle(&store->ctx, event->entity); + } + else + { + thread = ctrl_thread_from_id(&store->ctx, event->entity_id); + } + if(thread != &ctrl_entity_nil) + { + thread->rgba = event->rgba; + } + else if(process != &ctrl_entity_nil) + { + CTRL_Entity *pending = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadColor, Arch_Null, ctrl_handle_zero(), event->entity_id); + pending->rgba = event->rgba; + } + }break; + case CTRL_EventKind_ThreadFrozen: + { + CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); + if(thread != &ctrl_entity_nil) + { + thread->is_frozen = 1; + } + }break; + case CTRL_EventKind_ThreadThawed: + { + CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); + if(thread != &ctrl_entity_nil) + { + thread->is_frozen = 0; + } + }break; + + //- rjf: modules + case CTRL_EventKind_NewModule: + { + Temp scratch = scratch_begin(0, 0); + CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min); + ctrl_entity_equip_string(store, module, event->string); + module->timestamp = event->timestamp; + module->vaddr_range = event->vaddr_rng; + module->tls_index = event->tls_index; + module->tls_offset = event->tls_offset; + CTRL_Entity *first_module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module); + if(first_module == module) + { + ctrl_entity_equip_string(store, process, str8_skip_last_slash(event->string)); + } + scratch_end(scratch); + }break; + case CTRL_EventKind_EndModule: + { + CTRL_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); + ctrl_entity_release(store, module); + }break; + case CTRL_EventKind_ModuleDebugInfoPathChange: + { + Temp scratch = scratch_begin(0, 0); + CTRL_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); + CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + if(debug_info_path == &ctrl_entity_nil) + { + debug_info_path = ctrl_entity_alloc(store, module, CTRL_EntityKind_DebugInfoPath, Arch_Null, ctrl_handle_zero(), 0); + } + ctrl_entity_equip_string(store, debug_info_path, path_normalized_from_string(scratch.arena, event->string)); + debug_info_path->timestamp = event->timestamp; + scratch_end(scratch); + }break; + + //- rjf: dynamic, program-created breakpoints + case CTRL_EventKind_SetBreakpoint: + { + CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + CTRL_Entity *bp = ctrl_entity_alloc(store, process, CTRL_EntityKind_Breakpoint, Arch_Null, ctrl_handle_zero(), 0); + bp->vaddr_range = event->vaddr_rng; + bp->bp_flags = event->bp_flags; + }break; + case CTRL_EventKind_UnsetBreakpoint: + { + CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Breakpoint && + child->vaddr_range.min == event->vaddr_rng.min && + child->vaddr_range.max == event->vaddr_rng.max && + child->bp_flags == event->bp_flags) + { + ctrl_entity_release(store, child); + break; + } + } + }break; + + //- rjf: address range annotations + case CTRL_EventKind_SetVAddrRangeNote: + { + CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + CTRL_Entity *annotation = ctrl_entity_alloc(store, process, CTRL_EntityKind_AddressRangeAnnotation, Arch_Null, ctrl_handle_zero(), 0); + annotation->vaddr_range = event->vaddr_rng; + ctrl_entity_equip_string(store, annotation, event->string); + }break; + } + } +} + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void +ctrl_init(void) +{ + Arena *arena = arena_alloc(); + ctrl_state = push_array(arena, CTRL_State, 1); + ctrl_state->arena = arena; + for(Arch arch = (Arch)0; arch < Arch_COUNT; arch = (Arch)(arch+1)) + { + String8 *reg_names = regs_reg_code_string_table_from_arch(arch); + U64 reg_count = regs_reg_code_count_from_arch(arch); + String8 *alias_names = regs_alias_code_string_table_from_arch(arch); + U64 alias_count = regs_alias_code_count_from_arch(arch); + ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); + ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); + for(U64 idx = 1; idx < reg_count; idx += 1) + { + e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); + } + for(U64 idx = 1; idx < alias_count; idx += 1) + { + e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); + } + } + ctrl_state->thread_reg_cache.slots_count = 1024; + ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); + ctrl_state->thread_reg_cache.stripes_count = os_get_system_info()->logical_processor_count; + ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); + for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) + { + ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); + ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); + } + ctrl_state->module_image_info_cache.slots_count = 1024; + ctrl_state->module_image_info_cache.slots = push_array(arena, CTRL_ModuleImageInfoCacheSlot, ctrl_state->module_image_info_cache.slots_count); + ctrl_state->module_image_info_cache.stripes_count = os_get_system_info()->logical_processor_count; + ctrl_state->module_image_info_cache.stripes = push_array(arena, CTRL_ModuleImageInfoCacheStripe, ctrl_state->module_image_info_cache.stripes_count); + for(U64 idx = 0; idx < ctrl_state->module_image_info_cache.stripes_count; idx += 1) + { + ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc(); + ctrl_state->module_image_info_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); + } + ctrl_state->u2c_ring_size = KB(64); + ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); + ctrl_state->u2c_ring_mutex = mutex_alloc(); + ctrl_state->u2c_ring_cv = cond_var_alloc(); + ctrl_state->c2u_ring_size = KB(64); + ctrl_state->c2u_ring_max_string_size = ctrl_state->c2u_ring_size/2; + ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); + ctrl_state->c2u_ring_mutex = mutex_alloc(); + ctrl_state->c2u_ring_cv = cond_var_alloc(); + { + Temp scratch = scratch_begin(0, 0); + String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); + os_make_directory(user_data_folder); + ctrl_state->ctrl_thread_log_path = push_str8f(ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); + os_write_data_to_file_path(ctrl_state->ctrl_thread_log_path, str8_zero()); + scratch_end(scratch); + } + ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc(); + ctrl_state->ctrl_thread_entity_store = ctrl_entity_ctx_rw_store_alloc(); + ctrl_state->ctrl_thread_eval_cache = e_cache_alloc(); + ctrl_state->ctrl_thread_msg_process_arena = arena_alloc(); + ctrl_state->dmn_event_arena = arena_alloc(); + ctrl_state->user_entry_point_arena = arena_alloc(); + ctrl_state->dbg_dir_arena = arena_alloc(); + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(ctrl_exception_code_kind_default_enable_table[k]) + { + ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); + } + } + ctrl_state->ctrl_thread_log = log_alloc(); + ctrl_state->ctrl_thread = thread_launch(ctrl_thread__entry_point, 0); +} + +//////////////////////////////// +//~ rjf: Wakeup Callback Registration + +internal void +ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) +{ + ctrl_state->wakeup_hook = wakeup_hook; +} + +//////////////////////////////// +//~ rjf: Thread Register Functions + +//- rjf: thread register cache reading + +internal void * +ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle) +{ + CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache; + CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + Arch arch = thread_entity->arch; + U64 reg_block_size = regs_block_size_from_arch(arch); + U64 hash = ctrl_hash_from_handle(handle); + U64 slot_idx = hash%cache->slots_count; + U64 stripe_idx = slot_idx%cache->stripes_count; + CTRL_ThreadRegCacheSlot *slot = &cache->slots[slot_idx]; + CTRL_ThreadRegCacheStripe *stripe = &cache->stripes[stripe_idx]; + void *result = push_array(arena, U8, reg_block_size); + MutexScopeW(stripe->rw_mutex) + { + // rjf: find existing node + CTRL_ThreadRegCacheNode *node = 0; + for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->handle, handle)) + { + node = n; + break; + } + } + + // rjf: allocate existing node + if(!node) + { + node = push_array(stripe->arena, CTRL_ThreadRegCacheNode, 1); + DLLPushBack(slot->first, slot->last, node); + node->handle = handle; + node->block_size = reg_block_size; + node->block = push_array(stripe->arena, U8, reg_block_size); + } + + // rjf: copy from node + if(node) + { + U64 current_reg_gen = ctrl_reg_gen(); + B32 need_stale = 1; + if(node->reg_gen != current_reg_gen && + dmn_thread_read_reg_block(handle.dmn_handle, result)) + { + if(node != 0) + { + need_stale = 0; + node->reg_gen = current_reg_gen; + MemoryCopy(node->block, result, reg_block_size); + } + } + if(need_stale) + { + MemoryCopy(result, node->block, reg_block_size); + } + } + } + return result; +} + +internal U64 +ctrl_tls_root_vaddr_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) +{ + U64 result = dmn_tls_root_vaddr_from_thread(handle.dmn_handle); + return result; +} + +internal U64 +ctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) +{ + Temp scratch = scratch_begin(0, 0); + CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + Arch arch = thread_entity->arch; + void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle); + U64 result = regs_rip_from_arch_block(arch, block); + scratch_end(scratch); + return result; +} + +internal U64 +ctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) +{ + Temp scratch = scratch_begin(0, 0); + CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + Arch arch = thread_entity->arch; + void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle); + U64 result = regs_rsp_from_arch_block(arch, block); + scratch_end(scratch); + return result; +} + +//- rjf: thread register writing + +internal B32 +ctrl_thread_write_reg_block(CTRL_Handle thread, void *block) +{ + // TODO(rjf): @callstacks immediately reflect this in the call stack cache + B32 good = dmn_thread_write_reg_block(thread.dmn_handle, block); + if(good) + { + ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); + } + return good; +} + +//////////////////////////////// +//~ rjf: Module Image Info Functions + +//- rjf: cache lookups + +internal PE_IntelPdata * +ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff) +{ + PE_IntelPdata *first_pdata = 0; + { + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module_handle)) + { + PE_IntelPdata *pdatas = n->pdatas; + U64 pdatas_count = n->pdatas_count; + if(n->pdatas_count != 0 && voff >= n->pdatas[0].voff_first) + { + // NOTE(rjf): + // + // binary search: + // find max index s.t. pdata_array[index].voff_first <= voff + // we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first) + U64 index = pdatas_count; + U64 min = 0; + U64 opl = pdatas_count; + for(;;) + { + U64 mid = (min + opl)/2; + PE_IntelPdata *pdata = pdatas + mid; + if(voff < pdata->voff_first) + { + opl = mid; + } + else if(pdata->voff_first < voff) + { + min = mid; + } + else + { + index = mid; + break; + } + if(min + 1 >= opl) + { + index = min; + break; + } + } + + // rjf: if we are in range fill result + { + PE_IntelPdata *pdata = pdatas + index; + if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last) + { + first_pdata = push_array(arena, PE_IntelPdata, 1); + MemoryCopyStruct(first_pdata, pdata); + } + } + } + break; + } + } + } + return first_pdata; +} + +internal U64 +ctrl_entry_point_voff_from_module(CTRL_Handle module_handle) +{ + U64 result = 0; + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module_handle)) + { + result = n->entry_point_voff; + break; + } + } + return result; +} + +internal String8 +ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle) +{ + String8 result = {0}; + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module_handle)) + { + result = push_str8_copy(arena, n->initial_debug_info_path); + break; + } + } + return result; +} + +internal String8 +ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle) +{ + String8 result = {0}; + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module_handle)) + { + result = push_str8_copy(arena, n->raddbg_data); + break; + } + } + return result; +} + +//////////////////////////////// +//~ Process Info Functions + +internal Arch +ctrl_arch_from_process_handle(CTRL_Handle process_handle) +{ + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_Entity *process_entity = ctrl_entity_from_handle(entity_ctx, process_handle); + return process_entity->arch; +} + +//////////////////////////////// +//~ rjf: Unwinding Functions + +//- rjf: unwind deep copier + +internal CTRL_Unwind +ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src) +{ + CTRL_Unwind dst = {0}; + { + dst.flags = src->flags; + dst.frames.count = src->frames.count; + dst.frames.v = push_array(arena, CTRL_UnwindFrame, dst.frames.count); + MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count); + U64 block_size = regs_block_size_from_arch(arch); + for(U64 idx = 0; idx < dst.frames.count; idx += 1) + { + dst.frames.v[idx].regs = push_array_no_zero(arena, U8, block_size); + MemoryCopy(dst.frames.v[idx].regs, src->frames.v[idx].regs, block_size); + } + } + return dst; +} + +//- DWARF + +typedef struct +{ + CTRL_Handle process_handle; + U64 endt_us; +} CTRL_MemoryReadContextDwarfX64; + +internal +MACHINE_OP_MEM_READ(ctrl_machine_mem_read) +{ + CTRL_MemoryReadContextDwarfX64 *ctx = ud; + + B32 is_stale = 0; + B32 is_read = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + buffer_size), &is_stale, buffer, ctx->endt_us); + + MachineOpResult status = MachineOpResult_Fail; + if(is_stale) + { + status = MachineOpResult_Maybe; + } + else if(is_read) + { + status = MachineOpResult_Ok; + } + + return status; +} + +internal CTRL_UnwindStepResult +ctrl_unwind_step_result_from_machine_op_result(MachineOpResult s) +{ + CTRL_UnwindStepResult result = {0}; + switch(s) + { + case MachineOpResult_Null: {} break; + case MachineOpResult_Ok: + { + result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); + }break; + case MachineOpResult_Fail: + { + result.flags |= CTRL_UnwindFlag_Error; + }break; + case MachineOpResult_Maybe: + { + result.flags &= ~CTRL_UnwindFlag_Error; + result.flags |= CTRL_UnwindFlag_Stale; + }break; + default: { InvalidPath; } break; + } + return result; +} + +internal CTRL_UnwindStepResult +ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out) +{ + Temp scratch = scratch_begin(&arena, 1); + CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; + + // gather context for virtual stack unwinder + U64 cfi_rebase = 0; + B32 is_unwind_eh = 0; + String8 unwind_data = {0}; + EH_FrameHdr eh_frame_hdr = {0}; + EH_PtrCtx eh_ptr_ctx = {0}; + { + U64 hash = ctrl_hash_from_handle(module_handle); + U64 slot_idx = hash % ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx % ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) + { + if(ctrl_handle_match(n->module, module_handle)) + { + cfi_rebase = n->cfi_rebase; + is_unwind_eh = n->is_unwind_eh; + unwind_data = n->dwarf_unwind_data; + eh_frame_hdr = n->eh_frame_hdr; + eh_ptr_ctx = n->eh_ptr_ctx; + break; + } + } + } + + // grab IP + U64 ip = regs_rip_from_arch_block(arch, regs); + + // use .eh_frame_hdr to quickly locate nearest FDE + U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, ip); + + if(fde_addr != max_U64) + { + // parse call frame info + DW_CIE cie = {0}; + DW_FDE fde = {0}; + B32 is_cfi_parsed = 0; + if(is_unwind_eh) + { + B32 is_stale = 0; + + // extract FDE info + Rng1U64 fde_vrange = {0}; + DW_Format fde_format = DW_Format_Null; + String8 fde_data = {0}; + U64 cie_addr = 0; + { + // parse FDE length + U32 first_four_bytes = 0; + if(!ctrl_process_memory_read_struct(process_handle, fde_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } + if(first_four_bytes == max_U32) + { + U64 length = 0; + if(!ctrl_process_memory_read_struct(process_handle, fde_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } + fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + length); + fde_format = DW_Format_64Bit; + } + else + { + fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + first_four_bytes); + fde_format = DW_Format_32Bit; + } + + // read out whole FDE + void *fde_raw = push_array(scratch.arena, U8, dim_1u64(fde_vrange)); + if(!ctrl_process_memory_read(process_handle, fde_vrange, &is_stale, fde_raw, endt_us)) { goto eh_parse_exit; } + fde_data = str8(fde_raw, dim_1u64(fde_vrange)); + + // compute CIE address + U64 cie_delta_off = fde_format == DW_Format_32Bit ? 4 : 12; + U64 cie_delta = 0; + U64 cie_delta_size = str8_deserial_read_dwarf_uint(fde_data, cie_delta_off, fde_format, &cie_delta); + if (cie_delta_size == 0) { goto eh_parse_exit; } + cie_addr = (fde_addr + cie_delta_off) - cie_delta; + } + + // extract CIE info + Rng1U64 cie_vrange = {0}; + DW_Format cie_format = DW_Format_Null; + String8 cie_data = {0}; + { + // parse CIE length + U32 first_four_bytes = 0; + if(!ctrl_process_memory_read_struct(process_handle, cie_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } + if(first_four_bytes == max_U32) + { + U64 length = 0; + if(!ctrl_process_memory_read_struct(process_handle, cie_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } + cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + length); + cie_format = DW_Format_64Bit; + } + else + { + cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + first_four_bytes); + cie_format = DW_Format_32Bit; + } + + // read out whole CIE + void *cie_raw = push_array(scratch.arena, U8, dim_1u64(cie_vrange)); + if(!ctrl_process_memory_read(process_handle, cie_vrange, &is_stale, cie_raw, endt_us)) { goto eh_parse_exit; } + cie_data = str8(cie_raw, dim_1u64(cie_vrange)); + } + + // parse CIE and FDE + if(eh_parse_cie(cie_data, cie_format, arch, cie_vrange.min, &eh_ptr_ctx, &cie)) + { + is_cfi_parsed = eh_parse_fde(fde_data, fde_format, fde_vrange.min, &cie, &eh_ptr_ctx, &fde); + } + + eh_parse_exit:; + if(is_stale) + { + result.flags = CTRL_UnwindFlag_Stale; + } + } + else + { + is_cfi_parsed = dw_parse_cfi(unwind_data, fde_addr, arch, &cie, &fde); + } + + if(is_cfi_parsed && contains_1u64(fde.pc_range, ip)) + { + // setup pointer decoder ops + DW_DecodePtr *decode_ptr_func = 0; + void *decode_ptr_ctx = 0; + if(is_unwind_eh) + { + EH_DecodePtrCtx *decode_ptr_ctx_eh = push_array(scratch.arena, EH_DecodePtrCtx, 1); + decode_ptr_ctx_eh->ptr_ctx = &eh_ptr_ctx; + decode_ptr_ctx_eh->addr_enc = cie.ext[EH_CIE_Ext_AddrEnc]; + + decode_ptr_func = eh_decode_ptr; + decode_ptr_ctx = decode_ptr_ctx_eh; + } + else + { + decode_ptr_func = dw_decode_ptr_debug_frame; + decode_ptr_ctx = &cie; + } + + // find register rules for IP + DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, ip); + if(cfi_row) + { + // setup machine ops + void *mem_read_ctx = 0; + void *reg_read_ctx = 0; + MachineOp_MemRead *mem_read_func = 0; + MachineOp_RegRead *reg_read_func = 0; + switch(arch) + { + case Arch_Null: break; + case Arch_x64: + { + CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); + mem_read_ctx_x64->process_handle = process_handle; + mem_read_ctx_x64->endt_us = endt_us; + + mem_read_ctx = mem_read_ctx_x64; + reg_read_ctx = regs; + + mem_read_func = ctrl_machine_mem_read; + reg_read_func = regs_read_dwarf_x64; + }break; + case Arch_x86: + case Arch_arm64: + case Arch_arm32: + { + NotImplemented; + }break; + default: { InvalidPath; }break; + } + + // compute CFA for the row + U64 cfa = 0; + MachineOpResult unwind_status = dw_compute_cfa(arch, cfi_row, mem_read_func, mem_read_ctx, reg_read_func, reg_read_ctx, &cfa); + + // on success fill out output + if(unwind_status == MachineOpResult_Ok) + { + ctx_out->cfa = cfa; + ctx_out->cfi_row = cfi_row; + ctx_out->ret_addr_reg = cie.ret_addr_reg; + } + + // translate unwind status code + result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); + } + } + } + + scratch_end(scratch); + return result; +} + +internal CTRL_UnwindStepResult +ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us) +{ + Temp scratch = scratch_begin(0, 0); + + CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; + + // setup machine ops + void *mem_read_ctx = 0; + void *reg_read_ctx = 0; + void *reg_write_ctx = 0; + MachineOp_MemRead *mem_read_func = 0; + MachineOp_RegRead *reg_read_func = 0; + MachineOp_RegWrite *reg_write_func = 0; + switch(arch) + { + case Arch_Null: break; + case Arch_x64: + { + CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); + mem_read_ctx_x64->process_handle = process_handle; + mem_read_ctx_x64->endt_us = endt_us; + + mem_read_ctx = mem_read_ctx_x64; + reg_read_ctx = regs; + reg_write_ctx = regs; + + mem_read_func = ctrl_machine_mem_read; + reg_read_func = regs_read_dwarf_x64; + reg_write_func = regs_write_dwarf_x64; + }break; + case Arch_x86: + case Arch_arm64: + case Arch_arm32: + { + NotImplemented; + }break; + default: { InvalidPath; }break; + } + + // apply register rules to the context + MachineOpResult unwind_status = dw_cfi_apply_register_rules(arch, + frame_ctx->cfa, + frame_ctx->cfi_row, + mem_read_func, + mem_read_ctx, + reg_read_func, + reg_read_ctx, + reg_write_func, + reg_write_ctx); + + // last frame typically has undefined rule for IP + if(frame_ctx->cfi_row->regs[frame_ctx->ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) + { + regs_arch_block_write_rip(arch, regs, 0); + } + + // translate unwind status code + result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); + + scratch_end(scratch); + return result; +} + +//- rjf: [x64] + +internal REGS_Reg64 * +ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg) +{ + local_persist REGS_Reg64 dummy = {0}; + REGS_Reg64 *result = &dummy; + switch(gpr_reg) + { + case PE_UnwindGprRegX64_RAX:{result = ®s->rax;}break; + case PE_UnwindGprRegX64_RCX:{result = ®s->rcx;}break; + case PE_UnwindGprRegX64_RDX:{result = ®s->rdx;}break; + case PE_UnwindGprRegX64_RBX:{result = ®s->rbx;}break; + case PE_UnwindGprRegX64_RSP:{result = ®s->rsp;}break; + case PE_UnwindGprRegX64_RBP:{result = ®s->rbp;}break; + case PE_UnwindGprRegX64_RSI:{result = ®s->rsi;}break; + case PE_UnwindGprRegX64_RDI:{result = ®s->rdi;}break; + case PE_UnwindGprRegX64_R8 :{result = ®s->r8 ;}break; + case PE_UnwindGprRegX64_R9 :{result = ®s->r9 ;}break; + case PE_UnwindGprRegX64_R10:{result = ®s->r10;}break; + case PE_UnwindGprRegX64_R11:{result = ®s->r11;}break; + case PE_UnwindGprRegX64_R12:{result = ®s->r12;}break; + case PE_UnwindGprRegX64_R13:{result = ®s->r13;}break; + case PE_UnwindGprRegX64_R14:{result = ®s->r14;}break; + case PE_UnwindGprRegX64_R15:{result = ®s->r15;}break; + } + return result; +} + +internal CTRL_UnwindStepResult +ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us) +{ + B32 is_stale = 0; + B32 is_good = 1; + Temp scratch = scratch_begin(0, 0); + + ////////////////////////////// + //- rjf: unpack parameters + // + U64 rip_voff = regs->rip.u64 - module_base_vaddr; + + ////////////////////////////// + //- rjf: rip_voff -> first pdata + // + PE_IntelPdata *first_pdata = ctrl_intel_pdata_from_module_voff(scratch.arena, module_handle, rip_voff); + + ////////////////////////////// + //- rjf: pdata -> detect if in epilog + // + B32 has_pdata_and_in_epilog = 0; + if(first_pdata) ProfScope("pdata -> detect if in epilog") + { + // NOTE(allen): There are restrictions placed on how an epilog is allowed + // to be formed (https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-160) + // Here we interpret machine code directly according to the rules + // given there to determine if the code we're looking at looks like an epilog. + + //- rjf: set up parsing state + B32 is_epilog = 0; + B32 keep_parsing = 1; + U64 read_vaddr = regs->rip.u64; + U64 read_vaddr_opl = read_vaddr + 256; + + //- rjf: check first instruction + { + B32 inst_good = 0; + U8 inst[4] = {0}; + if(read_vaddr + sizeof(inst) <= read_vaddr_opl) + { + inst_good = ctrl_process_memory_read(process_handle, r1u64(read_vaddr, read_vaddr+sizeof(inst)), &is_stale, inst, endt_us); + inst_good = inst_good && !is_stale; + } + if(!inst_good) + { + keep_parsing = 0; + } + else if((inst[0] & 0xF8) == 0x48) + { + switch(inst[1]) + { + // rjf: add $nnnn,%rsp + case 0x81: + { + if(inst[0] == 0x48 && inst[2] == 0xC4) + { + read_vaddr += 7; + } + else + { + keep_parsing = 0; + } + }break; + + // rjf: add $n,%rsp + case 0x83: + { + if(inst[0] == 0x48 && inst[2] == 0xC4) + { + read_vaddr += 4; + } + else + { + keep_parsing = 0; + } + }break; + + // rjf: lea n(reg),%rsp + case 0x8D: + { + if((inst[0] & 0x06) == 0 && + ((inst[2] >> 3) & 0x07) == 0x04 && + (inst[2] & 0x07) != 0x04) + { + U8 imm_size = (inst[2] >> 6); + + // rjf: 1-byte immediate + if(imm_size == 1) + { + read_vaddr += 4; + } + + // rjf: 4-byte immediate + else if(imm_size == 2) + { + read_vaddr += 7; + } + + // rjf: other case + else + { + keep_parsing = 0; + } + } + else + { + keep_parsing = 0; + } + }break; + } + } + } + + //- rjf: continue parsing instructions + for(;keep_parsing;) + { + // rjf: read next instruction byte + B32 inst_byte_good = 0; + U8 inst_byte = 0; + if(read_vaddr + sizeof(inst_byte) <= read_vaddr_opl) + { + inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); + } + if(!inst_byte_good || is_stale) + { + keep_parsing = 0; + } + + // rjf: when (... I don't know ...) rely on the next byte + B32 check_inst_byte_good = inst_byte_good; + U64 check_vaddr = read_vaddr; + U8 check_inst_byte = inst_byte; + if(inst_byte_good && (inst_byte & 0xF0) == 0x40) + { + check_vaddr = read_vaddr + 1; + if(read_vaddr + sizeof(check_inst_byte) <= read_vaddr_opl) + { + check_inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &check_inst_byte, endt_us); + } + if(!check_inst_byte_good || is_stale) + { + keep_parsing = 0; + } + } + + // rjf: check instruction byte + if(check_inst_byte_good) + { + switch(check_inst_byte) + { + // rjf: pop + case 0x58:case 0x59:case 0x5A:case 0x5B: + case 0x5C:case 0x5D:case 0x5E:case 0x5F: + { + read_vaddr = check_vaddr + 1; + }break; + + // rjf: ret + case 0xC2: + case 0xC3: + { + is_epilog = 1; + keep_parsing = 0; + }break; + + // rjf: jmp nnnn + case 0xE9: + { + U64 imm_vaddr = check_vaddr + 1; + S32 imm = 0; + B32 imm_good = 0; + if(read_vaddr + sizeof(imm) <= read_vaddr_opl) + { + imm_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us); + } + if(!imm_good || is_stale) + { + keep_parsing = 0; + } + if(imm_good) + { + U64 next_vaddr = (U64)(imm_vaddr + sizeof(imm) + imm); + U64 next_voff = next_vaddr - module_base_vaddr; // TODO(rjf): verify that this offset is from module base vaddr, not section + if(!(first_pdata->voff_first <= next_voff && next_voff < first_pdata->voff_one_past_last)) + { + keep_parsing = 0; + } + else + { + read_vaddr = next_vaddr; + } + } + // TODO(allen): why isn't this just the end of the epilog? + }break; + + // rjf: rep; ret (for amd64 prediction bug) + case 0xF3: + { + U8 next_inst_byte = 0; + B32 next_inst_byte_good = 0; + if(read_vaddr + sizeof(next_inst_byte) <= read_vaddr_opl) + { + next_inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &next_inst_byte, endt_us); + } + if(next_inst_byte_good) + { + is_epilog = (next_inst_byte == 0xC3); + } + keep_parsing = 0; + }break; + + default:{keep_parsing = 0;}break; + } + } + } + has_pdata_and_in_epilog = is_epilog; + } + + ////////////////////////////// + //- rjf: pdata & in epilog -> epilog unwind + // + if(first_pdata && has_pdata_and_in_epilog) ProfScope("pdata & in epilog -> epilog unwind") + { + U64 read_vaddr = regs->rip.u64; + for(B32 keep_parsing = 1;keep_parsing != 0;) + { + //- rjf: assume no more parsing after this instruction + keep_parsing = 0; + + //- rjf: read next instruction byte + U8 inst_byte = 0; + is_good = is_good && ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); + is_good = is_good && !is_stale; + read_vaddr += 1; + + //- rjf: extract rex from instruction byte + U8 rex = 0; + if((inst_byte & 0xF0) == 0x40) + { + rex = inst_byte & 0xF; // rex prefix + is_good = is_good && ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); + is_good = is_good && !is_stale; + read_vaddr += 1; + } + + //- rjf: parse remainder of instruction + switch(inst_byte) + { + // rjf: pop + case 0x58: + case 0x59: + case 0x5A: + case 0x5B: + case 0x5C: + case 0x5D: + case 0x5E: + case 0x5F: + { + // rjf: read value at rsp + U64 sp = regs->rsp.u64; + U64 value = 0; + if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &value, endt_us) || + is_stale) + { + is_good = 0; + break; + } + + // rjf: modify registers + PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); + reg->u64 = value; + regs->rsp.u64 = sp + 8; + + // rjf: not a final instruction, so keep mparsing + keep_parsing = 1; + }break; + + // rjf: add $nnnn,%rsp + case 0x81: + { + // rjf: skip one byte (we already know what it is in this scenario) + read_vaddr += 1; + + // rjf: read the 4-byte immediate + S32 imm = 0; + if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 4; + + // rjf: update stack pointer + regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: add $n,%rsp + case 0x83: + { + // rjf: skip one byte (we already know what it is in this scenario) + read_vaddr += 1; + + // rjf: read the 4-byte immediate + S8 imm = 0; + if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 1; + + // rjf: update stack pointer + regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: lea imm8/imm32,$rsp + case 0x8D: + { + // rjf: read source register + U8 modrm = 0; + if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &modrm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 1; + PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); + U64 reg_value = reg->u64; + + // rjf: read immediate + S32 imm = 0; + { + // rjf: read 1-byte immediate + if((modrm >> 6) == 1) + { + S8 imm8 = 0; + if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm8, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 1; + imm = (S32)imm8; + } + + // rjf: read 4-byte immediate + else + { + if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + read_vaddr += 4; + } + } + + // rjf: update stack pointer + regs->rsp.u64 = (U64)(reg_value + imm); + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: ret $nn + case 0xC2: + { + // rjf: read new ip + U64 sp = regs->rsp.u64; + U64 new_ip = 0; + if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || + is_stale) + { + is_good = 0; + break; + } + + // rjf: read 2-byte immediate & advance stack pointer + U16 imm = 0; + if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || + is_stale) + { + is_good = 0; + break; + } + U64 new_sp = sp + 8 + imm; + + // rjf: commit registers + regs->rip.u64 = new_ip; + regs->rsp.u64 = new_sp; + }break; + + // rjf: ret / rep; ret + case 0xF3: + { + // Assert(!"Hit me!"); + }break; + case 0xC3: + { + // rjf: read new ip + U64 sp = regs->rsp.u64; + U64 new_ip = 0; + if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || + is_stale) + { + is_good = 0; + break; + } + + // rjf: advance stack pointer + U64 new_sp = sp + 8; + + // rjf: commit registers + regs->rip.u64 = new_ip; + regs->rsp.u64 = new_sp; + }break; + + // rjf: jmp nnnn + case 0xE9: + { + // Assert(!"Hit Me"); + // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done + // we don't have any cases to exercise this right now. no guess implementation! + }break; + + // rjf: Sjmp n + case 0xEB: + { + // Assert(!"Hit Me"); + // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done + // we don't have any cases to exercise this right now. no guess implementation! + }break; + } + } + } + + ////////////////////////////// + //- rjf: pdata & not in epilog -> xdata unwind + // + B32 xdata_unwind_did_machframe = 0; + if(first_pdata && !has_pdata_and_in_epilog) ProfScope("pdata & not in epilog -> xdata unwind") + { + //- rjf: get frame reg + B32 bad_frame_reg_info = 0; + REGS_Reg64 *frame_reg = 0; + U64 frame_off = 0; + { + U64 unwind_info_off = first_pdata->voff_unwind_info; + PE_UnwindInfo unwind_info = {0}; + if(!ctrl_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us) || + is_stale) + { + is_good = 0; + } + U32 frame_reg_id = PE_UNWIND_INFO_REG_FROM_FRAME(unwind_info.frame); + U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info.frame); + if(frame_reg_id != 0) + { + frame_reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, frame_reg_id); + bad_frame_reg_info = (frame_reg == 0); // NOTE(rjf): frame_reg should never be 0 at this point, in valid exe + } + frame_off = frame_off_val; + } + + //- rjf: iterate pdatas, apply opcodes + PE_IntelPdata *last_pdata = 0; + PE_IntelPdata *pdata = first_pdata; + if(!bad_frame_reg_info) for(B32 keep_parsing = 1; keep_parsing && pdata != last_pdata;) + { + //- rjf: unpack unwind info & codes + B32 good_unwind_info = 1; + U64 unwind_info_off = pdata->voff_unwind_info; + PE_UnwindInfo unwind_info = {0}; + good_unwind_info = good_unwind_info && ctrl_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us); + PE_UnwindCode *unwind_codes = push_array(scratch.arena, PE_UnwindCode, unwind_info.codes_num); + good_unwind_info = good_unwind_info && ctrl_process_memory_read(process_handle, r1u64(module_base_vaddr+unwind_info_off+sizeof(unwind_info), + module_base_vaddr+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num), + &is_stale, unwind_codes, endt_us); + good_unwind_info = good_unwind_info && !is_stale; + + //- rjf: bad unwind info -> abort + if(!good_unwind_info) + { + is_good = 0; + break; + } + + //- rjf: unpack frame base + U64 frame_base = regs->rsp.u64; + if(frame_reg != 0) + { + U64 raw_frame_base = frame_reg->u64; + U64 adjusted_frame_base = raw_frame_base - frame_off*16; + frame_base = adjusted_frame_base; + } + + //- rjf: apply opcodes + PE_UnwindCode *code_ptr = unwind_codes; + PE_UnwindCode *code_opl = unwind_codes + unwind_info.codes_num; + for(PE_UnwindCode *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr) + { + // rjf: unpack opcode info + U32 op_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr->flags); + U32 op_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr->flags); + U32 slot_count = pe_slot_count_from_unwind_op_code(op_code); + if(op_code == PE_UnwindOpCode_ALLOC_LARGE && op_info == 1) + { + slot_count += 1; + } + + // rjf: detect bad slot counts + if(slot_count == 0 || code_ptr+slot_count > code_opl) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: set next op code pointer + next_code_ptr = code_ptr + slot_count; + + // rjf: interpret this op code + U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog; + if(code_voff <= rip_voff) + { + switch(op_code) + { + case PE_UnwindOpCode_PUSH_NONVOL: + { + // rjf: read value from stack pointer + U64 rsp = regs->rsp.u64; + U64 value = 0; + if(!ctrl_process_memory_read_struct(process_handle, rsp, &is_stale, &value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: advance stack ptr + U64 new_rsp = rsp + 8; + + // rjf: commit registers + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg->u64 = value; + regs->rsp.u64 = new_rsp; + }break; + + case PE_UnwindOpCode_ALLOC_LARGE: + { + // rjf: read alloc size + U64 size = 0; + if(op_info == 0) + { + size = code_ptr[1].u16*8; + } + else if(op_info == 1) + { + size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + } + else + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: advance stack pointer + U64 rsp = regs->rsp.u64; + U64 new_rsp = rsp + size; + + // rjf: advance stack pointer + regs->rsp.u64 = new_rsp; + }break; + + case PE_UnwindOpCode_ALLOC_SMALL: + { + // rjf: advance stack pointer + regs->rsp.u64 += op_info*8 + 8; + }break; + + case PE_UnwindOpCode_SET_FPREG: + { + // rjf: put stack pointer back to the frame base + regs->rsp.u64 = frame_base; + }break; + + case PE_UnwindOpCode_SAVE_NONVOL: + { + // rjf: read value from frame base + U64 off = code_ptr[1].u16*8; + U64 addr = frame_base + off; + U64 value = 0; + if(!ctrl_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit to register + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg->u64 = value; + }break; + + case PE_UnwindOpCode_SAVE_NONVOL_FAR: + { + // rjf: read value from frame base + U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + U64 addr = frame_base + off; + U64 value = 0; + if(!ctrl_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit to register + REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg->u64 = value; + }break; + + case PE_UnwindOpCode_EPILOG: + { + keep_parsing = 1; + }break; + + case PE_UnwindOpCode_SPARE_CODE: + { + // TODO(rjf): ??? + keep_parsing = 0; + is_good = 0; + }break; + + case PE_UnwindOpCode_SAVE_XMM128: + { + // rjf: read new register values + U8 buf[16]; + U64 off = code_ptr[1].u16*16; + U64 addr = frame_base + off; + if(!ctrl_process_memory_read(process_handle, r1u64(addr, addr+sizeof(buf)), &is_stale, buf, endt_us)) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit to register + void *xmm_reg = (®s->zmm0) + op_info; + MemoryCopy(xmm_reg, buf, sizeof(buf)); + }break; + + case PE_UnwindOpCode_SAVE_XMM128_FAR: + { + // rjf: read new register values + U8 buf[16]; + U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + U64 addr = frame_base + off; + if(!ctrl_process_memory_read(process_handle, r1u64(addr, addr+16), &is_stale, buf, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit to register + void *xmm_reg = (®s->zmm0) + op_info; + MemoryCopy(xmm_reg, buf, sizeof(buf)); + }break; + + case PE_UnwindOpCode_PUSH_MACHFRAME: + { + // NOTE(rjf): this was found by stepping through kernel code after an exception was + // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main + if(op_info > 1) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: read values + U64 sp_og = regs->rsp.u64; + U64 sp_adj = sp_og; + if(op_info == 1) + { + sp_adj += 8; + } + U64 ip_value = 0; + if(!ctrl_process_memory_read_struct(process_handle, sp_adj, &is_stale, &ip_value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + U64 sp_after_ip = sp_adj + 8; + U16 ss_value = 0; + if(!ctrl_process_memory_read_struct(process_handle, sp_after_ip, &is_stale, &ss_value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + U64 sp_after_ss = sp_after_ip + 8; + U64 rflags_value = 0; + if(!ctrl_process_memory_read_struct(process_handle, sp_after_ss, &is_stale, &rflags_value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + U64 sp_after_rflags = sp_after_ss + 8; + U64 sp_value = 0; + if(!ctrl_process_memory_read_struct(process_handle, sp_after_rflags, &is_stale, &sp_value, endt_us) || + is_stale) + { + keep_parsing = 0; + is_good = 0; + break; + } + + // rjf: commit registers + regs->rip.u64 = ip_value; + regs->ss.u16 = ss_value; + regs->rflags.u64 = rflags_value; + regs->rsp.u64 = sp_value; + + // rjf: mark machine frame + xdata_unwind_did_machframe = 1; + }break; + } + } + } + + //- rjf: iterate to next pdata + if(keep_parsing) + { + U32 flags = PE_UNWIND_INFO_FLAGS_FROM_HDR(unwind_info.header); + if(!(flags & PE_UnwindInfoFlag_CHAINED)) + { + break; + } + U64 code_count_rounded = AlignPow2(unwind_info.codes_num, sizeof(PE_UnwindCode)); + U64 code_size = code_count_rounded*sizeof(PE_UnwindCode); + U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size; + last_pdata = pdata; + pdata = push_array(scratch.arena, PE_IntelPdata, 1); + if(!ctrl_process_memory_read_struct(process_handle, module_base_vaddr+chained_pdata_off, &is_stale, pdata, endt_us) || + is_stale) + { + is_good = 0; + break; + } + } + } + } + + ////////////////////////////// + //- rjf: no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer + // + if(!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe)) ProfScope("no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer") + { + // rjf: read rip from stack pointer + U64 rsp = regs->rsp.u64; + U64 new_rip = 0; + if(!ctrl_process_memory_read_struct(process_handle, rsp, &is_stale, &new_rip, endt_us) || + is_stale) + { + is_good = 0; + } + + // rjf: commit registers + if(is_good) + { + U64 new_rsp = rsp + 8; + regs->rip.u64 = new_rip; + regs->rsp.u64 = new_rsp; + } + } + + ////////////////////////////// + //- rjf: fill & return + // + scratch_end(scratch); + CTRL_UnwindStepResult result = {0}; + if(!is_good) {result.flags |= CTRL_UnwindFlag_Error;} + if(is_stale) {result.flags |= CTRL_UnwindFlag_Stale;} + return result; +} + +//- rjf: abstracted full unwind + +internal CTRL_Unwind +ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + CTRL_Unwind unwind = { .flags = CTRL_UnwindFlag_Error }; + + //- rjf: unpack args + CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, thread); + CTRL_Entity *process_entity = thread_entity->parent; + Arch arch = thread_entity->arch; + U64 arch_reg_block_size = regs_block_size_from_arch(arch); + + //- rjf: grab initial register block + void *regs_block = ctrl_reg_block_from_thread(scratch.arena, ctx, thread); + B32 regs_block_good = (arch != Arch_Null && regs_block != 0); + + //- rjf: loop & unwind + CTRL_UnwindFrameNode *first_frame_node = 0; + CTRL_UnwindFrameNode *last_frame_node = 0; + U64 frame_node_count = 0; + if(regs_block_good) + { + for(unwind.flags = 0;;) + { + U64 rip = regs_rip_from_arch_block(arch, regs_block); + U64 rsp = regs_rsp_from_arch_block(arch, regs_block); + + // rjf: cancel on zero rip (except the top frame) + if(rip == 0 && frame_node_count > 0) + { + break; + } + + // rip -> module + CTRL_Entity *module_entity = ctrl_module_from_process_vaddr(process_entity, rip); + + // establish frame context + CTRL_FrameUnwindContext frame_ctx = {0}; + CTRL_UnwindStepResult frame_ctx_result = {0}; + switch(process_entity->target_os) + { + case OperatingSystem_Null:{}break; + case OperatingSystem_Windows: + { + // no concept of frame unwind context + }break; + case OperatingSystem_Linux: + { + frame_ctx_result = ctrl_establish_frame_unwind_context__dwarf(arena, process_entity->handle, module_entity->handle, arch, regs_block, endt_us, &frame_ctx); + }break; + case OperatingSystem_Mac: + { + NotImplemented; + }break; + default: { InvalidPath; }break; + } + unwind.flags |= frame_ctx_result.flags; + if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error)) + { + break; + } + + // rjf: valid step -> push frame + CTRL_UnwindFrameNode *frame_node = push_array(scratch.arena, CTRL_UnwindFrameNode, 1); + CTRL_UnwindFrame *frame = &frame_node->v; + frame->cfa = frame_ctx.cfa; + frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); + MemoryCopy(frame->regs, regs_block, arch_reg_block_size); + DLLPushBack(first_frame_node, last_frame_node, frame_node); + frame_node_count += 1; + + // rjf: unwind one step + CTRL_UnwindStepResult step_result = {0}; + switch(process_entity->target_os) + { + default:{}break; + case OperatingSystem_Windows: + { + switch(arch) + { + default:{}break; + case Arch_x64: + { + step_result = ctrl_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us); + }break; + } + }break; + case OperatingSystem_Linux: + { + step_result = ctrl_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us); + }break; + } + + // stop unwinding on errors or stale data + unwind.flags |= step_result.flags; + if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error) || + (regs_rsp_from_arch_block(arch, regs_block) == rsp && regs_rip_from_arch_block(arch, regs_block) == rip)) + { + break; + } + } + } + + //- rjf: bake frames list into result array + { + unwind.frames.count = frame_node_count; + unwind.frames.v = push_array(arena, CTRL_UnwindFrame, unwind.frames.count); + U64 idx = 0; + for(CTRL_UnwindFrameNode *n = first_frame_node; n != 0; n = n->next, idx += 1) + { + unwind.frames.v[idx] = n->v; + } + } + + scratch_end(scratch); + ProfEnd(); + return unwind; +} + +//////////////////////////////// +//~ rjf: Call Stack Building Functions + +internal CTRL_CallStack +ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *base_unwind) +{ + Temp scratch = scratch_begin(&arena, 1); + Access *access = access_open(); + Arch arch = process->arch; + CTRL_CallStack result = {0}; + { + typedef struct FrameNode FrameNode; + struct FrameNode + { + FrameNode *next; + CTRL_CallStackFrame v; + }; + + //- rjf: gather all frames + FrameNode *first_frame = 0; + FrameNode *last_frame = 0; + U64 frame_count = 0; + for(U64 base_frame_idx = 0; base_frame_idx < base_unwind->frames.count; base_frame_idx += 1) + { + // rjf: unpack + CTRL_UnwindFrame *src = &base_unwind->frames.v[base_frame_idx]; + U64 rip_vaddr = regs_rip_from_arch_block(arch, src->regs); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + RDI_Scope *scope = rdi_scope_from_voff(rdi, rip_voff); + + // rjf: build inline frames (minus parent & inline depth) + FrameNode *first_inline_frame = 0; + FrameNode *last_inline_frame = 0; + U64 inline_frame_count = 0; + for(RDI_Scope *s = scope; + s->inline_site_idx != 0; + s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx)) + { + FrameNode *dst_inline = push_array(scratch.arena, FrameNode, 1); + if(first_inline_frame == 0) + { + first_inline_frame = dst_inline; + } + last_inline_frame = dst_inline; + SLLQueuePush(first_frame, last_frame, dst_inline); + dst_inline->v.unwind_count = base_frame_idx; + dst_inline->v.regs = src->regs; + dst_inline->v.cfa = src->cfa; + frame_count += 1; + inline_frame_count += 1; + } + + // rjf: build concrete frame + FrameNode *dst_base = push_array(scratch.arena, FrameNode, 1); + SLLQueuePush(first_frame, last_frame, dst_base); + dst_base->v.unwind_count = base_frame_idx; + dst_base->v.regs = src->regs; + dst_base->v.cfa = src->cfa; + frame_count += 1; + + // rjf: hook up inline frames to point to concrete frame, and to account for inline depth + U64 inline_frame_idx = 0; + for(FrameNode *inline_frame = first_inline_frame; inline_frame != 0; inline_frame = inline_frame->next, inline_frame_idx += 1) + { + inline_frame->v.inline_depth = inline_frame_count - inline_frame_idx; + if(inline_frame == last_inline_frame) + { + break; + } + } + } + + //- rjf: package + result.frames_count = frame_count; + result.frames = push_array(arena, CTRL_CallStackFrame, result.frames_count); + result.concrete_frames_count = base_unwind->frames.count; + result.concrete_frames = push_array(arena, CTRL_CallStackFrame *, result.concrete_frames_count); + { + U64 idx = 0; + U64 concrete_idx = 0; + for(FrameNode *n = first_frame; n != 0; n = n->next, idx += 1) + { + MemoryCopyStruct(&result.frames[idx], &n->v); + if(n->v.inline_depth == 0 && concrete_idx < result.concrete_frames_count) + { + result.concrete_frames[concrete_idx] = &result.frames[idx]; + concrete_idx += 1; + } + } + } + } + access_close(access); + scratch_end(scratch); + return result; +} + +internal CTRL_CallStackFrame * +ctrl_call_stack_frame_from_unwind_and_inline_depth(CTRL_CallStack *call_stack, U64 unwind_count, U64 inline_depth) +{ + CTRL_CallStackFrame *f = 0; + { + U64 base_frame_idx = 0; + for(U64 idx = 0; idx < call_stack->frames_count; idx += 1) + { + if(call_stack->frames[idx].inline_depth == 0) + { + if(base_frame_idx == unwind_count) + { + f = &call_stack->frames[idx]; + break; + } + base_frame_idx += 1; + } + } + if(f != 0 && call_stack->frames + inline_depth < f) + { + f -= inline_depth; + } + } + return f; +} + +//////////////////////////////// +//~ rjf: Halting All Attached Processes + +internal void +ctrl_halt(void) +{ + dmn_halt(0, 0); +} + +//////////////////////////////// +//~ rjf: Shared Accessor Functions + +//- rjf: generation counters + +internal U64 +ctrl_run_gen(void) +{ + U64 result = ins_atomic_u64_eval(&ctrl_state->run_gen); + return result; +} + +internal U64 +ctrl_mem_gen(void) +{ + U64 result = ins_atomic_u64_eval(&ctrl_state->mem_gen); + return result; +} + +internal U64 +ctrl_reg_gen(void) +{ + U64 result = ins_atomic_u64_eval(&ctrl_state->reg_gen); + return result; +} + +//- rjf: name -> register/alias hash tables, for eval + +internal E_String2NumMap * +ctrl_string2reg_from_arch(Arch arch) +{ + return &ctrl_state->arch_string2reg_tables[arch]; +} + +internal E_String2NumMap * +ctrl_string2alias_from_arch(Arch arch) +{ + return &ctrl_state->arch_string2alias_tables[arch]; +} + +//////////////////////////////// +//~ rjf: Control-Thread Functions + +//- rjf: user -> control thread communication + +internal B32 +ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) +{ + Temp scratch = scratch_begin(0, 0); + String8 msgs_srlzed_baked = ctrl_serialized_string_from_msg_list(scratch.arena, msgs); + B32 good = 0; + MutexScope(ctrl_state->u2c_ring_mutex) for(;;) + { + U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); + U64 available_size = ctrl_state->u2c_ring_size-unconsumed_size; + U64 needed_size = sizeof(msgs_srlzed_baked.size) + msgs_srlzed_baked.size; + if(available_size >= needed_size) + { + ctrl_state->u2c_ring_write_pos += ring_write_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size); + ctrl_state->u2c_ring_write_pos += ring_write(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size); + good = 1; + break; + } + if(os_now_microseconds() >= endt_us) + { + break; + } + cond_var_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, endt_us); + } + if(good) + { + cond_var_broadcast(ctrl_state->u2c_ring_cv); + } + scratch_end(scratch); + return good; +} + +internal CTRL_MsgList +ctrl_u2c_pop_msgs(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 msgs_srlzed_baked = {0}; + MutexScope(ctrl_state->u2c_ring_mutex) for(;;) + { + U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); + if(unconsumed_size >= sizeof(U64)) + { + U64 size_to_decode = 0; + ctrl_state->u2c_ring_read_pos += ring_read_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, &size_to_decode); + msgs_srlzed_baked.size = size_to_decode; + msgs_srlzed_baked.str = push_array_no_zero(scratch.arena, U8, msgs_srlzed_baked.size); + ctrl_state->u2c_ring_read_pos += ring_read(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode); + break; + } + cond_var_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, max_U64); + } + cond_var_broadcast(ctrl_state->u2c_ring_cv); + CTRL_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked); + scratch_end(scratch); + return msgs; +} + +//- rjf: control -> user thread communication + +internal void +ctrl_c2u_push_events(CTRL_EventList *events) +{ + if(events->count != 0) ProfScope("ctrl_c2u_push_events") + { + MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + { + ctrl_entity_store_apply_events(ctrl_state->ctrl_thread_entity_store, events); + } + for(CTRL_EventNode *n = events->first; n != 0; n = n ->next) + { + Temp scratch = scratch_begin(0, 0); + String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, ctrl_state->c2u_ring_size-sizeof(U64)); + MutexScope(ctrl_state->c2u_ring_mutex) for(;;) + { + U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); + U64 available_size = ctrl_state->c2u_ring_size-unconsumed_size; + U64 needed_size = sizeof(event_srlzed.size) + event_srlzed.size; + if(available_size >= needed_size) + { + ctrl_state->c2u_ring_write_pos += ring_write_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, &event_srlzed.size); + ctrl_state->c2u_ring_write_pos += ring_write(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); + break; + } + cond_var_wait(ctrl_state->c2u_ring_cv, ctrl_state->c2u_ring_mutex, os_now_microseconds()+100); + } + cond_var_broadcast(ctrl_state->c2u_ring_cv); + if(ctrl_state->wakeup_hook != 0) + { + ctrl_state->wakeup_hook(); + } + scratch_end(scratch); + } + } +} + +internal CTRL_EventList +ctrl_c2u_pop_events(Arena *arena) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + CTRL_EventList events = {0}; + MutexScope(ctrl_state->c2u_ring_mutex) for(;;) + { + U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); + if(unconsumed_size >= sizeof(U64)) + { + U64 size_to_decode = 0; + ctrl_state->c2u_ring_read_pos += ring_read_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, &size_to_decode); + String8 event_srlzed = {0}; + event_srlzed.size = size_to_decode; + event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size); + ctrl_state->c2u_ring_read_pos += ring_read(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); + CTRL_Event *new_event = ctrl_event_list_push(arena, &events); + *new_event = ctrl_event_from_serialized_string(arena, event_srlzed); + } + else + { + break; + } + } + cond_var_broadcast(ctrl_state->c2u_ring_cv); + scratch_end(scratch); + ProfEnd(); + return events; +} + +//- rjf: entry point + +internal void +ctrl_thread__entry_point(void *p) +{ + ThreadNameF("ctrl_thread"); + ProfBeginFunction(); + DMN_CtrlCtx *ctrl_ctx = dmn_ctrl_begin(); + log_select(ctrl_state->ctrl_thread_log); + + //- rjf: loop + Temp scratch = scratch_begin(0, 0); + for(;;) + { + temp_end(scratch); + log_scope_begin(); + + //- rjf: get next messages + CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); + + //- rjf: process messages + DMN_CtrlExclusiveAccessScope + { + ins_atomic_u64_eval_assign(&ctrl_state->ctrl_thread_run_state, 1); + for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0; msg_n = msg_n->next) + { + CTRL_Msg *msg = &msg_n->v; + { + log_infof("user2ctrl_msg:{kind:\"%S\"}\n", ctrl_string_from_msg_kind(msg->kind)); + } + + //- rjf: reset per-message state + ProfScope("reset per-message state") + { + arena_clear(ctrl_state->ctrl_thread_msg_process_arena); + ctrl_state->module_req_cache_slots_count = 4096; + ctrl_state->module_req_cache_slots = push_array(ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode *, ctrl_state->module_req_cache_slots_count); + MemoryZeroStruct(&ctrl_state->msg_user_bp_touched_files); + MemoryZeroStruct(&ctrl_state->msg_user_bp_touched_symbols); + MemoryCopyArray(ctrl_state->exception_code_filters, msg->exception_code_filters); + } + + //- rjf: gather all touched symbols by user breakpoints + { + Temp scratch = scratch_begin(0, 0); + for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) + { + if(n->v.kind != CTRL_UserBreakpointKind_Expression) + { + continue; + } + E_Parse addr_parse = e_push_parse_from_string(scratch.arena, n->v.string); + E_Parse cnd_parse = e_push_parse_from_string(scratch.arena, n->v.condition); + E_Expr *exprs[] = {addr_parse.expr, cnd_parse.expr}; + for EachElement(idx, exprs) + { + typedef struct ExprWalkTask ExprWalkTask; + struct ExprWalkTask + { + ExprWalkTask *next; + E_Expr *expr; + }; + ExprWalkTask start_task = {0, exprs[idx]}; + ExprWalkTask *first_task = &start_task; + for(ExprWalkTask *t = first_task; t != 0; t = t->next) + { + E_Expr *expr = t->expr; + if(expr->ref != &e_expr_nil) + { + expr = expr->ref; + } + if(expr->kind == E_ExprKind_LeafIdentifier) + { + str8_list_push(ctrl_state->ctrl_thread_msg_process_arena, &ctrl_state->msg_user_bp_touched_symbols, expr->string); + } + if(expr->next != &e_expr_nil) + { + ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1); + task->expr = expr->next; + task->next = t->next; + t->next = task; + } + if(expr->first != &e_expr_nil) + { + ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1); + task->expr = expr->first; + task->next = t->next; + t->next = task; + } + } + } + } + scratch_end(scratch); + } + + + + + + //- rjf: gather all touched files by user breakpoints + for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) + { + if(n->v.kind != CTRL_UserBreakpointKind_FileNameAndLineColNumber) + { + continue; + } + str8_list_push(ctrl_state->ctrl_thread_msg_process_arena, &ctrl_state->msg_user_bp_touched_files, n->v.string); + } + + //- rjf: process message + switch(msg->kind) + { + case CTRL_MsgKind_Null: + case CTRL_MsgKind_COUNT:{}break; + + //- rjf: target operations + case CTRL_MsgKind_Launch: {ctrl_thread__launch (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; + case CTRL_MsgKind_KillAll: {ctrl_thread__kill_all (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; + case CTRL_MsgKind_Run: {ctrl_thread__run (ctrl_ctx, msg);}break; + case CTRL_MsgKind_SingleStep: {ctrl_thread__single_step (ctrl_ctx, msg);}break; + + //- rjf: configuration + case CTRL_MsgKind_SetUserEntryPoints: + { + arena_clear(ctrl_state->user_entry_point_arena); + MemoryZeroStruct(&ctrl_state->user_entry_points); + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + str8_list_push(ctrl_state->user_entry_point_arena, &ctrl_state->user_entry_points, n->string); + } + }break; + case CTRL_MsgKind_SetModuleDebugInfoPath: + { + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + String8 path = msg->path; + CTRL_Entity *module = ctrl_entity_from_handle(entity_ctx, msg->entity); + CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); + di_close(old_dbgi_key, 0); + MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + { + ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); + } + U64 new_dbgi_timestamp = os_properties_from_file_path(path).modified; + debug_info_path->timestamp = new_dbgi_timestamp; + DI_Key new_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, new_dbgi_timestamp); + di_open(new_dbgi_key); + CTRL_EventList evts = {0}; + CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = CTRL_EventKind_ModuleDebugInfoPathChange; + evt->entity = msg->entity; + evt->string = path; + evt->timestamp = new_dbgi_timestamp; + ctrl_c2u_push_events(&evts); + }break; + case CTRL_MsgKind_FreezeThread: + { + CTRL_EventList evts = {0}; + CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = CTRL_EventKind_ThreadFrozen; + evt->entity = msg->entity; + ctrl_c2u_push_events(&evts); + }break; + case CTRL_MsgKind_ThawThread: + { + CTRL_EventList evts = {0}; + CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = CTRL_EventKind_ThreadThawed; + evt->entity = msg->entity; + ctrl_c2u_push_events(&evts); + }break; + } + } + ins_atomic_u64_eval_assign(&ctrl_state->ctrl_thread_run_state, 0); + } + ins_atomic_u64_inc_eval(&ctrl_state->run_gen); + ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); + ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); + + //- rjf: update thread register cache + ProfScope("update thread register cache") + { + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityArray threads = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Thread); + REGS_RegBlockX64 *blocks = push_array(scratch.arena, REGS_RegBlockX64, threads.count); + { + for EachIndex(idx, threads.count) + { + Temp scratch = scratch_begin(0, 0); + ctrl_reg_block_from_thread(scratch.arena, entity_ctx, threads.v[idx]->handle); + scratch_end(scratch); + } + } + } + + //- rjf: gather & output logs + ctrl_thread__end_and_flush_log(); + } + + scratch_end(scratch); + ProfEnd(); +} + +//- rjf: breakpoint resolution + +internal void +ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +{ + if(user_bps->first == 0) { return; } + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + Access *access = eval_scope->access; + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_Entity *module_entity = ctrl_entity_from_handle(entity_ctx, module); + CTRL_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, CTRL_EntityKind_DebugInfoPath); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_entity); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + U64 base_vaddr = module_entity->vaddr_range.min; + for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) + { + CTRL_UserBreakpoint *bp = &n->v; + switch(bp->kind) + { + default:{}break; + + //- rjf: file:line-based breakpoints + case CTRL_UserBreakpointKind_FileNameAndLineColNumber: + { + // rjf: unpack & normalize + TxtPt pt = bp->pt; + String8 filename = bp->string; + String8 filename_normalized = push_str8_copy(scratch.arena, filename); + for(U64 idx = 0; idx < filename_normalized.size; idx += 1) + { + filename_normalized.str[idx] = lower_from_char(filename_normalized.str[idx]); + filename_normalized.str[idx] = correct_slash_from_char(filename_normalized.str[idx]); + } + + // rjf: filename -> src_id + U32 src_id = 0; + { + RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); + if(mapptr != 0) + { + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + src_id = ids[0]; + } + } + } + } + + // rjf: src_id * pt -> push + if(src_id != 0) + { + RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); + RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); + U32 voff_count = 0; + U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); + for(U32 i = 0; i < voff_count; i += 1) + { + U64 vaddr = voffs[i] + base_vaddr; + DMN_Trap trap = {process.dmn_handle, vaddr, (U64)bp}; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + } + }break; + + //- rjf: expression-based breakpoints + case CTRL_UserBreakpointKind_Expression: + { + String8 expr = bp->string; + E_Value value = e_value_from_string(expr); + if(value.u64 != 0 || bp->flags != 0) + { + DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; + trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags); + trap.size = bp->size; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + }break; + } + } + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +{ + for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) + { + CTRL_UserBreakpoint *bp = &n->v; + if(bp->kind == CTRL_UserBreakpointKind_Expression) + { + String8 expr = bp->string; + E_Value value = e_value_from_string(expr); + if(value.u64 != 0 || bp->flags != 0) + { + DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; + trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags); + trap.size = bp->size; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } + } + } +} + +internal void +ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out) +{ + CTRL_Entity *process = bp->parent; + DMN_Trap trap = + { + .process = process->handle.dmn_handle, + .vaddr = bp->vaddr_range.min, + .id = ((U64)bp|bit64), + .flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->bp_flags), + .size = (U32)dim_1u64(bp->vaddr_range), + }; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); +} + +//- rjf: module lifetime open/close work + +internal +MACHINE_OP_MEM_READ(ctrl_dmn_mem_read) +{ + U64 read = dmn_process_read(((CTRL_Handle *)ud)->dmn_handle, r1u64(addr, addr + buffer_size), buffer); + return read == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; +} + +internal void +ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) +{ + Temp scratch = scratch_begin(0,0); + + //- rjf: set up per-module info + Arena *arena = arena_alloc(); + U64 entry_point_voff = 0; + U32 rdi_dbg_time = 0; + Guid rdi_dbg_guid = {0}; + String8 exe_dbg_path = {0}; + String8 rdi_dbg_path = {0}; + String8 raddbg_data = {0}; + Rng1U64 raddbg_section_voff_range = {0}; + Rng1U64 raddbg_is_attached_section_voff_range = {0}; + PE_IntelPdata *pdatas = 0; + U64 pdatas_count = 0; + U32 pdb_dbg_time = 0; + U32 pdb_dbg_age = 0; + Guid pdb_dbg_guid = {0}; + String8 pdb_dbg_path = {0}; + U64 cfi_rebase = 0; + B32 is_unwind_eh = 0; + EH_FrameHdr eh_frame_hdr = {0}; + EH_PtrCtx eh_ptr_ctx = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; + + //- read module's signature bytes + U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); + U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); + dmn_process_read(process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); + + ////////////////////////////// + //- parse PE module + // + PE_DosMagic dos_magic = *(PE_DosMagic *)module_sig_bytes; + if(dos_magic == PE_DOS_MAGIC) + { + ProfScope("unpack relevant PE info") + { + B32 is_valid = 1; + + //- rjf: read DOS header + PE_DosHeader dos_header = {0}; + if(is_valid) + { + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min, &dos_header) || + dos_header.magic != PE_DOS_MAGIC) + { + is_valid = 0; + } + } + + //- rjf: read PE magic + U32 pe_magic = 0; + if(is_valid) + { + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || + pe_magic != PE_MAGIC) + { + is_valid = 0; + } + } + + //- rjf: read COFF header + U64 file_header_off = dos_header.coff_file_offset + sizeof(pe_magic); + COFF_FileHeader file_header = {0}; + if(is_valid) + { + if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + file_header_off, &file_header)) + { + is_valid = 0; + } + } + + //- rjf: unpack range of optional extension header + U32 opt_ext_size = file_header.optional_header_size; + Rng1U64 opt_ext_off_range = r1u64(file_header_off + sizeof(COFF_FileHeader), + file_header_off + sizeof(COFF_FileHeader) + opt_ext_size); + + //- rjf: read optional header + U64 entry_point = 0; + U32 data_dir_count = 0; + if(opt_ext_size > 0) + { + // rjf: read magic number + U16 opt_ext_magic = 0; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); + + // rjf: read info + U32 reported_data_dir_offset = 0; + U32 reported_data_dir_count = 0; + switch(opt_ext_magic) + { + case PE_PE32_MAGIC: + { + PE_OptionalHeader32 pe_optional = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + entry_point = pe_optional.entry_point_va; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + case PE_PE32PLUS_MAGIC: + { + PE_OptionalHeader32Plus pe_optional = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + entry_point = pe_optional.entry_point_va; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + } + + // rjf: find number of data directories + U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); + data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); + + // rjf: grab pdatas from exceptions section + if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) + { + PE_DataDirectory dir = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); + Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); + pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); + pdatas = push_array(arena, PE_IntelPdata, pdatas_count); + dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); + } + + // rjf: extract sections + U64 sec_array_off = opt_ext_off_range.max; + U64 sec_count = file_header.section_count; + COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); + dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); + + // rjf: grab entry point vaddr + entry_point_voff = entry_point; + + // rjf: grab data about debug info + if(data_dir_count > PE_DataDirectoryIndex_DEBUG) + { + // rjf: read data dir + PE_DataDirectory dir = {0}; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); + + U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); + for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) + { + // rjf: read debug directory + U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); + PE_DebugDirectory dbg_data = {0}; + dmn_process_read_struct(process.dmn_handle, dir_addr, &dbg_data); + + // rjf: extract external file info from codeview header + if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) + { + U32 cv_magic = 0; + dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv_magic); + switch(cv_magic) + { + default:break; + case PE_CODEVIEW_PDB20_MAGIC: + { + PE_CvHeaderPDB20 cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min+dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + pdb_dbg_time = cv.time_stamp; + pdb_dbg_age = cv.age; + pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + case PE_CODEVIEW_PDB70_MAGIC: + { + PE_CvHeaderPDB70 cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + pdb_dbg_guid = cv.guid; + pdb_dbg_age = cv.age; + pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + case PE_CODEVIEW_RDI_MAGIC: + { + PE_CvHeaderRDI cv; + U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + rdi_dbg_guid = cv.guid; + rdi_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + } + }break; + } + } + } + } + + // rjf: look for DWARF debug info + { + U64 symbol_array_off = file_header.symbol_table_foff; + U64 symbol_count = file_header.symbol_count; + if(symbol_array_off != 0) + { + exe_dbg_path = path; + } + } + + // rjf: extract copy of module's raddbg data + { + for EachIndex(idx, sec_count) + { + String8 section_name = str8_cstring((char *)sec[idx].name); + if(str8_match(section_name, str8_lit(".raddbg"), 0)) + { + raddbg_section_voff_range.min = sec[idx].voff; + raddbg_section_voff_range.max = sec[idx].voff + sec[idx].vsize; + } + else if(str8_match(section_name, str8_lit(".rdbgia"), 0)) + { + raddbg_is_attached_section_voff_range.min = sec[idx].voff; + raddbg_is_attached_section_voff_range.max = sec[idx].voff + sec[idx].vsize; + } + } + raddbg_data.size = dim_1u64(raddbg_section_voff_range); + raddbg_data.str = push_array(arena, U8, raddbg_data.size); + dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + raddbg_section_voff_range.min, + vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); + } + + // rjf: if we have a "raddbg is attached" section, mark the first byte as 1, to signify attachment + if(raddbg_is_attached_section_voff_range.max != raddbg_is_attached_section_voff_range.min) + { + U8 new_value = 1; + dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); + } + } + } + } + + ////////////////////////////// + //- parse ELF module + // + else if(str8_match(str8(module_sig_bytes, elf_magic_string.size), elf_magic_string, 0)) + { + U64 e_entry = 0; + ELF_Type e_type = ELF_Type_None; + { + U8 *elf_sig = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max)); + if(elf_sig == 0) { goto elf_exit; } + switch(elf_sig[ELF_Identifier_Class]) + { + default: + case ELF_Class_None:{}break; + case ELF_Class_32: + { + NotImplemented; + }break; + case ELF_Class_64: + { + ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr))); + if(ehdr == 0) { goto elf_exit; } + e_entry = ehdr->e_entry; + e_type = ehdr->e_type; + }break; + } + } + + if(e_type == ELF_Type_Dyn) + { + cfi_rebase = vaddr_range.min; + } + + // find and parse .eh_frame_hdr + Rng1U64 eh_frame_hdr_vrange = {0}; + String8 eh_frame_hdr_data = {0}; + { + void *phdrs_raw = dmn_process_read_raw(scratch.arena, process.dmn_handle, elf_phdr_vrange); + if(phdrs_raw == 0) { goto elf_exit; } + + if(elf_phdr_entsize == sizeof(ELF_Phdr32)) + { + NotImplemented; + } + else if(elf_phdr_entsize == sizeof(ELF_Phdr64)) + { + U64 elf_phcount = dim_1u64(elf_phdr_vrange) / elf_phdr_entsize; + ELF_Phdr64 *phdrs64 = phdrs_raw; + for EachIndex(phdr_idx, elf_phcount) + { + ELF_Phdr64 *phdr = phdrs64 + phdr_idx; + if(phdr->p_type == ELF_PType_GnuEHFrame) + { + eh_frame_hdr_vrange = r1u64(cfi_rebase + phdr->p_vaddr, cfi_rebase + phdr->p_vaddr + phdr->p_memsz); + eh_frame_hdr_data = dmn_process_read_block(arena, process.dmn_handle, eh_frame_hdr_vrange); + is_unwind_eh = 1; + break; + } + } + } + } + + // parse .eh_frame_hdr + Arch arch = ctrl_arch_from_process_handle(process); + eh_ptr_ctx.pc_vaddr = eh_frame_hdr_vrange.min; + eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min; + eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx); + + // set entry point + if (e_entry != 0) + { + entry_point_voff = e_entry - vaddr_range.min; + } + + // TODO: is there a way to detect DWARF in runtime ELF? + if(1) + { + exe_dbg_path = path; + } + elf_exit:; + } + + ////////////////////////////// + //- rjf: pick default initial debug info path + // + String8 initial_debug_info_path = str8_zero(); + { + String8 exe_folder = str8_chop_last_slash(path); + String8List dbg_path_candidates = {0}; + // + //~ TODO(rjf): @linux_port PLEASE READ RYAN vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + // + // TODO(rjf): trying "exe_folder/embedded_path" as the first option is only a valid + // heuristic on Windows, because we know that two absolute paths concatted together + // are necessarily invalid. however, on Linux, this is not the case - you could stitch + // two paths together and get a third path that is completely valid. so, in that case, + // we will need to infer if the path is relative, and then use either the embedded + // path as-is, or the exe-relative-path accordingly, depending on that. + // + if(rdi_dbg_path.size != 0) + { + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S/%S", exe_folder, rdi_dbg_path); + str8_list_push(scratch.arena, &dbg_path_candidates, rdi_dbg_path); + } + if(exe_dbg_path.size != 0) + { + str8_list_push(scratch.arena, &dbg_path_candidates, path); + } + if(pdb_dbg_path.size != 0) + { + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S/%S", exe_folder, pdb_dbg_path); + str8_list_push(scratch.arena, &dbg_path_candidates, pdb_dbg_path); + } + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.pdb", str8_chop_last_dot(path)); + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.pdb", path); + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.rdi", str8_chop_last_dot(path)); + str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.rdi", path); + for(String8Node *n = dbg_path_candidates.first; n != 0; n = n->next) + { + String8 candidate_path = n->string; + FileProperties props = os_properties_from_file_path(candidate_path); + if(props.modified != 0 && props.size != 0) + { + initial_debug_info_path = push_str8_copy(arena, path_normalized_from_string(scratch.arena, candidate_path)); + break; + } + } + } + + ////////////////////////////// + //- rjf: insert info into cache + // + { + U64 hash = ctrl_hash_from_handle(module); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeW(stripe->rw_mutex) + { + CTRL_ModuleImageInfoCacheNode *node = 0; + for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) + { + if(ctrl_handle_match(n->module, module)) + { + node = n; + break; + } + } + if(!node) + { + node = push_array(arena, CTRL_ModuleImageInfoCacheNode, 1); + DLLPushBack(slot->first, slot->last, node); + node->module = module; + node->arena = arena; + node->pdatas = pdatas; + node->pdatas_count = pdatas_count; + node->cfi_rebase = cfi_rebase; + node->is_unwind_eh = is_unwind_eh; + node->eh_frame_hdr = eh_frame_hdr; + node->eh_ptr_ctx = eh_ptr_ctx; + node->entry_point_voff = entry_point_voff; + node->initial_debug_info_path = initial_debug_info_path; + node->raddbg_attached_marker_voff = raddbg_is_attached_section_voff_range.min; + node->raddbg_data = str8_copy(arena, raddbg_data); + } + } + } + + scratch_end(scratch); +} + +internal void +ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range) +{ + ////////////////////////////// + //- rjf: evict module image info from cache + // + U64 raddbg_attached_marker_voff = 0; + { + U64 hash = ctrl_hash_from_handle(module); + U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeW(stripe->rw_mutex) + { + CTRL_ModuleImageInfoCacheNode *node = 0; + for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, module)) + { + node = n; + break; + } + } + if(node) + { + raddbg_attached_marker_voff = node->raddbg_attached_marker_voff; + DLLRemove(slot->first, slot->last, node); + arena_release(node->arena); + } + } + } + + ////////////////////////////// + //- rjf: write 0 at attachment market, to signify detachment + // + if(raddbg_attached_marker_voff != 0) + { + U8 new_value = 0; + dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_attached_marker_voff, &new_value); + } +} + +//- rjf: attached process running/event gathering + +internal DMN_Event * +ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof) +{ + ProfBeginFunction(); + DMN_Event *event = push_array(arena, DMN_Event, 1); + Temp scratch = scratch_begin(&arena, 1); + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + + //- rjf: loop -> try to get event, run, repeat + U64 spoof_old_ip_value = 0; + ProfScope("loop -> try to get event, run, repeat") for(B32 got_event = 0; got_event == 0;) + { + //- rjf: get next event + ProfScope("get next event") + { + // rjf: grab first event + DMN_EventNode *next_event_node = ctrl_state->first_dmn_event_node; + + // rjf: log event + if(next_event_node != 0) + { + DMN_Event *ev = &next_event_node->v; + LogInfoNamedBlockF("dmn_event") + { + log_infof("kind: %S\n", dmn_event_kind_string_table[ev->kind]); + log_infof("exception_kind: %S\n", dmn_exception_kind_string_table[ev->exception_kind]); + log_infof("process: [%I64u]\n", ev->process.u64[0]); + log_infof("thread: [%I64u]\n", ev->thread.u64[0]); + log_infof("module: [%I64u]\n", ev->module.u64[0]); + log_infof("arch: %S\n", string_from_arch(ev->arch)); + log_infof("address: 0x%I64x\n", ev->address); + log_infof("string: \"%S\"\n", ev->string); + log_infof("ip_vaddr: 0x%I64x\n", ev->instruction_pointer); + } + } + + // rjf: determine if we should filter + B32 should_filter_event = 0; + if(next_event_node != 0) + { + DMN_Event *ev = &next_event_node->v; + switch(ev->kind) + { + default:{}break; + case DMN_EventKind_Exception: + { + // NOTE(rjf): first chance exceptions -> try ignoring + should_filter_event = (ev->exception_repeated == 0 && (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)); + + // rjf: exception code -> kind + CTRL_ExceptionCodeKind code_kind = CTRL_ExceptionCodeKind_Null; + if(should_filter_event) + { + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(ctrl_exception_code_kind_code_table[k] == ev->code) + { + code_kind = k; + break; + } + } + } + + // rjf: exception code kind -> shouldn't stop? if so, do not filter + if(should_filter_event) + { + B32 shouldnt_filter = !!(ctrl_state->exception_code_filters[code_kind/64] & (1ull<<(code_kind%64))); + if(should_filter_event && shouldnt_filter) + { + should_filter_event = 0; + } + } + + // rjf: special case: be gracious with ASan modules or symbols if + // they do their cute little 0xc0000005 exception trick... + if(!should_filter_event && ev->code == 0xc0000005 && + (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) + { + Access *access = access_open(); + CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, ev->process)); + CTRL_Entity *module = &ctrl_entity_nil; + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Module) + { + module = child; + break; + } + } + if(module != &ctrl_entity_nil) + { + // rjf: determine base address of asan shadow space + U64 asan_shadow_base_vaddr = 0; + B32 asan_shadow_variable_exists_but_is_zero = 0; + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64); + RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables); + { + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, unparsed_map, &map); + String8 name = str8_lit("__asan_shadow_memory_dynamic_address"); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + RDI_Symbol *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]); + U64 global_var_voff = rdi_voff_from_location(global_var->location); + U64 global_var_vaddr = global_var_voff + module->vaddr_range.min; + Arch arch = process->arch; + U64 addr_size = bit_size_from_arch(arch)/8; + dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); + asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0); + } + } + } + + // rjf: determine if this was a read/write to the shadow space + B32 violation_in_shadow_space = 0; + if(asan_shadow_base_vaddr != 0) + { + U64 asan_shadow_space_size = TB(128)/8; + if(asan_shadow_base_vaddr <= ev->address && ev->address < asan_shadow_base_vaddr+asan_shadow_space_size) + { + violation_in_shadow_space = 1; + } + } + + // rjf: filter event if this violation occurred in asan's shadow space + if(violation_in_shadow_space || asan_shadow_variable_exists_but_is_zero) + { + should_filter_event = 1; + } + } + + access_close(access); + } + }break; + } + } + + // rjf: good event & unfiltered? -> pop from queue & grab as result + if(next_event_node != 0 && !should_filter_event) + { + got_event = 1; + SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); + MemoryCopyStruct(event, &next_event_node->v); + event->string = push_str8_copy(arena, event->string); + run_ctrls->ignore_previous_exception = 1; + } + + // rjf: good event but filtered? pop from queue + if(next_event_node != 0 && should_filter_event) + { + SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); + run_ctrls->ignore_previous_exception = 0; + } + } + + //- rjf: no event -> dmn_ctrl_run for a new one + if(got_event == 0) ProfScope("no event -> dmn_ctrl_run for a new one") + { + // rjf: prep spoof + B32 do_spoof = (spoof != 0 && dmn_handle_match(run_ctrls->single_step_thread, dmn_handle_zero())); + U64 size_of_spoof = 0; + if(do_spoof) ProfScope("prep spoof") + { + CTRL_Entity *spoof_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, spoof->process)); + Arch arch = spoof_process->arch; + size_of_spoof = bit_size_from_arch(arch)/8; + dmn_process_read(spoof_process->handle.dmn_handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); + } + + // rjf: set spoof + if(do_spoof) ProfScope("set spoof") + { + dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); + } + + // rjf: run for new events + ProfScope("run for new events") + { + LogInfoNamedBlockF("dmn_ctrl_run") + { + log_infof("single_step_thread: [0x%I64x]\n", run_ctrls->single_step_thread); + log_infof("ignore_previous_exception: %i\n", !!run_ctrls->ignore_previous_exception); + log_infof("run_entities_are_unfrozen: %i\n", !!run_ctrls->run_entities_are_unfrozen); + log_infof("run_entities_are_processes: %i\n", !!run_ctrls->run_entities_are_processes); + log_infof("run_entity_count: %I64u\n", run_ctrls->run_entity_count); + LogInfoNamedBlockF("run_entities") for(U64 idx = 0; idx < run_ctrls->run_entity_count; idx += 1) + { + log_infof("[0x%I64x]\n", run_ctrls->run_entities[idx]); + } + log_infof("trap_count: %I64u\n", run_ctrls->traps.trap_count); + LogInfoNamedBlockF("traps") for(DMN_TrapChunkNode *n = run_ctrls->traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + log_infof("{process:[0x%I64x], vaddr:0x%I64x, id:0x%I64x}\n", n->v[idx].process.u64[0], n->v[idx].vaddr, n->v[idx].id); + } + } + } + + DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls); + ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); + ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); + ins_atomic_u64_inc_eval(&ctrl_state->run_gen); + for(DMN_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next) + { + DMN_EventNode *dst_n = ctrl_state->free_dmn_event_node; + if(dst_n != 0) + { + SLLStackPop(ctrl_state->free_dmn_event_node); + } + else + { + dst_n = push_array(ctrl_state->dmn_event_arena, DMN_EventNode, 1); + } + MemoryCopyStruct(&dst_n->v, &src_n->v); + dst_n->v.string = push_str8_copy(ctrl_state->dmn_event_arena, dst_n->v.string); + SLLQueuePush(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node, dst_n); + } + } + + // rjf: unset spoof + if(do_spoof) ProfScope("unset spoof") + { + dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); + } + } + } + + //- rjf: irrespective of what event came back, we should ALWAYS check the + // spoof's thread and see if it hit the spoof address, because we may have + // simply been sent other debug events first + if(spoof != 0) + { + CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, spoof->thread)); + Arch arch = thread->arch; + void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch)); + dmn_thread_read_reg_block(spoof->thread, regs_block); + U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block); + if(spoof_thread_rip == spoof->new_ip_value) + { + regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value); + ctrl_thread_write_reg_block(ctrl_handle_make(CTRL_MachineID_Local, spoof->thread), regs_block); + } + } + + //- rjf: push ctrl events associated with this demon event + CTRL_EventList evts = {0}; + ProfScope("push ctrl events associated with this demon event") switch(event->kind) + { + default:{}break; + case DMN_EventKind_CreateProcess: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_NewProc; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->arch = event->arch; + out_evt->entity_id = event->code; + out_evt->tls_model = ctrl_dynamic_linker_type_from_dmn(event->tls_model); + out_evt->target_os = OperatingSystem_CURRENT; // TODO: operating system of the remote target machine + ctrl_state->process_counter += 1; + }break; + case DMN_EventKind_CreateThread: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_NewThread; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->arch = event->arch; + out_evt->entity_id = event->code; + out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); + out_evt->tls_root = dmn_tls_root_vaddr_from_thread(event->thread); + out_evt->rip_vaddr = event->instruction_pointer; + out_evt->string = event->string; + }break; + case DMN_EventKind_LoadModule: + { + CTRL_Handle process_handle = ctrl_handle_make(CTRL_MachineID_Local, event->process); + CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); + CTRL_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts); + String8 module_path = path_normalized_from_string(scratch.arena, event->string); + U64 exe_timestamp = os_properties_from_file_path(module_path).modified; + ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize); + out_evt1->kind = CTRL_EventKind_NewModule; + out_evt1->msg_id = msg->msg_id; + out_evt1->entity = module_handle; + out_evt1->parent = process_handle; + out_evt1->arch = event->arch; + out_evt1->entity_id = event->code; + out_evt1->vaddr_rng = r1u64(event->address, event->address+event->size); + out_evt1->rip_vaddr = event->address; + out_evt1->timestamp = exe_timestamp; + out_evt1->string = module_path; + out_evt1->tls_index = event->tls_index; + out_evt1->tls_offset = event->tls_offset; + CTRL_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts); + String8 initial_debug_info_path = ctrl_initial_debug_info_path_from_module(scratch.arena, module_handle); + U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified; + out_evt2->kind = CTRL_EventKind_ModuleDebugInfoPathChange; + out_evt2->msg_id = msg->msg_id; + out_evt2->entity = module_handle; + out_evt2->parent = process_handle; + out_evt2->timestamp = debug_info_timestamp; + out_evt2->string = initial_debug_info_path; + DI_Key initial_dbgi_key = di_key_from_path_timestamp(initial_debug_info_path, debug_info_timestamp); + di_open(initial_dbgi_key); + }break; + case DMN_EventKind_ExitProcess: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_EndProc; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->u64_code = event->code; + ctrl_state->process_counter -= 1; + }break; + case DMN_EventKind_ExitThread: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_EndThread; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->entity_id = event->code; + }break; + case DMN_EventKind_UnloadModule: + ProfScope("unload module %.*s", str8_varg(event->string)) + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); + CTRL_Entity *module_ent = ctrl_entity_from_handle(entity_ctx, module_handle); + CTRL_Entity *process_ent = ctrl_process_from_entity(module_ent); + String8 module_path = event->string; + ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range); + out_evt->kind = CTRL_EventKind_EndModule; + out_evt->msg_id = msg->msg_id; + out_evt->entity = module_handle; + out_evt->string = module_path; + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_ent); + di_close(dbgi_key, 0); + }break; + case DMN_EventKind_DebugString: + { + U64 num_strings = (event->string.size + ctrl_state->c2u_ring_max_string_size-1) / ctrl_state->c2u_ring_max_string_size; + for(U64 string_idx = 0; string_idx < num_strings; string_idx += 1) + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_DebugString; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->string = str8_substr(event->string, r1u64(string_idx*ctrl_state->c2u_ring_max_string_size, (string_idx+1)*ctrl_state->c2u_ring_max_string_size)); + } + }break; + case DMN_EventKind_SetThreadName: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_ThreadName; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->string = event->string; + out_evt->entity_id = event->code; + }break; + case DMN_EventKind_SetThreadColor: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_ThreadColor; + out_evt->msg_id = msg->msg_id; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->entity_id = event->code; + out_evt->rgba = event->user_data; + }break; + case DMN_EventKind_SetVAddrRangeNote: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_SetVAddrRangeNote; + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->msg_id = msg->msg_id; + out_evt->vaddr_rng = r1u64(event->address, event->address + event->size); + out_evt->string = event->string; + }break; + case DMN_EventKind_SetBreakpoint: + { + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_SetBreakpoint; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); + out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); + }break; + case DMN_EventKind_UnsetBreakpoint: + { + // TODO(rjf): this needs to be reflected in the resolved trap list too!!!!!!!! + CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = CTRL_EventKind_UnsetBreakpoint; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); + out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); + }break; + } + ctrl_c2u_push_events(&evts); + + //- rjf: if this is the first process in a session, clear the debug directory + // cache state + if(ctrl_state->process_counter == 1 && event->kind == DMN_EventKind_CreateProcess) + { + arena_clear(ctrl_state->dbg_dir_arena); + ctrl_state->dbg_dir_root = push_array(ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1); + } + + //- rjf: out of queued up demon events -> clear event arena + if(ctrl_state->first_dmn_event_node == 0) + { + ctrl_state->free_dmn_event_node = 0; + arena_clear(ctrl_state->dmn_event_arena); + } + + scratch_end(scratch); + ProfEnd(); + return(event); +} + +//- rjf: eval helpers + +internal U64 +ctrl_eval_space_gen(E_Space space) +{ + U64 result = 0; + switch(space.kind) + { + default:{}break; + case CTRL_EvalSpaceKind_Entity: + { + result = ctrl_mem_gen(); + }break; + } + return result; +} + +internal B32 +ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) +{ + B32 result = 0; + switch(space.kind) + { + default:{}break; + + //- rjf: intra-entity reads (process memory or thread registers) + case CTRL_EvalSpaceKind_Entity: + { + CTRL_Entity *entity = (CTRL_Entity *)space.u64_0; + switch(entity->kind) + { + default:{}break; + case CTRL_EntityKind_Process: + { + U64 read_size = dmn_process_read(entity->handle.dmn_handle, range, out); + result = (read_size == dim_1u64(range)); + }break; + case CTRL_EntityKind_Thread: + { + Temp scratch = scratch_begin(0, 0); + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + U64 regs_size = regs_block_size_from_arch(entity->arch); + void *regs = ctrl_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle); + Rng1U64 legal_range = r1u64(0, regs_size); + Rng1U64 read_range = intersect_1u64(legal_range, range); + U64 read_size = dim_1u64(read_range); + MemoryCopy(out, (U8 *)regs + read_range.min, read_size); + result = (read_size == dim_1u64(range)); + scratch_end(scratch); + }break; + } + }break; + } + return result; +} + +//- rjf: control thread eval scopes + +internal CTRL_EvalScope * +ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread) +{ + ProfBeginFunction(); + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EvalScope *scope = push_array(arena, CTRL_EvalScope, 1); + scope->access = access_open(); + + ////////////////////////////// + //- rjf: unpack thread + // + Arch arch = thread->arch; + U64 thread_rip_vaddr = dmn_rip_from_thread(thread->handle.dmn_handle); + CTRL_Entity *process = ctrl_process_from_entity(thread); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); + + ////////////////////////////// + //- rjf: gather evaluation debug infos & modules + // + U64 eval_modules_count = Max(1, entity_ctx->entity_kind_counts[CTRL_EntityKind_Module]); + E_Module *eval_modules = push_array(arena, E_Module, eval_modules_count); + E_Module *eval_modules_primary = &eval_modules[0]; + eval_modules_primary->vaddr_range = r1u64(0, max_U64); + U64 eval_dbg_infos_count = Max(1, entity_ctx->entity_kind_counts[CTRL_EntityKind_Module]); + E_DbgInfo *eval_dbg_infos = push_array(arena, E_DbgInfo, eval_dbg_infos_count); + E_DbgInfo *eval_dbg_infos_primary = &eval_dbg_infos[0]; + MemoryCopyStruct(eval_dbg_infos_primary, &e_dbg_info_nil); + { + U64 eval_module_idx = 0; + U64 eval_dbg_info_idx = 0; + for(CTRL_Entity *machine = entity_ctx->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) + { + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; + process != &ctrl_entity_nil; + process = process->next) + { + if(process->kind != CTRL_EntityKind_Process) { continue; } + for(CTRL_Entity *mod = process->first; + mod != &ctrl_entity_nil; + mod = mod->next) + { + if(mod->kind != CTRL_EntityKind_Module) { continue; } + DI_Key dbgi_key = ctrl_dbgi_key_from_module(mod); + + //- rjf: try to obtain this module's RDI + RDI_Parsed *rdi = di_rdi_from_key(scope->access, dbgi_key, 0, 0); + + //- rjf: if this RDI is not yet ready => determine if we need to wait for it + // + // (we *always* wait for the initial module) + // + B32 rdi_is_necessary = 1; + if(user_bps->count == 0) + { + rdi_is_necessary = 0; + } + else if(rdi == &rdi_parsed_nil) ProfScope("determine if RDI is necessary") + { + // rjf: find cached result + U64 hash = ctrl_hash_from_handle(mod->handle); + U64 slot_idx = hash%ctrl_state->module_req_cache_slots_count; + CTRL_ModuleReqCacheNode *slot = ctrl_state->module_req_cache_slots[slot_idx]; + CTRL_ModuleReqCacheNode *node = 0; + for(CTRL_ModuleReqCacheNode *n = slot; n != 0; n = n->next) + { + if(ctrl_handle_match(n->module, mod->handle)) + { + node = n; + break; + } + } + + // rjf: cached? -> take cached result + if(node != 0) + { + rdi_is_necessary = node->required; + } + + // rjf: not cached -> compute & store + else ProfScope("cache miss") + { + CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(mod, CTRL_EntityKind_DebugInfoPath); + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, debug_info_path->string); + ProfScope("determine if %.*s is necessary", str8_varg(debug_info_path->string)) + { + //- rjf: determine if file is PDB + B32 file_is_pdb = 0; + if(!file_is_pdb) + { + U8 msf70_magic_maybe[sizeof(msf_msf70_magic)] = {0}; + os_file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe); + if(MemoryMatch(msf70_magic_maybe, msf_msf70_magic, sizeof(msf70_magic_maybe))) + { + file_is_pdb = 1; + } + } + if(!file_is_pdb) + { + U8 msf20_magic_maybe[sizeof(msf_msf20_magic)] = {0}; + os_file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe); + if(MemoryMatch(msf20_magic_maybe, msf_msf20_magic, sizeof(msf20_magic_maybe))) + { + file_is_pdb = 1; + } + } + + //- rjf: file is PDB -> do thin parse & lookup of all breakpoint files/symbols. + // if any are found in the PDB, then this RDI is necessary. + if(file_is_pdb) + { + FileProperties props = os_properties_from_file(file); + OS_Handle map = os_file_map_open(OS_AccessFlag_Read, file); + void *file_base = os_file_map_view_open(map, OS_AccessFlag_Read, r1u64(0, props.size)); + String8 file_data = str8(file_base, props.size); + { + rdi_is_necessary = pdb_has_symbol_or_file_ref(file_data, ctrl_state->msg_user_bp_touched_symbols, ctrl_state->msg_user_bp_touched_files); + } + os_file_map_view_close(map, file_base, r1u64(0, props.size)); + os_file_map_close(map); + } + } + os_file_close(file); + node = push_array(ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode, 1); + node->next = slot; + ctrl_state->module_req_cache_slots[slot_idx] = node; + node->module = mod->handle; + node->required = rdi_is_necessary; + } + } + + //- rjf: if this RDI is necessary, but we do not have it => wait for it forever + if(rdi == &rdi_parsed_nil && rdi_is_necessary) ProfScope("RDI is necessary -> wait") + { + rdi = di_rdi_from_key(scope->access, dbgi_key, 1, max_U64); + } + + //- rjf: fill debug info + eval_dbg_infos[eval_dbg_info_idx].dbgi_key = dbgi_key; + eval_dbg_infos[eval_dbg_info_idx].rdi = rdi; + if(mod == module) + { + eval_dbg_infos_primary = &eval_dbg_infos[eval_dbg_info_idx]; + } + eval_dbg_info_idx += 1; + + //- rjf: fill evaluation module info + eval_modules[eval_module_idx].arch = arch; + eval_modules[eval_module_idx].dbg_info_num= (U32)eval_dbg_info_idx; + eval_modules[eval_module_idx].vaddr_range = mod->vaddr_range; + eval_modules[eval_module_idx].space = e_space_make(CTRL_EvalSpaceKind_Entity); + eval_modules[eval_module_idx].space.u64_0 = (U64)process; + if(mod == module) + { + eval_modules_primary = &eval_modules[eval_module_idx]; + } + eval_module_idx += 1; + } + } + } + } + + ////////////////////////////// + //- rjf: select evaluation cache + // + e_select_cache(ctrl_state->ctrl_thread_eval_cache); + + ////////////////////////////// + //- rjf: build base evaluation context + // + { + E_BaseCtx *ctx = &scope->base_ctx; + + //- rjf: fill instruction pointer info + ctx->thread_ip_vaddr = thread_rip_vaddr; + ctx->thread_ip_voff = thread_rip_voff; + ctx->thread_arch = thread->arch; + ctx->thread_reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->thread_reg_space.u64_0 = (U64)thread; + ctx->thread_process_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->thread_process_space.u64_0 = (U64)process; + + //- rjf: fill debug infos + ctx->dbg_infos = eval_dbg_infos; + ctx->dbg_infos_count = eval_dbg_infos_count; + ctx->primary_dbg_info = eval_dbg_infos_primary; + + //- rjf: fill modules + ctx->modules = eval_modules; + ctx->modules_count = eval_modules_count; + ctx->primary_module = eval_modules_primary; + + //- rjf: fill space hooks + ctx->space_gen = ctrl_eval_space_gen; + ctx->space_read = ctrl_eval_space_read; + } + e_select_base_ctx(&scope->base_ctx); + + ////////////////////////////// + //- rjf: build IR evaluation context + // + { + E_IRCtx *ctx = &scope->ir_ctx; + ctx->regs_map = ctrl_string2reg_from_arch(arch); + ctx->reg_alias_map = ctrl_string2alias_from_arch(arch); + ctx->locals_map = e_push_locals_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff); + ctx->member_map = e_push_member_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff); + ctx->macro_map = push_array(arena, E_String2ExprMap, 1); + ctx->macro_map[0] = e_string2expr_map_make(arena, 512); + ctx->auto_hook_map = push_array(arena, E_AutoHookMap, 1); + ctx->auto_hook_map[0] = e_auto_hook_map_make(arena, 512); + } + e_select_ir_ctx(&scope->ir_ctx); + + ////////////////////////////// + //- rjf: build eval interpretation context + // + { + E_InterpretCtx *ctx = &scope->interpret_ctx; + ctx->primary_space = eval_modules_primary->space; + ctx->reg_arch = eval_modules_primary->arch; + ctx->reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->reg_space.u64_0 = (U64)thread; + ctx->module_base = push_array(arena, U64, 1); + ctx->module_base[0]= module->vaddr_range.min; + ctx->frame_base = push_array(arena, U64, 1); + // TODO(rjf): need to compute this out here somehow... ctx->frame_base[0] = ; + ctx->tls_base = push_array(arena, U64, 1); + // TODO: compute CFA + ctx->cfa = 0; + } + e_select_interpret_ctx(&scope->interpret_ctx, eval_dbg_infos_primary->rdi, thread_rip_voff); + + ProfEnd(); + return scope; +} + +internal void +ctrl_thread__eval_scope_end(CTRL_EvalScope *scope) +{ + access_close(scope->access); +} + +//- rjf: log flusher + +internal void +ctrl_thread__end_and_flush_log(void) +{ + Temp scratch = scratch_begin(0, 0); + LogScopeResult log = log_scope_end(scratch.arena); + os_append_data_to_file_path(ctrl_state->ctrl_thread_log_path, log.strings[LogMsgKind_Info]); + if(log.strings[LogMsgKind_UserError].size != 0) + { + CTRL_EventList evts = {0}; + CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = CTRL_EventKind_Error; + evt->string = log.strings[LogMsgKind_UserError]; + ctrl_c2u_push_events(&evts); + } + scratch_end(scratch); +} + +//- rjf: msg kind implementations + +internal void +ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + Temp scratch = scratch_begin(0, 0); + + //- rjf: produce full stdout/stderr/stdin paths + String8 stdout_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stdout_path, msg->path); + String8 stdin_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stdin_path, msg->path); + String8 stderr_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stderr_path, msg->path); + + //- rjf: obtain stdout/stderr/stdin handles + OS_Handle stdout_handle = {0}; + OS_Handle stderr_handle = {0}; + OS_Handle stdin_handle = {0}; + if(stdout_path.size != 0) + { + OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path); + os_file_close(f); + stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stdout_path); + } + if(stderr_path.size != 0) + { + OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stderr_path); + os_file_close(f); + stderr_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stderr_path); + } + if(stdin_path.size != 0) + { + stdin_handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdin_path); + } + + //- rjf: launch + OS_ProcessLaunchParams params = {0}; + { + params.cmd_line = msg->cmd_line_string_list; + params.path = msg->path; + params.env = msg->env_string_list; + params.inherit_env = msg->env_inherit; + params.debug_subprocesses = msg->debug_subprocesses; + params.stdout_file = stdout_handle; + params.stderr_file = stderr_handle; + params.stdin_file = stdin_handle; + } + U32 id = dmn_ctrl_launch(ctrl_ctx, ¶ms); + + //- rjf: close stdout/stderr/stdin files + os_file_close(stdout_handle); + os_file_close(stderr_handle); + os_file_close(stdin_handle); + + //- rjf: record (id -> entry points), so that we know custom entry points for this PID + CTRL_EntityCtxRWStore *entity_ctx_rw_store = ctrl_state->ctrl_thread_entity_store; + MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + { + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + String8 string = n->string; + CTRL_Entity *entry = ctrl_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, CTRL_EntityKind_EntryPoint, Arch_Null, ctrl_handle_zero(), (U64)id); + ctrl_entity_equip_string(entity_ctx_rw_store, entry, string); + } + } + + scratch_end(scratch); +} + +internal void +ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + //- rjf: attach + B32 attach_successful = dmn_ctrl_attach(ctrl_ctx, msg->entity_id); + + //- rjf: run to handshake + if(attach_successful) + { + DMN_Handle unfrozen_process = {0}; + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities_are_processes = 1; + for(B32 done = 0; done == 0;) + { + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_CreateProcess: + { + unfrozen_process = event->process; + run_ctrls.run_entities = &unfrozen_process; + run_ctrls.run_entity_count = 1; + }break; + case DMN_EventKind_Halt: + case DMN_EventKind_Exception: + case DMN_EventKind_Error: + case DMN_EventKind_HandshakeComplete: + { + done = 1; + }break; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = CTRL_EventCause_Finished; + event->msg_id = msg->msg_id; + event->entity_id = !!attach_successful * msg->entity_id; + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DMN_Handle process = msg->entity.dmn_handle; + U32 exit_code = msg->exit_code; + + //- rjf: send kill + B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code); + + //- rjf: wait for process to be dead + CTRL_EventCause cause = CTRL_EventCause_Finished; + if(kill_worked) + { + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities_are_processes = 1; + run_ctrls.run_entities = &process; + run_ctrls.run_entity_count = 1; + for(B32 done = 0; done == 0;) + { + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_ExitProcess: + if(dmn_handle_match(event->process, process)) + { + done = 1; + }break; + case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break; + case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = cause; + event->msg_id = msg->msg_id; + if(kill_worked) + { + event->entity = msg->entity; + } + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + U32 exit_code = msg->exit_code; + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + + //- rjf: gather all currently existing processes + CTRL_EntityArray initial_processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process); + typedef struct Task Task; + struct Task + { + Task *next; + Task *prev; + CTRL_Entity *process; + }; + Task *first_task = 0; + Task *last_task = 0; + for EachIndex(idx, initial_processes.count) + { + CTRL_Entity *entity = initial_processes.v[idx]; + Task *t = push_array(scratch.arena, Task, 1); + t->process = entity; + DLLPushBack(first_task, last_task, t); + } + + //- rjf: kill processes as needed, wait for all processes to be dead + CTRL_EventCause cause = CTRL_EventCause_Finished; + if(first_task != 0) + { + DMN_RunCtrls run_ctrls = {0}; + for(B32 done = 0; !done;) + { + // rjf: kill remaining processes + for(Task *t = first_task, *next = 0; t != 0; t = next) + { + next = t->next; + B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, t->process->handle.dmn_handle, exit_code); + if(kill_worked) + { + DLLRemove(first_task, last_task, t); + } + } + + // rjf: get next event + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + + // rjf: process event + switch(event->kind) + { + default:{}break; + case DMN_EventKind_CreateProcess: + { + CTRL_Entity *new_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + Task *t = push_array(scratch.arena, Task, 1); + t->process = new_process; + DLLPushBack(first_task, last_task, t); + }break; + case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break; + case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break; + } + + // rjf: end if all processes are gone + CTRL_EntityArray processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process); + if(processes.count == 0) + { + done = 1; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = cause; + event->msg_id = msg->msg_id; + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DMN_Handle process = msg->entity.dmn_handle; + + //- rjf: detach + B32 detach_worked = dmn_ctrl_detach(ctrl_ctx, process); + + //- rjf: wait for process to be dead + if(detach_worked) + { + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities_are_processes = 1; + run_ctrls.run_entities = &process; + run_ctrls.run_entity_count = 1; + for(B32 done = 0; done == 0;) + { + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) + { + done = 1; + } + if(event->kind == DMN_EventKind_Halt) + { + done = 1; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = CTRL_EventCause_Finished; + event->msg_id = msg->msg_id; + if(detach_worked) + { + event->entity = msg->entity; + } + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + DMN_Event *stop_event = 0; + CTRL_EventCause stop_cause = CTRL_EventCause_Null; + CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_Handle target_thread = msg->entity; + CTRL_Handle target_process = msg->parent; + CTRL_Entity *target_process_entity = ctrl_entity_from_handle(entity_ctx, target_process); + U64 spoof_ip_vaddr = 911; + log_infof("ctrl_thread__run:\n{\n"); + + ////////////////////////////// + //- rjf: gather all initial breakpoints + // + DMN_TrapChunkList user_traps = {0}; + { + CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, target_thread); + CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); + for(CTRL_Entity *machine = entity_ctx->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) + { + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + { + if(process->kind != CTRL_EntityKind_Process) { continue; } + + // rjf: resolve module-dependent user bps + for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) + { + if(module->kind != CTRL_EntityKind_Module) { continue; } + ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, process->handle, module->handle, &msg->user_bps, &user_traps); + } + + // rjf: push process-declared breakpoins + for(CTRL_Entity *bp = process->first; bp != &ctrl_entity_nil; bp = bp->next) + { + if(bp->kind != CTRL_EntityKind_Breakpoint) { continue; } + ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &user_traps); + } + + // rjf: push virtual-address user breakpoints per-process + ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, process->handle, &msg->user_bps, &user_traps); + } + } + ctrl_thread__eval_scope_end(eval_scope); + } + + ////////////////////////////// + //- rjf: read initial stack-pointer-check value + // + // This MUST happen before any threads move, including single-stepping stuck + // threads, because otherwise, their stack pointer may change, if single-stepping + // causes e.g. entrance into a function via a call instruction. + // + U64 sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle); + log_infof("sp_check_value := 0x%I64x\n", sp_check_value); + + ////////////////////////////// + //- rjf: single step "stuck threads" + // + // "Stuck threads" are threads that are already on a User BP and would hit + // it immediately if resumed with all User BPs enabled. To get them "unstuck" + // we just need to single step them to get them off their current instruction. + // + // This only applies to threads OTHER THAN the target thread. If the target + // thread is on a user breakpoint, then we need to let trap net logic run, + // which may include features put on a trap net trap at the same address as + // the user breakpoint. + // + B32 target_thread_is_on_user_bp_and_trap_net_trap = 0; + if(stop_event == 0) + { + // rjf: gather stuck threads + DMN_HandleList stuck_threads = {0}; + for(CTRL_Entity *machine = entity_ctx->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) + { + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + { + if(process->kind != CTRL_EntityKind_Process) { continue; } + for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) + { + if(thread->kind != CTRL_EntityKind_Thread) { continue; } + U64 rip = dmn_rip_from_thread(thread->handle.dmn_handle); + + // rjf: determine if thread is frozen + B32 thread_is_frozen = thread->is_frozen; + + // rjf: not frozen? -> check if stuck & gather if so + if(!thread_is_frozen) + { + for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) + { + B32 is_on_user_bp = 0; + for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) + { + if(dmn_handle_match(trap_ptr->process, process->handle.dmn_handle) && trap_ptr->vaddr == rip) + { + is_on_user_bp = 1; + } + } + + B32 is_on_net_trap = 0; + for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) + { + if(n->v.vaddr == rip) + { + is_on_net_trap = 1; + } + } + + if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle))) + { + dmn_handle_list_push(scratch.arena, &stuck_threads, thread->handle.dmn_handle); + } + + if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle)) + { + target_thread_is_on_user_bp_and_trap_net_trap = 1; + } + } + } + } + } + } + + // rjf: actually step stuck threads + for(DMN_HandleNode *node = stuck_threads.first; + node != 0; + node = node->next) + { + DMN_Handle thread = node->v; + U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_post_rip = thread_pre_rip; + for(B32 done = 0; !done;) + { + log_infof("single_step_stuck_thread([0x%I64x])\n", thread.u64[0]); + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities = &thread; + run_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + run_ctrls.single_step_thread = thread; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(thread); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_ExitThread: + if(dmn_handle_match(event->thread, thread)) + { + stop_cause = CTRL_EventCause_Error; + goto stop; + }break; + case DMN_EventKind_Error: stop_cause = CTRL_EventCause_Error; goto stop; + case DMN_EventKind_Exception: stop_cause = CTRL_EventCause_InterruptedByException; goto stop; + case DMN_EventKind_Trap: stop_cause = CTRL_EventCause_InterruptedByTrap; goto stop; + case DMN_EventKind_Halt: stop_cause = CTRL_EventCause_InterruptedByHalt; goto stop; + stop:; + { + stop_event = event; + done = 1; + }break; + case DMN_EventKind_SingleStep: + { + done = dmn_handle_match(node->v, event->thread); + }break; + } + } + } + } + + ////////////////////////////// + //- rjf: gather frozen threads + // + CTRL_EntityList frozen_threads = {0}; + for(CTRL_Entity *machine = entity_ctx->root->first; + machine != &ctrl_entity_nil; + machine = machine->next) + { + if(machine->kind != CTRL_EntityKind_Machine) { continue; } + for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + { + if(process->kind != CTRL_EntityKind_Process) { continue; } + for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) + { + if(thread->is_frozen) + { + ctrl_entity_list_push(scratch.arena, &frozen_threads, thread); + } + } + } + } + + ////////////////////////////// + //- rjf: resolve trap net + // + DMN_TrapChunkList trap_net_traps = {0}; + for(CTRL_TrapNode *node = msg->traps.first; + node != 0; + node = node->next) + { + DMN_Trap trap = {target_process.dmn_handle, node->v.vaddr}; + dmn_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap); + } + + ////////////////////////////// + //- rjf: join user breakpoints and trap net traps + // + DMN_TrapChunkList joined_traps = {0}; + { + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &user_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps); + } + + ////////////////////////////// + //- rjf: record start + // + if(stop_event == 0) + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Started; + ctrl_c2u_push_events(&evts); + } + + ////////////////////////////// + //- rjf: run loop + // + if(stop_event == 0) + { + B32 spoof_mode = 0; + CTRL_Spoof spoof = {0}; + DMN_TrapChunkList entry_traps = {0}; + for(U64 run_loop_idx = 0;; run_loop_idx += 1) + { + ////////////////////////// + //- rjf: choose low level traps + // + DMN_TrapChunkList *trap_list = &joined_traps; + if(spoof_mode) + { + trap_list = &user_traps; + } + + ////////////////////////// + //- rjf: choose spoof + // + CTRL_Spoof *run_spoof = 0; + if(spoof_mode) + { + run_spoof = &spoof; + } + + ////////////////////////// + //- rjf: setup run controls + // + DMN_RunCtrls run_ctrls = {0}; + if(run_loop_idx == 0) + { + run_ctrls.priority_thread = target_thread.dmn_handle; + } + run_ctrls.ignore_previous_exception = 1; + run_ctrls.run_entity_count = frozen_threads.count; + run_ctrls.run_entities = push_array(scratch.arena, DMN_Handle, run_ctrls.run_entity_count); + run_ctrls.run_entities_are_unfrozen = 0; + { + U64 idx = 0; + for(CTRL_EntityNode *n = frozen_threads.first; n != 0; n = n->next) + { + run_ctrls.run_entities[idx] = n->v->handle.dmn_handle; + idx += 1; + } + } + run_ctrls.traps = *trap_list; + + ////////////////////////// + //- rjf: get next run-related event + // + log_infof("get_next_event:\n{\n"); + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, run_spoof); + log_infof("}\n\n"); + + ////////////////////////// + //- rjf: determine event handling + // + B32 launch_done_first_module = 0; + B32 hard_stop = 0; + CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + B32 use_stepping_logic = 0; + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: + case DMN_EventKind_Halt: + case DMN_EventKind_SingleStep: + case DMN_EventKind_Trap: + { + hard_stop = 1; + log_infof("step_rule: unexpected -> hard_stop\n"); + }break; + case DMN_EventKind_Exception: + case DMN_EventKind_Breakpoint: + { + use_stepping_logic = 1; + log_infof("step_rule: exception/breakpoint -> stepping_logic\n"); + }break; + case DMN_EventKind_CreateProcess: + { + CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, &ctrl_entity_nil); + { + DMN_TrapChunkList new_traps = {0}; + ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(CTRL_MachineID_Local, event->process), &msg->user_bps, &new_traps); + log_infof("step_rule: create_process -> resolve traps\n"); + log_infof("new_traps:\n{\n"); + for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + DMN_Trap *trap = &n->v[idx]; + log_infof("{process:[0x%I64x], vaddr:0x%I64x}\n", trap->process.u64[0], trap->vaddr); + } + } + log_infof("}\n\n"); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); + } + ctrl_thread__eval_scope_end(eval_scope); + }break; + case DMN_EventKind_LoadModule: + { + CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->thread)); + CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); + { + DMN_TrapChunkList new_traps = {0}; + ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(CTRL_MachineID_Local, event->process), ctrl_handle_make(CTRL_MachineID_Local, event->module), &msg->user_bps, &new_traps); + log_infof("step_rule: load_module -> resolve traps\n"); + log_infof("new_traps:\n{\n"); + for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + DMN_Trap *trap = &n->v[idx]; + log_infof("{process:[0x%I64x], vaddr:0x%I64x}\n", trap->process.u64[0], trap->vaddr); + } + } + log_infof("}\n\n"); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); + } + ctrl_thread__eval_scope_end(eval_scope); + }break; + case DMN_EventKind_SetBreakpoint: + { + CTRL_Entity *bp = &ctrl_entity_nil; + { + CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Breakpoint && + child->vaddr_range.min == event->address && + child->vaddr_range.max == event->address + event->size && + child->bp_flags == ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags)) + { + bp = child; + break; + } + } + } + if(bp != &ctrl_entity_nil) + { + DMN_TrapChunkList new_traps = {0}; + ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); + } + }break; + } + + ////////////////////////// + //- rjf: on launches, detect entry points, place traps + // + if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && !launch_done_first_module && event->kind == DMN_EventKind_HandshakeComplete) + { + launch_done_first_module = 1; + Access *access = access_open(); + + //- rjf: unpack process/module info + CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + CTRL_Entity *module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module); + U64 module_base_vaddr = module->vaddr_range.min; + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64); + RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, unparsed_map, &map); + + //- rjf: add traps for user-specified entry points on this message, if specified + B32 entries_found = 0; + if(!entries_found) + { + for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) + { + U32 procedure_id = 0; + { + String8 name = n->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + + //- rjf: add traps for module-baked entry points, if specified + if(!entries_found) + { + String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle); + U8 split_char = 0; + String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); + for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next) + { + String8 text = text_n->string; + MD_Node *root = md_tree_from_string(scratch.arena, text); + if(str8_match(root->first->string, str8_lit("entry_point"), 0)) + { + String8 name = root->first->first->string; + U32 procedure_id = 0; + { + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + } + + //- rjf: add traps for PID-correllated entry points + if(!entries_found) + { + for(CTRL_Entity *e = entity_ctx->root->first; e != &ctrl_entity_nil; e = e->next) + { + if(e->id == process->id) + { + U32 procedure_id = 0; + { + String8 name = e->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + } + + //- rjf: add traps for all custom user entry points + if(!entries_found) + { + for(String8Node *n = ctrl_state->user_entry_points.first; n != 0; n = n->next) + { + U32 procedure_id = 0; + { + String8 name = n->string; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + break; + } + } + } + + //- rjf: add traps for all high-level entry points + if(!entries_found) + { + String8 hi_entry_points[] = + { + str8_lit("WinMain"), + str8_lit("wWinMain"), + str8_lit("main"), + str8_lit("wmain"), + }; + for(U64 idx = 0; idx < ArrayCount(hi_entry_points); idx += 1) + { + U32 procedure_id = 0; + { + String8 name = hi_entry_points[idx]; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + + //- rjf: add trap for PE header entry + if(!entries_found) + { + U64 voff = ctrl_entry_point_voff_from_module(module->handle); + if(voff != 0) + { + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + + //- rjf: add traps for all low-level entry points + if(!entries_found) + { + String8 lo_entry_points[] = + { + str8_lit("WinMainCRTStartup"), + str8_lit("wWinMainCRTStartup"), + str8_lit("mainCRTStartup"), + str8_lit("wmainCRTStartup"), + }; + for(U64 idx = 0; idx < ArrayCount(lo_entry_points); idx += 1) + { + U32 procedure_id = 0; + { + String8 name = lo_entry_points[idx]; + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size); + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + procedure_id = ids[0]; + } + } + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id); + U64 voff = rdi_first_voff_from_procedure(rdi, procedure); + if(voff != 0) + { + entries_found = 1; + DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); + } + } + } + + //- rjf: no entry point found -> done + if(entry_traps.trap_count == 0) + { + hard_stop = 1; + } + + //- rjf: found entry points -> add to joined traps + dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &entry_traps); + + access_close(access); + } + + ////////////////////////// + //- rjf: unpack info about thread attached to event + // + CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->thread)); + CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + Arch arch = thread->arch; + U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + + ////////////////////////// + //- rjf: extract module-dependent info + // + U64 thread_rip_voff = thread_rip_vaddr - module->vaddr_range.min; + + ////////////////////////// + //- rjf: stepping logic + // + //{ + + ////////////////////////// + //- rjf: handle if hitting a spoof + // + B32 exception_stop = 0; + B32 hit_spoof = 0; + if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Exception) + { + if(spoof_mode && + dmn_handle_match(target_process.dmn_handle, event->process) && + dmn_handle_match(target_thread.dmn_handle, event->thread) && + spoof.new_ip_value == event->address) + { + hit_spoof = 1; + log_infof("hit_spoof\n"); + } + else + { + exception_stop = 1; + use_stepping_logic = 0; + } + } + + //- rjf: handle spoof hit + if(hit_spoof) + { + log_infof("exit_spoof_mode\n"); + + // rjf: clear spoof mode + spoof_mode = 0; + MemoryZeroStruct(&spoof); + + // rjf: skip remainder of handling + use_stepping_logic = 0; + } + + //- rjf: for breakpoint events, gather bp info + B32 hit_entry = 0; + B32 hit_user_bp = 0; + B32 hit_trap_net_bp = 0; + B32 hit_conditional_bp_but_filtered = 0; + CTRL_TrapFlags hit_trap_flags = 0; + if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Breakpoint) + ProfScope("for breakpoint events, gather bp info") + { + Temp temp = temp_begin(scratch.arena); + String8List conditions = {0}; + + // rjf: entry breakpoints + for(DMN_TrapChunkNode *n = entry_traps.first; n != 0; n = n->next) + { + DMN_Trap *trap = n->v; + DMN_Trap *opl = n->v + n->count; + for(;trap < opl; trap += 1) + { + if(dmn_handle_match(trap->process, event->process) && trap->vaddr == event->instruction_pointer) + { + hit_entry = 1; + } + } + } + + // rjf: user breakpoints + { + if(event->user_data != 0) + { + hit_user_bp = 1; + } + for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next) + { + DMN_Trap *trap = n->v; + DMN_Trap *opl = n->v + n->count; + for(;trap < opl; trap += 1) + { + if(dmn_handle_match(trap->process, event->process) && + trap->vaddr == event->instruction_pointer && + (!dmn_handle_match(event->thread, target_thread.dmn_handle) || !target_thread_is_on_user_bp_and_trap_net_trap)) + { + CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)trap->id; + hit_user_bp = 1; + if(user_bp != 0 && !(trap->id & bit64) && user_bp->condition.size != 0) + { + str8_list_push(temp.arena, &conditions, user_bp->condition); + } + } + } + } + } + + // rjf: programmatic user breakpoints (we do not have state for it, + // but the target program(s) did something breakpoint-like, and we + // want to treat it as if we did) + if(event->address != 0) + { + hit_user_bp = 1; + } + + // rjf: evaluate hit stop conditions + if(conditions.node_count != 0) ProfScope("evaluate hit stop conditions") + { + CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(temp.arena, &msg->user_bps, thread); + for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) + { + // rjf: evaluate + E_Eval eval = zero_struct; + ProfScope("evaluate expression") + { + eval = e_eval_from_string(condition_n->string); + } + + // rjf: interpret evaluation + if(eval.code == E_InterpretationCode_Good && eval.value.u64 == 0) + { + hit_user_bp = 0; + hit_conditional_bp_but_filtered = 1; + log_infof("conditional_breakpoint_hit: 'condition eval'd to 0, and so filtered'\n"); + } + else + { + hit_user_bp = 1; + hit_conditional_bp_but_filtered = 0; + log_infof("conditional_breakpoint_hit: 'conditional eval'd to nonzero, hit'\n"); + break; + } + } + ctrl_thread__eval_scope_end(eval_scope); + } + + // rjf: gather trap net hits + ProfScope("gather trap net hits") + { + if(!hit_user_bp && dmn_handle_match(event->process, target_process.dmn_handle)) + { + for(CTRL_TrapNode *node = msg->traps.first; + node != 0; + node = node->next) + { + if(node->v.vaddr == event->instruction_pointer) + { + hit_trap_net_bp = 1; + hit_trap_flags |= node->v.flags; + } + } + } + } + + log_infof("user_breakpoint_hit: %i\n", hit_user_bp); + log_infof("entry_point_hit: %i\n", hit_entry); + temp_end(temp); + } + + //- rjf: hit conditional user bp but filtered -> single step + B32 cond_bp_single_step_stop = 0; + CTRL_EventCause cond_bp_single_step_stop_cause = CTRL_EventCause_Null; + if(hit_conditional_bp_but_filtered) LogInfoNamedBlockF("conditional_bp_hit_single_step") + { + DMN_Handle thread = event->thread; + U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_post_rip = thread_pre_rip; + for(B32 single_step_done = 0; !single_step_done;) + { + DMN_RunCtrls single_step_ctrls = {0}; + single_step_ctrls.run_entities_are_unfrozen = 1; + single_step_ctrls.run_entities = &thread; + single_step_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + single_step_ctrls.single_step_thread = thread; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(thread); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: + { + cond_bp_single_step_stop = 1; + single_step_done = 1; + use_stepping_logic = 0; + cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + case DMN_EventKind_SingleStep: + { + single_step_done = dmn_handle_match(event->thread, thread); + cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + } + } + } + + //- rjf: hit entry points on *any thread* cause a stop, if this msg says as such + B32 entry_stop = 0; + if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && hit_entry) + { + entry_stop = 1; + use_stepping_logic = 0; + } + + //- rjf: user breakpoints on *any thread* cause a stop + B32 user_bp_stop = 0; + if(!hard_stop && use_stepping_logic && hit_user_bp) + { + user_bp_stop = 1; + use_stepping_logic = 0; + } + + //- rjf: trap net on off-target threads are ignored + B32 step_past_trap_net = 0; + if(!hard_stop && use_stepping_logic && hit_trap_net_bp) + { + if(!dmn_handle_match(event->thread, target_thread.dmn_handle)) + { + step_past_trap_net = 1; + use_stepping_logic = 0; + } + } + + //- rjf: trap net on on-target threads trigger trap net logic + B32 use_trap_net_logic = 0; + if(!hard_stop && use_stepping_logic && hit_trap_net_bp) + { + if(dmn_handle_match(event->thread, target_thread.dmn_handle)) + { + use_trap_net_logic = 1; + } + } + + //- rjf: trap net logic: stack pointer check + B32 stack_pointer_matches = 0; + if(use_trap_net_logic) + { + U64 sp = dmn_rsp_from_thread(target_thread.dmn_handle); + stack_pointer_matches = (sp == sp_check_value); + } + + //- rjf: trap net logic: single step after hit + B32 single_step_stop = 0; + CTRL_EventCause single_step_stop_cause = CTRL_EventCause_Null; + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & CTRL_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF("trap_net__single_step_after_hit") + { + U64 thread_pre_rip = dmn_rip_from_thread(target_thread.dmn_handle); + U64 thread_post_rip = thread_pre_rip; + for(B32 single_step_done = 0; single_step_done == 0;) + { + DMN_RunCtrls single_step_ctrls = {0}; + single_step_ctrls.run_entities_are_unfrozen = 1; + single_step_ctrls.run_entities = &target_thread.dmn_handle; + single_step_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + single_step_ctrls.single_step_thread = target_thread.dmn_handle; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(target_thread.dmn_handle); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: + { + single_step_stop = 1; + single_step_done = 1; + use_stepping_logic = 0; + use_trap_net_logic = 0; + single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + case DMN_EventKind_SingleStep: + { + single_step_done = dmn_handle_match(event->thread, target_thread.dmn_handle); + single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + } + } + } + } + + //- rjf: trap net logic: begin spoof mode + B32 begin_spoof_mode = 0; + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & CTRL_TrapFlag_BeginSpoofMode) LogInfoNamedBlockF("trap_net__begin_spoof_mode") + { + // rjf: setup spoof mode + begin_spoof_mode = 1; + U64 spoof_sp = dmn_rsp_from_thread(target_thread.dmn_handle); + spoof_mode = 1; + spoof.process = target_process.dmn_handle; + spoof.thread = target_thread.dmn_handle; + spoof.vaddr = spoof_sp; + spoof.new_ip_value = spoof_ip_vaddr; + log_infof("spoof:{process:[0x%I64x], thread:[0x%I64x], vaddr:0x%I64x, new_ip_value:0x%I64x}\n", spoof.process.u64[0], spoof.thread.u64[0], spoof.vaddr, spoof.new_ip_value); + } + } + + //- rjf: trap net logic: save stack pointer + B32 save_stack_pointer = 0; + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & CTRL_TrapFlag_SaveStackPointer) + { + if(stack_pointer_matches) LogInfoNamedBlockF("trap_net__save_sp") + { + save_stack_pointer = 1; + sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle); + log_infof("sp_check_value = 0x%I64x\n", sp_check_value); + } + } + } + + //- rjf: trap net logic: end stepping + B32 trap_net_stop = 0; + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & CTRL_TrapFlag_EndStepping) LogInfoNamedBlockF("trap_net__end_step") + { + if((hit_trap_flags & CTRL_TrapFlag_IgnoreStackPointerCheck) || + stack_pointer_matches) + { + trap_net_stop = 1; + use_trap_net_logic = 0; + } + } + } + + //} + // + //- rjf: stepping logic + //////////////////////////////// + + //- rjf: handle step past trap net + B32 step_past_trap_net_stop = 0; + CTRL_EventCause step_past_trap_net_stop_cause = CTRL_EventCause_Null; + if(step_past_trap_net) LogInfoNamedBlockF("trap_net__single_step_past_trap_net") + { + DMN_Handle thread = event->thread; + U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_post_rip = thread_pre_rip; + for(B32 single_step_done = 0; single_step_done == 0;) + { + DMN_RunCtrls single_step_ctrls = {0}; + single_step_ctrls.run_entities_are_unfrozen = 1; + single_step_ctrls.run_entities = &thread; + single_step_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + single_step_ctrls.single_step_thread = thread; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(thread); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: + case DMN_EventKind_Exception: + case DMN_EventKind_Halt: + case DMN_EventKind_Trap: + { + step_past_trap_net_stop = 1; + single_step_done = 1; + step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + case DMN_EventKind_SingleStep: + { + single_step_done = dmn_handle_match(event->thread, thread); + step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + }break; + } + } + } + + //- rjf: loop exit condition + CTRL_EventCause stage_stop_cause = CTRL_EventCause_Null; + if(hard_stop) + { + stage_stop_cause = hard_stop_cause; + } + else if(cond_bp_single_step_stop) + { + stage_stop_cause = cond_bp_single_step_stop_cause; + } + else if(single_step_stop) + { + stage_stop_cause = single_step_stop_cause; + } + else if(step_past_trap_net_stop) + { + stage_stop_cause = step_past_trap_net_stop_cause; + } + else if(exception_stop) + { + stage_stop_cause = CTRL_EventCause_InterruptedByException; + } + else if(user_bp_stop) + { + stage_stop_cause = CTRL_EventCause_UserBreakpoint; + } + else if(entry_stop) + { + stage_stop_cause = CTRL_EventCause_EntryPoint; + } + else if(trap_net_stop) + { + stage_stop_cause = CTRL_EventCause_Finished; + } + log_infof("stop_cause: %i\n", stage_stop_cause); + if(stage_stop_cause != CTRL_EventCause_Null) + { + stop_event = event; + stop_cause = stage_stop_cause; + break; + } + } + } + + ////////////////////////////// + //- rjf: record stop + // + if(stop_event != 0) + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = stop_cause; + event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread); + event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process); + event->exception_code = stop_event->code; + event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind); + event->vaddr_rng = r1u64(stop_event->address, stop_event->address); + event->rip_vaddr = stop_event->instruction_pointer; + if(stop_cause == CTRL_EventCause_UserBreakpoint && stop_event->user_data != 0) + { + if(!(stop_event->user_data & bit64)) + { + CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)stop_event->user_data; + event->u64_code = user_bp->id; + } + } + ctrl_c2u_push_events(&evts); + } + + log_infof("}\n\n"); + scratch_end(scratch); + ProfEnd(); +} + +internal void +ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(0, 0); + + //- rjf: record start + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Started; + ctrl_c2u_push_events(&evts); + } + + //- rjf: single step + DMN_Handle thread = msg->entity.dmn_handle; + B32 thread_is_valid = !dmn_handle_match(thread, dmn_handle_zero()); + DMN_Event *stop_event = 0; + CTRL_EventCause stop_cause = CTRL_EventCause_Null; + if(thread_is_valid) + { + U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_post_rip = thread_pre_rip; + for(B32 done = 0; done == 0;) + { + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities = &thread; + run_ctrls.run_entity_count = 1; + if(thread_post_rip == thread_pre_rip) + { + run_ctrls.single_step_thread = msg->entity.dmn_handle; + } + DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + thread_post_rip = dmn_rip_from_thread(msg->entity.dmn_handle); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_Error: {stop_cause = CTRL_EventCause_Error;}goto end_single_step; + case DMN_EventKind_Exception: {stop_cause = CTRL_EventCause_InterruptedByException;}goto end_single_step; + case DMN_EventKind_Halt: {stop_cause = CTRL_EventCause_InterruptedByHalt;}goto end_single_step; + case DMN_EventKind_Trap: {stop_cause = CTRL_EventCause_InterruptedByTrap;}goto end_single_step; + case DMN_EventKind_Breakpoint: {stop_cause = CTRL_EventCause_UserBreakpoint;}goto end_single_step; + case DMN_EventKind_SingleStep: {stop_cause = CTRL_EventCause_Finished;}goto end_single_step; + end_single_step: + { + stop_event = event; + done = 1; + }break; + } + } + } + + //- rjf: record stop + { + CTRL_EventList evts = {0}; + CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = CTRL_EventKind_Stopped; + event->cause = stop_cause; + if(stop_event != 0) + { + event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread); + event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process); + event->exception_code = stop_event->code; + event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind); + event->vaddr_rng = r1u64(stop_event->address, stop_event->address); + event->rip_vaddr = stop_event->instruction_pointer; + } + ctrl_c2u_push_events(&evts); + } + + scratch_end(scratch); + ProfEnd(); +} + +//////////////////////////////// +//~ rjf: Process Memory Artifact Cache Hooks / Lookups + +internal AC_Artifact +ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +{ + AC_Artifact artifact = {0}; + { + //- rjf: unpack key + CTRL_Handle process = {0}; + Rng1U64 vaddr_range = {0}; + B32 zero_terminated = 0; + { + U64 key_read_off = 0; + key_read_off += str8_deserial_read_struct(key, key_read_off, &process); + key_read_off += str8_deserial_read_struct(key, key_read_off, &vaddr_range); + key_read_off += str8_deserial_read_struct(key, key_read_off, &zero_terminated); + } + + //- rjf: clamp vaddr range + Rng1U64 vaddr_range_clamped = vaddr_range; + { + vaddr_range_clamped.max = Max(vaddr_range_clamped.max, vaddr_range_clamped.min); + U64 max_size_cap = Min(max_U64-vaddr_range_clamped.min, GB(1)); + vaddr_range_clamped.max = Min(vaddr_range_clamped.max, vaddr_range_clamped.min+max_size_cap); + } + + //- rjf: do read + U64 range_size = dim_1u64(vaddr_range_clamped); + Arena *range_arena = 0; + void *range_base = 0; + U64 zero_terminated_size = 0; + U64 pre_read_mem_gen = ctrl_mem_gen(); + B32 pre_run_state = ins_atomic_u64_eval(&ctrl_state->ctrl_thread_run_state); + if(range_size != 0) + { + // rjf: set up arena + U64 page_size = os_get_system_info()->page_size; // TODO(rjf): @page_size_from_process + U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, page_size); + range_arena = arena_alloc(.reserve_size = range_size+ARENA_HEADER_SIZE, .commit_size = range_size+ARENA_HEADER_SIZE); + + // rjf: if we got an arena -> push buffer & read + if(range_arena != 0) + { + // rjf: read as much as possible + range_base = push_array_no_zero(range_arena, U8, range_size); + U64 bytes_read = 0; + U64 retry_count = 0; + U64 retry_limit = range_size > page_size ? 64 : 0; + for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped; + retry_count <= retry_limit; + retry_count += 1) + { + bytes_read = dmn_process_read(process.dmn_handle, vaddr_range_clamped_retry, range_base); + if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min) + { + U64 diff = (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2; + vaddr_range_clamped_retry.max -= diff; + vaddr_range_clamped_retry.max = AlignDownPow2(vaddr_range_clamped_retry.max, page_size); + if(diff == 0) + { + break; + } + } + else + { + break; + } + } + + // rjf: if we read nothing, release arena + if(bytes_read == 0) + { + arena_release(range_arena); + range_base = 0; + range_arena = 0; + } + + // rjf: if we only got a partial read, zero the rest + else if(bytes_read < range_size) + { + MemoryZero((U8 *)range_base + bytes_read, range_size-bytes_read); + } + + // rjf: determine final size; zero terminate if needed; pop any unneeded bytes if zero-terminating + zero_terminated_size = bytes_read; + if(zero_terminated && range_base != 0) + { + for(U64 idx = 0; idx < bytes_read; idx += 1) + { + if(((U8 *)range_base)[idx] == 0) + { + zero_terminated_size = idx; + break; + } + } + U64 bytes_overkill = (bytes_read - zero_terminated_size); + arena_pop(range_arena, bytes_overkill); + } + } + } + U64 post_read_mem_gen = ctrl_mem_gen(); + B32 post_run_state = ins_atomic_u64_eval(&ctrl_state->ctrl_thread_run_state); + + //- rjf: form content key + C_Key content_key = {0}; + { + content_key.id.u128[0] = u128_hash_from_str8(key); + } + + //- rjf: determine if we have any history for this key + B32 key_has_history = 0; + { + U128 last_hash = c_hash_from_key(content_key, 0); + if(!u128_match(last_hash, u128_zero())) + { + key_has_history = 1; + } + } + + //- rjf: read successful, OR we have no history -> submit to hash store + U128 hash = {0}; + if((zero_terminated_size > 0 || !key_has_history) && range_base != 0 && range_size != 0 && pre_read_mem_gen == post_read_mem_gen) + { + hash = c_submit_data(content_key, &range_arena, str8((U8 *)range_base, zero_terminated_size)); + gen_out[0] = pre_read_mem_gen; + } + + //- rjf: wakeup on new submissions + if(!u128_match(u128_zero(), hash)) + { + if(ctrl_state->wakeup_hook != 0) + { + ctrl_state->wakeup_hook(); + } + } + + //- rjf: always release leftover arenas + if(range_arena != 0) + { + arena_release(range_arena); + } + + //- rjf: retry on mem gen "tearing", and if the range is non-empty + if(pre_read_mem_gen != post_read_mem_gen && range_size != 0) + { + retry_out[0] = 1; + } + + //- rjf: bundle content key as artifact + StaticAssert(sizeof(content_key) == sizeof(artifact), artifact_key_size_check); + MemoryCopyStruct(&artifact, &content_key); + } + return artifact; +} + +internal void +ctrl_memory_artifact_destroy(AC_Artifact artifact) +{ + C_Key key = {0}; + MemoryCopyStruct(&key, &artifact); + c_close_key(key); +} + +internal C_Key +ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale) +{ + ProfBeginFunction(); +#pragma pack(push, 1) + struct + { + CTRL_Handle process; + Rng1U64 vaddr_range; + B32 zero_terminated; + } key_data = {process, vaddr_range, zero_terminated}; +#pragma pack(pop) + String8 key = str8_struct(&key_data); + Access *access = access_open(); + AC_Artifact artifact = ac_artifact_from_key(access, key, ctrl_memory_artifact_create, ctrl_memory_artifact_destroy, endt_us, + .flags = AC_Flag_HighPriority | (wait_for_fresh ? AC_Flag_WaitForFresh : 0), + .gen = ctrl_mem_gen(), + .slots_count = 2048, + .stale_out = out_is_stale, + .evict_threshold_us = 10000000); + C_Key content_key = {0}; + MemoryCopyStruct(&content_key, &artifact); + access_close(access); + ProfEnd(); + return content_key; +} + +//- rjf: process memory reading helpers + +internal CTRL_ProcessMemorySlice +ctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us) +{ + ProfBeginFunction(); + CTRL_ProcessMemorySlice result = {0}; + if(range.max > range.min && + dim_1u64(range) <= MB(256) && + range.min <= 0x000FFFFFFFFFFFFFull && + range.max <= 0x000FFFFFFFFFFFFFull) + { + Temp scratch = scratch_begin(&arena, 1); + Access *access = access_open(); + + //- rjf: unpack address range, prepare per-touched-page info + U64 page_size = KB(4); + Rng1U64 page_range = r1u64(AlignDownPow2(range.min, page_size), AlignPow2(range.max, page_size)); + U64 page_count = dim_1u64(page_range)/page_size; + U128 *page_hashes = push_array(scratch.arena, U128, page_count); + U128 *page_last_hashes = push_array(scratch.arena, U128, page_count); + + //- rjf: gather hashes & last-hashes for each page + ProfScope("gather hashes & last-hashes for each page") + { + for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) + { + U64 page_base_vaddr = page_range.min + page_idx*page_size; + B32 page_is_stale = 0; + C_Key page_key = ctrl_key_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, wait_for_fresh, endt_us, &page_is_stale); + U128 page_hash = c_hash_from_key(page_key, 0); + U128 page_last_hash = c_hash_from_key(page_key, 1); + result.stale = (result.stale || page_is_stale); + page_hashes[page_idx] = page_hash; + page_last_hashes[page_idx] = page_last_hash; + } + } + + //- rjf: setup output buffers + void *read_out = push_array(arena, U8, dim_1u64(range)); + U64 *byte_bad_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); + U64 *byte_changed_flags = push_array(arena, U64, (dim_1u64(range)+63)/64); + + //- rjf: iterate pages, fill output + ProfScope("iterate pages, fill output") + { + U64 write_off = 0; + for(U64 page_idx = 0; page_idx < page_count; page_idx += 1) + { + // rjf: read data for this page + String8 data = c_data_from_hash(access, page_hashes[page_idx]); + Rng1U64 data_vaddr_range = r1u64(page_range.min + page_idx*page_size, page_range.min + page_idx*page_size+data.size); + + // rjf: skip/chop bytes which are irrelevant for the actual requested read + String8 in_range_data = data; + if(page_idx == page_count-1 && data_vaddr_range.max > range.max) + { + in_range_data = str8_chop(in_range_data, data_vaddr_range.max-range.max); + } + if(page_idx == 0 && range.min > data_vaddr_range.min) + { + in_range_data = str8_skip(in_range_data, range.min-data_vaddr_range.min); + } + + // rjf: write this chunk + MemoryCopy((U8*)read_out+write_off, in_range_data.str, in_range_data.size); + + // rjf; if this page's data doesn't fill the entire range, mark + // missing bytes as bad + if(data.size < page_size) ProfScope("mark missing bytes as bad") + { + Rng1U64 invalid_range = r1u64(data_vaddr_range.min+data.size, data_vaddr_range.min + page_size); + Rng1U64 in_range_invalid_range = intersect_1u64(invalid_range, range); + for(U64 invalid_vaddr = in_range_invalid_range.min; + invalid_vaddr < in_range_invalid_range.max; + invalid_vaddr += 1) + { + U64 idx_in_range = invalid_vaddr - range.min; + byte_bad_flags[idx_in_range/64] |= (1ull<<(idx_in_range%64)); + } + } + + // rjf: if this page's hash & last_hash don't match, diff each byte & + // fill out changed flags + if(!u128_match(page_hashes[page_idx], page_last_hashes[page_idx])) ProfScope("hashes don't match; diff each byte") + { + String8 last_data = c_data_from_hash(access, page_last_hashes[page_idx]); + String8 in_range_last_data = last_data; + if(page_idx == page_count-1 && data_vaddr_range.max > range.max) + { + in_range_last_data = str8_chop(in_range_last_data, data_vaddr_range.max-range.max); + } + if(page_idx == 0 && range.min > data_vaddr_range.min) + { + in_range_last_data = str8_skip(in_range_last_data, range.min-data_vaddr_range.min); + } + for(U64 idx = 0; idx < in_range_data.size; idx += 1) + { + U8 last_byte = idx < in_range_last_data.size ? in_range_last_data.str[idx] : 0; + U8 now_byte = idx < in_range_data.size ? in_range_data.str[idx] : 0; + if(last_byte != now_byte) + { + U64 idx_in_read_out = write_off+idx; + byte_changed_flags[idx_in_read_out/64] |= (1ull<<(idx_in_read_out%64)); + } + } + } + + // rjf: increment past this chunk + U64 bytes_to_skip = page_size; + if(page_idx == 0 && range.min > data_vaddr_range.min) + { + bytes_to_skip -= (range.min-data_vaddr_range.min); + } + write_off += bytes_to_skip; + } + } + + //- rjf: fill result + result.data.str = (U8*)read_out; + result.data.size = dim_1u64(range); + result.byte_bad_flags = byte_bad_flags; + result.byte_changed_flags = byte_changed_flags; + if(byte_bad_flags != 0) + { + for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) + { + result.any_byte_bad = result.any_byte_bad || !!result.byte_bad_flags[idx]; + } + } + if(byte_changed_flags != 0) + { + for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1) + { + result.any_byte_changed = result.any_byte_changed || !!result.byte_changed_flags[idx]; + } + } + + access_close(access); + scratch_end(scratch); + } + ProfEnd(); + return result; +} + +internal B32 +ctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us) +{ + Temp scratch = scratch_begin(0, 0); + U64 needed_size = dim_1u64(range); + CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, range, 0, endt_us); + B32 good = (slice.data.size >= needed_size && !slice.any_byte_bad); + if(good) + { + MemoryCopy(out, slice.data.str, needed_size); + } + if(slice.stale && is_stale_out) + { + *is_stale_out = 1; + } + scratch_end(scratch); + return good; +} + +//- rjf: process memory writing + +internal B32 +ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src) +{ + ProfBeginFunction(); + B32 result = dmn_process_write(process.dmn_handle, range, src); + + //- rjf: success -> bump generation + if(result) + { + ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); + } + + //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless + // writes within calling frame's "view" of the memory, at the expense of a small amount of + // time. + if(result) + { + U64 endt_us = os_now_microseconds()+10000; + U64 page_size = os_get_system_info()->page_size; // TODO(rjf): @page_size_from_process + Rng1U64 page_range = r1u64(range.min/page_size, (range.max+page_size-1)/page_size); + for EachInRange(page_idx, page_range) + { + Temp scratch = scratch_begin(0, 0); + CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); + scratch_end(scratch); + if(!slice.stale || os_now_microseconds() >= endt_us) + { + break; + } + } + } + + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ rjf: Call Stack Artifact Cache Hooks / Lookups + +internal AC_Artifact +ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +{ + AC_Artifact artifact = {0}; + { + Temp scratch = scratch_begin(0, 0); + + //- rjf: unpack key + CTRL_Handle thread_handle = {0}; + str8_deserial_read_struct(key, 0, &thread_handle); + + //- rjf: produce mini entity context for just this call stack build + CTRL_EntityCtx *entity_ctx = push_array(scratch.arena, CTRL_EntityCtx, 1); + MutexScopeR(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + { + CTRL_EntityCtx *src_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *dst_ctx = entity_ctx; + { + dst_ctx->root = &ctrl_entity_nil; + dst_ctx->hash_slots_count = 1024; + dst_ctx->hash_slots = push_array(scratch.arena, CTRL_EntityHashSlot, dst_ctx->hash_slots_count); + MemoryCopyArray(dst_ctx->entity_kind_counts, src_ctx->entity_kind_counts); + MemoryCopyArray(dst_ctx->entity_kind_alloc_gens, src_ctx->entity_kind_alloc_gens); + } + CTRL_Entity *src_thread = ctrl_entity_from_handle(src_ctx, thread_handle); + CTRL_Entity *src_process = ctrl_process_from_entity(src_thread); + { + CTRL_EntityRec rec = {0}; + CTRL_Entity *dst_parent = &ctrl_entity_nil; + for(CTRL_Entity *src_e = src_process; src_e != &ctrl_entity_nil; src_e = rec.next) + { + rec = ctrl_entity_rec_depth_first_pre(src_e, src_process); + + // rjf: determine if we need this entity + B32 need_this_entity = (ctrl_handle_match(thread_handle, src_e->handle) || src_e->kind == CTRL_EntityKind_Module || src_e->kind == CTRL_EntityKind_Process || src_e->kind == CTRL_EntityKind_DebugInfoPath); + + // rjf: copy this entity + CTRL_Entity *dst_e = &ctrl_entity_nil; + if(need_this_entity) + { + dst_e = push_array(scratch.arena, CTRL_Entity, 1); + { + dst_e->first = dst_e->last = dst_e->next = dst_e->prev = &ctrl_entity_nil; + dst_e->parent = dst_parent; + dst_e->kind = src_e->kind; + dst_e->arch = src_e->arch; + dst_e->is_frozen = src_e->is_frozen; + dst_e->is_soloed = src_e->is_soloed; + dst_e->rgba = src_e->rgba; + dst_e->handle = src_e->handle; + dst_e->id = src_e->id; + dst_e->vaddr_range = src_e->vaddr_range; + dst_e->stack_base = src_e->stack_base; + dst_e->timestamp = src_e->timestamp; + dst_e->bp_flags = src_e->bp_flags; + dst_e->string = push_str8_copy(scratch.arena, src_e->string); + dst_e->tls_index = src_e->tls_index; + dst_e->tls_offset = src_e->tls_offset; + dst_e->target_os = src_e->target_os; + dst_e->tls_model = src_e->tls_model; + } + if(dst_parent == &ctrl_entity_nil) + { + dst_ctx->root = dst_e; + } + else + { + DLLPushBack_NPZ(&ctrl_entity_nil, dst_parent->first, dst_parent->last, dst_e, next, prev); + } + } + + // rjf: insert into hash map + if(dst_e != &ctrl_entity_nil) + { + U64 hash = ctrl_hash_from_handle(dst_e->handle); + U64 slot_idx = hash%dst_ctx->hash_slots_count; + CTRL_EntityHashSlot *slot = &dst_ctx->hash_slots[slot_idx]; + CTRL_EntityHashNode *node = 0; + for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + { + if(ctrl_handle_match(n->entity->handle, dst_e->handle)) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(scratch.arena, CTRL_EntityHashNode, 1); + MemoryZeroStruct(node); + DLLPushBack(slot->first, slot->last, node); + node->entity = dst_e; + } + } + + // rjf: push/pop + if(rec.push_count) + { + dst_parent = dst_e; + } + else for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1) + { + dst_parent = dst_parent->parent; + } + } + } + } + + //- rjf: compute call stack + CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, thread_handle); + B32 good = 1; + B32 retry = 0; + Arena *arena = 0; + CTRL_CallStack *call_stack = 0; + if(thread != &ctrl_entity_nil) + { + good = 0; + arena = arena_alloc(); + call_stack = push_array(arena, CTRL_CallStack, 1); + CTRL_Entity *process = ctrl_process_from_entity(thread); + U64 pre_reg_gen = 0; + U64 post_reg_gen = 0; + U64 pre_mem_gen = 0; + U64 post_mem_gen = 0; + CTRL_Unwind unwind = {0}; + { + pre_reg_gen = ctrl_reg_gen(); + pre_mem_gen = ctrl_mem_gen(); + unwind = ctrl_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000); + if(!(unwind.flags & CTRL_UnwindFlag_Stale)) + { + good = 1; + call_stack[0] = ctrl_call_stack_from_unwind(arena, process, &unwind); + } + if(unwind.flags & CTRL_UnwindFlag_Stale) + { + retry = 1; + } + post_reg_gen = ctrl_reg_gen(); + post_mem_gen = ctrl_mem_gen(); + } + if(pre_reg_gen != post_reg_gen || pre_mem_gen != post_mem_gen) + { + good = 0; + retry = 1; + } + if(!good) + { + arena_release(arena); + } + } + + //- rjf: broadcast update + if(good && ctrl_state->wakeup_hook != 0) + { + ctrl_state->wakeup_hook(); + } + + //- rjf: bundle call stack as artifact + if(good) + { + artifact.u64[0] = (U64)arena; + artifact.u64[1] = (U64)call_stack; + } + + //- rjf: mark retry + retry_out[0] = retry; + + scratch_end(scratch); + } + return artifact; +} + +internal void +ctrl_call_stack_artifact_destroy(AC_Artifact artifact) +{ + Arena *arena = (Arena *)artifact.u64[0]; + if(arena != 0) + { + arena_release(arena); + } +} + +internal CTRL_CallStack +ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us) +{ + CTRL_CallStack result = {0}; + { + AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&thread_handle), ctrl_call_stack_artifact_create, ctrl_call_stack_artifact_destroy, endt_us, + .gen = ctrl_mem_gen() + ctrl_reg_gen(), + .evict_threshold_us = 10000000, + .flags = high_priority ? AC_Flag_HighPriority : 0); + if(artifact.u64[1] != 0) + { + MemoryCopyStruct(&result, (CTRL_CallStack *)artifact.u64[1]); + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups + +internal AC_Artifact +ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +{ + Temp scratch = scratch_begin(0, 0); + Access *access = access_open(); + + //- rjf: gather list of all thread handles + U64 threads_count = 0; + CTRL_Handle *threads = 0; + CTRL_Handle *threads_processes = 0; + Arch *threads_arches = 0; + MutexScopeR(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + { + CTRL_EntityCtx *ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityArray thread_entities = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread); + threads_count = thread_entities.count; + threads = push_array(scratch.arena, CTRL_Handle, threads_count); + threads_processes = push_array(scratch.arena, CTRL_Handle, threads_count); + threads_arches = push_array(scratch.arena, Arch, threads_count); + for EachIndex(idx, threads_count) + { + threads[idx] = thread_entities.v[idx]->handle; + threads_processes[idx] = thread_entities.v[idx]->parent->handle; + threads_arches[idx] = thread_entities.v[idx]->arch; + } + } + + //- rjf: gather all callstacks + B32 stale = 0; + U64 pre_mem_gen = ctrl_mem_gen(); + U64 pre_reg_gen = ctrl_reg_gen(); + CTRL_CallStack *call_stacks = push_array(scratch.arena, CTRL_CallStack, threads_count); + { + for EachIndex(idx, threads_count) + { + call_stacks[idx] = ctrl_call_stack_from_thread(access, threads[idx], 0, 0); + if(call_stacks[idx].concrete_frames_count == 0) + { + stale = 1; + break; + } + } + } + U64 post_mem_gen = ctrl_mem_gen(); + U64 post_reg_gen = ctrl_reg_gen(); + stale = (stale || pre_mem_gen != post_mem_gen || pre_reg_gen != post_reg_gen); + + //- rjf: build call stack tree + Arena *arena = 0; + CTRL_CallStackTree *tree = 0; + if(!stale) + { + U64 id_gen = 0; + arena = arena_alloc(); + tree = push_array(arena, CTRL_CallStackTree, 1); + tree->root = push_array(arena, CTRL_CallStackTreeNode, 1); + MemoryCopyStruct(tree->root, &ctrl_call_stack_tree_node_nil); + tree->root->id = id_gen; + tree->slots_count = Max(1, threads_count); + tree->slots = push_array(arena, CTRL_CallStackTreeNode *, tree->slots_count); + id_gen += 1; + for EachIndex(thread_idx, threads_count) + { + CTRL_Handle thread = threads[thread_idx]; + CTRL_Handle process = threads_processes[thread_idx]; + Arch arch = threads_arches[thread_idx]; + CTRL_CallStack call_stack = call_stacks[thread_idx]; + CTRL_CallStackTreeNode *thread_node = tree->root; + for EachIndex(frame_idx, call_stack.frames_count) + { + U64 vaddr = regs_rip_from_arch_block(arch, call_stack.frames[frame_idx].regs); + U64 depth = call_stack.frames[frame_idx].inline_depth; + CTRL_CallStackTreeNode *next_node = &ctrl_call_stack_tree_node_nil; + for(CTRL_CallStackTreeNode *child = thread_node->first; child != &ctrl_call_stack_tree_node_nil; child = child->next) + { + if(ctrl_handle_match(child->process, process) && child->vaddr == vaddr && child->depth == depth) + { + next_node = child; + break; + } + } + if(next_node == &ctrl_call_stack_tree_node_nil) + { + next_node = push_array(arena, CTRL_CallStackTreeNode, 1); + MemoryCopyStruct(next_node, &ctrl_call_stack_tree_node_nil); + next_node->id = id_gen; + SLLStackPush_N(tree->slots[next_node->id%tree->slots_count], next_node, hash_next); + id_gen += 1; + SLLQueuePush_NZ(&ctrl_call_stack_tree_node_nil, thread_node->first, thread_node->last, next_node, next); + next_node->parent = thread_node; + thread_node->child_count += 1; + } + thread_node = next_node; + } + ctrl_handle_list_push(arena, &thread_node->threads, &thread); + for(CTRL_CallStackTreeNode *n = thread_node; n != &ctrl_call_stack_tree_node_nil; n = n->parent) + { + n->all_descendant_threads_count += 1; + } + } + } + + //- rjf: produce artifact + AC_Artifact artifact = {0}; + { + artifact.u64[0] = (U64)arena; + artifact.u64[1] = (U64)tree; + } + + //- rjf: retry on stale + if(stale) + { + retry_out[0] = 1; + } + + access_close(access); + scratch_end(scratch); + return artifact; +} + +internal void +ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact) +{ + Arena *arena = (Arena *)artifact.u64[0]; + if(arena != 0) + { + arena_release(arena); + } +} + +internal CTRL_CallStackTree +ctrl_call_stack_tree(Access *access, U64 endt_us) +{ + CTRL_CallStackTree result = {&ctrl_call_stack_tree_node_nil}; + { + AC_Artifact artifact = ac_artifact_from_key(access, str8_zero(), ctrl_call_stack_tree_artifact_create, ctrl_call_stack_tree_artifact_destroy, endt_us); + if(artifact.u64[1] != 0) + { + MemoryCopyStruct(&result, (CTRL_CallStackTree *)artifact.u64[1]); + } + } + return result; +} diff --git a/src/ctrl/ctrl_core.h b/src/dbg_engine/dbg_engine_ctrl.h similarity index 69% rename from src/ctrl/ctrl_core.h rename to src/dbg_engine/dbg_engine_ctrl.h index fa9b1571..895357f9 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -1,1072 +1,625 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef CTRL_CORE_H -#define CTRL_CORE_H - -//////////////////////////////// -//~ rjf: ID Types - -typedef U64 CTRL_MsgID; -typedef U64 CTRL_MachineID; - -#define CTRL_MachineID_Local (1) - -//////////////////////////////// -//~ rjf: User Breakpoint Types - -typedef U32 CTRL_UserBreakpointFlags; -enum -{ - CTRL_UserBreakpointFlag_BreakOnWrite = (1<<0), - CTRL_UserBreakpointFlag_BreakOnRead = (1<<1), - CTRL_UserBreakpointFlag_BreakOnExecute = (1<<2), -}; - -typedef enum CTRL_UserBreakpointKind -{ - CTRL_UserBreakpointKind_Null, - CTRL_UserBreakpointKind_FileNameAndLineColNumber, - CTRL_UserBreakpointKind_Expression, - CTRL_UserBreakpointKind_COUNT -} -CTRL_UserBreakpointKind; - -typedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint; -struct CTRL_UserBreakpoint -{ - CTRL_UserBreakpointKind kind; - CTRL_UserBreakpointFlags flags; - U64 id; - String8 string; - TxtPt pt; - U64 size; - String8 condition; -}; - -typedef struct CTRL_UserBreakpointNode CTRL_UserBreakpointNode; -struct CTRL_UserBreakpointNode -{ - CTRL_UserBreakpointNode *next; - CTRL_UserBreakpoint v; -}; - -typedef struct CTRL_UserBreakpointList CTRL_UserBreakpointList; -struct CTRL_UserBreakpointList -{ - CTRL_UserBreakpointNode *first; - CTRL_UserBreakpointNode *last; - U64 count; -}; - -//////////////////////////////// -//~ Dynamic Linker Types - -typedef U32 CTRL_TlsModel; -enum -{ - CTRL_TlsModel_Null, - CTRL_TlsModel_WinodwsNt, - CTRL_TlsModel_Gnu -}; - -//////////////////////////////// -//~ rjf: Entity Handle Types - -typedef struct CTRL_Handle CTRL_Handle; -struct CTRL_Handle -{ - CTRL_MachineID machine_id; - DMN_Handle dmn_handle; -}; - -typedef struct CTRL_HandleNode CTRL_HandleNode; -struct CTRL_HandleNode -{ - CTRL_HandleNode *next; - CTRL_Handle v; -}; - -typedef struct CTRL_HandleList CTRL_HandleList; -struct CTRL_HandleList -{ - CTRL_HandleNode *first; - CTRL_HandleNode *last; - U64 count; -}; - -typedef struct CTRL_HandleArray CTRL_HandleArray; -struct CTRL_HandleArray -{ - CTRL_Handle *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/ctrl.meta.h" - -//////////////////////////////// -//~ rjf: Entity Types - -typedef struct CTRL_Entity CTRL_Entity; -struct CTRL_Entity -{ - CTRL_Entity *first; - CTRL_Entity *last; - CTRL_Entity *next; - CTRL_Entity *prev; - CTRL_Entity *parent; - CTRL_EntityKind kind; - Arch arch; - B32 is_frozen; - B32 is_soloed; - U32 rgba; - CTRL_Handle handle; - U64 id; - Rng1U64 vaddr_range; - U64 stack_base; - U64 timestamp; - CTRL_UserBreakpointFlags bp_flags; - String8 string; - CTRL_TlsModel tls_model; - U64 tls_index; - U64 tls_offset; - OperatingSystem target_os; -}; - -typedef struct CTRL_EntityNode CTRL_EntityNode; -struct CTRL_EntityNode -{ - CTRL_EntityNode *next; - CTRL_Entity *v; -}; - -typedef struct CTRL_EntityList CTRL_EntityList; -struct CTRL_EntityList -{ - CTRL_EntityNode *first; - CTRL_EntityNode *last; - U64 count; -}; - -typedef struct CTRL_EntityArray CTRL_EntityArray; -struct CTRL_EntityArray -{ - CTRL_Entity **v; - U64 count; -}; - -typedef struct CTRL_EntityRec CTRL_EntityRec; -struct CTRL_EntityRec -{ - CTRL_Entity *next; - S32 push_count; - S64 pop_count; -}; - -typedef struct CTRL_EntityHashNode CTRL_EntityHashNode; -struct CTRL_EntityHashNode -{ - CTRL_EntityHashNode *next; - CTRL_EntityHashNode *prev; - CTRL_Entity *entity; -}; - -typedef struct CTRL_EntityHashSlot CTRL_EntityHashSlot; -struct CTRL_EntityHashSlot -{ - CTRL_EntityHashNode *first; - CTRL_EntityHashNode *last; -}; - -typedef struct CTRL_EntityStringChunkNode CTRL_EntityStringChunkNode; -struct CTRL_EntityStringChunkNode -{ - CTRL_EntityStringChunkNode *next; - U64 size; -}; - -read_only global U64 ctrl_entity_string_bucket_chunk_sizes[] = -{ - 16, - 64, - 256, - 1024, - 4096, - 16384, - 65536, - 0xffffffffffffffffull, -}; - -typedef struct CTRL_EntityCtx CTRL_EntityCtx; -struct CTRL_EntityCtx -{ - CTRL_Entity *root; - U64 hash_slots_count; - CTRL_EntityHashSlot *hash_slots; - U64 entity_kind_counts[CTRL_EntityKind_COUNT]; - U64 entity_kind_alloc_gens[CTRL_EntityKind_COUNT]; -}; - -typedef struct CTRL_EntityCtxRWStore CTRL_EntityCtxRWStore; -struct CTRL_EntityCtxRWStore -{ - Arena *arena; - CTRL_EntityCtx ctx; - CTRL_Entity *free; - CTRL_EntityHashNode *hash_node_free; - CTRL_EntityStringChunkNode *free_string_chunks[ArrayCount(ctrl_entity_string_bucket_chunk_sizes)]; -}; - -typedef struct CTRL_EntityCtxLookupAccel CTRL_EntityCtxLookupAccel; -struct CTRL_EntityCtxLookupAccel -{ - Arena *arena; - Arena *entity_kind_arrays_arenas[CTRL_EntityKind_COUNT]; - CTRL_EntityArray entity_kind_arrays[CTRL_EntityKind_COUNT]; - U64 entity_kind_arrays_gens[CTRL_EntityKind_COUNT]; -}; - -//////////////////////////////// -//~ rjf: Unwind Types - -typedef U32 CTRL_UnwindFlags; -enum -{ - CTRL_UnwindFlag_Error = (1<<0), - CTRL_UnwindFlag_Stale = (1<<1), -}; - -typedef struct CTRL_UnwindStepResult CTRL_UnwindStepResult; -struct CTRL_UnwindStepResult -{ - CTRL_UnwindFlags flags; -}; - -typedef struct CTRL_UnwindFrame CTRL_UnwindFrame; -struct CTRL_UnwindFrame -{ - void *regs; - U64 cfa; -}; - -typedef struct CTRL_UnwindFrameNode CTRL_UnwindFrameNode; -struct CTRL_UnwindFrameNode -{ - CTRL_UnwindFrameNode *next; - CTRL_UnwindFrameNode *prev; - CTRL_UnwindFrame v; -}; - -typedef struct CTRL_UnwindFrameArray CTRL_UnwindFrameArray; -struct CTRL_UnwindFrameArray -{ - CTRL_UnwindFrame *v; - U64 count; -}; - -typedef struct CTRL_Unwind CTRL_Unwind; -struct CTRL_Unwind -{ - CTRL_UnwindFrameArray frames; - CTRL_UnwindFlags flags; -}; - -typedef struct CTRL_FrameUnwindContext CTRL_FrameUnwindContext; -struct CTRL_FrameUnwindContext -{ - // DWARF - U64 cfa; - DW_CFI_Row *cfi_row; - U64 ret_addr_reg; -}; - -//////////////////////////////// -//~ rjf: Call Stack Types - -typedef struct CTRL_CallStackFrame CTRL_CallStackFrame; -struct CTRL_CallStackFrame -{ - U64 unwind_count; - U64 inline_depth; - void *regs; - U64 cfa; -}; - -typedef struct CTRL_CallStack CTRL_CallStack; -struct CTRL_CallStack -{ - CTRL_CallStackFrame *frames; - U64 frames_count; - CTRL_CallStackFrame **concrete_frames; - U64 concrete_frames_count; -}; - -//////////////////////////////// -//~ rjf: Call Stack Tree Types - -typedef struct CTRL_CallStackTreeNode CTRL_CallStackTreeNode; -struct CTRL_CallStackTreeNode -{ - CTRL_CallStackTreeNode *hash_next; - CTRL_CallStackTreeNode *first; - CTRL_CallStackTreeNode *last; - CTRL_CallStackTreeNode *next; - CTRL_CallStackTreeNode *parent; - U64 child_count; - U64 id; - CTRL_Handle process; - U64 vaddr; - U64 depth; - CTRL_HandleList threads; - U64 all_descendant_threads_count; -}; - -typedef struct CTRL_CallStackTree CTRL_CallStackTree; -struct CTRL_CallStackTree -{ - CTRL_CallStackTreeNode *root; - U64 slots_count; - CTRL_CallStackTreeNode **slots; -}; - -//////////////////////////////// -//~ rjf: Trap Types - -typedef U32 CTRL_TrapFlags; -enum -{ - CTRL_TrapFlag_IgnoreStackPointerCheck = (1<<0), - CTRL_TrapFlag_SingleStepAfterHit = (1<<1), - CTRL_TrapFlag_SaveStackPointer = (1<<2), - CTRL_TrapFlag_BeginSpoofMode = (1<<3), - CTRL_TrapFlag_EndStepping = (1<<4), -}; - -typedef struct CTRL_Trap CTRL_Trap; -struct CTRL_Trap -{ - CTRL_TrapFlags flags; - U64 vaddr; -}; - -typedef struct CTRL_TrapNode CTRL_TrapNode; -struct CTRL_TrapNode -{ - CTRL_TrapNode *next; - CTRL_Trap v; -}; - -typedef struct CTRL_TrapList CTRL_TrapList; -struct CTRL_TrapList -{ - CTRL_TrapNode *first; - CTRL_TrapNode *last; - U64 count; -}; - -typedef struct CTRL_Spoof CTRL_Spoof; -struct CTRL_Spoof -{ - DMN_Handle process; - DMN_Handle thread; - U64 vaddr; - U64 new_ip_value; -}; - -//////////////////////////////// -//~ rjf: Evaluation Spaces - -typedef U64 CTRL_EvalSpaceKind; -enum -{ - CTRL_EvalSpaceKind_Entity = E_SpaceKind_FirstUserDefined, - CTRL_EvalSpaceKind_FirstUserDefined, -}; - -//////////////////////////////// -//~ rjf: Message Types - -typedef enum CTRL_MsgKind -{ - CTRL_MsgKind_Null, - CTRL_MsgKind_Launch, - CTRL_MsgKind_Attach, - CTRL_MsgKind_Kill, - CTRL_MsgKind_KillAll, - CTRL_MsgKind_Detach, - CTRL_MsgKind_Run, - CTRL_MsgKind_SingleStep, - CTRL_MsgKind_SetUserEntryPoints, - CTRL_MsgKind_SetModuleDebugInfoPath, - CTRL_MsgKind_FreezeThread, - CTRL_MsgKind_ThawThread, - CTRL_MsgKind_COUNT, -} -CTRL_MsgKind; - -typedef U32 CTRL_RunFlags; -enum -{ - CTRL_RunFlag_StopOnEntryPoint = (1<<0), -}; - -typedef struct CTRL_Msg CTRL_Msg; -struct CTRL_Msg -{ - CTRL_MsgKind kind; - CTRL_RunFlags run_flags; - CTRL_MsgID msg_id; - CTRL_Handle entity; - CTRL_Handle parent; - U32 entity_id; - U32 exit_code; - B32 env_inherit; - B32 debug_subprocesses; - U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; - String8 path; - String8List entry_points; - String8List cmd_line_string_list; - String8List env_string_list; - String8 stdout_path; - String8 stderr_path; - String8 stdin_path; - CTRL_TrapList traps; - CTRL_UserBreakpointList user_bps; -}; - -typedef struct CTRL_MsgNode CTRL_MsgNode; -struct CTRL_MsgNode -{ - CTRL_MsgNode *next; - CTRL_Msg v; -}; - -typedef struct CTRL_MsgList CTRL_MsgList; -struct CTRL_MsgList -{ - CTRL_MsgNode *first; - CTRL_MsgNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Event Types - -typedef enum CTRL_EventKind -{ - CTRL_EventKind_Null, - CTRL_EventKind_Error, - - //- rjf: starts/stops - CTRL_EventKind_Started, - CTRL_EventKind_Stopped, - - //- rjf: entity creation/deletion - CTRL_EventKind_NewProc, - CTRL_EventKind_NewThread, - CTRL_EventKind_NewModule, - CTRL_EventKind_EndProc, - CTRL_EventKind_EndThread, - CTRL_EventKind_EndModule, - - //- rjf: thread freeze state changes - CTRL_EventKind_ThreadFrozen, - CTRL_EventKind_ThreadThawed, - - //- rjf: debug info changes - CTRL_EventKind_ModuleDebugInfoPathChange, - - //- rjf: debug strings / decorations / markup - CTRL_EventKind_DebugString, - CTRL_EventKind_ThreadName, - CTRL_EventKind_ThreadColor, - CTRL_EventKind_SetBreakpoint, - CTRL_EventKind_UnsetBreakpoint, - CTRL_EventKind_SetVAddrRangeNote, - - //- rjf: memory - CTRL_EventKind_MemReserve, - CTRL_EventKind_MemCommit, - CTRL_EventKind_MemDecommit, - CTRL_EventKind_MemRelease, - - CTRL_EventKind_COUNT -} -CTRL_EventKind; - -typedef enum CTRL_EventCause -{ - CTRL_EventCause_Null, - CTRL_EventCause_Error, - CTRL_EventCause_Finished, - CTRL_EventCause_EntryPoint, - CTRL_EventCause_UserBreakpoint, - CTRL_EventCause_InterruptedByTrap, - CTRL_EventCause_InterruptedByException, - CTRL_EventCause_InterruptedByHalt, - CTRL_EventCause_COUNT -} -CTRL_EventCause; - -typedef enum CTRL_ExceptionKind -{ - CTRL_ExceptionKind_Null, - CTRL_ExceptionKind_MemoryRead, - CTRL_ExceptionKind_MemoryWrite, - CTRL_ExceptionKind_MemoryExecute, - CTRL_ExceptionKind_CppThrow, - CTRL_ExceptionKind_COUNT -} -CTRL_ExceptionKind; - -typedef struct CTRL_Event CTRL_Event; -struct CTRL_Event -{ - CTRL_EventKind kind; - CTRL_EventCause cause; - CTRL_ExceptionKind exception_kind; - CTRL_MsgID msg_id; - CTRL_Handle entity; - CTRL_Handle parent; - Arch arch; - U64 u64_code; - U32 entity_id; - Rng1U64 vaddr_rng; - U64 rip_vaddr; - U64 stack_base; - U64 tls_root; - U64 tls_index; - U64 tls_offset; - U64 timestamp; - U32 exception_code; - U32 rgba; - CTRL_UserBreakpointFlags bp_flags; - String8 string; - OperatingSystem target_os; - CTRL_TlsModel tls_model; -}; - -typedef struct CTRL_EventNode CTRL_EventNode; -struct CTRL_EventNode -{ - CTRL_EventNode *next; - CTRL_Event v; -}; - -typedef struct CTRL_EventList CTRL_EventList; -struct CTRL_EventList -{ - CTRL_EventNode *first; - CTRL_EventNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Process Memory Types - -typedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice; -struct CTRL_ProcessMemorySlice -{ - String8 data; - U64 *byte_bad_flags; - U64 *byte_changed_flags; - B32 stale; - B32 any_byte_bad; - B32 any_byte_changed; -}; - -//////////////////////////////// -//~ rjf: Thread Register Cache Types - -typedef struct CTRL_ThreadRegCacheNode CTRL_ThreadRegCacheNode; -struct CTRL_ThreadRegCacheNode -{ - CTRL_ThreadRegCacheNode *next; - CTRL_ThreadRegCacheNode *prev; - CTRL_Handle handle; - U64 block_size; - void *block; - U64 reg_gen; -}; - -typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; -struct CTRL_ThreadRegCacheSlot -{ - CTRL_ThreadRegCacheNode *first; - CTRL_ThreadRegCacheNode *last; -}; - -typedef struct CTRL_ThreadRegCacheStripe CTRL_ThreadRegCacheStripe; -struct CTRL_ThreadRegCacheStripe -{ - Arena *arena; - RWMutex rw_mutex; -}; - -typedef struct CTRL_ThreadRegCache CTRL_ThreadRegCache; -struct CTRL_ThreadRegCache -{ - U64 slots_count; - CTRL_ThreadRegCacheSlot *slots; - U64 stripes_count; - CTRL_ThreadRegCacheStripe *stripes; -}; - -//////////////////////////////// -//~ rjf: Module Image Info Cache Types - -typedef struct CTRL_ModuleImageInfoCacheNode CTRL_ModuleImageInfoCacheNode; -struct CTRL_ModuleImageInfoCacheNode -{ - CTRL_ModuleImageInfoCacheNode *next; - CTRL_ModuleImageInfoCacheNode *prev; - CTRL_Handle module; - Arena *arena; - PE_IntelPdata *pdatas; - U64 pdatas_count; - U64 cfi_rebase; - B32 is_unwind_eh; - String8 dwarf_unwind_data; - EH_FrameHdr eh_frame_hdr; - EH_PtrCtx eh_ptr_ctx; - U64 entry_point_voff; - String8 initial_debug_info_path; - U64 raddbg_attached_marker_voff; - String8 raddbg_data; -}; - -typedef struct CTRL_ModuleImageInfoCacheSlot CTRL_ModuleImageInfoCacheSlot; -struct CTRL_ModuleImageInfoCacheSlot -{ - CTRL_ModuleImageInfoCacheNode *first; - CTRL_ModuleImageInfoCacheNode *last; -}; - -typedef struct CTRL_ModuleImageInfoCacheStripe CTRL_ModuleImageInfoCacheStripe; -struct CTRL_ModuleImageInfoCacheStripe -{ - Arena *arena; - RWMutex rw_mutex; -}; - -typedef struct CTRL_ModuleImageInfoCache CTRL_ModuleImageInfoCache; -struct CTRL_ModuleImageInfoCache -{ - U64 slots_count; - CTRL_ModuleImageInfoCacheSlot *slots; - U64 stripes_count; - CTRL_ModuleImageInfoCacheStripe *stripes; -}; - -//////////////////////////////// -//~ rjf: Touched Debug Info Directory Cache - -typedef struct CTRL_DbgDirNode CTRL_DbgDirNode; -struct CTRL_DbgDirNode -{ - CTRL_DbgDirNode *first; - CTRL_DbgDirNode *last; - CTRL_DbgDirNode *next; - CTRL_DbgDirNode *prev; - CTRL_DbgDirNode *parent; - String8 name; - U64 search_count; - U64 child_count; - U64 module_direct_count; -}; - -//////////////////////////////// -//~ rjf: Control Thread Evaluation Scopes - -typedef struct CTRL_EvalScope CTRL_EvalScope; -struct CTRL_EvalScope -{ - Access *access; - E_BaseCtx base_ctx; - E_IRCtx ir_ctx; - E_InterpretCtx interpret_ctx; -}; - -//////////////////////////////// -//~ rjf: Module Requirement Cache Types - -typedef struct CTRL_ModuleReqCacheNode CTRL_ModuleReqCacheNode; -struct CTRL_ModuleReqCacheNode -{ - CTRL_ModuleReqCacheNode *next; - CTRL_Handle module; - B32 required; -}; - -//////////////////////////////// -//~ rjf: Wakeup Hook Function Types - -#define CTRL_WAKEUP_FUNCTION_DEF(name) void name(void) -typedef CTRL_WAKEUP_FUNCTION_DEF(CTRL_WakeupFunctionType); - -//////////////////////////////// -//~ rjf: Main State Types - -typedef struct CTRL_State CTRL_State; -struct CTRL_State -{ - Arena *arena; - CTRL_WakeupFunctionType *wakeup_hook; - - // rjf: name -> register/alias hash tables for eval - E_String2NumMap arch_string2reg_tables[Arch_COUNT]; - E_String2NumMap arch_string2alias_tables[Arch_COUNT]; - - // rjf: caches - CTRL_ThreadRegCache thread_reg_cache; - CTRL_ModuleImageInfoCache module_image_info_cache; - - // rjf: generations - U64 run_gen; - U64 mem_gen; - U64 reg_gen; - - // rjf: user -> ctrl msg ring buffer - U64 u2c_ring_size; - U8 *u2c_ring_base; - U64 u2c_ring_write_pos; - U64 u2c_ring_read_pos; - Mutex u2c_ring_mutex; - CondVar u2c_ring_cv; - - // rjf: ctrl -> user event ring buffer - U64 c2u_ring_size; - U64 c2u_ring_max_string_size; - U8 *c2u_ring_base; - U64 c2u_ring_write_pos; - U64 c2u_ring_read_pos; - Mutex c2u_ring_mutex; - CondVar c2u_ring_cv; - - // rjf: ctrl thread state - U64 ctrl_thread_run_state; - String8 ctrl_thread_log_path; - Thread ctrl_thread; - Log *ctrl_thread_log; - RWMutex ctrl_thread_entity_ctx_rw_mutex; - CTRL_EntityCtxRWStore *ctrl_thread_entity_store; - E_Cache *ctrl_thread_eval_cache; - Arena *ctrl_thread_msg_process_arena; - Arena *dmn_event_arena; - DMN_EventNode *first_dmn_event_node; - DMN_EventNode *last_dmn_event_node; - DMN_EventNode *free_dmn_event_node; - Arena *user_entry_point_arena; - String8List user_entry_points; - U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; - U64 process_counter; - Arena *dbg_dir_arena; - CTRL_DbgDirNode *dbg_dir_root; - U64 module_req_cache_slots_count; - CTRL_ModuleReqCacheNode **module_req_cache_slots; - String8List msg_user_bp_touched_files; - String8List msg_user_bp_touched_symbols; -}; - -//////////////////////////////// -//~ rjf: Globals - -global CTRL_State *ctrl_state = 0; -read_only global CTRL_Entity ctrl_entity_nil = -{ - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, -}; -read_only global CTRL_CallStackTreeNode ctrl_call_stack_tree_node_nil = -{ - 0, - &ctrl_call_stack_tree_node_nil, - &ctrl_call_stack_tree_node_nil, - &ctrl_call_stack_tree_node_nil, - &ctrl_call_stack_tree_node_nil, -}; -thread_static CTRL_EntityCtxLookupAccel *ctrl_entity_ctx_lookup_accel = 0; - -//////////////////////////////// -//~ rjf: Logging Markup - -#define CTRL_CtrlThreadLogScope DeferLoop(log_scope_begin(), ctrl_thread__end_and_flush_log()) - -//////////////////////////////// -//~ rjf: Basic Type Functions - -internal U64 ctrl_hash_from_string(String8 string); -internal U64 ctrl_hash_from_handle(CTRL_Handle handle); -internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); -internal CTRL_ExceptionKind ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind); -internal CTRL_TlsModel ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type); -internal String8 ctrl_string_from_event_kind(CTRL_EventKind kind); -internal String8 ctrl_string_from_msg_kind(CTRL_MsgKind kind); -internal CTRL_EntityKind ctrl_entity_kind_from_string(String8 string); -internal DMN_TrapFlags ctrl_dmn_trap_flags_from_user_breakpoint_flags(CTRL_UserBreakpointFlags flags); -internal CTRL_UserBreakpointFlags ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags); - -//////////////////////////////// -//~ rjf: Handle Type Functions - -internal CTRL_Handle ctrl_handle_zero(void); -internal CTRL_Handle ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle); -internal B32 ctrl_handle_match(CTRL_Handle a, CTRL_Handle b); -internal void ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair); -internal CTRL_HandleList ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src); -internal CTRL_HandleArray ctrl_handle_array_from_list(Arena *arena, CTRL_HandleList *src); -internal String8 ctrl_string_from_handle(Arena *arena, CTRL_Handle handle); -internal CTRL_Handle ctrl_handle_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Trap Type Functions - -internal void ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap); -internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src); - -//////////////////////////////// -//~ rjf: User Breakpoint Type Functions - -internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp); -internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src); - -//////////////////////////////// -//~ rjf: Message Type Functions - -//- rjf: deep copying -internal void ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src); - -//- rjf: list building -internal CTRL_Msg *ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list); -internal CTRL_MsgList ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src); -internal void ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src); - -//- rjf: serialization -internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs); -internal CTRL_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: Event Type Functions - -//- rjf: list building -internal CTRL_Event *ctrl_event_list_push(Arena *arena, CTRL_EventList *list); -internal void ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push); - -//- rjf: serialization -internal String8 ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max); -internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: Entity Type Functions - -//- rjf: entity list data structures -internal void ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity); -internal CTRL_EntityList ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_HandleList *list); -#define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &ctrl_entity_nil) - -//- rjf: entity array data structure -internal CTRL_EntityArray ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list); -#define ctrl_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &ctrl_entity_nil) - -//- rjf: entity context (entity group read-only) functions -internal CTRL_Entity *ctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle); -internal CTRL_Entity *ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind); -internal CTRL_Entity *ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind); -internal CTRL_Entity *ctrl_process_from_entity(CTRL_Entity *entity); -internal CTRL_Entity *ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr); -internal DI_Key ctrl_dbgi_key_from_module(CTRL_Entity *module); -internal CTRL_Entity *ctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTRL_EntityList *candidates); -internal U64 ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff); -internal U64 ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr); -internal Rng1U64 ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range); -internal Rng1U64 ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range); -internal B32 ctrl_entity_tree_is_frozen(CTRL_Entity *root); - -//- rjf: entity tree iteration -internal CTRL_EntityRec ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off); -#define ctrl_entity_rec_depth_first_pre(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, next), OffsetOf(CTRL_Entity, first)) -#define ctrl_entity_rec_depth_first_post(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, prev), OffsetOf(CTRL_Entity, last)) - -//- rjf: entity ctx r/w store state functions -internal CTRL_EntityCtxRWStore *ctrl_entity_ctx_rw_store_alloc(void); -internal void ctrl_entity_ctx_rw_store_release(CTRL_EntityCtxRWStore *store); - -//- rjf: string allocation/deletion -internal U64 ctrl_name_bucket_num_from_string_size(U64 size); -internal String8 ctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string); -internal void ctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string); - -//- rjf: entity construction/deletion -internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id); -internal void ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity); - -//- rjf: entity equipment -internal void ctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, String8 string); - -//- rjf: accelerated entity context lookups -internal CTRL_EntityCtxLookupAccel *ctrl_thread_entity_ctx_lookup_accel(void); -internal CTRL_EntityArray ctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind); -internal CTRL_EntityList ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key); -internal CTRL_Entity *ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id); - -//- rjf: applying events to entity caches -internal void ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list); - -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void ctrl_init(void); - -//////////////////////////////// -//~ rjf: Wakeup Callback Registration - -internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); - -//////////////////////////////// -//~ rjf: Thread Register Functions - -//- rjf: thread register cache reading -internal void *ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle); -internal U64 ctrl_tls_root_vaddr_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); -internal U64 ctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); -internal U64 ctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); - -//- rjf: thread register writing -internal B32 ctrl_thread_write_reg_block(CTRL_Handle thread, void *block); - -//////////////////////////////// -//~ rjf: Module Image Info Functions - -//- rjf: cache lookups -internal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff); -internal U64 ctrl_entry_point_voff_from_module(CTRL_Handle module_handle); -internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle); -internal String8 ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle); - -//////////////////////////////// -//~ Process Info Functions - -internal Arch ctrl_arch_from_process_handle(CTRL_Handle process_handle); - -//////////////////////////////// -//~ rjf: Unwinding Functions - -//- rjf: unwind deep copier -internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src); - -//- DWARF -internal CTRL_UnwindStepResult ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out); -internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us); - -//- rjf: [x64] -internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); -internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); - -//- rjf: abstracted full unwind -internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us); - -//////////////////////////////// -//~ rjf: Call Stack Building Functions - -internal CTRL_CallStack ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *base_unwind); -internal CTRL_CallStackFrame *ctrl_call_stack_frame_from_unwind_and_inline_depth(CTRL_CallStack *call_stack, U64 unwind_count, U64 inline_depth); - -//////////////////////////////// -//~ rjf: Halting All Attached Processes - -internal void ctrl_halt(void); - -//////////////////////////////// -//~ rjf: Shared Accessor Functions - -//- rjf: generation counters -internal U64 ctrl_run_gen(void); -internal U64 ctrl_mem_gen(void); -internal U64 ctrl_reg_gen(void); - -//- rjf: name -> register/alias hash tables, for eval -internal E_String2NumMap *ctrl_string2reg_from_arch(Arch arch); -internal E_String2NumMap *ctrl_string2alias_from_arch(Arch arch); - -//////////////////////////////// -//~ rjf: Control-Thread Functions - -//- rjf: user -> control thread communication -internal B32 ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us); -internal CTRL_MsgList ctrl_u2c_pop_msgs(Arena *arena); - -//- rjf: control -> user thread communication -internal void ctrl_c2u_push_events(CTRL_EventList *events); -internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); - -//- rjf: entry point -internal void ctrl_thread__entry_point(void *p); - -//- rjf: breakpoint resolution -internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out); - -//- rjf: module lifetime open/close work -internal void ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); -internal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range); - -//- rjf: attached process running/event gathering -internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); - -//- rjf: eval helpers -internal U64 ctrl_eval_space_gen(E_Space space); -internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); - -//- rjf: control thread eval scopes -internal CTRL_EvalScope *ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread); -internal void ctrl_thread__eval_scope_end(CTRL_EvalScope *scope); - -//- rjf: log flusher -internal void ctrl_thread__end_and_flush_log(void); - -//- rjf: msg kind implementations -internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); - -//////////////////////////////// -//~ rjf: Process Memory Artifact Cache Hooks / Lookups - -internal AC_Artifact ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal void ctrl_memory_artifact_destroy(AC_Artifact artifact); -internal C_Key ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale); - -//- rjf: process memory reading helpers -internal CTRL_ProcessMemorySlice ctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us); -internal B32 ctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); -#define ctrl_process_memory_read_struct(process, vaddr, is_stale_out, ptr, endt_us) ctrl_process_memory_read((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) - -//- rjf: process memory writing -internal B32 ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src); - -//////////////////////////////// -//~ rjf: Call Stack Artifact Cache Hooks / Lookups - -internal AC_Artifact ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal void ctrl_call_stack_artifact_destroy(AC_Artifact artifact); -internal CTRL_CallStack ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us); - -//////////////////////////////// -//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups - -internal AC_Artifact ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal void ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact); -internal CTRL_CallStackTree ctrl_call_stack_tree(Access *access, U64 endt_us); - -#endif // CTRL_CORE_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef CTRL_CORE_H +#define CTRL_CORE_H + +//////////////////////////////// +//~ rjf: Unwind Types + +typedef U32 CTRL_UnwindFlags; +enum +{ + CTRL_UnwindFlag_Error = (1<<0), + CTRL_UnwindFlag_Stale = (1<<1), +}; + +typedef struct CTRL_UnwindStepResult CTRL_UnwindStepResult; +struct CTRL_UnwindStepResult +{ + CTRL_UnwindFlags flags; +}; + +typedef struct CTRL_UnwindFrame CTRL_UnwindFrame; +struct CTRL_UnwindFrame +{ + void *regs; + U64 cfa; +}; + +typedef struct CTRL_UnwindFrameNode CTRL_UnwindFrameNode; +struct CTRL_UnwindFrameNode +{ + CTRL_UnwindFrameNode *next; + CTRL_UnwindFrameNode *prev; + CTRL_UnwindFrame v; +}; + +typedef struct CTRL_UnwindFrameArray CTRL_UnwindFrameArray; +struct CTRL_UnwindFrameArray +{ + CTRL_UnwindFrame *v; + U64 count; +}; + +typedef struct CTRL_Unwind CTRL_Unwind; +struct CTRL_Unwind +{ + CTRL_UnwindFrameArray frames; + CTRL_UnwindFlags flags; +}; + +typedef struct CTRL_FrameUnwindContext CTRL_FrameUnwindContext; +struct CTRL_FrameUnwindContext +{ + // DWARF + U64 cfa; + DW_CFI_Row *cfi_row; + U64 ret_addr_reg; +}; + +//////////////////////////////// +//~ rjf: Call Stack Types + +typedef struct CTRL_CallStackFrame CTRL_CallStackFrame; +struct CTRL_CallStackFrame +{ + U64 unwind_count; + U64 inline_depth; + void *regs; + U64 cfa; +}; + +typedef struct CTRL_CallStack CTRL_CallStack; +struct CTRL_CallStack +{ + CTRL_CallStackFrame *frames; + U64 frames_count; + CTRL_CallStackFrame **concrete_frames; + U64 concrete_frames_count; +}; + +//////////////////////////////// +//~ rjf: Call Stack Tree Types + +typedef struct CTRL_CallStackTreeNode CTRL_CallStackTreeNode; +struct CTRL_CallStackTreeNode +{ + CTRL_CallStackTreeNode *hash_next; + CTRL_CallStackTreeNode *first; + CTRL_CallStackTreeNode *last; + CTRL_CallStackTreeNode *next; + CTRL_CallStackTreeNode *parent; + U64 child_count; + U64 id; + CTRL_Handle process; + U64 vaddr; + U64 depth; + CTRL_HandleList threads; + U64 all_descendant_threads_count; +}; + +typedef struct CTRL_CallStackTree CTRL_CallStackTree; +struct CTRL_CallStackTree +{ + CTRL_CallStackTreeNode *root; + U64 slots_count; + CTRL_CallStackTreeNode **slots; +}; + +//////////////////////////////// +//~ rjf: Evaluation Spaces + +typedef U64 CTRL_EvalSpaceKind; +enum +{ + CTRL_EvalSpaceKind_Entity = E_SpaceKind_FirstUserDefined, + CTRL_EvalSpaceKind_FirstUserDefined, +}; + +//////////////////////////////// +//~ rjf: Process Memory Types + +typedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice; +struct CTRL_ProcessMemorySlice +{ + String8 data; + U64 *byte_bad_flags; + U64 *byte_changed_flags; + B32 stale; + B32 any_byte_bad; + B32 any_byte_changed; +}; + +//////////////////////////////// +//~ rjf: Thread Register Cache Types + +typedef struct CTRL_ThreadRegCacheNode CTRL_ThreadRegCacheNode; +struct CTRL_ThreadRegCacheNode +{ + CTRL_ThreadRegCacheNode *next; + CTRL_ThreadRegCacheNode *prev; + CTRL_Handle handle; + U64 block_size; + void *block; + U64 reg_gen; +}; + +typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; +struct CTRL_ThreadRegCacheSlot +{ + CTRL_ThreadRegCacheNode *first; + CTRL_ThreadRegCacheNode *last; +}; + +typedef struct CTRL_ThreadRegCacheStripe CTRL_ThreadRegCacheStripe; +struct CTRL_ThreadRegCacheStripe +{ + Arena *arena; + RWMutex rw_mutex; +}; + +typedef struct CTRL_ThreadRegCache CTRL_ThreadRegCache; +struct CTRL_ThreadRegCache +{ + U64 slots_count; + CTRL_ThreadRegCacheSlot *slots; + U64 stripes_count; + CTRL_ThreadRegCacheStripe *stripes; +}; + +//////////////////////////////// +//~ rjf: Module Image Info Cache Types + +typedef struct CTRL_ModuleImageInfoCacheNode CTRL_ModuleImageInfoCacheNode; +struct CTRL_ModuleImageInfoCacheNode +{ + CTRL_ModuleImageInfoCacheNode *next; + CTRL_ModuleImageInfoCacheNode *prev; + CTRL_Handle module; + Arena *arena; + PE_IntelPdata *pdatas; + U64 pdatas_count; + U64 cfi_rebase; + B32 is_unwind_eh; + String8 dwarf_unwind_data; + EH_FrameHdr eh_frame_hdr; + EH_PtrCtx eh_ptr_ctx; + U64 entry_point_voff; + String8 initial_debug_info_path; + U64 raddbg_attached_marker_voff; + String8 raddbg_data; +}; + +typedef struct CTRL_ModuleImageInfoCacheSlot CTRL_ModuleImageInfoCacheSlot; +struct CTRL_ModuleImageInfoCacheSlot +{ + CTRL_ModuleImageInfoCacheNode *first; + CTRL_ModuleImageInfoCacheNode *last; +}; + +typedef struct CTRL_ModuleImageInfoCacheStripe CTRL_ModuleImageInfoCacheStripe; +struct CTRL_ModuleImageInfoCacheStripe +{ + Arena *arena; + RWMutex rw_mutex; +}; + +typedef struct CTRL_ModuleImageInfoCache CTRL_ModuleImageInfoCache; +struct CTRL_ModuleImageInfoCache +{ + U64 slots_count; + CTRL_ModuleImageInfoCacheSlot *slots; + U64 stripes_count; + CTRL_ModuleImageInfoCacheStripe *stripes; +}; + +//////////////////////////////// +//~ rjf: Touched Debug Info Directory Cache + +typedef struct CTRL_DbgDirNode CTRL_DbgDirNode; +struct CTRL_DbgDirNode +{ + CTRL_DbgDirNode *first; + CTRL_DbgDirNode *last; + CTRL_DbgDirNode *next; + CTRL_DbgDirNode *prev; + CTRL_DbgDirNode *parent; + String8 name; + U64 search_count; + U64 child_count; + U64 module_direct_count; +}; + +//////////////////////////////// +//~ rjf: Control Thread Evaluation Scopes + +typedef struct CTRL_EvalScope CTRL_EvalScope; +struct CTRL_EvalScope +{ + Access *access; + E_BaseCtx base_ctx; + E_IRCtx ir_ctx; + E_InterpretCtx interpret_ctx; +}; + +//////////////////////////////// +//~ rjf: Module Requirement Cache Types + +typedef struct CTRL_ModuleReqCacheNode CTRL_ModuleReqCacheNode; +struct CTRL_ModuleReqCacheNode +{ + CTRL_ModuleReqCacheNode *next; + CTRL_Handle module; + B32 required; +}; + +//////////////////////////////// +//~ rjf: Wakeup Hook Function Types + +#define CTRL_WAKEUP_FUNCTION_DEF(name) void name(void) +typedef CTRL_WAKEUP_FUNCTION_DEF(CTRL_WakeupFunctionType); + +//////////////////////////////// +//~ rjf: Main State Types + +typedef struct CTRL_State CTRL_State; +struct CTRL_State +{ + Arena *arena; + CTRL_WakeupFunctionType *wakeup_hook; + + // rjf: name -> register/alias hash tables for eval + E_String2NumMap arch_string2reg_tables[Arch_COUNT]; + E_String2NumMap arch_string2alias_tables[Arch_COUNT]; + + // rjf: caches + CTRL_ThreadRegCache thread_reg_cache; + CTRL_ModuleImageInfoCache module_image_info_cache; + + // rjf: generations + U64 run_gen; + U64 mem_gen; + U64 reg_gen; + + // rjf: user -> ctrl msg ring buffer + U64 u2c_ring_size; + U8 *u2c_ring_base; + U64 u2c_ring_write_pos; + U64 u2c_ring_read_pos; + Mutex u2c_ring_mutex; + CondVar u2c_ring_cv; + + // rjf: ctrl -> user event ring buffer + U64 c2u_ring_size; + U64 c2u_ring_max_string_size; + U8 *c2u_ring_base; + U64 c2u_ring_write_pos; + U64 c2u_ring_read_pos; + Mutex c2u_ring_mutex; + CondVar c2u_ring_cv; + + // rjf: ctrl thread state + U64 ctrl_thread_run_state; + String8 ctrl_thread_log_path; + Thread ctrl_thread; + Log *ctrl_thread_log; + RWMutex ctrl_thread_entity_ctx_rw_mutex; + CTRL_EntityCtxRWStore *ctrl_thread_entity_store; + E_Cache *ctrl_thread_eval_cache; + Arena *ctrl_thread_msg_process_arena; + Arena *dmn_event_arena; + DMN_EventNode *first_dmn_event_node; + DMN_EventNode *last_dmn_event_node; + DMN_EventNode *free_dmn_event_node; + Arena *user_entry_point_arena; + String8List user_entry_points; + U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; + U64 process_counter; + Arena *dbg_dir_arena; + CTRL_DbgDirNode *dbg_dir_root; + U64 module_req_cache_slots_count; + CTRL_ModuleReqCacheNode **module_req_cache_slots; + String8List msg_user_bp_touched_files; + String8List msg_user_bp_touched_symbols; +}; + +//////////////////////////////// +//~ rjf: Globals + +global CTRL_State *ctrl_state = 0; +read_only global CTRL_Entity ctrl_entity_nil = +{ + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, + &ctrl_entity_nil, +}; +read_only global CTRL_CallStackTreeNode ctrl_call_stack_tree_node_nil = +{ + 0, + &ctrl_call_stack_tree_node_nil, + &ctrl_call_stack_tree_node_nil, + &ctrl_call_stack_tree_node_nil, + &ctrl_call_stack_tree_node_nil, +}; +thread_static CTRL_EntityCtxLookupAccel *ctrl_entity_ctx_lookup_accel = 0; + +//////////////////////////////// +//~ rjf: Logging Markup + +#define CTRL_CtrlThreadLogScope DeferLoop(log_scope_begin(), ctrl_thread__end_and_flush_log()) + +//////////////////////////////// +//~ rjf: Basic Type Functions + +internal U64 ctrl_hash_from_string(String8 string); +internal U64 ctrl_hash_from_handle(CTRL_Handle handle); +internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); +internal CTRL_ExceptionKind ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind); +internal CTRL_TlsModel ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type); +internal String8 ctrl_string_from_event_kind(CTRL_EventKind kind); +internal String8 ctrl_string_from_msg_kind(CTRL_MsgKind kind); +internal CTRL_EntityKind ctrl_entity_kind_from_string(String8 string); +internal DMN_TrapFlags ctrl_dmn_trap_flags_from_user_breakpoint_flags(CTRL_UserBreakpointFlags flags); +internal CTRL_UserBreakpointFlags ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags); + +//////////////////////////////// +//~ rjf: Handle Type Functions + +internal CTRL_Handle ctrl_handle_zero(void); +internal CTRL_Handle ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle); +internal B32 ctrl_handle_match(CTRL_Handle a, CTRL_Handle b); +internal void ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair); +internal CTRL_HandleList ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src); +internal CTRL_HandleArray ctrl_handle_array_from_list(Arena *arena, CTRL_HandleList *src); +internal String8 ctrl_string_from_handle(Arena *arena, CTRL_Handle handle); +internal CTRL_Handle ctrl_handle_from_string(String8 string); + +//////////////////////////////// +//~ rjf: Trap Type Functions + +internal void ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap); +internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src); + +//////////////////////////////// +//~ rjf: User Breakpoint Type Functions + +internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp); +internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src); + +//////////////////////////////// +//~ rjf: Message Type Functions + +//- rjf: deep copying +internal void ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src); + +//- rjf: list building +internal CTRL_Msg *ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list); +internal CTRL_MsgList ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src); +internal void ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src); + +//- rjf: serialization +internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs); +internal CTRL_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: Event Type Functions + +//- rjf: list building +internal CTRL_Event *ctrl_event_list_push(Arena *arena, CTRL_EventList *list); +internal void ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push); + +//- rjf: serialization +internal String8 ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max); +internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); + +//////////////////////////////// +//~ rjf: Entity Type Functions + +//- rjf: entity list data structures +internal void ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity); +internal CTRL_EntityList ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_HandleList *list); +#define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &ctrl_entity_nil) + +//- rjf: entity array data structure +internal CTRL_EntityArray ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list); +#define ctrl_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &ctrl_entity_nil) + +//- rjf: entity context (entity group read-only) functions +internal CTRL_Entity *ctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle); +internal CTRL_Entity *ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind); +internal CTRL_Entity *ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind); +internal CTRL_Entity *ctrl_process_from_entity(CTRL_Entity *entity); +internal CTRL_Entity *ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr); +internal DI_Key ctrl_dbgi_key_from_module(CTRL_Entity *module); +internal CTRL_Entity *ctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTRL_EntityList *candidates); +internal U64 ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff); +internal U64 ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr); +internal Rng1U64 ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range); +internal Rng1U64 ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range); +internal B32 ctrl_entity_tree_is_frozen(CTRL_Entity *root); + +//- rjf: entity tree iteration +internal CTRL_EntityRec ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off); +#define ctrl_entity_rec_depth_first_pre(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, next), OffsetOf(CTRL_Entity, first)) +#define ctrl_entity_rec_depth_first_post(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, prev), OffsetOf(CTRL_Entity, last)) + +//- rjf: entity ctx r/w store state functions +internal CTRL_EntityCtxRWStore *ctrl_entity_ctx_rw_store_alloc(void); +internal void ctrl_entity_ctx_rw_store_release(CTRL_EntityCtxRWStore *store); + +//- rjf: string allocation/deletion +internal U64 ctrl_name_bucket_num_from_string_size(U64 size); +internal String8 ctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string); +internal void ctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string); + +//- rjf: entity construction/deletion +internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id); +internal void ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity); + +//- rjf: entity equipment +internal void ctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, String8 string); + +//- rjf: accelerated entity context lookups +internal CTRL_EntityCtxLookupAccel *ctrl_thread_entity_ctx_lookup_accel(void); +internal CTRL_EntityArray ctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind); +internal CTRL_EntityList ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key); +internal CTRL_Entity *ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id); + +//- rjf: applying events to entity caches +internal void ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list); + +//////////////////////////////// +//~ rjf: Main Layer Initialization + +internal void ctrl_init(void); + +//////////////////////////////// +//~ rjf: Wakeup Callback Registration + +internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); + +//////////////////////////////// +//~ rjf: Thread Register Functions + +//- rjf: thread register cache reading +internal void *ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle); +internal U64 ctrl_tls_root_vaddr_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); +internal U64 ctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); +internal U64 ctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); + +//- rjf: thread register writing +internal B32 ctrl_thread_write_reg_block(CTRL_Handle thread, void *block); + +//////////////////////////////// +//~ rjf: Module Image Info Functions + +//- rjf: cache lookups +internal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff); +internal U64 ctrl_entry_point_voff_from_module(CTRL_Handle module_handle); +internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle); +internal String8 ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle); + +//////////////////////////////// +//~ Process Info Functions + +internal Arch ctrl_arch_from_process_handle(CTRL_Handle process_handle); + +//////////////////////////////// +//~ rjf: Unwinding Functions + +//- rjf: unwind deep copier +internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src); + +//- DWARF +internal CTRL_UnwindStepResult ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out); +internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us); + +//- rjf: [x64] +internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); +internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); + +//- rjf: abstracted full unwind +internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us); + +//////////////////////////////// +//~ rjf: Call Stack Building Functions + +internal CTRL_CallStack ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *base_unwind); +internal CTRL_CallStackFrame *ctrl_call_stack_frame_from_unwind_and_inline_depth(CTRL_CallStack *call_stack, U64 unwind_count, U64 inline_depth); + +//////////////////////////////// +//~ rjf: Halting All Attached Processes + +internal void ctrl_halt(void); + +//////////////////////////////// +//~ rjf: Shared Accessor Functions + +//- rjf: generation counters +internal U64 ctrl_run_gen(void); +internal U64 ctrl_mem_gen(void); +internal U64 ctrl_reg_gen(void); + +//- rjf: name -> register/alias hash tables, for eval +internal E_String2NumMap *ctrl_string2reg_from_arch(Arch arch); +internal E_String2NumMap *ctrl_string2alias_from_arch(Arch arch); + +//////////////////////////////// +//~ rjf: Control-Thread Functions + +//- rjf: user -> control thread communication +internal B32 ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us); +internal CTRL_MsgList ctrl_u2c_pop_msgs(Arena *arena); + +//- rjf: control -> user thread communication +internal void ctrl_c2u_push_events(CTRL_EventList *events); +internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); + +//- rjf: entry point +internal void ctrl_thread__entry_point(void *p); + +//- rjf: breakpoint resolution +internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out); + +//- rjf: module lifetime open/close work +internal void ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); +internal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range); + +//- rjf: attached process running/event gathering +internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); + +//- rjf: eval helpers +internal U64 ctrl_eval_space_gen(E_Space space); +internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); + +//- rjf: control thread eval scopes +internal CTRL_EvalScope *ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread); +internal void ctrl_thread__eval_scope_end(CTRL_EvalScope *scope); + +//- rjf: log flusher +internal void ctrl_thread__end_and_flush_log(void); + +//- rjf: msg kind implementations +internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); + +//////////////////////////////// +//~ rjf: Process Memory Artifact Cache Hooks / Lookups + +internal AC_Artifact ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal void ctrl_memory_artifact_destroy(AC_Artifact artifact); +internal C_Key ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale); + +//- rjf: process memory reading helpers +internal CTRL_ProcessMemorySlice ctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us); +internal B32 ctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); +#define ctrl_process_memory_read_struct(process, vaddr, is_stale_out, ptr, endt_us) ctrl_process_memory_read((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) + +//- rjf: process memory writing +internal B32 ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src); + +//////////////////////////////// +//~ rjf: Call Stack Artifact Cache Hooks / Lookups + +internal AC_Artifact ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal void ctrl_call_stack_artifact_destroy(AC_Artifact artifact); +internal CTRL_CallStack ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us); + +//////////////////////////////// +//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups + +internal AC_Artifact ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal void ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact); +internal CTRL_CallStackTree ctrl_call_stack_tree(Access *access, U64 endt_us); + +#endif // CTRL_CORE_H diff --git a/src/dbg_engine/dbg_engine_inc.c b/src/dbg_engine/dbg_engine_inc.c index b3d11c5b..04b84edd 100644 --- a/src/dbg_engine/dbg_engine_inc.c +++ b/src/dbg_engine/dbg_engine_inc.c @@ -2,3 +2,5 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #include "dbg_engine_core.c" +#include "dbg_engine_user.c" +#include "dbg_engine_ctrl.c" diff --git a/src/dbg_engine/dbg_engine_inc.h b/src/dbg_engine/dbg_engine_inc.h index 5dcf2fb4..df2d596d 100644 --- a/src/dbg_engine/dbg_engine_inc.h +++ b/src/dbg_engine/dbg_engine_inc.h @@ -5,5 +5,7 @@ #define DBG_ENGINE_INC_H #include "dbg_engine_core.h" +#include "dbg_engine_user.h" +#include "dbg_engine_ctrl.h" #endif // DBG_ENGINE_INC_H diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c new file mode 100644 index 00000000..84ee8b33 --- /dev/null +++ b/src/dbg_engine/dbg_engine_user.c @@ -0,0 +1,2255 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#undef LAYER_COLOR +#define LAYER_COLOR 0x4d9ae3ff + +//////////////////////////////// +//~ rjf: Basic Helpers + +#if !defined(XXH_IMPLEMENTATION) +# define XXH_IMPLEMENTATION +# define XXH_STATIC_LINKING_ONLY +# include "third_party/xxHash/xxhash.h" +#endif + +internal U64 +d_hash_from_seed_string(U64 seed, String8 string) +{ + U64 result = XXH3_64bits_withSeed(string.str, string.size, seed); + return result; +} + +internal U64 +d_hash_from_string(String8 string) +{ + return d_hash_from_seed_string(5381, string); +} + +internal U64 +d_hash_from_seed_string__case_insensitive(U64 seed, String8 string) +{ + U64 result = seed; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + lower_from_char(string.str[i]); + } + return result; +} + +internal U64 +d_hash_from_string__case_insensitive(String8 string) +{ + return d_hash_from_seed_string__case_insensitive(5381, string); +} + +//////////////////////////////// +//~ rjf: Breakpoints + +internal D_BreakpointArray +d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src) +{ + D_BreakpointArray dst = {0}; + dst.count = src->count; + dst.v = push_array(arena, D_Breakpoint, dst.count); + MemoryCopy(dst.v, src->v, sizeof(dst.v[0])*dst.count); + for(U64 idx = 0; idx < dst.count; idx += 1) + { + dst.v[idx].file_path = push_str8_copy(arena, dst.v[idx].file_path); + dst.v[idx].vaddr_expr = push_str8_copy(arena, dst.v[idx].vaddr_expr); + dst.v[idx].condition = push_str8_copy(arena, dst.v[idx].condition); + } + return dst; +} + +//////////////////////////////// +//~ rjf: Path Map Application + +internal String8List +d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path) +{ + // NOTE(rjf): This path, given some target file path, scans all file path map + // overrides, and collects the set of file paths which could've redirected + // to the target file path given the set of file path maps. + // + // For example, if I have a rule saying D:/devel/ maps to C:/devel/, and I + // feed in C:/devel/foo/bar.txt, then this path will construct + // D:/devel/foo/bar.txt, as a possible option. + // + // It will also preserve C:/devel/foo/bar.txt in the resultant list, so that + // overrideless files still work through this path, and both redirected + // files and non-redirected files can go through the same path. + // + String8List result = {0}; + str8_list_push(arena, &result, file_path); + Temp scratch = scratch_begin(&arena, 1); + PathStyle pth_style = PathStyle_Relative; + String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style); + { + for(U64 idx = 0; idx < path_maps->count; idx += 1) + { + //- rjf: unpack link + D_PathMap *map = &path_maps->v[idx]; + PathStyle src_style = PathStyle_Relative; + PathStyle dst_style = PathStyle_Relative; + String8List src_parts = path_normalized_list_from_string(scratch.arena, map->src, &src_style); + String8List dst_parts = path_normalized_list_from_string(scratch.arena, map->dst, &dst_style); + + //- rjf: determine if this link can possibly redirect to the target file path + B32 dst_redirects_to_pth = 0; + String8Node *non_redirected_pth_first = 0; + if(dst_style == pth_style && dst_parts.first != 0 && pth_parts.first != 0) + { + dst_redirects_to_pth = 1; + String8Node *dst_n = dst_parts.first; + String8Node *pth_n = pth_parts.first; + for(;dst_n != 0 && pth_n != 0; dst_n = dst_n->next, pth_n = pth_n->next) + { + if(!str8_match(dst_n->string, pth_n->string, StringMatchFlag_CaseInsensitive)) + { + dst_redirects_to_pth = 0; + break; + } + non_redirected_pth_first = pth_n->next; + } + } + + //- rjf: if this link can redirect to this path via `src` -> `dst`, compute + // possible full source path, by taking `src` and appending non-redirected + // suffix (which did not show up in `dst`) + if(dst_redirects_to_pth) + { + String8List candidate_parts = src_parts; + for(String8Node *p = non_redirected_pth_first; p != 0; p = p->next) + { + str8_list_push(scratch.arena, &candidate_parts, p->string); + } + StringJoin join = {0}; + join.sep = str8_lit("/"); + String8 candidate_path = str8_list_join(arena, &candidate_parts, &join); + str8_list_push(arena, &result, candidate_path); + } + } + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Debug Info Extraction Type Pure Functions + +internal D_LineList +d_line_list_copy(Arena *arena, D_LineList *list) +{ + D_LineList dst = {0}; + for(D_LineNode *src_n = list->first; src_n != 0; src_n = src_n->next) + { + D_LineNode *dst_n = push_array(arena, D_LineNode, 1); + MemoryCopyStruct(dst_n, src_n); + dst_n->v.file_path = push_str8_copy(arena, dst_n->v.file_path); + SLLQueuePush(dst.first, dst.last, dst_n); + dst.count += 1; + } + return dst; +} + +//////////////////////////////// +//~ rjf: Command Type Functions + +//- rjf: command parameters + +internal D_CmdParams +d_cmd_params_copy(Arena *arena, D_CmdParams *src) +{ + D_CmdParams dst = {0}; + MemoryCopyStruct(&dst, src); + dst.file_path = push_str8_copy(arena, dst.file_path); + dst.targets.v = push_array(arena, D_Target, dst.targets.count); + MemoryCopy(dst.targets.v, src->targets.v, sizeof(D_Target)*dst.targets.count); + for(U64 idx = 0; idx < dst.targets.count; idx += 1) + { + D_Target *target = &dst.targets.v[idx]; + target->exe = push_str8_copy(arena, target->exe); + target->args = push_str8_copy(arena, target->args); + target->working_directory = push_str8_copy(arena, target->working_directory); + target->custom_entry_point_name = push_str8_copy(arena, target->custom_entry_point_name); + target->env = str8_list_copy(arena, &target->env); + } + return dst; +} + +//- rjf: command lists + +internal void +d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params) +{ + D_CmdNode *n = push_array(arena, D_CmdNode, 1); + n->cmd.kind = kind; + n->cmd.params = d_cmd_params_copy(arena, params); + DLLPushBack(cmds->first, cmds->last, n); + cmds->count += 1; +} + +//////////////////////////////// +//~ rjf: Stepping "Trap Net" Builders + +// NOTE(rjf): Stepping Algorithm Overview (2024/01/17) +// +// The basic idea behind all stepping algorithms in the debugger are setting up +// a "trap net". A "trap net" is just a collection of high-level traps that are +// meant to "catch" a thread after letting it run. This trap net is submitted +// when the debugger frontend sends a "run" command (it is just empty if doing +// an actual 'run' or 'continue'). The debugger control thread then uses this +// trap net to program a state machine, to appropriately respond to a variety +// of debug events which it is passed from the OS. +// +// These are "high-level traps" because they can have specific behavioral info +// attached to them. These are encoded via the `CTRL_TrapFlags` type, which +// allow expression of the following behaviors: +// +// - end-stepping: when this trap is hit, it will end the stepping operation, +// and the target will not continue. +// - ignore-stack-pointer-check: when a trap in the trap net is hit, it will +// by-default be ignored if the thread's stack pointer has changed. this +// flag disables that behavior, for when the stack pointer is expected to +// change (e.g. step-out). +// - single-step-after-hit: when a trap with this flag is hit, the debugger +// will immediately single-step the thread which hit it. +// - save-stack-pointer: when a trap with this flag is hit, it will rewrite +// the stack pointer which is used to compare against, when deciding +// whether or not to filter a trap (based on stack pointer changes). +// - begin-spoof-mode: this enables "spoof mode". "spoof mode" is a special +// mode that disables the trap net entirely, and lets the thread run +// freely - but it catches the thread not with a trap, but a false return +// address. the debugger will overwrite a specific return address on the +// stack. this address will be overwritten with an address which does NOT +// point to a valid page, such that when the thread returns out of a +// particular call frame, the debugger will receive a debug event, at +// which point it can move the thread back to the correct return address, +// and resume with the trap net enabled. this is used in "step over" +// operations, because it avoids target <-> debugger "roundtrips" (e.g. +// target being stopped, debugger being called with debug events, then +// target resumes when debugger's control thread is done running) for +// recursions. (it doesn't make a difference with non-recursive calls, +// but the debugger can't detect the difference). +// +// Each stepping command prepares its trap net differently. +// +// --- Instruction Step Into -------------------------------------------------- +// In this case, no trap net is prepared, and only a low-level single-step is +// performed. +// +// --- Instruction Step Over -------------------------------------------------- +// To build a trap net for an instruction-level step-over, the next instruction +// at the thread's current instruction pointer is decoded. If it is a call +// instruction, or if it is a repeating instruction, then a trap with the +// 'end-stepping' behavior is placed at the instruction immediately following +// the 'call' instruction. +// +// --- Line Step Into --------------------------------------------------------- +// For a source-line step-into, the thread's instruction pointer is first used +// to look up into the debug info's line info, to find the machine code in the +// thread's current source line. Every instruction in this range is decoded. +// Traps are then built in the following way: +// +// - 'call' instruction -> if can decode call destination address, place +// "end-stepping | ignore-stack-pointer-check" trap at destination. if +// can't, "end-stepping | single-step-after | ignore-stack-pointer-check" +// trap at call. +// - 'jmp' (both unconditional & conditional) -> if can decode jump destination +// address, AND if jump leaves the line, place "end-stepping | ignore- +// stack-pointer-check" trap at destination. if can't, "end-stepping | +// single-step-after | ignore-stack-pointer-check" trap at jmp. if jump +// stays within the line, do nothing. +// - 'return' -> place "end-stepping | single-step-after" trap at return inst. +// - "end-stepping" trap is placed at the first address after the line, to +// catch all steps which simply proceed linearly through the instruction +// stream. +// +// --- Line Step Over --------------------------------------------------------- +// For a source-line step-over, the thread's instruction pointer is first used +// to look up into the debug info's line info, to find the machine code in the +// thread's current source line. Every instruction in this range is decoded. +// Traps are then built in the following way: +// +// - 'call' instruction -> place "single-step-after | begin-spoof-mode" trap at +// call instruction. +// - 'jmp' (both unconditional & conditional) -> if can decode jump destination +// address, AND if jump leaves the line, place "end-stepping" trap at +// destination. if can't, "end-stepping | single-step-after" trap at jmp. +// if jump stays within the line, do nothing. +// - 'return' -> place "end-stepping | single-step-after" trap at return inst. +// - "end-stepping" trap is placed at the first address after the line, to +// catch all steps which simply proceed linearly through the instruction +// stream. +// - for any instructions which may change the stack pointer, traps are placed +// at them with the "save-stack-pointer | single-step-after" behaviors. + +internal D_TrapNet +d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread) +{ + Temp scratch = scratch_begin(&arena, 1); + D_TrapNet result = {0}; + + // rjf: thread => unpacked info + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + Arch arch = thread->arch; + U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + + // rjf: ip => machine code + String8 machine_code = {0}; + { + Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, os_now_microseconds()+5000); + machine_code = machine_code_slice.data; + } + + // rjf: build traps if machine code was read successfully + if(machine_code.size != 0) + { + result.good_read = 1; + + // rjf: decode instruction + DASM_Inst inst = dasm_inst_from_code(scratch.arena, arch, ip_vaddr, machine_code, DASM_Syntax_Intel); + + // rjf: call => run until call returns + if(inst.flags & DASM_InstFlag_Call || inst.flags & DASM_InstFlag_Repeats) + { + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, ip_vaddr+inst.size}; + ctrl_trap_list_push(arena, &result.traps, &trap); + } + } + + scratch_end(scratch); + return result; +} + +internal D_TrapNet +d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) +{ + Temp scratch = scratch_begin(&arena, 1); + log_infof("step_over_line:\n{\n"); + D_TrapNet result = {0}; + + // rjf: thread => info + Arch arch = thread->arch; + U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr); + log_infof("dbgi_key: {0x%I64x, 0x%I64x}\n", dbgi_key.u64[0], dbgi_key.u64[1]); + + // rjf: ip => line info + String8 file_path = {0}; + S64 line_num = 0; + Rng1U64 line_vaddr_rng = {0}; + { + U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, ip_voff); + Rng1U64 line_voff_rng = {0}; + if(lines.first != 0) + { + line_voff_rng = lines.first->v.voff_range; + file_path = lines.first->v.file_path; + line_num = lines.first->v.pt.line; + line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); + log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); + } + log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); + log_infof("vaddr_range: {0x%I64x, 0x%I64x}\n", line_vaddr_rng.min, line_vaddr_rng.max); + } + + // rjf: gather other ranges on this same textual line, which we don't want to return to + Rng1U64List all_vaddr_ranges_on_same_line = {0}; + { + D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num); + for EachNode(n, D_LineNode, lines.first) + { + Rng1U64 voff_range = n->v.voff_range; + Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); + rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); + } + } + + // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range + // + // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging + // is enabled. This is enabled by default normally. + { + U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, opl_line_voff_rng); + if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) + { + line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max); + } + } + + // rjf: line vaddr range => did we find anything successfully? + B32 good_line_info = (line_vaddr_rng.max != 0); + + // rjf: line vaddr range => line's machine code + String8 machine_code = {0}; + B32 good_machine_code = 0; + if(good_line_info) + { + CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+50000); + machine_code = machine_code_slice.data; + good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); + LogInfoNamedBlockF("machine_code_slice") + { + log_infof("stale: %i\n", machine_code_slice.stale); + log_infof("any_byte_bad: %i\n", machine_code_slice.any_byte_bad); + log_infof("any_byte_changed: %i\n", machine_code_slice.any_byte_changed); + log_infof("bytes:\n[\n"); + for(U64 idx = 0; idx < machine_code_slice.data.size; idx += 1) + { + log_infof("0x%x,", machine_code_slice.data.str[idx]); + if(idx%16 == 15 || idx+1 == machine_code_slice.data.size) + { + log_infof("\n"); + } + } + log_infof("]\n"); + } + } + + // rjf: machine code => ctrl flow analysis + DASM_CtrlFlowInfo ctrl_flow_info = {0}; + if(good_machine_code) + { + ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, + DASM_InstFlag_Call| + DASM_InstFlag_Branch| + DASM_InstFlag_UnconditionalJump| + DASM_InstFlag_ChangesStackPointer| + DASM_InstFlag_Return, + arch, + line_vaddr_rng.min, + machine_code); + LogInfoNamedBlockF("ctrl_flow_info") + { + LogInfoNamedBlockF("exit_points") for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) + { + log_infof("{vaddr:0x%I64x, jump_dest_vaddr:0x%I64x, inst_flags:%x}\n", n->v.vaddr, n->v.jump_dest_vaddr, n->v.inst_flags); + } + } + } + + // rjf: push traps for all exit points + if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) + { + DASM_CtrlFlowPoint *point = &n->v; + CTRL_TrapFlags flags = 0; + B32 add = 1; + U64 trap_addr = point->vaddr; + + // rjf: branches/jumps/returns => single-step & end, OR trap @ destination. + if(point->inst_flags & (DASM_InstFlag_Branch| + DASM_InstFlag_UnconditionalJump| + DASM_InstFlag_Return)) + { + flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping); + + // rjf: omit if this jump stays inside of this line + if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) + { + add = 0; + } + + // rjf: omit if this jump stays inside of any range on this same textual line + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(contains_1u64(n->v, point->jump_dest_vaddr)) + { + add = 0; + break; + } + } + + // rjf: trap @ destination, if we can - we can avoid a single-step this way. + if(point->jump_dest_vaddr != 0) + { + trap_addr = point->jump_dest_vaddr; + flags &= ~CTRL_TrapFlag_SingleStepAfterHit; + } + + } + + // rjf: call => place spoof at return spot in stack, single-step after hitting + else if(point->inst_flags & DASM_InstFlag_Call) + { + flags |= (CTRL_TrapFlag_BeginSpoofMode|CTRL_TrapFlag_SingleStepAfterHit); + } + + // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping + else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) + { + flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); + } + + // rjf: add if appropriate + if(add) + { + CTRL_Trap trap = {flags, trap_addr}; + ctrl_trap_list_push(arena, &result.traps, &trap); + } + } + + // rjf: push traps for natural linear flow + if(good_line_info && good_machine_code) + { + U64 line_opl_vaddr = line_vaddr_rng.max; + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + U64 opl = n->v.max; + B32 opl_in_line = 0; + for EachNode(n2, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(n != n2 && opl == n2->v.min) + { + opl_in_line = 1; + break; + } + } + if(!opl_in_line) + { + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, opl}; + ctrl_trap_list_push(arena, &result.traps, &trap); + } + } + } + + // rjf: store goodness + if(good_machine_code) + { + result.good_line_info = good_line_info; + result.good_read = good_machine_code; + } + + // rjf: log + LogInfoNamedBlockF("traps") for(CTRL_TrapNode *n = result.traps.first; n != 0; n = n->next) + { + log_infof("{flags:0x%x, vaddr:0x%I64x}\n", n->v.flags, n->v.vaddr); + } + + scratch_end(scratch); + log_infof("}\n\n"); + return result; +} + +internal D_TrapNet +d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) +{ + Temp scratch = scratch_begin(&arena, 1); + D_TrapNet result = {0}; + + // rjf: thread => info + Arch arch = thread->arch; + U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + + // rjf: ip => line info + String8 file_path = {0}; + S64 line_num = 0; + Rng1U64 line_vaddr_rng = {0}; + { + U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, ip_voff); + Rng1U64 line_voff_rng = {0}; + if(lines.first != 0) + { + line_voff_rng = lines.first->v.voff_range; + file_path = lines.first->v.file_path; + line_num = lines.first->v.pt.line; + line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); + log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); + } + log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); + log_infof("vaddr_range: {0x%I64x, 0x%I64x}\n", line_vaddr_rng.min, line_vaddr_rng.max); + } + + // rjf: gather other ranges on this same textual line, which we don't want to return to + Rng1U64List all_vaddr_ranges_on_same_line = {0}; + { + D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num); + for EachNode(n, D_LineNode, lines.first) + { + Rng1U64 voff_range = n->v.voff_range; + Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); + rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); + } + } + + // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range + // + // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging + // is enabled. This is enabled by default normally. + { + U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, opl_line_voff_rng); + if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) + { + line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max); + } + } + + // rjf: line vaddr range => did we find anything successfully? + B32 good_line_info = (line_vaddr_rng.max != 0); + + // rjf: line vaddr range => line's machine code + String8 machine_code = {0}; + B32 good_machine_code = 0; + if(good_line_info) + { + CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+5000); + machine_code = machine_code_slice.data; + good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); + } + + // rjf: machine code => ctrl flow analysis + DASM_CtrlFlowInfo ctrl_flow_info = {0}; + if(good_machine_code) + { + ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, + DASM_InstFlag_Call| + DASM_InstFlag_Branch| + DASM_InstFlag_UnconditionalJump| + DASM_InstFlag_ChangesStackPointer| + DASM_InstFlag_Return, + arch, + line_vaddr_rng.min, + machine_code); + } + + // rjf: determine last + DASM_CtrlFlowPoint *last_call_point = 0; + if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) + { + if(n->v.inst_flags & DASM_InstFlag_Call) + { + last_call_point = &n->v; + } + } + + // rjf: push traps for all exit points + if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) + { + DASM_CtrlFlowPoint *point = &n->v; + CTRL_TrapFlags flags = 0; + B32 add = 1; + U64 trap_addr = point->vaddr; + + // rjf: if this is not the last call instruction in the control flow, + // and if we have no line info for this address, then do not add. + if(point != last_call_point && + point->inst_flags & DASM_InstFlag_Call && + point->jump_dest_vaddr != 0) + { + U64 jump_dest_vaddr = point->jump_dest_vaddr; + CTRL_Entity *jump_dest_module = ctrl_module_from_process_vaddr(process, jump_dest_vaddr); + U64 jump_dest_voff = ctrl_voff_from_vaddr(jump_dest_module, jump_dest_vaddr); + DI_Key jump_dest_dbgi_key = ctrl_dbgi_key_from_module(jump_dest_module); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, jump_dest_dbgi_key, jump_dest_voff); + if(lines.count == 0) + { + add = 0; + } + } + + // rjf: branches/jumps/returns => single-step & end, OR trap @ destination. + if(point->inst_flags & (DASM_InstFlag_Call| + DASM_InstFlag_Branch| + DASM_InstFlag_UnconditionalJump| + DASM_InstFlag_Return)) + { + flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck); + + // rjf: omit if this jump stays inside of this line + if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) + { + add = 0; + } + + // rjf: omit if this jump stays inside of any range on this same textual line + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(contains_1u64(n->v, point->jump_dest_vaddr)) + { + add = 0; + break; + } + } + + // rjf: trap @ destination, if we can - we can avoid a single-step this way. + if(point->jump_dest_vaddr != 0) + { + trap_addr = point->jump_dest_vaddr; + flags &= ~CTRL_TrapFlag_SingleStepAfterHit; + } + } + + // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping + else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) + { + flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); + } + + // rjf: add if appropriate + if(add) + { + CTRL_Trap trap = {flags, trap_addr}; + ctrl_trap_list_push(arena, &result.traps, &trap); + } + } + + // rjf: push traps for natural linear flow + if(good_line_info && good_machine_code) + { + U64 line_opl_vaddr = line_vaddr_rng.max; + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + U64 opl = n->v.max; + B32 opl_in_line = 0; + for EachNode(n2, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(n != n2 && opl == n2->v.min) + { + opl_in_line = 1; + break; + } + } + if(!opl_in_line) + { + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, opl}; + ctrl_trap_list_push(arena, &result.traps, &trap); + } + } + } + + // rjf: store goodness + { + result.good_line_info = good_line_info; + result.good_read = good_machine_code; + } + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Debug Info Lookups + +//- rjf: voff -> line info + +internal D_LineList +d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff) +{ + Temp scratch = scratch_begin(&arena, 1); + Access *access = access_open(); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); + D_LineList result = {0}; + { + //- rjf: gather line tables + typedef struct LineTableNode LineTableNode; + struct LineTableNode + { + LineTableNode *next; + RDI_ParsedLineTable parsed_line_table; + }; + LineTableNode start_line_table = {0}; + RDI_Unit *unit = rdi_unit_from_voff(rdi, voff); + RDI_LineTable *unit_line_table = rdi_line_table_from_unit(rdi, unit); + rdi_parsed_from_line_table(rdi, unit_line_table, &start_line_table.parsed_line_table); + LineTableNode *top_line_table = 0; + RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); + { + for(RDI_Scope *s = scope; + s->inline_site_idx != 0; + s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx)) + { + RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx); + if(inline_site->line_table_idx != 0) + { + LineTableNode *n = push_array(scratch.arena, LineTableNode, 1); + SLLStackPush(top_line_table, n); + RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, inline_site->line_table_idx); + rdi_parsed_from_line_table(rdi, line_table, &n->parsed_line_table); + } + } + } + SLLStackPush(top_line_table, &start_line_table); + + //- rjf: gather lines in each line table + Rng1U64 shallowest_voff_range = {0}; + for(LineTableNode *line_table_n = top_line_table; line_table_n != 0; line_table_n = line_table_n->next) + { + RDI_ParsedLineTable parsed_line_table = line_table_n->parsed_line_table; + U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed_line_table, voff); + if(line_info_idx < parsed_line_table.count) + { + RDI_Line *line = &parsed_line_table.lines[line_info_idx]; + RDI_Column *column = (line_info_idx < parsed_line_table.col_count) ? &parsed_line_table.cols[line_info_idx] : 0; + RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); + String8List path_parts = {0}; + for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, file->file_path_node_idx); + fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0); + fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node)) + { + String8 path_part = {0}; + path_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &path_part.size); + str8_list_push_front(scratch.arena, &path_parts, path_part); + } + StringJoin join = {0}; + join.sep = str8_lit("/"); + String8 file_normalized_full_path = str8_list_join(arena, &path_parts, &join); + D_LineNode *n = push_array(arena, D_LineNode, 1); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + if(line->file_idx != 0 && file_normalized_full_path.size != 0) + { + n->v.file_path = file_normalized_full_path; + } + n->v.pt = txt_pt(line->line_num, column ? column->col_first : 1); + n->v.voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]); + n->v.dbgi_key = dbgi_key; + if(line_table_n == top_line_table) + { + shallowest_voff_range = n->v.voff_range; + } + } + } + + //- rjf: clamp all lines from all tables by shallowest (most unwound) range + for(D_LineNode *n = result.first; n != 0; n = n->next) + { + n->v.voff_range = intersect_1u64(n->v.voff_range, shallowest_voff_range); + } + } + access_close(access); + scratch_end(scratch); + return result; +} + +//- rjf: file:line -> line info + +// TODO(rjf): this depends on file path maps, needs to move + +internal D_LineListArray +d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range) +{ + D_LineListArray array = {0}; + { + array.count = dim_1s64(line_num_range)+1; + array.v = push_array(arena, D_LineList, array.count); + di_key_list_push(arena, &array.dbgi_keys, dbgi_key); + } + Temp scratch = scratch_begin(&arena, 1); + U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count); + Access *access = access_open(); + String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path); + for(String8Node *override_n = overrides.first; + override_n != 0; + override_n = override_n->next) + { + String8 file_path = override_n->string; + String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); + + // rjf: binary -> rdi + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + + // rjf: file_path_normalized * rdi -> src_id + B32 good_src_id = 0; + U32 src_id = 0; + if(rdi != &rdi_parsed_nil) ProfScope("file_path_normalized * rdi -> src_id") + { + RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + good_src_id = 1; + src_id = ids[0]; + } + } + } + + // rjf: good src-id -> look up line info for visible range + if(good_src_id) ProfScope("good src-id -> look up line info for visible range") + { + RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); + RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); + U64 line_idx = 0; + for(S64 line_num = line_num_range.min; + line_num <= line_num_range.max; + line_num += 1, line_idx += 1) + { + D_LineList *list = &array.v[line_idx]; + U32 voff_count = 0; + U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); + if(lines_num_voffs[line_idx] < 8) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) + { + U64 base_voff = voffs[idx]; + U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); + RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); + RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); + RDI_ParsedLineTable unit_line_info = {0}; + rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); + if(unit_line_info.voffs != 0) + { + Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); + S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; + D_LineNode *n = push_array(arena, D_LineNode, 1); + n->v.voff_range = range; + n->v.pt.line = (S64)actual_line; + n->v.pt.column = 1; + n->v.dbgi_key = dbgi_key; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + lines_num_voffs[line_idx] += 1; + if(lines_num_voffs[line_idx] >= 8) + { + break; + } + } + } + } + } + } + access_close(access); + scratch_end(scratch); + return array; +} + +internal D_LineListArray +d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range) +{ + D_LineListArray array = {0}; + { + array.count = dim_1s64(line_num_range)+1; + array.v = push_array(arena, D_LineList, array.count); + } + Temp scratch = scratch_begin(&arena, 1); + U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count); + DI_KeyArray dbgi_keys = di_push_all_loaded_keys(scratch.arena); + String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path); + for(String8Node *override_n = overrides.first; + override_n != 0; + override_n = override_n->next) + { + String8 file_path = override_n->string; + String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); + for EachIndex(idx, dbgi_keys.count) + { + Access *access = access_open(); + + // rjf: binary -> rdi + DI_Key key = dbgi_keys.v[idx]; + RDI_Parsed *rdi = di_rdi_from_key(access, key, 1, 0); + + // rjf: file_path_normalized * rdi -> src_id + B32 good_src_id = 0; + U32 src_id = 0; + if(rdi != &rdi_parsed_nil) ProfScope("file_path_normalized * rdi -> src_id") + { + RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size); + if(node != 0) + { + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) + { + good_src_id = 1; + src_id = ids[0]; + } + } + } + + // rjf: good src-id -> look up line info for visible range + if(good_src_id) ProfScope("good src-id -> look up line info for visible range") + { + RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); + RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); + U64 line_idx = 0; + for(S64 line_num = line_num_range.min; + line_num <= line_num_range.max; + line_num += 1, line_idx += 1) + { + D_LineList *list = &array.v[line_idx]; + U32 voff_count = 0; + U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); + if(lines_num_voffs[line_idx] < 8) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) + { + U64 base_voff = voffs[idx]; + U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); + RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); + RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); + RDI_ParsedLineTable unit_line_info = {0}; + rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff); + if(unit_line_info.voffs != 0) + { + Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]); + S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num; + D_LineNode *n = push_array(arena, D_LineNode, 1); + n->v.voff_range = range; + n->v.pt.line = (S64)actual_line; + n->v.pt.column = 1; + n->v.dbgi_key = key; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + lines_num_voffs[line_idx] += 1; + if(lines_num_voffs[line_idx] >= 8) + { + break; + } + } + } + } + } + + // rjf: good src id -> push to relevant dbgi keys + if(good_src_id) + { + di_key_list_push(arena, &array.dbgi_keys, key); + } + + access_close(access); + } + } + scratch_end(scratch); + return array; +} + +internal D_LineList +d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num) +{ + D_LineListArray array = d_lines_array_from_dbgi_key_file_path_line_range(arena, dbgi_key, file_path, r1s64(line_num, line_num+1)); + D_LineList list = {0}; + if(array.count != 0) + { + list = array.v[0]; + } + return list; +} + +internal D_LineList +d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num) +{ + D_LineListArray array = d_lines_array_from_file_path_line_range(arena, file_path, r1s64(line_num, line_num+1)); + D_LineList list = {0}; + if(array.count != 0) + { + list = array.v[0]; + } + return list; +} + +//////////////////////////////// +//~ rjf: Process/Thread/Module Info Lookups + +internal U64 +d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) +{ + ProfBeginFunction(); + U64 base_vaddr = 0; + if(!d_ctrl_targets_running()) + { + Temp scratch = scratch_begin(0, 0); + + //- rjf: unpack module info + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + U64 addr_size = byte_size_from_arch(process->arch); + + switch(process->tls_model) + { + case CTRL_TlsModel_Null: {}break; + case CTRL_TlsModel_WinodwsNt: + { + // read thread local base pointer out of TEB + U64 thread_local_base = root_vaddr; + U64 tls_addr_array = 0; + CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_local_base, thread_local_base + addr_size), 0, 0); + String8 tls_array_vaddr_data = tls_addr_array_slice.data; + if(tls_array_vaddr_data.size == addr_size) + { + U64 tls_array_vaddr = 0; + MemoryCopyStr8(&tls_array_vaddr, tls_array_vaddr_data); + + // read thread local storage pointer (array of TLS pointers, one per module) + U64 tls_ptr_vaddr = tls_array_vaddr + module->tls_index * addr_size; + CTRL_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); + String8 result_data = result_slice.data; + if(result_data.size == addr_size) + { + MemoryCopyStr8(&base_vaddr, result_data); + } + } + }break; + case CTRL_TlsModel_Gnu: + { + if(module->tls_index > 0) // zero is reserved for the generation counter + { + // read dynamic thread vector pointer (one per dynamic module) + U64 dtv_base = root_vaddr; + U64 dtv_size = addr_size * 2; // union dtv { size_t counter; struct dtv_pointer { void *val, *to_free; }; }; + U64 dtv_pointer_vaddr = dtv_base + module->tls_index * dtv_size; + CTRL_ProcessMemorySlice dtv_pointer_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(dtv_pointer_vaddr, dtv_pointer_vaddr + dtv_size), 0, 0); + String8 dtv_pointer_data = dtv_pointer_slice.data; + if(dtv_pointer_data.size == dtv_size) + { + U64 dtv_pointer = 0; + MemoryCopyStr8(&dtv_pointer, dtv_pointer_data); + + // verify that TLS block was allocated + U64 tls_dtv_unallocated = addr_size == 4 ? max_U32 : max_U64; + if(dtv_pointer != tls_dtv_unallocated) + { + base_vaddr = dtv_pointer + module->tls_offset; // add tls_offset because DT_NEEDED modules share TLS block with the main exe + } + } + } + }break; + default: {InvalidPath;}break; + } + + scratch_end(scratch); + } + ProfEnd(); + return base_vaddr; +} + +//////////////////////////////// +//~ rjf: Target Controls + +//- rjf: stopped info from the control thread + +internal CTRL_Event +d_ctrl_last_stop_event(void) +{ + return d_state->ctrl_last_stop_event; +} + +//////////////////////////////// +//~ rjf: Main State Accessors/Mutators + +//- rjf: frame data + +internal U64 +d_frame_index(void) +{ + return d_state->frame_index; +} + +//- rjf: control state + +internal D_RunKind +d_ctrl_last_run_kind(void) +{ + return d_state->ctrl_last_run_kind; +} + +internal U64 +d_ctrl_last_run_frame_idx(void) +{ + return d_state->ctrl_last_run_frame_idx; +} + +internal B32 +d_ctrl_targets_running(void) +{ + return d_state->ctrl_is_running; +} + +//- rjf: active entity based queries + +internal DI_KeyList +d_push_active_dbgi_key_list(Arena *arena) +{ + DI_KeyList dbgis = {0}; + CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); + for EachIndex(idx, modules.count) + { + CTRL_Entity *module = modules.v[idx]; + DI_Key key = ctrl_dbgi_key_from_module(module); + di_key_list_push(arena, &dbgis, key); + } + return dbgis; +} + +//- rjf: per-run caches + +internal U64 +d_query_cached_rip_from_thread(CTRL_Entity *thread) +{ + U64 result = d_query_cached_rip_from_thread_unwind(thread, 0); + return result; +} + +internal U64 +d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) +{ + U64 result = 0; + if(unwind_count == 0) + { + result = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + } + else + { + Access *access = access_open(); + CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); + if(callstack.concrete_frames_count != 0) + { + result = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->regs); + } + access_close(access); + } + return result; +} + +internal U64 +d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) +{ + U64 cfa = 0; + Access *access = access_open(); + CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); + if(callstack.concrete_frames_count != 0) + { + cfa = callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->cfa; + } + access_close(access); + return cfa; +} + +internal U64 +d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) +{ + U64 result = 0; + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->tls_base_caches); cache_idx += 1) + { + D_RunTLSBaseCache *cache = &d_state->tls_base_caches[(d_state->tls_base_cache_gen+cache_idx)%ArrayCount(d_state->tls_base_caches)]; + if(cache_idx == 0 && cache->slots_count == 0) + { + cache->slots_count = 256; + cache->slots = push_array(cache->arena, D_RunTLSBaseCacheSlot, cache->slots_count); + } + else if(cache->slots_count == 0) + { + break; + } + CTRL_Handle handle = process->handle; + U64 hash = d_hash_from_seed_string(d_hash_from_string(str8_struct(&handle)), str8_struct(&rip_vaddr)); + U64 slot_idx = hash%cache->slots_count; + D_RunTLSBaseCacheSlot *slot = &cache->slots[slot_idx]; + D_RunTLSBaseCacheNode *node = 0; + for(D_RunTLSBaseCacheNode *n = slot->first; n != 0; n = n->hash_next) + { + if(ctrl_handle_match(n->process, handle) && n->root_vaddr == root_vaddr && n->rip_vaddr == rip_vaddr) + { + node = n; + break; + } + } + if(node == 0) + { + U64 tls_base_vaddr = d_tls_base_vaddr_from_process_root_rip(process, root_vaddr, rip_vaddr); + if(tls_base_vaddr != 0) + { + node = push_array(cache->arena, D_RunTLSBaseCacheNode, 1); + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + node->process = handle; + node->root_vaddr = root_vaddr; + node->rip_vaddr = rip_vaddr; + node->tls_base_vaddr = tls_base_vaddr; + } + } + if(node != 0 && node->tls_base_vaddr != 0) + { + result = node->tls_base_vaddr; + break; + } + } + return result; +} + +internal E_String2NumMap * +d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) +{ + ProfBeginFunction(); + E_String2NumMap *map = &e_string2num_map_nil; + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->locals_caches); cache_idx += 1) + { + D_RunLocalsCache *cache = &d_state->locals_caches[(d_state->locals_cache_gen+cache_idx)%ArrayCount(d_state->locals_caches)]; + if(cache_idx == 0 && cache->table_size == 0) + { + cache->table_size = 256; + cache->table = push_array(cache->arena, D_RunLocalsCacheSlot, cache->table_size); + } + else if(cache->table_size == 0) + { + break; + } + U64 hash = u64_hash_from_str8(str8_struct(&dbgi_key)); + U64 slot_idx = hash % cache->table_size; + D_RunLocalsCacheSlot *slot = &cache->table[slot_idx]; + D_RunLocalsCacheNode *node = 0; + for(D_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next) + { + if(di_key_match(n->dbgi_key, dbgi_key) && n->voff == voff) + { + node = n; + break; + } + } + if(node == 0) + { + Access *access = access_open(); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); + E_String2NumMap *map = e_push_locals_map_from_rdi_voff(cache->arena, rdi, voff); + if(map->slots_count != 0) + { + node = push_array(cache->arena, D_RunLocalsCacheNode, 1); + node->dbgi_key = dbgi_key; + node->voff = voff; + node->locals_map = map; + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + } + access_close(access); + } + if(node != 0 && node->locals_map->slots_count != 0) + { + map = node->locals_map; + break; + } + } + ProfEnd(); + return map; +} + +internal E_String2NumMap * +d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) +{ + ProfBeginFunction(); + E_String2NumMap *map = &e_string2num_map_nil; + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->member_caches); cache_idx += 1) + { + D_RunLocalsCache *cache = &d_state->member_caches[(d_state->member_cache_gen+cache_idx)%ArrayCount(d_state->member_caches)]; + if(cache_idx == 0 && cache->table_size == 0) + { + cache->table_size = 256; + cache->table = push_array(cache->arena, D_RunLocalsCacheSlot, cache->table_size); + } + else if(cache->table_size == 0) + { + break; + } + U64 hash = u64_hash_from_str8(str8_struct(&dbgi_key)); + U64 slot_idx = hash % cache->table_size; + D_RunLocalsCacheSlot *slot = &cache->table[slot_idx]; + D_RunLocalsCacheNode *node = 0; + for(D_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next) + { + if(di_key_match(n->dbgi_key, dbgi_key) && n->voff == voff) + { + node = n; + break; + } + } + if(node == 0) + { + Access *access = access_open(); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); + E_String2NumMap *map = e_push_member_map_from_rdi_voff(cache->arena, rdi, voff); + if(map->slots_count != 0) + { + node = push_array(cache->arena, D_RunLocalsCacheNode, 1); + node->dbgi_key = dbgi_key; + node->voff = voff; + node->locals_map = map; + SLLQueuePush_N(slot->first, slot->last, node, hash_next); + } + access_close(access); + } + if(node != 0 && node->locals_map->slots_count != 0) + { + map = node->locals_map; + break; + } + } + ProfEnd(); + return map; +} + +//- rjf: top-level command dispatch + +internal void +d_push_cmd(D_CmdKind kind, D_CmdParams *params) +{ + d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, kind, params); +} + +//- rjf: command iteration + +internal B32 +d_next_cmd(D_Cmd **cmd) +{ + D_CmdNode *start_node = d_state->cmds.first; + if(cmd[0] != 0) + { + start_node = CastFromMember(D_CmdNode, cmd, cmd[0]); + start_node = start_node->next; + } + cmd[0] = 0; + if(start_node != 0) + { + cmd[0] = &start_node->cmd; + } + return !!cmd[0]; +} + +//////////////////////////////// +//~ rjf: Main Layer Top-Level Calls + +#if !defined(XXH_IMPLEMENTATION) +# define XXH_IMPLEMENTATION +# define XXH_STATIC_LINKING_ONLY +# include "third_party/xxHash/xxhash.h" +#endif + +internal void +d_init(void) +{ + Arena *arena = arena_alloc(); + d_state = push_array(arena, D_State, 1); + d_state->arena = arena; + d_state->cmds_arena = arena_alloc(); + d_state->output_log_key = c_key_make(c_root_alloc(), c_id_make(0, 0)); + c_submit_data(d_state->output_log_key, 0, str8_zero()); + d_state->ctrl_entity_store = ctrl_entity_ctx_rw_store_alloc(); + d_state->ctrl_stop_arena = arena_alloc(); + d_state->ctrl_msg_arena = arena_alloc(); + + // rjf: set up caches + for(U64 idx = 0; idx < ArrayCount(d_state->tls_base_caches); idx += 1) + { + d_state->tls_base_caches[idx].arena = arena_alloc(); + } + for(U64 idx = 0; idx < ArrayCount(d_state->locals_caches); idx += 1) + { + d_state->locals_caches[idx].arena = arena_alloc(); + } + for(U64 idx = 0; idx < ArrayCount(d_state->member_caches); idx += 1) + { + d_state->member_caches[idx].arena = arena_alloc(); + } + + // rjf: set up run state + d_state->ctrl_last_run_arena = arena_alloc(); +} + +internal D_EventList +d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + D_EventList result = {0}; + d_state->frame_index += 1; + + ////////////////////////////// + //- rjf: sync with ctrl thread + // + ProfScope("sync with ctrl thread") + { + //- rjf: grab next reggen/memgen + U64 new_mem_gen = ctrl_mem_gen(); + U64 new_reg_gen = ctrl_reg_gen(); + + //- rjf: consume & process events + CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); + ctrl_entity_store_apply_events(d_state->ctrl_entity_store, &events); + for(CTRL_EventNode *event_n = events.first; + event_n != 0; + event_n = event_n->next) + { + CTRL_Event *event = &event_n->v; + log_infof("ctrl_event:\n{\n"); + log_infof("kind: \"%S\"\n", ctrl_string_from_event_kind(event->kind)); + log_infof("entity_id: %u\n", event->entity_id); + switch(event->kind) + { + default:{}break; + + //- rjf: errors + + case CTRL_EventKind_Error: + { + log_user_error(event->string); + }break; + + //- rjf: starts/stops + + case CTRL_EventKind_Started: + { + d_state->ctrl_is_running = 1; + d_state->ctrl_thread_run_state = 1; + }break; + + case CTRL_EventKind_Stopped: + { + B32 should_snap = !(d_state->ctrl_soft_halt_issued); + d_state->ctrl_is_running = 0; + d_state->ctrl_thread_run_state = 0; + d_state->ctrl_soft_halt_issued = 0; + + // rjf: exception or unexpected trap -> push error + if(event->cause == CTRL_EventCause_InterruptedByException || + event->cause == CTRL_EventCause_InterruptedByTrap) + { + log_user_error(str8_zero()); + } + + // rjf: gather stop info + { + arena_clear(d_state->ctrl_stop_arena); + MemoryCopyStruct(&d_state->ctrl_last_stop_event, event); + d_state->ctrl_last_stop_event.string = push_str8_copy(d_state->ctrl_stop_arena, d_state->ctrl_last_stop_event.string); + } + + // rjf: push stop event to caller, if this is not a soft-halt + if(should_snap) + { + CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, event->entity); + D_EventCause cause = D_EventCause_Null; + switch(event->cause) + { + default:{}break; + case CTRL_EventCause_InterruptedByHalt: + { + if(should_snap) + { + cause = D_EventCause_Halt; + } + else + { + cause = D_EventCause_SoftHalt; + } + }break; + case CTRL_EventCause_UserBreakpoint: {cause = D_EventCause_UserBreakpoint;}break; + } + D_EventNode *n = push_array(arena, D_EventNode, 1); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + D_Event *evt = &n->v; + evt->kind = D_EventKind_Stop; + evt->cause = cause; + evt->thread = thread->kind == CTRL_EntityKind_Thread ? thread->handle : ctrl_handle_zero(); + evt->vaddr = event->rip_vaddr; + evt->id = event->u64_code; + } + }break; + + //- rjf: entity creation/deletion + + case CTRL_EventKind_NewProc: + { + // rjf: the first process? -> clear session output + CTRL_EntityArray existing_processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + if(existing_processes.count == 1) + { + MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; + mtx_push_op(d_state->output_log_key, op); + } + }break; + + case CTRL_EventKind_EndProc: + { + D_EventNode *n = push_array(arena, D_EventNode, 1); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + D_Event *evt = &n->v; + evt->kind = D_EventKind_ProcessEnd; + evt->code = event->u64_code; + }break; + + case CTRL_EventKind_NewModule: + { + D_EventNode *n = push_array(arena, D_EventNode, 1); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + D_Event *evt = &n->v; + evt->kind = D_EventKind_ModuleLoad; + evt->module = event->entity; + }break; + + //- rjf: debug strings + + case CTRL_EventKind_DebugString: + { + MTX_Op op = {r1u64(max_U64, max_U64), event->string}; + mtx_push_op(d_state->output_log_key, op); + }break; + + //- rjf: memory + + case CTRL_EventKind_MemReserve:{}break; + case CTRL_EventKind_MemCommit:{}break; + case CTRL_EventKind_MemDecommit:{}break; + case CTRL_EventKind_MemRelease:{}break; + } + log_infof("}\n\n"); + } + + //- rjf: clear tls base cache + if((d_state->tls_base_cache_reggen_idx != new_reg_gen || + d_state->tls_base_cache_memgen_idx != new_mem_gen) && + !d_ctrl_targets_running()) + { + d_state->tls_base_cache_gen += 1; + D_RunTLSBaseCache *cache = &d_state->tls_base_caches[d_state->tls_base_cache_gen%ArrayCount(d_state->tls_base_caches)]; + arena_clear(cache->arena); + cache->slots_count = 0; + cache->slots = 0; + d_state->tls_base_cache_reggen_idx = new_reg_gen; + d_state->tls_base_cache_memgen_idx = new_mem_gen; + } + + //- rjf: clear locals cache + if(d_state->locals_cache_reggen_idx != new_reg_gen && + !d_ctrl_targets_running()) + { + d_state->locals_cache_gen += 1; + D_RunLocalsCache *cache = &d_state->locals_caches[d_state->locals_cache_gen%ArrayCount(d_state->locals_caches)]; + arena_clear(cache->arena); + cache->table_size = 0; + cache->table = 0; + d_state->locals_cache_reggen_idx = new_reg_gen; + } + + //- rjf: clear members cache + if(d_state->member_cache_reggen_idx != new_reg_gen && + !d_ctrl_targets_running()) + { + d_state->member_cache_gen += 1; + D_RunLocalsCache *cache = &d_state->member_caches[d_state->member_cache_gen%ArrayCount(d_state->member_caches)]; + arena_clear(cache->arena); + cache->table_size = 0; + cache->table = 0; + d_state->member_cache_reggen_idx = new_reg_gen; + } + } + + ////////////////////////////// + //- rjf: hash ctrl parameterization state + // + U128 ctrl_param_state_hash = {0}; + { + // rjf: build data strings of all param data + String8List strings = {0}; + { + CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + for EachIndex(idx, threads.count) + { + CTRL_Entity *thread = threads.v[idx]; + if(thread->is_frozen) + { + str8_list_push(scratch.arena, &strings, str8_struct(&thread->id)); + str8_list_push(scratch.arena, &strings, str8_struct(&thread->is_frozen)); + } + } + for(U64 idx = 0; idx < breakpoints->count; idx += 1) + { + D_Breakpoint *bp = &breakpoints->v[idx]; + str8_list_push(scratch.arena, &strings, bp->file_path); + str8_list_push(scratch.arena, &strings, str8_struct(&bp->pt)); + str8_list_push(scratch.arena, &strings, bp->vaddr_expr); + str8_list_push(scratch.arena, &strings, bp->condition); + } + } + + // rjf: join & hash to produce result + String8 string = str8_list_join(scratch.arena, &strings, 0); + XXH128_hash_t hash = XXH3_128bits(string.str, string.size); + MemoryCopy(&ctrl_param_state_hash, &hash, sizeof(ctrl_param_state_hash)); + } + + ////////////////////////////// + //- rjf: if ctrl thread is running, and our ctrl parameterization + // state hash has changed since the last run, we should soft- + // halt-refresh to inform the ctrl thread about the updated + // state + // + if(d_ctrl_targets_running() && !u128_match(ctrl_param_state_hash, d_state->ctrl_last_run_param_state_hash)) + { + d_cmd(D_CmdKind_SoftHaltRefresh); + } + + ////////////////////////////// + //- rjf: process top-level commands + // + D_CmdList deferred_cmds = {0}; + CTRL_MsgList ctrl_msgs = {0}; + ProfScope("process top-level commands") + { + D_BreakpointArray run_extra_bps = {0}; + for(D_Cmd *cmd = 0; d_next_cmd(&cmd);) + { + // rjf: unpack command + D_CmdParams *params = &cmd->params; + + // rjf: prep ctrl running arguments + B32 need_run = 0; + D_RunKind run_kind = D_RunKind_Run; + CTRL_Entity *run_thread = &ctrl_entity_nil; + CTRL_RunFlags run_flags = 0; + CTRL_TrapList run_traps = {0}; + + // rjf: process command + switch(cmd->kind) + { + default:{}break; + + //- rjf: low-level target control operations + case D_CmdKind_LaunchAndRun: + case D_CmdKind_LaunchAndStepInto: + { + // rjf: get list of targets to launch + D_TargetArray *targets_to_launch = ¶ms->targets; + + // rjf: no targets => assume all active targets + if(targets_to_launch->count == 0) + { + targets_to_launch = targets; + } + + // rjf: launch + if(targets_to_launch->count != 0) + { + for(U64 idx = 0; idx < targets_to_launch->count; idx += 1) + { + // rjf: unpack target + D_Target *target = &targets_to_launch->v[idx]; + String8 exe = str8_skip_chop_whitespace(target->exe); + String8 args = str8_skip_chop_whitespace(target->args); + String8 working_directory = str8_skip_chop_whitespace(target->working_directory); + String8 custom_entry_point_name = str8_skip_chop_whitespace(target->custom_entry_point_name); + String8 stdout_path = str8_skip_chop_whitespace(target->stdout_path); + String8 stderr_path = str8_skip_chop_whitespace(target->stderr_path); + String8 stdin_path = str8_skip_chop_whitespace(target->stdin_path); + String8List env = target->env; + if(working_directory.size == 0) + { + working_directory = os_get_current_path(scratch.arena); + } + + // rjf: build launch options + String8List cmdln_strings = {0}; + { + str8_list_push(scratch.arena, &cmdln_strings, exe); + { + U64 start_split_idx = 0; + B32 quoted = 0; + for(U64 idx = 0; idx <= args.size; idx += 1) + { + U8 byte = idx < args.size ? args.str[idx] : 0; + if(byte == '"') + { + quoted ^= 1; + } + B32 splitter_found = (!quoted && (byte == 0 || char_is_space(byte))); + if(splitter_found) + { + String8 string = str8_substr(args, r1u64(start_split_idx, idx)); + if(string.size > 0) + { + str8_list_push(scratch.arena, &cmdln_strings, string); + } + start_split_idx = idx+1; + } + } + } + } + + // rjf: push message to launch + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_Launch; + msg->path = working_directory; + msg->cmd_line_string_list = cmdln_strings; + msg->stdout_path = stdout_path; + msg->stderr_path = stderr_path; + msg->stdin_path = stdin_path; + msg->debug_subprocesses = target->debug_subprocesses; + msg->env_inherit = 1; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + str8_list_push(scratch.arena, &msg->entry_points, custom_entry_point_name); + msg->env_string_list = env; + } + } + + // rjf: run + need_run = 1; + run_kind = D_RunKind_Run; + run_thread = &ctrl_entity_nil; + run_flags = (cmd->kind == D_CmdKind_LaunchAndStepInto) ? CTRL_RunFlag_StopOnEntryPoint : 0; + } + + // rjf: no targets -> error + if(targets_to_launch->count == 0) + { + log_user_error(str8_lit("No active targets exist; cannot launch. You must select a target first.")); + } + }break; + case D_CmdKind_Kill: + { + CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->process); + if(process == &ctrl_entity_nil) + { + log_user_error(str8_lit("Cannot kill; no process was specified.")); + } + else + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_Kill; + msg->exit_code = 1; + msg->entity = process->handle; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + } + }break; + case D_CmdKind_KillAll: + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_KillAll; + msg->exit_code = 1; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + }break; + case D_CmdKind_Detach: + { + CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->process); + if(process == &ctrl_entity_nil) + { + log_user_error(str8_lit("Cannot detach; no process specified.")); + } + else + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_Detach; + msg->entity = process->handle; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + } + }break; + case D_CmdKind_Continue: + { + B32 good_to_run = 0; + CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + if(threads.count > 0) + { + for EachIndex(idx, threads.count) + { + CTRL_Entity *thread = threads.v[idx]; + if(!thread->is_frozen) + { + good_to_run = 1; + break; + } + } + if(good_to_run) + { + need_run = 1; + run_kind = D_RunKind_Run; + run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); + } + else + { + log_user_error(str8_lit("Cannot run with all threads frozen.")); + } + } + }break; + case D_CmdKind_StepIntoInst: + case D_CmdKind_StepOverInst: + case D_CmdKind_StepIntoLine: + case D_CmdKind_StepOverLine: + case D_CmdKind_StepOut: + { + CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); + if(thread == &ctrl_entity_nil) + { + log_user_error(str8_lit("Must have a selected thread to step.")); + } + else if(d_ctrl_targets_running()) + { + if(d_ctrl_last_run_kind() == D_RunKind_Run) + { + log_user_error(str8_lit("Must halt before stepping.")); + } + } + else if(thread->is_frozen) + { + log_user_error(str8_lit("Must thaw selected thread before stepping.")); + } + else + { + D_TrapNet trap_net = {0}; + switch(cmd->kind) + { + default: break; + case D_CmdKind_StepIntoInst: {trap_net.good_read = 1;}break; + case D_CmdKind_StepOverInst: {trap_net = d_trap_net_from_thread__step_over_inst(scratch.arena, thread);}break; + case D_CmdKind_StepIntoLine: {trap_net = d_trap_net_from_thread__step_into_line(scratch.arena, thread);}break; + case D_CmdKind_StepOverLine: {trap_net = d_trap_net_from_thread__step_over_line(scratch.arena, thread);}break; + case D_CmdKind_StepOut: + { + Access *access = access_open(); + + // rjf: thread => call stack + CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + + // rjf: use first unwind frame to generate trap + if(callstack.concrete_frames_count > 1) + { + U64 vaddr = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[1]->regs); + CTRL_Trap trap = {CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck, vaddr}; + ctrl_trap_list_push(scratch.arena, &trap_net.traps, &trap); + trap_net.good_read = 1; + } + else + { + log_user_error(str8_lit("Could not find the return address of the current callstack frame successfully.")); + } + + access_close(access); + }break; + } + B32 good_trap_net = (trap_net.good_read || !trap_net.good_line_info); + if(good_trap_net && trap_net.traps.count != 0) + { + need_run = 1; + run_kind = D_RunKind_Step; + run_thread = thread; + run_flags = 0; + run_traps = trap_net.traps; + } + else if(good_trap_net && trap_net.traps.count == 0) + { + need_run = 1; + run_kind = D_RunKind_SingleStep; + run_thread = thread; + run_flags = 0; + run_traps = trap_net.traps; + } + else if(!good_trap_net && params->retry_idx < 100) + { + D_CmdParams params_copy = *params; + params_copy.retry_idx += 1; + d_cmd_list_push_new(scratch.arena, &deferred_cmds, cmd->kind, ¶ms_copy); + } + else if(!good_trap_net) + { + log_user_error(str8_lit("Could not successfully step.")); + } + } + }break; + case D_CmdKind_Halt: + if(d_ctrl_targets_running()) + { + ctrl_halt(); + }break; + case D_CmdKind_SoftHaltRefresh: + if(d_ctrl_targets_running()) + { + need_run = 1; + run_kind = d_state->ctrl_last_run_kind; + run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, d_state->ctrl_last_run_thread_handle); + run_flags = d_state->ctrl_last_run_flags; + run_traps = d_state->ctrl_last_run_traps; + }break; + case D_CmdKind_SetThreadIP: + { + CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); + U64 vaddr = params->vaddr; + void *block = ctrl_reg_block_from_thread(scratch.arena, &d_state->ctrl_entity_store->ctx, thread->handle); + regs_arch_block_write_rip(thread->arch, block, vaddr); + B32 result = ctrl_thread_write_reg_block(thread->handle, block); + (void)result; + }break; + + //- rjf: high-level composite target control operations + case D_CmdKind_RunToLine: + { + run_extra_bps.count = 1; + run_extra_bps.v = push_array(scratch.arena, D_Breakpoint, 1); + if(params->file_path.size != 0) + { + run_extra_bps.v[0].file_path = params->file_path; + run_extra_bps.v[0].pt = params->cursor; + } + else if(params->vaddr != 0) + { + run_extra_bps.v[0].vaddr_expr = push_str8f(scratch.arena, "0x%I64x", params->vaddr); + } + d_cmd(D_CmdKind_Run); + }break; + case D_CmdKind_Run: + { + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + if(processes.count != 0) + { + d_cmd(D_CmdKind_Continue, .machine = params->machine, .process = params->process, .thread = params->thread); + } + else if(!d_ctrl_targets_running()) + { + d_cmd(D_CmdKind_LaunchAndRun); + } + }break; + case D_CmdKind_Restart: + { + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + if(processes.count != 0) + { + d_cmd(D_CmdKind_KillAll); + } + d_cmd(D_CmdKind_LaunchAndRun); + }break; + case D_CmdKind_StepInto: + case D_CmdKind_StepOver: + { + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + if(processes.count != 0) + { + D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto + ? D_CmdKind_StepIntoLine + : D_CmdKind_StepOverLine); + B32 prefer_disasm = params->prefer_disasm; + if(prefer_disasm) + { + step_cmd_kind = (cmd->kind == D_CmdKind_StepInto + ? D_CmdKind_StepIntoInst + : D_CmdKind_StepOverInst); + } + d_cmd(step_cmd_kind, .thread = params->thread); + } + else if(!d_ctrl_targets_running()) + { + d_cmd(D_CmdKind_LaunchAndStepInto, .targets = *targets); + } + }break; + + //- rjf: debug control context management operations + case D_CmdKind_FreezeThread: + case D_CmdKind_ThawThread: + case D_CmdKind_FreezeProcess: + case D_CmdKind_ThawProcess: + case D_CmdKind_FreezeMachine: + case D_CmdKind_ThawMachine: + { + D_CmdKind disptch_kind = ((cmd->kind == D_CmdKind_FreezeThread || + cmd->kind == D_CmdKind_FreezeProcess || + cmd->kind == D_CmdKind_FreezeMachine) + ? D_CmdKind_FreezeEntity + : D_CmdKind_ThawEntity); + d_push_cmd(disptch_kind, params); + }break; + case D_CmdKind_FreezeLocalMachine: + { + CTRL_MachineID machine_id = CTRL_MachineID_Local; + d_cmd(D_CmdKind_FreezeMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero())); + }break; + case D_CmdKind_ThawLocalMachine: + { + CTRL_MachineID machine_id = CTRL_MachineID_Local; + d_cmd(D_CmdKind_ThawMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero())); + }break; + case D_CmdKind_FreezeEntity: + case D_CmdKind_ThawEntity: + { + B32 should_freeze = (cmd->kind == D_CmdKind_FreezeEntity); + CTRL_Entity *root = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); + for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) + { + if(e->kind == CTRL_EntityKind_Thread) + { + e->is_frozen = should_freeze; + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = (should_freeze ? CTRL_MsgKind_FreezeThread : CTRL_MsgKind_ThawThread); + msg->entity = e->handle; + } + } + if(d_ctrl_targets_running()) + { + need_run = 1; + run_kind = d_state->ctrl_last_run_kind; + run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, d_state->ctrl_last_run_thread_handle); + run_flags = d_state->ctrl_last_run_flags; + run_traps = d_state->ctrl_last_run_traps; + } + }break; + + //- rjf: entity decoration + case D_CmdKind_SetEntityColor: + { + CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); + entity->rgba = params->rgba; + }break; + case D_CmdKind_SetEntityName: + { + CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); + ctrl_entity_equip_string(d_state->ctrl_entity_store, entity, params->string); + }break; + + //- rjf: attaching + case D_CmdKind_Attach: + { + U32 pid = params->pid; + if(pid != 0) + { + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = CTRL_MsgKind_Attach; + msg->entity_id = pid; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + } + }break; + } + + // rjf: do run if needed + if(need_run) + { + // rjf: compute hash of all run-parameterization entities, store + { + d_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash; + } + + // rjf: push & fill run message + CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + { + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, CTRL_EntityKind_Process); + msg->kind = (run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? CTRL_MsgKind_Run : CTRL_MsgKind_SingleStep; + msg->run_flags = run_flags; + msg->entity = run_thread->handle; + msg->parent = process->handle; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->traps, &run_traps); + D_BreakpointArray *bp_batches[] = + { + breakpoints, + &run_extra_bps, + }; + for(U64 batch_idx = 0; batch_idx < ArrayCount(bp_batches); batch_idx += 1) + { + D_BreakpointArray *batch_breakpoints = bp_batches[batch_idx]; + for(U64 idx = 0; idx < batch_breakpoints->count; idx += 1) + { + // rjf: unpack user breakpoint entity + D_Breakpoint *bp = &batch_breakpoints->v[idx]; + + // rjf: d -> ctrl flags + CTRL_UserBreakpointFlags ctrl_bp_flags = 0; + if(bp->flags & D_BreakpointFlag_BreakOnWrite) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnWrite; } + if(bp->flags & D_BreakpointFlag_BreakOnRead) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnRead; } + if(bp->flags & D_BreakpointFlag_BreakOnExecute) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnExecute; } + + // rjf: textual location -> add breakpoints for all possible override locations + if(bp->file_path.size != 0 && bp->pt.line != 0) + { + String8List overrides = d_possible_path_overrides_from_maps_path(scratch.arena, path_maps, bp->file_path); + for(String8Node *n = overrides.first; n != 0; n = n->next) + { + CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_FileNameAndLineColNumber}; + ctrl_user_bp.flags = ctrl_bp_flags; + ctrl_user_bp.id = bp->id; + ctrl_user_bp.string = n->string; + ctrl_user_bp.pt = bp->pt; + ctrl_user_bp.condition = bp->condition; + ctrl_user_bp.size = bp->size; + ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); + } + } + + // rjf: virtual address expression -> add expression breakpoint + else if(bp->vaddr_expr.size != 0) + { + CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_Expression}; + ctrl_user_bp.flags = ctrl_bp_flags; + ctrl_user_bp.id = bp->id; + ctrl_user_bp.string = bp->vaddr_expr; + ctrl_user_bp.condition = bp->condition; + ctrl_user_bp.size = bp->size; + ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); + } + } + } + } + + // rjf: copy run traps to scratch (needed, if run_traps can be `d_state->ctrl_last_run_traps`) + CTRL_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps); + D_BreakpointArray run_extra_bps_copy = d_breakpoint_array_copy(scratch.arena, &run_extra_bps); + + // rjf: store last run info + arena_clear(d_state->ctrl_last_run_arena); + d_state->ctrl_last_run_kind = run_kind; + d_state->ctrl_last_run_frame_idx = d_frame_index(); + d_state->ctrl_last_run_thread_handle = run_thread->handle; + d_state->ctrl_last_run_flags = run_flags; + d_state->ctrl_last_run_traps = ctrl_trap_list_copy(d_state->ctrl_last_run_arena, &run_traps_copy); + d_state->ctrl_last_run_extra_bps = d_breakpoint_array_copy(d_state->ctrl_last_run_arena, &run_extra_bps_copy); + d_state->ctrl_is_running = 1; + } + } + } + + ////////////////////////////// + //- rjf: clear command batch + // + { + arena_clear(d_state->cmds_arena); + MemoryZeroStruct(&d_state->cmds); + } + + ////////////////////////////// + //- rjf: push deferred commands + // + for EachNode(n, D_CmdNode, deferred_cmds.first) + { + d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, n->cmd.kind, &n->cmd.params); + } + + ////////////////////////////// + //- rjf: push new control messages to queue - try to send queue to control, + // clear queue if successful (if not, we'll just keep them around until + // the next tick) + // + { + CTRL_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_state->ctrl_msg_arena, &ctrl_msgs); + ctrl_msg_list_concat_in_place(&d_state->ctrl_msgs, &msgs_copy); + if(d_state->ctrl_msgs.count != 0) + { + if(!d_state->ctrl_soft_halt_issued && d_state->ctrl_thread_run_state) + { + d_state->ctrl_soft_halt_issued = 1; + ctrl_halt(); + } + if(ctrl_u2c_push_msgs(&d_state->ctrl_msgs, os_now_microseconds()+100)) + { + MemoryZeroStruct(&d_state->ctrl_msgs); + arena_clear(d_state->ctrl_msg_arena); + } + } + } + + ProfEnd(); + scratch_end(scratch); + return result; +} diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h new file mode 100644 index 00000000..9f92e12a --- /dev/null +++ b/src/dbg_engine/dbg_engine_user.h @@ -0,0 +1,486 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DBG_ENGINE_USER_H +#define DBG_ENGINE_USER_H + +//////////////////////////////// +//~ rjf: Line Info Types + +typedef struct D_Line D_Line; +struct D_Line +{ + String8 file_path; + TxtPt pt; + Rng1U64 voff_range; + DI_Key dbgi_key; +}; + +typedef struct D_LineNode D_LineNode; +struct D_LineNode +{ + D_LineNode *next; + D_Line v; +}; + +typedef struct D_LineList D_LineList; +struct D_LineList +{ + D_LineNode *first; + D_LineNode *last; + U64 count; +}; + +typedef struct D_LineListArray D_LineListArray; +struct D_LineListArray +{ + D_LineList *v; + U64 count; + DI_KeyList dbgi_keys; +}; + +//////////////////////////////// +//~ rjf: Debug Engine Control Communication Types + +typedef enum D_RunKind +{ + D_RunKind_Run, + D_RunKind_SingleStep, + D_RunKind_Step, + D_RunKind_COUNT +} +D_RunKind; + +//////////////////////////////// +//~ rjf: Command Types + +typedef struct D_CmdParams D_CmdParams; +struct D_CmdParams +{ + CTRL_Handle machine; + CTRL_Handle process; + CTRL_Handle thread; + CTRL_Handle entity; + String8 string; + String8 file_path; + TxtPt cursor; + U64 vaddr; + B32 prefer_disasm; + U32 pid; + U32 rgba; + D_TargetArray targets; + U64 retry_idx; +}; + +typedef struct D_Cmd D_Cmd; +struct D_Cmd +{ + D_CmdKind kind; + D_CmdParams params; +}; + +typedef struct D_CmdNode D_CmdNode; +struct D_CmdNode +{ + D_CmdNode *next; + D_CmdNode *prev; + D_Cmd cmd; +}; + +typedef struct D_CmdList D_CmdList; +struct D_CmdList +{ + D_CmdNode *first; + D_CmdNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Main State Caches + +//- rjf: per-run tls-base-vaddr cache + +typedef struct D_RunTLSBaseCacheNode D_RunTLSBaseCacheNode; +struct D_RunTLSBaseCacheNode +{ + D_RunTLSBaseCacheNode *hash_next; + CTRL_Handle process; + U64 root_vaddr; + U64 rip_vaddr; + U64 tls_base_vaddr; +}; + +typedef struct D_RunTLSBaseCacheSlot D_RunTLSBaseCacheSlot; +struct D_RunTLSBaseCacheSlot +{ + D_RunTLSBaseCacheNode *first; + D_RunTLSBaseCacheNode *last; +}; + +typedef struct D_RunTLSBaseCache D_RunTLSBaseCache; +struct D_RunTLSBaseCache +{ + Arena *arena; + U64 slots_count; + D_RunTLSBaseCacheSlot *slots; +}; + +//- rjf: per-run locals cache + +typedef struct D_RunLocalsCacheNode D_RunLocalsCacheNode; +struct D_RunLocalsCacheNode +{ + D_RunLocalsCacheNode *hash_next; + DI_Key dbgi_key; + U64 voff; + E_String2NumMap *locals_map; +}; + +typedef struct D_RunLocalsCacheSlot D_RunLocalsCacheSlot; +struct D_RunLocalsCacheSlot +{ + D_RunLocalsCacheNode *first; + D_RunLocalsCacheNode *last; +}; + +typedef struct D_RunLocalsCache D_RunLocalsCache; +struct D_RunLocalsCache +{ + Arena *arena; + U64 table_size; + D_RunLocalsCacheSlot *table; +}; + +//////////////////////////////// +//~ rjf: User -> Ctrl Message Types + +typedef enum CTRL_MsgKind +{ + CTRL_MsgKind_Null, + CTRL_MsgKind_Launch, + CTRL_MsgKind_Attach, + CTRL_MsgKind_Kill, + CTRL_MsgKind_KillAll, + CTRL_MsgKind_Detach, + CTRL_MsgKind_Run, + CTRL_MsgKind_SingleStep, + CTRL_MsgKind_SetUserEntryPoints, + CTRL_MsgKind_SetModuleDebugInfoPath, + CTRL_MsgKind_FreezeThread, + CTRL_MsgKind_ThawThread, + CTRL_MsgKind_COUNT, +} +CTRL_MsgKind; + +typedef U32 CTRL_RunFlags; +enum +{ + CTRL_RunFlag_StopOnEntryPoint = (1<<0), +}; + +typedef struct CTRL_Msg CTRL_Msg; +struct CTRL_Msg +{ + CTRL_MsgKind kind; + CTRL_RunFlags run_flags; + CTRL_MsgID msg_id; + CTRL_Handle entity; + CTRL_Handle parent; + U32 entity_id; + U32 exit_code; + B32 env_inherit; + B32 debug_subprocesses; + U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; + String8 path; + String8List entry_points; + String8List cmd_line_string_list; + String8List env_string_list; + String8 stdout_path; + String8 stderr_path; + String8 stdin_path; + CTRL_TrapList traps; + CTRL_UserBreakpointList user_bps; +}; + +typedef struct CTRL_MsgNode CTRL_MsgNode; +struct CTRL_MsgNode +{ + CTRL_MsgNode *next; + CTRL_Msg v; +}; + +typedef struct CTRL_MsgList CTRL_MsgList; +struct CTRL_MsgList +{ + CTRL_MsgNode *first; + CTRL_MsgNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Ctrl -> User Event Types + +typedef enum CTRL_EventKind +{ + CTRL_EventKind_Null, + CTRL_EventKind_Error, + + //- rjf: starts/stops + CTRL_EventKind_Started, + CTRL_EventKind_Stopped, + + //- rjf: entity creation/deletion + CTRL_EventKind_NewProc, + CTRL_EventKind_NewThread, + CTRL_EventKind_NewModule, + CTRL_EventKind_EndProc, + CTRL_EventKind_EndThread, + CTRL_EventKind_EndModule, + + //- rjf: thread freeze state changes + CTRL_EventKind_ThreadFrozen, + CTRL_EventKind_ThreadThawed, + + //- rjf: debug info changes + CTRL_EventKind_ModuleDebugInfoPathChange, + + //- rjf: debug strings / decorations / markup + CTRL_EventKind_DebugString, + CTRL_EventKind_ThreadName, + CTRL_EventKind_ThreadColor, + CTRL_EventKind_SetBreakpoint, + CTRL_EventKind_UnsetBreakpoint, + CTRL_EventKind_SetVAddrRangeNote, + + //- rjf: memory + CTRL_EventKind_MemReserve, + CTRL_EventKind_MemCommit, + CTRL_EventKind_MemDecommit, + CTRL_EventKind_MemRelease, + + CTRL_EventKind_COUNT +} +CTRL_EventKind; + +typedef enum CTRL_EventCause +{ + CTRL_EventCause_Null, + CTRL_EventCause_Error, + CTRL_EventCause_Finished, + CTRL_EventCause_EntryPoint, + CTRL_EventCause_UserBreakpoint, + CTRL_EventCause_InterruptedByTrap, + CTRL_EventCause_InterruptedByException, + CTRL_EventCause_InterruptedByHalt, + CTRL_EventCause_COUNT +} +CTRL_EventCause; + +typedef enum CTRL_ExceptionKind +{ + CTRL_ExceptionKind_Null, + CTRL_ExceptionKind_MemoryRead, + CTRL_ExceptionKind_MemoryWrite, + CTRL_ExceptionKind_MemoryExecute, + CTRL_ExceptionKind_CppThrow, + CTRL_ExceptionKind_COUNT +} +CTRL_ExceptionKind; + +typedef struct CTRL_Event CTRL_Event; +struct CTRL_Event +{ + CTRL_EventKind kind; + CTRL_EventCause cause; + CTRL_ExceptionKind exception_kind; + CTRL_MsgID msg_id; + CTRL_Handle entity; + CTRL_Handle parent; + Arch arch; + U64 u64_code; + U32 entity_id; + Rng1U64 vaddr_rng; + U64 rip_vaddr; + U64 stack_base; + U64 tls_root; + U64 tls_index; + U64 tls_offset; + U64 timestamp; + U32 exception_code; + U32 rgba; + CTRL_UserBreakpointFlags bp_flags; + String8 string; + OperatingSystem target_os; + CTRL_TlsModel tls_model; +}; + +typedef struct CTRL_EventNode CTRL_EventNode; +struct CTRL_EventNode +{ + CTRL_EventNode *next; + CTRL_Event v; +}; + +typedef struct CTRL_EventList CTRL_EventList; +struct CTRL_EventList +{ + CTRL_EventNode *first; + CTRL_EventNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Main State Types + +typedef struct D_State D_State; +struct D_State +{ + // rjf: top-level state + Arena *arena; + U64 frame_index; + + // rjf: commands + Arena *cmds_arena; + D_CmdList cmds; + + // rjf: output log key + C_Key output_log_key; + + // rjf: per-run caches + U64 tls_base_cache_reggen_idx; + U64 tls_base_cache_memgen_idx; + D_RunTLSBaseCache tls_base_caches[2]; + U64 tls_base_cache_gen; + U64 locals_cache_reggen_idx; + D_RunLocalsCache locals_caches[2]; + U64 locals_cache_gen; + U64 member_cache_reggen_idx; + D_RunLocalsCache member_caches[2]; + U64 member_cache_gen; + + // rjf: user -> ctrl driving state + Arena *ctrl_last_run_arena; + D_RunKind ctrl_last_run_kind; + U64 ctrl_last_run_frame_idx; + CTRL_Handle ctrl_last_run_thread_handle; + CTRL_RunFlags ctrl_last_run_flags; + CTRL_TrapList ctrl_last_run_traps; + D_BreakpointArray ctrl_last_run_extra_bps; + U128 ctrl_last_run_param_state_hash; + B32 ctrl_is_running; + B32 ctrl_thread_run_state; + B32 ctrl_soft_halt_issued; + Arena *ctrl_msg_arena; + CTRL_MsgList ctrl_msgs; + + // rjf: ctrl -> user reading state + CTRL_EntityCtxRWStore *ctrl_entity_store; + Arena *ctrl_stop_arena; + CTRL_Event ctrl_last_stop_event; +}; + +//////////////////////////////// +//~ rjf: Globals + +global D_State *d_state = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 d_hash_from_seed_string(U64 seed, String8 string); +internal U64 d_hash_from_string(String8 string); +internal U64 d_hash_from_seed_string__case_insensitive(U64 seed, String8 string); +internal U64 d_hash_from_string__case_insensitive(String8 string); + +//////////////////////////////// +//~ rjf: Breakpoints + +internal D_BreakpointArray d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src); + +//////////////////////////////// +//~ rjf: Path Map Application + +internal String8List d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path); + +//////////////////////////////// +//~ rjf: Debug Info Extraction Type Pure Functions + +internal D_LineList d_line_list_copy(Arena *arena, D_LineList *list); + +//////////////////////////////// +//~ rjf: Command Type Functions + +//- rjf: command parameters +internal D_CmdParams d_cmd_params_copy(Arena *arena, D_CmdParams *src); + +//- rjf: command lists +internal void d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params); + +//////////////////////////////// +//~ rjf: Stepping "Trap Net" Builders + +internal D_TrapNet d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread); +internal D_TrapNet d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread); +internal D_TrapNet d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread); + +//////////////////////////////// +//~ rjf: Debug Info Lookups + +//- rjf: voff -> line info +internal D_LineList d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff); + +//- rjf: file:line -> line info +// TODO(rjf): this depends on file path maps, needs to move +// TODO(rjf): need to clean this up & dedup +internal D_LineListArray d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range); +internal D_LineListArray d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range); +internal D_LineList d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num); +internal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num); + +//////////////////////////////// +//~ rjf: Process/Thread/Module Info Lookups + +internal U64 d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); + +//////////////////////////////// +//~ rjf: Target Controls + +//- rjf: stopped info from the control thread +internal CTRL_Event d_ctrl_last_stop_event(void); + +//////////////////////////////// +//~ rjf: Main State Accessors/Mutators + +//- rjf: frame data +internal U64 d_frame_index(void); + +//- rjf: control state +internal D_RunKind d_ctrl_last_run_kind(void); +internal U64 d_ctrl_last_run_frame_idx(void); +internal B32 d_ctrl_targets_running(void); + +//- rjf: active entity based queries +internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); + +//- rjf: per-run caches +internal U64 d_query_cached_rip_from_thread(CTRL_Entity *thread); +internal U64 d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); +internal U64 d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); +internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); +internal E_String2NumMap *d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); +internal E_String2NumMap *d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); + +//- rjf: top-level command dispatch +internal void d_push_cmd(D_CmdKind kind, D_CmdParams *params); +#define d_cmd(kind, ...) d_push_cmd((kind), &(D_CmdParams){.thread = {0}, __VA_ARGS__}) + +//- rjf: command iteration +internal B32 d_next_cmd(D_Cmd **cmd); + +//////////////////////////////// +//~ rjf: Main Layer Top-Level Calls + +internal void d_init(void); +internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]); + +#endif // DBG_ENGINE_USER_H diff --git a/src/dbg_engine/generated/dbg_engine.meta.c b/src/dbg_engine/generated/dbg_engine.meta.c index 437ae10e..09d20976 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.c +++ b/src/dbg_engine/generated/dbg_engine.meta.c @@ -3,3 +3,206 @@ //- GENERATED CODE +C_LINKAGE_BEGIN +String8 ctrl_entity_kind_code_name_table[12] = +{ +{0}, +str8_lit_comp("root"), +str8_lit_comp("machine"), +str8_lit_comp("process"), +str8_lit_comp("thread"), +str8_lit_comp("module"), +str8_lit_comp("entry_point"), +str8_lit_comp("debug_info_path"), +str8_lit_comp("pending_thread_name"), +str8_lit_comp("pending_thread_color"), +str8_lit_comp("breakpoint"), +str8_lit_comp("address_range_annotation"), +}; + +String8 ctrl_entity_kind_display_string_table[12] = +{ +{0}, +str8_lit_comp("Root"), +str8_lit_comp("Machine"), +str8_lit_comp("Process"), +str8_lit_comp("Thread"), +str8_lit_comp("Module"), +str8_lit_comp("EntryPoint"), +str8_lit_comp("DebugInfoPath"), +str8_lit_comp("PendingThreadName"), +str8_lit_comp("PendingThreadColor"), +str8_lit_comp("Breakpoint"), +str8_lit_comp("AddressRangeAnnotation"), +}; + +U32 ctrl_exception_code_kind_code_table[38] = +{ +0, +0x40010005, +0x40010008, +0x40080201, +0x40080202, +0x0000071a, +0x80000002, +0xc0000005, +0xc0000006, +0xc0000008, +0xc0000017, +0xc000001d, +0xc0000025, +0xc0000026, +0xc000008c, +0xc000008d, +0xc000008e, +0xc000008f, +0xc0000090, +0xc0000091, +0xc0000092, +0xc0000093, +0xc0000094, +0xc0000095, +0xc0000096, +0xc00000fd, +0xc0000135, +0xc0000138, +0xc0000139, +0xc0000142, +0xc00002b4, +0xc00002b5, +0xc0000420, +0xc06d007e, +0xc06d007f, +0xe073616e, +0xe0736171, +0x0000087a, +}; + +String8 ctrl_exception_code_kind_display_string_table[38] = +{ +{0}, +str8_lit_comp("(Win32) Control-C"), +str8_lit_comp("(Win32) Control-Break"), +str8_lit_comp("(Win32) WinRT Originate Error"), +str8_lit_comp("(Win32) WinRT Transform Error"), +str8_lit_comp("(Win32) RPC Call Cancelled"), +str8_lit_comp("(Win32) Data Type Misalignment"), +str8_lit_comp("(Win32) Access Violation"), +str8_lit_comp("(Win32) In Page Error"), +str8_lit_comp("(Win32) Invalid Handle Specified"), +str8_lit_comp("(Win32) Not Enough Quota"), +str8_lit_comp("(Win32) Illegal Instruction"), +str8_lit_comp("(Win32) Cannot Continue From Exception"), +str8_lit_comp("(Win32) Invalid Exception Disposition Returned By Handler"), +str8_lit_comp("(Win32) Array Bounds Exceeded"), +str8_lit_comp("(Win32) Floating-Point Denormal Operand"), +str8_lit_comp("(Win32) Floating-Point Division By Zero"), +str8_lit_comp("(Win32) Floating-Point Inexact Result"), +str8_lit_comp("(Win32) Floating-Point Invalid Operation"), +str8_lit_comp("(Win32) Floating-Point Overflow"), +str8_lit_comp("(Win32) Floating-Point Stack Check"), +str8_lit_comp("(Win32) Floating-Point Underflow"), +str8_lit_comp("(Win32) Integer Division By Zero"), +str8_lit_comp("(Win32) Integer Overflow"), +str8_lit_comp("(Win32) Privileged Instruction"), +str8_lit_comp("(Win32) Stack Overflow"), +str8_lit_comp("(Win32) Unable To Locate DLL"), +str8_lit_comp("(Win32) Ordinal Not Found"), +str8_lit_comp("(Win32) Entry Point Not Found"), +str8_lit_comp("(Win32) DLL Initialization Failed"), +str8_lit_comp("(Win32) Floating Point SSE Multiple Faults"), +str8_lit_comp("(Win32) Floating Point SSE Multiple Traps"), +str8_lit_comp("(Win32) Assertion Failed"), +str8_lit_comp("(Win32) Module Not Found"), +str8_lit_comp("(Win32) Procedure Not Found"), +str8_lit_comp("(Win32) Sanitizer Error Detected"), +str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), +str8_lit_comp("(Win32) DirectX Debug Layer"), +}; + +String8 ctrl_exception_code_kind_lowercase_code_string_table[38] = +{ +{0}, +str8_lit_comp("win32_ctrl_c"), +str8_lit_comp("win32_ctrl_break"), +str8_lit_comp("win32_win_rt_originate_error"), +str8_lit_comp("win32_win_rt_transform_error"), +str8_lit_comp("win32_rpc_call_cancelled"), +str8_lit_comp("win32_datatype_misalignment"), +str8_lit_comp("win32_access_violation"), +str8_lit_comp("win32_in_page_error"), +str8_lit_comp("win32_invalid_handle"), +str8_lit_comp("win32_not_enough_quota"), +str8_lit_comp("win32_illegal_instruction"), +str8_lit_comp("win32_cannot_continue_exception"), +str8_lit_comp("win32_invalid_exception_disposition"), +str8_lit_comp("win32_array_bounds_exceeded"), +str8_lit_comp("win32_floating_point_denormal_operand"), +str8_lit_comp("win32_floating_point_division_by_zero"), +str8_lit_comp("win32_floating_point_inexact_result"), +str8_lit_comp("win32_floating_point_invalid_operation"), +str8_lit_comp("win32_floating_point_overflow"), +str8_lit_comp("win32_floating_point_stack_check"), +str8_lit_comp("win32_floating_point_underflow"), +str8_lit_comp("win32_integer_division_by_zero"), +str8_lit_comp("win32_integer_overflow"), +str8_lit_comp("win32_privileged_instruction"), +str8_lit_comp("win32_stack_overflow"), +str8_lit_comp("win32_unable_to_locate_dll"), +str8_lit_comp("win32_ordinal_not_found"), +str8_lit_comp("win32_entry_point_not_found"), +str8_lit_comp("win32_dll_initialization_failed"), +str8_lit_comp("win32_floating_point_sse_multiple_faults"), +str8_lit_comp("win32_floating_point_sse_multiple_traps"), +str8_lit_comp("win32_assertion_failed"), +str8_lit_comp("win32_module_not_found"), +str8_lit_comp("win32_procedure_not_found"), +str8_lit_comp("win32_sanitizer_error_detected"), +str8_lit_comp("win32_sanitizer_raw_access_violation"), +str8_lit_comp("win32_directx_debug_layer"), +}; + +B8 ctrl_exception_code_kind_default_enable_table[38] = +{ +0, +1, +1, +0, +0, +0, +0, +1, +0, +1, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +1, +0, +0, +1, +0, +1, +}; + +C_LINKAGE_END + diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index 4c8d2908..f7397b0e 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -44,6 +44,66 @@ D_CmdKind_Attach, D_CmdKind_COUNT, } D_CmdKind; +typedef enum CTRL_EntityKind +{ +CTRL_EntityKind_Null, +CTRL_EntityKind_Root, +CTRL_EntityKind_Machine, +CTRL_EntityKind_Process, +CTRL_EntityKind_Thread, +CTRL_EntityKind_Module, +CTRL_EntityKind_EntryPoint, +CTRL_EntityKind_DebugInfoPath, +CTRL_EntityKind_PendingThreadName, +CTRL_EntityKind_PendingThreadColor, +CTRL_EntityKind_Breakpoint, +CTRL_EntityKind_AddressRangeAnnotation, +CTRL_EntityKind_COUNT, +} CTRL_EntityKind; + +typedef enum CTRL_ExceptionCodeKind +{ +CTRL_ExceptionCodeKind_Null, +CTRL_ExceptionCodeKind_Win32CtrlC, +CTRL_ExceptionCodeKind_Win32CtrlBreak, +CTRL_ExceptionCodeKind_Win32WinRTOriginateError, +CTRL_ExceptionCodeKind_Win32WinRTTransformError, +CTRL_ExceptionCodeKind_Win32RPCCallCancelled, +CTRL_ExceptionCodeKind_Win32DatatypeMisalignment, +CTRL_ExceptionCodeKind_Win32AccessViolation, +CTRL_ExceptionCodeKind_Win32InPageError, +CTRL_ExceptionCodeKind_Win32InvalidHandle, +CTRL_ExceptionCodeKind_Win32NotEnoughQuota, +CTRL_ExceptionCodeKind_Win32IllegalInstruction, +CTRL_ExceptionCodeKind_Win32CannotContinueException, +CTRL_ExceptionCodeKind_Win32InvalidExceptionDisposition, +CTRL_ExceptionCodeKind_Win32ArrayBoundsExceeded, +CTRL_ExceptionCodeKind_Win32FloatingPointDenormalOperand, +CTRL_ExceptionCodeKind_Win32FloatingPointDivisionByZero, +CTRL_ExceptionCodeKind_Win32FloatingPointInexactResult, +CTRL_ExceptionCodeKind_Win32FloatingPointInvalidOperation, +CTRL_ExceptionCodeKind_Win32FloatingPointOverflow, +CTRL_ExceptionCodeKind_Win32FloatingPointStackCheck, +CTRL_ExceptionCodeKind_Win32FloatingPointUnderflow, +CTRL_ExceptionCodeKind_Win32IntegerDivisionByZero, +CTRL_ExceptionCodeKind_Win32IntegerOverflow, +CTRL_ExceptionCodeKind_Win32PrivilegedInstruction, +CTRL_ExceptionCodeKind_Win32StackOverflow, +CTRL_ExceptionCodeKind_Win32UnableToLocateDLL, +CTRL_ExceptionCodeKind_Win32OrdinalNotFound, +CTRL_ExceptionCodeKind_Win32EntryPointNotFound, +CTRL_ExceptionCodeKind_Win32DLLInitializationFailed, +CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults, +CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps, +CTRL_ExceptionCodeKind_Win32AssertionFailed, +CTRL_ExceptionCodeKind_Win32ModuleNotFound, +CTRL_ExceptionCodeKind_Win32ProcedureNotFound, +CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected, +CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation, +CTRL_ExceptionCodeKind_Win32DirectXDebugLayer, +CTRL_ExceptionCodeKind_COUNT, +} CTRL_ExceptionCodeKind; + global B32 DEV_always_refresh = 0; global B32 DEV_simulate_lag = 0; global B32 DEV_draw_ui_text_pos = 0; @@ -65,4 +125,14 @@ struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = {&DEV_cmd_context_tooltips, str8_lit_comp("cmd_context_tooltips")}, {&DEV_updating_indicator, str8_lit_comp("updating_indicator")}, }; +C_LINKAGE_BEGIN +extern String8 ctrl_entity_kind_code_name_table[12]; +extern String8 ctrl_entity_kind_display_string_table[12]; +extern U32 ctrl_exception_code_kind_code_table[38]; +extern String8 ctrl_exception_code_kind_display_string_table[38]; +extern String8 ctrl_exception_code_kind_lowercase_code_string_table[38]; +extern B8 ctrl_exception_code_kind_default_enable_table[38]; + +C_LINKAGE_END + #endif // DBG_ENGINE_META_H diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 6982e501..3b054c55 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -299,14 +299,13 @@ #include "stap/stap_parse.h" #include "demon/demon_inc.h" #include "eval/eval_inc.h" +#include "dbg_engine/dbg_engine_inc.h" #include "eval_visualization/eval_visualization_inc.h" -#include "ctrl/ctrl_inc.h" #include "font_provider/font_provider_inc.h" #include "render/render_inc.h" #include "font_cache/font_cache.h" #include "draw/draw.h" #include "ui/ui_inc.h" -#include "dbg_engine/dbg_engine_inc.h" #include "raddbg/raddbg_inc.h" //- rjf: [c] @@ -354,14 +353,13 @@ #include "stap/stap_parse.c" #include "demon/demon_inc.c" #include "eval/eval_inc.c" +#include "dbg_engine/dbg_engine_inc.c" #include "eval_visualization/eval_visualization_inc.c" -#include "ctrl/ctrl_inc.c" #include "font_provider/font_provider_inc.c" #include "render/render_inc.c" #include "font_cache/font_cache.c" #include "draw/draw.c" #include "ui/ui_inc.c" -#include "dbg_engine/dbg_engine_inc.c" #include "raddbg/raddbg_inc.c" //////////////////////////////// From a90fbc844b3098aba1ed11f31dc9e39173949ea6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 12:56:15 -0700 Subject: [PATCH 443/850] merge ctrl_init / d_init --- src/base/base_entry_point.c | 7 +- src/dbg_engine/dbg_engine_core.c | 113 ++++++++++ src/dbg_engine/dbg_engine_core.h | 5 + src/dbg_engine/dbg_engine_ctrl.c | 354 ++++++++++++------------------- src/dbg_engine/dbg_engine_ctrl.h | 11 +- src/dbg_engine/dbg_engine_user.c | 221 ++++++++----------- src/dbg_engine/dbg_engine_user.h | 7 +- src/raddbg/raddbg_core.c | 92 ++++---- src/raddbg/raddbg_eval.c | 14 +- src/raddbg/raddbg_main.c | 6 +- src/raddbg/raddbg_views.c | 24 +-- src/raddbg/raddbg_widgets.c | 16 +- src/torture/torture_main.c | 9 +- 13 files changed, 433 insertions(+), 446 deletions(-) diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index db167e5a..a466e65d 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -72,8 +72,8 @@ main_thread_base_entry_point(int arguments_count, char **arguments) #if defined(DEMON_CORE_H) && !defined(DMN_INIT_MANUAL) dmn_init(); #endif -#if defined(CTRL_CORE_H) && !defined(CTRL_INIT_MANUAL) - ctrl_init(); +#if defined(DBG_ENGINE_CORE_H) && !defined(D_INIT_MANUAL) + d_init(); #endif #if defined(OS_GFX_H) && !defined(OS_GFX_INIT_MANUAL) os_gfx_init(); @@ -87,9 +87,6 @@ main_thread_base_entry_point(int arguments_count, char **arguments) #if defined(FONT_CACHE_H) && !defined(FNT_INIT_MANUAL) fnt_init(); #endif -#if defined(DBG_ENGINE_CORE_H) && !defined(D_INIT_MANUAL) - d_init(); -#endif #if defined(RADDBG_CORE_H) && !defined(RD_INIT_MANUAL) rd_init(&cmdline); #endif diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index d2143055..f61aaff8 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -5,3 +5,116 @@ //~ rjf: Generated Code #include "generated/dbg_engine.meta.c" + +//////////////////////////////// +//~ rjf: Layer Initialization + +internal void +d_init(void) +{ + //- rjf: set up ctrl state + { + Arena *arena = arena_alloc(); + d_ctrl_state = push_array(arena, D_CtrlState, 1); + d_ctrl_state->arena = arena; + for(Arch arch = (Arch)0; arch < Arch_COUNT; arch = (Arch)(arch+1)) + { + String8 *reg_names = regs_reg_code_string_table_from_arch(arch); + U64 reg_count = regs_reg_code_count_from_arch(arch); + String8 *alias_names = regs_alias_code_string_table_from_arch(arch); + U64 alias_count = regs_alias_code_count_from_arch(arch); + d_ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(d_ctrl_state->arena, 256); + d_ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(d_ctrl_state->arena, 256); + for(U64 idx = 1; idx < reg_count; idx += 1) + { + e_string2num_map_insert(d_ctrl_state->arena, &d_ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); + } + for(U64 idx = 1; idx < alias_count; idx += 1) + { + e_string2num_map_insert(d_ctrl_state->arena, &d_ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); + } + } + d_ctrl_state->thread_reg_cache.slots_count = 1024; + d_ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, d_ctrl_state->thread_reg_cache.slots_count); + d_ctrl_state->thread_reg_cache.stripes_count = os_get_system_info()->logical_processor_count; + d_ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, d_ctrl_state->thread_reg_cache.stripes_count); + for(U64 idx = 0; idx < d_ctrl_state->thread_reg_cache.stripes_count; idx += 1) + { + d_ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); + d_ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); + } + d_ctrl_state->module_image_info_cache.slots_count = 1024; + d_ctrl_state->module_image_info_cache.slots = push_array(arena, CTRL_ModuleImageInfoCacheSlot, d_ctrl_state->module_image_info_cache.slots_count); + d_ctrl_state->module_image_info_cache.stripes_count = os_get_system_info()->logical_processor_count; + d_ctrl_state->module_image_info_cache.stripes = push_array(arena, CTRL_ModuleImageInfoCacheStripe, d_ctrl_state->module_image_info_cache.stripes_count); + for(U64 idx = 0; idx < d_ctrl_state->module_image_info_cache.stripes_count; idx += 1) + { + d_ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc(); + d_ctrl_state->module_image_info_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); + } + d_ctrl_state->u2c_ring_size = KB(64); + d_ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, d_ctrl_state->u2c_ring_size); + d_ctrl_state->u2c_ring_mutex = mutex_alloc(); + d_ctrl_state->u2c_ring_cv = cond_var_alloc(); + d_ctrl_state->c2u_ring_size = KB(64); + d_ctrl_state->c2u_ring_max_string_size = d_ctrl_state->c2u_ring_size/2; + d_ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, d_ctrl_state->c2u_ring_size); + d_ctrl_state->c2u_ring_mutex = mutex_alloc(); + d_ctrl_state->c2u_ring_cv = cond_var_alloc(); + { + Temp scratch = scratch_begin(0, 0); + String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); + os_make_directory(user_data_folder); + d_ctrl_state->ctrl_thread_log_path = push_str8f(d_ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); + os_write_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, str8_zero()); + scratch_end(scratch); + } + d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc(); + d_ctrl_state->ctrl_thread_entity_store = ctrl_entity_ctx_rw_store_alloc(); + d_ctrl_state->ctrl_thread_eval_cache = e_cache_alloc(); + d_ctrl_state->ctrl_thread_msg_process_arena = arena_alloc(); + d_ctrl_state->dmn_event_arena = arena_alloc(); + d_ctrl_state->user_entry_point_arena = arena_alloc(); + d_ctrl_state->dbg_dir_arena = arena_alloc(); + for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + { + if(ctrl_exception_code_kind_default_enable_table[k]) + { + d_ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); + } + } + d_ctrl_state->ctrl_thread_log = log_alloc(); + d_ctrl_state->ctrl_thread = thread_launch(ctrl_thread__entry_point, 0); + } + + //- rjf: set up user state + { + Arena *arena = arena_alloc(); + d_user_state = push_array(arena, D_UserState, 1); + d_user_state->arena = arena; + d_user_state->cmds_arena = arena_alloc(); + d_user_state->output_log_key = c_key_make(c_root_alloc(), c_id_make(0, 0)); + c_submit_data(d_user_state->output_log_key, 0, str8_zero()); + d_user_state->ctrl_entity_store = ctrl_entity_ctx_rw_store_alloc(); + d_user_state->ctrl_stop_arena = arena_alloc(); + d_user_state->ctrl_msg_arena = arena_alloc(); + + // rjf: set up caches + for(U64 idx = 0; idx < ArrayCount(d_user_state->tls_base_caches); idx += 1) + { + d_user_state->tls_base_caches[idx].arena = arena_alloc(); + } + for(U64 idx = 0; idx < ArrayCount(d_user_state->locals_caches); idx += 1) + { + d_user_state->locals_caches[idx].arena = arena_alloc(); + } + for(U64 idx = 0; idx < ArrayCount(d_user_state->member_caches); idx += 1) + { + d_user_state->member_caches[idx].arena = arena_alloc(); + } + + // rjf: set up run state + d_user_state->ctrl_last_run_arena = arena_alloc(); + } +} diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 6fe61679..c133cf57 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -399,4 +399,9 @@ struct D_TrapNet B32 good_read; }; +//////////////////////////////// +//~ rjf: Layer Initialization + +internal void d_init(void); + #endif // DBG_ENGINE_CORE_H diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 32357e0e..1f046cb2 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1465,93 +1465,13 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis } } -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void -ctrl_init(void) -{ - Arena *arena = arena_alloc(); - ctrl_state = push_array(arena, CTRL_State, 1); - ctrl_state->arena = arena; - for(Arch arch = (Arch)0; arch < Arch_COUNT; arch = (Arch)(arch+1)) - { - String8 *reg_names = regs_reg_code_string_table_from_arch(arch); - U64 reg_count = regs_reg_code_count_from_arch(arch); - String8 *alias_names = regs_alias_code_string_table_from_arch(arch); - U64 alias_count = regs_alias_code_count_from_arch(arch); - ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); - ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); - for(U64 idx = 1; idx < reg_count; idx += 1) - { - e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); - } - for(U64 idx = 1; idx < alias_count; idx += 1) - { - e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); - } - } - ctrl_state->thread_reg_cache.slots_count = 1024; - ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count); - ctrl_state->thread_reg_cache.stripes_count = os_get_system_info()->logical_processor_count; - ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1) - { - ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); - ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); - } - ctrl_state->module_image_info_cache.slots_count = 1024; - ctrl_state->module_image_info_cache.slots = push_array(arena, CTRL_ModuleImageInfoCacheSlot, ctrl_state->module_image_info_cache.slots_count); - ctrl_state->module_image_info_cache.stripes_count = os_get_system_info()->logical_processor_count; - ctrl_state->module_image_info_cache.stripes = push_array(arena, CTRL_ModuleImageInfoCacheStripe, ctrl_state->module_image_info_cache.stripes_count); - for(U64 idx = 0; idx < ctrl_state->module_image_info_cache.stripes_count; idx += 1) - { - ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc(); - ctrl_state->module_image_info_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); - } - ctrl_state->u2c_ring_size = KB(64); - ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size); - ctrl_state->u2c_ring_mutex = mutex_alloc(); - ctrl_state->u2c_ring_cv = cond_var_alloc(); - ctrl_state->c2u_ring_size = KB(64); - ctrl_state->c2u_ring_max_string_size = ctrl_state->c2u_ring_size/2; - ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); - ctrl_state->c2u_ring_mutex = mutex_alloc(); - ctrl_state->c2u_ring_cv = cond_var_alloc(); - { - Temp scratch = scratch_begin(0, 0); - String8 user_program_data_path = os_get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); - os_make_directory(user_data_folder); - ctrl_state->ctrl_thread_log_path = push_str8f(ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); - os_write_data_to_file_path(ctrl_state->ctrl_thread_log_path, str8_zero()); - scratch_end(scratch); - } - ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc(); - ctrl_state->ctrl_thread_entity_store = ctrl_entity_ctx_rw_store_alloc(); - ctrl_state->ctrl_thread_eval_cache = e_cache_alloc(); - ctrl_state->ctrl_thread_msg_process_arena = arena_alloc(); - ctrl_state->dmn_event_arena = arena_alloc(); - ctrl_state->user_entry_point_arena = arena_alloc(); - ctrl_state->dbg_dir_arena = arena_alloc(); - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) - { - if(ctrl_exception_code_kind_default_enable_table[k]) - { - ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); - } - } - ctrl_state->ctrl_thread_log = log_alloc(); - ctrl_state->ctrl_thread = thread_launch(ctrl_thread__entry_point, 0); -} - //////////////////////////////// //~ rjf: Wakeup Callback Registration internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) { - ctrl_state->wakeup_hook = wakeup_hook; + d_ctrl_state->wakeup_hook = wakeup_hook; } //////////////////////////////// @@ -1562,7 +1482,7 @@ ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) internal void * ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle) { - CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache; + CTRL_ThreadRegCache *cache = &d_ctrl_state->thread_reg_cache; CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; U64 reg_block_size = regs_block_size_from_arch(arch); @@ -1659,7 +1579,7 @@ ctrl_thread_write_reg_block(CTRL_Handle thread, void *block) B32 good = dmn_thread_write_reg_block(thread.dmn_handle, block); if(good) { - ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); } return good; } @@ -1675,10 +1595,10 @@ ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 v PE_IntelPdata *first_pdata = 0; { U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module_handle)) @@ -1741,10 +1661,10 @@ ctrl_entry_point_voff_from_module(CTRL_Handle module_handle) { U64 result = 0; U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module_handle)) @@ -1761,10 +1681,10 @@ ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle { String8 result = {0}; U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module_handle)) @@ -1781,10 +1701,10 @@ ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle) { String8 result = {0}; U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module_handle)) @@ -1802,7 +1722,7 @@ ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle) internal Arch ctrl_arch_from_process_handle(CTRL_Handle process_handle) { - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; CTRL_Entity *process_entity = ctrl_entity_from_handle(entity_ctx, process_handle); return process_entity->arch; } @@ -1899,10 +1819,10 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han EH_PtrCtx eh_ptr_ctx = {0}; { U64 hash = ctrl_hash_from_handle(module_handle); - U64 slot_idx = hash % ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx % ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 slot_idx = hash % d_ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx % d_ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) { if(ctrl_handle_match(n->module, module_handle)) @@ -3255,21 +3175,21 @@ ctrl_halt(void) internal U64 ctrl_run_gen(void) { - U64 result = ins_atomic_u64_eval(&ctrl_state->run_gen); + U64 result = ins_atomic_u64_eval(&d_ctrl_state->run_gen); return result; } internal U64 ctrl_mem_gen(void) { - U64 result = ins_atomic_u64_eval(&ctrl_state->mem_gen); + U64 result = ins_atomic_u64_eval(&d_ctrl_state->mem_gen); return result; } internal U64 ctrl_reg_gen(void) { - U64 result = ins_atomic_u64_eval(&ctrl_state->reg_gen); + U64 result = ins_atomic_u64_eval(&d_ctrl_state->reg_gen); return result; } @@ -3278,13 +3198,13 @@ ctrl_reg_gen(void) internal E_String2NumMap * ctrl_string2reg_from_arch(Arch arch) { - return &ctrl_state->arch_string2reg_tables[arch]; + return &d_ctrl_state->arch_string2reg_tables[arch]; } internal E_String2NumMap * ctrl_string2alias_from_arch(Arch arch) { - return &ctrl_state->arch_string2alias_tables[arch]; + return &d_ctrl_state->arch_string2alias_tables[arch]; } //////////////////////////////// @@ -3298,15 +3218,15 @@ ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) Temp scratch = scratch_begin(0, 0); String8 msgs_srlzed_baked = ctrl_serialized_string_from_msg_list(scratch.arena, msgs); B32 good = 0; - MutexScope(ctrl_state->u2c_ring_mutex) for(;;) + MutexScope(d_ctrl_state->u2c_ring_mutex) for(;;) { - U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); - U64 available_size = ctrl_state->u2c_ring_size-unconsumed_size; + U64 unconsumed_size = (d_ctrl_state->u2c_ring_write_pos-d_ctrl_state->u2c_ring_read_pos); + U64 available_size = d_ctrl_state->u2c_ring_size-unconsumed_size; U64 needed_size = sizeof(msgs_srlzed_baked.size) + msgs_srlzed_baked.size; if(available_size >= needed_size) { - ctrl_state->u2c_ring_write_pos += ring_write_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size); - ctrl_state->u2c_ring_write_pos += ring_write(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size); + d_ctrl_state->u2c_ring_write_pos += ring_write_struct(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size); + d_ctrl_state->u2c_ring_write_pos += ring_write(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size); good = 1; break; } @@ -3314,11 +3234,11 @@ ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) { break; } - cond_var_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, endt_us); + cond_var_wait(d_ctrl_state->u2c_ring_cv, d_ctrl_state->u2c_ring_mutex, endt_us); } if(good) { - cond_var_broadcast(ctrl_state->u2c_ring_cv); + cond_var_broadcast(d_ctrl_state->u2c_ring_cv); } scratch_end(scratch); return good; @@ -3329,21 +3249,21 @@ ctrl_u2c_pop_msgs(Arena *arena) { Temp scratch = scratch_begin(&arena, 1); String8 msgs_srlzed_baked = {0}; - MutexScope(ctrl_state->u2c_ring_mutex) for(;;) + MutexScope(d_ctrl_state->u2c_ring_mutex) for(;;) { - U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos); + U64 unconsumed_size = (d_ctrl_state->u2c_ring_write_pos-d_ctrl_state->u2c_ring_read_pos); if(unconsumed_size >= sizeof(U64)) { U64 size_to_decode = 0; - ctrl_state->u2c_ring_read_pos += ring_read_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, &size_to_decode); + d_ctrl_state->u2c_ring_read_pos += ring_read_struct(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_read_pos, &size_to_decode); msgs_srlzed_baked.size = size_to_decode; msgs_srlzed_baked.str = push_array_no_zero(scratch.arena, U8, msgs_srlzed_baked.size); - ctrl_state->u2c_ring_read_pos += ring_read(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode); + d_ctrl_state->u2c_ring_read_pos += ring_read(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode); break; } - cond_var_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, max_U64); + cond_var_wait(d_ctrl_state->u2c_ring_cv, d_ctrl_state->u2c_ring_mutex, max_U64); } - cond_var_broadcast(ctrl_state->u2c_ring_cv); + cond_var_broadcast(d_ctrl_state->u2c_ring_cv); CTRL_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked); scratch_end(scratch); return msgs; @@ -3356,31 +3276,31 @@ ctrl_c2u_push_events(CTRL_EventList *events) { if(events->count != 0) ProfScope("ctrl_c2u_push_events") { - MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - ctrl_entity_store_apply_events(ctrl_state->ctrl_thread_entity_store, events); + ctrl_entity_store_apply_events(d_ctrl_state->ctrl_thread_entity_store, events); } for(CTRL_EventNode *n = events->first; n != 0; n = n ->next) { Temp scratch = scratch_begin(0, 0); - String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, ctrl_state->c2u_ring_size-sizeof(U64)); - MutexScope(ctrl_state->c2u_ring_mutex) for(;;) + String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, d_ctrl_state->c2u_ring_size-sizeof(U64)); + MutexScope(d_ctrl_state->c2u_ring_mutex) for(;;) { - U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); - U64 available_size = ctrl_state->c2u_ring_size-unconsumed_size; + U64 unconsumed_size = (d_ctrl_state->c2u_ring_write_pos-d_ctrl_state->c2u_ring_read_pos); + U64 available_size = d_ctrl_state->c2u_ring_size-unconsumed_size; U64 needed_size = sizeof(event_srlzed.size) + event_srlzed.size; if(available_size >= needed_size) { - ctrl_state->c2u_ring_write_pos += ring_write_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, &event_srlzed.size); - ctrl_state->c2u_ring_write_pos += ring_write(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); + d_ctrl_state->c2u_ring_write_pos += ring_write_struct(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_write_pos, &event_srlzed.size); + d_ctrl_state->c2u_ring_write_pos += ring_write(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); break; } - cond_var_wait(ctrl_state->c2u_ring_cv, ctrl_state->c2u_ring_mutex, os_now_microseconds()+100); + cond_var_wait(d_ctrl_state->c2u_ring_cv, d_ctrl_state->c2u_ring_mutex, os_now_microseconds()+100); } - cond_var_broadcast(ctrl_state->c2u_ring_cv); - if(ctrl_state->wakeup_hook != 0) + cond_var_broadcast(d_ctrl_state->c2u_ring_cv); + if(d_ctrl_state->wakeup_hook != 0) { - ctrl_state->wakeup_hook(); + d_ctrl_state->wakeup_hook(); } scratch_end(scratch); } @@ -3393,17 +3313,17 @@ ctrl_c2u_pop_events(Arena *arena) ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); CTRL_EventList events = {0}; - MutexScope(ctrl_state->c2u_ring_mutex) for(;;) + MutexScope(d_ctrl_state->c2u_ring_mutex) for(;;) { - U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos); + U64 unconsumed_size = (d_ctrl_state->c2u_ring_write_pos-d_ctrl_state->c2u_ring_read_pos); if(unconsumed_size >= sizeof(U64)) { U64 size_to_decode = 0; - ctrl_state->c2u_ring_read_pos += ring_read_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, &size_to_decode); + d_ctrl_state->c2u_ring_read_pos += ring_read_struct(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_read_pos, &size_to_decode); String8 event_srlzed = {0}; event_srlzed.size = size_to_decode; event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size); - ctrl_state->c2u_ring_read_pos += ring_read(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); + d_ctrl_state->c2u_ring_read_pos += ring_read(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); CTRL_Event *new_event = ctrl_event_list_push(arena, &events); *new_event = ctrl_event_from_serialized_string(arena, event_srlzed); } @@ -3412,7 +3332,7 @@ ctrl_c2u_pop_events(Arena *arena) break; } } - cond_var_broadcast(ctrl_state->c2u_ring_cv); + cond_var_broadcast(d_ctrl_state->c2u_ring_cv); scratch_end(scratch); ProfEnd(); return events; @@ -3426,7 +3346,7 @@ ctrl_thread__entry_point(void *p) ThreadNameF("ctrl_thread"); ProfBeginFunction(); DMN_CtrlCtx *ctrl_ctx = dmn_ctrl_begin(); - log_select(ctrl_state->ctrl_thread_log); + log_select(d_ctrl_state->ctrl_thread_log); //- rjf: loop Temp scratch = scratch_begin(0, 0); @@ -3441,7 +3361,7 @@ ctrl_thread__entry_point(void *p) //- rjf: process messages DMN_CtrlExclusiveAccessScope { - ins_atomic_u64_eval_assign(&ctrl_state->ctrl_thread_run_state, 1); + ins_atomic_u64_eval_assign(&d_ctrl_state->ctrl_thread_run_state, 1); for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0; msg_n = msg_n->next) { CTRL_Msg *msg = &msg_n->v; @@ -3452,12 +3372,12 @@ ctrl_thread__entry_point(void *p) //- rjf: reset per-message state ProfScope("reset per-message state") { - arena_clear(ctrl_state->ctrl_thread_msg_process_arena); - ctrl_state->module_req_cache_slots_count = 4096; - ctrl_state->module_req_cache_slots = push_array(ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode *, ctrl_state->module_req_cache_slots_count); - MemoryZeroStruct(&ctrl_state->msg_user_bp_touched_files); - MemoryZeroStruct(&ctrl_state->msg_user_bp_touched_symbols); - MemoryCopyArray(ctrl_state->exception_code_filters, msg->exception_code_filters); + arena_clear(d_ctrl_state->ctrl_thread_msg_process_arena); + d_ctrl_state->module_req_cache_slots_count = 4096; + d_ctrl_state->module_req_cache_slots = push_array(d_ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode *, d_ctrl_state->module_req_cache_slots_count); + MemoryZeroStruct(&d_ctrl_state->msg_user_bp_touched_files); + MemoryZeroStruct(&d_ctrl_state->msg_user_bp_touched_symbols); + MemoryCopyArray(d_ctrl_state->exception_code_filters, msg->exception_code_filters); } //- rjf: gather all touched symbols by user breakpoints @@ -3491,7 +3411,7 @@ ctrl_thread__entry_point(void *p) } if(expr->kind == E_ExprKind_LeafIdentifier) { - str8_list_push(ctrl_state->ctrl_thread_msg_process_arena, &ctrl_state->msg_user_bp_touched_symbols, expr->string); + str8_list_push(d_ctrl_state->ctrl_thread_msg_process_arena, &d_ctrl_state->msg_user_bp_touched_symbols, expr->string); } if(expr->next != &e_expr_nil) { @@ -3524,7 +3444,7 @@ ctrl_thread__entry_point(void *p) { continue; } - str8_list_push(ctrl_state->ctrl_thread_msg_process_arena, &ctrl_state->msg_user_bp_touched_files, n->v.string); + str8_list_push(d_ctrl_state->ctrl_thread_msg_process_arena, &d_ctrl_state->msg_user_bp_touched_files, n->v.string); } //- rjf: process message @@ -3545,24 +3465,24 @@ ctrl_thread__entry_point(void *p) //- rjf: configuration case CTRL_MsgKind_SetUserEntryPoints: { - arena_clear(ctrl_state->user_entry_point_arena); - MemoryZeroStruct(&ctrl_state->user_entry_points); + arena_clear(d_ctrl_state->user_entry_point_arena); + MemoryZeroStruct(&d_ctrl_state->user_entry_points); for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) { - str8_list_push(ctrl_state->user_entry_point_arena, &ctrl_state->user_entry_points, n->string); + str8_list_push(d_ctrl_state->user_entry_point_arena, &d_ctrl_state->user_entry_points, n->string); } }break; case CTRL_MsgKind_SetModuleDebugInfoPath: { - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; String8 path = msg->path; CTRL_Entity *module = ctrl_entity_from_handle(entity_ctx, msg->entity); CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); di_close(old_dbgi_key, 0); - MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); + ctrl_entity_equip_string(d_ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); } U64 new_dbgi_timestamp = os_properties_from_file_path(path).modified; debug_info_path->timestamp = new_dbgi_timestamp; @@ -3594,16 +3514,16 @@ ctrl_thread__entry_point(void *p) }break; } } - ins_atomic_u64_eval_assign(&ctrl_state->ctrl_thread_run_state, 0); + ins_atomic_u64_eval_assign(&d_ctrl_state->ctrl_thread_run_state, 0); } - ins_atomic_u64_inc_eval(&ctrl_state->run_gen); - ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); - ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->run_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); //- rjf: update thread register cache ProfScope("update thread register cache") { - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; CTRL_EntityArray threads = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Thread); REGS_RegBlockX64 *blocks = push_array(scratch.arena, REGS_RegBlockX64, threads.count); { @@ -3633,7 +3553,7 @@ ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope * ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); Access *access = eval_scope->access; - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; CTRL_Entity *module_entity = ctrl_entity_from_handle(entity_ctx, module); CTRL_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, CTRL_EntityKind_DebugInfoPath); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_entity); @@ -4133,10 +4053,10 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ // { U64 hash = ctrl_hash_from_handle(module); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeW(stripe->rw_mutex) { CTRL_ModuleImageInfoCacheNode *node = 0; @@ -4180,10 +4100,10 @@ ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr U64 raddbg_attached_marker_voff = 0; { U64 hash = ctrl_hash_from_handle(module); - U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; + CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeW(stripe->rw_mutex) { CTRL_ModuleImageInfoCacheNode *node = 0; @@ -4222,7 +4142,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, ProfBeginFunction(); DMN_Event *event = push_array(arena, DMN_Event, 1); Temp scratch = scratch_begin(&arena, 1); - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; //- rjf: loop -> try to get event, run, repeat U64 spoof_old_ip_value = 0; @@ -4232,7 +4152,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, ProfScope("get next event") { // rjf: grab first event - DMN_EventNode *next_event_node = ctrl_state->first_dmn_event_node; + DMN_EventNode *next_event_node = d_ctrl_state->first_dmn_event_node; // rjf: log event if(next_event_node != 0) @@ -4282,7 +4202,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, // rjf: exception code kind -> shouldn't stop? if so, do not filter if(should_filter_event) { - B32 shouldnt_filter = !!(ctrl_state->exception_code_filters[code_kind/64] & (1ull<<(code_kind%64))); + B32 shouldnt_filter = !!(d_ctrl_state->exception_code_filters[code_kind/64] & (1ull<<(code_kind%64))); if(should_filter_event && shouldnt_filter) { should_filter_event = 0; @@ -4363,7 +4283,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, if(next_event_node != 0 && !should_filter_event) { got_event = 1; - SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); + SLLQueuePop(d_ctrl_state->first_dmn_event_node, d_ctrl_state->last_dmn_event_node); MemoryCopyStruct(event, &next_event_node->v); event->string = push_str8_copy(arena, event->string); run_ctrls->ignore_previous_exception = 1; @@ -4372,7 +4292,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, // rjf: good event but filtered? pop from queue if(next_event_node != 0 && should_filter_event) { - SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node); + SLLQueuePop(d_ctrl_state->first_dmn_event_node, d_ctrl_state->last_dmn_event_node); run_ctrls->ignore_previous_exception = 0; } } @@ -4422,23 +4342,23 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, } DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls); - ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); - ins_atomic_u64_inc_eval(&ctrl_state->reg_gen); - ins_atomic_u64_inc_eval(&ctrl_state->run_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->run_gen); for(DMN_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next) { - DMN_EventNode *dst_n = ctrl_state->free_dmn_event_node; + DMN_EventNode *dst_n = d_ctrl_state->free_dmn_event_node; if(dst_n != 0) { - SLLStackPop(ctrl_state->free_dmn_event_node); + SLLStackPop(d_ctrl_state->free_dmn_event_node); } else { - dst_n = push_array(ctrl_state->dmn_event_arena, DMN_EventNode, 1); + dst_n = push_array(d_ctrl_state->dmn_event_arena, DMN_EventNode, 1); } MemoryCopyStruct(&dst_n->v, &src_n->v); - dst_n->v.string = push_str8_copy(ctrl_state->dmn_event_arena, dst_n->v.string); - SLLQueuePush(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node, dst_n); + dst_n->v.string = push_str8_copy(d_ctrl_state->dmn_event_arena, dst_n->v.string); + SLLQueuePush(d_ctrl_state->first_dmn_event_node, d_ctrl_state->last_dmn_event_node, dst_n); } } @@ -4482,7 +4402,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, out_evt->entity_id = event->code; out_evt->tls_model = ctrl_dynamic_linker_type_from_dmn(event->tls_model); out_evt->target_os = OperatingSystem_CURRENT; // TODO: operating system of the remote target machine - ctrl_state->process_counter += 1; + d_ctrl_state->process_counter += 1; }break; case DMN_EventKind_CreateThread: { @@ -4537,7 +4457,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, out_evt->msg_id = msg->msg_id; out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); out_evt->u64_code = event->code; - ctrl_state->process_counter -= 1; + d_ctrl_state->process_counter -= 1; }break; case DMN_EventKind_ExitThread: { @@ -4565,7 +4485,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, }break; case DMN_EventKind_DebugString: { - U64 num_strings = (event->string.size + ctrl_state->c2u_ring_max_string_size-1) / ctrl_state->c2u_ring_max_string_size; + U64 num_strings = (event->string.size + d_ctrl_state->c2u_ring_max_string_size-1) / d_ctrl_state->c2u_ring_max_string_size; for(U64 string_idx = 0; string_idx < num_strings; string_idx += 1) { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); @@ -4573,7 +4493,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, out_evt->msg_id = msg->msg_id; out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); - out_evt->string = str8_substr(event->string, r1u64(string_idx*ctrl_state->c2u_ring_max_string_size, (string_idx+1)*ctrl_state->c2u_ring_max_string_size)); + out_evt->string = str8_substr(event->string, r1u64(string_idx*d_ctrl_state->c2u_ring_max_string_size, (string_idx+1)*d_ctrl_state->c2u_ring_max_string_size)); } }break; case DMN_EventKind_SetThreadName: @@ -4629,17 +4549,17 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, //- rjf: if this is the first process in a session, clear the debug directory // cache state - if(ctrl_state->process_counter == 1 && event->kind == DMN_EventKind_CreateProcess) + if(d_ctrl_state->process_counter == 1 && event->kind == DMN_EventKind_CreateProcess) { - arena_clear(ctrl_state->dbg_dir_arena); - ctrl_state->dbg_dir_root = push_array(ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1); + arena_clear(d_ctrl_state->dbg_dir_arena); + d_ctrl_state->dbg_dir_root = push_array(d_ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1); } //- rjf: out of queued up demon events -> clear event arena - if(ctrl_state->first_dmn_event_node == 0) + if(d_ctrl_state->first_dmn_event_node == 0) { - ctrl_state->free_dmn_event_node = 0; - arena_clear(ctrl_state->dmn_event_arena); + d_ctrl_state->free_dmn_event_node = 0; + arena_clear(d_ctrl_state->dmn_event_arena); } scratch_end(scratch); @@ -4687,7 +4607,7 @@ ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) case CTRL_EntityKind_Thread: { Temp scratch = scratch_begin(0, 0); - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; U64 regs_size = regs_block_size_from_arch(entity->arch); void *regs = ctrl_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle); Rng1U64 legal_range = r1u64(0, regs_size); @@ -4709,7 +4629,7 @@ internal CTRL_EvalScope * ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread) { ProfBeginFunction(); - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; CTRL_EvalScope *scope = push_array(arena, CTRL_EvalScope, 1); scope->access = access_open(); @@ -4769,8 +4689,8 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C { // rjf: find cached result U64 hash = ctrl_hash_from_handle(mod->handle); - U64 slot_idx = hash%ctrl_state->module_req_cache_slots_count; - CTRL_ModuleReqCacheNode *slot = ctrl_state->module_req_cache_slots[slot_idx]; + U64 slot_idx = hash%d_ctrl_state->module_req_cache_slots_count; + CTRL_ModuleReqCacheNode *slot = d_ctrl_state->module_req_cache_slots[slot_idx]; CTRL_ModuleReqCacheNode *node = 0; for(CTRL_ModuleReqCacheNode *n = slot; n != 0; n = n->next) { @@ -4824,16 +4744,16 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C void *file_base = os_file_map_view_open(map, OS_AccessFlag_Read, r1u64(0, props.size)); String8 file_data = str8(file_base, props.size); { - rdi_is_necessary = pdb_has_symbol_or_file_ref(file_data, ctrl_state->msg_user_bp_touched_symbols, ctrl_state->msg_user_bp_touched_files); + rdi_is_necessary = pdb_has_symbol_or_file_ref(file_data, d_ctrl_state->msg_user_bp_touched_symbols, d_ctrl_state->msg_user_bp_touched_files); } os_file_map_view_close(map, file_base, r1u64(0, props.size)); os_file_map_close(map); } } os_file_close(file); - node = push_array(ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode, 1); + node = push_array(d_ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode, 1); node->next = slot; - ctrl_state->module_req_cache_slots[slot_idx] = node; + d_ctrl_state->module_req_cache_slots[slot_idx] = node; node->module = mod->handle; node->required = rdi_is_necessary; } @@ -4873,7 +4793,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C ////////////////////////////// //- rjf: select evaluation cache // - e_select_cache(ctrl_state->ctrl_thread_eval_cache); + e_select_cache(d_ctrl_state->ctrl_thread_eval_cache); ////////////////////////////// //- rjf: build base evaluation context @@ -4958,7 +4878,7 @@ ctrl_thread__end_and_flush_log(void) { Temp scratch = scratch_begin(0, 0); LogScopeResult log = log_scope_end(scratch.arena); - os_append_data_to_file_path(ctrl_state->ctrl_thread_log_path, log.strings[LogMsgKind_Info]); + os_append_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, log.strings[LogMsgKind_Info]); if(log.strings[LogMsgKind_UserError].size != 0) { CTRL_EventList evts = {0}; @@ -5023,8 +4943,8 @@ ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) os_file_close(stdin_handle); //- rjf: record (id -> entry points), so that we know custom entry points for this PID - CTRL_EntityCtxRWStore *entity_ctx_rw_store = ctrl_state->ctrl_thread_entity_store; - MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + CTRL_EntityCtxRWStore *entity_ctx_rw_store = d_ctrl_state->ctrl_thread_entity_store; + MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) { @@ -5152,7 +5072,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); U32 exit_code = msg->exit_code; - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; //- rjf: gather all currently existing processes CTRL_EntityArray initial_processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process); @@ -5289,7 +5209,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) Temp scratch = scratch_begin(0, 0); DMN_Event *stop_event = 0; CTRL_EventCause stop_cause = CTRL_EventCause_Null; - CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; CTRL_Handle target_thread = msg->entity; CTRL_Handle target_process = msg->parent; CTRL_Entity *target_process_entity = ctrl_entity_from_handle(entity_ctx, target_process); @@ -5783,7 +5703,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: add traps for all custom user entry points if(!entries_found) { - for(String8Node *n = ctrl_state->user_entry_points.first; n != 0; n = n->next) + for(String8Node *n = d_ctrl_state->user_entry_points.first; n != 0; n = n->next) { U32 procedure_id = 0; { @@ -6476,7 +6396,7 @@ ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 void *range_base = 0; U64 zero_terminated_size = 0; U64 pre_read_mem_gen = ctrl_mem_gen(); - B32 pre_run_state = ins_atomic_u64_eval(&ctrl_state->ctrl_thread_run_state); + B32 pre_run_state = ins_atomic_u64_eval(&d_ctrl_state->ctrl_thread_run_state); if(range_size != 0) { // rjf: set up arena @@ -6545,7 +6465,7 @@ ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 } } U64 post_read_mem_gen = ctrl_mem_gen(); - B32 post_run_state = ins_atomic_u64_eval(&ctrl_state->ctrl_thread_run_state); + B32 post_run_state = ins_atomic_u64_eval(&d_ctrl_state->ctrl_thread_run_state); //- rjf: form content key C_Key content_key = {0}; @@ -6574,9 +6494,9 @@ ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 //- rjf: wakeup on new submissions if(!u128_match(u128_zero(), hash)) { - if(ctrl_state->wakeup_hook != 0) + if(d_ctrl_state->wakeup_hook != 0) { - ctrl_state->wakeup_hook(); + d_ctrl_state->wakeup_hook(); } } @@ -6809,7 +6729,7 @@ ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src) //- rjf: success -> bump generation if(result) { - ins_atomic_u64_inc_eval(&ctrl_state->mem_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); } //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless @@ -6852,9 +6772,9 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, //- rjf: produce mini entity context for just this call stack build CTRL_EntityCtx *entity_ctx = push_array(scratch.arena, CTRL_EntityCtx, 1); - MutexScopeR(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + MutexScopeR(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - CTRL_EntityCtx *src_ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *src_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; CTRL_EntityCtx *dst_ctx = entity_ctx; { dst_ctx->root = &ctrl_entity_nil; @@ -6992,9 +6912,9 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, } //- rjf: broadcast update - if(good && ctrl_state->wakeup_hook != 0) + if(good && d_ctrl_state->wakeup_hook != 0) { - ctrl_state->wakeup_hook(); + d_ctrl_state->wakeup_hook(); } //- rjf: bundle call stack as artifact @@ -7053,9 +6973,9 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry CTRL_Handle *threads = 0; CTRL_Handle *threads_processes = 0; Arch *threads_arches = 0; - MutexScopeR(ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + MutexScopeR(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - CTRL_EntityCtx *ctx = &ctrl_state->ctrl_thread_entity_store->ctx; + CTRL_EntityCtx *ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; CTRL_EntityArray thread_entities = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread); threads_count = thread_entities.count; threads = push_array(scratch.arena, CTRL_Handle, threads_count); diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 895357f9..64a6651e 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -263,8 +263,8 @@ typedef CTRL_WAKEUP_FUNCTION_DEF(CTRL_WakeupFunctionType); //////////////////////////////// //~ rjf: Main State Types -typedef struct CTRL_State CTRL_State; -struct CTRL_State +typedef struct D_CtrlState D_CtrlState; +struct D_CtrlState { Arena *arena; CTRL_WakeupFunctionType *wakeup_hook; @@ -327,7 +327,7 @@ struct CTRL_State //////////////////////////////// //~ rjf: Globals -global CTRL_State *ctrl_state = 0; +global D_CtrlState *d_ctrl_state = 0; read_only global CTRL_Entity ctrl_entity_nil = { &ctrl_entity_nil, @@ -471,11 +471,6 @@ internal CTRL_Entity *ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id); //- rjf: applying events to entity caches internal void ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list); -//////////////////////////////// -//~ rjf: Main Layer Initialization - -internal void ctrl_init(void); - //////////////////////////////// //~ rjf: Wakeup Callback Registration diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 84ee8b33..1bd5cee9 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -294,7 +294,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread) // rjf: thread => unpacked info CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); // rjf: ip => machine code String8 machine_code = {0}; @@ -333,7 +333,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) // rjf: thread => info Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); @@ -546,7 +546,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) // rjf: thread => info Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); @@ -1142,7 +1142,7 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 internal CTRL_Event d_ctrl_last_stop_event(void) { - return d_state->ctrl_last_stop_event; + return d_user_state->ctrl_last_stop_event; } //////////////////////////////// @@ -1153,7 +1153,7 @@ d_ctrl_last_stop_event(void) internal U64 d_frame_index(void) { - return d_state->frame_index; + return d_user_state->frame_index; } //- rjf: control state @@ -1161,19 +1161,19 @@ d_frame_index(void) internal D_RunKind d_ctrl_last_run_kind(void) { - return d_state->ctrl_last_run_kind; + return d_user_state->ctrl_last_run_kind; } internal U64 d_ctrl_last_run_frame_idx(void) { - return d_state->ctrl_last_run_frame_idx; + return d_user_state->ctrl_last_run_frame_idx; } internal B32 d_ctrl_targets_running(void) { - return d_state->ctrl_is_running; + return d_user_state->ctrl_is_running; } //- rjf: active entity based queries @@ -1182,7 +1182,7 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena) { DI_KeyList dbgis = {0}; - CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); + CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); for EachIndex(idx, modules.count) { CTRL_Entity *module = modules.v[idx]; @@ -1207,7 +1207,7 @@ d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) U64 result = 0; if(unwind_count == 0) { - result = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + result = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); } else { @@ -1240,9 +1240,9 @@ internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) { U64 result = 0; - for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->tls_base_caches); cache_idx += 1) + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_user_state->tls_base_caches); cache_idx += 1) { - D_RunTLSBaseCache *cache = &d_state->tls_base_caches[(d_state->tls_base_cache_gen+cache_idx)%ArrayCount(d_state->tls_base_caches)]; + D_RunTLSBaseCache *cache = &d_user_state->tls_base_caches[(d_user_state->tls_base_cache_gen+cache_idx)%ArrayCount(d_user_state->tls_base_caches)]; if(cache_idx == 0 && cache->slots_count == 0) { cache->slots_count = 256; @@ -1292,9 +1292,9 @@ d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) { ProfBeginFunction(); E_String2NumMap *map = &e_string2num_map_nil; - for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->locals_caches); cache_idx += 1) + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_user_state->locals_caches); cache_idx += 1) { - D_RunLocalsCache *cache = &d_state->locals_caches[(d_state->locals_cache_gen+cache_idx)%ArrayCount(d_state->locals_caches)]; + D_RunLocalsCache *cache = &d_user_state->locals_caches[(d_user_state->locals_cache_gen+cache_idx)%ArrayCount(d_user_state->locals_caches)]; if(cache_idx == 0 && cache->table_size == 0) { cache->table_size = 256; @@ -1346,9 +1346,9 @@ d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) { ProfBeginFunction(); E_String2NumMap *map = &e_string2num_map_nil; - for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->member_caches); cache_idx += 1) + for(U64 cache_idx = 0; cache_idx < ArrayCount(d_user_state->member_caches); cache_idx += 1) { - D_RunLocalsCache *cache = &d_state->member_caches[(d_state->member_cache_gen+cache_idx)%ArrayCount(d_state->member_caches)]; + D_RunLocalsCache *cache = &d_user_state->member_caches[(d_user_state->member_cache_gen+cache_idx)%ArrayCount(d_user_state->member_caches)]; if(cache_idx == 0 && cache->table_size == 0) { cache->table_size = 256; @@ -1400,7 +1400,7 @@ d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) internal void d_push_cmd(D_CmdKind kind, D_CmdParams *params) { - d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, kind, params); + d_cmd_list_push_new(d_user_state->cmds_arena, &d_user_state->cmds, kind, params); } //- rjf: command iteration @@ -1408,7 +1408,7 @@ d_push_cmd(D_CmdKind kind, D_CmdParams *params) internal B32 d_next_cmd(D_Cmd **cmd) { - D_CmdNode *start_node = d_state->cmds.first; + D_CmdNode *start_node = d_user_state->cmds.first; if(cmd[0] != 0) { start_node = CastFromMember(D_CmdNode, cmd, cmd[0]); @@ -1425,50 +1425,13 @@ d_next_cmd(D_Cmd **cmd) //////////////////////////////// //~ rjf: Main Layer Top-Level Calls -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - -internal void -d_init(void) -{ - Arena *arena = arena_alloc(); - d_state = push_array(arena, D_State, 1); - d_state->arena = arena; - d_state->cmds_arena = arena_alloc(); - d_state->output_log_key = c_key_make(c_root_alloc(), c_id_make(0, 0)); - c_submit_data(d_state->output_log_key, 0, str8_zero()); - d_state->ctrl_entity_store = ctrl_entity_ctx_rw_store_alloc(); - d_state->ctrl_stop_arena = arena_alloc(); - d_state->ctrl_msg_arena = arena_alloc(); - - // rjf: set up caches - for(U64 idx = 0; idx < ArrayCount(d_state->tls_base_caches); idx += 1) - { - d_state->tls_base_caches[idx].arena = arena_alloc(); - } - for(U64 idx = 0; idx < ArrayCount(d_state->locals_caches); idx += 1) - { - d_state->locals_caches[idx].arena = arena_alloc(); - } - for(U64 idx = 0; idx < ArrayCount(d_state->member_caches); idx += 1) - { - d_state->member_caches[idx].arena = arena_alloc(); - } - - // rjf: set up run state - d_state->ctrl_last_run_arena = arena_alloc(); -} - internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); D_EventList result = {0}; - d_state->frame_index += 1; + d_user_state->frame_index += 1; ////////////////////////////// //- rjf: sync with ctrl thread @@ -1481,7 +1444,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P //- rjf: consume & process events CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); - ctrl_entity_store_apply_events(d_state->ctrl_entity_store, &events); + ctrl_entity_store_apply_events(d_user_state->ctrl_entity_store, &events); for(CTRL_EventNode *event_n = events.first; event_n != 0; event_n = event_n->next) @@ -1505,16 +1468,16 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case CTRL_EventKind_Started: { - d_state->ctrl_is_running = 1; - d_state->ctrl_thread_run_state = 1; + d_user_state->ctrl_is_running = 1; + d_user_state->ctrl_thread_run_state = 1; }break; case CTRL_EventKind_Stopped: { - B32 should_snap = !(d_state->ctrl_soft_halt_issued); - d_state->ctrl_is_running = 0; - d_state->ctrl_thread_run_state = 0; - d_state->ctrl_soft_halt_issued = 0; + B32 should_snap = !(d_user_state->ctrl_soft_halt_issued); + d_user_state->ctrl_is_running = 0; + d_user_state->ctrl_thread_run_state = 0; + d_user_state->ctrl_soft_halt_issued = 0; // rjf: exception or unexpected trap -> push error if(event->cause == CTRL_EventCause_InterruptedByException || @@ -1525,15 +1488,15 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: gather stop info { - arena_clear(d_state->ctrl_stop_arena); - MemoryCopyStruct(&d_state->ctrl_last_stop_event, event); - d_state->ctrl_last_stop_event.string = push_str8_copy(d_state->ctrl_stop_arena, d_state->ctrl_last_stop_event.string); + arena_clear(d_user_state->ctrl_stop_arena); + MemoryCopyStruct(&d_user_state->ctrl_last_stop_event, event); + d_user_state->ctrl_last_stop_event.string = push_str8_copy(d_user_state->ctrl_stop_arena, d_user_state->ctrl_last_stop_event.string); } // rjf: push stop event to caller, if this is not a soft-halt if(should_snap) { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, event->entity); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, event->entity); D_EventCause cause = D_EventCause_Null; switch(event->cause) { @@ -1568,11 +1531,11 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case CTRL_EventKind_NewProc: { // rjf: the first process? -> clear session output - CTRL_EntityArray existing_processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray existing_processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); if(existing_processes.count == 1) { MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; - mtx_push_op(d_state->output_log_key, op); + mtx_push_op(d_user_state->output_log_key, op); } }break; @@ -1601,7 +1564,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case CTRL_EventKind_DebugString: { MTX_Op op = {r1u64(max_U64, max_U64), event->string}; - mtx_push_op(d_state->output_log_key, op); + mtx_push_op(d_user_state->output_log_key, op); }break; //- rjf: memory @@ -1615,41 +1578,41 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P } //- rjf: clear tls base cache - if((d_state->tls_base_cache_reggen_idx != new_reg_gen || - d_state->tls_base_cache_memgen_idx != new_mem_gen) && + if((d_user_state->tls_base_cache_reggen_idx != new_reg_gen || + d_user_state->tls_base_cache_memgen_idx != new_mem_gen) && !d_ctrl_targets_running()) { - d_state->tls_base_cache_gen += 1; - D_RunTLSBaseCache *cache = &d_state->tls_base_caches[d_state->tls_base_cache_gen%ArrayCount(d_state->tls_base_caches)]; + d_user_state->tls_base_cache_gen += 1; + D_RunTLSBaseCache *cache = &d_user_state->tls_base_caches[d_user_state->tls_base_cache_gen%ArrayCount(d_user_state->tls_base_caches)]; arena_clear(cache->arena); cache->slots_count = 0; cache->slots = 0; - d_state->tls_base_cache_reggen_idx = new_reg_gen; - d_state->tls_base_cache_memgen_idx = new_mem_gen; + d_user_state->tls_base_cache_reggen_idx = new_reg_gen; + d_user_state->tls_base_cache_memgen_idx = new_mem_gen; } //- rjf: clear locals cache - if(d_state->locals_cache_reggen_idx != new_reg_gen && + if(d_user_state->locals_cache_reggen_idx != new_reg_gen && !d_ctrl_targets_running()) { - d_state->locals_cache_gen += 1; - D_RunLocalsCache *cache = &d_state->locals_caches[d_state->locals_cache_gen%ArrayCount(d_state->locals_caches)]; + d_user_state->locals_cache_gen += 1; + D_RunLocalsCache *cache = &d_user_state->locals_caches[d_user_state->locals_cache_gen%ArrayCount(d_user_state->locals_caches)]; arena_clear(cache->arena); cache->table_size = 0; cache->table = 0; - d_state->locals_cache_reggen_idx = new_reg_gen; + d_user_state->locals_cache_reggen_idx = new_reg_gen; } //- rjf: clear members cache - if(d_state->member_cache_reggen_idx != new_reg_gen && + if(d_user_state->member_cache_reggen_idx != new_reg_gen && !d_ctrl_targets_running()) { - d_state->member_cache_gen += 1; - D_RunLocalsCache *cache = &d_state->member_caches[d_state->member_cache_gen%ArrayCount(d_state->member_caches)]; + d_user_state->member_cache_gen += 1; + D_RunLocalsCache *cache = &d_user_state->member_caches[d_user_state->member_cache_gen%ArrayCount(d_user_state->member_caches)]; arena_clear(cache->arena); cache->table_size = 0; cache->table = 0; - d_state->member_cache_reggen_idx = new_reg_gen; + d_user_state->member_cache_reggen_idx = new_reg_gen; } } @@ -1661,7 +1624,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: build data strings of all param data String8List strings = {0}; { - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); for EachIndex(idx, threads.count) { CTRL_Entity *thread = threads.v[idx]; @@ -1693,7 +1656,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // halt-refresh to inform the ctrl thread about the updated // state // - if(d_ctrl_targets_running() && !u128_match(ctrl_param_state_hash, d_state->ctrl_last_run_param_state_hash)) + if(d_ctrl_targets_running() && !u128_match(ctrl_param_state_hash, d_user_state->ctrl_last_run_param_state_hash)) { d_cmd(D_CmdKind_SoftHaltRefresh); } @@ -1816,7 +1779,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Kill: { - CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->process); + CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); if(process == &ctrl_entity_nil) { log_user_error(str8_lit("Cannot kill; no process was specified.")); @@ -1839,7 +1802,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Detach: { - CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->process); + CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); if(process == &ctrl_entity_nil) { log_user_error(str8_lit("Cannot detach; no process specified.")); @@ -1855,7 +1818,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_Continue: { B32 good_to_run = 0; - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); if(threads.count > 0) { for EachIndex(idx, threads.count) @@ -1871,7 +1834,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { need_run = 1; run_kind = D_RunKind_Run; - run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); + run_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); } else { @@ -1885,7 +1848,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepOverLine: case D_CmdKind_StepOut: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); if(thread == &ctrl_entity_nil) { log_user_error(str8_lit("Must have a selected thread to step.")); @@ -1972,16 +1935,16 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P if(d_ctrl_targets_running()) { need_run = 1; - run_kind = d_state->ctrl_last_run_kind; - run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, d_state->ctrl_last_run_thread_handle); - run_flags = d_state->ctrl_last_run_flags; - run_traps = d_state->ctrl_last_run_traps; + run_kind = d_user_state->ctrl_last_run_kind; + run_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, d_user_state->ctrl_last_run_thread_handle); + run_flags = d_user_state->ctrl_last_run_flags; + run_traps = d_user_state->ctrl_last_run_traps; }break; case D_CmdKind_SetThreadIP: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); U64 vaddr = params->vaddr; - void *block = ctrl_reg_block_from_thread(scratch.arena, &d_state->ctrl_entity_store->ctx, thread->handle); + void *block = ctrl_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, thread->handle); regs_arch_block_write_rip(thread->arch, block, vaddr); B32 result = ctrl_thread_write_reg_block(thread->handle, block); (void)result; @@ -2005,7 +1968,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Run: { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_Continue, .machine = params->machine, .process = params->process, .thread = params->thread); @@ -2017,7 +1980,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Restart: { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_KillAll); @@ -2027,7 +1990,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepInto: case D_CmdKind_StepOver: { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); if(processes.count != 0) { D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto @@ -2077,7 +2040,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_ThawEntity: { B32 should_freeze = (cmd->kind == D_CmdKind_FreezeEntity); - CTRL_Entity *root = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); + CTRL_Entity *root = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) { if(e->kind == CTRL_EntityKind_Thread) @@ -2091,23 +2054,23 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P if(d_ctrl_targets_running()) { need_run = 1; - run_kind = d_state->ctrl_last_run_kind; - run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, d_state->ctrl_last_run_thread_handle); - run_flags = d_state->ctrl_last_run_flags; - run_traps = d_state->ctrl_last_run_traps; + run_kind = d_user_state->ctrl_last_run_kind; + run_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, d_user_state->ctrl_last_run_thread_handle); + run_flags = d_user_state->ctrl_last_run_flags; + run_traps = d_user_state->ctrl_last_run_traps; } }break; //- rjf: entity decoration case D_CmdKind_SetEntityColor: { - CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); + CTRL_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); entity->rgba = params->rgba; }break; case D_CmdKind_SetEntityName: { - CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity); - ctrl_entity_equip_string(d_state->ctrl_entity_store, entity, params->string); + CTRL_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + ctrl_entity_equip_string(d_user_state->ctrl_entity_store, entity, params->string); }break; //- rjf: attaching @@ -2129,7 +2092,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { // rjf: compute hash of all run-parameterization entities, store { - d_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash; + d_user_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash; } // rjf: push & fill run message @@ -2193,19 +2156,19 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P } } - // rjf: copy run traps to scratch (needed, if run_traps can be `d_state->ctrl_last_run_traps`) + // rjf: copy run traps to scratch (needed, if run_traps can be `d_user_state->ctrl_last_run_traps`) CTRL_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps); D_BreakpointArray run_extra_bps_copy = d_breakpoint_array_copy(scratch.arena, &run_extra_bps); // rjf: store last run info - arena_clear(d_state->ctrl_last_run_arena); - d_state->ctrl_last_run_kind = run_kind; - d_state->ctrl_last_run_frame_idx = d_frame_index(); - d_state->ctrl_last_run_thread_handle = run_thread->handle; - d_state->ctrl_last_run_flags = run_flags; - d_state->ctrl_last_run_traps = ctrl_trap_list_copy(d_state->ctrl_last_run_arena, &run_traps_copy); - d_state->ctrl_last_run_extra_bps = d_breakpoint_array_copy(d_state->ctrl_last_run_arena, &run_extra_bps_copy); - d_state->ctrl_is_running = 1; + arena_clear(d_user_state->ctrl_last_run_arena); + d_user_state->ctrl_last_run_kind = run_kind; + d_user_state->ctrl_last_run_frame_idx = d_frame_index(); + d_user_state->ctrl_last_run_thread_handle = run_thread->handle; + d_user_state->ctrl_last_run_flags = run_flags; + d_user_state->ctrl_last_run_traps = ctrl_trap_list_copy(d_user_state->ctrl_last_run_arena, &run_traps_copy); + d_user_state->ctrl_last_run_extra_bps = d_breakpoint_array_copy(d_user_state->ctrl_last_run_arena, &run_extra_bps_copy); + d_user_state->ctrl_is_running = 1; } } } @@ -2214,8 +2177,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P //- rjf: clear command batch // { - arena_clear(d_state->cmds_arena); - MemoryZeroStruct(&d_state->cmds); + arena_clear(d_user_state->cmds_arena); + MemoryZeroStruct(&d_user_state->cmds); } ////////////////////////////// @@ -2223,7 +2186,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // for EachNode(n, D_CmdNode, deferred_cmds.first) { - d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, n->cmd.kind, &n->cmd.params); + d_cmd_list_push_new(d_user_state->cmds_arena, &d_user_state->cmds, n->cmd.kind, &n->cmd.params); } ////////////////////////////// @@ -2232,19 +2195,19 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // the next tick) // { - CTRL_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_state->ctrl_msg_arena, &ctrl_msgs); - ctrl_msg_list_concat_in_place(&d_state->ctrl_msgs, &msgs_copy); - if(d_state->ctrl_msgs.count != 0) + CTRL_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_user_state->ctrl_msg_arena, &ctrl_msgs); + ctrl_msg_list_concat_in_place(&d_user_state->ctrl_msgs, &msgs_copy); + if(d_user_state->ctrl_msgs.count != 0) { - if(!d_state->ctrl_soft_halt_issued && d_state->ctrl_thread_run_state) + if(!d_user_state->ctrl_soft_halt_issued && d_user_state->ctrl_thread_run_state) { - d_state->ctrl_soft_halt_issued = 1; + d_user_state->ctrl_soft_halt_issued = 1; ctrl_halt(); } - if(ctrl_u2c_push_msgs(&d_state->ctrl_msgs, os_now_microseconds()+100)) + if(ctrl_u2c_push_msgs(&d_user_state->ctrl_msgs, os_now_microseconds()+100)) { - MemoryZeroStruct(&d_state->ctrl_msgs); - arena_clear(d_state->ctrl_msg_arena); + MemoryZeroStruct(&d_user_state->ctrl_msgs); + arena_clear(d_user_state->ctrl_msg_arena); } } } diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index 9f92e12a..ba48f5ad 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -332,8 +332,8 @@ struct CTRL_EventList //////////////////////////////// //~ rjf: Main State Types -typedef struct D_State D_State; -struct D_State +typedef struct D_UserState D_UserState; +struct D_UserState { // rjf: top-level state Arena *arena; @@ -382,7 +382,7 @@ struct D_State //////////////////////////////// //~ rjf: Globals -global D_State *d_state = 0; +global D_UserState *d_user_state = 0; //////////////////////////////// //~ rjf: Basic Helpers @@ -480,7 +480,6 @@ internal B32 d_next_cmd(D_Cmd **cmd); //////////////////////////////// //~ rjf: Main Layer Top-Level Calls -internal void d_init(void); internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]); #endif // DBG_ENGINE_USER_H diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 7eed0982..a2255f67 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -689,7 +689,7 @@ rd_ctrl_entity_from_eval_space(E_Space space) CTRL_Handle handle; handle.machine_id = space.u64s[0]; handle.dmn_handle.u64[0] = space.u64s[1]; - entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, handle); + entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); } return entity; } @@ -1007,7 +1007,7 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 write_range = intersect_1u64(legal_range, range); U64 write_size = dim_1u64(write_range); - void *new_regs = ctrl_reg_block_from_thread(scratch.arena, &d_state->ctrl_entity_store->ctx, entity->handle); + void *new_regs = ctrl_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, entity->handle); MemoryCopy((U8 *)new_regs + write_range.min, in, write_size); result = ctrl_thread_write_reg_block(entity->handle, new_regs); scratch_end(scratch); @@ -1090,7 +1090,7 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) if(str8_match(child_schema->string, str8_lit("label"), 0)) { result = 1; - ctrl_entity_equip_string(d_state->ctrl_entity_store, entity, write_string); + ctrl_entity_equip_string(d_user_state->ctrl_entity_store, entity, write_string); rd_cmd(D_CmdKind_SetEntityName, .ctrl_entity = entity->handle, .string = write_string); } else if(str8_match(child_schema->string, str8_lit("dbg"), 0)) @@ -1703,7 +1703,7 @@ rd_view_ui(Rng2F32 rect) UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) { CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("target")); - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); //- rjf: icon & info UI_Padding(ui_em(2.f, 1.f)) UI_TagF("weak") @@ -2361,7 +2361,7 @@ rd_view_ui(Rng2F32 rect) String8 name = {0}; { U64 vaddr = eval.value.u64; - CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process); + CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); U64 voff = ctrl_voff_from_vaddr(module, vaddr); @@ -4740,7 +4740,7 @@ rd_arch_from_eval(E_Eval eval) CTRL_Entity *process = ctrl_process_from_entity(ctrl_entity); if(process == &ctrl_entity_nil) { - process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process); + process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); } Arch arch = process->arch; if(arch == Arch_Null) @@ -5498,11 +5498,11 @@ rd_window_frame(void) //////////////////////// //- rjf: control entity tooltips // - case RD_RegSlot_Machine: {ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->machine); }goto ctrl_entity_tooltip; - case RD_RegSlot_Process: {ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->process); }goto ctrl_entity_tooltip; - case RD_RegSlot_Module: {ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->module); }goto ctrl_entity_tooltip; - case RD_RegSlot_Thread: {ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->thread); }goto ctrl_entity_tooltip; - case RD_RegSlot_CtrlEntity:{ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->ctrl_entity); }goto ctrl_entity_tooltip; + case RD_RegSlot_Machine: {ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->machine); }goto ctrl_entity_tooltip; + case RD_RegSlot_Process: {ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->process); }goto ctrl_entity_tooltip; + case RD_RegSlot_Module: {ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->module); }goto ctrl_entity_tooltip; + case RD_RegSlot_Thread: {ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->thread); }goto ctrl_entity_tooltip; + case RD_RegSlot_CtrlEntity:{ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->ctrl_entity); }goto ctrl_entity_tooltip; ctrl_entity_tooltip:; UI_Tooltip { @@ -7037,7 +7037,7 @@ rd_window_frame(void) { Temp scratch = scratch_begin(0, 0); CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("target")); - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); B32 can_send_signal = !d_ctrl_targets_running(); typedef struct CenterButtonTask CenterButtonTask; struct CenterButtonTask @@ -9577,7 +9577,7 @@ rd_string_from_exception_code(U32 code) internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, event->entity); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, event->entity); DR_FStrList thread_fstrs = rd_title_fstrs_from_ctrl_entity(arena, thread, 0); DR_FStrList fstrs = {0}; DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit("text")), ui_top_font_size()}; @@ -11102,14 +11102,14 @@ rd_frame(void) //- rjf: unpack basic evaluation context // ProfBegin("unpack eval-dependent info"); - CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); Arch arch = thread->arch; U64 unwind_count = rd_regs()->unwind_count; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); - U64 tls_root_vaddr = ctrl_tls_root_vaddr_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + U64 tls_root_vaddr = ctrl_tls_root_vaddr_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); ProfEnd(); //////////////////////////// @@ -11132,7 +11132,7 @@ rd_frame(void) //////////////////////////// //- rjf: produce all eval modules // - CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); + CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); U64 eval_modules_count = Max(1, all_modules.count); E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &eval_modules[0]; @@ -11514,7 +11514,7 @@ rd_frame(void) { String8 name = evallable_ctrl_names[idx]; CTRL_EntityKind kind = ctrl_entity_kind_from_string(name); - CTRL_EntityArray array = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, kind); + CTRL_EntityArray array = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); for EachIndex(idx, array.count) { @@ -11743,7 +11743,7 @@ rd_frame(void) //- rjf: add macro for output log { Access *access = access_open(); - C_Key key = d_state->output_log_key; + C_Key key = d_user_state->output_log_key; U128 hash = c_hash_from_key(key, 0); String8 data = c_data_from_hash(access, hash); E_Space space = e_space_make(E_SpaceKind_HashStoreKey); @@ -11880,7 +11880,7 @@ rd_frame(void) //- rjf: gather config from loaded modules // CFG_NodePtrList immediate_type_views = {0}; - CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); + CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); ProfScope("gather config from loaded modules") { for EachIndex(idx, modules.count) @@ -12072,7 +12072,7 @@ rd_frame(void) case RD_CmdKind_Restart: { // rjf: reset hit counts - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); if(processes.count == 0 || kind == RD_CmdKind_Restart) { CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); @@ -12292,7 +12292,7 @@ rd_frame(void) { // rjf: if control processes are live, but this is not force-confirmed, then // get confirmation from user - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("lossy_exit_confirmation")); if(processes.count != 0 && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) { @@ -13679,12 +13679,12 @@ rd_frame(void) //- rjf: source <-> disasm case RD_CmdKind_GoToDisassembly: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); U64 vaddr = 0; for(D_LineNode *n = rd_regs()->lines.first; n != 0; n = n->next) { - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, n->v.dbgi_key); - CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_state->ctrl_entity_store->ctx, thread, &modules); + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); if(module != &ctrl_entity_nil) { vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); @@ -13967,7 +13967,7 @@ rd_frame(void) Access *access = access_open(); //- rjf: unpack thread info - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); U64 unwind_index = rd_regs()->unwind_count; U64 inline_depth = rd_regs()->inline_depth; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_index); @@ -14031,7 +14031,7 @@ rd_frame(void) }break; case RD_CmdKind_FindSelectedThread: { - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); rd_cmd(RD_CmdKind_FindThread, .thread = selected_thread->handle, .unwind_count = rd_base_regs()->unwind_count, @@ -14140,7 +14140,7 @@ rd_frame(void) { CTRL_Entity *process = &ctrl_entity_nil; U64 vaddr = 0; - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, voff_dbgi_key); + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, voff_dbgi_key); CTRL_Entity *module = ctrl_entity_list_first(&modules); process = ctrl_entity_ancestor_from_kind(module, CTRL_EntityKind_Process); if(process != &ctrl_entity_nil) @@ -14220,8 +14220,8 @@ rd_frame(void) { file_path = rd_mapped_from_file_path(scratch.arena, rd_regs()->file_path); point = rd_regs()->cursor; - thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); - process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process); + thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); vaddr = rd_regs()->vaddr; prefer_new_tab = rd_regs()->prefer_new_tab; if(file_path.size == 0) @@ -14237,8 +14237,8 @@ rd_frame(void) D_LineList lines = d_lines_from_file_path_line_num(scratch.arena, file_path, point.line); for(D_LineNode *n = lines.first; n != 0; n = n->next) { - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, n->v.dbgi_key); - CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_state->ctrl_entity_store->ctx, thread, &modules); + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); break; } @@ -15179,7 +15179,7 @@ rd_frame(void) case RD_CmdKind_ClearOutput: { MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("")}; - mtx_push_op(d_state->output_log_key, op); + mtx_push_op(d_user_state->output_log_key, op); }break; //- rjf: watch pins @@ -15441,7 +15441,7 @@ rd_frame(void) }break; case RD_CmdKind_SetNextStatement: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); String8 file_path = rd_regs()->file_path; U64 new_rip_vaddr = rd_regs()->vaddr_range.min; if(file_path.size != 0) @@ -15449,8 +15449,8 @@ rd_frame(void) D_LineList *lines = &rd_regs()->lines; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, n->v.dbgi_key); - CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_state->ctrl_entity_store->ctx, thread, &modules); + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); if(module != &ctrl_entity_nil) { new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); @@ -15566,9 +15566,9 @@ rd_frame(void) }break; case RD_CmdKind_SelectThread: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle)); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle)); CTRL_Entity *machine = ctrl_entity_ancestor_from_kind(process, CTRL_EntityKind_Machine); rd_state->base_regs.v.unwind_count = 0; rd_state->base_regs.v.inline_depth = 0; @@ -15581,7 +15581,7 @@ rd_frame(void) case RD_CmdKind_SelectUnwind: { Access *access = access_open(); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); CTRL_CallStackFrame *frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); if(frame == 0) @@ -15600,7 +15600,7 @@ rd_frame(void) case RD_CmdKind_DownOneFrame: { Access *access = access_open(); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); CTRL_CallStackFrame *current_frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); CTRL_CallStackFrame *next_frame = current_frame; @@ -16330,7 +16330,7 @@ rd_frame(void) default:{}break; case D_EventKind_ModuleLoad: { - CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, evt->module); + CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->module); CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); String8 new_path = debug_info_path->string; if(new_path.size != 0 && os_file_path_exists(new_path)) @@ -16368,7 +16368,7 @@ rd_frame(void) case D_EventKind_ProcessEnd: if(rd_state->quit_after_success) { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); if(evt->code == 0 && processes.count == 0) { rd_cmd(RD_CmdKind_Exit); @@ -16381,12 +16381,12 @@ rd_frame(void) case D_EventKind_Stop: { B32 need_refocus = (evt->cause != D_EventCause_SoftHalt); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, evt->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->thread); U64 vaddr = evt->vaddr; CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); U64 voff = ctrl_voff_from_vaddr(module, vaddr); - U64 test_cached_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle); + U64 test_cached_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); // rjf: valid stop thread? -> select & snap if(need_refocus && thread != &ctrl_entity_nil && evt->cause != D_EventCause_Halt) @@ -16395,7 +16395,7 @@ rd_frame(void) } // rjf: no stop-causing thread, but have selected thread? -> snap to selected - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); if(need_refocus && (evt->cause == D_EventCause_Halt || thread == &ctrl_entity_nil) && selected_thread != &ctrl_entity_nil) { rd_cmd(RD_CmdKind_SelectThread, .thread = selected_thread->handle); @@ -16404,7 +16404,7 @@ rd_frame(void) // rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread if(need_refocus && thread == &ctrl_entity_nil && selected_thread == &ctrl_entity_nil) { - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); CTRL_Entity *first_available_thread = ctrl_entity_array_first(&threads); rd_cmd(RD_CmdKind_SelectThread, .thread = first_available_thread->handle); } diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index bc82c903..0f03eeff 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -205,7 +205,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals) E_TYPE_EXPAND_INFO_FUNCTION_DEF(registers) { Temp scratch = scratch_begin(&arena, 1); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); Arch arch = thread->arch; U64 reg_count = regs_reg_code_count_from_arch(arch); String8 *reg_strings = regs_reg_code_string_table_from_arch(arch); @@ -659,7 +659,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(control) str8_match(str8_prefix(rhs->string, 1), str8_lit("$"), 0)) { CTRL_Handle handle = ctrl_handle_from_string(rhs->string); - CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, handle); + CTRL_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0)); result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ctrl_entity_kind_code_name_table[entity->kind]); @@ -978,7 +978,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(call_stack) CTRL_CallStack *call_stack = &accel->call_stack; if(0 <= rhs_value.u64 && rhs_value.u64 < call_stack->frames_count) { - CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, accel->process); + CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, accel->process); CTRL_CallStackFrame *f = &call_stack->frames[rhs_value.u64]; result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, CTRL_EvalSpaceKind_Entity), e_irtree_const_u(arena, regs_rip_from_arch_block(accel->arch, f->regs))); result.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth); @@ -1438,7 +1438,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes) } else { - machines = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Machine); + machines = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Machine); } //- rjf: gather system processes from this machine @@ -1535,7 +1535,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities) { String8 rhs_name = expr->first->next->string; CTRL_Handle handle = ctrl_handle_from_string(rhs_name); - entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, handle); + entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); }break; case E_ExprKind_ArrayIndex: { @@ -1543,7 +1543,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities) CTRL_EntityKind kind = ctrl_entity_kind_from_string(rd_singular_from_code_name_plural(type->name)); E_Value rhs_value = e_value_from_expr(expr->first->next); U64 rhs_idx = rhs_value.u64; - CTRL_EntityArray entities = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, kind); + CTRL_EntityArray entities = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); if(0 <= rhs_idx && rhs_idx < entities.count) { entity = entities.v[rhs_idx]; @@ -1585,7 +1585,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) CTRL_EntityArray array = {0}; if(scoping_entity == &ctrl_entity_nil) { - array = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, entity_kind); + array = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, entity_kind); } else { diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 3b054c55..a5be5e98 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -243,12 +243,11 @@ #define OS_FEATURE_GRAPHICAL 1 #define DMN_INIT_MANUAL 1 -#define CTRL_INIT_MANUAL 1 +#define D_INIT_MANUAL 1 #define OS_GFX_INIT_MANUAL 1 #define FP_INIT_MANUAL 1 #define R_INIT_MANUAL 1 #define FNT_INIT_MANUAL 1 -#define D_INIT_MANUAL 1 #define RD_INIT_MANUAL 1 //////////////////////////////// @@ -540,12 +539,11 @@ entry_point(CmdLine *cmd_line) //- rjf: manual layer initialization { dmn_init(); - ctrl_init(); + d_init(); os_gfx_init(); fp_init(); r_init(cmd_line); fnt_init(); - d_init(); rd_init(cmd_line); ctrl_set_wakeup_hook(wakeup_hook_ctrl); } diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 5885076a..b2774480 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -44,7 +44,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla F32 scroll_bar_dim = floor_f32(main_font_size*1.5f); Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); B32 do_line_numbers = rd_setting_b32_from_name(str8_lit("show_line_numbers")); @@ -277,8 +277,8 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: find live threads mapping to source code if(!dasm_lines) ProfScope("find live threads mapping to this file") { - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); for EachIndex(idx, threads.count) { CTRL_Entity *thread = threads.v[idx]; @@ -340,7 +340,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla if(!dasm_lines) ProfScope("find all src -> dasm info for source code") { String8 file_path = rd_regs()->file_path; - CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->module); + CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); D_LineListArray lines_array = d_lines_array_from_dbgi_key_file_path_line_range(scratch.arena, dbgi_key, file_path, visible_line_num_range); if(lines_array.count != 0) @@ -353,8 +353,8 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: find live threads mapping to disasm if(dasm_lines) ProfScope("find live threads mapping to this disassembly") { - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); for EachIndex(idx, threads.count) { CTRL_Entity *thread = threads.v[idx]; @@ -2099,7 +2099,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) if(rd_regs()->lang_kind == TXT_LangKind_Null) { Access *access = access_open(); - CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->module); + CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi != &rdi_parsed_nil) @@ -2223,7 +2223,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) // if(rd_regs()->file_path.size != 0) { - CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->module); + CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); rd_regs()->lines = d_lines_from_dbgi_key_file_path_line_num(rd_frame_arena(), dbgi_key, rd_regs()->file_path, rd_regs()->cursor.line); } @@ -2433,13 +2433,13 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == ctrl_run_gen()) { auto_selected = 1; - auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, dv->temp_look_process), CTRL_EvalSpaceKind_Entity); + auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, dv->temp_look_process), CTRL_EvalSpaceKind_Entity); eval = e_eval_from_stringf("(0x%I64x & (~(0x4000 - 1)))", dv->temp_look_vaddr); } else { auto_selected = 1; - auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process), CTRL_EvalSpaceKind_Entity); + auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), CTRL_EvalSpaceKind_Entity); eval = e_eval_from_stringf("(reg:rip & (~(0x4000 - 1)))"); } } @@ -2680,7 +2680,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Rng1U64 view_range = rd_space_range_from_eval(eval); if(eval.space.kind == 0) { - eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process), CTRL_EvalSpaceKind_Entity); + eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), CTRL_EvalSpaceKind_Entity); view_range = rd_whole_range_from_eval_space(eval.space); } @@ -3258,7 +3258,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) AnnotationList *visible_memory_annotations = push_array(scratch.arena, AnnotationList, visible_memory_size); { Access *access = access_open(); - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); CTRL_Entity *selected_process = ctrl_entity_ancestor_from_kind(selected_thread, CTRL_EntityKind_Process); CTRL_CallStack selected_call_stack = ctrl_call_stack_from_thread(access, selected_thread->handle, 1, 0); CTRL_Entity *eval_process = &ctrl_entity_nil; diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 78c738a7..e5d09971 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -108,7 +108,7 @@ rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras) CFG_Node *bp = cfg_node_from_id(stop_event.u64_code); if(bp == cfg) { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, stop_event.entity); + CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); Vec4F32 thread_color = rd_color_from_ctrl_entity(thread); if(thread_color.w == 0) { @@ -509,7 +509,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e if(entity->kind == CTRL_EntityKind_Thread || entity->kind == CTRL_EntityKind_Module) { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); if(processes.count > 1) { CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); @@ -1254,12 +1254,12 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe RD_CodeSliceSignal result = {0}; ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread); + CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); CTRL_Entity *selected_thread_process = ctrl_entity_ancestor_from_kind(selected_thread, CTRL_EntityKind_Process); U64 selected_thread_rip_unwind_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count); CTRL_Entity *selected_thread_module = ctrl_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); CTRL_Event stop_event = d_ctrl_last_stop_event(); - CTRL_Entity *stopper_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, stop_event.entity); + CTRL_Entity *stopper_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); B32 is_focused = ui_is_focus_active(); B32 ctrlified = (os_get_modifiers() & OS_Modifier_Ctrl); Vec4F32 code_line_bgs[] = @@ -1336,7 +1336,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(rd_state->drag_drop_regs_slot == RD_RegSlot_Thread) { drop_can_hit_lines = 1; - drop_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_state->drag_drop_regs->thread); + drop_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_state->drag_drop_regs->thread); drop_color = rd_color_from_ctrl_entity(drop_thread); if(drop_color.w == 0) { @@ -2272,8 +2272,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe D_LineList *lines = ¶ms->line_infos[line_idx]; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, n->v.dbgi_key); - CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_state->ctrl_entity_store->ctx, thread, &modules); + CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); if(module != &ctrl_entity_nil) { new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); @@ -2659,7 +2659,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe Rng1U64 hover_voff_range = hover_regs->voff_range; if(hover_voff_range.min == 0 && hover_voff_range.max == 0) { - CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, hover_regs->module); + CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, hover_regs->module); hover_voff_range = ctrl_voff_range_from_vaddr_range(module, hover_regs->vaddr_range); } ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index e38f8199..c58da570 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -9,12 +9,11 @@ #define BUILD_CONSOLE_INTERFACE 1 #define OS_FEATURE_GRAPHICAL 1 #define DMN_INIT_MANUAL 1 -#define CTRL_INIT_MANUAL 1 +#define D_INIT_MANUAL 1 #define OS_GFX_INIT_MANUAL 1 #define FP_INIT_MANUAL 1 #define R_INIT_MANUAL 1 #define FNT_INIT_MANUAL 1 -#define D_INIT_MANUAL 1 #define RD_INIT_MANUAL 1 #define NO_ASYNC 1 @@ -69,14 +68,13 @@ #include "stap/stap_parse.h" #include "demon/demon_inc.h" #include "eval/eval_inc.h" +#include "dbg_engine/dbg_engine_inc.h" #include "eval_visualization/eval_visualization_inc.h" -#include "ctrl/ctrl_inc.h" #include "font_provider/font_provider_inc.h" #include "render/render_inc.h" #include "font_cache/font_cache.h" #include "draw/draw.h" #include "ui/ui_inc.h" -#include "dbg_engine/dbg_engine_inc.h" #include "raddbg/raddbg_inc.h" #include "linker/base_ext/base_crc32.h" #include "linker/base_ext/base_core.h" @@ -142,14 +140,13 @@ #include "stap/stap_parse.c" #include "demon/demon_inc.c" #include "eval/eval_inc.c" +#include "dbg_engine/dbg_engine_inc.c" #include "eval_visualization/eval_visualization_inc.c" -#include "ctrl/ctrl_inc.c" #include "font_provider/font_provider_inc.c" #include "render/render_inc.c" #include "font_cache/font_cache.c" #include "draw/draw.c" #include "ui/ui_inc.c" -#include "dbg_engine/dbg_engine_inc.c" #include "raddbg/raddbg_inc.c" #include "linker/base_ext/base_core.c" #include "linker/base_ext/base_arena.c" From 0d8a6a4d3a9546aca91073ab59fb8e6f2707edfe Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 13:37:00 -0700 Subject: [PATCH 444/850] ctrl -> d type pass --- src/base/base_entry_point.c | 2 +- src/dbg_engine/dbg_engine.mdesk | 26 +- src/dbg_engine/dbg_engine_core.c | 10 +- src/dbg_engine/dbg_engine_core.h | 250 ++-- src/dbg_engine/dbg_engine_ctrl.c | 1482 ++++++++++---------- src/dbg_engine/dbg_engine_ctrl.h | 439 +++--- src/dbg_engine/dbg_engine_user.c | 290 ++-- src/dbg_engine/dbg_engine_user.h | 236 ++-- src/dbg_engine/generated/dbg_engine.meta.h | 112 +- src/eval/eval_types.c | 4 +- src/raddbg/generated/raddbg.meta.c | 456 +++--- src/raddbg/generated/raddbg.meta.h | 12 +- src/raddbg/raddbg.mdesk | 20 +- src/raddbg/raddbg_core.c | 387 ++--- src/raddbg/raddbg_core.h | 12 +- src/raddbg/raddbg_eval.c | 110 +- src/raddbg/raddbg_main.c | 2 +- src/raddbg/raddbg_views.c | 146 +- src/raddbg/raddbg_views.h | 8 +- src/raddbg/raddbg_widgets.c | 120 +- src/raddbg/raddbg_widgets.h | 4 +- 21 files changed, 1996 insertions(+), 2132 deletions(-) diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index a466e65d..5869281a 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -97,7 +97,7 @@ main_thread_base_entry_point(int arguments_count, char **arguments) U64 lane_broadcast_val = 0; { U64 num_main_threads = 1; -#if defined(CTRL_CORE_H) +#if defined(DBG_ENGINE_CORE_H) num_main_threads += 1; #endif U64 num_async_threads = os_get_system_info()->logical_processor_count; diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 225af11b..1e8491d0 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -93,7 +93,7 @@ D_DevToggleTable: //~ rjf: Entity Kinds @table(name code_name display_string) -CTRL_EntityKindTable: +D_EntityKindTable: { {Root root "Root" } {Machine machine "Machine" } @@ -108,30 +108,30 @@ CTRL_EntityKindTable: {AddressRangeAnnotation address_range_annotation "Address Range Annotation" } } -@enum CTRL_EntityKind: +@enum D_EntityKind: { Null, - @expand(CTRL_EntityKindTable a) `$(a.name)`, + @expand(D_EntityKindTable a) `$(a.name)`, COUNT, } @data(String8) ctrl_entity_kind_code_name_table: { `{0}`, - @expand(CTRL_EntityKindTable a) `str8_lit_comp("$(a.code_name)")` + @expand(D_EntityKindTable a) `str8_lit_comp("$(a.code_name)")` } @data(String8) ctrl_entity_kind_display_string_table: { `{0}`, - @expand(CTRL_EntityKindTable a) `str8_lit_comp("$(a.display_name)")` + @expand(D_EntityKindTable a) `str8_lit_comp("$(a.display_name)")` } //////////////////////////////// //~ rjf: Exception Codes @table(name lower_name code default display_string) -CTRL_ExceptionCodeKindTable: +D_ExceptionCodeKindTable: { {Win32CtrlC win32_ctrl_c 0x40010005 1 "(Win32) Control-C" } {Win32CtrlBreak win32_ctrl_break 0x40010008 1 "(Win32) Control-Break" } @@ -172,42 +172,42 @@ CTRL_ExceptionCodeKindTable: {Win32DirectXDebugLayer win32_directx_debug_layer 0x0000087a 1 "(Win32) DirectX Debug Layer" } } -@enum CTRL_ExceptionCodeKind: +@enum D_ExceptionCodeKind: { Null, - @expand(CTRL_ExceptionCodeKindTable a) `$(a.name)`, + @expand(D_ExceptionCodeKindTable a) `$(a.name)`, COUNT, } @data(U32) ctrl_exception_code_kind_code_table: { `0`; - @expand(CTRL_ExceptionCodeKindTable a) `$(a.code)`; + @expand(D_ExceptionCodeKindTable a) `$(a.code)`; } @data(String8) ctrl_exception_code_kind_display_string_table: { `{0}`; - @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)")`; + @expand(D_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)")`; } @data(String8) ctrl_exception_code_kind_lowercase_code_string_table: { `{0}`; - @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)")`; + @expand(D_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)")`; } @data(B8) ctrl_exception_code_kind_default_enable_table: { `0`; - @expand(CTRL_ExceptionCodeKindTable a) `$(a.default)`; + @expand(D_ExceptionCodeKindTable a) `$(a.default)`; } //////////////////////////////// //~ rjf: Exception Sub-Codes @table(name, value) -CTRL_ExceptionSubCodeKindTable: +DL_ExceptionSubCodeKindTable: { { W32_FAST_FAIL_LEGACY_GS_VIOLATION 0 } { W32_FAST_FAIL_VTGUARD_CHECK_FAILURE 1 } diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index f61aaff8..fd61937d 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -35,18 +35,18 @@ d_init(void) } } d_ctrl_state->thread_reg_cache.slots_count = 1024; - d_ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, d_ctrl_state->thread_reg_cache.slots_count); + d_ctrl_state->thread_reg_cache.slots = push_array(arena, D_ThreadRegCacheSlot, d_ctrl_state->thread_reg_cache.slots_count); d_ctrl_state->thread_reg_cache.stripes_count = os_get_system_info()->logical_processor_count; - d_ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, d_ctrl_state->thread_reg_cache.stripes_count); + d_ctrl_state->thread_reg_cache.stripes = push_array(arena, D_ThreadRegCacheStripe, d_ctrl_state->thread_reg_cache.stripes_count); for(U64 idx = 0; idx < d_ctrl_state->thread_reg_cache.stripes_count; idx += 1) { d_ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); d_ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); } d_ctrl_state->module_image_info_cache.slots_count = 1024; - d_ctrl_state->module_image_info_cache.slots = push_array(arena, CTRL_ModuleImageInfoCacheSlot, d_ctrl_state->module_image_info_cache.slots_count); + d_ctrl_state->module_image_info_cache.slots = push_array(arena, D_ModuleImageInfoCacheSlot, d_ctrl_state->module_image_info_cache.slots_count); d_ctrl_state->module_image_info_cache.stripes_count = os_get_system_info()->logical_processor_count; - d_ctrl_state->module_image_info_cache.stripes = push_array(arena, CTRL_ModuleImageInfoCacheStripe, d_ctrl_state->module_image_info_cache.stripes_count); + d_ctrl_state->module_image_info_cache.stripes = push_array(arena, D_ModuleImageInfoCacheStripe, d_ctrl_state->module_image_info_cache.stripes_count); for(U64 idx = 0; idx < d_ctrl_state->module_image_info_cache.stripes_count; idx += 1) { d_ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc(); @@ -77,7 +77,7 @@ d_init(void) d_ctrl_state->dmn_event_arena = arena_alloc(); d_ctrl_state->user_entry_point_arena = arena_alloc(); d_ctrl_state->dbg_dir_arena = arena_alloc(); - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + for(D_ExceptionCodeKind k = (D_ExceptionCodeKind)0; k < D_ExceptionCodeKind_COUNT; k = (D_ExceptionCodeKind)(k+1)) { if(ctrl_exception_code_kind_default_enable_table[k]) { diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index c133cf57..f64f6e50 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -7,40 +7,40 @@ //////////////////////////////// //~ rjf: ID Types -typedef U64 CTRL_MsgID; -typedef U64 CTRL_MachineID; +typedef U64 D_MsgID; +typedef U64 D_MachineID; -#define CTRL_MachineID_Local (1) +#define D_MachineID_Local (1) //////////////////////////////// //~ rjf: Entity Handle Types -typedef struct CTRL_Handle CTRL_Handle; -struct CTRL_Handle +typedef struct D_Handle D_Handle; +struct D_Handle { - CTRL_MachineID machine_id; + D_MachineID machine_id; DMN_Handle dmn_handle; }; -typedef struct CTRL_HandleNode CTRL_HandleNode; -struct CTRL_HandleNode +typedef struct D_HandleNode D_HandleNode; +struct D_HandleNode { - CTRL_HandleNode *next; - CTRL_Handle v; + D_HandleNode *next; + D_Handle v; }; -typedef struct CTRL_HandleList CTRL_HandleList; -struct CTRL_HandleList +typedef struct D_HandleList D_HandleList; +struct D_HandleList { - CTRL_HandleNode *first; - CTRL_HandleNode *last; + D_HandleNode *first; + D_HandleNode *last; U64 count; }; -typedef struct CTRL_HandleArray CTRL_HandleArray; -struct CTRL_HandleArray +typedef struct D_HandleArray D_HandleArray; +struct D_HandleArray { - CTRL_Handle *v; + D_Handle *v; U64 count; }; @@ -52,12 +52,12 @@ struct CTRL_HandleArray //////////////////////////////// //~ rjf: User Breakpoint Types -typedef U32 CTRL_UserBreakpointFlags; +typedef U32 D_BreakpointFlags; enum { - CTRL_UserBreakpointFlag_BreakOnWrite = (1<<0), - CTRL_UserBreakpointFlag_BreakOnRead = (1<<1), - CTRL_UserBreakpointFlag_BreakOnExecute = (1<<2), + D_BreakpointFlag_BreakOnWrite = (1<<0), + D_BreakpointFlag_BreakOnRead = (1<<1), + D_BreakpointFlag_BreakOnExecute = (1<<2), }; typedef enum CTRL_UserBreakpointKind @@ -73,7 +73,7 @@ typedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint; struct CTRL_UserBreakpoint { CTRL_UserBreakpointKind kind; - CTRL_UserBreakpointFlags flags; + D_BreakpointFlags flags; U64 id; String8 string; TxtPt pt; @@ -99,86 +99,86 @@ struct CTRL_UserBreakpointList //////////////////////////////// //~ Dynamic Linker Types -typedef U32 CTRL_TlsModel; +typedef U32 D_TlsModel; enum { - CTRL_TlsModel_Null, - CTRL_TlsModel_WinodwsNt, - CTRL_TlsModel_Gnu + D_TlsModel_Null, + D_TlsModel_WinodwsNt, + D_TlsModel_Gnu }; //////////////////////////////// //~ rjf: Entity Types -typedef struct CTRL_Entity CTRL_Entity; -struct CTRL_Entity +typedef struct D_Entity D_Entity; +struct D_Entity { - CTRL_Entity *first; - CTRL_Entity *last; - CTRL_Entity *next; - CTRL_Entity *prev; - CTRL_Entity *parent; - CTRL_EntityKind kind; + D_Entity *first; + D_Entity *last; + D_Entity *next; + D_Entity *prev; + D_Entity *parent; + D_EntityKind kind; Arch arch; B32 is_frozen; B32 is_soloed; U32 rgba; - CTRL_Handle handle; + D_Handle handle; U64 id; Rng1U64 vaddr_range; U64 stack_base; U64 timestamp; - CTRL_UserBreakpointFlags bp_flags; + D_BreakpointFlags bp_flags; String8 string; - CTRL_TlsModel tls_model; + D_TlsModel tls_model; U64 tls_index; U64 tls_offset; OperatingSystem target_os; }; -typedef struct CTRL_EntityNode CTRL_EntityNode; -struct CTRL_EntityNode +typedef struct D_EntityNode D_EntityNode; +struct D_EntityNode { - CTRL_EntityNode *next; - CTRL_Entity *v; + D_EntityNode *next; + D_Entity *v; }; -typedef struct CTRL_EntityList CTRL_EntityList; -struct CTRL_EntityList +typedef struct D_EntityList D_EntityList; +struct D_EntityList { - CTRL_EntityNode *first; - CTRL_EntityNode *last; + D_EntityNode *first; + D_EntityNode *last; U64 count; }; -typedef struct CTRL_EntityArray CTRL_EntityArray; -struct CTRL_EntityArray +typedef struct D_EntityArray D_EntityArray; +struct D_EntityArray { - CTRL_Entity **v; + D_Entity **v; U64 count; }; -typedef struct CTRL_EntityRec CTRL_EntityRec; -struct CTRL_EntityRec +typedef struct D_EntityRec D_EntityRec; +struct D_EntityRec { - CTRL_Entity *next; + D_Entity *next; S32 push_count; S64 pop_count; }; -typedef struct CTRL_EntityHashNode CTRL_EntityHashNode; -struct CTRL_EntityHashNode +typedef struct D_EntityHashNode D_EntityHashNode; +struct D_EntityHashNode { - CTRL_EntityHashNode *next; - CTRL_EntityHashNode *prev; - CTRL_Entity *entity; + D_EntityHashNode *next; + D_EntityHashNode *prev; + D_Entity *entity; }; -typedef struct CTRL_EntityHashSlot CTRL_EntityHashSlot; -struct CTRL_EntityHashSlot +typedef struct D_EntityHashSlot D_EntityHashSlot; +struct D_EntityHashSlot { - CTRL_EntityHashNode *first; - CTRL_EntityHashNode *last; + D_EntityHashNode *first; + D_EntityHashNode *last; }; typedef struct CTRL_EntityStringChunkNode CTRL_EntityStringChunkNode; @@ -200,33 +200,33 @@ read_only global U64 ctrl_entity_string_bucket_chunk_sizes[] = 0xffffffffffffffffull, }; -typedef struct CTRL_EntityCtx CTRL_EntityCtx; -struct CTRL_EntityCtx +typedef struct D_EntityCtx D_EntityCtx; +struct D_EntityCtx { - CTRL_Entity *root; + D_Entity *root; U64 hash_slots_count; - CTRL_EntityHashSlot *hash_slots; - U64 entity_kind_counts[CTRL_EntityKind_COUNT]; - U64 entity_kind_alloc_gens[CTRL_EntityKind_COUNT]; + D_EntityHashSlot *hash_slots; + U64 entity_kind_counts[D_EntityKind_COUNT]; + U64 entity_kind_alloc_gens[D_EntityKind_COUNT]; }; -typedef struct CTRL_EntityCtxRWStore CTRL_EntityCtxRWStore; -struct CTRL_EntityCtxRWStore +typedef struct D_EntityCtxRWStore D_EntityCtxRWStore; +struct D_EntityCtxRWStore { Arena *arena; - CTRL_EntityCtx ctx; - CTRL_Entity *free; - CTRL_EntityHashNode *hash_node_free; + D_EntityCtx ctx; + D_Entity *free; + D_EntityHashNode *hash_node_free; CTRL_EntityStringChunkNode *free_string_chunks[ArrayCount(ctrl_entity_string_bucket_chunk_sizes)]; }; -typedef struct CTRL_EntityCtxLookupAccel CTRL_EntityCtxLookupAccel; -struct CTRL_EntityCtxLookupAccel +typedef struct D_EntityCtxLookupAccel D_EntityCtxLookupAccel; +struct D_EntityCtxLookupAccel { Arena *arena; - Arena *entity_kind_arrays_arenas[CTRL_EntityKind_COUNT]; - CTRL_EntityArray entity_kind_arrays[CTRL_EntityKind_COUNT]; - U64 entity_kind_arrays_gens[CTRL_EntityKind_COUNT]; + Arena *entity_kind_arrays_arenas[D_EntityKind_COUNT]; + D_EntityArray entity_kind_arrays[D_EntityKind_COUNT]; + U64 entity_kind_arrays_gens[D_EntityKind_COUNT]; }; //////////////////////////////// @@ -253,14 +253,6 @@ struct D_TargetArray U64 count; }; -typedef U32 D_BreakpointFlags; -enum -{ - D_BreakpointFlag_BreakOnWrite = (1<<0), - D_BreakpointFlag_BreakOnRead = (1<<1), - D_BreakpointFlag_BreakOnExecute = (1<<2), -}; - typedef struct D_Breakpoint D_Breakpoint; struct D_Breakpoint { @@ -294,93 +286,43 @@ struct D_PathMapArray U64 count; }; -//////////////////////////////// -//~ rjf: Tick Output Types - -typedef enum D_EventKind -{ - D_EventKind_Null, - D_EventKind_ModuleLoad, - D_EventKind_ProcessEnd, - D_EventKind_Stop, - D_EventKind_COUNT -} -D_EventKind; - -typedef enum D_EventCause -{ - D_EventCause_Null, - D_EventCause_UserBreakpoint, - D_EventCause_Halt, - D_EventCause_SoftHalt, - D_EventCause_COUNT -} -D_EventCause; - -typedef struct D_Event D_Event; -struct D_Event -{ - D_EventKind kind; - D_EventCause cause; - CTRL_Handle module; - CTRL_Handle thread; - U64 vaddr; - U64 code; - U64 id; -}; - -typedef struct D_EventNode D_EventNode; -struct D_EventNode -{ - D_EventNode *next; - D_Event v; -}; - -typedef struct D_EventList D_EventList; -struct D_EventList -{ - D_EventNode *first; - D_EventNode *last; - U64 count; -}; - //////////////////////////////// //~ rjf: Trap Types -typedef U32 CTRL_TrapFlags; +typedef U32 D_TrapFlags; enum { - CTRL_TrapFlag_IgnoreStackPointerCheck = (1<<0), - CTRL_TrapFlag_SingleStepAfterHit = (1<<1), - CTRL_TrapFlag_SaveStackPointer = (1<<2), - CTRL_TrapFlag_BeginSpoofMode = (1<<3), - CTRL_TrapFlag_EndStepping = (1<<4), + D_TrapFlag_IgnoreStackPointerCheck = (1<<0), + D_TrapFlag_SingleStepAfterHit = (1<<1), + D_TrapFlag_SaveStackPointer = (1<<2), + D_TrapFlag_BeginSpoofMode = (1<<3), + D_TrapFlag_EndStepping = (1<<4), }; -typedef struct CTRL_Trap CTRL_Trap; -struct CTRL_Trap +typedef struct D_Trap D_Trap; +struct D_Trap { - CTRL_TrapFlags flags; + D_TrapFlags flags; U64 vaddr; }; -typedef struct CTRL_TrapNode CTRL_TrapNode; -struct CTRL_TrapNode +typedef struct D_TrapNode D_TrapNode; +struct D_TrapNode { - CTRL_TrapNode *next; - CTRL_Trap v; + D_TrapNode *next; + D_Trap v; }; -typedef struct CTRL_TrapList CTRL_TrapList; -struct CTRL_TrapList +typedef struct D_TrapList D_TrapList; +struct D_TrapList { - CTRL_TrapNode *first; - CTRL_TrapNode *last; + D_TrapNode *first; + D_TrapNode *last; U64 count; }; -typedef struct CTRL_Spoof CTRL_Spoof; -struct CTRL_Spoof +typedef struct D_Spoof D_Spoof; +struct D_Spoof { DMN_Handle process; DMN_Handle thread; @@ -394,7 +336,7 @@ struct CTRL_Spoof typedef struct D_TrapNet D_TrapNet; struct D_TrapNet { - CTRL_TrapList traps; + D_TrapList traps; B32 good_line_info; B32 good_read; }; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 1f046cb2..c6608ec3 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -18,110 +18,110 @@ ctrl_hash_from_string(String8 string) } internal U64 -ctrl_hash_from_handle(CTRL_Handle handle) +ctrl_hash_from_handle(D_Handle handle) { U64 buf[] = {handle.machine_id, handle.dmn_handle.u64[0]}; U64 hash = ctrl_hash_from_string(str8((U8 *)buf, sizeof(buf))); return hash; } -internal CTRL_EventCause +internal D_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) { - CTRL_EventCause cause = CTRL_EventCause_Null; + D_EventCause cause = D_EventCause_Null; switch(event_kind) { default:{}break; - case DMN_EventKind_Error: {cause = CTRL_EventCause_Error;}break; - case DMN_EventKind_Exception:{cause = CTRL_EventCause_InterruptedByException;}break; - case DMN_EventKind_Trap: {cause = CTRL_EventCause_InterruptedByTrap;}break; - case DMN_EventKind_Halt: {cause = CTRL_EventCause_InterruptedByHalt;}break; + case DMN_EventKind_Error: {cause = D_EventCause_Error;}break; + case DMN_EventKind_Exception:{cause = D_EventCause_InterruptedByException;}break; + case DMN_EventKind_Trap: {cause = D_EventCause_InterruptedByTrap;}break; + case DMN_EventKind_Halt: {cause = D_EventCause_InterruptedByHalt;}break; } return cause; } -internal CTRL_ExceptionKind +internal D_ExceptionKind ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind) { - CTRL_ExceptionKind result = CTRL_ExceptionKind_Null; + D_ExceptionKind result = D_ExceptionKind_Null; switch(kind) { default:{}break; - case DMN_ExceptionKind_MemoryRead: {result = CTRL_ExceptionKind_MemoryRead;}break; - case DMN_ExceptionKind_MemoryWrite: {result = CTRL_ExceptionKind_MemoryWrite;}break; - case DMN_ExceptionKind_MemoryExecute: {result = CTRL_ExceptionKind_MemoryExecute;}break; - case DMN_ExceptionKind_CppThrow: {result = CTRL_ExceptionKind_CppThrow;}break; + case DMN_ExceptionKind_MemoryRead: {result = D_ExceptionKind_MemoryRead;}break; + case DMN_ExceptionKind_MemoryWrite: {result = D_ExceptionKind_MemoryWrite;}break; + case DMN_ExceptionKind_MemoryExecute: {result = D_ExceptionKind_MemoryExecute;}break; + case DMN_ExceptionKind_CppThrow: {result = D_ExceptionKind_CppThrow;}break; } return result; } -internal CTRL_TlsModel +internal D_TlsModel ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type) { - CTRL_TlsModel result = CTRL_TlsModel_Null; + D_TlsModel result = D_TlsModel_Null; switch(type) { default:{}break; - case DMN_TlsModel_Null: {result = CTRL_TlsModel_Null;}break; - case DMN_TlsModel_WinodwsNt: {result = CTRL_TlsModel_WinodwsNt;}break; - case DMN_TlsModel_Gnu: {result = CTRL_TlsModel_Gnu;}break; + case DMN_TlsModel_Null: {result = D_TlsModel_Null;}break; + case DMN_TlsModel_WinodwsNt: {result = D_TlsModel_WinodwsNt;}break; + case DMN_TlsModel_Gnu: {result = D_TlsModel_Gnu;}break; } return result; } internal String8 -ctrl_string_from_event_kind(CTRL_EventKind kind) +ctrl_string_from_event_kind(D_EventKind kind) { String8 result = {0}; switch(kind) { default:{}break; - case CTRL_EventKind_Null: { result = str8_lit("Null");}break; - case CTRL_EventKind_Error: { result = str8_lit("Error");}break; - case CTRL_EventKind_Started: { result = str8_lit("Started");}break; - case CTRL_EventKind_Stopped: { result = str8_lit("Stopped");}break; - case CTRL_EventKind_NewProc: { result = str8_lit("NewProc");}break; - case CTRL_EventKind_NewThread: { result = str8_lit("NewThread");}break; - case CTRL_EventKind_NewModule: { result = str8_lit("NewModule");}break; - case CTRL_EventKind_EndProc: { result = str8_lit("EndProc");}break; - case CTRL_EventKind_EndThread: { result = str8_lit("EndThread");}break; - case CTRL_EventKind_EndModule: { result = str8_lit("EndModule");}break; - case CTRL_EventKind_ModuleDebugInfoPathChange: { result = str8_lit("ModuleDebugInfoPathChange");}break; - case CTRL_EventKind_DebugString: { result = str8_lit("DebugString");}break; - case CTRL_EventKind_ThreadName: { result = str8_lit("ThreadName");}break; - case CTRL_EventKind_MemReserve: { result = str8_lit("MemReserve");}break; - case CTRL_EventKind_MemCommit: { result = str8_lit("MemCommit");}break; - case CTRL_EventKind_MemDecommit: { result = str8_lit("MemDecommit");}break; - case CTRL_EventKind_MemRelease: { result = str8_lit("MemRelease");}break; + case D_EventKind_Null: { result = str8_lit("Null");}break; + case D_EventKind_Error: { result = str8_lit("Error");}break; + case D_EventKind_Started: { result = str8_lit("Started");}break; + case D_EventKind_Stopped: { result = str8_lit("Stopped");}break; + case D_EventKind_NewProc: { result = str8_lit("NewProc");}break; + case D_EventKind_NewThread: { result = str8_lit("NewThread");}break; + case D_EventKind_NewModule: { result = str8_lit("NewModule");}break; + case D_EventKind_EndProc: { result = str8_lit("EndProc");}break; + case D_EventKind_EndThread: { result = str8_lit("EndThread");}break; + case D_EventKind_EndModule: { result = str8_lit("EndModule");}break; + case D_EventKind_ModuleDebugInfoPathChange: { result = str8_lit("ModuleDebugInfoPathChange");}break; + case D_EventKind_DebugString: { result = str8_lit("DebugString");}break; + case D_EventKind_ThreadName: { result = str8_lit("ThreadName");}break; + case D_EventKind_MemReserve: { result = str8_lit("MemReserve");}break; + case D_EventKind_MemCommit: { result = str8_lit("MemCommit");}break; + case D_EventKind_MemDecommit: { result = str8_lit("MemDecommit");}break; + case D_EventKind_MemRelease: { result = str8_lit("MemRelease");}break; } return result; } internal String8 -ctrl_string_from_msg_kind(CTRL_MsgKind kind) +ctrl_string_from_msg_kind(D_MsgKind kind) { String8 result = {0}; switch(kind) { default:{}break; - case CTRL_MsgKind_Launch: {result = str8_lit("Launch");}break; - case CTRL_MsgKind_Attach: {result = str8_lit("Attach");}break; - case CTRL_MsgKind_Kill: {result = str8_lit("Kill");}break; - case CTRL_MsgKind_KillAll: {result = str8_lit("KillAll");}break; - case CTRL_MsgKind_Detach: {result = str8_lit("Detach");}break; - case CTRL_MsgKind_Run: {result = str8_lit("Run");}break; - case CTRL_MsgKind_SingleStep: {result = str8_lit("SingleStep");}break; - case CTRL_MsgKind_SetUserEntryPoints: {result = str8_lit("SetUserEntryPoints");}break; - case CTRL_MsgKind_SetModuleDebugInfoPath: {result = str8_lit("SetModuleDebugInfoPath");}break; + case D_MsgKind_Launch: {result = str8_lit("Launch");}break; + case D_MsgKind_Attach: {result = str8_lit("Attach");}break; + case D_MsgKind_Kill: {result = str8_lit("Kill");}break; + case D_MsgKind_KillAll: {result = str8_lit("KillAll");}break; + case D_MsgKind_Detach: {result = str8_lit("Detach");}break; + case D_MsgKind_Run: {result = str8_lit("Run");}break; + case D_MsgKind_SingleStep: {result = str8_lit("SingleStep");}break; + case D_MsgKind_SetUserEntryPoints: {result = str8_lit("SetUserEntryPoints");}break; + case D_MsgKind_SetModuleDebugInfoPath: {result = str8_lit("SetModuleDebugInfoPath");}break; } return result; } -internal CTRL_EntityKind +internal D_EntityKind ctrl_entity_kind_from_string(String8 string) { - CTRL_EntityKind result = CTRL_EntityKind_Null; - for EachNonZeroEnumVal(CTRL_EntityKind, k) + D_EntityKind result = D_EntityKind_Null; + for EachNonZeroEnumVal(D_EntityKind, k) { if(str8_match(ctrl_entity_kind_code_name_table[k], string, 0)) { @@ -133,44 +133,44 @@ ctrl_entity_kind_from_string(String8 string) } internal DMN_TrapFlags -ctrl_dmn_trap_flags_from_user_breakpoint_flags(CTRL_UserBreakpointFlags flags) +ctrl_dmn_trap_flags_from_user_breakpoint_flags(D_BreakpointFlags flags) { DMN_TrapFlags result = 0; - if(flags & CTRL_UserBreakpointFlag_BreakOnWrite) { result |= DMN_TrapFlag_BreakOnWrite; } - if(flags & CTRL_UserBreakpointFlag_BreakOnRead) { result |= DMN_TrapFlag_BreakOnRead; } - if(flags & CTRL_UserBreakpointFlag_BreakOnExecute) { result |= DMN_TrapFlag_BreakOnExecute; } + if(flags & D_BreakpointFlag_BreakOnWrite) { result |= DMN_TrapFlag_BreakOnWrite; } + if(flags & D_BreakpointFlag_BreakOnRead) { result |= DMN_TrapFlag_BreakOnRead; } + if(flags & D_BreakpointFlag_BreakOnExecute) { result |= DMN_TrapFlag_BreakOnExecute; } return result; } -internal CTRL_UserBreakpointFlags +internal D_BreakpointFlags ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags) { - CTRL_UserBreakpointFlags result = 0; - if(flags & DMN_TrapFlag_BreakOnWrite) { result |= CTRL_UserBreakpointFlag_BreakOnWrite; } - if(flags & DMN_TrapFlag_BreakOnRead) { result |= CTRL_UserBreakpointFlag_BreakOnRead; } - if(flags & DMN_TrapFlag_BreakOnExecute) { result |= CTRL_UserBreakpointFlag_BreakOnExecute; } + D_BreakpointFlags result = 0; + if(flags & DMN_TrapFlag_BreakOnWrite) { result |= D_BreakpointFlag_BreakOnWrite; } + if(flags & DMN_TrapFlag_BreakOnRead) { result |= D_BreakpointFlag_BreakOnRead; } + if(flags & DMN_TrapFlag_BreakOnExecute) { result |= D_BreakpointFlag_BreakOnExecute; } return result; } //////////////////////////////// //~ rjf: Machine/Handle Pair Type Functions -internal CTRL_Handle +internal D_Handle ctrl_handle_zero(void) { - CTRL_Handle handle = {0}; + D_Handle handle = {0}; return handle; } -internal CTRL_Handle -ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle) +internal D_Handle +ctrl_handle_make(D_MachineID machine_id, DMN_Handle dmn_handle) { - CTRL_Handle handle = {machine_id, dmn_handle}; + D_Handle handle = {machine_id, dmn_handle}; return handle; } internal B32 -ctrl_handle_match(CTRL_Handle a, CTRL_Handle b) +ctrl_handle_match(D_Handle a, D_Handle b) { B32 result = (a.machine_id == b.machine_id && dmn_handle_match(a.dmn_handle, b.dmn_handle)); @@ -178,34 +178,34 @@ ctrl_handle_match(CTRL_Handle a, CTRL_Handle b) } internal void -ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair) +ctrl_handle_list_push(Arena *arena, D_HandleList *list, D_Handle *pair) { - CTRL_HandleNode *n = push_array(arena, CTRL_HandleNode, 1); + D_HandleNode *n = push_array(arena, D_HandleNode, 1); MemoryCopyStruct(&n->v, pair); SLLQueuePush(list->first, list->last, n); list->count += 1; } -internal CTRL_HandleList -ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src) +internal D_HandleList +ctrl_handle_list_copy(Arena *arena, D_HandleList *src) { - CTRL_HandleList dst = {0}; - for(CTRL_HandleNode *n = src->first; n != 0; n = n->next) + D_HandleList dst = {0}; + for(D_HandleNode *n = src->first; n != 0; n = n->next) { ctrl_handle_list_push(arena, &dst, &n->v); } return dst; } -internal CTRL_HandleArray -ctrl_handle_array_from_list(Arena *arena, CTRL_HandleList *src) +internal D_HandleArray +ctrl_handle_array_from_list(Arena *arena, D_HandleList *src) { - CTRL_HandleArray array = {0}; + D_HandleArray array = {0}; array.count = src->count; - array.v = push_array_no_zero(arena, CTRL_Handle, array.count); + array.v = push_array_no_zero(arena, D_Handle, array.count); { U64 idx = 0; - for(CTRL_HandleNode *n = src->first; n != 0; n = n->next, idx += 1) + for(D_HandleNode *n = src->first; n != 0; n = n->next, idx += 1) { array.v[idx] = n->v; } @@ -214,23 +214,23 @@ ctrl_handle_array_from_list(Arena *arena, CTRL_HandleList *src) } internal String8 -ctrl_string_from_handle(Arena *arena, CTRL_Handle handle) +ctrl_string_from_handle(Arena *arena, D_Handle handle) { String8 result = push_str8f(arena, "$%I64x$%I64x", handle.machine_id, handle.dmn_handle.u64[0]); return result; } -internal CTRL_Handle +internal D_Handle ctrl_handle_from_string(String8 string) { - CTRL_Handle handle = {0}; + D_Handle handle = {0}; { Temp scratch = scratch_begin(0, 0); U8 split = '$'; String8List parts = str8_split(scratch.arena, string, &split, 1, 0); if(parts.first && parts.first->next) { - CTRL_MachineID machine_id = u64_from_str8(parts.first->string, 16); + D_MachineID machine_id = u64_from_str8(parts.first->string, 16); DMN_Handle dmn_handle = {0}; dmn_handle.u64[0] = u64_from_str8(parts.first->next->string, 16); handle.machine_id = machine_id; @@ -245,19 +245,19 @@ ctrl_handle_from_string(String8 string) //~ rjf: Trap Type Functions internal void -ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap) +ctrl_trap_list_push(Arena *arena, D_TrapList *list, D_Trap *trap) { - CTRL_TrapNode *node = push_array(arena, CTRL_TrapNode, 1); + D_TrapNode *node = push_array(arena, D_TrapNode, 1); MemoryCopyStruct(&node->v, trap); SLLQueuePush(list->first, list->last, node); list->count += 1; } -internal CTRL_TrapList -ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src) +internal D_TrapList +ctrl_trap_list_copy(Arena *arena, D_TrapList *src) { - CTRL_TrapList dst = {0}; - for(CTRL_TrapNode *src_n = src->first; src_n != 0; src_n = src_n->next) + D_TrapList dst = {0}; + for(D_TrapNode *src_n = src->first; src_n != 0; src_n = src_n->next) { ctrl_trap_list_push(arena, &dst, &src_n->v); } @@ -297,7 +297,7 @@ ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src) //- rjf: deep copying internal void -ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src) +ctrl_msg_deep_copy(Arena *arena, D_Msg *dst, D_Msg *src) { MemoryCopyStruct(dst, src); dst->path = push_str8_copy(arena, src->path); @@ -310,31 +310,31 @@ ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src) //- rjf: list building -internal CTRL_Msg * -ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list) +internal D_Msg * +ctrl_msg_list_push(Arena *arena, D_MsgList *list) { - CTRL_MsgNode *n = push_array(arena, CTRL_MsgNode, 1); + D_MsgNode *n = push_array(arena, D_MsgNode, 1); SLLQueuePush(list->first, list->last, n); list->count += 1; - CTRL_Msg *msg = &n->v; + D_Msg *msg = &n->v; return msg; } -internal CTRL_MsgList -ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src) +internal D_MsgList +ctrl_msg_list_deep_copy(Arena *arena, D_MsgList *src) { - CTRL_MsgList dst = {0}; - for(CTRL_MsgNode *n = src->first; n != 0; n = n->next) + D_MsgList dst = {0}; + for(D_MsgNode *n = src->first; n != 0; n = n->next) { - CTRL_Msg *src_msg = &n->v; - CTRL_Msg *dst_msg = ctrl_msg_list_push(arena, &dst); + D_Msg *src_msg = &n->v; + D_Msg *dst_msg = ctrl_msg_list_push(arena, &dst); ctrl_msg_deep_copy(arena, dst_msg, src_msg); } return dst; } internal void -ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src) +ctrl_msg_list_concat_in_place(D_MsgList *dst, D_MsgList *src) { if(dst->last && src->first) { @@ -352,7 +352,7 @@ ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src) //- rjf: serialization internal String8 -ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) +ctrl_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs) { Temp scratch = scratch_begin(&arena, 1); String8List msgs_srlzed = {0}; @@ -362,9 +362,9 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msgs->count); // rjf: write all message data - for(CTRL_MsgNode *msg_n = msgs->first; msg_n != 0; msg_n = msg_n->next) + for(D_MsgNode *msg_n = msgs->first; msg_n != 0; msg_n = msg_n->next) { - CTRL_Msg *msg = &msg_n->v; + D_Msg *msg = &msg_n->v; // rjf: write flat parts str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->kind); @@ -416,9 +416,9 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) // rjf: write trap list str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->traps.count); - for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) + for(D_TrapNode *n = msg->traps.first; n != 0; n = n->next) { - CTRL_Trap *trap = &n->v; + D_Trap *trap = &n->v; str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->flags); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->vaddr); } @@ -445,10 +445,10 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs) return string; } -internal CTRL_MsgList +internal D_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) { - CTRL_MsgList msgs = {0}; + D_MsgList msgs = {0}; { U64 read_off = 0; @@ -460,10 +460,10 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) for(U64 msg_idx = 0; msg_idx < msg_count; msg_idx += 1) { // rjf: construct message - CTRL_MsgNode *msg_node = push_array(arena, CTRL_MsgNode, 1); + D_MsgNode *msg_node = push_array(arena, D_MsgNode, 1); SLLQueuePush(msgs.first, msgs.last, msg_node); msgs.count += 1; - CTRL_Msg *msg = &msg_node->v; + D_Msg *msg = &msg_node->v; // rjf: read flat data read_off += str8_deserial_read_struct(string, read_off, &msg->kind); @@ -534,10 +534,10 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) read_off += str8_deserial_read_struct(string, read_off, &trap_count); for(U64 idx = 0; idx < trap_count; idx += 1) { - CTRL_TrapNode *n = push_array(arena, CTRL_TrapNode, 1); + D_TrapNode *n = push_array(arena, D_TrapNode, 1); SLLQueuePush(msg->traps.first, msg->traps.last, n); msg->traps.count += 1; - CTRL_Trap *trap = &n->v; + D_Trap *trap = &n->v; read_off += str8_deserial_read_struct(string, read_off, &trap->flags); read_off += str8_deserial_read_struct(string, read_off, &trap->vaddr); } @@ -573,18 +573,18 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) //- rjf: list building -internal CTRL_Event * -ctrl_event_list_push(Arena *arena, CTRL_EventList *list) +internal D_Event * +ctrl_event_list_push(Arena *arena, D_EventList *list) { - CTRL_EventNode *n = push_array(arena, CTRL_EventNode, 1); + D_EventNode *n = push_array(arena, D_EventNode, 1); SLLQueuePush(list->first, list->last, n); list->count += 1; - CTRL_Event *event = &n->v; + D_Event *event = &n->v; return event; } internal void -ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push) +ctrl_event_list_concat_in_place(D_EventList *dst, D_EventList *to_push) { if(dst->last == 0) { @@ -602,7 +602,7 @@ ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push) //- rjf: serialization internal String8 -ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max) +ctrl_serialized_string_from_event(Arena *arena, D_Event *event, U64 max) { Temp scratch = scratch_begin(&arena, 1); String8List srl = {0}; @@ -639,10 +639,10 @@ ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max) return string; } -internal CTRL_Event +internal D_Event ctrl_event_from_serialized_string(Arena *arena, String8 string) { - CTRL_Event event = zero_struct; + D_Event event = zero_struct; { U64 read_off = 0; read_off += str8_deserial_read_struct(string, read_off, &event.kind); @@ -679,21 +679,21 @@ ctrl_event_from_serialized_string(Arena *arena, String8 string) //- rjf: entity list data structures internal void -ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity) +ctrl_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity) { - CTRL_EntityNode *n = push_array(arena, CTRL_EntityNode, 1); + D_EntityNode *n = push_array(arena, D_EntityNode, 1); n->v = entity; SLLQueuePush(list->first, list->last, n); list->count += 1; } -internal CTRL_EntityList -ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_HandleList *list) +internal D_EntityList +ctrl_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList *list) { - CTRL_EntityList result = {0}; - for(CTRL_HandleNode *n = list->first; n != 0; n = n->next) + D_EntityList result = {0}; + for(D_HandleNode *n = list->first; n != 0; n = n->next) { - CTRL_Entity *entity = ctrl_entity_from_handle(ctx, n->v); + D_Entity *entity = ctrl_entity_from_handle(ctx, n->v); ctrl_entity_list_push(arena, &result, entity); } return result; @@ -701,14 +701,14 @@ ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle //- rjf: entity array data structure -internal CTRL_EntityArray -ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list) +internal D_EntityArray +ctrl_entity_array_from_list(Arena *arena, D_EntityList *list) { - CTRL_EntityArray result = {0}; + D_EntityArray result = {0}; result.count = list->count; - result.v = push_array_no_zero(arena, CTRL_Entity *, result.count); + result.v = push_array_no_zero(arena, D_Entity *, result.count); U64 idx = 0; - for(CTRL_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) + for(D_EntityNode *n = list->first; n != 0; n = n->next, idx += 1) { result.v[idx] = n->v; } @@ -717,17 +717,17 @@ ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list) //- rjf: entity context (entity group read-only) functions -internal CTRL_Entity * -ctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle) +internal D_Entity * +ctrl_entity_from_handle(D_EntityCtx *ctx, D_Handle handle) { - CTRL_Entity *entity = &ctrl_entity_nil; + D_Entity *entity = &d_entity_nil; if(!ctrl_handle_match(handle, ctrl_handle_zero())) { U64 hash = ctrl_hash_from_handle(handle); U64 slot_idx = hash%ctx->hash_slots_count; - CTRL_EntityHashSlot *slot = &ctx->hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + D_EntityHashSlot *slot = &ctx->hash_slots[slot_idx]; + D_EntityHashNode *node = 0; + for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->entity->handle, handle)) { @@ -739,12 +739,12 @@ ctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle) return entity; } -internal CTRL_Entity * -ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind) +internal D_Entity * +ctrl_entity_child_from_kind(D_Entity *parent, D_EntityKind kind) { - CTRL_Entity *result = &ctrl_entity_nil; - for(CTRL_Entity *child = parent->first; - child != &ctrl_entity_nil; + D_Entity *result = &d_entity_nil; + for(D_Entity *child = parent->first; + child != &d_entity_nil; child = child->next) { if(child->kind == kind) @@ -756,11 +756,11 @@ ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind) return result; } -internal CTRL_Entity * -ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind) +internal D_Entity * +ctrl_entity_ancestor_from_kind(D_Entity *entity, D_EntityKind kind) { - CTRL_Entity *result = &ctrl_entity_nil; - for(CTRL_Entity *p = entity->parent; p != &ctrl_entity_nil; p = p->parent) + D_Entity *result = &d_entity_nil; + for(D_Entity *p = entity->parent; p != &d_entity_nil; p = p->parent) { if(p->kind == kind) { @@ -771,30 +771,30 @@ ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind) return result; } -internal CTRL_Entity * -ctrl_process_from_entity(CTRL_Entity *entity) +internal D_Entity * +ctrl_process_from_entity(D_Entity *entity) { - CTRL_Entity *result = &ctrl_entity_nil; - if(entity->kind == CTRL_EntityKind_Process) + D_Entity *result = &d_entity_nil; + if(entity->kind == D_EntityKind_Process) { result = entity; } else { - result = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + result = ctrl_entity_ancestor_from_kind(entity, D_EntityKind_Process); } return result; } -internal CTRL_Entity * -ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr) +internal D_Entity * +ctrl_module_from_process_vaddr(D_Entity *process, U64 vaddr) { - CTRL_Entity *result = &ctrl_entity_nil; - for(CTRL_Entity *child = process->first; - child != &ctrl_entity_nil; + D_Entity *result = &d_entity_nil; + for(D_Entity *child = process->first; + child != &d_entity_nil; child = child->next) { - if(child->kind == CTRL_EntityKind_Module && contains_1u64(child->vaddr_range, vaddr)) + if(child->kind == D_EntityKind_Module && contains_1u64(child->vaddr_range, vaddr)) { result = child; break; @@ -804,24 +804,24 @@ ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr) } internal DI_Key -ctrl_dbgi_key_from_module(CTRL_Entity *module) +ctrl_dbgi_key_from_module(D_Entity *module) { - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + D_Entity *debug_info_path = ctrl_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); DI_Key dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); return dbgi_key; } -internal CTRL_Entity * -ctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTRL_EntityList *candidates) +internal D_Entity * +ctrl_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityList *candidates) { - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); U64 thread_rip_vaddr = ctrl_rip_from_thread(ctx, thread->handle); - CTRL_Entity *src_module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); - CTRL_Entity *module = &ctrl_entity_nil; - for(CTRL_EntityNode *n = candidates->first; n != 0; n = n->next) + D_Entity *src_module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + D_Entity *module = &d_entity_nil; + for(D_EntityNode *n = candidates->first; n != 0; n = n->next) { - CTRL_Entity *candidate_module = n->v; - CTRL_Entity *candidate_process = ctrl_entity_ancestor_from_kind(candidate_module, CTRL_EntityKind_Process); + D_Entity *candidate_module = n->v; + D_Entity *candidate_process = ctrl_entity_ancestor_from_kind(candidate_module, D_EntityKind_Process); if(candidate_process == process) { module = candidate_module; @@ -835,21 +835,21 @@ ctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTR } internal U64 -ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff) +ctrl_vaddr_from_voff(D_Entity *module, U64 voff) { U64 result = voff + module->vaddr_range.min; return result; } internal U64 -ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr) +ctrl_voff_from_vaddr(D_Entity *module, U64 vaddr) { U64 result = vaddr - module->vaddr_range.min; return result; } internal Rng1U64 -ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range) +ctrl_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_range) { U64 dim = dim_1u64(voff_range); U64 min = ctrl_vaddr_from_voff(module, voff_range.min); @@ -858,7 +858,7 @@ ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range) } internal Rng1U64 -ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range) +ctrl_voff_range_from_vaddr_range(D_Entity *module, Rng1U64 vaddr_range) { U64 dim = dim_1u64(vaddr_range); U64 min = ctrl_voff_from_vaddr(module, vaddr_range.min); @@ -867,12 +867,12 @@ ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range) } internal B32 -ctrl_entity_tree_is_frozen(CTRL_Entity *root) +ctrl_entity_tree_is_frozen(D_Entity *root) { B32 is_frozen = 1; - for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) + for(D_Entity *e = root; e != &d_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) { - if(e->kind == CTRL_EntityKind_Thread && !e->is_frozen) + if(e->kind == D_EntityKind_Thread && !e->is_frozen) { is_frozen = 0; break; @@ -883,16 +883,16 @@ ctrl_entity_tree_is_frozen(CTRL_Entity *root) //- rjf: entity ctx r/w store state functions -internal CTRL_EntityCtxRWStore * +internal D_EntityCtxRWStore * ctrl_entity_ctx_rw_store_alloc(void) { Arena *arena = arena_alloc(); - CTRL_EntityCtxRWStore *store = push_array(arena, CTRL_EntityCtxRWStore, 1); + D_EntityCtxRWStore *store = push_array(arena, D_EntityCtxRWStore, 1); store->arena = arena; store->ctx.hash_slots_count = 1024; - store->ctx.hash_slots = push_array(arena, CTRL_EntityHashSlot, store->ctx.hash_slots_count); - CTRL_Entity *root = store->ctx.root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Arch_Null, ctrl_handle_zero(), 0); - CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, Arch_CURRENT, ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero()), 0); + store->ctx.hash_slots = push_array(arena, D_EntityHashSlot, store->ctx.hash_slots_count); + D_Entity *root = store->ctx.root = ctrl_entity_alloc(store, &d_entity_nil, D_EntityKind_Root, Arch_Null, ctrl_handle_zero(), 0); + D_Entity *local_machine = ctrl_entity_alloc(store, root, D_EntityKind_Machine, Arch_CURRENT, ctrl_handle_make(D_MachineID_Local, dmn_handle_zero()), 0); Temp scratch = scratch_begin(0, 0); String8 local_machine_name = push_str8f(scratch.arena, "This PC (%S)", os_get_system_info()->machine_name); ctrl_entity_equip_string(store, local_machine, local_machine_name); @@ -901,7 +901,7 @@ ctrl_entity_ctx_rw_store_alloc(void) } internal void -ctrl_entity_ctx_rw_store_release(CTRL_EntityCtxRWStore *store) +ctrl_entity_ctx_rw_store_release(D_EntityCtxRWStore *store) { arena_release(store->arena); } @@ -927,7 +927,7 @@ ctrl_name_bucket_num_from_string_size(U64 size) } internal String8 -ctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string) +ctrl_entity_string_alloc(D_EntityCtxRWStore *store, String8 string) { //- rjf: allocate node CTRL_EntityStringChunkNode *node = 0; @@ -993,7 +993,7 @@ ctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string) } internal void -ctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string) +ctrl_entity_string_release(D_EntityCtxRWStore *store, String8 string) { U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size); if(1 <= bucket_num && bucket_num <= ArrayCount(ctrl_entity_string_bucket_chunk_sizes)) @@ -1007,10 +1007,10 @@ ctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string) //- rjf: entity construction/deletion -internal CTRL_Entity * -ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id) +internal D_Entity * +ctrl_entity_alloc(D_EntityCtxRWStore *store, D_Entity *parent, D_EntityKind kind, Arch arch, D_Handle handle, U64 id) { - CTRL_Entity *entity = &ctrl_entity_nil; + D_Entity *entity = &d_entity_nil; { // rjf: allocate entity = store->free; @@ -1021,7 +1021,7 @@ ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_Entity } else { - entity = push_array_no_zero(store->arena, CTRL_Entity, 1); + entity = push_array_no_zero(store->arena, D_Entity, 1); } MemoryZeroStruct(entity); } @@ -1033,10 +1033,10 @@ ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_Entity entity->handle = handle; entity->id = id; entity->parent = parent; - entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil; - if(parent != &ctrl_entity_nil) + entity->next = entity->prev = entity->first = entity->last = &d_entity_nil; + if(parent != &d_entity_nil) { - DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev); + DLLPushBack_NPZ(&d_entity_nil, parent->first, parent->last, entity, next, prev); } } @@ -1044,9 +1044,9 @@ ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_Entity { U64 hash = ctrl_hash_from_handle(handle); U64 slot_idx = hash%store->ctx.hash_slots_count; - CTRL_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + D_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; + D_EntityHashNode *node = 0; + for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->entity->handle, handle)) { @@ -1063,7 +1063,7 @@ ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_Entity } else { - node = push_array_no_zero(store->arena, CTRL_EntityHashNode, 1); + node = push_array_no_zero(store->arena, D_EntityHashNode, 1); } MemoryZeroStruct(node); DLLPushBack(slot->first, slot->last, node); @@ -1079,30 +1079,30 @@ ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_Entity } internal void -ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity) +ctrl_entity_release(D_EntityCtxRWStore *store, D_Entity *entity) { // rjf: unhook root - if(entity->parent != &ctrl_entity_nil) + if(entity->parent != &d_entity_nil) { - DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + DLLRemove_NPZ(&d_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); } // rjf: walk every entity in this tree, free each - if(entity != &ctrl_entity_nil) + if(entity != &d_entity_nil) { Temp scratch = scratch_begin(0, 0); typedef struct Task Task; struct Task { Task *next; - CTRL_Entity *e; + D_Entity *e; }; Task start_task = {0, entity}; Task *first_task = &start_task; Task *last_task = &start_task; for(Task *t = first_task; t != 0; t = t->next) { - for(CTRL_Entity *child = t->e->first; child != &ctrl_entity_nil; child = child->next) + for(D_Entity *child = t->e->first; child != &d_entity_nil; child = child->next) { Task *t = push_array(scratch.arena, Task, 1); t->e = child; @@ -1116,9 +1116,9 @@ ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity) { U64 hash = ctrl_hash_from_handle(t->e->handle); U64 slot_idx = hash%store->ctx.hash_slots_count; - CTRL_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + D_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; + D_EntityHashNode *node = 0; + for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->entity->handle, t->e->handle)) { @@ -1140,7 +1140,7 @@ ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity) //- rjf: entity equipment internal void -ctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, String8 string) +ctrl_entity_equip_string(D_EntityCtxRWStore *store, D_Entity *entity, String8 string) { if(entity->string.size != 0) { @@ -1151,32 +1151,32 @@ ctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, Stri //- rjf: accelerated entity context lookups -internal CTRL_EntityCtxLookupAccel * +internal D_EntityCtxLookupAccel * ctrl_thread_entity_ctx_lookup_accel(void) { - if(ctrl_entity_ctx_lookup_accel == 0) + if(d_entity_ctx_lookup_accel == 0) { Arena *arena = arena_alloc(); - ctrl_entity_ctx_lookup_accel = push_array(arena, CTRL_EntityCtxLookupAccel, 1); - ctrl_entity_ctx_lookup_accel->arena = arena; - for EachEnumVal(CTRL_EntityKind, k) + d_entity_ctx_lookup_accel = push_array(arena, D_EntityCtxLookupAccel, 1); + d_entity_ctx_lookup_accel->arena = arena; + for EachEnumVal(D_EntityKind, k) { - ctrl_entity_ctx_lookup_accel->entity_kind_arrays_arenas[k] = arena_alloc(); + d_entity_ctx_lookup_accel->entity_kind_arrays_arenas[k] = arena_alloc(); } } - return ctrl_entity_ctx_lookup_accel; + return d_entity_ctx_lookup_accel; } -internal CTRL_EntityArray -ctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind) +internal D_EntityArray +ctrl_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind) { - CTRL_EntityCtxLookupAccel *accel = ctrl_thread_entity_ctx_lookup_accel(); + D_EntityCtxLookupAccel *accel = ctrl_thread_entity_ctx_lookup_accel(); if(accel->entity_kind_arrays_gens[kind] != ctx->entity_kind_alloc_gens[kind]) { Temp scratch = scratch_begin(0, 0); - CTRL_EntityList entities = {0}; - for(CTRL_Entity *e = ctx->root; - e != &ctrl_entity_nil; + D_EntityList entities = {0}; + for(D_Entity *e = ctx->root; + e != &d_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, ctx->root).next) { if(e->kind == kind) @@ -1192,14 +1192,14 @@ ctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind) return accel->entity_kind_arrays[kind]; } -internal CTRL_EntityList -ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key) +internal D_EntityList +ctrl_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key) { - CTRL_EntityList list = {0}; - CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Module); + D_EntityList list = {0}; + D_EntityArray all_modules = ctrl_entity_array_from_kind(ctx, D_EntityKind_Module); for EachIndex(idx, all_modules.count) { - CTRL_Entity *module = all_modules.v[idx]; + D_Entity *module = all_modules.v[idx]; DI_Key module_dbgi_key = ctrl_dbgi_key_from_module(module); if(di_key_match(module_dbgi_key, dbgi_key)) { @@ -1209,11 +1209,11 @@ ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key) return list; } -internal CTRL_Entity * -ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id) +internal D_Entity * +ctrl_thread_from_id(D_EntityCtx *ctx, U64 id) { - CTRL_Entity *thread = &ctrl_entity_nil; - CTRL_EntityArray threads = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread); + D_Entity *thread = &d_entity_nil; + D_EntityArray threads = ctrl_entity_array_from_kind(ctx, D_EntityKind_Thread); for EachIndex(idx, threads.count) { if(threads.v[idx]->id == id) @@ -1226,21 +1226,21 @@ ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id) //- rjf: entity tree iteration -internal CTRL_EntityRec -ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off) +internal D_EntityRec +ctrl_entity_rec_depth_first(D_Entity *entity, D_Entity *subtree_root, U64 sib_off, U64 child_off) { - CTRL_EntityRec result = {0}; - result.next = &ctrl_entity_nil; - if((*MemberFromOffset(CTRL_Entity **, entity, child_off)) != &ctrl_entity_nil) + D_EntityRec result = {0}; + result.next = &d_entity_nil; + if((*MemberFromOffset(D_Entity **, entity, child_off)) != &d_entity_nil) { - result.next = *MemberFromOffset(CTRL_Entity **, entity, child_off); + result.next = *MemberFromOffset(D_Entity **, entity, child_off); result.push_count = 1; } - else for(CTRL_Entity *parent = entity; parent != subtree_root && parent != &ctrl_entity_nil; parent = parent->parent) + else for(D_Entity *parent = entity; parent != subtree_root && parent != &d_entity_nil; parent = parent->parent) { - if(parent != subtree_root && (*MemberFromOffset(CTRL_Entity **, parent, sib_off)) != &ctrl_entity_nil) + if(parent != subtree_root && (*MemberFromOffset(D_Entity **, parent, sib_off)) != &d_entity_nil) { - result.next = *MemberFromOffset(CTRL_Entity **, parent, sib_off); + result.next = *MemberFromOffset(D_Entity **, parent, sib_off); break; } result.pop_count += 1; @@ -1251,37 +1251,37 @@ ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 //- rjf: applying events to entity caches internal void -ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list) +ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) { //- rjf: scan events & construct entities - for(CTRL_EventNode *n = list->first; n != 0; n = n->next) + for(D_EventNode *n = list->first; n != 0; n = n->next) { - CTRL_Event *event = &n->v; + D_Event *event = &n->v; switch(event->kind) { default:{}break; //- rjf: processes - case CTRL_EventKind_NewProc: + case D_EventKind_NewProc: { - CTRL_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); - if(machine != &ctrl_entity_nil) + D_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); + if(machine != &d_entity_nil) { - CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); + D_Entity *process = ctrl_entity_alloc(store, machine, D_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); process->tls_model = event->tls_model; process->target_os = event->target_os; } }break; - case CTRL_EventKind_EndProc: + case D_EventKind_EndProc: { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->entity); + D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->entity); ctrl_entity_release(store, process); - for(CTRL_Entity *entry = store->ctx.root->first, *next = &ctrl_entity_nil; - entry != &ctrl_entity_nil; + for(D_Entity *entry = store->ctx.root->first, *next = &d_entity_nil; + entry != &d_entity_nil; entry = next) { next = entry->next; - if(entry->kind == CTRL_EntityKind_EntryPoint && entry->id == process->id) + if(entry->kind == D_EntityKind_EntryPoint && entry->id == process->id) { ctrl_entity_release(store, entry); } @@ -1289,21 +1289,21 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis }break; //- rjf: threads - case CTRL_EventKind_NewThread: + case D_EventKind_NewThread: { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - if(process != &ctrl_entity_nil) + D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + if(process != &d_entity_nil) { - CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); - CTRL_Entity *first_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); + D_Entity *thread = ctrl_entity_alloc(store, process, D_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); + D_Entity *first_thread = ctrl_entity_child_from_kind(process, D_EntityKind_Thread); if(first_thread == thread) { ctrl_entity_equip_string(store, thread, str8_lit("main_thread")); } - CTRL_EntityArray pending_thread_names = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadName); + D_EntityArray pending_thread_names = ctrl_entity_array_from_kind(&store->ctx, D_EntityKind_PendingThreadName); for EachIndex(idx, pending_thread_names.count) { - CTRL_Entity *entity = pending_thread_names.v[idx]; + D_Entity *entity = pending_thread_names.v[idx]; if(entity->id == event->entity_id) { ctrl_entity_equip_string(store, thread, entity->string); @@ -1311,10 +1311,10 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis break; } } - CTRL_EntityArray pending_thread_colors = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadColor); + D_EntityArray pending_thread_colors = ctrl_entity_array_from_kind(&store->ctx, D_EntityKind_PendingThreadColor); for EachIndex(idx, pending_thread_colors.count) { - CTRL_Entity *entity = pending_thread_colors.v[idx]; + D_Entity *entity = pending_thread_colors.v[idx]; if(entity->id == event->entity_id) { thread->rgba = entity->rgba; @@ -1326,15 +1326,15 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis } //ctrl_rip_from_thread(&store->ctx, event->entity); }break; - case CTRL_EventKind_EndThread: + case D_EventKind_EndThread: { - CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); + D_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); ctrl_entity_release(store, thread); }break; - case CTRL_EventKind_ThreadName: + case D_EventKind_ThreadName: { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *thread = &ctrl_entity_nil; + D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *thread = &d_entity_nil; if(event->entity_id == 0) { thread = ctrl_entity_from_handle(&store->ctx, event->entity); @@ -1343,20 +1343,20 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis { thread = ctrl_thread_from_id(&store->ctx, event->entity_id); } - if(thread != &ctrl_entity_nil) + if(thread != &d_entity_nil) { ctrl_entity_equip_string(store, thread, event->string); } - else if(process != &ctrl_entity_nil) + else if(process != &d_entity_nil) { - CTRL_Entity *pending_name = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadName, Arch_Null, ctrl_handle_zero(), event->entity_id); + D_Entity *pending_name = ctrl_entity_alloc(store, process, D_EntityKind_PendingThreadName, Arch_Null, ctrl_handle_zero(), event->entity_id); ctrl_entity_equip_string(store, pending_name, event->string); } }break; - case CTRL_EventKind_ThreadColor: + case D_EventKind_ThreadColor: { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *thread = &ctrl_entity_nil; + D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *thread = &d_entity_nil; if(event->entity_id == 0) { thread = ctrl_entity_from_handle(&store->ctx, event->entity); @@ -1365,64 +1365,64 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis { thread = ctrl_thread_from_id(&store->ctx, event->entity_id); } - if(thread != &ctrl_entity_nil) + if(thread != &d_entity_nil) { thread->rgba = event->rgba; } - else if(process != &ctrl_entity_nil) + else if(process != &d_entity_nil) { - CTRL_Entity *pending = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadColor, Arch_Null, ctrl_handle_zero(), event->entity_id); + D_Entity *pending = ctrl_entity_alloc(store, process, D_EntityKind_PendingThreadColor, Arch_Null, ctrl_handle_zero(), event->entity_id); pending->rgba = event->rgba; } }break; - case CTRL_EventKind_ThreadFrozen: + case D_EventKind_ThreadFrozen: { - CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); - if(thread != &ctrl_entity_nil) + D_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); + if(thread != &d_entity_nil) { thread->is_frozen = 1; } }break; - case CTRL_EventKind_ThreadThawed: + case D_EventKind_ThreadThawed: { - CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); - if(thread != &ctrl_entity_nil) + D_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); + if(thread != &d_entity_nil) { thread->is_frozen = 0; } }break; //- rjf: modules - case CTRL_EventKind_NewModule: + case D_EventKind_NewModule: { Temp scratch = scratch_begin(0, 0); - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min); + D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *module = ctrl_entity_alloc(store, process, D_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min); ctrl_entity_equip_string(store, module, event->string); module->timestamp = event->timestamp; module->vaddr_range = event->vaddr_rng; module->tls_index = event->tls_index; module->tls_offset = event->tls_offset; - CTRL_Entity *first_module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module); + D_Entity *first_module = ctrl_entity_child_from_kind(process, D_EntityKind_Module); if(first_module == module) { ctrl_entity_equip_string(store, process, str8_skip_last_slash(event->string)); } scratch_end(scratch); }break; - case CTRL_EventKind_EndModule: + case D_EventKind_EndModule: { - CTRL_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); + D_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); ctrl_entity_release(store, module); }break; - case CTRL_EventKind_ModuleDebugInfoPathChange: + case D_EventKind_ModuleDebugInfoPathChange: { Temp scratch = scratch_begin(0, 0); - CTRL_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); - if(debug_info_path == &ctrl_entity_nil) + D_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); + D_Entity *debug_info_path = ctrl_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); + if(debug_info_path == &d_entity_nil) { - debug_info_path = ctrl_entity_alloc(store, module, CTRL_EntityKind_DebugInfoPath, Arch_Null, ctrl_handle_zero(), 0); + debug_info_path = ctrl_entity_alloc(store, module, D_EntityKind_DebugInfoPath, Arch_Null, ctrl_handle_zero(), 0); } ctrl_entity_equip_string(store, debug_info_path, path_normalized_from_string(scratch.arena, event->string)); debug_info_path->timestamp = event->timestamp; @@ -1430,19 +1430,19 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis }break; //- rjf: dynamic, program-created breakpoints - case CTRL_EventKind_SetBreakpoint: + case D_EventKind_SetBreakpoint: { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *bp = ctrl_entity_alloc(store, process, CTRL_EntityKind_Breakpoint, Arch_Null, ctrl_handle_zero(), 0); + D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *bp = ctrl_entity_alloc(store, process, D_EntityKind_Breakpoint, Arch_Null, ctrl_handle_zero(), 0); bp->vaddr_range = event->vaddr_rng; bp->bp_flags = event->bp_flags; }break; - case CTRL_EventKind_UnsetBreakpoint: + case D_EventKind_UnsetBreakpoint: { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { - if(child->kind == CTRL_EntityKind_Breakpoint && + if(child->kind == D_EntityKind_Breakpoint && child->vaddr_range.min == event->vaddr_rng.min && child->vaddr_range.max == event->vaddr_rng.max && child->bp_flags == event->bp_flags) @@ -1454,10 +1454,10 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis }break; //- rjf: address range annotations - case CTRL_EventKind_SetVAddrRangeNote: + case D_EventKind_SetVAddrRangeNote: { - CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - CTRL_Entity *annotation = ctrl_entity_alloc(store, process, CTRL_EntityKind_AddressRangeAnnotation, Arch_Null, ctrl_handle_zero(), 0); + D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *annotation = ctrl_entity_alloc(store, process, D_EntityKind_AddressRangeAnnotation, Arch_Null, ctrl_handle_zero(), 0); annotation->vaddr_range = event->vaddr_rng; ctrl_entity_equip_string(store, annotation, event->string); }break; @@ -1469,7 +1469,7 @@ ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *lis //~ rjf: Wakeup Callback Registration internal void -ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) +ctrl_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook) { d_ctrl_state->wakeup_hook = wakeup_hook; } @@ -1480,23 +1480,23 @@ ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook) //- rjf: thread register cache reading internal void * -ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle) +ctrl_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) { - CTRL_ThreadRegCache *cache = &d_ctrl_state->thread_reg_cache; - CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + D_ThreadRegCache *cache = &d_ctrl_state->thread_reg_cache; + D_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; U64 reg_block_size = regs_block_size_from_arch(arch); U64 hash = ctrl_hash_from_handle(handle); U64 slot_idx = hash%cache->slots_count; U64 stripe_idx = slot_idx%cache->stripes_count; - CTRL_ThreadRegCacheSlot *slot = &cache->slots[slot_idx]; - CTRL_ThreadRegCacheStripe *stripe = &cache->stripes[stripe_idx]; + D_ThreadRegCacheSlot *slot = &cache->slots[slot_idx]; + D_ThreadRegCacheStripe *stripe = &cache->stripes[stripe_idx]; void *result = push_array(arena, U8, reg_block_size); MutexScopeW(stripe->rw_mutex) { // rjf: find existing node - CTRL_ThreadRegCacheNode *node = 0; - for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) + D_ThreadRegCacheNode *node = 0; + for(D_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->handle, handle)) { @@ -1508,7 +1508,7 @@ ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle // rjf: allocate existing node if(!node) { - node = push_array(stripe->arena, CTRL_ThreadRegCacheNode, 1); + node = push_array(stripe->arena, D_ThreadRegCacheNode, 1); DLLPushBack(slot->first, slot->last, node); node->handle = handle; node->block_size = reg_block_size; @@ -1540,17 +1540,17 @@ ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle } internal U64 -ctrl_tls_root_vaddr_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) +ctrl_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle) { U64 result = dmn_tls_root_vaddr_from_thread(handle.dmn_handle); return result; } internal U64 -ctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) +ctrl_rip_from_thread(D_EntityCtx *ctx, D_Handle handle) { Temp scratch = scratch_begin(0, 0); - CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + D_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle); U64 result = regs_rip_from_arch_block(arch, block); @@ -1559,10 +1559,10 @@ ctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) } internal U64 -ctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) +ctrl_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle) { Temp scratch = scratch_begin(0, 0); - CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + D_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle); U64 result = regs_rsp_from_arch_block(arch, block); @@ -1573,7 +1573,7 @@ ctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle) //- rjf: thread register writing internal B32 -ctrl_thread_write_reg_block(CTRL_Handle thread, void *block) +ctrl_thread_write_reg_block(D_Handle thread, void *block) { // TODO(rjf): @callstacks immediately reflect this in the call stack cache B32 good = dmn_thread_write_reg_block(thread.dmn_handle, block); @@ -1590,16 +1590,16 @@ ctrl_thread_write_reg_block(CTRL_Handle thread, void *block) //- rjf: cache lookups internal PE_IntelPdata * -ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff) +ctrl_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff) { PE_IntelPdata *first_pdata = 0; { U64 hash = ctrl_hash_from_handle(module_handle); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module_handle)) { @@ -1657,15 +1657,15 @@ ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 v } internal U64 -ctrl_entry_point_voff_from_module(CTRL_Handle module_handle) +ctrl_entry_point_voff_from_module(D_Handle module_handle) { U64 result = 0; U64 hash = ctrl_hash_from_handle(module_handle); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module_handle)) { @@ -1677,15 +1677,15 @@ ctrl_entry_point_voff_from_module(CTRL_Handle module_handle) } internal String8 -ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle) +ctrl_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle) { String8 result = {0}; U64 hash = ctrl_hash_from_handle(module_handle); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module_handle)) { @@ -1697,15 +1697,15 @@ ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle } internal String8 -ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle) +ctrl_raddbg_data_from_module(Arena *arena, D_Handle module_handle) { String8 result = {0}; U64 hash = ctrl_hash_from_handle(module_handle); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module_handle)) { @@ -1720,10 +1720,10 @@ ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle) //~ Process Info Functions internal Arch -ctrl_arch_from_process_handle(CTRL_Handle process_handle) +ctrl_arch_from_process_handle(D_Handle process_handle) { - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_Entity *process_entity = ctrl_entity_from_handle(entity_ctx, process_handle); + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_Entity *process_entity = ctrl_entity_from_handle(entity_ctx, process_handle); return process_entity->arch; } @@ -1732,14 +1732,14 @@ ctrl_arch_from_process_handle(CTRL_Handle process_handle) //- rjf: unwind deep copier -internal CTRL_Unwind -ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src) +internal D_Unwind +ctrl_unwind_deep_copy(Arena *arena, Arch arch, D_Unwind *src) { - CTRL_Unwind dst = {0}; + D_Unwind dst = {0}; { dst.flags = src->flags; dst.frames.count = src->frames.count; - dst.frames.v = push_array(arena, CTRL_UnwindFrame, dst.frames.count); + dst.frames.v = push_array(arena, D_UnwindFrame, dst.frames.count); MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count); U64 block_size = regs_block_size_from_arch(arch); for(U64 idx = 0; idx < dst.frames.count; idx += 1) @@ -1755,7 +1755,7 @@ ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src) typedef struct { - CTRL_Handle process_handle; + D_Handle process_handle; U64 endt_us; } CTRL_MemoryReadContextDwarfX64; @@ -1780,36 +1780,36 @@ MACHINE_OP_MEM_READ(ctrl_machine_mem_read) return status; } -internal CTRL_UnwindStepResult +internal D_UnwindStepResult ctrl_unwind_step_result_from_machine_op_result(MachineOpResult s) { - CTRL_UnwindStepResult result = {0}; + D_UnwindStepResult result = {0}; switch(s) { case MachineOpResult_Null: {} break; case MachineOpResult_Ok: { - result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale); + result.flags &= ~(D_UnwindFlag_Error|D_UnwindFlag_Stale); }break; case MachineOpResult_Fail: { - result.flags |= CTRL_UnwindFlag_Error; + result.flags |= D_UnwindFlag_Error; }break; case MachineOpResult_Maybe: { - result.flags &= ~CTRL_UnwindFlag_Error; - result.flags |= CTRL_UnwindFlag_Stale; + result.flags &= ~D_UnwindFlag_Error; + result.flags |= D_UnwindFlag_Stale; }break; default: { InvalidPath; } break; } return result; } -internal CTRL_UnwindStepResult -ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out) +internal D_UnwindStepResult +ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out) { Temp scratch = scratch_begin(&arena, 1); - CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; + D_UnwindStepResult result = { .flags = D_UnwindFlag_Error }; // gather context for virtual stack unwinder U64 cfi_rebase = 0; @@ -1821,9 +1821,9 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han U64 hash = ctrl_hash_from_handle(module_handle); U64 slot_idx = hash % d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx % d_ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) + D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for EachNode(n, D_ModuleImageInfoCacheNode, slot->first) { if(ctrl_handle_match(n->module, module_handle)) { @@ -1924,7 +1924,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han eh_parse_exit:; if(is_stale) { - result.flags = CTRL_UnwindFlag_Stale; + result.flags = D_UnwindFlag_Stale; } } else @@ -2007,12 +2007,12 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_han return result; } -internal CTRL_UnwindStepResult -ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us) +internal D_UnwindStepResult +ctrl_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us) { Temp scratch = scratch_begin(0, 0); - CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error }; + D_UnwindStepResult result = { .flags = D_UnwindFlag_Error }; // setup machine ops void *mem_read_ctx = 0; @@ -2100,8 +2100,8 @@ ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX return result; } -internal CTRL_UnwindStepResult -ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us) +internal D_UnwindStepResult +ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us) { B32 is_stale = 0; B32 is_good = 1; @@ -2905,24 +2905,24 @@ ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, //- rjf: fill & return // scratch_end(scratch); - CTRL_UnwindStepResult result = {0}; - if(!is_good) {result.flags |= CTRL_UnwindFlag_Error;} - if(is_stale) {result.flags |= CTRL_UnwindFlag_Stale;} + D_UnwindStepResult result = {0}; + if(!is_good) {result.flags |= D_UnwindFlag_Error;} + if(is_stale) {result.flags |= D_UnwindFlag_Stale;} return result; } //- rjf: abstracted full unwind -internal CTRL_Unwind -ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us) +internal D_Unwind +ctrl_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); - CTRL_Unwind unwind = { .flags = CTRL_UnwindFlag_Error }; + D_Unwind unwind = { .flags = D_UnwindFlag_Error }; //- rjf: unpack args - CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, thread); - CTRL_Entity *process_entity = thread_entity->parent; + D_Entity *thread_entity = ctrl_entity_from_handle(ctx, thread); + D_Entity *process_entity = thread_entity->parent; Arch arch = thread_entity->arch; U64 arch_reg_block_size = regs_block_size_from_arch(arch); @@ -2931,8 +2931,8 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U B32 regs_block_good = (arch != Arch_Null && regs_block != 0); //- rjf: loop & unwind - CTRL_UnwindFrameNode *first_frame_node = 0; - CTRL_UnwindFrameNode *last_frame_node = 0; + D_UnwindFrameNode *first_frame_node = 0; + D_UnwindFrameNode *last_frame_node = 0; U64 frame_node_count = 0; if(regs_block_good) { @@ -2948,11 +2948,11 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U } // rip -> module - CTRL_Entity *module_entity = ctrl_module_from_process_vaddr(process_entity, rip); + D_Entity *module_entity = ctrl_module_from_process_vaddr(process_entity, rip); // establish frame context - CTRL_FrameUnwindContext frame_ctx = {0}; - CTRL_UnwindStepResult frame_ctx_result = {0}; + D_FrameUnwindContext frame_ctx = {0}; + D_UnwindStepResult frame_ctx_result = {0}; switch(process_entity->target_os) { case OperatingSystem_Null:{}break; @@ -2971,14 +2971,14 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U default: { InvalidPath; }break; } unwind.flags |= frame_ctx_result.flags; - if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error)) + if(unwind.flags & (D_UnwindFlag_Stale|D_UnwindFlag_Error)) { break; } // rjf: valid step -> push frame - CTRL_UnwindFrameNode *frame_node = push_array(scratch.arena, CTRL_UnwindFrameNode, 1); - CTRL_UnwindFrame *frame = &frame_node->v; + D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1); + D_UnwindFrame *frame = &frame_node->v; frame->cfa = frame_ctx.cfa; frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); MemoryCopy(frame->regs, regs_block, arch_reg_block_size); @@ -2986,7 +2986,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U frame_node_count += 1; // rjf: unwind one step - CTRL_UnwindStepResult step_result = {0}; + D_UnwindStepResult step_result = {0}; switch(process_entity->target_os) { default:{}break; @@ -3009,7 +3009,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U // stop unwinding on errors or stale data unwind.flags |= step_result.flags; - if(unwind.flags & (CTRL_UnwindFlag_Stale|CTRL_UnwindFlag_Error) || + if(unwind.flags & (D_UnwindFlag_Stale|D_UnwindFlag_Error) || (regs_rsp_from_arch_block(arch, regs_block) == rsp && regs_rip_from_arch_block(arch, regs_block) == rip)) { break; @@ -3020,9 +3020,9 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U //- rjf: bake frames list into result array { unwind.frames.count = frame_node_count; - unwind.frames.v = push_array(arena, CTRL_UnwindFrame, unwind.frames.count); + unwind.frames.v = push_array(arena, D_UnwindFrame, unwind.frames.count); U64 idx = 0; - for(CTRL_UnwindFrameNode *n = first_frame_node; n != 0; n = n->next, idx += 1) + for(D_UnwindFrameNode *n = first_frame_node; n != 0; n = n->next, idx += 1) { unwind.frames.v[idx] = n->v; } @@ -3036,19 +3036,19 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U //////////////////////////////// //~ rjf: Call Stack Building Functions -internal CTRL_CallStack -ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *base_unwind) +internal D_CallStack +ctrl_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwind) { Temp scratch = scratch_begin(&arena, 1); Access *access = access_open(); Arch arch = process->arch; - CTRL_CallStack result = {0}; + D_CallStack result = {0}; { typedef struct FrameNode FrameNode; struct FrameNode { FrameNode *next; - CTRL_CallStackFrame v; + D_CallStackFrame v; }; //- rjf: gather all frames @@ -3058,9 +3058,9 @@ ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *bas for(U64 base_frame_idx = 0; base_frame_idx < base_unwind->frames.count; base_frame_idx += 1) { // rjf: unpack - CTRL_UnwindFrame *src = &base_unwind->frames.v[base_frame_idx]; + D_UnwindFrame *src = &base_unwind->frames.v[base_frame_idx]; U64 rip_vaddr = regs_rip_from_arch_block(arch, src->regs); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); @@ -3110,9 +3110,9 @@ ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *bas //- rjf: package result.frames_count = frame_count; - result.frames = push_array(arena, CTRL_CallStackFrame, result.frames_count); + result.frames = push_array(arena, D_CallStackFrame, result.frames_count); result.concrete_frames_count = base_unwind->frames.count; - result.concrete_frames = push_array(arena, CTRL_CallStackFrame *, result.concrete_frames_count); + result.concrete_frames = push_array(arena, D_CallStackFrame *, result.concrete_frames_count); { U64 idx = 0; U64 concrete_idx = 0; @@ -3132,10 +3132,10 @@ ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *bas return result; } -internal CTRL_CallStackFrame * -ctrl_call_stack_frame_from_unwind_and_inline_depth(CTRL_CallStack *call_stack, U64 unwind_count, U64 inline_depth) +internal D_CallStackFrame * +ctrl_call_stack_frame_from_unwind_and_inline_depth(D_CallStack *call_stack, U64 unwind_count, U64 inline_depth) { - CTRL_CallStackFrame *f = 0; + D_CallStackFrame *f = 0; { U64 base_frame_idx = 0; for(U64 idx = 0; idx < call_stack->frames_count; idx += 1) @@ -3213,7 +3213,7 @@ ctrl_string2alias_from_arch(Arch arch) //- rjf: user -> control thread communication internal B32 -ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) +ctrl_u2c_push_msgs(D_MsgList *msgs, U64 endt_us) { Temp scratch = scratch_begin(0, 0); String8 msgs_srlzed_baked = ctrl_serialized_string_from_msg_list(scratch.arena, msgs); @@ -3244,7 +3244,7 @@ ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us) return good; } -internal CTRL_MsgList +internal D_MsgList ctrl_u2c_pop_msgs(Arena *arena) { Temp scratch = scratch_begin(&arena, 1); @@ -3264,7 +3264,7 @@ ctrl_u2c_pop_msgs(Arena *arena) cond_var_wait(d_ctrl_state->u2c_ring_cv, d_ctrl_state->u2c_ring_mutex, max_U64); } cond_var_broadcast(d_ctrl_state->u2c_ring_cv); - CTRL_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked); + D_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked); scratch_end(scratch); return msgs; } @@ -3272,7 +3272,7 @@ ctrl_u2c_pop_msgs(Arena *arena) //- rjf: control -> user thread communication internal void -ctrl_c2u_push_events(CTRL_EventList *events) +ctrl_c2u_push_events(D_EventList *events) { if(events->count != 0) ProfScope("ctrl_c2u_push_events") { @@ -3280,7 +3280,7 @@ ctrl_c2u_push_events(CTRL_EventList *events) { ctrl_entity_store_apply_events(d_ctrl_state->ctrl_thread_entity_store, events); } - for(CTRL_EventNode *n = events->first; n != 0; n = n ->next) + for(D_EventNode *n = events->first; n != 0; n = n ->next) { Temp scratch = scratch_begin(0, 0); String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, d_ctrl_state->c2u_ring_size-sizeof(U64)); @@ -3307,12 +3307,12 @@ ctrl_c2u_push_events(CTRL_EventList *events) } } -internal CTRL_EventList +internal D_EventList ctrl_c2u_pop_events(Arena *arena) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); - CTRL_EventList events = {0}; + D_EventList events = {0}; MutexScope(d_ctrl_state->c2u_ring_mutex) for(;;) { U64 unconsumed_size = (d_ctrl_state->c2u_ring_write_pos-d_ctrl_state->c2u_ring_read_pos); @@ -3324,7 +3324,7 @@ ctrl_c2u_pop_events(Arena *arena) event_srlzed.size = size_to_decode; event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size); d_ctrl_state->c2u_ring_read_pos += ring_read(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); - CTRL_Event *new_event = ctrl_event_list_push(arena, &events); + D_Event *new_event = ctrl_event_list_push(arena, &events); *new_event = ctrl_event_from_serialized_string(arena, event_srlzed); } else @@ -3356,15 +3356,15 @@ ctrl_thread__entry_point(void *p) log_scope_begin(); //- rjf: get next messages - CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); + D_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); //- rjf: process messages DMN_CtrlExclusiveAccessScope { ins_atomic_u64_eval_assign(&d_ctrl_state->ctrl_thread_run_state, 1); - for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0; msg_n = msg_n->next) + for(D_MsgNode *msg_n = msgs.first; msg_n != 0; msg_n = msg_n->next) { - CTRL_Msg *msg = &msg_n->v; + D_Msg *msg = &msg_n->v; { log_infof("user2ctrl_msg:{kind:\"%S\"}\n", ctrl_string_from_msg_kind(msg->kind)); } @@ -3374,7 +3374,7 @@ ctrl_thread__entry_point(void *p) { arena_clear(d_ctrl_state->ctrl_thread_msg_process_arena); d_ctrl_state->module_req_cache_slots_count = 4096; - d_ctrl_state->module_req_cache_slots = push_array(d_ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode *, d_ctrl_state->module_req_cache_slots_count); + d_ctrl_state->module_req_cache_slots = push_array(d_ctrl_state->ctrl_thread_msg_process_arena, D_ModuleReqCacheNode *, d_ctrl_state->module_req_cache_slots_count); MemoryZeroStruct(&d_ctrl_state->msg_user_bp_touched_files); MemoryZeroStruct(&d_ctrl_state->msg_user_bp_touched_symbols); MemoryCopyArray(d_ctrl_state->exception_code_filters, msg->exception_code_filters); @@ -3450,20 +3450,20 @@ ctrl_thread__entry_point(void *p) //- rjf: process message switch(msg->kind) { - case CTRL_MsgKind_Null: - case CTRL_MsgKind_COUNT:{}break; + case D_MsgKind_Null: + case D_MsgKind_COUNT:{}break; //- rjf: target operations - case CTRL_MsgKind_Launch: {ctrl_thread__launch (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; - case CTRL_MsgKind_KillAll: {ctrl_thread__kill_all (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; - case CTRL_MsgKind_Run: {ctrl_thread__run (ctrl_ctx, msg);}break; - case CTRL_MsgKind_SingleStep: {ctrl_thread__single_step (ctrl_ctx, msg);}break; + case D_MsgKind_Launch: {ctrl_thread__launch (ctrl_ctx, msg);}break; + case D_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; + case D_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; + case D_MsgKind_KillAll: {ctrl_thread__kill_all (ctrl_ctx, msg);}break; + case D_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; + case D_MsgKind_Run: {ctrl_thread__run (ctrl_ctx, msg);}break; + case D_MsgKind_SingleStep: {ctrl_thread__single_step (ctrl_ctx, msg);}break; //- rjf: configuration - case CTRL_MsgKind_SetUserEntryPoints: + case D_MsgKind_SetUserEntryPoints: { arena_clear(d_ctrl_state->user_entry_point_arena); MemoryZeroStruct(&d_ctrl_state->user_entry_points); @@ -3472,12 +3472,12 @@ ctrl_thread__entry_point(void *p) str8_list_push(d_ctrl_state->user_entry_point_arena, &d_ctrl_state->user_entry_points, n->string); } }break; - case CTRL_MsgKind_SetModuleDebugInfoPath: + case D_MsgKind_SetModuleDebugInfoPath: { - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; String8 path = msg->path; - CTRL_Entity *module = ctrl_entity_from_handle(entity_ctx, msg->entity); - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + D_Entity *module = ctrl_entity_from_handle(entity_ctx, msg->entity); + D_Entity *debug_info_path = ctrl_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); di_close(old_dbgi_key, 0); MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) @@ -3488,27 +3488,27 @@ ctrl_thread__entry_point(void *p) debug_info_path->timestamp = new_dbgi_timestamp; DI_Key new_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, new_dbgi_timestamp); di_open(new_dbgi_key); - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_ModuleDebugInfoPathChange; + D_EventList evts = {0}; + D_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_ModuleDebugInfoPathChange; evt->entity = msg->entity; evt->string = path; evt->timestamp = new_dbgi_timestamp; ctrl_c2u_push_events(&evts); }break; - case CTRL_MsgKind_FreezeThread: + case D_MsgKind_FreezeThread: { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_ThreadFrozen; + D_EventList evts = {0}; + D_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_ThreadFrozen; evt->entity = msg->entity; ctrl_c2u_push_events(&evts); }break; - case CTRL_MsgKind_ThawThread: + case D_MsgKind_ThawThread: { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_ThreadThawed; + D_EventList evts = {0}; + D_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_ThreadThawed; evt->entity = msg->entity; ctrl_c2u_push_events(&evts); }break; @@ -3523,8 +3523,8 @@ ctrl_thread__entry_point(void *p) //- rjf: update thread register cache ProfScope("update thread register cache") { - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_EntityArray threads = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Thread); + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_EntityArray threads = ctrl_entity_array_from_kind(entity_ctx, D_EntityKind_Thread); REGS_RegBlockX64 *blocks = push_array(scratch.arena, REGS_RegBlockX64, threads.count); { for EachIndex(idx, threads.count) @@ -3547,15 +3547,15 @@ ctrl_thread__entry_point(void *p) //- rjf: breakpoint resolution internal void -ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) { if(user_bps->first == 0) { return; } ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); Access *access = eval_scope->access; - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_Entity *module_entity = ctrl_entity_from_handle(entity_ctx, module); - CTRL_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, CTRL_EntityKind_DebugInfoPath); + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_Entity *module_entity = ctrl_entity_from_handle(entity_ctx, module); + D_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, D_EntityKind_DebugInfoPath); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_entity); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); U64 base_vaddr = module_entity->vaddr_range.min; @@ -3638,7 +3638,7 @@ ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope * } internal void -ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) { for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) { @@ -3659,9 +3659,9 @@ ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope } internal void -ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out) +ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out) { - CTRL_Entity *process = bp->parent; + D_Entity *process = bp->parent; DMN_Trap trap = { .process = process->handle.dmn_handle, @@ -3678,12 +3678,12 @@ ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_ internal MACHINE_OP_MEM_READ(ctrl_dmn_mem_read) { - U64 read = dmn_process_read(((CTRL_Handle *)ud)->dmn_handle, r1u64(addr, addr + buffer_size), buffer); + U64 read = dmn_process_read(((D_Handle *)ud)->dmn_handle, r1u64(addr, addr + buffer_size), buffer); return read == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; } internal void -ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) +ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) { Temp scratch = scratch_begin(0,0); @@ -4055,12 +4055,12 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ U64 hash = ctrl_hash_from_handle(module); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeW(stripe->rw_mutex) { - CTRL_ModuleImageInfoCacheNode *node = 0; - for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first) + D_ModuleImageInfoCacheNode *node = 0; + for EachNode(n, D_ModuleImageInfoCacheNode, slot->first) { if(ctrl_handle_match(n->module, module)) { @@ -4070,7 +4070,7 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ } if(!node) { - node = push_array(arena, CTRL_ModuleImageInfoCacheNode, 1); + node = push_array(arena, D_ModuleImageInfoCacheNode, 1); DLLPushBack(slot->first, slot->last, node); node->module = module; node->arena = arena; @@ -4092,7 +4092,7 @@ ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_ } internal void -ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range) +ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range) { ////////////////////////////// //- rjf: evict module image info from cache @@ -4102,12 +4102,12 @@ ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr U64 hash = ctrl_hash_from_handle(module); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - CTRL_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - CTRL_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeW(stripe->rw_mutex) { - CTRL_ModuleImageInfoCacheNode *node = 0; - for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + D_ModuleImageInfoCacheNode *node = 0; + for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->module, module)) { @@ -4137,12 +4137,12 @@ ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr //- rjf: attached process running/event gathering internal DMN_Event * -ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof) +ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN_RunCtrls *run_ctrls, D_Spoof *spoof) { ProfBeginFunction(); DMN_Event *event = push_array(arena, DMN_Event, 1); Temp scratch = scratch_begin(&arena, 1); - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; //- rjf: loop -> try to get event, run, repeat U64 spoof_old_ip_value = 0; @@ -4186,10 +4186,10 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, should_filter_event = (ev->exception_repeated == 0 && (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)); // rjf: exception code -> kind - CTRL_ExceptionCodeKind code_kind = CTRL_ExceptionCodeKind_Null; + D_ExceptionCodeKind code_kind = D_ExceptionCodeKind_Null; if(should_filter_event) { - for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1)) + for(D_ExceptionCodeKind k = (D_ExceptionCodeKind)0; k < D_ExceptionCodeKind_COUNT; k = (D_ExceptionCodeKind)(k+1)) { if(ctrl_exception_code_kind_code_table[k] == ev->code) { @@ -4215,17 +4215,17 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) { Access *access = access_open(); - CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, ev->process)); - CTRL_Entity *module = &ctrl_entity_nil; - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + D_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, ev->process)); + D_Entity *module = &d_entity_nil; + for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { - if(child->kind == CTRL_EntityKind_Module) + if(child->kind == D_EntityKind_Module) { module = child; break; } } - if(module != &ctrl_entity_nil) + if(module != &d_entity_nil) { // rjf: determine base address of asan shadow space U64 asan_shadow_base_vaddr = 0; @@ -4305,7 +4305,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, U64 size_of_spoof = 0; if(do_spoof) ProfScope("prep spoof") { - CTRL_Entity *spoof_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, spoof->process)); + D_Entity *spoof_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, spoof->process)); Arch arch = spoof_process->arch; size_of_spoof = bit_size_from_arch(arch)/8; dmn_process_read(spoof_process->handle.dmn_handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); @@ -4375,7 +4375,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, // simply been sent other debug events first if(spoof != 0) { - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, spoof->thread)); + D_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, spoof->thread)); Arch arch = thread->arch; void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch)); dmn_thread_read_reg_block(spoof->thread, regs_block); @@ -4383,21 +4383,21 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, if(spoof_thread_rip == spoof->new_ip_value) { regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value); - ctrl_thread_write_reg_block(ctrl_handle_make(CTRL_MachineID_Local, spoof->thread), regs_block); + ctrl_thread_write_reg_block(ctrl_handle_make(D_MachineID_Local, spoof->thread), regs_block); } } //- rjf: push ctrl events associated with this demon event - CTRL_EventList evts = {0}; + D_EventList evts = {0}; ProfScope("push ctrl events associated with this demon event") switch(event->kind) { default:{}break; case DMN_EventKind_CreateProcess: { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_NewProc; + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_NewProc; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; out_evt->tls_model = ctrl_dynamic_linker_type_from_dmn(event->tls_model); @@ -4406,11 +4406,11 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, }break; case DMN_EventKind_CreateThread: { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_NewThread; + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_NewThread; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); @@ -4420,13 +4420,13 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, }break; case DMN_EventKind_LoadModule: { - CTRL_Handle process_handle = ctrl_handle_make(CTRL_MachineID_Local, event->process); - CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); - CTRL_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts); + D_Handle process_handle = ctrl_handle_make(D_MachineID_Local, event->process); + D_Handle module_handle = ctrl_handle_make(D_MachineID_Local, event->module); + D_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts); String8 module_path = path_normalized_from_string(scratch.arena, event->string); U64 exe_timestamp = os_properties_from_file_path(module_path).modified; ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize); - out_evt1->kind = CTRL_EventKind_NewModule; + out_evt1->kind = D_EventKind_NewModule; out_evt1->msg_id = msg->msg_id; out_evt1->entity = module_handle; out_evt1->parent = process_handle; @@ -4438,10 +4438,10 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, out_evt1->string = module_path; out_evt1->tls_index = event->tls_index; out_evt1->tls_offset = event->tls_offset; - CTRL_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts); String8 initial_debug_info_path = ctrl_initial_debug_info_path_from_module(scratch.arena, module_handle); U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified; - out_evt2->kind = CTRL_EventKind_ModuleDebugInfoPathChange; + out_evt2->kind = D_EventKind_ModuleDebugInfoPathChange; out_evt2->msg_id = msg->msg_id; out_evt2->entity = module_handle; out_evt2->parent = process_handle; @@ -4452,31 +4452,31 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, }break; case DMN_EventKind_ExitProcess: { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_EndProc; + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_EndProc; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->u64_code = event->code; d_ctrl_state->process_counter -= 1; }break; case DMN_EventKind_ExitThread: { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_EndThread; + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_EndThread; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); out_evt->entity_id = event->code; }break; case DMN_EventKind_UnloadModule: ProfScope("unload module %.*s", str8_varg(event->string)) { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module); - CTRL_Entity *module_ent = ctrl_entity_from_handle(entity_ctx, module_handle); - CTRL_Entity *process_ent = ctrl_process_from_entity(module_ent); + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Handle module_handle = ctrl_handle_make(D_MachineID_Local, event->module); + D_Entity *module_ent = ctrl_entity_from_handle(entity_ctx, module_handle); + D_Entity *process_ent = ctrl_process_from_entity(module_ent); String8 module_path = event->string; ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range); - out_evt->kind = CTRL_EventKind_EndModule; + out_evt->kind = D_EventKind_EndModule; out_evt->msg_id = msg->msg_id; out_evt->entity = module_handle; out_evt->string = module_path; @@ -4488,59 +4488,59 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, U64 num_strings = (event->string.size + d_ctrl_state->c2u_ring_max_string_size-1) / d_ctrl_state->c2u_ring_max_string_size; for(U64 string_idx = 0; string_idx < num_strings; string_idx += 1) { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_DebugString; + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_DebugString; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->string = str8_substr(event->string, r1u64(string_idx*d_ctrl_state->c2u_ring_max_string_size, (string_idx+1)*d_ctrl_state->c2u_ring_max_string_size)); } }break; case DMN_EventKind_SetThreadName: { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_ThreadName; + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_ThreadName; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->string = event->string; out_evt->entity_id = event->code; }break; case DMN_EventKind_SetThreadColor: { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_ThreadColor; + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_ThreadColor; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->entity_id = event->code; out_evt->rgba = event->user_data; }break; case DMN_EventKind_SetVAddrRangeNote: { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_SetVAddrRangeNote; - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_SetVAddrRangeNote; + out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->msg_id = msg->msg_id; out_evt->vaddr_rng = r1u64(event->address, event->address + event->size); out_evt->string = event->string; }break; case DMN_EventKind_SetBreakpoint: { - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_SetBreakpoint; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_SetBreakpoint; + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); }break; case DMN_EventKind_UnsetBreakpoint: { // TODO(rjf): this needs to be reflected in the resolved trap list too!!!!!!!! - CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - out_evt->kind = CTRL_EventKind_UnsetBreakpoint; - out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); + D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + out_evt->kind = D_EventKind_UnsetBreakpoint; + out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); }break; @@ -4552,7 +4552,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, if(d_ctrl_state->process_counter == 1 && event->kind == DMN_EventKind_CreateProcess) { arena_clear(d_ctrl_state->dbg_dir_arena); - d_ctrl_state->dbg_dir_root = push_array(d_ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1); + d_ctrl_state->dbg_dir_root = push_array(d_ctrl_state->dbg_dir_arena, D_DbgDirNode, 1); } //- rjf: out of queued up demon events -> clear event arena @@ -4576,7 +4576,7 @@ ctrl_eval_space_gen(E_Space space) switch(space.kind) { default:{}break; - case CTRL_EvalSpaceKind_Entity: + case D_EvalSpaceKind_Entity: { result = ctrl_mem_gen(); }break; @@ -4593,21 +4593,21 @@ ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) default:{}break; //- rjf: intra-entity reads (process memory or thread registers) - case CTRL_EvalSpaceKind_Entity: + case D_EvalSpaceKind_Entity: { - CTRL_Entity *entity = (CTRL_Entity *)space.u64_0; + D_Entity *entity = (D_Entity *)space.u64_0; switch(entity->kind) { default:{}break; - case CTRL_EntityKind_Process: + case D_EntityKind_Process: { U64 read_size = dmn_process_read(entity->handle.dmn_handle, range, out); result = (read_size == dim_1u64(range)); }break; - case CTRL_EntityKind_Thread: + case D_EntityKind_Thread: { Temp scratch = scratch_begin(0, 0); - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; U64 regs_size = regs_block_size_from_arch(entity->arch); void *regs = ctrl_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle); Rng1U64 legal_range = r1u64(0, regs_size); @@ -4625,12 +4625,12 @@ ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) //- rjf: control thread eval scopes -internal CTRL_EvalScope * -ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread) +internal D_EvalScope * +ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, D_Entity *thread) { ProfBeginFunction(); - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_EvalScope *scope = push_array(arena, CTRL_EvalScope, 1); + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_EvalScope *scope = push_array(arena, D_EvalScope, 1); scope->access = access_open(); ////////////////////////////// @@ -4638,39 +4638,39 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C // Arch arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(thread->handle.dmn_handle); - CTRL_Entity *process = ctrl_process_from_entity(thread); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + D_Entity *process = ctrl_process_from_entity(thread); + D_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); ////////////////////////////// //- rjf: gather evaluation debug infos & modules // - U64 eval_modules_count = Max(1, entity_ctx->entity_kind_counts[CTRL_EntityKind_Module]); + U64 eval_modules_count = Max(1, entity_ctx->entity_kind_counts[D_EntityKind_Module]); E_Module *eval_modules = push_array(arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &eval_modules[0]; eval_modules_primary->vaddr_range = r1u64(0, max_U64); - U64 eval_dbg_infos_count = Max(1, entity_ctx->entity_kind_counts[CTRL_EntityKind_Module]); + U64 eval_dbg_infos_count = Max(1, entity_ctx->entity_kind_counts[D_EntityKind_Module]); E_DbgInfo *eval_dbg_infos = push_array(arena, E_DbgInfo, eval_dbg_infos_count); E_DbgInfo *eval_dbg_infos_primary = &eval_dbg_infos[0]; MemoryCopyStruct(eval_dbg_infos_primary, &e_dbg_info_nil); { U64 eval_module_idx = 0; U64 eval_dbg_info_idx = 0; - for(CTRL_Entity *machine = entity_ctx->root->first; - machine != &ctrl_entity_nil; + for(D_Entity *machine = entity_ctx->root->first; + machine != &d_entity_nil; machine = machine->next) { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; - process != &ctrl_entity_nil; + if(machine->kind != D_EntityKind_Machine) { continue; } + for(D_Entity *process = machine->first; + process != &d_entity_nil; process = process->next) { - if(process->kind != CTRL_EntityKind_Process) { continue; } - for(CTRL_Entity *mod = process->first; - mod != &ctrl_entity_nil; + if(process->kind != D_EntityKind_Process) { continue; } + for(D_Entity *mod = process->first; + mod != &d_entity_nil; mod = mod->next) { - if(mod->kind != CTRL_EntityKind_Module) { continue; } + if(mod->kind != D_EntityKind_Module) { continue; } DI_Key dbgi_key = ctrl_dbgi_key_from_module(mod); //- rjf: try to obtain this module's RDI @@ -4690,9 +4690,9 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C // rjf: find cached result U64 hash = ctrl_hash_from_handle(mod->handle); U64 slot_idx = hash%d_ctrl_state->module_req_cache_slots_count; - CTRL_ModuleReqCacheNode *slot = d_ctrl_state->module_req_cache_slots[slot_idx]; - CTRL_ModuleReqCacheNode *node = 0; - for(CTRL_ModuleReqCacheNode *n = slot; n != 0; n = n->next) + D_ModuleReqCacheNode *slot = d_ctrl_state->module_req_cache_slots[slot_idx]; + D_ModuleReqCacheNode *node = 0; + for(D_ModuleReqCacheNode *n = slot; n != 0; n = n->next) { if(ctrl_handle_match(n->module, mod->handle)) { @@ -4710,7 +4710,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C // rjf: not cached -> compute & store else ProfScope("cache miss") { - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(mod, CTRL_EntityKind_DebugInfoPath); + D_Entity *debug_info_path = ctrl_entity_child_from_kind(mod, D_EntityKind_DebugInfoPath); OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, debug_info_path->string); ProfScope("determine if %.*s is necessary", str8_varg(debug_info_path->string)) { @@ -4751,7 +4751,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C } } os_file_close(file); - node = push_array(d_ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode, 1); + node = push_array(d_ctrl_state->ctrl_thread_msg_process_arena, D_ModuleReqCacheNode, 1); node->next = slot; d_ctrl_state->module_req_cache_slots[slot_idx] = node; node->module = mod->handle; @@ -4778,7 +4778,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C eval_modules[eval_module_idx].arch = arch; eval_modules[eval_module_idx].dbg_info_num= (U32)eval_dbg_info_idx; eval_modules[eval_module_idx].vaddr_range = mod->vaddr_range; - eval_modules[eval_module_idx].space = e_space_make(CTRL_EvalSpaceKind_Entity); + eval_modules[eval_module_idx].space = e_space_make(D_EvalSpaceKind_Entity); eval_modules[eval_module_idx].space.u64_0 = (U64)process; if(mod == module) { @@ -4805,9 +4805,9 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C ctx->thread_ip_vaddr = thread_rip_vaddr; ctx->thread_ip_voff = thread_rip_voff; ctx->thread_arch = thread->arch; - ctx->thread_reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->thread_reg_space = e_space_make(D_EvalSpaceKind_Entity); ctx->thread_reg_space.u64_0 = (U64)thread; - ctx->thread_process_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->thread_process_space = e_space_make(D_EvalSpaceKind_Entity); ctx->thread_process_space.u64_0 = (U64)process; //- rjf: fill debug infos @@ -4849,7 +4849,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C E_InterpretCtx *ctx = &scope->interpret_ctx; ctx->primary_space = eval_modules_primary->space; ctx->reg_arch = eval_modules_primary->arch; - ctx->reg_space = e_space_make(CTRL_EvalSpaceKind_Entity); + ctx->reg_space = e_space_make(D_EvalSpaceKind_Entity); ctx->reg_space.u64_0 = (U64)thread; ctx->module_base = push_array(arena, U64, 1); ctx->module_base[0]= module->vaddr_range.min; @@ -4866,7 +4866,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, C } internal void -ctrl_thread__eval_scope_end(CTRL_EvalScope *scope) +ctrl_thread__eval_scope_end(D_EvalScope *scope) { access_close(scope->access); } @@ -4881,9 +4881,9 @@ ctrl_thread__end_and_flush_log(void) os_append_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, log.strings[LogMsgKind_Info]); if(log.strings[LogMsgKind_UserError].size != 0) { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_Error; + D_EventList evts = {0}; + D_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_Error; evt->string = log.strings[LogMsgKind_UserError]; ctrl_c2u_push_events(&evts); } @@ -4893,7 +4893,7 @@ ctrl_thread__end_and_flush_log(void) //- rjf: msg kind implementations internal void -ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { Temp scratch = scratch_begin(0, 0); @@ -4943,13 +4943,13 @@ ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) os_file_close(stdin_handle); //- rjf: record (id -> entry points), so that we know custom entry points for this PID - CTRL_EntityCtxRWStore *entity_ctx_rw_store = d_ctrl_state->ctrl_thread_entity_store; + D_EntityCtxRWStore *entity_ctx_rw_store = d_ctrl_state->ctrl_thread_entity_store; MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) { String8 string = n->string; - CTRL_Entity *entry = ctrl_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, CTRL_EntityKind_EntryPoint, Arch_Null, ctrl_handle_zero(), (U64)id); + D_Entity *entry = ctrl_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, D_EntityKind_EntryPoint, Arch_Null, ctrl_handle_zero(), (U64)id); ctrl_entity_equip_string(entity_ctx_rw_store, entry, string); } } @@ -4958,7 +4958,7 @@ ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } internal void -ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -4998,10 +4998,10 @@ ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: record stop { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = CTRL_EventCause_Finished; + D_EventList evts = {0}; + D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Stopped; + event->cause = D_EventCause_Finished; event->msg_id = msg->msg_id; event->entity_id = !!attach_successful * msg->entity_id; ctrl_c2u_push_events(&evts); @@ -5012,7 +5012,7 @@ ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } internal void -ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -5023,7 +5023,7 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code); //- rjf: wait for process to be dead - CTRL_EventCause cause = CTRL_EventCause_Finished; + D_EventCause cause = D_EventCause_Finished; if(kill_worked) { DMN_RunCtrls run_ctrls = {0}; @@ -5042,17 +5042,17 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { done = 1; }break; - case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break; - case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break; + case DMN_EventKind_Error:{done = 1; cause = D_EventCause_Error;}break; + case DMN_EventKind_Halt: {done = 1; cause = D_EventCause_InterruptedByHalt;}break; } } } //- rjf: record stop { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; + D_EventList evts = {0}; + D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Stopped; event->cause = cause; event->msg_id = msg->msg_id; if(kill_worked) @@ -5067,34 +5067,34 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } internal void -ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); U32 exit_code = msg->exit_code; - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; //- rjf: gather all currently existing processes - CTRL_EntityArray initial_processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process); + D_EntityArray initial_processes = ctrl_entity_array_from_kind(entity_ctx, D_EntityKind_Process); typedef struct Task Task; struct Task { Task *next; Task *prev; - CTRL_Entity *process; + D_Entity *process; }; Task *first_task = 0; Task *last_task = 0; for EachIndex(idx, initial_processes.count) { - CTRL_Entity *entity = initial_processes.v[idx]; + D_Entity *entity = initial_processes.v[idx]; Task *t = push_array(scratch.arena, Task, 1); t->process = entity; DLLPushBack(first_task, last_task, t); } //- rjf: kill processes as needed, wait for all processes to be dead - CTRL_EventCause cause = CTRL_EventCause_Finished; + D_EventCause cause = D_EventCause_Finished; if(first_task != 0) { DMN_RunCtrls run_ctrls = {0}; @@ -5120,17 +5120,17 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) default:{}break; case DMN_EventKind_CreateProcess: { - CTRL_Entity *new_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + D_Entity *new_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->process)); Task *t = push_array(scratch.arena, Task, 1); t->process = new_process; DLLPushBack(first_task, last_task, t); }break; - case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break; - case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break; + case DMN_EventKind_Error:{done = 1; cause = D_EventCause_Error;}break; + case DMN_EventKind_Halt: {done = 1; cause = D_EventCause_InterruptedByHalt;}break; } // rjf: end if all processes are gone - CTRL_EntityArray processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(entity_ctx, D_EntityKind_Process); if(processes.count == 0) { done = 1; @@ -5140,9 +5140,9 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: record stop { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; + D_EventList evts = {0}; + D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Stopped; event->cause = cause; event->msg_id = msg->msg_id; ctrl_c2u_push_events(&evts); @@ -5153,7 +5153,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } internal void -ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -5186,10 +5186,10 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: record stop { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; - event->cause = CTRL_EventCause_Finished; + D_EventList evts = {0}; + D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Stopped; + event->cause = D_EventCause_Finished; event->msg_id = msg->msg_id; if(detach_worked) { @@ -5203,16 +5203,16 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } internal void -ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DMN_Event *stop_event = 0; - CTRL_EventCause stop_cause = CTRL_EventCause_Null; - CTRL_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_Handle target_thread = msg->entity; - CTRL_Handle target_process = msg->parent; - CTRL_Entity *target_process_entity = ctrl_entity_from_handle(entity_ctx, target_process); + D_EventCause stop_cause = D_EventCause_Null; + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_Handle target_thread = msg->entity; + D_Handle target_process = msg->parent; + D_Entity *target_process_entity = ctrl_entity_from_handle(entity_ctx, target_process); U64 spoof_ip_vaddr = 911; log_infof("ctrl_thread__run:\n{\n"); @@ -5221,28 +5221,28 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // DMN_TrapChunkList user_traps = {0}; { - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, target_thread); - CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); - for(CTRL_Entity *machine = entity_ctx->root->first; - machine != &ctrl_entity_nil; + D_Entity *thread = ctrl_entity_from_handle(entity_ctx, target_thread); + D_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); + for(D_Entity *machine = entity_ctx->root->first; + machine != &d_entity_nil; machine = machine->next) { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + if(machine->kind != D_EntityKind_Machine) { continue; } + for(D_Entity *process = machine->first; process != &d_entity_nil; process = process->next) { - if(process->kind != CTRL_EntityKind_Process) { continue; } + if(process->kind != D_EntityKind_Process) { continue; } // rjf: resolve module-dependent user bps - for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next) + for(D_Entity *module = process->first; module != &d_entity_nil; module = module->next) { - if(module->kind != CTRL_EntityKind_Module) { continue; } + if(module->kind != D_EntityKind_Module) { continue; } ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, process->handle, module->handle, &msg->user_bps, &user_traps); } // rjf: push process-declared breakpoins - for(CTRL_Entity *bp = process->first; bp != &ctrl_entity_nil; bp = bp->next) + for(D_Entity *bp = process->first; bp != &d_entity_nil; bp = bp->next) { - if(bp->kind != CTRL_EntityKind_Breakpoint) { continue; } + if(bp->kind != D_EntityKind_Breakpoint) { continue; } ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &user_traps); } @@ -5280,17 +5280,17 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { // rjf: gather stuck threads DMN_HandleList stuck_threads = {0}; - for(CTRL_Entity *machine = entity_ctx->root->first; - machine != &ctrl_entity_nil; + for(D_Entity *machine = entity_ctx->root->first; + machine != &d_entity_nil; machine = machine->next) { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + if(machine->kind != D_EntityKind_Machine) { continue; } + for(D_Entity *process = machine->first; process != &d_entity_nil; process = process->next) { - if(process->kind != CTRL_EntityKind_Process) { continue; } - for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) + if(process->kind != D_EntityKind_Process) { continue; } + for(D_Entity *thread = process->first; thread != &d_entity_nil; thread = thread->next) { - if(thread->kind != CTRL_EntityKind_Thread) { continue; } + if(thread->kind != D_EntityKind_Thread) { continue; } U64 rip = dmn_rip_from_thread(thread->handle.dmn_handle); // rjf: determine if thread is frozen @@ -5311,7 +5311,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } B32 is_on_net_trap = 0; - for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next) + for(D_TrapNode *n = msg->traps.first; n != 0; n = n->next) { if(n->v.vaddr == rip) { @@ -5361,13 +5361,13 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) case DMN_EventKind_ExitThread: if(dmn_handle_match(event->thread, thread)) { - stop_cause = CTRL_EventCause_Error; + stop_cause = D_EventCause_Error; goto stop; }break; - case DMN_EventKind_Error: stop_cause = CTRL_EventCause_Error; goto stop; - case DMN_EventKind_Exception: stop_cause = CTRL_EventCause_InterruptedByException; goto stop; - case DMN_EventKind_Trap: stop_cause = CTRL_EventCause_InterruptedByTrap; goto stop; - case DMN_EventKind_Halt: stop_cause = CTRL_EventCause_InterruptedByHalt; goto stop; + case DMN_EventKind_Error: stop_cause = D_EventCause_Error; goto stop; + case DMN_EventKind_Exception: stop_cause = D_EventCause_InterruptedByException; goto stop; + case DMN_EventKind_Trap: stop_cause = D_EventCause_InterruptedByTrap; goto stop; + case DMN_EventKind_Halt: stop_cause = D_EventCause_InterruptedByHalt; goto stop; stop:; { stop_event = event; @@ -5385,16 +5385,16 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ////////////////////////////// //- rjf: gather frozen threads // - CTRL_EntityList frozen_threads = {0}; - for(CTRL_Entity *machine = entity_ctx->root->first; - machine != &ctrl_entity_nil; + D_EntityList frozen_threads = {0}; + for(D_Entity *machine = entity_ctx->root->first; + machine != &d_entity_nil; machine = machine->next) { - if(machine->kind != CTRL_EntityKind_Machine) { continue; } - for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next) + if(machine->kind != D_EntityKind_Machine) { continue; } + for(D_Entity *process = machine->first; process != &d_entity_nil; process = process->next) { - if(process->kind != CTRL_EntityKind_Process) { continue; } - for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next) + if(process->kind != D_EntityKind_Process) { continue; } + for(D_Entity *thread = process->first; thread != &d_entity_nil; thread = thread->next) { if(thread->is_frozen) { @@ -5408,7 +5408,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: resolve trap net // DMN_TrapChunkList trap_net_traps = {0}; - for(CTRL_TrapNode *node = msg->traps.first; + for(D_TrapNode *node = msg->traps.first; node != 0; node = node->next) { @@ -5430,9 +5430,9 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // if(stop_event == 0) { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Started; + D_EventList evts = {0}; + D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Started; ctrl_c2u_push_events(&evts); } @@ -5442,7 +5442,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) if(stop_event == 0) { B32 spoof_mode = 0; - CTRL_Spoof spoof = {0}; + D_Spoof spoof = {0}; DMN_TrapChunkList entry_traps = {0}; for(U64 run_loop_idx = 0;; run_loop_idx += 1) { @@ -5458,7 +5458,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ////////////////////////// //- rjf: choose spoof // - CTRL_Spoof *run_spoof = 0; + D_Spoof *run_spoof = 0; if(spoof_mode) { run_spoof = &spoof; @@ -5478,7 +5478,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) run_ctrls.run_entities_are_unfrozen = 0; { U64 idx = 0; - for(CTRL_EntityNode *n = frozen_threads.first; n != 0; n = n->next) + for(D_EntityNode *n = frozen_threads.first; n != 0; n = n->next) { run_ctrls.run_entities[idx] = n->v->handle.dmn_handle; idx += 1; @@ -5498,7 +5498,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // B32 launch_done_first_module = 0; B32 hard_stop = 0; - CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + D_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); B32 use_stepping_logic = 0; switch(event->kind) { @@ -5519,10 +5519,10 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) }break; case DMN_EventKind_CreateProcess: { - CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, &ctrl_entity_nil); + D_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, &d_entity_nil); { DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(CTRL_MachineID_Local, event->process), &msg->user_bps, &new_traps); + ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(D_MachineID_Local, event->process), &msg->user_bps, &new_traps); log_infof("step_rule: create_process -> resolve traps\n"); log_infof("new_traps:\n{\n"); for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) @@ -5541,11 +5541,11 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) }break; case DMN_EventKind_LoadModule: { - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->thread)); - CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); + D_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->thread)); + D_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); { DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(CTRL_MachineID_Local, event->process), ctrl_handle_make(CTRL_MachineID_Local, event->module), &msg->user_bps, &new_traps); + ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(D_MachineID_Local, event->process), ctrl_handle_make(D_MachineID_Local, event->module), &msg->user_bps, &new_traps); log_infof("step_rule: load_module -> resolve traps\n"); log_infof("new_traps:\n{\n"); for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) @@ -5564,12 +5564,12 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) }break; case DMN_EventKind_SetBreakpoint: { - CTRL_Entity *bp = &ctrl_entity_nil; + D_Entity *bp = &d_entity_nil; { - CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); - for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + D_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->process)); + for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { - if(child->kind == CTRL_EntityKind_Breakpoint && + if(child->kind == D_EntityKind_Breakpoint && child->vaddr_range.min == event->address && child->vaddr_range.max == event->address + event->size && child->bp_flags == ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags)) @@ -5579,7 +5579,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } } } - if(bp != &ctrl_entity_nil) + if(bp != &d_entity_nil) { DMN_TrapChunkList new_traps = {0}; ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &new_traps); @@ -5592,14 +5592,14 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ////////////////////////// //- rjf: on launches, detect entry points, place traps // - if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && !launch_done_first_module && event->kind == DMN_EventKind_HandshakeComplete) + if(msg->run_flags & D_RunFlag_StopOnEntryPoint && !launch_done_first_module && event->kind == DMN_EventKind_HandshakeComplete) { launch_done_first_module = 1; Access *access = access_open(); //- rjf: unpack process/module info - CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); - CTRL_Entity *module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module); + D_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->process)); + D_Entity *module = ctrl_entity_child_from_kind(process, D_EntityKind_Module); U64 module_base_vaddr = module->vaddr_range.min; DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64); @@ -5673,7 +5673,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: add traps for PID-correllated entry points if(!entries_found) { - for(CTRL_Entity *e = entity_ctx->root->first; e != &ctrl_entity_nil; e = e->next) + for(D_Entity *e = entity_ctx->root->first; e != &d_entity_nil; e = e->next) { if(e->id == process->id) { @@ -5821,11 +5821,11 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) ////////////////////////// //- rjf: unpack info about thread attached to event // - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->thread)); - CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process)); + D_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->thread)); + D_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->process)); Arch arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + D_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); ////////////////////////// //- rjf: extract module-dependent info @@ -5877,7 +5877,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) B32 hit_user_bp = 0; B32 hit_trap_net_bp = 0; B32 hit_conditional_bp_but_filtered = 0; - CTRL_TrapFlags hit_trap_flags = 0; + D_TrapFlags hit_trap_flags = 0; if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Breakpoint) ProfScope("for breakpoint events, gather bp info") { @@ -5936,7 +5936,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // rjf: evaluate hit stop conditions if(conditions.node_count != 0) ProfScope("evaluate hit stop conditions") { - CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(temp.arena, &msg->user_bps, thread); + D_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(temp.arena, &msg->user_bps, thread); for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) { // rjf: evaluate @@ -5969,7 +5969,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { if(!hit_user_bp && dmn_handle_match(event->process, target_process.dmn_handle)) { - for(CTRL_TrapNode *node = msg->traps.first; + for(D_TrapNode *node = msg->traps.first; node != 0; node = node->next) { @@ -5989,7 +5989,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: hit conditional user bp but filtered -> single step B32 cond_bp_single_step_stop = 0; - CTRL_EventCause cond_bp_single_step_stop_cause = CTRL_EventCause_Null; + D_EventCause cond_bp_single_step_stop_cause = D_EventCause_Null; if(hit_conditional_bp_but_filtered) LogInfoNamedBlockF("conditional_bp_hit_single_step") { DMN_Handle thread = event->thread; @@ -6031,7 +6031,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: hit entry points on *any thread* cause a stop, if this msg says as such B32 entry_stop = 0; - if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && hit_entry) + if(msg->run_flags & D_RunFlag_StopOnEntryPoint && hit_entry) { entry_stop = 1; use_stepping_logic = 0; @@ -6076,10 +6076,10 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: trap net logic: single step after hit B32 single_step_stop = 0; - CTRL_EventCause single_step_stop_cause = CTRL_EventCause_Null; + D_EventCause single_step_stop_cause = D_EventCause_Null; if(!hard_stop && use_trap_net_logic) { - if(hit_trap_flags & CTRL_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF("trap_net__single_step_after_hit") + if(hit_trap_flags & D_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF("trap_net__single_step_after_hit") { U64 thread_pre_rip = dmn_rip_from_thread(target_thread.dmn_handle); U64 thread_post_rip = thread_pre_rip; @@ -6123,7 +6123,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) B32 begin_spoof_mode = 0; if(!hard_stop && use_trap_net_logic) { - if(hit_trap_flags & CTRL_TrapFlag_BeginSpoofMode) LogInfoNamedBlockF("trap_net__begin_spoof_mode") + if(hit_trap_flags & D_TrapFlag_BeginSpoofMode) LogInfoNamedBlockF("trap_net__begin_spoof_mode") { // rjf: setup spoof mode begin_spoof_mode = 1; @@ -6141,7 +6141,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) B32 save_stack_pointer = 0; if(!hard_stop && use_trap_net_logic) { - if(hit_trap_flags & CTRL_TrapFlag_SaveStackPointer) + if(hit_trap_flags & D_TrapFlag_SaveStackPointer) { if(stack_pointer_matches) LogInfoNamedBlockF("trap_net__save_sp") { @@ -6156,9 +6156,9 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) B32 trap_net_stop = 0; if(!hard_stop && use_trap_net_logic) { - if(hit_trap_flags & CTRL_TrapFlag_EndStepping) LogInfoNamedBlockF("trap_net__end_step") + if(hit_trap_flags & D_TrapFlag_EndStepping) LogInfoNamedBlockF("trap_net__end_step") { - if((hit_trap_flags & CTRL_TrapFlag_IgnoreStackPointerCheck) || + if((hit_trap_flags & D_TrapFlag_IgnoreStackPointerCheck) || stack_pointer_matches) { trap_net_stop = 1; @@ -6174,7 +6174,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: handle step past trap net B32 step_past_trap_net_stop = 0; - CTRL_EventCause step_past_trap_net_stop_cause = CTRL_EventCause_Null; + D_EventCause step_past_trap_net_stop_cause = D_EventCause_Null; if(step_past_trap_net) LogInfoNamedBlockF("trap_net__single_step_past_trap_net") { DMN_Handle thread = event->thread; @@ -6214,7 +6214,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } //- rjf: loop exit condition - CTRL_EventCause stage_stop_cause = CTRL_EventCause_Null; + D_EventCause stage_stop_cause = D_EventCause_Null; if(hard_stop) { stage_stop_cause = hard_stop_cause; @@ -6233,22 +6233,22 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } else if(exception_stop) { - stage_stop_cause = CTRL_EventCause_InterruptedByException; + stage_stop_cause = D_EventCause_InterruptedByException; } else if(user_bp_stop) { - stage_stop_cause = CTRL_EventCause_UserBreakpoint; + stage_stop_cause = D_EventCause_UserBreakpoint; } else if(entry_stop) { - stage_stop_cause = CTRL_EventCause_EntryPoint; + stage_stop_cause = D_EventCause_EntryPoint; } else if(trap_net_stop) { - stage_stop_cause = CTRL_EventCause_Finished; + stage_stop_cause = D_EventCause_Finished; } log_infof("stop_cause: %i\n", stage_stop_cause); - if(stage_stop_cause != CTRL_EventCause_Null) + if(stage_stop_cause != D_EventCause_Null) { stop_event = event; stop_cause = stage_stop_cause; @@ -6262,17 +6262,17 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) // if(stop_event != 0) { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; + D_EventList evts = {0}; + D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Stopped; event->cause = stop_cause; - event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread); - event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process); + event->entity = ctrl_handle_make(D_MachineID_Local, stop_event->thread); + event->parent = ctrl_handle_make(D_MachineID_Local, stop_event->process); event->exception_code = stop_event->code; event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind); event->vaddr_rng = r1u64(stop_event->address, stop_event->address); event->rip_vaddr = stop_event->instruction_pointer; - if(stop_cause == CTRL_EventCause_UserBreakpoint && stop_event->user_data != 0) + if(stop_cause == D_EventCause_UserBreakpoint && stop_event->user_data != 0) { if(!(stop_event->user_data & bit64)) { @@ -6289,16 +6289,16 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } internal void -ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) +ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); //- rjf: record start { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Started; + D_EventList evts = {0}; + D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Started; ctrl_c2u_push_events(&evts); } @@ -6306,7 +6306,7 @@ ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) DMN_Handle thread = msg->entity.dmn_handle; B32 thread_is_valid = !dmn_handle_match(thread, dmn_handle_zero()); DMN_Event *stop_event = 0; - CTRL_EventCause stop_cause = CTRL_EventCause_Null; + D_EventCause stop_cause = D_EventCause_Null; if(thread_is_valid) { U64 thread_pre_rip = dmn_rip_from_thread(thread); @@ -6326,12 +6326,12 @@ ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) switch(event->kind) { default:{}break; - case DMN_EventKind_Error: {stop_cause = CTRL_EventCause_Error;}goto end_single_step; - case DMN_EventKind_Exception: {stop_cause = CTRL_EventCause_InterruptedByException;}goto end_single_step; - case DMN_EventKind_Halt: {stop_cause = CTRL_EventCause_InterruptedByHalt;}goto end_single_step; - case DMN_EventKind_Trap: {stop_cause = CTRL_EventCause_InterruptedByTrap;}goto end_single_step; - case DMN_EventKind_Breakpoint: {stop_cause = CTRL_EventCause_UserBreakpoint;}goto end_single_step; - case DMN_EventKind_SingleStep: {stop_cause = CTRL_EventCause_Finished;}goto end_single_step; + case DMN_EventKind_Error: {stop_cause = D_EventCause_Error;}goto end_single_step; + case DMN_EventKind_Exception: {stop_cause = D_EventCause_InterruptedByException;}goto end_single_step; + case DMN_EventKind_Halt: {stop_cause = D_EventCause_InterruptedByHalt;}goto end_single_step; + case DMN_EventKind_Trap: {stop_cause = D_EventCause_InterruptedByTrap;}goto end_single_step; + case DMN_EventKind_Breakpoint: {stop_cause = D_EventCause_UserBreakpoint;}goto end_single_step; + case DMN_EventKind_SingleStep: {stop_cause = D_EventCause_Finished;}goto end_single_step; end_single_step: { stop_event = event; @@ -6343,14 +6343,14 @@ ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) //- rjf: record stop { - CTRL_EventList evts = {0}; - CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts); - event->kind = CTRL_EventKind_Stopped; + D_EventList evts = {0}; + D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Stopped; event->cause = stop_cause; if(stop_event != 0) { - event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread); - event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process); + event->entity = ctrl_handle_make(D_MachineID_Local, stop_event->thread); + event->parent = ctrl_handle_make(D_MachineID_Local, stop_event->process); event->exception_code = stop_event->code; event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind); event->vaddr_rng = r1u64(stop_event->address, stop_event->address); @@ -6372,7 +6372,7 @@ ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 AC_Artifact artifact = {0}; { //- rjf: unpack key - CTRL_Handle process = {0}; + D_Handle process = {0}; Rng1U64 vaddr_range = {0}; B32 zero_terminated = 0; { @@ -6528,13 +6528,13 @@ ctrl_memory_artifact_destroy(AC_Artifact artifact) } internal C_Key -ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale) +ctrl_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale) { ProfBeginFunction(); #pragma pack(push, 1) struct { - CTRL_Handle process; + D_Handle process; Rng1U64 vaddr_range; B32 zero_terminated; } key_data = {process, vaddr_range, zero_terminated}; @@ -6556,11 +6556,11 @@ ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 //- rjf: process memory reading helpers -internal CTRL_ProcessMemorySlice -ctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us) +internal D_ProcessMemorySlice +ctrl_process_memory_slice_from_vaddr_range(Arena *arena, D_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us) { ProfBeginFunction(); - CTRL_ProcessMemorySlice result = {0}; + D_ProcessMemorySlice result = {0}; if(range.max > range.min && dim_1u64(range) <= MB(256) && range.min <= 0x000FFFFFFFFFFFFFull && @@ -6700,11 +6700,11 @@ ctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rn } internal B32 -ctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us) +ctrl_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us) { Temp scratch = scratch_begin(0, 0); U64 needed_size = dim_1u64(range); - CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, range, 0, endt_us); + D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, range, 0, endt_us); B32 good = (slice.data.size >= needed_size && !slice.any_byte_bad); if(good) { @@ -6721,7 +6721,7 @@ ctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, //- rjf: process memory writing internal B32 -ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src) +ctrl_process_write(D_Handle process, Rng1U64 range, void *src) { ProfBeginFunction(); B32 result = dmn_process_write(process.dmn_handle, range, src); @@ -6743,7 +6743,7 @@ ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src) for EachInRange(page_idx, page_range) { Temp scratch = scratch_begin(0, 0); - CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); + D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); scratch_end(scratch); if(!slice.stale || os_now_microseconds() >= endt_us) { @@ -6767,41 +6767,41 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, Temp scratch = scratch_begin(0, 0); //- rjf: unpack key - CTRL_Handle thread_handle = {0}; + D_Handle thread_handle = {0}; str8_deserial_read_struct(key, 0, &thread_handle); //- rjf: produce mini entity context for just this call stack build - CTRL_EntityCtx *entity_ctx = push_array(scratch.arena, CTRL_EntityCtx, 1); + D_EntityCtx *entity_ctx = push_array(scratch.arena, D_EntityCtx, 1); MutexScopeR(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - CTRL_EntityCtx *src_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_EntityCtx *dst_ctx = entity_ctx; + D_EntityCtx *src_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_EntityCtx *dst_ctx = entity_ctx; { - dst_ctx->root = &ctrl_entity_nil; + dst_ctx->root = &d_entity_nil; dst_ctx->hash_slots_count = 1024; - dst_ctx->hash_slots = push_array(scratch.arena, CTRL_EntityHashSlot, dst_ctx->hash_slots_count); + dst_ctx->hash_slots = push_array(scratch.arena, D_EntityHashSlot, dst_ctx->hash_slots_count); MemoryCopyArray(dst_ctx->entity_kind_counts, src_ctx->entity_kind_counts); MemoryCopyArray(dst_ctx->entity_kind_alloc_gens, src_ctx->entity_kind_alloc_gens); } - CTRL_Entity *src_thread = ctrl_entity_from_handle(src_ctx, thread_handle); - CTRL_Entity *src_process = ctrl_process_from_entity(src_thread); + D_Entity *src_thread = ctrl_entity_from_handle(src_ctx, thread_handle); + D_Entity *src_process = ctrl_process_from_entity(src_thread); { - CTRL_EntityRec rec = {0}; - CTRL_Entity *dst_parent = &ctrl_entity_nil; - for(CTRL_Entity *src_e = src_process; src_e != &ctrl_entity_nil; src_e = rec.next) + D_EntityRec rec = {0}; + D_Entity *dst_parent = &d_entity_nil; + for(D_Entity *src_e = src_process; src_e != &d_entity_nil; src_e = rec.next) { rec = ctrl_entity_rec_depth_first_pre(src_e, src_process); // rjf: determine if we need this entity - B32 need_this_entity = (ctrl_handle_match(thread_handle, src_e->handle) || src_e->kind == CTRL_EntityKind_Module || src_e->kind == CTRL_EntityKind_Process || src_e->kind == CTRL_EntityKind_DebugInfoPath); + B32 need_this_entity = (ctrl_handle_match(thread_handle, src_e->handle) || src_e->kind == D_EntityKind_Module || src_e->kind == D_EntityKind_Process || src_e->kind == D_EntityKind_DebugInfoPath); // rjf: copy this entity - CTRL_Entity *dst_e = &ctrl_entity_nil; + D_Entity *dst_e = &d_entity_nil; if(need_this_entity) { - dst_e = push_array(scratch.arena, CTRL_Entity, 1); + dst_e = push_array(scratch.arena, D_Entity, 1); { - dst_e->first = dst_e->last = dst_e->next = dst_e->prev = &ctrl_entity_nil; + dst_e->first = dst_e->last = dst_e->next = dst_e->prev = &d_entity_nil; dst_e->parent = dst_parent; dst_e->kind = src_e->kind; dst_e->arch = src_e->arch; @@ -6820,24 +6820,24 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, dst_e->target_os = src_e->target_os; dst_e->tls_model = src_e->tls_model; } - if(dst_parent == &ctrl_entity_nil) + if(dst_parent == &d_entity_nil) { dst_ctx->root = dst_e; } else { - DLLPushBack_NPZ(&ctrl_entity_nil, dst_parent->first, dst_parent->last, dst_e, next, prev); + DLLPushBack_NPZ(&d_entity_nil, dst_parent->first, dst_parent->last, dst_e, next, prev); } } // rjf: insert into hash map - if(dst_e != &ctrl_entity_nil) + if(dst_e != &d_entity_nil) { U64 hash = ctrl_hash_from_handle(dst_e->handle); U64 slot_idx = hash%dst_ctx->hash_slots_count; - CTRL_EntityHashSlot *slot = &dst_ctx->hash_slots[slot_idx]; - CTRL_EntityHashNode *node = 0; - for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next) + D_EntityHashSlot *slot = &dst_ctx->hash_slots[slot_idx]; + D_EntityHashNode *node = 0; + for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { if(ctrl_handle_match(n->entity->handle, dst_e->handle)) { @@ -6847,7 +6847,7 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, } if(node == 0) { - node = push_array(scratch.arena, CTRL_EntityHashNode, 1); + node = push_array(scratch.arena, D_EntityHashNode, 1); MemoryZeroStruct(node); DLLPushBack(slot->first, slot->last, node); node->entity = dst_e; @@ -6868,32 +6868,32 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, } //- rjf: compute call stack - CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, thread_handle); + D_Entity *thread = ctrl_entity_from_handle(entity_ctx, thread_handle); B32 good = 1; B32 retry = 0; Arena *arena = 0; - CTRL_CallStack *call_stack = 0; - if(thread != &ctrl_entity_nil) + D_CallStack *call_stack = 0; + if(thread != &d_entity_nil) { good = 0; arena = arena_alloc(); - call_stack = push_array(arena, CTRL_CallStack, 1); - CTRL_Entity *process = ctrl_process_from_entity(thread); + call_stack = push_array(arena, D_CallStack, 1); + D_Entity *process = ctrl_process_from_entity(thread); U64 pre_reg_gen = 0; U64 post_reg_gen = 0; U64 pre_mem_gen = 0; U64 post_mem_gen = 0; - CTRL_Unwind unwind = {0}; + D_Unwind unwind = {0}; { pre_reg_gen = ctrl_reg_gen(); pre_mem_gen = ctrl_mem_gen(); unwind = ctrl_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000); - if(!(unwind.flags & CTRL_UnwindFlag_Stale)) + if(!(unwind.flags & D_UnwindFlag_Stale)) { good = 1; call_stack[0] = ctrl_call_stack_from_unwind(arena, process, &unwind); } - if(unwind.flags & CTRL_UnwindFlag_Stale) + if(unwind.flags & D_UnwindFlag_Stale) { retry = 1; } @@ -6942,10 +6942,10 @@ ctrl_call_stack_artifact_destroy(AC_Artifact artifact) } } -internal CTRL_CallStack -ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us) +internal D_CallStack +ctrl_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us) { - CTRL_CallStack result = {0}; + D_CallStack result = {0}; { AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&thread_handle), ctrl_call_stack_artifact_create, ctrl_call_stack_artifact_destroy, endt_us, .gen = ctrl_mem_gen() + ctrl_reg_gen(), @@ -6953,7 +6953,7 @@ ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_ .flags = high_priority ? AC_Flag_HighPriority : 0); if(artifact.u64[1] != 0) { - MemoryCopyStruct(&result, (CTRL_CallStack *)artifact.u64[1]); + MemoryCopyStruct(&result, (D_CallStack *)artifact.u64[1]); } } return result; @@ -6970,16 +6970,16 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry //- rjf: gather list of all thread handles U64 threads_count = 0; - CTRL_Handle *threads = 0; - CTRL_Handle *threads_processes = 0; + D_Handle *threads = 0; + D_Handle *threads_processes = 0; Arch *threads_arches = 0; MutexScopeR(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - CTRL_EntityCtx *ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - CTRL_EntityArray thread_entities = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread); + D_EntityCtx *ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_EntityArray thread_entities = ctrl_entity_array_from_kind(ctx, D_EntityKind_Thread); threads_count = thread_entities.count; - threads = push_array(scratch.arena, CTRL_Handle, threads_count); - threads_processes = push_array(scratch.arena, CTRL_Handle, threads_count); + threads = push_array(scratch.arena, D_Handle, threads_count); + threads_processes = push_array(scratch.arena, D_Handle, threads_count); threads_arches = push_array(scratch.arena, Arch, threads_count); for EachIndex(idx, threads_count) { @@ -6993,7 +6993,7 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry B32 stale = 0; U64 pre_mem_gen = ctrl_mem_gen(); U64 pre_reg_gen = ctrl_reg_gen(); - CTRL_CallStack *call_stacks = push_array(scratch.arena, CTRL_CallStack, threads_count); + D_CallStack *call_stacks = push_array(scratch.arena, D_CallStack, threads_count); { for EachIndex(idx, threads_count) { @@ -7011,31 +7011,31 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry //- rjf: build call stack tree Arena *arena = 0; - CTRL_CallStackTree *tree = 0; + D_CallStackTree *tree = 0; if(!stale) { U64 id_gen = 0; arena = arena_alloc(); - tree = push_array(arena, CTRL_CallStackTree, 1); - tree->root = push_array(arena, CTRL_CallStackTreeNode, 1); - MemoryCopyStruct(tree->root, &ctrl_call_stack_tree_node_nil); + tree = push_array(arena, D_CallStackTree, 1); + tree->root = push_array(arena, D_CallStackTreeNode, 1); + MemoryCopyStruct(tree->root, &d_call_stack_tree_node_nil); tree->root->id = id_gen; tree->slots_count = Max(1, threads_count); - tree->slots = push_array(arena, CTRL_CallStackTreeNode *, tree->slots_count); + tree->slots = push_array(arena, D_CallStackTreeNode *, tree->slots_count); id_gen += 1; for EachIndex(thread_idx, threads_count) { - CTRL_Handle thread = threads[thread_idx]; - CTRL_Handle process = threads_processes[thread_idx]; + D_Handle thread = threads[thread_idx]; + D_Handle process = threads_processes[thread_idx]; Arch arch = threads_arches[thread_idx]; - CTRL_CallStack call_stack = call_stacks[thread_idx]; - CTRL_CallStackTreeNode *thread_node = tree->root; + D_CallStack call_stack = call_stacks[thread_idx]; + D_CallStackTreeNode *thread_node = tree->root; for EachIndex(frame_idx, call_stack.frames_count) { U64 vaddr = regs_rip_from_arch_block(arch, call_stack.frames[frame_idx].regs); U64 depth = call_stack.frames[frame_idx].inline_depth; - CTRL_CallStackTreeNode *next_node = &ctrl_call_stack_tree_node_nil; - for(CTRL_CallStackTreeNode *child = thread_node->first; child != &ctrl_call_stack_tree_node_nil; child = child->next) + D_CallStackTreeNode *next_node = &d_call_stack_tree_node_nil; + for(D_CallStackTreeNode *child = thread_node->first; child != &d_call_stack_tree_node_nil; child = child->next) { if(ctrl_handle_match(child->process, process) && child->vaddr == vaddr && child->depth == depth) { @@ -7043,21 +7043,21 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry break; } } - if(next_node == &ctrl_call_stack_tree_node_nil) + if(next_node == &d_call_stack_tree_node_nil) { - next_node = push_array(arena, CTRL_CallStackTreeNode, 1); - MemoryCopyStruct(next_node, &ctrl_call_stack_tree_node_nil); + next_node = push_array(arena, D_CallStackTreeNode, 1); + MemoryCopyStruct(next_node, &d_call_stack_tree_node_nil); next_node->id = id_gen; SLLStackPush_N(tree->slots[next_node->id%tree->slots_count], next_node, hash_next); id_gen += 1; - SLLQueuePush_NZ(&ctrl_call_stack_tree_node_nil, thread_node->first, thread_node->last, next_node, next); + SLLQueuePush_NZ(&d_call_stack_tree_node_nil, thread_node->first, thread_node->last, next_node, next); next_node->parent = thread_node; thread_node->child_count += 1; } thread_node = next_node; } ctrl_handle_list_push(arena, &thread_node->threads, &thread); - for(CTRL_CallStackTreeNode *n = thread_node; n != &ctrl_call_stack_tree_node_nil; n = n->parent) + for(D_CallStackTreeNode *n = thread_node; n != &d_call_stack_tree_node_nil; n = n->parent) { n->all_descendant_threads_count += 1; } @@ -7092,15 +7092,15 @@ ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact) } } -internal CTRL_CallStackTree +internal D_CallStackTree ctrl_call_stack_tree(Access *access, U64 endt_us) { - CTRL_CallStackTree result = {&ctrl_call_stack_tree_node_nil}; + D_CallStackTree result = {&d_call_stack_tree_node_nil}; { AC_Artifact artifact = ac_artifact_from_key(access, str8_zero(), ctrl_call_stack_tree_artifact_create, ctrl_call_stack_tree_artifact_destroy, endt_us); if(artifact.u64[1] != 0) { - MemoryCopyStruct(&result, (CTRL_CallStackTree *)artifact.u64[1]); + MemoryCopyStruct(&result, (D_CallStackTree *)artifact.u64[1]); } } return result; diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 64a6651e..c076526a 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -1,56 +1,56 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef CTRL_CORE_H -#define CTRL_CORE_H +#ifndef DBG_ENGINE_CTRL_H +#define DBG_ENGINE_CTRL_H //////////////////////////////// //~ rjf: Unwind Types -typedef U32 CTRL_UnwindFlags; +typedef U32 D_UnwindFlags; enum { - CTRL_UnwindFlag_Error = (1<<0), - CTRL_UnwindFlag_Stale = (1<<1), + D_UnwindFlag_Error = (1<<0), + D_UnwindFlag_Stale = (1<<1), }; -typedef struct CTRL_UnwindStepResult CTRL_UnwindStepResult; -struct CTRL_UnwindStepResult +typedef struct D_UnwindStepResult D_UnwindStepResult; +struct D_UnwindStepResult { - CTRL_UnwindFlags flags; + D_UnwindFlags flags; }; -typedef struct CTRL_UnwindFrame CTRL_UnwindFrame; -struct CTRL_UnwindFrame +typedef struct D_UnwindFrame D_UnwindFrame; +struct D_UnwindFrame { void *regs; U64 cfa; }; -typedef struct CTRL_UnwindFrameNode CTRL_UnwindFrameNode; -struct CTRL_UnwindFrameNode +typedef struct D_UnwindFrameNode D_UnwindFrameNode; +struct D_UnwindFrameNode { - CTRL_UnwindFrameNode *next; - CTRL_UnwindFrameNode *prev; - CTRL_UnwindFrame v; + D_UnwindFrameNode *next; + D_UnwindFrameNode *prev; + D_UnwindFrame v; }; -typedef struct CTRL_UnwindFrameArray CTRL_UnwindFrameArray; -struct CTRL_UnwindFrameArray +typedef struct D_UnwindFrameArray D_UnwindFrameArray; +struct D_UnwindFrameArray { - CTRL_UnwindFrame *v; + D_UnwindFrame *v; U64 count; }; -typedef struct CTRL_Unwind CTRL_Unwind; -struct CTRL_Unwind +typedef struct D_Unwind D_Unwind; +struct D_Unwind { - CTRL_UnwindFrameArray frames; - CTRL_UnwindFlags flags; + D_UnwindFrameArray frames; + D_UnwindFlags flags; }; -typedef struct CTRL_FrameUnwindContext CTRL_FrameUnwindContext; -struct CTRL_FrameUnwindContext +typedef struct D_FrameUnwindContext D_FrameUnwindContext; +struct D_FrameUnwindContext { // DWARF U64 cfa; @@ -61,8 +61,8 @@ struct CTRL_FrameUnwindContext //////////////////////////////// //~ rjf: Call Stack Types -typedef struct CTRL_CallStackFrame CTRL_CallStackFrame; -struct CTRL_CallStackFrame +typedef struct D_CallStackFrame D_CallStackFrame; +struct D_CallStackFrame { U64 unwind_count; U64 inline_depth; @@ -70,58 +70,58 @@ struct CTRL_CallStackFrame U64 cfa; }; -typedef struct CTRL_CallStack CTRL_CallStack; -struct CTRL_CallStack +typedef struct D_CallStack D_CallStack; +struct D_CallStack { - CTRL_CallStackFrame *frames; + D_CallStackFrame *frames; U64 frames_count; - CTRL_CallStackFrame **concrete_frames; + D_CallStackFrame **concrete_frames; U64 concrete_frames_count; }; //////////////////////////////// //~ rjf: Call Stack Tree Types -typedef struct CTRL_CallStackTreeNode CTRL_CallStackTreeNode; -struct CTRL_CallStackTreeNode +typedef struct D_CallStackTreeNode D_CallStackTreeNode; +struct D_CallStackTreeNode { - CTRL_CallStackTreeNode *hash_next; - CTRL_CallStackTreeNode *first; - CTRL_CallStackTreeNode *last; - CTRL_CallStackTreeNode *next; - CTRL_CallStackTreeNode *parent; + D_CallStackTreeNode *hash_next; + D_CallStackTreeNode *first; + D_CallStackTreeNode *last; + D_CallStackTreeNode *next; + D_CallStackTreeNode *parent; U64 child_count; U64 id; - CTRL_Handle process; + D_Handle process; U64 vaddr; U64 depth; - CTRL_HandleList threads; + D_HandleList threads; U64 all_descendant_threads_count; }; -typedef struct CTRL_CallStackTree CTRL_CallStackTree; -struct CTRL_CallStackTree +typedef struct D_CallStackTree D_CallStackTree; +struct D_CallStackTree { - CTRL_CallStackTreeNode *root; + D_CallStackTreeNode *root; U64 slots_count; - CTRL_CallStackTreeNode **slots; + D_CallStackTreeNode **slots; }; //////////////////////////////// //~ rjf: Evaluation Spaces -typedef U64 CTRL_EvalSpaceKind; +typedef U64 D_EvalSpaceKind; enum { - CTRL_EvalSpaceKind_Entity = E_SpaceKind_FirstUserDefined, - CTRL_EvalSpaceKind_FirstUserDefined, + D_EvalSpaceKind_Entity = E_SpaceKind_FirstUserDefined, + D_EvalSpaceKind_FirstUserDefined, }; //////////////////////////////// //~ rjf: Process Memory Types -typedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice; -struct CTRL_ProcessMemorySlice +typedef struct D_ProcessMemorySlice D_ProcessMemorySlice; +struct D_ProcessMemorySlice { String8 data; U64 *byte_bad_flags; @@ -134,49 +134,49 @@ struct CTRL_ProcessMemorySlice //////////////////////////////// //~ rjf: Thread Register Cache Types -typedef struct CTRL_ThreadRegCacheNode CTRL_ThreadRegCacheNode; -struct CTRL_ThreadRegCacheNode +typedef struct D_ThreadRegCacheNode D_ThreadRegCacheNode; +struct D_ThreadRegCacheNode { - CTRL_ThreadRegCacheNode *next; - CTRL_ThreadRegCacheNode *prev; - CTRL_Handle handle; + D_ThreadRegCacheNode *next; + D_ThreadRegCacheNode *prev; + D_Handle handle; U64 block_size; void *block; U64 reg_gen; }; -typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; -struct CTRL_ThreadRegCacheSlot +typedef struct D_ThreadRegCacheSlot D_ThreadRegCacheSlot; +struct D_ThreadRegCacheSlot { - CTRL_ThreadRegCacheNode *first; - CTRL_ThreadRegCacheNode *last; + D_ThreadRegCacheNode *first; + D_ThreadRegCacheNode *last; }; -typedef struct CTRL_ThreadRegCacheStripe CTRL_ThreadRegCacheStripe; -struct CTRL_ThreadRegCacheStripe +typedef struct D_ThreadRegCacheStripe D_ThreadRegCacheStripe; +struct D_ThreadRegCacheStripe { Arena *arena; RWMutex rw_mutex; }; -typedef struct CTRL_ThreadRegCache CTRL_ThreadRegCache; -struct CTRL_ThreadRegCache +typedef struct D_ThreadRegCache D_ThreadRegCache; +struct D_ThreadRegCache { U64 slots_count; - CTRL_ThreadRegCacheSlot *slots; + D_ThreadRegCacheSlot *slots; U64 stripes_count; - CTRL_ThreadRegCacheStripe *stripes; + D_ThreadRegCacheStripe *stripes; }; //////////////////////////////// //~ rjf: Module Image Info Cache Types -typedef struct CTRL_ModuleImageInfoCacheNode CTRL_ModuleImageInfoCacheNode; -struct CTRL_ModuleImageInfoCacheNode +typedef struct D_ModuleImageInfoCacheNode D_ModuleImageInfoCacheNode; +struct D_ModuleImageInfoCacheNode { - CTRL_ModuleImageInfoCacheNode *next; - CTRL_ModuleImageInfoCacheNode *prev; - CTRL_Handle module; + D_ModuleImageInfoCacheNode *next; + D_ModuleImageInfoCacheNode *prev; + D_Handle module; Arena *arena; PE_IntelPdata *pdatas; U64 pdatas_count; @@ -191,40 +191,40 @@ struct CTRL_ModuleImageInfoCacheNode String8 raddbg_data; }; -typedef struct CTRL_ModuleImageInfoCacheSlot CTRL_ModuleImageInfoCacheSlot; -struct CTRL_ModuleImageInfoCacheSlot +typedef struct D_ModuleImageInfoCacheSlot D_ModuleImageInfoCacheSlot; +struct D_ModuleImageInfoCacheSlot { - CTRL_ModuleImageInfoCacheNode *first; - CTRL_ModuleImageInfoCacheNode *last; + D_ModuleImageInfoCacheNode *first; + D_ModuleImageInfoCacheNode *last; }; -typedef struct CTRL_ModuleImageInfoCacheStripe CTRL_ModuleImageInfoCacheStripe; -struct CTRL_ModuleImageInfoCacheStripe +typedef struct D_ModuleImageInfoCacheStripe D_ModuleImageInfoCacheStripe; +struct D_ModuleImageInfoCacheStripe { Arena *arena; RWMutex rw_mutex; }; -typedef struct CTRL_ModuleImageInfoCache CTRL_ModuleImageInfoCache; -struct CTRL_ModuleImageInfoCache +typedef struct D_ModuleImageInfoCache D_ModuleImageInfoCache; +struct D_ModuleImageInfoCache { U64 slots_count; - CTRL_ModuleImageInfoCacheSlot *slots; + D_ModuleImageInfoCacheSlot *slots; U64 stripes_count; - CTRL_ModuleImageInfoCacheStripe *stripes; + D_ModuleImageInfoCacheStripe *stripes; }; //////////////////////////////// //~ rjf: Touched Debug Info Directory Cache -typedef struct CTRL_DbgDirNode CTRL_DbgDirNode; -struct CTRL_DbgDirNode +typedef struct D_DbgDirNode D_DbgDirNode; +struct D_DbgDirNode { - CTRL_DbgDirNode *first; - CTRL_DbgDirNode *last; - CTRL_DbgDirNode *next; - CTRL_DbgDirNode *prev; - CTRL_DbgDirNode *parent; + D_DbgDirNode *first; + D_DbgDirNode *last; + D_DbgDirNode *next; + D_DbgDirNode *prev; + D_DbgDirNode *parent; String8 name; U64 search_count; U64 child_count; @@ -234,8 +234,8 @@ struct CTRL_DbgDirNode //////////////////////////////// //~ rjf: Control Thread Evaluation Scopes -typedef struct CTRL_EvalScope CTRL_EvalScope; -struct CTRL_EvalScope +typedef struct D_EvalScope D_EvalScope; +struct D_EvalScope { Access *access; E_BaseCtx base_ctx; @@ -246,19 +246,19 @@ struct CTRL_EvalScope //////////////////////////////// //~ rjf: Module Requirement Cache Types -typedef struct CTRL_ModuleReqCacheNode CTRL_ModuleReqCacheNode; -struct CTRL_ModuleReqCacheNode +typedef struct D_ModuleReqCacheNode D_ModuleReqCacheNode; +struct D_ModuleReqCacheNode { - CTRL_ModuleReqCacheNode *next; - CTRL_Handle module; + D_ModuleReqCacheNode *next; + D_Handle module; B32 required; }; //////////////////////////////// //~ rjf: Wakeup Hook Function Types -#define CTRL_WAKEUP_FUNCTION_DEF(name) void name(void) -typedef CTRL_WAKEUP_FUNCTION_DEF(CTRL_WakeupFunctionType); +#define D_WAKEUP_FUNCTION_DEF(name) void name(void) +typedef D_WAKEUP_FUNCTION_DEF(D_WakeupFunctionType); //////////////////////////////// //~ rjf: Main State Types @@ -267,15 +267,15 @@ typedef struct D_CtrlState D_CtrlState; struct D_CtrlState { Arena *arena; - CTRL_WakeupFunctionType *wakeup_hook; + D_WakeupFunctionType *wakeup_hook; // rjf: name -> register/alias hash tables for eval E_String2NumMap arch_string2reg_tables[Arch_COUNT]; E_String2NumMap arch_string2alias_tables[Arch_COUNT]; // rjf: caches - CTRL_ThreadRegCache thread_reg_cache; - CTRL_ModuleImageInfoCache module_image_info_cache; + D_ThreadRegCache thread_reg_cache; + D_ModuleImageInfoCache module_image_info_cache; // rjf: generations U64 run_gen; @@ -305,7 +305,7 @@ struct D_CtrlState Thread ctrl_thread; Log *ctrl_thread_log; RWMutex ctrl_thread_entity_ctx_rw_mutex; - CTRL_EntityCtxRWStore *ctrl_thread_entity_store; + D_EntityCtxRWStore *ctrl_thread_entity_store; E_Cache *ctrl_thread_eval_cache; Arena *ctrl_thread_msg_process_arena; Arena *dmn_event_arena; @@ -314,12 +314,12 @@ struct D_CtrlState DMN_EventNode *free_dmn_event_node; Arena *user_entry_point_arena; String8List user_entry_points; - U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; + U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64]; U64 process_counter; Arena *dbg_dir_arena; - CTRL_DbgDirNode *dbg_dir_root; + D_DbgDirNode *dbg_dir_root; U64 module_req_cache_slots_count; - CTRL_ModuleReqCacheNode **module_req_cache_slots; + D_ModuleReqCacheNode **module_req_cache_slots; String8List msg_user_bp_touched_files; String8List msg_user_bp_touched_symbols; }; @@ -328,60 +328,55 @@ struct D_CtrlState //~ rjf: Globals global D_CtrlState *d_ctrl_state = 0; -read_only global CTRL_Entity ctrl_entity_nil = +read_only global D_Entity d_entity_nil = { - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, - &ctrl_entity_nil, + &d_entity_nil, + &d_entity_nil, + &d_entity_nil, + &d_entity_nil, + &d_entity_nil, }; -read_only global CTRL_CallStackTreeNode ctrl_call_stack_tree_node_nil = +read_only global D_CallStackTreeNode d_call_stack_tree_node_nil = { 0, - &ctrl_call_stack_tree_node_nil, - &ctrl_call_stack_tree_node_nil, - &ctrl_call_stack_tree_node_nil, - &ctrl_call_stack_tree_node_nil, + &d_call_stack_tree_node_nil, + &d_call_stack_tree_node_nil, + &d_call_stack_tree_node_nil, + &d_call_stack_tree_node_nil, }; -thread_static CTRL_EntityCtxLookupAccel *ctrl_entity_ctx_lookup_accel = 0; - -//////////////////////////////// -//~ rjf: Logging Markup - -#define CTRL_CtrlThreadLogScope DeferLoop(log_scope_begin(), ctrl_thread__end_and_flush_log()) +thread_static D_EntityCtxLookupAccel *d_entity_ctx_lookup_accel = 0; //////////////////////////////// //~ rjf: Basic Type Functions internal U64 ctrl_hash_from_string(String8 string); -internal U64 ctrl_hash_from_handle(CTRL_Handle handle); -internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); -internal CTRL_ExceptionKind ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind); -internal CTRL_TlsModel ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type); -internal String8 ctrl_string_from_event_kind(CTRL_EventKind kind); -internal String8 ctrl_string_from_msg_kind(CTRL_MsgKind kind); -internal CTRL_EntityKind ctrl_entity_kind_from_string(String8 string); -internal DMN_TrapFlags ctrl_dmn_trap_flags_from_user_breakpoint_flags(CTRL_UserBreakpointFlags flags); -internal CTRL_UserBreakpointFlags ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags); +internal U64 ctrl_hash_from_handle(D_Handle handle); +internal D_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); +internal D_ExceptionKind ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind); +internal D_TlsModel ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type); +internal String8 ctrl_string_from_event_kind(D_EventKind kind); +internal String8 ctrl_string_from_msg_kind(D_MsgKind kind); +internal D_EntityKind ctrl_entity_kind_from_string(String8 string); +internal DMN_TrapFlags ctrl_dmn_trap_flags_from_user_breakpoint_flags(D_BreakpointFlags flags); +internal D_BreakpointFlags ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags); //////////////////////////////// //~ rjf: Handle Type Functions -internal CTRL_Handle ctrl_handle_zero(void); -internal CTRL_Handle ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle); -internal B32 ctrl_handle_match(CTRL_Handle a, CTRL_Handle b); -internal void ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair); -internal CTRL_HandleList ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src); -internal CTRL_HandleArray ctrl_handle_array_from_list(Arena *arena, CTRL_HandleList *src); -internal String8 ctrl_string_from_handle(Arena *arena, CTRL_Handle handle); -internal CTRL_Handle ctrl_handle_from_string(String8 string); +internal D_Handle ctrl_handle_zero(void); +internal D_Handle ctrl_handle_make(D_MachineID machine_id, DMN_Handle dmn_handle); +internal B32 ctrl_handle_match(D_Handle a, D_Handle b); +internal void ctrl_handle_list_push(Arena *arena, D_HandleList *list, D_Handle *pair); +internal D_HandleList ctrl_handle_list_copy(Arena *arena, D_HandleList *src); +internal D_HandleArray ctrl_handle_array_from_list(Arena *arena, D_HandleList *src); +internal String8 ctrl_string_from_handle(Arena *arena, D_Handle handle); +internal D_Handle ctrl_handle_from_string(String8 string); //////////////////////////////// //~ rjf: Trap Type Functions -internal void ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap); -internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src); +internal void ctrl_trap_list_push(Arena *arena, D_TrapList *list, D_Trap *trap); +internal D_TrapList ctrl_trap_list_copy(Arena *arena, D_TrapList *src); //////////////////////////////// //~ rjf: User Breakpoint Type Functions @@ -393,137 +388,137 @@ internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CT //~ rjf: Message Type Functions //- rjf: deep copying -internal void ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src); +internal void ctrl_msg_deep_copy(Arena *arena, D_Msg *dst, D_Msg *src); //- rjf: list building -internal CTRL_Msg *ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list); -internal CTRL_MsgList ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src); -internal void ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src); +internal D_Msg *ctrl_msg_list_push(Arena *arena, D_MsgList *list); +internal D_MsgList ctrl_msg_list_deep_copy(Arena *arena, D_MsgList *src); +internal void ctrl_msg_list_concat_in_place(D_MsgList *dst, D_MsgList *src); //- rjf: serialization -internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs); -internal CTRL_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string); +internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs); +internal D_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string); //////////////////////////////// //~ rjf: Event Type Functions //- rjf: list building -internal CTRL_Event *ctrl_event_list_push(Arena *arena, CTRL_EventList *list); -internal void ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push); +internal D_Event *ctrl_event_list_push(Arena *arena, D_EventList *list); +internal void ctrl_event_list_concat_in_place(D_EventList *dst, D_EventList *to_push); //- rjf: serialization -internal String8 ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max); -internal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); +internal String8 ctrl_serialized_string_from_event(Arena *arena, D_Event *event, U64 max); +internal D_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); //////////////////////////////// //~ rjf: Entity Type Functions //- rjf: entity list data structures -internal void ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity); -internal CTRL_EntityList ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_HandleList *list); -#define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &ctrl_entity_nil) +internal void ctrl_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity); +internal D_EntityList ctrl_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList *list); +#define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &d_entity_nil) //- rjf: entity array data structure -internal CTRL_EntityArray ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list); -#define ctrl_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &ctrl_entity_nil) +internal D_EntityArray ctrl_entity_array_from_list(Arena *arena, D_EntityList *list); +#define ctrl_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &d_entity_nil) //- rjf: entity context (entity group read-only) functions -internal CTRL_Entity *ctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle); -internal CTRL_Entity *ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind); -internal CTRL_Entity *ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind); -internal CTRL_Entity *ctrl_process_from_entity(CTRL_Entity *entity); -internal CTRL_Entity *ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr); -internal DI_Key ctrl_dbgi_key_from_module(CTRL_Entity *module); -internal CTRL_Entity *ctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTRL_EntityList *candidates); -internal U64 ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff); -internal U64 ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr); -internal Rng1U64 ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range); -internal Rng1U64 ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range); -internal B32 ctrl_entity_tree_is_frozen(CTRL_Entity *root); +internal D_Entity *ctrl_entity_from_handle(D_EntityCtx *ctx, D_Handle handle); +internal D_Entity *ctrl_entity_child_from_kind(D_Entity *parent, D_EntityKind kind); +internal D_Entity *ctrl_entity_ancestor_from_kind(D_Entity *entity, D_EntityKind kind); +internal D_Entity *ctrl_process_from_entity(D_Entity *entity); +internal D_Entity *ctrl_module_from_process_vaddr(D_Entity *process, U64 vaddr); +internal DI_Key ctrl_dbgi_key_from_module(D_Entity *module); +internal D_Entity *ctrl_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityList *candidates); +internal U64 ctrl_vaddr_from_voff(D_Entity *module, U64 voff); +internal U64 ctrl_voff_from_vaddr(D_Entity *module, U64 vaddr); +internal Rng1U64 ctrl_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_range); +internal Rng1U64 ctrl_voff_range_from_vaddr_range(D_Entity *module, Rng1U64 vaddr_range); +internal B32 ctrl_entity_tree_is_frozen(D_Entity *root); //- rjf: entity tree iteration -internal CTRL_EntityRec ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off); -#define ctrl_entity_rec_depth_first_pre(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, next), OffsetOf(CTRL_Entity, first)) -#define ctrl_entity_rec_depth_first_post(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, prev), OffsetOf(CTRL_Entity, last)) +internal D_EntityRec ctrl_entity_rec_depth_first(D_Entity *entity, D_Entity *subtree_root, U64 sib_off, U64 child_off); +#define ctrl_entity_rec_depth_first_pre(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(D_Entity, next), OffsetOf(D_Entity, first)) +#define ctrl_entity_rec_depth_first_post(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(D_Entity, prev), OffsetOf(D_Entity, last)) //- rjf: entity ctx r/w store state functions -internal CTRL_EntityCtxRWStore *ctrl_entity_ctx_rw_store_alloc(void); -internal void ctrl_entity_ctx_rw_store_release(CTRL_EntityCtxRWStore *store); +internal D_EntityCtxRWStore *ctrl_entity_ctx_rw_store_alloc(void); +internal void ctrl_entity_ctx_rw_store_release(D_EntityCtxRWStore *store); //- rjf: string allocation/deletion internal U64 ctrl_name_bucket_num_from_string_size(U64 size); -internal String8 ctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string); -internal void ctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string); +internal String8 ctrl_entity_string_alloc(D_EntityCtxRWStore *store, String8 string); +internal void ctrl_entity_string_release(D_EntityCtxRWStore *store, String8 string); //- rjf: entity construction/deletion -internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id); -internal void ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity); +internal D_Entity *ctrl_entity_alloc(D_EntityCtxRWStore *store, D_Entity *parent, D_EntityKind kind, Arch arch, D_Handle handle, U64 id); +internal void ctrl_entity_release(D_EntityCtxRWStore *store, D_Entity *entity); //- rjf: entity equipment -internal void ctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, String8 string); +internal void ctrl_entity_equip_string(D_EntityCtxRWStore *store, D_Entity *entity, String8 string); //- rjf: accelerated entity context lookups -internal CTRL_EntityCtxLookupAccel *ctrl_thread_entity_ctx_lookup_accel(void); -internal CTRL_EntityArray ctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind); -internal CTRL_EntityList ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key); -internal CTRL_Entity *ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id); +internal D_EntityCtxLookupAccel *ctrl_thread_entity_ctx_lookup_accel(void); +internal D_EntityArray ctrl_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind); +internal D_EntityList ctrl_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key); +internal D_Entity *ctrl_thread_from_id(D_EntityCtx *ctx, U64 id); //- rjf: applying events to entity caches -internal void ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list); +internal void ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list); //////////////////////////////// //~ rjf: Wakeup Callback Registration -internal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook); +internal void ctrl_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook); //////////////////////////////// //~ rjf: Thread Register Functions //- rjf: thread register cache reading -internal void *ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle); -internal U64 ctrl_tls_root_vaddr_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); -internal U64 ctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); -internal U64 ctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle); +internal void *ctrl_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle); +internal U64 ctrl_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle); +internal U64 ctrl_rip_from_thread(D_EntityCtx *ctx, D_Handle handle); +internal U64 ctrl_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle); //- rjf: thread register writing -internal B32 ctrl_thread_write_reg_block(CTRL_Handle thread, void *block); +internal B32 ctrl_thread_write_reg_block(D_Handle thread, void *block); //////////////////////////////// //~ rjf: Module Image Info Functions //- rjf: cache lookups -internal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff); -internal U64 ctrl_entry_point_voff_from_module(CTRL_Handle module_handle); -internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle); -internal String8 ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle); +internal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff); +internal U64 ctrl_entry_point_voff_from_module(D_Handle module_handle); +internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle); +internal String8 ctrl_raddbg_data_from_module(Arena *arena, D_Handle module_handle); //////////////////////////////// //~ Process Info Functions -internal Arch ctrl_arch_from_process_handle(CTRL_Handle process_handle); +internal Arch ctrl_arch_from_process_handle(D_Handle process_handle); //////////////////////////////// //~ rjf: Unwinding Functions //- rjf: unwind deep copier -internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src); +internal D_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, D_Unwind *src); //- DWARF -internal CTRL_UnwindStepResult ctrl_establish_frame_unwind_context__dwarf(Arena *arena, CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us, CTRL_FrameUnwindContext *ctx_out); -internal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, Arch arch, void *regs, CTRL_FrameUnwindContext *frame_ctx, U64 endt_us); +internal D_UnwindStepResult ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out); +internal D_UnwindStepResult ctrl_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us); //- rjf: [x64] internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); -internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); +internal D_UnwindStepResult ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); //- rjf: abstracted full unwind -internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us); +internal D_Unwind ctrl_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us); //////////////////////////////// //~ rjf: Call Stack Building Functions -internal CTRL_CallStack ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *base_unwind); -internal CTRL_CallStackFrame *ctrl_call_stack_frame_from_unwind_and_inline_depth(CTRL_CallStack *call_stack, U64 unwind_count, U64 inline_depth); +internal D_CallStack ctrl_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwind); +internal D_CallStackFrame *ctrl_call_stack_frame_from_unwind_and_inline_depth(D_CallStack *call_stack, U64 unwind_count, U64 inline_depth); //////////////////////////////// //~ rjf: Halting All Attached Processes @@ -546,75 +541,75 @@ internal E_String2NumMap *ctrl_string2alias_from_arch(Arch arch); //~ rjf: Control-Thread Functions //- rjf: user -> control thread communication -internal B32 ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us); -internal CTRL_MsgList ctrl_u2c_pop_msgs(Arena *arena); +internal B32 ctrl_u2c_push_msgs(D_MsgList *msgs, U64 endt_us); +internal D_MsgList ctrl_u2c_pop_msgs(Arena *arena); //- rjf: control -> user thread communication -internal void ctrl_c2u_push_events(CTRL_EventList *events); -internal CTRL_EventList ctrl_c2u_pop_events(Arena *arena); +internal void ctrl_c2u_push_events(D_EventList *events); +internal D_EventList ctrl_c2u_pop_events(Arena *arena); //- rjf: entry point internal void ctrl_thread__entry_point(void *p); //- rjf: breakpoint resolution -internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out); //- rjf: module lifetime open/close work -internal void ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); -internal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range); +internal void ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); +internal void ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range); //- rjf: attached process running/event gathering -internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof); +internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN_RunCtrls *run_ctrls, D_Spoof *spoof); //- rjf: eval helpers internal U64 ctrl_eval_space_gen(E_Space space); internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); //- rjf: control thread eval scopes -internal CTRL_EvalScope *ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread); -internal void ctrl_thread__eval_scope_end(CTRL_EvalScope *scope); +internal D_EvalScope *ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, D_Entity *thread); +internal void ctrl_thread__eval_scope_end(D_EvalScope *scope); //- rjf: log flusher internal void ctrl_thread__end_and_flush_log(void); //- rjf: msg kind implementations -internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); -internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); +internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); //////////////////////////////// //~ rjf: Process Memory Artifact Cache Hooks / Lookups internal AC_Artifact ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); internal void ctrl_memory_artifact_destroy(AC_Artifact artifact); -internal C_Key ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale); +internal C_Key ctrl_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale); //- rjf: process memory reading helpers -internal CTRL_ProcessMemorySlice ctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us); -internal B32 ctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); +internal D_ProcessMemorySlice ctrl_process_memory_slice_from_vaddr_range(Arena *arena, D_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us); +internal B32 ctrl_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); #define ctrl_process_memory_read_struct(process, vaddr, is_stale_out, ptr, endt_us) ctrl_process_memory_read((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) //- rjf: process memory writing -internal B32 ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src); +internal B32 ctrl_process_write(D_Handle process, Rng1U64 range, void *src); //////////////////////////////// //~ rjf: Call Stack Artifact Cache Hooks / Lookups internal AC_Artifact ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); internal void ctrl_call_stack_artifact_destroy(AC_Artifact artifact); -internal CTRL_CallStack ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us); +internal D_CallStack ctrl_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us); //////////////////////////////// //~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups internal AC_Artifact ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); internal void ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact); -internal CTRL_CallStackTree ctrl_call_stack_tree(Access *access, U64 endt_us); +internal D_CallStackTree ctrl_call_stack_tree(Access *access, U64 endt_us); -#endif // CTRL_CORE_H +#endif // DBG_ENGINE_CTRL_H diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 1bd5cee9..9050cf3f 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -204,7 +204,7 @@ d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams * // of debug events which it is passed from the OS. // // These are "high-level traps" because they can have specific behavioral info -// attached to them. These are encoded via the `CTRL_TrapFlags` type, which +// attached to them. These are encoded via the `D_TrapFlags` type, which // allow expression of the following behaviors: // // - end-stepping: when this trap is hit, it will end the stepping operation, @@ -286,13 +286,13 @@ d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams * // at them with the "save-stack-pointer | single-step-after" behaviors. internal D_TrapNet -d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread) +d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread) { Temp scratch = scratch_begin(&arena, 1); D_TrapNet result = {0}; // rjf: thread => unpacked info - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); Arch arch = thread->arch; U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); @@ -300,7 +300,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread) String8 machine_code = {0}; { Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, os_now_microseconds()+5000); + D_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, os_now_microseconds()+5000); machine_code = machine_code_slice.data; } @@ -315,7 +315,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread) // rjf: call => run until call returns if(inst.flags & DASM_InstFlag_Call || inst.flags & DASM_InstFlag_Repeats) { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, ip_vaddr+inst.size}; + D_Trap trap = {D_TrapFlag_EndStepping, ip_vaddr+inst.size}; ctrl_trap_list_push(arena, &result.traps, &trap); } } @@ -325,7 +325,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread) } internal D_TrapNet -d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) +d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) { Temp scratch = scratch_begin(&arena, 1); log_infof("step_over_line:\n{\n"); @@ -334,8 +334,8 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) // rjf: thread => info Arch arch = thread->arch; U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr); log_infof("dbgi_key: {0x%I64x, 0x%I64x}\n", dbgi_key.u64[0], dbgi_key.u64[1]); @@ -393,7 +393,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+50000); + D_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+50000); machine_code = machine_code_slice.data; good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); LogInfoNamedBlockF("machine_code_slice") @@ -440,7 +440,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) { DASM_CtrlFlowPoint *point = &n->v; - CTRL_TrapFlags flags = 0; + D_TrapFlags flags = 0; B32 add = 1; U64 trap_addr = point->vaddr; @@ -449,7 +449,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) DASM_InstFlag_UnconditionalJump| DASM_InstFlag_Return)) { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping); + flags |= (D_TrapFlag_SingleStepAfterHit|D_TrapFlag_EndStepping); // rjf: omit if this jump stays inside of this line if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) @@ -471,7 +471,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) if(point->jump_dest_vaddr != 0) { trap_addr = point->jump_dest_vaddr; - flags &= ~CTRL_TrapFlag_SingleStepAfterHit; + flags &= ~D_TrapFlag_SingleStepAfterHit; } } @@ -479,19 +479,19 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) // rjf: call => place spoof at return spot in stack, single-step after hitting else if(point->inst_flags & DASM_InstFlag_Call) { - flags |= (CTRL_TrapFlag_BeginSpoofMode|CTRL_TrapFlag_SingleStepAfterHit); + flags |= (D_TrapFlag_BeginSpoofMode|D_TrapFlag_SingleStepAfterHit); } // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); + flags |= (D_TrapFlag_SingleStepAfterHit|D_TrapFlag_SaveStackPointer); } // rjf: add if appropriate if(add) { - CTRL_Trap trap = {flags, trap_addr}; + D_Trap trap = {flags, trap_addr}; ctrl_trap_list_push(arena, &result.traps, &trap); } } @@ -514,7 +514,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) } if(!opl_in_line) { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, opl}; + D_Trap trap = {D_TrapFlag_EndStepping, opl}; ctrl_trap_list_push(arena, &result.traps, &trap); } } @@ -528,7 +528,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) } // rjf: log - LogInfoNamedBlockF("traps") for(CTRL_TrapNode *n = result.traps.first; n != 0; n = n->next) + LogInfoNamedBlockF("traps") for(D_TrapNode *n = result.traps.first; n != 0; n = n->next) { log_infof("{flags:0x%x, vaddr:0x%I64x}\n", n->v.flags, n->v.vaddr); } @@ -539,7 +539,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread) } internal D_TrapNet -d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) +d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) { Temp scratch = scratch_begin(&arena, 1); D_TrapNet result = {0}; @@ -547,8 +547,8 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) // rjf: thread => info Arch arch = thread->arch; U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); // rjf: ip => line info @@ -604,7 +604,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+5000); + D_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+5000); machine_code = machine_code_slice.data; good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); } @@ -638,7 +638,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next) { DASM_CtrlFlowPoint *point = &n->v; - CTRL_TrapFlags flags = 0; + D_TrapFlags flags = 0; B32 add = 1; U64 trap_addr = point->vaddr; @@ -649,7 +649,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) point->jump_dest_vaddr != 0) { U64 jump_dest_vaddr = point->jump_dest_vaddr; - CTRL_Entity *jump_dest_module = ctrl_module_from_process_vaddr(process, jump_dest_vaddr); + D_Entity *jump_dest_module = ctrl_module_from_process_vaddr(process, jump_dest_vaddr); U64 jump_dest_voff = ctrl_voff_from_vaddr(jump_dest_module, jump_dest_vaddr); DI_Key jump_dest_dbgi_key = ctrl_dbgi_key_from_module(jump_dest_module); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, jump_dest_dbgi_key, jump_dest_voff); @@ -665,7 +665,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) DASM_InstFlag_UnconditionalJump| DASM_InstFlag_Return)) { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck); + flags |= (D_TrapFlag_SingleStepAfterHit|D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck); // rjf: omit if this jump stays inside of this line if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr)) @@ -687,20 +687,20 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) if(point->jump_dest_vaddr != 0) { trap_addr = point->jump_dest_vaddr; - flags &= ~CTRL_TrapFlag_SingleStepAfterHit; + flags &= ~D_TrapFlag_SingleStepAfterHit; } } // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) { - flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer); + flags |= (D_TrapFlag_SingleStepAfterHit|D_TrapFlag_SaveStackPointer); } // rjf: add if appropriate if(add) { - CTRL_Trap trap = {flags, trap_addr}; + D_Trap trap = {flags, trap_addr}; ctrl_trap_list_push(arena, &result.traps, &trap); } } @@ -723,7 +723,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) } if(!opl_in_line) { - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, opl}; + D_Trap trap = {D_TrapFlag_EndStepping, opl}; ctrl_trap_list_push(arena, &result.traps, &trap); } } @@ -1064,7 +1064,7 @@ d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num) //~ rjf: Process/Thread/Module Info Lookups internal U64 -d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) +d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr) { ProfBeginFunction(); U64 base_vaddr = 0; @@ -1073,18 +1073,18 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 Temp scratch = scratch_begin(0, 0); //- rjf: unpack module info - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); U64 addr_size = byte_size_from_arch(process->arch); switch(process->tls_model) { - case CTRL_TlsModel_Null: {}break; - case CTRL_TlsModel_WinodwsNt: + case D_TlsModel_Null: {}break; + case D_TlsModel_WinodwsNt: { // read thread local base pointer out of TEB U64 thread_local_base = root_vaddr; U64 tls_addr_array = 0; - CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_local_base, thread_local_base + addr_size), 0, 0); + D_ProcessMemorySlice tls_addr_array_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_local_base, thread_local_base + addr_size), 0, 0); String8 tls_array_vaddr_data = tls_addr_array_slice.data; if(tls_array_vaddr_data.size == addr_size) { @@ -1093,7 +1093,7 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 // read thread local storage pointer (array of TLS pointers, one per module) U64 tls_ptr_vaddr = tls_array_vaddr + module->tls_index * addr_size; - CTRL_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); + D_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); String8 result_data = result_slice.data; if(result_data.size == addr_size) { @@ -1101,7 +1101,7 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 } } }break; - case CTRL_TlsModel_Gnu: + case D_TlsModel_Gnu: { if(module->tls_index > 0) // zero is reserved for the generation counter { @@ -1109,7 +1109,7 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 U64 dtv_base = root_vaddr; U64 dtv_size = addr_size * 2; // union dtv { size_t counter; struct dtv_pointer { void *val, *to_free; }; }; U64 dtv_pointer_vaddr = dtv_base + module->tls_index * dtv_size; - CTRL_ProcessMemorySlice dtv_pointer_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(dtv_pointer_vaddr, dtv_pointer_vaddr + dtv_size), 0, 0); + D_ProcessMemorySlice dtv_pointer_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(dtv_pointer_vaddr, dtv_pointer_vaddr + dtv_size), 0, 0); String8 dtv_pointer_data = dtv_pointer_slice.data; if(dtv_pointer_data.size == dtv_size) { @@ -1139,7 +1139,7 @@ d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 //- rjf: stopped info from the control thread -internal CTRL_Event +internal D_Event d_ctrl_last_stop_event(void) { return d_user_state->ctrl_last_stop_event; @@ -1182,10 +1182,10 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena) { DI_KeyList dbgis = {0}; - CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); + D_EntityArray modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); for EachIndex(idx, modules.count) { - CTRL_Entity *module = modules.v[idx]; + D_Entity *module = modules.v[idx]; DI_Key key = ctrl_dbgi_key_from_module(module); di_key_list_push(arena, &dbgis, key); } @@ -1195,14 +1195,14 @@ d_push_active_dbgi_key_list(Arena *arena) //- rjf: per-run caches internal U64 -d_query_cached_rip_from_thread(CTRL_Entity *thread) +d_query_cached_rip_from_thread(D_Entity *thread) { U64 result = d_query_cached_rip_from_thread_unwind(thread, 0); return result; } internal U64 -d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) +d_query_cached_rip_from_thread_unwind(D_Entity *thread, U64 unwind_count) { U64 result = 0; if(unwind_count == 0) @@ -1212,7 +1212,7 @@ d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) else { Access *access = access_open(); - CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); + D_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); if(callstack.concrete_frames_count != 0) { result = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->regs); @@ -1223,11 +1223,11 @@ d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) } internal U64 -d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) +d_query_cached_cfa_from_thread_unwind(D_Entity *thread, U64 unwind_count) { U64 cfa = 0; Access *access = access_open(); - CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); + D_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); if(callstack.concrete_frames_count != 0) { cfa = callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->cfa; @@ -1237,7 +1237,7 @@ d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count) } internal U64 -d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr) +d_query_cached_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr) { U64 result = 0; for(U64 cache_idx = 0; cache_idx < ArrayCount(d_user_state->tls_base_caches); cache_idx += 1) @@ -1252,7 +1252,7 @@ d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 ro { break; } - CTRL_Handle handle = process->handle; + D_Handle handle = process->handle; U64 hash = d_hash_from_seed_string(d_hash_from_string(str8_struct(&handle)), str8_struct(&rip_vaddr)); U64 slot_idx = hash%cache->slots_count; D_RunTLSBaseCacheSlot *slot = &cache->slots[slot_idx]; @@ -1426,16 +1426,16 @@ d_next_cmd(D_Cmd **cmd) //~ rjf: Main Layer Top-Level Calls internal D_EventList -d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]) +d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64]) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); - D_EventList result = {0}; d_user_state->frame_index += 1; ////////////////////////////// //- rjf: sync with ctrl thread // + D_EventList events = {0}; ProfScope("sync with ctrl thread") { //- rjf: grab next reggen/memgen @@ -1443,13 +1443,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P U64 new_reg_gen = ctrl_reg_gen(); //- rjf: consume & process events - CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); + events = ctrl_c2u_pop_events(arena); ctrl_entity_store_apply_events(d_user_state->ctrl_entity_store, &events); - for(CTRL_EventNode *event_n = events.first; + for(D_EventNode *event_n = events.first; event_n != 0; event_n = event_n->next) { - CTRL_Event *event = &event_n->v; + D_Event *event = &event_n->v; log_infof("ctrl_event:\n{\n"); log_infof("kind: \"%S\"\n", ctrl_string_from_event_kind(event->kind)); log_infof("entity_id: %u\n", event->entity_id); @@ -1457,31 +1457,26 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { default:{}break; - //- rjf: errors - - case CTRL_EventKind_Error: + case D_EventKind_Error: { log_user_error(event->string); }break; - //- rjf: starts/stops - - case CTRL_EventKind_Started: + case D_EventKind_Started: { d_user_state->ctrl_is_running = 1; d_user_state->ctrl_thread_run_state = 1; }break; - case CTRL_EventKind_Stopped: + case D_EventKind_Stopped: { - B32 should_snap = !(d_user_state->ctrl_soft_halt_issued); d_user_state->ctrl_is_running = 0; d_user_state->ctrl_thread_run_state = 0; d_user_state->ctrl_soft_halt_issued = 0; // rjf: exception or unexpected trap -> push error - if(event->cause == CTRL_EventCause_InterruptedByException || - event->cause == CTRL_EventCause_InterruptedByTrap) + if(event->cause == D_EventCause_InterruptedByException || + event->cause == D_EventCause_InterruptedByTrap) { log_user_error(str8_zero()); } @@ -1492,46 +1487,12 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P MemoryCopyStruct(&d_user_state->ctrl_last_stop_event, event); d_user_state->ctrl_last_stop_event.string = push_str8_copy(d_user_state->ctrl_stop_arena, d_user_state->ctrl_last_stop_event.string); } - - // rjf: push stop event to caller, if this is not a soft-halt - if(should_snap) - { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, event->entity); - D_EventCause cause = D_EventCause_Null; - switch(event->cause) - { - default:{}break; - case CTRL_EventCause_InterruptedByHalt: - { - if(should_snap) - { - cause = D_EventCause_Halt; - } - else - { - cause = D_EventCause_SoftHalt; - } - }break; - case CTRL_EventCause_UserBreakpoint: {cause = D_EventCause_UserBreakpoint;}break; - } - D_EventNode *n = push_array(arena, D_EventNode, 1); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - D_Event *evt = &n->v; - evt->kind = D_EventKind_Stop; - evt->cause = cause; - evt->thread = thread->kind == CTRL_EntityKind_Thread ? thread->handle : ctrl_handle_zero(); - evt->vaddr = event->rip_vaddr; - evt->id = event->u64_code; - } }break; - //- rjf: entity creation/deletion - - case CTRL_EventKind_NewProc: + case D_EventKind_NewProc: { // rjf: the first process? -> clear session output - CTRL_EntityArray existing_processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray existing_processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(existing_processes.count == 1) { MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; @@ -1539,40 +1500,11 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P } }break; - case CTRL_EventKind_EndProc: - { - D_EventNode *n = push_array(arena, D_EventNode, 1); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - D_Event *evt = &n->v; - evt->kind = D_EventKind_ProcessEnd; - evt->code = event->u64_code; - }break; - - case CTRL_EventKind_NewModule: - { - D_EventNode *n = push_array(arena, D_EventNode, 1); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - D_Event *evt = &n->v; - evt->kind = D_EventKind_ModuleLoad; - evt->module = event->entity; - }break; - - //- rjf: debug strings - - case CTRL_EventKind_DebugString: + case D_EventKind_DebugString: { MTX_Op op = {r1u64(max_U64, max_U64), event->string}; mtx_push_op(d_user_state->output_log_key, op); }break; - - //- rjf: memory - - case CTRL_EventKind_MemReserve:{}break; - case CTRL_EventKind_MemCommit:{}break; - case CTRL_EventKind_MemDecommit:{}break; - case CTRL_EventKind_MemRelease:{}break; } log_infof("}\n\n"); } @@ -1624,10 +1556,10 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: build data strings of all param data String8List strings = {0}; { - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); for EachIndex(idx, threads.count) { - CTRL_Entity *thread = threads.v[idx]; + D_Entity *thread = threads.v[idx]; if(thread->is_frozen) { str8_list_push(scratch.arena, &strings, str8_struct(&thread->id)); @@ -1665,7 +1597,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P //- rjf: process top-level commands // D_CmdList deferred_cmds = {0}; - CTRL_MsgList ctrl_msgs = {0}; + D_MsgList ctrl_msgs = {0}; ProfScope("process top-level commands") { D_BreakpointArray run_extra_bps = {0}; @@ -1677,9 +1609,9 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: prep ctrl running arguments B32 need_run = 0; D_RunKind run_kind = D_RunKind_Run; - CTRL_Entity *run_thread = &ctrl_entity_nil; - CTRL_RunFlags run_flags = 0; - CTRL_TrapList run_traps = {0}; + D_Entity *run_thread = &d_entity_nil; + D_RunFlags run_flags = 0; + D_TrapList run_traps = {0}; // rjf: process command switch(cmd->kind) @@ -1749,8 +1681,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: push message to launch { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_Launch; + D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = D_MsgKind_Launch; msg->path = working_directory; msg->cmd_line_string_list = cmdln_strings; msg->stdout_path = stdout_path; @@ -1767,8 +1699,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: run need_run = 1; run_kind = D_RunKind_Run; - run_thread = &ctrl_entity_nil; - run_flags = (cmd->kind == D_CmdKind_LaunchAndStepInto) ? CTRL_RunFlag_StopOnEntryPoint : 0; + run_thread = &d_entity_nil; + run_flags = (cmd->kind == D_CmdKind_LaunchAndStepInto) ? D_RunFlag_StopOnEntryPoint : 0; } // rjf: no targets -> error @@ -1779,15 +1711,15 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Kill: { - CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); - if(process == &ctrl_entity_nil) + D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); + if(process == &d_entity_nil) { log_user_error(str8_lit("Cannot kill; no process was specified.")); } else { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_Kill; + D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = D_MsgKind_Kill; msg->exit_code = 1; msg->entity = process->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); @@ -1795,22 +1727,22 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_KillAll: { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_KillAll; + D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = D_MsgKind_KillAll; msg->exit_code = 1; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); }break; case D_CmdKind_Detach: { - CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); - if(process == &ctrl_entity_nil) + D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); + if(process == &d_entity_nil) { log_user_error(str8_lit("Cannot detach; no process specified.")); } else { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_Detach; + D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = D_MsgKind_Detach; msg->entity = process->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); } @@ -1818,12 +1750,12 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_Continue: { B32 good_to_run = 0; - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); if(threads.count > 0) { for EachIndex(idx, threads.count) { - CTRL_Entity *thread = threads.v[idx]; + D_Entity *thread = threads.v[idx]; if(!thread->is_frozen) { good_to_run = 1; @@ -1848,8 +1780,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepOverLine: case D_CmdKind_StepOut: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); - if(thread == &ctrl_entity_nil) + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + if(thread == &d_entity_nil) { log_user_error(str8_lit("Must have a selected thread to step.")); } @@ -1879,13 +1811,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P Access *access = access_open(); // rjf: thread => call stack - CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); // rjf: use first unwind frame to generate trap if(callstack.concrete_frames_count > 1) { U64 vaddr = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[1]->regs); - CTRL_Trap trap = {CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck, vaddr}; + D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, vaddr}; ctrl_trap_list_push(scratch.arena, &trap_net.traps, &trap); trap_net.good_read = 1; } @@ -1942,7 +1874,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_SetThreadIP: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); U64 vaddr = params->vaddr; void *block = ctrl_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, thread->handle); regs_arch_block_write_rip(thread->arch, block, vaddr); @@ -1968,7 +1900,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Run: { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_Continue, .machine = params->machine, .process = params->process, .thread = params->thread); @@ -1980,7 +1912,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Restart: { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_KillAll); @@ -1990,7 +1922,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepInto: case D_CmdKind_StepOver: { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count != 0) { D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto @@ -2028,26 +1960,26 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_FreezeLocalMachine: { - CTRL_MachineID machine_id = CTRL_MachineID_Local; + D_MachineID machine_id = D_MachineID_Local; d_cmd(D_CmdKind_FreezeMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero())); }break; case D_CmdKind_ThawLocalMachine: { - CTRL_MachineID machine_id = CTRL_MachineID_Local; + D_MachineID machine_id = D_MachineID_Local; d_cmd(D_CmdKind_ThawMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero())); }break; case D_CmdKind_FreezeEntity: case D_CmdKind_ThawEntity: { B32 should_freeze = (cmd->kind == D_CmdKind_FreezeEntity); - CTRL_Entity *root = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); - for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) + D_Entity *root = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + for(D_Entity *e = root; e != &d_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) { - if(e->kind == CTRL_EntityKind_Thread) + if(e->kind == D_EntityKind_Thread) { e->is_frozen = should_freeze; - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = (should_freeze ? CTRL_MsgKind_FreezeThread : CTRL_MsgKind_ThawThread); + D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = (should_freeze ? D_MsgKind_FreezeThread : D_MsgKind_ThawThread); msg->entity = e->handle; } } @@ -2064,12 +1996,12 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P //- rjf: entity decoration case D_CmdKind_SetEntityColor: { - CTRL_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + D_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); entity->rgba = params->rgba; }break; case D_CmdKind_SetEntityName: { - CTRL_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + D_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); ctrl_entity_equip_string(d_user_state->ctrl_entity_store, entity, params->string); }break; @@ -2079,8 +2011,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P U32 pid = params->pid; if(pid != 0) { - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); - msg->kind = CTRL_MsgKind_Attach; + D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = D_MsgKind_Attach; msg->entity_id = pid; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); } @@ -2096,10 +2028,10 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P } // rjf: push & fill run message - CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); { - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, CTRL_EntityKind_Process); - msg->kind = (run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? CTRL_MsgKind_Run : CTRL_MsgKind_SingleStep; + D_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, D_EntityKind_Process); + msg->kind = (run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? D_MsgKind_Run : D_MsgKind_SingleStep; msg->run_flags = run_flags; msg->entity = run_thread->handle; msg->parent = process->handle; @@ -2118,12 +2050,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: unpack user breakpoint entity D_Breakpoint *bp = &batch_breakpoints->v[idx]; - // rjf: d -> ctrl flags - CTRL_UserBreakpointFlags ctrl_bp_flags = 0; - if(bp->flags & D_BreakpointFlag_BreakOnWrite) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnWrite; } - if(bp->flags & D_BreakpointFlag_BreakOnRead) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnRead; } - if(bp->flags & D_BreakpointFlag_BreakOnExecute) { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnExecute; } - // rjf: textual location -> add breakpoints for all possible override locations if(bp->file_path.size != 0 && bp->pt.line != 0) { @@ -2131,7 +2057,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P for(String8Node *n = overrides.first; n != 0; n = n->next) { CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_FileNameAndLineColNumber}; - ctrl_user_bp.flags = ctrl_bp_flags; + ctrl_user_bp.flags = bp->flags; ctrl_user_bp.id = bp->id; ctrl_user_bp.string = n->string; ctrl_user_bp.pt = bp->pt; @@ -2145,7 +2071,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P else if(bp->vaddr_expr.size != 0) { CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_Expression}; - ctrl_user_bp.flags = ctrl_bp_flags; + ctrl_user_bp.flags = bp->flags; ctrl_user_bp.id = bp->id; ctrl_user_bp.string = bp->vaddr_expr; ctrl_user_bp.condition = bp->condition; @@ -2157,7 +2083,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P } // rjf: copy run traps to scratch (needed, if run_traps can be `d_user_state->ctrl_last_run_traps`) - CTRL_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps); + D_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps); D_BreakpointArray run_extra_bps_copy = d_breakpoint_array_copy(scratch.arena, &run_extra_bps); // rjf: store last run info @@ -2195,7 +2121,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // the next tick) // { - CTRL_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_user_state->ctrl_msg_arena, &ctrl_msgs); + D_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_user_state->ctrl_msg_arena, &ctrl_msgs); ctrl_msg_list_concat_in_place(&d_user_state->ctrl_msgs, &msgs_copy); if(d_user_state->ctrl_msgs.count != 0) { @@ -2214,5 +2140,5 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P ProfEnd(); scratch_end(scratch); - return result; + return events; } diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index ba48f5ad..309f00b5 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -57,10 +57,10 @@ D_RunKind; typedef struct D_CmdParams D_CmdParams; struct D_CmdParams { - CTRL_Handle machine; - CTRL_Handle process; - CTRL_Handle thread; - CTRL_Handle entity; + D_Handle machine; + D_Handle process; + D_Handle thread; + D_Handle entity; String8 string; String8 file_path; TxtPt cursor; @@ -104,7 +104,7 @@ typedef struct D_RunTLSBaseCacheNode D_RunTLSBaseCacheNode; struct D_RunTLSBaseCacheNode { D_RunTLSBaseCacheNode *hash_next; - CTRL_Handle process; + D_Handle process; U64 root_vaddr; U64 rip_vaddr; U64 tls_base_vaddr; @@ -154,43 +154,43 @@ struct D_RunLocalsCache //////////////////////////////// //~ rjf: User -> Ctrl Message Types -typedef enum CTRL_MsgKind +typedef enum D_MsgKind { - CTRL_MsgKind_Null, - CTRL_MsgKind_Launch, - CTRL_MsgKind_Attach, - CTRL_MsgKind_Kill, - CTRL_MsgKind_KillAll, - CTRL_MsgKind_Detach, - CTRL_MsgKind_Run, - CTRL_MsgKind_SingleStep, - CTRL_MsgKind_SetUserEntryPoints, - CTRL_MsgKind_SetModuleDebugInfoPath, - CTRL_MsgKind_FreezeThread, - CTRL_MsgKind_ThawThread, - CTRL_MsgKind_COUNT, + D_MsgKind_Null, + D_MsgKind_Launch, + D_MsgKind_Attach, + D_MsgKind_Kill, + D_MsgKind_KillAll, + D_MsgKind_Detach, + D_MsgKind_Run, + D_MsgKind_SingleStep, + D_MsgKind_SetUserEntryPoints, + D_MsgKind_SetModuleDebugInfoPath, + D_MsgKind_FreezeThread, + D_MsgKind_ThawThread, + D_MsgKind_COUNT, } -CTRL_MsgKind; +D_MsgKind; -typedef U32 CTRL_RunFlags; +typedef U32 D_RunFlags; enum { - CTRL_RunFlag_StopOnEntryPoint = (1<<0), + D_RunFlag_StopOnEntryPoint = (1<<0), }; -typedef struct CTRL_Msg CTRL_Msg; -struct CTRL_Msg +typedef struct D_Msg D_Msg; +struct D_Msg { - CTRL_MsgKind kind; - CTRL_RunFlags run_flags; - CTRL_MsgID msg_id; - CTRL_Handle entity; - CTRL_Handle parent; + D_MsgKind kind; + D_RunFlags run_flags; + D_MsgID msg_id; + D_Handle entity; + D_Handle parent; U32 entity_id; U32 exit_code; B32 env_inherit; B32 debug_subprocesses; - U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; + U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64]; String8 path; String8List entry_points; String8List cmd_line_string_list; @@ -198,104 +198,104 @@ struct CTRL_Msg String8 stdout_path; String8 stderr_path; String8 stdin_path; - CTRL_TrapList traps; + D_TrapList traps; CTRL_UserBreakpointList user_bps; }; -typedef struct CTRL_MsgNode CTRL_MsgNode; -struct CTRL_MsgNode +typedef struct D_MsgNode D_MsgNode; +struct D_MsgNode { - CTRL_MsgNode *next; - CTRL_Msg v; + D_MsgNode *next; + D_Msg v; }; -typedef struct CTRL_MsgList CTRL_MsgList; -struct CTRL_MsgList +typedef struct D_MsgList D_MsgList; +struct D_MsgList { - CTRL_MsgNode *first; - CTRL_MsgNode *last; + D_MsgNode *first; + D_MsgNode *last; U64 count; }; //////////////////////////////// //~ rjf: Ctrl -> User Event Types -typedef enum CTRL_EventKind +typedef enum D_EventKind { - CTRL_EventKind_Null, - CTRL_EventKind_Error, + D_EventKind_Null, + D_EventKind_Error, //- rjf: starts/stops - CTRL_EventKind_Started, - CTRL_EventKind_Stopped, + D_EventKind_Started, + D_EventKind_Stopped, //- rjf: entity creation/deletion - CTRL_EventKind_NewProc, - CTRL_EventKind_NewThread, - CTRL_EventKind_NewModule, - CTRL_EventKind_EndProc, - CTRL_EventKind_EndThread, - CTRL_EventKind_EndModule, + D_EventKind_NewProc, + D_EventKind_NewThread, + D_EventKind_NewModule, + D_EventKind_EndProc, + D_EventKind_EndThread, + D_EventKind_EndModule, //- rjf: thread freeze state changes - CTRL_EventKind_ThreadFrozen, - CTRL_EventKind_ThreadThawed, + D_EventKind_ThreadFrozen, + D_EventKind_ThreadThawed, //- rjf: debug info changes - CTRL_EventKind_ModuleDebugInfoPathChange, + D_EventKind_ModuleDebugInfoPathChange, //- rjf: debug strings / decorations / markup - CTRL_EventKind_DebugString, - CTRL_EventKind_ThreadName, - CTRL_EventKind_ThreadColor, - CTRL_EventKind_SetBreakpoint, - CTRL_EventKind_UnsetBreakpoint, - CTRL_EventKind_SetVAddrRangeNote, + D_EventKind_DebugString, + D_EventKind_ThreadName, + D_EventKind_ThreadColor, + D_EventKind_SetBreakpoint, + D_EventKind_UnsetBreakpoint, + D_EventKind_SetVAddrRangeNote, //- rjf: memory - CTRL_EventKind_MemReserve, - CTRL_EventKind_MemCommit, - CTRL_EventKind_MemDecommit, - CTRL_EventKind_MemRelease, + D_EventKind_MemReserve, + D_EventKind_MemCommit, + D_EventKind_MemDecommit, + D_EventKind_MemRelease, - CTRL_EventKind_COUNT + D_EventKind_COUNT } -CTRL_EventKind; +D_EventKind; -typedef enum CTRL_EventCause +typedef enum D_EventCause { - CTRL_EventCause_Null, - CTRL_EventCause_Error, - CTRL_EventCause_Finished, - CTRL_EventCause_EntryPoint, - CTRL_EventCause_UserBreakpoint, - CTRL_EventCause_InterruptedByTrap, - CTRL_EventCause_InterruptedByException, - CTRL_EventCause_InterruptedByHalt, - CTRL_EventCause_COUNT + D_EventCause_Null, + D_EventCause_Error, + D_EventCause_Finished, + D_EventCause_EntryPoint, + D_EventCause_UserBreakpoint, + D_EventCause_InterruptedByTrap, + D_EventCause_InterruptedByException, + D_EventCause_InterruptedByHalt, + D_EventCause_COUNT } -CTRL_EventCause; +D_EventCause; -typedef enum CTRL_ExceptionKind +typedef enum D_ExceptionKind { - CTRL_ExceptionKind_Null, - CTRL_ExceptionKind_MemoryRead, - CTRL_ExceptionKind_MemoryWrite, - CTRL_ExceptionKind_MemoryExecute, - CTRL_ExceptionKind_CppThrow, - CTRL_ExceptionKind_COUNT + D_ExceptionKind_Null, + D_ExceptionKind_MemoryRead, + D_ExceptionKind_MemoryWrite, + D_ExceptionKind_MemoryExecute, + D_ExceptionKind_CppThrow, + D_ExceptionKind_COUNT } -CTRL_ExceptionKind; +D_ExceptionKind; -typedef struct CTRL_Event CTRL_Event; -struct CTRL_Event +typedef struct D_Event D_Event; +struct D_Event { - CTRL_EventKind kind; - CTRL_EventCause cause; - CTRL_ExceptionKind exception_kind; - CTRL_MsgID msg_id; - CTRL_Handle entity; - CTRL_Handle parent; + D_EventKind kind; + D_EventCause cause; + D_ExceptionKind exception_kind; + D_MsgID msg_id; + D_Handle entity; + D_Handle parent; Arch arch; U64 u64_code; U32 entity_id; @@ -308,24 +308,24 @@ struct CTRL_Event U64 timestamp; U32 exception_code; U32 rgba; - CTRL_UserBreakpointFlags bp_flags; + D_BreakpointFlags bp_flags; String8 string; OperatingSystem target_os; - CTRL_TlsModel tls_model; + D_TlsModel tls_model; }; -typedef struct CTRL_EventNode CTRL_EventNode; -struct CTRL_EventNode +typedef struct D_EventNode D_EventNode; +struct D_EventNode { - CTRL_EventNode *next; - CTRL_Event v; + D_EventNode *next; + D_Event v; }; -typedef struct CTRL_EventList CTRL_EventList; -struct CTRL_EventList +typedef struct D_EventList D_EventList; +struct D_EventList { - CTRL_EventNode *first; - CTRL_EventNode *last; + D_EventNode *first; + D_EventNode *last; U64 count; }; @@ -362,21 +362,21 @@ struct D_UserState Arena *ctrl_last_run_arena; D_RunKind ctrl_last_run_kind; U64 ctrl_last_run_frame_idx; - CTRL_Handle ctrl_last_run_thread_handle; - CTRL_RunFlags ctrl_last_run_flags; - CTRL_TrapList ctrl_last_run_traps; + D_Handle ctrl_last_run_thread_handle; + D_RunFlags ctrl_last_run_flags; + D_TrapList ctrl_last_run_traps; D_BreakpointArray ctrl_last_run_extra_bps; U128 ctrl_last_run_param_state_hash; B32 ctrl_is_running; B32 ctrl_thread_run_state; B32 ctrl_soft_halt_issued; Arena *ctrl_msg_arena; - CTRL_MsgList ctrl_msgs; + D_MsgList ctrl_msgs; // rjf: ctrl -> user reading state - CTRL_EntityCtxRWStore *ctrl_entity_store; + D_EntityCtxRWStore *ctrl_entity_store; Arena *ctrl_stop_arena; - CTRL_Event ctrl_last_stop_event; + D_Event ctrl_last_stop_event; }; //////////////////////////////// @@ -419,9 +419,9 @@ internal void d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, //////////////////////////////// //~ rjf: Stepping "Trap Net" Builders -internal D_TrapNet d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread); -internal D_TrapNet d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread); -internal D_TrapNet d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread); +internal D_TrapNet d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread); +internal D_TrapNet d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread); +internal D_TrapNet d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread); //////////////////////////////// //~ rjf: Debug Info Lookups @@ -440,13 +440,13 @@ internal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_p //////////////////////////////// //~ rjf: Process/Thread/Module Info Lookups -internal U64 d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); +internal U64 d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr); //////////////////////////////// //~ rjf: Target Controls //- rjf: stopped info from the control thread -internal CTRL_Event d_ctrl_last_stop_event(void); +internal D_Event d_ctrl_last_stop_event(void); //////////////////////////////// //~ rjf: Main State Accessors/Mutators @@ -463,10 +463,10 @@ internal B32 d_ctrl_targets_running(void); internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); //- rjf: per-run caches -internal U64 d_query_cached_rip_from_thread(CTRL_Entity *thread); -internal U64 d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); -internal U64 d_query_cached_cfa_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count); -internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr); +internal U64 d_query_cached_rip_from_thread(D_Entity *thread); +internal U64 d_query_cached_rip_from_thread_unwind(D_Entity *thread, U64 unwind_count); +internal U64 d_query_cached_cfa_from_thread_unwind(D_Entity *thread, U64 unwind_count); +internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr); internal E_String2NumMap *d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); internal E_String2NumMap *d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); @@ -480,6 +480,6 @@ internal B32 d_next_cmd(D_Cmd **cmd); //////////////////////////////// //~ rjf: Main Layer Top-Level Calls -internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]); +internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64]); #endif // DBG_ENGINE_USER_H diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index f7397b0e..5635d3e9 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -44,65 +44,65 @@ D_CmdKind_Attach, D_CmdKind_COUNT, } D_CmdKind; -typedef enum CTRL_EntityKind +typedef enum D_EntityKind { -CTRL_EntityKind_Null, -CTRL_EntityKind_Root, -CTRL_EntityKind_Machine, -CTRL_EntityKind_Process, -CTRL_EntityKind_Thread, -CTRL_EntityKind_Module, -CTRL_EntityKind_EntryPoint, -CTRL_EntityKind_DebugInfoPath, -CTRL_EntityKind_PendingThreadName, -CTRL_EntityKind_PendingThreadColor, -CTRL_EntityKind_Breakpoint, -CTRL_EntityKind_AddressRangeAnnotation, -CTRL_EntityKind_COUNT, -} CTRL_EntityKind; +D_EntityKind_Null, +D_EntityKind_Root, +D_EntityKind_Machine, +D_EntityKind_Process, +D_EntityKind_Thread, +D_EntityKind_Module, +D_EntityKind_EntryPoint, +D_EntityKind_DebugInfoPath, +D_EntityKind_PendingThreadName, +D_EntityKind_PendingThreadColor, +D_EntityKind_Breakpoint, +D_EntityKind_AddressRangeAnnotation, +D_EntityKind_COUNT, +} D_EntityKind; -typedef enum CTRL_ExceptionCodeKind +typedef enum D_ExceptionCodeKind { -CTRL_ExceptionCodeKind_Null, -CTRL_ExceptionCodeKind_Win32CtrlC, -CTRL_ExceptionCodeKind_Win32CtrlBreak, -CTRL_ExceptionCodeKind_Win32WinRTOriginateError, -CTRL_ExceptionCodeKind_Win32WinRTTransformError, -CTRL_ExceptionCodeKind_Win32RPCCallCancelled, -CTRL_ExceptionCodeKind_Win32DatatypeMisalignment, -CTRL_ExceptionCodeKind_Win32AccessViolation, -CTRL_ExceptionCodeKind_Win32InPageError, -CTRL_ExceptionCodeKind_Win32InvalidHandle, -CTRL_ExceptionCodeKind_Win32NotEnoughQuota, -CTRL_ExceptionCodeKind_Win32IllegalInstruction, -CTRL_ExceptionCodeKind_Win32CannotContinueException, -CTRL_ExceptionCodeKind_Win32InvalidExceptionDisposition, -CTRL_ExceptionCodeKind_Win32ArrayBoundsExceeded, -CTRL_ExceptionCodeKind_Win32FloatingPointDenormalOperand, -CTRL_ExceptionCodeKind_Win32FloatingPointDivisionByZero, -CTRL_ExceptionCodeKind_Win32FloatingPointInexactResult, -CTRL_ExceptionCodeKind_Win32FloatingPointInvalidOperation, -CTRL_ExceptionCodeKind_Win32FloatingPointOverflow, -CTRL_ExceptionCodeKind_Win32FloatingPointStackCheck, -CTRL_ExceptionCodeKind_Win32FloatingPointUnderflow, -CTRL_ExceptionCodeKind_Win32IntegerDivisionByZero, -CTRL_ExceptionCodeKind_Win32IntegerOverflow, -CTRL_ExceptionCodeKind_Win32PrivilegedInstruction, -CTRL_ExceptionCodeKind_Win32StackOverflow, -CTRL_ExceptionCodeKind_Win32UnableToLocateDLL, -CTRL_ExceptionCodeKind_Win32OrdinalNotFound, -CTRL_ExceptionCodeKind_Win32EntryPointNotFound, -CTRL_ExceptionCodeKind_Win32DLLInitializationFailed, -CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults, -CTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps, -CTRL_ExceptionCodeKind_Win32AssertionFailed, -CTRL_ExceptionCodeKind_Win32ModuleNotFound, -CTRL_ExceptionCodeKind_Win32ProcedureNotFound, -CTRL_ExceptionCodeKind_Win32SanitizerErrorDetected, -CTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation, -CTRL_ExceptionCodeKind_Win32DirectXDebugLayer, -CTRL_ExceptionCodeKind_COUNT, -} CTRL_ExceptionCodeKind; +D_ExceptionCodeKind_Null, +D_ExceptionCodeKind_Win32CtrlC, +D_ExceptionCodeKind_Win32CtrlBreak, +D_ExceptionCodeKind_Win32WinRTOriginateError, +D_ExceptionCodeKind_Win32WinRTTransformError, +D_ExceptionCodeKind_Win32RPCCallCancelled, +D_ExceptionCodeKind_Win32DatatypeMisalignment, +D_ExceptionCodeKind_Win32AccessViolation, +D_ExceptionCodeKind_Win32InPageError, +D_ExceptionCodeKind_Win32InvalidHandle, +D_ExceptionCodeKind_Win32NotEnoughQuota, +D_ExceptionCodeKind_Win32IllegalInstruction, +D_ExceptionCodeKind_Win32CannotContinueException, +D_ExceptionCodeKind_Win32InvalidExceptionDisposition, +D_ExceptionCodeKind_Win32ArrayBoundsExceeded, +D_ExceptionCodeKind_Win32FloatingPointDenormalOperand, +D_ExceptionCodeKind_Win32FloatingPointDivisionByZero, +D_ExceptionCodeKind_Win32FloatingPointInexactResult, +D_ExceptionCodeKind_Win32FloatingPointInvalidOperation, +D_ExceptionCodeKind_Win32FloatingPointOverflow, +D_ExceptionCodeKind_Win32FloatingPointStackCheck, +D_ExceptionCodeKind_Win32FloatingPointUnderflow, +D_ExceptionCodeKind_Win32IntegerDivisionByZero, +D_ExceptionCodeKind_Win32IntegerOverflow, +D_ExceptionCodeKind_Win32PrivilegedInstruction, +D_ExceptionCodeKind_Win32StackOverflow, +D_ExceptionCodeKind_Win32UnableToLocateDLL, +D_ExceptionCodeKind_Win32OrdinalNotFound, +D_ExceptionCodeKind_Win32EntryPointNotFound, +D_ExceptionCodeKind_Win32DLLInitializationFailed, +D_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults, +D_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps, +D_ExceptionCodeKind_Win32AssertionFailed, +D_ExceptionCodeKind_Win32ModuleNotFound, +D_ExceptionCodeKind_Win32ProcedureNotFound, +D_ExceptionCodeKind_Win32SanitizerErrorDetected, +D_ExceptionCodeKind_Win32SanitizerRawAccessViolation, +D_ExceptionCodeKind_Win32DirectXDebugLayer, +D_ExceptionCodeKind_COUNT, +} D_ExceptionCodeKind; global B32 DEV_always_refresh = 0; global B32 DEV_simulate_lag = 0; diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index ad6a1935..246fe050 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2599,7 +2599,7 @@ e_list_gather_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U //- rjf: unpack key // TODO(rjf): this needs to take any `E_Space`, once eval has been upgraded. - CTRL_Handle process = {0}; + D_Handle process = {0}; U64 base_off = 0; U64 member_element_off = 0; U64 member_size = 0; @@ -2824,7 +2824,7 @@ E_TYPE_IREXT_FUNCTION_DEF(list) #pragma pack(push, 1) struct { - CTRL_Handle process; + D_Handle process; U64 base_off; U64 member_element_off; U64 member_size; diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 72f090c4..17b779ec 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -512,11 +512,11 @@ str8_lit_comp("os_event"), Rng1U64 rd_reg_slot_range_table[49] = { {0}, -{OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(CTRL_Handle)}, -{OffsetOf(RD_Regs, module), OffsetOf(RD_Regs, module) + sizeof(CTRL_Handle)}, -{OffsetOf(RD_Regs, process), OffsetOf(RD_Regs, process) + sizeof(CTRL_Handle)}, -{OffsetOf(RD_Regs, thread), OffsetOf(RD_Regs, thread) + sizeof(CTRL_Handle)}, -{OffsetOf(RD_Regs, ctrl_entity), OffsetOf(RD_Regs, ctrl_entity) + sizeof(CTRL_Handle)}, +{OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, module), OffsetOf(RD_Regs, module) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, process), OffsetOf(RD_Regs, process) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, thread), OffsetOf(RD_Regs, thread) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, ctrl_entity), OffsetOf(RD_Regs, ctrl_entity) + sizeof(D_Handle)}, {OffsetOf(RD_Regs, window), OffsetOf(RD_Regs, window) + sizeof(CFG_ID)}, {OffsetOf(RD_Regs, panel), OffsetOf(RD_Regs, panel) + sizeof(CFG_ID)}, {OffsetOf(RD_Regs, tab), OffsetOf(RD_Regs, tab) + sizeof(CFG_ID)}, @@ -565,229 +565,229 @@ Rng1U64 rd_reg_slot_range_table[49] = RD_CmdKindInfo rd_cmd_kind_info_table[249] = { {0}, -{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("launch_and_step_into"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), CTRL_EntityKind_Process}}, -{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), CTRL_EntityKind_Process}}, -{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the end of the current function and exits it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}}, -{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}}, -{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), CTRL_EntityKind_Process}}, -{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), CTRL_EntityKind_Process}}, -{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), CTRL_EntityKind_Machine}}, -{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), CTRL_EntityKind_Machine}}, -{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), CTRL_EntityKind_Null}}, -{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), CTRL_EntityKind_Null}}, -{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("switch"), str8_lit_comp("Switches to a recent file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_files, query:source_files"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("record_file_in_project"), str8_lit_comp("Records the passed file path as a recent file in the currently loaded project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), CTRL_EntityKind_Null}}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("list_breakpoints"), str8_lit_comp("Lists all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, +{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("launch_and_step_into"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the end of the current function and exits it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, +{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, +{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("switch"), str8_lit_comp("Switches to a recent file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_files, query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_file_in_project"), str8_lit_comp("Records the passed file path as a recent file in the currently loaded project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("list_breakpoints"), str8_lit_comp("Lists all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, { str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, { str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 9f2cd81c..89b9e129 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -450,11 +450,11 @@ String8 schema; typedef struct RD_Regs RD_Regs; struct RD_Regs { -CTRL_Handle machine; -CTRL_Handle module; -CTRL_Handle process; -CTRL_Handle thread; -CTRL_Handle ctrl_entity; +D_Handle machine; +D_Handle module; +D_Handle process; +D_Handle thread; +D_Handle ctrl_entity; CFG_ID window; CFG_ID panel; CFG_ID tab; @@ -507,7 +507,7 @@ RD_QueryFlags flags; RD_RegSlot slot; String8 expr; String8 view_name; -CTRL_EntityKind ctrl_entity_kind; +D_EntityKind ctrl_entity_kind; }; typedef struct RD_CmdKindInfo RD_CmdKindInfo; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 0f83ea5d..7fa633c3 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -305,7 +305,7 @@ RD_VocabTable: ``` } - // TODO(rjf): the control codes could be fed from the CTRL_ExceptionCodeKindTable, but + // TODO(rjf): the control codes could be fed from the D_ExceptionCodeKindTable, but // we do not support that in this generator - we'd need a way to form a table-generated // string and put it into a table cell... { @@ -758,11 +758,11 @@ RD_VocabTable: RD_RegTable: { // rjf: ctrl entities - {CTRL_Handle machine Machine } - {CTRL_Handle module Module } - {CTRL_Handle process Process } - {CTRL_Handle thread Thread } - {CTRL_Handle ctrl_entity CtrlEntity } + {D_Handle machine Machine } + {D_Handle module Module } + {D_Handle process Process } + {D_Handle thread Thread } + {D_Handle ctrl_entity CtrlEntity } // rjf: cfgs {CFG_ID window Window } @@ -788,7 +788,7 @@ RD_RegTable: {C_Key text_key TextKey } {TXT_LangKind lang_kind LangKind } {D_LineList lines Lines } - {DI_Key dbgi_key DbgiKey } + {DI_Key dbgi_key DbgiKey } {U64 vaddr Vaddr } {U64 voff Voff } {Rng1U64 vaddr_range VaddrRange } @@ -1163,7 +1163,7 @@ RD_CmdTable: // | | | | `RD_RegSlot slot`; `String8 expr`; `String8 view_name`; - `CTRL_EntityKind ctrl_entity_kind`; + `D_EntityKind ctrl_entity_kind`; } @struct RD_CmdKindInfo: @@ -1180,9 +1180,9 @@ RD_CmdTable: // | | | | { `{0}`, @expand(D_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), CTRL_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), CTRL_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_WatchTabFastPathTable, a) ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}```; @expand(RD_ViewTabFastPathTable, a) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index a2255f67..e0a46d04 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -609,7 +609,7 @@ rd_possible_overrides_from_file_path(Arena *arena, String8 file_path) //~ rjf: Control Entity Info Extraction internal Vec4F32 -rd_color_from_ctrl_entity(CTRL_Entity *entity) +rd_color_from_ctrl_entity(D_Entity *entity) { Vec4F32 result = {0}; if(entity->rgba != 0) @@ -619,10 +619,10 @@ rd_color_from_ctrl_entity(CTRL_Entity *entity) if(entity->rgba == 0) switch(entity->kind) { default:{}break; - case CTRL_EntityKind_Thread: + case D_EntityKind_Thread: { - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); - CTRL_Entity *main_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); + D_Entity *process = ctrl_entity_ancestor_from_kind(entity, D_EntityKind_Process); + D_Entity *main_thread = ctrl_entity_child_from_kind(process, D_EntityKind_Thread); if(main_thread != entity) { result = ui_color_from_name(str8_lit("thread_1")); @@ -637,14 +637,14 @@ rd_color_from_ctrl_entity(CTRL_Entity *entity) } internal String8 -rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity) +rd_name_from_ctrl_entity(Arena *arena, D_Entity *entity) { String8 string = entity->string; if(string.size == 0) { string = str8_lit("unnamed"); } - if(entity->kind == CTRL_EntityKind_Module) + if(entity->kind == D_EntityKind_Module) { string = str8_skip_last_slash(string); } @@ -678,15 +678,15 @@ rd_eval_space_from_cfg(CFG_Node *cfg) //- rjf: ctrl entity <-> eval space -internal CTRL_Entity * +internal D_Entity * rd_ctrl_entity_from_eval_space(E_Space space) { - CTRL_Entity *entity = &ctrl_entity_nil; - if(space.kind == CTRL_EvalSpaceKind_Entity || + D_Entity *entity = &d_entity_nil; + if(space.kind == D_EvalSpaceKind_Entity || space.kind == RD_EvalSpaceKind_MetaCtrlEntity || space.kind == RD_EvalSpaceKind_MetaUnattachedProcess) { - CTRL_Handle handle; + D_Handle handle; handle.machine_id = space.u64s[0]; handle.dmn_handle.u64[0] = space.u64s[1]; entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); @@ -695,7 +695,7 @@ rd_ctrl_entity_from_eval_space(E_Space space) } internal E_Space -rd_eval_space_from_ctrl_entity(CTRL_Entity *entity, E_SpaceKind kind) +rd_eval_space_from_ctrl_entity(D_Entity *entity, E_SpaceKind kind) { E_Space space = e_space_make(kind); space.u64s[0] = entity->handle.machine_id; @@ -750,15 +750,15 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) }break; //- rjf: interior control entity reads (inside process address space or thread register block) - case CTRL_EvalSpaceKind_Entity: + case D_EvalSpaceKind_Entity: { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + D_Entity *entity = rd_ctrl_entity_from_eval_space(space); switch(entity->kind) { default:{}break; - case CTRL_EntityKind_Process: + case D_EntityKind_Process: { - CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, range, 0, rd_state->frame_eval_memread_endt_us); + D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, range, 0, rd_state->frame_eval_memread_endt_us); String8 data = slice.data; if(data.size == dim_1u64(range)) { @@ -766,14 +766,14 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) MemoryCopy(out, data.str, data.size); } }break; - case CTRL_EntityKind_Thread: + case D_EntityKind_Thread: { Access *access = access_open(); - CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, 1, rd_state->frame_eval_memread_endt_us); + D_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, 1, rd_state->frame_eval_memread_endt_us); U64 concrete_frame_idx = e_interpret_ctx->reg_unwind_count; if(concrete_frame_idx < call_stack.concrete_frames_count) { - CTRL_CallStackFrame *f = call_stack.concrete_frames[concrete_frame_idx]; + D_CallStackFrame *f = call_stack.concrete_frames[concrete_frame_idx]; U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch); Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 read_range = intersect_1u64(legal_range, range); @@ -928,7 +928,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) case RD_EvalSpaceKind_MetaCtrlEntity: { // rjf: unpack cfg - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + D_Entity *entity = rd_ctrl_entity_from_eval_space(space); String8 child_key = e_string_from_id(space.u64s[2]); // rjf: determine data to read from, depending on child name in schema @@ -948,7 +948,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) } else if(str8_match(child_schema->string, str8_lit("dbg"), 0)) { - read_data = ctrl_entity_child_from_kind(entity, CTRL_EntityKind_DebugInfoPath)->string; + read_data = ctrl_entity_child_from_kind(entity, D_EntityKind_DebugInfoPath)->string; } else if(str8_match(child_schema->string, str8_lit("vaddr_range"), 0)) { @@ -990,17 +990,17 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) //- rjf: interior control entity writes (inside process address space or // thread register block) - case CTRL_EvalSpaceKind_Entity: + case D_EvalSpaceKind_Entity: { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + D_Entity *entity = rd_ctrl_entity_from_eval_space(space); switch(entity->kind) { default:{}break; - case CTRL_EntityKind_Process: + case D_EntityKind_Process: { result = ctrl_process_write(entity->handle, range, in); }break; - case CTRL_EntityKind_Thread: + case D_EntityKind_Thread: { Temp scratch = scratch_begin(0, 0); U64 regs_size = regs_block_size_from_arch(entity->arch); @@ -1075,7 +1075,7 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) String8 write_string = str8_cstring_capped(in, (U8 *)in + dim_1u64(range)); // rjf: unpack cfg - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); + D_Entity *entity = rd_ctrl_entity_from_eval_space(space); String8 child_key = e_string_from_id(space.u64s[2]); // rjf: perform write, based on child name in schema @@ -1139,10 +1139,10 @@ rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated) String8 file_path = e_string_from_id(file_path_string_id); result = fs_key_from_path_range(file_path, range, 0); }break; - case CTRL_EvalSpaceKind_Entity: + case D_EvalSpaceKind_Entity: { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); - if(entity->kind == CTRL_EntityKind_Process) + D_Entity *entity = rd_ctrl_entity_from_eval_space(space); + if(entity->kind == D_EntityKind_Process) { result = ctrl_key_from_process_vaddr_range(entity->handle, range, zero_terminated, 0, 0, 0); } @@ -1179,10 +1179,10 @@ rd_whole_range_from_eval_space(E_Space space) FileProperties props = os_properties_from_file_path(file_path); result = r1u64(0, props.size); }break; - case CTRL_EvalSpaceKind_Entity: + case D_EvalSpaceKind_Entity: { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space); - if(entity->kind == CTRL_EntityKind_Process) + D_Entity *entity = rd_ctrl_entity_from_eval_space(space); + if(entity->kind == D_EntityKind_Process) { result = r1u64(0, 0x7FFFFFFFFFFFull); } @@ -1703,7 +1703,7 @@ rd_view_ui(Rng2F32 rect) UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) { CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("target")); - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); //- rjf: icon & info UI_Padding(ui_em(2.f, 1.f)) UI_TagF("weak") @@ -2264,11 +2264,11 @@ rd_view_ui(Rng2F32 rect) { U64 voff = 0; DI_Key dbgi_key = {0}; - if(eval.space.kind == CTRL_EvalSpaceKind_Entity) + if(eval.space.kind == D_EvalSpaceKind_Entity) { U64 vaddr = eval.value.u64; - CTRL_Entity *process = rd_ctrl_entity_from_eval_space(eval.space); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + D_Entity *process = rd_ctrl_entity_from_eval_space(eval.space); + D_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); dbgi_key = ctrl_dbgi_key_from_module(module); voff = ctrl_voff_from_vaddr(module, vaddr); } @@ -2321,14 +2321,14 @@ rd_view_ui(Rng2F32 rect) }break; case RD_EvalSpaceKind_MetaCtrlEntity: { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); + D_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); RD_RegsScope(.ctrl_entity = entity->handle) { if(0){} - else if(entity->kind == CTRL_EntityKind_Thread) { rd_regs()->thread = entity->handle; } - else if(entity->kind == CTRL_EntityKind_Module) { rd_regs()->module = entity->handle; } - else if(entity->kind == CTRL_EntityKind_Process) { rd_regs()->process = entity->handle; } - else if(entity->kind == CTRL_EntityKind_Machine) { rd_regs()->machine = entity->handle; } + else if(entity->kind == D_EntityKind_Thread) { rd_regs()->thread = entity->handle; } + else if(entity->kind == D_EntityKind_Module) { rd_regs()->module = entity->handle; } + else if(entity->kind == D_EntityKind_Process) { rd_regs()->process = entity->handle; } + else if(entity->kind == D_EntityKind_Machine) { rd_regs()->machine = entity->handle; } rd_cmd(RD_CmdKind_CompleteQuery); } }break; @@ -2361,8 +2361,8 @@ rd_view_ui(Rng2F32 rect) String8 name = {0}; { U64 vaddr = eval.value.u64; - CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + D_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); U64 voff = ctrl_voff_from_vaddr(module, vaddr); { @@ -2431,7 +2431,7 @@ rd_view_ui(Rng2F32 rect) }break; case RD_EvalSpaceKind_MetaCtrlEntity: { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); + D_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); rd_cmd(RD_CmdKind_PushQuery, .expr = push_str8f(scratch.arena, "query:control.%S", ctrl_string_from_handle(scratch.arena, entity->handle))); }break; } @@ -2553,7 +2553,7 @@ rd_view_ui(Rng2F32 rect) } }break; case RD_WatchViewRowKind_PrettyEntityControls: - if((!rd_entity_is_nil(row_info.collection_entity) || row_info.collection_ctrl_entity != &ctrl_entity_nil) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1) + if((!rd_entity_is_nil(row_info.collection_entity) || row_info.collection_ctrl_entity != &d_entity_nil) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1) { kind = OpKind_DoExpand; }break; @@ -3539,10 +3539,10 @@ rd_view_ui(Rng2F32 rect) //////////////////// //- rjf: draw start of cache lines in expansions // - if(row->eval.space.kind == CTRL_EvalSpaceKind_Entity && row_info->view_ui_rule == &rd_nil_view_ui_rule) + if(row->eval.space.kind == D_EvalSpaceKind_Entity && row_info->view_ui_rule == &rd_nil_view_ui_rule) { - CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row->eval.space); - if(space_entity->kind == CTRL_EntityKind_Process) + D_Entity *space_entity = rd_ctrl_entity_from_eval_space(row->eval.space); + if(space_entity->kind == D_EntityKind_Process) { U64 row_offset = row->eval.value.u64; if((row->eval.irtree.mode == E_Mode_Offset || row->eval.irtree.mode == E_Mode_Null) && @@ -3560,10 +3560,10 @@ rd_view_ui(Rng2F32 rect) ////////////// //- rjf: draw mid-row cache line boundaries in expansions // - if(row->eval.space.kind == CTRL_EvalSpaceKind_Entity && row_info->view_ui_rule == &rd_nil_view_ui_rule) + if(row->eval.space.kind == D_EvalSpaceKind_Entity && row_info->view_ui_rule == &rd_nil_view_ui_rule) { - CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row->eval.space); - if(space_entity->kind == CTRL_EntityKind_Process && + D_Entity *space_entity = rd_ctrl_entity_from_eval_space(row->eval.space); + if(space_entity->kind == D_EntityKind_Process && (row->eval.irtree.mode == E_Mode_Offset || row->eval.irtree.mode == E_Mode_Null) && row->eval.value.u64%64 != 0 && row_depth > 0 && @@ -3641,10 +3641,10 @@ rd_view_ui(Rng2F32 rect) Rng1U64 intersection = intersect_1u64(cell_vaddr_rng, rd_get_hover_regs()->vaddr_range); cell_is_rich_hovered = (intersection.max > intersection.min); } - CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(cell->eval.space); - if(cell->eval.space.kind == CTRL_EvalSpaceKind_Entity && space_entity->kind == CTRL_EntityKind_Process) + D_Entity *space_entity = rd_ctrl_entity_from_eval_space(cell->eval.space); + if(cell->eval.space.kind == D_EvalSpaceKind_Entity && space_entity->kind == D_EntityKind_Process) { - CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, space_entity->handle, cell_vaddr_rng, 0, rd_state->frame_eval_memread_endt_us); + D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, space_entity->handle, cell_vaddr_rng, 0, rd_state->frame_eval_memread_endt_us); for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) { if(slice.byte_changed_flags[idx] != 0) @@ -3722,7 +3722,7 @@ rd_view_ui(Rng2F32 rect) else if(ctrl_handle_match(cell_info.entity->handle, rd_get_hover_regs()->ctrl_entity) && rd_state->hover_regs_slot == RD_RegSlot_CtrlEntity) { - CTRL_Entity *entity = cell_info.entity; + D_Entity *entity = cell_info.entity; Vec4F32 rgba = rd_color_from_ctrl_entity(entity); rgba.w *= 0.05f; if(rgba.w == 0) @@ -4049,8 +4049,8 @@ rd_view_ui(Rng2F32 rect) if(!(cell_info.flags & RD_WatchCellFlag_NoEval) && e_type_kind_from_key(cell->eval.irtree.type_key) != E_TypeKind_Null && (cell->eval.space.kind == E_SpaceKind_Null || - cell->eval.space.kind == CTRL_EvalSpaceKind_Entity) && - row_info->callstack_thread == &ctrl_entity_nil && + cell->eval.space.kind == D_EvalSpaceKind_Entity) && + row_info->callstack_thread == &d_entity_nil && e_type_kind_from_key(cell->eval.irtree.type_key) != E_TypeKind_Function) UI_FontSize(ui_top_font_size()*0.9f) { @@ -4133,7 +4133,7 @@ rd_view_ui(Rng2F32 rect) } // rjf: hover -> rich hover entities - else if(ui_hovering(sig) && cell_info.entity != &ctrl_entity_nil) + else if(ui_hovering(sig) && cell_info.entity != &d_entity_nil) { RD_RegsScope(.ctrl_entity = cell_info.entity->handle, .no_rich_tooltip = 1) rd_set_hover_regs(RD_RegSlot_CtrlEntity); } @@ -4163,18 +4163,18 @@ rd_view_ui(Rng2F32 rect) { RD_RegsScope(.cfg = cell_info.cfg->id) rd_drag_begin(RD_RegSlot_Cfg); } - else if(cell_info.entity != &ctrl_entity_nil) + else if(cell_info.entity != &d_entity_nil) { RD_RegsScope(.ctrl_entity = cell_info.entity->handle) switch(cell_info.entity->kind) { default:{rd_drag_begin(RD_RegSlot_CtrlEntity);}break; - case CTRL_EntityKind_Machine:{RD_RegsScope(.machine = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Machine);}break; - case CTRL_EntityKind_Process:{RD_RegsScope(.process = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Process);}break; - case CTRL_EntityKind_Module:{RD_RegsScope(.module = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Module);}break; - case CTRL_EntityKind_Thread:{RD_RegsScope(.thread = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Thread);}break; + case D_EntityKind_Machine:{RD_RegsScope(.machine = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Machine);}break; + case D_EntityKind_Process:{RD_RegsScope(.process = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Process);}break; + case D_EntityKind_Module:{RD_RegsScope(.module = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Module);}break; + case D_EntityKind_Thread:{RD_RegsScope(.thread = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Thread);}break; } } - else if(cell->eval.space.kind == CTRL_EvalSpaceKind_Entity || + else if(cell->eval.space.kind == D_EvalSpaceKind_Entity || cell->eval.space.kind == E_SpaceKind_FileSystem || cell->eval.space.kind == E_SpaceKind_File || cell->eval.space.kind == E_SpaceKind_Null) @@ -4267,13 +4267,13 @@ rd_view_ui(Rng2F32 rect) { String8 cmd_name = cell_info.cmd_name; RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(row->eval.space); + D_Entity *entity = rd_ctrl_entity_from_eval_space(row->eval.space); CFG_Node *cfg = rd_cfg_from_eval_space(row->eval.space); if(cfg == &cfg_nil_node) { cfg = rd_cfg_from_eval_space(row->block->eval.space); } - if(entity == &ctrl_entity_nil) + if(entity == &d_entity_nil) { entity = rd_ctrl_entity_from_eval_space(row->eval.space); } @@ -4290,7 +4290,7 @@ rd_view_ui(Rng2F32 rect) } if(!(cmd_kind_info->query.flags & RD_QueryFlag_Required) || (cmd_kind_info->query.slot == RD_RegSlot_Cfg && cfg != &cfg_nil_node) || - (cmd_kind_info->query.slot == RD_RegSlot_CtrlEntity && entity != &ctrl_entity_nil)) + (cmd_kind_info->query.slot == RD_RegSlot_CtrlEntity && entity != &d_entity_nil)) { rd_push_cmd(cell_info.cmd_name, rd_regs()); } @@ -4302,7 +4302,7 @@ rd_view_ui(Rng2F32 rect) } // rjf: row has callstack info? -> select unwind - else if(row_info->callstack_thread != &ctrl_entity_nil) + else if(row_info->callstack_thread != &d_entity_nil) { rd_cmd(RD_CmdKind_SelectThread, .thread = row_info->callstack_thread->handle); rd_cmd(RD_CmdKind_SelectUnwind, @@ -4329,14 +4329,14 @@ rd_view_ui(Rng2F32 rect) } // rjf: can't edit, but has address info? -> go to address - else if(cell->eval.space.kind == CTRL_EvalSpaceKind_Entity) + else if(cell->eval.space.kind == D_EvalSpaceKind_Entity) { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(cell->eval.space); - CTRL_Entity *process = ctrl_process_from_entity(entity); - if(process != &ctrl_entity_nil) + D_Entity *entity = rd_ctrl_entity_from_eval_space(cell->eval.space); + D_Entity *process = ctrl_process_from_entity(entity); + if(process != &d_entity_nil) { U64 vaddr = cell->eval.value.u64; - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + D_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); U64 voff = ctrl_voff_from_vaddr(module, vaddr); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); @@ -4380,13 +4380,13 @@ rd_view_ui(Rng2F32 rect) } // rjf: can't edit, but has thread? -> select - else if(cell_info.entity->kind == CTRL_EntityKind_Thread) + else if(cell_info.entity->kind == D_EntityKind_Thread) { rd_cmd(RD_CmdKind_SelectThread, .thread = cell_info.entity->handle); } // rjf: other cases, but this watch window is floating, and this has a cfg/entity? -> push query - else if(view_is_floating && (cell_info.entity != &ctrl_entity_nil || cell_info.cfg != &cfg_nil_node)) + else if(view_is_floating && (cell_info.entity != &d_entity_nil || cell_info.cfg != &cfg_nil_node)) { rd_cmd(RD_CmdKind_PushQuery, .expr = e_full_expr_string_from_key(scratch.arena, cell->eval.key)); } @@ -4736,9 +4736,9 @@ internal Arch rd_arch_from_eval(E_Eval eval) { // rjf: try implicitly from either `eval` itself, or from context - CTRL_Entity *ctrl_entity = rd_ctrl_entity_from_eval_space(eval.space); - CTRL_Entity *process = ctrl_process_from_entity(ctrl_entity); - if(process == &ctrl_entity_nil) + D_Entity *ctrl_entity = rd_ctrl_entity_from_eval_space(eval.space); + D_Entity *process = ctrl_process_from_entity(ctrl_entity); + if(process == &d_entity_nil) { process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); } @@ -5439,7 +5439,7 @@ rd_window_frame(void) Temp scratch = scratch_begin(0, 0); RD_RegSlot slot = ((rd_state->drag_drop_regs_slot != RD_RegSlot_Null && rd_drag_is_active()) ? rd_state->drag_drop_regs_slot : rd_state->hover_regs_slot); RD_Regs *regs = (((rd_state->drag_drop_regs_slot != RD_RegSlot_Null && rd_drag_is_active()) ? rd_state->drag_drop_regs : rd_state->hover_regs)); - CTRL_Entity *ctrl_entity = &ctrl_entity_nil; + D_Entity *ctrl_entity = &d_entity_nil; ui_state->tooltip_anchor_key = regs->ui_key; ui_state->tooltip_can_overflow_window = rd_drag_is_active(); switch(slot) @@ -5522,8 +5522,8 @@ rd_window_frame(void) { UI_TagF("weak") UI_FlagsAdd(UI_BoxFlag_DrawBorder) ui_label(arch_str); ui_spacer(ui_em(0.5f, 1.f)); - if(ctrl_entity->kind == CTRL_EntityKind_Thread || - ctrl_entity->kind == CTRL_EntityKind_Process) + if(ctrl_entity->kind == D_EntityKind_Thread || + ctrl_entity->kind == D_EntityKind_Process) { UI_TagF("weak") UI_FlagsAdd(UI_BoxFlag_DrawBorder) ui_labelf("ID: %i", (U32)ctrl_entity->id); } @@ -5531,10 +5531,10 @@ rd_window_frame(void) } // rjf: debug info status - if(ctrl_entity->kind == CTRL_EntityKind_Module) UI_TagF("weak") + if(ctrl_entity->kind == D_EntityKind_Module) UI_TagF("weak") { Access *access = access_open(); - CTRL_Entity *dbg_info_entity = ctrl_entity_child_from_kind(ctrl_entity, CTRL_EntityKind_DebugInfoPath); + D_Entity *dbg_info_entity = ctrl_entity_child_from_kind(ctrl_entity, D_EntityKind_DebugInfoPath); DI_Key dbgi_key = ctrl_dbgi_key_from_module(ctrl_entity); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi->raw_data_size != 0) @@ -5553,14 +5553,14 @@ rd_window_frame(void) } // rjf: unwind - if(ctrl_entity->kind == CTRL_EntityKind_Thread) RD_Font(RD_FontSlot_Code) + if(ctrl_entity->kind == D_EntityKind_Thread) RD_Font(RD_FontSlot_Code) { Access *access = access_open(); Vec4F32 code_color = ui_color_from_name(str8_lit("code_default")); Vec4F32 symbol_color = ui_color_from_name(str8_lit("code_symbol")); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(ctrl_entity, CTRL_EntityKind_Process); + D_Entity *process = ctrl_entity_ancestor_from_kind(ctrl_entity, D_EntityKind_Process); B32 call_stack_high_priority = ctrl_handle_match(ctrl_entity->handle, rd_base_regs()->thread); - CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, ctrl_entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + D_CallStack call_stack = ctrl_call_stack_from_thread(access, ctrl_entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); if(call_stack.frames_count != 0) { ui_spacer(ui_em(1.5f, 1.f)); @@ -6154,8 +6154,8 @@ rd_window_frame(void) build_hover_eval = 0; } else if((hover_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity || - hover_eval.space.kind == CTRL_EvalSpaceKind_Entity) && - rd_ctrl_entity_from_eval_space(hover_eval.space) == &ctrl_entity_nil) + hover_eval.space.kind == D_EvalSpaceKind_Entity) && + rd_ctrl_entity_from_eval_space(hover_eval.space) == &d_entity_nil) { build_hover_eval = 0; } @@ -6255,8 +6255,8 @@ rd_window_frame(void) rd_cmd(RD_CmdKind_CancelQuery); } else if((eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity || - eval.space.kind == CTRL_EvalSpaceKind_Entity) && - rd_ctrl_entity_from_eval_space(eval.space) == &ctrl_entity_nil) + eval.space.kind == D_EvalSpaceKind_Entity) && + rd_ctrl_entity_from_eval_space(eval.space) == &d_entity_nil) { query_is_open = 0; rd_cmd(RD_CmdKind_CancelQuery); @@ -7037,7 +7037,7 @@ rd_window_frame(void) { Temp scratch = scratch_begin(0, 0); CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("target")); - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); B32 can_send_signal = !d_ctrl_targets_running(); typedef struct CenterButtonTask CenterButtonTask; struct CenterButtonTask @@ -7226,7 +7226,7 @@ rd_window_frame(void) { //- rjf: unpack status info B32 is_running = d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index(); - CTRL_Event stop_event = d_ctrl_last_stop_event(); + D_Event stop_event = d_ctrl_last_stop_event(); String8 tag = str8_lit("pop"); CFG_NodePtrList tasks = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("conversion_task")); CFG_NodePtrList long_running_tasks = {0}; @@ -7253,14 +7253,14 @@ rd_window_frame(void) switch(stop_event.cause) { default: - case CTRL_EventCause_Finished: + case D_EventCause_Finished: { tag = str8_lit("good_pop"); }break; - case CTRL_EventCause_UserBreakpoint: - case CTRL_EventCause_InterruptedByException: - case CTRL_EventCause_InterruptedByTrap: - case CTRL_EventCause_InterruptedByHalt: + case D_EventCause_UserBreakpoint: + case D_EventCause_InterruptedByException: + case D_EventCause_InterruptedByTrap: + case D_EventCause_InterruptedByHalt: { tag = str8_lit("bad_pop"); }break; @@ -9563,7 +9563,7 @@ internal String8 rd_string_from_exception_code(U32 code) { String8 string = {0}; - for EachNonZeroEnumVal(CTRL_ExceptionCodeKind, k) + for EachNonZeroEnumVal(D_ExceptionCodeKind, k) { if(code == ctrl_exception_code_kind_code_table[k]) { @@ -9575,9 +9575,9 @@ rd_string_from_exception_code(U32 code) } internal DR_FStrList -rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) +rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event) { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, event->entity); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, event->entity); DR_FStrList thread_fstrs = rd_title_fstrs_from_ctrl_entity(arena, thread, 0); DR_FStrList fstrs = {0}; DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit("text")), ui_top_font_size()}; @@ -9589,9 +9589,9 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) }break; //- rjf: finished operation; if active thread, completed thread, otherwise we're just stopped - case CTRL_EventCause_Finished: + case D_EventCause_Finished: { - if(thread != &ctrl_entity_nil) + if(thread != &d_entity_nil) { dr_fstrs_concat_in_place(&fstrs, &thread_fstrs); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" completed step")); @@ -9603,9 +9603,9 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) }break; //- rjf: stopped at entry point - case CTRL_EventCause_EntryPoint: + case D_EventCause_EntryPoint: { - if(thread != &ctrl_entity_nil) + if(thread != &d_entity_nil) { dr_fstrs_concat_in_place(&fstrs, &thread_fstrs); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" stopped at entry point")); @@ -9617,9 +9617,9 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) }break; //- rjf: user breakpoint - case CTRL_EventCause_UserBreakpoint: + case D_EventCause_UserBreakpoint: { - if(thread != &ctrl_entity_nil) + if(thread != &d_entity_nil) { dr_fstrs_push_new(arena, &fstrs, ¶ms, rd_icon_kind_text_table[RD_IconKind_CircleFilled], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons)); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); @@ -9637,9 +9637,9 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) }break; //- rjf: exception - case CTRL_EventCause_InterruptedByException: + case D_EventCause_InterruptedByException: { - if(thread != &ctrl_entity_nil) + if(thread != &d_entity_nil) { dr_fstrs_push_new(arena, &fstrs, ¶ms, rd_icon_kind_text_table[RD_IconKind_WarningBig], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons)); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); @@ -9659,7 +9659,7 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) exception_explanation_string.size != 0 ? ")" : ""); dr_fstrs_push_new(arena, &fstrs, ¶ms, exception_info_string); }break; - case CTRL_ExceptionKind_CppThrow: + case D_ExceptionKind_CppThrow: { dr_fstrs_concat_in_place(&fstrs, &thread_fstrs); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); @@ -9667,7 +9667,7 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) String8 exception_code_string = str8_from_u64(arena, event->exception_code, 16, 0, 0); dr_fstrs_push_new(arena, &fstrs, ¶ms, exception_code_string); }break; - case CTRL_ExceptionKind_MemoryRead: + case D_ExceptionKind_MemoryRead: { dr_fstrs_concat_in_place(&fstrs, &thread_fstrs); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); @@ -9675,7 +9675,7 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) String8 exception_info_string = push_str8f(arena, "Access violation reading from address 0x%I64x", event->vaddr_rng.min); dr_fstrs_push_new(arena, &fstrs, ¶ms, exception_info_string); }break; - case CTRL_ExceptionKind_MemoryWrite: + case D_ExceptionKind_MemoryWrite: { dr_fstrs_concat_in_place(&fstrs, &thread_fstrs); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); @@ -9683,7 +9683,7 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) String8 exception_info_string = push_str8f(arena, "Access violation writing to address 0x%I64x", event->vaddr_rng.min); dr_fstrs_push_new(arena, &fstrs, ¶ms, exception_info_string); }break; - case CTRL_ExceptionKind_MemoryExecute: + case D_ExceptionKind_MemoryExecute: { dr_fstrs_concat_in_place(&fstrs, &thread_fstrs); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); @@ -9710,7 +9710,7 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) }break; //- rjf: trap - case CTRL_EventCause_InterruptedByTrap: + case D_EventCause_InterruptedByTrap: { dr_fstrs_push_new(arena, &fstrs, ¶ms, rd_icon_kind_text_table[RD_IconKind_WarningBig], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons)); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); @@ -9719,7 +9719,7 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event) }break; //- rjf: halt - case CTRL_EventCause_InterruptedByHalt: + case D_EventCause_InterruptedByHalt: { dr_fstrs_push_new(arena, &fstrs, ¶ms, rd_icon_kind_text_table[RD_IconKind_Pause], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons)); dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" Halted")); @@ -11045,7 +11045,7 @@ rd_frame(void) ////////////////////////////// //- rjf: loop - consume events in core, tick engine, and repeat // - CTRL_Handle find_thread_retry = {0}; + D_Handle find_thread_retry = {0}; RD_Cmd *cmd = 0; ProfScope("loop - consume events in core, tick engine, and repeat") for(U64 cmd_process_loop_idx = 0; cmd_process_loop_idx < 3; cmd_process_loop_idx += 1) { @@ -11102,12 +11102,12 @@ rd_frame(void) //- rjf: unpack basic evaluation context // ProfBegin("unpack eval-dependent info"); - CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); Arch arch = thread->arch; U64 unwind_count = rd_regs()->unwind_count; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); U64 tls_root_vaddr = ctrl_tls_root_vaddr_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); ProfEnd(); @@ -11132,7 +11132,7 @@ rd_frame(void) //////////////////////////// //- rjf: produce all eval modules // - CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); + D_EntityArray all_modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); U64 eval_modules_count = Max(1, all_modules.count); E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &eval_modules[0]; @@ -11141,7 +11141,7 @@ rd_frame(void) { for EachIndex(eval_module_idx, all_modules.count) { - CTRL_Entity *m = all_modules.v[eval_module_idx]; + D_Entity *m = all_modules.v[eval_module_idx]; DI_Key dbgi_key = ctrl_dbgi_key_from_module(m); // rjf: dbgi key -> eval dbg info num @@ -11163,7 +11163,7 @@ rd_frame(void) eval_modules[eval_module_idx].vaddr_range = m->vaddr_range; eval_modules[eval_module_idx].arch = m->arch; eval_modules[eval_module_idx].dbg_info_num = dbg_info_num; - eval_modules[eval_module_idx].space = rd_eval_space_from_ctrl_entity(ctrl_entity_ancestor_from_kind(m, CTRL_EntityKind_Process), CTRL_EvalSpaceKind_Entity); + eval_modules[eval_module_idx].space = rd_eval_space_from_ctrl_entity(ctrl_entity_ancestor_from_kind(m, D_EntityKind_Process), D_EvalSpaceKind_Entity); if(module == m) { eval_modules_primary = &eval_modules[eval_module_idx]; @@ -11187,8 +11187,8 @@ rd_frame(void) //- rjf: fill instruction pointer info ctx->thread_ip_vaddr = rip_vaddr; ctx->thread_ip_voff = rip_voff; - ctx->thread_reg_space = rd_eval_space_from_ctrl_entity(thread, CTRL_EvalSpaceKind_Entity); - ctx->thread_process_space= rd_eval_space_from_ctrl_entity(process, CTRL_EvalSpaceKind_Entity); + ctx->thread_reg_space = rd_eval_space_from_ctrl_entity(thread, D_EvalSpaceKind_Entity); + ctx->thread_process_space= rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity); ctx->thread_arch = thread->arch; ctx->thread_unwind_count = unwind_count; @@ -11513,12 +11513,12 @@ rd_frame(void) for EachElement(idx, evallable_ctrl_names) { String8 name = evallable_ctrl_names[idx]; - CTRL_EntityKind kind = ctrl_entity_kind_from_string(name); - CTRL_EntityArray array = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); + D_EntityKind kind = ctrl_entity_kind_from_string(name); + D_EntityArray array = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); for EachIndex(idx, array.count) { - CTRL_Entity *entity = array.v[idx]; + D_Entity *entity = array.v[idx]; E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->space = space; @@ -11528,19 +11528,19 @@ rd_frame(void) { e_string2expr_map_insert(scratch.arena, macro_map, entity->string, expr); } - if(kind == CTRL_EntityKind_Machine && entity->handle.machine_id == CTRL_MachineID_Local) + if(kind == D_EntityKind_Machine && entity->handle.machine_id == D_MachineID_Local) { e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("local_machine"), expr); } - if(kind == CTRL_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle)) + if(kind == D_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle)) { e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_thread"), expr); } - if(kind == CTRL_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle)) + if(kind == D_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle)) { e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_process"), expr); } - if(kind == CTRL_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle)) + if(kind == D_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle)) { e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_module"), expr); } @@ -11880,12 +11880,12 @@ rd_frame(void) //- rjf: gather config from loaded modules // CFG_NodePtrList immediate_type_views = {0}; - CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module); + D_EntityArray modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); ProfScope("gather config from loaded modules") { for EachIndex(idx, modules.count) { - CTRL_Entity *module = modules.v[idx]; + D_Entity *module = modules.v[idx]; String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle); U8 split_char = 0; String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); @@ -12001,7 +12001,7 @@ rd_frame(void) E_InterpretCtx *ctx = interpret_ctx; ctx->primary_space = eval_modules_primary->space; ctx->reg_arch = eval_modules_primary->arch; - ctx->reg_space = rd_eval_space_from_ctrl_entity(thread, CTRL_EvalSpaceKind_Entity); + ctx->reg_space = rd_eval_space_from_ctrl_entity(thread, D_EvalSpaceKind_Entity); ctx->reg_unwind_count = unwind_count; ctx->module_base = push_array(scratch.arena, U64, 1); ctx->module_base[0] = module->vaddr_range.min; @@ -12072,7 +12072,7 @@ rd_frame(void) case RD_CmdKind_Restart: { // rjf: reset hit counts - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count == 0 || kind == RD_CmdKind_Restart) { CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); @@ -12292,7 +12292,7 @@ rd_frame(void) { // rjf: if control processes are live, but this is not force-confirmed, then // get confirmation from user - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("lossy_exit_confirmation")); if(processes.count != 0 && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) { @@ -13679,19 +13679,19 @@ rd_frame(void) //- rjf: source <-> disasm case RD_CmdKind_GoToDisassembly: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); U64 vaddr = 0; for(D_LineNode *n = rd_regs()->lines.first; n != 0; n = n->next) { - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); - if(module != &ctrl_entity_nil) + D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + if(module != &d_entity_nil) { vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); break; } } - rd_cmd(RD_CmdKind_FindCodeLocation, .process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process)->handle, .vaddr = vaddr, .prefer_disasm = 1); + rd_cmd(RD_CmdKind_FindCodeLocation, .process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process)->handle, .vaddr = vaddr, .prefer_disasm = 1); }break; case RD_CmdKind_GoToSource: { @@ -13967,12 +13967,12 @@ rd_frame(void) Access *access = access_open(); //- rjf: unpack thread info - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); U64 unwind_index = rd_regs()->unwind_count; U64 inline_depth = rd_regs()->inline_depth; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_index); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); @@ -13993,7 +13993,7 @@ rd_frame(void) B32 dbgi_missing = (di_key_match(di_key_zero(), dbgi_key)); B32 dbgi_pending = !dbgi_missing && rdi == &rdi_parsed_nil; B32 has_line_info = (line.voff_range.max != 0); - B32 has_module = (module != &ctrl_entity_nil); + B32 has_module = (module != &d_entity_nil); B32 has_dbg_info = has_module && !dbgi_missing; //- rjf: find-code-location on each affected window @@ -14031,7 +14031,7 @@ rd_frame(void) }break; case RD_CmdKind_FindSelectedThread: { - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); rd_cmd(RD_CmdKind_FindThread, .thread = selected_thread->handle, .unwind_count = rd_base_regs()->unwind_count, @@ -14138,12 +14138,12 @@ rd_frame(void) D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, voff_dbgi_key, voff); if(lines.first != 0) { - CTRL_Entity *process = &ctrl_entity_nil; + D_Entity *process = &d_entity_nil; U64 vaddr = 0; - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, voff_dbgi_key); - CTRL_Entity *module = ctrl_entity_list_first(&modules); - process = ctrl_entity_ancestor_from_kind(module, CTRL_EntityKind_Process); - if(process != &ctrl_entity_nil) + D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, voff_dbgi_key); + D_Entity *module = ctrl_entity_list_first(&modules); + process = ctrl_entity_ancestor_from_kind(module, D_EntityKind_Process); + if(process != &d_entity_nil) { vaddr = module->vaddr_range.min + lines.first->v.voff_range.min; } @@ -14212,8 +14212,8 @@ rd_frame(void) //- rjf: grab things to find. path * point, process * address, etc. String8 file_path = {0}; TxtPt point = {0}; - CTRL_Entity *thread = &ctrl_entity_nil; - CTRL_Entity *process = &ctrl_entity_nil; + D_Entity *thread = &d_entity_nil; + D_Entity *process = &d_entity_nil; U64 vaddr = 0; B32 require_disasm_snap = 0; B32 prefer_new_tab = 0; @@ -14237,8 +14237,8 @@ rd_frame(void) D_LineList lines = d_lines_from_file_path_line_num(scratch.arena, file_path, point.line); for(D_LineNode *n = lines.first; n != 0; n = n->next) { - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); break; } @@ -14750,7 +14750,7 @@ rd_frame(void) } // rjf: snap to disasm - if(process != &ctrl_entity_nil && vaddr != 0 && disasm_dst_panel != &cfg_nil_panel_node) + if(process != &d_entity_nil && vaddr != 0 && disasm_dst_panel != &cfg_nil_panel_node) { CFG_PanelNode *dst_panel = disasm_dst_panel; @@ -15441,7 +15441,7 @@ rd_frame(void) }break; case RD_CmdKind_SetNextStatement: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); String8 file_path = rd_regs()->file_path; U64 new_rip_vaddr = rd_regs()->vaddr_range.min; if(file_path.size != 0) @@ -15449,9 +15449,9 @@ rd_frame(void) D_LineList *lines = &rd_regs()->lines; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); - if(module != &ctrl_entity_nil) + D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + if(module != &d_entity_nil) { new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); break; @@ -15566,10 +15566,10 @@ rd_frame(void) }break; case RD_CmdKind_SelectThread: { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle)); - CTRL_Entity *machine = ctrl_entity_ancestor_from_kind(process, CTRL_EntityKind_Machine); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = ctrl_module_from_process_vaddr(process, ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle)); + D_Entity *machine = ctrl_entity_ancestor_from_kind(process, D_EntityKind_Machine); rd_state->base_regs.v.unwind_count = 0; rd_state->base_regs.v.inline_depth = 0; rd_state->base_regs.v.thread = thread->handle; @@ -15581,9 +15581,9 @@ rd_frame(void) case RD_CmdKind_SelectUnwind: { Access *access = access_open(); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); - CTRL_CallStackFrame *frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStackFrame *frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); if(frame == 0) { frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, 0); @@ -15600,10 +15600,10 @@ rd_frame(void) case RD_CmdKind_DownOneFrame: { Access *access = access_open(); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); - CTRL_CallStackFrame *current_frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); - CTRL_CallStackFrame *next_frame = current_frame; + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStackFrame *current_frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); + D_CallStackFrame *next_frame = current_frame; if(current_frame != 0) switch(kind) { default:{}break; @@ -15620,7 +15620,7 @@ rd_frame(void) } if(next_frame != 0) { - CTRL_CallStackFrame *next_base_frame = next_frame + next_frame->inline_depth; + D_CallStackFrame *next_base_frame = next_frame + next_frame->inline_depth; rd_cmd(RD_CmdKind_SelectUnwind, .unwind_count = next_frame->unwind_count, .inline_depth = next_frame->inline_depth); @@ -16300,9 +16300,9 @@ rd_frame(void) //////////////////////////// //- rjf: gather exception code filters // - U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64] = {0}; + U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64] = {0}; { - for EachNonZeroEnumVal(CTRL_ExceptionCodeKind, k) + for EachNonZeroEnumVal(D_ExceptionCodeKind, k) { String8 name = ctrl_exception_code_kind_lowercase_code_string_table[k]; B32 setting = rd_setting_b32_from_name(name); @@ -16317,6 +16317,7 @@ rd_frame(void) //- rjf: tick debug engine // U64 cmd_count_pre_tick = rd_state->cmds[0].count; + B32 soft_halt_issued = d_user_state->ctrl_soft_halt_issued; D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters); //////////////////////////// @@ -16328,10 +16329,10 @@ rd_frame(void) switch(evt->kind) { default:{}break; - case D_EventKind_ModuleLoad: + case D_EventKind_NewModule: { - CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->module); - CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); + D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); + D_Entity *debug_info_path = ctrl_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); String8 new_path = debug_info_path->string; if(new_path.size != 0 && os_file_path_exists(new_path)) { @@ -16365,54 +16366,54 @@ rd_frame(void) } } }break; - case D_EventKind_ProcessEnd: + case D_EventKind_EndProc: if(rd_state->quit_after_success) { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); - if(evt->code == 0 && processes.count == 0) + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + if(evt->u64_code == 0 && processes.count == 0) { rd_cmd(RD_CmdKind_Exit); } - else if(evt->code != 0) + else if(evt->u64_code != 0) { rd_state->quit_after_success = 0; } }break; - case D_EventKind_Stop: + case D_EventKind_Stopped: { - B32 need_refocus = (evt->cause != D_EventCause_SoftHalt); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->thread); - U64 vaddr = evt->vaddr; - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); + B32 need_refocus = (evt->cause != D_EventCause_InterruptedByHalt || !soft_halt_issued); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); + U64 vaddr = evt->rip_vaddr; + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); U64 voff = ctrl_voff_from_vaddr(module, vaddr); U64 test_cached_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); // rjf: valid stop thread? -> select & snap - if(need_refocus && thread != &ctrl_entity_nil && evt->cause != D_EventCause_Halt) + if(need_refocus && thread != &d_entity_nil && evt->cause != D_EventCause_InterruptedByHalt) { rd_cmd(RD_CmdKind_SelectThread, .thread = thread->handle); } // rjf: no stop-causing thread, but have selected thread? -> snap to selected - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - if(need_refocus && (evt->cause == D_EventCause_Halt || thread == &ctrl_entity_nil) && selected_thread != &ctrl_entity_nil) + D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + if(need_refocus && (evt->cause == D_EventCause_InterruptedByHalt || thread == &d_entity_nil) && selected_thread != &d_entity_nil) { rd_cmd(RD_CmdKind_SelectThread, .thread = selected_thread->handle); } // rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread - if(need_refocus && thread == &ctrl_entity_nil && selected_thread == &ctrl_entity_nil) + if(need_refocus && thread == &d_entity_nil && selected_thread == &d_entity_nil) { - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); - CTRL_Entity *first_available_thread = ctrl_entity_array_first(&threads); + D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_Entity *first_available_thread = ctrl_entity_array_first(&threads); rd_cmd(RD_CmdKind_SelectThread, .thread = first_available_thread->handle); } // rjf: increment breakpoint hit counts if(evt->cause == D_EventCause_UserBreakpoint) { - CFG_Node *bp = cfg_node_from_id(evt->id); + CFG_Node *bp = cfg_node_from_id(evt->u64_code); if(bp != &cfg_nil_node) { CFG_Node *hit_count_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, bp, str8_lit("hit_count")); @@ -16424,7 +16425,7 @@ rd_frame(void) } // rjf: focus window if none focused, and if we have a thread to snap to - if(need_refocus && (selected_thread != &ctrl_entity_nil || thread != &ctrl_entity_nil)) + if(need_refocus && (selected_thread != &d_entity_nil || thread != &d_entity_nil)) { B32 any_window_is_focused = 0; for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 03a579fa..5a458139 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -10,7 +10,7 @@ typedef U64 RD_EvalSpaceKind; enum { - RD_EvalSpaceKind_MetaQuery = CTRL_EvalSpaceKind_FirstUserDefined, + RD_EvalSpaceKind_MetaQuery = D_EvalSpaceKind_FirstUserDefined, RD_EvalSpaceKind_MetaCfg, RD_EvalSpaceKind_MetaCmd, RD_EvalSpaceKind_MetaTheme, @@ -638,8 +638,8 @@ internal String8List rd_possible_overrides_from_file_path(Arena *arena, String8 //////////////////////////////// //~ rjf: Control Entity Info Extraction -internal Vec4F32 rd_color_from_ctrl_entity(CTRL_Entity *entity); -internal String8 rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity); +internal Vec4F32 rd_color_from_ctrl_entity(D_Entity *entity); +internal String8 rd_name_from_ctrl_entity(Arena *arena, D_Entity *entity); //////////////////////////////// //~ rjf: Evaluation Spaces @@ -649,8 +649,8 @@ internal CFG_Node *rd_cfg_from_eval_space(E_Space space); internal E_Space rd_eval_space_from_cfg(CFG_Node *cfg); //- rjf: ctrl entity <-> eval space -internal CTRL_Entity *rd_ctrl_entity_from_eval_space(E_Space space); -internal E_Space rd_eval_space_from_ctrl_entity(CTRL_Entity *entity, E_SpaceKind kind); +internal D_Entity *rd_ctrl_entity_from_eval_space(E_Space space); +internal E_Space rd_eval_space_from_ctrl_entity(D_Entity *entity, E_SpaceKind kind); //- rjf: command name <-> eval space internal String8 rd_cmd_name_from_eval(E_Eval eval); @@ -766,7 +766,7 @@ internal FNT_RasterFlags rd_raster_flags_from_slot(RD_FontSlot slot); //~ rjf: Process Control Info Stringification internal String8 rd_string_from_exception_code(U32 code); -internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event); +internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event); //////////////////////////////// //~ rjf: Vocab Info Lookups diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 0f03eeff..91c4fe58 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -205,7 +205,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals) E_TYPE_EXPAND_INFO_FUNCTION_DEF(registers) { Temp scratch = scratch_begin(&arena, 1); - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); Arch arch = thread->arch; U64 reg_count = regs_reg_code_count_from_arch(arch); String8 *reg_strings = regs_reg_code_string_table_from_arch(arch); @@ -246,7 +246,7 @@ typedef struct RD_SchemaIRExt RD_SchemaIRExt; struct RD_SchemaIRExt { CFG_Node *cfg; - CTRL_Entity *entity; + D_Entity *entity; MD_NodePtrList schemas; }; @@ -290,7 +290,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) if(child_schema != &md_nil_node) { CFG_Node *cfg = ext->cfg; - CTRL_Entity *entity = ext->entity; + D_Entity *entity = ext->entity; CFG_Node *child = cfg_node_child_from_string(cfg, child_schema->string); E_TypeKey child_type_key = zero_struct; B32 wrap_child_w_meta_expr = 0; @@ -299,17 +299,17 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) if(0){} //- rjf: ctrl entity members - else if(entity != &ctrl_entity_nil && str8_match(child_schema->string, str8_lit("label"), 0)) + else if(entity != &d_entity_nil && str8_match(child_schema->string, str8_lit("label"), 0)) { child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), entity->string.size, type_flags|E_TypeFlag_IsCodeText); } - else if(entity != &ctrl_entity_nil && str8_match(child_schema->string, str8_lit("exe"), 0)) + else if(entity != &d_entity_nil && str8_match(child_schema->string, str8_lit("exe"), 0)) { child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), entity->string.size, type_flags|E_TypeFlag_IsPathText); } - else if(entity != &ctrl_entity_nil && str8_match(child_schema->string, str8_lit("dbg"), 0)) + else if(entity != &d_entity_nil && str8_match(child_schema->string, str8_lit("dbg"), 0)) { - CTRL_Entity *dbg = ctrl_entity_child_from_kind(entity, CTRL_EntityKind_DebugInfoPath); + D_Entity *dbg = ctrl_entity_child_from_kind(entity, D_EntityKind_DebugInfoPath); child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), dbg->string.size, type_flags|E_TypeFlag_IsPathText); } @@ -658,8 +658,8 @@ E_TYPE_ACCESS_FUNCTION_DEF(control) if(rhs->kind == E_ExprKind_LeafIdentifier && str8_match(str8_prefix(rhs->string, 1), str8_lit("$"), 0)) { - CTRL_Handle handle = ctrl_handle_from_string(rhs->string); - CTRL_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); + D_Handle handle = ctrl_handle_from_string(rhs->string); + D_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0)); result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ctrl_entity_kind_code_name_table[entity->kind]); @@ -942,8 +942,8 @@ typedef struct RD_CallStackAccel RD_CallStackAccel; struct RD_CallStackAccel { Arch arch; - CTRL_Handle process; - CTRL_CallStack call_stack; + D_Handle process; + D_CallStack call_stack; }; E_TYPE_IREXT_FUNCTION_DEF(call_stack) @@ -954,8 +954,8 @@ E_TYPE_IREXT_FUNCTION_DEF(call_stack) E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root); String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); E_Interpretation interp = e_interpret(bytecode); - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(interp.space); - if(entity->kind == CTRL_EntityKind_Thread) + D_Entity *entity = rd_ctrl_entity_from_eval_space(interp.space); + if(entity->kind == D_EntityKind_Thread) { B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread); accel->arch = entity->arch; @@ -975,12 +975,12 @@ E_TYPE_ACCESS_FUNCTION_DEF(call_stack) { RD_CallStackAccel *accel = (RD_CallStackAccel *)lhs_irtree->user_data; E_Value rhs_value = e_value_from_expr(expr->first->next); - CTRL_CallStack *call_stack = &accel->call_stack; + D_CallStack *call_stack = &accel->call_stack; if(0 <= rhs_value.u64 && rhs_value.u64 < call_stack->frames_count) { - CTRL_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, accel->process); - CTRL_CallStackFrame *f = &call_stack->frames[rhs_value.u64]; - result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, CTRL_EvalSpaceKind_Entity), e_irtree_const_u(arena, regs_rip_from_arch_block(accel->arch, f->regs))); + D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, accel->process); + D_CallStackFrame *f = &call_stack->frames[rhs_value.u64]; + result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity), e_irtree_const_u(arena, regs_rip_from_arch_block(accel->arch, f->regs))); result.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth); result.mode = E_Mode_Value; } @@ -1369,7 +1369,7 @@ typedef struct RD_UnattachedProcessesAccel RD_UnattachedProcessesAccel; struct RD_UnattachedProcessesAccel { DMN_ProcessInfo *infos; - CTRL_Entity **machines; + D_Entity **machines; U64 infos_count; }; @@ -1401,10 +1401,10 @@ E_TYPE_ACCESS_FUNCTION_DEF(unattached_processes) E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs_irtree->root); String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); E_Interpretation interpret = e_interpret(bytecode); - CTRL_Entity *machine = rd_ctrl_entity_from_eval_space(interpret.space); + D_Entity *machine = rd_ctrl_entity_from_eval_space(interpret.space); // rjf: build evaluation for this unattached process - if(machine != &ctrl_entity_nil) + if(machine != &d_entity_nil) { E_IRNode *value_irnode = e_push_irnode(arena, RDI_EvalOp_ConstU128); value_irnode->value.u128.u64[0] = pid; @@ -1427,18 +1427,18 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes) Temp scratch = scratch_begin(&arena, 1); //- rjf: evaluate lhs machine, if we have one - CTRL_Entity *lhs_entity = rd_ctrl_entity_from_eval_space(eval.space); + D_Entity *lhs_entity = rd_ctrl_entity_from_eval_space(eval.space); //- rjf: gather all machines we're searching through - CTRL_EntityArray machines = {0}; - if(lhs_entity->kind == CTRL_EntityKind_Machine) + D_EntityArray machines = {0}; + if(lhs_entity->kind == D_EntityKind_Machine) { machines.v = &lhs_entity; machines.count = 1; } else { - machines = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Machine); + machines = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Machine); } //- rjf: gather system processes from this machine @@ -1446,7 +1446,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes) struct Node { Node *next; - CTRL_Entity *machine; + D_Entity *machine; DMN_ProcessInfo info; }; Node *first = 0; @@ -1454,7 +1454,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes) U64 count = 0; for EachIndex(idx, machines.count) { - CTRL_Entity *machine = machines.v[idx]; + D_Entity *machine = machines.v[idx]; DMN_ProcessIter iter = {0}; dmn_process_iter_begin(&iter); for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &iter, &info);) @@ -1485,7 +1485,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes) //- rjf: list -> array U64 infos_count = count; DMN_ProcessInfo *infos = push_array(arena, DMN_ProcessInfo, infos_count); - CTRL_Entity **infos_machines = push_array(arena, CTRL_Entity *, infos_count); + D_Entity **infos_machines = push_array(arena, D_Entity *, infos_count); { U64 idx = 0; for(Node *n = first; n != 0; n = n->next, idx += 1) @@ -1515,7 +1515,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(unattached_processes) E_TypeKey unattached_process_type = e_type_key_cons(.kind = E_TypeKind_U128, .name = str8_lit("unattached_process")); for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1) { - CTRL_Entity *machine = accel->machines[idx]; + D_Entity *machine = accel->machines[idx]; String8 string = ctrl_string_from_handle(arena, machine->handle); evals_out[out_idx] = e_eval_wrapf(eval, "query:control.%S.unattached_processes.$%I64x$%I64x", string, accel->infos[idx].pid, e_id_from_string(accel->infos[idx].name)); } @@ -1528,29 +1528,29 @@ E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities) { E_IRTreeAndType result = {&e_irnode_nil}; { - CTRL_Entity *entity = &ctrl_entity_nil; + D_Entity *entity = &d_entity_nil; switch(expr->kind) { case E_ExprKind_MemberAccess: { String8 rhs_name = expr->first->next->string; - CTRL_Handle handle = ctrl_handle_from_string(rhs_name); + D_Handle handle = ctrl_handle_from_string(rhs_name); entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); }break; case E_ExprKind_ArrayIndex: { E_Type *type = e_type_from_key(lhs_irtree->type_key); - CTRL_EntityKind kind = ctrl_entity_kind_from_string(rd_singular_from_code_name_plural(type->name)); + D_EntityKind kind = ctrl_entity_kind_from_string(rd_singular_from_code_name_plural(type->name)); E_Value rhs_value = e_value_from_expr(expr->first->next); U64 rhs_idx = rhs_value.u64; - CTRL_EntityArray entities = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); + D_EntityArray entities = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); if(0 <= rhs_idx && rhs_idx < entities.count) { entity = entities.v[rhs_idx]; } }break; } - if(entity != &ctrl_entity_nil) + if(entity != &d_entity_nil) { E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); String8 name = ctrl_entity_kind_code_name_table[entity->kind]; @@ -1569,7 +1569,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) Temp scratch = scratch_begin(&arena, 1); { //- rjf: determine which entity we're looking under - CTRL_Entity *scoping_entity = &ctrl_entity_nil; + D_Entity *scoping_entity = &d_entity_nil; if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity) { scoping_entity = rd_ctrl_entity_from_eval_space(eval.space); @@ -1579,18 +1579,18 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) E_TypeKey lhs_type_key = eval.irtree.type_key; E_Type *lhs_type = e_type_from_key(lhs_type_key); String8 name = rd_singular_from_code_name_plural(lhs_type->name); - CTRL_EntityKind entity_kind = ctrl_entity_kind_from_string(name); + D_EntityKind entity_kind = ctrl_entity_kind_from_string(name); //- rjf: gather array of all entities which fit the bill - CTRL_EntityArray array = {0}; - if(scoping_entity == &ctrl_entity_nil) + D_EntityArray array = {0}; + if(scoping_entity == &d_entity_nil) { array = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, entity_kind); } else { - CTRL_EntityList list = {0}; - for(CTRL_Entity *child = scoping_entity->first; child != &ctrl_entity_nil; child = child->next) + D_EntityList list = {0}; + for(D_Entity *child = scoping_entity->first; child != &d_entity_nil; child = child->next) { if(child->kind == entity_kind) { @@ -1601,13 +1601,13 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) } //- rjf: filter the array - CTRL_EntityArray array__filtered = array; + D_EntityArray array__filtered = array; if(filter.size != 0) { - CTRL_EntityList list__filtered = {0}; + D_EntityList list__filtered = {0}; for EachIndex(idx, array.count) { - CTRL_Entity *entity = array.v[idx]; + D_Entity *entity = array.v[idx]; DR_FStrList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, entity, 1); String8 title_string = dr_string_from_fstrs(scratch.arena, &fstrs); FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, title_string); @@ -1620,7 +1620,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) } //- rjf: list -> array & fill - CTRL_EntityArray *accel = push_array(arena, CTRL_EntityArray, 1); + D_EntityArray *accel = push_array(arena, D_EntityArray, 1); *accel = array__filtered; result.user_data = accel; result.expr_count = accel->count; @@ -1631,14 +1631,14 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) E_TYPE_EXPAND_RANGE_FUNCTION_DEF(ctrl_entities) { - CTRL_EntityArray *entities = (CTRL_EntityArray *)user_data; + D_EntityArray *entities = (D_EntityArray *)user_data; Rng1U64 legal_range = r1u64(0, entities->count); Rng1U64 read_range = intersect_1u64(legal_range, idx_range); U64 read_count = dim_1u64(read_range); for(U64 out_idx = 0; out_idx < read_count; out_idx += 1) { Temp scratch = scratch_begin(&arena, 1); - CTRL_Entity *entity = entities->v[out_idx + read_range.min]; + D_Entity *entity = entities->v[out_idx + read_range.min]; evals_out[out_idx] = e_eval_from_stringf("query:control.%S", ctrl_string_from_handle(scratch.arena, entity->handle)); scratch_end(scratch); } @@ -1667,22 +1667,22 @@ E_TYPE_ACCESS_FUNCTION_DEF(call_stack_tree) typedef struct RD_CallStackTreeExpandAccel RD_CallStackTreeExpandAccel; struct RD_CallStackTreeExpandAccel { - CTRL_CallStackTreeNode *node; - CTRL_CallStackTreeNode **children; - CTRL_HandleArray threads; + D_CallStackTreeNode *node; + D_CallStackTreeNode **children; + D_HandleArray threads; }; E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack_tree) { Access *access = access_open(); - CTRL_CallStackTree call_stack_tree = ctrl_call_stack_tree(access, 0); + D_CallStackTree call_stack_tree = ctrl_call_stack_tree(access, 0); access_close(access); RD_CallStackTreeExpandAccel *accel = push_array(arena, RD_CallStackTreeExpandAccel, 1); - accel->node = &ctrl_call_stack_tree_node_nil; + accel->node = &d_call_stack_tree_node_nil; U64 id = e_value_eval_from_eval(eval).value.u64; if(call_stack_tree.slots_count != 0) { - for(CTRL_CallStackTreeNode *n = call_stack_tree.slots[id%call_stack_tree.slots_count]; + for(D_CallStackTreeNode *n = call_stack_tree.slots[id%call_stack_tree.slots_count]; n != 0; n = n->hash_next) { @@ -1693,11 +1693,11 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack_tree) } } } - accel->children = push_array(arena, CTRL_CallStackTreeNode *, accel->node->child_count); + accel->children = push_array(arena, D_CallStackTreeNode *, accel->node->child_count); { U64 idx = 0; - for(CTRL_CallStackTreeNode *n = accel->node->first; - n != &ctrl_call_stack_tree_node_nil; + for(D_CallStackTreeNode *n = accel->node->first; + n != &d_call_stack_tree_node_nil; n = n->next, idx += 1) { accel->children[idx] = n; @@ -1713,7 +1713,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(call_stack_tree) { Temp scratch = scratch_begin(&arena, 1); RD_CallStackTreeExpandAccel *accel = (RD_CallStackTreeExpandAccel *)user_data; - CTRL_CallStackTreeNode *node = accel->node; + D_CallStackTreeNode *node = accel->node; U64 needed_row_count = dim_1u64(idx_range); for EachIndex(idx, needed_row_count) { diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index a5be5e98..7c3aa432 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -437,7 +437,7 @@ ipc_signaler_thread__entry_point(void *p) //////////////////////////////// //~ rjf: Ctrl -> Main Thread Wakeup Hook -internal CTRL_WAKEUP_FUNCTION_DEF(wakeup_hook_ctrl) +internal D_WAKEUP_FUNCTION_DEF(wakeup_hook_ctrl) { os_send_wakeup_event(); } diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index b2774480..aaa7d91f 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -44,8 +44,8 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla F32 scroll_bar_dim = floor_f32(main_font_size*1.5f); Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); B32 do_line_numbers = rd_setting_b32_from_name(str8_lit("show_line_numbers")); ////////////////////////////// @@ -218,7 +218,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, visible_line_count); code_slice_params.line_bps = push_array(scratch.arena, CFG_NodePtrList, visible_line_count); - code_slice_params.line_ips = push_array(scratch.arena, CTRL_EntityList, visible_line_count); + code_slice_params.line_ips = push_array(scratch.arena, D_EntityList, visible_line_count); code_slice_params.line_pins = push_array(scratch.arena, CFG_NodePtrList, visible_line_count); code_slice_params.line_vaddrs = push_array(scratch.arena, U64, visible_line_count); code_slice_params.line_infos = push_array(scratch.arena, D_LineList, visible_line_count); @@ -277,17 +277,17 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: find live threads mapping to source code if(!dasm_lines) ProfScope("find live threads mapping to this file") { - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); for EachIndex(idx, threads.count) { - CTRL_Entity *thread = threads.v[idx]; - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + D_Entity *thread = threads.v[idx]; + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 inline_depth = (thread == selected_thread) ? rd_regs()->inline_depth : 0; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); U64 last_inst_on_unwound_rip_vaddr = rip_vaddr - !!unwind_count; - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, last_inst_on_unwound_rip_vaddr); + D_Entity *module = ctrl_module_from_process_vaddr(process, last_inst_on_unwound_rip_vaddr); U64 rip_voff = ctrl_voff_from_vaddr(module, last_inst_on_unwound_rip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, rip_voff); @@ -340,7 +340,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla if(!dasm_lines) ProfScope("find all src -> dasm info for source code") { String8 file_path = rd_regs()->file_path; - CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); D_LineListArray lines_array = d_lines_array_from_dbgi_key_file_path_line_range(scratch.arena, dbgi_key, file_path, visible_line_num_range); if(lines_array.count != 0) @@ -353,14 +353,14 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: find live threads mapping to disasm if(dasm_lines) ProfScope("find live threads mapping to this disassembly") { - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread); + D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); for EachIndex(idx, threads.count) { - CTRL_Entity *thread = threads.v[idx]; + D_Entity *thread = threads.v[idx]; U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); - if(ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) + if(ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) { U64 rip_off = rip_vaddr - dasm_vaddr_range.min; S64 line_num = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, rip_off)+1; @@ -422,7 +422,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: fill dasm -> src info if(dasm_lines) { - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, dasm_vaddr_range.min); + D_Entity *module = ctrl_module_from_process_vaddr(process, dasm_vaddr_range.min); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) { @@ -940,12 +940,12 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) { RD_WatchRowInfo info = { - .module = &ctrl_entity_nil, + .module = &d_entity_nil, .can_expand = ev_row_is_expandable(row), .group_cfg_parent = &cfg_nil_node, .group_cfg_child = &cfg_nil_node, - .group_entity = &ctrl_entity_nil, - .callstack_thread = &ctrl_entity_nil, + .group_entity = &d_entity_nil, + .callstack_thread = &d_entity_nil, .view_ui_rule = &rd_nil_view_ui_rule, }; { @@ -963,7 +963,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key); E_Type *block_type = e_type_from_key(block_type_key); CFG_Node *evalled_cfg = rd_cfg_from_eval_space(row->eval.space); - CTRL_Entity *evalled_entity = (row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ? rd_ctrl_entity_from_eval_space(row->eval.space) : &ctrl_entity_nil); + D_Entity *evalled_entity = (row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ? rd_ctrl_entity_from_eval_space(row->eval.space) : &d_entity_nil); //////////////////////////// //- rjf: determine if this cfg/entity evaluation is top-level - e.g. if we @@ -975,7 +975,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, evalled_cfg->string); is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key)); } - if(evalled_entity != &ctrl_entity_nil) + if(evalled_entity != &d_entity_nil) { String8 top_level_name = ctrl_entity_kind_code_name_table[evalled_entity->kind]; E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, top_level_name); @@ -993,21 +993,21 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) //////////////////////////// //- rjf: fill row's module // - if(row->eval.space.kind == CTRL_EvalSpaceKind_Entity) + if(row->eval.space.kind == D_EvalSpaceKind_Entity) { - CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row->eval.space); + D_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row->eval.space); switch(row_ctrl_entity->kind) { default: - case CTRL_EntityKind_Process: + case D_EntityKind_Process: if(row->eval.irtree.mode == E_Mode_Offset) { info.module = ctrl_module_from_process_vaddr(row_ctrl_entity, row->eval.value.u64); }break; - case CTRL_EntityKind_Thread: + case D_EntityKind_Thread: if(row->eval.irtree.mode == E_Mode_Value) { - CTRL_Entity *process = ctrl_process_from_entity(row_ctrl_entity); + D_Entity *process = ctrl_process_from_entity(row_ctrl_entity); info.module = ctrl_module_from_process_vaddr(process, d_query_cached_rip_from_thread(row_ctrl_entity)); }break; } @@ -1018,17 +1018,17 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) // if(block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && str8_match(str8_lit("call_stack"), block_type->name, 0)) { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(block_eval.space); - if(entity->kind == CTRL_EntityKind_Thread) + D_Entity *entity = rd_ctrl_entity_from_eval_space(block_eval.space); + if(entity->kind == D_EntityKind_Thread) { Access *access = access_open(); info.callstack_thread = entity; U64 frame_num = ev_block_num_from_id(block, key.child_id); B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread); - CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + D_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); if(1 <= frame_num && frame_num <= call_stack.frames_count) { - CTRL_CallStackFrame *f = &call_stack.frames[frame_num-1]; + D_CallStackFrame *f = &call_stack.frames[frame_num-1]; info.callstack_unwind_index = f->unwind_count; info.callstack_inline_depth = f->inline_depth; info.callstack_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); @@ -1297,20 +1297,20 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) //////////////////////////// //- rjf: @watch_row_build_cells ctrl entity evaluations // - else if(is_top_level && evalled_entity != &ctrl_entity_nil) + else if(is_top_level && evalled_entity != &d_entity_nil) { - CTRL_Entity *entity = evalled_entity; + D_Entity *entity = evalled_entity; rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented|RD_WatchCellFlag_Button, .pct = 1.f); - if(entity->kind == CTRL_EntityKind_Machine || - entity->kind == CTRL_EntityKind_Process || - entity->kind == CTRL_EntityKind_Thread) + if(entity->kind == D_EntityKind_Machine || + entity->kind == D_EntityKind_Process || + entity->kind == D_EntityKind_Thread) { rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, e_eval_wrapf(row->eval, "active"), .px = floor_f32(ui_top_font_size()*5.5f)); } - if(entity->kind == CTRL_EntityKind_Thread) + if(entity->kind == D_EntityKind_Thread) { RD_CmdKind cmd_kind = RD_CmdKind_SelectEntity; if(ctrl_handle_match(entity->handle, rd_base_regs()->thread)) @@ -1405,11 +1405,11 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) //////////////////////////// //- rjf: @watch_row_build_cells call stack frames // - else if(info.callstack_thread != &ctrl_entity_nil) + else if(info.callstack_thread != &d_entity_nil) { info.cell_style_key = str8_lit("call_stack_frame"); - CTRL_Entity *process = ctrl_process_from_entity(info.callstack_thread); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, info.callstack_vaddr); + D_Entity *process = ctrl_process_from_entity(info.callstack_thread); + D_Entity *module = ctrl_module_from_process_vaddr(process, info.callstack_vaddr); E_Eval module_eval = e_eval_from_stringf("query:control.%S", ctrl_string_from_handle(scratch.arena, module->handle)); CFG_Node *view = cfg_node_from_id(rd_regs()->view); CFG_Node *style = cfg_node_child_from_string(view, info.cell_style_key); @@ -1418,7 +1418,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) #define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct) rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_CallStackFrame, row->eval, .default_pct = 0.05f, .pct = take_pct()); rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .default_pct = 0.75f, .pct = take_pct()); - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, (module == &ctrl_entity_nil ? (E_Eval)zero_struct : module_eval), + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, (module == &d_entity_nil ? (E_Eval)zero_struct : module_eval), .default_pct = 0.20f, .pct = take_pct()); #undef take_pct } @@ -1487,7 +1487,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla .flags = cell->flags, .view_ui_rule = &rd_nil_view_ui_rule, .cfg = &cfg_nil_node, - .entity = &ctrl_entity_nil, + .entity = &d_entity_nil, }; ////////////////////////////// @@ -1600,7 +1600,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla } //- rjf: entity evaluation -> button for entity - else if(result.entity != &ctrl_entity_nil) + else if(result.entity != &d_entity_nil) { result.expr_fstrs = rd_title_fstrs_from_ctrl_entity(arena, result.entity, 1); result.flags |= RD_WatchCellFlag_Button; @@ -1780,12 +1780,12 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla string_params.flags |= EV_StringFlag_DisableStringQuotes|EV_StringFlag_DisableAddresses; } if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && - rd_ctrl_entity_from_eval_space(cell->eval.space)->kind == CTRL_EntityKind_Module) + rd_ctrl_entity_from_eval_space(cell->eval.space)->kind == D_EntityKind_Module) { string_params.radix = 16; } - if(cell->eval.space.kind == CTRL_EvalSpaceKind_Entity && - rd_ctrl_entity_from_eval_space(cell->eval.space)->kind == CTRL_EntityKind_Thread) + if(cell->eval.space.kind == D_EvalSpaceKind_Entity && + rd_ctrl_entity_from_eval_space(cell->eval.space)->kind == D_EntityKind_Thread) { string_params.radix = 16; } @@ -2099,7 +2099,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) if(rd_regs()->lang_kind == TXT_LangKind_Null) { Access *access = access_open(); - CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi != &rdi_parsed_nil) @@ -2223,7 +2223,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) // if(rd_regs()->file_path.size != 0) { - CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); rd_regs()->lines = d_lines_from_dbgi_key_file_path_line_num(rd_frame_arena(), dbgi_key, rd_regs()->file_path, rd_regs()->cursor.line); } @@ -2381,7 +2381,7 @@ struct RD_DisasmViewState B32 initialized; TxtPt cursor; TxtPt mark; - CTRL_Handle temp_look_process; + D_Handle temp_look_process; U64 temp_look_vaddr; U64 temp_look_run_gen; U64 goto_vaddr; @@ -2433,13 +2433,13 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == ctrl_run_gen()) { auto_selected = 1; - auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, dv->temp_look_process), CTRL_EvalSpaceKind_Entity); + auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, dv->temp_look_process), D_EvalSpaceKind_Entity); eval = e_eval_from_stringf("(0x%I64x & (~(0x4000 - 1)))", dv->temp_look_vaddr); } else { auto_selected = 1; - auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), CTRL_EvalSpaceKind_Entity); + auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), D_EvalSpaceKind_Entity); eval = e_eval_from_stringf("(reg:rip & (~(0x4000 - 1)))"); } } @@ -2484,14 +2484,14 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) } Rng1U64 range = rd_space_range_from_eval(eval); Arch arch = rd_arch_from_eval(eval); - CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(space); - CTRL_Entity *dasm_module = &ctrl_entity_nil; + D_Entity *space_entity = rd_ctrl_entity_from_eval_space(space); + D_Entity *dasm_module = &d_entity_nil; DI_Key dbgi_key = {0}; U64 base_vaddr = 0; switch(space_entity->kind) { default:{}break; - case CTRL_EntityKind_Process: + case D_EntityKind_Process: { if(arch == Arch_Null) { arch = space_entity->arch; } dasm_module = ctrl_module_from_process_vaddr(space_entity, range.min); @@ -2541,7 +2541,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) U128 dasm_text_hash = {0}; TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(access, rd_regs()->text_key, rd_regs()->lang_kind, &dasm_text_hash); String8 dasm_text_data = c_data_from_hash(access, dasm_text_hash); - B32 is_loading = (dasm_text_info.lines_count == 0 && dim_1u64(range) != 0 && eval.msgs.max_kind == E_MsgKind_Null && (space.kind != CTRL_EvalSpaceKind_Entity || space_entity != &ctrl_entity_nil)); + B32 is_loading = (dasm_text_info.lines_count == 0 && dim_1u64(range) != 0 && eval.msgs.max_kind == E_MsgKind_Null && (space.kind != D_EvalSpaceKind_Entity || space_entity != &d_entity_nil)); B32 has_disasm = (dasm_text_info.lines_count != 0 && dasm_info.lines.count != 0); ////////////////////////////// @@ -2602,7 +2602,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) RD_Font(RD_FontSlot_Code) { U64 cursor_vaddr = (1 <= rd_regs()->cursor.line && rd_regs()->cursor.line <= dasm_info.lines.count) ? (range.min+dasm_info.lines.v[rd_regs()->cursor.line-1].code_off) : 0; - if(dasm_module != &ctrl_entity_nil) + if(dasm_module != &d_entity_nil) { ui_labelf("%S", dasm_module->string); ui_spacer(ui_em(1.5f, 1)); @@ -2680,7 +2680,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Rng1U64 view_range = rd_space_range_from_eval(eval); if(eval.space.kind == 0) { - eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), CTRL_EvalSpaceKind_Entity); + eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), D_EvalSpaceKind_Entity); view_range = rd_whole_range_from_eval_space(eval.space); } @@ -3218,12 +3218,12 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { e_space_read(eval.space, visible_memory, viz_range_bytes); } - if(eval.space.kind == CTRL_EvalSpaceKind_Entity) + if(eval.space.kind == D_EvalSpaceKind_Entity) { - CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); - if(entity->kind == CTRL_EntityKind_Process) + D_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); + if(entity->kind == D_EntityKind_Process) { - CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, viz_range_bytes, 0, 0); + D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, viz_range_bytes, 0, 0); visible_memory_change_flags = slice.byte_changed_flags; visible_memory_bad_flags = slice.byte_bad_flags; } @@ -3258,11 +3258,11 @@ RD_VIEW_UI_FUNCTION_DEF(memory) AnnotationList *visible_memory_annotations = push_array(scratch.arena, AnnotationList, visible_memory_size); { Access *access = access_open(); - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - CTRL_Entity *selected_process = ctrl_entity_ancestor_from_kind(selected_thread, CTRL_EntityKind_Process); - CTRL_CallStack selected_call_stack = ctrl_call_stack_from_thread(access, selected_thread->handle, 1, 0); - CTRL_Entity *eval_process = &ctrl_entity_nil; - if(eval.space.kind == CTRL_EvalSpaceKind_Entity) + D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *selected_process = ctrl_entity_ancestor_from_kind(selected_thread, D_EntityKind_Process); + D_CallStack selected_call_stack = ctrl_call_stack_from_thread(access, selected_thread->handle, 1, 0); + D_Entity *eval_process = &d_entity_nil; + if(eval.space.kind == D_EvalSpaceKind_Entity) { eval_process = rd_ctrl_entity_from_eval_space(eval.space); } @@ -3299,7 +3299,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) U64 last_stack_top = regs_rsp_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs); for(U64 idx = 1; idx < selected_call_stack.concrete_frames_count; idx += 1) { - CTRL_CallStackFrame *f = selected_call_stack.concrete_frames[idx]; + D_CallStackFrame *f = selected_call_stack.concrete_frames[idx]; U64 f_stack_top = regs_rsp_from_arch_block(selected_thread->arch, f->regs); Rng1U64 frame_vaddr_range = r1u64(last_stack_top, f_stack_top); Rng1U64 frame_vaddr_range_in_viz = intersect_1u64(frame_vaddr_range, viz_range_bytes); @@ -3309,7 +3309,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Access *access = access_open(); U64 f_rip_vaddr = last_rip; last_rip = regs_rip_from_arch_block(selected_thread->arch, f->regs); - CTRL_Entity *module = ctrl_module_from_process_vaddr(selected_process, f_rip_vaddr); + D_Entity *module = ctrl_module_from_process_vaddr(selected_process, f_rip_vaddr); U64 f_rip_voff = ctrl_voff_from_vaddr(module, f_rip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); @@ -3336,7 +3336,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } //- rjf: fill procedures annotations - if(eval_process != &ctrl_entity_nil) + if(eval_process != &d_entity_nil) { Vec4F32 symbol_color = ui_color_from_name(str8_lit("code_symbol")); Vec4F32 color_gen_table[] = @@ -3352,8 +3352,8 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { next_vaddr = vaddr+1; Access *access = access_open(); - CTRL_Entity *module = ctrl_module_from_process_vaddr(eval_process, vaddr); - if(module != &ctrl_entity_nil) + D_Entity *module = ctrl_module_from_process_vaddr(eval_process, vaddr); + if(module != &d_entity_nil) { U64 voff = ctrl_voff_from_vaddr(module, vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); @@ -3393,7 +3393,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } //- rjf: fill globals annotations - if(eval_process != &ctrl_entity_nil) + if(eval_process != &d_entity_nil) { Vec4F32 symbol_color = ui_color_from_name(str8_lit("code_symbol")); Vec4F32 color_gen_table[] = @@ -3457,7 +3457,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } //- rjf: fill local variable annotations - if(e_space_match(rd_eval_space_from_ctrl_entity(selected_process, CTRL_EvalSpaceKind_Entity), eval.space)) + if(e_space_match(rd_eval_space_from_ctrl_entity(selected_process, D_EvalSpaceKind_Entity), eval.space)) { Vec4F32 local_color = ui_color_from_name(str8_lit("code_local")); Vec4F32 color_gen_table[] = @@ -3505,7 +3505,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } //- rjf: fill debuggee-specified annotations - if(eval_process != &ctrl_entity_nil) UI_TagF(".") UI_TagF("pop") + if(eval_process != &d_entity_nil) UI_TagF(".") UI_TagF("pop") { Vec4F32 text_color = ui_color_from_name(str8_lit("text")); Vec4F32 symbol_color = ui_color_from_name(str8_lit("background")); @@ -3516,9 +3516,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.10f), mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.15f), }; - for(CTRL_Entity *child = eval_process->first; child != &ctrl_entity_nil; child = child->next) + for(D_Entity *child = eval_process->first; child != &d_entity_nil; child = child->next) { - if(child->kind != CTRL_EntityKind_AddressRangeAnnotation) + if(child->kind != D_EntityKind_AddressRangeAnnotation) { continue; } diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index fd497d98..478bd154 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -120,14 +120,14 @@ struct RD_WatchCellList typedef struct RD_WatchRowInfo RD_WatchRowInfo; struct RD_WatchRowInfo { - CTRL_Entity *module; + D_Entity *module; B32 can_expand; B32 expr_is_editable; String8 group_cfg_name; CFG_Node *group_cfg_parent; CFG_Node *group_cfg_child; - CTRL_Entity *group_entity; - CTRL_Entity *callstack_thread; + D_Entity *group_entity; + D_Entity *callstack_thread; U64 callstack_unwind_index; U64 callstack_inline_depth; U64 callstack_vaddr; @@ -141,7 +141,7 @@ struct RD_WatchRowCellInfo { RD_WatchCellFlags flags; CFG_Node *cfg; - CTRL_Entity *entity; + D_Entity *entity; String8 cmd_name; String8 file_path; DR_FStrList expr_fstrs; diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index e5d09971..586d2964 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -102,13 +102,13 @@ rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras) //- rjf: [breakpoints] push hit marker if(str8_match(cfg->string, str8_lit("breakpoint"), 0)) { - CTRL_Event stop_event = d_ctrl_last_stop_event(); - if(stop_event.cause == CTRL_EventCause_UserBreakpoint) + D_Event stop_event = d_ctrl_last_stop_event(); + if(stop_event.cause == D_EventCause_UserBreakpoint) { CFG_Node *bp = cfg_node_from_id(stop_event.u64_code); if(bp == cfg) { - CTRL_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); + D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); Vec4F32 thread_color = rd_color_from_ctrl_entity(thread); if(thread_color.w == 0) { @@ -445,7 +445,7 @@ rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras) } internal DR_FStrList -rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_extras) +rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extras) { DR_FStrList result = {0}; @@ -467,10 +467,10 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e switch(entity->kind) { default:{}break; - case CTRL_EntityKind_Machine: {icon_kind = RD_IconKind_Machine;}break; - case CTRL_EntityKind_Process: {icon_kind = RD_IconKind_Threads;}break; - case CTRL_EntityKind_Thread: {icon_kind = RD_IconKind_Thread; name_is_code = 1;}break; - case CTRL_EntityKind_Module: {icon_kind = RD_IconKind_Module;}break; + case D_EntityKind_Machine: {icon_kind = RD_IconKind_Machine;}break; + case D_EntityKind_Process: {icon_kind = RD_IconKind_Threads;}break; + case D_EntityKind_Thread: {icon_kind = RD_IconKind_Thread; name_is_code = 1;}break; + case D_EntityKind_Module: {icon_kind = RD_IconKind_Module;}break; } //- rjf: set up drawing params @@ -484,9 +484,9 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e } //- rjf: push frozen icon, if frozen - if((entity->kind == CTRL_EntityKind_Machine || - entity->kind == CTRL_EntityKind_Process || - entity->kind == CTRL_EntityKind_Thread) && + if((entity->kind == D_EntityKind_Machine || + entity->kind == D_EntityKind_Process || + entity->kind == D_EntityKind_Thread) && ctrl_entity_tree_is_frozen(entity)) UI_TagF("bad") { @@ -495,7 +495,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e } //- rjf: push selected icon, if selected thread - if(entity->kind == CTRL_EntityKind_Thread) + if(entity->kind == D_EntityKind_Thread) { B32 is_selected = ctrl_handle_match(entity->handle, rd_base_regs()->thread); if(is_selected) @@ -506,13 +506,13 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e } //- rjf: push containing process prefix - if(entity->kind == CTRL_EntityKind_Thread || - entity->kind == CTRL_EntityKind_Module) + if(entity->kind == D_EntityKind_Thread || + entity->kind == D_EntityKind_Module) { - CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process); + D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count > 1) { - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + D_Entity *process = ctrl_entity_ancestor_from_kind(entity, D_EntityKind_Process); String8 process_name = rd_name_from_ctrl_entity(arena, process); Vec4F32 process_color = rd_color_from_ctrl_entity(process); if(process_color.w == 0) @@ -536,30 +536,30 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e .color = color); //- rjf: push PID - if(entity->kind == CTRL_EntityKind_Process) + if(entity->kind == D_EntityKind_Process) { dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); dr_fstrs_push_new(arena, &result, ¶ms, push_str8f(arena, " (PID: %I64u)", entity->id), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .color = secondary_color, .size = ui_top_font_size()*0.85f); } //- rjf: threads get callstack extras - if(entity->kind == CTRL_EntityKind_Thread && include_extras) + if(entity->kind == D_EntityKind_Thread && include_extras) { Vec4F32 symbol_color = ui_color_from_name(str8_lit("code_symbol")); dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); Access *access = access_open(); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process); + D_Entity *process = ctrl_entity_ancestor_from_kind(entity, D_EntityKind_Process); Arch arch = entity->arch; B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread); - CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + D_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); B32 did_first_known = 0; for(U64 idx = 0, limit = 10; idx < call_stack.frames_count && idx < limit; idx += 1) { - CTRL_CallStackFrame *f = &call_stack.frames[call_stack.frames_count - 1 - idx]; + D_CallStackFrame *f = &call_stack.frames[call_stack.frames_count - 1 - idx]; U64 rip_vaddr = regs_rip_from_arch_block(arch, f->regs); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); + D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); String8 name = {0}; { @@ -594,7 +594,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e } //- rjf: modules get debug info status extras - if(entity->kind == CTRL_EntityKind_Module && include_extras) + if(entity->kind == D_EntityKind_Module && include_extras) { Access *access = access_open(); DI_Key dbgi_key = ctrl_dbgi_key_from_module(entity); @@ -1254,12 +1254,12 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe RD_CodeSliceSignal result = {0}; ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - CTRL_Entity *selected_thread_process = ctrl_entity_ancestor_from_kind(selected_thread, CTRL_EntityKind_Process); + D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *selected_thread_process = ctrl_entity_ancestor_from_kind(selected_thread, D_EntityKind_Process); U64 selected_thread_rip_unwind_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count); - CTRL_Entity *selected_thread_module = ctrl_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); - CTRL_Event stop_event = d_ctrl_last_stop_event(); - CTRL_Entity *stopper_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); + D_Entity *selected_thread_module = ctrl_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); + D_Event stop_event = d_ctrl_last_stop_event(); + D_Entity *stopper_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); B32 is_focused = ui_is_focus_active(); B32 ctrlified = (os_get_modifiers() & OS_Modifier_Ctrl); Vec4F32 code_line_bgs[] = @@ -1314,7 +1314,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // B32 drop_can_hit_lines = 0; CFG_Node *drop_cfg = &cfg_nil_node; - CTRL_Entity *drop_thread = &ctrl_entity_nil; + D_Entity *drop_thread = &d_entity_nil; String8 drop_expr = {0}; Vec4F32 drop_color = pop_color; UI_Key drop_site_key = ui_key_from_stringf(top_container_box->key, "drop_site"); @@ -1368,10 +1368,10 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num < params->line_num_range.max; line_num += 1, line_idx += 1) { - CTRL_EntityList threads = params->line_ips[line_idx]; - for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next) + D_EntityList threads = params->line_ips[line_idx]; + for(D_EntityNode *n = threads.first; n != 0; n = n->next) { - if(n->v == stopper_thread && (stop_event.cause == CTRL_EventCause_InterruptedByTrap || stop_event.cause == CTRL_EventCause_InterruptedByException)) + if(n->v == stopper_thread && (stop_event.cause == D_EventCause_InterruptedByTrap || stop_event.cause == D_EventCause_InterruptedByException)) { line_bg_colors[line_idx] = ui_color_from_name(str8_lit("background")); } @@ -1404,24 +1404,24 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num <= params->line_num_range.max; line_num += 1, line_idx += 1) { - CTRL_EntityList line_ips = params->line_ips[line_idx]; + D_EntityList line_ips = params->line_ips[line_idx]; ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); UI_Parent(line_margin_box) { //- rjf: build margin thread ip ui - for(CTRL_EntityNode *n = line_ips.first; n != 0; n = n->next) + for(D_EntityNode *n = line_ips.first; n != 0; n = n->next) { // rjf: unpack thread - CTRL_Entity *thread = n->v; + D_Entity *thread = n->v; if(thread != selected_thread) { continue; } U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); @@ -1437,9 +1437,9 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe color = ui_color_from_name(str8_lit("thread_unwound")); } else if(thread == stopper_thread && - (stop_event.cause == CTRL_EventCause_InterruptedByHalt || - stop_event.cause == CTRL_EventCause_InterruptedByTrap || - stop_event.cause == CTRL_EventCause_InterruptedByException)) + (stop_event.cause == D_EventCause_InterruptedByHalt || + stop_event.cause == D_EventCause_InterruptedByTrap || + stop_event.cause == D_EventCause_InterruptedByException)) { color = ui_color_from_name(str8_lit("thread_error")); } @@ -1557,7 +1557,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num <= params->line_num_range.max; line_num += 1, line_idx += 1) { - CTRL_EntityList line_ips = params->line_ips[line_idx]; + D_EntityList line_ips = params->line_ips[line_idx]; CFG_NodePtrList line_bps = params->line_bps[line_idx]; CFG_NodePtrList line_pins = params->line_pins[line_idx]; ui_set_next_hover_cursor(OS_Cursor_HandPoint); @@ -1566,18 +1566,18 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe UI_Parent(line_margin_box) { //- rjf: build margin thread ip ui - for(CTRL_EntityNode *n = line_ips.first; n != 0; n = n->next) + for(D_EntityNode *n = line_ips.first; n != 0; n = n->next) { // rjf: unpack thread - CTRL_Entity *thread = n->v; + D_Entity *thread = n->v; if(thread == selected_thread) { continue; } U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); @@ -1593,9 +1593,9 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe color = ui_color_from_name(str8_lit("thread_unwound")); } else if(thread == stopper_thread && - (stop_event.cause == CTRL_EventCause_InterruptedByHalt || - stop_event.cause == CTRL_EventCause_InterruptedByTrap || - stop_event.cause == CTRL_EventCause_InterruptedByException)) + (stop_event.cause == D_EventCause_InterruptedByHalt || + stop_event.cause == D_EventCause_InterruptedByTrap || + stop_event.cause == D_EventCause_InterruptedByException)) { color = ui_color_from_name(str8_lit("thread_error")); } @@ -2260,21 +2260,21 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe .cursor = line_vaddr == 0 ? txt_pt(line_num, 1) : txt_pt(0, 0), .vaddr = line_vaddr); } - if(drop_thread != &ctrl_entity_nil) + if(drop_thread != &d_entity_nil) { S64 line_num = mouse_pt.line; U64 line_idx = line_num - params->line_num_range.min; U64 line_vaddr = params->line_vaddrs[line_idx]; - CTRL_Entity *thread = drop_thread; + D_Entity *thread = drop_thread; U64 new_rip_vaddr = line_vaddr; if(params->line_vaddrs[line_idx] == 0) { D_LineList *lines = ¶ms->line_infos[line_idx]; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); - if(module != &ctrl_entity_nil) + D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + if(module != &d_entity_nil) { new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); break; @@ -2486,13 +2486,13 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num < params->line_num_range.max; line_num += 1, line_idx += 1) { - CTRL_EntityList threads = params->line_ips[line_idx]; - for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next) + D_EntityList threads = params->line_ips[line_idx]; + for(D_EntityNode *n = threads.first; n != 0; n = n->next) { - CTRL_Entity *thread = n->v; + D_Entity *thread = n->v; if(thread == stopper_thread && - (stop_event.cause == CTRL_EventCause_InterruptedByException || - stop_event.cause == CTRL_EventCause_InterruptedByTrap)) + (stop_event.cause == D_EventCause_InterruptedByException || + stop_event.cause == D_EventCause_InterruptedByTrap)) { DR_FStrList explanation_fstrs = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &stop_event); UI_Parent(line_extras_boxes[line_idx]) UI_PrefWidth(ui_text_dim(10, 1)) UI_TextAlignment(UI_TextAlign_Center) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) @@ -2575,7 +2575,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { E_Eval eval = e_eval_from_string(mouse_expr); B32 eval_implicit_hover = (eval.irtree.mode != E_Mode_Null && - eval.space.kind == CTRL_EvalSpaceKind_Entity); + eval.space.kind == D_EvalSpaceKind_Entity); if(eval.msgs.max_kind == E_MsgKind_Null && (eval_implicit_hover || mouse_expr_is_explicit)) { U64 line_vaddr = 0; @@ -2659,7 +2659,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe Rng1U64 hover_voff_range = hover_regs->voff_range; if(hover_voff_range.min == 0 && hover_voff_range.max == 0) { - CTRL_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, hover_regs->module); + D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, hover_regs->module); hover_voff_range = ctrl_voff_range_from_vaddr_range(module, hover_regs->vaddr_range); } ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); diff --git a/src/raddbg/raddbg_widgets.h b/src/raddbg/raddbg_widgets.h index 66055279..70d4f127 100644 --- a/src/raddbg/raddbg_widgets.h +++ b/src/raddbg/raddbg_widgets.h @@ -102,7 +102,7 @@ struct RD_CodeSliceParams Rng1U64 *line_ranges; TXT_TokenArray *line_tokens; CFG_NodePtrList *line_bps; - CTRL_EntityList *line_ips; + D_EntityList *line_ips; CFG_NodePtrList *line_pins; U64 *line_vaddrs; D_LineList *line_infos; @@ -140,7 +140,7 @@ struct RD_CodeSliceSignal //~ rjf: UI Widgets: Fancy Title Strings internal DR_FStrList rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras); -internal DR_FStrList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_extras); +internal DR_FStrList rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extras); internal DR_FStrList rd_title_fstrs_from_code_name(Arena *arena, String8 code_name); internal DR_FStrList rd_title_fstrs_from_file_path(Arena *arena, String8 file_path); From 0e3c821e2889cfd30a9b32f2c97c20d0255fe354 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 14:31:08 -0700 Subject: [PATCH 445/850] collapse ctrl/d bps --- src/dbg_engine/dbg_engine_core.h | 61 ++++------ src/dbg_engine/dbg_engine_ctrl.c | 197 +++++++++++++++---------------- src/dbg_engine/dbg_engine_ctrl.h | 10 +- src/dbg_engine/dbg_engine_user.c | 24 ++-- src/dbg_engine/dbg_engine_user.h | 2 +- 5 files changed, 128 insertions(+), 166 deletions(-) diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index f64f6e50..c6f6ba71 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -60,39 +60,37 @@ enum D_BreakpointFlag_BreakOnExecute = (1<<2), }; -typedef enum CTRL_UserBreakpointKind +typedef struct D_Breakpoint D_Breakpoint; +struct D_Breakpoint { - CTRL_UserBreakpointKind_Null, - CTRL_UserBreakpointKind_FileNameAndLineColNumber, - CTRL_UserBreakpointKind_Expression, - CTRL_UserBreakpointKind_COUNT -} -CTRL_UserBreakpointKind; - -typedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint; -struct CTRL_UserBreakpoint -{ - CTRL_UserBreakpointKind kind; D_BreakpointFlags flags; U64 id; - String8 string; + String8 file_path; TxtPt pt; - U64 size; + String8 vaddr_expr; String8 condition; + U64 size; }; -typedef struct CTRL_UserBreakpointNode CTRL_UserBreakpointNode; -struct CTRL_UserBreakpointNode +typedef struct D_BreakpointArray D_BreakpointArray; +struct D_BreakpointArray { - CTRL_UserBreakpointNode *next; - CTRL_UserBreakpoint v; + D_Breakpoint *v; + U64 count; }; -typedef struct CTRL_UserBreakpointList CTRL_UserBreakpointList; -struct CTRL_UserBreakpointList +typedef struct D_BreakpointNode D_BreakpointNode; +struct D_BreakpointNode { - CTRL_UserBreakpointNode *first; - CTRL_UserBreakpointNode *last; + D_BreakpointNode *next; + D_Breakpoint v; +}; + +typedef struct D_BreakpointList D_BreakpointList; +struct D_BreakpointList +{ + D_BreakpointNode *first; + D_BreakpointNode *last; U64 count; }; @@ -253,25 +251,6 @@ struct D_TargetArray U64 count; }; -typedef struct D_Breakpoint D_Breakpoint; -struct D_Breakpoint -{ - D_BreakpointFlags flags; - U64 id; - String8 file_path; - TxtPt pt; - String8 vaddr_expr; - String8 condition; - U64 size; -}; - -typedef struct D_BreakpointArray D_BreakpointArray; -struct D_BreakpointArray -{ - D_Breakpoint *v; - U64 count; -}; - typedef struct D_PathMap D_PathMap; struct D_PathMap { diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index c6608ec3..ea9233d4 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -268,24 +268,25 @@ ctrl_trap_list_copy(Arena *arena, D_TrapList *src) //~ rjf: User Breakpoint Type Functions internal void -ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp) +ctrl_user_breakpoint_list_push(Arena *arena, D_BreakpointList *list, D_Breakpoint *bp) { - CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); + D_BreakpointNode *n = push_array(arena, D_BreakpointNode, 1); MemoryCopyStruct(&n->v, bp); SLLQueuePush(list->first, list->last, n); list->count += 1; } -internal CTRL_UserBreakpointList -ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src) +internal D_BreakpointList +ctrl_user_breakpoint_list_copy(Arena *arena, D_BreakpointList *src) { - CTRL_UserBreakpointList dst = {0}; - for(CTRL_UserBreakpointNode *src_n = src->first; src_n != 0; src_n = src_n->next) + D_BreakpointList dst = {0}; + for(D_BreakpointNode *src_n = src->first; src_n != 0; src_n = src_n->next) { - CTRL_UserBreakpoint dst_bp = zero_struct; + D_Breakpoint dst_bp = zero_struct; MemoryCopyStruct(&dst_bp, &src_n->v); - dst_bp.string = push_str8_copy(arena, src_n->v.string); - dst_bp.condition = push_str8_copy(arena, src_n->v.condition); + dst_bp.file_path = str8_copy(arena, src_n->v.file_path); + dst_bp.vaddr_expr = str8_copy(arena, src_n->v.vaddr_expr); + dst_bp.condition = str8_copy(arena, src_n->v.condition); ctrl_user_breakpoint_list_push(arena, &dst, &dst_bp); } return dst; @@ -425,18 +426,19 @@ ctrl_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs) // rjf: write user breakpoint list str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->user_bps.count); - for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) + for(D_BreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) { - CTRL_UserBreakpoint *bp = &n->v; - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->kind); + D_Breakpoint *bp = &n->v; str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->flags); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->id); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->string.size); - str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->string.str, bp->string.size); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->file_path.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->file_path.str, bp->file_path.size); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->pt); - str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->size); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->vaddr_expr.size); + str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->vaddr_expr.str, bp->vaddr_expr.size); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->condition.size); str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->condition.str, bp->condition.size); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->size); } } } @@ -547,21 +549,23 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) read_off += str8_deserial_read_struct(string, read_off, &user_bp_count); for(U64 idx = 0; idx < user_bp_count; idx += 1) { - CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1); + D_BreakpointNode *n = push_array(arena, D_BreakpointNode, 1); SLLQueuePush(msg->user_bps.first, msg->user_bps.last, n); msg->user_bps.count += 1; - CTRL_UserBreakpoint *bp = &n->v; - read_off += str8_deserial_read_struct(string, read_off, &bp->kind); + D_Breakpoint *bp = &n->v; read_off += str8_deserial_read_struct(string, read_off, &bp->flags); read_off += str8_deserial_read_struct(string, read_off, &bp->id); - read_off += str8_deserial_read_struct(string, read_off, &bp->string.size); - bp->string.str = push_array_no_zero(arena, U8, bp->string.size); - read_off += str8_deserial_read(string, read_off, bp->string.str, bp->string.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &bp->file_path.size); + bp->file_path.str = push_array_no_zero(arena, U8, bp->file_path.size); + read_off += str8_deserial_read(string, read_off, bp->file_path.str, bp->file_path.size, 1); read_off += str8_deserial_read_struct(string, read_off, &bp->pt); - read_off += str8_deserial_read_struct(string, read_off, &bp->size); + read_off += str8_deserial_read_struct(string, read_off, &bp->vaddr_expr.size); + bp->vaddr_expr.str = push_array_no_zero(arena, U8, bp->vaddr_expr.size); + read_off += str8_deserial_read(string, read_off, bp->vaddr_expr.str, bp->vaddr_expr.size, 1); read_off += str8_deserial_read_struct(string, read_off, &bp->condition.size); bp->condition.str = push_array_no_zero(arena, U8, bp->condition.size); read_off += str8_deserial_read(string, read_off, bp->condition.str, bp->condition.size, 1); + read_off += str8_deserial_read_struct(string, read_off, &bp->size); } } } @@ -3383,13 +3387,13 @@ ctrl_thread__entry_point(void *p) //- rjf: gather all touched symbols by user breakpoints { Temp scratch = scratch_begin(0, 0); - for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) + for(D_BreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) { - if(n->v.kind != CTRL_UserBreakpointKind_Expression) + if(n->v.vaddr_expr.size == 0) { continue; } - E_Parse addr_parse = e_push_parse_from_string(scratch.arena, n->v.string); + E_Parse addr_parse = e_push_parse_from_string(scratch.arena, n->v.vaddr_expr); E_Parse cnd_parse = e_push_parse_from_string(scratch.arena, n->v.condition); E_Expr *exprs[] = {addr_parse.expr, cnd_parse.expr}; for EachElement(idx, exprs) @@ -3433,18 +3437,11 @@ ctrl_thread__entry_point(void *p) scratch_end(scratch); } - - - - //- rjf: gather all touched files by user breakpoints - for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) + for(D_BreakpointNode *n = msg->user_bps.first; n != 0; n = n->next) { - if(n->v.kind != CTRL_UserBreakpointKind_FileNameAndLineColNumber) - { - continue; - } - str8_list_push(d_ctrl_state->ctrl_thread_msg_process_arena, &d_ctrl_state->msg_user_bp_touched_files, n->v.string); + if(n->v.file_path.size == 0) { continue; } + str8_list_push(d_ctrl_state->ctrl_thread_msg_process_arena, &d_ctrl_state->msg_user_bp_touched_files, n->v.file_path); } //- rjf: process message @@ -3547,7 +3544,7 @@ ctrl_thread__entry_point(void *p) //- rjf: breakpoint resolution internal void -ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out) { if(user_bps->first == 0) { return; } ProfBeginFunction(); @@ -3559,78 +3556,74 @@ ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eva DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_entity); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); U64 base_vaddr = module_entity->vaddr_range.min; - for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) + for(D_BreakpointNode *n = user_bps->first; n != 0; n = n->next) { - CTRL_UserBreakpoint *bp = &n->v; - switch(bp->kind) + D_Breakpoint *bp = &n->v; + + //- rjf: file:line-based breakpoints + if(bp->file_path.size != 0) { - default:{}break; - - //- rjf: file:line-based breakpoints - case CTRL_UserBreakpointKind_FileNameAndLineColNumber: + // rjf: unpack & normalize + TxtPt pt = bp->pt; + String8 filename = bp->file_path; + String8 filename_normalized = push_str8_copy(scratch.arena, filename); + for(U64 idx = 0; idx < filename_normalized.size; idx += 1) { - // rjf: unpack & normalize - TxtPt pt = bp->pt; - String8 filename = bp->string; - String8 filename_normalized = push_str8_copy(scratch.arena, filename); - for(U64 idx = 0; idx < filename_normalized.size; idx += 1) + filename_normalized.str[idx] = lower_from_char(filename_normalized.str[idx]); + filename_normalized.str[idx] = correct_slash_from_char(filename_normalized.str[idx]); + } + + // rjf: filename -> src_id + U32 src_id = 0; + { + RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); + if(mapptr != 0) { - filename_normalized.str[idx] = lower_from_char(filename_normalized.str[idx]); - filename_normalized.str[idx] = correct_slash_from_char(filename_normalized.str[idx]); - } - - // rjf: filename -> src_id - U32 src_id = 0; - { - RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths); - if(mapptr != 0) + RDI_ParsedNameMap map = {0}; + rdi_parsed_from_name_map(rdi, mapptr, &map); + RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); + if(node != 0) { - RDI_ParsedNameMap map = {0}; - rdi_parsed_from_name_map(rdi, mapptr, &map); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size); - if(node != 0) + U32 id_count = 0; + U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); + if(id_count > 0) { - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - if(id_count > 0) - { - src_id = ids[0]; - } + src_id = ids[0]; } } } - - // rjf: src_id * pt -> push - if(src_id != 0) - { - RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); - RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); - RDI_ParsedSourceLineMap line_map = {0}; - rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); - U32 voff_count = 0; - U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); - for(U32 i = 0; i < voff_count; i += 1) - { - U64 vaddr = voffs[i] + base_vaddr; - DMN_Trap trap = {process.dmn_handle, vaddr, (U64)bp}; - dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); - } - } - }break; + } - //- rjf: expression-based breakpoints - case CTRL_UserBreakpointKind_Expression: + // rjf: src_id * pt -> push + if(src_id != 0) { - String8 expr = bp->string; - E_Value value = e_value_from_string(expr); - if(value.u64 != 0 || bp->flags != 0) + RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id); + RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx); + RDI_ParsedSourceLineMap line_map = {0}; + rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map); + U32 voff_count = 0; + U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count); + for(U32 i = 0; i < voff_count; i += 1) { - DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; - trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags); - trap.size = bp->size; + U64 vaddr = voffs[i] + base_vaddr; + DMN_Trap trap = {process.dmn_handle, vaddr, (U64)bp}; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); } - }break; + } + } + + //- rjf: expression-based breakpoints + else if(bp->vaddr_expr.size != 0) + { + String8 expr = bp->vaddr_expr; + E_Value value = e_value_from_string(expr); + if(value.u64 != 0 || bp->flags != 0) + { + DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; + trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags); + trap.size = bp->size; + dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); + } } } scratch_end(scratch); @@ -3638,14 +3631,14 @@ ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eva } internal void -ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out) +ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out) { - for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next) + for(D_BreakpointNode *n = user_bps->first; n != 0; n = n->next) { - CTRL_UserBreakpoint *bp = &n->v; - if(bp->kind == CTRL_UserBreakpointKind_Expression) + D_Breakpoint *bp = &n->v; + if(bp->vaddr_expr.size != 0) { - String8 expr = bp->string; + String8 expr = bp->vaddr_expr; E_Value value = e_value_from_string(expr); if(value.u64 != 0 || bp->flags != 0) { @@ -4626,7 +4619,7 @@ ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) //- rjf: control thread eval scopes internal D_EvalScope * -ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, D_Entity *thread) +ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity *thread) { ProfBeginFunction(); D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; @@ -5914,7 +5907,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) trap->vaddr == event->instruction_pointer && (!dmn_handle_match(event->thread, target_thread.dmn_handle) || !target_thread_is_on_user_bp_and_trap_net_trap)) { - CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)trap->id; + D_Breakpoint *user_bp = (D_Breakpoint *)trap->id; hit_user_bp = 1; if(user_bp != 0 && !(trap->id & bit64) && user_bp->condition.size != 0) { @@ -6276,7 +6269,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { if(!(stop_event->user_data & bit64)) { - CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)stop_event->user_data; + D_Breakpoint *user_bp = (D_Breakpoint *)stop_event->user_data; event->u64_code = user_bp->id; } } diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index c076526a..97479724 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -381,8 +381,8 @@ internal D_TrapList ctrl_trap_list_copy(Arena *arena, D_TrapList *src); //////////////////////////////// //~ rjf: User Breakpoint Type Functions -internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp); -internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src); +internal void ctrl_user_breakpoint_list_push(Arena *arena, D_BreakpointList *list, D_Breakpoint *bp); +internal D_BreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, D_BreakpointList *src); //////////////////////////////// //~ rjf: Message Type Functions @@ -552,8 +552,8 @@ internal D_EventList ctrl_c2u_pop_events(Arena *arena); internal void ctrl_thread__entry_point(void *p); //- rjf: breakpoint resolution -internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out); internal void ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out); //- rjf: module lifetime open/close work @@ -568,7 +568,7 @@ internal U64 ctrl_eval_space_gen(E_Space space); internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); //- rjf: control thread eval scopes -internal D_EvalScope *ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, D_Entity *thread); +internal D_EvalScope *ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity *thread); internal void ctrl_thread__eval_scope_end(D_EvalScope *scope); //- rjf: log flusher diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 9050cf3f..0d99412e 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -2056,27 +2056,17 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P String8List overrides = d_possible_path_overrides_from_maps_path(scratch.arena, path_maps, bp->file_path); for(String8Node *n = overrides.first; n != 0; n = n->next) { - CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_FileNameAndLineColNumber}; - ctrl_user_bp.flags = bp->flags; - ctrl_user_bp.id = bp->id; - ctrl_user_bp.string = n->string; - ctrl_user_bp.pt = bp->pt; - ctrl_user_bp.condition = bp->condition; - ctrl_user_bp.size = bp->size; - ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); + D_Breakpoint dst_bp = {0}; + MemoryCopyStruct(&dst_bp, bp); + dst_bp.file_path = n->string; + ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &dst_bp); } } - // rjf: virtual address expression -> add expression breakpoint - else if(bp->vaddr_expr.size != 0) + // rjf: all other cases - just copy the breakpoint info + else { - CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_Expression}; - ctrl_user_bp.flags = bp->flags; - ctrl_user_bp.id = bp->id; - ctrl_user_bp.string = bp->vaddr_expr; - ctrl_user_bp.condition = bp->condition; - ctrl_user_bp.size = bp->size; - ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp); + ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, bp); } } } diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index 309f00b5..bd325413 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -199,7 +199,7 @@ struct D_Msg String8 stderr_path; String8 stdin_path; D_TrapList traps; - CTRL_UserBreakpointList user_bps; + D_BreakpointList user_bps; }; typedef struct D_MsgNode D_MsgNode; From 2eb0b8b233f777c9d7b6993293fbff6815c34458 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 14:53:37 -0700 Subject: [PATCH 446/850] ctrl -> d --- src/dbg_engine/dbg_engine.mdesk | 12 +- src/dbg_engine/dbg_engine_core.c | 8 +- src/dbg_engine/dbg_engine_core.h | 10 +- src/dbg_engine/dbg_engine_ctrl.c | 1086 ++++++++++---------- src/dbg_engine/dbg_engine_ctrl.h | 257 +++-- src/dbg_engine/dbg_engine_user.c | 176 ++-- src/dbg_engine/generated/dbg_engine.meta.c | 12 +- src/dbg_engine/generated/dbg_engine.meta.h | 12 +- src/eval/eval_types.c | 2 +- src/raddbg/raddbg_core.c | 238 ++--- src/raddbg/raddbg_eval.c | 52 +- src/raddbg/raddbg_main.c | 2 +- src/raddbg/raddbg_views.c | 102 +- src/raddbg/raddbg_widgets.c | 70 +- 14 files changed, 988 insertions(+), 1051 deletions(-) diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 1e8491d0..496cf811 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -115,13 +115,13 @@ D_EntityKindTable: COUNT, } -@data(String8) ctrl_entity_kind_code_name_table: +@data(String8) d_entity_kind_code_name_table: { `{0}`, @expand(D_EntityKindTable a) `str8_lit_comp("$(a.code_name)")` } -@data(String8) ctrl_entity_kind_display_string_table: +@data(String8) d_entity_kind_display_string_table: { `{0}`, @expand(D_EntityKindTable a) `str8_lit_comp("$(a.display_name)")` @@ -179,25 +179,25 @@ D_ExceptionCodeKindTable: COUNT, } -@data(U32) ctrl_exception_code_kind_code_table: +@data(U32) d_exception_code_kind_code_table: { `0`; @expand(D_ExceptionCodeKindTable a) `$(a.code)`; } -@data(String8) ctrl_exception_code_kind_display_string_table: +@data(String8) d_exception_code_kind_display_string_table: { `{0}`; @expand(D_ExceptionCodeKindTable a) `str8_lit_comp("$(a.display_string)")`; } -@data(String8) ctrl_exception_code_kind_lowercase_code_string_table: +@data(String8) d_exception_code_kind_lowercase_code_string_table: { `{0}`; @expand(D_ExceptionCodeKindTable a) `str8_lit_comp("$(a.lower_name)")`; } -@data(B8) ctrl_exception_code_kind_default_enable_table: +@data(B8) d_exception_code_kind_default_enable_table: { `0`; @expand(D_ExceptionCodeKindTable a) `$(a.default)`; diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index fd61937d..b80b61a7 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -71,7 +71,7 @@ d_init(void) scratch_end(scratch); } d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc(); - d_ctrl_state->ctrl_thread_entity_store = ctrl_entity_ctx_rw_store_alloc(); + d_ctrl_state->ctrl_thread_entity_store = d_entity_ctx_rw_store_alloc(); d_ctrl_state->ctrl_thread_eval_cache = e_cache_alloc(); d_ctrl_state->ctrl_thread_msg_process_arena = arena_alloc(); d_ctrl_state->dmn_event_arena = arena_alloc(); @@ -79,13 +79,13 @@ d_init(void) d_ctrl_state->dbg_dir_arena = arena_alloc(); for(D_ExceptionCodeKind k = (D_ExceptionCodeKind)0; k < D_ExceptionCodeKind_COUNT; k = (D_ExceptionCodeKind)(k+1)) { - if(ctrl_exception_code_kind_default_enable_table[k]) + if(d_exception_code_kind_default_enable_table[k]) { d_ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64); } } d_ctrl_state->ctrl_thread_log = log_alloc(); - d_ctrl_state->ctrl_thread = thread_launch(ctrl_thread__entry_point, 0); + d_ctrl_state->ctrl_thread = thread_launch(d_ctrl_thread__entry_point, 0); } //- rjf: set up user state @@ -96,7 +96,7 @@ d_init(void) d_user_state->cmds_arena = arena_alloc(); d_user_state->output_log_key = c_key_make(c_root_alloc(), c_id_make(0, 0)); c_submit_data(d_user_state->output_log_key, 0, str8_zero()); - d_user_state->ctrl_entity_store = ctrl_entity_ctx_rw_store_alloc(); + d_user_state->ctrl_entity_store = d_entity_ctx_rw_store_alloc(); d_user_state->ctrl_stop_arena = arena_alloc(); d_user_state->ctrl_msg_arena = arena_alloc(); diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index c6f6ba71..68b68b92 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -179,14 +179,14 @@ struct D_EntityHashSlot D_EntityHashNode *last; }; -typedef struct CTRL_EntityStringChunkNode CTRL_EntityStringChunkNode; -struct CTRL_EntityStringChunkNode +typedef struct D_EntityStringChunkNode D_EntityStringChunkNode; +struct D_EntityStringChunkNode { - CTRL_EntityStringChunkNode *next; + D_EntityStringChunkNode *next; U64 size; }; -read_only global U64 ctrl_entity_string_bucket_chunk_sizes[] = +read_only global U64 d_entity_string_bucket_chunk_sizes[] = { 16, 64, @@ -215,7 +215,7 @@ struct D_EntityCtxRWStore D_EntityCtx ctx; D_Entity *free; D_EntityHashNode *hash_node_free; - CTRL_EntityStringChunkNode *free_string_chunks[ArrayCount(ctrl_entity_string_bucket_chunk_sizes)]; + D_EntityStringChunkNode *free_string_chunks[ArrayCount(d_entity_string_bucket_chunk_sizes)]; }; typedef struct D_EntityCtxLookupAccel D_EntityCtxLookupAccel; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index ea9233d4..ef4fbd74 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -4,29 +4,16 @@ //////////////////////////////// //~ rjf: Basic Type Functions -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - internal U64 -ctrl_hash_from_string(String8 string) -{ - U64 result = XXH3_64bits_withSeed(string.str, string.size, 5381); - return result; -} - -internal U64 -ctrl_hash_from_handle(D_Handle handle) +d_hash_from_handle(D_Handle handle) { U64 buf[] = {handle.machine_id, handle.dmn_handle.u64[0]}; - U64 hash = ctrl_hash_from_string(str8((U8 *)buf, sizeof(buf))); + U64 hash = u64_hash_from_str8(str8((U8 *)buf, sizeof(buf))); return hash; } internal D_EventCause -ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) +d_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) { D_EventCause cause = D_EventCause_Null; switch(event_kind) @@ -41,7 +28,7 @@ ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind) } internal D_ExceptionKind -ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind) +d_exception_kind_from_dmn(DMN_ExceptionKind kind) { D_ExceptionKind result = D_ExceptionKind_Null; switch(kind) @@ -56,7 +43,7 @@ ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind) } internal D_TlsModel -ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type) +d_dynamic_linker_type_from_dmn(DMN_TlsModel type) { D_TlsModel result = D_TlsModel_Null; switch(type) @@ -70,7 +57,7 @@ ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type) } internal String8 -ctrl_string_from_event_kind(D_EventKind kind) +d_string_from_event_kind(D_EventKind kind) { String8 result = {0}; switch(kind) @@ -98,7 +85,7 @@ ctrl_string_from_event_kind(D_EventKind kind) } internal String8 -ctrl_string_from_msg_kind(D_MsgKind kind) +d_string_from_msg_kind(D_MsgKind kind) { String8 result = {0}; switch(kind) @@ -118,12 +105,12 @@ ctrl_string_from_msg_kind(D_MsgKind kind) } internal D_EntityKind -ctrl_entity_kind_from_string(String8 string) +d_entity_kind_from_string(String8 string) { D_EntityKind result = D_EntityKind_Null; for EachNonZeroEnumVal(D_EntityKind, k) { - if(str8_match(ctrl_entity_kind_code_name_table[k], string, 0)) + if(str8_match(d_entity_kind_code_name_table[k], string, 0)) { result = k; break; @@ -133,7 +120,7 @@ ctrl_entity_kind_from_string(String8 string) } internal DMN_TrapFlags -ctrl_dmn_trap_flags_from_user_breakpoint_flags(D_BreakpointFlags flags) +d_dmn_trap_flags_from_breakpoint_flags(D_BreakpointFlags flags) { DMN_TrapFlags result = 0; if(flags & D_BreakpointFlag_BreakOnWrite) { result |= DMN_TrapFlag_BreakOnWrite; } @@ -143,7 +130,7 @@ ctrl_dmn_trap_flags_from_user_breakpoint_flags(D_BreakpointFlags flags) } internal D_BreakpointFlags -ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags) +d_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags) { D_BreakpointFlags result = 0; if(flags & DMN_TrapFlag_BreakOnWrite) { result |= D_BreakpointFlag_BreakOnWrite; } @@ -156,21 +143,21 @@ ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags) //~ rjf: Machine/Handle Pair Type Functions internal D_Handle -ctrl_handle_zero(void) +d_handle_zero(void) { D_Handle handle = {0}; return handle; } internal D_Handle -ctrl_handle_make(D_MachineID machine_id, DMN_Handle dmn_handle) +d_handle_make(D_MachineID machine_id, DMN_Handle dmn_handle) { D_Handle handle = {machine_id, dmn_handle}; return handle; } internal B32 -ctrl_handle_match(D_Handle a, D_Handle b) +d_handle_match(D_Handle a, D_Handle b) { B32 result = (a.machine_id == b.machine_id && dmn_handle_match(a.dmn_handle, b.dmn_handle)); @@ -178,7 +165,7 @@ ctrl_handle_match(D_Handle a, D_Handle b) } internal void -ctrl_handle_list_push(Arena *arena, D_HandleList *list, D_Handle *pair) +d_handle_list_push(Arena *arena, D_HandleList *list, D_Handle *pair) { D_HandleNode *n = push_array(arena, D_HandleNode, 1); MemoryCopyStruct(&n->v, pair); @@ -187,18 +174,18 @@ ctrl_handle_list_push(Arena *arena, D_HandleList *list, D_Handle *pair) } internal D_HandleList -ctrl_handle_list_copy(Arena *arena, D_HandleList *src) +d_handle_list_copy(Arena *arena, D_HandleList *src) { D_HandleList dst = {0}; for(D_HandleNode *n = src->first; n != 0; n = n->next) { - ctrl_handle_list_push(arena, &dst, &n->v); + d_handle_list_push(arena, &dst, &n->v); } return dst; } internal D_HandleArray -ctrl_handle_array_from_list(Arena *arena, D_HandleList *src) +d_handle_array_from_list(Arena *arena, D_HandleList *src) { D_HandleArray array = {0}; array.count = src->count; @@ -214,14 +201,14 @@ ctrl_handle_array_from_list(Arena *arena, D_HandleList *src) } internal String8 -ctrl_string_from_handle(Arena *arena, D_Handle handle) +d_string_from_handle(Arena *arena, D_Handle handle) { String8 result = push_str8f(arena, "$%I64x$%I64x", handle.machine_id, handle.dmn_handle.u64[0]); return result; } internal D_Handle -ctrl_handle_from_string(String8 string) +d_handle_from_string(String8 string) { D_Handle handle = {0}; { @@ -245,7 +232,7 @@ ctrl_handle_from_string(String8 string) //~ rjf: Trap Type Functions internal void -ctrl_trap_list_push(Arena *arena, D_TrapList *list, D_Trap *trap) +d_trap_list_push(Arena *arena, D_TrapList *list, D_Trap *trap) { D_TrapNode *node = push_array(arena, D_TrapNode, 1); MemoryCopyStruct(&node->v, trap); @@ -254,12 +241,12 @@ ctrl_trap_list_push(Arena *arena, D_TrapList *list, D_Trap *trap) } internal D_TrapList -ctrl_trap_list_copy(Arena *arena, D_TrapList *src) +d_trap_list_copy(Arena *arena, D_TrapList *src) { D_TrapList dst = {0}; for(D_TrapNode *src_n = src->first; src_n != 0; src_n = src_n->next) { - ctrl_trap_list_push(arena, &dst, &src_n->v); + d_trap_list_push(arena, &dst, &src_n->v); } return dst; } @@ -268,7 +255,7 @@ ctrl_trap_list_copy(Arena *arena, D_TrapList *src) //~ rjf: User Breakpoint Type Functions internal void -ctrl_user_breakpoint_list_push(Arena *arena, D_BreakpointList *list, D_Breakpoint *bp) +d_breakpoint_list_push(Arena *arena, D_BreakpointList *list, D_Breakpoint *bp) { D_BreakpointNode *n = push_array(arena, D_BreakpointNode, 1); MemoryCopyStruct(&n->v, bp); @@ -277,7 +264,7 @@ ctrl_user_breakpoint_list_push(Arena *arena, D_BreakpointList *list, D_Breakpoin } internal D_BreakpointList -ctrl_user_breakpoint_list_copy(Arena *arena, D_BreakpointList *src) +d_breakpoint_list_copy(Arena *arena, D_BreakpointList *src) { D_BreakpointList dst = {0}; for(D_BreakpointNode *src_n = src->first; src_n != 0; src_n = src_n->next) @@ -287,7 +274,7 @@ ctrl_user_breakpoint_list_copy(Arena *arena, D_BreakpointList *src) dst_bp.file_path = str8_copy(arena, src_n->v.file_path); dst_bp.vaddr_expr = str8_copy(arena, src_n->v.vaddr_expr); dst_bp.condition = str8_copy(arena, src_n->v.condition); - ctrl_user_breakpoint_list_push(arena, &dst, &dst_bp); + d_breakpoint_list_push(arena, &dst, &dst_bp); } return dst; } @@ -298,21 +285,21 @@ ctrl_user_breakpoint_list_copy(Arena *arena, D_BreakpointList *src) //- rjf: deep copying internal void -ctrl_msg_deep_copy(Arena *arena, D_Msg *dst, D_Msg *src) +d_msg_deep_copy(Arena *arena, D_Msg *dst, D_Msg *src) { MemoryCopyStruct(dst, src); dst->path = push_str8_copy(arena, src->path); dst->entry_points = str8_list_copy(arena, &src->entry_points); dst->cmd_line_string_list = str8_list_copy(arena, &src->cmd_line_string_list); dst->env_string_list = str8_list_copy(arena, &src->env_string_list); - dst->traps = ctrl_trap_list_copy(arena, &src->traps); - dst->user_bps = ctrl_user_breakpoint_list_copy(arena, &src->user_bps); + dst->traps = d_trap_list_copy(arena, &src->traps); + dst->user_bps = d_breakpoint_list_copy(arena, &src->user_bps); } //- rjf: list building internal D_Msg * -ctrl_msg_list_push(Arena *arena, D_MsgList *list) +d_msg_list_push(Arena *arena, D_MsgList *list) { D_MsgNode *n = push_array(arena, D_MsgNode, 1); SLLQueuePush(list->first, list->last, n); @@ -322,20 +309,20 @@ ctrl_msg_list_push(Arena *arena, D_MsgList *list) } internal D_MsgList -ctrl_msg_list_deep_copy(Arena *arena, D_MsgList *src) +d_msg_list_deep_copy(Arena *arena, D_MsgList *src) { D_MsgList dst = {0}; for(D_MsgNode *n = src->first; n != 0; n = n->next) { D_Msg *src_msg = &n->v; - D_Msg *dst_msg = ctrl_msg_list_push(arena, &dst); - ctrl_msg_deep_copy(arena, dst_msg, src_msg); + D_Msg *dst_msg = d_msg_list_push(arena, &dst); + d_msg_deep_copy(arena, dst_msg, src_msg); } return dst; } internal void -ctrl_msg_list_concat_in_place(D_MsgList *dst, D_MsgList *src) +d_msg_list_concat_in_place(D_MsgList *dst, D_MsgList *src) { if(dst->last && src->first) { @@ -353,7 +340,7 @@ ctrl_msg_list_concat_in_place(D_MsgList *dst, D_MsgList *src) //- rjf: serialization internal String8 -ctrl_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs) +d_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs) { Temp scratch = scratch_begin(&arena, 1); String8List msgs_srlzed = {0}; @@ -448,7 +435,7 @@ ctrl_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs) } internal D_MsgList -ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) +d_msg_list_from_serialized_string(Arena *arena, String8 string) { D_MsgList msgs = {0}; { @@ -578,7 +565,7 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string) //- rjf: list building internal D_Event * -ctrl_event_list_push(Arena *arena, D_EventList *list) +d_event_list_push(Arena *arena, D_EventList *list) { D_EventNode *n = push_array(arena, D_EventNode, 1); SLLQueuePush(list->first, list->last, n); @@ -588,7 +575,7 @@ ctrl_event_list_push(Arena *arena, D_EventList *list) } internal void -ctrl_event_list_concat_in_place(D_EventList *dst, D_EventList *to_push) +d_event_list_concat_in_place(D_EventList *dst, D_EventList *to_push) { if(dst->last == 0) { @@ -606,7 +593,7 @@ ctrl_event_list_concat_in_place(D_EventList *dst, D_EventList *to_push) //- rjf: serialization internal String8 -ctrl_serialized_string_from_event(Arena *arena, D_Event *event, U64 max) +d_serialized_string_from_event(Arena *arena, D_Event *event, U64 max) { Temp scratch = scratch_begin(&arena, 1); String8List srl = {0}; @@ -644,7 +631,7 @@ ctrl_serialized_string_from_event(Arena *arena, D_Event *event, U64 max) } internal D_Event -ctrl_event_from_serialized_string(Arena *arena, String8 string) +d_event_from_serialized_string(Arena *arena, String8 string) { D_Event event = zero_struct; { @@ -683,7 +670,7 @@ ctrl_event_from_serialized_string(Arena *arena, String8 string) //- rjf: entity list data structures internal void -ctrl_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity) +d_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity) { D_EntityNode *n = push_array(arena, D_EntityNode, 1); n->v = entity; @@ -692,13 +679,13 @@ ctrl_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity) } internal D_EntityList -ctrl_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList *list) +d_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList *list) { D_EntityList result = {0}; for(D_HandleNode *n = list->first; n != 0; n = n->next) { - D_Entity *entity = ctrl_entity_from_handle(ctx, n->v); - ctrl_entity_list_push(arena, &result, entity); + D_Entity *entity = d_entity_from_handle(ctx, n->v); + d_entity_list_push(arena, &result, entity); } return result; } @@ -706,7 +693,7 @@ ctrl_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList * //- rjf: entity array data structure internal D_EntityArray -ctrl_entity_array_from_list(Arena *arena, D_EntityList *list) +d_entity_array_from_list(Arena *arena, D_EntityList *list) { D_EntityArray result = {0}; result.count = list->count; @@ -722,18 +709,18 @@ ctrl_entity_array_from_list(Arena *arena, D_EntityList *list) //- rjf: entity context (entity group read-only) functions internal D_Entity * -ctrl_entity_from_handle(D_EntityCtx *ctx, D_Handle handle) +d_entity_from_handle(D_EntityCtx *ctx, D_Handle handle) { D_Entity *entity = &d_entity_nil; - if(!ctrl_handle_match(handle, ctrl_handle_zero())) + if(!d_handle_match(handle, d_handle_zero())) { - U64 hash = ctrl_hash_from_handle(handle); + U64 hash = d_hash_from_handle(handle); U64 slot_idx = hash%ctx->hash_slots_count; D_EntityHashSlot *slot = &ctx->hash_slots[slot_idx]; D_EntityHashNode *node = 0; for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->entity->handle, handle)) + if(d_handle_match(n->entity->handle, handle)) { entity = n->entity; break; @@ -744,7 +731,7 @@ ctrl_entity_from_handle(D_EntityCtx *ctx, D_Handle handle) } internal D_Entity * -ctrl_entity_child_from_kind(D_Entity *parent, D_EntityKind kind) +d_entity_child_from_kind(D_Entity *parent, D_EntityKind kind) { D_Entity *result = &d_entity_nil; for(D_Entity *child = parent->first; @@ -761,7 +748,7 @@ ctrl_entity_child_from_kind(D_Entity *parent, D_EntityKind kind) } internal D_Entity * -ctrl_entity_ancestor_from_kind(D_Entity *entity, D_EntityKind kind) +d_entity_ancestor_from_kind(D_Entity *entity, D_EntityKind kind) { D_Entity *result = &d_entity_nil; for(D_Entity *p = entity->parent; p != &d_entity_nil; p = p->parent) @@ -776,7 +763,7 @@ ctrl_entity_ancestor_from_kind(D_Entity *entity, D_EntityKind kind) } internal D_Entity * -ctrl_process_from_entity(D_Entity *entity) +d_process_from_entity(D_Entity *entity) { D_Entity *result = &d_entity_nil; if(entity->kind == D_EntityKind_Process) @@ -785,13 +772,13 @@ ctrl_process_from_entity(D_Entity *entity) } else { - result = ctrl_entity_ancestor_from_kind(entity, D_EntityKind_Process); + result = d_entity_ancestor_from_kind(entity, D_EntityKind_Process); } return result; } internal D_Entity * -ctrl_module_from_process_vaddr(D_Entity *process, U64 vaddr) +d_module_from_process_vaddr(D_Entity *process, U64 vaddr) { D_Entity *result = &d_entity_nil; for(D_Entity *child = process->first; @@ -808,24 +795,24 @@ ctrl_module_from_process_vaddr(D_Entity *process, U64 vaddr) } internal DI_Key -ctrl_dbgi_key_from_module(D_Entity *module) +d_dbgi_key_from_module(D_Entity *module) { - D_Entity *debug_info_path = ctrl_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); + D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); DI_Key dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); return dbgi_key; } internal D_Entity * -ctrl_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityList *candidates) +d_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityList *candidates) { - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); - U64 thread_rip_vaddr = ctrl_rip_from_thread(ctx, thread->handle); - D_Entity *src_module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + U64 thread_rip_vaddr = d_rip_from_thread(ctx, thread->handle); + D_Entity *src_module = d_module_from_process_vaddr(process, thread_rip_vaddr); D_Entity *module = &d_entity_nil; for(D_EntityNode *n = candidates->first; n != 0; n = n->next) { D_Entity *candidate_module = n->v; - D_Entity *candidate_process = ctrl_entity_ancestor_from_kind(candidate_module, D_EntityKind_Process); + D_Entity *candidate_process = d_entity_ancestor_from_kind(candidate_module, D_EntityKind_Process); if(candidate_process == process) { module = candidate_module; @@ -839,42 +826,42 @@ ctrl_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityL } internal U64 -ctrl_vaddr_from_voff(D_Entity *module, U64 voff) +d_vaddr_from_voff(D_Entity *module, U64 voff) { U64 result = voff + module->vaddr_range.min; return result; } internal U64 -ctrl_voff_from_vaddr(D_Entity *module, U64 vaddr) +d_voff_from_vaddr(D_Entity *module, U64 vaddr) { U64 result = vaddr - module->vaddr_range.min; return result; } internal Rng1U64 -ctrl_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_range) +d_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_range) { U64 dim = dim_1u64(voff_range); - U64 min = ctrl_vaddr_from_voff(module, voff_range.min); + U64 min = d_vaddr_from_voff(module, voff_range.min); Rng1U64 result = {min, min+dim}; return result; } internal Rng1U64 -ctrl_voff_range_from_vaddr_range(D_Entity *module, Rng1U64 vaddr_range) +d_voff_range_from_vaddr_range(D_Entity *module, Rng1U64 vaddr_range) { U64 dim = dim_1u64(vaddr_range); - U64 min = ctrl_voff_from_vaddr(module, vaddr_range.min); + U64 min = d_voff_from_vaddr(module, vaddr_range.min); Rng1U64 result = {min, min+dim}; return result; } internal B32 -ctrl_entity_tree_is_frozen(D_Entity *root) +d_entity_tree_is_frozen(D_Entity *root) { B32 is_frozen = 1; - for(D_Entity *e = root; e != &d_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) + for(D_Entity *e = root; e != &d_entity_nil; e = d_entity_rec_depth_first_pre(e, root).next) { if(e->kind == D_EntityKind_Thread && !e->is_frozen) { @@ -888,24 +875,24 @@ ctrl_entity_tree_is_frozen(D_Entity *root) //- rjf: entity ctx r/w store state functions internal D_EntityCtxRWStore * -ctrl_entity_ctx_rw_store_alloc(void) +d_entity_ctx_rw_store_alloc(void) { Arena *arena = arena_alloc(); D_EntityCtxRWStore *store = push_array(arena, D_EntityCtxRWStore, 1); store->arena = arena; store->ctx.hash_slots_count = 1024; store->ctx.hash_slots = push_array(arena, D_EntityHashSlot, store->ctx.hash_slots_count); - D_Entity *root = store->ctx.root = ctrl_entity_alloc(store, &d_entity_nil, D_EntityKind_Root, Arch_Null, ctrl_handle_zero(), 0); - D_Entity *local_machine = ctrl_entity_alloc(store, root, D_EntityKind_Machine, Arch_CURRENT, ctrl_handle_make(D_MachineID_Local, dmn_handle_zero()), 0); + D_Entity *root = store->ctx.root = d_entity_alloc(store, &d_entity_nil, D_EntityKind_Root, Arch_Null, d_handle_zero(), 0); + D_Entity *local_machine = d_entity_alloc(store, root, D_EntityKind_Machine, Arch_CURRENT, d_handle_make(D_MachineID_Local, dmn_handle_zero()), 0); Temp scratch = scratch_begin(0, 0); String8 local_machine_name = push_str8f(scratch.arena, "This PC (%S)", os_get_system_info()->machine_name); - ctrl_entity_equip_string(store, local_machine, local_machine_name); + d_entity_equip_string(store, local_machine, local_machine_name); scratch_end(scratch); return store; } internal void -ctrl_entity_ctx_rw_store_release(D_EntityCtxRWStore *store) +d_entity_ctx_rw_store_release(D_EntityCtxRWStore *store) { arena_release(store->arena); } @@ -913,14 +900,14 @@ ctrl_entity_ctx_rw_store_release(D_EntityCtxRWStore *store) //- rjf: string allocation/deletion internal U64 -ctrl_name_bucket_num_from_string_size(U64 size) +d_name_bucket_num_from_string_size(U64 size) { U64 bucket_num = 0; if(size > 0) { - for EachElement(idx, ctrl_entity_string_bucket_chunk_sizes) + for EachElement(idx, d_entity_string_bucket_chunk_sizes) { - if(size <= ctrl_entity_string_bucket_chunk_sizes[idx]) + if(size <= d_entity_string_bucket_chunk_sizes[idx]) { bucket_num = idx+1; break; @@ -931,19 +918,19 @@ ctrl_name_bucket_num_from_string_size(U64 size) } internal String8 -ctrl_entity_string_alloc(D_EntityCtxRWStore *store, String8 string) +d_entity_string_alloc(D_EntityCtxRWStore *store, String8 string) { //- rjf: allocate node - CTRL_EntityStringChunkNode *node = 0; + D_EntityStringChunkNode *node = 0; { - U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size); - if(bucket_num == ArrayCount(ctrl_entity_string_bucket_chunk_sizes)) + U64 bucket_num = d_name_bucket_num_from_string_size(string.size); + if(bucket_num == ArrayCount(d_entity_string_bucket_chunk_sizes)) { - CTRL_EntityStringChunkNode *best_node = 0; - CTRL_EntityStringChunkNode *best_node_prev = 0; + D_EntityStringChunkNode *best_node = 0; + D_EntityStringChunkNode *best_node_prev = 0; U64 best_node_size = max_U64; { - for(CTRL_EntityStringChunkNode *n = store->free_string_chunks[bucket_num-1], *prev = 0; n != 0; (prev = n, n = n->next)) + for(D_EntityStringChunkNode *n = store->free_string_chunks[bucket_num-1], *prev = 0; n != 0; (prev = n, n = n->next)) { if(n->size >= string.size && n->size < best_node_size) { @@ -968,7 +955,7 @@ ctrl_entity_string_alloc(D_EntityCtxRWStore *store, String8 string) else { U64 chunk_size = u64_up_to_pow2(string.size); - node = (CTRL_EntityStringChunkNode *)push_array(store->arena, U8, chunk_size); + node = (D_EntityStringChunkNode *)push_array(store->arena, U8, chunk_size); } } else if(bucket_num != 0) @@ -980,7 +967,7 @@ ctrl_entity_string_alloc(D_EntityCtxRWStore *store, String8 string) } else { - node = (CTRL_EntityStringChunkNode *)push_array(store->arena, U8, ctrl_entity_string_bucket_chunk_sizes[bucket_num-1]); + node = (D_EntityStringChunkNode *)push_array(store->arena, U8, d_entity_string_bucket_chunk_sizes[bucket_num-1]); } } } @@ -997,13 +984,13 @@ ctrl_entity_string_alloc(D_EntityCtxRWStore *store, String8 string) } internal void -ctrl_entity_string_release(D_EntityCtxRWStore *store, String8 string) +d_entity_string_release(D_EntityCtxRWStore *store, String8 string) { - U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size); - if(1 <= bucket_num && bucket_num <= ArrayCount(ctrl_entity_string_bucket_chunk_sizes)) + U64 bucket_num = d_name_bucket_num_from_string_size(string.size); + if(1 <= bucket_num && bucket_num <= ArrayCount(d_entity_string_bucket_chunk_sizes)) { U64 bucket_idx = bucket_num-1; - CTRL_EntityStringChunkNode *node = (CTRL_EntityStringChunkNode *)string.str; + D_EntityStringChunkNode *node = (D_EntityStringChunkNode *)string.str; SLLStackPush(store->free_string_chunks[bucket_idx], node); node->size = u64_up_to_pow2(string.size); } @@ -1012,7 +999,7 @@ ctrl_entity_string_release(D_EntityCtxRWStore *store, String8 string) //- rjf: entity construction/deletion internal D_Entity * -ctrl_entity_alloc(D_EntityCtxRWStore *store, D_Entity *parent, D_EntityKind kind, Arch arch, D_Handle handle, U64 id) +d_entity_alloc(D_EntityCtxRWStore *store, D_Entity *parent, D_EntityKind kind, Arch arch, D_Handle handle, U64 id) { D_Entity *entity = &d_entity_nil; { @@ -1046,13 +1033,13 @@ ctrl_entity_alloc(D_EntityCtxRWStore *store, D_Entity *parent, D_EntityKind kind // rjf: insert into hash map { - U64 hash = ctrl_hash_from_handle(handle); + U64 hash = d_hash_from_handle(handle); U64 slot_idx = hash%store->ctx.hash_slots_count; D_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; D_EntityHashNode *node = 0; for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->entity->handle, handle)) + if(d_handle_match(n->entity->handle, handle)) { node = n; break; @@ -1083,7 +1070,7 @@ ctrl_entity_alloc(D_EntityCtxRWStore *store, D_Entity *parent, D_EntityKind kind } internal void -ctrl_entity_release(D_EntityCtxRWStore *store, D_Entity *entity) +d_entity_release(D_EntityCtxRWStore *store, D_Entity *entity) { // rjf: unhook root if(entity->parent != &d_entity_nil) @@ -1118,13 +1105,13 @@ ctrl_entity_release(D_EntityCtxRWStore *store, D_Entity *entity) // rjf: remove from hash map { - U64 hash = ctrl_hash_from_handle(t->e->handle); + U64 hash = d_hash_from_handle(t->e->handle); U64 slot_idx = hash%store->ctx.hash_slots_count; D_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx]; D_EntityHashNode *node = 0; for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->entity->handle, t->e->handle)) + if(d_handle_match(n->entity->handle, t->e->handle)) { DLLRemove(slot->first, slot->last, n); SLLStackPush(store->hash_node_free, n); @@ -1144,19 +1131,19 @@ ctrl_entity_release(D_EntityCtxRWStore *store, D_Entity *entity) //- rjf: entity equipment internal void -ctrl_entity_equip_string(D_EntityCtxRWStore *store, D_Entity *entity, String8 string) +d_entity_equip_string(D_EntityCtxRWStore *store, D_Entity *entity, String8 string) { if(entity->string.size != 0) { - ctrl_entity_string_release(store, entity->string); + d_entity_string_release(store, entity->string); } - entity->string = ctrl_entity_string_alloc(store, string); + entity->string = d_entity_string_alloc(store, string); } //- rjf: accelerated entity context lookups internal D_EntityCtxLookupAccel * -ctrl_thread_entity_ctx_lookup_accel(void) +d_thread_entity_ctx_lookup_accel(void) { if(d_entity_ctx_lookup_accel == 0) { @@ -1172,52 +1159,52 @@ ctrl_thread_entity_ctx_lookup_accel(void) } internal D_EntityArray -ctrl_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind) +d_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind) { - D_EntityCtxLookupAccel *accel = ctrl_thread_entity_ctx_lookup_accel(); + D_EntityCtxLookupAccel *accel = d_thread_entity_ctx_lookup_accel(); if(accel->entity_kind_arrays_gens[kind] != ctx->entity_kind_alloc_gens[kind]) { Temp scratch = scratch_begin(0, 0); D_EntityList entities = {0}; for(D_Entity *e = ctx->root; e != &d_entity_nil; - e = ctrl_entity_rec_depth_first_pre(e, ctx->root).next) + e = d_entity_rec_depth_first_pre(e, ctx->root).next) { if(e->kind == kind) { - ctrl_entity_list_push(scratch.arena, &entities, e); + d_entity_list_push(scratch.arena, &entities, e); } } accel->entity_kind_arrays_gens[kind] = ctx->entity_kind_alloc_gens[kind]; arena_clear(accel->entity_kind_arrays_arenas[kind]); - accel->entity_kind_arrays[kind] = ctrl_entity_array_from_list(accel->entity_kind_arrays_arenas[kind], &entities); + accel->entity_kind_arrays[kind] = d_entity_array_from_list(accel->entity_kind_arrays_arenas[kind], &entities); scratch_end(scratch); } return accel->entity_kind_arrays[kind]; } internal D_EntityList -ctrl_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key) +d_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key) { D_EntityList list = {0}; - D_EntityArray all_modules = ctrl_entity_array_from_kind(ctx, D_EntityKind_Module); + D_EntityArray all_modules = d_entity_array_from_kind(ctx, D_EntityKind_Module); for EachIndex(idx, all_modules.count) { D_Entity *module = all_modules.v[idx]; - DI_Key module_dbgi_key = ctrl_dbgi_key_from_module(module); + DI_Key module_dbgi_key = d_dbgi_key_from_module(module); if(di_key_match(module_dbgi_key, dbgi_key)) { - ctrl_entity_list_push(arena, &list, module); + d_entity_list_push(arena, &list, module); } } return list; } internal D_Entity * -ctrl_thread_from_id(D_EntityCtx *ctx, U64 id) +d_thread_from_id(D_EntityCtx *ctx, U64 id) { D_Entity *thread = &d_entity_nil; - D_EntityArray threads = ctrl_entity_array_from_kind(ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(ctx, D_EntityKind_Thread); for EachIndex(idx, threads.count) { if(threads.v[idx]->id == id) @@ -1231,7 +1218,7 @@ ctrl_thread_from_id(D_EntityCtx *ctx, U64 id) //- rjf: entity tree iteration internal D_EntityRec -ctrl_entity_rec_depth_first(D_Entity *entity, D_Entity *subtree_root, U64 sib_off, U64 child_off) +d_entity_rec_depth_first(D_Entity *entity, D_Entity *subtree_root, U64 sib_off, U64 child_off) { D_EntityRec result = {0}; result.next = &d_entity_nil; @@ -1255,7 +1242,7 @@ ctrl_entity_rec_depth_first(D_Entity *entity, D_Entity *subtree_root, U64 sib_of //- rjf: applying events to entity caches internal void -ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) +d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) { //- rjf: scan events & construct entities for(D_EventNode *n = list->first; n != 0; n = n->next) @@ -1268,18 +1255,18 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: processes case D_EventKind_NewProc: { - D_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero())); + D_Entity *machine = d_entity_from_handle(&store->ctx, d_handle_make(event->entity.machine_id, dmn_handle_zero())); if(machine != &d_entity_nil) { - D_Entity *process = ctrl_entity_alloc(store, machine, D_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); + D_Entity *process = d_entity_alloc(store, machine, D_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); process->tls_model = event->tls_model; process->target_os = event->target_os; } }break; case D_EventKind_EndProc: { - D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->entity); - ctrl_entity_release(store, process); + D_Entity *process = d_entity_from_handle(&store->ctx, event->entity); + d_entity_release(store, process); for(D_Entity *entry = store->ctx.root->first, *next = &d_entity_nil; entry != &d_entity_nil; entry = next) @@ -1287,7 +1274,7 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) next = entry->next; if(entry->kind == D_EntityKind_EntryPoint && entry->id == process->id) { - ctrl_entity_release(store, entry); + d_entity_release(store, entry); } } }break; @@ -1295,79 +1282,79 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: threads case D_EventKind_NewThread: { - D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); if(process != &d_entity_nil) { - D_Entity *thread = ctrl_entity_alloc(store, process, D_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); - D_Entity *first_thread = ctrl_entity_child_from_kind(process, D_EntityKind_Thread); + D_Entity *thread = d_entity_alloc(store, process, D_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); + D_Entity *first_thread = d_entity_child_from_kind(process, D_EntityKind_Thread); if(first_thread == thread) { - ctrl_entity_equip_string(store, thread, str8_lit("main_thread")); + d_entity_equip_string(store, thread, str8_lit("main_thread")); } - D_EntityArray pending_thread_names = ctrl_entity_array_from_kind(&store->ctx, D_EntityKind_PendingThreadName); + D_EntityArray pending_thread_names = d_entity_array_from_kind(&store->ctx, D_EntityKind_PendingThreadName); for EachIndex(idx, pending_thread_names.count) { D_Entity *entity = pending_thread_names.v[idx]; if(entity->id == event->entity_id) { - ctrl_entity_equip_string(store, thread, entity->string); - ctrl_entity_release(store, entity); + d_entity_equip_string(store, thread, entity->string); + d_entity_release(store, entity); break; } } - D_EntityArray pending_thread_colors = ctrl_entity_array_from_kind(&store->ctx, D_EntityKind_PendingThreadColor); + D_EntityArray pending_thread_colors = d_entity_array_from_kind(&store->ctx, D_EntityKind_PendingThreadColor); for EachIndex(idx, pending_thread_colors.count) { D_Entity *entity = pending_thread_colors.v[idx]; if(entity->id == event->entity_id) { thread->rgba = entity->rgba; - ctrl_entity_release(store, entity); + d_entity_release(store, entity); break; } } thread->stack_base = event->stack_base; } - //ctrl_rip_from_thread(&store->ctx, event->entity); + //d_rip_from_thread(&store->ctx, event->entity); }break; case D_EventKind_EndThread: { - D_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); - ctrl_entity_release(store, thread); + D_Entity *thread = d_entity_from_handle(&store->ctx, event->entity); + d_entity_release(store, thread); }break; case D_EventKind_ThreadName: { - D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); D_Entity *thread = &d_entity_nil; if(event->entity_id == 0) { - thread = ctrl_entity_from_handle(&store->ctx, event->entity); + thread = d_entity_from_handle(&store->ctx, event->entity); } else { - thread = ctrl_thread_from_id(&store->ctx, event->entity_id); + thread = d_thread_from_id(&store->ctx, event->entity_id); } if(thread != &d_entity_nil) { - ctrl_entity_equip_string(store, thread, event->string); + d_entity_equip_string(store, thread, event->string); } else if(process != &d_entity_nil) { - D_Entity *pending_name = ctrl_entity_alloc(store, process, D_EntityKind_PendingThreadName, Arch_Null, ctrl_handle_zero(), event->entity_id); - ctrl_entity_equip_string(store, pending_name, event->string); + D_Entity *pending_name = d_entity_alloc(store, process, D_EntityKind_PendingThreadName, Arch_Null, d_handle_zero(), event->entity_id); + d_entity_equip_string(store, pending_name, event->string); } }break; case D_EventKind_ThreadColor: { - D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); D_Entity *thread = &d_entity_nil; if(event->entity_id == 0) { - thread = ctrl_entity_from_handle(&store->ctx, event->entity); + thread = d_entity_from_handle(&store->ctx, event->entity); } else { - thread = ctrl_thread_from_id(&store->ctx, event->entity_id); + thread = d_thread_from_id(&store->ctx, event->entity_id); } if(thread != &d_entity_nil) { @@ -1375,13 +1362,13 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) } else if(process != &d_entity_nil) { - D_Entity *pending = ctrl_entity_alloc(store, process, D_EntityKind_PendingThreadColor, Arch_Null, ctrl_handle_zero(), event->entity_id); + D_Entity *pending = d_entity_alloc(store, process, D_EntityKind_PendingThreadColor, Arch_Null, d_handle_zero(), event->entity_id); pending->rgba = event->rgba; } }break; case D_EventKind_ThreadFrozen: { - D_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); + D_Entity *thread = d_entity_from_handle(&store->ctx, event->entity); if(thread != &d_entity_nil) { thread->is_frozen = 1; @@ -1389,7 +1376,7 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) }break; case D_EventKind_ThreadThawed: { - D_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity); + D_Entity *thread = d_entity_from_handle(&store->ctx, event->entity); if(thread != &d_entity_nil) { thread->is_frozen = 0; @@ -1400,35 +1387,35 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) case D_EventKind_NewModule: { Temp scratch = scratch_begin(0, 0); - D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - D_Entity *module = ctrl_entity_alloc(store, process, D_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min); - ctrl_entity_equip_string(store, module, event->string); + D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *module = d_entity_alloc(store, process, D_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min); + d_entity_equip_string(store, module, event->string); module->timestamp = event->timestamp; module->vaddr_range = event->vaddr_rng; module->tls_index = event->tls_index; module->tls_offset = event->tls_offset; - D_Entity *first_module = ctrl_entity_child_from_kind(process, D_EntityKind_Module); + D_Entity *first_module = d_entity_child_from_kind(process, D_EntityKind_Module); if(first_module == module) { - ctrl_entity_equip_string(store, process, str8_skip_last_slash(event->string)); + d_entity_equip_string(store, process, str8_skip_last_slash(event->string)); } scratch_end(scratch); }break; case D_EventKind_EndModule: { - D_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); - ctrl_entity_release(store, module); + D_Entity *module = d_entity_from_handle(&store->ctx, event->entity); + d_entity_release(store, module); }break; case D_EventKind_ModuleDebugInfoPathChange: { Temp scratch = scratch_begin(0, 0); - D_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity); - D_Entity *debug_info_path = ctrl_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); + D_Entity *module = d_entity_from_handle(&store->ctx, event->entity); + D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); if(debug_info_path == &d_entity_nil) { - debug_info_path = ctrl_entity_alloc(store, module, D_EntityKind_DebugInfoPath, Arch_Null, ctrl_handle_zero(), 0); + debug_info_path = d_entity_alloc(store, module, D_EntityKind_DebugInfoPath, Arch_Null, d_handle_zero(), 0); } - ctrl_entity_equip_string(store, debug_info_path, path_normalized_from_string(scratch.arena, event->string)); + d_entity_equip_string(store, debug_info_path, path_normalized_from_string(scratch.arena, event->string)); debug_info_path->timestamp = event->timestamp; scratch_end(scratch); }break; @@ -1436,14 +1423,14 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: dynamic, program-created breakpoints case D_EventKind_SetBreakpoint: { - D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - D_Entity *bp = ctrl_entity_alloc(store, process, D_EntityKind_Breakpoint, Arch_Null, ctrl_handle_zero(), 0); + D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *bp = d_entity_alloc(store, process, D_EntityKind_Breakpoint, Arch_Null, d_handle_zero(), 0); bp->vaddr_range = event->vaddr_rng; bp->bp_flags = event->bp_flags; }break; case D_EventKind_UnsetBreakpoint: { - D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { if(child->kind == D_EntityKind_Breakpoint && @@ -1451,7 +1438,7 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) child->vaddr_range.max == event->vaddr_rng.max && child->bp_flags == event->bp_flags) { - ctrl_entity_release(store, child); + d_entity_release(store, child); break; } } @@ -1460,10 +1447,10 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: address range annotations case D_EventKind_SetVAddrRangeNote: { - D_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent); - D_Entity *annotation = ctrl_entity_alloc(store, process, D_EntityKind_AddressRangeAnnotation, Arch_Null, ctrl_handle_zero(), 0); + D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *annotation = d_entity_alloc(store, process, D_EntityKind_AddressRangeAnnotation, Arch_Null, d_handle_zero(), 0); annotation->vaddr_range = event->vaddr_rng; - ctrl_entity_equip_string(store, annotation, event->string); + d_entity_equip_string(store, annotation, event->string); }break; } } @@ -1473,7 +1460,7 @@ ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //~ rjf: Wakeup Callback Registration internal void -ctrl_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook) +d_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook) { d_ctrl_state->wakeup_hook = wakeup_hook; } @@ -1484,13 +1471,13 @@ ctrl_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook) //- rjf: thread register cache reading internal void * -ctrl_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) +d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) { D_ThreadRegCache *cache = &d_ctrl_state->thread_reg_cache; - D_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + D_Entity *thread_entity = d_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; U64 reg_block_size = regs_block_size_from_arch(arch); - U64 hash = ctrl_hash_from_handle(handle); + U64 hash = d_hash_from_handle(handle); U64 slot_idx = hash%cache->slots_count; U64 stripe_idx = slot_idx%cache->stripes_count; D_ThreadRegCacheSlot *slot = &cache->slots[slot_idx]; @@ -1502,7 +1489,7 @@ ctrl_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) D_ThreadRegCacheNode *node = 0; for(D_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->handle, handle)) + if(d_handle_match(n->handle, handle)) { node = n; break; @@ -1522,7 +1509,7 @@ ctrl_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) // rjf: copy from node if(node) { - U64 current_reg_gen = ctrl_reg_gen(); + U64 current_reg_gen = d_reg_gen(); B32 need_stale = 1; if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(handle.dmn_handle, result)) @@ -1544,31 +1531,31 @@ ctrl_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) } internal U64 -ctrl_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle) +d_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle) { U64 result = dmn_tls_root_vaddr_from_thread(handle.dmn_handle); return result; } internal U64 -ctrl_rip_from_thread(D_EntityCtx *ctx, D_Handle handle) +d_rip_from_thread(D_EntityCtx *ctx, D_Handle handle) { Temp scratch = scratch_begin(0, 0); - D_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + D_Entity *thread_entity = d_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; - void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle); + void *block = d_reg_block_from_thread(scratch.arena, ctx, handle); U64 result = regs_rip_from_arch_block(arch, block); scratch_end(scratch); return result; } internal U64 -ctrl_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle) +d_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle) { Temp scratch = scratch_begin(0, 0); - D_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle); + D_Entity *thread_entity = d_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; - void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle); + void *block = d_reg_block_from_thread(scratch.arena, ctx, handle); U64 result = regs_rsp_from_arch_block(arch, block); scratch_end(scratch); return result; @@ -1577,7 +1564,7 @@ ctrl_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle) //- rjf: thread register writing internal B32 -ctrl_thread_write_reg_block(D_Handle thread, void *block) +d_thread_write_reg_block(D_Handle thread, void *block) { // TODO(rjf): @callstacks immediately reflect this in the call stack cache B32 good = dmn_thread_write_reg_block(thread.dmn_handle, block); @@ -1594,18 +1581,18 @@ ctrl_thread_write_reg_block(D_Handle thread, void *block) //- rjf: cache lookups internal PE_IntelPdata * -ctrl_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff) +d_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff) { PE_IntelPdata *first_pdata = 0; { - U64 hash = ctrl_hash_from_handle(module_handle); + U64 hash = d_hash_from_handle(module_handle); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->module, module_handle)) + if(d_handle_match(n->module, module_handle)) { PE_IntelPdata *pdatas = n->pdatas; U64 pdatas_count = n->pdatas_count; @@ -1661,17 +1648,17 @@ ctrl_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff } internal U64 -ctrl_entry_point_voff_from_module(D_Handle module_handle) +d_entry_point_voff_from_module(D_Handle module_handle) { U64 result = 0; - U64 hash = ctrl_hash_from_handle(module_handle); + U64 hash = d_hash_from_handle(module_handle); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->module, module_handle)) + if(d_handle_match(n->module, module_handle)) { result = n->entry_point_voff; break; @@ -1681,17 +1668,17 @@ ctrl_entry_point_voff_from_module(D_Handle module_handle) } internal String8 -ctrl_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle) +d_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle) { String8 result = {0}; - U64 hash = ctrl_hash_from_handle(module_handle); + U64 hash = d_hash_from_handle(module_handle); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->module, module_handle)) + if(d_handle_match(n->module, module_handle)) { result = push_str8_copy(arena, n->initial_debug_info_path); break; @@ -1701,17 +1688,17 @@ ctrl_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle) } internal String8 -ctrl_raddbg_data_from_module(Arena *arena, D_Handle module_handle) +d_raddbg_data_from_module(Arena *arena, D_Handle module_handle) { String8 result = {0}; - U64 hash = ctrl_hash_from_handle(module_handle); + U64 hash = d_hash_from_handle(module_handle); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->module, module_handle)) + if(d_handle_match(n->module, module_handle)) { result = push_str8_copy(arena, n->raddbg_data); break; @@ -1721,56 +1708,22 @@ ctrl_raddbg_data_from_module(Arena *arena, D_Handle module_handle) } //////////////////////////////// -//~ Process Info Functions +//~ rjf: Unwinding Functions} -internal Arch -ctrl_arch_from_process_handle(D_Handle process_handle) -{ - D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - D_Entity *process_entity = ctrl_entity_from_handle(entity_ctx, process_handle); - return process_entity->arch; -} +//- rjf: [dwarf] -//////////////////////////////// -//~ rjf: Unwinding Functions - -//- rjf: unwind deep copier - -internal D_Unwind -ctrl_unwind_deep_copy(Arena *arena, Arch arch, D_Unwind *src) -{ - D_Unwind dst = {0}; - { - dst.flags = src->flags; - dst.frames.count = src->frames.count; - dst.frames.v = push_array(arena, D_UnwindFrame, dst.frames.count); - MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count); - U64 block_size = regs_block_size_from_arch(arch); - for(U64 idx = 0; idx < dst.frames.count; idx += 1) - { - dst.frames.v[idx].regs = push_array_no_zero(arena, U8, block_size); - MemoryCopy(dst.frames.v[idx].regs, src->frames.v[idx].regs, block_size); - } - } - return dst; -} - -//- DWARF - -typedef struct +typedef struct D_MemoryReadContextDwarfX64 D_MemoryReadContextDwarfX64; +struct D_MemoryReadContextDwarfX64 { D_Handle process_handle; U64 endt_us; -} CTRL_MemoryReadContextDwarfX64; +}; -internal -MACHINE_OP_MEM_READ(ctrl_machine_mem_read) +internal MACHINE_OP_MEM_READ(ctrl_machine_mem_read) { - CTRL_MemoryReadContextDwarfX64 *ctx = ud; - + D_MemoryReadContextDwarfX64 *ctx = ud; B32 is_stale = 0; - B32 is_read = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + buffer_size), &is_stale, buffer, ctx->endt_us); - + B32 is_read = d_process_memory_read(ctx->process_handle, r1u64(addr, addr + buffer_size), &is_stale, buffer, ctx->endt_us); MachineOpResult status = MachineOpResult_Fail; if(is_stale) { @@ -1780,17 +1733,17 @@ MACHINE_OP_MEM_READ(ctrl_machine_mem_read) { status = MachineOpResult_Ok; } - return status; } internal D_UnwindStepResult -ctrl_unwind_step_result_from_machine_op_result(MachineOpResult s) +d_unwind_step_result_from_machine_op_result(MachineOpResult s) { D_UnwindStepResult result = {0}; switch(s) { - case MachineOpResult_Null: {} break; + default:{result.flags |= D_UnwindFlag_Error;}break; + case MachineOpResult_Null:{}break; case MachineOpResult_Ok: { result.flags &= ~(D_UnwindFlag_Error|D_UnwindFlag_Stale); @@ -1804,13 +1757,12 @@ ctrl_unwind_step_result_from_machine_op_result(MachineOpResult s) result.flags &= ~D_UnwindFlag_Error; result.flags |= D_UnwindFlag_Stale; }break; - default: { InvalidPath; } break; } return result; } internal D_UnwindStepResult -ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out) +d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out) { Temp scratch = scratch_begin(&arena, 1); D_UnwindStepResult result = { .flags = D_UnwindFlag_Error }; @@ -1822,14 +1774,14 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle EH_FrameHdr eh_frame_hdr = {0}; EH_PtrCtx eh_ptr_ctx = {0}; { - U64 hash = ctrl_hash_from_handle(module_handle); + U64 hash = d_hash_from_handle(module_handle); U64 slot_idx = hash % d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx % d_ctrl_state->module_image_info_cache.stripes_count; D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for EachNode(n, D_ModuleImageInfoCacheNode, slot->first) { - if(ctrl_handle_match(n->module, module_handle)) + if(d_handle_match(n->module, module_handle)) { cfi_rebase = n->cfi_rebase; is_unwind_eh = n->is_unwind_eh; @@ -1865,11 +1817,11 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle { // parse FDE length U32 first_four_bytes = 0; - if(!ctrl_process_memory_read_struct(process_handle, fde_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } + if(!d_process_memory_read_struct(process_handle, fde_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } if(first_four_bytes == max_U32) { U64 length = 0; - if(!ctrl_process_memory_read_struct(process_handle, fde_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } + if(!d_process_memory_read_struct(process_handle, fde_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + length); fde_format = DW_Format_64Bit; } @@ -1881,7 +1833,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle // read out whole FDE void *fde_raw = push_array(scratch.arena, U8, dim_1u64(fde_vrange)); - if(!ctrl_process_memory_read(process_handle, fde_vrange, &is_stale, fde_raw, endt_us)) { goto eh_parse_exit; } + if(!d_process_memory_read(process_handle, fde_vrange, &is_stale, fde_raw, endt_us)) { goto eh_parse_exit; } fde_data = str8(fde_raw, dim_1u64(fde_vrange)); // compute CIE address @@ -1899,11 +1851,11 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle { // parse CIE length U32 first_four_bytes = 0; - if(!ctrl_process_memory_read_struct(process_handle, cie_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } + if(!d_process_memory_read_struct(process_handle, cie_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } if(first_four_bytes == max_U32) { U64 length = 0; - if(!ctrl_process_memory_read_struct(process_handle, cie_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } + if(!d_process_memory_read_struct(process_handle, cie_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + length); cie_format = DW_Format_64Bit; } @@ -1915,7 +1867,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle // read out whole CIE void *cie_raw = push_array(scratch.arena, U8, dim_1u64(cie_vrange)); - if(!ctrl_process_memory_read(process_handle, cie_vrange, &is_stale, cie_raw, endt_us)) { goto eh_parse_exit; } + if(!d_process_memory_read(process_handle, cie_vrange, &is_stale, cie_raw, endt_us)) { goto eh_parse_exit; } cie_data = str8(cie_raw, dim_1u64(cie_vrange)); } @@ -1970,7 +1922,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle case Arch_Null: break; case Arch_x64: { - CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); + D_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, D_MemoryReadContextDwarfX64, 1); mem_read_ctx_x64->process_handle = process_handle; mem_read_ctx_x64->endt_us = endt_us; @@ -2002,7 +1954,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle } // translate unwind status code - result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); + result = d_unwind_step_result_from_machine_op_result(unwind_status); } } } @@ -2012,7 +1964,7 @@ ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle } internal D_UnwindStepResult -ctrl_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us) +d_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us) { Temp scratch = scratch_begin(0, 0); @@ -2027,28 +1979,20 @@ ctrl_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameU MachineOp_RegWrite *reg_write_func = 0; switch(arch) { - case Arch_Null: break; + default: + case Arch_Null:{}break; case Arch_x64: { - CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1); + D_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, D_MemoryReadContextDwarfX64, 1); mem_read_ctx_x64->process_handle = process_handle; mem_read_ctx_x64->endt_us = endt_us; - mem_read_ctx = mem_read_ctx_x64; reg_read_ctx = regs; reg_write_ctx = regs; - mem_read_func = ctrl_machine_mem_read; reg_read_func = regs_read_dwarf_x64; reg_write_func = regs_write_dwarf_x64; }break; - case Arch_x86: - case Arch_arm64: - case Arch_arm32: - { - NotImplemented; - }break; - default: { InvalidPath; }break; } // apply register rules to the context @@ -2069,7 +2013,7 @@ ctrl_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameU } // translate unwind status code - result = ctrl_unwind_step_result_from_machine_op_result(unwind_status); + result = d_unwind_step_result_from_machine_op_result(unwind_status); scratch_end(scratch); return result; @@ -2078,7 +2022,7 @@ ctrl_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameU //- rjf: [x64] internal REGS_Reg64 * -ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg) +d_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg) { local_persist REGS_Reg64 dummy = {0}; REGS_Reg64 *result = &dummy; @@ -2105,7 +2049,7 @@ ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX } internal D_UnwindStepResult -ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us) +d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us) { B32 is_stale = 0; B32 is_good = 1; @@ -2119,7 +2063,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo ////////////////////////////// //- rjf: rip_voff -> first pdata // - PE_IntelPdata *first_pdata = ctrl_intel_pdata_from_module_voff(scratch.arena, module_handle, rip_voff); + PE_IntelPdata *first_pdata = d_intel_pdata_from_module_voff(scratch.arena, module_handle, rip_voff); ////////////////////////////// //- rjf: pdata -> detect if in epilog @@ -2144,7 +2088,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U8 inst[4] = {0}; if(read_vaddr + sizeof(inst) <= read_vaddr_opl) { - inst_good = ctrl_process_memory_read(process_handle, r1u64(read_vaddr, read_vaddr+sizeof(inst)), &is_stale, inst, endt_us); + inst_good = d_process_memory_read(process_handle, r1u64(read_vaddr, read_vaddr+sizeof(inst)), &is_stale, inst, endt_us); inst_good = inst_good && !is_stale; } if(!inst_good) @@ -2225,7 +2169,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U8 inst_byte = 0; if(read_vaddr + sizeof(inst_byte) <= read_vaddr_opl) { - inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); + inst_byte_good = d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); } if(!inst_byte_good || is_stale) { @@ -2241,7 +2185,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo check_vaddr = read_vaddr + 1; if(read_vaddr + sizeof(check_inst_byte) <= read_vaddr_opl) { - check_inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &check_inst_byte, endt_us); + check_inst_byte_good = d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &check_inst_byte, endt_us); } if(!check_inst_byte_good || is_stale) { @@ -2277,7 +2221,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo B32 imm_good = 0; if(read_vaddr + sizeof(imm) <= read_vaddr_opl) { - imm_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us); + imm_good = d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us); } if(!imm_good || is_stale) { @@ -2306,7 +2250,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo B32 next_inst_byte_good = 0; if(read_vaddr + sizeof(next_inst_byte) <= read_vaddr_opl) { - next_inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &next_inst_byte, endt_us); + next_inst_byte_good = d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &next_inst_byte, endt_us); } if(next_inst_byte_good) { @@ -2335,7 +2279,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo //- rjf: read next instruction byte U8 inst_byte = 0; - is_good = is_good && ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); + is_good = is_good && d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); is_good = is_good && !is_stale; read_vaddr += 1; @@ -2344,7 +2288,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo if((inst_byte & 0xF0) == 0x40) { rex = inst_byte & 0xF; // rex prefix - is_good = is_good && ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); + is_good = is_good && d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); is_good = is_good && !is_stale; read_vaddr += 1; } @@ -2365,7 +2309,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read value at rsp U64 sp = regs->rsp.u64; U64 value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &value, endt_us) || + if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &value, endt_us) || is_stale) { is_good = 0; @@ -2374,7 +2318,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: modify registers PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); + REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); reg->u64 = value; regs->rsp.u64 = sp + 8; @@ -2390,7 +2334,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read the 4-byte immediate S32 imm = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || + if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || is_stale) { is_good = 0; @@ -2413,7 +2357,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read the 4-byte immediate S8 imm = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || + if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || is_stale) { is_good = 0; @@ -2433,7 +2377,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo { // rjf: read source register U8 modrm = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &modrm, endt_us) || + if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &modrm, endt_us) || is_stale) { is_good = 0; @@ -2441,7 +2385,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo } read_vaddr += 1; PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); + REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); U64 reg_value = reg->u64; // rjf: read immediate @@ -2451,7 +2395,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo if((modrm >> 6) == 1) { S8 imm8 = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm8, endt_us) || + if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm8, endt_us) || is_stale) { is_good = 0; @@ -2464,7 +2408,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read 4-byte immediate else { - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || + if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || is_stale) { is_good = 0; @@ -2487,7 +2431,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read new ip U64 sp = regs->rsp.u64; U64 new_ip = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || + if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || is_stale) { is_good = 0; @@ -2496,7 +2440,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read 2-byte immediate & advance stack pointer U16 imm = 0; - if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || + if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || is_stale) { is_good = 0; @@ -2519,7 +2463,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read new ip U64 sp = regs->rsp.u64; U64 new_ip = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || + if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || is_stale) { is_good = 0; @@ -2566,7 +2510,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo { U64 unwind_info_off = first_pdata->voff_unwind_info; PE_UnwindInfo unwind_info = {0}; - if(!ctrl_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us) || + if(!d_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us) || is_stale) { is_good = 0; @@ -2575,7 +2519,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info.frame); if(frame_reg_id != 0) { - frame_reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, frame_reg_id); + frame_reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, frame_reg_id); bad_frame_reg_info = (frame_reg == 0); // NOTE(rjf): frame_reg should never be 0 at this point, in valid exe } frame_off = frame_off_val; @@ -2590,11 +2534,11 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo B32 good_unwind_info = 1; U64 unwind_info_off = pdata->voff_unwind_info; PE_UnwindInfo unwind_info = {0}; - good_unwind_info = good_unwind_info && ctrl_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us); + good_unwind_info = good_unwind_info && d_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us); PE_UnwindCode *unwind_codes = push_array(scratch.arena, PE_UnwindCode, unwind_info.codes_num); - good_unwind_info = good_unwind_info && ctrl_process_memory_read(process_handle, r1u64(module_base_vaddr+unwind_info_off+sizeof(unwind_info), - module_base_vaddr+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num), - &is_stale, unwind_codes, endt_us); + good_unwind_info = good_unwind_info && d_process_memory_read(process_handle, r1u64(module_base_vaddr+unwind_info_off+sizeof(unwind_info), + module_base_vaddr+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num), + &is_stale, unwind_codes, endt_us); good_unwind_info = good_unwind_info && !is_stale; //- rjf: bad unwind info -> abort @@ -2649,7 +2593,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read value from stack pointer U64 rsp = regs->rsp.u64; U64 value = 0; - if(!ctrl_process_memory_read_struct(process_handle, rsp, &is_stale, &value, endt_us) || + if(!d_process_memory_read_struct(process_handle, rsp, &is_stale, &value, endt_us) || is_stale) { keep_parsing = 0; @@ -2661,7 +2605,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U64 new_rsp = rsp + 8; // rjf: commit registers - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); reg->u64 = value; regs->rsp.u64 = new_rsp; }break; @@ -2711,7 +2655,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U64 off = code_ptr[1].u16*8; U64 addr = frame_base + off; U64 value = 0; - if(!ctrl_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || + if(!d_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || is_stale) { keep_parsing = 0; @@ -2720,7 +2664,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo } // rjf: commit to register - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); reg->u64 = value; }break; @@ -2730,7 +2674,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); U64 addr = frame_base + off; U64 value = 0; - if(!ctrl_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || + if(!d_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || is_stale) { keep_parsing = 0; @@ -2739,7 +2683,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo } // rjf: commit to register - REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); reg->u64 = value; }break; @@ -2761,7 +2705,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U8 buf[16]; U64 off = code_ptr[1].u16*16; U64 addr = frame_base + off; - if(!ctrl_process_memory_read(process_handle, r1u64(addr, addr+sizeof(buf)), &is_stale, buf, endt_us)) + if(!d_process_memory_read(process_handle, r1u64(addr, addr+sizeof(buf)), &is_stale, buf, endt_us)) { keep_parsing = 0; is_good = 0; @@ -2779,7 +2723,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U8 buf[16]; U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); U64 addr = frame_base + off; - if(!ctrl_process_memory_read(process_handle, r1u64(addr, addr+16), &is_stale, buf, endt_us) || + if(!d_process_memory_read(process_handle, r1u64(addr, addr+16), &is_stale, buf, endt_us) || is_stale) { keep_parsing = 0; @@ -2811,7 +2755,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo sp_adj += 8; } U64 ip_value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp_adj, &is_stale, &ip_value, endt_us) || + if(!d_process_memory_read_struct(process_handle, sp_adj, &is_stale, &ip_value, endt_us) || is_stale) { keep_parsing = 0; @@ -2820,7 +2764,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo } U64 sp_after_ip = sp_adj + 8; U16 ss_value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp_after_ip, &is_stale, &ss_value, endt_us) || + if(!d_process_memory_read_struct(process_handle, sp_after_ip, &is_stale, &ss_value, endt_us) || is_stale) { keep_parsing = 0; @@ -2829,7 +2773,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo } U64 sp_after_ss = sp_after_ip + 8; U64 rflags_value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp_after_ss, &is_stale, &rflags_value, endt_us) || + if(!d_process_memory_read_struct(process_handle, sp_after_ss, &is_stale, &rflags_value, endt_us) || is_stale) { keep_parsing = 0; @@ -2838,7 +2782,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo } U64 sp_after_rflags = sp_after_ss + 8; U64 sp_value = 0; - if(!ctrl_process_memory_read_struct(process_handle, sp_after_rflags, &is_stale, &sp_value, endt_us) || + if(!d_process_memory_read_struct(process_handle, sp_after_rflags, &is_stale, &sp_value, endt_us) || is_stale) { keep_parsing = 0; @@ -2872,7 +2816,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size; last_pdata = pdata; pdata = push_array(scratch.arena, PE_IntelPdata, 1); - if(!ctrl_process_memory_read_struct(process_handle, module_base_vaddr+chained_pdata_off, &is_stale, pdata, endt_us) || + if(!d_process_memory_read_struct(process_handle, module_base_vaddr+chained_pdata_off, &is_stale, pdata, endt_us) || is_stale) { is_good = 0; @@ -2890,7 +2834,7 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo // rjf: read rip from stack pointer U64 rsp = regs->rsp.u64; U64 new_rip = 0; - if(!ctrl_process_memory_read_struct(process_handle, rsp, &is_stale, &new_rip, endt_us) || + if(!d_process_memory_read_struct(process_handle, rsp, &is_stale, &new_rip, endt_us) || is_stale) { is_good = 0; @@ -2918,20 +2862,20 @@ ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 mo //- rjf: abstracted full unwind internal D_Unwind -ctrl_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us) +d_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); D_Unwind unwind = { .flags = D_UnwindFlag_Error }; //- rjf: unpack args - D_Entity *thread_entity = ctrl_entity_from_handle(ctx, thread); + D_Entity *thread_entity = d_entity_from_handle(ctx, thread); D_Entity *process_entity = thread_entity->parent; Arch arch = thread_entity->arch; U64 arch_reg_block_size = regs_block_size_from_arch(arch); //- rjf: grab initial register block - void *regs_block = ctrl_reg_block_from_thread(scratch.arena, ctx, thread); + void *regs_block = d_reg_block_from_thread(scratch.arena, ctx, thread); B32 regs_block_good = (arch != Arch_Null && regs_block != 0); //- rjf: loop & unwind @@ -2952,7 +2896,7 @@ ctrl_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 end } // rip -> module - D_Entity *module_entity = ctrl_module_from_process_vaddr(process_entity, rip); + D_Entity *module_entity = d_module_from_process_vaddr(process_entity, rip); // establish frame context D_FrameUnwindContext frame_ctx = {0}; @@ -2966,7 +2910,7 @@ ctrl_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 end }break; case OperatingSystem_Linux: { - frame_ctx_result = ctrl_establish_frame_unwind_context__dwarf(arena, process_entity->handle, module_entity->handle, arch, regs_block, endt_us, &frame_ctx); + frame_ctx_result = d_establish_frame_unwind_context__dwarf(arena, process_entity->handle, module_entity->handle, arch, regs_block, endt_us, &frame_ctx); }break; case OperatingSystem_Mac: { @@ -3001,13 +2945,13 @@ ctrl_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 end default:{}break; case Arch_x64: { - step_result = ctrl_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us); + step_result = d_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us); }break; } }break; case OperatingSystem_Linux: { - step_result = ctrl_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us); + step_result = d_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us); }break; } @@ -3041,7 +2985,7 @@ ctrl_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 end //~ rjf: Call Stack Building Functions internal D_CallStack -ctrl_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwind) +d_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwind) { Temp scratch = scratch_begin(&arena, 1); Access *access = access_open(); @@ -3064,9 +3008,9 @@ ctrl_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwi // rjf: unpack D_UnwindFrame *src = &base_unwind->frames.v[base_frame_idx]; U64 rip_vaddr = regs_rip_from_arch_block(arch, src->regs); - D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); RDI_Scope *scope = rdi_scope_from_voff(rdi, rip_voff); @@ -3137,7 +3081,7 @@ ctrl_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwi } internal D_CallStackFrame * -ctrl_call_stack_frame_from_unwind_and_inline_depth(D_CallStack *call_stack, U64 unwind_count, U64 inline_depth) +d_call_stack_frame_from_unwind_and_inline_depth(D_CallStack *call_stack, U64 unwind_count, U64 inline_depth) { D_CallStackFrame *f = 0; { @@ -3166,7 +3110,7 @@ ctrl_call_stack_frame_from_unwind_and_inline_depth(D_CallStack *call_stack, U64 //~ rjf: Halting All Attached Processes internal void -ctrl_halt(void) +d_halt(void) { dmn_halt(0, 0); } @@ -3177,21 +3121,21 @@ ctrl_halt(void) //- rjf: generation counters internal U64 -ctrl_run_gen(void) +d_run_gen(void) { U64 result = ins_atomic_u64_eval(&d_ctrl_state->run_gen); return result; } internal U64 -ctrl_mem_gen(void) +d_mem_gen(void) { U64 result = ins_atomic_u64_eval(&d_ctrl_state->mem_gen); return result; } internal U64 -ctrl_reg_gen(void) +d_reg_gen(void) { U64 result = ins_atomic_u64_eval(&d_ctrl_state->reg_gen); return result; @@ -3200,13 +3144,13 @@ ctrl_reg_gen(void) //- rjf: name -> register/alias hash tables, for eval internal E_String2NumMap * -ctrl_string2reg_from_arch(Arch arch) +d_string2reg_from_arch(Arch arch) { return &d_ctrl_state->arch_string2reg_tables[arch]; } internal E_String2NumMap * -ctrl_string2alias_from_arch(Arch arch) +d_string2alias_from_arch(Arch arch) { return &d_ctrl_state->arch_string2alias_tables[arch]; } @@ -3217,10 +3161,10 @@ ctrl_string2alias_from_arch(Arch arch) //- rjf: user -> control thread communication internal B32 -ctrl_u2c_push_msgs(D_MsgList *msgs, U64 endt_us) +d_u2c_push_msgs(D_MsgList *msgs, U64 endt_us) { Temp scratch = scratch_begin(0, 0); - String8 msgs_srlzed_baked = ctrl_serialized_string_from_msg_list(scratch.arena, msgs); + String8 msgs_srlzed_baked = d_serialized_string_from_msg_list(scratch.arena, msgs); B32 good = 0; MutexScope(d_ctrl_state->u2c_ring_mutex) for(;;) { @@ -3249,7 +3193,7 @@ ctrl_u2c_push_msgs(D_MsgList *msgs, U64 endt_us) } internal D_MsgList -ctrl_u2c_pop_msgs(Arena *arena) +d_u2c_pop_msgs(Arena *arena) { Temp scratch = scratch_begin(&arena, 1); String8 msgs_srlzed_baked = {0}; @@ -3268,7 +3212,7 @@ ctrl_u2c_pop_msgs(Arena *arena) cond_var_wait(d_ctrl_state->u2c_ring_cv, d_ctrl_state->u2c_ring_mutex, max_U64); } cond_var_broadcast(d_ctrl_state->u2c_ring_cv); - D_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked); + D_MsgList msgs = d_msg_list_from_serialized_string(arena, msgs_srlzed_baked); scratch_end(scratch); return msgs; } @@ -3276,18 +3220,18 @@ ctrl_u2c_pop_msgs(Arena *arena) //- rjf: control -> user thread communication internal void -ctrl_c2u_push_events(D_EventList *events) +d_c2u_push_events(D_EventList *events) { - if(events->count != 0) ProfScope("ctrl_c2u_push_events") + if(events->count != 0) ProfScope("d_c2u_push_events") { MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - ctrl_entity_store_apply_events(d_ctrl_state->ctrl_thread_entity_store, events); + d_entity_store_apply_events(d_ctrl_state->ctrl_thread_entity_store, events); } for(D_EventNode *n = events->first; n != 0; n = n ->next) { Temp scratch = scratch_begin(0, 0); - String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, d_ctrl_state->c2u_ring_size-sizeof(U64)); + String8 event_srlzed = d_serialized_string_from_event(scratch.arena, &n->v, d_ctrl_state->c2u_ring_size-sizeof(U64)); MutexScope(d_ctrl_state->c2u_ring_mutex) for(;;) { U64 unconsumed_size = (d_ctrl_state->c2u_ring_write_pos-d_ctrl_state->c2u_ring_read_pos); @@ -3312,7 +3256,7 @@ ctrl_c2u_push_events(D_EventList *events) } internal D_EventList -ctrl_c2u_pop_events(Arena *arena) +d_c2u_pop_events(Arena *arena) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -3328,8 +3272,8 @@ ctrl_c2u_pop_events(Arena *arena) event_srlzed.size = size_to_decode; event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size); d_ctrl_state->c2u_ring_read_pos += ring_read(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); - D_Event *new_event = ctrl_event_list_push(arena, &events); - *new_event = ctrl_event_from_serialized_string(arena, event_srlzed); + D_Event *new_event = d_event_list_push(arena, &events); + *new_event = d_event_from_serialized_string(arena, event_srlzed); } else { @@ -3345,7 +3289,7 @@ ctrl_c2u_pop_events(Arena *arena) //- rjf: entry point internal void -ctrl_thread__entry_point(void *p) +d_ctrl_thread__entry_point(void *p) { ThreadNameF("ctrl_thread"); ProfBeginFunction(); @@ -3360,7 +3304,7 @@ ctrl_thread__entry_point(void *p) log_scope_begin(); //- rjf: get next messages - D_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); + D_MsgList msgs = d_u2c_pop_msgs(scratch.arena); //- rjf: process messages DMN_CtrlExclusiveAccessScope @@ -3370,7 +3314,7 @@ ctrl_thread__entry_point(void *p) { D_Msg *msg = &msg_n->v; { - log_infof("user2ctrl_msg:{kind:\"%S\"}\n", ctrl_string_from_msg_kind(msg->kind)); + log_infof("user2ctrl_msg:{kind:\"%S\"}\n", d_string_from_msg_kind(msg->kind)); } //- rjf: reset per-message state @@ -3451,13 +3395,13 @@ ctrl_thread__entry_point(void *p) case D_MsgKind_COUNT:{}break; //- rjf: target operations - case D_MsgKind_Launch: {ctrl_thread__launch (ctrl_ctx, msg);}break; - case D_MsgKind_Attach: {ctrl_thread__attach (ctrl_ctx, msg);}break; - case D_MsgKind_Kill: {ctrl_thread__kill (ctrl_ctx, msg);}break; - case D_MsgKind_KillAll: {ctrl_thread__kill_all (ctrl_ctx, msg);}break; - case D_MsgKind_Detach: {ctrl_thread__detach (ctrl_ctx, msg);}break; - case D_MsgKind_Run: {ctrl_thread__run (ctrl_ctx, msg);}break; - case D_MsgKind_SingleStep: {ctrl_thread__single_step (ctrl_ctx, msg);}break; + case D_MsgKind_Launch: {d_ctrl_thread__launch (ctrl_ctx, msg);}break; + case D_MsgKind_Attach: {d_ctrl_thread__attach (ctrl_ctx, msg);}break; + case D_MsgKind_Kill: {d_ctrl_thread__kill (ctrl_ctx, msg);}break; + case D_MsgKind_KillAll: {d_ctrl_thread__kill_all (ctrl_ctx, msg);}break; + case D_MsgKind_Detach: {d_ctrl_thread__detach (ctrl_ctx, msg);}break; + case D_MsgKind_Run: {d_ctrl_thread__run (ctrl_ctx, msg);}break; + case D_MsgKind_SingleStep: {d_ctrl_thread__single_step (ctrl_ctx, msg);}break; //- rjf: configuration case D_MsgKind_SetUserEntryPoints: @@ -3473,41 +3417,41 @@ ctrl_thread__entry_point(void *p) { D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; String8 path = msg->path; - D_Entity *module = ctrl_entity_from_handle(entity_ctx, msg->entity); - D_Entity *debug_info_path = ctrl_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); + D_Entity *module = d_entity_from_handle(entity_ctx, msg->entity); + D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); di_close(old_dbgi_key, 0); MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - ctrl_entity_equip_string(d_ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); + d_entity_equip_string(d_ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); } U64 new_dbgi_timestamp = os_properties_from_file_path(path).modified; debug_info_path->timestamp = new_dbgi_timestamp; DI_Key new_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, new_dbgi_timestamp); di_open(new_dbgi_key); D_EventList evts = {0}; - D_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *evt = d_event_list_push(scratch.arena, &evts); evt->kind = D_EventKind_ModuleDebugInfoPathChange; evt->entity = msg->entity; evt->string = path; evt->timestamp = new_dbgi_timestamp; - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); }break; case D_MsgKind_FreezeThread: { D_EventList evts = {0}; - D_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *evt = d_event_list_push(scratch.arena, &evts); evt->kind = D_EventKind_ThreadFrozen; evt->entity = msg->entity; - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); }break; case D_MsgKind_ThawThread: { D_EventList evts = {0}; - D_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *evt = d_event_list_push(scratch.arena, &evts); evt->kind = D_EventKind_ThreadThawed; evt->entity = msg->entity; - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); }break; } } @@ -3521,20 +3465,20 @@ ctrl_thread__entry_point(void *p) ProfScope("update thread register cache") { D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - D_EntityArray threads = ctrl_entity_array_from_kind(entity_ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(entity_ctx, D_EntityKind_Thread); REGS_RegBlockX64 *blocks = push_array(scratch.arena, REGS_RegBlockX64, threads.count); { for EachIndex(idx, threads.count) { Temp scratch = scratch_begin(0, 0); - ctrl_reg_block_from_thread(scratch.arena, entity_ctx, threads.v[idx]->handle); + d_reg_block_from_thread(scratch.arena, entity_ctx, threads.v[idx]->handle); scratch_end(scratch); } } } //- rjf: gather & output logs - ctrl_thread__end_and_flush_log(); + d_ctrl_thread__end_and_flush_log(); } scratch_end(scratch); @@ -3544,16 +3488,16 @@ ctrl_thread__entry_point(void *p) //- rjf: breakpoint resolution internal void -ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out) +d_ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out) { if(user_bps->first == 0) { return; } ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); Access *access = eval_scope->access; D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - D_Entity *module_entity = ctrl_entity_from_handle(entity_ctx, module); - D_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, D_EntityKind_DebugInfoPath); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_entity); + D_Entity *module_entity = d_entity_from_handle(entity_ctx, module); + D_Entity *debug_info_path_entity = d_entity_child_from_kind(module_entity, D_EntityKind_DebugInfoPath); + DI_Key dbgi_key = d_dbgi_key_from_module(module_entity); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); U64 base_vaddr = module_entity->vaddr_range.min; for(D_BreakpointNode *n = user_bps->first; n != 0; n = n->next) @@ -3620,7 +3564,7 @@ ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eva if(value.u64 != 0 || bp->flags != 0) { DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; - trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags); + trap.flags = d_dmn_trap_flags_from_breakpoint_flags(bp->flags); trap.size = bp->size; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); } @@ -3631,7 +3575,7 @@ ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eva } internal void -ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out) +d_ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out) { for(D_BreakpointNode *n = user_bps->first; n != 0; n = n->next) { @@ -3643,7 +3587,7 @@ ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *ev if(value.u64 != 0 || bp->flags != 0) { DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; - trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags); + trap.flags = d_dmn_trap_flags_from_breakpoint_flags(bp->flags); trap.size = bp->size; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); } @@ -3652,7 +3596,7 @@ ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *ev } internal void -ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out) +d_ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out) { D_Entity *process = bp->parent; DMN_Trap trap = @@ -3660,7 +3604,7 @@ ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_Tra .process = process->handle.dmn_handle, .vaddr = bp->vaddr_range.min, .id = ((U64)bp|bit64), - .flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->bp_flags), + .flags = d_dmn_trap_flags_from_breakpoint_flags(bp->bp_flags), .size = (U32)dim_1u64(bp->vaddr_range), }; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); @@ -3676,7 +3620,7 @@ MACHINE_OP_MEM_READ(ctrl_dmn_mem_read) } internal void -ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) +d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) { Temp scratch = scratch_begin(0,0); @@ -3975,7 +3919,9 @@ ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, } // parse .eh_frame_hdr - Arch arch = ctrl_arch_from_process_handle(process); + D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + D_Entity *process_entity = d_entity_from_handle(entity_ctx, process); + Arch arch = process_entity->arch; eh_ptr_ctx.pc_vaddr = eh_frame_hdr_vrange.min; eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min; eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx); @@ -4045,7 +3991,7 @@ ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, //- rjf: insert info into cache // { - U64 hash = ctrl_hash_from_handle(module); + U64 hash = d_hash_from_handle(module); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; @@ -4055,7 +4001,7 @@ ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, D_ModuleImageInfoCacheNode *node = 0; for EachNode(n, D_ModuleImageInfoCacheNode, slot->first) { - if(ctrl_handle_match(n->module, module)) + if(d_handle_match(n->module, module)) { node = n; break; @@ -4085,14 +4031,14 @@ ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, } internal void -ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range) +d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range) { ////////////////////////////// //- rjf: evict module image info from cache // U64 raddbg_attached_marker_voff = 0; { - U64 hash = ctrl_hash_from_handle(module); + U64 hash = d_hash_from_handle(module); U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; @@ -4102,7 +4048,7 @@ ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range D_ModuleImageInfoCacheNode *node = 0; for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->module, module)) + if(d_handle_match(n->module, module)) { node = n; break; @@ -4130,7 +4076,7 @@ ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range //- rjf: attached process running/event gathering internal DMN_Event * -ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN_RunCtrls *run_ctrls, D_Spoof *spoof) +d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN_RunCtrls *run_ctrls, D_Spoof *spoof) { ProfBeginFunction(); DMN_Event *event = push_array(arena, DMN_Event, 1); @@ -4184,7 +4130,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN { for(D_ExceptionCodeKind k = (D_ExceptionCodeKind)0; k < D_ExceptionCodeKind_COUNT; k = (D_ExceptionCodeKind)(k+1)) { - if(ctrl_exception_code_kind_code_table[k] == ev->code) + if(d_exception_code_kind_code_table[k] == ev->code) { code_kind = k; break; @@ -4208,7 +4154,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) { Access *access = access_open(); - D_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, ev->process)); + D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, ev->process)); D_Entity *module = &d_entity_nil; for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { @@ -4223,7 +4169,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN // rjf: determine base address of asan shadow space U64 asan_shadow_base_vaddr = 0; B32 asan_shadow_variable_exists_but_is_zero = 0; - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64); RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables); { @@ -4298,7 +4244,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN U64 size_of_spoof = 0; if(do_spoof) ProfScope("prep spoof") { - D_Entity *spoof_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, spoof->process)); + D_Entity *spoof_process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, spoof->process)); Arch arch = spoof_process->arch; size_of_spoof = bit_size_from_arch(arch)/8; dmn_process_read(spoof_process->handle.dmn_handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); @@ -4368,7 +4314,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN // simply been sent other debug events first if(spoof != 0) { - D_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, spoof->thread)); + D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, spoof->thread)); Arch arch = thread->arch; void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch)); dmn_thread_read_reg_block(spoof->thread, regs_block); @@ -4376,7 +4322,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN if(spoof_thread_rip == spoof->new_ip_value) { regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value); - ctrl_thread_write_reg_block(ctrl_handle_make(D_MachineID_Local, spoof->thread), regs_block); + d_thread_write_reg_block(d_handle_make(D_MachineID_Local, spoof->thread), regs_block); } } @@ -4387,23 +4333,23 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN default:{}break; case DMN_EventKind_CreateProcess: { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_NewProc; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_make(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; - out_evt->tls_model = ctrl_dynamic_linker_type_from_dmn(event->tls_model); + out_evt->tls_model = d_dynamic_linker_type_from_dmn(event->tls_model); out_evt->target_os = OperatingSystem_CURRENT; // TODO: operating system of the remote target machine d_ctrl_state->process_counter += 1; }break; case DMN_EventKind_CreateThread: { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_NewThread; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_make(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); @@ -4413,12 +4359,12 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN }break; case DMN_EventKind_LoadModule: { - D_Handle process_handle = ctrl_handle_make(D_MachineID_Local, event->process); - D_Handle module_handle = ctrl_handle_make(D_MachineID_Local, event->module); - D_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts); + D_Handle process_handle = d_handle_make(D_MachineID_Local, event->process); + D_Handle module_handle = d_handle_make(D_MachineID_Local, event->module); + D_Event *out_evt1 = d_event_list_push(scratch.arena, &evts); String8 module_path = path_normalized_from_string(scratch.arena, event->string); U64 exe_timestamp = os_properties_from_file_path(module_path).modified; - ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize); + d_ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize); out_evt1->kind = D_EventKind_NewModule; out_evt1->msg_id = msg->msg_id; out_evt1->entity = module_handle; @@ -4431,8 +4377,8 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN out_evt1->string = module_path; out_evt1->tls_index = event->tls_index; out_evt1->tls_offset = event->tls_offset; - D_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts); - String8 initial_debug_info_path = ctrl_initial_debug_info_path_from_module(scratch.arena, module_handle); + D_Event *out_evt2 = d_event_list_push(scratch.arena, &evts); + String8 initial_debug_info_path = d_initial_debug_info_path_from_module(scratch.arena, module_handle); U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified; out_evt2->kind = D_EventKind_ModuleDebugInfoPathChange; out_evt2->msg_id = msg->msg_id; @@ -4445,35 +4391,35 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN }break; case DMN_EventKind_ExitProcess: { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_EndProc; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_make(D_MachineID_Local, event->process); out_evt->u64_code = event->code; d_ctrl_state->process_counter -= 1; }break; case DMN_EventKind_ExitThread: { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_EndThread; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); + out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); out_evt->entity_id = event->code; }break; case DMN_EventKind_UnloadModule: ProfScope("unload module %.*s", str8_varg(event->string)) { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); - D_Handle module_handle = ctrl_handle_make(D_MachineID_Local, event->module); - D_Entity *module_ent = ctrl_entity_from_handle(entity_ctx, module_handle); - D_Entity *process_ent = ctrl_process_from_entity(module_ent); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); + D_Handle module_handle = d_handle_make(D_MachineID_Local, event->module); + D_Entity *module_ent = d_entity_from_handle(entity_ctx, module_handle); + D_Entity *process_ent = d_process_from_entity(module_ent); String8 module_path = event->string; - ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range); + d_ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range); out_evt->kind = D_EventKind_EndModule; out_evt->msg_id = msg->msg_id; out_evt->entity = module_handle; out_evt->string = module_path; - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_ent); + DI_Key dbgi_key = d_dbgi_key_from_module(module_ent); di_close(dbgi_key, 0); }break; case DMN_EventKind_DebugString: @@ -4481,64 +4427,64 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN U64 num_strings = (event->string.size + d_ctrl_state->c2u_ring_max_string_size-1) / d_ctrl_state->c2u_ring_max_string_size; for(U64 string_idx = 0; string_idx < num_strings; string_idx += 1) { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_DebugString; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_make(D_MachineID_Local, event->process); out_evt->string = str8_substr(event->string, r1u64(string_idx*d_ctrl_state->c2u_ring_max_string_size, (string_idx+1)*d_ctrl_state->c2u_ring_max_string_size)); } }break; case DMN_EventKind_SetThreadName: { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_ThreadName; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_make(D_MachineID_Local, event->process); out_evt->string = event->string; out_evt->entity_id = event->code; }break; case DMN_EventKind_SetThreadColor: { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_ThreadColor; out_evt->msg_id = msg->msg_id; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_make(D_MachineID_Local, event->process); out_evt->entity_id = event->code; out_evt->rgba = event->user_data; }break; case DMN_EventKind_SetVAddrRangeNote: { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_SetVAddrRangeNote; - out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->parent = d_handle_make(D_MachineID_Local, event->process); out_evt->msg_id = msg->msg_id; out_evt->vaddr_rng = r1u64(event->address, event->address + event->size); out_evt->string = event->string; }break; case DMN_EventKind_SetBreakpoint: { - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_SetBreakpoint; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_make(D_MachineID_Local, event->process); out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); - out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); + out_evt->bp_flags = d_breakpoint_flags_from_dmn_trap_flags(event->flags); }break; case DMN_EventKind_UnsetBreakpoint: { // TODO(rjf): this needs to be reflected in the resolved trap list too!!!!!!!! - D_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_UnsetBreakpoint; - out_evt->entity = ctrl_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = ctrl_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_make(D_MachineID_Local, event->process); out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); - out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); + out_evt->bp_flags = d_breakpoint_flags_from_dmn_trap_flags(event->flags); }break; } - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); //- rjf: if this is the first process in a session, clear the debug directory // cache state @@ -4563,7 +4509,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN //- rjf: eval helpers internal U64 -ctrl_eval_space_gen(E_Space space) +d_ctrl_eval_space_gen(E_Space space) { U64 result = 0; switch(space.kind) @@ -4571,14 +4517,14 @@ ctrl_eval_space_gen(E_Space space) default:{}break; case D_EvalSpaceKind_Entity: { - result = ctrl_mem_gen(); + result = d_mem_gen(); }break; } return result; } internal B32 -ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) +d_ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) { B32 result = 0; switch(space.kind) @@ -4602,7 +4548,7 @@ ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) Temp scratch = scratch_begin(0, 0); D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; U64 regs_size = regs_block_size_from_arch(entity->arch); - void *regs = ctrl_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle); + void *regs = d_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle); Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 read_range = intersect_1u64(legal_range, range); U64 read_size = dim_1u64(read_range); @@ -4619,7 +4565,7 @@ ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) //- rjf: control thread eval scopes internal D_EvalScope * -ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity *thread) +d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity *thread) { ProfBeginFunction(); D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; @@ -4631,9 +4577,9 @@ ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity // Arch arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(thread->handle.dmn_handle); - D_Entity *process = ctrl_process_from_entity(thread); - D_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); - U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); + D_Entity *process = d_process_from_entity(thread); + D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); + U64 thread_rip_voff = d_voff_from_vaddr(module, thread_rip_vaddr); ////////////////////////////// //- rjf: gather evaluation debug infos & modules @@ -4664,7 +4610,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity mod = mod->next) { if(mod->kind != D_EntityKind_Module) { continue; } - DI_Key dbgi_key = ctrl_dbgi_key_from_module(mod); + DI_Key dbgi_key = d_dbgi_key_from_module(mod); //- rjf: try to obtain this module's RDI RDI_Parsed *rdi = di_rdi_from_key(scope->access, dbgi_key, 0, 0); @@ -4681,13 +4627,13 @@ ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity else if(rdi == &rdi_parsed_nil) ProfScope("determine if RDI is necessary") { // rjf: find cached result - U64 hash = ctrl_hash_from_handle(mod->handle); + U64 hash = d_hash_from_handle(mod->handle); U64 slot_idx = hash%d_ctrl_state->module_req_cache_slots_count; D_ModuleReqCacheNode *slot = d_ctrl_state->module_req_cache_slots[slot_idx]; D_ModuleReqCacheNode *node = 0; for(D_ModuleReqCacheNode *n = slot; n != 0; n = n->next) { - if(ctrl_handle_match(n->module, mod->handle)) + if(d_handle_match(n->module, mod->handle)) { node = n; break; @@ -4703,7 +4649,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity // rjf: not cached -> compute & store else ProfScope("cache miss") { - D_Entity *debug_info_path = ctrl_entity_child_from_kind(mod, D_EntityKind_DebugInfoPath); + D_Entity *debug_info_path = d_entity_child_from_kind(mod, D_EntityKind_DebugInfoPath); OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, debug_info_path->string); ProfScope("determine if %.*s is necessary", str8_varg(debug_info_path->string)) { @@ -4814,8 +4760,8 @@ ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity ctx->primary_module = eval_modules_primary; //- rjf: fill space hooks - ctx->space_gen = ctrl_eval_space_gen; - ctx->space_read = ctrl_eval_space_read; + ctx->space_gen = d_ctrl_eval_space_gen; + ctx->space_read = d_ctrl_eval_space_read; } e_select_base_ctx(&scope->base_ctx); @@ -4824,8 +4770,8 @@ ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity // { E_IRCtx *ctx = &scope->ir_ctx; - ctx->regs_map = ctrl_string2reg_from_arch(arch); - ctx->reg_alias_map = ctrl_string2alias_from_arch(arch); + ctx->regs_map = d_string2reg_from_arch(arch); + ctx->reg_alias_map = d_string2alias_from_arch(arch); ctx->locals_map = e_push_locals_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff); ctx->member_map = e_push_member_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff); ctx->macro_map = push_array(arena, E_String2ExprMap, 1); @@ -4859,7 +4805,7 @@ ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity } internal void -ctrl_thread__eval_scope_end(D_EvalScope *scope) +d_ctrl_thread__eval_scope_end(D_EvalScope *scope) { access_close(scope->access); } @@ -4867,7 +4813,7 @@ ctrl_thread__eval_scope_end(D_EvalScope *scope) //- rjf: log flusher internal void -ctrl_thread__end_and_flush_log(void) +d_ctrl_thread__end_and_flush_log(void) { Temp scratch = scratch_begin(0, 0); LogScopeResult log = log_scope_end(scratch.arena); @@ -4875,10 +4821,10 @@ ctrl_thread__end_and_flush_log(void) if(log.strings[LogMsgKind_UserError].size != 0) { D_EventList evts = {0}; - D_Event *evt = ctrl_event_list_push(scratch.arena, &evts); + D_Event *evt = d_event_list_push(scratch.arena, &evts); evt->kind = D_EventKind_Error; evt->string = log.strings[LogMsgKind_UserError]; - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } scratch_end(scratch); } @@ -4886,7 +4832,7 @@ ctrl_thread__end_and_flush_log(void) //- rjf: msg kind implementations internal void -ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) +d_ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { Temp scratch = scratch_begin(0, 0); @@ -4942,8 +4888,8 @@ ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) { String8 string = n->string; - D_Entity *entry = ctrl_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, D_EntityKind_EntryPoint, Arch_Null, ctrl_handle_zero(), (U64)id); - ctrl_entity_equip_string(entity_ctx_rw_store, entry, string); + D_Entity *entry = d_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, D_EntityKind_EntryPoint, Arch_Null, d_handle_zero(), (U64)id); + d_entity_equip_string(entity_ctx_rw_store, entry, string); } } @@ -4951,7 +4897,7 @@ ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } internal void -ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) +d_ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -4968,7 +4914,7 @@ ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) run_ctrls.run_entities_are_processes = 1; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; @@ -4992,12 +4938,12 @@ ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: record stop { D_EventList evts = {0}; - D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Stopped; event->cause = D_EventCause_Finished; event->msg_id = msg->msg_id; event->entity_id = !!attach_successful * msg->entity_id; - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } scratch_end(scratch); @@ -5005,7 +4951,7 @@ ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } internal void -ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) +d_ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -5026,7 +4972,7 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) run_ctrls.run_entity_count = 1; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); switch(event->kind) { default:{}break; @@ -5044,7 +4990,7 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: record stop { D_EventList evts = {0}; - D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Stopped; event->cause = cause; event->msg_id = msg->msg_id; @@ -5052,7 +4998,7 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { event->entity = msg->entity; } - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } scratch_end(scratch); @@ -5060,7 +5006,7 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } internal void -ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) +d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -5068,7 +5014,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; //- rjf: gather all currently existing processes - D_EntityArray initial_processes = ctrl_entity_array_from_kind(entity_ctx, D_EntityKind_Process); + D_EntityArray initial_processes = d_entity_array_from_kind(entity_ctx, D_EntityKind_Process); typedef struct Task Task; struct Task { @@ -5105,7 +5051,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } // rjf: get next event - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); // rjf: process event switch(event->kind) @@ -5113,7 +5059,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) default:{}break; case DMN_EventKind_CreateProcess: { - D_Entity *new_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->process)); + D_Entity *new_process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->process)); Task *t = push_array(scratch.arena, Task, 1); t->process = new_process; DLLPushBack(first_task, last_task, t); @@ -5123,7 +5069,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } // rjf: end if all processes are gone - D_EntityArray processes = ctrl_entity_array_from_kind(entity_ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(entity_ctx, D_EntityKind_Process); if(processes.count == 0) { done = 1; @@ -5134,11 +5080,11 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: record stop { D_EventList evts = {0}; - D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Stopped; event->cause = cause; event->msg_id = msg->msg_id; - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } scratch_end(scratch); @@ -5146,7 +5092,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } internal void -ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) +d_ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -5165,7 +5111,7 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) run_ctrls.run_entity_count = 1; for(B32 done = 0; done == 0;) { - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process)) { done = 1; @@ -5180,7 +5126,7 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: record stop { D_EventList evts = {0}; - D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Stopped; event->cause = D_EventCause_Finished; event->msg_id = msg->msg_id; @@ -5188,7 +5134,7 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { event->entity = msg->entity; } - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } scratch_end(scratch); @@ -5196,7 +5142,7 @@ ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } internal void -ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) +d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -5205,17 +5151,17 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; D_Handle target_thread = msg->entity; D_Handle target_process = msg->parent; - D_Entity *target_process_entity = ctrl_entity_from_handle(entity_ctx, target_process); + D_Entity *target_process_entity = d_entity_from_handle(entity_ctx, target_process); U64 spoof_ip_vaddr = 911; - log_infof("ctrl_thread__run:\n{\n"); + log_infof("d_ctrl_thread__run:\n{\n"); ////////////////////////////// //- rjf: gather all initial breakpoints // DMN_TrapChunkList user_traps = {0}; { - D_Entity *thread = ctrl_entity_from_handle(entity_ctx, target_thread); - D_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); + D_Entity *thread = d_entity_from_handle(entity_ctx, target_thread); + D_EvalScope *eval_scope = d_ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); for(D_Entity *machine = entity_ctx->root->first; machine != &d_entity_nil; machine = machine->next) @@ -5229,21 +5175,21 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) for(D_Entity *module = process->first; module != &d_entity_nil; module = module->next) { if(module->kind != D_EntityKind_Module) { continue; } - ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, process->handle, module->handle, &msg->user_bps, &user_traps); + d_ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, process->handle, module->handle, &msg->user_bps, &user_traps); } // rjf: push process-declared breakpoins for(D_Entity *bp = process->first; bp != &d_entity_nil; bp = bp->next) { if(bp->kind != D_EntityKind_Breakpoint) { continue; } - ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &user_traps); + d_ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &user_traps); } // rjf: push virtual-address user breakpoints per-process - ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, process->handle, &msg->user_bps, &user_traps); + d_ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, process->handle, &msg->user_bps, &user_traps); } } - ctrl_thread__eval_scope_end(eval_scope); + d_ctrl_thread__eval_scope_end(eval_scope); } ////////////////////////////// @@ -5346,7 +5292,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { run_ctrls.single_step_thread = thread; } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); thread_post_rip = dmn_rip_from_thread(thread); switch(event->kind) { @@ -5391,7 +5337,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { if(thread->is_frozen) { - ctrl_entity_list_push(scratch.arena, &frozen_threads, thread); + d_entity_list_push(scratch.arena, &frozen_threads, thread); } } } @@ -5424,9 +5370,9 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(stop_event == 0) { D_EventList evts = {0}; - D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Started; - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } ////////////////////////////// @@ -5483,7 +5429,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: get next run-related event // log_infof("get_next_event:\n{\n"); - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, run_spoof); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, run_spoof); log_infof("}\n\n"); ////////////////////////// @@ -5491,7 +5437,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // B32 launch_done_first_module = 0; B32 hard_stop = 0; - D_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + D_EventCause hard_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); B32 use_stepping_logic = 0; switch(event->kind) { @@ -5512,10 +5458,10 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) }break; case DMN_EventKind_CreateProcess: { - D_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, &d_entity_nil); + D_EvalScope *eval_scope = d_ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, &d_entity_nil); { DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(D_MachineID_Local, event->process), &msg->user_bps, &new_traps); + d_ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, d_handle_make(D_MachineID_Local, event->process), &msg->user_bps, &new_traps); log_infof("step_rule: create_process -> resolve traps\n"); log_infof("new_traps:\n{\n"); for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) @@ -5530,15 +5476,15 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); } - ctrl_thread__eval_scope_end(eval_scope); + d_ctrl_thread__eval_scope_end(eval_scope); }break; case DMN_EventKind_LoadModule: { - D_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->thread)); - D_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); + D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->thread)); + D_EvalScope *eval_scope = d_ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); { DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(D_MachineID_Local, event->process), ctrl_handle_make(D_MachineID_Local, event->module), &msg->user_bps, &new_traps); + d_ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, d_handle_make(D_MachineID_Local, event->process), d_handle_make(D_MachineID_Local, event->module), &msg->user_bps, &new_traps); log_infof("step_rule: load_module -> resolve traps\n"); log_infof("new_traps:\n{\n"); for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) @@ -5553,19 +5499,19 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); } - ctrl_thread__eval_scope_end(eval_scope); + d_ctrl_thread__eval_scope_end(eval_scope); }break; case DMN_EventKind_SetBreakpoint: { D_Entity *bp = &d_entity_nil; { - D_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->process)); + D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->process)); for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { if(child->kind == D_EntityKind_Breakpoint && child->vaddr_range.min == event->address && child->vaddr_range.max == event->address + event->size && - child->bp_flags == ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags)) + child->bp_flags == d_breakpoint_flags_from_dmn_trap_flags(event->flags)) { bp = child; break; @@ -5575,7 +5521,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(bp != &d_entity_nil) { DMN_TrapChunkList new_traps = {0}; - ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &new_traps); + d_ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &new_traps); dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps); dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps); } @@ -5591,10 +5537,10 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) Access *access = access_open(); //- rjf: unpack process/module info - D_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->process)); - D_Entity *module = ctrl_entity_child_from_kind(process, D_EntityKind_Module); + D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->process)); + D_Entity *module = d_entity_child_from_kind(process, D_EntityKind_Module); U64 module_base_vaddr = module->vaddr_range.min; - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64); RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures); RDI_ParsedNameMap map = {0}; @@ -5631,7 +5577,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: add traps for module-baked entry points, if specified if(!entries_found) { - String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle); + String8 raddbg_data = d_raddbg_data_from_module(scratch.arena, module->handle); U8 split_char = 0; String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next) @@ -5757,7 +5703,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: add trap for PE header entry if(!entries_found) { - U64 voff = ctrl_entry_point_voff_from_module(module->handle); + U64 voff = d_entry_point_voff_from_module(module->handle); if(voff != 0) { DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; @@ -5814,11 +5760,11 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) ////////////////////////// //- rjf: unpack info about thread attached to event // - D_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->thread)); - D_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(D_MachineID_Local, event->process)); + D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->thread)); + D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->process)); Arch arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); - D_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); ////////////////////////// //- rjf: extract module-dependent info @@ -5929,7 +5875,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // rjf: evaluate hit stop conditions if(conditions.node_count != 0) ProfScope("evaluate hit stop conditions") { - D_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(temp.arena, &msg->user_bps, thread); + D_EvalScope *eval_scope = d_ctrl_thread__eval_scope_begin(temp.arena, &msg->user_bps, thread); for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next) { // rjf: evaluate @@ -5954,7 +5900,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) break; } } - ctrl_thread__eval_scope_end(eval_scope); + d_ctrl_thread__eval_scope_end(eval_scope); } // rjf: gather trap net hits @@ -5998,7 +5944,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { single_step_ctrls.single_step_thread = thread; } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); thread_post_rip = dmn_rip_from_thread(thread); switch(event->kind) { @@ -6011,12 +5957,12 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) cond_bp_single_step_stop = 1; single_step_done = 1; use_stepping_logic = 0; - cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + cond_bp_single_step_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; case DMN_EventKind_SingleStep: { single_step_done = dmn_handle_match(event->thread, thread); - cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + cond_bp_single_step_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; } } @@ -6086,7 +6032,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { single_step_ctrls.single_step_thread = target_thread.dmn_handle; } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); thread_post_rip = dmn_rip_from_thread(target_thread.dmn_handle); switch(event->kind) { @@ -6100,12 +6046,12 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) single_step_done = 1; use_stepping_logic = 0; use_trap_net_logic = 0; - single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + single_step_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; case DMN_EventKind_SingleStep: { single_step_done = dmn_handle_match(event->thread, target_thread.dmn_handle); - single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + single_step_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; } } @@ -6183,7 +6129,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { single_step_ctrls.single_step_thread = thread; } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); thread_post_rip = dmn_rip_from_thread(thread); switch(event->kind) { @@ -6195,12 +6141,12 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { step_past_trap_net_stop = 1; single_step_done = 1; - step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + step_past_trap_net_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; case DMN_EventKind_SingleStep: { single_step_done = dmn_handle_match(event->thread, thread); - step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind); + step_past_trap_net_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; } } @@ -6256,13 +6202,13 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(stop_event != 0) { D_EventList evts = {0}; - D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Stopped; event->cause = stop_cause; - event->entity = ctrl_handle_make(D_MachineID_Local, stop_event->thread); - event->parent = ctrl_handle_make(D_MachineID_Local, stop_event->process); + event->entity = d_handle_make(D_MachineID_Local, stop_event->thread); + event->parent = d_handle_make(D_MachineID_Local, stop_event->process); event->exception_code = stop_event->code; - event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind); + event->exception_kind = d_exception_kind_from_dmn(stop_event->exception_kind); event->vaddr_rng = r1u64(stop_event->address, stop_event->address); event->rip_vaddr = stop_event->instruction_pointer; if(stop_cause == D_EventCause_UserBreakpoint && stop_event->user_data != 0) @@ -6273,7 +6219,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) event->u64_code = user_bp->id; } } - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } log_infof("}\n\n"); @@ -6282,7 +6228,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } internal void -ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) +d_ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -6290,9 +6236,9 @@ ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: record start { D_EventList evts = {0}; - D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Started; - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } //- rjf: single step @@ -6314,7 +6260,7 @@ ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { run_ctrls.single_step_thread = msg->entity.dmn_handle; } - DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); thread_post_rip = dmn_rip_from_thread(msg->entity.dmn_handle); switch(event->kind) { @@ -6337,19 +6283,19 @@ ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: record stop { D_EventList evts = {0}; - D_Event *event = ctrl_event_list_push(scratch.arena, &evts); + D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Stopped; event->cause = stop_cause; if(stop_event != 0) { - event->entity = ctrl_handle_make(D_MachineID_Local, stop_event->thread); - event->parent = ctrl_handle_make(D_MachineID_Local, stop_event->process); + event->entity = d_handle_make(D_MachineID_Local, stop_event->thread); + event->parent = d_handle_make(D_MachineID_Local, stop_event->process); event->exception_code = stop_event->code; - event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind); + event->exception_kind = d_exception_kind_from_dmn(stop_event->exception_kind); event->vaddr_rng = r1u64(stop_event->address, stop_event->address); event->rip_vaddr = stop_event->instruction_pointer; } - ctrl_c2u_push_events(&evts); + d_c2u_push_events(&evts); } scratch_end(scratch); @@ -6360,7 +6306,7 @@ ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //~ rjf: Process Memory Artifact Cache Hooks / Lookups internal AC_Artifact -ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) { AC_Artifact artifact = {0}; { @@ -6388,7 +6334,7 @@ ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 Arena *range_arena = 0; void *range_base = 0; U64 zero_terminated_size = 0; - U64 pre_read_mem_gen = ctrl_mem_gen(); + U64 pre_read_mem_gen = d_mem_gen(); B32 pre_run_state = ins_atomic_u64_eval(&d_ctrl_state->ctrl_thread_run_state); if(range_size != 0) { @@ -6457,7 +6403,7 @@ ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 } } } - U64 post_read_mem_gen = ctrl_mem_gen(); + U64 post_read_mem_gen = d_mem_gen(); B32 post_run_state = ins_atomic_u64_eval(&d_ctrl_state->ctrl_thread_run_state); //- rjf: form content key @@ -6513,7 +6459,7 @@ ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 } internal void -ctrl_memory_artifact_destroy(AC_Artifact artifact) +d_memory_artifact_destroy(AC_Artifact artifact) { C_Key key = {0}; MemoryCopyStruct(&key, &artifact); @@ -6521,7 +6467,7 @@ ctrl_memory_artifact_destroy(AC_Artifact artifact) } internal C_Key -ctrl_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale) +d_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale) { ProfBeginFunction(); #pragma pack(push, 1) @@ -6534,9 +6480,9 @@ ctrl_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zer #pragma pack(pop) String8 key = str8_struct(&key_data); Access *access = access_open(); - AC_Artifact artifact = ac_artifact_from_key(access, key, ctrl_memory_artifact_create, ctrl_memory_artifact_destroy, endt_us, + AC_Artifact artifact = ac_artifact_from_key(access, key, d_memory_artifact_create, d_memory_artifact_destroy, endt_us, .flags = AC_Flag_HighPriority | (wait_for_fresh ? AC_Flag_WaitForFresh : 0), - .gen = ctrl_mem_gen(), + .gen = d_mem_gen(), .slots_count = 2048, .stale_out = out_is_stale, .evict_threshold_us = 10000000); @@ -6550,7 +6496,7 @@ ctrl_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zer //- rjf: process memory reading helpers internal D_ProcessMemorySlice -ctrl_process_memory_slice_from_vaddr_range(Arena *arena, D_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us) +d_process_memory_slice_from_vaddr_range(Arena *arena, D_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us) { ProfBeginFunction(); D_ProcessMemorySlice result = {0}; @@ -6576,7 +6522,7 @@ ctrl_process_memory_slice_from_vaddr_range(Arena *arena, D_Handle process, Rng1U { U64 page_base_vaddr = page_range.min + page_idx*page_size; B32 page_is_stale = 0; - C_Key page_key = ctrl_key_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, wait_for_fresh, endt_us, &page_is_stale); + C_Key page_key = d_key_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, wait_for_fresh, endt_us, &page_is_stale); U128 page_hash = c_hash_from_key(page_key, 0); U128 page_last_hash = c_hash_from_key(page_key, 1); result.stale = (result.stale || page_is_stale); @@ -6693,11 +6639,11 @@ ctrl_process_memory_slice_from_vaddr_range(Arena *arena, D_Handle process, Rng1U } internal B32 -ctrl_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us) +d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us) { Temp scratch = scratch_begin(0, 0); U64 needed_size = dim_1u64(range); - D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, range, 0, endt_us); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process, range, 0, endt_us); B32 good = (slice.data.size >= needed_size && !slice.any_byte_bad); if(good) { @@ -6714,7 +6660,7 @@ ctrl_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, voi //- rjf: process memory writing internal B32 -ctrl_process_write(D_Handle process, Rng1U64 range, void *src) +d_process_write(D_Handle process, Rng1U64 range, void *src) { ProfBeginFunction(); B32 result = dmn_process_write(process.dmn_handle, range, src); @@ -6736,7 +6682,7 @@ ctrl_process_write(D_Handle process, Rng1U64 range, void *src) for EachInRange(page_idx, page_range) { Temp scratch = scratch_begin(0, 0); - D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); scratch_end(scratch); if(!slice.stale || os_now_microseconds() >= endt_us) { @@ -6753,7 +6699,7 @@ ctrl_process_write(D_Handle process, Rng1U64 range, void *src) //~ rjf: Call Stack Artifact Cache Hooks / Lookups internal AC_Artifact -ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) { AC_Artifact artifact = {0}; { @@ -6776,17 +6722,17 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, MemoryCopyArray(dst_ctx->entity_kind_counts, src_ctx->entity_kind_counts); MemoryCopyArray(dst_ctx->entity_kind_alloc_gens, src_ctx->entity_kind_alloc_gens); } - D_Entity *src_thread = ctrl_entity_from_handle(src_ctx, thread_handle); - D_Entity *src_process = ctrl_process_from_entity(src_thread); + D_Entity *src_thread = d_entity_from_handle(src_ctx, thread_handle); + D_Entity *src_process = d_process_from_entity(src_thread); { D_EntityRec rec = {0}; D_Entity *dst_parent = &d_entity_nil; for(D_Entity *src_e = src_process; src_e != &d_entity_nil; src_e = rec.next) { - rec = ctrl_entity_rec_depth_first_pre(src_e, src_process); + rec = d_entity_rec_depth_first_pre(src_e, src_process); // rjf: determine if we need this entity - B32 need_this_entity = (ctrl_handle_match(thread_handle, src_e->handle) || src_e->kind == D_EntityKind_Module || src_e->kind == D_EntityKind_Process || src_e->kind == D_EntityKind_DebugInfoPath); + B32 need_this_entity = (d_handle_match(thread_handle, src_e->handle) || src_e->kind == D_EntityKind_Module || src_e->kind == D_EntityKind_Process || src_e->kind == D_EntityKind_DebugInfoPath); // rjf: copy this entity D_Entity *dst_e = &d_entity_nil; @@ -6826,13 +6772,13 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, // rjf: insert into hash map if(dst_e != &d_entity_nil) { - U64 hash = ctrl_hash_from_handle(dst_e->handle); + U64 hash = d_hash_from_handle(dst_e->handle); U64 slot_idx = hash%dst_ctx->hash_slots_count; D_EntityHashSlot *slot = &dst_ctx->hash_slots[slot_idx]; D_EntityHashNode *node = 0; for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { - if(ctrl_handle_match(n->entity->handle, dst_e->handle)) + if(d_handle_match(n->entity->handle, dst_e->handle)) { node = n; break; @@ -6861,7 +6807,7 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, } //- rjf: compute call stack - D_Entity *thread = ctrl_entity_from_handle(entity_ctx, thread_handle); + D_Entity *thread = d_entity_from_handle(entity_ctx, thread_handle); B32 good = 1; B32 retry = 0; Arena *arena = 0; @@ -6871,27 +6817,27 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, good = 0; arena = arena_alloc(); call_stack = push_array(arena, D_CallStack, 1); - D_Entity *process = ctrl_process_from_entity(thread); + D_Entity *process = d_process_from_entity(thread); U64 pre_reg_gen = 0; U64 post_reg_gen = 0; U64 pre_mem_gen = 0; U64 post_mem_gen = 0; D_Unwind unwind = {0}; { - pre_reg_gen = ctrl_reg_gen(); - pre_mem_gen = ctrl_mem_gen(); - unwind = ctrl_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000); + pre_reg_gen = d_reg_gen(); + pre_mem_gen = d_mem_gen(); + unwind = d_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000); if(!(unwind.flags & D_UnwindFlag_Stale)) { good = 1; - call_stack[0] = ctrl_call_stack_from_unwind(arena, process, &unwind); + call_stack[0] = d_call_stack_from_unwind(arena, process, &unwind); } if(unwind.flags & D_UnwindFlag_Stale) { retry = 1; } - post_reg_gen = ctrl_reg_gen(); - post_mem_gen = ctrl_mem_gen(); + post_reg_gen = d_reg_gen(); + post_mem_gen = d_mem_gen(); } if(pre_reg_gen != post_reg_gen || pre_mem_gen != post_mem_gen) { @@ -6926,7 +6872,7 @@ ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, } internal void -ctrl_call_stack_artifact_destroy(AC_Artifact artifact) +d_call_stack_artifact_destroy(AC_Artifact artifact) { Arena *arena = (Arena *)artifact.u64[0]; if(arena != 0) @@ -6936,12 +6882,12 @@ ctrl_call_stack_artifact_destroy(AC_Artifact artifact) } internal D_CallStack -ctrl_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us) +d_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us) { D_CallStack result = {0}; { - AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&thread_handle), ctrl_call_stack_artifact_create, ctrl_call_stack_artifact_destroy, endt_us, - .gen = ctrl_mem_gen() + ctrl_reg_gen(), + AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&thread_handle), d_call_stack_artifact_create, d_call_stack_artifact_destroy, endt_us, + .gen = d_mem_gen() + d_reg_gen(), .evict_threshold_us = 10000000, .flags = high_priority ? AC_Flag_HighPriority : 0); if(artifact.u64[1] != 0) @@ -6956,7 +6902,7 @@ ctrl_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_pri //~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups internal AC_Artifact -ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) { Temp scratch = scratch_begin(0, 0); Access *access = access_open(); @@ -6969,7 +6915,7 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry MutexScopeR(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { D_EntityCtx *ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - D_EntityArray thread_entities = ctrl_entity_array_from_kind(ctx, D_EntityKind_Thread); + D_EntityArray thread_entities = d_entity_array_from_kind(ctx, D_EntityKind_Thread); threads_count = thread_entities.count; threads = push_array(scratch.arena, D_Handle, threads_count); threads_processes = push_array(scratch.arena, D_Handle, threads_count); @@ -6984,13 +6930,13 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry //- rjf: gather all callstacks B32 stale = 0; - U64 pre_mem_gen = ctrl_mem_gen(); - U64 pre_reg_gen = ctrl_reg_gen(); + U64 pre_mem_gen = d_mem_gen(); + U64 pre_reg_gen = d_reg_gen(); D_CallStack *call_stacks = push_array(scratch.arena, D_CallStack, threads_count); { for EachIndex(idx, threads_count) { - call_stacks[idx] = ctrl_call_stack_from_thread(access, threads[idx], 0, 0); + call_stacks[idx] = d_call_stack_from_thread(access, threads[idx], 0, 0); if(call_stacks[idx].concrete_frames_count == 0) { stale = 1; @@ -6998,8 +6944,8 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry } } } - U64 post_mem_gen = ctrl_mem_gen(); - U64 post_reg_gen = ctrl_reg_gen(); + U64 post_mem_gen = d_mem_gen(); + U64 post_reg_gen = d_reg_gen(); stale = (stale || pre_mem_gen != post_mem_gen || pre_reg_gen != post_reg_gen); //- rjf: build call stack tree @@ -7030,7 +6976,7 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry D_CallStackTreeNode *next_node = &d_call_stack_tree_node_nil; for(D_CallStackTreeNode *child = thread_node->first; child != &d_call_stack_tree_node_nil; child = child->next) { - if(ctrl_handle_match(child->process, process) && child->vaddr == vaddr && child->depth == depth) + if(d_handle_match(child->process, process) && child->vaddr == vaddr && child->depth == depth) { next_node = child; break; @@ -7049,7 +6995,7 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry } thread_node = next_node; } - ctrl_handle_list_push(arena, &thread_node->threads, &thread); + d_handle_list_push(arena, &thread_node->threads, &thread); for(D_CallStackTreeNode *n = thread_node; n != &d_call_stack_tree_node_nil; n = n->parent) { n->all_descendant_threads_count += 1; @@ -7076,7 +7022,7 @@ ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry } internal void -ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact) +d_call_stack_tree_artifact_destroy(AC_Artifact artifact) { Arena *arena = (Arena *)artifact.u64[0]; if(arena != 0) @@ -7086,11 +7032,11 @@ ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact) } internal D_CallStackTree -ctrl_call_stack_tree(Access *access, U64 endt_us) +d_call_stack_tree(Access *access, U64 endt_us) { D_CallStackTree result = {&d_call_stack_tree_node_nil}; { - AC_Artifact artifact = ac_artifact_from_key(access, str8_zero(), ctrl_call_stack_tree_artifact_create, ctrl_call_stack_tree_artifact_destroy, endt_us); + AC_Artifact artifact = ac_artifact_from_key(access, str8_zero(), d_call_stack_tree_artifact_create, d_call_stack_tree_artifact_destroy, endt_us); if(artifact.u64[1] != 0) { MemoryCopyStruct(&result, (D_CallStackTree *)artifact.u64[1]); diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 97479724..8a5cc7ea 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -349,267 +349,258 @@ thread_static D_EntityCtxLookupAccel *d_entity_ctx_lookup_accel = 0; //////////////////////////////// //~ rjf: Basic Type Functions -internal U64 ctrl_hash_from_string(String8 string); -internal U64 ctrl_hash_from_handle(D_Handle handle); -internal D_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); -internal D_ExceptionKind ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind); -internal D_TlsModel ctrl_dynamic_linker_type_from_dmn(DMN_TlsModel type); -internal String8 ctrl_string_from_event_kind(D_EventKind kind); -internal String8 ctrl_string_from_msg_kind(D_MsgKind kind); -internal D_EntityKind ctrl_entity_kind_from_string(String8 string); -internal DMN_TrapFlags ctrl_dmn_trap_flags_from_user_breakpoint_flags(D_BreakpointFlags flags); -internal D_BreakpointFlags ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags); +internal U64 d_hash_from_handle(D_Handle handle); +internal D_EventCause d_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); +internal D_ExceptionKind d_exception_kind_from_dmn(DMN_ExceptionKind kind); +internal D_TlsModel d_dynamic_linker_type_from_dmn(DMN_TlsModel type); +internal String8 d_string_from_event_kind(D_EventKind kind); +internal String8 d_string_from_msg_kind(D_MsgKind kind); +internal D_EntityKind d_entity_kind_from_string(String8 string); +internal DMN_TrapFlags d_dmn_trap_flags_from_breakpoint_flags(D_BreakpointFlags flags); +internal D_BreakpointFlags d_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags); //////////////////////////////// //~ rjf: Handle Type Functions -internal D_Handle ctrl_handle_zero(void); -internal D_Handle ctrl_handle_make(D_MachineID machine_id, DMN_Handle dmn_handle); -internal B32 ctrl_handle_match(D_Handle a, D_Handle b); -internal void ctrl_handle_list_push(Arena *arena, D_HandleList *list, D_Handle *pair); -internal D_HandleList ctrl_handle_list_copy(Arena *arena, D_HandleList *src); -internal D_HandleArray ctrl_handle_array_from_list(Arena *arena, D_HandleList *src); -internal String8 ctrl_string_from_handle(Arena *arena, D_Handle handle); -internal D_Handle ctrl_handle_from_string(String8 string); +internal D_Handle d_handle_zero(void); +internal D_Handle d_handle_make(D_MachineID machine_id, DMN_Handle dmn_handle); +internal B32 d_handle_match(D_Handle a, D_Handle b); +internal void d_handle_list_push(Arena *arena, D_HandleList *list, D_Handle *pair); +internal D_HandleList d_handle_list_copy(Arena *arena, D_HandleList *src); +internal D_HandleArray d_handle_array_from_list(Arena *arena, D_HandleList *src); +internal String8 d_string_from_handle(Arena *arena, D_Handle handle); +internal D_Handle d_handle_from_string(String8 string); //////////////////////////////// //~ rjf: Trap Type Functions -internal void ctrl_trap_list_push(Arena *arena, D_TrapList *list, D_Trap *trap); -internal D_TrapList ctrl_trap_list_copy(Arena *arena, D_TrapList *src); +internal void d_trap_list_push(Arena *arena, D_TrapList *list, D_Trap *trap); +internal D_TrapList d_trap_list_copy(Arena *arena, D_TrapList *src); //////////////////////////////// //~ rjf: User Breakpoint Type Functions -internal void ctrl_user_breakpoint_list_push(Arena *arena, D_BreakpointList *list, D_Breakpoint *bp); -internal D_BreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, D_BreakpointList *src); +internal void d_breakpoint_list_push(Arena *arena, D_BreakpointList *list, D_Breakpoint *bp); +internal D_BreakpointList d_breakpoint_list_copy(Arena *arena, D_BreakpointList *src); //////////////////////////////// //~ rjf: Message Type Functions //- rjf: deep copying -internal void ctrl_msg_deep_copy(Arena *arena, D_Msg *dst, D_Msg *src); +internal void d_msg_deep_copy(Arena *arena, D_Msg *dst, D_Msg *src); //- rjf: list building -internal D_Msg *ctrl_msg_list_push(Arena *arena, D_MsgList *list); -internal D_MsgList ctrl_msg_list_deep_copy(Arena *arena, D_MsgList *src); -internal void ctrl_msg_list_concat_in_place(D_MsgList *dst, D_MsgList *src); +internal D_Msg *d_msg_list_push(Arena *arena, D_MsgList *list); +internal D_MsgList d_msg_list_deep_copy(Arena *arena, D_MsgList *src); +internal void d_msg_list_concat_in_place(D_MsgList *dst, D_MsgList *src); //- rjf: serialization -internal String8 ctrl_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs); -internal D_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string); +internal String8 d_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs); +internal D_MsgList d_msg_list_from_serialized_string(Arena *arena, String8 string); //////////////////////////////// //~ rjf: Event Type Functions //- rjf: list building -internal D_Event *ctrl_event_list_push(Arena *arena, D_EventList *list); -internal void ctrl_event_list_concat_in_place(D_EventList *dst, D_EventList *to_push); +internal D_Event *d_event_list_push(Arena *arena, D_EventList *list); +internal void d_event_list_concat_in_place(D_EventList *dst, D_EventList *to_push); //- rjf: serialization -internal String8 ctrl_serialized_string_from_event(Arena *arena, D_Event *event, U64 max); -internal D_Event ctrl_event_from_serialized_string(Arena *arena, String8 string); +internal String8 d_serialized_string_from_event(Arena *arena, D_Event *event, U64 max); +internal D_Event d_event_from_serialized_string(Arena *arena, String8 string); //////////////////////////////// //~ rjf: Entity Type Functions //- rjf: entity list data structures -internal void ctrl_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity); -internal D_EntityList ctrl_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList *list); -#define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &d_entity_nil) +internal void d_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity); +internal D_EntityList d_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList *list); +#define d_entity_list_first(list) ((list)->first ? (list)->first->v : &d_entity_nil) //- rjf: entity array data structure -internal D_EntityArray ctrl_entity_array_from_list(Arena *arena, D_EntityList *list); -#define ctrl_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &d_entity_nil) +internal D_EntityArray d_entity_array_from_list(Arena *arena, D_EntityList *list); +#define d_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &d_entity_nil) //- rjf: entity context (entity group read-only) functions -internal D_Entity *ctrl_entity_from_handle(D_EntityCtx *ctx, D_Handle handle); -internal D_Entity *ctrl_entity_child_from_kind(D_Entity *parent, D_EntityKind kind); -internal D_Entity *ctrl_entity_ancestor_from_kind(D_Entity *entity, D_EntityKind kind); -internal D_Entity *ctrl_process_from_entity(D_Entity *entity); -internal D_Entity *ctrl_module_from_process_vaddr(D_Entity *process, U64 vaddr); -internal DI_Key ctrl_dbgi_key_from_module(D_Entity *module); -internal D_Entity *ctrl_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityList *candidates); -internal U64 ctrl_vaddr_from_voff(D_Entity *module, U64 voff); -internal U64 ctrl_voff_from_vaddr(D_Entity *module, U64 vaddr); -internal Rng1U64 ctrl_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_range); -internal Rng1U64 ctrl_voff_range_from_vaddr_range(D_Entity *module, Rng1U64 vaddr_range); -internal B32 ctrl_entity_tree_is_frozen(D_Entity *root); +internal D_Entity *d_entity_from_handle(D_EntityCtx *ctx, D_Handle handle); +internal D_Entity *d_entity_child_from_kind(D_Entity *parent, D_EntityKind kind); +internal D_Entity *d_entity_ancestor_from_kind(D_Entity *entity, D_EntityKind kind); +internal D_Entity *d_process_from_entity(D_Entity *entity); +internal D_Entity *d_module_from_process_vaddr(D_Entity *process, U64 vaddr); +internal DI_Key d_dbgi_key_from_module(D_Entity *module); +internal D_Entity *d_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityList *candidates); +internal U64 d_vaddr_from_voff(D_Entity *module, U64 voff); +internal U64 d_voff_from_vaddr(D_Entity *module, U64 vaddr); +internal Rng1U64 d_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_range); +internal Rng1U64 d_voff_range_from_vaddr_range(D_Entity *module, Rng1U64 vaddr_range); +internal B32 d_entity_tree_is_frozen(D_Entity *root); //- rjf: entity tree iteration -internal D_EntityRec ctrl_entity_rec_depth_first(D_Entity *entity, D_Entity *subtree_root, U64 sib_off, U64 child_off); -#define ctrl_entity_rec_depth_first_pre(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(D_Entity, next), OffsetOf(D_Entity, first)) -#define ctrl_entity_rec_depth_first_post(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(D_Entity, prev), OffsetOf(D_Entity, last)) +internal D_EntityRec d_entity_rec_depth_first(D_Entity *entity, D_Entity *subtree_root, U64 sib_off, U64 child_off); +#define d_entity_rec_depth_first_pre(entity, subtree_root) d_entity_rec_depth_first((entity), (subtree_root), OffsetOf(D_Entity, next), OffsetOf(D_Entity, first)) //- rjf: entity ctx r/w store state functions -internal D_EntityCtxRWStore *ctrl_entity_ctx_rw_store_alloc(void); -internal void ctrl_entity_ctx_rw_store_release(D_EntityCtxRWStore *store); +internal D_EntityCtxRWStore *d_entity_ctx_rw_store_alloc(void); +internal void d_entity_ctx_rw_store_release(D_EntityCtxRWStore *store); //- rjf: string allocation/deletion -internal U64 ctrl_name_bucket_num_from_string_size(U64 size); -internal String8 ctrl_entity_string_alloc(D_EntityCtxRWStore *store, String8 string); -internal void ctrl_entity_string_release(D_EntityCtxRWStore *store, String8 string); +internal U64 d_name_bucket_num_from_string_size(U64 size); +internal String8 d_entity_string_alloc(D_EntityCtxRWStore *store, String8 string); +internal void d_entity_string_release(D_EntityCtxRWStore *store, String8 string); //- rjf: entity construction/deletion -internal D_Entity *ctrl_entity_alloc(D_EntityCtxRWStore *store, D_Entity *parent, D_EntityKind kind, Arch arch, D_Handle handle, U64 id); -internal void ctrl_entity_release(D_EntityCtxRWStore *store, D_Entity *entity); +internal D_Entity *d_entity_alloc(D_EntityCtxRWStore *store, D_Entity *parent, D_EntityKind kind, Arch arch, D_Handle handle, U64 id); +internal void d_entity_release(D_EntityCtxRWStore *store, D_Entity *entity); //- rjf: entity equipment -internal void ctrl_entity_equip_string(D_EntityCtxRWStore *store, D_Entity *entity, String8 string); +internal void d_entity_equip_string(D_EntityCtxRWStore *store, D_Entity *entity, String8 string); //- rjf: accelerated entity context lookups -internal D_EntityCtxLookupAccel *ctrl_thread_entity_ctx_lookup_accel(void); -internal D_EntityArray ctrl_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind); -internal D_EntityList ctrl_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key); -internal D_Entity *ctrl_thread_from_id(D_EntityCtx *ctx, U64 id); +internal D_EntityCtxLookupAccel *d_thread_entity_ctx_lookup_accel(void); +internal D_EntityArray d_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind); +internal D_EntityList d_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key); +internal D_Entity *d_thread_from_id(D_EntityCtx *ctx, U64 id); //- rjf: applying events to entity caches -internal void ctrl_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list); +internal void d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list); //////////////////////////////// //~ rjf: Wakeup Callback Registration -internal void ctrl_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook); +internal void d_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook); //////////////////////////////// //~ rjf: Thread Register Functions //- rjf: thread register cache reading -internal void *ctrl_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle); -internal U64 ctrl_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle); -internal U64 ctrl_rip_from_thread(D_EntityCtx *ctx, D_Handle handle); -internal U64 ctrl_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle); +internal void *d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle); +internal U64 d_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle); +internal U64 d_rip_from_thread(D_EntityCtx *ctx, D_Handle handle); +internal U64 d_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle); //- rjf: thread register writing -internal B32 ctrl_thread_write_reg_block(D_Handle thread, void *block); +internal B32 d_thread_write_reg_block(D_Handle thread, void *block); //////////////////////////////// //~ rjf: Module Image Info Functions //- rjf: cache lookups -internal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff); -internal U64 ctrl_entry_point_voff_from_module(D_Handle module_handle); -internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle); -internal String8 ctrl_raddbg_data_from_module(Arena *arena, D_Handle module_handle); - -//////////////////////////////// -//~ Process Info Functions - -internal Arch ctrl_arch_from_process_handle(D_Handle process_handle); +internal PE_IntelPdata *d_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff); +internal U64 d_entry_point_voff_from_module(D_Handle module_handle); +internal String8 d_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle); +internal String8 d_raddbg_data_from_module(Arena *arena, D_Handle module_handle); //////////////////////////////// //~ rjf: Unwinding Functions -//- rjf: unwind deep copier -internal D_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, D_Unwind *src); - -//- DWARF -internal D_UnwindStepResult ctrl_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out); -internal D_UnwindStepResult ctrl_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us); +//- rjf: [dwarf] +internal D_UnwindStepResult d_unwind_step_result_from_machine_op_result(MachineOpResult s); +internal D_UnwindStepResult d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out); +internal D_UnwindStepResult d_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us); //- rjf: [x64] -internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); -internal D_UnwindStepResult ctrl_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); +internal REGS_Reg64 *d_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); +internal D_UnwindStepResult d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); //- rjf: abstracted full unwind -internal D_Unwind ctrl_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us); +internal D_Unwind d_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us); //////////////////////////////// //~ rjf: Call Stack Building Functions -internal D_CallStack ctrl_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwind); -internal D_CallStackFrame *ctrl_call_stack_frame_from_unwind_and_inline_depth(D_CallStack *call_stack, U64 unwind_count, U64 inline_depth); +internal D_CallStack d_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwind); +internal D_CallStackFrame *d_call_stack_frame_from_unwind_and_inline_depth(D_CallStack *call_stack, U64 unwind_count, U64 inline_depth); //////////////////////////////// //~ rjf: Halting All Attached Processes -internal void ctrl_halt(void); +internal void d_halt(void); //////////////////////////////// //~ rjf: Shared Accessor Functions //- rjf: generation counters -internal U64 ctrl_run_gen(void); -internal U64 ctrl_mem_gen(void); -internal U64 ctrl_reg_gen(void); +internal U64 d_run_gen(void); +internal U64 d_mem_gen(void); +internal U64 d_reg_gen(void); //- rjf: name -> register/alias hash tables, for eval -internal E_String2NumMap *ctrl_string2reg_from_arch(Arch arch); -internal E_String2NumMap *ctrl_string2alias_from_arch(Arch arch); +internal E_String2NumMap *d_string2reg_from_arch(Arch arch); +internal E_String2NumMap *d_string2alias_from_arch(Arch arch); //////////////////////////////// //~ rjf: Control-Thread Functions //- rjf: user -> control thread communication -internal B32 ctrl_u2c_push_msgs(D_MsgList *msgs, U64 endt_us); -internal D_MsgList ctrl_u2c_pop_msgs(Arena *arena); +internal B32 d_u2c_push_msgs(D_MsgList *msgs, U64 endt_us); +internal D_MsgList d_u2c_pop_msgs(Arena *arena); //- rjf: control -> user thread communication -internal void ctrl_c2u_push_events(D_EventList *events); -internal D_EventList ctrl_c2u_pop_events(Arena *arena); +internal void d_c2u_push_events(D_EventList *events); +internal D_EventList d_c2u_pop_events(Arena *arena); //- rjf: entry point -internal void ctrl_thread__entry_point(void *p); +internal void d_ctrl_thread__entry_point(void *p); //- rjf: breakpoint resolution -internal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out); -internal void ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out); +internal void d_ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_Handle module, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void d_ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out); +internal void d_ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out); //- rjf: module lifetime open/close work -internal void ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); -internal void ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range); +internal void d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); +internal void d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range); //- rjf: attached process running/event gathering -internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN_RunCtrls *run_ctrls, D_Spoof *spoof); +internal DMN_Event *d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN_RunCtrls *run_ctrls, D_Spoof *spoof); //- rjf: eval helpers -internal U64 ctrl_eval_space_gen(E_Space space); -internal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); +internal U64 d_ctrl_eval_space_gen(E_Space space); +internal B32 d_ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); //- rjf: control thread eval scopes -internal D_EvalScope *ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity *thread); -internal void ctrl_thread__eval_scope_end(D_EvalScope *scope); +internal D_EvalScope *d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity *thread); +internal void d_ctrl_thread__eval_scope_end(D_EvalScope *scope); //- rjf: log flusher -internal void ctrl_thread__end_and_flush_log(void); +internal void d_ctrl_thread__end_and_flush_log(void); //- rjf: msg kind implementations -internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); -internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); -internal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); -internal void ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); -internal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); -internal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); -internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void d_ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void d_ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void d_ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void d_ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void d_ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); //////////////////////////////// //~ rjf: Process Memory Artifact Cache Hooks / Lookups -internal AC_Artifact ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal void ctrl_memory_artifact_destroy(AC_Artifact artifact); -internal C_Key ctrl_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale); +internal AC_Artifact d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal void d_memory_artifact_destroy(AC_Artifact artifact); +internal C_Key d_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale); //- rjf: process memory reading helpers -internal D_ProcessMemorySlice ctrl_process_memory_slice_from_vaddr_range(Arena *arena, D_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us); -internal B32 ctrl_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); -#define ctrl_process_memory_read_struct(process, vaddr, is_stale_out, ptr, endt_us) ctrl_process_memory_read((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) +internal D_ProcessMemorySlice d_process_memory_slice_from_vaddr_range(Arena *arena, D_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us); +internal B32 d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); +#define d_process_memory_read_struct(process, vaddr, is_stale_out, ptr, endt_us) d_process_memory_read((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) //- rjf: process memory writing -internal B32 ctrl_process_write(D_Handle process, Rng1U64 range, void *src); +internal B32 d_process_write(D_Handle process, Rng1U64 range, void *src); //////////////////////////////// //~ rjf: Call Stack Artifact Cache Hooks / Lookups -internal AC_Artifact ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal void ctrl_call_stack_artifact_destroy(AC_Artifact artifact); -internal D_CallStack ctrl_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us); +internal AC_Artifact d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal void d_call_stack_artifact_destroy(AC_Artifact artifact); +internal D_CallStack d_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us); //////////////////////////////// //~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups -internal AC_Artifact ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal void ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact); -internal D_CallStackTree ctrl_call_stack_tree(Access *access, U64 endt_us); +internal AC_Artifact d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal void d_call_stack_tree_artifact_destroy(AC_Artifact artifact); +internal D_CallStackTree d_call_stack_tree(Access *access, U64 endt_us); #endif // DBG_ENGINE_CTRL_H diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 0d99412e..ab323399 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -292,15 +292,15 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread) D_TrapNet result = {0}; // rjf: thread => unpacked info - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + U64 ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); // rjf: ip => machine code String8 machine_code = {0}; { Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - D_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, os_now_microseconds()+5000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, os_now_microseconds()+5000); machine_code = machine_code_slice.data; } @@ -316,7 +316,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread) if(inst.flags & DASM_InstFlag_Call || inst.flags & DASM_InstFlag_Repeats) { D_Trap trap = {D_TrapFlag_EndStepping, ip_vaddr+inst.size}; - ctrl_trap_list_push(arena, &result.traps, &trap); + d_trap_list_push(arena, &result.traps, &trap); } } @@ -333,10 +333,10 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) // rjf: thread => info Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr); log_infof("dbgi_key: {0x%I64x, 0x%I64x}\n", dbgi_key.u64[0], dbgi_key.u64[1]); @@ -345,7 +345,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) S64 line_num = 0; Rng1U64 line_vaddr_rng = {0}; { - U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); + U64 ip_voff = d_voff_from_vaddr(module, ip_vaddr); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, ip_voff); Rng1U64 line_voff_rng = {0}; if(lines.first != 0) @@ -353,7 +353,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) line_voff_rng = lines.first->v.voff_range; file_path = lines.first->v.file_path; line_num = lines.first->v.pt.line; - line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); + line_vaddr_rng = d_vaddr_range_from_voff_range(module, line_voff_rng); log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); } log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); @@ -367,7 +367,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) for EachNode(n, D_LineNode, lines.first) { Rng1U64 voff_range = n->v.voff_range; - Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); + Rng1U64 vaddr_range = d_vaddr_range_from_voff_range(module, voff_range); rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); } } @@ -377,11 +377,11 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging // is enabled. This is enabled by default normally. { - U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max); + U64 opl_line_voff_rng = d_voff_from_vaddr(module, line_vaddr_rng.max); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, opl_line_voff_rng); if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) { - line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max); + line_vaddr_rng.max = d_vaddr_from_voff(module, lines.first->v.voff_range.max); } } @@ -393,7 +393,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - D_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+50000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+50000); machine_code = machine_code_slice.data; good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); LogInfoNamedBlockF("machine_code_slice") @@ -492,7 +492,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) if(add) { D_Trap trap = {flags, trap_addr}; - ctrl_trap_list_push(arena, &result.traps, &trap); + d_trap_list_push(arena, &result.traps, &trap); } } @@ -515,7 +515,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) if(!opl_in_line) { D_Trap trap = {D_TrapFlag_EndStepping, opl}; - ctrl_trap_list_push(arena, &result.traps, &trap); + d_trap_list_push(arena, &result.traps, &trap); } } } @@ -546,17 +546,17 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) // rjf: thread => info Arch arch = thread->arch; - U64 ip_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); // rjf: ip => line info String8 file_path = {0}; S64 line_num = 0; Rng1U64 line_vaddr_rng = {0}; { - U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr); + U64 ip_voff = d_voff_from_vaddr(module, ip_vaddr); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, ip_voff); Rng1U64 line_voff_rng = {0}; if(lines.first != 0) @@ -564,7 +564,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) line_voff_rng = lines.first->v.voff_range; file_path = lines.first->v.file_path; line_num = lines.first->v.pt.line; - line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng); + line_vaddr_rng = d_vaddr_range_from_voff_range(module, line_voff_rng); log_infof("line: {%S:%I64i}\n", lines.first->v.file_path, lines.first->v.pt.line); } log_infof("voff_range: {0x%I64x, 0x%I64x}\n", line_voff_rng.min, line_voff_rng.max); @@ -578,7 +578,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) for EachNode(n, D_LineNode, lines.first) { Rng1U64 voff_range = n->v.voff_range; - Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); + Rng1U64 vaddr_range = d_vaddr_range_from_voff_range(module, voff_range); rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); } } @@ -588,11 +588,11 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging // is enabled. This is enabled by default normally. { - U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max); + U64 opl_line_voff_rng = d_voff_from_vaddr(module, line_vaddr_rng.max); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, opl_line_voff_rng); if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee)) { - line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max); + line_vaddr_rng.max = d_vaddr_from_voff(module, lines.first->v.voff_range.max); } } @@ -604,7 +604,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - D_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+5000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+5000); machine_code = machine_code_slice.data; good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); } @@ -649,9 +649,9 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) point->jump_dest_vaddr != 0) { U64 jump_dest_vaddr = point->jump_dest_vaddr; - D_Entity *jump_dest_module = ctrl_module_from_process_vaddr(process, jump_dest_vaddr); - U64 jump_dest_voff = ctrl_voff_from_vaddr(jump_dest_module, jump_dest_vaddr); - DI_Key jump_dest_dbgi_key = ctrl_dbgi_key_from_module(jump_dest_module); + D_Entity *jump_dest_module = d_module_from_process_vaddr(process, jump_dest_vaddr); + U64 jump_dest_voff = d_voff_from_vaddr(jump_dest_module, jump_dest_vaddr); + DI_Key jump_dest_dbgi_key = d_dbgi_key_from_module(jump_dest_module); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, jump_dest_dbgi_key, jump_dest_voff); if(lines.count == 0) { @@ -701,7 +701,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) if(add) { D_Trap trap = {flags, trap_addr}; - ctrl_trap_list_push(arena, &result.traps, &trap); + d_trap_list_push(arena, &result.traps, &trap); } } @@ -724,7 +724,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) if(!opl_in_line) { D_Trap trap = {D_TrapFlag_EndStepping, opl}; - ctrl_trap_list_push(arena, &result.traps, &trap); + d_trap_list_push(arena, &result.traps, &trap); } } } @@ -1073,8 +1073,8 @@ d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 ri Temp scratch = scratch_begin(0, 0); //- rjf: unpack module info - D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - U64 addr_size = byte_size_from_arch(process->arch); + D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); + U64 addr_size = byte_size_from_arch(process->arch); switch(process->tls_model) { @@ -1084,7 +1084,7 @@ d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 ri // read thread local base pointer out of TEB U64 thread_local_base = root_vaddr; U64 tls_addr_array = 0; - D_ProcessMemorySlice tls_addr_array_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_local_base, thread_local_base + addr_size), 0, 0); + D_ProcessMemorySlice tls_addr_array_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_local_base, thread_local_base + addr_size), 0, 0); String8 tls_array_vaddr_data = tls_addr_array_slice.data; if(tls_array_vaddr_data.size == addr_size) { @@ -1093,7 +1093,7 @@ d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 ri // read thread local storage pointer (array of TLS pointers, one per module) U64 tls_ptr_vaddr = tls_array_vaddr + module->tls_index * addr_size; - D_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); + D_ProcessMemorySlice result_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); String8 result_data = result_slice.data; if(result_data.size == addr_size) { @@ -1109,7 +1109,7 @@ d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 ri U64 dtv_base = root_vaddr; U64 dtv_size = addr_size * 2; // union dtv { size_t counter; struct dtv_pointer { void *val, *to_free; }; }; U64 dtv_pointer_vaddr = dtv_base + module->tls_index * dtv_size; - D_ProcessMemorySlice dtv_pointer_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(dtv_pointer_vaddr, dtv_pointer_vaddr + dtv_size), 0, 0); + D_ProcessMemorySlice dtv_pointer_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(dtv_pointer_vaddr, dtv_pointer_vaddr + dtv_size), 0, 0); String8 dtv_pointer_data = dtv_pointer_slice.data; if(dtv_pointer_data.size == dtv_size) { @@ -1182,11 +1182,11 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena) { DI_KeyList dbgis = {0}; - D_EntityArray modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); + D_EntityArray modules = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); for EachIndex(idx, modules.count) { D_Entity *module = modules.v[idx]; - DI_Key key = ctrl_dbgi_key_from_module(module); + DI_Key key = d_dbgi_key_from_module(module); di_key_list_push(arena, &dbgis, key); } return dbgis; @@ -1207,12 +1207,12 @@ d_query_cached_rip_from_thread_unwind(D_Entity *thread, U64 unwind_count) U64 result = 0; if(unwind_count == 0) { - result = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + result = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); } else { Access *access = access_open(); - D_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); + D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, 0); if(callstack.concrete_frames_count != 0) { result = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->regs); @@ -1227,7 +1227,7 @@ d_query_cached_cfa_from_thread_unwind(D_Entity *thread, U64 unwind_count) { U64 cfa = 0; Access *access = access_open(); - D_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0); + D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, 0); if(callstack.concrete_frames_count != 0) { cfa = callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->cfa; @@ -1259,7 +1259,7 @@ d_query_cached_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_ D_RunTLSBaseCacheNode *node = 0; for(D_RunTLSBaseCacheNode *n = slot->first; n != 0; n = n->hash_next) { - if(ctrl_handle_match(n->process, handle) && n->root_vaddr == root_vaddr && n->rip_vaddr == rip_vaddr) + if(d_handle_match(n->process, handle) && n->root_vaddr == root_vaddr && n->rip_vaddr == rip_vaddr) { node = n; break; @@ -1439,19 +1439,19 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P ProfScope("sync with ctrl thread") { //- rjf: grab next reggen/memgen - U64 new_mem_gen = ctrl_mem_gen(); - U64 new_reg_gen = ctrl_reg_gen(); + U64 new_mem_gen = d_mem_gen(); + U64 new_reg_gen = d_reg_gen(); //- rjf: consume & process events - events = ctrl_c2u_pop_events(arena); - ctrl_entity_store_apply_events(d_user_state->ctrl_entity_store, &events); + events = d_c2u_pop_events(arena); + d_entity_store_apply_events(d_user_state->ctrl_entity_store, &events); for(D_EventNode *event_n = events.first; event_n != 0; event_n = event_n->next) { D_Event *event = &event_n->v; log_infof("ctrl_event:\n{\n"); - log_infof("kind: \"%S\"\n", ctrl_string_from_event_kind(event->kind)); + log_infof("kind: \"%S\"\n", d_string_from_event_kind(event->kind)); log_infof("entity_id: %u\n", event->entity_id); switch(event->kind) { @@ -1492,7 +1492,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_EventKind_NewProc: { // rjf: the first process? -> clear session output - D_EntityArray existing_processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray existing_processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(existing_processes.count == 1) { MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; @@ -1556,7 +1556,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: build data strings of all param data String8List strings = {0}; { - D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); for EachIndex(idx, threads.count) { D_Entity *thread = threads.v[idx]; @@ -1681,7 +1681,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: push message to launch { - D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); msg->kind = D_MsgKind_Launch; msg->path = working_directory; msg->cmd_line_string_list = cmdln_strings; @@ -1711,14 +1711,14 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Kill: { - D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); + D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); if(process == &d_entity_nil) { log_user_error(str8_lit("Cannot kill; no process was specified.")); } else { - D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); msg->kind = D_MsgKind_Kill; msg->exit_code = 1; msg->entity = process->handle; @@ -1727,21 +1727,21 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_KillAll: { - D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); msg->kind = D_MsgKind_KillAll; msg->exit_code = 1; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); }break; case D_CmdKind_Detach: { - D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); + D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); if(process == &d_entity_nil) { log_user_error(str8_lit("Cannot detach; no process specified.")); } else { - D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); msg->kind = D_MsgKind_Detach; msg->entity = process->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); @@ -1750,7 +1750,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_Continue: { B32 good_to_run = 0; - D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); if(threads.count > 0) { for EachIndex(idx, threads.count) @@ -1766,7 +1766,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { need_run = 1; run_kind = D_RunKind_Run; - run_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + run_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); } else { @@ -1780,7 +1780,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepOverLine: case D_CmdKind_StepOut: { - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); if(thread == &d_entity_nil) { log_user_error(str8_lit("Must have a selected thread to step.")); @@ -1811,14 +1811,14 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P Access *access = access_open(); // rjf: thread => call stack - D_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); // rjf: use first unwind frame to generate trap if(callstack.concrete_frames_count > 1) { U64 vaddr = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[1]->regs); D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, vaddr}; - ctrl_trap_list_push(scratch.arena, &trap_net.traps, &trap); + d_trap_list_push(scratch.arena, &trap_net.traps, &trap); trap_net.good_read = 1; } else @@ -1861,24 +1861,24 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_Halt: if(d_ctrl_targets_running()) { - ctrl_halt(); + d_halt(); }break; case D_CmdKind_SoftHaltRefresh: if(d_ctrl_targets_running()) { need_run = 1; run_kind = d_user_state->ctrl_last_run_kind; - run_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, d_user_state->ctrl_last_run_thread_handle); + run_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, d_user_state->ctrl_last_run_thread_handle); run_flags = d_user_state->ctrl_last_run_flags; run_traps = d_user_state->ctrl_last_run_traps; }break; case D_CmdKind_SetThreadIP: { - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); U64 vaddr = params->vaddr; - void *block = ctrl_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, thread->handle); + void *block = d_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, thread->handle); regs_arch_block_write_rip(thread->arch, block, vaddr); - B32 result = ctrl_thread_write_reg_block(thread->handle, block); + B32 result = d_thread_write_reg_block(thread->handle, block); (void)result; }break; @@ -1900,7 +1900,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Run: { - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_Continue, .machine = params->machine, .process = params->process, .thread = params->thread); @@ -1912,7 +1912,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Restart: { - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_KillAll); @@ -1922,7 +1922,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepInto: case D_CmdKind_StepOver: { - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count != 0) { D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto @@ -1961,24 +1961,24 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_FreezeLocalMachine: { D_MachineID machine_id = D_MachineID_Local; - d_cmd(D_CmdKind_FreezeMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero())); + d_cmd(D_CmdKind_FreezeMachine, .entity = d_handle_make(machine_id, dmn_handle_zero())); }break; case D_CmdKind_ThawLocalMachine: { D_MachineID machine_id = D_MachineID_Local; - d_cmd(D_CmdKind_ThawMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero())); + d_cmd(D_CmdKind_ThawMachine, .entity = d_handle_make(machine_id, dmn_handle_zero())); }break; case D_CmdKind_FreezeEntity: case D_CmdKind_ThawEntity: { B32 should_freeze = (cmd->kind == D_CmdKind_FreezeEntity); - D_Entity *root = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); - for(D_Entity *e = root; e != &d_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next) + D_Entity *root = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + for(D_Entity *e = root; e != &d_entity_nil; e = d_entity_rec_depth_first_pre(e, root).next) { if(e->kind == D_EntityKind_Thread) { e->is_frozen = should_freeze; - D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); msg->kind = (should_freeze ? D_MsgKind_FreezeThread : D_MsgKind_ThawThread); msg->entity = e->handle; } @@ -1987,7 +1987,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { need_run = 1; run_kind = d_user_state->ctrl_last_run_kind; - run_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, d_user_state->ctrl_last_run_thread_handle); + run_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, d_user_state->ctrl_last_run_thread_handle); run_flags = d_user_state->ctrl_last_run_flags; run_traps = d_user_state->ctrl_last_run_traps; } @@ -1996,13 +1996,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P //- rjf: entity decoration case D_CmdKind_SetEntityColor: { - D_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + D_Entity *entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); entity->rgba = params->rgba; }break; case D_CmdKind_SetEntityName: { - D_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); - ctrl_entity_equip_string(d_user_state->ctrl_entity_store, entity, params->string); + D_Entity *entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + d_entity_equip_string(d_user_state->ctrl_entity_store, entity, params->string); }break; //- rjf: attaching @@ -2011,7 +2011,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P U32 pid = params->pid; if(pid != 0) { - D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); msg->kind = D_MsgKind_Attach; msg->entity_id = pid; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); @@ -2028,9 +2028,9 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P } // rjf: push & fill run message - D_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs); + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); { - D_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, D_EntityKind_Process); + D_Entity *process = d_entity_ancestor_from_kind(run_thread, D_EntityKind_Process); msg->kind = (run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? D_MsgKind_Run : D_MsgKind_SingleStep; msg->run_flags = run_flags; msg->entity = run_thread->handle; @@ -2059,21 +2059,21 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P D_Breakpoint dst_bp = {0}; MemoryCopyStruct(&dst_bp, bp); dst_bp.file_path = n->string; - ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &dst_bp); + d_breakpoint_list_push(scratch.arena, &msg->user_bps, &dst_bp); } } // rjf: all other cases - just copy the breakpoint info else { - ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, bp); + d_breakpoint_list_push(scratch.arena, &msg->user_bps, bp); } } } } // rjf: copy run traps to scratch (needed, if run_traps can be `d_user_state->ctrl_last_run_traps`) - D_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps); + D_TrapList run_traps_copy = d_trap_list_copy(scratch.arena, &run_traps); D_BreakpointArray run_extra_bps_copy = d_breakpoint_array_copy(scratch.arena, &run_extra_bps); // rjf: store last run info @@ -2082,7 +2082,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P d_user_state->ctrl_last_run_frame_idx = d_frame_index(); d_user_state->ctrl_last_run_thread_handle = run_thread->handle; d_user_state->ctrl_last_run_flags = run_flags; - d_user_state->ctrl_last_run_traps = ctrl_trap_list_copy(d_user_state->ctrl_last_run_arena, &run_traps_copy); + d_user_state->ctrl_last_run_traps = d_trap_list_copy(d_user_state->ctrl_last_run_arena, &run_traps_copy); d_user_state->ctrl_last_run_extra_bps = d_breakpoint_array_copy(d_user_state->ctrl_last_run_arena, &run_extra_bps_copy); d_user_state->ctrl_is_running = 1; } @@ -2111,16 +2111,16 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // the next tick) // { - D_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_user_state->ctrl_msg_arena, &ctrl_msgs); - ctrl_msg_list_concat_in_place(&d_user_state->ctrl_msgs, &msgs_copy); + D_MsgList msgs_copy = d_msg_list_deep_copy(d_user_state->ctrl_msg_arena, &ctrl_msgs); + d_msg_list_concat_in_place(&d_user_state->ctrl_msgs, &msgs_copy); if(d_user_state->ctrl_msgs.count != 0) { if(!d_user_state->ctrl_soft_halt_issued && d_user_state->ctrl_thread_run_state) { d_user_state->ctrl_soft_halt_issued = 1; - ctrl_halt(); + d_halt(); } - if(ctrl_u2c_push_msgs(&d_user_state->ctrl_msgs, os_now_microseconds()+100)) + if(d_u2c_push_msgs(&d_user_state->ctrl_msgs, os_now_microseconds()+100)) { MemoryZeroStruct(&d_user_state->ctrl_msgs); arena_clear(d_user_state->ctrl_msg_arena); diff --git a/src/dbg_engine/generated/dbg_engine.meta.c b/src/dbg_engine/generated/dbg_engine.meta.c index 09d20976..12e147c8 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.c +++ b/src/dbg_engine/generated/dbg_engine.meta.c @@ -4,7 +4,7 @@ //- GENERATED CODE C_LINKAGE_BEGIN -String8 ctrl_entity_kind_code_name_table[12] = +String8 d_entity_kind_code_name_table[12] = { {0}, str8_lit_comp("root"), @@ -20,7 +20,7 @@ str8_lit_comp("breakpoint"), str8_lit_comp("address_range_annotation"), }; -String8 ctrl_entity_kind_display_string_table[12] = +String8 d_entity_kind_display_string_table[12] = { {0}, str8_lit_comp("Root"), @@ -36,7 +36,7 @@ str8_lit_comp("Breakpoint"), str8_lit_comp("AddressRangeAnnotation"), }; -U32 ctrl_exception_code_kind_code_table[38] = +U32 d_exception_code_kind_code_table[38] = { 0, 0x40010005, @@ -78,7 +78,7 @@ U32 ctrl_exception_code_kind_code_table[38] = 0x0000087a, }; -String8 ctrl_exception_code_kind_display_string_table[38] = +String8 d_exception_code_kind_display_string_table[38] = { {0}, str8_lit_comp("(Win32) Control-C"), @@ -120,7 +120,7 @@ str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), str8_lit_comp("(Win32) DirectX Debug Layer"), }; -String8 ctrl_exception_code_kind_lowercase_code_string_table[38] = +String8 d_exception_code_kind_lowercase_code_string_table[38] = { {0}, str8_lit_comp("win32_ctrl_c"), @@ -162,7 +162,7 @@ str8_lit_comp("win32_sanitizer_raw_access_violation"), str8_lit_comp("win32_directx_debug_layer"), }; -B8 ctrl_exception_code_kind_default_enable_table[38] = +B8 d_exception_code_kind_default_enable_table[38] = { 0, 1, diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index 5635d3e9..93d86b91 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -126,12 +126,12 @@ struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = {&DEV_updating_indicator, str8_lit_comp("updating_indicator")}, }; C_LINKAGE_BEGIN -extern String8 ctrl_entity_kind_code_name_table[12]; -extern String8 ctrl_entity_kind_display_string_table[12]; -extern U32 ctrl_exception_code_kind_code_table[38]; -extern String8 ctrl_exception_code_kind_display_string_table[38]; -extern String8 ctrl_exception_code_kind_lowercase_code_string_table[38]; -extern B8 ctrl_exception_code_kind_default_enable_table[38]; +extern String8 d_entity_kind_code_name_table[12]; +extern String8 d_entity_kind_display_string_table[12]; +extern U32 d_exception_code_kind_code_table[38]; +extern String8 d_exception_code_kind_display_string_table[38]; +extern String8 d_exception_code_kind_lowercase_code_string_table[38]; +extern B8 d_exception_code_kind_default_enable_table[38]; C_LINKAGE_END diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 246fe050..cea50704 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2683,7 +2683,7 @@ e_list_gather_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U //- rjf: read next offset, advance B32 read_stale = 0; - B32 read_good = ctrl_process_memory_read(process, r1u64(off + member_element_off, off + member_element_off + member_size), &read_stale, &next_off, 0); + B32 read_good = d_process_memory_read(process, r1u64(off + member_element_off, off + member_element_off + member_size), &read_stale, &next_off, 0); if(read_stale) { retry = 1; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index e0a46d04..5d13fd17 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -621,8 +621,8 @@ rd_color_from_ctrl_entity(D_Entity *entity) default:{}break; case D_EntityKind_Thread: { - D_Entity *process = ctrl_entity_ancestor_from_kind(entity, D_EntityKind_Process); - D_Entity *main_thread = ctrl_entity_child_from_kind(process, D_EntityKind_Thread); + D_Entity *process = d_entity_ancestor_from_kind(entity, D_EntityKind_Process); + D_Entity *main_thread = d_entity_child_from_kind(process, D_EntityKind_Thread); if(main_thread != entity) { result = ui_color_from_name(str8_lit("thread_1")); @@ -689,7 +689,7 @@ rd_ctrl_entity_from_eval_space(E_Space space) D_Handle handle; handle.machine_id = space.u64s[0]; handle.dmn_handle.u64[0] = space.u64s[1]; - entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); + entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); } return entity; } @@ -726,7 +726,7 @@ rd_eval_space_gen(E_Space space) { default: { - result = ctrl_eval_space_gen(space); + result = d_ctrl_eval_space_gen(space); }break; case RD_EvalSpaceKind_MetaCfg: case RD_EvalSpaceKind_MetaQuery: @@ -746,7 +746,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) { default: { - result = ctrl_eval_space_read(space, out, range); + result = d_ctrl_eval_space_read(space, out, range); }break; //- rjf: interior control entity reads (inside process address space or thread register block) @@ -758,7 +758,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) default:{}break; case D_EntityKind_Process: { - D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, range, 0, rd_state->frame_eval_memread_endt_us); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, range, 0, rd_state->frame_eval_memread_endt_us); String8 data = slice.data; if(data.size == dim_1u64(range)) { @@ -769,7 +769,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) case D_EntityKind_Thread: { Access *access = access_open(); - D_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, 1, rd_state->frame_eval_memread_endt_us); + D_CallStack call_stack = d_call_stack_from_thread(access, entity->handle, 1, rd_state->frame_eval_memread_endt_us); U64 concrete_frame_idx = e_interpret_ctx->reg_unwind_count; if(concrete_frame_idx < call_stack.concrete_frames_count) { @@ -935,7 +935,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) String8 read_data = {0}; if(child_key.size != 0) { - MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, ctrl_entity_kind_code_name_table[entity->kind]); + MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, d_entity_kind_code_name_table[entity->kind]); MD_Node *child_schema = &md_nil_node; for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next) { @@ -948,7 +948,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) } else if(str8_match(child_schema->string, str8_lit("dbg"), 0)) { - read_data = ctrl_entity_child_from_kind(entity, D_EntityKind_DebugInfoPath)->string; + read_data = d_entity_child_from_kind(entity, D_EntityKind_DebugInfoPath)->string; } else if(str8_match(child_schema->string, str8_lit("vaddr_range"), 0)) { @@ -960,7 +960,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) } else if(str8_match(child_schema->string, str8_lit("active"), 0)) { - B32 is_frozen = ctrl_entity_tree_is_frozen(entity); + B32 is_frozen = d_entity_tree_is_frozen(entity); B32 is_active = !is_frozen; read_data = push_str8_copy(scratch.arena, str8_struct(&is_active)); } @@ -998,7 +998,7 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) default:{}break; case D_EntityKind_Process: { - result = ctrl_process_write(entity->handle, range, in); + result = d_process_write(entity->handle, range, in); }break; case D_EntityKind_Thread: { @@ -1007,9 +1007,9 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 write_range = intersect_1u64(legal_range, range); U64 write_size = dim_1u64(write_range); - void *new_regs = ctrl_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, entity->handle); + void *new_regs = d_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, entity->handle); MemoryCopy((U8 *)new_regs + write_range.min, in, write_size); - result = ctrl_thread_write_reg_block(entity->handle, new_regs); + result = d_thread_write_reg_block(entity->handle, new_regs); scratch_end(scratch); }break; } @@ -1081,7 +1081,7 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) // rjf: perform write, based on child name in schema if(child_key.size != 0) { - MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, ctrl_entity_kind_code_name_table[entity->kind]); + MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, d_entity_kind_code_name_table[entity->kind]); MD_Node *child_schema = &md_nil_node; for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next) { @@ -1090,7 +1090,7 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) if(str8_match(child_schema->string, str8_lit("label"), 0)) { result = 1; - ctrl_entity_equip_string(d_user_state->ctrl_entity_store, entity, write_string); + d_entity_equip_string(d_user_state->ctrl_entity_store, entity, write_string); rd_cmd(D_CmdKind_SetEntityName, .ctrl_entity = entity->handle, .string = write_string); } else if(str8_match(child_schema->string, str8_lit("dbg"), 0)) @@ -1144,7 +1144,7 @@ rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated) D_Entity *entity = rd_ctrl_entity_from_eval_space(space); if(entity->kind == D_EntityKind_Process) { - result = ctrl_key_from_process_vaddr_range(entity->handle, range, zero_terminated, 0, 0, 0); + result = d_key_from_process_vaddr_range(entity->handle, range, zero_terminated, 0, 0, 0); } }break; } @@ -1703,7 +1703,7 @@ rd_view_ui(Rng2F32 rect) UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) { CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("target")); - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); //- rjf: icon & info UI_Padding(ui_em(2.f, 1.f)) UI_TagF("weak") @@ -2268,9 +2268,9 @@ rd_view_ui(Rng2F32 rect) { U64 vaddr = eval.value.u64; D_Entity *process = rd_ctrl_entity_from_eval_space(eval.space); - D_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); - dbgi_key = ctrl_dbgi_key_from_module(module); - voff = ctrl_voff_from_vaddr(module, vaddr); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + dbgi_key = d_dbgi_key_from_module(module); + voff = d_voff_from_vaddr(module, vaddr); } else { @@ -2361,10 +2361,10 @@ rd_view_ui(Rng2F32 rect) String8 name = {0}; { U64 vaddr = eval.value.u64; - D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); - D_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - U64 voff = ctrl_voff_from_vaddr(module, vaddr); + D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + U64 voff = d_voff_from_vaddr(module, vaddr); { Access *access = access_open(); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); @@ -2432,7 +2432,7 @@ rd_view_ui(Rng2F32 rect) case RD_EvalSpaceKind_MetaCtrlEntity: { D_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); - rd_cmd(RD_CmdKind_PushQuery, .expr = push_str8f(scratch.arena, "query:control.%S", ctrl_string_from_handle(scratch.arena, entity->handle))); + rd_cmd(RD_CmdKind_PushQuery, .expr = push_str8f(scratch.arena, "query:control.%S", d_string_from_handle(scratch.arena, entity->handle))); }break; } if(did_cmd) @@ -3644,7 +3644,7 @@ rd_view_ui(Rng2F32 rect) D_Entity *space_entity = rd_ctrl_entity_from_eval_space(cell->eval.space); if(cell->eval.space.kind == D_EvalSpaceKind_Entity && space_entity->kind == D_EntityKind_Process) { - D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, space_entity->handle, cell_vaddr_rng, 0, rd_state->frame_eval_memread_endt_us); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, space_entity->handle, cell_vaddr_rng, 0, rd_state->frame_eval_memread_endt_us); for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1) { if(slice.byte_changed_flags[idx] != 0) @@ -3719,7 +3719,7 @@ rd_view_ui(Rng2F32 rect) rgba.w *= ui_anim(ui_key_from_stringf(ui_key_zero(), "###cfg_hover_t_%p", cfg), 1.f, .rate = entity_hover_t_rate); cell_background_color_override = rgba; } - else if(ctrl_handle_match(cell_info.entity->handle, rd_get_hover_regs()->ctrl_entity) && + else if(d_handle_match(cell_info.entity->handle, rd_get_hover_regs()->ctrl_entity) && rd_state->hover_regs_slot == RD_RegSlot_CtrlEntity) { D_Entity *entity = cell_info.entity; @@ -3854,7 +3854,7 @@ rd_view_ui(Rng2F32 rect) { UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%I64x_%I64x", cell_id, row_hash); sig = ui_signal_from_box(box); - if(ctrl_handle_match(row_info->callstack_thread->handle, rd_base_regs()->thread) && + if(d_handle_match(row_info->callstack_thread->handle, rd_base_regs()->thread) && row_info->callstack_unwind_index == rd_base_regs()->unwind_count && row_info->callstack_inline_depth == rd_base_regs()->inline_depth) { @@ -4332,13 +4332,13 @@ rd_view_ui(Rng2F32 rect) else if(cell->eval.space.kind == D_EvalSpaceKind_Entity) { D_Entity *entity = rd_ctrl_entity_from_eval_space(cell->eval.space); - D_Entity *process = ctrl_process_from_entity(entity); + D_Entity *process = d_process_from_entity(entity); if(process != &d_entity_nil) { U64 vaddr = cell->eval.value.u64; - D_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - U64 voff = ctrl_voff_from_vaddr(module, vaddr); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + U64 voff = d_voff_from_vaddr(module, vaddr); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); String8 file_path = {0}; TxtPt pt = {0}; @@ -4737,10 +4737,10 @@ rd_arch_from_eval(E_Eval eval) { // rjf: try implicitly from either `eval` itself, or from context D_Entity *ctrl_entity = rd_ctrl_entity_from_eval_space(eval.space); - D_Entity *process = ctrl_process_from_entity(ctrl_entity); + D_Entity *process = d_process_from_entity(ctrl_entity); if(process == &d_entity_nil) { - process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); } Arch arch = process->arch; if(arch == Arch_Null) @@ -5498,11 +5498,11 @@ rd_window_frame(void) //////////////////////// //- rjf: control entity tooltips // - case RD_RegSlot_Machine: {ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->machine); }goto ctrl_entity_tooltip; - case RD_RegSlot_Process: {ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->process); }goto ctrl_entity_tooltip; - case RD_RegSlot_Module: {ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->module); }goto ctrl_entity_tooltip; - case RD_RegSlot_Thread: {ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->thread); }goto ctrl_entity_tooltip; - case RD_RegSlot_CtrlEntity:{ctrl_entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->ctrl_entity); }goto ctrl_entity_tooltip; + case RD_RegSlot_Machine: {ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->machine); }goto ctrl_entity_tooltip; + case RD_RegSlot_Process: {ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->process); }goto ctrl_entity_tooltip; + case RD_RegSlot_Module: {ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->module); }goto ctrl_entity_tooltip; + case RD_RegSlot_Thread: {ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->thread); }goto ctrl_entity_tooltip; + case RD_RegSlot_CtrlEntity:{ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->ctrl_entity); }goto ctrl_entity_tooltip; ctrl_entity_tooltip:; UI_Tooltip { @@ -5534,8 +5534,8 @@ rd_window_frame(void) if(ctrl_entity->kind == D_EntityKind_Module) UI_TagF("weak") { Access *access = access_open(); - D_Entity *dbg_info_entity = ctrl_entity_child_from_kind(ctrl_entity, D_EntityKind_DebugInfoPath); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(ctrl_entity); + D_Entity *dbg_info_entity = d_entity_child_from_kind(ctrl_entity, D_EntityKind_DebugInfoPath); + DI_Key dbgi_key = d_dbgi_key_from_module(ctrl_entity); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi->raw_data_size != 0) { @@ -5558,15 +5558,15 @@ rd_window_frame(void) Access *access = access_open(); Vec4F32 code_color = ui_color_from_name(str8_lit("code_default")); Vec4F32 symbol_color = ui_color_from_name(str8_lit("code_symbol")); - D_Entity *process = ctrl_entity_ancestor_from_kind(ctrl_entity, D_EntityKind_Process); - B32 call_stack_high_priority = ctrl_handle_match(ctrl_entity->handle, rd_base_regs()->thread); - D_CallStack call_stack = ctrl_call_stack_from_thread(access, ctrl_entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + D_Entity *process = d_entity_ancestor_from_kind(ctrl_entity, D_EntityKind_Process); + B32 call_stack_high_priority = d_handle_match(ctrl_entity->handle, rd_base_regs()->thread); + D_CallStack call_stack = d_call_stack_from_thread(access, ctrl_entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); if(call_stack.frames_count != 0) { ui_spacer(ui_em(1.5f, 1.f)); } EV_StringParams string_params = {EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = 16}; - String8 thread_handle_string = ctrl_string_from_handle(scratch.arena, ctrl_entity->handle); + String8 thread_handle_string = d_string_from_handle(scratch.arena, ctrl_entity->handle); for(U64 idx = 0; idx < 16; idx += 1) { E_Eval rip_eval = e_eval_from_stringf("query:control.%S.call_stack[%I64u]", thread_handle_string, idx); @@ -5767,8 +5767,8 @@ rd_window_frame(void) avg_ui_hash_chain_length = chain_length_sum / chain_count; } ui_labelf("Target Hz: %.2f", 1.f/rd_state->frame_dt); - ui_labelf("Ctrl Run Index: %I64u", ctrl_run_gen()); - ui_labelf("Ctrl Mem Gen Index: %I64u", ctrl_mem_gen()); + ui_labelf("Ctrl Run Index: %I64u", d_run_gen()); + ui_labelf("Ctrl Mem Gen Index: %I64u", d_mem_gen()); ui_labelf("Window %p", w); ui_set_next_pref_width(ui_children_sum(1)); ui_set_next_pref_height(ui_children_sum(1)); @@ -7037,7 +7037,7 @@ rd_window_frame(void) { Temp scratch = scratch_begin(0, 0); CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("target")); - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); B32 can_send_signal = !d_ctrl_targets_running(); typedef struct CenterButtonTask CenterButtonTask; struct CenterButtonTask @@ -9565,9 +9565,9 @@ rd_string_from_exception_code(U32 code) String8 string = {0}; for EachNonZeroEnumVal(D_ExceptionCodeKind, k) { - if(code == ctrl_exception_code_kind_code_table[k]) + if(code == d_exception_code_kind_code_table[k]) { - string = ctrl_exception_code_kind_display_string_table[k]; + string = d_exception_code_kind_display_string_table[k]; break; } } @@ -9577,7 +9577,7 @@ rd_string_from_exception_code(U32 code) internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event) { - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, event->entity); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, event->entity); DR_FStrList thread_fstrs = rd_title_fstrs_from_ctrl_entity(arena, thread, 0); DR_FStrList fstrs = {0}; DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit("text")), ui_top_font_size()}; @@ -11102,14 +11102,14 @@ rd_frame(void) //- rjf: unpack basic evaluation context // ProfBegin("unpack eval-dependent info"); - D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); Arch arch = thread->arch; U64 unwind_count = rd_regs()->unwind_count; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); - D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); - U64 tls_root_vaddr = ctrl_tls_root_vaddr_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); + U64 tls_root_vaddr = d_tls_root_vaddr_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); ProfEnd(); //////////////////////////// @@ -11132,7 +11132,7 @@ rd_frame(void) //////////////////////////// //- rjf: produce all eval modules // - D_EntityArray all_modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); + D_EntityArray all_modules = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); U64 eval_modules_count = Max(1, all_modules.count); E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &eval_modules[0]; @@ -11142,7 +11142,7 @@ rd_frame(void) for EachIndex(eval_module_idx, all_modules.count) { D_Entity *m = all_modules.v[eval_module_idx]; - DI_Key dbgi_key = ctrl_dbgi_key_from_module(m); + DI_Key dbgi_key = d_dbgi_key_from_module(m); // rjf: dbgi key -> eval dbg info num U32 dbg_info_num = 0; @@ -11163,7 +11163,7 @@ rd_frame(void) eval_modules[eval_module_idx].vaddr_range = m->vaddr_range; eval_modules[eval_module_idx].arch = m->arch; eval_modules[eval_module_idx].dbg_info_num = dbg_info_num; - eval_modules[eval_module_idx].space = rd_eval_space_from_ctrl_entity(ctrl_entity_ancestor_from_kind(m, D_EntityKind_Process), D_EvalSpaceKind_Entity); + eval_modules[eval_module_idx].space = rd_eval_space_from_ctrl_entity(d_entity_ancestor_from_kind(m, D_EntityKind_Process), D_EvalSpaceKind_Entity); if(module == m) { eval_modules_primary = &eval_modules[eval_module_idx]; @@ -11513,8 +11513,8 @@ rd_frame(void) for EachElement(idx, evallable_ctrl_names) { String8 name = evallable_ctrl_names[idx]; - D_EntityKind kind = ctrl_entity_kind_from_string(name); - D_EntityArray array = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); + D_EntityKind kind = d_entity_kind_from_string(name); + D_EntityArray array = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); for EachIndex(idx, array.count) { @@ -11532,15 +11532,15 @@ rd_frame(void) { e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("local_machine"), expr); } - if(kind == D_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle)) + if(kind == D_EntityKind_Thread && d_handle_match(rd_base_regs()->thread, entity->handle)) { e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_thread"), expr); } - if(kind == D_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle)) + if(kind == D_EntityKind_Process && d_handle_match(rd_base_regs()->process, entity->handle)) { e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_process"), expr); } - if(kind == D_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle)) + if(kind == D_EntityKind_Module && d_handle_match(rd_base_regs()->module, entity->handle)) { e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("current_module"), expr); } @@ -11880,13 +11880,13 @@ rd_frame(void) //- rjf: gather config from loaded modules // CFG_NodePtrList immediate_type_views = {0}; - D_EntityArray modules = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); + D_EntityArray modules = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); ProfScope("gather config from loaded modules") { for EachIndex(idx, modules.count) { D_Entity *module = modules.v[idx]; - String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle); + String8 raddbg_data = d_raddbg_data_from_module(scratch.arena, module->handle); U8 split_char = 0; String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); U64 cfg_idx = 0; @@ -11894,7 +11894,7 @@ rd_frame(void) { String8 text = text_n->string; CFG_NodePtrList cfgs = cfg_node_ptr_list_from_string(scratch.arena, rd_state->cfg, rd_state->cfg_schema_table, str8_zero(), text); - String8 module_name = ctrl_string_from_handle(scratch.arena, module->handle); + String8 module_name = d_string_from_handle(scratch.arena, module->handle); for(CFG_NodePtrNode *n = cfgs.first; n != 0; n = n->next, cfg_idx += 1) { CFG_Node *immediate_root = rd_immediate_cfg_from_keyf("module_%S_cfg_%I64x", module_name, cfg_idx); @@ -11984,8 +11984,8 @@ rd_frame(void) E_IRCtx *ir_ctx = push_array(scratch.arena, E_IRCtx, 1); { E_IRCtx *ctx = ir_ctx; - ctx->regs_map = ctrl_string2reg_from_arch(eval_base_ctx->primary_module->arch); - ctx->reg_alias_map = ctrl_string2alias_from_arch(eval_base_ctx->primary_module->arch); + ctx->regs_map = d_string2reg_from_arch(eval_base_ctx->primary_module->arch); + ctx->reg_alias_map = d_string2alias_from_arch(eval_base_ctx->primary_module->arch); ctx->locals_map = d_query_cached_locals_map_from_dbgi_key_voff(eval_base_ctx->primary_dbg_info->dbgi_key, rip_voff); ctx->member_map = d_query_cached_member_map_from_dbgi_key_voff(eval_base_ctx->primary_dbg_info->dbgi_key, rip_voff); ctx->macro_map = macro_map; @@ -12072,7 +12072,7 @@ rd_frame(void) case RD_CmdKind_Restart: { // rjf: reset hit counts - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count == 0 || kind == RD_CmdKind_Restart) { CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); @@ -12292,7 +12292,7 @@ rd_frame(void) { // rjf: if control processes are live, but this is not force-confirmed, then // get confirmation from user - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("lossy_exit_confirmation")); if(processes.count != 0 && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) { @@ -13679,19 +13679,19 @@ rd_frame(void) //- rjf: source <-> disasm case RD_CmdKind_GoToDisassembly: { - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); U64 vaddr = 0; for(D_LineNode *n = rd_regs()->lines.first; n != 0; n = n->next) { - D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); if(module != &d_entity_nil) { - vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); break; } } - rd_cmd(RD_CmdKind_FindCodeLocation, .process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process)->handle, .vaddr = vaddr, .prefer_disasm = 1); + rd_cmd(RD_CmdKind_FindCodeLocation, .process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process)->handle, .vaddr = vaddr, .prefer_disasm = 1); }break; case RD_CmdKind_GoToSource: { @@ -13701,7 +13701,7 @@ rd_frame(void) .file_path = rd_regs()->lines.first->v.file_path, .cursor = rd_regs()->lines.first->v.pt, .vaddr = 0, - .process = ctrl_handle_zero(), + .process = d_handle_zero(), .prefer_disasm = 0); } }break; @@ -13967,15 +13967,15 @@ rd_frame(void) Access *access = access_open(); //- rjf: unpack thread info - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); U64 unwind_index = rd_regs()->unwind_count; U64 inline_depth = rd_regs()->inline_depth; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_index); - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, rip_voff); D_Line line = {0}; { @@ -14031,7 +14031,7 @@ rd_frame(void) }break; case RD_CmdKind_FindSelectedThread: { - D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); rd_cmd(RD_CmdKind_FindThread, .thread = selected_thread->handle, .unwind_count = rd_base_regs()->unwind_count, @@ -14140,9 +14140,9 @@ rd_frame(void) { D_Entity *process = &d_entity_nil; U64 vaddr = 0; - D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, voff_dbgi_key); - D_Entity *module = ctrl_entity_list_first(&modules); - process = ctrl_entity_ancestor_from_kind(module, D_EntityKind_Process); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, voff_dbgi_key); + D_Entity *module = d_entity_list_first(&modules); + process = d_entity_ancestor_from_kind(module, D_EntityKind_Process); if(process != &d_entity_nil) { vaddr = module->vaddr_range.min + lines.first->v.voff_range.min; @@ -14220,8 +14220,8 @@ rd_frame(void) { file_path = rd_mapped_from_file_path(scratch.arena, rd_regs()->file_path); point = rd_regs()->cursor; - thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); vaddr = rd_regs()->vaddr; prefer_new_tab = rd_regs()->prefer_new_tab; if(file_path.size == 0) @@ -14237,9 +14237,9 @@ rd_frame(void) D_LineList lines = d_lines_from_file_path_line_num(scratch.arena, file_path, point.line); for(D_LineNode *n = lines.first; n != 0; n = n->next) { - D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); - vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); break; } } @@ -15441,7 +15441,7 @@ rd_frame(void) }break; case RD_CmdKind_SetNextStatement: { - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); String8 file_path = rd_regs()->file_path; U64 new_rip_vaddr = rd_regs()->vaddr_range.min; if(file_path.size != 0) @@ -15449,11 +15449,11 @@ rd_frame(void) D_LineList *lines = &rd_regs()->lines; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); if(module != &d_entity_nil) { - new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + new_rip_vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); break; } } @@ -15566,10 +15566,10 @@ rd_frame(void) }break; case RD_CmdKind_SelectThread: { - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = ctrl_module_from_process_vaddr(process, ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle)); - D_Entity *machine = ctrl_entity_ancestor_from_kind(process, D_EntityKind_Machine); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle)); + D_Entity *machine = d_entity_ancestor_from_kind(process, D_EntityKind_Machine); rd_state->base_regs.v.unwind_count = 0; rd_state->base_regs.v.inline_depth = 0; rd_state->base_regs.v.thread = thread->handle; @@ -15581,12 +15581,12 @@ rd_frame(void) case RD_CmdKind_SelectUnwind: { Access *access = access_open(); - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - D_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); - D_CallStackFrame *frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStackFrame *frame = d_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); if(frame == 0) { - frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, 0); + frame = d_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, 0); } if(frame) { @@ -15600,9 +15600,9 @@ rd_frame(void) case RD_CmdKind_DownOneFrame: { Access *access = access_open(); - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - D_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); - D_CallStackFrame *current_frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStackFrame *current_frame = d_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); D_CallStackFrame *next_frame = current_frame; if(current_frame != 0) switch(kind) { @@ -16304,7 +16304,7 @@ rd_frame(void) { for EachNonZeroEnumVal(D_ExceptionCodeKind, k) { - String8 name = ctrl_exception_code_kind_lowercase_code_string_table[k]; + String8 name = d_exception_code_kind_lowercase_code_string_table[k]; B32 setting = rd_setting_b32_from_name(name); if(setting) { @@ -16331,8 +16331,8 @@ rd_frame(void) default:{}break; case D_EventKind_NewModule: { - D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); - D_Entity *debug_info_path = ctrl_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); + D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); + D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); String8 new_path = debug_info_path->string; if(new_path.size != 0 && os_file_path_exists(new_path)) { @@ -16369,7 +16369,7 @@ rd_frame(void) case D_EventKind_EndProc: if(rd_state->quit_after_success) { - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(evt->u64_code == 0 && processes.count == 0) { rd_cmd(RD_CmdKind_Exit); @@ -16382,12 +16382,12 @@ rd_frame(void) case D_EventKind_Stopped: { B32 need_refocus = (evt->cause != D_EventCause_InterruptedByHalt || !soft_halt_issued); - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); U64 vaddr = evt->rip_vaddr; - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = ctrl_module_from_process_vaddr(process, vaddr); - U64 voff = ctrl_voff_from_vaddr(module, vaddr); - U64 test_cached_vaddr = ctrl_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + U64 voff = d_voff_from_vaddr(module, vaddr); + U64 test_cached_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); // rjf: valid stop thread? -> select & snap if(need_refocus && thread != &d_entity_nil && evt->cause != D_EventCause_InterruptedByHalt) @@ -16396,7 +16396,7 @@ rd_frame(void) } // rjf: no stop-causing thread, but have selected thread? -> snap to selected - D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); if(need_refocus && (evt->cause == D_EventCause_InterruptedByHalt || thread == &d_entity_nil) && selected_thread != &d_entity_nil) { rd_cmd(RD_CmdKind_SelectThread, .thread = selected_thread->handle); @@ -16405,8 +16405,8 @@ rd_frame(void) // rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread if(need_refocus && thread == &d_entity_nil && selected_thread == &d_entity_nil) { - D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); - D_Entity *first_available_thread = ctrl_entity_array_first(&threads); + D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_Entity *first_available_thread = d_entity_array_first(&threads); rd_cmd(RD_CmdKind_SelectThread, .thread = first_available_thread->handle); } @@ -16469,7 +16469,7 @@ rd_frame(void) ////////////////////////////// //- rjf: retry find-thread // - if(!ctrl_handle_match(ctrl_handle_zero(), find_thread_retry)) + if(!d_handle_match(d_handle_zero(), find_thread_retry)) { rd_cmd(RD_CmdKind_FindThread, .thread = find_thread_retry); } diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 91c4fe58..710b5bbd 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -205,7 +205,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals) E_TYPE_EXPAND_INFO_FUNCTION_DEF(registers) { Temp scratch = scratch_begin(&arena, 1); - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); Arch arch = thread->arch; U64 reg_count = regs_reg_code_count_from_arch(arch); String8 *reg_strings = regs_reg_code_string_table_from_arch(arch); @@ -309,7 +309,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) } else if(entity != &d_entity_nil && str8_match(child_schema->string, str8_lit("dbg"), 0)) { - D_Entity *dbg = ctrl_entity_child_from_kind(entity, D_EntityKind_DebugInfoPath); + D_Entity *dbg = d_entity_child_from_kind(entity, D_EntityKind_DebugInfoPath); child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), dbg->string.size, type_flags|E_TypeFlag_IsPathText); } @@ -658,11 +658,11 @@ E_TYPE_ACCESS_FUNCTION_DEF(control) if(rhs->kind == E_ExprKind_LeafIdentifier && str8_match(str8_prefix(rhs->string, 1), str8_lit("$"), 0)) { - D_Handle handle = ctrl_handle_from_string(rhs->string); - D_Entity *entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); + D_Handle handle = d_handle_from_string(rhs->string); + D_Entity *entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0)); - result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ctrl_entity_kind_code_name_table[entity->kind]); + result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, d_entity_kind_code_name_table[entity->kind]); result.mode = E_Mode_Offset; } return result; @@ -957,10 +957,10 @@ E_TYPE_IREXT_FUNCTION_DEF(call_stack) D_Entity *entity = rd_ctrl_entity_from_eval_space(interp.space); if(entity->kind == D_EntityKind_Thread) { - B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread); + B32 call_stack_high_priority = d_handle_match(entity->handle, rd_base_regs()->thread); accel->arch = entity->arch; - accel->process = ctrl_process_from_entity(entity)->handle; - accel->call_stack = ctrl_call_stack_from_thread(rd_state->frame_access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + accel->process = d_process_from_entity(entity)->handle; + accel->call_stack = d_call_stack_from_thread(rd_state->frame_access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); } scratch_end(scratch); } @@ -978,7 +978,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(call_stack) D_CallStack *call_stack = &accel->call_stack; if(0 <= rhs_value.u64 && rhs_value.u64 < call_stack->frames_count) { - D_Entity *process = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, accel->process); + D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, accel->process); D_CallStackFrame *f = &call_stack->frames[rhs_value.u64]; result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity), e_irtree_const_u(arena, regs_rip_from_arch_block(accel->arch, f->regs))); result.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth); @@ -1438,7 +1438,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes) } else { - machines = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Machine); + machines = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Machine); } //- rjf: gather system processes from this machine @@ -1516,7 +1516,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(unattached_processes) for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1) { D_Entity *machine = accel->machines[idx]; - String8 string = ctrl_string_from_handle(arena, machine->handle); + String8 string = d_string_from_handle(arena, machine->handle); evals_out[out_idx] = e_eval_wrapf(eval, "query:control.%S.unattached_processes.$%I64x$%I64x", string, accel->infos[idx].pid, e_id_from_string(accel->infos[idx].name)); } } @@ -1534,16 +1534,16 @@ E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities) case E_ExprKind_MemberAccess: { String8 rhs_name = expr->first->next->string; - D_Handle handle = ctrl_handle_from_string(rhs_name); - entity = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); + D_Handle handle = d_handle_from_string(rhs_name); + entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); }break; case E_ExprKind_ArrayIndex: { E_Type *type = e_type_from_key(lhs_irtree->type_key); - D_EntityKind kind = ctrl_entity_kind_from_string(rd_singular_from_code_name_plural(type->name)); + D_EntityKind kind = d_entity_kind_from_string(rd_singular_from_code_name_plural(type->name)); E_Value rhs_value = e_value_from_expr(expr->first->next); U64 rhs_idx = rhs_value.u64; - D_EntityArray entities = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); + D_EntityArray entities = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); if(0 <= rhs_idx && rhs_idx < entities.count) { entity = entities.v[rhs_idx]; @@ -1553,7 +1553,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities) if(entity != &d_entity_nil) { E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); - String8 name = ctrl_entity_kind_code_name_table[entity->kind]; + String8 name = d_entity_kind_code_name_table[entity->kind]; E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0)); result.type_key = type_key; @@ -1579,13 +1579,13 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) E_TypeKey lhs_type_key = eval.irtree.type_key; E_Type *lhs_type = e_type_from_key(lhs_type_key); String8 name = rd_singular_from_code_name_plural(lhs_type->name); - D_EntityKind entity_kind = ctrl_entity_kind_from_string(name); + D_EntityKind entity_kind = d_entity_kind_from_string(name); //- rjf: gather array of all entities which fit the bill D_EntityArray array = {0}; if(scoping_entity == &d_entity_nil) { - array = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, entity_kind); + array = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, entity_kind); } else { @@ -1594,10 +1594,10 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) { if(child->kind == entity_kind) { - ctrl_entity_list_push(scratch.arena, &list, child); + d_entity_list_push(scratch.arena, &list, child); } } - array = ctrl_entity_array_from_list(arena, &list); + array = d_entity_array_from_list(arena, &list); } //- rjf: filter the array @@ -1613,10 +1613,10 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, title_string); if(matches.count == matches.needle_part_count) { - ctrl_entity_list_push(scratch.arena, &list__filtered, entity); + d_entity_list_push(scratch.arena, &list__filtered, entity); } } - array__filtered = ctrl_entity_array_from_list(arena, &list__filtered); + array__filtered = d_entity_array_from_list(arena, &list__filtered); } //- rjf: list -> array & fill @@ -1639,7 +1639,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(ctrl_entities) { Temp scratch = scratch_begin(&arena, 1); D_Entity *entity = entities->v[out_idx + read_range.min]; - evals_out[out_idx] = e_eval_from_stringf("query:control.%S", ctrl_string_from_handle(scratch.arena, entity->handle)); + evals_out[out_idx] = e_eval_from_stringf("query:control.%S", d_string_from_handle(scratch.arena, entity->handle)); scratch_end(scratch); } } @@ -1675,7 +1675,7 @@ struct RD_CallStackTreeExpandAccel E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack_tree) { Access *access = access_open(); - D_CallStackTree call_stack_tree = ctrl_call_stack_tree(access, 0); + D_CallStackTree call_stack_tree = d_call_stack_tree(access, 0); access_close(access); RD_CallStackTreeExpandAccel *accel = push_array(arena, RD_CallStackTreeExpandAccel, 1); accel->node = &d_call_stack_tree_node_nil; @@ -1703,7 +1703,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack_tree) accel->children[idx] = n; } } - accel->threads = ctrl_handle_array_from_list(arena, &accel->node->threads); + accel->threads = d_handle_array_from_list(arena, &accel->node->threads); E_TypeExpandInfo result = {accel}; result.expr_count = accel->node->child_count + accel->threads.count; return result; @@ -1724,7 +1724,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(call_stack_tree) } else if(node->child_count <= idx && idx < node->child_count + accel->threads.count) { - eval = e_eval_from_stringf("query:control.%S", ctrl_string_from_handle(scratch.arena, accel->threads.v[idx - node->child_count])); + eval = e_eval_from_stringf("query:control.%S", d_string_from_handle(scratch.arena, accel->threads.v[idx - node->child_count])); } evals_out[idx] = eval; } diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 7c3aa432..ed4e2576 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -545,7 +545,7 @@ entry_point(CmdLine *cmd_line) r_init(cmd_line); fnt_init(); rd_init(cmd_line); - ctrl_set_wakeup_hook(wakeup_hook_ctrl); + d_set_wakeup_hook(wakeup_hook_ctrl); } //- rjf: set up shared resources for ipc to this instance; launch IPC signaler thread diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index aaa7d91f..fb3fe45e 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -44,8 +44,8 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla F32 scroll_bar_dim = floor_f32(main_font_size*1.5f); Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); B32 do_line_numbers = rd_setting_b32_from_name(str8_lit("show_line_numbers")); ////////////////////////////// @@ -277,19 +277,19 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: find live threads mapping to source code if(!dasm_lines) ProfScope("find live threads mapping to this file") { - D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); for EachIndex(idx, threads.count) { D_Entity *thread = threads.v[idx]; - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 inline_depth = (thread == selected_thread) ? rd_regs()->inline_depth : 0; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); U64 last_inst_on_unwound_rip_vaddr = rip_vaddr - !!unwind_count; - D_Entity *module = ctrl_module_from_process_vaddr(process, last_inst_on_unwound_rip_vaddr); - U64 rip_voff = ctrl_voff_from_vaddr(module, last_inst_on_unwound_rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_Entity *module = d_module_from_process_vaddr(process, last_inst_on_unwound_rip_vaddr); + U64 rip_voff = d_voff_from_vaddr(module, last_inst_on_unwound_rip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, rip_voff); for(D_LineNode *n = lines.first; n != 0; n = n->next) { @@ -302,7 +302,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla if(path_match_normalized(n->v.file_path, override_n->string)) { U64 slice_line_idx = n->v.pt.line-visible_line_num_range.min; - ctrl_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); + d_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); break; } } @@ -340,8 +340,8 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla if(!dasm_lines) ProfScope("find all src -> dasm info for source code") { String8 file_path = rd_regs()->file_path; - D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + DI_Key dbgi_key = d_dbgi_key_from_module(module); D_LineListArray lines_array = d_lines_array_from_dbgi_key_file_path_line_range(scratch.arena, dbgi_key, file_path, visible_line_num_range); if(lines_array.count != 0) { @@ -353,21 +353,21 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: find live threads mapping to disasm if(dasm_lines) ProfScope("find live threads mapping to this disassembly") { - D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - D_EntityArray threads = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); for EachIndex(idx, threads.count) { D_Entity *thread = threads.v[idx]; U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); - if(ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) + if(d_entity_ancestor_from_kind(thread, D_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) { U64 rip_off = rip_vaddr - dasm_vaddr_range.min; S64 line_num = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, rip_off)+1; if(contains_1s64(visible_line_num_range, line_num)) { U64 slice_line_idx = (line_num-visible_line_num_range.min); - ctrl_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); + d_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); } } } @@ -422,12 +422,12 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: fill dasm -> src info if(dasm_lines) { - D_Entity *module = ctrl_module_from_process_vaddr(process, dasm_vaddr_range.min); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_Entity *module = d_module_from_process_vaddr(process, dasm_vaddr_range.min); + DI_Key dbgi_key = d_dbgi_key_from_module(module); for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1) { U64 vaddr = dasm_vaddr_range.min + dasm_line_array_code_off_from_idx(dasm_lines, line_num-1); - U64 voff = ctrl_voff_from_vaddr(module, vaddr); + U64 voff = d_voff_from_vaddr(module, vaddr); U64 slice_idx = line_num-visible_line_num_range.min; code_slice_params.line_vaddrs[slice_idx] = vaddr; code_slice_params.line_infos[slice_idx] = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); @@ -977,7 +977,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) } if(evalled_entity != &d_entity_nil) { - String8 top_level_name = ctrl_entity_kind_code_name_table[evalled_entity->kind]; + String8 top_level_name = d_entity_kind_code_name_table[evalled_entity->kind]; E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, top_level_name); is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key)); } @@ -1002,13 +1002,13 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) case D_EntityKind_Process: if(row->eval.irtree.mode == E_Mode_Offset) { - info.module = ctrl_module_from_process_vaddr(row_ctrl_entity, row->eval.value.u64); + info.module = d_module_from_process_vaddr(row_ctrl_entity, row->eval.value.u64); }break; case D_EntityKind_Thread: if(row->eval.irtree.mode == E_Mode_Value) { - D_Entity *process = ctrl_process_from_entity(row_ctrl_entity); - info.module = ctrl_module_from_process_vaddr(process, d_query_cached_rip_from_thread(row_ctrl_entity)); + D_Entity *process = d_process_from_entity(row_ctrl_entity); + info.module = d_module_from_process_vaddr(process, d_query_cached_rip_from_thread(row_ctrl_entity)); }break; } } @@ -1024,8 +1024,8 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) Access *access = access_open(); info.callstack_thread = entity; U64 frame_num = ev_block_num_from_id(block, key.child_id); - B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread); - D_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + B32 call_stack_high_priority = d_handle_match(entity->handle, rd_base_regs()->thread); + D_CallStack call_stack = d_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); if(1 <= frame_num && frame_num <= call_stack.frames_count) { D_CallStackFrame *f = &call_stack.frames[frame_num-1]; @@ -1313,7 +1313,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) if(entity->kind == D_EntityKind_Thread) { RD_CmdKind cmd_kind = RD_CmdKind_SelectEntity; - if(ctrl_handle_match(entity->handle, rd_base_regs()->thread)) + if(d_handle_match(entity->handle, rd_base_regs()->thread)) { cmd_kind = RD_CmdKind_DeselectEntity; } @@ -1408,9 +1408,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) else if(info.callstack_thread != &d_entity_nil) { info.cell_style_key = str8_lit("call_stack_frame"); - D_Entity *process = ctrl_process_from_entity(info.callstack_thread); - D_Entity *module = ctrl_module_from_process_vaddr(process, info.callstack_vaddr); - E_Eval module_eval = e_eval_from_stringf("query:control.%S", ctrl_string_from_handle(scratch.arena, module->handle)); + D_Entity *process = d_process_from_entity(info.callstack_thread); + D_Entity *module = d_module_from_process_vaddr(process, info.callstack_vaddr); + E_Eval module_eval = e_eval_from_stringf("query:control.%S", d_string_from_handle(scratch.arena, module->handle)); CFG_Node *view = cfg_node_from_id(rd_regs()->view); CFG_Node *style = cfg_node_child_from_string(view, info.cell_style_key); CFG_Node *w_cfg = style->first; @@ -2099,8 +2099,8 @@ RD_VIEW_UI_FUNCTION_DEF(text) if(rd_regs()->lang_kind == TXT_LangKind_Null) { Access *access = access_open(); - D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi != &rdi_parsed_nil) { @@ -2223,8 +2223,8 @@ RD_VIEW_UI_FUNCTION_DEF(text) // if(rd_regs()->file_path.size != 0) { - D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + DI_Key dbgi_key = d_dbgi_key_from_module(module); rd_regs()->lines = d_lines_from_dbgi_key_file_path_line_num(rd_frame_arena(), dbgi_key, rd_regs()->file_path, rd_regs()->cursor.line); } @@ -2430,16 +2430,16 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) E_Space auto_space = {0}; if(eval.expr == &e_expr_nil) { - if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == ctrl_run_gen()) + if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == d_run_gen()) { auto_selected = 1; - auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, dv->temp_look_process), D_EvalSpaceKind_Entity); + auto_space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, dv->temp_look_process), D_EvalSpaceKind_Entity); eval = e_eval_from_stringf("(0x%I64x & (~(0x4000 - 1)))", dv->temp_look_vaddr); } else { auto_selected = 1; - auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), D_EvalSpaceKind_Entity); + auto_space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), D_EvalSpaceKind_Entity); eval = e_eval_from_stringf("(reg:rip & (~(0x4000 - 1)))"); } } @@ -2468,7 +2468,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) { dv->temp_look_process = cmd->regs->process; dv->temp_look_vaddr = cmd->regs->vaddr; - dv->temp_look_run_gen = ctrl_run_gen(); + dv->temp_look_run_gen = d_run_gen(); dv->goto_vaddr = cmd->regs->vaddr; }break; } @@ -2494,8 +2494,8 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) case D_EntityKind_Process: { if(arch == Arch_Null) { arch = space_entity->arch; } - dasm_module = ctrl_module_from_process_vaddr(space_entity, range.min); - dbgi_key = ctrl_dbgi_key_from_module(dasm_module); + dasm_module = d_module_from_process_vaddr(space_entity, range.min); + dbgi_key = d_dbgi_key_from_module(dasm_module); base_vaddr = dasm_module->vaddr_range.min; }break; } @@ -2584,7 +2584,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) rd_regs()->prefer_disasm = 1; rd_regs()->vaddr = range.min+off; rd_regs()->vaddr_range = r1u64(range.min+off, range.min+off); - rd_regs()->voff_range = ctrl_voff_range_from_vaddr_range(dasm_module, rd_regs()->vaddr_range); + rd_regs()->voff_range = d_voff_range_from_vaddr_range(dasm_module, rd_regs()->vaddr_range); rd_regs()->lines = d_lines_from_dbgi_key_voff(rd_frame_arena(), dbgi_key, rd_regs()->voff_range.min); } @@ -2680,7 +2680,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Rng1U64 view_range = rd_space_range_from_eval(eval); if(eval.space.kind == 0) { - eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), D_EvalSpaceKind_Entity); + eval.space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), D_EvalSpaceKind_Entity); view_range = rd_whole_range_from_eval_space(eval.space); } @@ -3223,7 +3223,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) D_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); if(entity->kind == D_EntityKind_Process) { - D_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, viz_range_bytes, 0, 0); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, viz_range_bytes, 0, 0); visible_memory_change_flags = slice.byte_changed_flags; visible_memory_bad_flags = slice.byte_bad_flags; } @@ -3258,9 +3258,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) AnnotationList *visible_memory_annotations = push_array(scratch.arena, AnnotationList, visible_memory_size); { Access *access = access_open(); - D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - D_Entity *selected_process = ctrl_entity_ancestor_from_kind(selected_thread, D_EntityKind_Process); - D_CallStack selected_call_stack = ctrl_call_stack_from_thread(access, selected_thread->handle, 1, 0); + D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *selected_process = d_entity_ancestor_from_kind(selected_thread, D_EntityKind_Process); + D_CallStack selected_call_stack = d_call_stack_from_thread(access, selected_thread->handle, 1, 0); D_Entity *eval_process = &d_entity_nil; if(eval.space.kind == D_EvalSpaceKind_Entity) { @@ -3309,9 +3309,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Access *access = access_open(); U64 f_rip_vaddr = last_rip; last_rip = regs_rip_from_arch_block(selected_thread->arch, f->regs); - D_Entity *module = ctrl_module_from_process_vaddr(selected_process, f_rip_vaddr); - U64 f_rip_voff = ctrl_voff_from_vaddr(module, f_rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + D_Entity *module = d_module_from_process_vaddr(selected_process, f_rip_vaddr); + U64 f_rip_voff = d_voff_from_vaddr(module, f_rip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, f_rip_voff); String8 procedure_name = {0}; @@ -3352,11 +3352,11 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { next_vaddr = vaddr+1; Access *access = access_open(); - D_Entity *module = ctrl_module_from_process_vaddr(eval_process, vaddr); + D_Entity *module = d_module_from_process_vaddr(eval_process, vaddr); if(module != &d_entity_nil) { - U64 voff = ctrl_voff_from_vaddr(module, vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + U64 voff = d_voff_from_vaddr(module, vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); RDI_Scope *root_scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx); @@ -3364,7 +3364,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { Rng1U64 voff_range = r1u64(rdi_first_voff_from_scope(rdi, root_scope), rdi_opl_voff_from_scope(rdi, root_scope)); - Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range); + Rng1U64 vaddr_range = d_vaddr_range_from_voff_range(module, voff_range); next_vaddr = vaddr_range.max; next_vaddr = Max(next_vaddr, vaddr+1); Rng1U64 vaddr_range_in_visible = intersect_1u64(vaddr_range, viz_range_bytes); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 586d2964..666effcb 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -108,7 +108,7 @@ rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras) CFG_Node *bp = cfg_node_from_id(stop_event.u64_code); if(bp == cfg) { - D_Entity *thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); Vec4F32 thread_color = rd_color_from_ctrl_entity(thread); if(thread_color.w == 0) { @@ -487,7 +487,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr if((entity->kind == D_EntityKind_Machine || entity->kind == D_EntityKind_Process || entity->kind == D_EntityKind_Thread) && - ctrl_entity_tree_is_frozen(entity)) + d_entity_tree_is_frozen(entity)) UI_TagF("bad") { dr_fstrs_push_new(arena, &result, ¶ms, rd_icon_kind_text_table[RD_IconKind_Locked], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = ui_color_from_name(str8_lit("text"))); @@ -497,7 +497,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr //- rjf: push selected icon, if selected thread if(entity->kind == D_EntityKind_Thread) { - B32 is_selected = ctrl_handle_match(entity->handle, rd_base_regs()->thread); + B32 is_selected = d_handle_match(entity->handle, rd_base_regs()->thread); if(is_selected) { dr_fstrs_push_new(arena, &result, ¶ms, rd_icon_kind_text_table[RD_IconKind_RightArrow], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = color); @@ -509,10 +509,10 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr if(entity->kind == D_EntityKind_Thread || entity->kind == D_EntityKind_Module) { - D_EntityArray processes = ctrl_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(processes.count > 1) { - D_Entity *process = ctrl_entity_ancestor_from_kind(entity, D_EntityKind_Process); + D_Entity *process = d_entity_ancestor_from_kind(entity, D_EntityKind_Process); String8 process_name = rd_name_from_ctrl_entity(arena, process); Vec4F32 process_color = rd_color_from_ctrl_entity(process); if(process_color.w == 0) @@ -548,10 +548,10 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr Vec4F32 symbol_color = ui_color_from_name(str8_lit("code_symbol")); dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); Access *access = access_open(); - D_Entity *process = ctrl_entity_ancestor_from_kind(entity, D_EntityKind_Process); + D_Entity *process = d_entity_ancestor_from_kind(entity, D_EntityKind_Process); Arch arch = entity->arch; - B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread); - D_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + B32 call_stack_high_priority = d_handle_match(entity->handle, rd_base_regs()->thread); + D_CallStack call_stack = d_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); B32 did_first_known = 0; for(U64 idx = 0, limit = 10; idx < call_stack.frames_count && idx < limit; @@ -559,11 +559,11 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr { D_CallStackFrame *f = &call_stack.frames[call_stack.frames_count - 1 - idx]; U64 rip_vaddr = regs_rip_from_arch_block(arch, f->regs); - D_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); + D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); + U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); String8 name = {0}; { - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi != &rdi_parsed_nil) { @@ -597,7 +597,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr if(entity->kind == D_EntityKind_Module && include_extras) { Access *access = access_open(); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(entity); + DI_Key dbgi_key = d_dbgi_key_from_module(entity); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi->raw_data_size == 0) { @@ -1254,12 +1254,12 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe RD_CodeSliceSignal result = {0}; ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - D_Entity *selected_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - D_Entity *selected_thread_process = ctrl_entity_ancestor_from_kind(selected_thread, D_EntityKind_Process); + D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *selected_thread_process = d_entity_ancestor_from_kind(selected_thread, D_EntityKind_Process); U64 selected_thread_rip_unwind_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count); - D_Entity *selected_thread_module = ctrl_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); + D_Entity *selected_thread_module = d_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); D_Event stop_event = d_ctrl_last_stop_event(); - D_Entity *stopper_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); + D_Entity *stopper_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); B32 is_focused = ui_is_focus_active(); B32 ctrlified = (os_get_modifiers() & OS_Modifier_Ctrl); Vec4F32 code_line_bgs[] = @@ -1336,7 +1336,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(rd_state->drag_drop_regs_slot == RD_RegSlot_Thread) { drop_can_hit_lines = 1; - drop_thread = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_state->drag_drop_regs->thread); + drop_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_state->drag_drop_regs->thread); drop_color = rd_color_from_ctrl_entity(drop_thread); if(drop_color.w == 0) { @@ -1420,10 +1420,10 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + U64 thread_rip_voff = d_voff_from_vaddr(module, thread_rip_vaddr); // rjf: thread info => color Vec4F32 color = rd_color_from_ctrl_entity(thread); @@ -1473,7 +1473,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: custom draw { RD_Regs *hover_regs = rd_get_hover_regs(); - B32 is_hovering = (ctrl_handle_match(hover_regs->ctrl_entity, thread->handle) && + B32 is_hovering = (d_handle_match(hover_regs->ctrl_entity, thread->handle) && rd_state->hover_regs_slot == RD_RegSlot_CtrlEntity); RD_ThreadBoxDrawExtData *u = push_array(ui_build_arena(), RD_ThreadBoxDrawExtData, 1); u->thread_color = color; @@ -1520,7 +1520,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { rd_cmd(RD_CmdKind_PushQuery, .ui_key = thread_box->key, - .expr = push_str8f(scratch.arena, "query:control.%S", ctrl_string_from_handle(scratch.arena, thread->handle))); + .expr = push_str8f(scratch.arena, "query:control.%S", d_string_from_handle(scratch.arena, thread->handle))); } if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse())) { @@ -1576,10 +1576,10 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); - D_Entity *process = ctrl_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + U64 thread_rip_voff = d_voff_from_vaddr(module, thread_rip_vaddr); // rjf: thread info => color Vec4F32 color = rd_color_from_ctrl_entity(thread); @@ -1629,7 +1629,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: custom draw { RD_Regs *hover_regs = rd_get_hover_regs(); - B32 is_hovering = (ctrl_handle_match(hover_regs->ctrl_entity, thread->handle) && + B32 is_hovering = (d_handle_match(hover_regs->ctrl_entity, thread->handle) && rd_state->hover_regs_slot == RD_RegSlot_CtrlEntity); RD_ThreadBoxDrawExtData *u = push_array(ui_build_arena(), RD_ThreadBoxDrawExtData, 1); u->thread_color = color; @@ -1674,7 +1674,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { rd_cmd(RD_CmdKind_PushQuery, .ui_key = thread_box->key, - .expr = push_str8f(scratch.arena, "query:control.%S", ctrl_string_from_handle(scratch.arena, thread->handle))); + .expr = push_str8f(scratch.arena, "query:control.%S", d_string_from_handle(scratch.arena, thread->handle))); } if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse())) { @@ -2272,11 +2272,11 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe D_LineList *lines = ¶ms->line_infos[line_idx]; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - D_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = ctrl_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); if(module != &d_entity_nil) { - new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min); + new_rip_vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); break; } } @@ -2558,7 +2558,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(lines->first != 0 && (params->line_vaddrs[line_slice_idx] != 0 || lines->first->v.pt.line == mouse_pt.line)) { RD_RegsScope(.process = selected_thread_process->handle, - .vaddr_range = ctrl_vaddr_range_from_voff_range(selected_thread_module, lines->first->v.voff_range), + .vaddr_range = d_vaddr_range_from_voff_range(selected_thread_module, lines->first->v.voff_range), .module = selected_thread_module->handle, .dbgi_key = lines->first->v.dbgi_key, .voff_range = lines->first->v.voff_range) @@ -2659,8 +2659,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe Rng1U64 hover_voff_range = hover_regs->voff_range; if(hover_voff_range.min == 0 && hover_voff_range.max == 0) { - D_Entity *module = ctrl_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, hover_regs->module); - hover_voff_range = ctrl_voff_range_from_vaddr_range(module, hover_regs->vaddr_range); + D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, hover_regs->module); + hover_voff_range = d_voff_range_from_vaddr_range(module, hover_regs->vaddr_range); } ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); UI_WidthFill From 0d3539d707946861019a2986c75d6fb28d763484 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 16:09:32 -0700 Subject: [PATCH 447/850] highlighting for views; view doc / autocompletion coverage --- src/base/base_core.h | 12 +-- src/raddbg/generated/raddbg.meta.c | 32 +++++-- src/raddbg/generated/raddbg.meta.h | 2 +- src/raddbg/raddbg.mdesk | 137 +++++++++++++++++++++-------- src/raddbg/raddbg_core.c | 21 +++-- src/raddbg/raddbg_core.h | 2 +- src/raddbg/raddbg_eval.c | 2 +- src/raddbg/raddbg_widgets.c | 5 +- 8 files changed, 150 insertions(+), 63 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index cdb8c4f4..17d3a948 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -207,7 +207,6 @@ #define MemoryCopy(dst, src, size) memmove((dst), (src), (size)) #define MemorySet(dst, byte, size) memset((dst), (byte), (size)) #define MemoryCompare(a, b, size) memcmp((a), (b), (size)) -#define MemoryStrlen(ptr) strlen(ptr) #define MemoryCopyStruct(d,s) MemoryCopy((d),(s),sizeof(*(d))) #define MemoryCopyArray(d,s) MemoryCopy((d),(s),sizeof(d)) @@ -225,9 +224,6 @@ #define MemoryIsZeroStruct(ptr) memory_is_zero((ptr), sizeof(*(ptr))) -#define MemoryRead(T,p,e) ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) ) -#define MemoryConsume(T,p,e) ( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) ) - //////////////////////////////// //~ rjf: Asserts @@ -502,29 +498,29 @@ union U512 typedef struct U16Array U16Array; struct U16Array { - U64 count; U16 *v; + U64 count; }; typedef struct U32Array U32Array; struct U32Array { - U64 count; U32 *v; + U64 count; }; typedef struct U64Array U64Array; struct U64Array { - U64 count; U64 *v; + U64 count; }; typedef struct U128Array U128Array; struct U128Array { - U64 count; U128 *v; + U64 count; }; //////////////////////////////// diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 17b779ec..0f7ab37b 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -426,23 +426,37 @@ RD_VocabInfo rd_vocab_info_table[360] = {str8_lit_comp("geo3d"), str8_lit_comp(""), str8_lit_comp("Geometry (3D)"), str8_lit_comp(""), RD_IconKind_Cube}, }; -RD_NameSchemaInfo rd_name_schema_info_table[26] = +RD_NameSchemaInfo rd_name_schema_info_table[40] = { -{str8_lit_comp("user"), str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': query,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, -{str8_lit_comp("project"), str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': query,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, +{str8_lit_comp("user"), str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, +{str8_lit_comp("project"), str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, {str8_lit_comp("tab"), str8_lit_comp("@row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\nx:\n{\n @override @display_name('Tab Font Size') @description(\"Controls the tab's font size.\") @no_callee_helper\n 'font_size': @range[6, 72] u64,\n}\n")}, -{str8_lit_comp("watch"), str8_lit_comp("@inherit(tab) x:\n{\n @override @display_name('Tab Row Height') @description(\"Controls the tab's row height, in multiples of the font size.\")\n 'row_height': @range[1.75f, 5.f] f32,\n 'label': code_string,\n @description(\"The root expression which is evaluated to produce the watch window.\")\n 'expression': expr_string,\n @no_expand 'watches': query,\n}\n")}, +{str8_lit_comp("bin"), str8_lit_comp("x:{ @description('An expression to which the 2-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("oct"), str8_lit_comp("x:{ @description('An expression to which the 8-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("hex"), str8_lit_comp("x:{ @description('An expression to which the 16-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("digits"), str8_lit_comp("x:{ @description('An expression to which the digit display should apply.') 'expression': expr_string, @description('The minimum number of digits to display.') 'digit_count': u64 }")}, +{str8_lit_comp("no_string"), str8_lit_comp("x:{ @description('The expression for which string visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("no_char"), str8_lit_comp("x:{ @description('The expression for which character visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("no_addr"), str8_lit_comp("x:{ @description('The expression for which address visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("sequence"), str8_lit_comp("x:{ @description('The number of expansions to generate.') 'count': expr_string}")}, +{str8_lit_comp("rows"), str8_lit_comp("x:{ @description('The expression for which rows should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate rows.') '...'}")}, +{str8_lit_comp("columns"), str8_lit_comp("x:{ @description('The expression for whose expansions columns should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate columns for each expansion from `expression`.') '...'}")}, +{str8_lit_comp("omit"), str8_lit_comp("x:{ @description('The expression for which certain members should be omitted.') 'expression': expr_string, @description('A list of member names to omit from the expansion.') '...'}")}, +{str8_lit_comp("range1"), str8_lit_comp("x:{ @description('The expression which should be bounded by `min` and `max`.') 'expression': expr_string, @description('The lower bound.') min, @description('The upper bound.') max}")}, +{str8_lit_comp("array"), str8_lit_comp("x:{ @description('An expression of the base address of the array.') 'base_address': expr_string, @description('The number of elements in the array.') count}")}, +{str8_lit_comp("slice"), str8_lit_comp("x:{ @description('An expression of a structure that is to be interpreted as a slice.') 'expression': expr_string}")}, {str8_lit_comp("list"), str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, +{str8_lit_comp("watch"), str8_lit_comp("@inherit(tab) x:\n{\n @override @display_name('Tab Row Height') @description(\"Controls the tab's row height, in multiples of the font size.\")\n 'row_height': @range[1.75f, 5.f] f32,\n 'label': code_string,\n @description(\"The root expression which is evaluated to produce the watch window.\")\n 'expression': expr_string,\n @no_expand 'watches': set,\n}\n")}, {str8_lit_comp("text"), str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, {str8_lit_comp("disasm"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n 'arch': code_string,\n 'syntax': code_string,\n 'size': expr_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, -{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1.0) 'zoom': @range[0.5, 2] f32,\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': query,\n}\n")}, +{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1.0) 'zoom': @range[0.5, 2] f32,\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': set,\n}\n")}, {str8_lit_comp("bitmap"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, {str8_lit_comp("color"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, {str8_lit_comp("geo3d"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, {str8_lit_comp("getting_started"), str8_lit_comp("@inherit(tab) x:\n{\n}\n")}, -{str8_lit_comp("target"), str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': query,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, +{str8_lit_comp("target"), str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': set,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, {str8_lit_comp("breakpoint"), str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\nx:\n{\n 'label': code_string,\n 'condition': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n 'hit_count': u64,\n 'address_range_size': @or(0, 1, 2, 4, 8) u64,\n 'break_on_write': bool,\n 'break_on_read': bool,\n 'break_on_execute': bool,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, {str8_lit_comp("watch_pin"), str8_lit_comp("@row_commands(duplicate_cfg, remove_cfg)\n@collection_commands(add_watch_pin, toggle_watch_pin)\nx:\n{\n 'expression': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n}\n")}, {str8_lit_comp("debug_info"), str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @query 'guid': string,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, @@ -450,10 +464,10 @@ RD_NameSchemaInfo rd_name_schema_info_table[26] = {str8_lit_comp("type_view"), str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, {str8_lit_comp("recent_project"), str8_lit_comp("x:{'path':path}")}, {str8_lit_comp("recent_file"), str8_lit_comp("x:{'path':path}")}, -{str8_lit_comp("machine"), str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':query, 'processes':query}")}, -{str8_lit_comp("process"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':query, 'threads':query}")}, +{str8_lit_comp("machine"), str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}")}, +{str8_lit_comp("process"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}")}, {str8_lit_comp("module"), str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}")}, -{str8_lit_comp("thread"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':query}")}, +{str8_lit_comp("thread"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, }; String8 rd_reg_slot_code_name_table[49] = diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 89b9e129..5580e8bd 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -603,7 +603,7 @@ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; extern RD_VocabInfo rd_vocab_info_table[360]; -extern RD_NameSchemaInfo rd_name_schema_info_table[26]; +extern RD_NameSchemaInfo rd_name_schema_info_table[40]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; extern String8 rd_binding_version_remap_old_name_table[8]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 7fa633c3..b53e3551 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -226,7 +226,7 @@ RD_VocabTable: @table(name schema) RD_SchemaTable: { - //- rjf: users / projects + //- rjf: @schema users { user, ``` @@ -253,7 +253,7 @@ RD_VocabTable: @description("The user's theme, which describes all colors used throughout the UI.") 'theme': string, @no_expand @display_name('User Theme') - 'theme_colors': query, + 'theme_colors': set, //- rjf: autocompletion @display_name('Autocompletion Lister') @description("Enables the autocompletion lister while typing expressions.") @default(1) @@ -305,9 +305,12 @@ RD_VocabTable: ``` } + //- rjf: @schema project + // // TODO(rjf): the control codes could be fed from the D_ExceptionCodeKindTable, but // we do not support that in this generator - we'd need a way to form a table-generated // string and put it into a table cell... + // { project ``` @@ -328,7 +331,7 @@ RD_VocabTable: @default("None") @display_name('Project Theme') @description("The project's theme, which describes all colors used throughout the UI, and can override the user's theme.") 'theme': string, @no_expand @display_name('Project Theme') @description("The project's theme, which describes all colors used throughout the UI, and can override the user's theme.") - 'theme_colors': query, + 'theme_colors': set, //- rjf: exception settings @default(1) @display_name("Break On Win32 Control-C Exceptions") @description("Code: 0x40010005") @@ -409,7 +412,7 @@ RD_VocabTable: ``` } - //- rjf: theme colors + //- rjf: @schema theme_color { theme_color, ``` @@ -423,7 +426,7 @@ RD_VocabTable: ``` } - //- rjf: windows + //- rjf: @schema window { window, ``` @@ -454,7 +457,7 @@ RD_VocabTable: ``` } - //- rjf: tabs + //- rjf: @schema tab { tab, ``` @@ -467,21 +470,49 @@ RD_VocabTable: ``` } - //- rjf: views - { - watch, - ``` - @inherit(tab) x: - { - @override @display_name('Tab Row Height') @description("Controls the tab's row height, in multiples of the font size.") - 'row_height': @range[1.75f, 5.f] f32, - 'label': code_string, - @description("The root expression which is evaluated to produce the watch window.") - 'expression': expr_string, - @no_expand 'watches': query, - } - ``` - } + //- rjf: @schema bin + {bin ```x:{ @description('An expression to which the 2-radix display should apply.') 'expression': expr_string }```} + + //- rjf: @schema oct + {oct ```x:{ @description('An expression to which the 8-radix display should apply.') 'expression': expr_string }```} + + //- rjf: @schema hex + {hex ```x:{ @description('An expression to which the 16-radix display should apply.') 'expression': expr_string }```} + + //- rjf: @schema digits + {digits ```x:{ @description('An expression to which the digit display should apply.') 'expression': expr_string, @description('The minimum number of digits to display.') 'digit_count': u64 }```} + + //- rjf: @schema no_string + {no_string ```x:{ @description('The expression for which string visualization should be disabled.') 'expression': expr_string}```} + + //- rjf: @schema no_char + {no_char ```x:{ @description('The expression for which character visualization should be disabled.') 'expression': expr_string}```} + + //- rjf: @schema no_addr + {no_addr ```x:{ @description('The expression for which address visualization should be disabled.') 'expression': expr_string}```} + + //- rjf: @schema sequence + {sequence ```x:{ @description('The number of expansions to generate.') 'count': expr_string}```} + + //- rjf: @schema rows + {rows ```x:{ @description('The expression for which rows should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate rows.') '...'}```} + + //- rjf: @schema columns + {columns ```x:{ @description('The expression for whose expansions columns should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate columns for each expansion from `expression`.') '...'}```} + + //- rjf: @schema omit + {omit ```x:{ @description('The expression for which certain members should be omitted.') 'expression': expr_string, @description('A list of member names to omit from the expansion.') '...'}```} + + //- rjf: @schema range1 + {range1 ```x:{ @description('The expression which should be bounded by `min` and `max`.') 'expression': expr_string, @description('The lower bound.') min, @description('The upper bound.') max}```} + + //- rjf: @schema array + {array ```x:{ @description('An expression of the base address of the array.') 'base_address': expr_string, @description('The number of elements in the array.') count}```} + + //- rjf: @schema slice + {slice ```x:{ @description('An expression of a structure that is to be interpreted as a slice.') 'expression': expr_string}```} + + //- rjf: @schema list { list, ``` @@ -494,6 +525,24 @@ RD_VocabTable: } ``` } + + //- rjf: @schema watch + { + watch, + ``` + @inherit(tab) x: + { + @override @display_name('Tab Row Height') @description("Controls the tab's row height, in multiples of the font size.") + 'row_height': @range[1.75f, 5.f] f32, + 'label': code_string, + @description("The root expression which is evaluated to produce the watch window.") + 'expression': expr_string, + @no_expand 'watches': set, + } + ``` + } + + //- rjf: @schema text { text, ``` @@ -514,6 +563,8 @@ RD_VocabTable: } ``` } + + //- rjf: @schema disasm { disasm, ``` @@ -537,6 +588,8 @@ RD_VocabTable: } ``` } + + //- rjf: @schema memory { memory, ``` @@ -567,10 +620,12 @@ RD_VocabTable: @default(1) @display_name("Peek As Signed") 'peek_as_signed': bool, @default(1) @display_name("Peek As Float") 'peek_as_float': bool, @display_name("Extra Peek Types") @description("A list of types as which to interpret selected memory.") - 'peek_types': query, + 'peek_types': set, } ``` } + + //- rjf: @schema bitmap { bitmap, ``` @@ -585,6 +640,8 @@ RD_VocabTable: } ``` } + + //- rjf: @schema color { color, ``` @@ -595,6 +652,8 @@ RD_VocabTable: } ``` } + + //- rjf: @schema geo3d { geo3d, ``` @@ -612,7 +671,7 @@ RD_VocabTable: ``` } - //- rjf: getting started + //- rjf: @schema getting_started { getting_started, ``` @@ -622,7 +681,7 @@ RD_VocabTable: ``` } - //- rjf: targets + //- rjf: @schema target { target, ``` @@ -638,14 +697,14 @@ RD_VocabTable: 'stdout_path': @no_relativize path, 'stderr_path': @no_relativize path, 'stdin_path': @no_relativize path, - 'environment': query, + 'environment': set, 'debug_subprocesses': bool, @no_revert @no_expand @default(0) 'enabled': bool, } ```, } - //- rjf: breakpoints + //- rjf: @schema breakpoint { breakpoint, ``` @@ -667,7 +726,7 @@ RD_VocabTable: ```, } - //- rjf: watch pins + //- rjf: @schema watch_pin { watch_pin, ``` @@ -682,7 +741,7 @@ RD_VocabTable: ```, } - //- rjf: debug infos + //- rjf: @schema debug_info { debug_info, ``` @@ -697,46 +756,52 @@ RD_VocabTable: ```, } - //- rjf: file path maps + //- rjf: @schema file_path_map { file_path_map, ```@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}```, } - //- rjf: type views + //- rjf: @schema type_view { type_view, ```@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}```, } - //- rjf: recent projects + //- rjf: @schema recent_project { recent_project, ```x:{'path':path}```, } - //- rjf: recent files + //- rjf: @schema recent_file { recent_file, ```x:{'path':path}```, } - //- rjf: control entities + //- rjf: @schema machine { machine, - ```x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':query, 'processes':query}```, + ```x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}```, } + + //- rjf: @schema process { process, - ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':query, 'threads':query}```, + ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}```, } + + //- rjf: @schema module { module, ```x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}```, } + + //- rjf: @schema thread { thread, - ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':query}```, + ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}```, } } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 5d13fd17..849d6490 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -6014,7 +6014,7 @@ rd_window_frame(void) UI_TagF("weak") ui_label(display_name); } } - UI_TagF("weak") ui_label(desc); + UI_TagF("weak") rd_label(desc); } } } @@ -9345,7 +9345,7 @@ rd_set_autocomp_regs_(E_Eval dst_eval, RD_Regs *regs) MD_Node *arg_schema = &md_nil_node; if(callee_expr.size != 0) { - E_Eval callee_eval = e_eval_from_string(callee_expr); + E_Eval callee_eval = e_eval_from_stringf("view:%S", callee_expr); E_Type *callee_type = e_type_from_key(callee_eval.irtree.type_key); if(callee_type->kind == E_TypeKind_LensSpec) { @@ -9375,7 +9375,7 @@ rd_set_autocomp_regs_(E_Eval dst_eval, RD_Regs *regs) cursor_info.list_expr = push_str8_copy(ws->autocomp_arena, list_expr); cursor_info.filter = push_str8_copy(ws->autocomp_arena, filter); cursor_info.replaced_range = replaced_range; - cursor_info.callee_expr = push_str8_copy(ws->autocomp_arena, callee_expr); + cursor_info.callee_expr = str8f(ws->autocomp_arena, "view:%S", callee_expr); cursor_info.arg_schema = arg_schema; scratch_end(scratch); @@ -9454,7 +9454,7 @@ rd_code_color_slot_from_txt_token_kind(TXT_TokenKind kind) } internal RD_CodeColorSlot -rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string) +rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string, B32 allow_macros, B32 is_called) { RD_CodeColorSlot color = RD_CodeColorSlot_CodeDefault; if(kind == TXT_TokenKind_Identifier || kind == TXT_TokenKind_Keyword) @@ -9505,6 +9505,17 @@ rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 } } + // rjf: try to map as macro + if((!mapped || is_called) && allow_macros) + { + E_Expr *expr = e_string2expr_map_lookup(e_ir_ctx->macro_map, string); + if(expr != &e_expr_nil) + { + mapped = 1; + color = RD_CodeColorSlot_CodeMeta; + } + } + // rjf: try to map using asynchronous matching system if(!mapped && kind == TXT_TokenKind_Identifier) { @@ -11615,7 +11626,7 @@ rd_frame(void) } - //- rjf: add types for queries + //- rjf: add types for sets { e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit("environment"), e_type_key_cons(.kind = E_TypeKind_Set, diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 5a458139..6fd37bbd 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -755,7 +755,7 @@ internal void rd_set_autocomp_regs_(E_Eval dst_eval, RD_Regs *regs); internal MD_Node *rd_theme_tree_from_name(Arena *arena, Access *access, String8 theme_name); internal Vec4F32 rd_rgba_from_code_color_slot(RD_CodeColorSlot slot); internal RD_CodeColorSlot rd_code_color_slot_from_txt_token_kind(TXT_TokenKind kind); -internal RD_CodeColorSlot rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string); +internal RD_CodeColorSlot rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string, B32 allow_macros, B32 is_called); //- rjf: fonts internal F32 rd_font_size(void); diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 710b5bbd..603df8ad 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -361,7 +361,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) child_type_key = e_type_key_cons(.kind = E_TypeKind_Struct, .name = str8_lit("vaddr_range"), .count = vaddr_range_members.count, .members = vaddr_range_members.v); scratch_end(scratch); } - else if(str8_match(child_schema->first->string, str8_lit("query"), 0)) + else if(str8_match(child_schema->first->string, str8_lit("set"), 0)) { child_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, child_schema->string); } diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 666effcb..32392c38 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2347,7 +2347,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: token -> token color RD_CodeColorSlot token_color_slot = rd_code_color_slot_from_txt_token_kind(token->kind); - RD_CodeColorSlot lookup_color_slot = preceded_by_dot ? token_color_slot : rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string); + RD_CodeColorSlot lookup_color_slot = preceded_by_dot ? token_color_slot : rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string, 0, 0); Vec4F32 token_color = rd_rgba_from_code_color_slot(token_color_slot); if(lookup_color_slot != RD_CodeColorSlot_CodeDefault) { @@ -3224,9 +3224,10 @@ rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, case TXT_TokenKind_Keyword: { RD_CodeColorSlot lookup_theme_color_slot = RD_CodeColorSlot_CodeDefault; + B32 is_called = (token+1 < tokens_opl && token[1].kind == TXT_TokenKind_Symbol && str8_match(str8_substr(string, token[1].range), str8_lit("("), 0)); if(!preceded_by_dot) { - lookup_theme_color_slot = rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string); + lookup_theme_color_slot = rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string, 1, is_called); } if(lookup_theme_color_slot != RD_CodeColorSlot_CodeDefault) { From a027a0ea1683e7fb2c9fecbb70fae6503c079a70 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 16:24:23 -0700 Subject: [PATCH 448/850] use fully qualified symbol names when doing dbg info searches & when producing strings in debug info table evals --- src/dbg_info/dbg_info.c | 37 +++++++------------------------------ src/raddbg/raddbg_eval.c | 9 ++------- 2 files changed, 9 insertions(+), 37 deletions(-) diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 8e90de47..f215f99b 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1151,28 +1151,8 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * U64 element_count = 0; void *table_base = rdi_section_raw_table_from_kind(rdi, section_kind, &element_count); U64 element_size = rdi_section_element_size_table[section_kind]; - - // rjf: determine name string index offset, depending on table kind - U64 element_name_idx_off = 0; - switch(section_kind) - { - default:{}break; - case RDI_SectionKind_Procedures: - case RDI_SectionKind_GlobalVariables: - case RDI_SectionKind_ThreadVariables: - { - element_name_idx_off = OffsetOf(RDI_Symbol, name_string_idx); - }break; - case RDI_SectionKind_UDTs: - { - // NOTE(rjf): name must be determined from self_type_idx - }break; - case RDI_SectionKind_SourceFiles: - { - // NOTE(rjf): name must be determined from file path node chain - }break; - } - + + // rjf: do search Rng1U64 range = lane_range(element_count); for EachInRange(idx, range) { @@ -1190,9 +1170,8 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * case RDI_SectionKind_UDTs: { RDI_UDT *udt = (RDI_UDT *)element; - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); - name.str = rdi_string_from_idx(rdi, type_node->user_defined.name_string_idx, &name.size); - name = str8_copy(arena, name); + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); + name = fully_qualified_from_rdi_string_and_container(arena, rdi, type_node->user_defined.name_string_idx, udt->container_idx, udt->container_flags); }break; case RDI_SectionKind_SourceFiles: { @@ -1213,11 +1192,9 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * scratch_end(scratch); }break; default: - { - U32 name_idx = *(U32 *)((U8 *)element + element_name_idx_off); - U64 name_size = 0; - U8 *name_base = rdi_string_from_idx(rdi, name_idx, &name_size); - name = str8(name_base, name_size); + { + RDI_Symbol *symbol = (RDI_Symbol *)element; + name = fully_qualified_str8_from_rdi_symbol(arena, rdi, symbol); }break; } if(name.size == 0) { continue; } diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 603df8ad..3721477c 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -1812,17 +1812,12 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) case RDI_SectionKind_Constants: { RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, accel->section, element_idx); - String8 symbol_name = {0}; - symbol_name.str = rdi_string_from_idx(rdi, symbol->name_string_idx, &symbol_name.size); - item_string = symbol_name; + item_string = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, symbol); }break; case RDI_SectionKind_UDTs: { RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, element_idx); - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, type_node->user_defined.name_string_idx, &name.size); - item_string = name; + item_string = fully_qualified_str8_from_rdi_udt(scratch.arena, rdi, udt); }break; case RDI_SectionKind_SourceFiles: { From 435b5183fb3c20b139f1ce6cc5601b584afe16ec Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 21 Apr 2026 14:54:32 -0700 Subject: [PATCH 449/850] warn only if override subsystem is different --- src/linker/lnk_config.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 81fe3b13..ac8d606e 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -1768,9 +1768,11 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List PE_WindowsSubsystem subsystem = pe_subsystem_from_string(value_strings.first->string); if (subsystem != PE_WindowsSubsystem_UNKNOWN) { if (config->subsystem != PE_WindowsSubsystem_UNKNOWN) { - lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "overriding subystem \"%S\" with \"%S\"", - pe_string_from_subsystem(config->subsystem), - pe_string_from_subsystem(subsystem)); + if (config->subsystem != subsystem) { + lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "overriding subystem \"%S\" with \"%S\"", + pe_string_from_subsystem(config->subsystem), + pe_string_from_subsystem(subsystem)); + } } config->subsystem = subsystem; From 05d76b416ace7333a0c4e5c713b0351f06a1fd89 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 22 Apr 2026 18:34:27 -0700 Subject: [PATCH 450/850] update defer imp link test --- src/torture/torture_radlink.c | 80 +++++++++++------------------------ 1 file changed, 24 insertions(+), 56 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 982d7423..c345b8d6 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4466,67 +4466,35 @@ TEST(second_member_header) } #if 0 -TEST(multibyte) +TEST(defer_imp_link) { - String8 a_obj = t_coff_obj_from_string(arena, str8_lit("'machine': 'x64', \n\ - 'sections': [ \n\ - { \n\ - 'id': 'text', \n\ - 'name': '.text', \n\ - 'flags': 'code', \n\ - 'data': [ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, \n\ - 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 ], \n\ - 'relocs': [ \n\ - { 'kind': 'rel32', 'apply_off': 2, 'symbol': 'foo' }, \n\ - ], \n\ - }, \n\ - ], \n\ - 'symbols': [ \n\ - { 'kind': 'extern_func', 'name': 'use_imports', 'value': 0, 'section': 'text' }, \n\ - { 'kind': 'undef', 'name': 'foo' }, \n\ - ]")); + String8 bar_lib = t_coff_lib_from_string(arena, str8_lit("'import': { 'dll_name': 'bar.dll', 'name': 'bar', 'import_by': 'name', 'hint_or_ordinal': 0, 'type': 'code' }, \ + 'obj': { \ + 'machine': 'x64', \ + 'sections': [ { 'id': 'text', 'name': '.text', 'flags': 'code', 'data': [ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 ], 'relocs': [ { 'kind': 'rel32', 'apply_off': 2, 'symbol': 'bar' } ] } ], \ + 'symbols': [ \ + { 'kind': 'undef', 'name': '__imp_bar' }, \ + { 'kind': 'extern_func', 'name': 'qwe', 'section': 'text', 'value': 0 }, \ + ], \ + }, \ + ")); - String8 aa_obj = t_coff_obj_from_string(arena, str8_lit("'machine': 'x64', \n\ - 'sections': [ \n\ - { \n\ - 'id': 'text', \n\ - 'name': '.text', \n\ - 'flags': 'code', \n\ - 'data': [ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, \n\ - 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 ], \n\ - 'relocs': [ \n\ - { 'kind': 'rel32', 'apply_off': 2, 'symbol': '__imp_foo' }, \n\ - ], \n\ - }, \n\ - ], \n\ - 'symbols': [ \n\ - { 'kind': 'extern_func', 'name': 'use_imports', 'value': 0, 'section': 'text' }, \n\ - { 'kind': 'undef', 'name': '__imp_foo' }, \n\ - ]")); + String8 foo_lib = t_coff_lib_from_string(arena, str8_lit("'import': { 'dll_name': 'foo.dll', 'name': 'bar', 'import_by': 'name', 'hint_or_ordinal': 0, 'type': 'code' }, \ + 'obj': { \ + 'machine': 'x64', \ + 'sections': [ { 'id': 'text', 'name': '.text', 'flags': 'code', 'data': [ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 ], 'relocs': [ { 'kind': 'rel32', 'apply_off': 2, 'symbol': 'bar' } ] } ], \ + 'symbols': [ \ + { 'kind': 'undef', 'name': 'bar' }, \ + { 'kind': 'undef', 'name': 'qwe' }, \ + { 'kind': 'extern_func', 'name': 'thunk', 'section': 'text', 'value': 0 }, \ + ], \ + }")); - String8 b_lib = t_coff_lib_from_string(arena, str8_lit("'import': { \n\ - 'dll_name': 'foo.dll', \n\ - 'name': 'foo', \n\ - 'import_by': 'name', \n\ - 'hint_or_ordinal': 0, \n\ - 'type': 'code', \n\ - }")); - - String8 c_lib = t_coff_lib_from_string(arena, str8_lit("'import': { \n\ - 'dll_name': 'foo.dll', \n\ - 'name': '__imp_foo', \n\ - 'import_by': 'name', \n\ - 'hint_or_ordinal': 0, \n\ - 'type': 'code', \n\ - }")); - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("aa.obj"), aa_obj)); - T_Ok(t_write_file(str8_lit("b.lib"), b_lib)); - T_Ok(t_write_file(str8_lit("c.lib"), c_lib)); + T_Ok(t_write_file(str8_lit("bar.lib"), bar_lib)); + T_Ok(t_write_file(str8_lit("foo.lib"), foo_lib)); T_Ok(t_write_entry_obj()); - t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.lib c.lib entry.obj /include:use_imports"); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe bar.lib foo.lib entry.obj /include:thunk"); T_Ok(g_last_exit_code == 0); } #endif From 3c214cfbb5741426ea21a7dd2e158f04141ba806 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 19:56:58 -0700 Subject: [PATCH 451/850] views autocompletion; view doc coverage --- src/raddbg/generated/raddbg.meta.c | 80 +++++++++--------- src/raddbg/generated/raddbg.meta.h | 1 + src/raddbg/raddbg.mdesk | 130 +++++++++++++++-------------- src/raddbg/raddbg_core.c | 40 ++++++++- src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_eval.c | 62 ++++++++++++++ src/raddbg/raddbg_eval.h | 7 ++ 7 files changed, 216 insertions(+), 105 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 0f7ab37b..19283809 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -428,46 +428,46 @@ RD_VocabInfo rd_vocab_info_table[360] = RD_NameSchemaInfo rd_name_schema_info_table[40] = { -{str8_lit_comp("user"), str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, -{str8_lit_comp("project"), str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, -{str8_lit_comp("theme_color"), str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, -{str8_lit_comp("window"), str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, -{str8_lit_comp("tab"), str8_lit_comp("@row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\nx:\n{\n @override @display_name('Tab Font Size') @description(\"Controls the tab's font size.\") @no_callee_helper\n 'font_size': @range[6, 72] u64,\n}\n")}, -{str8_lit_comp("bin"), str8_lit_comp("x:{ @description('An expression to which the 2-radix display should apply.') 'expression': expr_string }")}, -{str8_lit_comp("oct"), str8_lit_comp("x:{ @description('An expression to which the 8-radix display should apply.') 'expression': expr_string }")}, -{str8_lit_comp("hex"), str8_lit_comp("x:{ @description('An expression to which the 16-radix display should apply.') 'expression': expr_string }")}, -{str8_lit_comp("digits"), str8_lit_comp("x:{ @description('An expression to which the digit display should apply.') 'expression': expr_string, @description('The minimum number of digits to display.') 'digit_count': u64 }")}, -{str8_lit_comp("no_string"), str8_lit_comp("x:{ @description('The expression for which string visualization should be disabled.') 'expression': expr_string}")}, -{str8_lit_comp("no_char"), str8_lit_comp("x:{ @description('The expression for which character visualization should be disabled.') 'expression': expr_string}")}, -{str8_lit_comp("no_addr"), str8_lit_comp("x:{ @description('The expression for which address visualization should be disabled.') 'expression': expr_string}")}, -{str8_lit_comp("sequence"), str8_lit_comp("x:{ @description('The number of expansions to generate.') 'count': expr_string}")}, -{str8_lit_comp("rows"), str8_lit_comp("x:{ @description('The expression for which rows should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate rows.') '...'}")}, -{str8_lit_comp("columns"), str8_lit_comp("x:{ @description('The expression for whose expansions columns should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate columns for each expansion from `expression`.') '...'}")}, -{str8_lit_comp("omit"), str8_lit_comp("x:{ @description('The expression for which certain members should be omitted.') 'expression': expr_string, @description('A list of member names to omit from the expansion.') '...'}")}, -{str8_lit_comp("range1"), str8_lit_comp("x:{ @description('The expression which should be bounded by `min` and `max`.') 'expression': expr_string, @description('The lower bound.') min, @description('The upper bound.') max}")}, -{str8_lit_comp("array"), str8_lit_comp("x:{ @description('An expression of the base address of the array.') 'base_address': expr_string, @description('The number of elements in the array.') count}")}, -{str8_lit_comp("slice"), str8_lit_comp("x:{ @description('An expression of a structure that is to be interpreted as a slice.') 'expression': expr_string}")}, -{str8_lit_comp("list"), str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, -{str8_lit_comp("watch"), str8_lit_comp("@inherit(tab) x:\n{\n @override @display_name('Tab Row Height') @description(\"Controls the tab's row height, in multiples of the font size.\")\n 'row_height': @range[1.75f, 5.f] f32,\n 'label': code_string,\n @description(\"The root expression which is evaluated to produce the watch window.\")\n 'expression': expr_string,\n @no_expand 'watches': set,\n}\n")}, -{str8_lit_comp("text"), str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, -{str8_lit_comp("disasm"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n 'arch': code_string,\n 'syntax': code_string,\n 'size': expr_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, -{str8_lit_comp("memory"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1.0) 'zoom': @range[0.5, 2] f32,\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': set,\n}\n")}, -{str8_lit_comp("bitmap"), str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, -{str8_lit_comp("color"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, -{str8_lit_comp("geo3d"), str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, -{str8_lit_comp("getting_started"), str8_lit_comp("@inherit(tab) x:\n{\n}\n")}, -{str8_lit_comp("target"), str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': set,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, -{str8_lit_comp("breakpoint"), str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\nx:\n{\n 'label': code_string,\n 'condition': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n 'hit_count': u64,\n 'address_range_size': @or(0, 1, 2, 4, 8) u64,\n 'break_on_write': bool,\n 'break_on_read': bool,\n 'break_on_execute': bool,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, -{str8_lit_comp("watch_pin"), str8_lit_comp("@row_commands(duplicate_cfg, remove_cfg)\n@collection_commands(add_watch_pin, toggle_watch_pin)\nx:\n{\n 'expression': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n}\n")}, -{str8_lit_comp("debug_info"), str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @query 'guid': string,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, -{str8_lit_comp("file_path_map"), str8_lit_comp("@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}")}, -{str8_lit_comp("type_view"), str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, -{str8_lit_comp("recent_project"), str8_lit_comp("x:{'path':path}")}, -{str8_lit_comp("recent_file"), str8_lit_comp("x:{'path':path}")}, -{str8_lit_comp("machine"), str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}")}, -{str8_lit_comp("process"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}")}, -{str8_lit_comp("module"), str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}")}, -{str8_lit_comp("thread"), str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, +{str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, +{str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, +{str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, +{str8_lit_comp("tab"), 0, str8_lit_comp("@row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\nx:\n{\n @override @display_name('Tab Font Size') @description(\"Controls the tab's font size.\") @no_callee_helper\n 'font_size': @range[6, 72] u64,\n}\n")}, +{str8_lit_comp("bin"), 1, str8_lit_comp("x:{ @description('An expression to which the 2-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("oct"), 1, str8_lit_comp("x:{ @description('An expression to which the 8-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("hex"), 1, str8_lit_comp("x:{ @description('An expression to which the 16-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("digits"), 1, str8_lit_comp("x:{ @description('An expression to which the digit display should apply.') 'expression': expr_string, @description('The minimum number of digits to display.') 'digit_count': u64 }")}, +{str8_lit_comp("no_string"), 1, str8_lit_comp("x:{ @description('The expression for which string visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("no_char"), 1, str8_lit_comp("x:{ @description('The expression for which character visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("no_addr"), 1, str8_lit_comp("x:{ @description('The expression for which address visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("sequence"), 1, str8_lit_comp("x:{ @description('The number of expansions to generate.') 'count': expr_string}")}, +{str8_lit_comp("rows"), 1, str8_lit_comp("x:{ @description('The expression for which rows should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate rows.') '...'}")}, +{str8_lit_comp("columns"), 1, str8_lit_comp("x:{ @description('The expression for whose expansions columns should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate columns for each expansion from `expression`.') '...'}")}, +{str8_lit_comp("omit"), 1, str8_lit_comp("x:{ @description('The expression for which certain members should be omitted.') 'expression': expr_string, @description('A list of member names to omit from the expansion.') '...'}")}, +{str8_lit_comp("range1"), 1, str8_lit_comp("x:{ @description('The expression which should be bounded by `min` and `max`.') 'expression': expr_string, @description('The lower bound.') min, @description('The upper bound.') max}")}, +{str8_lit_comp("array"), 1, str8_lit_comp("x:{ @description('An expression of the base address of the array.') 'base_address': expr_string, @description('The number of elements in the array.') count}")}, +{str8_lit_comp("slice"), 1, str8_lit_comp("x:{ @description('An expression of a structure that is to be interpreted as a slice.') 'expression': expr_string}")}, +{str8_lit_comp("list"), 1, str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, +{str8_lit_comp("watch"), 0, str8_lit_comp("@inherit(tab) x:\n{\n @override @display_name('Tab Row Height') @description(\"Controls the tab's row height, in multiples of the font size.\")\n 'row_height': @range[1.75f, 5.f] f32,\n 'label': code_string,\n @description(\"The root expression which is evaluated to produce the watch window.\")\n 'expression': expr_string,\n @no_expand 'watches': set,\n}\n")}, +{str8_lit_comp("text"), 1, str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @optional @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, +{str8_lit_comp("disasm"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n @optional @description(\"The maximum number of bytes to disassemble.\")\n 'size': expr_string,\n @optional @description(\"The architecture to interpret the data as when disassembling.\")\n 'arch': code_string,\n @optional @description(\"The syntax style to use when displaying the disassembly textually.\")\n 'syntax': code_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, +{str8_lit_comp("memory"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @no_callee_helper @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1.0) 'zoom': @range[0.5, 2] f32,\n @optional @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @no_callee_helper @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @no_callee_helper @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @optional @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @optional @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @no_callee_helper @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @no_callee_helper @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @no_callee_helper @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @no_callee_helper @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': set,\n}\n")}, +{str8_lit_comp("bitmap"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, +{str8_lit_comp("color"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, +{str8_lit_comp("geo3d"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, +{str8_lit_comp("getting_started"), 0, str8_lit_comp("@inherit(tab) x:\n{\n}\n")}, +{str8_lit_comp("target"), 0, str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': set,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, +{str8_lit_comp("breakpoint"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\nx:\n{\n 'label': code_string,\n 'condition': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n 'hit_count': u64,\n 'address_range_size': @or(0, 1, 2, 4, 8) u64,\n 'break_on_write': bool,\n 'break_on_read': bool,\n 'break_on_execute': bool,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, +{str8_lit_comp("watch_pin"), 0, str8_lit_comp("@row_commands(duplicate_cfg, remove_cfg)\n@collection_commands(add_watch_pin, toggle_watch_pin)\nx:\n{\n 'expression': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n}\n")}, +{str8_lit_comp("debug_info"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @query 'guid': string,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, +{str8_lit_comp("file_path_map"), 0, str8_lit_comp("@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}")}, +{str8_lit_comp("type_view"), 0, str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, +{str8_lit_comp("recent_project"), 0, str8_lit_comp("x:{'path':path}")}, +{str8_lit_comp("recent_file"), 0, str8_lit_comp("x:{'path':path}")}, +{str8_lit_comp("machine"), 0, str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}")}, +{str8_lit_comp("process"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}")}, +{str8_lit_comp("module"), 0, str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}")}, +{str8_lit_comp("thread"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, }; String8 rd_reg_slot_code_name_table[49] = diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 5580e8bd..b4aee778 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -444,6 +444,7 @@ typedef struct RD_NameSchemaInfo RD_NameSchemaInfo; struct RD_NameSchemaInfo { String8 name; +B32 is_view; String8 schema; }; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index b53e3551..08611480 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -224,11 +224,11 @@ RD_VocabTable: //////////////////////////////// //~ rjf: Schemas -@table(name schema) RD_SchemaTable: +@table(name is_view schema) RD_SchemaTable: { - //- rjf: @schema users + //- rjf: @schema user { - user, + user, 0, ``` @expand_commands(edit_user_theme) x: { @@ -312,8 +312,8 @@ RD_VocabTable: // string and put it into a table cell... // { - project - ``` + project, 0, + ``` @expand_commands(edit_project_theme) x: { @display_name('Project Name') 'name': string, @@ -414,7 +414,7 @@ RD_VocabTable: //- rjf: @schema theme_color { - theme_color, + theme_color, 0, ``` @collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme) @row_commands(duplicate_cfg, remove_cfg) @@ -428,7 +428,7 @@ RD_VocabTable: //- rjf: @schema window { - window, + window, 0, ``` x: { @@ -459,7 +459,7 @@ RD_VocabTable: //- rjf: @schema tab { - tab, + tab, 0, ``` @row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab) x: @@ -471,50 +471,50 @@ RD_VocabTable: } //- rjf: @schema bin - {bin ```x:{ @description('An expression to which the 2-radix display should apply.') 'expression': expr_string }```} + {bin 1 ```x:{ @description('An expression to which the 2-radix display should apply.') 'expression': expr_string }```} //- rjf: @schema oct - {oct ```x:{ @description('An expression to which the 8-radix display should apply.') 'expression': expr_string }```} + {oct 1 ```x:{ @description('An expression to which the 8-radix display should apply.') 'expression': expr_string }```} //- rjf: @schema hex - {hex ```x:{ @description('An expression to which the 16-radix display should apply.') 'expression': expr_string }```} + {hex 1 ```x:{ @description('An expression to which the 16-radix display should apply.') 'expression': expr_string }```} //- rjf: @schema digits - {digits ```x:{ @description('An expression to which the digit display should apply.') 'expression': expr_string, @description('The minimum number of digits to display.') 'digit_count': u64 }```} + {digits 1 ```x:{ @description('An expression to which the digit display should apply.') 'expression': expr_string, @description('The minimum number of digits to display.') 'digit_count': u64 }```} //- rjf: @schema no_string - {no_string ```x:{ @description('The expression for which string visualization should be disabled.') 'expression': expr_string}```} + {no_string 1 ```x:{ @description('The expression for which string visualization should be disabled.') 'expression': expr_string}```} //- rjf: @schema no_char - {no_char ```x:{ @description('The expression for which character visualization should be disabled.') 'expression': expr_string}```} + {no_char 1 ```x:{ @description('The expression for which character visualization should be disabled.') 'expression': expr_string}```} //- rjf: @schema no_addr - {no_addr ```x:{ @description('The expression for which address visualization should be disabled.') 'expression': expr_string}```} + {no_addr 1 ```x:{ @description('The expression for which address visualization should be disabled.') 'expression': expr_string}```} //- rjf: @schema sequence - {sequence ```x:{ @description('The number of expansions to generate.') 'count': expr_string}```} + {sequence 1 ```x:{ @description('The number of expansions to generate.') 'count': expr_string}```} //- rjf: @schema rows - {rows ```x:{ @description('The expression for which rows should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate rows.') '...'}```} + {rows 1 ```x:{ @description('The expression for which rows should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate rows.') '...'}```} //- rjf: @schema columns - {columns ```x:{ @description('The expression for whose expansions columns should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate columns for each expansion from `expression`.') '...'}```} + {columns 1 ```x:{ @description('The expression for whose expansions columns should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate columns for each expansion from `expression`.') '...'}```} //- rjf: @schema omit - {omit ```x:{ @description('The expression for which certain members should be omitted.') 'expression': expr_string, @description('A list of member names to omit from the expansion.') '...'}```} + {omit 1 ```x:{ @description('The expression for which certain members should be omitted.') 'expression': expr_string, @description('A list of member names to omit from the expansion.') '...'}```} //- rjf: @schema range1 - {range1 ```x:{ @description('The expression which should be bounded by `min` and `max`.') 'expression': expr_string, @description('The lower bound.') min, @description('The upper bound.') max}```} + {range1 1 ```x:{ @description('The expression which should be bounded by `min` and `max`.') 'expression': expr_string, @description('The lower bound.') min, @description('The upper bound.') max}```} //- rjf: @schema array - {array ```x:{ @description('An expression of the base address of the array.') 'base_address': expr_string, @description('The number of elements in the array.') count}```} + {array 1 ```x:{ @description('An expression of the base address of the array.') 'base_address': expr_string, @description('The number of elements in the array.') count}```} //- rjf: @schema slice - {slice ```x:{ @description('An expression of a structure that is to be interpreted as a slice.') 'expression': expr_string}```} + {slice 1 ```x:{ @description('An expression of a structure that is to be interpreted as a slice.') 'expression': expr_string}```} //- rjf: @schema list { - list, + list, 1, ``` x: { @@ -528,7 +528,7 @@ RD_VocabTable: //- rjf: @schema watch { - watch, + watch, 0, ``` @inherit(tab) x: { @@ -544,15 +544,15 @@ RD_VocabTable: //- rjf: @schema text { - text, + text, 1, ``` @inherit(tab) @expand_commands(@output clear_output) x: { @description("An expression to describe data which should be viewed as text or code.") 'expression': expr_string, - @description("The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.") + @optional @description("The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.") 'lang': code_string, - @default(1) @description("Controls whether or not line numbers are shown.") + @no_callee_helper @default(1) @description("Controls whether or not line numbers are shown.") 'show_line_numbers':bool, @no_callee_helper @default(1) @display_name('Line Wrapping') @description("Splits textual lines into multiple visual lines, so that all text is within the visible area.") 'line_wrapping': bool, @@ -566,15 +566,18 @@ RD_VocabTable: //- rjf: @schema disasm { - disasm, + disasm, 1, ``` @inherit(tab) x: { @description("An expression to describe the base address or offset of the disassembly.") 'expression': expr_string, - 'arch': code_string, - 'syntax': code_string, - 'size': expr_string, + @optional @description("The maximum number of bytes to disassemble.") + 'size': expr_string, + @optional @description("The architecture to interpret the data as when disassembling.") + 'arch': code_string, + @optional @description("The syntax style to use when displaying the disassembly textually.") + 'syntax': code_string, @no_callee_helper @default(1) @description("Controls whether or not addresses are shown in the disassembly text.") 'show_addresses': bool, @no_callee_helper @default(0) @description("Controls whether or not code bytes are shown in the disassembly text.") @@ -591,35 +594,35 @@ RD_VocabTable: //- rjf: @schema memory { - memory, + memory, 1, ``` @inherit(tab) x: { - @display_name("Zoom") @description("The zoom level for displaying bytes in the memory view.") - @default(1.0) 'zoom': @range[0.5, 2] f32, @display_name("Base Address") @description("An expression which refers to the base address of data which should be viewed as memory.") 'expression': expr_string, - @display_name("Address Range Size") @description("The number of bytes of the viewed memory range.") + @no_callee_helper @display_name("Zoom") @description("The zoom level for displaying bytes in the memory view.") + @default(1.0) 'zoom': @range[0.5, 2] f32, + @optional @display_name("Address Range Size") @description("The number of bytes of the viewed memory range.") 'size': expr_string, - @display_name("Cursor Address") @description("The address of the cursor.") + @no_callee_helper @display_name("Cursor Address") @description("The address of the cursor.") 'cursor': expr_string, - @default(1) @display_name("Cursor Size") @description("The size, in bytes, of the cursor.") + @no_callee_helper @default(1) @display_name("Cursor Size") @description("The size, in bytes, of the cursor.") 'cursor_size': @range[1, 16] u64, - @expand_if("!$.auto_columns") @default(16) @description("The number of columns to build before building new rows.") + @optional @expand_if("!$.auto_columns") @default(16) @description("The number of columns to build before building new rows.") 'num_columns': @range[1, 64] u64, - @default(16) @display_name("Default Radix") @description("The default radix with which numeric values should be displayed, when peeking.") + @optional @default(16) @display_name("Default Radix") @description("The default radix with which numeric values should be displayed, when peeking.") @or(2, 8, 10, 16) 'default_radix': u64, - @default(1) @display_name("Track Mark To Cursor") @description("Ensures that the mark always follows the cursor, if the cursor value is updated.") + @no_callee_helper @default(1) @display_name("Track Mark To Cursor") @description("Ensures that the mark always follows the cursor, if the cursor value is updated.") 'track_mark_to_cursor': bool, - @default(1) @display_name("Allow Mutation") @description("Allows operations which mutate memory.") + @no_callee_helper @default(1) @display_name("Allow Mutation") @description("Allows operations which mutate memory.") 'allow_mutation': bool, - @default(0) @display_name("Automatically Size Columns") @description("Determines the number of columns based on the available space.") + @no_callee_helper @default(0) @display_name("Automatically Size Columns") @description("Determines the number of columns based on the available space.") 'auto_columns': bool, - @default(1) @display_name("Peek As Unsigned") 'peek_as_unsigned': bool, - @default(1) @display_name("Peek As Signed") 'peek_as_signed': bool, - @default(1) @display_name("Peek As Float") 'peek_as_float': bool, - @display_name("Extra Peek Types") @description("A list of types as which to interpret selected memory.") + @no_callee_helper @default(1) @display_name("Peek As Unsigned") 'peek_as_unsigned': bool, + @no_callee_helper @default(1) @display_name("Peek As Signed") 'peek_as_signed': bool, + @no_callee_helper @default(1) @display_name("Peek As Float") 'peek_as_float': bool, + @no_callee_helper @display_name("Extra Peek Types") @description("A list of types as which to interpret selected memory.") 'peek_types': set, } ``` @@ -627,7 +630,7 @@ RD_VocabTable: //- rjf: @schema bitmap { - bitmap, + bitmap, 1, ``` @inherit(tab) x: { @@ -643,7 +646,7 @@ RD_VocabTable: //- rjf: @schema color { - color, + color, 1, ``` @inherit(tab) x: { @@ -655,7 +658,7 @@ RD_VocabTable: //- rjf: @schema geo3d { - geo3d, + geo3d, 1, ``` @inherit(tab) x: { @@ -673,7 +676,7 @@ RD_VocabTable: //- rjf: @schema getting_started { - getting_started, + getting_started, 0, ``` @inherit(tab) x: { @@ -683,7 +686,7 @@ RD_VocabTable: //- rjf: @schema target { - target, + target, 0, ``` @row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg) @collection_commands(add_target) @@ -706,7 +709,7 @@ RD_VocabTable: //- rjf: @schema breakpoint { - breakpoint, + breakpoint, 0, ``` @row_commands(enable_cfg, duplicate_cfg, remove_cfg) @collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints) @@ -728,7 +731,7 @@ RD_VocabTable: //- rjf: @schema watch_pin { - watch_pin, + watch_pin, 0, ``` @row_commands(duplicate_cfg, remove_cfg) @collection_commands(add_watch_pin, toggle_watch_pin) @@ -743,7 +746,7 @@ RD_VocabTable: //- rjf: @schema debug_info { - debug_info, + debug_info, 0, ``` @row_commands(enable_cfg, duplicate_cfg, remove_cfg) @collection_commands(load_debug_info) @@ -758,49 +761,49 @@ RD_VocabTable: //- rjf: @schema file_path_map { - file_path_map, + file_path_map, 0, ```@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}```, } //- rjf: @schema type_view { - type_view, + type_view, 0, ```@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}```, } //- rjf: @schema recent_project { - recent_project, + recent_project, 0, ```x:{'path':path}```, } //- rjf: @schema recent_file { - recent_file, + recent_file, 0, ```x:{'path':path}```, } //- rjf: @schema machine { - machine, + machine, 0, ```x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}```, } //- rjf: @schema process { - process, + process, 0, ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}```, } //- rjf: @schema module { - module, + module, 0, ```x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}```, } //- rjf: @schema thread { - thread, + thread, 0, ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}```, } } @@ -808,12 +811,13 @@ RD_VocabTable: @struct RD_NameSchemaInfo: { `String8 name`; + `B32 is_view`; `String8 schema`; } @data(RD_NameSchemaInfo) rd_name_schema_info_table: { - @expand(RD_SchemaTable a) `{str8_lit_comp("$(a.name)"), str8_lit_comp("$(a.schema)")}` + @expand(RD_SchemaTable a) `{str8_lit_comp("$(a.name)"), $(a.is_view), str8_lit_comp("$(a.schema)")}` } //////////////////////////////// diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 849d6490..da914251 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5988,7 +5988,13 @@ rd_window_frame(void) } first = 0; UI_Key arg_key = ui_key_from_stringf(ui_active_seed_key(), "###arg_%p", child); - DR_FStrList arg_fstrs = rd_fstrs_from_code_string(scratch.arena, 1.f, 0, code_default, child->string); + String8 arg_string = child->string; + B32 is_optional = md_node_has_tag(child, str8_lit("optional"), 0); + if(is_optional) + { + arg_string = str8f(scratch.arena, "[%S=...]", child->string); + } + DR_FStrList arg_fstrs = rd_fstrs_from_code_string(scratch.arena, 1.f, 0, code_default, arg_string); if(child == ws->autocomp_cursor_info.arg_schema) { ui_set_next_flags(UI_BoxFlag_DrawSideBottom); @@ -6013,6 +6019,11 @@ rd_window_frame(void) ui_spacer(ui_em(0.5f, 1.f)); UI_TagF("weak") ui_label(display_name); } + if(is_optional) + { + ui_spacer(ui_em(0.5f, 1.f)); + UI_TagF("weak") ui_labelf("(Optional)"); + } } UI_TagF("weak") rd_label(desc); } @@ -9205,7 +9216,7 @@ rd_set_autocomp_regs_(E_Eval dst_eval, RD_Regs *regs) // rjf: calculate most general list expression, given the dst_eval space B32 force_allow = 0; B32 expr_based_replace = 1; - String8 list_expr = str8_lit("query:locals, query:globals, query:thread_locals, query:procedures, query:types, query:constants"); + String8 list_expr = str8_lit("query:locals, query:views, query:globals, query:thread_locals, query:procedures, query:types, query:constants"); { E_TypeKey maybe_enum_type = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative & ~E_TypeUnwrapFlag_Enums); if(dst_eval.space.kind == RD_EvalSpaceKind_MetaCfg) @@ -11286,6 +11297,31 @@ rd_frame(void) } } + //- rjf: add macro for views + { + String8 names[] = + { + str8_lit("views"), + }; + for EachElement(idx, names) + { + String8 name = names[idx]; + E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set, + .flags = E_TypeFlag_StubSingleLineExpansion, + .name = name, + .access = E_TYPE_ACCESS_FUNCTION_NAME(views), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(views), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(views), + }); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); + expr->type_key = type_key; + expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); + e_string2expr_map_insert(scratch.arena, macro_map, name, expr); + } + } + //- rjf: build schema types & cache (name -> type) mapping for EachElement(idx, rd_name_schema_info_table) { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 6fd37bbd..5f5d119d 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -14,6 +14,7 @@ enum RD_EvalSpaceKind_MetaCfg, RD_EvalSpaceKind_MetaCmd, RD_EvalSpaceKind_MetaTheme, + RD_EvalSpaceKind_MetaView, RD_EvalSpaceKind_MetaCtrlEntity, RD_EvalSpaceKind_MetaUnattachedProcess, RD_EvalSpaceKind_MetaCallStackTree, diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 3721477c..5b7adf0c 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -157,6 +157,68 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(themes) } } +//////////////////////////////// +//~ rjf: `views` Type Hooks + +E_TYPE_ACCESS_FUNCTION_DEF(views) +{ + E_IRTreeAndType result = {&e_irnode_nil}; + if(expr->kind == E_ExprKind_ArrayIndex && + expr->first->next->kind == E_ExprKind_LeafStringLiteral) + { + Temp scratch = scratch_begin(&arena, 1); + String8 view_name = expr->first->next->string; + E_TypeKey view_type = e_type_key_cons(.kind = E_TypeKind_U64, .name = str8_lit("view")); + result.type_key = view_type; + result.mode = E_Mode_Null; + result.root = e_irtree_set_space(arena, e_space_make(RD_EvalSpaceKind_MetaView), e_irtree_const_u(arena, e_id_from_string(view_name))); + scratch_end(scratch); + } + return result; +} + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(views) +{ + E_TypeExpandInfo result = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: gather cfgs + String8List names = {0}; + for EachElement(idx, rd_name_schema_info_table) + { + if(rd_name_schema_info_table[idx].is_view) + { + String8 name = rd_name_schema_info_table[idx].name; + FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, name); + if(name_matches.count == name_matches.needle_part_count) + { + str8_list_push(scratch.arena, &names, name); + } + } + } + + //- rjf: flatten & build accelerator + String8Array *accel = push_array(arena, String8Array, 1); + *accel = str8_array_from_list(arena, &names); + result.user_data = accel; + result.expr_count = accel->count; + scratch_end(scratch); + } + return result; +} + +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(views) +{ + U64 out_idx = 0; + String8Array *accel = (String8Array *)user_data; + for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1) + { + String8 name = accel->v[idx]; + evals_out[out_idx] = e_eval_from_string(name); + } +} + //////////////////////////////// //~ rjf: `locals` Type Hooks diff --git a/src/raddbg/raddbg_eval.h b/src/raddbg/raddbg_eval.h index 216f514b..a9450678 100644 --- a/src/raddbg/raddbg_eval.h +++ b/src/raddbg/raddbg_eval.h @@ -18,6 +18,13 @@ E_TYPE_ACCESS_FUNCTION_DEF(themes); E_TYPE_EXPAND_INFO_FUNCTION_DEF(themes); E_TYPE_EXPAND_RANGE_FUNCTION_DEF(themes); +//////////////////////////////// +//~ rjf: `views` Type Hooks + +E_TYPE_ACCESS_FUNCTION_DEF(views); +E_TYPE_EXPAND_INFO_FUNCTION_DEF(views); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(views); + //////////////////////////////// //~ rjf: `locals` Type Hooks From 684eeda139997aee54a3f868925c52a555ac0be6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 22 Apr 2026 20:15:36 -0700 Subject: [PATCH 452/850] setting to turn off transient tab spawns --- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 4 ++++ src/raddbg/raddbg_core.c | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 19283809..6dc53ee3 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -428,7 +428,7 @@ RD_VocabInfo rd_vocab_info_table[360] = RD_NameSchemaInfo rd_name_schema_info_table[40] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 08611480..35d08264 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -301,6 +301,10 @@ RD_VocabTable: //- rjf: native filesystem dialogues @default(0) @display_name('Use Native File System Dialog') @description("Uses the operating system's file system dialog box, rather than the debugger's built-in UI.") 'use_native_file_system_dialog': bool, + + //- rjf: transient tabs + @default(1) @display_name('Transient Tabs') @description("When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.") + 'transient_tabs': bool, } ``` } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index da914251..17ba3eed 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -14277,6 +14277,12 @@ rd_frame(void) } } + //- rjf: if transient tabs are turned off, always prefer new tab + if(!rd_setting_b32_from_name(str8_lit("transient_tabs"))) + { + prefer_new_tab = 1; + } + //- rjf: given a src code location, if no vaddr is specified, // try to map the src coordinates to a vaddr via line info if(vaddr == 0 && file_path.size != 0) From 6f624c10ad76c9a717ae88022ebc1e5b2a98dce2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Apr 2026 12:30:45 -0700 Subject: [PATCH 453/850] fix dwarf conversion to account for new rdi changes --- project.4coder | 3 +- src/radbin/radbin.c | 14 ++++-- src/rdi_from_dwarf/rdi_from_dwarf.c | 78 ++++++++++++++--------------- src/rdi_from_dwarf/rdi_from_dwarf.h | 3 -- 4 files changed, 51 insertions(+), 47 deletions(-) diff --git a/project.4coder b/project.4coder index a83c192c..60db8ba5 100644 --- a/project.4coder +++ b/project.4coder @@ -48,7 +48,8 @@ commands = //- rjf: [raddbg] // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin && pushd build && del simple.rdi && del simple.dump && radbin --rdi simple && radbin --dump simple.rdi --out:simple.dump", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index a9034803..3b8af5f6 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -70,9 +70,15 @@ rb_thread_entry_point(void *p) // ProfScope("analyze & load command line input files") if(lane_idx() == 0) { + String8 working_directory = os_get_current_path(arena); String8List input_file_path_tasks = str8_list_copy(arena, &cmdline->inputs); for(String8Node *n = input_file_path_tasks.first; n != 0; n = n->next) { + ////////////////////////// + //- rjf: possibly relative -> absolute path + // + String8 input_file_path = path_normalized_from_string(arena, str8f(arena, "%S/%S", working_directory, n->string)); + ////////////////////////// //- rjf: do thin analysis of file // @@ -80,7 +86,7 @@ rb_thread_entry_point(void *p) RB_FileFormatFlags file_format_flags = 0; ProfScope("do thin analysis of file") { - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, n->string); + OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, input_file_path); FileProperties props = os_properties_from_file(file); //- rjf: PDB magic -> PDB input @@ -282,7 +288,7 @@ rb_thread_entry_point(void *p) String8 file_data = {0}; if(file_format != RB_FileFormat_Null) ProfScope("load recognized file") { - file_data = os_data_from_file_path(arena, n->string); + file_data = os_data_from_file_path(arena, input_file_path); } ////////////////////////// @@ -291,7 +297,7 @@ rb_thread_entry_point(void *p) if(file_format == RB_FileFormat_PE) ProfScope("PE file => generate task for PDB") { Temp scratch = scratch_begin(&arena, 1); - String8 file_path = n->string; + String8 file_path = input_file_path; PE_BinInfo pe_bin_info = pe_bin_info_from_data(scratch.arena, file_data); String8 raw_debug_dir = str8_substr(file_data, pe_bin_info.data_dir_franges[PE_DataDirectoryIndex_DEBUG]); PE_DebugInfoList debug_dir = pe_debug_info_list_from_raw_debug_dir(scratch.arena, file_data, raw_debug_dir); @@ -380,7 +386,7 @@ rb_thread_entry_point(void *p) RB_File *f = push_array(arena, RB_File, 1); f->format = file_format; f->format_flags = file_format_flags; - f->path = n->string; + f->path = input_file_path; f->data = file_data; RB_FileNode *file_n = push_array(arena, RB_FileNode, 1); file_n->v = f; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 72d937a4..5433129e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1373,7 +1373,7 @@ d2r_locset_from_attrib(Arena *arena, rdim_location_case_list_push(arena, &locset, location, range_n->v); } } else if (attrib_class != DW_AttribClass_Null) { - log_user_errorf("unexpected attrib class @ .debug_info+%llx", tag.info_off); + log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); } return locset; @@ -1395,7 +1395,7 @@ d2r_var_locset_from_tag(Arena *arena, B32 has_location = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Location); if (has_const_value && has_location) { - log_user_errorf("unexpected variable encoding @ .debug_info+%llx", tag.info_off); + log_infof("unexpected variable encoding @ .debug_info+%llx", tag.info_off); return locset; } @@ -1472,7 +1472,7 @@ d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu NotImplemented; } } else { - log_user_errorf("unexpected attrib class @ .debug_info+%llx", tag.info_off); + log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); } } @@ -1594,7 +1594,7 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *inpu NotImplemented; } } else { - log_user_errorf("unexpected attrib class @ .debug_info+%llx", tag.info_off); + log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); } } @@ -1651,7 +1651,7 @@ d2r_convert_types(Arena *arena, if (tag_node->first_child) { d2r_tag_iterator_skip_children(it); } else { - log_user_errorf("childless struct @ .debug_info+%llx", tag.info_off); + log_infof("childless struct @ .debug_info+%llx", tag.info_off); } } else { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); @@ -1670,7 +1670,7 @@ d2r_convert_types(Arena *arena, if (tag_node->first_child) { d2r_tag_iterator_skip_children(it); } else { - log_user_errorf("childless union @ .debug_info+%llx", tag.info_off); + log_infof("childless union @ .debug_info+%llx", tag.info_off); } } else { RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); @@ -1688,7 +1688,7 @@ d2r_convert_types(Arena *arena, if (tag_node->first_child) { d2r_tag_iterator_skip_children(it); } else { - log_user_errorf("childless enum @ .debug_info+%llx", tag.info_off); + log_infof("childless enum @ .debug_info+%llx", tag.info_off); } } else { RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); @@ -1716,7 +1716,7 @@ d2r_convert_types(Arena *arena, } else if (n->tag.kind == DW_TagKind_UnspecifiedParameters) { rdim_type_list_push(scratch.arena, ¶m_list, type_table->builtin_types[RDI_TypeKind_Variadic]); } else { - log_user_errorf("unexpected tag @ .debug_info+%llx", tag.info_off); + log_infof("unexpected tag @ .debug_info+%llx", tag.info_off); } } @@ -1763,7 +1763,7 @@ d2r_convert_types(Arena *arena, case 16: kind = RDI_TypeKind_ComplexF64; break; case 24: kind = RDI_TypeKind_ComplexF80; break; case 32: kind = RDI_TypeKind_ComplexF128; break; - default: log_user_errorf("unexpected size"); break; + default: log_infof("unexpected size"); break; } } break; case DW_ATE_Float: { @@ -1783,7 +1783,7 @@ d2r_convert_types(Arena *arena, switch (byte_size) { D2R_ValueType_Float_XList - default: log_user_errorf("unexpected size"); break; + default: log_infof("unexpected size"); break; } } break; case DW_ATE_Signed: { @@ -1792,7 +1792,7 @@ d2r_convert_types(Arena *arena, switch (byte_size) { D2R_ValueType_Signed_XList - default: log_user_errorf("unexpected size"); break; + default: log_infof("unexpected size"); break; } } break; do_signed_char:; @@ -1801,13 +1801,13 @@ d2r_convert_types(Arena *arena, case 1: kind = RDI_TypeKind_Char8; break; case 2: kind = RDI_TypeKind_Char16; break; case 4: kind = RDI_TypeKind_Char32; break; - default: log_user_errorf("unexpected size"); break; + default: log_infof("unexpected size"); break; } } break; case DW_ATE_Unsigned: { switch (byte_size) { D2R_ValueType_Unsigned_XList - default: log_user_errorf("unexpected size"); break; + default: log_infof("unexpected size"); break; } } break; case DW_ATE_Utf: @@ -1816,7 +1816,7 @@ d2r_convert_types(Arena *arena, case 1: kind = RDI_TypeKind_UChar8; break; case 2: kind = RDI_TypeKind_UChar16; break; case 4: kind = RDI_TypeKind_UChar32; break; - default: log_user_errorf("unexpected size"); break; + default: log_infof("unexpected size"); break; } } break; case DW_ATE_DecimalFloat: { @@ -1824,7 +1824,7 @@ d2r_convert_types(Arena *arena, case 4: kind = RDI_TypeKind_Decimal32; break; case 8: kind = RDI_TypeKind_Decimal64; break; case 16: kind = RDI_TypeKind_Decimal128; break; - default: log_user_errorf("unexpected size"); break; + default: log_infof("unexpected size"); break; } } break; case DW_ATE_ImaginaryFloat: { @@ -1851,7 +1851,7 @@ d2r_convert_types(Arena *arena, case DW_ATE_Ascii: { NotImplemented; } break; - default: log_user_errorf("unexpected base type encoding"); break; + default: log_infof("unexpected base type encoding"); break; } #undef X @@ -1968,7 +1968,7 @@ d2r_convert_types(Arena *arena, struct SubrangeNode *subrange_stack = 0; for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) { if (n->tag.kind != DW_TagKind_SubrangeType) { - log_user_errorf("[%llx] while scanning for DW_TagKind_SubrangeType found an unexpected child tag %S @ %llx\n", tag.info_off, dw_string_from_tag_kind(scratch.arena, n->tag.kind), n->tag.info_off); + log_infof("[%llx] while scanning for DW_TagKind_SubrangeType found an unexpected child tag %S @ %llx\n", tag.info_off, dw_string_from_tag_kind(scratch.arena, n->tag.kind), n->tag.info_off); goto array_type_exit; } @@ -1977,7 +1977,7 @@ d2r_convert_types(Arena *arena, if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_LowerBound)) { B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_LowerBound)); if (is_vla) { - log_user_errorf("[%llx] TODO: lower bound is a variable\n", n->tag.info_off); + log_infof("[%llx] TODO: lower bound is a variable\n", n->tag.info_off); } else { lower_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_LowerBound); } @@ -1993,7 +1993,7 @@ d2r_convert_types(Arena *arena, } else if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_UpperBound)) { B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_UpperBound)); if (is_vla) { - log_user_errorf("[%llx] TODO: upper bound is a variable\n", n->tag.info_off); + log_infof("[%llx] TODO: upper bound is a variable\n", n->tag.info_off); goto array_type_exit; } else { upper_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_UpperBound); @@ -2038,7 +2038,7 @@ d2r_convert_types(Arena *arena, d2r_tag_iterator_skip_children(it); } break; case DW_TagKind_SubrangeType: { - log_user_errorf("unexpected tag"); + log_infof("unexpected tag"); } break; case DW_TagKind_Inheritance: { DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); @@ -2050,7 +2050,7 @@ d2r_convert_types(Arena *arena, member->type = type; member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); } else { - log_user_errorf("unexpected parent tag"); + log_infof("unexpected parent tag"); } } break; } @@ -2156,7 +2156,7 @@ d2r_convert_udts(Arena *arena, member->off = off; } } else { - log_user_errorf("unexpected parent tag @ .debug_info+%llx", tag.info_off); + log_infof("unexpected parent tag @ .debug_info+%llx", tag.info_off); } } else if (tag.kind == DW_TagKind_Enumerator) { DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); @@ -2166,7 +2166,7 @@ d2r_convert_udts(Arena *arena, udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); udt_member->val = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ConstValue); } else { - log_user_errorf("unexpected parent tag @ .debug_info+%llx", tag.info_off); + log_infof("unexpected parent tag @ .debug_info+%llx", tag.info_off); } } } @@ -2279,14 +2279,14 @@ d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 imag if (lo_pc < hi_pc) { rng1u64_list_push(arena, &ranges, rng_1u64(lo_pc - image_base, hi_pc - image_base)); } else { - log_user_errorf("invalid range @ .debug_info+%llx", tag.info_off); + log_infof("invalid range @ .debug_info+%llx", tag.info_off); } } else { // invalid low and hi PC are likely are caused by an optimization pass during linking } } else if ((lo_pc_attrib->attrib_kind == DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) || (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind == DW_AttribKind_Null)) { - log_user_errorf("invalid range @ .debug_info+%llx", tag.info_off); + log_infof("invalid range @ .debug_info+%llx", tag.info_off); } } @@ -2365,7 +2365,7 @@ d2r_convert_symbols(Arena *arena, DW_TagNode *parent = d2r_tag_iterator_parent_tag_node(it); container_type = d2r_type_from_offset(type_table, parent->tag.info_off); if (container_type == 0) { - log_user_errorf("ERROR: failed to infer parent type of subprogram from .debug_info+0x%llx\n", parent->tag.info_off); + log_infof("ERROR: failed to infer parent type of subprogram from .debug_info+0x%llx\n", parent->tag.info_off); } } @@ -2403,7 +2403,7 @@ d2r_convert_symbols(Arena *arena, case DW_VirtualityKind_None: member_kind = RDI_MemberKind_Method; break; case DW_VirtualityKind_Virtual: member_kind = RDI_MemberKind_VirtualMethod; break; case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal - default: { log_user_errorf("unhandled virtuality kind"); } break; + default: { log_infof("unhandled virtuality kind"); } break; } } } @@ -2414,7 +2414,7 @@ d2r_convert_symbols(Arena *arena, member->type = type; member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); } else if (parent_tag.kind != DW_TagKind_CompileUnit) { - log_user_errorf("unexpected tag @ .debug_info+%llx", tag.info_off); + log_infof("unexpected tag @ .debug_info+%llx", tag.info_off); } it->stack->scope = root_scope; @@ -2448,7 +2448,7 @@ d2r_convert_symbols(Arena *arena, } // fill out inline site - RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &g_d2r_shared.inline_sites, D2R_INLINE_SITE_CHUNK_CAP); + RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &unit_rdi->inline_sites, D2R_INLINE_SITE_CHUNK_CAP); inline_site->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); inline_site->type = proc_type; inline_site->owner = owner; @@ -2499,7 +2499,7 @@ d2r_convert_symbols(Arena *arena, B32 is_static = rdim_is_eval_bytecode_static(bc); if (is_static) { if (!rdim_static_eval_bytecode_to_voff(bc, image_base, &voff)) { - log_user_errorf("failed to evalute byte code to virtual offset @ .debug_info+%llx", tag.info_off); + log_infof("failed to evalute byte code to virtual offset @ .debug_info+%llx", tag.info_off); } } } @@ -2512,8 +2512,8 @@ d2r_convert_symbols(Arena *arena, } RDIM_SymbolChunkList *var_chunks; U64 var_chunks_cap; - if (is_thread_var) { var_chunks = &g_d2r_shared.tvars; var_chunks_cap = D2R_TVAR_CHUNK_CAP; } - else { var_chunks = &g_d2r_shared.gvars; var_chunks_cap = D2R_GVAR_CHUNK_CAP; } + if (is_thread_var) { var_chunks = &unit_rdi->thread_variables; var_chunks_cap = D2R_TVAR_CHUNK_CAP; } + else { var_chunks = &unit_rdi->global_variables; var_chunks_cap = D2R_GVAR_CHUNK_CAP; } RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, var_chunks, var_chunks_cap); var->is_extern = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_External); @@ -2521,7 +2521,7 @@ d2r_convert_symbols(Arena *arena, var->link_name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName); var->type = type; var->container_scope = 0; - RDIM_Location loc = {.kind = RDI_LocationKind_ModuleOff, .offset = voff}; + RDIM_Location loc = {.kind = is_thread_var ? RDI_LocationKind_TLSOff : RDI_LocationKind_ModuleOff, .offset = voff}; RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; rdim_location_case_list_push(arena, &var->location_cases, loc, range); } @@ -2537,7 +2537,7 @@ d2r_convert_symbols(Arena *arena, param->location_cases = d2r_var_locset_from_tag(arena, &unit_rdi->scopes, scope, input, cu, image_base, arch, tag); } else { Assert(!"this is a local variable"); - log_user_errorf(".debug_info+%llx out of scope formal parameter", tag.info_off); + log_infof(".debug_info+%llx out of scope formal parameter", tag.info_off); } } break; case DW_TagKind_LexicalBlock: { @@ -2647,7 +2647,7 @@ d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &version), unit_cursor, exit); if (version != DW_Version_2) { - log_user_errorf("unknown .debug_aranges version %u @ 0x%llx", version, range_n->v.min); + log_infof("unknown .debug_aranges version %u @ 0x%llx", version, range_n->v.min); continue; } @@ -2678,7 +2678,7 @@ d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) if (address == 0) { continue; } if (address < image_base) { - log_user_errorf("invalid address 0x%llx in .debug_aranges+%llx", range_n->v.min + unit_cursor); + log_infof("invalid address 0x%llx in .debug_aranges+%llx", range_n->v.min + unit_cursor); continue; } @@ -3054,14 +3054,14 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); String8 cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer); DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language); - + // init type table D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); type_table->ht = hash_table_init(comp_temp.arena, 0x4000); type_table->types = &g_d2r_shared.types; type_table->type_chunk_cap = D2R_TYPE_CHUNK_CAP; type_table->builtin_types = builtin_types; - + // convert compile unit RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &g_d2r_shared.units, D2R_UNIT_CHUNK_CAP); { @@ -3084,7 +3084,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) unit->line_table = cu_line_tables_rdi[cu_idx]; unit->voff_ranges = cu_voff_ranges; } - + // convert debug info d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch, tag_tree.root); d2r_convert_udts(arena, type_table, &input, cu, cu_lang, tag_tree.root); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 63ccf208..20941dee 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -40,9 +40,6 @@ typedef struct D2R_Shared RDIM_TypeChunkList types; RDIM_SrcFileChunkList src_files; RDIM_LineTableChunkList line_tables; - RDIM_SymbolChunkList gvars; - RDIM_SymbolChunkList tvars; - RDIM_InlineSiteChunkList inline_sites; } D2R_Shared; //////////////////////////////// From 2623141fd47fe9388346058ff0262696f8dc8926 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Apr 2026 14:25:50 -0700 Subject: [PATCH 454/850] checkpoint on multi-lane / simplified dwarf parsing/conversion; fix incorrect assumption of relative in radbin --- src/dwarf/dwarf.h | 2604 ++++++++++++------------- src/dwarf/dwarf_coff.c | 4 +- src/dwarf/dwarf_coff.h | 2 +- src/dwarf/dwarf_dump.c | 678 +++---- src/dwarf/dwarf_dump.h | 26 +- src/dwarf/dwarf_elf.c | 4 +- src/dwarf/dwarf_elf.h | 2 +- src/dwarf/dwarf_inc.c | 1 + src/dwarf/dwarf_inc.h | 1 + src/dwarf/dwarf_parse.c | 1120 +++++------ src/dwarf/dwarf_parse.h | 98 +- src/dwarf/dwarf_parse_2.c | 2 + src/dwarf/dwarf_parse_2.h | 25 + src/dwarf/dwarf_writer.c | 1012 +++++----- src/dwarf/dwarf_writer.h | 16 +- src/lib_rdi/rdi.c | 1 + src/lib_rdi/rdi.h | 2 + src/radbin/radbin.c | 130 +- src/radbin/radbin_main.c | 2 + src/rdi/rdi.mdesk | 1 + src/rdi_from_dwarf/rdi_from_dwarf.c | 28 +- src/rdi_from_dwarf/rdi_from_dwarf.h | 26 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 176 +- src/rdi_from_dwarf/rdi_from_dwarf_2.h | 1 + src/torture/torture_dwarf.c | 14 +- 25 files changed, 3154 insertions(+), 2822 deletions(-) diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index f714ce40..b0ec11ac 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -39,24 +39,24 @@ typedef enum DW_Format #define DW_SentinelFromSize(address_size) ((address_size) == 4 ? max_U32 : (address_size) == 8 ? max_U64 : 0) #define DW_SectionKind_XList \ - X(Null, "", "", "" ) \ - X(Abbrev, ".debug_abbrev", "__debug_abbrev", ".debug_abbrev.dwo" ) \ - X(ARanges, ".debug_aranges", "__debug_aranges", ".debug_aranges.dwo" ) \ - X(Frame, ".debug_frame", "__debug_frame", ".debug_frame.dwo" ) \ - X(Info, ".debug_info", "__debug_info", ".debug_info.dwo" ) \ - X(Line, ".debug_line", "__debug_line", ".debug_line.dwo" ) \ - X(Loc, ".debug_loc", "__debug_loc", ".debug_loc.dwo" ) \ - X(MacInfo, ".debug_macinfo", "__debug_macinfo", ".debug_macinfo.dwo" ) \ - X(PubNames, ".debug_pubnames", "__debug_pubnames", ".debug_pubnames.dwo" ) \ - X(PubTypes, ".debug_pubtypes", "__debug_pubtypes", ".debug_pubtypes.dwo" ) \ - X(Ranges, ".debug_ranges", "__debug_ranges", ".debug_ranges.dwo" ) \ - X(Str, ".debug_str", "__debug_str", ".debug_str.dwo" ) \ - X(Addr, ".debug_addr", "__debug_addr", ".debug_addr.dwo" ) \ - X(LocLists, ".debug_loclists", "__debug_loclists", ".debug_loclists.dwo" ) \ - X(RngLists, ".debug_rnglists", "__debug_rnglists", ".debug_rnglists.dwo" ) \ - X(StrOffsets, ".debug_str_offsets", "__debug_str_offsets", ".debug_str_offsets.dwo") \ - X(LineStr, ".debug_line_str", "__debug_line_str", ".debug_line_str.dwo" ) \ - X(Names, ".debug_names", "__debug_names", ".debug_names.dwo" ) +X(Null, "", "", "" ) \ +X(Abbrev, ".debug_abbrev", "__debug_abbrev", ".debug_abbrev.dwo" ) \ +X(ARanges, ".debug_aranges", "__debug_aranges", ".debug_aranges.dwo" ) \ +X(Frame, ".debug_frame", "__debug_frame", ".debug_frame.dwo" ) \ +X(Info, ".debug_info", "__debug_info", ".debug_info.dwo" ) \ +X(Line, ".debug_line", "__debug_line", ".debug_line.dwo" ) \ +X(Loc, ".debug_loc", "__debug_loc", ".debug_loc.dwo" ) \ +X(MacInfo, ".debug_macinfo", "__debug_macinfo", ".debug_macinfo.dwo" ) \ +X(PubNames, ".debug_pubnames", "__debug_pubnames", ".debug_pubnames.dwo" ) \ +X(PubTypes, ".debug_pubtypes", "__debug_pubtypes", ".debug_pubtypes.dwo" ) \ +X(Ranges, ".debug_ranges", "__debug_ranges", ".debug_ranges.dwo" ) \ +X(Str, ".debug_str", "__debug_str", ".debug_str.dwo" ) \ +X(Addr, ".debug_addr", "__debug_addr", ".debug_addr.dwo" ) \ +X(LocLists, ".debug_loclists", "__debug_loclists", ".debug_loclists.dwo" ) \ +X(RngLists, ".debug_rnglists", "__debug_rnglists", ".debug_rnglists.dwo" ) \ +X(StrOffsets, ".debug_str_offsets", "__debug_str_offsets", ".debug_str_offsets.dwo") \ +X(LineStr, ".debug_line_str", "__debug_line_str", ".debug_line_str.dwo" ) \ +X(Names, ".debug_names", "__debug_names", ".debug_names.dwo" ) typedef U64 DW_SectionKind; typedef enum DW_SectionKindEnum @@ -64,7 +64,7 @@ typedef enum DW_SectionKindEnum #define X(_N,...) DW_Section_##_N, DW_SectionKind_XList #undef X - DW_Section_Count + DW_Section_COUNT } DW_SectionKindEnum; typedef U32 DW_SectionFlags; @@ -77,48 +77,48 @@ enum }; #define DW_Language_XList \ - X(Null, 0x00) \ - X(C89, 0x01) \ - X(C, 0x02) \ - X(Ada83, 0x03) \ - X(CPlusPlus, 0x04) \ - X(Cobol74, 0x05) \ - X(Cobol85, 0x06) \ - X(Fortran77, 0x07) \ - X(Fortran90, 0x08) \ - X(Pascal83, 0x09) \ - X(Modula2, 0x0A) \ - X(Java, 0x0B) \ - X(C99, 0x0C) \ - X(Ada95, 0x0D) \ - X(Fortran95, 0x0E) \ - X(PLI, 0x0F) \ - X(ObjC, 0x10) \ - X(ObjCPlusPlus, 0x11) \ - X(UPC, 0x12) \ - X(D, 0x13) \ - X(Python, 0x14) \ - X(OpenCL, 0x15) \ - X(Go, 0x16) \ - X(Modula3, 0x17) \ - X(Haskell, 0x18) \ - X(CPlusPlus03, 0x19) \ - X(CPlusPlus11, 0x1a) \ - X(OCaml, 0x1b) \ - X(Rust, 0x1c) \ - X(C11, 0x1d) \ - X(Swift, 0x1e) \ - X(Julia, 0x1f) \ - X(Dylan, 0x20) \ - X(CPlusPlus14, 0x21) \ - X(Fortran03, 0x22) \ - X(Fortran08, 0x23) \ - X(RenderScript, 0x24) \ - X(BLISS, 0x25) \ - X(MipsAssembler, 0x8001) \ - X(GoogleRenderScript, 0x8E57) \ - X(SunAssembler, 0x9001) \ - X(BorlandDelphi, 0xB000) +X(Null, 0x00) \ +X(C89, 0x01) \ +X(C, 0x02) \ +X(Ada83, 0x03) \ +X(CPlusPlus, 0x04) \ +X(Cobol74, 0x05) \ +X(Cobol85, 0x06) \ +X(Fortran77, 0x07) \ +X(Fortran90, 0x08) \ +X(Pascal83, 0x09) \ +X(Modula2, 0x0A) \ +X(Java, 0x0B) \ +X(C99, 0x0C) \ +X(Ada95, 0x0D) \ +X(Fortran95, 0x0E) \ +X(PLI, 0x0F) \ +X(ObjC, 0x10) \ +X(ObjCPlusPlus, 0x11) \ +X(UPC, 0x12) \ +X(D, 0x13) \ +X(Python, 0x14) \ +X(OpenCL, 0x15) \ +X(Go, 0x16) \ +X(Modula3, 0x17) \ +X(Haskell, 0x18) \ +X(CPlusPlus03, 0x19) \ +X(CPlusPlus11, 0x1a) \ +X(OCaml, 0x1b) \ +X(Rust, 0x1c) \ +X(C11, 0x1d) \ +X(Swift, 0x1e) \ +X(Julia, 0x1f) \ +X(Dylan, 0x20) \ +X(CPlusPlus14, 0x21) \ +X(Fortran03, 0x22) \ +X(Fortran08, 0x23) \ +X(RenderScript, 0x24) \ +X(BLISS, 0x25) \ +X(MipsAssembler, 0x8001) \ +X(GoogleRenderScript, 0x8E57) \ +X(SunAssembler, 0x9001) \ +X(BorlandDelphi, 0xB000) typedef U32 DW_Language; typedef enum DW_LanguageEnum @@ -131,10 +131,10 @@ typedef enum DW_LanguageEnum } DW_LanguageEnum; #define DW_Inl_XList \ - X(NotInlined, 0x00) \ - X(Inlined, 0x01) \ - X(DeclaredNotInlined, 0x02) \ - X(DeclaredInlined, 0x03) +X(NotInlined, 0x00) \ +X(Inlined, 0x01) \ +X(DeclaredNotInlined, 0x02) \ +X(DeclaredInlined, 0x03) typedef U32 DW_InlKind; typedef enum DW_InlKindEnum @@ -145,19 +145,19 @@ typedef enum DW_InlKindEnum } DW_InlKindEnum; #define DW_StdOpcode_XList \ - X(ExtendedOpcode, 0x00) \ - X(Copy, 0x01) \ - X(AdvancePc, 0x02) \ - X(AdvanceLine, 0x03) \ - X(SetFile, 0x04) \ - X(SetColumn, 0x05) \ - X(NegateStmt, 0x06) \ - X(SetBasicBlock, 0x07) \ - X(ConstAddPc, 0x08) \ - X(FixedAdvancePc, 0x09) \ - X(SetPrologueEnd, 0x0A) \ - X(SetEpilogueBegin, 0x0B) \ - X(SetIsa, 0x0C) +X(ExtendedOpcode, 0x00) \ +X(Copy, 0x01) \ +X(AdvancePc, 0x02) \ +X(AdvanceLine, 0x03) \ +X(SetFile, 0x04) \ +X(SetColumn, 0x05) \ +X(NegateStmt, 0x06) \ +X(SetBasicBlock, 0x07) \ +X(ConstAddPc, 0x08) \ +X(FixedAdvancePc, 0x09) \ +X(SetPrologueEnd, 0x0A) \ +X(SetEpilogueBegin, 0x0B) \ +X(SetIsa, 0x0C) typedef U8 DW_StdOpcode; typedef enum DW_StdOpcodeEnum @@ -169,13 +169,13 @@ typedef enum DW_StdOpcodeEnum } DW_StdOpcodeEnum; #define DW_ExtOpcode_XList \ - X(Undefined, 0x00) \ - X(EndSequence, 0x01) \ - X(SetAddress, 0x02) \ - X(DefineFile, 0x03) \ - X(SetDiscriminator, 0x04) \ - X(UserLo, 0x80) \ - X(UserHi, 0xff) +X(Undefined, 0x00) \ +X(EndSequence, 0x01) \ +X(SetAddress, 0x02) \ +X(DefineFile, 0x03) \ +X(SetDiscriminator, 0x04) \ +X(UserLo, 0x80) \ +X(UserHi, 0xff) typedef U8 DW_ExtOpcode; typedef enum DW_ExtOpcodeEnum @@ -186,10 +186,10 @@ typedef enum DW_ExtOpcodeEnum } DW_ExtOpcodeEnum; #define DW_IDCaseKind_XList \ - X(CaseSensitive, 0x00) \ - X(UpCase, 0x01) \ - X(DownCase, 0x02) \ - X(CaseInsensitive, 0x03) +X(CaseSensitive, 0x00) \ +X(UpCase, 0x01) \ +X(DownCase, 0x02) \ +X(CaseInsensitive, 0x03) typedef U64 DW_IDCaseKind; typedef enum DW_IDCaseKindEnum @@ -200,9 +200,9 @@ typedef enum DW_IDCaseKindEnum } DW_IDCaseKindEnum; #define DW_Vis_XList \ - X(Local, 0x01) \ - X(Exported, 0x02) \ - X(Qualified, 0x03) +X(Local, 0x01) \ +X(Exported, 0x02) \ +X(Qualified, 0x03) typedef enum DW_Vis { #define X(_N, _ID) DW_Vis_##_N = _ID, @@ -211,80 +211,80 @@ typedef enum DW_Vis } DW_Vis; #define DW_TagKind_V3_XList \ - X(ArrayType, 0x01) \ - X(ClassType, 0x02) \ - X(EntryPoint, 0x03) \ - X(EnumerationType, 0x04) \ - X(FormalParameter, 0x05) \ - X(ImportedDeclaration, 0x08) \ - X(Label, 0x0a) \ - X(LexicalBlock, 0x0b) \ - X(Member, 0x0d) \ - X(PointerType, 0x0f) \ - X(ReferenceType, 0x10) \ - X(CompileUnit, 0x11) \ - X(StringType, 0x12) \ - X(StructureType, 0x13) \ - X(SubroutineType, 0x15) \ - X(Typedef, 0x16) \ - X(UnionType, 0x17) \ - X(UnspecifiedParameters, 0x18) \ - X(Variant, 0x19) \ - X(CommonBlock, 0x1a) \ - X(CommonInclusion, 0x1b) \ - X(Inheritance, 0x1c) \ - X(InlinedSubroutine, 0x1d) \ - X(Module, 0x1e) \ - X(PtrToMemberType, 0x1f) \ - X(SetType, 0x20) \ - X(SubrangeType, 0x21) \ - X(WithStmt, 0x22) \ - X(AccessDeclaration, 0x23) \ - X(BaseType, 0x24) \ - X(CatchBlock, 0x25) \ - X(ConstType, 0x26) \ - X(Constant, 0x27) \ - X(Enumerator, 0x28) \ - X(FileType, 0x29) \ - X(Friend, 0x2a) \ - X(NameList, 0x2b) \ - X(NameListItem, 0x2c) \ - X(PackedType, 0x2d) \ - X(SubProgram, 0x2e) \ - X(TemplateTypeParameter, 0x2f) \ - X(TemplateValueParameter, 0x30) \ - X(ThrownType, 0x31) \ - X(TryBlock, 0x32) \ - X(VariantPart, 0x33) \ - X(Variable, 0x34) \ - X(VolatileType, 0x35) \ - X(DwarfProcedure, 0x36) \ - X(RestrictType, 0x37) \ - X(InterfaceType, 0x38) \ - X(Namespace, 0x39) \ - X(ImportedModule, 0x3a) \ - X(UnspecifiedType, 0x3b) \ - X(PartialUnit, 0x3c) \ - X(ImportedUnit, 0x3d) \ - X(Condition, 0x3f) \ - X(SharedType, 0x40) +X(ArrayType, 0x01) \ +X(ClassType, 0x02) \ +X(EntryPoint, 0x03) \ +X(EnumerationType, 0x04) \ +X(FormalParameter, 0x05) \ +X(ImportedDeclaration, 0x08) \ +X(Label, 0x0a) \ +X(LexicalBlock, 0x0b) \ +X(Member, 0x0d) \ +X(PointerType, 0x0f) \ +X(ReferenceType, 0x10) \ +X(CompileUnit, 0x11) \ +X(StringType, 0x12) \ +X(StructureType, 0x13) \ +X(SubroutineType, 0x15) \ +X(Typedef, 0x16) \ +X(UnionType, 0x17) \ +X(UnspecifiedParameters, 0x18) \ +X(Variant, 0x19) \ +X(CommonBlock, 0x1a) \ +X(CommonInclusion, 0x1b) \ +X(Inheritance, 0x1c) \ +X(InlinedSubroutine, 0x1d) \ +X(Module, 0x1e) \ +X(PtrToMemberType, 0x1f) \ +X(SetType, 0x20) \ +X(SubrangeType, 0x21) \ +X(WithStmt, 0x22) \ +X(AccessDeclaration, 0x23) \ +X(BaseType, 0x24) \ +X(CatchBlock, 0x25) \ +X(ConstType, 0x26) \ +X(Constant, 0x27) \ +X(Enumerator, 0x28) \ +X(FileType, 0x29) \ +X(Friend, 0x2a) \ +X(NameList, 0x2b) \ +X(NameListItem, 0x2c) \ +X(PackedType, 0x2d) \ +X(SubProgram, 0x2e) \ +X(TemplateTypeParameter, 0x2f) \ +X(TemplateValueParameter, 0x30) \ +X(ThrownType, 0x31) \ +X(TryBlock, 0x32) \ +X(VariantPart, 0x33) \ +X(Variable, 0x34) \ +X(VolatileType, 0x35) \ +X(DwarfProcedure, 0x36) \ +X(RestrictType, 0x37) \ +X(InterfaceType, 0x38) \ +X(Namespace, 0x39) \ +X(ImportedModule, 0x3a) \ +X(UnspecifiedType, 0x3b) \ +X(PartialUnit, 0x3c) \ +X(ImportedUnit, 0x3d) \ +X(Condition, 0x3f) \ +X(SharedType, 0x40) #define DW_TagKind_V5_XList \ - X(TypeUnit, 0x41) \ - X(RValueReferenceType, 0x42) \ - X(TemplateAlias, 0x43) \ - X(CoarrayType, 0x44) \ - X(GenericSubrange, 0x45) \ - X(DynamicType, 0x46) \ - X(AtomicType, 0x47) \ - X(CallSite, 0x48) \ - X(CallSiteParameter, 0x49) \ - X(SkeletonUnit, 0x4A) \ - X(ImmutableType, 0x4B) +X(TypeUnit, 0x41) \ +X(RValueReferenceType, 0x42) \ +X(TemplateAlias, 0x43) \ +X(CoarrayType, 0x44) \ +X(GenericSubrange, 0x45) \ +X(DynamicType, 0x46) \ +X(AtomicType, 0x47) \ +X(CallSite, 0x48) \ +X(CallSiteParameter, 0x49) \ +X(SkeletonUnit, 0x4A) \ +X(ImmutableType, 0x4B) #define DW_TagKind_GNU_XList \ - X(GNU_CallSite, 0x4109) \ - X(GNU_CallSiteParameter, 0x410a) +X(GNU_CallSite, 0x4109) \ +X(GNU_CallSiteParameter, 0x410a) typedef U64 DW_TagKind; typedef enum DW_TagKindEnum @@ -292,8 +292,8 @@ typedef enum DW_TagKindEnum DW_TagKind_Null, #define X(_N,_ID) DW_TagKind_##_N = _ID, DW_TagKind_V3_XList - DW_TagKind_V5_XList - DW_TagKind_GNU_XList + DW_TagKind_V5_XList + DW_TagKind_GNU_XList #undef X DW_TagKind_UserLo = 0x4080, DW_TagKind_UserHi = 0xffff @@ -302,35 +302,35 @@ typedef enum DW_TagKindEnum //- Attrib Class Encodings #define DW_AttribClass_V3_XList \ - X(Null, 0) \ - X(Undefined, 1) \ - X(Address, 2) \ - X(Block, 3) \ - X(Const, 4) \ - X(ExprLoc, 5) \ - X(Flag, 6) \ - X(LinePtr, 7) \ - X(LocListPtr, 8) \ - X(MacPtr, 9) \ - X(RngListPtr, 10) \ - X(Reference, 11) \ - X(String, 12) +X(Null, 0) \ +X(Undefined, 1) \ +X(Address, 2) \ +X(Block, 3) \ +X(Const, 4) \ +X(ExprLoc, 5) \ +X(Flag, 6) \ +X(LinePtr, 7) \ +X(LocListPtr, 8) \ +X(MacPtr, 9) \ +X(RngListPtr, 10) \ +X(Reference, 11) \ +X(String, 12) #define DW_AttribClass_V4_XList \ - X(LocList, 13) \ - X(RngList, 14) +X(LocList, 13) \ +X(RngList, 14) #define DW_AttribClass_V5_XList \ - X(StrOffsetsPtr, 15) \ - X(AddrPtr, 16) +X(StrOffsetsPtr, 15) \ +X(AddrPtr, 16) typedef U32 DW_AttribClass; typedef enum DW_AttribClassEnum { #define X(_N,_ID) DW_AttribClass_##_N = (1 << _ID), DW_AttribClass_V3_XList - DW_AttribClass_V4_XList - DW_AttribClass_V5_XList + DW_AttribClass_V4_XList + DW_AttribClass_V5_XList #undef X DW_AttribClass_AllPtrs = DW_AttribClass_AddrPtr|DW_AttribClass_LinePtr|DW_AttribClass_LocList|DW_AttribClass_LocListPtr| DW_AttribClass_MacPtr| DW_AttribClass_RngList| DW_AttribClass_RngListPtr| DW_AttribClass_StrOffsetsPtr, } DW_AttribClassEnum; @@ -338,172 +338,172 @@ typedef enum DW_AttribClassEnum //- Form Encodings #define DW_Form_V2_XList \ - X(Addr, 0x1) \ - X(Block2, 0x3) \ - X(Block4, 0x4) \ - X(Data2, 0x5) \ - X(Data4, 0x6) \ - X(Data8, 0x7) \ - X(String, 0x8) \ - X(Block, 0x9) \ - X(Block1, 0xa) \ - X(Data1, 0xb) \ - X(Flag, 0xc) \ - X(SData, 0xd) \ - X(Strp, 0xe) \ - X(UData, 0xf) \ - X(RefAddr, 0x10) \ - X(Ref1, 0x11) \ - X(Ref2, 0x12) \ - X(Ref4, 0x13) \ - X(Ref8, 0x14) \ - X(RefUData, 0x15) \ - X(Indirect, 0x16) +X(Addr, 0x1) \ +X(Block2, 0x3) \ +X(Block4, 0x4) \ +X(Data2, 0x5) \ +X(Data4, 0x6) \ +X(Data8, 0x7) \ +X(String, 0x8) \ +X(Block, 0x9) \ +X(Block1, 0xa) \ +X(Data1, 0xb) \ +X(Flag, 0xc) \ +X(SData, 0xd) \ +X(Strp, 0xe) \ +X(UData, 0xf) \ +X(RefAddr, 0x10) \ +X(Ref1, 0x11) \ +X(Ref2, 0x12) \ +X(Ref4, 0x13) \ +X(Ref8, 0x14) \ +X(RefUData, 0x15) \ +X(Indirect, 0x16) #define DW_Form_AttribClass_V2_XList \ - X(Addr, DW_AttribClass_Address) \ - X(Block2, DW_AttribClass_Block) \ - X(Block4, DW_AttribClass_Block) \ - X(Data2, DW_AttribClass_Const) \ - X(Data4, DW_AttribClass_Const) \ - X(Data8, DW_AttribClass_Const) \ - X(String, DW_AttribClass_String) \ - X(Block, DW_AttribClass_Block) \ - X(Block1, DW_AttribClass_Block) \ - X(Data1, DW_AttribClass_Const) \ - X(Flag, DW_AttribClass_Flag) \ - X(SData, DW_AttribClass_Const) \ - X(Strp, DW_AttribClass_String) \ - X(UData, DW_AttribClass_Const) \ - X(RefAddr, DW_AttribClass_Reference) \ - X(Ref1, DW_AttribClass_Reference) \ - X(Ref2, DW_AttribClass_Reference) \ - X(Ref4, DW_AttribClass_Reference) \ - X(Ref8, DW_AttribClass_Reference) \ - X(RefUData, DW_AttribClass_Reference) \ - X(Indirect, DW_AttribClass_Null) +X(Addr, DW_AttribClass_Address) \ +X(Block2, DW_AttribClass_Block) \ +X(Block4, DW_AttribClass_Block) \ +X(Data2, DW_AttribClass_Const) \ +X(Data4, DW_AttribClass_Const) \ +X(Data8, DW_AttribClass_Const) \ +X(String, DW_AttribClass_String) \ +X(Block, DW_AttribClass_Block) \ +X(Block1, DW_AttribClass_Block) \ +X(Data1, DW_AttribClass_Const) \ +X(Flag, DW_AttribClass_Flag) \ +X(SData, DW_AttribClass_Const) \ +X(Strp, DW_AttribClass_String) \ +X(UData, DW_AttribClass_Const) \ +X(RefAddr, DW_AttribClass_Reference) \ +X(Ref1, DW_AttribClass_Reference) \ +X(Ref2, DW_AttribClass_Reference) \ +X(Ref4, DW_AttribClass_Reference) \ +X(Ref8, DW_AttribClass_Reference) \ +X(RefUData, DW_AttribClass_Reference) \ +X(Indirect, DW_AttribClass_Null) #define DW_Form_V4_XList \ - X(SecOffset, 0x17) \ - X(ExprLoc, 0x18) \ - X(FlagPresent, 0x19) \ - X(RefSig8, 0x20) +X(SecOffset, 0x17) \ +X(ExprLoc, 0x18) \ +X(FlagPresent, 0x19) \ +X(RefSig8, 0x20) #define DW_Form_AttribClass_V4_XList \ - X(Addr, DW_AttribClass_Address) \ - X(Block2, DW_AttribClass_Block) \ - X(Block4, DW_AttribClass_Block) \ - X(Data2, DW_AttribClass_Const) \ - X(Data4, DW_AttribClass_Const) \ - X(Data8, DW_AttribClass_Const) \ - X(String, DW_AttribClass_String) \ - X(Block, DW_AttribClass_Block) \ - X(Block1, DW_AttribClass_Block) \ - X(Data1, DW_AttribClass_Const) \ - X(Flag, DW_AttribClass_Flag) \ - X(SData, DW_AttribClass_Const) \ - X(Strp, DW_AttribClass_String) \ - X(UData, DW_AttribClass_Const) \ - X(RefAddr, DW_AttribClass_Reference) \ - X(Ref1, DW_AttribClass_Reference) \ - X(Ref2, DW_AttribClass_Reference) \ - X(Ref4, DW_AttribClass_Reference) \ - X(Ref8, DW_AttribClass_Reference) \ - X(RefUData, DW_AttribClass_Reference) \ - X(Indirect, DW_AttribClass_Null) \ - X(SecOffset, DW_AttribClass_LinePtr|DW_AttribClass_LocListPtr|DW_AttribClass_MacPtr|DW_AttribClass_RngListPtr) \ - X(ExprLoc, DW_AttribClass_ExprLoc) \ - X(FlagPresent, DW_AttribClass_Flag) \ - X(RefSig8, DW_AttribClass_Reference) +X(Addr, DW_AttribClass_Address) \ +X(Block2, DW_AttribClass_Block) \ +X(Block4, DW_AttribClass_Block) \ +X(Data2, DW_AttribClass_Const) \ +X(Data4, DW_AttribClass_Const) \ +X(Data8, DW_AttribClass_Const) \ +X(String, DW_AttribClass_String) \ +X(Block, DW_AttribClass_Block) \ +X(Block1, DW_AttribClass_Block) \ +X(Data1, DW_AttribClass_Const) \ +X(Flag, DW_AttribClass_Flag) \ +X(SData, DW_AttribClass_Const) \ +X(Strp, DW_AttribClass_String) \ +X(UData, DW_AttribClass_Const) \ +X(RefAddr, DW_AttribClass_Reference) \ +X(Ref1, DW_AttribClass_Reference) \ +X(Ref2, DW_AttribClass_Reference) \ +X(Ref4, DW_AttribClass_Reference) \ +X(Ref8, DW_AttribClass_Reference) \ +X(RefUData, DW_AttribClass_Reference) \ +X(Indirect, DW_AttribClass_Null) \ +X(SecOffset, DW_AttribClass_LinePtr|DW_AttribClass_LocListPtr|DW_AttribClass_MacPtr|DW_AttribClass_RngListPtr) \ +X(ExprLoc, DW_AttribClass_ExprLoc) \ +X(FlagPresent, DW_AttribClass_Flag) \ +X(RefSig8, DW_AttribClass_Reference) #define DW_Form_V5_XList \ - X(Strx, 0x1a) \ - X(Addrx, 0x1b) \ - X(RefSup4, 0x1c) \ - X(StrpSup, 0x1d) \ - X(Data16, 0x1e) \ - X(LineStrp, 0x1f) \ - X(ImplicitConst, 0x21) \ - X(LocListx, 0x22) \ - X(RngListx, 0x23) \ - X(RefSup8, 0x24) \ - X(Strx1, 0x25) \ - X(Strx2, 0x26) \ - X(Strx3, 0x27) \ - X(Strx4, 0x28) \ - X(Addrx1, 0x29) \ - X(Addrx2, 0x2a) \ - X(Addrx3, 0x2b) \ - X(Addrx4, 0x2c) +X(Strx, 0x1a) \ +X(Addrx, 0x1b) \ +X(RefSup4, 0x1c) \ +X(StrpSup, 0x1d) \ +X(Data16, 0x1e) \ +X(LineStrp, 0x1f) \ +X(ImplicitConst, 0x21) \ +X(LocListx, 0x22) \ +X(RngListx, 0x23) \ +X(RefSup8, 0x24) \ +X(Strx1, 0x25) \ +X(Strx2, 0x26) \ +X(Strx3, 0x27) \ +X(Strx4, 0x28) \ +X(Addrx1, 0x29) \ +X(Addrx2, 0x2a) \ +X(Addrx3, 0x2b) \ +X(Addrx4, 0x2c) #define DW_Form_AttribClass_V5_XList \ - X(Addr, DW_AttribClass_Address) \ - X(Block2, DW_AttribClass_Block) \ - X(Block4, DW_AttribClass_Block) \ - X(Data2, DW_AttribClass_Const) \ - X(Data4, DW_AttribClass_Const) \ - X(Data8, DW_AttribClass_Const) \ - X(String, DW_AttribClass_String) \ - X(Block, DW_AttribClass_Block) \ - X(Block1, DW_AttribClass_Block) \ - X(Data1, DW_AttribClass_Const) \ - X(Flag, DW_AttribClass_Flag) \ - X(SData, DW_AttribClass_Const) \ - X(Strp, DW_AttribClass_String) \ - X(UData, DW_AttribClass_Const) \ - X(RefAddr, DW_AttribClass_Reference) \ - X(Ref1, DW_AttribClass_Reference) \ - X(Ref2, DW_AttribClass_Reference) \ - X(Ref4, DW_AttribClass_Reference) \ - X(Ref8, DW_AttribClass_Reference) \ - X(RefUData, DW_AttribClass_Reference) \ - X(Indirect, DW_AttribClass_Null) \ - X(SecOffset, DW_AttribClass_AllPtrs) \ - X(ExprLoc, DW_AttribClass_ExprLoc) \ - X(FlagPresent, DW_AttribClass_Flag) \ - X(RefSig8, DW_AttribClass_Reference) \ - X(Strx, DW_AttribClass_String) \ - X(Addrx, DW_AttribClass_Address) \ - X(RefSup4, DW_AttribClass_Reference) \ - X(StrpSup, DW_AttribClass_String) \ - X(Data16, DW_AttribClass_Const) \ - X(LineStrp, DW_AttribClass_String) \ - X(ImplicitConst, DW_AttribClass_Const) \ - X(LocListx, DW_AttribClass_LocListPtr) \ - X(RngListx, DW_AttribClass_RngList) \ - X(RefSup8, DW_AttribClass_Reference) \ - X(Strx1, DW_AttribClass_String) \ - X(Strx2, DW_AttribClass_String) \ - X(Strx3, DW_AttribClass_String) \ - X(Strx4, DW_AttribClass_String) \ - X(Addrx1, DW_AttribClass_Address) \ - X(Addrx2, DW_AttribClass_Address) \ - X(Addrx3, DW_AttribClass_Address) \ - X(Addrx4, DW_AttribClass_Address) +X(Addr, DW_AttribClass_Address) \ +X(Block2, DW_AttribClass_Block) \ +X(Block4, DW_AttribClass_Block) \ +X(Data2, DW_AttribClass_Const) \ +X(Data4, DW_AttribClass_Const) \ +X(Data8, DW_AttribClass_Const) \ +X(String, DW_AttribClass_String) \ +X(Block, DW_AttribClass_Block) \ +X(Block1, DW_AttribClass_Block) \ +X(Data1, DW_AttribClass_Const) \ +X(Flag, DW_AttribClass_Flag) \ +X(SData, DW_AttribClass_Const) \ +X(Strp, DW_AttribClass_String) \ +X(UData, DW_AttribClass_Const) \ +X(RefAddr, DW_AttribClass_Reference) \ +X(Ref1, DW_AttribClass_Reference) \ +X(Ref2, DW_AttribClass_Reference) \ +X(Ref4, DW_AttribClass_Reference) \ +X(Ref8, DW_AttribClass_Reference) \ +X(RefUData, DW_AttribClass_Reference) \ +X(Indirect, DW_AttribClass_Null) \ +X(SecOffset, DW_AttribClass_AllPtrs) \ +X(ExprLoc, DW_AttribClass_ExprLoc) \ +X(FlagPresent, DW_AttribClass_Flag) \ +X(RefSig8, DW_AttribClass_Reference) \ +X(Strx, DW_AttribClass_String) \ +X(Addrx, DW_AttribClass_Address) \ +X(RefSup4, DW_AttribClass_Reference) \ +X(StrpSup, DW_AttribClass_String) \ +X(Data16, DW_AttribClass_Const) \ +X(LineStrp, DW_AttribClass_String) \ +X(ImplicitConst, DW_AttribClass_Const) \ +X(LocListx, DW_AttribClass_LocListPtr) \ +X(RngListx, DW_AttribClass_RngList) \ +X(RefSup8, DW_AttribClass_Reference) \ +X(Strx1, DW_AttribClass_String) \ +X(Strx2, DW_AttribClass_String) \ +X(Strx3, DW_AttribClass_String) \ +X(Strx4, DW_AttribClass_String) \ +X(Addrx1, DW_AttribClass_Address) \ +X(Addrx2, DW_AttribClass_Address) \ +X(Addrx3, DW_AttribClass_Address) \ +X(Addrx4, DW_AttribClass_Address) #define DW_Form_GNU_XList \ - X(GNU_AddrIndex, 0x1f01) \ - X(GNU_StrIndex, 0x1f02) \ - X(GNU_RefAlt, 0x1f20) \ - X(GNU_StrpAlt, 0x1f21) +X(GNU_AddrIndex, 0x1f01) \ +X(GNU_StrIndex, 0x1f02) \ +X(GNU_RefAlt, 0x1f20) \ +X(GNU_StrpAlt, 0x1f21) #define DW_Form_AttribClass_GNU_XList \ - X(GNU_AddrIndex, DW_AttribClass_Undefined) \ - X(GNU_StrIndex, DW_AttribClass_Undefined) \ - X(GNU_RefAlt, DW_AttribClass_Undefined) \ - X(GNU_StrpAlt, DW_AttribClass_String) +X(GNU_AddrIndex, DW_AttribClass_Undefined) \ +X(GNU_StrIndex, DW_AttribClass_Undefined) \ +X(GNU_RefAlt, DW_AttribClass_Undefined) \ +X(GNU_StrpAlt, DW_AttribClass_String) typedef U64 DW_FormKind; -typedef enum DW_FormEnum +typedef enum DW_FormKindEnum { DW_Form_Null, #define X(_N, _ID) DW_Form_##_N = _ID, DW_Form_V2_XList - DW_Form_V4_XList - DW_Form_V5_XList - DW_Form_GNU_XList + DW_Form_V4_XList + DW_Form_V5_XList + DW_Form_GNU_XList #undef X -} DW_FormEnum; +} DW_FormKindEnum; typedef struct DW_Form { @@ -532,669 +532,669 @@ typedef struct DW_Form //- Attributes DWARF2 #define DW_AttribKind_V2_XList \ - X(Sibling, 0x1) \ - X(Location, 0x2) \ - X(Name, 0x3) \ - X(Ordering, 0x9) \ - X(ByteSize, 0xB) \ - X(BitOffset, 0xC) \ - X(BitSize, 0xD) \ - X(StmtList, 0x10) \ - X(LowPc, 0x11) \ - X(HighPc, 0x12) \ - X(Language, 0x13) \ - X(Discr, 0x15) \ - X(DiscrValue, 0x16) \ - X(Visibility, 0x17) \ - X(Import, 0x18) \ - X(StringLength, 0x19) \ - X(CommonReference, 0x1a) \ - X(CompDir, 0x1b) \ - X(ConstValue, 0x1c) \ - X(ContainingType, 0x1d) \ - X(DefaultValue, 0x1e) \ - X(Inline, 0x20) \ - X(IsOptional, 0x21) \ - X(LowerBound, 0x22) \ - X(Producer, 0x25) \ - X(Prototyped, 0x27) \ - X(ReturnAddr, 0x2a) \ - X(StartScope, 0x2c) \ - X(BitStride, 0x2e) \ - X(UpperBound, 0x2f) \ - X(AbstractOrigin, 0x31) \ - X(Accessibility, 0x32) \ - X(AddressClass, 0x33) \ - X(Artificial, 0x34) \ - X(BaseTypes, 0x35) \ - X(CallingConvention, 0x36) \ - X(Count, 0x37) \ - X(DataMemberLocation, 0x38) \ - X(DeclColumn, 0x39) \ - X(DeclFile, 0x3a) \ - X(DeclLine, 0x3b) \ - X(Declaration, 0x3c) \ - X(DiscrList, 0x3d) \ - X(Encoding, 0x3e) \ - X(External, 0x3f) \ - X(FrameBase, 0x40) \ - X(Friend, 0x41) \ - X(IdentifierCase, 0x42) \ - X(MacroInfo, 0x43) \ - X(NameListItem, 0x44) \ - X(Priority, 0x45) \ - X(Segment, 0x46) \ - X(Specification, 0x47) \ - X(StaticLink, 0x48) \ - X(Type, 0x49) \ - X(UseLocation, 0x4a) \ - X(VariableParameter, 0x4b) \ - X(Virtuality, 0x4c) \ - X(VTableElemLocation, 0x4d) +X(Sibling, 0x1) \ +X(Location, 0x2) \ +X(Name, 0x3) \ +X(Ordering, 0x9) \ +X(ByteSize, 0xB) \ +X(BitOffset, 0xC) \ +X(BitSize, 0xD) \ +X(StmtList, 0x10) \ +X(LowPc, 0x11) \ +X(HighPc, 0x12) \ +X(Language, 0x13) \ +X(Discr, 0x15) \ +X(DiscrValue, 0x16) \ +X(Visibility, 0x17) \ +X(Import, 0x18) \ +X(StringLength, 0x19) \ +X(CommonReference, 0x1a) \ +X(CompDir, 0x1b) \ +X(ConstValue, 0x1c) \ +X(ContainingType, 0x1d) \ +X(DefaultValue, 0x1e) \ +X(Inline, 0x20) \ +X(IsOptional, 0x21) \ +X(LowerBound, 0x22) \ +X(Producer, 0x25) \ +X(Prototyped, 0x27) \ +X(ReturnAddr, 0x2a) \ +X(StartScope, 0x2c) \ +X(BitStride, 0x2e) \ +X(UpperBound, 0x2f) \ +X(AbstractOrigin, 0x31) \ +X(Accessibility, 0x32) \ +X(AddressClass, 0x33) \ +X(Artificial, 0x34) \ +X(BaseTypes, 0x35) \ +X(CallingConvention, 0x36) \ +X(Count, 0x37) \ +X(DataMemberLocation, 0x38) \ +X(DeclColumn, 0x39) \ +X(DeclFile, 0x3a) \ +X(DeclLine, 0x3b) \ +X(Declaration, 0x3c) \ +X(DiscrList, 0x3d) \ +X(Encoding, 0x3e) \ +X(External, 0x3f) \ +X(FrameBase, 0x40) \ +X(Friend, 0x41) \ +X(IdentifierCase, 0x42) \ +X(MacroInfo, 0x43) \ +X(NameListItem, 0x44) \ +X(Priority, 0x45) \ +X(Segment, 0x46) \ +X(Specification, 0x47) \ +X(StaticLink, 0x48) \ +X(Type, 0x49) \ +X(UseLocation, 0x4a) \ +X(VariableParameter, 0x4b) \ +X(Virtuality, 0x4c) \ +X(VTableElemLocation, 0x4d) #define DW_AttribKind_ClassFlags_V2_XList \ - X(Sibling, DW_AttribClass_Reference) \ - X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(Name, DW_AttribClass_String) \ - X(Ordering, DW_AttribClass_Const) \ - X(ByteSize, DW_AttribClass_Const) \ - X(BitOffset, DW_AttribClass_Const) \ - X(BitSize, DW_AttribClass_Const) \ - X(StmtList, DW_AttribClass_Const) \ - X(LowPc, DW_AttribClass_Address) \ - X(HighPc, DW_AttribClass_Address) \ - X(Language, DW_AttribClass_Const) \ - X(Discr, DW_AttribClass_Reference) \ - X(DiscrValue, DW_AttribClass_Const) \ - X(Visibility, DW_AttribClass_Const) \ - X(Import, DW_AttribClass_Reference) \ - X(StringLength, DW_AttribClass_Block|DW_AttribClass_Const) \ - X(CommonReference, DW_AttribClass_Reference) \ - X(CompDir, DW_AttribClass_String) \ - X(ConstValue, DW_AttribClass_String|DW_AttribClass_Const|DW_AttribClass_Block) \ - X(ContainingType, DW_AttribClass_Reference) \ - X(DefaultValue, DW_AttribClass_Reference) \ - X(Inline, DW_AttribClass_Const) \ - X(IsOptional, DW_AttribClass_Flag) \ - X(LowerBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(Producer, DW_AttribClass_String) \ - X(Prototyped, DW_AttribClass_Flag) \ - X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_Const) \ - X(StartScope, DW_AttribClass_Const) \ - X(BitStride, DW_AttribClass_Const) /* dwarf-v1 DW_AttribKind_stride_size*/ \ - X(UpperBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(AbstractOrigin, DW_AttribClass_Reference) \ - X(Accessibility, DW_AttribClass_Const) \ - X(AddressClass, DW_AttribClass_Const) \ - X(Artificial, DW_AttribClass_Flag) \ - X(BaseTypes, DW_AttribClass_Reference) \ - X(CallingConvention, DW_AttribClass_Const) \ - X(Count, DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Reference) \ - X(DeclColumn, DW_AttribClass_Const) \ - X(DeclFile, DW_AttribClass_Const) \ - X(DeclLine, DW_AttribClass_Const) \ - X(Declaration, DW_AttribClass_Flag) \ - X(DiscrList, DW_AttribClass_Block) \ - X(Encoding, DW_AttribClass_Const) \ - X(External, DW_AttribClass_Flag) \ - X(FrameBase, DW_AttribClass_Block|DW_AttribClass_Const) \ - X(Friend, DW_AttribClass_Reference) \ - X(IdentifierCase, DW_AttribClass_Const) \ - X(MacroInfo, DW_AttribClass_Const) \ - X(NameListItem, DW_AttribClass_Block) \ - X(Priority, DW_AttribClass_Reference) \ - X(Segment, DW_AttribClass_Block|DW_AttribClass_Const) \ - X(Specification, DW_AttribClass_Reference) \ - X(StaticLink, DW_AttribClass_Block|DW_AttribClass_Const) \ - X(Type, DW_AttribClass_Reference) \ - X(UseLocation, DW_AttribClass_Block|DW_AttribClass_Const) \ - X(VariableParameter, DW_AttribClass_Flag) \ - X(Virtuality, DW_AttribClass_Const) \ - X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_Reference) +X(Sibling, DW_AttribClass_Reference) \ +X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(Name, DW_AttribClass_String) \ +X(Ordering, DW_AttribClass_Const) \ +X(ByteSize, DW_AttribClass_Const) \ +X(BitOffset, DW_AttribClass_Const) \ +X(BitSize, DW_AttribClass_Const) \ +X(StmtList, DW_AttribClass_Const) \ +X(LowPc, DW_AttribClass_Address) \ +X(HighPc, DW_AttribClass_Address) \ +X(Language, DW_AttribClass_Const) \ +X(Discr, DW_AttribClass_Reference) \ +X(DiscrValue, DW_AttribClass_Const) \ +X(Visibility, DW_AttribClass_Const) \ +X(Import, DW_AttribClass_Reference) \ +X(StringLength, DW_AttribClass_Block|DW_AttribClass_Const) \ +X(CommonReference, DW_AttribClass_Reference) \ +X(CompDir, DW_AttribClass_String) \ +X(ConstValue, DW_AttribClass_String|DW_AttribClass_Const|DW_AttribClass_Block) \ +X(ContainingType, DW_AttribClass_Reference) \ +X(DefaultValue, DW_AttribClass_Reference) \ +X(Inline, DW_AttribClass_Const) \ +X(IsOptional, DW_AttribClass_Flag) \ +X(LowerBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(Producer, DW_AttribClass_String) \ +X(Prototyped, DW_AttribClass_Flag) \ +X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_Const) \ +X(StartScope, DW_AttribClass_Const) \ +X(BitStride, DW_AttribClass_Const) /* dwarf-v1 DW_AttribKind_stride_size*/ \ +X(UpperBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(AbstractOrigin, DW_AttribClass_Reference) \ +X(Accessibility, DW_AttribClass_Const) \ +X(AddressClass, DW_AttribClass_Const) \ +X(Artificial, DW_AttribClass_Flag) \ +X(BaseTypes, DW_AttribClass_Reference) \ +X(CallingConvention, DW_AttribClass_Const) \ +X(Count, DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Reference) \ +X(DeclColumn, DW_AttribClass_Const) \ +X(DeclFile, DW_AttribClass_Const) \ +X(DeclLine, DW_AttribClass_Const) \ +X(Declaration, DW_AttribClass_Flag) \ +X(DiscrList, DW_AttribClass_Block) \ +X(Encoding, DW_AttribClass_Const) \ +X(External, DW_AttribClass_Flag) \ +X(FrameBase, DW_AttribClass_Block|DW_AttribClass_Const) \ +X(Friend, DW_AttribClass_Reference) \ +X(IdentifierCase, DW_AttribClass_Const) \ +X(MacroInfo, DW_AttribClass_Const) \ +X(NameListItem, DW_AttribClass_Block) \ +X(Priority, DW_AttribClass_Reference) \ +X(Segment, DW_AttribClass_Block|DW_AttribClass_Const) \ +X(Specification, DW_AttribClass_Reference) \ +X(StaticLink, DW_AttribClass_Block|DW_AttribClass_Const) \ +X(Type, DW_AttribClass_Reference) \ +X(UseLocation, DW_AttribClass_Block|DW_AttribClass_Const) \ +X(VariableParameter, DW_AttribClass_Flag) \ +X(Virtuality, DW_AttribClass_Const) \ +X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_Reference) //- Attributes DWARF3 #define DW_AttribKind_V3_XList \ - X(Allocated, 0x4e) \ - X(Associated, 0x4f) \ - X(DataLocation, 0x50) \ - X(ByteStride, 0x51) \ - X(EntryPc, 0x52) \ - X(UseUtf8, 0x53) \ - X(Extension, 0x54) \ - X(Ranges, 0x55) \ - X(Trampoline, 0x56) \ - X(CallColumn, 0x57) \ - X(CallFile, 0x58) \ - X(CallLine, 0x59) \ - X(Description, 0x5a) \ - X(BinaryScale, 0x5b) \ - X(DecimalScale, 0x5c) \ - X(Small, 0x5d) \ - X(DecimalSign, 0x5e) \ - X(DigitCount, 0x5f) \ - X(PictureString, 0x60) \ - X(Mutable, 0x61) \ - X(ThreadsScaled, 0x62) \ - X(Explicit, 0x63) \ - X(ObjectPointer, 0x64) \ - X(Endianity, 0x65) \ - X(Elemental, 0x66) \ - X(Pure, 0x67) \ - X(Recursive, 0x68) +X(Allocated, 0x4e) \ +X(Associated, 0x4f) \ +X(DataLocation, 0x50) \ +X(ByteStride, 0x51) \ +X(EntryPc, 0x52) \ +X(UseUtf8, 0x53) \ +X(Extension, 0x54) \ +X(Ranges, 0x55) \ +X(Trampoline, 0x56) \ +X(CallColumn, 0x57) \ +X(CallFile, 0x58) \ +X(CallLine, 0x59) \ +X(Description, 0x5a) \ +X(BinaryScale, 0x5b) \ +X(DecimalScale, 0x5c) \ +X(Small, 0x5d) \ +X(DecimalSign, 0x5e) \ +X(DigitCount, 0x5f) \ +X(PictureString, 0x60) \ +X(Mutable, 0x61) \ +X(ThreadsScaled, 0x62) \ +X(Explicit, 0x63) \ +X(ObjectPointer, 0x64) \ +X(Endianity, 0x65) \ +X(Elemental, 0x66) \ +X(Pure, 0x67) \ +X(Recursive, 0x68) #define DW_AttribKind_ClassFlags_V3_XList \ - X(Sibling, DW_AttribClass_Reference) \ - X(Location, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ - X(Name, DW_AttribClass_String) \ - X(Ordering, DW_AttribClass_Const) \ - X(ByteSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(BitOffset, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(BitSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(StmtList, DW_AttribClass_LinePtr) \ - X(LowPc, DW_AttribClass_Address) \ - X(HighPc, DW_AttribClass_Address) \ - X(Language, DW_AttribClass_Const) \ - X(Discr, DW_AttribClass_Reference) \ - X(DiscrValue, DW_AttribClass_Const) \ - X(Visibility, DW_AttribClass_Const) \ - X(Import, DW_AttribClass_Reference) \ - X(StringLength, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ - X(CommonReference, DW_AttribClass_Reference) \ - X(CompDir, DW_AttribClass_String) \ - X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ - X(ContainingType, DW_AttribClass_Reference) \ - X(DefaultValue, DW_AttribClass_Reference) \ - X(Inline, DW_AttribClass_Const) \ - X(IsOptional, DW_AttribClass_Flag) \ - X(LowerBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(Producer, DW_AttribClass_String) \ - X(Prototyped, DW_AttribClass_Flag) \ - X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ - X(StartScope, DW_AttribClass_Const) \ - X(BitStride, DW_AttribClass_Const) \ - X(UpperBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(AbstractOrigin, DW_AttribClass_Reference) \ - X(Accessibility, DW_AttribClass_Const) \ - X(AddressClass, DW_AttribClass_Const) \ - X(Artificial, DW_AttribClass_Flag) \ - X(BaseTypes, DW_AttribClass_Reference) \ - X(CallingConvention, DW_AttribClass_Const) \ - X(Count, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_LocListPtr) \ - X(DeclColumn, DW_AttribClass_Const) \ - X(DeclFile, DW_AttribClass_Const) \ - X(DeclLine, DW_AttribClass_Const) \ - X(Declaration, DW_AttribClass_Flag) \ - X(DiscrList, DW_AttribClass_Block) \ - X(Encoding, DW_AttribClass_Const) \ - X(External, DW_AttribClass_Flag) \ - X(FrameBase, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ - X(Friend, DW_AttribClass_Reference) \ - X(IdentifierCase, DW_AttribClass_Const) \ - X(MacroInfo, DW_AttribClass_MacPtr) \ - X(NameListItem, DW_AttribClass_Block) \ - X(Priority, DW_AttribClass_Reference) \ - X(Segment, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ - X(Specification, DW_AttribClass_Reference) \ - X(StaticLink, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ - X(Type, DW_AttribClass_Reference) \ - X(UseLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ - X(VariableParameter, DW_AttribClass_Flag) \ - X(Virtuality, DW_AttribClass_Const) \ - X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ - X(Allocated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(Associated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(DataLocation, DW_AttribClass_Block) \ - X(ByteStride, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ - X(EntryPc, DW_AttribClass_Address) \ - X(UseUtf8, DW_AttribClass_Flag) \ - X(Extension, DW_AttribClass_Reference) \ - X(Ranges, DW_AttribClass_RngListPtr) \ - X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ - X(CallColumn, DW_AttribClass_Const) \ - X(CallFile, DW_AttribClass_Const) \ - X(CallLine, DW_AttribClass_Const) \ - X(Description, DW_AttribClass_String) \ - X(BinaryScale, DW_AttribClass_Const) \ - X(DecimalScale, DW_AttribClass_Const) \ - X(Small, DW_AttribClass_Reference) \ - X(DecimalSign, DW_AttribClass_Const) \ - X(DigitCount, DW_AttribClass_Const) \ - X(PictureString, DW_AttribClass_String) \ - X(Mutable, DW_AttribClass_Flag) \ - X(ThreadsScaled, DW_AttribClass_Flag) \ - X(Explicit, DW_AttribClass_Flag) \ - X(ObjectPointer, DW_AttribClass_Reference) \ - X(Endianity, DW_AttribClass_Const) \ - X(Elemental, DW_AttribClass_Flag) \ - X(Pure, DW_AttribClass_Flag) \ - X(Recursive, DW_AttribClass_Flag) +X(Sibling, DW_AttribClass_Reference) \ +X(Location, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ +X(Name, DW_AttribClass_String) \ +X(Ordering, DW_AttribClass_Const) \ +X(ByteSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(BitOffset, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(BitSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(StmtList, DW_AttribClass_LinePtr) \ +X(LowPc, DW_AttribClass_Address) \ +X(HighPc, DW_AttribClass_Address) \ +X(Language, DW_AttribClass_Const) \ +X(Discr, DW_AttribClass_Reference) \ +X(DiscrValue, DW_AttribClass_Const) \ +X(Visibility, DW_AttribClass_Const) \ +X(Import, DW_AttribClass_Reference) \ +X(StringLength, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ +X(CommonReference, DW_AttribClass_Reference) \ +X(CompDir, DW_AttribClass_String) \ +X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ +X(ContainingType, DW_AttribClass_Reference) \ +X(DefaultValue, DW_AttribClass_Reference) \ +X(Inline, DW_AttribClass_Const) \ +X(IsOptional, DW_AttribClass_Flag) \ +X(LowerBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(Producer, DW_AttribClass_String) \ +X(Prototyped, DW_AttribClass_Flag) \ +X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ +X(StartScope, DW_AttribClass_Const) \ +X(BitStride, DW_AttribClass_Const) \ +X(UpperBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(AbstractOrigin, DW_AttribClass_Reference) \ +X(Accessibility, DW_AttribClass_Const) \ +X(AddressClass, DW_AttribClass_Const) \ +X(Artificial, DW_AttribClass_Flag) \ +X(BaseTypes, DW_AttribClass_Reference) \ +X(CallingConvention, DW_AttribClass_Const) \ +X(Count, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_LocListPtr) \ +X(DeclColumn, DW_AttribClass_Const) \ +X(DeclFile, DW_AttribClass_Const) \ +X(DeclLine, DW_AttribClass_Const) \ +X(Declaration, DW_AttribClass_Flag) \ +X(DiscrList, DW_AttribClass_Block) \ +X(Encoding, DW_AttribClass_Const) \ +X(External, DW_AttribClass_Flag) \ +X(FrameBase, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ +X(Friend, DW_AttribClass_Reference) \ +X(IdentifierCase, DW_AttribClass_Const) \ +X(MacroInfo, DW_AttribClass_MacPtr) \ +X(NameListItem, DW_AttribClass_Block) \ +X(Priority, DW_AttribClass_Reference) \ +X(Segment, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ +X(Specification, DW_AttribClass_Reference) \ +X(StaticLink, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ +X(Type, DW_AttribClass_Reference) \ +X(UseLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ +X(VariableParameter, DW_AttribClass_Flag) \ +X(Virtuality, DW_AttribClass_Const) \ +X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ +X(Allocated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(Associated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(DataLocation, DW_AttribClass_Block) \ +X(ByteStride, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ +X(EntryPc, DW_AttribClass_Address) \ +X(UseUtf8, DW_AttribClass_Flag) \ +X(Extension, DW_AttribClass_Reference) \ +X(Ranges, DW_AttribClass_RngListPtr) \ +X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ +X(CallColumn, DW_AttribClass_Const) \ +X(CallFile, DW_AttribClass_Const) \ +X(CallLine, DW_AttribClass_Const) \ +X(Description, DW_AttribClass_String) \ +X(BinaryScale, DW_AttribClass_Const) \ +X(DecimalScale, DW_AttribClass_Const) \ +X(Small, DW_AttribClass_Reference) \ +X(DecimalSign, DW_AttribClass_Const) \ +X(DigitCount, DW_AttribClass_Const) \ +X(PictureString, DW_AttribClass_String) \ +X(Mutable, DW_AttribClass_Flag) \ +X(ThreadsScaled, DW_AttribClass_Flag) \ +X(Explicit, DW_AttribClass_Flag) \ +X(ObjectPointer, DW_AttribClass_Reference) \ +X(Endianity, DW_AttribClass_Const) \ +X(Elemental, DW_AttribClass_Flag) \ +X(Pure, DW_AttribClass_Flag) \ +X(Recursive, DW_AttribClass_Flag) //- Attributes DWARF4 #define DW_AttribKind_V4_XList \ - X(Signature, 0x69) \ - X(MainSubProgram, 0x6a) \ - X(DataBitOffset, 0x6b) \ - X(ConstExpr, 0x6c) \ - X(EnumClass, 0x6d) \ - X(LinkageName, 0x6e) +X(Signature, 0x69) \ +X(MainSubProgram, 0x6a) \ +X(DataBitOffset, 0x6b) \ +X(ConstExpr, 0x6c) \ +X(EnumClass, 0x6d) \ +X(LinkageName, 0x6e) #define DW_AttribKind_ClassFlags_V4_XList \ - X(Sibling, DW_AttribClass_Reference) \ - X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(Name, DW_AttribClass_String) \ - X(Ordering, DW_AttribClass_Const) \ - X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(StmtList, DW_AttribClass_LinePtr) \ - X(LowPc, DW_AttribClass_Address) \ - X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ - X(Language, DW_AttribClass_Const) \ - X(Discr, DW_AttribClass_Reference) \ - X(DiscrValue, DW_AttribClass_Const) \ - X(Visibility, DW_AttribClass_Const) \ - X(Import, DW_AttribClass_Reference) \ - X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(CommonReference, DW_AttribClass_Reference) \ - X(CompDir, DW_AttribClass_String) \ - X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ - X(ContainingType, DW_AttribClass_Reference) \ - X(DefaultValue, DW_AttribClass_Reference) \ - X(Inline, DW_AttribClass_Const) \ - X(IsOptional, DW_AttribClass_Flag) \ - X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(Producer, DW_AttribClass_String) \ - X(Prototyped, DW_AttribClass_Flag) \ - X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ - X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(AbstractOrigin, DW_AttribClass_Reference) \ - X(Accessibility, DW_AttribClass_Const) \ - X(AddressClass, DW_AttribClass_Const) \ - X(Artificial, DW_AttribClass_Flag) \ - X(BaseTypes, DW_AttribClass_Reference) \ - X(CallingConvention, DW_AttribClass_Const) \ - X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(DeclColumn, DW_AttribClass_Const) \ - X(DeclFile, DW_AttribClass_Const) \ - X(DeclLine, DW_AttribClass_Const) \ - X(Declaration, DW_AttribClass_Flag) \ - X(DiscrList, DW_AttribClass_Block) \ - X(Encoding, DW_AttribClass_Const) \ - X(External, DW_AttribClass_Flag) \ - X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(Friend, DW_AttribClass_Reference) \ - X(IdentifierCase, DW_AttribClass_Const) \ - X(MacroInfo, DW_AttribClass_MacPtr) \ - X(NameListItem, DW_AttribClass_Reference) \ - X(Priority, DW_AttribClass_Reference) \ - X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(Specification, DW_AttribClass_Reference) \ - X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(Type, DW_AttribClass_Reference) \ - X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(VariableParameter, DW_AttribClass_Flag) \ - X(Virtuality, DW_AttribClass_Const) \ - X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(DataLocation, DW_AttribClass_ExprLoc) \ - X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(EntryPc, DW_AttribClass_Address) \ - X(UseUtf8, DW_AttribClass_Flag) \ - X(Extension, DW_AttribClass_Reference) \ - X(Ranges, DW_AttribClass_RngListPtr) \ - X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ - X(CallColumn, DW_AttribClass_Const) \ - X(CallFile, DW_AttribClass_Const) \ - X(CallLine, DW_AttribClass_Const) \ - X(Description, DW_AttribClass_String) \ - X(BinaryScale, DW_AttribClass_Const) \ - X(DecimalScale, DW_AttribClass_Const) \ - X(Small, DW_AttribClass_Reference) \ - X(DecimalSign, DW_AttribClass_Const) \ - X(DigitCount, DW_AttribClass_Const) \ - X(PictureString, DW_AttribClass_String) \ - X(Mutable, DW_AttribClass_Flag) \ - X(ThreadsScaled, DW_AttribClass_Flag) \ - X(Explicit, DW_AttribClass_Flag) \ - X(ObjectPointer, DW_AttribClass_Reference) \ - X(Endianity, DW_AttribClass_Const) \ - X(Elemental, DW_AttribClass_Flag) \ - X(Pure, DW_AttribClass_Flag) \ - X(Recursive, DW_AttribClass_Flag) \ - X(Signature, DW_AttribClass_Reference) \ - X(MainSubProgram, DW_AttribClass_Flag) \ - X(DataBitOffset, DW_AttribClass_Const) \ - X(ConstExpr, DW_AttribClass_Flag) \ - X(EnumClass, DW_AttribClass_Flag) \ - X(LinkageName, DW_AttribClass_String) +X(Sibling, DW_AttribClass_Reference) \ +X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(Name, DW_AttribClass_String) \ +X(Ordering, DW_AttribClass_Const) \ +X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(StmtList, DW_AttribClass_LinePtr) \ +X(LowPc, DW_AttribClass_Address) \ +X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ +X(Language, DW_AttribClass_Const) \ +X(Discr, DW_AttribClass_Reference) \ +X(DiscrValue, DW_AttribClass_Const) \ +X(Visibility, DW_AttribClass_Const) \ +X(Import, DW_AttribClass_Reference) \ +X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(CommonReference, DW_AttribClass_Reference) \ +X(CompDir, DW_AttribClass_String) \ +X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ +X(ContainingType, DW_AttribClass_Reference) \ +X(DefaultValue, DW_AttribClass_Reference) \ +X(Inline, DW_AttribClass_Const) \ +X(IsOptional, DW_AttribClass_Flag) \ +X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(Producer, DW_AttribClass_String) \ +X(Prototyped, DW_AttribClass_Flag) \ +X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ +X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(AbstractOrigin, DW_AttribClass_Reference) \ +X(Accessibility, DW_AttribClass_Const) \ +X(AddressClass, DW_AttribClass_Const) \ +X(Artificial, DW_AttribClass_Flag) \ +X(BaseTypes, DW_AttribClass_Reference) \ +X(CallingConvention, DW_AttribClass_Const) \ +X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(DeclColumn, DW_AttribClass_Const) \ +X(DeclFile, DW_AttribClass_Const) \ +X(DeclLine, DW_AttribClass_Const) \ +X(Declaration, DW_AttribClass_Flag) \ +X(DiscrList, DW_AttribClass_Block) \ +X(Encoding, DW_AttribClass_Const) \ +X(External, DW_AttribClass_Flag) \ +X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(Friend, DW_AttribClass_Reference) \ +X(IdentifierCase, DW_AttribClass_Const) \ +X(MacroInfo, DW_AttribClass_MacPtr) \ +X(NameListItem, DW_AttribClass_Reference) \ +X(Priority, DW_AttribClass_Reference) \ +X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(Specification, DW_AttribClass_Reference) \ +X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(Type, DW_AttribClass_Reference) \ +X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(VariableParameter, DW_AttribClass_Flag) \ +X(Virtuality, DW_AttribClass_Const) \ +X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(DataLocation, DW_AttribClass_ExprLoc) \ +X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(EntryPc, DW_AttribClass_Address) \ +X(UseUtf8, DW_AttribClass_Flag) \ +X(Extension, DW_AttribClass_Reference) \ +X(Ranges, DW_AttribClass_RngListPtr) \ +X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ +X(CallColumn, DW_AttribClass_Const) \ +X(CallFile, DW_AttribClass_Const) \ +X(CallLine, DW_AttribClass_Const) \ +X(Description, DW_AttribClass_String) \ +X(BinaryScale, DW_AttribClass_Const) \ +X(DecimalScale, DW_AttribClass_Const) \ +X(Small, DW_AttribClass_Reference) \ +X(DecimalSign, DW_AttribClass_Const) \ +X(DigitCount, DW_AttribClass_Const) \ +X(PictureString, DW_AttribClass_String) \ +X(Mutable, DW_AttribClass_Flag) \ +X(ThreadsScaled, DW_AttribClass_Flag) \ +X(Explicit, DW_AttribClass_Flag) \ +X(ObjectPointer, DW_AttribClass_Reference) \ +X(Endianity, DW_AttribClass_Const) \ +X(Elemental, DW_AttribClass_Flag) \ +X(Pure, DW_AttribClass_Flag) \ +X(Recursive, DW_AttribClass_Flag) \ +X(Signature, DW_AttribClass_Reference) \ +X(MainSubProgram, DW_AttribClass_Flag) \ +X(DataBitOffset, DW_AttribClass_Const) \ +X(ConstExpr, DW_AttribClass_Flag) \ +X(EnumClass, DW_AttribClass_Flag) \ +X(LinkageName, DW_AttribClass_String) //- Attributes DWARF5 #define DW_AttribKind_V5_XList \ - X(StringLengthBitSize, 0x6f) \ - X(StringLengthByteSize, 0x70) \ - X(Rank, 0x71) \ - X(StrOffsetsBase, 0x72) \ - X(AddrBase, 0x73) \ - X(RngListsBase, 0x74) \ - X(DwoName, 0x76) \ - X(Reference, 0x77) \ - X(RValueReference, 0x78) \ - X(Macros, 0x79) \ - X(CallAllCalls, 0x7a) \ - X(CallAllSourceCalls, 0x7b) \ - X(CallAllTailCalls, 0x7c) \ - X(CallReturnPc, 0x7d) \ - X(CallValue, 0x7e) \ - X(CallOrigin, 0x7f) \ - X(CallParameter, 0x80) \ - X(CallPc, 0x81) \ - X(CallTailCall, 0x82) \ - X(CallTarget, 0x83) \ - X(CallTargetClobbered, 0x84) \ - X(CallDataLocation, 0x85) \ - X(CallDataValue, 0x86) \ - X(NoReturn, 0x87) \ - X(Alignment, 0x88) \ - X(ExportSymbols, 0x89) \ - X(Deleted, 0x8a) \ - X(Defaulted, 0x8b) \ - X(LocListsBase, 0x8c) +X(StringLengthBitSize, 0x6f) \ +X(StringLengthByteSize, 0x70) \ +X(Rank, 0x71) \ +X(StrOffsetsBase, 0x72) \ +X(AddrBase, 0x73) \ +X(RngListsBase, 0x74) \ +X(DwoName, 0x76) \ +X(Reference, 0x77) \ +X(RValueReference, 0x78) \ +X(Macros, 0x79) \ +X(CallAllCalls, 0x7a) \ +X(CallAllSourceCalls, 0x7b) \ +X(CallAllTailCalls, 0x7c) \ +X(CallReturnPc, 0x7d) \ +X(CallValue, 0x7e) \ +X(CallOrigin, 0x7f) \ +X(CallParameter, 0x80) \ +X(CallPc, 0x81) \ +X(CallTailCall, 0x82) \ +X(CallTarget, 0x83) \ +X(CallTargetClobbered, 0x84) \ +X(CallDataLocation, 0x85) \ +X(CallDataValue, 0x86) \ +X(NoReturn, 0x87) \ +X(Alignment, 0x88) \ +X(ExportSymbols, 0x89) \ +X(Deleted, 0x8a) \ +X(Defaulted, 0x8b) \ +X(LocListsBase, 0x8c) #define DW_AttribKind_ClassFlags_V5_XList \ - X(Sibling, DW_AttribClass_Reference) \ - X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(Name, DW_AttribClass_String) \ - X(Ordering, DW_AttribClass_Const) \ - X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(StmtList, DW_AttribClass_LinePtr) \ - X(LowPc, DW_AttribClass_Address) \ - X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ - X(Language, DW_AttribClass_Const) \ - X(Discr, DW_AttribClass_Reference) \ - X(DiscrValue, DW_AttribClass_Const) \ - X(Visibility, DW_AttribClass_Const) \ - X(Import, DW_AttribClass_Reference) \ - X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(CommonReference, DW_AttribClass_Reference) \ - X(CompDir, DW_AttribClass_String) \ - X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ - X(ContainingType, DW_AttribClass_Reference) \ - X(DefaultValue, DW_AttribClass_Reference) \ - X(Inline, DW_AttribClass_Const) \ - X(IsOptional, DW_AttribClass_Flag) \ - X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(Producer, DW_AttribClass_String) \ - X(Prototyped, DW_AttribClass_Flag) \ - X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ - X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ - X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(AbstractOrigin, DW_AttribClass_Reference) \ - X(Accessibility, DW_AttribClass_Const) \ - X(AddressClass, DW_AttribClass_Const) \ - X(Artificial, DW_AttribClass_Flag) \ - X(BaseTypes, DW_AttribClass_Reference) \ - X(CallingConvention, DW_AttribClass_Const) \ - X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ - X(DeclColumn, DW_AttribClass_Const) \ - X(DeclFile, DW_AttribClass_Const) \ - X(DeclLine, DW_AttribClass_Const) \ - X(Declaration, DW_AttribClass_Flag) \ - X(DiscrList, DW_AttribClass_Block) \ - X(Encoding, DW_AttribClass_Const) \ - X(External, DW_AttribClass_Flag) \ - X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ - X(Friend, DW_AttribClass_Reference) \ - X(IdentifierCase, DW_AttribClass_Const) \ - X(MacroInfo, DW_AttribClass_MacPtr) \ - X(NameListItem, DW_AttribClass_Reference) \ - X(Priority, DW_AttribClass_Reference) \ - X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ - X(Specification, DW_AttribClass_Reference) \ - X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ - X(Type, DW_AttribClass_Reference) \ - X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ - X(VariableParameter, DW_AttribClass_Flag) \ - X(Virtuality, DW_AttribClass_Const) \ - X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ - X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(DataLocation, DW_AttribClass_ExprLoc) \ - X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ - X(EntryPc, DW_AttribClass_Address|DW_AttribClass_Const) \ - X(UseUtf8, DW_AttribClass_Flag) \ - X(Extension, DW_AttribClass_Reference) \ - X(Ranges, DW_AttribClass_RngList) \ - X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ - X(CallColumn, DW_AttribClass_Const) \ - X(CallFile, DW_AttribClass_Const) \ - X(CallLine, DW_AttribClass_Const) \ - X(Description, DW_AttribClass_String) \ - X(BinaryScale, DW_AttribClass_Const) \ - X(DecimalScale, DW_AttribClass_Const) \ - X(Small, DW_AttribClass_Reference) \ - X(DecimalSign, DW_AttribClass_Const) \ - X(DigitCount, DW_AttribClass_Const) \ - X(PictureString, DW_AttribClass_String) \ - X(Mutable, DW_AttribClass_Flag) \ - X(ThreadsScaled, DW_AttribClass_Flag) \ - X(Explicit, DW_AttribClass_Flag) \ - X(ObjectPointer, DW_AttribClass_Reference) \ - X(Endianity, DW_AttribClass_Const) \ - X(Elemental, DW_AttribClass_Flag) \ - X(Pure, DW_AttribClass_Flag) \ - X(Recursive, DW_AttribClass_Flag) \ - X(Signature, DW_AttribClass_Reference) \ - X(MainSubProgram, DW_AttribClass_Flag) \ - X(DataBitOffset, DW_AttribClass_Const) \ - X(ConstExpr, DW_AttribClass_Flag) \ - X(EnumClass, DW_AttribClass_Flag) \ - X(LinkageName, DW_AttribClass_String) \ - X(StringLengthBitSize, DW_AttribClass_Const) \ - X(StringLengthByteSize, DW_AttribClass_Const) \ - X(Rank, DW_AttribClass_Const|DW_AttribClass_ExprLoc) \ - X(StrOffsetsBase, DW_AttribClass_StrOffsetsPtr) \ - X(AddrBase, DW_AttribClass_AddrPtr) \ - X(RngListsBase, DW_AttribClass_RngListPtr) \ - X(DwoName, DW_AttribClass_String) \ - X(Reference, DW_AttribClass_Flag) \ - X(RValueReference, DW_AttribClass_Flag) \ - X(Macros, DW_AttribClass_MacPtr) \ - X(CallAllCalls, DW_AttribClass_Flag) \ - X(CallAllSourceCalls, DW_AttribClass_Flag) \ - X(CallAllTailCalls, DW_AttribClass_Flag) \ - X(CallReturnPc, DW_AttribClass_Address) \ - X(CallValue, DW_AttribClass_ExprLoc) \ - X(CallOrigin, DW_AttribClass_ExprLoc) \ - X(CallParameter, DW_AttribClass_Reference) \ - X(CallPc, DW_AttribClass_Address) \ - X(CallTailCall, DW_AttribClass_Flag) \ - X(CallTarget, DW_AttribClass_ExprLoc) \ - X(CallTargetClobbered, DW_AttribClass_ExprLoc) \ - X(CallDataLocation, DW_AttribClass_ExprLoc) \ - X(CallDataValue, DW_AttribClass_ExprLoc) \ - X(NoReturn, DW_AttribClass_Flag) \ - X(Alignment, DW_AttribClass_Const) \ - X(ExportSymbols, DW_AttribClass_Flag) \ - X(Deleted, DW_AttribClass_Flag) \ - X(Defaulted, DW_AttribClass_Const) \ - X(LocListsBase, DW_AttribClass_LocListPtr) +X(Sibling, DW_AttribClass_Reference) \ +X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(Name, DW_AttribClass_String) \ +X(Ordering, DW_AttribClass_Const) \ +X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(StmtList, DW_AttribClass_LinePtr) \ +X(LowPc, DW_AttribClass_Address) \ +X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ +X(Language, DW_AttribClass_Const) \ +X(Discr, DW_AttribClass_Reference) \ +X(DiscrValue, DW_AttribClass_Const) \ +X(Visibility, DW_AttribClass_Const) \ +X(Import, DW_AttribClass_Reference) \ +X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(CommonReference, DW_AttribClass_Reference) \ +X(CompDir, DW_AttribClass_String) \ +X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ +X(ContainingType, DW_AttribClass_Reference) \ +X(DefaultValue, DW_AttribClass_Reference) \ +X(Inline, DW_AttribClass_Const) \ +X(IsOptional, DW_AttribClass_Flag) \ +X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(Producer, DW_AttribClass_String) \ +X(Prototyped, DW_AttribClass_Flag) \ +X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ +X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ +X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(AbstractOrigin, DW_AttribClass_Reference) \ +X(Accessibility, DW_AttribClass_Const) \ +X(AddressClass, DW_AttribClass_Const) \ +X(Artificial, DW_AttribClass_Flag) \ +X(BaseTypes, DW_AttribClass_Reference) \ +X(CallingConvention, DW_AttribClass_Const) \ +X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ +X(DeclColumn, DW_AttribClass_Const) \ +X(DeclFile, DW_AttribClass_Const) \ +X(DeclLine, DW_AttribClass_Const) \ +X(Declaration, DW_AttribClass_Flag) \ +X(DiscrList, DW_AttribClass_Block) \ +X(Encoding, DW_AttribClass_Const) \ +X(External, DW_AttribClass_Flag) \ +X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ +X(Friend, DW_AttribClass_Reference) \ +X(IdentifierCase, DW_AttribClass_Const) \ +X(MacroInfo, DW_AttribClass_MacPtr) \ +X(NameListItem, DW_AttribClass_Reference) \ +X(Priority, DW_AttribClass_Reference) \ +X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ +X(Specification, DW_AttribClass_Reference) \ +X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ +X(Type, DW_AttribClass_Reference) \ +X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ +X(VariableParameter, DW_AttribClass_Flag) \ +X(Virtuality, DW_AttribClass_Const) \ +X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ +X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(DataLocation, DW_AttribClass_ExprLoc) \ +X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ +X(EntryPc, DW_AttribClass_Address|DW_AttribClass_Const) \ +X(UseUtf8, DW_AttribClass_Flag) \ +X(Extension, DW_AttribClass_Reference) \ +X(Ranges, DW_AttribClass_RngList) \ +X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ +X(CallColumn, DW_AttribClass_Const) \ +X(CallFile, DW_AttribClass_Const) \ +X(CallLine, DW_AttribClass_Const) \ +X(Description, DW_AttribClass_String) \ +X(BinaryScale, DW_AttribClass_Const) \ +X(DecimalScale, DW_AttribClass_Const) \ +X(Small, DW_AttribClass_Reference) \ +X(DecimalSign, DW_AttribClass_Const) \ +X(DigitCount, DW_AttribClass_Const) \ +X(PictureString, DW_AttribClass_String) \ +X(Mutable, DW_AttribClass_Flag) \ +X(ThreadsScaled, DW_AttribClass_Flag) \ +X(Explicit, DW_AttribClass_Flag) \ +X(ObjectPointer, DW_AttribClass_Reference) \ +X(Endianity, DW_AttribClass_Const) \ +X(Elemental, DW_AttribClass_Flag) \ +X(Pure, DW_AttribClass_Flag) \ +X(Recursive, DW_AttribClass_Flag) \ +X(Signature, DW_AttribClass_Reference) \ +X(MainSubProgram, DW_AttribClass_Flag) \ +X(DataBitOffset, DW_AttribClass_Const) \ +X(ConstExpr, DW_AttribClass_Flag) \ +X(EnumClass, DW_AttribClass_Flag) \ +X(LinkageName, DW_AttribClass_String) \ +X(StringLengthBitSize, DW_AttribClass_Const) \ +X(StringLengthByteSize, DW_AttribClass_Const) \ +X(Rank, DW_AttribClass_Const|DW_AttribClass_ExprLoc) \ +X(StrOffsetsBase, DW_AttribClass_StrOffsetsPtr) \ +X(AddrBase, DW_AttribClass_AddrPtr) \ +X(RngListsBase, DW_AttribClass_RngListPtr) \ +X(DwoName, DW_AttribClass_String) \ +X(Reference, DW_AttribClass_Flag) \ +X(RValueReference, DW_AttribClass_Flag) \ +X(Macros, DW_AttribClass_MacPtr) \ +X(CallAllCalls, DW_AttribClass_Flag) \ +X(CallAllSourceCalls, DW_AttribClass_Flag) \ +X(CallAllTailCalls, DW_AttribClass_Flag) \ +X(CallReturnPc, DW_AttribClass_Address) \ +X(CallValue, DW_AttribClass_ExprLoc) \ +X(CallOrigin, DW_AttribClass_ExprLoc) \ +X(CallParameter, DW_AttribClass_Reference) \ +X(CallPc, DW_AttribClass_Address) \ +X(CallTailCall, DW_AttribClass_Flag) \ +X(CallTarget, DW_AttribClass_ExprLoc) \ +X(CallTargetClobbered, DW_AttribClass_ExprLoc) \ +X(CallDataLocation, DW_AttribClass_ExprLoc) \ +X(CallDataValue, DW_AttribClass_ExprLoc) \ +X(NoReturn, DW_AttribClass_Flag) \ +X(Alignment, DW_AttribClass_Const) \ +X(ExportSymbols, DW_AttribClass_Flag) \ +X(Deleted, DW_AttribClass_Flag) \ +X(Defaulted, DW_AttribClass_Const) \ +X(LocListsBase, DW_AttribClass_LocListPtr) //- Attributes GNU #define DW_AttribKind_GNU_XList \ - X(GNU_Vector, 0x2107) \ - X(GNU_GuardedBy, 0x2108) \ - X(GNU_PtGuardedBy, 0x2109) \ - X(GNU_Guarded, 0x210a) \ - X(GNU_PtGuarded, 0x210b) \ - X(GNU_LocksExcluded, 0x210c) \ - X(GNU_ExclusiveLocksRequired, 0x210d) \ - X(GNU_SharedLocksRequired, 0x210e) \ - X(GNU_OdrSignature, 0x210f) \ - X(GNU_TemplateName, 0x2110) \ - X(GNU_CallSiteValue, 0x2111) \ - X(GNU_CallSiteDataValue, 0x2112) \ - X(GNU_CallSiteTarget, 0x2113) \ - X(GNU_CallSiteTargetClobbered, 0x2114) \ - X(GNU_TailCall, 0x2115) \ - X(GNU_AllTailCallsSites, 0x2116) \ - X(GNU_AllCallSites, 0x2117) \ - X(GNU_AllSourceCallSites, 0x2118) \ - X(GNU_Macros, 0x2119) \ - X(GNU_Deleted, 0x211a) \ - X(GNU_DwoName, 0x2130) \ - X(GNU_DwoId, 0x2131) \ - X(GNU_RangesBase, 0x2132) \ - X(GNU_AddrBase, 0x2133) \ - X(GNU_PubNames, 0x2134) \ - X(GNU_PubTypes, 0x2135) \ - X(GNU_Discriminator, 0x2136) \ - X(GNU_LocViews, 0x2137) \ - X(GNU_EntryView, 0x2138) \ - X(GNU_DescriptiveType, 0x2302) \ - X(GNU_Numerator, 0x2303) \ - X(GNU_Denominator, 0x2304) \ - X(GNU_Bias, 0x2305) +X(GNU_Vector, 0x2107) \ +X(GNU_GuardedBy, 0x2108) \ +X(GNU_PtGuardedBy, 0x2109) \ +X(GNU_Guarded, 0x210a) \ +X(GNU_PtGuarded, 0x210b) \ +X(GNU_LocksExcluded, 0x210c) \ +X(GNU_ExclusiveLocksRequired, 0x210d) \ +X(GNU_SharedLocksRequired, 0x210e) \ +X(GNU_OdrSignature, 0x210f) \ +X(GNU_TemplateName, 0x2110) \ +X(GNU_CallSiteValue, 0x2111) \ +X(GNU_CallSiteDataValue, 0x2112) \ +X(GNU_CallSiteTarget, 0x2113) \ +X(GNU_CallSiteTargetClobbered, 0x2114) \ +X(GNU_TailCall, 0x2115) \ +X(GNU_AllTailCallsSites, 0x2116) \ +X(GNU_AllCallSites, 0x2117) \ +X(GNU_AllSourceCallSites, 0x2118) \ +X(GNU_Macros, 0x2119) \ +X(GNU_Deleted, 0x211a) \ +X(GNU_DwoName, 0x2130) \ +X(GNU_DwoId, 0x2131) \ +X(GNU_RangesBase, 0x2132) \ +X(GNU_AddrBase, 0x2133) \ +X(GNU_PubNames, 0x2134) \ +X(GNU_PubTypes, 0x2135) \ +X(GNU_Discriminator, 0x2136) \ +X(GNU_LocViews, 0x2137) \ +X(GNU_EntryView, 0x2138) \ +X(GNU_DescriptiveType, 0x2302) \ +X(GNU_Numerator, 0x2303) \ +X(GNU_Denominator, 0x2304) \ +X(GNU_Bias, 0x2305) #define DW_AttribKind_ClassFlags_GNU_XList \ - X(GNU_Vector, DW_AttribClass_Flag) \ - X(GNU_GuardedBy, DW_AttribClass_Undefined) \ - X(GNU_PtGuardedBy, DW_AttribClass_Undefined) \ - X(GNU_Guarded, DW_AttribClass_Undefined) \ - X(GNU_PtGuarded, DW_AttribClass_Undefined) \ - X(GNU_LocksExcluded, DW_AttribClass_Undefined) \ - X(GNU_ExclusiveLocksRequired, DW_AttribClass_Undefined) \ - X(GNU_SharedLocksRequired, DW_AttribClass_Undefined) \ - X(GNU_OdrSignature, DW_AttribClass_Undefined) \ - X(GNU_TemplateName, DW_AttribClass_Undefined) \ - X(GNU_CallSiteValue, DW_AttribClass_ExprLoc) \ - X(GNU_CallSiteDataValue, DW_AttribClass_ExprLoc) \ - X(GNU_CallSiteTarget, DW_AttribClass_ExprLoc) \ - X(GNU_CallSiteTargetClobbered, DW_AttribClass_ExprLoc) \ - X(GNU_TailCall, DW_AttribClass_Flag) \ - X(GNU_AllTailCallsSites, DW_AttribClass_Flag) \ - X(GNU_AllCallSites, DW_AttribClass_Flag) \ - X(GNU_AllSourceCallSites, DW_AttribClass_Flag) \ - X(GNU_Macros, DW_AttribClass_Flag) \ - X(GNU_Deleted, DW_AttribClass_Undefined) \ - X(GNU_DwoName, DW_AttribClass_String) \ - X(GNU_DwoId, DW_AttribClass_Const) \ - X(GNU_RangesBase, DW_AttribClass_Undefined) \ - X(GNU_AddrBase, DW_AttribClass_AddrPtr) \ - X(GNU_PubNames, DW_AttribClass_Flag) \ - X(GNU_PubTypes, DW_AttribClass_Undefined) \ - X(GNU_Discriminator, DW_AttribClass_Const) \ - X(GNU_LocViews, DW_AttribClass_LocListPtr) \ - X(GNU_EntryView, DW_AttribClass_Undefined) \ - X(GNU_DescriptiveType, DW_AttribClass_Undefined) \ - X(GNU_Numerator, DW_AttribClass_Undefined) \ - X(GNU_Denominator, DW_AttribClass_Undefined) \ - X(GNU_Bias, DW_AttribClass_Undefined) +X(GNU_Vector, DW_AttribClass_Flag) \ +X(GNU_GuardedBy, DW_AttribClass_Undefined) \ +X(GNU_PtGuardedBy, DW_AttribClass_Undefined) \ +X(GNU_Guarded, DW_AttribClass_Undefined) \ +X(GNU_PtGuarded, DW_AttribClass_Undefined) \ +X(GNU_LocksExcluded, DW_AttribClass_Undefined) \ +X(GNU_ExclusiveLocksRequired, DW_AttribClass_Undefined) \ +X(GNU_SharedLocksRequired, DW_AttribClass_Undefined) \ +X(GNU_OdrSignature, DW_AttribClass_Undefined) \ +X(GNU_TemplateName, DW_AttribClass_Undefined) \ +X(GNU_CallSiteValue, DW_AttribClass_ExprLoc) \ +X(GNU_CallSiteDataValue, DW_AttribClass_ExprLoc) \ +X(GNU_CallSiteTarget, DW_AttribClass_ExprLoc) \ +X(GNU_CallSiteTargetClobbered, DW_AttribClass_ExprLoc) \ +X(GNU_TailCall, DW_AttribClass_Flag) \ +X(GNU_AllTailCallsSites, DW_AttribClass_Flag) \ +X(GNU_AllCallSites, DW_AttribClass_Flag) \ +X(GNU_AllSourceCallSites, DW_AttribClass_Flag) \ +X(GNU_Macros, DW_AttribClass_Flag) \ +X(GNU_Deleted, DW_AttribClass_Undefined) \ +X(GNU_DwoName, DW_AttribClass_String) \ +X(GNU_DwoId, DW_AttribClass_Const) \ +X(GNU_RangesBase, DW_AttribClass_Undefined) \ +X(GNU_AddrBase, DW_AttribClass_AddrPtr) \ +X(GNU_PubNames, DW_AttribClass_Flag) \ +X(GNU_PubTypes, DW_AttribClass_Undefined) \ +X(GNU_Discriminator, DW_AttribClass_Const) \ +X(GNU_LocViews, DW_AttribClass_LocListPtr) \ +X(GNU_EntryView, DW_AttribClass_Undefined) \ +X(GNU_DescriptiveType, DW_AttribClass_Undefined) \ +X(GNU_Numerator, DW_AttribClass_Undefined) \ +X(GNU_Denominator, DW_AttribClass_Undefined) \ +X(GNU_Bias, DW_AttribClass_Undefined) //- Attributes LLVM #define DW_AttribKind_LLVM_XList \ - X(LLVM_IncludePath, 0x3e00) \ - X(LLVM_ConfigMacros, 0x3e01) \ - X(LLVM_SysRoot, 0x3e02) \ - X(LLVM_TagOffset, 0x3e03) \ - X(LLVM_ApiNotes, 0x3e07) +X(LLVM_IncludePath, 0x3e00) \ +X(LLVM_ConfigMacros, 0x3e01) \ +X(LLVM_SysRoot, 0x3e02) \ +X(LLVM_TagOffset, 0x3e03) \ +X(LLVM_ApiNotes, 0x3e07) #define DW_AttribKind_ClassFlags_LLVM_XList \ - X(LLVM_IncludePath, DW_AttribClass_String) \ - X(LLVM_ConfigMacros, DW_AttribClass_String) \ - X(LLVM_SysRoot, DW_AttribClass_String) \ - X(LLVM_TagOffset, DW_AttribClass_Undefined) \ - X(LLVM_ApiNotes, DW_AttribClass_String) +X(LLVM_IncludePath, DW_AttribClass_String) \ +X(LLVM_ConfigMacros, DW_AttribClass_String) \ +X(LLVM_SysRoot, DW_AttribClass_String) \ +X(LLVM_TagOffset, DW_AttribClass_Undefined) \ +X(LLVM_ApiNotes, DW_AttribClass_String) //- Attributes Apple #define DW_AttribKind_APPLE_XList \ - X(APPLE_Optimized, 0x3fe1) \ - X(APPLE_Flags, 0x3fe2) \ - X(APPLE_Isa, 0x3fe3) \ - X(APPLE_Block, 0x3fe4) \ - X(APPLE_MajorRuntimeVers, 0x3fe5) \ - X(APPLE_RuntimeClass, 0x3fe6) \ - X(APPLE_OmitFramePtr, 0x3fe7) \ - X(APPLE_PropertyName, 0x3fe8) \ - X(APPLE_PropertyGetter, 0x3fe9) \ - X(APPLE_PropertySetter, 0x3fea) \ - X(APPLE_PropertyAttribute, 0x3feb) \ - X(APPLE_ObjcCompleteType, 0x3fec) \ - X(APPLE_Property, 0x3fed) \ - X(APPLE_ObjDirect, 0x3fee) \ - X(APPLE_Sdk, 0x3fef) +X(APPLE_Optimized, 0x3fe1) \ +X(APPLE_Flags, 0x3fe2) \ +X(APPLE_Isa, 0x3fe3) \ +X(APPLE_Block, 0x3fe4) \ +X(APPLE_MajorRuntimeVers, 0x3fe5) \ +X(APPLE_RuntimeClass, 0x3fe6) \ +X(APPLE_OmitFramePtr, 0x3fe7) \ +X(APPLE_PropertyName, 0x3fe8) \ +X(APPLE_PropertyGetter, 0x3fe9) \ +X(APPLE_PropertySetter, 0x3fea) \ +X(APPLE_PropertyAttribute, 0x3feb) \ +X(APPLE_ObjcCompleteType, 0x3fec) \ +X(APPLE_Property, 0x3fed) \ +X(APPLE_ObjDirect, 0x3fee) \ +X(APPLE_Sdk, 0x3fef) #define DW_AttribKind_ClassFlags_APPLE_XList \ - X(APPLE_Optimized, DW_AttribClass_Flag) \ - X(APPLE_Flags, DW_AttribClass_Flag) \ - X(APPLE_Isa, DW_AttribClass_Flag) \ - X(APPLE_Block, DW_AttribClass_Undefined) \ - X(APPLE_MajorRuntimeVers, DW_AttribClass_Undefined) \ - X(APPLE_RuntimeClass, DW_AttribClass_Undefined) \ - X(APPLE_OmitFramePtr, DW_AttribClass_Flag) \ - X(APPLE_PropertyName, DW_AttribClass_Undefined) \ - X(APPLE_PropertyGetter, DW_AttribClass_Undefined) \ - X(APPLE_PropertySetter, DW_AttribClass_Undefined) \ - X(APPLE_PropertyAttribute, DW_AttribClass_Undefined) \ - X(APPLE_ObjcCompleteType, DW_AttribClass_Undefined) \ - X(APPLE_Property, DW_AttribClass_Undefined) \ - X(APPLE_ObjDirect, DW_AttribClass_Undefined) \ - X(APPLE_Sdk, DW_AttribClass_String) +X(APPLE_Optimized, DW_AttribClass_Flag) \ +X(APPLE_Flags, DW_AttribClass_Flag) \ +X(APPLE_Isa, DW_AttribClass_Flag) \ +X(APPLE_Block, DW_AttribClass_Undefined) \ +X(APPLE_MajorRuntimeVers, DW_AttribClass_Undefined) \ +X(APPLE_RuntimeClass, DW_AttribClass_Undefined) \ +X(APPLE_OmitFramePtr, DW_AttribClass_Flag) \ +X(APPLE_PropertyName, DW_AttribClass_Undefined) \ +X(APPLE_PropertyGetter, DW_AttribClass_Undefined) \ +X(APPLE_PropertySetter, DW_AttribClass_Undefined) \ +X(APPLE_PropertyAttribute, DW_AttribClass_Undefined) \ +X(APPLE_ObjcCompleteType, DW_AttribClass_Undefined) \ +X(APPLE_Property, DW_AttribClass_Undefined) \ +X(APPLE_ObjDirect, DW_AttribClass_Undefined) \ +X(APPLE_Sdk, DW_AttribClass_String) //- Attributes MIPS #define DW_AttribKind_MIPS_XList \ - X(MIPS_Fde, 0x2001) \ - X(MIPS_LoopBegin, 0x2002) \ - X(MIPS_TailLoopBegin, 0x2003) \ - X(MIPS_EpilogBegin, 0x2004) \ - X(MIPS_LoopUnrollFactor, 0x2005) \ - X(MIPS_SoftwarePipelineDepth, 0x2006) \ - X(MIPS_LinkageName, 0x2007) \ - X(MIPS_Stride, 0x2008) \ - X(MIPS_AbstractName, 0x2009) \ - X(MIPS_CloneOrigin, 0x200a) \ - X(MIPS_HasInlines, 0x200b) \ - X(MIPS_StrideByte, 0x200c) \ - X(MIPS_StrideElem, 0x200d) \ - X(MIPS_PtrDopeType, 0x200e) \ - X(MIPS_AllocatableDopeType, 0x200f) \ - X(MIPS_AssumedShapeDopeType, 0x2010) \ - X(MIPS_AssumedSize, 0x2011) +X(MIPS_Fde, 0x2001) \ +X(MIPS_LoopBegin, 0x2002) \ +X(MIPS_TailLoopBegin, 0x2003) \ +X(MIPS_EpilogBegin, 0x2004) \ +X(MIPS_LoopUnrollFactor, 0x2005) \ +X(MIPS_SoftwarePipelineDepth, 0x2006) \ +X(MIPS_LinkageName, 0x2007) \ +X(MIPS_Stride, 0x2008) \ +X(MIPS_AbstractName, 0x2009) \ +X(MIPS_CloneOrigin, 0x200a) \ +X(MIPS_HasInlines, 0x200b) \ +X(MIPS_StrideByte, 0x200c) \ +X(MIPS_StrideElem, 0x200d) \ +X(MIPS_PtrDopeType, 0x200e) \ +X(MIPS_AllocatableDopeType, 0x200f) \ +X(MIPS_AssumedShapeDopeType, 0x2010) \ +X(MIPS_AssumedSize, 0x2011) #define DW_AttribKind_ClassFlags_MIPS_XList \ - X(MIPS_Fde, DW_AttribClass_Block) \ - X(MIPS_LoopBegin, DW_AttribClass_Block) \ - X(MIPS_TailLoopBegin, DW_AttribClass_Block) \ - X(MIPS_EpilogBegin, DW_AttribClass_Block) \ - X(MIPS_LoopUnrollFactor, DW_AttribClass_Block) \ - X(MIPS_SoftwarePipelineDepth, DW_AttribClass_Block) \ - X(MIPS_LinkageName, DW_AttribClass_String) \ - X(MIPS_Stride, DW_AttribClass_Block) \ - X(MIPS_AbstractName, DW_AttribClass_String) \ - X(MIPS_CloneOrigin, DW_AttribClass_String) \ - X(MIPS_HasInlines, DW_AttribClass_Reference) \ - X(MIPS_StrideByte, DW_AttribClass_Reference) \ - X(MIPS_StrideElem, DW_AttribClass_Reference) \ - X(MIPS_PtrDopeType, DW_AttribClass_Reference) \ - X(MIPS_AllocatableDopeType, DW_AttribClass_Reference) \ - X(MIPS_AssumedShapeDopeType, DW_AttribClass_Reference) \ - X(MIPS_AssumedSize, DW_AttribClass_Reference) +X(MIPS_Fde, DW_AttribClass_Block) \ +X(MIPS_LoopBegin, DW_AttribClass_Block) \ +X(MIPS_TailLoopBegin, DW_AttribClass_Block) \ +X(MIPS_EpilogBegin, DW_AttribClass_Block) \ +X(MIPS_LoopUnrollFactor, DW_AttribClass_Block) \ +X(MIPS_SoftwarePipelineDepth, DW_AttribClass_Block) \ +X(MIPS_LinkageName, DW_AttribClass_String) \ +X(MIPS_Stride, DW_AttribClass_Block) \ +X(MIPS_AbstractName, DW_AttribClass_String) \ +X(MIPS_CloneOrigin, DW_AttribClass_String) \ +X(MIPS_HasInlines, DW_AttribClass_Reference) \ +X(MIPS_StrideByte, DW_AttribClass_Reference) \ +X(MIPS_StrideElem, DW_AttribClass_Reference) \ +X(MIPS_PtrDopeType, DW_AttribClass_Reference) \ +X(MIPS_AllocatableDopeType, DW_AttribClass_Reference) \ +X(MIPS_AssumedShapeDopeType, DW_AttribClass_Reference) \ +X(MIPS_AssumedSize, DW_AttribClass_Reference) typedef U32 DW_AttribKind; typedef enum DW_AttribKindEnum @@ -1202,38 +1202,38 @@ typedef enum DW_AttribKindEnum DW_AttribKind_Null, #define X(_N,_ID,...) DW_AttribKind_##_N = _ID, DW_AttribKind_V2_XList - DW_AttribKind_V3_XList - DW_AttribKind_V4_XList - DW_AttribKind_V5_XList - DW_AttribKind_GNU_XList - DW_AttribKind_LLVM_XList - DW_AttribKind_APPLE_XList - DW_AttribKind_MIPS_XList + DW_AttribKind_V3_XList + DW_AttribKind_V4_XList + DW_AttribKind_V5_XList + DW_AttribKind_GNU_XList + DW_AttribKind_LLVM_XList + DW_AttribKind_APPLE_XList + DW_AttribKind_MIPS_XList #undef X DW_AttribKind_UserLo = 0x2000, DW_AttribKind_UserHi = 0x3fff } DW_AttribKindEnum; #define DW_ATE_XList \ - X(Null, 0x00) \ - X(Address, 0x01) \ - X(Boolean, 0x02) \ - X(ComplexFloat, 0x03) \ - X(Float, 0x04) \ - X(Signed, 0x05) \ - X(SignedChar, 0x06) \ - X(Unsigned, 0x07) \ - X(UnsignedChar, 0x08) \ - X(ImaginaryFloat, 0x09) \ - X(PackedDecimal, 0x0A) \ - X(NumericString, 0x0B) \ - X(Edited, 0x0C) \ - X(SignedFixed, 0x0D) \ - X(UnsignedFixed, 0x0E) \ - X(DecimalFloat, 0x0F) \ - X(Utf, 0x10) \ - X(Ucs, 0x11) \ - X(Ascii, 0x12) +X(Null, 0x00) \ +X(Address, 0x01) \ +X(Boolean, 0x02) \ +X(ComplexFloat, 0x03) \ +X(Float, 0x04) \ +X(Signed, 0x05) \ +X(SignedChar, 0x06) \ +X(Unsigned, 0x07) \ +X(UnsignedChar, 0x08) \ +X(ImaginaryFloat, 0x09) \ +X(PackedDecimal, 0x0A) \ +X(NumericString, 0x0B) \ +X(Edited, 0x0C) \ +X(SignedFixed, 0x0D) \ +X(UnsignedFixed, 0x0E) \ +X(DecimalFloat, 0x0F) \ +X(Utf, 0x10) \ +X(Ucs, 0x11) \ +X(Ascii, 0x12) typedef U64 DW_ATE; typedef enum DW_ATEEnum @@ -1244,11 +1244,11 @@ typedef enum DW_ATEEnum } DW_ATEnum; #define DW_CallingConventionKind_XList \ - X(Normal, 0x0) \ - X(Program, 0x1) \ - X(NoCall, 0x3) \ - X(PassByValue, 0x4) \ - X(PassByReference, 0x5) +X(Normal, 0x0) \ +X(Program, 0x1) \ +X(NoCall, 0x3) \ +X(PassByValue, 0x4) \ +X(PassByReference, 0x5) typedef U64 DW_CallingConventionKind; typedef enum DW_CallingConventionKindEnum @@ -1259,9 +1259,9 @@ typedef enum DW_CallingConventionKindEnum } DW_CallingConventionKindEnum; #define DW_AccessKind_XList \ - X(Public, 0x00) \ - X(Private, 0x01) \ - X(Protected, 0x02) +X(Public, 0x00) \ +X(Private, 0x01) \ +X(Protected, 0x02) typedef U64 DW_AccessKind; typedef enum DW_AccessKindEnum @@ -1272,9 +1272,9 @@ typedef enum DW_AccessKindEnum } DW_AccessKindEnum; #define DW_VirtualityKind_XList \ - X(None, 0x00) \ - X(Virtual, 0x01) \ - X(PureVirtual, 0x02) +X(None, 0x00) \ +X(Virtual, 0x01) \ +X(PureVirtual, 0x02) typedef U64 DW_VirtualityKind; typedef enum DW_VirtualityEnum @@ -1285,14 +1285,14 @@ typedef enum DW_VirtualityEnum } DW_VirtualityEnum; #define DW_RngListEntryKind \ - X(EndOfList, 0x00) \ - X(BaseAddressx, 0x01) \ - X(StartxEndx, 0x02) \ - X(StartxLength, 0x03) \ - X(OffsetPair, 0x04) \ - X(BaseAddress, 0x05) \ - X(StartEnd, 0x06) \ - X(StartLength, 0x07) +X(EndOfList, 0x00) \ +X(BaseAddressx, 0x01) \ +X(StartxEndx, 0x02) \ +X(StartxLength, 0x03) \ +X(OffsetPair, 0x04) \ +X(BaseAddress, 0x05) \ +X(StartEnd, 0x06) \ +X(StartLength, 0x07) typedef U8 DW_RLE; typedef enum DW_RLE_Enum @@ -1303,15 +1303,15 @@ typedef enum DW_RLE_Enum } DW_RLE_Enum; #define DW_LocListEntry_XList \ - X(EndOfList, 0x00) \ - X(BaseAddressx, 0x01) \ - X(StartxEndx, 0x02) \ - X(StartxLength, 0x03) \ - X(OffsetPair, 0x04) \ - X(DefaultLocation, 0x05) \ - X(BaseAddress, 0x06) \ - X(StartEnd, 0x07) \ - X(StartLength, 0x08) +X(EndOfList, 0x00) \ +X(BaseAddressx, 0x01) \ +X(StartxEndx, 0x02) \ +X(StartxLength, 0x03) \ +X(OffsetPair, 0x04) \ +X(DefaultLocation, 0x05) \ +X(BaseAddress, 0x06) \ +X(StartEnd, 0x07) \ +X(StartLength, 0x08) #define DW_LocListEntry_GNU_XList(X) \ X(GNU_ViewPair, 0x9) @@ -1325,12 +1325,12 @@ typedef enum DW_LLE_Enum } DW_LLEEnum; #define DW_AddrClass_XList \ - X(None, 0) \ - X(Near16, 1) \ - X(Far16, 2) \ - X(Huge16, 3) \ - X(Near32, 4) \ - X(Far32, 5) +X(None, 0) \ +X(Near16, 1) \ +X(Far16, 2) \ +X(Huge16, 3) \ +X(Near32, 4) \ +X(Far32, 5) typedef U64 DW_AddrClass; typedef enum DW_AddrClassEnum @@ -1341,13 +1341,13 @@ typedef enum DW_AddrClassEnum } DW_AddrClassEnum; #define DW_CompUnitKind_XList \ - X(Reserved, 0) \ - X(Compile, 1) \ - X(Type, 2) \ - X(Partial, 3) \ - X(Skeleton, 4) \ - X(SplitCompile, 5) \ - X(SplitType, 6) +X(Reserved, 0) \ +X(Compile, 1) \ +X(Type, 2) \ +X(Partial, 3) \ +X(Skeleton, 4) \ +X(SplitCompile, 5) \ +X(SplitType, 6) typedef U8 DW_CompUnitKind; typedef enum DW_CompUnitKindEnum @@ -1360,12 +1360,12 @@ typedef enum DW_CompUnitKindEnum } DW_CompUnitKindEnum; #define DW_LNCT_XList \ - X(Path, 0x1) \ - X(DirectoryIndex, 0x2) \ - X(TimeStamp, 0x3) \ - X(Size, 0x4) \ - X(MD5, 0x5) \ - X(LLVM_Source, 0x2001) +X(Path, 0x1) \ +X(DirectoryIndex, 0x2) \ +X(TimeStamp, 0x3) \ +X(Size, 0x4) \ +X(MD5, 0x5) \ +X(LLVM_Source, 0x2001) typedef U64 DW_LNCT; typedef enum DW_LNCTEnum @@ -1390,32 +1390,32 @@ typedef enum // (opcode name, opcode id, operand count, operand types) #define DW_CFA_Kind_XList \ - X(Nop, 0x0) \ - X(SetLoc, 0x1, DW_CFA_OperandType_Value) \ - X(AdvanceLoc1, 0x2, DW_CFA_OperandType_Value) \ - X(AdvanceLoc2, 0x3, DW_CFA_OperandType_Value) \ - X(AdvanceLoc4, 0x4, DW_CFA_OperandType_Value) \ - X(OffsetExt, 0x5, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ - X(RestoreExt, 0x6) \ - X(Undefined, 0x7, DW_CFA_OperandType_Register) \ - X(SameValue, 0x8, DW_CFA_OperandType_Register) \ - X(Register, 0x9, DW_CFA_OperandType_Register) \ - X(RememberState, 0xa) \ - X(RestoreState, 0xb) \ - X(DefCfa, 0xc, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ - X(DefCfaRegister, 0xd, DW_CFA_OperandType_Register) \ - X(DefCfaOffset, 0xe, DW_CFA_OperandType_Value) \ - X(DefCfaExpr, 0xf, DW_CFA_OperandType_Expression) \ - X(Expr, 0x10, DW_CFA_OperandType_Expression) \ - X(OffsetExtSf, 0x11, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ - X(DefCfaSf, 0x12, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ - X(DefCfaOffsetSf, 0x13, DW_CFA_OperandType_Value) \ - X(ValOffset, 0x14, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ - X(ValOffsetSf, 0x15, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ - X(ValExpr, 0x16, DW_CFA_OperandType_Register, DW_CFA_OperandType_Expression) \ - X(AdvanceLoc, 0x40, DW_CFA_OperandType_Value) \ - X(Offset, 0x80, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ - X(Restore, 0xc0, DW_CFA_OperandType_Register) +X(Nop, 0x0) \ +X(SetLoc, 0x1, DW_CFA_OperandType_Value) \ +X(AdvanceLoc1, 0x2, DW_CFA_OperandType_Value) \ +X(AdvanceLoc2, 0x3, DW_CFA_OperandType_Value) \ +X(AdvanceLoc4, 0x4, DW_CFA_OperandType_Value) \ +X(OffsetExt, 0x5, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ +X(RestoreExt, 0x6) \ +X(Undefined, 0x7, DW_CFA_OperandType_Register) \ +X(SameValue, 0x8, DW_CFA_OperandType_Register) \ +X(Register, 0x9, DW_CFA_OperandType_Register) \ +X(RememberState, 0xa) \ +X(RestoreState, 0xb) \ +X(DefCfa, 0xc, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ +X(DefCfaRegister, 0xd, DW_CFA_OperandType_Register) \ +X(DefCfaOffset, 0xe, DW_CFA_OperandType_Value) \ +X(DefCfaExpr, 0xf, DW_CFA_OperandType_Expression) \ +X(Expr, 0x10, DW_CFA_OperandType_Expression) \ +X(OffsetExtSf, 0x11, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ +X(DefCfaSf, 0x12, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ +X(DefCfaOffsetSf, 0x13, DW_CFA_OperandType_Value) \ +X(ValOffset, 0x14, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ +X(ValOffsetSf, 0x15, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ +X(ValExpr, 0x16, DW_CFA_OperandType_Register, DW_CFA_OperandType_Expression) \ +X(AdvanceLoc, 0x40, DW_CFA_OperandType_Value) \ +X(Offset, 0x80, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ +X(Restore, 0xc0, DW_CFA_OperandType_Register) #define DW_CFA_OperandMax 2 #define DW_CFA_Mask_OpcodeHi 0xc0 @@ -1452,280 +1452,280 @@ typedef enum // (opcode name, opcode id, operand count, pop count, push count, operand0 type, operand1 type) #define DW_Expr_V3_XList \ - X(Null, 0x00, 0, 0, 0, Null, Null) \ - X(Addr, 0x03, 1, 0, 1, Addr, Null) \ - X(Deref, 0x06, 0, 1, 1, Null, Null) \ - X(Const1U, 0x08, 1, 0, 1, U8, Null) \ - X(Const1S, 0x09, 1, 0, 1, S8, Null) \ - X(Const2U, 0x0a, 1, 0, 1, U16, Null) \ - X(Const2S, 0x0b, 1, 0, 1, S16, Null) \ - X(Const4U, 0x0c, 1, 0, 1, U32, Null) \ - X(Const4S, 0x0d, 1, 0, 1, S32, Null) \ - X(Const8U, 0x0e, 1, 0, 1, U64, Null) \ - X(Const8S, 0x0f, 1, 0, 1, S64, Null) \ - X(ConstU, 0x10, 1, 0, 1, ULEB128, Null) \ - X(ConstS, 0x11, 1, 0, 1, SLEB128, Null) \ - X(Dup, 0x12, 0, 0, 1, Null, Null) \ - X(Drop, 0x13, 0, 1, 0, Null, Null) \ - X(Over, 0x14, 0, 0, 1, Null, Null) \ - X(Pick, 0x15, 1, 0, 1, U8, Null) \ - X(Swap, 0x16, 0, 0, 0, Null, Null) \ - X(Rot, 0x17, 0, 0, 0, Null, Null) \ - X(XDeref, 0x18, 0, 2, 1, Null, Null) \ - X(Abs, 0x19, 0, 1, 1, Null, Null) \ - X(And, 0x1a, 0, 2, 1, Null, Null) \ - X(Div, 0x1b, 0, 2, 1, Null, Null) \ - X(Minus, 0x1c, 0, 2, 1, Null, Null) \ - X(Mod, 0x1d, 0, 2, 1, Null, Null) \ - X(Mul, 0x1e, 0, 2, 1, Null, Null) \ - X(Neg, 0x1f, 0, 1, 1, Null, Null) \ - X(Not, 0x20, 0, 1, 1, Null, Null) \ - X(Or, 0x21, 0, 2, 1, Null, Null) \ - X(Plus, 0x22, 0, 2, 1, Null, Null) \ - X(PlusUConst, 0x23, 1, 1, 1, ULEB128, Null) \ - X(Shl, 0x24, 0, 2, 1, Null, Null) \ - X(Shr, 0x25, 0, 2, 1, Null, Null) \ - X(Shra, 0x26, 0, 2, 1, Null, Null) \ - X(Xor, 0x27, 0, 2, 1, Null, Null) \ - X(Bra, 0x28, 1, 1, 0, S16, Null) \ - X(Eq, 0x29, 0, 2, 1, Null, Null) \ - X(Ge, 0x2a, 0, 2, 1, Null, Null) \ - X(Gt, 0x2b, 0, 2, 1, Null, Null) \ - X(Le, 0x2c, 0, 2, 1, Null, Null) \ - X(Lt, 0x2d, 0, 2, 1, Null, Null) \ - X(Ne, 0x2e, 0, 2, 1, Null, Null) \ - X(Skip, 0x2f, 1, 0, 0, S16, Null) \ - X(Lit0, 0x30, 0, 0, 0, Null, Null) \ - X(Lit1, 0x31, 0, 0, 0, Null, Null) \ - X(Lit2, 0x32, 0, 0, 0, Null, Null) \ - X(Lit3, 0x33, 0, 0, 0, Null, Null) \ - X(Lit4, 0x34, 0, 0, 0, Null, Null) \ - X(Lit5, 0x35, 0, 0, 0, Null, Null) \ - X(Lit6, 0x36, 0, 0, 0, Null, Null) \ - X(Lit7, 0x37, 0, 0, 0, Null, Null) \ - X(Lit8, 0x38, 0, 0, 0, Null, Null) \ - X(Lit9, 0x39, 0, 0, 0, Null, Null) \ - X(Lit10, 0x3a, 0, 0, 0, Null, Null) \ - X(Lit11, 0x3b, 0, 0, 0, Null, Null) \ - X(Lit12, 0x3c, 0, 0, 0, Null, Null) \ - X(Lit13, 0x3d, 0, 0, 0, Null, Null) \ - X(Lit14, 0x3e, 0, 0, 0, Null, Null) \ - X(Lit15, 0x3f, 0, 0, 0, Null, Null) \ - X(Lit16, 0x40, 0, 0, 0, Null, Null) \ - X(Lit17, 0x41, 0, 0, 0, Null, Null) \ - X(Lit18, 0x42, 0, 0, 0, Null, Null) \ - X(Lit19, 0x43, 0, 0, 0, Null, Null) \ - X(Lit20, 0x44, 0, 0, 0, Null, Null) \ - X(Lit21, 0x45, 0, 0, 0, Null, Null) \ - X(Lit22, 0x46, 0, 0, 0, Null, Null) \ - X(Lit23, 0x47, 0, 0, 0, Null, Null) \ - X(Lit24, 0x48, 0, 0, 0, Null, Null) \ - X(Lit25, 0x49, 0, 0, 0, Null, Null) \ - X(Lit26, 0x4a, 0, 0, 0, Null, Null) \ - X(Lit27, 0x4b, 0, 0, 0, Null, Null) \ - X(Lit28, 0x4c, 0, 0, 0, Null, Null) \ - X(Lit29, 0x4d, 0, 0, 0, Null, Null) \ - X(Lit30, 0x4e, 0, 0, 0, Null, Null) \ - X(Lit31, 0x4f, 0, 0, 0, Null, Null) \ - X(Reg0, 0x50, 0, 0, 1, Null, Null) \ - X(Reg1, 0x51, 0, 0, 1, Null, Null) \ - X(Reg2, 0x52, 0, 0, 1, Null, Null) \ - X(Reg3, 0x53, 0, 0, 1, Null, Null) \ - X(Reg4, 0x54, 0, 0, 1, Null, Null) \ - X(Reg5, 0x55, 0, 0, 1, Null, Null) \ - X(Reg6, 0x56, 0, 0, 1, Null, Null) \ - X(Reg7, 0x57, 0, 0, 1, Null, Null) \ - X(Reg8, 0x58, 0, 0, 1, Null, Null) \ - X(Reg9, 0x59, 0, 0, 1, Null, Null) \ - X(Reg10, 0x5a, 0, 0, 1, Null, Null) \ - X(Reg11, 0x5b, 0, 0, 1, Null, Null) \ - X(Reg12, 0x5c, 0, 0, 1, Null, Null) \ - X(Reg13, 0x5d, 0, 0, 1, Null, Null) \ - X(Reg14, 0x5e, 0, 0, 1, Null, Null) \ - X(Reg15, 0x5f, 0, 0, 1, Null, Null) \ - X(Reg16, 0x60, 0, 0, 1, Null, Null) \ - X(Reg17, 0x61, 0, 0, 1, Null, Null) \ - X(Reg18, 0x62, 0, 0, 1, Null, Null) \ - X(Reg19, 0x63, 0, 0, 1, Null, Null) \ - X(Reg20, 0x64, 0, 0, 1, Null, Null) \ - X(Reg21, 0x65, 0, 0, 1, Null, Null) \ - X(Reg22, 0x66, 0, 0, 1, Null, Null) \ - X(Reg23, 0x67, 0, 0, 1, Null, Null) \ - X(Reg24, 0x68, 0, 0, 1, Null, Null) \ - X(Reg25, 0x69, 0, 0, 1, Null, Null) \ - X(Reg26, 0x6a, 0, 0, 1, Null, Null) \ - X(Reg27, 0x6b, 0, 0, 1, Null, Null) \ - X(Reg28, 0x6c, 0, 0, 1, Null, Null) \ - X(Reg29, 0x6d, 0, 0, 1, Null, Null) \ - X(Reg30, 0x6e, 0, 0, 1, Null, Null) \ - X(Reg31, 0x6f, 0, 0, 1, Null, Null) \ - X(BReg0, 0x70, 1, 0, 1, SLEB128, Null) \ - X(BReg1, 0x71, 1, 0, 1, SLEB128, Null) \ - X(BReg2, 0x72, 1, 0, 1, SLEB128, Null) \ - X(BReg3, 0x73, 1, 0, 1, SLEB128, Null) \ - X(BReg4, 0x74, 1, 0, 1, SLEB128, Null) \ - X(BReg5, 0x75, 1, 0, 1, SLEB128, Null) \ - X(BReg6, 0x76, 1, 0, 1, SLEB128, Null) \ - X(BReg7, 0x77, 1, 0, 1, SLEB128, Null) \ - X(BReg8, 0x78, 1, 0, 1, SLEB128, Null) \ - X(BReg9, 0x79, 1, 0, 1, SLEB128, Null) \ - X(BReg10, 0x7a, 1, 0, 1, SLEB128, Null) \ - X(BReg11, 0x7b, 1, 0, 1, SLEB128, Null) \ - X(BReg12, 0x7c, 1, 0, 1, SLEB128, Null) \ - X(BReg13, 0x7d, 1, 0, 1, SLEB128, Null) \ - X(BReg14, 0x7e, 1, 0, 1, SLEB128, Null) \ - X(BReg15, 0x7f, 1, 0, 1, SLEB128, Null) \ - X(BReg16, 0x80, 1, 0, 1, SLEB128, Null) \ - X(BReg17, 0x81, 1, 0, 1, SLEB128, Null) \ - X(BReg18, 0x82, 1, 0, 1, SLEB128, Null) \ - X(BReg19, 0x83, 1, 0, 1, SLEB128, Null) \ - X(BReg20, 0x84, 1, 0, 1, SLEB128, Null) \ - X(BReg21, 0x85, 1, 0, 1, SLEB128, Null) \ - X(BReg22, 0x86, 1, 0, 1, SLEB128, Null) \ - X(BReg23, 0x87, 1, 0, 1, SLEB128, Null) \ - X(BReg24, 0x88, 1, 0, 1, SLEB128, Null) \ - X(BReg25, 0x89, 1, 0, 1, SLEB128, Null) \ - X(BReg26, 0x8a, 1, 0, 1, SLEB128, Null) \ - X(BReg27, 0x8b, 1, 0, 1, SLEB128, Null) \ - X(BReg28, 0x8c, 1, 0, 1, SLEB128, Null) \ - X(BReg29, 0x8d, 1, 0, 1, SLEB128, Null) \ - X(BReg30, 0x8e, 1, 0, 1, SLEB128, Null) \ - X(BReg31, 0x8f, 1, 0, 1, SLEB128, Null) \ - X(RegX, 0x90, 1, 0, 1, ULEB128, Null) \ - X(FBReg, 0x91, 1, 0, 1, SLEB128, Null) \ - X(BRegX, 0x92, 2, 0, 1, ULEB128, SLEB128) \ - X(Piece, 0x93, 1, 0, 0, ULEB128, Null) \ - X(DerefSize, 0x94, 1, 1, 1, U8, Null) \ - X(XDerefSize, 0x95, 1, 2, 1, U8, Null) \ - X(Nop, 0x96, 0, 0, 0, Null, Null) \ - X(PushObjectAddress, 0x97, 0, 0, 1, Null, Null) \ - X(Call2, 0x98, 1, 0, 0, U16, Null) \ - X(Call4, 0x99, 1, 0, 0, U32, Null) \ - X(CallRef, 0x9a, 1, 0, 0, DwarfUInt,Null) \ - X(FormTlsAddress, 0x9b, 0, 0, 1, Null, Null) \ - X(CallFrameCfa, 0x9c, 0, 0, 1, Null, Null) \ - X(BitPiece, 0x9d, 2, 0, 0, ULEB128, ULEB128) +X(Null, 0x00, 0, 0, 0, Null, Null) \ +X(Addr, 0x03, 1, 0, 1, Addr, Null) \ +X(Deref, 0x06, 0, 1, 1, Null, Null) \ +X(Const1U, 0x08, 1, 0, 1, U8, Null) \ +X(Const1S, 0x09, 1, 0, 1, S8, Null) \ +X(Const2U, 0x0a, 1, 0, 1, U16, Null) \ +X(Const2S, 0x0b, 1, 0, 1, S16, Null) \ +X(Const4U, 0x0c, 1, 0, 1, U32, Null) \ +X(Const4S, 0x0d, 1, 0, 1, S32, Null) \ +X(Const8U, 0x0e, 1, 0, 1, U64, Null) \ +X(Const8S, 0x0f, 1, 0, 1, S64, Null) \ +X(ConstU, 0x10, 1, 0, 1, ULEB128, Null) \ +X(ConstS, 0x11, 1, 0, 1, SLEB128, Null) \ +X(Dup, 0x12, 0, 0, 1, Null, Null) \ +X(Drop, 0x13, 0, 1, 0, Null, Null) \ +X(Over, 0x14, 0, 0, 1, Null, Null) \ +X(Pick, 0x15, 1, 0, 1, U8, Null) \ +X(Swap, 0x16, 0, 0, 0, Null, Null) \ +X(Rot, 0x17, 0, 0, 0, Null, Null) \ +X(XDeref, 0x18, 0, 2, 1, Null, Null) \ +X(Abs, 0x19, 0, 1, 1, Null, Null) \ +X(And, 0x1a, 0, 2, 1, Null, Null) \ +X(Div, 0x1b, 0, 2, 1, Null, Null) \ +X(Minus, 0x1c, 0, 2, 1, Null, Null) \ +X(Mod, 0x1d, 0, 2, 1, Null, Null) \ +X(Mul, 0x1e, 0, 2, 1, Null, Null) \ +X(Neg, 0x1f, 0, 1, 1, Null, Null) \ +X(Not, 0x20, 0, 1, 1, Null, Null) \ +X(Or, 0x21, 0, 2, 1, Null, Null) \ +X(Plus, 0x22, 0, 2, 1, Null, Null) \ +X(PlusUConst, 0x23, 1, 1, 1, ULEB128, Null) \ +X(Shl, 0x24, 0, 2, 1, Null, Null) \ +X(Shr, 0x25, 0, 2, 1, Null, Null) \ +X(Shra, 0x26, 0, 2, 1, Null, Null) \ +X(Xor, 0x27, 0, 2, 1, Null, Null) \ +X(Bra, 0x28, 1, 1, 0, S16, Null) \ +X(Eq, 0x29, 0, 2, 1, Null, Null) \ +X(Ge, 0x2a, 0, 2, 1, Null, Null) \ +X(Gt, 0x2b, 0, 2, 1, Null, Null) \ +X(Le, 0x2c, 0, 2, 1, Null, Null) \ +X(Lt, 0x2d, 0, 2, 1, Null, Null) \ +X(Ne, 0x2e, 0, 2, 1, Null, Null) \ +X(Skip, 0x2f, 1, 0, 0, S16, Null) \ +X(Lit0, 0x30, 0, 0, 0, Null, Null) \ +X(Lit1, 0x31, 0, 0, 0, Null, Null) \ +X(Lit2, 0x32, 0, 0, 0, Null, Null) \ +X(Lit3, 0x33, 0, 0, 0, Null, Null) \ +X(Lit4, 0x34, 0, 0, 0, Null, Null) \ +X(Lit5, 0x35, 0, 0, 0, Null, Null) \ +X(Lit6, 0x36, 0, 0, 0, Null, Null) \ +X(Lit7, 0x37, 0, 0, 0, Null, Null) \ +X(Lit8, 0x38, 0, 0, 0, Null, Null) \ +X(Lit9, 0x39, 0, 0, 0, Null, Null) \ +X(Lit10, 0x3a, 0, 0, 0, Null, Null) \ +X(Lit11, 0x3b, 0, 0, 0, Null, Null) \ +X(Lit12, 0x3c, 0, 0, 0, Null, Null) \ +X(Lit13, 0x3d, 0, 0, 0, Null, Null) \ +X(Lit14, 0x3e, 0, 0, 0, Null, Null) \ +X(Lit15, 0x3f, 0, 0, 0, Null, Null) \ +X(Lit16, 0x40, 0, 0, 0, Null, Null) \ +X(Lit17, 0x41, 0, 0, 0, Null, Null) \ +X(Lit18, 0x42, 0, 0, 0, Null, Null) \ +X(Lit19, 0x43, 0, 0, 0, Null, Null) \ +X(Lit20, 0x44, 0, 0, 0, Null, Null) \ +X(Lit21, 0x45, 0, 0, 0, Null, Null) \ +X(Lit22, 0x46, 0, 0, 0, Null, Null) \ +X(Lit23, 0x47, 0, 0, 0, Null, Null) \ +X(Lit24, 0x48, 0, 0, 0, Null, Null) \ +X(Lit25, 0x49, 0, 0, 0, Null, Null) \ +X(Lit26, 0x4a, 0, 0, 0, Null, Null) \ +X(Lit27, 0x4b, 0, 0, 0, Null, Null) \ +X(Lit28, 0x4c, 0, 0, 0, Null, Null) \ +X(Lit29, 0x4d, 0, 0, 0, Null, Null) \ +X(Lit30, 0x4e, 0, 0, 0, Null, Null) \ +X(Lit31, 0x4f, 0, 0, 0, Null, Null) \ +X(Reg0, 0x50, 0, 0, 1, Null, Null) \ +X(Reg1, 0x51, 0, 0, 1, Null, Null) \ +X(Reg2, 0x52, 0, 0, 1, Null, Null) \ +X(Reg3, 0x53, 0, 0, 1, Null, Null) \ +X(Reg4, 0x54, 0, 0, 1, Null, Null) \ +X(Reg5, 0x55, 0, 0, 1, Null, Null) \ +X(Reg6, 0x56, 0, 0, 1, Null, Null) \ +X(Reg7, 0x57, 0, 0, 1, Null, Null) \ +X(Reg8, 0x58, 0, 0, 1, Null, Null) \ +X(Reg9, 0x59, 0, 0, 1, Null, Null) \ +X(Reg10, 0x5a, 0, 0, 1, Null, Null) \ +X(Reg11, 0x5b, 0, 0, 1, Null, Null) \ +X(Reg12, 0x5c, 0, 0, 1, Null, Null) \ +X(Reg13, 0x5d, 0, 0, 1, Null, Null) \ +X(Reg14, 0x5e, 0, 0, 1, Null, Null) \ +X(Reg15, 0x5f, 0, 0, 1, Null, Null) \ +X(Reg16, 0x60, 0, 0, 1, Null, Null) \ +X(Reg17, 0x61, 0, 0, 1, Null, Null) \ +X(Reg18, 0x62, 0, 0, 1, Null, Null) \ +X(Reg19, 0x63, 0, 0, 1, Null, Null) \ +X(Reg20, 0x64, 0, 0, 1, Null, Null) \ +X(Reg21, 0x65, 0, 0, 1, Null, Null) \ +X(Reg22, 0x66, 0, 0, 1, Null, Null) \ +X(Reg23, 0x67, 0, 0, 1, Null, Null) \ +X(Reg24, 0x68, 0, 0, 1, Null, Null) \ +X(Reg25, 0x69, 0, 0, 1, Null, Null) \ +X(Reg26, 0x6a, 0, 0, 1, Null, Null) \ +X(Reg27, 0x6b, 0, 0, 1, Null, Null) \ +X(Reg28, 0x6c, 0, 0, 1, Null, Null) \ +X(Reg29, 0x6d, 0, 0, 1, Null, Null) \ +X(Reg30, 0x6e, 0, 0, 1, Null, Null) \ +X(Reg31, 0x6f, 0, 0, 1, Null, Null) \ +X(BReg0, 0x70, 1, 0, 1, SLEB128, Null) \ +X(BReg1, 0x71, 1, 0, 1, SLEB128, Null) \ +X(BReg2, 0x72, 1, 0, 1, SLEB128, Null) \ +X(BReg3, 0x73, 1, 0, 1, SLEB128, Null) \ +X(BReg4, 0x74, 1, 0, 1, SLEB128, Null) \ +X(BReg5, 0x75, 1, 0, 1, SLEB128, Null) \ +X(BReg6, 0x76, 1, 0, 1, SLEB128, Null) \ +X(BReg7, 0x77, 1, 0, 1, SLEB128, Null) \ +X(BReg8, 0x78, 1, 0, 1, SLEB128, Null) \ +X(BReg9, 0x79, 1, 0, 1, SLEB128, Null) \ +X(BReg10, 0x7a, 1, 0, 1, SLEB128, Null) \ +X(BReg11, 0x7b, 1, 0, 1, SLEB128, Null) \ +X(BReg12, 0x7c, 1, 0, 1, SLEB128, Null) \ +X(BReg13, 0x7d, 1, 0, 1, SLEB128, Null) \ +X(BReg14, 0x7e, 1, 0, 1, SLEB128, Null) \ +X(BReg15, 0x7f, 1, 0, 1, SLEB128, Null) \ +X(BReg16, 0x80, 1, 0, 1, SLEB128, Null) \ +X(BReg17, 0x81, 1, 0, 1, SLEB128, Null) \ +X(BReg18, 0x82, 1, 0, 1, SLEB128, Null) \ +X(BReg19, 0x83, 1, 0, 1, SLEB128, Null) \ +X(BReg20, 0x84, 1, 0, 1, SLEB128, Null) \ +X(BReg21, 0x85, 1, 0, 1, SLEB128, Null) \ +X(BReg22, 0x86, 1, 0, 1, SLEB128, Null) \ +X(BReg23, 0x87, 1, 0, 1, SLEB128, Null) \ +X(BReg24, 0x88, 1, 0, 1, SLEB128, Null) \ +X(BReg25, 0x89, 1, 0, 1, SLEB128, Null) \ +X(BReg26, 0x8a, 1, 0, 1, SLEB128, Null) \ +X(BReg27, 0x8b, 1, 0, 1, SLEB128, Null) \ +X(BReg28, 0x8c, 1, 0, 1, SLEB128, Null) \ +X(BReg29, 0x8d, 1, 0, 1, SLEB128, Null) \ +X(BReg30, 0x8e, 1, 0, 1, SLEB128, Null) \ +X(BReg31, 0x8f, 1, 0, 1, SLEB128, Null) \ +X(RegX, 0x90, 1, 0, 1, ULEB128, Null) \ +X(FBReg, 0x91, 1, 0, 1, SLEB128, Null) \ +X(BRegX, 0x92, 2, 0, 1, ULEB128, SLEB128) \ +X(Piece, 0x93, 1, 0, 0, ULEB128, Null) \ +X(DerefSize, 0x94, 1, 1, 1, U8, Null) \ +X(XDerefSize, 0x95, 1, 2, 1, U8, Null) \ +X(Nop, 0x96, 0, 0, 0, Null, Null) \ +X(PushObjectAddress, 0x97, 0, 0, 1, Null, Null) \ +X(Call2, 0x98, 1, 0, 0, U16, Null) \ +X(Call4, 0x99, 1, 0, 0, U32, Null) \ +X(CallRef, 0x9a, 1, 0, 0, DwarfUInt,Null) \ +X(FormTlsAddress, 0x9b, 0, 0, 1, Null, Null) \ +X(CallFrameCfa, 0x9c, 0, 0, 1, Null, Null) \ +X(BitPiece, 0x9d, 2, 0, 0, ULEB128, ULEB128) #define DW_Expr_V4_XList \ - X(ImplicitValue, 0x9e, 2, 0, 1, Block, Null) \ - X(StackValue, 0x9f, 0, 0, 0, Null, Null) +X(ImplicitValue, 0x9e, 2, 0, 1, Block, Null) \ +X(StackValue, 0x9f, 0, 0, 0, Null, Null) #define DW_Expr_V5_XList \ - X(ImplicitPointer, 0xa0, 2, 0, 1, DwarfUInt, SLEB128) \ - X(Addrx, 0xa1, 1, 0, 1, ULEB128, Null) \ - X(Constx, 0xa2, 1, 0, 1, ULEB128, Null) \ - X(EntryValue, 0xa3, 1, 0, 0, Block, Null) \ - X(ConstType, 0xa4, 2, 0, 1, ULEB128, Block) \ - X(RegvalType, 0xa5, 2, 0, 1, ULEB128, ULEB128) \ - X(DerefType, 0xa6, 2, 1, 1, U8, ULEB128) \ - X(XDerefType, 0xa7, 2, 2, 1, U8, ULEB128) \ - X(Convert, 0xa8, 1, 1, 1, ULEB128, Null) \ - X(Reinterpret, 0xa9, 1, 1, 1, ULEB128, Null) +X(ImplicitPointer, 0xa0, 2, 0, 1, DwarfUInt, SLEB128) \ +X(Addrx, 0xa1, 1, 0, 1, ULEB128, Null) \ +X(Constx, 0xa2, 1, 0, 1, ULEB128, Null) \ +X(EntryValue, 0xa3, 1, 0, 0, Block, Null) \ +X(ConstType, 0xa4, 2, 0, 1, ULEB128, Block) \ +X(RegvalType, 0xa5, 2, 0, 1, ULEB128, ULEB128) \ +X(DerefType, 0xa6, 2, 1, 1, U8, ULEB128) \ +X(XDerefType, 0xa7, 2, 2, 1, U8, ULEB128) \ +X(Convert, 0xa8, 1, 1, 1, ULEB128, Null) \ +X(Reinterpret, 0xa9, 1, 1, 1, ULEB128, Null) #define DW_Expr_GNU_XList \ - X(GNU_PushTlsAddress, 0xe0, 0, 0, 1, Null, Null) \ - X(GNU_UnInit, 0xf0, 0, 0, 0, Null, Null) \ - X(GNU_ImplicitPointer, 0xf2, 2, 0, 1, DwarfUInt, SLEB128) \ - X(GNU_EntryValue, 0xf3, 1, 0, 0, Block, Null) \ - X(GNU_ConstType, 0xf4, 2, 0, 1, ULEB128, Block) \ - X(GNU_RegvalType, 0xf5, 2, 0, 1, ULEB128, ULEB128) \ - X(GNU_DerefType, 0xf6, 2, 1, 1, U8, ULEB128) \ - X(GNU_Convert, 0xf7, 1, 1, 1, ULEB128, Null) \ - X(GNU_ParameterRef, 0xfa, 1, 0, 0, U32, Null) \ - X(GNU_AddrIndex, 0xfb, 0, 0, 1, Null, Null) \ - X(GNU_ConstIndex, 0xfc, 1, 0, 1, ULEB128, Null) +X(GNU_PushTlsAddress, 0xe0, 0, 0, 1, Null, Null) \ +X(GNU_UnInit, 0xf0, 0, 0, 0, Null, Null) \ +X(GNU_ImplicitPointer, 0xf2, 2, 0, 1, DwarfUInt, SLEB128) \ +X(GNU_EntryValue, 0xf3, 1, 0, 0, Block, Null) \ +X(GNU_ConstType, 0xf4, 2, 0, 1, ULEB128, Block) \ +X(GNU_RegvalType, 0xf5, 2, 0, 1, ULEB128, ULEB128) \ +X(GNU_DerefType, 0xf6, 2, 1, 1, U8, ULEB128) \ +X(GNU_Convert, 0xf7, 1, 1, 1, ULEB128, Null) \ +X(GNU_ParameterRef, 0xfa, 1, 0, 0, U32, Null) \ +X(GNU_AddrIndex, 0xfb, 0, 0, 1, Null, Null) \ +X(GNU_ConstIndex, 0xfc, 1, 0, 1, ULEB128, Null) typedef U8 DW_ExprOp; typedef enum DW_ExprOpEnum { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) DW_ExprOp_##_N = _ID, DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X } DW_ExprOpEnum; //- Regs #define DW_Regs_X64_XList \ - X(Rax, 0, rax, 0, 8) \ - X(Rdx, 1, rdx, 0, 8) \ - X(Rcx, 2, rcx, 0, 8) \ - X(Rbx, 3, rbx, 0, 8) \ - X(Rsi, 4, rsi, 0, 8) \ - X(Rdi, 5, rdi, 0, 8) \ - X(Rbp, 6, rbp, 0, 8) \ - X(Rsp, 7, rsp, 0, 8) \ - X(R8, 8, r8, 0, 8) \ - X(R9, 9, r9, 0, 8) \ - X(R10, 10, r10, 0, 8) \ - X(R11, 11, r11, 0, 8) \ - X(R12, 12, r12, 0, 8) \ - X(R13, 13, r13, 0, 8) \ - X(R14, 14, r14, 0, 8) \ - X(R15, 15, r15, 0, 8) \ - X(Rip, 16, rip, 0, 8) \ - X(Xmm0, 17, zmm0, 0, 16) \ - X(Xmm1, 18, zmm1, 0, 16) \ - X(Xmm2, 19, zmm2, 0, 16) \ - X(Xmm3, 20, zmm3, 0, 16) \ - X(Xmm4, 21, zmm4, 0, 16) \ - X(Xmm5, 22, zmm5, 0, 16) \ - X(Xmm6, 23, zmm6, 0, 16) \ - X(Xmm7, 24, zmm7, 0, 16) \ - X(Xmm8, 25, zmm8, 0, 16) \ - X(Xmm9, 26, zmm9, 0, 16) \ - X(Xmm10, 27, zmm10, 0, 16) \ - X(Xmm11, 28, zmm11, 0, 16) \ - X(Xmm12, 29, zmm12, 0, 16) \ - X(Xmm13, 30, zmm13, 0, 16) \ - X(Xmm14, 31, zmm14, 0, 16) \ - X(Xmm15, 32, zmm15, 0, 16) \ - X(Xmm16, 67, zmm16, 0, 16) \ - X(Xmm17, 68, zmm17, 0, 16) \ - X(Xmm18, 69, zmm18, 0, 16) \ - X(Xmm19, 70, zmm19, 0, 16) \ - X(Xmm20, 71, zmm20, 0, 16) \ - X(Xmm21, 72, zmm21, 0, 16) \ - X(Xmm22, 73, zmm22, 0, 16) \ - X(Xmm23, 74, zmm23, 0, 16) \ - X(Xmm24, 75, zmm24, 0, 16) \ - X(Xmm25, 76, zmm25, 0, 16) \ - X(Xmm26, 77, zmm26, 0, 16) \ - X(Xmm27, 78, zmm27, 0, 16) \ - X(Xmm28, 79, zmm28, 0, 16) \ - X(Xmm29, 80, zmm29, 0, 16) \ - X(Xmm30, 81, zmm30, 0, 16) \ - X(Xmm31, 82, zmm31, 0, 16) \ - X(St0, 33, st0, 0, 10) \ - X(St1, 34, st1, 0, 10) \ - X(St2, 35, st2, 0, 10) \ - X(St3, 36, st3, 0, 10) \ - X(St4, 37, st4, 0, 10) \ - X(St5, 38, st5, 0, 10) \ - X(St6, 39, st6, 0, 10) \ - X(St7, 40, st7, 0, 10) \ - X(Mm0, 41, st0, 0, 8) \ - X(Mm1, 42, st1, 0, 8) \ - X(Mm2, 43, st2, 0, 8) \ - X(Mm3, 44, st3, 0, 8) \ - X(Mm4, 45, st4, 0, 8) \ - X(Mm5, 46, st5, 0, 8) \ - X(Mm6, 47, st6, 0, 8) \ - X(Mm7, 48, st7, 0, 8) \ - X(Rflags, 49, rflags, 0, 4) \ - X(Es, 50, es, 0, 2) \ - X(Cs, 51, cs, 0, 2) \ - X(Ss, 52, ss, 0, 2) \ - X(Ds, 53, ds, 0, 2) \ - X(Fs, 54, fs, 0, 2) \ - X(Gs, 55, gs, 0, 2) \ - X(FsBase, 58, fsbase, 0, 8) \ - X(GsBase, 59, gsbase, 0, 8) - // privileged registers: - // X(Tr, 62, nil, 0, 0) \ - // X(Ldtr, 63, nil, 0, 0) +X(Rax, 0, rax, 0, 8) \ +X(Rdx, 1, rdx, 0, 8) \ +X(Rcx, 2, rcx, 0, 8) \ +X(Rbx, 3, rbx, 0, 8) \ +X(Rsi, 4, rsi, 0, 8) \ +X(Rdi, 5, rdi, 0, 8) \ +X(Rbp, 6, rbp, 0, 8) \ +X(Rsp, 7, rsp, 0, 8) \ +X(R8, 8, r8, 0, 8) \ +X(R9, 9, r9, 0, 8) \ +X(R10, 10, r10, 0, 8) \ +X(R11, 11, r11, 0, 8) \ +X(R12, 12, r12, 0, 8) \ +X(R13, 13, r13, 0, 8) \ +X(R14, 14, r14, 0, 8) \ +X(R15, 15, r15, 0, 8) \ +X(Rip, 16, rip, 0, 8) \ +X(Xmm0, 17, zmm0, 0, 16) \ +X(Xmm1, 18, zmm1, 0, 16) \ +X(Xmm2, 19, zmm2, 0, 16) \ +X(Xmm3, 20, zmm3, 0, 16) \ +X(Xmm4, 21, zmm4, 0, 16) \ +X(Xmm5, 22, zmm5, 0, 16) \ +X(Xmm6, 23, zmm6, 0, 16) \ +X(Xmm7, 24, zmm7, 0, 16) \ +X(Xmm8, 25, zmm8, 0, 16) \ +X(Xmm9, 26, zmm9, 0, 16) \ +X(Xmm10, 27, zmm10, 0, 16) \ +X(Xmm11, 28, zmm11, 0, 16) \ +X(Xmm12, 29, zmm12, 0, 16) \ +X(Xmm13, 30, zmm13, 0, 16) \ +X(Xmm14, 31, zmm14, 0, 16) \ +X(Xmm15, 32, zmm15, 0, 16) \ +X(Xmm16, 67, zmm16, 0, 16) \ +X(Xmm17, 68, zmm17, 0, 16) \ +X(Xmm18, 69, zmm18, 0, 16) \ +X(Xmm19, 70, zmm19, 0, 16) \ +X(Xmm20, 71, zmm20, 0, 16) \ +X(Xmm21, 72, zmm21, 0, 16) \ +X(Xmm22, 73, zmm22, 0, 16) \ +X(Xmm23, 74, zmm23, 0, 16) \ +X(Xmm24, 75, zmm24, 0, 16) \ +X(Xmm25, 76, zmm25, 0, 16) \ +X(Xmm26, 77, zmm26, 0, 16) \ +X(Xmm27, 78, zmm27, 0, 16) \ +X(Xmm28, 79, zmm28, 0, 16) \ +X(Xmm29, 80, zmm29, 0, 16) \ +X(Xmm30, 81, zmm30, 0, 16) \ +X(Xmm31, 82, zmm31, 0, 16) \ +X(St0, 33, st0, 0, 10) \ +X(St1, 34, st1, 0, 10) \ +X(St2, 35, st2, 0, 10) \ +X(St3, 36, st3, 0, 10) \ +X(St4, 37, st4, 0, 10) \ +X(St5, 38, st5, 0, 10) \ +X(St6, 39, st6, 0, 10) \ +X(St7, 40, st7, 0, 10) \ +X(Mm0, 41, st0, 0, 8) \ +X(Mm1, 42, st1, 0, 8) \ +X(Mm2, 43, st2, 0, 8) \ +X(Mm3, 44, st3, 0, 8) \ +X(Mm4, 45, st4, 0, 8) \ +X(Mm5, 46, st5, 0, 8) \ +X(Mm6, 47, st6, 0, 8) \ +X(Mm7, 48, st7, 0, 8) \ +X(Rflags, 49, rflags, 0, 4) \ +X(Es, 50, es, 0, 2) \ +X(Cs, 51, cs, 0, 2) \ +X(Ss, 52, ss, 0, 2) \ +X(Ds, 53, ds, 0, 2) \ +X(Fs, 54, fs, 0, 2) \ +X(Gs, 55, gs, 0, 2) \ +X(FsBase, 58, fsbase, 0, 8) \ +X(GsBase, 59, gsbase, 0, 8) +// privileged registers: +// X(Tr, 62, nil, 0, 0) \ +// X(Ldtr, 63, nil, 0, 0) typedef U32 DW_Reg; diff --git a/src/dwarf/dwarf_coff.c b/src/dwarf/dwarf_coff.c index 3cf7bea3..1ccc2e5b 100644 --- a/src/dwarf/dwarf_coff.c +++ b/src/dwarf/dwarf_coff.c @@ -23,14 +23,14 @@ dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, return is_dwarf_present; } -internal DW_Input +internal DW_Raw dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table) { - DW_Input input = {0}; + DW_Raw input = {0}; B32 sect_status[ArrayCount(input.sec)] = {0}; for (U64 i = 0; i < section_count; ++i) { diff --git a/src/dwarf/dwarf_coff.h b/src/dwarf/dwarf_coff.h index 79cd37c3..797324ef 100644 --- a/src/dwarf/dwarf_coff.h +++ b/src/dwarf/dwarf_coff.h @@ -5,7 +5,7 @@ #define DWARF_COFF_H internal B32 dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, COFF_SectionHeader *section_table); -internal DW_Input dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); +internal DW_Raw dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); #endif // DWARF_COFF_H diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 95318987..69b83b23 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -92,7 +92,7 @@ dw_string_list_from_cfi_program(Arena *arena, { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; - + U64 reg_max = dw_reg_count_from_arch(arch); U64 pc = pc_begin; for (U64 cursor = 0, inst_size; cursor < program.size; cursor += inst_size) { @@ -104,134 +104,134 @@ dw_string_list_from_cfi_program(Arena *arena, str8_list_pushf(arena, &list, "ERROR: failed to unpack CFA instruction @ 0x%I64", cursor); break; } - + // error check operands DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst.opcode); U64 operand_count = dw_operand_count_from_cfa_opcode(inst.opcode); for EachIndex(operand_idx, operand_count) { switch (operand_types[operand_idx]) { - case DW_CFA_OperandType_Null: break; - case DW_CFA_OperandType_Value: break; - case DW_CFA_OperandType_Register: { - if (inst.operands[operand_idx].u64 >= reg_max) { - str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", - dw_string_from_cfa_opcode(inst.opcode), - cursor); - } - } break; - case DW_CFA_OperandType_Expression: { - DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); - for EachNode(inst, DW_ExprInst, expr.first) { - if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { - String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); - str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); + case DW_CFA_OperandType_Null: break; + case DW_CFA_OperandType_Value: break; + case DW_CFA_OperandType_Register: { + if (inst.operands[operand_idx].u64 >= reg_max) { + str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", + dw_string_from_cfa_opcode(inst.opcode), + cursor); } - } - } break; - default: { InvalidPath; } break; + } break; + case DW_CFA_OperandType_Expression: { + DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); + for EachNode(inst, DW_ExprInst, expr.first) { + if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { + String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); + str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); + } + } + } break; + default: { InvalidPath; } break; } } - + // format operands String8 operand_str = str8_lit("???"); switch (inst.opcode) { - case DW_CFA_Nop: { operand_str = str8_zero(); } break; - case DW_CFA_SetLoc: { - operand_str = str8f(arena, "0x%X", inst.operands[0].u64); - pc = inst.operands[0].u64; - } break; - case DW_CFA_AdvanceLoc1: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc2: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc4: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_OffsetExt: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; - case DW_CFA_Undefined: { - operand_str = str8f(arena, "%I64u", inst.operands[0].u64); - } break; - case DW_CFA_SameValue: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_Register: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_RememberState: { operand_str = str8_zero(); } break; - case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; - case DW_CFA_DefCfa: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_DefCfaRegister: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_DefCfaOffset: { - operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); - } break; - case DW_CFA_DefCfaExpr: { - operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); - } break; - case DW_CFA_Expr: { - String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); - } break; - case DW_CFA_OffsetExtSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; - case DW_CFA_ValOffset: { - operand_str = str8f(arena, "value 0x%I64x, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_ValOffsetSf: { - operand_str = str8f(arena, "value %I64u, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_ValExpr: { - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); - } break; - case DW_CFA_AdvanceLoc: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_Offset: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_Restore: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - default: { - str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); - } goto exit; + case DW_CFA_Nop: { operand_str = str8_zero(); } break; + case DW_CFA_SetLoc: { + operand_str = str8f(arena, "0x%X", inst.operands[0].u64); + pc = inst.operands[0].u64; + } break; + case DW_CFA_AdvanceLoc1: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc2: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc4: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_OffsetExt: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; + case DW_CFA_Undefined: { + operand_str = str8f(arena, "%I64u", inst.operands[0].u64); + } break; + case DW_CFA_SameValue: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_Register: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_RememberState: { operand_str = str8_zero(); } break; + case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; + case DW_CFA_DefCfa: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_DefCfaRegister: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_DefCfaOffset: { + operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); + } break; + case DW_CFA_DefCfaExpr: { + operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); + } break; + case DW_CFA_Expr: { + String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); + } break; + case DW_CFA_OffsetExtSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; + case DW_CFA_ValOffset: { + operand_str = str8f(arena, "value 0x%I64x, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_ValOffsetSf: { + operand_str = str8f(arena, "value %I64u, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_ValExpr: { + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); + } break; + case DW_CFA_AdvanceLoc: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_Offset: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_Restore: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + default: { + str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); + } goto exit; } - + if (operand_str.size) { str8_list_pushf(arena, &list, "DW_CFA_%S: %S", dw_string_from_cfa_opcode(inst.opcode), operand_str); } else { str8_list_pushf(arena, &list, "DW_CFA_%S", dw_string_from_cfa_opcode(inst.opcode)); } } - -exit:; + + exit:; scratch_end(scratch); return list; } @@ -566,10 +566,10 @@ dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version { String8 cfa_str = str8_lit("???"); switch (cfa.rule) { - case DW_CFA_Rule_Null: {} break; - case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; - case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; - default: { InvalidPath; } break; + case DW_CFA_Rule_Null: {} break; + case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; + case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; + default: { InvalidPath; } break; } return cfa_str; } @@ -584,40 +584,40 @@ dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version ver DW_CFI_Register *cfi_reg = &row->regs[reg_idx]; String8 rule_str = str8_lit("???"); switch (cfi_reg->rule) { - case DW_CFI_RegisterRule_Undefined: { - rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_SameValue: { - rule_str = str8_zero(); - } break; - case DW_CFI_RegisterRule_Offset: { - rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_ValOffset: { - rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_Register: { - rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_Expression: { - rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); - } break; - case DW_CFI_RegisterRule_ValExpression: { - rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); - } break; - case DW_CFI_RegisterRule_Architectural: { - rule_str = str8_lit("???"); - } break; - default: { InvalidPath; } break; + case DW_CFI_RegisterRule_Undefined: { + rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_SameValue: { + rule_str = str8_zero(); + } break; + case DW_CFI_RegisterRule_Offset: { + rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_ValOffset: { + rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_Register: { + rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_Expression: { + rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_ValExpression: { + rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_Architectural: { + rule_str = str8_lit("???"); + } break; + default: { InvalidPath; } break; } - + if (rule_str.size) { str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_register(scratch.arena, arch, reg_idx), rule_str); } } - + String8 string = str8_list_join(arena, &cfi_regs_list, &(StringJoin){.sep=str8_lit(", ")}); - + scratch_end(scratch); return string; } @@ -633,10 +633,10 @@ dw_single_line_string_from_expression(Arena *arena, String8 raw_data, U64 cu_bas } internal String8 -dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) +dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) { Temp scratch = scratch_begin(&arena, 1); - + String8List attrib_fmt = {0}; // rjf: log attrib's value based on vlass @@ -762,7 +762,7 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni enum_info = dw_string_from_attrib_visibility(scratch.arena, vis); }break; } - + if(enum_info.size) { str8_list_pushf(scratch.arena, &attrib_fmt, " `%S`", enum_info); @@ -770,7 +770,7 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni } String8 result = str8_list_join(arena, &attrib_fmt, 0); - + scratch_end(scratch); return result; } @@ -778,8 +778,8 @@ dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUni internal DW_PRINTER(dw_print_abbrev) { - DW_Input *input = dumper->input; - + DW_Raw *input = dumper->input; + Temp scratch = scratch_begin(&arena, 1); DW_Section abbrev = input->sec[DW_Section_Abbrev]; S64 depth = 0; @@ -791,13 +791,13 @@ DW_PRINTER(dw_print_abbrev) U64 id = 0; cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &id); if(id == 0) { continue; } - + // rjf: unpack abbrev U64 tag = 0; U8 has_children = 0; cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &tag); cursor += str8_deserial_read_struct(abbrev.data, cursor, &has_children); - + // rjf: log abbrev Temp temp = temp_begin(scratch.arena); dw_printf("abbrev: // abbrev[%I64u] abbrev_off: 0x%I64x \n {\n", idx, id_off); @@ -827,7 +827,7 @@ DW_PRINTER(dw_print_abbrev) if(attrib_id == 0) { break; } String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); - + String8List fmt = {0}; str8_list_pushf(temp.arena, &fmt, "%S%.*s", attrib_str, attrib_kind_max_size - attrib_str.size, g_spaces); str8_list_pushf(temp.arena, &fmt, "%S%.*s", form_str, form_kind_max_size - form_str.size, g_spaces); @@ -842,13 +842,13 @@ DW_PRINTER(dw_print_abbrev) } internal void -dw_print_tag(Arena *arena, String8List *strings, int indent, Arch arch, DW_Input *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_TagNode *root) +dw_print_tag(Arena *arena, String8List *strings, int indent, Arch arch, DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_TagNode *root) { Temp scratch = scratch_begin(0, 0); - + for (DW_TagNode *n = root; n != 0; n = n->sibling) { DW_Tag *tag = &n->tag; - + // compute columns' max widths U64 attrib_name_max_size = 0, form_kind_max_size = 0, value_max_size = 0; for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) @@ -862,48 +862,48 @@ dw_print_tag(Arena *arena, String8List *strings, int indent, Arch arch, DW_Input attrib_name_max_size = Min(40, attrib_name_max_size); form_kind_max_size = Min(20, form_kind_max_size); value_max_size = Min(80, value_max_size); - + dw_printf("tag: // info_off: 0x%I64x abbrev_id: %I64u\n", tag->info_off, tag->abbrev_id); dw_printf("{\n"); dw_indent(); dw_printf("kind: %S\n", dw_string_from_tag_kind(scratch.arena, tag->kind)); for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) { DW_Attrib *attrib = &attrib_n->v; - + String8 attrib_kind_str = dw_string_from_attrib_kind(scratch.arena, cu->version, cu->ext, attrib->attrib_kind); String8 form_kind_str = dw_string_from_form_kind(scratch.arena, cu->version, attrib->form.kind); String8 value_str = dw_string_from_attrib_value(scratch.arena, input, arch, cu, line_vm, attrib); - + String8List fmt = {0}; str8_list_pushf(scratch.arena, &fmt, "%S%.*s", attrib_kind_str, attrib_kind_str.size <= attrib_name_max_size ? attrib_name_max_size - attrib_kind_str.size : 0, g_spaces); str8_list_pushf(scratch.arena, &fmt, "%S%.*s", form_kind_str, form_kind_str.size <= form_kind_max_size ? form_kind_max_size - form_kind_str.size : 0, g_spaces); str8_list_pushf(scratch.arena, &fmt, "%S%.*s", value_str, value_str.size <= value_max_size ? value_max_size - value_str.size : 0, g_spaces); String8 attrib_str = str8_list_join(scratch.arena, &fmt, &(StringJoin){.sep = str8_lit(" ")}); - + dw_printf("attrib: { %S } // info_off: 0x%I64x\n", attrib_str, attrib->info_off); } - + if (tag->has_children) { dw_print_tag(arena, strings, indent, arch, input, cu, line_vm, n->first_child); } - + dw_unindent(); dw_printf("}\n"); } - + scratch_end(scratch); } internal DW_PRINTER(dw_print_info) { - DW_Input *input = dumper->input; + DW_Raw *input = dumper->input; Arch arch = dumper->arch; HashTable *line_vm_map = dw_get_line_vm_map(dumper); Rng1U64Array cu_ranges = dw_get_info_ranges(dumper); DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); DW_TagTree *tag_trees = dw_get_tag_trees(dumper); - + Temp scratch = scratch_begin(&arena, 1); for EachIndex(cu_idx, cu_ranges.count) { Rng1U64 cu_range = cu_ranges.v[cu_idx]; @@ -911,7 +911,7 @@ DW_PRINTER(dw_print_info) String8 cu_dir = dw_string_from_tag_attrib_kind (input, cu, cu->tag, DW_AttribKind_CompDir ); String8 cu_name = dw_string_from_tag_attrib_kind (input, cu, cu->tag, DW_AttribKind_Name ); String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); - + DW_LineVM *line_vm = 0; if (stmt_list.str) { line_vm = hash_table_search_raw_raw(line_vm_map, stmt_list.str); @@ -924,7 +924,7 @@ DW_PRINTER(dw_print_info) hash_table_push_raw_raw(scratch.arena, line_vm_map, stmt_list.str, line_vm); } } - + dw_printf("cu: // compile_unit[%I64u] @ %r (%M)\n", cu_idx, cu_range, dim_1u64(cu->info_range)); dw_printf("{\n"); dw_indent(); @@ -941,7 +941,7 @@ DW_PRINTER(dw_print_info) DW_PRINTER(dw_print_line) { - DW_Input *input = dumper->input; + DW_Raw *input = dumper->input; B32 is_verbose = dumper->is_verbose; DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); Temp scratch = scratch_begin(&arena, 1); @@ -949,10 +949,10 @@ DW_PRINTER(dw_print_line) for EachIndex(unit_idx, unit_ranges.count) { Temp unit_temp = temp_begin(scratch.arena); - + DW_CompUnit *cu = &cu_arr[unit_idx]; DW_LineVM *vm = dw_line_vm_init(input, cu); - + // rjf: begin logging line table dw_printf("line_table: // line_table[%I64u]\n", unit_idx); dw_printf("{\n"); @@ -980,7 +980,7 @@ DW_PRINTER(dw_print_line) } dw_unindent(); dw_printf("}\n"); - + // rjf: log directory table dw_printf("directory_table:\n"); dw_printf("{\n"); @@ -995,7 +995,7 @@ DW_PRINTER(dw_print_line) } dw_unindent(); dw_printf("}\n"); - + // rjf: log file table dw_printf("file_table:\n"); dw_printf("{\n"); @@ -1007,18 +1007,18 @@ DW_PRINTER(dw_print_line) { DW_LineFile *file = &vm->header.file_table.v[file_idx]; dw_printf("{ %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %-20S }\n", - file_idx, - file->dir_idx, - file->time_stamp, - file->md5.u64[1], - file->md5.u64[0], - file->size, - file->path); + file_idx, + file->dir_idx, + file->time_stamp, + file->md5.u64[1], + file->md5.u64[0], + file->size, + file->path); } } dw_unindent(); dw_printf("}\n"); - + // rjf: log opcodes dw_printf("line_table:\n"); dw_printf("{\n"); @@ -1027,106 +1027,106 @@ DW_PRINTER(dw_print_line) dw_printf("//\n"); dw_printf("// %-16s %-8s %-4s %-5s %-3s %-7s %-16s\n", "Address", "Line", "Col", "File", "ISA", "Discrim", "Flags"); dw_printf("// ---------------- -------- ---- ----- --- ------- ----------------\n"); - + for(;;) { U64 global_opcode_off = unit_ranges.v[unit_idx].min + vm->cursor; - + if( ! dw_line_vm_step(vm)) { break; } - + Temp opcode_temp = temp_begin(unit_temp.arena); String8List opcode_fmt = {0}; - + // opcode offset str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); - + // push opcode id if (vm->opcode != 0) { String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); str8_list_pushf(arena, &opcode_fmt, "%-11S:", opcode_str); } - + // print operands switch(vm->opcode) { - default: - { - if(vm->opcode >= vm->header.opcode_base) + default: { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); - } - else + if(vm->opcode >= vm->header.opcode_base) + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); + } + else + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); + } + }break; + case DW_StdOpcode_Copy: { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); - } - }break; - case DW_StdOpcode_Copy: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); - }break; - case DW_StdOpcode_AdvancePc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); - }break; - case DW_StdOpcode_AdvanceLine: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); - }break; - case DW_StdOpcode_SetFile: - { - DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); - }break; - case DW_StdOpcode_SetColumn: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); - }break; - case DW_StdOpcode_NegateStmt: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); - }break; - case DW_StdOpcode_SetBasicBlock: - { - }break; - case DW_StdOpcode_ConstAddPc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); - }break; - case DW_StdOpcode_FixedAdvancePc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); - }break; - case DW_StdOpcode_SetPrologueEnd: - { - }break; - case DW_StdOpcode_SetEpilogueBegin: - { - }break; - case DW_StdOpcode_SetIsa: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); - }break; - case DW_StdOpcode_ExtendedOpcode: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S*", dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); - //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); - switch(vm->ext_opcode) + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); + }break; + case DW_StdOpcode_AdvancePc: { - case DW_ExtOpcode_EndSequence: {} break; - case DW_ExtOpcode_SetAddress: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); } break; - case DW_ExtOpcode_DefineFile: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", - vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); } break; - case DW_ExtOpcode_SetDiscriminator: { str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); }break; - } + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); + }break; + case DW_StdOpcode_AdvanceLine: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); + }break; + case DW_StdOpcode_SetFile: + { + DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); + }break; + case DW_StdOpcode_SetColumn: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); + }break; + case DW_StdOpcode_NegateStmt: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); + }break; + case DW_StdOpcode_SetBasicBlock: + { + }break; + case DW_StdOpcode_ConstAddPc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); + }break; + case DW_StdOpcode_FixedAdvancePc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); + }break; + case DW_StdOpcode_SetPrologueEnd: + { + }break; + case DW_StdOpcode_SetEpilogueBegin: + { + }break; + case DW_StdOpcode_SetIsa: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); + }break; + case DW_StdOpcode_ExtendedOpcode: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S*", dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); + //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); + switch(vm->ext_opcode) + { + case DW_ExtOpcode_EndSequence: {} break; + case DW_ExtOpcode_SetAddress: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); } break; + case DW_ExtOpcode_DefineFile: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", + vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); } break; + case DW_ExtOpcode_SetDiscriminator: { str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); }break; + } }break; } - + if(is_verbose) { String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); dw_printf("// %S\n", string); } - + if(vm->new_line) { String8List l = {0}; if(vm->state.is_stmt) @@ -1138,13 +1138,13 @@ DW_PRINTER(dw_print_line) str8_list_pushf(opcode_temp.arena, &l, "end_seq"); } String8 flags = str8_list_join(opcode_temp.arena, &l, &(StringJoin){.sep = str8_lit("|")}); - + dw_printf("{ %#016I64x %8I64u %4I64u %5I64u %3I64u %7I64u %-16S } %s\n", vm->state.address, vm->state.line, vm->state.column, vm->state.file_index, vm->state.isa, vm->state.discriminator, flags, vm->new_seq ? "// new seq" : ""); } - + temp_end(opcode_temp); } - + if(vm->error.size) { dw_printf("ERROR: Line VM failed stepping @ 0x%I64x\n", vm->cursor); @@ -1152,7 +1152,7 @@ DW_PRINTER(dw_print_line) } dw_unindent(); dw_printf("}\n"); - + temp_end(unit_temp); } dw_unindent(); @@ -1163,7 +1163,7 @@ DW_PRINTER(dw_print_line) DW_PRINTER(dw_print_strings) { - DW_Input *input = dumper->input; + DW_Raw *input = dumper->input; String8 data = input->sec[DW_Section_Str].data; for (U64 cursor = 0, read_size = 0; cursor < data.size; cursor += read_size) { String8 string = {0}; @@ -1174,13 +1174,13 @@ DW_PRINTER(dw_print_strings) DW_PRINTER(dw_print_frame) { - DW_Input *input = dumper->input; + DW_Raw *input = dumper->input; Arch arch = dumper->arch; Temp scratch = scratch_begin(&arena, 1); HashTable *cie_ht = hash_table_init(scratch.arena, 0x2000); String8 debug_frame = input->sec[DW_Section_Frame].data; U64 addr_size = byte_size_from_arch(arch); - + // make offset -> CIE hash table for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { DW_DescriptorEntry desc = {0}; @@ -1196,77 +1196,77 @@ DW_PRINTER(dw_print_frame) } } } - + for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { DW_DescriptorEntry desc = {0}; desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); String8 raw_desc = str8_substr(debug_frame, desc.entry_range); switch (desc.type) { - case DW_DescriptorEntryType_Null: {} break; - case DW_DescriptorEntryType_CIE: { - DW_CIE cie = {0}; - if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { - String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); - - dw_printf("CIE: // entry range: %r\n", desc.entry_range); - dw_printf("{\n"); - dw_printf(" Format: %S\n", dw_string_from_format(desc.format)); - dw_printf(" Version: %u\n", cie.version); - dw_printf(" Aug string: \"%S\"\n", cie.aug_string); - dw_printf(" Code align: %I64u\n", cie.code_align_factor); - dw_printf(" Data align: %I64d\n", cie.data_align_factor); - dw_printf(" Return addr reg: %u\n", cie.ret_addr_reg); - if (cie.version > DW_Version_3) { - dw_printf(" Address size: %u\n", cie.address_size); - dw_printf(" Segment selector size: %u\n", cie.segment_selector_size); - } - dw_printf(" Initial Insturction:\n"); - dw_printf(" {\n"); - for EachNode(n, String8Node, init_insts_str_list.first) { dw_printf(" %S\n", n->string); } - dw_printf(" }\n"); - dw_printf("}\n"); - } else { - dw_printf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); - } - } break; - case DW_DescriptorEntryType_FDE: { - DW_DescriptorEntry cie_desc = {0}; - U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); - String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); - DW_CIE cie = {0}; - dw_parse_cie(cie_data, cie_desc.format, arch, &cie); - - DW_FDE fde = {0}; - if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { - DW_Version version = DW_Version_5; - DW_Ext ext = DW_Ext_All; - String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); - dw_printf("FDE: // entry range: %r\n", desc.entry_range); - dw_printf("{\n"); - { - dw_printf(" Format: %S\n", dw_string_from_format(fde.format)); - dw_printf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); - dw_printf(" PC range: %r\n", fde.pc_range); - dw_printf(" Instructions:\n"); + case DW_DescriptorEntryType_Null: {} break; + case DW_DescriptorEntryType_CIE: { + DW_CIE cie = {0}; + if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { + String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); + + dw_printf("CIE: // entry range: %r\n", desc.entry_range); + dw_printf("{\n"); + dw_printf(" Format: %S\n", dw_string_from_format(desc.format)); + dw_printf(" Version: %u\n", cie.version); + dw_printf(" Aug string: \"%S\"\n", cie.aug_string); + dw_printf(" Code align: %I64u\n", cie.code_align_factor); + dw_printf(" Data align: %I64d\n", cie.data_align_factor); + dw_printf(" Return addr reg: %u\n", cie.ret_addr_reg); + if (cie.version > DW_Version_3) { + dw_printf(" Address size: %u\n", cie.address_size); + dw_printf(" Segment selector size: %u\n", cie.segment_selector_size); + } + dw_printf(" Initial Insturction:\n"); dw_printf(" {\n"); - for EachNode(n, String8Node, insts_str_list.first) { dw_printf(" %S\n", n->string); } + for EachNode(n, String8Node, init_insts_str_list.first) { dw_printf(" %S\n", n->string); } dw_printf(" }\n"); + dw_printf("}\n"); + } else { + dw_printf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); } - dw_printf(" Unwind:\n"); - dw_printf(" {\n"); - DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); - do { - String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); - String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); - dw_printf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); - } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); - dw_printf(" }\n"); - - dw_printf("}\n"); - } else { - dw_printf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); - } - } break; + } break; + case DW_DescriptorEntryType_FDE: { + DW_DescriptorEntry cie_desc = {0}; + U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); + String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); + DW_CIE cie = {0}; + dw_parse_cie(cie_data, cie_desc.format, arch, &cie); + + DW_FDE fde = {0}; + if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { + DW_Version version = DW_Version_5; + DW_Ext ext = DW_Ext_All; + String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); + dw_printf("FDE: // entry range: %r\n", desc.entry_range); + dw_printf("{\n"); + { + dw_printf(" Format: %S\n", dw_string_from_format(fde.format)); + dw_printf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); + dw_printf(" PC range: %r\n", fde.pc_range); + dw_printf(" Instructions:\n"); + dw_printf(" {\n"); + for EachNode(n, String8Node, insts_str_list.first) { dw_printf(" %S\n", n->string); } + dw_printf(" }\n"); + } + dw_printf(" Unwind:\n"); + dw_printf(" {\n"); + DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); + do { + String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); + String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); + dw_printf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); + } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); + dw_printf(" }\n"); + + dw_printf("}\n"); + } else { + dw_printf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); + } + } break; } } } @@ -1275,7 +1275,7 @@ DW_PRINTER(dw_print_frame) internal DW_PRINTER(dw_print_debug_loc) { - DW_Input *input = dumper->input; + DW_Raw *input = dumper->input; DW_TagTree *tag_trees = dw_get_tag_trees(dumper); DW_Section info = input->sec[DW_Section_Info]; DW_Section loc = input->sec[DW_Section_Loc]; @@ -1397,7 +1397,7 @@ DW_PRINTER(dw_print_debug_loc) #if 0 internal void -dw_print_debug_ranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) +dw_print_debug_ranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) { NotImplemented; #if 0 @@ -1503,7 +1503,7 @@ dw_print_debug_ranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_In } internal void -dw_print_debug_aranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) +dw_print_debug_aranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) { NotImplemented; #if 0 @@ -1592,7 +1592,7 @@ dw_print_debug_aranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_I } internal void -dw_print_debug_addr(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) +dw_print_debug_addr(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) { NotImplemented; #if 0 @@ -1701,7 +1701,7 @@ dw_based_range_read_address(void *base, Rng1U64 range, U64 offset, Rng1U64Array } internal void -dw_print_debug_loclists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input, Rng1U64Array segment_virtual_ranges, Arch arch) +dw_print_debug_loclists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Rng1U64Array segment_virtual_ranges, Arch arch) { NotImplemented; #if 0 @@ -1854,7 +1854,7 @@ dw_print_debug_loclists(Arena *arena, String8List *out, String8 g_dw_indent, DW_ } internal void -dw_print_debug_rnglists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input, Rng1U64Array segment_ranges) +dw_print_debug_rnglists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Rng1U64Array segment_ranges) { NotImplemented; #if 0 @@ -1993,7 +1993,7 @@ dw_print_debug_rnglists(Arena *arena, String8List *out, String8 g_dw_indent, DW_ } internal void -dw_format_string_table(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input, DW_SectionKind sec) +dw_format_string_table(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, DW_SectionKind sec) { NotImplemented; #if 0 @@ -2055,19 +2055,19 @@ dw_format_string_table(Arena *arena, String8List *out, String8 g_dw_indent, DW_I } internal void -dw_print_debug_pubnames(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) +dw_print_debug_pubnames(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) { dw_format_string_table(arena, out, g_dw_indent, input, DW_Section_PubNames); } internal void -dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) +dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) { dw_format_string_table(arena, out, g_dw_indent, input, DW_Section_PubTypes); } internal void -dw_print_debug_line_str(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) +dw_print_debug_line_str(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) { NotImplemented; #if 0 @@ -2097,7 +2097,7 @@ dw_print_debug_line_str(Arena *arena, String8List *out, String8 g_dw_indent, DW_ } internal void -dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 g_dw_indent, DW_Input *input) +dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) { NotImplemented; #if 0 @@ -2180,7 +2180,7 @@ read_only struct { internal String8List dw_dump_list_from_sections(Arena *arena, - DW_Input *input, + DW_Raw *input, Arch arch, DW_SectionFlags subset_flags, B32 is_verbose) @@ -2188,19 +2188,19 @@ dw_dump_list_from_sections(Arena *arena, Temp scratch = scratch_begin(&arena, 1); String8List *strings = push_array(scratch.arena, String8List, 1); int indent = 0; - + DW_Dumper dumper = {0}; dumper.arena = arena_alloc(); dumper.arch = arch; dumper.is_verbose = is_verbose; dumper.input = input; dumper.is_relaxed = 1; - + for EachElement(i, g_dw_printers) { if (((1 << g_dw_printers[i].kind) & subset_flags) != 0) { String8List s = {0}; g_dw_printers[i].printer(arena, &s, indent + 1, &dumper); - + if (s.total_size > 0) { dw_printf("%S:\n", str8_skip(dw_name_string_from_section_kind(g_dw_printers[i].kind), 1)); dw_printf("{\n"); @@ -2211,7 +2211,7 @@ dw_dump_list_from_sections(Arena *arena, } } } - + String8List result = *strings; arena_release(dumper.arena); scratch_end(scratch); diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index eec0d983..6a015952 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -18,7 +18,7 @@ typedef struct DW_Dumper Arch arch; B32 is_relaxed; B32 is_verbose; - DW_Input *input; + DW_Raw *input; DW_DumperCacheFlags cache_flags; struct { Rng1U64Array info_ranges; @@ -46,28 +46,28 @@ internal String8List dw_string_list_from_cfi_program(Arena *arena, U64 cu_base, internal String8List dw_string_list_from_expression (Arena *arena, String8 raw_data, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); internal String8 dw_string_from_reg_off (Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off); -internal String8 dw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib); +internal String8 dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib); internal String8 dw_string_from_expression (Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); internal String8 dw_string_from_cfa (Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa); internal String8 dw_string_from_cfi_row (Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row); #if 0 internal void dw_print_eh_frame (Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx); -internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); -internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); -internal void dw_print_debug_aranges (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_addr (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_loclists (Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_vranges, Arch arch); -internal void dw_print_debug_rnglists (Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_vranges); -internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Input *input); -internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input); +internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); +internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); +internal void dw_print_debug_aranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_addr (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_loclists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges, Arch arch); +internal void dw_print_debug_rnglists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges); +internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Raw *input); #endif //////////////////////////////// //~ rjf: Dump Entry Point -internal String8List dw_dump_list_from_sections(Arena *arena, DW_Input *input, Arch arch, DW_SectionFlags dump_sections, B32 is_verbose); +internal String8List dw_dump_list_from_sections(Arena *arena, DW_Raw *input, Arch arch, DW_SectionFlags dump_sections, B32 is_verbose); #endif // DWARF_DUMP_H diff --git a/src/dwarf/dwarf_elf.c b/src/dwarf/dwarf_elf.c index 39884286..63b09dd4 100644 --- a/src/dwarf/dwarf_elf.c +++ b/src/dwarf/dwarf_elf.c @@ -27,10 +27,10 @@ dw_is_dwarf_present_from_elf_bin(String8 data, ELF_Bin *bin) #define SINFL_IMPLEMENTATION #include "third_party/sinfl/sinfl.h" -internal DW_Input +internal DW_Raw dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) { - DW_Input result = {0}; + DW_Raw result = {0}; B32 is_section_present[ArrayCount(result.sec)] = {0}; for(U64 section_idx = 1; section_idx < bin->shdrs.count; section_idx += 1) { diff --git a/src/dwarf/dwarf_elf.h b/src/dwarf/dwarf_elf.h index a9a54f38..5d5965e3 100644 --- a/src/dwarf/dwarf_elf.h +++ b/src/dwarf/dwarf_elf.h @@ -5,6 +5,6 @@ #define DWARF_ELF_H internal B32 dw_is_dwarf_present_from_elf_bin(String8 raw_image, ELF_Bin *bin); -internal DW_Input dw_input_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin); +internal DW_Raw dw_input_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin); #endif // DWARF_ELF_H diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index de222b03..e090fb48 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -10,5 +10,6 @@ #include "dwarf/dwarf_dump.c" #include "dwarf/dwarf_help.c" #include "dwarf/dwarf_writer.c" +#include "dwarf/dwarf_parse_2.c" #include "dwarf/eh_frame.c" #include "dwarf/eh_dump.c" diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index aeba7dde..325c6034 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -13,6 +13,7 @@ #include "dwarf/dwarf_dump.h" #include "dwarf/dwarf_help.h" #include "dwarf/dwarf_writer.h" +#include "dwarf/dwarf_parse_2.h" #include "dwarf/eh_frame.h" #include "dwarf/eh_dump.h" diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index bc57b510..d55925d2 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -199,17 +199,17 @@ dw_unit_ranges_from_data(Arena *arena, String8 data) for (U64 cursor = 0; cursor < data.size; ) { U64 start = cursor; - + // read unit size U64 size; U64 size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &size); if (size_size == 0) { break; } cursor += size_size; - + // is unit size valid? if (cursor + size > data.size) { break; } cursor += size; - + // push unit range if (size > 0) { rng1u64_list_push(arena, &result, rng_1u64(start, cursor)); @@ -274,7 +274,7 @@ internal U64 dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out) { U64 header_size = 0; - + U32 first_four_bytes = 0; if (str8_deserial_read_struct(unit_data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; @@ -310,7 +310,7 @@ internal U64 dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) { U64 header_size = 0; - + U32 first_four_bytes = 0; if (str8_deserial_read_struct(unit_data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; @@ -353,7 +353,7 @@ dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) } internal DW_ListUnitInput -dw_list_unit_input_from_input(Arena *arena, DW_Input *input) +dw_list_unit_input_from_input(Arena *arena, DW_Raw *input) { Temp scratch = scratch_begin(&arena, 1); @@ -465,17 +465,17 @@ dw_read_abbrev_tag(String8 data, U64 offset, DW_Abbrev *out_abbrev) // read tag ID and kind U64 id = 0; TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); - + // is this null terminator? if (id == 0) { total_bytes_read = cursor - offset; MemoryZeroStruct(out_abbrev); goto exit; } - + U64 kind = 0; TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); - + // read child flag U8 has_children = 0; if (id != 0) { @@ -491,7 +491,7 @@ dw_read_abbrev_tag(String8 data, U64 offset, DW_Abbrev *out_abbrev) } total_bytes_read = cursor - offset; -exit:; + exit:; return total_bytes_read; } @@ -500,7 +500,7 @@ dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev) { U64 total_bytes_read = 0; U64 cursor = offset; - + // read id and kind U64 id, kind; TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); @@ -522,7 +522,7 @@ dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev) } total_bytes_read = cursor - offset; -exit:; + exit:; return total_bytes_read; } @@ -532,24 +532,24 @@ dw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_base) Temp temp = temp_begin(arena); DW_AbbrevTable table = {0}; B32 failed_to_make = 1; - + // count abbrev tags for (U64 cursor = abbrev_base; cursor < abbrev_data.size; table.count += 1) { DW_Abbrev tag; TryRead(dw_read_abbrev_tag(abbrev_data, cursor, &tag), cursor, exit); if (tag.id == 0) { break; } - + for (; cursor < abbrev_data.size; ) { DW_Abbrev attrib; TryRead(dw_read_abbrev_attrib(abbrev_data, cursor, &attrib), cursor, exit); if(attrib.id == 0) { break; } } } - + // alloc entries table.entries = push_array(arena, DW_AbbrevTableEntry, table.count); table.count = 0; - + // fill out the table for (U64 cursor = abbrev_base; cursor < abbrev_data.size;) { U64 tag_abbrev_off = cursor; @@ -571,7 +571,7 @@ dw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_base) } failed_to_make = 0; -exit:; + exit:; if (failed_to_make) { MemoryZeroStruct(&table); temp_end(temp); @@ -759,7 +759,7 @@ dw_read_form(String8 data, } break; default: InvalidPath; break; } - + if (form_out) { form.kind = form_kind; *form_out = form; @@ -769,14 +769,14 @@ dw_read_form(String8 data, } is_ok = 1; -exit:; + exit:; Assert(is_ok); return is_ok; } internal U64 dw_read_tag(Arena *arena, - DW_Input *input, + DW_Raw *input, DW_AbbrevTable abbrev_table, DW_Version version, DW_Format format, @@ -786,17 +786,17 @@ dw_read_tag(Arena *arena, DW_Tag *tag_out) { U64 bytes_read = 0; - + String8 info_data = input->sec[DW_Section_Info].data; String8 abbrev_data = input->sec[DW_Section_Abbrev].data; - + String8 tag_data = str8_substr(info_data, cu_info_range); U64 tag_cursor = tag_info_off - cu_info_range.min; // read tag abbrev id U64 tag_abbrev_id = 0; TryRead(str8_deserial_read_uleb128(tag_data, tag_cursor, &tag_abbrev_id), tag_cursor, exit); - + B32 has_children = 0; DW_TagKind tag_kind = DW_TagKind_Null; DW_AttribList attribs = {0}; @@ -804,34 +804,34 @@ dw_read_tag(Arena *arena, // map abbrev id -> .debug_abbrev offset U64 abbrev_cursor = dw_abbrev_offset_from_abbrev_id(abbrev_table, tag_abbrev_id); if (abbrev_cursor >= abbrev_data.size) { log_user_errorf("failed to find abbrev id 0x%I64x for tag 0x%I64x", tag_abbrev_id, tag_info_off); goto exit; } - + // read tag abbrev DW_Abbrev tag_abbrev = {0}; TryRead(dw_read_abbrev_tag(abbrev_data, abbrev_cursor, &tag_abbrev), abbrev_cursor, exit); - + has_children = !!(tag_abbrev.flags & DW_AbbrevFlag_HasChildren); tag_kind = (DW_TagKind)tag_abbrev.sub_kind; - + // read attribs for (; tag_cursor < tag_data.size && abbrev_cursor < abbrev_data.size; ) { U64 attrib_tag_cursor = tag_cursor; U64 attrib_abbrev_off = abbrev_cursor; - + // read attrib abbrev DW_Abbrev attrib_abbrev = {0}; TryRead(dw_read_abbrev_attrib(abbrev_data, abbrev_cursor, &attrib_abbrev), abbrev_cursor, exit); - + DW_AttribKind attrib_kind = (DW_AttribKind)attrib_abbrev.id; DW_FormKind form_kind = (DW_FormKind)attrib_abbrev.sub_kind; - + // is this closing attrib? if (attrib_kind == DW_AttribKind_Null) { break; } - + // special case, allows producer to embed form in .debug_info if (form_kind == DW_Form_Indirect) { TryRead(str8_deserial_read_uleb128(tag_data, tag_cursor, &form_kind), tag_cursor, exit); } - + // read form value DW_Form form = {0}; U64 form_size = 0; @@ -839,7 +839,7 @@ dw_read_tag(Arena *arena, goto exit; } tag_cursor += form_size; - + // fill out node DW_AttribNode *attrib_n = push_array(arena, DW_AttribNode, 1); attrib_n->v.info_off = cu_info_range.min + attrib_tag_cursor; @@ -847,13 +847,13 @@ dw_read_tag(Arena *arena, attrib_n->v.abbrev_id = attrib_abbrev.id; attrib_n->v.attrib_kind = attrib_kind; attrib_n->v.form = form; - + // push node to list SLLQueuePush(attribs.first, attribs.last, attrib_n); attribs.count += 1; } } - + // fill out tag tag_out->abbrev_id = tag_abbrev_id; tag_out->has_children = has_children; @@ -862,12 +862,12 @@ dw_read_tag(Arena *arena, tag_out->info_off = tag_info_off; bytes_read = tag_cursor - (tag_info_off - cu_info_range.min); -exit:; + exit:; return bytes_read; } internal U64 -dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) +dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) { return dw_read_tag(arena, input, @@ -1025,14 +1025,14 @@ dw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_Form } internal String8 -dw_interp_block(DW_Input *input, DW_CompUnit *cu, DW_Form form) +dw_interp_block(DW_Raw *input, DW_CompUnit *cu, DW_Form form) { NotImplemented; return str8_zero(); } internal String8 -dw_interp_string(DW_Input *input, +dw_interp_string(DW_Raw *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_Form form) @@ -1070,7 +1070,7 @@ dw_interp_string(DW_Input *input, } internal String8 -dw_interp_line_ptr(DW_Input *input, DW_Form form) +dw_interp_line_ptr(DW_Raw *input, DW_Form form) { String8 result = {0}; if (form.kind == DW_Form_SecOffset) { @@ -1090,7 +1090,7 @@ dw_interp_file(DW_LineVM *line_vm, DW_Form form) } internal DW_Reference -dw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_Form form) +dw_interp_ref(DW_Raw *input, DW_CompUnit *cu, DW_Form form) { DW_Reference ref = {0}; if (form.kind == DW_Form_Ref1 || form.kind == DW_Form_Ref2 || @@ -1111,7 +1111,7 @@ dw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_Form form) } internal DW_LocList -dw_interp_loclist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form) +dw_interp_loclist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form) { DW_LocList loclist = {0}; @@ -1398,7 +1398,7 @@ dw_interp_flag(DW_Form form) } internal Rng1U64List -dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form) +dw_interp_rnglist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form) { Rng1U64List rnglist = {0}; @@ -1589,7 +1589,7 @@ dw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form) } internal String8 -dw_interp_secptr(DW_Input *input, DW_SectionKind section, DW_Form form) +dw_interp_secptr(DW_Raw *input, DW_SectionKind section, DW_Form form) { String8 secptr = {0}; if (form.kind == DW_Form_SecOffset) { @@ -1603,25 +1603,25 @@ dw_interp_secptr(DW_Input *input, DW_SectionKind section, DW_Form form) } internal String8 -dw_interp_addrptr(DW_Input *input, DW_Form form) +dw_interp_addrptr(DW_Raw *input, DW_Form form) { return dw_interp_secptr(input, DW_Section_Addr, form); } internal String8 -dw_interp_str_offsets_ptr(DW_Input *input, DW_Form form) +dw_interp_str_offsets_ptr(DW_Raw *input, DW_Form form) { return dw_interp_secptr(input, DW_Section_StrOffsets, form); } internal String8 -dw_interp_rnglists_ptr(DW_Input *input, DW_Form form) +dw_interp_rnglists_ptr(DW_Raw *input, DW_Form form) { return dw_interp_secptr(input, DW_Section_RngLists, form); } internal String8 -dw_interp_loclists_ptr(DW_Input *input, DW_Form form) +dw_interp_loclists_ptr(DW_Raw *input, DW_Form form) { return dw_interp_secptr(input, DW_Section_LocLists, form); } @@ -1633,7 +1633,7 @@ dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_exprloc_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_exprloc_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_ExprLoc || value_class == DW_AttribClass_Block); @@ -1641,7 +1641,7 @@ dw_exprloc_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U128 -dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1649,7 +1649,7 @@ dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U64 -dw_const_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1657,7 +1657,7 @@ dw_const_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U32 -dw_const_u32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_u32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1665,7 +1665,7 @@ dw_const_u32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal S64 -dw_const_s64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_s64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1673,7 +1673,7 @@ dw_const_s64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal S32 -dw_const_s32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_const_s32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); @@ -1681,7 +1681,7 @@ dw_const_s32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal B32 -dw_flag_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_flag_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Flag); @@ -1689,7 +1689,7 @@ dw_flag_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal U64 -dw_address_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_address_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || @@ -1710,7 +1710,7 @@ dw_address_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_block_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_block_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Block); @@ -1718,7 +1718,7 @@ dw_block_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_string_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_string_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_String || value_class == DW_AttribClass_StrOffsetsPtr); @@ -1726,7 +1726,7 @@ dw_string_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal String8 -dw_line_ptr_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_line_ptr_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_LinePtr); @@ -1742,7 +1742,7 @@ dw_file_from_attrib(DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) } internal DW_Reference -dw_ref_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_ref_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Reference); @@ -1750,7 +1750,7 @@ dw_ref_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal DW_LocList -dw_loclist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_loclist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); AssertAlways(value_class == DW_AttribClass_Null || @@ -1760,7 +1760,7 @@ dw_loclist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib } internal Rng1U64List -dw_rnglist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_rnglist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { Rng1U64List rnglist = {0}; DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); @@ -1787,7 +1787,7 @@ dw_attrib_from_tag_(DW_Tag tag, DW_AttribKind kind) } internal DW_Attrib * -dw_attrib_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_attrib_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { DW_Attrib *attrib = dw_attrib_from_tag_(tag, kind); @@ -1806,7 +1806,7 @@ dw_attrib_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind k } internal B32 -dw_tag_has_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_tag_has_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); B32 has_attrib = attrib->attrib_kind != DW_AttribKind_Null; @@ -1814,85 +1814,85 @@ dw_tag_has_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind ki } internal String8 -dw_exprloc_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_exprloc_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_exprloc_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_block_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_block_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_block_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U128 -dw_const_u128_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u128_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U64 -dw_const_u64_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u64_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u64_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U32 -dw_const_u32_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_const_u32_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_const_u32_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal U64 -dw_address_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_address_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_address_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_string_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_string_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_string_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal String8 -dw_line_ptr_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_line_ptr_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_line_ptr_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_Reference -dw_ref_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_ref_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_ref_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_LocList -dw_loclist_from_tag_attrib_kind(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_loclist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_loclist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal Rng1U64List -dw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_rnglist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal B32 -dw_flag_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_flag_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { return dw_flag_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); } internal DW_LineFile * -dw_file_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind) +dw_file_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind) { return dw_file_from_attrib(cu, line_vm, dw_attrib_from_tag(input, cu, tag, kind)); } internal B32 -dw_try_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out) +dw_try_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out) { B32 has_byte_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ByteSize); B32 has_bit_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_BitSize ); @@ -1914,7 +1914,7 @@ dw_try_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, U64 *byt } internal U64 -dw_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) +dw_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) { U64 byte_size = max_U64; dw_try_byte_size_from_tag(input, cu, tag, &byte_size); @@ -1922,7 +1922,7 @@ dw_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) } internal U32 -dw_byte_size_32_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) +dw_byte_size_32_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) { U32 byte_size32 = 0; U64 byte_size64; @@ -1933,7 +1933,7 @@ dw_byte_size_32_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag) } internal U64 -dw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +dw_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { U64 result = 0; DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); @@ -1964,7 +1964,7 @@ dw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind k } internal B32 -dw_is_attrib_var_ref(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) +dw_is_attrib_var_ref(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) { B32 is_var_ref = 0; if (dw_is_form_kind_ref(cu->version, cu->ext, attrib->form.kind)) { @@ -1980,10 +1980,10 @@ dw_is_attrib_var_ref(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib) } internal DW_CompUnit -dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 cu_header_offset, B32 relaxed) +dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 cu_header_offset, B32 relaxed) { DW_CompUnit cu = {0}; - + U32 first_four_bytes = 0; if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; @@ -2037,7 +2037,7 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 is_header_ok = 1; } break; } - + U64 header_size = info_cursor; if (is_header_ok) { @@ -2052,13 +2052,13 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 // TODO: handle these unit types if (cu_tag.kind == DW_TagKind_SkeletonUnit) { log_user_errorf("TODO: Skeleton Unit"); } if (cu_tag.kind == DW_TagKind_TypeUnit) { log_user_errorf("TODO Type Unit"); } - + if (cu_tag.kind != DW_TagKind_CompileUnit && cu_tag.kind != DW_TagKind_PartialUnit) { // unexpected tag, release memory and exit temp_end(temp); goto exit; } - + // fetch attribs for list sections DW_Attrib *addr_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_AddrBase ); DW_Attrib *str_offsets_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_StrOffsetsBase); @@ -2106,12 +2106,12 @@ dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U6 cu.tag = cu_tag; } -exit:; + exit:; return cu; } internal void -dw_tag_tree_from_data(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_TagNode *parent, U64 *cursor, U64 *tag_count) +dw_tag_tree_from_data(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *parent, U64 *cursor, U64 *tag_count) { while (*cursor < cu->info_range.max) { // read tag @@ -2138,7 +2138,7 @@ dw_tag_tree_from_data(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_TagNode } internal DW_TagTree -dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu) +dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu) { DW_TagNode root = {0}; U64 cursor = cu->first_tag_info_off; @@ -2206,7 +2206,7 @@ dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off) internal U64 dw_read_line_vm_header(Arena *arena, - DW_Input *input, + DW_Raw *input, String8 cu_stmt_list, String8 cu_dir, String8 cu_name, @@ -2215,12 +2215,12 @@ dw_read_line_vm_header(Arena *arena, DW_LineVMHeader *header_out) { Temp scratch = scratch_begin(&arena, 1); - + U64 cursor = 0; - + U32 first_four_bytes = 0; if (str8_deserial_read_struct(cu_stmt_list, 0, &first_four_bytes) != sizeof(U32)) { goto exit; } - + // read unit length U64 length = 0; U64 length_size = str8_deserial_read_dwarf_packed_size(cu_stmt_list, 0, &length); @@ -2247,7 +2247,7 @@ dw_read_line_vm_header(Arena *arena, // substring header so we dont overread into the line program data = str8_prefix(data, cursor + header_length); - + U8 min_inst_len = 0; TryRead(str8_deserial_read_struct(data, cursor, &min_inst_len), cursor, exit); @@ -2259,16 +2259,16 @@ dw_read_line_vm_header(Arena *arena, U8 default_is_stmt = 0; TryRead(str8_deserial_read_struct(data, cursor, &default_is_stmt), cursor, exit); - + S8 line_base = 0; TryRead(str8_deserial_read_struct(data, cursor, &line_base), cursor, exit); - + U8 line_range = 0; TryRead(str8_deserial_read_struct(data, cursor, &line_range), cursor, exit); - + U8 opcode_base = 0; TryRead(str8_deserial_read_struct(data, cursor, &opcode_base), cursor, exit); - + U64 num_opcode_lens = opcode_base > 0 ? opcode_base - 1 : 0; String8 opcode_lens; TryRead(str8_deserial_read_block(data, cursor, num_opcode_lens * sizeof(U8), &opcode_lens), cursor, exit); @@ -2278,7 +2278,7 @@ dw_read_line_vm_header(Arena *arena, if (version < DW_Version_5) { // read directory table String8List dir_list = {0}; - + // compile directory is always first in the table str8_list_push(scratch.arena, &dir_list, cu_dir); @@ -2305,7 +2305,7 @@ dw_read_line_vm_header(Arena *arena, U8 first_byte = 0; if (str8_deserial_read_struct(data, cursor, &first_byte) == 0) { goto exit; } if (first_byte == 0) { break; } - + DW_LineFile file = {0}; TryRead(str8_deserial_read_cstr (data, cursor, &file.path), cursor, exit); TryRead(str8_deserial_read_uleb128(data, cursor, &file.dir_idx), cursor, exit); @@ -2322,7 +2322,7 @@ dw_read_line_vm_header(Arena *arena, // dir list -> array dir_table = str8_array_from_list(arena, &dir_list); - + // file list -> array file_table.count = 0; file_table.v = push_array(arena, DW_LineFile, file_list.node_count); @@ -2349,7 +2349,7 @@ dw_read_line_vm_header(Arena *arena, // read table count U64 table_count = 0; TryRead(str8_deserial_read_uleb128(data, cursor, &table_count), cursor, exit); - + // validate encoding if (table_count > 0) { if (enc_count != 1) { goto exit; } @@ -2382,31 +2382,31 @@ dw_read_line_vm_header(Arena *arena, // read table count U64 table_count = 0; TryRead(str8_deserial_read_uleb128(data, cursor, &table_count), cursor, exit); - + file_table.count = table_count; file_table.v = push_array(arena, DW_LineFile, table_count); - + for EachIndex(i, table_count) { DW_LineFile *file = &file_table.v[i]; for EachIndex(enc_idx, enc_count) { DW_LNCT lnct = enc_arr[enc_idx*2 + 0]; - + DW_FormKind form_kind = enc_arr[enc_idx*2 + 1]; DW_Form form = {0}; U64 form_size = 0; if (!dw_read_form(str8_skip(data, cursor), version, format, address_size, form_kind, max_U64, &form, &form_size)) { goto exit; } cursor += form_size; - + switch (lnct) { - case DW_LNCT_Path: { file->path = dw_interp_string(input, format, cu_str_offsets, form); } break; - case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form); } break; - case DW_LNCT_TimeStamp: { file->time_stamp = dw_interp_const_u64(form); } break; - case DW_LNCT_Size: { file->size = dw_interp_const_u64(form); } break; - case DW_LNCT_MD5: { file->md5 = dw_interp_const_u128(form); } break; - case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form); } break; - default: { - Assert(!"unexpected LNTC encoding"); - } break; + case DW_LNCT_Path: { file->path = dw_interp_string(input, format, cu_str_offsets, form); } break; + case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form); } break; + case DW_LNCT_TimeStamp: { file->time_stamp = dw_interp_const_u64(form); } break; + case DW_LNCT_Size: { file->size = dw_interp_const_u64(form); } break; + case DW_LNCT_MD5: { file->md5 = dw_interp_const_u128(form); } break; + case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form); } break; + default: { + Assert(!"unexpected LNTC encoding"); + } break; } } } @@ -2438,16 +2438,16 @@ dw_read_line_vm_header(Arena *arena, } internal DW_LineVM * -dw_line_vm_init(DW_Input *input, DW_CompUnit *cu) +dw_line_vm_init(DW_Raw *input, DW_CompUnit *cu) { DW_LineVM *vm = 0; - + Arena *arena = arena_alloc(.reserve_size = KB(64), .commit_size = KB(1)); - + String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); String8 cu_dir = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_CompDir); String8 cu_name = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_Name); - + // read the line table header DW_LineVMHeader header = {0}; if (cu_stmt_list.size) { @@ -2455,7 +2455,7 @@ dw_line_vm_init(DW_Input *input, DW_CompUnit *cu) goto exit; } } - + vm = push_array(arena, DW_LineVM, 1); *vm = (DW_LineVM){ .arena = arena, @@ -2464,7 +2464,7 @@ dw_line_vm_init(DW_Input *input, DW_CompUnit *cu) .header = header, .state.end_sequence = 1, }; - + exit:; if (vm == 0) { arena_release(arena); } return vm; @@ -2489,11 +2489,11 @@ internal B32 dw_line_vm_step(DW_LineVM *vm) { B32 is_ok = 0; - + if (vm->cursor >= vm->program.size) { goto exit; } - + vm->new_line = 0; - + // reset VM state if (vm->state.end_sequence) { vm->state.address = 0; @@ -2509,24 +2509,24 @@ dw_line_vm_step(DW_LineVM *vm) vm->state.isa = 0; vm->state.discriminator = 0; } - + // read opcode TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &vm->opcode), vm->cursor, exit); - + // special opcodes if (vm->opcode >= vm->header.opcode_base) { U32 adjusted_opcode = (U32)(vm->opcode - vm->header.opcode_base); U32 op_advance = adjusted_opcode / vm->header.line_range; S32 line_advance = (S64)vm->header.line_base + ((S64)adjusted_opcode) % (S64)vm->header.line_range; U64 addr_advance = vm->header.min_inst_len * ((vm->state.op_index + op_advance) / vm->header.max_ops_for_inst); - + if (vm->header.line_range > 0 && vm->header.max_ops_for_inst > 0) { adjusted_opcode = (U32)(vm->opcode - vm->header.opcode_base); op_advance = adjusted_opcode / vm->header.line_range; line_advance = (S32)vm->header.line_base + ((S32)adjusted_opcode) % (S32)vm->header.line_range; addr_advance = vm->header.min_inst_len * ((vm->state.op_index+op_advance) / vm->header.max_ops_for_inst); } - + vm->state.address += addr_advance; vm->state.op_index = (vm->state.op_index + op_advance) % vm->header.max_ops_for_inst; vm->state.line = (U64)((S64)vm->state.line + line_advance); @@ -2534,142 +2534,142 @@ dw_line_vm_step(DW_LineVM *vm) vm->state.prologue_end = 0; vm->state.epilogue_begin = 0; vm->state.discriminator = 0; - + vm->line_advance = line_advance; vm->addr_advance = addr_advance; vm->new_line = 1; } else { // standard opcodes switch (vm->opcode) { - case DW_StdOpcode_Copy: { - vm->new_line = 1; - - vm->state.discriminator = 0; - vm->state.basic_block = 0; - vm->state.prologue_end = 0; - vm->state.epilogue_begin = 0; - } break; - - case DW_StdOpcode_AdvancePc: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); - dw_line_vm_advance(vm, vm->operands[0].u64); - } break; - - case DW_StdOpcode_AdvanceLine: { - TryRead(str8_deserial_read_sleb128(vm->program, vm->cursor, &vm->operands[0].s64), vm->cursor, exit); - vm->state.line += vm->operands[0].s64; - } break; - - case DW_StdOpcode_SetFile: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); - vm->state.file_index = vm->operands[0].u64; - } break; - - case DW_StdOpcode_SetColumn: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); - vm->state.column = vm->operands[0].u64; - } break; - - case DW_StdOpcode_NegateStmt: { - vm->state.is_stmt = !vm->state.is_stmt; - } break; - - case DW_StdOpcode_SetBasicBlock: { - vm->state.basic_block = 1; - } break; - - case DW_StdOpcode_ConstAddPc: { - U64 advance = (0xffu - vm->header.opcode_base) / vm->header.line_range; - dw_line_vm_advance(vm, advance); - } break; - - case DW_StdOpcode_FixedAdvancePc: { - U16 fixed_advance = 0; - TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &fixed_advance), vm->cursor, exit); - vm->operands[0].u64 = fixed_advance; - vm->state.address += vm->operands[0].u64; - vm->state.op_index = 0; - } break; - - case DW_StdOpcode_SetPrologueEnd: { - vm->state.prologue_end = 1; - } break; - - case DW_StdOpcode_SetEpilogueBegin: { - vm->state.epilogue_begin = 1; - } break; - - case DW_StdOpcode_SetIsa: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); - vm->state.isa = vm->operands[0].u64; - } break; - - // extended opcodes - case DW_StdOpcode_ExtendedOpcode: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->ext_length), vm->cursor, exit); - String8 ext_data = str8_substr(vm->program, r1u64(vm->cursor, vm->cursor + vm->ext_length)); - vm->cursor += vm->ext_length; - - U64 ext_cursor = 0; - TryRead(str8_deserial_read_struct(ext_data, ext_cursor, &vm->ext_opcode), ext_cursor, exit); - - switch (vm->ext_opcode) { - case DW_ExtOpcode_EndSequence: { - vm->new_seq = 1; + case DW_StdOpcode_Copy: { vm->new_line = 1; - vm->state.end_sequence = 1; + + vm->state.discriminator = 0; + vm->state.basic_block = 0; + vm->state.prologue_end = 0; + vm->state.epilogue_begin = 0; } break; - - case DW_ExtOpcode_SetAddress: { - TryRead(str8_deserial_read(ext_data, ext_cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), ext_cursor, exit); - vm->state.address = vm->operands[0].u64; + + case DW_StdOpcode_AdvancePc: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + dw_line_vm_advance(vm, vm->operands[0].u64); + } break; + + case DW_StdOpcode_AdvanceLine: { + TryRead(str8_deserial_read_sleb128(vm->program, vm->cursor, &vm->operands[0].s64), vm->cursor, exit); + vm->state.line += vm->operands[0].s64; + } break; + + case DW_StdOpcode_SetFile: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.file_index = vm->operands[0].u64; + } break; + + case DW_StdOpcode_SetColumn: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.column = vm->operands[0].u64; + } break; + + case DW_StdOpcode_NegateStmt: { + vm->state.is_stmt = !vm->state.is_stmt; + } break; + + case DW_StdOpcode_SetBasicBlock: { + vm->state.basic_block = 1; + } break; + + case DW_StdOpcode_ConstAddPc: { + U64 advance = (0xffu - vm->header.opcode_base) / vm->header.line_range; + dw_line_vm_advance(vm, advance); + } break; + + case DW_StdOpcode_FixedAdvancePc: { + U16 fixed_advance = 0; + TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &fixed_advance), vm->cursor, exit); + vm->operands[0].u64 = fixed_advance; + vm->state.address += vm->operands[0].u64; vm->state.op_index = 0; } break; - - case DW_ExtOpcode_DefineFile: { - TryRead(str8_deserial_read_cstr (ext_data, ext_cursor, &vm->operands[0].string), ext_cursor, exit); // file name - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[1].u64), ext_cursor, exit); // dir index - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[2].u64), ext_cursor, exit); // modify time - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[3].u64), ext_cursor, exit); // file size - - if (vm->ext_file_ht == 0) { - vm->ext_file_ht = hash_table_init(vm->arena, 512); - } - - DW_LineFile *file = push_array(vm->arena, DW_LineFile, 1); - file->path = vm->operands[0].string; - file->dir_idx = vm->operands[1].u64; - file->time_stamp = vm->operands[2].u64; - file->size = vm->operands[3].u64; - - if (hash_table_search_u64_raw(vm->ext_file_ht, vm->state.file_index) == 0) { - vm->error = push_str8f(vm->arena, "file with index %I64d was already defined", vm->state.file_index); - goto exit; - } - - hash_table_push_u64_raw(vm->arena, vm->ext_file_ht, vm->state.file_index, file); + + case DW_StdOpcode_SetPrologueEnd: { + vm->state.prologue_end = 1; } break; - - case DW_ExtOpcode_SetDiscriminator: { - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[0].u64), ext_cursor, exit); - vm->state.discriminator = vm->operands[0].u64; + + case DW_StdOpcode_SetEpilogueBegin: { + vm->state.epilogue_begin = 1; + } break; + + case DW_StdOpcode_SetIsa: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.isa = vm->operands[0].u64; + } break; + + // extended opcodes + case DW_StdOpcode_ExtendedOpcode: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->ext_length), vm->cursor, exit); + String8 ext_data = str8_substr(vm->program, r1u64(vm->cursor, vm->cursor + vm->ext_length)); + vm->cursor += vm->ext_length; + + U64 ext_cursor = 0; + TryRead(str8_deserial_read_struct(ext_data, ext_cursor, &vm->ext_opcode), ext_cursor, exit); + + switch (vm->ext_opcode) { + case DW_ExtOpcode_EndSequence: { + vm->new_seq = 1; + vm->new_line = 1; + vm->state.end_sequence = 1; + } break; + + case DW_ExtOpcode_SetAddress: { + TryRead(str8_deserial_read(ext_data, ext_cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), ext_cursor, exit); + vm->state.address = vm->operands[0].u64; + vm->state.op_index = 0; + } break; + + case DW_ExtOpcode_DefineFile: { + TryRead(str8_deserial_read_cstr (ext_data, ext_cursor, &vm->operands[0].string), ext_cursor, exit); // file name + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[1].u64), ext_cursor, exit); // dir index + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[2].u64), ext_cursor, exit); // modify time + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[3].u64), ext_cursor, exit); // file size + + if (vm->ext_file_ht == 0) { + vm->ext_file_ht = hash_table_init(vm->arena, 512); + } + + DW_LineFile *file = push_array(vm->arena, DW_LineFile, 1); + file->path = vm->operands[0].string; + file->dir_idx = vm->operands[1].u64; + file->time_stamp = vm->operands[2].u64; + file->size = vm->operands[3].u64; + + if (hash_table_search_u64_raw(vm->ext_file_ht, vm->state.file_index) == 0) { + vm->error = push_str8f(vm->arena, "file with index %I64d was already defined", vm->state.file_index); + goto exit; + } + + hash_table_push_u64_raw(vm->arena, vm->ext_file_ht, vm->state.file_index, file); + } break; + + case DW_ExtOpcode_SetDiscriminator: { + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[0].u64), ext_cursor, exit); + vm->state.discriminator = vm->operands[0].u64; + } break; + + default: { NotImplemented; } break; + } + } break; + + default: { + // skip unknown opcode + if (0 == vm->opcode || vm->opcode > vm->header.num_opcode_lens) { goto exit; } + for EachIndex(i, vm->header.opcode_lens[vm->opcode - 1]) { + U64 v = 0; + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &v), vm->cursor, exit); + } } break; - - default: { NotImplemented; } break; - } - } break; - - default: { - // skip unknown opcode - if (0 == vm->opcode || vm->opcode > vm->header.num_opcode_lens) { goto exit; } - for EachIndex(i, vm->header.opcode_lens[vm->opcode - 1]) { - U64 v = 0; - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &v), vm->cursor, exit); - } - } break; } } - + is_ok = 1; exit:; return is_ok; @@ -2691,14 +2691,14 @@ internal String8 dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file) { Temp scratch = scratch_begin(&arena, 1); - + // directory table must contain at least compile unit directory Assert(dir_table.count > 0); - + // find directory and file name associated with the file index String8 dir = dir_table.v[file->dir_idx]; String8 path = file->path; - + // infer path style if directory is empty use file name PathStyle style = path_style_from_str8(dir); if (style == PathStyle_Null || style == PathStyle_Relative) { @@ -2712,18 +2712,18 @@ dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file) String8List comp_dir = str8_split_path(scratch.arena, dir_table.v[0]); str8_list_concat_in_place(&path_list, &comp_dir); } - + // push directory String8List dir_list = str8_split_path(scratch.arena, dir); str8_list_concat_in_place(&path_list, &dir_list); - + // push file name str8_list_push(scratch.arena, &path_list, file->path); - + // resolve dots in the path str8_path_list_resolve_dots_in_place(&path_list, style); } - + // join path String8 result = str8_path_list_join_by_style(arena, &path_list, style); @@ -2732,7 +2732,7 @@ dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file) } internal DW_PubStringsTable -dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind) +dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind) { Temp scratch = scratch_begin(&arena, 1); @@ -2745,7 +2745,7 @@ dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_Sect U32 first_four_bytes = 0; if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { break; } DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - + U64 unit_length = 0; U64 unit_length_size = str8_deserial_read_dwarf_packed_size(section_data, cursor, &unit_length); if (unit_length_size == 0) { @@ -2823,45 +2823,45 @@ dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data) for EachIndex(operand_idx, operand_count) { U64 operand_size = 0; switch (operand_types[operand_idx]) { - case DW_ExprOperandType_Null: { } break; - case DW_ExprOperandType_U8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u8); } break; - case DW_ExprOperandType_U16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u16); } break; - case DW_ExprOperandType_U32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u32); } break; - case DW_ExprOperandType_U64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u64); } break; - case DW_ExprOperandType_S8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s8); } break; - case DW_ExprOperandType_S16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s16); } break; - case DW_ExprOperandType_S32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s32); } break; - case DW_ExprOperandType_S64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s64); } break; - case DW_ExprOperandType_ULEB128: { operand_size = str8_deserial_read_uleb128(data, cursor, &operands[operand_idx].u64); } break; - case DW_ExprOperandType_SLEB128: { operand_size = str8_deserial_read_sleb128(data, cursor, &operands[operand_idx].s64); } break; - case DW_ExprOperandType_Addr: { operand_size = str8_deserial_read(data, cursor, &operands[operand_idx].u64, addr_size, addr_size); } break; - case DW_ExprOperandType_DwarfUInt: { operand_size = str8_deserial_read_dwarf_uint(data, cursor, format, &operands[operand_idx].u64); } break; - case DW_ExprOperandType_Block: { - U8 block_size; - U64 block_size_size = str8_deserial_read_struct(data, cursor, &block_size); - U64 block_read_size = str8_deserial_read_block(data, cursor + block_size_size, block_size, &operands[operand_idx].block); - if(block_read_size == block_size_size) { - operand_size = block_size_size + block_read_size; - } - } break; - default: { InvalidPath; } break; + case DW_ExprOperandType_Null: { } break; + case DW_ExprOperandType_U8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u8); } break; + case DW_ExprOperandType_U16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u16); } break; + case DW_ExprOperandType_U32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u32); } break; + case DW_ExprOperandType_U64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_S8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s8); } break; + case DW_ExprOperandType_S16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s16); } break; + case DW_ExprOperandType_S32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s32); } break; + case DW_ExprOperandType_S64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s64); } break; + case DW_ExprOperandType_ULEB128: { operand_size = str8_deserial_read_uleb128(data, cursor, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_SLEB128: { operand_size = str8_deserial_read_sleb128(data, cursor, &operands[operand_idx].s64); } break; + case DW_ExprOperandType_Addr: { operand_size = str8_deserial_read(data, cursor, &operands[operand_idx].u64, addr_size, addr_size); } break; + case DW_ExprOperandType_DwarfUInt: { operand_size = str8_deserial_read_dwarf_uint(data, cursor, format, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_Block: { + U8 block_size; + U64 block_size_size = str8_deserial_read_struct(data, cursor, &block_size); + U64 block_read_size = str8_deserial_read_block(data, cursor + block_size_size, block_size, &operands[operand_idx].block); + if(block_read_size == block_size_size) { + operand_size = block_size_size + block_read_size; + } + } break; + default: { InvalidPath; } break; } if (operand_size == 0) { goto exit; } cursor += operand_size; } - + // fill out instruction DW_ExprInst *inst = push_array(arena, DW_ExprInst, 1); inst->opcode = opcode; inst->size = cursor - inst_start; inst->operands = operand_count ? push_array(arena, DW_ExprOperand, operand_count) : 0; MemoryCopy(inst->operands, operands, operand_count * sizeof(DW_ExprOperand)); - + // push instruction DLLPushBack(expr.first, expr.last, inst); expr.count += 1; } -exit:; + exit:; return expr; } @@ -2899,25 +2899,25 @@ dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc U32 first_four_bytes = 0; str8_deserial_read_struct(data, off, &first_four_bytes); DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - + U64 length = 0; U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); if (length_size == 0) { goto exit; } - + Rng1U64 entry_range = rng_1u64(off, off + length_size + length); String8 entry_data = str8_substr(data, entry_range); U64 id = 0; U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); if (id_size == 0) { goto exit; } - + U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64; desc_out->format = format; desc_out->type = (id == id_type) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; desc_out->entry_range = entry_range; desc_out->cie_pointer = id; desc_out->cie_pointer_off = length_size; - -exit:; + + exit:; return length + length_size; } @@ -2926,16 +2926,16 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - + U64 cie_id = 0; TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id), cursor, exit); - + U8 version = 0; TryRead(str8_deserial_read_struct(data, cursor, &version), cursor, exit); - + String8 aug_string = {0}; TryRead(str8_deserial_read_cstr(data, cursor, &aug_string), cursor, exit); - + U8 address_size = 0; U8 segment_selector_size = 0; if (version >= DW_Version_4) { @@ -2944,20 +2944,20 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) } else { address_size = byte_size_from_arch(arch); } - + U64 code_align_factor = 0; TryRead(str8_deserial_read_uleb128(data, cursor, &code_align_factor), cursor, exit); - + S64 data_align_factor = 0; TryRead(str8_deserial_read_sleb128(data, cursor, &data_align_factor), cursor, exit); - + U64 ret_addr_reg = 0; U64 ret_addr_reg_size = 0; if (version == DW_Version_1) { TryRead(str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)), cursor, exit); } else { TryRead(str8_deserial_read_uleb128(data, cursor, &ret_addr_reg), cursor, exit); } - + if (aug_string.size > 0) { goto exit; } - + cie_out->insts = str8_skip(data, cursor); cie_out->aug_string = aug_string; cie_out->code_align_factor = code_align_factor; @@ -2967,9 +2967,9 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) cie_out->version = version; cie_out->address_size = address_size; cie_out->segment_selector_size = segment_selector_size; - + is_parsed = 1; -exit:; + exit:; return is_parsed; } @@ -2978,31 +2978,31 @@ dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out) { B32 is_parsed = 0; U64 cursor = format == DW_Format_32Bit ? 4 : 12; - + // extract CIE pointer U64 cie_pointer = 0; TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer), cursor, exit); - + // extract address of first instruction U64 pc_begin = 0; TryRead(dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin), cursor, exit); - + // extract instruction range size U64 pc_range = 0; TryRead(dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_range), cursor, exit); - + // parse augmentation data String8 aug_data = str8_substr(data, rng_1u64(cursor, cursor + cie->aug_data.size)); cursor += cie->aug_data.size; - + // commit values to out fde_out->format = format; fde_out->cie_pointer = cie_pointer; fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); fde_out->insts = str8_skip(data, cursor); - + is_parsed = 1; -exit:; + exit:; return is_parsed; } @@ -3028,28 +3028,28 @@ dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *f } } } - + return is_parsed; } internal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, - U64 code_align_factor, - S64 data_align_factor, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud, - U64 *bytes_read_out, - DW_CFA_Inst *inst_out) + U64 code_align_factor, + S64 data_align_factor, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud, + U64 *bytes_read_out, + DW_CFA_Inst *inst_out) { *bytes_read_out = 0; - + DW_CFA_ParseErrorCode error_code = DW_CFA_ParseErrorCode_End; U64 cursor = 0; - + // read opcode DW_CFA_Opcode raw_opcode = 0; TryRead(str8_deserial_read_struct(data, cursor, &raw_opcode), cursor, exit); - + // decode opcode implicit operand U64 opcode = raw_opcode & ~DW_CFA_Mask_OpcodeHi; U64 implicit_operand = 0; @@ -3057,263 +3057,263 @@ dw_parse_cfa_inst(String8 data, opcode = raw_opcode & DW_CFA_Mask_OpcodeHi; implicit_operand = raw_opcode & DW_CFA_Mask_Operand; } - + // decode operands DW_CFA_Operand operands[DW_CFA_OperandMax] = {0}; switch (opcode) { - case DW_CFA_SetLoc: { - U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64); - if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += address_size; - } break; - case DW_CFA_AdvanceLoc: { - operands[0].u64 = implicit_operand * code_align_factor; - } break; - case DW_CFA_AdvanceLoc1: { - U8 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_AdvanceLoc2: { - U16 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_AdvanceLoc4: { - U32 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_DefCfa: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].u64 = offset; - } break; - case DW_CFA_DefCfaSf: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].s64 = offset * data_align_factor; - } break; - case DW_CFA_DefCfaRegister: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_DefCfaOffset: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = offset; - } break; - case DW_CFA_DefCfaOffsetSf: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = offset * data_align_factor; - } break; - case DW_CFA_DefCfaExpr: { - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - - operands[0].block = expr; - cursor += expr_size; - } break; - case DW_CFA_Undefined: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_SameValue: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_Offset: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = implicit_operand; - operands[1].s64 = (S64)offset * data_align_factor; - } break; - case DW_CFA_OffsetExt: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].u64 = offset * data_align_factor; - } break; - case DW_CFA_OffsetExtSf: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].s64 = offset * data_align_factor; - } break; - case DW_CFA_ValOffset: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += val_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = val; - operands[1].u64 = offset * data_align_factor; - } break; - case DW_CFA_ValOffsetSf: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += val_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = val; - operands[1].s64 = offset; - } break; - case DW_CFA_Register: { - U64 dst_reg = 0; - U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg); - if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += dst_reg_size; - - U64 src_reg = 0; - U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg); - if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += src_reg_size; - - operands[0].u64 = dst_reg; - operands[1].u64 = src_reg; - } break; - case DW_CFA_Expr: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - cursor += expr_size; - - operands[0].u64 = reg; - operands[1].block = expr; - } break; - case DW_CFA_ValExpr: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { goto exit; } - cursor += val_size; - - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - cursor += expr_size; - - operands[0].u64 = val; - operands[1].block = expr; - } break; - case DW_CFA_Restore: { - operands[0].u64 = implicit_operand; - } break; - case DW_CFA_RestoreExt: {} break; - case DW_CFA_RememberState: {} break; - case DW_CFA_RestoreState: {} break; - case DW_CFA_Nop: {} break; - default: { NotImplemented; goto exit; } break; + case DW_CFA_SetLoc: { + U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64); + if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += address_size; + } break; + case DW_CFA_AdvanceLoc: { + operands[0].u64 = implicit_operand * code_align_factor; + } break; + case DW_CFA_AdvanceLoc1: { + U8 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_AdvanceLoc2: { + U16 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_AdvanceLoc4: { + U32 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_DefCfa: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].u64 = offset; + } break; + case DW_CFA_DefCfaSf: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].s64 = offset * data_align_factor; + } break; + case DW_CFA_DefCfaRegister: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_DefCfaOffset: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = offset; + } break; + case DW_CFA_DefCfaOffsetSf: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = offset * data_align_factor; + } break; + case DW_CFA_DefCfaExpr: { + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + + operands[0].block = expr; + cursor += expr_size; + } break; + case DW_CFA_Undefined: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_SameValue: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_Offset: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = implicit_operand; + operands[1].s64 = (S64)offset * data_align_factor; + } break; + case DW_CFA_OffsetExt: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].u64 = offset * data_align_factor; + } break; + case DW_CFA_OffsetExtSf: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].s64 = offset * data_align_factor; + } break; + case DW_CFA_ValOffset: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += val_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = val; + operands[1].u64 = offset * data_align_factor; + } break; + case DW_CFA_ValOffsetSf: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += val_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = val; + operands[1].s64 = offset; + } break; + case DW_CFA_Register: { + U64 dst_reg = 0; + U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg); + if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += dst_reg_size; + + U64 src_reg = 0; + U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg); + if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += src_reg_size; + + operands[0].u64 = dst_reg; + operands[1].u64 = src_reg; + } break; + case DW_CFA_Expr: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + cursor += expr_size; + + operands[0].u64 = reg; + operands[1].block = expr; + } break; + case DW_CFA_ValExpr: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { goto exit; } + cursor += val_size; + + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + cursor += expr_size; + + operands[0].u64 = val; + operands[1].block = expr; + } break; + case DW_CFA_Restore: { + operands[0].u64 = implicit_operand; + } break; + case DW_CFA_RestoreExt: {} break; + case DW_CFA_RememberState: {} break; + case DW_CFA_RestoreState: {} break; + case DW_CFA_Nop: {} break; + default: { NotImplemented; goto exit; } break; } - + // fill out output inst_out->opcode = opcode; MemoryCopyTyped(&inst_out->operands[0], &operands[0], DW_CFA_OperandMax); - + *bytes_read_out = cursor; - + error_code = DW_CFA_ParseErrorCode_NewInst; - -exit:; + + exit:; return error_code; } internal DW_CFA_InstList dw_parse_cfa_inst_list(Arena *arena, - String8 data, - U64 code_align_factor, - S64 data_align_factor, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud) + String8 data, + U64 code_align_factor, + S64 data_align_factor, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud) { U64 pos = arena_pos(arena); DW_CFA_InstList list = {0}; diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index 25efb799..e83fd918 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -11,11 +11,11 @@ typedef struct DW_Section B32 is_dwo; } DW_Section; -typedef struct DW_Input +typedef struct DW_Raw { - DW_Section sec[DW_Section_Count]; - DW_Section sup[DW_Section_Count]; -} DW_Input; + DW_Section sec[DW_Section_COUNT]; + DW_Section sup[DW_Section_COUNT]; +} DW_Raw; typedef struct DW_ListUnit { @@ -307,12 +307,12 @@ typedef union DW_ExprOperand U16 u16; U32 u32; U64 u64; - + S8 s8; S16 s16; S32 s32; S64 s64; - + String8 block; } DW_ExprOperand; @@ -432,7 +432,7 @@ internal U64 dw_read_list_unit_header_addr (String8 unit_data, DW_ListUnit internal U64 dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out); internal U64 dw_read_list_unit_header_list (String8 unit_data, DW_ListUnit *lu_out); -internal DW_ListUnitInput dw_list_unit_input_from_input(Arena *arena, DW_Input *input); +internal DW_ListUnitInput dw_list_unit_input_from_input(Arena *arena, DW_Raw *input); internal U64 dw_offset_from_list_unit(DW_ListUnit *lu, U64 index); internal U64 dw_addr_from_list_unit (DW_ListUnit *lu, U64 index); @@ -448,8 +448,8 @@ internal U64 dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U6 // form and tag internal B32 dw_read_form (String8 data, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, S64 implicit_const, DW_Form *form_out, U64 *bytes_read_out); -internal U64 dw_read_tag (Arena *arena, DW_Input *input, DW_AbbrevTable abbrev_table, DW_Version version, DW_Format format, U64 address_size, Rng1U64 cu_info_range, U64 tag_info_off, DW_Tag *tag_out); -internal U64 dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); +internal U64 dw_read_tag (Arena *arena, DW_Raw *input, DW_AbbrevTable abbrev_table, DW_Version version, DW_Format format, U64 address_size, Rng1U64 cu_info_range, U64 tag_info_off, DW_Tag *tag_out); +internal U64 dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); // attrib interp @@ -462,58 +462,58 @@ internal S64 dw_interp_const_s64 (DW_Form form); internal S32 dw_interp_const_s32 (DW_Form form); internal B32 dw_interp_flag (DW_Form form); internal U64 dw_interp_address (U64 address_size, U64 base_addr, DW_ListUnit *addr_xlist, DW_Form form); -internal String8 dw_interp_block (DW_Input *input, DW_CompUnit *cu, DW_Form form); -internal String8 dw_interp_string (DW_Input *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_Form form); -internal String8 dw_interp_line_ptr (DW_Input *input, DW_Form form); +internal String8 dw_interp_block (DW_Raw *input, DW_CompUnit *cu, DW_Form form); +internal String8 dw_interp_string (DW_Raw *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_Form form); +internal String8 dw_interp_line_ptr (DW_Raw *input, DW_Form form); internal DW_LineFile * dw_interp_file (DW_LineVM *line_vm, DW_Form form); -internal DW_Reference dw_interp_ref (DW_Input *input, DW_CompUnit *cu, DW_Form form); -internal DW_LocList dw_interp_loclist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form); -internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Form form); +internal DW_Reference dw_interp_ref (DW_Raw *input, DW_CompUnit *cu, DW_Form form); +internal DW_LocList dw_interp_loclist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form); +internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form); -internal String8 dw_exprloc_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U128 dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U64 dw_const_u64_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U32 dw_const_u32_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal S64 dw_const_s64_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal S32 dw_const_s32_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal B32 dw_flag_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U64 dw_address_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_block_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_string_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_line_ptr_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_exprloc_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U128 dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U64 dw_const_u64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U32 dw_const_u32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal S64 dw_const_s64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal S32 dw_const_s32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal B32 dw_flag_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U64 dw_address_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_block_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_string_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_line_ptr_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); internal DW_LineFile * dw_file_from_attrib (DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib); -internal DW_Reference dw_ref_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW_Reference dw_ref_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_exprloc_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U128 dw_const_u128_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U64 dw_const_u64_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U32 dw_const_u32_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal B32 dw_flag_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U64 dw_address_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_block_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_string_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind); -internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_exprloc_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U128 dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U64 dw_const_u64_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U32 dw_const_u32_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal B32 dw_flag_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U64 dw_address_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_block_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_string_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind); +internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal B32 dw_is_attrib_var_ref(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal B32 dw_is_attrib_var_ref(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); // compile unit -internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed); -internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu); +internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed); +internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu); internal HashTable * dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree); internal DW_TagNode * dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off); // line VM -internal U64 dw_read_line_vm_header(Arena *arena, DW_Input *input, String8 cu_stmt_list, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); -internal DW_LineVM * dw_line_vm_init(DW_Input *input, DW_CompUnit *cu); +internal U64 dw_read_line_vm_header(Arena *arena, DW_Raw *input, String8 cu_stmt_list, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); +internal DW_LineVM * dw_line_vm_init(DW_Raw *input, DW_CompUnit *cu); internal void dw_line_vm_release(DW_LineVM *vm); internal void dw_line_vm_advance(DW_LineVM *vm, U64 advance); internal B32 dw_line_vm_step(DW_LineVM *vm); @@ -522,7 +522,7 @@ internal String8 dw_path_from_file(Arena *arena, String8Array dir_table, D // helper for .debug_pubtypes and .debug_pubnames -internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind); +internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind); // expression diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 6da9c57a..9148e40f 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -775,6 +775,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of case DW_LNCT_TimeStamp: { entry_out->modify_time = form_val.u128.u64[0]; + entry_out->flags |= DW2_LineTableFileFlag_HasModifyTime; }break; case DW_LNCT_Size: { @@ -783,6 +784,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of case DW_LNCT_MD5: { entry_out->md5.u128 = form_val.u128; + entry_out->flags |= DW2_LineTableFileFlag_HasMD5; }break; case DW_LNCT_LLVM_Source: { diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index cf69a1fc..8ee995b8 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -100,10 +100,18 @@ struct DW2_Tag //////////////////////////////// //~ rjf: Line Info +typedef U32 DW2_LineTableFileFlags; +enum +{ + DW2_LineTableFileFlag_HasMD5 = (1<<0), + DW2_LineTableFileFlag_HasModifyTime = (1<<1), +}; + typedef struct DW2_LineTableFile DW2_LineTableFile; struct DW2_LineTableFile { String8 file_name; + DW2_LineTableFileFlags flags; U64 dir_idx; U64 modify_time; U64 file_size; @@ -154,6 +162,23 @@ struct DW2_LineTableHeader DW2_LineTableFileArray files; }; +typedef struct DW2_LineVMRegs DW2_LineVMRegs; +struct DW2_LineVMRegs +{ + U64 address; + U64 vliw_op_index; + U64 file_index; + U64 line; + U64 column; + B32 is_stmt; + B32 basic_block; + B32 end_sequence; + B32 prologue_end; + B32 epilogue_begin; + U64 isa; + U64 discriminator; +}; + //////////////////////////////// //~ rjf: Globals diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index b7de4503..1cb92f71 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -24,12 +24,12 @@ dw_size_from_sint(S64 v) { DW_IntEnc enc = dw_int_enc_from_sint(v); switch (enc) { - case DW_IntEnc_Null: break; - case DW_IntEnc_1Byte: return 1; - case DW_IntEnc_2Byte: return 2; - case DW_IntEnc_4Byte: return 4; - case DW_IntEnc_LEB128: return dw_size_from_sleb128(v); - default: InvalidPath; break; + case DW_IntEnc_Null: break; + case DW_IntEnc_1Byte: return 1; + case DW_IntEnc_2Byte: return 2; + case DW_IntEnc_4Byte: return 4; + case DW_IntEnc_LEB128: return dw_size_from_sleb128(v); + default: InvalidPath; break; } return 0; } @@ -39,12 +39,12 @@ dw_size_from_uint(U64 v) { DW_IntEnc enc = dw_int_enc_from_uint(v); switch (enc) { - case DW_IntEnc_Null: break; - case DW_IntEnc_1Byte: return 1; - case DW_IntEnc_2Byte: return 2; - case DW_IntEnc_4Byte: return 4; - case DW_IntEnc_LEB128: return dw_size_from_uleb128(v); - default: InvalidPath; break; + case DW_IntEnc_Null: break; + case DW_IntEnc_1Byte: return 1; + case DW_IntEnc_2Byte: return 2; + case DW_IntEnc_4Byte: return 4; + case DW_IntEnc_LEB128: return dw_size_from_uleb128(v); + default: InvalidPath; break; } return 0; } @@ -69,12 +69,12 @@ dw_writer_attrib_chunk_list_push(Arena *arena, DW_WriterAttribChunkList *list, U SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } - + DW_WriterAttrib *result = &list->last->v[list->last->count++]; MemoryZeroStruct(result); - + list->total_count += 1; - + return result; } @@ -88,12 +88,12 @@ dw_writer_tag_chunk_list_push(Arena *arena, DW_WriterTagChunkList *list, U64 cap SLLQueuePush(list->first, list->last, n); list->chunk_count += 1; } - + DW_WriterTag *result = &list->last->v[list->last->count++]; MemoryZeroStruct(result); - + list->total_count += 1; - + return result; } @@ -121,33 +121,33 @@ dw_writer_begin(DW_Format format, DW_Version version, DW_CompUnitKind cu_kind, A for EachElement(i, writer->sections) { str8_serial_begin(arena, &writer->sections[i].srl); } - + // write info header { String8List *srl = &writer->sections[DW_Section_Info].srl; - + // length writer->sections[DW_Section_Info].length = dw_serial_push_length(writer->arena, srl, writer->format, 0); - + // version str8_serial_push_struct(writer->arena, srl, &writer->version); - + // compile unit kind str8_serial_push_struct(writer->arena, srl, &writer->cu_kind); - + // address size str8_serial_push_u8(writer->arena, srl, (U8)writer->address_size); // reserve 'abbrev_base' writer->abbrev_base_info_off = srl->total_size; dw_serial_push_uint(writer->arena, srl, writer->format, 0); - + if (writer->cu_kind == DW_CompUnitKind_Skeleton) { // TODO: write skeleton id NotImplemented; } } - + return writer; } @@ -163,132 +163,132 @@ dw_serial_push_form(Arena *arena, String8List *srl, DW_Version version, DW_Forma { U64 start_off = srl->total_size; switch (form.reader.kind) { - case DW_Form_Addr: { - str8_serial_push_string(arena, srl, form.reader.addr); - } break; - case DW_Form_Block1: - case DW_Form_Block2: - case DW_Form_Block4: { - str8_serial_push_string(arena, srl, form.reader.block); - } break; - case DW_Form_Data1: - case DW_Form_Data2: - case DW_Form_Data4: - case DW_Form_Data8: { - str8_serial_push_string(arena, srl, form.reader.data); - } break; - case DW_Form_String: { - str8_serial_push_cstr(arena, srl, form.reader.string); - } break; - case DW_Form_Block: { - dw_serial_push_uleb128(arena, srl, form.reader.block.size); - str8_serial_push_string(arena, srl, form.reader.block); - } break; - case DW_Form_Flag: { - str8_serial_push_u8(arena, srl, form.reader.flag); - } break; - case DW_Form_SData: { - dw_serial_push_sleb128(arena, srl, form.reader.sdata); - } break; - case DW_Form_Strp: { - dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); - } break; - case DW_Form_UData: { - dw_serial_push_uleb128(arena, srl, form.reader.udata); - } break; - case DW_Form_RefAddr: { - if (version < DW_Version_3) { - Assert(address_size <= sizeof(form.reader.ref)); - str8_serial_push_string(arena, srl, str8((U8 *)&form.reader.ref, address_size)); - } else { + case DW_Form_Addr: { + str8_serial_push_string(arena, srl, form.reader.addr); + } break; + case DW_Form_Block1: + case DW_Form_Block2: + case DW_Form_Block4: { + str8_serial_push_string(arena, srl, form.reader.block); + } break; + case DW_Form_Data1: + case DW_Form_Data2: + case DW_Form_Data4: + case DW_Form_Data8: { + str8_serial_push_string(arena, srl, form.reader.data); + } break; + case DW_Form_String: { + str8_serial_push_cstr(arena, srl, form.reader.string); + } break; + case DW_Form_Block: { + dw_serial_push_uleb128(arena, srl, form.reader.block.size); + str8_serial_push_string(arena, srl, form.reader.block); + } break; + case DW_Form_Flag: { + str8_serial_push_u8(arena, srl, form.reader.flag); + } break; + case DW_Form_SData: { + dw_serial_push_sleb128(arena, srl, form.reader.sdata); + } break; + case DW_Form_Strp: { + dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); + } break; + case DW_Form_UData: { + dw_serial_push_uleb128(arena, srl, form.reader.udata); + } break; + case DW_Form_RefAddr: { + if (version < DW_Version_3) { + Assert(address_size <= sizeof(form.reader.ref)); + str8_serial_push_string(arena, srl, str8((U8 *)&form.reader.ref, address_size)); + } else { + dw_serial_push_uint(arena, srl, format, form.reader.ref); + } + } break; + case DW_Form_Ref1: { + str8_serial_push_u8(arena, srl, (U8)form.reader.ref); + } break; + case DW_Form_Ref2: { + str8_serial_push_u16(arena, srl, (U16)form.reader.ref); + } break; + case DW_Form_Ref4: { + str8_serial_push_u32(arena, srl, (U32)form.reader.ref); + } break; + case DW_Form_Ref8: { + if (form.writer.ref->info_off == 0) { + // reserve 8 bytes + void *value = str8_serial_push_u64(arena, srl, 0); + + // push fixup + dw_writer_fixup_list_push(arena, fixups, (DW_WriterFixup){ .ptr = value, .tag = form.writer.ref }); + } + } break; + case DW_Form_RefUData: { + dw_serial_push_uleb128(arena, srl, form.reader.ref); + } break; + case DW_Form_Indirect: { + NotImplemented; + } break; + case DW_Form_SecOffset: { + dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); + } break; + case DW_Form_ExprLoc: { + dw_serial_push_uleb128(arena, srl, form.reader.exprloc.size); + str8_serial_push_string(arena, srl, form.reader.exprloc); + } break; + case DW_Form_FlagPresent: { + } break; + case DW_Form_RefSig8: { + NotImplemented; + } break; + case DW_Form_Strx: + case DW_Form_Addrx: + case DW_Form_RngListx: + case DW_Form_LocListx: { + dw_serial_push_uleb128(arena, srl, form.reader.xval); + } break; + case DW_Form_RefSup4: { + NotImplemented; + } break; + case DW_Form_StrpSup: { + dw_serial_push_uint(arena, srl, format, form.reader.strp_sup); + } break; + case DW_Form_Data16: { + str8_serial_push_string(arena, srl, form.reader.data); + } break; + case DW_Form_LineStrp: { + dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); + } break; + case DW_Form_ImplicitConst: { + // value is stored in the abbrev entry + } break; + case DW_Form_RefSup8: { + NotImplemented; + } break; + case DW_Form_Strx1: + case DW_Form_Addrx1: { + str8_serial_push_u8(arena, srl, (U8)form.reader.xval); + } break; + case DW_Form_Strx2: + case DW_Form_Addrx2: { + str8_serial_push_u16(arena, srl, (U16)form.reader.xval); + } break; + case DW_Form_Strx3: + case DW_Form_Addrx3: { + str8_serial_push_string(arena, srl, str8((U8 *)&form.reader.xval, 3)); + } break; + case DW_Form_Strx4: + case DW_Form_Addrx4: { + str8_serial_push_u32(arena, srl, (U32)form.reader.xval); + } break; + + case DW_Form_GNU_StrpAlt: { + dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); + } break; + case DW_Form_GNU_RefAlt: { dw_serial_push_uint(arena, srl, format, form.reader.ref); - } - } break; - case DW_Form_Ref1: { - str8_serial_push_u8(arena, srl, (U8)form.reader.ref); - } break; - case DW_Form_Ref2: { - str8_serial_push_u16(arena, srl, (U16)form.reader.ref); - } break; - case DW_Form_Ref4: { - str8_serial_push_u32(arena, srl, (U32)form.reader.ref); - } break; - case DW_Form_Ref8: { - if (form.writer.ref->info_off == 0) { - // reserve 8 bytes - void *value = str8_serial_push_u64(arena, srl, 0); - - // push fixup - dw_writer_fixup_list_push(arena, fixups, (DW_WriterFixup){ .ptr = value, .tag = form.writer.ref }); - } - } break; - case DW_Form_RefUData: { - dw_serial_push_uleb128(arena, srl, form.reader.ref); - } break; - case DW_Form_Indirect: { - NotImplemented; - } break; - case DW_Form_SecOffset: { - dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); - } break; - case DW_Form_ExprLoc: { - dw_serial_push_uleb128(arena, srl, form.reader.exprloc.size); - str8_serial_push_string(arena, srl, form.reader.exprloc); - } break; - case DW_Form_FlagPresent: { - } break; - case DW_Form_RefSig8: { - NotImplemented; - } break; - case DW_Form_Strx: - case DW_Form_Addrx: - case DW_Form_RngListx: - case DW_Form_LocListx: { - dw_serial_push_uleb128(arena, srl, form.reader.xval); - } break; - case DW_Form_RefSup4: { - NotImplemented; - } break; - case DW_Form_StrpSup: { - dw_serial_push_uint(arena, srl, format, form.reader.strp_sup); - } break; - case DW_Form_Data16: { - str8_serial_push_string(arena, srl, form.reader.data); - } break; - case DW_Form_LineStrp: { - dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); - } break; - case DW_Form_ImplicitConst: { - // value is stored in the abbrev entry - } break; - case DW_Form_RefSup8: { - NotImplemented; - } break; - case DW_Form_Strx1: - case DW_Form_Addrx1: { - str8_serial_push_u8(arena, srl, (U8)form.reader.xval); - } break; - case DW_Form_Strx2: - case DW_Form_Addrx2: { - str8_serial_push_u16(arena, srl, (U16)form.reader.xval); - } break; - case DW_Form_Strx3: - case DW_Form_Addrx3: { - str8_serial_push_string(arena, srl, str8((U8 *)&form.reader.xval, 3)); - } break; - case DW_Form_Strx4: - case DW_Form_Addrx4: { - str8_serial_push_u32(arena, srl, (U32)form.reader.xval); - } break; - - case DW_Form_GNU_StrpAlt: { - dw_serial_push_uint(arena, srl, format, form.reader.sec_offset); - } break; - case DW_Form_GNU_RefAlt: { - dw_serial_push_uint(arena, srl, format, form.reader.ref); - } break; - - default: InvalidPath; break; + } break; + + default: InvalidPath; break; } return srl->total_size - start_off; } @@ -297,15 +297,15 @@ internal String8 dw_make_abbrev_entry(Arena *arena, DW_WriterTag *tag) { Temp scratch = scratch_begin(&arena, 1); - + String8List srl = {0}; str8_serial_begin(scratch.arena, &srl); - + // tag abbrev B8 has_children = tag->first_child != 0; dw_serial_push_uleb128(scratch.arena, &srl, tag->kind); str8_serial_push_string(scratch.arena, &srl, str8_struct(&has_children)); - + // attrib abbrev for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { dw_serial_push_uleb128(scratch.arena, &srl, attrib->kind); @@ -314,13 +314,13 @@ dw_make_abbrev_entry(Arena *arena, DW_WriterTag *tag) dw_serial_push_sleb128(scratch.arena, &srl, attrib->form.reader.implicit_const); } } - + // closing entry dw_serial_push_uleb128(scratch.arena, &srl, 0); dw_serial_push_uleb128(scratch.arena, &srl, 0); - + String8 tag_abbrev = str8_serial_end(arena, &srl); - + scratch_end(scratch); return tag_abbrev; } @@ -352,7 +352,7 @@ internal void dw_writer_tag_begin_reserved(DW_Writer *writer, DW_WriterTag *tag) { tag->parent = writer->current; - + // add tag to the tree if (writer->current) { SLLQueuePush(writer->current->first_child, writer->current->last_child, tag); @@ -371,31 +371,31 @@ dw_writer_push_attrib(DW_Writer *writer, DW_AttribKind kind, DW_WriterForm form) for (DW_AttribClass f = attrib_class; f != 0; f &= f - 1) { DW_AttribClass v = f & -f; switch (v) { - case DW_AttribClass_Null: { is_enc_legal = (form.kind == DW_WriterFormKind_Null); } break; - case DW_AttribClass_Undefined: { is_enc_legal = 0; } break; - case DW_AttribClass_Address: { is_enc_legal = (form.kind == DW_WriterFormKind_Address); } break; - case DW_AttribClass_Block: { is_enc_legal = (form.kind == DW_WriterFormKind_Block); } break; - case DW_AttribClass_Const: { is_enc_legal = (form.kind == DW_WriterFormKind_SInt || - form.kind == DW_WriterFormKind_UInt || - form.kind == DW_WriterFormKind_Implicit); } break; - case DW_AttribClass_ExprLoc: { is_enc_legal = (form.kind == DW_WriterFormKind_ExprLoc); } break; - case DW_AttribClass_Flag: { is_enc_legal = (form.kind == DW_WriterFormKind_Flag); } break; - case DW_AttribClass_LinePtr: { is_enc_legal = (form.kind == DW_WriterFormKind_LinePtr); } break; - case DW_AttribClass_LocListPtr: { is_enc_legal = 0; /* TODO */ } break; - case DW_AttribClass_MacPtr: { is_enc_legal = (form.kind == DW_WriterFormKind_MacPtr); } break; - case DW_AttribClass_RngListPtr: { is_enc_legal = (form.kind == DW_WriterFormKind_RngListPtr); } break; - case DW_AttribClass_Reference: { is_enc_legal = (form.kind == DW_WriterFormKind_Ref); } break; - case DW_AttribClass_String: { is_enc_legal = (form.kind == DW_WriterFormKind_String); } break; - case DW_AttribClass_LocList: { is_enc_legal = 0; /* TODO */ } break; - case DW_AttribClass_RngList: { is_enc_legal = 0; /* TODO */ } break; - case DW_AttribClass_StrOffsetsPtr: { is_enc_legal = 0; /* TODO */ } break; - case DW_AttribClass_AddrPtr: { is_enc_legal = 0; /* TODO */ } break; - default: { InvalidPath; } break; + case DW_AttribClass_Null: { is_enc_legal = (form.kind == DW_WriterFormKind_Null); } break; + case DW_AttribClass_Undefined: { is_enc_legal = 0; } break; + case DW_AttribClass_Address: { is_enc_legal = (form.kind == DW_WriterFormKind_Address); } break; + case DW_AttribClass_Block: { is_enc_legal = (form.kind == DW_WriterFormKind_Block); } break; + case DW_AttribClass_Const: { is_enc_legal = (form.kind == DW_WriterFormKind_SInt || + form.kind == DW_WriterFormKind_UInt || + form.kind == DW_WriterFormKind_Implicit); } break; + case DW_AttribClass_ExprLoc: { is_enc_legal = (form.kind == DW_WriterFormKind_ExprLoc); } break; + case DW_AttribClass_Flag: { is_enc_legal = (form.kind == DW_WriterFormKind_Flag); } break; + case DW_AttribClass_LinePtr: { is_enc_legal = (form.kind == DW_WriterFormKind_LinePtr); } break; + case DW_AttribClass_LocListPtr: { is_enc_legal = 0; /* TODO */ } break; + case DW_AttribClass_MacPtr: { is_enc_legal = (form.kind == DW_WriterFormKind_MacPtr); } break; + case DW_AttribClass_RngListPtr: { is_enc_legal = (form.kind == DW_WriterFormKind_RngListPtr); } break; + case DW_AttribClass_Reference: { is_enc_legal = (form.kind == DW_WriterFormKind_Ref); } break; + case DW_AttribClass_String: { is_enc_legal = (form.kind == DW_WriterFormKind_String); } break; + case DW_AttribClass_LocList: { is_enc_legal = 0; /* TODO */ } break; + case DW_AttribClass_RngList: { is_enc_legal = 0; /* TODO */ } break; + case DW_AttribClass_StrOffsetsPtr: { is_enc_legal = 0; /* TODO */ } break; + case DW_AttribClass_AddrPtr: { is_enc_legal = 0; /* TODO */ } break; + default: { InvalidPath; } break; } if (is_enc_legal) { break; } } Assert(is_enc_legal); - + DW_WriterAttrib *attrib = dw_writer_attrib_chunk_list_push(writer->arena, &writer->attrib_chunk_list, 512); attrib->kind = kind; attrib->form.writer = form; @@ -527,76 +527,76 @@ dw_data_from_line_insts(Arena *arena, U8 address_size, DW_LineInstList insts) Temp scratch = scratch_begin(&arena, 1); String8List srl = {0}; str8_serial_begin(scratch.arena, &srl); - + for EachNode(inst_n, DW_LineInstNode, insts.first) { DW_LineInst *inst = &inst_n->v; - + str8_serial_push_struct(scratch.arena, &srl, &inst->opcode); switch (inst->opcode) { - case DW_StdOpcode_Copy: {} break; - case DW_StdOpcode_AdvancePc: { - dw_serial_push_uleb128(arena, &srl, inst->advance_pc); - } break; - case DW_StdOpcode_AdvanceLine: { - dw_serial_push_sleb128(arena, &srl, inst->advance_line); - } break; - case DW_StdOpcode_SetFile: { - dw_serial_push_uleb128(arena, &srl, inst->set_file->file_idx); - } break; - case DW_StdOpcode_SetColumn: { - dw_serial_push_uleb128(arena, &srl, inst->set_column); - } break; - case DW_StdOpcode_NegateStmt: {} break; - case DW_StdOpcode_SetBasicBlock: {} break; - case DW_StdOpcode_ConstAddPc: {} break; - case DW_StdOpcode_FixedAdvancePc: { - str8_serial_push_u16(arena, &srl, inst->fixed_advance_pc); - } break; - case DW_StdOpcode_SetPrologueEnd: {} break; - case DW_StdOpcode_SetEpilogueBegin: {} break; - case DW_StdOpcode_SetIsa: { - dw_serial_push_uleb128(arena, &srl, inst->set_isa); - } break; - case DW_StdOpcode_ExtendedOpcode: { - // get ext size - U64 ext_size = 0; - switch (inst->ext) { - case DW_ExtOpcode_EndSequence: { ext_size = 0; } break; - case DW_ExtOpcode_SetAddress: { ext_size = address_size; } break; - case DW_ExtOpcode_DefineFile: { - NotImplemented; + case DW_StdOpcode_Copy: {} break; + case DW_StdOpcode_AdvancePc: { + dw_serial_push_uleb128(arena, &srl, inst->advance_pc); } break; - case DW_ExtOpcode_SetDiscriminator: { - ext_size = dw_size_from_uleb128(inst->set_discriminator); + case DW_StdOpcode_AdvanceLine: { + dw_serial_push_sleb128(arena, &srl, inst->advance_line); } break; - default: { InvalidPath; } break; - } - ext_size += sizeof(DW_ExtOpcode); - - // write ext header - dw_serial_push_uleb128(arena, &srl, ext_size); - str8_serial_push_struct(arena, &srl, &inst->ext); - - // write ext operands - switch (inst->ext) { - case DW_ExtOpcode_EndSequence: {} break; - case DW_ExtOpcode_SetAddress: { - str8_serial_push_string(arena, &srl, str8_copy(arena, str8((U8 *)&inst->set_address, address_size))); + case DW_StdOpcode_SetFile: { + dw_serial_push_uleb128(arena, &srl, inst->set_file->file_idx); } break; - case DW_ExtOpcode_DefineFile: { - NotImplemented; + case DW_StdOpcode_SetColumn: { + dw_serial_push_uleb128(arena, &srl, inst->set_column); } break; - case DW_ExtOpcode_SetDiscriminator: { - dw_serial_push_uleb128(arena, &srl, inst->set_discriminator); + case DW_StdOpcode_NegateStmt: {} break; + case DW_StdOpcode_SetBasicBlock: {} break; + case DW_StdOpcode_ConstAddPc: {} break; + case DW_StdOpcode_FixedAdvancePc: { + str8_serial_push_u16(arena, &srl, inst->fixed_advance_pc); } break; - default: { InvalidPath; } break; - } - } break; - // special opcode - default: { } break; + case DW_StdOpcode_SetPrologueEnd: {} break; + case DW_StdOpcode_SetEpilogueBegin: {} break; + case DW_StdOpcode_SetIsa: { + dw_serial_push_uleb128(arena, &srl, inst->set_isa); + } break; + case DW_StdOpcode_ExtendedOpcode: { + // get ext size + U64 ext_size = 0; + switch (inst->ext) { + case DW_ExtOpcode_EndSequence: { ext_size = 0; } break; + case DW_ExtOpcode_SetAddress: { ext_size = address_size; } break; + case DW_ExtOpcode_DefineFile: { + NotImplemented; + } break; + case DW_ExtOpcode_SetDiscriminator: { + ext_size = dw_size_from_uleb128(inst->set_discriminator); + } break; + default: { InvalidPath; } break; + } + ext_size += sizeof(DW_ExtOpcode); + + // write ext header + dw_serial_push_uleb128(arena, &srl, ext_size); + str8_serial_push_struct(arena, &srl, &inst->ext); + + // write ext operands + switch (inst->ext) { + case DW_ExtOpcode_EndSequence: {} break; + case DW_ExtOpcode_SetAddress: { + str8_serial_push_string(arena, &srl, str8_copy(arena, str8((U8 *)&inst->set_address, address_size))); + } break; + case DW_ExtOpcode_DefineFile: { + NotImplemented; + } break; + case DW_ExtOpcode_SetDiscriminator: { + dw_serial_push_uleb128(arena, &srl, inst->set_discriminator); + } break; + default: { InvalidPath; } break; + } + } break; + // special opcode + default: { } break; } } - + String8 data = str8_serial_end(arena, &srl); scratch_end(scratch); return data; @@ -608,14 +608,14 @@ dw_writer_line_emit(DW_Writer *writer, DW_WriterFile *file, U64 ln, U64 col, U64 if (writer->line.file != file) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_file(file)); } - + S64 col_delta = (S64)col - (S64)writer->line.col; if (col_delta != 0) { dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_set_column(col_delta)); } - + Assert(addr <= max_S64); S64 addr_delta = (S64)addr - (S64)writer->line.addr; S64 ln_delta = (S64)ln - (S64)writer->line.ln; - + S64 max_ln_delta = writer->line.line_range + writer->line.line_base; S64 max_addr_delta = (max_U8 - writer->line.opcode_base - (ln_delta - writer->line.line_base)) / writer->line.line_range; if ((ln_delta != 0 || addr_delta != 0) && @@ -630,7 +630,7 @@ dw_writer_line_emit(DW_Writer *writer, DW_WriterFile *file, U64 ln, U64 col, U64 dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNS_copy()); } } - + // update registers writer->line.file = file; writer->line.ln = ln; @@ -683,7 +683,7 @@ dw_writer_new_file(DW_Writer *writer, String8 path) { DW_WriterFile *file = push_array(writer->arena, DW_WriterFile, 1); file->path = path; - + SLLQueuePush(writer->line.first_file, writer->line.last_file, file); writer->line.file_count += 1; return file; @@ -694,104 +694,104 @@ dw_lower_attrib_forms(DW_Writer *writer, DW_WriterTag *tag) { for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { switch (attrib->form.writer.kind) { - case DW_WriterFormKind_Null: {} break; - case DW_WriterFormKind_Flag: { - attrib->form.reader.kind = DW_Form_Flag; - attrib->form.reader.flag = attrib->form.writer.flag; - } break; - case DW_WriterFormKind_SInt: { - switch (dw_int_enc_from_sint(attrib->form.writer.sint)) { - case DW_IntEnc_Null: attrib->form.reader.kind = 0; break; - case DW_IntEnc_1Byte: { - attrib->form.reader.kind = DW_Form_Data1; - attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(S8)); + case DW_WriterFormKind_Null: {} break; + case DW_WriterFormKind_Flag: { + attrib->form.reader.kind = DW_Form_Flag; + attrib->form.reader.flag = attrib->form.writer.flag; } break; - case DW_IntEnc_2Byte: { - attrib->form.reader.kind = DW_Form_Data2; - attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(S16)); - } break; - case DW_IntEnc_4Byte: { - attrib->form.reader.kind = DW_Form_Data4; - attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(U32)); - } break; - case DW_IntEnc_LEB128: { - attrib->form.reader.kind = DW_Form_SData; - attrib->form.reader.sdata = attrib->form.writer.sint; - } break; - default: InvalidPath; break; - } - } break; - case DW_WriterFormKind_UInt: { - attrib->form.reader.kind = DW_Form_UData; - attrib->form.reader.udata = attrib->form.writer.uint; - } break; - case DW_WriterFormKind_Address: { - Assert(writer->address_size <= sizeof(attrib->form.writer.address)); - attrib->form.reader.kind = DW_Form_Addr; - attrib->form.reader.addr = push_str8_copy(writer->arena, str8((U8 *)&attrib->form.writer.address, writer->address_size)); - } break; - case DW_WriterFormKind_Ref: { - if (attrib->form.writer.ref->info_off == 0) { - attrib->form.reader.kind = DW_Form_Ref8; - } else { - switch (dw_int_enc_from_uint(attrib->form.writer.ref->info_off)) { - case DW_IntEnc_Null: break; - case DW_IntEnc_1Byte: { - attrib->form.reader.kind = DW_Form_Ref1; - attrib->form.reader.ref = (U8)attrib->form.writer.ref->info_off; - } break; - case DW_IntEnc_2Byte: { - attrib->form.reader.kind = DW_Form_Ref2; - attrib->form.reader.ref = (U16)attrib->form.writer.ref->info_off; - } break; - case DW_IntEnc_4Byte: { - attrib->form.reader.kind = DW_Form_Ref4; - attrib->form.reader.ref = (U32)attrib->form.writer.ref->info_off; - } break; - case DW_IntEnc_LEB128: { - attrib->form.reader.kind = DW_Form_RefUData; - attrib->form.reader.ref = attrib->form.writer.ref->info_off; - } break; - default: InvalidPath; break; + case DW_WriterFormKind_SInt: { + switch (dw_int_enc_from_sint(attrib->form.writer.sint)) { + case DW_IntEnc_Null: attrib->form.reader.kind = 0; break; + case DW_IntEnc_1Byte: { + attrib->form.reader.kind = DW_Form_Data1; + attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(S8)); + } break; + case DW_IntEnc_2Byte: { + attrib->form.reader.kind = DW_Form_Data2; + attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(S16)); + } break; + case DW_IntEnc_4Byte: { + attrib->form.reader.kind = DW_Form_Data4; + attrib->form.reader.data = str8((U8 *)&attrib->form.writer.sint, sizeof(U32)); + } break; + case DW_IntEnc_LEB128: { + attrib->form.reader.kind = DW_Form_SData; + attrib->form.reader.sdata = attrib->form.writer.sint; + } break; + default: InvalidPath; break; } - } - } break; - case DW_WriterFormKind_LinePtr: { - attrib->form.reader.kind = DW_Form_SecOffset; - attrib->form.reader.sec_offset = attrib->form.writer.line_ptr; - } break; - case DW_WriterFormKind_MacPtr: { - NotImplemented; - } break; - case DW_WriterFormKind_RngListPtr: { - NotImplemented; - } break; - case DW_WriterFormKind_Data: { - NotImplemented; - } break; - case DW_WriterFormKind_Block: { - attrib->form.reader.block = attrib->form.writer.block; - switch (attrib->form.writer.block.size) { - case 0 : break; - case 1 : attrib->form.reader.kind = DW_Form_Block1; break; - case 2 : attrib->form.reader.kind = DW_Form_Block2; break; - case 4 : attrib->form.reader.kind = DW_Form_Block4; break; - default: attrib->form.reader.kind = DW_Form_Block; break; - } - } break; - case DW_WriterFormKind_String: { - attrib->form.reader.kind = DW_Form_String; - attrib->form.reader.string = attrib->form.writer.string; - } break; - case DW_WriterFormKind_ExprLoc: { - attrib->form.reader.kind = DW_Form_ExprLoc; - attrib->form.reader.exprloc = attrib->form.writer.exprloc; - } break; - case DW_WriterFormKind_Implicit: { - attrib->form.reader.kind = DW_Form_ImplicitConst; - attrib->form.reader.implicit_const = attrib->form.writer.implicit; - } break; - default: { InvalidPath; } break; + } break; + case DW_WriterFormKind_UInt: { + attrib->form.reader.kind = DW_Form_UData; + attrib->form.reader.udata = attrib->form.writer.uint; + } break; + case DW_WriterFormKind_Address: { + Assert(writer->address_size <= sizeof(attrib->form.writer.address)); + attrib->form.reader.kind = DW_Form_Addr; + attrib->form.reader.addr = push_str8_copy(writer->arena, str8((U8 *)&attrib->form.writer.address, writer->address_size)); + } break; + case DW_WriterFormKind_Ref: { + if (attrib->form.writer.ref->info_off == 0) { + attrib->form.reader.kind = DW_Form_Ref8; + } else { + switch (dw_int_enc_from_uint(attrib->form.writer.ref->info_off)) { + case DW_IntEnc_Null: break; + case DW_IntEnc_1Byte: { + attrib->form.reader.kind = DW_Form_Ref1; + attrib->form.reader.ref = (U8)attrib->form.writer.ref->info_off; + } break; + case DW_IntEnc_2Byte: { + attrib->form.reader.kind = DW_Form_Ref2; + attrib->form.reader.ref = (U16)attrib->form.writer.ref->info_off; + } break; + case DW_IntEnc_4Byte: { + attrib->form.reader.kind = DW_Form_Ref4; + attrib->form.reader.ref = (U32)attrib->form.writer.ref->info_off; + } break; + case DW_IntEnc_LEB128: { + attrib->form.reader.kind = DW_Form_RefUData; + attrib->form.reader.ref = attrib->form.writer.ref->info_off; + } break; + default: InvalidPath; break; + } + } + } break; + case DW_WriterFormKind_LinePtr: { + attrib->form.reader.kind = DW_Form_SecOffset; + attrib->form.reader.sec_offset = attrib->form.writer.line_ptr; + } break; + case DW_WriterFormKind_MacPtr: { + NotImplemented; + } break; + case DW_WriterFormKind_RngListPtr: { + NotImplemented; + } break; + case DW_WriterFormKind_Data: { + NotImplemented; + } break; + case DW_WriterFormKind_Block: { + attrib->form.reader.block = attrib->form.writer.block; + switch (attrib->form.writer.block.size) { + case 0 : break; + case 1 : attrib->form.reader.kind = DW_Form_Block1; break; + case 2 : attrib->form.reader.kind = DW_Form_Block2; break; + case 4 : attrib->form.reader.kind = DW_Form_Block4; break; + default: attrib->form.reader.kind = DW_Form_Block; break; + } + } break; + case DW_WriterFormKind_String: { + attrib->form.reader.kind = DW_Form_String; + attrib->form.reader.string = attrib->form.writer.string; + } break; + case DW_WriterFormKind_ExprLoc: { + attrib->form.reader.kind = DW_Form_ExprLoc; + attrib->form.reader.exprloc = attrib->form.writer.exprloc; + } break; + case DW_WriterFormKind_Implicit: { + attrib->form.reader.kind = DW_Form_ImplicitConst; + attrib->form.reader.implicit_const = attrib->form.writer.implicit; + } break; + default: { InvalidPath; } break; } } } @@ -800,20 +800,20 @@ internal void dw_writer_emit_tag(DW_Writer *writer, DW_WriterTag *tag) { Assert(tag->info_off == 0); - + dw_lower_attrib_forms(writer, tag); - + // make abbrev id for the tag U64 abbrev_id; { Temp temp = temp_begin(writer->arena); String8 abbrev_entry = dw_make_abbrev_entry(temp.arena, tag); - + if ( ! hash_table_search_string_u64(writer->abbrev_id_map, abbrev_entry, &abbrev_id)) { abbrev_id = writer->abbrev_id_map->count + 1; - + hash_table_push_string_u64(writer->arena, writer->abbrev_id_map, abbrev_entry, abbrev_id); - + // push abbrev entry dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Abbrev].srl, abbrev_id); str8_serial_push_string(writer->arena, &writer->sections[DW_Section_Abbrev].srl, abbrev_entry); @@ -821,149 +821,149 @@ dw_writer_emit_tag(DW_Writer *writer, DW_WriterTag *tag) temp_end(temp); } } - + tag->abbrev_id = abbrev_id; tag->info_off = writer->sections[DW_Section_Info].srl.total_size; - + // emit tag abbrev id dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Info].srl, tag->abbrev_id); - + // emit attribs { String8List *debug_info = &writer->sections[DW_Section_Info].srl; for EachNode(attrib, DW_WriterAttrib, tag->first_attrib) { switch (attrib->form.reader.kind) { - case DW_Form_Addr: { - str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.addr); - } break; - case DW_Form_Block1: - case DW_Form_Block2: - case DW_Form_Block4: { - str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.block); - } break; - case DW_Form_Data1: - case DW_Form_Data2: - case DW_Form_Data4: - case DW_Form_Data8: { - str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.data); - } break; - case DW_Form_String: { - str8_serial_push_cstr(writer->arena, debug_info, attrib->form.reader.string); - } break; - case DW_Form_Flag: { - str8_serial_push_u8(writer->arena, debug_info, attrib->form.reader.flag); - } break; - case DW_Form_SData: { - dw_serial_push_sleb128(writer->arena, debug_info, attrib->form.reader.sdata); - } break; - case DW_Form_Strp: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); - } break; - case DW_Form_UData: { - dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.udata); - } break; - case DW_Form_RefAddr: { - if (writer->version < DW_Version_3) { - Assert(writer->address_size <= sizeof(attrib->form.reader.ref)); - str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->form.reader.ref, writer->address_size)); - } else { + case DW_Form_Addr: { + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.addr); + } break; + case DW_Form_Block1: + case DW_Form_Block2: + case DW_Form_Block4: { + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.block); + } break; + case DW_Form_Data1: + case DW_Form_Data2: + case DW_Form_Data4: + case DW_Form_Data8: { + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.data); + } break; + case DW_Form_String: { + str8_serial_push_cstr(writer->arena, debug_info, attrib->form.reader.string); + } break; + case DW_Form_Flag: { + str8_serial_push_u8(writer->arena, debug_info, attrib->form.reader.flag); + } break; + case DW_Form_SData: { + dw_serial_push_sleb128(writer->arena, debug_info, attrib->form.reader.sdata); + } break; + case DW_Form_Strp: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); + } break; + case DW_Form_UData: { + dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.udata); + } break; + case DW_Form_RefAddr: { + if (writer->version < DW_Version_3) { + Assert(writer->address_size <= sizeof(attrib->form.reader.ref)); + str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->form.reader.ref, writer->address_size)); + } else { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.ref); + } + } break; + case DW_Form_Ref1: { + str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->form.reader.ref); + } break; + case DW_Form_Ref2: { + str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->form.reader.ref); + } break; + case DW_Form_Ref4: { + str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->form.reader.ref); + } break; + case DW_Form_Ref8: { + if (attrib->form.writer.ref->info_off == 0) { + // reserve 8 bytes + void *value = str8_serial_push_u64(writer->arena, debug_info, 0); + + // push fixup + dw_writer_fixup_list_push(writer->arena, &writer->fixups, (DW_WriterFixup){ .tag = attrib->form.writer.ref, .ptr = value }); + } + } break; + case DW_Form_RefUData: { + dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.ref); + } break; + case DW_Form_Indirect: { + NotImplemented; + } break; + case DW_Form_SecOffset: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); + } break; + case DW_Form_ExprLoc: { + dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.exprloc.size); + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.exprloc); + } break; + case DW_Form_FlagPresent: { + } break; + case DW_Form_RefSig8: { + NotImplemented; + } break; + case DW_Form_Strx: + case DW_Form_Addrx: + case DW_Form_RngListx: + case DW_Form_LocListx: { + dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.xval); + } break; + case DW_Form_RefSup4: { + NotImplemented; + } break; + case DW_Form_StrpSup: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.strp_sup); + } break; + case DW_Form_Data16: { + str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.data); + } break; + case DW_Form_LineStrp: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); + } break; + case DW_Form_ImplicitConst: { + // value is stored in the abbrev entry + } break; + case DW_Form_RefSup8: { + NotImplemented; + } break; + case DW_Form_Strx1: + case DW_Form_Addrx1: { + str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->form.reader.xval); + } break; + case DW_Form_Strx2: + case DW_Form_Addrx2: { + str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->form.reader.xval); + } break; + case DW_Form_Strx3: + case DW_Form_Addrx3: { + str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->form.reader.xval, 3)); + } break; + case DW_Form_Strx4: + case DW_Form_Addrx4: { + str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->form.reader.xval); + } break; + + case DW_Form_GNU_StrpAlt: { + dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); + } break; + case DW_Form_GNU_RefAlt: { dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.ref); - } - } break; - case DW_Form_Ref1: { - str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->form.reader.ref); - } break; - case DW_Form_Ref2: { - str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->form.reader.ref); - } break; - case DW_Form_Ref4: { - str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->form.reader.ref); - } break; - case DW_Form_Ref8: { - if (attrib->form.writer.ref->info_off == 0) { - // reserve 8 bytes - void *value = str8_serial_push_u64(writer->arena, debug_info, 0); - - // push fixup - dw_writer_fixup_list_push(writer->arena, &writer->fixups, (DW_WriterFixup){ .tag = attrib->form.writer.ref, .ptr = value }); - } - } break; - case DW_Form_RefUData: { - dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.ref); - } break; - case DW_Form_Indirect: { - NotImplemented; - } break; - case DW_Form_SecOffset: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); - } break; - case DW_Form_ExprLoc: { - dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.exprloc.size); - str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.exprloc); - } break; - case DW_Form_FlagPresent: { - } break; - case DW_Form_RefSig8: { - NotImplemented; - } break; - case DW_Form_Strx: - case DW_Form_Addrx: - case DW_Form_RngListx: - case DW_Form_LocListx: { - dw_serial_push_uleb128(writer->arena, debug_info, attrib->form.reader.xval); - } break; - case DW_Form_RefSup4: { - NotImplemented; - } break; - case DW_Form_StrpSup: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.strp_sup); - } break; - case DW_Form_Data16: { - str8_serial_push_string(writer->arena, debug_info, attrib->form.reader.data); - } break; - case DW_Form_LineStrp: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); - } break; - case DW_Form_ImplicitConst: { - // value is stored in the abbrev entry - } break; - case DW_Form_RefSup8: { - NotImplemented; - } break; - case DW_Form_Strx1: - case DW_Form_Addrx1: { - str8_serial_push_u8(writer->arena, debug_info, (U8)attrib->form.reader.xval); - } break; - case DW_Form_Strx2: - case DW_Form_Addrx2: { - str8_serial_push_u16(writer->arena, debug_info, (U16)attrib->form.reader.xval); - } break; - case DW_Form_Strx3: - case DW_Form_Addrx3: { - str8_serial_push_string(writer->arena, debug_info, str8((U8 *)&attrib->form.reader.xval, 3)); - } break; - case DW_Form_Strx4: - case DW_Form_Addrx4: { - str8_serial_push_u32(writer->arena, debug_info, (U32)attrib->form.reader.xval); - } break; - - case DW_Form_GNU_StrpAlt: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.sec_offset); - } break; - case DW_Form_GNU_RefAlt: { - dw_serial_push_uint(writer->arena, debug_info, writer->format, attrib->form.reader.ref); - } break; - - default: InvalidPath; break; + } break; + + default: InvalidPath; break; } } } - + // write children for EachNode(child, DW_WriterTag, tag->first_child) { dw_writer_emit_tag(writer, child); } - + // close tag if (tag->first_child) { dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Info].srl, 0); @@ -977,7 +977,7 @@ dw_writer_emit(DW_Writer *writer) { // push line table terminator dw_writer_line_end_sequence(writer); - + // find comp dir in the compile unit tag String8 comp_dir = {0}; String8 comp_name = {0}; @@ -991,19 +991,19 @@ dw_writer_emit(DW_Writer *writer) comp_name = attrib->form.writer.string; } } - + String8List dir_table_srl = {0}; str8_serial_begin(writer->arena, &dir_table_srl); { Temp scratch = scratch_begin(0, 0); String8List *srl = &dir_table_srl; - + // (13) directory_entry_format_count str8_serial_push_u8(writer->arena, srl, 1); // (14) directory_entry_format dw_serial_push_uleb128(writer->arena, srl, DW_LNCT_Path); dw_serial_push_uleb128(writer->arena, srl, DW_Form_String); - + // dedup directories String8List dirs = {0}; HashTable *dir_ht = hash_table_init(scratch.arena, writer->line.file_count + 1); @@ -1017,7 +1017,7 @@ dw_writer_emit(DW_Writer *writer) for EachNode(file, DW_WriterFile, writer->line.first_file) { String8 path = str8_chop_last_slash(file->path); if (path.size == 0) { - continue; + continue; } if ( ! hash_table_search_string_u64(dir_ht, path, &file->dir_idx)) { // @dir_idx @@ -1029,24 +1029,24 @@ dw_writer_emit(DW_Writer *writer) } } } - + // (15) directories_count dw_serial_push_uleb128(writer->arena, srl, dirs.node_count); - + // (16) directories for EachNode(dir_n, String8Node, dirs.first) { dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, (DW_WriterXForm) { .reader = { .kind = DW_Form_String, .string = dir_n->string } }); } - + scratch_end(scratch); } - + String8List file_table_srl = {0}; str8_serial_begin(writer->arena, &file_table_srl); { Temp scratch = scratch_begin(0, 0); String8List *srl = &file_table_srl; - + struct { DW_LNCT lnct; DW_FormKind form_kind; } encs[] = { { DW_LNCT_Path, DW_Form_String }, { DW_LNCT_DirectoryIndex, DW_Form_UData }, @@ -1055,10 +1055,10 @@ dw_writer_emit(DW_Writer *writer) { DW_LNCT_MD5, DW_Form_Null }, // DW_Form_Block { DW_LNCT_LLVM_Source, DW_Form_Null } // DW_Form_String }; - + HashTable *encs_ht = hash_table_init(scratch.arena, ArrayCount(encs) * 2); for EachElement(i, encs) { hash_table_push_u64_raw(scratch.arena, encs_ht, encs[i].lnct, &encs[i].form_kind); } - + // enable encodings in use for EachNode(file, DW_WriterFile, writer->line.first_file) { if (file->time_stamp != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_TimeStamp ) = DW_Form_UData; } @@ -1066,24 +1066,24 @@ dw_writer_emit(DW_Writer *writer) if ( ! u128_match(file->md5, u128_zero())) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_MD5 ) = DW_Form_Block; } if (file->source.size != 0) { *(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_LLVM_Source) = DW_Form_String; } } - + // count needed encodings U8 enc_count = 0; for EachElement(i, encs) { if (encs[i].form_kind != DW_Form_Null) { enc_count += 1; } } - + // (17) file_name_entry_format_count str8_serial_push_u8(writer->arena, srl, enc_count); - + // (18) file_name_entry_format for EachElement(i, encs) { if (encs[i].form_kind == DW_Form_Null) { continue; } dw_serial_push_uleb128(writer->arena, srl, encs[i].lnct ); dw_serial_push_uleb128(writer->arena, srl, encs[i].form_kind); } - + // (19) file_names_count dw_serial_push_uleb128(writer->arena, srl, writer->line.file_count); - + // (20) file_names if (comp_name.size) { for (DW_WriterFile *n = writer->line.first_file, *p = 0; n != 0; p = n, n = n->next) { @@ -1109,21 +1109,21 @@ dw_writer_emit(DW_Writer *writer) static DW_WriterXForm null_form_udata = { .reader = { .kind = DW_Form_UData } }; static DW_WriterXForm null_form_string = { .reader = { .kind = DW_Form_String } }; static DW_WriterXForm null_form_block = { .reader = { .kind = DW_Form_Block } }; - + // @file_idx file->file_idx = file_idx++; - + // path Assert(*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Path) == DW_Form_String); String8 file_name = str8_skip_last_slash(file->path); DW_WriterXForm path_form = { .reader = { .kind = DW_Form_String, .string = file_name } }; dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, path_form); - + // directory index Assert(*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_DirectoryIndex) == DW_Form_UData); DW_WriterXForm dir_idx_form = { .reader = { .kind = DW_Form_UData, .udata = file->dir_idx } }; dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, dir_idx_form); - + // time stamp if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_TimeStamp) == DW_Form_UData) { if (file->time_stamp) { @@ -1133,7 +1133,7 @@ dw_writer_emit(DW_Writer *writer) dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, null_form_udata); } } - + // size if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_Size) == DW_Form_UData) { if (file->size) { @@ -1143,7 +1143,7 @@ dw_writer_emit(DW_Writer *writer) dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, null_form_udata); } } - + // MD5 if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_MD5) == DW_Form_Block) { if ( ! u128_match(file->md5, u128_zero())) { @@ -1153,7 +1153,7 @@ dw_writer_emit(DW_Writer *writer) dw_serial_push_form(writer->arena, srl, writer->version, writer->format, writer->address_size, 0, null_form_block); } } - + // LLVM Source if (*(DW_FormKind *)hash_table_search_u64_raw(encs_ht, DW_LNCT_LLVM_Source) == DW_Form_String) { if (file->source.size) { @@ -1164,10 +1164,10 @@ dw_writer_emit(DW_Writer *writer) } } } - + scratch_end(scratch); } - + { String8List *srl = &writer->sections[DW_Section_Line].srl; // (1) unit_length @@ -1201,25 +1201,25 @@ dw_writer_emit(DW_Writer *writer) str8_list_concat_in_place(srl, &dir_table_srl); // file table str8_list_concat_in_place(srl, &file_table_srl); - + // fixup header length U64 bytes_to_line_program = srl->total_size - header_length_offset; if (writer->format == DW_Format_32Bit) { *(U32 *)header_length_ptr = bytes_to_line_program; } else { *(U64 *)header_length_ptr = bytes_to_line_program; } - + // line program String8 line_program_data = dw_data_from_line_insts(writer->arena, writer->address_size, writer->line.line_insts); str8_serial_push_string(writer->arena, srl, line_program_data); } } - + // info { dw_writer_emit_tag(writer, writer->root); - + // null terminate .debug_abbrev dw_serial_push_uleb128(writer->arena, &writer->sections[DW_Section_Abbrev].srl, 0); - + // fixup units lengths for EachElement(i, writer->sections) { if (writer->sections[i].length) { @@ -1236,7 +1236,7 @@ dw_writer_emit(DW_Writer *writer) } } } - + // fixup forward references in .debug_info for EachNode(fixup_n, DW_WriterFixupNode, writer->fixups.first) { DW_WriterFixup *fixup = &fixup_n->v; @@ -1251,19 +1251,19 @@ internal void dw_writer_emit_to_obj(DW_Writer *writer, OBJ *obj) { dw_writer_emit(writer); - + // push obj sections - OBJ_Section *sections[DW_Section_Count] = {0}; + OBJ_Section *sections[DW_Section_COUNT] = {0}; for EachElement(i, writer->sections) { if (writer->sections[i].srl.total_size) { sections[i] = obj_push_section(obj, dw_name_string_from_section_kind(i), OBJ_SectionFlag_Read|OBJ_SectionFlag_Write); } } - + // push OBJ relocation for 'abbrev base' OBJ_Section *debug_info = sections[DW_Section_Info]; obj_push_reloc(obj, debug_info, OBJ_RelocKind_SecRel, writer->abbrev_base_info_off, sections[DW_Section_Abbrev]->symbol); - + // copy section data from writer to obj for EachElement(i, writer->sections) { if (writer->sections[i].srl.total_size > 0) { @@ -1271,7 +1271,7 @@ dw_writer_emit_to_obj(DW_Writer *writer, OBJ *obj) str8_list_push(obj->arena, §ions[i]->data, data); } } - + // zero out writer sections MemoryZeroArray(writer->sections); } diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index eb8a3e84..2e1a8923 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -201,7 +201,7 @@ typedef struct DW_WriterSection typedef struct DW_Writer { Arena *arena; - + // Compile Unit Arch arch; DW_Version version; @@ -209,15 +209,15 @@ typedef struct DW_Writer DW_CompUnitKind cu_kind; U8 address_size; U8 segsel_size; - + // Abbrev U64 abbrev_base_info_off; HashTable *abbrev_id_map; - + // Info DW_WriterTag *root; DW_WriterTag *current; - + // Line struct { U8 min_inst_len; @@ -227,20 +227,20 @@ typedef struct DW_Writer U8 line_range; U8 opcode_base; DW_LineInstList line_insts; - + DW_WriterFile *file; U64 ln; U64 col; U64 addr; - + U64 file_count; DW_WriterFile *first_file; DW_WriterFile *last_file; } line; - + // Emit DW_WriterFixupList fixups; - DW_WriterSection sections[DW_Section_Count]; + DW_WriterSection sections[DW_Section_COUNT]; DW_WriterAttribChunkList attrib_chunk_list; DW_WriterTagChunkList tag_chunk_list; } DW_Writer; diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index eadf21dd..9463e4aa 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -285,6 +285,7 @@ switch(arch) { default:{}break; case RDI_Arch_X64:{result = 8;}break; +case RDI_Arch_X86:{result = 4;}break; } return result; } diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index d870dd2b..aadf6729 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -133,6 +133,7 @@ typedef enum RDI_ArchEnum { RDI_Arch_NULL = 0, RDI_Arch_X64 = 1, +RDI_Arch_X86 = 2, } RDI_ArchEnum; typedef RDI_U8 RDI_RegCode; @@ -578,6 +579,7 @@ X(RDI_U64, idx)\ #define RDI_Arch_XList \ X(NULL)\ X(X64)\ +X(X86)\ #define RDI_RegCodeX64_XList \ X(nil, 0)\ diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 3b8af5f6..53e8ec44 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -77,7 +77,14 @@ rb_thread_entry_point(void *p) ////////////////////////// //- rjf: possibly relative -> absolute path // - String8 input_file_path = path_normalized_from_string(arena, str8f(arena, "%S/%S", working_directory, n->string)); + String8 input_file_path = n->string; + { + PathStyle path_style = path_style_from_str8(n->string); + if(path_style == PathStyle_Relative) + { + input_file_path = path_normalized_from_string(arena, str8f(arena, "%S/%S", working_directory, n->string)); + } + } ////////////////////////// //- rjf: do thin analysis of file @@ -654,6 +661,7 @@ rb_thread_entry_point(void *p) B32 convert_done = 0; RDIM_BakeParams pdb_bake_params = {0}; RDIM_BakeParams dwarf_bake_params = {0}; + RDIM_BakeParams dwarf_bake_params_2 = {0}; typedef struct RDIM_BakeParamsNode RDIM_BakeParamsNode; struct RDIM_BakeParamsNode { @@ -756,6 +764,124 @@ rb_thread_entry_point(void *p) convert_params.is_parse_relaxed = 1; // TODO: switch } ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); + + // rjf: convert [2] + D2R2_ConvertParams convert_params_2 = {0}; + { + B32 got_exe = 0; + B32 got_dbg = 0; + String8 exe_name = {0}; + String8 exe_data = {0}; + ExecutableImageKind exe_kind = ExecutableImageKind_Null; + String8 dbg_name = {0}; + String8 dbg_data = {0}; + if(!got_exe && !got_dbg) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_PE].first; n != 0; n = n->next) + { + if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) + { + got_exe = 1; + got_dbg = 1; + dbg_name = n->v->path; + dbg_data = n->v->data; + exe_name = n->v->path; + exe_data = n->v->data; + exe_kind = ExecutableImageKind_CoffPe; + break; + } + } + } + if(!got_exe) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next) + { + got_exe = 1; + exe_name = n->v->path; + exe_data = n->v->data; + exe_kind = ExecutableImageKind_Elf32; + if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF)) + { + break; + } + } + } + if(!got_exe) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next) + { + got_exe = 1; + exe_name = n->v->path; + exe_data = n->v->data; + exe_kind = ExecutableImageKind_Elf64; + if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF)) + { + break; + } + } + } + if(!got_dbg) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next) + { + if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) + { + got_dbg = 1; + dbg_name = n->v->path; + dbg_data = n->v->data; + break; + } + } + } + if(!got_dbg) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next) + { + if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) + { + got_dbg = 1; + dbg_name = n->v->path; + dbg_data = n->v->data; + break; + } + } + } + switch(exe_kind) + { + default:{}break; + case ExecutableImageKind_CoffPe: + { + Temp scratch = scratch_begin(&arena, 1); + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe_data); + String8 raw_sections = str8_substr(exe_data, pe.section_table_range); + COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); + String8 string_table = str8_substr(exe_data, pe.string_table_range); + convert_params_2.arch = pe.arch; + convert_params_2.base_vaddr = pe.image_base; + convert_params_2.raw = dw_input_from_coff_section_table(scratch.arena, exe_data, string_table, pe.section_count, section_table); + convert_params_2.path_style = PathStyle_WindowsAbsolute; + convert_params_2.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, exe_data, string_table, pe.section_count, section_table); + scratch_end(scratch); + }break; + case ExecutableImageKind_Elf32: + case ExecutableImageKind_Elf64: + { + Temp scratch = scratch_begin(&arena, 1); + ELF_Bin bin = elf_bin_from_data(scratch.arena, dbg_data); + convert_params_2.arch = arch_from_elf_machine(bin.hdr.e_machine); + convert_params_2.base_vaddr = elf_base_addr_from_bin(&bin); + convert_params_2.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); + convert_params_2.path_style = PathStyle_UnixAbsolute; + convert_params_2.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); + scratch_end(scratch); + } break; + } + convert_params_2.exe_name = exe_name; + convert_params_2.exe_data = exe_data; + convert_params_2.subset_flags = subset_flags; + convert_params_2.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + } + ProfScope("convert [2]") dwarf_bake_params_2 = d2r2_convert(arena, &convert_params_2); } //- rjf: PDB inputs => PDB -> RDI conversion @@ -1277,7 +1403,7 @@ rb_thread_entry_point(void *p) PE_BinInfo pe = {0}; ELF_Bin elf = {0}; COFF_FileHeaderInfo coff_obj = {0}; - DW_Input dw = {0}; + DW_Raw dw = {0}; U64 eh_frame_hdr_vaddr = 0; U64 eh_frame_vaddr = 0; String8 eh_frame_hdr = {0}; diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index b87e6502..7d6db3f5 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -37,6 +37,7 @@ #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "rdi_from_dwarf/rdi_from_dwarf.h" +#include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "radbin/radbin.h" //- rjf: [c] @@ -66,6 +67,7 @@ #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" #include "rdi_from_dwarf/rdi_from_dwarf.c" +#include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "radbin/radbin.c" //////////////////////////////// diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index b98f8e6c..6b16333b 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -309,6 +309,7 @@ RDI_ArchTable: { {NULL 0 0} {X64 1 8} + {X86 2 4} } @table(name value) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 5433129e..3592a309 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -717,7 +717,7 @@ d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecod internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, - DW_Input *input, + DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, @@ -1312,7 +1312,7 @@ d2r_bytecode_from_expression(Arena *arena, } internal RDIM_Location -d2r_transpile_expression(Arena *arena, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) +d2r_transpile_expression(Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) { RDIM_Location loc = {0}; if (expr.size) { @@ -1325,7 +1325,7 @@ d2r_transpile_expression(Arena *arena, DW_Input *input, U64 image_base, Arch arc } internal RDIM_Location -d2r_location_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) +d2r_location_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) { String8 expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, kind); RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, expr); @@ -1336,7 +1336,7 @@ internal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, - DW_Input *input, + DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, @@ -1383,7 +1383,7 @@ internal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, - DW_Input *input, + DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, @@ -1450,7 +1450,7 @@ d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off) } internal RDIM_Type * -d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) { RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; @@ -1559,7 +1559,7 @@ d2r_is_type_tag_converted(DW_TagNode *tag_node) } internal RDIM_Type * -d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind) +d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind) { RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; @@ -1604,7 +1604,7 @@ d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *inpu internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, - DW_Input *input, + DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, @@ -2088,7 +2088,7 @@ d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, R internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, - DW_Input *input, + DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, DW_TagNode *root) @@ -2205,7 +2205,7 @@ d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D } internal RDIM_Type ** -d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) +d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) { Temp scratch = scratch_begin(&arena, 1); @@ -2238,7 +2238,7 @@ d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input } internal Rng1U64List -d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) +d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) { // collect non-contiguous range Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); @@ -2296,7 +2296,7 @@ d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 imag internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, - DW_Input *input, + DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, @@ -2620,7 +2620,7 @@ d2r_sort_ptrs(void **ptrs, U64 count, int (* is_before)(void *a, void *b)) } internal D2R_CompUnitContribMap -d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base) +d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Raw *input, U64 image_base) { Temp scratch = scratch_begin(&arena, 1); Temp temp = temp_begin(arena); @@ -2726,7 +2726,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) Arch arch = Arch_Null; U64 image_base = 0; - DW_Input input = {0}; + DW_Raw input = {0}; PathStyle path_style = PathStyle_Null; switch (params->exe_kind) { diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 20941dee..c2569b14 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -207,11 +207,11 @@ internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack * //////////////////////////////// //~ Expression Conversion -internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); -internal RDIM_Location d2r_transpile_expression (Arena *arena, DW_Input *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); -internal RDIM_Location d2r_location_from_attrib (Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_locset_from_attrib (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_var_locset_from_tag (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); +internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); +internal RDIM_Location d2r_transpile_expression (Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); +internal RDIM_Location d2r_location_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_locset_from_attrib (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_var_locset_from_tag (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); //////////////////////////////// //~ Type Table @@ -219,7 +219,7 @@ internal RDIM_LocationCaseList d2r_var_locset_from_tag (Arena *arena, RDIM_S internal RDIM_Type * d2r_create_type (Arena *arena, D2R_TypeTable *type_table); internal RDIM_Type * d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off); internal RDIM_Type * d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off); -internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); //////////////////////////////// //~ Tag Iterator @@ -235,8 +235,8 @@ internal DW_Tag d2r_tag_iterator_parent_tag (D2R_TagIterator *ite internal void d2r_flag_converted_tag(DW_TagNode *tag_node); internal B8 d2r_is_tag_converted (DW_TagNode *tag_node); -internal RDIM_Type * d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_TagNode *root); +internal RDIM_Type * d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_TagNode *root); //////////////////////////////// //~ UDT Conversion @@ -244,15 +244,15 @@ internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, internal B8 d2r_is_udt_tag_converted (DW_TagNode *tag_node); internal void d2r_flag_converted_udt_tag(DW_TagNode *tag_node); internal void d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, RDIM_UDT *udt); -internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, DW_TagNode *root); +internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, DW_TagNode *root); //////////////////////////////// //~ Symbol Conversion internal RDIM_Scope * d2r_push_scope (Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges); -internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); -internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); -internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, Arch arch, DW_TagNode *root, RDIM_Unit *unit_rdi); +internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); +internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); +internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, Arch arch, DW_TagNode *root, RDIM_Unit *unit_rdi); //////////////////////////////// //~ Line Table Conversion @@ -263,7 +263,7 @@ internal void d2r_sort_ptrs(void **ptrs, U64 count, int (* is_before)(void *a, v //////////////////////////////// //~ Contrib Map -internal D2R_CompUnitContribMap d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Input *input, U64 image_base); +internal D2R_CompUnitContribMap d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Raw *input, U64 image_base); internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); //////////////////////////////// diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 17939b5a..4bc80fe0 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -299,9 +299,19 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync(); //////////////////////////// - //- rjf: parse each unit's line table + //- rjf: parse each unit's line table header // + DW2_LineTableHeader *unit_line_table_headers = 0; + U64 *unit_line_table_header_sizes = 0; + ProfScope("parse each unit's line table header") { + if(lane_idx() == 0) + { + unit_line_table_headers = push_array(scratch.arena, DW2_LineTableHeader, unit_count); + unit_line_table_header_sizes = push_array(scratch.arena, U64, unit_count); + } + lane_sync_u64(&unit_line_table_headers, 0); + lane_sync_u64(&unit_line_table_header_sizes, 0); U64 unit_take_idx = 0; U64 *unit_take_idx_ptr = &unit_take_idx; lane_sync_u64(&unit_take_idx_ptr, 0); @@ -316,13 +326,173 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); U64 line_info_off = stmt_list->val.u128.u64[0]; - DW2_LineTableHeader line_table_header = {0}; String8 line_info_data = raw->sec[DW_Section_Line].data; - dw2_read_line_table_header(scratch.arena, ctx, line_info_data, line_info_off, &line_table_header); + unit_line_table_header_sizes[unit_idx] = dw2_read_line_table_header(scratch.arena, ctx, line_info_data, line_info_off, &unit_line_table_headers[unit_idx]); } } lane_sync(); + //////////////////////////// + //- rjf: deduplicate all source files + // + typedef struct UnitSrcFileMap UnitSrcFileMap; + struct UnitSrcFileMap + { + RDIM_SrcFile **v; + }; + RDIM_SrcFileChunkList *all_src_files = 0; + UnitSrcFileMap *unit_src_file_maps = 0; + ProfScope("deduplicate all source files") if(lane_idx() == 0) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: count all files in all units + U64 total_file_count = 0; + for EachIndex(unit_idx, unit_count) + { + total_file_count += unit_line_table_headers[unit_idx].files.count; + } + + //- rjf: set up path -> src file map + typedef struct SrcFileNode SrcFileNode; + struct SrcFileNode + { + SrcFileNode *next; + String8 full_path; + RDIM_SrcFile *src_file; + }; + all_src_files = push_array(scratch.arena, RDIM_SrcFileChunkList, 1); + U64 slots_count = 1 + (total_file_count * 3) / 4; + SrcFileNode **slots = push_array(scratch2.arena, SrcFileNode *, slots_count); + + //- rjf: set up unit -> src file maps + unit_src_file_maps = push_array(scratch.arena, UnitSrcFileMap, unit_count); + for EachIndex(unit_idx, unit_count) + { + unit_src_file_maps[unit_idx].v = push_array(scratch.arena, RDIM_SrcFile *, unit_line_table_headers[unit_idx].files.count); + } + + //- rjf: build path -> src file map + for EachIndex(unit_idx, unit_count) + { + DW2_LineTableHeader *hdr = &unit_line_table_headers[unit_idx]; + for EachIndex(file_idx, hdr->files.count) + { + DW2_LineTableFile *f = &hdr->files.v[file_idx]; + DW2_LineTableFile *dir = &hdr->dirs.v[f->dir_idx]; + String8 full_file_path = str8f(scratch2.arena, "%S/%S", dir->file_name, f->file_name); + U64 hash = u64_hash_from_str8(full_file_path); + U64 slot_idx = hash%slots_count; + SrcFileNode *node = 0; + for(SrcFileNode *n = slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->full_path, full_file_path, 0)) + { + node = n; + break; + } + } + if(!node) + { + node = push_array(scratch2.arena, SrcFileNode, 1); + node->full_path = full_file_path; + node->src_file = rdim_src_file_chunk_list_push(arena, all_src_files, slots_count); + node->src_file->path = str8_copy(arena, full_file_path); + if(f->flags & DW2_LineTableFileFlag_HasMD5) + { + node->src_file->checksum_kind = RDI_ChecksumKind_MD5; + node->src_file->checksum = str8_copy(arena, str8_struct(&f->md5)); + } + else if(f->flags & DW2_LineTableFileFlag_HasModifyTime) + { + node->src_file->checksum_kind = RDI_ChecksumKind_Timestamp; + node->src_file->checksum = str8_copy(arena, str8_struct(&f->modify_time)); + } + } + unit_src_file_maps[unit_idx].v[file_idx] = node->src_file; + } + } + scratch_end(scratch2); + } + lane_sync_u64(&all_src_files, 0); + + //////////////////////////// + //- rjf: parse each unit's line info; produce line tables + // + RDIM_LineTableChunkList *all_line_tables = 0; + RDIM_LineTable **unit_line_tables = 0; + ProfScope("parse each unit's line info; produce line tables") + { + //- rjf: prep all per-unit line tables + if(lane_idx() == 0) + { + all_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, 1); + unit_line_tables = push_array(scratch.arena, RDIM_LineTable *, unit_count); + for EachIndex(unit_idx, unit_count) + { + unit_line_tables[unit_idx] = rdim_line_table_chunk_list_push(arena, all_line_tables, unit_count); + } + } + lane_sync_u64(&all_line_tables, 0); + lane_sync_u64(&unit_line_tables, 0); + + U64 unit_take_idx = 0; + U64 *unit_take_idx_ptr = &unit_take_idx; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + //- rjf: take unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; + if(unit_idx >= unit_count) + { + break; + } + + //- rjf: unpack unit info + DW2_LineTableHeader *line_table_header = &unit_line_table_headers[unit_idx]; + RDIM_LineTable *dst_line_table = unit_line_tables[unit_idx]; + DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; + DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); + U64 line_info_off = stmt_list->val.u128.u64[0]; + String8 all_line_info_data = raw->sec[DW_Section_Line].data; + String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_info_off + unit_line_table_header_sizes[unit_idx], line_info_off + line_table_header->unit_length)); + + //- rjf: set up vm registers + DW2_LineVMRegs vm_regs = {0}; + { + vm_regs.file_index = 1; + vm_regs.line = 1; + vm_regs.is_stmt = line_table_header->default_is_stmt; + } + + //- rjf: run the line opcode program + for(U64 off = 0, next_off = 0; off < unit_line_table_data.size; off = next_off) + { + next_off = unit_line_table_data.size; + + //- rjf: read next opcode + U8 opcode = 0; + str8_deserial_read_struct(unit_line_table_data, off, &opcode); + + //- rjf: apply "special opcodes" (DWARF v5 6.2.5.1) + if(opcode >= line_table_header->opcode_base) + { + U32 adjusted_opcode = (U32)(opcode - line_table_header->opcode_base); + U32 op_advance = adjusted_opcode / line_table_header->line_range; + S64 line_advance = (S64)line_table_header->line_base + (S64)adjusted_opcode%(S64)line_table_header->line_range; + U64 addr_advance = line_table_header->min_inst_length + (vm_regs.vliw_op_index + op_advance) / line_table_header->max_ops_per_inst; + vm_regs.address += addr_advance; + vm_regs.vliw_op_index = (vm_regs.vliw_op_index + op_advance) % line_table_header->max_ops_per_inst; + vm_regs.line += line_advance; + vm_regs.basic_block = 0; + vm_regs.prologue_end = 0; + vm_regs.epilogue_begin = 0; + vm_regs.discriminator = 0; + } + } + } + } + //////////////////////////// //- rjf: fill result // diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h index b25d3d57..91253e18 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -16,6 +16,7 @@ struct D2R2_ConvertParams U64 base_vaddr; RDIM_BinarySectionList binary_sections; DW_Raw raw; + PathStyle path_style; RDIM_SubsetFlags subset_flags; B32 deterministic; }; diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 0cf63150..e9eebf2d 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -103,7 +103,7 @@ dwt_tags_must_match(DW_WriterTag *writer_tag, DW_TagNode *reader_tag) return is_match; } -internal DW_Input +internal DW_Raw dw_input_from_writer(Arena *arena, DW_Writer *writer) { Temp scratch = scratch_begin(&arena, 1); @@ -127,7 +127,7 @@ dw_input_from_writer(Arena *arena, DW_Writer *writer) PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)(exe.str + pe.section_table_range.min); String8 string_table = str8_substr(exe, pe.string_table_range); - DW_Input input = dw_input_from_coff_section_table(arena, exe, string_table, pe.section_count, section_table); + DW_Raw input = dw_input_from_coff_section_table(arena, exe, string_table, pe.section_count, section_table); obj_release(&obj); scratch_end(scratch); @@ -141,7 +141,7 @@ TEST(dwarf_32bit) dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); dw_writer_tag_end(writer); - DW_Input input = dw_input_from_writer(arena, writer); + DW_Raw input = dw_input_from_writer(arena, writer); for EachElement(sec_idx, input.sec) { if (sec_idx == DW_Section_Abbrev) continue; @@ -169,7 +169,7 @@ TEST(dwarf_64bit) dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); dw_writer_tag_end(writer); - DW_Input input = dw_input_from_writer(arena, writer); + DW_Raw input = dw_input_from_writer(arena, writer); for EachElement(sec_idx, input.sec) { if (sec_idx == DW_Section_Abbrev) continue; @@ -235,7 +235,7 @@ TEST(dwarf_line_opcodes) dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_set_discriminator(2)); dw_line_inst_list_push(writer->arena, &writer->line.line_insts, DW_LNE_end_sequence()); - DW_Input input = dw_input_from_writer(arena, writer); + DW_Raw input = dw_input_from_writer(arena, writer); Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(arena, input.sec[DW_Section_Info].data); DW_CompUnit cu = dw_cu_from_info_off(arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); @@ -411,7 +411,7 @@ TEST(dwarf_line_emit) } } - DW_Input input = dw_input_from_writer(arena, writer); + DW_Raw input = dw_input_from_writer(arena, writer); Rng1U64Array cu_ranges = dw_unit_ranges_from_data_arr(arena, input.sec[DW_Section_Info].data); DW_CompUnit cu = dw_cu_from_info_off(arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); @@ -621,7 +621,7 @@ TEST(dwarf_writer) dw_writer_tag_end(writer); } - DW_Input input = dw_input_from_writer(arena, writer); + DW_Raw input = dw_input_from_writer(arena, writer); DW_ListUnitInput lu_input = dw_list_unit_input_from_input(arena, &input); DW_CompUnit cu = dw_cu_from_info_off(arena, &input, lu_input, 0, 1); DW_TagTree tag_tree = dw_tag_tree_from_cu(arena, &input, &cu); From 602cf689807ed72cc4e624c44b6359a4cfb92b53 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Apr 2026 14:45:13 -0700 Subject: [PATCH 455/850] fix builds --- src/raddbg/raddbg_main.c | 2 + src/rdi_from_dwarf/rdi_from_dwarf_2.c | 90 ++++++++++++++++++++++++++- src/torture/torture_main.c | 2 + 3 files changed, 93 insertions(+), 1 deletion(-) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index ed4e2576..afc4efb5 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -289,6 +289,7 @@ #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "rdi_from_dwarf/rdi_from_dwarf.h" +#include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "radbin/radbin.h" #include "regs/regs.h" #include "regs/rdi/regs_rdi.h" @@ -343,6 +344,7 @@ #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" #include "rdi_from_dwarf/rdi_from_dwarf.c" +#include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "radbin/radbin.c" #include "regs/regs.c" #include "regs/rdi/regs_rdi.c" diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 4bc80fe0..5f7026cd 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -466,13 +466,16 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //- rjf: run the line opcode program + B32 emit_line = 0; for(U64 off = 0, next_off = 0; off < unit_line_table_data.size; off = next_off) { next_off = unit_line_table_data.size; //- rjf: read next opcode + U64 op_read_off = off; U8 opcode = 0; - str8_deserial_read_struct(unit_line_table_data, off, &opcode); + str8_deserial_read_struct(unit_line_table_data, op_read_off, &opcode); + op_read_off += 1; //- rjf: apply "special opcodes" (DWARF v5 6.2.5.1) if(opcode >= line_table_header->opcode_base) @@ -488,6 +491,91 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) vm_regs.prologue_end = 0; vm_regs.epilogue_begin = 0; vm_regs.discriminator = 0; + emit_line = 1; + } + + //- rjf: apply standard opcode + else + { + U64 op_advance = 0; + switch(opcode) + { + //- rjf: line emissions + case DW_StdOpcode_Copy: + { + emit_line = 1; + vm_regs.discriminator = 0; + vm_regs.basic_block = 0; + vm_regs.prologue_end = 0; + vm_regs.epilogue_begin = 0; + }break; + + //- rjf: PC advances + case DW_StdOpcode_AdvancePc: + { + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &op_advance); + }goto advance_pc; + case DW_StdOpcode_ConstAddPc: + { + op_advance = (0xffu - line_table_header->opcode_base) / line_table_header->line_range; + }goto advance_pc; + advance_pc:; + { + U64 op_index = vm_regs.vliw_op_index + op_advance; + vm_regs.address += line_table_header->min_inst_length * (op_index / line_table_header->max_ops_per_inst); + vm_regs.vliw_op_index = op_index % line_table_header->max_ops_per_inst; + }break; + + //- rjf: fixed PC advances + case DW_StdOpcode_FixedAdvancePc: + { + U16 fixed_advance = 0; + str8_deserial_read_struct(unit_line_table_data, op_read_off, &fixed_advance); + op_read_off += sizeof(U16); + vm_regs.address += fixed_advance; + vm_regs.vliw_op_index = 0; + }break; + + //- rjf: line number advance + case DW_StdOpcode_AdvanceLine: + { + S64 advance = 0; + op_read_off += str8_deserial_read_sleb128(unit_line_table_data, op_read_off, &advance); + vm_regs.line += advance; + }break; + + //- rjf: set file + case DW_StdOpcode_SetFile: + { + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.file_index); + }break; + + //- rjf: set column + case DW_StdOpcode_SetColumn: + { + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.column); + }break; + + //- rjf: negate statment + case DW_StdOpcode_NegateStmt: + { + vm_regs.is_stmt = !vm_regs.is_stmt; + }break; + + //- rjf: flag sets + case DW_StdOpcode_SetBasicBlock: + { + vm_regs.basic_block = 1; + }break; + case DW_StdOpcode_SetPrologueEnd: + { + vm_regs.prologue_end = 1; + }break; + case DW_StdOpcode_SetEpilogueBegin: + { + vm_regs.epilogue_begin = 1; + }break; + } } } } diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index c58da570..613fc496 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -58,6 +58,7 @@ #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "rdi_from_dwarf/rdi_from_dwarf.h" +#include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "obj/obj.h" #include "radbin/radbin.h" #include "regs/regs.h" @@ -130,6 +131,7 @@ #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" #include "rdi_from_dwarf/rdi_from_dwarf.c" +#include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "obj/obj.c" #include "radbin/radbin.c" #include "regs/regs.c" From 2637f6abded75d770e93cff91577ceeb6698cd34 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Apr 2026 15:30:55 -0700 Subject: [PATCH 456/850] further line info conversion progress; fix missing sync --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 110 +++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 2 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 5f7026cd..3ffcb7e2 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -230,6 +230,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } abbrev_map_from_idx_table[abbrev_map_idx] = dw2_abbrev_map_from_data(scratch.arena, abbrev_data, abbrev_map_off_from_idx_table[abbrev_map_idx]); } + lane_sync(); } //- rjf: build unit -> abbrev map table @@ -423,7 +424,17 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_LineTable **unit_line_tables = 0; ProfScope("parse each unit's line info; produce line tables") { - //- rjf: prep all per-unit line tables + //- rjf: prep outputs + typedef struct FileSeqNode FileSeqNode; + struct FileSeqNode + { + FileSeqNode *next; + RDIM_SrcFile *src_file; + RDIM_LineSequenceNode *first_seq_node; + RDIM_LineSequenceNode *last_seq_node; + }; + U64 *unit_file_seq_maps_slots_counts = 0; + FileSeqNode ***unit_file_seq_maps_slots = 0; if(lane_idx() == 0) { all_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, 1); @@ -432,10 +443,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { unit_line_tables[unit_idx] = rdim_line_table_chunk_list_push(arena, all_line_tables, unit_count); } + unit_file_seq_maps_slots_counts = push_array(scratch.arena, U64, unit_count); + unit_file_seq_maps_slots = push_array(scratch.arena, FileSeqNode **, unit_count); } lane_sync_u64(&all_line_tables, 0); lane_sync_u64(&unit_line_tables, 0); + //- rjf: wide per-unit parse U64 unit_take_idx = 0; U64 *unit_take_idx_ptr = &unit_take_idx; lane_sync_u64(&unit_take_idx_ptr, 0); @@ -467,7 +481,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: run the line opcode program B32 emit_line = 0; - for(U64 off = 0, next_off = 0; off < unit_line_table_data.size; off = next_off) + B32 done = 0; + for(U64 off = 0, next_off = 0; !done && off < unit_line_table_data.size; off = next_off) { next_off = unit_line_table_data.size; @@ -500,6 +515,20 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 op_advance = 0; switch(opcode) { + //- rjf: skip unknown opcode + default: + { + if(opcode == 0 || opcode > line_table_header->opcode_lengths_count) + { + done = 1; + } + for EachIndex(uleb_idx, line_table_header->opcode_lengths[opcode - 1]) + { + U64 v = 0; + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &v); + } + }break; + //- rjf: line emissions case DW_StdOpcode_Copy: { @@ -575,8 +604,85 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { vm_regs.epilogue_begin = 1; }break; + + //- rjf: isa + case DW_StdOpcode_SetIsa: + { + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.isa); + }break; + + //- rjf: extended opcode + case DW_StdOpcode_ExtendedOpcode: + { + // rjf: read extended opcode size + U64 ext_opcode_size = 0; + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &ext_opcode_size); + + // rjf: read extended opcode + U8 ext_opcode = 0; + op_read_off += str8_deserial_read_struct(unit_line_table_data, op_read_off, &ext_opcode); + + // rjf: grab truncated data for just this extended opcode + String8 ext_op_data = str8_prefix(unit_line_table_data, op_read_off + ext_opcode_size); + + // rjf: do extended opcode + switch(ext_opcode) + { + default: + case DW_ExtOpcode_Undefined: + case DW_ExtOpcode_UserLo: + case DW_ExtOpcode_UserHi: + {}break; + case DW_ExtOpcode_EndSequence: + { + emit_line = 1; + vm_regs.end_sequence = 1; + }break; + case DW_ExtOpcode_SetAddress: + { + U64 addr = 0; + op_read_off += str8_deserial_read(ext_op_data, op_read_off, &addr, line_table_header->addr_size, line_table_header->addr_size); + vm_regs.address = addr; + vm_regs.vliw_op_index = 0; + }break; + case DW_ExtOpcode_DefineFile: + { + String8 file_name = {0}; + U64 dir_idx = 0; + U64 modify_time = 0; + U64 file_size = 0; + op_read_off += str8_deserial_read_cstr(ext_op_data, op_read_off, &file_name); + op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &dir_idx); + op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &modify_time); + op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &file_size); + // + // TODO(rjf): this is a real problem, because at this point, we've already gathered & deduped + // all source files, but now we're in a situation where a per-lane line info parse can produce + // new source files, which may - of course - be duplicates of files defined in other unit line + // info. + // + }break; + case DW_ExtOpcode_SetDiscriminator: + { + op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &vm_regs.discriminator); + }break; + } + }break; } } + + //- rjf: emit lines / sequences + if(emit_line) + { + emit_line = 0; + + } + + //- rjf: advance to next opcode + if(op_read_off > off) + { + next_off = op_read_off; + } } } } From 611e46cda5dcc90750b855eff10511550dab7353 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Apr 2026 15:40:31 -0700 Subject: [PATCH 457/850] d2r2: fix missing sync; per-unit seq table --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 50 ++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 3ffcb7e2..16a39d3c 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -330,8 +330,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) String8 line_info_data = raw->sec[DW_Section_Line].data; unit_line_table_header_sizes[unit_idx] = dw2_read_line_table_header(scratch.arena, ctx, line_info_data, line_info_off, &unit_line_table_headers[unit_idx]); } + lane_sync(); } - lane_sync(); //////////////////////////// //- rjf: deduplicate all source files @@ -416,6 +416,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) scratch_end(scratch2); } lane_sync_u64(&all_src_files, 0); + lane_sync_u64(&unit_src_file_maps, 0); //////////////////////////// //- rjf: parse each unit's line info; produce line tables @@ -433,8 +434,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_LineSequenceNode *first_seq_node; RDIM_LineSequenceNode *last_seq_node; }; - U64 *unit_file_seq_maps_slots_counts = 0; - FileSeqNode ***unit_file_seq_maps_slots = 0; + typedef struct FileSeqMap FileSeqMap; + struct FileSeqMap + { + U64 slots_count; + FileSeqNode **slots; + }; + FileSeqMap *unit_file_seq_maps = 0; if(lane_idx() == 0) { all_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, 1); @@ -443,11 +449,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { unit_line_tables[unit_idx] = rdim_line_table_chunk_list_push(arena, all_line_tables, unit_count); } - unit_file_seq_maps_slots_counts = push_array(scratch.arena, U64, unit_count); - unit_file_seq_maps_slots = push_array(scratch.arena, FileSeqNode **, unit_count); + unit_file_seq_maps = push_array(scratch.arena, FileSeqMap, unit_count); } lane_sync_u64(&all_line_tables, 0); lane_sync_u64(&unit_line_tables, 0); + lane_sync_u64(&unit_file_seq_maps, 0); //- rjf: wide per-unit parse U64 unit_take_idx = 0; @@ -471,6 +477,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) String8 all_line_info_data = raw->sec[DW_Section_Line].data; String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_info_off + unit_line_table_header_sizes[unit_idx], line_info_off + line_table_header->unit_length)); + //- rjf: set up per-unit file sequence map + unit_file_seq_maps[unit_idx].slots_count = line_table_header->files.count; + unit_file_seq_maps[unit_idx].slots = push_array(scratch.arena, FileSeqNode *, unit_file_seq_maps[unit_idx].slots_count); + //- rjf: set up vm registers DW2_LineVMRegs vm_regs = {0}; { @@ -676,6 +686,36 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { emit_line = 0; + // rjf: map file index -> rdim src file + RDIM_SrcFile *src_file = 0; + if(vm_regs.file_index < line_table_header->files.count) + { + src_file = unit_src_file_maps[unit_idx].v[vm_regs.file_index]; + } + + // rjf: map src file -> file seq node + FileSeqNode *file_seq_n = 0; + { + U64 hash = u64_hash_from_str8(str8_struct(&src_file)); + U64 slot_idx = hash%unit_file_seq_maps[unit_idx].slots_count; + for(FileSeqNode *n = unit_file_seq_maps[unit_idx].slots[slot_idx]; n != 0; n = n->next) + { + if(n->src_file == src_file) + { + file_seq_n = n; + break; + } + } + if(file_seq_n == 0) + { + file_seq_n = push_array(scratch.arena, FileSeqNode, 1); + SLLStackPush(unit_file_seq_maps[unit_idx].slots[slot_idx], file_seq_n); + file_seq_n->src_file = src_file; + } + } + + // rjf: push this line into the file sequence node + } //- rjf: advance to next opcode From 467e09178ec880a07150fa7e8c4640a1c266e879 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Apr 2026 16:10:26 -0700 Subject: [PATCH 458/850] file -> seq list line seq chunk building --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 43 +++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 16a39d3c..060b7a5a 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -426,13 +426,24 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) ProfScope("parse each unit's line info; produce line tables") { //- rjf: prep outputs + typedef struct LineSeqChunk LineSeqChunk; + struct LineSeqChunk + { + LineSeqChunk *next; + U64 *voffs; + U32 *line_nums; + U16 *col_nums; + U64 line_count; + U64 line_cap; + }; typedef struct FileSeqNode FileSeqNode; struct FileSeqNode { FileSeqNode *next; RDIM_SrcFile *src_file; - RDIM_LineSequenceNode *first_seq_node; - RDIM_LineSequenceNode *last_seq_node; + LineSeqChunk *first_seq_chunk; + LineSeqChunk *last_seq_chunk; + U64 total_line_count; }; typedef struct FileSeqMap FileSeqMap; struct FileSeqMap @@ -715,7 +726,28 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: push this line into the file sequence node - + { + LineSeqChunk *chunk = file_seq_n->last_seq_chunk; + if(vm_regs.end_sequence && chunk != 0) + { + chunk->voffs[chunk->line_count] = vm_regs.address; + } + if(vm_regs.end_sequence || chunk == 0 || chunk->line_count >= chunk->line_cap) + { + chunk = push_array(scratch.arena, LineSeqChunk, 1); + SLLQueuePush(file_seq_n->first_seq_chunk, file_seq_n->last_seq_chunk, chunk); + chunk->line_cap = 64; + chunk->voffs = push_array(scratch.arena, U64, chunk->line_cap + 1); + chunk->line_nums = push_array(scratch.arena, U32, chunk->line_cap); + chunk->col_nums = push_array(scratch.arena, U16, 2*chunk->line_cap); + } + U64 chunk_line_idx = chunk->line_count; + chunk->voffs[chunk_line_idx] = vm_regs.address; + chunk->line_nums[chunk_line_idx] = (U32)vm_regs.line; + chunk->col_nums[chunk_line_idx] = (U16)vm_regs.column; + chunk->line_count += 1; + file_seq_n->total_line_count += 1; + } } //- rjf: advance to next opcode @@ -725,6 +757,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } } + lane_sync(); + + //- rjf: collect all sequences + // + // TODO(rjf) } //////////////////////////// From 7ed5977d20c73f041429b23a8b7c92e6ed7a7875 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Apr 2026 17:17:48 -0700 Subject: [PATCH 459/850] improve determinism test speed --- src/linker/lnk.c | 12 ++++---- src/linker/lnk_config.c | 54 +++++++++++++++++++++-------------- src/linker/lnk_config.h | 10 ++++--- src/torture/torture_radlink.c | 47 ++++++++++++++++-------------- 4 files changed, 71 insertions(+), 52 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index d506f377..c7c9f869 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -2044,7 +2044,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer } PE_FinalizedExports finalized_exports = pe_finalize_export_list(scratch.arena, resolved_exports); - String8 edata_obj = pe_make_edata_obj(arena->v[0], str8_skip_last_slash(config->image_name), COFF_TimeStamp_Max, config->machine, finalized_exports); + String8 edata_obj = pe_make_edata_obj(arena->v[0], lnk_get_image_name(config), COFF_TimeStamp_Max, config->machine, finalized_exports); lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit("* Exports *"), edata_obj); ProfEnd(); @@ -2119,7 +2119,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer ProfBegin("Build * Linker * Obj"); String8 obj_name = str8_lit("* Linker *"); String8 raw_cmd_line = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }); - String8 obj_data = lnk_make_linker_coff_obj(arena->v[0], config->time_stamp, config->machine, config->work_dir, config->image_name, config->pdb_name, raw_cmd_line, obj_name); + String8 obj_data = lnk_make_linker_coff_obj(arena->v[0], config->time_stamp, config->machine, config->work_dir, lnk_get_image_name(config), config->pdb_name, raw_cmd_line, obj_name); lnk_inputer_push_obj_linkgen(inputer, 0, obj_name, obj_data); ProfEnd(); } @@ -5205,8 +5205,8 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) // Write image in the background LNK_WriteThreadContext *image_write_ctx = push_array(scratch.arena, LNK_WriteThreadContext, 1); - image_write_ctx->path = config->image_name; - image_write_ctx->temp_path = config->temp_image_name; + image_write_ctx->path = config->out_path; + image_write_ctx->temp_path = config->temp_out_path; image_write_ctx->data = image_ctx.image_data; Thread image_write_thread = thread_launch(lnk_write_thread, image_write_ctx); @@ -5225,7 +5225,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) ProfBegin("Build Import Library"); lnk_timer_begin(LNK_Timer_Lib); String8 linker_debug_symbols = lnk_make_linker_debug_symbols(scratch.arena, config->machine); - String8 lib = pe_make_import_lib(arena->v[0], config->machine, config->time_stamp, str8_skip_last_slash(config->image_name), linker_debug_symbols, config->export_symbol_list); + String8 lib = pe_make_import_lib(arena->v[0], config->machine, config->time_stamp, lnk_get_image_name(config), linker_debug_symbols, config->export_symbol_list); lnk_write_data_to_file_path(config->imp_lib_name, str8_zero(), lib); lnk_timer_end(LNK_Timer_Lib); ProfEnd(); @@ -5262,7 +5262,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) arena, OperatingSystem_Windows, rdi_arch_from_coff_machine(config->machine), - config->image_name, + lnk_get_image_name(config), image_ctx.image_data, debug_info_objs_count, debug_info_objs, diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index ac8d606e..768d495e 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -90,6 +90,7 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Rad_SharedThreadPool, 0, "RAD_SHARED_THREAD_POOL", "[:STRING]", "Default value \"" LNK_DEFAULT_THREAD_POOL_NAME "\"" }, { LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, 0, "RAD_SHARED_THREAD_POOL_MAX_WORKERS", ":#", "Set maximum number of workers in a thread pool." }, { LNK_CmdSwitch_Rad_Ignore, 0, "RAD_IGNORE", ":#", "Ignore the specified RAD linker warning." }, + { LNK_CmdSwitch_Rad_ImageAltPath, 0, "RAD_IMAGEALTPATH", ":FILENAME", "Alternative name for the image" }, { LNK_CmdSwitch_Rad_WriteTempFiles, 0, "RAD_WRITE_TEMP_FILES", "[:NO]", "When speicifed linker writes image and debug info to temporary files and renames after link is done." }, { LNK_CmdSwitch_Rad_TimeStamp, 0, "RAD_TIME_STAMP", ":#", "Time stamp embeded in EXE and PDB." }, { LNK_CmdSwitch_Rad_TypeHashAlg, 0, "RAD_TPYE_HASH_ALG", ":{BLAKE3}", "Sets hashing algorithm for type merging." }, @@ -752,9 +753,8 @@ lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_Me internal String8 lnk_get_image_name(LNK_Config *config) { - String8 image_name = config->image_name; + String8 image_name = config->image_alt_path.size ? config->image_alt_path : config->out_path; image_name = str8_skip_last_slash(image_name); - image_name = str8_chop_last_dot(image_name); return image_name; } @@ -1696,7 +1696,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } break; case LNK_CmdSwitch_Out: { - lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->image_name); + lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->out_path); } break; case LNK_CmdSwitch_Pdb: { @@ -1934,19 +1934,27 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_Rad_Log: { if (value_strings.node_count == 1) { - if (str8_match_lit("all", value_strings.first->string, StringMatchFlag_CaseInsensitive)) { + String8 value = value_strings.first->string; + + B32 status = 1; + if (str8_starts_with(value, str8_lit("-"))) { + value = str8_skip(value, 1); + status = 0; + } + + if (str8_match_lit("all", value, StringMatchFlag_CaseInsensitive)) { for (U64 ilog = 0; ilog < LNK_Log_Count; ilog += 1) { - lnk_set_log_status((LNK_LogType)ilog, 1); + lnk_set_log_status((LNK_LogType)ilog, status); } - } else if (str8_match_lit("io", value_strings.first->string, StringMatchFlag_CaseInsensitive)) { - lnk_set_log_status(LNK_Log_IO_Read, 1); - lnk_set_log_status(LNK_Log_IO_Write, 1); + } else if (str8_match_lit("io", value, StringMatchFlag_CaseInsensitive)) { + lnk_set_log_status(LNK_Log_IO_Read, status); + lnk_set_log_status(LNK_Log_IO_Write, status); } else { - LNK_LogType log_type = lnk_log_type_from_string(value_strings.first->string); + LNK_LogType log_type = lnk_log_type_from_string(value); if (log_type == LNK_Log_Null) { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unknown parameter \"%S\"", value_strings.first->string); + lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unknown parameter \"%S\"", value); } else { - lnk_set_log_status(log_type, 1); + lnk_set_log_status(log_type, status); } } } else { @@ -2060,6 +2068,10 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; + case LNK_CmdSwitch_Rad_ImageAltPath: { + lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->image_alt_path); + } break; + case LNK_CmdSwitch_Rad_WriteTempFiles: { lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->write_temp_files); } break; @@ -2266,33 +2278,33 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) // handle empty /OUT if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Out)) { - String8 name = str8_list_first(&config->input_list[LNK_Input_Obj]); - String8 ext = (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) ? str8_lit("dll") : str8_lit("exe"); - config->image_name = path_replace_file_extension(scratch.arena, name, ext); + String8 name = str8_list_first(&config->input_list[LNK_Input_Obj]); + String8 ext = (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) ? str8_lit("dll") : str8_lit("exe"); + config->out_path = path_replace_file_extension(scratch.arena, name, ext); } // handle empty /PDB if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Pdb)) { - config->pdb_name = path_replace_file_extension(scratch.arena, config->image_name, str8_lit("pdb")); + config->pdb_name = path_replace_file_extension(scratch.arena, config->out_path, str8_lit("pdb")); } // handle empty /RAD_DEBUG_NAME if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_DebugName)) { - config->rad_debug_name = path_replace_file_extension(scratch.arena, config->image_name, str8_lit("rdi")); + config->rad_debug_name = path_replace_file_extension(scratch.arena, config->out_path, str8_lit("rdi")); } // handle empty /IMPLIB if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ImpLib)) { - config->imp_lib_name = path_replace_file_extension(scratch.arena, config->image_name, str8_lit("lib")); + config->imp_lib_name = path_replace_file_extension(scratch.arena, config->out_path, str8_lit("lib")); } // handle empty /MANIFESTFILE if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ManifestFile)) { - config->manifest_name = push_str8f(scratch.arena, "%S.manifest", config->image_name); + config->manifest_name = push_str8f(scratch.arena, "%S.manifest", config->out_path); } // convert to full paths - config->image_name = os_full_path_from_path(arena, config->image_name); + config->out_path = os_full_path_from_path(arena, config->out_path); config->pdb_name = os_full_path_from_path(arena, config->pdb_name); config->rad_debug_name = os_full_path_from_path(arena, config->rad_debug_name); config->imp_lib_name = os_full_path_from_path(arena, config->imp_lib_name); @@ -2322,7 +2334,7 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) // define linker env vars hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_pdb"), str8_skip_last_slash(config->pdb_name)); - hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_ext"), str8_skip_last_dot(config->image_name)); + hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_ext"), str8_skip_last_dot(config->out_path)); hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_pdb_path"), config->pdb_name); hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_rdi"), str8_skip_last_slash(config->rad_debug_name)); hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_rdi_path"), config->rad_debug_name); @@ -2353,7 +2365,7 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) // create temporary files names if (config->write_temp_files == LNK_SwitchState_Yes) { config->temp_rad_chunk_map_name = push_str8f(arena, "%S.tmp%x", config->rad_chunk_map_name, config->time_stamp); - config->temp_image_name = push_str8f(arena, "%S.tmp%x", config->image_name, config->time_stamp); + config->temp_out_path = push_str8f(arena, "%S.tmp%x", config->out_path , config->time_stamp); config->temp_pdb_name = push_str8f(arena, "%S.tmp%x", config->pdb_name, config->time_stamp); config->temp_rad_debug_name = push_str8f(arena, "%S.tmp%x", config->rad_debug_name, config->time_stamp); } diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 45817553..6e7e7951 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -88,6 +88,7 @@ typedef enum LNK_CmdSwitch_Version, LNK_CmdSwitch_WholeArchive, + LNK_CmdSwitch_Rad_Age, LNK_CmdSwitch_Rad_AltPchDir, LNK_CmdSwitch_Rad_BuildInfo, @@ -100,6 +101,8 @@ typedef enum LNK_CmdSwitch_Rad_EnvLib, LNK_CmdSwitch_Rad_Exe, LNK_CmdSwitch_Rad_Guid, + LNK_CmdSwitch_Rad_Ignore, + LNK_CmdSwitch_Rad_ImageAltPath, LNK_CmdSwitch_Rad_LargePages, LNK_CmdSwitch_Rad_LinkVer, LNK_CmdSwitch_Rad_Log, @@ -117,7 +120,6 @@ typedef enum LNK_CmdSwitch_Rad_RemoveSection, LNK_CmdSwitch_Rad_SharedThreadPool, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, - LNK_CmdSwitch_Rad_Ignore, LNK_CmdSwitch_Rad_TimeStamp, LNK_CmdSwitch_Rad_TypeHashAlg, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, @@ -125,7 +127,6 @@ typedef enum LNK_CmdSwitch_Rad_Version, LNK_CmdSwitch_Rad_Workers, LNK_CmdSwitch_Rad_WriteTempFiles, - LNK_CmdSwitch_Help, LNK_CmdSwitch_Count @@ -310,7 +311,8 @@ typedef struct LNK_Config PathStyle path_style; LNK_ManifestOpt manifest_opt; String8 work_dir; - String8 image_name; + String8 out_path; + String8 image_alt_path; String8 imp_lib_name; String8List raw_cmd_line; String8 pdb_name; @@ -343,7 +345,7 @@ typedef struct LNK_Config B32 build_imp_lib; B32 build_exp; LNK_SwitchState write_temp_files; - String8 temp_image_name; + String8 temp_out_path; String8 temp_pdb_name; String8 temp_rad_debug_name; String8 temp_rad_chunk_map_name; diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index c345b8d6..df945b0d 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -6335,34 +6335,39 @@ TEST(determ_test) t_invoke_(t_cl_path(), cl_line, max_U64, arena, &cl_out); T_Ok(g_last_exit_code == 0); + U64 run_count = 25; + T_Ok(run_count > 1); + String8 test_path = t_make_file_path(arena, str8_lit("test.obj")); + // single-threaded link - String8 refs_path = t_make_file_path(arena, str8_lit("b.types")); - t_invoke_linkerf("test.obj /debug:full /rad_time_stamp:0 /rad_workers:1 /rad_store_types:%S /out:a.exe", refs_path); + t_invoke_linkerf("%S /debug:full /rad_time_stamp:0 /rad_workers:1 /pdbaltpath:main.pdb /rad_log:-all /rad_ignore:74 /out:main.exe", test_path); T_Ok(g_last_exit_code == 0); - // rename a -> b - T_Ok(os_move_file_path(t_make_file_path(arena, str8_lit("b.exe")), t_make_file_path(arena, str8_lit("a.exe")))); - T_Ok(os_move_file_path(t_make_file_path(arena, str8_lit("b.pdb")), t_make_file_path(arena, str8_lit("a.pdb")))); - // read b - String8 b_exe = t_read_file(arena, str8_lit("b.exe")); - String8 b_pdb = t_read_file(arena, str8_lit("b.pdb")); + String8 main_exe = t_read_file(arena, str8_lit("main.exe")); + String8 main_pdb = t_read_file(arena, str8_lit("main.pdb")); // multi-threaded links - for EachIndex(i, 25) { + OS_HandleList linkers = {0}; + for EachIndex(i, run_count) { + String8 out_path = t_make_file_path(arena, str8f(arena, "%llu.exe", i)); + String8 cmdl = str8f(arena, "%S %S /debug:full /rad_time_stamp:0 /rad_imagealtpath:main.exe /pdbaltpath:main.pdb /rad_log:-all /rad_ignore:74 /out:%S", t_radlink_path(), test_path, out_path); + OS_Handle process_handle = os_cmd_line_launch(cmdl); + T_Ok(!os_handle_match(os_handle_zero(), process_handle)); + os_handle_list_push(arena, &linkers, process_handle); + } + + // wait for linkers + for EachNode(n, OS_HandleNode, linkers.first) { os_process_join(n->v, max_U64, 0); } + + for EachIndex(i, run_count) { Temp temp = temp_begin(arena); - - t_delete_file(str8_lit("a.exe")); - t_delete_file(str8_lit("a.pdb")); - - t_invoke_linkerf("test.obj /debug:full /rad_time_stamp:0 /out:a.exe"); - T_Ok(g_last_exit_code == 0); - - String8 a_exe = t_read_file(temp.arena, str8_lit("a.exe")); - String8 a_pdb = t_read_file(temp.arena, str8_lit("a.pdb")); - T_Ok(str8_match(a_exe, b_exe, 0)); - T_Ok(str8_match(a_pdb, b_pdb, 0)); - + String8 exe = t_read_file(temp.arena, str8f(temp.arena, "%llu.exe", i)); + String8 pdb = t_read_file(temp.arena, str8f(temp.arena, "%llu.pdb", i)); + T_Ok(exe.size); + T_Ok(pdb.size); + T_Ok(str8_match(main_exe, exe, 0)); + T_Ok(str8_match(main_pdb, pdb, 0)); temp_end(temp); } } From 6348c63cdc83c4e08c4d772cccc42b0175a94b07 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 23 Apr 2026 17:33:56 -0700 Subject: [PATCH 460/850] make namespace optional for specifying test targets --- src/torture/torture.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index ce861bac..3eba1488 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -538,8 +538,12 @@ t_entry_point(CmdLine *cmdline) HashTable *ht = hash_table_init(scratch.arena, g_torture_test_count*2); if (target_opt->value_strings.node_count > 0) { for EachNode(pattern_n, String8Node, target_opt->value_strings.first) { + B32 do_namespace = str8_find_needle(pattern_n->string, 0, str8_lit("::"), 0) < pattern_n->string.size; for EachIndex(test_idx, g_torture_test_count) { - String8 name = str8f(scratch.arena, "%s::%s", g_torture_tests[test_idx].group, g_torture_tests[test_idx].label); + String8 name = str8_cstring(g_torture_tests[test_idx].label); + if (do_namespace) { + name = str8f(scratch.arena, "%s::%s", g_torture_tests[test_idx].group, g_torture_tests[test_idx].label); + } if (str8_match_wildcard(name, pattern_n->string, 0)) { if ( ! hash_table_search_string(ht, name)) { hash_table_push_string_raw(scratch.arena, ht, name, 0); From 44a1c9ca1bf9a59d38e9e62a16b8d0c440b00aad Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Apr 2026 18:12:02 -0700 Subject: [PATCH 461/850] d2r2: line sequence production / equipping to src files --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 185 ++++++++++++++++++-------- 1 file changed, 130 insertions(+), 55 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 060b7a5a..d7b27092 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -421,7 +421,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////////// //- rjf: parse each unit's line info; produce line tables // - RDIM_LineTableChunkList *all_line_tables = 0; + RDIM_LineTableChunkList *unit_line_table_chunk_lists = 0; RDIM_LineTable **unit_line_tables = 0; ProfScope("parse each unit's line info; produce line tables") { @@ -441,9 +441,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { FileSeqNode *next; RDIM_SrcFile *src_file; - LineSeqChunk *first_seq_chunk; - LineSeqChunk *last_seq_chunk; - U64 total_line_count; + RDIM_SrcFileLineMapFragment *first_line_map_fragment; + RDIM_SrcFileLineMapFragment *last_line_map_fragment; }; typedef struct FileSeqMap FileSeqMap; struct FileSeqMap @@ -454,15 +453,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) FileSeqMap *unit_file_seq_maps = 0; if(lane_idx() == 0) { - all_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, 1); + unit_line_table_chunk_lists = push_array(scratch.arena, RDIM_LineTableChunkList, unit_count); unit_line_tables = push_array(scratch.arena, RDIM_LineTable *, unit_count); - for EachIndex(unit_idx, unit_count) - { - unit_line_tables[unit_idx] = rdim_line_table_chunk_list_push(arena, all_line_tables, unit_count); - } unit_file_seq_maps = push_array(scratch.arena, FileSeqMap, unit_count); } - lane_sync_u64(&all_line_tables, 0); + lane_sync_u64(&unit_line_table_chunk_lists, 0); lane_sync_u64(&unit_line_tables, 0); lane_sync_u64(&unit_file_seq_maps, 0); @@ -478,16 +473,21 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { break; } + Temp scratch2 = scratch_begin(&scratch.arena, 1); //- rjf: unpack unit info DW2_LineTableHeader *line_table_header = &unit_line_table_headers[unit_idx]; - RDIM_LineTable *dst_line_table = unit_line_tables[unit_idx]; + RDIM_LineTableChunkList *dst_line_tables = &unit_line_table_chunk_lists[unit_idx]; DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); U64 line_info_off = stmt_list->val.u128.u64[0]; String8 all_line_info_data = raw->sec[DW_Section_Line].data; String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_info_off + unit_line_table_header_sizes[unit_idx], line_info_off + line_table_header->unit_length)); + //- rjf: build unit's line table + RDIM_LineTable *dst_line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 1); + unit_line_tables[unit_idx] = dst_line_table; + //- rjf: set up per-unit file sequence map unit_file_seq_maps[unit_idx].slots_count = line_table_header->files.count; unit_file_seq_maps[unit_idx].slots = push_array(scratch.arena, FileSeqNode *, unit_file_seq_maps[unit_idx].slots_count); @@ -502,8 +502,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: run the line opcode program B32 emit_line = 0; - B32 done = 0; - for(U64 off = 0, next_off = 0; !done && off < unit_line_table_data.size; off = next_off) + RDIM_SrcFile *line_seq_src_file = 0; + LineSeqChunk *first_line_seq_chunk = 0; + LineSeqChunk *last_line_seq_chunk = 0; + U64 total_line_seq_count = 0; + for(U64 off = 0, next_off = 0; off <= unit_line_table_data.size; off = next_off) { next_off = unit_line_table_data.size; @@ -539,10 +542,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: skip unknown opcode default: { - if(opcode == 0 || opcode > line_table_header->opcode_lengths_count) - { - done = 1; - } for EachIndex(uleb_idx, line_table_header->opcode_lengths[opcode - 1]) { U64 v = 0; @@ -692,26 +691,54 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } - //- rjf: emit lines / sequences - if(emit_line) + //- rjf: advance to next op + if(op_read_off > off) { - emit_line = 0; - - // rjf: map file index -> rdim src file - RDIM_SrcFile *src_file = 0; - if(vm_regs.file_index < line_table_header->files.count) + next_off = op_read_off; + } + + //- rjf: map file index -> rdim src file + RDIM_SrcFile *src_file = 0; + if(vm_regs.file_index < line_table_header->files.count) + { + src_file = unit_src_file_maps[unit_idx].v[vm_regs.file_index]; + } + + //- rjf: sequence ended explicitly, or file change, or end of stream? -> push to line table + if(vm_regs.end_sequence || (src_file != line_seq_src_file && first_line_seq_chunk != 0) || off >= unit_line_table_data.size) + { + // rjf: combine voffs/lines/cols + U64 seq_line_count = total_line_seq_count; + U64 *seq_voffs = push_array(arena, U64, seq_line_count+1); + U32 *seq_lines = push_array(arena, U32, seq_line_count); + U16 *seq_cols = push_array(arena, U16, 2*seq_line_count); { - src_file = unit_src_file_maps[unit_idx].v[vm_regs.file_index]; + U64 voff_idx = 0; + U64 line_idx = 0; + U64 col_idx = 0; + for(LineSeqChunk *c = first_line_seq_chunk; c != 0; c = c->next) + { + MemoryCopy(seq_voffs + voff_idx, c->voffs, sizeof(c->voffs[0]) * c->line_count); + MemoryCopy(seq_lines + line_idx, c->line_nums, sizeof(c->line_nums[0]) * c->line_count); + MemoryCopy(seq_cols + col_idx, c->col_nums, sizeof(c->col_nums[0]) * 2 * c->line_count); + voff_idx += c->line_count; + line_idx += c->line_count; + col_idx += 2*c->line_count; + } + seq_voffs[seq_line_count] = vm_regs.address - base_vaddr; } + // rjf: push sequence to line table + RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, dst_line_tables, dst_line_table, line_seq_src_file, seq_voffs, seq_lines, seq_cols, seq_line_count); + // rjf: map src file -> file seq node FileSeqNode *file_seq_n = 0; { - U64 hash = u64_hash_from_str8(str8_struct(&src_file)); + U64 hash = u64_hash_from_str8(str8_struct(&line_seq_src_file)); U64 slot_idx = hash%unit_file_seq_maps[unit_idx].slots_count; for(FileSeqNode *n = unit_file_seq_maps[unit_idx].slots[slot_idx]; n != 0; n = n->next) { - if(n->src_file == src_file) + if(n->src_file == line_seq_src_file) { file_seq_n = n; break; @@ -725,45 +752,93 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } - // rjf: push this line into the file sequence node + // rjf: record sequence in file seq node { - LineSeqChunk *chunk = file_seq_n->last_seq_chunk; - if(vm_regs.end_sequence && chunk != 0) - { - chunk->voffs[chunk->line_count] = vm_regs.address; - } - if(vm_regs.end_sequence || chunk == 0 || chunk->line_count >= chunk->line_cap) - { - chunk = push_array(scratch.arena, LineSeqChunk, 1); - SLLQueuePush(file_seq_n->first_seq_chunk, file_seq_n->last_seq_chunk, chunk); - chunk->line_cap = 64; - chunk->voffs = push_array(scratch.arena, U64, chunk->line_cap + 1); - chunk->line_nums = push_array(scratch.arena, U32, chunk->line_cap); - chunk->col_nums = push_array(scratch.arena, U16, 2*chunk->line_cap); - } - U64 chunk_line_idx = chunk->line_count; - chunk->voffs[chunk_line_idx] = vm_regs.address; - chunk->line_nums[chunk_line_idx] = (U32)vm_regs.line; - chunk->col_nums[chunk_line_idx] = (U16)vm_regs.column; - chunk->line_count += 1; - file_seq_n->total_line_count += 1; + RDIM_SrcFileLineMapFragment *f = push_array(scratch.arena, RDIM_SrcFileLineMapFragment, 1); + SLLQueuePush(file_seq_n->first_line_map_fragment, file_seq_n->last_line_map_fragment, f); + f->seq = seq; } + + // rjf: reset + first_line_seq_chunk = last_line_seq_chunk = 0; + total_line_seq_count = 0; + line_seq_src_file = 0; + MemoryZeroStruct(&vm_regs); + vm_regs.file_index = 1; + vm_regs.line = 1; + vm_regs.is_stmt = line_table_header->default_is_stmt; } - //- rjf: advance to next opcode - if(op_read_off > off) + //- rjf: emit lines + if(emit_line) { - next_off = op_read_off; + emit_line = 0; + LineSeqChunk *chunk = last_line_seq_chunk; + if(chunk == 0 || chunk->line_count >= chunk->line_cap) + { + chunk = push_array(scratch.arena, LineSeqChunk, 1); + SLLQueuePush(first_line_seq_chunk, last_line_seq_chunk, chunk); + chunk->line_cap = 64; + chunk->voffs = push_array(scratch.arena, U64, chunk->line_cap + 1); + chunk->line_nums = push_array(scratch.arena, U32, chunk->line_cap); + chunk->col_nums = push_array(scratch.arena, U16, 2*chunk->line_cap); + } + U64 chunk_line_idx = chunk->line_count; + chunk->voffs[chunk_line_idx] = vm_regs.address - base_vaddr; + chunk->line_nums[chunk_line_idx] = (U32)vm_regs.line; + chunk->col_nums[chunk_line_idx] = (U16)vm_regs.column; + chunk->line_count += 1; + total_line_seq_count += 1; + line_seq_src_file = src_file; + } + } + + scratch_end(scratch2); + } + lane_sync(); + + //- rjf: equip source files with their fragments + // + // TODO(rjf): this can *almost* be wide, but we are relying on a few top-level + // summations inside the RDIM_SrcFileChunkList when we push a sequence to a src + // file. if we just summed those later when baking (probably fine), then this + // could go wide across all src files, which would be very nice. just lane-0ing + // for now. when possible, we can probably do the same thing in PDB too. + // + if(lane_idx() == 0) + { + for EachIndex(unit_idx, unit_count) + { + FileSeqMap *file_seq_map = &unit_file_seq_maps[unit_idx]; + for EachIndex(slot_idx, file_seq_map->slots_count) + { + for(FileSeqNode *n = file_seq_map->slots[slot_idx]; n != 0; n = n->next) + { + for(RDIM_SrcFileLineMapFragment *f = n->first_line_map_fragment; f != 0; f = f->next) + { + rdim_src_file_push_line_sequence(arena, all_src_files, n->src_file, f->seq); + } + } } } } lane_sync(); - - //- rjf: collect all sequences - // - // TODO(rjf) } + //////////////////////////// + //- rjf: join all line tables + // + RDIM_LineTableChunkList *all_line_tables = 0; + if(lane_idx() == 0) + { + all_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, 1); + for EachIndex(unit_idx, unit_count) + { + rdim_line_table_chunk_list_concat_in_place(all_line_tables, &unit_line_table_chunk_lists[unit_idx]); + } + } + lane_sync_u64(&all_line_tables, 0); + //////////////////////////// //- rjf: fill result // From ccb1cd8f4d7ebb4b485c5619401392bcdbb3f49a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 23 Apr 2026 18:54:01 -0700 Subject: [PATCH 462/850] d2r2: built-in types, move rdi variadic type -> built-in --- src/lib_rdi/rdi.c | 4 ++-- src/lib_rdi/rdi.h | 10 ++++----- src/linker/rdi/rdi_builder.h | 2 +- src/mule/mule_main.cpp | 8 ++++++++ src/rdi/rdi.mdesk | 6 +++--- src/rdi_from_dwarf/rdi_from_dwarf.c | 2 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 29 +++++++++++++++++++++++++-- 7 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 9463e4aa..dcbb9c1d 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -203,6 +203,7 @@ case RDI_TypeKind_ComplexF128: {result = (RDI_U8*)"ComplexF128"; *size_out = siz case RDI_TypeKind_Decimal32: {result = (RDI_U8*)"Decimal32"; *size_out = sizeof("Decimal32")-1;}break; case RDI_TypeKind_Decimal64: {result = (RDI_U8*)"Decimal64"; *size_out = sizeof("Decimal64")-1;}break; case RDI_TypeKind_Decimal128: {result = (RDI_U8*)"Decimal128"; *size_out = sizeof("Decimal128")-1;}break; +case RDI_TypeKind_Variadic: {result = (RDI_U8*)"Variadic"; *size_out = sizeof("Variadic")-1;}break; case RDI_TypeKind_Modifier: {result = (RDI_U8*)"Modifier"; *size_out = sizeof("Modifier")-1;}break; case RDI_TypeKind_Ptr: {result = (RDI_U8*)"Ptr"; *size_out = sizeof("Ptr")-1;}break; case RDI_TypeKind_LRef: {result = (RDI_U8*)"LRef"; *size_out = sizeof("LRef")-1;}break; @@ -221,8 +222,7 @@ case RDI_TypeKind_IncompleteUnion: {result = (RDI_U8*)"IncompleteUnion"; *size_o case RDI_TypeKind_IncompleteClass: {result = (RDI_U8*)"IncompleteClass"; *size_out = sizeof("IncompleteClass")-1;}break; case RDI_TypeKind_IncompleteEnum: {result = (RDI_U8*)"IncompleteEnum"; *size_out = sizeof("IncompleteEnum")-1;}break; case RDI_TypeKind_Bitfield: {result = (RDI_U8*)"Bitfield"; *size_out = sizeof("Bitfield")-1;}break; -case RDI_TypeKind_Variadic: {result = (RDI_U8*)"Variadic"; *size_out = sizeof("Variadic")-1;}break; -case RDI_TypeKind_Count: {result = (RDI_U8*)"Count"; *size_out = sizeof("Count")-1;}break; +case RDI_TypeKind_COUNT: {result = (RDI_U8*)"COUNT"; *size_out = sizeof("COUNT")-1;}break; } return result; } diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index aadf6729..150dea81 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -315,6 +315,7 @@ RDI_TypeKind_ComplexF128 = 0x0025, RDI_TypeKind_Decimal32 = 0x0026, RDI_TypeKind_Decimal64 = 0x0027, RDI_TypeKind_Decimal128 = 0x0028, +RDI_TypeKind_Variadic = 0x0029, RDI_TypeKind_Modifier = 0x1000, RDI_TypeKind_Ptr = 0x1001, RDI_TypeKind_LRef = 0x1002, @@ -333,10 +334,9 @@ RDI_TypeKind_IncompleteUnion = 0x2006, RDI_TypeKind_IncompleteClass = 0x2007, RDI_TypeKind_IncompleteEnum = 0x2008, RDI_TypeKind_Bitfield = 0xF000, -RDI_TypeKind_Variadic = 0xF001, -RDI_TypeKind_Count = 0xF002, +RDI_TypeKind_COUNT = 0xF002, RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, -RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Decimal128, +RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Variadic, RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, @@ -810,6 +810,7 @@ X(ComplexF128)\ X(Decimal32)\ X(Decimal64)\ X(Decimal128)\ +X(Variadic)\ X(Modifier)\ X(Ptr)\ X(LRef)\ @@ -828,8 +829,7 @@ X(IncompleteUnion)\ X(IncompleteClass)\ X(IncompleteEnum)\ X(Bitfield)\ -X(Variadic)\ -X(Count)\ +X(COUNT)\ #define RDI_TypeModifierFlags_XList \ X(Const)\ diff --git a/src/linker/rdi/rdi_builder.h b/src/linker/rdi/rdi_builder.h index 38379683..09532d49 100644 --- a/src/linker/rdi/rdi_builder.h +++ b/src/linker/rdi/rdi_builder.h @@ -325,7 +325,7 @@ typedef struct RDIB_UDT enum { - RDI_TypeKindExt_Lo = RDI_TypeKind_Count, + RDI_TypeKindExt_Lo = RDI_TypeKind_COUNT, RDI_TypeKindExt_VirtualTable, RDI_TypeKindExt_StaticMethod, RDI_TypeKindExt_Members, diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 8c7d6b33..23948081 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -415,6 +415,12 @@ few_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){ typedef char MyByte; raddbg_type_view(MyByte *, no_string($)); +static void +variadic_params(char *fmt, ...) +{ + int x = 0; +} + static void type_coverage_eval_tests(void) { @@ -709,6 +715,8 @@ type_coverage_eval_tests(void) SizedKind sized_kind = SizedKind_C; + variadic_params("foo", 123, 456); + int x = (int)(Anonymous_D); } diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 6b16333b..88dbdfb8 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -759,7 +759,8 @@ RDI_TypeKindTable: {ComplexF128 0x0025 32 } {Decimal32 0x0026 4 } {Decimal64 0x0027 8 } - {Decimal128 0x0028 16 LastBuiltIn } + {Decimal128 0x0028 16 } + {Variadic 0x0029 0 LastBuiltIn } //- {Modifier 0x1000 0 FirstConstructed } {Ptr 0x1001 0 } @@ -781,8 +782,7 @@ RDI_TypeKindTable: {IncompleteEnum 0x2008 0 LastIncomplete LastUserDefined} //- {Bitfield 0xF000 0 } - {Variadic 0xF001 0 } - {Count 0xF002 0 } + {COUNT 0xF002 0 } } @table(name value) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 3592a309..875f6a9c 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -3004,7 +3004,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //////////////////////////////// - RDIM_Type *builtin_types[RDI_TypeKind_Count] = {0}; + RDIM_Type *builtin_types[RDI_TypeKind_COUNT] = {0}; for (RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) { RDIM_Type *type = rdim_type_chunk_list_push(arena, &g_d2r_shared.types, D2R_TYPE_CHUNK_CAP); type->kind = type_kind; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index d7b27092..f1b9176f 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -489,7 +489,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) unit_line_tables[unit_idx] = dst_line_table; //- rjf: set up per-unit file sequence map - unit_file_seq_maps[unit_idx].slots_count = line_table_header->files.count; + unit_file_seq_maps[unit_idx].slots_count = line_table_header->files.count + 1; unit_file_seq_maps[unit_idx].slots = push_array(scratch.arena, FileSeqNode *, unit_file_seq_maps[unit_idx].slots_count); //- rjf: set up vm registers @@ -705,7 +705,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //- rjf: sequence ended explicitly, or file change, or end of stream? -> push to line table - if(vm_regs.end_sequence || (src_file != line_seq_src_file && first_line_seq_chunk != 0) || off >= unit_line_table_data.size) + if(line_seq_src_file != 0 && (vm_regs.end_sequence || (src_file != line_seq_src_file && first_line_seq_chunk != 0) || off >= unit_line_table_data.size)) { // rjf: combine voffs/lines/cols U64 seq_line_count = total_line_seq_count; @@ -839,6 +839,30 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync_u64(&all_line_tables, 0); + //////////////////////////// + //- rjf: build built-in types + // + RDIM_TypeChunkList *builtin_types = 0; + RDIM_Type **builtin_type_from_kind_map = 0; // [RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1] + U64 builtin_type_count = RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1; + ProfScope("build built-in types") if(lane_idx() == 0) + { + builtin_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); + builtin_type_from_kind_map = push_array(scratch.arena, RDIM_Type *, builtin_type_count); + for(RDI_TypeKind k = RDI_TypeKind_FirstBuiltIn; k <= RDI_TypeKind_LastBuiltIn; k += 1) + { + RDIM_Type *type = rdim_type_chunk_list_push(arena, builtin_types, builtin_type_count); + type->kind = k; + type->name.str = rdi_string_from_type_kind(k, &type->name.size); + type->byte_size = rdi_size_from_basic_type_kind(k); + if(type->byte_size == max_U32) { type->byte_size = byte_size_from_arch(arch); } + builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] = type; + } + } + lane_sync_u64(&builtin_types, 0); + lane_sync_u64(&builtin_type_from_kind_map, 0); +#define d2r2_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_types[k - RDI_TypeKind_FirstBuiltIn] : 0) + //////////////////////////// //- rjf: fill result // @@ -847,6 +871,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // TODO(rjf) } +#undef d2r2_type_from_builtin_kind scratch_end(scratch); return result; } From 1f4c4af598c4207555afd99a0a7308451f3894f3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 24 Apr 2026 13:11:34 -0700 Subject: [PATCH 463/850] use compound initializers to define and drive obj generation --- src/base/base_strings.c | 2 +- src/base/base_strings.h | 1 + src/linker/base_ext/base_arrays.c | 9 + src/torture/torture.c | 144 +- src/torture/torture_main.c | 4 + src/torture/torture_radlink.c | 6261 +++++++++++++++-------------- 6 files changed, 3309 insertions(+), 3112 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index d327e952..254f15ef 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -2811,7 +2811,7 @@ str8_serial_push_size(Arena *arena, String8List *srl, U64 size) void *result = 0; if(size != 0) { - U8 *buf = push_array_no_zero(arena, U8, size); + U8 *buf = push_array(arena, U8, size); String8 *str = &srl->last->string; if(str->str + str->size == buf) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index dd078d8b..5f0c8359 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -162,6 +162,7 @@ internal U64 cstring32_length(U32 *c); #define str8_lit(S) str8((U8*)(S), sizeof(S) - 1) #define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,} +#define str8_lit_cstr(S) str8((U8*)(S), sizeof(S)) #define str8_varg(S) (int)((S).size), ((S).str) #define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C)) diff --git a/src/linker/base_ext/base_arrays.c b/src/linker/base_ext/base_arrays.c index 603c46b4..834f4540 100644 --- a/src/linker/base_ext/base_arrays.c +++ b/src/linker/base_ext/base_arrays.c @@ -247,6 +247,15 @@ s64_list_concat_in_place(S64List *list, S64List *to_concat) SLLConcatInPlace(list, to_concat); } +internal U64Array +u64_array_from_list(Arena *arena, U64List *list) +{ + U64Array result = {0}; + result.v = push_array(arena, U64, list->count); + for EachNode(n, U64Node, list->first) { result.v[result.count++] = n->data; } + return result; +} + internal S64Array s64_array_from_list(Arena *arena, S64List *list) { diff --git a/src/torture/torture.c b/src/torture/torture.c index 3eba1488..572de849 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -18,6 +18,12 @@ T_Test g_torture_tests[0xffffff]; // invoke global int g_last_exit_code; +internal String8 +t_test_name_from_idx(Arena *arena, U64 test_idx) +{ + return str8f(arena, "%s::%s", g_torture_tests[test_idx].group, g_torture_tests[test_idx].label); +} + internal char * t_string_from_result(T_RunStatus v) { @@ -416,6 +422,84 @@ t_test_is_before(void *raw_a, void *raw_b) return cmp < 0; } +internal String8List +t_file_paths_from_dir(Arena *arena, String8 dir) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List dirs = {0}; + String8List files = {0}; + + OS_FileIter *iter = os_file_iter_begin(scratch.arena, dir, 0); + OS_FileInfo file; + while (os_file_iter_next(scratch.arena, iter, &file)) { + if (file.props.flags & FilePropertyFlag_IsFolder) { + str8_list_pushf(scratch.arena, &dirs, "%S/%S", dir, file.name); + } else { + str8_list_pushf(arena, &files, "%S/%S", dir, file.name); + } + } + os_file_iter_end(iter); + + String8List result = {0}; + for EachNode(n, String8Node, dirs.first) { + String8List sub_result = t_file_paths_from_dir(arena, n->string); + str8_list_concat_in_place(&result, &sub_result); + } + + scratch_end(scratch); + //str8_list_concat_in_place(&result, &dirs); + str8_list_concat_in_place(&result, &files); + return result; +} + +internal int str8_is_before_case_ignore_case(void *a, void *b) { return str8_compar_ignore_case(a, b) < 0; } +internal void t_sort_str8_array(String8Array a) { radsort(a.v, a.count, str8_is_before_case_ignore_case); } + +internal B32 +t_match_folders(String8 a, String8 b) +{ + Temp scratch = scratch_begin(0,0); + String8List files_a = t_file_paths_from_dir(scratch.arena, a); + //for EachNode(n, String8Node, files_a.first) printf("%.*s\n", str8_varg(n->string)); + String8List files_b = t_file_paths_from_dir(scratch.arena, b); + B32 is_match = 0; + + String8Array sorted_a = str8_array_from_list(scratch.arena, &files_a); + String8Array sorted_b = str8_array_from_list(scratch.arena, &files_b); + t_sort_str8_array(sorted_a); + t_sort_str8_array(sorted_b); + + if (sorted_a.count == sorted_b.count) { + for EachIndex(i, sorted_a.count) { + Temp temp = temp_begin(scratch.arena); + String8 ext_a = str8_skip_last_dot(str8_skip_last_slash(sorted_a.v[i])); + String8 ext_b = str8_skip_last_dot(str8_skip_last_slash(sorted_b.v[i])); + if (str8_match(ext_a, ext_b, 0)) { + if (str8_match(ext_a, str8_lit("obj"), StringMatchFlag_CaseInsensitive) || + str8_match(ext_a, str8_lit("lib"), StringMatchFlag_CaseInsensitive)) { + String8 data_a = os_data_from_file_path(temp.arena, sorted_a.v[i]); + String8 data_b = os_data_from_file_path(temp.arena, sorted_b.v[i]); + is_match = str8_match(data_a, data_b, 0); + if ( ! is_match) { + OS_Handle h; + h = os_cmd_line_launchf("dumpbin /all %S /out:a.txt", sorted_a.v[i]); + os_process_join(h, max_U64, 0); + h = os_cmd_line_launchf("dumpbin /all %S /out:b.txt", sorted_b.v[i]); + os_process_join(h, max_U64, 0); + } + Assert(is_match); + if (!is_match) { break; } + } + } + else { InvalidPath; } + temp_end(temp); + } + } + + scratch_end(scratch); + return is_match; +} + internal void t_entry_point(CmdLine *cmdline) { @@ -446,6 +530,7 @@ t_entry_point(CmdLine *cmdline) fprintf(stderr, " Options:\n"); fprintf(stderr, " -linker:{path} Path to PE/COFF linker\n"); fprintf(stderr, " -target:{name[,name]} Selects targets to test\n"); + fprintf(stderr, " -skip:{name[,name]} Selects targets to skip\n"); fprintf(stderr, " -list Print available test targets and exit\n"); fprintf(stderr, " -out:{path} Directory path for test outputs (default \"%.*s\")\n", str8_varg(g_out)); fprintf(stderr, " -verbose Enable verbose mode\n"); @@ -542,7 +627,7 @@ t_entry_point(CmdLine *cmdline) for EachIndex(test_idx, g_torture_test_count) { String8 name = str8_cstring(g_torture_tests[test_idx].label); if (do_namespace) { - name = str8f(scratch.arena, "%s::%s", g_torture_tests[test_idx].group, g_torture_tests[test_idx].label); + name = t_test_name_from_idx(scratch.arena, test_idx); } if (str8_match_wildcard(name, pattern_n->string, 0)) { if ( ! hash_table_search_string(ht, name)) { @@ -609,21 +694,15 @@ t_entry_point(CmdLine *cmdline) { radsort(g_torture_tests, g_torture_test_count, t_test_is_before); - U64 target_indices_count; - U64 *target_indices; + U64List target_indices_list = {0}; if (target.node_count == 0) { - target_indices_count = g_torture_test_count; - target_indices = push_array(scratch.arena, U64, g_torture_test_count); - for EachIndex(i, target_indices_count) { target_indices[i] = i; } + for EachIndex(i, g_torture_test_count) { u64_list_push(scratch.arena, &target_indices_list, i); } } else { - target_indices_count = 0; - target_indices = push_array(scratch.arena, U64, target.node_count); - for EachNode(target_n, String8Node, target.first) { B32 is_target_unknown = 1; for EachIndex(i, g_torture_test_count) { if (str8_match(str8_cstring(g_torture_tests[i].label), target_n->string, 0)) { - target_indices[target_indices_count++] = i; + u64_list_push(scratch.arena, &target_indices_list, i); is_target_unknown = 0; break; } @@ -634,10 +713,36 @@ t_entry_point(CmdLine *cmdline) } } + // + // -skip + // + U64List final_target_list = {0}; + CmdLineOpt *skip_opt = cmd_line_opt_from_string(cmdline, str8_lit("skip")); + CmdLineOpt *s_opt = cmd_line_opt_from_string(cmdline, str8_lit("s")); + String8List skip_list = skip_opt ? skip_opt->value_strings : s_opt ? s_opt->value_strings : (String8List){0}; + for EachNode(n, U64Node, target_indices_list.first) { + // should test be skipped? + B32 include_test = 1; + String8 test_name = t_test_name_from_idx(scratch.arena, n->data); + for EachNode(pattern_n, String8Node, skip_list.first) { + if (str8_match_wildcard(test_name, pattern_n->string, 0)) { + include_test = 0; + break; + } + } + + if (include_test) { + u64_list_push(scratch.arena, &final_target_list, n->data); + } + } + + U64 skip_count = target_indices_list.count - final_target_list.count; + U64Array target_indices = u64_array_from_list(scratch.arena, &final_target_list); + U64 max_label_size = 0; U64 max_group_size = 0; - for EachIndex(i, target_indices_count) { - U64 test_idx = target_indices[i]; + for EachIndex(i, target_indices.count) { + U64 test_idx = target_indices.v[i]; max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[test_idx].label)); max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[test_idx].group)); } @@ -646,20 +751,20 @@ t_entry_point(CmdLine *cmdline) U64 pass_count = 0; U64 fail_count = 0; U64 crash_count = 0; - U64 max_digit_count = count_digits_u64(target_indices_count, 10); + U64 max_digit_count = count_digits_u64(target_indices.count, 10); U64 total_time_start = os_now_microseconds(); typedef struct { U64 target_idx, d; } Slowest; Slowest slowest[5] = {0}; for EachElement(i, slowest) { slowest[i].target_idx = max_U64; } - for EachIndex(i, target_indices_count) { - U64 target_idx = target_indices[i]; + for EachIndex(i, target_indices.count) { + U64 target_idx = target_indices.v[i]; // print run progress U64 dots_min = 10; U64 dots_count = (max_label_size - cstring8_length((U8*)g_torture_tests[target_idx].label)) + dots_min; U64 curr_digit_count = count_digits_u64(i+1, 10); int idx_align_space_count = (int)(max_digit_count - curr_digit_count); - fprintf(stdout, "[%.*s%I64u/%I64u] ", idx_align_space_count, spaces, i+1, target_indices_count); + fprintf(stdout, "[%.*s%I64u/%I64u] ", idx_align_space_count, spaces, i+1, target_indices.count); fprintf(stdout, "%s %.*s:: %s", g_torture_tests[target_idx].group, (int)(max_group_size - cstring8_length((U8*)g_torture_tests[target_idx].group)), spaces, g_torture_tests[target_idx].label); fprintf(stdout, " %.*s ", (int)dots_count, dots); @@ -732,9 +837,10 @@ t_entry_point(CmdLine *cmdline) PrintHeader("Summary"); U64 total_time_dt = total_time_end - total_time_start; String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); - fprintf(stderr, " Passed %u\n", (int)pass_count); - fprintf(stderr, " Failed %u\n", (int)fail_count); - fprintf(stderr, " Crashed %u\n", (int)crash_count); + fprintf(stderr, " Passed %llu\n", pass_count); + fprintf(stderr, " Failed %llu\n", fail_count); + fprintf(stderr, " Crashed %llu\n", crash_count); + fprintf(stderr, " Skipped %llu\n", skip_count); fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); fprintf(stderr, "\n"); diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 613fc496..bdc588c5 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -40,6 +40,7 @@ #include "coff/coff_lib_writer.h" #include "pe/pe.h" #include "pe/pe_section_flags.h" +#include "pe/pe_make_import_table.h" #include "elf/elf.h" #include "gnu/gnu.h" #include "gnu/gnu_parse.h" @@ -90,6 +91,7 @@ #include "linker/lnk_cmd_line.h" #include "linker/lnk_cmd_line.c" #include "linker/lnk_log.h" +#include "linker/lnk_debug_helper.h" #include "torture.h" #include "torture_radlink.h" @@ -113,6 +115,7 @@ #include "coff/coff_obj_writer.c" #include "coff/coff_lib_writer.c" #include "pe/pe.c" +#include "pe/pe_make_import_table.c" #include "elf/elf.c" #include "gnu/gnu.c" #include "gnu/gnu_parse.c" @@ -160,6 +163,7 @@ #include "linker/pdb_ext/pdb.c" #include "linker/pdb_ext/pdb_helpers.c" #include "linker/pdb_ext/pdb_builder.c" +#include "linker/lnk_debug_helper.c" #include "torture.c" #include "torture_base.c" diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index df945b0d..9c3e38ec 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -11,810 +11,367 @@ t_id_linker(void) return T_Linker_Null; } -internal COFF_ObjSection * -t_push_text_section(COFF_ObjWriter *obj_writer, String8 data) -{ - return coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_Align1Bytes, data); -} - -internal COFF_ObjSection * -t_push_data_section(COFF_ObjWriter *obj_writer, String8 data) -{ - return coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, data); -} - -internal COFF_ObjSection * -t_push_rdata_section(COFF_ObjWriter *obj_writer, String8 data) -{ - return coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS, data); -} - -internal COFF_ObjSection * -t_push_debug_s_section(COFF_ObjWriter *obj_writer, String8 data) -{ - return coff_obj_writer_push_section(obj_writer, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS, data); -} - //////////////////////////////// -// string -> COFF +// Def -> COFF -typedef enum T_COFF_TokenKind +#define T_COFF_DefSetMachine(v) &(COFF_MachineType){ COFF_MachineType_##v } +#define T_COFF_DefSetTimeStamp(v) &(COFF_TimeStamp){ v } +#define T_COFF_DefGetMachine(v) (v ? *v : COFF_MachineType_X64) +#define T_COFF_DefGetTimeStamp(v) (v ? *v : 0) + +typedef enum { - T_COFF_TokenKind_Null, - T_COFF_TokenKind_EOF, - T_COFF_TokenKind_String, - T_COFF_TokenKind_Number, - T_COFF_TokenKind_Ident, - T_COFF_TokenKind_Punct, -} T_COFF_TokenKind; + T_COFF_DefSymbol_Null, + T_COFF_DefSymbol_Extern, + T_COFF_DefSymbol_ExternFunc, + T_COFF_DefSymbol_Static, + T_COFF_DefSymbol_Secdef, + T_COFF_DefSymbol_Associative, + T_COFF_DefSymbol_Weak, + T_COFF_DefSymbol_Abs, + T_COFF_DefSymbol_Undef, + T_COFF_DefSymbol_UndefFunc, + T_COFF_DefSymbol_UndefSec, + T_COFF_DefSymbol_Sect, + T_COFF_DefSymbol_Common, +} T_COFF_DefSymbolType; -typedef struct T_COFF_Token +typedef struct { - T_COFF_TokenKind kind; - String8 string; - U8 punct; -} T_COFF_Token; + T_COFF_DefSymbolType type; + char *name; + char *section; + char *head; + char *associate; + char *tag; + U64 value; + U64 size; + COFF_ComdatSelectType selection; + COFF_WeakExtType characteristics; + COFF_SymStorageClass storage_class; +} T_COFF_DefSymbol; -typedef struct T_COFF_Parser +#define T_COFF_DefSymbol_Abs(name_, value_, storage_class_, ...) { .type = T_COFF_DefSymbol_Abs, .name = name_, .value = value_, .storage_class = storage_class_,##__VA_ARGS__ } +#define T_COFF_DefSymbol_AbsExtern(name_, value_, ...) T_COFF_DefSymbol_Abs(name_, value_, COFF_SymStorageClass_External, ## __VA_ARGS__) +#define T_COFF_DefSymbol_AbsStatic(name_, value_, ...) T_COFF_DefSymbol_Abs(name_, value_, COFF_SymStorageClass_Static , ## __VA_ARGS__) +#define T_COFF_DefSymbol_Associative(head_, associate_, ...) { .type = T_COFF_DefSymbol_Associative, .head = head_, .associate = associate_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_Common(name_, size_, ...) { .type = T_COFF_DefSymbol_Common, .name = name_, .size = size_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_Extern(name_, section_, value_, ...) { .type = T_COFF_DefSymbol_Extern, .name = name_, .section = section_, .value = value_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_ExternFunc(name_, section_, value_, ...) { .type = T_COFF_DefSymbol_ExternFunc, .name = name_, .section = section_, .value = value_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_Secdef(section_, selection_, ...) { .type = T_COFF_DefSymbol_Secdef, .section = section_, .selection = selection_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_Sect(name_, section_, ...) { .type = T_COFF_DefSymbol_Sect, .name = name_, .section = section_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_Static(name_, section_, value_, ...) { .type = T_COFF_DefSymbol_Static, .name = name_, .section = section_, .value = value_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_Undef(name_, ...) { .type = T_COFF_DefSymbol_Undef, .name = name_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_UndefFunc(name_, ...) { .type = T_COFF_DefSymbol_UndefFunc, .name = name_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_UndefSec(name_, value_, ...) { .type = T_COFF_DefSymbol_UndefSec, .name = name_, .value = value_ , ## __VA_ARGS__ } +#define T_COFF_DefSymbol_Weak(name_, characteristics_, tag_, ...) { .type = T_COFF_DefSymbol_Weak, .name = name_, .characteristics = characteristics_, .tag = tag_, ## __VA_ARGS__ } + +#define T_COFF_DefReloc_SetType(v) &(COFF_RelocType){ COFF_Reloc_##v } +#define T_COFF_DefReloc(type_, apply_off_, symbol_) { .type = T_COFF_DefReloc_SetType(type_), .apply_off = apply_off_, .symbol = symbol_ } +typedef struct { - String8 source; - U64 off; - T_COFF_Token token; -} T_COFF_Parser; + COFF_RelocType *type; + U64 apply_off; + char *symbol; +} T_COFF_DefReloc; -typedef struct T_COFF_IdNode +typedef struct { - struct T_COFF_IdNode *next; - String8 id; - void *ptr; -} T_COFF_IdNode; + char *id; + char *name; + String8 data; + char *flags; + COFF_SectionFlags raw_flags; + T_COFF_DefReloc *relocs; +} T_COFF_DefSection; -typedef struct T_COFF_IdMap +typedef struct { - Arena *arena; - T_COFF_IdNode *first; - T_COFF_IdNode *last; -} T_COFF_IdMap; + COFF_MachineType *machine; + COFF_TimeStamp *time_stamp; + T_COFF_DefSection *sections; + T_COFF_DefSymbol *symbols; + char **directives; + String8 path; +} T_COFF_DefObj; -typedef struct T_COFF_ObjParseCtx +typedef struct { - Arena *arena; - COFF_ObjWriter *writer; - T_COFF_IdMap sections; - T_COFF_IdMap symbols; - struct T_COFF_PendingRelocNode *pending_reloc_first; - struct T_COFF_PendingRelocNode *pending_reloc_last; -} T_COFF_ObjParseCtx; + char *dll; + char *name; + COFF_ImportByType import_by; + COFF_ImportType type; + U64 hit_or_ordinal; + COFF_TimeStamp *time_stamp; + COFF_MachineType *machine; +} T_COFF_DefImport; -typedef struct T_COFF_PendingRelocNode +typedef struct { - struct T_COFF_PendingRelocNode *next; - T_COFF_Parser parser; - String8 section_id; -} T_COFF_PendingRelocNode; + char *name; + COFF_MachineType *machine; + COFF_TimeStamp *time_stamp; +} T_COFF_DefDllImport; -internal B32 -t_coff_is_ident_start(U8 c) +typedef enum { - return char_is_alpha(c) || c == '_'; -} + T_COFF_DefLibMember_Null, + T_COFF_DefLibMember_Obj, + T_COFF_DefLibMember_Import, + T_COFF_DefLibMember_DllImportStatic, +} T_COFF_DefLibMemberType; -internal B32 -t_coff_is_ident_continue(U8 c) +typedef struct { - return char_is_alpha(c) || char_is_digit(c, 10) || c == '_'; -} + T_COFF_DefLibMemberType type; + union { + T_COFF_DefObj obj; + T_COFF_DefImport import; + T_COFF_DefDllImport dll_import; + }; +} T_COFF_DefLibMember; -internal void -t_coff_parser_skip_ws(T_COFF_Parser *parser) +typedef struct { - for (;;) { - while (parser->off < parser->source.size && char_is_space(parser->source.str[parser->off])) { - parser->off += 1; - } + U16 mode; + B32 emit_second_member; + T_COFF_DefLibMember *members; +} T_COFF_DefLib; - if (parser->off + 1 < parser->source.size && - parser->source.str[parser->off] == '/' && - parser->source.str[parser->off + 1] == '/') { - parser->off += 2; - while (parser->off < parser->source.size) { - U8 c = parser->source.str[parser->off]; - parser->off += 1; - if (c == '\n') { - break; - } - } - continue; - } - - break; - } -} - -internal void -t_coff_parser_next(T_COFF_Parser *parser) +typedef enum { - t_coff_parser_skip_ws(parser); - if (parser->off >= parser->source.size) { - parser->token.kind = T_COFF_TokenKind_EOF; - parser->token.string = str8_zero(); - parser->token.punct = 0; - return; - } + T_COFF_DefRootType_Null, + T_COFF_DefRootType_Obj, + T_COFF_DefRootType_Lib +} T_COFF_DefRootType; - U64 start = parser->off; - U8 c = parser->source.str[parser->off]; - if (c == '\'') { - parser->off += 1; - start = parser->off; - while (parser->off < parser->source.size && parser->source.str[parser->off] != '\'') { - parser->off += 1; - } - AssertAlways(parser->off < parser->source.size); - parser->token.kind = T_COFF_TokenKind_String; - parser->token.string = str8_substr(parser->source, rng_1u64(start, parser->off)); - parser->token.punct = 0; - parser->off += 1; - return; - } - - if (char_is_digit(c, 10)) { - parser->off += 1; - while (parser->off < parser->source.size) { - U8 d = parser->source.str[parser->off]; - if (!(char_is_alpha(d) || char_is_digit(d, 10) || d == '_')) { - break; - } - parser->off += 1; - } - parser->token.kind = T_COFF_TokenKind_Number; - parser->token.string = str8_substr(parser->source, rng_1u64(start, parser->off)); - parser->token.punct = 0; - return; - } - - if (t_coff_is_ident_start(c)) { - parser->off += 1; - while (parser->off < parser->source.size && t_coff_is_ident_continue(parser->source.str[parser->off])) { - parser->off += 1; - } - parser->token.kind = T_COFF_TokenKind_Ident; - parser->token.string = str8_substr(parser->source, rng_1u64(start, parser->off)); - parser->token.punct = 0; - return; - } - - switch (c) { - case '{': case '}': case '[': case ']': case ':': case ',': { - parser->token.kind = T_COFF_TokenKind_Punct; - parser->token.string = str8_zero(); - parser->token.punct = c; - parser->off += 1; - } break; - default: { - InvalidPath; - } break; - } -} - -internal B32 -t_coff_parser_accept_punct(T_COFF_Parser *parser, U8 punct) +typedef struct { - if (parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == punct) { - t_coff_parser_next(parser); - return 1; - } - return 0; -} - -internal void -t_coff_parser_require_punct(T_COFF_Parser *parser, U8 punct) -{ - AssertAlways(t_coff_parser_accept_punct(parser, punct)); -} - -internal String8 -t_coff_parser_require_name(T_COFF_Parser *parser) -{ - AssertAlways(parser->token.kind == T_COFF_TokenKind_String || parser->token.kind == T_COFF_TokenKind_Ident); - String8 result = parser->token.string; - t_coff_parser_next(parser); - return result; -} - -internal U64 -t_coff_parser_require_u64(T_COFF_Parser *parser) -{ - AssertAlways(parser->token.kind == T_COFF_TokenKind_Number || parser->token.kind == T_COFF_TokenKind_String); - U64 result = 0; - AssertAlways(try_u64_from_str8_c_rules(parser->token.string, &result)); - t_coff_parser_next(parser); - return result; -} - -internal void -t_coff_parse_object_begin(T_COFF_Parser *parser) -{ - t_coff_parser_require_punct(parser, '{'); -} - -internal B32 -t_coff_parse_object_next(T_COFF_Parser *parser, String8 *key_out) -{ - if (t_coff_parser_accept_punct(parser, '}')) { - return 0; - } - *key_out = t_coff_parser_require_name(parser); - t_coff_parser_require_punct(parser, ':'); - return 1; -} - -internal void -t_coff_parse_object_finish_field(T_COFF_Parser *parser) -{ - if (!(parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == '}')) { - t_coff_parser_require_punct(parser, ','); - } -} - -internal void -t_coff_parse_array_begin(T_COFF_Parser *parser) -{ - t_coff_parser_require_punct(parser, '['); -} - -internal B32 -t_coff_parse_array_next(T_COFF_Parser *parser) -{ - if (t_coff_parser_accept_punct(parser, ']')) { - return 0; - } - return 1; -} - -internal void -t_coff_parse_array_finish_item(T_COFF_Parser *parser) -{ - if (!(parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == ']')) { - t_coff_parser_require_punct(parser, ','); - } -} - -internal void -t_coff_skip_value(T_COFF_Parser *parser) -{ - if (parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == '{') { - t_coff_parse_object_begin(parser); - for (String8 key = {0}; t_coff_parse_object_next(parser, &key);) { - t_coff_skip_value(parser); - t_coff_parse_object_finish_field(parser); - } - } else if (parser->token.kind == T_COFF_TokenKind_Punct && parser->token.punct == '[') { - t_coff_parse_array_begin(parser); - for (;;) { - if (!t_coff_parse_array_next(parser)) break; - t_coff_skip_value(parser); - t_coff_parse_array_finish_item(parser); - } - } else { - t_coff_parser_next(parser); - } -} - -internal void -t_coff_id_map_insert(T_COFF_IdMap *map, String8 id, void *ptr) -{ - T_COFF_IdNode *node = push_array(map->arena, T_COFF_IdNode, 1); - node->id = push_str8_copy(map->arena, id); - node->ptr = ptr; - SLLQueuePush(map->first, map->last, node); -} - -internal void * -t_coff_id_map_find(T_COFF_IdMap *map, String8 id) -{ - for (T_COFF_IdNode *node = map->first; node != 0; node = node->next) { - if (str8_match(node->id, id, 0)) { - return node->ptr; - } - } - return 0; -} - -internal String8 -t_coff_parse_data_bytes(Arena *arena, T_COFF_Parser *parser) -{ - T_COFF_Parser probe = *parser; - U64 byte_count = 0; - t_coff_parse_array_begin(&probe); - for (;;) { - if (!t_coff_parse_array_next(&probe)) { - break; - } - U64 value = t_coff_parser_require_u64(&probe); - AssertAlways(value <= max_U8); - byte_count += 1; - t_coff_parse_array_finish_item(&probe); - } - - U8 *buffer = push_array(arena, U8, byte_count); - U64 idx = 0; - t_coff_parse_array_begin(parser); - for (;;) { - if (!t_coff_parse_array_next(parser)) { - break; - } - U64 value = t_coff_parser_require_u64(parser); - AssertAlways(value <= max_U8); - buffer[idx] = (U8)value; - idx += 1; - t_coff_parse_array_finish_item(parser); - } - AssertAlways(idx == byte_count); - return str8(buffer, byte_count); -} - -internal COFF_SectionFlags -t_coff_section_flag_from_name(String8 string) -{ - if (str8_match(string, str8_lit("type_no_pad"), 0)) return COFF_SectionFlag_TypeNoPad; - if (str8_match(string, str8_lit("cnt_code"), 0)) return COFF_SectionFlag_CntCode; - if (str8_match(string, str8_lit("cnt_init_data"), 0)) return COFF_SectionFlag_CntInitializedData; - if (str8_match(string, str8_lit("cnt_uninit_data"), 0)) return COFF_SectionFlag_CntUninitializedData; - if (str8_match(string, str8_lit("lnk_other"), 0)) return COFF_SectionFlag_LnkOther; - if (str8_match(string, str8_lit("lnk_info"), 0)) return COFF_SectionFlag_LnkInfo; - if (str8_match(string, str8_lit("lnk_remove"), 0)) return COFF_SectionFlag_LnkRemove; - if (str8_match(string, str8_lit("lnk_comdat"), 0)) return COFF_SectionFlag_LnkCOMDAT; - if (str8_match(string, str8_lit("gp_rel"), 0)) return COFF_SectionFlag_GpRel; - if (str8_match(string, str8_lit("mem_16bit"), 0)) return COFF_SectionFlag_Mem16Bit; - if (str8_match(string, str8_lit("mem_locked"), 0)) return COFF_SectionFlag_MemLocked; - if (str8_match(string, str8_lit("mem_preload"), 0)) return COFF_SectionFlag_MemPreload; - if (str8_match(string, str8_lit("align_1"), 0)) return COFF_SectionFlag_Align1Bytes; - if (str8_match(string, str8_lit("align_2"), 0)) return COFF_SectionFlag_Align2Bytes; - if (str8_match(string, str8_lit("align_4"), 0)) return COFF_SectionFlag_Align4Bytes; - if (str8_match(string, str8_lit("align_8"), 0)) return COFF_SectionFlag_Align8Bytes; - if (str8_match(string, str8_lit("align_16"), 0)) return COFF_SectionFlag_Align16Bytes; - if (str8_match(string, str8_lit("align_32"), 0)) return COFF_SectionFlag_Align32Bytes; - if (str8_match(string, str8_lit("align_64"), 0)) return COFF_SectionFlag_Align64Bytes; - if (str8_match(string, str8_lit("align_128"), 0)) return COFF_SectionFlag_Align128Bytes; - if (str8_match(string, str8_lit("align_256"), 0)) return COFF_SectionFlag_Align256Bytes; - if (str8_match(string, str8_lit("align_512"), 0)) return COFF_SectionFlag_Align512Bytes; - if (str8_match(string, str8_lit("align_1024"), 0)) return COFF_SectionFlag_Align1024Bytes; - if (str8_match(string, str8_lit("align_2048"), 0)) return COFF_SectionFlag_Align2048Bytes; - if (str8_match(string, str8_lit("align_4096"), 0)) return COFF_SectionFlag_Align4096Bytes; - if (str8_match(string, str8_lit("align_8192"), 0)) return COFF_SectionFlag_Align8192Bytes; - if (str8_match(string, str8_lit("lnk_nreloc_ovfl"), 0)) return COFF_SectionFlag_LnkNRelocOvfl; - if (str8_match(string, str8_lit("mem_discardable"), 0)) return COFF_SectionFlag_MemDiscardable; - if (str8_match(string, str8_lit("mem_not_cached"), 0)) return COFF_SectionFlag_MemNotCached; - if (str8_match(string, str8_lit("mem_not_paged"), 0)) return COFF_SectionFlag_MemNotPaged; - if (str8_match(string, str8_lit("mem_shared"), 0)) return COFF_SectionFlag_MemShared; - if (str8_match(string, str8_lit("mem_execute"), 0)) return COFF_SectionFlag_MemExecute; - if (str8_match(string, str8_lit("mem_read"), 0)) return COFF_SectionFlag_MemRead; - if (str8_match(string, str8_lit("mem_write"), 0)) return COFF_SectionFlag_MemWrite; - InvalidPath; - return 0; -} - -internal COFF_SectionFlags -t_coff_parse_section_flags(T_COFF_Parser *parser) -{ - if (parser->token.kind == T_COFF_TokenKind_Number) { - return safe_cast_u32(t_coff_parser_require_u64(parser)); - } - if (parser->token.kind == T_COFF_TokenKind_String || parser->token.kind == T_COFF_TokenKind_Ident) { - String8 name = t_coff_parser_require_name(parser); - if (str8_match(name, str8_lit("code"), 0)) return PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_Align1Bytes; - if (str8_match(name, str8_lit("data"), 0)) return PE_DATA_SECTION_FLAGS; - if (str8_match(name, str8_lit("rdata"), 0)) return PE_RDATA_SECTION_FLAGS; - if (str8_match(name, str8_lit("bss"), 0)) return PE_BSS_SECTION_FLAGS; - return t_coff_section_flag_from_name(name); - } - - COFF_SectionFlags flags = 0; - t_coff_parse_array_begin(parser); - for (;;) { - if (!t_coff_parse_array_next(parser)) { - break; - } - flags |= t_coff_section_flag_from_name(t_coff_parser_require_name(parser)); - t_coff_parse_array_finish_item(parser); - } - return flags; -} - -internal COFF_ComdatSelectType -t_coff_comdat_select_from_string(String8 string) -{ - if (str8_match(string, str8_lit("null"), 0)) return COFF_ComdatSelect_Null; - if (str8_match(string, str8_lit("no_duplicates"), 0)) return COFF_ComdatSelect_NoDuplicates; - if (str8_match(string, str8_lit("any"), 0)) return COFF_ComdatSelect_Any; - if (str8_match(string, str8_lit("same_size"), 0)) return COFF_ComdatSelect_SameSize; - if (str8_match(string, str8_lit("exact_match"), 0)) return COFF_ComdatSelect_ExactMatch; - if (str8_match(string, str8_lit("associative"), 0)) return COFF_ComdatSelect_Associative; - if (str8_match(string, str8_lit("largest"), 0)) return COFF_ComdatSelect_Largest; - InvalidPath; - return 0; -} - -internal COFF_WeakExtType -t_coff_weak_type_from_string(String8 string) -{ - if (str8_match(string, str8_lit("null"), 0)) return COFF_WeakExt_Null; - if (str8_match(string, str8_lit("no_library"), 0)) return COFF_WeakExt_NoLibrary; - if (str8_match(string, str8_lit("search_library"), 0)) return COFF_WeakExt_SearchLibrary; - if (str8_match(string, str8_lit("search_alias"), 0)) return COFF_WeakExt_SearchAlias; - if (str8_match(string, str8_lit("anti_dependency"), 0)) return COFF_WeakExt_AntiDependency; - InvalidPath; - return 0; -} - -internal COFF_SymStorageClass -t_coff_storage_class_from_string(String8 string) -{ - if (str8_match(string, str8_lit("external"), 0)) return COFF_SymStorageClass_External; - if (str8_match(string, str8_lit("static"), 0)) return COFF_SymStorageClass_Static; - if (str8_match(string, str8_lit("section"), 0)) return COFF_SymStorageClass_Section; - if (str8_match(string, str8_lit("weak_external"), 0)) return COFF_SymStorageClass_WeakExternal; - InvalidPath; - return 0; -} - -internal COFF_ImportByType -t_coff_import_by_from_string(String8 string) -{ - if (str8_match(string, str8_lit("ordinal"), 0)) return COFF_ImportBy_Ordinal; - if (str8_match(string, str8_lit("name"), 0)) return COFF_ImportBy_Name; - if (str8_match(string, str8_lit("name_no_prefix"), 0)) return COFF_ImportBy_NameNoPrefix; - if (str8_match(string, str8_lit("undecorate"), 0)) return COFF_ImportBy_Undecorate; - InvalidPath; - return 0; -} - -internal COFF_RelocType -t_coff_x64_reloc_type_from_string(String8 string) -{ - if (str8_match(string, str8_lit("abs"), 0)) return COFF_Reloc_X64_Abs; - if (str8_match(string, str8_lit("addr64"), 0)) return COFF_Reloc_X64_Addr64; - if (str8_match(string, str8_lit("addr32"), 0)) return COFF_Reloc_X64_Addr32; - if (str8_match(string, str8_lit("addr32nb"), 0)) return COFF_Reloc_X64_Addr32Nb; - if (str8_match(string, str8_lit("rel"), 0) || str8_match(string, str8_lit("rel32"), 0)) return COFF_Reloc_X64_Rel32; - if (str8_match(string, str8_lit("section"), 0)) return COFF_Reloc_X64_Section; - if (str8_match(string, str8_lit("secrel"), 0)) return COFF_Reloc_X64_SecRel; - if (str8_match(string, str8_lit("token"), 0)) return COFF_Reloc_X64_Token; - if (str8_match(string, str8_lit("pair"), 0)) return COFF_Reloc_X64_Pair; - InvalidPath; - return 0; -} + T_COFF_DefRootType type; + union { + T_COFF_DefObj obj; + T_COFF_DefLib lib; + }; +} T_COFF_DefRoot; internal COFF_ObjSection * -t_coff_require_section(T_COFF_IdMap *map, String8 id) +t_coff_from_def_require_section(HashTable *section_ht, String8 id) { - COFF_ObjSection *section = t_coff_id_map_find(map, id); - AssertAlways(section != 0); - return section; + COFF_ObjSection *result = hash_table_search_string_raw(section_ht, id); + AssertAlways(result != 0); + return result; } internal COFF_ObjSymbol * -t_coff_require_symbol(T_COFF_IdMap *map, String8 id) +t_coff_from_def_require_symbol(HashTable *symbol_ht, String8 id) { - COFF_ObjSymbol *symbol = t_coff_id_map_find(map, id); - AssertAlways(symbol != 0); - return symbol; + COFF_ObjSymbol *result = hash_table_search_string_raw(symbol_ht, id); + AssertAlways(result != 0); + return result; } -internal void -t_coff_enqueue_section_relocs(T_COFF_ObjParseCtx *ctx, T_COFF_Parser parser, String8 section_id) +internal COFF_SectionFlags +t_coff_section_flags_from_cstr(char *v) { - T_COFF_PendingRelocNode *node = push_array(ctx->arena, T_COFF_PendingRelocNode, 1); - node->parser = parser; - node->section_id = push_str8_copy(ctx->arena, section_id); - SLLQueuePush(ctx->pending_reloc_first, ctx->pending_reloc_last, node); -} - -internal void -t_coff_parse_obj_section(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) -{ - String8 id = {0}; - String8 name = {0}; - String8 data = {0}; - COFF_SectionFlags flags = 0; - T_COFF_Parser relocs_parser = {0}; - B32 has_relocs = 0; - - t_coff_parse_object_begin(parser); - for (String8 key = {0}; t_coff_parse_object_next(parser, &key); t_coff_parse_object_finish_field(parser)) { - if (str8_match(key, str8_lit("id"), 0)) { id = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("name"), 0)) { name = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("flags"), 0)) { flags = t_coff_parse_section_flags(parser); } - else if (str8_match(key, str8_lit("data"), 0)) { data = t_coff_parse_data_bytes(ctx->arena, parser); } - else if (str8_match(key, str8_lit("relocs"), 0)) { - relocs_parser = *parser; - t_coff_skip_value(parser); - has_relocs = 1; - } - else { InvalidPath; } - } - - // must be defined: - AssertAlways(name.size); - AssertAlways(id.size); - - t_coff_id_map_insert(&ctx->sections, id, coff_obj_writer_push_section(ctx->writer, name, flags, data)); - if (has_relocs) { - t_coff_enqueue_section_relocs(ctx, relocs_parser, id); - } -} - -internal void -t_coff_parse_obj_symbol(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser, String8 default_kind) -{ - String8 kind = default_kind; - String8 name = {0}; - String8 section_id = {0}; - String8 head = {0}; - String8 associate = {0}; - String8 tag = {0}; - U32 value = 0; - U32 size = 0; - COFF_ComdatSelectType selection = COFF_ComdatSelect_Null; - COFF_WeakExtType characteristics = COFF_WeakExt_Null; - COFF_SymStorageClass storage_class = COFF_SymStorageClass_External; - - t_coff_parse_object_begin(parser); - for (String8 key = {0}; t_coff_parse_object_next(parser, &key);) { - if (str8_match(key, str8_lit("kind"), 0 )) { kind = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("name"), 0 )) { name = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("value"), 0 )) { value = safe_cast_u32(t_coff_parser_require_u64(parser)); } - else if (str8_match(key, str8_lit("size"), 0 )) { size = safe_cast_u32(t_coff_parser_require_u64(parser)); } - else if (str8_match(key, str8_lit("section"), 0 )) { section_id = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("head"), 0 )) { head = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("associate"), 0 )) { associate = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("selection"), 0 )) { selection = t_coff_comdat_select_from_string(t_coff_parser_require_name(parser)); } - else if (str8_match(key, str8_lit("characteristics"), 0 )) { characteristics = t_coff_weak_type_from_string(t_coff_parser_require_name(parser)); } - else if (str8_match(key, str8_lit("tag"), 0 )) { tag = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("storage_class"), 0 )) { storage_class = t_coff_storage_class_from_string(t_coff_parser_require_name(parser)); } - else InvalidPath; - t_coff_parse_object_finish_field(parser); - } - - COFF_ObjSymbol *symbol = 0; - if (str8_match(kind, str8_lit("extern_func"), 0 )) { symbol = coff_obj_writer_push_symbol_extern_func(ctx->writer, name, value, t_coff_require_section(&ctx->sections, section_id)); } - else if (str8_match(kind, str8_lit("extern"), 0 )) { symbol = coff_obj_writer_push_symbol_extern (ctx->writer, name, value, t_coff_require_section(&ctx->sections, section_id)); } - else if (str8_match(kind, str8_lit("static"), 0 )) { symbol = coff_obj_writer_push_symbol_static (ctx->writer, name, value, t_coff_require_section(&ctx->sections, section_id)); } - else if (str8_match(kind, str8_lit("secdef"), 0 )) { symbol = coff_obj_writer_push_symbol_secdef (ctx->writer, t_coff_require_section(&ctx->sections, section_id), selection); } - else if (str8_match(kind, str8_lit("associative"), 0 )) { symbol = coff_obj_writer_push_symbol_associative(ctx->writer, t_coff_require_section(&ctx->sections, head), t_coff_require_section(&ctx->sections, associate)); } - else if (str8_match(kind, str8_lit("weak"), 0 )) { symbol = coff_obj_writer_push_symbol_weak (ctx->writer, name, characteristics, t_coff_require_symbol(&ctx->symbols, tag)); } - else if (str8_match(kind, str8_lit("abs"), 0 )) { symbol = coff_obj_writer_push_symbol_abs (ctx->writer, name, value, storage_class); } - else if (str8_match(kind, str8_lit("undef"), 0 )) { symbol = coff_obj_writer_push_symbol_undef (ctx->writer, name); } - else if (str8_match(kind, str8_lit("undef_func"), 0 )) { symbol = coff_obj_writer_push_symbol_undef_func (ctx->writer, name); } - else if (str8_match(kind, str8_lit("undef_sect"), 0 )) { symbol = coff_obj_writer_push_symbol_undef_sect (ctx->writer, name, value); } - else if (str8_match(kind, str8_lit("sect"), 0 )) { symbol = coff_obj_writer_push_symbol_sect (ctx->writer, name, t_coff_require_section(&ctx->sections, section_id)); } - else if (str8_match(kind, str8_lit("common"), 0 )) { symbol = coff_obj_writer_push_symbol_common (ctx->writer, name, size); } - else { InvalidPath; } - - if (name.size) { - t_coff_id_map_insert(&ctx->symbols, name, symbol); - } -} - -internal void -t_coff_parse_obj_reloc(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser, String8 default_kind, String8 implicit_section_id) -{ - String8 kind = default_kind; - String8 section_id = implicit_section_id; - String8 symbol_id = {0}; - String8 type_name = {0}; - U32 apply_off = 0; - t_coff_parse_object_begin(parser); - for (String8 key = {0}; t_coff_parse_object_next(parser, &key); t_coff_parse_object_finish_field(parser)) { - if (str8_match(key, str8_lit("kind"), 0)) { kind = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("section"), 0)) { section_id = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("symbol"), 0)) { symbol_id = t_coff_parser_require_name(parser); } - else if (str8_match(key, str8_lit("apply_off"), 0)) { apply_off = safe_cast_u32(t_coff_parser_require_u64(parser)); } - else if (str8_match(key, str8_lit("type"), 0)) { type_name = t_coff_parser_require_name(parser); } - else { InvalidPath; } - } - - switch (ctx->writer->machine) { - case COFF_MachineType_Unknown: break; - case COFF_MachineType_X64: { - COFF_ObjSection *section = t_coff_require_section(&ctx->sections, section_id); - COFF_ObjSymbol *symbol = t_coff_require_symbol(&ctx->symbols, symbol_id); - if (str8_match(kind, str8_lit("generic"), 0) || str8_match(kind, str8_lit("reloc"), 0)) { - coff_obj_writer_section_push_reloc(ctx->writer, section, apply_off, symbol, t_coff_x64_reloc_type_from_string(type_name)); - } else if (str8_match(kind, str8_lit("rel32"), 0)) { - coff_obj_writer_section_push_reloc_rel32(ctx->writer, section, apply_off, symbol); - } else if (str8_match(kind, str8_lit("addr32"), 0)) { - coff_obj_writer_section_push_reloc_addr32(ctx->writer, section, apply_off, symbol); - } else if (str8_match(kind, str8_lit("addr"), 0) || str8_match(kind, str8_lit("addr64"), 0)) { - coff_obj_writer_section_push_reloc_addr(ctx->writer, section, apply_off, symbol); - } else if (str8_match(kind, str8_lit("voff"), 0) || str8_match(kind, str8_lit("addr32nb"), 0)) { - coff_obj_writer_section_push_reloc_voff(ctx->writer, section, apply_off, symbol); - } else { - InvalidPath; - } - } break; - } -} - -internal void -t_coff_parse_obj_directive(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) -{ - String8 value = {0}; - if (parser->token.kind == T_COFF_TokenKind_String || parser->token.kind == T_COFF_TokenKind_Ident) { - value = t_coff_parser_require_name(parser); - } else { - t_coff_parse_object_begin(parser); - for (;;) { - String8 key = {0}; - if (!t_coff_parse_object_next(parser, &key)) break; - if (str8_match(key, str8_lit("value"), 0)) value = t_coff_parser_require_name(parser); - else InvalidPath; - t_coff_parse_object_finish_field(parser); + COFF_SectionFlags f = 0; + for (char *p = v; p && *p; ++p) { + switch (*p) { + case 'r': f |= COFF_SectionFlag_MemRead; break; + case 'w': f |= COFF_SectionFlag_MemWrite; break; + case 'x': f |= COFF_SectionFlag_MemExecute; break; + case ':': { + char *type_begin = p + 1; + char *type_end = type_begin; + for (; *type_end && *type_end != '@'; ++type_end) {} + String8 type = str8((U8 *)type_begin, (U64)(type_end - type_begin)); + if (str8_match(type, str8_lit("bss"), StringMatchFlag_CaseInsensitive)) { + f |= COFF_SectionFlag_CntUninitializedData; + } else if (str8_match(type, str8_lit("data"), StringMatchFlag_CaseInsensitive)) { + f |= COFF_SectionFlag_CntInitializedData; + } else if (str8_match(type, str8_lit("code"), StringMatchFlag_CaseInsensitive)) { + f |= COFF_SectionFlag_CntCode; + } + p = type_end - 1; + } break; + case '@': { + char *align_begin = p + 1; + char *align_end = align_begin; + for (; char_is_digit(*align_end, 10); ++align_end) {} + AssertAlways(align_end > align_begin); + U64 align = u64_from_str8(str8((U8 *)align_begin, (U64)(align_end - align_begin)), 10); + COFF_SectionFlags align_flags = coff_section_flag_from_align_size(align); + AssertAlways(align_flags != 0); + f |= align_flags; + p = align_end - 1; + } break; + default: AssertAlways(0 && "unknown flag"); break; } } - coff_obj_writer_push_directive(ctx->writer, value); -} - -internal void -t_coff_parse_obj_sections(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) -{ - t_coff_parse_array_begin(parser); - for (;;) { - if (!t_coff_parse_array_next(parser)) break; - t_coff_parse_obj_section(ctx, parser); - t_coff_parse_array_finish_item(parser); - } -} - -internal void -t_coff_parse_obj_symbols(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) -{ - t_coff_parse_array_begin(parser); - for (;;) { - if (!t_coff_parse_array_next(parser)) break; - t_coff_parse_obj_symbol(ctx, parser, str8_zero()); - t_coff_parse_array_finish_item(parser); - } -} - -internal void -t_coff_parse_obj_directives(T_COFF_ObjParseCtx *ctx, T_COFF_Parser *parser) -{ - t_coff_parse_array_begin(parser); - for (;;) { - if (!t_coff_parse_array_next(parser)) break; - t_coff_parse_obj_directive(ctx, parser); - t_coff_parse_array_finish_item(parser); - } + return f; } internal String8 -t_coff_parse_obj(Arena *arena, T_COFF_Parser *parser) +t_coff_from_def_obj(Arena *arena, T_COFF_DefObj obj) { - T_COFF_ObjParseCtx ctx = { - .arena = arena, - .writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown), - .sections.arena = arena, - .symbols.arena = arena - }; + Temp scratch = scratch_begin(&arena, 1); + HashTable *section_ht = hash_table_init(scratch.arena, 1000); + HashTable *symbol_ht = hash_table_init(scratch.arena, 1000); + COFF_ObjWriter *writer = coff_obj_writer_alloc(T_COFF_DefGetTimeStamp(obj.time_stamp), T_COFF_DefGetMachine(obj.machine)); - t_coff_parse_object_begin(parser); - for (String8 key = {0}; t_coff_parse_object_next(parser, &key); t_coff_parse_object_finish_field(parser)) { - if (str8_match(key, str8_lit("machine"), 0)) { ctx.writer->machine = coff_machine_from_string(t_coff_parser_require_name(parser)); } - else if (str8_match(key, str8_lit("time_stamp"), 0)) { ctx.writer->time_stamp = safe_cast_u32(t_coff_parser_require_u64(parser)); } - else if (str8_match(key, str8_lit("sections"), 0)) { t_coff_parse_obj_sections(&ctx, parser); } - else if (str8_match(key, str8_lit("symbols"), 0)) { t_coff_parse_obj_symbols(&ctx, parser); } - else if (str8_match(key, str8_lit("directives"), 0)) { t_coff_parse_obj_directives(&ctx, parser); } - else { InvalidPath; } + // push sections + for (T_COFF_DefSection *section = obj.sections; section && section->id != 0; ++section) { + String8 id = str8_cstring(section->id); + String8 name = str8_cstring(section->name); + if (hash_table_search_string_raw(section_ht, id) == 0) { + COFF_SectionFlags flags = section->raw_flags; + flags |= t_coff_section_flags_from_cstr(section->flags); + COFF_ObjSection *sect = coff_obj_writer_push_section(writer, name, flags, section->data); + hash_table_push_string_raw(scratch.arena, section_ht, id, sect); + } else { + AssertAlways(!"error: identifier is already reserved"); + } } - String8 result = coff_obj_writer_serialize(arena, ctx.writer); - coff_obj_writer_release(&ctx.writer); + // push directives + for (char **dir = obj.directives; dir && *dir; ++dir) { + coff_obj_writer_push_directive(writer, str8_cstring(*dir)); + } + + // push symbols + for (T_COFF_DefSymbol *symbol = obj.symbols; symbol && symbol->type != 0; ++symbol) { + String8 name = str8_cstring(symbol->name); + String8 section = str8_cstring(symbol->section); + String8 head = str8_cstring(symbol->head); + String8 associate = str8_cstring(symbol->associate); + String8 tag = str8_cstring(symbol->tag); + + COFF_ObjSymbol *ptr = 0; + switch (symbol->type) { + case T_COFF_DefSymbol_ExternFunc: { ptr = coff_obj_writer_push_symbol_extern_func(writer, name, safe_cast_u32(symbol->value), t_coff_from_def_require_section(section_ht, section)); } break; + case T_COFF_DefSymbol_Extern: { ptr = coff_obj_writer_push_symbol_extern (writer, name, safe_cast_u32(symbol->value), t_coff_from_def_require_section(section_ht, section)); } break; + case T_COFF_DefSymbol_Static: { ptr = coff_obj_writer_push_symbol_static (writer, name, safe_cast_u32(symbol->value), t_coff_from_def_require_section(section_ht, section)); } break; + case T_COFF_DefSymbol_Secdef: { ptr = coff_obj_writer_push_symbol_secdef (writer, t_coff_from_def_require_section(section_ht, section), symbol->selection); } break; + case T_COFF_DefSymbol_Associative: { ptr = coff_obj_writer_push_symbol_associative(writer, t_coff_from_def_require_section(section_ht, head), t_coff_from_def_require_section(section_ht, associate)); } break; + case T_COFF_DefSymbol_Weak: { ptr = coff_obj_writer_push_symbol_weak (writer, name, symbol->characteristics, t_coff_from_def_require_symbol(symbol_ht, tag)); } break; + case T_COFF_DefSymbol_Abs: { ptr = coff_obj_writer_push_symbol_abs (writer, name, safe_cast_u32(symbol->value), symbol->storage_class); } break; + case T_COFF_DefSymbol_Undef: { ptr = coff_obj_writer_push_symbol_undef (writer, name); } break; + case T_COFF_DefSymbol_UndefFunc: { ptr = coff_obj_writer_push_symbol_undef_func (writer, name); } break; + case T_COFF_DefSymbol_UndefSec: { ptr = coff_obj_writer_push_symbol_undef_sect (writer, name, safe_cast_u32(symbol->value)); } break; + case T_COFF_DefSymbol_Sect: { ptr = coff_obj_writer_push_symbol_sect (writer, name, t_coff_from_def_require_section(section_ht, section)); } break; + case T_COFF_DefSymbol_Common: { ptr = coff_obj_writer_push_symbol_common (writer, name, safe_cast_u32(symbol->size)); } break; + default: { InvalidPath; } break; + } + + if (name.size != 0) { + if (hash_table_search_string_raw(symbol_ht, name) == 0) { + hash_table_push_string_raw(scratch.arena, symbol_ht, name, ptr); + } else { + AssertAlways(!"error: identifier is already reserved"); + } + } + } + + // push relocs + for (T_COFF_DefSection *section = obj.sections; section && section->id != 0; ++section) { + COFF_ObjSection *sect = t_coff_from_def_require_section(section_ht, str8_cstring(section->id)); + for (T_COFF_DefReloc *reloc = section->relocs; reloc && reloc->type != 0; ++reloc) { + COFF_ObjSymbol *symbol = t_coff_from_def_require_symbol(symbol_ht, str8_cstring(reloc->symbol)); + coff_obj_writer_section_push_reloc(writer, sect, safe_cast_u32(reloc->apply_off), symbol, *reloc->type); + } + } + + String8 result = coff_obj_writer_serialize(arena, writer); + coff_obj_writer_release(&writer); + scratch_end(scratch); return result; } internal String8 -t_coff_parse_lib(Arena *arena, T_COFF_Parser *parser) +t_coff_from_def_lib(Arena *arena, T_COFF_DefLib lib) { - COFF_TimeStamp time_stamp = 0; - U16 mode = 0; - B32 emit_second_member = 1; - COFF_LibWriter *writer = coff_lib_writer_alloc(); + COFF_LibWriter *writer = coff_lib_writer_alloc(); + COFF_TimeStamp time_stamp = 0; - t_coff_parse_object_begin(parser); - for (String8 key = {0}; t_coff_parse_object_next(parser, &key); t_coff_parse_object_finish_field(parser)) { - if (str8_match(key, str8_lit("time_stamp"), 0)) { - time_stamp = safe_cast_u32(t_coff_parser_require_u64(parser)); - } else if (str8_match(key, str8_lit("mode"), 0)) { - mode = safe_cast_u16(t_coff_parser_require_u64(parser)); - } else if (str8_match(key, str8_lit("emit_second_member"), 0)) { - emit_second_member = !!t_coff_parser_require_u64(parser); - } else if (str8_match(key, str8_lit("import"), 0)) { - String8 dll_name = {0}; - String8 name = {0}; - COFF_ImportByType import_by = COFF_ImportBy_Name; - U16 hint_or_ordinal = 0; - COFF_ImportType type = COFF_ImportHeader_Code; - t_coff_parse_object_begin(parser); - for (String8 field = {0}; t_coff_parse_object_next(parser, &field); t_coff_parse_object_finish_field(parser)) { - if (str8_match(field, str8_lit("dll_name"), 0)) { dll_name = t_coff_parser_require_name(parser); } - else if (str8_match(field, str8_lit("name"), 0)) { name = t_coff_parser_require_name(parser); } - else if (str8_match(field, str8_lit("import_by"), 0)) { import_by = t_coff_import_by_from_string(t_coff_parser_require_name(parser)); } - else if (str8_match(field, str8_lit("hint_or_ordinal"), 0)) { hint_or_ordinal = safe_cast_u16(t_coff_parser_require_u64(parser)); } - else if (str8_match(field, str8_lit("type"), 0)) { type = coff_import_header_type_from_string(t_coff_parser_require_name(parser)); } - else { InvalidPath; } - } - coff_lib_writer_push_import(writer, COFF_MachineType_X64, time_stamp, dll_name, import_by, name, hint_or_ordinal, type); - } else if (str8_match(key, str8_lit("obj"), 0)) { - String8 path = {0}; - String8 data = {0}; - t_coff_parse_object_begin(parser); - for (String8 field = {0}; t_coff_parse_object_next(parser, &field); t_coff_parse_object_finish_field(parser)) { - if (str8_match(field, str8_lit("path"), 0)) path = t_coff_parser_require_name(parser); - else if (str8_match(field, str8_lit("data"), 0)) data = t_coff_parse_obj(arena, parser); - else InvalidPath; - } + for (T_COFF_DefLibMember *member = lib.members; member && member->type != 0; ++member) { + switch (member->type) { + case T_COFF_DefLibMember_Obj: + { + T_COFF_DefObj obj = member->obj; + String8 path = obj.path.size == 0 ? push_str8f(arena, "member_%llu.obj", (U64)(member - lib.members)) : obj.path; + String8 data = t_coff_from_def_obj(arena, obj); coff_lib_writer_push_obj(writer, path, data); - } else { - InvalidPath; + } break; + case T_COFF_DefLibMember_Import: + { + T_COFF_DefImport import = member->import; + coff_lib_writer_push_import(writer, + T_COFF_DefGetMachine(import.machine), + T_COFF_DefGetTimeStamp(import.time_stamp), + str8_cstring(import.dll), + import.import_by, + str8_cstring(import.name), + safe_cast_u16(import.hit_or_ordinal), + import.type); + } break; + case T_COFF_DefLibMember_DllImportStatic: { + String8 dll_name = str8_chop_last_dot(str8_cstring(member->dll_import.name)); + String8 null_import_debug = lnk_make_linker_debug_symbols(writer->arena, T_COFF_DefGetMachine(member->dll_import.machine)); + String8 import_entry_obj = pe_make_import_entry_obj(writer->arena, + dll_name, + T_COFF_DefGetTimeStamp(member->dll_import.time_stamp), + T_COFF_DefGetMachine(member->dll_import.machine), + null_import_debug); + String8 null_import_obj = pe_make_null_import_descriptor_obj(writer->arena, + T_COFF_DefGetTimeStamp(member->dll_import.time_stamp), + T_COFF_DefGetMachine(member->dll_import.machine), + null_import_debug); + String8 null_thunk_obj = pe_make_null_thunk_data_obj(writer->arena, + dll_name, + T_COFF_DefGetTimeStamp(member->dll_import.time_stamp), + T_COFF_DefGetMachine(member->dll_import.machine), + null_import_debug); + coff_lib_writer_push_obj(writer, dll_name, import_entry_obj); + coff_lib_writer_push_obj(writer, dll_name, null_import_obj); + coff_lib_writer_push_obj(writer, dll_name, null_thunk_obj); + } break; + case T_COFF_DefLibMember_Null: break; + default: InvalidPath; break; } } - String8 result = coff_lib_writer_serialize(arena, writer, time_stamp, mode, emit_second_member); + String8 result = coff_lib_writer_serialize(arena, writer, time_stamp, lib.mode, lib.emit_second_member); coff_lib_writer_release(&writer); return result; } internal String8 -t_coff_parse_root(Arena *arena, T_COFF_Parser *parser) +t_coff_from_def_root(Arena *arena, T_COFF_DefRoot root) { - String8 root_name = t_coff_parser_require_name(parser); - t_coff_parser_require_punct(parser, ':'); - if (str8_match(root_name, str8_lit("obj"), 0)) { return t_coff_parse_obj(arena, parser); } - if (str8_match(root_name, str8_lit("lib"), 0)) { return t_coff_parse_lib(arena, parser); } + switch (root.type) { + case T_COFF_DefRootType_Obj: return t_coff_from_def_obj(arena, root.obj); + case T_COFF_DefRootType_Lib: return t_coff_from_def_lib(arena, root.lib); + case T_COFF_DefRootType_Null: break; + default: { NotImplemented; } break; + } return str8_zero(); } -internal String8 -t_coff_from_string(Arena *arena, String8 string) +internal B32 +t_write_def_obj(char *path, T_COFF_DefObj obj) { - T_COFF_Parser parser = { .source = string }; - t_coff_parser_next(&parser); - String8 result = t_coff_parse_root(arena, &parser); - if (parser.token.kind == T_COFF_TokenKind_Punct && parser.token.punct == '}') { - t_coff_parser_next(&parser); - } - AssertAlways(parser.token.kind == T_COFF_TokenKind_EOF); - return result; + Temp scratch = scratch_begin(0,0); + B32 is_ok = t_write_file(str8_cstring(path), t_coff_from_def_obj(scratch.arena, obj)); + scratch_end(scratch); + return is_ok; } -internal String8 -t_coff_lib_from_string(Arena *arena, String8 string) +internal B32 +t_write_def_lib(char *path, T_COFF_DefLib lib) { - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "'lib': {"); - str8_list_push(scratch.arena, &list, string); - str8_list_pushf(scratch.arena, &list, "}"); - String8 wrapped = str8_list_join(scratch.arena, &list, &(StringJoin){ .sep = str8_lit("\n") }); - String8 result = t_coff_from_string(arena, wrapped); + Temp scratch = scratch_begin(0,0); + B32 is_ok = t_write_file(str8_cstring(path), t_coff_from_def_lib(scratch.arena, lib)); scratch_end(scratch); - return result; -} - -internal String8 -t_coff_obj_from_string(Arena *arena, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - str8_list_pushf(scratch.arena, &list, "'obj': {"); - str8_list_push(scratch.arena, &list, string); - str8_list_pushf(scratch.arena, &list, "}"); - String8 wrapped = str8_list_join(scratch.arena, &list, &(StringJoin){ .sep = str8_lit("\n") }); - String8 result = t_coff_from_string(arena, wrapped); - scratch_end(scratch); - return result; + return is_ok; } //////////////////////////////// @@ -822,40 +379,43 @@ t_coff_obj_from_string(Arena *arena, String8 string) internal String8 t_make_sec_defn_obj(Arena *arena, String8 payload) { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *mysect_section = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes, payload); - coff_obj_writer_push_symbol_secdef(obj_writer, mysect_section, COFF_ComdatSelect_Null); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - return obj; + return t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "mysect", ".mysect", payload, .flags = "r:data@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("mysect", COFF_ComdatSelect_Null), + {0} + } + }); } internal String8 t_make_obj_with_directive(Arena *arena, String8 directive) { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_directive(cow, directive); - String8 obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - return obj; + String8 directive_cstr = push_cstr(arena, directive); + return t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .directives = (char *[]){ (char *)directive_cstr.str, 0 } + }); } internal String8 t_make_entry_obj(Arena *arena) { - /* - "machine": "x64", - "sectab": [ ".text": [ "alias: "entry", "data": [ 0xc3 ] ] ] - "symtab" : [ { "name": "entry", "section": "entry", "offset": "100", "type": "extern" } ] - */ - - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - return obj; + return t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xc3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]) { + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + }); } internal B32 @@ -875,42 +435,44 @@ t_write_entry_obj(void) TEST(machine_compat_check) { // unknown.obj - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown); - t_push_data_section(obj_writer, str8_lit("unknown")); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("unknown.obj"), obj)); - } + T_Ok(t_write_def_obj("unknown.obj", (T_COFF_DefObj){ + .machine = &(COFF_MachineType){ COFF_MachineType_Unknown }, + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("unknown"), .flags = "rw:data" }, + {0} + } + })); // x64.obj - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - t_push_data_section(obj_writer, str8_lit("x64")); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("x64.obj"), obj)); - } + T_Ok(t_write_def_obj("x64.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("x64"), .flags = "rw:data" }, + {0} + } + })); // entry.obj - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xc3"), .flags = "rx:code" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); // arm64.obj - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Arm64); - t_push_data_section(obj_writer, str8_lit("arm64")); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("arm64.obj"), obj)); - } + T_Ok(t_write_def_obj("arm64.obj", (T_COFF_DefObj){ + .machine = &(COFF_MachineType){ COFF_MachineType_Arm64 }, + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("arm64"), .flags = "rw:data" }, + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj unknown.obj x64.obj"); T_Ok(g_last_exit_code == 0); @@ -930,13 +492,19 @@ TEST(simple_link_test) String8 main_obj; { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text_payload)); - coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_lit("qwe")); - coff_obj_writer_push_section(obj_writer, str8_lit(".zero"), PE_BSS_SECTION_FLAGS, str8(0, 5)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - main_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); + main_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_array_fixed(text_payload), .flags = "rx:code" }, + { "data", ".data", str8_lit("qwe"), .flags = "rw:data" }, + { "zero", ".zero", str8(0, 5), .flags = "rw:bss" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + }); } String8 main_obj_name = str8_lit("main.obj"); @@ -1007,11 +575,17 @@ TEST(out_of_bounds_section_number) { // bad.obj { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *foo = coff_obj_writer_push_section(obj_writer, str8_lit(".foo"), PE_DATA_SECTION_FLAGS, str8_lit("foo")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, foo); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); + String8 obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "foo", ".foo", str8_lit("foo"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("foo", "foo", 0), + {0} + } + }); { COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj); String8 string_table = str8_substr(obj, header.string_table_range); @@ -1025,17 +599,26 @@ TEST(out_of_bounds_section_number) // entry.obj { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); + String8 obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00\xC3"), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "foo"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("foo"), + {0} + } + }); T_Ok(t_write_file(str8_lit("entry.obj"), obj)); } @@ -1046,13 +629,13 @@ TEST(out_of_bounds_section_number) TEST(merge) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_DATA_SECTION_FLAGS, str8_lit("hello, world")); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("test.obj"), obj)); - } + T_Ok(t_write_def_obj("test.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "test", ".test", str8_lit("hello, world"), .flags = "rw:data" }, + {0} + } + })); T_Ok(t_write_entry_obj()); @@ -1128,31 +711,34 @@ TEST(merge) TEST(link_undef) { - String8 undef_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); - undef_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("undef.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("undef"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("undef.obj"), undef_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00\xC3"), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "undef"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("undef"), + {0} + } + })); // try linking unresolved symbol and see if linker picks up on that t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj"); @@ -1161,26 +747,25 @@ TEST(link_undef) TEST(link_unref_undef) { - String8 undef_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("undef")); - undef_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("undef.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("undef"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("undef.obj"), undef_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xc3"), .flags = "rx:code" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + })); // try linking unreferenced unresolved symbol, this must link t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj"); @@ -1189,33 +774,39 @@ TEST(link_unref_undef) TEST(weak_lib_vs_weak_lib) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchLibrary, "q"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchLibrary, "e"), + {0} + } + })); // linker must pick weak symbol from a.obj t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj entry.obj"); @@ -1254,33 +845,39 @@ TEST(weak_lib_vs_weak_lib) TEST(weak_lib_vs_weak_nolib) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_NoLibrary, "q"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchLibrary, "e"), + {0} + } + })); // linker must pick weak symbol from entry.obj t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); @@ -1302,33 +899,39 @@ TEST(weak_lib_vs_weak_nolib) TEST(weak_lib_vs_weak_alias) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchAlias, "q"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchLibrary, "e"), + {0} + } + })); // linker must pick weak symbol from entry.obj t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); @@ -1337,33 +940,39 @@ TEST(weak_lib_vs_weak_alias) TEST(weak_lib_vs_weak_antidep) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "q"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchLibrary, "e"), + {0} + } + })); // linker must pick weak symbol from a.obj t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); @@ -1385,42 +994,47 @@ TEST(weak_lib_vs_weak_antidep) TEST(weak_alias_vs_weak_alias) { - String8 a; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *qwe = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("qwe"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("sym"), COFF_WeakExt_SearchAlias, qwe); - a = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("qwe", 0x111), + T_COFF_DefSymbol_Weak("sym", COFF_WeakExt_SearchAlias, "qwe"), + {0} + } + })); - String8 b; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *ewq = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("ewq"), 0x222, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("sym"), COFF_WeakExt_SearchAlias, ewq); - b = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("ewq", 0x222), + T_COFF_DefSymbol_Weak("sym", COFF_WeakExt_SearchAlias, "ewq"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("sym")); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a)); - T_Ok(t_write_file(str8_lit("b.obj"), b)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "sym"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("sym"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); @@ -1428,33 +1042,39 @@ TEST(weak_alias_vs_weak_alias) TEST(weak_alias_vs_weak_lib) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "q"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" + "\xC3" + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchAlias, "e"), + {0} + } + })); // linker must pick weak symbol from entry.obj t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); @@ -1476,33 +1096,39 @@ TEST(weak_alias_vs_weak_lib) TEST(weak_alias_vs_weak_nolib) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_NoLibrary, "q"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" + "\xC3" + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchAlias, "e"), + {0} + } + })); // linker must pick weak symbol from entry.obj t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); @@ -1524,33 +1150,39 @@ TEST(weak_alias_vs_weak_nolib) TEST(weak_alias_vs_weak_antidep) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "q"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" + "\xC3" + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchAlias, "e"), + {0} + } + })); // linker must pick weak symbol from entry.obj t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); @@ -1572,33 +1204,34 @@ TEST(weak_alias_vs_weak_antidep) TEST(weak_nolib_vs_weak_nolib) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_NoLibrary, "q"), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_NoLibrary, "e"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == 0); @@ -1619,33 +1252,34 @@ TEST(weak_nolib_vs_weak_nolib) TEST(weak_nolib_vs_weak_lib) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchLibrary, "q"), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_NoLibrary, "e"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == 0); @@ -1666,33 +1300,34 @@ TEST(weak_nolib_vs_weak_lib) TEST(weak_nolib_vs_weak_alias) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchAlias, "q"), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_NoLibrary, "e"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); @@ -1700,33 +1335,34 @@ TEST(weak_nolib_vs_weak_alias) TEST(weak_nolib_vs_weak_antidep) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "q"), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_NoLibrary, "e"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == 0); @@ -1747,33 +1383,34 @@ TEST(weak_nolib_vs_weak_antidep) TEST(weak_antidep_vs_weak_antidep) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "q"), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "e"), + {0} + } + })); // linker must pick weak symbol from a.obj t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj entry.obj"); @@ -1812,33 +1449,34 @@ TEST(weak_antidep_vs_weak_antidep) TEST(weak_antidep_vs_weak_nolib) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_NoLibrary, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_NoLibrary, "q"), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "e"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == 0); @@ -1859,33 +1497,34 @@ TEST(weak_antidep_vs_weak_nolib) TEST(weak_antidep_vs_weak_lib) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchLibrary, "q"), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "e"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == 0); @@ -1906,33 +1545,34 @@ TEST(weak_antidep_vs_weak_lib) TEST(weak_antidep_vs_weak_alias) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("q"), 0x111, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchAlias, q); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("e"), 0x222, COFF_SymStorageClass_External); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_AntiDependency, e); - coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("q", 0x111), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchAlias, "q"), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 3, "w"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_AbsExtern("e", 0x222), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_AntiDependency, "e"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj"); T_Ok(g_last_exit_code == 0); @@ -1953,42 +1593,39 @@ TEST(weak_antidep_vs_weak_alias) TEST(weak_vs_common) { - String8 weak_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); - COFF_ObjSymbol *sect_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("_a"), 0, sect); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("w"), COFF_WeakExt_SearchLibrary, sect_symbol); - weak_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 common_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_common(obj_writer, str8_lit("w"), 2); - common_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("w")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("weak.obj"), weak_obj)); - T_Ok(t_write_file(str8_lit("common.obj"), common_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("weak.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ { "a", ".a", str8_lit("a"), .flags = "rw:data" }, {0} }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Static("_a", "a", 0), + T_COFF_DefSymbol_Weak("w", COFF_WeakExt_SearchLibrary, "_a"), + {0} + } + })); + T_Ok(t_write_def_obj("common.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Common("w", 2), {0} } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ T_COFF_DefReloc(X64_Addr32Nb, 0, "w"), {0} } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("w"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe common.obj weak.obj entry.obj"); T_Ok(g_last_exit_code == 0); @@ -2012,32 +1649,34 @@ TEST(abs_vs_weak) U32 abs_value = 0x123; U8 text_code[] = { 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3 }; - String8 abs_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), abs_value, COFF_SymStorageClass_External); - abs_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("abs.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("foo", abs_value), + {0}, + } + })); - String8 text_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - COFF_ObjSection *mydata = coff_obj_writer_push_section(obj_writer, str8_lit(".mydata"), COFF_SectionFlag_CntCode|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_Align1Bytes, str8_lit("mydata")); - COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("mydata"), 0, mydata); - COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("foo"), COFF_WeakExt_NoLibrary, tag); - - COFF_ObjSection *text = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), COFF_SectionFlag_CntCode|COFF_SectionFlag_MemExecute|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes, str8_array_fixed(text_code)); - coff_obj_writer_section_push_reloc(obj_writer, text, 2, foo, COFF_Reloc_X64_Addr64); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text); - - text_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("abs.obj"), abs_obj)); - T_Ok(t_write_file(str8_lit("text.obj"), text_obj)); + T_Ok(t_write_def_obj("text.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "mydata", ".mydata", str8_lit("mydata"), .flags = "rx:code@1" }, + { + "text", ".text", str8_array_fixed(text_code), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr64, 2, "foo"), + {0}, + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("mydata", "mydata", 0), + T_COFF_DefSymbol_Weak("foo", COFF_WeakExt_NoLibrary, "mydata"), + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe abs.obj text.obj"); T_Ok(g_last_exit_code == 0); @@ -2068,39 +1707,42 @@ TEST(abs_vs_regular) U8 regular_payload[] = { 0xC0, 0xFF, 0xEE }; String8 regular_obj_name = str8_lit("regular.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(regular_payload)); - coff_obj_writer_push_symbol_extern(obj_writer, shared_symbol_name, 0, data_sect); - String8 regular_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(regular_obj_name, regular_obj)); - } + + T_Ok(t_write_def_obj("regular.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ { "data", ".data", str8_array_fixed(regular_payload), .flags = "rw:data" }, {0}, }, + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Extern("foo", "data", 0), {0}, } + })); String8 abs_obj_name = str8_lit("abs.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External); - String8 abs_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(abs_obj_name, abs_obj)); - } + T_Ok(t_write_def_obj("abs.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_AbsExtern("foo", 0x1234), {0}, } + })); U8 entry_text[] = { 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm 0xC3 // ret }; String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - COFF_ObjSymbol *shared_symbol = coff_obj_writer_push_symbol_undef(obj_writer, shared_symbol_name); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, shared_symbol, COFF_Reloc_X64_Addr32Nb); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_array_fixed(entry_text), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "foo"), + {0}, + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + T_COFF_DefSymbol_Undef("foo"), + {0}, + } + })); // TODO: validate that linker issues multiply defined symbol error t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe abs.obj regular.obj entry.obj"); @@ -2117,33 +1759,25 @@ TEST(abs_vs_common) String8 shared_symbol_name = str8_lit("foo"); String8 common_obj_name = str8_lit("common.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_common(obj_writer, shared_symbol_name, 321); - String8 common_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(common_obj_name, common_obj)); - } + + T_Ok(t_write_def_obj("common.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Common("foo", 321), {0}, } + })); String8 abs_obj_name = str8_lit("abs.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External); - String8 abs_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(abs_obj_name, abs_obj)); - } + T_Ok(t_write_def_obj("abs.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_AbsExtern("foo", 0x1234), {0}, } + })); U8 entry_text[] = { 0xC3 }; String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ { "text", ".text", str8_array_fixed(entry_text), .flags = "rx:code@1" }, {0}, }, + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Extern("my_entry", "text", 0), {0}, } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe abs.obj common.obj entry.obj"); if (g_last_exit_code == 0) { @@ -2159,24 +1793,14 @@ TEST(abs_vs_common) TEST(abs_vs_abs) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), 'a', COFF_SymStorageClass_External); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 b_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("foo"), 'b', COFF_SymStorageClass_External); - b_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_AbsExtern("foo", 'a'), {0}, }, + })); + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_AbsExtern("foo", 'b'), {0}, }, + })); T_Ok(t_write_entry_obj()); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); @@ -2185,28 +1809,30 @@ TEST(abs_vs_abs) TEST(undef_weak_lib) { - String8 weak; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSymbol *b = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("b"), 0xc3000000, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("a"), COFF_WeakExt_SearchLibrary, b); - weak = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("weak.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("b", 0xc3000000), + T_COFF_DefSymbol_Weak("a", COFF_WeakExt_SearchLibrary, "b"), + {0} + } + })); - String8 entry; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("a")); - U8 text[4] = {0}; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, sym); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry = coff_obj_writer_serialize(arena, obj_writer); - } - - T_Ok(t_write_file(str8_lit("weak.obj"), weak)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ T_COFF_DefReloc(X64_Addr32Nb, 0, "a"), {0} } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("a"), + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0}, + } + })); // undefined symbol must always replace weak symbol with search library t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry entry.obj weak.obj"); @@ -2217,51 +1843,42 @@ TEST(undef_weak_search_alias) { Temp scratch = scratch_begin(0,0); - String8 weak_obj; - { - U8 weak_payload[] = { 0xDE, 0xAD, 0xBE, 0xEF }; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *weak_sect = t_push_data_section(obj_writer, str8_array_fixed(weak_payload)); - COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("ptr")); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("foo"), COFF_WeakExt_SearchAlias, tag); - weak_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("weak.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ { "data", ".data", str8_lit_comp("\xde\xad\xbe\xef"), .flags = "rw:data" }, {0} }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("ptr"), + T_COFF_DefSymbol_Weak("foo", COFF_WeakExt_SearchAlias, "ptr"), + {0} + } + })); - String8 ptr_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("entry")); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("ptr"), COFF_WeakExt_SearchAlias, tag); - ptr_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("ptr.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("entry"), + T_COFF_DefSymbol_Weak("ptr", COFF_WeakExt_SearchAlias, "entry"), + {0} + } + })); - String8 undef_obj; - { - U8 undef_obj_payload[] = { 0x00, 0x00, 0x00, 0x00 }; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *undef_sect = t_push_data_section(obj_writer, str8_array_fixed(undef_obj_payload)); - COFF_ObjSymbol *undef_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); - coff_obj_writer_section_push_reloc(obj_writer, undef_sect, 0, undef_symbol, COFF_Reloc_X64_Addr32Nb); - undef_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("undef.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "data", ".data", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rw:data", + .relocs = (T_COFF_DefReloc[]){ T_COFF_DefReloc(X64_Addr32Nb, 0, "foo"), {0} } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Undef("foo"), {0} } + })); - String8 entry_obj; - { - U8 entry_payload[] = {0xC3}; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("weak.obj"), weak_obj)); - T_Ok(t_write_file(str8_lit("ptr.obj"), ptr_obj)); - T_Ok(t_write_file(str8_lit("undef.obj"), undef_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, {0} }, + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Extern("entry", "text", 0), {0} } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe weak.obj entry.obj ptr.obj undef.obj"); T_Ok(g_last_exit_code == 0); @@ -2270,35 +1887,33 @@ TEST(undef_weak_search_alias) TEST(weak_cycle) { String8 ab_obj_name = str8_lit("ab.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *b = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("B")); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("A"), COFF_WeakExt_SearchAlias, b); - String8 ab_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(ab_obj_name, ab_obj)); - } + + T_Ok(t_write_def_obj("ab.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("B"), + T_COFF_DefSymbol_Weak("A", COFF_WeakExt_SearchAlias, "B"), + {0}, + } + })); String8 ba_obj_name = str8_lit("ba.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *a = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("A")); - coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("B"), COFF_WeakExt_SearchAlias, a); - String8 ba_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(ba_obj_name, ba_obj)); - } + T_Ok(t_write_def_obj("ba.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("A"), + T_COFF_DefSymbol_Weak("B", COFF_WeakExt_SearchAlias, "A"), + {0}, + } + })); String8 entry_obj_name = str8_lit("entry.obj"); U8 entry_payload[] = { 0xC3 }; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ { "text", ".text", str8_array_fixed(entry_payload), .flags = "rx:code@1" }, {0} }, + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Extern("my_entry", "text", 0), {0} } + })); U64 timeout = os_now_microseconds() + 3 * 1000 * 1000; // give a generous 3 seconds t_invoke_linker_timeoutf(timeout, "/subsystem:console /entry:my_entry %S %S %S", entry_obj_name, ab_obj_name, ba_obj_name); @@ -2308,32 +1923,32 @@ TEST(weak_tag) { U32 weak_tag_expected_value = 0x12345678; String8 weak_tag_obj_name = str8_lit("weak_tag.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *tag_symbol = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("abs"), weak_tag_expected_value, COFF_SymStorageClass_Static); - COFF_ObjSymbol *weak_first = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("strong_first"), COFF_WeakExt_SearchAlias, tag_symbol); - COFF_ObjSymbol *weak_second = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit("strong_second"), COFF_WeakExt_SearchAlias, weak_first); - U8 sect_data[4] = {0}; - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(sect_data)); - coff_obj_writer_section_push_reloc(obj_writer, sect, 0, weak_second, COFF_Reloc_X64_Addr32); - - String8 weak_tag_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(weak_tag_obj_name, weak_tag_obj)); - } + T_Ok(t_write_def_obj("weak_tag.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "data", ".data", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rw:data", + .relocs = (T_COFF_DefReloc[]){ T_COFF_DefReloc(X64_Addr32, 0, "strong_second"), {0} } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsStatic("abs", weak_tag_expected_value), + T_COFF_DefSymbol_Weak("strong_first", COFF_WeakExt_SearchAlias, "abs"), + T_COFF_DefSymbol_Weak("strong_second", COFF_WeakExt_SearchAlias, "strong_first"), + {0} + } + })); String8 entry_name = str8_lit("my_entry"); U8 entry_text[] = { 0xC3 }; String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ { "text", ".text", str8_array_fixed(entry_text), .flags = "rx:code@1" }, {0} }, + .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Extern((char *)entry_name.str, "text", 0), {0} } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe %S %S", weak_tag_obj_name, entry_obj_name); T_Ok(g_last_exit_code == 0); @@ -2351,27 +1966,28 @@ TEST(weak_tag) TEST(undef_section) { - String8 main_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - U8 data[] = { 0, 0, 0, 0 }; - COFF_ObjSection *data_section = t_push_data_section(obj_writer, str8_array_fixed(data)); - COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".mysect"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead); - coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr32Nb); - - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_section = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_section); - - main_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - U8 payload[] = { 1, 2, 3 }; String8 sec_defn_obj = t_make_sec_defn_obj(arena, str8_array_fixed(payload)); - t_write_file(str8_lit("main.obj"), main_obj); + T_Ok(t_write_def_obj("main.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "data", ".data", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rw:data", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, ".mysect"), + {0} + } + }, + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_UndefSec(".mysect", COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead), + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj"); @@ -2396,33 +2012,34 @@ TEST(undef_section) TEST(sect_symbol) { String8 sect_payload = str8_lit("hello, world"); - String8 sect_obj_name = str8_lit("sect.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect$1"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, sect_payload); - coff_obj_writer_push_directive(obj_writer, str8_lit("/merge:.mysect=.data")); - String8 sect_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(sect_obj_name, sect_obj)); - } + T_Ok(t_write_def_obj("sect.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "mysect1", ".mysect$1", sect_payload, .flags = "rw:data@1" }, + {0} + }, + .directives = (char *[]){ "/merge:.mysect=.data", 0 } + })); - String8 main_obj_name = str8_lit("main.obj"); - { - U8 data[8] = {0}; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(data)); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".mysect$2222"), PE_DATA_SECTION_FLAGS); - coff_obj_writer_section_push_reloc_addr(obj_writer, sect, 0, symbol); - - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - - String8 main_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - - T_Ok(t_write_file(main_obj_name, main_obj)); - } + T_Ok(t_write_def_obj("main.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "data", ".data", str8_lit_comp("\x00\x00\x00\x00\x00\x00\x00\x00"), .flags = "rw:data", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr64, 0, ".mysect$2222"), + {0} + } + }, + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_UndefSec(".mysect$2222", t_coff_section_flags_from_cstr("rw:data")), + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sect.obj"); T_Ok(g_last_exit_code == 0); @@ -2449,28 +2066,28 @@ TEST(sect_symbol) TEST(undef_reloc_section) { - String8 main_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_section = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *my_entry_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_section); - - U8 data[8] = { 0 }; - COFF_ObjSection *data_section = t_push_data_section(obj_writer, str8_array_fixed(data)); - COFF_ObjSymbol *foo = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(".reloc"), PE_RELOC_SECTION_FLAGS); - coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr64); - - main_obj = coff_obj_writer_serialize(arena, obj_writer); - - coff_obj_writer_release(&obj_writer); - } - U8 payload[] = { 1, 2, 3 }; String8 sec_defn_obj = t_make_sec_defn_obj(arena, str8_array_fixed(payload)); - T_Ok(t_write_file(str8_lit("main.obj"), main_obj)); + T_Ok(t_write_def_obj("main.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code" }, + { + "data", ".data", str8_lit_comp("\x00\x00\x00\x00\x00\x00\x00\x00"), .flags = "rw:data", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr64, 0, ".reloc"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + T_COFF_DefSymbol_UndefSec(".reloc", PE_RELOC_SECTION_FLAGS), + {0} + } + })); T_Ok(t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj)); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj"); @@ -2499,32 +2116,33 @@ TEST(find_merged_pdata) PE_IntelPdata intel_pdata = {0}; U8 text_payload[] = { 0xC3 }; - String8 main_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *xdata = coff_obj_writer_push_section(obj_writer, str8_lit(".xdata"), COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_Align4Bytes, str8_array_fixed(xdata_payload)); - COFF_ObjSection *pdata = coff_obj_writer_push_section(obj_writer, str8_lit(".pdata"), COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_Align4Bytes, str8_struct(&intel_pdata)); - COFF_ObjSection *foobar = coff_obj_writer_push_section(obj_writer, str8_lit(".foobar"), COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode|COFF_SectionFlag_Align1Bytes, str8_array_fixed(foobar_payload)); - COFF_ObjSection *text = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode|COFF_SectionFlag_Align1Bytes, str8_array_fixed(text_payload)); - - COFF_ObjSymbol *foobar_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("foobar"), 0, foobar); - - coff_obj_writer_push_symbol_secdef(obj_writer, xdata, COFF_ComdatSelect_Null); - COFF_ObjSymbol *unwind_foobar = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("$unwind$foobar"), 0, xdata); - - coff_obj_writer_push_symbol_secdef(obj_writer, pdata, COFF_ComdatSelect_Null); - coff_obj_writer_push_symbol_static(obj_writer, str8_lit("$pdata$foobar"), 0, pdata); - - coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_unwind_info), unwind_foobar, COFF_Reloc_X64_Addr32Nb); - coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_first), foobar_symbol, COFF_Reloc_X64_Addr32Nb); - coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_one_past_last), foobar_symbol, COFF_Reloc_X64_Addr32Nb); - - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text); - main_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("main.obj"), main_obj)); + T_Ok(t_write_def_obj("main.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "xdata", ".xdata", str8_array_fixed(xdata_payload), .flags = "r:data@4" }, + { + "pdata", ".pdata", str8_struct(&intel_pdata), .flags = "r:data@4", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, OffsetOf(PE_IntelPdata, voff_unwind_info), "$unwind$foobar"), + T_COFF_DefReloc(X64_Addr32Nb, OffsetOf(PE_IntelPdata, voff_first), "foobar"), + T_COFF_DefReloc(X64_Addr32Nb, OffsetOf(PE_IntelPdata, voff_one_past_last), "foobar"), + {0} + } + }, + { "foobar", ".foobar", str8_array_fixed(foobar_payload), .flags = "rx:code@1" }, + { "text", ".text", str8_array_fixed(text_payload), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Static("foobar", "foobar", 0), + T_COFF_DefSymbol_Secdef("xdata", COFF_ComdatSelect_Null), + T_COFF_DefSymbol_Static("$unwind$foobar", "xdata", 0), + T_COFF_DefSymbol_Secdef("pdata", COFF_ComdatSelect_Null), + T_COFF_DefSymbol_Static("$pdata$foobar", "pdata", 0), + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj /merge:.pdata=.rdata"); T_Ok(g_last_exit_code == 0); @@ -2536,32 +2154,30 @@ TEST(find_merged_pdata) TEST(section_sort) { - String8 data_obj_name = str8_lit("data.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + COFF_SectionFlags data_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes; + T_Ok(t_write_def_obj("data.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data_z", ".data$z", str8_lit("five"), .raw_flags = data_flags }, + { "data_a", ".data$a", str8_lit("three"), .raw_flags = data_flags }, + { "data_bbbbb", ".data$bbbbb", str8_lit("four"), .raw_flags = data_flags }, + { "data_empty", ".data$", str8_lit("two"), .raw_flags = data_flags }, + { "data", ".data", str8_lit("one"), .raw_flags = data_flags }, + {0} + } + })); - COFF_SectionFlags data_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes; - coff_obj_writer_push_section(obj_writer, str8_lit(".data$z"), data_flags, str8_lit("five")); - coff_obj_writer_push_section(obj_writer, str8_lit(".data$a"), data_flags, str8_lit("three")); - coff_obj_writer_push_section(obj_writer, str8_lit(".data$bbbbb"), data_flags, str8_lit("four")); - coff_obj_writer_push_section(obj_writer, str8_lit(".data$"), data_flags, str8_lit("two")); - coff_obj_writer_push_section(obj_writer, str8_lit(".data"), data_flags, str8_lit("one")); - - String8 data_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(data_obj_name, data_obj)); - } - - String8 entry_obj_name = str8_lit("entry.obj"); - U8 entry_text[] = { 0xC3 }; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe data.obj entry.obj"); T_Ok(g_last_exit_code == 0); @@ -2583,26 +2199,26 @@ TEST(flag_conf) { COFF_SectionFlags my_sect0_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute; COFF_SectionFlags my_sect1_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemWrite; - String8 conf_obj_name = str8_lit("conf.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *a_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), my_sect0_flags, str8_lit("one")); - COFF_ObjSection *b_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".mysect"), my_sect1_flags, str8_lit("two")); - String8 conf_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(conf_obj_name, conf_obj)); - } + T_Ok(t_write_def_obj("conf.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".mysect", str8_lit("one"), .raw_flags = my_sect0_flags }, + { "b", ".mysect", str8_lit("two"), .raw_flags = my_sect1_flags }, + {0} + } + })); - U8 entry_text[] = { 0xC3 }; - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe conf.obj entry.obj"); T_Ok(g_last_exit_code == 0); @@ -2624,26 +2240,26 @@ TEST(flag_conf) TEST(invalid_bss) { COFF_SectionFlags bss_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead; - String8 bss_obj_name = str8_lit("bss.obj"); String8 bss_data = str8_lit("Hello, World"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(obj_writer, str8_lit(".bss"), bss_flags, bss_data); - String8 bss_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(bss_obj_name, bss_obj)); - } + T_Ok(t_write_def_obj("bss.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "bss", ".bss", bss_data, .raw_flags = bss_flags }, + {0} + } + })); - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe bss.obj entry.obj"); T_Ok(g_last_exit_code == 0); @@ -2663,43 +2279,56 @@ TEST(invalid_bss) TEST(common_block) { - String8 a_obj_name = str8_lit("a.obj"); U8 a_data[6] = {0}; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit("A"), 3); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(a_data)); - data_sect->flags |= COFF_SectionFlag_Align1Bytes; - coff_obj_writer_push_section(obj_writer, str8_lit(".bss"), PE_BSS_SECTION_FLAGS, str8(0, 1)); // shift common block's initial position - coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr32); - String8 a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(a_obj_name, a_obj)); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "data", ".data", str8_array_fixed(a_data), .flags = "rw:data@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 0, "A"), + {0} + } + }, + { "bss", ".bss", str8(0, 1), .flags = "rw:bss" }, // shift common block's initial position + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Common("A", 3), + {0} + } + })); - String8 b_obj_name = str8_lit("b.obj"); U8 b_data[9] = { 0 }; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(b_data)); - data_sect->flags |= COFF_SectionFlag_Align1Bytes; - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit("B"), 6); - coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr64); - String8 b_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(b_obj_name, b_obj)); - } + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "data", ".data", str8_array_fixed(b_data), .flags = "rw:data@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr64, 0, "B"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Common("B", 6), + {0} + } + })); - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /fixed /largeaddressaware:no /merge:.bss=.comm a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == 0); @@ -2743,35 +2372,46 @@ TEST(base_relocs) String8 func_name = str8_lit("foo"); U8 func_text[] = { 0xc3 }; - String8 main_obj_name = str8_lit("main.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(main_text)); - COFF_ObjSymbol *func_undef = coff_obj_writer_push_symbol_undef(obj_writer, func_name); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, mov_func_name64, func_undef, COFF_Reloc_X64_Addr64); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, mov_func_name32, func_undef, COFF_Reloc_X64_Addr32); + // linker must not produce base relocations for absolute symbol + T_Ok(t_write_def_obj("main.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_array_fixed(main_text), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr64, mov_func_name64, "foo"), + T_COFF_DefReloc(X64_Addr32, mov_func_name32, "foo"), + {0} + } + }, + { + "data", ".data", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rw:data", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, 0, "abs"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("foo"), + T_COFF_DefSymbol_AbsStatic("abs", 0x12345678), + T_COFF_DefSymbol_Extern((char *)entry_name.str, "text", 0), + {0} + } + })); - // linker must not produce base relocations for absolute symbol - U8 data[4] = {0}; - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(data)); - COFF_ObjSymbol *abs_symbol = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("abs"), 0x12345678, COFF_SymStorageClass_Static); - coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, abs_symbol, COFF_Reloc_X64_Addr32); - - coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect); - String8 main_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(main_obj_name, main_obj)); - } - - String8 func_obj_name = str8_lit("func.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(func_text)); - coff_obj_writer_push_symbol_extern(obj_writer, func_name, 0, text_sect); - String8 func_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(func_obj_name, func_obj)); - } + T_Ok(t_write_def_obj("func.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_array_fixed(func_text), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern((char *)func_name.str, "text", 0), + {0} + } + })); String8 out_name = str8_lit("a.exe"); t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe main.obj func.obj"); @@ -2797,39 +2437,51 @@ TEST(base_relocs) TEST(simple_lib_test) { String8 test_payload = str8_lit("The quick brown fox jumps over the lazy dog"); - String8 test_obj = {0}; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_Unknown); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8(test_payload.str, test_payload.size+1)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, data_sect); - test_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - String8 test_lib_name = str8_lit("test.lib"); - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("test.obj"), test_obj); - String8 test_lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - T_Ok(t_write_file(test_lib_name, test_lib)); - } + T_Ok(t_write_def_lib("test.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("test.obj"), + .machine = T_COFF_DefSetMachine(Unknown), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8(test_payload.str, test_payload.size+1), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("test", "data", 0), + {0} + } + } + }, + {0} + } + })); U8 entry_text[] = { 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC3 }; - String8 entry_obj_name = str8_lit("entry.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text)); - COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("test")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, test_symbol, COFF_Reloc_X64_Addr32Nb); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 7, text_sect); - String8 entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(entry_obj_name, entry_obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_array_fixed(entry_text), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "test"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("test"), + T_COFF_DefSymbol_Extern("my_entry", "text", 7), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe entry.obj test.lib"); T_Ok(g_last_exit_code == 0); @@ -2859,88 +2511,94 @@ TEST(simple_lib_test) TEST(import_export) { - String8 export_obj; - { - String8 export_obj_name = str8_lit("export.obj"); - String8 export_obj_payload = str8_lit("test"); - U8 export_text[] = { - 0x90, // 0: nop - 0x54, // 1: push rsp - 0x48, 0xc7, 0xc0, 0x21, 0x03, 0x00, 0x00, // 2: mov rax, 0x321 - 0x5c, // 9: pop rsp - 0xc3 // 10: ret - }; - - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, export_obj_payload); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, data_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord"), 1, data_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord2"), 2, data_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord3"), 9, data_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("ord4"), 10, data_sect); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:foo=foo")); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:bar=foo")); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord,@5")); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord2,@6,DATA")); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord3,@7,NONAME,PRIVATE")); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:ord4,@8,NONAME,DATA")); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baz=BAZ.qwe")); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baf=BAZ.#1")); - export_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 import_obj; - { - String8 import_obj_name = str8_lit("import.obj"); - U8 import_payload[1024] = {0}; - - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(import_payload)); - - char *import_symbols[] = { - "__imp_foo", - "__imp_bar", - "__imp_baz", - "__imp_baf", - "__imp_ord", - //"__imp_ord2", - //"__imp_ord4", - "bar", - //"baf", - //"baz", - "foo", - "ord", - }; - - for EachElement(i, import_symbols) { - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_cstring(import_symbols[i])); - coff_obj_writer_section_push_reloc_voff(obj_writer, data_sect, i * 4, symbol); - } - - import_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 baz_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *s1 = coff_obj_writer_push_section(obj_writer, str8_lit(".s1"), PE_DATA_SECTION_FLAGS, str8_lit("s1")); - COFF_ObjSection *s2 = coff_obj_writer_push_section(obj_writer, str8_lit(".s2"), PE_DATA_SECTION_FLAGS, str8_lit("s2")); - COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed((U8[]){ 0xC3 })); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("_DllMainCRTStartup"), 0, text_sect); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("s1"), 0, s1); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("s2"), 0, s2); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baf=s1")); - coff_obj_writer_push_directive(obj_writer, str8_lit("/export:baz=s2")); - baz_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - // write objs - T_Ok(t_write_file(str8_lit("export.obj"), export_obj)); - T_Ok(t_write_file(str8_lit("import.obj"), import_obj)); - T_Ok(t_write_file(str8_lit("baz.obj"), baz_obj)); + T_Ok(t_write_def_obj("import.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + .id = "data", + .name = ".data", + .flags = "rw:data", + .data = str8_array_fixed((U8[1024]){0}), + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0*4, "__imp_foo"), + T_COFF_DefReloc(X64_Addr32Nb, 1*4, "__imp_bar"), + T_COFF_DefReloc(X64_Addr32Nb, 2*4, "__imp_baz"), + T_COFF_DefReloc(X64_Addr32Nb, 3*4, "__imp_baf"), + T_COFF_DefReloc(X64_Addr32Nb, 4*4, "__imp_ord"), + T_COFF_DefReloc(X64_Addr32Nb, 5*4, "bar"), + T_COFF_DefReloc(X64_Addr32Nb, 6*4, "foo"), + T_COFF_DefReloc(X64_Addr32Nb, 7*4, "ord"), + {0}, + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("__imp_foo"), + T_COFF_DefSymbol_Undef("__imp_bar"), + T_COFF_DefSymbol_Undef("__imp_baz"), + T_COFF_DefSymbol_Undef("__imp_baf"), + T_COFF_DefSymbol_Undef("__imp_ord"), + T_COFF_DefSymbol_Undef("bar"), + T_COFF_DefSymbol_Undef("foo"), + T_COFF_DefSymbol_Undef("ord"), + //"baf", + //"baz", + //"__imp_ord2", + //"__imp_ord4", + {0}, + }, + })); + + T_Ok(t_write_def_obj("export.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("test"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("foo", "data", 0), + T_COFF_DefSymbol_Extern("ord", "data", 1), + T_COFF_DefSymbol_Extern("ord2", "data", 2), + T_COFF_DefSymbol_Extern("ord3", "data", 9), + T_COFF_DefSymbol_Extern("ord4", "data", 10), + {0} + }, + .directives = (char*[]){ + "/export:foo=foo", + "/export:bar=foo", + "/export:ord,@5", + "/export:ord2,@6,DATA", + "/export:ord3,@7,NONAME,PRIVATE", + "/export:ord4,@8,NONAME,DATA", + "/export:baz=BAZ.qwe", + "/export:baf=BAZ.#1", + 0, + } + })); + + T_Ok(t_write_def_obj("baz.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "s1", ".s1", str8_lit("s1"), .flags = "rw:data" }, + { "s2", ".s2", str8_lit("s2"), .flags = "rw:data" }, + { "text", ".text", str8_lit_comp("\xc3"), .flags = "rx:code" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("_DllMainCRTStartup", "text", 0), + T_COFF_DefSymbol_Extern("s1", "s1", 0), + T_COFF_DefSymbol_Extern("s2", "s2", 0), + {0} + }, + .directives = (char*[]){ + "/export:baf=s1", + "/export:baz=s2", + 0, + } + })); + T_Ok(t_write_entry_obj()); // link dlls @@ -3080,25 +2738,34 @@ TEST(import_export) TEST(image_base) { - String8 obj_name = str8_lit("image_base.obj"); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00, // lea rcx, [__ImageBase] - 0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // mov rax, __ImageBase - 0xB8, 0x00, 0x00, 0x00, 0x00, // mov eax, __ImageBase - 0xC3 // ret - }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - COFF_ObjSymbol *image_base_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__ImageBase")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, image_base_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 9, image_base_symbol, COFF_Reloc_X64_Addr64); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 18, image_base_symbol, COFF_Reloc_X64_Addr32Nb); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(obj_name, obj)); - } + T_Ok(t_write_def_obj("image_base.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", + ".text", + str8_lit_comp( + "\x48\x8D\x0D\x00\x00\x00\x00" // lea rcx, [__ImageBase] + "\x48\xB8\x00\x00\x00\x00\x00\x00\x00\x00" // mov rax, __ImageBase + "\xB8\x00\x00\x00\x00" // mov eax, __ImageBase + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 3, "__ImageBase"), + T_COFF_DefReloc(X64_Addr64, 9, "__ImageBase"), + T_COFF_DefReloc(X64_Addr32Nb, 18, "__ImageBase"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("__ImageBase"), + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /base:0x2000000140000000 /out:a.exe image_base.obj"); T_Ok(g_last_exit_code == 0); @@ -3122,41 +2789,53 @@ TEST(image_base) TEST(comdat_any) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test$mn"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("1")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any); - COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - test->type.u.msb = COFF_SymDType_Func; - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("1.obj"), obj)); - } + T_Ok(t_write_def_obj("1.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "test", ".test$mn", str8_lit("1"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("test", COFF_ComdatSelect_Any), + T_COFF_DefSymbol_ExternFunc("TEST", "test", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test$mn"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("2")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any); - COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("2.obj"), obj)); - } + T_Ok(t_write_def_obj("2.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "test", ".test$mn", str8_lit("2"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("test", COFF_ComdatSelect_Any), + T_COFF_DefSymbol_Extern("TEST", "test", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3"), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); { t_invoke_linkerf("/subsystem:console /entry:entry /out:1.exe 1.obj 2.obj entry.obj"); @@ -3185,34 +2864,44 @@ TEST(comdat_any) TEST(comdat_no_duplicates) { - String8 test_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, test_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("a"), 0, test_sect); - test_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "a"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("a"), + {0} + } + })); - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("a")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), test_obj)); - T_Ok(t_write_file(str8_lit("b.obj"), test_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + String8 test_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "test", ".test", str8_lit("a"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("test", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Extern("a", "test", 0), + {0} + } + }); + T_Ok(t_write_file(str8_lit("a.obj"), test_obj)); + T_Ok(t_write_file(str8_lit("b.obj"), test_obj)); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code != 0); @@ -3233,50 +2922,68 @@ TEST(comdat_no_duplicates) TEST(comdat_same_size) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("a.obj"), obj)); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".a", str8_lit("a"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_SameSize), + T_COFF_DefSymbol_Extern("TEST", "a", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("b")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("b.obj"), obj)); - } + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "b", ".b", str8_lit("b"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("b", COFF_ComdatSelect_SameSize), + T_COFF_DefSymbol_Extern("TEST", "b", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".c"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("cc")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("c.obj"), obj)); - } + T_Ok(t_write_def_obj("c.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "c", ".c", str8_lit("cc"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("c", COFF_ComdatSelect_SameSize), + T_COFF_DefSymbol_Extern("TEST", "c", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == 0); @@ -3299,50 +3006,68 @@ TEST(comdat_same_size) TEST(comdat_exact_match) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("a.obj"), obj)); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".a", str8_lit("a"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_ExactMatch), + T_COFF_DefSymbol_Extern("TEST", "a", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a2"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("a2.obj"), obj)); - } + T_Ok(t_write_def_obj("a2.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a2", ".a2", str8_lit("a"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a2", COFF_ComdatSelect_ExactMatch), + T_COFF_DefSymbol_Extern("TEST", "a2", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("b")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("b.obj"), obj)); - } + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "b", ".b", str8_lit("b"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("b", COFF_ComdatSelect_ExactMatch), + T_COFF_DefSymbol_Extern("TEST", "b", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj"); T_Ok(g_last_exit_code != 0); @@ -3364,50 +3089,68 @@ TEST(comdat_exact_match) TEST(comdat_largest) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("a.obj"), obj)); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".a", str8_lit("a"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "a", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bb")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("b.obj"), obj)); - } + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "b", ".b", str8_lit("bb"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("b", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "b", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".c"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("c")); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("c.obj"), obj)); - } + T_Ok(t_write_def_obj("c.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "c", ".c", str8_lit("c"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("c", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "c", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry entry.obj a.obj b.obj"); T_Ok(g_last_exit_code == 0); @@ -3442,46 +3185,61 @@ TEST(comdat_largest) TEST(comdat_associative) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit("a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit("aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("aa")); - coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); - coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("a.obj"), obj)); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", "a", str8_lit("a"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "aa", "aa", str8_lit("aa"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "a", 0), + T_COFF_DefSymbol_Associative("aa", "a"), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *bb = coff_obj_writer_push_section(obj_writer, str8_lit("bb"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bb")); - COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit("b"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("b")); - COFF_ObjSection *bbb = coff_obj_writer_push_section(obj_writer, str8_lit("bbb"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("bbb")); - coff_obj_writer_push_symbol_secdef(obj_writer, bb, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_associative(obj_writer, b, bb); - coff_obj_writer_push_symbol_associative(obj_writer, bbb, bb); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, bb); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("b.obj"), obj)); - } + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "bb", "bb", str8_lit("bb"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "b", "b", str8_lit("b"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "bbb", "bbb", str8_lit("bbb"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("bb", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Associative("b", "bb"), + T_COFF_DefSymbol_Associative("bbb", "bb"), + T_COFF_DefSymbol_Extern("TEST", "bb", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj"); T_Ok(g_last_exit_code == 0); @@ -3511,35 +3269,47 @@ TEST(comdat_associative) TEST(comdat_associative_loop) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *aaaa = coff_obj_writer_push_section(obj_writer, str8_lit(".aaaa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aaaa")); - COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(".aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aa")); - COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("a")); - COFF_ObjSection *aaa = coff_obj_writer_push_section(obj_writer, str8_lit(".aaa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit("aaa")); - coff_obj_writer_push_symbol_associative(obj_writer, aaa, aa); - coff_obj_writer_push_symbol_associative(obj_writer, aaaa, aaa); - coff_obj_writer_push_symbol_associative(obj_writer, a, aa); - coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("loop.obj"), obj)); - } + T_Ok(t_write_def_obj("loop.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "aaaa", ".aaaa", str8_lit("aaaa"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "aa", ".aa", str8_lit("aa"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "a", ".a", str8_lit("a"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "aaa", ".aaa", str8_lit("aaa"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Associative("aaa", "aa"), + T_COFF_DefSymbol_Associative("aaaa", "aaa"), + T_COFF_DefSymbol_Associative("a", "aa"), + T_COFF_DefSymbol_Associative("aa", "a"), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe loop.obj entry.obj"); T_Ok(g_last_exit_code != 0); @@ -3548,31 +3318,43 @@ TEST(comdat_associative_loop) TEST(comdat_associative_non_comdat) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); - COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit(".b"), PE_DATA_SECTION_FLAGS, str8_lit("b")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); - coff_obj_writer_push_symbol_associative(obj_writer, b, a); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("test.obj"), obj)); - } + T_Ok(t_write_def_obj("test.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".a", str8_lit("a"), .flags = "rw:data" }, + { "b", ".b", str8_lit("b"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("TEST", "a", 0), + T_COFF_DefSymbol_Associative("b", "a"), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj test.obj"); T_Ok(g_last_exit_code == 0); @@ -3594,13 +3376,20 @@ TEST(comdat_associative_non_comdat) TEST(comdat_associative_out_of_bounds) { { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("a")); - COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(".aa"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit("aa")); - coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Any); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, a); - coff_obj_writer_push_symbol_associative(obj_writer, aa, a); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); + String8 obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".a", str8_lit("a"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "aa", ".aa", str8_lit("aa"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_Any), + T_COFF_DefSymbol_Extern("TEST", "a", 0), + T_COFF_DefSymbol_Associative("aa", "a"), + {0} + } + }); { COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj); String8 string_table = str8_substr(obj, header.string_table_range); @@ -3612,24 +3401,32 @@ TEST(comdat_associative_out_of_bounds) COFF_SymbolSecDef *secdef = (COFF_SymbolSecDef *)(symbol16 + 1); secdef->number_lo = 321; } - coff_obj_writer_release(&obj_writer); T_Ok(t_write_file(str8_lit("bad.obj"), obj)); } - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj"); T_Ok(g_last_exit_code != 0); @@ -3638,42 +3435,55 @@ TEST(comdat_associative_out_of_bounds) TEST(comdat_with_offset) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 a[] = "1Hello, World!"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("a.obj"), obj)); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "rdata", ".rdata", str8_lit_cstr("1Hello, World!"), .flags = "r:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("rdata", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "rdata", 1), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 a[] = "Hello, World!"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("b.obj"), obj)); - } + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "rdata", ".rdata", str8_lit_cstr("Hello, World!"), .flags = "r:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("rdata", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "rdata", 1), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" // ret + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == 0); @@ -3681,52 +3491,62 @@ TEST(comdat_with_offset) TEST(reloc_against_removed_comdat) { - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 a[] = "1Hello, World!"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, sect); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "rdata", ".rdata", str8_lit_cstr("1Hello, World!"), .flags = "r:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("rdata", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "rdata", 1), + {0} + } + })); - String8 b_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 a[] = "H"; - COFF_ObjSection *comdat_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a)); - coff_obj_writer_push_symbol_secdef(obj_writer, comdat_sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 1, comdat_sect); - COFF_ObjSymbol *static_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("STATIC"), 2, comdat_sect); - - U8 rdata[4] = {0}; - COFF_ObjSection *regular_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".rdata"), PE_RDATA_SECTION_FLAGS, str8_array_fixed(rdata)); - coff_obj_writer_section_push_reloc_voff(obj_writer, regular_sect, 0, static_symbol); - - b_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "comdat", ".rdata", str8_lit_cstr("H"), .flags = "r:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { + "regular", ".rdata", str8_lit_comp("\x00\x00\x00\x00"), .flags = "r:data", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "STATIC"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("comdat", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "comdat", 1), + T_COFF_DefSymbol_Static("STATIC", "comdat", 2), + {0} + } + })); + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == LNK_Error_RelocationAgainstRemovedSection); @@ -3734,34 +3554,33 @@ TEST(reloc_against_removed_comdat) TEST(sect_align) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - COFF_ObjSection *sect_align_shift = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("q")); - COFF_ObjSection *sect_align_none = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("abc")); - COFF_ObjSection *sect_align_1 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_lit("wr")); - COFF_ObjSection *sect_align_2 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, str8_lit("e")); - COFF_ObjSection *sect_align_4 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_lit("ttttt")); - COFF_ObjSection *sect_align_8 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align8Bytes, str8_lit("g")); - COFF_ObjSection *sect_align_16 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align16Bytes, str8_lit("o")); - COFF_ObjSection *sect_align_32 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align32Bytes, str8_lit("p")); - COFF_ObjSection *sect_align_64 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align64Bytes, str8_lit("f")); - COFF_ObjSection *sect_align_128 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align128Bytes, str8_lit("x")); - COFF_ObjSection *sect_align_256 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align256Bytes, str8_lit("c")); - COFF_ObjSection *sect_align_512 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align512Bytes, str8_lit("v")); - COFF_ObjSection *sect_align_1024 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1024Bytes, str8_lit("b")); - COFF_ObjSection *sect_align_2048 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align2048Bytes, str8_lit("n")); - COFF_ObjSection *sect_align_4096 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align4096Bytes, str8_lit("m")); - COFF_ObjSection *sect_align_8192 = coff_obj_writer_push_section(obj_writer, str8_lit(".a"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align8192Bytes, str8_lit("z")); - - U8 text[] = { 0xC3 }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("my_entry"), 0, text_sect); - - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("test.obj"), obj)); - } + T_Ok(t_write_def_obj("test.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "shift", ".a", str8_lit("q"), .flags = "rw:data" }, + { "none", ".a", str8_lit("abc"), .flags = "rw:data" }, + { "a1", ".a", str8_lit("wr"), .flags = "rw:data@1" }, + { "a2", ".a", str8_lit("e"), .flags = "rw:data@2" }, + { "a4", ".a", str8_lit("ttttt"), .flags = "rw:data@4" }, + { "a8", ".a", str8_lit("g"), .flags = "rw:data@8" }, + { "a16", ".a", str8_lit("o"), .flags = "rw:data@16" }, + { "a32", ".a", str8_lit("p"), .flags = "rw:data@32" }, + { "a64", ".a", str8_lit("f"), .flags = "rw:data@64" }, + { "a128", ".a", str8_lit("x"), .flags = "rw:data@128" }, + { "a256", ".a", str8_lit("c"), .flags = "rw:data@256" }, + { "a512", ".a", str8_lit("v"), .flags = "rw:data@512" }, + { "a1024", ".a", str8_lit("b"), .flags = "rw:data@1024" }, + { "a2048", ".a", str8_lit("n"), .flags = "rw:data@2048" }, + { "a4096", ".a", str8_lit("m"), .flags = "rw:data@4096" }, + { "a8192", ".a", str8_lit("z"), .flags = "rw:data@8192" }, + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("my_entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe /align:8192 test.obj"); @@ -3810,38 +3629,53 @@ TEST(sect_align) TEST(alt_name) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("test.obj"), obj)); - } + T_Ok(t_write_def_obj("test.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("test"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("test", "data", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("foo")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("foo.obj"), obj)); - } + T_Ok(t_write_def_obj("foo.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("foo"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("foo", "data", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "foo"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("foo"), + {0} + } + })); // basic alternate name test t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /alternatename:foo=test test.obj entry.obj"); @@ -3892,34 +3726,50 @@ TEST(alt_name) TEST(include) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("foo")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("foo"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("include.obj"), obj)); + T_Ok(t_write_def_lib("include.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("include.obj"), + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("foo"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("foo", "data", 0), + {0} + } + } + }, + {0} + } + })); - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("include.obj"), obj); - String8 lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - T_Ok(t_write_file(str8_lit("include.lib"), lib)); - } - - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "entry"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + })); // simple include test t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /include:foo entry.obj include.lib"); @@ -3945,37 +3795,49 @@ TEST(include) TEST(communal_var_vs_regular) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_common(obj_writer, str8_lit("TEST"), 1); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("communal.obj"), obj)); - } + T_Ok(t_write_def_obj("communal.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Common("TEST", 1), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("defn.obj"), obj)); - } + T_Ok(t_write_def_obj("defn.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("test"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("TEST", "data", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); // linker should replace communal TEST with .data TEST @@ -4000,39 +3862,50 @@ TEST(communal_var_vs_regular) TEST(communal_var_vs_regular_comdat) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_common(obj_writer, str8_lit("TEST"), 1); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("communal.obj"), obj)); - } + T_Ok(t_write_def_obj("communal.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Common("TEST", 1), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit("test")); - sect->flags |= COFF_SectionFlag_LnkCOMDAT; - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("large.obj"), obj)); - } + T_Ok(t_write_def_obj("large.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit("test"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("data", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("TEST", "data", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("TEST"), + {0} + } + })); // linker should replace communal TEST with .data TEST t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe communal.obj large.obj entry.obj"); @@ -4056,41 +3929,49 @@ TEST(communal_var_vs_regular_comdat) TEST(import_kernel32) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 data[] = "test"; - U8 text[] = { - 0x48, 0x83, 0xec, 0x68, // sub rsp,68h ; alloc space on stack - 0xc7, 0x44, 0x24, 0x48, 0x18, 0x00, 0x00, 0x00, // mov dword ptr [rsp+48h],18h ; SECURITY_ATTRIBUTES.nLength - 0x48, 0xc7, 0x44, 0x24, 0x50, 0x00, 0x00, 0x00, 0x00, // mov qword ptr [rsp+50h],0 ; SECURITY_ATTRIBUTES.lpSecurityDescriptor - 0xc7, 0x44, 0x24, 0x58, 0x00, 0x00, 0x00, 0x00, // mov dword ptr [rsp+58h],0 ; SECURITY_ATTRIBUTES.bInheritHandle - 0x48, 0xc7, 0x44, 0x24, 0x30, 0x00, 0x00, 0x00, 0x00, // mov qword ptr [rsp+30h],0 ; hTemplateFile - 0xc7, 0x44, 0x24, 0x28, 0x80, 0x00, 0x00, 0x00, // mov dword ptr [rsp+28h],80h ; dwFlagsAndAttributes - 0xc7, 0x44, 0x24, 0x20, 0x02, 0x00, 0x00, 0x00, // mov dword ptr [rsp+20h],2 ; dwCreationDisposition - 0x4c, 0x8d, 0x4c, 0x24, 0x48, // lea r9,[rsp+48h] ; lpSecurityAttributes - 0x45, 0x33, 0xc0, // xor r8d,r8d ; dwShareMode - 0xba, 0x00, 0x00, 0x00, 0x40, // mov edx,40000000h ; dwDesiredAccess - 0x48, 0x8d, 0x0d, 0x00, 0x00, 0x00, 0x00, // lea rcx,[test] ; lpFileName - 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, // call qword ptr [__imp_CreateFileA] ; call CreateFileA - 0x48, 0x89, 0xc1, // mov rcx,rax ; hObject - 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, // call qword ptr [__imp_CloseHandle] ; call CloseHandle - 0x33, 0xc0, // xor eax,eax ; clear result - 0x48, 0x83, 0xc4, 0x68, // add rsp,68h ; dealloc stack - 0xc3 // ret ; return - }; - COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_array_fixed(data)); - COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *data_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("test"), 0, data_sect); - COFF_ObjSymbol *entry_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - COFF_ObjSymbol *create_file_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_CreateFileA")); - COFF_ObjSymbol *close_handle_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_CloseHandle")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 70, data_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 76, create_file_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 85, close_handle_symbol, COFF_Reloc_X64_Rel32); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("import.obj"), obj)); - } + T_Ok(t_write_def_obj("import.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "data", ".data", str8_lit_cstr("test"), .flags = "rw:data" }, + { + "text", ".text", + str8_lit_comp( + "\x48\x83\xEC\x68" // sub rsp,68h ; alloc space on stack + "\xC7\x44\x24\x48\x18\x00\x00\x00" // mov dword ptr [rsp+48h],18h ; SECURITY_ATTRIBUTES.nLength + "\x48\xC7\x44\x24\x50\x00\x00\x00\x00" // mov qword ptr [rsp+50h],0 ; SECURITY_ATTRIBUTES.lpSecurityDescriptor + "\xC7\x44\x24\x58\x00\x00\x00\x00" // mov dword ptr [rsp+58h],0 ; SECURITY_ATTRIBUTES.bInheritHandle + "\x48\xC7\x44\x24\x30\x00\x00\x00\x00" // mov qword ptr [rsp+30h],0 ; hTemplateFile + "\xC7\x44\x24\x28\x80\x00\x00\x00" // mov dword ptr [rsp+28h],80h ; dwFlagsAndAttributes + "\xC7\x44\x24\x20\x02\x00\x00\x00" // mov dword ptr [rsp+20h],2 ; dwCreationDisposition + "\x4C\x8D\x4C\x24\x48" // lea r9,[rsp+48h] ; lpSecurityAttributes + "\x45\x33\xC0" // xor r8d,r8d ; dwShareMode + "\xBA\x00\x00\x00\x40" // mov edx,40000000h ; dwDesiredAccess + "\x48\x8D\x0D\x00\x00\x00\x00" // lea rcx,[test] ; lpFileName + "\xFF\x15\x00\x00\x00\x00" // call qword ptr [__imp_CreateFileA] ; call CreateFileA + "\x48\x89\xC1" // mov rcx,rax ; hObject + "\xFF\x15\x00\x00\x00\x00" // call qword ptr [__imp_CloseHandle] ; call CloseHandle + "\x33\xC0" // xor eax,eax ; clear result + "\x48\x83\xC4\x68" // add rsp,68h ; dealloc stack + "\xC3" // ret ; return + ), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 70, "test"), + T_COFF_DefReloc(X64_Rel32, 76, "__imp_CreateFileA"), + T_COFF_DefReloc(X64_Rel32, 85, "__imp_CloseHandle"), + {0}, + } + }, + {0}, + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("test", "data", 0), + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("__imp_CreateFileA"), + T_COFF_DefSymbol_Undef("__imp_CloseHandle"), + {0}, + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed import.obj kernel32.lib"); T_Ok(g_last_exit_code == 0); @@ -4108,7 +3989,6 @@ TEST(import_kernel32) AssertAlways(!os_handle_match(handle, os_handle_zero())); U64 exit_code = max_U64; os_process_join(handle, max_U64, &exit_code); - os_process_detach(handle); T_Ok(exit_code == 0); T_Ok(os_file_path_exists(test_file_path)); } @@ -4118,7 +3998,6 @@ TEST(import_kernel32) TEST(delay_import) { { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); U8 return_0[] = { 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, 0 0xc3 // ret @@ -4131,18 +4010,23 @@ TEST(delay_import) 0x48, 0xC7, 0xC0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 0xc3 // ret }; - COFF_ObjSection *return_0_sect = t_push_text_section(obj_writer, str8_array_fixed(return_0)); - COFF_ObjSection *return_1_sect = t_push_text_section(obj_writer, str8_array_fixed(return_1)); - COFF_ObjSection *return_2_sect = t_push_text_section(obj_writer, str8_array_fixed(return_2)); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_1"), 0, return_1_sect); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_2"), 0, return_2_sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("a.obj"), obj)); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "return_0", ".text", str8_array_fixed(return_0), .flags = "rx:code@1" }, + { "return_1", ".text", str8_array_fixed(return_1), .flags = "rx:code@1" }, + { "return_2", ".text", str8_array_fixed(return_2), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_ExternFunc("return_1", "return_1", 0), + T_COFF_DefSymbol_ExternFunc("return_2", "return_2", 0), + {0} + } + })); } { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); U8 return_0[] = { 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, 0 0xc3 // ret @@ -4155,14 +4039,20 @@ TEST(delay_import) 0x48, 0xC7, 0xC0, 0x41, 0x01, 0x00, 0x00, // mov rax, 321 0xc3 // ret }; - COFF_ObjSection *return_0_sect = t_push_text_section(obj_writer, str8_array_fixed(return_0)); - COFF_ObjSection *return_123_sect = t_push_text_section(obj_writer, str8_array_fixed(return_123)); - COFF_ObjSection *return_321_sect = t_push_text_section(obj_writer, str8_array_fixed(return_321)); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_123"), 0, return_123_sect); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("return_321"), 0, return_321_sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("b.obj"), obj)); + T_Ok(t_write_def_obj("b.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "return_0", ".text", str8_array_fixed(return_0), .flags = "rx:code@1" }, + { "return_123", ".text", str8_array_fixed(return_123), .flags = "rx:code@1" }, + { "return_321", ".text", str8_array_fixed(return_321), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_ExternFunc("return_123", "return_123", 0), + T_COFF_DefSymbol_ExternFunc("return_321", "return_321", 0), + {0} + } + })); } { @@ -4185,29 +4075,39 @@ TEST(delay_import) 0x5E, // pop rsi 0xC3, // ret }; - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64); - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - COFF_ObjSymbol *return_1_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_1")); - COFF_ObjSymbol *return_2_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_2")); - COFF_ObjSymbol *return_123_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_123")); - COFF_ObjSymbol *return_321_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("return_321")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 7, return_1_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 14, return_2_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 23, return_123_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 30, return_321_symbol, COFF_Reloc_X64_Rel32); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("main.obj"), obj)); + T_Ok(t_write_def_obj("main.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_array_fixed(text), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 7, "return_1"), + T_COFF_DefReloc(X64_Rel32, 14, "return_2"), + T_COFF_DefReloc(X64_Rel32, 23, "return_123"), + T_COFF_DefReloc(X64_Rel32, 30, "return_321"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("return_1"), + T_COFF_DefSymbol_Undef("return_2"), + T_COFF_DefSymbol_Undef("return_123"), + T_COFF_DefSymbol_Undef("return_321"), + {0} + } + })); } - t_invoke_linkerf("/dll /implib:a.lib /export:return_1 /export:return_2 a.obj libcmt.lib"); + t_invoke_linkerf("/dll /implib:a.lib /export:return_1 /export:return_2 /rad_time_stamp:0x69EB0E28 a.obj libcmt.lib"); T_Ok(g_last_exit_code == 0); - t_invoke_linkerf("/dll /implib:b.lib /export:return_123 /export:return_321 b.obj libcmt.lib"); + t_invoke_linkerf("/dll /implib:b.lib /export:return_123 /export:return_321 /rad_time_stamp:0x69EB0E28 b.obj libcmt.lib"); T_Ok(g_last_exit_code == 0); - t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed /debug:full main.obj a.lib b.lib kernel32.lib delayimp.lib libcmt.lib /delayload:a.dll /delayload:b.dll"); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed /debug:full /rad_time_stamp:0x69EB0E28 main.obj a.lib b.lib kernel32.lib delayimp.lib libcmt.lib /delayload:a.dll /delayload:b.dll"); T_Ok(g_last_exit_code == 0); String8 exe = t_read_file(arena, str8_lit("a.exe")); @@ -4265,15 +4165,9 @@ TEST(delay_import) TEST(delay_import_user32) { { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".str"), PE_DATA_SECTION_FLAGS, str8_zero()); - U64 msg_off = data_sect->data.total_size; - str8_list_push(obj_writer->arena, &data_sect->data, push_cstr(arena, str8_lit("test"))); - U64 caption_off = data_sect->data.total_size; - str8_list_push(obj_writer->arena, &data_sect->data, push_cstr(arena, str8_lit("foo"))); - COFF_ObjSymbol *msg_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("msg"), msg_off, data_sect); - COFF_ObjSymbol *caption_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("caption"), caption_off, data_sect); - + U64 msg_off = 0; + U64 caption_off = 5; + String8 str_payload = str8_lit_comp("test\0foo\0"); U8 text[] = { 0x48, 0x83, 0xEC, 0x28, // sub rsp,28h 0x45, 0x33, 0xC9, // xor r9d,r9d @@ -4285,16 +4179,29 @@ TEST(delay_import_user32) 0x48, 0x83, 0xC4, 0x28, // add rsp,28h 0xC3, // ret }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - COFF_ObjSymbol *text_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - COFF_ObjSymbol *message_box_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_MessageBoxA")); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 10, msg_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 17, caption_symbol, COFF_Reloc_X64_Rel32); - coff_obj_writer_section_push_reloc(obj_writer, text_sect, 25, message_box_symbol, COFF_Reloc_X64_Rel32); - - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("delay_import.obj"), obj)); + T_Ok(t_write_def_obj("delay_import.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "str", ".str", str_payload, .flags = "rw:data" }, + { + "text", ".text", str8_array_fixed(text), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 10, "msg"), + T_COFF_DefReloc(X64_Rel32, 17, "caption"), + T_COFF_DefReloc(X64_Rel32, 25, "__imp_MessageBoxA"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("msg", "str", msg_off), + T_COFF_DefSymbol_Extern("caption", "str", caption_off), + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("__imp_MessageBoxA"), + {0} + } + })); } t_invoke_linkerf("/subsystem:console /out:a.exe /entry:entry /fixed /delayload:user32.dll kernel32.lib user32.lib libcmt.lib delayimp.lib delay_import.obj /debug:full"); @@ -4303,29 +4210,41 @@ TEST(delay_import_user32) TEST(empty_section) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *test = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_TEXT_SECTION_FLAGS, str8(0,0)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, test); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("empty_section.obj"), obj)); - } + T_Ok(t_write_def_obj("empty_section.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "test", ".test", str8(0,0), .flags = "rx:code" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("TEST", "test", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("TEST"), + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe empty_section.obj entry.obj"); T_Ok(g_last_exit_code != 0); @@ -4333,30 +4252,41 @@ TEST(empty_section) TEST(removed_section) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 test_text[] = { 0xc3 }; - COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".test"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkRemove, str8_array_fixed(test_text)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("TEST"), 0, test_sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("test.obj"), obj)); - } + T_Ok(t_write_def_obj("test.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "test", ".test", str8_lit_comp("\xC3"), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkRemove }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("TEST", "test", 0), + {0} + } + })); - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text)); - COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("TEST")); - coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, text_sect); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("entry.obj"), obj)); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "TEST"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("TEST"), + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.obj entry.obj"); T_Ok(g_last_exit_code != 0); @@ -4364,21 +4294,21 @@ TEST(removed_section) TEST(function_pad_min) { - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 ret[] = { 0xc3 }; - COFF_ObjSection *text_sect_0 = t_push_text_section(obj_writer, str8_array_fixed(ret)); - COFF_ObjSection *text_sect_1 = t_push_text_section(obj_writer, str8_array_fixed(ret)); - COFF_ObjSection *text_sect_2 = t_push_text_section(obj_writer, str8_array_fixed(ret)); - text_sect_0->flags |= COFF_SectionFlag_Align4Bytes; - text_sect_1->flags |= COFF_SectionFlag_Align2Bytes; - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("A"), 0, text_sect_0); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("B"), 0, text_sect_1); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("C"), 0, text_sect_2); - String8 obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - T_Ok(t_write_file(str8_lit("funcs.obj"), obj)); - } + T_Ok(t_write_def_obj("funcs.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@4" }, + { "b", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@4" }, + { "c", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0}, + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_ExternFunc("A", "a", 0), + T_COFF_DefSymbol_ExternFunc("B", "b", 0), + T_COFF_DefSymbol_ExternFunc("C", "c", 0), + {0}, + } + })); t_invoke_linkerf("/subsystem:console /entry:A /functionpadmin:1 /out:a.exe funcs.obj"); T_Ok(g_last_exit_code == 0); @@ -4401,31 +4331,30 @@ TEST(function_pad_min) TEST(first_member_header) { - String8 obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("8"), 0x8, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("1"), 0x1, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("9"), 0x9, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("7"), 0x7, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("4"), 0x4, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("5"), 0x5, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("2"), 0x2, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("3"), 0x3, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("6"), 0x6, COFF_SymStorageClass_External); - obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("obj.obj"), obj); - lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 0); - coff_lib_writer_release(&lib_writer); - } - - T_Ok(t_write_file(str8_lit("test.lib"), lib)); + T_Ok(t_write_def_lib("test.lib", (T_COFF_DefLib){ + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("obj.obj"), + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("8", 0x8), + T_COFF_DefSymbol_AbsExtern("1", 0x1), + T_COFF_DefSymbol_AbsExtern("9", 0x9), + T_COFF_DefSymbol_AbsExtern("7", 0x7), + T_COFF_DefSymbol_AbsExtern("4", 0x4), + T_COFF_DefSymbol_AbsExtern("5", 0x5), + T_COFF_DefSymbol_AbsExtern("2", 0x2), + T_COFF_DefSymbol_AbsExtern("3", 0x3), + T_COFF_DefSymbol_AbsExtern("6", 0x6), + {0} + } + } + }, + {0} + } + })); T_Ok(t_write_entry_obj()); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9"); @@ -4434,31 +4363,31 @@ TEST(first_member_header) TEST(second_member_header) { - String8 obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("8"), 0x8, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("1"), 0x1, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("9"), 0x9, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("7"), 0x7, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("4"), 0x4, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("5"), 0x5, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("2"), 0x2, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("3"), 0x3, COFF_SymStorageClass_External); - coff_obj_writer_push_symbol_abs(obj_writer, str8_lit("6"), 0x6, COFF_SymStorageClass_External); - obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("obj.obj"), obj); - lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - } - - T_Ok(t_write_file(str8_lit("test.lib"), lib)); + T_Ok(t_write_def_lib("test.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("obj.obj"), + .machine = T_COFF_DefSetMachine(X64), + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsExtern("8", 0x8), + T_COFF_DefSymbol_AbsExtern("1", 0x1), + T_COFF_DefSymbol_AbsExtern("9", 0x9), + T_COFF_DefSymbol_AbsExtern("7", 0x7), + T_COFF_DefSymbol_AbsExtern("4", 0x4), + T_COFF_DefSymbol_AbsExtern("5", 0x5), + T_COFF_DefSymbol_AbsExtern("2", 0x2), + T_COFF_DefSymbol_AbsExtern("3", 0x3), + T_COFF_DefSymbol_AbsExtern("6", 0x6), + {0} + } + } + }, + {0} + } + })); T_Ok(t_write_entry_obj()); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9"); @@ -4468,27 +4397,77 @@ TEST(second_member_header) #if 0 TEST(defer_imp_link) { - String8 bar_lib = t_coff_lib_from_string(arena, str8_lit("'import': { 'dll_name': 'bar.dll', 'name': 'bar', 'import_by': 'name', 'hint_or_ordinal': 0, 'type': 'code' }, \ - 'obj': { \ - 'machine': 'x64', \ - 'sections': [ { 'id': 'text', 'name': '.text', 'flags': 'code', 'data': [ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 ], 'relocs': [ { 'kind': 'rel32', 'apply_off': 2, 'symbol': 'bar' } ] } ], \ - 'symbols': [ \ - { 'kind': 'undef', 'name': '__imp_bar' }, \ - { 'kind': 'extern_func', 'name': 'qwe', 'section': 'text', 'value': 0 }, \ - ], \ - }, \ - ")); + T_COFF_DefLib bar_lib_any = { + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_DllImportStatic, + .dll_import = { .name = "bar.dll" } + }, + { + .type = T_COFF_DefLibMember_Import, + .import = { "bar.dll", "bar", COFF_ImportBy_Name, COFF_ImportHeader_Code, .hit_or_ordinal = 0 } + }, + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\xff\x25\x00\x00\x00\x00"), .flags = "rx:code" + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("__imp_bar"), + T_COFF_DefSymbol_ExternFunc("qwe", "text", 0), + {0}, + } + } + }, + {0} + } + }; - String8 foo_lib = t_coff_lib_from_string(arena, str8_lit("'import': { 'dll_name': 'foo.dll', 'name': 'bar', 'import_by': 'name', 'hint_or_ordinal': 0, 'type': 'code' }, \ - 'obj': { \ - 'machine': 'x64', \ - 'sections': [ { 'id': 'text', 'name': '.text', 'flags': 'code', 'data': [ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 ], 'relocs': [ { 'kind': 'rel32', 'apply_off': 2, 'symbol': 'bar' } ] } ], \ - 'symbols': [ \ - { 'kind': 'undef', 'name': 'bar' }, \ - { 'kind': 'undef', 'name': 'qwe' }, \ - { 'kind': 'extern_func', 'name': 'thunk', 'section': 'text', 'value': 0 }, \ - ], \ - }")); + T_COFF_DefLib foo_lib_any = { + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_DllImportStatic, + .dll_import = { .name = "foo.dll" } + }, + { + .type = T_COFF_DefLibMember_Import, + .import = { "foo.dll", "bar", COFF_ImportBy_Name, COFF_ImportHeader_Code, .hit_or_ordinal = 0 } + }, + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp("\xff\x25\x00\x00\x00\x00"), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 2, "bar"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("bar"), + T_COFF_DefSymbol_Undef("qwe"), + T_COFF_DefSymbol_ExternFunc("thunk", "text", 0), + {0}, + } + } + }, + {0} + } + }; + + String8 bar_lib = t_coff_from_def_lib(arena, bar_lib_any); + String8 foo_lib = t_coff_from_def_lib(arena, foo_lib_any); T_Ok(t_write_file(str8_lit("bar.lib"), bar_lib)); T_Ok(t_write_file(str8_lit("foo.lib"), foo_lib)); @@ -4501,49 +4480,74 @@ TEST(defer_imp_link) TEST(defer_impl_link_to_second_search_pass) { - String8 imp_ref_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("entry"), 0, sect); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("__imp_foo")); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("func")); // force linker to pull obj from the lib - imp_ref_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("imp_ref.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xc3"), .flags = "rx:code" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_ExternFunc("entry", "text", 0), + T_COFF_DefSymbol_Undef("__imp_foo"), + T_COFF_DefSymbol_Undef("func"), + {0} + } + })); - String8 impl_ref_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit("func"), 0, sect); - coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("foo")); // on a second search pass force linker to look up same import - impl_ref_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_lib("impl_ref.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("impl_ref.obj"), + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xc3"), .flags = "rx:code" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_ExternFunc("func", "text", 0), + T_COFF_DefSymbol_Undef("foo"), + {0} + } + } + }, + {0} + } + })); - String8 impl_ref_lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("impl_ref.obj"), impl_ref_obj); - impl_ref_lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - } + T_Ok(t_write_def_lib("foo.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Import, + .import = { + "foo.dll", "foo", COFF_ImportBy_Name, COFF_ImportHeader_Code, + .hit_or_ordinal = 0, + .time_stamp = T_COFF_DefSetTimeStamp(~0u), + .machine = T_COFF_DefSetMachine(X64) + } + }, + {0} + } + })); - String8 foo_lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_import(lib_writer, COFF_MachineType_X64, ~0u, str8_lit("foo.dll"), COFF_ImportBy_Name, str8_lit("foo"), 0, COFF_ImportHeader_Code); - foo_lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - } - - T_Ok(t_write_file(str8_lit("imp_ref.obj"), imp_ref_obj)); - T_Ok(t_write_file(str8_lit("impl_ref.lib"), impl_ref_lib)); - T_Ok(t_write_file(str8_lit("foo.lib"), foo_lib)); - T_Ok(t_write_file(str8_lit("foo2.lib"), foo_lib)); + T_Ok(t_write_def_lib("foo2.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Import, + .import = { + "foo.dll", "foo", COFF_ImportBy_Name, COFF_ImportHeader_Code, + .hit_or_ordinal = 0, + .time_stamp = T_COFF_DefSetTimeStamp(~0u), + .machine = T_COFF_DefSetMachine(X64) + } + }, + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe foo.lib foo2.lib imp_ref.obj impl_ref.lib"); T_Ok(g_last_exit_code == 0); @@ -4551,65 +4555,78 @@ TEST(defer_impl_link_to_second_search_pass) TEST(opt_ref_dangling_section) { - String8 entry_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { - 0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm - 0xC3 // ret - }; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("f")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("entry"), 0, sect); - entry_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp( + "\x48\xC7\xC0\x00\x00\x00\x00" // mov rax, $imm + "\xC3" + ), // ret + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "f"), + {0} + } + }, + {0}, + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("f"), + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + })); - String8 a_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "data", ".data", str8_lit_cstr("A0000"), .flags = "rw:data", .raw_flags = COFF_SectionFlag_LnkCOMDAT, + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, "q"), + {0} + } + }, + {0}, + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("q"), + T_COFF_DefSymbol_Secdef("data", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("f", "data", 0), + {0} + } + })); - U8 data[] = "A0000"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(data)); - - COFF_ObjSymbol *q = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit("q")); - coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, q); - - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("f"), 0, sect); - a_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 b_obj; - { - COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - U8 q[] = { 1,2,3,4}; - COFF_ObjSection *q_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".q"), PE_DATA_SECTION_FLAGS, str8_array_fixed(q)); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("q"), 0, q_sect); - - U8 data[] = "BBBBBBBBBBBBBBB"; - COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data"), PE_DATA_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(data)); - coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest); - coff_obj_writer_push_symbol_extern(obj_writer, str8_lit("f"), 0, sect); - - b_obj = coff_obj_writer_serialize(arena, obj_writer); - coff_obj_writer_release(&obj_writer); - } - - String8 b_lib; - { - COFF_LibWriter *lib_writer = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(lib_writer, str8_lit("b.obj"), b_obj); - b_lib = coff_lib_writer_serialize(arena, lib_writer, 0, 0, 1); - coff_lib_writer_release(&lib_writer); - } - - T_Ok(t_write_file(str8_lit("entry.obj"), entry_obj)); - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); - T_Ok(t_write_file(str8_lit("b.lib"), b_lib)); + T_Ok(t_write_def_lib("b.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("b.obj"), + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "q", ".q", str8_lit_comp("\x1\x2\x3\x4"), .flags = "rw:data" }, + { + "data", ".data", str8_lit_cstr("BBBBBBBBBBBBBBB"), + .flags = "rw:data", + .raw_flags = COFF_SectionFlag_LnkCOMDAT + }, + {0}, + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("q", "q", 0), + T_COFF_DefSymbol_Secdef("data", COFF_ComdatSelect_Largest), + T_COFF_DefSymbol_Extern("f", "data", 0), + {0}, + } + } + }, + {0}, + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.lib"); T_Ok(g_last_exit_code == 0); @@ -4668,17 +4685,21 @@ TEST(long_section_name) { Arch arch = Arch_x64; - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - U8 text[] = { 0xc3 }; - COFF_ObjSection *text_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - coff_obj_writer_push_section(cow, str8_lit(".debug_info"), PE_DATA_SECTION_FLAGS, str8_lit("DEBUG_INFO")); - coff_obj_writer_push_section(cow, str8_lit(".debug_abbrev"), PE_DATA_SECTION_FLAGS, str8_lit("DEBUG_ABBREV")); - coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, text_sect); - String8 raw_coff = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + T_Ok(t_write_def_obj("test.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code" }, + { "debug_info", ".debug_info", str8_lit("DEBUG_INFO"), .flags = "rw:data" }, + { "debug_abbrev", ".debug_abbrev", str8_lit("DEBUG_ABBREV"), .flags = "rw:data" }, + {0}, + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + })); // link test.obj - T_Ok(t_write_file(str8_lit("test.obj"), raw_coff)); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe test.obj"); T_Ok(g_last_exit_code == 0); @@ -4854,23 +4875,23 @@ TEST(debug_p_sig_mismatch) b_debug_t = str8_serial_end(arena, &srl); } - String8 a_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_p); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_s); - a_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } + String8 a_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_p", ".debug$P", a_debug_p, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", a_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); - String8 b_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, b_debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, b_debug_s); - b_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } + String8 b_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", b_debug_t, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", b_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); @@ -4979,14 +5000,15 @@ TEST(debug_p_and_debug_t_in_obj) pch_debug_t = str8_serial_end(arena, &srl); } - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_p); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_s); - String8 raw_coff = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - - T_Ok(t_write_file(str8_lit("pch.obj"), raw_coff)); + T_Ok(t_write_def_obj("pch.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_p", ".debug$P", pch_debug_p, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_t", ".debug$T", pch_debug_t, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", pch_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + })); T_Ok(t_write_entry_obj()); String8 output = {0}; t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full pch.obj entry.obj"), max_U64, arena, &output); @@ -5251,37 +5273,41 @@ TEST(merge_duplicate_types) c_debug_s = str8_serial_end(arena, &srl); } - String8 pch_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$P"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_p); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, pch_debug_s); - pch_obj = coff_obj_writer_serialize(arena, cow); - } + String8 pch_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_p", ".debug$P", debug_p, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", pch_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); - String8 a_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, a_debug_s); - a_obj = coff_obj_writer_serialize(arena, cow); - } + String8 a_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", a_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); - String8 b_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_t); - b_obj = coff_obj_writer_serialize(arena, cow); - } + String8 b_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); - String8 c_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_lit((U8[]){ 0xc3 })); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, c_debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, c_debug_s); - c_obj = coff_obj_writer_serialize(arena, cow); - } + String8 c_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp(""), .flags = "rx:code" }, + { "debug_t", ".debug$T", c_debug_t, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", c_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); String8 entry_obj = t_make_entry_obj(arena); @@ -5379,11 +5405,14 @@ TEST(cyclic_type) str8_list_push(arena, &debug_s.data_list[CV_C13SubSectionIdxKind_Symbols], cv_make_symbol(arena, CV_SymKind_GPROC32, cv_make_proc32(arena, (CV_SymProc32){ .itype = 0x1001 }, str8_lit("foo")))); String8List debug_s_string = cv_data_from_debug_s_c13(arena, &debug_s, 1); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_serial_end(arena, debug_t)); - coff_obj_writer_push_section(cow, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_list_join(arena, &debug_s_string, 0)); - String8 raw_coff = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + String8 raw_coff = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", str8_serial_end(arena, debug_t), .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", str8_list_join(arena, &debug_s_string, 0), .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); T_Ok(t_write_entry_obj()); T_Ok(t_write_file(str8_lit("cycle.obj"), raw_coff)); @@ -5531,12 +5560,13 @@ TEST(validate_gsi) String8List raw_debug_s_list = cv_data_from_debug_s_c13(arena, &debug_s, 1); String8 raw_debug_s = str8_list_join(arena, &raw_debug_s_list, 0); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - t_push_debug_s_section(cow, raw_debug_s); - String8 obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - - T_Ok(t_write_file(str8_lit("debug.obj"), obj)); + T_Ok(t_write_def_obj("debug.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_s", ".debug$S", raw_debug_s, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + })); T_Ok(t_write_entry_obj()); t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe entry.obj debug.obj"); @@ -5589,12 +5619,13 @@ TEST(validate_gsi_procs_and_typedefs) String8List raw_debug_s_list = cv_data_from_debug_s_c13(arena, &debug_s, 1); String8 raw_debug_s = str8_list_join(arena, &raw_debug_s_list, 0); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - t_push_debug_s_section(cow, raw_debug_s); - String8 obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - - T_Ok(t_write_file(str8_lit("debug.obj"), obj)); + T_Ok(t_write_def_obj("debug.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_s", ".debug$S", raw_debug_s, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + })); T_Ok(t_write_entry_obj()); t_invoke_linkerf("/subsystem:console /entry:entry /debug:full /out:a.exe entry.obj debug.obj"); @@ -5659,16 +5690,20 @@ TEST(validate_gsi_procs_and_typedefs) TEST(validate_psi) { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_lit("FOOBAR")); - COFF_ObjSection *data = coff_obj_writer_push_section(cow, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_lit("QWE")); - coff_obj_writer_push_symbol_extern_func(cow, str8_lit("global_func"), 1, text); - coff_obj_writer_push_symbol_extern(cow, str8_lit("global_var"), 1, data); - coff_obj_writer_push_symbol_static(cow, str8_lit("static_var"), 1, data); - String8 test_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - - T_Ok(t_write_file(str8_lit("test.obj"), test_obj)); + T_Ok(t_write_def_obj("test.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit("FOOBAR"), .flags = "rx:code" }, + { "data", ".data", str8_lit("QWE"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_ExternFunc("global_func", "text", 1), + T_COFF_DefSymbol_Extern("global_var", "data", 1), + T_COFF_DefSymbol_Static("static_var", "data", 1), + {0} + } + })); T_Ok(t_write_entry_obj()); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full entry.obj test.obj"); @@ -5748,22 +5783,31 @@ TEST(pdbstripped) String8List raw_debug_s_list = cv_data_from_debug_s_c13(arena, &debug_s, 1); String8 raw_debug_s = str8_list_join(arena, &raw_debug_s_list, 0); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - t_push_debug_s_section(cow, raw_debug_s); - debug_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + debug_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_s", ".debug$S", raw_debug_s, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); } String8 pub_obj; { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *text = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_lit("FOOBAR")); - COFF_ObjSection *data = coff_obj_writer_push_section(cow, str8_lit(".data"), PE_DATA_SECTION_FLAGS, str8_lit("QWE")); - coff_obj_writer_push_symbol_extern_func(cow, str8_lit("global_func"), 1, text); - coff_obj_writer_push_symbol_extern(cow, str8_lit("global_var"), 1, data); - coff_obj_writer_push_symbol_static(cow, str8_lit("static_var"), 1, data); - pub_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + pub_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit("FOOBAR"), .flags = "rx:code" }, + { "data", ".data", str8_lit("QWE"), .flags = "rw:data" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_ExternFunc("global_func", "text", 1), + T_COFF_DefSymbol_Extern("global_var", "data", 1), + T_COFF_DefSymbol_Static("static_var", "data", 1), + {0} + } + }); } T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); @@ -5836,11 +5880,14 @@ TEST(ghash_check_corrupt) String8List h = {0}; str8_serial_begin(arena, &h); String8 debug_h = str8_serial_end(arena, &h); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); - String8 debug_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + String8 debug_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_h", ".debug$H", debug_h, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); @@ -5883,11 +5930,14 @@ TEST(ghash_check_magic) str8_serial_push_u64(arena, &h, 0x7ea8a529a89b2288ull); String8 debug_h = str8_serial_end(arena, &h); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); - String8 debug_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + String8 debug_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_h", ".debug$H", debug_h, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); @@ -5930,11 +5980,14 @@ TEST(ghash_check_version) str8_serial_push_u64(arena, &h, 0x7ea8a529a89b2288ull); String8 debug_h = str8_serial_end(arena, &h); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); - String8 debug_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + String8 debug_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_h", ".debug$H", debug_h, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); @@ -5969,11 +6022,14 @@ TEST(ghash_check_hash_alg) str8_serial_push_u64(arena, &h, 0x7ea8a529a89b2288ull); String8 debug_h = str8_serial_end(arena, &h); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); - String8 debug_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + String8 debug_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_h", ".debug$H", debug_h, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); @@ -6008,11 +6064,14 @@ TEST(ghash_match_debug_t) str8_serial_push_u64(arena, &h, 0x7ea8a529a89b2288ull); String8 debug_h = str8_serial_end(arena, &h); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); - String8 debug_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + String8 debug_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_h", ".debug$H", debug_h, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); @@ -6049,11 +6108,14 @@ TEST(ghash_basic) str8_serial_push_u64(arena, &h, 3); String8 debug_h = str8_serial_end(arena, &h); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); - a_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + a_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_h", ".debug$H", debug_h, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); } String8 b_obj; @@ -6072,11 +6134,14 @@ TEST(ghash_basic) str8_serial_push_u64(arena, &h, 6); String8 debug_h = str8_serial_end(arena, &h); - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".debug$T"), PE_DEBUG_SECTION_FLAGS, debug_t); - coff_obj_writer_push_section(cow, str8_lit(".debug$H"), PE_DEBUG_SECTION_FLAGS, debug_h); - b_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); + b_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", debug_t, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_h", ".debug$H", debug_h, .flags = "r:data", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); } T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); @@ -6164,41 +6229,41 @@ TEST(patch_cv_symbol_tree) TEST(whole_archive) { - String8 a_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".a"), PE_DATA_SECTION_FLAGS, str8_lit("a")); - a_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } - - String8 b_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - coff_obj_writer_push_section(cow, str8_lit(".b"), PE_DATA_SECTION_FLAGS, str8_lit("b")); - b_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } - - String8 a_lib; - { - COFF_LibWriter *ciw = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(ciw, str8_lit("a.obj"), a_obj); - a_lib = coff_lib_writer_serialize(arena, ciw, 0, 0, 1); - coff_lib_writer_release(&ciw); - } - - String8 b_lib; - { - COFF_LibWriter *ciw = coff_lib_writer_alloc(); - coff_lib_writer_push_obj(ciw, str8_lit("b.obj"), b_obj); - b_lib = coff_lib_writer_serialize(arena, ciw, 0, 0, 1); - coff_lib_writer_release(&ciw); - } - T_Ok(t_write_entry_obj()); - T_Ok(t_write_file(str8_lit("a.lib"), a_lib)); - T_Ok(t_write_file(str8_lit("b.lib"), b_lib)); + T_Ok(t_write_def_lib("a.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("a.obj"), + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".a", str8_lit("a"), .flags = "rw:data" }, + {0} + } + } + }, + {0} + } + })); + T_Ok(t_write_def_lib("b.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("b.obj"), + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "b", ".b", str8_lit("b"), .flags = "rw:data" }, + {0} + } + } + }, + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:all_libs.exe entry.obj /wholearchive a.lib b.lib"); T_Ok(g_last_exit_code == 0); @@ -6378,36 +6443,39 @@ TEST(determ_test) TEST(fold_two_funcs) { - String8 ident_funcs_obj; - { - U8 same_text[] = { - 0x48, 0x31, 0xc0, // xor rax, rax - 0xc3 // ret - }; - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text$mn"), PE_TEXT_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(same_text)); - COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text$mb"), PE_TEXT_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(same_text)); - coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); - COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_extern_func(cow, str8_lit("a"), 0, a_sect); - COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_extern_func(cow, str8_lit("b"), 0, b_sect); - - U8 entry_text[] = { - 0xe8, 0x00, 0x00, 0x00, 0x00, // call a - 0xe8, 0x00, 0x00, 0x00, 0x00, // call b - 0xc3, // ret - }; - COFF_ObjSection *entry_sect = t_push_text_section(cow, str8_array_fixed(entry_text)); - coff_obj_writer_push_symbol_extern_func(cow, str8_lit("entry"), 0, entry_sect); - coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); - coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); - - ident_funcs_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } - - T_Ok(t_write_file(str8_lit("ident_funcs.obj"), ident_funcs_obj)); + U8 same_text[] = { + 0x48, 0x31, 0xc0, // xor rax, rax + 0xc3 // ret + }; + U8 entry_text[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, // call a + 0xe8, 0x00, 0x00, 0x00, 0x00, // call b + 0xc3, // ret + }; + T_Ok(t_write_def_obj("ident_funcs.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "a", ".text$mn", str8_array_fixed(same_text), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "b", ".text$mb", str8_array_fixed(same_text), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { + "entry", ".text", str8_array_fixed(entry_text), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "a"), + T_COFF_DefReloc(X64_Rel32, 6, "b"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("b", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_ExternFunc("a", "a", 0), + T_COFF_DefSymbol_ExternFunc("b", "b", 0), + T_COFF_DefSymbol_ExternFunc("entry", "entry", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /opt:icf ident_funcs.obj"); T_Ok(g_last_exit_code == 0); @@ -6447,64 +6515,65 @@ TEST(fold_two_funcs) TEST(same_but_different) { - String8 obj; - { - U8 text[] = { - 0xe8, 0x00, 0x00, 0x00, 0x00, // call $ - 0xc3 - }; - - U8 return_1[] = { - 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 - 0xc3 // ret - }; - - U8 return_2[] = { - 0x48, 0xc7, 0xc0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 - 0xc3 // ret - }; - - U8 call_a_and_b[] = { - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xc3 - }; - - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - COFF_ObjSection *entry_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(call_a_and_b)); - COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(text)); - COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(text)); - COFF_ObjSection *c_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(return_1)); - COFF_ObjSection *d_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(return_2)); - - coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, c_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, d_sect, COFF_ComdatSelect_NoDuplicates); - - coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, entry_sect); - - COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("a"), 0, a_sect); - COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("b"), 0, b_sect); - COFF_ObjSymbol *c_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("c"), 0, c_sect); - COFF_ObjSymbol *d_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("d"), 0, d_sect); - - // a -> c - coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 1, c_symbol); - - // b -> d - coff_obj_writer_section_push_reloc_rel32(cow, b_sect, 1, d_symbol); - - // entry -> { a | b } - coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); - coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); - - obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } - - T_Ok(t_write_file(str8_lit("a.obj"), obj)); + U8 text[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, // call $ + 0xc3 + }; + U8 return_1[] = { + 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 + 0xc3 // ret + }; + U8 return_2[] = { + 0x48, 0xc7, 0xc0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2 + 0xc3 // ret + }; + U8 call_a_and_b[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "entry", ".text", str8_array_fixed(call_a_and_b), .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "a"), + T_COFF_DefReloc(X64_Rel32, 6, "b"), + {0} + } + }, + { + "a", ".text", str8_array_fixed(text), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT, + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "c"), + {0} + } + }, + { + "b", ".text", str8_array_fixed(text), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT, + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "d"), + {0} + } + }, + { "c", ".text", str8_array_fixed(return_1), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "d", ".text", str8_array_fixed(return_2), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("b", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("c", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("d", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Extern("entry", "entry", 0), + T_COFF_DefSymbol_Extern("a", "a", 0), + T_COFF_DefSymbol_Extern("b", "b", 0), + T_COFF_DefSymbol_Extern("c", "c", 0), + T_COFF_DefSymbol_Extern("d", "d", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /opt:icf a.obj"); T_Ok(g_last_exit_code == 0); @@ -6548,56 +6617,59 @@ TEST(same_but_different) TEST(fold_diamond) { - String8 a_obj; - { - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - - U8 call_b_and_c[] = { - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xc3 - }; - - U8 call_and_return[] = { - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xc3 - }; - - U8 clear_and_return[] = { - 0x48, 0x31, 0xc0, - 0xc3 - }; - - COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(call_b_and_c)); - COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(call_and_return)); - COFF_ObjSection *c_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(call_and_return)); - COFF_ObjSection *d_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(clear_and_return)); - - coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, c_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, d_sect, COFF_ComdatSelect_NoDuplicates); - - coff_obj_writer_push_symbol_extern(cow, str8_lit("a"), 0, a_sect); - COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("b"), 0, b_sect); - COFF_ObjSymbol *c_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("c"), 0, c_sect); - COFF_ObjSymbol *d_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("d"), 0, d_sect); - - // a -> { b | c } - coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 1, b_symbol); - coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 6, c_symbol); - - // b -> d - coff_obj_writer_section_push_reloc_rel32(cow, b_sect, 1, d_symbol); - - // c -> d - coff_obj_writer_section_push_reloc_rel32(cow, c_sect, 1, d_symbol); - - a_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + U8 call_b_and_c[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + U8 call_and_return[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + U8 clear_and_return[] = { + 0x48, 0x31, 0xc0, + 0xc3 + }; + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "a", ".text", str8_array_fixed(call_b_and_c), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT, + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "b"), + T_COFF_DefReloc(X64_Rel32, 6, "c"), + {0} + } + }, + { + "b", ".text", str8_array_fixed(call_and_return), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT, + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "d"), + {0} + } + }, + { + "c", ".text", str8_array_fixed(call_and_return), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT, + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "d"), + {0} + } + }, + { "d", ".text", str8_array_fixed(clear_and_return), .flags = "rx:code", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("b", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("c", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("d", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Extern("a", "a", 0), + T_COFF_DefSymbol_Extern("b", "b", 0), + T_COFF_DefSymbol_Extern("c", "c", 0), + T_COFF_DefSymbol_Extern("d", "d", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /entry:a /out:a.exe /opt:icf a.obj"); T_Ok(g_last_exit_code == 0); @@ -6638,28 +6710,35 @@ TEST(fold_diamond) TEST(cyclic_icf) { - String8 a_obj; - { - U8 text[] = { - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xc3 - }; - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text)); - COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_extern(cow, str8_lit("a"), 0, a_sect); - COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("b"), 0, b_sect); - - // a <-> b - coff_obj_writer_section_push_reloc_rel32(cow, a_sect, 1, b_symbol); - coff_obj_writer_section_push_reloc_rel32(cow, b_sect, 1, a_symbol); - - a_obj = coff_obj_writer_serialize(arena, cow); - - coff_obj_writer_release(&cow); - } - - T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); + U8 text[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; + T_Ok(t_write_def_obj("a.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "a", ".text", str8_array_fixed(text), .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "b"), + {0} + } + }, + { + "b", ".text", str8_array_fixed(text), .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "a"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("a", "a", 0), + T_COFF_DefSymbol_Static("b", "b", 0), + {0} + } + })); t_invoke_linkerf("/subsystem:console /out:a.exe /entry:a /opt:icf a.obj"); T_Ok(g_last_exit_code == 0); @@ -6693,68 +6772,66 @@ TEST(cyclic_icf) TEST(fold_with_largest_align) { - String8 a_obj; - { - U8 text[] = { - 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 - 0xc3 - }; + U8 text[] = { + 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 + 0xc3 + }; + U8 call_a_and_b[] = { + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x00, 0x00, 0x00, 0x00, + 0xc3 + }; - U8 call_a_and_b[] = { - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xc3 - }; - - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *entry_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(call_a_and_b)); - COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_Align4Bytes, str8_array_fixed(text)); - COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_Align8Bytes, str8_array_fixed(text)); - - coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); - - coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, entry_sect); - COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("a"), 0, a_sect); - COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("b"), 0, b_sect); - coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); - coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); - - a_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } + String8 a_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "entry", ".text", str8_array_fixed(call_a_and_b), .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "a"), + T_COFF_DefReloc(X64_Rel32, 6, "b"), + {0} + } + }, + { "a", ".text", str8_array_fixed(text), .flags = "rx:code@4", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "b", ".text", str8_array_fixed(text), .flags = "rx:code@8", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("b", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Extern("entry", "entry", 0), + T_COFF_DefSymbol_Static("a", "a", 0), + T_COFF_DefSymbol_Static("b", "b", 0), + {0} + } + }); // swap sections for a and b - String8 b_obj; - { - U8 text[] = { - 0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1 - 0xc3 - }; - - U8 call_a_and_b[] = { - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xe8, 0x00, 0x00, 0x00, 0x00, - 0xc3 - }; - - COFF_ObjWriter *cow = coff_obj_writer_alloc(0, COFF_MachineType_X64); - COFF_ObjSection *entry_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(call_a_and_b)); - COFF_ObjSection *a_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_Align8Bytes, str8_array_fixed(text)); - COFF_ObjSection *b_sect = coff_obj_writer_push_section(cow, str8_lit(".text"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_Align4Bytes, str8_array_fixed(text)); - - coff_obj_writer_push_symbol_secdef(cow, a_sect, COFF_ComdatSelect_NoDuplicates); - coff_obj_writer_push_symbol_secdef(cow, b_sect, COFF_ComdatSelect_NoDuplicates); - - coff_obj_writer_push_symbol_extern(cow, str8_lit("entry"), 0, entry_sect); - COFF_ObjSymbol *a_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("a"), 0, a_sect); - COFF_ObjSymbol *b_symbol = coff_obj_writer_push_symbol_static(cow, str8_lit("b"), 0, b_sect); - coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 1, a_symbol); - coff_obj_writer_section_push_reloc_rel32(cow, entry_sect, 6, b_symbol); - - b_obj = coff_obj_writer_serialize(arena, cow); - coff_obj_writer_release(&cow); - } + String8 b_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "entry", ".text", str8_array_fixed(call_a_and_b), .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 1, "a"), + T_COFF_DefReloc(X64_Rel32, 6, "b"), + {0} + } + }, + { "a", ".text", str8_array_fixed(text), .flags = "rx:code@8", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { "b", ".text", str8_array_fixed(text), .flags = "rx:code@4", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("a", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Secdef("b", COFF_ComdatSelect_NoDuplicates), + T_COFF_DefSymbol_Extern("entry", "entry", 0), + T_COFF_DefSymbol_Static("a", "a", 0), + T_COFF_DefSymbol_Static("b", "b", 0), + {0} + } + }); T_Ok(t_write_file(str8_lit("a.obj"), a_obj)); T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); From 35e00de05c4a2c66a34e0a160f27b9013c8d73bd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 24 Apr 2026 10:21:32 -0700 Subject: [PATCH 464/850] d2r2: cross-unit, cross-lane type deduplication --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 241 ++++++++++++++++++++++++++ src/rdi_from_dwarf/rdi_from_dwarf_2.h | 5 + 2 files changed, 246 insertions(+) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index f1b9176f..8c6c43a5 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1,6 +1,25 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Helpers + +internal U64 +d2r2_hash_from_seed_tag(U64 seed, DW2_Tag *tag) +{ + U64 result = seed; + result = u64_hash_from_seed_str8(result, str8_struct(&tag->kind)); + for EachNode(n, DW2_AttribNode, tag->attribs.first) + { + DW2_Attrib *attrib = &n->v; + result = u64_hash_from_seed_str8(result, str8_struct(&attrib->attrib_kind)); + result = u64_hash_from_seed_str8(result, str8_struct(&attrib->val.kind)); + result = u64_hash_from_seed_str8(result, attrib->val.string); + result = u64_hash_from_seed_str8(result, str8_struct(&attrib->val.u128)); + } + return result; +} + //////////////////////////////// //~ rjf: Main Conversion Entry Point (New) @@ -863,6 +882,228 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync_u64(&builtin_type_from_kind_map, 0); #define d2r2_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_types[k - RDI_TypeKind_FirstBuiltIn] : 0) + //////////////////////////// + //- rjf: predict the total number of tags in all units + // + U64 total_tag_count_estimate = 1; + { + U64 tag_size_estimate = 32; + for EachIndex(unit_idx, unit_info_ranges->count) + { + total_tag_count_estimate += dim_1u64(unit_info_ranges->v[unit_idx]) / tag_size_estimate; + } + } + + //////////////////////////// + //- rjf: gather all unique type tags across all units + // + typedef struct UniqueTypeTagNode UniqueTypeTagNode; + struct UniqueTypeTagNode + { + UniqueTypeTagNode *next; + U64 hash; + U64 unit_idx; + U64 info_off; + }; + typedef struct UnitTypeNode UnitTypeNode; + struct UnitTypeNode + { + UnitTypeNode *next; + U64 src_info_off; + U64 dst_hash; + }; + typedef struct UnitTypeMap UnitTypeMap; + struct UnitTypeMap + { + UnitTypeNode **slots; + U64 slots_count; + }; + UniqueTypeTagNode **unique_type_tag_slots = 0; + U64 unique_type_tag_slots_count = total_tag_count_estimate/8 + 1; + UnitTypeMap *unit_type_maps = 0; + { + if(lane_idx() == 0) + { + unique_type_tag_slots = push_array(scratch.arena, UniqueTypeTagNode *, unique_type_tag_slots_count); + unit_type_maps = push_array(scratch.arena, UnitTypeMap, unit_count); + } + lane_sync_u64(&unique_type_tag_slots, 0); + lane_sync_u64(&unit_type_maps, 0); + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + //- rjf: take next unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; + if(unit_idx >= unit_count) + { + break; + } + + //- rjf: unpack unit + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_range = unit_info_ranges->v[unit_idx]; + + //- rjf: set up type map for this unit + unit_type_maps[unit_idx].slots_count = dim_1u64(unit_info_range) / 256 + 1; + unit_type_maps[unit_idx].slots = push_array(scratch.arena, UnitTypeNode *, unit_type_maps[unit_idx].slots_count); + + //- rjf: find all type tags in this unit + for(U64 off = unit_info_range.min; off < unit_info_range.max;) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; + + // rjf: read next tag + DW2_Tag tag = {0}; + off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + + // rjf: if offset not advanced -> increment + if(off == start_off) + { + off += 1; + } + + // rjf: if type tag -> read full tree, hash, gather + switch(tag.kind) + { + default:{}break; + case DW_TagKind_ArrayType: + case DW_TagKind_ClassType: + case DW_TagKind_EnumerationType: + case DW_TagKind_PointerType: + case DW_TagKind_ReferenceType: + case DW_TagKind_StringType: + case DW_TagKind_StructureType: + case DW_TagKind_SubroutineType: + case DW_TagKind_Typedef: + case DW_TagKind_UnionType: + case DW_TagKind_PtrToMemberType: + case DW_TagKind_SetType: + case DW_TagKind_SubrangeType: + case DW_TagKind_BaseType: + case DW_TagKind_ConstType: + case DW_TagKind_FileType: + case DW_TagKind_PackedType: + case DW_TagKind_VolatileType: + case DW_TagKind_RestrictType: + case DW_TagKind_InterfaceType: + case DW_TagKind_UnspecifiedType: + case DW_TagKind_SharedType: + case DW_TagKind_RValueReferenceType: + case DW_TagKind_CoarrayType: + case DW_TagKind_DynamicType: + case DW_TagKind_AtomicType: + case DW_TagKind_ImmutableType: + { + // rjf: form hash from top-level tag + U64 hash = d2r2_hash_from_seed_tag(5381, &tag); + + // rjf: if this tag has children -> hash all children, combine into `hash` + if(tag.has_children) + { + U64 depth = 1; + for(;off < unit_info_range.max && depth > 0;) + { + Temp temp = temp_begin(scratch2.arena); + U64 start_off_2 = off; + + // rjf: read descendant tag + DW2_Tag descendant_tag = {0}; + off += dw2_read_tag(temp.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &descendant_tag); + + // rjf: if offset not advanced -> increment + if(off == start_off_2) + { + off += 1; + } + + // rjf: combine hash of descendant tag to main hash + hash = d2r2_hash_from_seed_tag(hash, &descendant_tag); + + // rjf: navigate the tree + if(descendant_tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + else if(descendant_tag.has_children) + { + depth += 1; + } + + temp_end(temp); + } + } + + // rjf: atomically gather this hash if not already gathered + { + B32 gathered = 0; + U64 slot_idx = hash%unique_type_tag_slots_count; + for(;!gathered;) + { + // rjf: read existing slot head pointer *before* we lookup / insert + U64 slot_head_val = ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); + + // rjf: determine if this hash has been gathered + for(UniqueTypeTagNode *n = (UniqueTypeTagNode *)slot_head_val; n != 0; n = n->next) + { + if(n->hash == hash) + { + gathered = 1; + break; + } + } + + // rjf: if this hash has *not* been gathered, try an insert. we: + // + // 1. allocate/fill a node + // 2. set it up to point to the old head + // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above + // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again + // (we may find that another thread has filled this hash, so we'll just be done) + // + if(!gathered) + { + Temp insert_temp = temp_begin(scratch.arena); + UniqueTypeTagNode *n = push_array(scratch.arena, UniqueTypeTagNode, 1); + n->next = (UniqueTypeTagNode *)slot_head_val; + n->hash = hash; + n->unit_idx = unit_idx; + n->info_off = start_off; + U64 new_head_val = (U64)n; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_type_tag_slots[slot_idx], slot_head_val, new_head_val)) + { + gathered = 1; + } + else + { + temp_end(insert_temp); + } + } + } + } + + // rjf: record this (info_off -> hash) mapping, so that when we have + // later references to this type, we can redirect to the deduplicated + // type with the right hash later. + { + U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 info_off_slot_idx = info_off_hash%unit_type_maps[unit_idx].slots_count; + UnitTypeNode *n = push_array(scratch.arena, UnitTypeNode, 1); + n->src_info_off = start_off; + n->dst_hash = hash; + SLLStackPush(unit_type_maps[unit_idx].slots[info_off_slot_idx], n); + } + }break; + } + + scratch_end(scratch2); + } + } + lane_sync(); + } + //////////////////////////// //- rjf: fill result // diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h index 91253e18..936f0479 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -21,6 +21,11 @@ struct D2R2_ConvertParams B32 deterministic; }; +//////////////////////////////// +//~ rjf: Helpers + +internal U64 d2r2_hash_from_seed_tag(U64 seed, DW2_Tag *tag); + //////////////////////////////// //~ rjf: Main Conversion Entry Point (New) From ad0d023c93424f3367a1d028af802d4cb7480ee6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 24 Apr 2026 20:33:47 -0700 Subject: [PATCH 465/850] d2r2 type deduplication: further work on type content hashing; correct .debug_str_offsets handling; sketch out type dependency chain build --- src/base/base_math.c | 30 +- src/base/base_math.h | 2 +- src/dwarf/dwarf.c | 278 ++++++------- src/dwarf/dwarf_parse.c | 16 +- src/dwarf/dwarf_parse_2.c | 71 +++- src/dwarf/dwarf_parse_2.h | 20 + src/linker/lnk_debug_info.c | 6 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 572 +++++++++++++++++++------- src/rdi_from_dwarf/rdi_from_dwarf_2.h | 5 - 9 files changed, 674 insertions(+), 326 deletions(-) diff --git a/src/base/base_math.c b/src/base/base_math.c index 266d6a45..9eabae08 100644 --- a/src/base/base_math.c +++ b/src/base/base_math.c @@ -758,34 +758,32 @@ rng1u64_array_from_list(Arena *arena, Rng1U64List *list) } internal U64 -rng_1u64_array_bsearch(Rng1U64Array arr, U64 value) +rng1u64_array_num_from_value__binary_search(Rng1U64Array *array, U64 value) { - if(arr.count > 0 && arr.v[0].min < value && value < arr.v[arr.count-1].max) + U64 result = 0; + if(array->count > 0 && array->v[0].min <= value && value < array->v[array->count-1].max) { - U64 l = 0; - U64 r = arr.count - 1; - for(; l <= r; ) + U64 min_idx = 0; + U64 max_idx = array->count - 1; + for(;min_idx <= max_idx;) { - U64 m = l + (r - l) / 2; - if(contains_1u64(arr.v[m], value)) + U64 mid_idx = min_idx + (max_idx - min_idx) / 2; + if(contains_1u64(array->v[mid_idx], value)) { - return m; + result = mid_idx+1; + break; } - else if(arr.v[m].min < value) + else if(array->v[mid_idx].min < value) { - l = m + 1; + min_idx = mid_idx + 1; } else { - r = m - 1; + max_idx = mid_idx - 1; } } } - else if(arr.count == 1 && contains_1u64(arr.v[0], value)) - { - return 0; - } - return max_U64; + return result; } internal void diff --git a/src/base/base_math.h b/src/base/base_math.h index 37dd6c7a..b31c0699 100644 --- a/src/base/base_math.h +++ b/src/base/base_math.h @@ -682,7 +682,7 @@ internal void rng1u64_list_push_node(Rng1U64List *list, Rng1U64Node *n); internal Rng1U64Node * rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng); internal void rng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat); internal Rng1U64Array rng1u64_array_from_list(Arena *arena, Rng1U64List *list); -internal U64 rng_1u64_array_bsearch(Rng1U64Array arr, U64 value); +internal U64 rng1u64_array_num_from_value__binary_search(Rng1U64Array *array, U64 value); internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list); diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index b11d7e60..275a73fa 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -245,9 +245,9 @@ internal U64 dw_reg_count_from_arch(Arch arch) { switch (arch) { - default: { NotImplemented; } // fall-through - case Arch_Null: return 0; - case Arch_x64: return DW_RegX64_Last; + default: { NotImplemented; } // fall-through + case Arch_Null: return 0; + case Arch_x64: return DW_RegX64_Last; } } @@ -269,9 +269,9 @@ internal U64 dw_sp_from_arch(Arch arch) { switch (arch) { - default: NotImplemented; - case Arch_Null: return 0; - case Arch_x64: return DW_RegX64_Rsp; + default: NotImplemented; + case Arch_Null: return 0; + case Arch_x64: return DW_RegX64_Rsp; } } @@ -280,11 +280,11 @@ internal U64 dw_size_from_format(DW_Format format) { U64 result = 0; - switch (format) { - case DW_Format_Null: break; - case DW_Format_32Bit: result = 4; break; - case DW_Format_64Bit: result = 8; break; - default: InvalidPath; break; + switch(format) + { + case DW_Format_Null:{}break; + case DW_Format_32Bit:{result = 4;}break; + case DW_Format_64Bit:{result = 8;}break; } return result; } @@ -389,11 +389,11 @@ dw_operand_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _OPER_COUNT; DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -404,11 +404,11 @@ dw_pop_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _POP_COUNT; DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -419,11 +419,11 @@ dw_push_count_from_expr_op(DW_ExprOp op) switch (op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _PUSH_COUNT; DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -433,12 +433,12 @@ dw_operand_types_from_expr_opcode(DW_ExprOp op) { #define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, _OPER_TYPE0, _OPER_TYPE1) case _ID: { local_persist DW_ExprOperandType t[] = { DW_ExprOperandType_##_OPER_TYPE0, DW_ExprOperandType_##_OPER_TYPE1 }; return t; } switch (op) { - DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList + DW_Expr_V3_XList + DW_Expr_V4_XList + DW_Expr_V5_XList + DW_Expr_GNU_XList #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -450,7 +450,7 @@ dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode) #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return ArrayCount(t)-1; } DW_CFA_Kind_XList #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -460,21 +460,21 @@ dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode) { B32 is_invalid = 0; switch (opcode) { - case DW_ExprOp_Addrx: - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: - case DW_ExprOp_ConstType: - case DW_ExprOp_Constx: - case DW_ExprOp_Convert: - case DW_ExprOp_DerefType: - case DW_ExprOp_RegvalType: - case DW_ExprOp_Reinterpret: - case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_CallFrameCfa: { - is_invalid = 1; - } break; - default: break; + case DW_ExprOp_Addrx: + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: + case DW_ExprOp_ConstType: + case DW_ExprOp_Constx: + case DW_ExprOp_Convert: + case DW_ExprOp_DerefType: + case DW_ExprOp_RegvalType: + case DW_ExprOp_Reinterpret: + case DW_ExprOp_PushObjectAddress: + case DW_ExprOp_CallFrameCfa: { + is_invalid = 1; + } break; + default: break; } return is_invalid; } @@ -484,14 +484,14 @@ dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode) { B32 is_new_row_op = 0; switch (opcode) { - case DW_CFA_SetLoc: - case DW_CFA_AdvanceLoc: - case DW_CFA_AdvanceLoc1: - case DW_CFA_AdvanceLoc2: - case DW_CFA_AdvanceLoc4: { - is_new_row_op = 1; - } break; - default: break; + case DW_CFA_SetLoc: + case DW_CFA_AdvanceLoc: + case DW_CFA_AdvanceLoc1: + case DW_CFA_AdvanceLoc2: + case DW_CFA_AdvanceLoc4: { + is_new_row_op = 1; + } break; + default: break; } return is_new_row_op; } @@ -503,7 +503,7 @@ dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode) #define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return &t[0] + 1; } DW_CFA_Kind_XList #undef X - default: { NotImplemented; } break; + default: { NotImplemented; } break; } return 0; } @@ -512,9 +512,9 @@ internal String8 dw_string_from_format(DW_Format format) { switch (format) { - case DW_Format_Null: return str8_lit("NULL"); - case DW_Format_32Bit: return str8_lit("DWARF32"); - case DW_Format_64Bit: return str8_lit("DWARF64"); + case DW_Format_Null: return str8_lit("NULL"); + case DW_Format_32Bit: return str8_lit("DWARF32"); + case DW_Format_64Bit: return str8_lit("DWARF64"); } return str8_zero(); } @@ -810,7 +810,7 @@ dw_string_from_cfa_opcode(DW_CFA_Opcode opcode) #define X(_NAME, _ID, ...) case _ID: return str8_lit(Stringify(_NAME)); DW_CFA_Kind_XList #undef X - default: InvalidPath; break; + default: InvalidPath; break; } return str8_zero(); } @@ -965,78 +965,78 @@ internal B32 dw_form_match(DW_Form a, DW_Form b) { B32 is_match = 0; - + if (a.kind == b.kind) { switch (a.kind) { - case DW_Form_Null: {} break; - - case DW_Form_Addr: { is_match = str8_match(a.addr, b.addr, 0); } break; - case DW_Form_String: { is_match = str8_match(a.string, b.string, 0); } break; - case DW_Form_ExprLoc: { is_match = str8_match(a.exprloc, b.exprloc, 0); } break; - - case DW_Form_Block: - case DW_Form_Block1: - case DW_Form_Block2: - case DW_Form_Block4: { - is_match = str8_match(a.block, b.block, 0); - } break; - - case DW_Form_Data1: - case DW_Form_Data2: - case DW_Form_Data4: - case DW_Form_Data8: - case DW_Form_Data16: { - is_match = str8_match(a.data, b.data, 0); - } break; - - case DW_Form_Flag: { is_match = a.flag == b.flag; } break; - case DW_Form_SData: { is_match = a.sdata == b.sdata; } break; - case DW_Form_UData: { is_match = a.udata == b.udata; } break; - - case DW_Form_RefAddr: - case DW_Form_Ref1: - case DW_Form_Ref2: - case DW_Form_Ref4: - case DW_Form_Ref8: - case DW_Form_RefUData: - case DW_Form_GNU_RefAlt: { - is_match = a.ref == b.ref; - } break; - - case DW_Form_Indirect: { NotImplemented; } break; - - case DW_Form_SecOffset: - case DW_Form_LineStrp: - case DW_Form_GNU_StrpAlt: { - is_match = a.sec_offset == b.sec_offset; - } break; - - case DW_Form_ImplicitConst: { is_match = a.implicit_const, b.implicit_const; } break; - - case DW_Form_Strx: - case DW_Form_Strx1: - case DW_Form_Strx2: - case DW_Form_Strx3: - case DW_Form_Strx4: - case DW_Form_Addrx: - case DW_Form_Addrx1: - case DW_Form_Addrx2: - case DW_Form_Addrx3: - case DW_Form_Addrx4: - case DW_Form_RngListx: - case DW_Form_LocListx: { - is_match = a.xval == b.xval; - } break; - - case DW_Form_StrpSup: { is_match = a.strp_sup == b.strp_sup; } break; - - case DW_Form_RefSup4: { NotImplemented; } break; - case DW_Form_RefSup8: { NotImplemented; } break; - - default: { InvalidPath; } break; + case DW_Form_Null: {} break; + + case DW_Form_Addr: { is_match = str8_match(a.addr, b.addr, 0); } break; + case DW_Form_String: { is_match = str8_match(a.string, b.string, 0); } break; + case DW_Form_ExprLoc: { is_match = str8_match(a.exprloc, b.exprloc, 0); } break; + + case DW_Form_Block: + case DW_Form_Block1: + case DW_Form_Block2: + case DW_Form_Block4: { + is_match = str8_match(a.block, b.block, 0); + } break; + + case DW_Form_Data1: + case DW_Form_Data2: + case DW_Form_Data4: + case DW_Form_Data8: + case DW_Form_Data16: { + is_match = str8_match(a.data, b.data, 0); + } break; + + case DW_Form_Flag: { is_match = a.flag == b.flag; } break; + case DW_Form_SData: { is_match = a.sdata == b.sdata; } break; + case DW_Form_UData: { is_match = a.udata == b.udata; } break; + + case DW_Form_RefAddr: + case DW_Form_Ref1: + case DW_Form_Ref2: + case DW_Form_Ref4: + case DW_Form_Ref8: + case DW_Form_RefUData: + case DW_Form_GNU_RefAlt: { + is_match = a.ref == b.ref; + } break; + + case DW_Form_Indirect: { NotImplemented; } break; + + case DW_Form_SecOffset: + case DW_Form_LineStrp: + case DW_Form_GNU_StrpAlt: { + is_match = a.sec_offset == b.sec_offset; + } break; + + case DW_Form_ImplicitConst: { is_match = a.implicit_const, b.implicit_const; } break; + + case DW_Form_Strx: + case DW_Form_Strx1: + case DW_Form_Strx2: + case DW_Form_Strx3: + case DW_Form_Strx4: + case DW_Form_Addrx: + case DW_Form_Addrx1: + case DW_Form_Addrx2: + case DW_Form_Addrx3: + case DW_Form_Addrx4: + case DW_Form_RngListx: + case DW_Form_LocListx: { + is_match = a.xval == b.xval; + } break; + + case DW_Form_StrpSup: { is_match = a.strp_sup == b.strp_sup; } break; + + case DW_Form_RefSup4: { NotImplemented; } break; + case DW_Form_RefSup8: { NotImplemented; } break; + + default: { InvalidPath; } break; } } - + return is_match; } @@ -1044,20 +1044,20 @@ internal U64 dw_length_from_std_opcode(DW_StdOpcode opcode) { switch (opcode) { - case DW_StdOpcode_ExtendedOpcode: return 0; - case DW_StdOpcode_Copy: return 0; - case DW_StdOpcode_AdvancePc: return 1; - case DW_StdOpcode_AdvanceLine: return 1; - case DW_StdOpcode_SetFile: return 1; - case DW_StdOpcode_SetColumn: return 1; - case DW_StdOpcode_NegateStmt: return 0; - case DW_StdOpcode_SetBasicBlock: return 0; - case DW_StdOpcode_ConstAddPc: return 0; - case DW_StdOpcode_FixedAdvancePc: return 1; - case DW_StdOpcode_SetPrologueEnd: return 0; - case DW_StdOpcode_SetEpilogueBegin: return 0; - case DW_StdOpcode_SetIsa: return 1; - default: InvalidPath; break; + case DW_StdOpcode_ExtendedOpcode: return 0; + case DW_StdOpcode_Copy: return 0; + case DW_StdOpcode_AdvancePc: return 1; + case DW_StdOpcode_AdvanceLine: return 1; + case DW_StdOpcode_SetFile: return 1; + case DW_StdOpcode_SetColumn: return 1; + case DW_StdOpcode_NegateStmt: return 0; + case DW_StdOpcode_SetBasicBlock: return 0; + case DW_StdOpcode_ConstAddPc: return 0; + case DW_StdOpcode_FixedAdvancePc: return 1; + case DW_StdOpcode_SetPrologueEnd: return 0; + case DW_StdOpcode_SetEpilogueBegin: return 0; + case DW_StdOpcode_SetIsa: return 1; + default: InvalidPath; break; } return 0; } diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index d55925d2..1c042c5d 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -2072,16 +2072,16 @@ dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 U64 loclists_sec_off = dw_interp_sec_offset(loclists_base_attrib->form ); // map section offset to unit index - U64 addr_lu_idx = rng_1u64_array_bsearch(lu_input.addr_ranges, addr_sec_off ); - U64 str_offsets_lu_idx = rng_1u64_array_bsearch(lu_input.str_offset_ranges, str_offsets_sec_off); - U64 rnglists_lu_idx = rng_1u64_array_bsearch(lu_input.rnglist_ranges, rnglists_sec_off ); - U64 loclists_lu_idx = rng_1u64_array_bsearch(lu_input.loclist_ranges, loclists_sec_off ); + U64 addr_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.addr_ranges, addr_sec_off ); + U64 str_offsets_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.str_offset_ranges, str_offsets_sec_off); + U64 rnglists_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.rnglist_ranges, rnglists_sec_off ); + U64 loclists_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.loclist_ranges, loclists_sec_off ); // map index to unit - DW_ListUnit *addr_lu = addr_lu_idx < lu_input.addr_count ? &lu_input.addrs[addr_lu_idx] : 0; - DW_ListUnit *str_offsets_lu = str_offsets_lu_idx < lu_input.str_offset_count ? &lu_input.str_offsets[str_offsets_lu_idx] : 0; - DW_ListUnit *rnglists_lu = rnglists_lu_idx < lu_input.rnglist_count ? &lu_input.rnglists[rnglists_lu_idx] : 0; - DW_ListUnit *loclists_lu = loclists_lu_idx < lu_input.loclist_count ? &lu_input.loclists[loclists_lu_idx] : 0; + DW_ListUnit *addr_lu = 0 < (addr_lu_num && addr_lu_num <= lu_input.addr_count) ? &lu_input.addrs[addr_lu_num-1] : 0; + DW_ListUnit *str_offsets_lu = 0 < (str_offsets_lu_num && str_offsets_lu_num <= lu_input.str_offset_count) ? &lu_input.str_offsets[str_offsets_lu_num-1] : 0; + DW_ListUnit *rnglists_lu = 0 < (rnglists_lu_num && rnglists_lu_num <= lu_input.rnglist_count) ? &lu_input.rnglists[rnglists_lu_num-1] : 0; + DW_ListUnit *loclists_lu = 0 < (loclists_lu_num && loclists_lu_num <= lu_input.loclist_count) ? &lu_input.loclists[loclists_lu_num-1] : 0; // find compile unit base address DW_Attrib *low_pc_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LowPc); diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 9148e40f..3961ccc7 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -399,8 +399,19 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin case DW_Form_Strx3: case DW_Form_Strx4: case DW_Form_Strx: + if(ctx->str_offsets_table != 0) { - // TODO(rjf) + U64 entry_idx = val.u128.u64[0]; + if(entry_idx < ctx->str_offsets_table->entries_count) + { + U64 entry_size = ctx->str_offsets_table->entry_size; + U64 entry_off = entry_idx * entry_size; + U64 string_data_off = 0; + MemoryCopy(&string_data_off, (U8 *)ctx->str_offsets_table->entries + entry_off, entry_size); + String8 string_section_data = ctx->raw->sec[DW_Section_Str].data; + val.string = str8_cstring_capped(string_section_data.str + string_data_off, + string_section_data.str + string_section_data.size); + } }break; case DW_Form_LineStrp: { @@ -545,6 +556,25 @@ dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind) return result; } +internal U64 +dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v) +{ + U64 result = 0; + switch(v->kind) + { + default:{}break; + case DW_Form_Ref1: + case DW_Form_Ref2: + case DW_Form_Ref4: + case DW_Form_Ref8: + { + result = v->u128.u64[0]; + }break; + // TODO(rjf): DW_Form_RefAddr, DW_Form_RefUData, DW_Form_RefSig8, DW_Form_RefSup8, etc. + } + return result; +} + //////////////////////////////// //~ rjf: Line Table Parsing @@ -831,3 +861,42 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of scratch_end(scratch); return bytes_read; } + +//////////////////////////////// +//~ rjf: String Offset Table Parsing (.debug_str_offsets) + +internal U64 +dw2_read_str_offsets_table(String8 data, U64 off, DW2_StrOffsetsTable *out) +{ + U64 start_off = off; + { + // rjf: read data length / format + U64 unit_data_length = 0; + DW_Format format = DW_Format_Null; + off += dw2_read_initial_length(data, off, &unit_data_length, &format); + U64 unit_data_off_opl = off + unit_data_length; + + // rjf: read version + DW_Version version = DW_Version_Null; + off += str8_deserial_read_struct(data, off, &version); + + // rjf: version 5: read rest (this section only exists in 5+) + if(version == DW_Version_5) + { + // rjf: skip padding + off += sizeof(U16); + + // rjf: fill table info + out->format = format; + out->version = version; + out->entry_size = dw_size_from_format(format); + out->entries_count = (unit_data_off_opl - off) / out->entry_size; + out->entries = data.str + off; + + // rjf: skip table + off = unit_data_off_opl; + } + } + U64 bytes_read = (off - start_off); + return bytes_read; +} diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index 8ee995b8..cd036c37 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -36,6 +36,19 @@ struct DW2_AbbrevMap U64 slots_count; }; +//////////////////////////////// +//~ rjf: String Offset Table (.debug_str_offsets) + +typedef struct DW2_StrOffsetsTable DW2_StrOffsetsTable; +struct DW2_StrOffsetsTable +{ + DW_Format format; + DW_Version version; + U64 entry_size; + U64 entries_count; + void *entries; +}; + //////////////////////////////// //~ rjf: Parsing Context Bundle @@ -49,6 +62,7 @@ struct DW2_ParseCtx DW_Format format; U64 addr_size; DW2_AbbrevMap *abbrev_map; + DW2_StrOffsetsTable *str_offsets_table; String8 unit_dir; String8 unit_file; }; @@ -210,10 +224,16 @@ internal U64 dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_Form internal U64 dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); internal DW2_Attrib *dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind); +internal U64 dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v); //////////////////////////////// //~ rjf: Line Table Parsing internal U64 dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out); +//////////////////////////////// +//~ rjf: String Offset Table Parsing (.debug_str_offsets) + +internal U64 dw2_read_str_offsets_table(String8 data, U64 off, DW2_StrOffsetsTable *out); + #endif // DWARF_PARSE_2_H diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 51e30c05..db77c900 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -2415,7 +2415,8 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) if (obj_sect_header->vsize == 0) { continue; } - sect_number = rng_1u64_array_bsearch(task->image_section_virt_ranges, obj_sect_header->voff); + U64 sect_num = rng1u64_array_num_from_value__binary_search(&task->image_section_virt_ranges, obj_sect_header->voff); + sect_number = sect_num-1; Assert(sect_number < task->image_section_virt_ranges.count); sect_data = str8_zero(); sect_off = obj_sect_header->voff - task->image_section_virt_ranges.v[sect_number].min; @@ -2424,7 +2425,8 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) if (obj_sect_header->fsize == 0) { continue; } - sect_number = rng_1u64_array_bsearch(task->image_section_file_ranges, obj_sect_header->foff); + U64 sect_num = rng1u64_array_num_from_value__binary_search(&task->image_section_file_ranges, obj_sect_header->foff); + sect_number = sect_num-1; Assert(sect_number < task->image_section_file_ranges.count); sect_data = str8_substr(task->image_data, rng_1u64(obj_sect_header->foff, obj_sect_header->foff + obj_sect_header->fsize)); sect_off = obj_sect_header->foff - task->image_section_file_ranges.v[sect_number].min; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 8c6c43a5..750aa48d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1,25 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// -//~ rjf: Helpers - -internal U64 -d2r2_hash_from_seed_tag(U64 seed, DW2_Tag *tag) -{ - U64 result = seed; - result = u64_hash_from_seed_str8(result, str8_struct(&tag->kind)); - for EachNode(n, DW2_AttribNode, tag->attribs.first) - { - DW2_Attrib *attrib = &n->v; - result = u64_hash_from_seed_str8(result, str8_struct(&attrib->attrib_kind)); - result = u64_hash_from_seed_str8(result, str8_struct(&attrib->val.kind)); - result = u64_hash_from_seed_str8(result, attrib->val.string); - result = u64_hash_from_seed_str8(result, str8_struct(&attrib->val.u128)); - } - return result; -} - //////////////////////////////// //~ rjf: Main Conversion Entry Point (New) @@ -276,6 +257,86 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync(); + //////////////////////////// + //- rjf: parse all string offsets tables + // + // in an incredible twist of fate, DWARF decided to decouple these from + // compilation units. compilation units *do* contain a + // DW_AttribKind_StrOffsetsBase attribute. but this base offset does *not* + // point to the beginning of a table in .debug_str_offsets! it instead points + // PAST THE INITIAL VARIABLE-WIDTH LENGTH AND FORMAT ENCODING! this means + // you can't actually use the StrOffsetsBase attribute for ANYTHING other + // than correllating a unit to its associated string offset table - but you + // *necessarily needed to have parsed that table beforehand*, completely + // independently from units. + // + // so, we have to parse all the string offset tables up-front, then + // *binary search* their ranges to determine which unit has which table. + // + // of course, in practice, it's perhaps likely/expected that these match + // one-to-one with units, and in the same order, because that is what is + // most natural for generators. but, the format does not *guarantee this*, + // and instead specced something far more arbitrary. + // + // thank you, again, DWARF. + // + U64 str_offsets_tables_count = 0; + DW2_StrOffsetsTable *str_offsets_tables = 0; + Rng1U64 *str_offsets_tables_ranges = 0; + ProfScope("parse all string offsets tables") if(lane_idx() == 0) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: gather all tables (loose) + typedef struct TableNode TableNode; + struct TableNode + { + TableNode *next; + DW2_StrOffsetsTable v; + Rng1U64 range; + }; + TableNode *first_table = 0; + TableNode *last_table = 0; + U64 table_count = 0; + for(U64 off = 0; off < raw->sec[DW_Section_StrOffsets].data.size;) + { + U64 start_off = off; + DW2_StrOffsetsTable table = {0}; + off += dw2_read_str_offsets_table(raw->sec[DW_Section_StrOffsets].data, off, &table); + if(table.entries != 0) + { + TableNode *n = push_array(scratch2.arena, TableNode, 1); + SLLQueuePush(first_table, last_table, n); + n->v = table; + n->range = r1u64(start_off, off); + table_count += 1; + } + if(off == start_off) + { + break; + } + } + + //- rjf: tighten + str_offsets_tables_count = table_count; + str_offsets_tables = push_array(scratch.arena, DW2_StrOffsetsTable, str_offsets_tables_count); + str_offsets_tables_ranges = push_array(scratch.arena, Rng1U64, str_offsets_tables_count); + { + U64 idx = 0; + for EachNode(n, TableNode, first_table) + { + str_offsets_tables[idx] = n->v; + str_offsets_tables_ranges[idx] = n->range; + idx += 1; + } + } + + scratch_end(scratch2); + } + lane_sync_u64(&str_offsets_tables_count, 0); + lane_sync_u64(&str_offsets_tables, 0); + lane_sync_u64(&str_offsets_tables_ranges, 0); + //////////////////////////// //- rjf: build per-unit parsing contexts // @@ -301,7 +362,58 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync(); //////////////////////////// - //- rjf: parse each unit's root-level tag + //- rjf: do initial parse of each unit's root-level tag + // + // an incredible NOTE: this is actually not sufficient. because this tag parse + // is what informs us which .debug_str_offsets table each unit should be associated + // with (via the StrOffsetsBase attribute), we actually don't have the right string + // offset table *before* we parse this, which means we can't resolve some of the + // string attribute values. + // + // so, in another incredible twist of fate, we actually must do this *twice*. first, + // to find *just the StrOffsetsBase*, and then, to actually fully resolve everything. + // + DW2_Tag *unit_root_tags__pre_str_offsets = 0; + { + if(lane_idx() == 0) + { + unit_root_tags__pre_str_offsets = push_array(scratch.arena, DW2_Tag, unit_count); + } + lane_sync_u64(&unit_root_tags__pre_str_offsets, 0); + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + dw2_read_tag(scratch.arena, &unit_parse_ctxs[unit_idx], raw->sec[DW_Section_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags__pre_str_offsets[unit_idx]); + } + } + lane_sync(); + + //////////////////////////// + //- rjf: look up string offset tables for each unit (.debug_str_offsets); + // equip to per-unit parsing contexts + // + { + Rng1U64Array str_offsets_tables_ranges_array = {str_offsets_tables_ranges, str_offsets_tables_count}; + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + DW2_Tag *unit_root_tag = &unit_root_tags__pre_str_offsets[unit_idx]; + DW2_Attrib *str_offsets_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StrOffsetsBase); + U64 str_offsets_base_off = str_offsets_base_off_attrib->val.u128.u64[0]; + U64 str_offsets_table_num = rng1u64_array_num_from_value__binary_search(&str_offsets_tables_ranges_array, str_offsets_base_off); + if(0 < str_offsets_table_num && str_offsets_table_num <= str_offsets_tables_ranges_array.count) + { + DW2_StrOffsetsTable *table = &str_offsets_tables[str_offsets_table_num-1]; + unit_parse_ctxs[unit_idx].str_offsets_table = table; + } + } + } + lane_sync(); + + //////////////////////////// + //- rjf: do parse of each unit's root tag AFTER finding the right .debug_str_offsets table + // + // (excellent work everyone - thank you for reminding me why RDI is necessary) // DW2_Tag *unit_root_tags = 0; { @@ -888,9 +1000,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 total_tag_count_estimate = 1; { U64 tag_size_estimate = 32; - for EachIndex(unit_idx, unit_info_ranges->count) + for EachIndex(unit_idx, unit_count) { - total_tag_count_estimate += dim_1u64(unit_info_ranges->v[unit_idx]) / tag_size_estimate; + total_tag_count_estimate += dim_1u64(unit_info_tag_ranges[unit_idx]) / tag_size_estimate; } } @@ -921,6 +1033,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) UniqueTypeTagNode **unique_type_tag_slots = 0; U64 unique_type_tag_slots_count = total_tag_count_estimate/8 + 1; UnitTypeMap *unit_type_maps = 0; + ProfScope("gather all unique type tags across all units") { if(lane_idx() == 0) { @@ -935,167 +1048,231 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) for(;;) { //- rjf: take next unit - U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; - if(unit_idx >= unit_count) + U64 origin_unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; + if(origin_unit_idx >= unit_count) { break; } - //- rjf: unpack unit - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - Rng1U64 unit_info_range = unit_info_ranges->v[unit_idx]; + //- rjf: unpack unit info + Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; //- rjf: set up type map for this unit - unit_type_maps[unit_idx].slots_count = dim_1u64(unit_info_range) / 256 + 1; - unit_type_maps[unit_idx].slots = push_array(scratch.arena, UnitTypeNode *, unit_type_maps[unit_idx].slots_count); + unit_type_maps[origin_unit_idx].slots_count = dim_1u64(origin_unit_info_tag_range) / 256 + 1; + unit_type_maps[origin_unit_idx].slots = push_array(scratch.arena, UnitTypeNode *, unit_type_maps[origin_unit_idx].slots_count); - //- rjf: find all type tags in this unit - for(U64 off = unit_info_range.min; off < unit_info_range.max;) + //- rjf: hash all type content from tags in this unit; record if unique + for(U64 off = origin_unit_info_tag_range.min; off < origin_unit_info_tag_range.max;) { Temp scratch2 = scratch_begin(&scratch.arena, 1); U64 start_off = off; - // rjf: read next tag - DW2_Tag tag = {0}; - off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + //- rjf: hash type tags - this requires a hash of not only type tags' + // attributes, but also a walk of all other type tags this tag references, + // and a hash of them too. so we produce a list of tasks for + // parsing/hashing tags, in order to find the full comprehensive hash + // for each type tag. + // + B32 is_type_tag_tree = 0; + U64 hash = 0; + { + typedef struct TypeTagTask TypeTagTask; + struct TypeTagTask + { + TypeTagTask *next; + U64 unit_idx; + U64 off; + }; + TypeTagTask start_task = {0, origin_unit_idx, off}; + TypeTagTask *first_task = &start_task; + TypeTagTask *last_task = first_task; + TypeTagTask *free_task = 0; + for(TypeTagTask *t = first_task; t != 0; t = t->next) + { + U64 t_off = t->off; + + // rjf: unpack unit + Rng1U64 unit_info_range = unit_info_ranges->v[t->unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; + + // rjf: read/hash the full tag tree at `t_off`; kick off additional + // tasks for referenced dependency types + U64 depth = 0; + for(;unit_info_range.min <= t_off && t_off < unit_info_range.max;) + { + U64 t_start_off = t_off; + + // rjf: read tag + DW2_Tag tag = {0}; + t_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, t_off, &tag); + + // rjf: record top-level info about this tag tree + if(t_start_off == t->off && t == &start_task) + { + is_type_tag_tree = (tag.kind == DW_TagKind_ArrayType || tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_EnumerationType || tag.kind == DW_TagKind_PointerType || + tag.kind == DW_TagKind_ReferenceType || tag.kind == DW_TagKind_StringType || + tag.kind == DW_TagKind_StructureType || tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_Typedef || tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_PtrToMemberType || tag.kind == DW_TagKind_SetType || + tag.kind == DW_TagKind_SubrangeType || tag.kind == DW_TagKind_BaseType || + tag.kind == DW_TagKind_ConstType || tag.kind == DW_TagKind_FileType || + tag.kind == DW_TagKind_PackedType || tag.kind == DW_TagKind_VolatileType || + tag.kind == DW_TagKind_RestrictType || tag.kind == DW_TagKind_InterfaceType || + tag.kind == DW_TagKind_UnspecifiedType || tag.kind == DW_TagKind_SharedType || + tag.kind == DW_TagKind_RValueReferenceType || tag.kind == DW_TagKind_CoarrayType || + tag.kind == DW_TagKind_DynamicType || tag.kind == DW_TagKind_AtomicType || + tag.kind == DW_TagKind_ImmutableType); + } + + // rjf: is type -> combine tag's content into hash + if(is_type_tag_tree) + { + // rjf: combine tag's kind + hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); + + // rjf: combine non-reference attributes (references could be different, + // because of deduping, but they could match ultimately). for any + // referenced dependency types, kick them off + for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) + { + if(n->v.val.kind != DW_Form_RefAddr && + n->v.val.kind != DW_Form_Ref1 && + n->v.val.kind != DW_Form_Ref2 && + n->v.val.kind != DW_Form_Ref4 && + n->v.val.kind != DW_Form_Ref8 && + n->v.val.kind != DW_Form_RefUData && + n->v.val.kind != DW_Form_RefSup4 && + n->v.val.kind != DW_Form_RefSig8) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); + hash = u64_hash_from_seed_str8(hash, n->v.val.string); + } + if(n->v.attrib_kind == DW_AttribKind_Type) + { + TypeTagTask *dependency_task = free_task; + if(dependency_task != 0) + { + SLLStackPop(free_task); + } + else + { + dependency_task = push_array(scratch2.arena, TypeTagTask, 1); + } + dependency_task->off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); + dependency_task->unit_idx = t->unit_idx; + if(!contains_1u64(unit_info_range, dependency_task->off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(unit_info_ranges, dependency_task->off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + dependency_task->unit_idx = new_unit_num-1; + } + } + } + } + } + + // rjf: is type tag tree, has children -> descend + if(is_type_tag_tree && tag.has_children) + { + depth += 1; + } + + // rjf: zero tag kind -> ascend + if(is_type_tag_tree && tag.kind == DW_TagKind_Null && depth > 0) + { + depth -= 1; + } + + // rjf: no advancing? -> +1 + if(t_off == t_start_off) + { + t_off += 1; + } + + // rjf: depth == 0? -> done + if(depth == 0) + { + break; + } + } + + // rjf: is this the starter task? -> advance base reading offset + if(t == &start_task) + { + off = t_off; + } + } + } - // rjf: if offset not advanced -> increment + //- rjf: if offset not advanced -> increment if(off == start_off) { off += 1; } - // rjf: if type tag -> read full tree, hash, gather - switch(tag.kind) + //- rjf: atomically gather this hash if not already gathered + if(is_type_tag_tree) { - default:{}break; - case DW_TagKind_ArrayType: - case DW_TagKind_ClassType: - case DW_TagKind_EnumerationType: - case DW_TagKind_PointerType: - case DW_TagKind_ReferenceType: - case DW_TagKind_StringType: - case DW_TagKind_StructureType: - case DW_TagKind_SubroutineType: - case DW_TagKind_Typedef: - case DW_TagKind_UnionType: - case DW_TagKind_PtrToMemberType: - case DW_TagKind_SetType: - case DW_TagKind_SubrangeType: - case DW_TagKind_BaseType: - case DW_TagKind_ConstType: - case DW_TagKind_FileType: - case DW_TagKind_PackedType: - case DW_TagKind_VolatileType: - case DW_TagKind_RestrictType: - case DW_TagKind_InterfaceType: - case DW_TagKind_UnspecifiedType: - case DW_TagKind_SharedType: - case DW_TagKind_RValueReferenceType: - case DW_TagKind_CoarrayType: - case DW_TagKind_DynamicType: - case DW_TagKind_AtomicType: - case DW_TagKind_ImmutableType: + B32 gathered = 0; + U64 slot_idx = hash%unique_type_tag_slots_count; + for(;!gathered;) { - // rjf: form hash from top-level tag - U64 hash = d2r2_hash_from_seed_tag(5381, &tag); + // rjf: read existing slot head pointer *before* we lookup / insert + U64 slot_head_val = ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); - // rjf: if this tag has children -> hash all children, combine into `hash` - if(tag.has_children) + // rjf: determine if this hash has been gathered + for(UniqueTypeTagNode *n = (UniqueTypeTagNode *)slot_head_val; n != 0; n = n->next) { - U64 depth = 1; - for(;off < unit_info_range.max && depth > 0;) + if(n->hash == hash) { - Temp temp = temp_begin(scratch2.arena); - U64 start_off_2 = off; - - // rjf: read descendant tag - DW2_Tag descendant_tag = {0}; - off += dw2_read_tag(temp.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &descendant_tag); - - // rjf: if offset not advanced -> increment - if(off == start_off_2) - { - off += 1; - } - - // rjf: combine hash of descendant tag to main hash - hash = d2r2_hash_from_seed_tag(hash, &descendant_tag); - - // rjf: navigate the tree - if(descendant_tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - else if(descendant_tag.has_children) - { - depth += 1; - } - - temp_end(temp); + gathered = 1; + break; } } - // rjf: atomically gather this hash if not already gathered + // rjf: if this hash has *not* been gathered, try an insert. we: + // + // 1. allocate/fill a node + // 2. set it up to point to the old head + // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above + // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again + // (we may find that another thread has filled this hash, so we'll just be done) + // + if(!gathered) { - B32 gathered = 0; - U64 slot_idx = hash%unique_type_tag_slots_count; - for(;!gathered;) + Temp insert_temp = temp_begin(scratch.arena); + UniqueTypeTagNode *n = push_array(scratch.arena, UniqueTypeTagNode, 1); + n->next = (UniqueTypeTagNode *)slot_head_val; + n->hash = hash; + n->unit_idx = origin_unit_idx; + n->info_off = start_off; + U64 new_head_val = (U64)n; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_type_tag_slots[slot_idx], new_head_val, slot_head_val)) { - // rjf: read existing slot head pointer *before* we lookup / insert - U64 slot_head_val = ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); - - // rjf: determine if this hash has been gathered - for(UniqueTypeTagNode *n = (UniqueTypeTagNode *)slot_head_val; n != 0; n = n->next) - { - if(n->hash == hash) - { - gathered = 1; - break; - } - } - - // rjf: if this hash has *not* been gathered, try an insert. we: - // - // 1. allocate/fill a node - // 2. set it up to point to the old head - // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above - // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again - // (we may find that another thread has filled this hash, so we'll just be done) - // - if(!gathered) - { - Temp insert_temp = temp_begin(scratch.arena); - UniqueTypeTagNode *n = push_array(scratch.arena, UniqueTypeTagNode, 1); - n->next = (UniqueTypeTagNode *)slot_head_val; - n->hash = hash; - n->unit_idx = unit_idx; - n->info_off = start_off; - U64 new_head_val = (U64)n; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_type_tag_slots[slot_idx], slot_head_val, new_head_val)) - { - gathered = 1; - } - else - { - temp_end(insert_temp); - } - } + gathered = 1; + } + else + { + temp_end(insert_temp); } } - - // rjf: record this (info_off -> hash) mapping, so that when we have - // later references to this type, we can redirect to the deduplicated - // type with the right hash later. - { - U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 info_off_slot_idx = info_off_hash%unit_type_maps[unit_idx].slots_count; - UnitTypeNode *n = push_array(scratch.arena, UnitTypeNode, 1); - n->src_info_off = start_off; - n->dst_hash = hash; - SLLStackPush(unit_type_maps[unit_idx].slots[info_off_slot_idx], n); - } - }break; + } + } + + //- rjf: record this (info_off -> hash) mapping, so that when we have + // later references to this type, we can redirect to the deduplicated + // type with the right hash later. + if(is_type_tag_tree) + { + U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 info_off_slot_idx = info_off_hash%unit_type_maps[origin_unit_idx].slots_count; + UnitTypeNode *n = push_array(scratch.arena, UnitTypeNode, 1); + n->src_info_off = start_off; + n->dst_hash = hash; + SLLStackPush(unit_type_maps[origin_unit_idx].slots[info_off_slot_idx], n); } scratch_end(scratch2); @@ -1104,6 +1281,93 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync(); } + //////////////////////////// + //- rjf: produce [0...n) -> unique-tag-node mapping for all types + // + U64 type_count = 0; + UniqueTypeTagNode **type_tag_nodes = 0; + ProfScope("produce [0...n) -> hash mapping for all types") if(lane_idx() == 0) + { + for EachIndex(slot_idx, unique_type_tag_slots_count) + { + for EachNode(n, UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) + { + type_count += 1; + } + } + type_tag_nodes = push_array(scratch.arena, UniqueTypeTagNode *, type_count); + U64 idx = 0; + for EachIndex(slot_idx, unique_type_tag_slots_count) + { + for EachNode(n, UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) + { + type_tag_nodes[idx] = n; + idx += 1; + } + } + } + lane_sync_u64(&type_count, 0); + lane_sync_u64(&type_tag_nodes, 0); + + //////////////////////////// + //- rjf: gather per-type dependency chains + // + typedef struct TypeDepChain TypeDepChain; + struct TypeDepChain + { + TypeDepChain *next; + U64 hash; + }; + TypeDepChain **type_dep_chains = 0; + ProfScope("gather per-type dependency chains") + { + if(lane_idx() == 0) + { + type_dep_chains = push_array(scratch.arena, TypeDepChain *, type_count); + } + lane_sync_u64(&type_dep_chains, 0); + Rng1U64 range = lane_range(type_count); + for EachInRange(type_idx, range) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + // rjf: unpack type's tag node + UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; + U64 info_off = type_tag_node->info_off; + U64 unit_idx = type_tag_node->unit_idx; + + // rjf: unpack unit + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_range = unit_info_ranges->v[unit_idx]; + + // rjf: parse this type's tag + DW2_Tag tag = {0}; + dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + + // rjf: find direct type, if one exists + switch(tag.kind) + { + default:{}break; + case DW_TagKind_PointerType: + case DW_TagKind_ReferenceType: + case DW_TagKind_RValueReferenceType: + case DW_TagKind_RestrictType: + case DW_TagKind_VolatileType: + case DW_TagKind_ConstType: + case DW_TagKind_ArrayType: + case DW_TagKind_SubrangeType: + case DW_TagKind_Typedef: + { + DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); + U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + + }break; + } + + scratch_end(scratch2); + } + } + //////////////////////////// //- rjf: fill result // diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h index 936f0479..91253e18 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -21,11 +21,6 @@ struct D2R2_ConvertParams B32 deterministic; }; -//////////////////////////////// -//~ rjf: Helpers - -internal U64 d2r2_hash_from_seed_tag(U64 seed, DW2_Tag *tag); - //////////////////////////////// //~ rjf: Main Conversion Entry Point (New) From 9768321d08840259014f703603ed2050d6a0e4d3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 24 Apr 2026 20:45:18 -0700 Subject: [PATCH 466/850] fix build --- src/dwarf/dwarf_parse_2.c | 2 +- src/rdi/rdi_local.c | 1 + src/rdi_from_dwarf/rdi_from_dwarf_2.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 3961ccc7..d204e48d 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -329,7 +329,7 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin //- rjf: sleb128 reads case DW_Form_SData: { - off += str8_deserial_read_sleb128(data, off, &val.u128.u64[0]); + off += str8_deserial_read_sleb128(data, off, (S64 *)(&val.u128.u64[0])); }break; //- rjf: fixed-size uint reads / skips diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 948c1c75..7624434f 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -14,6 +14,7 @@ arch_from_rdi_arch(RDI_Arch arch) switch((RDI_ArchEnum)arch) { case RDI_Arch_NULL:{}break; + case RDI_Arch_X86:{result = Arch_x86;}break; case RDI_Arch_X64:{result = Arch_x64;}break; } return result; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 750aa48d..70a38955 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1221,7 +1221,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) for(;!gathered;) { // rjf: read existing slot head pointer *before* we lookup / insert - U64 slot_head_val = ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); + U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); // rjf: determine if this hash has been gathered for(UniqueTypeTagNode *n = (UniqueTypeTagNode *)slot_head_val; n != 0; n = n->next) From be1095eccf233affe7cb6a214a491415d53a9c90 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 25 Apr 2026 09:40:49 -0700 Subject: [PATCH 467/850] d2r2: type dedup content hashing cycle detection / handling; type dependency chain build --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 130 +++++++++++++++++++++----- 1 file changed, 107 insertions(+), 23 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 70a38955..49eaee64 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1073,6 +1073,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // parsing/hashing tags, in order to find the full comprehensive hash // for each type tag. // + // importantly, doing this can cause cycles in principle, so we also + // record which tags we visited, & order them, so we can just hash the + // order index, instead of doing a full recursion. + // B32 is_type_tag_tree = 0; U64 hash = 0; { @@ -1082,23 +1086,33 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) TypeTagTask *next; U64 unit_idx; U64 off; + U64 order_idx; }; TypeTagTask start_task = {0, origin_unit_idx, off}; - TypeTagTask *first_task = &start_task; - TypeTagTask *last_task = first_task; + TypeTagTask *top_task = &start_task; TypeTagTask *free_task = 0; - for(TypeTagTask *t = first_task; t != 0; t = t->next) + U64 seen_task_slots_count = 16; + TypeTagTask **seen_task_slots = push_array(scratch2.arena, TypeTagTask *, seen_task_slots_count); + for(TypeTagTask *t = top_task, *next = 0; t != 0; t = next) { + next = 0; U64 t_off = t->off; + // rjf: record this task in our seen task table + { + U64 hash = u64_hash_from_str8(str8_struct(&t->off)); + U64 slot_idx = hash%seen_task_slots_count; + SLLStackPush(seen_task_slots[slot_idx], t); + } + // rjf: unpack unit - Rng1U64 unit_info_range = unit_info_ranges->v[t->unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; // rjf: read/hash the full tag tree at `t_off`; kick off additional // tasks for referenced dependency types U64 depth = 0; - for(;unit_info_range.min <= t_off && t_off < unit_info_range.max;) + for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max;) { U64 t_start_off = t_off; @@ -1136,6 +1150,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // referenced dependency types, kick them off for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) { + // rjf: non-reference? -> combine attribute value info if(n->v.val.kind != DW_Form_RefAddr && n->v.val.kind != DW_Form_Ref1 && n->v.val.kind != DW_Form_Ref2 && @@ -1149,27 +1164,62 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); hash = u64_hash_from_seed_str8(hash, n->v.val.string); } + + // rjf: type reference? -> if seen, combine the order; if not, recurse if(n->v.attrib_kind == DW_AttribKind_Type) { - TypeTagTask *dependency_task = free_task; - if(dependency_task != 0) + // rjf: unpack reference + U64 ref_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); + + // rjf: determine if we've seen this reference + B32 already_seen = 0; + U64 already_seen_order_idx = 0; { - SLLStackPop(free_task); - } - else - { - dependency_task = push_array(scratch2.arena, TypeTagTask, 1); - } - dependency_task->off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); - dependency_task->unit_idx = t->unit_idx; - if(!contains_1u64(unit_info_range, dependency_task->off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(unit_info_ranges, dependency_task->off); - if(0 < new_unit_num && new_unit_num <= unit_count) + U64 off_hash = u64_hash_from_str8(str8_struct(&ref_info_off)); + U64 off_slot_idx = off_hash%seen_task_slots_count; + for(TypeTagTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) { - dependency_task->unit_idx = new_unit_num-1; + if(t->off == ref_info_off) + { + already_seen = 1; + already_seen_order_idx = t->order_idx; + break; + } } } + + // rjf: if we've seen -> hash the order + if(already_seen) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&already_seen_order_idx)); + } + + // rjf: if we've not seen -> descend + if(!already_seen) + { + TypeTagTask *dependency_task = free_task; + if(dependency_task != 0) + { + SLLStackPop(free_task); + } + else + { + dependency_task = push_array(scratch2.arena, TypeTagTask, 1); + } + next = dependency_task; + dependency_task->off = ref_info_off; + dependency_task->unit_idx = t->unit_idx; + if(!contains_1u64(unit_info_tag_range, dependency_task->off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + dependency_task->unit_idx = new_unit_num-1; + } + } + dependency_task->order_idx = t->order_idx+1; + } } } } @@ -1338,13 +1388,15 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: unpack unit DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - Rng1U64 unit_info_range = unit_info_ranges->v[unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; // rjf: parse this type's tag DW2_Tag tag = {0}; dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); // rjf: find direct type, if one exists + U64 direct_type_info_off = 0; + U64 direct_type_unit_idx = 0; switch(tag.kind) { default:{}break; @@ -1359,11 +1411,43 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) case DW_TagKind_Typedef: { DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); - U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - + direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + direct_type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + direct_type_unit_idx = new_unit_num-1; + } + } }break; } + // rjf: look up hash for direct type + U64 direct_type_hash = 0; + { + U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); + U64 off_slot_idx = off_hash%unit_type_maps[direct_type_unit_idx].slots_count; + for(UnitTypeNode *n = unit_type_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == direct_type_info_off) + { + direct_type_hash = n->dst_hash; + break; + } + } + } + + // rjf: if we got a hash -> record as dependency + if(direct_type_hash != 0) + { + TypeDepChain *chain = push_array(scratch.arena, TypeDepChain, 1); + chain->hash = direct_type_hash; + SLLStackPush(type_dep_chains[type_idx], chain); + } + scratch_end(scratch2); } } From ffa41c0a9832f0020c53c4478752d7fae4d5cb02 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 27 Apr 2026 12:02:27 -0700 Subject: [PATCH 468/850] d2r2: adjustments to type deduper; sketch out topologically-sorted type building path --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 254 +++++++++++++++++++------- 1 file changed, 193 insertions(+), 61 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 49eaee64..aec52606 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1016,6 +1016,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 hash; U64 unit_idx; U64 info_off; + U64 order_idx; }; typedef struct UnitTypeNode UnitTypeNode; struct UnitTypeNode @@ -1332,7 +1333,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //////////////////////////// - //- rjf: produce [0...n) -> unique-tag-node mapping for all types + //- rjf: produce [0...n) <-> unique-tag-node mapping for all types // U64 type_count = 0; UniqueTypeTagNode **type_tag_nodes = 0; @@ -1352,6 +1353,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) for EachNode(n, UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) { type_tag_nodes[idx] = n; + n->order_idx = idx; idx += 1; } } @@ -1366,87 +1368,217 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) struct TypeDepChain { TypeDepChain *next; - U64 hash; + U64 type_idx; }; TypeDepChain **type_dep_chains = 0; + U64 *type_dep_chains_counts = 0; ProfScope("gather per-type dependency chains") { if(lane_idx() == 0) { type_dep_chains = push_array(scratch.arena, TypeDepChain *, type_count); + type_dep_chains_counts = push_array(scratch.arena, U64, type_count); } lane_sync_u64(&type_dep_chains, 0); + lane_sync_u64(&type_dep_chains_counts, 0); Rng1U64 range = lane_range(type_count); - for EachInRange(type_idx, range) + for EachInRange(root_type_idx, range) + { + for(U64 hash = type_tag_nodes[root_type_idx]->hash, next_hash = 0; + hash != 0; + hash = next_hash) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + // rjf: hash -> unique type tag node + UniqueTypeTagNode *type_tag_node = 0; + { + U64 slot_idx = hash%unique_type_tag_slots_count; + for(UniqueTypeTagNode *n = unique_type_tag_slots[slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + type_tag_node = n; + break; + } + } + } + + // rjf: unpack type tag node + U64 info_off = 0; + U64 unit_idx = 0; + if(type_tag_node != 0) + { + info_off = type_tag_node->info_off; + unit_idx = type_tag_node->unit_idx; + } + + // rjf: record this type in the dependency chain + if(type_tag_node != 0) + { + TypeDepChain *c = push_array(scratch.arena, TypeDepChain, 1); + c->type_idx = type_tag_node->order_idx; + SLLStackPush(type_dep_chains[type_tag_node->order_idx], c); + type_dep_chains_counts[type_tag_node->order_idx] += 1; + } + + // rjf: unpack unit + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + + // rjf: parse this type's tag + DW2_Tag tag = {0}; + dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + + // rjf: find direct type, if one exists + U64 direct_type_info_off = 0; + U64 direct_type_unit_idx = 0; + switch(tag.kind) + { + default:{}break; + case DW_TagKind_PointerType: + case DW_TagKind_ReferenceType: + case DW_TagKind_RValueReferenceType: + case DW_TagKind_RestrictType: + case DW_TagKind_VolatileType: + case DW_TagKind_ConstType: + case DW_TagKind_ArrayType: + case DW_TagKind_SubrangeType: + case DW_TagKind_Typedef: + { + DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); + direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + direct_type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + direct_type_unit_idx = new_unit_num-1; + } + } + }break; + } + + // rjf: look up hash for direct type + U64 direct_type_hash = 0; + { + U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); + U64 off_slot_idx = off_hash%unit_type_maps[direct_type_unit_idx].slots_count; + for(UnitTypeNode *n = unit_type_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == direct_type_info_off) + { + direct_type_hash = n->dst_hash; + break; + } + } + } + + // rjf: iterate to direct type's hash + next_hash = direct_type_hash; + + scratch_end(scratch2); + } + } + lane_sync(); + } + + //////////////////////////// + //- rjf: build all types - build types w/ 1 dependency (leaves) first, then 2, 3, etc., + // to ensure dependencies always travel backwards + // + RDIM_TypeChunkList *all_types = 0; + RDIM_Type **type_from_idx_map = 0; + { + if(lane_idx() == 0) + { + all_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); + type_from_idx_map = push_array(scratch.arena, RDIM_Type *, type_count); + } + lane_sync_u64(&all_types, 0); + lane_sync_u64(&type_from_idx_map, 0); + Rng1U64 range = lane_range(type_count); + U64 max_chain_count = 1; + for(;max_chain_count < max_U64;) { Temp scratch2 = scratch_begin(&scratch.arena, 1); - // rjf: unpack type's tag node - UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; - U64 info_off = type_tag_node->info_off; - U64 unit_idx = type_tag_node->unit_idx; - - // rjf: unpack unit - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - - // rjf: parse this type's tag - DW2_Tag tag = {0}; - dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); - - // rjf: find direct type, if one exists - U64 direct_type_info_off = 0; - U64 direct_type_unit_idx = 0; - switch(tag.kind) + //- rjf: gather all types in this lane that fit the dependency restriction; + // find this lane's next dependency restriction + U64 next_max_chain_count = max_U64; + RDIM_TypeChunkList lane_types = {0}; + for EachInRange(type_idx, range) { - default:{}break; - case DW_TagKind_PointerType: - case DW_TagKind_ReferenceType: - case DW_TagKind_RValueReferenceType: - case DW_TagKind_RestrictType: - case DW_TagKind_VolatileType: - case DW_TagKind_ConstType: - case DW_TagKind_ArrayType: - case DW_TagKind_SubrangeType: - case DW_TagKind_Typedef: + // rjf: if this type has a higher chain count than the current, + // but it is lower than our next maximum chain count, collect it, + // so we will hit + if(type_dep_chains_counts[type_idx] > max_chain_count) { - DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); - direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - direct_type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) - { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - direct_type_unit_idx = new_unit_num-1; - } - } - }break; + next_max_chain_count = Min(type_dep_chains_counts[type_idx], next_max_chain_count); + continue; + } + Temp temp = temp_begin(scratch2.arena); + + // rjf: idx -> type tag node + UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; + U64 unit_idx = type_tag_node->unit_idx; + U64 info_off = type_tag_node->info_off; + + // rjf: unpack unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + + // rjf: parse root-level tag + DW2_Tag tag = {0}; + dw2_read_tag(temp.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + + // rjf: convert type + { + // TODO(rjf) + } + + temp_end(temp); } - // rjf: look up hash for direct type - U64 direct_type_hash = 0; + //- rjf: combine all types from all lanes + RDIM_TypeChunkList *lanes_types = 0; + if(lane_idx() == 0) { - U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); - U64 off_slot_idx = off_hash%unit_type_maps[direct_type_unit_idx].slots_count; - for(UnitTypeNode *n = unit_type_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) + lanes_types = push_array(scratch2.arena, RDIM_TypeChunkList, lane_count()); + } + lane_sync_u64(&lanes_types, 0); + lanes_types[lane_idx()] = lane_types; + lane_sync(); + if(lane_idx() == 0) + { + RDIM_TypeChunkList pass_lane_combined_types = {0}; + for EachIndex(l_idx, lane_count()) { - if(n->src_info_off == direct_type_info_off) - { - direct_type_hash = n->dst_hash; - break; - } + rdim_type_chunk_list_concat_in_place(&pass_lane_combined_types, &lanes_types[l_idx]); + } + rdim_type_chunk_list_concat_in_place(all_types, &pass_lane_combined_types); + } + lane_sync(); + + //- rjf: find minimum next max chain count across all lanes, for next iteration + U64 *lane_next_max_chain_counts = 0; + if(lane_idx() == 0) + { + lane_next_max_chain_counts = push_array(scratch2.arena, U64, lane_count()); + } + lane_sync_u64(&lane_next_max_chain_counts, 0); + lane_next_max_chain_counts[lane_idx()] = next_max_chain_count; + lane_sync(); + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + next_max_chain_count = Min(next_max_chain_count, lane_next_max_chain_counts[l_idx]); } } - - // rjf: if we got a hash -> record as dependency - if(direct_type_hash != 0) - { - TypeDepChain *chain = push_array(scratch.arena, TypeDepChain, 1); - chain->hash = direct_type_hash; - SLLStackPush(type_dep_chains[type_idx], chain); - } + lane_sync_u64(&next_max_chain_count, 0); scratch_end(scratch2); } From c6b733de2050a2c8bf811fd076abcb0e98de3f02 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 27 Apr 2026 16:07:07 -0700 Subject: [PATCH 469/850] d2r2: finished first pass of type conversion; sketched out structure for symbol/unit conversion; plugged everything in --- src/dwarf/dwarf_parse_2.c | 2 +- src/dwarf/dwarf_parse_2.h | 1 + src/radbin/radbin.c | 3 + src/rdi_from_dwarf/rdi_from_dwarf_2.c | 573 +++++++++++++++++++++++++- 4 files changed, 559 insertions(+), 20 deletions(-) diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index d204e48d..7b406587 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -379,7 +379,7 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin U64 bytes_read = str8_deserial_read_uleb128(data, off, &size); val.u128.u64[0] = og_read_off + bytes_read; val.u128.u64[1] = size; - off += bytes_read; + off += size + bytes_read; }break; //- rjf: flag present diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index cd036c37..e298101d 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -60,6 +60,7 @@ struct DW2_ParseCtx // it can from context. DW_Version version; DW_Format format; + DW_Ext ext; U64 addr_size; DW2_AbbrevMap *abbrev_map; DW2_StrOffsetsTable *str_offsets_table; diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 53e8ec44..3c51a4c5 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -956,7 +956,10 @@ rb_thread_entry_point(void *p) { bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); +#if 0 rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); +#endif + rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) { rdim_bake_params_concat_in_place(bake_params, &n->v); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index aec52606..153dddcf 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -12,6 +12,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_BinarySectionList binary_sections = params->binary_sections; Arch arch = params->arch; U64 base_vaddr = params->base_vaddr; + U64 arch_addr_size = byte_size_from_arch(arch); //////////////////////////// //- rjf: determine acceptable address range @@ -992,7 +993,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync_u64(&builtin_types, 0); lane_sync_u64(&builtin_type_from_kind_map, 0); -#define d2r2_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_types[k - RDI_TypeKind_FirstBuiltIn] : 0) +#define d2r2_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] : builtin_type_from_kind_map[RDI_TypeKind_Void]) //////////////////////////// //- rjf: predict the total number of tags in all units @@ -1124,19 +1125,31 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: record top-level info about this tag tree if(t_start_off == t->off && t == &start_task) { - is_type_tag_tree = (tag.kind == DW_TagKind_ArrayType || tag.kind == DW_TagKind_ClassType || - tag.kind == DW_TagKind_EnumerationType || tag.kind == DW_TagKind_PointerType || - tag.kind == DW_TagKind_ReferenceType || tag.kind == DW_TagKind_StringType || - tag.kind == DW_TagKind_StructureType || tag.kind == DW_TagKind_SubroutineType || - tag.kind == DW_TagKind_Typedef || tag.kind == DW_TagKind_UnionType || - tag.kind == DW_TagKind_PtrToMemberType || tag.kind == DW_TagKind_SetType || - tag.kind == DW_TagKind_SubrangeType || tag.kind == DW_TagKind_BaseType || - tag.kind == DW_TagKind_ConstType || tag.kind == DW_TagKind_FileType || - tag.kind == DW_TagKind_PackedType || tag.kind == DW_TagKind_VolatileType || - tag.kind == DW_TagKind_RestrictType || tag.kind == DW_TagKind_InterfaceType || - tag.kind == DW_TagKind_UnspecifiedType || tag.kind == DW_TagKind_SharedType || - tag.kind == DW_TagKind_RValueReferenceType || tag.kind == DW_TagKind_CoarrayType || - tag.kind == DW_TagKind_DynamicType || tag.kind == DW_TagKind_AtomicType || + is_type_tag_tree = (tag.kind == DW_TagKind_ArrayType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_EnumerationType || + tag.kind == DW_TagKind_PointerType || + tag.kind == DW_TagKind_ReferenceType || + tag.kind == DW_TagKind_StringType || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_Typedef || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_PtrToMemberType || + tag.kind == DW_TagKind_SetType || + tag.kind == DW_TagKind_BaseType || + tag.kind == DW_TagKind_ConstType || + tag.kind == DW_TagKind_FileType || + tag.kind == DW_TagKind_PackedType || + tag.kind == DW_TagKind_VolatileType || + tag.kind == DW_TagKind_RestrictType || + tag.kind == DW_TagKind_InterfaceType || + tag.kind == DW_TagKind_UnspecifiedType || + tag.kind == DW_TagKind_SharedType || + tag.kind == DW_TagKind_RValueReferenceType || + tag.kind == DW_TagKind_CoarrayType || + tag.kind == DW_TagKind_DynamicType || + tag.kind == DW_TagKind_AtomicType || tag.kind == DW_TagKind_ImmutableType); } @@ -1418,8 +1431,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { TypeDepChain *c = push_array(scratch.arena, TypeDepChain, 1); c->type_idx = type_tag_node->order_idx; - SLLStackPush(type_dep_chains[type_tag_node->order_idx], c); - type_dep_chains_counts[type_tag_node->order_idx] += 1; + SLLStackPush(type_dep_chains[root_type_idx], c); + type_dep_chains_counts[root_type_idx] += 1; } // rjf: unpack unit @@ -1489,6 +1502,29 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: build all types - build types w/ 1 dependency (leaves) first, then 2, 3, etc., // to ensure dependencies always travel backwards // + // NOTE: * DWARF vs RDI Array Type Graph * + // + // For example lets take following decl: + // + // int (*foo[2])[3]; + // + // This compiles to in DWARF: + // + // foo -> DW_TAG_ArrayType -> (A0) DW_TAG_Subrange [2] + // \ + // -> (B0) DW_TAG_PointerType -> (A1) DW_TAG_ArrayType -> DW_TAG_Subrange [3] + // \ + // -> (B1) DW_TAG_BaseType (int) + // + // RDI expects: + // + // foo -> Array[2] -> Pointer -> Array[3] -> int + // + // Note that DWARF forks the graph on DW_TAG_ArrayType to describe array ranges in branch A and + // in branch B describes array type which might be a struct, pointer, base type, or any other type tag. + // However, in RDI we have a simple list of type nodes and to convert we need to append type nodes from + // B to A. + // RDIM_TypeChunkList *all_types = 0; RDIM_Type **type_from_idx_map = 0; { @@ -1496,6 +1532,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { all_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); type_from_idx_map = push_array(scratch.arena, RDIM_Type *, type_count); + rdim_type_chunk_list_concat_in_place(all_types, builtin_types); } lane_sync_u64(&all_types, 0); lane_sync_u64(&type_from_idx_map, 0); @@ -1509,16 +1546,25 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // find this lane's next dependency restriction U64 next_max_chain_count = max_U64; RDIM_TypeChunkList lane_types = {0}; + U64 lane_types_chunk_count = 256; for EachInRange(type_idx, range) { // rjf: if this type has a higher chain count than the current, // but it is lower than our next maximum chain count, collect it, // so we will hit + // + // if this type has a lower chain count than the current, + // we should've already built it from a previous pass. + // if(type_dep_chains_counts[type_idx] > max_chain_count) { next_max_chain_count = Min(type_dep_chains_counts[type_idx], next_max_chain_count); continue; } + else if(type_dep_chains_counts[type_idx] < max_chain_count) + { + continue; + } Temp temp = temp_begin(scratch2.arena); // rjf: idx -> type tag node @@ -1532,13 +1578,332 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: parse root-level tag DW2_Tag tag = {0}; - dw2_read_tag(temp.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + U64 tag_info_size = dw2_read_tag(temp.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + + // rjf: extract common attributes + DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *direct_type_attrib = &dw2_attrib_nil; + DW2_Attrib *bitsize_attrib = &dw2_attrib_nil; + DW2_Attrib *bytesize_attrib = &dw2_attrib_nil; + DW2_Attrib *encoding_attrib = &dw2_attrib_nil; + DW2_Attrib *decl_attrib = &dw2_attrib_nil; + // + // TODO(rjf): if a DW_AttribKing_GNU_Vector is found on an DW_TagKind_ArrayType, + // then: @native_vector_support extract byte size from the base type tag + // and convert to U256, U512, S256 and S512 + // + for EachNode(n, DW2_AttribNode, tag.attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(dst_name, src_name) case DW_AttribKind_##src_name:{dst_name##_attrib = &n->v;}break + Case(name, Name); + Case(direct_type, Type); + Case(bitsize, BitSize); + Case(bytesize, ByteSize); + Case(encoding, Encoding); + Case(decl, Declaration); +#undef Case + } + } + + // rjf: unpack common attributes + String8 name = name_attrib->val.string; + DW_ATE encoding = encoding_attrib->val.u128.u64[0]; + RDIM_Type *direct_type = d2r2_type_from_builtin_kind(RDI_TypeKind_Void); + U64 bitsize = 0; + B32 is_decl = (decl_attrib != &dw2_attrib_nil); + { + // rjf: unpack direct type + if(direct_type_attrib != &dw2_attrib_nil) + { + U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + U64 direct_type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); + direct_type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } + UnitTypeMap *direct_type_unit_type_map = &unit_type_maps[direct_type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); + U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; + U64 direct_type_hash = 0; + for(UnitTypeNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == direct_type_info_off) + { + direct_type_hash = n->dst_hash; + break; + } + } + U64 unique_type_tag_slot_idx = direct_type_hash%unique_type_tag_slots_count; + for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == direct_type_hash) + { + direct_type = type_from_idx_map[n->order_idx]; + break; + } + } + } + + // rjf: unpack bit/byte sizes + if(bitsize_attrib != &dw2_attrib_nil) + { + bitsize = bitsize_attrib->val.u128.u64[0]; + } + else if(bytesize_attrib != &dw2_attrib_nil) + { + bitsize = bytesize_attrib->val.u128.u64[0]*8; + } + } // rjf: convert type + RDIM_Type *dst_type = 0; + RDI_TypeKind rdi_type_kind = RDI_TypeKind_NULL; + RDI_TypeModifierFlags rdi_type_modifier_flags = 0; + switch(tag.kind) { - // TODO(rjf) + default:{}break; + case DW_TagKind_ClassType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_Class; goto struct_type; + case DW_TagKind_StructureType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteStruct : RDI_TypeKind_Struct; goto struct_type; + case DW_TagKind_UnionType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteUnion : RDI_TypeKind_Union; goto struct_type; + struct_type:; + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = rdi_type_kind; + dst_type->name = name; + dst_type->byte_size = bitsize/8; + }break; + case DW_TagKind_EnumerationType: + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = is_decl ? RDI_TypeKind_IncompleteEnum : RDI_TypeKind_Enum; + dst_type->name = name; + dst_type->direct_type = direct_type; + dst_type->byte_size = (direct_type != 0 ? direct_type->byte_size : bitsize/8); + }break; + case DW_TagKind_SubroutineType: + { + + }break; + case DW_TagKind_Typedef: + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = RDI_TypeKind_Alias; + dst_type->name = name; + dst_type->direct_type = direct_type; + dst_type->byte_size = (direct_type ? direct_type->byte_size : 0); + }break; + case DW_TagKind_BaseType: + { + if(0){} +#define CaseA(rdi_type_kind_, encoding_) else if(encoding == (encoding_)) { rdi_type_kind = (rdi_type_kind_); } +#define CaseB(rdi_type_kind_, encoding_, bit_size_) else if(encoding == (encoding_) && bitsize == (bit_size_)) { rdi_type_kind = (rdi_type_kind_); } +#define CaseC(rdi_type_kind_, encoding_, name_) /* assumes x64/arm64 */ else if(encoding == (encoding_) && str8_match(name, str8_lit(name_), 0)) { rdi_type_kind = (rdi_type_kind_); } +#define CaseD(rdi_type_kind_, encoding_, name_, bit_size_) else if(encoding == (encoding_) && bitsize == (bit_size_) && str8_match(name, str8_lit(name_), 0)) { rdi_type_kind = (rdi_type_kind_); } + CaseA(RDI_TypeKind_NULL, DW_ATE_Null) + CaseA(RDI_TypeKind_Void, DW_ATE_Address) + CaseA(RDI_TypeKind_Bool, DW_ATE_Boolean) + CaseB(RDI_TypeKind_ComplexF32, DW_ATE_ComplexFloat, 32) + CaseB(RDI_TypeKind_ComplexF64, DW_ATE_ComplexFloat, 64) + CaseB(RDI_TypeKind_ComplexF80, DW_ATE_ComplexFloat, 80) + CaseB(RDI_TypeKind_ComplexF128, DW_ATE_ComplexFloat, 128) + CaseC(RDI_TypeKind_F80, DW_ATE_Float, "__float80") + CaseC(RDI_TypeKind_F128, DW_ATE_Float, "__float128") + CaseC(RDI_TypeKind_F16, DW_ATE_Float, "_Float16") + CaseC(RDI_TypeKind_BF16, DW_ATE_Float, "__bf16") + CaseB(RDI_TypeKind_F16, DW_ATE_Float, 16) + CaseB(RDI_TypeKind_F32, DW_ATE_Float, 32) + CaseB(RDI_TypeKind_F48, DW_ATE_Float, 48) + CaseB(RDI_TypeKind_F64, DW_ATE_Float, 64) + CaseB(RDI_TypeKind_F80, DW_ATE_Float, 80) + CaseB(RDI_TypeKind_F96, DW_ATE_Float, 96) + CaseB(RDI_TypeKind_F128, DW_ATE_Float, 128) + CaseD(RDI_TypeKind_Char8, DW_ATE_Signed, "wchar_t", 8) + CaseD(RDI_TypeKind_Char16, DW_ATE_Signed, "wchar_t", 16) + CaseD(RDI_TypeKind_Char32, DW_ATE_Signed, "wchar_t", 32) + CaseB(RDI_TypeKind_S8, DW_ATE_Signed, 8) + CaseB(RDI_TypeKind_S16, DW_ATE_Signed, 16) + CaseB(RDI_TypeKind_S32, DW_ATE_Signed, 32) + CaseB(RDI_TypeKind_S64, DW_ATE_Signed, 64) + CaseB(RDI_TypeKind_S128, DW_ATE_Signed, 128) + CaseB(RDI_TypeKind_S256, DW_ATE_Signed, 256) + CaseB(RDI_TypeKind_S512, DW_ATE_Signed, 512) + CaseB(RDI_TypeKind_U8, DW_ATE_Unsigned, 8) + CaseB(RDI_TypeKind_U16, DW_ATE_Unsigned, 16) + CaseB(RDI_TypeKind_U32, DW_ATE_Unsigned, 32) + CaseB(RDI_TypeKind_U64, DW_ATE_Unsigned, 64) + CaseB(RDI_TypeKind_U128, DW_ATE_Unsigned, 128) + CaseB(RDI_TypeKind_U256, DW_ATE_Unsigned, 256) + CaseB(RDI_TypeKind_U512, DW_ATE_Unsigned, 512) + CaseB(RDI_TypeKind_UChar8, DW_ATE_UnsignedChar, 8) + CaseB(RDI_TypeKind_UChar8, DW_ATE_Utf, 8) + CaseB(RDI_TypeKind_UChar16, DW_ATE_UnsignedChar, 16) + CaseB(RDI_TypeKind_UChar16, DW_ATE_Utf, 16) + CaseB(RDI_TypeKind_UChar32, DW_ATE_UnsignedChar, 32) + CaseB(RDI_TypeKind_UChar32, DW_ATE_Utf, 32) + CaseB(RDI_TypeKind_Decimal32, DW_ATE_DecimalFloat, 32) + CaseB(RDI_TypeKind_Decimal64, DW_ATE_DecimalFloat, 64) + CaseB(RDI_TypeKind_Decimal128, DW_ATE_DecimalFloat, 128) +#undef CaseA +#undef CaseB +#undef CaseC +#undef CaseD + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = RDI_TypeKind_Alias; + dst_type->name = name; + dst_type->direct_type = d2r2_type_from_builtin_kind(rdi_type_kind); + dst_type->byte_size = bitsize/8; + }break; + case DW_TagKind_PointerType: rdi_type_kind = RDI_TypeKind_Ptr; goto ptr_or_ref_type; + case DW_TagKind_ReferenceType: rdi_type_kind = RDI_TypeKind_LRef; goto ptr_or_ref_type; + case DW_TagKind_RValueReferenceType: rdi_type_kind = RDI_TypeKind_RRef; goto ptr_or_ref_type; + ptr_or_ref_type:; + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = rdi_type_kind; + dst_type->direct_type = direct_type; + dst_type->byte_size = arch_addr_size; + }break; + case DW_TagKind_RestrictType: + { + rdi_type_modifier_flags = RDI_TypeModifierFlag_Restrict; + }goto basic_type_operators; + case DW_TagKind_VolatileType: + { + rdi_type_modifier_flags = RDI_TypeModifierFlag_Volatile; + }goto basic_type_operators; + case DW_TagKind_ConstType: + { + rdi_type_modifier_flags = RDI_TypeModifierFlag_Const; + }goto basic_type_operators; + basic_type_operators:; + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = rdi_type_modifier_flags; + dst_type->direct_type = direct_type; + dst_type->byte_size = (direct_type ? direct_type->byte_size : 0); + }break; + case DW_TagKind_ArrayType: + if(tag.has_children) + { + // rjf: parse array type children; extract dimensions (each one gets a SubrangeType) + typedef struct ArrayDimensionNode ArrayDimensionNode; + struct ArrayDimensionNode + { + ArrayDimensionNode *next; + U64 count; + }; + ArrayDimensionNode *top_dimension = 0; + { + U64 tag_children_off = info_off + tag_info_size; + S64 depth = 1; + for(U64 off = tag_children_off; contains_1u64(unit_info_tag_range, off) && depth > 0;) + { + U64 start_off = off; + DW2_Tag child_tag = {0}; + off += dw2_read_tag(temp.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &child_tag); + if(child_tag.kind == DW_TagKind_SubrangeType) + { + // rjf: extract bounds attribs + DW2_Attrib *lower_bound_attrib = &dw2_attrib_nil; + DW2_Attrib *upper_bound_attrib = &dw2_attrib_nil; + DW2_Attrib *count_attrib = &dw2_attrib_nil; + for(DW2_AttribNode *n = child_tag.attribs.first; + n != 0 && (lower_bound_attrib == &dw2_attrib_nil || (upper_bound_attrib == &dw2_attrib_nil && count_attrib == &dw2_attrib_nil)); + n = n->next) + { + if(n->v.attrib_kind == DW_AttribKind_LowerBound) + { + lower_bound_attrib = &n->v; + } + else if(n->v.attrib_kind == DW_AttribKind_UpperBound) + { + upper_bound_attrib = &n->v; + } + else if(n->v.attrib_kind == DW_AttribKind_Count) + { + count_attrib = &n->v; + } + } + + // rjf: resolve lower bound + U64 lower_bound = 0; + { + if(dw_is_form_kind_ref(unit_parse_ctx->version, unit_parse_ctx->ext, lower_bound_attrib->val.kind)) + { + log_infof("[.debug_info@%I64x] Array type lower bound is a variable; this is not currently supported.\n", start_off); + } + else + { + lower_bound = lower_bound_attrib->val.u128.u64[0]; + } + } + + // rjf: resolve upper bound + U64 upper_bound = 0; + { + if(count_attrib != &dw2_attrib_nil) + { + upper_bound = lower_bound + count_attrib->val.u128.u64[0]; + } + else if(upper_bound_attrib != &dw2_attrib_nil) + { + if(dw_is_form_kind_ref(unit_parse_ctx->version, unit_parse_ctx->ext, upper_bound_attrib->val.kind)) + { + log_infof("[.debug_info@%I64x] Array type upper bound is a variable; this is not currently supported.\n", start_off); + } + else + { + upper_bound = upper_bound_attrib->val.u128.u64[0]; + upper_bound += 1; // NOTE(rjf): turn to exclusive range + } + } + } + + // rjf: push node + ArrayDimensionNode *dim_n = push_array(temp.arena, ArrayDimensionNode, 1); + SLLStackPush(top_dimension, dim_n); + dim_n->count = (upper_bound - lower_bound); + } + if(child_tag.has_children) + { + depth += 1; + } + else if(child_tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + if(off == start_off) + { + break; + } + } + } + + // rjf: create array type operators for each dimension + RDIM_Type *array_direct_type = direct_type; + for EachNode(dim_n, ArrayDimensionNode, top_dimension) + { + RDIM_Type *array_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + array_type->kind = RDI_TypeKind_Array; + array_type->byte_size = array_direct_type ? array_direct_type->byte_size*dim_n->count : 0; + array_type->direct_type = array_direct_type; + array_direct_type = array_type; + } + + // rjf: final destination type -> the final array dimension type + dst_type = array_direct_type; + }break; } + // rjf: store type in type-from-idx table + type_from_idx_map[type_idx] = dst_type; + temp_end(temp); } @@ -1580,16 +1945,186 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync_u64(&next_max_chain_count, 0); + //- rjf: update max chain count + max_chain_count = next_max_chain_count; + scratch_end(scratch2); } } + lane_sync(); + + //////////////////////////// + //- rjf: convert all units / symbols + // + RDIM_UnitChunkList *all_units = 0; + RDIM_Unit **unit_from_idx_map = 0; + ProfScope("convert all units / symbols") + { + if(lane_idx() == 0) + { + all_units = push_array(scratch.arena, RDIM_UnitChunkList, 1); + unit_from_idx_map = push_array(scratch.arena, RDIM_Unit *, unit_count); + for EachIndex(unit_idx, unit_count) + { + unit_from_idx_map[unit_idx] = rdim_unit_chunk_list_push(arena, all_units, unit_count); + } + } + lane_sync_u64(&all_units, 0); + lane_sync_u64(&unit_from_idx_map, 0); + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; + if(unit_idx >= unit_count) + { + break; + } + + //- rjf: unpack unit info + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + RDIM_Unit *dst_unit = unit_from_idx_map[unit_idx]; + + //- rjf: unpack unit's root tag + DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; + DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *comp_dir_attrib = &dw2_attrib_nil; + DW2_Attrib *producer_attrib = &dw2_attrib_nil; + DW2_Attrib *lang_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, unit_root_tag->attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break + Case(name, Name); + Case(comp_dir, CompDir); + Case(producer, Producer); + Case(lang, Language); +#undef Case + } + } + + //- rjf: unpack attributes + String8 unit_name = name_attrib->val.string; + String8 unit_comp_dir = comp_dir_attrib->val.string; + String8 unit_producer = producer_attrib->val.string; + RDI_Language unit_lang = RDI_Language_NULL; + { + DW_Language dw_lang = lang_attrib->val.u128.u64[0]; + switch(dw_lang) + { + default:{}break; + case DW_Language_C89: + case DW_Language_C99: + case DW_Language_C11: + case DW_Language_C: + { + unit_lang = RDI_Language_C; + }break; + case DW_Language_CPlusPlus03: + case DW_Language_CPlusPlus11: + case DW_Language_CPlusPlus14: + case DW_Language_CPlusPlus: + { + unit_lang = RDI_Language_CPlusPlus; + }break; + } + } + + //- rjf: fill top-level unit info + { + dst_unit->unit_name = unit_name; + dst_unit->compiler_name = unit_producer; + // TODO(rjf): dst_unit->source_file = ???; + // TODO(rjf): dst_unit->object_file = ???; + // TODO(rjf): dst_unit->archive_file = ???; + dst_unit->build_path = unit_comp_dir; + dst_unit->language = unit_lang; + dst_unit->line_table = unit_line_tables[unit_idx]; + } + + //- rjf: produce all unit symbols + for(U64 off = unit_info_tag_range.min; off < unit_info_tag_range.max;) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; + + //- rjf: parse tag + DW2_Tag tag = {0}; + off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + + //- rjf: gather attributes from tag + DW2_Attrib *name_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag.attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break + Case(name, Name); +#undef Case + } + } + + //- rjf: unpack attributes + String8 name = name_attrib->val.string; + + //- rjf: produce symbols from tag + switch(tag.kind) + { + default:{}break; + + //- rjf: subprograms (procedures) + case DW_TagKind_SubProgram: + { + RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_unit->procedures, 512); + procedure->name = name; + }break; + + //- rjf: inline site + case DW_TagKind_InlinedSubroutine: + { + + }break; + + //- rjf: variables + case DW_TagKind_Variable: + case DW_TagKind_FormalParameter: + { + + }break; + + //- rjf: lexical blocks (scopes) + case DW_TagKind_LexicalBlock: + { + + }break; + } + + scratch_end(scratch2); + if(off == start_off) + { + break; + } + } + } + } //////////////////////////// //- rjf: fill result // RDIM_BakeParams result = {0}; { - // TODO(rjf) + result.subset_flags = params->subset_flags; + // TODO(rjf): result.top_level_info = *top_level_info; + // TODO(rjf): result.binary_sections = *binary_sections; + result.units = *all_units; + result.types = *all_types; + result.src_files = *all_src_files; + result.line_tables = *all_line_tables; } #undef d2r2_type_from_builtin_kind From f1a9fc5e3a54dc94d3c958335a2624909fbcb764 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 27 Apr 2026 18:14:29 -0700 Subject: [PATCH 470/850] turn off new dwarf converter outputs temporarily --- src/radbin/radbin.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 3c51a4c5..3c8ba34d 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -956,10 +956,8 @@ rb_thread_entry_point(void *p) { bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); -#if 0 rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); -#endif - rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); + // rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) { rdim_bake_params_concat_in_place(bake_params, &n->v); From f5ec462438196681bb0b37c8afa2d36c6df4eecf Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 28 Apr 2026 08:57:59 -0700 Subject: [PATCH 471/850] d2r2: .debug_aranges parsing / unit conversion; .debug_ranges parsing --- src/base/base_math.h | 2 +- src/dwarf/dwarf_parse.h | 2 +- src/dwarf/dwarf_parse_2.c | 62 ++++++ src/dwarf/dwarf_parse_2.h | 6 + src/elf/elf_parse.h | 18 +- src/radbin/radbin.c | 10 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 2 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 283 +++++++++++++++++++++++--- src/rdi_from_elf/rdi_from_elf.c | 26 ++- src/rdi_from_elf/rdi_from_elf.h | 2 +- 10 files changed, 362 insertions(+), 51 deletions(-) diff --git a/src/base/base_math.h b/src/base/base_math.h index b31c0699..43604127 100644 --- a/src/base/base_math.h +++ b/src/base/base_math.h @@ -339,9 +339,9 @@ struct Rng1U64Node typedef struct Rng1U64List Rng1U64List; struct Rng1U64List { - U64 count; Rng1U64Node *first; Rng1U64Node *last; + U64 count; }; typedef struct Rng1U64Array Rng1U64Array; diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index e83fd918..edd7c1f0 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -8,7 +8,7 @@ typedef struct DW_Section { String8 name; String8 data; - B32 is_dwo; + B32 is_dwo; } DW_Section; typedef struct DW_Raw diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 7b406587..ea5572ef 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -900,3 +900,65 @@ dw2_read_str_offsets_table(String8 data, U64 off, DW2_StrOffsetsTable *out) U64 bytes_read = (off - start_off); return bytes_read; } + +//////////////////////////////// +//~ rjf: Range List Parsing (.debug_rnglists) + +internal Rng1U64List +dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val) +{ + Rng1U64List result = {0}; + switch((DW_VersionEnum)ctx->version) + { + case DW_Version_Null:{}break; + + //- rjf: pre-dwarf5 + case DW_Version_1: + case DW_Version_2: + case DW_Version_3: + case DW_Version_4: + { + String8 data = raw->sec[DW_Section_Ranges].data; + U64 ranges_off = ranges_off = form_val.u128.u64[0];; + U64 base_addr = ctx->unit_base_addr; + U64 sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); + for(U64 off = ranges_off; off < data.size;) + { + U64 start_off = off; + U64 range_min = 0; + U64 range_opl = 0; + off += str8_deserial_read(data, off, &range_min, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read(data, off, &range_opl, ctx->addr_size, ctx->addr_size); + // + // NOTE(rjf): interpreting tuples: + // [0, 0) -> ending range list + // [max_U32/U64, depending on addr size, X) -> set new base address to X + // [N, M) -> new [base + N, base + M) range + // + if(range_min == 0 && range_opl == 0) + { + break; + } + else if(range_min == sentinel) + { + base_addr = range_opl; + } + else if(off == start_off) + { + break; + } + else + { + rng1u64_list_push(arena, &result, r1u64(base_addr + range_min, base_addr + range_opl)); + } + } + }break; + + //- rjf: @dwarf5 + case DW_Version_5: + { + // TODO(rjf) + }break; + } + return result; +} diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index e298101d..8b86ee68 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -62,6 +62,7 @@ struct DW2_ParseCtx DW_Format format; DW_Ext ext; U64 addr_size; + U64 unit_base_addr; DW2_AbbrevMap *abbrev_map; DW2_StrOffsetsTable *str_offsets_table; String8 unit_dir; @@ -237,4 +238,9 @@ internal U64 dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 internal U64 dw2_read_str_offsets_table(String8 data, U64 off, DW2_StrOffsetsTable *out); +//////////////////////////////// +//~ rjf: Range List Parsing (.debug_rnglists) + +internal Rng1U64List dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val); + #endif // DWARF_PARSE_2_H diff --git a/src/elf/elf_parse.h b/src/elf/elf_parse.h index f15708c8..191c7fea 100644 --- a/src/elf/elf_parse.h +++ b/src/elf/elf_parse.h @@ -10,22 +10,22 @@ typedef struct ELF_Shdr64Array ELF_Shdr64Array; struct ELF_Shdr64Array { - U64 count; + U64 count; ELF_Shdr64 *v; }; typedef struct ELF_Phdr64Array ELF_Phdr64Array; struct ELF_Phdr64Array { - U64 count; + U64 count; ELF_Phdr64 *v; }; typedef struct ELF_Bin ELF_Bin; struct ELF_Bin { - ELF_Hdr64 hdr; - Rng1U64 sh_name_range; + ELF_Hdr64 hdr; + Rng1U64 sh_name_range; ELF_Shdr64Array shdrs; ELF_Phdr64Array phdrs; }; @@ -34,30 +34,30 @@ typedef struct ELF_GnuDebugLink ELF_GnuDebugLink; struct ELF_GnuDebugLink { String8 path; - U32 checksum; + U32 checksum; }; typedef struct ELF_Note ELF_Note; struct ELF_Note { - String8 owner; + String8 owner; ELF_NoteType type; - String8 desc; + String8 desc; }; typedef struct ELF_NoteNode ELF_NoteNode; struct ELF_NoteNode { - ELF_Note v; ELF_NoteNode *next; + ELF_Note v; }; typedef struct ELF_NoteList ELF_NoteList; struct ELF_NoteList { - U64 count; ELF_NoteNode *first; ELF_NoteNode *last; + U64 count; }; //////////////////////////////// diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 3c8ba34d..2f59204f 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -872,9 +872,9 @@ rb_thread_entry_point(void *p) convert_params_2.base_vaddr = elf_base_addr_from_bin(&bin); convert_params_2.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); convert_params_2.path_style = PathStyle_UnixAbsolute; - convert_params_2.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); + convert_params_2.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); scratch_end(scratch); - } break; + }break; } convert_params_2.exe_name = exe_name; convert_params_2.exe_data = exe_data; @@ -956,8 +956,8 @@ rb_thread_entry_point(void *p) { bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); - rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); - // rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); + // rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); + rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) { rdim_bake_params_concat_in_place(bake_params, &n->v); @@ -1404,7 +1404,7 @@ rb_thread_entry_point(void *p) PE_BinInfo pe = {0}; ELF_Bin elf = {0}; COFF_FileHeaderInfo coff_obj = {0}; - DW_Raw dw = {0}; + DW_Raw dw = {0}; U64 eh_frame_hdr_vaddr = 0; U64 eh_frame_vaddr = 0; String8 eh_frame_hdr = {0}; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 875f6a9c..f171c50b 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2753,7 +2753,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); path_style = PathStyle_UnixAbsolute; - g_d2r_shared.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, bin.shdrs); + g_d2r_shared.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, params->dbg_data, &bin, &bin.shdrs); } break; default: { InvalidPath; } break; } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 153dddcf..20e890db 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -78,47 +78,62 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //////////////////////////// - //- rjf: gather unit ranges from .debug_info + //- rjf: gather unit ranges from .debug_info, .debug_aranges // Rng1U64Array *unit_info_ranges = 0; - ProfScope("gather unit ranges from .debug_info") if(lane_idx() == 0) + Rng1U64Array *unit_arange_ranges = 0; + ProfScope("gather unit ranges from .debug_info, .debug_aranges") if(lane_idx() == 0) { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - String8 data = raw->sec[DW_Section_Info].data; - Rng1U64List unit_info_ranges_list = {0}; - for(U64 off = 0; off < data.size;) + struct { - U64 start_off = off; - - // rjf: read next unit info size - U64 unit_info_size = 0; - U64 unit_info_size_size = dw2_read_initial_length(data, off, &unit_info_size, 0); - - // rjf: push - if(unit_info_size > 0) + String8 data; + Rng1U64Array **dst_array; + } + tasks[] = + { + {raw->sec[DW_Section_Info].data, &unit_info_ranges}, + {raw->sec[DW_Section_ARanges].data, &unit_arange_ranges}, + }; + for EachElement(task_idx, tasks) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + String8 data = tasks[task_idx].data; + Rng1U64List unit_range_list = {0}; + for(U64 off = 0; off < data.size;) { - rng1u64_list_push(scratch2.arena, &unit_info_ranges_list, r1u64(off, off + unit_info_size_size + unit_info_size)); + U64 start_off = off; + + // rjf: read next unit size + U64 unit_size = 0; + U64 unit_size_size = dw2_read_initial_length(data, off, &unit_size, 0); + + // rjf: push + if(unit_size > 0) + { + rng1u64_list_push(scratch2.arena, &unit_range_list, r1u64(off, off + unit_size_size + unit_size)); + } + + // rjf: advance + off += unit_size_size; + off += unit_size; + + // rjf: break if no movement + if(off == start_off) + { + break; + } } - - // rjf: advance - off += unit_info_size_size; - off += unit_info_size; - - // rjf: break if no movement - if(off == start_off) - { - break; - } + tasks[task_idx].dst_array[0] = push_array(scratch.arena, Rng1U64Array, 1); + tasks[task_idx].dst_array[0][0] = rng1u64_array_from_list(scratch.arena, &unit_range_list); + scratch_end(scratch2); } - unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); - unit_info_ranges[0] = rng1u64_array_from_list(scratch.arena, &unit_info_ranges_list); - scratch_end(scratch2); } lane_sync_u64(&unit_info_ranges, 0); + lane_sync_u64(&unit_arange_ranges, 0); U64 unit_count = unit_info_ranges->count; //////////////////////////// - //- rjf: parse all unit headers + //- rjf: parse all .debug_info unit headers // DW2_UnitHeader *unit_headers = 0; Rng1U64 *unit_info_tag_ranges = 0; @@ -145,6 +160,148 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync(); + //////////////////////////// + //- rjf: parse all units from .debug_aranges + // + U64 *arange_info_offs = 0; + RDIM_Rng1U64ChunkList *arange_voff_ranges = 0; + { + if(lane_idx() == 0) + { + arange_info_offs = push_array(scratch.arena, U64, unit_arange_ranges->count); + arange_voff_ranges = push_array(scratch.arena, RDIM_Rng1U64ChunkList, unit_arange_ranges->count); + } + lane_sync_u64(&arange_info_offs, 0); + lane_sync_u64(&arange_voff_ranges, 0); + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + String8 data = raw->sec[DW_Section_ARanges].data; + for(;;) + { + // rjf: take unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= unit_arange_ranges->count) + { + break; + } + + // rjf: unpack + Rng1U64 arange_range = unit_arange_ranges->v[unit_idx]; + U64 off = arange_range.min; + + // rjf: read unit data size / format + U64 unit_size = 0; + DW_Format fmt = 0; + off += dw2_read_initial_length(data, off, &unit_size, &fmt); + U64 unit_opl = off + unit_size; + + // rjf: read version + DW_Version version = 0; + U64 version_off = off; + off += str8_deserial_read_struct(data, off, &version); + + // rjf: warn on non-version 2 + if(version != DW_Version_2) + { + log_infof("[.debug_aranges@0x%I64x] DWARF version for unit #%I64d was expected to be 2, but it was read as %i.\n", version_off, unit_idx, (S32)version); + } + + // rjf: read .debug_info off for this unit + U64 info_off = 0; + off += dw2_read_fmt_u64(data, off, fmt, &info_off); + + // rjf: read address / segment selector size + U8 addr_size = 0; + U8 segment_selector_size = 0; + off += str8_deserial_read_struct(data, off, &addr_size); + off += str8_deserial_read_struct(data, off, &segment_selector_size); + + // rjf: round up past padding + { + U64 tuple_size = addr_size*2 + segment_selector_size; + off += tuple_size - (off%tuple_size); + } + + // rjf: parse ranges + RDIM_Rng1U64ChunkList voff_ranges = {0}; + if(segment_selector_size != 0) + { + log_infof("[.debug_aranges@0x%I64x] Non-zero (%i) segment selector size parsed; this form of addressing is not currently supported in DWARF info.\n", off, (S32)segment_selector_size); + } + else for(;off < unit_opl;) + { + U64 start_off = off; + U64 base_addr = 0; + U64 range_size = 0; + off += str8_deserial_read(data, off, &base_addr, addr_size, addr_size); + off += str8_deserial_read(data, off, &range_size, addr_size, addr_size); + if(base_addr == 0 && range_size == 0) + { + break; + } + if(base_addr < base_vaddr) + { + log_infof("[.debug_aranges@0x%I64x] Address (0x%I64x) parsed which was less than the image base address (0x%I64x). Skipping.\n", start_off, base_addr, base_vaddr); + } + else + { + U64 voff_first = (base_addr - base_vaddr); + U64 voff_opl = voff_first + range_size; + RDIM_Rng1U64 range = {voff_first, voff_opl}; + rdim_rng1u64_chunk_list_push(scratch.arena, &voff_ranges, 256, range); + } + if(off == start_off) + { + break; + } + } + + // rjf: store + arange_info_offs[unit_idx] = info_off; + arange_voff_ranges[unit_idx] = voff_ranges; + } + lane_sync(); + } + + //////////////////////////// + //- rjf: produce info_off -> list(voff_range) map from aranges units; + // we must do this because technically we can't guarantee that unit_idxs + // inside of .debug_aranges are the same as unit_idxs inside of .debug_info, + // nor can we guarantee that they'd be in the same order, so we need to + // correllate via the encoded .debug_info offset from .debug_aranges. + // + // more excellence. + // + typedef struct D2R2_ARangeUnitNode D2R2_ARangeUnitNode; + struct D2R2_ARangeUnitNode + { + D2R2_ARangeUnitNode *next; + U64 info_off; + RDIM_Rng1U64ChunkList *ranges; + }; + U64 arange_unit_from_info_off_map_slots_count = unit_arange_ranges->count; + D2R2_ARangeUnitNode **arange_unit_from_info_off_map_slots = 0; + { + if(lane_idx() == 0) + { + arange_unit_from_info_off_map_slots = push_array(scratch.arena, D2R2_ARangeUnitNode *, arange_unit_from_info_off_map_slots_count); + } + lane_sync_u64(&arange_unit_from_info_off_map_slots, 0); + for EachIndex(arange_unit_idx, unit_arange_ranges->count) + { + U64 info_off = arange_info_offs[arange_unit_idx]; + RDIM_Rng1U64ChunkList *ranges = &arange_voff_ranges[arange_unit_idx]; + U64 hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 slot_idx = hash%arange_unit_from_info_off_map_slots_count; + D2R2_ARangeUnitNode *n = push_array(scratch.arena, D2R2_ARangeUnitNode, 1); + SLLStackPush(arange_unit_from_info_off_map_slots[slot_idx], n); + n->info_off = info_off; + n->ranges = ranges; + } + } + lane_sync(); + //////////////////////////// //- rjf: build all abbreviation maps, build (unit -> abbrev map) // @@ -389,6 +546,21 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync(); + //////////////////////////// + //- rjf: look up base addresses for each unit - equip to per-unit parsing contexts + // + { + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + DW2_Tag *unit_root_tag = &unit_root_tags__pre_str_offsets[unit_idx]; + DW2_Attrib *low_pc_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_LowPc); + U64 low_pc = low_pc_attrib->val.u128.u64[0]; + unit_parse_ctxs[unit_idx].unit_base_addr = low_pc; + } + } + lane_sync(); + //////////////////////////// //- rjf: look up string offset tables for each unit (.debug_str_offsets); // equip to per-unit parsing contexts @@ -1836,7 +2008,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { if(dw_is_form_kind_ref(unit_parse_ctx->version, unit_parse_ctx->ext, lower_bound_attrib->val.kind)) { - log_infof("[.debug_info@%I64x] Array type lower bound is a variable; this is not currently supported.\n", start_off); + log_infof("[.debug_info@0x%I64x] Array type lower bound is a variable; this is not currently supported.\n", start_off); } else { @@ -1855,7 +2027,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { if(dw_is_form_kind_ref(unit_parse_ctx->version, unit_parse_ctx->ext, upper_bound_attrib->val.kind)) { - log_infof("[.debug_info@%I64x] Array type upper bound is a variable; this is not currently supported.\n", start_off); + log_infof("[.debug_info@0x%I64x] Array type upper bound is a variable; this is not currently supported.\n", start_off); } else { @@ -1993,6 +2165,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Attrib *comp_dir_attrib = &dw2_attrib_nil; DW2_Attrib *producer_attrib = &dw2_attrib_nil; DW2_Attrib *lang_attrib = &dw2_attrib_nil; + DW2_Attrib *ranges_attrib = &dw2_attrib_nil; + DW2_Attrib *lopc_attrib = &dw2_attrib_nil; + DW2_Attrib *hipc_attrib = &dw2_attrib_nil; for EachNode(n, DW2_AttribNode, unit_root_tag->attribs.first) { switch(n->v.attrib_kind) @@ -2003,6 +2178,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Case(comp_dir, CompDir); Case(producer, Producer); Case(lang, Language); + Case(ranges, Ranges); + Case(lopc, LowPc); + Case(hipc, HighPc); #undef Case } } @@ -2034,6 +2212,46 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } + //- rjf: get unit's ranges from .debug_aranges parse artifacts, if we have them + RDIM_Rng1U64ChunkList unit_voff_ranges = {0}; + if(arange_unit_from_info_off_map_slots_count != 0) + { + U64 unit_info_off = unit_info_ranges->v[unit_idx].min; + U64 hash = u64_hash_from_str8(str8_struct(&unit_info_off)); + U64 slot_idx = hash%arange_unit_from_info_off_map_slots_count; + for(D2R2_ARangeUnitNode *n = arange_unit_from_info_off_map_slots[slot_idx]; n != 0; n = n->next) + { + if(n->info_off == unit_info_off) + { + unit_voff_ranges = n->ranges[0]; + break; + } + } + } + + //- rjf: if we have no voff ranges from .debug_aranges, then we need to extract + // this info from the unit root rag instead (via ranges & low-pc/high-pc tags) + if(unit_voff_ranges.total_count == 0) + { + // rjf: gather ranges from a ranges attribute + if(ranges_attrib != &dw2_attrib_nil) + { + Rng1U64List ranges = dw2_rnglist_from_form_val(scratch.arena, unit_parse_ctx, raw, ranges_attrib->val); + for EachNode(n, Rng1U64Node, ranges.first) + { + rdim_rng1u64_chunk_list_push(arena, &unit_voff_ranges, 256, (RDIM_Rng1U64){n->v.min - base_vaddr, n->v.max - base_vaddr}); + } + } + + // rjf: gather contiguous range from low-pc / high-pc attribute + if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) + { + U64 voff_base = lopc_attrib->val.u128.u64[0] - base_vaddr; + U64 voff_opl = hipc_attrib->val.u128.u64[0] - base_vaddr; + rdim_rng1u64_chunk_list_push(arena, &unit_voff_ranges, 256, (RDIM_Rng1U64){voff_base, voff_opl}); + } + } + //- rjf: fill top-level unit info { dst_unit->unit_name = unit_name; @@ -2044,6 +2262,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) dst_unit->build_path = unit_comp_dir; dst_unit->language = unit_lang; dst_unit->line_table = unit_line_tables[unit_idx]; + dst_unit->voff_ranges = unit_voff_ranges; } //- rjf: produce all unit symbols @@ -2119,7 +2338,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_BakeParams result = {0}; { result.subset_flags = params->subset_flags; - // TODO(rjf): result.top_level_info = *top_level_info; + result.top_level_info = top_level_info; // TODO(rjf): result.binary_sections = *binary_sections; result.units = *all_units; result.types = *all_types; diff --git a/src/rdi_from_elf/rdi_from_elf.c b/src/rdi_from_elf/rdi_from_elf.c index ccbb1351..909a28a2 100644 --- a/src/rdi_from_elf/rdi_from_elf.c +++ b/src/rdi_from_elf/rdi_from_elf.c @@ -2,8 +2,32 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) internal RDIM_BinarySectionList -e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, ELF_Shdr64Array shdrs) +e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_Bin *bin, ELF_Shdr64Array *shdrs) { RDIM_BinarySectionList result = {0}; + for EachIndex(idx, shdrs->count) + { + // rjf: unpack section + ELF_Shdr64 *src_section = &shdrs->v[idx]; + String8 name = elf_name_from_shdr64(data, bin, src_section); + U64 voff_first = src_section->sh_addr; + U64 voff_opl = voff_first + src_section->sh_size; + U64 foff_first = src_section->sh_offset; + U64 foff_opl = foff_first + src_section->sh_size; + + // rjf: map flags -> rdi + RDI_BinarySectionFlags flags = RDI_BinarySectionFlag_Read; + if(src_section->sh_flags & ELF_Shf_Write) { flags |= RDI_BinarySectionFlag_Write; } + if(src_section->sh_flags & ELF_Shf_ExecInstr) { flags |= RDI_BinarySectionFlag_Execute; } + + // rjf: make rdi section + RDIM_BinarySection *dst_section = rdim_binary_section_list_push(arena, &result); + dst_section->name = name; + dst_section->flags = flags; + dst_section->voff_first = voff_first; + dst_section->voff_opl = voff_opl; + dst_section->foff_first = foff_first; + dst_section->foff_opl = foff_opl; + } return result; } diff --git a/src/rdi_from_elf/rdi_from_elf.h b/src/rdi_from_elf/rdi_from_elf.h index 3d979c8f..bdb8faf5 100644 --- a/src/rdi_from_elf/rdi_from_elf.h +++ b/src/rdi_from_elf/rdi_from_elf.h @@ -4,6 +4,6 @@ #ifndef RDI_FROM_ELF_H #define RDI_FROM_ELF_H -internal RDIM_BinarySectionList e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, ELF_Shdr64Array shdrs); +internal RDIM_BinarySectionList e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_Bin *bin, ELF_Shdr64Array *shdrs); #endif // RDI_FROM_ELF_H From 242f4e9cbd4447aa545b1b07ba515480056c0766 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 28 Apr 2026 09:37:31 -0700 Subject: [PATCH 472/850] d2r2: dwarf 5 .debug_rnglists, .debug_addr parsing / usage --- src/dwarf/dwarf_parse_2.c | 138 ++++++++++++++++++-- src/dwarf/dwarf_parse_2.h | 15 ++- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 175 +++++++++++++++++--------- 3 files changed, 259 insertions(+), 69 deletions(-) diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index ea5572ef..0f7d0068 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -402,12 +402,9 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin if(ctx->str_offsets_table != 0) { U64 entry_idx = val.u128.u64[0]; - if(entry_idx < ctx->str_offsets_table->entries_count) + U64 string_data_off = 0; + if(dw2_try_offset_from_table_idx(ctx->str_offsets_table, entry_idx, &string_data_off)) { - U64 entry_size = ctx->str_offsets_table->entry_size; - U64 entry_off = entry_idx * entry_size; - U64 string_data_off = 0; - MemoryCopy(&string_data_off, (U8 *)ctx->str_offsets_table->entries + entry_off, entry_size); String8 string_section_data = ctx->raw->sec[DW_Section_Str].data; val.string = str8_cstring_capped(string_section_data.str + string_data_off, string_section_data.str + string_section_data.size); @@ -866,7 +863,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of //~ rjf: String Offset Table Parsing (.debug_str_offsets) internal U64 -dw2_read_str_offsets_table(String8 data, U64 off, DW2_StrOffsetsTable *out) +dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out) { U64 start_off = off; { @@ -901,6 +898,20 @@ dw2_read_str_offsets_table(String8 data, U64 off, DW2_StrOffsetsTable *out) return bytes_read; } +internal B32 +dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out) +{ + B32 result = 0; + if(idx < tbl->entries_count) + { + U64 entry_size = tbl->entry_size; + U64 entry_off = idx * entry_size; + MemoryCopy(out, (U8 *)tbl->entries + entry_off, entry_size); + result = 1; + } + return result; +} + //////////////////////////////// //~ rjf: Range List Parsing (.debug_rnglists) @@ -957,7 +968,120 @@ dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form //- rjf: @dwarf5 case DW_Version_5: { - // TODO(rjf) + String8 data = raw->sec[DW_Section_RngLists].data; + + // rjf: determine section offset - sometimes this is encoded directly, + // other times it is relative, based on the form kind - more variability + // in this awful format + U64 rnglist_off = 0; + switch(form_val.kind) + { + default:{}break; + case DW_Form_SecOffset: + { + rnglist_off = form_val.u128.u64[0]; + }break; + case DW_Form_RngListx: + if(ctx->rnglists_table != 0) + { + U64 rnglist_off_idx = form_val.u128.u64[0]; + dw2_try_offset_from_table_idx(ctx->rnglists_table, rnglist_off_idx, &rnglist_off); + }break; + } + + // rjf: in a HIGHLY UNEXPECTED TURN OF EVENTS, we now have to decode ANOTHER + // OPCODE STREAM to unpack the actual list of ranges!!! + U64 rle_sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); + U64 base_addr = ctx->unit_base_addr; + for(U64 off = rnglist_off; off < data.size;) + { + U64 start_off = off; + + // rjf: decode op kind + DW_RLE rle_kind = DW_RLE_EndOfList; + off += str8_deserial_read_struct(data, off, &rle_kind); + + // rjf: obtain range from op + B32 good_range = 1; + Rng1U64 range = {0}; + switch(rle_kind) + { + default:{good_range = 0;}break; + case DW_RLE_BaseAddressx: + { + good_range = 0; + U64 addr_idx = 0; + off += str8_deserial_read_uleb128(data, off, &addr_idx); + if(ctx->addr_table != 0) + { + U64 new_base_addr = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &new_base_addr)) + { + base_addr = new_base_addr; + } + } + }break; + case DW_RLE_StartxLength: + { + good_range = 0; + U64 start_idx = 0; + U64 length = 0; + off += str8_deserial_read_uleb128(data, off, &start_idx); + off += str8_deserial_read_uleb128(data, off, &length); + if(ctx->addr_table != 0) + { + U64 start = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start)) + { + good_range = 1; + range = r1u64(start, start+length); + } + } + }break; + case DW_RLE_OffsetPair: + { + U64 range_off_start = 0; + U64 range_off_end = 0; + off += str8_deserial_read_uleb128(data, off, &range_off_start); + off += str8_deserial_read_uleb128(data, off, &range_off_end); + range = r1u64(base_addr + range_off_start, base_addr + range_off_end); + }break; + case DW_RLE_BaseAddress: + { + U64 new_base_addr = 0; + off += str8_deserial_read(data, off, &new_base_addr, ctx->addr_size, ctx->addr_size); + base_addr = new_base_addr; + }break; + case DW_RLE_StartEnd: + { + U64 start = 0; + U64 end = 0; + off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read(data, off, &end, ctx->addr_size, ctx->addr_size); + range = r1u64(start, end); + }break; + case DW_RLE_StartLength: + { + U64 start = 0; + U64 length = 0; + off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read_uleb128(data, off, &length); + range = r1u64(start, start + length); + }break; + } + + // rjf: add range + if(good_range) + { + rng1u64_list_push(arena, &result, range); + } + + // rjf: end if no movement or end-of-list code + if(off == start_off || rle_kind == DW_RLE_EndOfList) + { + break; + } + } }break; } return result; diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index 8b86ee68..be200e96 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -37,10 +37,10 @@ struct DW2_AbbrevMap }; //////////////////////////////// -//~ rjf: String Offset Table (.debug_str_offsets) +//~ rjf: Offset Tables (.debug_str_offsets, .debug_rnglists) -typedef struct DW2_StrOffsetsTable DW2_StrOffsetsTable; -struct DW2_StrOffsetsTable +typedef struct DW2_OffsetTable DW2_OffsetTable; +struct DW2_OffsetTable { DW_Format format; DW_Version version; @@ -64,7 +64,9 @@ struct DW2_ParseCtx U64 addr_size; U64 unit_base_addr; DW2_AbbrevMap *abbrev_map; - DW2_StrOffsetsTable *str_offsets_table; + DW2_OffsetTable *rnglists_table; + DW2_OffsetTable *str_offsets_table; + DW2_OffsetTable *addr_table; String8 unit_dir; String8 unit_file; }; @@ -234,9 +236,10 @@ internal U64 dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal internal U64 dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out); //////////////////////////////// -//~ rjf: String Offset Table Parsing (.debug_str_offsets) +//~ rjf: Offset Table Parsing (.debug_str_offsets, .debug_rnglists) -internal U64 dw2_read_str_offsets_table(String8 data, U64 off, DW2_StrOffsetsTable *out); +internal U64 dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out); +internal B32 dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out); //////////////////////////////// //~ rjf: Range List Parsing (.debug_rnglists) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 20e890db..a426454f 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -416,7 +416,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync(); //////////////////////////// - //- rjf: parse all string offsets tables + //- rjf: parse all unit offsets tables + // + // on .debug_str_offsets, as one example: // // in an incredible twist of fate, DWARF decided to decouple these from // compilation units. compilation units *do* contain a @@ -439,61 +441,90 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // thank you, again, DWARF. // U64 str_offsets_tables_count = 0; - DW2_StrOffsetsTable *str_offsets_tables = 0; + DW2_OffsetTable *str_offsets_tables = 0; Rng1U64 *str_offsets_tables_ranges = 0; - ProfScope("parse all string offsets tables") if(lane_idx() == 0) + U64 rnglists_tables_count = 0; + DW2_OffsetTable *rnglists_tables = 0; + Rng1U64 *rnglists_tables_ranges = 0; + U64 addr_tables_count = 0; + DW2_OffsetTable *addr_tables = 0; + Rng1U64 *addr_tables_ranges = 0; + ProfScope("parse all offset tables (.debug_rnglists, .debug_str_offsets, .debug_addr)") if(lane_idx() == 0) { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - //- rjf: gather all tables (loose) - typedef struct TableNode TableNode; - struct TableNode + struct { - TableNode *next; - DW2_StrOffsetsTable v; - Rng1U64 range; + String8 data; + U64 *tables_count_out; + DW2_OffsetTable **tables_out; + Rng1U64 **tables_ranges_out; + } + tasks[] = + { + {raw->sec[DW_Section_StrOffsets].data, &str_offsets_tables_count, &str_offsets_tables, &str_offsets_tables_ranges}, + {raw->sec[DW_Section_RngLists].data, &rnglists_tables_count, &rnglists_tables, &rnglists_tables_ranges}, + {raw->sec[DW_Section_Addr].data, &addr_tables_count, &addr_tables, &addr_tables_ranges}, }; - TableNode *first_table = 0; - TableNode *last_table = 0; - U64 table_count = 0; - for(U64 off = 0; off < raw->sec[DW_Section_StrOffsets].data.size;) + for EachElement(task_idx, tasks) { - U64 start_off = off; - DW2_StrOffsetsTable table = {0}; - off += dw2_read_str_offsets_table(raw->sec[DW_Section_StrOffsets].data, off, &table); - if(table.entries != 0) + Temp scratch2 = scratch_begin(&scratch.arena, 1); + String8 data = tasks[task_idx].data; + + //- rjf: gather all tables (loose) + typedef struct TableNode TableNode; + struct TableNode { - TableNode *n = push_array(scratch2.arena, TableNode, 1); - SLLQueuePush(first_table, last_table, n); - n->v = table; - n->range = r1u64(start_off, off); - table_count += 1; - } - if(off == start_off) + TableNode *next; + DW2_OffsetTable v; + Rng1U64 range; + }; + TableNode *first_table = 0; + TableNode *last_table = 0; + U64 table_count = 0; + for(U64 off = 0; off < data.size;) { - break; + U64 start_off = off; + DW2_OffsetTable table = {0}; + off += dw2_read_offset_table(data, off, &table); + if(table.entries != 0) + { + TableNode *n = push_array(scratch2.arena, TableNode, 1); + SLLQueuePush(first_table, last_table, n); + n->v = table; + n->range = r1u64(start_off, off); + table_count += 1; + } + if(off == start_off) + { + break; + } } + + //- rjf: tighten + tasks[task_idx].tables_count_out[0] = table_count; + tasks[task_idx].tables_out[0] = push_array(scratch.arena, DW2_OffsetTable, table_count); + tasks[task_idx].tables_ranges_out[0] = push_array(scratch.arena, Rng1U64, table_count); + { + U64 idx = 0; + for EachNode(n, TableNode, first_table) + { + tasks[task_idx].tables_out[0][idx] = n->v; + tasks[task_idx].tables_ranges_out[0][idx] = n->range; + idx += 1; + } + } + + scratch_end(scratch2); } - - //- rjf: tighten - str_offsets_tables_count = table_count; - str_offsets_tables = push_array(scratch.arena, DW2_StrOffsetsTable, str_offsets_tables_count); - str_offsets_tables_ranges = push_array(scratch.arena, Rng1U64, str_offsets_tables_count); - { - U64 idx = 0; - for EachNode(n, TableNode, first_table) - { - str_offsets_tables[idx] = n->v; - str_offsets_tables_ranges[idx] = n->range; - idx += 1; - } - } - - scratch_end(scratch2); } lane_sync_u64(&str_offsets_tables_count, 0); lane_sync_u64(&str_offsets_tables, 0); lane_sync_u64(&str_offsets_tables_ranges, 0); + lane_sync_u64(&rnglists_tables_count, 0); + lane_sync_u64(&rnglists_tables, 0); + lane_sync_u64(&rnglists_tables_ranges, 0); + lane_sync_u64(&addr_tables_count, 0); + lane_sync_u64(&addr_tables, 0); + lane_sync_u64(&addr_tables_ranges, 0); //////////////////////////// //- rjf: build per-unit parsing contexts @@ -531,17 +562,19 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // so, in another incredible twist of fate, we actually must do this *twice*. first, // to find *just the StrOffsetsBase*, and then, to actually fully resolve everything. // - DW2_Tag *unit_root_tags__pre_str_offsets = 0; + // (all of the above is also true for RngListsBase) + // + DW2_Tag *unit_root_tags__pre_offset_tables = 0; { if(lane_idx() == 0) { - unit_root_tags__pre_str_offsets = push_array(scratch.arena, DW2_Tag, unit_count); + unit_root_tags__pre_offset_tables = push_array(scratch.arena, DW2_Tag, unit_count); } - lane_sync_u64(&unit_root_tags__pre_str_offsets, 0); + lane_sync_u64(&unit_root_tags__pre_offset_tables, 0); Rng1U64 range = lane_range(unit_count); for EachInRange(unit_idx, range) { - dw2_read_tag(scratch.arena, &unit_parse_ctxs[unit_idx], raw->sec[DW_Section_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags__pre_str_offsets[unit_idx]); + dw2_read_tag(scratch.arena, &unit_parse_ctxs[unit_idx], raw->sec[DW_Section_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags__pre_offset_tables[unit_idx]); } } lane_sync(); @@ -553,7 +586,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64 range = lane_range(unit_count); for EachInRange(unit_idx, range) { - DW2_Tag *unit_root_tag = &unit_root_tags__pre_str_offsets[unit_idx]; + DW2_Tag *unit_root_tag = &unit_root_tags__pre_offset_tables[unit_idx]; DW2_Attrib *low_pc_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_LowPc); U64 low_pc = low_pc_attrib->val.u128.u64[0]; unit_parse_ctxs[unit_idx].unit_base_addr = low_pc; @@ -562,22 +595,52 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync(); //////////////////////////// - //- rjf: look up string offset tables for each unit (.debug_str_offsets); + //- rjf: look up offset tables for each unit (.debug_str_offsets, .debug_rnglists, etc.); // equip to per-unit parsing contexts // { + Rng1U64Array rnglists_tables_ranges_array = {rnglists_tables_ranges, rnglists_tables_count}; Rng1U64Array str_offsets_tables_ranges_array = {str_offsets_tables_ranges, str_offsets_tables_count}; + Rng1U64Array addr_tables_ranges_array = {addr_tables_ranges, addr_tables_count}; Rng1U64 range = lane_range(unit_count); for EachInRange(unit_idx, range) { - DW2_Tag *unit_root_tag = &unit_root_tags__pre_str_offsets[unit_idx]; - DW2_Attrib *str_offsets_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StrOffsetsBase); - U64 str_offsets_base_off = str_offsets_base_off_attrib->val.u128.u64[0]; - U64 str_offsets_table_num = rng1u64_array_num_from_value__binary_search(&str_offsets_tables_ranges_array, str_offsets_base_off); - if(0 < str_offsets_table_num && str_offsets_table_num <= str_offsets_tables_ranges_array.count) + DW2_Tag *unit_root_tag = &unit_root_tags__pre_offset_tables[unit_idx]; + + // rjf: find rnglists table { - DW2_StrOffsetsTable *table = &str_offsets_tables[str_offsets_table_num-1]; - unit_parse_ctxs[unit_idx].str_offsets_table = table; + DW2_Attrib *rnglists_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_RngListsBase); + U64 rnglists_base_off = rnglists_base_off_attrib->val.u128.u64[0]; + U64 rnglists_table_num = rng1u64_array_num_from_value__binary_search(&rnglists_tables_ranges_array, rnglists_base_off); + if(0 < rnglists_table_num && rnglists_table_num <= rnglists_tables_ranges_array.count) + { + DW2_OffsetTable *table = &rnglists_tables[rnglists_table_num-1]; + unit_parse_ctxs[unit_idx].rnglists_table = table; + } + } + + // rjf: find str offsets table + { + DW2_Attrib *str_offsets_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StrOffsetsBase); + U64 str_offsets_base_off = str_offsets_base_off_attrib->val.u128.u64[0]; + U64 str_offsets_table_num = rng1u64_array_num_from_value__binary_search(&str_offsets_tables_ranges_array, str_offsets_base_off); + if(0 < str_offsets_table_num && str_offsets_table_num <= str_offsets_tables_ranges_array.count) + { + DW2_OffsetTable *table = &str_offsets_tables[str_offsets_table_num-1]; + unit_parse_ctxs[unit_idx].str_offsets_table = table; + } + } + + // rjf: find addr table + { + DW2_Attrib *addr_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_AddrBase); + U64 addr_base_off = addr_base_off_attrib->val.u128.u64[0]; + U64 addr_table_num = rng1u64_array_num_from_value__binary_search(&addr_tables_ranges_array, addr_base_off); + if(0 < addr_table_num && addr_table_num <= addr_tables_ranges_array.count) + { + DW2_OffsetTable *table = &addr_tables[addr_table_num-1]; + unit_parse_ctxs[unit_idx].addr_table = table; + } } } } From 9a923e9bf94bb2cd24d11afc1e1892276b601271 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 29 Apr 2026 12:40:43 -0700 Subject: [PATCH 473/850] d2r2: .debug_loclists parsing, DWARF expression -> RDI location info; first pass at baking frame base into var locations to match simpler PDB behavior; fixes to high-pc address evaluation (based on form kind) --- src/dwarf/dwarf.c | 51 +- src/dwarf/dwarf.h | 5 +- src/dwarf/dwarf_parse.c | 2 +- src/dwarf/dwarf_parse_2.c | 266 ++++++++ src/dwarf/dwarf_parse_2.h | 34 +- src/eval/eval_core.c | 8 +- src/eval/eval_interpret.c | 31 +- src/eval/eval_ir.c | 4 +- src/lib_rdi/rdi.h | 12 +- src/linker/rdi/rdi_builder.c | 16 +- src/radbin/radbin.c | 4 +- src/rdi/rdi.mdesk | 8 +- src/rdi/rdi_local.c | 6 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 920 +++++++++++++++++++++++++- src/rdi_from_pdb/rdi_from_pdb.c | 4 +- src/rdi_make/rdi_make_local.c | 4 +- 16 files changed, 1280 insertions(+), 95 deletions(-) diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 275a73fa..acbe4aff 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -134,40 +134,47 @@ dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind k) internal DW_AttribClass dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k) { -#define X(_N,_C) case DW_Form_##_N: return _C; - - switch (k) { + DW_AttribClass result = DW_AttribClass_Null; +#define X(_N,_C) case DW_Form_##_N:{result = _C;}break; + switch(k) + { DW_Form_AttribClass_GNU_XList } - - switch (ver) { - case DW_Version_5: { - switch (k) { + switch(ver) + { + case DW_Version_5: + { + switch (k) + { DW_Form_AttribClass_V5_XList } - } break; - case DW_Version_4: { - switch (k) { + }break; + case DW_Version_4: + { + switch (k) + { DW_Form_AttribClass_V4_XList } - } break; - case DW_Version_3: { - switch (k) { + }break; + case DW_Version_3: + { + switch (k) + { DW_Form_AttribClass_V2_XList } - } break; - case DW_Version_2: { - switch (k) { + }break; + case DW_Version_2: + { + switch(k) + { DW_Form_AttribClass_V2_XList } - } break; - case DW_Version_1: { - } break; - case DW_Version_Null: break; + }break; + case DW_Version_1:{} break; + case DW_Version_Null:{}break; } #undef X - - return DW_AttribClass_Null; + return result; } internal B32 diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index b0ec11ac..12a150f5 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1432,7 +1432,7 @@ typedef enum DW_CFA_Enum //////////////////////////////// // Expression Opcodes -typedef enum +typedef enum DW_ExprOperandType { DW_ExprOperandType_Null, DW_ExprOperandType_U8, @@ -1448,7 +1448,8 @@ typedef enum DW_ExprOperandType_Addr, DW_ExprOperandType_Block, DW_ExprOperandType_DwarfUInt, -} DW_ExprOperandType; +} +DW_ExprOperandType; // (opcode name, opcode id, operand count, pop count, push count, operand0 type, operand1 type) #define DW_Expr_V3_XList \ diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 1c042c5d..9b9b669b 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -1116,7 +1116,7 @@ dw_interp_loclist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form) DW_LocList loclist = {0}; if (cu->version < DW_Version_5) { - if (form.kind == DW_Form_SecOffset) { + if (form.kind == DW_Form_SecOffset) { U64 sec_offset = max_U64; if (form.kind == DW_Form_SecOffset) { sec_offset = form.sec_offset; diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 0f7d0068..7f8ec0cc 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -425,6 +425,24 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin }break; } } + + //- rjf: in some cases, resolve base numeric values -> addresses + { + switch(form_kind) + { + default:{val.addr = val.u128.u64[0];}break; + case DW_Form_Addrx: + case DW_Form_Addrx1: + case DW_Form_Addrx2: + case DW_Form_Addrx3: + case DW_Form_Addrx4: + if(ctx->addr_table != 0) + { + U64 addr_idx = val.u128.u64[0]; + dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &val.addr); + }break; + } + } } *out = val; U64 bytes_read = (off - start_off); @@ -962,6 +980,10 @@ dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form { rng1u64_list_push(arena, &result, r1u64(base_addr + range_min, base_addr + range_opl)); } + if(off == start_off) + { + break; + } } }break; @@ -1017,10 +1039,30 @@ dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form U64 new_base_addr = 0; if(dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &new_base_addr)) { + good_range = 1; base_addr = new_base_addr; } } }break; + case DW_RLE_StartxEndx: + { + good_range = 0; + U64 start_idx = 0; + U64 end_idx = 0; + off += str8_deserial_read_uleb128(data, off, &start_idx); + off += str8_deserial_read_uleb128(data, off, &end_idx); + if(ctx->addr_table != 0) + { + U64 start = 0; + U64 end = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start) && + dw2_try_offset_from_table_idx(ctx->addr_table, end_idx, &end)) + { + good_range = 1; + range = r1u64(start, end); + } + } + }break; case DW_RLE_StartxLength: { good_range = 0; @@ -1086,3 +1128,227 @@ dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form } return result; } + +//////////////////////////////// +//~ rjf: Location List Parsing (.debug_loclists) + +internal DW2_LocList +dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val) +{ + DW2_LocList result = {0}; + switch((DW_VersionEnum)ctx->version) + { + case DW_Version_Null:{}break; + + //- rjf: pre-dwarf5 + case DW_Version_1: + case DW_Version_2: + case DW_Version_3: + case DW_Version_4: + { + String8 data = raw->sec[DW_Section_Loc].data; + U64 locs_off = locs_off = form_val.u128.u64[0]; + U64 base_addr = ctx->unit_base_addr; + U64 sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); + for(U64 off = locs_off; off < data.size;) + { + U64 start_off = off; + U64 range_min = 0; + U64 range_opl = 0; + off += str8_deserial_read(data, off, &range_min, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read(data, off, &range_opl, ctx->addr_size, ctx->addr_size); + // + // NOTE(rjf): interpreting tuples: + // [0, 0) -> ending range list + // [max_U32/U64, depending on addr size, X) -> set new base address to X + // [N, M) -> new [base + N, base + M) range + // + if(range_min == 0 && range_opl == 0) + { + break; + } + else if(range_min == sentinel) + { + base_addr = range_opl; + } + else if(off == start_off) + { + break; + } + else + { + U16 expr_size = 0; + off += str8_deserial_read_struct(data, off, &expr_size); + DW2_LocNode *n = push_array(arena, DW2_LocNode, 1); + n->v.range = r1u64(range_min + base_addr, range_opl + base_addr); + n->v.expr = str8_substr(data, r1u64(off, off+expr_size)); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + off += expr_size; + } + if(off == start_off) + { + break; + } + } + }break; + + //- rjf: @dwarf5 + case DW_Version_5: + { + String8 data = raw->sec[DW_Section_LocLists].data; + + // rjf: determine section offset - sometimes this is encoded directly, + // other times it is relative, based on the form kind - more variability + // in this awful format + U64 loclist_off = 0; + switch(form_val.kind) + { + default:{}break; + case DW_Form_SecOffset: + { + loclist_off = form_val.u128.u64[0]; + }break; + case DW_Form_LocListx: + if(ctx->rnglists_table != 0) + { + U64 loclist_off_idx = form_val.u128.u64[0]; + dw2_try_offset_from_table_idx(ctx->loclists_table, loclist_off_idx, &loclist_off); + }break; + } + + // rjf: in a HIGHLY UNEXPECTED TURN OF EVENTS, we now have to decode ANOTHER + // OPCODE STREAM to unpack the actual list of locations!!! + U64 rle_sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); + U64 base_addr = ctx->unit_base_addr; + for(U64 off = loclist_off; off < data.size;) + { + U64 start_off = off; + + // rjf: decode op kind + DW_LLE lle_kind = DW_LLE_EndOfList; + off += str8_deserial_read_struct(data, off, &lle_kind); + + // rjf: obtain range from op + B32 good_loc = 1; + Rng1U64 range = {0}; + switch(lle_kind) + { + default:{good_loc = 0;}break; + case DW_LLE_BaseAddressx: + { + good_loc = 0; + U64 addr_idx = 0; + off += str8_deserial_read_uleb128(data, off, &addr_idx); + if(ctx->addr_table != 0) + { + U64 new_base_addr = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &new_base_addr)) + { + good_loc = 1; + base_addr = new_base_addr; + } + } + }break; + case DW_LLE_StartxEndx: + { + good_loc = 0; + U64 start_idx = 0; + U64 end_idx = 0; + off += str8_deserial_read_uleb128(data, off, &start_idx); + off += str8_deserial_read_uleb128(data, off, &end_idx); + if(ctx->addr_table != 0) + { + U64 start = 0; + U64 end = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start) && + dw2_try_offset_from_table_idx(ctx->addr_table, end_idx, &end)) + { + good_loc = 1; + range = r1u64(start, end); + } + } + }break; + case DW_LLE_StartxLength: + { + good_loc = 0; + U64 start_idx = 0; + U64 length = 0; + off += str8_deserial_read_uleb128(data, off, &start_idx); + off += str8_deserial_read_uleb128(data, off, &length); + if(ctx->addr_table != 0) + { + U64 start = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start)) + { + good_loc = 1; + range = r1u64(start, start+length); + } + } + }break; + case DW_LLE_OffsetPair: + { + U64 range_off_start = 0; + U64 range_off_end = 0; + off += str8_deserial_read_uleb128(data, off, &range_off_start); + off += str8_deserial_read_uleb128(data, off, &range_off_end); + range = r1u64(base_addr + range_off_start, base_addr + range_off_end); + }break; + case DW_LLE_DefaultLocation: + { + range = r1u64(0, max_U64); + }break; + case DW_LLE_BaseAddress: + { + U64 new_base_addr = 0; + off += str8_deserial_read(data, off, &new_base_addr, ctx->addr_size, ctx->addr_size); + base_addr = new_base_addr; + }break; + case DW_LLE_StartEnd: + { + U64 start = 0; + U64 end = 0; + off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read(data, off, &end, ctx->addr_size, ctx->addr_size); + range = r1u64(start, end); + }break; + case DW_LLE_StartLength: + { + U64 start = 0; + U64 length = 0; + off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read_uleb128(data, off, &length); + range = r1u64(start, start + length); + }break; + } + + // rjf: read expression + String8 expr = {0}; + if(good_loc && lle_kind != DW_LLE_BaseAddress && lle_kind != DW_LLE_BaseAddressx) + { + U64 expr_size = 0; + off += str8_deserial_read_uleb128(data, off, &expr_size); + expr = str8_substr(data, r1u64(off, off+expr_size)); + off += expr_size; + } + + // rjf: add range + if(good_loc) + { + DW2_LocNode *n = push_array(arena, DW2_LocNode, 1); + n->v.range = range; + n->v.expr = expr; + SLLQueuePush(result.first, result.last, n); + result.count += 1; + } + + // rjf: end if no movement or end-of-list code + if(off == start_off || lle_kind == DW_LLE_EndOfList) + { + break; + } + } + }break; + } + return result; +} diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index be200e96..c583fbca 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -67,6 +67,7 @@ struct DW2_ParseCtx DW2_OffsetTable *rnglists_table; DW2_OffsetTable *str_offsets_table; DW2_OffsetTable *addr_table; + DW2_OffsetTable *loclists_table; String8 unit_dir; String8 unit_file; }; @@ -78,8 +79,9 @@ typedef struct DW2_FormVal DW2_FormVal; struct DW2_FormVal { DW_FormKind kind; - String8 string; U128 u128; + String8 string; + U64 addr; }; typedef struct DW2_Attrib DW2_Attrib; @@ -197,6 +199,31 @@ struct DW2_LineVMRegs U64 discriminator; }; +//////////////////////////////// +//~ rjf: Location Lists + +typedef struct DW2_Loc DW2_Loc; +struct DW2_Loc +{ + Rng1U64 range; + String8 expr; +}; + +typedef struct DW2_LocNode DW2_LocNode; +struct DW2_LocNode +{ + DW2_LocNode *next; + DW2_Loc v; +}; + +typedef struct DW2_LocList DW2_LocList; +struct DW2_LocList +{ + DW2_LocNode *first; + DW2_LocNode *last; + U64 count; +}; + //////////////////////////////// //~ rjf: Globals @@ -246,4 +273,9 @@ internal B32 dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *o internal Rng1U64List dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val); +//////////////////////////////// +//~ rjf: Location List Parsing (.debug_loclists) + +internal DW2_LocList dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val); + #endif // DWARF_PARSE_2_H diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 656783e3..a7af01fc 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -684,17 +684,17 @@ e_oplist_from_location(Arena *arena, RDI_Parsed *rdi, RDI_Location loc) }break; //- rjf: reg + off - case RDI_LocationKind_AddrRegPlusU16: goto reg_plus_off; - case RDI_LocationKind_AddrAddrRegPlusU16: need_extra_memread = 1; goto reg_plus_off; + case RDI_LocationKind_AddrRegPlusOff: goto reg_plus_off; + case RDI_LocationKind_AddrAddrRegPlusOff: need_extra_memread = 1; goto reg_plus_off; reg_plus_off:; { RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); Arch arch = arch_from_rdi_arch(tli->arch); U64 arch_addr_bytesize = byte_size_from_arch(arch); RDI_RegCode regcode = rdi_regcode_from_location(loc); - U64 reg_off = rdi_regoff_from_location(loc); + S64 reg_off = rdi_regoff_from_location(loc); e_oplist_push_op(arena, &result, RDI_EvalOp_RegRead, e_value_u64(RDI_EncodeRegReadParam(regcode, arch_addr_bytesize, 0))); - e_oplist_push_uconst(arena, &result, reg_off); + e_oplist_push_sconst(arena, &result, reg_off); e_oplist_push_op(arena, &result, RDI_EvalOp_Add, e_value_u64(0)); if(need_extra_memread) { diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 4c9a2949..b68e5d13 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -936,31 +936,20 @@ e_interpret(String8 bytecode) } }break; - case RDI_EvalOp_CallSiteValue: - { - NotImplemented; - }break; - - case RDI_EvalOp_PartialValue: - { - NotImplemented; - }break; - - case RDI_EvalOp_PartialValueBit: - { - NotImplemented; - }break; - - case RDI_EvalOp_Swap: - { - // TODO: add support for pushing multiple values onto the stack - NotImplemented; - }break; - case RDI_EvalOp_PushCfa: { nval.u64 = e_interpret_ctx->cfa; }break; + + case RDI_EvalOp_CallSiteValue: + case RDI_EvalOp_PartialValue: + case RDI_EvalOp_PartialValueBit: + case RDI_EvalOp_Swap: + { + // TODO(rjf) + result.code = E_InterpretationCode_BadOp; + goto done; + }break; } // rjf: push diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index b8f671b7..ca17a553 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -2108,8 +2108,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I mapped_bytecode_mode = E_Mode_Value; }break; case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: + case RDI_LocationKind_AddrRegPlusOff: + case RDI_LocationKind_AddrAddrRegPlusOff: { mapped_bytecode_mode = E_Mode_Offset; }break; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 150dea81..e14fa37c 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -404,8 +404,8 @@ typedef enum RDI_LocationKindEnum RDI_LocationKind_NULL = 0x0, RDI_LocationKind_AddrBytecodeStream = 0x1, RDI_LocationKind_ValBytecodeStream = 0x2, -RDI_LocationKind_AddrRegPlusU16 = 0x3, -RDI_LocationKind_AddrAddrRegPlusU16 = 0x4, +RDI_LocationKind_AddrRegPlusOff = 0x3, +RDI_LocationKind_AddrAddrRegPlusOff = 0x4, RDI_LocationKind_ValReg = 0x5, RDI_LocationKind_ModuleOff = 0x6, RDI_LocationKind_TLSOff = 0x7, @@ -887,8 +887,8 @@ X($(a.name != COUNT -> a.name))\ X(NULL)\ X(AddrBytecodeStream)\ X(ValBytecodeStream)\ -X(AddrRegPlusU16)\ -X(AddrAddrRegPlusU16)\ +X(AddrRegPlusOff)\ +X(AddrAddrRegPlusOff)\ X(ValReg)\ X(ModuleOff)\ X(TLSOff)\ @@ -1120,8 +1120,8 @@ typedef RDI_U64 RDI_Location; #define RDI_Location_RegOffMask 0x0000ffff00000000ull #define RDI_Location_RegOffShift 32 #define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift)) -#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0) -#define rdi_regoff_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) +#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0) +#define rdi_regoff_from_location(l) (RDI_S64)((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) #define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) diff --git a/src/linker/rdi/rdi_builder.c b/src/linker/rdi/rdi_builder.c index b79e0bcc..710bfa19 100644 --- a/src/linker/rdi/rdi_builder.c +++ b/src/linker/rdi/rdi_builder.c @@ -913,7 +913,7 @@ rdib_make_location_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, R { RDIB_Location loc = {0}; loc.ranges = ranges; - loc.kind = RDI_LocationKind_AddrRegPlusU16; + loc.kind = RDI_LocationKind_AddrRegPlusOff; loc.reg_code = reg_code; loc.offset = offset; return loc; @@ -923,7 +923,7 @@ internal RDIB_Location rdib_make_location_addr_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset) { RDIB_Location loc = {0}; - loc.kind = RDI_LocationKind_AddrAddrRegPlusU16; + loc.kind = RDI_LocationKind_AddrAddrRegPlusOff; loc.ranges = ranges; loc.reg_code = reg_code; loc.offset = offset; @@ -4086,8 +4086,8 @@ THREAD_POOL_TASK_FUNC(rdib_count_scopes_task) case RDI_LocationKind_ValReg: { //task->loc_data_sizes[task_id] += sizeof(RDI_LocationReg); } break; - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: { + case RDI_LocationKind_AddrRegPlusOff: + case RDI_LocationKind_AddrAddrRegPlusOff: { //task->loc_data_sizes[task_id] += sizeof(RDI_LocationRegPlusU16); } break; default: InvalidPath; @@ -4192,10 +4192,10 @@ THREAD_POOL_TASK_FUNC(rdib_build_scopes_task) loc_data[loc_data_cursor] = 0; loc_data_cursor += 1; } break; - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: { - Assert(loc_data_cursor + sizeof(RDI_LocationRegPlusU16) <= loc_data_max); - RDI_LocationRegPlusU16 *dst = (RDI_LocationRegPlusU16 *) (loc_data + loc_data_cursor); + case RDI_LocationKind_AddrRegPlusOff: + case RDI_LocationKind_AddrAddrRegPlusOff: { + Assert(loc_data_cursor + sizeof(RDI_LocationRegPlusOff) <= loc_data_max); + RDI_LocationRegPlusU16 *dst = (RDI_LocationRegPlusOff *) (loc_data + loc_data_cursor); dst->kind = loc->kind; dst->reg_code = loc->reg_code; dst->offset = loc->offset; diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 2f59204f..58f12f14 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -956,8 +956,8 @@ rb_thread_entry_point(void *p) { bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); - // rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); - rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); + rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); + // rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) { rdim_bake_params_concat_in_place(bake_params, &n->v); diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 88dbdfb8..16b733aa 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1007,8 +1007,8 @@ RDI_LocationKindTable: {NULL 0x0} {AddrBytecodeStream 0x1} {ValBytecodeStream 0x2} - {AddrRegPlusU16 0x3} - {AddrAddrRegPlusU16 0x4} + {AddrRegPlusOff 0x3} + {AddrAddrRegPlusOff 0x4} {ValReg 0x5} {ModuleOff 0x6} {TLSOff 0x7} @@ -1115,8 +1115,8 @@ RDI_LocationSetElementMemberTable: `#define RDI_Location_RegOffMask 0x0000ffff00000000ull`; `#define RDI_Location_RegOffShift 32`; `#define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift))`; - `#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0)`; - `#define rdi_regoff_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusU16 || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusU16) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0)`; + `#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0)`; + `#define rdi_regoff_from_location(l) (RDI_S64)((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0)`; `#define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 7624434f..6f4bf48a 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1066,11 +1066,11 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse String8 bytecode_stringification = rdi_string_from_bytecode(scratch.arena, tli->arch, bytecode); dumpf(" bytecode: { %S }\n", bytecode_stringification); }break; - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: + case RDI_LocationKind_AddrRegPlusOff: + case RDI_LocationKind_AddrAddrRegPlusOff: { RDI_RegCode reg_code = rdi_regcode_from_location(location); - U64 reg_off = rdi_regoff_from_location(location); + S64 reg_off = rdi_regoff_from_location(location); String8 reg_code_string = rdi_string_from_reg_code(scratch.arena, tli->arch, reg_code); dumpf(" reg: %S\n", reg_code_string); dumpf(" reg_off: 0x%I64x\n", reg_off); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index a426454f..f0073947 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -449,7 +449,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 addr_tables_count = 0; DW2_OffsetTable *addr_tables = 0; Rng1U64 *addr_tables_ranges = 0; - ProfScope("parse all offset tables (.debug_rnglists, .debug_str_offsets, .debug_addr)") if(lane_idx() == 0) + U64 loclists_tables_count = 0; + DW2_OffsetTable *loclists_tables = 0; + Rng1U64 *loclists_tables_ranges = 0; + ProfScope("parse all offset tables (.debug_rnglists, .debug_str_offsets, .debug_addr, .debug_loclists)") if(lane_idx() == 0) { struct { @@ -463,6 +466,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) {raw->sec[DW_Section_StrOffsets].data, &str_offsets_tables_count, &str_offsets_tables, &str_offsets_tables_ranges}, {raw->sec[DW_Section_RngLists].data, &rnglists_tables_count, &rnglists_tables, &rnglists_tables_ranges}, {raw->sec[DW_Section_Addr].data, &addr_tables_count, &addr_tables, &addr_tables_ranges}, + {raw->sec[DW_Section_LocLists].data, &loclists_tables_count, &loclists_tables, &loclists_tables_ranges}, }; for EachElement(task_idx, tasks) { @@ -525,6 +529,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync_u64(&addr_tables_count, 0); lane_sync_u64(&addr_tables, 0); lane_sync_u64(&addr_tables_ranges, 0); + lane_sync_u64(&loclists_tables_count, 0); + lane_sync_u64(&loclists_tables, 0); + lane_sync_u64(&loclists_tables_ranges, 0); //////////////////////////// //- rjf: build per-unit parsing contexts @@ -588,7 +595,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { DW2_Tag *unit_root_tag = &unit_root_tags__pre_offset_tables[unit_idx]; DW2_Attrib *low_pc_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_LowPc); - U64 low_pc = low_pc_attrib->val.u128.u64[0]; + U64 low_pc = low_pc_attrib->val.addr; unit_parse_ctxs[unit_idx].unit_base_addr = low_pc; } } @@ -602,6 +609,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64Array rnglists_tables_ranges_array = {rnglists_tables_ranges, rnglists_tables_count}; Rng1U64Array str_offsets_tables_ranges_array = {str_offsets_tables_ranges, str_offsets_tables_count}; Rng1U64Array addr_tables_ranges_array = {addr_tables_ranges, addr_tables_count}; + Rng1U64Array loclist_tables_ranges_array = {loclists_tables_ranges, loclists_tables_count}; Rng1U64 range = lane_range(unit_count); for EachInRange(unit_idx, range) { @@ -642,6 +650,18 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) unit_parse_ctxs[unit_idx].addr_table = table; } } + + // rjf: find addr table + { + DW2_Attrib *loclist_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_LocListsBase); + U64 loclist_base_off = loclist_base_off_attrib->val.u128.u64[0]; + U64 loclist_table_num = rng1u64_array_num_from_value__binary_search(&loclist_tables_ranges_array, loclist_base_off); + if(0 < loclist_table_num && loclist_table_num <= loclist_tables_ranges_array.count) + { + DW2_OffsetTable *table = &loclists_tables[loclist_table_num-1]; + unit_parse_ctxs[unit_idx].loclists_table = table; + } + } } } lane_sync(); @@ -1742,17 +1762,17 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // For example lets take following decl: // // int (*foo[2])[3]; - // + // // This compiles to in DWARF: - // + // // foo -> DW_TAG_ArrayType -> (A0) DW_TAG_Subrange [2] // \ // -> (B0) DW_TAG_PointerType -> (A1) DW_TAG_ArrayType -> DW_TAG_Subrange [3] // \ // -> (B1) DW_TAG_BaseType (int) - // + // // RDI expects: - // + // // foo -> Array[2] -> Pointer -> Array[3] -> int // // Note that DWARF forks the graph on DW_TAG_ArrayType to describe array ranges in branch A and @@ -1786,7 +1806,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { // rjf: if this type has a higher chain count than the current, // but it is lower than our next maximum chain count, collect it, - // so we will hit + // so we will hit // // if this type has a lower chain count than the current, // we should've already built it from a previous pass. @@ -2309,8 +2329,16 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: gather contiguous range from low-pc / high-pc attribute if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) { - U64 voff_base = lopc_attrib->val.u128.u64[0] - base_vaddr; - U64 voff_opl = hipc_attrib->val.u128.u64[0] - base_vaddr; + U64 voff_base = lopc_attrib->val.addr - base_vaddr; + U64 voff_opl = 0; + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, hipc_attrib->val.kind) & (1<val.u128.u64[0]; + } + else + { + voff_opl = hipc_attrib->val.addr; + } rdim_rng1u64_chunk_list_push(arena, &unit_voff_ranges, 256, (RDIM_Rng1U64){voff_base, voff_opl}); } } @@ -2329,32 +2357,814 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //- rjf: produce all unit symbols + typedef struct D2R2_ScopeNode D2R2_ScopeNode; + struct D2R2_ScopeNode + { + D2R2_ScopeNode *next; + RDIM_Scope *scope; + RDIM_LocationCaseList framebase_location_cases; + }; + D2R2_ScopeNode *top_scope = 0; + D2R2_ScopeNode *free_scope = 0; + U64 chunk_count = 512; for(U64 off = unit_info_tag_range.min; off < unit_info_tag_range.max;) { Temp scratch2 = scratch_begin(&scratch.arena, 1); U64 start_off = off; + //////////////////////// //- rjf: parse tag + // DW2_Tag tag = {0}; off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + //////////////////////// //- rjf: gather attributes from tag + // DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *linkname_attrib = &dw2_attrib_nil; + DW2_Attrib *type_attrib = &dw2_attrib_nil; + DW2_Attrib *inline_attrib = &dw2_attrib_nil; + DW2_Attrib *ranges_attrib = &dw2_attrib_nil; + DW2_Attrib *lopc_attrib = &dw2_attrib_nil; + DW2_Attrib *hipc_attrib = &dw2_attrib_nil; + DW2_Attrib *constval_attrib = &dw2_attrib_nil; + DW2_Attrib *location_attrib = &dw2_attrib_nil; + DW2_Attrib *framebase_attrib = &dw2_attrib_nil; + DW2_Attrib *external_attrib = &dw2_attrib_nil; for EachNode(n, DW2_AttribNode, tag.attribs.first) { switch(n->v.attrib_kind) { default:{}break; #define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break - Case(name, Name); + Case(name, Name); + Case(linkname, LinkageName); + Case(type, Type); + Case(inline, Inline); + Case(ranges, Ranges); + Case(lopc, LowPc); + Case(hipc, HighPc); + Case(constval, ConstValue); + Case(location, Location); + Case(framebase, FrameBase); + Case(external, External); #undef Case } } - //- rjf: unpack attributes + //////////////////////// + //- rjf: unpack basic attributes + // String8 name = name_attrib->val.string; + String8 link_name = linkname_attrib->val.string; + DW_InlKind inl_kind = (DW_InlKind)inline_attrib->val.u128.u64[0]; + B32 is_external = (external_attrib != &dw2_attrib_nil); + //////////////////////// + //- rjf: unpack ranges + // + RDIM_Rng1U64List ranges = {0}; + { + if(ranges_attrib != &dw2_attrib_nil) + { + Temp temp = temp_begin(scratch2.arena); + Rng1U64List tag_ranges = dw2_rnglist_from_form_val(temp.arena, unit_parse_ctx, raw, ranges_attrib->val); + for EachNode(n, Rng1U64Node, tag_ranges.first) + { + rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){.min = n->v.min, .max = n->v.max}); + } + temp_end(temp); + } + if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) + { + U64 voff_base = lopc_attrib->val.addr - base_vaddr; + U64 voff_opl = 0; + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, hipc_attrib->val.kind) & (1<val.u128.u64[0]; + } + else + { + voff_opl = hipc_attrib->val.addr; + } + rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){voff_base, voff_opl}); + } + } + + //////////////////////// + //- rjf: unpack type + // + RDIM_Type *type = 0; + if(type_attrib != &dw2_attrib_nil) + { + // rjf: attrib -> (info_off, unit_idx) + U64 type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + U64 type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); + type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } + + // rjf: (info_off, unit_idx) -> hash + U64 type_hash = 0; + { + UnitTypeMap *type_unit_type_map = &unit_type_maps[type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); + U64 info_off_slot_idx = info_off_hash%type_unit_type_map->slots_count; + for(UnitTypeNode *n = type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == type_info_off) + { + type_hash = n->dst_hash; + break; + } + } + } + + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = type_hash%unique_type_tag_slots_count; + for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == type_hash) + { + type = type_from_idx_map[n->order_idx]; + break; + } + } + } + } + + //////////////////////// + //- rjf: unpack location info + // + RDIM_LocationCaseList location_cases = {0}; + RDIM_LocationCaseList framebase_location_cases = {0}; + B32 location_is_tls_dependent = 0; + B32 framebase_location_is_tls_dependent = 0; + { + struct + { + DW2_Attrib *attrib; + RDIM_LocationCaseList *dst_locations; + B32 *dst_is_tls_dependent; + } + tasks[] = + { + {location_attrib, &location_cases, &location_is_tls_dependent}, + {framebase_attrib, &framebase_location_cases, &framebase_location_is_tls_dependent}, + }; + for EachElement(task_idx, tasks) + { + if(tasks[task_idx].attrib == &dw2_attrib_nil) + { + continue; + } + DW2_Attrib *attrib = tasks[task_idx].attrib; + RDIM_LocationCaseList *dst_locations = tasks[task_idx].dst_locations; + B32 *dst_is_tls_dependent = tasks[task_idx].dst_is_tls_dependent; + + ////////////////////// + //- rjf: gather DWARF location exprs + // + DW2_LocList locs = {0}; + switch(attrib->val.kind) + { + default:{}break; + case DW_Form_ExprLoc: + { + U64 expr_info_off = attrib->val.u128.u64[0]; + U64 expr_info_size = attrib->val.u128.u64[1]; + String8 expr = str8_substr(raw->sec[DW_Section_Info].data, r1u64(expr_info_off, expr_info_off+expr_info_size)); + DW2_LocNode *n = push_array(scratch2.arena, DW2_LocNode, 1); + n->v.expr = expr; + n->v.range = r1u64(0, max_U64); + SLLQueuePush(locs.first, locs.last, n); + locs.count += 1; + }break; + case DW_Form_LocListx: // NOTE(rjf): dwarf5+, loclistx -> location list offset table + case DW_Form_SecOffset: // NOTE(rjf): pre-dwarf5, location section offset -> a location list + { + locs = dw2_loclist_from_form_val(scratch2.arena, unit_parse_ctx, raw, attrib->val); + }break; + } + + ////////////////////// + //- rjf: convert DWARF location exprs -> RDIM locations + // + // we do this for each possible frame base location case - locations in DWARF + // refer to the frame base via a special op. in our case, we want to bake that + // into the location directly to reduce extra context for evaluation. + // + // if we find that a location doesn't rely on the frame base at all, we just + // skip the rest. + // + B32 is_tls_dependent = 0; + for EachNode(n, DW2_LocNode, locs.first) + { + //- rjf: unpack location + Rng1U64 range = n->v.range; + String8 expr = n->v.expr; + + //- rjf: iterate each frame base location case, or once if there are none, + // and convert the location in that context + RDIM_LocationCase nil_framebase_loc_case = {0, {0}, {0, max_U64}}; + for(RDIM_LocationCase *framebase_loc_n = top_scope ? top_scope->framebase_location_cases.first : &nil_framebase_loc_case; + framebase_loc_n != 0; + framebase_loc_n = framebase_loc_n->next) + { + //- rjf: unpack framebase location + RDIM_Location framebase_loc = framebase_loc_n->location; + RDIM_Rng1U64 framebase_voff_range = framebase_loc_n->voff_range; + + //- rjf: set up type stack for type-evaluating bytecode + typedef struct D2R2_ExprVal D2R2_ExprVal; + struct D2R2_ExprVal + { + RDI_TypeKind type_kind; + B32 is_addr; + }; + typedef struct D2R2_ExprValNode D2R2_ExprValNode; + struct D2R2_ExprValNode + { + D2R2_ExprValNode *next; + D2R2_ExprVal v; + }; + D2R2_ExprValNode *val_stack_top = 0; + D2R2_ExprValNode *free_val = 0; + + //- rjf: process DWARF bytecode; produce RDI bytecode + mini-type-info for the expression's result + typedef struct JumpOpNode JumpOpNode; + struct JumpOpNode + { + JumpOpNode *next; + RDIM_EvalBytecodeOp *op; + S64 inst_delta; + }; + JumpOpNode *first_jump_op = 0; + JumpOpNode *last_jump_op = 0; + RDIM_EvalBytecode dst_bytecode = {0}; + B32 dst_bytecode_is_good = 1; + B32 bytecode_is_framebase_dependent = 0; + for(U64 expr_off = 0; expr_off < expr.size;) + { + U64 start_expr_off = expr_off; + + //- rjf: read next opcode + DW_ExprOp opcode = 0; + expr_off += str8_deserial_read_struct(expr, expr_off, &opcode); + + //- rjf: read op operands + U64 operands_count = dw_operand_count_from_expr_op(opcode); + DW_ExprOperandType *operands_types = dw_operand_types_from_expr_opcode(opcode); + U64 operand_u64s[2] = {0}; + S64 operand_s64s[2] = {0}; + String8 operand_str8s[2] = {0}; + for EachIndex(operand_idx, operands_count) + { + switch(operands_types[operand_idx]) + { + case DW_ExprOperandType_Null: + default:{}break; + case DW_ExprOperandType_U8: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 1, 1);}break; + case DW_ExprOperandType_U16: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 2, 2);}break; + case DW_ExprOperandType_U32: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 4, 4);}break; + case DW_ExprOperandType_U64: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 8, 8);}break; + case DW_ExprOperandType_S8: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 1, 1);}break; + case DW_ExprOperandType_S16: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 2, 2);}break; + case DW_ExprOperandType_S32: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 4, 4);}break; + case DW_ExprOperandType_S64: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 8, 8);}break; + case DW_ExprOperandType_ULEB128: {expr_off += str8_deserial_read_uleb128(expr, expr_off, &operand_u64s[operand_idx]);} break; + case DW_ExprOperandType_SLEB128: {expr_off += str8_deserial_read_sleb128(expr, expr_off, &operand_s64s[operand_idx]);} break; + case DW_ExprOperandType_Addr: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], unit_parse_ctx->addr_size, unit_parse_ctx->addr_size);}break; + case DW_ExprOperandType_DwarfUInt: {expr_off += dw2_read_fmt_u64(expr, expr_off, unit_parse_ctx->format, &operand_u64s[operand_idx]);}break; + case DW_ExprOperandType_Block: + { + U8 block_size = 0; + expr_off += str8_deserial_read_struct(expr, expr_off, &block_size); + operand_str8s[operand_idx] = str8_substr(expr, r1u64(expr_off, expr_off+block_size)); + expr_off += block_size; + }break; + } + } + + //- rjf: pop stack values + D2R2_ExprVal popped_vals[2] = {0}; + { + U64 pop_count = dw_pop_count_from_expr_op(opcode); + pop_count = Min(pop_count, ArrayCount(popped_vals)); + for EachIndex(pop_idx, pop_count) + { + if(val_stack_top != 0) + { + D2R2_ExprValNode *popped = val_stack_top; + popped_vals[pop_idx] = popped->v; + SLLStackPop(val_stack_top); + SLLStackPush(free_val, popped); + } + } + } + + //- rjf: exec op (produce RDI bytecode, + manipulate value stack) + D2R2_ExprVal push_vals[2] = {0}; + U64 regcode_dw = 0; + S64 regval_off = 0; + B32 regread_is_addr = 0; + U64 target_pick_val_idx = 0; + RDI_EvalOp rdi_eval_op = 0; + U64 memread_size = 0; + switch(opcode) + { + default:{}break; + + //- rjf: small opcode-embedded unsigned literals + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: + { + U64 lit_val = (U64)(opcode - DW_ExprOp_Lit0); + rdim_bytecode_push_uconst(arena, &dst_bytecode, lit_val); + }break; + + //- rjf: small unsigned literals + case DW_ExprOp_Const1U: push_vals[0].type_kind = RDI_TypeKind_U8; goto const_u; + case DW_ExprOp_Const2U: push_vals[0].type_kind = RDI_TypeKind_U16; goto const_u; + case DW_ExprOp_Const4U: push_vals[0].type_kind = RDI_TypeKind_U32; goto const_u; + case DW_ExprOp_Const8U: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; + case DW_ExprOp_ConstU: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; + const_u:; + { + rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); + }break; + + //- rjf: small signed literals + case DW_ExprOp_Const1S: push_vals[0].type_kind = RDI_TypeKind_S8; goto const_s; + case DW_ExprOp_Const2S: push_vals[0].type_kind = RDI_TypeKind_S16; goto const_s; + case DW_ExprOp_Const4S: push_vals[0].type_kind = RDI_TypeKind_S32; goto const_s; + case DW_ExprOp_Const8S: push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; + case DW_ExprOp_ConstS : push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; + const_s:; + { + rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); + }break; + + //- rjf: address (module offsets) + case DW_ExprOp_Addr: + { + U64 voff = operand_u64s[0] - base_vaddr; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + }break; + case DW_ExprOp_Addrx: + if(unit_parse_ctx->addr_table != 0) + { + U64 addr_idx = operand_u64s[0]; + U64 addr = 0; + if(dw2_try_offset_from_table_idx(unit_parse_ctx->addr_table, addr_idx, &addr)) + { + U64 voff = (addr > base_vaddr) ? (addr - base_vaddr) : 0; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + } + }break; + + //- rjf: register reads + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + { + regcode_dw = (U64)(opcode - DW_ExprOp_Reg0); + }goto reg_read; + case DW_ExprOp_RegX: + { + regcode_dw = operand_u64s[0]; + }goto reg_read; + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + { + regcode_dw = (U64)(opcode - DW_ExprOp_BReg0); + regval_off = operand_s64s[1]; + regread_is_addr = 1; + }goto reg_read; + case DW_ExprOp_BRegX: + { + regcode_dw = operand_u64s[0]; + regval_off = operand_s64s[1]; + regread_is_addr = 1; + }goto reg_read; + reg_read:; + { + // rjf: DWARF regcode -> RDI, off, size + RDI_RegCode regcode_rdi = 0; + U64 reg_off = 0; + U64 reg_size = 0; + switch((Arch)arch) + { + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm32: + case Arch_arm64: + case Arch_x86: + { + // TODO(rjf): unsupported architectures + }break; + case Arch_x64: + { + switch(regcode_dw) + { + default:{}break; +#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw:{regcode_rdi = RDI_RegCodeX64_##reg_rdi; reg_off = (off); reg_size = (size);}break; + DW_Regs_X64_XList +#undef X + } + }break; + } + + // rjf: push op + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_RegRead, RDI_EncodeRegReadParam(regcode_rdi, reg_size, reg_off)); + + // rjf: push add to value offset, if needed + if(regval_off != 0) + { + rdim_bytecode_push_sconst(arena, &dst_bytecode, regval_off); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); + } + + // rjf: choose if we're doing a float op + B32 is_float_op = 0; + if(arch == Arch_x64 && + (regcode_rdi == RDI_RegCodeX64_st0 || + regcode_rdi == RDI_RegCodeX64_st1 || + regcode_rdi == RDI_RegCodeX64_st2 || + regcode_rdi == RDI_RegCodeX64_st3 || + regcode_rdi == RDI_RegCodeX64_st4 || + regcode_rdi == RDI_RegCodeX64_st5 || + regcode_rdi == RDI_RegCodeX64_st6 || + regcode_rdi == RDI_RegCodeX64_st7)) + { + is_float_op = 1; + } + + // rjf: set up push value + push_vals[0].is_addr = regread_is_addr; + if(is_float_op) + { + switch(reg_size) + { + default:{}break; + case 2: {push_vals[0].type_kind = RDI_TypeKind_F16;}break; + case 4: {push_vals[0].type_kind = RDI_TypeKind_F32;}break; + case 6: {push_vals[0].type_kind = RDI_TypeKind_F48;}break; + case 8: {push_vals[0].type_kind = RDI_TypeKind_F64;}break; + case 10:{push_vals[0].type_kind = RDI_TypeKind_F80;}break; + case 12:{push_vals[0].type_kind = RDI_TypeKind_F96;}break; + case 16:{push_vals[0].type_kind = RDI_TypeKind_F128;}break; + } + } + else + { + switch(reg_size) + { + default:{}break; + case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; + case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; + case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; + case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; + } + } + }break; + + //- rjf: implicit values + case DW_ExprOp_ImplicitValue: + { + if(operand_str8s[0].size <= sizeof(U64)) + { + U64 implicit_value = 0; + MemoryCopy(&implicit_value, operand_str8s[0].str, Min(sizeof(U64), operand_str8s[0].size)); + rdim_bytecode_push_uconst(arena, &dst_bytecode, implicit_value); + switch(operand_str8s[0].size) + { + default:{}break; + case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; + case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; + case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; + case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; + } + } + else + { + log_infof("[.debug_info@0x%I64x] Implicit value DWARF expression operation (DW_ExprOp_ImplicitValue) with block size >8 (%I64u) found. This is not currently supported.\n", start_off, operand_str8s[0].size); + } + }break; + + //- rjf: pieces + case DW_ExprOp_Piece: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValue, operand_u64s[0]); + }break; + case DW_ExprOp_BitPiece: + { + U64 size = operand_u64s[0]; + U64 off = operand_u64s[1]; + U64 partial_value = ((size<<32)|(off)); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValueBit, partial_value); + }break; + + //- rjf: stack ops + case DW_ExprOp_Over: {target_pick_val_idx = 1;}goto pick; + case DW_ExprOp_Pick: {target_pick_val_idx = operand_u64s[0];}goto pick; + case DW_ExprOp_Dup: {target_pick_val_idx = 0;}goto pick; + pick:; + { + // rjf: pick value from stack + D2R2_ExprVal picked_val = {0}; + { + U64 idx = 0; + for(D2R2_ExprValNode *n = val_stack_top; n != 0; n = n->next) + { + if(idx == target_pick_val_idx) + { + picked_val = n->v; + break; + } + } + } + + // rjf: push opcode + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pick, target_pick_val_idx); + + // rjf: push val + push_vals[0] = picked_val; + }break; + case DW_ExprOp_Swap: + { + push_vals[0] = popped_vals[1]; + push_vals[1] = popped_vals[0]; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Swap, 0); + }break; + case DW_ExprOp_Drop: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pop, 0); + }break; + + //- rjf: jumps + case DW_ExprOp_Skip: rdi_eval_op = RDI_EvalOp_Skip; goto jumps; + case DW_ExprOp_Bra: rdi_eval_op = RDI_EvalOp_Cond; goto jumps; + jumps:; + { + // rjf: jump delta in bytes (how the instruction is encoded) -> jump delta in instructions + S64 jump_delta_bytes = operand_s64s[0]; + S64 jump_delta_insts = 0; + { + // TODO(rjf): expr op jumps bytes -> inst counts + } + + // rjf: push incomplete op (we need to resolve inst delta -> byte delta later, once we have the full bytecode stream) + RDIM_EvalBytecodeOp *op = rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, 0); + + // rjf: gather op + JumpOpNode *n = push_array(scratch2.arena, JumpOpNode, 1); + SLLQueuePush(first_jump_op, last_jump_op, n); + n->op = op; + n->inst_delta = jump_delta_insts; + }break; + + //- rjf: containing procedure frame offsets + case DW_ExprOp_FBReg: + { + bytecode_is_framebase_dependent = 1; + for EachNode(n, RDIM_EvalBytecodeOp, framebase_loc.bytecode.first_op) + { + rdim_bytecode_push_op(arena, &dst_bytecode, n->op, n->p); + } + rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + }break; + + //- rjf: memory reads + case DW_ExprOp_Deref: memread_size = unit_parse_ctx->addr_size; goto deref; + case DW_ExprOp_DerefSize: memread_size = operand_u64s[0]; goto deref; + deref:; + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_MemRead, memread_size); + push_vals[0].is_addr = 1; + push_vals[0].type_kind = RDI_TypeKind_U64; + }break; + + //- rjf: TLS offsets + case DW_ExprOp_FormTlsAddress: + case DW_ExprOp_GNU_PushTlsAddress: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_TLSOff, 0); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); + push_vals[0].is_addr = 1; + push_vals[0].type_kind = RDI_TypeKind_U64; + is_tls_dependent = 1; + }break; + + //- rjf: call site value + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: + { + // TODO(rjf): expr op entry value ops + }break; + + //- rjf: fixed adds + case DW_ExprOp_PlusUConst: + { + rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); + push_vals[0].type_kind = RDI_TypeKind_U64; // TODO(rjf): do we need to adjust this based on popped value at all, even? + }break; + + //- rjf: arithmetic ops + case DW_ExprOp_Eq: {rdi_eval_op = RDI_EvalOp_EqEq;}goto arithmetic_op; + case DW_ExprOp_Ge: {rdi_eval_op = RDI_EvalOp_GrEq;}goto arithmetic_op; + case DW_ExprOp_Gt: {rdi_eval_op = RDI_EvalOp_Grtr;}goto arithmetic_op; + case DW_ExprOp_Le: {rdi_eval_op = RDI_EvalOp_LsEq;}goto arithmetic_op; + case DW_ExprOp_Lt: {rdi_eval_op = RDI_EvalOp_Less;}goto arithmetic_op; + case DW_ExprOp_Ne: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; + case DW_ExprOp_Div: {rdi_eval_op = RDI_EvalOp_Div;}goto arithmetic_op; + case DW_ExprOp_Minus: {rdi_eval_op = RDI_EvalOp_Sub;}goto arithmetic_op; + case DW_ExprOp_Mul: {rdi_eval_op = RDI_EvalOp_Mul;}goto arithmetic_op; + case DW_ExprOp_Plus: {rdi_eval_op = RDI_EvalOp_Add;}goto arithmetic_op; + case DW_ExprOp_Xor: {rdi_eval_op = RDI_EvalOp_BitXor;}goto arithmetic_op; + case DW_ExprOp_And: {rdi_eval_op = RDI_EvalOp_BitAnd;}goto arithmetic_op; + case DW_ExprOp_Or: {rdi_eval_op = RDI_EvalOp_BitOr;}goto arithmetic_op; + case DW_ExprOp_Shl: {rdi_eval_op = RDI_EvalOp_LShift;}goto arithmetic_op; + case DW_ExprOp_Shr: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; + case DW_ExprOp_Shra: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; + case DW_ExprOp_Mod: {rdi_eval_op = RDI_EvalOp_Mod;}goto arithmetic_op; + case DW_ExprOp_Abs: {rdi_eval_op = RDI_EvalOp_Abs;}goto arithmetic_op; + case DW_ExprOp_Neg: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; + case DW_ExprOp_Not: {rdi_eval_op = RDI_EvalOp_LogNot;}goto arithmetic_op; + arithmetic_op:; + { + // TODO(rjf): eval arithmetic conversions etc. + rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, RDI_EvalTypeGroup_U); + }break; + + //- rjf: currently unsupported + case DW_ExprOp_XDeref: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression XDeref operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_XDerefSize: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression XDerefSize operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression call operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_ImplicitPointer: + case DW_ExprOp_GNU_ImplicitPointer: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression implicit pointer operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_GNU_ParameterRef: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression GNU_ParameterRef operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_DerefType: + case DW_ExprOp_GNU_DerefType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression DerefType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_ConstType: + case DW_ExprOp_GNU_ConstType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression ConstType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_RegvalType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression RegvalType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_PushObjectAddress: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression PushObjectAddress operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_Rot: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression Rot (rotate) operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_GNU_UnInit: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression GNU_UnInit operation encountered. This is not supported for location info.\n", start_off); + // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; + } break; + } + + //- rjf: push values to stack + { + U64 push_count = dw_push_count_from_expr_op(opcode); + push_count = Min(push_count, ArrayCount(push_vals)); + for EachIndex(push_idx, push_count) + { + D2R2_ExprValNode *n = free_val; + if(n != 0) + { + SLLStackPop(free_val); + } + else + { + n = push_array(scratch2.arena, D2R2_ExprValNode, 1); + } + n->v = push_vals[push_idx]; + SLLStackPush(val_stack_top, n); + } + } + + if(expr_off == start_expr_off) + { + break; + } + } + + //- rjf: apply RDI byte offsets to jump ops + { + // TODO(rjf): apply RDI byte offsets to jump ops + } + + //- rjf: map bytecode -> RDIM_Location - we may want to simplify + RDIM_Location loc = {0}; + { + loc.kind = val_stack_top && val_stack_top->v.is_addr ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; + loc.bytecode = dst_bytecode; + } + + //- rjf: collect + { + RDIM_Rng1U64 voff_range = {range.min - base_vaddr, range.max - base_vaddr}; + if(bytecode_is_framebase_dependent) + { + voff_range.min = Max(voff_range.min, framebase_voff_range.min); + voff_range.max = Min(voff_range.max, framebase_voff_range.max); + } + rdim_location_case_list_push(arena, dst_locations, loc, voff_range); + dst_is_tls_dependent[0] = is_tls_dependent; + } + + //- rjf: not frame-base dependent? -> break - don't do this per-framebase case + if(!bytecode_is_framebase_dependent) + { + break; + } + } + } + } + } + + //////////////////////// //- rjf: produce symbols from tag + // + RDIM_Scope *new_scope_open = 0; switch(tag.kind) { default:{}break; @@ -2362,8 +3172,15 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: subprograms (procedures) case DW_TagKind_SubProgram: { - RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_unit->procedures, 512); + RDIM_Scope *root_scope = rdim_scope_chunk_list_push(arena, &dst_unit->scopes, chunk_count); + RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_unit->procedures, chunk_count); procedure->name = name; + procedure->link_name = link_name; + procedure->root_scope = root_scope; + root_scope->symbol = procedure; + root_scope->voff_ranges = ranges; + dst_unit->scopes.scope_voff_count += 2; + new_scope_open = root_scope; }break; //- rjf: inline site @@ -2375,17 +3192,90 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: variables case DW_TagKind_Variable: case DW_TagKind_FormalParameter: + if(name.size != 0) { - + U64 var_chunk_count = chunk_count; + RDIM_SymbolChunkList *dst_symbols = &dst_unit->global_variables; + if(location_is_tls_dependent) + { + dst_symbols = &dst_unit->thread_variables; + } + else if(top_scope != 0) + { + dst_symbols = &top_scope->scope->locals; + var_chunk_count = 8; + } + RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, dst_symbols, var_chunk_count); + var->is_extern = is_external; + var->is_param = (tag.kind == DW_TagKind_FormalParameter); + var->name = name; + var->link_name = link_name; + var->type = type; + if(top_scope != 0) + { + var->container_scope = top_scope->scope; + } + var->location_cases = location_cases; }break; //- rjf: lexical blocks (scopes) case DW_TagKind_LexicalBlock: { - + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &dst_unit->scopes, chunk_count); + scope->voff_ranges = ranges; + new_scope_open = scope; }break; } + //////////////////////// + //- rjf: push scopes + // + if(new_scope_open) + { + // rjf: insert scope to parent + if(top_scope != 0) + { + RDIM_Scope *parent = top_scope->scope; + SLLQueuePush_N(parent->first_child, parent->last_child, new_scope_open, next_sibling); + new_scope_open->parent_scope = parent; + if(new_scope_open->symbol == 0) + { + new_scope_open->symbol = parent->symbol; + } + } + + // rjf: push new scope to stack + D2R2_ScopeNode *n = free_scope; + if(n != 0) + { + SLLStackPop(free_scope); + } + else + { + n = push_array(scratch.arena, D2R2_ScopeNode, 1); + } + n->scope = new_scope_open; + if(framebase_attrib != &dw2_attrib_nil) + { + n->framebase_location_cases = framebase_location_cases; + } + else if(top_scope != 0) + { + n->framebase_location_cases = top_scope->framebase_location_cases; + } + SLLStackPush(top_scope, n); + } + + //////////////////////// + //- rjf: pop scopes + // + if(tag.kind == DW_TagKind_Null && top_scope != 0) + { + D2R2_ScopeNode *n = top_scope; + SLLStackPop(top_scope); + SLLStackPush(free_scope, n); + } + scratch_end(scratch2); if(off == start_off) { @@ -2402,7 +3292,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { result.subset_flags = params->subset_flags; result.top_level_info = top_level_info; - // TODO(rjf): result.binary_sections = *binary_sections; + result.binary_sections = binary_sections; result.units = *all_units; result.types = *all_types; result.src_files = *all_src_files; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index aefaad9e..d4c9bc8f 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -325,13 +325,13 @@ p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code { if(extra_indirection) { - result.kind = RDI_LocationKind_AddrAddrRegPlusU16; + result.kind = RDI_LocationKind_AddrAddrRegPlusOff; result.reg_code = reg_code; result.offset = offset; } else { - result.kind = RDI_LocationKind_AddrRegPlusU16; + result.kind = RDI_LocationKind_AddrRegPlusOff; result.reg_code = reg_code; result.offset = offset; } diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index c51d452f..b2d1c063 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3380,8 +3380,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) switch(src_loc->kind) { default:{}break; - case RDI_LocationKind_AddrRegPlusU16: - case RDI_LocationKind_AddrAddrRegPlusU16: + case RDI_LocationKind_AddrRegPlusOff: + case RDI_LocationKind_AddrAddrRegPlusOff: { dst_loc[0] |= ((U64)src_loc->reg_code << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask; dst_loc[0] |= ((U64)src_loc->offset << RDI_Location_RegOffShift) & RDI_Location_RegOffMask; From 230b004742da8afe989a4009272cf06a135d9ea6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 29 Apr 2026 15:50:31 -0700 Subject: [PATCH 474/850] d2r2: function type info; fix reg+off location info for signed offsets, function type deduplicating / construction / referencing, etc. --- src/lib_rdi/rdi.h | 2 +- src/radbin/radbin.c | 4 +- src/raddbg/raddbg_main.c | 6 +- src/rdi/rdi.mdesk | 2 +- src/rdi/rdi_local.c | 2 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 404 +++++++++++++++++++++++--- 6 files changed, 368 insertions(+), 52 deletions(-) diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index e14fa37c..db869bd3 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -1121,7 +1121,7 @@ typedef RDI_U64 RDI_Location; #define RDI_Location_RegOffShift 32 #define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift)) #define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0) -#define rdi_regoff_from_location(l) (RDI_S64)((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) +#define rdi_regoff_from_location(l) (RDI_S64)(RDI_S32)(RDI_S16)((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) #define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) #define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 58f12f14..2f59204f 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -956,8 +956,8 @@ rb_thread_entry_point(void *p) { bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); - rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); - // rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); + // rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); + rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) { rdim_bake_params_concat_in_place(bake_params, &n->v); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index afc4efb5..c8fb7153 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -44,9 +44,9 @@ // [x] container can also be a unit, so you can also go from procedure/global/tvar -> unit // [x] *OR*, because we can guarantee that the units themselves will be sorted from lowest -> highest in all symbol tables, we can simply binary search the unit table (small) with a symbol's index to find its corresponding unit. that way, no need to duplicate e.g. namespaces and so on across units. and actually, we have to do this, because containers can be types, and those cannot be unit-locked. // -// [ ] symbols only store their *partly-qualified name*, e.g. `x` for A::B::C::x -// [ ] default name maps look up *partly-qualified names* -// [ ] to match a *fully qualified name*, there needs to be a second kind of different lookup - instead of string-matching, we need to match against the *fully qualified names*. the maps must be built by hashing the *fully qualified name*, but redirecting to the symbol with the *partially qualified name*. this is to allow fully-qualified lookups, but avoid storing fully-qualified names. +// [x] symbols only store their *partly-qualified name*, e.g. `x` for A::B::C::x +// [x] default name maps look up *partly-qualified names* +// [x] to match a *fully qualified name*, there needs to be a second kind of different lookup - instead of string-matching, we need to match against the *fully qualified names*. the maps must be built by hashing the *fully qualified name*, but redirecting to the symbol with the *partially qualified name*. this is to allow fully-qualified lookups, but avoid storing fully-qualified names. // //- urgent fixes // [ ] (use msvc assert as an example) show fastfail exception info (code, name, etc.) - comes from ExceptionInformation @fastfail diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 16b733aa..4952cf50 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1116,7 +1116,7 @@ RDI_LocationSetElementMemberTable: `#define RDI_Location_RegOffShift 32`; `#define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift))`; `#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0)`; - `#define rdi_regoff_from_location(l) (RDI_S64)((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0)`; + `#define rdi_regoff_from_location(l) (RDI_S64)(RDI_S32)(RDI_S16)((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0)`; `#define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; `#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0)`; diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 6f4bf48a..2fbe99cc 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1073,7 +1073,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse S64 reg_off = rdi_regoff_from_location(location); String8 reg_code_string = rdi_string_from_reg_code(scratch.arena, tli->arch, reg_code); dumpf(" reg: %S\n", reg_code_string); - dumpf(" reg_off: 0x%I64x\n", reg_off); + dumpf(" reg_off: %I64d (0x%x)\n", reg_off, (U16)reg_off); }break; case RDI_LocationKind_ValReg: { diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index f0073947..148d711d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1377,6 +1377,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Tag tag = {0}; t_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, t_off, &tag); + // rjf: determine if tag should be skipped + B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || + tag.kind == DW_TagKind_Variable); + // rjf: record top-level info about this tag tree if(t_start_off == t->off && t == &start_task) { @@ -1388,6 +1392,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) tag.kind == DW_TagKind_StringType || tag.kind == DW_TagKind_StructureType || tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_SubProgram || tag.kind == DW_TagKind_Typedef || tag.kind == DW_TagKind_UnionType || tag.kind == DW_TagKind_PtrToMemberType || @@ -1409,7 +1414,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: is type -> combine tag's content into hash - if(is_type_tag_tree) + if(!should_skip_tag && is_type_tag_tree) { // rjf: combine tag's kind hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); @@ -1427,7 +1432,18 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) n->v.val.kind != DW_Form_Ref8 && n->v.val.kind != DW_Form_RefUData && n->v.val.kind != DW_Form_RefSup4 && - n->v.val.kind != DW_Form_RefSig8) + n->v.val.kind != DW_Form_RefSig8 && + ((tag.kind != DW_TagKind_SubProgram && + tag.kind != DW_TagKind_FormalParameter) || + (n->v.attrib_kind != DW_AttribKind_Name && + n->v.attrib_kind != DW_AttribKind_DeclFile && + n->v.attrib_kind != DW_AttribKind_DeclLine && + n->v.attrib_kind != DW_AttribKind_Prototyped && + n->v.attrib_kind != DW_AttribKind_External && + n->v.attrib_kind != DW_AttribKind_FrameBase && + n->v.attrib_kind != DW_AttribKind_Location && + n->v.attrib_kind != DW_AttribKind_LowPc && + n->v.attrib_kind != DW_AttribKind_HighPc))) { hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); @@ -1638,26 +1654,40 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) TypeDepChain *next; U64 type_idx; }; - TypeDepChain **type_dep_chains = 0; U64 *type_dep_chains_counts = 0; ProfScope("gather per-type dependency chains") { if(lane_idx() == 0) { - type_dep_chains = push_array(scratch.arena, TypeDepChain *, type_count); type_dep_chains_counts = push_array(scratch.arena, U64, type_count); } - lane_sync_u64(&type_dep_chains, 0); lane_sync_u64(&type_dep_chains_counts, 0); Rng1U64 range = lane_range(type_count); for EachInRange(root_type_idx, range) { - for(U64 hash = type_tag_nodes[root_type_idx]->hash, next_hash = 0; - hash != 0; - hash = next_hash) + typedef struct TypeChainTask TypeChainTask; + struct TypeChainTask + { + TypeChainTask *next; + U64 hash; + }; + TypeChainTask start_task = {0, type_tag_nodes[root_type_idx]->hash}; + TypeChainTask *top_task = &start_task; + TypeChainTask *free_task = 0; + TypeChainTask *last_t = 0; + for(TypeChainTask *t = top_task; t != 0; (last_t = t, t = t->next)) { Temp scratch2 = scratch_begin(&scratch.arena, 1); + // rjf: recycle old tasks + if(last_t != 0) + { + SLLStackPush(free_task, last_t); + } + + // rjf: unpack task + U64 hash = t->hash; + // rjf: hash -> unique type tag node UniqueTypeTagNode *type_tag_node = 0; { @@ -1681,12 +1711,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) unit_idx = type_tag_node->unit_idx; } - // rjf: record this type in the dependency chain + // rjf: record this type in the dependency chain count if(type_tag_node != 0) { - TypeDepChain *c = push_array(scratch.arena, TypeDepChain, 1); - c->type_idx = type_tag_node->order_idx; - SLLStackPush(type_dep_chains[root_type_idx], c); type_dep_chains_counts[root_type_idx] += 1; } @@ -1695,12 +1722,20 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; // rjf: parse this type's tag + U64 read_off = info_off; DW2_Tag tag = {0}; - dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + read_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, read_off, &tag); - // rjf: find direct type, if one exists - U64 direct_type_info_off = 0; - U64 direct_type_unit_idx = 0; + // rjf: find direct types from this type tag + typedef struct DirectTypeNode DirectTypeNode; + struct DirectTypeNode + { + DirectTypeNode *next; + U64 info_off; + U64 unit_idx; + }; + DirectTypeNode *first_direct_type = 0; + DirectTypeNode *last_direct_type = 0; switch(tag.kind) { default:{}break; @@ -1713,40 +1748,116 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) case DW_TagKind_ArrayType: case DW_TagKind_SubrangeType: case DW_TagKind_Typedef: + case DW_TagKind_SubProgram: + case DW_TagKind_SubroutineType: { - DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); - direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - direct_type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) + // rjf: gather direct type { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); - if(0 < new_unit_num && new_unit_num <= unit_count) + DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); + U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + U64 direct_type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) { - direct_type_unit_idx = new_unit_num-1; + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + direct_type_unit_idx = new_unit_num-1; + } + } + DirectTypeNode *n = push_array(scratch2.arena, DirectTypeNode, 1); + n->info_off = direct_type_info_off; + n->unit_idx = direct_type_unit_idx; + SLLQueuePush(first_direct_type, last_direct_type, n); + } + + // rjf: functions -> gather parameters + if(tag.has_children && (tag.kind == DW_TagKind_SubProgram || tag.kind == DW_TagKind_SubroutineType)) + { + S64 depth = 1; + for(;depth > 0 && contains_1u64(unit_info_tag_range, read_off);) + { + U64 start_read_off = read_off; + + // rjf: read child tag + DW2_Tag child_tag = {0}; + read_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, read_off, &child_tag); + + // rjf: formal parameters -> gather direct types + if(child_tag.kind == DW_TagKind_FormalParameter) + { + DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); + U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + U64 direct_type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + direct_type_unit_idx = new_unit_num-1; + } + } + DirectTypeNode *n = push_array(scratch2.arena, DirectTypeNode, 1); + n->info_off = direct_type_info_off; + n->unit_idx = direct_type_unit_idx; + SLLQueuePush(first_direct_type, last_direct_type, n); + } + + // rjf: tree navigations + if(tag.has_children) + { + depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + + if(read_off == start_read_off) + { + break; + } } } }break; } - // rjf: look up hash for direct type - U64 direct_type_hash = 0; + // rjf: for each dependency type, look up their hash, + spawn new tasks for them + for EachNode(n, DirectTypeNode, first_direct_type) { - U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); - U64 off_slot_idx = off_hash%unit_type_maps[direct_type_unit_idx].slots_count; - for(UnitTypeNode *n = unit_type_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) + U64 direct_type_info_off = n->info_off; + U64 direct_type_unit_idx = n->unit_idx; + + // rjf: direct type info offset -> hash + U64 direct_type_hash = 0; { - if(n->src_info_off == direct_type_info_off) + U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); + U64 off_slot_idx = off_hash%unit_type_maps[direct_type_unit_idx].slots_count; + for(UnitTypeNode *n = unit_type_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) { - direct_type_hash = n->dst_hash; - break; + if(n->src_info_off == direct_type_info_off) + { + direct_type_hash = n->dst_hash; + break; + } } } + + // rjf: spawn task + TypeChainTask *new_task = free_task; + if(new_task != 0) + { + SLLStackPop(free_task); + } + else + { + new_task = push_array(scratch.arena, TypeChainTask, 1); + } + new_task->hash = direct_type_hash; + t->next = new_task; } - // rjf: iterate to direct type's hash - next_hash = direct_type_hash; - scratch_end(scratch2); } } @@ -1940,9 +2051,116 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) dst_type->direct_type = direct_type; dst_type->byte_size = (direct_type != 0 ? direct_type->byte_size : bitsize/8); }break; + case DW_TagKind_SubProgram: case DW_TagKind_SubroutineType: { + // rjf: build type + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = RDI_TypeKind_Function; + dst_type->name = name; + dst_type->direct_type = direct_type; + dst_type->byte_size = arch_addr_size; + // rjf: gather all parameter types + typedef struct ParamNode ParamNode; + struct ParamNode + { + ParamNode *next; + U64 type_unit_idx; + U64 type_info_off; + }; + ParamNode *first_param = 0; + ParamNode *last_param = 0; + U64 param_count = 0; + { + U64 tag_children_off = info_off + tag_info_size; + S64 depth = 1; + for(U64 off = tag_children_off; depth > 0 && contains_1u64(unit_info_tag_range, off);) + { + U64 start_off = off; + + // rjf: read child tag + DW2_Tag child_tag = {0}; + off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &child_tag); + + // rjf: gather parameters + if(child_tag.kind == DW_TagKind_FormalParameter) + { + DW2_Attrib *type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); + ParamNode *n = push_array(scratch2.arena, ParamNode, 1); + n->type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + n->type_unit_idx = unit_idx; + SLLQueuePush(first_param, last_param, n); + if(!contains_1u64(unit_info_tag_range, n->type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, n->type_info_off); + n->type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } + param_count += 1; + } + + // rjf: navigate tree + if(child_tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + if(child_tag.has_children) + { + depth += 1; + } + + if(off == start_off) + { + break; + } + } + } + + // rjf: tighten parameter types + dst_type->count = (RDI_U32)param_count; // TODO(rjf): @u64_to_u32 + dst_type->param_types = push_array(arena, RDIM_Type *, dst_type->count); + { + U64 param_idx = 0; + for(ParamNode *n = first_param; n != 0; n = n->next, param_idx += 1) + { + U64 param_type_info_off = n->type_info_off; + U64 param_type_unit_idx = n->type_unit_idx; + + // rjf: map info_off/unit_idx -> hash + U64 param_type_hash = 0; + { + UnitTypeMap *direct_type_unit_type_map = &unit_type_maps[param_type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(¶m_type_info_off)); + U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; + for(UnitTypeNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == param_type_info_off) + { + param_type_hash = n->dst_hash; + break; + } + } + } + + // rjf: map hash -> type + RDIM_Type *param_type = 0; + { + U64 unique_type_tag_slot_idx = param_type_hash%unique_type_tag_slots_count; + for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == param_type_hash) + { + param_type = type_from_idx_map[n->order_idx]; + break; + } + } + } + + // rjf: store + dst_type->param_types[param_idx] = param_type; + } + } }break; case DW_TagKind_Typedef: { @@ -2458,14 +2676,23 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_Type *type = 0; if(type_attrib != &dw2_attrib_nil) { - // rjf: attrib -> (info_off, unit_idx) - U64 type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + // rjf: functions need to get their type info from themselves; the type attrib + // only references the return type. so, in that case, we'll use the procedure's + // own info offset / unit index, rather than the type attribute's. + U64 type_info_off = start_off; U64 type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, type_info_off)) + + // rjf: attrib -> (info_off, unit_idx) + if(tag.kind != DW_TagKind_SubProgram) { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); - type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); + type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } } // rjf: (info_off, unit_idx) -> hash @@ -3137,6 +3364,93 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { loc.kind = val_stack_top && val_stack_top->v.is_addr ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; loc.bytecode = dst_bytecode; + + // rjf: gather first few bytecodes for pattern matching + RDI_EvalOp beginning_ops[5] = {0}; + RDIM_EvalBytecodeOp *beginning_nodes[5] = {0}; + { + U64 idx = 0; + for EachNode(n, RDIM_EvalBytecodeOp, dst_bytecode.first_op) + { + if(idx >= ArrayCount(beginning_ops)) + { + break; + } + beginning_ops[idx] = n->op; + beginning_nodes[idx] = n; + idx += 1; + } + } + + // rjf: match simple register offsets + if(loc.kind == RDI_LocationKind_AddrBytecodeStream && + beginning_ops[0] == RDI_EvalOp_RegRead && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16) && + beginning_ops[2] == RDI_EvalOp_TruncSigned && + beginning_ops[3] == RDI_EvalOp_Add && + beginning_ops[4] == RDI_EvalOp_Stop) + { + U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; + U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; + U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; + if(byte_off == 0 && byte_size == unit_parse_ctx->addr_size) + { + loc.kind = RDI_LocationKind_AddrRegPlusOff; + loc.reg_code = rdi_reg_code; + loc.offset = beginning_nodes[1]->p; + } + } + + // rjf: match simple module offsets + if(beginning_ops[0] == RDI_EvalOp_ModuleOff && beginning_ops[1] == RDI_EvalOp_Stop) + { + U64 voff = beginning_nodes[0]->p; + loc.kind = RDI_LocationKind_ModuleOff; + loc.offset = voff; + } + else if(((beginning_ops[0] == RDI_EvalOp_ModuleOff && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16 || + beginning_ops[1] == RDI_EvalOp_ConstU32 || + beginning_ops[1] == RDI_EvalOp_ConstU64)) || + (beginning_ops[1] == RDI_EvalOp_ModuleOff && + (beginning_ops[0] == RDI_EvalOp_ConstU8 || + beginning_ops[0] == RDI_EvalOp_ConstU16 || + beginning_ops[0] == RDI_EvalOp_ConstU32 || + beginning_ops[0] == RDI_EvalOp_ConstU64))) && + beginning_ops[2] == RDI_EvalOp_Add && + beginning_ops[3] == RDI_EvalOp_Stop) + { + U64 voff = beginning_nodes[0]->p + beginning_nodes[1]->p; + loc.kind = RDI_LocationKind_ModuleOff; + loc.offset = voff; + } + + // rjf: match simple TLS offsets + if(beginning_ops[0] == RDI_EvalOp_TLSOff && beginning_ops[1] == RDI_EvalOp_Stop) + { + U64 toff = beginning_nodes[0]->p; + loc.kind = RDI_LocationKind_TLSOff; + loc.offset = toff; + } + else if(((beginning_ops[0] == RDI_EvalOp_TLSOff && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16 || + beginning_ops[1] == RDI_EvalOp_ConstU32 || + beginning_ops[1] == RDI_EvalOp_ConstU64)) || + (beginning_ops[1] == RDI_EvalOp_TLSOff && + (beginning_ops[0] == RDI_EvalOp_ConstU8 || + beginning_ops[0] == RDI_EvalOp_ConstU16 || + beginning_ops[0] == RDI_EvalOp_ConstU32 || + beginning_ops[0] == RDI_EvalOp_ConstU64))) && + beginning_ops[2] == RDI_EvalOp_Add && + beginning_ops[3] == RDI_EvalOp_Stop) + { + U64 toff = beginning_nodes[0]->p + beginning_nodes[1]->p; + loc.kind = RDI_LocationKind_TLSOff; + loc.offset = toff; + } } //- rjf: collect @@ -3174,9 +3488,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { RDIM_Scope *root_scope = rdim_scope_chunk_list_push(arena, &dst_unit->scopes, chunk_count); RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_unit->procedures, chunk_count); - procedure->name = name; - procedure->link_name = link_name; - procedure->root_scope = root_scope; + procedure->name = name; + procedure->link_name = link_name; + procedure->type = type; + procedure->root_scope = root_scope; + procedure->location_cases = framebase_location_cases; root_scope->symbol = procedure; root_scope->voff_ranges = ranges; dst_unit->scopes.scope_voff_count += 2; From c83c1f3cfd75f16a5c437499921911ab77e4dd2e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 29 Apr 2026 16:27:58 -0700 Subject: [PATCH 475/850] udt conversion --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 187 ++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 148d711d..d2a270b2 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1750,6 +1750,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) case DW_TagKind_Typedef: case DW_TagKind_SubProgram: case DW_TagKind_SubroutineType: + case DW_TagKind_EnumerationType: { // rjf: gather direct type { @@ -2426,6 +2427,191 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync(); + //////////////////////////// + //- rjf: convert all UDTs + // + RDIM_UDTChunkList *all_udts = 0; + ProfScope("convert all UDTs") + { + //- rjf: produce UDTs across all lanes + U64 chunk_count = 512; + RDIM_UDTChunkList lane_udts = {0}; + Rng1U64 range = lane_range(type_count); + for EachInRange(type_idx, range) + { + RDIM_Type *type = type_from_idx_map[type_idx]; + if(type->kind == RDI_TypeKind_Struct || + type->kind == RDI_TypeKind_Union || + type->kind == RDI_TypeKind_Class || + type->kind == RDI_TypeKind_Enum) + { + // rjf: produce UDT + RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &lane_udts, chunk_count); + type->udt = udt; + udt->self_type = type; + + // rjf: idx -> type tag node + UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; + U64 unit_idx = type_tag_node->unit_idx; + U64 info_off = type_tag_node->info_off; + + // rjf: unpack unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + + // rjf: parse all tags + S64 depth = 0; + for(U64 off = info_off; contains_1u64(unit_info_tag_range, off) && (depth > 0 || off == info_off);) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; + + // rjf: parse tag + DW2_Tag tag = {0}; + U64 tag_parse_off = off; + off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + + // rjf: unpack tag attributes + DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *type_attrib = &dw2_attrib_nil; + DW2_Attrib *off_attrib = &dw2_attrib_nil; + DW2_Attrib *val_attrib = &dw2_attrib_nil; + DW2_Attrib *declfile_attrib = &dw2_attrib_nil; + DW2_Attrib *declline_attrib = &dw2_attrib_nil; + DW2_Attrib *declcol_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag.attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break + Case(name, Name); + Case(type, Type); + Case(off, DataMemberLocation); + Case(val, ConstValue); + Case(declfile, DeclFile); + Case(declline, DeclLine); + Case(declcol, DeclColumn); +#undef Case + } + } + + // rjf: unpack basic attributes + String8 name = name_attrib->val.string; + U64 off = off_attrib->val.u128.u64[0]; + U64 val = val_attrib->val.u128.u64[0]; + + // rjf: unpack type + RDIM_Type *type = 0; + { + // rjf: attrib -> info off / unit idx + U64 type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + U64 type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); + type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } + + // rjf: (info_off, unit_idx) -> hash + U64 type_hash = 0; + { + UnitTypeMap *type_unit_type_map = &unit_type_maps[type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); + U64 info_off_slot_idx = info_off_hash%type_unit_type_map->slots_count; + for(UnitTypeNode *n = type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == type_info_off) + { + type_hash = n->dst_hash; + break; + } + } + } + + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = type_hash%unique_type_tag_slots_count; + for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == type_hash) + { + type = type_from_idx_map[n->order_idx]; + break; + } + } + } + } + + // rjf: root-level tag -> collect decl file/line info + if(tag_parse_off == start_off) + { + // TODO(rjf): we need to have gathered the source files before this!!!!!! + // currently, they only come from line info - we need to gather/dedup the + // ones that also come from tags. + } + + // rjf: gather children + switch(tag.kind) + { + default:{}break; + case DW_TagKind_Member: + { + RDIM_UDTMember *member = rdim_udt_push_member(arena, &lane_udts, udt); + member->kind = RDI_MemberKind_DataField; + member->name = name; + member->type = type; + member->off = (RDI_U32)off; // TODO(rjf): @u64_to_u32 + }break; + case DW_TagKind_Enumerator: + { + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, &lane_udts, udt); + enum_val->name = name; + enum_val->val = val; + }break; + } + + // rjf: tree nav + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + if(tag.has_children) + { + depth += 1; + } + + scratch_end(scratch2); + if(off == start_off) + { + break; + } + } + } + } + lane_sync(); + + //- rjf: combine all lanes + RDIM_UDTChunkList *lanes_udts = 0; + if(lane_idx() == 0) + { + lanes_udts = push_array(scratch.arena, RDIM_UDTChunkList, lane_count()); + } + lane_sync_u64(&lanes_udts, 0); + lanes_udts[lane_idx()] = lane_udts; + lane_sync(); + if(lane_idx() == 0) + { + all_udts = push_array(scratch.arena, RDIM_UDTChunkList, 1); + for EachIndex(l_idx, lane_count()) + { + rdim_udt_chunk_list_concat_in_place(all_udts, &lanes_udts[l_idx]); + } + } + lane_sync_u64(&all_udts, 0); + } + //////////////////////////// //- rjf: convert all units / symbols // @@ -3611,6 +3797,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) result.binary_sections = binary_sections; result.units = *all_units; result.types = *all_types; + result.udts = *all_udts; result.src_files = *all_src_files; result.line_tables = *all_line_tables; } From 0e2b37ba3267dd7d17fc8bd5e1e93c96832cba4c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 30 Apr 2026 17:50:53 -0700 Subject: [PATCH 476/850] dwarf: do not crash on unsupported codes; text: do not crash on arena releasing w/ zero hash (#766, #771?, #761) --- project.4coder | 2 +- src/dwarf/dwarf.c | 74 +++++++++++++++++++++++++++------------------ src/radbin/radbin.c | 2 +- src/text/text.c | 2 +- 4 files changed, 47 insertions(+), 33 deletions(-) diff --git a/project.4coder b/project.4coder index 60db8ba5..50d985d6 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin && pushd build && del simple.rdi && del simple.dump && radbin --rdi simple && radbin --dump simple.rdi --out:simple.dump", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin && pushd build && del raddbg.elf.rdi && del raddbg.elf.dump && radbin --rdi ./raddbg --out:raddbg.elf.rdi && radbin --dump raddbg.elf.rdi --out:raddbg.elf.dump", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index acbe4aff..8f0763b9 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -341,7 +341,8 @@ internal U64 dw_pick_default_lower_bound(DW_Language lang) { U64 lower_bound = max_U64; - switch (lang) { + switch(lang) + { case DW_Language_Null: break; case DW_Language_C89: case DW_Language_C: @@ -366,8 +367,9 @@ dw_pick_default_lower_bound(DW_Language lang) case DW_Language_Dylan: case DW_Language_RenderScript: case DW_Language_BLISS: - lower_bound = 0; - break; + { + lower_bound = 0; + }break; case DW_Language_Ada83: case DW_Language_Cobol74: case DW_Language_Cobol85: @@ -382,10 +384,10 @@ dw_pick_default_lower_bound(DW_Language lang) case DW_Language_Julia: case DW_Language_Fortran03: case DW_Language_Fortran08: - lower_bound = 1; - default: - NotImplemented; - break; + { + lower_bound = 1; + }break; + default:{}break; } return lower_bound; } @@ -393,61 +395,69 @@ dw_pick_default_lower_bound(DW_Language lang) internal U64 dw_operand_count_from_expr_op(DW_ExprOp op) { - switch (op) { -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _OPER_COUNT; + U64 result = 0; + switch(op) + { + default:{}break; +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID:{result = _OPER_COUNT;}break; DW_Expr_V3_XList DW_Expr_V4_XList DW_Expr_V5_XList DW_Expr_GNU_XList #undef X - default: { NotImplemented; } break; } - return 0; + return result; } internal U64 dw_pop_count_from_expr_op(DW_ExprOp op) { - switch (op) { -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _POP_COUNT; + U64 result = 0; + switch(op) + { + default:{}break; +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID:{result = _POP_COUNT;}break; DW_Expr_V3_XList DW_Expr_V4_XList DW_Expr_V5_XList DW_Expr_GNU_XList #undef X - default: { NotImplemented; } break; } - return 0; + return result; } internal U64 dw_push_count_from_expr_op(DW_ExprOp op) { + U64 result = 0; switch (op) { -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID: return _PUSH_COUNT; + default:{}break; +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID:{result = _PUSH_COUNT;}break; DW_Expr_V3_XList DW_Expr_V4_XList DW_Expr_V5_XList DW_Expr_GNU_XList #undef X - default: { NotImplemented; } break; } - return 0; + return result; } internal DW_ExprOperandType * dw_operand_types_from_expr_opcode(DW_ExprOp op) { -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, _OPER_TYPE0, _OPER_TYPE1) case _ID: { local_persist DW_ExprOperandType t[] = { DW_ExprOperandType_##_OPER_TYPE0, DW_ExprOperandType_##_OPER_TYPE1 }; return t; } - switch (op) { + local_persist DW_ExprOperandType nil_t[] = {DW_ExprOperandType_Null}; + DW_ExprOperandType *result = nil_t; + switch(op) + { + default:{}break; +#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, _OPER_TYPE0, _OPER_TYPE1) case _ID: { local_persist DW_ExprOperandType t[] = { DW_ExprOperandType_##_OPER_TYPE0, DW_ExprOperandType_##_OPER_TYPE1 }; result = t; }break; DW_Expr_V3_XList DW_Expr_V4_XList DW_Expr_V5_XList DW_Expr_GNU_XList #undef X - default: { NotImplemented; } break; } - return 0; + return result; } internal U64 @@ -466,7 +476,9 @@ internal B32 dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode) { B32 is_invalid = 0; - switch (opcode) { + switch(opcode) + { + default:{}break; case DW_ExprOp_Addrx: case DW_ExprOp_Call2: case DW_ExprOp_Call4: @@ -478,10 +490,10 @@ dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode) case DW_ExprOp_RegvalType: case DW_ExprOp_Reinterpret: case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_CallFrameCfa: { + case DW_ExprOp_CallFrameCfa: + { is_invalid = 1; - } break; - default: break; + }break; } return is_invalid; } @@ -490,15 +502,17 @@ internal B32 dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode) { B32 is_new_row_op = 0; - switch (opcode) { + switch(opcode) + { + default:{}break; case DW_CFA_SetLoc: case DW_CFA_AdvanceLoc: case DW_CFA_AdvanceLoc1: case DW_CFA_AdvanceLoc2: - case DW_CFA_AdvanceLoc4: { + case DW_CFA_AdvanceLoc4: + { is_new_row_op = 1; - } break; - default: break; + }break; } return is_new_row_op; } diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 2f59204f..fb23bfbb 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -763,7 +763,7 @@ rb_thread_entry_point(void *p) convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); convert_params.is_parse_relaxed = 1; // TODO: switch } - ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); + // ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); // rjf: convert [2] D2R2_ConvertParams convert_params_2 = {0}; diff --git a/src/text/text.c b/src/text/text.c index 8d9a0bc3..b2ec582d 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -2923,7 +2923,7 @@ txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_ou } //- rjf: cancel -> release - if(lane_idx() == 0 && ins_atomic_u32_eval(cancel_signal)) + if(lane_idx() == 0 && ins_atomic_u32_eval(cancel_signal) && shared->arena != 0) { arena_release(shared->arena); shared->arena = 0; From 0054935252457ae4ca63ecddc1328b0c01703a28 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 30 Apr 2026 18:09:30 -0700 Subject: [PATCH 477/850] d2r2: fix scope voff miscount; pattern match trivial value-register locations -> simple kind; fix pre-dwarf5 file table parsing --- src/dwarf/dwarf_parse_2.c | 6 ++++++ src/rdi_from_dwarf/rdi_from_dwarf_2.c | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 7f8ec0cc..1cf8b735 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -722,6 +722,12 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of // rjf: gather additional files for(;off < off_opl;) { + U8 next_byte = 0; + str8_deserial_read_struct(data, off, &next_byte); + if(next_byte == 0) + { + break; + } String8 file_name = {0}; U64 dir_idx = 0; U64 modify_time = 0; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index d2a270b2..a8e4c1df 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -249,7 +249,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 voff_first = (base_addr - base_vaddr); U64 voff_opl = voff_first + range_size; RDIM_Rng1U64 range = {voff_first, voff_opl}; - rdim_rng1u64_chunk_list_push(scratch.arena, &voff_ranges, 256, range); + rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, range); } if(off == start_off) { @@ -3568,6 +3568,22 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } + // rjf: match val registers + if(loc.kind == RDI_LocationKind_ValBytecodeStream && + beginning_ops[0] == RDI_EvalOp_RegRead && + beginning_ops[1] == RDI_EvalOp_Stop) + { + U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; + U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; + U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; + if(byte_size == unit_parse_ctx->addr_size && + byte_off == 0) + { + loc.kind = RDI_LocationKind_ValReg; + loc.reg_code = rdi_reg_code; + } + } + // rjf: match simple register offsets if(loc.kind == RDI_LocationKind_AddrBytecodeStream && beginning_ops[0] == RDI_EvalOp_RegRead && @@ -3681,7 +3697,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) procedure->location_cases = framebase_location_cases; root_scope->symbol = procedure; root_scope->voff_ranges = ranges; - dst_unit->scopes.scope_voff_count += 2; + dst_unit->scopes.scope_voff_count += 2*ranges.count; new_scope_open = root_scope; }break; @@ -3725,6 +3741,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &dst_unit->scopes, chunk_count); scope->voff_ranges = ranges; + dst_unit->scopes.scope_voff_count += 2*ranges.count; new_scope_open = scope; }break; } From 13fb24f2536a678112ae187bb3cc913e31c1da12 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 1 May 2026 08:42:48 -0700 Subject: [PATCH 478/850] fix incorrect function parameter type parsing (was causing quadratic parses of .debug_info, oops) --- project.4coder | 2 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 7 +++---- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 9 +++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/project.4coder b/project.4coder index 50d985d6..d342f4b0 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin && pushd build && del raddbg.elf.rdi && del raddbg.elf.dump && radbin --rdi ./raddbg --out:raddbg.elf.rdi && radbin --dump raddbg.elf.rdi --out:raddbg.elf.dump", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin telemetry release", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index f171c50b..445281a6 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2792,8 +2792,8 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //////////////////////////////// - ProfBeginV("Convert Line Tables [Count: %llu]", cu_ranges.count); RDIM_LineTable **cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); + ProfScope("Convert Line Tables [Count: %llu]", cu_ranges.count) { Temp temp = temp_begin(scratch.arena); @@ -2812,7 +2812,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) for EachIndex(cu_idx, cu_ranges.count) { total_file_count += line_vms[cu_idx]->header.file_table.count; } // TODO: sync - ProfBeginV("Dedup source files [Count: %llu]", total_file_count); + ProfBegin("Dedup source files [Count: %llu]", total_file_count); LFHT_NodeChunkList *src_file_lfht_nodes = push_array(temp.arena, LFHT_NodeChunkList, lane_count()); LFHT_Node *src_file_lfht = 0; @@ -2846,7 +2846,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) ProfEnd(); // TODO: sync - ProfBeginV("Sort unique source files [Count: %llu]", unique_file_count); + ProfBegin("Sort unique source files [Count: %llu]", unique_file_count); d2r_sort_ptrs(lookups, unique_file_count, d2r_src_file_lfht_key_value_is_before); ProfEnd(); @@ -3000,7 +3000,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) temp_end(temp); } - ProfEnd(); //////////////////////////////// diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index a8e4c1df..39eff3ab 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1785,7 +1785,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) read_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, read_off, &child_tag); // rjf: formal parameters -> gather direct types - if(child_tag.kind == DW_TagKind_FormalParameter) + if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) { DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); @@ -1806,11 +1806,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: tree navigations - if(tag.has_children) + if(child_tag.has_children) { depth += 1; } - if(tag.kind == DW_TagKind_Null) + if(child_tag.kind == DW_TagKind_Null) { depth -= 1; } @@ -1894,6 +1894,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // RDIM_TypeChunkList *all_types = 0; RDIM_Type **type_from_idx_map = 0; + ProfScope("build all types") { if(lane_idx() == 0) { @@ -2085,7 +2086,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &child_tag); // rjf: gather parameters - if(child_tag.kind == DW_TagKind_FormalParameter) + if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) { DW2_Attrib *type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); ParamNode *n = push_array(scratch2.arena, ParamNode, 1); From 0b26b1c83e7f807acdd6e639bf0765cf79a74b75 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 1 May 2026 08:49:16 -0700 Subject: [PATCH 479/850] radbin: only dump eh frame data if found --- src/radbin/radbin.c | 34 +++++++++++++++++++++++++++++----- src/radbin/radbin.h | 3 ++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index fb23bfbb..92d142f2 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -355,6 +355,9 @@ rb_thread_entry_point(void *p) scratch_end(scratch); } + ////////////////////////// + //- rjf: COFF OBJ => check if contains DWARF + // if(file_format == RB_FileFormat_COFF_OBJ || file_format == RB_FileFormat_COFF_BigOBJ) { Temp scratch = scratch_begin(&arena, 1); @@ -386,6 +389,28 @@ rb_thread_entry_point(void *p) scratch_end(scratch); } + ////////////////////////// + //- rjf: ELF => check if contains EH frame info + // + if(file_format == RB_FileFormat_ELF32 || + file_format == RB_FileFormat_ELF64) + { + Temp scratch = scratch_begin(&arena, 1); + ELF_Bin elf_bin = elf_bin_from_data(scratch.arena, file_data); + for EachIndex(sect_idx, elf_bin.hdr.e_shnum) + { + ELF_Shdr64 *shdr = &elf_bin.shdrs.v[sect_idx]; + String8 name = elf_name_from_shdr64(file_data, &elf_bin, shdr); + if(str8_match(name, str8_lit(".eh_frame_hdr"), 0)) + { + log_infof("EH frame data detected in %S (%S)\n", n->string, rb_file_format_display_name_table[file_format]); + file_format_flags |= RB_FileFormatFlag_HasEhFrame; + break; + } + } + scratch_end(scratch); + } + ////////////////////////// //- rjf: push to list // @@ -1427,16 +1452,14 @@ rb_thread_entry_point(void *p) { elf = elf_bin_from_data(arena, f->data); arch = arch_from_elf_machine(elf.hdr.e_machine); - for EachIndex(sect_idx, elf.hdr.e_shnum) { ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; String8 name = elf_name_from_shdr64(f->data, &elf, shdr); - if (str8_match(name, str8_lit(".eh_frame_hdr"), 0)) + if(str8_match(name, str8_lit(".eh_frame_hdr"), 0)) { eh_frame_hdr = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); eh_frame_hdr_vaddr = shdr->sh_addr; - } else if(str8_match(name, str8_lit(".eh_frame"), 0)) { @@ -1537,7 +1560,7 @@ rb_thread_entry_point(void *p) }break; } - //- rjf: dump file extension info + //- rjf: dump DWARF file extension info if(f->format_flags & RB_FileFormatFlag_HasDWARF) { if(lane_idx() == 0) @@ -1549,7 +1572,8 @@ rb_thread_entry_point(void *p) lane_sync(); } - if(eh_dump_subset_flags) + //- rjf: dump EH frame file extension info + if(f->format_flags & RB_FileFormatFlag_HasEhFrame) { if(lane_idx() == 0) { diff --git a/src/radbin/radbin.h b/src/radbin/radbin.h index 7e7265fc..3323f6c1 100644 --- a/src/radbin/radbin.h +++ b/src/radbin/radbin.h @@ -25,7 +25,8 @@ struct RB_ThreadParams typedef U32 RB_FileFormatFlags; enum { - RB_FileFormatFlag_HasDWARF = (1<<0), + RB_FileFormatFlag_HasDWARF = (1<<0), + RB_FileFormatFlag_HasEhFrame = (1<<1), }; typedef struct RB_File RB_File; From 0b5e827f6c6d6160088dbce6557b23794b665d41 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 1 May 2026 12:34:35 -0700 Subject: [PATCH 480/850] rd: prioritize fastpath for non-unwound register reads; d2r2: prepass to find all top-level tag trees, subdivide unit work on a root-level tag tree basis --- project.4coder | 2 +- src/raddbg/raddbg_core.c | 22 +- src/rdi/rdi_local.c | 4 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 2245 ++++++++++++++----------- 4 files changed, 1271 insertions(+), 1002 deletions(-) diff --git a/project.4coder b/project.4coder index d342f4b0..91e82725 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin telemetry release", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin release telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 17ba3eed..81a71a40 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -769,16 +769,28 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) case D_EntityKind_Thread: { Access *access = access_open(); - D_CallStack call_stack = d_call_stack_from_thread(access, entity->handle, 1, rd_state->frame_eval_memread_endt_us); - U64 concrete_frame_idx = e_interpret_ctx->reg_unwind_count; - if(concrete_frame_idx < call_stack.concrete_frames_count) + void *regs_block = 0; + if(e_interpret_ctx->reg_unwind_count == 0) + { + regs_block = d_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, entity->handle); + } + else + { + D_CallStack call_stack = d_call_stack_from_thread(access, entity->handle, 1, rd_state->frame_eval_memread_endt_us); + U64 concrete_frame_idx = e_interpret_ctx->reg_unwind_count; + if(concrete_frame_idx < call_stack.concrete_frames_count) + { + D_CallStackFrame *f = call_stack.concrete_frames[concrete_frame_idx]; + regs_block = f->regs; + } + } + if(regs_block != 0) { - D_CallStackFrame *f = call_stack.concrete_frames[concrete_frame_idx]; U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch); Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 read_range = intersect_1u64(legal_range, range); U64 read_size = dim_1u64(read_range); - MemoryCopy(out, (U8 *)f->regs + read_range.min, read_size); + MemoryCopy(out, (U8 *)regs_block + read_range.min, read_size); result = (read_size == dim_1u64(range)); } access_close(access); diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 2fbe99cc..be42b6c3 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -537,7 +537,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse { if(lane_idx() == 0) { - dumpf("\n // %-16s %-16s %-12s %-12s %-12s %s\n", "name", "flags", "voff_first", "voff_opl", "foff_first", "foff_opl"); + dumpf("\n // %-32s %-16s %-12s %-12s %-12s %s\n", "name", "flags", "voff_first", "voff_opl", "foff_first", "foff_opl"); } U64 count = 0; RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count); @@ -548,7 +548,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subse RDI_BinarySection *bin_section = &v[idx]; String8 name = str8_from_rdi_string_idx(rdi, bin_section->name_string_idx); String8 flags = rdi_string_from_binary_section_flags(scratch.arena, bin_section->flags); - dumpf(" { %-16S %-16S 0x%-10I64x 0x%-10I64x 0x%-10I64x 0x%-10I64x } // binary_section[%I64u]\n", + dumpf(" { %-32S %-16S 0x%-10I64x 0x%-10I64x 0x%-10I64x 0x%-10I64x } // binary_section[%I64u]\n", push_str8f(scratch.arena, "'%S'", name), push_str8f(scratch.arena, "`%S`", flags), bin_section->voff_first, diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 39eff3ab..9911ec85 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1226,6 +1226,170 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync_u64(&all_line_tables, 0); + //////////////////////////// + //- rjf: find all offsets of top-level tag trees across all units + // + U64Array *unit_info_root_tag_offs = 0; + U64 total_root_tag_count = 0; + U64 *total_root_tag_count_ptr = &total_root_tag_count; + lane_sync_u64(&total_root_tag_count_ptr, 0); + ProfScope("find all offsets of top-level tag trees across all units") + { + if(lane_idx() == 0) + { + unit_info_root_tag_offs = push_array(scratch.arena, U64Array, unit_count); + } + lane_sync_u64(&unit_info_root_tag_offs, 0); + typedef struct D2R2_UnitTagTreeOffChunkNode D2R2_UnitTagTreeOffChunkNode; + struct D2R2_UnitTagTreeOffChunkNode + { + D2R2_UnitTagTreeOffChunkNode *next; + U64 *v; + U64 count; + U64 cap; + }; + typedef struct D2R2_UnitTagTreeOffChunkList D2R2_UnitTagTreeOffChunkList; + struct D2R2_UnitTagTreeOffChunkList + { + D2R2_UnitTagTreeOffChunkNode *first; + D2R2_UnitTagTreeOffChunkNode *last; + U64 chunk_count; + U64 total_count; + }; + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + //- rjf: take the next unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= unit_count) + { + break; + } + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: unpack this unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + + //- rjf: gather all offsets of root-level trees + D2R2_UnitTagTreeOffChunkList tree_offs = {0}; + S64 depth = 0; + for(U64 off = unit_info_tag_range.min; contains_1u64(unit_info_tag_range, off);) + { + U64 start_off = off; + Temp scratch3 = scratch_begin(&scratch2.arena, 1); + + //- rjf: if this next tag is root-level, gather + if(depth == 1) + { + D2R2_UnitTagTreeOffChunkNode *chunk = tree_offs.last; + if(chunk == 0 || chunk->count >= chunk->cap) + { + chunk = push_array(scratch2.arena, D2R2_UnitTagTreeOffChunkNode, 1); + chunk->cap = 512; + chunk->v = push_array(scratch2.arena, U64, chunk->cap); + SLLQueuePush(tree_offs.first, tree_offs.last, chunk); + tree_offs.chunk_count += 1; + } + chunk->v[chunk->count] = off; + chunk->count += 1; + tree_offs.total_count += 1; + } + + //- rjf: reading the next tag + DW2_Tag tag = {0}; + off += dw2_read_tag(scratch3.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + + //- rjf: do tree navigations + if(tag.has_children) + { + depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + + scratch_end(scratch3); + if(off == start_off) + { + break; + } + } + + //- rjf: flatten & store + { + U64Array tree_offs_array = {0}; + tree_offs_array.count = tree_offs.total_count; + tree_offs_array.v = push_array(scratch.arena, U64, tree_offs_array.count); + { + U64 idx = 0; + for EachNode(n, D2R2_UnitTagTreeOffChunkNode, tree_offs.first) + { + MemoryCopy(tree_offs_array.v + idx, n->v, sizeof(n->v[0])*n->count); + idx += n->count; + } + } + unit_info_root_tag_offs[unit_idx] = tree_offs_array; + ins_atomic_u64_add_eval(total_root_tag_count_ptr, tree_offs_array.count); + } + + scratch_end(scratch2); + } + lane_sync(); + total_root_tag_count = *total_root_tag_count_ptr; + } + + //////////////////////////// + //- rjf: produce list of (unit * range(root_tag_idx)), so that we can easily + // subdivide work from all units across all lanes + // + typedef struct D2R2_SubUnitWork D2R2_SubUnitWork; + struct D2R2_SubUnitWork + { + U64 unit_idx; + Rng1U64 root_tag_idx_range; + }; + U64 sub_unit_works_count = 0; + D2R2_SubUnitWork *sub_unit_works = 0; + ProfScope("produce sub-unit work division") if(lane_idx() == 0) + { + U64 root_tags_per_work = 1024; + for(B32 build = 0; build <= 1; build += 1) + { + U64 sub_unit_work_idx = 0; + for EachIndex(unit_idx, unit_count) + { + U64 root_tags_in_this_unit = unit_info_root_tag_offs[unit_idx].count; + U64 works_per_this_unit = (root_tags_in_this_unit+root_tags_per_work-1) / root_tags_per_work; + if(build) + { + D2R2_SubUnitWork *works = sub_unit_works + sub_unit_work_idx; + U64 works_count = works_per_this_unit; + U64 root_tag_idx = 0; + for EachIndex(work_idx, works_count) + { + U64 root_tag_idx_opl = root_tag_idx + root_tags_per_work; + root_tag_idx_opl = ClampTop(root_tag_idx_opl, root_tags_in_this_unit); + works[work_idx].unit_idx = unit_idx; + works[work_idx].root_tag_idx_range = r1u64(root_tag_idx, root_tag_idx_opl); + root_tag_idx = root_tag_idx_opl; + } + } + sub_unit_work_idx += works_per_this_unit; + } + if(!build) + { + sub_unit_works_count = sub_unit_work_idx; + sub_unit_works = push_array(scratch.arena, D2R2_SubUnitWork, sub_unit_works_count); + } + } + } + lane_sync_u64(&sub_unit_works_count, 0); + lane_sync_u64(&sub_unit_works, 0); + //////////////////////////// //- rjf: build built-in types // @@ -2614,11 +2778,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //////////////////////////// - //- rjf: convert all units / symbols + //- rjf: convert all units // RDIM_UnitChunkList *all_units = 0; RDIM_Unit **unit_from_idx_map = 0; - ProfScope("convert all units / symbols") + ProfScope("convert all units") { if(lane_idx() == 0) { @@ -2760,8 +2924,51 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) dst_unit->line_table = unit_line_tables[unit_idx]; dst_unit->voff_ranges = unit_voff_ranges; } + } + } + + //////////////////////////// + //- rjf: convert all symbols + // + typedef struct D2R2_SubUnitWorkArtifacts D2R2_SubUnitWorkArtifacts; + struct D2R2_SubUnitWorkArtifacts + { + RDIM_SymbolChunkList global_variables; + RDIM_SymbolChunkList thread_variables; + RDIM_SymbolChunkList constants; + RDIM_SymbolChunkList procedures; + RDIM_ScopeChunkList scopes; + RDIM_InlineSiteChunkList inline_sites; + }; + D2R2_SubUnitWorkArtifacts *sub_unit_work_artifacts = 0; + ProfScope("convert all symbols") + { + if(lane_idx() == 0) + { + sub_unit_work_artifacts = push_array(scratch.arena, D2R2_SubUnitWorkArtifacts, sub_unit_works_count); + } + lane_sync_u64(&sub_unit_work_artifacts, 0); + U64 work_take_idx_ = 0; + U64 *work_take_idx_ptr = &work_take_idx_; + lane_sync_u64(&work_take_idx_ptr, 0); + for(;;) + { + U64 work_idx = ins_atomic_u64_inc_eval(work_take_idx_ptr) - 1; + if(work_idx >= sub_unit_works_count) + { + break; + } - //- rjf: produce all unit symbols + //- rjf: unpack work + U64 unit_idx = sub_unit_works[work_idx].unit_idx; + Rng1U64 root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; + D2R2_SubUnitWorkArtifacts *dst_artifacts = &sub_unit_work_artifacts[work_idx]; + + //- rjf: unpack unit info + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + + //- rjf: produce all unit symbols in this work typedef struct D2R2_ScopeNode D2R2_ScopeNode; struct D2R2_ScopeNode { @@ -2771,1038 +2978,1088 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) }; D2R2_ScopeNode *top_scope = 0; D2R2_ScopeNode *free_scope = 0; - U64 chunk_count = 512; - for(U64 off = unit_info_tag_range.min; off < unit_info_tag_range.max;) + U64 chunk_count = 256; + for(U64 root_tag_idx = root_tag_idx_range.min; root_tag_idx < root_tag_idx_range.max; root_tag_idx += 1) { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - U64 start_off = off; - - //////////////////////// - //- rjf: parse tag - // - DW2_Tag tag = {0}; - off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); - - //////////////////////// - //- rjf: gather attributes from tag - // - DW2_Attrib *name_attrib = &dw2_attrib_nil; - DW2_Attrib *linkname_attrib = &dw2_attrib_nil; - DW2_Attrib *type_attrib = &dw2_attrib_nil; - DW2_Attrib *inline_attrib = &dw2_attrib_nil; - DW2_Attrib *ranges_attrib = &dw2_attrib_nil; - DW2_Attrib *lopc_attrib = &dw2_attrib_nil; - DW2_Attrib *hipc_attrib = &dw2_attrib_nil; - DW2_Attrib *constval_attrib = &dw2_attrib_nil; - DW2_Attrib *location_attrib = &dw2_attrib_nil; - DW2_Attrib *framebase_attrib = &dw2_attrib_nil; - DW2_Attrib *external_attrib = &dw2_attrib_nil; - for EachNode(n, DW2_AttribNode, tag.attribs.first) + U64 root_tag_start_off = unit_info_root_tag_offs[unit_idx].v[root_tag_idx]; + S64 depth = 1; + for(U64 off = root_tag_start_off; off < unit_info_tag_range.max && (depth > 1 || off == root_tag_start_off);) { - switch(n->v.attrib_kind) - { - default:{}break; -#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break - Case(name, Name); - Case(linkname, LinkageName); - Case(type, Type); - Case(inline, Inline); - Case(ranges, Ranges); - Case(lopc, LowPc); - Case(hipc, HighPc); - Case(constval, ConstValue); - Case(location, Location); - Case(framebase, FrameBase); - Case(external, External); -#undef Case - } - } - - //////////////////////// - //- rjf: unpack basic attributes - // - String8 name = name_attrib->val.string; - String8 link_name = linkname_attrib->val.string; - DW_InlKind inl_kind = (DW_InlKind)inline_attrib->val.u128.u64[0]; - B32 is_external = (external_attrib != &dw2_attrib_nil); - - //////////////////////// - //- rjf: unpack ranges - // - RDIM_Rng1U64List ranges = {0}; - { - if(ranges_attrib != &dw2_attrib_nil) - { - Temp temp = temp_begin(scratch2.arena); - Rng1U64List tag_ranges = dw2_rnglist_from_form_val(temp.arena, unit_parse_ctx, raw, ranges_attrib->val); - for EachNode(n, Rng1U64Node, tag_ranges.first) - { - rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){.min = n->v.min, .max = n->v.max}); - } - temp_end(temp); - } - if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) - { - U64 voff_base = lopc_attrib->val.addr - base_vaddr; - U64 voff_opl = 0; - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, hipc_attrib->val.kind) & (1<val.u128.u64[0]; - } - else - { - voff_opl = hipc_attrib->val.addr; - } - rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){voff_base, voff_opl}); - } - } - - //////////////////////// - //- rjf: unpack type - // - RDIM_Type *type = 0; - if(type_attrib != &dw2_attrib_nil) - { - // rjf: functions need to get their type info from themselves; the type attrib - // only references the return type. so, in that case, we'll use the procedure's - // own info offset / unit index, rather than the type attribute's. - U64 type_info_off = start_off; - U64 type_unit_idx = unit_idx; + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; - // rjf: attrib -> (info_off, unit_idx) - if(tag.kind != DW_TagKind_SubProgram) - { - type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); - type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, type_info_off)) - { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); - type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); - } - } + //////////////////////// + //- rjf: parse tag + // + DW2_Tag tag = {0}; + off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); - // rjf: (info_off, unit_idx) -> hash - U64 type_hash = 0; + //////////////////////// + //- rjf: gather attributes from tag + // + DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *linkname_attrib = &dw2_attrib_nil; + DW2_Attrib *type_attrib = &dw2_attrib_nil; + DW2_Attrib *inline_attrib = &dw2_attrib_nil; + DW2_Attrib *ranges_attrib = &dw2_attrib_nil; + DW2_Attrib *lopc_attrib = &dw2_attrib_nil; + DW2_Attrib *hipc_attrib = &dw2_attrib_nil; + DW2_Attrib *constval_attrib = &dw2_attrib_nil; + DW2_Attrib *location_attrib = &dw2_attrib_nil; + DW2_Attrib *framebase_attrib = &dw2_attrib_nil; + DW2_Attrib *external_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag.attribs.first) { - UnitTypeMap *type_unit_type_map = &unit_type_maps[type_unit_idx]; - U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); - U64 info_off_slot_idx = info_off_hash%type_unit_type_map->slots_count; - for(UnitTypeNode *n = type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == type_info_off) - { - type_hash = n->dst_hash; - break; - } - } - } - - // rjf: hash -> type - { - U64 unique_type_tag_slot_idx = type_hash%unique_type_tag_slots_count; - for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) - { - if(n->hash == type_hash) - { - type = type_from_idx_map[n->order_idx]; - break; - } - } - } - } - - //////////////////////// - //- rjf: unpack location info - // - RDIM_LocationCaseList location_cases = {0}; - RDIM_LocationCaseList framebase_location_cases = {0}; - B32 location_is_tls_dependent = 0; - B32 framebase_location_is_tls_dependent = 0; - { - struct - { - DW2_Attrib *attrib; - RDIM_LocationCaseList *dst_locations; - B32 *dst_is_tls_dependent; - } - tasks[] = - { - {location_attrib, &location_cases, &location_is_tls_dependent}, - {framebase_attrib, &framebase_location_cases, &framebase_location_is_tls_dependent}, - }; - for EachElement(task_idx, tasks) - { - if(tasks[task_idx].attrib == &dw2_attrib_nil) - { - continue; - } - DW2_Attrib *attrib = tasks[task_idx].attrib; - RDIM_LocationCaseList *dst_locations = tasks[task_idx].dst_locations; - B32 *dst_is_tls_dependent = tasks[task_idx].dst_is_tls_dependent; - - ////////////////////// - //- rjf: gather DWARF location exprs - // - DW2_LocList locs = {0}; - switch(attrib->val.kind) + switch(n->v.attrib_kind) { default:{}break; - case DW_Form_ExprLoc: +#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break + Case(name, Name); + Case(linkname, LinkageName); + Case(type, Type); + Case(inline, Inline); + Case(ranges, Ranges); + Case(lopc, LowPc); + Case(hipc, HighPc); + Case(constval, ConstValue); + Case(location, Location); + Case(framebase, FrameBase); + Case(external, External); +#undef Case + } + } + + //////////////////////// + //- rjf: unpack basic attributes + // + String8 name = name_attrib->val.string; + String8 link_name = linkname_attrib->val.string; + DW_InlKind inl_kind = (DW_InlKind)inline_attrib->val.u128.u64[0]; + B32 is_external = (external_attrib != &dw2_attrib_nil); + + //////////////////////// + //- rjf: unpack ranges + // + RDIM_Rng1U64List ranges = {0}; + { + if(ranges_attrib != &dw2_attrib_nil) + { + Temp temp = temp_begin(scratch2.arena); + Rng1U64List tag_ranges = dw2_rnglist_from_form_val(temp.arena, unit_parse_ctx, raw, ranges_attrib->val); + for EachNode(n, Rng1U64Node, tag_ranges.first) { - U64 expr_info_off = attrib->val.u128.u64[0]; - U64 expr_info_size = attrib->val.u128.u64[1]; - String8 expr = str8_substr(raw->sec[DW_Section_Info].data, r1u64(expr_info_off, expr_info_off+expr_info_size)); - DW2_LocNode *n = push_array(scratch2.arena, DW2_LocNode, 1); - n->v.expr = expr; - n->v.range = r1u64(0, max_U64); - SLLQueuePush(locs.first, locs.last, n); - locs.count += 1; - }break; - case DW_Form_LocListx: // NOTE(rjf): dwarf5+, loclistx -> location list offset table - case DW_Form_SecOffset: // NOTE(rjf): pre-dwarf5, location section offset -> a location list + rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){.min = n->v.min, .max = n->v.max}); + } + temp_end(temp); + } + if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) + { + U64 voff_base = lopc_attrib->val.addr - base_vaddr; + U64 voff_opl = 0; + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, hipc_attrib->val.kind) & (1<val); - }break; + voff_opl = voff_base + hipc_attrib->val.u128.u64[0]; + } + else + { + voff_opl = hipc_attrib->val.addr; + } + rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){voff_base, voff_opl}); + } + } + + //////////////////////// + //- rjf: unpack type + // + RDIM_Type *type = 0; + if(type_attrib != &dw2_attrib_nil) + { + // rjf: functions need to get their type info from themselves; the type attrib + // only references the return type. so, in that case, we'll use the procedure's + // own info offset / unit index, rather than the type attribute's. + U64 type_info_off = start_off; + U64 type_unit_idx = unit_idx; + + // rjf: attrib -> (info_off, unit_idx) + if(tag.kind != DW_TagKind_SubProgram) + { + type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, type_info_off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); + type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } } - ////////////////////// - //- rjf: convert DWARF location exprs -> RDIM locations - // - // we do this for each possible frame base location case - locations in DWARF - // refer to the frame base via a special op. in our case, we want to bake that - // into the location directly to reduce extra context for evaluation. - // - // if we find that a location doesn't rely on the frame base at all, we just - // skip the rest. - // - B32 is_tls_dependent = 0; - for EachNode(n, DW2_LocNode, locs.first) + // rjf: (info_off, unit_idx) -> hash + U64 type_hash = 0; { - //- rjf: unpack location - Rng1U64 range = n->v.range; - String8 expr = n->v.expr; - - //- rjf: iterate each frame base location case, or once if there are none, - // and convert the location in that context - RDIM_LocationCase nil_framebase_loc_case = {0, {0}, {0, max_U64}}; - for(RDIM_LocationCase *framebase_loc_n = top_scope ? top_scope->framebase_location_cases.first : &nil_framebase_loc_case; - framebase_loc_n != 0; - framebase_loc_n = framebase_loc_n->next) + UnitTypeMap *type_unit_type_map = &unit_type_maps[type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); + U64 info_off_slot_idx = info_off_hash%type_unit_type_map->slots_count; + for(UnitTypeNode *n = type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) { - //- rjf: unpack framebase location - RDIM_Location framebase_loc = framebase_loc_n->location; - RDIM_Rng1U64 framebase_voff_range = framebase_loc_n->voff_range; - - //- rjf: set up type stack for type-evaluating bytecode - typedef struct D2R2_ExprVal D2R2_ExprVal; - struct D2R2_ExprVal + if(n->src_info_off == type_info_off) { - RDI_TypeKind type_kind; - B32 is_addr; - }; - typedef struct D2R2_ExprValNode D2R2_ExprValNode; - struct D2R2_ExprValNode - { - D2R2_ExprValNode *next; - D2R2_ExprVal v; - }; - D2R2_ExprValNode *val_stack_top = 0; - D2R2_ExprValNode *free_val = 0; - - //- rjf: process DWARF bytecode; produce RDI bytecode + mini-type-info for the expression's result - typedef struct JumpOpNode JumpOpNode; - struct JumpOpNode - { - JumpOpNode *next; - RDIM_EvalBytecodeOp *op; - S64 inst_delta; - }; - JumpOpNode *first_jump_op = 0; - JumpOpNode *last_jump_op = 0; - RDIM_EvalBytecode dst_bytecode = {0}; - B32 dst_bytecode_is_good = 1; - B32 bytecode_is_framebase_dependent = 0; - for(U64 expr_off = 0; expr_off < expr.size;) - { - U64 start_expr_off = expr_off; - - //- rjf: read next opcode - DW_ExprOp opcode = 0; - expr_off += str8_deserial_read_struct(expr, expr_off, &opcode); - - //- rjf: read op operands - U64 operands_count = dw_operand_count_from_expr_op(opcode); - DW_ExprOperandType *operands_types = dw_operand_types_from_expr_opcode(opcode); - U64 operand_u64s[2] = {0}; - S64 operand_s64s[2] = {0}; - String8 operand_str8s[2] = {0}; - for EachIndex(operand_idx, operands_count) - { - switch(operands_types[operand_idx]) - { - case DW_ExprOperandType_Null: - default:{}break; - case DW_ExprOperandType_U8: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 1, 1);}break; - case DW_ExprOperandType_U16: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 2, 2);}break; - case DW_ExprOperandType_U32: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 4, 4);}break; - case DW_ExprOperandType_U64: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 8, 8);}break; - case DW_ExprOperandType_S8: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 1, 1);}break; - case DW_ExprOperandType_S16: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 2, 2);}break; - case DW_ExprOperandType_S32: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 4, 4);}break; - case DW_ExprOperandType_S64: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 8, 8);}break; - case DW_ExprOperandType_ULEB128: {expr_off += str8_deserial_read_uleb128(expr, expr_off, &operand_u64s[operand_idx]);} break; - case DW_ExprOperandType_SLEB128: {expr_off += str8_deserial_read_sleb128(expr, expr_off, &operand_s64s[operand_idx]);} break; - case DW_ExprOperandType_Addr: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], unit_parse_ctx->addr_size, unit_parse_ctx->addr_size);}break; - case DW_ExprOperandType_DwarfUInt: {expr_off += dw2_read_fmt_u64(expr, expr_off, unit_parse_ctx->format, &operand_u64s[operand_idx]);}break; - case DW_ExprOperandType_Block: - { - U8 block_size = 0; - expr_off += str8_deserial_read_struct(expr, expr_off, &block_size); - operand_str8s[operand_idx] = str8_substr(expr, r1u64(expr_off, expr_off+block_size)); - expr_off += block_size; - }break; - } - } - - //- rjf: pop stack values - D2R2_ExprVal popped_vals[2] = {0}; - { - U64 pop_count = dw_pop_count_from_expr_op(opcode); - pop_count = Min(pop_count, ArrayCount(popped_vals)); - for EachIndex(pop_idx, pop_count) - { - if(val_stack_top != 0) - { - D2R2_ExprValNode *popped = val_stack_top; - popped_vals[pop_idx] = popped->v; - SLLStackPop(val_stack_top); - SLLStackPush(free_val, popped); - } - } - } - - //- rjf: exec op (produce RDI bytecode, + manipulate value stack) - D2R2_ExprVal push_vals[2] = {0}; - U64 regcode_dw = 0; - S64 regval_off = 0; - B32 regread_is_addr = 0; - U64 target_pick_val_idx = 0; - RDI_EvalOp rdi_eval_op = 0; - U64 memread_size = 0; - switch(opcode) - { - default:{}break; - - //- rjf: small opcode-embedded unsigned literals - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: - { - U64 lit_val = (U64)(opcode - DW_ExprOp_Lit0); - rdim_bytecode_push_uconst(arena, &dst_bytecode, lit_val); - }break; - - //- rjf: small unsigned literals - case DW_ExprOp_Const1U: push_vals[0].type_kind = RDI_TypeKind_U8; goto const_u; - case DW_ExprOp_Const2U: push_vals[0].type_kind = RDI_TypeKind_U16; goto const_u; - case DW_ExprOp_Const4U: push_vals[0].type_kind = RDI_TypeKind_U32; goto const_u; - case DW_ExprOp_Const8U: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; - case DW_ExprOp_ConstU: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; - const_u:; - { - rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); - }break; - - //- rjf: small signed literals - case DW_ExprOp_Const1S: push_vals[0].type_kind = RDI_TypeKind_S8; goto const_s; - case DW_ExprOp_Const2S: push_vals[0].type_kind = RDI_TypeKind_S16; goto const_s; - case DW_ExprOp_Const4S: push_vals[0].type_kind = RDI_TypeKind_S32; goto const_s; - case DW_ExprOp_Const8S: push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; - case DW_ExprOp_ConstS : push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; - const_s:; - { - rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); - }break; - - //- rjf: address (module offsets) - case DW_ExprOp_Addr: - { - U64 voff = operand_u64s[0] - base_vaddr; - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); - push_vals[0].type_kind = RDI_TypeKind_U64; - push_vals[0].is_addr = 1; - }break; - case DW_ExprOp_Addrx: - if(unit_parse_ctx->addr_table != 0) - { - U64 addr_idx = operand_u64s[0]; - U64 addr = 0; - if(dw2_try_offset_from_table_idx(unit_parse_ctx->addr_table, addr_idx, &addr)) - { - U64 voff = (addr > base_vaddr) ? (addr - base_vaddr) : 0; - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); - push_vals[0].type_kind = RDI_TypeKind_U64; - push_vals[0].is_addr = 1; - } - }break; - - //- rjf: register reads - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: - { - regcode_dw = (U64)(opcode - DW_ExprOp_Reg0); - }goto reg_read; - case DW_ExprOp_RegX: - { - regcode_dw = operand_u64s[0]; - }goto reg_read; - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: - { - regcode_dw = (U64)(opcode - DW_ExprOp_BReg0); - regval_off = operand_s64s[1]; - regread_is_addr = 1; - }goto reg_read; - case DW_ExprOp_BRegX: - { - regcode_dw = operand_u64s[0]; - regval_off = operand_s64s[1]; - regread_is_addr = 1; - }goto reg_read; - reg_read:; - { - // rjf: DWARF regcode -> RDI, off, size - RDI_RegCode regcode_rdi = 0; - U64 reg_off = 0; - U64 reg_size = 0; - switch((Arch)arch) - { - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm32: - case Arch_arm64: - case Arch_x86: - { - // TODO(rjf): unsupported architectures - }break; - case Arch_x64: - { - switch(regcode_dw) - { - default:{}break; -#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw:{regcode_rdi = RDI_RegCodeX64_##reg_rdi; reg_off = (off); reg_size = (size);}break; - DW_Regs_X64_XList -#undef X - } - }break; - } - - // rjf: push op - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_RegRead, RDI_EncodeRegReadParam(regcode_rdi, reg_size, reg_off)); - - // rjf: push add to value offset, if needed - if(regval_off != 0) - { - rdim_bytecode_push_sconst(arena, &dst_bytecode, regval_off); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); - } - - // rjf: choose if we're doing a float op - B32 is_float_op = 0; - if(arch == Arch_x64 && - (regcode_rdi == RDI_RegCodeX64_st0 || - regcode_rdi == RDI_RegCodeX64_st1 || - regcode_rdi == RDI_RegCodeX64_st2 || - regcode_rdi == RDI_RegCodeX64_st3 || - regcode_rdi == RDI_RegCodeX64_st4 || - regcode_rdi == RDI_RegCodeX64_st5 || - regcode_rdi == RDI_RegCodeX64_st6 || - regcode_rdi == RDI_RegCodeX64_st7)) - { - is_float_op = 1; - } - - // rjf: set up push value - push_vals[0].is_addr = regread_is_addr; - if(is_float_op) - { - switch(reg_size) - { - default:{}break; - case 2: {push_vals[0].type_kind = RDI_TypeKind_F16;}break; - case 4: {push_vals[0].type_kind = RDI_TypeKind_F32;}break; - case 6: {push_vals[0].type_kind = RDI_TypeKind_F48;}break; - case 8: {push_vals[0].type_kind = RDI_TypeKind_F64;}break; - case 10:{push_vals[0].type_kind = RDI_TypeKind_F80;}break; - case 12:{push_vals[0].type_kind = RDI_TypeKind_F96;}break; - case 16:{push_vals[0].type_kind = RDI_TypeKind_F128;}break; - } - } - else - { - switch(reg_size) - { - default:{}break; - case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; - case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; - case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; - case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; - } - } - }break; - - //- rjf: implicit values - case DW_ExprOp_ImplicitValue: - { - if(operand_str8s[0].size <= sizeof(U64)) - { - U64 implicit_value = 0; - MemoryCopy(&implicit_value, operand_str8s[0].str, Min(sizeof(U64), operand_str8s[0].size)); - rdim_bytecode_push_uconst(arena, &dst_bytecode, implicit_value); - switch(operand_str8s[0].size) - { - default:{}break; - case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; - case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; - case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; - case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; - } - } - else - { - log_infof("[.debug_info@0x%I64x] Implicit value DWARF expression operation (DW_ExprOp_ImplicitValue) with block size >8 (%I64u) found. This is not currently supported.\n", start_off, operand_str8s[0].size); - } - }break; - - //- rjf: pieces - case DW_ExprOp_Piece: - { - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValue, operand_u64s[0]); - }break; - case DW_ExprOp_BitPiece: - { - U64 size = operand_u64s[0]; - U64 off = operand_u64s[1]; - U64 partial_value = ((size<<32)|(off)); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValueBit, partial_value); - }break; - - //- rjf: stack ops - case DW_ExprOp_Over: {target_pick_val_idx = 1;}goto pick; - case DW_ExprOp_Pick: {target_pick_val_idx = operand_u64s[0];}goto pick; - case DW_ExprOp_Dup: {target_pick_val_idx = 0;}goto pick; - pick:; - { - // rjf: pick value from stack - D2R2_ExprVal picked_val = {0}; - { - U64 idx = 0; - for(D2R2_ExprValNode *n = val_stack_top; n != 0; n = n->next) - { - if(idx == target_pick_val_idx) - { - picked_val = n->v; - break; - } - } - } - - // rjf: push opcode - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pick, target_pick_val_idx); - - // rjf: push val - push_vals[0] = picked_val; - }break; - case DW_ExprOp_Swap: - { - push_vals[0] = popped_vals[1]; - push_vals[1] = popped_vals[0]; - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Swap, 0); - }break; - case DW_ExprOp_Drop: - { - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pop, 0); - }break; - - //- rjf: jumps - case DW_ExprOp_Skip: rdi_eval_op = RDI_EvalOp_Skip; goto jumps; - case DW_ExprOp_Bra: rdi_eval_op = RDI_EvalOp_Cond; goto jumps; - jumps:; - { - // rjf: jump delta in bytes (how the instruction is encoded) -> jump delta in instructions - S64 jump_delta_bytes = operand_s64s[0]; - S64 jump_delta_insts = 0; - { - // TODO(rjf): expr op jumps bytes -> inst counts - } - - // rjf: push incomplete op (we need to resolve inst delta -> byte delta later, once we have the full bytecode stream) - RDIM_EvalBytecodeOp *op = rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, 0); - - // rjf: gather op - JumpOpNode *n = push_array(scratch2.arena, JumpOpNode, 1); - SLLQueuePush(first_jump_op, last_jump_op, n); - n->op = op; - n->inst_delta = jump_delta_insts; - }break; - - //- rjf: containing procedure frame offsets - case DW_ExprOp_FBReg: - { - bytecode_is_framebase_dependent = 1; - for EachNode(n, RDIM_EvalBytecodeOp, framebase_loc.bytecode.first_op) - { - rdim_bytecode_push_op(arena, &dst_bytecode, n->op, n->p); - } - rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); - push_vals[0].type_kind = RDI_TypeKind_U64; - push_vals[0].is_addr = 1; - }break; - - //- rjf: memory reads - case DW_ExprOp_Deref: memread_size = unit_parse_ctx->addr_size; goto deref; - case DW_ExprOp_DerefSize: memread_size = operand_u64s[0]; goto deref; - deref:; - { - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_MemRead, memread_size); - push_vals[0].is_addr = 1; - push_vals[0].type_kind = RDI_TypeKind_U64; - }break; - - //- rjf: TLS offsets - case DW_ExprOp_FormTlsAddress: - case DW_ExprOp_GNU_PushTlsAddress: - { - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_TLSOff, 0); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); - push_vals[0].is_addr = 1; - push_vals[0].type_kind = RDI_TypeKind_U64; - is_tls_dependent = 1; - }break; - - //- rjf: call site value - case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: - { - // TODO(rjf): expr op entry value ops - }break; - - //- rjf: fixed adds - case DW_ExprOp_PlusUConst: - { - rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); - push_vals[0].type_kind = RDI_TypeKind_U64; // TODO(rjf): do we need to adjust this based on popped value at all, even? - }break; - - //- rjf: arithmetic ops - case DW_ExprOp_Eq: {rdi_eval_op = RDI_EvalOp_EqEq;}goto arithmetic_op; - case DW_ExprOp_Ge: {rdi_eval_op = RDI_EvalOp_GrEq;}goto arithmetic_op; - case DW_ExprOp_Gt: {rdi_eval_op = RDI_EvalOp_Grtr;}goto arithmetic_op; - case DW_ExprOp_Le: {rdi_eval_op = RDI_EvalOp_LsEq;}goto arithmetic_op; - case DW_ExprOp_Lt: {rdi_eval_op = RDI_EvalOp_Less;}goto arithmetic_op; - case DW_ExprOp_Ne: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; - case DW_ExprOp_Div: {rdi_eval_op = RDI_EvalOp_Div;}goto arithmetic_op; - case DW_ExprOp_Minus: {rdi_eval_op = RDI_EvalOp_Sub;}goto arithmetic_op; - case DW_ExprOp_Mul: {rdi_eval_op = RDI_EvalOp_Mul;}goto arithmetic_op; - case DW_ExprOp_Plus: {rdi_eval_op = RDI_EvalOp_Add;}goto arithmetic_op; - case DW_ExprOp_Xor: {rdi_eval_op = RDI_EvalOp_BitXor;}goto arithmetic_op; - case DW_ExprOp_And: {rdi_eval_op = RDI_EvalOp_BitAnd;}goto arithmetic_op; - case DW_ExprOp_Or: {rdi_eval_op = RDI_EvalOp_BitOr;}goto arithmetic_op; - case DW_ExprOp_Shl: {rdi_eval_op = RDI_EvalOp_LShift;}goto arithmetic_op; - case DW_ExprOp_Shr: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; - case DW_ExprOp_Shra: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; - case DW_ExprOp_Mod: {rdi_eval_op = RDI_EvalOp_Mod;}goto arithmetic_op; - case DW_ExprOp_Abs: {rdi_eval_op = RDI_EvalOp_Abs;}goto arithmetic_op; - case DW_ExprOp_Neg: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; - case DW_ExprOp_Not: {rdi_eval_op = RDI_EvalOp_LogNot;}goto arithmetic_op; - arithmetic_op:; - { - // TODO(rjf): eval arithmetic conversions etc. - rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, RDI_EvalTypeGroup_U); - }break; - - //- rjf: currently unsupported - case DW_ExprOp_XDeref: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression XDeref operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_XDerefSize: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression XDerefSize operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression call operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_ImplicitPointer: - case DW_ExprOp_GNU_ImplicitPointer: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression implicit pointer operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_GNU_ParameterRef: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression GNU_ParameterRef operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_DerefType: - case DW_ExprOp_GNU_DerefType: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression DerefType operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_ConstType: - case DW_ExprOp_GNU_ConstType: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression ConstType operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_RegvalType: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression RegvalType operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_PushObjectAddress: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression PushObjectAddress operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_Rot: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression Rot (rotate) operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_GNU_UnInit: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression GNU_UnInit operation encountered. This is not supported for location info.\n", start_off); - // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; - } break; - } - - //- rjf: push values to stack - { - U64 push_count = dw_push_count_from_expr_op(opcode); - push_count = Min(push_count, ArrayCount(push_vals)); - for EachIndex(push_idx, push_count) - { - D2R2_ExprValNode *n = free_val; - if(n != 0) - { - SLLStackPop(free_val); - } - else - { - n = push_array(scratch2.arena, D2R2_ExprValNode, 1); - } - n->v = push_vals[push_idx]; - SLLStackPush(val_stack_top, n); - } - } - - if(expr_off == start_expr_off) - { - break; - } + type_hash = n->dst_hash; + break; } - - //- rjf: apply RDI byte offsets to jump ops - { - // TODO(rjf): apply RDI byte offsets to jump ops - } - - //- rjf: map bytecode -> RDIM_Location - we may want to simplify - RDIM_Location loc = {0}; - { - loc.kind = val_stack_top && val_stack_top->v.is_addr ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; - loc.bytecode = dst_bytecode; - - // rjf: gather first few bytecodes for pattern matching - RDI_EvalOp beginning_ops[5] = {0}; - RDIM_EvalBytecodeOp *beginning_nodes[5] = {0}; - { - U64 idx = 0; - for EachNode(n, RDIM_EvalBytecodeOp, dst_bytecode.first_op) - { - if(idx >= ArrayCount(beginning_ops)) - { - break; - } - beginning_ops[idx] = n->op; - beginning_nodes[idx] = n; - idx += 1; - } - } - - // rjf: match val registers - if(loc.kind == RDI_LocationKind_ValBytecodeStream && - beginning_ops[0] == RDI_EvalOp_RegRead && - beginning_ops[1] == RDI_EvalOp_Stop) - { - U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; - U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; - U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; - if(byte_size == unit_parse_ctx->addr_size && - byte_off == 0) - { - loc.kind = RDI_LocationKind_ValReg; - loc.reg_code = rdi_reg_code; - } - } - - // rjf: match simple register offsets - if(loc.kind == RDI_LocationKind_AddrBytecodeStream && - beginning_ops[0] == RDI_EvalOp_RegRead && - (beginning_ops[1] == RDI_EvalOp_ConstU8 || - beginning_ops[1] == RDI_EvalOp_ConstU16) && - beginning_ops[2] == RDI_EvalOp_TruncSigned && - beginning_ops[3] == RDI_EvalOp_Add && - beginning_ops[4] == RDI_EvalOp_Stop) - { - U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; - U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; - U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; - if(byte_off == 0 && byte_size == unit_parse_ctx->addr_size) - { - loc.kind = RDI_LocationKind_AddrRegPlusOff; - loc.reg_code = rdi_reg_code; - loc.offset = beginning_nodes[1]->p; - } - } - - // rjf: match simple module offsets - if(beginning_ops[0] == RDI_EvalOp_ModuleOff && beginning_ops[1] == RDI_EvalOp_Stop) - { - U64 voff = beginning_nodes[0]->p; - loc.kind = RDI_LocationKind_ModuleOff; - loc.offset = voff; - } - else if(((beginning_ops[0] == RDI_EvalOp_ModuleOff && - (beginning_ops[1] == RDI_EvalOp_ConstU8 || - beginning_ops[1] == RDI_EvalOp_ConstU16 || - beginning_ops[1] == RDI_EvalOp_ConstU32 || - beginning_ops[1] == RDI_EvalOp_ConstU64)) || - (beginning_ops[1] == RDI_EvalOp_ModuleOff && - (beginning_ops[0] == RDI_EvalOp_ConstU8 || - beginning_ops[0] == RDI_EvalOp_ConstU16 || - beginning_ops[0] == RDI_EvalOp_ConstU32 || - beginning_ops[0] == RDI_EvalOp_ConstU64))) && - beginning_ops[2] == RDI_EvalOp_Add && - beginning_ops[3] == RDI_EvalOp_Stop) - { - U64 voff = beginning_nodes[0]->p + beginning_nodes[1]->p; - loc.kind = RDI_LocationKind_ModuleOff; - loc.offset = voff; - } - - // rjf: match simple TLS offsets - if(beginning_ops[0] == RDI_EvalOp_TLSOff && beginning_ops[1] == RDI_EvalOp_Stop) - { - U64 toff = beginning_nodes[0]->p; - loc.kind = RDI_LocationKind_TLSOff; - loc.offset = toff; - } - else if(((beginning_ops[0] == RDI_EvalOp_TLSOff && - (beginning_ops[1] == RDI_EvalOp_ConstU8 || - beginning_ops[1] == RDI_EvalOp_ConstU16 || - beginning_ops[1] == RDI_EvalOp_ConstU32 || - beginning_ops[1] == RDI_EvalOp_ConstU64)) || - (beginning_ops[1] == RDI_EvalOp_TLSOff && - (beginning_ops[0] == RDI_EvalOp_ConstU8 || - beginning_ops[0] == RDI_EvalOp_ConstU16 || - beginning_ops[0] == RDI_EvalOp_ConstU32 || - beginning_ops[0] == RDI_EvalOp_ConstU64))) && - beginning_ops[2] == RDI_EvalOp_Add && - beginning_ops[3] == RDI_EvalOp_Stop) - { - U64 toff = beginning_nodes[0]->p + beginning_nodes[1]->p; - loc.kind = RDI_LocationKind_TLSOff; - loc.offset = toff; - } - } - - //- rjf: collect - { - RDIM_Rng1U64 voff_range = {range.min - base_vaddr, range.max - base_vaddr}; - if(bytecode_is_framebase_dependent) - { - voff_range.min = Max(voff_range.min, framebase_voff_range.min); - voff_range.max = Min(voff_range.max, framebase_voff_range.max); - } - rdim_location_case_list_push(arena, dst_locations, loc, voff_range); - dst_is_tls_dependent[0] = is_tls_dependent; - } - - //- rjf: not frame-base dependent? -> break - don't do this per-framebase case - if(!bytecode_is_framebase_dependent) + } + } + + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = type_hash%unique_type_tag_slots_count; + for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == type_hash) { + type = type_from_idx_map[n->order_idx]; break; } } } } - } - - //////////////////////// - //- rjf: produce symbols from tag - // - RDIM_Scope *new_scope_open = 0; - switch(tag.kind) - { - default:{}break; - //- rjf: subprograms (procedures) - case DW_TagKind_SubProgram: + //////////////////////// + //- rjf: unpack location info + // + RDIM_LocationCaseList location_cases = {0}; + RDIM_LocationCaseList framebase_location_cases = {0}; + B32 location_is_tls_dependent = 0; + B32 framebase_location_is_tls_dependent = 0; { - RDIM_Scope *root_scope = rdim_scope_chunk_list_push(arena, &dst_unit->scopes, chunk_count); - RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_unit->procedures, chunk_count); - procedure->name = name; - procedure->link_name = link_name; - procedure->type = type; - procedure->root_scope = root_scope; - procedure->location_cases = framebase_location_cases; - root_scope->symbol = procedure; - root_scope->voff_ranges = ranges; - dst_unit->scopes.scope_voff_count += 2*ranges.count; - new_scope_open = root_scope; - }break; - - //- rjf: inline site - case DW_TagKind_InlinedSubroutine: - { - - }break; - - //- rjf: variables - case DW_TagKind_Variable: - case DW_TagKind_FormalParameter: - if(name.size != 0) - { - U64 var_chunk_count = chunk_count; - RDIM_SymbolChunkList *dst_symbols = &dst_unit->global_variables; - if(location_is_tls_dependent) + struct { - dst_symbols = &dst_unit->thread_variables; + DW2_Attrib *attrib; + RDIM_LocationCaseList *dst_locations; + B32 *dst_is_tls_dependent; + } + tasks[] = + { + {location_attrib, &location_cases, &location_is_tls_dependent}, + {framebase_attrib, &framebase_location_cases, &framebase_location_is_tls_dependent}, + }; + for EachElement(task_idx, tasks) + { + if(tasks[task_idx].attrib == &dw2_attrib_nil) + { + continue; + } + DW2_Attrib *attrib = tasks[task_idx].attrib; + RDIM_LocationCaseList *dst_locations = tasks[task_idx].dst_locations; + B32 *dst_is_tls_dependent = tasks[task_idx].dst_is_tls_dependent; + + ////////////////////// + //- rjf: gather DWARF location exprs + // + DW2_LocList locs = {0}; + switch(attrib->val.kind) + { + default:{}break; + case DW_Form_ExprLoc: + { + U64 expr_info_off = attrib->val.u128.u64[0]; + U64 expr_info_size = attrib->val.u128.u64[1]; + String8 expr = str8_substr(raw->sec[DW_Section_Info].data, r1u64(expr_info_off, expr_info_off+expr_info_size)); + DW2_LocNode *n = push_array(scratch2.arena, DW2_LocNode, 1); + n->v.expr = expr; + n->v.range = r1u64(0, max_U64); + SLLQueuePush(locs.first, locs.last, n); + locs.count += 1; + }break; + case DW_Form_LocListx: // NOTE(rjf): dwarf5+, loclistx -> location list offset table + case DW_Form_SecOffset: // NOTE(rjf): pre-dwarf5, location section offset -> a location list + { + locs = dw2_loclist_from_form_val(scratch2.arena, unit_parse_ctx, raw, attrib->val); + }break; + } + + ////////////////////// + //- rjf: convert DWARF location exprs -> RDIM locations + // + // we do this for each possible frame base location case - locations in DWARF + // refer to the frame base via a special op. in our case, we want to bake that + // into the location directly to reduce extra context for evaluation. + // + // if we find that a location doesn't rely on the frame base at all, we just + // skip the rest. + // + B32 is_tls_dependent = 0; + for EachNode(n, DW2_LocNode, locs.first) + { + //- rjf: unpack location + Rng1U64 range = n->v.range; + String8 expr = n->v.expr; + + //- rjf: iterate each frame base location case, or once if there are none, + // and convert the location in that context + RDIM_LocationCase nil_framebase_loc_case = {0, {0}, {0, max_U64}}; + for(RDIM_LocationCase *framebase_loc_n = top_scope ? top_scope->framebase_location_cases.first : &nil_framebase_loc_case; + framebase_loc_n != 0; + framebase_loc_n = framebase_loc_n->next) + { + //- rjf: unpack framebase location + RDIM_Location framebase_loc = framebase_loc_n->location; + RDIM_Rng1U64 framebase_voff_range = framebase_loc_n->voff_range; + + //- rjf: set up type stack for type-evaluating bytecode + typedef struct D2R2_ExprVal D2R2_ExprVal; + struct D2R2_ExprVal + { + RDI_TypeKind type_kind; + B32 is_addr; + }; + typedef struct D2R2_ExprValNode D2R2_ExprValNode; + struct D2R2_ExprValNode + { + D2R2_ExprValNode *next; + D2R2_ExprVal v; + }; + D2R2_ExprValNode *val_stack_top = 0; + D2R2_ExprValNode *free_val = 0; + + //- rjf: process DWARF bytecode; produce RDI bytecode + mini-type-info for the expression's result + typedef struct JumpOpNode JumpOpNode; + struct JumpOpNode + { + JumpOpNode *next; + RDIM_EvalBytecodeOp *op; + S64 inst_delta; + }; + JumpOpNode *first_jump_op = 0; + JumpOpNode *last_jump_op = 0; + RDIM_EvalBytecode dst_bytecode = {0}; + B32 dst_bytecode_is_good = 1; + B32 bytecode_is_framebase_dependent = 0; + for(U64 expr_off = 0; expr_off < expr.size;) + { + U64 start_expr_off = expr_off; + + //- rjf: read next opcode + DW_ExprOp opcode = 0; + expr_off += str8_deserial_read_struct(expr, expr_off, &opcode); + + //- rjf: read op operands + U64 operands_count = dw_operand_count_from_expr_op(opcode); + DW_ExprOperandType *operands_types = dw_operand_types_from_expr_opcode(opcode); + U64 operand_u64s[2] = {0}; + S64 operand_s64s[2] = {0}; + String8 operand_str8s[2] = {0}; + for EachIndex(operand_idx, operands_count) + { + switch(operands_types[operand_idx]) + { + case DW_ExprOperandType_Null: + default:{}break; + case DW_ExprOperandType_U8: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 1, 1);}break; + case DW_ExprOperandType_U16: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 2, 2);}break; + case DW_ExprOperandType_U32: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 4, 4);}break; + case DW_ExprOperandType_U64: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 8, 8);}break; + case DW_ExprOperandType_S8: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 1, 1);}break; + case DW_ExprOperandType_S16: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 2, 2);}break; + case DW_ExprOperandType_S32: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 4, 4);}break; + case DW_ExprOperandType_S64: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 8, 8);}break; + case DW_ExprOperandType_ULEB128: {expr_off += str8_deserial_read_uleb128(expr, expr_off, &operand_u64s[operand_idx]);} break; + case DW_ExprOperandType_SLEB128: {expr_off += str8_deserial_read_sleb128(expr, expr_off, &operand_s64s[operand_idx]);} break; + case DW_ExprOperandType_Addr: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], unit_parse_ctx->addr_size, unit_parse_ctx->addr_size);}break; + case DW_ExprOperandType_DwarfUInt: {expr_off += dw2_read_fmt_u64(expr, expr_off, unit_parse_ctx->format, &operand_u64s[operand_idx]);}break; + case DW_ExprOperandType_Block: + { + U8 block_size = 0; + expr_off += str8_deserial_read_struct(expr, expr_off, &block_size); + operand_str8s[operand_idx] = str8_substr(expr, r1u64(expr_off, expr_off+block_size)); + expr_off += block_size; + }break; + } + } + + //- rjf: pop stack values + D2R2_ExprVal popped_vals[2] = {0}; + { + U64 pop_count = dw_pop_count_from_expr_op(opcode); + pop_count = Min(pop_count, ArrayCount(popped_vals)); + for EachIndex(pop_idx, pop_count) + { + if(val_stack_top != 0) + { + D2R2_ExprValNode *popped = val_stack_top; + popped_vals[pop_idx] = popped->v; + SLLStackPop(val_stack_top); + SLLStackPush(free_val, popped); + } + } + } + + //- rjf: exec op (produce RDI bytecode, + manipulate value stack) + D2R2_ExprVal push_vals[2] = {0}; + U64 regcode_dw = 0; + S64 regval_off = 0; + B32 regread_is_addr = 0; + U64 target_pick_val_idx = 0; + RDI_EvalOp rdi_eval_op = 0; + U64 memread_size = 0; + switch(opcode) + { + default:{}break; + + //- rjf: small opcode-embedded unsigned literals + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: + { + U64 lit_val = (U64)(opcode - DW_ExprOp_Lit0); + rdim_bytecode_push_uconst(arena, &dst_bytecode, lit_val); + }break; + + //- rjf: small unsigned literals + case DW_ExprOp_Const1U: push_vals[0].type_kind = RDI_TypeKind_U8; goto const_u; + case DW_ExprOp_Const2U: push_vals[0].type_kind = RDI_TypeKind_U16; goto const_u; + case DW_ExprOp_Const4U: push_vals[0].type_kind = RDI_TypeKind_U32; goto const_u; + case DW_ExprOp_Const8U: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; + case DW_ExprOp_ConstU: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; + const_u:; + { + rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); + }break; + + //- rjf: small signed literals + case DW_ExprOp_Const1S: push_vals[0].type_kind = RDI_TypeKind_S8; goto const_s; + case DW_ExprOp_Const2S: push_vals[0].type_kind = RDI_TypeKind_S16; goto const_s; + case DW_ExprOp_Const4S: push_vals[0].type_kind = RDI_TypeKind_S32; goto const_s; + case DW_ExprOp_Const8S: push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; + case DW_ExprOp_ConstS : push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; + const_s:; + { + rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); + }break; + + //- rjf: address (module offsets) + case DW_ExprOp_Addr: + { + U64 voff = operand_u64s[0] - base_vaddr; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + }break; + case DW_ExprOp_Addrx: + if(unit_parse_ctx->addr_table != 0) + { + U64 addr_idx = operand_u64s[0]; + U64 addr = 0; + if(dw2_try_offset_from_table_idx(unit_parse_ctx->addr_table, addr_idx, &addr)) + { + U64 voff = (addr > base_vaddr) ? (addr - base_vaddr) : 0; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + } + }break; + + //- rjf: register reads + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + { + regcode_dw = (U64)(opcode - DW_ExprOp_Reg0); + }goto reg_read; + case DW_ExprOp_RegX: + { + regcode_dw = operand_u64s[0]; + }goto reg_read; + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + { + regcode_dw = (U64)(opcode - DW_ExprOp_BReg0); + regval_off = operand_s64s[1]; + regread_is_addr = 1; + }goto reg_read; + case DW_ExprOp_BRegX: + { + regcode_dw = operand_u64s[0]; + regval_off = operand_s64s[1]; + regread_is_addr = 1; + }goto reg_read; + reg_read:; + { + // rjf: DWARF regcode -> RDI, off, size + RDI_RegCode regcode_rdi = 0; + U64 reg_off = 0; + U64 reg_size = 0; + switch((Arch)arch) + { + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm32: + case Arch_arm64: + case Arch_x86: + { + // TODO(rjf): unsupported architectures + }break; + case Arch_x64: + { + switch(regcode_dw) + { + default:{}break; +#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw:{regcode_rdi = RDI_RegCodeX64_##reg_rdi; reg_off = (off); reg_size = (size);}break; + DW_Regs_X64_XList +#undef X + } + }break; + } + + // rjf: push op + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_RegRead, RDI_EncodeRegReadParam(regcode_rdi, reg_size, reg_off)); + + // rjf: push add to value offset, if needed + if(regval_off != 0) + { + rdim_bytecode_push_sconst(arena, &dst_bytecode, regval_off); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); + } + + // rjf: choose if we're doing a float op + B32 is_float_op = 0; + if(arch == Arch_x64 && + (regcode_rdi == RDI_RegCodeX64_st0 || + regcode_rdi == RDI_RegCodeX64_st1 || + regcode_rdi == RDI_RegCodeX64_st2 || + regcode_rdi == RDI_RegCodeX64_st3 || + regcode_rdi == RDI_RegCodeX64_st4 || + regcode_rdi == RDI_RegCodeX64_st5 || + regcode_rdi == RDI_RegCodeX64_st6 || + regcode_rdi == RDI_RegCodeX64_st7)) + { + is_float_op = 1; + } + + // rjf: set up push value + push_vals[0].is_addr = regread_is_addr; + if(is_float_op) + { + switch(reg_size) + { + default:{}break; + case 2: {push_vals[0].type_kind = RDI_TypeKind_F16;}break; + case 4: {push_vals[0].type_kind = RDI_TypeKind_F32;}break; + case 6: {push_vals[0].type_kind = RDI_TypeKind_F48;}break; + case 8: {push_vals[0].type_kind = RDI_TypeKind_F64;}break; + case 10:{push_vals[0].type_kind = RDI_TypeKind_F80;}break; + case 12:{push_vals[0].type_kind = RDI_TypeKind_F96;}break; + case 16:{push_vals[0].type_kind = RDI_TypeKind_F128;}break; + } + } + else + { + switch(reg_size) + { + default:{}break; + case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; + case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; + case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; + case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; + } + } + }break; + + //- rjf: implicit values + case DW_ExprOp_ImplicitValue: + { + if(operand_str8s[0].size <= sizeof(U64)) + { + U64 implicit_value = 0; + MemoryCopy(&implicit_value, operand_str8s[0].str, Min(sizeof(U64), operand_str8s[0].size)); + rdim_bytecode_push_uconst(arena, &dst_bytecode, implicit_value); + switch(operand_str8s[0].size) + { + default:{}break; + case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; + case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; + case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; + case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; + } + } + else + { + log_infof("[.debug_info@0x%I64x] Implicit value DWARF expression operation (DW_ExprOp_ImplicitValue) with block size >8 (%I64u) found. This is not currently supported.\n", start_off, operand_str8s[0].size); + } + }break; + + //- rjf: pieces + case DW_ExprOp_Piece: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValue, operand_u64s[0]); + }break; + case DW_ExprOp_BitPiece: + { + U64 size = operand_u64s[0]; + U64 off = operand_u64s[1]; + U64 partial_value = ((size<<32)|(off)); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValueBit, partial_value); + }break; + + //- rjf: stack ops + case DW_ExprOp_Over: {target_pick_val_idx = 1;}goto pick; + case DW_ExprOp_Pick: {target_pick_val_idx = operand_u64s[0];}goto pick; + case DW_ExprOp_Dup: {target_pick_val_idx = 0;}goto pick; + pick:; + { + // rjf: pick value from stack + D2R2_ExprVal picked_val = {0}; + { + U64 idx = 0; + for(D2R2_ExprValNode *n = val_stack_top; n != 0; n = n->next) + { + if(idx == target_pick_val_idx) + { + picked_val = n->v; + break; + } + } + } + + // rjf: push opcode + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pick, target_pick_val_idx); + + // rjf: push val + push_vals[0] = picked_val; + }break; + case DW_ExprOp_Swap: + { + push_vals[0] = popped_vals[1]; + push_vals[1] = popped_vals[0]; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Swap, 0); + }break; + case DW_ExprOp_Drop: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pop, 0); + }break; + + //- rjf: jumps + case DW_ExprOp_Skip: rdi_eval_op = RDI_EvalOp_Skip; goto jumps; + case DW_ExprOp_Bra: rdi_eval_op = RDI_EvalOp_Cond; goto jumps; + jumps:; + { + // rjf: jump delta in bytes (how the instruction is encoded) -> jump delta in instructions + S64 jump_delta_bytes = operand_s64s[0]; + S64 jump_delta_insts = 0; + { + // TODO(rjf): expr op jumps bytes -> inst counts + } + + // rjf: push incomplete op (we need to resolve inst delta -> byte delta later, once we have the full bytecode stream) + RDIM_EvalBytecodeOp *op = rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, 0); + + // rjf: gather op + JumpOpNode *n = push_array(scratch2.arena, JumpOpNode, 1); + SLLQueuePush(first_jump_op, last_jump_op, n); + n->op = op; + n->inst_delta = jump_delta_insts; + }break; + + //- rjf: containing procedure frame offsets + case DW_ExprOp_FBReg: + { + bytecode_is_framebase_dependent = 1; + for EachNode(n, RDIM_EvalBytecodeOp, framebase_loc.bytecode.first_op) + { + rdim_bytecode_push_op(arena, &dst_bytecode, n->op, n->p); + } + rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + }break; + + //- rjf: memory reads + case DW_ExprOp_Deref: memread_size = unit_parse_ctx->addr_size; goto deref; + case DW_ExprOp_DerefSize: memread_size = operand_u64s[0]; goto deref; + deref:; + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_MemRead, memread_size); + push_vals[0].is_addr = 1; + push_vals[0].type_kind = RDI_TypeKind_U64; + }break; + + //- rjf: TLS offsets + case DW_ExprOp_FormTlsAddress: + case DW_ExprOp_GNU_PushTlsAddress: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_TLSOff, 0); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); + push_vals[0].is_addr = 1; + push_vals[0].type_kind = RDI_TypeKind_U64; + is_tls_dependent = 1; + }break; + + //- rjf: call site value + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: + { + // TODO(rjf): expr op entry value ops + }break; + + //- rjf: fixed adds + case DW_ExprOp_PlusUConst: + { + rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); + push_vals[0].type_kind = RDI_TypeKind_U64; // TODO(rjf): do we need to adjust this based on popped value at all, even? + }break; + + //- rjf: arithmetic ops + case DW_ExprOp_Eq: {rdi_eval_op = RDI_EvalOp_EqEq;}goto arithmetic_op; + case DW_ExprOp_Ge: {rdi_eval_op = RDI_EvalOp_GrEq;}goto arithmetic_op; + case DW_ExprOp_Gt: {rdi_eval_op = RDI_EvalOp_Grtr;}goto arithmetic_op; + case DW_ExprOp_Le: {rdi_eval_op = RDI_EvalOp_LsEq;}goto arithmetic_op; + case DW_ExprOp_Lt: {rdi_eval_op = RDI_EvalOp_Less;}goto arithmetic_op; + case DW_ExprOp_Ne: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; + case DW_ExprOp_Div: {rdi_eval_op = RDI_EvalOp_Div;}goto arithmetic_op; + case DW_ExprOp_Minus: {rdi_eval_op = RDI_EvalOp_Sub;}goto arithmetic_op; + case DW_ExprOp_Mul: {rdi_eval_op = RDI_EvalOp_Mul;}goto arithmetic_op; + case DW_ExprOp_Plus: {rdi_eval_op = RDI_EvalOp_Add;}goto arithmetic_op; + case DW_ExprOp_Xor: {rdi_eval_op = RDI_EvalOp_BitXor;}goto arithmetic_op; + case DW_ExprOp_And: {rdi_eval_op = RDI_EvalOp_BitAnd;}goto arithmetic_op; + case DW_ExprOp_Or: {rdi_eval_op = RDI_EvalOp_BitOr;}goto arithmetic_op; + case DW_ExprOp_Shl: {rdi_eval_op = RDI_EvalOp_LShift;}goto arithmetic_op; + case DW_ExprOp_Shr: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; + case DW_ExprOp_Shra: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; + case DW_ExprOp_Mod: {rdi_eval_op = RDI_EvalOp_Mod;}goto arithmetic_op; + case DW_ExprOp_Abs: {rdi_eval_op = RDI_EvalOp_Abs;}goto arithmetic_op; + case DW_ExprOp_Neg: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; + case DW_ExprOp_Not: {rdi_eval_op = RDI_EvalOp_LogNot;}goto arithmetic_op; + arithmetic_op:; + { + // TODO(rjf): eval arithmetic conversions etc. + rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, RDI_EvalTypeGroup_U); + }break; + + //- rjf: currently unsupported + case DW_ExprOp_XDeref: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression XDeref operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_XDerefSize: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression XDerefSize operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression call operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_ImplicitPointer: + case DW_ExprOp_GNU_ImplicitPointer: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression implicit pointer operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_GNU_ParameterRef: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression GNU_ParameterRef operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_DerefType: + case DW_ExprOp_GNU_DerefType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression DerefType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_ConstType: + case DW_ExprOp_GNU_ConstType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression ConstType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_RegvalType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression RegvalType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_PushObjectAddress: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression PushObjectAddress operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_Rot: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression Rot (rotate) operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_GNU_UnInit: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression GNU_UnInit operation encountered. This is not supported for location info.\n", start_off); + // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; + } break; + } + + //- rjf: push values to stack + { + U64 push_count = dw_push_count_from_expr_op(opcode); + push_count = Min(push_count, ArrayCount(push_vals)); + for EachIndex(push_idx, push_count) + { + D2R2_ExprValNode *n = free_val; + if(n != 0) + { + SLLStackPop(free_val); + } + else + { + n = push_array(scratch2.arena, D2R2_ExprValNode, 1); + } + n->v = push_vals[push_idx]; + SLLStackPush(val_stack_top, n); + } + } + + if(expr_off == start_expr_off) + { + break; + } + } + + //- rjf: apply RDI byte offsets to jump ops + { + // TODO(rjf): apply RDI byte offsets to jump ops + } + + //- rjf: map bytecode -> RDIM_Location - we may want to simplify + RDIM_Location loc = {0}; + { + loc.kind = val_stack_top && val_stack_top->v.is_addr ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; + loc.bytecode = dst_bytecode; + + // rjf: gather first few bytecodes for pattern matching + RDI_EvalOp beginning_ops[5] = {0}; + RDIM_EvalBytecodeOp *beginning_nodes[5] = {0}; + { + U64 idx = 0; + for EachNode(n, RDIM_EvalBytecodeOp, dst_bytecode.first_op) + { + if(idx >= ArrayCount(beginning_ops)) + { + break; + } + beginning_ops[idx] = n->op; + beginning_nodes[idx] = n; + idx += 1; + } + } + + // rjf: match val registers + if(loc.kind == RDI_LocationKind_ValBytecodeStream && + beginning_ops[0] == RDI_EvalOp_RegRead && + beginning_ops[1] == RDI_EvalOp_Stop) + { + U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; + U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; + U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; + if(byte_size == unit_parse_ctx->addr_size && + byte_off == 0) + { + loc.kind = RDI_LocationKind_ValReg; + loc.reg_code = rdi_reg_code; + } + } + + // rjf: match simple register offsets + if(loc.kind == RDI_LocationKind_AddrBytecodeStream && + beginning_ops[0] == RDI_EvalOp_RegRead && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16) && + beginning_ops[2] == RDI_EvalOp_TruncSigned && + beginning_ops[3] == RDI_EvalOp_Add && + beginning_ops[4] == RDI_EvalOp_Stop) + { + U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; + U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; + U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; + if(byte_off == 0 && byte_size == unit_parse_ctx->addr_size) + { + loc.kind = RDI_LocationKind_AddrRegPlusOff; + loc.reg_code = rdi_reg_code; + loc.offset = beginning_nodes[1]->p; + } + } + + // rjf: match simple module offsets + if(beginning_ops[0] == RDI_EvalOp_ModuleOff && beginning_ops[1] == RDI_EvalOp_Stop) + { + U64 voff = beginning_nodes[0]->p; + loc.kind = RDI_LocationKind_ModuleOff; + loc.offset = voff; + } + else if(((beginning_ops[0] == RDI_EvalOp_ModuleOff && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16 || + beginning_ops[1] == RDI_EvalOp_ConstU32 || + beginning_ops[1] == RDI_EvalOp_ConstU64)) || + (beginning_ops[1] == RDI_EvalOp_ModuleOff && + (beginning_ops[0] == RDI_EvalOp_ConstU8 || + beginning_ops[0] == RDI_EvalOp_ConstU16 || + beginning_ops[0] == RDI_EvalOp_ConstU32 || + beginning_ops[0] == RDI_EvalOp_ConstU64))) && + beginning_ops[2] == RDI_EvalOp_Add && + beginning_ops[3] == RDI_EvalOp_Stop) + { + U64 voff = beginning_nodes[0]->p + beginning_nodes[1]->p; + loc.kind = RDI_LocationKind_ModuleOff; + loc.offset = voff; + } + + // rjf: match simple TLS offsets + if(beginning_ops[0] == RDI_EvalOp_TLSOff && beginning_ops[1] == RDI_EvalOp_Stop) + { + U64 toff = beginning_nodes[0]->p; + loc.kind = RDI_LocationKind_TLSOff; + loc.offset = toff; + } + else if(((beginning_ops[0] == RDI_EvalOp_TLSOff && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16 || + beginning_ops[1] == RDI_EvalOp_ConstU32 || + beginning_ops[1] == RDI_EvalOp_ConstU64)) || + (beginning_ops[1] == RDI_EvalOp_TLSOff && + (beginning_ops[0] == RDI_EvalOp_ConstU8 || + beginning_ops[0] == RDI_EvalOp_ConstU16 || + beginning_ops[0] == RDI_EvalOp_ConstU32 || + beginning_ops[0] == RDI_EvalOp_ConstU64))) && + beginning_ops[2] == RDI_EvalOp_Add && + beginning_ops[3] == RDI_EvalOp_Stop) + { + U64 toff = beginning_nodes[0]->p + beginning_nodes[1]->p; + loc.kind = RDI_LocationKind_TLSOff; + loc.offset = toff; + } + } + + //- rjf: collect + { + RDIM_Rng1U64 voff_range = {range.min - base_vaddr, range.max - base_vaddr}; + if(bytecode_is_framebase_dependent) + { + voff_range.min = Max(voff_range.min, framebase_voff_range.min); + voff_range.max = Min(voff_range.max, framebase_voff_range.max); + } + rdim_location_case_list_push(arena, dst_locations, loc, voff_range); + dst_is_tls_dependent[0] = is_tls_dependent; + } + + //- rjf: not frame-base dependent? -> break - don't do this per-framebase case + if(!bytecode_is_framebase_dependent) + { + break; + } + } + } + } + } + + //////////////////////// + //- rjf: produce symbols from tag + // + RDIM_Scope *new_scope_open = 0; + switch(tag.kind) + { + default:{}break; + + //- rjf: subprograms (procedures) + case DW_TagKind_SubProgram: + { + RDIM_Scope *root_scope = rdim_scope_chunk_list_push(arena, &dst_artifacts->scopes, chunk_count); + RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_artifacts->procedures, chunk_count); + procedure->name = name; + procedure->link_name = link_name; + procedure->type = type; + procedure->root_scope = root_scope; + procedure->location_cases = framebase_location_cases; + root_scope->symbol = procedure; + root_scope->voff_ranges = ranges; + dst_artifacts->scopes.scope_voff_count += 2*ranges.count; + new_scope_open = root_scope; + }break; + + //- rjf: inline site + case DW_TagKind_InlinedSubroutine: + { + + }break; + + //- rjf: variables + case DW_TagKind_Variable: + case DW_TagKind_FormalParameter: + if(name.size != 0) + { + U64 var_chunk_count = chunk_count; + RDIM_SymbolChunkList *dst_symbols = &dst_artifacts->global_variables; + if(location_is_tls_dependent) + { + dst_symbols = &dst_artifacts->thread_variables; + } + else if(top_scope != 0) + { + dst_symbols = &top_scope->scope->locals; + var_chunk_count = 8; + } + RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, dst_symbols, var_chunk_count); + var->is_extern = is_external; + var->is_param = (tag.kind == DW_TagKind_FormalParameter); + var->name = name; + var->link_name = link_name; + var->type = type; + if(top_scope != 0) + { + var->container_scope = top_scope->scope; + } + var->location_cases = location_cases; + }break; + + //- rjf: lexical blocks (scopes) + case DW_TagKind_LexicalBlock: + { + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &dst_artifacts->scopes, chunk_count); + scope->voff_ranges = ranges; + dst_artifacts->scopes.scope_voff_count += 2*ranges.count; + new_scope_open = scope; + }break; + } + + //////////////////////// + //- rjf: push scopes + // + if(new_scope_open) + { + // rjf: insert scope to parent + if(top_scope != 0) + { + RDIM_Scope *parent = top_scope->scope; + SLLQueuePush_N(parent->first_child, parent->last_child, new_scope_open, next_sibling); + new_scope_open->parent_scope = parent; + if(new_scope_open->symbol == 0) + { + new_scope_open->symbol = parent->symbol; + } + } + + // rjf: push new scope to stack + D2R2_ScopeNode *n = free_scope; + if(n != 0) + { + SLLStackPop(free_scope); + } + else + { + n = push_array(scratch.arena, D2R2_ScopeNode, 1); + } + n->scope = new_scope_open; + if(framebase_attrib != &dw2_attrib_nil) + { + n->framebase_location_cases = framebase_location_cases; } else if(top_scope != 0) { - dst_symbols = &top_scope->scope->locals; - var_chunk_count = 8; - } - RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, dst_symbols, var_chunk_count); - var->is_extern = is_external; - var->is_param = (tag.kind == DW_TagKind_FormalParameter); - var->name = name; - var->link_name = link_name; - var->type = type; - if(top_scope != 0) - { - var->container_scope = top_scope->scope; - } - var->location_cases = location_cases; - }break; - - //- rjf: lexical blocks (scopes) - case DW_TagKind_LexicalBlock: - { - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &dst_unit->scopes, chunk_count); - scope->voff_ranges = ranges; - dst_unit->scopes.scope_voff_count += 2*ranges.count; - new_scope_open = scope; - }break; - } - - //////////////////////// - //- rjf: push scopes - // - if(new_scope_open) - { - // rjf: insert scope to parent - if(top_scope != 0) - { - RDIM_Scope *parent = top_scope->scope; - SLLQueuePush_N(parent->first_child, parent->last_child, new_scope_open, next_sibling); - new_scope_open->parent_scope = parent; - if(new_scope_open->symbol == 0) - { - new_scope_open->symbol = parent->symbol; + n->framebase_location_cases = top_scope->framebase_location_cases; } + SLLStackPush(top_scope, n); } - // rjf: push new scope to stack - D2R2_ScopeNode *n = free_scope; - if(n != 0) + //////////////////////// + //- rjf: pop scopes + // + if(tag.kind == DW_TagKind_Null && top_scope != 0) { - SLLStackPop(free_scope); + D2R2_ScopeNode *n = top_scope; + SLLStackPop(top_scope); + SLLStackPush(free_scope, n); } - else + + //////////////////////// + //- rjf: tree nav + // + if(tag.has_children) { - n = push_array(scratch.arena, D2R2_ScopeNode, 1); + depth += 1; } - n->scope = new_scope_open; - if(framebase_attrib != &dw2_attrib_nil) + if(tag.kind == DW_TagKind_Null) { - n->framebase_location_cases = framebase_location_cases; + depth -= 1; } - else if(top_scope != 0) + + scratch_end(scratch2); + if(off == start_off) { - n->framebase_location_cases = top_scope->framebase_location_cases; + break; } - SLLStackPush(top_scope, n); - } - - //////////////////////// - //- rjf: pop scopes - // - if(tag.kind == DW_TagKind_Null && top_scope != 0) - { - D2R2_ScopeNode *n = top_scope; - SLLStackPop(top_scope); - SLLStackPush(free_scope, n); - } - - scratch_end(scratch2); - if(off == start_off) - { - break; } } } + lane_sync(); + } + + //////////////////////////// + //- rjf: join all symbols from all sub-unit works into their units + // + ProfScope("join all symbols from all sub-unit works into their units") + { + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= unit_count) + { + break; + } + RDIM_Unit *dst_unit = unit_from_idx_map[unit_idx]; + for EachIndex(work_idx, sub_unit_works_count) + { + if(sub_unit_works[work_idx].unit_idx == unit_idx) + { + rdim_symbol_chunk_list_concat_in_place(&dst_unit->global_variables, &sub_unit_work_artifacts[work_idx].global_variables); + rdim_symbol_chunk_list_concat_in_place(&dst_unit->thread_variables, &sub_unit_work_artifacts[work_idx].thread_variables); + rdim_symbol_chunk_list_concat_in_place(&dst_unit->constants, &sub_unit_work_artifacts[work_idx].constants); + rdim_symbol_chunk_list_concat_in_place(&dst_unit->procedures, &sub_unit_work_artifacts[work_idx].procedures); + rdim_scope_chunk_list_concat_in_place(&dst_unit->scopes, &sub_unit_work_artifacts[work_idx].scopes); + rdim_inline_site_chunk_list_concat_in_place(&dst_unit->inline_sites, &sub_unit_work_artifacts[work_idx].inline_sites); + } + } + } + lane_sync(); } //////////////////////////// From f9eb25dbcbb2cce650658677bcf2130808a6f6cb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 1 May 2026 14:12:35 -0700 Subject: [PATCH 481/850] d2r2: do unique type info gathering on a sub-unit granularity, so we can subdivide a unit across all lanes; sort unique type tag slots for determinism --- project.4coder | 2 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 703 +++++++++++++++----------- src/rdi_from_dwarf/rdi_from_dwarf_2.h | 18 + 3 files changed, 421 insertions(+), 302 deletions(-) diff --git a/project.4coder b/project.4coder index 91e82725..223f2125 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin release telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 9911ec85..87ce9de0 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1,6 +1,16 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Helpers + +internal int +d2r2_unique_type_tag_node_is_less_than(D2R2_UniqueTypeTagNode **l, D2R2_UniqueTypeTagNode **r) +{ + int is_less_than = l[0]->hash < r[0]->hash; + return is_less_than; +} + //////////////////////////////// //~ rjf: Main Conversion Entry Point (New) @@ -1429,15 +1439,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////////// //- rjf: gather all unique type tags across all units // - typedef struct UniqueTypeTagNode UniqueTypeTagNode; - struct UniqueTypeTagNode - { - UniqueTypeTagNode *next; - U64 hash; - U64 unit_idx; - U64 info_off; - U64 order_idx; - }; typedef struct UnitTypeNode UnitTypeNode; struct UnitTypeNode { @@ -1451,354 +1452,452 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) UnitTypeNode **slots; U64 slots_count; }; - UniqueTypeTagNode **unique_type_tag_slots = 0; + D2R2_UniqueTypeTagNode **unique_type_tag_slots = 0; U64 unique_type_tag_slots_count = total_tag_count_estimate/8 + 1; UnitTypeMap *unit_type_maps = 0; ProfScope("gather all unique type tags across all units") { + //- rjf: set up tables if(lane_idx() == 0) { - unique_type_tag_slots = push_array(scratch.arena, UniqueTypeTagNode *, unique_type_tag_slots_count); + unique_type_tag_slots = push_array(scratch.arena, D2R2_UniqueTypeTagNode *, unique_type_tag_slots_count); unit_type_maps = push_array(scratch.arena, UnitTypeMap, unit_count); } lane_sync_u64(&unique_type_tag_slots, 0); lane_sync_u64(&unit_type_maps, 0); - U64 unit_take_idx_ = 0; - U64 *unit_take_idx_ptr = &unit_take_idx_; - lane_sync_u64(&unit_take_idx_ptr, 0); - for(;;) + + //- rjf: set up per-unit type maps { - //- rjf: take next unit - U64 origin_unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; - if(origin_unit_idx >= unit_count) + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) { - break; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + unit_type_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 256 + 1; + unit_type_maps[unit_idx].slots = push_array(scratch.arena, UnitTypeNode *, unit_type_maps[unit_idx].slots_count); } - - //- rjf: unpack unit info - Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; - - //- rjf: set up type map for this unit - unit_type_maps[origin_unit_idx].slots_count = dim_1u64(origin_unit_info_tag_range) / 256 + 1; - unit_type_maps[origin_unit_idx].slots = push_array(scratch.arena, UnitTypeNode *, unit_type_maps[origin_unit_idx].slots_count); - - //- rjf: hash all type content from tags in this unit; record if unique - for(U64 off = origin_unit_info_tag_range.min; off < origin_unit_info_tag_range.max;) + lane_sync(); + } + + //- rjf: gather unique types + { + U64 work_take_idx_ = 0; + U64 *work_take_idx_ptr = &work_take_idx_; + lane_sync_u64(&work_take_idx_ptr, 0); + for(;;) { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - U64 start_off = off; - - //- rjf: hash type tags - this requires a hash of not only type tags' - // attributes, but also a walk of all other type tags this tag references, - // and a hash of them too. so we produce a list of tasks for - // parsing/hashing tags, in order to find the full comprehensive hash - // for each type tag. - // - // importantly, doing this can cause cycles in principle, so we also - // record which tags we visited, & order them, so we can just hash the - // order index, instead of doing a full recursion. - // - B32 is_type_tag_tree = 0; - U64 hash = 0; + //- rjf: take next work + U64 work_idx = ins_atomic_u64_inc_eval(work_take_idx_ptr) - 1; + if(work_idx >= sub_unit_works_count) { - typedef struct TypeTagTask TypeTagTask; - struct TypeTagTask + break; + } + + //- rjf: unpack work + U64 origin_unit_idx = sub_unit_works[work_idx].unit_idx; + Rng1U64 origin_unit_root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; + + //- rjf: unpack unit info + Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; + + //- rjf: hash all type content from tags in this unit; record if unique + for(U64 root_tag_idx = origin_unit_root_tag_idx_range.min; root_tag_idx < origin_unit_root_tag_idx_range.max; root_tag_idx += 1) + { + S64 origin_unit_depth = 1; + for(U64 off = unit_info_root_tag_offs[origin_unit_idx].v[root_tag_idx]; + off < origin_unit_info_tag_range.max && (origin_unit_depth > 1 || off == unit_info_root_tag_offs[origin_unit_idx].v[root_tag_idx]);) { - TypeTagTask *next; - U64 unit_idx; - U64 off; - U64 order_idx; - }; - TypeTagTask start_task = {0, origin_unit_idx, off}; - TypeTagTask *top_task = &start_task; - TypeTagTask *free_task = 0; - U64 seen_task_slots_count = 16; - TypeTagTask **seen_task_slots = push_array(scratch2.arena, TypeTagTask *, seen_task_slots_count); - for(TypeTagTask *t = top_task, *next = 0; t != 0; t = next) - { - next = 0; - U64 t_off = t->off; + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; - // rjf: record this task in our seen task table + //- rjf: hash type tags - this requires a hash of not only type tags' + // attributes, but also a walk of all other type tags this tag references, + // and a hash of them too. so we produce a list of tasks for + // parsing/hashing tags, in order to find the full comprehensive hash + // for each type tag. + // + // importantly, doing this can cause cycles in principle, so we also + // record which tags we visited, & order them, so we can just hash the + // order index, instead of doing a full recursion. + // + B32 is_type_tag_tree = 0; + B32 tag_has_children = 0; + B32 tag_ends_children = 0; + U64 hash = 0; { - U64 hash = u64_hash_from_str8(str8_struct(&t->off)); - U64 slot_idx = hash%seen_task_slots_count; - SLLStackPush(seen_task_slots[slot_idx], t); - } - - // rjf: unpack unit - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; - - // rjf: read/hash the full tag tree at `t_off`; kick off additional - // tasks for referenced dependency types - U64 depth = 0; - for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max;) - { - U64 t_start_off = t_off; - - // rjf: read tag - DW2_Tag tag = {0}; - t_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, t_off, &tag); - - // rjf: determine if tag should be skipped - B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || - tag.kind == DW_TagKind_Variable); - - // rjf: record top-level info about this tag tree - if(t_start_off == t->off && t == &start_task) + typedef struct TypeTagTask TypeTagTask; + struct TypeTagTask { - is_type_tag_tree = (tag.kind == DW_TagKind_ArrayType || - tag.kind == DW_TagKind_ClassType || - tag.kind == DW_TagKind_EnumerationType || - tag.kind == DW_TagKind_PointerType || - tag.kind == DW_TagKind_ReferenceType || - tag.kind == DW_TagKind_StringType || - tag.kind == DW_TagKind_StructureType || - tag.kind == DW_TagKind_SubroutineType || - tag.kind == DW_TagKind_SubProgram || - tag.kind == DW_TagKind_Typedef || - tag.kind == DW_TagKind_UnionType || - tag.kind == DW_TagKind_PtrToMemberType || - tag.kind == DW_TagKind_SetType || - tag.kind == DW_TagKind_BaseType || - tag.kind == DW_TagKind_ConstType || - tag.kind == DW_TagKind_FileType || - tag.kind == DW_TagKind_PackedType || - tag.kind == DW_TagKind_VolatileType || - tag.kind == DW_TagKind_RestrictType || - tag.kind == DW_TagKind_InterfaceType || - tag.kind == DW_TagKind_UnspecifiedType || - tag.kind == DW_TagKind_SharedType || - tag.kind == DW_TagKind_RValueReferenceType || - tag.kind == DW_TagKind_CoarrayType || - tag.kind == DW_TagKind_DynamicType || - tag.kind == DW_TagKind_AtomicType || - tag.kind == DW_TagKind_ImmutableType); - } - - // rjf: is type -> combine tag's content into hash - if(!should_skip_tag && is_type_tag_tree) + TypeTagTask *next; + U64 unit_idx; + U64 off; + U64 order_idx; + }; + TypeTagTask start_task = {0, origin_unit_idx, off}; + TypeTagTask *top_task = &start_task; + TypeTagTask *free_task = 0; + U64 seen_task_slots_count = 16; + TypeTagTask **seen_task_slots = push_array(scratch2.arena, TypeTagTask *, seen_task_slots_count); + for(TypeTagTask *t = top_task, *next = 0; t != 0; t = next) { - // rjf: combine tag's kind - hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); + next = 0; + U64 t_off = t->off; - // rjf: combine non-reference attributes (references could be different, - // because of deduping, but they could match ultimately). for any - // referenced dependency types, kick them off - for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) + // rjf: record this task in our seen task table { - // rjf: non-reference? -> combine attribute value info - if(n->v.val.kind != DW_Form_RefAddr && - n->v.val.kind != DW_Form_Ref1 && - n->v.val.kind != DW_Form_Ref2 && - n->v.val.kind != DW_Form_Ref4 && - n->v.val.kind != DW_Form_Ref8 && - n->v.val.kind != DW_Form_RefUData && - n->v.val.kind != DW_Form_RefSup4 && - n->v.val.kind != DW_Form_RefSig8 && - ((tag.kind != DW_TagKind_SubProgram && - tag.kind != DW_TagKind_FormalParameter) || - (n->v.attrib_kind != DW_AttribKind_Name && - n->v.attrib_kind != DW_AttribKind_DeclFile && - n->v.attrib_kind != DW_AttribKind_DeclLine && - n->v.attrib_kind != DW_AttribKind_Prototyped && - n->v.attrib_kind != DW_AttribKind_External && - n->v.attrib_kind != DW_AttribKind_FrameBase && - n->v.attrib_kind != DW_AttribKind_Location && - n->v.attrib_kind != DW_AttribKind_LowPc && - n->v.attrib_kind != DW_AttribKind_HighPc))) + U64 hash = u64_hash_from_str8(str8_struct(&t->off)); + U64 slot_idx = hash%seen_task_slots_count; + SLLStackPush(seen_task_slots[slot_idx], t); + } + + // rjf: unpack unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; + + // rjf: read/hash the full tag tree at `t_off`; kick off additional + // tasks for referenced dependency types + U64 depth = 0; + for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max;) + { + U64 t_start_off = t_off; + + // rjf: read tag + DW2_Tag tag = {0}; + t_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, t_off, &tag); + + // rjf: determine if tag should be skipped + B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || + tag.kind == DW_TagKind_Variable); + + // rjf: record top-level info about this tag tree + if(t_start_off == t->off && t == &start_task) { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); - hash = u64_hash_from_seed_str8(hash, n->v.val.string); + is_type_tag_tree = (tag.kind == DW_TagKind_ArrayType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_EnumerationType || + tag.kind == DW_TagKind_PointerType || + tag.kind == DW_TagKind_ReferenceType || + tag.kind == DW_TagKind_StringType || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_Typedef || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_PtrToMemberType || + tag.kind == DW_TagKind_SetType || + tag.kind == DW_TagKind_BaseType || + tag.kind == DW_TagKind_ConstType || + tag.kind == DW_TagKind_FileType || + tag.kind == DW_TagKind_PackedType || + tag.kind == DW_TagKind_VolatileType || + tag.kind == DW_TagKind_RestrictType || + tag.kind == DW_TagKind_InterfaceType || + tag.kind == DW_TagKind_UnspecifiedType || + tag.kind == DW_TagKind_SharedType || + tag.kind == DW_TagKind_RValueReferenceType || + tag.kind == DW_TagKind_CoarrayType || + tag.kind == DW_TagKind_DynamicType || + tag.kind == DW_TagKind_AtomicType || + tag.kind == DW_TagKind_ImmutableType); + tag_has_children = tag.has_children; + tag_ends_children = (tag.kind == DW_TagKind_Null); } - // rjf: type reference? -> if seen, combine the order; if not, recurse - if(n->v.attrib_kind == DW_AttribKind_Type) + // rjf: is type -> combine tag's content into hash + if(!should_skip_tag && is_type_tag_tree) { - // rjf: unpack reference - U64 ref_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); + // rjf: combine tag's kind + hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); - // rjf: determine if we've seen this reference - B32 already_seen = 0; - U64 already_seen_order_idx = 0; + // rjf: combine non-reference attributes (references could be different, + // because of deduping, but they could match ultimately). for any + // referenced dependency types, kick them off + for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) { - U64 off_hash = u64_hash_from_str8(str8_struct(&ref_info_off)); - U64 off_slot_idx = off_hash%seen_task_slots_count; - for(TypeTagTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) + // rjf: non-reference? -> combine attribute value info + if(n->v.val.kind != DW_Form_RefAddr && + n->v.val.kind != DW_Form_Ref1 && + n->v.val.kind != DW_Form_Ref2 && + n->v.val.kind != DW_Form_Ref4 && + n->v.val.kind != DW_Form_Ref8 && + n->v.val.kind != DW_Form_RefUData && + n->v.val.kind != DW_Form_RefSup4 && + n->v.val.kind != DW_Form_RefSig8 && + ((tag.kind != DW_TagKind_SubProgram && + tag.kind != DW_TagKind_FormalParameter) || + (n->v.attrib_kind != DW_AttribKind_Name && + n->v.attrib_kind != DW_AttribKind_DeclFile && + n->v.attrib_kind != DW_AttribKind_DeclLine && + n->v.attrib_kind != DW_AttribKind_Prototyped && + n->v.attrib_kind != DW_AttribKind_External && + n->v.attrib_kind != DW_AttribKind_FrameBase && + n->v.attrib_kind != DW_AttribKind_Location && + n->v.attrib_kind != DW_AttribKind_LowPc && + n->v.attrib_kind != DW_AttribKind_HighPc))) { - if(t->off == ref_info_off) + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); + hash = u64_hash_from_seed_str8(hash, n->v.val.string); + } + + // rjf: type reference? -> if seen, combine the order; if not, recurse + if(n->v.attrib_kind == DW_AttribKind_Type) + { + // rjf: unpack reference + U64 ref_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); + + // rjf: determine if we've seen this reference + B32 already_seen = 0; + U64 already_seen_order_idx = 0; { - already_seen = 1; - already_seen_order_idx = t->order_idx; - break; + U64 off_hash = u64_hash_from_str8(str8_struct(&ref_info_off)); + U64 off_slot_idx = off_hash%seen_task_slots_count; + for(TypeTagTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) + { + if(t->off == ref_info_off) + { + already_seen = 1; + already_seen_order_idx = t->order_idx; + break; + } + } + } + + // rjf: if we've seen -> hash the order + if(already_seen) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&already_seen_order_idx)); + } + + // rjf: if we've not seen -> descend + if(!already_seen) + { + TypeTagTask *dependency_task = free_task; + if(dependency_task != 0) + { + SLLStackPop(free_task); + } + else + { + dependency_task = push_array(scratch2.arena, TypeTagTask, 1); + } + next = dependency_task; + dependency_task->off = ref_info_off; + dependency_task->unit_idx = t->unit_idx; + if(!contains_1u64(unit_info_tag_range, dependency_task->off)) + { + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + dependency_task->unit_idx = new_unit_num-1; + } + } + dependency_task->order_idx = t->order_idx+1; } } } - - // rjf: if we've seen -> hash the order - if(already_seen) - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&already_seen_order_idx)); - } - - // rjf: if we've not seen -> descend - if(!already_seen) - { - TypeTagTask *dependency_task = free_task; - if(dependency_task != 0) - { - SLLStackPop(free_task); - } - else - { - dependency_task = push_array(scratch2.arena, TypeTagTask, 1); - } - next = dependency_task; - dependency_task->off = ref_info_off; - dependency_task->unit_idx = t->unit_idx; - if(!contains_1u64(unit_info_tag_range, dependency_task->off)) - { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - dependency_task->unit_idx = new_unit_num-1; - } - } - dependency_task->order_idx = t->order_idx+1; - } + } + + // rjf: is type tag tree, has children -> descend + if(is_type_tag_tree && tag.has_children) + { + depth += 1; + } + + // rjf: zero tag kind -> ascend + if(is_type_tag_tree && tag.kind == DW_TagKind_Null && depth > 0) + { + depth -= 1; + } + + // rjf: no advancing? -> +1 + if(t_off == t_start_off) + { + t_off += 1; + } + + // rjf: depth == 0? -> done + if(depth == 0) + { + break; + } + } + + // rjf: is this the starter task? -> advance base reading offset, apply depth changes to origin unit scan loop + if(t == &start_task) + { + off = t_off; + } + } + } + + //- rjf: if offset not advanced -> increment + if(off == start_off) + { + off += 1; + } + + //- rjf: atomically gather this hash if not already gathered + if(is_type_tag_tree) + { + B32 gathered = 0; + U64 slot_idx = hash%unique_type_tag_slots_count; + for(;!gathered;) + { + // rjf: read existing slot head pointer *before* we lookup / insert + U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); + + // rjf: determine if this hash has been gathered + for(D2R2_UniqueTypeTagNode *n = (D2R2_UniqueTypeTagNode *)slot_head_val; n != 0; n = n->next) + { + if(n->hash == hash) + { + gathered = 1; + break; + } + } + + // rjf: if this hash has *not* been gathered, try an insert. we: + // + // 1. allocate/fill a node + // 2. set it up to point to the old head + // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above + // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again + // (we may find that another thread has filled this hash, so we'll just be done) + // + if(!gathered) + { + Temp insert_temp = temp_begin(scratch.arena); + D2R2_UniqueTypeTagNode *n = push_array(scratch.arena, D2R2_UniqueTypeTagNode, 1); + n->next = (D2R2_UniqueTypeTagNode *)slot_head_val; + n->hash = hash; + n->unit_idx = origin_unit_idx; + n->info_off = start_off; + U64 new_head_val = (U64)n; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_type_tag_slots[slot_idx], new_head_val, slot_head_val)) + { + gathered = 1; + } + else + { + temp_end(insert_temp); } } } - - // rjf: is type tag tree, has children -> descend - if(is_type_tag_tree && tag.has_children) + } + + //- rjf: atomically record this (info_off -> hash) mapping, so that when we have + // later references to this type, we can redirect to the deduplicated type with + // the right hash later. + if(is_type_tag_tree) + { + U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 info_off_slot_idx = info_off_hash%unit_type_maps[origin_unit_idx].slots_count; + UnitTypeNode *n = push_array(scratch.arena, UnitTypeNode, 1); + n->src_info_off = start_off; + n->dst_hash = hash; + for(B32 inserted = 0; !inserted;) { - depth += 1; - } - - // rjf: zero tag kind -> ascend - if(is_type_tag_tree && tag.kind == DW_TagKind_Null && depth > 0) - { - depth -= 1; - } - - // rjf: no advancing? -> +1 - if(t_off == t_start_off) - { - t_off += 1; - } - - // rjf: depth == 0? -> done - if(depth == 0) - { - break; + U64 slot_head_val = ins_atomic_u64_eval(&unit_type_maps[origin_unit_idx].slots[info_off_slot_idx]); + n->next = (UnitTypeNode *)slot_head_val; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_type_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) + { + inserted = 1; + } } } - // rjf: is this the starter task? -> advance base reading offset - if(t == &start_task) + //- rjf: navigate tree in origin unit - only if we are not iterating + // a type tree. the type tree will have already been processed, because + // we needed to hash all of the content. but for non-type tag trees, + // we need to descend and parse their contents, since they may contain + // types themselves. + // + if(!is_type_tag_tree) { - off = t_off; + if(tag_has_children) + { + origin_unit_depth += 1; + } + if(tag_ends_children) + { + origin_unit_depth -= 1; + } } + + scratch_end(scratch2); } } - - //- rjf: if offset not advanced -> increment - if(off == start_off) - { - off += 1; - } - - //- rjf: atomically gather this hash if not already gathered - if(is_type_tag_tree) - { - B32 gathered = 0; - U64 slot_idx = hash%unique_type_tag_slots_count; - for(;!gathered;) - { - // rjf: read existing slot head pointer *before* we lookup / insert - U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); - - // rjf: determine if this hash has been gathered - for(UniqueTypeTagNode *n = (UniqueTypeTagNode *)slot_head_val; n != 0; n = n->next) - { - if(n->hash == hash) - { - gathered = 1; - break; - } - } - - // rjf: if this hash has *not* been gathered, try an insert. we: - // - // 1. allocate/fill a node - // 2. set it up to point to the old head - // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above - // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again - // (we may find that another thread has filled this hash, so we'll just be done) - // - if(!gathered) - { - Temp insert_temp = temp_begin(scratch.arena); - UniqueTypeTagNode *n = push_array(scratch.arena, UniqueTypeTagNode, 1); - n->next = (UniqueTypeTagNode *)slot_head_val; - n->hash = hash; - n->unit_idx = origin_unit_idx; - n->info_off = start_off; - U64 new_head_val = (U64)n; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_type_tag_slots[slot_idx], new_head_val, slot_head_val)) - { - gathered = 1; - } - else - { - temp_end(insert_temp); - } - } - } - } - - //- rjf: record this (info_off -> hash) mapping, so that when we have - // later references to this type, we can redirect to the deduplicated - // type with the right hash later. - if(is_type_tag_tree) - { - U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 info_off_slot_idx = info_off_hash%unit_type_maps[origin_unit_idx].slots_count; - UnitTypeNode *n = push_array(scratch.arena, UnitTypeNode, 1); - n->src_info_off = start_off; - n->dst_hash = hash; - SLLStackPush(unit_type_maps[origin_unit_idx].slots[info_off_slot_idx], n); - } - - scratch_end(scratch2); } } lane_sync(); } + //////////////////////////// + //- rjf: sort all unique type table slots + // + ProfScope("sort all unique type table slots") + { + Rng1U64 range = lane_range(unique_type_tag_slots_count); + for EachInRange(slot_idx, range) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + D2R2_UniqueTypeTagNode **slot = &unique_type_tag_slots[slot_idx]; + + // rjf: count nodes in this slot + U64 node_count = 0; + for EachNode(n, D2R2_UniqueTypeTagNode, slot[0]) + { + node_count += 1; + } + + // rjf: flatten + D2R2_UniqueTypeTagNode **slot_nodes_array = push_array(scratch2.arena, D2R2_UniqueTypeTagNode *, node_count); + { + U64 idx = 0; + for EachNode(n, D2R2_UniqueTypeTagNode, slot[0]) + { + slot_nodes_array[idx] = n; + idx += 1; + } + } + + // rjf: sort + radsort(slot_nodes_array, node_count, d2r2_unique_type_tag_node_is_less_than); + + // rjf: re-order in the slot + { + unique_type_tag_slots[slot_idx] = 0; + for EachIndex(idx, node_count) + { + SLLStackPush(unique_type_tag_slots[slot_idx], slot_nodes_array[idx]); + } + } + + scratch_end(scratch2); + } + lane_sync(); + } + //////////////////////////// //- rjf: produce [0...n) <-> unique-tag-node mapping for all types // U64 type_count = 0; - UniqueTypeTagNode **type_tag_nodes = 0; + D2R2_UniqueTypeTagNode **type_tag_nodes = 0; ProfScope("produce [0...n) -> hash mapping for all types") if(lane_idx() == 0) { for EachIndex(slot_idx, unique_type_tag_slots_count) { - for EachNode(n, UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) + for EachNode(n, D2R2_UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) { type_count += 1; } } - type_tag_nodes = push_array(scratch.arena, UniqueTypeTagNode *, type_count); + type_tag_nodes = push_array(scratch.arena, D2R2_UniqueTypeTagNode *, type_count); U64 idx = 0; for EachIndex(slot_idx, unique_type_tag_slots_count) { - for EachNode(n, UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) + for EachNode(n, D2R2_UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) { type_tag_nodes[idx] = n; n->order_idx = idx; @@ -1853,10 +1952,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 hash = t->hash; // rjf: hash -> unique type tag node - UniqueTypeTagNode *type_tag_node = 0; + D2R2_UniqueTypeTagNode *type_tag_node = 0; { U64 slot_idx = hash%unique_type_tag_slots_count; - for(UniqueTypeTagNode *n = unique_type_tag_slots[slot_idx]; n != 0; n = n->next) + for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[slot_idx]; n != 0; n = n->next) { if(n->hash == hash) { @@ -2073,6 +2172,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) for(;max_chain_count < max_U64;) { Temp scratch2 = scratch_begin(&scratch.arena, 1); + ProfBegin("types build (chain count <= %I64u)", max_chain_count); //- rjf: gather all types in this lane that fit the dependency restriction; // find this lane's next dependency restriction @@ -2100,7 +2200,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Temp temp = temp_begin(scratch2.arena); // rjf: idx -> type tag node - UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; + D2R2_UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; U64 unit_idx = type_tag_node->unit_idx; U64 info_off = type_tag_node->info_off; @@ -2171,7 +2271,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } U64 unique_type_tag_slot_idx = direct_type_hash%unique_type_tag_slots_count; - for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == direct_type_hash) { @@ -2313,7 +2413,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_Type *param_type = 0; { U64 unique_type_tag_slot_idx = param_type_hash%unique_type_tag_slots_count; - for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == param_type_hash) { @@ -2587,6 +2687,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: update max chain count max_chain_count = next_max_chain_count; + ProfEnd(); scratch_end(scratch2); } } @@ -2616,7 +2717,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) udt->self_type = type; // rjf: idx -> type tag node - UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; + D2R2_UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; U64 unit_idx = type_tag_node->unit_idx; U64 info_off = type_tag_node->info_off; @@ -2698,7 +2799,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: hash -> type { U64 unique_type_tag_slot_idx = type_hash%unique_type_tag_slots_count; - for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == type_hash) { @@ -3112,7 +3213,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: hash -> type { U64 unique_type_tag_slot_idx = type_hash%unique_type_tag_slots_count; - for(UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == type_hash) { diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h index 91253e18..b3a119e9 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -4,6 +4,19 @@ #ifndef RDI_FROM_DWARF_2_H #define RDI_FROM_DWARF_2_H +//////////////////////////////// +//~ rjf: Helper Types + +typedef struct D2R2_UniqueTypeTagNode D2R2_UniqueTypeTagNode; +struct D2R2_UniqueTypeTagNode +{ + D2R2_UniqueTypeTagNode *next; + U64 hash; + U64 unit_idx; + U64 info_off; + U64 order_idx; +}; + //////////////////////////////// //~ rjf: Conversion Stage Inputs (New) @@ -21,6 +34,11 @@ struct D2R2_ConvertParams B32 deterministic; }; +//////////////////////////////// +//~ rjf: Helpers + +internal int d2r2_unique_type_tag_node_is_less_than(D2R2_UniqueTypeTagNode **l, D2R2_UniqueTypeTagNode **r); + //////////////////////////////// //~ rjf: Main Conversion Entry Point (New) From 4f3d9c96b8323647c3e738e3d95e17324fc9ae6a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 2 May 2026 20:25:33 -0700 Subject: [PATCH 482/850] d2r2: when deduplicating types, ensure deterministic (hash -> .debug_info off) mapping, by minimizing the .debug_info off found for a particular type hash - in theory, this step should not be necessary, but there is a mistake / broken part of this theory, which was leading to non-deterministic type graphs in a very small # of cases, due to the same hash mapping to different .debug_info offsets across runs. in theory, the hash itself should take care of this, but there is likely something important missing. in either case, minimizing the .debug_info offset is very cheap, and guarantees we parse from a deterministic place no matter what the run looks like. --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 94 ++++++++++++++++++++------- src/rdi_from_dwarf/rdi_from_dwarf_2.h | 1 - 2 files changed, 71 insertions(+), 24 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 87ce9de0..3187b10c 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -7,7 +7,7 @@ internal int d2r2_unique_type_tag_node_is_less_than(D2R2_UniqueTypeTagNode **l, D2R2_UniqueTypeTagNode **r) { - int is_less_than = l[0]->hash < r[0]->hash; + int is_less_than = (l[0]->hash < r[0]->hash); return is_less_than; } @@ -169,6 +169,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } lane_sync(); + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; //////////////////////////// //- rjf: parse all units from .debug_aranges @@ -1685,7 +1686,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) dependency_task->unit_idx = t->unit_idx; if(!contains_1u64(unit_info_tag_range, dependency_task->off)) { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); if(0 < new_unit_num && new_unit_num <= unit_count) { @@ -1748,15 +1748,61 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); // rjf: determine if this hash has been gathered + D2R2_UniqueTypeTagNode *already_gathered_node = 0; for(D2R2_UniqueTypeTagNode *n = (D2R2_UniqueTypeTagNode *)slot_head_val; n != 0; n = n->next) { if(n->hash == hash) { gathered = 1; + already_gathered_node = n; break; } } + // rjf: if this hash *has* been gathered, we want to prefer a + // deterministic unit/info offset - so we'll just prefer the + // lowest unit/offset. + // + // TODO(rjf): this seems to only be necessary because of a flaw + // in the deduplicator logic (without this part). in theory, if we + // trust the hash (all experiments suggested that we should - e.g. + // no hash collisions w/ different data were observed), then the + // same hash should imply an identical type graph. this may be false + // for reasons I do not currently understand, or due to a mistake + // somewhere. but for now, I've added this, to ensure that when there + // are many type tag trees which map to an identical hash, we always + // parse the one from the lowest .debug_info offset, just to make + // sure it's deterministic. in a multi-threaded conversion, this + // is not true in general without this step; one thread which finds + // the same type with a higher .debug_info offset may win, and so + // where exactly one type hash is parsed is not deterministic. but, + // the theory is, that shouldn't matter - the type graphs should + // match nonetheless. in any case, if that turns out to be a broken + // theory, this should be a relatively cheap step to guarantee + // deterministic (hash -> .debug_info offset), which is likely a + // desirable property regardless. but I wanted to leave this here + // so that I can more closely verify what is going on later. + // + if(gathered && already_gathered_node != 0) + { + B32 minimized = 0; + for(;!minimized;) + { + U64 stored_info_off = ins_atomic_u64_eval(&already_gathered_node->info_off); + if(start_off < stored_info_off) + { + if(ins_atomic_u64_eval_cond_assign(&already_gathered_node->info_off, start_off, stored_info_off) == stored_info_off) + { + minimized = 1; + } + } + else + { + minimized = 1; + } + } + } + // rjf: if this hash has *not* been gathered, try an insert. we: // // 1. allocate/fill a node @@ -1771,7 +1817,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) D2R2_UniqueTypeTagNode *n = push_array(scratch.arena, D2R2_UniqueTypeTagNode, 1); n->next = (D2R2_UniqueTypeTagNode *)slot_head_val; n->hash = hash; - n->unit_idx = origin_unit_idx; + // n->unit_idx = origin_unit_idx; n->info_off = start_off; U64 new_head_val = (U64)n; if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_type_tag_slots[slot_idx], new_head_val, slot_head_val)) @@ -1829,8 +1875,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } } + lane_sync(); } - lane_sync(); } //////////////////////////// @@ -1971,7 +2017,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) if(type_tag_node != 0) { info_off = type_tag_node->info_off; - unit_idx = type_tag_node->unit_idx; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + unit_idx = unit_num > 0 ? unit_num-1 : 0; } // rjf: record this type in the dependency chain count @@ -2009,7 +2056,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) case DW_TagKind_VolatileType: case DW_TagKind_ConstType: case DW_TagKind_ArrayType: - case DW_TagKind_SubrangeType: case DW_TagKind_Typedef: case DW_TagKind_SubProgram: case DW_TagKind_SubroutineType: @@ -2022,7 +2068,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 direct_type_unit_idx = unit_idx; if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); if(0 < new_unit_num && new_unit_num <= unit_count) { @@ -2055,7 +2100,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 direct_type_unit_idx = unit_idx; if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); if(0 < new_unit_num && new_unit_num <= unit_count) { @@ -2109,17 +2153,21 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: spawn task - TypeChainTask *new_task = free_task; - if(new_task != 0) + if(direct_type_hash != 0) { - SLLStackPop(free_task); + TypeChainTask *new_task = free_task; + if(new_task != 0) + { + SLLStackPop(free_task); + } + else + { + new_task = push_array(scratch.arena, TypeChainTask, 1); + } + new_task->next = t->next; + new_task->hash = direct_type_hash; + t->next = new_task; } - else - { - new_task = push_array(scratch.arena, TypeChainTask, 1); - } - new_task->hash = direct_type_hash; - t->next = new_task; } scratch_end(scratch2); @@ -2201,8 +2249,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: idx -> type tag node D2R2_UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; - U64 unit_idx = type_tag_node->unit_idx; U64 info_off = type_tag_node->info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; // rjf: unpack unit Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; @@ -2254,7 +2303,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 direct_type_unit_idx = unit_idx; if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); direct_type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); } @@ -2359,7 +2407,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) SLLQueuePush(first_param, last_param, n); if(!contains_1u64(unit_info_tag_range, n->type_info_off)) { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, n->type_info_off); n->type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); } @@ -2718,8 +2765,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: idx -> type tag node D2R2_UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; - U64 unit_idx = type_tag_node->unit_idx; U64 info_off = type_tag_node->info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; // rjf: unpack unit Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; @@ -2775,7 +2823,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 type_unit_idx = unit_idx; if(!contains_1u64(unit_info_tag_range, type_info_off)) { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); } @@ -3026,6 +3073,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) dst_unit->voff_ranges = unit_voff_ranges; } } + lane_sync(); } //////////////////////////// @@ -3188,7 +3236,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) type_unit_idx = unit_idx; if(!contains_1u64(unit_info_tag_range, type_info_off)) { - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); } @@ -4179,6 +4226,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } #undef d2r2_type_from_builtin_kind + lane_sync(); scratch_end(scratch); return result; } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h index b3a119e9..11f95e9a 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -12,7 +12,6 @@ struct D2R2_UniqueTypeTagNode { D2R2_UniqueTypeTagNode *next; U64 hash; - U64 unit_idx; U64 info_off; U64 order_idx; }; From e48c23db20489b20ca1bc28700163d83aa33dfab Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 3 May 2026 11:24:38 -0700 Subject: [PATCH 483/850] d2r2: don't descend children for childless subprograms! --- project.4coder | 2 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/project.4coder b/project.4coder index 223f2125..91e82725 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin release telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 3187b10c..4db8c035 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -2268,6 +2268,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Attrib *bytesize_attrib = &dw2_attrib_nil; DW2_Attrib *encoding_attrib = &dw2_attrib_nil; DW2_Attrib *decl_attrib = &dw2_attrib_nil; + DW2_Attrib *prototyped_attrib = &dw2_attrib_nil; // // TODO(rjf): if a DW_AttribKing_GNU_Vector is found on an DW_TagKind_ArrayType, // then: @native_vector_support extract byte size from the base type tag @@ -2367,6 +2368,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) }break; case DW_TagKind_SubProgram: case DW_TagKind_SubroutineType: + ProfScope("subprogram / subroutine (%.*s)", str8_varg(name)) { // rjf: build type dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); @@ -2386,25 +2388,27 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) ParamNode *first_param = 0; ParamNode *last_param = 0; U64 param_count = 0; + if(tag.has_children) { U64 tag_children_off = info_off + tag_info_size; S64 depth = 1; for(U64 off = tag_children_off; depth > 0 && contains_1u64(unit_info_tag_range, off);) { + Temp scratch3 = scratch_begin(&scratch2.arena, 1); U64 start_off = off; // rjf: read child tag DW2_Tag child_tag = {0}; - off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &child_tag); + off += dw2_read_tag(scratch3.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &child_tag); // rjf: gather parameters if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) { DW2_Attrib *type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); ParamNode *n = push_array(scratch2.arena, ParamNode, 1); - n->type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - n->type_unit_idx = unit_idx; SLLQueuePush(first_param, last_param, n); + n->type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + n->type_unit_idx = unit_idx; if(!contains_1u64(unit_info_tag_range, n->type_info_off)) { U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, n->type_info_off); @@ -2423,6 +2427,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) depth += 1; } + scratch_end(scratch3); if(off == start_off) { break; From f2d80da2dec9d8db2026d16cbc421edc369cf9d4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 3 May 2026 11:25:56 -0700 Subject: [PATCH 484/850] d2r2: remove markup --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 4db8c035..9df25afa 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1817,7 +1817,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) D2R2_UniqueTypeTagNode *n = push_array(scratch.arena, D2R2_UniqueTypeTagNode, 1); n->next = (D2R2_UniqueTypeTagNode *)slot_head_val; n->hash = hash; - // n->unit_idx = origin_unit_idx; n->info_off = start_off; U64 new_head_val = (U64)n; if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_type_tag_slots[slot_idx], new_head_val, slot_head_val)) @@ -2368,7 +2367,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) }break; case DW_TagKind_SubProgram: case DW_TagKind_SubroutineType: - ProfScope("subprogram / subroutine (%.*s)", str8_varg(name)) { // rjf: build type dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); From 7157e813a0a88817f208009f0170fdb174f3931b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 3 May 2026 17:55:53 -0700 Subject: [PATCH 485/850] d2r2: fix line table build - correct program data size, correct special opcode application --- project.4coder | 2 +- src/dwarf/dwarf_parse_2.c | 6 +++++- src/dwarf/dwarf_parse_2.h | 2 ++ src/radbin/radbin.c | 2 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 11 ++++------- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/project.4coder b/project.4coder index 91e82725..223f2125 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin release telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 1cf8b735..5c7d5099 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -597,7 +597,7 @@ internal U64 dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out) { Temp scratch = scratch_begin(&arena, 1); - U64 start_off = 0; + U64 start_off = off; ////////////////////////////// //- rjf: read unit length @@ -637,6 +637,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of ////////////////////////////// //- rjf: read all remaining flat header properties // + U64 opl_header_length_off = 0; U64 header_length = 0; U8 min_inst_length = 0; U8 max_ops_per_inst = 1; @@ -646,6 +647,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of U8 opcode_base = 0; { off += dw2_read_fmt_u64(data, off, format, &header_length); + opl_header_length_off = off; off += str8_deserial_read_struct(data, off, &min_inst_length); off += str8_deserial_read_struct(data, off, &max_ops_per_inst); off += str8_deserial_read_struct(data, off, &default_is_stmt); @@ -876,6 +878,8 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of out->opcode_lengths = opcode_lengths; out->dirs = dirs; out->files = files; + out->line_program_off = opl_header_length_off + header_length; + out->total_unit_data_size = (off_opl - start_off); } U64 bytes_read = (off - start_off); diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index c583fbca..d90addc9 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -180,6 +180,8 @@ struct DW2_LineTableHeader U8 *opcode_lengths; DW2_LineTableFileArray dirs; DW2_LineTableFileArray files; + U64 line_program_off; + U64 total_unit_data_size; // NOTE(rjf): would be implied by `unit_length`, but DWARF makes that the size *past* the variable-width unit-length field itself }; typedef struct DW2_LineVMRegs DW2_LineVMRegs; diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 92d142f2..4dc3f53d 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -788,7 +788,7 @@ rb_thread_entry_point(void *p) convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); convert_params.is_parse_relaxed = 1; // TODO: switch } - // ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); + ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); // rjf: convert [2] D2R2_ConvertParams convert_params_2 = {0}; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 9df25afa..538df252 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -701,16 +701,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: parse each unit's line table header // DW2_LineTableHeader *unit_line_table_headers = 0; - U64 *unit_line_table_header_sizes = 0; ProfScope("parse each unit's line table header") { if(lane_idx() == 0) { unit_line_table_headers = push_array(scratch.arena, DW2_LineTableHeader, unit_count); - unit_line_table_header_sizes = push_array(scratch.arena, U64, unit_count); } lane_sync_u64(&unit_line_table_headers, 0); - lane_sync_u64(&unit_line_table_header_sizes, 0); U64 unit_take_idx = 0; U64 *unit_take_idx_ptr = &unit_take_idx; lane_sync_u64(&unit_take_idx_ptr, 0); @@ -726,7 +723,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); U64 line_info_off = stmt_list->val.u128.u64[0]; String8 line_info_data = raw->sec[DW_Section_Line].data; - unit_line_table_header_sizes[unit_idx] = dw2_read_line_table_header(scratch.arena, ctx, line_info_data, line_info_off, &unit_line_table_headers[unit_idx]); + dw2_read_line_table_header(scratch.arena, ctx, line_info_data, line_info_off, &unit_line_table_headers[unit_idx]); } lane_sync(); } @@ -880,7 +877,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); U64 line_info_off = stmt_list->val.u128.u64[0]; String8 all_line_info_data = raw->sec[DW_Section_Line].data; - String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_info_off + unit_line_table_header_sizes[unit_idx], line_info_off + line_table_header->unit_length)); + String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_info_off + line_table_header->line_program_off, line_info_off + line_table_header->total_unit_data_size)); //- rjf: build unit's line table RDIM_LineTable *dst_line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 1); @@ -920,7 +917,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U32 adjusted_opcode = (U32)(opcode - line_table_header->opcode_base); U32 op_advance = adjusted_opcode / line_table_header->line_range; S64 line_advance = (S64)line_table_header->line_base + (S64)adjusted_opcode%(S64)line_table_header->line_range; - U64 addr_advance = line_table_header->min_inst_length + (vm_regs.vliw_op_index + op_advance) / line_table_header->max_ops_per_inst; + U64 addr_advance = line_table_header->min_inst_length * (vm_regs.vliw_op_index + op_advance) / line_table_header->max_ops_per_inst; vm_regs.address += addr_advance; vm_regs.vliw_op_index = (vm_regs.vliw_op_index + op_advance) % line_table_header->max_ops_per_inst; vm_regs.line += line_advance; @@ -1168,7 +1165,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //- rjf: emit lines - if(emit_line) + if(emit_line && vm_regs.address != 0 && vm_regs.line != 0) { emit_line = 0; LineSeqChunk *chunk = last_line_seq_chunk; From 8f65f466f570da9785af417683b4984da039cb4b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 4 May 2026 13:14:13 -0700 Subject: [PATCH 486/850] d2r2: expand tag deduplication to both namespaces and types; gather/deduplicate/convert namespaces --- project.4coder | 2 +- src/base/base_core.h | 2 +- src/radbin/radbin.c | 2 +- src/rdi/rdi_local.c | 2 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 380 +++++++++++++++++--------- src/rdi_from_dwarf/rdi_from_dwarf_2.h | 17 +- 6 files changed, 268 insertions(+), 137 deletions(-) diff --git a/project.4coder b/project.4coder index 223f2125..7b07d80e 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin && pushd build && radbin --rdi simple && radbin --dump simple.rdi --out:simple.dump", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/base/base_core.h b/src/base/base_core.h index 17d3a948..7b9b585a 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -272,7 +272,7 @@ # endif #elif COMPILER_CLANG || COMPILER_GCC # define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)__atomic_compare_exchange_n((__int128 *)(x),(__int128 *)(c),*(__int128 *)(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST) -# define ins_atomic_u64_eval(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) +# define ins_atomic_u64_eval(x) __atomic_load_n((U64 *)(x), __ATOMIC_SEQ_CST) # define ins_atomic_u64_inc_eval(x) (__atomic_fetch_add((U64 *)(x), 1, __ATOMIC_SEQ_CST) + 1) # define ins_atomic_u64_dec_eval(x) (__atomic_fetch_sub((U64 *)(x), 1, __ATOMIC_SEQ_CST) - 1) # define ins_atomic_u64_eval_assign(x,c) __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 4dc3f53d..92d142f2 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -788,7 +788,7 @@ rb_thread_entry_point(void *p) convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); convert_params.is_parse_relaxed = 1; // TODO: switch } - ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); + // ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); // rjf: convert [2] D2R2_ConvertParams convert_params_2 = {0}; diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index be42b6c3..19a39d58 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -488,7 +488,7 @@ n->lane_strings = push_array(scratch.arena, String8List, lane_count());\ }\ lane_sync();\ strings = &last_output_node->lane_strings[lane_idx()];\ -lane_sync(); if(flags & (1ull<<(kind))) ProfScope(rdi_name_title_from_dump_subset_table[kind].str) +lane_sync(); if(flags & (1ull<<(kind))) ProfScope((char *)rdi_name_title_from_dump_subset_table[kind].str) #define DumpSubset(name) DumpSubsetKind(RDI_DumpSubset_##name) ////////////////////////////// diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 538df252..06759cce 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -5,7 +5,7 @@ //~ rjf: Helpers internal int -d2r2_unique_type_tag_node_is_less_than(D2R2_UniqueTypeTagNode **l, D2R2_UniqueTypeTagNode **r) +d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r) { int is_less_than = (l[0]->hash < r[0]->hash); return is_less_than; @@ -1435,48 +1435,48 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //////////////////////////// - //- rjf: gather all unique type tags across all units + //- rjf: gather all unique, to-be-deduplicated tags across all units (types, namespaces) // - typedef struct UnitTypeNode UnitTypeNode; - struct UnitTypeNode + typedef struct UnitDedupedTagNode UnitDedupedTagNode; + struct UnitDedupedTagNode { - UnitTypeNode *next; + UnitDedupedTagNode *next; U64 src_info_off; U64 dst_hash; }; - typedef struct UnitTypeMap UnitTypeMap; - struct UnitTypeMap + typedef struct UnitDedupedTagMap UnitDedupedTagMap; + struct UnitDedupedTagMap { - UnitTypeNode **slots; + UnitDedupedTagNode **slots; U64 slots_count; }; - D2R2_UniqueTypeTagNode **unique_type_tag_slots = 0; - U64 unique_type_tag_slots_count = total_tag_count_estimate/8 + 1; - UnitTypeMap *unit_type_maps = 0; - ProfScope("gather all unique type tags across all units") + D2R2_UniqueTagNode **unique_tag_slots = 0; + U64 unique_tag_slots_count = total_tag_count_estimate/8 + 1; + UnitDedupedTagMap *unit_deduped_tag_maps = 0; + ProfScope("gather all unique, to-be-deduplicated tags across all units (types, namespaces)") { //- rjf: set up tables if(lane_idx() == 0) { - unique_type_tag_slots = push_array(scratch.arena, D2R2_UniqueTypeTagNode *, unique_type_tag_slots_count); - unit_type_maps = push_array(scratch.arena, UnitTypeMap, unit_count); + unique_tag_slots = push_array(scratch.arena, D2R2_UniqueTagNode *, unique_tag_slots_count); + unit_deduped_tag_maps = push_array(scratch.arena, UnitDedupedTagMap, unit_count); } - lane_sync_u64(&unique_type_tag_slots, 0); - lane_sync_u64(&unit_type_maps, 0); + lane_sync_u64(&unique_tag_slots, 0); + lane_sync_u64(&unit_deduped_tag_maps, 0); - //- rjf: set up per-unit type maps + //- rjf: set up per-unit deduplicated tag maps { Rng1U64 range = lane_range(unit_count); for EachInRange(unit_idx, range) { Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - unit_type_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 256 + 1; - unit_type_maps[unit_idx].slots = push_array(scratch.arena, UnitTypeNode *, unit_type_maps[unit_idx].slots_count); + unit_deduped_tag_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 256 + 1; + unit_deduped_tag_maps[unit_idx].slots = push_array(scratch.arena, UnitDedupedTagNode *, unit_deduped_tag_maps[unit_idx].slots_count); } lane_sync(); } - //- rjf: gather unique types + //- rjf: gather unique tags { U64 work_take_idx_ = 0; U64 *work_take_idx_ptr = &work_take_idx_; @@ -1497,7 +1497,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: unpack unit info Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; - //- rjf: hash all type content from tags in this unit; record if unique + //- rjf: hash all content from to-be-deduplicated tags in this unit; record if unique for(U64 root_tag_idx = origin_unit_root_tag_idx_range.min; root_tag_idx < origin_unit_root_tag_idx_range.max; root_tag_idx += 1) { S64 origin_unit_depth = 1; @@ -1507,17 +1507,19 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Temp scratch2 = scratch_begin(&scratch.arena, 1); U64 start_off = off; - //- rjf: hash type tags - this requires a hash of not only type tags' - // attributes, but also a walk of all other type tags this tag references, + //- rjf: hash deduped tags - this requires a hash of not only flat tag + // attributes, but also a walk of all other tags this tag references, // and a hash of them too. so we produce a list of tasks for // parsing/hashing tags, in order to find the full comprehensive hash - // for each type tag. + // for each tag. // // importantly, doing this can cause cycles in principle, so we also // record which tags we visited, & order them, so we can just hash the // order index, instead of doing a full recursion. // - B32 is_type_tag_tree = 0; + B32 is_deduped_tag_tree = 0; + DW_TagKind tree_root_tag_kind = DW_TagKind_Null; + D2R2_UniqueTagKind unique_tag_kind = D2R2_UniqueTagKind_Type; B32 tag_has_children = 0; B32 tag_ends_children = 0; U64 hash = 0; @@ -1569,39 +1571,55 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: record top-level info about this tag tree if(t_start_off == t->off && t == &start_task) { - is_type_tag_tree = (tag.kind == DW_TagKind_ArrayType || - tag.kind == DW_TagKind_ClassType || - tag.kind == DW_TagKind_EnumerationType || - tag.kind == DW_TagKind_PointerType || - tag.kind == DW_TagKind_ReferenceType || - tag.kind == DW_TagKind_StringType || - tag.kind == DW_TagKind_StructureType || - tag.kind == DW_TagKind_SubroutineType || - tag.kind == DW_TagKind_SubProgram || - tag.kind == DW_TagKind_Typedef || - tag.kind == DW_TagKind_UnionType || - tag.kind == DW_TagKind_PtrToMemberType || - tag.kind == DW_TagKind_SetType || - tag.kind == DW_TagKind_BaseType || - tag.kind == DW_TagKind_ConstType || - tag.kind == DW_TagKind_FileType || - tag.kind == DW_TagKind_PackedType || - tag.kind == DW_TagKind_VolatileType || - tag.kind == DW_TagKind_RestrictType || - tag.kind == DW_TagKind_InterfaceType || - tag.kind == DW_TagKind_UnspecifiedType || - tag.kind == DW_TagKind_SharedType || - tag.kind == DW_TagKind_RValueReferenceType || - tag.kind == DW_TagKind_CoarrayType || - tag.kind == DW_TagKind_DynamicType || - tag.kind == DW_TagKind_AtomicType || - tag.kind == DW_TagKind_ImmutableType); + is_deduped_tag_tree = (tag.kind == DW_TagKind_ArrayType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_EnumerationType || + tag.kind == DW_TagKind_PointerType || + tag.kind == DW_TagKind_ReferenceType || + tag.kind == DW_TagKind_StringType || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_Typedef || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_PtrToMemberType || + tag.kind == DW_TagKind_SetType || + tag.kind == DW_TagKind_BaseType || + tag.kind == DW_TagKind_ConstType || + tag.kind == DW_TagKind_FileType || + tag.kind == DW_TagKind_PackedType || + tag.kind == DW_TagKind_VolatileType || + tag.kind == DW_TagKind_RestrictType || + tag.kind == DW_TagKind_InterfaceType || + tag.kind == DW_TagKind_UnspecifiedType || + tag.kind == DW_TagKind_SharedType || + tag.kind == DW_TagKind_RValueReferenceType || + tag.kind == DW_TagKind_CoarrayType || + tag.kind == DW_TagKind_DynamicType || + tag.kind == DW_TagKind_AtomicType || + tag.kind == DW_TagKind_ImmutableType || + tag.kind == DW_TagKind_Namespace); tag_has_children = tag.has_children; tag_ends_children = (tag.kind == DW_TagKind_Null); + if(is_deduped_tag_tree) + { + tree_root_tag_kind = tag.kind; + if(tag.kind == DW_TagKind_Namespace) + { + unique_tag_kind = D2R2_UniqueTagKind_Namespace; + } + } + } + + // rjf: determine if we want to consider tag children as part of the content hash + B32 hash_should_include_children = 1; + if(tree_root_tag_kind == DW_TagKind_Namespace) + { + hash_should_include_children = 0; } // rjf: is type -> combine tag's content into hash - if(!should_skip_tag && is_type_tag_tree) + if(!should_skip_tag && is_deduped_tag_tree) { // rjf: combine tag's kind hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); @@ -1633,8 +1651,18 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) n->v.attrib_kind != DW_AttribKind_HighPc))) { hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); - hash = u64_hash_from_seed_str8(hash, n->v.val.string); + if(n->v.val.string.size != 0) + { + hash = u64_hash_from_seed_str8(hash, n->v.val.string); + } + else if(n->v.val.addr != 0) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.addr)); + } + else + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); + } } // rjf: type reference? -> if seen, combine the order; if not, recurse @@ -1696,13 +1724,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: is type tag tree, has children -> descend - if(is_type_tag_tree && tag.has_children) + if(is_deduped_tag_tree && hash_should_include_children && tag.has_children) { depth += 1; } // rjf: zero tag kind -> ascend - if(is_type_tag_tree && tag.kind == DW_TagKind_Null && depth > 0) + if(is_deduped_tag_tree && tag.kind == DW_TagKind_Null && depth > 0) { depth -= 1; } @@ -1720,8 +1748,20 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } - // rjf: is this the starter task? -> advance base reading offset, apply depth changes to origin unit scan loop - if(t == &start_task) + // rjf: is this the starter task? -> advance base reading offset + // + // NOTE(rjf): in the case of functions, we need to apply the entire type + // discovery/hashing/gathering work to children of functions - *but* we + // also need to hash other children of functions. so, in that case, we + // only advance past the function root tag once we're done hashing all + // children we want - but, we still need to parse the children of the + // function again, in order to find types etc. contained within functions. + // + if(t == &start_task && tree_root_tag_kind == DW_TagKind_SubProgram && t->off == start_off) + { + off = t_off; + } + else if(t == &start_task) { off = t_off; } @@ -1735,18 +1775,18 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //- rjf: atomically gather this hash if not already gathered - if(is_type_tag_tree) + if(is_deduped_tag_tree) { B32 gathered = 0; - U64 slot_idx = hash%unique_type_tag_slots_count; + U64 slot_idx = hash%unique_tag_slots_count; for(;!gathered;) { // rjf: read existing slot head pointer *before* we lookup / insert - U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_type_tag_slots[slot_idx]); + U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_tag_slots[slot_idx]); // rjf: determine if this hash has been gathered - D2R2_UniqueTypeTagNode *already_gathered_node = 0; - for(D2R2_UniqueTypeTagNode *n = (D2R2_UniqueTypeTagNode *)slot_head_val; n != 0; n = n->next) + D2R2_UniqueTagNode *already_gathered_node = 0; + for(D2R2_UniqueTagNode *n = (D2R2_UniqueTagNode *)slot_head_val; n != 0; n = n->next) { if(n->hash == hash) { @@ -1811,12 +1851,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) if(!gathered) { Temp insert_temp = temp_begin(scratch.arena); - D2R2_UniqueTypeTagNode *n = push_array(scratch.arena, D2R2_UniqueTypeTagNode, 1); - n->next = (D2R2_UniqueTypeTagNode *)slot_head_val; + D2R2_UniqueTagNode *n = push_array(scratch.arena, D2R2_UniqueTagNode, 1); + n->next = (D2R2_UniqueTagNode *)slot_head_val; + n->kind = unique_tag_kind; n->hash = hash; n->info_off = start_off; U64 new_head_val = (U64)n; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_type_tag_slots[slot_idx], new_head_val, slot_head_val)) + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_tag_slots[slot_idx], new_head_val, slot_head_val)) { gathered = 1; } @@ -1831,18 +1872,18 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: atomically record this (info_off -> hash) mapping, so that when we have // later references to this type, we can redirect to the deduplicated type with // the right hash later. - if(is_type_tag_tree) + if(is_deduped_tag_tree) { U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 info_off_slot_idx = info_off_hash%unit_type_maps[origin_unit_idx].slots_count; - UnitTypeNode *n = push_array(scratch.arena, UnitTypeNode, 1); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; + UnitDedupedTagNode *n = push_array(scratch.arena, UnitDedupedTagNode, 1); n->src_info_off = start_off; n->dst_hash = hash; for(B32 inserted = 0; !inserted;) { - U64 slot_head_val = ins_atomic_u64_eval(&unit_type_maps[origin_unit_idx].slots[info_off_slot_idx]); - n->next = (UnitTypeNode *)slot_head_val; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_type_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) + U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); + n->next = (UnitDedupedTagNode *)slot_head_val; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) { inserted = 1; } @@ -1855,7 +1896,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // we need to descend and parse their contents, since they may contain // types themselves. // - if(!is_type_tag_tree) + if(!is_deduped_tag_tree) { if(tag_has_children) { @@ -1876,28 +1917,28 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //////////////////////////// - //- rjf: sort all unique type table slots + //- rjf: sort all unique tag table slots // - ProfScope("sort all unique type table slots") + ProfScope("sort all unique tag table slots") { - Rng1U64 range = lane_range(unique_type_tag_slots_count); + Rng1U64 range = lane_range(unique_tag_slots_count); for EachInRange(slot_idx, range) { Temp scratch2 = scratch_begin(&scratch.arena, 1); - D2R2_UniqueTypeTagNode **slot = &unique_type_tag_slots[slot_idx]; + D2R2_UniqueTagNode **slot = &unique_tag_slots[slot_idx]; // rjf: count nodes in this slot U64 node_count = 0; - for EachNode(n, D2R2_UniqueTypeTagNode, slot[0]) + for EachNode(n, D2R2_UniqueTagNode, slot[0]) { node_count += 1; } // rjf: flatten - D2R2_UniqueTypeTagNode **slot_nodes_array = push_array(scratch2.arena, D2R2_UniqueTypeTagNode *, node_count); + D2R2_UniqueTagNode **slot_nodes_array = push_array(scratch2.arena, D2R2_UniqueTagNode *, node_count); { U64 idx = 0; - for EachNode(n, D2R2_UniqueTypeTagNode, slot[0]) + for EachNode(n, D2R2_UniqueTagNode, slot[0]) { slot_nodes_array[idx] = n; idx += 1; @@ -1905,14 +1946,14 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: sort - radsort(slot_nodes_array, node_count, d2r2_unique_type_tag_node_is_less_than); + radsort(slot_nodes_array, node_count, (int (*)(void *, void *))d2r2_unique_tag_node_is_less_than); // rjf: re-order in the slot { - unique_type_tag_slots[slot_idx] = 0; + unique_tag_slots[slot_idx] = 0; for EachIndex(idx, node_count) { - SLLStackPush(unique_type_tag_slots[slot_idx], slot_nodes_array[idx]); + SLLStackPush(unique_tag_slots[slot_idx], slot_nodes_array[idx]); } } @@ -1922,33 +1963,42 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //////////////////////////// - //- rjf: produce [0...n) <-> unique-tag-node mapping for all types + //- rjf: produce [0...n) <-> unique-tag-node mapping for all categories of deduplicated tags // - U64 type_count = 0; - D2R2_UniqueTypeTagNode **type_tag_nodes = 0; - ProfScope("produce [0...n) -> hash mapping for all types") if(lane_idx() == 0) + U64 *deduped_tag_counts = 0; // [D2R2_UniqueTagKind_COUNT] + D2R2_UniqueTagNode ***deduped_tag_nodes = 0; // [D2R2_UniqueTagKind_COUNT] + ProfScope("produce [0...n) -> hash mapping for all categories of deduplicated tags") if(lane_idx() == 0) { - for EachIndex(slot_idx, unique_type_tag_slots_count) + deduped_tag_counts = push_array(scratch.arena, U64, D2R2_UniqueTagKind_COUNT); + deduped_tag_nodes = push_array(scratch.arena, D2R2_UniqueTagNode **, D2R2_UniqueTagKind_COUNT); + for EachIndex(slot_idx, unique_tag_slots_count) { - for EachNode(n, D2R2_UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) + for EachNode(n, D2R2_UniqueTagNode, unique_tag_slots[slot_idx]) { - type_count += 1; + deduped_tag_counts[n->kind] += 1; } } - type_tag_nodes = push_array(scratch.arena, D2R2_UniqueTypeTagNode *, type_count); - U64 idx = 0; - for EachIndex(slot_idx, unique_type_tag_slots_count) + for EachEnumVal(D2R2_UniqueTagKind, k) { - for EachNode(n, D2R2_UniqueTypeTagNode, unique_type_tag_slots[slot_idx]) + deduped_tag_nodes[k] = push_array(scratch.arena, D2R2_UniqueTagNode *, deduped_tag_counts[k]); + } + U64 idxs[D2R2_UniqueTagKind_COUNT] = {0}; + for EachIndex(slot_idx, unique_tag_slots_count) + { + for EachNode(n, D2R2_UniqueTagNode, unique_tag_slots[slot_idx]) { - type_tag_nodes[idx] = n; - n->order_idx = idx; - idx += 1; + deduped_tag_nodes[n->kind][idxs[n->kind]] = n; + n->order_idx = idxs[n->kind]; + idxs[n->kind] += 1; } } } - lane_sync_u64(&type_count, 0); - lane_sync_u64(&type_tag_nodes, 0); + lane_sync_u64(&deduped_tag_counts, 0); + lane_sync_u64(&deduped_tag_nodes, 0); + U64 type_count = deduped_tag_counts[D2R2_UniqueTagKind_Type]; + D2R2_UniqueTagNode **type_tag_nodes = deduped_tag_nodes[D2R2_UniqueTagKind_Type]; + U64 namespace_count = deduped_tag_counts[D2R2_UniqueTagKind_Namespace]; + D2R2_UniqueTagNode **namespace_tag_nodes = deduped_tag_nodes[D2R2_UniqueTagKind_Namespace]; //////////////////////////// //- rjf: gather per-type dependency chains @@ -1994,10 +2044,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 hash = t->hash; // rjf: hash -> unique type tag node - D2R2_UniqueTypeTagNode *type_tag_node = 0; + D2R2_UniqueTagNode *type_tag_node = 0; { - U64 slot_idx = hash%unique_type_tag_slots_count; - for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[slot_idx]; n != 0; n = n->next) + U64 slot_idx = hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) { if(n->hash == hash) { @@ -2137,8 +2187,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 direct_type_hash = 0; { U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); - U64 off_slot_idx = off_hash%unit_type_maps[direct_type_unit_idx].slots_count; - for(UnitTypeNode *n = unit_type_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) + U64 off_slot_idx = off_hash%unit_deduped_tag_maps[direct_type_unit_idx].slots_count; + for(UnitDedupedTagNode *n = unit_deduped_tag_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == direct_type_info_off) { @@ -2244,7 +2294,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Temp temp = temp_begin(scratch2.arena); // rjf: idx -> type tag node - D2R2_UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; + D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; U64 info_off = type_tag_node->info_off; U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; @@ -2303,11 +2353,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); direct_type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); } - UnitTypeMap *direct_type_unit_type_map = &unit_type_maps[direct_type_unit_idx]; + UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[direct_type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; U64 direct_type_hash = 0; - for(UnitTypeNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == direct_type_info_off) { @@ -2315,8 +2365,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) break; } } - U64 unique_type_tag_slot_idx = direct_type_hash%unique_type_tag_slots_count; - for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + U64 unique_type_tag_slot_idx = direct_type_hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == direct_type_hash) { @@ -2443,10 +2493,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: map info_off/unit_idx -> hash U64 param_type_hash = 0; { - UnitTypeMap *direct_type_unit_type_map = &unit_type_maps[param_type_unit_idx]; + UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[param_type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(¶m_type_info_off)); U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; - for(UnitTypeNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == param_type_info_off) { @@ -2459,8 +2509,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: map hash -> type RDIM_Type *param_type = 0; { - U64 unique_type_tag_slot_idx = param_type_hash%unique_type_tag_slots_count; - for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + U64 unique_type_tag_slot_idx = param_type_hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == param_type_hash) { @@ -2740,6 +2790,76 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync(); + //////////////////////////// + //- rjf: convert all namespaces + // + RDIM_NamespaceChunkList *all_namespaces = 0; + RDIM_Namespace **namespace_from_idx_map = 0; + { + // rjf: set up + if(lane_idx() == 0) + { + all_namespaces = push_array(scratch.arena, RDIM_NamespaceChunkList, 1); + namespace_from_idx_map = push_array(scratch.arena, RDIM_Namespace *, namespace_count); + } + lane_sync_u64(&all_namespaces, 0); + lane_sync_u64(&namespace_from_idx_map, 0); + + // rjf: build all namespaces on this lane + RDIM_NamespaceChunkList lane_namespaces = {0}; + Rng1U64 range = lane_range(namespace_count); + for EachInRange(namespace_idx, range) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + // rjf: unpack tag node + D2R2_UniqueTagNode *tag_node = namespace_tag_nodes[namespace_idx]; + U64 info_off = tag_node->info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + + // rjf: read namespace tag + DW2_Tag tag = {0}; + dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + DW2_Attrib *name_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Name); + String8 name = name_attrib->val.string; + + // rjf: build namespace + RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 64); + ns->name = name; + + // rjf: store in (deduped tag idx -> namespace) table + namespace_from_idx_map[tag_node->order_idx] = ns; + + scratch_end(scratch2); + } + lane_sync(); + + // rjf: join all namespaces + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + RDIM_NamespaceChunkList *lanes_namespaces = 0; + if(lane_idx() == 0) + { + lanes_namespaces = push_array(scratch2.arena, RDIM_NamespaceChunkList, lane_count()); + } + lane_sync_u64(&lanes_namespaces, 0); + lanes_namespaces[lane_idx()] = lane_namespaces; + lane_sync(); + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + rdim_namespace_chunk_list_concat_in_place(all_namespaces, &lanes_namespaces[l_idx]); + } + } + lane_sync(); + scratch_end(scratch2); + } + } + lane_sync(); + //////////////////////////// //- rjf: convert all UDTs // @@ -2753,10 +2873,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) for EachInRange(type_idx, range) { RDIM_Type *type = type_from_idx_map[type_idx]; - if(type->kind == RDI_TypeKind_Struct || - type->kind == RDI_TypeKind_Union || - type->kind == RDI_TypeKind_Class || - type->kind == RDI_TypeKind_Enum) + if(type != 0 && + (type->kind == RDI_TypeKind_Struct || + type->kind == RDI_TypeKind_Union || + type->kind == RDI_TypeKind_Class || + type->kind == RDI_TypeKind_Enum)) { // rjf: produce UDT RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &lane_udts, chunk_count); @@ -2764,7 +2885,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) udt->self_type = type; // rjf: idx -> type tag node - D2R2_UniqueTypeTagNode *type_tag_node = type_tag_nodes[type_idx]; + D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; U64 info_off = type_tag_node->info_off; U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; @@ -2830,10 +2951,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: (info_off, unit_idx) -> hash U64 type_hash = 0; { - UnitTypeMap *type_unit_type_map = &unit_type_maps[type_unit_idx]; + UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); - U64 info_off_slot_idx = info_off_hash%type_unit_type_map->slots_count; - for(UnitTypeNode *n = type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for(UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == type_info_off) { @@ -2845,8 +2966,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: hash -> type { - U64 unique_type_tag_slot_idx = type_hash%unique_type_tag_slots_count; - for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + U64 unique_type_tag_slot_idx = type_hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == type_hash) { @@ -3244,10 +3365,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: (info_off, unit_idx) -> hash U64 type_hash = 0; { - UnitTypeMap *type_unit_type_map = &unit_type_maps[type_unit_idx]; + UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); - U64 info_off_slot_idx = info_off_hash%type_unit_type_map->slots_count; - for(UnitTypeNode *n = type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for(UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == type_info_off) { @@ -3259,8 +3380,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: hash -> type { - U64 unique_type_tag_slot_idx = type_hash%unique_type_tag_slots_count; - for(D2R2_UniqueTypeTagNode *n = unique_type_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + U64 unique_type_tag_slot_idx = type_hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == type_hash) { @@ -4219,6 +4340,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) result.top_level_info = top_level_info; result.binary_sections = binary_sections; result.units = *all_units; + result.namespaces = *all_namespaces; result.types = *all_types; result.udts = *all_udts; result.src_files = *all_src_files; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h index 11f95e9a..466a6fa1 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -7,10 +7,19 @@ //////////////////////////////// //~ rjf: Helper Types -typedef struct D2R2_UniqueTypeTagNode D2R2_UniqueTypeTagNode; -struct D2R2_UniqueTypeTagNode +typedef enum D2R2_UniqueTagKind { - D2R2_UniqueTypeTagNode *next; + D2R2_UniqueTagKind_Type, + D2R2_UniqueTagKind_Namespace, + D2R2_UniqueTagKind_COUNT +} +D2R2_UniqueTagKind; + +typedef struct D2R2_UniqueTagNode D2R2_UniqueTagNode; +struct D2R2_UniqueTagNode +{ + D2R2_UniqueTagNode *next; + D2R2_UniqueTagKind kind; U64 hash; U64 info_off; U64 order_idx; @@ -36,7 +45,7 @@ struct D2R2_ConvertParams //////////////////////////////// //~ rjf: Helpers -internal int d2r2_unique_type_tag_node_is_less_than(D2R2_UniqueTypeTagNode **l, D2R2_UniqueTypeTagNode **r); +internal int d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r); //////////////////////////////// //~ rjf: Main Conversion Entry Point (New) From aee299efe73c4297c5484a06666bc34a1f8cba55 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 4 May 2026 15:41:23 -0700 Subject: [PATCH 487/850] d2r2: deduper fixes/simplification, first half of structured namespace support --- src/dwarf/dwarf_parse_2.c | 2 +- src/dwarf/dwarf_parse_2.h | 1 + src/rdi_from_dwarf/rdi_from_dwarf_2.c | 1081 +++++++++++++++---------- src/rdi_from_dwarf/rdi_from_dwarf_2.h | 1 + 4 files changed, 670 insertions(+), 415 deletions(-) diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 5c7d5099..d2685027 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -583,7 +583,7 @@ dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v) case DW_Form_Ref4: case DW_Form_Ref8: { - result = v->u128.u64[0]; + result = ctx->unit_base_info_off + v->u128.u64[0]; }break; // TODO(rjf): DW_Form_RefAddr, DW_Form_RefUData, DW_Form_RefSig8, DW_Form_RefSup8, etc. } diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index d90addc9..bce9f7a9 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -63,6 +63,7 @@ struct DW2_ParseCtx DW_Ext ext; U64 addr_size; U64 unit_base_addr; + U64 unit_base_info_off; DW2_AbbrevMap *abbrev_map; DW2_OffsetTable *rnglists_table; DW2_OffsetTable *str_offsets_table; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 06759cce..e907546c 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -559,11 +559,12 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { DW2_UnitHeader *hdr = &unit_headers[unit_idx]; DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; - ctx->raw = raw; - ctx->version = hdr->version; - ctx->format = hdr->format; - ctx->addr_size = hdr->addr_size; - ctx->abbrev_map = abbrev_map_from_unit_idx_table[unit_idx]; + ctx->raw = raw; + ctx->version = hdr->version; + ctx->format = hdr->format; + ctx->addr_size = hdr->addr_size; + ctx->unit_base_info_off = unit_info_ranges->v[unit_idx].min; + ctx->abbrev_map = abbrev_map_from_unit_idx_table[unit_idx]; } } lane_sync(); @@ -1489,428 +1490,464 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { break; } + Temp work_scratch = scratch_begin(&scratch.arena, 1); //- rjf: unpack work U64 origin_unit_idx = sub_unit_works[work_idx].unit_idx; Rng1U64 origin_unit_root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; //- rjf: unpack unit info + DW2_ParseCtx *origin_unit_parse_ctx = &unit_parse_ctxs[origin_unit_idx]; Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; - //- rjf: hash all content from to-be-deduplicated tags in this unit; record if unique - for(U64 root_tag_idx = origin_unit_root_tag_idx_range.min; root_tag_idx < origin_unit_root_tag_idx_range.max; root_tag_idx += 1) + //- rjf: gather all tags which we want to deduplicate + typedef struct D2R2_TagNode D2R2_TagNode; + struct D2R2_TagNode { - S64 origin_unit_depth = 1; - for(U64 off = unit_info_root_tag_offs[origin_unit_idx].v[root_tag_idx]; - off < origin_unit_info_tag_range.max && (origin_unit_depth > 1 || off == unit_info_root_tag_offs[origin_unit_idx].v[root_tag_idx]);) + D2R2_TagNode *next; + D2R2_UniqueTagKind kind; + U64 info_off; + U64 container_ancestor_info_off; + U64 hash_seed; + }; + D2R2_TagNode *first_tag_to_dedup = 0; + D2R2_TagNode *last_tag_to_dedup = 0; + for(U64 root_tag_idx = origin_unit_root_tag_idx_range.min; + root_tag_idx < origin_unit_root_tag_idx_range.max; + root_tag_idx += 1) + { + U64 root_tag_start_off = unit_info_root_tag_offs[origin_unit_idx].v[root_tag_idx]; + typedef struct D2R2_ParentTagNode D2R2_ParentTagNode; + struct D2R2_ParentTagNode { - Temp scratch2 = scratch_begin(&scratch.arena, 1); + D2R2_ParentTagNode *next; + DW_TagKind tag_kind; + U64 info_off; + U64 hash_seed; + }; + D2R2_ParentTagNode *top_parent = 0; + D2R2_ParentTagNode *free_parent = 0; + S64 depth = 0; + for(U64 off = root_tag_start_off; contains_1u64(origin_unit_info_tag_range, off) && (depth > 0 || off == root_tag_start_off);) + { + Temp tag_scratch = scratch_begin(&work_scratch.arena, 1); U64 start_off = off; - //- rjf: hash deduped tags - this requires a hash of not only flat tag - // attributes, but also a walk of all other tags this tag references, - // and a hash of them too. so we produce a list of tasks for - // parsing/hashing tags, in order to find the full comprehensive hash - // for each tag. - // - // importantly, doing this can cause cycles in principle, so we also - // record which tags we visited, & order them, so we can just hash the - // order index, instead of doing a full recursion. - // - B32 is_deduped_tag_tree = 0; - DW_TagKind tree_root_tag_kind = DW_TagKind_Null; - D2R2_UniqueTagKind unique_tag_kind = D2R2_UniqueTagKind_Type; - B32 tag_has_children = 0; - B32 tag_ends_children = 0; - U64 hash = 0; + // rjf: read tag + DW2_Tag tag = {0}; + off += dw2_read_tag(tag_scratch.arena, origin_unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + + // rjf: is this one of the tags we'd like to dedup? -> gather + if(tag.kind == DW_TagKind_ArrayType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_EnumerationType || + tag.kind == DW_TagKind_PointerType || + tag.kind == DW_TagKind_ReferenceType || + tag.kind == DW_TagKind_StringType || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_Typedef || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_PtrToMemberType || + tag.kind == DW_TagKind_SetType || + tag.kind == DW_TagKind_BaseType || + tag.kind == DW_TagKind_ConstType || + tag.kind == DW_TagKind_FileType || + tag.kind == DW_TagKind_PackedType || + tag.kind == DW_TagKind_VolatileType || + tag.kind == DW_TagKind_RestrictType || + tag.kind == DW_TagKind_InterfaceType || + tag.kind == DW_TagKind_UnspecifiedType || + tag.kind == DW_TagKind_SharedType || + tag.kind == DW_TagKind_RValueReferenceType || + tag.kind == DW_TagKind_CoarrayType || + tag.kind == DW_TagKind_DynamicType || + tag.kind == DW_TagKind_AtomicType || + tag.kind == DW_TagKind_ImmutableType || + tag.kind == DW_TagKind_Namespace) { - typedef struct TypeTagTask TypeTagTask; - struct TypeTagTask + U64 container_ancestor_info_off = 0; + for EachNode(n, D2R2_ParentTagNode, top_parent) { - TypeTagTask *next; - U64 unit_idx; - U64 off; - U64 order_idx; - }; - TypeTagTask start_task = {0, origin_unit_idx, off}; - TypeTagTask *top_task = &start_task; - TypeTagTask *free_task = 0; - U64 seen_task_slots_count = 16; - TypeTagTask **seen_task_slots = push_array(scratch2.arena, TypeTagTask *, seen_task_slots_count); - for(TypeTagTask *t = top_task, *next = 0; t != 0; t = next) + if(n->tag_kind == DW_TagKind_StructureType || + n->tag_kind == DW_TagKind_UnionType || + n->tag_kind == DW_TagKind_ClassType || + n->tag_kind == DW_TagKind_SubProgram || + n->tag_kind == DW_TagKind_LexicalBlock || + n->tag_kind == DW_TagKind_Namespace) + { + container_ancestor_info_off = n->info_off; + break; + } + } + D2R2_TagNode *n = push_array(work_scratch.arena, D2R2_TagNode, 1); + n->kind = (tag.kind == DW_TagKind_Namespace ? D2R2_UniqueTagKind_Namespace : D2R2_UniqueTagKind_Type); + n->info_off = start_off; + n->container_ancestor_info_off = container_ancestor_info_off; + n->hash_seed = top_parent ? top_parent->hash_seed : 0; + SLLQueuePush(first_tag_to_dedup, last_tag_to_dedup, n); + } + + // rjf: compute hash seed for this tag + U64 hash_seed = (top_parent ? top_parent->hash_seed : 0); + if(tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_Namespace) + { + DW2_Attrib *name_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Name); + if(name_attrib != &dw2_attrib_nil) { - next = 0; - U64 t_off = t->off; - - // rjf: record this task in our seen task table - { - U64 hash = u64_hash_from_str8(str8_struct(&t->off)); - U64 slot_idx = hash%seen_task_slots_count; - SLLStackPush(seen_task_slots[slot_idx], t); - } - - // rjf: unpack unit - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; - - // rjf: read/hash the full tag tree at `t_off`; kick off additional - // tasks for referenced dependency types - U64 depth = 0; - for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max;) - { - U64 t_start_off = t_off; - - // rjf: read tag - DW2_Tag tag = {0}; - t_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, t_off, &tag); - - // rjf: determine if tag should be skipped - B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || - tag.kind == DW_TagKind_Variable); - - // rjf: record top-level info about this tag tree - if(t_start_off == t->off && t == &start_task) - { - is_deduped_tag_tree = (tag.kind == DW_TagKind_ArrayType || - tag.kind == DW_TagKind_ClassType || - tag.kind == DW_TagKind_EnumerationType || - tag.kind == DW_TagKind_PointerType || - tag.kind == DW_TagKind_ReferenceType || - tag.kind == DW_TagKind_StringType || - tag.kind == DW_TagKind_StructureType || - tag.kind == DW_TagKind_SubroutineType || - tag.kind == DW_TagKind_SubProgram || - tag.kind == DW_TagKind_Typedef || - tag.kind == DW_TagKind_UnionType || - tag.kind == DW_TagKind_PtrToMemberType || - tag.kind == DW_TagKind_SetType || - tag.kind == DW_TagKind_BaseType || - tag.kind == DW_TagKind_ConstType || - tag.kind == DW_TagKind_FileType || - tag.kind == DW_TagKind_PackedType || - tag.kind == DW_TagKind_VolatileType || - tag.kind == DW_TagKind_RestrictType || - tag.kind == DW_TagKind_InterfaceType || - tag.kind == DW_TagKind_UnspecifiedType || - tag.kind == DW_TagKind_SharedType || - tag.kind == DW_TagKind_RValueReferenceType || - tag.kind == DW_TagKind_CoarrayType || - tag.kind == DW_TagKind_DynamicType || - tag.kind == DW_TagKind_AtomicType || - tag.kind == DW_TagKind_ImmutableType || - tag.kind == DW_TagKind_Namespace); - tag_has_children = tag.has_children; - tag_ends_children = (tag.kind == DW_TagKind_Null); - if(is_deduped_tag_tree) - { - tree_root_tag_kind = tag.kind; - if(tag.kind == DW_TagKind_Namespace) - { - unique_tag_kind = D2R2_UniqueTagKind_Namespace; - } - } - } - - // rjf: determine if we want to consider tag children as part of the content hash - B32 hash_should_include_children = 1; - if(tree_root_tag_kind == DW_TagKind_Namespace) - { - hash_should_include_children = 0; - } - - // rjf: is type -> combine tag's content into hash - if(!should_skip_tag && is_deduped_tag_tree) - { - // rjf: combine tag's kind - hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); - - // rjf: combine non-reference attributes (references could be different, - // because of deduping, but they could match ultimately). for any - // referenced dependency types, kick them off - for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) - { - // rjf: non-reference? -> combine attribute value info - if(n->v.val.kind != DW_Form_RefAddr && - n->v.val.kind != DW_Form_Ref1 && - n->v.val.kind != DW_Form_Ref2 && - n->v.val.kind != DW_Form_Ref4 && - n->v.val.kind != DW_Form_Ref8 && - n->v.val.kind != DW_Form_RefUData && - n->v.val.kind != DW_Form_RefSup4 && - n->v.val.kind != DW_Form_RefSig8 && - ((tag.kind != DW_TagKind_SubProgram && - tag.kind != DW_TagKind_FormalParameter) || - (n->v.attrib_kind != DW_AttribKind_Name && - n->v.attrib_kind != DW_AttribKind_DeclFile && - n->v.attrib_kind != DW_AttribKind_DeclLine && - n->v.attrib_kind != DW_AttribKind_Prototyped && - n->v.attrib_kind != DW_AttribKind_External && - n->v.attrib_kind != DW_AttribKind_FrameBase && - n->v.attrib_kind != DW_AttribKind_Location && - n->v.attrib_kind != DW_AttribKind_LowPc && - n->v.attrib_kind != DW_AttribKind_HighPc))) - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); - if(n->v.val.string.size != 0) - { - hash = u64_hash_from_seed_str8(hash, n->v.val.string); - } - else if(n->v.val.addr != 0) - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.addr)); - } - else - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); - } - } - - // rjf: type reference? -> if seen, combine the order; if not, recurse - if(n->v.attrib_kind == DW_AttribKind_Type) - { - // rjf: unpack reference - U64 ref_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); - - // rjf: determine if we've seen this reference - B32 already_seen = 0; - U64 already_seen_order_idx = 0; - { - U64 off_hash = u64_hash_from_str8(str8_struct(&ref_info_off)); - U64 off_slot_idx = off_hash%seen_task_slots_count; - for(TypeTagTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) - { - if(t->off == ref_info_off) - { - already_seen = 1; - already_seen_order_idx = t->order_idx; - break; - } - } - } - - // rjf: if we've seen -> hash the order - if(already_seen) - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&already_seen_order_idx)); - } - - // rjf: if we've not seen -> descend - if(!already_seen) - { - TypeTagTask *dependency_task = free_task; - if(dependency_task != 0) - { - SLLStackPop(free_task); - } - else - { - dependency_task = push_array(scratch2.arena, TypeTagTask, 1); - } - next = dependency_task; - dependency_task->off = ref_info_off; - dependency_task->unit_idx = t->unit_idx; - if(!contains_1u64(unit_info_tag_range, dependency_task->off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - dependency_task->unit_idx = new_unit_num-1; - } - } - dependency_task->order_idx = t->order_idx+1; - } - } - } - } - - // rjf: is type tag tree, has children -> descend - if(is_deduped_tag_tree && hash_should_include_children && tag.has_children) - { - depth += 1; - } - - // rjf: zero tag kind -> ascend - if(is_deduped_tag_tree && tag.kind == DW_TagKind_Null && depth > 0) - { - depth -= 1; - } - - // rjf: no advancing? -> +1 - if(t_off == t_start_off) - { - t_off += 1; - } - - // rjf: depth == 0? -> done - if(depth == 0) - { - break; - } - } - - // rjf: is this the starter task? -> advance base reading offset - // - // NOTE(rjf): in the case of functions, we need to apply the entire type - // discovery/hashing/gathering work to children of functions - *but* we - // also need to hash other children of functions. so, in that case, we - // only advance past the function root tag once we're done hashing all - // children we want - but, we still need to parse the children of the - // function again, in order to find types etc. contained within functions. - // - if(t == &start_task && tree_root_tag_kind == DW_TagKind_SubProgram && t->off == start_off) - { - off = t_off; - } - else if(t == &start_task) - { - off = t_off; - } + hash_seed = u64_hash_from_str8(name_attrib->val.string); } } - //- rjf: if offset not advanced -> increment - if(off == start_off) + // rjf: update depth / parent stack + if(tag.has_children) { - off += 1; + depth += 1; + D2R2_ParentTagNode *n = free_parent; + if(n != 0) + { + SLLStackPop(free_parent); + } + else + { + n = push_array(work_scratch.arena, D2R2_ParentTagNode, 1); + } + SLLStackPush(top_parent, n); + n->tag_kind = tag.kind; + n->info_off = start_off; + n->hash_seed = hash_seed; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + depth = Max(0, depth); + if(top_parent != 0) + { + D2R2_ParentTagNode *popped = top_parent; + SLLStackPop(top_parent); + SLLStackPush(free_parent, popped); + } } - //- rjf: atomically gather this hash if not already gathered - if(is_deduped_tag_tree) + scratch_end(tag_scratch); + if(off == start_off) { - B32 gathered = 0; - U64 slot_idx = hash%unique_tag_slots_count; - for(;!gathered;) + break; + } + } + } + + //- rjf: hash all tags we need to deduplicate & gather + for(D2R2_TagNode *tag_n = first_tag_to_dedup; tag_n != 0; tag_n = tag_n->next) + { + Temp dedup_root_scratch = scratch_begin(&scratch.arena, 1); + U64 start_off = tag_n->info_off; + D2R2_UniqueTagKind unique_tag_kind = tag_n->kind; + U64 container_ancestor_info_off = tag_n->container_ancestor_info_off; + U64 hash_seed = tag_n->hash_seed; + + //- rjf: hash all tags & dependency tag trees + U64 hash = hash_seed; + { + typedef struct TagTask TagTask; + struct TagTask + { + TagTask *next; + U64 unit_idx; + U64 off; + U64 order_idx; + }; + TagTask start_task = {0, origin_unit_idx, start_off}; + TagTask *top_task = &start_task; + TagTask *free_task = 0; + U64 seen_task_slots_count = 16; + TagTask **seen_task_slots = push_array(dedup_root_scratch.arena, TagTask *, seen_task_slots_count); + for(TagTask *t = top_task, *next = 0; t != 0; t = next) + { + next = 0; + U64 t_off = t->off; + + // rjf: record this task in our seen task table { - // rjf: read existing slot head pointer *before* we lookup / insert - U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_tag_slots[slot_idx]); + U64 hash = u64_hash_from_str8(str8_struct(&t->off)); + U64 slot_idx = hash%seen_task_slots_count; + SLLStackPush(seen_task_slots[slot_idx], t); + } + + // rjf: unpack unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; + + // rjf: read/hash the full tag tree at `t_off`; kick off additional + // tasks for referenced dependency types + S64 depth = 0; + B32 hash_should_include_children = 1; + for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max && (depth > 0 || t_off == t->off);) + { + Temp tag_scratch = scratch_begin(&dedup_root_scratch.arena, 1); + U64 t_start_off = t_off; - // rjf: determine if this hash has been gathered - D2R2_UniqueTagNode *already_gathered_node = 0; - for(D2R2_UniqueTagNode *n = (D2R2_UniqueTagNode *)slot_head_val; n != 0; n = n->next) + // rjf: read tag + DW2_Tag tag = {0}; + t_off += dw2_read_tag(tag_scratch.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, t_off, &tag); + + // rjf: determine if tag should be skipped from hashing + B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || + tag.kind == DW_TagKind_Variable); + + // rjf: determine if we want to consider tag children as part of the content hash + if(t_start_off == t->off && tag.kind == DW_TagKind_Namespace) { - if(n->hash == hash) + hash_should_include_children = 0; + } + + // rjf: if we want to combine this tag into the hash -> combine + if(!should_skip_tag) + { + // rjf: combine tag's kind + hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); + + // rjf: combine non-reference attributes (references could be different, + // because of deduping, but they could match ultimately). for any + // referenced dependency types, kick them off + for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) { - gathered = 1; - already_gathered_node = n; - break; + // rjf: non-reference? -> combine attribute value info + if(n->v.val.kind != DW_Form_RefAddr && + n->v.val.kind != DW_Form_Ref1 && + n->v.val.kind != DW_Form_Ref2 && + n->v.val.kind != DW_Form_Ref4 && + n->v.val.kind != DW_Form_Ref8 && + n->v.val.kind != DW_Form_RefUData && + n->v.val.kind != DW_Form_RefSup4 && + n->v.val.kind != DW_Form_RefSig8 && + ((tag.kind != DW_TagKind_SubProgram && + tag.kind != DW_TagKind_FormalParameter) || + (n->v.attrib_kind != DW_AttribKind_Name && + n->v.attrib_kind != DW_AttribKind_DeclFile && + n->v.attrib_kind != DW_AttribKind_DeclLine && + n->v.attrib_kind != DW_AttribKind_Prototyped && + n->v.attrib_kind != DW_AttribKind_External && + n->v.attrib_kind != DW_AttribKind_FrameBase && + n->v.attrib_kind != DW_AttribKind_Location && + n->v.attrib_kind != DW_AttribKind_LowPc && + n->v.attrib_kind != DW_AttribKind_HighPc))) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); + if(n->v.val.string.size != 0) + { + hash = u64_hash_from_seed_str8(hash, n->v.val.string); + } + else if(n->v.val.addr != 0) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.addr)); + } + else + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); + } + } + + // rjf: type reference? -> if seen, combine the order; if not, recurse + if(n->v.attrib_kind == DW_AttribKind_Type) + { + // rjf: unpack reference + U64 ref_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); + + // rjf: determine if we've seen this reference + B32 already_seen = 0; + U64 already_seen_order_idx = 0; + { + U64 off_hash = u64_hash_from_str8(str8_struct(&ref_info_off)); + U64 off_slot_idx = off_hash%seen_task_slots_count; + for(TagTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) + { + if(t->off == ref_info_off) + { + already_seen = 1; + already_seen_order_idx = t->order_idx; + break; + } + } + } + + // rjf: if we've seen -> hash the order + if(already_seen) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&already_seen_order_idx)); + } + + // rjf: if we've not seen -> descend + if(!already_seen) + { + TagTask *dependency_task = free_task; + if(dependency_task != 0) + { + SLLStackPop(free_task); + } + else + { + dependency_task = push_array(dedup_root_scratch.arena, TagTask, 1); + } + dependency_task->next = next; + next = dependency_task; + dependency_task->off = ref_info_off; + dependency_task->unit_idx = t->unit_idx; + if(!contains_1u64(unit_info_tag_range, dependency_task->off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + dependency_task->unit_idx = new_unit_num-1; + } + } + dependency_task->order_idx = t->order_idx+1; + } + } } } - // rjf: if this hash *has* been gathered, we want to prefer a - // deterministic unit/info offset - so we'll just prefer the - // lowest unit/offset. - // - // TODO(rjf): this seems to only be necessary because of a flaw - // in the deduplicator logic (without this part). in theory, if we - // trust the hash (all experiments suggested that we should - e.g. - // no hash collisions w/ different data were observed), then the - // same hash should imply an identical type graph. this may be false - // for reasons I do not currently understand, or due to a mistake - // somewhere. but for now, I've added this, to ensure that when there - // are many type tag trees which map to an identical hash, we always - // parse the one from the lowest .debug_info offset, just to make - // sure it's deterministic. in a multi-threaded conversion, this - // is not true in general without this step; one thread which finds - // the same type with a higher .debug_info offset may win, and so - // where exactly one type hash is parsed is not deterministic. but, - // the theory is, that shouldn't matter - the type graphs should - // match nonetheless. in any case, if that turns out to be a broken - // theory, this should be a relatively cheap step to guarantee - // deterministic (hash -> .debug_info offset), which is likely a - // desirable property regardless. but I wanted to leave this here - // so that I can more closely verify what is going on later. - // - if(gathered && already_gathered_node != 0) + // rjf: tree nav if we need to + if(hash_should_include_children) { - B32 minimized = 0; - for(;!minimized;) + if(tag.has_children) { - U64 stored_info_off = ins_atomic_u64_eval(&already_gathered_node->info_off); - if(start_off < stored_info_off) - { - if(ins_atomic_u64_eval_cond_assign(&already_gathered_node->info_off, start_off, stored_info_off) == stored_info_off) - { - minimized = 1; - } - } - else + depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + depth = Max(0, depth); + } + } + scratch_end(tag_scratch); + } + } + } + + //- rjf: atomically gather this hash if not already gathered + { + B32 gathered = 0; + U64 slot_idx = hash%unique_tag_slots_count; + for(;!gathered;) + { + // rjf: read existing slot head pointer *before* we lookup / insert + U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_tag_slots[slot_idx]); + + // rjf: determine if this hash has been gathered + D2R2_UniqueTagNode *already_gathered_node = 0; + for(D2R2_UniqueTagNode *n = (D2R2_UniqueTagNode *)slot_head_val; n != 0; n = n->next) + { + if(n->hash == hash) + { + gathered = 1; + already_gathered_node = n; + break; + } + } + + // rjf: if this hash *has* been gathered, we want to prefer a + // deterministic unit/info offset - so we'll just prefer the + // lowest unit/offset. + // + // TODO(rjf): this seems to only be necessary because of a flaw + // in the deduplicator logic (without this part). in theory, if we + // trust the hash (all experiments suggested that we should - e.g. + // no hash collisions w/ different data were observed), then the + // same hash should imply an identical type graph. this may be false + // for reasons I do not currently understand, or due to a mistake + // somewhere. but for now, I've added this, to ensure that when there + // are many type tag trees which map to an identical hash, we always + // parse the one from the lowest .debug_info offset, just to make + // sure it's deterministic. in a multi-threaded conversion, this + // is not true in general without this step; one thread which finds + // the same type with a higher .debug_info offset may win, and so + // where exactly one type hash is parsed is not deterministic. but, + // the theory is, that shouldn't matter - the type graphs should + // match nonetheless. in any case, if that turns out to be a broken + // theory, this should be a relatively cheap step to guarantee + // deterministic (hash -> .debug_info offset), which is likely a + // desirable property regardless. but I wanted to leave this here + // so that I can more closely verify what is going on later. + // + if(gathered && already_gathered_node != 0) + { + B32 minimized = 0; + for(;!minimized;) + { + U64 stored_info_off = ins_atomic_u64_eval(&already_gathered_node->info_off); + if(start_off < stored_info_off) + { + if(ins_atomic_u64_eval_cond_assign(&already_gathered_node->info_off, start_off, stored_info_off) == stored_info_off) { minimized = 1; } } - } - - // rjf: if this hash has *not* been gathered, try an insert. we: - // - // 1. allocate/fill a node - // 2. set it up to point to the old head - // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above - // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again - // (we may find that another thread has filled this hash, so we'll just be done) - // - if(!gathered) - { - Temp insert_temp = temp_begin(scratch.arena); - D2R2_UniqueTagNode *n = push_array(scratch.arena, D2R2_UniqueTagNode, 1); - n->next = (D2R2_UniqueTagNode *)slot_head_val; - n->kind = unique_tag_kind; - n->hash = hash; - n->info_off = start_off; - U64 new_head_val = (U64)n; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_tag_slots[slot_idx], new_head_val, slot_head_val)) - { - gathered = 1; - } else { - temp_end(insert_temp); + minimized = 1; } } } - } - - //- rjf: atomically record this (info_off -> hash) mapping, so that when we have - // later references to this type, we can redirect to the deduplicated type with - // the right hash later. - if(is_deduped_tag_tree) - { - U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; - UnitDedupedTagNode *n = push_array(scratch.arena, UnitDedupedTagNode, 1); - n->src_info_off = start_off; - n->dst_hash = hash; - for(B32 inserted = 0; !inserted;) + + // rjf: if this hash has *not* been gathered, try an insert. we: + // + // 1. allocate/fill a node + // 2. set it up to point to the old head + // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above + // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again + // (we may find that another thread has filled this hash, so we'll just be done) + // + if(!gathered) { - U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); - n->next = (UnitDedupedTagNode *)slot_head_val; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) + Temp insert_temp = temp_begin(scratch.arena); + D2R2_UniqueTagNode *n = push_array(scratch.arena, D2R2_UniqueTagNode, 1); + n->next = (D2R2_UniqueTagNode *)slot_head_val; + n->kind = unique_tag_kind; + n->hash = hash; + n->info_off = start_off; + n->container_ancestor_info_off = container_ancestor_info_off; + U64 new_head_val = (U64)n; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_tag_slots[slot_idx], new_head_val, slot_head_val)) { - inserted = 1; + gathered = 1; + } + else + { + temp_end(insert_temp); } } } - - //- rjf: navigate tree in origin unit - only if we are not iterating - // a type tree. the type tree will have already been processed, because - // we needed to hash all of the content. but for non-type tag trees, - // we need to descend and parse their contents, since they may contain - // types themselves. - // - if(!is_deduped_tag_tree) + } + + //- rjf: atomically record this (info_off -> hash) mapping, so that when we have + // later references to this type, we can redirect to the deduplicated type with + // the right hash later. + { + U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; + UnitDedupedTagNode *n = push_array(scratch.arena, UnitDedupedTagNode, 1); + n->src_info_off = start_off; + n->dst_hash = hash; + for(B32 inserted = 0; !inserted;) { - if(tag_has_children) + U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); + n->next = (UnitDedupedTagNode *)slot_head_val; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) { - origin_unit_depth += 1; - } - if(tag_ends_children) - { - origin_unit_depth -= 1; + inserted = 1; } } - - scratch_end(scratch2); } + scratch_end(dedup_root_scratch); } + + scratch_end(work_scratch); } lane_sync(); } @@ -2938,6 +2975,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: unpack type RDIM_Type *type = 0; + if(type_attrib != &dw2_attrib_nil) { // rjf: attrib -> info off / unit idx U64 type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); @@ -3239,18 +3277,22 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; //- rjf: produce all unit symbols in this work - typedef struct D2R2_ScopeNode D2R2_ScopeNode; - struct D2R2_ScopeNode - { - D2R2_ScopeNode *next; - RDIM_Scope *scope; - RDIM_LocationCaseList framebase_location_cases; - }; - D2R2_ScopeNode *top_scope = 0; - D2R2_ScopeNode *free_scope = 0; U64 chunk_count = 256; for(U64 root_tag_idx = root_tag_idx_range.min; root_tag_idx < root_tag_idx_range.max; root_tag_idx += 1) { + typedef struct D2R2_ParentNode D2R2_ParentNode; + struct D2R2_ParentNode + { + D2R2_ParentNode *next; + DW_TagKind tag_kind; + U64 info_off; + RDIM_Scope *scope; + RDIM_Type *container_type; + RDIM_Namespace *container_namespace; + RDIM_LocationCaseList framebase_location_cases; + }; + D2R2_ParentNode *top_parent = 0; + D2R2_ParentNode *free_parent = 0; U64 root_tag_start_off = unit_info_root_tag_offs[unit_idx].v[root_tag_idx]; S64 depth = 1; for(U64 off = root_tag_start_off; off < unit_info_tag_range.max && (depth > 1 || off == root_tag_start_off);) @@ -3466,7 +3508,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: iterate each frame base location case, or once if there are none, // and convert the location in that context RDIM_LocationCase nil_framebase_loc_case = {0, {0}, {0, max_U64}}; - for(RDIM_LocationCase *framebase_loc_n = top_scope ? top_scope->framebase_location_cases.first : &nil_framebase_loc_case; + for(RDIM_LocationCase *framebase_loc_n = top_parent ? top_parent->framebase_location_cases.first : &nil_framebase_loc_case; framebase_loc_n != 0; framebase_loc_n = framebase_loc_n->next) { @@ -4161,6 +4203,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////// //- rjf: produce symbols from tag // + RDIM_Symbol *new_symbol = 0; RDIM_Scope *new_scope_open = 0; switch(tag.kind) { @@ -4179,13 +4222,14 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) root_scope->symbol = procedure; root_scope->voff_ranges = ranges; dst_artifacts->scopes.scope_voff_count += 2*ranges.count; + new_symbol = procedure; new_scope_open = root_scope; }break; //- rjf: inline site case DW_TagKind_InlinedSubroutine: { - + // TODO(rjf) }break; //- rjf: variables @@ -4199,9 +4243,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { dst_symbols = &dst_artifacts->thread_variables; } - else if(top_scope != 0) + else if(top_parent != 0 && top_parent->scope != 0) { - dst_symbols = &top_scope->scope->locals; + dst_symbols = &top_parent->scope->locals; var_chunk_count = 8; } RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, dst_symbols, var_chunk_count); @@ -4210,11 +4254,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) var->name = name; var->link_name = link_name; var->type = type; - if(top_scope != 0) - { - var->container_scope = top_scope->scope; - } var->location_cases = location_cases; + new_symbol = var; }break; //- rjf: lexical blocks (scopes) @@ -4228,52 +4269,123 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //////////////////////// - //- rjf: push scopes + //- rjf: equip new symbols with container info // - if(new_scope_open) + if(new_symbol != 0 && top_parent != 0) { - // rjf: insert scope to parent - if(top_scope != 0) + if(top_parent->scope != 0) { - RDIM_Scope *parent = top_scope->scope; - SLLQueuePush_N(parent->first_child, parent->last_child, new_scope_open, next_sibling); - new_scope_open->parent_scope = parent; - if(new_scope_open->symbol == 0) + new_symbol->container_scope = top_parent->scope; + } + else if(top_parent->container_type != 0) + { + new_symbol->container_type = top_parent->container_type; + } + else if(top_parent->container_namespace != 0) + { + new_symbol->container_namespace = top_parent->container_namespace; + } + } + + //////////////////////// + //- rjf: insert new scopes to their parent + // + if(new_scope_open && top_parent != 0 && top_parent->scope != 0) + { + RDIM_Scope *parent = top_parent->scope; + SLLQueuePush_N(parent->first_child, parent->last_child, new_scope_open, next_sibling); + new_scope_open->parent_scope = parent; + if(new_scope_open->symbol == 0) + { + new_scope_open->symbol = parent->symbol; + } + } + + //////////////////////// + //- rjf: gather container info for new tag parents + // + RDIM_Type *container_type = 0; + RDIM_Namespace *container_namespace = 0; + if(tag.has_children) + { + // rjf: info offset -> hash + U64 hash = 0; + { + UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for EachNode(n, UnitDedupedTagNode, unit_deduped_tag_map->slots[info_off_slot_idx]) { - new_scope_open->symbol = parent->symbol; + if(n->src_info_off == start_off) + { + hash = n->dst_hash; + break; + } } } - // rjf: push new scope to stack - D2R2_ScopeNode *n = free_scope; + // rjf: map hash -> unique tag node + D2R2_UniqueTagNode *tag_node = 0; + { + U64 slot_idx = hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + tag_node = n; + break; + } + } + } + + // rjf: map tag node -> type/namespace + if(tag_node != 0) switch(tag_node->kind) + { + default:{}break; + case D2R2_UniqueTagKind_Type: {container_type = type_from_idx_map[tag_node->order_idx];}break; + case D2R2_UniqueTagKind_Namespace:{container_namespace = namespace_from_idx_map[tag_node->order_idx];}break; + } + } + + //////////////////////// + //- rjf: push tag parents + // + if(tag.has_children) + { + // rjf: push new parent to stack + D2R2_ParentNode *n = free_parent; if(n != 0) { - SLLStackPop(free_scope); + SLLStackPop(free_parent); } else { - n = push_array(scratch.arena, D2R2_ScopeNode, 1); + n = push_array(scratch.arena, D2R2_ParentNode, 1); } - n->scope = new_scope_open; + n->tag_kind = tag.kind; + n->info_off = start_off; + n->scope = new_scope_open ? new_scope_open : top_parent ? top_parent->scope : 0; + n->container_type = new_scope_open ? 0 : container_type; + n->container_namespace = new_scope_open ? 0 : container_namespace; if(framebase_attrib != &dw2_attrib_nil) { n->framebase_location_cases = framebase_location_cases; } - else if(top_scope != 0) + else if(top_parent != 0) { - n->framebase_location_cases = top_scope->framebase_location_cases; + n->framebase_location_cases = top_parent->framebase_location_cases; } - SLLStackPush(top_scope, n); + SLLStackPush(top_parent, n); } //////////////////////// //- rjf: pop scopes // - if(tag.kind == DW_TagKind_Null && top_scope != 0) + if(tag.kind == DW_TagKind_Null && top_parent != 0) { - D2R2_ScopeNode *n = top_scope; - SLLStackPop(top_scope); - SLLStackPush(free_scope, n); + D2R2_ParentNode *n = top_parent; + SLLStackPop(top_parent); + SLLStackPush(free_parent, n); } //////////////////////// @@ -4331,6 +4443,147 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync(); } + //////////////////////////// + //- rjf: upgrade all types with namespacing info + // + ProfScope("upgrade all types with namespacing info") + { + Rng1U64 range = lane_range(type_count); + for EachInRange(type_idx, range) + { + D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + U64 container_ancestor_info_off = type_tag_node->container_ancestor_info_off; + RDIM_Type *dst_type = type_from_idx_map[type_idx]; + if(dst_type == 0) + { + continue; + } + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + continue; + } + + // rjf: find container types/namespaces + RDIM_Type *container_type = 0; + RDIM_Namespace *container_namespace = 0; + { + U64 info_off = container_ancestor_info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; + + // rjf: info off -> hash + U64 hash = 0; + { + UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for(UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == info_off) + { + hash = n->dst_hash; + break; + } + } + } + + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + if(n->kind == D2R2_UniqueTagKind_Type) + { + container_type = type_from_idx_map[n->order_idx]; + } + else if(n->kind == D2R2_UniqueTagKind_Namespace) + { + container_namespace = namespace_from_idx_map[n->order_idx]; + } + break; + } + } + } + } + + // rjf: fill + dst_udt->container_type = container_type; + dst_udt->container_namespace = container_namespace; + } + } + lane_sync(); + + //////////////////////////// + //- rjf: upgrade all namespaces with namespacing info + // + ProfScope("upgrade all namespaces with namespacing info") + { + Rng1U64 range = lane_range(namespace_count); + for EachInRange(namespace_idx, range) + { + D2R2_UniqueTagNode *unique_tag_node = namespace_tag_nodes[namespace_idx]; + U64 container_ancestor_info_off = unique_tag_node->container_ancestor_info_off; + RDIM_Namespace *dst_namespace = namespace_from_idx_map[namespace_idx]; + if(dst_namespace == 0) + { + continue; + } + + // rjf: find container types/namespaces + RDIM_Type *container_type = 0; + RDIM_Namespace *container_namespace = 0; + { + U64 info_off = container_ancestor_info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; + + // rjf: info off -> hash + U64 hash = 0; + { + UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for(UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == info_off) + { + hash = n->dst_hash; + break; + } + } + } + + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + if(n->kind == D2R2_UniqueTagKind_Type) + { + container_type = type_from_idx_map[n->order_idx]; + } + else if(n->kind == D2R2_UniqueTagKind_Namespace) + { + container_namespace = namespace_from_idx_map[n->order_idx]; + } + break; + } + } + } + } + + // rjf: fill + dst_namespace->parent_type = container_type; + dst_namespace->parent_namespace = container_namespace; + } + } + lane_sync(); + //////////////////////////// //- rjf: fill result // diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h index 466a6fa1..ff09ee2d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -22,6 +22,7 @@ struct D2R2_UniqueTagNode D2R2_UniqueTagKind kind; U64 hash; U64 info_off; + U64 container_ancestor_info_off; U64 order_idx; }; From fb0476800283fd09fadfe058915e01fcaf81ca4f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 09:42:55 -0700 Subject: [PATCH 488/850] d2r2: hook up scope containers to contained types / namespaces; fix address table parsing --- src/dwarf/dwarf_parse_2.c | 42 ++++++++-- src/dwarf/dwarf_parse_2.h | 2 + src/eval/eval_interpret.c | 13 +++- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 107 +++++++++++++++++++++++++- src/rdi_from_elf/rdi_from_elf.c | 19 +++-- src/regs/regs.mdesk | 21 +++-- 6 files changed, 170 insertions(+), 34 deletions(-) diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index d2685027..7a45cbde 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -908,15 +908,27 @@ dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out) // rjf: version 5: read rest (this section only exists in 5+) if(version == DW_Version_5) { - // rjf: skip padding - off += sizeof(U16); + // rjf: read address / segment selector size (these need to be 0 in non-address offset tables) + U8 addr_size = 0; + U8 segment_selector_size = 0; + off += str8_deserial_read_struct(data, off, &addr_size); + off += str8_deserial_read_struct(data, off, &segment_selector_size); + + // rjf: determine entry size + U64 entry_size = dw_size_from_format(format); + if(addr_size != 0) + { + entry_size = addr_size + segment_selector_size; + } // rjf: fill table info - out->format = format; - out->version = version; - out->entry_size = dw_size_from_format(format); - out->entries_count = (unit_data_off_opl - off) / out->entry_size; - out->entries = data.str + off; + out->format = format; + out->version = version; + out->addr_size = addr_size; + out->segment_selector_size = segment_selector_size; + out->entry_size = entry_size; + out->entries_count = (unit_data_off_opl - off) / out->entry_size; + out->entries = data.str + off; // rjf: skip table off = unit_data_off_opl; @@ -934,7 +946,21 @@ dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out) { U64 entry_size = tbl->entry_size; U64 entry_off = idx * entry_size; - MemoryCopy(out, (U8 *)tbl->entries + entry_off, entry_size); + if(tbl->addr_size != 0) + { + U64 segment_off = entry_off; + U64 addr_off = entry_off + tbl->segment_selector_size; + U64 segment = 0; + U64 addr = 0; + MemoryCopy(&segment, (U8 *)tbl->entries + segment_off, tbl->segment_selector_size); + MemoryCopy(&addr, (U8 *)tbl->entries + addr_off, tbl->addr_size); + // TODO(rjf): @segment_based_addressing + *out = addr; + } + else + { + MemoryCopy(out, (U8 *)tbl->entries + entry_off, entry_size); + } result = 1; } return result; diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index bce9f7a9..533698cc 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -44,6 +44,8 @@ struct DW2_OffsetTable { DW_Format format; DW_Version version; + U8 addr_size; + U8 segment_selector_size; U64 entry_size; U64 entries_count; void *entries; diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index b68e5d13..75d75299 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -281,10 +281,15 @@ e_interpret(String8 bytecode) U8 byte_size = (imm.u64&0x00FF00)>>8; U8 byte_off = (imm.u64&0xFF0000)>>16; REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_interpret_ctx->reg_arch, rdi_reg_code); - REGS_Rng rng = regs_reg_code_rng_table_from_arch(e_interpret_ctx->reg_arch)[base_reg_code]; - U64 off = (U64)rng.byte_off + byte_off; - U64 size = (U64)byte_size; - B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size)); + REGS_Rng *rng_table = regs_reg_code_rng_table_from_arch(e_interpret_ctx->reg_arch); + B32 good_read = 0; + if(0 <= rdi_reg_code && rdi_reg_code < regs_reg_code_count_from_arch(e_interpret_ctx->reg_arch)) + { + REGS_Rng rng = rng_table[base_reg_code]; + U64 off = (U64)rng.byte_off + byte_off; + U64 size = (U64)byte_size; + good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size)); + } if(!good_read) { result.code = E_InterpretationCode_BadRegRead; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index e907546c..24c50683 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -2455,7 +2455,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: build type dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); dst_type->kind = RDI_TypeKind_Function; - dst_type->name = name; dst_type->direct_type = direct_type; dst_type->byte_size = arch_addr_size; @@ -2914,7 +2913,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) (type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_Class || - type->kind == RDI_TypeKind_Enum)) + type->kind == RDI_TypeKind_Enum || + type->kind == RDI_TypeKind_Alias)) { // rjf: produce UDT RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &lane_udts, chunk_count); @@ -3238,6 +3238,19 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////////// //- rjf: convert all symbols // + typedef struct D2R2_ScopeContainerNode D2R2_ScopeContainerNode; + struct D2R2_ScopeContainerNode + { + D2R2_ScopeContainerNode *next; + U64 info_off; + RDIM_Scope *scope; + }; + typedef struct D2R2_ScopeContainerMap D2R2_ScopeContainerMap; + struct D2R2_ScopeContainerMap + { + D2R2_ScopeContainerNode **slots; + U64 slots_count; + }; typedef struct D2R2_SubUnitWorkArtifacts D2R2_SubUnitWorkArtifacts; struct D2R2_SubUnitWorkArtifacts { @@ -3248,13 +3261,18 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_ScopeChunkList scopes; RDIM_InlineSiteChunkList inline_sites; }; + D2R2_ScopeContainerMap *scope_container_map = 0; D2R2_SubUnitWorkArtifacts *sub_unit_work_artifacts = 0; ProfScope("convert all symbols") { if(lane_idx() == 0) { + scope_container_map = push_array(scratch.arena, D2R2_ScopeContainerMap, 1); + scope_container_map->slots_count = total_tag_count_estimate/8 + 1; + scope_container_map->slots = push_array(scratch.arena, D2R2_ScopeContainerNode *, scope_container_map->slots_count); sub_unit_work_artifacts = push_array(scratch.arena, D2R2_SubUnitWorkArtifacts, sub_unit_works_count); } + lane_sync_u64(&scope_container_map, 0); lane_sync_u64(&sub_unit_work_artifacts, 0); U64 work_take_idx_ = 0; U64 *work_take_idx_ptr = &work_take_idx_; @@ -4205,10 +4223,22 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // RDIM_Symbol *new_symbol = 0; RDIM_Scope *new_scope_open = 0; + B32 parent_tag_is_container_to_deduped_tags = 0; switch(tag.kind) { default:{}break; + //- rjf: determine if parent tag is a container to deduplicated tags + case DW_TagKind_Namespace: + case DW_TagKind_StructureType: + case DW_TagKind_UnionType: + case DW_TagKind_ClassType: + case DW_TagKind_EnumerationType: + case DW_TagKind_Typedef: + { + parent_tag_is_container_to_deduped_tags = 1; + }break; + //- rjf: subprograms (procedures) case DW_TagKind_SubProgram: { @@ -4268,6 +4298,44 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) }break; } + //////////////////////// + //- rjf: if we've determined that the parent tag is a container to + // deduplicated tags (types, namespaces), then we need to record + // the .debug_info offset -> scope mapping for this scope, so it + // can be equipped as a container later. + // + if(parent_tag_is_container_to_deduped_tags) + { + U64 info_off = 0; + RDIM_Scope *scope = 0; + for(D2R2_ParentNode *n = top_parent; n != 0; n = n->next) + { + if(n->scope != 0) + { + info_off = n->info_off; + scope = n->scope; + break; + } + } + if(scope != 0) + { + D2R2_ScopeContainerNode *n = push_array(scratch.arena, D2R2_ScopeContainerNode, 1); + n->info_off = info_off; + n->scope = scope; + U64 hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 slot_idx = hash%scope_container_map->slots_count; + for(B32 gathered = 0; !gathered;) + { + U64 expected_head_value = ins_atomic_u64_eval(&scope_container_map->slots[slot_idx]); + n->next = (D2R2_ScopeContainerNode *)expected_head_value; + if(expected_head_value == ins_atomic_u64_eval_cond_assign(&scope_container_map->slots[slot_idx], (U64)n, expected_head_value)) + { + gathered = 1; + } + } + } + } + //////////////////////// //- rjf: equip new symbols with container info // @@ -4464,9 +4532,26 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) continue; } + // rjf: find container scopes + RDIM_Scope *container_scope = 0; + { + U64 info_off = container_ancestor_info_off; + U64 hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 slot_idx = hash%scope_container_map->slots_count; + for(D2R2_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) + { + if(n->info_off == info_off) + { + container_scope = n->scope; + break; + } + } + } + // rjf: find container types/namespaces RDIM_Type *container_type = 0; RDIM_Namespace *container_namespace = 0; + if(!container_scope) { U64 info_off = container_ancestor_info_off; U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); @@ -4510,6 +4595,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: fill + dst_udt->container_scope = container_scope; dst_udt->container_type = container_type; dst_udt->container_namespace = container_namespace; } @@ -4532,6 +4618,22 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) continue; } + // rjf: find container scopes + RDIM_Scope *container_scope = 0; + { + U64 info_off = container_ancestor_info_off; + U64 hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 slot_idx = hash%scope_container_map->slots_count; + for(D2R2_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) + { + if(n->info_off == info_off) + { + container_scope = n->scope; + break; + } + } + } + // rjf: find container types/namespaces RDIM_Type *container_type = 0; RDIM_Namespace *container_namespace = 0; @@ -4578,6 +4680,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: fill + dst_namespace->parent_scope = container_scope; dst_namespace->parent_type = container_type; dst_namespace->parent_namespace = container_namespace; } diff --git a/src/rdi_from_elf/rdi_from_elf.c b/src/rdi_from_elf/rdi_from_elf.c index 909a28a2..54ba08ab 100644 --- a/src/rdi_from_elf/rdi_from_elf.c +++ b/src/rdi_from_elf/rdi_from_elf.c @@ -20,14 +20,17 @@ e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_B if(src_section->sh_flags & ELF_Shf_Write) { flags |= RDI_BinarySectionFlag_Write; } if(src_section->sh_flags & ELF_Shf_ExecInstr) { flags |= RDI_BinarySectionFlag_Execute; } - // rjf: make rdi section - RDIM_BinarySection *dst_section = rdim_binary_section_list_push(arena, &result); - dst_section->name = name; - dst_section->flags = flags; - dst_section->voff_first = voff_first; - dst_section->voff_opl = voff_opl; - dst_section->foff_first = foff_first; - dst_section->foff_opl = foff_opl; + // rjf: make rdi section if not empty + if(name.size != 0 || voff_opl != voff_first || foff_opl != foff_first) + { + RDIM_BinarySection *dst_section = rdim_binary_section_list_push(arena, &result); + dst_section->name = name; + dst_section->flags = flags; + dst_section->voff_first = voff_first; + dst_section->voff_opl = voff_opl; + dst_section->foff_first = foff_first; + dst_section->foff_opl = foff_opl; + } } return result; } diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk index 0408c873..765781f7 100644 --- a/src/regs/regs.mdesk +++ b/src/regs/regs.mdesk @@ -1,6 +1,15 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Architecture Tables + +@table(name, name_lower) +REGS_ArchTable: +{ + {X64 x64} +} + //////////////////////////////// //~ rjf: X64 Tables @@ -200,18 +209,6 @@ REGS_AliasTableX64: {mm7 st7 0 64 Vector} } -//////////////////////////////// -//~ rjf: Architecture Tables - -@table(name, name_lower) -REGS_ArchTable: -{ - {X64 x64} -} - -//////////////////////////////// -//~ rjf: X64 Generators - @enum REGS_RegCodeX64: { NULL, From 384cf11eed63686c1d1a2a8fa147c485a965c2a5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 10:49:33 -0700 Subject: [PATCH 489/850] d2r2: fix line table register reset conditions in line table conversion --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 36 ++++++++++++++++++--------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 24c50683..efd88c9e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -922,10 +922,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) vm_regs.address += addr_advance; vm_regs.vliw_op_index = (vm_regs.vliw_op_index + op_advance) % line_table_header->max_ops_per_inst; vm_regs.line += line_advance; - vm_regs.basic_block = 0; - vm_regs.prologue_end = 0; - vm_regs.epilogue_begin = 0; - vm_regs.discriminator = 0; emit_line = 1; } @@ -949,10 +945,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) case DW_StdOpcode_Copy: { emit_line = 1; - vm_regs.discriminator = 0; - vm_regs.basic_block = 0; - vm_regs.prologue_end = 0; - vm_regs.epilogue_begin = 0; }break; //- rjf: PC advances @@ -1159,10 +1151,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) first_line_seq_chunk = last_line_seq_chunk = 0; total_line_seq_count = 0; line_seq_src_file = 0; - MemoryZeroStruct(&vm_regs); - vm_regs.file_index = 1; - vm_regs.line = 1; - vm_regs.is_stmt = line_table_header->default_is_stmt; + if(vm_regs.end_sequence) + { + MemoryZeroStruct(&vm_regs); + vm_regs.file_index = 1; + vm_regs.line = 1; + vm_regs.is_stmt = line_table_header->default_is_stmt; + } } //- rjf: emit lines @@ -1186,6 +1181,23 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) chunk->line_count += 1; total_line_seq_count += 1; line_seq_src_file = src_file; + // 0x0000000000030b80 141 0 201 0 0 0 is_stmt + printf("0x%016I64x %6i %6i %6i %3i %13I64x %7i %s%s%s%s\n", + vm_regs.address, + (int)vm_regs.line, + (int)vm_regs.column, + (int)vm_regs.file_index, + (int)vm_regs.isa, + vm_regs.discriminator, + (int)vm_regs.vliw_op_index, + vm_regs.is_stmt ? " is_stmt" : "", + vm_regs.prologue_end ? " prologue_end" : "", + vm_regs.epilogue_begin ? " epilogue_begin" : "", + vm_regs.end_sequence ? " end_sequence" : ""); + vm_regs.discriminator = 0; + vm_regs.basic_block = 0; + vm_regs.prologue_end = 0; + vm_regs.epilogue_begin = 0; } } From 1301165aeb0ac6f949f8d2e0a3ea5e7b0a468945 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 10:50:47 -0700 Subject: [PATCH 490/850] d2r2: disable llvm-dwarfdump-style line table logging --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index efd88c9e..8bc99c4d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1181,7 +1181,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) chunk->line_count += 1; total_line_seq_count += 1; line_seq_src_file = src_file; - // 0x0000000000030b80 141 0 201 0 0 0 is_stmt + // NOTE(rjf): use for comparing against llvm-dwarfdump --debug-line +#if 0 printf("0x%016I64x %6i %6i %6i %3i %13I64x %7i %s%s%s%s\n", vm_regs.address, (int)vm_regs.line, @@ -1194,6 +1195,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) vm_regs.prologue_end ? " prologue_end" : "", vm_regs.epilogue_begin ? " epilogue_begin" : "", vm_regs.end_sequence ? " end_sequence" : ""); +#endif vm_regs.discriminator = 0; vm_regs.basic_block = 0; vm_regs.prologue_end = 0; From 6e376e5615e88701aff0fbda75a249eab8bf9d73 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 10:57:46 -0700 Subject: [PATCH 491/850] rd: fix file path mapping to correctly use destination path's style in constructing mapped paths --- project.4coder | 4 ++-- src/base/base_strings.c | 28 ++++++++++++++-------------- src/raddbg/raddbg_core.c | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/project.4coder b/project.4coder index 7b07d80e..9967732e 100644 --- a/project.4coder +++ b/project.4coder @@ -46,10 +46,10 @@ load_paths = commands = { //- rjf: [raddbg] - // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin && pushd build && radbin --rdi simple && radbin --dump simple.rdi --out:simple.dump", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f1 = { .win = "build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 254f15ef..ec28906a 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -345,13 +345,13 @@ internal B32 str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags) { B32 matched = 0; - + U64 pattern_cursor = 0; U64 string_cursor = 0; - + U64 pattern_start = max_U64; U64 string_start = 0; - + for (;;) { if (pattern_cursor == pattern.size) { if (string_cursor == string.size || (flags & StringMatchFlag_RightSideSloppy)) { @@ -359,7 +359,7 @@ str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags) break; } } - + if (string_cursor == string.size) { while (pattern_cursor < pattern.size && pattern.str[pattern_cursor] == '*') { pattern_cursor += 1; @@ -367,31 +367,31 @@ str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags) matched = (pattern_cursor == pattern.size); break; } - + if (pattern_cursor < pattern.size && pattern.str[pattern_cursor] == '*') { pattern_start = pattern_cursor; string_start = string_cursor; pattern_cursor += 1; continue; } - - + + if (pattern_cursor < pattern.size && (pattern.str[pattern_cursor] == '?' || str8_char_match(string.str[string_cursor], pattern.str[pattern_cursor], flags))) { string_cursor += 1; pattern_cursor += 1; continue; } - + if (pattern_start != max_U64) { pattern_cursor = pattern_start + 1; string_start += 1; string_cursor = string_start; continue; } - + break; } - + return matched; } @@ -2362,7 +2362,7 @@ string_from_elapsed_time(Arena *arena, DateTime dt) } else if (dt.day) { str8_list_pushf(scratch.arena, &list, "%ud", dt.day); } - + if (dt.hour) { str8_list_pushf(scratch.arena, &list, "%uh %um %u.%us", dt.hour, dt.min, dt.sec, dt.msec); } else if (dt.min) { @@ -2374,13 +2374,13 @@ string_from_elapsed_time(Arena *arena, DateTime dt) } else if (dt.micro_sec) { str8_list_pushf(scratch.arena, &list, "%uus", dt.micro_sec); } - + if (list.node_count == 0) { str8_list_pushf(scratch.arena, &list, "0"); } - + String8 result = str8_list_join(arena, &list, &(StringJoin){ str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }); - + scratch_end(scratch); return result; } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 81a71a40..80d162f9 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -517,13 +517,13 @@ rd_mapped_from_file_path(Arena *arena, String8 file_path) } if(best_map_dst.size != 0) { + PathStyle dst_path_style = path_style_from_str8(best_map_dst); String8List best_map_dst_parts = str8_split_path(scratch.arena, best_map_dst); for(String8Node *n = best_map_remaining_suffix_first; n != 0; n = n->next) { str8_list_push(scratch.arena, &best_map_dst_parts, n->string); } - StringJoin join = {.sep = str8_lit("/")}; - file_path = str8_list_join(scratch.arena, &best_map_dst_parts, &join); + file_path = str8_path_list_join_by_style(scratch.arena, &best_map_dst_parts, dst_path_style); } } String8 result = push_str8_copy(arena, file_path); From 5f8e0a5aa9c563da3e360e5f972bd6265216dd6a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 11:00:08 -0700 Subject: [PATCH 492/850] rd: fix possible-overrides-from-file-path path to correctly use path styles --- src/raddbg/raddbg_core.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 80d162f9..966d78ad 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -593,9 +593,7 @@ rd_possible_overrides_from_file_path(Arena *arena, String8 file_path) { str8_list_push(scratch.arena, &candidate_parts, p->string); } - StringJoin join = {0}; - join.sep = str8_lit("/"); - String8 candidate_path = str8_list_join(arena, &candidate_parts, &join); + String8 candidate_path = str8_path_list_join_by_style(arena, &candidate_parts, src_style); str8_list_push(arena, &result, candidate_path); } } From 26646299a1948c92a79bcefc10df965002968687 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 11:20:38 -0700 Subject: [PATCH 493/850] rdi_make: preserve root-level `..`s in interned path tree --- project.4coder | 4 ++-- src/lib_rdi_make/rdi_make.c | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/project.4coder b/project.4coder index 9967732e..8292e83f 100644 --- a/project.4coder +++ b/project.4coder @@ -46,10 +46,10 @@ load_paths = commands = { //- rjf: [raddbg] - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - // .f1 = { .win = "build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index b95aa3fb..ca273bba 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1972,15 +1972,12 @@ rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_Stri } // rjf: .. -> go up - if(sub_dir.RDIM_String8_SizeMember == 2 && - sub_dir.RDIM_String8_BaseMember[0] == '.' && - sub_dir.RDIM_String8_BaseMember[1] == '.') + if(node->parent != 0 && + (sub_dir.RDIM_String8_SizeMember == 2 && + sub_dir.RDIM_String8_BaseMember[0] == '.' && + sub_dir.RDIM_String8_BaseMember[1] == '.')) { sub_dir_node = node->parent; - if(sub_dir_node == 0) - { - sub_dir_node = &tree->root; - } } // rjf: . -> stay here From 1c8a10e0f73dca99cf67c5f3bb2f96234f7e3708 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 11:47:26 -0700 Subject: [PATCH 494/850] rdi_make: fix path node lookup to respect root-level ..s --- src/lib_rdi_make/rdi_make.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index ca273bba..ee96ff32 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1885,15 +1885,12 @@ rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string) } // rjf: .. -> go up - if(sub_dir.RDIM_String8_SizeMember == 2 && - sub_dir.RDIM_String8_BaseMember[0] == '.' && - sub_dir.RDIM_String8_BaseMember[1] == '.') + if(node->parent != 0 && + (sub_dir.RDIM_String8_SizeMember == 2 && + sub_dir.RDIM_String8_BaseMember[0] == '.' && + sub_dir.RDIM_String8_BaseMember[1] == '.')) { sub_dir_node = node->parent; - if(sub_dir_node == 0) - { - sub_dir_node = &tree->root; - } } // rjf: . -> stay here From d9f7385f8157e905e348f8189d2e8ad3d80cc6d5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 12:13:07 -0700 Subject: [PATCH 495/850] d2r2: fix file sequence map build to use correct source files --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 8bc99c4d..9cfb33aa 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -1136,7 +1136,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { file_seq_n = push_array(scratch.arena, FileSeqNode, 1); SLLStackPush(unit_file_seq_maps[unit_idx].slots[slot_idx], file_seq_n); - file_seq_n->src_file = src_file; + file_seq_n->src_file = line_seq_src_file; } } From 44c6b6e4d5f1eb76909066e8b16060637fc70d50 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 12:22:20 -0700 Subject: [PATCH 496/850] do not duplicate function records for decls --- src/raddbg/raddbg_main.c | 5 +++++ src/rdi_from_dwarf/rdi_from_dwarf_2.c | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index c8fb7153..80ca6073 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,11 @@ //////////////////////////////// //~ rjf: post-0.9.25 TODO notes // +// [ ] linux fixes +// [ ] step-over/step-into doesn't step successfully in many cases, just causes a continue +// [ ] rd_frame has no type info, should be (void -> void) - type should be generated but it +// is not being hooked up correctly +// // [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! // //- evaluation space coverage pass diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 9cfb33aa..d093de85 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -3352,6 +3352,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Attrib *location_attrib = &dw2_attrib_nil; DW2_Attrib *framebase_attrib = &dw2_attrib_nil; DW2_Attrib *external_attrib = &dw2_attrib_nil; + DW2_Attrib *decl_attrib = &dw2_attrib_nil; for EachNode(n, DW2_AttribNode, tag.attribs.first) { switch(n->v.attrib_kind) @@ -3369,6 +3370,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Case(location, Location); Case(framebase, FrameBase); Case(external, External); + Case(decl, Declaration); #undef Case } } @@ -3380,6 +3382,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) String8 link_name = linkname_attrib->val.string; DW_InlKind inl_kind = (DW_InlKind)inline_attrib->val.u128.u64[0]; B32 is_external = (external_attrib != &dw2_attrib_nil); + B32 is_decl = (decl_attrib != &dw2_attrib_nil); //////////////////////// //- rjf: unpack ranges @@ -4255,6 +4258,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: subprograms (procedures) case DW_TagKind_SubProgram: + if(!is_decl) { RDIM_Scope *root_scope = rdim_scope_chunk_list_push(arena, &dst_artifacts->scopes, chunk_count); RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_artifacts->procedures, chunk_count); From b210afa5ee5b6b5ea60ad162ea2b058e2cced9e5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 12:30:12 -0700 Subject: [PATCH 497/850] demon/linux: do not assert on trap write/read success. breakpoints can evaluate to unmapped addresses --- src/demon/demon_core.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 41ad8cfe..bda30798 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -232,14 +232,6 @@ dmn_set_trap(Arena *arena, DMN_Trap *trap) result->trap = trap; result->swap_bytes = str8(swap_bytes, trap_inst.size); } - else - { - Assert(0 && "failed to write trap instruction"); - } - } - else - { - Assert(0 && "failed to read original byte"); } return result; } @@ -248,7 +240,6 @@ internal B32 dmn_remove_trap(DMN_ActiveTrap *active_trap) { B32 is_removed = dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str); - Assert(is_removed); return is_removed; } From 356237418f6cee20886346d05490b4250d9cef85 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 12:32:00 -0700 Subject: [PATCH 498/850] demon: always gather 'active' traps - do not require success --- src/demon/demon_core.c | 23 +++++------------------ src/demon/demon_core.h | 1 - 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index bda30798..82662840 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -221,25 +221,12 @@ dmn_get_trap_inst(void) internal DMN_ActiveTrap * dmn_set_trap(Arena *arena, DMN_Trap *trap) { - DMN_ActiveTrap *result = 0; String8 trap_inst = dmn_get_trap_inst(); U8 *swap_bytes = push_array(arena, U8, trap_inst.size); - if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), swap_bytes) == trap_inst.size) - { - if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), trap_inst.str) == trap_inst.size) - { - result = push_array(arena, DMN_ActiveTrap, 1); - result->trap = trap; - result->swap_bytes = str8(swap_bytes, trap_inst.size); - } - } + dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), swap_bytes); + dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), trap_inst.str); + DMN_ActiveTrap *result = push_array(arena, DMN_ActiveTrap, 1); + result->trap = trap; + result->swap_bytes = str8(swap_bytes, trap_inst.size); return result; } - -internal B32 -dmn_remove_trap(DMN_ActiveTrap *active_trap) -{ - B32 is_removed = dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str); - return is_removed; -} - diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 53aebfbd..4df517ca 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -280,6 +280,5 @@ internal void dmn_process_iter_end(DMN_ProcessIter *iter); internal String8 dmn_get_trap_inst(void); internal DMN_ActiveTrap * dmn_set_trap(Arena *arena, DMN_Trap *trap); -internal B32 dmn_remove_trap(DMN_ActiveTrap *active_trap); #endif // DEMON_CORE_H From 738163dcbd80068edbda23cfc34b7196465a4d2b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 12:35:20 -0700 Subject: [PATCH 499/850] demon: gather success status of setting traps, but do not fail on failure --- src/demon/demon_core.c | 9 +++++++-- src/demon/demon_core.h | 5 +++-- src/demon/linux/demon_core_linux.c | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 82662840..c4a342ae 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -223,9 +223,14 @@ dmn_set_trap(Arena *arena, DMN_Trap *trap) { String8 trap_inst = dmn_get_trap_inst(); U8 *swap_bytes = push_array(arena, U8, trap_inst.size); - dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), swap_bytes); - dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), trap_inst.str); + B32 good_read = dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), swap_bytes); + B32 good_write = 0; + if(good_read) + { + good_write = dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), trap_inst.str); + } DMN_ActiveTrap *result = push_array(arena, DMN_ActiveTrap, 1); + result->good = (good_read && good_write); result->trap = trap; result->swap_bytes = str8(swap_bytes, trap_inst.size); return result; diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 4df517ca..92874f97 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -155,9 +155,10 @@ struct DMN_TrapChunkList typedef struct DMN_ActiveTrap DMN_ActiveTrap; struct DMN_ActiveTrap { - DMN_Trap *trap; - String8 swap_bytes; DMN_ActiveTrap *next; + B32 good; + DMN_Trap *trap; + String8 swap_bytes; }; typedef struct DMN_RunCtrls DMN_RunCtrls; diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 5ba475a8..193c2554 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -2865,9 +2865,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) DMN_LNX_Process *process = dmn_lnx_process_from_handle(active_trap->trap->process); if(!process) { continue; } - if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str)) + if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str) && + active_trap->good) { - Assert(0 && "failed to restore original instruction bytes"); + // TODO(rjf): log an error here? - we wrote the trap successfully, but we did not remove it successfully, + // implying a change in address mapping. this is maybe not even a bug, since the address is simply now + // unmapped. } } } From 774e8e13059efc3aa82d0e561bedd129b5874a9d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 5 May 2026 12:57:04 -0700 Subject: [PATCH 500/850] notes --- src/raddbg/raddbg_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 80ca6073..ccf5f745 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,10 +4,11 @@ //////////////////////////////// //~ rjf: post-0.9.25 TODO notes // -// [ ] linux fixes +// [ ] linux/dwarf fixes // [ ] step-over/step-into doesn't step successfully in many cases, just causes a continue // [ ] rd_frame has no type info, should be (void -> void) - type should be generated but it // is not being hooked up correctly +// [ ] type views for `MyByte *` example do not match correctly // // [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! // From 24c858171f2ba59dd7f4bacb589ce1ae92343aed Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 21:49:15 -0700 Subject: [PATCH 501/850] fix complex and char conversion + note --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index d093de85..e67a0009 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -2593,10 +2593,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) CaseA(RDI_TypeKind_NULL, DW_ATE_Null) CaseA(RDI_TypeKind_Void, DW_ATE_Address) CaseA(RDI_TypeKind_Bool, DW_ATE_Boolean) - CaseB(RDI_TypeKind_ComplexF32, DW_ATE_ComplexFloat, 32) - CaseB(RDI_TypeKind_ComplexF64, DW_ATE_ComplexFloat, 64) - CaseB(RDI_TypeKind_ComplexF80, DW_ATE_ComplexFloat, 80) - CaseB(RDI_TypeKind_ComplexF128, DW_ATE_ComplexFloat, 128) + CaseB(RDI_TypeKind_ComplexF32, DW_ATE_ComplexFloat, 64) + CaseB(RDI_TypeKind_ComplexF64, DW_ATE_ComplexFloat, 128) + CaseB(RDI_TypeKind_ComplexF80, DW_ATE_ComplexFloat, 160) + CaseB(RDI_TypeKind_ComplexF128, DW_ATE_ComplexFloat, 256) CaseC(RDI_TypeKind_F80, DW_ATE_Float, "__float80") CaseC(RDI_TypeKind_F128, DW_ATE_Float, "__float128") CaseC(RDI_TypeKind_F16, DW_ATE_Float, "_Float16") @@ -2608,6 +2608,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) CaseB(RDI_TypeKind_F80, DW_ATE_Float, 80) CaseB(RDI_TypeKind_F96, DW_ATE_Float, 96) CaseB(RDI_TypeKind_F128, DW_ATE_Float, 128) + CaseB(RDI_TypeKind_Char8, DW_ATE_SignedChar, 8) + CaseB(RDI_TypeKind_Char16, DW_ATE_SignedChar, 16) + CaseB(RDI_TypeKind_Char32, DW_ATE_SignedChar, 32) CaseD(RDI_TypeKind_Char8, DW_ATE_Signed, "wchar_t", 8) CaseD(RDI_TypeKind_Char16, DW_ATE_Signed, "wchar_t", 16) CaseD(RDI_TypeKind_Char32, DW_ATE_Signed, "wchar_t", 32) @@ -2642,7 +2645,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) dst_type->kind = RDI_TypeKind_Alias; dst_type->name = name; dst_type->direct_type = d2r2_type_from_builtin_kind(rdi_type_kind); - dst_type->byte_size = bitsize/8; + dst_type->byte_size = bitsize/8; // TODO: byte size on __float80 alias mismatches byte size on direct type now }break; case DW_TagKind_PointerType: rdi_type_kind = RDI_TypeKind_Ptr; goto ptr_or_ref_type; case DW_TagKind_ReferenceType: rdi_type_kind = RDI_TypeKind_LRef; goto ptr_or_ref_type; From aea4a4ff9d6ed823b432d94b84fe88054f69265b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 8 May 2026 12:37:57 -0700 Subject: [PATCH 502/850] eliminate os_core, move into base; eliminate regs, move into arch abstraction layer, define x64 regs in x64 layer; move win32 backend for os core (now base) functionality to top-level win32 layer --- build.bat | 1 - project.4coder | 7 +- src/arch/arch.c | 168 ++ src/arch/arch.h | 47 + src/arch/arch_inc.c | 10 + src/arch/arch_inc.h | 15 + src/arch/dwarf/arch_dwarf.c | 19 + src/arch/dwarf/arch_dwarf.h | 9 + src/arch/rdi/arch_rdi.c | 19 + src/arch/rdi/arch_rdi.h | 9 + src/artifact_cache/artifact_cache.c | 6 +- src/base/base_arena.c | 28 +- src/base/base_core.h | 45 + src/base/base_dynamic_libraries.c | 2 + src/base/base_dynamic_libraries.h | 20 + src/base/base_entry_point.c | 7 +- src/base/base_files.c | 169 ++ src/base/base_files.h | 102 + src/base/base_inc.c | 14 + src/base/base_inc.h | 14 + src/base/base_markup.c | 19 - src/base/base_markup.h | 2 - src/base/base_math.c | 20 + src/base/base_math.h | 44 + src/base/base_memory.c | 2 + src/base/base_memory.h | 26 + src/base/base_processes.c | 115 + src/base/base_processes.h | 87 + src/base/base_profile.c | 2 +- src/base/base_profile.h | 2 +- src/base/base_shared_memory.c | 2 + src/base/base_shared_memory.h | 16 + src/base/base_system.c | 2 + src/base/base_system.h | 22 + src/base/base_thread_context.c | 8 +- src/base/base_threads.c | 88 +- src/base/base_threads.h | 29 +- src/content/content.c | 6 +- src/dbg_engine/dbg_engine_core.c | 24 +- src/dbg_engine/dbg_engine_ctrl.c | 249 +- src/dbg_engine/dbg_engine_ctrl.h | 8 +- src/dbg_engine/dbg_engine_user.c | 21 +- src/dbg_info/dbg_info.c | 80 +- src/dbg_info/dbg_info.h | 8 +- src/demon/demon_core.c | 18 +- src/demon/demon_core.h | 4 +- src/demon/linux/demon_core_linux.c | 34 +- src/demon/win32/demon_core_win32.c | 364 +-- src/disasm/disasm.c | 248 +- src/draw/draw.c | 2 +- src/draw/draw.h | 2 +- src/dwarf/dwarf.c | 5 + src/dwarf/dwarf.h | 5 + src/dwarf/dwarf.mdesk | 89 + src/dwarf/dwarf_expr.c | 2226 +++++++++-------- src/dwarf/dwarf_expr.h | 2 +- src/dwarf/dwarf_inc.c | 3 + src/dwarf/dwarf_inc.h | 3 + src/dwarf/dwarf_parse_2.c | 37 + src/dwarf/dwarf_parse_2.h | 5 + src/dwarf/dwarf_unwind.c | 402 +-- src/dwarf/dwarf_unwind.h | 3 +- .../generated/dwarf.meta.c} | 9 +- src/dwarf/generated/dwarf.meta.h | 87 + src/dwarf/x64/dwarf_x64.c | 4 + src/dwarf/x64/dwarf_x64.h | 9 + src/dwarf/x64/dwarf_x64.mdesk | 7 + src/dwarf/x64/generated/dwarf_x64.meta.c | 201 ++ src/dwarf/x64/generated/dwarf_x64.meta.h | 14 + src/eval/eval_core.c | 10 +- src/eval/eval_core.h | 2 - src/eval/eval_interpret.c | 11 +- src/eval/eval_ir.c | 52 +- src/eval/eval_ir.h | 3 - src/eval/eval_types.c | 38 +- src/eval/eval_types.h | 3 +- src/file_stream/file_stream.c | 16 +- .../dwrite/font_provider_dwrite.c | 2 +- src/linker/lnk.c | 24 +- src/linker/lnk_config.c | 34 +- src/linker/lnk_debug_info.c | 2 +- src/linker/lnk_io.c | 50 +- src/linker/lnk_io.h | 8 +- src/linker/lnk_timer.c | 4 +- src/linker/pdb_ext/pdb_builder.c | 2 +- src/linker/thread_pool/thread_pool.c | 22 +- src/linux/base/linux_base.c | 2 + src/linux/base/linux_base.h | 7 + src/mutable_text/mutable_text.c | 4 +- src/os/core/linux/os_core_linux.c | 29 - src/os/core/win32/os_core_win32.c | 149 -- src/os/gfx/os_gfx.c | 38 +- src/os/gfx/os_gfx.h | 106 +- src/os/gfx/win32/os_gfx_win32.c | 100 +- src/os/gfx/win32/os_gfx_win32.h | 15 +- src/os/os_inc.c | 4 +- src/os/os_inc.h | 4 +- src/pe/pe.c | 21 - src/radbin/radbin.c | 36 +- src/radbin/radbin_main.c | 2 + src/raddbg/raddbg_core.c | 148 +- src/raddbg/raddbg_core.h | 6 +- src/raddbg/raddbg_eval.c | 22 +- src/raddbg/raddbg_main.c | 72 +- src/raddbg/raddbg_views.c | 19 +- src/raddbg/raddbg_widgets.c | 5 +- src/rdi/rdi_local.c | 19 + src/rdi/rdi_local.h | 4 + src/rdi/x64/generated/rdi_x64.meta.c | 201 ++ src/rdi/x64/generated/rdi_x64.meta.h | 14 + src/rdi/x64/rdi_x64.c | 4 + .../regs_rdi.meta.h => rdi/x64/rdi_x64.h} | 18 +- src/rdi/x64/rdi_x64.mdesk | 7 + src/rdi_from_dwarf/rdi_from_dwarf_2.c | 145 +- src/rdi_from_dwarf/rdi_from_dwarf_2.h | 17 +- src/regs/dwarf/regs_dwarf.c | 77 - src/regs/dwarf/regs_dwarf.h | 14 - src/regs/generated/regs.meta.c | 686 ----- src/regs/generated/regs.meta.h | 314 --- src/regs/rdi/generated/regs_rdi.meta.c | 229 -- src/regs/rdi/regs_rdi.h | 10 - src/regs/rdi/regs_rdi.mdesk | 55 - src/regs/regs.c | 106 - src/regs/regs.h | 131 - src/regs/regs.mdesk | 395 --- src/render/d3d11/render_d3d11.c | 29 +- .../linux/egl/render_opengl_linux_egl.c | 16 +- .../linux/glx/render_opengl_linux_glx.c | 4 +- src/render/render_core.h | 10 +- src/scratch/eval_scratch.c | 51 - src/stap/stap_parse.c | 177 +- src/stap/stap_test.c | 30 +- src/strip_lib_debug/strip_lib_debug.c | 44 +- src/torture/torture.c | 266 +- src/torture/torture_d2r.c | 12 +- src/torture/torture_dwarf.c | 52 +- src/torture/torture_main.c | 8 +- src/torture/torture_p2r.c | 50 +- src/torture/torture_radlink.c | 24 +- src/ui/ui_core.c | 12 +- src/ui/ui_core.h | 6 +- src/win32/base/win32_base.c | 1919 ++++++++++++++ .../base/win32_base.h} | 252 +- src/x64/generated/x64.meta.c | 780 ++++++ src/x64/generated/x64.meta.h | 310 +++ src/x64/x64.c | 15 +- src/x64/x64.h | 18 +- src/x64/x64.mdesk | 231 ++ 148 files changed, 7942 insertions(+), 5268 deletions(-) create mode 100644 src/arch/arch.c create mode 100644 src/arch/arch.h create mode 100644 src/arch/arch_inc.c create mode 100644 src/arch/arch_inc.h create mode 100644 src/arch/dwarf/arch_dwarf.c create mode 100644 src/arch/dwarf/arch_dwarf.h create mode 100644 src/arch/rdi/arch_rdi.c create mode 100644 src/arch/rdi/arch_rdi.h create mode 100644 src/base/base_dynamic_libraries.c create mode 100644 src/base/base_dynamic_libraries.h create mode 100644 src/base/base_files.c create mode 100644 src/base/base_files.h create mode 100644 src/base/base_memory.c create mode 100644 src/base/base_memory.h create mode 100644 src/base/base_processes.c create mode 100644 src/base/base_processes.h create mode 100644 src/base/base_shared_memory.c create mode 100644 src/base/base_shared_memory.h create mode 100644 src/base/base_system.c create mode 100644 src/base/base_system.h create mode 100644 src/dwarf/dwarf.mdesk rename src/{regs/rdi/regs_rdi.c => dwarf/generated/dwarf.meta.c} (68%) create mode 100644 src/dwarf/generated/dwarf.meta.h create mode 100644 src/dwarf/x64/dwarf_x64.c create mode 100644 src/dwarf/x64/dwarf_x64.h create mode 100644 src/dwarf/x64/dwarf_x64.mdesk create mode 100644 src/dwarf/x64/generated/dwarf_x64.meta.c create mode 100644 src/dwarf/x64/generated/dwarf_x64.meta.h create mode 100644 src/linux/base/linux_base.c create mode 100644 src/linux/base/linux_base.h create mode 100644 src/rdi/x64/generated/rdi_x64.meta.c create mode 100644 src/rdi/x64/generated/rdi_x64.meta.h create mode 100644 src/rdi/x64/rdi_x64.c rename src/{regs/rdi/generated/regs_rdi.meta.h => rdi/x64/rdi_x64.h} (51%) create mode 100644 src/rdi/x64/rdi_x64.mdesk delete mode 100644 src/regs/dwarf/regs_dwarf.c delete mode 100644 src/regs/dwarf/regs_dwarf.h delete mode 100644 src/regs/generated/regs.meta.c delete mode 100644 src/regs/generated/regs.meta.h delete mode 100644 src/regs/rdi/generated/regs_rdi.meta.c delete mode 100644 src/regs/rdi/regs_rdi.h delete mode 100644 src/regs/rdi/regs_rdi.mdesk delete mode 100644 src/regs/regs.c delete mode 100644 src/regs/regs.h delete mode 100644 src/regs/regs.mdesk delete mode 100644 src/scratch/eval_scratch.c create mode 100644 src/win32/base/win32_base.c rename src/{os/core/win32/os_core_win32.h => win32/base/win32_base.h} (89%) create mode 100644 src/x64/generated/x64.meta.c create mode 100644 src/x64/generated/x64.meta.h create mode 100644 src/x64/x64.mdesk diff --git a/build.bat b/build.bat index 7aead3f9..b9ed9538 100644 --- a/build.bat +++ b/build.bat @@ -144,7 +144,6 @@ if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% %out%radbin.exe || exit /b 1 if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% %out%raddump.exe || exit /b 1 if "%ryan_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 -if "%eval_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\eval_scratch.c %compile_link% %out%eval_scratch.exe || exit /b 1 if "%textperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\textperf.c %compile_link% %out%textperf.exe || exit /b 1 if "%convertperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\convertperf.c %compile_link% %out%convertperf.exe || exit /b 1 if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\debugstringperf.c %compile_link% %out%debugstringperf.exe || exit /b 1 diff --git a/project.4coder b/project.4coder index 8292e83f..bed46ee1 100644 --- a/project.4coder +++ b/project.4coder @@ -49,13 +49,13 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [scratch] - .f2 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f2 = { .win = "build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [textperf] // .f1 = { .win = "raddbg_stable --ipc kill_all && build no_meta telemetry textperf && raddbg_stable --ipc bring_to_front && raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, @@ -67,7 +67,8 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: running target - .f3 = { .win = "raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f3 = { .win = "build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f3 = { .win = "raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "wsl ./build/raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "pushd build && raddbg --user:dev.raddbg_user && popd", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "C:/devel/raddebugger/build/raddbg.exe --capture --user:C:/devel/raddebugger/build/local_dev.raddbg_user --project:C:/devel/raddebugger/build/local_dev.raddbg_project", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/arch/arch.c b/src/arch/arch.c new file mode 100644 index 00000000..1a31d949 --- /dev/null +++ b/src/arch/arch.c @@ -0,0 +1,168 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Abstracted Architecture Functions + +internal ARCH_Info * +arch_info_from_arch(Arch arch) +{ + ARCH_Info *result = &arch_info_nil; + switch(arch) + { + default:{}break; +#if defined(X64_H) + case Arch_x64: + { + local_persist read_only ARCH_Info info = + { + .reg_block_size = sizeof(X64_RegBlock), + .instruction_pointer_reg_code = X64_RegCode_rip, + .stack_pointer_reg_code = X64_RegCode_rsp, + .reg_code_count = X64_RegCode_COUNT, + .reg_code_rng_table = x64_reg_code_rng_table, + .reg_code_name_table = x64_reg_code_name_table, + .reg_code_base_table = x64_reg_code_base_table, + .reg_code_is_vector_table = x64_reg_code_is_vector_table, + }; + result = &info; + }break; +#endif + } + return result; +} + +internal ARCH_RegCode +arch_reg_code_from_name(ARCH_Info *arch_info, String8 name) +{ + ARCH_RegCode result = 0; + for EachIndex(code, arch_info->reg_code_count) + { + if(str8_match(arch_info->reg_code_name_table[code], name, 0)) + { + result = code; + break; + } + } + return result; +} + +internal ARCH_RegCode +arch_reg_code_from_rdi(Arch arch, RDI_RegCode code) +{ + ARCH_RegCode result = 0; + { + ARCH_Info *arch_info = arch_info_from_arch(arch); + U8 *rdi_from_reg_code_table = arch_rdi_from_reg_code_table_from_arch(arch); + for EachIndex(c, arch_info->reg_code_count) + { + if(rdi_from_reg_code_table[c] == code) + { + result = c; + break; + } + } + } + return result; +} + +internal ARCH_RegCode +arch_reg_code_from_dw(Arch arch, DW_Reg code) +{ + ARCH_RegCode result = 0; + { + ARCH_Info *arch_info = arch_info_from_arch(arch); + U8 *dw_from_reg_code_table = arch_dw_from_reg_code_table_from_arch(arch); + for EachIndex(c, arch_info->reg_code_count) + { + if(dw_from_reg_code_table[c] == code) + { + result = c; + break; + } + } + } + return result; +} + +internal B32 +arch_reg_block_read_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *dst) +{ + B32 result = 0; + { + Rng1U16 legal_range = r1u16(0, arch_info->reg_block_size); + Rng1U16 try_range = range; + Rng1U16 read_range = intersect_1u16(legal_range, try_range); + U64 read_size = dim_1u16(read_range); + if(read_size != 0) + { + MemoryCopy(dst, (U8 *)block + read_range.min, read_size); + result = 1; + } + } + return result; +} + +internal B32 +arch_reg_block_write_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *src) +{ + B32 result = 0; + Rng1U16 legal_range = r1u16(0, arch_info->reg_block_size); + Rng1U16 try_range = range; + Rng1U16 write_range = intersect_1u16(legal_range, try_range); + U64 write_size = dim_1u16(write_range); + if(write_size != 0) + { + MemoryCopy((U8 *)block + write_range.min, src, write_size); + result = 1; + } + return result; +} + +internal U64 +arch_ip_from_reg_block(ARCH_Info *arch_info, void *block) +{ + U64 result = 0; + ARCH_RegCode reg_code = arch_info->instruction_pointer_reg_code; + if(reg_code < arch_info->reg_code_count) + { + arch_reg_block_read_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &result); + } + return result; +} + +internal U64 +arch_sp_from_reg_block(ARCH_Info *arch_info, void *block) +{ + U64 result = 0; + ARCH_RegCode reg_code = arch_info->stack_pointer_reg_code; + if(reg_code < arch_info->reg_code_count) + { + arch_reg_block_read_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &result); + } + return result; +} + +internal B32 +arch_reg_block_write_ip(ARCH_Info *arch_info, void *block, U64 ip) +{ + B32 result = 0; + ARCH_RegCode reg_code = arch_info->instruction_pointer_reg_code; + if(reg_code < arch_info->reg_code_count) + { + result = arch_reg_block_write_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &ip); + } + return result; +} + +internal B32 +arch_reg_block_write_sp(ARCH_Info *arch_info, void *block, U64 sp) +{ + B32 result = 0; + ARCH_RegCode reg_code = arch_info->stack_pointer_reg_code; + if(reg_code < arch_info->reg_code_count) + { + result = arch_reg_block_write_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &sp); + } + return result; +} diff --git a/src/arch/arch.h b/src/arch/arch.h new file mode 100644 index 00000000..e9e945b9 --- /dev/null +++ b/src/arch/arch.h @@ -0,0 +1,47 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef ARCH_H +#define ARCH_H + +//////////////////////////////// +//~ rjf: Abstraction Backend Info + +typedef U8 ARCH_RegCode; + +typedef struct ARCH_Info ARCH_Info; +struct ARCH_Info +{ + U16 reg_block_size; + ARCH_RegCode instruction_pointer_reg_code; + ARCH_RegCode stack_pointer_reg_code; + U16 reg_code_count; + Rng1U16 *reg_code_rng_table; + String8 *reg_code_name_table; + U8 *reg_code_base_table; + B8 *reg_code_is_vector_table; +}; + +//////////////////////////////// +//~ rjf: Globals + +global read_only Rng1U16 arch_reg_code_rng_nil = {0}; +global read_only String8 arch_reg_code_name_nil = {0}; +global read_only U8 arch_reg_code_u8_nil = 0; +global read_only ARCH_Info arch_info_nil = {0, 0, 0, 0, &arch_reg_code_rng_nil, &arch_reg_code_name_nil, &arch_reg_code_u8_nil, &arch_reg_code_u8_nil}; + +//////////////////////////////// +//~ rjf: Abstracted Architecture Functions + +internal ARCH_Info *arch_info_from_arch(Arch arch); +internal ARCH_RegCode arch_reg_code_from_name(ARCH_Info *arch_info, String8 name); +internal ARCH_RegCode arch_reg_code_from_rdi(Arch arch, RDI_RegCode code); +internal ARCH_RegCode arch_reg_code_from_dw(Arch arch, DW_Reg code); +internal B32 arch_reg_block_read_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *dst); +internal B32 arch_reg_block_write_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *src); +internal U64 arch_ip_from_reg_block(ARCH_Info *arch_info, void *block); +internal U64 arch_sp_from_reg_block(ARCH_Info *arch_info, void *block); +internal B32 arch_reg_block_write_ip(ARCH_Info *arch_info, void *block, U64 ip); +internal B32 arch_reg_block_write_sp(ARCH_Info *arch_info, void *block, U64 sp); + +#endif // REGS_H diff --git a/src/arch/arch_inc.c b/src/arch/arch_inc.c new file mode 100644 index 00000000..e07d1b7c --- /dev/null +++ b/src/arch/arch_inc.c @@ -0,0 +1,10 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "arch/arch.c" +#if defined(DWARF_H) +# include "arch/dwarf/arch_dwarf.c" +#endif +#if defined(RDI_H) +# include "arch/rdi/arch_rdi.c" +#endif diff --git a/src/arch/arch_inc.h b/src/arch/arch_inc.h new file mode 100644 index 00000000..0155cfc4 --- /dev/null +++ b/src/arch/arch_inc.h @@ -0,0 +1,15 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef ARCH_INC_H +#define ARCH_INC_H + +#include "arch/arch.h" +#if defined(DWARF_H) +# include "arch/dwarf/arch_dwarf.h" +#endif +#if defined(RDI_H) +# include "arch/rdi/arch_rdi.h" +#endif + +#endif // ARCH_INC_H diff --git a/src/arch/dwarf/arch_dwarf.c b/src/arch/dwarf/arch_dwarf.c new file mode 100644 index 00000000..91c19792 --- /dev/null +++ b/src/arch/dwarf/arch_dwarf.c @@ -0,0 +1,19 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U8 * +arch_dw_from_reg_code_table_from_arch(Arch arch) +{ + U8 *result = &arch_reg_code_u8_nil; + switch(arch) + { + default:{}break; +#if defined(X64_H) + case Arch_x64: + { + result = dw_reg_code_from_x64_table; + }break; +#endif + } + return result; +} diff --git a/src/arch/dwarf/arch_dwarf.h b/src/arch/dwarf/arch_dwarf.h new file mode 100644 index 00000000..574bdeab --- /dev/null +++ b/src/arch/dwarf/arch_dwarf.h @@ -0,0 +1,9 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef ARCH_DWARF_H +#define ARCH_DWARF_H + +internal U8 *arch_dw_from_reg_code_table_from_arch(Arch arch); + +#endif // ARCH_DWARF_H diff --git a/src/arch/rdi/arch_rdi.c b/src/arch/rdi/arch_rdi.c new file mode 100644 index 00000000..2f3b6c7b --- /dev/null +++ b/src/arch/rdi/arch_rdi.c @@ -0,0 +1,19 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U8 * +arch_rdi_from_reg_code_table_from_arch(Arch arch) +{ + U8 *result = &arch_reg_code_u8_nil; + switch(arch) + { + default:{}break; +#if defined(X64_H) + case Arch_x64: + { + result = rdi_reg_code_from_x64_table; + }break; +#endif + } + return result; +} diff --git a/src/arch/rdi/arch_rdi.h b/src/arch/rdi/arch_rdi.h new file mode 100644 index 00000000..dc09eb18 --- /dev/null +++ b/src/arch/rdi/arch_rdi.h @@ -0,0 +1,9 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef ARCH_RDI_H +#define ARCH_RDI_H + +internal U8 *arch_rdi_from_reg_code_table_from_arch(Arch arch); + +#endif // ARCH_RDI_H diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 2ae211a8..3dd24a2d 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -108,7 +108,7 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 { RWMutexScope(stripe->rw_mutex, 1) for(;;) { - B32 out_of_time = (os_now_microseconds() >= endt_us); + B32 out_of_time = (now_time_us() >= endt_us); // rjf: find node in cache AC_Node *node = 0; @@ -141,7 +141,7 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 node->working_count = 1; node->evict_threshold_us = params->evict_threshold_us; } - node->access_pt.last_time_touched_us = os_now_microseconds(); + node->access_pt.last_time_touched_us = now_time_us(); node->access_pt.last_update_idx_touched = update_tick_idx(); // rjf: request @@ -602,7 +602,7 @@ ac_cancel_thread_entry_point(void *p) { for(;;) { - os_sleep_milliseconds(50); + sleep_ms(50); semaphore_take(ac_shared->cancel_thread_semaphore, max_U64); { for EachIndex(cache_slot_idx, ac_shared->cache_slots_count) diff --git a/src/base/base_arena.c b/src/base/base_arena.c index c9e76289..626a66fd 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -19,24 +19,24 @@ arena_alloc_(ArenaParams *params) // rjf: round up reserve/commit sizes if(params->flags & ArenaFlag_LargePages) { - reserve_size = AlignPow2(reserve_size, os_get_system_info()->large_page_size); - commit_size = AlignPow2(commit_size, os_get_system_info()->large_page_size); + reserve_size = AlignPow2(reserve_size, get_system_info()->large_page_size); + commit_size = AlignPow2(commit_size, get_system_info()->large_page_size); } else { - reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size); - commit_size = AlignPow2(commit_size, os_get_system_info()->page_size); + reserve_size = AlignPow2(reserve_size, get_system_info()->page_size); + commit_size = AlignPow2(commit_size, get_system_info()->page_size); } if(params->flags & ArenaFlag_LargePages) { - base = os_reserve_large(reserve_size); - os_commit_large(base, commit_size); + base = reserve_memory_large(reserve_size); + commit_memory_large(base, commit_size); } else { - base = os_reserve(reserve_size); - os_commit(base, commit_size); + base = reserve_memory(reserve_size); + commit_memory(base, commit_size); } AsanPoisonMemoryRegion(base, commit_size); // TODO(rjf): we need to reintroduce this later when we have the ability to remove annotations... @@ -52,7 +52,7 @@ arena_alloc_(ArenaParams *params) if(Unlikely(base == 0)) { os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); - os_abort(1); + abort_self(1); } #endif @@ -90,7 +90,7 @@ arena_release(Arena *arena) for(Arena *n = arena->current, *prev = 0; n != 0; n = prev) { prev = n->prev; - os_release(n, n->res); + release_memory(n, n->res); } } @@ -179,11 +179,11 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) U8 *cmt_ptr = (U8 *)current + current->cmt; if(current->flags & ArenaFlag_LargePages) { - os_commit_large(cmt_ptr, cmt_size); + commit_memory_large(cmt_ptr, cmt_size); } else { - os_commit(cmt_ptr, cmt_size); + commit_memory(cmt_ptr, cmt_size); } AsanPoisonMemoryRegion(cmt_ptr, cmt_size); current->cmt = cmt_pst_clamped; @@ -213,7 +213,7 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) if(Unlikely(result == 0)) { os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); - os_abort(1); + abort_self(1); } #endif @@ -246,7 +246,7 @@ arena_pop_to(Arena *arena, U64 pos) for(Arena *prev = 0; current->base_pos >= big_pos; current = prev) { prev = current->prev; - os_release(current, current->res); + release_memory(current, current->res); } #endif arena->current = current; diff --git a/src/base/base_core.h b/src/base/base_core.h index 7b9b585a..2536e38f 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -471,6 +471,8 @@ union U128 U16 u16[8]; U32 u32[4]; U64 u64[2]; + F32 f32[4]; + F64 f64[2]; }; typedef union U256 U256; union U256 @@ -480,6 +482,8 @@ union U256 U32 u32[8]; U64 u64[4]; U128 u128[2]; + F32 f32[8]; + F64 f64[4]; }; typedef union U512 U512; union U512 @@ -490,8 +494,19 @@ union U512 U64 u64[8]; U128 u128[4]; U256 u256[2]; + F32 f32[16]; + F64 f64[8]; }; +#pragma pack(push, 1) +typedef struct U80 U80; +struct U80 +{ + U64 int1_frac63; + U16 sign1_exp15; +}; +#pragma pack(pop) + //////////////////////////////// //~ rjf: Basic Type Structures @@ -653,6 +668,21 @@ Compiler; # define Compiler_CURRENT Compiler_Null #endif +//////////////////////////////// +//~ rjf: Access Flags + +typedef U32 AccessFlags; +enum +{ + AccessFlag_Read = (1<<0), + AccessFlag_Write = (1<<1), + AccessFlag_Execute = (1<<2), + AccessFlag_Append = (1<<3), + AccessFlag_ShareRead = (1<<4), + AccessFlag_ShareWrite = (1<<5), + AccessFlag_Inherited = (1<<6), +}; + //////////////////////////////// //~ rjf: Text 2D Coordinates & Ranges @@ -1044,6 +1074,21 @@ internal DateTime date_time_from_dense_time(DenseTime time); internal DateTime date_time_from_micro_seconds(U64 time); internal DateTime date_time_from_unix_time(U64 unix_time); +//////////////////////////////// +//~ rjf: @per_os_impl Platform Time Functions + +internal U64 now_time_us(void); +internal U32 now_time_unix(void); +internal DateTime now_time_universal(void); +internal DateTime universal_from_local_time(DateTime *dt); +internal DateTime local_from_universal_time(DateTime *dt); +internal void sleep_ms(U32 ms); + +//////////////////////////////// +//~ rjf: @per_os_impl Platform GUID Functions + +internal Guid make_guid(void); + //////////////////////////////// //~ rjf: Non-Fancy Ring Buffer Reads/Writes diff --git a/src/base/base_dynamic_libraries.c b/src/base/base_dynamic_libraries.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/base/base_dynamic_libraries.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/base/base_dynamic_libraries.h b/src/base/base_dynamic_libraries.h new file mode 100644 index 00000000..d87a600b --- /dev/null +++ b/src/base/base_dynamic_libraries.h @@ -0,0 +1,20 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_DYNAMIC_LIBARIES_H +#define BASE_DYNAMIC_LIBARIES_H + +typedef struct Library Library; +struct Library +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: @per_os_impl Dynamically-Loaded Libraries + +internal Library library_open(String8 path); +internal void library_close(Library lib); +internal VoidProc *library_load_proc(Library lib, String8 name); + +#endif // BASE_DYNAMIC_LIBARIES_H diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index 5869281a..327e0a33 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -11,6 +11,9 @@ global B32 async_loop_again_high_priority = 0; global B32 global_async_exit = 0; thread_static B32 is_async_thread = 0; +// NOTE(rjf): defined by target +internal void entry_point(CmdLine *cmdline); + internal void main_thread_base_entry_point(int arguments_count, char **arguments) { @@ -100,7 +103,7 @@ main_thread_base_entry_point(int arguments_count, char **arguments) #if defined(DBG_ENGINE_CORE_H) num_main_threads += 1; #endif - U64 num_async_threads = os_get_system_info()->logical_processor_count; + U64 num_async_threads = get_system_info()->logical_processor_count; U64 num_main_threads_clamped = Min(num_async_threads, num_main_threads); num_async_threads -= num_main_threads_clamped; String8 num_async_threads_string = cmd_line_string(&cmdline, str8_lit("async_thread_count")); @@ -192,7 +195,7 @@ async_thread_entry_point(void *params) { if(!ins_atomic_u32_eval(&async_loop_again)) { - MutexScope(async_tick_start_mutex) cond_var_wait(async_tick_start_cond_var, async_tick_start_mutex, os_now_microseconds()+1000000); + MutexScope(async_tick_start_mutex) cond_var_wait(async_tick_start_cond_var, async_tick_start_mutex, now_time_us()+1000000); } ins_atomic_u32_eval_assign(&async_loop_again, 0); ins_atomic_u32_eval_assign(&async_loop_again_high_priority, 0); diff --git a/src/base/base_files.c b/src/base/base_files.c new file mode 100644 index 00000000..9a500f81 --- /dev/null +++ b/src/base/base_files.c @@ -0,0 +1,169 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Handle Type Functions + +internal File +file_zero(void) +{ + File f = {0}; + return f; +} + +internal B32 +file_match(File a, File b) +{ + B32 result = MemoryMatchStruct(&a, &b); + return result; +} + +//////////////////////////////// +//~ rjf: Filesystem Helpers (Helpers, Implemented Once) + +internal String8 +data_from_file_path(Arena *arena, String8 path) +{ + File file = file_open(AccessFlag_Read|AccessFlag_ShareRead, path); + FileProperties props = properties_from_file(file); + String8 data = string_from_file_range(arena, file, r1u64(0, props.size)); + file_close(file); + return data; +} + +internal B32 +write_data_to_file_path(String8 path, String8 data) +{ + B32 good = 0; + File file = file_open(AccessFlag_Write, path); + if(!file_match(file, file_zero())) + { + U64 bytes_written = file_write(file, r1u64(0, data.size), data.str); + good = (bytes_written == data.size); + file_close(file); + } + return good; +} + +internal B32 +write_data_list_to_file_path(String8 path, String8List list) +{ + B32 good = 0; + File file = file_open(AccessFlag_Write, path); + if(!file_match(file, file_zero())) + { + Temp scratch = scratch_begin(0, 0); + U64 write_buffer_size = KB(64); + U8 *write_buffer = push_array_no_zero(scratch.arena, U8, write_buffer_size); + U64 write_buffer_write_pos = 0; + U64 write_buffer_read_pos = 0; + U64 file_off = 0; + { + for(String8Node *n = list.first; n != 0; n = n->next) + { + for(U64 n_off = 0; n_off < n->string.size;) + { + U64 write_buffer_unconsumed_size = (write_buffer_write_pos - write_buffer_read_pos); + U64 write_buffer_available_size = (write_buffer_size - write_buffer_unconsumed_size); + if(write_buffer_available_size == 0) + { + U64 file_write_size = file_write(file, r1u64(file_off, file_off+write_buffer_size), write_buffer); + if(file_write_size != write_buffer_size) + { + goto dbl_break; + } + file_off += write_buffer_size; + write_buffer_read_pos += write_buffer_size; + } + else + { + U64 bytes_to_copy = Min(write_buffer_available_size, n->string.size - n_off); + write_buffer_write_pos += ring_write(write_buffer, write_buffer_size, write_buffer_write_pos, n->string.str + n_off, bytes_to_copy); + n_off += bytes_to_copy; + } + } + } + if(write_buffer_write_pos > write_buffer_read_pos) + { + U64 file_write_size = file_write(file, r1u64(file_off, file_off + (write_buffer_write_pos-write_buffer_read_pos)), write_buffer); + file_off += file_write_size; + } + } + dbl_break:; + good = (file_off == list.total_size); + file_close(file); + scratch_end(scratch); + } + return good; +} + +internal B32 +append_data_to_file_path(String8 path, String8 data) +{ + B32 good = 0; + if(data.size != 0) + { + File file = file_open(AccessFlag_Write|AccessFlag_Append, path); + if(!file_match(file, file_zero())) + { + U64 pos = properties_from_file(file).size; + U64 bytes_written = file_write(file, r1u64(pos, pos+data.size), data.str); + good = (bytes_written == data.size); + file_close(file); + } + } + return good; +} + +internal FileID +id_from_file_path(String8 path) +{ + File file = file_open(AccessFlag_Read|AccessFlag_ShareRead, path); + FileID id = id_from_file(file); + file_close(file); + return id; +} + +internal S64 +file_id_compare(FileID a, FileID b) +{ + S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v)); + return cmp; +} + +internal String8 +string_from_file_range(Arena *arena, File file, Rng1U64 range) +{ + U64 pre_pos = arena_pos(arena); + String8 result; + result.size = dim_1u64(range); + result.str = push_array_no_zero(arena, U8, result.size); + U64 actual_read_size = file_read(file, range, result.str); + if(actual_read_size < result.size) + { + arena_pop_to(arena, pre_pos + actual_read_size); + result.size = actual_read_size; + } + return result; +} + +internal String8 +file_read_cstring(Arena *arena, File file, U64 off) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List block_list = {0}; + for(U64 cursor = off, stride = 256;; cursor += stride) + { + U8 *raw_block = push_array_no_zero(scratch.arena, U8, stride); + U64 read_size = file_read(file, r1u64(cursor, cursor + stride), raw_block); + String8 block = str8_cstring_capped(raw_block, raw_block+read_size); + str8_list_push(scratch.arena, &block_list, block); + if(read_size != stride || (block.size+1 <= read_size && block.str[block.size] == 0)) + { + break; + } + } + String8 result = str8_list_join(arena, &block_list, 0); + scratch_end(scratch); + return result; +} diff --git a/src/base/base_files.h b/src/base/base_files.h new file mode 100644 index 00000000..4ead7246 --- /dev/null +++ b/src/base/base_files.h @@ -0,0 +1,102 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_FILES_H +#define BASE_FILES_H + +typedef U32 FileIterFlags; +enum +{ + FileIterFlag_SkipFolders = (1 << 0), + FileIterFlag_SkipFiles = (1 << 1), + FileIterFlag_SkipHiddenFiles = (1 << 2), + FileIterFlag_Done = (1 << 31), +}; + +typedef struct FileIter FileIter; +struct FileIter +{ + FileIterFlags flags; + U8 memory[800]; +}; + +typedef struct FileInfo FileInfo; +struct FileInfo +{ + String8 name; + FileProperties props; +}; + +// nick: on-disk file identifier +typedef struct FileID FileID; +struct FileID +{ + U64 v[3]; +}; + +typedef struct File File; +struct File +{ + U64 u64[1]; +}; + +typedef struct FileMap FileMap; +struct FileMap +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: Handle Type Functions + +internal File file_zero(void); +internal B32 file_match(File a, File b); + +//////////////////////////////// +//~ rjf: Filesystem Helpers (Helpers, Implemented Once) + +internal String8 data_from_file_path(Arena *arena, String8 path); +internal B32 write_data_to_file_path(String8 path, String8 data); +internal B32 write_data_list_to_file_path(String8 path, String8List list); +internal B32 append_data_to_file_path(String8 path, String8 data); +internal FileID id_from_file_path(String8 path); +internal S64 file_id_compare(FileID a, FileID b); +internal String8 string_from_file_range(Arena *arena, File file, Rng1U64 range); +internal String8 file_read_cstring(Arena *arena, File file, U64 off); + +//////////////////////////////// +//~ rjf: @per_os_impl File System (Implemented Per-OS) + +//- rjf: files +internal File file_open(AccessFlags flags, String8 path); +internal void file_close(File file); +internal U64 file_read(File file, Rng1U64 rng, void *out_data); +#define file_read_struct(f, off, ptr) file_read((f), r1u64((off), (off)+sizeof(*(ptr))), (ptr)) +internal U64 file_write(File file, Rng1U64 rng, void *data); +internal B32 file_set_times(File file, DateTime time); +internal FileProperties properties_from_file(File file); +internal FileID id_from_file(File file); +internal B32 file_reserve_size(File file, U64 size); +internal B32 delete_file_at_path(String8 path); +internal B32 copy_file_path(String8 dst, String8 src); +internal B32 move_file_path(String8 dst, String8 src); +internal String8 full_path_from_path(Arena *arena, String8 path); +internal B32 file_path_exists(String8 path); +internal B32 folder_path_exists(String8 path); +internal FileProperties properties_from_file_path(String8 path); + +//- rjf: file maps +internal FileMap file_map_open(AccessFlags flags, File file); +internal void file_map_close(FileMap map); +internal void * file_map_view_open(FileMap map, AccessFlags flags, Rng1U64 range); +internal void file_map_view_close(FileMap map, void *ptr, Rng1U64 range); + +//- rjf: directory iteration +internal FileIter *file_iter_begin(Arena *arena, String8 path, FileIterFlags flags); +internal B32 file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out); +internal void file_iter_end(FileIter *iter); + +//- rjf: directory creation +internal B32 make_directory(String8 path); + +#endif // BASE_FILES_H diff --git a/src/base/base_inc.c b/src/base/base_inc.c index 84444597..683806aa 100644 --- a/src/base/base_inc.c +++ b/src/base/base_inc.c @@ -9,14 +9,28 @@ #include "base_core.c" #include "base_profile.c" +#include "base_memory.c" #include "base_arena.c" #include "base_math.c" #include "base_strings.c" #include "base_hash.c" +#include "base_system.c" #include "base_threads.c" #include "base_thread_context.c" +#include "base_files.c" +#include "base_shared_memory.c" +#include "base_processes.c" +#include "base_dynamic_libraries.c" #include "base_command_line.c" #include "base_markup.c" #include "base_meta.c" #include "base_log.c" #include "base_entry_point.c" + +#if OS_WINDOWS +# include "win32/base/win32_base.c" +#elif OS_LINUX +# include "linux/base/linux_base.c" +#else +# error Operating system backend not found for base layer. +#endif diff --git a/src/base/base_inc.h b/src/base/base_inc.h index 1647d03a..adaac62d 100644 --- a/src/base/base_inc.h +++ b/src/base/base_inc.h @@ -11,16 +11,30 @@ #include "base_core.h" #include "base_profile.h" +#include "base_memory.h" #include "base_arena.h" #include "base_math.h" #include "base_strings.h" #include "base_hash.h" +#include "base_system.h" #include "base_threads.h" #include "base_thread_context.h" +#include "base_files.h" +#include "base_shared_memory.h" +#include "base_processes.h" +#include "base_dynamic_libraries.h" #include "base_command_line.h" #include "base_markup.h" #include "base_meta.h" #include "base_log.h" #include "base_entry_point.h" +#if OS_WINDOWS +# include "win32/base/win32_base.h" +#elif OS_LINUX +# include "linux/base/linux_base.h" +#else +# error Operating system backend not found for base layer. +#endif + #endif // BASE_INC_H diff --git a/src/base/base_markup.c b/src/base/base_markup.c index 0efbaab8..29202cab 100644 --- a/src/base/base_markup.c +++ b/src/base/base_markup.c @@ -1,21 +1,2 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) - -internal void -set_thread_name(String8 string) -{ - ProfThreadName("%.*s", str8_varg(string)); - os_set_thread_name(string); -} - -internal void -set_thread_namef(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - set_thread_name(string); - va_end(args); - scratch_end(scratch); -} diff --git a/src/base/base_markup.h b/src/base/base_markup.h index 4389d9b1..1d451d2b 100644 --- a/src/base/base_markup.h +++ b/src/base/base_markup.h @@ -15,8 +15,6 @@ # define LAYER_COLOR 0x404040ff #endif -internal void set_thread_name(String8 string); -internal void set_thread_namef(char *fmt, ...); #define ThreadNameF(...) (set_thread_namef(__VA_ARGS__), raddbg_thread_color_u32(LAYER_COLOR)) #endif // BASE_MARKUP_H diff --git a/src/base/base_math.c b/src/base/base_math.c index 9eabae08..c80a5360 100644 --- a/src/base/base_math.c +++ b/src/base/base_math.c @@ -407,6 +407,26 @@ transpose_4x4f32(Mat4x4F32 mat) //////////////////////////////// //~ rjf: Range Ops +internal Rng1U8 rng_1u8(U8 min, U8 max) {Rng1U8 r = {min, max}; if(r.min > r.max) { Swap(U8, r.min, r.max); } return r;} +internal Rng1U8 shift_1u8(Rng1U8 r, U8 x) {r.min += x; r.max += x; return r;} +internal Rng1U8 pad_1u8(Rng1U8 r, U8 x) {r.min -= x; r.max += x; return r;} +internal U8 center_1u8(Rng1U8 r) {U8 c = (r.min+r.max)/2; return c;} +internal B32 contains_1u8(Rng1U8 r, U8 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal U8 dim_1u8(Rng1U8 r) {U8 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;} +internal Rng1U8 union_1u8(Rng1U8 a, Rng1U8 b) {Rng1U8 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1U8 intersect_1u8(Rng1U8 a, Rng1U8 b) {Rng1U8 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal U8 clamp_1u8(Rng1U8 r, U8 v) {v = Clamp(r.min, v, r.max); return v;} + +internal Rng1U16 rng_1u16(U16 min, U16 max) {Rng1U16 r = {min, max}; if(r.min > r.max) { Swap(U16, r.min, r.max); } return r;} +internal Rng1U16 shift_1u16(Rng1U16 r, U16 x) {r.min += x; r.max += x; return r;} +internal Rng1U16 pad_1u16(Rng1U16 r, U16 x) {r.min -= x; r.max += x; return r;} +internal U16 center_1u16(Rng1U16 r) {U16 c = (r.min+r.max)/2; return c;} +internal B32 contains_1u16(Rng1U16 r, U16 x) {B32 c = (r.min <= x && x < r.max); return c;} +internal U16 dim_1u16(Rng1U16 r) {U16 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;} +internal Rng1U16 union_1u16(Rng1U16 a, Rng1U16 b) {Rng1U16 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} +internal Rng1U16 intersect_1u16(Rng1U16 a, Rng1U16 b) {Rng1U16 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} +internal U16 clamp_1u16(Rng1U16 r, U16 v) {v = Clamp(r.min, v, r.max); return v;} + internal Rng1U32 rng_1u32(U32 min, U32 max) {Rng1U32 r = {min, max}; if(r.min > r.max) { Swap(U32, r.min, r.max); } return r;} internal Rng1U32 shift_1u32(Rng1U32 r, U32 x) {r.min += x; r.max += x; return r;} internal Rng1U32 pad_1u32(Rng1U32 r, U32 x) {r.min -= x; r.max += x; return r;} diff --git a/src/base/base_math.h b/src/base/base_math.h index 43604127..ef219305 100644 --- a/src/base/base_math.h +++ b/src/base/base_math.h @@ -177,6 +177,28 @@ struct Mat4x4F32 //- rjf: 1-range +typedef union Rng1U8 Rng1U8; +union Rng1U8 +{ + struct + { + U8 min; + U8 max; + }; + U8 v[2]; +}; + +typedef union Rng1U16 Rng1U16; +union Rng1U16 +{ + struct + { + U16 min; + U16 max; + }; + U16 v[2]; +}; + typedef union Rng1U32 Rng1U32; union Rng1U32 { @@ -546,6 +568,28 @@ internal Mat4x4F32 transpose_4x4f32(Mat4x4F32 mat); //////////////////////////////// //~ rjf: Range Ops +#define r1u8(min, max) rng_1u8((min), (max)) +internal Rng1U8 rng_1u8(U8 min, U8 max); +internal Rng1U8 shift_1u8(Rng1U8 r, U8 x); +internal Rng1U8 pad_1u8(Rng1U8 r, U8 x); +internal U8 center_1u8(Rng1U8 r); +internal B32 contains_1u8(Rng1U8 r, U8 x); +internal U8 dim_1u8(Rng1U8 r); +internal Rng1U8 union_1u8(Rng1U8 a, Rng1U8 b); +internal Rng1U8 intersect_1u8(Rng1U8 a, Rng1U8 b); +internal U8 clamp_1u8(Rng1U8 r, U8 v); + +#define r1u16(min, max) rng_1u16((min), (max)) +internal Rng1U16 rng_1u16(U16 min, U16 max); +internal Rng1U16 shift_1u16(Rng1U16 r, U16 x); +internal Rng1U16 pad_1u16(Rng1U16 r, U16 x); +internal U16 center_1u16(Rng1U16 r); +internal B32 contains_1u16(Rng1U16 r, U16 x); +internal U16 dim_1u16(Rng1U16 r); +internal Rng1U16 union_1u16(Rng1U16 a, Rng1U16 b); +internal Rng1U16 intersect_1u16(Rng1U16 a, Rng1U16 b); +internal U16 clamp_1u16(Rng1U16 r, U16 v); + #define r1u32(min, max) rng_1u32((min), (max)) internal Rng1U32 rng_1u32(U32 min, U32 max); internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); diff --git a/src/base/base_memory.c b/src/base/base_memory.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/base/base_memory.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/base/base_memory.h b/src/base/base_memory.h new file mode 100644 index 00000000..e6f58271 --- /dev/null +++ b/src/base/base_memory.h @@ -0,0 +1,26 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_MEMORY_H +#define BASE_MEMORY_H + +typedef struct SharedMemory SharedMemory; +struct SharedMemory +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: @per_os_impl Platform Memory Allocation + +//- rjf: basic +internal void *reserve_memory(U64 size); +internal B32 commit_memory(void *ptr, U64 size); +internal void decommit_memory(void *ptr, U64 size); +internal void release_memory(void *ptr, U64 size); + +//- rjf: large pages +internal void *reserve_memory_large(U64 size); +internal B32 commit_memory_large(void *ptr, U64 size); + +#endif // BASE_MEMORY_H diff --git a/src/base/base_processes.c b/src/base/base_processes.c new file mode 100644 index 00000000..40c4d4d7 --- /dev/null +++ b/src/base/base_processes.c @@ -0,0 +1,115 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Handle Type Functions + +internal Process +process_zero(void) +{ + Process p = {0}; + return p; +} + +internal B32 +process_match(Process a, Process b) +{ + B32 result = MemoryMatchStruct(&a, &b); + return result; +} + +internal void +process_list_push(Arena *arena, ProcessList *list, Process p) +{ + ProcessNode *n = push_array(arena, ProcessNode, 1); + SLLQueuePush(list->first, list->last, n); + n->v = p; + list->count += 1; +} + +//////////////////////////////// +//~ rjf: Process Launcher Helpers + +internal Process +launch_cmd_line(String8 string) +{ + Temp scratch = scratch_begin(0, 0); + U8 split_chars[] = {' '}; + String8List parts = str8_split(scratch.arena, string, split_chars, ArrayCount(split_chars), 0); + Process process = {0}; + if(parts.node_count != 0) + { + // rjf: unpack exe part + String8 exe = parts.first->string; + String8 exe_folder = str8_chop_last_slash(exe); + if(exe_folder.size == 0) + { + exe_folder = get_current_path(scratch.arena); + } + + // rjf: find stdout delimiter + String8Node *stdout_delimiter_n = 0; + for(String8Node *n = parts.first; n != 0; n = n->next) + { + if(str8_match(n->string, str8_lit(">"), 0)) + { + stdout_delimiter_n = n; + break; + } + } + + // rjf: read stdout path + String8 stdout_path = {0}; + if(stdout_delimiter_n && stdout_delimiter_n->next) + { + stdout_path = stdout_delimiter_n->next->string; + } + + // rjf: open stdout handle + File stdout_handle = {0}; + if(stdout_path.size != 0) + { + File file = file_open(AccessFlag_Write|AccessFlag_Read, stdout_path); + file_close(file); + stdout_handle = file_open(AccessFlag_Write|AccessFlag_Append|AccessFlag_ShareRead|AccessFlag_ShareWrite|AccessFlag_Inherited, stdout_path); + } + + // rjf: form command line + String8List cmdline = {0}; + for(String8Node *n = parts.first; n != stdout_delimiter_n && n != 0; n = n->next) + { + str8_list_push(scratch.arena, &cmdline, n->string); + } + + // rjf: launch + ProcessLaunchParams params = {0}; + params.cmd_line = cmdline; + params.path = exe_folder; + params.inherit_env = 1; + params.stdout_file = stdout_handle; + process = process_launch(¶ms); + + // rjf: close stdout handle + { + if(stdout_path.size != 0) + { + file_close(stdout_handle); + } + } + } + scratch_end(scratch); + return process; +} + +internal Process +launch_cmd_linef(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = str8fv(scratch.arena, fmt, args); + Process result = launch_cmd_line(string); + va_end(args); + scratch_end(scratch); + return result; +} diff --git a/src/base/base_processes.h b/src/base/base_processes.h new file mode 100644 index 00000000..a2d1bdee --- /dev/null +++ b/src/base/base_processes.h @@ -0,0 +1,87 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_PROCESSES_H +#define BASE_PROCESSES_H + +typedef struct ProcessInfo ProcessInfo; +struct ProcessInfo +{ + U32 pid; + B32 large_pages_allowed; + String8 binary_path; + String8 initial_path; + String8 user_program_data_path; + String8List module_load_paths; + String8List environment; +}; + +typedef struct Process Process; +struct Process +{ + U64 u64[1]; +}; + +typedef struct ProcessNode ProcessNode; +struct ProcessNode +{ + ProcessNode *next; + Process v; +}; + +typedef struct ProcessList ProcessList; +struct ProcessList +{ + ProcessNode *first; + ProcessNode *last; + U64 count; +}; + +typedef struct ProcessLaunchParams ProcessLaunchParams; +struct ProcessLaunchParams +{ + String8List cmd_line; + String8 path; + String8List env; + B32 inherit_env; + B32 debug_subprocesses; + B32 consoleless; + File stdout_file; + File stderr_file; + File stdin_file; +}; + +//////////////////////////////// +//~ rjf: Handle Type Functions + +internal Process process_zero(void); +internal B32 process_match(Process a, Process b); +internal void process_list_push(Arena *arena, ProcessList *list, Process p); + +//////////////////////////////// +//~ rjf: Process Launcher Helpers + +internal Process launch_cmd_line(String8 string); +internal Process launch_cmd_linef(char *fmt, ...); + +//////////////////////////////// +//~ rjf: @per_os_impl Aborting + +internal void abort_self(S32 exit_code); + +//////////////////////////////// +//~ rjf: @per_os_impl Process Info + +internal ProcessInfo *get_process_info(void); +internal String8 get_current_path(Arena *arena); +internal U32 get_process_start_time_unix(void); + +//////////////////////////////// +//~ rjf: @per_os_impl Child Processes + +internal Process process_launch(ProcessLaunchParams *params); +internal B32 process_join(Process process, U64 endt_us, U64 *exit_code_out); +internal void process_detach(Process process); +internal B32 process_kill(Process process); + +#endif // BASE_PROCESSES_H diff --git a/src/base/base_profile.c b/src/base/base_profile.c index 2216a282..c614f08e 100644 --- a/src/base/base_profile.c +++ b/src/base/base_profile.c @@ -24,7 +24,7 @@ spall_begin(char *fmt, ...) va_list args; va_start(args, fmt); String8 string = push_str8fv(scratch.arena, fmt, args); - spall_buffer_begin_ex(&spall_profile, &spall_buffer, string.str, string.size, os_now_microseconds(), spall_tid, spall_pid); + spall_buffer_begin_ex(&spall_profile, &spall_buffer, string.str, string.size, now_time_us(), spall_tid, spall_pid); va_end(args); scratch_end(scratch); } diff --git a/src/base/base_profile.h b/src/base/base_profile.h index 6ef4a046..ed11cfa2 100644 --- a/src/base/base_profile.h +++ b/src/base/base_profile.h @@ -79,7 +79,7 @@ thread_static U32 spall_pid = 0; internal inline void spall_begin(char *fmt, ...); # define ProfBegin(...) (spall_capturing ? (spall_begin(__VA_ARGS__), 0) : 0) # define ProfBeginDynamic(...) (spall_capturing ? (spall_begin(__VA_ARGS__), 0) : 0) -# define ProfEnd(...) (spall_capturing ? (spall_buffer_end_ex(&spall_profile, &spall_buffer, os_now_microseconds(), spall_tid, spall_pid)), 0 : 0) +# define ProfEnd(...) (spall_capturing ? (spall_buffer_end_ex(&spall_profile, &spall_buffer, now_time_us(), spall_tid, spall_pid)), 0 : 0) # define ProfTick(...) # define ProfIsCapturing(...) (!!spall_capturing) # define ProfBeginCapture(...) (spall_capturing = 1) diff --git a/src/base/base_shared_memory.c b/src/base/base_shared_memory.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/base/base_shared_memory.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/base/base_shared_memory.h b/src/base/base_shared_memory.h new file mode 100644 index 00000000..7d9f1498 --- /dev/null +++ b/src/base/base_shared_memory.h @@ -0,0 +1,16 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_SHARED_MEMORY_H +#define BASE_SHARED_MEMORY_H + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory + +internal SharedMemory shared_memory_alloc(U64 size, String8 name); +internal SharedMemory shared_memory_open(String8 name); +internal void shared_memory_close(SharedMemory handle); +internal void * shared_memory_view_open(SharedMemory handle, Rng1U64 range); +internal void shared_memory_view_close(SharedMemory handle, void *ptr, Rng1U64 range); + +#endif // BASE_SHARED_MEMORY_H diff --git a/src/base/base_system.c b/src/base/base_system.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/base/base_system.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/base/base_system.h b/src/base/base_system.h new file mode 100644 index 00000000..2907c881 --- /dev/null +++ b/src/base/base_system.h @@ -0,0 +1,22 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_SYSTEM_H +#define BASE_SYSTEM_H + +typedef struct SystemInfo SystemInfo; +struct SystemInfo +{ + U32 logical_processor_count; + U64 page_size; + U64 large_page_size; + U64 allocation_granularity; + String8 machine_name; +}; + +//////////////////////////////// +//~ rjf: @per_os_impl System Info + +internal SystemInfo *get_system_info(void); + +#endif // BASE_SYSTEM_H diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index b8d87170..a6a8dfc2 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -108,7 +108,7 @@ tctx_lane_barrier_wait(void *broadcast_ptr, U64 broadcast_size, U64 broadcast_sr } // rjf: all cases: barrier - os_barrier_wait(tctx->lane_ctx.barrier); + barrier_wait(tctx->lane_ctx.barrier); // rjf: doing broadcast -> copy from broadcast memory on destination lanes if(broadcast_ptr != 0 && lane_idx() != broadcast_src_lane_idx) @@ -119,7 +119,7 @@ tctx_lane_barrier_wait(void *broadcast_ptr, U64 broadcast_size, U64 broadcast_sr // rjf: doing broadcast -> barrier on all lanes if(broadcast_ptr != 0) { - os_barrier_wait(tctx->lane_ctx.barrier); + barrier_wait(tctx->lane_ctx.barrier); } ProfEnd(); @@ -202,7 +202,7 @@ internal void access_touch(Access *access, AccessPt *pt, CondVar cv) { ins_atomic_u64_inc_eval(&pt->access_refcount); - ins_atomic_u64_eval_assign(&pt->last_time_touched_us, os_now_microseconds()); + ins_atomic_u64_eval_assign(&pt->last_time_touched_us, now_time_us()); ins_atomic_u64_eval_assign(&pt->last_update_idx_touched, update_tick_idx()); Touch *touch = tctx_thread_local->free_touch; if(touch != 0) @@ -228,7 +228,7 @@ access_pt_is_expired_(AccessPt *pt, AccessPtExpireParams *params) U64 last_time_touched_us = ins_atomic_u64_eval(&pt->last_time_touched_us); U64 last_update_idx_touched = ins_atomic_u64_eval(&pt->last_update_idx_touched); B32 result = (access_refcount == 0 && - last_time_touched_us + params->time <= os_now_microseconds() && + last_time_touched_us + params->time <= now_time_us() && last_update_idx_touched + params->update_idxs <= update_tick_idx()); return result; } diff --git a/src/base/base_threads.c b/src/base/base_threads.c index 50c6e370..c8b4c1eb 100644 --- a/src/base/base_threads.c +++ b/src/base/base_threads.c @@ -1,70 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// -//~ rjf: Thread Functions - -internal Thread -thread_launch(ThreadEntryPointFunctionType *f, void *p) -{ - Thread thread = os_thread_launch(f, p); - return thread; -} - -internal B32 -thread_join(Thread thread, U64 endt_us) -{ - B32 result = os_thread_join(thread, endt_us); - return result; -} - -internal void -thread_detach(Thread thread) -{ - os_thread_detach(thread); -} - -//////////////////////////////// -//~ rjf: Synchronization Primitive Functions - -//- rjf: recursive mutexes - -internal Mutex mutex_alloc(void) {return os_mutex_alloc();} -internal void mutex_release(Mutex mutex) {os_mutex_release(mutex);} -internal void mutex_take(Mutex mutex) {os_mutex_take(mutex);} -internal void mutex_drop(Mutex mutex) {os_mutex_drop(mutex);} - -//- rjf: reader/writer mutexes - -internal RWMutex rw_mutex_alloc(void) {return os_rw_mutex_alloc();} -internal void rw_mutex_release(RWMutex mutex) {os_rw_mutex_release(mutex);} -internal void rw_mutex_take(RWMutex mutex, B32 write_mode) {os_rw_mutex_take(mutex, write_mode);} -internal void rw_mutex_drop(RWMutex mutex, B32 write_mode) {os_rw_mutex_drop(mutex, write_mode);} - -//- rjf: condition variables - -internal CondVar cond_var_alloc(void) {return os_cond_var_alloc();} -internal void cond_var_release(CondVar cv) {os_cond_var_release(cv);} -internal B32 cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us) {return os_cond_var_wait(cv, mutex, endt_us);} -internal B32 cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) {return os_cond_var_wait_rw(cv, mutex_rw, write_mode, endt_us);} -internal void cond_var_signal(CondVar cv) {os_cond_var_signal(cv);} -internal void cond_var_broadcast(CondVar cv) {os_cond_var_broadcast(cv);} - -//- rjf: cross-process semaphores - -internal Semaphore semaphore_alloc(U32 initial_count, U32 max_count, String8 name) {return os_semaphore_alloc(initial_count, max_count, name);} -internal void semaphore_release(Semaphore semaphore) {os_semaphore_release(semaphore);} -internal Semaphore semaphore_open(String8 name) {return os_semaphore_open(name);} -internal void semaphore_close(Semaphore semaphore) {os_semaphore_close(semaphore);} -internal B32 semaphore_take(Semaphore semaphore, U64 endt_us) {return os_semaphore_take(semaphore, endt_us);} -internal void semaphore_drop(Semaphore semaphore) {os_semaphore_drop(semaphore);} - -//- rjf: barriers - -internal Barrier barrier_alloc(U64 count) {return os_barrier_alloc(count);} -internal void barrier_release(Barrier barrier) {os_barrier_release(barrier);} -internal void barrier_wait(Barrier barrier) {os_barrier_wait(barrier);} - //////////////////////////////// //~ rjf: Table Stripe Functions @@ -72,7 +8,7 @@ internal StripeArray stripe_array_alloc(Arena *arena) { StripeArray array = {0}; - array.count = os_get_system_info()->logical_processor_count; + array.count = get_system_info()->logical_processor_count; array.v = push_array(arena, Stripe, array.count); for EachIndex(idx, array.count) { @@ -100,3 +36,25 @@ stripe_from_slot_idx(StripeArray *stripes, U64 slot_idx) Stripe *stripe = &stripes->v[slot_idx%stripes->count]; return stripe; } + +//////////////////////////////// +//~ rjf: Thread Info Helpers + +internal void +set_thread_name(String8 string) +{ + ProfThreadName("%.*s", str8_varg(string)); + set_platform_thread_name(string); +} + +internal void +set_thread_namef(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + set_thread_name(string); + va_end(args); + scratch_end(scratch); +} diff --git a/src/base/base_threads.h b/src/base/base_threads.h index 330efb00..f179a219 100644 --- a/src/base/base_threads.h +++ b/src/base/base_threads.h @@ -67,14 +67,33 @@ struct StripeArray }; //////////////////////////////// -//~ rjf: Thread Functions +//~ rjf: Table Stripe Functions + +internal StripeArray stripe_array_alloc(Arena *arena); +internal void stripe_array_release(StripeArray *stripes); +internal Stripe *stripe_from_slot_idx(StripeArray *stripes, U64 slot_idx); + +//////////////////////////////// +//~ rjf: Thread Info Helpers + +internal void set_thread_name(String8 string); +internal void set_thread_namef(char *fmt, ...); + +//////////////////////////////// +//~ rjf: @per_os_impl Current Thread Info + +internal U32 tid(void); +internal void set_platform_thread_name(String8 name); + +//////////////////////////////// +//~ rjf: @per_os_impl Thread Functions internal Thread thread_launch(ThreadEntryPointFunctionType *f, void *p); internal B32 thread_join(Thread thread, U64 endt_us); internal void thread_detach(Thread thread); //////////////////////////////// -//~ rjf: Synchronization Primitive Functions +//~ rjf: @per_os_impl Synchronization Primitive Functions //- rjf: recursive mutexes internal Mutex mutex_alloc(void); @@ -124,10 +143,8 @@ internal void barrier_wait(Barrier barrier); #define MutexScopeRWPromote(mutex) DeferLoop((rw_mutex_drop_r(mutex), rw_mutex_take_w(mutex)), (rw_mutex_drop_w(mutex), rw_mutex_take_r(mutex))) //////////////////////////////// -//~ rjf: Table Stripe Functions +//~ rjf: @per_os_impl Safe Calls -internal StripeArray stripe_array_alloc(Arena *arena); -internal void stripe_array_release(StripeArray *stripes); -internal Stripe *stripe_from_slot_idx(StripeArray *stripes, U64 slot_idx); +internal void safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr); #endif // BASE_THREADS_H diff --git a/src/content/content.c b/src/content/content.c index 04a3b6bb..6ff6c6f0 100644 --- a/src/content/content.c +++ b/src/content/content.c @@ -46,7 +46,7 @@ c_init(void) c_shared = push_array(arena, C_Shared, 1); c_shared->arena = arena; c_shared->blob_slots_count = 16384; - c_shared->blob_stripes_count = Min(c_shared->blob_slots_count, os_get_system_info()->logical_processor_count); + c_shared->blob_stripes_count = Min(c_shared->blob_slots_count, get_system_info()->logical_processor_count); c_shared->blob_slots = push_array(arena, C_BlobSlot, c_shared->blob_slots_count); c_shared->blob_stripes = push_array(arena, C_Stripe, c_shared->blob_stripes_count); c_shared->blob_stripes_free_nodes = push_array(arena, C_BlobNode *, c_shared->blob_stripes_count); @@ -58,7 +58,7 @@ c_init(void) stripe->cv = cond_var_alloc(); } c_shared->key_slots_count = 4096; - c_shared->key_stripes_count = Min(c_shared->key_slots_count, os_get_system_info()->logical_processor_count); + c_shared->key_stripes_count = Min(c_shared->key_slots_count, get_system_info()->logical_processor_count); c_shared->key_slots = push_array(arena, C_KeySlot, c_shared->key_slots_count); c_shared->key_stripes = push_array(arena, C_Stripe, c_shared->key_stripes_count); c_shared->key_stripes_free_nodes = push_array(arena, C_KeyNode *, c_shared->key_stripes_count); @@ -70,7 +70,7 @@ c_init(void) stripe->cv = cond_var_alloc(); } c_shared->root_slots_count = 4096; - c_shared->root_stripes_count = Min(c_shared->root_slots_count, os_get_system_info()->logical_processor_count); + c_shared->root_stripes_count = Min(c_shared->root_slots_count, get_system_info()->logical_processor_count); c_shared->root_slots = push_array(arena, C_RootSlot, c_shared->root_slots_count); c_shared->root_stripes = push_array(arena, C_Stripe, c_shared->root_stripes_count); c_shared->root_stripes_free_nodes = push_array(arena, C_RootNode *, c_shared->root_stripes_count); diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index b80b61a7..4606be04 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -17,26 +17,20 @@ d_init(void) Arena *arena = arena_alloc(); d_ctrl_state = push_array(arena, D_CtrlState, 1); d_ctrl_state->arena = arena; - for(Arch arch = (Arch)0; arch < Arch_COUNT; arch = (Arch)(arch+1)) + for EachEnumVal(Arch, arch) { - String8 *reg_names = regs_reg_code_string_table_from_arch(arch); - U64 reg_count = regs_reg_code_count_from_arch(arch); - String8 *alias_names = regs_alias_code_string_table_from_arch(arch); - U64 alias_count = regs_alias_code_count_from_arch(arch); + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 reg_count = arch_info->reg_code_count; + String8 *reg_names = arch_info->reg_code_name_table; d_ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(d_ctrl_state->arena, 256); - d_ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(d_ctrl_state->arena, 256); for(U64 idx = 1; idx < reg_count; idx += 1) { e_string2num_map_insert(d_ctrl_state->arena, &d_ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx); } - for(U64 idx = 1; idx < alias_count; idx += 1) - { - e_string2num_map_insert(d_ctrl_state->arena, &d_ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx); - } } d_ctrl_state->thread_reg_cache.slots_count = 1024; d_ctrl_state->thread_reg_cache.slots = push_array(arena, D_ThreadRegCacheSlot, d_ctrl_state->thread_reg_cache.slots_count); - d_ctrl_state->thread_reg_cache.stripes_count = os_get_system_info()->logical_processor_count; + d_ctrl_state->thread_reg_cache.stripes_count = get_system_info()->logical_processor_count; d_ctrl_state->thread_reg_cache.stripes = push_array(arena, D_ThreadRegCacheStripe, d_ctrl_state->thread_reg_cache.stripes_count); for(U64 idx = 0; idx < d_ctrl_state->thread_reg_cache.stripes_count; idx += 1) { @@ -45,7 +39,7 @@ d_init(void) } d_ctrl_state->module_image_info_cache.slots_count = 1024; d_ctrl_state->module_image_info_cache.slots = push_array(arena, D_ModuleImageInfoCacheSlot, d_ctrl_state->module_image_info_cache.slots_count); - d_ctrl_state->module_image_info_cache.stripes_count = os_get_system_info()->logical_processor_count; + d_ctrl_state->module_image_info_cache.stripes_count = get_system_info()->logical_processor_count; d_ctrl_state->module_image_info_cache.stripes = push_array(arena, D_ModuleImageInfoCacheStripe, d_ctrl_state->module_image_info_cache.stripes_count); for(U64 idx = 0; idx < d_ctrl_state->module_image_info_cache.stripes_count; idx += 1) { @@ -63,11 +57,11 @@ d_init(void) d_ctrl_state->c2u_ring_cv = cond_var_alloc(); { Temp scratch = scratch_begin(0, 0); - String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_program_data_path = get_process_info()->user_program_data_path; String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); - os_make_directory(user_data_folder); + make_directory(user_data_folder); d_ctrl_state->ctrl_thread_log_path = push_str8f(d_ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); - os_write_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, str8_zero()); + write_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, str8_zero()); scratch_end(scratch); } d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc(); diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index ef4fbd74..08523c24 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -885,7 +885,7 @@ d_entity_ctx_rw_store_alloc(void) D_Entity *root = store->ctx.root = d_entity_alloc(store, &d_entity_nil, D_EntityKind_Root, Arch_Null, d_handle_zero(), 0); D_Entity *local_machine = d_entity_alloc(store, root, D_EntityKind_Machine, Arch_CURRENT, d_handle_make(D_MachineID_Local, dmn_handle_zero()), 0); Temp scratch = scratch_begin(0, 0); - String8 local_machine_name = push_str8f(scratch.arena, "This PC (%S)", os_get_system_info()->machine_name); + String8 local_machine_name = push_str8f(scratch.arena, "This PC (%S)", get_system_info()->machine_name); d_entity_equip_string(store, local_machine, local_machine_name); scratch_end(scratch); return store; @@ -1476,7 +1476,8 @@ d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) D_ThreadRegCache *cache = &d_ctrl_state->thread_reg_cache; D_Entity *thread_entity = d_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; - U64 reg_block_size = regs_block_size_from_arch(arch); + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 reg_block_size = arch_info->reg_block_size; U64 hash = d_hash_from_handle(handle); U64 slot_idx = hash%cache->slots_count; U64 stripe_idx = slot_idx%cache->stripes_count; @@ -1543,8 +1544,9 @@ d_rip_from_thread(D_EntityCtx *ctx, D_Handle handle) Temp scratch = scratch_begin(0, 0); D_Entity *thread_entity = d_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); void *block = d_reg_block_from_thread(scratch.arena, ctx, handle); - U64 result = regs_rip_from_arch_block(arch, block); + U64 result = arch_ip_from_reg_block(arch_info, block); scratch_end(scratch); return result; } @@ -1555,8 +1557,9 @@ d_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle) Temp scratch = scratch_begin(0, 0); D_Entity *thread_entity = d_entity_from_handle(ctx, handle); Arch arch = thread_entity->arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); void *block = d_reg_block_from_thread(scratch.arena, ctx, handle); - U64 result = regs_rsp_from_arch_block(arch, block); + U64 result = arch_sp_from_reg_block(arch_info, block); scratch_end(scratch); return result; } @@ -1708,7 +1711,7 @@ d_raddbg_data_from_module(Arena *arena, D_Handle module_handle) } //////////////////////////////// -//~ rjf: Unwinding Functions} +//~ rjf: Unwinding Functions //- rjf: [dwarf] @@ -1716,7 +1719,7 @@ typedef struct D_MemoryReadContextDwarfX64 D_MemoryReadContextDwarfX64; struct D_MemoryReadContextDwarfX64 { D_Handle process_handle; - U64 endt_us; + U64 endt_us; }; internal MACHINE_OP_MEM_READ(ctrl_machine_mem_read) @@ -1765,6 +1768,7 @@ internal D_UnwindStepResult d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out) { Temp scratch = scratch_begin(&arena, 1); + ARCH_Info *arch_info = arch_info_from_arch(arch); D_UnwindStepResult result = { .flags = D_UnwindFlag_Error }; // gather context for virtual stack unwinder @@ -1774,11 +1778,11 @@ d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D EH_FrameHdr eh_frame_hdr = {0}; EH_PtrCtx eh_ptr_ctx = {0}; { - U64 hash = d_hash_from_handle(module_handle); - U64 slot_idx = hash % d_ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx % d_ctrl_state->module_image_info_cache.stripes_count; - D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 hash = d_hash_from_handle(module_handle); + U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; + D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; + D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; MutexScopeR(stripe->rw_mutex) for EachNode(n, D_ModuleImageInfoCacheNode, slot->first) { if(d_handle_match(n->module, module_handle)) @@ -1794,7 +1798,7 @@ d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D } // grab IP - U64 ip = regs_rip_from_arch_block(arch, regs); + U64 ip = arch_ip_from_reg_block(arch_info, regs); // use .eh_frame_hdr to quickly locate nearest FDE U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, ip); @@ -1914,9 +1918,7 @@ d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D { // setup machine ops void *mem_read_ctx = 0; - void *reg_read_ctx = 0; MachineOp_MemRead *mem_read_func = 0; - MachineOp_RegRead *reg_read_func = 0; switch(arch) { case Arch_Null: break; @@ -1925,12 +1927,8 @@ d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D D_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, D_MemoryReadContextDwarfX64, 1); mem_read_ctx_x64->process_handle = process_handle; mem_read_ctx_x64->endt_us = endt_us; - mem_read_ctx = mem_read_ctx_x64; - reg_read_ctx = regs; - mem_read_func = ctrl_machine_mem_read; - reg_read_func = regs_read_dwarf_x64; }break; case Arch_x86: case Arch_arm64: @@ -1943,7 +1941,7 @@ d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D // compute CFA for the row U64 cfa = 0; - MachineOpResult unwind_status = dw_compute_cfa(arch, cfi_row, mem_read_func, mem_read_ctx, reg_read_func, reg_read_ctx, &cfa); + MachineOpResult unwind_status = dw_compute_cfa(arch, cfi_row, regs, mem_read_func, mem_read_ctx, &cfa); // on success fill out output if(unwind_status == MachineOpResult_Ok) @@ -1990,26 +1988,17 @@ d_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwi reg_read_ctx = regs; reg_write_ctx = regs; mem_read_func = ctrl_machine_mem_read; - reg_read_func = regs_read_dwarf_x64; - reg_write_func = regs_write_dwarf_x64; }break; } // apply register rules to the context - MachineOpResult unwind_status = dw_cfi_apply_register_rules(arch, - frame_ctx->cfa, - frame_ctx->cfi_row, - mem_read_func, - mem_read_ctx, - reg_read_func, - reg_read_ctx, - reg_write_func, - reg_write_ctx); + MachineOpResult unwind_status = dw_cfi_apply_register_rules(arch, frame_ctx->cfa, frame_ctx->cfi_row, regs, mem_read_func, mem_read_ctx); // last frame typically has undefined rule for IP if(frame_ctx->cfi_row->regs[frame_ctx->ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) { - regs_arch_block_write_rip(arch, regs, 0); + ARCH_Info *arch_info = arch_info_from_arch(arch); + arch_reg_block_write_ip(arch_info, regs, 0); } // translate unwind status code @@ -2021,11 +2010,11 @@ d_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwi //- rjf: [x64] -internal REGS_Reg64 * -d_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg) +internal U64 * +d_unwind_reg_from_pe_gpr_reg__pe_x64(X64_RegBlock *regs, PE_UnwindGprRegX64 gpr_reg) { - local_persist REGS_Reg64 dummy = {0}; - REGS_Reg64 *result = &dummy; + local_persist U64 dummy = {0}; + U64 *result = &dummy; switch(gpr_reg) { case PE_UnwindGprRegX64_RAX:{result = ®s->rax;}break; @@ -2049,7 +2038,7 @@ d_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 } internal D_UnwindStepResult -d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us) +d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, X64_RegBlock *regs, U64 endt_us) { B32 is_stale = 0; B32 is_good = 1; @@ -2058,7 +2047,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul ////////////////////////////// //- rjf: unpack parameters // - U64 rip_voff = regs->rip.u64 - module_base_vaddr; + U64 rip_voff = regs->rip - module_base_vaddr; ////////////////////////////// //- rjf: rip_voff -> first pdata @@ -2079,7 +2068,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul //- rjf: set up parsing state B32 is_epilog = 0; B32 keep_parsing = 1; - U64 read_vaddr = regs->rip.u64; + U64 read_vaddr = regs->rip; U64 read_vaddr_opl = read_vaddr + 256; //- rjf: check first instruction @@ -2271,7 +2260,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul // if(first_pdata && has_pdata_and_in_epilog) ProfScope("pdata & in epilog -> epilog unwind") { - U64 read_vaddr = regs->rip.u64; + U64 read_vaddr = regs->rip; for(B32 keep_parsing = 1;keep_parsing != 0;) { //- rjf: assume no more parsing after this instruction @@ -2307,7 +2296,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul case 0x5F: { // rjf: read value at rsp - U64 sp = regs->rsp.u64; + U64 sp = regs->rsp; U64 value = 0; if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &value, endt_us) || is_stale) @@ -2318,9 +2307,9 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul // rjf: modify registers PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; - REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); - reg->u64 = value; - regs->rsp.u64 = sp + 8; + U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); + reg[0] = value; + regs->rsp = sp + 8; // rjf: not a final instruction, so keep mparsing keep_parsing = 1; @@ -2343,7 +2332,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul read_vaddr += 4; // rjf: update stack pointer - regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); + regs->rsp = (U64)(regs->rsp + imm); // rjf: not a final instruction; keep parsing keep_parsing = 1; @@ -2366,7 +2355,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul read_vaddr += 1; // rjf: update stack pointer - regs->rsp.u64 = (U64)(regs->rsp.u64 + imm); + regs->rsp = (U64)(regs->rsp + imm); // rjf: not a final instruction; keep parsing keep_parsing = 1; @@ -2385,8 +2374,8 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul } read_vaddr += 1; PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; - REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); - U64 reg_value = reg->u64; + U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); + U64 reg_value = reg[0]; // rjf: read immediate S32 imm = 0; @@ -2419,7 +2408,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul } // rjf: update stack pointer - regs->rsp.u64 = (U64)(reg_value + imm); + regs->rsp = (U64)(reg_value + imm); // rjf: not a final instruction; keep parsing keep_parsing = 1; @@ -2429,7 +2418,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul case 0xC2: { // rjf: read new ip - U64 sp = regs->rsp.u64; + U64 sp = regs->rsp; U64 new_ip = 0; if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || is_stale) @@ -2449,8 +2438,8 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul U64 new_sp = sp + 8 + imm; // rjf: commit registers - regs->rip.u64 = new_ip; - regs->rsp.u64 = new_sp; + regs->rip = new_ip; + regs->rsp = new_sp; }break; // rjf: ret / rep; ret @@ -2461,7 +2450,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul case 0xC3: { // rjf: read new ip - U64 sp = regs->rsp.u64; + U64 sp = regs->rsp; U64 new_ip = 0; if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || is_stale) @@ -2474,8 +2463,8 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul U64 new_sp = sp + 8; // rjf: commit registers - regs->rip.u64 = new_ip; - regs->rsp.u64 = new_sp; + regs->rip = new_ip; + regs->rsp = new_sp; }break; // rjf: jmp nnnn @@ -2505,7 +2494,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul { //- rjf: get frame reg B32 bad_frame_reg_info = 0; - REGS_Reg64 *frame_reg = 0; + U64 *frame_reg = 0; U64 frame_off = 0; { U64 unwind_info_off = first_pdata->voff_unwind_info; @@ -2549,10 +2538,10 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul } //- rjf: unpack frame base - U64 frame_base = regs->rsp.u64; + U64 frame_base = regs->rsp; if(frame_reg != 0) { - U64 raw_frame_base = frame_reg->u64; + U64 raw_frame_base = frame_reg[0]; U64 adjusted_frame_base = raw_frame_base - frame_off*16; frame_base = adjusted_frame_base; } @@ -2591,7 +2580,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul case PE_UnwindOpCode_PUSH_NONVOL: { // rjf: read value from stack pointer - U64 rsp = regs->rsp.u64; + U64 rsp = regs->rsp; U64 value = 0; if(!d_process_memory_read_struct(process_handle, rsp, &is_stale, &value, endt_us) || is_stale) @@ -2605,9 +2594,9 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul U64 new_rsp = rsp + 8; // rjf: commit registers - REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; - regs->rsp.u64 = new_rsp; + U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg[0] = value; + regs->rsp = new_rsp; }break; case PE_UnwindOpCode_ALLOC_LARGE: @@ -2630,23 +2619,23 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul } // rjf: advance stack pointer - U64 rsp = regs->rsp.u64; + U64 rsp = regs->rsp; U64 new_rsp = rsp + size; // rjf: advance stack pointer - regs->rsp.u64 = new_rsp; + regs->rsp = new_rsp; }break; case PE_UnwindOpCode_ALLOC_SMALL: { // rjf: advance stack pointer - regs->rsp.u64 += op_info*8 + 8; + regs->rsp += op_info*8 + 8; }break; case PE_UnwindOpCode_SET_FPREG: { // rjf: put stack pointer back to the frame base - regs->rsp.u64 = frame_base; + regs->rsp = frame_base; }break; case PE_UnwindOpCode_SAVE_NONVOL: @@ -2664,8 +2653,8 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul } // rjf: commit to register - REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; + U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg[0] = value; }break; case PE_UnwindOpCode_SAVE_NONVOL_FAR: @@ -2683,8 +2672,8 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul } // rjf: commit to register - REGS_Reg64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg->u64 = value; + U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); + reg[0] = value; }break; case PE_UnwindOpCode_EPILOG: @@ -2748,7 +2737,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul } // rjf: read values - U64 sp_og = regs->rsp.u64; + U64 sp_og = regs->rsp; U64 sp_adj = sp_og; if(op_info == 1) { @@ -2791,10 +2780,10 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul } // rjf: commit registers - regs->rip.u64 = ip_value; - regs->ss.u16 = ss_value; - regs->rflags.u64 = rflags_value; - regs->rsp.u64 = sp_value; + regs->rip = ip_value; + regs->ss = ss_value; + regs->rflags = rflags_value; + regs->rsp = sp_value; // rjf: mark machine frame xdata_unwind_did_machframe = 1; @@ -2832,7 +2821,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul if(!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe)) ProfScope("no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer") { // rjf: read rip from stack pointer - U64 rsp = regs->rsp.u64; + U64 rsp = regs->rsp; U64 new_rip = 0; if(!d_process_memory_read_struct(process_handle, rsp, &is_stale, &new_rip, endt_us) || is_stale) @@ -2844,8 +2833,8 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul if(is_good) { U64 new_rsp = rsp + 8; - regs->rip.u64 = new_rip; - regs->rsp.u64 = new_rsp; + regs->rip = new_rip; + regs->rsp = new_rsp; } } @@ -2872,7 +2861,8 @@ d_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_u D_Entity *thread_entity = d_entity_from_handle(ctx, thread); D_Entity *process_entity = thread_entity->parent; Arch arch = thread_entity->arch; - U64 arch_reg_block_size = regs_block_size_from_arch(arch); + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 arch_reg_block_size = arch_info->reg_block_size; //- rjf: grab initial register block void *regs_block = d_reg_block_from_thread(scratch.arena, ctx, thread); @@ -2886,8 +2876,9 @@ d_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_u { for(unwind.flags = 0;;) { - U64 rip = regs_rip_from_arch_block(arch, regs_block); - U64 rsp = regs_rsp_from_arch_block(arch, regs_block); + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 rip = arch_ip_from_reg_block(arch_info, regs_block); + U64 rsp = arch_sp_from_reg_block(arch_info, regs_block); // rjf: cancel on zero rip (except the top frame) if(rip == 0 && frame_node_count > 0) @@ -2958,7 +2949,7 @@ d_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_u // stop unwinding on errors or stale data unwind.flags |= step_result.flags; if(unwind.flags & (D_UnwindFlag_Stale|D_UnwindFlag_Error) || - (regs_rsp_from_arch_block(arch, regs_block) == rsp && regs_rip_from_arch_block(arch, regs_block) == rip)) + (arch_sp_from_reg_block(arch_info, regs_block) == rsp && arch_ip_from_reg_block(arch_info, regs_block) == rip)) { break; } @@ -3006,8 +2997,9 @@ d_call_stack_from_unwind(Arena *arena, D_Entity *process, D_Unwind *base_unwind) for(U64 base_frame_idx = 0; base_frame_idx < base_unwind->frames.count; base_frame_idx += 1) { // rjf: unpack + ARCH_Info *arch_info = arch_info_from_arch(arch); D_UnwindFrame *src = &base_unwind->frames.v[base_frame_idx]; - U64 rip_vaddr = regs_rip_from_arch_block(arch, src->regs); + U64 rip_vaddr = arch_ip_from_reg_block(arch_info, src->regs); D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -3149,12 +3141,6 @@ d_string2reg_from_arch(Arch arch) return &d_ctrl_state->arch_string2reg_tables[arch]; } -internal E_String2NumMap * -d_string2alias_from_arch(Arch arch) -{ - return &d_ctrl_state->arch_string2alias_tables[arch]; -} - //////////////////////////////// //~ rjf: Control-Thread Functions @@ -3178,7 +3164,7 @@ d_u2c_push_msgs(D_MsgList *msgs, U64 endt_us) good = 1; break; } - if(os_now_microseconds() >= endt_us) + if(now_time_us() >= endt_us) { break; } @@ -3243,7 +3229,7 @@ d_c2u_push_events(D_EventList *events) d_ctrl_state->c2u_ring_write_pos += ring_write(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); break; } - cond_var_wait(d_ctrl_state->c2u_ring_cv, d_ctrl_state->c2u_ring_mutex, os_now_microseconds()+100); + cond_var_wait(d_ctrl_state->c2u_ring_cv, d_ctrl_state->c2u_ring_mutex, now_time_us()+100); } cond_var_broadcast(d_ctrl_state->c2u_ring_cv); if(d_ctrl_state->wakeup_hook != 0) @@ -3425,7 +3411,7 @@ d_ctrl_thread__entry_point(void *p) { d_entity_equip_string(d_ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); } - U64 new_dbgi_timestamp = os_properties_from_file_path(path).modified; + U64 new_dbgi_timestamp = properties_from_file_path(path).modified; debug_info_path->timestamp = new_dbgi_timestamp; DI_Key new_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, new_dbgi_timestamp); di_open(new_dbgi_key); @@ -3466,7 +3452,7 @@ d_ctrl_thread__entry_point(void *p) { D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; D_EntityArray threads = d_entity_array_from_kind(entity_ctx, D_EntityKind_Thread); - REGS_RegBlockX64 *blocks = push_array(scratch.arena, REGS_RegBlockX64, threads.count); + X64_RegBlock *blocks = push_array(scratch.arena, X64_RegBlock, threads.count); { for EachIndex(idx, threads.count) { @@ -3978,7 +3964,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang for(String8Node *n = dbg_path_candidates.first; n != 0; n = n->next) { String8 candidate_path = n->string; - FileProperties props = os_properties_from_file_path(candidate_path); + FileProperties props = properties_from_file_path(candidate_path); if(props.modified != 0 && props.size != 0) { initial_debug_info_path = push_str8_copy(arena, path_normalized_from_string(scratch.arena, candidate_path)); @@ -4316,12 +4302,14 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D { D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, spoof->thread)); Arch arch = thread->arch; - void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch)); + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 arch_reg_block_size = arch_info->reg_block_size; + void *regs_block = push_array(scratch.arena, U8, arch_reg_block_size); dmn_thread_read_reg_block(spoof->thread, regs_block); - U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block); + U64 spoof_thread_rip = arch_ip_from_reg_block(arch_info, regs_block); if(spoof_thread_rip == spoof->new_ip_value) { - regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value); + arch_reg_block_write_ip(arch_info, regs_block, spoof_old_ip_value); d_thread_write_reg_block(d_handle_make(D_MachineID_Local, spoof->thread), regs_block); } } @@ -4363,7 +4351,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Handle module_handle = d_handle_make(D_MachineID_Local, event->module); D_Event *out_evt1 = d_event_list_push(scratch.arena, &evts); String8 module_path = path_normalized_from_string(scratch.arena, event->string); - U64 exe_timestamp = os_properties_from_file_path(module_path).modified; + U64 exe_timestamp = properties_from_file_path(module_path).modified; d_ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize); out_evt1->kind = D_EventKind_NewModule; out_evt1->msg_id = msg->msg_id; @@ -4379,7 +4367,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D out_evt1->tls_offset = event->tls_offset; D_Event *out_evt2 = d_event_list_push(scratch.arena, &evts); String8 initial_debug_info_path = d_initial_debug_info_path_from_module(scratch.arena, module_handle); - U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified; + U64 debug_info_timestamp = properties_from_file_path(initial_debug_info_path).modified; out_evt2->kind = D_EventKind_ModuleDebugInfoPathChange; out_evt2->msg_id = msg->msg_id; out_evt2->entity = module_handle; @@ -4547,7 +4535,8 @@ d_ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) { Temp scratch = scratch_begin(0, 0); D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - U64 regs_size = regs_block_size_from_arch(entity->arch); + ARCH_Info *arch_info = arch_info_from_arch(entity->arch); + U64 regs_size = arch_info->reg_block_size; void *regs = d_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle); Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 read_range = intersect_1u64(legal_range, range); @@ -4650,7 +4639,7 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti else ProfScope("cache miss") { D_Entity *debug_info_path = d_entity_child_from_kind(mod, D_EntityKind_DebugInfoPath); - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, debug_info_path->string); + File file = file_open(AccessFlag_Read|AccessFlag_ShareRead, debug_info_path->string); ProfScope("determine if %.*s is necessary", str8_varg(debug_info_path->string)) { //- rjf: determine if file is PDB @@ -4658,7 +4647,7 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti if(!file_is_pdb) { U8 msf70_magic_maybe[sizeof(msf_msf70_magic)] = {0}; - os_file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe); + file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe); if(MemoryMatch(msf70_magic_maybe, msf_msf70_magic, sizeof(msf70_magic_maybe))) { file_is_pdb = 1; @@ -4667,7 +4656,7 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti if(!file_is_pdb) { U8 msf20_magic_maybe[sizeof(msf_msf20_magic)] = {0}; - os_file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe); + file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe); if(MemoryMatch(msf20_magic_maybe, msf_msf20_magic, sizeof(msf20_magic_maybe))) { file_is_pdb = 1; @@ -4678,18 +4667,18 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti // if any are found in the PDB, then this RDI is necessary. if(file_is_pdb) { - FileProperties props = os_properties_from_file(file); - OS_Handle map = os_file_map_open(OS_AccessFlag_Read, file); - void *file_base = os_file_map_view_open(map, OS_AccessFlag_Read, r1u64(0, props.size)); + FileProperties props = properties_from_file(file); + FileMap map = file_map_open(AccessFlag_Read, file); + void *file_base = file_map_view_open(map, AccessFlag_Read, r1u64(0, props.size)); String8 file_data = str8(file_base, props.size); { rdi_is_necessary = pdb_has_symbol_or_file_ref(file_data, d_ctrl_state->msg_user_bp_touched_symbols, d_ctrl_state->msg_user_bp_touched_files); } - os_file_map_view_close(map, file_base, r1u64(0, props.size)); - os_file_map_close(map); + file_map_view_close(map, file_base, r1u64(0, props.size)); + file_map_close(map); } } - os_file_close(file); + file_close(file); node = push_array(d_ctrl_state->ctrl_thread_msg_process_arena, D_ModuleReqCacheNode, 1); node->next = slot; d_ctrl_state->module_req_cache_slots[slot_idx] = node; @@ -4771,7 +4760,6 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti { E_IRCtx *ctx = &scope->ir_ctx; ctx->regs_map = d_string2reg_from_arch(arch); - ctx->reg_alias_map = d_string2alias_from_arch(arch); ctx->locals_map = e_push_locals_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff); ctx->member_map = e_push_member_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff); ctx->macro_map = push_array(arena, E_String2ExprMap, 1); @@ -4817,7 +4805,7 @@ d_ctrl_thread__end_and_flush_log(void) { Temp scratch = scratch_begin(0, 0); LogScopeResult log = log_scope_end(scratch.arena); - os_append_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, log.strings[LogMsgKind_Info]); + append_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, log.strings[LogMsgKind_Info]); if(log.strings[LogMsgKind_UserError].size != 0) { D_EventList evts = {0}; @@ -4842,28 +4830,28 @@ d_ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) String8 stderr_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stderr_path, msg->path); //- rjf: obtain stdout/stderr/stdin handles - OS_Handle stdout_handle = {0}; - OS_Handle stderr_handle = {0}; - OS_Handle stdin_handle = {0}; + File stdout_handle = {0}; + File stderr_handle = {0}; + File stdin_handle = {0}; if(stdout_path.size != 0) { - OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path); - os_file_close(f); - stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stdout_path); + File f = file_open(AccessFlag_Write|AccessFlag_Read, stdout_path); + file_close(f); + stdout_handle = file_open(AccessFlag_Write|AccessFlag_Append|AccessFlag_ShareRead|AccessFlag_ShareWrite|AccessFlag_Inherited, msg->stdout_path); } if(stderr_path.size != 0) { - OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stderr_path); - os_file_close(f); - stderr_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stderr_path); + File f = file_open(AccessFlag_Write|AccessFlag_Read, stderr_path); + file_close(f); + stderr_handle = file_open(AccessFlag_Write|AccessFlag_Append|AccessFlag_ShareRead|AccessFlag_ShareWrite|AccessFlag_Inherited, msg->stderr_path); } if(stdin_path.size != 0) { - stdin_handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdin_path); + stdin_handle = file_open(AccessFlag_Read|AccessFlag_ShareRead|AccessFlag_ShareWrite|AccessFlag_Inherited, stdin_path); } //- rjf: launch - OS_ProcessLaunchParams params = {0}; + ProcessLaunchParams params = {0}; { params.cmd_line = msg->cmd_line_string_list; params.path = msg->path; @@ -4877,9 +4865,9 @@ d_ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) U32 id = dmn_ctrl_launch(ctrl_ctx, ¶ms); //- rjf: close stdout/stderr/stdin files - os_file_close(stdout_handle); - os_file_close(stderr_handle); - os_file_close(stdin_handle); + file_close(stdout_handle); + file_close(stderr_handle); + file_close(stdin_handle); //- rjf: record (id -> entry points), so that we know custom entry points for this PID D_EntityCtxRWStore *entity_ctx_rw_store = d_ctrl_state->ctrl_thread_entity_store; @@ -6339,7 +6327,7 @@ d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g if(range_size != 0) { // rjf: set up arena - U64 page_size = os_get_system_info()->page_size; // TODO(rjf): @page_size_from_process + U64 page_size = get_system_info()->page_size; // TODO(rjf): @page_size_from_process U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, page_size); range_arena = arena_alloc(.reserve_size = range_size+ARENA_HEADER_SIZE, .commit_size = range_size+ARENA_HEADER_SIZE); @@ -6676,15 +6664,15 @@ d_process_write(D_Handle process, Rng1U64 range, void *src) // time. if(result) { - U64 endt_us = os_now_microseconds()+10000; - U64 page_size = os_get_system_info()->page_size; // TODO(rjf): @page_size_from_process + U64 endt_us = now_time_us()+10000; + U64 page_size = get_system_info()->page_size; // TODO(rjf): @page_size_from_process Rng1U64 page_range = r1u64(range.min/page_size, (range.max+page_size-1)/page_size); for EachInRange(page_idx, page_range) { Temp scratch = scratch_begin(0, 0); D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); scratch_end(scratch); - if(!slice.stale || os_now_microseconds() >= endt_us) + if(!slice.stale || now_time_us() >= endt_us) { break; } @@ -6826,7 +6814,7 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 { pre_reg_gen = d_reg_gen(); pre_mem_gen = d_mem_gen(); - unwind = d_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000); + unwind = d_unwind_from_thread(arena, entity_ctx, thread_handle, now_time_us()+5000); if(!(unwind.flags & D_UnwindFlag_Stale)) { good = 1; @@ -6967,11 +6955,12 @@ d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_ou D_Handle thread = threads[thread_idx]; D_Handle process = threads_processes[thread_idx]; Arch arch = threads_arches[thread_idx]; + ARCH_Info *arch_info = arch_info_from_arch(arch); D_CallStack call_stack = call_stacks[thread_idx]; D_CallStackTreeNode *thread_node = tree->root; for EachIndex(frame_idx, call_stack.frames_count) { - U64 vaddr = regs_rip_from_arch_block(arch, call_stack.frames[frame_idx].regs); + U64 vaddr = arch_ip_from_reg_block(arch_info, call_stack.frames[frame_idx].regs); U64 depth = call_stack.frames[frame_idx].inline_depth; D_CallStackTreeNode *next_node = &d_call_stack_tree_node_nil; for(D_CallStackTreeNode *child = thread_node->first; child != &d_call_stack_tree_node_nil; child = child->next) diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 8a5cc7ea..0db01810 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -269,9 +269,8 @@ struct D_CtrlState Arena *arena; D_WakeupFunctionType *wakeup_hook; - // rjf: name -> register/alias hash tables for eval + // rjf: name -> register hash tables for eval E_String2NumMap arch_string2reg_tables[Arch_COUNT]; - E_String2NumMap arch_string2alias_tables[Arch_COUNT]; // rjf: caches D_ThreadRegCache thread_reg_cache; @@ -499,8 +498,8 @@ internal D_UnwindStepResult d_establish_frame_unwind_context__dwarf(Arena *arena internal D_UnwindStepResult d_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us); //- rjf: [x64] -internal REGS_Reg64 *d_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); -internal D_UnwindStepResult d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us); +internal U64 *d_unwind_reg_from_pe_gpr_reg__pe_x64(X64_RegBlock *regs, PE_UnwindGprRegX64 gpr_reg); +internal D_UnwindStepResult d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, X64_RegBlock *regs, U64 endt_us); //- rjf: abstracted full unwind internal D_Unwind d_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us); @@ -526,7 +525,6 @@ internal U64 d_reg_gen(void); //- rjf: name -> register/alias hash tables, for eval internal E_String2NumMap *d_string2reg_from_arch(Arch arch); -internal E_String2NumMap *d_string2alias_from_arch(Arch arch); //////////////////////////////// //~ rjf: Control-Thread Functions diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index ab323399..bfaffd88 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -300,7 +300,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread) String8 machine_code = {0}; { Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, os_now_microseconds()+5000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, now_time_us()+5000); machine_code = machine_code_slice.data; } @@ -393,7 +393,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+50000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, now_time_us()+50000); machine_code = machine_code_slice.data; good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); LogInfoNamedBlockF("machine_code_slice") @@ -604,7 +604,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+5000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, now_time_us()+5000); machine_code = machine_code_slice.data; good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); } @@ -1215,7 +1215,8 @@ d_query_cached_rip_from_thread_unwind(D_Entity *thread, U64 unwind_count) D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, 0); if(callstack.concrete_frames_count != 0) { - result = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->regs); + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); + result = arch_ip_from_reg_block(arch_info, callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->regs); } access_close(access); } @@ -1648,7 +1649,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P String8List env = target->env; if(working_directory.size == 0) { - working_directory = os_get_current_path(scratch.arena); + working_directory = get_current_path(scratch.arena); } // rjf: build launch options @@ -1811,12 +1812,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P Access *access = access_open(); // rjf: thread => call stack - D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, now_time_us()+10000); // rjf: use first unwind frame to generate trap if(callstack.concrete_frames_count > 1) { - U64 vaddr = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[1]->regs); + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); + U64 vaddr = arch_ip_from_reg_block(arch_info, callstack.concrete_frames[1]->regs); D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, vaddr}; d_trap_list_push(scratch.arena, &trap_net.traps, &trap); trap_net.good_read = 1; @@ -1875,9 +1877,10 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_SetThreadIP: { D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); U64 vaddr = params->vaddr; void *block = d_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, thread->handle); - regs_arch_block_write_rip(thread->arch, block, vaddr); + arch_reg_block_write_ip(arch_info, block, vaddr); B32 result = d_thread_write_reg_block(thread->handle, block); (void)result; }break; @@ -2120,7 +2123,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P d_user_state->ctrl_soft_halt_issued = 1; d_halt(); } - if(d_u2c_push_msgs(&d_user_state->ctrl_msgs, os_now_microseconds()+100)) + if(d_u2c_push_msgs(&d_user_state->ctrl_msgs, now_time_us()+100)) { MemoryZeroStruct(&d_user_state->ctrl_msgs); arena_clear(d_user_state->ctrl_msg_arena); diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index f215f99b..7b5a58a0 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -71,7 +71,7 @@ di_init(CmdLine *cmdline) if(!try_u64_from_str8_c_rules(signal_pid_string, &signal_pid)) { has_parent = 0; - signal_pid = os_get_process_info()->pid; + signal_pid = get_process_info()->pid; } U64 signal_code = 0; String8 signal_code_string = cmd_line_string(cmdline, str8_lit("signal_code")); @@ -84,16 +84,16 @@ di_init(CmdLine *cmdline) { di_shared->conversion_completion_lock_semaphore = semaphore_open(di_shared->conversion_completion_lock_semaphore_name); di_shared->conversion_completion_signal_semaphore = semaphore_open(di_shared->conversion_completion_signal_semaphore_name); - di_shared->conversion_completion_shared_memory = os_shared_memory_open(di_shared->conversion_completion_shared_memory_name); + di_shared->conversion_completion_shared_memory = shared_memory_open(di_shared->conversion_completion_shared_memory_name); } else { di_shared->conversion_completion_lock_semaphore = semaphore_alloc(1, 1, di_shared->conversion_completion_lock_semaphore_name); di_shared->conversion_completion_signal_semaphore = semaphore_alloc(0, 65536, di_shared->conversion_completion_signal_semaphore_name); - di_shared->conversion_completion_shared_memory = os_shared_memory_alloc(KB(4), di_shared->conversion_completion_shared_memory_name); + di_shared->conversion_completion_shared_memory = shared_memory_alloc(KB(4), di_shared->conversion_completion_shared_memory_name); di_shared->conversion_completion_signal_receiver_thread = thread_launch(di_conversion_completion_signal_receiver_thread_entry_point, 0); } - di_shared->conversion_completion_shared_memory_base = (U64 *)os_shared_memory_view_open(di_shared->conversion_completion_shared_memory, r1u64(0, KB(4))); + di_shared->conversion_completion_shared_memory_base = (U64 *)shared_memory_view_open(di_shared->conversion_completion_shared_memory, r1u64(0, KB(4))); di_shared->completion_mutex = mutex_alloc(); di_shared->completion_arena = arena_alloc(); di_shared->event_mutex = mutex_alloc(); @@ -164,8 +164,8 @@ di_key_from_path_timestamp(String8 path, U64 min_timestamp) //- rjf: try to make key from file's contents if(!made_key) { - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - FileProperties props = os_properties_from_file(file); + File file = file_open(AccessFlag_Read|AccessFlag_ShareRead, path); + FileProperties props = properties_from_file(file); if(min_timestamp <= props.modified) { //- rjf: PDB magic => use GUID for key @@ -176,7 +176,7 @@ di_key_from_path_timestamp(String8 path, U64 min_timestamp) { read_only local_persist char msf_msf20_magic[] = "Microsoft C/C++ program database 2.00\r\n\x1aJG\0\0"; U8 msf20_magic_maybe[sizeof(msf_msf20_magic)] = {0}; - os_file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe); + file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe); if(MemoryMatch(msf20_magic_maybe, msf_msf20_magic, sizeof(msf20_magic_maybe))) { is_pdb = 1; @@ -186,7 +186,7 @@ di_key_from_path_timestamp(String8 path, U64 min_timestamp) { read_only local_persist char msf_msf70_magic[] = "Microsoft C/C++ MSF 7.00\r\n\032DS\0\0"; U8 msf70_magic_maybe[sizeof(msf_msf70_magic)] = {0}; - os_file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe); + file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe); if(MemoryMatch(msf70_magic_maybe, msf_msf70_magic, sizeof(msf70_magic_maybe))) { is_pdb = 1; @@ -198,7 +198,7 @@ di_key_from_path_timestamp(String8 path, U64 min_timestamp) } } } - os_file_close(file); + file_close(file); } //- rjf: fallback: hash from path/timestamp @@ -323,8 +323,8 @@ di_close(DI_Key key, B32 force_closed) //- rjf: decrement this key's node's refcount; remove if needed B32 node_released = 0; - OS_Handle file = {0}; - OS_Handle file_map = {0}; + File file = {0}; + FileMap file_map = {0}; FileProperties file_props = {0}; void *file_base = 0; Arena *arena = 0; @@ -377,9 +377,9 @@ di_close(DI_Key key, B32 force_closed) { ins_atomic_u64_dec_eval(&di_shared->load_count); ins_atomic_u64_inc_eval(&di_shared->load_gen); - os_file_map_view_close(file_map, file_base, r1u64(0, file_props.size)); - os_file_map_close(file_map); - os_file_close(file); + file_map_view_close(file_map, file_base, r1u64(0, file_props.size)); + file_map_close(file_map); + file_close(file); if(arena != 0) { arena_release(arena); @@ -492,7 +492,7 @@ di_rdi_from_key(Access *access, DI_Key key, B32 high_priority, U64 endt_us) } // rjf: found current results, or out-of-time? abort - if(grabbed || os_now_microseconds() >= endt_us) + if(grabbed || now_time_us() >= endt_us) { break; } @@ -681,16 +681,16 @@ di_async_tick(void) if(!t->og_analyzed) { t->og_analyzed = 1; - OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, og_path); - FileProperties props = os_properties_from_file(file); + File file = file_open(AccessFlag_ShareRead|AccessFlag_Read, og_path); + FileProperties props = properties_from_file(file); t->og_size = props.size; U64 rdi_magic_maybe = 0; - if(os_file_read_struct(file, 0, &rdi_magic_maybe) == 8 && + if(file_read_struct(file, 0, &rdi_magic_maybe) == 8 && rdi_magic_maybe == RDI_MAGIC_CONSTANT) { t->og_is_rdi = 1; } - os_file_close(file); + file_close(file); } U64 og_size = t->og_size; B32 og_is_rdi = t->og_is_rdi; @@ -713,8 +713,8 @@ di_async_tick(void) if(!t->rdi_analyzed) { t->rdi_analyzed = 1; - OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, rdi_path); - FileProperties props = os_properties_from_file(file); + File file = file_open(AccessFlag_ShareRead|AccessFlag_Read, rdi_path); + FileProperties props = properties_from_file(file); if(props.modified < og_min_timestamp) { t->rdi_is_stale = 1; @@ -723,12 +723,12 @@ di_async_tick(void) { t->rdi_is_stale = 1; RDI_Header header = {0}; - if(os_file_read_struct(file, 0, &header) == sizeof(header)) + if(file_read_struct(file, 0, &header) == sizeof(header)) { t->rdi_is_stale = (header.encoding_version != RDI_ENCODING_VERSION); } } - os_file_close(file); + file_close(file); } B32 rdi_is_stale = t->rdi_is_stale; @@ -736,7 +736,7 @@ di_async_tick(void) if(!og_is_rdi && rdi_is_stale && t->thread_count == 0) { U64 thread_count = 1; - U64 max_thread_count = os_get_system_info()->logical_processor_count/2; + U64 max_thread_count = get_system_info()->logical_processor_count/2; if(priority_idx > 0) { max_thread_count = Max(1, max_thread_count/2); @@ -756,7 +756,7 @@ di_async_tick(void) //- rjf: determine if there are threads available B32 threads_available = 0; { - U64 max_threads = os_get_system_info()->logical_processor_count/2; + U64 max_threads = get_system_info()->logical_processor_count/2; U64 current_threads = di_shared->conversion_thread_count; U64 needed_threads = (current_threads + t->thread_count); threads_available = (max_threads >= needed_threads); @@ -789,8 +789,8 @@ di_async_tick(void) if(og_is_good && ready_to_launch_conversion) { B32 should_compress = 0; - OS_ProcessLaunchParams params = {0}; - params.path = os_get_process_info()->binary_path; + ProcessLaunchParams params = {0}; + params.path = get_process_info()->binary_path; params.inherit_env = 1; params.consoleless = 1; str8_list_pushf(scratch.arena, ¶ms.cmd_line, "raddbg"); @@ -804,11 +804,11 @@ di_async_tick(void) str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--rdi"); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--out:%S", rdi_path); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--thread_count:%I64u", t->thread_count); - str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--signal_pid:%I64u", (U64)os_get_process_info()->pid); + str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--signal_pid:%I64u", (U64)get_process_info()->pid); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--signal_code:%I64u", (U64)t); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "%S", og_path); ProfMsg("launch creation for %.*s", str8_varg(rdi_path)); - t->process = os_process_launch(¶ms); + t->process = process_launch(¶ms); t->status = DI_LoadTaskStatus_Active; di_shared->conversion_process_count += 1; di_shared->conversion_thread_count += t->thread_count; @@ -840,7 +840,7 @@ di_async_tick(void) } if(!task_is_done) { - task_is_done = os_process_join(t->process, 0, 0); + task_is_done = process_join(t->process, 0, 0); } if(task_is_done) { @@ -875,7 +875,7 @@ di_async_tick(void) //- rjf: if task is done, retire & recycle task; gather path to load if(t->status == DI_LoadTaskStatus_Done) { - if(!os_handle_match(t->process, os_handle_zero())) MutexScope(di_shared->event_mutex) + if(!process_match(t->process, process_zero())) MutexScope(di_shared->event_mutex) { DI_EventNode *n = push_array(di_shared->event_arena, DI_EventNode, 1); SLLQueuePush(di_shared->events.first, di_shared->events.last, n); @@ -937,15 +937,15 @@ di_async_tick(void) ProfBegin("parse %.*s", str8_varg(rdi_path)); //- rjf: open file - OS_Handle file = {0}; - OS_Handle file_map = {0}; + File file = {0}; + FileMap file_map = {0}; FileProperties file_props = {0}; void *file_base = 0; { - file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, rdi_path); - file_map = os_file_map_open(OS_AccessFlag_Read, file); - file_props = os_properties_from_file(file); - file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size)); + file = file_open(AccessFlag_Read|AccessFlag_ShareRead|AccessFlag_ShareWrite, rdi_path); + file_map = file_map_open(AccessFlag_Read, file); + file_props = properties_from_file(file); + file_base = file_map_view_open(file_map, AccessFlag_Read, r1u64(0, file_props.size)); } //- rjf: do initial parse of rdi @@ -1010,9 +1010,9 @@ di_async_tick(void) { arena_release(rdi_parsed_arena); } - os_file_map_view_close(file_map, file_base, r1u64(0, file_props.size)); - os_file_map_close(file_map); - os_file_close(file); + file_map_view_close(file_map, file_base, r1u64(0, file_props.size)); + file_map_close(file_map); + file_close(file); } } cond_var_broadcast(stripe->cv); diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 5355e6c0..654a94c9 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -69,8 +69,8 @@ struct DI_Node DI_Key key; // rjf: value - OS_Handle file; - OS_Handle file_map; + File file; + FileMap file_map; void *file_base; FileProperties file_props; Arena *arena; @@ -145,7 +145,7 @@ struct DI_LoadTask B32 rdi_is_stale; U64 thread_count; - OS_Handle process; + Process process; }; typedef struct DI_LoadCompletion DI_LoadCompletion; @@ -280,7 +280,7 @@ struct DI_Shared String8 conversion_completion_shared_memory_name; Semaphore conversion_completion_lock_semaphore; Semaphore conversion_completion_signal_semaphore; - OS_Handle conversion_completion_shared_memory; + SharedMemory conversion_completion_shared_memory; U64 *conversion_completion_shared_memory_base; Thread conversion_completion_signal_receiver_thread; diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index c4a342ae..33748624 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -132,10 +132,11 @@ dmn_rip_from_thread(DMN_Handle thread) Temp scratch = scratch_begin(0, 0); { Arch arch = dmn_arch_from_thread(thread); - U64 reg_block_size = regs_block_size_from_arch(arch); + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 reg_block_size = arch_info->reg_block_size; void *reg_block = push_array(scratch.arena, U8, reg_block_size); dmn_thread_read_reg_block(thread, reg_block); - result = regs_rip_from_arch_block(arch, reg_block); + result = arch_ip_from_reg_block(arch_info, reg_block); } scratch_end(scratch); return result; @@ -148,10 +149,11 @@ dmn_rsp_from_thread(DMN_Handle thread) Temp scratch = scratch_begin(0, 0); { Arch arch = dmn_arch_from_thread(thread); - U64 reg_block_size = regs_block_size_from_arch(arch); + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 reg_block_size = arch_info->reg_block_size; void *reg_block = push_array(scratch.arena, U8, reg_block_size); dmn_thread_read_reg_block(thread, reg_block); - result = regs_rsp_from_arch_block(arch, reg_block); + result = arch_sp_from_reg_block(arch_info, reg_block); } scratch_end(scratch); return result; @@ -165,11 +167,11 @@ dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr) { Temp scratch = scratch_begin(&arena, 1); String8List block_list = {0}; - for(U64 cursor = addr, stride = 256; ; cursor += stride) + for(U64 cursor = addr, stride = 256;; cursor += stride) { - U8 *raw_block = push_array_no_zero(scratch.arena, U8, stride); - U64 read_size = dmn_process_read(process, r1u64(cursor, cursor + stride), raw_block); - String8 block = str8_cstring_capped(raw_block, raw_block + read_size); + U8 *raw_block = push_array_no_zero(scratch.arena, U8, stride); + U64 read_size = dmn_process_read(process, r1u64(cursor, cursor + stride), raw_block); + String8 block = str8_cstring_capped(raw_block, raw_block + read_size); str8_list_push(scratch.arena, &block_list, block); if(read_size != stride || (block.size+1 <= read_size && block.str[block.size] == 0)) { diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 92874f97..6878f837 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -235,7 +235,7 @@ internal DMN_CtrlCtx *dmn_ctrl_begin(void); internal void dmn_ctrl_exclusive_access_begin(void); internal void dmn_ctrl_exclusive_access_end(void); #define DMN_CtrlExclusiveAccessScope DeferLoop(dmn_ctrl_exclusive_access_begin(), dmn_ctrl_exclusive_access_end()) -internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params); +internal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params); internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid); internal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code); internal B32 dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process); @@ -259,7 +259,7 @@ internal U64 dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) internal void dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size); internal void dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size); internal void dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size); -internal void dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags); +internal void dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, AccessFlags flags); internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); #define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 193c2554..e5619af0 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -753,7 +753,8 @@ dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, } else { - U64 reg_block_size = regs_block_size_from_arch(process->ctx->arch); + ARCH_Info *arch_info = arch_info_from_arch(process->ctx->arch); + U64 reg_block_size = arch_info->reg_block_size; reg_block = push_array(process->ctx->arena, U8, reg_block_size); } @@ -1130,26 +1131,32 @@ dmn_lnx_process_untrap_probes(DMN_LNX_Process *process) internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread) { - return regs_rip_from_arch_block(thread->process->ctx->arch, thread->reg_block); + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + U64 result = arch_ip_from_reg_block(arch_info, thread->reg_block); + return result; } internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread) { - return regs_rsp_from_arch_block(thread->process->ctx->arch, thread->reg_block); + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + U64 result = arch_sp_from_reg_block(arch_info, thread->reg_block); + return result; } internal void dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip) { - regs_arch_block_write_rip(thread->process->ctx->arch, thread->reg_block, ip); + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + arch_reg_block_write_ip(arch_info, thread->reg_block, ip); thread->is_reg_block_dirty = 1; } internal void dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp) { - regs_arch_block_write_rsp(thread->process->ctx->arch, thread->reg_block, sp); + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + arch_reg_block_write_sp(arch_info, thread->reg_block, sp); thread->is_reg_block_dirty = 1; } @@ -1166,7 +1173,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) case Arch_x64: { DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; - REGS_RegBlockX64 *dst = thread->reg_block; + X64_RegBlock *dst = thread->reg_block; // general purpose registers { @@ -1364,7 +1371,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) case Arch_x64: { DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; - REGS_RegBlockX64 *src = thread->reg_block; + X64_RegBlock *src = thread->reg_block; // general purpose registers { @@ -1555,7 +1562,7 @@ dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on) case Arch_Null: {} break; case Arch_x64: { - REGS_RegBlockX64 *reg_block = thread->reg_block; + X64_RegBlock *reg_block = thread->reg_block; if(is_on) { reg_block->rflags.u64 |= X64_RFlag_Trap; } else { reg_block->rflags.u64 &= ~X64_RFlag_Trap; } thread->is_reg_block_dirty = 1; @@ -2082,7 +2089,7 @@ dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) case Arch_Null: {} break; case Arch_x64: { - REGS_RegBlockX64 *regs_x64 = thread->reg_block; + X64_RegBlock *regs_x64 = thread->reg_block; if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B0) { address = regs_x64->dr0.u64; @@ -3021,7 +3028,7 @@ dmn_tls_root_vaddr_from_thread(DMN_Handle thread_handle) case Arch_Null: {} break; case Arch_x64: { - REGS_RegBlockX64 *reg_block = thread->reg_block; + X64_RegBlock *reg_block = thread->reg_block; U64 dtv_pointer = 0; if(dmn_lnx_read_struct(thread->process->fd, reg_block->fsbase.u64 + 8, &dtv_pointer)) { @@ -3050,7 +3057,8 @@ dmn_thread_read_reg_block(DMN_Handle thread_handle, void *reg_block) DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); if(thread) { - U64 reg_block_size = regs_block_size_from_arch(thread->process->ctx->arch); + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + U64 reg_block_size = arch_info->reg_block_size; MemoryCopy(reg_block, thread->reg_block, reg_block_size); } result = 1; @@ -3067,7 +3075,8 @@ dmn_thread_write_reg_block(DMN_Handle thread_handle, void *reg_block) DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); if(thread) { - U64 reg_block_size = regs_block_size_from_arch(thread->process->ctx->arch); + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + U64 reg_block_size = arch_info->reg_block_size; MemoryCopy(thread->reg_block, reg_block, reg_block_size); thread->is_reg_block_dirty = 1; result = 1; @@ -3148,4 +3157,3 @@ dmn_process_iter_end(DMN_ProcessIter *iter) } MemoryZeroStruct(iter); } - diff --git a/src/demon/win32/demon_core_win32.c b/src/demon/win32/demon_core_win32.c index cef314fb..0084818d 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/demon/win32/demon_core_win32.c @@ -494,13 +494,13 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) if(got_coff_header) { U64 optional_off = coff_header_off + sizeof(COFF_FileHeader); - + Arch arch = arch_from_coff_machine(coff_header.machine); U64 image_size = 0; U64 data_dir_count = 0; U64 data_dir_off = max_U64; U64 tls_index = max_U64; - + // parse optional header if(pe_has_plus_header(coff_header.machine)) { @@ -524,7 +524,7 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) } else { Assert(0 && "failed to read optional header"); } } - + // extract TLS index if(PE_DataDirectoryIndex_TLS < data_dir_count) { @@ -569,7 +569,7 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) } else { Assert(0 && "failed to read TLS directory"); } } - + // fill out result result.arch = arch; result.size = image_size; @@ -606,7 +606,7 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) case Arch_x64: { Temp scratch = scratch_begin(0, 0); - REGS_RegBlockX64 *dst = (REGS_RegBlockX64 *)reg_block; + X64_RegBlock *dst = (X64_RegBlock *)reg_block; //- rjf: unpack info about available features U32 feature_mask = GetEnabledXStateFeatures(); @@ -648,51 +648,51 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) DWORD64 xstate_mask = 0; GetXStateFeaturesMask(ctx, &xstate_mask); - //- rjf: convert context -> REGS_RegBlockX64 + //- rjf: convert context -> X64_RegBlock XSAVE_FORMAT *xsave = &ctx->FltSave; - dst->rax.u64 = ctx->Rax; - dst->rcx.u64 = ctx->Rcx; - dst->rdx.u64 = ctx->Rdx; - dst->rbx.u64 = ctx->Rbx; - dst->rsp.u64 = ctx->Rsp; - dst->rbp.u64 = ctx->Rbp; - dst->rsi.u64 = ctx->Rsi; - dst->rdi.u64 = ctx->Rdi; - dst->r8.u64 = ctx->R8; - dst->r9.u64 = ctx->R9; - dst->r10.u64 = ctx->R10; - dst->r11.u64 = ctx->R11; - dst->r12.u64 = ctx->R12; - dst->r13.u64 = ctx->R13; - dst->r14.u64 = ctx->R14; - dst->r15.u64 = ctx->R15; - dst->rip.u64 = ctx->Rip; - dst->cs.u16 = ctx->SegCs; - dst->ds.u16 = ctx->SegDs; - dst->es.u16 = ctx->SegEs; - dst->fs.u16 = ctx->SegFs; - dst->gs.u16 = ctx->SegGs; - dst->ss.u16 = ctx->SegSs; - dst->dr0.u64 = ctx->Dr0; - dst->dr1.u64 = ctx->Dr1; - dst->dr2.u64 = ctx->Dr2; - dst->dr3.u64 = ctx->Dr3; - dst->dr6.u64 = ctx->Dr6; - dst->dr7.u64 = ctx->Dr7; + dst->rax = ctx->Rax; + dst->rcx = ctx->Rcx; + dst->rdx = ctx->Rdx; + dst->rbx = ctx->Rbx; + dst->rsp = ctx->Rsp; + dst->rbp = ctx->Rbp; + dst->rsi = ctx->Rsi; + dst->rdi = ctx->Rdi; + dst->r8 = ctx->R8; + dst->r9 = ctx->R9; + dst->r10 = ctx->R10; + dst->r11 = ctx->R11; + dst->r12 = ctx->R12; + dst->r13 = ctx->R13; + dst->r14 = ctx->R14; + dst->r15 = ctx->R15; + dst->rip = ctx->Rip; + dst->cs = ctx->SegCs; + dst->ds = ctx->SegDs; + dst->es = ctx->SegEs; + dst->fs = ctx->SegFs; + dst->gs = ctx->SegGs; + dst->ss = ctx->SegSs; + dst->dr0 = ctx->Dr0; + dst->dr1 = ctx->Dr1; + dst->dr2 = ctx->Dr2; + dst->dr3 = ctx->Dr3; + dst->dr6 = ctx->Dr6; + dst->dr7 = ctx->Dr7; // NOTE(rjf): this bit is "supposed to always be 1", according to old info. // may need to be investigated. - dst->rflags.u64 = ctx->EFlags | 0x2; - dst->fcw.u16 = xsave->ControlWord; - dst->fsw.u16 = xsave->StatusWord; + dst->rflags = ctx->EFlags | 0x2; + dst->fcw = xsave->ControlWord; + dst->fsw = xsave->StatusWord; dst->ftw = xsave->TagWord; - dst->fop.u16 = xsave->ErrorOpcode; - MemoryCopy(&dst->fip.u64, &xsave->ErrorOffset, sizeof(U64)); - MemoryCopy(&dst->fdp.u64, &xsave->DataOffset, sizeof(U64)); - dst->mxcsr.u32 = xsave->MxCsr; - dst->mxcsr_mask.u32 = xsave->MxCsr_Mask; + dst->fop = xsave->ErrorOpcode; + MemoryCopy(&dst->fip, &xsave->ErrorOffset, sizeof(U64)); + MemoryCopy(&dst->fdp, &xsave->DataOffset, sizeof(U64)); + dst->mxcsr = xsave->MxCsr; + dst->mxcsr_mask = xsave->MxCsr_Mask; { M128A *float_s = xsave->FloatRegisters; - REGS_Reg80 *float_d = &dst->st0; + U80 *float_d = &dst->st0; for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) { MemoryCopy(float_d, float_s, sizeof(*float_d)); @@ -702,7 +702,7 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) // SSE registers are always available in x64 { M128A *xmm_s = xsave->XmmRegisters; - REGS_Reg512 *zmm_d = &dst->zmm0; + U512 *zmm_d = &dst->zmm0; for(U32 n = 0; n < 16; n += 1, xmm_s += 1, zmm_d += 1) { MemoryCopy(zmm_d, xmm_s, sizeof(*xmm_s)); @@ -713,72 +713,77 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) if(xstate_mask & XSTATE_MASK_AVX) { DWORD avx_length = 0; - U8* avx_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); - Assert(avx_length == 16 * sizeof(REGS_Reg128)); - - REGS_Reg512 *zmm_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, avx_s += sizeof(REGS_Reg128), zmm_d += 1) + U8 *avx_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); + if(avx_length == 16 * sizeof(U128)) { - MemoryCopy(&zmm_d->v[16], avx_s, sizeof(REGS_Reg128)); + U512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, avx_s += sizeof(U128), zmm_d += 1) + { + MemoryCopy(&zmm_d->u8[16], avx_s, sizeof(U128)); + } } } else { - REGS_Reg512 *zmm_d = &dst->zmm0; + U512 *zmm_d = &dst->zmm0; for(U32 n = 0; n < 16; n += 1, zmm_d += 1) { - MemoryZero(&zmm_d->v[16], sizeof(REGS_Reg128)); + MemoryZero(&zmm_d->u8[16], sizeof(U128)); } } // AVX-512 if(xstate_mask & XSTATE_MASK_AVX512) { + // rjf: kmask DWORD kmask_length = 0; - U64* kmask_s = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); - Assert(kmask_length == 8 * sizeof(U64)); - - REGS_Reg64 *kmask_d = &dst->k0; - for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + U64 *kmask_s = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); + if(kmask_length == 8 * sizeof(U64)) { - MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_s)); + U64 *kmask_d = &dst->k0; + for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + { + MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_s)); + } } + // rjf: zmmh DWORD avx512h_length = 0; - U8* avx512h_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); - Assert(avx512h_length == 16 * sizeof(REGS_Reg256)); - - REGS_Reg512 *zmmh_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, avx512h_s += sizeof(REGS_Reg256), zmmh_d += 1) + U8 *avx512h_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); + if(avx512h_length == 16 * sizeof(U256)) { - MemoryCopy(&zmmh_d->v[32], avx512h_s, sizeof(REGS_Reg256)); + U512 *zmmh_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, avx512h_s += sizeof(U256), zmmh_d += 1) + { + MemoryCopy(&zmmh_d->u8[32], avx512h_s, sizeof(U256)); + } } + // rjf: zmm DWORD avx512_length = 0; - U8* avx512_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); - Assert(avx512_length == 16 * sizeof(REGS_Reg512)); - - REGS_Reg512 *zmm_d = &dst->zmm16; - for(U32 n = 0; n < 16; n += 1, avx512_s += sizeof(REGS_Reg512), zmm_d += 1) + U8 *avx512_s = (U8 *)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); + if(avx512_length == 16 * sizeof(U512)) { - MemoryCopy(zmm_d, avx512_s, sizeof(REGS_Reg512)); + U512 *zmm_d = &dst->zmm16; + for(U32 n = 0; n < 16; n += 1, avx512_s += sizeof(U512), zmm_d += 1) + { + MemoryCopy(zmm_d, avx512_s, sizeof(U512)); + } } } else { - REGS_Reg64 *kmask_d = &dst->k0; + U64 *kmask_d = &dst->k0; for(U32 n = 0; n < 8; n += 1, kmask_d += 1) { MemoryZero(kmask_d, sizeof(*kmask_d)); } - - REGS_Reg512 *zmmh_d = &dst->zmm0; + U512 *zmmh_d = &dst->zmm0; for(U32 n = 0; n < 16; n += 1, zmmh_d += 1) { - MemoryZero(&zmmh_d->v[32], sizeof(REGS_Reg256)); + MemoryZero(&zmmh_d->u8[32], sizeof(U256)); } - - REGS_Reg512 *zmm_d = &dst->zmm16; + U512 *zmm_d = &dst->zmm16; for(U32 n = 0; n < 16; n += 1, zmm_d += 1) { MemoryZero(zmm_d, sizeof(*zmm_d)); @@ -792,8 +797,8 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) XSAVE_CET_U_FORMAT *cet = LocateXStateFeature(ctx, XSTATE_CET_U, &cet_length); if (cet_length == sizeof(*cet)) { - dst->cetmsr.u64 = cet->Ia32CetUMsr; - dst->cetssp.u64 = cet->Ia32Pl3SspMsr; + dst->cetmsr = cet->Ia32CetUMsr; + dst->cetssp = cet->Ia32Pl3SspMsr; } } @@ -828,7 +833,7 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) case Arch_x64: { Temp scratch = scratch_begin(0, 0); - REGS_RegBlockX64 *src = (REGS_RegBlockX64 *)reg_block; + X64_RegBlock *src = (X64_RegBlock *)reg_block; //- rjf: unpack info about available features U32 feature_mask = GetEnabledXStateFeatures(); @@ -860,49 +865,49 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) break; } - //- rjf: convert REGS_RegBlockX64 -> CONTEXT + //- rjf: convert X64_RegBlock -> CONTEXT XSAVE_FORMAT *fxsave = &ctx->FltSave; ctx->ContextFlags = ctx_flags; - ctx->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32; - ctx->Rax = src->rax.u64; - ctx->Rcx = src->rcx.u64; - ctx->Rdx = src->rdx.u64; - ctx->Rbx = src->rbx.u64; - ctx->Rsp = src->rsp.u64; - ctx->Rbp = src->rbp.u64; - ctx->Rsi = src->rsi.u64; - ctx->Rdi = src->rdi.u64; - ctx->R8 = src->r8.u64; - ctx->R9 = src->r9.u64; - ctx->R10 = src->r10.u64; - ctx->R11 = src->r11.u64; - ctx->R12 = src->r12.u64; - ctx->R13 = src->r13.u64; - ctx->R14 = src->r14.u64; - ctx->R15 = src->r15.u64; - ctx->Rip = src->rip.u64; - ctx->SegCs = src->cs.u16; - ctx->SegDs = src->ds.u16; - ctx->SegEs = src->es.u16; - ctx->SegFs = src->fs.u16; - ctx->SegGs = src->gs.u16; - ctx->SegSs = src->ss.u16; - ctx->Dr0 = src->dr0.u64; - ctx->Dr1 = src->dr1.u64; - ctx->Dr2 = src->dr2.u64; - ctx->Dr3 = src->dr3.u64; - ctx->Dr6 = src->dr6.u64; - ctx->Dr7 = src->dr7.u64; - ctx->EFlags = src->rflags.u64; - fxsave->ControlWord = src->fcw.u16; - fxsave->StatusWord = src->fsw.u16; + ctx->MxCsr = src->mxcsr & src->mxcsr_mask; + ctx->Rax = src->rax; + ctx->Rcx = src->rcx; + ctx->Rdx = src->rdx; + ctx->Rbx = src->rbx; + ctx->Rsp = src->rsp; + ctx->Rbp = src->rbp; + ctx->Rsi = src->rsi; + ctx->Rdi = src->rdi; + ctx->R8 = src->r8; + ctx->R9 = src->r9; + ctx->R10 = src->r10; + ctx->R11 = src->r11; + ctx->R12 = src->r12; + ctx->R13 = src->r13; + ctx->R14 = src->r14; + ctx->R15 = src->r15; + ctx->Rip = src->rip; + ctx->SegCs = src->cs; + ctx->SegDs = src->ds; + ctx->SegEs = src->es; + ctx->SegFs = src->fs; + ctx->SegGs = src->gs; + ctx->SegSs = src->ss; + ctx->Dr0 = src->dr0; + ctx->Dr1 = src->dr1; + ctx->Dr2 = src->dr2; + ctx->Dr3 = src->dr3; + ctx->Dr6 = src->dr6; + ctx->Dr7 = src->dr7; + ctx->EFlags = src->rflags; + fxsave->ControlWord = src->fcw; + fxsave->StatusWord = src->fsw; fxsave->TagWord = src->ftw; - fxsave->ErrorOpcode = src->fop.u16; - MemoryCopy(&fxsave->ErrorOffset, &src->fip.u64, sizeof(U64)); - MemoryCopy(&fxsave->DataOffset, &src->fdp.u64, sizeof(U64)); + fxsave->ErrorOpcode = src->fop; + MemoryCopy(&fxsave->ErrorOffset, &src->fip, sizeof(U64)); + MemoryCopy(&fxsave->DataOffset, &src->fdp, sizeof(U64)); { M128A *float_d = fxsave->FloatRegisters; - REGS_Reg80 *float_s = &src->st0; + U80 *float_s = &src->st0; for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) { MemoryCopy(float_d, float_s, 10); @@ -912,7 +917,7 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) // SSE registers are always available in x64 { M128A *xmm_d = fxsave->XmmRegisters; - REGS_Reg512 *zmm_s = &src->zmm0; + U512 *zmm_s = &src->zmm0; for(U32 n = 0; n < 16; n += 1, xmm_d += 1, zmm_s += 1) { MemoryCopy(xmm_d, zmm_s, sizeof(*xmm_d)); @@ -924,12 +929,13 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) { DWORD avx_length = 0; U8* avx_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); - Assert(avx_length == 16 * sizeof(REGS_Reg128)); - - REGS_Reg512 *zmm_s = &src->zmm0; - for(U32 n = 0; n < 16; n += 1, avx_d += sizeof(REGS_Reg128), zmm_s += 1) + if(avx_length == 16 * sizeof(U128)) { - MemoryCopy(avx_d, &zmm_s->v[16], sizeof(REGS_Reg128)); + U512 *zmm_s = &src->zmm0; + for(U32 n = 0; n < 16; n += 1, avx_d += sizeof(U128), zmm_s += 1) + { + MemoryCopy(avx_d, &zmm_s->u8[16], sizeof(U128)); + } } } @@ -938,32 +944,35 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) { DWORD kmask_length = 0; U64* kmask_d = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); - Assert(kmask_length == 8 * sizeof(*kmask_d)); - - REGS_Reg64 *kmask_s = &src->k0; - for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + if(kmask_length == 8 * sizeof(*kmask_d)) { - MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_d)); + U64 *kmask_s = &src->k0; + for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + { + MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_d)); + } } DWORD avx512h_length = 0; U8* avx512h_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); - Assert(avx512h_length == 16 * sizeof(REGS_Reg256)); - - REGS_Reg512 *zmmh_s = &src->zmm0; - for(U32 n = 0; n < 16; n += 1, avx512h_d += sizeof(REGS_Reg256), zmmh_s += 1) + if(avx512h_length == 16 * sizeof(U256)) { - MemoryCopy(avx512h_d, &zmmh_s->v[32], sizeof(REGS_Reg256)); + U512 *zmmh_s = &src->zmm0; + for(U32 n = 0; n < 16; n += 1, avx512h_d += sizeof(U256), zmmh_s += 1) + { + MemoryCopy(avx512h_d, &zmmh_s->u8[32], sizeof(U256)); + } } DWORD avx512_length = 0; U8* avx512_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); - Assert(avx512_length == 16 * sizeof(REGS_Reg512)); - - REGS_Reg512 *zmm_s = &src->zmm16; - for(U32 n = 0; n < 16; n += 1, avx512_d += sizeof(REGS_Reg512), zmm_s += 1) + if(avx512_length == 16 * sizeof(U512)) { - MemoryCopy(avx512_d, zmm_s, sizeof(REGS_Reg512)); + U512 *zmm_s = &src->zmm16; + for(U32 n = 0; n < 16; n += 1, avx512_d += sizeof(U512), zmm_s += 1) + { + MemoryCopy(avx512_d, zmm_s, sizeof(U512)); + } } } @@ -1069,7 +1078,7 @@ dmn_ctrl_exclusive_access_end(void) } internal U32 -dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) +dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) { Temp scratch = scratch_begin(0, 0); U32 result = 0; @@ -1133,21 +1142,21 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) } BOOL inherit_handles = 0; STARTUPINFOW startup_info = {sizeof(startup_info)}; - if(!os_handle_match(params->stdout_file, os_handle_zero())) + if(!file_match(params->stdout_file, file_zero())) { HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; startup_info.hStdOutput = stdout_handle; startup_info.dwFlags |= STARTF_USESTDHANDLES; inherit_handles = 1; } - if(!os_handle_match(params->stderr_file, os_handle_zero())) + if(!file_match(params->stderr_file, file_zero())) { HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; startup_info.hStdError = stderr_handle; startup_info.dwFlags |= STARTF_USESTDHANDLES; inherit_handles = 1; } - if(!os_handle_match(params->stdin_file, os_handle_zero())) + if(!file_match(params->stdin_file, file_zero())) { HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; startup_info.hStdInput = stdin_handle; @@ -1502,7 +1511,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //- rjf: x64 case Arch_x64: { - REGS_RegBlockX64 regs = {0}; + X64_RegBlock regs = {0}; dmn_w32_thread_read_reg_block(child->arch, child->handle, ®s); { U64 trap_idx = 0; @@ -1511,7 +1520,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) for(U64 n_idx = 0; n_idx < n->count && trap_idx < 4; n_idx += 1, trap_idx += 1) { DMN_Trap *trap = &n->v[n_idx]; - REGS_Reg64 *addr_reg = ®s.dr0; + U64 *addr_reg = ®s.dr0; switch(trap_idx) { default:{}break; @@ -1520,12 +1529,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case 2:{addr_reg = ®s.dr2;}break; case 3:{addr_reg = ®s.dr3;}break; } - addr_reg->u64 = trap->vaddr; - regs.dr7.u64 |= bit9|bit10|bit11; - regs.dr7.u64 |= (1ull << (trap_idx*2)); + addr_reg[0] = trap->vaddr; + regs.dr7 |= bit9|bit10|bit11; + regs.dr7 |= (1ull << (trap_idx*2)); // NOTE(rjf): global-enable regs.dr7.u64 |= (1ull << (trap_idx*2+1)); - regs.dr7.u64 &= ~((U64)(bit17|bit18|bit19|bit20) << (trap_idx*4)); - regs.dr7.u64 &= ~((U64)(bit15|bit16)); + regs.dr7 &= ~((U64)(bit17|bit18|bit19|bit20) << (trap_idx*4)); + regs.dr7 &= ~((U64)(bit15|bit16)); switch(trap->flags) { case DMN_TrapFlag_BreakOnExecute: @@ -1533,14 +1542,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case DMN_TrapFlag_BreakOnWrite: case DMN_TrapFlag_BreakOnWrite|DMN_TrapFlag_BreakOnExecute: { - regs.dr7.u64 |= ((U64)bit17) << (trap_idx*4); + regs.dr7 |= ((U64)bit17) << (trap_idx*4); }break; case DMN_TrapFlag_BreakOnRead|DMN_TrapFlag_BreakOnWrite|DMN_TrapFlag_BreakOnExecute: case DMN_TrapFlag_BreakOnRead|DMN_TrapFlag_BreakOnWrite: case DMN_TrapFlag_BreakOnRead: { - regs.dr7.u64 |= (((U64)bit17) << (trap_idx*4)); - regs.dr7.u64 |= (((U64)bit18) << (trap_idx*4)); + regs.dr7 |= (((U64)bit17) << (trap_idx*4)); + regs.dr7 |= (((U64)bit18) << (trap_idx*4)); }break; } switch(trap->size) @@ -1549,16 +1558,16 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) default:{}break; case 2: { - regs.dr7.u64 |= (((U64)bit19) << (trap_idx*4)); + regs.dr7 |= (((U64)bit19) << (trap_idx*4)); }break; case 4: { - regs.dr7.u64 |= (((U64)bit19) << (trap_idx*4)); - regs.dr7.u64 |= (((U64)bit20) << (trap_idx*4)); + regs.dr7 |= (((U64)bit19) << (trap_idx*4)); + regs.dr7 |= (((U64)bit20) << (trap_idx*4)); }break; case 8: { - regs.dr7.u64 |= (((U64)bit20) << (trap_idx*4)); + regs.dr7 |= (((U64)bit20) << (trap_idx*4)); }break; } } @@ -1663,7 +1672,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) B32 do_threads_resume = 1; DMN_W32_EntityNode *first_ran_thread = 0; DMN_W32_EntityNode *last_ran_thread = 0; - U64 begin_time = os_now_microseconds(); + U64 begin_time = now_time_us(); String8List debug_strings = {0}; DMN_Event *debug_strings_event = 0; for(B32 keep_going = 1; keep_going;) @@ -2178,11 +2187,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) default: { Temp temp = temp_begin(scratch.arena); - U64 regs_block_size = regs_block_size_from_arch(thread->arch); + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); + U64 regs_block_size = arch_info->reg_block_size; void *regs_block = push_array(scratch.arena, U8, regs_block_size); if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block)) { - regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer); + arch_reg_block_write_ip(arch_info, regs_block, instruction_pointer); dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block); } temp_end(temp); @@ -2287,16 +2297,16 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) default:{NotImplemented;}break; case Arch_x64: { - REGS_RegBlockX64 regs = {0}; + X64_RegBlock regs = {0}; dmn_w32_thread_read_reg_block(thread->arch, thread->handle, ®s); - if(regs.dr6.u64 & 0xF) + if(regs.dr6 & 0xF) { e->kind = DMN_EventKind_Breakpoint; if(0){} - else if(regs.dr7.u64 & (1ull<<0) && regs.dr6.u64 & (1ull<<0)) { flagged_trap_idx = 0; e->address = regs.dr0.u64; } - else if(regs.dr7.u64 & (1ull<<2) && regs.dr6.u64 & (1ull<<1)) { flagged_trap_idx = 1; e->address = regs.dr1.u64; } - else if(regs.dr7.u64 & (1ull<<4) && regs.dr6.u64 & (1ull<<2)) { flagged_trap_idx = 2; e->address = regs.dr2.u64; } - else if(regs.dr7.u64 & (1ull<<8) && regs.dr6.u64 & (1ull<<3)) { flagged_trap_idx = 3; e->address = regs.dr3.u64; } + else if(regs.dr7 & (1ull<<0) && regs.dr6 & (1ull<<0)) { flagged_trap_idx = 0; e->address = regs.dr0; } + else if(regs.dr7 & (1ull<<2) && regs.dr6 & (1ull<<1)) { flagged_trap_idx = 1; e->address = regs.dr1; } + else if(regs.dr7 & (1ull<<4) && regs.dr6 & (1ull<<2)) { flagged_trap_idx = 2; e->address = regs.dr2; } + else if(regs.dr7 & (1ull<<8) && regs.dr6 & (1ull<<3)) { flagged_trap_idx = 3; e->address = regs.dr3; } } }break; } @@ -2540,7 +2550,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //////////////////////// //- rjf: exit loop after a little while, so we keep pumping e.g. debug strings // - if(os_now_microseconds() >= begin_time+100000 && debug_strings.total_size != 0) + if(now_time_us() >= begin_time+100000 && debug_strings.total_size != 0) { keep_going = 0; } @@ -2611,7 +2621,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } if(thread->thread.last_name_hash == 0 || - thread->thread.name_gather_time_us+1000000 <= os_now_microseconds()) + thread->thread.name_gather_time_us+1000000 <= now_time_us()) { String8 name = {0}; { @@ -2632,7 +2642,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) e->thread = dmn_w32_handle_from_entity(thread); e->string = push_str8_copy(arena, name); } - thread->thread.name_gather_time_us = os_now_microseconds(); + thread->thread.name_gather_time_us = now_time_us(); thread->thread.last_name_hash = name_hash; } } @@ -2684,9 +2694,9 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //- rjf: x64 case Arch_x64: { - REGS_RegBlockX64 regs = {0}; + X64_RegBlock regs = {0}; dmn_w32_thread_read_reg_block(child->arch, child->handle, ®s); - regs.dr7.u64 = 0; + regs.dr7 = 0; dmn_w32_thread_write_reg_block(child->arch, child->handle, ®s); }break; } @@ -2897,7 +2907,7 @@ dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) } internal void -dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags) +dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, AccessFlags flags) { DMN_AccessScope { @@ -2907,11 +2917,11 @@ dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFla switch(flags) { default:{}break; - case OS_AccessFlag_Execute:{new_flags = PAGE_EXECUTE;}break; - case OS_AccessFlag_Execute|OS_AccessFlag_Read:{new_flags = PAGE_EXECUTE_READ;}break; - case OS_AccessFlag_Execute|OS_AccessFlag_Read|OS_AccessFlag_Write:{new_flags = PAGE_EXECUTE_READWRITE;}break; - case OS_AccessFlag_Read:{new_flags = PAGE_READONLY;}break; - case OS_AccessFlag_Read|OS_AccessFlag_Write:{new_flags = PAGE_READWRITE;}break; + case AccessFlag_Execute:{new_flags = PAGE_EXECUTE;}break; + case AccessFlag_Execute|AccessFlag_Read:{new_flags = PAGE_EXECUTE_READ;}break; + case AccessFlag_Execute|AccessFlag_Read|AccessFlag_Write:{new_flags = PAGE_EXECUTE_READWRITE;}break; + case AccessFlag_Read:{new_flags = PAGE_READONLY;}break; + case AccessFlag_Read|AccessFlag_Write:{new_flags = PAGE_READWRITE;}break; } VirtualProtectEx(process_entity->handle, (void *)vaddr, size, new_flags, &old_flags); } diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index 5de6a860..7945cb0d 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -294,150 +294,142 @@ dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_o //- rjf: data * arch * addr * dbg -> decode artifacts DASM_LineChunkList line_list = {0}; String8List inst_strings = {0}; - switch(params.arch) { - default:{}break; - - //- rjf: x86/x64 decoding - case Arch_x64: - case Arch_x86: + // rjf: disassemble + RDI_SourceFile *last_file = &rdi_nil_element_union.source_file; + RDI_Line *last_line = 0; + for(U64 off = 0; off < data.size;) { - // rjf: disassemble - RDI_SourceFile *last_file = &rdi_nil_element_union.source_file; - RDI_Line *last_line = 0; - for(U64 off = 0; off < data.size;) + // rjf: disassemble one instruction + DASM_Inst inst = dasm_inst_from_code(scratch.arena, params.arch, params.vaddr+off, str8_skip(data, off), params.syntax); + if(inst.size == 0) { - // rjf: disassemble one instruction - DASM_Inst inst = dasm_inst_from_code(scratch.arena, params.arch, params.vaddr+off, str8_skip(data, off), params.syntax); - if(inst.size == 0) + break; + } + + // rjf: push strings derived from voff -> line info + if(params.style_flags & (DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines) && + rdi != &rdi_parsed_nil) + { + U64 voff = (params.vaddr+off) - params.base_vaddr; + U32 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, voff); + RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); + RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); + RDI_ParsedLineTable unit_line_info = {0}; + rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); + U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff); + if(line_info_idx < unit_line_info.count) { - break; - } - - // rjf: push strings derived from voff -> line info - if(params.style_flags & (DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines) && - rdi != &rdi_parsed_nil) - { - U64 voff = (params.vaddr+off) - params.base_vaddr; - U32 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, voff); - RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); - RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx); - RDI_ParsedLineTable unit_line_info = {0}; - rdi_parsed_from_line_table(rdi, line_table, &unit_line_info); - U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff); - if(line_info_idx < unit_line_info.count) + RDI_Line *line = &unit_line_info.lines[line_info_idx]; + RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); + String8 file_normalized_full_path = {0}; + file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size); + if(file != last_file) { - RDI_Line *line = &unit_line_info.lines[line_info_idx]; - RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); - String8 file_normalized_full_path = {0}; - file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size); - if(file != last_file) + if(params.style_flags & DASM_StyleFlag_SourceFilesNames && + file->normal_full_path_string_idx != 0 && file_normalized_full_path.size != 0) { - if(params.style_flags & DASM_StyleFlag_SourceFilesNames && - file->normal_full_path_string_idx != 0 && file_normalized_full_path.size != 0) - { - String8 inst_string = push_str8f(scratch.arena, "> %S", file_normalized_full_path); - DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; - dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, inst_string); - } - if(params.style_flags & DASM_StyleFlag_SourceFilesNames && file->normal_full_path_string_idx == 0) - { - String8 inst_string = str8_lit(">"); - DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; - dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, inst_string); - } - last_file = file; + String8 inst_string = push_str8f(scratch.arena, "> %S", file_normalized_full_path); + DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); + str8_list_push(scratch.arena, &inst_strings, inst_string); } - if(line && line != last_line && file->normal_full_path_string_idx != 0 && - params.style_flags & DASM_StyleFlag_SourceLines && - file_normalized_full_path.size != 0) + if(params.style_flags & DASM_StyleFlag_SourceFilesNames && file->normal_full_path_string_idx == 0) { - FileProperties props = os_properties_from_file_path(file_normalized_full_path); - if(props.modified != 0) + String8 inst_string = str8_lit(">"); + DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); + str8_list_push(scratch.arena, &inst_strings, inst_string); + } + last_file = file; + } + if(line && line != last_line && file->normal_full_path_string_idx != 0 && + params.style_flags & DASM_StyleFlag_SourceLines && + file_normalized_full_path.size != 0) + { + FileProperties props = properties_from_file_path(file_normalized_full_path); + if(props.modified != 0) + { + // TODO(rjf): need redirection path - this may map to a different path on the local machine, + // need frontend to communicate path remapping info to this layer + C_Key key = fs_key_from_path_range(file_normalized_full_path, r1u64(0, max_U64), 0); + TXT_LangKind lang_kind = txt_lang_kind_from_extension(file_normalized_full_path); + U64 endt_us = max_U64; + U128 hash = {0}; + TXT_TextInfo text_info = txt_text_info_from_key_lang(access, key, lang_kind, &hash); + stale = (stale || u128_match(hash, u128_zero())); + if(0 < line->line_num && line->line_num < text_info.lines_count) { - // TODO(rjf): need redirection path - this may map to a different path on the local machine, - // need frontend to communicate path remapping info to this layer - C_Key key = fs_key_from_path_range(file_normalized_full_path, r1u64(0, max_U64), 0); - TXT_LangKind lang_kind = txt_lang_kind_from_extension(file_normalized_full_path); - U64 endt_us = max_U64; - U128 hash = {0}; - TXT_TextInfo text_info = txt_text_info_from_key_lang(access, key, lang_kind, &hash); - stale = (stale || u128_match(hash, u128_zero())); - if(0 < line->line_num && line->line_num < text_info.lines_count) + String8 data = c_data_from_hash(access, hash); + String8 line_text = str8_skip_chop_whitespace(str8_substr(data, text_info.lines_ranges[line->line_num-1])); + if(line_text.size != 0) { - String8 data = c_data_from_hash(access, hash); - String8 line_text = str8_skip_chop_whitespace(str8_substr(data, text_info.lines_ranges[line->line_num-1])); - if(line_text.size != 0) - { - String8 inst_string = push_str8f(scratch.arena, "> %S", line_text); - DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; - dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); - str8_list_push(scratch.arena, &inst_strings, inst_string); - } + String8 inst_string = push_str8f(scratch.arena, "> %S", line_text); + DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst); + str8_list_push(scratch.arena, &inst_strings, inst_string); } } - last_line = line; } + last_line = line; } } - - // rjf: push line - String8 addr_part = {0}; - if(params.style_flags & DASM_StyleFlag_Addresses) - { - addr_part = push_str8f(scratch.arena, "%s0x%016I64x ", rdi != &rdi_parsed_nil ? " " : "", params.vaddr+off); - } - String8 code_bytes_part = {0}; - if(params.style_flags & DASM_StyleFlag_CodeBytes) - { - String8List code_bytes_strings = {0}; - str8_list_push(scratch.arena, &code_bytes_strings, str8_lit("{")); - for(U64 byte_idx = 0; byte_idx < inst.size || byte_idx < 16; byte_idx += 1) - { - if(byte_idx < inst.size) - { - str8_list_pushf(scratch.arena, &code_bytes_strings, "%02x%s ", (U32)data.str[off+byte_idx], byte_idx == inst.size-1 ? "}" : ""); - } - else if(byte_idx < 8) - { - str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); - } - } - str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); - code_bytes_part = str8_list_join(scratch.arena, &code_bytes_strings, 0); - } - String8 symbol_part = {0}; - if(inst.jump_dest_vaddr != 0 && rdi != &rdi_parsed_nil && params.style_flags & DASM_StyleFlag_SymbolNames) - { - RDI_U32 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, inst.jump_dest_vaddr-params.base_vaddr); - if(scope_idx != 0) - { - RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); - RDI_U32 procedure_idx = scope->proc_idx; - RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx); - String8 procedure_name = {0}; - procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); - if(procedure_name.size != 0) - { - symbol_part = push_str8f(scratch.arena, " (%S)", procedure_name); - } - } - } - String8 inst_string = push_str8f(scratch.arena, "%S%S%S%S", addr_part, code_bytes_part, inst.string, symbol_part); - DASM_Line line = {u32_from_u64_saturate(off), 0, inst.jump_dest_vaddr, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; - dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &line); - str8_list_push(scratch.arena, &inst_strings, inst_string); - - // rjf: increment - off += inst.size; } - }break; + + // rjf: push line + String8 addr_part = {0}; + if(params.style_flags & DASM_StyleFlag_Addresses) + { + addr_part = push_str8f(scratch.arena, "%s0x%016I64x ", rdi != &rdi_parsed_nil ? " " : "", params.vaddr+off); + } + String8 code_bytes_part = {0}; + if(params.style_flags & DASM_StyleFlag_CodeBytes) + { + String8List code_bytes_strings = {0}; + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit("{")); + for(U64 byte_idx = 0; byte_idx < inst.size || byte_idx < 16; byte_idx += 1) + { + if(byte_idx < inst.size) + { + str8_list_pushf(scratch.arena, &code_bytes_strings, "%02x%s ", (U32)data.str[off+byte_idx], byte_idx == inst.size-1 ? "}" : ""); + } + else if(byte_idx < 8) + { + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); + } + } + str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(" ")); + code_bytes_part = str8_list_join(scratch.arena, &code_bytes_strings, 0); + } + String8 symbol_part = {0}; + if(inst.jump_dest_vaddr != 0 && rdi != &rdi_parsed_nil && params.style_flags & DASM_StyleFlag_SymbolNames) + { + RDI_U32 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, inst.jump_dest_vaddr-params.base_vaddr); + if(scope_idx != 0) + { + RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); + RDI_U32 procedure_idx = scope->proc_idx; + RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx); + String8 procedure_name = {0}; + procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size); + if(procedure_name.size != 0) + { + symbol_part = push_str8f(scratch.arena, " (%S)", procedure_name); + } + } + } + String8 inst_string = push_str8f(scratch.arena, "%S%S%S%S", addr_part, code_bytes_part, inst.string, symbol_part); + DASM_Line line = {u32_from_u64_saturate(off), 0, inst.jump_dest_vaddr, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &line); + str8_list_push(scratch.arena, &inst_strings, inst_string); + + // rjf: increment + off += inst.size; + } } //- rjf: artifacts -> value bundle diff --git a/src/draw/draw.c b/src/draw/draw.c index b4276f8b..7ba72da1 100644 --- a/src/draw/draw.c +++ b/src/draw/draw.c @@ -226,7 +226,7 @@ dr_begin_frame(FNT_Tag icon_font) } internal void -dr_submit_bucket(OS_Handle os_window, R_Handle r_window, DR_Bucket *bucket) +dr_submit_bucket(OS_Window os_window, R_Handle r_window, DR_Bucket *bucket) { r_window_submit(os_window, r_window, &bucket->passes); } diff --git a/src/draw/draw.h b/src/draw/draw.h index 78b4c080..c4ab7ab2 100644 --- a/src/draw/draw.h +++ b/src/draw/draw.h @@ -134,7 +134,7 @@ internal Vec2F32 dr_dim_from_fstrs(F32 tab_size_px, DR_FStrList *fstrs); // (Frame boundaries & bucket submission) internal void dr_begin_frame(FNT_Tag icon_font); -internal void dr_submit_bucket(OS_Handle os_window, R_Handle r_window, DR_Bucket *bucket); +internal void dr_submit_bucket(OS_Window os_window, R_Handle r_window, DR_Bucket *bucket); //////////////////////////////// //~ rjf: Bucket Construction & Selection API diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 8f0763b9..3bbdc22d 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -1,6 +1,11 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Generated Code + +#include "dwarf/generated/dwarf.meta.c" + internal DW_AttribClass dw_attrib_class_from_attrib_v2(DW_AttribKind k) { diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 12a150f5..804deee1 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -1739,6 +1739,11 @@ typedef enum DW_RegX64Enum DW_RegX64_Last } DW_RegX64Enum; +//////////////////////////////// +//~ rjf: Generated Code + +#include "dwarf/generated/dwarf.meta.h" + //////////////////////////////// // Speced Encodings diff --git a/src/dwarf/dwarf.mdesk b/src/dwarf/dwarf.mdesk new file mode 100644 index 00000000..73a27850 --- /dev/null +++ b/src/dwarf/dwarf.mdesk @@ -0,0 +1,89 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@table(name code byte_size) +DW_RegCodeTableX64: +{ + {rax 0 8} + {rdx 1 8} + {rcx 2 8} + {rbx 3 8} + {rsi 4 8} + {rdi 5 8} + {rbp 6 8} + {rsp 7 8} + {r8 8 8} + {r9 9 8} + {r10 10 8} + {r11 11 8} + {r12 12 8} + {r13 13 8} + {r14 14 8} + {r15 15 8} + {rip 16 8} + {zmm0 17 16} + {zmm1 18 16} + {zmm2 19 16} + {zmm3 20 16} + {zmm4 21 16} + {zmm5 22 16} + {zmm6 23 16} + {zmm7 24 16} + {zmm8 25 16} + {zmm9 26 16} + {zmm10 27 16} + {zmm11 28 16} + {zmm12 29 16} + {zmm13 30 16} + {zmm14 31 16} + {zmm15 32 16} + {zmm16 67 16} + {zmm17 68 16} + {zmm18 69 16} + {zmm19 70 16} + {zmm20 71 16} + {zmm21 72 16} + {zmm22 73 16} + {zmm23 74 16} + {zmm24 75 16} + {zmm25 76 16} + {zmm26 77 16} + {zmm27 78 16} + {zmm28 79 16} + {zmm29 80 16} + {zmm30 81 16} + {zmm31 82 16} + {st0 33 10} + {st1 34 10} + {st2 35 10} + {st3 36 10} + {st4 37 10} + {st5 38 10} + {st6 39 10} + {st7 40 10} + {mm0 41 8} + {mm1 42 8} + {mm2 43 8} + {mm3 44 8} + {mm4 45 8} + {mm5 46 8} + {mm6 47 8} + {mm7 48 8} + {rflags 49 4} + {es 50 2} + {cs 51 2} + {ss 52 2} + {ds 53 2} + {fs 54 2} + {gs 55 2} + {fsbase 58 8} + {gsbase 59 8} + // privileged registers: + // {Tr 62 ???} + // {Ldtr 63 ???} +} + +@enum DW_RegCodeX64: +{ + @expand(DW_RegCodeTableX64 a) `$(a.name) = $(a.code)`, +} diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 5d73e1c2..4f4f0b22 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -15,13 +15,13 @@ internal DW_ExprValueType dw_expr_unsigned_value_type_from_bit_size(U64 bit_size) { switch (bit_size) { - case 8: return DW_ExprValueType_U8; - case 16: return DW_ExprValueType_U16; - case 32: return DW_ExprValueType_U32; - case 64: return DW_ExprValueType_U64; - case 128: return DW_ExprValueType_U128; - case 256: return DW_ExprValueType_U256; - case 512: return DW_ExprValueType_U512; + case 8: return DW_ExprValueType_U8; + case 16: return DW_ExprValueType_U16; + case 32: return DW_ExprValueType_U32; + case 64: return DW_ExprValueType_U64; + case 128: return DW_ExprValueType_U128; + case 256: return DW_ExprValueType_U256; + case 512: return DW_ExprValueType_U512; } AssertAlways(0 && "no suitable unsigned type was found for the specified size"); return DW_ExprValueType_Generic; @@ -31,13 +31,13 @@ internal DW_ExprValueType dw_expr_signed_value_type_from_bit_size(U64 bit_size) { switch (bit_size) { - case 8: return DW_ExprValueType_S8; - case 16: return DW_ExprValueType_S16; - case 32: return DW_ExprValueType_S32; - case 64: return DW_ExprValueType_S64; - case 128: return DW_ExprValueType_S128; - case 256: return DW_ExprValueType_S256; - case 512: return DW_ExprValueType_S512; + case 8: return DW_ExprValueType_S8; + case 16: return DW_ExprValueType_S16; + case 32: return DW_ExprValueType_S32; + case 64: return DW_ExprValueType_S64; + case 128: return DW_ExprValueType_S128; + case 256: return DW_ExprValueType_S256; + case 512: return DW_ExprValueType_S512; } AssertAlways(0 && "no suitable signed type was found for the specified size"); return DW_ExprValueType_Generic; @@ -47,8 +47,8 @@ internal DW_ExprValueType dw_expr_float_type_from_bit_size(U64 bit_size) { switch (bit_size) { - case 4: return DW_ExprValueType_F32; - case 8: return DW_ExprValueType_F64; + case 4: return DW_ExprValueType_F32; + case 8: return DW_ExprValueType_F64; } AssertAlways(0 && "no suitable type was found for the specified size"); return DW_ExprValueType_Generic; @@ -58,25 +58,25 @@ internal U64 dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k) { switch (k) { - default: { InvalidPath; } - case DW_ExprValueType_Generic: return 0; - case DW_ExprValueType_Addr: return addr_size; - case DW_ExprValueType_U8: return 1; - case DW_ExprValueType_U16: return 2; - case DW_ExprValueType_U32: return 4; - case DW_ExprValueType_U64: return 8; - case DW_ExprValueType_U128: return 16; - case DW_ExprValueType_U256: return 32; - case DW_ExprValueType_U512: return 64; - case DW_ExprValueType_S8: return 1; - case DW_ExprValueType_S16: return 2; - case DW_ExprValueType_S32: return 4; - case DW_ExprValueType_S64: return 8; - case DW_ExprValueType_S128: return 16; - case DW_ExprValueType_S256: return 32; - case DW_ExprValueType_S512: return 64; - case DW_ExprValueType_F32: return 4; - case DW_ExprValueType_F64: return 8; + default: { InvalidPath; } + case DW_ExprValueType_Generic: return 0; + case DW_ExprValueType_Addr: return addr_size; + case DW_ExprValueType_U8: return 1; + case DW_ExprValueType_U16: return 2; + case DW_ExprValueType_U32: return 4; + case DW_ExprValueType_U64: return 8; + case DW_ExprValueType_U128: return 16; + case DW_ExprValueType_U256: return 32; + case DW_ExprValueType_U512: return 64; + case DW_ExprValueType_S8: return 1; + case DW_ExprValueType_S16: return 2; + case DW_ExprValueType_S32: return 4; + case DW_ExprValueType_S64: return 8; + case DW_ExprValueType_S128: return 16; + case DW_ExprValueType_S256: return 32; + case DW_ExprValueType_S512: return 64; + case DW_ExprValueType_F32: return 4; + case DW_ExprValueType_F64: return 8; } } @@ -159,55 +159,55 @@ internal DW_ExprValue dw_expr_cast(DW_ExprValue value, DW_ExprValueType type) { DW_ExprValue result = { type }; - + #define CastTable(f, t) \ - switch (value.type) { \ - case DW_ExprValueType_Generic: { MemoryCopy(&result.f, value.generic.str, Min(sizeof(t), value.generic.size)); } break; \ - case DW_ExprValueType_U8: { result.f = (t)value.u8; } break; \ - case DW_ExprValueType_U16: { result.f = (t)value.u16; } break; \ - case DW_ExprValueType_U32: { result.f = (t)value.u32; } break; \ - case DW_ExprValueType_U64: { result.f = (t)value.u64; } break; \ - case DW_ExprValueType_U128: { NotImplemented; } break; \ - case DW_ExprValueType_U256: { NotImplemented; } break; \ - case DW_ExprValueType_U512: { NotImplemented; } break; \ - case DW_ExprValueType_S8: { result.f = (t)value.s8; } break; \ - case DW_ExprValueType_S16: { result.f = (t)value.s16; } break; \ - case DW_ExprValueType_S32: { result.f = (t)value.s32; } break; \ - case DW_ExprValueType_S64: { result.f = (t)value.s64; } break; \ - case DW_ExprValueType_S128: { NotImplemented; } break; \ - case DW_ExprValueType_S256: { NotImplemented; } break; \ - case DW_ExprValueType_S512: { NotImplemented; } break; \ - case DW_ExprValueType_F32: { result.f = (t)value.f32; } break; \ - case DW_ExprValueType_F64: { result.f = (t)value.f64; } break; \ - case DW_ExprValueType_Addr: { result.f = (t)value.addr; } break; \ - case DW_ExprValueType_Implicit: { InvalidPath; } break; \ - case DW_ExprValueType_Bool: { result.f = (t)value.boolean; } break; \ - default: { InvalidPath; } break; \ - } - +switch (value.type) { \ +case DW_ExprValueType_Generic: { MemoryCopy(&result.f, value.generic.str, Min(sizeof(t), value.generic.size)); } break; \ +case DW_ExprValueType_U8: { result.f = (t)value.u8; } break; \ +case DW_ExprValueType_U16: { result.f = (t)value.u16; } break; \ +case DW_ExprValueType_U32: { result.f = (t)value.u32; } break; \ +case DW_ExprValueType_U64: { result.f = (t)value.u64; } break; \ +case DW_ExprValueType_U128: { NotImplemented; } break; \ +case DW_ExprValueType_U256: { NotImplemented; } break; \ +case DW_ExprValueType_U512: { NotImplemented; } break; \ +case DW_ExprValueType_S8: { result.f = (t)value.s8; } break; \ +case DW_ExprValueType_S16: { result.f = (t)value.s16; } break; \ +case DW_ExprValueType_S32: { result.f = (t)value.s32; } break; \ +case DW_ExprValueType_S64: { result.f = (t)value.s64; } break; \ +case DW_ExprValueType_S128: { NotImplemented; } break; \ +case DW_ExprValueType_S256: { NotImplemented; } break; \ +case DW_ExprValueType_S512: { NotImplemented; } break; \ +case DW_ExprValueType_F32: { result.f = (t)value.f32; } break; \ +case DW_ExprValueType_F64: { result.f = (t)value.f64; } break; \ +case DW_ExprValueType_Addr: { result.f = (t)value.addr; } break; \ +case DW_ExprValueType_Implicit: { InvalidPath; } break; \ +case DW_ExprValueType_Bool: { result.f = (t)value.boolean; } break; \ +default: { InvalidPath; } break; \ +} + switch (type) { - case DW_ExprValueType_Generic: {} break; - case DW_ExprValueType_U8: { CastTable(u8, U8); } break; - case DW_ExprValueType_U16: { CastTable(u16, U16); } break; - case DW_ExprValueType_U32: { CastTable(u32, U32); } break; - case DW_ExprValueType_U64: { CastTable(u64, U64); } break; - case DW_ExprValueType_U128: { NotImplemented; } break; - case DW_ExprValueType_U256: { NotImplemented; } break; - case DW_ExprValueType_U512: { NotImplemented; } break; - case DW_ExprValueType_S8: { CastTable(s8, S8); } break; - case DW_ExprValueType_S16: { CastTable(s16, S16); } break; - case DW_ExprValueType_S32: { CastTable(s32, S32); } break; - case DW_ExprValueType_S64: { CastTable(s64, S64); } break; - case DW_ExprValueType_S128: { NotImplemented; } break; - case DW_ExprValueType_S256: { NotImplemented; } break; - case DW_ExprValueType_S512: { NotImplemented; } break; - case DW_ExprValueType_F32: { CastTable(f32, F32); } break; - case DW_ExprValueType_F64: { CastTable(f64, F64); } break; - case DW_ExprValueType_Addr: { CastTable(addr, U64); } break; - case DW_ExprValueType_Implicit: { NotImplemented; } break; - case DW_ExprValueType_Bool: { CastTable(boolean, DW_ExprBool); } break; + case DW_ExprValueType_Generic: {} break; + case DW_ExprValueType_U8: { CastTable(u8, U8); } break; + case DW_ExprValueType_U16: { CastTable(u16, U16); } break; + case DW_ExprValueType_U32: { CastTable(u32, U32); } break; + case DW_ExprValueType_U64: { CastTable(u64, U64); } break; + case DW_ExprValueType_U128: { NotImplemented; } break; + case DW_ExprValueType_U256: { NotImplemented; } break; + case DW_ExprValueType_U512: { NotImplemented; } break; + case DW_ExprValueType_S8: { CastTable(s8, S8); } break; + case DW_ExprValueType_S16: { CastTable(s16, S16); } break; + case DW_ExprValueType_S32: { CastTable(s32, S32); } break; + case DW_ExprValueType_S64: { CastTable(s64, S64); } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + case DW_ExprValueType_F32: { CastTable(f32, F32); } break; + case DW_ExprValueType_F64: { CastTable(f64, F64); } break; + case DW_ExprValueType_Addr: { CastTable(addr, U64); } break; + case DW_ExprValueType_Implicit: { NotImplemented; } break; + case DW_ExprValueType_Bool: { CastTable(boolean, DW_ExprBool); } break; } - + #undef CastTable return result; } @@ -217,38 +217,38 @@ dw_expr_add(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 + common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 + common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 + common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 + common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 + common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 + common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 + common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 + common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 + common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr + common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 + common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 + common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 + common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 + common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 + common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 + common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 + common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 + common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 + common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr + common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } return result; } @@ -258,38 +258,38 @@ dw_expr_minus(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 - common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 - common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 - common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 - common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 - common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 - common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 - common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 - common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 - common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr - common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 - common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 - common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 - common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 - common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 - common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 - common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 - common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 - common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 - common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr - common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } return result; } @@ -299,38 +299,38 @@ dw_expr_mul(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 * common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 * common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 * common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 * common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 * common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 * common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 * common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 * common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 * common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr * common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 * common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 * common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 * common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 * common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 * common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 * common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 * common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 * common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 * common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr * common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } return result; } @@ -340,38 +340,38 @@ dw_expr_div(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 / common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 / common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 / common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 / common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 / common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 / common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 / common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 / common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 / common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr / common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 / common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 / common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 / common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 / common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 / common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 / common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 / common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 / common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 / common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr / common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } return result; } @@ -381,38 +381,38 @@ dw_expr_mod(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 % common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 % common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 % common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 % common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 % common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 % common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 % common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr % common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 % common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 % common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 % common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 % common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 % common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 % common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 % common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr % common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } return result; } @@ -422,40 +422,40 @@ dw_expr_eq(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 == common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 == common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 == common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 == common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 == common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 == common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 == common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 == common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 == common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr == common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 == common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 == common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 == common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 == common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 == common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 == common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 == common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 == common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 == common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr == common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -464,40 +464,40 @@ dw_expr_ge(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >= common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >= common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >= common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >= common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >= common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >= common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >= common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 >= common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 >= common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >= common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >= common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >= common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >= common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >= common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >= common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >= common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >= common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 >= common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 >= common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >= common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -506,40 +506,40 @@ dw_expr_gt(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 > common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 > common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 > common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 > common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 > common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 > common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 > common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 > common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 > common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr > common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 > common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 > common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 > common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 > common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 > common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 > common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 > common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 > common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 > common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr > common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -548,40 +548,40 @@ dw_expr_le(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 <= common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 <= common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 <= common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 <= common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 <= common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 <= common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 <= common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 <= common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 <= common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr <= common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 <= common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 <= common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 <= common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 <= common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 <= common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 <= common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 <= common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 <= common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 <= common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr <= common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -590,40 +590,40 @@ dw_expr_lt(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 < common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 < common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 < common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 < common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 < common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 < common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 < common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 < common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 < common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr < common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 < common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 < common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 < common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 < common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 < common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 < common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 < common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 < common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 < common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr < common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -632,40 +632,40 @@ dw_expr_ne(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 != common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 != common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 != common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 != common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 != common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 != common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 != common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 != common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 != common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr != common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 != common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 != common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 != common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 != common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 != common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 != common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 != common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 != common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 != common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr != common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -674,40 +674,40 @@ dw_expr_xor(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 ^ common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 ^ common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 ^ common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 ^ common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 ^ common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 ^ common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 ^ common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr ^ common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 ^ common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 ^ common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 ^ common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 ^ common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 ^ common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 ^ common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 ^ common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr ^ common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -716,40 +716,40 @@ dw_expr_and(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 & common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 & common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 & common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 & common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 & common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 & common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 & common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr & common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 & common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 & common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 & common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 & common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 & common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 & common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 & common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr & common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -758,40 +758,40 @@ dw_expr_or(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 | common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 | common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 | common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 | common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 | common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 | common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 | common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr | common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 | common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 | common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 | common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 | common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 | common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 | common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 | common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr | common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -800,40 +800,40 @@ dw_expr_shl(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 << common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 << common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 << common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 << common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 << common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 << common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 << common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr << common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 << common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 << common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 << common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 << common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 << common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 << common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 << common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr << common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -842,39 +842,39 @@ dw_expr_shr(DW_ExprValue lhs, DW_ExprValue rhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >> common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >> common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >> common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >> common_rhs.u64; } break; - - case DW_ExprValueType_U128: { NotImplemented; } break; - case DW_ExprValueType_U256: { NotImplemented; } break; - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { InvalidPath; } break; - case DW_ExprValueType_S8: { InvalidPath; } break; - case DW_ExprValueType_S16: { InvalidPath; } break; - case DW_ExprValueType_S32: { InvalidPath; } break; - case DW_ExprValueType_S64: { InvalidPath; } break; - case DW_ExprValueType_S128: { InvalidPath; } break; - case DW_ExprValueType_S256: { InvalidPath; } break; - case DW_ExprValueType_S512: { InvalidPath; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >> common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >> common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >> common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >> common_rhs.u64; } break; + + case DW_ExprValueType_U128: { NotImplemented; } break; + case DW_ExprValueType_U256: { NotImplemented; } break; + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { InvalidPath; } break; + case DW_ExprValueType_S8: { InvalidPath; } break; + case DW_ExprValueType_S16: { InvalidPath; } break; + case DW_ExprValueType_S32: { InvalidPath; } break; + case DW_ExprValueType_S64: { InvalidPath; } break; + case DW_ExprValueType_S128: { InvalidPath; } break; + case DW_ExprValueType_S256: { InvalidPath; } break; + case DW_ExprValueType_S512: { InvalidPath; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -885,47 +885,47 @@ dw_expr_shra(DW_ExprValue lhs, DW_ExprValue rhs) DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, lhs.type) * 8); lhs = dw_expr_cast(lhs, new_type); } - + if (DW_ExprValueType_IsUnsigned(rhs.type)) { DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, rhs.type) * 8); rhs = dw_expr_cast(rhs, new_type); } - + DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - + switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { InvalidPath; } break; - case DW_ExprValueType_U16: { InvalidPath; } break; - case DW_ExprValueType_U32: { InvalidPath; } break; - case DW_ExprValueType_U64: { InvalidPath; } break; - case DW_ExprValueType_U128: { InvalidPath; } break; - case DW_ExprValueType_U256: { InvalidPath; } break; - case DW_ExprValueType_U512: { InvalidPath; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >> common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >> common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >> common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { InvalidPath; } break; + case DW_ExprValueType_U16: { InvalidPath; } break; + case DW_ExprValueType_U32: { InvalidPath; } break; + case DW_ExprValueType_U64: { InvalidPath; } break; + case DW_ExprValueType_U128: { InvalidPath; } break; + case DW_ExprValueType_U256: { InvalidPath; } break; + case DW_ExprValueType_U512: { InvalidPath; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >> common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >> common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >> common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; } - + return result; } @@ -933,34 +933,34 @@ internal DW_ExprValue dw_expr_abs(DW_ExprValue value) { DW_ExprValue result = value; - + switch (value.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: {}; break; - case DW_ExprValueType_U16: {}; break; - case DW_ExprValueType_U32: {}; break; - case DW_ExprValueType_U64: {}; break; - case DW_ExprValueType_U128: {}; break; - case DW_ExprValueType_U256: {}; break; - case DW_ExprValueType_U512: {}; break; - - case DW_ExprValueType_S8: { result.s8 = abs_s64(result.s8); } break; - case DW_ExprValueType_S16: { result.s16 = abs_s64(result.s16); } break; - case DW_ExprValueType_S32: { result.s32 = abs_s64(result.s32); } break; - case DW_ExprValueType_S64: { result.s64 = abs_s64(result.s64); } break; - case DW_ExprValueType_S128: { NotImplemented; } break; - case DW_ExprValueType_S256: { NotImplemented; } break; - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = abs_f32(result.f32); } break; - case DW_ExprValueType_F64: { result.f64 = abs_f64(result.f64); } break; - - case DW_ExprValueType_Addr: {} break; - case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: {}; break; + case DW_ExprValueType_U16: {}; break; + case DW_ExprValueType_U32: {}; break; + case DW_ExprValueType_U64: {}; break; + case DW_ExprValueType_U128: {}; break; + case DW_ExprValueType_U256: {}; break; + case DW_ExprValueType_U512: {}; break; + + case DW_ExprValueType_S8: { result.s8 = abs_s64(result.s8); } break; + case DW_ExprValueType_S16: { result.s16 = abs_s64(result.s16); } break; + case DW_ExprValueType_S32: { result.s32 = abs_s64(result.s32); } break; + case DW_ExprValueType_S64: { result.s64 = abs_s64(result.s64); } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = abs_f32(result.f32); } break; + case DW_ExprValueType_F64: { result.f64 = abs_f64(result.f64); } break; + + case DW_ExprValueType_Addr: {} break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; } - + return result; } @@ -968,34 +968,34 @@ internal DW_ExprValue dw_expr_neg(DW_ExprValue value) { DW_ExprValue result = value; - + switch (value.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = -result.u8; }; break; - case DW_ExprValueType_U16: { result.u16 = -result.u16; }; break; - case DW_ExprValueType_U32: { result.u32 = -result.u32; }; break; - case DW_ExprValueType_U64: { result.u64 = -result.u64; }; break; - case DW_ExprValueType_U128: { NotImplemented; }; break; - case DW_ExprValueType_U256: { NotImplemented; }; break; - case DW_ExprValueType_U512: { NotImplemented; }; break; - - case DW_ExprValueType_S8: { result.s8 = -result.s8; } break; - case DW_ExprValueType_S16: { result.s16 = -result.s16; } break; - case DW_ExprValueType_S32: { result.s32 = -result.s32; } break; - case DW_ExprValueType_S64: { result.s64 = -result.s64; } break; - case DW_ExprValueType_S128: { NotImplemented; } break; - case DW_ExprValueType_S256: { NotImplemented; } break; - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = -result.f32; } break; - case DW_ExprValueType_F64: { result.f64 = -result.f64; } break; - - case DW_ExprValueType_Addr: { result.addr = -result.addr; } break; - case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = -result.u8; }; break; + case DW_ExprValueType_U16: { result.u16 = -result.u16; }; break; + case DW_ExprValueType_U32: { result.u32 = -result.u32; }; break; + case DW_ExprValueType_U64: { result.u64 = -result.u64; }; break; + case DW_ExprValueType_U128: { NotImplemented; }; break; + case DW_ExprValueType_U256: { NotImplemented; }; break; + case DW_ExprValueType_U512: { NotImplemented; }; break; + + case DW_ExprValueType_S8: { result.s8 = -result.s8; } break; + case DW_ExprValueType_S16: { result.s16 = -result.s16; } break; + case DW_ExprValueType_S32: { result.s32 = -result.s32; } break; + case DW_ExprValueType_S64: { result.s64 = -result.s64; } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = -result.f32; } break; + case DW_ExprValueType_F64: { result.f64 = -result.f64; } break; + + case DW_ExprValueType_Addr: { result.addr = -result.addr; } break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; } - + return result; } @@ -1003,34 +1003,34 @@ internal DW_ExprValue dw_expr_not(DW_ExprValue value) { DW_ExprValue result = value; - + switch (value.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = !result.u8; }; break; - case DW_ExprValueType_U16: { result.u16 = !result.u16; }; break; - case DW_ExprValueType_U32: { result.u32 = !result.u32; }; break; - case DW_ExprValueType_U64: { result.u64 = !result.u64; }; break; - case DW_ExprValueType_U128: { NotImplemented; }; break; - case DW_ExprValueType_U256: { NotImplemented; }; break; - case DW_ExprValueType_U512: { NotImplemented; }; break; - - case DW_ExprValueType_S8: { result.s8 = !result.s8; } break; - case DW_ExprValueType_S16: { result.s16 = !result.s16; } break; - case DW_ExprValueType_S32: { result.s32 = !result.s32; } break; - case DW_ExprValueType_S64: { result.s64 = !result.s64; } break; - case DW_ExprValueType_S128: { NotImplemented; } break; - case DW_ExprValueType_S256: { NotImplemented; } break; - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = !result.f32; } break; - case DW_ExprValueType_F64: { result.f64 = !result.f64; } break; - - case DW_ExprValueType_Addr: { result.addr = !result.addr; } break; - case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = !result.u8; }; break; + case DW_ExprValueType_U16: { result.u16 = !result.u16; }; break; + case DW_ExprValueType_U32: { result.u32 = !result.u32; }; break; + case DW_ExprValueType_U64: { result.u64 = !result.u64; }; break; + case DW_ExprValueType_U128: { NotImplemented; }; break; + case DW_ExprValueType_U256: { NotImplemented; }; break; + case DW_ExprValueType_U512: { NotImplemented; }; break; + + case DW_ExprValueType_S8: { result.s8 = !result.s8; } break; + case DW_ExprValueType_S16: { result.s16 = !result.s16; } break; + case DW_ExprValueType_S32: { result.s32 = !result.s32; } break; + case DW_ExprValueType_S64: { result.s64 = !result.s64; } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = !result.f32; } break; + case DW_ExprValueType_F64: { result.f64 = !result.f64; } break; + + case DW_ExprValueType_Addr: { result.addr = !result.addr; } break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; } - + return result; } @@ -1039,23 +1039,23 @@ dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v) { String8 s = {0}; switch (v.type) { - case DW_ExprValueType_Generic: { } break; - case DW_ExprValueType_U8: { s = str8_struct(&v.u8); } break; - case DW_ExprValueType_U16: { s = str8_struct(&v.u16); } break; - case DW_ExprValueType_U32: { s = str8_struct(&v.u32); } break; - case DW_ExprValueType_U64: { s = str8_struct(&v.u64); } break; - case DW_ExprValueType_U128: { s = str8_struct(&v.u128); } break; - case DW_ExprValueType_U256: { s = str8_struct(&v.u256); } break; - case DW_ExprValueType_U512: { s = str8_struct(&v.u512); } break; - case DW_ExprValueType_S8: { s = str8_struct(&v.s8); } break; - case DW_ExprValueType_S16: { s = str8_struct(&v.s16); } break; - case DW_ExprValueType_S32: { s = str8_struct(&v.s32); } break; - case DW_ExprValueType_S64: { s = str8_struct(&v.s64); } break; - case DW_ExprValueType_F32: { s = str8_struct(&v.f32); } break; - case DW_ExprValueType_F64: { s = str8_struct(&v.f64); } break; - case DW_ExprValueType_Addr: { s = str8((U8 *)&v.addr, addr_size); } break; - case DW_ExprValueType_Implicit: { s = v.implicit; } break; - default: { NotImplemented; } break; + case DW_ExprValueType_Generic: { } break; + case DW_ExprValueType_U8: { s = str8_struct(&v.u8); } break; + case DW_ExprValueType_U16: { s = str8_struct(&v.u16); } break; + case DW_ExprValueType_U32: { s = str8_struct(&v.u32); } break; + case DW_ExprValueType_U64: { s = str8_struct(&v.u64); } break; + case DW_ExprValueType_U128: { s = str8_struct(&v.u128); } break; + case DW_ExprValueType_U256: { s = str8_struct(&v.u256); } break; + case DW_ExprValueType_U512: { s = str8_struct(&v.u512); } break; + case DW_ExprValueType_S8: { s = str8_struct(&v.s8); } break; + case DW_ExprValueType_S16: { s = str8_struct(&v.s16); } break; + case DW_ExprValueType_S32: { s = str8_struct(&v.s32); } break; + case DW_ExprValueType_S64: { s = str8_struct(&v.s64); } break; + case DW_ExprValueType_F32: { s = str8_struct(&v.f32); } break; + case DW_ExprValueType_F64: { s = str8_struct(&v.f64); } break; + case DW_ExprValueType_Addr: { s = str8((U8 *)&v.addr, addr_size); } break; + case DW_ExprValueType_Implicit: { s = v.implicit; } break; + default: { NotImplemented; } break; } return str8_copy(arena, s); } @@ -1075,12 +1075,12 @@ dw_expr_stack_push_unsigned(Arena *arena, DW_ExprStack *stack, void *value, U64 { DW_ExprValueNode *n = 0; switch (value_size) { - case 0: {} break; - case 1: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = *(U8 *)value }); } break; - case 2: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = *(U16 *)value }); } break; - case 4: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = *(U32 *)value }); } break; - case 8: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = *(U64 *)value }); } break; - default: { NotImplemented; } break; + case 0: {} break; + case 1: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = *(U8 *)value }); } break; + case 2: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = *(U16 *)value }); } break; + case 4: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = *(U32 *)value }); } break; + case 8: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = *(U64 *)value }); } break; + default: { NotImplemented; } break; } return n; } @@ -1128,25 +1128,17 @@ dw_expr_inst_from_delta(DW_ExprInst *inst, S16 delta) } internal DW_ExprEvalResult -dw_eval_expr(Arena *arena, - Arch arch, - DW_Format format, - U64 frame_base, - U64 cfa, - U64 tls, - U64 exec_op_limit, - DW_Expr expr, - MachineOp_RegRead *reg_read, void *reg_read_ud, - MachineOp_MemRead *mem_read, void *mem_read_ud, - DW_ExprValue *value_out) +dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls, U64 exec_op_limit, DW_Expr expr, void *reg_block, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out) { Temp scratch = scratch_begin(&arena, 1); - + + ARCH_Info *arch_info = arch_info_from_arch(arch); + DW_ExprEvalResult result = DW_ExprEvalResult_Fail; DW_PieceList pieces = {0}; DW_ExprStack *stack = push_array(scratch.arena, DW_ExprStack, 1); U64 exec_op_count = 0; - + for EachNode(inst, DW_ExprInst, expr.first) { again:; @@ -1156,350 +1148,372 @@ dw_eval_expr(Arena *arena, result = DW_ExprEvalResult_ExecOpLimitReached; goto exit; } - + U64 pop_count = dw_pop_count_from_expr_op(inst->opcode); if (pop_count > stack->count) { Assert(0 && "not enough values on the stack to evaluate the instruction"); goto exit; } - + switch (inst->opcode) { - case DW_ExprOp_Nop: {} break; - - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->opcode - DW_ExprOp_Lit0 }); - } break; - - case DW_ExprOp_Const1U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->operands[0].u8 }); } break; - case DW_ExprOp_Const2U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = inst->operands[0].u16 }); } break; - case DW_ExprOp_Const4U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = inst->operands[0].u32 }); } break; - case DW_ExprOp_Const8U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; - case DW_ExprOp_Const1S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S8, .s8 = inst->operands[0].s8 }); } break; - case DW_ExprOp_Const2S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S16, .s16 = inst->operands[0].s16 }); } break; - case DW_ExprOp_Const4S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S32, .s32 = inst->operands[0].s32 }); } break; - case DW_ExprOp_Const8S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; - case DW_ExprOp_ConstU: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; - case DW_ExprOp_ConstS: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; - case DW_ExprOp_Addr: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = inst->operands[0].u64 }); } break; - - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { - DW_Reg reg_id = inst->opcode - DW_ExprOp_Reg0; - U64 reg_size = dw_reg_size_from_code(arch, reg_id); - U8 *reg_value = push_array(scratch.arena, U8, reg_size); - MachineOpResult reg_read_result = reg_read(reg_id, reg_value, reg_size, reg_read_ud); - if (reg_read_result != MachineOpResult_Ok) { goto exit; } - dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); - } break; - - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { - DW_Reg reg_id = inst->opcode - DW_ExprOp_BReg0; - U64 reg_size = dw_reg_size_from_code(arch, reg_id); - AssertAlways(reg_size <= byte_size_from_arch(arch)); - - U64 reg_value; - MachineOpResult reg_read_result = reg_read(reg_id, ®_value, reg_size, reg_read_ud); - if (reg_read_result != MachineOpResult_Ok) { goto exit; } + case DW_ExprOp_Nop: {} break; - U64 addr = (U64)((S64)reg_value + inst->operands[0].s64); - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); - } break; - - case DW_ExprOp_RegX: { - U64 reg_size = dw_reg_size_from_code(arch, inst->operands[0].u64); - U8 *reg_value = push_array(scratch.arena, U8, reg_size); - MachineOpResult reg_read_result = reg_read(inst->operands[0].u64, reg_value, reg_size, reg_read_ud); - if (reg_read_result != MachineOpResult_Ok) { goto exit; } - dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); - } break; - - case DW_ExprOp_BRegX: { - DW_Reg reg_id = (DW_Reg)inst->operands[0].u64; - U64 reg_size = dw_reg_size_from_code(arch, reg_id); - AssertAlways(reg_size <= byte_size_from_arch(arch)); - - U64 reg_value; - MachineOpResult reg_read_result = reg_read(reg_id, ®_value, reg_size, reg_read_ud); - if (reg_read_result != MachineOpResult_Ok) { goto exit; } + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->opcode - DW_ExprOp_Lit0 }); + } break; - U64 addr = (U64)((S64)reg_value + inst->operands[1].s64); - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); - } break; - - case DW_ExprOp_FBReg: { - U64 addr = frame_base + inst->operands[0].s64; - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); - } break; - - case DW_ExprOp_ImplicitValue: { - if (inst->operands[0].block.size <= sizeof(U512)) { - dw_expr_stack_push_unsigned(scratch.arena, stack, inst->operands[0].block.str, inst->operands[0].block.size); - } else { - NotImplemented; - } - } break; - - case DW_ExprOp_Piece: { - B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); - if (is_undefined) { - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 * 8 }); - } else { - DW_ExprValue top = dw_expr_stack_pop(stack); - - String8 value; - - // piece is a memory reference - if (top.type == DW_ExprValueType_Addr) { - U64 value_size = inst->operands[0].u64; - U8 *value_buffer = push_array(arena, U8, value_size); - MachineOpResult read_result = mem_read(top.addr, value_buffer, value_size, mem_read_ud); - if (read_result != MachineOpResult_Ok) { Assert(0 && "failed to read piece memory referece"); goto exit; } + case DW_ExprOp_Const1U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->operands[0].u8 }); } break; + case DW_ExprOp_Const2U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = inst->operands[0].u16 }); } break; + case DW_ExprOp_Const4U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = inst->operands[0].u32 }); } break; + case DW_ExprOp_Const8U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; + case DW_ExprOp_Const1S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S8, .s8 = inst->operands[0].s8 }); } break; + case DW_ExprOp_Const2S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S16, .s16 = inst->operands[0].s16 }); } break; + case DW_ExprOp_Const4S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S32, .s32 = inst->operands[0].s32 }); } break; + case DW_ExprOp_Const8S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; + case DW_ExprOp_ConstU: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; + case DW_ExprOp_ConstS: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; + case DW_ExprOp_Addr: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = inst->operands[0].u64 }); } break; + + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + { + DW_Reg reg_dw_id = inst->opcode - DW_ExprOp_Reg0; + U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + U8 *reg_value = push_array(scratch.arena, U8, reg_size); + if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), reg_value)) + { + goto exit; } - // piece is a value - else { - value = dw_string_from_expr_value(arena, arch, top); + dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); + }break; + + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + { + DW_Reg reg_dw_id = inst->opcode - DW_ExprOp_BReg0; + U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + AssertAlways(reg_size <= byte_size_from_arch(arch)); + + U64 reg_value = 0; + if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), ®_value)) + { + goto exit; } - - if (inst->operands[0].u64 > value.size) { Assert(0 && "out of bounds size in the piece opcode"); goto exit; } - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64 * 8, .value = value.str }); - } - } break; - - case DW_ExprOp_BitPiece: { - B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); - if (is_undefined) { - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 }); - } else { - String8 value; - if (dw_expr_stack_peek(stack).type == DW_ExprValueType_Addr) { - NotImplemented; + + U64 addr = (U64)((S64)reg_value + inst->operands[0].s64); + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + }break; + + case DW_ExprOp_RegX: + { + DW_Reg reg_dw_id = inst->operands[0].u64; + U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); + U8 *reg_value = push_array(scratch.arena, U8, reg_size); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), reg_value)) + { + goto exit; + } + dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); + }break; + + case DW_ExprOp_BRegX: + { + DW_Reg reg_dw_id = (DW_Reg)inst->operands[0].u64; + U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); + AssertAlways(reg_size <= byte_size_from_arch(arch)); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + + U64 reg_value = 0; + if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), ®_value)) + { + goto exit; + } + + U64 addr = (U64)((S64)reg_value + inst->operands[1].s64); + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + }break; + + case DW_ExprOp_FBReg: { + U64 addr = frame_base + inst->operands[0].s64; + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + } break; + + case DW_ExprOp_ImplicitValue: { + if (inst->operands[0].block.size <= sizeof(U512)) { + dw_expr_stack_push_unsigned(scratch.arena, stack, inst->operands[0].block.str, inst->operands[0].block.size); } else { - value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); + NotImplemented; } - if (inst->operands[0].u64 > value.size * 8) { Assert(0 && "out of bounds size in piece opcode"); goto exit; } - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64, .value = value.str }); + } break; + + case DW_ExprOp_Piece: { + B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); + if (is_undefined) { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 * 8 }); + } else { + DW_ExprValue top = dw_expr_stack_pop(stack); + + String8 value; + + // piece is a memory reference + if (top.type == DW_ExprValueType_Addr) { + U64 value_size = inst->operands[0].u64; + U8 *value_buffer = push_array(arena, U8, value_size); + MachineOpResult read_result = mem_read(top.addr, value_buffer, value_size, mem_read_ud); + if (read_result != MachineOpResult_Ok) { Assert(0 && "failed to read piece memory referece"); goto exit; } + } + // piece is a value + else { + value = dw_string_from_expr_value(arena, arch, top); + } + + if (inst->operands[0].u64 > value.size) { Assert(0 && "out of bounds size in the piece opcode"); goto exit; } + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64 * 8, .value = value.str }); + } + } break; + + case DW_ExprOp_BitPiece: { + B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); + if (is_undefined) { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 }); + } else { + String8 value; + if (dw_expr_stack_peek(stack).type == DW_ExprValueType_Addr) { + NotImplemented; + } else { + value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); + } + if (inst->operands[0].u64 > value.size * 8) { Assert(0 && "out of bounds size in piece opcode"); goto exit; } + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64, .value = value.str }); + } + } break; + + case DW_ExprOp_Pick: { + DW_ExprValueNode *src = dw_expr_stack_pick(stack, inst->operands[0].u8); + if (src) { + dw_expr_stack_push(scratch.arena, stack, src->v); + } else { + Assert(0 && "out of bounds stack index"); + goto exit; + } + } break; + + case DW_ExprOp_Over: { + DW_ExprValueNode *src = dw_expr_stack_pick(stack, 1); + if (src) { + dw_expr_stack_push(scratch.arena, stack, src->v); + } else { + Assert(0 && "out of bounds stack index"); + goto exit; + } + } break; + + case DW_ExprOp_PlusUConst: { + DW_ExprValue lhs = dw_expr_stack_pop(stack); + DW_ExprValue rhs = { .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }; + DW_ExprValue sum = dw_expr_add(lhs, rhs); + dw_expr_stack_push(scratch.arena, stack, sum); + } break; + + case DW_ExprOp_Skip: { + DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); + + if (i == 0) { + Assert(0 && "seeking to an invalid offset"); + goto exit; + } + + inst = i; + goto again; } - } break; - - case DW_ExprOp_Pick: { - DW_ExprValueNode *src = dw_expr_stack_pick(stack, inst->operands[0].u8); - if (src) { - dw_expr_stack_push(scratch.arena, stack, src->v); - } else { - Assert(0 && "out of bounds stack index"); - goto exit; + + case DW_ExprOp_Bra: { + DW_ExprValue cond = dw_expr_stack_pop(stack); + + if (cond.type != DW_ExprValueType_S16) { + Assert(0 && "unexpected value"); + goto exit; + } + + DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); + + if (i == 0) { + Assert(0 && "seeking to an invalid offset"); + goto exit; + } + + inst = i; + goto again; } - } break; - - case DW_ExprOp_Over: { - DW_ExprValueNode *src = dw_expr_stack_pick(stack, 1); - if (src) { - dw_expr_stack_push(scratch.arena, stack, src->v); - } else { - Assert(0 && "out of bounds stack index"); - goto exit; - } - } break; - - case DW_ExprOp_PlusUConst: { - DW_ExprValue lhs = dw_expr_stack_pop(stack); - DW_ExprValue rhs = { .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }; - DW_ExprValue sum = dw_expr_add(lhs, rhs); - dw_expr_stack_push(scratch.arena, stack, sum); - } break; - - case DW_ExprOp_Skip: { - DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); - - if (i == 0) { - Assert(0 && "seeking to an invalid offset"); - goto exit; - } - - inst = i; - goto again; - } - - case DW_ExprOp_Bra: { - DW_ExprValue cond = dw_expr_stack_pop(stack); - - if (cond.type != DW_ExprValueType_S16) { - Assert(0 && "unexpected value"); - goto exit; - } - - DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); - - if (i == 0) { - Assert(0 && "seeking to an invalid offset"); - goto exit; - } - - inst = i; - goto again; - } - - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: { - NotImplemented; - } break; - - case DW_ExprOp_GNU_Convert: - case DW_ExprOp_Convert: { - if (inst->operands[0].u64 == 0) { - DW_ExprValue value = dw_expr_stack_pop(stack); - DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); - dw_expr_stack_push(scratch.arena, stack, new_value); - } else { + + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: { NotImplemented; - } - } break; - - case DW_ExprOp_Reinterpret: { - if (inst->operands[0].u64 == 0) { - DW_ExprValue value = dw_expr_stack_pop(stack); - DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); - dw_expr_stack_push(scratch.arena, stack, new_value); - } else { - NotImplemented; - } - } break; - - case DW_ExprOp_GNU_ParameterRef: { NotImplemented; } break; - case DW_ExprOp_GNU_DerefType: { NotImplemented; } break; - case DW_ExprOp_DerefType: { NotImplemented; } break; - case DW_ExprOp_ConstType: { NotImplemented; } break; - case DW_ExprOp_GNU_ConstType: { NotImplemented; } break; - case DW_ExprOp_RegvalType: { NotImplemented; } break; - - case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: { - DW_Expr entry_value_expr = dw_expr_from_data(scratch.arena, format, byte_size_from_arch(arch), inst->operands[0].block); - DW_ExprValue entry_value; - result = dw_eval_expr(scratch.arena, arch, format, frame_base, cfa, tls, exec_op_limit, entry_value_expr, reg_read, reg_read_ud, mem_read, mem_read_ud, &entry_value); - if (result != DW_ExprEvalResult_Ok) { goto exit; } - dw_expr_stack_push(scratch.arena, stack, entry_value); - } break; - - case DW_ExprOp_Addrx: { NotImplemented; } break; - - case DW_ExprOp_CallFrameCfa: { - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = cfa }); - } break; - - case DW_ExprOp_PushObjectAddress: { NotImplemented; } break; - - case DW_ExprOp_Plus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_add(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Minus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_minus(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Div: { dw_expr_stack_push(scratch.arena, stack, dw_expr_div(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Mul: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mul(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Mod: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mod(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - - case DW_ExprOp_Eq: { dw_expr_stack_push(scratch.arena, stack, dw_expr_eq(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Ge: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ge(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Gt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_gt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Le: { dw_expr_stack_push(scratch.arena, stack, dw_expr_le(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Lt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_lt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Ne: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ne(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - - case DW_ExprOp_Xor: { dw_expr_stack_push(scratch.arena, stack, dw_expr_xor(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_And: { dw_expr_stack_push(scratch.arena, stack, dw_expr_and(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Or: { dw_expr_stack_push(scratch.arena, stack, dw_expr_or(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Shl: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shl(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Shr: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shr(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Shra: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shra(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - - case DW_ExprOp_Abs: { dw_expr_stack_push(scratch.arena, stack, dw_expr_abs(dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Neg: { dw_expr_stack_push(scratch.arena, stack, dw_expr_neg(dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Not: { dw_expr_stack_push(scratch.arena, stack, dw_expr_not(dw_expr_stack_pop(stack))); } break; - - case DW_ExprOp_Dup: { - dw_expr_stack_push(scratch.arena, stack, dw_expr_stack_peek(stack)); - } break; - - case DW_ExprOp_Rot: { - DW_ExprValue first = dw_expr_stack_pop(stack); - DW_ExprValue second = dw_expr_stack_pop(stack); - DW_ExprValue third = dw_expr_stack_pop(stack); - dw_expr_stack_push(scratch.arena, stack, first); // -> third - dw_expr_stack_push(scratch.arena, stack, third); // -> second - dw_expr_stack_push(scratch.arena, stack, second); // -> first - } break; - - case DW_ExprOp_Swap: { - DW_ExprValue first = dw_expr_stack_pop(stack); - DW_ExprValue second = dw_expr_stack_pop(stack); - dw_expr_stack_push(scratch.arena, stack, first); // -> second - dw_expr_stack_push(scratch.arena, stack, second); // -> first - } break; - - case DW_ExprOp_Drop: { - dw_expr_stack_pop(stack); - } break; - - case DW_ExprOp_Deref: { - DW_ExprValue value = dw_expr_stack_pop(stack); - - // expression must be of an integral type - if (!DW_ExprValueType_IsInt(value.type)) { goto exit; } - - // treat value as an address - DW_ExprValue addr = dw_expr_cast(value, DW_ExprValueType_Addr); - - // read pointer size from the address - U64 addr_size = byte_size_from_arch(arch); - U8 *generic_value = push_array(scratch.arena, U8, addr_size); - MachineOpResult read_result = mem_read(addr.addr, generic_value, addr_size, mem_read_ud); - if (read_result != MachineOpResult_Ok) { goto exit; } - - // push generic data - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Generic, .generic = str8(generic_value, addr_size) }); - } break; - - case DW_ExprOp_StackValue: { - stack->top->v.type = dw_expr_unsigned_value_type_from_bit_size(bit_size_from_arch(arch)); - } break; - - case DW_ExprOp_GNU_PushTlsAddress: - case DW_ExprOp_FormTlsAddress: { - DW_ExprValue tls_off = dw_expr_stack_pop(stack); - DW_ExprValue tls_base = { .type = DW_ExprValueType_Addr, .addr = tls }; - DW_ExprValue tls_addr = dw_expr_add(tls_base, tls_off); - dw_expr_stack_push(scratch.arena, stack, tls_addr); - } break; + } break; + + case DW_ExprOp_GNU_Convert: + case DW_ExprOp_Convert: { + if (inst->operands[0].u64 == 0) { + DW_ExprValue value = dw_expr_stack_pop(stack); + DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); + dw_expr_stack_push(scratch.arena, stack, new_value); + } else { + NotImplemented; + } + } break; + + case DW_ExprOp_Reinterpret: { + if (inst->operands[0].u64 == 0) { + DW_ExprValue value = dw_expr_stack_pop(stack); + DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); + dw_expr_stack_push(scratch.arena, stack, new_value); + } else { + NotImplemented; + } + } break; + + case DW_ExprOp_GNU_ParameterRef: { NotImplemented; } break; + case DW_ExprOp_GNU_DerefType: { NotImplemented; } break; + case DW_ExprOp_DerefType: { NotImplemented; } break; + case DW_ExprOp_ConstType: { NotImplemented; } break; + case DW_ExprOp_GNU_ConstType: { NotImplemented; } break; + case DW_ExprOp_RegvalType: { NotImplemented; } break; + + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: + { + DW_Expr entry_value_expr = dw_expr_from_data(scratch.arena, format, byte_size_from_arch(arch), inst->operands[0].block); + DW_ExprValue entry_value; + result = dw_eval_expr(scratch.arena, arch, format, frame_base, cfa, tls, exec_op_limit, entry_value_expr, reg_block, mem_read, mem_read_ud, &entry_value); + if (result != DW_ExprEvalResult_Ok) { goto exit; } + dw_expr_stack_push(scratch.arena, stack, entry_value); + } break; + + case DW_ExprOp_Addrx: { NotImplemented; } break; + + case DW_ExprOp_CallFrameCfa: { + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = cfa }); + } break; + + case DW_ExprOp_PushObjectAddress: { NotImplemented; } break; + + case DW_ExprOp_Plus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_add(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Minus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_minus(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Div: { dw_expr_stack_push(scratch.arena, stack, dw_expr_div(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Mul: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mul(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Mod: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mod(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Eq: { dw_expr_stack_push(scratch.arena, stack, dw_expr_eq(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Ge: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ge(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Gt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_gt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Le: { dw_expr_stack_push(scratch.arena, stack, dw_expr_le(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Lt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_lt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Ne: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ne(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Xor: { dw_expr_stack_push(scratch.arena, stack, dw_expr_xor(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_And: { dw_expr_stack_push(scratch.arena, stack, dw_expr_and(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Or: { dw_expr_stack_push(scratch.arena, stack, dw_expr_or(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shl: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shl(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shr: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shr(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shra: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shra(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Abs: { dw_expr_stack_push(scratch.arena, stack, dw_expr_abs(dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Neg: { dw_expr_stack_push(scratch.arena, stack, dw_expr_neg(dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Not: { dw_expr_stack_push(scratch.arena, stack, dw_expr_not(dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Dup: { + dw_expr_stack_push(scratch.arena, stack, dw_expr_stack_peek(stack)); + } break; + + case DW_ExprOp_Rot: { + DW_ExprValue first = dw_expr_stack_pop(stack); + DW_ExprValue second = dw_expr_stack_pop(stack); + DW_ExprValue third = dw_expr_stack_pop(stack); + dw_expr_stack_push(scratch.arena, stack, first); // -> third + dw_expr_stack_push(scratch.arena, stack, third); // -> second + dw_expr_stack_push(scratch.arena, stack, second); // -> first + } break; + + case DW_ExprOp_Swap: { + DW_ExprValue first = dw_expr_stack_pop(stack); + DW_ExprValue second = dw_expr_stack_pop(stack); + dw_expr_stack_push(scratch.arena, stack, first); // -> second + dw_expr_stack_push(scratch.arena, stack, second); // -> first + } break; + + case DW_ExprOp_Drop: { + dw_expr_stack_pop(stack); + } break; + + case DW_ExprOp_Deref: { + DW_ExprValue value = dw_expr_stack_pop(stack); + + // expression must be of an integral type + if (!DW_ExprValueType_IsInt(value.type)) { goto exit; } + + // treat value as an address + DW_ExprValue addr = dw_expr_cast(value, DW_ExprValueType_Addr); + + // read pointer size from the address + U64 addr_size = byte_size_from_arch(arch); + U8 *generic_value = push_array(scratch.arena, U8, addr_size); + MachineOpResult read_result = mem_read(addr.addr, generic_value, addr_size, mem_read_ud); + if (read_result != MachineOpResult_Ok) { goto exit; } + + // push generic data + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Generic, .generic = str8(generic_value, addr_size) }); + } break; + + case DW_ExprOp_StackValue: { + stack->top->v.type = dw_expr_unsigned_value_type_from_bit_size(bit_size_from_arch(arch)); + } break; + + case DW_ExprOp_GNU_PushTlsAddress: + case DW_ExprOp_FormTlsAddress: { + DW_ExprValue tls_off = dw_expr_stack_pop(stack); + DW_ExprValue tls_base = { .type = DW_ExprValueType_Addr, .addr = tls }; + DW_ExprValue tls_addr = dw_expr_add(tls_base, tls_off); + dw_expr_stack_push(scratch.arena, stack, tls_addr); + } break; } } - + // composite value if (pieces.count > 0) { #if 0 @@ -1507,7 +1521,7 @@ dw_eval_expr(Arena *arena, for EachNode (n, DW_PieceNode, pieces.first) { total_bit_size += n->v.bit_size; } - + U64 value_size = CeilIntegerDiv(total_bit_size, 8); U8 *value = push_array(arena, U8, value_size); Rng1U64 *ranges = push_array(arena, Rng1U64, pieces.count); @@ -1533,7 +1547,7 @@ dw_eval_expr(Arena *arena, } piece_cursor += n->v.bit_size; } - + value_out->type = DW_ExprValueType_Generic; value_out->ranges = (Rng1U64Array){ .count = pieces.count, .v = ranges }; value_out->offsets = offsets; @@ -1549,7 +1563,7 @@ dw_eval_expr(Arena *arena, if (value_out->type == DW_ExprValueType_Generic) { value_out->generic = push_str8_copy(arena, value_out->generic); } - + Rng1U64 *range = push_array(arena, Rng1U64, 1); *range = r1u64(0, max_U64); value_out->ranges = (Rng1U64Array){ .count = 1, .v = range }; @@ -1558,9 +1572,9 @@ dw_eval_expr(Arena *arena, MemoryZeroStruct(value_out); } } - + result = DW_ExprEvalResult_Ok; -exit:; + exit:; scratch_end(scratch); return result; } @@ -1569,90 +1583,90 @@ internal String8 dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count) { Temp scratch = scratch_begin(&arena, 1); - + String8List *srl = push_array(scratch.arena, String8List, 1); str8_serial_begin(scratch.arena, srl); - + HashTable *label_map = hash_table_init(scratch.arena, 128); - + struct Fixup { U64 offset; String8 label; struct Fixup *next; }; struct Fixup *first_fixup = 0, *last_fixup = 0; - + for EachIndex(i, encs_count) { DW_ExprEnc *e = &encs[i]; - + switch (e->type) { - case DW_ExprEncType_Null: {} break; - case DW_ExprEncType_Op: { - str8_serial_push_struct(scratch.arena, srl, &e->op); - } break; - case DW_ExprEncType_U8: { - str8_serial_push_struct(scratch.arena, srl, &e->u8); - } break; - case DW_ExprEncType_U16: { - str8_serial_push_struct(scratch.arena, srl, &e->u16); - } break; - case DW_ExprEncType_U32: { - str8_serial_push_struct(scratch.arena, srl, &e->u32); - } break; - case DW_ExprEncType_U64: { - str8_serial_push_struct(scratch.arena, srl, &e->u64); - } break; - case DW_ExprEncType_S8: { - str8_serial_push_struct(scratch.arena, srl, &e->s8); - } break; - case DW_ExprEncType_S16: { - str8_serial_push_struct(scratch.arena, srl, &e->s16); - } break; - case DW_ExprEncType_S32: { - str8_serial_push_struct(scratch.arena, srl, &e->s32); - } break; - case DW_ExprEncType_S64: { - str8_serial_push_struct(scratch.arena, srl, &e->s64); - } break; - case DW_ExprEncType_ULEB128: { - str8_serial_push_string(scratch.arena, srl, dw_write_uleb128(scratch.arena, e->u64)); - } break; - case DW_ExprEncType_SLEB128: { - str8_serial_push_string(scratch.arena, srl, dw_write_sleb128(scratch.arena, e->s64)); - } break; - case DW_ExprEncType_Addr: { - U64 addr_size = byte_size_from_arch(arch); - Assert(addr_size <= sizeof(e->addr)); - str8_serial_push_string(scratch.arena, srl, str8((U8 *)&e->addr, addr_size)); - } break; - case DW_ExprEncType_Block: { - Assert(e->block.size <= max_U8); - str8_serial_push_u8(scratch.arena, srl, (U8)e->block.size); - str8_serial_push_string(scratch.arena, srl, e->block); - } break; - case DW_ExprEncType_DwarfUInt: { - switch (format) { - case DW_Format_Null: {} break; - case DW_Format_32Bit: { str8_serial_push_u32(scratch.arena, srl, e->u32); } break; - case DW_Format_64Bit: { str8_serial_push_u64(scratch.arena, srl, e->u64); } break; + case DW_ExprEncType_Null: {} break; + case DW_ExprEncType_Op: { + str8_serial_push_struct(scratch.arena, srl, &e->op); + } break; + case DW_ExprEncType_U8: { + str8_serial_push_struct(scratch.arena, srl, &e->u8); + } break; + case DW_ExprEncType_U16: { + str8_serial_push_struct(scratch.arena, srl, &e->u16); + } break; + case DW_ExprEncType_U32: { + str8_serial_push_struct(scratch.arena, srl, &e->u32); + } break; + case DW_ExprEncType_U64: { + str8_serial_push_struct(scratch.arena, srl, &e->u64); + } break; + case DW_ExprEncType_S8: { + str8_serial_push_struct(scratch.arena, srl, &e->s8); + } break; + case DW_ExprEncType_S16: { + str8_serial_push_struct(scratch.arena, srl, &e->s16); + } break; + case DW_ExprEncType_S32: { + str8_serial_push_struct(scratch.arena, srl, &e->s32); + } break; + case DW_ExprEncType_S64: { + str8_serial_push_struct(scratch.arena, srl, &e->s64); + } break; + case DW_ExprEncType_ULEB128: { + str8_serial_push_string(scratch.arena, srl, dw_write_uleb128(scratch.arena, e->u64)); + } break; + case DW_ExprEncType_SLEB128: { + str8_serial_push_string(scratch.arena, srl, dw_write_sleb128(scratch.arena, e->s64)); + } break; + case DW_ExprEncType_Addr: { + U64 addr_size = byte_size_from_arch(arch); + Assert(addr_size <= sizeof(e->addr)); + str8_serial_push_string(scratch.arena, srl, str8((U8 *)&e->addr, addr_size)); + } break; + case DW_ExprEncType_Block: { + Assert(e->block.size <= max_U8); + str8_serial_push_u8(scratch.arena, srl, (U8)e->block.size); + str8_serial_push_string(scratch.arena, srl, e->block); + } break; + case DW_ExprEncType_DwarfUInt: { + switch (format) { + case DW_Format_Null: {} break; + case DW_Format_32Bit: { str8_serial_push_u32(scratch.arena, srl, e->u32); } break; + case DW_Format_64Bit: { str8_serial_push_u64(scratch.arena, srl, e->u64); } break; + default: { InvalidPath; } break; + } + } break; + case DW_ExprEncType_Label: { + struct Fixup *fixup = push_array(scratch.arena, struct Fixup, 1); + fixup->offset = srl->total_size; + fixup->label = e->label; + SLLQueuePush(first_fixup, last_fixup, fixup); + + S16 delta_placeholder = 0; + str8_serial_push_struct(scratch.arena, srl, &delta_placeholder); + } break; + case DW_ExprEncType_DeclLabel: { + hash_table_push_string_u64(scratch.arena, label_map, e->label, srl->total_size); + } break; default: { InvalidPath; } break; - } - } break; - case DW_ExprEncType_Label: { - struct Fixup *fixup = push_array(scratch.arena, struct Fixup, 1); - fixup->offset = srl->total_size; - fixup->label = e->label; - SLLQueuePush(first_fixup, last_fixup, fixup); - - S16 delta_placeholder = 0; - str8_serial_push_struct(scratch.arena, srl, &delta_placeholder); - } break; - case DW_ExprEncType_DeclLabel: { - hash_table_push_string_u64(scratch.arena, label_map, e->label, srl->total_size); - } break; - default: { InvalidPath; } break; } } - + // finalize expression String8 expr = str8_serial_end(arena, srl); - + // apply fixups for EachNode(fixup, struct Fixup, first_fixup) { U64 label_offset; @@ -1660,14 +1674,14 @@ dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 Assert(0 && "undefined label"); continue; } - + S64 delta = (S64)label_offset - (S64)fixup->offset; AssertAlways(min_S16 <= delta && delta <= max_S16); - + S16 *delta_ptr = (S16 *)(expr.str + fixup->offset); *delta_ptr = delta; } - + scratch_end(scratch); return expr; } diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index 4cc52f8b..7e8e74d7 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -227,7 +227,7 @@ internal DW_ExprValueNode * dw_expr_stack_pick(DW_ExprStack *stack, U64 idx); internal String8 dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v); // evaluator -internal DW_ExprEvalResult dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls_base, U64 op_limit, DW_Expr expr, MachineOp_RegRead *reg_read, void *reg_read_ud, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out); +internal DW_ExprEvalResult dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls_base, U64 op_limit, DW_Expr expr, void *reg_block, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out); // encoder internal String8 dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count); diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index e090fb48..e6bfc490 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -13,3 +13,6 @@ #include "dwarf/dwarf_parse_2.c" #include "dwarf/eh_frame.c" #include "dwarf/eh_dump.c" +#if defined(X64_H) +# include "dwarf/x64/dwarf_x64.c" +#endif diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index 325c6034..fa551f62 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -16,5 +16,8 @@ #include "dwarf/dwarf_parse_2.h" #include "dwarf/eh_frame.h" #include "dwarf/eh_dump.h" +#if defined(X64_H) +# include "dwarf/x64/dwarf_x64.h" +#endif #endif // DWARF_INC_H diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 7a45cbde..39ee4e1f 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -56,6 +56,43 @@ dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out) return bytes_read; } +//////////////////////////////// +//~ rjf: Unit Range Set Parsing (Top-Level .debug_info, .debug_aranges) + +internal Rng1U64Array +dw2_unit_ranges_from_data(Arena *arena, String8 data) +{ + Temp scratch = scratch_begin(&arena, 1); + Rng1U64List unit_range_list = {0}; + for(U64 off = 0; off < data.size;) + { + U64 start_off = off; + + // rjf: read next unit size + U64 unit_size = 0; + U64 unit_size_size = dw2_read_initial_length(data, off, &unit_size, 0); + + // rjf: push + if(unit_size > 0) + { + rng1u64_list_push(scratch.arena, &unit_range_list, r1u64(off, off + unit_size_size + unit_size)); + } + + // rjf: advance + off += unit_size_size; + off += unit_size; + + // rjf: break if no movement + if(off == start_off) + { + break; + } + } + Rng1U64Array result = rng1u64_array_from_list(arena, &unit_range_list); + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Unit Header Parsing diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index 533698cc..3687c3f4 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -240,6 +240,11 @@ global read_only DW2_Attrib dw2_attrib_nil = {0}; internal U64 dw2_read_initial_length(String8 data, U64 off, U64 *out, DW_Format *fmt_out); internal U64 dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out); +//////////////////////////////// +//~ rjf: Unit Range Set Parsing (Top-Level .debug_info, .debug_aranges) + +internal Rng1U64Array dw2_unit_ranges_from_data(Arena *arena, String8 data); + //////////////////////////////// //~ rjf: Unit Header Parsing diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index d0130373..9bb808bb 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -36,7 +36,7 @@ dw_cfi_unwind_init(Arena *arena, void *decode_ptr_ud) { Temp scratch = scratch_begin(&arena, 1); - + DW_CFI_Unwind *uw = push_array(arena, DW_CFI_Unwind, 1); uw->insts = dw_parse_cfa_inst_list(arena, fde->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud); uw->cie = cie; @@ -44,7 +44,7 @@ dw_cfi_unwind_init(Arena *arena, uw->pc = fde->pc_range.min; uw->arch = arch; uw->reg_count = dw_reg_count_from_arch(arch); - + // setup initial register rules DW_CFA_InstList initial_insts = dw_parse_cfa_inst_list(scratch.arena, cie->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud); uw->row = dw_make_cfi_row(arena, uw->reg_count); @@ -52,12 +52,12 @@ dw_cfi_unwind_init(Arena *arena, if (!dw_cfi_next_row(arena, uw)) { AssertAlways(0 && "unable to interpret initial row instructions"); } - + // make first row from initial rules uw->initial_row = uw->row; uw->row = dw_copy_cfi_row(arena, uw->initial_row, uw->reg_count); uw->curr_inst = uw->insts.first; - + scratch_end(scratch); return uw; } @@ -67,7 +67,7 @@ dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) { B32 is_row_valid = 0; DW_CFA_InstNode *row_inst = uw->curr_inst; - + // skip leading nops while (uw->curr_inst) { if (uw->curr_inst->v.opcode != DW_CFA_Nop) { @@ -75,10 +75,10 @@ dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) } uw->curr_inst = uw->curr_inst->next; } - + while (uw->curr_inst) { DW_CFA_Inst *inst = &uw->curr_inst->v; - + // validate register operands DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst->opcode); U64 operand_count = dw_operand_count_from_cfa_opcode(inst->opcode); @@ -89,113 +89,113 @@ dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) } } } - + switch (inst->opcode) { - // Row Creation Instructions - case DW_CFA_SetLoc: { - uw->pc = inst->operands[0].u64; - } break; - case DW_CFA_AdvanceLoc: - case DW_CFA_AdvanceLoc1: - case DW_CFA_AdvanceLoc2: - case DW_CFA_AdvanceLoc4: { - uw->pc += inst->operands[0].u64; - } break; - - // CFA Definition Instructions - case DW_CFA_DefCfa: - case DW_CFA_DefCfaSf: { - U64 reg = inst->operands[0].u64; - S64 off = inst->operands[1].s64; - uw->row->cfa.rule = DW_CFA_Rule_RegOff; - uw->row->cfa.reg = reg; - uw->row->cfa.off = off; - } break; - case DW_CFA_DefCfaRegister: { - // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset - if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; } - U64 reg = inst->operands[0].u64; - uw->row->cfa.reg = reg; - } break; - case DW_CFA_DefCfaOffset: - case DW_CFA_DefCfaOffsetSf: { - // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset - if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; } - uw->row->cfa.off = inst->operands[0].s64; - } break; - case DW_CFA_DefCfaExpr: { - uw->row->cfa.rule = DW_CFA_Rule_Expression; - uw->row->cfa.expr = inst->operands[0].block; - } break; - - // Register Rule Instructions - case DW_CFA_Undefined: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_Undefined; - } break; - case DW_CFA_SameValue: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_SameValue; - } break; - case DW_CFA_Offset: - case DW_CFA_OffsetExt: - case DW_CFA_OffsetExtSf: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_Offset; - uw->row->regs[reg].n = inst->operands[1].s64; - } break; - case DW_CFA_ValOffset: - case DW_CFA_ValOffsetSf: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValOffset; - uw->row->regs[reg].n = inst->operands[1].s64; - } break; - case DW_CFA_Register: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_Register; - uw->row->regs[reg].n = inst->operands[1].s64; - } break; - case DW_CFA_Expr: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_Expression; - uw->row->regs[reg].expr = inst->operands[1].block; - } break; - case DW_CFA_ValExpr: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValExpression; - uw->row->regs[reg].expr = inst->operands[1].block; - } break; - case DW_CFA_Restore: - case DW_CFA_RestoreExt: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg] = uw->initial_row->regs[reg]; - } break; + // Row Creation Instructions + case DW_CFA_SetLoc: { + uw->pc = inst->operands[0].u64; + } break; + case DW_CFA_AdvanceLoc: + case DW_CFA_AdvanceLoc1: + case DW_CFA_AdvanceLoc2: + case DW_CFA_AdvanceLoc4: { + uw->pc += inst->operands[0].u64; + } break; - // Row State Instructions - case DW_CFA_RememberState: { - DW_CFI_Row *new_row = dw_copy_cfi_row(arena, uw->row, uw->reg_count); - SLLStackPush(uw->row, new_row); - } break; - case DW_CFA_RestoreState: { - if (uw->row == 0) { goto exit; } // TODO: report error: unbalanced number of pushes and pops - DW_CFI_Row *free_row = uw->row; - SLLStackPop(uw->row); - SLLStackPush(uw->free_rows, free_row); - } break; - - case DW_CFA_Nop: {} break; - - default: { NotImplemented; } break; // TODO: report error: unknown CFA opcode + // CFA Definition Instructions + case DW_CFA_DefCfa: + case DW_CFA_DefCfaSf: { + U64 reg = inst->operands[0].u64; + S64 off = inst->operands[1].s64; + uw->row->cfa.rule = DW_CFA_Rule_RegOff; + uw->row->cfa.reg = reg; + uw->row->cfa.off = off; + } break; + case DW_CFA_DefCfaRegister: { + // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset + if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; } + U64 reg = inst->operands[0].u64; + uw->row->cfa.reg = reg; + } break; + case DW_CFA_DefCfaOffset: + case DW_CFA_DefCfaOffsetSf: { + // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset + if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; } + uw->row->cfa.off = inst->operands[0].s64; + } break; + case DW_CFA_DefCfaExpr: { + uw->row->cfa.rule = DW_CFA_Rule_Expression; + uw->row->cfa.expr = inst->operands[0].block; + } break; + + // Register Rule Instructions + case DW_CFA_Undefined: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_Undefined; + } break; + case DW_CFA_SameValue: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_SameValue; + } break; + case DW_CFA_Offset: + case DW_CFA_OffsetExt: + case DW_CFA_OffsetExtSf: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_Offset; + uw->row->regs[reg].n = inst->operands[1].s64; + } break; + case DW_CFA_ValOffset: + case DW_CFA_ValOffsetSf: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValOffset; + uw->row->regs[reg].n = inst->operands[1].s64; + } break; + case DW_CFA_Register: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_Register; + uw->row->regs[reg].n = inst->operands[1].s64; + } break; + case DW_CFA_Expr: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_Expression; + uw->row->regs[reg].expr = inst->operands[1].block; + } break; + case DW_CFA_ValExpr: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValExpression; + uw->row->regs[reg].expr = inst->operands[1].block; + } break; + case DW_CFA_Restore: + case DW_CFA_RestoreExt: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg] = uw->initial_row->regs[reg]; + } break; + + // Row State Instructions + case DW_CFA_RememberState: { + DW_CFI_Row *new_row = dw_copy_cfi_row(arena, uw->row, uw->reg_count); + SLLStackPush(uw->row, new_row); + } break; + case DW_CFA_RestoreState: { + if (uw->row == 0) { goto exit; } // TODO: report error: unbalanced number of pushes and pops + DW_CFI_Row *free_row = uw->row; + SLLStackPop(uw->row); + SLLStackPush(uw->free_rows, free_row); + } break; + + case DW_CFA_Nop: {} break; + + default: { NotImplemented; } break; // TODO: report error: unknown CFA opcode } - + uw->curr_inst = uw->curr_inst->next; if (uw->curr_inst) { if (dw_is_new_row_cfa_opcode(uw->curr_inst->v.opcode)) { break; } } } - + is_row_valid = row_inst != 0; -exit:; + exit:; return is_row_valid; } @@ -203,7 +203,7 @@ internal DW_CFI_Row * dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc) { Temp scratch = scratch_begin(&arena, 1); - + B32 is_row_found = 0; U64 reg_count = dw_reg_count_from_arch(arch); DW_CFI_Unwind *uw = dw_cfi_unwind_init(scratch.arena, arch, cie, fde, decode_ptr_func, decode_ptr_ctx); @@ -217,7 +217,7 @@ dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodeP dw_memcpy_cfi_row(row, uw->row, uw->reg_count); prev_pc = uw->pc; } - + // handle last row if (!is_row_found) { if (contains_1u64(fde->pc_range, pc)) { @@ -225,116 +225,138 @@ dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodeP is_row_found = 1; } } - + // copy out final row DW_CFI_Row *result = 0; if (is_row_found) { result = dw_copy_cfi_row(arena, row, reg_count); } - + scratch_end(scratch); return result; } internal MachineOpResult -dw_compute_cfa(Arch arch, - DW_CFI_Row *row, - MachineOp_MemRead *mem_read_func, void *mem_read_ud, - MachineOp_RegRead *reg_read_func, void *reg_read_ud, - U64 *cfa_out) +dw_compute_cfa(Arch arch, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud, U64 *cfa_out) { MachineOpResult unwind_status = MachineOpResult_Fail; - - switch (row->cfa.rule) { - case DW_CFA_Rule_Null: break; - case DW_CFA_Rule_RegOff: { - // TODO: report error (invalid register read) - U64 cfa_reg_value = 0; - U64 reg_size = dw_reg_size_from_code(arch, row->cfa.reg); - AssertAlways(reg_size <= sizeof(cfa_reg_value)); - unwind_status = reg_read_func(row->cfa.reg, &cfa_reg_value, reg_size, reg_read_ud); - if (unwind_status != MachineOpResult_Ok) { break; } - *cfa_out = cfa_reg_value + row->cfa.off; - } break; - case DW_CFA_Rule_Expression: { - // TODO: evaluate expression - NotImplemented; - } break; + ARCH_Info *arch_info = arch_info_from_arch(arch); + switch(row->cfa.rule) + { + case DW_CFA_Rule_Null:{}break; + case DW_CFA_Rule_RegOff: + { + // TODO: report error (invalid register read) + U64 cfa_reg_value = 0; + U64 reg_size = dw_reg_size_from_code(arch, row->cfa.reg); + AssertAlways(reg_size <= sizeof(cfa_reg_value)); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, row->cfa.reg); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + if(!arch_reg_block_read_range(arch_info, reg_block, reg_rng, &cfa_reg_value)) + { + unwind_status = MachineOpResult_Fail; + break; + } + *cfa_out = cfa_reg_value + row->cfa.off; + }break; + case DW_CFA_Rule_Expression: + { + // TODO: evaluate expression + NotImplemented; + }break; } - return unwind_status; } internal MachineOpResult -dw_cfi_apply_register_rules(Arch arch, - U64 cfa, - DW_CFI_Row *row, - MachineOp_MemRead *mem_read_func, void *mem_read_ud, - MachineOp_RegRead *reg_read_func, void *reg_read_ud, - MachineOp_RegWrite *reg_write_func, void *reg_write_ud) +dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud) { Temp scratch = scratch_begin(0,0); MachineOpResult unwind_status = MachineOpResult_Ok; - + + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 max_reg_size = dw_reg_max_size_from_arch(arch); void *reg_buffer = push_array(scratch.arena, U8, max_reg_size); - + U64 reg_count = dw_reg_count_from_arch(arch); - for EachIndex(reg_idx, reg_count) { + for EachIndex(reg_idx, reg_count) + { DW_CFI_Register *reg = &row->regs[reg_idx]; - switch (reg->rule) { - case DW_CFI_RegisterRule_Undefined: {} break; - case DW_CFI_RegisterRule_SameValue: {} break; - case DW_CFI_RegisterRule_Offset: { - // read register value from memory - U64 addr = cfa + reg->n; - U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - unwind_status = mem_read_func(addr, reg_buffer, reg_size, mem_read_ud); - if (unwind_status != MachineOpResult_Ok) { goto exit; } - - // write register value to the thread context - unwind_status = reg_write_func(reg_idx, reg_buffer, reg_size, reg_write_ud); - if (unwind_status != MachineOpResult_Ok) { goto exit; } - } break; - case DW_CFI_RegisterRule_ValOffset: { - // compute register value - U64 reg_value = cfa + reg->n; - - // write register value to the thread context - U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - unwind_status = reg_write_func(reg_idx, ®_value, reg_size, reg_write_ud); - if (unwind_status != MachineOpResult_Ok) { goto exit; } - } break; - case DW_CFI_RegisterRule_Register: { - // read register value from another register - U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - unwind_status = reg_read_func(reg->n, reg_buffer, reg_size, reg_read_ud); - if (unwind_status != MachineOpResult_Ok) { goto exit; } - - // write register value to the thread context - unwind_status = reg_write_func(reg_idx, reg_buffer, reg_size, reg_write_ud); - if (unwind_status != MachineOpResult_Ok) { goto exit; } - } break; - case DW_CFI_RegisterRule_Expression: { - // TODO: evaluate expression - NotImplemented; - } break; - case DW_CFI_RegisterRule_ValExpression: { - // TODO: evaluate expression - NotImplemented; - } break; - case DW_CFI_RegisterRule_Architectural: { - NotImplemented; - } break; - default: { InvalidPath; } break; + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_idx); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + switch(reg->rule) + { + default:{}break; + case DW_CFI_RegisterRule_Undefined: {} break; + case DW_CFI_RegisterRule_SameValue: {} break; + case DW_CFI_RegisterRule_Offset: + { + // read register value from memory + U64 addr = cfa + reg->n; + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); + unwind_status = mem_read_func(addr, reg_buffer, reg_size, mem_read_ud); + if (unwind_status != MachineOpResult_Ok) { goto exit; } + + // write register value to the thread context + if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, reg_buffer)) + { + unwind_status = MachineOpResult_Fail; + goto exit; + } + }break; + case DW_CFI_RegisterRule_ValOffset: + { + // compute register value + U64 reg_value = cfa + reg->n; + + // write register value to the thread context + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); + if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, ®_value)) + { + unwind_status = MachineOpResult_Fail; + goto exit; + } + }break; + case DW_CFI_RegisterRule_Register: + { + // read register value from another register + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); + if(!arch_reg_block_read_range(arch_info, reg_block, reg_rng, reg_buffer)) + { + unwind_status = MachineOpResult_Fail; + goto exit; + } + + // write register value to the thread context + if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, reg_buffer)) + { + unwind_status = MachineOpResult_Fail; + goto exit; + } + if (unwind_status != MachineOpResult_Ok) { goto exit; } + }break; + case DW_CFI_RegisterRule_Expression: + { + // TODO: evaluate expression + NotImplemented; + }break; + case DW_CFI_RegisterRule_ValExpression: + { + // TODO: evaluate expression + NotImplemented; + }break; + case DW_CFI_RegisterRule_Architectural: + { + NotImplemented; + }break; } } - + // update stack pointer - U64 sp = dw_sp_from_arch(arch); - reg_write_func(sp, &cfa, sizeof(cfa), reg_write_ud); - -exit:; + arch_reg_block_write_sp(arch_info, reg_block, cfa); + + exit:; scratch_end(scratch); return unwind_status; } diff --git a/src/dwarf/dwarf_unwind.h b/src/dwarf/dwarf_unwind.h index 510057e2..63e5ba3f 100644 --- a/src/dwarf/dwarf_unwind.h +++ b/src/dwarf/dwarf_unwind.h @@ -74,7 +74,8 @@ internal DW_CFI_Unwind * dw_cfi_unwind_init(Arena *arena, Arch arch, DW_CIE *cie internal B32 dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw); internal DW_CFI_Row * dw_cfi_row_from_pc(Arena *arena, Arch arch, struct DW_CIE *cie, struct DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc); -internal MachineOpResult dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, MachineOp_MemRead *mem_read_func, void *mem_read_ud, MachineOp_RegRead *reg_read_func, void *reg_read_ud, MachineOp_RegWrite *reg_write_func, void *reg_write_ud); +internal MachineOpResult dw_compute_cfa(Arch arch, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud, U64 *cfa_out); +internal MachineOpResult dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud); #endif // DWARF_UNWIND_H diff --git a/src/regs/rdi/regs_rdi.c b/src/dwarf/generated/dwarf.meta.c similarity index 68% rename from src/regs/rdi/regs_rdi.c rename to src/dwarf/generated/dwarf.meta.c index 911725c1..0378fad9 100644 --- a/src/regs/rdi/regs_rdi.c +++ b/src/dwarf/generated/dwarf.meta.c @@ -1,4 +1,5 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "regs/rdi/generated/regs_rdi.meta.c" +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + diff --git a/src/dwarf/generated/dwarf.meta.h b/src/dwarf/generated/dwarf.meta.h new file mode 100644 index 00000000..39719f80 --- /dev/null +++ b/src/dwarf/generated/dwarf.meta.h @@ -0,0 +1,87 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DWARF_META_H +#define DWARF_META_H + +typedef enum DW_RegCodeX64 +{ +DW_RegCodeX64_rax = 0, +DW_RegCodeX64_rdx = 1, +DW_RegCodeX64_rcx = 2, +DW_RegCodeX64_rbx = 3, +DW_RegCodeX64_rsi = 4, +DW_RegCodeX64_rdi = 5, +DW_RegCodeX64_rbp = 6, +DW_RegCodeX64_rsp = 7, +DW_RegCodeX64_r8 = 8, +DW_RegCodeX64_r9 = 9, +DW_RegCodeX64_r10 = 10, +DW_RegCodeX64_r11 = 11, +DW_RegCodeX64_r12 = 12, +DW_RegCodeX64_r13 = 13, +DW_RegCodeX64_r14 = 14, +DW_RegCodeX64_r15 = 15, +DW_RegCodeX64_rip = 16, +DW_RegCodeX64_zmm0 = 17, +DW_RegCodeX64_zmm1 = 18, +DW_RegCodeX64_zmm2 = 19, +DW_RegCodeX64_zmm3 = 20, +DW_RegCodeX64_zmm4 = 21, +DW_RegCodeX64_zmm5 = 22, +DW_RegCodeX64_zmm6 = 23, +DW_RegCodeX64_zmm7 = 24, +DW_RegCodeX64_zmm8 = 25, +DW_RegCodeX64_zmm9 = 26, +DW_RegCodeX64_zmm10 = 27, +DW_RegCodeX64_zmm11 = 28, +DW_RegCodeX64_zmm12 = 29, +DW_RegCodeX64_zmm13 = 30, +DW_RegCodeX64_zmm14 = 31, +DW_RegCodeX64_zmm15 = 32, +DW_RegCodeX64_zmm16 = 67, +DW_RegCodeX64_zmm17 = 68, +DW_RegCodeX64_zmm18 = 69, +DW_RegCodeX64_zmm19 = 70, +DW_RegCodeX64_zmm20 = 71, +DW_RegCodeX64_zmm21 = 72, +DW_RegCodeX64_zmm22 = 73, +DW_RegCodeX64_zmm23 = 74, +DW_RegCodeX64_zmm24 = 75, +DW_RegCodeX64_zmm25 = 76, +DW_RegCodeX64_zmm26 = 77, +DW_RegCodeX64_zmm27 = 78, +DW_RegCodeX64_zmm28 = 79, +DW_RegCodeX64_zmm29 = 80, +DW_RegCodeX64_zmm30 = 81, +DW_RegCodeX64_zmm31 = 82, +DW_RegCodeX64_st0 = 33, +DW_RegCodeX64_st1 = 34, +DW_RegCodeX64_st2 = 35, +DW_RegCodeX64_st3 = 36, +DW_RegCodeX64_st4 = 37, +DW_RegCodeX64_st5 = 38, +DW_RegCodeX64_st6 = 39, +DW_RegCodeX64_st7 = 40, +DW_RegCodeX64_mm0 = 41, +DW_RegCodeX64_mm1 = 42, +DW_RegCodeX64_mm2 = 43, +DW_RegCodeX64_mm3 = 44, +DW_RegCodeX64_mm4 = 45, +DW_RegCodeX64_mm5 = 46, +DW_RegCodeX64_mm6 = 47, +DW_RegCodeX64_mm7 = 48, +DW_RegCodeX64_rflags = 49, +DW_RegCodeX64_es = 50, +DW_RegCodeX64_cs = 51, +DW_RegCodeX64_ss = 52, +DW_RegCodeX64_ds = 53, +DW_RegCodeX64_fs = 54, +DW_RegCodeX64_gs = 55, +DW_RegCodeX64_fsbase = 58, +DW_RegCodeX64_gsbase = 59, +} DW_RegCodeX64; + +#endif // DWARF_META_H diff --git a/src/dwarf/x64/dwarf_x64.c b/src/dwarf/x64/dwarf_x64.c new file mode 100644 index 00000000..de6cc0d3 --- /dev/null +++ b/src/dwarf/x64/dwarf_x64.c @@ -0,0 +1,4 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "dwarf/x64/generated/dwarf_x64.meta.c" diff --git a/src/dwarf/x64/dwarf_x64.h b/src/dwarf/x64/dwarf_x64.h new file mode 100644 index 00000000..0887fea2 --- /dev/null +++ b/src/dwarf/x64/dwarf_x64.h @@ -0,0 +1,9 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_X64_H +#define DWARF_X64_H + +#include "dwarf/x64/generated/dwarf_x64.meta.h" + +#endif // DWARF_X64_H diff --git a/src/dwarf/x64/dwarf_x64.mdesk b/src/dwarf/x64/dwarf_x64.mdesk new file mode 100644 index 00000000..c2464c88 --- /dev/null +++ b/src/dwarf/x64/dwarf_x64.mdesk @@ -0,0 +1,7 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@data(U8) dw_reg_code_from_x64_table: +{ + @expand(X64_RegTable a) `$(a.has_dwarf == 'x' -> "DW_RegCodeX64_" .. a.name)$(a.has_dwarf != 'x' -> 0)` +} diff --git a/src/dwarf/x64/generated/dwarf_x64.meta.c b/src/dwarf/x64/generated/dwarf_x64.meta.c new file mode 100644 index 00000000..89cec99a --- /dev/null +++ b/src/dwarf/x64/generated/dwarf_x64.meta.c @@ -0,0 +1,201 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +U8 dw_reg_code_from_x64_table[189] = +{ +0, +DW_RegCodeX64_rax, +DW_RegCodeX64_rcx, +DW_RegCodeX64_rdx, +DW_RegCodeX64_rbx, +DW_RegCodeX64_rsp, +DW_RegCodeX64_rbp, +DW_RegCodeX64_rsi, +DW_RegCodeX64_rdi, +DW_RegCodeX64_r8, +DW_RegCodeX64_r9, +DW_RegCodeX64_r10, +DW_RegCodeX64_r11, +DW_RegCodeX64_r12, +DW_RegCodeX64_r13, +DW_RegCodeX64_r14, +DW_RegCodeX64_r15, +DW_RegCodeX64_fsbase, +DW_RegCodeX64_gsbase, +DW_RegCodeX64_rip, +DW_RegCodeX64_rflags, +0, +0, +0, +0, +0, +0, +0, +0, +DW_RegCodeX64_st0, +DW_RegCodeX64_st1, +DW_RegCodeX64_st2, +DW_RegCodeX64_st3, +DW_RegCodeX64_st4, +DW_RegCodeX64_st5, +DW_RegCodeX64_st6, +DW_RegCodeX64_st7, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +DW_RegCodeX64_ss, +DW_RegCodeX64_cs, +DW_RegCodeX64_ds, +DW_RegCodeX64_es, +DW_RegCodeX64_fs, +DW_RegCodeX64_gs, +DW_RegCodeX64_zmm0, +DW_RegCodeX64_zmm1, +DW_RegCodeX64_zmm2, +DW_RegCodeX64_zmm3, +DW_RegCodeX64_zmm4, +DW_RegCodeX64_zmm5, +DW_RegCodeX64_zmm6, +DW_RegCodeX64_zmm7, +DW_RegCodeX64_zmm8, +DW_RegCodeX64_zmm9, +DW_RegCodeX64_zmm10, +DW_RegCodeX64_zmm11, +DW_RegCodeX64_zmm12, +DW_RegCodeX64_zmm13, +DW_RegCodeX64_zmm14, +DW_RegCodeX64_zmm15, +DW_RegCodeX64_zmm16, +DW_RegCodeX64_zmm17, +DW_RegCodeX64_zmm18, +DW_RegCodeX64_zmm19, +DW_RegCodeX64_zmm20, +DW_RegCodeX64_zmm21, +DW_RegCodeX64_zmm22, +DW_RegCodeX64_zmm23, +DW_RegCodeX64_zmm24, +DW_RegCodeX64_zmm25, +DW_RegCodeX64_zmm26, +DW_RegCodeX64_zmm27, +DW_RegCodeX64_zmm28, +DW_RegCodeX64_zmm29, +DW_RegCodeX64_zmm30, +DW_RegCodeX64_zmm31, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +DW_RegCodeX64_mm0, +DW_RegCodeX64_mm1, +DW_RegCodeX64_mm2, +DW_RegCodeX64_mm3, +DW_RegCodeX64_mm4, +DW_RegCodeX64_mm5, +DW_RegCodeX64_mm6, +DW_RegCodeX64_mm7, +}; + +C_LINKAGE_END + diff --git a/src/dwarf/x64/generated/dwarf_x64.meta.h b/src/dwarf/x64/generated/dwarf_x64.meta.h new file mode 100644 index 00000000..e9cb5806 --- /dev/null +++ b/src/dwarf/x64/generated/dwarf_x64.meta.h @@ -0,0 +1,14 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DWARF_X64_META_H +#define DWARF_X64_META_H + +C_LINKAGE_BEGIN +extern U8 dw_reg_code_from_x64_table[189]; + +C_LINKAGE_END + +#endif // DWARF_X64_META_H diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index a7af01fc..694ddb27 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -707,11 +707,12 @@ e_oplist_from_location(Arena *arena, RDI_Parsed *rdi, RDI_Location loc) { RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); Arch arch = arch_from_rdi_arch(tli->arch); + ARCH_Info *arch_info = arch_info_from_arch(arch); RDI_RegCode rdi_regcode = rdi_regcode_from_location(loc); - REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, rdi_regcode); - REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(arch)[regs_reg_code]; - U64 byte_size = (U64)reg_rng.byte_size; - U64 byte_pos = 0; + ARCH_RegCode reg_code = arch_reg_code_from_rdi(arch, rdi_regcode); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + U64 byte_size = (U64)dim_1u16(reg_rng); + U64 byte_pos = reg_rng.min; e_oplist_push_op(arena, &result, RDI_EvalOp_RegRead, e_value_u64(RDI_EncodeRegReadParam(rdi_regcode, byte_size, byte_pos))); }break; @@ -830,7 +831,6 @@ internal void e_select_ir_ctx(E_IRCtx *ctx) { if(ctx->regs_map == 0) { ctx->regs_map = &e_string2num_map_nil; } - if(ctx->reg_alias_map == 0) { ctx->reg_alias_map = &e_string2num_map_nil; } if(ctx->locals_map == 0) { ctx->locals_map = &e_string2num_map_nil; } if(ctx->member_map == 0) { ctx->member_map = &e_string2num_map_nil; } if(ctx->macro_map == 0) { ctx->macro_map = push_array(e_cache->arena, E_String2ExprMap, 1); ctx->macro_map[0] = e_string2expr_map_make(e_cache->arena, 512); } diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 5539a60a..48eaeba0 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -165,7 +165,6 @@ typedef enum E_TypeKeyKind E_TypeKeyKind_Ext, E_TypeKeyKind_Cons, E_TypeKeyKind_Reg, - E_TypeKeyKind_RegAlias, } E_TypeKeyKind; @@ -795,7 +794,6 @@ typedef struct E_IRCtx E_IRCtx; struct E_IRCtx { E_String2NumMap *regs_map; - E_String2NumMap *reg_alias_map; E_String2NumMap *locals_map; // (within `primary_module`) E_String2NumMap *member_map; // (within `primary_module`) E_String2ExprMap *macro_map; diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 75d75299..948c9730 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -280,13 +280,14 @@ e_interpret(String8 bytecode) U8 rdi_reg_code = (imm.u64&0x0000FF)>>0; U8 byte_size = (imm.u64&0x00FF00)>>8; U8 byte_off = (imm.u64&0xFF0000)>>16; - REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_interpret_ctx->reg_arch, rdi_reg_code); - REGS_Rng *rng_table = regs_reg_code_rng_table_from_arch(e_interpret_ctx->reg_arch); + Arch arch = e_interpret_ctx->reg_arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); + ARCH_RegCode base_reg_code = arch_reg_code_from_rdi(arch, rdi_reg_code); B32 good_read = 0; - if(0 <= rdi_reg_code && rdi_reg_code < regs_reg_code_count_from_arch(e_interpret_ctx->reg_arch)) + if(0 <= base_reg_code && base_reg_code < arch_info->reg_code_count) { - REGS_Rng rng = rng_table[base_reg_code]; - U64 off = (U64)rng.byte_off + byte_off; + Rng1U16 rng = arch_info->reg_code_rng_table[base_reg_code]; + U64 off = (U64)rng.min + byte_off; U64 size = (U64)byte_size; good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size)); } diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index ca17a553..00125902 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -2016,49 +2016,25 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I if(reg_num != 0) { string_mapped = 1; - REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_base_ctx->primary_module->arch)[reg_num]; + Arch arch = e_base_ctx->primary_module->arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); + ARCH_RegCode reg_code = reg_num; + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + U64 reg_size = dim_1u16(reg_rng); E_OpList oplist = {0}; - e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off); + e_oplist_push_uconst(arena, &oplist, reg_rng.min); mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); mapped_bytecode_mode = E_Mode_Offset; mapped_bytecode_space = e_base_ctx->thread_reg_space; - REGS_UsageKind reg_usage_kind = regs_reg_code_usage_kind_table_from_arch(e_base_ctx->primary_module->arch)[reg_num]; + B32 is_vector = arch_info->reg_code_is_vector_table[reg_code]; if(0){} - else if(reg_usage_kind == REGS_UsageKind_Normal && reg_rng.byte_size == 1) {mapped_type_key = e_type_key_basic(E_TypeKind_U8);} - else if(reg_usage_kind == REGS_UsageKind_Normal && reg_rng.byte_size == 2) {mapped_type_key = e_type_key_basic(E_TypeKind_U16);} - else if(reg_usage_kind == REGS_UsageKind_Normal && reg_rng.byte_size == 4) {mapped_type_key = e_type_key_basic(E_TypeKind_U32);} - else if(reg_usage_kind == REGS_UsageKind_Normal && reg_rng.byte_size == 8) {mapped_type_key = e_type_key_basic(E_TypeKind_U64);} + else if(!is_vector && reg_size == 1) {mapped_type_key = e_type_key_basic(E_TypeKind_U8);} + else if(!is_vector && reg_size == 2) {mapped_type_key = e_type_key_basic(E_TypeKind_U16);} + else if(!is_vector && reg_size == 4) {mapped_type_key = e_type_key_basic(E_TypeKind_U32);} + else if(!is_vector && reg_size == 8) {mapped_type_key = e_type_key_basic(E_TypeKind_U64);} else { - mapped_type_key = e_type_key_reg(e_base_ctx->primary_module->arch, reg_num); - } - } - }break; - - //- rjf: try register aliases - case E_IdentifierResolutionPath_RegisterAliases: - if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("reg"), 0))) - { - U64 alias_num = e_num_from_string(e_ir_ctx->reg_alias_map, string); - if(alias_num != 0) - { - string_mapped = 1; - REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_base_ctx->primary_module->arch)[alias_num]; - REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_base_ctx->primary_module->arch)[alias_slice.code]; - E_OpList oplist = {0}; - e_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); - mapped_bytecode_mode = E_Mode_Offset; - mapped_bytecode_space = e_base_ctx->thread_reg_space; - REGS_UsageKind reg_usage_kind = regs_alias_code_usage_kind_table_from_arch(e_base_ctx->primary_module->arch)[alias_num]; - if(0){} - else if(reg_usage_kind == REGS_UsageKind_Normal && alias_slice.byte_size == 1) {mapped_type_key = e_type_key_basic(E_TypeKind_U8);} - else if(reg_usage_kind == REGS_UsageKind_Normal && alias_slice.byte_size == 2) {mapped_type_key = e_type_key_basic(E_TypeKind_U16);} - else if(reg_usage_kind == REGS_UsageKind_Normal && alias_slice.byte_size == 4) {mapped_type_key = e_type_key_basic(E_TypeKind_U32);} - else if(reg_usage_kind == REGS_UsageKind_Normal && alias_slice.byte_size == 8) {mapped_type_key = e_type_key_basic(E_TypeKind_U64);} - else - { - mapped_type_key = e_type_key_reg_alias(e_base_ctx->primary_module->arch, alias_num); + mapped_type_key = e_type_key_reg(arch, reg_code); } } }break; @@ -2185,7 +2161,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I { Temp scratch = scratch_begin(&arena, 1); String8 file_path = expr->string; - FileProperties props = os_properties_from_file_path(file_path); + FileProperties props = properties_from_file_path(file_path); if(!str8_match(expr->qualifier, str8_lit("folder"), 0) && !(props.flags & FilePropertyFlag_IsFolder) && file_path.size != 0) { E_Space space = e_space_make(E_SpaceKind_FileSystem); @@ -2196,7 +2172,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I else { String8 folder_path = str8_chop_last_slash(file_path); - props = os_properties_from_file_path(folder_path); + props = properties_from_file_path(folder_path); if(props.flags & FilePropertyFlag_IsFolder || folder_path.size == 0 || str8_match(folder_path, str8_lit("/"), StringMatchFlag_SlashInsensitive)) { E_Space space = e_space_make(E_SpaceKind_FileSystem); diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 26a921a8..51231f44 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -18,7 +18,6 @@ typedef enum E_IdentifierResolutionPath E_IdentifierResolutionPath_BuiltInConstants, E_IdentifierResolutionPath_BuiltInTypes, E_IdentifierResolutionPath_Registers, - E_IdentifierResolutionPath_RegisterAliases, E_IdentifierResolutionPath_Macros, } E_IdentifierResolutionPath; @@ -89,7 +88,6 @@ E_IdentifierResolutionPath e_default_identifier_resolution_paths[] = E_IdentifierResolutionPath_BuiltInTypes, E_IdentifierResolutionPath_DebugInfoMatch, E_IdentifierResolutionPath_Registers, - E_IdentifierResolutionPath_RegisterAliases, E_IdentifierResolutionPath_Macros, }; E_IdentifierResolutionRule e_default_identifier_resolution_rule = @@ -110,7 +108,6 @@ E_IdentifierResolutionPath e_callable_identifier_resolution_paths[] = E_IdentifierResolutionPath_BuiltInTypes, E_IdentifierResolutionPath_DebugInfoMatch, E_IdentifierResolutionPath_Registers, - E_IdentifierResolutionPath_RegisterAliases, }; E_IdentifierResolutionRule e_callable_identifier_resolution_rule = { diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index cea50704..451ed179 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -288,7 +288,7 @@ e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_num) } internal E_TypeKey -e_type_key_reg(Arch arch, REGS_RegCode code) +e_type_key_reg(Arch arch, ARCH_RegCode code) { E_TypeKey key = {E_TypeKeyKind_Reg}; key.u32[0] = (U32)arch; @@ -296,15 +296,6 @@ e_type_key_reg(Arch arch, REGS_RegCode code) return key; } -internal E_TypeKey -e_type_key_reg_alias(Arch arch, REGS_AliasCode code) -{ - E_TypeKey key = {E_TypeKeyKind_RegAlias}; - key.u32[0] = (U32)arch; - key.u32[1] = (U32)code; - return key; -} - //- rjf: constructed type construction internal U64 @@ -625,7 +616,6 @@ e_type_kind_from_key(E_TypeKey key) case E_TypeKeyKind_Ext: {kind = (E_TypeKind)key.u32[0];}break; case E_TypeKeyKind_Cons: {kind = (E_TypeKind)key.u32[0];}break; case E_TypeKeyKind_Reg: {kind = E_TypeKind_Union;}break; - case E_TypeKeyKind_RegAlias:{kind = E_TypeKind_Union;}break; } return kind; } @@ -1100,16 +1090,10 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) case E_TypeKeyKind_Reg: { Arch arch = (Arch)key.u32[0]; - REGS_RegCode code = (REGS_RegCode)key.u32[1]; - REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[code]; - reg_byte_count = (U64)rng.byte_size; - }goto build_reg_type; - case E_TypeKeyKind_RegAlias: - { - Arch arch = (Arch)key.u32[0]; - REGS_AliasCode code = (REGS_AliasCode)key.u32[1]; - REGS_Slice slice = regs_alias_code_slice_table_from_arch(arch)[code]; - reg_byte_count = (U64)slice.byte_size; + ARCH_Info *arch_info = arch_info_from_arch(arch); + ARCH_RegCode code = (ARCH_RegCode)key.u32[1]; + Rng1U16 rng = arch_info->reg_code_rng_table[code]; + reg_byte_count = (U64)dim_1u16(rng); }goto build_reg_type; build_reg_type: { @@ -3117,23 +3101,23 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(folder) String8List folder_paths = {0}; String8List file_paths = {0}; { - OS_FileIter *iter = os_file_iter_begin(scratch.arena, folder_path, 0); - for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, iter, &info);) + FileIter *iter = file_iter_begin(scratch.arena, folder_path, 0); + for(FileInfo info = {0}; file_iter_next(scratch.arena, iter, &info);) { FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, local_filter, info.name); if(matches.count == matches.needle_part_count) { if(info.props.flags & FilePropertyFlag_IsFolder) { - str8_list_push(scratch.arena, &folder_paths, push_str8_copy(arena, info.name)); + str8_list_push(scratch.arena, &folder_paths, str8_copy(arena, info.name)); } else { - str8_list_push(scratch.arena, &file_paths, push_str8_copy(arena, info.name)); + str8_list_push(scratch.arena, &file_paths, str8_copy(arena, info.name)); } } } - os_file_iter_end(iter); + file_iter_end(iter); } //- rjf: build accelerator @@ -3252,7 +3236,7 @@ E_TYPE_IREXT_FUNCTION_DEF(file) //- rjf: fill accel accel->file_path = push_str8_copy(arena, file_path); - accel->props = os_properties_from_file_path(file_path); + accel->props = properties_from_file_path(file_path); accel->fields = str8_array_from_list(arena, &fields); scratch_end(scratch); diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index 94f6908f..216b301a 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -71,8 +71,7 @@ internal E_EnumValArray e_enum_val_array_from_list(Arena *arena, E_EnumValList * internal E_TypeKey e_type_key_zero(void); internal E_TypeKey e_type_key_basic(E_TypeKind kind); internal E_TypeKey e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_num); -internal E_TypeKey e_type_key_reg(Arch arch, REGS_RegCode code); -internal E_TypeKey e_type_key_reg_alias(Arch arch, REGS_AliasCode code); +internal E_TypeKey e_type_key_reg(Arch arch, ARCH_RegCode code); //- rjf: constructed type construction internal U64 e_hash_from_cons_type_params(E_ConsTypeParams *params); diff --git a/src/file_stream/file_stream.c b/src/file_stream/file_stream.c index 88383adb..26533c17 100644 --- a/src/file_stream/file_stream.c +++ b/src/file_stream/file_stream.c @@ -53,7 +53,7 @@ fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out FileProperties pre_props = {0}; if(lane_idx() == 0) { - pre_props = os_properties_from_file_path(path); + pre_props = properties_from_file_path(path); file_is_good = (pre_props.modified != 0); } lane_sync_u64(&file_is_good, 0); @@ -80,16 +80,16 @@ fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out } //- rjf: open file - OS_Handle file = {0}; + File file = {0}; if(file_is_good) { if(lane_idx() == 0) { - file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, path); + file = file_open(AccessFlag_Read|AccessFlag_ShareRead|AccessFlag_ShareWrite, path); } lane_sync_u64(&file, 0); } - B32 file_handle_is_valid = !os_handle_match(os_handle_zero(), file); + B32 file_handle_is_valid = !file_match(file_zero(), file); //- rjf: do read U64 total_bytes_read = 0; @@ -104,7 +104,7 @@ fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out ProfScope("read \"%.*s\" [0x%I64x, 0x%I64x)", str8_varg(path), range.min, range.max) { Rng1U64 lane_read_range = lane_range(data_buffer_size); - U64 bytes_read = os_file_read(file, shift_1u64(lane_read_range, range.min), data_buffer + lane_read_range.min); + U64 bytes_read = file_read(file, shift_1u64(lane_read_range, range.min), data_buffer + lane_read_range.min); ins_atomic_u64_add_eval(total_bytes_read_ptr, bytes_read); } lane_sync(); @@ -116,7 +116,7 @@ fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out { if(lane_idx() == 0) { - os_file_close(file); + file_close(file); } } @@ -124,7 +124,7 @@ fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out FileProperties post_props = {0}; if(lane_idx() == 0) { - post_props = os_properties_from_file_path(path); + post_props = properties_from_file_path(path); } //- rjf: form content key @@ -303,7 +303,7 @@ fs_async_tick(void) { for(FS_Node *n = slot->first; n != 0; n = n->next) { - FileProperties props = os_properties_from_file_path(n->path); + FileProperties props = properties_from_file_path(n->path); if(props.modified != n->last_modified_timestamp) { found_work = 1; diff --git a/src/font_provider/dwrite/font_provider_dwrite.c b/src/font_provider/dwrite/font_provider_dwrite.c index 91dbd89e..448d8572 100644 --- a/src/font_provider/dwrite/font_provider_dwrite.c +++ b/src/font_provider/dwrite/font_provider_dwrite.c @@ -335,7 +335,7 @@ fp_font_open(String8 path) //- rjf: try to open font for(PathTask *t = first_task; t != 0 && font.file == 0; t = t->next) { - B32 file_exists = (os_properties_from_file_path(t->path).created != 0); + B32 file_exists = (properties_from_file_path(t->path).created != 0); String16 path16 = str16_from_8(scratch.arena, t->path); if(file_exists) { diff --git a/src/linker/lnk.c b/src/linker/lnk.c index c7c9f869..d0643301 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -136,7 +136,7 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_PdbAltPath, "%%_RAD_PDB_PATH%%"); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_PdbPageSize, "%u", KB(4)); if (!lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Brepro)) { - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", os_get_process_start_time_unix()); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", get_process_start_time_unix()); } lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_TypeHashAlg, "BLAKE3"); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Age, "%u", 1); @@ -150,7 +150,7 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_OsVer, "6.0"); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_PageSize, "%u", KB(4)); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_PathStyle, "system"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Workers, "%u", os_get_system_info()->logical_processor_count); + lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Workers, "%u", get_system_info()->logical_processor_count); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_DebugAltPath, "%%_RAD_RDI_PATH%%"); lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_MemoryMapFiles, ""); if (BUILD_DEBUG) { @@ -374,7 +374,7 @@ lnk_merge_manifest_files(String8 mt_path, String8 out_name, String8List manifest str8_list_pushf(scratch.arena, &cmd_line, "-nologo"); // register input manifest files on command line - String8 work_dir = os_get_current_path(scratch.arena); + String8 work_dir = get_current_path(scratch.arena); for (String8Node *man_node = manifest_path_list.first; man_node != 0; man_node = man_node->next) { @@ -390,15 +390,15 @@ lnk_merge_manifest_files(String8 mt_path, String8 out_name, String8List manifest } // launch mt.exe with our command line - OS_ProcessLaunchParams launch_opts = {0}; + ProcessLaunchParams launch_opts = {0}; launch_opts.cmd_line = cmd_line; launch_opts.inherit_env = 1; launch_opts.consoleless = 0; - OS_Handle mt_handle = os_process_launch(&launch_opts); - if (os_handle_match(mt_handle, os_handle_zero())) { + Process mt_handle = process_launch(&launch_opts); + if (process_match(mt_handle, process_zero())) { lnk_error(LNK_Error_Mt, "unable to start process: %S", mt_path); } else { - os_process_join(mt_handle, max_U64, 0); + process_join(mt_handle, max_U64, 0); } scratch_end(scratch); @@ -447,8 +447,8 @@ lnk_manifest_from_inputs(Arena *arena, } // cleanup disk - os_delete_file_at_path(linker_manifest_path); - os_delete_file_at_path(merged_manifest_path); + delete_file_at_path(linker_manifest_path); + delete_file_at_path(merged_manifest_path); ProfEnd(); } else { @@ -804,7 +804,7 @@ lnk_make_res_obj(Arena *arena, } // convert res to obj - OS_ProcessInfo *process_info = os_get_process_info(); + ProcessInfo *process_info = get_process_info(); String8List exe_path_strs = {0}; str8_list_push(scratch.arena, &exe_path_strs, process_info->binary_path); String8 exe_path = str8_list_first(&exe_path_strs); @@ -1032,7 +1032,7 @@ lnk_inputer_push_obj_thin(LNK_Inputer *inputer, LNK_LibMemberRef *link_member, S { lnk_log(LNK_Log_InputObj, "Input Obj: %S", path); Temp scratch = scratch_begin(0,0); - String8 full_path = os_full_path_from_path(scratch.arena, path); + String8 full_path = full_path_from_path(scratch.arena, path); LNK_Input *input = lnk_inputer_push_thin(inputer->arena, &inputer->new_objs, inputer->objs_ht, full_path); input->link_member = link_member; scratch_end(scratch); @@ -1059,7 +1059,7 @@ lnk_input_from_path(HashTable *load_ht, String8 path) LNK_Input *input = hash_table_search_path_raw(load_ht, path); if (input == 0) { Temp scratch = scratch_begin(0, 0); - String8 full_path = os_full_path_from_path(scratch.arena, path); + String8 full_path = full_path_from_path(scratch.arena, path); input = hash_table_search_path_raw(load_ht, full_path); scratch_end(scratch); } diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 768d495e..d6e708b4 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -1115,7 +1115,7 @@ lnk_unwrap_rsp(Arena *arena, String8List arg_list) // remove "@" String8 name = str8_skip(curr->string, 1); - if (os_file_path_exists(name)) { + if (file_path_exists(name)) { // read rsp from disk String8 file = lnk_read_data_from_file_path(scratch.arena, 0, name); @@ -1469,8 +1469,8 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_LibPath: { String8List lib_dir_list = str8_list_copy(config->arena, &value_strings); for (String8Node *dir_n = lib_dir_list.first; dir_n != 0; dir_n = dir_n->next) { - if (!os_folder_path_exists(dir_n->string)) { - String8 full_path = os_full_path_from_path(scratch.arena, dir_n->string); + if (!folder_path_exists(dir_n->string)) { + String8 full_path = full_path_from_path(scratch.arena, dir_n->string); lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, "path doesn't exist %S", full_path); } } @@ -1827,7 +1827,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_Rad_BuildInfo: { lnk_print_build_info(); - os_abort(0); + abort_self(0); } break; case LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll: { @@ -1881,7 +1881,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List if (str8_match_lit("imageblake3", value_strings.first->string, StringMatchFlag_CaseInsensitive)) { config->guid_type = Lnk_DebugInfoGuid_ImageBlake3; } else if (str8_match_lit("random", value_strings.first->string, StringMatchFlag_CaseInsensitive)) { - config->guid = os_make_guid(); + config->guid = make_guid(); } else { Guid guid; if (try_guid_from_string(value_strings.first->string, &guid)) { @@ -1897,7 +1897,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_Rad_LargePages: { if (value_strings.node_count == 0) { - OS_ProcessInfo *process_info = os_get_process_info(); + ProcessInfo *process_info = get_process_info(); if (process_info->large_pages_allowed) { arena_default_flags |= ArenaFlag_LargePages; } else { @@ -1914,7 +1914,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } else if (value_strings.node_count == 1) { if (str8_match_lit("quiet", value_strings.first->string, StringMatchFlag_CaseInsensitive)) { - OS_ProcessInfo *process_info = os_get_process_info(); + ProcessInfo *process_info = get_process_info(); if (process_info->large_pages_allowed) { arena_default_flags |= ArenaFlag_LargePages; } @@ -2031,7 +2031,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } break; case LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers: { - OS_SystemInfo *sysinfo = os_get_system_info(); + SystemInfo *sysinfo = get_system_info(); if (value_strings.node_count == 0) { config->max_worker_count = sysinfo->logical_processor_count; } else { @@ -2101,7 +2101,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_Rad_Version: { lnk_fprintf(stdout, "%s\n", BUILD_TITLE_STRING_LITERAL); - os_abort(0); + abort_self(0); } break; case LNK_CmdSwitch_Rad_Workers: { @@ -2113,7 +2113,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_Help: { lnk_print_help(); - os_abort(0); + abort_self(0); } break; } @@ -2130,7 +2130,7 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) LNK_Config *config = push_array(arena, LNK_Config, 1); config->arena = arena; config->raw_cmd_line = str8_list_copy(arena, &raw_cmd_line); - config->work_dir = os_get_current_path(arena); + config->work_dir = get_current_path(arena); config->build_imp_lib = 1; config->build_exp = 1; config->heap_reserve = MB(1); @@ -2304,17 +2304,17 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) } // convert to full paths - config->out_path = os_full_path_from_path(arena, config->out_path); - config->pdb_name = os_full_path_from_path(arena, config->pdb_name); - config->rad_debug_name = os_full_path_from_path(arena, config->rad_debug_name); - config->imp_lib_name = os_full_path_from_path(arena, config->imp_lib_name); - config->manifest_name = os_full_path_from_path(arena, config->manifest_name); + config->out_path = full_path_from_path(arena, config->out_path); + config->pdb_name = full_path_from_path(arena, config->pdb_name); + config->rad_debug_name = full_path_from_path(arena, config->rad_debug_name); + config->imp_lib_name = full_path_from_path(arena, config->imp_lib_name); + config->manifest_name = full_path_from_path(arena, config->manifest_name); // collect env vars HashTable *env_vars = hash_table_init(scratch.arena, 512); { #if OS_WINDOWS - OS_ProcessInfo *process_info = os_get_process_info(); + ProcessInfo *process_info = get_process_info(); for (String8Node *node = process_info->environment.first; node != 0; node = node->next) { String8List list = str8_split_by_string_chars(scratch.arena, node->string, str8_lit("="), 0); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index db77c900..b6d998d1 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -479,7 +479,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, ProfBegin("Set up PCH"); { // hash_table - String8 work_dir = os_get_current_path(scratch.arena); + String8 work_dir = get_current_path(scratch.arena); HashTable *debug_p_ht = hash_table_init(scratch.arena, obj_count); for EachIndex(i, input.debug_p_indices.count) { U64 obj_idx = input.debug_p_indices.v[i]; diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index a7d00d9a..91371dd8 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -1,41 +1,41 @@ shared_function int lnk_open_file_read(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max) { - OS_Handle handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, str8((U8*)path, path_size)); + File handle = file_open(AccessFlag_Read|AccessFlag_ShareRead, str8((U8*)path, path_size)); Assert(sizeof(handle) <= handle_buffer_max); MemoryCopy(handle_buffer, &handle, sizeof(handle)); - return !os_handle_match(handle, os_handle_zero()); + return !file_match(handle, file_zero()); } shared_function int lnk_open_file_write(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max) { - OS_Handle handle = os_file_open(OS_AccessFlag_Write, str8((U8*)path, path_size)); + File handle = file_open(AccessFlag_Write, str8((U8*)path, path_size)); Assert(sizeof(handle) <= handle_buffer_max); MemoryCopy(handle_buffer, &handle, sizeof(handle)); - return !os_handle_match(handle, os_handle_zero()); + return !file_match(handle, file_zero()); } shared_function void lnk_close_file(void *raw_handle) { - OS_Handle handle = *(OS_Handle *)raw_handle; - os_file_close(handle); + File handle = *(File *)raw_handle; + file_close(handle); } shared_function uint64_t lnk_size_from_file(void *raw_handle) { - OS_Handle handle = *(OS_Handle *)raw_handle; - FileProperties props = os_properties_from_file(handle); + File handle = *(File *)raw_handle; + FileProperties props = properties_from_file(handle); return props.size; } shared_function uint64_t lnk_read_file(void *raw_handle, void *buffer, uint64_t buffer_max) { - OS_Handle handle = *(OS_Handle *)raw_handle; - U64 read_size = os_file_read(handle, rng_1u64(0, buffer_max), buffer); + File handle = *(File *)raw_handle; + U64 read_size = file_read(handle, rng_1u64(0, buffer_max), buffer); Assert(read_size == buffer_max); return read_size; } @@ -43,8 +43,8 @@ lnk_read_file(void *raw_handle, void *buffer, uint64_t buffer_max) shared_function uint64_t lnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_size) { - OS_Handle handle = *(OS_Handle*)raw_handle; - U64 write_size = os_file_write(handle, r1u64(offset, offset + buffer_size), buffer); + File handle = *(File*)raw_handle; + U64 write_size = file_write(handle, r1u64(offset, offset + buffer_size), buffer); return write_size; } @@ -54,10 +54,10 @@ lnk_find_first_file(Arena *arena, String8List dir_list, String8 path) ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); String8 result = {0}; - if (os_file_path_exists(path)) { + if (file_path_exists(path)) { PathStyle path_style = path_style_from_str8(path); if (path_style == PathStyle_Relative) { - String8 current_path = os_get_current_path(scratch.arena); + String8 current_path = get_current_path(scratch.arena); String8List l = {0}; str8_list_push(scratch.arena, &l, current_path); str8_list_push(scratch.arena, &l, path); @@ -69,7 +69,7 @@ lnk_find_first_file(Arena *arena, String8List dir_list, String8 path) String8 file_name = str8_skip_last_slash(path); for EachNode(n, String8Node, dir_list.first) { String8 full_path = push_str8f(scratch.arena, "%S/%S", n->string, file_name); - if (os_file_path_exists(full_path)) { + if (file_path_exists(full_path)) { result = push_str8_copy(arena, full_path); break; } @@ -80,10 +80,10 @@ lnk_find_first_file(Arena *arena, String8List dir_list, String8 path) return result; } -internal OS_Handle +internal File lnk_file_open_with_rename_permissions(String8 path) { - OS_Handle file_handle = os_handle_zero(); + File file_handle = file_zero(); #if OS_WINDOWS Temp scratch = scratch_begin(0,0); @@ -109,7 +109,7 @@ lnk_file_open_with_rename_permissions(String8 path) } internal B32 -lnk_file_set_delete_on_close(OS_Handle handle, B32 delete_file) +lnk_file_set_delete_on_close(File handle, B32 delete_file) { #if OS_WINDOWS FILE_DISPOSITION_INFO file_disposition = {0}; @@ -122,7 +122,7 @@ lnk_file_set_delete_on_close(OS_Handle handle, B32 delete_file) } internal B32 -lnk_file_rename(OS_Handle handle, String8 new_name) +lnk_file_rename(File handle, String8 new_name) { Temp scratch = scratch_begin(0,0); #if OS_WINDOWS @@ -167,7 +167,7 @@ THREAD_POOL_TASK_FUNC(lnk_data_size_from_file_path_task) LNK_DiskReader *task = raw_task; String8 path = task->path_arr.v[task_id]; - OS_Handle handle = {0}; + File handle = {0}; U64 size = 0; int is_open = lnk_open_file_read((char*)path.str, path.size, &handle, sizeof(handle)); @@ -184,7 +184,7 @@ THREAD_POOL_TASK_FUNC(lnk_data_from_file_path_task) { LNK_DiskReader *task = raw_task; - OS_Handle handle = task->handle_arr[task_id]; + File handle = task->handle_arr[task_id]; U64 buffer_size = task->size_arr[task_id]; U8 *buffer = task->buffer + task->off_arr[task_id]; @@ -239,7 +239,7 @@ lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, LNK_IO_Flags Temp scratch = scratch_begin(&arena,1); reader.path_arr = path_arr; - reader.handle_arr = push_array_no_zero(scratch.arena, OS_Handle, path_arr.count); + reader.handle_arr = push_array_no_zero(scratch.arena, File, path_arr.count); reader.size_arr = push_array_no_zero(scratch.arena, U64, path_arr.count); // open handles and get sizes @@ -284,7 +284,7 @@ lnk_write_data_list_to_file_path(String8 path, String8 temp_path, String8List da ProfBeginV("Write %M to %S", data.total_size, path); B32 open_with_rename = (temp_path.size > 0); - OS_Handle file_handle = {0}; + File file_handle = {0}; String8 open_file_path = {0}; if (open_with_rename) { file_handle = lnk_file_open_with_rename_permissions(temp_path); @@ -299,9 +299,9 @@ lnk_write_data_list_to_file_path(String8 path, String8 temp_path, String8List da open_file_path = path; } - if (!os_handle_match(file_handle, os_handle_zero())) { + if (!file_match(file_handle, file_zero())) { // try to reserve up front file size - if (!os_file_reserve_size(file_handle, data.total_size)) { + if (!file_reserve_size(file_handle, data.total_size)) { lnk_log(LNK_Log_IO_Write, "Failed to pre-allocate file %S with size %M", open_file_path, data.total_size); } diff --git a/src/linker/lnk_io.h b/src/linker/lnk_io.h index 76795427..3aff6fe9 100644 --- a/src/linker/lnk_io.h +++ b/src/linker/lnk_io.h @@ -11,7 +11,7 @@ typedef struct LNK_IO_Flags io_flags; String8Array path_arr; String8Array data_arr; - OS_Handle *handle_arr; + File *handle_arr; U64 *size_arr; U64 *off_arr; U8 *buffer; @@ -28,9 +28,9 @@ shared_function uint64_t lnk_write_file(void *raw_handle, uint64_t offset, void // --- IO Functions ------------------------------------------------------------ -internal OS_Handle lnk_file_open_with_rename_permissions(String8 path); -internal B32 lnk_file_set_delete_on_close(OS_Handle handle, B32 delete_file); -internal B32 lnk_file_rename(OS_Handle handle, String8 new_name); +internal File lnk_file_open_with_rename_permissions(String8 path); +internal B32 lnk_file_set_delete_on_close(File handle, B32 delete_file); +internal B32 lnk_file_rename(File handle, String8 new_name); internal String8 lnk_read_data_from_file_path(Arena *arena, LNK_IO_Flags io_flags, String8 path); internal String8Array lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, LNK_IO_Flags io_flags, String8Array path_arr); diff --git a/src/linker/lnk_timer.c b/src/linker/lnk_timer.c index 4ce4522e..b94817d7 100644 --- a/src/linker/lnk_timer.c +++ b/src/linker/lnk_timer.c @@ -6,13 +6,13 @@ global LNK_Timer g_timers[LNK_Timer_Count]; internal void lnk_timer_begin(LNK_TimerType timer) { - g_timers[timer].begin = os_now_microseconds(); + g_timers[timer].begin = now_time_us(); } internal void lnk_timer_end(LNK_TimerType timer) { - g_timers[timer].end = os_now_microseconds(); + g_timers[timer].end = now_time_us(); } internal String8 diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index f7de6cdb..6302b52c 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1613,7 +1613,7 @@ pdb_add_src(PDB_InfoContext *info, MSF_Context *msf, String8 file_path, String8 if (comp == PDB_SrcComp_NULL) { // process path so it passes VS validity checks String8 virt_path = file_path; - String8 work_dir = os_get_current_path(scratch.arena); + String8 work_dir = get_current_path(scratch.arena); virt_path = path_absolute_dst_from_relative_dst_src(scratch.arena, virt_path, work_dir); virt_path = lower_from_str8(scratch.arena, virt_path); virt_path = path_convert_slashes(scratch.arena, virt_path, PathStyle_UnixAbsolute); diff --git a/src/linker/thread_pool/thread_pool.c b/src/linker/thread_pool/thread_pool.c index 63fcd527..71003bb9 100644 --- a/src/linker/thread_pool/thread_pool.c +++ b/src/linker/thread_pool/thread_pool.c @@ -23,7 +23,7 @@ tp_run_tasks(TP_Context *pool, TP_Worker *worker) // on last task ping main thread U64 task_done = ins_atomic_u64_inc_eval(&pool->task_done); if (task_done == task_count) { - os_semaphore_drop(pool->main_semaphore); + semaphore_drop(pool->main_semaphore); } } } @@ -34,7 +34,7 @@ tp_worker_main(void *raw_worker) TP_Worker *worker = raw_worker; TP_Context *pool = worker->pool; for (; pool->is_live; ) { - if (os_semaphore_take(pool->task_semaphore, max_U64)) { + if (semaphore_take(pool->task_semaphore, max_U64)) { tp_run_tasks(pool, worker); } } @@ -46,8 +46,8 @@ tp_worker_main_shared(void *raw_worker) TP_Worker *worker = raw_worker; TP_Context *pool = worker->pool; for (; pool->is_live; ) { - if (os_semaphore_take(pool->exec_semaphore, max_U64)) { - if (os_semaphore_take(pool->task_semaphore, max_U64)) { + if (semaphore_take(pool->exec_semaphore, max_U64)) { + if (semaphore_take(pool->task_semaphore, max_U64)) { tp_run_tasks(pool, worker); } } @@ -67,13 +67,13 @@ tp_alloc(Arena *arena, U32 worker_count, U32 max_worker_count, String8 name) Semaphore task_semaphore = {0}; Semaphore exec_semaphore = {0}; if (worker_count > 1) { - main_semaphore = os_semaphore_alloc(0, 1, str8_zero()); + main_semaphore = semaphore_alloc(0, 1, str8_zero()); if (is_shared) { AssertAlways(worker_count <= max_worker_count); - task_semaphore = os_semaphore_alloc(0, max_worker_count, name); - exec_semaphore = os_semaphore_alloc(0, worker_count, str8_zero()); + task_semaphore = semaphore_alloc(0, max_worker_count, name); + exec_semaphore = semaphore_alloc(0, worker_count, str8_zero()); } else { - task_semaphore = os_semaphore_alloc(0, worker_count, str8_zero()); + task_semaphore = semaphore_alloc(0, worker_count, str8_zero()); } } @@ -213,20 +213,20 @@ tp_for_parallel(TP_Context *pool, TP_Arena *task_arena, U64 task_count, TP_TaskF // if we are in shared mode ping local semaphore if (pool->exec_semaphore.u64[0] != 0) { for (U64 worker_idx = 0; worker_idx < drop_count; worker_idx +=1) { - os_semaphore_drop(pool->exec_semaphore); + semaphore_drop(pool->exec_semaphore); } } // ping shared semaphore for (U64 worker_idx = 0; worker_idx < drop_count; worker_idx += 1) { - os_semaphore_drop(pool->task_semaphore); + semaphore_drop(pool->task_semaphore); } // run tasks on main worker tp_run_tasks(pool, &pool->worker_arr[0]); // wait for workers to finish tasks - os_semaphore_take(pool->main_semaphore, max_U64); + semaphore_take(pool->main_semaphore, max_U64); } } diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/linux/base/linux_base.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/linux/base/linux_base.h b/src/linux/base/linux_base.h new file mode 100644 index 00000000..2ba3a846 --- /dev/null +++ b/src/linux/base/linux_base.h @@ -0,0 +1,7 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef LINUX_BASE_H +#define LINUX_BASE_H + +#endif // LINUX_BASE_H diff --git a/src/mutable_text/mutable_text.c b/src/mutable_text/mutable_text.c index 28a735ea..420c5e94 100644 --- a/src/mutable_text/mutable_text.c +++ b/src/mutable_text/mutable_text.c @@ -14,7 +14,7 @@ mtx_init(void) mtx_shared = push_array(arena, MTX_Shared, 1); mtx_shared->arena = arena; mtx_shared->slots_count = 256; - mtx_shared->stripes_count = Min(mtx_shared->slots_count, os_get_system_info()->logical_processor_count); + mtx_shared->stripes_count = Min(mtx_shared->slots_count, get_system_info()->logical_processor_count); mtx_shared->slots = push_array(arena, MTX_Slot, mtx_shared->slots_count); mtx_shared->stripes = push_array(arena, MTX_Stripe, mtx_shared->stripes_count); for(U64 idx = 0; idx < mtx_shared->stripes_count; idx += 1) @@ -22,7 +22,7 @@ mtx_init(void) mtx_shared->stripes[idx].arena = arena_alloc(); mtx_shared->stripes[idx].rw_mutex = rw_mutex_alloc(); } - mtx_shared->mut_threads_count = Min(os_get_system_info()->logical_processor_count, 4); + mtx_shared->mut_threads_count = Min(get_system_info()->logical_processor_count, 4); mtx_shared->mut_threads = push_array(arena, MTX_MutThread, mtx_shared->mut_threads_count); for(U64 idx = 0; idx < mtx_shared->mut_threads_count; idx += 1) { diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index b1ea7097..0e95df77 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -772,23 +772,13 @@ internal OS_Handle os_process_launch(OS_ProcessLaunchParams *params) { OS_Handle handle = {0}; - posix_spawn_file_actions_t file_actions = {0}; int file_actions_init_code = posix_spawn_file_actions_init(&file_actions); if(file_actions_init_code == 0) { - // redirect STDOUT int stdout_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdout_file.u64[0], STDOUT_FILENO); - Assert(stdout_code == 0); - - // redirect STDERR int stderr_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stderr_file.u64[0], STDERR_FILENO); - Assert(stderr_code == 0); - - // redirect STDIN int stdin_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdin_file.u64[0], STDIN_FILENO); - Assert(stdin_code == 0); - posix_spawnattr_t attr = {0}; int attr_init_code = posix_spawnattr_init(&attr); if(attr_init_code == 0) @@ -801,7 +791,6 @@ os_process_launch(OS_ProcessLaunchParams *params) String8List l = str8_split_path(scratch.arena, params->path); str8_list_push(scratch.arena, &l, params->cmd_line.first->string); String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); - argv[0] = (char *)path_to_exe.str; U64 arg_idx = 1; for EachNode(n, String8Node, params->cmd_line.first->next) @@ -828,21 +817,9 @@ os_process_launch(OS_ProcessLaunchParams *params) } } - if(params->debug_subprocesses) - { - // not suported - InvalidPath; - } - - if(!params->consoleless) - { - NotImplemented; - } - // spawn process pid_t pid = 0; int spawn_code = posix_spawn(&pid, argv[0], &file_actions, &attr, argv, envp); - if(spawn_code == 0) { handle.u64[0] = (U64)pid; @@ -850,16 +827,12 @@ os_process_launch(OS_ProcessLaunchParams *params) // clean up attributes int attr_destroy_code = posix_spawnattr_destroy(&attr); - Assert(attr_destroy_code == 0); - scratch_end(scratch); } // clean up file actions int file_actions_destroy_code = posix_spawn_file_actions_destroy(&file_actions); - Assert(file_actions_destroy_code == 0); } - return handle; } @@ -873,14 +846,12 @@ os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) if(kill(pid, 0) >= 0) { result = (errno == ENOENT); - if(result) { int status; waitpid(pid, &status, 0); } } - else { Assert(0 && "failed to get status from pid"); } } else if(endt_us == max_U64) { diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 47761924..6b216aa1 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1,155 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// -//~ rjf: Modern Windows SDK Functions -// -// (We must dynamically link to them, since they can be missing in older SDKs) - -typedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, PCWSTR lpThreadDescription); -global W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0; -global RIO_EXTENSION_FUNCTION_TABLE w32_rio_functions = {0}; - -//////////////////////////////// -//~ rjf: File Info Conversion Helpers - -internal FilePropertyFlags -os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes) -{ - FilePropertyFlags flags = 0; - if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - flags |= FilePropertyFlag_IsFolder; - } - return flags; -} - -internal void -os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes) -{ - properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow); - os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); - os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); - properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); -} - -//////////////////////////////// -//~ rjf: Time Conversion Helpers - -internal void -os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) -{ - out->year = in->wYear; - out->mon = in->wMonth - 1; - out->wday = in->wDayOfWeek; - out->day = in->wDay; - out->hour = in->wHour; - out->min = in->wMinute; - out->sec = in->wSecond; - out->msec = in->wMilliseconds; -} - -internal void -os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in) -{ - out->wYear = (WORD)(in->year); - out->wMonth = in->mon + 1; - out->wDay = in->day; - out->wHour = in->hour; - out->wMinute = in->min; - out->wSecond = in->sec; - out->wMilliseconds = in->msec; -} - -internal void -os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in) -{ - SYSTEMTIME systime = {0}; - FileTimeToSystemTime(in, &systime); - DateTime date_time = {0}; - os_w32_date_time_from_system_time(&date_time, &systime); - *out = dense_time_from_date_time(date_time); -} - -internal U32 -os_w32_sleep_ms_from_endt_us(U64 endt_us) -{ - U32 sleep_ms = 0; - if(endt_us == max_U64) - { - sleep_ms = INFINITE; - } - else - { - U64 begint = os_now_microseconds(); - if(begint < endt_us) - { - U64 sleep_us = endt_us - begint; - sleep_ms = (U32)((sleep_us + 999)/1000); - } - } - return sleep_ms; -} - -internal U32 -os_w32_unix_time_from_file_time(FILETIME file_time) -{ - U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime; - U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000); - - Assert(unix_time64 <= max_U32); - U32 unix_time32 = (U32)unix_time64; - - return unix_time32; -} - -//////////////////////////////// -//~ rjf: Entity Functions - -internal OS_W32_Entity * -os_w32_entity_alloc(OS_W32_EntityKind kind) -{ - OS_W32_Entity *result = 0; - EnterCriticalSection(&os_w32_state.entity_mutex); - { - result = os_w32_state.entity_free; - if(result) - { - SLLStackPop(os_w32_state.entity_free); - } - else - { - result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1); - } - MemoryZeroStruct(result); - } - LeaveCriticalSection(&os_w32_state.entity_mutex); - result->kind = kind; - return result; -} - -internal void -os_w32_entity_release(OS_W32_Entity *entity) -{ - entity->kind = OS_W32_EntityKind_Null; - EnterCriticalSection(&os_w32_state.entity_mutex); - SLLStackPush(os_w32_state.entity_free, entity); - LeaveCriticalSection(&os_w32_state.entity_mutex); -} - -//////////////////////////////// -//~ rjf: Thread Entry Point - -internal DWORD -os_w32_thread_entry_point(void *ptr) -{ - OS_W32_Entity *entity = (OS_W32_Entity *)ptr; - ThreadEntryPointFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - supplement_thread_base_entry_point(func, thread_ptr); - return 0; -} - //////////////////////////////// //~ rjf: @os_hooks System/Process Info (Implemented Per-OS) diff --git a/src/os/gfx/os_gfx.c b/src/os/gfx/os_gfx.c index 3b584ec0..29f8c544 100644 --- a/src/os/gfx/os_gfx.c +++ b/src/os/gfx/os_gfx.c @@ -6,6 +6,30 @@ #include "generated/os_gfx.meta.c" +//////////////////////////////// +//~ rjf: Handle Type Helpers + +internal OS_Window +os_window_zero(void) +{ + OS_Window result = {0}; + return result; +} + +internal B32 +os_window_match(OS_Window a, OS_Window b) +{ + B32 result = MemoryMatchStruct(&a, &b); + return result; +} + +internal B32 +os_monitor_match(OS_Monitor a, OS_Monitor b) +{ + B32 result = MemoryMatchStruct(&a, &b); + return result; +} + //////////////////////////////// //~ rjf: Event Functions (Helpers, Implemented Once) @@ -182,12 +206,12 @@ os_eat_event(OS_EventList *events, OS_Event *event) } internal B32 -os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key) +os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key) { B32 result = 0; for(OS_Event *event = events->first; event != 0; event = event->next) { - if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && + if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && event->kind == OS_EventKind_Press && event->key == key && event->modifiers == modifiers) { result = 1; @@ -199,12 +223,12 @@ os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_ } internal B32 -os_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key) +os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key) { B32 result = 0; for(OS_Event *event = events->first; event != 0; event = event->next) { - if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && + if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && event->kind == OS_EventKind_Release && event->key == key && event->modifiers == modifiers) { result = 1; @@ -216,12 +240,12 @@ os_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, O } internal B32 -os_text(OS_EventList *events, OS_Handle window, U32 character) +os_text(OS_EventList *events, OS_Window window, U32 character) { B32 result = 0; for(OS_Event *event = events->first; event != 0; event = event->next) { - if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) && + if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && event->kind == OS_EventKind_Text && event->character == character) { result = 1; @@ -270,7 +294,7 @@ os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind) OS_Event *evt = push_array(arena, OS_Event, 1); DLLPushBack(evts->first, evts->last, evt); evts->count += 1; - evt->timestamp_us = os_now_microseconds(); + evt->timestamp_us = now_time_us(); evt->kind = kind; return evt; } diff --git a/src/os/gfx/os_gfx.h b/src/os/gfx/os_gfx.h index 8eabfd57..bc4a7d16 100644 --- a/src/os/gfx/os_gfx.h +++ b/src/os/gfx/os_gfx.h @@ -25,6 +25,37 @@ enum OS_WindowFlag_UseDefaultPosition = (1<<1), }; +typedef struct OS_Window OS_Window; +struct OS_Window +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: External Window Types + +typedef struct OS_ExternalWindow OS_ExternalWindow; +struct OS_ExternalWindow +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: Monitor Types + +typedef struct OS_Monitor OS_Monitor; +struct OS_Monitor +{ + U64 u64[1]; +}; + +typedef struct OS_MonitorArray OS_MonitorArray; +struct OS_MonitorArray +{ + OS_Monitor *v; + U64 count; +}; + //////////////////////////////// //~ rjf: Cursor Types @@ -81,7 +112,7 @@ struct OS_Event OS_Event *next; OS_Event *prev; U64 timestamp_us; - OS_Handle window; + OS_Window window; OS_EventKind kind; OS_Modifiers modifiers; OS_Key key; @@ -107,6 +138,13 @@ struct OS_EventList internal B32 frame(void); +//////////////////////////////// +//~ rjf: Handle Type Helpers + +internal OS_Window os_window_zero(void); +internal B32 os_window_match(OS_Window a, OS_Window b); +internal B32 os_monitor_match(OS_Monitor a, OS_Monitor b); + //////////////////////////////// //~ rjf: Event Functions (Helpers, Implemented Once) @@ -115,9 +153,9 @@ internal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers fl internal String8 os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key); internal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers flags, OS_Key key); internal void os_eat_event(OS_EventList *events, OS_Event *event); -internal B32 os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key); -internal B32 os_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key); -internal B32 os_text(OS_EventList *events, OS_Handle window, U32 character); +internal B32 os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key); +internal B32 os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key); +internal B32 os_text(OS_EventList *events, OS_Window window, U32 character); internal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src); internal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push); internal OS_Event *os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind); @@ -141,43 +179,43 @@ internal String8 os_get_clipboard_text(Arena *arena); //////////////////////////////// //~ rjf: @os_hooks Windows (Implemented Per-OS) -internal OS_Handle os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title); -internal void os_window_close(OS_Handle window); -internal void os_window_set_title(OS_Handle window, String8 title); -internal void os_window_first_paint(OS_Handle window); -internal void os_window_focus(OS_Handle window); -internal B32 os_window_is_focused(OS_Handle window); -internal B32 os_window_is_fullscreen(OS_Handle window); -internal void os_window_set_fullscreen(OS_Handle window, B32 fullscreen); -internal B32 os_window_is_maximized(OS_Handle window); -internal void os_window_set_maximized(OS_Handle window, B32 maximized); -internal B32 os_window_is_minimized(OS_Handle window); -internal void os_window_set_minimized(OS_Handle window, B32 minimized); -internal void os_window_bring_to_front(OS_Handle window); -internal void os_window_set_monitor(OS_Handle window, OS_Handle monitor); -internal void os_window_clear_custom_border_data(OS_Handle handle); -internal void os_window_push_custom_title_bar(OS_Handle handle, F32 thickness); -internal void os_window_push_custom_edges(OS_Handle handle, F32 thickness); -internal void os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect); -internal Rng2F32 os_rect_from_window(OS_Handle window); -internal Rng2F32 os_client_rect_from_window(OS_Handle window); -internal F32 os_dpi_from_window(OS_Handle window); +internal OS_Window os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title); +internal void os_window_close(OS_Window window); +internal void os_window_set_title(OS_Window window, String8 title); +internal void os_window_first_paint(OS_Window window); +internal void os_window_focus(OS_Window window); +internal B32 os_window_is_focused(OS_Window window); +internal B32 os_window_is_fullscreen(OS_Window window); +internal void os_window_set_fullscreen(OS_Window window, B32 fullscreen); +internal B32 os_window_is_maximized(OS_Window window); +internal void os_window_set_maximized(OS_Window window, B32 maximized); +internal B32 os_window_is_minimized(OS_Window window); +internal void os_window_set_minimized(OS_Window window, B32 minimized); +internal void os_window_bring_to_front(OS_Window window); +internal void os_window_set_monitor(OS_Window window, OS_Monitor monitor); +internal void os_window_clear_custom_border_data(OS_Window handle); +internal void os_window_push_custom_title_bar(OS_Window handle, F32 thickness); +internal void os_window_push_custom_edges(OS_Window handle, F32 thickness); +internal void os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect); +internal Rng2F32 os_rect_from_window(OS_Window window); +internal Rng2F32 os_client_rect_from_window(OS_Window window); +internal F32 os_dpi_from_window(OS_Window window); //////////////////////////////// //~ rjf: @os_hooks External Windows (Implemented Per-OS) -internal OS_Handle os_focused_external_window(void); -internal void os_focus_external_window(OS_Handle handle); +internal OS_ExternalWindow os_focused_external_window(void); +internal void os_focus_external_window(OS_ExternalWindow ext_window); //////////////////////////////// //~ rjf: @os_hooks Monitors (Implemented Per-OS) -internal OS_HandleArray os_push_monitors_array(Arena *arena); -internal OS_Handle os_primary_monitor(void); -internal OS_Handle os_monitor_from_window(OS_Handle window); -internal String8 os_name_from_monitor(Arena *arena, OS_Handle monitor); -internal Vec2F32 os_dim_from_monitor(OS_Handle monitor); -internal F32 os_dpi_from_monitor(OS_Handle monitor); +internal OS_MonitorArray os_push_monitors_array(Arena *arena); +internal OS_Monitor os_primary_monitor(void); +internal OS_Monitor os_monitor_from_window(OS_Window window); +internal String8 os_name_from_monitor(Arena *arena, OS_Monitor monitor); +internal Vec2F32 os_dim_from_monitor(OS_Monitor monitor); +internal F32 os_dpi_from_monitor(OS_Monitor monitor); //////////////////////////////// //~ rjf: @os_hooks Events (Implemented Per-OS) @@ -186,7 +224,7 @@ internal void os_send_wakeup_event(void); internal OS_EventList os_get_events(Arena *arena, B32 wait); internal OS_Modifiers os_get_modifiers(void); internal B32 os_key_is_down(OS_Key key); -internal Vec2F32 os_mouse_from_window(OS_Handle window); +internal Vec2F32 os_mouse_from_window(OS_Window window); //////////////////////////////// //~ rjf: @os_hooks Cursors (Implemented Per-OS) diff --git a/src/os/gfx/win32/os_gfx_win32.c b/src/os/gfx/win32/os_gfx_win32.c index 4d7f7254..8ffa577d 100644 --- a/src/os/gfx/win32/os_gfx_win32.c +++ b/src/os/gfx/win32/os_gfx_win32.c @@ -32,15 +32,15 @@ os_w32_rng2f32_from_rect(RECT rect) //////////////////////////////// //~ rjf: Windows -internal OS_Handle +internal OS_Window os_w32_handle_from_window(OS_W32_Window *window) { - OS_Handle handle = {(U64)window}; + OS_Window handle = {(U64)window}; return handle; } internal OS_W32_Window * -os_w32_window_from_handle(OS_Handle handle) +os_w32_window_from_handle(OS_Window handle) { OS_W32_Window *window = (OS_W32_Window *)handle.u64[0]; return window; @@ -342,7 +342,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if(good) { OS_W32_Window *window = os_w32_window_from_hwnd(hwnd); - OS_Handle window_handle = os_w32_handle_from_window(window); + OS_Window window_handle = os_w32_handle_from_window(window); B32 release = 0; switch(uMsg) @@ -806,8 +806,11 @@ internal BOOL os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr) { OS_W32_MonitorGatherBundle *bundle = (OS_W32_MonitorGatherBundle *)bundle_ptr; - OS_Handle handle = {(U64)monitor}; - os_handle_list_push(bundle->arena, bundle->list, handle); + OS_Monitor m = {(U64)monitor}; + OS_W32_MonitorGatherNode *n = push_array(bundle->arena, OS_W32_MonitorGatherNode, 1); + n->v = m; + SLLQueuePush(bundle->first_monitor, bundle->last_monitor, n); + bundle->monitor_count += 1; return 1; } @@ -1052,7 +1055,7 @@ os_get_clipboard_text(Arena *arena) //////////////////////////////// //~ rjf: @os_hooks Windows (Implemented Per-OS) -internal OS_Handle +internal OS_Window os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) { B32 custom_border = !!(flags & OS_WindowFlag_CustomBorder); @@ -1116,19 +1119,19 @@ os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) } //- rjf: convert to handle + return - OS_Handle result = os_w32_handle_from_window(window); + OS_Window result = os_w32_handle_from_window(window); return result; } internal void -os_window_close(OS_Handle handle) +os_window_close(OS_Window handle) { OS_W32_Window *window = os_w32_window_from_handle(handle); os_w32_window_release(window); } internal void -os_window_set_title(OS_Handle handle, String8 title) +os_window_set_title(OS_Window handle, String8 title) { Temp scratch = scratch_begin(0, 0); OS_W32_Window *window = os_w32_window_from_handle(handle); @@ -1138,7 +1141,7 @@ os_window_set_title(OS_Handle handle, String8 title) } internal void -os_window_first_paint(OS_Handle window_handle) +os_window_first_paint(OS_Window window_handle) { OS_W32_Window *window = os_w32_window_from_handle(window_handle); window->first_paint_done = 1; @@ -1150,7 +1153,7 @@ os_window_first_paint(OS_Handle window_handle) } internal void -os_window_focus(OS_Handle handle) +os_window_focus(OS_Window handle) { OS_W32_Window *window = os_w32_window_from_handle(handle); SetForegroundWindow(window->hwnd); @@ -1158,7 +1161,7 @@ os_window_focus(OS_Handle handle) } internal B32 -os_window_is_focused(OS_Handle handle) +os_window_is_focused(OS_Window handle) { OS_W32_Window *window = os_w32_window_from_handle(handle); HWND active_hwnd = GetActiveWindow(); @@ -1166,7 +1169,7 @@ os_window_is_focused(OS_Handle handle) } internal B32 -os_window_is_fullscreen(OS_Handle handle) +os_window_is_fullscreen(OS_Window handle) { OS_W32_Window *window = os_w32_window_from_handle(handle); DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); @@ -1174,7 +1177,7 @@ os_window_is_fullscreen(OS_Handle handle) } internal void -os_window_set_fullscreen(OS_Handle handle, B32 fullscreen) +os_window_set_fullscreen(OS_Window handle, B32 fullscreen) { OS_W32_Window *window = os_w32_window_from_handle(handle); DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); @@ -1208,7 +1211,7 @@ os_window_set_fullscreen(OS_Handle handle, B32 fullscreen) } internal B32 -os_window_is_maximized(OS_Handle handle) +os_window_is_maximized(OS_Window handle) { B32 result = 0; OS_W32_Window *window = os_w32_window_from_handle(handle); @@ -1220,7 +1223,7 @@ os_window_is_maximized(OS_Handle handle) } internal void -os_window_set_maximized(OS_Handle handle, B32 maximized) +os_window_set_maximized(OS_Window handle, B32 maximized) { OS_W32_Window *window = os_w32_window_from_handle(handle); if(window != 0) @@ -1242,7 +1245,7 @@ os_window_set_maximized(OS_Handle handle, B32 maximized) } internal B32 -os_window_is_minimized(OS_Handle handle) +os_window_is_minimized(OS_Window handle) { B32 result = 0; OS_W32_Window *window = os_w32_window_from_handle(handle); @@ -1254,7 +1257,7 @@ os_window_is_minimized(OS_Handle handle) } internal void -os_window_set_minimized(OS_Handle handle, B32 minimized) +os_window_set_minimized(OS_Window handle, B32 minimized) { OS_W32_Window *window = os_w32_window_from_handle(handle); if(window != 0 && minimized != os_window_is_minimized(handle)) @@ -1269,7 +1272,7 @@ os_window_set_minimized(OS_Handle handle, B32 minimized) } internal void -os_window_bring_to_front(OS_Handle handle) +os_window_bring_to_front(OS_Window handle) { OS_W32_Window *window = os_w32_window_from_handle(handle); if(window != 0) @@ -1279,7 +1282,7 @@ os_window_bring_to_front(OS_Handle handle) } internal void -os_window_set_monitor(OS_Handle window_handle, OS_Handle monitor) +os_window_set_monitor(OS_Window window_handle, OS_Monitor monitor) { OS_W32_Window *window = os_w32_window_from_handle(window_handle); HMONITOR hmonitor = (HMONITOR)monitor.u64[0]; @@ -1300,7 +1303,7 @@ os_window_set_monitor(OS_Handle window_handle, OS_Handle monitor) } internal void -os_window_clear_custom_border_data(OS_Handle handle) +os_window_clear_custom_border_data(OS_Window handle) { OS_W32_Window *window = os_w32_window_from_handle(handle); if(window->custom_border) @@ -1313,21 +1316,21 @@ os_window_clear_custom_border_data(OS_Handle handle) } internal void -os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) +os_window_push_custom_title_bar(OS_Window handle, F32 thickness) { OS_W32_Window *window = os_w32_window_from_handle(handle); window->custom_border_title_thickness = thickness; } internal void -os_window_push_custom_edges(OS_Handle handle, F32 thickness) +os_window_push_custom_edges(OS_Window handle, F32 thickness) { OS_W32_Window *window = os_w32_window_from_handle(handle); window->custom_border_edge_thickness = thickness; } internal void -os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) +os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect) { OS_W32_Window *window = os_w32_window_from_handle(handle); if(window->custom_border) @@ -1342,7 +1345,7 @@ os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) } internal Rng2F32 -os_rect_from_window(OS_Handle handle) +os_rect_from_window(OS_Window handle) { Rng2F32 r = {0}; OS_W32_Window *window = os_w32_window_from_handle(handle); @@ -1356,7 +1359,7 @@ os_rect_from_window(OS_Handle handle) } internal Rng2F32 -os_client_rect_from_window(OS_Handle handle) +os_client_rect_from_window(OS_Window handle) { Rng2F32 r = {0}; OS_W32_Window *window = os_w32_window_from_handle(handle); @@ -1370,7 +1373,7 @@ os_client_rect_from_window(OS_Handle handle) } internal F32 -os_dpi_from_window(OS_Handle handle) +os_dpi_from_window(OS_Window handle) { F32 result = 96.f; OS_W32_Window *window = os_w32_window_from_handle(handle); @@ -1384,16 +1387,16 @@ os_dpi_from_window(OS_Handle handle) //////////////////////////////// //~ rjf: @os_hooks External Windows (Implemented Per-OS) -internal OS_Handle +internal OS_ExternalWindow os_focused_external_window(void) { HWND hwnd = GetForegroundWindow(); - OS_Handle result = {(U64)hwnd}; + OS_ExternalWindow result = {(U64)hwnd}; return result; } internal void -os_focus_external_window(OS_Handle handle) +os_focus_external_window(OS_ExternalWindow handle) { HWND hwnd = (HWND)handle.u64[0]; if(hwnd != 0) @@ -1406,40 +1409,47 @@ os_focus_external_window(OS_Handle handle) //////////////////////////////// //~ rjf: @os_hooks Monitors (Implemented Per-OS) -internal OS_HandleArray +internal OS_MonitorArray os_push_monitors_array(Arena *arena) { Temp scratch = scratch_begin(&arena, 1); - OS_HandleList list = {0}; + OS_W32_MonitorGatherBundle bundle = {arena}; + EnumDisplayMonitors(0, 0, os_w32_monitor_gather_enum_proc, (LPARAM)&bundle); + OS_MonitorArray array = {0}; + array.count = bundle.monitor_count; + array.v = push_array(arena, OS_Monitor, array.count); { - OS_W32_MonitorGatherBundle bundle = {arena, &list}; - EnumDisplayMonitors(0, 0, os_w32_monitor_gather_enum_proc, (LPARAM)&bundle); + U64 idx = 0; + for EachNode(n, OS_W32_MonitorGatherNode, bundle.first_monitor) + { + array.v[idx] = n->v; + idx += 1; + } } - OS_HandleArray array = os_handle_array_from_list(arena, &list); scratch_end(scratch); return array; } -internal OS_Handle +internal OS_Monitor os_primary_monitor(void) { POINT zero_pt = {0, 0}; HMONITOR monitor = MonitorFromPoint(zero_pt, MONITOR_DEFAULTTOPRIMARY); - OS_Handle result = {(U64)monitor}; + OS_Monitor result = {(U64)monitor}; return result; } -internal OS_Handle -os_monitor_from_window(OS_Handle window) +internal OS_Monitor +os_monitor_from_window(OS_Window window) { OS_W32_Window *w = os_w32_window_from_handle(window); HMONITOR handle = MonitorFromWindow(w->hwnd, MONITOR_DEFAULTTOPRIMARY); - OS_Handle result = {(U64)handle}; + OS_Monitor result = {(U64)handle}; return result; } internal String8 -os_name_from_monitor(Arena *arena, OS_Handle monitor) +os_name_from_monitor(Arena *arena, OS_Monitor monitor) { String8 result = {0}; HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; @@ -1454,7 +1464,7 @@ os_name_from_monitor(Arena *arena, OS_Handle monitor) } internal Vec2F32 -os_dim_from_monitor(OS_Handle monitor) +os_dim_from_monitor(OS_Monitor monitor) { Vec2F32 result = {0}; HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; @@ -1469,7 +1479,7 @@ os_dim_from_monitor(OS_Handle monitor) } internal F32 -os_dpi_from_monitor(OS_Handle monitor) +os_dpi_from_monitor(OS_Monitor monitor) { F32 result = 96.f; HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; @@ -1546,7 +1556,7 @@ os_key_is_down(OS_Key key) } internal Vec2F32 -os_mouse_from_window(OS_Handle handle) +os_mouse_from_window(OS_Window handle) { ProfBeginFunction(); Vec2F32 v = {0}; diff --git a/src/os/gfx/win32/os_gfx_win32.h b/src/os/gfx/win32/os_gfx_win32.h index 82c03278..8dc95691 100644 --- a/src/os/gfx/win32/os_gfx_win32.h +++ b/src/os/gfx/win32/os_gfx_win32.h @@ -54,11 +54,20 @@ struct OS_W32_Window //////////////////////////////// //~ rjf: Monitor Gathering Bundle +typedef struct OS_W32_MonitorGatherNode OS_W32_MonitorGatherNode; +struct OS_W32_MonitorGatherNode +{ + OS_W32_MonitorGatherNode *next; + OS_Monitor v; +}; + typedef struct OS_W32_MonitorGatherBundle OS_W32_MonitorGatherBundle; struct OS_W32_MonitorGatherBundle { Arena *arena; - OS_HandleList *list; + OS_W32_MonitorGatherNode *first_monitor; + OS_W32_MonitorGatherNode *last_monitor; + U64 monitor_count; }; //////////////////////////////// @@ -95,8 +104,8 @@ internal Rng2F32 os_w32_rng2f32_from_rect(RECT rect); //////////////////////////////// //~ rjf: Windows -internal OS_Handle os_w32_handle_from_window(OS_W32_Window *window); -internal OS_W32_Window * os_w32_window_from_handle(OS_Handle window); +internal OS_Window os_w32_handle_from_window(OS_W32_Window *window); +internal OS_W32_Window * os_w32_window_from_handle(OS_Window window); internal OS_W32_Window * os_w32_window_from_hwnd(HWND hwnd); internal HWND os_w32_hwnd_from_window(OS_W32_Window *window); internal OS_W32_Window * os_w32_window_alloc(void); diff --git a/src/os/os_inc.c b/src/os/os_inc.c index 37c3e2aa..555089ca 100644 --- a/src/os/os_inc.c +++ b/src/os/os_inc.c @@ -1,13 +1,13 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#include "os/core/os_core.c" +// #include "os/core/os_core.c" #if OS_FEATURE_GRAPHICAL # include "os/gfx/os_gfx.c" #endif #if OS_WINDOWS -# include "os/core/win32/os_core_win32.c" +// # include "os/core/win32/os_core_win32.c" #elif OS_LINUX # include "os/core/linux/os_core_linux.c" #else diff --git a/src/os/os_inc.h b/src/os/os_inc.h index d581fe6a..233b55d3 100644 --- a/src/os/os_inc.h +++ b/src/os/os_inc.h @@ -12,13 +12,13 @@ # define OS_GFX_STUB 0 #endif -#include "os/core/os_core.h" +// #include "os/core/os_core.h" #if OS_FEATURE_GRAPHICAL # include "os/gfx/os_gfx.h" #endif #if OS_WINDOWS -# include "os/core/win32/os_core_win32.h" +// # include "os/core/win32/os_core_win32.h" #elif OS_LINUX # include "os/core/linux/os_core_linux.h" #else diff --git a/src/pe/pe.c b/src/pe/pe.c index 2a967c2c..85d9ed17 100644 --- a/src/pe/pe.c +++ b/src/pe/pe.c @@ -520,10 +520,6 @@ pe_bin_info_from_data(Arena *arena, String8 data) reported_data_dir_offset = sizeof(*pe_optional); reported_data_dir_count = pe_optional->data_dir_count; } - else - { - Assert(!"unable to read PE Optional Header"); - } }break; case PE_PE32PLUS_MAGIC: { @@ -539,10 +535,6 @@ pe_bin_info_from_data(Arena *arena, String8 data) reported_data_dir_offset = sizeof(*pe_optional); reported_data_dir_count = pe_optional->data_dir_count; } - else - { - Assert(!"unable to read PE Optional Plus Header"); - } }break; } @@ -561,10 +553,6 @@ pe_bin_info_from_data(Arena *arena, String8 data) U64 file_off = coff_foff_from_voff(sections, clamped_sec_count, dir.virt_off); data_dir_franges[dir_idx] = r1u64(file_off, file_off+dir.virt_size); } - else - { - Assert(!"unable to read data directory"); - } } // export virtual directory ranges @@ -577,10 +565,6 @@ pe_bin_info_from_data(Arena *arena, String8 data) { data_dir_vranges[dir_idx] = r1u64(dir.virt_off, dir.virt_off+dir.virt_size); } - else - { - Assert(!"unable to read data directory"); - } } // export directory range @@ -608,17 +592,12 @@ pe_bin_info_from_data(Arena *arena, String8 data) tls_header.zero_fill_size = (U64)tls_header32.zero_fill_size; tls_header.characteristics = (U64)tls_header32.characteristics; } - else - { - Assert(!"unable to read TLS Header 32"); - } }break; case COFF_MachineType_X64: { if(str8_deserial_read_struct(data, tls_header_frng.min, &tls_header) != sizeof(tls_header)) { MemoryZeroStruct(&tls_header); - Assert(!"unable to read TLS Header 64"); } }break; } diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 92d142f2..734a6d85 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -13,7 +13,7 @@ internal void rb_entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0, 0); - U64 threads_count = os_get_system_info()->logical_processor_count; + U64 threads_count = get_system_info()->logical_processor_count; String8 threads_count_from_cmdline_string = cmd_line_string(cmdline, str8_lit("thread_count")); if(threads_count_from_cmdline_string.size != 0) { @@ -70,7 +70,7 @@ rb_thread_entry_point(void *p) // ProfScope("analyze & load command line input files") if(lane_idx() == 0) { - String8 working_directory = os_get_current_path(arena); + String8 working_directory = get_current_path(arena); String8List input_file_path_tasks = str8_list_copy(arena, &cmdline->inputs); for(String8Node *n = input_file_path_tasks.first; n != 0; n = n->next) { @@ -93,14 +93,14 @@ rb_thread_entry_point(void *p) RB_FileFormatFlags file_format_flags = 0; ProfScope("do thin analysis of file") { - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, input_file_path); - FileProperties props = os_properties_from_file(file); + File file = file_open(AccessFlag_Read|AccessFlag_ShareRead, input_file_path); + FileProperties props = properties_from_file(file); //- rjf: PDB magic -> PDB input if(file_format == RB_FileFormat_Null) { U8 msf20_magic_maybe[sizeof(msf_msf20_magic)] = {0}; - os_file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe); + file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe); if(MemoryMatch(msf20_magic_maybe, msf_msf20_magic, sizeof(msf20_magic_maybe))) { file_format = RB_FileFormat_PDB; @@ -109,7 +109,7 @@ rb_thread_entry_point(void *p) if(file_format == RB_FileFormat_Null) { U8 msf70_magic_maybe[sizeof(msf_msf70_magic)] = {0}; - os_file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe); + file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe); if(MemoryMatch(msf70_magic_maybe, msf_msf70_magic, sizeof(msf70_magic_maybe))) { file_format = RB_FileFormat_PDB; @@ -120,11 +120,11 @@ rb_thread_entry_point(void *p) if(file_format == RB_FileFormat_Null) { PE_DosHeader dos_header_maybe = {0}; - os_file_read_struct(file, 0, &dos_header_maybe); + file_read_struct(file, 0, &dos_header_maybe); if(dos_header_maybe.magic == PE_DOS_MAGIC) { U32 pe_magic_maybe = 0; - os_file_read_struct(file, dos_header_maybe.coff_file_offset, &pe_magic_maybe); + file_read_struct(file, dos_header_maybe.coff_file_offset, &pe_magic_maybe); if(pe_magic_maybe == PE_MAGIC) { file_format = RB_FileFormat_PE; @@ -136,7 +136,7 @@ rb_thread_entry_point(void *p) if(file_format == RB_FileFormat_Null) { U8 coff_archive_sig_maybe[sizeof(g_coff_archive_sig)] = {0}; - os_file_read(file, r1u64(0, sizeof(coff_archive_sig_maybe)), coff_archive_sig_maybe); + file_read(file, r1u64(0, sizeof(coff_archive_sig_maybe)), coff_archive_sig_maybe); if(MemoryMatch(coff_archive_sig_maybe, g_coff_archive_sig, sizeof(g_coff_archive_sig))) { file_format = RB_FileFormat_COFF_Archive; @@ -145,7 +145,7 @@ rb_thread_entry_point(void *p) if(file_format == RB_FileFormat_Null) { U8 coff_thin_archive_sig_maybe[sizeof(g_coff_thin_archive_sig)] = {0}; - os_file_read(file, r1u64(0, sizeof(coff_thin_archive_sig_maybe)), coff_thin_archive_sig_maybe); + file_read(file, r1u64(0, sizeof(coff_thin_archive_sig_maybe)), coff_thin_archive_sig_maybe); if(MemoryMatch(coff_thin_archive_sig_maybe, g_coff_thin_archive_sig, sizeof(g_coff_thin_archive_sig))) { file_format = RB_FileFormat_COFF_ThinArchive; @@ -156,7 +156,7 @@ rb_thread_entry_point(void *p) if(file_format == RB_FileFormat_Null) { COFF_BigObjHeader header_maybe = {0}; - os_file_read_struct(file, 0, &header_maybe); + file_read_struct(file, 0, &header_maybe); if(header_maybe.sig1 == COFF_MachineType_Unknown && header_maybe.sig2 == max_U16 && header_maybe.version >= 2 && @@ -169,7 +169,7 @@ rb_thread_entry_point(void *p) { Temp scratch = scratch_begin(&arena, 1); COFF_FileHeader header_maybe = {0}; - os_file_read_struct(file, 0, &header_maybe); + file_read_struct(file, 0, &header_maybe); U64 section_count = header_maybe.section_count; U64 section_hdr_opl_off = sizeof(header_maybe) + section_count*sizeof(COFF_SectionHeader); @@ -202,7 +202,7 @@ rb_thread_entry_point(void *p) if(props.size >= section_hdr_opl_off) { COFF_SectionHeader *section_hdrs = push_array(scratch.arena, COFF_SectionHeader, section_count); - os_file_read(file, r1u64(sizeof(header_maybe), sizeof(header_maybe) + section_count*sizeof(COFF_SectionHeader)), section_hdrs); + file_read(file, r1u64(sizeof(header_maybe), sizeof(header_maybe) + section_count*sizeof(COFF_SectionHeader)), section_hdrs); B32 section_ranges_valid = 1; for EachIndex(section_hdr_idx, section_count) { @@ -252,7 +252,7 @@ rb_thread_entry_point(void *p) if(file_format == RB_FileFormat_Null) { U8 identifier_maybe[ELF_Identifier_Max] = {0}; - os_file_read(file, r1u64(0, sizeof(identifier_maybe)), identifier_maybe); + file_read(file, r1u64(0, sizeof(identifier_maybe)), identifier_maybe); B32 is_elf_magic = (identifier_maybe[ELF_Identifier_Mag0] == 0x7f && identifier_maybe[ELF_Identifier_Mag1] == 'E' && identifier_maybe[ELF_Identifier_Mag2] == 'L' && @@ -267,14 +267,14 @@ rb_thread_entry_point(void *p) if(file_format == RB_FileFormat_Null) { RDI_Header rdi_header_maybe = {0}; - os_file_read_struct(file, 0, &rdi_header_maybe); + file_read_struct(file, 0, &rdi_header_maybe); if(rdi_header_maybe.magic == RDI_MAGIC_CONSTANT) { file_format = RB_FileFormat_RDI; } } - os_file_close(file); + file_close(file); } ////////////////////////// @@ -295,7 +295,7 @@ rb_thread_entry_point(void *p) String8 file_data = {0}; if(file_format != RB_FileFormat_Null) ProfScope("load recognized file") { - file_data = os_data_from_file_path(arena, input_file_path); + file_data = data_from_file_path(arena, input_file_path); } ////////////////////////// @@ -1593,7 +1593,7 @@ rb_thread_entry_point(void *p) { if(output_path.size != 0) ProfScope("write outputs [file]") { - B32 is_written = os_write_data_list_to_file_path(output_path, output_blobs); + B32 is_written = write_data_list_to_file_path(output_path, output_blobs); if(is_written) { log_infof("Results written to %S", output_path); diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 7d6db3f5..ee14fe07 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -33,6 +33,7 @@ #include "pdb/pdb.h" #include "pdb/pdb_parse.h" #include "pdb/pdb_stringize.h" +#include "arch/arch_inc.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" @@ -63,6 +64,7 @@ #include "pdb/pdb.c" #include "pdb/pdb_parse.c" #include "pdb/pdb_stringize.c" +#include "arch/arch_inc.c" #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 966d78ad..334826b6 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -784,7 +784,8 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) } if(regs_block != 0) { - U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch); + ARCH_Info *arch_info = arch_info_from_arch(entity->arch); + U64 regs_size = arch_info->reg_block_size; Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 read_range = intersect_1u64(legal_range, range); U64 read_size = dim_1u64(read_range); @@ -1013,7 +1014,8 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) case D_EntityKind_Thread: { Temp scratch = scratch_begin(0, 0); - U64 regs_size = regs_block_size_from_arch(entity->arch); + ARCH_Info *arch_info = arch_info_from_arch(entity->arch); + U64 regs_size = arch_info->reg_block_size; Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 write_range = intersect_1u64(legal_range, range); U64 write_size = dim_1u64(write_range); @@ -1186,7 +1188,7 @@ rd_whole_range_from_eval_space(E_Space space) { U64 file_path_string_id = space.u64_0; String8 file_path = e_string_from_id(file_path_string_id); - FileProperties props = os_properties_from_file_path(file_path); + FileProperties props = properties_from_file_path(file_path); result = r1u64(0, props.size); }break; case D_EvalSpaceKind_Entity: @@ -4935,7 +4937,7 @@ rd_window_state_from_cfg(CFG_Node *cfg) B32 has_pos = 0; Vec2F32 pos = {0}; Vec2F32 size = {0}; - OS_Handle preferred_monitor = {0}; + OS_Monitor preferred_monitor = {0}; { CFG_Node *pos_cfg = cfg_node_child_from_string(window_cfg, str8_lit("pos")); has_pos = (pos_cfg != &cfg_nil_node); @@ -4945,7 +4947,7 @@ rd_window_state_from_cfg(CFG_Node *cfg) pos.y = (F32)f64_from_str8(pos_cfg->first->next->string); size.x = (F32)f64_from_str8(size_cfg->first->string); size.y = (F32)f64_from_str8(size_cfg->first->next->string); - OS_HandleArray monitors = os_push_monitors_array(scratch.arena); + OS_MonitorArray monitors = os_push_monitors_array(scratch.arena); for EachIndex(idx, monitors.count) { String8 monitor_name = os_name_from_monitor(scratch.arena, monitors.v[idx]); @@ -4983,8 +4985,8 @@ rd_window_state_from_cfg(CFG_Node *cfg) ws->hover_eval_arena = arena_alloc(); ws->autocomp_arena = arena_alloc(); ws->last_dpi = os_dpi_from_window(ws->os); - OS_Handle zero_monitor = {0}; - if(!os_handle_match(zero_monitor, preferred_monitor)) + OS_Monitor zero_monitor = {0}; + if(!os_monitor_match(zero_monitor, preferred_monitor)) { os_window_set_monitor(ws->os, preferred_monitor); } @@ -5019,7 +5021,7 @@ rd_window_state_from_cfg(CFG_Node *cfg) } internal RD_WindowState * -rd_window_state_from_os_handle(OS_Handle os) +rd_window_state_from_os_handle(OS_Window os) { RD_WindowState *ws = &rd_nil_window_state; { @@ -5027,7 +5029,7 @@ rd_window_state_from_os_handle(OS_Handle os) w != &rd_nil_window_state; w = w->order_next) { - if(os_handle_match(w->os, os)) + if(os_window_match(w->os, os)) { ws = w; break; @@ -5343,7 +5345,7 @@ rd_window_frame(void) //- rjf: commit monitor if(!is_minimized) { - OS_Handle monitor = os_monitor_from_window(ws->os); + OS_Monitor monitor = os_monitor_from_window(ws->os); String8 monitor_name = os_name_from_monitor(scratch.arena, monitor); CFG_Node *monitor_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit("monitor")); if(!str8_match(monitor_root->first->string, monitor_name, 0)) @@ -5478,7 +5480,7 @@ rd_window_frame(void) case RD_RegSlot_FilePath: UI_Tooltip { - FileProperties props = os_properties_from_file_path(regs->file_path); + FileProperties props = properties_from_file_path(regs->file_path); ui_set_next_pref_width(ui_children_sum(1)); UI_Row { @@ -9434,11 +9436,11 @@ rd_theme_tree_from_name(Arena *arena, Access *access, String8 theme_name) } if(theme_tree == &md_nil_node) { - String8 path = push_str8f(scratch.arena, "%S/raddbg/themes/%S", os_get_process_info()->user_program_data_path, theme_name); - U64 endt_us = os_now_microseconds()+100; + String8 path = str8f(scratch.arena, "%S/raddbg/themes/%S", get_process_info()->user_program_data_path, theme_name); + U64 endt_us = now_time_us()+100; if(rd_state->frame_index <= 5) { - endt_us = os_now_microseconds()+50000; + endt_us = now_time_us()+50000; } U128 hash = fs_hash_from_path_range(path, r1u64(0, max_U64), endt_us); String8 data = c_data_from_hash(access, hash); @@ -9515,17 +9517,6 @@ rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 } } - // rjf: try to map as register alias - if(!mapped) - { - U64 alias_num = e_num_from_string(e_ir_ctx->reg_alias_map, string); - if(alias_num != 0) - { - mapped = 1; - color = RD_CodeColorSlot_CodeRegister; - } - } - // rjf: try to map as macro if((!mapped || is_called) && allow_macros) { @@ -10100,11 +10091,11 @@ rd_init(CmdLine *cmdln) log_select(rd_state->log); { Temp scratch = scratch_begin(0, 0); - String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_program_data_path = get_process_info()->user_program_data_path; String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); rd_state->log_path = push_str8f(rd_state->arena, "%S/ui_thread.raddbg_log", user_data_folder); - os_make_directory(user_data_folder); - os_write_data_to_file_path(rd_state->log_path, str8_zero()); + make_directory(user_data_folder); + write_data_to_file_path(rd_state->log_path, str8_zero()); scratch_end(scratch); } rd_state->num_frames_requested = 2; @@ -10214,17 +10205,17 @@ rd_init(CmdLine *cmdln) B32 is_cfg = 0; if(!is_flag && !after_first_non_flag) { - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, arg); + File file = file_open(AccessFlag_Read|AccessFlag_ShareRead, arg); U8 raddbg_cfg_magic[] = "// raddbg "; U8 file_magic_maybe[ArrayCount(raddbg_cfg_magic)] = {0}; - os_file_read(file, r1u64(0, 10), file_magic_maybe); + file_read(file, r1u64(0, 10), file_magic_maybe); if(MemoryMatchArray(raddbg_cfg_magic, file_magic_maybe)) { is_cfg = 1; U8 header_suffix_buffer[256] = {0}; String8 header_suffix = {0}; header_suffix.str = header_suffix_buffer; - header_suffix.size = os_file_read(file, r1u64(10, 10+256), header_suffix_buffer); + header_suffix.size = file_read(file, r1u64(10, 10+256), header_suffix_buffer); String8 header_type_suffix = str8_skip(header_suffix, str8_find_needle(header_suffix, 0, str8_lit(" "), 0)+1); if(str8_match(header_type_suffix, str8_lit("user"), StringMatchFlag_RightSideSloppy)) { @@ -10235,7 +10226,7 @@ rd_init(CmdLine *cmdln) implicit_project_arg = arg; } } - os_file_close(file); + file_close(file); } if(!is_flag) { @@ -10261,7 +10252,7 @@ rd_init(CmdLine *cmdln) PathStyle style = path_style_from_str8(exe_name); if(style == PathStyle_Relative) { - String8 current_path = os_get_current_path(scratch.arena); + String8 current_path = get_current_path(scratch.arena); exe_name = push_str8f(scratch.arena, "%S/%S", current_path, exe_name); exe_name = path_normalized_from_string(scratch.arena, exe_name); } @@ -10270,7 +10261,7 @@ rd_init(CmdLine *cmdln) // rjf: get current directory, use as working directory { - working_directory_string = path_normalized_from_string(scratch.arena, os_get_current_path(scratch.arena)); + working_directory_string = path_normalized_from_string(scratch.arena, get_current_path(scratch.arena)); } // rjf: unpack arguments @@ -10314,17 +10305,17 @@ rd_init(CmdLine *cmdln) { if(user_path.size != 0) { - user_path = path_absolute_dst_from_relative_dst_src(scratch.arena, user_path, os_get_process_info()->initial_path); + user_path = path_absolute_dst_from_relative_dst_src(scratch.arena, user_path, get_process_info()->initial_path); } if(project_path.size != 0) { - project_path = path_absolute_dst_from_relative_dst_src(scratch.arena, project_path, os_get_process_info()->initial_path); + project_path = path_absolute_dst_from_relative_dst_src(scratch.arena, project_path, get_process_info()->initial_path); } } { - String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_program_data_path = get_process_info()->user_program_data_path; String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg", user_program_data_path); - os_make_directory(user_data_folder); + make_directory(user_data_folder); if(user_path.size == 0) { user_path = implicit_user_arg; @@ -10332,7 +10323,7 @@ rd_init(CmdLine *cmdln) if(user_path.size == 0) { String8 last_user_path = push_str8f(scratch.arena, "%S/last_user", user_data_folder); - user_path = os_data_from_file_path(scratch.arena, last_user_path); + user_path = data_from_file_path(scratch.arena, last_user_path); } if(user_path.size == 0) { @@ -10837,7 +10828,7 @@ rd_frame(void) if(frame_time_history_avg_us < frame_time_target_cap_us) { U64 spare_time = (frame_time_target_cap_us - frame_time_history_avg_us) + 4000; - rd_state->frame_eval_memread_endt_us = os_now_microseconds() + spare_time; + rd_state->frame_eval_memread_endt_us = now_time_us() + spare_time; } } @@ -10849,19 +10840,19 @@ rd_frame(void) ////////////////////////////// //- rjf: begin measuring actual per-frame work // - U64 begin_time_us = os_now_microseconds(); + U64 begin_time_us = now_time_us(); ////////////////////////////// //- rjf: bind change // if(!rd_state->popup_active && rd_state->bind_change_active) { - if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Esc)) + if(os_key_press(&events, os_window_zero(), 0, OS_Key_Esc)) { rd_request_frame(); rd_state->bind_change_active = 0; } - if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete)) + if(os_key_press(&events, os_window_zero(), 0, OS_Key_Delete)) { rd_request_frame(); cfg_node_release(rd_state->cfg, cfg_node_from_id(rd_state->bind_change_binding_id)); @@ -12042,7 +12033,6 @@ rd_frame(void) { E_IRCtx *ctx = ir_ctx; ctx->regs_map = d_string2reg_from_arch(eval_base_ctx->primary_module->arch); - ctx->reg_alias_map = d_string2alias_from_arch(eval_base_ctx->primary_module->arch); ctx->locals_map = d_query_cached_locals_map_from_dbgi_key_voff(eval_base_ctx->primary_dbg_info->dbgi_key, rip_voff); ctx->member_map = d_query_cached_member_map_from_dbgi_key_voff(eval_base_ctx->primary_dbg_info->dbgi_key, rip_voff); ctx->macro_map = macro_map; @@ -12286,7 +12276,7 @@ rd_frame(void) String8 current_path_string = current_path->first->string; if(current_path_string.size == 0) { - current_path_string = path_normalized_from_string(scratch.arena, os_get_current_path(scratch.arena)); + current_path_string = path_normalized_from_string(scratch.arena, get_current_path(scratch.arena)); } String8 file_path = os_graphical_pick_file(scratch.arena, current_path_string); file_path = path_normalized_from_string(scratch.arena, file_path); @@ -12506,8 +12496,8 @@ rd_frame(void) //- rjf: load the new file's data String8 file_path = rd_regs()->file_path; - String8 file_data = os_data_from_file_path(scratch.arena, file_path); - FileProperties file_props = os_properties_from_file_path(file_path); + String8 file_data = data_from_file_path(scratch.arena, file_path); + FileProperties file_props = properties_from_file_path(file_path); //- rjf: determine if the file is good B32 file_is_okay = 0; @@ -12593,7 +12583,7 @@ rd_frame(void) CFG_NodePtrList all_user_windows = cfg_node_child_list_from_string(scratch.arena, file_root, str8_lit("window")); if(all_user_windows.count == 0) { - OS_Handle monitor = os_primary_monitor(); + OS_Monitor monitor = os_primary_monitor(); String8 monitor_name = os_name_from_monitor(scratch.arena, monitor); Vec2F32 monitor_dim = os_dim_from_monitor(monitor); F32 monitor_dpi = os_dpi_from_monitor(monitor); @@ -12676,9 +12666,9 @@ rd_frame(void) String8 project_path = rd_path_from_cfg(recent_project); if(project_path.size == 0) { - String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_program_data_path = get_process_info()->user_program_data_path; String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); - os_make_directory(user_data_folder); + make_directory(user_data_folder); project_path = push_str8f(scratch.arena, "%S/default.raddbg_project", user_data_folder); } rd_cmd(RD_CmdKind_OpenProject, .file_path = project_path); @@ -12688,7 +12678,7 @@ rd_frame(void) case RD_CmdKind_NewProject: { String8 new_path = rd_regs()->file_path; - B32 file_will_be_overwritten = (os_properties_from_file_path(new_path).created != 0); + B32 file_will_be_overwritten = (properties_from_file_path(new_path).created != 0); UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("new_config_overwrite_confirm")); if(file_will_be_overwritten && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) { @@ -12707,12 +12697,12 @@ rd_frame(void) default:{}break; case RD_CmdKind_NewUser: { - os_delete_file_at_path(new_path); + delete_file_at_path(new_path); rd_cmd(RD_CmdKind_OpenUser, .file_path = new_path); }break; case RD_CmdKind_NewProject: { - os_delete_file_at_path(new_path); + delete_file_at_path(new_path); rd_cmd(RD_CmdKind_OpenProject, .file_path = new_path); }break; } @@ -12721,7 +12711,7 @@ rd_frame(void) case RD_CmdKind_SaveProject: { String8 new_path = rd_regs()->file_path; - B32 file_will_be_overwritten = (os_properties_from_file_path(new_path).created != 0); + B32 file_will_be_overwritten = (properties_from_file_path(new_path).created != 0); UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("save_config_overwrite_confirm")); if(file_will_be_overwritten && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) { @@ -12785,8 +12775,8 @@ rd_frame(void) case RD_CmdKind_RecordUserAsLastOpened: { String8 file_path = rd_regs()->file_path; - String8 last_user_path = push_str8f(scratch.arena, "%S/raddbg/last_user", os_get_process_info()->user_program_data_path); - os_write_data_to_file_path(last_user_path, file_path); + String8 last_user_path = str8f(scratch.arena, "%S/raddbg/last_user", get_process_info()->user_program_data_path); + write_data_to_file_path(last_user_path, file_path); }break; //- rjf: writing config changes @@ -12794,7 +12784,7 @@ rd_frame(void) case RD_CmdKind_WriteProjectData: dst_path = rd_state->project_path; bucket_name = str8_lit("project"); goto write; write:; { - B32 dst_exists = (os_properties_from_file_path(dst_path).created != 0); + B32 dst_exists = (properties_from_file_path(dst_path).created != 0); String8 temp_path = push_str8f(scratch.arena, "%S.temp", dst_path); String8 overwritten_path = push_str8f(scratch.arena, "%S.old", dst_path); CFG_Node *tree_root = cfg_node_child_from_string(cfg_node_root(), bucket_name); @@ -12805,17 +12795,17 @@ rd_frame(void) str8_list_push(scratch.arena, &strings, cfg_string_from_tree(scratch.arena, rd_state->cfg_schema_table, str8_chop_last_slash(dst_path), child)); } String8 data = str8_list_join(scratch.arena, &strings, 0); - B32 temp_write_good = os_write_data_to_file_path(temp_path, data); - B32 old_del_good = (temp_write_good && os_delete_file_at_path(overwritten_path)); - B32 old_move_good = (temp_write_good && (!dst_exists || os_move_file_path(overwritten_path, dst_path))); - B32 new_move_good = (old_move_good && os_move_file_path(dst_path, temp_path)); + B32 temp_write_good = write_data_to_file_path(temp_path, data); + B32 old_del_good = (temp_write_good && delete_file_at_path(overwritten_path)); + B32 old_move_good = (temp_write_good && (!dst_exists || move_file_path(overwritten_path, dst_path))); + B32 new_move_good = (old_move_good && move_file_path(dst_path, temp_path)); if(new_move_good && dst_exists) { - os_delete_file_at_path(overwritten_path); + delete_file_at_path(overwritten_path); } else if(!new_move_good && old_move_good && dst_exists) { - os_move_file_path(dst_path, overwritten_path); + move_file_path(dst_path, overwritten_path); } }break; @@ -13639,8 +13629,8 @@ rd_frame(void) //- rjf: files case RD_CmdKind_Open: { - String8 path = path_absolute_dst_from_relative_dst_src(scratch.arena, rd_regs()->file_path, os_get_current_path(scratch.arena)); - FileProperties props = os_properties_from_file_path(path); + String8 path = path_absolute_dst_from_relative_dst_src(scratch.arena, rd_regs()->file_path, get_current_path(scratch.arena)); + FileProperties props = properties_from_file_path(path); if(props.created != 0) { rd_cmd(RD_CmdKind_RecordFileInProject); @@ -13686,9 +13676,9 @@ rd_frame(void) { if(!str8_match(partner_ext_candidates[idx], file_ext, StringMatchFlag_CaseInsensitive)) { - String8 candidate = push_str8f(scratch.arena, "%S.%S", file_name, partner_ext_candidates[idx]); - String8 candidate_path = push_str8f(scratch.arena, "%S/%S", file_folder, candidate); - FileProperties candidate_props = os_properties_from_file_path(candidate_path); + String8 candidate = str8f(scratch.arena, "%S.%S", file_name, partner_ext_candidates[idx]); + String8 candidate_path = str8f(scratch.arena, "%S/%S", file_folder, candidate); + FileProperties candidate_props = properties_from_file_path(candidate_path); if(candidate_props.modified != 0) { rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = candidate_path, .cursor = txt_pt(0, 0), .vaddr = 0, .prefer_new_tab = 1); @@ -14173,7 +14163,7 @@ rd_frame(void) str8_list_push(temp.arena, &try_path_parts, try_n->string); } String8 try_path = str8_list_join(temp.arena, &try_path_parts, &(StringJoin){.sep = str8_lit("/")}); - FileProperties try_props = os_properties_from_file_path(try_path); + FileProperties try_props = properties_from_file_path(try_path); if(try_props.modified != 0) { name_resolved = 1; @@ -14934,7 +14924,7 @@ rd_frame(void) String8 current_path_string = current_path->first->string; if(current_path_string.size == 0) { - current_path_string = path_normalized_from_string(scratch.arena, os_get_current_path(scratch.arena)); + current_path_string = path_normalized_from_string(scratch.arena, get_current_path(scratch.arena)); } initial_input = current_path_string; initial_input = push_str8f(scratch.arena, "%S/", initial_input); @@ -15373,8 +15363,8 @@ rd_frame(void) String8 name = rd_regs()->string; if(name.size != 0) { - String8 themes_folder = push_str8f(scratch.arena, "%S/raddbg/themes", os_get_process_info()->user_program_data_path); - if(os_make_directory(themes_folder)) + String8 themes_folder = str8f(scratch.arena, "%S/raddbg/themes", get_process_info()->user_program_data_path); + if(make_directory(themes_folder)) { String8 dst_path = push_str8f(scratch.arena, "%S/%S", themes_folder, name); CFG_Node *parent = cfg_node_from_id(rd_regs()->cfg); @@ -15385,7 +15375,7 @@ rd_frame(void) str8_list_push(scratch.arena, &strings, cfg_string_from_tree(scratch.arena, rd_state->cfg_schema_table, str8_chop_last_slash(dst_path), n->v)); } String8 data = str8_list_join(scratch.arena, &strings, 0); - if(os_write_data_to_file_path(dst_path, data)) + if(write_data_to_file_path(dst_path, data)) { if(kind == RD_CmdKind_SaveAndSetTheme) { @@ -15645,7 +15635,7 @@ rd_frame(void) { Access *access = access_open(); D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 1, now_time_us()+10000); D_CallStackFrame *frame = d_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); if(frame == 0) { @@ -15664,7 +15654,7 @@ rd_frame(void) { Access *access = access_open(); D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000); + D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 1, now_time_us()+10000); D_CallStackFrame *current_frame = d_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); D_CallStackFrame *next_frame = current_frame; if(current_frame != 0) switch(kind) @@ -16397,7 +16387,7 @@ rd_frame(void) D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); String8 new_path = debug_info_path->string; - if(new_path.size != 0 && os_file_path_exists(new_path)) + if(new_path.size != 0 && file_path_exists(new_path)) { CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("debug_info")); B32 path_found = 0; @@ -16749,7 +16739,7 @@ rd_frame(void) // if(DEV_simulate_lag) { - os_sleep_milliseconds(300); + sleep_ms(300); } ////////////////////////////// @@ -16817,7 +16807,7 @@ rd_frame(void) ////////////////////////////// //- rjf: determine frame time, record into history // - U64 end_time_us = os_now_microseconds(); + U64 end_time_us = now_time_us(); U64 frame_time_us = end_time_us-begin_time_us; rd_state->frame_time_us_history[rd_state->frame_index%ArrayCount(rd_state->frame_time_us_history)] = frame_time_us; @@ -16855,7 +16845,7 @@ rd_frame(void) ProfScope("collect logs") { LogScopeResult log = log_scope_end(scratch.arena); - os_append_data_to_file_path(rd_state->log_path, log.strings[LogMsgKind_Info]); + append_data_to_file_path(rd_state->log_path, log.strings[LogMsgKind_Info]); if(log.strings[LogMsgKind_UserError].size != 0) { String8 error_log = log.strings[LogMsgKind_UserError]; diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 5f5d119d..417ccd7a 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -283,7 +283,7 @@ struct RD_WindowState // rjf: top-level info & handles Arena *arena; - OS_Handle os; + OS_Window os; R_Handle r; UI_State *ui; F32 last_dpi; @@ -543,7 +543,7 @@ struct RD_State String8 bind_change_cmd_name; // rjf: pre-stop focused window - OS_Handle prestop_focused_window; + OS_ExternalWindow prestop_focused_window; }; //////////////////////////////// @@ -730,7 +730,7 @@ internal void rd_store_view_paramf(String8 key, char *fmt, ...); internal String8 rd_push_window_title(Arena *arena); internal CFG_Node *rd_window_from_cfg(CFG_Node *cfg); internal RD_WindowState *rd_window_state_from_cfg(CFG_Node *cfg); -internal RD_WindowState *rd_window_state_from_os_handle(OS_Handle os); +internal RD_WindowState *rd_window_state_from_os_handle(OS_Window os); internal void rd_window_frame(void); //////////////////////////////// diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 5b7adf0c..0bed5d80 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -122,18 +122,18 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(themes) //- rjf: gather theme files { - String8 theme_folder = push_str8f(scratch.arena, "%S/raddbg/themes", os_get_process_info()->user_program_data_path); - OS_FileIter *it = os_file_iter_begin(scratch.arena, theme_folder, OS_FileIterFlag_SkipFolders); - for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);) + String8 theme_folder = push_str8f(scratch.arena, "%S/raddbg/themes", get_process_info()->user_program_data_path); + FileIter *it = file_iter_begin(scratch.arena, theme_folder, FileIterFlag_SkipFolders); + for(FileInfo info = {0}; file_iter_next(scratch.arena, it, &info);) { String8 name = info.name; FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, name); if(name_matches.count == name_matches.needle_part_count) { - str8_list_push(scratch.arena, &names, push_str8_copy(arena, name)); + str8_list_push(scratch.arena, &names, str8_copy(arena, name)); } } - os_file_iter_end(it); + file_iter_end(it); } //- rjf: flatten & build accelerator @@ -269,11 +269,16 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(registers) Temp scratch = scratch_begin(&arena, 1); D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); Arch arch = thread->arch; - U64 reg_count = regs_reg_code_count_from_arch(arch); - String8 *reg_strings = regs_reg_code_string_table_from_arch(arch); + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 reg_count = arch_info->reg_code_count; + String8 *reg_strings = arch_info->reg_code_name_table; String8List exprs_list = {0}; for(U64 idx = 1; idx < reg_count; idx += 1) { + if(arch_info->reg_code_base_table[idx] != 0) + { + continue; + } FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, reg_strings[idx]); if(matches.count == matches.needle_part_count) { @@ -1041,8 +1046,9 @@ E_TYPE_ACCESS_FUNCTION_DEF(call_stack) if(0 <= rhs_value.u64 && rhs_value.u64 < call_stack->frames_count) { D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, accel->process); + ARCH_Info *arch_info = arch_info_from_arch(accel->arch); D_CallStackFrame *f = &call_stack->frames[rhs_value.u64]; - result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity), e_irtree_const_u(arena, regs_rip_from_arch_block(accel->arch, f->regs))); + result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity), e_irtree_const_u(arena, arch_ip_from_reg_block(arch_info, f->regs))); result.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth); result.mode = E_Mode_Value; } diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index ccf5f745..7db1c57c 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -297,9 +297,7 @@ #include "rdi_from_dwarf/rdi_from_dwarf.h" #include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "radbin/radbin.h" -#include "regs/regs.h" -#include "regs/rdi/regs_rdi.h" -#include "regs/dwarf/regs_dwarf.h" +#include "arch/arch_inc.h" #include "dbg_info/dbg_info.h" #include "disasm/disasm.h" #include "stap/stap_parse.h" @@ -352,9 +350,7 @@ #include "rdi_from_dwarf/rdi_from_dwarf.c" #include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "radbin/radbin.c" -#include "regs/regs.c" -#include "regs/rdi/regs_rdi.c" -#include "regs/dwarf/regs_dwarf.c" +#include "arch/arch_inc.c" #include "dbg_info/dbg_info.c" #include "disasm/disasm.c" #include "stap/stap_parse.c" @@ -414,9 +410,9 @@ ipc_signaler_thread__entry_point(void *p) ThreadNameF("rd_ipc_signaler_thread"); for(;;) { - if(os_semaphore_take(ipc_sender2main_signal_semaphore, max_U64)) + if(semaphore_take(ipc_sender2main_signal_semaphore, max_U64)) { - if(os_semaphore_take(ipc_sender2main_lock_semaphore, max_U64)) + if(semaphore_take(ipc_sender2main_lock_semaphore, max_U64)) { IPCInfo *ipc_info = (IPCInfo *)ipc_sender2main_shared_memory_base; String8 msg = str8((U8 *)(ipc_info+1), ipc_info->msg_size); @@ -436,7 +432,7 @@ ipc_signaler_thread__entry_point(void *p) cond_var_broadcast(ipc_s2m_ring_cv); os_send_wakeup_event(); ipc_info->msg_size = 0; - os_semaphore_drop(ipc_sender2main_lock_semaphore); + semaphore_drop(ipc_sender2main_lock_semaphore); } } } @@ -559,23 +555,23 @@ entry_point(CmdLine *cmd_line) //- rjf: set up shared resources for ipc to this instance; launch IPC signaler thread { Temp scratch = scratch_begin(0, 0); - U32 instance_pid = os_get_process_info()->pid; + U32 instance_pid = get_process_info()->pid; // rjf: set up cross-process sender -> main ring buffer - String8 ipc_sender2main_shared_memory_name = push_str8f(scratch.arena, "_raddbg_ipc_sender2main_shared_memory_%i_", instance_pid); - String8 ipc_sender2main_signal_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_sender2main_signal_semaphore_%i_", instance_pid); - String8 ipc_sender2main_lock_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_sender2main_lock_semaphore_%i_", instance_pid); - OS_Handle ipc_sender2main_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_sender2main_shared_memory_name); - ipc_sender2main_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_sender2main_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); + String8 ipc_sender2main_shared_memory_name = str8f(scratch.arena, "_raddbg_ipc_sender2main_shared_memory_%i_", instance_pid); + String8 ipc_sender2main_signal_semaphore_name = str8f(scratch.arena, "_raddbg_ipc_sender2main_signal_semaphore_%i_", instance_pid); + String8 ipc_sender2main_lock_semaphore_name = str8f(scratch.arena, "_raddbg_ipc_sender2main_lock_semaphore_%i_", instance_pid); + SharedMemory ipc_sender2main_shared_memory = shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_sender2main_shared_memory_name); + ipc_sender2main_shared_memory_base = (U8 *)shared_memory_view_open(ipc_sender2main_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); ipc_sender2main_signal_semaphore = semaphore_alloc(0, 1, ipc_sender2main_signal_semaphore_name); ipc_sender2main_lock_semaphore = semaphore_alloc(1, 1, ipc_sender2main_lock_semaphore_name); // rjf: set up cross-process main -> sender ring buffer - String8 ipc_main2sender_shared_memory_name = push_str8f(scratch.arena, "_raddbg_ipc_main2sender_shared_memory_%i_", instance_pid); - String8 ipc_main2sender_signal_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_main2sender_signal_semaphore_%i_", instance_pid); - String8 ipc_main2sender_lock_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_main2sender_lock_semaphore_%i_", instance_pid); - OS_Handle ipc_main2sender_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_main2sender_shared_memory_name); - ipc_main2sender_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_main2sender_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); + String8 ipc_main2sender_shared_memory_name = str8f(scratch.arena, "_raddbg_ipc_main2sender_shared_memory_%i_", instance_pid); + String8 ipc_main2sender_signal_semaphore_name = str8f(scratch.arena, "_raddbg_ipc_main2sender_signal_semaphore_%i_", instance_pid); + String8 ipc_main2sender_lock_semaphore_name = str8f(scratch.arena, "_raddbg_ipc_main2sender_lock_semaphore_%i_", instance_pid); + SharedMemory ipc_main2sender_shared_memory = shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_main2sender_shared_memory_name); + ipc_main2sender_shared_memory_base = (U8 *)shared_memory_view_open(ipc_main2sender_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); ipc_main2sender_signal_semaphore = semaphore_alloc(0, 1, ipc_main2sender_signal_semaphore_name); ipc_main2sender_lock_semaphore = semaphore_alloc(1, 1, ipc_main2sender_lock_semaphore_name); @@ -682,7 +678,7 @@ entry_point(CmdLine *cmd_line) if(ipc_command_frame) { if(ipc_main2sender_shared_memory_base != 0 && - os_semaphore_take(ipc_main2sender_lock_semaphore, os_now_microseconds()+5000000)) + semaphore_take(ipc_main2sender_lock_semaphore, now_time_us()+5000000)) { IPCInfo *ipc_info = (IPCInfo *)ipc_main2sender_shared_memory_base; U8 *buffer = (U8 *)(ipc_info+1); @@ -691,8 +687,8 @@ entry_point(CmdLine *cmd_line) String8 msg = str8_list_join(scratch.arena, &rd_state->cmd_outputs, &join); ipc_info->msg_size = Min(buffer_max, msg.size); MemoryCopy(buffer, msg.str, ipc_info->msg_size); - os_semaphore_drop(ipc_main2sender_signal_semaphore); - os_semaphore_drop(ipc_main2sender_lock_semaphore); + semaphore_drop(ipc_main2sender_signal_semaphore); + semaphore_drop(ipc_main2sender_lock_semaphore); } } } @@ -721,7 +717,7 @@ entry_point(CmdLine *cmd_line) //- rjf: no explicit PID? -> find PID to send message to, by looking for other raddbg instances if(dst_pid == 0) { - U32 this_pid = os_get_process_info()->pid; + U32 this_pid = get_process_info()->pid; DMN_ProcessIter it = {0}; dmn_process_iter_begin(&it); for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &it, &info);) @@ -740,23 +736,23 @@ entry_point(CmdLine *cmd_line) String8 ipc_sender2main_shared_memory_name = push_str8f(scratch.arena, "_raddbg_ipc_sender2main_shared_memory_%i_", dst_pid); String8 ipc_sender2main_signal_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_sender2main_signal_semaphore_%i_", dst_pid); String8 ipc_sender2main_lock_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_sender2main_lock_semaphore_%i_", dst_pid); - OS_Handle ipc_sender2main_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_sender2main_shared_memory_name); - ipc_sender2main_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_sender2main_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); - ipc_sender2main_signal_semaphore = os_semaphore_alloc(0, 1, ipc_sender2main_signal_semaphore_name); - ipc_sender2main_lock_semaphore = os_semaphore_alloc(1, 1, ipc_sender2main_lock_semaphore_name); + SharedMemory ipc_sender2main_shared_memory = shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_sender2main_shared_memory_name); + ipc_sender2main_shared_memory_base = (U8 *)shared_memory_view_open(ipc_sender2main_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); + ipc_sender2main_signal_semaphore = semaphore_alloc(0, 1, ipc_sender2main_signal_semaphore_name); + ipc_sender2main_lock_semaphore = semaphore_alloc(1, 1, ipc_sender2main_lock_semaphore_name); String8 ipc_main2sender_shared_memory_name = push_str8f(scratch.arena, "_raddbg_ipc_main2sender_shared_memory_%i_", dst_pid); String8 ipc_main2sender_signal_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_main2sender_signal_semaphore_%i_", dst_pid); String8 ipc_main2sender_lock_semaphore_name = push_str8f(scratch.arena, "_raddbg_ipc_main2sender_lock_semaphore_%i_", dst_pid); - OS_Handle ipc_main2sender_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_main2sender_shared_memory_name); - ipc_main2sender_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_main2sender_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); - ipc_main2sender_signal_semaphore = os_semaphore_alloc(0, 1, ipc_main2sender_signal_semaphore_name); - ipc_main2sender_lock_semaphore = os_semaphore_alloc(1, 1, ipc_main2sender_lock_semaphore_name); + SharedMemory ipc_main2sender_shared_memory = shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_main2sender_shared_memory_name); + ipc_main2sender_shared_memory_base = (U8 *)shared_memory_view_open(ipc_main2sender_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE)); + ipc_main2sender_signal_semaphore = semaphore_alloc(0, 1, ipc_main2sender_signal_semaphore_name); + ipc_main2sender_lock_semaphore = semaphore_alloc(1, 1, ipc_main2sender_lock_semaphore_name); //- rjf: got resources -> write message B32 wrote_message = 0; if(dst_pid != 0 && ipc_sender2main_shared_memory_base != 0 && - os_semaphore_take(ipc_sender2main_lock_semaphore, max_U64)) + semaphore_take(ipc_sender2main_lock_semaphore, max_U64)) { wrote_message = 1; IPCInfo *ipc_info = (IPCInfo *)ipc_sender2main_shared_memory_base; @@ -773,24 +769,24 @@ entry_point(CmdLine *cmd_line) String8 msg = str8_list_join(scratch.arena, &parts, &join); ipc_info->msg_size = Min(buffer_max, msg.size); MemoryCopy(buffer, msg.str, ipc_info->msg_size); - os_semaphore_drop(ipc_sender2main_signal_semaphore); - os_semaphore_drop(ipc_sender2main_lock_semaphore); + semaphore_drop(ipc_sender2main_signal_semaphore); + semaphore_drop(ipc_sender2main_lock_semaphore); } //- rjf: wrote message -> wait for outputs, read outputs String8List outputs = {0}; if(wrote_message && ipc_main2sender_shared_memory_base != 0 && - os_semaphore_take(ipc_main2sender_signal_semaphore, os_now_microseconds()+10000000)) + semaphore_take(ipc_main2sender_signal_semaphore, now_time_us()+10000000)) { - if(os_semaphore_take(ipc_main2sender_lock_semaphore, max_U64)) + if(semaphore_take(ipc_main2sender_lock_semaphore, max_U64)) { IPCInfo *ipc_info = (IPCInfo *)ipc_main2sender_shared_memory_base; String8 msg = str8((U8 *)(ipc_info+1), ipc_info->msg_size); msg.size = Min(msg.size, IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo)); U8 split_char = 0; outputs = str8_split(scratch.arena, msg, &split_char, 1, 0); - os_semaphore_drop(ipc_main2sender_lock_semaphore); + semaphore_drop(ipc_main2sender_lock_semaphore); } } diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index fb3fe45e..05f96794 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1028,10 +1028,11 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) D_CallStack call_stack = d_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); if(1 <= frame_num && frame_num <= call_stack.frames_count) { + ARCH_Info *arch_info = arch_info_from_arch(entity->arch); D_CallStackFrame *f = &call_stack.frames[frame_num-1]; info.callstack_unwind_index = f->unwind_count; info.callstack_inline_depth = f->inline_depth; - info.callstack_vaddr = regs_rip_from_arch_block(entity->arch, f->regs); + info.callstack_vaddr = arch_ip_from_reg_block(arch_info, f->regs); } access_close(access); } @@ -2148,7 +2149,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) U128 hash = {0}; TXT_TextInfo info = txt_text_info_from_key_lang(access, rd_regs()->text_key, rd_regs()->lang_kind, &hash); String8 data = c_data_from_hash(access, hash); - B32 file_is_missing = (rd_regs()->file_path.size != 0 && os_properties_from_file_path(rd_regs()->file_path).modified == 0); + B32 file_is_missing = (rd_regs()->file_path.size != 0 && properties_from_file_path(rd_regs()->file_path).modified == 0); B32 key_has_data = !u128_match(hash, u128_zero()) && info.lines_count; ProfEnd(); @@ -2305,7 +2306,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) }break; case RDI_ChecksumKind_Timestamp: { - FileProperties props = os_properties_from_file_path(rd_regs()->file_path); + FileProperties props = properties_from_file_path(rd_regs()->file_path); String8 timestamp_string = str8_struct(&props.modified); file_is_out_of_date = !MemoryIsZeroStruct(&props.modified) && !str8_match(timestamp_string, checksum_expected, 0); }break; @@ -3271,8 +3272,9 @@ RD_VIEW_UI_FUNCTION_DEF(memory) //- rjf: fill selected thread stack range annotation if(selected_call_stack.concrete_frames_count > 0) { + ARCH_Info *arch_info = arch_info_from_arch(selected_thread->arch); U64 stack_base_vaddr = selected_thread->stack_base; - U64 stack_top_vaddr = regs_rsp_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs); + U64 stack_top_vaddr = arch_sp_from_reg_block(arch_info, selected_call_stack.concrete_frames[0]->regs); Rng1U64 stack_vaddr_range = r1u64(stack_base_vaddr, stack_top_vaddr); Rng1U64 stack_vaddr_range_in_viz = intersect_1u64(stack_vaddr_range, viz_range_bytes); if(dim_1u64(stack_vaddr_range_in_viz) != 0) @@ -3294,13 +3296,14 @@ RD_VIEW_UI_FUNCTION_DEF(memory) //- rjf: fill unwind frame annotations if(selected_call_stack.concrete_frames_count != 0) UI_Tag(str8_lit("weak")) { + ARCH_Info *arch_info = arch_info_from_arch(selected_thread->arch); Vec4F32 symbol_color = ui_color_from_name(str8_lit("code_symbol")); - U64 last_rip = regs_rip_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs); - U64 last_stack_top = regs_rsp_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs); + U64 last_rip = arch_ip_from_reg_block(arch_info, selected_call_stack.concrete_frames[0]->regs); + U64 last_stack_top = arch_sp_from_reg_block(arch_info, selected_call_stack.concrete_frames[0]->regs); for(U64 idx = 1; idx < selected_call_stack.concrete_frames_count; idx += 1) { D_CallStackFrame *f = selected_call_stack.concrete_frames[idx]; - U64 f_stack_top = regs_rsp_from_arch_block(selected_thread->arch, f->regs); + U64 f_stack_top = arch_sp_from_reg_block(arch_info, f->regs); Rng1U64 frame_vaddr_range = r1u64(last_stack_top, f_stack_top); Rng1U64 frame_vaddr_range_in_viz = intersect_1u64(frame_vaddr_range, viz_range_bytes); last_stack_top = f_stack_top; @@ -3308,7 +3311,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { Access *access = access_open(); U64 f_rip_vaddr = last_rip; - last_rip = regs_rip_from_arch_block(selected_thread->arch, f->regs); + last_rip = arch_ip_from_reg_block(arch_info, f->regs); D_Entity *module = d_module_from_process_vaddr(selected_process, f_rip_vaddr); U64 f_rip_voff = d_voff_from_vaddr(module, f_rip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 32392c38..a1db6221 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -550,6 +550,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr Access *access = access_open(); D_Entity *process = d_entity_ancestor_from_kind(entity, D_EntityKind_Process); Arch arch = entity->arch; + ARCH_Info *arch_info = arch_info_from_arch(entity->arch); B32 call_stack_high_priority = d_handle_match(entity->handle, rd_base_regs()->thread); D_CallStack call_stack = d_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); B32 did_first_known = 0; @@ -558,7 +559,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr idx += 1) { D_CallStackFrame *f = &call_stack.frames[call_stack.frames_count - 1 - idx]; - U64 rip_vaddr = regs_rip_from_arch_block(arch, f->regs); + U64 rip_vaddr = arch_ip_from_reg_block(arch_info, f->regs); D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); String8 name = {0}; @@ -653,7 +654,7 @@ rd_title_fstrs_from_file_path(Arena *arena, String8 file_path) { DR_FStrList fstrs = {0}; String8 file_name = str8_skip_last_slash(file_path); - FileProperties props = os_properties_from_file_path(file_path); + FileProperties props = properties_from_file_path(file_path); RD_IconKind icon_kind = RD_IconKind_FileOutline; if(props.flags & FilePropertyFlag_IsFolder) { diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 19a39d58..b575ea3e 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -3,6 +3,9 @@ #include "lib_rdi/rdi.c" #include "lib_rdi/rdi_parse.c" +#if defined(X64_H) +# include "rdi/x64/rdi_x64.c" +#endif //////////////////////////////// //~ rjf: RDI Enum <=> Base Enum @@ -20,6 +23,22 @@ arch_from_rdi_arch(RDI_Arch arch) return result; } +internal RDI_Arch +rdi_arch_from_arch(Arch arch) +{ + RDI_Arch result = RDI_Arch_NULL; + switch(arch) + { + case Arch_COUNT: + case Arch_Null:{}break; + case Arch_x86:{result = RDI_Arch_X86;}break; + case Arch_x64:{result = RDI_Arch_X64;}break; + case Arch_arm64:{}break; + case Arch_arm32:{}break; + } + return result; +} + //////////////////////////////// //~ rjf: Lookup Helpers diff --git a/src/rdi/rdi_local.h b/src/rdi/rdi_local.h index adc5f180..c7ef8f78 100644 --- a/src/rdi/rdi_local.h +++ b/src/rdi/rdi_local.h @@ -6,6 +6,9 @@ #include "lib_rdi/rdi.h" #include "lib_rdi/rdi_parse.h" +#if defined(X64_H) +# include "rdi/x64/rdi_x64.h" +#endif //////////////////////////////// //~ rjf: RDI Dumping Flags @@ -70,6 +73,7 @@ read_only global String8 rdi_name_title_from_dump_subset_table[] = //~ rjf: RDI Enum <=> Base Enum internal Arch arch_from_rdi_arch(RDI_Arch arch); +internal RDI_Arch rdi_arch_from_arch(Arch arch); //////////////////////////////// //~ rjf: Lookup Helpers diff --git a/src/rdi/x64/generated/rdi_x64.meta.c b/src/rdi/x64/generated/rdi_x64.meta.c new file mode 100644 index 00000000..68f9269f --- /dev/null +++ b/src/rdi/x64/generated/rdi_x64.meta.c @@ -0,0 +1,201 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +U8 rdi_reg_code_from_x64_table[189] = +{ +RDI_RegCodeX64_nil, +RDI_RegCodeX64_rax, +RDI_RegCodeX64_rcx, +RDI_RegCodeX64_rdx, +RDI_RegCodeX64_rbx, +RDI_RegCodeX64_rsp, +RDI_RegCodeX64_rbp, +RDI_RegCodeX64_rsi, +RDI_RegCodeX64_rdi, +RDI_RegCodeX64_r8, +RDI_RegCodeX64_r9, +RDI_RegCodeX64_r10, +RDI_RegCodeX64_r11, +RDI_RegCodeX64_r12, +RDI_RegCodeX64_r13, +RDI_RegCodeX64_r14, +RDI_RegCodeX64_r15, +RDI_RegCodeX64_fsbase, +RDI_RegCodeX64_gsbase, +RDI_RegCodeX64_rip, +RDI_RegCodeX64_rflags, +RDI_RegCodeX64_dr0, +RDI_RegCodeX64_dr1, +RDI_RegCodeX64_dr2, +RDI_RegCodeX64_dr3, +RDI_RegCodeX64_dr4, +RDI_RegCodeX64_dr5, +RDI_RegCodeX64_dr6, +RDI_RegCodeX64_dr7, +RDI_RegCodeX64_st0, +RDI_RegCodeX64_st1, +RDI_RegCodeX64_st2, +RDI_RegCodeX64_st3, +RDI_RegCodeX64_st4, +RDI_RegCodeX64_st5, +RDI_RegCodeX64_st6, +RDI_RegCodeX64_st7, +RDI_RegCodeX64_fcw, +RDI_RegCodeX64_fsw, +RDI_RegCodeX64_ftw, +RDI_RegCodeX64_fop, +RDI_RegCodeX64_fcs, +RDI_RegCodeX64_fds, +RDI_RegCodeX64_fip, +RDI_RegCodeX64_fdp, +RDI_RegCodeX64_mxcsr, +RDI_RegCodeX64_mxcsr_mask, +RDI_RegCodeX64_ss, +RDI_RegCodeX64_cs, +RDI_RegCodeX64_ds, +RDI_RegCodeX64_es, +RDI_RegCodeX64_fs, +RDI_RegCodeX64_gs, +RDI_RegCodeX64_zmm0, +RDI_RegCodeX64_zmm1, +RDI_RegCodeX64_zmm2, +RDI_RegCodeX64_zmm3, +RDI_RegCodeX64_zmm4, +RDI_RegCodeX64_zmm5, +RDI_RegCodeX64_zmm6, +RDI_RegCodeX64_zmm7, +RDI_RegCodeX64_zmm8, +RDI_RegCodeX64_zmm9, +RDI_RegCodeX64_zmm10, +RDI_RegCodeX64_zmm11, +RDI_RegCodeX64_zmm12, +RDI_RegCodeX64_zmm13, +RDI_RegCodeX64_zmm14, +RDI_RegCodeX64_zmm15, +RDI_RegCodeX64_zmm16, +RDI_RegCodeX64_zmm17, +RDI_RegCodeX64_zmm18, +RDI_RegCodeX64_zmm19, +RDI_RegCodeX64_zmm20, +RDI_RegCodeX64_zmm21, +RDI_RegCodeX64_zmm22, +RDI_RegCodeX64_zmm23, +RDI_RegCodeX64_zmm24, +RDI_RegCodeX64_zmm25, +RDI_RegCodeX64_zmm26, +RDI_RegCodeX64_zmm27, +RDI_RegCodeX64_zmm28, +RDI_RegCodeX64_zmm29, +RDI_RegCodeX64_zmm30, +RDI_RegCodeX64_zmm31, +RDI_RegCodeX64_k0, +RDI_RegCodeX64_k1, +RDI_RegCodeX64_k2, +RDI_RegCodeX64_k3, +RDI_RegCodeX64_k4, +RDI_RegCodeX64_k5, +RDI_RegCodeX64_k6, +RDI_RegCodeX64_k7, +RDI_RegCodeX64_cetmsr, +RDI_RegCodeX64_cetssp, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +}; + +C_LINKAGE_END + diff --git a/src/rdi/x64/generated/rdi_x64.meta.h b/src/rdi/x64/generated/rdi_x64.meta.h new file mode 100644 index 00000000..82c9e28f --- /dev/null +++ b/src/rdi/x64/generated/rdi_x64.meta.h @@ -0,0 +1,14 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef RDI_X64_META_H +#define RDI_X64_META_H + +C_LINKAGE_BEGIN +extern U8 rdi_reg_code_from_x64_table[189]; + +C_LINKAGE_END + +#endif // RDI_X64_META_H diff --git a/src/rdi/x64/rdi_x64.c b/src/rdi/x64/rdi_x64.c new file mode 100644 index 00000000..1a7ce768 --- /dev/null +++ b/src/rdi/x64/rdi_x64.c @@ -0,0 +1,4 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "rdi/x64/generated/rdi_x64.meta.c" diff --git a/src/regs/rdi/generated/regs_rdi.meta.h b/src/rdi/x64/rdi_x64.h similarity index 51% rename from src/regs/rdi/generated/regs_rdi.meta.h rename to src/rdi/x64/rdi_x64.h index b5d77852..46cb0858 100644 --- a/src/regs/rdi/generated/regs_rdi.meta.h +++ b/src/rdi/x64/rdi_x64.h @@ -1,9 +1,9 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef REGS_RDI_META_H -#define REGS_RDI_META_H - -#endif // REGS_RDI_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_X64_H +#define RDI_X64_H + +#include "rdi/x64/generated/rdi_x64.meta.h" + +#endif // RDI_X64_H diff --git a/src/rdi/x64/rdi_x64.mdesk b/src/rdi/x64/rdi_x64.mdesk new file mode 100644 index 00000000..e244f037 --- /dev/null +++ b/src/rdi/x64/rdi_x64.mdesk @@ -0,0 +1,7 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@data(U8) rdi_reg_code_from_x64_table: +{ + @expand(X64_RegTable a) `$(a.has_rdi == 'x' -> "RDI_RegCodeX64_" .. a.name)$(a.has_rdi != 'x' -> 0)` +} diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index e67a0009..ce5d56f4 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -21,6 +21,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW_Raw *raw = ¶ms->raw; RDIM_BinarySectionList binary_sections = params->binary_sections; Arch arch = params->arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); U64 base_vaddr = params->base_vaddr; U64 arch_addr_size = byte_size_from_arch(arch); @@ -62,21 +63,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_TopLevelInfo top_level_info = {0}; ProfScope("produce top-level-info") { - // rjf: base arch -> rdi - RDI_Arch arch_rdi = RDI_Arch_NULL; - switch(arch) - { - case Arch_Null: - case Arch_arm64: - case Arch_arm32: - case Arch_COUNT: - {}break; - case Arch_x64:{arch_rdi = RDI_Arch_X64;}break; - case Arch_x86:{arch_rdi = RDI_Arch_X86;}break; - } - - // rjf: fill - top_level_info.arch = arch_rdi; + top_level_info.arch = rdi_arch_from_arch(arch); top_level_info.exe_name = params->exe_name; top_level_info.exe_hash = exe_hash; top_level_info.voff_max = acceptable_vaddr_range.max - base_vaddr; @@ -94,49 +81,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64Array *unit_arange_ranges = 0; ProfScope("gather unit ranges from .debug_info, .debug_aranges") if(lane_idx() == 0) { - struct - { - String8 data; - Rng1U64Array **dst_array; - } - tasks[] = - { - {raw->sec[DW_Section_Info].data, &unit_info_ranges}, - {raw->sec[DW_Section_ARanges].data, &unit_arange_ranges}, - }; - for EachElement(task_idx, tasks) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - String8 data = tasks[task_idx].data; - Rng1U64List unit_range_list = {0}; - for(U64 off = 0; off < data.size;) - { - U64 start_off = off; - - // rjf: read next unit size - U64 unit_size = 0; - U64 unit_size_size = dw2_read_initial_length(data, off, &unit_size, 0); - - // rjf: push - if(unit_size > 0) - { - rng1u64_list_push(scratch2.arena, &unit_range_list, r1u64(off, off + unit_size_size + unit_size)); - } - - // rjf: advance - off += unit_size_size; - off += unit_size; - - // rjf: break if no movement - if(off == start_off) - { - break; - } - } - tasks[task_idx].dst_array[0] = push_array(scratch.arena, Rng1U64Array, 1); - tasks[task_idx].dst_array[0][0] = rng1u64_array_from_list(scratch.arena, &unit_range_list); - scratch_end(scratch2); - } + unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); + *unit_info_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_Section_Info].data); + unit_arange_ranges = push_array(scratch.arena, Rng1U64Array, 1); + *unit_arange_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_Section_ARanges].data); } lane_sync_u64(&unit_info_ranges, 0); lane_sync_u64(&unit_arange_ranges, 0); @@ -1452,29 +1400,16 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////////// //- rjf: gather all unique, to-be-deduplicated tags across all units (types, namespaces) // - typedef struct UnitDedupedTagNode UnitDedupedTagNode; - struct UnitDedupedTagNode - { - UnitDedupedTagNode *next; - U64 src_info_off; - U64 dst_hash; - }; - typedef struct UnitDedupedTagMap UnitDedupedTagMap; - struct UnitDedupedTagMap - { - UnitDedupedTagNode **slots; - U64 slots_count; - }; D2R2_UniqueTagNode **unique_tag_slots = 0; U64 unique_tag_slots_count = total_tag_count_estimate/8 + 1; - UnitDedupedTagMap *unit_deduped_tag_maps = 0; + D2R2_UnitDedupedTagMap *unit_deduped_tag_maps = 0; ProfScope("gather all unique, to-be-deduplicated tags across all units (types, namespaces)") { //- rjf: set up tables if(lane_idx() == 0) { unique_tag_slots = push_array(scratch.arena, D2R2_UniqueTagNode *, unique_tag_slots_count); - unit_deduped_tag_maps = push_array(scratch.arena, UnitDedupedTagMap, unit_count); + unit_deduped_tag_maps = push_array(scratch.arena, D2R2_UnitDedupedTagMap, unit_count); } lane_sync_u64(&unique_tag_slots, 0); lane_sync_u64(&unit_deduped_tag_maps, 0); @@ -1486,7 +1421,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; unit_deduped_tag_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 256 + 1; - unit_deduped_tag_maps[unit_idx].slots = push_array(scratch.arena, UnitDedupedTagNode *, unit_deduped_tag_maps[unit_idx].slots_count); + unit_deduped_tag_maps[unit_idx].slots = push_array(scratch.arena, D2R2_UnitDedupedTagNode *, unit_deduped_tag_maps[unit_idx].slots_count); } lane_sync(); } @@ -1945,13 +1880,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; - UnitDedupedTagNode *n = push_array(scratch.arena, UnitDedupedTagNode, 1); + D2R2_UnitDedupedTagNode *n = push_array(scratch.arena, D2R2_UnitDedupedTagNode, 1); n->src_info_off = start_off; n->dst_hash = hash; for(B32 inserted = 0; !inserted;) { U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); - n->next = (UnitDedupedTagNode *)slot_head_val; + n->next = (D2R2_UnitDedupedTagNode *)slot_head_val; if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) { inserted = 1; @@ -2239,7 +2174,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); U64 off_slot_idx = off_hash%unit_deduped_tag_maps[direct_type_unit_idx].slots_count; - for(UnitDedupedTagNode *n = unit_deduped_tag_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == direct_type_info_off) { @@ -2404,11 +2339,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); direct_type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); } - UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[direct_type_unit_idx]; + D2R2_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[direct_type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; U64 direct_type_hash = 0; - for(UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R2_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == direct_type_info_off) { @@ -2543,10 +2478,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: map info_off/unit_idx -> hash U64 param_type_hash = 0; { - UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[param_type_unit_idx]; + D2R2_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[param_type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(¶m_type_info_off)); U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; - for(UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R2_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == param_type_info_off) { @@ -3006,10 +2941,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: (info_off, unit_idx) -> hash U64 type_hash = 0; { - UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == type_info_off) { @@ -3445,10 +3380,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: (info_off, unit_idx) -> hash U64 type_hash = 0; { - UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == type_info_off) { @@ -3758,31 +3693,17 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) }goto reg_read; reg_read:; { - // rjf: DWARF regcode -> RDI, off, size + // rjf: DWARF regcode -> internal regcode + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, regcode_dw); + + // rjf: internal regcode -> RDI, offset, size RDI_RegCode regcode_rdi = 0; U64 reg_off = 0; U64 reg_size = 0; - switch((Arch)arch) { - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm32: - case Arch_arm64: - case Arch_x86: - { - // TODO(rjf): unsupported architectures - }break; - case Arch_x64: - { - switch(regcode_dw) - { - default:{}break; -#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw:{regcode_rdi = RDI_RegCodeX64_##reg_rdi; reg_off = (off); reg_size = (size);}break; - DW_Regs_X64_XList -#undef X - } - }break; + Rng1U16 reg_rng = arch_info->reg_code_rng_table[regcode]; + reg_size = dim_1u16(reg_rng); + regcode_rdi = arch_rdi_from_reg_code_table_from_arch(arch)[regcode]; } // rjf: push op @@ -4400,10 +4321,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: info offset -> hash U64 hash = 0; { - UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for EachNode(n, UnitDedupedTagNode, unit_deduped_tag_map->slots[info_off_slot_idx]) + for EachNode(n, D2R2_UnitDedupedTagNode, unit_deduped_tag_map->slots[info_off_slot_idx]) { if(n->src_info_off == start_off) { @@ -4581,10 +4502,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: info off -> hash U64 hash = 0; { - UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == info_off) { @@ -4666,10 +4587,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: info off -> hash U64 hash = 0; { - UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == info_off) { diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h index ff09ee2d..a0b63230 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.h @@ -5,7 +5,7 @@ #define RDI_FROM_DWARF_2_H //////////////////////////////// -//~ rjf: Helper Types +//~ rjf: Unique Tag Tree Deduplication Types typedef enum D2R2_UniqueTagKind { @@ -26,6 +26,21 @@ struct D2R2_UniqueTagNode U64 order_idx; }; +typedef struct D2R2_UnitDedupedTagNode D2R2_UnitDedupedTagNode; +struct D2R2_UnitDedupedTagNode +{ + D2R2_UnitDedupedTagNode *next; + U64 src_info_off; + U64 dst_hash; +}; + +typedef struct D2R2_UnitDedupedTagMap D2R2_UnitDedupedTagMap; +struct D2R2_UnitDedupedTagMap +{ + D2R2_UnitDedupedTagNode **slots; + U64 slots_count; +}; + //////////////////////////////// //~ rjf: Conversion Stage Inputs (New) diff --git a/src/regs/dwarf/regs_dwarf.c b/src/regs/dwarf/regs_dwarf.c deleted file mode 100644 index d7fcc715..00000000 --- a/src/regs/dwarf/regs_dwarf.c +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal REGS_RegCode -reg_code_from_dw_reg_x64(DW_Reg reg) -{ - switch (reg) { -#define X(_SRC, _SRC_ID, _DST_ID, ...) case _SRC_ID: return REGS_RegCodeX64_##_DST_ID; - DW_Regs_X64_XList -#undef X - } - return REGS_RegCodeX64_NULL; -} - -internal REGS_RegCode -reg_code_from_dw_reg(Arch arch, DW_Reg reg) -{ - REGS_RegCode result = 0; - switch (arch) { - case Arch_Null: {} break; - case Arch_x64: { result = reg_code_from_dw_reg_x64(reg); } break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: { NotImplemented; } break; - default: { InvalidPath; } break; - } - return result; -} - -internal -MACHINE_OP_REG_READ(regs_read_dwarf_x64) -{ - // map DWARF register to -> the internal register - REGS_RegBlockX64 *regs = ud; - U64 reg_size = 0; void *reg_bytes = 0; - switch (reg_id) { -#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; - DW_Regs_X64_XList -#undef X - default: { InvalidPath; } break; - } - - // copy out register value - MachineOpResult status = MachineOpResult_Fail; - if (reg_size > 0) { - AssertAlways(reg_size == buffer_max); - MemoryCopy(buffer, reg_bytes, reg_size); - status = MachineOpResult_Ok; - } - - return status; -} - -internal -MACHINE_OP_REG_WRITE(regs_write_dwarf_x64) -{ - // map DWARF register to -> the internal register - REGS_RegBlockX64 *regs = ud; - U64 reg_size = 0; void *reg_bytes = 0; - switch (reg_id) { -#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = ®s->_MAP_N; } break; - DW_Regs_X64_XList -#undef X - default: { InvalidPath; } break; - } - - // write value to the register - MachineOpResult status = MachineOpResult_Fail; - if (reg_size > 0) { - AssertAlways(value_size <= reg_size); - MemoryCopy(reg_bytes, value, value_size); - status = MachineOpResult_Ok; - } - - return status; -} - diff --git a/src/regs/dwarf/regs_dwarf.h b/src/regs/dwarf/regs_dwarf.h deleted file mode 100644 index 37faf65a..00000000 --- a/src/regs/dwarf/regs_dwarf.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef REGS_DWARF_H -#define REGS_DWARF_H - -internal REGS_RegCode reg_code_from_dw_reg_x64(DW_Reg reg); -internal REGS_RegCode reg_code_from_dw_reg(Arch arch, DW_Reg reg); - -internal MACHINE_OP_REG_READ(regs_read_dwarf_x64); -internal MACHINE_OP_REG_WRITE(regs_write_dwarf_x64); - -#endif // REGS_DWARF_H - diff --git a/src/regs/generated/regs.meta.c b/src/regs/generated/regs.meta.c deleted file mode 100644 index e93d742e..00000000 --- a/src/regs/generated/regs.meta.c +++ /dev/null @@ -1,686 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -internal U64 regs_block_size_from_arch(Arch arch) -{ -U64 result = 8; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = sizeof(REGS_RegBlockX64);}break; -} -return result; -} -internal U64 regs_reg_code_count_from_arch(Arch arch) -{ -U64 result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = REGS_RegCodeX64_COUNT;}break; -} -return result; -} -internal U64 regs_alias_code_count_from_arch(Arch arch) -{ -U64 result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = REGS_AliasCodeX64_COUNT;}break; -} -return result; -} -internal String8 *regs_reg_code_string_table_from_arch(Arch arch) -{ -String8 *result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = regs_g_reg_code_x64_string_table;}break; -} -return result; -} -internal String8 *regs_alias_code_string_table_from_arch(Arch arch) -{ -String8 *result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = regs_g_alias_code_x64_string_table;}break; -} -return result; -} -internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch) -{ -REGS_Rng *result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = regs_g_reg_code_x64_rng_table;}break; -} -return result; -} -internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch) -{ -REGS_Slice *result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = regs_g_alias_code_x64_slice_table;}break; -} -return result; -} -internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch) -{ -REGS_UsageKind *result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = regs_g_reg_code_x64_usage_kind_table;}break; -} -return result; -} -internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch) -{ -REGS_UsageKind *result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break; -} -return result; -} -C_LINKAGE_BEGIN -REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[93] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -}; - -REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[95] = -{ -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Normal, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -REGS_UsageKind_Vector, -}; - -String8 regs_g_reg_code_x64_string_table[93] = -{ -str8_lit_comp(""), -str8_lit_comp("rax"), -str8_lit_comp("rcx"), -str8_lit_comp("rdx"), -str8_lit_comp("rbx"), -str8_lit_comp("rsp"), -str8_lit_comp("rbp"), -str8_lit_comp("rsi"), -str8_lit_comp("rdi"), -str8_lit_comp("r8"), -str8_lit_comp("r9"), -str8_lit_comp("r10"), -str8_lit_comp("r11"), -str8_lit_comp("r12"), -str8_lit_comp("r13"), -str8_lit_comp("r14"), -str8_lit_comp("r15"), -str8_lit_comp("fsbase"), -str8_lit_comp("gsbase"), -str8_lit_comp("rip"), -str8_lit_comp("rflags"), -str8_lit_comp("dr0"), -str8_lit_comp("dr1"), -str8_lit_comp("dr2"), -str8_lit_comp("dr3"), -str8_lit_comp("dr4"), -str8_lit_comp("dr5"), -str8_lit_comp("dr6"), -str8_lit_comp("dr7"), -str8_lit_comp("st0"), -str8_lit_comp("st1"), -str8_lit_comp("st2"), -str8_lit_comp("st3"), -str8_lit_comp("st4"), -str8_lit_comp("st5"), -str8_lit_comp("st6"), -str8_lit_comp("st7"), -str8_lit_comp("fcw"), -str8_lit_comp("fsw"), -str8_lit_comp("ftw"), -str8_lit_comp("fop"), -str8_lit_comp("fip"), -str8_lit_comp("fdp"), -str8_lit_comp("mxcsr"), -str8_lit_comp("mxcsr_mask"), -str8_lit_comp("ss"), -str8_lit_comp("cs"), -str8_lit_comp("ds"), -str8_lit_comp("es"), -str8_lit_comp("fs"), -str8_lit_comp("gs"), -str8_lit_comp("zmm0"), -str8_lit_comp("zmm1"), -str8_lit_comp("zmm2"), -str8_lit_comp("zmm3"), -str8_lit_comp("zmm4"), -str8_lit_comp("zmm5"), -str8_lit_comp("zmm6"), -str8_lit_comp("zmm7"), -str8_lit_comp("zmm8"), -str8_lit_comp("zmm9"), -str8_lit_comp("zmm10"), -str8_lit_comp("zmm11"), -str8_lit_comp("zmm12"), -str8_lit_comp("zmm13"), -str8_lit_comp("zmm14"), -str8_lit_comp("zmm15"), -str8_lit_comp("zmm16"), -str8_lit_comp("zmm17"), -str8_lit_comp("zmm18"), -str8_lit_comp("zmm19"), -str8_lit_comp("zmm20"), -str8_lit_comp("zmm21"), -str8_lit_comp("zmm22"), -str8_lit_comp("zmm23"), -str8_lit_comp("zmm24"), -str8_lit_comp("zmm25"), -str8_lit_comp("zmm26"), -str8_lit_comp("zmm27"), -str8_lit_comp("zmm28"), -str8_lit_comp("zmm29"), -str8_lit_comp("zmm30"), -str8_lit_comp("zmm31"), -str8_lit_comp("k0"), -str8_lit_comp("k1"), -str8_lit_comp("k2"), -str8_lit_comp("k3"), -str8_lit_comp("k4"), -str8_lit_comp("k5"), -str8_lit_comp("k6"), -str8_lit_comp("k7"), -str8_lit_comp("cetmsr"), -str8_lit_comp("cetssp"), -}; - -String8 regs_g_alias_code_x64_string_table[95] = -{ -str8_lit_comp(""), -str8_lit_comp("eax"), -str8_lit_comp("ecx"), -str8_lit_comp("edx"), -str8_lit_comp("ebx"), -str8_lit_comp("esp"), -str8_lit_comp("ebp"), -str8_lit_comp("esi"), -str8_lit_comp("edi"), -str8_lit_comp("r8d"), -str8_lit_comp("r9d"), -str8_lit_comp("r10d"), -str8_lit_comp("r11d"), -str8_lit_comp("r12d"), -str8_lit_comp("r13d"), -str8_lit_comp("r14d"), -str8_lit_comp("r15d"), -str8_lit_comp("eflags"), -str8_lit_comp("ax"), -str8_lit_comp("cx"), -str8_lit_comp("dx"), -str8_lit_comp("bx"), -str8_lit_comp("si"), -str8_lit_comp("di"), -str8_lit_comp("sp"), -str8_lit_comp("bp"), -str8_lit_comp("ip"), -str8_lit_comp("r8w"), -str8_lit_comp("r9w"), -str8_lit_comp("r10w"), -str8_lit_comp("r11w"), -str8_lit_comp("r12w"), -str8_lit_comp("r13w"), -str8_lit_comp("r14w"), -str8_lit_comp("r15w"), -str8_lit_comp("al"), -str8_lit_comp("cl"), -str8_lit_comp("dl"), -str8_lit_comp("bl"), -str8_lit_comp("sil"), -str8_lit_comp("dil"), -str8_lit_comp("bpl"), -str8_lit_comp("spl"), -str8_lit_comp("r8b"), -str8_lit_comp("r9b"), -str8_lit_comp("r10b"), -str8_lit_comp("r11b"), -str8_lit_comp("r12b"), -str8_lit_comp("r13b"), -str8_lit_comp("r14b"), -str8_lit_comp("r15b"), -str8_lit_comp("ah"), -str8_lit_comp("ch"), -str8_lit_comp("dh"), -str8_lit_comp("bh"), -str8_lit_comp("xmm0"), -str8_lit_comp("xmm1"), -str8_lit_comp("xmm2"), -str8_lit_comp("xmm3"), -str8_lit_comp("xmm4"), -str8_lit_comp("xmm5"), -str8_lit_comp("xmm6"), -str8_lit_comp("xmm7"), -str8_lit_comp("xmm8"), -str8_lit_comp("xmm9"), -str8_lit_comp("xmm10"), -str8_lit_comp("xmm11"), -str8_lit_comp("xmm12"), -str8_lit_comp("xmm13"), -str8_lit_comp("xmm14"), -str8_lit_comp("xmm15"), -str8_lit_comp("ymm0"), -str8_lit_comp("ymm1"), -str8_lit_comp("ymm2"), -str8_lit_comp("ymm3"), -str8_lit_comp("ymm4"), -str8_lit_comp("ymm5"), -str8_lit_comp("ymm6"), -str8_lit_comp("ymm7"), -str8_lit_comp("ymm8"), -str8_lit_comp("ymm9"), -str8_lit_comp("ymm10"), -str8_lit_comp("ymm11"), -str8_lit_comp("ymm12"), -str8_lit_comp("ymm13"), -str8_lit_comp("ymm14"), -str8_lit_comp("ymm15"), -str8_lit_comp("mm0"), -str8_lit_comp("mm1"), -str8_lit_comp("mm2"), -str8_lit_comp("mm3"), -str8_lit_comp("mm4"), -str8_lit_comp("mm5"), -str8_lit_comp("mm6"), -str8_lit_comp("mm7"), -}; - -REGS_Rng regs_g_reg_code_x64_rng_table[93] = -{ -{0}, -{(U16)OffsetOf(REGS_RegBlockX64, rax), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rcx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rdx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rbx), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rsp), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rbp), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rsi), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rdi), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r8), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r9), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r10), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r11), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r12), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r13), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r14), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, r15), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, fsbase), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, gsbase), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rip), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, rflags), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr0), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr1), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr2), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr3), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr4), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr5), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr6), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, dr7), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, st0), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st1), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st2), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st3), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st4), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st5), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st6), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, st7), 10}, -{(U16)OffsetOf(REGS_RegBlockX64, fcw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fsw), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ftw), 1}, -{(U16)OffsetOf(REGS_RegBlockX64, fop), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fip), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, fdp), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, mxcsr), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, mxcsr_mask), 4}, -{(U16)OffsetOf(REGS_RegBlockX64, ss), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, cs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, ds), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, es), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, fs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, gs), 2}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm0), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm1), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm2), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm3), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm4), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm5), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm6), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm7), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm8), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm9), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm10), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm11), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm12), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm13), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm14), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm15), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm16), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm17), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm18), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm19), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm20), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm21), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm22), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm23), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm24), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm25), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm26), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm27), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm28), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm29), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm30), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, zmm31), 64}, -{(U16)OffsetOf(REGS_RegBlockX64, k0), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, k1), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, k2), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, k3), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, k4), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, k5), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, k6), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, k7), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, cetmsr), 8}, -{(U16)OffsetOf(REGS_RegBlockX64, cetssp), 8}, -}; - -REGS_Slice regs_g_alias_code_x64_slice_table[95] = -{ -{0}, -{REGS_RegCodeX64_rax, 0, 4}, -{REGS_RegCodeX64_rcx, 0, 4}, -{REGS_RegCodeX64_rdx, 0, 4}, -{REGS_RegCodeX64_rbx, 0, 4}, -{REGS_RegCodeX64_rsp, 0, 4}, -{REGS_RegCodeX64_rbp, 0, 4}, -{REGS_RegCodeX64_rsi, 0, 4}, -{REGS_RegCodeX64_rdi, 0, 4}, -{REGS_RegCodeX64_r8, 0, 4}, -{REGS_RegCodeX64_r9, 0, 4}, -{REGS_RegCodeX64_r10, 0, 4}, -{REGS_RegCodeX64_r11, 0, 4}, -{REGS_RegCodeX64_r12, 0, 4}, -{REGS_RegCodeX64_r13, 0, 4}, -{REGS_RegCodeX64_r14, 0, 4}, -{REGS_RegCodeX64_r15, 0, 4}, -{REGS_RegCodeX64_rflags, 0, 4}, -{REGS_RegCodeX64_rax, 0, 2}, -{REGS_RegCodeX64_rcx, 0, 2}, -{REGS_RegCodeX64_rdx, 0, 2}, -{REGS_RegCodeX64_rbx, 0, 2}, -{REGS_RegCodeX64_rsi, 0, 2}, -{REGS_RegCodeX64_rdi, 0, 2}, -{REGS_RegCodeX64_rsp, 0, 2}, -{REGS_RegCodeX64_rbp, 0, 2}, -{REGS_RegCodeX64_rip, 0, 2}, -{REGS_RegCodeX64_r8, 0, 2}, -{REGS_RegCodeX64_r9, 0, 2}, -{REGS_RegCodeX64_r10, 0, 2}, -{REGS_RegCodeX64_r11, 0, 2}, -{REGS_RegCodeX64_r12, 0, 2}, -{REGS_RegCodeX64_r13, 0, 2}, -{REGS_RegCodeX64_r14, 0, 2}, -{REGS_RegCodeX64_r15, 0, 2}, -{REGS_RegCodeX64_rax, 0, 1}, -{REGS_RegCodeX64_rcx, 0, 1}, -{REGS_RegCodeX64_rdx, 0, 1}, -{REGS_RegCodeX64_rbx, 0, 1}, -{REGS_RegCodeX64_rsi, 0, 1}, -{REGS_RegCodeX64_rdi, 0, 1}, -{REGS_RegCodeX64_rbp, 0, 1}, -{REGS_RegCodeX64_rsp, 0, 1}, -{REGS_RegCodeX64_r8, 0, 1}, -{REGS_RegCodeX64_r9, 0, 1}, -{REGS_RegCodeX64_r10, 0, 1}, -{REGS_RegCodeX64_r11, 0, 1}, -{REGS_RegCodeX64_r12, 0, 1}, -{REGS_RegCodeX64_r13, 0, 1}, -{REGS_RegCodeX64_r14, 0, 1}, -{REGS_RegCodeX64_r15, 0, 1}, -{REGS_RegCodeX64_rax, 1, 1}, -{REGS_RegCodeX64_rcx, 1, 1}, -{REGS_RegCodeX64_rdx, 1, 1}, -{REGS_RegCodeX64_rbx, 1, 1}, -{REGS_RegCodeX64_zmm0, 0, 16}, -{REGS_RegCodeX64_zmm1, 0, 16}, -{REGS_RegCodeX64_zmm2, 0, 16}, -{REGS_RegCodeX64_zmm3, 0, 16}, -{REGS_RegCodeX64_zmm4, 0, 16}, -{REGS_RegCodeX64_zmm5, 0, 16}, -{REGS_RegCodeX64_zmm6, 0, 16}, -{REGS_RegCodeX64_zmm7, 0, 16}, -{REGS_RegCodeX64_zmm8, 0, 16}, -{REGS_RegCodeX64_zmm9, 0, 16}, -{REGS_RegCodeX64_zmm10, 0, 16}, -{REGS_RegCodeX64_zmm11, 0, 16}, -{REGS_RegCodeX64_zmm12, 0, 16}, -{REGS_RegCodeX64_zmm13, 0, 16}, -{REGS_RegCodeX64_zmm14, 0, 16}, -{REGS_RegCodeX64_zmm15, 0, 16}, -{REGS_RegCodeX64_zmm0, 0, 32}, -{REGS_RegCodeX64_zmm1, 0, 32}, -{REGS_RegCodeX64_zmm2, 0, 32}, -{REGS_RegCodeX64_zmm3, 0, 32}, -{REGS_RegCodeX64_zmm4, 0, 32}, -{REGS_RegCodeX64_zmm5, 0, 32}, -{REGS_RegCodeX64_zmm6, 0, 32}, -{REGS_RegCodeX64_zmm7, 0, 32}, -{REGS_RegCodeX64_zmm8, 0, 32}, -{REGS_RegCodeX64_zmm9, 0, 32}, -{REGS_RegCodeX64_zmm10, 0, 32}, -{REGS_RegCodeX64_zmm11, 0, 32}, -{REGS_RegCodeX64_zmm12, 0, 32}, -{REGS_RegCodeX64_zmm13, 0, 32}, -{REGS_RegCodeX64_zmm14, 0, 32}, -{REGS_RegCodeX64_zmm15, 0, 32}, -{REGS_RegCodeX64_st0, 0, 8}, -{REGS_RegCodeX64_st1, 0, 8}, -{REGS_RegCodeX64_st2, 0, 8}, -{REGS_RegCodeX64_st3, 0, 8}, -{REGS_RegCodeX64_st4, 0, 8}, -{REGS_RegCodeX64_st5, 0, 8}, -{REGS_RegCodeX64_st6, 0, 8}, -{REGS_RegCodeX64_st7, 0, 8}, -}; - -C_LINKAGE_END - diff --git a/src/regs/generated/regs.meta.h b/src/regs/generated/regs.meta.h deleted file mode 100644 index 5bf2dfdb..00000000 --- a/src/regs/generated/regs.meta.h +++ /dev/null @@ -1,314 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef REGS_META_H -#define REGS_META_H - -typedef enum REGS_RegCodeX64 -{ -REGS_RegCodeX64_NULL, -REGS_RegCodeX64_rax, -REGS_RegCodeX64_rcx, -REGS_RegCodeX64_rdx, -REGS_RegCodeX64_rbx, -REGS_RegCodeX64_rsp, -REGS_RegCodeX64_rbp, -REGS_RegCodeX64_rsi, -REGS_RegCodeX64_rdi, -REGS_RegCodeX64_r8, -REGS_RegCodeX64_r9, -REGS_RegCodeX64_r10, -REGS_RegCodeX64_r11, -REGS_RegCodeX64_r12, -REGS_RegCodeX64_r13, -REGS_RegCodeX64_r14, -REGS_RegCodeX64_r15, -REGS_RegCodeX64_fsbase, -REGS_RegCodeX64_gsbase, -REGS_RegCodeX64_rip, -REGS_RegCodeX64_rflags, -REGS_RegCodeX64_dr0, -REGS_RegCodeX64_dr1, -REGS_RegCodeX64_dr2, -REGS_RegCodeX64_dr3, -REGS_RegCodeX64_dr4, -REGS_RegCodeX64_dr5, -REGS_RegCodeX64_dr6, -REGS_RegCodeX64_dr7, -REGS_RegCodeX64_st0, -REGS_RegCodeX64_st1, -REGS_RegCodeX64_st2, -REGS_RegCodeX64_st3, -REGS_RegCodeX64_st4, -REGS_RegCodeX64_st5, -REGS_RegCodeX64_st6, -REGS_RegCodeX64_st7, -REGS_RegCodeX64_fcw, -REGS_RegCodeX64_fsw, -REGS_RegCodeX64_ftw, -REGS_RegCodeX64_fop, -REGS_RegCodeX64_fip, -REGS_RegCodeX64_fdp, -REGS_RegCodeX64_mxcsr, -REGS_RegCodeX64_mxcsr_mask, -REGS_RegCodeX64_ss, -REGS_RegCodeX64_cs, -REGS_RegCodeX64_ds, -REGS_RegCodeX64_es, -REGS_RegCodeX64_fs, -REGS_RegCodeX64_gs, -REGS_RegCodeX64_zmm0, -REGS_RegCodeX64_zmm1, -REGS_RegCodeX64_zmm2, -REGS_RegCodeX64_zmm3, -REGS_RegCodeX64_zmm4, -REGS_RegCodeX64_zmm5, -REGS_RegCodeX64_zmm6, -REGS_RegCodeX64_zmm7, -REGS_RegCodeX64_zmm8, -REGS_RegCodeX64_zmm9, -REGS_RegCodeX64_zmm10, -REGS_RegCodeX64_zmm11, -REGS_RegCodeX64_zmm12, -REGS_RegCodeX64_zmm13, -REGS_RegCodeX64_zmm14, -REGS_RegCodeX64_zmm15, -REGS_RegCodeX64_zmm16, -REGS_RegCodeX64_zmm17, -REGS_RegCodeX64_zmm18, -REGS_RegCodeX64_zmm19, -REGS_RegCodeX64_zmm20, -REGS_RegCodeX64_zmm21, -REGS_RegCodeX64_zmm22, -REGS_RegCodeX64_zmm23, -REGS_RegCodeX64_zmm24, -REGS_RegCodeX64_zmm25, -REGS_RegCodeX64_zmm26, -REGS_RegCodeX64_zmm27, -REGS_RegCodeX64_zmm28, -REGS_RegCodeX64_zmm29, -REGS_RegCodeX64_zmm30, -REGS_RegCodeX64_zmm31, -REGS_RegCodeX64_k0, -REGS_RegCodeX64_k1, -REGS_RegCodeX64_k2, -REGS_RegCodeX64_k3, -REGS_RegCodeX64_k4, -REGS_RegCodeX64_k5, -REGS_RegCodeX64_k6, -REGS_RegCodeX64_k7, -REGS_RegCodeX64_cetmsr, -REGS_RegCodeX64_cetssp, -REGS_RegCodeX64_COUNT, -} REGS_RegCodeX64; - -typedef enum REGS_AliasCodeX64 -{ -REGS_AliasCodeX64_NULL, -REGS_AliasCodeX64_eax, -REGS_AliasCodeX64_ecx, -REGS_AliasCodeX64_edx, -REGS_AliasCodeX64_ebx, -REGS_AliasCodeX64_esp, -REGS_AliasCodeX64_ebp, -REGS_AliasCodeX64_esi, -REGS_AliasCodeX64_edi, -REGS_AliasCodeX64_r8d, -REGS_AliasCodeX64_r9d, -REGS_AliasCodeX64_r10d, -REGS_AliasCodeX64_r11d, -REGS_AliasCodeX64_r12d, -REGS_AliasCodeX64_r13d, -REGS_AliasCodeX64_r14d, -REGS_AliasCodeX64_r15d, -REGS_AliasCodeX64_eflags, -REGS_AliasCodeX64_ax, -REGS_AliasCodeX64_cx, -REGS_AliasCodeX64_dx, -REGS_AliasCodeX64_bx, -REGS_AliasCodeX64_si, -REGS_AliasCodeX64_di, -REGS_AliasCodeX64_sp, -REGS_AliasCodeX64_bp, -REGS_AliasCodeX64_ip, -REGS_AliasCodeX64_r8w, -REGS_AliasCodeX64_r9w, -REGS_AliasCodeX64_r10w, -REGS_AliasCodeX64_r11w, -REGS_AliasCodeX64_r12w, -REGS_AliasCodeX64_r13w, -REGS_AliasCodeX64_r14w, -REGS_AliasCodeX64_r15w, -REGS_AliasCodeX64_al, -REGS_AliasCodeX64_cl, -REGS_AliasCodeX64_dl, -REGS_AliasCodeX64_bl, -REGS_AliasCodeX64_sil, -REGS_AliasCodeX64_dil, -REGS_AliasCodeX64_bpl, -REGS_AliasCodeX64_spl, -REGS_AliasCodeX64_r8b, -REGS_AliasCodeX64_r9b, -REGS_AliasCodeX64_r10b, -REGS_AliasCodeX64_r11b, -REGS_AliasCodeX64_r12b, -REGS_AliasCodeX64_r13b, -REGS_AliasCodeX64_r14b, -REGS_AliasCodeX64_r15b, -REGS_AliasCodeX64_ah, -REGS_AliasCodeX64_ch, -REGS_AliasCodeX64_dh, -REGS_AliasCodeX64_bh, -REGS_AliasCodeX64_xmm0, -REGS_AliasCodeX64_xmm1, -REGS_AliasCodeX64_xmm2, -REGS_AliasCodeX64_xmm3, -REGS_AliasCodeX64_xmm4, -REGS_AliasCodeX64_xmm5, -REGS_AliasCodeX64_xmm6, -REGS_AliasCodeX64_xmm7, -REGS_AliasCodeX64_xmm8, -REGS_AliasCodeX64_xmm9, -REGS_AliasCodeX64_xmm10, -REGS_AliasCodeX64_xmm11, -REGS_AliasCodeX64_xmm12, -REGS_AliasCodeX64_xmm13, -REGS_AliasCodeX64_xmm14, -REGS_AliasCodeX64_xmm15, -REGS_AliasCodeX64_ymm0, -REGS_AliasCodeX64_ymm1, -REGS_AliasCodeX64_ymm2, -REGS_AliasCodeX64_ymm3, -REGS_AliasCodeX64_ymm4, -REGS_AliasCodeX64_ymm5, -REGS_AliasCodeX64_ymm6, -REGS_AliasCodeX64_ymm7, -REGS_AliasCodeX64_ymm8, -REGS_AliasCodeX64_ymm9, -REGS_AliasCodeX64_ymm10, -REGS_AliasCodeX64_ymm11, -REGS_AliasCodeX64_ymm12, -REGS_AliasCodeX64_ymm13, -REGS_AliasCodeX64_ymm14, -REGS_AliasCodeX64_ymm15, -REGS_AliasCodeX64_mm0, -REGS_AliasCodeX64_mm1, -REGS_AliasCodeX64_mm2, -REGS_AliasCodeX64_mm3, -REGS_AliasCodeX64_mm4, -REGS_AliasCodeX64_mm5, -REGS_AliasCodeX64_mm6, -REGS_AliasCodeX64_mm7, -REGS_AliasCodeX64_COUNT, -} REGS_AliasCodeX64; - -typedef struct REGS_RegBlockX64 REGS_RegBlockX64; -struct REGS_RegBlockX64 -{ -REGS_Reg64 rax; -REGS_Reg64 rcx; -REGS_Reg64 rdx; -REGS_Reg64 rbx; -REGS_Reg64 rsp; -REGS_Reg64 rbp; -REGS_Reg64 rsi; -REGS_Reg64 rdi; -REGS_Reg64 r8; -REGS_Reg64 r9; -REGS_Reg64 r10; -REGS_Reg64 r11; -REGS_Reg64 r12; -REGS_Reg64 r13; -REGS_Reg64 r14; -REGS_Reg64 r15; -REGS_Reg64 fsbase; -REGS_Reg64 gsbase; -REGS_Reg64 rip; -REGS_Reg64 rflags; -REGS_Reg64 dr0; -REGS_Reg64 dr1; -REGS_Reg64 dr2; -REGS_Reg64 dr3; -REGS_Reg64 dr4; -REGS_Reg64 dr5; -REGS_Reg64 dr6; -REGS_Reg64 dr7; -REGS_Reg80 st0; -REGS_Reg80 st1; -REGS_Reg80 st2; -REGS_Reg80 st3; -REGS_Reg80 st4; -REGS_Reg80 st5; -REGS_Reg80 st6; -REGS_Reg80 st7; -REGS_Reg16 fcw; -REGS_Reg16 fsw; -REGS_Reg8 ftw; -REGS_Reg16 fop; -REGS_Reg64 fip; -REGS_Reg64 fdp; -REGS_Reg32 mxcsr; -REGS_Reg32 mxcsr_mask; -REGS_Reg16 ss; -REGS_Reg16 cs; -REGS_Reg16 ds; -REGS_Reg16 es; -REGS_Reg16 fs; -REGS_Reg16 gs; -REGS_Reg512 zmm0; -REGS_Reg512 zmm1; -REGS_Reg512 zmm2; -REGS_Reg512 zmm3; -REGS_Reg512 zmm4; -REGS_Reg512 zmm5; -REGS_Reg512 zmm6; -REGS_Reg512 zmm7; -REGS_Reg512 zmm8; -REGS_Reg512 zmm9; -REGS_Reg512 zmm10; -REGS_Reg512 zmm11; -REGS_Reg512 zmm12; -REGS_Reg512 zmm13; -REGS_Reg512 zmm14; -REGS_Reg512 zmm15; -REGS_Reg512 zmm16; -REGS_Reg512 zmm17; -REGS_Reg512 zmm18; -REGS_Reg512 zmm19; -REGS_Reg512 zmm20; -REGS_Reg512 zmm21; -REGS_Reg512 zmm22; -REGS_Reg512 zmm23; -REGS_Reg512 zmm24; -REGS_Reg512 zmm25; -REGS_Reg512 zmm26; -REGS_Reg512 zmm27; -REGS_Reg512 zmm28; -REGS_Reg512 zmm29; -REGS_Reg512 zmm30; -REGS_Reg512 zmm31; -REGS_Reg64 k0; -REGS_Reg64 k1; -REGS_Reg64 k2; -REGS_Reg64 k3; -REGS_Reg64 k4; -REGS_Reg64 k5; -REGS_Reg64 k6; -REGS_Reg64 k7; -REGS_Reg64 cetmsr; -REGS_Reg64 cetssp; -}; - -C_LINKAGE_BEGIN -extern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[93]; -extern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[95]; -extern String8 regs_g_reg_code_x64_string_table[93]; -extern String8 regs_g_alias_code_x64_string_table[95]; -extern REGS_Rng regs_g_reg_code_x64_rng_table[93]; -extern REGS_Slice regs_g_alias_code_x64_slice_table[95]; - -C_LINKAGE_END - -#endif // REGS_META_H diff --git a/src/regs/rdi/generated/regs_rdi.meta.c b/src/regs/rdi/generated/regs_rdi.meta.c deleted file mode 100644 index 49a4c827..00000000 --- a/src/regs/rdi/generated/regs_rdi.meta.c +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code) -{ -RDI_RegCode result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64: -{ -switch(code) -{ -default:{}break; -case REGS_RegCodeX64_rax:{result = RDI_RegCodeX64_rax;}break; -case REGS_RegCodeX64_rcx:{result = RDI_RegCodeX64_rcx;}break; -case REGS_RegCodeX64_rdx:{result = RDI_RegCodeX64_rdx;}break; -case REGS_RegCodeX64_rbx:{result = RDI_RegCodeX64_rbx;}break; -case REGS_RegCodeX64_rsp:{result = RDI_RegCodeX64_rsp;}break; -case REGS_RegCodeX64_rbp:{result = RDI_RegCodeX64_rbp;}break; -case REGS_RegCodeX64_rsi:{result = RDI_RegCodeX64_rsi;}break; -case REGS_RegCodeX64_rdi:{result = RDI_RegCodeX64_rdi;}break; -case REGS_RegCodeX64_r8:{result = RDI_RegCodeX64_r8;}break; -case REGS_RegCodeX64_r9:{result = RDI_RegCodeX64_r9;}break; -case REGS_RegCodeX64_r10:{result = RDI_RegCodeX64_r10;}break; -case REGS_RegCodeX64_r11:{result = RDI_RegCodeX64_r11;}break; -case REGS_RegCodeX64_r12:{result = RDI_RegCodeX64_r12;}break; -case REGS_RegCodeX64_r13:{result = RDI_RegCodeX64_r13;}break; -case REGS_RegCodeX64_r14:{result = RDI_RegCodeX64_r14;}break; -case REGS_RegCodeX64_r15:{result = RDI_RegCodeX64_r15;}break; -case REGS_RegCodeX64_fsbase:{result = RDI_RegCodeX64_fsbase;}break; -case REGS_RegCodeX64_gsbase:{result = RDI_RegCodeX64_gsbase;}break; -case REGS_RegCodeX64_rip:{result = RDI_RegCodeX64_rip;}break; -case REGS_RegCodeX64_rflags:{result = RDI_RegCodeX64_rflags;}break; -case REGS_RegCodeX64_dr0:{result = RDI_RegCodeX64_dr0;}break; -case REGS_RegCodeX64_dr1:{result = RDI_RegCodeX64_dr1;}break; -case REGS_RegCodeX64_dr2:{result = RDI_RegCodeX64_dr2;}break; -case REGS_RegCodeX64_dr3:{result = RDI_RegCodeX64_dr3;}break; -case REGS_RegCodeX64_dr4:{result = RDI_RegCodeX64_dr4;}break; -case REGS_RegCodeX64_dr5:{result = RDI_RegCodeX64_dr5;}break; -case REGS_RegCodeX64_dr6:{result = RDI_RegCodeX64_dr6;}break; -case REGS_RegCodeX64_dr7:{result = RDI_RegCodeX64_dr7;}break; -case REGS_RegCodeX64_st0:{result = RDI_RegCodeX64_st0;}break; -case REGS_RegCodeX64_st1:{result = RDI_RegCodeX64_st1;}break; -case REGS_RegCodeX64_st2:{result = RDI_RegCodeX64_st2;}break; -case REGS_RegCodeX64_st3:{result = RDI_RegCodeX64_st3;}break; -case REGS_RegCodeX64_st4:{result = RDI_RegCodeX64_st4;}break; -case REGS_RegCodeX64_st5:{result = RDI_RegCodeX64_st5;}break; -case REGS_RegCodeX64_st6:{result = RDI_RegCodeX64_st6;}break; -case REGS_RegCodeX64_st7:{result = RDI_RegCodeX64_st7;}break; -case REGS_RegCodeX64_fcw:{result = RDI_RegCodeX64_fcw;}break; -case REGS_RegCodeX64_fsw:{result = RDI_RegCodeX64_fsw;}break; -case REGS_RegCodeX64_ftw:{result = RDI_RegCodeX64_ftw;}break; -case REGS_RegCodeX64_fop:{result = RDI_RegCodeX64_fop;}break; -case REGS_RegCodeX64_fip:{result = RDI_RegCodeX64_fip;}break; -case REGS_RegCodeX64_fdp:{result = RDI_RegCodeX64_fdp;}break; -case REGS_RegCodeX64_mxcsr:{result = RDI_RegCodeX64_mxcsr;}break; -case REGS_RegCodeX64_mxcsr_mask:{result = RDI_RegCodeX64_mxcsr_mask;}break; -case REGS_RegCodeX64_ss:{result = RDI_RegCodeX64_ss;}break; -case REGS_RegCodeX64_cs:{result = RDI_RegCodeX64_cs;}break; -case REGS_RegCodeX64_ds:{result = RDI_RegCodeX64_ds;}break; -case REGS_RegCodeX64_es:{result = RDI_RegCodeX64_es;}break; -case REGS_RegCodeX64_fs:{result = RDI_RegCodeX64_fs;}break; -case REGS_RegCodeX64_gs:{result = RDI_RegCodeX64_gs;}break; -case REGS_RegCodeX64_zmm0:{result = RDI_RegCodeX64_zmm0;}break; -case REGS_RegCodeX64_zmm1:{result = RDI_RegCodeX64_zmm1;}break; -case REGS_RegCodeX64_zmm2:{result = RDI_RegCodeX64_zmm2;}break; -case REGS_RegCodeX64_zmm3:{result = RDI_RegCodeX64_zmm3;}break; -case REGS_RegCodeX64_zmm4:{result = RDI_RegCodeX64_zmm4;}break; -case REGS_RegCodeX64_zmm5:{result = RDI_RegCodeX64_zmm5;}break; -case REGS_RegCodeX64_zmm6:{result = RDI_RegCodeX64_zmm6;}break; -case REGS_RegCodeX64_zmm7:{result = RDI_RegCodeX64_zmm7;}break; -case REGS_RegCodeX64_zmm8:{result = RDI_RegCodeX64_zmm8;}break; -case REGS_RegCodeX64_zmm9:{result = RDI_RegCodeX64_zmm9;}break; -case REGS_RegCodeX64_zmm10:{result = RDI_RegCodeX64_zmm10;}break; -case REGS_RegCodeX64_zmm11:{result = RDI_RegCodeX64_zmm11;}break; -case REGS_RegCodeX64_zmm12:{result = RDI_RegCodeX64_zmm12;}break; -case REGS_RegCodeX64_zmm13:{result = RDI_RegCodeX64_zmm13;}break; -case REGS_RegCodeX64_zmm14:{result = RDI_RegCodeX64_zmm14;}break; -case REGS_RegCodeX64_zmm15:{result = RDI_RegCodeX64_zmm15;}break; -case REGS_RegCodeX64_zmm16:{result = RDI_RegCodeX64_zmm16;}break; -case REGS_RegCodeX64_zmm17:{result = RDI_RegCodeX64_zmm17;}break; -case REGS_RegCodeX64_zmm18:{result = RDI_RegCodeX64_zmm18;}break; -case REGS_RegCodeX64_zmm19:{result = RDI_RegCodeX64_zmm19;}break; -case REGS_RegCodeX64_zmm20:{result = RDI_RegCodeX64_zmm20;}break; -case REGS_RegCodeX64_zmm21:{result = RDI_RegCodeX64_zmm21;}break; -case REGS_RegCodeX64_zmm22:{result = RDI_RegCodeX64_zmm22;}break; -case REGS_RegCodeX64_zmm23:{result = RDI_RegCodeX64_zmm23;}break; -case REGS_RegCodeX64_zmm24:{result = RDI_RegCodeX64_zmm24;}break; -case REGS_RegCodeX64_zmm25:{result = RDI_RegCodeX64_zmm25;}break; -case REGS_RegCodeX64_zmm26:{result = RDI_RegCodeX64_zmm26;}break; -case REGS_RegCodeX64_zmm27:{result = RDI_RegCodeX64_zmm27;}break; -case REGS_RegCodeX64_zmm28:{result = RDI_RegCodeX64_zmm28;}break; -case REGS_RegCodeX64_zmm29:{result = RDI_RegCodeX64_zmm29;}break; -case REGS_RegCodeX64_zmm30:{result = RDI_RegCodeX64_zmm30;}break; -case REGS_RegCodeX64_zmm31:{result = RDI_RegCodeX64_zmm31;}break; -case REGS_RegCodeX64_k0:{result = RDI_RegCodeX64_k0;}break; -case REGS_RegCodeX64_k1:{result = RDI_RegCodeX64_k1;}break; -case REGS_RegCodeX64_k2:{result = RDI_RegCodeX64_k2;}break; -case REGS_RegCodeX64_k3:{result = RDI_RegCodeX64_k3;}break; -case REGS_RegCodeX64_k4:{result = RDI_RegCodeX64_k4;}break; -case REGS_RegCodeX64_k5:{result = RDI_RegCodeX64_k5;}break; -case REGS_RegCodeX64_k6:{result = RDI_RegCodeX64_k6;}break; -case REGS_RegCodeX64_k7:{result = RDI_RegCodeX64_k7;}break; -case REGS_RegCodeX64_cetmsr:{result = RDI_RegCodeX64_cetmsr;}break; -case REGS_RegCodeX64_cetssp:{result = RDI_RegCodeX64_cetssp;}break; -} -}break; -case Arch_x86: -{ -NotImplemented; -}break; -} -return result; -} -internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode code) -{ -REGS_RegCode result = 0; -switch(arch) -{ -default:{}break; -case Arch_x64: -{ -switch(code) -{ -default:{}break; -case RDI_RegCodeX64_rax:{result = REGS_RegCodeX64_rax;}break; -case RDI_RegCodeX64_rcx:{result = REGS_RegCodeX64_rcx;}break; -case RDI_RegCodeX64_rdx:{result = REGS_RegCodeX64_rdx;}break; -case RDI_RegCodeX64_rbx:{result = REGS_RegCodeX64_rbx;}break; -case RDI_RegCodeX64_rsp:{result = REGS_RegCodeX64_rsp;}break; -case RDI_RegCodeX64_rbp:{result = REGS_RegCodeX64_rbp;}break; -case RDI_RegCodeX64_rsi:{result = REGS_RegCodeX64_rsi;}break; -case RDI_RegCodeX64_rdi:{result = REGS_RegCodeX64_rdi;}break; -case RDI_RegCodeX64_r8:{result = REGS_RegCodeX64_r8;}break; -case RDI_RegCodeX64_r9:{result = REGS_RegCodeX64_r9;}break; -case RDI_RegCodeX64_r10:{result = REGS_RegCodeX64_r10;}break; -case RDI_RegCodeX64_r11:{result = REGS_RegCodeX64_r11;}break; -case RDI_RegCodeX64_r12:{result = REGS_RegCodeX64_r12;}break; -case RDI_RegCodeX64_r13:{result = REGS_RegCodeX64_r13;}break; -case RDI_RegCodeX64_r14:{result = REGS_RegCodeX64_r14;}break; -case RDI_RegCodeX64_r15:{result = REGS_RegCodeX64_r15;}break; -case RDI_RegCodeX64_fsbase:{result = REGS_RegCodeX64_fsbase;}break; -case RDI_RegCodeX64_gsbase:{result = REGS_RegCodeX64_gsbase;}break; -case RDI_RegCodeX64_rip:{result = REGS_RegCodeX64_rip;}break; -case RDI_RegCodeX64_rflags:{result = REGS_RegCodeX64_rflags;}break; -case RDI_RegCodeX64_dr0:{result = REGS_RegCodeX64_dr0;}break; -case RDI_RegCodeX64_dr1:{result = REGS_RegCodeX64_dr1;}break; -case RDI_RegCodeX64_dr2:{result = REGS_RegCodeX64_dr2;}break; -case RDI_RegCodeX64_dr3:{result = REGS_RegCodeX64_dr3;}break; -case RDI_RegCodeX64_dr4:{result = REGS_RegCodeX64_dr4;}break; -case RDI_RegCodeX64_dr5:{result = REGS_RegCodeX64_dr5;}break; -case RDI_RegCodeX64_dr6:{result = REGS_RegCodeX64_dr6;}break; -case RDI_RegCodeX64_dr7:{result = REGS_RegCodeX64_dr7;}break; -case RDI_RegCodeX64_st0:{result = REGS_RegCodeX64_st0;}break; -case RDI_RegCodeX64_st1:{result = REGS_RegCodeX64_st1;}break; -case RDI_RegCodeX64_st2:{result = REGS_RegCodeX64_st2;}break; -case RDI_RegCodeX64_st3:{result = REGS_RegCodeX64_st3;}break; -case RDI_RegCodeX64_st4:{result = REGS_RegCodeX64_st4;}break; -case RDI_RegCodeX64_st5:{result = REGS_RegCodeX64_st5;}break; -case RDI_RegCodeX64_st6:{result = REGS_RegCodeX64_st6;}break; -case RDI_RegCodeX64_st7:{result = REGS_RegCodeX64_st7;}break; -case RDI_RegCodeX64_fcw:{result = REGS_RegCodeX64_fcw;}break; -case RDI_RegCodeX64_fsw:{result = REGS_RegCodeX64_fsw;}break; -case RDI_RegCodeX64_ftw:{result = REGS_RegCodeX64_ftw;}break; -case RDI_RegCodeX64_fop:{result = REGS_RegCodeX64_fop;}break; -case RDI_RegCodeX64_fip:{result = REGS_RegCodeX64_fip;}break; -case RDI_RegCodeX64_fdp:{result = REGS_RegCodeX64_fdp;}break; -case RDI_RegCodeX64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break; -case RDI_RegCodeX64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break; -case RDI_RegCodeX64_ss:{result = REGS_RegCodeX64_ss;}break; -case RDI_RegCodeX64_cs:{result = REGS_RegCodeX64_cs;}break; -case RDI_RegCodeX64_ds:{result = REGS_RegCodeX64_ds;}break; -case RDI_RegCodeX64_es:{result = REGS_RegCodeX64_es;}break; -case RDI_RegCodeX64_fs:{result = REGS_RegCodeX64_fs;}break; -case RDI_RegCodeX64_gs:{result = REGS_RegCodeX64_gs;}break; -case RDI_RegCodeX64_zmm0:{result = REGS_RegCodeX64_zmm0;}break; -case RDI_RegCodeX64_zmm1:{result = REGS_RegCodeX64_zmm1;}break; -case RDI_RegCodeX64_zmm2:{result = REGS_RegCodeX64_zmm2;}break; -case RDI_RegCodeX64_zmm3:{result = REGS_RegCodeX64_zmm3;}break; -case RDI_RegCodeX64_zmm4:{result = REGS_RegCodeX64_zmm4;}break; -case RDI_RegCodeX64_zmm5:{result = REGS_RegCodeX64_zmm5;}break; -case RDI_RegCodeX64_zmm6:{result = REGS_RegCodeX64_zmm6;}break; -case RDI_RegCodeX64_zmm7:{result = REGS_RegCodeX64_zmm7;}break; -case RDI_RegCodeX64_zmm8:{result = REGS_RegCodeX64_zmm8;}break; -case RDI_RegCodeX64_zmm9:{result = REGS_RegCodeX64_zmm9;}break; -case RDI_RegCodeX64_zmm10:{result = REGS_RegCodeX64_zmm10;}break; -case RDI_RegCodeX64_zmm11:{result = REGS_RegCodeX64_zmm11;}break; -case RDI_RegCodeX64_zmm12:{result = REGS_RegCodeX64_zmm12;}break; -case RDI_RegCodeX64_zmm13:{result = REGS_RegCodeX64_zmm13;}break; -case RDI_RegCodeX64_zmm14:{result = REGS_RegCodeX64_zmm14;}break; -case RDI_RegCodeX64_zmm15:{result = REGS_RegCodeX64_zmm15;}break; -case RDI_RegCodeX64_zmm16:{result = REGS_RegCodeX64_zmm16;}break; -case RDI_RegCodeX64_zmm17:{result = REGS_RegCodeX64_zmm17;}break; -case RDI_RegCodeX64_zmm18:{result = REGS_RegCodeX64_zmm18;}break; -case RDI_RegCodeX64_zmm19:{result = REGS_RegCodeX64_zmm19;}break; -case RDI_RegCodeX64_zmm20:{result = REGS_RegCodeX64_zmm20;}break; -case RDI_RegCodeX64_zmm21:{result = REGS_RegCodeX64_zmm21;}break; -case RDI_RegCodeX64_zmm22:{result = REGS_RegCodeX64_zmm22;}break; -case RDI_RegCodeX64_zmm23:{result = REGS_RegCodeX64_zmm23;}break; -case RDI_RegCodeX64_zmm24:{result = REGS_RegCodeX64_zmm24;}break; -case RDI_RegCodeX64_zmm25:{result = REGS_RegCodeX64_zmm25;}break; -case RDI_RegCodeX64_zmm26:{result = REGS_RegCodeX64_zmm26;}break; -case RDI_RegCodeX64_zmm27:{result = REGS_RegCodeX64_zmm27;}break; -case RDI_RegCodeX64_zmm28:{result = REGS_RegCodeX64_zmm28;}break; -case RDI_RegCodeX64_zmm29:{result = REGS_RegCodeX64_zmm29;}break; -case RDI_RegCodeX64_zmm30:{result = REGS_RegCodeX64_zmm30;}break; -case RDI_RegCodeX64_zmm31:{result = REGS_RegCodeX64_zmm31;}break; -case RDI_RegCodeX64_k0:{result = REGS_RegCodeX64_k0;}break; -case RDI_RegCodeX64_k1:{result = REGS_RegCodeX64_k1;}break; -case RDI_RegCodeX64_k2:{result = REGS_RegCodeX64_k2;}break; -case RDI_RegCodeX64_k3:{result = REGS_RegCodeX64_k3;}break; -case RDI_RegCodeX64_k4:{result = REGS_RegCodeX64_k4;}break; -case RDI_RegCodeX64_k5:{result = REGS_RegCodeX64_k5;}break; -case RDI_RegCodeX64_k6:{result = REGS_RegCodeX64_k6;}break; -case RDI_RegCodeX64_k7:{result = REGS_RegCodeX64_k7;}break; -case RDI_RegCodeX64_cetmsr:{result = REGS_RegCodeX64_cetmsr;}break; -case RDI_RegCodeX64_cetssp:{result = REGS_RegCodeX64_cetssp;}break; -} -}break; -case Arch_x86: -{ -NotImplemented; -}break; -} -return result; -} diff --git a/src/regs/rdi/regs_rdi.h b/src/regs/rdi/regs_rdi.h deleted file mode 100644 index a7fadd80..00000000 --- a/src/regs/rdi/regs_rdi.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef REGS_RDI_H -#define REGS_RDI_H - -internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code); -internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode reg); - -#endif //REGS_RDI_H diff --git a/src/regs/rdi/regs_rdi.mdesk b/src/regs/rdi/regs_rdi.mdesk deleted file mode 100644 index a03b73ea..00000000 --- a/src/regs/rdi/regs_rdi.mdesk +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: RADDBG Converter Helper Implementation Generators - -@gen @c_file -{ - `internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code)`; - `{`; - `RDI_RegCode result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - `case Arch_x64:`; - `{`; - `switch(code)` - `{`; - `default:{}break;`; - @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RDI_RegCodeX64_$(a.name);}break;`; - `}`; - `}break;`; - `case Arch_x86:`; - `{`; - `NotImplemented;` - `}break;`; - `}`; - `return result;`; - `}`; -} - -@gen @c_file -{ - `internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode code)`; - `{`; - `REGS_RegCode result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - `case Arch_x64:`; - `{`; - `switch(code)` - `{`; - `default:{}break;`; - @expand(REGS_RegTableX64 a) `case RDI_RegCodeX64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`; - `}`; - `}break;`; - `case Arch_x86:`; - `{`; - `NotImplemented;` - `}break;`; - `}`; - `return result;`; - `}`; -} diff --git a/src/regs/regs.c b/src/regs/regs.c deleted file mode 100644 index 83b171d7..00000000 --- a/src/regs/regs.c +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "regs/generated/regs.meta.c" - -//////////////////////////////// -//~ rjf: Helpers - -internal REGS_RegCode -regs_reg_code_from_name(Arch arch, String8 name) -{ - String8 *name_table = regs_reg_code_string_table_from_arch(arch); - U64 name_count = regs_reg_code_count_from_arch(arch); - for EachIndex(i, name_count) - { - if(str8_match(name_table[i], name, StringMatchFlag_CaseInsensitive)) - { - return (REGS_RegCode)i; - } - } - return 0; -} - -internal REGS_AliasCode -regs_alias_code_from_name(Arch arch, String8 name) -{ - String8 *alias_table = regs_alias_code_string_table_from_arch(arch); - U64 alias_count = regs_alias_code_count_from_arch(arch); - for EachIndex(i, alias_count) - { - if(str8_match(alias_table[i], name, StringMatchFlag_CaseInsensitive)) - { - return (REGS_RegCode)i; - } - } - return 0; -} - -internal Rng1U64 -regs_range_from_code(Arch arch, B32 is_alias, U64 reg_code) -{ - Rng1U64 range = {0}; - if(is_alias) - { - REGS_Slice slice = regs_alias_code_slice_table_from_arch(arch)[reg_code]; - REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[reg_code]; - range = r1u64(rng.byte_off + slice.byte_off, rng.byte_off + slice.byte_off + slice.byte_size); - } - else - { - REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[reg_code]; - range = r1u64(rng.byte_off, rng.byte_off + rng.byte_size); - } - return range; -} - -internal U64 -regs_rip_from_arch_block(Arch arch, void *block) -{ - U64 result = 0; - if(block != 0) switch(arch) - { - default:{}break; - case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break; - case Arch_x86:{NotImplemented;}break; - } - return result; -} - -internal U64 -regs_rsp_from_arch_block(Arch arch, void *block) -{ - U64 result = 0; - if(block != 0) switch(arch) - { - default:{}break; - case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break; - case Arch_x86:{NotImplemented;}break; - } - return result; -} - -internal void -regs_arch_block_write_rip(Arch arch, void *block, U64 rip) -{ - if(block != 0) switch(arch) - { - default:{}break; - case Arch_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break; - case Arch_x86:{NotImplemented;}break; - } -} - -internal void -regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp) -{ - if(block != 0) switch(arch) - { - default:{}break; - case Arch_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break; - case Arch_x86:{NotImplemented;}break; - } -} diff --git a/src/regs/regs.h b/src/regs/regs.h deleted file mode 100644 index 76214f41..00000000 --- a/src/regs/regs.h +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef REGS_H -#define REGS_H - -//////////////////////////////// -//~ rjf: Register Usage Kinds - -typedef enum REGS_UsageKind -{ - REGS_UsageKind_Normal, - REGS_UsageKind_Vector, -} -REGS_UsageKind; - -//////////////////////////////// -//~ rjf: Register Types - -typedef U8 REGS_RegCode; -typedef U8 REGS_AliasCode; - -typedef U8 REGS_Reg8; - -typedef union REGS_Reg16 REGS_Reg16; -union REGS_Reg16 -{ - U8 v[2]; - U16 u16; -}; - -typedef union REGS_Reg32 REGS_Reg32; -union REGS_Reg32 -{ - U8 v[4]; - U32 u32; - F32 f32; -}; - -typedef union REGS_Reg64 REGS_Reg64; -union REGS_Reg64 -{ - U8 v[8]; - U32 u32[2]; - U64 u64; - F64 f64; -}; - -#pragma pack(push, 1) -typedef struct REGS_Reg80 REGS_Reg80; -struct REGS_Reg80 -{ - U64 int1_frac63; - U16 sign1_exp15; -}; -#pragma pack(pop) - -typedef union REGS_Reg128 REGS_Reg128; -union REGS_Reg128 -{ - U8 v[16]; - U32 u32[4]; - F32 f32[4]; - U64 u64[2]; - F64 f64[2]; -}; - -typedef union REGS_Reg256 REGS_Reg256; -union REGS_Reg256 -{ - U8 v[32]; - U32 u32[8]; - F32 f32[8]; - U64 u64[4]; - F64 f64[4]; -}; - -typedef union REGS_Reg512 REGS_Reg512; -union REGS_Reg512 -{ - U8 v[64]; - U32 u32[16]; - F32 f32[16]; - U64 u64[8]; - F64 f64[8]; -}; - -//////////////////////////////// -//~ rjf: Register Slicing Types - -typedef struct REGS_Rng REGS_Rng; -struct REGS_Rng -{ - U16 byte_off; - U16 byte_size; -}; - -typedef struct REGS_Slice REGS_Slice; -struct REGS_Slice -{ - U16 code; - U8 byte_off; - U8 byte_size; -}; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "regs/generated/regs.meta.h" - -//////////////////////////////// -//~ rjf: Helpers - -internal REGS_RegCode regs_reg_code_from_name(Arch arch, String8 name); -internal REGS_AliasCode regs_alias_code_from_name(Arch arch, String8 name); -internal Rng1U64 regs_range_from_code(Arch arch, B32 is_alias, U64 reg_code); -internal U64 regs_block_size_from_arch(Arch arch); -internal U64 regs_reg_code_count_from_arch(Arch arch); -internal U64 regs_alias_code_count_from_arch(Arch arch); -internal String8 *regs_reg_code_string_table_from_arch(Arch arch); -internal String8 *regs_alias_code_string_table_from_arch(Arch arch); -internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch); -internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch); -internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch); -internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch); -internal U64 regs_rip_from_arch_block(Arch arch, void *block); -internal U64 regs_rsp_from_arch_block(Arch arch, void *block); -internal void regs_arch_block_write_rip(Arch arch, void *block, U64 rip); -internal void regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp); - -#endif // REGS_H diff --git a/src/regs/regs.mdesk b/src/regs/regs.mdesk deleted file mode 100644 index 765781f7..00000000 --- a/src/regs/regs.mdesk +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Architecture Tables - -@table(name, name_lower) -REGS_ArchTable: -{ - {X64 x64} -} - -//////////////////////////////// -//~ rjf: X64 Tables - -@table(name size usage) -REGS_RegTableX64: -{ - {rax 64 Normal} - {rcx 64 Normal} - {rdx 64 Normal} - {rbx 64 Normal} - {rsp 64 Normal} - {rbp 64 Normal} - {rsi 64 Normal} - {rdi 64 Normal} - {r8 64 Normal} - {r9 64 Normal} - {r10 64 Normal} - {r11 64 Normal} - {r12 64 Normal} - {r13 64 Normal} - {r14 64 Normal} - {r15 64 Normal} - {fsbase 64 Normal} - {gsbase 64 Normal} - {rip 64 Normal} - {rflags 64 Normal} - {dr0 64 Normal} - {dr1 64 Normal} - {dr2 64 Normal} - {dr3 64 Normal} - {dr4 64 Normal} - {dr5 64 Normal} - {dr6 64 Normal} - {dr7 64 Normal} - {st0 80 Normal} - {st1 80 Normal} - {st2 80 Normal} - {st3 80 Normal} - {st4 80 Normal} - {st5 80 Normal} - {st6 80 Normal} - {st7 80 Normal} - {fcw 16 Normal} - {fsw 16 Normal} - {ftw 8 Normal} - {fop 16 Normal} - {fip 64 Normal} - {fdp 64 Normal} - {mxcsr 32 Normal} - {mxcsr_mask 32 Normal} - {ss 16 Normal} - {cs 16 Normal} - {ds 16 Normal} - {es 16 Normal} - {fs 16 Normal} - {gs 16 Normal} - {zmm0 512 Vector} - {zmm1 512 Vector} - {zmm2 512 Vector} - {zmm3 512 Vector} - {zmm4 512 Vector} - {zmm5 512 Vector} - {zmm6 512 Vector} - {zmm7 512 Vector} - {zmm8 512 Vector} - {zmm9 512 Vector} - {zmm10 512 Vector} - {zmm11 512 Vector} - {zmm12 512 Vector} - {zmm13 512 Vector} - {zmm14 512 Vector} - {zmm15 512 Vector} - {zmm16 512 Vector} - {zmm17 512 Vector} - {zmm18 512 Vector} - {zmm19 512 Vector} - {zmm20 512 Vector} - {zmm21 512 Vector} - {zmm22 512 Vector} - {zmm23 512 Vector} - {zmm24 512 Vector} - {zmm25 512 Vector} - {zmm26 512 Vector} - {zmm27 512 Vector} - {zmm28 512 Vector} - {zmm29 512 Vector} - {zmm30 512 Vector} - {zmm31 512 Vector} - {k0 64 Normal} - {k1 64 Normal} - {k2 64 Normal} - {k3 64 Normal} - {k4 64 Normal} - {k5 64 Normal} - {k6 64 Normal} - {k7 64 Normal} - {cetmsr 64 Normal} - {cetssp 64 Normal} -} - -@table(name base off size usage) -REGS_AliasTableX64: -{ - {eax rax 0 32 Normal} - {ecx rcx 0 32 Normal} - {edx rdx 0 32 Normal} - {ebx rbx 0 32 Normal} - {esp rsp 0 32 Normal} - {ebp rbp 0 32 Normal} - {esi rsi 0 32 Normal} - {edi rdi 0 32 Normal} - {r8d r8 0 32 Normal} - {r9d r9 0 32 Normal} - {r10d r10 0 32 Normal} - {r11d r11 0 32 Normal} - {r12d r12 0 32 Normal} - {r13d r13 0 32 Normal} - {r14d r14 0 32 Normal} - {r15d r15 0 32 Normal} - {eflags rflags 0 32 Normal} - {ax rax 0 16 Normal} - {cx rcx 0 16 Normal} - {dx rdx 0 16 Normal} - {bx rbx 0 16 Normal} - {si rsi 0 16 Normal} - {di rdi 0 16 Normal} - {sp rsp 0 16 Normal} - {bp rbp 0 16 Normal} - {ip rip 0 16 Normal} - {r8w r8 0 16 Normal} - {r9w r9 0 16 Normal} - {r10w r10 0 16 Normal} - {r11w r11 0 16 Normal} - {r12w r12 0 16 Normal} - {r13w r13 0 16 Normal} - {r14w r14 0 16 Normal} - {r15w r15 0 16 Normal} - {al rax 0 8 Normal} - {cl rcx 0 8 Normal} - {dl rdx 0 8 Normal} - {bl rbx 0 8 Normal} - {sil rsi 0 8 Normal} - {dil rdi 0 8 Normal} - {bpl rbp 0 8 Normal} - {spl rsp 0 8 Normal} - {r8b r8 0 8 Normal} - {r9b r9 0 8 Normal} - {r10b r10 0 8 Normal} - {r11b r11 0 8 Normal} - {r12b r12 0 8 Normal} - {r13b r13 0 8 Normal} - {r14b r14 0 8 Normal} - {r15b r15 0 8 Normal} - {ah rax 8 8 Normal} - {ch rcx 8 8 Normal} - {dh rdx 8 8 Normal} - {bh rbx 8 8 Normal} - {xmm0 zmm0 0 128 Vector} - {xmm1 zmm1 0 128 Vector} - {xmm2 zmm2 0 128 Vector} - {xmm3 zmm3 0 128 Vector} - {xmm4 zmm4 0 128 Vector} - {xmm5 zmm5 0 128 Vector} - {xmm6 zmm6 0 128 Vector} - {xmm7 zmm7 0 128 Vector} - {xmm8 zmm8 0 128 Vector} - {xmm9 zmm9 0 128 Vector} - {xmm10 zmm10 0 128 Vector} - {xmm11 zmm11 0 128 Vector} - {xmm12 zmm12 0 128 Vector} - {xmm13 zmm13 0 128 Vector} - {xmm14 zmm14 0 128 Vector} - {xmm15 zmm15 0 128 Vector} - {ymm0 zmm0 0 256 Vector} - {ymm1 zmm1 0 256 Vector} - {ymm2 zmm2 0 256 Vector} - {ymm3 zmm3 0 256 Vector} - {ymm4 zmm4 0 256 Vector} - {ymm5 zmm5 0 256 Vector} - {ymm6 zmm6 0 256 Vector} - {ymm7 zmm7 0 256 Vector} - {ymm8 zmm8 0 256 Vector} - {ymm9 zmm9 0 256 Vector} - {ymm10 zmm10 0 256 Vector} - {ymm11 zmm11 0 256 Vector} - {ymm12 zmm12 0 256 Vector} - {ymm13 zmm13 0 256 Vector} - {ymm14 zmm14 0 256 Vector} - {ymm15 zmm15 0 256 Vector} - {mm0 st0 0 64 Vector} - {mm1 st1 0 64 Vector} - {mm2 st2 0 64 Vector} - {mm3 st3 0 64 Vector} - {mm4 st4 0 64 Vector} - {mm5 st5 0 64 Vector} - {mm6 st6 0 64 Vector} - {mm7 st7 0 64 Vector} -} - -@enum REGS_RegCodeX64: -{ - NULL, - @expand(REGS_RegTableX64 a) `$(a.name)`, - COUNT, -} - -@enum REGS_AliasCodeX64: -{ - NULL, - @expand(REGS_AliasTableX64 a) `$(a.name)`, - COUNT, -} - -@struct REGS_RegBlockX64: -{ - @expand(REGS_RegTableX64 a) `REGS_Reg$(a.size) $(a.name)`, -} - -@data(REGS_UsageKind) regs_g_reg_code_x64_usage_kind_table: -{ - `REGS_UsageKind_Normal`; - @expand(REGS_RegTableX64 a) `REGS_UsageKind_$(a.usage)`; -} - -@data(REGS_UsageKind) -regs_g_alias_code_x64_usage_kind_table: -{ - `REGS_UsageKind_Normal`; - @expand(REGS_AliasTableX64 a) `REGS_UsageKind_$(a.usage)`; -} - -@data(String8) regs_g_reg_code_x64_string_table: -{ - `str8_lit_comp("")`; - @expand(REGS_RegTableX64 a) `str8_lit_comp("$(a.name)")`; -} - -@data(String8) regs_g_alias_code_x64_string_table: -{ - `str8_lit_comp("")`; - @expand(REGS_AliasTableX64 a) `str8_lit_comp("$(a.name)")`; -} - -@data(REGS_Rng) regs_g_reg_code_x64_rng_table: -{ - `{0}`; - @expand(REGS_RegTableX64 a) `{(U16)OffsetOf(REGS_RegBlockX64, $(a.name)), $(a.size/8)}`, -} - -@data(REGS_Slice) regs_g_alias_code_x64_slice_table: -{ - `{0}`; - @expand(REGS_AliasTableX64 a) `{REGS_RegCodeX64_$(a.base), $(a.off/8), $(a.size/8)}`, -} - -//////////////////////////////// -//~ rjf: Architecture-Dynamic Helper Implementation Generators - -@c_file @gen -{ - `internal U64 regs_block_size_from_arch(Arch arch)`; - `{`; - `U64 result = 8;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = sizeof(REGS_RegBlock$(a.name));}break;`; - `}`; - `return result;`; - `}`; -} - -@c_file @gen -{ - `internal U64 regs_reg_code_count_from_arch(Arch arch)`; - `{`; - `U64 result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = REGS_RegCode$(a.name)_COUNT;}break;`; - `}`; - `return result;`; - `}`; -} - -@c_file @gen -{ - `internal U64 regs_alias_code_count_from_arch(Arch arch)`; - `{`; - `U64 result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = REGS_AliasCode$(a.name)_COUNT;}break;`; - `}`; - `return result;`; - `}`; -} - -@c_file @gen -{ - `internal String8 *regs_reg_code_string_table_from_arch(Arch arch)`; - `{`; - `String8 *result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_string_table;}break;`; - `}`; - `return result;`; - `}`; -} - -@c_file @gen -{ - `internal String8 *regs_alias_code_string_table_from_arch(Arch arch)`; - `{`; - `String8 *result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_string_table;}break;`; - `}`; - `return result;`; - `}`; -} - -@c_file @gen -{ - `internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch)`; - `{`; - `REGS_Rng *result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_rng_table;}break;`; - `}`; - `return result;`; - `}`; -} - -@c_file @gen -{ - `internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch)`; - `{`; - `REGS_Slice *result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_slice_table;}break;`; - `}`; - `return result;`; - `}`; -} - -@c_file @gen -{ - `internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch)`; - `{`; - `REGS_UsageKind *result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_usage_kind_table;}break;`; - `}`; - `return result;`; - `}`; -} - -@c_file @gen -{ - `internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch)`; - `{`; - `REGS_UsageKind *result = 0;`; - `switch(arch)`; - `{`; - `default:{}break;`; - @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_usage_kind_table;}break;`; - `}`; - `return result;`; - `}`; -} diff --git a/src/render/d3d11/render_d3d11.c b/src/render/d3d11/render_d3d11.c index 6cf22683..9d80584e 100644 --- a/src/render/d3d11/render_d3d11.c +++ b/src/render/d3d11/render_d3d11.c @@ -199,7 +199,7 @@ r_init(CmdLine *cmdln) char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%lx). The process is terminating.", error); os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); - os_abort(1); + abort_self(1); } ProfEnd(); @@ -483,7 +483,7 @@ r_init(CmdLine *cmdln) //- rjf: window setup/teardown r_hook R_Handle -r_window_equip(OS_Handle handle) +r_window_equip(OS_Window handle) { ProfBeginFunction(); R_Handle result = {0}; @@ -535,7 +535,7 @@ r_window_equip(OS_Handle handle) char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "DXGI swap chain creation failure (%lx). The process is terminating.", error); os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); - os_abort(1); + abort_self(1); } r_d3d11_state->dxgi_factory->lpVtbl->MakeWindowAssociation(r_d3d11_state->dxgi_factory, hwnd, DXGI_MWA_NO_ALT_ENTER); @@ -556,7 +556,7 @@ r_window_equip(OS_Handle handle) } r_hook void -r_window_unequip(OS_Handle handle, R_Handle equip_handle) +r_window_unequip(OS_Window handle, R_Handle equip_handle) { ProfBeginFunction(); MutexScopeW(r_d3d11_state->device_rw_mutex) @@ -605,13 +605,10 @@ r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *dat texture->generation += 1; } + //- rjf: resource kind -> d3d11 usage / cpu access flags D3D11_USAGE d3d11_usage = D3D11_USAGE_DEFAULT; UINT cpu_access_flags = 0; r_usage_access_flags_from_resource_kind(kind, &d3d11_usage, &cpu_access_flags); - if (kind == R_ResourceKind_Static) - { - Assert(data != 0 && "static texture must have initial data provided"); - } //- rjf: format -> dxgi format DXGI_FORMAT dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM; @@ -714,9 +711,8 @@ r_fill_tex2d_region(R_Handle handle, Rng2S32 subrect, void *data) MutexScopeW(r_d3d11_state->device_rw_mutex) { R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle); - if(texture != &r_d3d11_tex2d_nil) + if(texture != &r_d3d11_tex2d_nil && texture->kind == R_ResourceKind_Dynamic) { - Assert(texture->kind == R_ResourceKind_Dynamic && "only dynamic texture can update region"); U64 bytes_per_pixel = r_tex2d_format_bytes_per_pixel_table[texture->format]; Vec2S32 dim = v2s32(subrect.x1 - subrect.x0, subrect.y1 - subrect.y0); D3D11_BOX dst_box = @@ -756,13 +752,10 @@ r_buffer_alloc(R_ResourceKind kind, U64 size, void *data) buffer->generation += 1; } + //- rjf: resource kind -> d3d11 usage / cpu access flags D3D11_USAGE d3d11_usage = D3D11_USAGE_DEFAULT; UINT cpu_access_flags = 0; r_usage_access_flags_from_resource_kind(kind, &d3d11_usage, &cpu_access_flags); - if (kind == R_ResourceKind_Static) - { - Assert(data != 0 && "static buffer must have initial data provided"); - } //- rjf: prep initial data, if passed D3D11_SUBRESOURCE_DATA initial_data_ = {0}; @@ -868,7 +861,7 @@ r_end_frame(void) } r_hook void -r_window_begin_frame(OS_Handle window, R_Handle window_equip) +r_window_begin_frame(OS_Window window, R_Handle window_equip) { ProfBeginFunction(); MutexScopeW(r_d3d11_state->device_rw_mutex) @@ -1000,7 +993,7 @@ r_window_begin_frame(OS_Handle window, R_Handle window_equip) } r_hook void -r_window_end_frame(OS_Handle window, R_Handle window_equip) +r_window_end_frame(OS_Window window, R_Handle window_equip) { ProfBeginFunction(); MutexScopeW(r_d3d11_state->device_rw_mutex) @@ -1060,7 +1053,7 @@ r_window_end_frame(OS_Handle window, R_Handle window_equip) char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "D3D11 present failure (%lx). The process is terminating.", error); os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); - os_abort(1); + abort_self(1); } d_ctx->lpVtbl->ClearState(d_ctx); } @@ -1070,7 +1063,7 @@ r_window_end_frame(OS_Handle window, R_Handle window_equip) //- rjf: render pass submission r_hook void -r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes) +r_window_submit(OS_Window window, R_Handle window_equip, R_PassList *passes) { ProfBeginFunction(); MutexScopeW(r_d3d11_state->device_rw_mutex) diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.c b/src/render/opengl/linux/egl/render_opengl_linux_egl.c index 28505f19..0e8a6f1d 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.c +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.c @@ -24,7 +24,7 @@ r_ogl_os_init(CmdLine *cmdln) if(r_ogl_lnx_state->display == EGL_NO_DISPLAY) { os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display.")); - os_abort(1); + abort_self(1); } } @@ -34,14 +34,14 @@ r_ogl_os_init(CmdLine *cmdln) if(!eglInitialize(r_ogl_lnx_state->display, &egl_version_major, &egl_version_minor)) { os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL display.")); - os_abort(1); + abort_self(1); } if(egl_version_major < 1 || (egl_version_major == 1 && egl_version_minor < 5)) { Temp scratch = scratch_begin(0, 0); String8 message = push_str8f(scratch.arena, "Unsupported EGL version (%i.%i, need at least 1.5)", egl_version_major, egl_version_minor); os_graphical_message(1, str8_lit("Fatal Error"), message); - os_abort(1); + abort_self(1); scratch_end(scratch); } @@ -49,7 +49,7 @@ r_ogl_os_init(CmdLine *cmdln) if(!eglBindAPI(EGL_OPENGL_API)) { os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL.")); - os_abort(1); + abort_self(1); } //- rjf: construct context @@ -70,7 +70,7 @@ r_ogl_os_init(CmdLine *cmdln) if(r_ogl_lnx_state->context == EGL_NO_CONTEXT) { os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL.")); - os_abort(1); + abort_self(1); } } @@ -121,7 +121,7 @@ r_ogl_os_window_equip(OS_Handle window) if(!eglChooseConfig(r_ogl_lnx_state->display, options, configs, ArrayCount(configs), &configs_count) || configs_count == 0) { os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration.")); - os_abort(1); + abort_self(1); } } @@ -144,7 +144,7 @@ r_ogl_os_window_equip(OS_Handle window) if(r_ogl_lnx_state->config == 0) { os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find a suitable EGL configuration.")); - os_abort(1); + abort_self(1); } } } @@ -155,7 +155,7 @@ r_ogl_os_window_equip(OS_Handle window) if(w->surface == EGL_NO_SURFACE) { os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create EGL surface.")); - os_abort(1); + abort_self(1); } } R_Handle result = {(U64)w}; diff --git a/src/render/opengl/linux/glx/render_opengl_linux_glx.c b/src/render/opengl/linux/glx/render_opengl_linux_glx.c index fa7217da..6f835515 100644 --- a/src/render/opengl/linux/glx/render_opengl_linux_glx.c +++ b/src/render/opengl/linux/glx/render_opengl_linux_glx.c @@ -21,7 +21,7 @@ r_ogl_os_init(CmdLine *cmdln) Temp scratch = scratch_begin(0, 0); String8 message = push_str8f(scratch.arena, "Unsupported GLX version (%i.%i, need at least 1.3)", glx_version_major, glx_version_minor); os_graphical_message(1, str8_lit("Fatal Error"), message); - os_abort(1); + abort_self(1); scratch_end(scratch); } @@ -46,7 +46,7 @@ r_ogl_os_init(CmdLine *cmdln) if(framebuffer_configs == 0) { os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration.")); - os_abort(1); + abort_self(1); } GLXFBConfig framebuffer_config = framebuffer_configs[0]; XFree(framebuffer_configs); diff --git a/src/render/render_core.h b/src/render/render_core.h index 039cfa99..6aa8decb 100644 --- a/src/render/render_core.h +++ b/src/render/render_core.h @@ -281,8 +281,8 @@ internal R_Pass *r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kin r_hook void r_init(CmdLine *cmdln); //- rjf: window setup/teardown -r_hook R_Handle r_window_equip(OS_Handle window); -r_hook void r_window_unequip(OS_Handle window, R_Handle window_equip); +r_hook R_Handle r_window_equip(OS_Window window); +r_hook void r_window_unequip(OS_Window window, R_Handle window_equip); //- rjf: textures r_hook R_Handle r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data); @@ -299,10 +299,10 @@ r_hook void r_buffer_release(R_Handle buffer); //- rjf: frame markers r_hook void r_begin_frame(void); r_hook void r_end_frame(void); -r_hook void r_window_begin_frame(OS_Handle window, R_Handle window_equip); -r_hook void r_window_end_frame(OS_Handle window, R_Handle window_equip); +r_hook void r_window_begin_frame(OS_Window window, R_Handle window_equip); +r_hook void r_window_end_frame(OS_Window window, R_Handle window_equip); //- rjf: render pass submission -r_hook void r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes); +r_hook void r_window_submit(OS_Window window, R_Handle window_equip, R_PassList *passes); #endif // RENDER_CORE_H diff --git a/src/scratch/eval_scratch.c b/src/scratch/eval_scratch.c deleted file mode 100644 index a9cb9a32..00000000 --- a/src/scratch/eval_scratch.c +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Includes - -//- rjf: [h] -#include "base/base_inc.h" -#include "os/os_inc.h" -#include "rdi_format/rdi_format_local.h" -#include "regs/regs.h" -#include "regs/rdi/regs_rdi.h" -#include "eval/eval_inc.h" - -//- rjf: [c] -#include "base/base_inc.c" -#include "os/os_inc.c" -#include "rdi_format/rdi_format_local.c" -#include "regs/regs.c" -#include "regs/rdi/regs_rdi.c" -#include "eval/eval_inc.c" - -//////////////////////////////// -//~ rjf: Entry Point - -internal void -entry_point(CmdLine *cmdline) -{ - Arena *arena = arena_alloc(); - E_TypeCtx *type_ctx = push_array(arena, E_TypeCtx, 1); - e_select_type_ctx(type_ctx); - E_ParseCtx *parse_ctx = push_array(arena, E_ParseCtx, 1); - e_select_parse_ctx(parse_ctx); - E_IRCtx *ir_ctx = push_array(arena, E_IRCtx, 1); - e_select_ir_ctx(ir_ctx); - E_InterpretCtx *interpret_ctx = push_array(arena, E_InterpretCtx, 1); - e_select_interpret_ctx(interpret_ctx, 0, 0); - String8 exprs[] = - { - str8_lit("123"), - str8_lit("1 + 2"), - str8_lit("foo"), - str8_lit("foo(bar)"), - str8_lit("foo(bar(baz))"), - }; - for EachElement(idx, exprs) - { - String8 debug_string = e_debug_log_from_expr_string(arena, exprs[idx]); - raddbg_log("%S", debug_string); - } -} diff --git a/src/stap/stap_parse.c b/src/stap/stap_parse.c index 8bb048de..25e696af 100644 --- a/src/stap/stap_parse.c +++ b/src/stap/stap_parse.c @@ -73,24 +73,24 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) U64 sep_pos = str8_find_needle(string, 0, str8_lit("@"), 0); if (sep_pos < string.size) { STAP_Arg arg = {0}; - + String8 tag = str8_prefix(string, sep_pos + 1); String8 oper = str8_skip(string, tag.size); - + STAP_ArgValueType arg_value_type = STAP_ArgValueType_Null; U64 arg_value_size = 0; B32 infer_arg_value_size = 1; U64 tag_size = 0; { U8 *ptr = tag.str, *end = tag.str + tag.size; - + // is signed? if (ptr >= end) { goto operand_parse_exit; } if (*ptr == '-') { arg_value_type = STAP_ArgValueType_S; ptr += 1; } - + // parse optional size if (ptr >= end) { goto operand_parse_exit; } if (char_is_digit(*ptr, 10)) { @@ -102,7 +102,7 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) ptr += 1; infer_arg_value_size = 0; } - + // is this float? if (ptr >= end) { goto operand_parse_exit; } if (*ptr == 'f') { @@ -113,22 +113,22 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) ptr += 1; arg_value_type = STAP_ArgValueType_F; } - + // assume default value type to be unsigned if (arg_value_type == STAP_ArgValueType_Null) { arg_value_type = STAP_ArgValueType_U; } - + if (ptr >= end) { goto operand_parse_exit; } if (*ptr != '@') { error = str8_lit("failed to find @"); goto operand_parse_exit; } ptr += 1; - + tag_size = (U64)(ptr - tag.str); } - + U64 memory_ref_start = str8_find_needle_reverse(oper, 0, str8_lit("("), 0); // memory operand if (memory_ref_start > 0 && memory_ref_start < oper.size) { @@ -141,7 +141,7 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) // Scale: 1|2|4|8 // Expr: A small C-like infix expression // - + // find closing ')' U64 memory_ref_end = str8_find_needle(oper, memory_ref_start+1, str8_lit(")"), 0); if (memory_ref_end > oper.size) { @@ -152,7 +152,7 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) error = str8_lit("expression does not terminate after ')'"); goto operand_parse_exit; } - + // parse displacement String8 disp_str = str8_skip_chop_whitespace(str8_prefix(oper, memory_ref_start-1)); if (disp_str.size > 0 && !str8_is_integer_signed(disp_str, 10)) { @@ -160,7 +160,7 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) goto operand_parse_exit; } S64 disp = s64_from_str8(disp_str, 10); - + // parse base, index, scale String8 base_index_scale = str8_skip_chop_whitespace(str8_substr(oper, r1u64(memory_ref_start, memory_ref_end))); U64 first_comma = str8_find_needle(base_index_scale, 0, str8_lit(","), 0); @@ -168,7 +168,7 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) String8 base_str = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(0, first_comma))); String8 index_str = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(first_comma + 1, second_comma))); String8 scale_str = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(second_comma + 1, memory_ref_end))); - + // syntax check if(first_comma >= base_index_scale.size && base_str.size == 0) { error = str8_lit("missing base register"); @@ -194,11 +194,11 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) error = str8_lit("invalid of scale (expected unsigned integral type)"); goto operand_parse_exit; } - + // stip '%' prefix base_str = str8_skip(base_str, 1); index_str = str8_skip(index_str, 1); - + // parse base B8 base_is_alias = 0; U32 base_reg_code = 0; @@ -213,7 +213,7 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) goto operand_parse_exit; } } - + // parse index B8 index_is_alias = 0; U32 index_reg_code = 0; @@ -237,12 +237,12 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) goto operand_parse_exit; } } - + if (infer_arg_value_size) { error = str8_lit("memory operands must have a sice"); goto operand_parse_exit; } - + // fill out memory ref portion arg.type = STAP_ArgType_MemoryRef; arg.memory_ref.disp = disp; @@ -255,36 +255,36 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) // $imm else if (str8_match(str8_lit("$"), oper, StringMatchFlag_RightSideSloppy)) { String8 imm_str = str8_skip(oper, 1); - + U64 imm_size = str8_find_needle(imm_str, 0, str8_lit(" "), 0); if (imm_size > imm_str.size ) { imm_size = imm_str.size; } imm_str = str8_prefix(imm_str, imm_size); - + if (imm_str.size == 0) { goto operand_parse_exit; } - + U64 imm = 0; B32 is_parsed = 0; switch (arg_value_type) { - case STAP_ArgValueType_Null: - case STAP_ArgValueType_U: - case STAP_ArgValueType_F: { - is_parsed = try_u64_from_str8_c_rules(imm_str, &imm); - } break; - case STAP_ArgValueType_S: { - is_parsed = try_s64_from_str8_c_rules(imm_str, (S64 *)&imm); - } break; - default: { InvalidPath; } break; + case STAP_ArgValueType_Null: + case STAP_ArgValueType_U: + case STAP_ArgValueType_F: { + is_parsed = try_u64_from_str8_c_rules(imm_str, &imm); + } break; + case STAP_ArgValueType_S: { + is_parsed = try_s64_from_str8_c_rules(imm_str, (S64 *)&imm); + } break; + default: { InvalidPath; } break; } - + if (!is_parsed) { error = str8_lit("failed to parse immediate"); goto operand_parse_exit; } - + arg.type = STAP_ArgType_Imm; arg.imm = imm; } @@ -295,7 +295,7 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) if (reg_str.size == 0) { goto operand_parse_exit; } - + B8 is_reg_alias = 0; U32 reg_code = regs_reg_code_from_name(Arch_x64, reg_str); if (reg_code == 0) { @@ -306,31 +306,31 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) error = str8_lit("invalid register name"); goto operand_parse_exit; } - + arg.type = STAP_ArgType_Reg; arg.reg.is_alias = is_reg_alias; arg.reg.reg_code = reg_code; } else { goto operand_parse_exit; } - + // fill out value portion arg.value_type = arg_value_type == STAP_ArgValueType_Null ? STAP_ArgValueType_U : arg_value_type; arg.value_size = arg_value_size; - + // write output if (arg_out) { *arg_out = arg; } - + // clear error tracker error = str8_zero(); - -operand_parse_exit:; + + operand_parse_exit:; } else { error = str8_lit("invalid argument string"); } - + return error; } @@ -343,16 +343,16 @@ stap_arg_array_from_string(Arena *arena, Arch arch, String8 string) result.v = push_array(arena, STAP_Arg, arg_strings.node_count); for EachNode(n, String8Node, arg_strings.first) { STAP_Arg *arg = &result.v[result.count++]; - + switch (arch) { - case Arch_Null: {} break; - case Arch_x64: { - stap_parse_args_x64(n->string, arg); - } break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: { NotImplemented; } break; - default: { InvalidPath; } break; + case Arch_Null: {} break; + case Arch_x64: { + stap_parse_args_x64(n->string, arg); + } break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: { NotImplemented; } break; + default: { InvalidPath; } break; } } scratch_end(scratch); @@ -368,53 +368,52 @@ stap_read_arg(STAP_Arg arg, void *raw_value) { AssertAlways(arg.value_size <= 8); - + ARCH_Info *arch_info = arch_info_from_arch(arch); B32 is_value_read = 0; - - switch (arg.type) { - case STAP_ArgType_Null: break; - case STAP_ArgType_Imm: { - MemoryCopy(raw_value, &arg.imm, arg.value_size); - is_value_read = 1; - } break; - case STAP_ArgType_Reg: { - Rng1U64 range = regs_range_from_code(arch, arg.reg.is_alias, arg.reg.reg_code); - U64 copy_size = Min(arg.value_size, dim_1u64(range)); - MemoryCopy(raw_value, (U8 *)reg_block + range.min, copy_size); - is_value_read = 1; - } break; - case STAP_ArgType_MemoryRef: { - U64 base = 0; - if(arg.memory_ref.base.reg_code) { - Rng1U64 range = regs_range_from_code(arch, arg.memory_ref.base.is_alias, arg.memory_ref.base.reg_code); - U64 copy_size = Min(sizeof(base), dim_1u64(range)); - MemoryCopy(&base, (U8 *)reg_block + range.min, copy_size); - } - - U64 index = 0; - if(arg.memory_ref.index.reg_code) { - Rng1U64 range = regs_range_from_code(arch, arg.memory_ref.index.is_alias, arg.memory_ref.index.reg_code); - U64 copy_size = Min(sizeof(base), dim_1u64(range)); - MemoryCopy(&index, (U8 *)reg_block + range.min, copy_size); - } - - U64 addr = arg.memory_ref.disp + (base + index * arg.memory_ref.scale); - if (memory_read(addr, raw_value, arg.value_size, memory_read_ctx)) { + switch(arg.type) + { + default:{}break; + case STAP_ArgType_Null:{}break; + case STAP_ArgType_Imm: + { + MemoryCopy(raw_value, &arg.imm, arg.value_size); is_value_read = 1; - } - } break; - default: { InvalidPath; } break; + }break; + case STAP_ArgType_Reg: + if(0 < arg.reg.reg_code && arg.reg.reg_code < arch_info->reg_code_count) + { + is_value_read = arch_reg_block_read_range(arch_info, reg_block, arch_info->reg_code_rng_table[arg.reg.reg_code], raw_value); + }break; + case STAP_ArgType_MemoryRef: + { + U64 base = 0; + if(0 < arg.memory_ref.base.reg_code && arg.memory_ref.base.reg_code < arch_info->reg_code_count) + { + arch_reg_block_read_range(arch_info, reg_block, arch_info->reg_code_rng_table[arg.memory_ref.base.reg_code], &base); + } + U64 index = 0; + if(0 < arg.memory_ref.index.reg_code && arg.memory_ref.index.reg_code < arch_info->reg_code_count) + { + arch_reg_block_read_range(arch_info, reg_block, arch_info->reg_code_rng_table[arg.memory_ref.index.reg_code], &index); + } + U64 addr = arg.memory_ref.disp + (base + index * arg.memory_ref.scale); + if(memory_read(addr, raw_value, arg.value_size, memory_read_ctx)) + { + is_value_read = 1; + } + }break; } - - if (arg.value_size < 8) { - if (arg.value_type == STAP_ArgValueType_S) { + if(arg.value_size < 8) + { + if(arg.value_type == STAP_ArgValueType_S) + { *(U64 *)raw_value = extend_sign64(*(U64 *)raw_value, arg.value_size); - } else if (arg.value_type == STAP_ArgValueType_F) { - Assert(arg.value_size == 4); + } + else if(arg.value_type == STAP_ArgValueType_F && arg.value_size == 4) + { *(F64 *)raw_value = *(F32 *)raw_value; } } - return is_value_read; } diff --git a/src/stap/stap_test.c b/src/stap/stap_test.c index 70c31539..7996ae44 100644 --- a/src/stap/stap_test.c +++ b/src/stap/stap_test.c @@ -6,12 +6,12 @@ #include "base/base_inc.h" #include "os/os_inc.h" -#include "regs/regs.h" +#include "arch/arch_inc.h" #include "stap/stap_parse.h" #include "base/base_inc.c" #include "os/os_inc.c" -#include "regs/regs.c" +#include "arch/arch_inc.c" #include "stap/stap_parse.c" internal void @@ -21,7 +21,7 @@ entry_point(CmdLine *cmd_line) STAP_Arg arg = {0}; String8 error = {0}; String8 string = {0}; - + string = str8_lit("-2@$-123"); error = stap_parse_args_x64(string, &arg); if (error.size != 0) { goto exit; } @@ -29,7 +29,7 @@ entry_point(CmdLine *cmd_line) AssertAlways(arg.value_size == 2); AssertAlways(arg.type == STAP_ArgType_Imm); AssertAlways((S64)arg.imm == -123); - + string = str8_lit("1@$43"); error = stap_parse_args_x64(string, &arg); if (error.size != 0) { goto exit; } @@ -37,7 +37,7 @@ entry_point(CmdLine *cmd_line) AssertAlways(arg.value_size == 1); AssertAlways(arg.type == STAP_ArgType_Imm); AssertAlways((S64)arg.imm == 43); - + string = str8_lit("4f@%eax"); error = stap_parse_args_x64(string, &arg); if (error.size != 0) { goto exit; } @@ -46,7 +46,7 @@ entry_point(CmdLine *cmd_line) AssertAlways(arg.type == STAP_ArgType_Reg); AssertAlways(arg.reg.is_alias == 1); AssertAlways(arg.reg.reg_code == REGS_AliasCodeX64_eax); - + string = str8_lit("4@(%rdi)"); error = stap_parse_args_x64(string, &arg); if (error.size != 0) { goto exit; } @@ -59,7 +59,7 @@ entry_point(CmdLine *cmd_line) AssertAlways(arg.memory_ref.index.reg_code == 0); AssertAlways(arg.memory_ref.index.is_alias == 0); AssertAlways(arg.memory_ref.scale == 1); - + string = str8_lit("4@-22(%rdi)"); error = stap_parse_args_x64(string, &arg); if (error.size != 0) { goto exit; } @@ -72,7 +72,7 @@ entry_point(CmdLine *cmd_line) AssertAlways(arg.memory_ref.index.reg_code == 0); AssertAlways(arg.memory_ref.index.is_alias == 0); AssertAlways(arg.memory_ref.scale == 1); - + string = str8_lit("4@32(%rax,%rsi,8)"); error = stap_parse_args_x64(string, &arg); if (error.size != 0) { goto exit; } @@ -84,7 +84,7 @@ entry_point(CmdLine *cmd_line) AssertAlways(arg.memory_ref.index.reg_code == REGS_RegCodeX64_rsi); AssertAlways(arg.memory_ref.index.is_alias == 0); AssertAlways(arg.memory_ref.scale == 8); - + string = str8_lit("4@32(,%rsi,8)"); error = stap_parse_args_x64(string, &arg); if (error.size != 0) { goto exit; } @@ -94,21 +94,21 @@ entry_point(CmdLine *cmd_line) AssertAlways(arg.memory_ref.base.reg_code == 0); AssertAlways(arg.memory_ref.index.reg_code == REGS_RegCodeX64_rsi); AssertAlways(arg.memory_ref.scale == 8); - + error = stap_parse_args_x64(str8_lit("4@(,,)"), &arg); if (error.size == 0) { goto exit; } - + error = stap_parse_args_x64(str8_lit("4@()"), &arg); if (error.size == 0) { goto exit; } - + error = stap_parse_args_x64(str8_lit("4@(%rdi, %rsi, 8"), &arg); if (error.size == 0) { goto exit; } - + error = stap_parse_args_x64(str8_lit("4@( ,, 8"), &arg); if (error.size == 0) { goto exit; } - + passed = 1; -exit:; + exit:; AssertAlways(passed); } diff --git a/src/strip_lib_debug/strip_lib_debug.c b/src/strip_lib_debug/strip_lib_debug.c index 23c15b1c..6bb5f1e5 100644 --- a/src/strip_lib_debug/strip_lib_debug.c +++ b/src/strip_lib_debug/strip_lib_debug.c @@ -24,60 +24,60 @@ internal void sld_main(CmdLine *cmdl) { B32 do_help = cmd_line_has_flag(cmdl, str8_lit("help")) || - cmd_line_has_flag(cmdl, str8_lit("h")) || - cmd_line_has_flag(cmdl, str8_lit("?")) || - cmdl->argc == 1; + cmd_line_has_flag(cmdl, str8_lit("h")) || + cmd_line_has_flag(cmdl, str8_lit("?")) || + cmdl->argc == 1; if (do_help) { fprintf(stderr, "--- Help ---------------------------------------------------------------------\n"); fprintf(stderr, " %s\n\n", BUILD_TITLE_STRING_LITERAL); fprintf(stderr, " Usage: strip_lib_debug [Options]\n\n"); fprintf(stderr, " Options:\n"); fprintf(stderr, " -in: Path to input lib file\n"); fprintf(stderr, " -out: Path to output lib file\n"); - os_abort(0); + abort_self(0); } - + Temp scratch = scratch_begin(0,0); - + String8 in_lib_path = cmd_line_string(cmdl, str8_lit("in")); String8 out_lib_path = cmd_line_string(cmdl, str8_lit("out")); - + if (in_lib_path.size == 0) { fprintf(stderr, "ERROR: please provide an input path via -in:\n"); - os_abort(1); + abort_self(1); } if (out_lib_path.size == 0) { fprintf(stderr, "ERROR: please provide an output path via -out:\n"); - os_abort(1); + abort_self(1); } - + String8 in_lib = os_data_from_file_path(scratch.arena, in_lib_path); if (in_lib.size == 0) { fprintf(stderr, "ERROR: unable to read file %.*s\n", str8_varg(in_lib_path)); - os_abort(1); + abort_self(1); } - + if (!coff_is_regular_archive(in_lib)) { fprintf(stderr, "ERROR: input lib is not COFF archive\n"); - os_abort(1); + abort_self(1); } - + // read & parse lib String8 out_lib = push_str8_copy(scratch.arena, in_lib); COFF_ArchiveParse parse = coff_archive_parse_from_data(out_lib); - + // was parse successful? if (parse.error.size) { fprintf(stderr, "ERROR: %.*s: %.*s\n", str8_varg(in_lib_path), str8_varg(parse.error)); - os_abort(1); + abort_self(1); } - + // convert big endian offsets U32 member_offsets_count = parse.first_member.symbol_count; U32 *member_offsets = push_array(scratch.arena, U32, parse.first_member.member_offset_count); for (U32 offset_idx = 0; offset_idx < member_offsets_count; offset_idx += 1) { member_offsets[offset_idx] = from_be_u32(parse.first_member.member_offsets[offset_idx]); } - + // fixup sections for (U64 member_idx = 0; member_idx < member_offsets_count; member_idx += 1) { COFF_ParsedArchiveMemberHeader member_header = {0}; @@ -98,13 +98,13 @@ sld_main(CmdLine *cmdl) } } } - + // wirte modified library - if (!os_write_data_to_file_path(out_lib_path, out_lib)) { + if (!write_data_to_file_path(out_lib_path, out_lib)) { fprintf(stderr, "ERROR: unable to write output file to %.*s\n", str8_varg(out_lib_path)); - os_abort(1); + abort_self(1); } - + scratch_end(scratch); } diff --git a/src/torture/torture.c b/src/torture/torture.c index 572de849..f2c285e1 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -28,9 +28,9 @@ internal char * t_string_from_result(T_RunStatus v) { switch (v) { - case T_RunStatus_Fail: return "FAIL"; - case T_RunStatus_Crash: return "CRASH"; - case T_RunStatus_Pass: return "PASS"; + case T_RunStatus_Fail: return "FAIL"; + case T_RunStatus_Crash: return "CRASH"; + case T_RunStatus_Pass: return "PASS"; } return 0; } @@ -40,7 +40,7 @@ t_write_file_list(String8 name, String8List data) { Temp scratch = scratch_begin(0,0); String8 path = t_make_file_path(scratch.arena, name); - B32 is_written = os_write_data_list_to_file_path(path, data); + B32 is_written = write_data_list_to_file_path(path, data); scratch_end(scratch); return is_written; } @@ -50,10 +50,10 @@ t_write_file(String8 name, String8 data) { String8Node temp_node = {0}; temp_node.string = data; - + String8List temp_list = {0}; str8_list_push_node(&temp_list, &temp_node); - + return t_write_file_list(name, temp_list); } @@ -62,7 +62,7 @@ t_read_file(Arena *arena, String8 name) { Temp scratch = scratch_begin(&arena,1); String8 path = t_make_file_path(scratch.arena, name); - String8 data = os_data_from_file_path(arena, path); + String8 data = data_from_file_path(arena, path); scratch_end(scratch); return data; } @@ -72,7 +72,7 @@ t_delete_file(String8 name) { Temp scratch = scratch_begin(0,0); String8 path = t_make_file_path(scratch.arena, name); - B32 is_deleted = os_delete_file_at_path(path); + B32 is_deleted = delete_file_at_path(path); scratch_end(scratch); return is_deleted; } @@ -81,26 +81,26 @@ internal void t_delete_dir(String8 path) { Temp scratch = scratch_begin(0,0); - - OS_FileIter *file_iter = os_file_iter_begin(scratch.arena, path, 0); + + FileIter *file_iter = file_iter_begin(scratch.arena, path, 0); for (;;) { - OS_FileInfo info = {0}; - if ( ! os_file_iter_next(scratch.arena, file_iter, &info)) { break; } - + FileInfo info = {0}; + if ( ! file_iter_next(scratch.arena, file_iter, &info)) { break; } + if (info.props.flags & FilePropertyFlag_IsFolder) { t_delete_dir(str8f(scratch.arena, "%S/%S", path, info.name)); continue; } - + String8 file_path = str8f(scratch.arena, "%S/%S", path, info.name); - if ( ! os_delete_file_at_path(file_path)) { + if ( ! delete_file_at_path(file_path)) { fprintf(stderr, "ERROR: unable to delete file %.*s\n", str8_varg(file_path)); } } - os_file_iter_end(file_iter); - + file_iter_end(file_iter); + // TODO: delete directories - + scratch_end(scratch); } @@ -114,7 +114,7 @@ internal B32 t_make_dir(String8 name) { Temp scratch = scratch_begin(0,0); - B32 is_ok = os_make_directory(t_make_file_path(scratch.arena, name)); + B32 is_ok = make_directory(t_make_file_path(scratch.arena, name)); scratch_end(scratch); return is_ok; } @@ -148,7 +148,7 @@ internal T_RunResult t_run(T_Run run) { T_RunCtx ctx = { .run = run }; - + B32 do_safe_call = 1; #if OS_WINDOWS if (IsDebuggerPresent()) { @@ -156,7 +156,7 @@ t_run(T_Run run) } #endif if (do_safe_call) { - os_safe_call(t_run_caller, t_run_fail_handler, &ctx); + safe_call(t_run_caller, t_run_fail_handler, &ctx); } else { t_run_caller(&ctx); } @@ -172,9 +172,9 @@ t_radbin_path(void) ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); #if OS_WINDOWS - path = os_full_path_from_path(arena, str8_lit("radbin.exe")); + path = full_path_from_path(arena, str8_lit("radbin.exe")); #else - path = os_full_path_from_path(arena, str8_lit("radbin")); + path = full_path_from_path(arena, str8_lit("radbin")); #endif AssertAlways(path.size); } @@ -205,33 +205,33 @@ internal String8 t_cl_version(void) { local_persist String8 version; - + if ( ! version.size) { Temp scratch = scratch_begin(0, 0); - + String8 output = {0}; t_invoke_(t_cl_path(), str8_zero(), max_U64, scratch.arena, &output); AssertAlways(g_last_exit_code == 0); - + String8 needle = str8_lit("Version"); U64 version_lo = str8_find_needle(output, 0, needle, 0); version_lo += needle.size + 1; AssertAlways(version_lo < output.size); - + U64 version_hi = str8_find_needle(output, version_lo, str8_lit(" "), 0); AssertAlways(version_hi < output.size); - + version = str8_substr(output, r1u64(version_lo, version_hi)); AssertAlways(version.size > 0); - + local_persist U8 buffer[4096]; ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); version = str8_copy(arena, version); - + scratch_end(scratch); } - + return version; } @@ -244,9 +244,9 @@ t_radlink_path(void) ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); #if OS_WINDOWS - path = os_full_path_from_path(arena, str8_lit("radlink.exe")); + path = full_path_from_path(arena, str8_lit("radlink.exe")); #else - path = os_full_path_from_path(arena, str8_lit("radlink")); + path = full_path_from_path(arena, str8_lit("radlink")); #endif AssertAlways(path.size); } @@ -259,7 +259,7 @@ t_cwd_path(void) local_persist U8 path[4096] = {0}; if (path[0] == 0) { Temp scratch = scratch_begin(0, 0); - String8 cwd = os_get_current_path(scratch.arena); + String8 cwd = get_current_path(scratch.arena); cwd = str8_chop_last_slash(cwd); cwd = str8f(scratch.arena, "%S", cwd); MemoryCopyStr8(path, cwd); @@ -287,26 +287,26 @@ internal B32 t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout, Arena *output_arena, String8 *output_out) { Temp scratch = scratch_begin(&output_arena,1); - + B32 is_ok = 0; - + B32 capture_output = output_out || g_redirect_stdout; - + g_last_exit_code = -1; - - OS_Handle read_pipe_handle = {0}, write_pipe_handle = {0}; + + File read_pipe_handle = {0}, write_pipe_handle = {0}; if (capture_output) { HANDLE read_pipe, write_pipe; SECURITY_ATTRIBUTES at = { .nLength = sizeof(at), .bInheritHandle = 1 }; if (!CreatePipe(&read_pipe, &write_pipe, &at, 0)) { AssertAlways(0 && "failed to create a pipe"); } - read_pipe_handle = (OS_Handle){ .u64[0] = (U64)read_pipe }; - write_pipe_handle = (OS_Handle){ .u64[0] = (U64)write_pipe }; + read_pipe_handle = (File){ .u64[0] = (U64)read_pipe }; + write_pipe_handle = (File){ .u64[0] = (U64)write_pipe }; } - + // Build Launch Options - OS_ProcessLaunchParams launch_opts = { + ProcessLaunchParams launch_opts = { .path = g_wdir, .inherit_env = 1, .env = env, @@ -315,49 +315,49 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout, Ar .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), }; str8_list_push_front(scratch.arena, &launch_opts.cmd_line, exe_path); - + if (g_verbose) { String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(" ") }); fprintf(stdout, "Command Line: %.*s\n", str8_varg(full_cmd_line)); fprintf(stdout, "Working Dir: %.*s\n", str8_varg(g_wdir)); } - + // invoke exe - OS_Handle process_handle = os_process_launch(&launch_opts); - + Process process_handle = process_launch(&launch_opts); + // close handle so last to ReadFile does not block - os_file_close(write_pipe_handle); - - if ( ! os_handle_match(process_handle, os_handle_zero())) { + file_close(write_pipe_handle); + + if ( ! process_match(process_handle, process_zero())) { if (capture_output) { // capture process output String8List output = {0}; for (;;) { - String8 string = os_file_read_cstring(scratch.arena, read_pipe_handle, 0); + String8 string = file_read_cstring(scratch.arena, read_pipe_handle, 0); if (string.size == 0) { break; } str8_list_push(scratch.arena, &output, string); } - os_file_close(read_pipe_handle); - + file_close(read_pipe_handle); + if (output_out) { *output_out = str8_list_join(output_arena, &output, 0); } - + // write to the output file if (g_redirect_stdout) { - os_write_data_list_to_file_path(g_stdout_file_name, output); + write_data_list_to_file_path(g_stdout_file_name, output); } } - + U64 exit_code_u64 = 0; - if (os_process_join(process_handle, timeout, &exit_code_u64)) { + if (process_join(process_handle, timeout, &exit_code_u64)) { g_last_exit_code = (int)exit_code_u64; is_ok = 1; } else { - os_process_kill(process_handle); + process_kill(process_handle); } } - + scratch_end(scratch); return is_ok; } @@ -428,24 +428,24 @@ t_file_paths_from_dir(Arena *arena, String8 dir) Temp scratch = scratch_begin(&arena, 1); String8List dirs = {0}; String8List files = {0}; - - OS_FileIter *iter = os_file_iter_begin(scratch.arena, dir, 0); - OS_FileInfo file; - while (os_file_iter_next(scratch.arena, iter, &file)) { + + FileIter *iter = file_iter_begin(scratch.arena, dir, 0); + FileInfo file; + while (file_iter_next(scratch.arena, iter, &file)) { if (file.props.flags & FilePropertyFlag_IsFolder) { str8_list_pushf(scratch.arena, &dirs, "%S/%S", dir, file.name); } else { str8_list_pushf(arena, &files, "%S/%S", dir, file.name); } } - os_file_iter_end(iter); - + file_iter_end(iter); + String8List result = {0}; for EachNode(n, String8Node, dirs.first) { String8List sub_result = t_file_paths_from_dir(arena, n->string); str8_list_concat_in_place(&result, &sub_result); } - + scratch_end(scratch); //str8_list_concat_in_place(&result, &dirs); str8_list_concat_in_place(&result, &files); @@ -463,12 +463,12 @@ t_match_folders(String8 a, String8 b) //for EachNode(n, String8Node, files_a.first) printf("%.*s\n", str8_varg(n->string)); String8List files_b = t_file_paths_from_dir(scratch.arena, b); B32 is_match = 0; - + String8Array sorted_a = str8_array_from_list(scratch.arena, &files_a); String8Array sorted_b = str8_array_from_list(scratch.arena, &files_b); t_sort_str8_array(sorted_a); t_sort_str8_array(sorted_b); - + if (sorted_a.count == sorted_b.count) { for EachIndex(i, sorted_a.count) { Temp temp = temp_begin(scratch.arena); @@ -477,15 +477,15 @@ t_match_folders(String8 a, String8 b) if (str8_match(ext_a, ext_b, 0)) { if (str8_match(ext_a, str8_lit("obj"), StringMatchFlag_CaseInsensitive) || str8_match(ext_a, str8_lit("lib"), StringMatchFlag_CaseInsensitive)) { - String8 data_a = os_data_from_file_path(temp.arena, sorted_a.v[i]); - String8 data_b = os_data_from_file_path(temp.arena, sorted_b.v[i]); + String8 data_a = data_from_file_path(temp.arena, sorted_a.v[i]); + String8 data_b = data_from_file_path(temp.arena, sorted_b.v[i]); is_match = str8_match(data_a, data_b, 0); if ( ! is_match) { - OS_Handle h; - h = os_cmd_line_launchf("dumpbin /all %S /out:a.txt", sorted_a.v[i]); - os_process_join(h, max_U64, 0); - h = os_cmd_line_launchf("dumpbin /all %S /out:b.txt", sorted_b.v[i]); - os_process_join(h, max_U64, 0); + Process h; + h = launch_cmd_linef("dumpbin /all %S /out:a.txt", sorted_a.v[i]); + process_join(h, max_U64, 0); + h = launch_cmd_linef("dumpbin /all %S /out:b.txt", sorted_b.v[i]); + process_join(h, max_U64, 0); } Assert(is_match); if (!is_match) { break; } @@ -495,7 +495,7 @@ t_match_folders(String8 a, String8 b) temp_end(temp); } } - + scratch_end(scratch); return is_match; } @@ -504,25 +504,25 @@ internal void t_entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0,0); - + U64 dashes_size = 9999; U8 *dashes = push_array(scratch.arena, U8, dashes_size); MemorySet(dashes, '-', dashes_size); - + U64 dots_size = 9999; U8 *dots = push_array(scratch.arena, U8, dots_size); MemorySet(dots, '.', dots_size); - + char *spaces = " "; - + #define PrintHeader(p) fprintf(stderr, "--- %s %.*s\n", p, Max((80-4) - (int)strlen(p), 3), dashes) - + // // Handle -help // { B32 print_help = cmd_line_has_flag(cmdline, str8_lit("help")) || - cmd_line_has_flag(cmdline, str8_lit("h")); + cmd_line_has_flag(cmdline, str8_lit("h")); if (print_help) { PrintHeader("Help"); fprintf(stderr, " %s\n\n", BUILD_TITLE_STRING_LITERAL); @@ -536,10 +536,10 @@ t_entry_point(CmdLine *cmdline) fprintf(stderr, " -verbose Enable verbose mode\n"); fprintf(stderr, " -print_stdout Print to console stdout and stderr of a run\n"); fprintf(stderr, " -help Print help menu and exit\n"); - os_abort(0); + abort_self(0); } } - + #if 0 // // config @@ -564,7 +564,7 @@ t_entry_point(CmdLine *cmdline) fprintf(stderr, "\n"); } #endif - + // // Handle -list // @@ -574,10 +574,10 @@ t_entry_point(CmdLine *cmdline) for EachIndex(i, g_torture_test_count) { fprintf(stdout, " %s\n", g_torture_tests[i].label); } - os_abort(0); + abort_self(0); } } - + // // Handle -linker // @@ -591,14 +591,14 @@ t_entry_point(CmdLine *cmdline) g_linker = linker_opt->value_string; } else { fprintf(stderr, "ERROR: -linker has invalid number of arguments\n"); - os_abort(1); + abort_self(1); } } else { // assume default linker g_linker = str8_lit("radlink"); } } - + // // Handle -test_data // @@ -609,7 +609,7 @@ t_entry_point(CmdLine *cmdline) //fprintf(stderr, "WARNING: The test data folder path was not specified. Specify the path when running the program, assuming: %.*s --test_data:%.*s\n", str8_varg(cmdline->exe_name), str8_varg(g_test_data)); } } - + // // Handle optional -target // @@ -637,31 +637,31 @@ t_entry_point(CmdLine *cmdline) } } } - + if (ht->count == 0) { fprintf(stderr, "ERROR: -target matches not found for the following patterns: "); for EachNode(n, String8Node, target_opt->value_strings.first) { fprintf(stderr, "\"%.*s\"\n", str8_varg(n->string)); } - os_abort(1); + abort_self(1); } } else { fprintf(stderr, "ERROR: -target has invalid number of arguments\n"); } } } - + g_verbose = cmd_line_has_flag(cmdline, str8_lit("verbose")); g_redirect_stdout = !cmd_line_has_flag(cmdline, str8_lit("print_stdout")); g_stop_on_first_fail_or_crash = !cmd_line_has_flag(cmdline, str8_lit("keep_going")); - + // default options when running under debugger #if OS_WINDOWS if (!cmd_line_has_flag(cmdline, str8_lit("print_stdout")) && IsDebuggerPresent()) { g_redirect_stdout = 0; } #endif - + // Handle -out { CmdLineOpt *out_opt = cmd_line_opt_from_string(cmdline, str8_lit("out")); @@ -673,27 +673,27 @@ t_entry_point(CmdLine *cmdline) } } } - + // // Make Output Directory // - os_make_directory(g_out); - if (!os_folder_path_exists(g_out)) { + make_directory(g_out); + if (!folder_path_exists(g_out)) { fprintf(stderr, "ERROR: unable to create output directory \"%.*s\"\n", str8_varg(g_out)); - os_abort(1); + abort_self(1); } - + // // Clean up output from previous run // - os_delete_file_at_path(g_stdout_file_name); - + delete_file_at_path(g_stdout_file_name); + // // Run tests // { radsort(g_torture_tests, g_torture_test_count, t_test_is_before); - + U64List target_indices_list = {0}; if (target.node_count == 0) { for EachIndex(i, g_torture_test_count) { u64_list_push(scratch.arena, &target_indices_list, i); } @@ -712,7 +712,7 @@ t_entry_point(CmdLine *cmdline) } } } - + // // -skip // @@ -730,15 +730,15 @@ t_entry_point(CmdLine *cmdline) break; } } - + if (include_test) { u64_list_push(scratch.arena, &final_target_list, n->data); } } - + U64 skip_count = target_indices_list.count - final_target_list.count; U64Array target_indices = u64_array_from_list(scratch.arena, &final_target_list); - + U64 max_label_size = 0; U64 max_group_size = 0; for EachIndex(i, target_indices.count) { @@ -746,19 +746,19 @@ t_entry_point(CmdLine *cmdline) max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[test_idx].label)); max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[test_idx].group)); } - + PrintHeader("Tests"); U64 pass_count = 0; U64 fail_count = 0; U64 crash_count = 0; U64 max_digit_count = count_digits_u64(target_indices.count, 10); - U64 total_time_start = os_now_microseconds(); + U64 total_time_start = now_time_us(); typedef struct { U64 target_idx, d; } Slowest; Slowest slowest[5] = {0}; for EachElement(i, slowest) { slowest[i].target_idx = max_U64; } for EachIndex(i, target_indices.count) { U64 target_idx = target_indices.v[i]; - + // print run progress U64 dots_min = 10; U64 dots_count = (max_label_size - cstring8_length((U8*)g_torture_tests[target_idx].label)) + dots_min; @@ -767,27 +767,27 @@ t_entry_point(CmdLine *cmdline) fprintf(stdout, "[%.*s%I64u/%I64u] ", idx_align_space_count, spaces, i+1, target_indices.count); fprintf(stdout, "%s %.*s:: %s", g_torture_tests[target_idx].group, (int)(max_group_size - cstring8_length((U8*)g_torture_tests[target_idx].group)), spaces, g_torture_tests[target_idx].label); fprintf(stdout, " %.*s ", (int)dots_count, dots); - + // setup output directory g_wdir = push_str8f(scratch.arena, "%S\\%s", g_out, g_torture_tests[target_idx].label); - g_wdir = os_full_path_from_path(scratch.arena, g_wdir); - + g_wdir = full_path_from_path(scratch.arena, g_wdir); + // delete files from last run in the work directory - if (os_folder_path_exists(g_wdir)) { + if (folder_path_exists(g_wdir)) { t_delete_dir(g_wdir); } - os_make_directory(g_wdir); - - if (!os_folder_path_exists(g_out)) { + make_directory(g_wdir); + + if (!folder_path_exists(g_out)) { fprintf(stderr, "ERROR: unable to create output directory for test run %.*s\n", str8_varg(g_wdir)); continue; } - + // run test - U64 run_start_time = os_now_microseconds(); + U64 run_start_time = now_time_us(); T_RunResult result = t_run(g_torture_tests[target_idx].r); - U64 run_end_time = os_now_microseconds(); - + U64 run_end_time = now_time_us(); + // print result if (result.status == T_RunStatus_Pass) { fprintf(stdout, "\x1b[32m" "%s" "\x1b[0m", t_string_from_result(result.status)); @@ -799,13 +799,13 @@ t_entry_point(CmdLine *cmdline) fprintf(stdout, "\x1b[33m" "%s" "\x1b[0m", t_string_from_result(result.status)); crash_count += 1; } - + if (result.status == T_RunStatus_Pass) { U64 d = run_end_time - run_start_time; DateTime t = date_time_from_micro_seconds(d); String8 s = string_from_elapsed_time(scratch.arena, t); fprintf(stdout, " %.*s", str8_varg(s)); - + U64 insert_idx = max_U64; for EachElement(i, slowest) { if (d > slowest[i].d) { @@ -822,18 +822,18 @@ t_entry_point(CmdLine *cmdline) } } fprintf(stdout, "\n"); - + if (result.status == T_RunStatus_Fail) { fprintf(stdout, " ERROR: %s:%d: condition: \"%s\"\n", result.fail_file, result.fail_line, result.fail_cond); } - + if (result.status == T_RunStatus_Fail || result.status == T_RunStatus_Crash) { if (g_stop_on_first_fail_or_crash) { goto exit; } } } fprintf(stderr, "\n"); - U64 total_time_end = os_now_microseconds(); - + U64 total_time_end = now_time_us(); + PrintHeader("Summary"); U64 total_time_dt = total_time_end - total_time_start; String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); @@ -843,7 +843,7 @@ t_entry_point(CmdLine *cmdline) fprintf(stderr, " Skipped %llu\n", skip_count); fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); fprintf(stderr, "\n"); - + { fprintf(stderr, " Slow Tests\n"); U64 label_max = 0; @@ -854,7 +854,7 @@ t_entry_point(CmdLine *cmdline) label_max = Max(strlen(g_torture_tests[s.target_idx].label), label_max); group_max = Max(strlen(g_torture_tests[s.target_idx].group), group_max); } - + for EachElement(i, slowest) { Slowest s = slowest[i]; if (s.target_idx >= g_torture_test_count) { break; } @@ -866,17 +866,17 @@ t_entry_point(CmdLine *cmdline) (int)(label_max - strlen(g_torture_tests[s.target_idx].label)) + 4, dots, str8_varg(elapsed_time)); } - + fprintf(stderr, "\n"); } - + exit:; if (fail_count + crash_count != 0) { fflush(stdout); - os_abort(fail_count + crash_count); + abort_self(fail_count + crash_count); } } - + scratch_end(scratch); } diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index cf667d49..c4f5ace2 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -25,7 +25,7 @@ d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); Assert(exe.size > 0); - B32 was_pdb_deleted = os_delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); + B32 was_pdb_deleted = delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); Assert(was_pdb_deleted); t_invoke_(t_radbin_path(), str8_lit("-rdi a.exe -out:a.rdi"), max_U64, 0, 0); @@ -489,14 +489,14 @@ TEST(d2r_general) T_Ok((test_local->symbol_flags & RDI_SymbolFlag_IsParam) == 0); String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); T_Ok(str8_match(test_local_name, str8_lit("TestLocal"), 0)); - + RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); T_Ok(test_local_type); T_Ok(test_local_type->kind == RDI_TypeKind_Alias); T_Ok(test_local_type->flags == 0); String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); T_Ok(str8_match(alias_name, str8_lit("char"), 0)); - + RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); T_Ok(char_type); T_Ok(char_type->kind == RDI_TypeKind_Char8); @@ -505,21 +505,21 @@ TEST(d2r_general) String8 char_type_name = str8_from_rdi_string_idx(rdi, char_type->built_in.name_string_idx); T_Ok(str8_match(char_type_name, str8_lit("Char8"), 0)); } - + { RDI_Symbol *test_local = rdi_element_from_name_idx(rdi, LocalVariables, root_scope->local_first + 1); T_Ok(test_local); T_Ok((test_local->symbol_flags & RDI_SymbolFlag_IsParam) != 0); String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); T_Ok(str8_match(test_local_name, str8_lit("TestParam"), 0)); - + RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); T_Ok(test_local_type); T_Ok(test_local_type->kind == RDI_TypeKind_Alias); T_Ok(test_local_type->flags == 0); String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); T_Ok(str8_match(alias_name, str8_lit("char"), 0)); - + RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); T_Ok(char_type); T_Ok(char_type->kind == RDI_TypeKind_Char8); diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index e9eebf2d..5d346368 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -121,7 +121,7 @@ dw_input_from_writer(Arena *arena, DW_Writer *writer) t_write_file(str8_lit("dwarf.obj"), raw_coff); t_invoke(str8_lit("radlink"), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full dwarf.obj"), max_U64); - os_delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); + delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); String8 exe = t_read_file(arena, str8_lit("a.exe")); PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); @@ -862,9 +862,10 @@ TEST(dwarf_writer) TEST(value_in_register) { // setup register context - REGS_RegBlockX64 regs = {0}; - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_Reg3 - DW_ExprOp_Reg0); - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + X64_RegBlock regs = {0}; + ARCH_Info *arch_info = arch_info_from_arch(Arch_x64); + ARCH_RegCode reg_code = arch_reg_code_from_dw(Arch_x64, DW_ExprOp_Reg3 - DW_ExprOp_Reg0); + Rng1U16 reg_range = arch_info->reg_code_rng_table[reg_code]; U64 value = 0xc0ffee; MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); @@ -875,7 +876,7 @@ TEST(value_in_register) // evaluate the program DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, ®s, 0, 0, &expr_value); // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); @@ -886,9 +887,10 @@ TEST(value_in_register) TEST(value_in_x_register) { // setup register context - REGS_RegBlockX64 regs = {0}; - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_RegX64_FsBase); - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + X64_RegBlock regs = {0}; + ARCH_Info *arch_info = arch_info_from_arch(Arch_x64); + ARCH_RegCode reg_code = arch_reg_code_from_dw(Arch_x64, DW_RegX64_FsBase); + Rng1U16 reg_range = arch_info->reg_code_rng_table[reg_code]; U64 value = 0xc0ffee; MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); @@ -899,7 +901,7 @@ TEST(value_in_x_register) // evaluate the program DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, ®s, 0, 0, &expr_value); // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); @@ -917,7 +919,7 @@ TEST(address_of_value) // evaluate the program DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, &expr_value); // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); @@ -927,19 +929,22 @@ TEST(address_of_value) TEST(register_relative_variable) { + ARCH_Info *arch_info = arch_info_from_arch(Arch_x64); + // setup register context - REGS_RegBlockX64 regs = {0}; - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg11 - DW_ExprOp_BReg0); - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + X64_RegBlock regs = {0}; + DW_Reg reg_dw_id = (DW_ExprOp_BReg11 - DW_ExprOp_BReg0); + ARCH_RegCode reg_code = arch_reg_code_from_dw(Arch_x64, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; U64 value = 1; - MemoryCopy((U8 *)®s + reg_range.min, &value, sizeof(value)); + MemoryCopy((U8 *)®s + reg_rng.min, &value, sizeof(value)); DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BReg11), DW_ExprEnc_SLEB128(44) }; String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, ®s, 0, 0, &expr_value); // validate eval result T_Ok(expr_eval == DW_ExprEvalResult_Ok); @@ -955,7 +960,7 @@ TEST(frame_relative_variable) U64 frame_base = 123; DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, &expr_value); T_Ok(expr_eval == DW_ExprEvalResult_Ok); T_Ok(expr_value.type == DW_ExprValueType_Addr); @@ -975,18 +980,19 @@ TEST(call_by_reference) U64 value = 0xc0ffee; MemoryCopy(memory + 32, &value, sizeof(value)); - REGS_RegBlockX64 regs = {0}; - REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, 58); // fsbase - Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); + ARCH_Info *arch_info = arch_info_from_arch(Arch_x64); + X64_RegBlock regs = {0}; + ARCH_RegCode reg_code = arch_reg_code_from_dw(Arch_x64, 58); // fsbase + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; U64 memory_ptr = IntFromPtr(memory); - MemoryCopy((U8 *)®s + reg_range.min, &memory_ptr, sizeof(memory_ptr)); + MemoryCopy((U8 *)®s + reg_rng.min, &memory_ptr, sizeof(memory_ptr)); DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(BRegX), DW_ExprEnc_ULEB128(58), DW_ExprEnc_SLEB128(32), DW_ExprEnc_Op(Deref) }; String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); DW_ExprValue expr_value = { 0 }; - DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, t_machine_op_mem_read, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, ®s, t_machine_op_mem_read, 0, &expr_value); T_Ok(expr_value.type == DW_ExprValueType_Generic); T_Ok(expr_value.generic.size == sizeof(U64)); @@ -1001,7 +1007,7 @@ TEST(plus_uconst) DW_Expr expr = dw_expr_from_data(arena, DW_Format_64Bit, byte_size_from_arch(Arch_x64), expr_data); DW_ExprValue expr_value; - DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, t_machine_op_mem_read, 0, &expr_value); + DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, t_machine_op_mem_read, 0, &expr_value); T_Ok(expr_value.type == DW_ExprValueType_Addr); T_Ok(expr_value.addr == 0x123 + 4); @@ -1011,7 +1017,7 @@ TEST(plus_uconst) TEST(reg_split_spill) { // setup register context - REGS_RegBlockX64 regs = {0}; + X64_RegBlock regs = {0}; { REGS_RegCode reg_code = reg_code_from_dw_reg(Arch_x64, DW_ExprOp_BReg3 - DW_ExprOp_BReg0); Rng1U64 reg_range = regs_range_from_code(Arch_x64, 0, reg_code); diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index bdc588c5..fe3e0819 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -62,9 +62,7 @@ #include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "obj/obj.h" #include "radbin/radbin.h" -#include "regs/regs.h" -#include "regs/rdi/regs_rdi.h" -#include "regs/dwarf/regs_dwarf.h" +#include "arch/arch_inc.h" #include "dbg_info/dbg_info.h" #include "disasm/disasm.h" #include "stap/stap_parse.h" @@ -137,9 +135,7 @@ #include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "obj/obj.c" #include "radbin/radbin.c" -#include "regs/regs.c" -#include "regs/rdi/regs_rdi.c" -#include "regs/dwarf/regs_dwarf.c" +#include "arch/arch_inc.c" #include "dbg_info/dbg_info.c" #include "disasm/disasm.c" #include "stap/stap_parse.c" diff --git a/src/torture/torture_p2r.c b/src/torture/torture_p2r.c index 17f76c5e..a7804059 100644 --- a/src/torture/torture_p2r.c +++ b/src/torture/torture_p2r.c @@ -16,42 +16,46 @@ TEST(p2r_determ) { // rjf: unpack paths, make output directory String8 pdb_path = path_normalized_from_string(arena, pdb_paths[pdb_idx]); - + // rjf: generate all RDIs String8List rdi_paths = {0}; String8List dump_paths = {0}; { - OS_HandleList processes = {0}; + ProcessList processes = {0}; for EachIndex(repeat_idx, num_repeats_per_pdb) { String8 rdi_name = push_str8f(arena, "repeat_%I64u.rdi", repeat_idx); String8 rdi_path = t_make_file_path(arena, rdi_name); str8_list_push(arena, &rdi_paths, rdi_path); String8 cmdl = str8f(arena, "radbin -rdi -deterministic %S -out:%S", pdb_path, rdi_path); - OS_Handle process_handle = os_cmd_line_launch(cmdl); - T_Ok(!os_handle_match(os_handle_zero(), process_handle)); - os_handle_list_push(arena, &processes, process_handle); + Process process = launch_cmd_line(cmdl); + T_Ok(!process_match(process_zero(), process)); + process_list_push(arena, &processes, process); + } + for EachNode(n, ProcessNode, processes.first) + { + process_join(n->v, max_U64, 0); } - - // wait on the converters - for EachNode(n, OS_HandleNode, processes.first) { os_process_join(n->v, max_U64, 0); } } - + // rjf: generate all dumps { - OS_HandleList processes = {0}; + ProcessList processes = {0}; for EachNode(n, String8Node, rdi_paths.first) { String8 rdi_path = n->string; - String8 dump_path = push_str8f(arena, "%S.dump", rdi_path); + String8 dump_path = str8f(arena, "%S.dump", rdi_path); str8_list_push(arena, &dump_paths, dump_path); - OS_Handle process_handle = os_cmd_line_launchf("radbin -dump -deterministic %S -out:%S", rdi_path, dump_path); - T_Ok(!os_handle_match(os_handle_zero(), process_handle)); - os_handle_list_push(arena, &processes, process_handle); + Process process_handle = launch_cmd_linef("radbin -dump -deterministic %S -out:%S", rdi_path, dump_path); + T_Ok(!process_match(process_zero(), process_handle)); + process_list_push(arena, &processes, process_handle); + } + for EachNode(n, ProcessNode, processes.first) + { + process_join(n->v, max_U64, 0); } - for EachNode(n, OS_HandleNode, processes.first) { os_process_join(n->v, max_U64, 0); } } - + // rjf: gather all hashes/paths U64 rdi_hashes_count = rdi_paths.node_count; U128 *rdi_hashes = push_array(arena, U128, rdi_hashes_count); @@ -65,11 +69,11 @@ TEST(p2r_determ) { Temp scratch = scratch_begin(0, 0); String8 rdi_path = n->string; - String8 path = rdi_path; + String8 path = rdi_path; T_Ok(path.size); - String8 data = os_data_from_file_path(scratch.arena, path); + String8 data = data_from_file_path(scratch.arena, path); T_Ok(data.size); - rdi_hashes [idx] = u128_hash_from_str8(data); + rdi_hashes[idx] = u128_hash_from_str8(data); rdi_paths_array[idx] = path; scratch_end(scratch); idx += 1; @@ -82,15 +86,15 @@ TEST(p2r_determ) Temp scratch = scratch_begin(0, 0); String8 path = n->string; T_Ok(path.size); - String8 data = os_data_from_file_path(scratch.arena, path); + String8 data = data_from_file_path(scratch.arena, path); T_Ok(data.size); - dump_hashes [idx] = u128_hash_from_str8(data); + dump_hashes[idx] = u128_hash_from_str8(data); dump_paths_array[idx] = path; scratch_end(scratch); idx += 1; } } - + // rjf: determine if all hashes match U64 mismatch_idx = max_U64; for EachIndex(idx, rdi_hashes_count) @@ -109,7 +113,7 @@ TEST(p2r_determ) break; } } - + // rjf: output bad case info if (mismatch_idx != max_U64) { U64 idx = mismatch_idx; diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 9c3e38ec..b937fac5 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -1915,7 +1915,7 @@ TEST(weak_cycle) .symbols = (T_COFF_DefSymbol[]){ T_COFF_DefSymbol_Extern("my_entry", "text", 0), {0} } })); - U64 timeout = os_now_microseconds() + 3 * 1000 * 1000; // give a generous 3 seconds + U64 timeout = now_time_us() + 3 * 1000 * 1000; // give a generous 3 seconds t_invoke_linker_timeoutf(timeout, "/subsystem:console /entry:my_entry %S %S %S", entry_obj_name, ab_obj_name, ba_obj_name); } @@ -3979,18 +3979,18 @@ TEST(import_kernel32) #if OS_WINDOWS { String8 test_file_path = push_str8f(arena, "%S/test", g_wdir); - os_delete_file_at_path(test_file_path); + delete_file_at_path(test_file_path); - OS_ProcessLaunchParams launch_opts = {0}; + ProcessLaunchParams launch_opts = {0}; launch_opts.inherit_env = 0; launch_opts.path = g_wdir; str8_list_pushf(arena, &launch_opts.cmd_line, "%S/a.exe", g_wdir); - OS_Handle handle = os_process_launch(&launch_opts); - AssertAlways(!os_handle_match(handle, os_handle_zero())); + Process handle = process_launch(&launch_opts); + AssertAlways(!process_match(handle, process_zero())); U64 exit_code = max_U64; - os_process_join(handle, max_U64, &exit_code); + process_join(handle, max_U64, &exit_code); T_Ok(exit_code == 0); - T_Ok(os_file_path_exists(test_file_path)); + T_Ok(file_path_exists(test_file_path)); } #endif } @@ -6413,17 +6413,17 @@ TEST(determ_test) String8 main_pdb = t_read_file(arena, str8_lit("main.pdb")); // multi-threaded links - OS_HandleList linkers = {0}; + ProcessList linkers = {0}; for EachIndex(i, run_count) { String8 out_path = t_make_file_path(arena, str8f(arena, "%llu.exe", i)); String8 cmdl = str8f(arena, "%S %S /debug:full /rad_time_stamp:0 /rad_imagealtpath:main.exe /pdbaltpath:main.pdb /rad_log:-all /rad_ignore:74 /out:%S", t_radlink_path(), test_path, out_path); - OS_Handle process_handle = os_cmd_line_launch(cmdl); - T_Ok(!os_handle_match(os_handle_zero(), process_handle)); - os_handle_list_push(arena, &linkers, process_handle); + Process process_handle = launch_cmd_line(cmdl); + T_Ok(!process_match(process_zero(), process_handle)); + process_list_push(arena, &linkers, process_handle); } // wait for linkers - for EachNode(n, OS_HandleNode, linkers.first) { os_process_join(n->v, max_U64, 0); } + for EachNode(n, ProcessNode, linkers.first) { process_join(n->v, max_U64, 0); } for EachIndex(i, run_count) { Temp temp = temp_begin(arena); diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 333d1b47..b181f976 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -471,7 +471,7 @@ ui_build_arena(void) return result; } -internal OS_Handle +internal OS_Window ui_window(void) { return ui_state->window; @@ -722,7 +722,7 @@ internal B32 ui_string_hover_active(void) { return (ui_state->build_index > 0 && ui_state->string_hover_build_index >= ui_state->build_index-1 && - os_now_microseconds() >= ui_state->string_hover_begin_us + 500000); + now_time_us() >= ui_state->string_hover_begin_us + 500000); } internal U64 @@ -796,7 +796,7 @@ ui_box_from_key(UI_Key key) //~ rjf: Top-Level Building API internal void -ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt) +ui_begin_build(OS_Window window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt) { //- rjf: reset per-build ui state { @@ -865,7 +865,7 @@ ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, U { if(n->v.kind == UI_EventKind_MouseMove) { - ui_state->last_time_mousemoved_us = os_now_microseconds(); + ui_state->last_time_mousemoved_us = now_time_us(); } } @@ -887,7 +887,7 @@ ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, U ui_state->theme = theme; ui_state->events = events; ui_state->window = window; - ui_state->mouse = (os_window_is_focused(window) || ui_state->last_time_mousemoved_us+500000 >= os_now_microseconds()) ? os_mouse_from_window(window) : v2f32(-100, -100); + ui_state->mouse = (os_window_is_focused(window) || ui_state->last_time_mousemoved_us+500000 >= now_time_us()) ? os_mouse_from_window(window) : v2f32(-100, -100); ui_state->animation_dt = animation_dt; MemoryZeroStruct(&ui_state->icon_info); ui_state->icon_info.icon_font = icon_info->icon_font; @@ -1643,7 +1643,7 @@ ui_end_build(void) ui_state->string_hover_string = push_str8_copy(ui_state->string_hover_arena, box_display_string); ui_state->string_hover_size = box->font_size; ui_state->string_hover_fstrs = dr_fstrs_copy(ui_state->string_hover_arena, &b->display_fstrs); - ui_state->string_hover_begin_us = os_now_microseconds(); + ui_state->string_hover_begin_us = now_time_us(); } ui_state->string_hover_build_index = ui_state->build_index; found = 1; diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index f5acb805..85fdbe53 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -705,7 +705,7 @@ struct UI_State UI_IconInfo icon_info; UI_Theme *theme; UI_AnimationInfo animation_info; - OS_Handle window; + OS_Window window; UI_EventList *events; Vec2F32 mouse; F32 animation_dt; @@ -826,7 +826,7 @@ internal UI_State *ui_get_selected_state(void); //- rjf: per-frame info internal Arena * ui_build_arena(void); -internal OS_Handle ui_window(void); +internal OS_Window ui_window(void); internal Vec2F32 ui_mouse(void); internal FNT_Tag ui_icon_font(void); internal String8 ui_icon_string_from_kind(UI_IconKind icon_kind); @@ -873,7 +873,7 @@ internal UI_Box * ui_box_from_key(UI_Key key); //////////////////////////////// //~ rjf: Top-Level Building API -internal void ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt); +internal void ui_begin_build(OS_Window window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt); internal void ui_end_build(void); internal void ui_calc_sizes_standalone__in_place(UI_Box *root, Axis2 axis); internal void ui_calc_sizes_upwards_dependent__in_place(UI_Box *root, Axis2 axis); diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c new file mode 100644 index 00000000..9e98025f --- /dev/null +++ b/src/win32/base/win32_base.c @@ -0,0 +1,1919 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Modern Windows SDK Functions +// +// (We must dynamically link to them, since they can be missing in older SDKs) + +typedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, PCWSTR lpThreadDescription); +global W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0; +global RIO_EXTENSION_FUNCTION_TABLE w32_rio_functions = {0}; + +//////////////////////////////// +//~ rjf: File Info Conversion Helpers + +internal FilePropertyFlags +os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes) +{ + FilePropertyFlags flags = 0; + if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + flags |= FilePropertyFlag_IsFolder; + } + return flags; +} + +internal void +os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes) +{ + properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow); + os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); + os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); + properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); +} + +//////////////////////////////// +//~ rjf: Time Conversion Helpers + +internal void +os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) +{ + out->year = in->wYear; + out->mon = in->wMonth - 1; + out->wday = in->wDayOfWeek; + out->day = in->wDay; + out->hour = in->wHour; + out->min = in->wMinute; + out->sec = in->wSecond; + out->msec = in->wMilliseconds; +} + +internal void +os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in) +{ + out->wYear = (WORD)(in->year); + out->wMonth = in->mon + 1; + out->wDay = in->day; + out->wHour = in->hour; + out->wMinute = in->min; + out->wSecond = in->sec; + out->wMilliseconds = in->msec; +} + +internal void +os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in) +{ + SYSTEMTIME systime = {0}; + FileTimeToSystemTime(in, &systime); + DateTime date_time = {0}; + os_w32_date_time_from_system_time(&date_time, &systime); + *out = dense_time_from_date_time(date_time); +} + +internal U32 +os_w32_sleep_ms_from_endt_us(U64 endt_us) +{ + U32 sleep_ms = 0; + if(endt_us == max_U64) + { + sleep_ms = INFINITE; + } + else + { + U64 begint = now_time_us(); + if(begint < endt_us) + { + U64 sleep_us = endt_us - begint; + sleep_ms = (U32)((sleep_us + 999)/1000); + } + } + return sleep_ms; +} + +internal U32 +os_w32_unix_time_from_file_time(FILETIME file_time) +{ + U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime; + U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000); + + Assert(unix_time64 <= max_U32); + U32 unix_time32 = (U32)unix_time64; + + return unix_time32; +} + +//////////////////////////////// +//~ rjf: Entity Functions + +internal OS_W32_Entity * +os_w32_entity_alloc(OS_W32_EntityKind kind) +{ + OS_W32_Entity *result = 0; + EnterCriticalSection(&os_w32_state.entity_mutex); + { + result = os_w32_state.entity_free; + if(result) + { + SLLStackPop(os_w32_state.entity_free); + } + else + { + result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1); + } + MemoryZeroStruct(result); + } + LeaveCriticalSection(&os_w32_state.entity_mutex); + result->kind = kind; + return result; +} + +internal void +os_w32_entity_release(OS_W32_Entity *entity) +{ + entity->kind = OS_W32_EntityKind_Null; + EnterCriticalSection(&os_w32_state.entity_mutex); + SLLStackPush(os_w32_state.entity_free, entity); + LeaveCriticalSection(&os_w32_state.entity_mutex); +} + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal DWORD +os_w32_thread_entry_point(void *ptr) +{ + OS_W32_Entity *entity = (OS_W32_Entity *)ptr; + ThreadEntryPointFunctionType *func = entity->thread.func; + void *thread_ptr = entity->thread.ptr; + supplement_thread_base_entry_point(func, thread_ptr); + return 0; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Platform Time Functions + +internal U64 +now_time_us(void) +{ + U64 result = 0; + LARGE_INTEGER large_int_counter; + if(QueryPerformanceCounter(&large_int_counter)) + { + result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution; + } + return result; +} + +internal U32 +now_time_unix(void) +{ + FILETIME file_time; + GetSystemTimeAsFileTime(&file_time); + U32 unix_time = os_w32_unix_time_from_file_time(file_time); + return unix_time; +} + +internal DateTime +now_time_universal(void) +{ + SYSTEMTIME systime = {0}; + GetSystemTime(&systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal DateTime +universal_from_local_time(DateTime *date_time) +{ + SYSTEMTIME systime = {0}; + os_w32_system_time_from_date_time(&systime, date_time); + FILETIME ftime = {0}; + SystemTimeToFileTime(&systime, &ftime); + FILETIME ftime_local = {0}; + LocalFileTimeToFileTime(&ftime, &ftime_local); + FileTimeToSystemTime(&ftime_local, &systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal DateTime +local_from_universal_time(DateTime *date_time) +{ + SYSTEMTIME systime = {0}; + os_w32_system_time_from_date_time(&systime, date_time); + FILETIME ftime = {0}; + SystemTimeToFileTime(&systime, &ftime); + FILETIME ftime_local = {0}; + FileTimeToLocalFileTime(&ftime, &ftime_local); + FileTimeToSystemTime(&ftime_local, &systime); + DateTime result = {0}; + os_w32_date_time_from_system_time(&result, &systime); + return result; +} + +internal void +sleep_ms(U32 msec) +{ + Sleep(msec); +} + +//////////////////////////////// +//~ rjf: @per_os_impl Platform GUID Functions + +internal Guid +make_guid(void) +{ + Guid result; + MemoryZeroStruct(&result); + UUID uuid; + RPC_STATUS rpc_status = UuidCreate(&uuid); + if(rpc_status == RPC_S_OK) + { + result.data1 = uuid.Data1; + result.data2 = uuid.Data2; + result.data3 = uuid.Data3; + MemoryCopyArray(result.data4, uuid.Data4); + } + return result; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Platform Memory Allocation + +//- rjf: basic + +internal void * +reserve_memory(U64 size) +{ + void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); + return result; +} + +internal B32 +commit_memory(void *ptr, U64 size) +{ + B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0); + if(w32_rio_functions.RIORegisterBuffer) + { + // wine does not implement these functions + w32_rio_functions.RIODeregisterBuffer(w32_rio_functions.RIORegisterBuffer(ptr, size)); + } +#if PROFILE_TELEMETRY + tmAlloc(0, ptr, size / 1024, "Win32 Commit"); +#endif + return result; +} + +internal void +decommit_memory(void *ptr, U64 size) +{ + VirtualFree(ptr, size, MEM_DECOMMIT); +#if PROFILE_TELEMETRY + tmFree(0, ptr); +#endif +} + +internal void +release_memory(void *ptr, U64 size) +{ + // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes. + VirtualFree(ptr, 0, MEM_RELEASE); +} + +//- rjf: large pages + +internal void * +reserve_memory_large(U64 size) +{ + // we commit on reserve because windows + void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE); + return result; +} + +internal B32 +commit_memory_large(void *ptr, U64 size) +{ + return 1; +} + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory + +internal SharedMemory +shared_memory_alloc(U64 size, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE, + 0, + PAGE_READWRITE, + (U32)((size & 0xffffffff00000000) >> 32), + (U32)((size & 0x00000000ffffffff)), + (WCHAR *)name16.str); + SharedMemory result = {(U64)file}; + scratch_end(scratch); + return result; +} + +internal SharedMemory +shared_memory_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str); + SharedMemory result = {(U64)file}; + scratch_end(scratch); + return result; +} + +internal void +shared_memory_close(SharedMemory handle) +{ + HANDLE file = (HANDLE)(handle.u64[0]); + CloseHandle(file); +} + +internal void * +shared_memory_view_open(SharedMemory handle, Rng1U64 range) +{ + HANDLE file = (HANDLE)(handle.u64[0]); + U64 offset = range.min; + U64 size = range.max-range.min; + void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS, + (U32)((offset & 0xffffffff00000000) >> 32), + (U32)((offset & 0x00000000ffffffff)), + size); + return ptr; +} + +internal void +shared_memory_view_close(SharedMemory handle, void *ptr, Rng1U64 range) +{ + UnmapViewOfFile(ptr); +} + +//////////////////////////////// +//~ rjf: @per_os_impl System Info + +internal SystemInfo * +get_system_info(void) +{ + return &os_w32_state.system_info; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Current Thread Info + +internal U32 +tid(void) +{ + DWORD id = GetCurrentThreadId(); + return (U32)id; +} + +internal void +set_platform_thread_name(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + + // rjf: windows 10 style + if(w32_SetThreadDescription_func) + { + String16 name16 = str16_from_8(scratch.arena, name); + HRESULT hr = w32_SetThreadDescription_func(GetCurrentThread(), (WCHAR*)name16.str); + } + + // rjf: raise-exception style + { + String8 name_copy = push_str8_copy(scratch.arena, name); +#pragma pack(push,8) + typedef struct THREADNAME_INFO THREADNAME_INFO; + struct THREADNAME_INFO + { + U32 dwType; // Must be 0x1000. + char *szName; // Pointer to name (in user addr space). + U32 dwThreadID; // Thread ID (-1=caller thread). + U32 dwFlags; // Reserved for future use, must be zero. + }; +#pragma pack(pop) + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = (char *)name_copy.str; + info.dwThreadID = tid(); + info.dwFlags = 0; +#pragma warning(push) +#pragma warning(disable: 6320 6322) + __try + { + RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } +#pragma warning(pop) + } + + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: @per_os_impl Thread Functions + +internal Thread +thread_launch(ThreadEntryPointFunctionType *f, void *p) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread); + entity->thread.func = f; + entity->thread.ptr = p; + entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid); + Thread result = {IntFromPtr(entity)}; + return result; +} + +internal B32 +thread_join(Thread thread, U64 endt_us) +{ + DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(thread.u64[0]); + DWORD wait_result = WAIT_OBJECT_0; + if(entity != 0) + { + wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); + CloseHandle(entity->thread.handle); + os_w32_entity_release(entity); + } + return (wait_result == WAIT_OBJECT_0); +} + +internal void +thread_detach(Thread thread) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]); + if(entity != 0) + { + CloseHandle(entity->thread.handle); + os_w32_entity_release(entity); + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Safe Calls + +internal void +safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr) +{ + __try + { + func(ptr); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + if(fail_handler != 0) + { + fail_handler(ptr); + } + } +} + +//////////////////////////////// +//~ rjf: @per_os_impl Synchronization Primitive Functions + +//- rjf: recursive mutexes + +internal Mutex +mutex_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex); + InitializeCriticalSection(&entity->mutex); + Mutex result = {IntFromPtr(entity)}; + return result; +} + +internal void +mutex_release(Mutex mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + DeleteCriticalSection(&entity->mutex); + os_w32_entity_release(entity); +} + +internal void +mutex_take(Mutex mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + EnterCriticalSection(&entity->mutex); +} + +internal void +mutex_drop(Mutex mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + LeaveCriticalSection(&entity->mutex); +} + +//- rjf: reader/writer mutexes + +internal RWMutex +rw_mutex_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex); + InitializeSRWLock(&entity->rw_mutex); + RWMutex result = {IntFromPtr(entity)}; + return result; +} + +internal void +rw_mutex_release(RWMutex rw_mutex) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + os_w32_entity_release(entity); +} + +internal void +rw_mutex_take(RWMutex rw_mutex, B32 write_mode) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + if(write_mode) + { + AcquireSRWLockExclusive(&entity->rw_mutex); + } + else + { + AcquireSRWLockShared(&entity->rw_mutex); + } +} + +internal void +rw_mutex_drop(RWMutex rw_mutex, B32 write_mode) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + if(write_mode) + { + ReleaseSRWLockExclusive(&entity->rw_mutex); + } + else + { + ReleaseSRWLockShared(&entity->rw_mutex); + } +} + +//- rjf: condition variables + +internal CondVar +cond_var_alloc(void) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable); + InitializeConditionVariable(&entity->cv); + CondVar result = {IntFromPtr(entity)}; + return result; +} + +internal void +cond_var_release(CondVar cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + os_w32_entity_release(entity); +} + +internal B32 +cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + BOOL result = 0; + if(sleep_ms > 0) + { + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms); + } + return result; +} + +internal B32 +cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + BOOL result = 0; + if(sleep_ms > 0) + { + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); + result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, + write_mode ? 0 : CONDITION_VARIABLE_LOCKMODE_SHARED); + } + return result; +} + +internal void +cond_var_signal(CondVar cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + WakeConditionVariable(&entity->cv); +} + +internal void +cond_var_broadcast(CondVar cv) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + WakeAllConditionVariable(&entity->cv); +} + +//- rjf: cross-process semaphores + +internal Semaphore +semaphore_alloc(U32 initial_count, U32 max_count, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str); + Semaphore result = {(U64)handle}; + scratch_end(scratch); + return result; +} + +internal void +semaphore_release(Semaphore semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + CloseHandle(handle); +} + +internal Semaphore +semaphore_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS, 0, (WCHAR *)name16.str); + Semaphore result = {(U64)handle}; + scratch_end(scratch); + return result; +} + +internal void +semaphore_close(Semaphore semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + CloseHandle(handle); +} + +internal B32 +semaphore_take(Semaphore semaphore, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + HANDLE handle = (HANDLE)semaphore.u64[0]; + DWORD wait_result = WaitForSingleObject(handle, sleep_ms); + B32 result = (wait_result == WAIT_OBJECT_0); + return result; +} + +internal void +semaphore_drop(Semaphore semaphore) +{ + HANDLE handle = (HANDLE)semaphore.u64[0]; + ReleaseSemaphore(handle, 1, 0); +} + +//- rjf: barriers + +internal Barrier +barrier_alloc(U64 count) +{ + OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Barrier); + if(entity != 0) + { + BOOL init_good = InitializeSynchronizationBarrier(&entity->sb, count, -1); + (void)init_good; + } + Barrier result = {IntFromPtr(entity)}; + return result; +} + +internal void +barrier_release(Barrier barrier) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]); + if(entity != 0) + { + DeleteSynchronizationBarrier(&entity->sb); + os_w32_entity_release(entity); + } +} + +internal void +barrier_wait(Barrier barrier) +{ + OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]); + if(entity != 0) + { + EnterSynchronizationBarrier(&entity->sb, 0); + } +} + +//////////////////////////////// +//~ rjf: @per_os_impl File System (Implemented Per-OS) + +//- rjf: files + +internal File +file_open(AccessFlags flags, String8 path) +{ + File result = {0}; + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD access_flags = 0; + DWORD share_mode = 0; + DWORD creation_disposition = OPEN_EXISTING; + SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0}; + if(flags & AccessFlag_Read) {access_flags |= GENERIC_READ;} + if(flags & AccessFlag_Write) {access_flags |= GENERIC_WRITE;} + if(flags & AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} + if(flags & AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;} + if(flags & AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;} + if(flags & AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;} + if(flags & AccessFlag_Append) {creation_disposition = OPEN_ALWAYS; access_flags |= FILE_APPEND_DATA; } + if(flags & AccessFlag_Inherited) + { + security_attributes.bInheritHandle = 1; + } + HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, &security_attributes, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0); + if(file != INVALID_HANDLE_VALUE) + { + result.u64[0] = (U64)file; + } + else + { + DWORD err = GetLastError(); + (void)err; + } + scratch_end(scratch); + return result; +} + +internal void +file_close(File file) +{ + if(file_match(file, file_zero())) { return; } + HANDLE handle = (HANDLE)file.u64[0]; + BOOL result = CloseHandle(handle); + (void)result; +} + +internal U64 +file_read(File file, Rng1U64 rng, void *out_data) +{ + if(file_match(file, file_zero())) { return 0; } + + HANDLE handle = (HANDLE)file.u64[0]; + U8 *ptr = out_data; + U64 off = rng.min; + while(off != rng.max) + { + U64 amt64 = rng.max - off; + U32 amt32 = (U32)Min(MB(32), amt64); + DWORD read_size = 0; + OVERLAPPED overlapped = { .Offset = (U32)off, .OffsetHigh = (U32)(off >> 32) }; + if( ! ReadFile(handle, ptr, amt32, &read_size, &overlapped)) + { + break; + } + ptr += read_size; + off += read_size; + } + + U64 total_read_size = off - rng.min; + return total_read_size; +} + +internal U64 +file_write(File file, Rng1U64 rng, void *data) +{ + if(file_match(file, file_zero())) { return 0; } + HANDLE win_handle = (HANDLE)file.u64[0]; + U64 src_off = 0; + U64 dst_off = rng.min; + U64 total_write_size = dim_1u64(rng); + for(;;) + { + void *bytes_src = (U8 *)data + src_off; + U64 bytes_left = total_write_size - src_off; + DWORD write_size = Min(MB(1), bytes_left); + DWORD bytes_written = 0; + OVERLAPPED overlapped = {0}; + overlapped.Offset = (dst_off&0x00000000ffffffffull); + overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32; + BOOL success = WriteFile(win_handle, bytes_src, write_size, &bytes_written, &overlapped); + if(success == 0) + { + break; + } + src_off += bytes_written; + dst_off += bytes_written; + if(bytes_left == 0) + { + break; + } + } + return src_off; +} + +internal B32 +file_set_time(File file, DateTime time) +{ + if(file_match(file, file_zero())) { return 0; } + B32 result = 0; + HANDLE handle = (HANDLE)file.u64[0]; + SYSTEMTIME system_time = {0}; + os_w32_system_time_from_date_time(&system_time, &time); + FILETIME file_time = {0}; + result = (SystemTimeToFileTime(&system_time, &file_time) && + SetFileTime(handle, &file_time, &file_time, &file_time)); + return result; +} + +internal FileProperties +properties_from_file(File file) +{ + if(file_match(file, file_zero())) { FileProperties r = {0}; return r; } + FileProperties props = {0}; + HANDLE handle = (HANDLE)file.u64[0]; + BY_HANDLE_FILE_INFORMATION info; + BOOL info_good = GetFileInformationByHandle(handle, &info); + if(info_good) + { + U32 size_lo = info.nFileSizeLow; + U32 size_hi = info.nFileSizeHigh; + props.size = (U64)size_lo | (((U64)size_hi)<<32); + os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); + os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); + props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); + } + return props; +} + +internal FileID +id_from_file(File file) +{ + if(file_match(file, file_zero())) { FileID r = {0}; return r; } + FileID result = {0}; + HANDLE handle = (HANDLE)file.u64[0]; + BY_HANDLE_FILE_INFORMATION info; + BOOL is_ok = GetFileInformationByHandle(handle, &info); + if(is_ok) + { + result.v[0] = info.dwVolumeSerialNumber; + result.v[1] = info.nFileIndexLow; + result.v[2] = info.nFileIndexHigh; + } + return result; +} + +internal B32 +file_reserve_size(File file, U64 size) +{ + HANDLE handle = (HANDLE)file.u64[0]; + + FILE_ALLOCATION_INFO alloc_info = {0}; + alloc_info.AllocationSize.LowPart = size & max_U32; + alloc_info.AllocationSize.HighPart = (size >> 32) & max_U32; + + BOOL is_reserved = SetFileInformationByHandle(handle, FileAllocationInfo, &alloc_info, sizeof(alloc_info)); + return is_reserved; +} + +internal B32 +delete_file_at_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + B32 result = DeleteFileW((WCHAR*)path16.str); + scratch_end(scratch); + return result; +} + +internal B32 +copy_file_path(String8 dst, String8 src) +{ + Temp scratch = scratch_begin(0, 0); + String16 dst16 = str16_from_8(scratch.arena, dst); + String16 src16 = str16_from_8(scratch.arena, src); + B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0); + scratch_end(scratch); + return result; +} + +internal B32 +move_file_path(String8 dst, String8 src) +{ + Temp scratch = scratch_begin(0, 0); + String16 dst16 = str16_from_8(scratch.arena, dst); + String16 src16 = str16_from_8(scratch.arena, src); + B32 result = MoveFileW((WCHAR*)src16.str, (WCHAR*)dst16.str); + scratch_end(scratch); + return result; +} + +internal String8 +full_path_from_path(Arena *arena, String8 path) +{ + Temp scratch = scratch_begin(&arena, 1); + DWORD buffer_size = Max(MAX_PATH, path.size * 2) + 1; + String16 path16 = str16_from_8(scratch.arena, path); + WCHAR *buffer = push_array_no_zero(scratch.arena, WCHAR, buffer_size); + DWORD path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL); + if(path16_size > buffer_size) + { + arena_pop(scratch.arena, buffer_size); + buffer_size = path16_size + 1; + buffer = push_array_no_zero(scratch.arena, WCHAR, buffer_size); + path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL); + } + String8 full_path = str8_from_16(arena, str16((U16*)buffer, path16_size)); + scratch_end(scratch); + return full_path; +} + +internal B32 +file_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0,0); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); + B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY); + scratch_end(scratch); + return exists; +} + +internal B32 +folder_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0,0); + String16 path16 = str16_from_8(scratch.arena, path); + DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); + B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && (attributes & FILE_ATTRIBUTE_DIRECTORY); + scratch_end(scratch); + return exists; +} + +internal FileProperties +properties_from_file_path(String8 path) +{ + WIN32_FIND_DATAW find_data = {0}; + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data); + FileProperties props = {0}; + if(handle != INVALID_HANDLE_VALUE) + { + props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow); + os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime); + os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime); + props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes); + } + else + { + Temp scratch = scratch_begin(0, 0); + WCHAR buffer[512] = {0}; + DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); + U64 last_slash_pos = 0; + for(;last_slash_pos < path.size; last_slash_pos = str8_find_needle(path, last_slash_pos+1, str8_lit("/"), StringMatchFlag_SlashInsensitive)); + String8 path_trimmed = str8_prefix(path, last_slash_pos); + for(U64 off = 0; off < (U64)length;) + { + String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); + off += next_drive_string_16.size+1; + String8 next_drive_string = str8_from_16(scratch.arena, next_drive_string_16); + next_drive_string = str8_chop_last_slash(next_drive_string); + if(str8_match(path_trimmed, next_drive_string, StringMatchFlag_CaseInsensitive)) + { + props.flags |= FilePropertyFlag_IsFolder; + break; + } + } + scratch_end(scratch); + } + FindClose(handle); + scratch_end(scratch); + return props; +} + +//- rjf: file maps + +internal FileMap +file_map_open(AccessFlags flags, File file) +{ + FileMap map = {0}; + { + HANDLE file_handle = (HANDLE)file.u64[0]; + DWORD protect_flags = 0; + { + switch(flags) + { + default:{}break; + case AccessFlag_Read: + {protect_flags = PAGE_READONLY;}break; + case AccessFlag_Write: + case AccessFlag_Read|AccessFlag_Write: + {protect_flags = PAGE_READWRITE;}break; + case AccessFlag_Execute: + case AccessFlag_Read|AccessFlag_Execute: + {protect_flags = PAGE_EXECUTE_READ;}break; + case AccessFlag_Execute|AccessFlag_Write|AccessFlag_Read: + case AccessFlag_Execute|AccessFlag_Write: + {protect_flags = PAGE_EXECUTE_READWRITE;}break; + } + } + HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0); + map.u64[0] = (U64)map_handle; + } + return map; +} + +internal void +file_map_close(FileMap map) +{ + HANDLE handle = (HANDLE)map.u64[0]; + BOOL result = CloseHandle(handle); + (void)result; +} + +internal void * +file_map_view_open(FileMap map, AccessFlags flags, Rng1U64 range) +{ + HANDLE handle = (HANDLE)map.u64[0]; + U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0); + U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32); + U64 size = dim_1u64(range); + DWORD access_flags = 0; + { + switch(flags) + { + default:{}break; + case AccessFlag_Read: + { + access_flags = FILE_MAP_READ; + }break; + case AccessFlag_Write: + { + access_flags = FILE_MAP_WRITE; + }break; + case AccessFlag_Read|AccessFlag_Write: + { + access_flags = FILE_MAP_ALL_ACCESS; + }break; + case AccessFlag_Execute: + case AccessFlag_Read|AccessFlag_Execute: + case AccessFlag_Write|AccessFlag_Execute: + case AccessFlag_Read|AccessFlag_Write|AccessFlag_Execute: + { + access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE; + }break; + } + } + void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size); + return result; +} + +internal void +file_map_view_close(FileMap map, void *ptr, Rng1U64 range) +{ + BOOL result = UnmapViewOfFile(ptr); + (void)result; +} + +//- rjf: directory iteration + +internal FileIter * +file_iter_begin(Arena *arena, String8 path, FileIterFlags flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit("\\*")); + String16 path16 = str16_from_8(scratch.arena, path_with_wildcard); + FileIter *iter = push_array(arena, FileIter, 1); + iter->flags = flags; + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + if(path.size == 0) + { + w32_iter->is_volume_iter = 1; + WCHAR buffer[512] = {0}; + DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); + String8List drive_strings = {0}; + for(U64 off = 0; off < (U64)length;) + { + String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); + off += next_drive_string_16.size+1; + String8 next_drive_string = str8_from_16(arena, next_drive_string_16); + next_drive_string = str8_chop_last_slash(next_drive_string); + str8_list_push(scratch.arena, &drive_strings, next_drive_string); + } + w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings); + w32_iter->drive_strings_iter_idx = 0; + } + else + { + w32_iter->handle = FindFirstFileExW((WCHAR*)path16.str, FindExInfoBasic, &w32_iter->find_data, FindExSearchNameMatch, 0, FIND_FIRST_EX_LARGE_FETCH); + } + scratch_end(scratch); + return iter; +} + +internal B32 +file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out) +{ + B32 result = 0; + FileIterFlags flags = iter->flags; + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + switch(w32_iter->is_volume_iter) + { + //- rjf: file iteration + default: + case 0: + { + if (!(flags & FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE) + { + do + { + // check is usable + B32 usable_file = 1; + + WCHAR *file_name = w32_iter->find_data.cFileName; + DWORD attributes = w32_iter->find_data.dwFileAttributes; + if (file_name[0] == '.'){ + if (flags & FileIterFlag_SkipHiddenFiles){ + usable_file = 0; + } + else if (file_name[1] == 0){ + usable_file = 0; + } + else if (file_name[1] == '.' && file_name[2] == 0){ + usable_file = 0; + } + } + if (attributes & FILE_ATTRIBUTE_DIRECTORY){ + if (flags & FileIterFlag_SkipFolders){ + usable_file = 0; + } + } + else{ + if (flags & FileIterFlag_SkipFiles){ + usable_file = 0; + } + } + + // emit if usable + if (usable_file){ + info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name)); + info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32); + os_w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); + os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); + info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes); + result = 1; + if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){ + iter->flags |= FileIterFlag_Done; + } + break; + } + }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data)); + } + }break; + + //- rjf: volume iteration + case 1: + { + result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count; + if(result != 0) + { + MemoryZeroStruct(info_out); + info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx]; + info_out->props.flags |= FilePropertyFlag_IsFolder; + w32_iter->drive_strings_iter_idx += 1; + } + }break; + } + if(!result) + { + iter->flags |= FileIterFlag_Done; + } + return result; +} + +internal void +file_iter_end(FileIter *iter) +{ + OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + HANDLE zero_handle; + MemoryZeroStruct(&zero_handle); + if(!MemoryMatchStruct(&zero_handle, &w32_iter->handle)) + { + FindClose(w32_iter->handle); + } +} + +//- rjf: directory creation + +internal B32 +make_directory(String8 path) +{ + B32 result = 0; + Temp scratch = scratch_begin(0, 0); + String16 name16 = str16_from_8(scratch.arena, path); + WIN32_FILE_ATTRIBUTE_DATA attributes = {0}; + GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes); + if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + result = 1; + } + else if(CreateDirectoryW((WCHAR*)name16.str, 0)) + { + result = 1; + } + scratch_end(scratch); + return(result); +} + +//////////////////////////////// +//~ rjf: @per_os_impl Aborting + +internal void +abort_self(S32 exit_code) +{ + ExitProcess(exit_code); +} + +//////////////////////////////// +//~ rjf: @per_os_impl Process Info + +internal ProcessInfo * +get_process_info(void) +{ + return &os_w32_state.process_info; +} + +internal String8 +get_current_path(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + DWORD length = GetCurrentDirectoryW(0, 0); + U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1); + length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory); + String8 name = str8_from_16(arena, str16(memory, length)); + scratch_end(scratch); + return name; +} + +internal U32 +get_process_start_time_unix(void) +{ + U32 result = 0; + HANDLE handle = GetCurrentProcess(); + FILETIME start_time = {0}; + FILETIME exit_time; + FILETIME kernel_time; + FILETIME user_time; + if(GetProcessTimes(handle, &start_time, &exit_time, &kernel_time, &user_time)) + { + result = os_w32_unix_time_from_file_time(start_time); + } + return result; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Child Processes + +internal Process +process_launch(ProcessLaunchParams *params) +{ + Process result = {0}; + Temp scratch = scratch_begin(0, 0); + + //- rjf: form full command string + String8 cmd = {0}; + { + StringJoin join_params = {0}; + join_params.pre = str8_lit("\""); + join_params.sep = str8_lit("\" \""); + join_params.post = str8_lit("\""); + cmd = str8_list_join(scratch.arena, ¶ms->cmd_line, &join_params); + } + + //- rjf: form environment + B32 use_null_env_arg = 0; + String8 env = {0}; + { + StringJoin join_params2 = {0}; + join_params2.sep = str8_lit("\0"); + join_params2.post = str8_lit("\0"); + String8List all_opts = params->env; + if(params->inherit_env != 0) + { + if(all_opts.node_count != 0) + { + MemoryZeroStruct(&all_opts); + for(String8Node *n = params->env.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + } + else + { + use_null_env_arg = 1; + } + } + if(use_null_env_arg == 0) + { + env = str8_list_join(scratch.arena, &all_opts, &join_params2); + } + } + + //- rjf: utf-8 -> utf-16 + String16 cmd16 = str16_from_8(scratch.arena, cmd); + String16 dir16 = str16_from_8(scratch.arena, params->path); + String16 env16 = {0}; + if(use_null_env_arg == 0) + { + env16 = str16_from_8(scratch.arena, env); + } + + //- rjf: determine creation flags + DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; + if(params->consoleless) + { + creation_flags |= CREATE_NO_WINDOW; + } + + //- rjf: launch + BOOL inherit_handles = 0; + STARTUPINFOW startup_info = {sizeof(startup_info)}; + if(!file_match(params->stdout_file, file_zero())) + { + HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; + startup_info.hStdOutput = stdout_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!file_match(params->stderr_file, file_zero())) + { + HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; + startup_info.hStdError = stderr_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!file_match(params->stdin_file, file_zero())) + { + HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; + startup_info.hStdInput = stdin_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + PROCESS_INFORMATION process_info = {0}; + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, inherit_handles, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + { + result.u64[0] = (U64)process_info.hProcess; + CloseHandle(process_info.hThread); + } + + scratch_end(scratch); + return result; +} + +internal B32 +process_join(Process process, U64 endt_us, U64 *exit_code_out) +{ + HANDLE process_handle = (HANDLE)(process.u64[0]); + DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + DWORD result = WaitForSingleObject(process_handle, sleep_ms); + B32 process_joined = (result == WAIT_OBJECT_0); + if(process_joined && exit_code_out) + { + DWORD exit_code = 0; + if(GetExitCodeProcess(process_handle, &exit_code)) + { + *exit_code_out = exit_code; + } + } + if(process_joined) + { + CloseHandle(process_handle); + } + return process_joined; +} + +internal void +process_detach(Process process) +{ + HANDLE process_handle = (HANDLE)(process.u64[0]); + CloseHandle(process_handle); +} + +internal B32 +process_kill(Process process) +{ + HANDLE process_handle = (HANDLE)process.u64[0]; + BOOL was_terminated = TerminateProcess(process_handle, 999); + return was_terminated; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Dynamically-Loaded Libraries + +internal Library +library_open(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String16 path16 = str16_from_8(scratch.arena, path); + HMODULE mod = LoadLibraryW((LPCWSTR)path16.str); + Library result = { (U64)mod }; + scratch_end(scratch); + return result; +} + +internal void +library_close(Library lib) +{ + HMODULE mod = (HMODULE)lib.u64[0]; + FreeLibrary(mod); +} + +internal VoidProc * +library_load_proc(Library lib, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + HMODULE mod = (HMODULE)lib.u64[0]; + name = push_str8_copy(scratch.arena, name); + VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str); + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Entry Point + +#include +#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside +#include + +internal B32 win32_g_is_quiet = 0; +internal B32 win32_g_gen_dump = 0; + +internal HRESULT WINAPI +win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data) +{ + if(msg == TDN_HYPERLINK_CLICKED) + { + ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL); + } + return S_OK; +} + +internal LONG WINAPI +win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) +{ + if(win32_g_is_quiet) + { + ExitProcess(1); + } + + static volatile LONG first = 0; + if(InterlockedCompareExchange(&first, 1, 0) != 0) + { + // prevent failures in other threads to popup same message box + // this handler just shows first thread that crashes + // we are terminating afterwards anyway + for (;;) Sleep(1000); + } + + WCHAR buffer[4096] = {0}; + int buflen = 0; + + DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode; + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code); + + // load dbghelp dynamically just in case if it is missing + BOOL (WINAPI *dbg_MiniDumpWriteDump)(HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam) = 0; + HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); + if(dbghelp) + { + DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions); + BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess); + BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, + LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, + PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); + PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase); + DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr); + BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol); + BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line); + BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo); + + *(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions"); + *(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW"); + *(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64"); + *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64"); + *(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64"); + *(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW"); + *(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64"); + *(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64"); + *(FARPROC*)&dbg_MiniDumpWriteDump = GetProcAddress(dbghelp, "MiniDumpWriteDump"); + + if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64) + { + HANDLE process = GetCurrentProcess(); + HANDLE thread = GetCurrentThread(); + CONTEXT context = *exception_ptrs->ContextRecord; + + WCHAR module_path[MAX_PATH]; + GetModuleFileNameW(NULL, module_path, ArrayCount(module_path)); + PathRemoveFileSpecW(module_path); + + dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); + if(dbg_SymInitializeW(process, module_path, TRUE)) + { + // check that raddbg.pdb file is good + B32 raddbg_pdb_valid = 0; + { + IMAGEHLP_MODULEW64 module = {0}; + module.SizeOfStruct = sizeof(module); + if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module)) + { + raddbg_pdb_valid = (module.SymType == SymPdb); + } + } + + if(!raddbg_pdb_valid) + { + buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, + L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\n"); + } + else + { + STACKFRAME64 frame = {0}; + DWORD image_type; +#if defined(_M_AMD64) + image_type = IMAGE_FILE_MACHINE_AMD64; + frame.AddrPC.Offset = context.Rip; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context.Rbp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context.Rsp; + frame.AddrStack.Mode = AddrModeFlat; +#elif defined(_M_ARM64) + image_type = IMAGE_FILE_MACHINE_ARM64; + frame.AddrPC.Offset = context.Pc; + frame.AddrPC.Mode = AddrModeFlat; + frame.AddrFrame.Offset = context.Fp; + frame.AddrFrame.Mode = AddrModeFlat; + frame.AddrStack.Offset = context.Sp; + frame.AddrStack.Mode = AddrModeFlat; +#else +# error Arch not supported! +#endif + +#if BUILD_CONSOLE_INTERFACE + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); +#else + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, + L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" + L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); +#endif + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); + + U64 frame_offset = 0; + + if (frame.AddrPC.Offset == 0) + { + // if IP address is 0 then most likely we have called indirectly on NULL function pointer + // which means no useful stack unwinding will happen, because there's no unwind info for address 0 + // but we can try reading 8 bytes of return address from stack, and start unwinding there + + ULONG_PTR hi, lo; + GetCurrentThreadStackLimits(&lo, &hi); + if (frame.AddrStack.Offset >= lo && frame.AddrStack.Offset <= hi - sizeof(void*)) + { + frame.AddrPC.Offset = *(DWORD64*)frame.AddrStack.Offset - 1; + frame.AddrStack.Offset += sizeof(void*); +#if defined(_M_AMD64) + context.Rip = frame.AddrPC.Offset; + context.Rsp = frame.AddrStack.Offset; +#elif defined(_M_ARM64) + context.Pc = frame.AddrPC.Offset; + context.Sp = frame.AddrStack.Offset; +#endif + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"1. [NULL]\n"); + frame_offset = 1; + } + + for(U32 idx=0; ;idx++) + { + const U32 max_frames = 32; + if(idx == max_frames) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"..."); + break; + } + + if(!dbg_StackWalk64(image_type, process, thread, &frame, &context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) + { + break; + } + + U64 address = frame.AddrPC.Offset; + if(address == 0) + { + break; + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", frame_offset + idx + 1, address); + + struct { + SYMBOL_INFOW info; + WCHAR name[MAX_SYM_NAME]; + } symbol = {0}; + + symbol.info.SizeOfStruct = sizeof(symbol.info); + symbol.info.MaxNameLen = MAX_SYM_NAME; + + DWORD64 displacement = 0; + if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement); + + IMAGEHLP_LINEW64 line = {0}; + line.SizeOfStruct = sizeof(line); + + DWORD line_displacement = 0; + if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber); + } + } + else + { + IMAGEHLP_MODULEW64 module = {0}; + module.SizeOfStruct = sizeof(module); + if(dbg_SymGetModuleInfoW64(process, address, &module)) + { + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s", module.ModuleName); + } + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\n"); + } + } + } + } + } + + buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); + + B32 generate_crash_dump = win32_g_gen_dump; +#if BUILD_CONSOLE_INTERFACE + fwprintf(stderr, L"\n--- Fatal Exception ---\n"); + fwprintf(stderr, L"%s\n\n", buffer); +#else + int selected_button = 0; + TASKDIALOG_BUTTON generate_dump = {1, L"Generate Crash Dump File"}; + TASKDIALOGCONFIG dialog = {0}; + dialog.cbSize = sizeof(dialog); + dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; + dialog.pszMainIcon = TD_ERROR_ICON; + dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON; + dialog.pszWindowTitle = L"Fatal Exception"; + dialog.pszContent = buffer; + dialog.pfCallback = &win32_dialog_callback; + dialog.cButtons = 1; + dialog.pButtons = &generate_dump; + TaskDialogIndirect(&dialog, &selected_button, 0, 0); + generate_crash_dump = (selected_button == generate_dump.nButtonID); +#endif + + if(dbg_MiniDumpWriteDump && generate_crash_dump) + { + WCHAR dump_file_path[MAX_PATH] = {0}; + SHGetFolderPathW(0, CSIDL_DESKTOP, 0, 0, dump_file_path); + PathAppendW(dump_file_path, L"raddbg_crash_dump.dmp"); + HANDLE file = CreateFileW(dump_file_path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + if (file != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info = {0}; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception_ptrs; + info.ClientPointers = FALSE; + BOOL dump_successful = dbg_MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, MiniDumpNormal, &info, 0, 0); + CloseHandle(file); + + if (dump_successful) + { +#if !BUILD_CONSOLE_INTERFACE + // opens explorer and selects file + SFGAOF flags = 0; + PIDLIST_ABSOLUTE list = 0; + if (SUCCEEDED(SHParseDisplayName(dump_file_path, NULL, &list, 0, &flags))) + { + SHOpenFolderAndSelectItems(list, 0, NULL, 0); + CoTaskMemFree(list); + } +#endif + } + } + } + + ExitProcess(1); +} + +#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside +#define OS_WINDOWS 1 + +internal void +w32_entry_point_caller(int argc, WCHAR **wargv) +{ + SetUnhandledExceptionFilter(&win32_exception_filter); + + //- rjf: dynamically load windows functions which are not guaranteed + // in all SDKs + { + HMODULE module = LoadLibraryA("kernel32.dll"); + w32_SetThreadDescription_func = (W32_SetThreadDescription_Type *)GetProcAddress(module, "SetThreadDescription"); + FreeLibrary(module); + } + + //- rjf: try to allow large pages if we can + B32 large_pages_allowed = 0; + { + HANDLE token; + if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) + { + LUID luid; + if(LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid)) + { + TOKEN_PRIVILEGES priv; + priv.PrivilegeCount = 1; + priv.Privileges[0].Luid = luid; + priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + large_pages_allowed = !!AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0); + } + CloseHandle(token); + } + } + + //- rjf: get RIO extension function table + { + // NOTE(mmozeiko): need to get function pointers to RIO functions, and that requires dummy socket + WSADATA WinSockData; + WSAStartup(MAKEWORD(2, 2), &WinSockData); + GUID guid = WSAID_MULTIPLE_RIO; + DWORD rio_byte = 0; + SOCKET Sock = socket(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP); + WSAIoctl(Sock, SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), (void**)&w32_rio_functions, sizeof(w32_rio_functions), &rio_byte, 0, 0); + closesocket(Sock); + } + + //- rjf: get system info + SYSTEM_INFO sysinfo = {0}; + GetSystemInfo(&sysinfo); + + //- rjf: set up non-dynamically-alloc'd state + // + // (we need to set up some basics before this layer can supply + // memory allocation primitives) + { + os_w32_state.microsecond_resolution = 1; + LARGE_INTEGER large_int_resolution; + if(QueryPerformanceFrequency(&large_int_resolution)) + { + os_w32_state.microsecond_resolution = large_int_resolution.QuadPart; + } + } + { + SystemInfo *info = &os_w32_state.system_info; + info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors; + info->page_size = sysinfo.dwPageSize; + info->large_page_size = GetLargePageMinimum(); + info->allocation_granularity = sysinfo.dwAllocationGranularity; + } + { + ProcessInfo *info = &os_w32_state.process_info; + info->large_pages_allowed = large_pages_allowed; + info->pid = GetCurrentProcessId(); + } + + //- rjf: extract arguments + Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32)); + char **argv = push_array(args_arena, char *, argc); + for(int i = 0; i < argc; i += 1) + { + String16 arg16 = str16_cstring((U16 *)wargv[i]); + String8 arg8 = str8_from_16(args_arena, arg16); + if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive) || + str8_match(arg8, str8_lit("-quiet"), StringMatchFlag_CaseInsensitive)) + { + win32_g_is_quiet = 1; + } + if(str8_match(arg8, str8_lit("--large_pages"), StringMatchFlag_CaseInsensitive) || + str8_match(arg8, str8_lit("-large_pages"), StringMatchFlag_CaseInsensitive)) + { + arena_default_flags = ArenaFlag_LargePages; + arena_default_reserve_size = Max(MB(64), os_w32_state.system_info.large_page_size); + arena_default_commit_size = arena_default_reserve_size; + } + if(str8_match(arg8, str8_lit("--gen_crash_dump"), StringMatchFlag_CaseInsensitive) || + str8_match(arg8, str8_lit("-gen_crash_dump"), StringMatchFlag_CaseInsensitive)) + { + win32_g_gen_dump = 1; + } + argv[i] = (char *)arg8.str; + } + + //- rjf: set up thread context + TCTX *tctx = tctx_alloc(); + tctx_select(tctx); + + //- rjf: set up dynamically-alloc'd state + Arena *arena = arena_alloc(); + { + os_w32_state.arena = arena; + { + SystemInfo *info = &os_w32_state.system_info; + U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0}; + DWORD size = MAX_COMPUTERNAME_LENGTH + 1; + if(GetComputerNameA((char*)buffer, &size)) + { + info->machine_name = push_str8_copy(arena, str8(buffer, size)); + } + } + } + { + ProcessInfo *info = &os_w32_state.process_info; + { + Temp scratch = scratch_begin(0, 0); + DWORD size = KB(32); + U16 *buffer = push_array_no_zero(scratch.arena, U16, size); + DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size); + String8 name8 = str8_from_16(scratch.arena, str16(buffer, length)); + String8 name_chopped = str8_chop_last_slash(name8); + info->binary_path = push_str8_copy(arena, name_chopped); + scratch_end(scratch); + } + info->initial_path = get_current_path(arena); + { + Temp scratch = scratch_begin(0, 0); + U64 size = KB(32); + U16 *buffer = push_array_no_zero(scratch.arena, U16, size); + if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer))) + { + info->user_program_data_path = str8_from_16(arena, str16_cstring(buffer)); + } + scratch_end(scratch); + } + { + WCHAR *this_proc_env = GetEnvironmentStringsW(); + U64 start_idx = 0; + for(U64 idx = 0;; idx += 1) + { + if(this_proc_env[idx] == 0) + { + if(start_idx == idx) + { + break; + } + else + { + String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); + String8 string = str8_from_16(arena, string16); + str8_list_push(arena, &info->environment, string); + start_idx = idx+1; + } + } + } + } + } + + //- rjf: set up entity storage + InitializeCriticalSection(&os_w32_state.entity_mutex); + os_w32_state.entity_arena = arena_alloc(); + + //- rjf: call into "real" entry point + main_thread_base_entry_point(argc, argv); +} + +#if BUILD_CONSOLE_INTERFACE +int wmain(int argc, WCHAR **argv) +{ + w32_entry_point_caller(argc, argv); + return 0; +} +#else +int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) +{ + CoInitializeEx(0, COINIT_APARTMENTTHREADED); + w32_entry_point_caller(__argc, __wargv); + return 0; +} +#endif diff --git a/src/os/core/win32/os_core_win32.h b/src/win32/base/win32_base.h similarity index 89% rename from src/os/core/win32/os_core_win32.h rename to src/win32/base/win32_base.h index a15a223c..f03113ee 100644 --- a/src/os/core/win32/os_core_win32.h +++ b/src/win32/base/win32_base.h @@ -1,126 +1,126 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_CORE_WIN32_H -#define OS_CORE_WIN32_H - -//////////////////////////////// -//~ rjf: Includes / Libraries - -#include -#include -#include -#include -#include -#include -#include -#include -#pragma comment(lib, "user32") -#pragma comment(lib, "ole32") -#pragma comment(lib, "shell32") -#pragma comment(lib, "advapi32") -#pragma comment(lib, "rpcrt4") -#pragma comment(lib, "shlwapi") -#pragma comment(lib, "comctl32") -#pragma comment(lib, "ws2_32") -#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // this is required for loading correct comctl32 dll file - -//////////////////////////////// -//~ rjf: File Iterator Types - -typedef struct OS_W32_FileIter OS_W32_FileIter; -struct OS_W32_FileIter -{ - HANDLE handle; - WIN32_FIND_DATAW find_data; - B32 is_volume_iter; - String8Array drive_strings; - U64 drive_strings_iter_idx; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size); - -//////////////////////////////// -//~ rjf: Entity Types - -typedef enum OS_W32_EntityKind -{ - OS_W32_EntityKind_Null, - OS_W32_EntityKind_Thread, - OS_W32_EntityKind_Mutex, - OS_W32_EntityKind_RWMutex, - OS_W32_EntityKind_ConditionVariable, - OS_W32_EntityKind_Barrier, -} -OS_W32_EntityKind; - -typedef struct OS_W32_Entity OS_W32_Entity; -struct OS_W32_Entity -{ - OS_W32_Entity *next; - OS_W32_EntityKind kind; - union - { - struct - { - ThreadEntryPointFunctionType *func; - void *ptr; - HANDLE handle; - DWORD tid; - } thread; - CRITICAL_SECTION mutex; - SRWLOCK rw_mutex; - CONDITION_VARIABLE cv; - SYNCHRONIZATION_BARRIER sb; - }; -}; - -//////////////////////////////// -//~ rjf: State - -typedef struct OS_W32_State OS_W32_State; -struct OS_W32_State -{ - Arena *arena; - - // rjf: info - OS_SystemInfo system_info; - OS_ProcessInfo process_info; - U64 microsecond_resolution; - - // rjf: entity storage - CRITICAL_SECTION entity_mutex; - Arena *entity_arena; - OS_W32_Entity *entity_free; -}; - -//////////////////////////////// -//~ rjf: Globals - -global OS_W32_State os_w32_state = {0}; - -//////////////////////////////// -//~ rjf: File Info Conversion Helpers - -internal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); -internal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); - -//////////////////////////////// -//~ rjf: Time Conversion Helpers - -internal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); -internal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); -internal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); -internal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us); - -//////////////////////////////// -//~ rjf: Entity Functions - -internal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind); -internal void os_w32_entity_release(OS_W32_Entity *entity); - -//////////////////////////////// -//~ rjf: Thread Entry Point - -internal DWORD os_w32_thread_entry_point(void *ptr); - -#endif // OS_CORE_WIN32_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef WIN32_BASE_H +#define WIN32_BASE_H + +//////////////////////////////// +//~ rjf: Includes / Libraries + +#include +#include +#include +#include +#include +#include +#include +#include +#pragma comment(lib, "user32") +#pragma comment(lib, "ole32") +#pragma comment(lib, "shell32") +#pragma comment(lib, "advapi32") +#pragma comment(lib, "rpcrt4") +#pragma comment(lib, "shlwapi") +#pragma comment(lib, "comctl32") +#pragma comment(lib, "ws2_32") +#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // this is required for loading correct comctl32 dll file + +//////////////////////////////// +//~ rjf: File Iterator Types + +typedef struct OS_W32_FileIter OS_W32_FileIter; +struct OS_W32_FileIter +{ + HANDLE handle; + WIN32_FIND_DATAW find_data; + B32 is_volume_iter; + String8Array drive_strings; + U64 drive_strings_iter_idx; +}; +StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size); + +//////////////////////////////// +//~ rjf: Entity Types + +typedef enum OS_W32_EntityKind +{ + OS_W32_EntityKind_Null, + OS_W32_EntityKind_Thread, + OS_W32_EntityKind_Mutex, + OS_W32_EntityKind_RWMutex, + OS_W32_EntityKind_ConditionVariable, + OS_W32_EntityKind_Barrier, +} +OS_W32_EntityKind; + +typedef struct OS_W32_Entity OS_W32_Entity; +struct OS_W32_Entity +{ + OS_W32_Entity *next; + OS_W32_EntityKind kind; + union + { + struct + { + ThreadEntryPointFunctionType *func; + void *ptr; + HANDLE handle; + DWORD tid; + } thread; + CRITICAL_SECTION mutex; + SRWLOCK rw_mutex; + CONDITION_VARIABLE cv; + SYNCHRONIZATION_BARRIER sb; + }; +}; + +//////////////////////////////// +//~ rjf: State + +typedef struct OS_W32_State OS_W32_State; +struct OS_W32_State +{ + Arena *arena; + + // rjf: info + SystemInfo system_info; + ProcessInfo process_info; + U64 microsecond_resolution; + + // rjf: entity storage + CRITICAL_SECTION entity_mutex; + Arena *entity_arena; + OS_W32_Entity *entity_free; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_W32_State os_w32_state = {0}; + +//////////////////////////////// +//~ rjf: File Info Conversion Helpers + +internal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); +internal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); + +//////////////////////////////// +//~ rjf: Time Conversion Helpers + +internal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); +internal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); +internal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); +internal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us); + +//////////////////////////////// +//~ rjf: Entity Functions + +internal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind); +internal void os_w32_entity_release(OS_W32_Entity *entity); + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal DWORD os_w32_thread_entry_point(void *ptr); + +#endif // WIN32_BASE_H diff --git a/src/x64/generated/x64.meta.c b/src/x64/generated/x64.meta.c new file mode 100644 index 00000000..bcfabd59 --- /dev/null +++ b/src/x64/generated/x64.meta.c @@ -0,0 +1,780 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +B8 x64_reg_code_is_vector_table[189] = +{ +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +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, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +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, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +}; + +String8 x64_reg_code_name_table[189] = +{ +str8_lit_comp("nil"), +str8_lit_comp("rax"), +str8_lit_comp("rcx"), +str8_lit_comp("rdx"), +str8_lit_comp("rbx"), +str8_lit_comp("rsp"), +str8_lit_comp("rbp"), +str8_lit_comp("rsi"), +str8_lit_comp("rdi"), +str8_lit_comp("r8"), +str8_lit_comp("r9"), +str8_lit_comp("r10"), +str8_lit_comp("r11"), +str8_lit_comp("r12"), +str8_lit_comp("r13"), +str8_lit_comp("r14"), +str8_lit_comp("r15"), +str8_lit_comp("fsbase"), +str8_lit_comp("gsbase"), +str8_lit_comp("rip"), +str8_lit_comp("rflags"), +str8_lit_comp("dr0"), +str8_lit_comp("dr1"), +str8_lit_comp("dr2"), +str8_lit_comp("dr3"), +str8_lit_comp("dr4"), +str8_lit_comp("dr5"), +str8_lit_comp("dr6"), +str8_lit_comp("dr7"), +str8_lit_comp("st0"), +str8_lit_comp("st1"), +str8_lit_comp("st2"), +str8_lit_comp("st3"), +str8_lit_comp("st4"), +str8_lit_comp("st5"), +str8_lit_comp("st6"), +str8_lit_comp("st7"), +str8_lit_comp("fcw"), +str8_lit_comp("fsw"), +str8_lit_comp("ftw"), +str8_lit_comp("fop"), +str8_lit_comp("fcs"), +str8_lit_comp("fds"), +str8_lit_comp("fip"), +str8_lit_comp("fdp"), +str8_lit_comp("mxcsr"), +str8_lit_comp("mxcsr_mask"), +str8_lit_comp("ss"), +str8_lit_comp("cs"), +str8_lit_comp("ds"), +str8_lit_comp("es"), +str8_lit_comp("fs"), +str8_lit_comp("gs"), +str8_lit_comp("zmm0"), +str8_lit_comp("zmm1"), +str8_lit_comp("zmm2"), +str8_lit_comp("zmm3"), +str8_lit_comp("zmm4"), +str8_lit_comp("zmm5"), +str8_lit_comp("zmm6"), +str8_lit_comp("zmm7"), +str8_lit_comp("zmm8"), +str8_lit_comp("zmm9"), +str8_lit_comp("zmm10"), +str8_lit_comp("zmm11"), +str8_lit_comp("zmm12"), +str8_lit_comp("zmm13"), +str8_lit_comp("zmm14"), +str8_lit_comp("zmm15"), +str8_lit_comp("zmm16"), +str8_lit_comp("zmm17"), +str8_lit_comp("zmm18"), +str8_lit_comp("zmm19"), +str8_lit_comp("zmm20"), +str8_lit_comp("zmm21"), +str8_lit_comp("zmm22"), +str8_lit_comp("zmm23"), +str8_lit_comp("zmm24"), +str8_lit_comp("zmm25"), +str8_lit_comp("zmm26"), +str8_lit_comp("zmm27"), +str8_lit_comp("zmm28"), +str8_lit_comp("zmm29"), +str8_lit_comp("zmm30"), +str8_lit_comp("zmm31"), +str8_lit_comp("k0"), +str8_lit_comp("k1"), +str8_lit_comp("k2"), +str8_lit_comp("k3"), +str8_lit_comp("k4"), +str8_lit_comp("k5"), +str8_lit_comp("k6"), +str8_lit_comp("k7"), +str8_lit_comp("cetmsr"), +str8_lit_comp("cetssp"), +str8_lit_comp("eax"), +str8_lit_comp("ecx"), +str8_lit_comp("edx"), +str8_lit_comp("ebx"), +str8_lit_comp("esp"), +str8_lit_comp("ebp"), +str8_lit_comp("esi"), +str8_lit_comp("edi"), +str8_lit_comp("r8d"), +str8_lit_comp("r9d"), +str8_lit_comp("r10d"), +str8_lit_comp("r11d"), +str8_lit_comp("r12d"), +str8_lit_comp("r13d"), +str8_lit_comp("r14d"), +str8_lit_comp("r15d"), +str8_lit_comp("eflags"), +str8_lit_comp("ax"), +str8_lit_comp("cx"), +str8_lit_comp("dx"), +str8_lit_comp("bx"), +str8_lit_comp("si"), +str8_lit_comp("di"), +str8_lit_comp("sp"), +str8_lit_comp("bp"), +str8_lit_comp("ip"), +str8_lit_comp("r8w"), +str8_lit_comp("r9w"), +str8_lit_comp("r10w"), +str8_lit_comp("r11w"), +str8_lit_comp("r12w"), +str8_lit_comp("r13w"), +str8_lit_comp("r14w"), +str8_lit_comp("r15w"), +str8_lit_comp("al"), +str8_lit_comp("cl"), +str8_lit_comp("dl"), +str8_lit_comp("bl"), +str8_lit_comp("sil"), +str8_lit_comp("dil"), +str8_lit_comp("bpl"), +str8_lit_comp("spl"), +str8_lit_comp("r8b"), +str8_lit_comp("r9b"), +str8_lit_comp("r10b"), +str8_lit_comp("r11b"), +str8_lit_comp("r12b"), +str8_lit_comp("r13b"), +str8_lit_comp("r14b"), +str8_lit_comp("r15b"), +str8_lit_comp("ah"), +str8_lit_comp("ch"), +str8_lit_comp("dh"), +str8_lit_comp("bh"), +str8_lit_comp("xmm0"), +str8_lit_comp("xmm1"), +str8_lit_comp("xmm2"), +str8_lit_comp("xmm3"), +str8_lit_comp("xmm4"), +str8_lit_comp("xmm5"), +str8_lit_comp("xmm6"), +str8_lit_comp("xmm7"), +str8_lit_comp("xmm8"), +str8_lit_comp("xmm9"), +str8_lit_comp("xmm10"), +str8_lit_comp("xmm11"), +str8_lit_comp("xmm12"), +str8_lit_comp("xmm13"), +str8_lit_comp("xmm14"), +str8_lit_comp("xmm15"), +str8_lit_comp("ymm0"), +str8_lit_comp("ymm1"), +str8_lit_comp("ymm2"), +str8_lit_comp("ymm3"), +str8_lit_comp("ymm4"), +str8_lit_comp("ymm5"), +str8_lit_comp("ymm6"), +str8_lit_comp("ymm7"), +str8_lit_comp("ymm8"), +str8_lit_comp("ymm9"), +str8_lit_comp("ymm10"), +str8_lit_comp("ymm11"), +str8_lit_comp("ymm12"), +str8_lit_comp("ymm13"), +str8_lit_comp("ymm14"), +str8_lit_comp("ymm15"), +str8_lit_comp("mm0"), +str8_lit_comp("mm1"), +str8_lit_comp("mm2"), +str8_lit_comp("mm3"), +str8_lit_comp("mm4"), +str8_lit_comp("mm5"), +str8_lit_comp("mm6"), +str8_lit_comp("mm7"), +}; + +U8 x64_reg_code_base_table[189] = +{ +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +X64_RegCode_rax, +X64_RegCode_rcx, +X64_RegCode_rdx, +X64_RegCode_rbx, +X64_RegCode_rsp, +X64_RegCode_rbp, +X64_RegCode_rsi, +X64_RegCode_rdi, +X64_RegCode_r8, +X64_RegCode_r9, +X64_RegCode_r10, +X64_RegCode_r11, +X64_RegCode_r12, +X64_RegCode_r13, +X64_RegCode_r14, +X64_RegCode_r15, +X64_RegCode_rflags, +X64_RegCode_rax, +X64_RegCode_rcx, +X64_RegCode_rdx, +X64_RegCode_rbx, +X64_RegCode_rsi, +X64_RegCode_rdi, +X64_RegCode_rsp, +X64_RegCode_rbp, +X64_RegCode_rip, +X64_RegCode_r8, +X64_RegCode_r9, +X64_RegCode_r10, +X64_RegCode_r11, +X64_RegCode_r12, +X64_RegCode_r13, +X64_RegCode_r14, +X64_RegCode_r15, +X64_RegCode_rax, +X64_RegCode_rcx, +X64_RegCode_rdx, +X64_RegCode_rbx, +X64_RegCode_rsi, +X64_RegCode_rdi, +X64_RegCode_rbp, +X64_RegCode_rsp, +X64_RegCode_r8, +X64_RegCode_r9, +X64_RegCode_r10, +X64_RegCode_r11, +X64_RegCode_r12, +X64_RegCode_r13, +X64_RegCode_r14, +X64_RegCode_r15, +X64_RegCode_rax, +X64_RegCode_rcx, +X64_RegCode_rdx, +X64_RegCode_rbx, +X64_RegCode_zmm0, +X64_RegCode_zmm1, +X64_RegCode_zmm2, +X64_RegCode_zmm3, +X64_RegCode_zmm4, +X64_RegCode_zmm5, +X64_RegCode_zmm6, +X64_RegCode_zmm7, +X64_RegCode_zmm8, +X64_RegCode_zmm9, +X64_RegCode_zmm10, +X64_RegCode_zmm11, +X64_RegCode_zmm12, +X64_RegCode_zmm13, +X64_RegCode_zmm14, +X64_RegCode_zmm15, +X64_RegCode_zmm0, +X64_RegCode_zmm1, +X64_RegCode_zmm2, +X64_RegCode_zmm3, +X64_RegCode_zmm4, +X64_RegCode_zmm5, +X64_RegCode_zmm6, +X64_RegCode_zmm7, +X64_RegCode_zmm8, +X64_RegCode_zmm9, +X64_RegCode_zmm10, +X64_RegCode_zmm11, +X64_RegCode_zmm12, +X64_RegCode_zmm13, +X64_RegCode_zmm14, +X64_RegCode_zmm15, +X64_RegCode_st0, +X64_RegCode_st1, +X64_RegCode_st2, +X64_RegCode_st3, +X64_RegCode_st4, +X64_RegCode_st5, +X64_RegCode_st6, +X64_RegCode_st7, +}; + +Rng1U16 x64_reg_code_rng_table[189] = +{ +{0}, +{(U16)OffsetOf(X64_RegBlock, rax), (U16)OffsetOf(X64_RegBlock, rax) + 8}, +{(U16)OffsetOf(X64_RegBlock, rcx), (U16)OffsetOf(X64_RegBlock, rcx) + 8}, +{(U16)OffsetOf(X64_RegBlock, rdx), (U16)OffsetOf(X64_RegBlock, rdx) + 8}, +{(U16)OffsetOf(X64_RegBlock, rbx), (U16)OffsetOf(X64_RegBlock, rbx) + 8}, +{(U16)OffsetOf(X64_RegBlock, rsp), (U16)OffsetOf(X64_RegBlock, rsp) + 8}, +{(U16)OffsetOf(X64_RegBlock, rbp), (U16)OffsetOf(X64_RegBlock, rbp) + 8}, +{(U16)OffsetOf(X64_RegBlock, rsi), (U16)OffsetOf(X64_RegBlock, rsi) + 8}, +{(U16)OffsetOf(X64_RegBlock, rdi), (U16)OffsetOf(X64_RegBlock, rdi) + 8}, +{(U16)OffsetOf(X64_RegBlock, r8), (U16)OffsetOf(X64_RegBlock, r8) + 8}, +{(U16)OffsetOf(X64_RegBlock, r9), (U16)OffsetOf(X64_RegBlock, r9) + 8}, +{(U16)OffsetOf(X64_RegBlock, r10), (U16)OffsetOf(X64_RegBlock, r10) + 8}, +{(U16)OffsetOf(X64_RegBlock, r11), (U16)OffsetOf(X64_RegBlock, r11) + 8}, +{(U16)OffsetOf(X64_RegBlock, r12), (U16)OffsetOf(X64_RegBlock, r12) + 8}, +{(U16)OffsetOf(X64_RegBlock, r13), (U16)OffsetOf(X64_RegBlock, r13) + 8}, +{(U16)OffsetOf(X64_RegBlock, r14), (U16)OffsetOf(X64_RegBlock, r14) + 8}, +{(U16)OffsetOf(X64_RegBlock, r15), (U16)OffsetOf(X64_RegBlock, r15) + 8}, +{(U16)OffsetOf(X64_RegBlock, fsbase), (U16)OffsetOf(X64_RegBlock, fsbase) + 8}, +{(U16)OffsetOf(X64_RegBlock, gsbase), (U16)OffsetOf(X64_RegBlock, gsbase) + 8}, +{(U16)OffsetOf(X64_RegBlock, rip), (U16)OffsetOf(X64_RegBlock, rip) + 8}, +{(U16)OffsetOf(X64_RegBlock, rflags), (U16)OffsetOf(X64_RegBlock, rflags) + 8}, +{(U16)OffsetOf(X64_RegBlock, dr0), (U16)OffsetOf(X64_RegBlock, dr0) + 8}, +{(U16)OffsetOf(X64_RegBlock, dr1), (U16)OffsetOf(X64_RegBlock, dr1) + 8}, +{(U16)OffsetOf(X64_RegBlock, dr2), (U16)OffsetOf(X64_RegBlock, dr2) + 8}, +{(U16)OffsetOf(X64_RegBlock, dr3), (U16)OffsetOf(X64_RegBlock, dr3) + 8}, +{(U16)OffsetOf(X64_RegBlock, dr4), (U16)OffsetOf(X64_RegBlock, dr4) + 8}, +{(U16)OffsetOf(X64_RegBlock, dr5), (U16)OffsetOf(X64_RegBlock, dr5) + 8}, +{(U16)OffsetOf(X64_RegBlock, dr6), (U16)OffsetOf(X64_RegBlock, dr6) + 8}, +{(U16)OffsetOf(X64_RegBlock, dr7), (U16)OffsetOf(X64_RegBlock, dr7) + 8}, +{(U16)OffsetOf(X64_RegBlock, st0), (U16)OffsetOf(X64_RegBlock, st0) + 10}, +{(U16)OffsetOf(X64_RegBlock, st1), (U16)OffsetOf(X64_RegBlock, st1) + 10}, +{(U16)OffsetOf(X64_RegBlock, st2), (U16)OffsetOf(X64_RegBlock, st2) + 10}, +{(U16)OffsetOf(X64_RegBlock, st3), (U16)OffsetOf(X64_RegBlock, st3) + 10}, +{(U16)OffsetOf(X64_RegBlock, st4), (U16)OffsetOf(X64_RegBlock, st4) + 10}, +{(U16)OffsetOf(X64_RegBlock, st5), (U16)OffsetOf(X64_RegBlock, st5) + 10}, +{(U16)OffsetOf(X64_RegBlock, st6), (U16)OffsetOf(X64_RegBlock, st6) + 10}, +{(U16)OffsetOf(X64_RegBlock, st7), (U16)OffsetOf(X64_RegBlock, st7) + 10}, +{(U16)OffsetOf(X64_RegBlock, fcw), (U16)OffsetOf(X64_RegBlock, fcw) + 2}, +{(U16)OffsetOf(X64_RegBlock, fsw), (U16)OffsetOf(X64_RegBlock, fsw) + 2}, +{(U16)OffsetOf(X64_RegBlock, ftw), (U16)OffsetOf(X64_RegBlock, ftw) + 1}, +{(U16)OffsetOf(X64_RegBlock, fop), (U16)OffsetOf(X64_RegBlock, fop) + 2}, +{(U16)OffsetOf(X64_RegBlock, fcs), (U16)OffsetOf(X64_RegBlock, fcs) + 2}, +{(U16)OffsetOf(X64_RegBlock, fds), (U16)OffsetOf(X64_RegBlock, fds) + 2}, +{(U16)OffsetOf(X64_RegBlock, fip), (U16)OffsetOf(X64_RegBlock, fip) + 8}, +{(U16)OffsetOf(X64_RegBlock, fdp), (U16)OffsetOf(X64_RegBlock, fdp) + 8}, +{(U16)OffsetOf(X64_RegBlock, mxcsr), (U16)OffsetOf(X64_RegBlock, mxcsr) + 4}, +{(U16)OffsetOf(X64_RegBlock, mxcsr_mask), (U16)OffsetOf(X64_RegBlock, mxcsr_mask) + 4}, +{(U16)OffsetOf(X64_RegBlock, ss), (U16)OffsetOf(X64_RegBlock, ss) + 2}, +{(U16)OffsetOf(X64_RegBlock, cs), (U16)OffsetOf(X64_RegBlock, cs) + 2}, +{(U16)OffsetOf(X64_RegBlock, ds), (U16)OffsetOf(X64_RegBlock, ds) + 2}, +{(U16)OffsetOf(X64_RegBlock, es), (U16)OffsetOf(X64_RegBlock, es) + 2}, +{(U16)OffsetOf(X64_RegBlock, fs), (U16)OffsetOf(X64_RegBlock, fs) + 2}, +{(U16)OffsetOf(X64_RegBlock, gs), (U16)OffsetOf(X64_RegBlock, gs) + 2}, +{(U16)OffsetOf(X64_RegBlock, zmm0), (U16)OffsetOf(X64_RegBlock, zmm0) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm1), (U16)OffsetOf(X64_RegBlock, zmm1) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm2), (U16)OffsetOf(X64_RegBlock, zmm2) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm3), (U16)OffsetOf(X64_RegBlock, zmm3) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm4), (U16)OffsetOf(X64_RegBlock, zmm4) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm5), (U16)OffsetOf(X64_RegBlock, zmm5) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm6), (U16)OffsetOf(X64_RegBlock, zmm6) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm7), (U16)OffsetOf(X64_RegBlock, zmm7) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm8), (U16)OffsetOf(X64_RegBlock, zmm8) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm9), (U16)OffsetOf(X64_RegBlock, zmm9) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm10), (U16)OffsetOf(X64_RegBlock, zmm10) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm11), (U16)OffsetOf(X64_RegBlock, zmm11) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm12), (U16)OffsetOf(X64_RegBlock, zmm12) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm13), (U16)OffsetOf(X64_RegBlock, zmm13) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm14), (U16)OffsetOf(X64_RegBlock, zmm14) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm15), (U16)OffsetOf(X64_RegBlock, zmm15) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm16), (U16)OffsetOf(X64_RegBlock, zmm16) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm17), (U16)OffsetOf(X64_RegBlock, zmm17) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm18), (U16)OffsetOf(X64_RegBlock, zmm18) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm19), (U16)OffsetOf(X64_RegBlock, zmm19) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm20), (U16)OffsetOf(X64_RegBlock, zmm20) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm21), (U16)OffsetOf(X64_RegBlock, zmm21) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm22), (U16)OffsetOf(X64_RegBlock, zmm22) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm23), (U16)OffsetOf(X64_RegBlock, zmm23) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm24), (U16)OffsetOf(X64_RegBlock, zmm24) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm25), (U16)OffsetOf(X64_RegBlock, zmm25) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm26), (U16)OffsetOf(X64_RegBlock, zmm26) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm27), (U16)OffsetOf(X64_RegBlock, zmm27) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm28), (U16)OffsetOf(X64_RegBlock, zmm28) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm29), (U16)OffsetOf(X64_RegBlock, zmm29) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm30), (U16)OffsetOf(X64_RegBlock, zmm30) + 64}, +{(U16)OffsetOf(X64_RegBlock, zmm31), (U16)OffsetOf(X64_RegBlock, zmm31) + 64}, +{(U16)OffsetOf(X64_RegBlock, k0), (U16)OffsetOf(X64_RegBlock, k0) + 8}, +{(U16)OffsetOf(X64_RegBlock, k1), (U16)OffsetOf(X64_RegBlock, k1) + 8}, +{(U16)OffsetOf(X64_RegBlock, k2), (U16)OffsetOf(X64_RegBlock, k2) + 8}, +{(U16)OffsetOf(X64_RegBlock, k3), (U16)OffsetOf(X64_RegBlock, k3) + 8}, +{(U16)OffsetOf(X64_RegBlock, k4), (U16)OffsetOf(X64_RegBlock, k4) + 8}, +{(U16)OffsetOf(X64_RegBlock, k5), (U16)OffsetOf(X64_RegBlock, k5) + 8}, +{(U16)OffsetOf(X64_RegBlock, k6), (U16)OffsetOf(X64_RegBlock, k6) + 8}, +{(U16)OffsetOf(X64_RegBlock, k7), (U16)OffsetOf(X64_RegBlock, k7) + 8}, +{(U16)OffsetOf(X64_RegBlock, cetmsr), (U16)OffsetOf(X64_RegBlock, cetmsr) + 8}, +{(U16)OffsetOf(X64_RegBlock, cetssp), (U16)OffsetOf(X64_RegBlock, cetssp) + 8}, +{(U16)OffsetOf(X64_RegBlock, rax) + 0, (U16)OffsetOf(X64_RegBlock, rax) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rcx) + 0, (U16)OffsetOf(X64_RegBlock, rcx) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rdx) + 0, (U16)OffsetOf(X64_RegBlock, rdx) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rbx) + 0, (U16)OffsetOf(X64_RegBlock, rbx) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rsp) + 0, (U16)OffsetOf(X64_RegBlock, rsp) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rbp) + 0, (U16)OffsetOf(X64_RegBlock, rbp) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rsi) + 0, (U16)OffsetOf(X64_RegBlock, rsi) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rdi) + 0, (U16)OffsetOf(X64_RegBlock, rdi) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, r8) + 0, (U16)OffsetOf(X64_RegBlock, r8) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, r9) + 0, (U16)OffsetOf(X64_RegBlock, r9) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, r10) + 0, (U16)OffsetOf(X64_RegBlock, r10) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, r11) + 0, (U16)OffsetOf(X64_RegBlock, r11) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, r12) + 0, (U16)OffsetOf(X64_RegBlock, r12) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, r13) + 0, (U16)OffsetOf(X64_RegBlock, r13) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, r14) + 0, (U16)OffsetOf(X64_RegBlock, r14) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, r15) + 0, (U16)OffsetOf(X64_RegBlock, r15) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rflags) + 0, (U16)OffsetOf(X64_RegBlock, rflags) + 0 + 4}, +{(U16)OffsetOf(X64_RegBlock, rax) + 0, (U16)OffsetOf(X64_RegBlock, rax) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rcx) + 0, (U16)OffsetOf(X64_RegBlock, rcx) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rdx) + 0, (U16)OffsetOf(X64_RegBlock, rdx) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rbx) + 0, (U16)OffsetOf(X64_RegBlock, rbx) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rsi) + 0, (U16)OffsetOf(X64_RegBlock, rsi) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rdi) + 0, (U16)OffsetOf(X64_RegBlock, rdi) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rsp) + 0, (U16)OffsetOf(X64_RegBlock, rsp) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rbp) + 0, (U16)OffsetOf(X64_RegBlock, rbp) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rip) + 0, (U16)OffsetOf(X64_RegBlock, rip) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, r8) + 0, (U16)OffsetOf(X64_RegBlock, r8) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, r9) + 0, (U16)OffsetOf(X64_RegBlock, r9) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, r10) + 0, (U16)OffsetOf(X64_RegBlock, r10) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, r11) + 0, (U16)OffsetOf(X64_RegBlock, r11) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, r12) + 0, (U16)OffsetOf(X64_RegBlock, r12) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, r13) + 0, (U16)OffsetOf(X64_RegBlock, r13) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, r14) + 0, (U16)OffsetOf(X64_RegBlock, r14) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, r15) + 0, (U16)OffsetOf(X64_RegBlock, r15) + 0 + 2}, +{(U16)OffsetOf(X64_RegBlock, rax) + 0, (U16)OffsetOf(X64_RegBlock, rax) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, rcx) + 0, (U16)OffsetOf(X64_RegBlock, rcx) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, rdx) + 0, (U16)OffsetOf(X64_RegBlock, rdx) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, rbx) + 0, (U16)OffsetOf(X64_RegBlock, rbx) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, rsi) + 0, (U16)OffsetOf(X64_RegBlock, rsi) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, rdi) + 0, (U16)OffsetOf(X64_RegBlock, rdi) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, rbp) + 0, (U16)OffsetOf(X64_RegBlock, rbp) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, rsp) + 0, (U16)OffsetOf(X64_RegBlock, rsp) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, r8) + 0, (U16)OffsetOf(X64_RegBlock, r8) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, r9) + 0, (U16)OffsetOf(X64_RegBlock, r9) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, r10) + 0, (U16)OffsetOf(X64_RegBlock, r10) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, r11) + 0, (U16)OffsetOf(X64_RegBlock, r11) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, r12) + 0, (U16)OffsetOf(X64_RegBlock, r12) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, r13) + 0, (U16)OffsetOf(X64_RegBlock, r13) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, r14) + 0, (U16)OffsetOf(X64_RegBlock, r14) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, r15) + 0, (U16)OffsetOf(X64_RegBlock, r15) + 0 + 1}, +{(U16)OffsetOf(X64_RegBlock, rax) + 1, (U16)OffsetOf(X64_RegBlock, rax) + 1 + 1}, +{(U16)OffsetOf(X64_RegBlock, rcx) + 1, (U16)OffsetOf(X64_RegBlock, rcx) + 1 + 1}, +{(U16)OffsetOf(X64_RegBlock, rdx) + 1, (U16)OffsetOf(X64_RegBlock, rdx) + 1 + 1}, +{(U16)OffsetOf(X64_RegBlock, rbx) + 1, (U16)OffsetOf(X64_RegBlock, rbx) + 1 + 1}, +{(U16)OffsetOf(X64_RegBlock, zmm0) + 0, (U16)OffsetOf(X64_RegBlock, zmm0) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm1) + 0, (U16)OffsetOf(X64_RegBlock, zmm1) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm2) + 0, (U16)OffsetOf(X64_RegBlock, zmm2) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm3) + 0, (U16)OffsetOf(X64_RegBlock, zmm3) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm4) + 0, (U16)OffsetOf(X64_RegBlock, zmm4) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm5) + 0, (U16)OffsetOf(X64_RegBlock, zmm5) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm6) + 0, (U16)OffsetOf(X64_RegBlock, zmm6) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm7) + 0, (U16)OffsetOf(X64_RegBlock, zmm7) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm8) + 0, (U16)OffsetOf(X64_RegBlock, zmm8) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm9) + 0, (U16)OffsetOf(X64_RegBlock, zmm9) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm10) + 0, (U16)OffsetOf(X64_RegBlock, zmm10) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm11) + 0, (U16)OffsetOf(X64_RegBlock, zmm11) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm12) + 0, (U16)OffsetOf(X64_RegBlock, zmm12) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm13) + 0, (U16)OffsetOf(X64_RegBlock, zmm13) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm14) + 0, (U16)OffsetOf(X64_RegBlock, zmm14) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm15) + 0, (U16)OffsetOf(X64_RegBlock, zmm15) + 0 + 16}, +{(U16)OffsetOf(X64_RegBlock, zmm0) + 0, (U16)OffsetOf(X64_RegBlock, zmm0) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm1) + 0, (U16)OffsetOf(X64_RegBlock, zmm1) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm2) + 0, (U16)OffsetOf(X64_RegBlock, zmm2) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm3) + 0, (U16)OffsetOf(X64_RegBlock, zmm3) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm4) + 0, (U16)OffsetOf(X64_RegBlock, zmm4) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm5) + 0, (U16)OffsetOf(X64_RegBlock, zmm5) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm6) + 0, (U16)OffsetOf(X64_RegBlock, zmm6) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm7) + 0, (U16)OffsetOf(X64_RegBlock, zmm7) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm8) + 0, (U16)OffsetOf(X64_RegBlock, zmm8) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm9) + 0, (U16)OffsetOf(X64_RegBlock, zmm9) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm10) + 0, (U16)OffsetOf(X64_RegBlock, zmm10) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm11) + 0, (U16)OffsetOf(X64_RegBlock, zmm11) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm12) + 0, (U16)OffsetOf(X64_RegBlock, zmm12) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm13) + 0, (U16)OffsetOf(X64_RegBlock, zmm13) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm14) + 0, (U16)OffsetOf(X64_RegBlock, zmm14) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, zmm15) + 0, (U16)OffsetOf(X64_RegBlock, zmm15) + 0 + 32}, +{(U16)OffsetOf(X64_RegBlock, st0) + 0, (U16)OffsetOf(X64_RegBlock, st0) + 0 + 8}, +{(U16)OffsetOf(X64_RegBlock, st1) + 0, (U16)OffsetOf(X64_RegBlock, st1) + 0 + 8}, +{(U16)OffsetOf(X64_RegBlock, st2) + 0, (U16)OffsetOf(X64_RegBlock, st2) + 0 + 8}, +{(U16)OffsetOf(X64_RegBlock, st3) + 0, (U16)OffsetOf(X64_RegBlock, st3) + 0 + 8}, +{(U16)OffsetOf(X64_RegBlock, st4) + 0, (U16)OffsetOf(X64_RegBlock, st4) + 0 + 8}, +{(U16)OffsetOf(X64_RegBlock, st5) + 0, (U16)OffsetOf(X64_RegBlock, st5) + 0 + 8}, +{(U16)OffsetOf(X64_RegBlock, st6) + 0, (U16)OffsetOf(X64_RegBlock, st6) + 0 + 8}, +{(U16)OffsetOf(X64_RegBlock, st7) + 0, (U16)OffsetOf(X64_RegBlock, st7) + 0 + 8}, +}; + +C_LINKAGE_END + diff --git a/src/x64/generated/x64.meta.h b/src/x64/generated/x64.meta.h new file mode 100644 index 00000000..f47e083c --- /dev/null +++ b/src/x64/generated/x64.meta.h @@ -0,0 +1,310 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef X64_META_H +#define X64_META_H + +typedef enum X64_RegCode +{ +X64_RegCode_nil, +X64_RegCode_rax, +X64_RegCode_rcx, +X64_RegCode_rdx, +X64_RegCode_rbx, +X64_RegCode_rsp, +X64_RegCode_rbp, +X64_RegCode_rsi, +X64_RegCode_rdi, +X64_RegCode_r8, +X64_RegCode_r9, +X64_RegCode_r10, +X64_RegCode_r11, +X64_RegCode_r12, +X64_RegCode_r13, +X64_RegCode_r14, +X64_RegCode_r15, +X64_RegCode_fsbase, +X64_RegCode_gsbase, +X64_RegCode_rip, +X64_RegCode_rflags, +X64_RegCode_dr0, +X64_RegCode_dr1, +X64_RegCode_dr2, +X64_RegCode_dr3, +X64_RegCode_dr4, +X64_RegCode_dr5, +X64_RegCode_dr6, +X64_RegCode_dr7, +X64_RegCode_st0, +X64_RegCode_st1, +X64_RegCode_st2, +X64_RegCode_st3, +X64_RegCode_st4, +X64_RegCode_st5, +X64_RegCode_st6, +X64_RegCode_st7, +X64_RegCode_fcw, +X64_RegCode_fsw, +X64_RegCode_ftw, +X64_RegCode_fop, +X64_RegCode_fcs, +X64_RegCode_fds, +X64_RegCode_fip, +X64_RegCode_fdp, +X64_RegCode_mxcsr, +X64_RegCode_mxcsr_mask, +X64_RegCode_ss, +X64_RegCode_cs, +X64_RegCode_ds, +X64_RegCode_es, +X64_RegCode_fs, +X64_RegCode_gs, +X64_RegCode_zmm0, +X64_RegCode_zmm1, +X64_RegCode_zmm2, +X64_RegCode_zmm3, +X64_RegCode_zmm4, +X64_RegCode_zmm5, +X64_RegCode_zmm6, +X64_RegCode_zmm7, +X64_RegCode_zmm8, +X64_RegCode_zmm9, +X64_RegCode_zmm10, +X64_RegCode_zmm11, +X64_RegCode_zmm12, +X64_RegCode_zmm13, +X64_RegCode_zmm14, +X64_RegCode_zmm15, +X64_RegCode_zmm16, +X64_RegCode_zmm17, +X64_RegCode_zmm18, +X64_RegCode_zmm19, +X64_RegCode_zmm20, +X64_RegCode_zmm21, +X64_RegCode_zmm22, +X64_RegCode_zmm23, +X64_RegCode_zmm24, +X64_RegCode_zmm25, +X64_RegCode_zmm26, +X64_RegCode_zmm27, +X64_RegCode_zmm28, +X64_RegCode_zmm29, +X64_RegCode_zmm30, +X64_RegCode_zmm31, +X64_RegCode_k0, +X64_RegCode_k1, +X64_RegCode_k2, +X64_RegCode_k3, +X64_RegCode_k4, +X64_RegCode_k5, +X64_RegCode_k6, +X64_RegCode_k7, +X64_RegCode_cetmsr, +X64_RegCode_cetssp, +X64_RegCode_eax, +X64_RegCode_ecx, +X64_RegCode_edx, +X64_RegCode_ebx, +X64_RegCode_esp, +X64_RegCode_ebp, +X64_RegCode_esi, +X64_RegCode_edi, +X64_RegCode_r8d, +X64_RegCode_r9d, +X64_RegCode_r10d, +X64_RegCode_r11d, +X64_RegCode_r12d, +X64_RegCode_r13d, +X64_RegCode_r14d, +X64_RegCode_r15d, +X64_RegCode_eflags, +X64_RegCode_ax, +X64_RegCode_cx, +X64_RegCode_dx, +X64_RegCode_bx, +X64_RegCode_si, +X64_RegCode_di, +X64_RegCode_sp, +X64_RegCode_bp, +X64_RegCode_ip, +X64_RegCode_r8w, +X64_RegCode_r9w, +X64_RegCode_r10w, +X64_RegCode_r11w, +X64_RegCode_r12w, +X64_RegCode_r13w, +X64_RegCode_r14w, +X64_RegCode_r15w, +X64_RegCode_al, +X64_RegCode_cl, +X64_RegCode_dl, +X64_RegCode_bl, +X64_RegCode_sil, +X64_RegCode_dil, +X64_RegCode_bpl, +X64_RegCode_spl, +X64_RegCode_r8b, +X64_RegCode_r9b, +X64_RegCode_r10b, +X64_RegCode_r11b, +X64_RegCode_r12b, +X64_RegCode_r13b, +X64_RegCode_r14b, +X64_RegCode_r15b, +X64_RegCode_ah, +X64_RegCode_ch, +X64_RegCode_dh, +X64_RegCode_bh, +X64_RegCode_xmm0, +X64_RegCode_xmm1, +X64_RegCode_xmm2, +X64_RegCode_xmm3, +X64_RegCode_xmm4, +X64_RegCode_xmm5, +X64_RegCode_xmm6, +X64_RegCode_xmm7, +X64_RegCode_xmm8, +X64_RegCode_xmm9, +X64_RegCode_xmm10, +X64_RegCode_xmm11, +X64_RegCode_xmm12, +X64_RegCode_xmm13, +X64_RegCode_xmm14, +X64_RegCode_xmm15, +X64_RegCode_ymm0, +X64_RegCode_ymm1, +X64_RegCode_ymm2, +X64_RegCode_ymm3, +X64_RegCode_ymm4, +X64_RegCode_ymm5, +X64_RegCode_ymm6, +X64_RegCode_ymm7, +X64_RegCode_ymm8, +X64_RegCode_ymm9, +X64_RegCode_ymm10, +X64_RegCode_ymm11, +X64_RegCode_ymm12, +X64_RegCode_ymm13, +X64_RegCode_ymm14, +X64_RegCode_ymm15, +X64_RegCode_mm0, +X64_RegCode_mm1, +X64_RegCode_mm2, +X64_RegCode_mm3, +X64_RegCode_mm4, +X64_RegCode_mm5, +X64_RegCode_mm6, +X64_RegCode_mm7, +X64_RegCode_COUNT, +} X64_RegCode; + +typedef struct X64_RegBlock X64_RegBlock; +struct X64_RegBlock +{ +U64 rax; +U64 rcx; +U64 rdx; +U64 rbx; +U64 rsp; +U64 rbp; +U64 rsi; +U64 rdi; +U64 r8; +U64 r9; +U64 r10; +U64 r11; +U64 r12; +U64 r13; +U64 r14; +U64 r15; +U64 fsbase; +U64 gsbase; +U64 rip; +U64 rflags; +U64 dr0; +U64 dr1; +U64 dr2; +U64 dr3; +U64 dr4; +U64 dr5; +U64 dr6; +U64 dr7; +U80 st0; +U80 st1; +U80 st2; +U80 st3; +U80 st4; +U80 st5; +U80 st6; +U80 st7; +U16 fcw; +U16 fsw; +U8 ftw; +U16 fop; +U16 fcs; +U16 fds; +U64 fip; +U64 fdp; +U32 mxcsr; +U32 mxcsr_mask; +U16 ss; +U16 cs; +U16 ds; +U16 es; +U16 fs; +U16 gs; +U512 zmm0; +U512 zmm1; +U512 zmm2; +U512 zmm3; +U512 zmm4; +U512 zmm5; +U512 zmm6; +U512 zmm7; +U512 zmm8; +U512 zmm9; +U512 zmm10; +U512 zmm11; +U512 zmm12; +U512 zmm13; +U512 zmm14; +U512 zmm15; +U512 zmm16; +U512 zmm17; +U512 zmm18; +U512 zmm19; +U512 zmm20; +U512 zmm21; +U512 zmm22; +U512 zmm23; +U512 zmm24; +U512 zmm25; +U512 zmm26; +U512 zmm27; +U512 zmm28; +U512 zmm29; +U512 zmm30; +U512 zmm31; +U64 k0; +U64 k1; +U64 k2; +U64 k3; +U64 k4; +U64 k5; +U64 k6; +U64 k7; +U64 cetmsr; +U64 cetssp; +}; + +C_LINKAGE_BEGIN +extern B8 x64_reg_code_is_vector_table[189]; +extern String8 x64_reg_code_name_table[189]; +extern U8 x64_reg_code_base_table[189]; +extern Rng1U16 x64_reg_code_rng_table[189]; + +C_LINKAGE_END + +#endif // X64_META_H diff --git a/src/x64/x64.c b/src/x64/x64.c index e099d9de..e1ee9e02 100644 --- a/src/x64/x64.c +++ b/src/x64/x64.c @@ -1,6 +1,14 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Generated + +#include "x64/generated/x64.meta.c" + +//////////////////////////////// +//~ cpuid + internal void x64_cpuid(U32 leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx) { @@ -43,6 +51,9 @@ x64_cpuid_ex(U32 leaf, U32 sub_leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx) #endif } +//////////////////////////////// +//~ fxsave/xsave + internal B32 x64_is_xsave_supported(void) { @@ -114,6 +125,9 @@ x64_get_xsave_layout(U64 xcr0) return xsave_layout; } +//////////////////////////////// +//~ Debug Control Register + internal void x64_set_debug_break(U64 *drs, U64 trap_idx, U64 addr, U64 size, X64_BreakpointType bp_type, X64_DebugBreakType break_type) { @@ -181,4 +195,3 @@ x64_set_debug_break(U64 *drs, U64 trap_idx, U64 addr, U64 size, X64_BreakpointTy default: { InvalidPath; } } } - diff --git a/src/x64/x64.h b/src/x64/x64.h index 8a41a154..db5edf11 100644 --- a/src/x64/x64.h +++ b/src/x64/x64.h @@ -177,30 +177,35 @@ typedef enum X64_DebugControlFlags X64_DebugControlFlag_L1 = (1 << 2), X64_DebugControlFlag_L2 = (1 << 4), X64_DebugControlFlag_L3 = (1 << 6), - + X64_DebugControlFlag_G0 = (1 << 1), X64_DebugControlFlag_G1 = (1 << 3), X64_DebugControlFlag_G3 = (1 << 5), X64_DebugControlFlag_G4 = (1 << 7), - + X64_DebugControlFlag_LE = (1 << 8), X64_DebugControlFlag_GE = (1 << 9), - + X64_DebugControlFlag_RTM = (1 << 11), - + X64_DebugControlFlag_GD = (1 << 13), - + X64_DebugControlFlag_RW0 = (3 << 16), X64_DebugControlFlag_RW1 = (3 << 20), X64_DebugControlFlag_RW2 = (3 << 24), X64_DebugControlFlag_FW3 = (3 << 26), - + X64_DebugControlFlag_LEN0 = (3 << 18), X64_DebugControlFlag_LEN1 = (3 << 22), X64_DebugControlFlag_LEN2 = (3 << 26), X64_DebugControlFlag_LEN3 = (3 << 30), } X64_DebugControlFlags; +//////////////////////////////// +//~ rjf: Generated + +#include "x64/generated/x64.meta.h" + //////////////////////////////// //~ cpuid @@ -222,4 +227,3 @@ internal X64_XSaveLayout x64_get_xsave_layout(U64 xcr0); internal void x64_set_debug_break(U64 *drs, U64 trap_idx, U64 addr, U64 size, X64_BreakpointType bp_type, X64_DebugBreakType break_type); #endif // BASE_X64_H - diff --git a/src/x64/x64.mdesk b/src/x64/x64.mdesk new file mode 100644 index 00000000..9bae9a8d --- /dev/null +++ b/src/x64/x64.mdesk @@ -0,0 +1,231 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@table(name base off size is_vector has_rdi has_dwarf) +X64_RegTable: +{ + {nil - 0 0 - x - } + {rax - 0 8 - x x } + {rcx - 0 8 - x x } + {rdx - 0 8 - x x } + {rbx - 0 8 - x x } + {rsp - 0 8 - x x } + {rbp - 0 8 - x x } + {rsi - 0 8 - x x } + {rdi - 0 8 - x x } + {r8 - 0 8 - x x } + {r9 - 0 8 - x x } + {r10 - 0 8 - x x } + {r11 - 0 8 - x x } + {r12 - 0 8 - x x } + {r13 - 0 8 - x x } + {r14 - 0 8 - x x } + {r15 - 0 8 - x x } + {fsbase - 0 8 - x x } + {gsbase - 0 8 - x x } + {rip - 0 8 - x x } + {rflags - 0 8 - x x } + {dr0 - 0 8 - x - } + {dr1 - 0 8 - x - } + {dr2 - 0 8 - x - } + {dr3 - 0 8 - x - } + {dr4 - 0 8 - x - } + {dr5 - 0 8 - x - } + {dr6 - 0 8 - x - } + {dr7 - 0 8 - x - } + {st0 - 0 10 - x x } + {st1 - 0 10 - x x } + {st2 - 0 10 - x x } + {st3 - 0 10 - x x } + {st4 - 0 10 - x x } + {st5 - 0 10 - x x } + {st6 - 0 10 - x x } + {st7 - 0 10 - x x } + {fcw - 0 2 - x - } + {fsw - 0 2 - x - } + {ftw - 0 1 - x - } + {fop - 0 2 - x - } + {fcs - 0 2 - x - } + {fds - 0 2 - x - } + {fip - 0 8 - x - } + {fdp - 0 8 - x - } + {mxcsr - 0 4 - x - } + {mxcsr_mask - 0 4 - x - } + {ss - 0 2 - x x } + {cs - 0 2 - x x } + {ds - 0 2 - x x } + {es - 0 2 - x x } + {fs - 0 2 - x x } + {gs - 0 2 - x x } + {zmm0 - 0 64 x x x } + {zmm1 - 0 64 x x x } + {zmm2 - 0 64 x x x } + {zmm3 - 0 64 x x x } + {zmm4 - 0 64 x x x } + {zmm5 - 0 64 x x x } + {zmm6 - 0 64 x x x } + {zmm7 - 0 64 x x x } + {zmm8 - 0 64 x x x } + {zmm9 - 0 64 x x x } + {zmm10 - 0 64 x x x } + {zmm11 - 0 64 x x x } + {zmm12 - 0 64 x x x } + {zmm13 - 0 64 x x x } + {zmm14 - 0 64 x x x } + {zmm15 - 0 64 x x x } + {zmm16 - 0 64 x x x } + {zmm17 - 0 64 x x x } + {zmm18 - 0 64 x x x } + {zmm19 - 0 64 x x x } + {zmm20 - 0 64 x x x } + {zmm21 - 0 64 x x x } + {zmm22 - 0 64 x x x } + {zmm23 - 0 64 x x x } + {zmm24 - 0 64 x x x } + {zmm25 - 0 64 x x x } + {zmm26 - 0 64 x x x } + {zmm27 - 0 64 x x x } + {zmm28 - 0 64 x x x } + {zmm29 - 0 64 x x x } + {zmm30 - 0 64 x x x } + {zmm31 - 0 64 x x x } + {k0 - 0 8 - x - } + {k1 - 0 8 - x - } + {k2 - 0 8 - x - } + {k3 - 0 8 - x - } + {k4 - 0 8 - x - } + {k5 - 0 8 - x - } + {k6 - 0 8 - x - } + {k7 - 0 8 - x - } + {cetmsr - 0 8 - x - } + {cetssp - 0 8 - x - } + //- + //- aliases + //- + {eax rax 0 4 - - - } + {ecx rcx 0 4 - - - } + {edx rdx 0 4 - - - } + {ebx rbx 0 4 - - - } + {esp rsp 0 4 - - - } + {ebp rbp 0 4 - - - } + {esi rsi 0 4 - - - } + {edi rdi 0 4 - - - } + {r8d r8 0 4 - - - } + {r9d r9 0 4 - - - } + {r10d r10 0 4 - - - } + {r11d r11 0 4 - - - } + {r12d r12 0 4 - - - } + {r13d r13 0 4 - - - } + {r14d r14 0 4 - - - } + {r15d r15 0 4 - - - } + {eflags rflags 0 4 - - - } + {ax rax 0 2 - - - } + {cx rcx 0 2 - - - } + {dx rdx 0 2 - - - } + {bx rbx 0 2 - - - } + {si rsi 0 2 - - - } + {di rdi 0 2 - - - } + {sp rsp 0 2 - - - } + {bp rbp 0 2 - - - } + {ip rip 0 2 - - - } + {r8w r8 0 2 - - - } + {r9w r9 0 2 - - - } + {r10w r10 0 2 - - - } + {r11w r11 0 2 - - - } + {r12w r12 0 2 - - - } + {r13w r13 0 2 - - - } + {r14w r14 0 2 - - - } + {r15w r15 0 2 - - - } + {al rax 0 1 - - - } + {cl rcx 0 1 - - - } + {dl rdx 0 1 - - - } + {bl rbx 0 1 - - - } + {sil rsi 0 1 - - - } + {dil rdi 0 1 - - - } + {bpl rbp 0 1 - - - } + {spl rsp 0 1 - - - } + {r8b r8 0 1 - - - } + {r9b r9 0 1 - - - } + {r10b r10 0 1 - - - } + {r11b r11 0 1 - - - } + {r12b r12 0 1 - - - } + {r13b r13 0 1 - - - } + {r14b r14 0 1 - - - } + {r15b r15 0 1 - - - } + {ah rax 1 1 - - - } + {ch rcx 1 1 - - - } + {dh rdx 1 1 - - - } + {bh rbx 1 1 - - - } + {xmm0 zmm0 0 16 x - - } + {xmm1 zmm1 0 16 x - - } + {xmm2 zmm2 0 16 x - - } + {xmm3 zmm3 0 16 x - - } + {xmm4 zmm4 0 16 x - - } + {xmm5 zmm5 0 16 x - - } + {xmm6 zmm6 0 16 x - - } + {xmm7 zmm7 0 16 x - - } + {xmm8 zmm8 0 16 x - - } + {xmm9 zmm9 0 16 x - - } + {xmm10 zmm10 0 16 x - - } + {xmm11 zmm11 0 16 x - - } + {xmm12 zmm12 0 16 x - - } + {xmm13 zmm13 0 16 x - - } + {xmm14 zmm14 0 16 x - - } + {xmm15 zmm15 0 16 x - - } + {ymm0 zmm0 0 32 x - - } + {ymm1 zmm1 0 32 x - - } + {ymm2 zmm2 0 32 x - - } + {ymm3 zmm3 0 32 x - - } + {ymm4 zmm4 0 32 x - - } + {ymm5 zmm5 0 32 x - - } + {ymm6 zmm6 0 32 x - - } + {ymm7 zmm7 0 32 x - - } + {ymm8 zmm8 0 32 x - - } + {ymm9 zmm9 0 32 x - - } + {ymm10 zmm10 0 32 x - - } + {ymm11 zmm11 0 32 x - - } + {ymm12 zmm12 0 32 x - - } + {ymm13 zmm13 0 32 x - - } + {ymm14 zmm14 0 32 x - - } + {ymm15 zmm15 0 32 x - - } + {mm0 st0 0 8 x - x } + {mm1 st1 0 8 x - x } + {mm2 st2 0 8 x - x } + {mm3 st3 0 8 x - x } + {mm4 st4 0 8 x - x } + {mm5 st5 0 8 x - x } + {mm6 st6 0 8 x - x } + {mm7 st7 0 8 x - x } +} + +@enum X64_RegCode: +{ + @expand(X64_RegTable a) `$(a.name)`, + COUNT, +} + +@struct X64_RegBlock: +{ + @expand(X64_RegTable a) `$(a.name != 'nil' && a.base == '-' -> 'U' .. a.size*8 .. ' ' .. a.name)`, +} + +@data(B8) x64_reg_code_is_vector_table: +{ + @expand(X64_RegTable a) `$(a.is_vector == 'x' -> '1')$(a.is_vector != 'x' -> '0')`; +} + +@data(String8) x64_reg_code_name_table: +{ + @expand(X64_RegTable a) `str8_lit_comp("$(a.name)")`; +} + +@data(U8) x64_reg_code_base_table: +{ + @expand(X64_RegTable a) `$(a.base != '-' -> "X64_RegCode_" .. a.base)$(a.base == '-' -> 0)`; +} + +@data(Rng1U16) x64_reg_code_rng_table: +{ + `{0}`, + @expand(X64_RegTable a) `$(a.name != 'nil' && a.base == '-'-> ("{(U16)OffsetOf(X64_RegBlock, " .. a.name .. "), (U16)OffsetOf(X64_RegBlock, " .. a.name .. ") + " .. a.size .. "}"))$(a.name != 'nil' && a.base != '-' -> ("{(U16)OffsetOf(X64_RegBlock, " .. a.base .. ") + " .. a.off .. ", (U16)OffsetOf(X64_RegBlock, " .. a.base .. ") + " .. a.off .. " + " .. a.size .. "}"))`, +} From 9a7782de47045140f50ef8eb7a7a5129ab560086 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 8 May 2026 13:51:20 -0700 Subject: [PATCH 503/850] re-slice linux/win32 backends, top-level folder is backend (demon/win32 -> win32/demon, etc.); os_gfx -> window_manager; fix linux / opengl builds for new apis/types --- project.4coder | 4 +- src/arch/arch.h | 3 +- src/demon/demon_inc.c | 4 +- src/demon/demon_inc.h | 4 +- src/demon/linux/demon_os_linux.c | 2106 ------ src/demon/linux/demon_os_linux.h | 222 - src/linker/lnk.c | 2 - src/linux/base/linux_base.c | 1571 ++++ src/linux/base/linux_base.h | 150 + .../demon/linux_demon.c} | 6306 ++++++++--------- .../demon/linux_demon.h} | 944 +-- .../window_manager/linux_window_manager.c} | 1438 ++-- .../window_manager/linux_window_manager.h} | 122 +- src/os/core/linux/os_core_linux.c | 1570 ---- src/os/core/linux/os_core_linux.h | 215 - src/os/core/linux/os_core_linux_old.c | 1677 ----- src/os/core/linux/os_core_linux_old.h | 88 - src/os/core/os_core.c | 279 - src/os/core/os_core.h | 324 - src/os/core/win32/os_core_win32.c | 1765 ----- src/os/os_inc.c | 27 - src/os/os_inc.h | 40 - src/radbin/radbin_main.c | 2 - src/raddbg/raddbg_main.c | 4 +- .../linux/egl/render_opengl_linux_egl.c | 8 +- .../linux/glx/render_opengl_linux_glx.c | 8 +- src/render/opengl/render_opengl.c | 10 +- src/render/opengl/render_opengl.h | 8 +- src/render/opengl/win32/render_opengl_win32.c | 8 +- src/scratch/ryan_scratch.c | 2 - src/scratch/textperf.c | 2 - src/stap/stap_parse.c | 25 +- src/stap/stap_parse.h | 3 - src/stap/stap_test.c | 2 - src/strip_lib_debug/strip_lib_debug.c | 2 - src/torture/torture_main.c | 4 +- .../demon/win32_demon.c} | 6204 ++++++++-------- .../demon/win32_demon.h} | 718 +- .../window_manager/win32_window_manager.c} | 3374 ++++----- .../window_manager/win32_window_manager.h} | 246 +- .../generated/window_manager.meta.c} | 604 +- .../generated/window_manager.meta.h} | 326 +- .../window_manager.c} | 600 +- .../window_manager.h} | 492 +- .../window_manager.mdesk} | 344 +- src/window_manager/window_manager_inc.c | 13 + src/window_manager/window_manager_inc.h | 18 + .../window_manager_stub.c} | 558 +- .../window_manager_stub.h} | 14 +- src/x64/x64.h | 38 +- 50 files changed, 12981 insertions(+), 19517 deletions(-) delete mode 100644 src/demon/linux/demon_os_linux.c delete mode 100644 src/demon/linux/demon_os_linux.h rename src/{demon/linux/demon_core_linux.c => linux/demon/linux_demon.c} (87%) rename src/{demon/linux/demon_core_linux.h => linux/demon/linux_demon.h} (91%) rename src/{os/gfx/linux/os_gfx_linux.c => linux/window_manager/linux_window_manager.c} (85%) rename src/{os/gfx/linux/os_gfx_linux.h => linux/window_manager/linux_window_manager.h} (95%) delete mode 100644 src/os/core/linux/os_core_linux.c delete mode 100644 src/os/core/linux/os_core_linux.h delete mode 100644 src/os/core/linux/os_core_linux_old.c delete mode 100644 src/os/core/linux/os_core_linux_old.h delete mode 100644 src/os/core/os_core.c delete mode 100644 src/os/core/os_core.h delete mode 100644 src/os/core/win32/os_core_win32.c delete mode 100644 src/os/os_inc.c delete mode 100644 src/os/os_inc.h rename src/{demon/win32/demon_core_win32.c => win32/demon/win32_demon.c} (97%) rename src/{demon/win32/demon_core_win32.h => win32/demon/win32_demon.h} (97%) rename src/{os/gfx/win32/os_gfx_win32.c => win32/window_manager/win32_window_manager.c} (96%) rename src/{os/gfx/win32/os_gfx_win32.h => win32/window_manager/win32_window_manager.h} (94%) rename src/{os/gfx/generated/os_gfx.meta.c => window_manager/generated/window_manager.meta.c} (95%) rename src/{os/gfx/generated/os_gfx.meta.h => window_manager/generated/window_manager.meta.h} (90%) rename src/{os/gfx/os_gfx.c => window_manager/window_manager.c} (96%) rename src/{os/gfx/os_gfx.h => window_manager/window_manager.h} (96%) rename src/{os/gfx/os_gfx.mdesk => window_manager/window_manager.mdesk} (98%) create mode 100644 src/window_manager/window_manager_inc.c create mode 100644 src/window_manager/window_manager_inc.h rename src/{os/gfx/stub/os_gfx_stub.c => window_manager/window_manager_stub.c} (93%) rename src/{os/gfx/stub/os_gfx_stub.h => window_manager/window_manager_stub.h} (96%) diff --git a/project.4coder b/project.4coder index bed46ee1..497a4b4f 100644 --- a/project.4coder +++ b/project.4coder @@ -49,13 +49,13 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [scratch] - .f2 = { .win = "build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f2 = { .win = "wsl ./build.sh radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [textperf] // .f1 = { .win = "raddbg_stable --ipc kill_all && build no_meta telemetry textperf && raddbg_stable --ipc bring_to_front && raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/arch/arch.h b/src/arch/arch.h index e9e945b9..824cfe7a 100644 --- a/src/arch/arch.h +++ b/src/arch/arch.h @@ -28,7 +28,8 @@ struct ARCH_Info global read_only Rng1U16 arch_reg_code_rng_nil = {0}; global read_only String8 arch_reg_code_name_nil = {0}; global read_only U8 arch_reg_code_u8_nil = 0; -global read_only ARCH_Info arch_info_nil = {0, 0, 0, 0, &arch_reg_code_rng_nil, &arch_reg_code_name_nil, &arch_reg_code_u8_nil, &arch_reg_code_u8_nil}; +global read_only B8 arch_reg_code_b8_nil = 0; +global read_only ARCH_Info arch_info_nil = {0, 0, 0, 0, &arch_reg_code_rng_nil, &arch_reg_code_name_nil, &arch_reg_code_u8_nil, &arch_reg_code_b8_nil}; //////////////////////////////// //~ rjf: Abstracted Architecture Functions diff --git a/src/demon/demon_inc.c b/src/demon/demon_inc.c index d733b612..771aa2e6 100644 --- a/src/demon/demon_inc.c +++ b/src/demon/demon_inc.c @@ -4,9 +4,9 @@ #include "demon/demon_core.c" #if OS_WINDOWS -# include "demon/win32/demon_core_win32.c" +# include "win32/demon/win32_demon.c" #elif OS_LINUX -# include "demon/linux/demon_core_linux.c" +# include "linux/demon/linux_demon.c" #else # error Demon layer backend not defined for this operating system. #endif diff --git a/src/demon/demon_inc.h b/src/demon/demon_inc.h index eec32998..b5e693f1 100644 --- a/src/demon/demon_inc.h +++ b/src/demon/demon_inc.h @@ -7,9 +7,9 @@ #include "demon/demon_core.h" #if OS_WINDOWS -# include "demon/win32/demon_core_win32.h" +# include "win32/demon/win32_demon.h" #elif OS_LINUX -# include "demon/linux/demon_core_linux.h" +# include "linux/demon/linux_demon.h" #else # error Demon layer backend not defined for this operating system. #endif diff --git a/src/demon/linux/demon_os_linux.c b/src/demon/linux/demon_os_linux.c deleted file mode 100644 index 65b4e639..00000000 --- a/src/demon/linux/demon_os_linux.c +++ /dev/null @@ -1,2106 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -// TODO(allen): run controls: ignore_previous_exception - -//////////////////////////////// -//~ allen: Elf Parsing Code - -#include "syms/syms_elf_inc.c" - -//////////////////////////////// -//~ rjf: Globals - -global B32 demon_lnx_already_has_halt_injection = false; -global U64 demon_lnx_halt_code = 0; -global U64 demon_lnx_halt_user_data = 0; - -global B32 demon_lnx_new_process_pending = false; - -global Arena *demon_lnx_event_arena = 0; -global DEMON_EventList demon_lnx_queued_events = {0}; - -global U32 demon_lnx_ptrace_options = (PTRACE_O_TRACEEXIT| - PTRACE_O_EXITKILL| - PTRACE_O_TRACEFORK| - PTRACE_O_TRACEVFORK| - PTRACE_O_TRACECLONE); - -//////////////////////////////// -//~ rjf: Helpers - -internal DEMON_LNX_ThreadExt* -demon_lnx_thread_ext(DEMON_Entity *entity){ - DEMON_LNX_ThreadExt *result = (DEMON_LNX_ThreadExt*)&entity->ext; - return(result); -} - -internal B32 -demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node){ - B32 result = false; - - int attach_result = ptrace(PTRACE_ATTACH, pid, 0, 0); - if (attach_result == -1){ - // TODO(allen): attach denied - } - else{ - // return a new attachment node as soon as the ptrace exists. we use these nodes - // for cleanup on failure *and* for initializing on success. either way we need - // to see all new attachments whether or not they fully initialized correctly. - DEMON_LNX_AttachNode *proc_attachment = push_array_no_zero(arena, DEMON_LNX_AttachNode, 1); - proc_attachment->next = 0; - proc_attachment->pid = pid; - *new_node = proc_attachment; - - int status = 0; - pid_t wait_id = waitpid(pid, &status, __WALL); - // NOTE(allen): if wait_id != pid we don't know what that means; study that case before - // deciding how error handling around it works. - if (wait_id == pid){ - int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); - if (setoptions_result == -1){ - // TODO(allen): setup failed - } - else{ - result = true; - } - } - } - - return(result); -} - -internal String8 -demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid){ - // get symbolic path - Temp scratch = scratch_begin(&arena, 1); - String8 exe_symbol_path = push_str8f(scratch.arena, "/proc/%d/exe", pid); - - // try to read the link for a bit - Temp restore_point = temp_begin(arena); - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - S64 cap = PATH_MAX; - for (S64 r = 0; r < 4; cap *= 2, r += 1){ - temp_end(restore_point); - buffer = push_array_no_zero(arena, U8, cap); - size = readlink((char*)exe_symbol_path.str, (char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // finalize result - String8 result = {0}; - if (!got_final_result || size == -1){ - temp_end(restore_point); - } - else{ - arena_pop(arena, (cap - size - 1)); - result = str8(buffer, size + 1); - } - - scratch_end(scratch); - return(result); -} - -internal int -demon_lnx_open_memory_fd_for_pid(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - String8 memory_path = push_str8f(scratch.arena, "/proc/%i/mem", pid); - int result = open((char*)memory_path.str, O_RDWR|O_CLOEXEC); - scratch_end(scratch); - return(result); -} - -internal Arch -demon_lnx_arch_from_pid(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - Arch result = Arch_Null; - - // exe path - String8 exe_path = demon_lnx_executable_path_from_pid(scratch.arena, pid); - - // handle to exe - int exe_fd = -1; - if (exe_path.size != 0){ - exe_fd = open((char*)exe_path.str, O_RDONLY|O_CLOEXEC); - } - - // elf identification - B32 is_elf = false; - U8 e_ident[SYMS_ElfIdentifier_NIDENT] = {0}; - if (exe_fd >= 0){ - if (pread(exe_fd, e_ident, sizeof(e_ident), 0) == sizeof(e_ident)){ - is_elf = (e_ident[SYMS_ElfIdentifier_MAG0] == 0x7f && - e_ident[SYMS_ElfIdentifier_MAG1] == 'E' && - e_ident[SYMS_ElfIdentifier_MAG2] == 'L' && - e_ident[SYMS_ElfIdentifier_MAG3] == 'F'); - } - } - - // elf class - U8 elf_class = 0; - if (is_elf){ - elf_class = e_ident[SYMS_ElfIdentifier_CLASS]; - } - - // exe header data - SYMS_ElfEhdr64 ehdr = {0}; - switch (elf_class){ - case 1: - { - SYMS_ElfEhdr32 ehdr32 = {0}; - if (pread(exe_fd, &ehdr32, sizeof(ehdr32), 0) == sizeof(ehdr32)){ - ehdr = syms_elf_ehdr64_from_ehdr32(ehdr32); - } - }break; - - case 2: - { - pread(exe_fd, &ehdr, sizeof(ehdr), 0); - }break; - } - - // determine machine type - switch (ehdr.e_machine){ - case SYMS_ElfMachineKind_386: - { - result = Arch_x86; - }break; - - case SYMS_ElfMachineKind_ARM: - { - result = Arch_arm32; - }break; - - case SYMS_ElfMachineKind_X86_64: - { - result = Arch_x64; - }break; - - case SYMS_ElfMachineKind_AARCH64: - { - result = Arch_arm64; - }break; - } - - scratch_end(scratch); - return(result); -} - -internal DEMON_LNX_ProcessAux -demon_lnx_aux_from_pid(pid_t pid, Arch arch){ - DEMON_LNX_ProcessAux result = {0}; - B32 addr_32bit = (arch == Arch_x86 || arch == Arch_arm32); - - // open aux data - Temp scratch = scratch_begin(0, 0); - String8 auxv_symbol_path = push_str8f(scratch.arena, "/proc/%d/auxv", pid); - int aux_fd = open((char*)auxv_symbol_path.str, O_RDONLY|O_CLOEXEC); - - // scan aux data - if (aux_fd >= 0){ - for (;;){ - result.filled = true; - - // read next aux - U64 type = 0; - U64 val = 0; - if (addr_32bit){ - SYMS_ElfAuxv32 aux; - if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ - goto brkloop; - } - type = aux.a_type; - val = aux.a_val; - } - else{ - SYMS_ElfAuxv64 aux; - if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){ - goto brkloop; - } - type = aux.a_type; - val = aux.a_val; - } - - // place value in result - switch (type){ - default:break; - case SYMS_ElfAuxType_NULL: goto brkloop; break; - case SYMS_ElfAuxType_PHNUM: result.phnum = val; break; - case SYMS_ElfAuxType_PHENT: result.phent = val; break; - case SYMS_ElfAuxType_PHDR: result.phdr = val; break; - case SYMS_ElfAuxType_EXECFN: result.execfn = val; break; - } - } - brkloop:; - - close(aux_fd); - } - - scratch_end(scratch); - return(result); -} - -internal DEMON_LNX_PhdrInfo -demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phentsize, U64 phcount){ - DEMON_LNX_PhdrInfo result = {0}; - result.range.min = max_U64; - - // how much phdr will we read? - U64 phdr_size_expected = (is_32bit?sizeof(SYMS_ElfPhdr32):sizeof(SYMS_ElfPhdr64)); - U64 phdr_stride = (phentsize?phentsize:phdr_size_expected); - U64 phdr_read_size = ClampTop(phdr_stride, phdr_size_expected); - - // scan table - U64 va = phvaddr; - for (U64 i = 0; i < phcount; i += 1, va += phdr_stride){ - - // get type and range - SYMS_ElfPKind p_type = 0; - U64 p_vaddr = 0; - U64 p_memsz = 0; - - if (is_32bit){ - SYMS_ElfPhdr32 phdr32 = {0}; - demon_lnx_read_memory(memory_fd, &phdr32, va, phdr_read_size); - p_type = phdr32.p_type; - p_vaddr = phdr32.p_vaddr; - p_memsz = phdr32.p_memsz; - } - else{ - SYMS_ElfPhdr64 phdr64 = {0}; - demon_lnx_read_memory(memory_fd, &phdr64, va, phdr_read_size); - p_type = phdr64.p_type; - p_vaddr = phdr64.p_vaddr; - p_memsz = phdr64.p_memsz; - } - - // save useful info - switch (p_type){ - case SYMS_ElfPKind_Dynamic: - { - result.dynamic = p_vaddr; - }break; - case SYMS_ElfPKind_Load: - { - U64 min = p_vaddr; - U64 max = p_vaddr + p_memsz; - result.range.min = Min(result.range.min, min); - result.range.max = Max(result.range.max, max); - }break; - } - } - - return(result); -} - -internal DEMON_LNX_ModuleNode* -demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){ - Arch arch = (Arch)process->arch; - B32 is_32bit = (arch == Arch_x86 || arch == Arch_arm32); - int memory_fd = (int)process->ext_u64; - - // aux from pid - DEMON_LNX_ProcessAux aux = demon_lnx_aux_from_pid((pid_t)process->id, arch); - - // extract info from program headers - DEMON_LNX_PhdrInfo phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, - aux.phdr, aux.phent, aux.phnum); - - // linkmap first from memory space & dyn address - U64 first_linkmap_va = 0; - if (phdr_info.dynamic != 0){ - U64 off = phdr_info.dynamic; - for (;;){ - SYMS_ElfDyn64 dyn = {0}; - if (is_32bit){ - SYMS_ElfDyn32 dyn32 = {0}; - demon_lnx_read_memory(memory_fd, &dyn32, off, sizeof(dyn32)); - dyn.tag = dyn32.tag; - dyn.val = dyn32.val; - off += sizeof(dyn32); - } - else{ - demon_lnx_read_memory(memory_fd, &dyn, off, sizeof(dyn)); - off += sizeof(dyn); - } - - if (dyn.tag == SYMS_ElfDynTag_NULL){ - break; - } - - if (dyn.tag == SYMS_ElfDynTag_PLTGOT){ - // True for x86 and x64 - // vas[0] virtual address of .dynamic - // vas[2] callback for resolving function address of relocation and if successful jumps to it. - // - // Code that sets up PLTGOT is in glibc/sysdeps/x86_64/dl_machine.h -> elf_machine_runtime_setup - U64 vas_off = dyn.val; - U64 vas[3] = {0}; - demon_lnx_read_memory(memory_fd, vas, vas_off, sizeof(vas)); - first_linkmap_va = vas[1]; - break; - } - } - } - - // setup output list - DEMON_LNX_ModuleNode *first = 0; - DEMON_LNX_ModuleNode *last = 0; - - // main module - { - DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); - SLLQueuePush(first, last, node); - node->vaddr = phdr_info.range.min; - node->size = phdr_info.range.max - phdr_info.range.min; - node->name = aux.execfn; - } - - // iterate link maps - if (first_linkmap_va != 0){ - U64 linkmap_va = first_linkmap_va; - - for (;;){ - SYMS_ElfLinkMap64 linkmap = {0}; - if (is_32bit){ - // TOOD(nick): endian awarness - SYMS_ElfLinkMap32 linkmap32 = {0}; - demon_lnx_read_memory(memory_fd, &linkmap32, linkmap_va, sizeof(linkmap32)); - linkmap.base = linkmap32.base; - linkmap.name = linkmap32.name; - linkmap.ld = linkmap32.ld; - linkmap.next = linkmap32.next; - } - else{ - demon_lnx_read_memory(memory_fd, &linkmap, linkmap_va, sizeof(linkmap)); - } - - if (linkmap.base != 0){ - // find phdrs for this module - SYMS_U64 phvaddr = 0; - SYMS_U64 phentsize = 0; - SYMS_U64 phcount = 0; - - if (is_32bit){ - SYMS_ElfEhdr32 ehdr = {0}; - demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); - phvaddr = ehdr.e_phoff + linkmap.base; - phentsize = ehdr.e_phentsize; - phcount = ehdr.e_phnum; - } - else{ - SYMS_ElfEhdr64 ehdr = {0}; - demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr)); - phvaddr = ehdr.e_phoff + linkmap.base; - phentsize = ehdr.e_phentsize; - phcount = ehdr.e_phnum; - } - - // extract info from phdrs - DEMON_LNX_PhdrInfo module_phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit, - phvaddr, phentsize, phcount); - - // save module node - DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1); - SLLQueuePush(first, last, node); - node->vaddr = linkmap.base; - node->size = module_phdr_info.range.max - module_phdr_info.range.min; - node->name = linkmap.name; - } - - linkmap_va = linkmap.next; - if (linkmap_va == 0){ - break; - } - } - } - - return(first); -} - -internal U64 -demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size){ - U64 bytes_read = 0; - U8 *ptr = (U8*)dst; - U8 *opl = ptr + size; - U64 cursor = src; - for (;ptr < opl;){ - size_t to_read = (size_t)(opl - ptr); - ssize_t actual_read = pread(memory_fd, ptr, to_read, cursor); - if (actual_read == -1){ - break; - } - ptr += actual_read; - cursor += actual_read; - bytes_read += actual_read; - } - return(bytes_read); -} - -internal B32 -demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size){ - B32 result = true; - U8 *ptr = (U8*)src; - U8 *opl = ptr + size; - U64 cursor = dst; - for (;ptr < opl;){ - size_t to_write = (size_t)(opl - ptr); - ssize_t actual_write = pwrite(memory_fd, ptr, to_write, cursor); - if (actual_write == -1){ - result = false; - break; - } - ptr += actual_write; - cursor += actual_write; - } - return(result); -} - -internal String8 -demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address){ - // TODO(allen): this could be done better with a demon_lnx_read_memory - // that returns a read amount instead of a success/fail. - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 0;){ - if (demon_lnx_read_memory(memory_fd, block, read_p, cap)){ - break; - } - cap /= 2; - } - read_p += cap; - - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 1){ - if (block[block_opl] == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 result = str8_list_join(arena, &list, 0); - scratch_end(scratch); - return(result); -} - -internal void -demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src){ - dst->rax.u64 = src->rax; - dst->rcx.u64 = src->rcx; - dst->rdx.u64 = src->rdx; - dst->rbx.u64 = src->rbx; - dst->rsp.u64 = src->rsp; - dst->rbp.u64 = src->rbp; - dst->rsi.u64 = src->rsi; - dst->rdi.u64 = src->rdi; - dst->r8.u64 = src->r8; - dst->r9.u64 = src->r9; - dst->r10.u64 = src->r10; - dst->r11.u64 = src->r11; - dst->r12.u64 = src->r12; - dst->r13.u64 = src->r13; - dst->r14.u64 = src->r14; - dst->r15.u64 = src->r15; - dst->cs.u16 = src->cs; - dst->ds.u16 = src->ds; - dst->es.u16 = src->es; - dst->fs.u16 = src->fs; - dst->gs.u16 = src->gs; - dst->ss.u16 = src->ss; - dst->fsbase.u64 = src->fsbase; - dst->gsbase.u64 = src->gsbase; - dst->rip.u64 = src->rip; - dst->rflags.u64 = src->rflags; -} - -internal void -demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src){ - dst->rax = src->rax.u64; - dst->rcx = src->rcx.u64; - dst->rdx = src->rdx.u64; - dst->rbx = src->rbx.u64; - dst->rsp = src->rsp.u64; - dst->rbp = src->rbp.u64; - dst->rsi = src->rsi.u64; - dst->rdi = src->rdi.u64; - dst->r8 = src->r8.u64; - dst->r9 = src->r9.u64; - dst->r10 = src->r10.u64; - dst->r11 = src->r11.u64; - dst->r12 = src->r12.u64; - dst->r13 = src->r13.u64; - dst->r14 = src->r14.u64; - dst->r15 = src->r15.u64; - dst->cs = src->cs.u16; - dst->ds = src->ds.u16; - dst->es = src->es.u16; - dst->fs = src->fs.u16; - dst->gs = src->gs.u16; - dst->ss = src->ss.u16; - dst->fsbase = src->fsbase.u64; - dst->gsbase = src->gsbase.u64; - dst->rip = src->rip.u64; - dst->rflags = src->rflags.u64; -} - -//////////////////////////////// - -internal String8 -demon_lnx_read_int_string(Arena *arena, int fd, int radix){ - String8 integer = str8(0,0); - - int to_read = 0; - int to_seek = 0; - for (;;){ - char b = 0; - if (read(fd, &b, sizeof(b)) == 0){ - break; - } - to_seek += 1; - if ( ! char_is_digit(b, radix)){ - break; - } - to_read += 1; - } - - if (lseek(fd, -to_seek, SEEK_CUR) != -1) { - char *buf = push_array_no_zero(arena, char, to_read + 1); - read(fd, buf, to_read); - buf[to_read] = '\0'; - integer = str8((U8*)buf, (U64)to_read); - } - - return(integer); -} - -internal U64 -demon_lnx_read_u64(int fd, int radix){ - Temp scratch = scratch_begin(0, 0); - String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); - U64 result = u64_from_str8(integer, radix); - scratch_end(scratch); - return(result); -} - -internal S64 -demon_lnx_read_s64(int fd, int radix){ - Temp scratch = scratch_begin(0, 0); - String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix); - S64 result = s64_from_str8(integer, radix); - scratch_end(scratch); - return(result); -} - -internal B32 -demon_lnx_read_expect(int fd, char expect){ - char got = 0; - read(fd, &got, sizeof(got)); - B32 result = (got == expect); - if (!result){ - lseek(fd, -1, SEEK_CUR); - } - return(result); -} - -internal int -demon_lnx_read_whitespace(int fd){ - int whitespace_size = 0; - for (;;){ - if (!demon_lnx_read_expect(fd, ' ')){ - if (!demon_lnx_read_expect(fd, '\t')){ - break; - } - } - whitespace_size += 1; - } - return whitespace_size; -} - -internal String8 -demon_lnx_read_string(Arena *arena, int fd){ - String8 result = str8(0,0); - - int to_read = 0; - int to_seek = 0; - for (;;){ - char b = 0; - if (read(fd, &b, sizeof(b)) == 0) { - break; - } - to_seek += 1; - if (b == '\0' || b == '\n'){ - break; - } - to_read += 1; - } - - if (to_seek > 0 && lseek(fd, -to_seek, SEEK_CUR) != -1){ - char *buf = push_array_no_zero(arena, char, to_read + 1); - read(fd, buf, to_read); - buf[to_read] = '\0'; - result = str8((U8*)buf, to_read); - } - - return(result); -} - -internal int -demon_lnx_open_maps(pid_t pid){ - Temp scratch = scratch_begin(0, 0); - String8 path = push_str8f(scratch.arena, "/proc/%d/maps", pid); - int maps = open((char*)path.str, O_RDONLY|O_CLOEXEC); - scratch_end(scratch); - return(maps); -} - -internal B32 -demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out){ - B32 is_parsed = false; - MemoryZeroStruct(entry_out); - do{ - U64 address_lo = 0; - U64 address_hi = 0; - DEMON_LNX_PermFlags perms = 0; - U64 offset = 0; - U64 dev_major = 0; - U64 dev_minor = 0; - U64 inode = 0; - String8 pathname = str8(0,0); - - // address range - address_lo = demon_lnx_read_u64(maps, 16); - if (!demon_lnx_read_expect(maps, '-')){ - break; - } - address_hi = demon_lnx_read_u64(maps, 16); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // permission flags - char b; - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='r'){ - perms |= DEMON_LNX_PermFlags_Read; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='w'){ - perms |= DEMON_LNX_PermFlags_Write; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b=='x'){ - perms |= DEMON_LNX_PermFlags_Exec; - } - if (read(maps, &b, sizeof(b)) == 0){ - break; - } - if (b == 'p'){ - perms |= DEMON_LNX_PermFlags_Private; - } - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // offset - offset = demon_lnx_read_u64(maps, 16); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // dev - dev_major = demon_lnx_read_u64(maps, 10); - if (!demon_lnx_read_expect(maps, ':')){ - break; - } - dev_minor = demon_lnx_read_u64(maps, 10); - if (demon_lnx_read_whitespace(maps) == 0){ - break; - } - - // inode - inode = demon_lnx_read_u64(maps, 10); - if (demon_lnx_read_whitespace(maps) == 10){ - break; - } - - // pathname - pathname = demon_lnx_read_string(arena, maps); - - // emit entry if en - b = 0; - read(maps, &b, sizeof(b)); - if (b != '\n' && b != '\0') { - break; - } - - // fill result - entry_out->address_lo = address_lo; - entry_out->address_hi = address_hi; - entry_out->perms = perms; - entry_out->offset = offset; - entry_out->dev_major = (U32)dev_major; - entry_out->dev_minor = (U32)dev_minor; - entry_out->inode = inode; - entry_out->pathname = pathname; - entry_out->type = DEMON_LNX_MapsEntryType_Null; - entry_out->stack_tid = 0; - - if (str8_match(pathname, str8_lit("/"), StringMatchFlag_RightSideSloppy)){ - entry_out->type = DEMON_LNX_MapsEntryType_Path; - } else if (str8_match(pathname, str8_lit("[heap]"), 0)){ - entry_out->type = DEMON_LNX_MapsEntryType_Heap; - } else if (str8_match(pathname, str8_lit("[stack]"), 0)){ - entry_out->type = DEMON_LNX_MapsEntryType_Stack; - } else if (str8_match(pathname, str8_lit("[stack:"), StringMatchFlag_RightSideSloppy)){ - entry_out->type = DEMON_LNX_MapsEntryType_Stack; - String8 tid = str8_substr(pathname, r1u64(7, pathname.size - 8)); - entry_out->stack_tid = (pid_t)u64_from_str8(tid, 10); - } - - is_parsed = true; - }while(0); - return(is_parsed); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Main Layer Initialization - -internal void -demon_os_init(void){ - demon_lnx_event_arena = arena_alloc(); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Running/Halting - -internal DEMON_EventList -demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){ - DEMON_EventList result = {0}; - - if (demon_ent_root == 0){ - demon_push_event(arena, &result, DEMON_EventKind_NotInitialized); - } - else if (demon_ent_root->first == 0 && !demon_lnx_new_process_pending){ - demon_push_event(arena, &result, DEMON_EventKind_NotAttached); - } - else{ - Temp scratch = scratch_begin(&arena, 1); - - // use queued events if there are any - if (demon_lnx_queued_events.first != 0){ - // copy event queue - for (DEMON_Event *node = demon_lnx_queued_events.first; - node != 0; - node = node->next){ - DEMON_Event *copy = push_array_no_zero(arena, DEMON_Event, 1); - MemoryCopyStruct(copy, node); - SLLQueuePush(result.first, result.last, copy); - } - result.count = demon_lnx_queued_events.count; - - // zero stored queue - MemoryZeroStruct(&demon_lnx_queued_events); - arena_clear(demon_lnx_event_arena); - } - - // get the single step thread (if any) - DEMON_Entity *single_step_thread = controls->single_step_thread; - - // do setup - B32 did_setup = false; - U8 *trap_swap_bytes = 0; - - if (result.first == 0){ - // TODO(allen): per-Arch implementation of single steps - // set single step bit - if (single_step_thread != 0){ - switch (single_step_thread->arch){ - case Arch_x86: - { - // TODO(allen): possibly buggy - SYMS_RegX86 regs = {0}; - demon_os_read_regs_x86(single_step_thread, ®s); - regs.eflags.u32 |= 0x100; - demon_os_write_regs_x86(single_step_thread, ®s); - }break; - - case Arch_x64: - { - // TODO(allen): possibly buggy - SYMS_RegX64 regs = {0}; - demon_os_read_regs_x64(single_step_thread, ®s); - regs.rflags.u64 |= 0x100; - demon_os_write_regs_x64(single_step_thread, ®s); - }break; - } - } - - // TODO(allen): per-Arch implementation of traps - trap_swap_bytes = push_array_no_zero(scratch.arena, U8, controls->trap_count); - - { - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - if (demon_os_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)){ - U8 int3 = 0xCC; - demon_os_write_memory(trap->process, trap->address, &int3, 1); - } - else{ - trap_swap_bytes[i] = 0xCC; - } - } - } - - did_setup = true; - } - - // do run - B32 did_run = false; - if (did_setup){ - // continue non-frozen threads - DEMON_LNX_EntityNode *resume_threads = 0; - for (DEMON_Entity *process = demon_ent_root->first; - process != 0; - process = process->next){ - if (process->kind == DEMON_EntityKind_Process){ - - // determine if this process is frozen - B32 process_is_frozen = false; - if (controls->run_entities_are_processes){ - for (U64 i = 0; i < controls->run_entity_count; i += 1){ - if (controls->run_entities[i] == process){ - process_is_frozen = true; - break; - } - } - } - - for (DEMON_Entity *thread = process->first; - thread != 0; - thread = thread->next){ - if (thread->kind == DEMON_EntityKind_Thread){ - // determine if this thread is frozen - B32 is_frozen = false; - - if (controls->single_step_thread != 0 && - controls->single_step_thread != thread){ - is_frozen = true; - } - else{ - - if (controls->run_entities_are_processes){ - is_frozen = process_is_frozen; - } - else{ - for (U64 i = 0; i < controls->run_entity_count; i += 1){ - if (controls->run_entities[i] == thread){ - is_frozen = true; - break; - } - } - } - - if (controls->run_entities_are_unfrozen){ - is_frozen = !is_frozen; - } - } - - // continue if not frozen - if (!is_frozen){ - errno = 0; - ptrace(PTRACE_CONT, (pid_t)thread->id, 0, 0); - DEMON_LNX_EntityNode *thread_node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); - SLLStackPush(resume_threads, thread_node); - thread_node->entity = thread; - } - } - } - } - } - - // get next stop - wait_for_stop: - B32 did_dummy_stop = false; - int status = 0; - pid_t wait_id = waitpid(-1, &status, __WALL); - - // increment demon time - demon_time += 1; - - // handle devent - DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, wait_id); - if (thread == 0){ - if (wait_id >= 0){ - // TODO(allen): this isn't a great situation! From what I can tell there's no - // options that I am super happy with for going from unknown tid -> pid. - // We can parse it out of /proc//status; but I don't want to do that until - // I'm forced to, because it seems like this shouldn't happen if the ptrace - // API works correctly and we don't have any bugs in our demon entity system. - } - } - else{ - B32 thread_exit = false; - U64 exit_code = 0; - - DEMON_Entity *process = thread->parent; - // NOTE(allen): hitting this assert should never ever be possible, if our entities - // are wired up correctly. it doesn't matter what ptrace or waitpid are doing. - Assert(process != 0); - - // read register info - U64 instruction_pointer = 0; - union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0}; - - switch (thread->arch){ - case Arch_x86: - { - demon_os_read_regs_x86(thread, ®s.x86); - instruction_pointer = regs.x86.eip.u32; - }break; - - case Arch_x64: - { - demon_os_read_regs_x64(thread, ®s.x64); - instruction_pointer = regs.x64.rip.u64; - }break; - } - - // check stop status - if (WIFEXITED(status)){ - thread_exit = true; - } - if (WIFSIGNALED(status)){ - exit_code = WTERMSIG(status); - thread_exit = true; - } - - // extra event list - DEMON_EventList stop_events = {0}; - - if (WIFSTOPPED(status)){ - switch (WSTOPSIG(status)){ - case SIGTRAP: - { - switch (status >> 8){ - case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): - { - // TODO(allen): (not sure actually, study this part) - thread_exit = true; - }break; - - case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): - { - // new thread coming - unsigned long new_tid = 0; - int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid); - if (get_message_result == -1){ - // TODO(allen): this isn't right, time to give up on getting this process. - // this will likely lead to getting unrecognized wait_id s later. So we need - // this stuff in the log to make sense of it still. - } - else{ - // thread entity - DEMON_Entity *new_thread = demon_ent_new(process, DEMON_EntityKind_Thread, new_tid); - demon_thread_count += 1; - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); - thread_ext->expecting_dummy_sigstop = true; - - // thread event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(new_thread); - } - }break; - - case (SIGTRAP | (PTRACE_EVENT_FORK << 8)): - case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)): - { - // new process coming - unsigned long new_pid = 0; - int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid); - if (get_message_result == -1){ - // TODO(allen): this isn't right, time to give up on getting this process. - // this will likely lead to getting unrecognized wait_id s later. So we need - // this stuff in the log to make sense of it still. - } - else{ - Arch arch = demon_lnx_arch_from_pid(new_pid); - - // process entity - DEMON_Entity *new_process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, new_pid); - new_process->arch = arch; - new_process->ext_u64 = demon_lnx_open_memory_fd_for_pid(new_pid); - - demon_lnx_new_process_pending = false; - - // thread entity - DEMON_Entity *new_thread = demon_ent_new(new_process, DEMON_EntityKind_Thread, new_pid); - demon_thread_count += 1; - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread); - thread_ext->expecting_dummy_sigstop = true; - - // process event - { - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(new_process); - } - - // thread event - { - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(new_process); - e->thread = demon_ent_handle_from_ptr(new_thread); - } - } - }break; - - default: - { - // check single step - DEMON_EventKind e_kind = DEMON_EventKind_Trap; - if (thread == single_step_thread){ - e_kind = DEMON_EventKind_SingleStep; - } - - // check bp - if (e_kind == DEMON_EventKind_Trap){ - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - if (trap->process == process && trap->address == instruction_pointer - 1){ - e_kind = DEMON_EventKind_Breakpoint; - break; - } - } - } - - // adjust ip after breakpoint - if (e_kind == DEMON_EventKind_Breakpoint){ - // TODO(allen): possibly buggy - switch (thread->arch){ - case Arch_x86: - { - instruction_pointer -= 1; - regs.x86.eip.u32 = instruction_pointer; - demon_os_write_regs_x86(thread, ®s.x86); - }break; - - case Arch_x64: - { - instruction_pointer -= 1; - regs.x64.rip.u64 = instruction_pointer; - demon_os_write_regs_x64(thread, ®s.x64); - }break; - } - } - - // event - DEMON_Event *e = demon_push_event(arena, &stop_events, e_kind); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - }break; - } - }break; - - case SIGSTOP: - { - // TODO(allen): we need to figure out how we want to tell apart: - // SIGSTOP All-Stop, SIGSTOP Halt, SIGSTOP "User" - // what we're doing right now == big-time race conditions - - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); - - if (thread_ext->expecting_dummy_sigstop){ - thread_ext->expecting_dummy_sigstop = false; - did_dummy_stop = true; - } - else if (demon_lnx_already_has_halt_injection){ - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Halt); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - } - else{ - // TODO(allen): a signal we don't want to mess with (except to record that it happened maybe) - // we should "hand it back" - } - }break; - - default: - { -#if 0 - // these are a little special. the program cannot continue after these - // unless the user first does something to change the state (move the IP, change a variable, w/e) - case SIGABRT:case SIGFPE:case SIGSEGV: -#endif - - // event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Exception); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->instruction_pointer = instruction_pointer; - e->signo = WSTOPSIG(status); - }break; - } - } - - // entity cleanup - if (thread_exit){ - if (thread->id == process->id){ - // generate events for threads & modules - for (DEMON_Entity *entity = process->first; - entity != 0; - entity = entity->next){ - if (entity->kind == DEMON_EntityKind_Thread){ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(entity); - } - else{ - DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(entity); - } - } - - // exit event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitProcess); - e->process = demon_ent_handle_from_ptr(process); - e->code = exit_code; - - // free entity - demon_ent_release_root_and_children(process); - } - else{ - // exit event - DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - e->code = exit_code; - - // free entity - demon_ent_release_root_and_children(thread); - } - } - - // update all module lists (for each process ...) - DEMON_EventList module_change_events = {0}; - - for (DEMON_Entity *proc_node = demon_ent_root->first; - proc_node != 0; - proc_node = proc_node->next){ - DEMON_LNX_ModuleNode *first_module = demon_lnx_module_list_from_process(scratch.arena, proc_node); - - DEMON_LNX_EntityNode *first_unloaded = 0; - DEMON_LNX_EntityNode *last_unloaded = 0; - - // compute the delta (mark known modules, save list of unloaded modules) - for (DEMON_Entity *entity = proc_node->first; - entity != 0; - entity = entity->next){ - if (entity->kind == DEMON_EntityKind_Module){ - U64 base = entity->id; - U64 name = entity->ext_u64; - B32 still_exists = false; - for (DEMON_LNX_ModuleNode *module_node = first_module; - module_node != 0; - module_node = module_node->next){ - if (module_node->vaddr == base && module_node->name == name){ - module_node->already_known = true; - still_exists = true; - break; - } - } - if (!still_exists){ - DEMON_LNX_EntityNode *node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1); - SLLQueuePush(first_unloaded, last_unloaded, node); - node->entity = entity; - } - } - } - - // handle unloads - for (DEMON_LNX_EntityNode *unloaded_node = first_unloaded; - unloaded_node != 0; - unloaded_node = unloaded_node->next){ - DEMON_Entity *module = unloaded_node->entity; - - // event - { - DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_UnloadModule); - e->process = demon_ent_handle_from_ptr(proc_node); - e->module = demon_ent_handle_from_ptr(module); - } - - // free entity - demon_ent_release_root_and_children(module); - } - - // handle loads - for (DEMON_LNX_ModuleNode *module_node = first_module; - module_node != 0; - module_node = module_node->next){ - if (!module_node->already_known){ - // entity - DEMON_Entity *module = demon_ent_new(proc_node, DEMON_EntityKind_Module, module_node->vaddr); - demon_module_count += 1; - module->ext_u64 = module_node->name; - - // event - { - DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_LoadModule); - e->process = demon_ent_handle_from_ptr(proc_node); - e->module = demon_ent_handle_from_ptr(module); - e->address = module_node->vaddr; - e->size = module_node->size; - } - } - } - } - - // concat the events list (with module changes first) - result.count = module_change_events.count + stop_events.count; - result.first = module_change_events.first; - result.last = module_change_events.last; - if (stop_events.first != 0){ - if (result.first != 0){ - result.last->next = stop_events.first; - result.last = stop_events.last; - } - else{ - result.first = stop_events.first; - result.last = stop_events.last; - } - } - } - - // do we have a reason to keep going? - B32 skip_this_stop = false; - if (did_dummy_stop && result.count == 0){ - skip_this_stop = true; - } - - // ignore this stop, resume and wait again - if (skip_this_stop){ - if (wait_id != 0){ - ptrace(PTRACE_CONT, (pid_t)wait_id, 0, 0); - } - goto wait_for_stop; - } - - // stop all running threads - for (DEMON_LNX_EntityNode *node = resume_threads; - node != 0; - node = node->next){ - DEMON_Entity *thread = node->entity; - pid_t thread_id = (pid_t)thread->id; - if (thread_id != wait_id){ - union sigval sv = {0}; - sigqueue(thread_id, SIGSTOP, sv); - - DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread); - thread_ext->expecting_dummy_sigstop = true; - } - } - - did_run = true; - } - - // cleanup - if (did_run){ - // TODO(allen): per-Arch - // unset traps - { - DEMON_OS_Trap *trap = controls->traps; - for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){ - U8 og_byte = trap_swap_bytes[i]; - if (og_byte != 0xCC){ - demon_os_write_memory(trap->process, trap->address, &og_byte, 1); - } - } - } - - // TODO(allen): per-Arch - // unset single step bit - // the single step bit is automatically unset whenever we single step - // but if *something else* happened, it will still be there ready to - // confound us later; so here we're just being sure it's taken out. - if (single_step_thread != 0){ - // TODO(allen): possibly buggy - switch (single_step_thread->arch){ - case Arch_x86: - { - SYMS_RegX86 regs = {0}; - demon_os_read_regs_x86(single_step_thread, ®s); - regs.eflags.u32 &= ~0x100; - demon_os_write_regs_x86(single_step_thread, ®s); - }break; - - case Arch_x64: - { - SYMS_RegX64 regs = {0}; - demon_os_read_regs_x64(single_step_thread, ®s); - regs.rflags.u64 &= ~0x100; - demon_os_write_regs_x64(single_step_thread, ®s); - }break; - } - } - } - - scratch_end(scratch); - } - - return(result); -} - -internal void -demon_os_halt(U64 code, U64 user_data){ - if (demon_ent_root != 0 && !demon_lnx_already_has_halt_injection){ - DEMON_Entity *process = demon_ent_root->first; - if (process != 0){ - demon_lnx_already_has_halt_injection = true; - demon_lnx_halt_code = code; - demon_lnx_halt_user_data = user_data; - union sigval sv = {0}; - if (sigqueue(process->id, SIGSTOP, sv) == -1){ - demon_lnx_already_has_halt_injection = false; - } - } - } -} - -// NOTE(allen): siginfo hint from old code: -#if 0 -{ - switch (siginfo.si_code){ - // SI_KERNEL (hit int3; 0xCC) - case 0x80: - { - // TODO(allen): breakpoint event - }break; - - // TRAP_UNK, TRAP_HWBKPT, TRAP_BRKPT, TRAP_TRACE - case 0x5: case 0x4: case 0x1: case 0x2: - { - // TODO(allen): breakpoint event (?) - }break; - - case 0x3: case 0x0: - { - // TODO(allen): do nothing I guess? - }break; - } -} -#endif - -//////////////////////////////// -//~ rjf: @demon_os_hooks Target Process Launching/Attaching/Killing/Detaching/Halting - -internal U32 -demon_os_launch_process(OS_LaunchOptions *options){ - U32 result = 0; - Temp scratch = scratch_begin(0, 0); - - // arrange options - char *binary = 0; - char **args = 0; - if (options->cmd_line.node_count > 0){ - args = push_array_no_zero(scratch.arena, char*, options->cmd_line.node_count + 1); - char **arg_ptr = args; - for (String8Node *node = options->cmd_line.first; - node != 0; - node = node->next, arg_ptr += 1){ - String8 string = push_str8_copy(scratch.arena, node->string); - *arg_ptr = (char*)string.str; - } - *arg_ptr = 0; - binary = args[0]; - } - - char *path = 0; - { - String8 string = push_str8_copy(scratch.arena, options->path); - path = (char*)string.str; - } - - char **env = 0; - if (options->env.node_count > 0){ - env = push_array_no_zero(scratch.arena, char*, options->env.node_count + 1); - char **env_ptr = env; - for (String8Node *node = options->env.first; - node != 0; - node = node->next, env_ptr += 1){ - String8 string = push_str8_copy(scratch.arena, node->string); - *env_ptr = (char*)string.str; - } - *env_ptr = 0; - } - - // fork - if (binary != 0){ - pid_t pid = fork(); - if (pid == -1){ - // TODO(allen): fork error - } - else if (pid == 0){ - // NOTE(allen): child process - int ptrace_result = ptrace(PTRACE_TRACEME, 0, 0, 0); - if (ptrace_result != -1){ - int chdir_result = chdir(path); - if (chdir_result != -1){ - execve(binary, args, env); - } - } - // failed to init fully; abort so the parent can clean up the child - abort(); - } - else{ - // NOTE(allen): parent process - - // wait for child - int status = 0; - pid_t wait_id = waitpid(pid, &status, __WALL); - - // determine child launch status - enum{ - LaunchCode_Null, - LaunchCode_FailBeforePtrace, - LaunchCode_FailAfterPtrace, - LaunchCode_Success, - }; - U32 launch_result = LaunchCode_Null; - // NOTE(allen): if wait_id != pid we don't know what that means; study that case before - // deciding how error handling around it works. - if (wait_id == pid){ - if (WIFSTOPPED(status)){ - if (WSTOPSIG(status) == SIGTRAP){ - launch_result = LaunchCode_Success; - } - else{ - launch_result = LaunchCode_FailAfterPtrace; - } - } - else{ - launch_result = LaunchCode_FailBeforePtrace; - } - } - - // handle launch result - switch (launch_result){ - default: - { - // TODO(allen): error that we do not understand - }break; - - case LaunchCode_FailBeforePtrace: - { - // TODO(allen): child ptrace init failed - }break; - - case LaunchCode_FailAfterPtrace: - { - // need to specifically pull the exit status out of the child - // or it will sit around as a zombie forever since it is ptraced. - B32 cleanup_good = false; - int detach_result = ptrace(PTRACE_DETACH, pid, 0, (void*)SIGCONT); - if (detach_result != -1){ - int status_cleanup = 0; - pid_t wait_id_cleanup = waitpid(pid, &status_cleanup, __WALL); - if (wait_id_cleanup == pid){ - cleanup_good = true; - } - } - if (cleanup_good){ - // TODO(allen): child init failed - } - else{ - // TODO(allen): child init failed; something went wrong and a process may have leaked - } - }break; - - case LaunchCode_Success: - { - int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options)); - if (setoptions_result == -1){ - // TODO(allen): ptrace setup failed; need to kill the child and clean it up - } - else{ - result = pid; - - Arch arch = demon_lnx_arch_from_pid(pid); - - // process entity - DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, pid); - demon_proc_count += 1; - process->arch = arch; - process->ext_u64 = demon_lnx_open_memory_fd_for_pid(pid); - - // thread entity - DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, pid); - demon_thread_count += 1; - - // process event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(process); - } - - // thread event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - - // get module list - DEMON_LNX_ModuleNode *module_list = demon_lnx_module_list_from_process(scratch.arena, process); - - // for each module ... - for (DEMON_LNX_ModuleNode *node = module_list; - node != 0; - node = node->next){ - // module entity - DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, node->vaddr); - demon_module_count += 1; - module->ext_u64 = node->name; - - // event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_LoadModule); - e->process = demon_ent_handle_from_ptr(process); - e->module = demon_ent_handle_from_ptr(module); - e->address = node->vaddr; - e->size = node->size; - } - } - - // handshake event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_HandshakeComplete); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - } - }break; - } - } - } - - scratch_end(scratch); - return(result); -} - -internal B32 -demon_os_attach_process(U32 pid){ - B32 result = false; - - Temp scratch = scratch_begin(0, 0); - DEMON_LNX_AttachNode *attachments = 0; - DEMON_LNX_AttachNode *the_process = 0; - - // TODO(allen): double check that this logic only lets us - // "attach" when pid is the id of the main thread of a process. - - // attach this process - B32 attached_proc = false; - if (kill(pid, 0) == -1){ - // TODO(allen): process does not exist - } - else{ - attached_proc = demon_lnx_attach_pid(scratch.arena, pid, &the_process); - if (the_process != 0){ - SLLStackPush(attachments, the_process); - } - } - - // open thread list - if (attached_proc){ - String8 threads_path = push_str8f(scratch.arena, "/proc/%d/task", pid); - DIR *proc_dir = opendir((char*)threads_path.str); - if (proc_dir == 0){ - // TODO(allen): could not read proc threads somehow; no good! - } - else{ - - // attach all threads - B32 attached_all_threads = true; - for (;;){ - struct dirent *entry = readdir(proc_dir); - if (entry == 0){ - break; - } - - String8 name = str8_cstring(entry->d_name); - if (str8_is_integer(name, 10)){ - pid_t tid = u64_from_str8(name, 10); - if (tid != pid){ - DEMON_LNX_AttachNode *new_attachment = 0; - B32 attached_this_thread = demon_lnx_attach_pid(scratch.arena, tid, &new_attachment); - if (new_attachment != 0){ - SLLStackPush(attachments, new_attachment); - } - if (!attached_this_thread){ - attached_all_threads = false; - break; - } - } - } - } - closedir(proc_dir); - - if (attached_all_threads){ - result = true; - } - } - } - - // initialize new entities on success - if (result){ - Arch arch = demon_lnx_arch_from_pid(the_process->pid); - - // process entity - DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, the_process->pid); - demon_proc_count += 1; - process->arch = arch; - process->ext_u64 = demon_lnx_open_memory_fd_for_pid(the_process->pid); - - // process event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateProcess); - e->process = demon_ent_handle_from_ptr(process); - } - - // TODO(allen): happens on windows here? - - for (DEMON_LNX_AttachNode *node = attachments; - node != 0; - node = node->next){ - DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, node->pid); - demon_thread_count += 1; - - // thread event - { - DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events, - DEMON_EventKind_CreateThread); - e->process = demon_ent_handle_from_ptr(process); - e->thread = demon_ent_handle_from_ptr(thread); - } - } - - // TODO(allen): sync modules in process - } - - // cleanup on failure - else{ - for (DEMON_LNX_AttachNode *node = attachments; - node != 0; - node = node->next){ - ptrace(PTRACE_DETACH, node->pid, 0, (void*)SIGCONT); - } - } - - scratch_end(scratch); - return(result); -} - -internal B32 -demon_os_kill_process(DEMON_Entity *process, U32 exit_code){ - B32 result = false; - if (process != 0){ - if (kill(process->id, SIGKILL) != -1){ - result = true; - } - } - return(result); -} - -internal B32 -demon_os_detach_process(DEMON_Entity *process){ - B32 result = false; - if (process != 0){ - int detach_result = ptrace(PTRACE_DETACH, process->id, 0, 0); - result = (detach_result != -1); - } - return(0); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Entity Functions - -//- rjf: cleanup - -internal void -demon_os_entity_cleanup(DEMON_Entity *entity) -{ - // NOTE(rjf): no-op -} - -//- rjf: introspection - -internal String8 -demon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){ - DEMON_Entity *process = module->parent; - int memory_fd = (int)process->ext_u64; - U64 name_va = module->ext_u64; - String8 result = demon_lnx_read_memory_str(arena, memory_fd, name_va); - return(result); -} - -internal U64 -demon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread){ - Temp scratch = scratch_begin(0, 0); - - U64 stack_base = 0; - - DEMON_Entity *process = thread->parent; - - // id for main thread is zero - B32 is_main_thread = (thread->id == process->id); - pid_t match_tid = is_main_thread ? 0 : thread->id; - - // open /proc/$pid/maps - int maps = demon_lnx_open_maps(process->id); - - // look for entry with stack markings and matching thread id - for (;;){ - DEMON_LNX_MapsEntry e; - Temp temp = temp_begin(scratch.arena); - if (!demon_lnx_next_map(temp.arena, maps, &e)){ - break; - } - if (e.type == DEMON_LNX_MapsEntryType_Stack && e.stack_tid == match_tid){ - stack_base = e.address_lo; - break; - } - temp_end(temp); - } - - scratch_end(scratch); - return(stack_base); -} - -internal U64 -demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){ - U64 result = 0; - switch (thread->arch){ - case Arch_x64: - case Arch_x86: - { - U32 fsbase = 0; - pid_t tid = (pid_t)thread->id; - if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){ - result = (U64)fsbase; - } - if (thread->arch == Arch_x64){ - result += 8; - } - else{ - result += 4; - } - }break; - } - return(result); -} - -//- rjf: target process memory allocation/protection - -internal U64 -demon_os_reserve_memory(DEMON_Entity *process, U64 size){ - U64 result = 0; - NotImplemented; - return(result); -} - -internal void -demon_os_set_memory_protect_flags(DEMON_Entity *process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags){ - NotImplemented; -} - -internal void -demon_os_release_memory(DEMON_Entity *process, U64 vaddr, U64 size){ - NotImplemented; -} - -//- rjf: target process memory reading/writing - -internal U64 -demon_os_read_memory(DEMON_Entity *process, void *dst, U64 src_address, U64 size){ - int memory_fd = (int)process->ext_u64; - U64 result = demon_lnx_read_memory(memory_fd, dst, src_address, size); - return(result); -} - -internal B32 -demon_os_write_memory(DEMON_Entity *process, U64 dst_address, void *src, U64 size){ - int memory_fd = (int)process->ext_u64; - B32 result = demon_lnx_write_memory(memory_fd, dst_address, src, size); - return(result); -} - -//- rjf: thread registers reading/writing - -internal B32 -demon_os_read_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *dst){ - B32 result = false; - NotImplemented; - return(result); -} - -internal B32 -demon_os_write_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *src){ - B32 result = false; - NotImplemented; - return(result); -} - -internal B32 -demon_os_read_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *dst){ - pid_t tid = (pid_t)thread->id; - - // gpr - B32 got_gpr = false; - DEMON_LNX_UserX64 ctx = {0}; - struct iovec iov_gpr = {0}; - iov_gpr.iov_len = sizeof(ctx); - iov_gpr.iov_base = &ctx; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr) != -1){ - demon_lnx_regs_x64_from_usr_regs_x64(dst, &ctx.regs); - got_gpr = true; - } - - // fpr - B32 got_fpr = false; - if (got_gpr){ - B32 got_xsave = false; - { - U8 xsave_buffer[KB(4)]; - struct iovec iov_xsave = {0}; - iov_xsave.iov_len = sizeof(xsave_buffer); - iov_xsave.iov_base = xsave_buffer; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave) != -1){ - SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; - syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &xsave->legacy); - - // TODO(allen): this is a lie; ymm can technically move around - // we need some more low-level-assembly-fu to do this hardcore. - B32 has_ymm_registers = ((xsave->header.xstate_bv & 4) != 0); - if (has_ymm_registers){ - syms_x64_regs__set_full_regs_from_xsave_avx_extension(dst, xsave->ymmh); - } - - got_xsave = true; - } - } - - B32 got_fxsave = false; - if (!got_xsave){ - SYMS_XSaveLegacy fxsave = {0}; - struct iovec iov_fxsave = {0}; - iov_fxsave.iov_len = sizeof(fxsave); - iov_fxsave.iov_base = &fxsave; - if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave) != -1){ - syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &fxsave); - got_fxsave = true; - } - } - - if (got_xsave || got_fxsave){ - got_fpr = true; - } - } - - // debug - B32 got_debug = false; - if (got_fpr){ - got_debug = true; - SYMS_Reg32 *dr_d = &dst->dr0; - for (U32 i = 0; i < 8; i += 1, dr_d += 1){ - if (i != 4 && i != 5){ - U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); - errno = 0; - int peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0); - if (errno == 0){ - dr_d->u32 = (U32)peek_result; - } - else{ - got_debug = false; - } - } - } - } - - // got everything - B32 result = got_debug; - return(result); -} - -internal B32 -demon_os_write_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *src){ - pid_t tid = (pid_t)thread->id; - - // gpr - DEMON_LNX_UserX64 ctx = {0}; - demon_lnx_usr_regs_x64_from_regs_x64(&ctx.regs, src); - - struct iovec iov_gpr = {0}; - iov_gpr.iov_base = &ctx; - iov_gpr.iov_len = sizeof(ctx); - int gpr_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr); - B32 gpr_success = (gpr_result != -1); - - // fpr - int xsave_result = 0; - int fxsave_result = 0; - - { - U8 xsave_buffer[KB(4)] = {0}; - SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer; - syms_x64_regs__set_xsave_legacy_from_full_regs(&xsave->legacy, src); - - xsave->header.xstate_bv = 7; - - // TODO(allen): this is a lie; ymm can technically move around - // we need some more low-level-assembly-fu to do this hardcore. - syms_x64_regs__set_xsave_avx_extension_from_full_regs(xsave->ymmh, src); - - { - struct iovec iov_xsave = {0}; - iov_xsave.iov_base = &xsave; - iov_xsave.iov_len = sizeof(xsave); - xsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave); - } - - if (xsave_result == -1){ - struct iovec iov_fxsave = {0}; - iov_fxsave.iov_base = &xsave->legacy; - iov_fxsave.iov_len = sizeof(xsave->legacy); - fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave); - } - } - - B32 fpr_success = (xsave_result != -1 || fxsave_result != -1); - - // debug - B32 dr_success = true; - { - SYMS_Reg32 *dr_s = &src->dr0; - for (U32 i = 0; i < 8; i += 1, dr_s += 1){ - if (i != 4 && i != 5){ - U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]); - errno = 0; - int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s->u32); - if (poke_result == -1){ - dr_success = false; - } - } - } - } - - // assemble result - B32 result = (gpr_success && fpr_success && dr_success); - - return(result); -} - -//////////////////////////////// -//~ rjf: @demon_os_hooks Process Listing - -internal void -demon_os_proc_iter_begin(DEMON_ProcessIter *iter){ - DIR *dir = opendir("/proc"); - MemoryZeroStruct(iter); - iter->v[0] = IntFromPtr(dir); -} - -internal B32 -demon_os_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out){ - // scan for a process id - B32 got_pid = false; - String8 pid_string = {0}; - - DIR *dir = (DIR*)PtrFromInt(iter->v[0]); - if (dir != 0 && iter->v[1] == 0){ - for (;;){ - struct dirent *d = readdir(dir); - if (d == 0){ - break; - } - - // check file name is integer - String8 file_name = str8_cstring((char*)d->d_name); - B32 is_integer = str8_is_integer(file_name, 10); - - // break on integers (which represent processes) - if (is_integer){ - got_pid = true; - pid_string = file_name; - break; - } - } - } - - // mark iterator dead if nothing found - if (!got_pid){ - iter->v[1] = 1; - } - - // if got process id convert pid -> process info - B32 result = false; - if (got_pid){ - // determine the name we will report - pid_t pid = u64_from_str8(pid_string, 10); - String8 name = demon_lnx_executable_path_from_pid(arena, pid); - if (name.size == 0){ - name = str8_lit(""); - } - - // finish conversion - info_out->name = name; - info_out->pid = pid; - result = true; - } - - return(result); -} - -internal void -demon_os_proc_iter_end(DEMON_ProcessIter *iter){ - DIR *dir = (DIR*)PtrFromInt(iter->v[0]); - if (dir != 0){ - closedir(dir); - } - MemoryZeroStruct(iter); -} diff --git a/src/demon/linux/demon_os_linux.h b/src/demon/linux/demon_os_linux.h deleted file mode 100644 index ae737f75..00000000 --- a/src/demon/linux/demon_os_linux.h +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_OS_LINUX_H -#define DEMON_OS_LINUX_H - -// TODO(allen): Potential Upgrades: -// -// memory fd upgrade - Right now for each process we hold open a file -// descriptor for the process's memory (/proc/%d/mem) for the entire lifetime -// of the process; it could be opened and closed with some kind of LRU cache -// to put a finite cap on the number of handles the demon holds -// - -//////////////////////////////// -//~ NOTE(allen): Get The Linux Includes - -#include -#include -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ NOTE(allen): Linux Demon Types - -//- entities - -// Demon Linux Entity Extensions -// Process: ext_u64 set to memory file descriptor -// Thread : ext_u64 cast to DEMON_LNX_ThreadExt -// Module : ext_u64 set to U64 (address of name) - -struct DEMON_LNX_ThreadExt{ - B32 expecting_dummy_sigstop; -}; -StaticAssert(sizeof(DEMON_LNX_ThreadExt) <= sizeof(Member(DEMON_Entity, ext_u64)), check_demon_lnx_thread_ext); - -//- helpers - -struct DEMON_LNX_AttachNode{ - DEMON_LNX_AttachNode *next; - pid_t pid; -}; - -struct DEMON_LNX_ProcessAux{ - B32 filled; - U64 phnum; - U64 phent; - U64 phdr; - U64 execfn; -}; - -struct DEMON_LNX_PhdrInfo{ - Rng1U64 range; - U64 dynamic; -}; - -struct DEMON_LNX_ModuleNode{ - DEMON_LNX_ModuleNode *next; - U64 vaddr; - U64 size; - U64 name; - U64 already_known; -}; - -struct DEMON_LNX_EntityNode{ - DEMON_LNX_EntityNode *next; - DEMON_Entity *entity; -}; - -//////////////////////////////// -//~ NOTE(allen): Linux Demon Register Layouts - -// these are defined in but only for one architecture at a time -// (and we can't really trick it into giving us both in any obvious way) -// we define them here so that we have them all "at once" - -struct DEMON_LNX_UserRegsX64{ - U64 r15; - U64 r14; - U64 r13; - U64 r12; - U64 rbp; - U64 rbx; - U64 r11; - U64 r10; - U64 r9; - U64 r8; - U64 rax; - U64 rcx; - U64 rdx; - U64 rsi; - U64 rdi; - U64 orig_rax; - U64 rip; - U64 cs; - U64 rflags; - U64 rsp; - U64 ss; - U64 fsbase; - U64 gsbase; - U64 ds; - U64 es; - U64 fs; - U64 gs; -}; - -struct DEMON_LNX_UserX64{ - DEMON_LNX_UserRegsX64 regs; - S32 u_fpvalid, _pad0; - SYMS_XSaveLegacy i387; - U64 u_tsize, u_dsize, u_ssize, start_code, start_stack; - U64 signal; - S32 reserved, _pad1; - U64 u_ar0, u_fpstate; - U64 magic; - U8 u_comm[32]; - U64 u_debugreg[8]; -}; - -struct DEMON_LNX_UserRegsX86{ - U32 ebx; - U32 ecx; - U32 edx; - U32 esi; - U32 edi; - U32 ebp; - U32 eax; - U32 ds; - U32 es; - U32 fs; - U32 gs; - U32 orig_eax; - U32 eip; - U32 cs; - U32 eflags; - U32 sp; - U32 ss; -}; - -struct DEMON_LNX_UserX86{ - DEMON_LNX_UserRegsX86 regs; - S32 u_fpvalid; - SYMS_FSave i387; - U32 u_tsize, u_dsize, u_ssize, start_code, start_stack; - S32 signal, reserved; - U32 u_ar0, u_fpstate; - U32 magic; - U8 u_comm[32]; - U32 u_debugreg[8]; -}; - -//////////////////////////////// - -enum -{ - DEMON_LNX_PermFlags_Read = (1 << 0), - DEMON_LNX_PermFlags_Write = (1 << 1), - DEMON_LNX_PermFlags_Exec = (1 << 2), - DEMON_LNX_PermFlags_Private = (1 << 3) -}; -typedef int DEMON_LNX_PermFlags; - -enum -{ - DEMON_LNX_MapsEntryType_Null, - DEMON_LNX_MapsEntryType_Path, - DEMON_LNX_MapsEntryType_Heap, - DEMON_LNX_MapsEntryType_Stack, - DEMON_LNX_MapsEntryType_VDSO, -}; -typedef int DEMON_LNX_MapsEntryType; - -struct DEMON_LNX_MapsEntry -{ - U64 address_lo; - U64 address_hi; - DEMON_LNX_PermFlags perms; - U64 offset; - U32 dev_major; - U32 dev_minor; - U64 inode; - String8 pathname; - DEMON_LNX_MapsEntryType type; - pid_t stack_tid; -}; - -//////////////////////////////// -//~ rjf: Helpers - -internal DEMON_LNX_ThreadExt* demon_lnx_thread_ext(DEMON_Entity *entity); - -internal B32 demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node); - -internal String8 demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid); -internal int demon_lnx_open_memory_fd_for_pid(pid_t pid); - -internal Arch demon_lnx_arch_from_pid(pid_t pid); -internal DEMON_LNX_ProcessAux demon_lnx_aux_from_pid(pid_t pid, Arch arch); -internal DEMON_LNX_PhdrInfo demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, - U64 phvaddr, U64 phstride, U64 phcount); -internal DEMON_LNX_ModuleNode* demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process); - -internal U64 demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size); -internal B32 demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size); -internal String8 demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address); - -internal void demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src); -internal void demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src); - -internal String8 demon_lnx_read_int_string(int fd); -internal B32 demon_lnx_read_expect(int fd, char expect); -internal int demon_lnx_read_whitespace(int fd); -internal String8 demon_lnx_read_string(Arena *arena, int fd); - -internal int demon_lnx_open_maps(pid_t pid); -internal B32 demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out); - -#endif //DEMON_OS_LINUX_H diff --git a/src/linker/lnk.c b/src/linker/lnk.c index d0643301..1f2368cf 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -17,7 +17,6 @@ // --- Code Base --------------------------------------------------------------- #include "base/base_inc.h" -#include "os/os_inc.h" #include "hash_table.h" #include "coff/coff.h" #include "coff/coff_parse.h" @@ -37,7 +36,6 @@ #include "llvm/llvm.h" #include "base/base_inc.c" -#include "os/os_inc.c" #include "hash_table.c" #include "coff/coff.c" #include "coff/coff_parse.c" diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index ae447aab..eb4fb355 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1,2 +1,1573 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Helpers + +internal DateTime +os_lnx_date_time_from_tm(tm in, U32 msec) +{ + DateTime dt = {0}; + dt.sec = in.tm_sec; + dt.min = in.tm_min; + dt.hour = in.tm_hour; + dt.day = in.tm_mday-1; + dt.mon = in.tm_mon; + dt.year = in.tm_year+1900; + dt.msec = msec; + return dt; +} + +internal tm +os_lnx_tm_from_date_time(DateTime dt) +{ + tm result = {0}; + result.tm_sec = dt.sec; + result.tm_min = dt.min; + result.tm_hour= dt.hour; + result.tm_mday= dt.day+1; + result.tm_mon = dt.mon; + result.tm_year= dt.year-1900; + return result; +} + +internal timespec +os_lnx_timespec_from_date_time(DateTime dt) +{ + tm tm_val = os_lnx_tm_from_date_time(dt); + time_t seconds = timegm(&tm_val); + timespec result = {0}; + result.tv_sec = seconds; + return result; +} + +internal DenseTime +os_lnx_dense_time_from_timespec(timespec in) +{ + DenseTime result = 0; + { + struct tm tm_time = {0}; + gmtime_r(&in.tv_sec, &tm_time); + DateTime date_time = os_lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1)); + result = dense_time_from_date_time(date_time); + } + return result; +} + +internal FileProperties +os_lnx_file_properties_from_stat(struct stat *s) +{ + FileProperties props = {0}; + props.size = s->st_size; + props.created = os_lnx_dense_time_from_timespec(s->st_ctim); + props.modified = os_lnx_dense_time_from_timespec(s->st_mtim); + if(s->st_mode & S_IFDIR) + { + props.flags |= FilePropertyFlag_IsFolder; + } + return props; +} + +internal void +os_lnx_safe_call_sig_handler(int x) +{ + OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain; + if(chain != 0 && chain->fail_handler != 0) + { + chain->fail_handler(chain->ptr); + } + abort(); +} + +//////////////////////////////// +//~ rjf: Entities + +internal OS_LNX_Entity * +os_lnx_entity_alloc(OS_LNX_EntityKind kind) +{ + OS_LNX_Entity *entity = 0; + DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), + pthread_mutex_unlock(&os_lnx_state.entity_mutex)) + { + entity = os_lnx_state.entity_free; + if(entity) + { + SLLStackPop(os_lnx_state.entity_free); + } + else + { + entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1); + } + } + MemoryZeroStruct(entity); + entity->kind = kind; + return entity; +} + +internal void +os_lnx_entity_release(OS_LNX_Entity *entity) +{ + DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), + pthread_mutex_unlock(&os_lnx_state.entity_mutex)) + { + SLLStackPush(os_lnx_state.entity_free, entity); + } +} + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal void * +os_lnx_thread_entry_point(void *ptr) +{ + OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr; + ThreadEntryPointFunctionType *func = entity->thread.func; + void *thread_ptr = entity->thread.ptr; + supplement_thread_base_entry_point(func, thread_ptr); + return 0; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Platform Time Functions + +internal U64 +now_time_us(void) +{ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); + return result; +} + +internal U32 +now_time_unix(void) +{ + time_t t = time(0); + return (U32)t; +} + +internal DateTime +now_time_universal(void) +{ + time_t t = 0; + time(&t); + struct tm universal_tm = {0}; + gmtime_r(&t, &universal_tm); + DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); + return result; +} + +internal DateTime +universal_from_local_time(DateTime *dt) +{ + // rjf: local DateTime -> universal time_t + tm local_tm = os_lnx_tm_from_date_time(*dt); + local_tm.tm_isdst = -1; + time_t universal_t = mktime(&local_tm); + + // rjf: universal time_t -> DateTime + tm universal_tm = {0}; + gmtime_r(&universal_t, &universal_tm); + DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); + return result; +} + +internal DateTime +local_from_universal_time(DateTime *dt) +{ + // rjf: universal DateTime -> local time_t + tm universal_tm = os_lnx_tm_from_date_time(*dt); + universal_tm.tm_isdst = -1; + time_t universal_t = timegm(&universal_tm); + tm local_tm = {0}; + localtime_r(&universal_t, &local_tm); + + // rjf: local tm -> DateTime + DateTime result = os_lnx_date_time_from_tm(local_tm, 0); + return result; +} + +internal void +sleep_ms(U32 ms) +{ + usleep(ms*Thousand(1)); +} + +//////////////////////////////// +//~ rjf: @per_os_impl Platform GUID Functions + +internal Guid +make_guid(void) +{ + Guid guid = {0}; + getrandom(guid.v, sizeof(guid.v), 0); + guid.data3 &= 0x0fff; + guid.data3 |= (4 << 12); + guid.data4[0] &= 0x3f; + guid.data4[0] |= 0x80; + return guid; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Platform Memory Allocation + +//- rjf: basic + +internal void * +reserve_memory(U64 size) +{ + void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if(result == MAP_FAILED) + { + result = 0; + } + return result; +} + +internal B32 +commit_memory(void *ptr, U64 size) +{ + mprotect(ptr, size, PROT_READ|PROT_WRITE); + return 1; +} + +internal void +decommit_memory(void *ptr, U64 size) +{ + madvise(ptr, size, MADV_DONTNEED); + mprotect(ptr, size, PROT_NONE); +} + +internal void +release_memory(void *ptr, U64 size) +{ + munmap(ptr, size); +} + +//- rjf: large pages + +internal void * +reserve_memory_large(U64 size) +{ + void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0); + if(result == MAP_FAILED) + { + result = 0; + } + return result; +} + +internal B32 +commit_memory_large(void *ptr, U64 size) +{ + mprotect(ptr, size, PROT_READ|PROT_WRITE); + return 1; +} + +//////////////////////////////// +//~ rjf: @os_hooks Shared Memory + +internal SharedMemory +shared_memory_alloc(U64 size, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = push_str8_copy(scratch.arena, name); + int id = shm_open((char *)name_copy.str, O_RDWR|O_CREAT, 0666); + ftruncate(id, size); + SharedMemory result = {(U64)id}; + scratch_end(scratch); + return result; +} + +internal SharedMemory +shared_memory_open(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = push_str8_copy(scratch.arena, name); + int id = shm_open((char *)name_copy.str, O_RDWR, 0); + SharedMemory result = {(U64)id}; + scratch_end(scratch); + return result; +} + +internal void +shared_memory_close(SharedMemory handle) +{ + if(MemoryIsZeroStruct(&handle)){return;} + int id = (int)handle.u64[0]; + close(id); +} + +internal void * +shared_memory_view_open(SharedMemory handle, Rng1U64 range) +{ + if(MemoryIsZeroStruct(&handle)){return 0;} + int id = (int)handle.u64[0]; + void *base = mmap(0, dim_1u64(range), PROT_READ|PROT_WRITE, MAP_SHARED, id, range.min); + if(base == MAP_FAILED) + { + base = 0; + } + return base; +} + +internal void +shared_memory_view_close(SharedMemory handle, void *ptr, Rng1U64 range) +{ + if(MemoryIsZeroStruct(&handle)){return;} + munmap(ptr, dim_1u64(range)); +} + +//////////////////////////////// +//~ rjf: @per_os_impl System Info + +internal SystemInfo * +get_system_info(void) +{ + return &os_lnx_state.system_info; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Current Thread Info + +internal U32 +tid(void) +{ + U32 result = gettid(); + return result; +} + +internal void +set_platform_thread_name(String8 name) +{ + Temp scratch = scratch_begin(0, 0); + String8 name_copy = str8_copy(scratch.arena, name); + pthread_t current_thread = pthread_self(); + pthread_setname_np(current_thread, (char *)name_copy.str); + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: @per_os_impl Thread Functions + +internal Thread +thread_launch(ThreadEntryPointFunctionType *f, void *p) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread); + entity->thread.func = f; + entity->thread.ptr = p; + { + int pthread_result = pthread_create(&entity->thread.handle, 0, os_lnx_thread_entry_point, entity); + if(pthread_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + } + Thread handle = {(U64)entity}; + return handle; +} + +internal B32 +thread_join(Thread thread, U64 endt_us) +{ + if(MemoryIsZeroStruct(&thread)) { return 0; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)thread.u64[0]; + int join_result = pthread_join(entity->thread.handle, 0); + B32 result = (join_result == 0); + os_lnx_entity_release(entity); + return result; +} + +internal void +thread_detach(Thread thread) +{ + if(MemoryIsZeroStruct(&thread)) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)thread.u64[0]; + os_lnx_entity_release(entity); +} + +//////////////////////////////// +//~ rjf: @per_os_impl Synchronization Primitive Functions + +//- rjf: recursive mutexes + +internal Mutex +mutex_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex); + int init_result = pthread_mutex_init(&entity->mutex_handle, 0); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + Mutex handle = {(U64)entity}; + return handle; +} + +internal void +mutex_release(Mutex mutex) +{ + if(MemoryIsZeroStruct(&mutex)) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_destroy(&entity->mutex_handle); + os_lnx_entity_release(entity); +} + +internal void +mutex_take(Mutex mutex) +{ + if(MemoryIsZeroStruct(&mutex)) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_lock(&entity->mutex_handle); +} + +internal void +mutex_drop(Mutex mutex) +{ + if(MemoryIsZeroStruct(&mutex)) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_mutex_unlock(&entity->mutex_handle); +} + +//- rjf: reader/writer mutexes + +internal RWMutex +rw_mutex_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex); + int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + RWMutex handle = {(U64)entity}; + return handle; +} + +internal void +rw_mutex_release(RWMutex mutex) +{ + if(MemoryIsZeroStruct(&mutex)) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_rwlock_destroy(&entity->rwmutex_handle); + os_lnx_entity_release(entity); +} + +internal void +rw_mutex_take(RWMutex mutex, B32 write_mode) +{ + if(MemoryIsZeroStruct(&mutex)) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + if(write_mode) + { + pthread_rwlock_wrlock(&entity->rwmutex_handle); + } + else + { + pthread_rwlock_rdlock(&entity->rwmutex_handle); + } +} + +internal void +rw_mutex_drop(RWMutex mutex, B32 write_mode) +{ + if(MemoryIsZeroStruct(&mutex)) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + pthread_rwlock_unlock(&entity->rwmutex_handle); +} + +//- rjf: condition variables + +internal CondVar +cond_var_alloc(void) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable); + int init_result = pthread_cond_init(&entity->cv.cond_handle, 0); + if(init_result == -1) + { + os_lnx_entity_release(entity); + entity = 0; + } + int init2_result = 0; + if(entity) + { + init2_result = pthread_mutex_init(&entity->cv.rwlock_mutex_handle, 0); + } + if(init2_result == -1) + { + pthread_cond_destroy(&entity->cv.cond_handle); + os_lnx_entity_release(entity); + entity = 0; + } + CondVar handle = {(U64)entity}; + return handle; +} + +internal void +cond_var_release(CondVar cv) +{ + if(MemoryIsZeroStruct(&cv)) { return; } + OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_destroy(&entity->cv.cond_handle); + pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle); + os_lnx_entity_release(entity); +} + +internal B32 +cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us) +{ + if(MemoryIsZeroStruct(&cv)) { return 0; } + if(MemoryIsZeroStruct(&mutex)) { return 0; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0]; + struct timespec endt_timespec; + endt_timespec.tv_sec = endt_us/Million(1); + endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); + int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &mutex_entity->mutex_handle, &endt_timespec); + B32 result = (wait_result != ETIMEDOUT); + return result; +} + +internal B32 +cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) +{ + // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack + // this together, but this would probably just be a lot better if we just + // implemented the primitives ourselves with e.g. futexes + // + if(MemoryIsZeroStruct(&cv)) { return 0; } + if(MemoryIsZeroStruct(&mutex_rw)) { return 0; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; + struct timespec endt_timespec; + endt_timespec.tv_sec = endt_us/Million(1); + endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); + B32 result = 0; + pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle); + pthread_rwlock_unlock(&rw_mutex_entity->rwmutex_handle); + for(;;) + { + int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec); + if(wait_result != ETIMEDOUT) + { + if(write_mode) + { + pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle); + } + else + { + pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle); + } + result = 1; + break; + } + if(wait_result == ETIMEDOUT) + { + if(write_mode) + { + pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle); + } + else + { + pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle); + } + break; + } + } + pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); + return result; +} + +internal void +cond_var_signal(CondVar cv) +{ + if(MemoryIsZeroStruct(&cv)) { return; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_signal(&cv_entity->cv.cond_handle); +} + +internal void +cond_var_broadcast(CondVar cv) +{ + if(MemoryIsZeroStruct(&cv)) { return; } + OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + pthread_cond_broadcast(&cv_entity->cv.cond_handle); +} + +//- rjf: cross-process semaphores + +internal Semaphore +semaphore_alloc(U32 initial_count, U32 max_count, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + Semaphore result = {0}; + if(name.size > 0) + { + for EachIndex(attempt_idx, 64) + { + String8 name_copy = str8_copy(scratch.arena, name); + sem_t *s = sem_open((char *)name_copy.str, O_CREAT | O_EXCL, 0666, initial_count); + if(s == SEM_FAILED) + { + s = sem_open((char *)name_copy.str, 0); + } + if(s != SEM_FAILED) + { + result.u64[0] = (U64)s; + break; + } + } + } + else + { + sem_t *s = mmap(0, sizeof(*s), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + AssertAlways(s != MAP_FAILED); + int err = sem_init(s, 0, initial_count); + if(err == 0) + { + result.u64[0] = (U64)s; + } + } + scratch_end(scratch); + return result; +} + +internal void +semaphore_release(Semaphore semaphore) +{ + int err = munmap((void*)semaphore.u64[0], sizeof(sem_t)); + AssertAlways(err == 0); +} + +internal Semaphore +semaphore_open(String8 name) +{ + Semaphore result = {0}; + { + Temp scratch = scratch_begin(0, 0); + String8 name_copy = str8_copy(scratch.arena, name); + sem_t *s = sem_open((char *)name_copy.str, 0); + if(s != SEM_FAILED) + { + result.u64[0] = (U64)s; + } + scratch_end(scratch); + } + return result; +} + +internal void +semaphore_close(Semaphore semaphore) +{ + sem_t *s = (sem_t *)semaphore.u64[0]; + sem_close(s); +} + +internal B32 +semaphore_take(Semaphore semaphore, U64 endt_us) +{ + // TODO(rjf): we need to use `sem_timedwait` here. + AssertAlways(endt_us == max_U64); + for(;;) + { + int err = sem_wait((sem_t*)semaphore.u64[0]); + if(err == 0) + { + break; + } + else if(errno == EAGAIN) + { + continue; + } + break; + } + return 1; +} + +internal void +semaphore_drop(Semaphore semaphore) +{ + for(;;) + { + int err = sem_post((sem_t*)semaphore.u64[0]); + if(err == 0) + { + break; + } + else + { + if(errno == EAGAIN) + { + continue; + } + } + break; + } +} + +//- rjf: barriers + +internal Barrier +barrier_alloc(U64 count) +{ + OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Barrier); + if(entity != 0) + { + pthread_barrier_init(&entity->barrier, 0, count); + } + Barrier result = {IntFromPtr(entity)}; + return result; +} + +internal void +barrier_release(Barrier barrier) +{ + OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]); + if(entity != 0) + { + pthread_barrier_destroy(&entity->barrier); + os_lnx_entity_release(entity); + } +} + +internal void +barrier_wait(Barrier barrier) +{ + OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]); + if(entity != 0) + { + pthread_barrier_wait(&entity->barrier); + } +} + +//////////////////////////////// +//~ rjf: @per_os_impl Safe Calls + +internal void +safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr) +{ + // rjf: push handler to chain + OS_LNX_SafeCallChain chain = {0}; + SLLStackPush(os_lnx_safe_call_chain, &chain); + chain.fail_handler = fail_handler; + chain.ptr = ptr; + + // rjf: set up sig handler info + struct sigaction new_act = {0}; + new_act.sa_handler = os_lnx_safe_call_sig_handler; + int signals_to_handle[] = + { + SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, + }; + struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; + + // rjf: attach handler info for all signals + for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) + { + sigaction(signals_to_handle[i], &new_act, &og_act[i]); + } + + // rjf: call function + func(ptr); + + // rjf: reset handler info for all signals + for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) + { + sigaction(signals_to_handle[i], &og_act[i], 0); + } +} + +//////////////////////////////// +//~ rjf: @per_os_impl File System (Implemented Per-OS) + +//- rjf: files + +internal File +file_open(AccessFlags flags, String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + int lnx_flags = 0; + if(flags & AccessFlag_Read && flags & AccessFlag_Write) + { + lnx_flags = O_RDWR; + } + else if(flags & AccessFlag_Write) + { + lnx_flags = O_WRONLY; + } + else if(flags & AccessFlag_Read) + { + lnx_flags = O_RDONLY; + } + if(flags & AccessFlag_Append) + { + lnx_flags |= O_APPEND; + } + if(flags & (AccessFlag_Write|AccessFlag_Append)) + { + lnx_flags |= O_CREAT; + } + lnx_flags |= O_CLOEXEC; + int fd = open((char *)path_copy.str, lnx_flags, 0755); + File handle = {0}; + if(fd != -1) + { + handle.u64[0] = fd; + } + scratch_end(scratch); + return handle; +} + +internal void +file_close(File file) +{ + if(file_match(file, file_zero())) { return; } + int fd = (int)file.u64[0]; + close(fd); +} + +internal U64 +file_read(File file, Rng1U64 rng, void *out_data) +{ + if(file_match(file, file_zero())) { return 0; } + int fd = (int)file.u64[0]; + U64 total_num_bytes_to_read = dim_1u64(rng); + U64 total_num_bytes_read = 0; + U64 total_num_bytes_left_to_read = total_num_bytes_to_read; + for(;total_num_bytes_left_to_read > 0;) + { + int read_result = pread(fd, (U8 *)out_data + total_num_bytes_read, total_num_bytes_left_to_read, rng.min + total_num_bytes_read); + if(read_result >= 0) + { + total_num_bytes_read += read_result; + total_num_bytes_left_to_read -= read_result; + } + else if(errno != EINTR) + { + break; + } + } + return total_num_bytes_read; +} + +internal U64 +file_write(File file, Rng1U64 rng, void *data) +{ + if(file_match(file, file_zero())) { return 0; } + int fd = (int)file.u64[0]; + U64 total_num_bytes_to_write = dim_1u64(rng); + U64 total_num_bytes_written = 0; + U64 total_num_bytes_left_to_write = total_num_bytes_to_write; + for(;total_num_bytes_left_to_write > 0;) + { + int write_result = pwrite(fd, (U8 *)data + total_num_bytes_written, total_num_bytes_left_to_write, rng.min + total_num_bytes_written); + if(write_result >= 0) + { + total_num_bytes_written += write_result; + total_num_bytes_left_to_write -= write_result; + } + else if(errno != EINTR) + { + break; + } + } + return total_num_bytes_written; +} + +internal B32 +file_set_times(File file, DateTime date_time) +{ + if(file_match(file, file_zero())) { return 0; } + int fd = (int)file.u64[0]; + timespec time = os_lnx_timespec_from_date_time(date_time); + timespec times[2] = {time, time}; + int futimens_result = futimens(fd, times); + B32 good = (futimens_result != -1); + return good; +} + +internal FileProperties +properties_from_file(File file) +{ + if(file_match(file, file_zero())) { return (FileProperties){0}; } + int fd = (int)file.u64[0]; + struct stat fd_stat = {0}; + int fstat_result = fstat(fd, &fd_stat); + FileProperties props = {0}; + if(fstat_result != -1) + { + props = os_lnx_file_properties_from_stat(&fd_stat); + } + return props; +} + +internal FileID +id_from_file(File file) +{ + if(file_match(file, file_zero())) { return (FileID){0}; } + int fd = (int)file.u64[0]; + struct stat fd_stat = {0}; + int fstat_result = fstat(fd, &fd_stat); + FileID id = {0}; + if(fstat_result != -1) + { + id.v[0] = fd_stat.st_dev; + id.v[1] = fd_stat.st_ino; + } + return id; +} + +internal B32 +delete_file_at_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = 0; + String8 path_copy = push_str8_copy(scratch.arena, path); + if(remove((char *)path_copy.str) != -1) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +internal B32 +copy_file_path(String8 dst, String8 src) +{ + B32 result = 0; + File src_h = file_open(AccessFlag_Read, src); + File dst_h = file_open(AccessFlag_Write, dst); + if(!file_match(src_h, file_zero()) && + !file_match(dst_h, file_zero())) + { + int src_fd = (int)src_h.u64[0]; + int dst_fd = (int)dst_h.u64[0]; + FileProperties src_props = properties_from_file(src_h); + U64 size = src_props.size; + U64 total_bytes_copied = 0; + U64 bytes_left_to_copy = size; + for(;bytes_left_to_copy > 0;) + { + off_t sendfile_off = total_bytes_copied; + int send_result = sendfile(dst_fd, src_fd, &sendfile_off, bytes_left_to_copy); + if(send_result <= 0) + { + break; + } + U64 bytes_copied = (U64)send_result; + bytes_left_to_copy -= bytes_copied; + total_bytes_copied += bytes_copied; + } + } + file_close(src_h); + file_close(dst_h); + return result; +} + +internal B32 +move_file_path(String8 dst, String8 src) +{ + B32 good = 0; + Temp scratch = scratch_begin(0, 0); + { + char *src_cstr = (char *)str8_copy(scratch.arena, src).str; + char *dst_cstr = (char *)str8_copy(scratch.arena, dst).str; + int rename_result = rename(src_cstr, dst_cstr); + good = (rename_result != -1); + } + scratch_end(scratch); + return good; +} + +internal String8 +full_path_from_path(Arena *arena, String8 path) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 path_copy = str8_copy(scratch.arena, path); + char buffer[PATH_MAX] = {0}; + realpath((char *)path_copy.str, buffer); + String8 result = str8_copy(arena, str8_cstring(buffer)); + scratch_end(scratch); + return result; +} + +internal B32 +file_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + int access_result = access((char *)path_copy.str, F_OK); + B32 result = 0; + if(access_result == 0) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +internal B32 +folder_path_exists(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 exists = 0; + String8 path_copy = str8_copy(scratch.arena, path); + DIR *handle = opendir((char *)path_copy.str); + if(handle) + { + closedir(handle); + exists = 1; + } + scratch_end(scratch); + return exists; +} + +internal FileProperties +properties_from_file_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = str8_copy(scratch.arena, path); + struct stat f_stat = {0}; + int stat_result = stat((char *)path_copy.str, &f_stat); + FileProperties props = {0}; + if(stat_result != -1) + { + props = os_lnx_file_properties_from_stat(&f_stat); + } + scratch_end(scratch); + return props; +} + +//- rjf: file maps + +internal FileMap +file_map_open(AccessFlags flags, File file) +{ + FileMap map = {file.u64[0]}; + return map; +} + +internal void +file_map_close(FileMap map) +{ + // NOTE(rjf): nothing to do; `map` handles are the same as `file` handles in + // the linux implementation (on Windows they require separate handles) +} + +internal void * +file_map_view_open(FileMap map, AccessFlags flags, Rng1U64 range) +{ + if(MemoryIsZeroStruct(&map)) { return 0; } + int fd = (int)map.u64[0]; + int prot_flags = 0; + if(flags & AccessFlag_Write) { prot_flags |= PROT_WRITE; } + if(flags & AccessFlag_Read) { prot_flags |= PROT_READ; } + int map_flags = MAP_PRIVATE; + void *base = mmap(0, dim_1u64(range), prot_flags, map_flags, fd, range.min); + if(base == MAP_FAILED) + { + base = 0; + } + return base; +} + +internal void +file_map_view_close(FileMap map, void *ptr, Rng1U64 range) +{ + munmap(ptr, dim_1u64(range)); +} + +//- rjf: directory iteration + +internal FileIter * +file_iter_begin(Arena *arena, String8 path, FileIterFlags flags) +{ + FileIter *base_iter = push_array(arena, FileIter, 1); + base_iter->flags = flags; + OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory; + { + String8 path_copy = push_str8_copy(arena, path); + iter->dir = opendir((char *)path_copy.str); + iter->path = path_copy; + } + return base_iter; +} + +internal B32 +file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out) +{ + B32 good = 0; + OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; + for(;lnx_iter->dir != 0;) + { + // rjf: get next entry + lnx_iter->dp = readdir(lnx_iter->dir); + good = (lnx_iter->dp != 0); + + // rjf: unpack entry info + struct stat st = {0}; + int stat_result = 0; + if(good) + { + Temp scratch = scratch_begin(&arena, 1); + String8 full_path = push_str8f(scratch.arena, "%S/%s", lnx_iter->path, lnx_iter->dp->d_name); + stat_result = stat((char *)full_path.str, &st); + scratch_end(scratch); + } + + // rjf: determine if filtered + B32 filtered = 0; + if(good) + { + filtered = ((st.st_mode == S_IFDIR && iter->flags & FileIterFlag_SkipFolders) || + (st.st_mode == S_IFREG && iter->flags & FileIterFlag_SkipFiles) || + (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == 0) || + (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == '.' && lnx_iter->dp->d_name[2] == 0)); + } + + // rjf: output & exit, if good & unfiltered + if(good && !filtered) + { + info_out->name = push_str8_copy(arena, str8_cstring(lnx_iter->dp->d_name)); + if(stat_result != -1) + { + info_out->props = os_lnx_file_properties_from_stat(&st); + } + break; + } + + // rjf: exit if not good + if(!good) + { + break; + } + } + return good; +} + +internal void +file_iter_end(FileIter *iter) +{ + OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; + closedir(lnx_iter->dir); +} + +//- rjf: directory creation + +internal B32 +make_directory(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = 0; + String8 path_copy = push_str8_copy(scratch.arena, path); + if(mkdir((char *)path_copy.str, 0755) != -1) + { + result = 1; + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Aborting + +internal void +abort_self(S32 exit_code) +{ + exit(exit_code); +} + +//////////////////////////////// +//~ rjf: @per_os_impl Process Info + +internal ProcessInfo * +get_process_info(void) +{ + return &os_lnx_state.process_info; +} + +internal String8 +get_current_path(Arena *arena) +{ + char *cwdir = getcwd(0, 0); + String8 string = str8_copy(arena, str8_cstring(cwdir)); + free(cwdir); + return string; +} + +internal U32 +get_process_start_time_unix(void) +{ + Temp scratch = scratch_begin(0,0); + U64 start_time = 0; + pid_t pid = getpid(); + String8 path = str8f(scratch.arena, "/proc/%u", pid); + struct stat st; + int err = stat((char *)path.str, &st); + if(err == 0) + { + start_time = st.st_mtime; + } + scratch_end(scratch); + return (U32)start_time; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Child Processes + +internal Process +process_launch(ProcessLaunchParams *params) +{ + Process handle = {0}; + posix_spawn_file_actions_t file_actions = {0}; + int file_actions_init_code = posix_spawn_file_actions_init(&file_actions); + if(file_actions_init_code == 0) + { + int stdout_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdout_file.u64[0], STDOUT_FILENO); + int stderr_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stderr_file.u64[0], STDERR_FILENO); + int stdin_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdin_file.u64[0], STDIN_FILENO); + posix_spawnattr_t attr = {0}; + int attr_init_code = posix_spawnattr_init(&attr); + if(attr_init_code == 0) + { + Temp scratch = scratch_begin(0, 0); + + // package argv + char **argv = push_array(scratch.arena, char *, params->cmd_line.node_count + 1); + { + String8List l = str8_split_path(scratch.arena, params->path); + str8_list_push(scratch.arena, &l, params->cmd_line.first->string); + String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); + argv[0] = (char *)path_to_exe.str; + U64 arg_idx = 1; + for EachNode(n, String8Node, params->cmd_line.first->next) + { + argv[arg_idx] = (char *)n->string.str; + arg_idx += 1; + } + } + + // package envp + char **envp = 0; + if(params->inherit_env) + { + envp = os_lnx_state.default_env; + } + else + { + envp = push_array(scratch.arena, char *, params->env.node_count + 2); + U64 env_idx = 0; + for EachNode(n, String8Node, params->cmd_line.first) + { + envp[env_idx] = (char *)n->string.str; + env_idx += 1; + } + } + + // spawn process + pid_t pid = 0; + int spawn_code = posix_spawn(&pid, argv[0], &file_actions, &attr, argv, envp); + if(spawn_code == 0) + { + handle.u64[0] = (U64)pid; + } + + // clean up attributes + int attr_destroy_code = posix_spawnattr_destroy(&attr); + scratch_end(scratch); + } + + // clean up file actions + int file_actions_destroy_code = posix_spawn_file_actions_destroy(&file_actions); + } + return handle; +} + +internal B32 +process_join(Process process, U64 endt_us, U64 *exit_code_out) +{ + pid_t pid = (pid_t)process.u64[0]; + B32 result = 0; + if(endt_us == 0) + { + if(kill(pid, 0) >= 0) + { + result = (errno == ENOENT); + if(result) + { + int status; + waitpid(pid, &status, 0); + } + } + } + else if(endt_us == max_U64) + { + for(;;) + { + int status = 0; + int w = waitpid(pid, &status, 0); + if(w == -1) + { + break; + } + if(WIFEXITED(status) || WIFSTOPPED(status) || WIFSIGNALED(status)) + { + result = 1; + break; + } + } + } + else + { + NotImplemented; + } + return result; +} + +internal void +process_detach(Process process) +{ + // no need to close pid +} + +internal B32 +process_kill(Process process) +{ + int error_code = kill((pid_t)process.u64[0], SIGKILL); + B32 is_killed = error_code == 0; + return is_killed; +} + +//////////////////////////////// +//~ rjf: @per_os_impl Dynamically-Loaded Libraries + +internal Library +library_open(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + char *path_cstr = (char *)str8_copy(scratch.arena, path).str; + void *so = dlopen(path_cstr, RTLD_LAZY|RTLD_LOCAL); + Library lib = { (U64)so }; + scratch_end(scratch); + return lib; +} + +internal void +library_close(Library lib) +{ + void *so = (void *)lib.u64; + dlclose(so); +} + +internal VoidProc * +library_load_proc(Library lib, String8 name) +{ + Temp scratch = scratch_begin(0, 0); + void *so = (void *)lib.u64; + char *name_cstr = (char *)str8_copy(scratch.arena, name).str; + VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); + scratch_end(scratch); + return proc; +} + +//////////////////////////////// +//~ rjf: Entry Point + +internal void +lnx_signal_handler(int sig, siginfo_t *info, void *arg) +{ + local_persist volatile U32 first = 0; + if (ins_atomic_u32_eval_cond_assign(&first, 1, 0) != 0) + { + for(;;) + { + sleep(UINT32_MAX); + } + } + + local_persist void *ips[4096]; + int ips_count = backtrace(ips, ArrayCount(ips)); + + fprintf(stderr, "A fatal signal was received: %s (%d). The process is terminating.\n", strsignal(sig), sig); + fprintf(stderr, "Create a new issue with this report at %s.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); + fprintf(stderr, "Callstack:\n"); + for EachIndex(i, ips_count) + { + Dl_info info = {0}; + dladdr(ips[i], &info); + + char cmd[2048]; + snprintf(cmd, sizeof(cmd), "llvm-symbolizer --relative-address -f -e %s %lu", info.dli_fname, (unsigned long)ips[i] - (unsigned long)info.dli_fbase); + FILE *f = popen(cmd, "r"); + if(f) + { + char func_name[256], file_name[256]; + if(fgets(func_name, sizeof(func_name), f) && fgets(file_name, sizeof(file_name), f)) + { + String8 func = str8_cstring(func_name); + if(func.size > 0) func.size -= 1; + String8 module = str8_skip_last_slash(str8_cstring(info.dli_fname)); + String8 file = str8_skip_last_slash(str8_cstring_capped(file_name, file_name + sizeof(file_name))); + if(file.size > 0) file.size -= 1; + + B32 no_func = str8_match(func, str8_lit("??"), StringMatchFlag_RightSideSloppy); + B32 no_file = str8_match(file, str8_lit("??"), StringMatchFlag_RightSideSloppy); + if(no_func) { func = str8_zero(); } + if(no_file) { file = str8_zero(); } + + fprintf(stderr, "%ld. [0x%016lx] %.*s%s%.*s %.*s\n", i+1, (unsigned long)ips[i], (int)module.size, module.str, (!no_func || !no_file) ? ", " : "", (int)func.size, func.str, (int)file.size, file.str); + } + pclose(f); + } + else + { + fprintf(stderr, "%ld. [0x%016lx] %s\n", i+1, (unsigned long)ips[i], info.dli_fname); + } + } + fprintf(stderr, "\nVersion: %s%s\n\n", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); + + _exit(1); +} + +int +main(int argc, char **argv) +{ + // install signal handler for the crash call stacks + { + struct sigaction handler = { .sa_sigaction = lnx_signal_handler, .sa_flags = SA_SIGINFO, }; + sigfillset(&handler.sa_mask); + sigaction(SIGILL, &handler, NULL); + sigaction(SIGTRAP, &handler, NULL); + sigaction(SIGABRT, &handler, NULL); + sigaction(SIGFPE, &handler, NULL); + sigaction(SIGBUS, &handler, NULL); + sigaction(SIGSEGV, &handler, NULL); + sigaction(SIGQUIT, &handler, NULL); + } + + //- rjf: set up OS layer + { + //- rjf: get statically-allocated system/process info + { + SystemInfo *info = &os_lnx_state.system_info; + info->logical_processor_count = (U32)get_nprocs(); + info->page_size = (U64)getpagesize(); + info->large_page_size = MB(2); + info->allocation_granularity = info->page_size; + } + { + ProcessInfo *info = &os_lnx_state.process_info; + info->pid = (U32)getpid(); + } + + //- rjf: set up thread context + TCTX *tctx = tctx_alloc(); + tctx_select(tctx); + + //- rjf: set up dynamically allocated state + os_lnx_state.arena = arena_alloc(); + os_lnx_state.entity_arena = arena_alloc(); + pthread_mutex_init(&os_lnx_state.entity_mutex, 0); + + // cache default environment + { + U64 env_count = 0; + for(; __environ[env_count] != 0; env_count += 1) {} + char **default_env = push_array(os_lnx_state.arena, char *, env_count+1); + for EachIndex(idx, env_count) + { + default_env[idx] = (char *)str8_copy(os_lnx_state.arena, str8_cstring(__environ[idx])).str; + } + default_env[env_count] = 0; + os_lnx_state.default_env_count = env_count; + os_lnx_state.default_env = default_env; + } + + //- rjf: grab dynamically allocated system info + { + Temp scratch = scratch_begin(0, 0); + SystemInfo *info = &os_lnx_state.system_info; + + // rjf: get machine name + B32 got_final_result = 0; + U8 *buffer = 0; + int size = 0; + for(S64 cap = 4096, r = 0; r < 4; cap *= 2, r += 1) + { + scratch_end(scratch); + buffer = push_array(scratch.arena, U8, cap); + int gethostname_result = gethostname((char*)buffer, cap); + size = cstring8_length(buffer); + if(gethostname_result == 0 && size < cap) + { + got_final_result = 1; + break; + } + } + + // rjf: save name to info + if(got_final_result && size > 0) + { + info->machine_name.size = size; + info->machine_name.str = push_array_no_zero(os_lnx_state.arena, U8, info->machine_name.size + 1); + MemoryCopy(info->machine_name.str, buffer, info->machine_name.size); + info->machine_name.str[info->machine_name.size] = 0; + } + + scratch_end(scratch); + } + + //- rjf: grab dynamically allocated process info + { + Temp scratch = scratch_begin(0, 0); + ProcessInfo *info = &os_lnx_state.process_info; + + // rjf: grab binary path + { + // rjf: get self string + B32 got_final_result = 0; + U8 *buffer = 0; + int size = 0; + for(S64 cap = PATH_MAX, r = 0; r < 4; cap *= 2, r += 1) + { + scratch_end(scratch); + buffer = push_array_no_zero(scratch.arena, U8, cap); + size = readlink("/proc/self/exe", (char*)buffer, cap); + if(size < cap) + { + got_final_result = 1; + break; + } + } + + // rjf: save + if(got_final_result && size > 0) + { + String8 full_name = str8(buffer, size); + String8 name_chopped = str8_chop_last_slash(full_name); + info->binary_path = push_str8_copy(os_lnx_state.arena, name_chopped); + } + } + + // rjf: grab initial directory + { + info->initial_path = get_current_path(os_lnx_state.arena); + } + + // rjf: grab home directory + { + char *home = getenv("HOME"); + info->user_program_data_path = str8_cstring(home); + } + + scratch_end(scratch); + } + } + + //- rjf: call into "real" entry point + main_thread_base_entry_point(argc, argv); +} diff --git a/src/linux/base/linux_base.h b/src/linux/base/linux_base.h index 2ba3a846..a4b069da 100644 --- a/src/linux/base/linux_base.h +++ b/src/linux/base/linux_base.h @@ -4,4 +4,154 @@ #ifndef LINUX_BASE_H #define LINUX_BASE_H +//////////////////////////////// +//~ rjf: Includes + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +pid_t gettid(void); +int pthread_setname_np(pthread_t thread, const char *name); +int pthread_getname_np(pthread_t thread, char *name, size_t size); + +typedef struct tm tm; +typedef struct timespec timespec; + +//////////////////////////////// +//~ rjf: Linux Call Interruption Retry Helper + +#define OS_LNX_RETRY_ON_EINTR(expr) \ +(__extension__({ \ +__typeof__(expr) __ret; \ +do { \ +__ret = (expr); \ +} while ((__ret == -1) && errno == EINTR); \ +__ret; \ +})) + + +//////////////////////////////// +//~ rjf: File Iterator + +typedef struct OS_LNX_FileIter OS_LNX_FileIter; +struct OS_LNX_FileIter +{ + DIR *dir; + struct dirent *dp; + String8 path; +}; +StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check); + +//////////////////////////////// +//~ rjf: Safe Call Handler Chain + +typedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain; +struct OS_LNX_SafeCallChain +{ + OS_LNX_SafeCallChain *next; + ThreadEntryPointFunctionType *fail_handler; + void *ptr; +}; + +//////////////////////////////// +//~ rjf: Entities + +typedef enum OS_LNX_EntityKind +{ + OS_LNX_EntityKind_Thread, + OS_LNX_EntityKind_Mutex, + OS_LNX_EntityKind_RWMutex, + OS_LNX_EntityKind_ConditionVariable, + OS_LNX_EntityKind_Barrier, +} +OS_LNX_EntityKind; + +typedef struct OS_LNX_Entity OS_LNX_Entity; +struct OS_LNX_Entity +{ + OS_LNX_Entity *next; + OS_LNX_EntityKind kind; + union + { + struct + { + pthread_t handle; + ThreadEntryPointFunctionType *func; + void *ptr; + } thread; + pthread_mutex_t mutex_handle; + pthread_rwlock_t rwmutex_handle; + struct + { + pthread_cond_t cond_handle; + pthread_mutex_t rwlock_mutex_handle; + } cv; + pthread_barrier_t barrier; + }; +}; + +//////////////////////////////// +//~ rjf: State + +typedef struct OS_LNX_State OS_LNX_State; +struct OS_LNX_State +{ + Arena *arena; + SystemInfo system_info; + ProcessInfo process_info; + pthread_mutex_t entity_mutex; + Arena *entity_arena; + OS_LNX_Entity *entity_free; + U64 default_env_count; + char **default_env; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_LNX_State os_lnx_state = {0}; +thread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0; + +//////////////////////////////// +//~ rjf: Helpers + +internal DateTime os_lnx_date_time_from_tm(tm in, U32 msec); +internal tm os_lnx_tm_from_date_time(DateTime dt); +internal timespec os_lnx_timespec_from_date_time(DateTime dt); +internal DenseTime os_lnx_dense_time_from_timespec(timespec in); +internal FileProperties os_lnx_file_properties_from_stat(struct stat *s); +internal void os_lnx_safe_call_sig_handler(int x); + +//////////////////////////////// +//~ rjf: Entities + +internal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind); +internal void os_lnx_entity_release(OS_LNX_Entity *entity); + +//////////////////////////////// +//~ rjf: Thread Entry Point + +internal void *os_lnx_thread_entry_point(void *ptr); + #endif // LINUX_BASE_H diff --git a/src/demon/linux/demon_core_linux.c b/src/linux/demon/linux_demon.c similarity index 87% rename from src/demon/linux/demon_core_linux.c rename to src/linux/demon/linux_demon.c index e5619af0..6c1767dc 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/linux/demon/linux_demon.c @@ -1,3159 +1,3147 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ Includes - -#include -#include -#include - -//////////////////////////////// - -internal U64 -dmn_lnx_size_from_fd(int memory_fd, U64 cap) -{ - U8 temp[4096]; - size_t cursor = 0; - while(cursor < cap) - { - ssize_t actual_read = OS_LNX_RETRY_ON_EINTR(pread(memory_fd, temp, sizeof(temp), cursor)); - if(actual_read <= 0) { break; } - cursor += (U64)actual_read; - } - return (U64)cursor; -} - -internal U64 -dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst) -{ - size_t cursor = 0, size = dim_1u64(range); - while(cursor < size) - { - size_t to_read = size - cursor; - ssize_t actual_read = OS_LNX_RETRY_ON_EINTR(pread(memory_fd, (U8 *)dst + cursor, to_read, range.min + cursor)); - if(actual_read < 0) { break; } - if(actual_read == 0) { break; } - cursor += actual_read; - } - return cursor; -} - -internal B32 -dmn_lnx_write(int memory_fd, Rng1U64 range, void *src) -{ - size_t cursor = 0, size = dim_1u64(range); - while(cursor < size) - { - size_t to_write = size - cursor; - ssize_t actual_write = OS_LNX_RETRY_ON_EINTR(pwrite(memory_fd, (U8 *)src + cursor, to_write, range.min + cursor)); - if(actual_write <= 0) { break; } - cursor += actual_write; - } - B32 is_written = (cursor == size); - return is_written; -} - -internal String8 -dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size) -{ - String8 result = {0}; - U64 string_size = 0; - for(U64 vaddr = base_vaddr; string_size < cap_size; vaddr += 1, string_size += 1) - { - char byte = 0; - if(OS_LNX_RETRY_ON_EINTR(pread(memory_fd, &byte, sizeof(byte), vaddr) <= 0)) - { - break; - } - if(byte == '\0' || byte == '\n') - { - break; - } - } - if(string_size != 0) - { - char *buf = push_array_no_zero(arena, char, string_size+1); - OS_LNX_RETRY_ON_EINTR(pread(memory_fd, buf, string_size, base_vaddr)); - buf[string_size] = '\0'; - result = str8((U8 *)buf, string_size); - } - return result; -} - -internal String8 -dmn_lnx_read_string(Arena *arena, int memory_fd, U64 vaddr) -{ - return dmn_lnx_read_string_capped(arena, memory_fd, vaddr, 4096); -} - -internal -MACHINE_OP_MEM_READ(dmn_lnx_machine_op_mem_read) -{ - U64 read_size = dmn_lnx_read(*(int *)ud, r1u64(addr, addr + buffer_size), buffer); - return read_size == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; -} - -internal int -dmn_lnx_ptrace_seize(pid_t pid) -{ - // TODO: PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACEFORK - return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE)); -} - -internal String8 -dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) -{ - Temp scratch = scratch_begin(&arena, 1); - - String8 exe_link_path = str8f(scratch.arena, "/proc/%d/exe", pid); - String8List parts = {0}; - int readlink_result = 0; - for(S64 r = 0, cap = PATH_MAX; r < 4; cap *= 2, r += 1) - { - U8 *buffer = push_array(arena, U8, cap); - readlink_result = readlink((char *)exe_link_path.str, (char *)buffer, cap); - - if(readlink_result < 0) - { - break; - } - - str8_list_push(scratch.arena, &parts, str8(buffer, readlink_result)); - - if(readlink_result < cap) - { - break; - } - } - - String8 result = str8_list_join(arena, &parts, 0); - scratch_end(scratch); - return result; -} - -internal String8 -dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) -{ - Temp scratch = scratch_begin(&arena, 1); - - String8 dl_path = {0}; - - int maps_fd = OS_LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY)); - if(maps_fd != -1) - { - // read entire /proc/pid/maps - U64 maps_size = dmn_lnx_size_from_fd(maps_fd, MB(1)); - U8 *maps_ptr = push_array(scratch.arena, U8, maps_size); - U64 read_size = dmn_lnx_read(maps_fd, r1u64(0, maps_size), maps_ptr); - - // split map file on lines - String8List lines = str8_split_by_string_chars(scratch.arena, str8(maps_ptr, maps_size), str8_lit("\n"), 0); - - // scan each line until a virtual mapping whose low part matches the DL base address is found - for EachNode(n, String8Node, lines.first) - { - String8 line = n->string; - - // split the string while respecting escape sequences - String8List parts = {0}; - for EachIndex(cursor, line.size) - { - if(parts.node_count > 5) { break; } - if(line.str[cursor] == ' ') { continue; } - - // scan forward to the closing delimiter - U64 token_start = cursor; - for(; cursor < line.size; cursor += 1) - { - if(line.str[cursor] == '\\') - { - cursor += 1; - continue; - } - if(line.str[cursor] == ' ') { break; } - } - - // push sub-string to the list - str8_list_push(scratch.arena, &parts, str8_substr(line, r1u64(token_start, cursor))); - } - - // was line parsed correctly? - if(parts.node_count < 5) { Assert(0 && "failed to parse map line"); continue; } - - // parse map virtual range - String8List vaddr_list = str8_split_by_string_chars(scratch.arena, parts.first->string, str8_lit("-"), 0); - if(vaddr_list.node_count != 2) { Assert(0 && "failed to parse virtual range portion of map line"); continue; } - - // does the low part match DL base address? - U64 lo_vaddr = u64_from_str8(vaddr_list.first->string, 16); - if(lo_vaddr == auxv_base) - { - dl_path = parts.node_count == 5 ? str8_zero() : parts.last->string; - dl_path = push_str8_copy(arena, dl_path); - break; - } - } - - OS_LNX_RETRY_ON_EINTR(close(maps_fd)); - } - else { Assert(0 && "failed to open DL fd"); } - - scratch_end(scratch); - Assert(dl_path.size); - return dl_path; -} - -internal ELF_Hdr64 -dmn_lnx_ehdr_from_pid(pid_t pid) -{ - Temp scratch = scratch_begin(0, 0); - - ELF_Hdr64 exe = {0}; - B32 is_read = 0; - - char *exe_path = (char *)str8f(scratch.arena, "/proc/%d/exe", pid).str; - int exe_fd = OS_LNX_RETRY_ON_EINTR(open(exe_path, O_RDONLY)); - - if(exe_fd >= 0) - { - is_read = elf_read_ehdr(dmn_lnx_machine_op_mem_read, &exe_fd, 0, &exe); - OS_LNX_RETRY_ON_EINTR(close(exe_fd)); - } - - Assert(is_read); - scratch_end(scratch); - return exe; -} - -internal DMN_LNX_Auxv -dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) -{ - Temp scratch = scratch_begin(0, 0); - DMN_LNX_Auxv result = {0}; - - // rjf: open aux data - String8 auxv_path = str8f(scratch.arena, "/proc/%d/auxv", pid); - int auxv_fd = OS_LNX_RETRY_ON_EINTR(open((char *)auxv_path.str, O_RDONLY)); - - // rjf: scan aux data - if(auxv_fd >= 0) - { - for(;;) - { - // rjf: read next aux - ELF_Auxv64 auxv = {0}; - switch(elf_class) - { - case ELF_Class_None:{}break; - case ELF_Class_32: - { - ELF_Auxv32 auxv32 = {0}; - if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) { goto brkloop; } - auxv = elf_auxv64_from_auxv32(auxv32); - }break; - case ELF_Class_64: - { - if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) { goto brkloop; } - }break; - default:{NotImplemented;}break; - } - - // rjf: fill result - switch(auxv.a_type) - { - default:{}break; - case ELF_AuxType_Null: goto brkloop; break; - case ELF_AuxType_Base: result.base = auxv.a_val; break; - case ELF_AuxType_Phnum: result.phnum = auxv.a_val; break; - case ELF_AuxType_Phent: result.phent = auxv.a_val; break; - case ELF_AuxType_Phdr: result.phdr = auxv.a_val; break; - case ELF_AuxType_ExecFn: result.execfn = auxv.a_val; break; - case ELF_AuxType_Pagesz: result.pagesz = auxv.a_val; break; - } - } - brkloop:; - OS_LNX_RETRY_ON_EINTR(close(auxv_fd)); - } - - scratch_end(scratch); - return result; -} - -internal DMN_LNX_Thread * -dmn_lnx_thread_from_pid(pid_t tid) -{ - return hash_table_search_u64_raw(dmn_lnx_state->tid_ht, tid); -} - -internal DMN_LNX_Process * -dmn_lnx_process_from_pid(pid_t pid) -{ - return hash_table_search_u64_raw(dmn_lnx_state->pid_ht, pid); -} - -internal Rng1U64 -dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) -{ - Rng1U64 result = { .min = max_U64 }; - - for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) - { - ELF_Phdr64 phdr = {0}; - if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) - { - Assert(0 && "unable to read a program header"); - } - - if(phdr.p_type == ELF_PType_Load) - { - U64 min = rebase + phdr.p_vaddr; - U64 max = rebase + phdr.p_vaddr + phdr.p_memsz; - result.min = Min(result.min, min); - result.max = Max(result.max, max); - } - } - - return result; -} - -internal DMN_LNX_DynamicInfo -dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr) -{ - DMN_LNX_DynamicInfo dynamic_info = {0}; - for(U64 dynamic_cursor = dynamic_vaddr; ; dynamic_cursor += elf_dyn_size_from_class(elf_class)) - { - // rjf: read next dyn entry - ELF_Dyn64 dyn = {0}; - if(elf_read_dyn(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_cursor, elf_class, &dyn) != MachineOpResult_Ok) { Assert(0 && "unable to read dynamic"); } - - // rjf: break on zero - if(dyn.tag == ELF_DynTag_Null) { break; } - - // extract reuiqred values out of dynamic section - if(dyn.tag == ELF_DynTag_Strtab) - { - dynamic_info.strtab_vaddr = rebase + dyn.val; - } - else if(dyn.tag == ELF_DynTag_Strsz) - { - dynamic_info.strtab_size = dyn.val; - } - else if(dyn.tag == ELF_DynTag_Symtab) - { - dynamic_info.symtab_vaddr = rebase + dyn.val; - } - else if(dyn.tag == ELF_DynTag_Syment) - { - dynamic_info.symtab_entry_size = dyn.val; - } - else if(dyn.tag == ELF_DynTag_Hash) - { - dynamic_info.hash_vaddr = rebase + dyn.val; - } - else if(dyn.tag == ELF_DynTag_GNU_Hash) - { - dynamic_info.gnu_hash_vaddr = rebase + dyn.val; - } - } - return dynamic_info; -} - -internal U64 -dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) -{ - U64 result = max_U64; - - for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) - { - ELF_Phdr64 phdr = {0}; - if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) - { - Assert(0 && "unable to read a program header"); - } - - if(phdr.p_type == ELF_PType_Dynamic) - { - result = rebase + phdr.p_vaddr; - break; - } - } - - return result; -} - -internal U64 -dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) -{ - Temp scratch = scratch_begin(0, 0); - - U64 rdebug_vaddr = 0; - - // load DL's header - ELF_Hdr64 ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, loader_vbase, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); goto exit; } - - U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; - ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; - - // find dynamic program header - U64 phdr_vaddr = loader_vbase + ehdr.e_phoff; - U64 dynamic_vaddr = dmn_lnx_find_dynamic_phdr(memory_fd, elf_class, rebase, phdr_vaddr, ehdr.e_phentsize, ehdr.e_phentsize); - - // extract necessary info out of dynamic program header - U64 dynamic_info_rebase = is_rebased ? 0 : rebase; - DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, dynamic_info_rebase, dynamic_vaddr); - - // extract symbol table count from available options - U64 symbol_count = 0; - if(dynamic_info.hash_vaddr) - { - U64 hash_entry_size = 4; - if(elf_class == ELF_Class_64 && (ehdr.e_machine == ELF_MachineKind_ALPHA || ehdr.e_machine == ELF_MachineKind_S390 || ehdr.e_machine == ELF_MachineKind_S390_OLD)) - { - hash_entry_size = 8; - } - - U64 chain_count = 0; - if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) - { - symbol_count = chain_count; - } - else - { - Assert(0 && "failed to read hash table's chain count out of HASH"); - } - } - else - { - // TODO: extract count from GNU_HASH - NotImplemented; - } - - // scan symbol table for the rendezvous symbol - if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) - { - for EachIndex(symbol_idx, symbol_count) - { - ELF_Sym64 symbol = {0}; - if(elf_read_symbol(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_info.symtab_vaddr + symbol_idx * dynamic_info.symtab_entry_size, elf_class, &symbol) != MachineOpResult_Ok) - { - Assert(0 && "failed to read symbol table"); - break; - } - - Temp temp = temp_begin(scratch.arena); - - String8 symbol_name = {0}; - if(symbol.st_name < dynamic_info.strtab_size) - { - U64 cap = dynamic_info.strtab_size - symbol.st_name; - symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); - } - - if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) - { - ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info); - if(symbol_type == ELF_SymType_Object && symbol.st_size > 0) - { - rdebug_vaddr = rebase + symbol.st_value; - break; - } - } - - temp_end(temp); - } - } - - exit:; - scratch_end(scratch); - return rdebug_vaddr; -} - -internal DMN_LNX_ProbeList -dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) -{ - Temp scratch = scratch_begin(&arena, 1); - - DMN_LNX_ProbeList probes = {0}; - - ELF_Hdr64 ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &fd, offset, &ehdr) != MachineOpResult_Ok) { goto exit; } - - U64 strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize; - ELF_Shdr64 strtab_shdr = {0}; - if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr) != MachineOpResult_Ok) { goto exit; } - - B32 found_probes = 0; - B32 found_probes_base = 0; - ELF_Shdr64 text_shdr = {0}; - ELF_Shdr64 stapsdt_base_shdr = {0}; - ELF_Shdr64 stapsdt_shdr = {0}; - for(U64 shdr_off = offset + ehdr.e_shoff, shdr_opl = shdr_off + ehdr.e_shentsize * ehdr.e_shnum; - shdr_off < shdr_opl; - shdr_off += ehdr.e_shentsize) { - ELF_Shdr64 shdr = {0}; - if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr) != MachineOpResult_Ok) { goto exit; } - - if(shdr.sh_type == ELF_ShType_Note) - { - U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; - U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; - String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); - - if(str8_match(name, str8_lit(".note.stapsdt"), 0)) - { - stapsdt_shdr = shdr; - found_probes = 1; - } - } - else if(shdr.sh_type == ELF_ShType_ProgBits) - { - U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; - U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; - String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); - - if(str8_match(name, str8_lit(".stapsdt.base"), 0)) - { - stapsdt_base_shdr = shdr; - found_probes_base = 1; - } else if(str8_match(name, str8_lit(".text"), 0)) - { - text_shdr = shdr; - } - } - - if(found_probes && found_probes_base) { break; } - } - - if(!found_probes || !found_probes_base) { goto exit; } - - U64 probes_base = stapsdt_base_shdr.sh_addr; - - Rng1U64 note_range = shift_1u64(r1u64(stapsdt_shdr.sh_offset, stapsdt_shdr.sh_offset + stapsdt_shdr.sh_size), offset); - void *raw_note = push_array(arena, U8, stapsdt_shdr.sh_size); - U64 note_read_size = dmn_lnx_read(fd, note_range, raw_note); - if(note_read_size != dim_1u64(note_range)) { goto exit; } - - Arch arch = arch_from_elf_machine(ehdr.e_machine); - ELF_NoteList note = elf_parse_note(scratch.arena, str8(raw_note, dim_1u64(note_range)), ehdr.e_ident[ELF_Identifier_Class], ehdr.e_machine); - - for EachNode(n, ELF_NoteNode, note.first) - { - ELF_Note *note = &n->v; - if(!str8_match(note->owner, str8_lit("stapsdt"), 0)) { continue; } - if(note->type != ELF_NoteType_STapSdt) { continue; } - - DMN_LNX_Probe probe = {0}; - { - U64 cursor = 0; - U64 addr_size = ehdr.e_ident[ELF_Identifier_Class] == ELF_Class_64 ? 8 : 4; - - U64 pc = 0; - U64 pc_size = str8_deserial_read(note->desc, cursor, &pc, addr_size, addr_size); - if (pc_size == 0) { goto exit; } - cursor += pc_size; - - U64 base_addr = 0; - U64 base_addr_size = str8_deserial_read(note->desc, cursor, &base_addr, addr_size, addr_size); - if (base_addr_size == 0) { goto exit; } - cursor += base_addr_size; - - U64 semaphore = 0; - U64 semaphore_size = str8_deserial_read(note->desc, cursor, &semaphore, addr_size, addr_size); - if (semaphore_size == 0) { goto exit; } - cursor += semaphore_size; - - String8 provider = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); - cursor += provider.size + 1; - if (cursor > note->desc.size) { goto exit; } - - String8 name = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); - cursor += name.size + 1; - if (cursor > note->desc.size) { goto exit; } - - String8 args = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); - cursor += args.size + 1; - if (cursor > note->desc.size) { goto exit; } - - U64 probe_rebase = image_base + (base_addr - probes_base); - - probe.provider = provider; - probe.name = name; - probe.args = stap_arg_array_from_string(arena, arch, args); - probe.pc = pc + probe_rebase; - probe.semaphore = semaphore ? semaphore + probe_rebase : 0; - } - - DMN_LNX_ProbeNode *n = push_array(arena, DMN_LNX_ProbeNode, 1); - n->v = probe; - SLLQueuePush(probes.first, probes.last, n); - probes.count += 1; - } - - exit:; - scratch_end(scratch); - return probes; -} - -internal -STAP_MEMORY_READ(dmn_lnx_stap_memory_read) -{ - DMN_LNX_Process *process = raw_ctx; - U64 bytes_read = dmn_lnx_read(process->fd, r1u64(addr, addr + read_size), buffer); - return bytes_read == read_size; -} - -internal DMN_LNX_Entity * -dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind) -{ - DMN_LNX_Entity *entity = dmn_lnx_state->free_entity; - if(entity != 0) - { - SLLStackPop(dmn_lnx_state->free_entity); - } - else - { - entity = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 1); - dmn_lnx_state->entities_count += 1; - } - U32 gen = entity->gen; - entity->gen += 1; - entity->kind = kind; - return entity; -} - -internal DMN_LNX_Process * -dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocesses, B32 is_cow) -{ - Temp scratch = scratch_begin(0, 0); - - DMN_LNX_Process *process = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Process)->process; - process->pid = pid; - process->fd = OS_LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR)); - process->state = state; - process->debug_subprocesses = debug_subprocesses; - process->is_cow = is_cow; - process->parent_process = parent_process; - - // update pending process tracker - if(state != DMN_LNX_ProcessState_Normal) - { - dmn_lnx_state->process_pending_creation += 1; - } - - // add process to the list - DLLPushBack(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); - dmn_lnx_state->process_count += 1; - - // push pid -> DMN_LNX_Process mapping - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); - - scratch_end(scratch); - return process; -} - -internal DMN_LNX_ProcessCtx * -dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) -{ - DMN_LNX_ProcessCtx *ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; - - ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(process->pid); - DMN_LNX_Auxv auxv = dmn_lnx_auxv_from_pid(process->pid, exe_ehdr.e_ident[ELF_Identifier_Class]); - Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); - U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(process->fd, auxv.base, is_rebased); - U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); - U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; - Rng1U64 image_vrange = dmn_lnx_compute_image_vrange(process->fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); - Arena *ctx_arena = arena_alloc(); - - ELF_Class dl_class; - { - ELF_Hdr64 ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &process->fd, auxv.base, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); } - dl_class = ehdr.e_ident[ELF_Identifier_Class]; - } - - // query xsave layout - U64 xcr0 = 0; - U64 xsave_size = 0; - X64_XSaveLayout xsave_layout = {0}; - if(arch == Arch_x64) - { - X64_XSave xsave = {0}; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, process->pid, (void *)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0)) - { - // Linux stores xcr0 bits in fxstate padding, - // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25 - xcr0 = *(U64 *)((U8 *)&xsave + 464); - xsave_size = x64_get_xsave_size(); - xsave_layout = x64_get_xsave_layout(xcr0); - } - else { Assert(0 && "failed to get xstate"); } - } - - // gather probes - DMN_LNX_Probe **known_probes = push_array(ctx_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); - { - Temp scratch = scratch_begin(0, 0); - - String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, process->pid, auxv.base); - int dl_fd = OS_LNX_RETRY_ON_EINTR(open((char *)dl_path.str, O_RDONLY)); - - DMN_LNX_ProbeList probes = {0}; - if(dl_fd >= 0) - { - probes = dmn_lnx_read_probes(ctx_arena, dl_fd, 0, auxv.base); - OS_LNX_RETRY_ON_EINTR(close(dl_fd)); - } - - for EachNode(n, DMN_LNX_ProbeNode, probes.first) - { - DMN_LNX_Probe *p = &n->v; - if(str8_match(p->provider, str8_lit("rtld"), 0)) - { -#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } - DMN_LNX_Probe_XList -#undef X - } - } - - scratch_end(scratch); - } - - ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; - ctx->arena = arena_alloc(); - ctx->arch = arch; - ctx->rdebug_vaddr = rdebug_vaddr; - ctx->dl_class = dl_class; - ctx->loaded_modules_ht = hash_table_init(ctx_arena, 0x1000); - ctx->probes = known_probes; - ctx->xcr0 = xcr0; - ctx->xsave_size = Max(xsave_size, sizeof(X64_XSave)); - ctx->xsave_layout = xsave_layout; - - // create main module - DMN_LNX_Module *main_module = dmn_lnx_module_alloc(ctx, process->fd, base_vaddr, auxv.execfn, 1, 1); - - // glibc has a shortcut mapping for the main module - hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, 0, main_module); - - return ctx; -} - -internal DMN_LNX_Thread * -dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid) -{ - void *reg_block; - if(process->ctx->free_reg_blocks.node_count) - { - String8Node *n = str8_list_pop_front(&process->ctx->free_reg_blocks); - reg_block = n->string.str; - str8_list_push_node(&process->ctx->free_reg_block_nodes, n); - } - else - { - ARCH_Info *arch_info = arch_info_from_arch(process->ctx->arch); - U64 reg_block_size = arch_info->reg_block_size; - reg_block = push_array(process->ctx->arena, U8, reg_block_size); - } - - DMN_LNX_Thread *thread = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Thread)->thread; - thread->tid = tid; - thread->state = thread_state; - thread->process = process; - thread->reg_block = reg_block; - if(thread_state == DMN_LNX_ThreadState_Stopped) - { - thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); - } - - // add thread to the list - DLLPushBack(process->first_thread, process->last_thread, thread); - process->thread_count += 1; - - // push tid -> thread mapping - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->tid, thread); - - // update global thread counter - if(thread_state == DMN_LNX_ThreadState_PendingCreation) - { - dmn_lnx_state->threads_pending_creation += 1; - } - - return thread; -} - -internal DMN_LNX_Module * -dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main) -{ - DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, base_vaddr); - if(module) { goto exit; } - - // parse out module's ELF header - ELF_Hdr64 module_ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, base_vaddr, &module_ehdr) != MachineOpResult_Ok) { goto exit; } - - // gather info about module - U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; - U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; - Rng1U64 module_vrange = dmn_lnx_compute_image_vrange(memory_fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); - - // read TLS index and TLS offset - U64 tls_index = max_U64; - U64 tls_offset = max_U64; - if(is_main) - { - tls_index = 1; - tls_offset = 0; - } - else - { - if(dmn_lnx_state->is_tls_detected) - { - Rng1U64 tls_modid_range = r1u64(dmn_lnx_state->tls_modid_desc.offset, dmn_lnx_state->tls_modid_desc.offset + dmn_lnx_state->tls_modid_desc.bit_size / 8); - Rng1U64 tls_offset_range = r1u64(dmn_lnx_state->tls_offset_desc.offset, dmn_lnx_state->tls_offset_desc.offset + dmn_lnx_state->tls_offset_desc.bit_size / 8); - tls_modid_range = shift_1u64(tls_modid_range, base_vaddr); - tls_offset_range = shift_1u64(tls_offset_range, base_vaddr); - if(!dmn_lnx_read(memory_fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } - if(!dmn_lnx_read(memory_fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } - } - } - - module = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; - module->base_vaddr = base_vaddr; - module->name_vaddr = name_vaddr; - module->name_space_id = name_space_id; - module->size = dim_1u64(module_vrange); - module->phvaddr = base_vaddr + module_ehdr.e_phoff; - module->phcount = module_ehdr.e_phnum; - module->phentsize = module_ehdr.e_phentsize; - module->tls_index = tls_index; - module->tls_offset = tls_offset; - module->is_main = is_main; - - // add module to the list - DLLPushBack(ctx->first_module, ctx->last_module, module); - ctx->module_count += 1; - - // push base address -> module mapping - hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, base_vaddr, module); - - exit:; - return module; -} - -internal void -dmn_lnx_entity_release(DMN_LNX_Entity *entity) -{ - U32 gen = entity->gen + 1; - MemoryZeroStruct(entity); - entity->gen = gen; - SLLStackPush(dmn_lnx_state->free_entity, entity); -} - -internal void -dmn_lnx_process_release(DMN_LNX_Process *process) -{ - // update global state - AssertAlways(dmn_lnx_state->process_count > 0); - DLLRemove(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); - dmn_lnx_state->process_count -= 1; - - // update pending process tracker - if(process->state != DMN_LNX_ProcessState_Normal) - { - Assert(dmn_lnx_state->process_pending_creation > 0); - dmn_lnx_state->process_pending_creation -= 1; - } - - // close memory handle - if(OS_LNX_RETRY_ON_EINTR(close(process->fd)) < 0) { Assert(0 && "failed to close memory descriptor"); } - - // remove pid mapping - hash_table_purge_u64(dmn_lnx_state->pid_ht, process->pid); - - // release the context - if(process->ctx) - { - dmn_lnx_process_ctx_release(process->ctx); - } - - // release process entity - dmn_lnx_entity_release((DMN_LNX_Entity *)process); -} - -internal void -dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *ctx) -{ - Assert(ctx->ref_count > 0); - ctx->ref_count -= 1; - - if(ctx->ref_count == 0) - { - arena_release(ctx->arena); - dmn_lnx_entity_release((DMN_LNX_Entity *)ctx); - } -} - -internal void -dmn_lnx_thread_release(DMN_LNX_Thread *thread) -{ - DMN_LNX_Process *process = thread->process; - - // purge tid mapping - hash_table_purge_u64(dmn_lnx_state->tid_ht, thread->tid); - - // update global thread counter - if(thread->state == DMN_LNX_ThreadState_PendingCreation) - { - AssertAlways(dmn_lnx_state->threads_pending_creation > 0); - dmn_lnx_state->threads_pending_creation -= 1; - } - - // remove thread from the list - Assert(process->thread_count > 0); - DLLRemove(process->first_thread, process->last_thread, thread); - process->thread_count -= 1; - - // push reg block to the free list - String8Node *reg_block_node; - if(process->ctx->free_reg_block_nodes.node_count) - { - reg_block_node = str8_list_pop_front(&process->ctx->free_reg_block_nodes); - } - else - { - reg_block_node = push_array(process->ctx->arena, String8Node, 1); - } - reg_block_node->string = str8(thread->reg_block, 0); - str8_list_push_node(&process->ctx->free_reg_blocks, reg_block_node); - - dmn_lnx_entity_release((DMN_LNX_Entity *)thread); -} - -internal void -dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module) -{ - // remove module from the list - Assert(ctx->module_count > 0); - DLLRemove(ctx->first_module, ctx->last_module, module); - ctx->module_count -= 1; - - // purge base addr -> module mapping - hash_table_purge_u64(ctx->loaded_modules_ht, module->base_vaddr); - - dmn_lnx_entity_release((DMN_LNX_Entity *)module); -} - -internal DMN_LNX_ProcessCtx * -dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) -{ - DMN_LNX_ProcessCtx *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; - - result->arena = arena_alloc(); - result->arch = ctx->arch; - result->rdebug_vaddr = ctx->rdebug_vaddr; - result->dl_class = ctx->dl_class; - result->loaded_modules_ht = hash_table_init(result->arena, ctx->loaded_modules_ht->cap); - result->xcr0 = ctx->xcr0; - result->xsave_size = ctx->xsave_size; - result->xsave_layout = ctx->xsave_layout; - - // clone probes - result->probes = push_array(result->arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); - for EachIndex(probe_idx, DMN_LNX_ProbeType_Count) - { - DMN_LNX_Probe *dst = result->probes[probe_idx]; - DMN_LNX_Probe *src = ctx->probes[probe_idx]; - - dst->provider = str8_copy(result->arena, src->provider); - dst->name = str8_copy(result->arena, src->name); - dst->args_string = str8_copy(result->arena, src->args_string); - dst->args = stap_arg_array_copy(result->arena, src->args); - dst->pc = src->pc; - dst->semaphore = src->semaphore; - } - - // clone probe traps - for EachNode(src, DMN_ActiveTrap, ctx->first_probe_trap) - { - DMN_Trap *src_trap = src->trap; - DMN_Trap *dst_trap = push_array(result->arena, DMN_Trap, 1); - dst_trap->process = dmn_lnx_handle_from_process(new_owner); - dst_trap->vaddr = src_trap->vaddr; - dst_trap->id = src_trap->id; - dst_trap->flags = src_trap->flags; - dst_trap->size = src_trap->size; - - DMN_ActiveTrap *dst = push_array(result->arena, DMN_ActiveTrap, 1); - dst->trap = dst_trap; - dst->swap_bytes = str8_copy(result->arena, src->swap_bytes); - - SLLQueuePush(result->first_probe_trap, result->last_probe_trap, dst); - } - - // clone modules - for EachNode(module, DMN_LNX_Module, ctx->first_module) - { - dmn_lnx_module_clone(result, module); - } - - return result; -} - -internal DMN_LNX_Module * -dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module) -{ - DMN_LNX_Module *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; - *result = *module; - result->next = result->prev = 0; - - // clone base addr mapping - hash_table_push_u64_raw(process_ctx->arena, process_ctx->loaded_modules_ht, result->base_vaddr, result); - - // push module to the list - DLLPushBack(process_ctx->first_module, process_ctx->last_module, module); - process_ctx->module_count += 1; - - return result; -} - -internal DMN_Handle -dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity) -{ - DMN_Handle handle = {0}; - U64 index = IntFromPtr(entity - dmn_lnx_state->entities_base); - if(index <= max_U32) - { - handle.u32[0] = index; - handle.u32[1] = entity->gen; - } - else - { - Assert(0 && "failed to make a handle for the entity"); - } - return handle; -} - -internal DMN_Handle -dmn_lnx_handle_from_process(DMN_LNX_Process *process) -{ - return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)process); -} - -internal DMN_Handle -dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx) -{ - return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)process_ctx); -} - -internal DMN_Handle -dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread) -{ - return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)thread); -} - -internal DMN_Handle -dmn_lnx_handle_from_module(DMN_LNX_Module *module) -{ - return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)module); -} - -internal DMN_LNX_Entity * -dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind) -{ - DMN_LNX_Entity *result = 0; - U32 index = handle.u32[0]; - U32 gen = handle.u32[1]; - if(index < dmn_lnx_state->entities_count && dmn_lnx_state->entities_base[index].gen == gen) - { - if(dmn_lnx_state->entities_base[index].kind == expected_kind) - { - result = &dmn_lnx_state->entities_base[index]; - } - } - return result; -} - -internal DMN_LNX_Process * -dmn_lnx_process_from_handle(DMN_Handle process_handle) -{ - return (DMN_LNX_Process *)dmn_lnx_entity_from_handle(process_handle, DMN_LNX_EntityKind_Process); -} - -internal DMN_LNX_ProcessCtx * -dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle) -{ - return (DMN_LNX_ProcessCtx *)dmn_lnx_entity_from_handle(process_ctx_handle, DMN_LNX_EntityKind_ProcessCtx); -} - -internal DMN_LNX_Thread * -dmn_lnx_thread_from_handle(DMN_Handle thread_handle) -{ - return (DMN_LNX_Thread *)dmn_lnx_entity_from_handle(thread_handle, DMN_LNX_EntityKind_Thread); -} - -internal DMN_LNX_Module * -dmn_lnx_module_from_handle(DMN_Handle module_handle) -{ - return (DMN_LNX_Module *)dmn_lnx_entity_from_handle(module_handle, DMN_LNX_EntityKind_Module); -} - -internal void -dmn_lnx_process_trap_probes(DMN_LNX_Process *process) -{ - for EachIndex(i, DMN_LNX_ProbeType_Count) - { - if(process->ctx->probes[i] == 0) { continue; } - - DMN_Trap *trap = push_array(process->ctx->arena, DMN_Trap, 1); - trap->process = dmn_lnx_handle_from_process(process); - trap->vaddr = process->ctx->probes[i]->pc; - trap->id = i; - - DMN_ActiveTrap *active_trap = dmn_set_trap(process->ctx->arena, trap); - SLLQueuePush(process->ctx->first_probe_trap, process->ctx->last_probe_trap, active_trap); - - if(BUILD_DEBUG && process->ctx->arch == Arch_x64) - { - Assert(active_trap->swap_bytes.size == 1 && active_trap->swap_bytes.str[0] == 0x90); - } - } -} - -internal void -dmn_lnx_process_untrap_probes(DMN_LNX_Process *process) -{ - NotImplemented; -} - -internal U64 -dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread) -{ - ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); - U64 result = arch_ip_from_reg_block(arch_info, thread->reg_block); - return result; -} - -internal U64 -dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread) -{ - ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); - U64 result = arch_sp_from_reg_block(arch_info, thread->reg_block); - return result; -} - -internal void -dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip) -{ - ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); - arch_reg_block_write_ip(arch_info, thread->reg_block, ip); - thread->is_reg_block_dirty = 1; -} - -internal void -dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp) -{ - ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); - arch_reg_block_write_sp(arch_info, thread->reg_block, sp); - thread->is_reg_block_dirty = 1; -} - -internal B32 -dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) -{ - AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - - B32 is_reg_block_read = 0; - - switch(thread->process->ctx->arch) - { - case Arch_Null: {} break; - case Arch_x64: - { - DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; - X64_RegBlock *dst = thread->reg_block; - - // general purpose registers - { - OS_LNX_GprsX64 src; - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(src), .iov_base = &src })); - if(ptrace_result < 0) { goto exit; } - - dst->r15.u64 = src.r15; - dst->r14.u64 = src.r14; - dst->r13.u64 = src.r13; - dst->r12.u64 = src.r12; - dst->rbp.u64 = src.rbp; - dst->rbx.u64 = src.rbx; - dst->r11.u64 = src.r11; - dst->r10.u64 = src.r10; - dst->r9.u64 = src.r9; - dst->r8.u64 = src.r8; - dst->rax.u64 = src.rax; - dst->rcx.u64 = src.rcx; - dst->rdx.u64 = src.rdx; - dst->rsi.u64 = src.rsi; - dst->rdi.u64 = src.rdi; - dst->rip.u64 = src.rip; - dst->cs.u16 = src.cs; - dst->rflags.u64 = src.rflags; - dst->rsp.u64 = src.rsp; - dst->ss.u16 = src.ss; - dst->fsbase.u64 = src.fsbase; - dst->gsbase.u64 = src.gsbase; - dst->ds.u16 = src.ds; - dst->es.u16 = src.es; - dst->fs.u16 = src.fs; - dst->gs.u16 = src.gs; - thread->orig_rax = src.orig_rax; - } - - // xsave - { - Temp scratch = scratch_begin(0, 0); - - X64_XSave *xsave = 0; - X64_FXSave *fxsave = 0; - - // get xsave - if(x64_is_xsave_supported()) - { - void *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process_ctx->xsave_size, .iov_base = xsave_raw })); - if(ptrace_result < 0) { goto exit; } - - xsave = xsave_raw; - fxsave = &xsave->fxsave; - } - - // get fxsave - if(fxsave == 0) - { - fxsave = push_array(scratch.arena, X64_FXSave, 1); - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave })); - if(ptrace_result < 0) { goto exit; } - - fxsave = 0; - } - - // copy fxsave registers - if(fxsave) - { - X64_FXSave *src = fxsave; - - // copy x87 registers - dst->fcw.u16 = src->fcw; - dst->fsw.u16 = src->fsw; - dst->ftw = src->ftw; - dst->fop.u16 = src->fop; - dst->fip.u64 = src->fip; - dst->fdp.u64 = src->fdp; - dst->mxcsr.u32 = src->mxcsr; - dst->mxcsr_mask.u32 = src->mxcsr_mask; - for EachIndex(i, 8) - { - MemoryCopy(&dst->st0 + i, src->st_space + i, sizeof(REGS_Reg80)); - } - - // SSE registers are always available in x64 - { - U128 *xmm_d = fxsave->xmm_space; - REGS_Reg512 *zmm_s = &dst->zmm0; - for EachIndex(i, 16) - { - MemoryCopy(&zmm_s[i], &xmm_d[i], sizeof(*xmm_d)); - } - } - } - - // copy xsave registers - if(xsave) - { - // compact register layout is not supported - AssertAlways(xsave->header.xcomp_bv == 0); - - if(xsave->header.xstate_bv & X64_XStateComponentFlag_AVX) - { - AssertAlways(process_ctx->xsave_layout.avx_offset + 16*sizeof(REGS_Reg128) <= process_ctx->xsave_size); - REGS_Reg128 *avx_s = (REGS_Reg128 *)((U8 *)xsave + process_ctx->xsave_layout.avx_offset); - REGS_Reg512 *zmm_d = &dst->zmm0; - for EachIndex(n, 16) - { - MemoryCopy(&zmm_d[n].v[16], &avx_s[n], sizeof(REGS_Reg128)); - } - } - - if(xsave->header.xstate_bv & X64_XStateComponentFlag_OPMASK) - { - AssertAlways(process_ctx->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process_ctx->xsave_size); - REGS_Reg64 *kmask_s = (REGS_Reg64 *)((U8 *)xsave + process_ctx->xsave_layout.opmask_offset); - REGS_Reg64 *kmask_d = &dst->k0; - for EachIndex(n, 8) - { - MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64)); - } - } - - if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM_H) - { - AssertAlways(process_ctx->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process_ctx->xsave_size); - REGS_Reg256 *avx512h_s = (REGS_Reg256 *)((U8 *)xsave + process_ctx->xsave_layout.zmm_h_offset); - REGS_Reg512 *zmmh_d = &dst->zmm0; - for EachIndex(n, 16) - { - MemoryCopy(&zmmh_d[n].v[32], &avx512h_s[n], sizeof(REGS_Reg256)); - } - } - - if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM) - { - AssertAlways(process_ctx->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process_ctx->xsave_size); - REGS_Reg512 *avx512_s = (REGS_Reg512 *)((U8 *)xsave + process_ctx->xsave_layout.zmm_offset); - REGS_Reg512 *zmm_d = &dst->zmm16; - for EachIndex(n, 16) - { - MemoryCopy(&zmm_d[n], &avx512_s[n], sizeof(REGS_Reg512)); - } - } - - if(xsave->header.xstate_bv & X64_XStateComponentFlag_CETU) - { - AssertAlways(process_ctx->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process_ctx->xsave_size); - U64 *cet_u = (U64 *)((U8 *)xsave + process_ctx->xsave_layout.cet_u_offset); - dst->cetmsr.u64 = cet_u[0]; - dst->cetssp.u64 = cet_u[1]; - } - } - - scratch_end(scratch); - } - - // debug registers - { - REGS_Reg64 *dr_d = &dst->dr0; - for EachIndex(n, 8) - { - if(n != 4 && n != 5) - { - U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); - errno = 0; - long peek_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_PEEKUSER, thread->tid, PtrFromInt(offset), 0)); - if(errno != 0) { goto exit; } - dr_d[n].u64 = peek_result; - } - } - } - - is_reg_block_read = 1; - } break; - case Arch_x86: - case Arch_arm64: - case Arch_arm32: { NotImplemented; } break; - default: { InvalidPath; } break; - } - - exit:; - return is_reg_block_read; -} - -internal B32 -dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) -{ - AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - - B32 is_reg_block_written = 0; - - switch(thread->process->ctx->arch) - { - case Arch_Null: {} break; - case Arch_x64: - { - DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; - X64_RegBlock *src = thread->reg_block; - - // general purpose registers - { - OS_LNX_GprsX64 dst; - dst.r15 = src->r15.u64; - dst.r14 = src->r14.u64; - dst.r13 = src->r13.u64; - dst.r12 = src->r12.u64; - dst.rbp = src->rbp.u64; - dst.rbx = src->rbx.u64; - dst.r11 = src->r11.u64; - dst.r10 = src->r10.u64; - dst.r9 = src->r9.u64; - dst.r8 = src->r8.u64; - dst.rax = src->rax.u64; - dst.rcx = src->rcx.u64; - dst.rdx = src->rdx.u64; - dst.rsi = src->rsi.u64; - dst.rdi = src->rdi.u64; - dst.orig_rax = thread->orig_rax; - dst.rip = src->rip.u64; - dst.cs = src->cs.u16; - dst.rflags = src->rflags.u64; - dst.rsp = src->rsp.u64; - dst.ss = src->ss.u16; - dst.fsbase = src->fsbase.u64; - dst.gsbase = src->gsbase.u64; - dst.ds = src->ds.u16; - dst.es = src->es.u16; - dst.fs = src->fs.u16; - dst.gs = src->gs.u16; - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) })); - if(ptrace_result < 0) { goto exit; } - } - - // xsave - { - Temp scratch = scratch_begin(0, 0); - - X64_FXSave dst_fxsave = {0}; - { - dst_fxsave.fcw = src->fcw.u16; - dst_fxsave.fsw = src->fsw.u16; - dst_fxsave.ftw = src->ftw; - dst_fxsave.fop = src->fop.u16; - dst_fxsave.fip = src->fip.u64; - dst_fxsave.fdp = src->fdp.u64; - dst_fxsave.mxcsr = src->mxcsr.u32; - dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32; - - REGS_Reg128 *st_d = (REGS_Reg128 *)dst_fxsave.st_space; - REGS_Reg80 *st_s = &src->st0; - for EachIndex(n, 8) - { - MemoryCopy(&st_d[n], &st_s[n], sizeof(REGS_Reg80)); - } - - REGS_Reg128 *xmm_d = (REGS_Reg128 *)dst_fxsave.xmm_space; - REGS_Reg512 *xmm_s = &src->zmm0; - for EachIndex(n, 16) - { - MemoryCopy(&xmm_d[n], &xmm_s[n], sizeof(REGS_Reg128)); - } - } - - if(x64_is_xsave_supported()) - { - U8 *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); - X64_XSave *dst = (X64_XSave *)xsave_raw; - dst->fxsave = dst_fxsave; - dst->header.xstate_bv |= X64_XStateComponentFlag_FP; - dst->header.xstate_bv |= X64_XStateComponentFlag_SSE; - - if(process_ctx->xsave_layout.avx_offset) - { - if(process_ctx->xsave_layout.avx_offset + sizeof(REGS_Reg128) * 16 <= process_ctx->xsave_size) - { - REGS_Reg128 *avx_d = (REGS_Reg128 *)(xsave_raw + process_ctx->xsave_layout.avx_offset); - REGS_Reg512 *zmm_s = &src->zmm0; - for EachIndex(n, 16) - { - MemoryCopy(&avx_d[n], &zmm_s[n].v[16], sizeof(REGS_Reg128)); - } - dst->header.xstate_bv |= X64_XStateComponentFlag_AVX; - } - } - - if(process_ctx->xsave_layout.opmask_offset) - { - if(process_ctx->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process_ctx->xsave_size) - { - REGS_Reg64 *kmask_d = (REGS_Reg64 *)(xsave_raw + process_ctx->xsave_layout.opmask_offset); - REGS_Reg64 *kmask_s = &src->k0; - for EachIndex(n, 8) - { - MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64)); - } - dst->header.xstate_bv |= X64_XStateComponentFlag_OPMASK; - } - else { Assert(0 && "invalid xsave size"); goto exit; } - } - - if(process_ctx->xsave_layout.zmm_h_offset) - { - if(process_ctx->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process_ctx->xsave_size) - { - REGS_Reg256 *avx512h_d = (REGS_Reg256 *)(xsave_raw + process_ctx->xsave_layout.zmm_h_offset); - REGS_Reg512 *zmmh_s = &src->zmm0; - for EachIndex(n, 16) - { - MemoryCopy(&avx512h_d[n], &zmmh_s[n].v[32], sizeof(REGS_Reg256)); - } - dst->header.xstate_bv |= X64_XStateComponentFlag_ZMM_H; - } - else { Assert(0 && "invalid xsave size"); goto exit; } - } - - if(process_ctx->xsave_layout.zmm_offset) - { - if(process_ctx->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process_ctx->xsave_size) - { - REGS_Reg512 *avx512_d = (REGS_Reg512 *)(xsave_raw + process_ctx->xsave_layout.zmm_offset); - REGS_Reg512 *zmm_s = &src->zmm16; - for EachIndex(n, 16) - { - MemoryCopy(&avx512_d[n], &zmm_s[n], sizeof(REGS_Reg512)); - } - dst->header.xstate_bv |= X64_XStateComponentFlag_ZMM; - } - else { Assert(0 && "invalid xsave size"); goto exit; } - } - - if(process_ctx->xsave_layout.cet_u_offset) - { - if(process_ctx->xsave_layout.cet_u_offset + sizeof(REGS_Reg64) * 2 <= process_ctx->xsave_size) - { - REGS_Reg64 *cet_u = (REGS_Reg64 *)(xsave_raw + process_ctx->xsave_layout.cet_u_offset); - cet_u[0] = src->cetmsr; - cet_u[1] = src->cetssp; - dst->header.xstate_bv |= X64_XStateComponentFlag_CETU; - } - else { Assert(0 && "invalid xsave size"); goto exit; } - } - - // xsave - Assert(dst->header.xcomp_bv == 0); // must always be zero - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process_ctx->xsave_size })); - if(ptrace_result < 0) { goto exit; } - } - - scratch_end(scratch); - } - - // debug registers - { - src->dr7.u64 |= (1 << 10); - - REGS_Reg64 *dr_s = &src->dr0; - for EachIndex(n, 8) - { - if(n != 4 && n != 5) - { - U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_POKEUSER, thread->tid, PtrFromInt(offset), (void*)(uintptr_t)dr_s[n].u64)); - if(ptrace_result < 0) { goto exit; } - } - } - } - - is_reg_block_written = 1; - } break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: { NotImplemented; }break; - default: { InvalidPath; } break; - } - - exit:; - return is_reg_block_written; -} - -internal B32 -dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on) -{ - B32 is_flag_set = 0; - switch(thread->process->ctx->arch) - { - case Arch_Null: {} break; - case Arch_x64: - { - X64_RegBlock *reg_block = thread->reg_block; - if(is_on) { reg_block->rflags.u64 |= X64_RFlag_Trap; } - else { reg_block->rflags.u64 &= ~X64_RFlag_Trap; } - thread->is_reg_block_dirty = 1; - is_flag_set = 1; - } break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: { NotImplemented; }break; - default: { InvalidPath; } break; - } - Assert(is_flag_set); - return is_flag_set; -} - -internal void -dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n) -{ - DLLPushBack(list->first, list->last, n); - list->count += 1; -} - -internal DMN_LNX_ThreadPtrNode * -dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v) -{ - DMN_LNX_ThreadPtrNode *n = push_array(arena, DMN_LNX_ThreadPtrNode, 1); - n->v = v; - dmn_lnx_thread_ptr_list_push_node(list, n); - return n; -} - -internal void -dmn_lnx_thread_ptr_list_remove(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n) -{ - DLLRemove(list->first, list->last, n); - list->count -= 1; -} - -internal DMN_LNX_ModulePtrNode * -dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v) -{ - DMN_LNX_ModulePtrNode *n = push_array(arena, DMN_LNX_ModulePtrNode, 1); - n->v = v; - SLLQueuePush(list->first, list->last, n); - list->count += 1; - return n; -} - -internal DMN_LNX_ProcessPtrNode * -dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v) -{ - DMN_LNX_ProcessPtrNode *n = push_array(arena, DMN_LNX_ProcessPtrNode, 1); - n->v = v; - SLLQueuePush(list->first, list->last, n); - list->count += 1; - return n; -} - -internal void -dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) -{ - // push create process event - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_lnx_handle_from_process(process); - e->arch = process->ctx->arch; - e->code = process->pid; - e->tls_model = DMN_TlsModel_Gnu; // TODO: use dynamic linker path to figure out correct enum here -} - -internal void -dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_lnx_handle_from_process(process); - e->code = process->main_thread_exit_code; -} - -internal void -dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->arch = thread->process->ctx->arch; - e->code = thread->tid; -} - -internal void -dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->code = exit_code; -} - -internal void -dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module) -{ - // TODO: reporting this module breaks ctrl thread - String8 module_name = dmn_lnx_read_string(arena, thread->process->fd, module->name_vaddr); - if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) - { - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->module = dmn_lnx_handle_from_module(module); - e->arch = thread->process->ctx->arch; - e->address = module->base_vaddr; - e->size = module->size; - e->string = module_name; - e->elf_phdr_vrange = r1u64(module->phvaddr, module->phvaddr + module->phentsize * module->phcount); - e->elf_phdr_entsize = module->phentsize; - e->tls_index = module->tls_index; - e->tls_offset = module->tls_offset; - } -} - -internal void -dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_lnx_handle_from_process(process); - e->module = dmn_lnx_handle_from_module(module); -} - -internal void -dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_HandshakeComplete; - e->process = dmn_lnx_handle_from_process(process); - e->thread = dmn_lnx_handle_from_thread(process->first_thread); - e->arch = process->ctx->arch; -} - -internal void -dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_Breakpoint; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->instruction_pointer = address; -} - -internal void -dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_SingleStep; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); -} - -internal void -dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo) -{ - local_persist B8 is_repeatable[] = - { - 0, // null - 1, // 1 SIGHUP - 1, // 2 SIGINT - 1, // 3 SIGQUIT - 1, // 4 SIGTRAP - 1, // 5 SIGABRT - 1, // 6 SIGIOT - 1, // 7 SIGBUS - 1, // 8 SIGFPE - 1, // 9 SIGKILL - 1, // 10 SIGUSR1 - 1, // 11 SIGSEGV - 1, // 12 SIGUSR2 - 1, // 13 SIGPIPE - 1, // 14 SIGALRM - 1, // 15 SIGTERM - 1, // 16 SIGTKFLT - 0, // 17 SIGCHLD - 0, // 18 SIGCONT - 1, // 19 SIGSTOP - 1, // 20 SIGTSP - 1, // 21 SIGTTIN - 1, // 22 SIGTTOU - 0, // 23 SIGURG - 1, // 24 SIGXCPU - 1, // 25 SIGXFSZ - 1, // 26 SIGVTALRM - 1, // 27 SIGPROF - 0, // 28 SIGWINCH - 1, // 29 SIGIO - 1, // 30 SIGPWR - 1, // 31 SIGSYS - 1, // 32 SIGUNUSED - }; - - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_Exception; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); - e->signo = signo; - e->exception_repeated = signo < ArrayCount(is_repeatable) ? is_repeatable[signo] : 0; - - if(signo == SIGSEGV) - { - siginfo_t si = {0}; - OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, thread->tid, 0, &si)); - e->address = (U64)si.si_addr; - } -} - -internal void -dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_Halt; -} - -internal void -dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events) -{ - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_Error; - e->error_kind = DMN_ErrorKind_NotAttached; -} - -internal DMN_LNX_Thread * -dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid) -{ - DMN_LNX_Thread *thread = dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, tid); - dmn_lnx_push_event_create_thread(arena, events, thread); - return thread; -} - -internal void -dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code) -{ - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Process *process = thread->process; - - // store main thread's exit code - if(thread->tid == thread->process->pid) - { - thread->process->main_thread_exit_code = exit_code; - } - - // push exit event - dmn_lnx_push_event_exit_thread(arena, events, thread, exit_code); - - // release entity - dmn_lnx_thread_release(thread); - - // auto exit process on last thread - if(process->thread_count == 0) - { - dmn_lnx_event_exit_process(arena, events, process->pid); - } -} - -internal DMN_LNX_Process * -dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags) -{ - DMN_LNX_Process *process = dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Normal, parent_process, !!(flags & DMN_LNX_CreateProcessFlag_DebugSubprocesses), !!(flags & DMN_LNX_CreateProcessFlag_Cow)); - - if(flags & DMN_LNX_CreateProcessFlag_ClonedMemory) - { - process->ctx = parent_process->ctx; - } - else - { - process->ctx = dmn_lnx_process_ctx_alloc(process, !!(flags & DMN_LNX_CreateProcessFlag_Rebased)); - } - process->ctx->ref_count += 1; - - // install probes in a process that does not have a cloned memory - if(!(flags & DMN_LNX_CreateProcessFlag_ClonedMemory)) - { - dmn_lnx_process_trap_probes(process); - } - - // create main thread - dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, pid); - - // push events - dmn_lnx_push_event_create_process(arena, events, process); - for EachNode(thread, DMN_LNX_Thread, process->first_thread) - { - dmn_lnx_push_event_create_thread(arena, events, thread); - } - for EachNode(module, DMN_LNX_Module, process->ctx->first_module) - { - dmn_lnx_push_event_load_module(arena, events, process->first_thread, module); - } - dmn_lnx_push_event_handshake_complete(arena, events, process); - - return process; -} - -internal void -dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) -{ - DMN_LNX_Process *process = dmn_lnx_process_from_pid(pid); - AssertAlways(process->thread_count == 0); - - // push module events - for EachNode(module, DMN_LNX_Module, process->ctx->first_module) - { - dmn_lnx_push_event_unload_module(arena, events, process, module); - } - - // push process exit event - dmn_lnx_push_event_exit_process(arena, events, process); - - // release process - dmn_lnx_process_release(process); -} - -internal void -dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr) -{ - DMN_LNX_Process *process = thread->process; - - GNU_LinkMap64 map = {0}; - for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) - { - // read out new link map item - if(gnu_read_link_map(dmn_lnx_machine_op_mem_read, &process->fd, map_vaddr, process->ctx->dl_class, &map) != MachineOpResult_Ok) { break; } - - // was module already loaded? - DMN_LNX_Module *module = hash_table_search_u64_raw(process->ctx->loaded_modules_ht, map.addr_vaddr); - if(module) { continue; } - - // clone process ctx - if(process->is_cow) - { - process->is_cow = 0; - process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); - } - - // alloc module - module = dmn_lnx_module_alloc(process->ctx, process->fd, map.addr_vaddr, map.name_vaddr, name_space_id, 0); - - // push load module event - dmn_lnx_push_event_load_module(arena, events, thread, module); - } -} - -internal void -dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr) -{ - Temp scratch = scratch_begin(&arena, 1); - - DMN_LNX_ProcessCtx *ctx = process->ctx; - - // flag every module as inactive - for EachNode(module, DMN_LNX_Module, ctx->first_module) - { - module->is_live = 0; - } - - // mark live modules - B32 is_64bit = ctx->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); - for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) - { - GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_machine_op_mem_read, &process->fd); - for EachNode(link_map_n, GNU_LinkMapNode, link_map_list.first) - { - DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, link_map_n->v.addr_vaddr); - module->is_live = 1; - } - } - - // collect unloaded modules - DMN_LNX_ModulePtrList to_release = {0}; - for EachNode(module, DMN_LNX_Module, ctx->first_module) - { - if(!module->is_live) - { - dmn_lnx_module_ptr_list_push(scratch.arena, &to_release, module); - } - } - - // clone process context - if(to_release.count > 0) - { - if(process->is_cow) - { - process->is_cow = 0; - process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); - } - } - - // push events and clean up unloaded modules - for EachNode(module_n, DMN_LNX_ModulePtrNode, to_release.first) - { - dmn_lnx_push_event_unload_module(arena, events, process, module_n->v); - dmn_lnx_module_release(process->ctx, module_n->v); - } - - scratch_end(scratch); -} - -internal void -dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid) -{ - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Process *process = thread->process; - U64 ip = dmn_lnx_thread_read_ip(thread); - - // is this user trap? - DMN_ActiveTrap *hit_user_trap = 0; - { - DMN_Handle process_handle = dmn_lnx_handle_from_process(process); - for EachNode(active_trap, DMN_ActiveTrap, user_traps) - { - if(MemoryCompare(&active_trap->trap->process, &process_handle, sizeof(DMN_Handle)) == 0) - { - if(active_trap->trap->vaddr == ip-1) - { - hit_user_trap = active_trap; - break; - } - } - } - } - - // is this a probe trap? - DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; - if(hit_user_trap == 0) - { - for EachNode(active_trap, DMN_ActiveTrap, process->ctx->first_probe_trap) - { - if(active_trap->trap->vaddr == ip-1) - { - probe_type = active_trap->trap->id; - break; - } - } - } - - if(probe_type == DMN_LNX_ProbeType_InitComplete) - { - B32 is_init_completed = 0; - - DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_InitComplete]; - U64 name_space_id = 0, rdebug_addr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto init_complete_exit; } - if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } - - GNU_RDebugInfo64 rdebug = {0}; - if(gnu_read_r_debug(dmn_lnx_machine_op_mem_read, &process->fd, rdebug_addr, process->ctx->arch, &rdebug) != MachineOpResult_Ok) { goto init_complete_exit; } - if(rdebug.r_version < 1) { goto init_complete_exit; } - - dmn_lnx_event_load_module(arena, events, thread, name_space_id, rdebug.r_map); - - is_init_completed = 1; - init_complete_exit:; - AssertAlways(is_init_completed); - } - else if(probe_type == DMN_LNX_ProbeType_RelocComplete) - { - B32 is_reloc_completed = 0; - - DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_RelocComplete]; - U64 name_space_id = 0, new_link_map_addr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto reloc_complete_exit; } - if(!stap_read_arg_u(probe->args.v[2], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) { goto reloc_complete_exit; } - - dmn_lnx_event_load_module(arena, events, thread, name_space_id, new_link_map_addr); - - is_reloc_completed = 1; - reloc_complete_exit:; - AssertAlways(is_reloc_completed); - } - else if(probe_type == DMN_LNX_ProbeType_UnmapComplete) - { - B32 is_unmap_completed = 0; - - DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_UnmapComplete]; - U64 name_space_id = 0, rdebug_vaddr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } - if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } - - dmn_lnx_event_unload_module(arena, events, process, rdebug_vaddr); - - is_unmap_completed = 1; - unmap_complete_exit:; - AssertAlways(is_unmap_completed); - } - - if(probe_type == DMN_LNX_ProbeType_Null) - { - // rollback IP on user traps - if(hit_user_trap) - { - U64 ip = dmn_lnx_thread_read_ip(thread); - dmn_lnx_thread_write_ip(thread, ip - 1); - } - - DMN_Event *e = dmn_event_list_push(arena, events); - e->kind = DMN_EventKind_Breakpoint; - e->process = dmn_lnx_handle_from_process(process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); - } -} - -internal void -dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) -{ - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - - B32 is_valid = 1; - U64 address = 0; - switch(thread->process->ctx->arch) - { - case Arch_Null: {} break; - case Arch_x64: - { - X64_RegBlock *regs_x64 = thread->reg_block; - if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B0) - { - address = regs_x64->dr0.u64; - } - else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B1) - { - address = regs_x64->dr1.u64; - } - else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B2) - { - address = regs_x64->dr2.u64; - } - else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B3) - { - address = regs_x64->dr3.u64; - } - else - { - is_valid = 0; - } - } break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { NotImplemented; } break; - default: { InvalidPath; } break; - } - - if(is_valid) - { - dmn_lnx_push_event_breakpoint(arena, events, thread, address); - } -} - -internal void -dmn_lnx_event_halt(Arena *arena, DMN_EventList *events) -{ - dmn_lnx_push_event_halt(arena, events); -} - -internal void -dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid) -{ - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - - // clear single step flag - dmn_lnx_set_single_step_flag(thread, 0); - - // push event - dmn_lnx_push_event_single_step(arena, events, thread); -} - -internal void -dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo) -{ - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - - thread->pass_through_signal = 1; - thread->pass_through_signo = signo; - - dmn_lnx_push_event_exception(arena, events, thread, signo); -} - -internal DMN_LNX_Process * -dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) -{ - Temp scratch = scratch_begin(&arena, 1); - - // create process - DMN_LNX_Process *process = dmn_lnx_event_create_process(arena, events, pid, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses|DMN_LNX_CreateProcessFlag_Rebased); - - // extract threads from /proc/pid/task - { - String8 task_path = str8f(scratch.arena, "/proc/%d/task", pid); - DIR *task_dirp = opendir((char *)task_path.str); - if(task_dirp) - { - for(;;) - { - struct dirent *dirent = readdir(task_dirp); - if(dirent == 0) { break; } - - String8 tid_str = str8_cstring_capped(dirent->d_name, dirent->d_name + NAME_MAX); - if(str8_match(tid_str, str8_lit(".."), 0) || str8_match(tid_str, str8_lit("."), 0)) { continue; } - U64 tid_64 = u64_from_str8(tid_str, 10); - pid_t tid = (pid_t)tid_64; - AssertAlways(tid == tid_64); - - if(tid == pid) { continue; } // main thread was created during create process sequence - dmn_lnx_event_create_thread(arena, events, process, tid); - } - - OS_LNX_RETRY_ON_EINTR(closedir(task_dirp)); - } - } - - // extract modules from r_debug - { - B32 is_64bit = process->ctx->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->ctx->rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); - U64 name_space_id = 0; - for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) - { - dmn_lnx_event_load_module(arena, events, process->first_thread, name_space_id, rdebug_n->v.r_map); - name_space_id += 1; - } - } - - // handshake complete - dmn_lnx_push_event_handshake_complete(arena, events, process); - - scratch_end(scratch); - return process; -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) - -internal void -dmn_init(void) -{ - if(dmn_lnx_state == 0) - { - local_persist DMN_LNX_State state; - dmn_lnx_state = &state; - - dmn_lnx_state->arena = arena_alloc(); - dmn_lnx_state->access_mutex = mutex_alloc(); - dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain); - dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0); - dmn_lnx_state->tid_ht = hash_table_init(dmn_lnx_state->arena, 0x2000); - dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); - dmn_lnx_state->halter_mutex = mutex_alloc(); - dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Null); - - // find offsets of TLS index and TLS offset in the link_map struct - // - // TODO: assuming that target is using same libc version as debugger - { - DMN_LNX_DbDesc *tls_modid_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_modid"); - DMN_LNX_DbDesc *tls_offset_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_offset"); - if(tls_modid_desc && tls_offset_desc) - { - if(tls_modid_desc->bit_size <= 64 && tls_offset_desc->bit_size <= 64) - { - dmn_lnx_state->tls_modid_desc = *tls_modid_desc; - dmn_lnx_state->tls_offset_desc = *tls_offset_desc; - dmn_lnx_state->is_tls_detected = 1; - } - else { Assert(0 && "invalid TLS desc"); } - } - } - } -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) - -internal DMN_CtrlCtx * -dmn_ctrl_begin(void) -{ - DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; - dmn_lnx_ctrl_thread = 1; - return ctx; -} - -internal void -dmn_ctrl_exclusive_access_begin(void) -{ - MutexScope(dmn_lnx_state->access_mutex) - { - dmn_lnx_state->access_run_state = 1; - } -} - -internal void -dmn_ctrl_exclusive_access_end(void) -{ - MutexScope(dmn_lnx_state->access_mutex) - { - dmn_lnx_state->access_run_state = 0; - } -} - -internal U32 -dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) -{ - Temp scratch = scratch_begin(0, 0); - - // setup target command line - U64 argc = params->cmd_line.node_count + 1; - char **argv = push_array(scratch.arena, char *, argc); - { - U64 idx = 0; - for EachNode(n, String8Node, params->cmd_line.first) - { - argv[idx] = (char *)str8_copy(scratch.arena, n->string).str; - idx += 1; - } - } - - // setup target environment - U64 envc = os_lnx_state.default_env_count + params->env.node_count + 1; - char **envp = push_array(scratch.arena, char *, envc); - { - // copy default environment - MemoryCopyTyped(envp, os_lnx_state.default_env, os_lnx_state.default_env_count); - - // copy user environment - U64 idx = os_lnx_state.default_env_count; - for EachNode(n, String8Node, params->env.first) - { - envp[idx] = (char *)str8_copy(scratch.arena, n->string).str; - idx += 1; - } - } - - // create zero-terminated work directory path - char *work_dir_path = (char *)str8_copy(scratch.arena, params->path).str; - - // fork process - pid_t pid = fork(); - - // child process - if(pid == 0) - { - // wait for seize - if(OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)) < 0) { goto child_exit; } - - // change work directory to tracee - if(OS_LNX_RETRY_ON_EINTR(chdir(work_dir_path)) < 0) { goto child_exit; } - - // replace process with target program - if(OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, envp)) < 0) { goto child_exit; } - - child_exit:; - exit(0); - } - // parent process - else if(pid > 0) - { - // try to seize child process - if(dmn_lnx_ptrace_seize(pid) >= 0) - { - // tracee was successfully seized, create process - dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Launch, 0, params->debug_subprocesses, 0); - } - else - { - Assert(0 && "failed to ptrace child process"); - OS_LNX_RETRY_ON_EINTR(kill(SIGKILL, pid)); - OS_LNX_RETRY_ON_EINTR(waitpid(pid, 0, WNOHANG)); - pid = 0; - } - } - - scratch_end(scratch); - return pid; -} - -internal B32 -dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) -{ - B32 is_attached = 0; - if(dmn_lnx_ptrace_seize(pid) >= 0) - { - if(OS_LNX_RETRY_ON_EINTR(kill(pid, SIGSTOP)) >= 0) - { - dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Attach, 0, 1, 0); - is_attached = 1; - } - else - { - OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, pid, 0, 0)); - } - } - return is_attached; -} - -internal B32 -dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process_handle, U32 exit_code) -{ - B32 result = 0; - mutex_take(dmn_lnx_state->halter_mutex); - DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); - if(process) - { - result = OS_LNX_RETRY_ON_EINTR(kill(process->pid, SIGKILL)) >= 0; - } - mutex_drop(dmn_lnx_state->halter_mutex); - return result; -} - -internal B32 -dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process_handle) -{ - B32 result = 0; - mutex_take(dmn_lnx_state->halter_mutex); - DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); - if(process) - { - result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, process->pid, 0, 0)) >= 0; - } - mutex_drop(dmn_lnx_state->halter_mutex); - return result; -} - -internal DMN_EventList -dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) -{ - Temp scratch = scratch_begin(&arena, 1); - DMN_EventList events = {0}; - - mutex_take(dmn_lnx_state->halter_mutex); - - // wait for signals from the running threads - if(dmn_lnx_state->process_count > 0) - { - // write traps to memory - DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; - { - HashTable *process_ht = hash_table_init(scratch.arena, dmn_lnx_state->process_count); - for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) - { - for EachIndex(n_idx, n->count) - { - // skip hardware breakpoints - DMN_Trap *trap = n->v+n_idx; - if(trap->flags) { continue; } - - HashTable *active_trap_ht = hash_table_search_u64_raw(process_ht, trap->process.u64[0]); - if(active_trap_ht == 0) - { - active_trap_ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); - hash_table_push_u64_raw(scratch.arena, process_ht, trap->process.u64[0], active_trap_ht); - } - - // TODO: ctrl sends down duplicate traps - DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); - if(is_set) { continue; } - - // TODO: ctrl sends down traps for exited process - DMN_LNX_Process *process = dmn_lnx_process_from_handle(trap->process); - if(!process) { continue; } - - // trap instruction - DMN_ActiveTrap *active_trap = dmn_set_trap(scratch.arena, trap); - - // add trap to the active list - SLLQueuePush(active_trap_first, active_trap_last, active_trap); - - // add (address -> trap) - hash_table_push_u64_raw(scratch.arena, active_trap_ht, trap->vaddr, active_trap); - } - } - } - - // enable single stepping - if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) - { - DMN_LNX_Thread *single_step_thread = dmn_lnx_thread_from_handle(ctrls->single_step_thread); - if(single_step_thread) - { - dmn_lnx_set_single_step_flag(single_step_thread, 1); - } - else - { - Assert(0 && "invalid single_step_thread handle"); - } - } - - // schedule threads to run - DMN_LNX_ThreadPtrList running_threads = {0}; - { - for EachNode(process, DMN_LNX_Process, dmn_lnx_state->first_process) - { - //- rjf: determine if this process is frozen - B32 process_is_frozen = 0; - if(ctrls->run_entities_are_processes) - { - for EachIndex(idx, ctrls->run_entity_count) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_process(process))) - { - process_is_frozen = 1; - break; - } - } - } - - for EachNode(thread, DMN_LNX_Thread, process->first_thread) - { - //- rjf: determine if this thread is frozen - B32 is_frozen = 0; - - // rjf: not single-stepping? determine based on run controls freezing info - if(dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) - { - if(ctrls->run_entities_are_processes) - { - is_frozen = process_is_frozen; - } - else - { - for EachIndex(idx, ctrls->run_entity_count) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_thread(thread))) - { - is_frozen = 1; - break; - } - } - } - if(ctrls->run_entities_are_unfrozen) - { - is_frozen ^= 1; - } - } - // rjf: single-step? freeze if not the single-step thread. - else - { - is_frozen = !dmn_handle_match(dmn_lnx_handle_from_thread(thread), ctrls->single_step_thread); - } - - // resume thread - if(!is_frozen) - { - AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - - // write registers - if(thread->is_reg_block_dirty) - { - thread->is_reg_block_dirty = !dmn_lnx_thread_write_reg_block(thread); - } - - // pass signal to the child process - void *sig_code = 0; - if(thread->pass_through_signal) - { - thread->pass_through_signal = 0; - if(!ctrls->ignore_previous_exception) - { - sig_code = (void *)(uintptr_t)thread->pass_through_signo; - } - } - - // resume thread - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, thread->tid, 0, sig_code)) >= 0) - { - thread->state = DMN_LNX_ThreadState_Running; - thread->is_reg_block_dirty = 1; - dmn_lnx_thread_ptr_list_push(scratch.arena, &running_threads, thread); - } - else - { - if(errno == ESRCH) - { - // Race note: In multithreaded programs, ptrace(PTRACE_CONT) may fail if a running thread calls - // exit_group while we are resuming threads. The kernel begins tearing down the thread group so - // the target might not be in a ptrace-soppped state anymore. Handle this by ignoring, on waitpid - // we will get chance to report exit event. - // - // TODO: unfortunatley, kernel also sends us ESRCH whenever ptrace(PTRACE_CONT) is sent to a tracee - // that is not in a ptace-stop, so how can we tell these errors apart? - } - else - { - InvalidPath; - } - } - } - } - } - } - - // hash running threads tids - HashTable *running_threads_ht = hash_table_init(scratch.arena, running_threads.count * 2); - for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) - { - hash_table_push_u64_raw(scratch.arena, running_threads_ht, n->v->tid, n); - } - - B32 is_halt_done = 0; - DMN_LNX_ThreadPtrList stopped_threads = {0}; - do - { - // wait for a signal - int status = 0; - pid_t wait_id = 0; - { - mutex_drop(dmn_lnx_state->halter_mutex); - for(;;) - { - wait_id = OS_LNX_RETRY_ON_EINTR(waitpid(-1, &status, __WALL|__WNOTHREAD)); - if(wait_id == -1) { InvalidPath; } // TODO: graceful exit - break; - } - mutex_take(dmn_lnx_state->halter_mutex); - } - - // unpack status - int wifexited = WIFEXITED(status); - int wifsignaled = WIFSIGNALED(status); - int wifstopped = WIFSTOPPED(status); - int wstopsig = WSTOPSIG(status); - int event_code = (status >> 16); - - // intercept initing processes - { - DMN_LNX_Process *process = dmn_lnx_process_from_pid(wait_id); - - if(process && process->state != DMN_LNX_ProcessState_Normal) - { - switch(process->state) - { - case DMN_LNX_ProcessState_Null: - case DMN_LNX_ProcessState_Normal: - { - InvalidPath; - } break; - case DMN_LNX_ProcessState_Launch: - { - if(wstopsig == SIGSTOP) - { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, process->pid, 0, 0)) >= 0) - { - process->state = DMN_LNX_ProcessState_WaitForExec; - goto wait_for_signal; - } - else { Assert(0 && "failed to resume tracee"); } - } - // else { Assert(0 && "unexpected signal"); } - } break; - case DMN_LNX_ProcessState_WaitForExec: - { - if(wstopsig == SIGTRAP && event_code == PTRACE_EVENT_EXEC) - { - DMN_LNX_CreateProcessFlags create_flags = process->debug_subprocesses ? DMN_LNX_CreateProcessFlag_DebugSubprocesses : 0; - dmn_lnx_process_release(process); - dmn_lnx_event_create_process(arena, &events, wait_id, 0, create_flags); - goto wait_for_signal; - } - //else { Assert(0 && "unexpected signal"); } - } break; - case DMN_LNX_ProcessState_ExecFailedDoExit: - { - if(wifexited) - { - dmn_lnx_process_release(process); - goto wait_for_signal; - } - else { Assert(0 && "unexpected signal"); } - } break; - case DMN_LNX_ProcessState_Attach: - { - if(wstopsig == SIGSTOP) - { - DMN_LNX_CreateProcessFlags create_flags = process->debug_subprocesses ? DMN_LNX_CreateProcessFlag_DebugSubprocesses : 0; - dmn_lnx_process_release(process); - dmn_lnx_event_create_process(arena, &events, wait_id, 0, create_flags); - goto wait_for_signal; - } - else { Assert(0 && "unexpected signal"); } - } break; - } - - // shutdown process - { - if(OS_LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)) >= 0) - { - process->state = DMN_LNX_ProcessState_ExecFailedDoExit; - } - else - { - //Assert(0 && "failed to send kill signal to the tracee"); - dmn_lnx_process_release(process); - } - } - - wait_for_signal:; - continue; - } - } - - if(wifstopped || wifsignaled || wifexited) - { - DMN_LNX_ThreadPtrNode *thread_n = hash_table_search_u64_raw(running_threads_ht, wait_id); - if(thread_n) - { - DMN_LNX_Thread *thread = thread_n->v; - AssertAlways(thread->state == DMN_LNX_ThreadState_Running); - - // remove mapping - hash_table_purge_u64(running_threads_ht, thread->tid); - - // move thread to the stopped list - dmn_lnx_thread_ptr_list_remove(&running_threads, thread_n); - dmn_lnx_thread_ptr_list_push_node(&stopped_threads, thread_n); - - // update thread state - if(wifstopped && !wifsignaled && !wifexited) - { - thread->state = DMN_LNX_ThreadState_Stopped; - } - else if(!wifstopped && (wifsignaled || wifexited)) - { - thread->state = DMN_LNX_ThreadState_Exited; - } - else { InvalidPath; } - - // stop all other threads - if(stopped_threads.count == 1) - { - for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) - { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, n->v->tid, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } - } - } - } - } - - // normal child exit via _exit or exit() - if(wifexited) - { - dmn_lnx_event_exit_thread(arena, &events, wait_id, WEXITSTATUS(status)); - } - - // exit because child did not handle a signal - else if(wifsignaled) - { - dmn_lnx_event_exit_thread(arena, &events, wait_id, WTERMSIG(status)); - } - // thread or group stop - else if(wifstopped) - { - // read thread registers - { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); - if(thread && thread->state != DMN_LNX_ThreadState_PendingCreation) - { - thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); - Assert(!thread->is_reg_block_dirty); - } - } - - if(wstopsig == SIGTRAP) - { - switch(event_code) - { - case 0: - { - // translate signal code to DEMON event - siginfo_t siginfo = {0}; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) - { - switch(siginfo.si_code) - { - case SI_KERNEL: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; - case TRAP_BRKPT: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; - case TRAP_TRACE: { dmn_lnx_event_single_step(arena, &events, wait_id); } break; - case TRAP_HWBKPT: { dmn_lnx_event_data_breakpoint(arena, &events, wait_id); } break; - case TRAP_BRANCH: { NotImplemented; }break; - case TRAP_UNK: { NotImplemented; }break; - default: { InvalidPath; } break; - } - } else { Assert(0 && "failed to get signal info"); } - }break; - case PTRACE_EVENT_FORK: - { - NotImplemented; - }break; - case PTRACE_EVENT_VFORK: - { - NotImplemented; - }break; - case PTRACE_EVENT_VFORK_DONE: - { - NotImplemented; - }break; - case PTRACE_EVENT_CLONE: - { - // kernel stopped the parent just before scheduling the child to - // give us a chance to prepare to trace it; next event for the child - // will be a PTRACE_EVENT_STOP - - pid_t new_tid; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid)) >= 0) - { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); - - // create a new partially inited thread - dmn_lnx_thread_alloc(thread->process, DMN_LNX_ThreadState_PendingCreation, new_tid); - } - else { Assert(0 && "failed to get new tid"); } - }break; - case PTRACE_EVENT_EXEC: - { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); - DMN_LNX_Process *process = thread->process; - if(process->debug_subprocesses) - { - dmn_lnx_event_exit_thread(arena, &events, wait_id, 0); - dmn_lnx_event_create_process(arena, &events, wait_id, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses); - } - else - { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, wait_id, 0, 0)) >= 0) - { - dmn_lnx_event_exit_thread(arena, &events, wait_id, 0); - } - else { Assert(0 && "failed to detach"); } - } - }break; - case PTRACE_EVENT_EXIT: - { - AssertAlways(0 && "exit tracing is disabled, this event should not be delivered"); - }break; - case PTRACE_EVENT_SECCOMP: - { - NotImplemented; - }break; - case PTRACE_EVENT_STOP: - { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); - if(thread->state == DMN_LNX_ThreadState_PendingCreation) - { - DMN_LNX_Process *process = thread->process; - dmn_lnx_thread_release(thread); - thread = dmn_lnx_event_create_thread(arena, &events, process, wait_id); - } - else - { - AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); - } - }break; - default: { Assert(0 && "unexpected ptrace code"); } break; - } - } - else if(wstopsig == SIGSTOP) - { - siginfo_t siginfo = {0}; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) - { - // finish halting if this is our SIGSTOP - if(siginfo.si_pid == dmn_lnx_state->halter_tid) - { - is_halt_done = 1; - } - else - { - // TODO: handle SIGSTOP - } - } - } - else - { - dmn_lnx_event_exception(arena, &events, wait_id, wstopsig); - } - } - else { Assert(0 && "unexpected stop code"); } - } while(running_threads.count > 0 || dmn_lnx_state->process_pending_creation > 0 || dmn_lnx_state->threads_pending_creation > 0); - - // finalize halter state - if(is_halt_done) - { - // push event - dmn_lnx_event_halt(arena, &events); - - // reset state - dmn_lnx_state->halter_tid = 0; - dmn_lnx_state->halt_code = 0; - dmn_lnx_state->halt_user_data = 0; - dmn_lnx_state->is_halting = 0; - } - - // restore original instruction bytes - for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) - { - // skip process that exited during the wait - DMN_LNX_Process *process = dmn_lnx_process_from_handle(active_trap->trap->process); - if(!process) { continue; } - - if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str) && - active_trap->good) - { - // TODO(rjf): log an error here? - we wrote the trap successfully, but we did not remove it successfully, - // implying a change in address mapping. this is maybe not even a bug, since the address is simply now - // unmapped. - } - } - } - - if(events.count == 0 && dmn_lnx_state->process_count == 0) - { - dmn_lnx_push_event_not_attached(arena, &events); - } - - mutex_drop(dmn_lnx_state->halter_mutex); - scratch_end(scratch); - return events; -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) - -internal void -dmn_halt(U64 code, U64 user_data) -{ - mutex_take(dmn_lnx_state->halter_mutex); - if(dmn_lnx_state->process_count) - { - dmn_lnx_state->halter_tid = gettid(); - dmn_lnx_state->halt_code = code; - dmn_lnx_state->halt_user_data = user_data; - for EachNode(process, DMN_LNX_Process, dmn_lnx_state->first_process) - { - if(OS_LNX_RETRY_ON_EINTR(kill(process->pid, SIGSTOP)) < 0) { Assert(0 && "failed to send SIGSTOP"); } - } - } - mutex_drop(dmn_lnx_state->halter_mutex); -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) - -//- rjf: non-blocking-control-thread access barriers - -internal B32 -dmn_access_open(void) -{ - B32 result = 0; - if(dmn_lnx_ctrl_thread) - { - result = 1; - } - else - { - mutex_take(dmn_lnx_state->access_mutex); - result = !dmn_lnx_state->access_run_state; - } - return result; -} - -internal void -dmn_access_close(void) -{ - if(!dmn_lnx_ctrl_thread) - { - mutex_drop(dmn_lnx_state->access_mutex); - } -} - -//- rjf: processes - -internal U64 -dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) -{ - return 0; -} - -internal void -dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size) -{ -} - -internal void -dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size) -{ -} - -internal void -dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) -{ -} - -internal void -dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags) -{ -} - -internal U64 -dmn_process_read(DMN_Handle process_handle, Rng1U64 range, void *dst) -{ - DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); - U64 result = 0; - if(process) - { - result = dmn_lnx_read(process->fd, range, dst); - } - return result; -} - -internal B32 -dmn_process_write(DMN_Handle process_handle, Rng1U64 range, void *src) -{ - DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); - B32 result = 0; - if(process) - { - result = dmn_lnx_write(process->fd, range, src); - } - return result; -} - -//- rjf: threads - -internal Arch -dmn_arch_from_thread(DMN_Handle thread_handle) -{ - Arch arch = Arch_Null; - DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); - if(thread) - { - arch = thread->process->ctx->arch; - } - return arch; -} - -internal U64 -dmn_stack_base_vaddr_from_thread(DMN_Handle thread_handle) -{ - return 0; -} - -internal U64 -dmn_tls_root_vaddr_from_thread(DMN_Handle thread_handle) -{ - U64 tls_root_vaddr = max_U64; - DMN_AccessScope - { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); - if(thread) - { - switch(thread->process->ctx->arch) - { - case Arch_Null: {} break; - case Arch_x64: - { - X64_RegBlock *reg_block = thread->reg_block; - U64 dtv_pointer = 0; - if(dmn_lnx_read_struct(thread->process->fd, reg_block->fsbase.u64 + 8, &dtv_pointer)) - { - tls_root_vaddr = dtv_pointer; - } - } break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { - NotImplemented; - } break; - default: { InvalidPath; } break; - } - } - } - return tls_root_vaddr; -} - -internal B32 -dmn_thread_read_reg_block(DMN_Handle thread_handle, void *reg_block) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); - if(thread) - { - ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); - U64 reg_block_size = arch_info->reg_block_size; - MemoryCopy(reg_block, thread->reg_block, reg_block_size); - } - result = 1; - } - return result; -} - -internal B32 -dmn_thread_write_reg_block(DMN_Handle thread_handle, void *reg_block) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); - if(thread) - { - ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); - U64 reg_block_size = arch_info->reg_block_size; - MemoryCopy(thread->reg_block, reg_block, reg_block_size); - thread->is_reg_block_dirty = 1; - result = 1; - } - } - return result; -} - -//- rjf: system process listing - -internal void -dmn_process_iter_begin(DMN_ProcessIter *iter) -{ - DIR *dir = opendir("/proc"); - MemoryZeroStruct(iter); - iter->v[0] = IntFromPtr(dir); -} - -internal B32 -dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out) -{ - // rjf: scan for the next process ID in the directory - B32 got_pid = 0; - String8 pid_string = {0}; - { - DIR *dir = (DIR*)PtrFromInt(iter->v[0]); - if(dir != 0 && iter->v[1] == 0) - { - for(;;) - { - // rjf: get next entry - struct dirent *d = readdir(dir); - if(d == 0) - { - break; - } - - // rjf: check file name is integer - String8 file_name = str8_cstring((char*)d->d_name); - B32 is_integer = str8_is_integer(file_name, 10); - - // rjf: break on integers (which represent processes) - if(is_integer) - { - got_pid = 1; - pid_string = file_name; - break; - } - } - } - } - - // rjf: if we found a process id, map id => info - B32 result = 0; - if(got_pid) - { - pid_t pid = u64_from_str8(pid_string, 10); - String8 name = dmn_lnx_exe_path_from_pid(arena, pid); - if(name.size == 0) - { - name = str8_lit("(unknown process)"); - } - info_out->name = name; - info_out->pid = pid; - result = 1; - } - - return result; -} - -internal void -dmn_process_iter_end(DMN_ProcessIter *iter) -{ - DIR *dir = (DIR*)PtrFromInt(iter->v[0]); - if(dir != 0) - { - closedir(dir); - } - MemoryZeroStruct(iter); -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ Includes + +#include +#include +#include + +//////////////////////////////// + +internal U64 +dmn_lnx_size_from_fd(int memory_fd, U64 cap) +{ + U8 temp[4096]; + size_t cursor = 0; + while(cursor < cap) + { + ssize_t actual_read = OS_LNX_RETRY_ON_EINTR(pread(memory_fd, temp, sizeof(temp), cursor)); + if(actual_read <= 0) { break; } + cursor += (U64)actual_read; + } + return (U64)cursor; +} + +internal U64 +dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst) +{ + size_t cursor = 0, size = dim_1u64(range); + while(cursor < size) + { + size_t to_read = size - cursor; + ssize_t actual_read = OS_LNX_RETRY_ON_EINTR(pread(memory_fd, (U8 *)dst + cursor, to_read, range.min + cursor)); + if(actual_read < 0) { break; } + if(actual_read == 0) { break; } + cursor += actual_read; + } + return cursor; +} + +internal B32 +dmn_lnx_write(int memory_fd, Rng1U64 range, void *src) +{ + size_t cursor = 0, size = dim_1u64(range); + while(cursor < size) + { + size_t to_write = size - cursor; + ssize_t actual_write = OS_LNX_RETRY_ON_EINTR(pwrite(memory_fd, (U8 *)src + cursor, to_write, range.min + cursor)); + if(actual_write <= 0) { break; } + cursor += actual_write; + } + B32 is_written = (cursor == size); + return is_written; +} + +internal String8 +dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size) +{ + String8 result = {0}; + U64 string_size = 0; + for(U64 vaddr = base_vaddr; string_size < cap_size; vaddr += 1, string_size += 1) + { + char byte = 0; + if(OS_LNX_RETRY_ON_EINTR(pread(memory_fd, &byte, sizeof(byte), vaddr) <= 0)) + { + break; + } + if(byte == '\0' || byte == '\n') + { + break; + } + } + if(string_size != 0) + { + char *buf = push_array_no_zero(arena, char, string_size+1); + OS_LNX_RETRY_ON_EINTR(pread(memory_fd, buf, string_size, base_vaddr)); + buf[string_size] = '\0'; + result = str8((U8 *)buf, string_size); + } + return result; +} + +internal String8 +dmn_lnx_read_string(Arena *arena, int memory_fd, U64 vaddr) +{ + return dmn_lnx_read_string_capped(arena, memory_fd, vaddr, 4096); +} + +internal +MACHINE_OP_MEM_READ(dmn_lnx_machine_op_mem_read) +{ + U64 read_size = dmn_lnx_read(*(int *)ud, r1u64(addr, addr + buffer_size), buffer); + return read_size == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; +} + +internal int +dmn_lnx_ptrace_seize(pid_t pid) +{ + // TODO: PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACEFORK + return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE)); +} + +internal String8 +dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8 exe_link_path = str8f(scratch.arena, "/proc/%d/exe", pid); + String8List parts = {0}; + int readlink_result = 0; + for(S64 r = 0, cap = PATH_MAX; r < 4; cap *= 2, r += 1) + { + U8 *buffer = push_array(arena, U8, cap); + readlink_result = readlink((char *)exe_link_path.str, (char *)buffer, cap); + + if(readlink_result < 0) + { + break; + } + + str8_list_push(scratch.arena, &parts, str8(buffer, readlink_result)); + + if(readlink_result < cap) + { + break; + } + } + + String8 result = str8_list_join(arena, &parts, 0); + scratch_end(scratch); + return result; +} + +internal String8 +dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8 dl_path = {0}; + + int maps_fd = OS_LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY)); + if(maps_fd != -1) + { + // read entire /proc/pid/maps + U64 maps_size = dmn_lnx_size_from_fd(maps_fd, MB(1)); + U8 *maps_ptr = push_array(scratch.arena, U8, maps_size); + U64 read_size = dmn_lnx_read(maps_fd, r1u64(0, maps_size), maps_ptr); + + // split map file on lines + String8List lines = str8_split_by_string_chars(scratch.arena, str8(maps_ptr, maps_size), str8_lit("\n"), 0); + + // scan each line until a virtual mapping whose low part matches the DL base address is found + for EachNode(n, String8Node, lines.first) + { + String8 line = n->string; + + // split the string while respecting escape sequences + String8List parts = {0}; + for EachIndex(cursor, line.size) + { + if(parts.node_count > 5) { break; } + if(line.str[cursor] == ' ') { continue; } + + // scan forward to the closing delimiter + U64 token_start = cursor; + for(; cursor < line.size; cursor += 1) + { + if(line.str[cursor] == '\\') + { + cursor += 1; + continue; + } + if(line.str[cursor] == ' ') { break; } + } + + // push sub-string to the list + str8_list_push(scratch.arena, &parts, str8_substr(line, r1u64(token_start, cursor))); + } + + // was line parsed correctly? + if(parts.node_count < 5) { Assert(0 && "failed to parse map line"); continue; } + + // parse map virtual range + String8List vaddr_list = str8_split_by_string_chars(scratch.arena, parts.first->string, str8_lit("-"), 0); + if(vaddr_list.node_count != 2) { Assert(0 && "failed to parse virtual range portion of map line"); continue; } + + // does the low part match DL base address? + U64 lo_vaddr = u64_from_str8(vaddr_list.first->string, 16); + if(lo_vaddr == auxv_base) + { + dl_path = parts.node_count == 5 ? str8_zero() : parts.last->string; + dl_path = push_str8_copy(arena, dl_path); + break; + } + } + + OS_LNX_RETRY_ON_EINTR(close(maps_fd)); + } + else { Assert(0 && "failed to open DL fd"); } + + scratch_end(scratch); + Assert(dl_path.size); + return dl_path; +} + +internal ELF_Hdr64 +dmn_lnx_ehdr_from_pid(pid_t pid) +{ + Temp scratch = scratch_begin(0, 0); + + ELF_Hdr64 exe = {0}; + B32 is_read = 0; + + char *exe_path = (char *)str8f(scratch.arena, "/proc/%d/exe", pid).str; + int exe_fd = OS_LNX_RETRY_ON_EINTR(open(exe_path, O_RDONLY)); + + if(exe_fd >= 0) + { + is_read = elf_read_ehdr(dmn_lnx_machine_op_mem_read, &exe_fd, 0, &exe); + OS_LNX_RETRY_ON_EINTR(close(exe_fd)); + } + + Assert(is_read); + scratch_end(scratch); + return exe; +} + +internal DMN_LNX_Auxv +dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) +{ + Temp scratch = scratch_begin(0, 0); + DMN_LNX_Auxv result = {0}; + + // rjf: open aux data + String8 auxv_path = str8f(scratch.arena, "/proc/%d/auxv", pid); + int auxv_fd = OS_LNX_RETRY_ON_EINTR(open((char *)auxv_path.str, O_RDONLY)); + + // rjf: scan aux data + if(auxv_fd >= 0) + { + for(;;) + { + // rjf: read next aux + ELF_Auxv64 auxv = {0}; + switch(elf_class) + { + case ELF_Class_None:{}break; + case ELF_Class_32: + { + ELF_Auxv32 auxv32 = {0}; + if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32)) { goto brkloop; } + auxv = elf_auxv64_from_auxv32(auxv32); + }break; + case ELF_Class_64: + { + if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv)) { goto brkloop; } + }break; + default:{NotImplemented;}break; + } + + // rjf: fill result + switch(auxv.a_type) + { + default:{}break; + case ELF_AuxType_Null: goto brkloop; break; + case ELF_AuxType_Base: result.base = auxv.a_val; break; + case ELF_AuxType_Phnum: result.phnum = auxv.a_val; break; + case ELF_AuxType_Phent: result.phent = auxv.a_val; break; + case ELF_AuxType_Phdr: result.phdr = auxv.a_val; break; + case ELF_AuxType_ExecFn: result.execfn = auxv.a_val; break; + case ELF_AuxType_Pagesz: result.pagesz = auxv.a_val; break; + } + } + brkloop:; + OS_LNX_RETRY_ON_EINTR(close(auxv_fd)); + } + + scratch_end(scratch); + return result; +} + +internal DMN_LNX_Thread * +dmn_lnx_thread_from_pid(pid_t tid) +{ + return hash_table_search_u64_raw(dmn_lnx_state->tid_ht, tid); +} + +internal DMN_LNX_Process * +dmn_lnx_process_from_pid(pid_t pid) +{ + return hash_table_search_u64_raw(dmn_lnx_state->pid_ht, pid); +} + +internal Rng1U64 +dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) +{ + Rng1U64 result = { .min = max_U64 }; + + for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) + { + ELF_Phdr64 phdr = {0}; + if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) + { + Assert(0 && "unable to read a program header"); + } + + if(phdr.p_type == ELF_PType_Load) + { + U64 min = rebase + phdr.p_vaddr; + U64 max = rebase + phdr.p_vaddr + phdr.p_memsz; + result.min = Min(result.min, min); + result.max = Max(result.max, max); + } + } + + return result; +} + +internal DMN_LNX_DynamicInfo +dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr) +{ + DMN_LNX_DynamicInfo dynamic_info = {0}; + for(U64 dynamic_cursor = dynamic_vaddr; ; dynamic_cursor += elf_dyn_size_from_class(elf_class)) + { + // rjf: read next dyn entry + ELF_Dyn64 dyn = {0}; + if(elf_read_dyn(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_cursor, elf_class, &dyn) != MachineOpResult_Ok) { Assert(0 && "unable to read dynamic"); } + + // rjf: break on zero + if(dyn.tag == ELF_DynTag_Null) { break; } + + // extract reuiqred values out of dynamic section + if(dyn.tag == ELF_DynTag_Strtab) + { + dynamic_info.strtab_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_Strsz) + { + dynamic_info.strtab_size = dyn.val; + } + else if(dyn.tag == ELF_DynTag_Symtab) + { + dynamic_info.symtab_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_Syment) + { + dynamic_info.symtab_entry_size = dyn.val; + } + else if(dyn.tag == ELF_DynTag_Hash) + { + dynamic_info.hash_vaddr = rebase + dyn.val; + } + else if(dyn.tag == ELF_DynTag_GNU_Hash) + { + dynamic_info.gnu_hash_vaddr = rebase + dyn.val; + } + } + return dynamic_info; +} + +internal U64 +dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) +{ + U64 result = max_U64; + + for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) + { + ELF_Phdr64 phdr = {0}; + if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) + { + Assert(0 && "unable to read a program header"); + } + + if(phdr.p_type == ELF_PType_Dynamic) + { + result = rebase + phdr.p_vaddr; + break; + } + } + + return result; +} + +internal U64 +dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) +{ + Temp scratch = scratch_begin(0, 0); + + U64 rdebug_vaddr = 0; + + // load DL's header + ELF_Hdr64 ehdr = {0}; + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, loader_vbase, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); goto exit; } + + U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; + ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; + + // find dynamic program header + U64 phdr_vaddr = loader_vbase + ehdr.e_phoff; + U64 dynamic_vaddr = dmn_lnx_find_dynamic_phdr(memory_fd, elf_class, rebase, phdr_vaddr, ehdr.e_phentsize, ehdr.e_phentsize); + + // extract necessary info out of dynamic program header + U64 dynamic_info_rebase = is_rebased ? 0 : rebase; + DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, dynamic_info_rebase, dynamic_vaddr); + + // extract symbol table count from available options + U64 symbol_count = 0; + if(dynamic_info.hash_vaddr) + { + U64 hash_entry_size = 4; + if(elf_class == ELF_Class_64 && (ehdr.e_machine == ELF_MachineKind_ALPHA || ehdr.e_machine == ELF_MachineKind_S390 || ehdr.e_machine == ELF_MachineKind_S390_OLD)) + { + hash_entry_size = 8; + } + + U64 chain_count = 0; + if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) + { + symbol_count = chain_count; + } + else + { + Assert(0 && "failed to read hash table's chain count out of HASH"); + } + } + else + { + // TODO: extract count from GNU_HASH + NotImplemented; + } + + // scan symbol table for the rendezvous symbol + if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) + { + for EachIndex(symbol_idx, symbol_count) + { + ELF_Sym64 symbol = {0}; + if(elf_read_symbol(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_info.symtab_vaddr + symbol_idx * dynamic_info.symtab_entry_size, elf_class, &symbol) != MachineOpResult_Ok) + { + Assert(0 && "failed to read symbol table"); + break; + } + + Temp temp = temp_begin(scratch.arena); + + String8 symbol_name = {0}; + if(symbol.st_name < dynamic_info.strtab_size) + { + U64 cap = dynamic_info.strtab_size - symbol.st_name; + symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); + } + + if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) + { + ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info); + if(symbol_type == ELF_SymType_Object && symbol.st_size > 0) + { + rdebug_vaddr = rebase + symbol.st_value; + break; + } + } + + temp_end(temp); + } + } + + exit:; + scratch_end(scratch); + return rdebug_vaddr; +} + +internal DMN_LNX_ProbeList +dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) +{ + Temp scratch = scratch_begin(&arena, 1); + + DMN_LNX_ProbeList probes = {0}; + + ELF_Hdr64 ehdr = {0}; + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &fd, offset, &ehdr) != MachineOpResult_Ok) { goto exit; } + + U64 strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize; + ELF_Shdr64 strtab_shdr = {0}; + if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr) != MachineOpResult_Ok) { goto exit; } + + B32 found_probes = 0; + B32 found_probes_base = 0; + ELF_Shdr64 text_shdr = {0}; + ELF_Shdr64 stapsdt_base_shdr = {0}; + ELF_Shdr64 stapsdt_shdr = {0}; + for(U64 shdr_off = offset + ehdr.e_shoff, shdr_opl = shdr_off + ehdr.e_shentsize * ehdr.e_shnum; + shdr_off < shdr_opl; + shdr_off += ehdr.e_shentsize) { + ELF_Shdr64 shdr = {0}; + if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr) != MachineOpResult_Ok) { goto exit; } + + if(shdr.sh_type == ELF_ShType_Note) + { + U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; + U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; + String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); + + if(str8_match(name, str8_lit(".note.stapsdt"), 0)) + { + stapsdt_shdr = shdr; + found_probes = 1; + } + } + else if(shdr.sh_type == ELF_ShType_ProgBits) + { + U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; + U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; + String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); + + if(str8_match(name, str8_lit(".stapsdt.base"), 0)) + { + stapsdt_base_shdr = shdr; + found_probes_base = 1; + } else if(str8_match(name, str8_lit(".text"), 0)) + { + text_shdr = shdr; + } + } + + if(found_probes && found_probes_base) { break; } + } + + if(!found_probes || !found_probes_base) { goto exit; } + + U64 probes_base = stapsdt_base_shdr.sh_addr; + + Rng1U64 note_range = shift_1u64(r1u64(stapsdt_shdr.sh_offset, stapsdt_shdr.sh_offset + stapsdt_shdr.sh_size), offset); + void *raw_note = push_array(arena, U8, stapsdt_shdr.sh_size); + U64 note_read_size = dmn_lnx_read(fd, note_range, raw_note); + if(note_read_size != dim_1u64(note_range)) { goto exit; } + + Arch arch = arch_from_elf_machine(ehdr.e_machine); + ELF_NoteList note = elf_parse_note(scratch.arena, str8(raw_note, dim_1u64(note_range)), ehdr.e_ident[ELF_Identifier_Class], ehdr.e_machine); + + for EachNode(n, ELF_NoteNode, note.first) + { + ELF_Note *note = &n->v; + if(!str8_match(note->owner, str8_lit("stapsdt"), 0)) { continue; } + if(note->type != ELF_NoteType_STapSdt) { continue; } + + DMN_LNX_Probe probe = {0}; + { + U64 cursor = 0; + U64 addr_size = ehdr.e_ident[ELF_Identifier_Class] == ELF_Class_64 ? 8 : 4; + + U64 pc = 0; + U64 pc_size = str8_deserial_read(note->desc, cursor, &pc, addr_size, addr_size); + if (pc_size == 0) { goto exit; } + cursor += pc_size; + + U64 base_addr = 0; + U64 base_addr_size = str8_deserial_read(note->desc, cursor, &base_addr, addr_size, addr_size); + if (base_addr_size == 0) { goto exit; } + cursor += base_addr_size; + + U64 semaphore = 0; + U64 semaphore_size = str8_deserial_read(note->desc, cursor, &semaphore, addr_size, addr_size); + if (semaphore_size == 0) { goto exit; } + cursor += semaphore_size; + + String8 provider = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); + cursor += provider.size + 1; + if (cursor > note->desc.size) { goto exit; } + + String8 name = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); + cursor += name.size + 1; + if (cursor > note->desc.size) { goto exit; } + + String8 args = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size); + cursor += args.size + 1; + if (cursor > note->desc.size) { goto exit; } + + U64 probe_rebase = image_base + (base_addr - probes_base); + + probe.provider = provider; + probe.name = name; + probe.args = stap_arg_array_from_string(arena, arch, args); + probe.pc = pc + probe_rebase; + probe.semaphore = semaphore ? semaphore + probe_rebase : 0; + } + + DMN_LNX_ProbeNode *n = push_array(arena, DMN_LNX_ProbeNode, 1); + n->v = probe; + SLLQueuePush(probes.first, probes.last, n); + probes.count += 1; + } + + exit:; + scratch_end(scratch); + return probes; +} + +internal +STAP_MEMORY_READ(dmn_lnx_stap_memory_read) +{ + DMN_LNX_Process *process = raw_ctx; + U64 bytes_read = dmn_lnx_read(process->fd, r1u64(addr, addr + read_size), buffer); + return bytes_read == read_size; +} + +internal DMN_LNX_Entity * +dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind) +{ + DMN_LNX_Entity *entity = dmn_lnx_state->free_entity; + if(entity != 0) + { + SLLStackPop(dmn_lnx_state->free_entity); + } + else + { + entity = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 1); + dmn_lnx_state->entities_count += 1; + } + U32 gen = entity->gen; + entity->gen += 1; + entity->kind = kind; + return entity; +} + +internal DMN_LNX_Process * +dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocesses, B32 is_cow) +{ + Temp scratch = scratch_begin(0, 0); + + DMN_LNX_Process *process = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Process)->process; + process->pid = pid; + process->fd = OS_LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR)); + process->state = state; + process->debug_subprocesses = debug_subprocesses; + process->is_cow = is_cow; + process->parent_process = parent_process; + + // update pending process tracker + if(state != DMN_LNX_ProcessState_Normal) + { + dmn_lnx_state->process_pending_creation += 1; + } + + // add process to the list + DLLPushBack(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); + dmn_lnx_state->process_count += 1; + + // push pid -> DMN_LNX_Process mapping + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); + + scratch_end(scratch); + return process; +} + +internal DMN_LNX_ProcessCtx * +dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) +{ + DMN_LNX_ProcessCtx *ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + + ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(process->pid); + DMN_LNX_Auxv auxv = dmn_lnx_auxv_from_pid(process->pid, exe_ehdr.e_ident[ELF_Identifier_Class]); + Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); + U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(process->fd, auxv.base, is_rebased); + U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); + U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; + Rng1U64 image_vrange = dmn_lnx_compute_image_vrange(process->fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); + Arena *ctx_arena = arena_alloc(); + + ELF_Class dl_class; + { + ELF_Hdr64 ehdr = {0}; + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &process->fd, auxv.base, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); } + dl_class = ehdr.e_ident[ELF_Identifier_Class]; + } + + // query xsave layout + U64 xcr0 = 0; + U64 xsave_size = 0; + X64_XSaveLayout xsave_layout = {0}; + if(arch == Arch_x64) + { + X64_XSave xsave = {0}; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, process->pid, (void *)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0)) + { + // Linux stores xcr0 bits in fxstate padding, + // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25 + xcr0 = *(U64 *)((U8 *)&xsave + 464); + xsave_size = x64_get_xsave_size(); + xsave_layout = x64_get_xsave_layout(xcr0); + } + else { Assert(0 && "failed to get xstate"); } + } + + // gather probes + DMN_LNX_Probe **known_probes = push_array(ctx_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); + { + Temp scratch = scratch_begin(0, 0); + + String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, process->pid, auxv.base); + int dl_fd = OS_LNX_RETRY_ON_EINTR(open((char *)dl_path.str, O_RDONLY)); + + DMN_LNX_ProbeList probes = {0}; + if(dl_fd >= 0) + { + probes = dmn_lnx_read_probes(ctx_arena, dl_fd, 0, auxv.base); + OS_LNX_RETRY_ON_EINTR(close(dl_fd)); + } + + for EachNode(n, DMN_LNX_ProbeNode, probes.first) + { + DMN_LNX_Probe *p = &n->v; + if(str8_match(p->provider, str8_lit("rtld"), 0)) + { +#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } + DMN_LNX_Probe_XList +#undef X + } + } + + scratch_end(scratch); + } + + ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + ctx->arena = arena_alloc(); + ctx->arch = arch; + ctx->rdebug_vaddr = rdebug_vaddr; + ctx->dl_class = dl_class; + ctx->loaded_modules_ht = hash_table_init(ctx_arena, 0x1000); + ctx->probes = known_probes; + ctx->xcr0 = xcr0; + ctx->xsave_size = Max(xsave_size, sizeof(X64_XSave)); + ctx->xsave_layout = xsave_layout; + + // create main module + DMN_LNX_Module *main_module = dmn_lnx_module_alloc(ctx, process->fd, base_vaddr, auxv.execfn, 1, 1); + + // glibc has a shortcut mapping for the main module + hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, 0, main_module); + + return ctx; +} + +internal DMN_LNX_Thread * +dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid) +{ + void *reg_block; + if(process->ctx->free_reg_blocks.node_count) + { + String8Node *n = str8_list_pop_front(&process->ctx->free_reg_blocks); + reg_block = n->string.str; + str8_list_push_node(&process->ctx->free_reg_block_nodes, n); + } + else + { + ARCH_Info *arch_info = arch_info_from_arch(process->ctx->arch); + U64 reg_block_size = arch_info->reg_block_size; + reg_block = push_array(process->ctx->arena, U8, reg_block_size); + } + + DMN_LNX_Thread *thread = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Thread)->thread; + thread->tid = tid; + thread->state = thread_state; + thread->process = process; + thread->reg_block = reg_block; + if(thread_state == DMN_LNX_ThreadState_Stopped) + { + thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); + } + + // add thread to the list + DLLPushBack(process->first_thread, process->last_thread, thread); + process->thread_count += 1; + + // push tid -> thread mapping + hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->tid, thread); + + // update global thread counter + if(thread_state == DMN_LNX_ThreadState_PendingCreation) + { + dmn_lnx_state->threads_pending_creation += 1; + } + + return thread; +} + +internal DMN_LNX_Module * +dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main) +{ + DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, base_vaddr); + if(module) { goto exit; } + + // parse out module's ELF header + ELF_Hdr64 module_ehdr = {0}; + if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, base_vaddr, &module_ehdr) != MachineOpResult_Ok) { goto exit; } + + // gather info about module + U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; + U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; + Rng1U64 module_vrange = dmn_lnx_compute_image_vrange(memory_fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); + + // read TLS index and TLS offset + U64 tls_index = max_U64; + U64 tls_offset = max_U64; + if(is_main) + { + tls_index = 1; + tls_offset = 0; + } + else + { + if(dmn_lnx_state->is_tls_detected) + { + Rng1U64 tls_modid_range = r1u64(dmn_lnx_state->tls_modid_desc.offset, dmn_lnx_state->tls_modid_desc.offset + dmn_lnx_state->tls_modid_desc.bit_size / 8); + Rng1U64 tls_offset_range = r1u64(dmn_lnx_state->tls_offset_desc.offset, dmn_lnx_state->tls_offset_desc.offset + dmn_lnx_state->tls_offset_desc.bit_size / 8); + tls_modid_range = shift_1u64(tls_modid_range, base_vaddr); + tls_offset_range = shift_1u64(tls_offset_range, base_vaddr); + if(!dmn_lnx_read(memory_fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } + if(!dmn_lnx_read(memory_fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } + } + } + + module = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; + module->base_vaddr = base_vaddr; + module->name_vaddr = name_vaddr; + module->name_space_id = name_space_id; + module->size = dim_1u64(module_vrange); + module->phvaddr = base_vaddr + module_ehdr.e_phoff; + module->phcount = module_ehdr.e_phnum; + module->phentsize = module_ehdr.e_phentsize; + module->tls_index = tls_index; + module->tls_offset = tls_offset; + module->is_main = is_main; + + // add module to the list + DLLPushBack(ctx->first_module, ctx->last_module, module); + ctx->module_count += 1; + + // push base address -> module mapping + hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, base_vaddr, module); + + exit:; + return module; +} + +internal void +dmn_lnx_entity_release(DMN_LNX_Entity *entity) +{ + U32 gen = entity->gen + 1; + MemoryZeroStruct(entity); + entity->gen = gen; + SLLStackPush(dmn_lnx_state->free_entity, entity); +} + +internal void +dmn_lnx_process_release(DMN_LNX_Process *process) +{ + // update global state + AssertAlways(dmn_lnx_state->process_count > 0); + DLLRemove(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); + dmn_lnx_state->process_count -= 1; + + // update pending process tracker + if(process->state != DMN_LNX_ProcessState_Normal) + { + Assert(dmn_lnx_state->process_pending_creation > 0); + dmn_lnx_state->process_pending_creation -= 1; + } + + // close memory handle + if(OS_LNX_RETRY_ON_EINTR(close(process->fd)) < 0) { Assert(0 && "failed to close memory descriptor"); } + + // remove pid mapping + hash_table_purge_u64(dmn_lnx_state->pid_ht, process->pid); + + // release the context + if(process->ctx) + { + dmn_lnx_process_ctx_release(process->ctx); + } + + // release process entity + dmn_lnx_entity_release((DMN_LNX_Entity *)process); +} + +internal void +dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *ctx) +{ + Assert(ctx->ref_count > 0); + ctx->ref_count -= 1; + + if(ctx->ref_count == 0) + { + arena_release(ctx->arena); + dmn_lnx_entity_release((DMN_LNX_Entity *)ctx); + } +} + +internal void +dmn_lnx_thread_release(DMN_LNX_Thread *thread) +{ + DMN_LNX_Process *process = thread->process; + + // purge tid mapping + hash_table_purge_u64(dmn_lnx_state->tid_ht, thread->tid); + + // update global thread counter + if(thread->state == DMN_LNX_ThreadState_PendingCreation) + { + AssertAlways(dmn_lnx_state->threads_pending_creation > 0); + dmn_lnx_state->threads_pending_creation -= 1; + } + + // remove thread from the list + Assert(process->thread_count > 0); + DLLRemove(process->first_thread, process->last_thread, thread); + process->thread_count -= 1; + + // push reg block to the free list + String8Node *reg_block_node; + if(process->ctx->free_reg_block_nodes.node_count) + { + reg_block_node = str8_list_pop_front(&process->ctx->free_reg_block_nodes); + } + else + { + reg_block_node = push_array(process->ctx->arena, String8Node, 1); + } + reg_block_node->string = str8(thread->reg_block, 0); + str8_list_push_node(&process->ctx->free_reg_blocks, reg_block_node); + + dmn_lnx_entity_release((DMN_LNX_Entity *)thread); +} + +internal void +dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module) +{ + // remove module from the list + Assert(ctx->module_count > 0); + DLLRemove(ctx->first_module, ctx->last_module, module); + ctx->module_count -= 1; + + // purge base addr -> module mapping + hash_table_purge_u64(ctx->loaded_modules_ht, module->base_vaddr); + + dmn_lnx_entity_release((DMN_LNX_Entity *)module); +} + +internal DMN_LNX_ProcessCtx * +dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) +{ + DMN_LNX_ProcessCtx *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + + result->arena = arena_alloc(); + result->arch = ctx->arch; + result->rdebug_vaddr = ctx->rdebug_vaddr; + result->dl_class = ctx->dl_class; + result->loaded_modules_ht = hash_table_init(result->arena, ctx->loaded_modules_ht->cap); + result->xcr0 = ctx->xcr0; + result->xsave_size = ctx->xsave_size; + result->xsave_layout = ctx->xsave_layout; + + // clone probes + result->probes = push_array(result->arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); + for EachIndex(probe_idx, DMN_LNX_ProbeType_Count) + { + DMN_LNX_Probe *dst = result->probes[probe_idx]; + DMN_LNX_Probe *src = ctx->probes[probe_idx]; + + dst->provider = str8_copy(result->arena, src->provider); + dst->name = str8_copy(result->arena, src->name); + dst->args_string = str8_copy(result->arena, src->args_string); + dst->args = stap_arg_array_copy(result->arena, src->args); + dst->pc = src->pc; + dst->semaphore = src->semaphore; + } + + // clone probe traps + for EachNode(src, DMN_ActiveTrap, ctx->first_probe_trap) + { + DMN_Trap *src_trap = src->trap; + DMN_Trap *dst_trap = push_array(result->arena, DMN_Trap, 1); + dst_trap->process = dmn_lnx_handle_from_process(new_owner); + dst_trap->vaddr = src_trap->vaddr; + dst_trap->id = src_trap->id; + dst_trap->flags = src_trap->flags; + dst_trap->size = src_trap->size; + + DMN_ActiveTrap *dst = push_array(result->arena, DMN_ActiveTrap, 1); + dst->trap = dst_trap; + dst->swap_bytes = str8_copy(result->arena, src->swap_bytes); + + SLLQueuePush(result->first_probe_trap, result->last_probe_trap, dst); + } + + // clone modules + for EachNode(module, DMN_LNX_Module, ctx->first_module) + { + dmn_lnx_module_clone(result, module); + } + + return result; +} + +internal DMN_LNX_Module * +dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module) +{ + DMN_LNX_Module *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; + *result = *module; + result->next = result->prev = 0; + + // clone base addr mapping + hash_table_push_u64_raw(process_ctx->arena, process_ctx->loaded_modules_ht, result->base_vaddr, result); + + // push module to the list + DLLPushBack(process_ctx->first_module, process_ctx->last_module, module); + process_ctx->module_count += 1; + + return result; +} + +internal DMN_Handle +dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity) +{ + DMN_Handle handle = {0}; + U64 index = IntFromPtr(entity - dmn_lnx_state->entities_base); + if(index <= max_U32) + { + handle.u32[0] = index; + handle.u32[1] = entity->gen; + } + else + { + Assert(0 && "failed to make a handle for the entity"); + } + return handle; +} + +internal DMN_Handle +dmn_lnx_handle_from_process(DMN_LNX_Process *process) +{ + return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)process); +} + +internal DMN_Handle +dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx) +{ + return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)process_ctx); +} + +internal DMN_Handle +dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread) +{ + return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)thread); +} + +internal DMN_Handle +dmn_lnx_handle_from_module(DMN_LNX_Module *module) +{ + return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)module); +} + +internal DMN_LNX_Entity * +dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind) +{ + DMN_LNX_Entity *result = 0; + U32 index = handle.u32[0]; + U32 gen = handle.u32[1]; + if(index < dmn_lnx_state->entities_count && dmn_lnx_state->entities_base[index].gen == gen) + { + if(dmn_lnx_state->entities_base[index].kind == expected_kind) + { + result = &dmn_lnx_state->entities_base[index]; + } + } + return result; +} + +internal DMN_LNX_Process * +dmn_lnx_process_from_handle(DMN_Handle process_handle) +{ + return (DMN_LNX_Process *)dmn_lnx_entity_from_handle(process_handle, DMN_LNX_EntityKind_Process); +} + +internal DMN_LNX_ProcessCtx * +dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle) +{ + return (DMN_LNX_ProcessCtx *)dmn_lnx_entity_from_handle(process_ctx_handle, DMN_LNX_EntityKind_ProcessCtx); +} + +internal DMN_LNX_Thread * +dmn_lnx_thread_from_handle(DMN_Handle thread_handle) +{ + return (DMN_LNX_Thread *)dmn_lnx_entity_from_handle(thread_handle, DMN_LNX_EntityKind_Thread); +} + +internal DMN_LNX_Module * +dmn_lnx_module_from_handle(DMN_Handle module_handle) +{ + return (DMN_LNX_Module *)dmn_lnx_entity_from_handle(module_handle, DMN_LNX_EntityKind_Module); +} + +internal void +dmn_lnx_process_trap_probes(DMN_LNX_Process *process) +{ + for EachIndex(i, DMN_LNX_ProbeType_Count) + { + if(process->ctx->probes[i] == 0) { continue; } + + DMN_Trap *trap = push_array(process->ctx->arena, DMN_Trap, 1); + trap->process = dmn_lnx_handle_from_process(process); + trap->vaddr = process->ctx->probes[i]->pc; + trap->id = i; + + DMN_ActiveTrap *active_trap = dmn_set_trap(process->ctx->arena, trap); + SLLQueuePush(process->ctx->first_probe_trap, process->ctx->last_probe_trap, active_trap); + + if(BUILD_DEBUG && process->ctx->arch == Arch_x64) + { + Assert(active_trap->swap_bytes.size == 1 && active_trap->swap_bytes.str[0] == 0x90); + } + } +} + +internal void +dmn_lnx_process_untrap_probes(DMN_LNX_Process *process) +{ + NotImplemented; +} + +internal U64 +dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread) +{ + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + U64 result = arch_ip_from_reg_block(arch_info, thread->reg_block); + return result; +} + +internal U64 +dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread) +{ + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + U64 result = arch_sp_from_reg_block(arch_info, thread->reg_block); + return result; +} + +internal void +dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip) +{ + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + arch_reg_block_write_ip(arch_info, thread->reg_block, ip); + thread->is_reg_block_dirty = 1; +} + +internal void +dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp) +{ + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + arch_reg_block_write_sp(arch_info, thread->reg_block, sp); + thread->is_reg_block_dirty = 1; +} + +internal B32 +dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) +{ + B32 is_reg_block_read = 0; + if(thread->state == DMN_LNX_ThreadState_Stopped) + { + switch(thread->process->ctx->arch) + { + default:{}break; + case Arch_x64: + { + DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; + X64_RegBlock *dst = thread->reg_block; + + // general purpose registers + { + OS_LNX_GprsX64 src; + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(src), .iov_base = &src })); + if(ptrace_result < 0) { goto exit; } + + dst->r15 = src.r15; + dst->r14 = src.r14; + dst->r13 = src.r13; + dst->r12 = src.r12; + dst->rbp = src.rbp; + dst->rbx = src.rbx; + dst->r11 = src.r11; + dst->r10 = src.r10; + dst->r9 = src.r9; + dst->r8 = src.r8; + dst->rax = src.rax; + dst->rcx = src.rcx; + dst->rdx = src.rdx; + dst->rsi = src.rsi; + dst->rdi = src.rdi; + dst->rip = src.rip; + dst->cs = src.cs; + dst->rflags = src.rflags; + dst->rsp = src.rsp; + dst->ss = src.ss; + dst->fsbase = src.fsbase; + dst->gsbase = src.gsbase; + dst->ds = src.ds; + dst->es = src.es; + dst->fs = src.fs; + dst->gs = src.gs; + thread->orig_rax = src.orig_rax; + } + + // xsave + { + Temp scratch = scratch_begin(0, 0); + + X64_XSave *xsave = 0; + X64_FXSave *fxsave = 0; + + // get xsave + if(x64_is_xsave_supported()) + { + void *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process_ctx->xsave_size, .iov_base = xsave_raw })); + if(ptrace_result < 0) { goto exit; } + xsave = xsave_raw; + fxsave = &xsave->fxsave; + } + + // get fxsave + if(fxsave == 0) + { + fxsave = push_array(scratch.arena, X64_FXSave, 1); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave })); + if(ptrace_result < 0) { goto exit; } + fxsave = 0; + } + + // copy fxsave registers + if(fxsave) + { + X64_FXSave *src = fxsave; + + // copy x87 registers + dst->fcw = src->fcw; + dst->fsw = src->fsw; + dst->ftw = src->ftw; + dst->fop = src->fop; + dst->fip = src->fip; + dst->fdp = src->fdp; + dst->mxcsr = src->mxcsr; + dst->mxcsr_mask = src->mxcsr_mask; + for EachIndex(i, 8) + { + MemoryCopy(&dst->st0 + i, src->st_space + i, sizeof(U80)); + } + + // SSE registers are always available in x64 + { + U128 *xmm_d = fxsave->xmm_space; + U512 *zmm_s = &dst->zmm0; + for EachIndex(i, 16) + { + MemoryCopy(&zmm_s[i], &xmm_d[i], sizeof(*xmm_d)); + } + } + } + + // copy xsave registers + // + // compact register layout is not supported (xsave->header.xcomp_bv == 0) + // + if(xsave && xsave->header.xcomp_bv == 0) + { + if(xsave->header.xstate_bv & X64_XStateComponentFlag_AVX && + process_ctx->xsave_layout.avx_offset + 16*sizeof(U128) <= process_ctx->xsave_size) + { + U128 *avx_s = (U128 *)((U8 *)xsave + process_ctx->xsave_layout.avx_offset); + U512 *zmm_d = &dst->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&zmm_d[n].u8[16], &avx_s[n], sizeof(U128)); + } + } + + if(xsave->header.xstate_bv & X64_XStateComponentFlag_OPMASK && + process_ctx->xsave_layout.opmask_offset + sizeof(U64) * 8 <= process_ctx->xsave_size) + { + U64 *kmask_s = (U64 *)((U8 *)xsave + process_ctx->xsave_layout.opmask_offset); + U64 *kmask_d = &dst->k0; + for EachIndex(n, 8) + { + MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(U64)); + } + } + + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM_H && + process_ctx->xsave_layout.zmm_h_offset + sizeof(U256) * 16 <= process_ctx->xsave_size) + { + U256 *avx512h_s = (U256 *)((U8 *)xsave + process_ctx->xsave_layout.zmm_h_offset); + U512 *zmmh_d = &dst->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&zmmh_d[n].u8[32], &avx512h_s[n], sizeof(U256)); + } + } + + if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM && + process_ctx->xsave_layout.zmm_offset + sizeof(U512) * 16 <= process_ctx->xsave_size) + { + U512 *avx512_s = (U512 *)((U8 *)xsave + process_ctx->xsave_layout.zmm_offset); + U512 *zmm_d = &dst->zmm16; + for EachIndex(n, 16) + { + MemoryCopy(&zmm_d[n], &avx512_s[n], sizeof(U512)); + } + } + + if(xsave->header.xstate_bv & X64_XStateComponentFlag_CETU && + process_ctx->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process_ctx->xsave_size) + { + U64 *cet_u = (U64 *)((U8 *)xsave + process_ctx->xsave_layout.cet_u_offset); + dst->cetmsr = cet_u[0]; + dst->cetssp = cet_u[1]; + } + } + + scratch_end(scratch); + } + + // debug registers + { + U64 *dr_d = &dst->dr0; + for EachIndex(n, 8) + { + if(n != 4 && n != 5) + { + U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); + errno = 0; + long peek_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_PEEKUSER, thread->tid, PtrFromInt(offset), 0)); + if(errno != 0) { goto exit; } + dr_d[n] = peek_result; + } + } + } + + is_reg_block_read = 1; + }break; + } + } + exit:; + return is_reg_block_read; +} + +internal B32 +dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) +{ + AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); + + B32 is_reg_block_written = 0; + + switch(thread->process->ctx->arch) + { + case Arch_Null: {} break; + case Arch_x64: + { + DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; + X64_RegBlock *src = thread->reg_block; + + // general purpose registers + { + OS_LNX_GprsX64 dst; + dst.r15 = src->r15; + dst.r14 = src->r14; + dst.r13 = src->r13; + dst.r12 = src->r12; + dst.rbp = src->rbp; + dst.rbx = src->rbx; + dst.r11 = src->r11; + dst.r10 = src->r10; + dst.r9 = src->r9; + dst.r8 = src->r8; + dst.rax = src->rax; + dst.rcx = src->rcx; + dst.rdx = src->rdx; + dst.rsi = src->rsi; + dst.rdi = src->rdi; + dst.orig_rax = thread->orig_rax; + dst.rip = src->rip; + dst.cs = src->cs; + dst.rflags = src->rflags; + dst.rsp = src->rsp; + dst.ss = src->ss; + dst.fsbase = src->fsbase; + dst.gsbase = src->gsbase; + dst.ds = src->ds; + dst.es = src->es; + dst.fs = src->fs; + dst.gs = src->gs; + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) })); + if(ptrace_result < 0) { goto exit; } + } + + // xsave + { + Temp scratch = scratch_begin(0, 0); + + X64_FXSave dst_fxsave = {0}; + { + dst_fxsave.fcw = src->fcw; + dst_fxsave.fsw = src->fsw; + dst_fxsave.ftw = src->ftw; + dst_fxsave.fop = src->fop; + dst_fxsave.fip = src->fip; + dst_fxsave.fdp = src->fdp; + dst_fxsave.mxcsr = src->mxcsr; + dst_fxsave.mxcsr_mask = src->mxcsr_mask; + + U128 *st_d = (U128 *)dst_fxsave.st_space; + U80 *st_s = &src->st0; + for EachIndex(n, 8) + { + MemoryCopy(&st_d[n], &st_s[n], sizeof(U80)); + } + + U128 *xmm_d = (U128 *)dst_fxsave.xmm_space; + U512 *xmm_s = &src->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&xmm_d[n], &xmm_s[n], sizeof(U128)); + } + } + + if(x64_is_xsave_supported()) + { + U8 *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); + X64_XSave *dst = (X64_XSave *)xsave_raw; + dst->fxsave = dst_fxsave; + dst->header.xstate_bv |= X64_XStateComponentFlag_FP; + dst->header.xstate_bv |= X64_XStateComponentFlag_SSE; + + if(process_ctx->xsave_layout.avx_offset) + { + if(process_ctx->xsave_layout.avx_offset + sizeof(U128) * 16 <= process_ctx->xsave_size) + { + U128 *avx_d = (U128 *)(xsave_raw + process_ctx->xsave_layout.avx_offset); + U512 *zmm_s = &src->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&avx_d[n], &zmm_s[n].u8[16], sizeof(U128)); + } + dst->header.xstate_bv |= X64_XStateComponentFlag_AVX; + } + } + + if(process_ctx->xsave_layout.opmask_offset) + { + if(process_ctx->xsave_layout.opmask_offset + sizeof(U64) * 8 <= process_ctx->xsave_size) + { + U64 *kmask_d = (U64 *)(xsave_raw + process_ctx->xsave_layout.opmask_offset); + U64 *kmask_s = &src->k0; + for EachIndex(n, 8) + { + MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(U64)); + } + dst->header.xstate_bv |= X64_XStateComponentFlag_OPMASK; + } + else { Assert(0 && "invalid xsave size"); goto exit; } + } + + if(process_ctx->xsave_layout.zmm_h_offset) + { + if(process_ctx->xsave_layout.zmm_h_offset + sizeof(U256) * 16 <= process_ctx->xsave_size) + { + U256 *avx512h_d = (U256 *)(xsave_raw + process_ctx->xsave_layout.zmm_h_offset); + U512 *zmmh_s = &src->zmm0; + for EachIndex(n, 16) + { + MemoryCopy(&avx512h_d[n], &zmmh_s[n].u8[32], sizeof(U256)); + } + dst->header.xstate_bv |= X64_XStateComponentFlag_ZMM_H; + } + else { Assert(0 && "invalid xsave size"); goto exit; } + } + + if(process_ctx->xsave_layout.zmm_offset) + { + if(process_ctx->xsave_layout.zmm_offset + sizeof(U512) * 16 <= process_ctx->xsave_size) + { + U512 *avx512_d = (U512 *)(xsave_raw + process_ctx->xsave_layout.zmm_offset); + U512 *zmm_s = &src->zmm16; + for EachIndex(n, 16) + { + MemoryCopy(&avx512_d[n], &zmm_s[n], sizeof(U512)); + } + dst->header.xstate_bv |= X64_XStateComponentFlag_ZMM; + } + else { Assert(0 && "invalid xsave size"); goto exit; } + } + + if(process_ctx->xsave_layout.cet_u_offset) + { + if(process_ctx->xsave_layout.cet_u_offset + sizeof(U64) * 2 <= process_ctx->xsave_size) + { + U64 *cet_u = (U64 *)(xsave_raw + process_ctx->xsave_layout.cet_u_offset); + cet_u[0] = src->cetmsr; + cet_u[1] = src->cetssp; + dst->header.xstate_bv |= X64_XStateComponentFlag_CETU; + } + else { Assert(0 && "invalid xsave size"); goto exit; } + } + + // xsave + Assert(dst->header.xcomp_bv == 0); // must always be zero + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process_ctx->xsave_size })); + if(ptrace_result < 0) { goto exit; } + } + + scratch_end(scratch); + } + + // debug registers + { + src->dr7 |= (1 << 10); + + U64 *dr_s = &src->dr0; + for EachIndex(n, 8) + { + if(n != 4 && n != 5) + { + U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); + int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_POKEUSER, thread->tid, PtrFromInt(offset), (void*)(uintptr_t)dr_s[n])); + if(ptrace_result < 0) { goto exit; } + } + } + } + + is_reg_block_written = 1; + } break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: { NotImplemented; }break; + default: { InvalidPath; } break; + } + + exit:; + return is_reg_block_written; +} + +internal B32 +dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on) +{ + B32 is_flag_set = 0; + switch(thread->process->ctx->arch) + { + case Arch_Null: {} break; + case Arch_x64: + { + X64_RegBlock *reg_block = thread->reg_block; + if(is_on) { reg_block->rflags |= X64_RFlag_Trap; } + else { reg_block->rflags &= ~X64_RFlag_Trap; } + thread->is_reg_block_dirty = 1; + is_flag_set = 1; + } break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: { NotImplemented; }break; + default: { InvalidPath; } break; + } + Assert(is_flag_set); + return is_flag_set; +} + +internal void +dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n) +{ + DLLPushBack(list->first, list->last, n); + list->count += 1; +} + +internal DMN_LNX_ThreadPtrNode * +dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v) +{ + DMN_LNX_ThreadPtrNode *n = push_array(arena, DMN_LNX_ThreadPtrNode, 1); + n->v = v; + dmn_lnx_thread_ptr_list_push_node(list, n); + return n; +} + +internal void +dmn_lnx_thread_ptr_list_remove(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n) +{ + DLLRemove(list->first, list->last, n); + list->count -= 1; +} + +internal DMN_LNX_ModulePtrNode * +dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v) +{ + DMN_LNX_ModulePtrNode *n = push_array(arena, DMN_LNX_ModulePtrNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; +} + +internal DMN_LNX_ProcessPtrNode * +dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v) +{ + DMN_LNX_ProcessPtrNode *n = push_array(arena, DMN_LNX_ProcessPtrNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; +} + +internal void +dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +{ + // push create process event + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_lnx_handle_from_process(process); + e->arch = process->ctx->arch; + e->code = process->pid; + e->tls_model = DMN_TlsModel_Gnu; // TODO: use dynamic linker path to figure out correct enum here +} + +internal void +dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_lnx_handle_from_process(process); + e->code = process->main_thread_exit_code; +} + +internal void +dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->arch = thread->process->ctx->arch; + e->code = thread->tid; +} + +internal void +dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->code = exit_code; +} + +internal void +dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module) +{ + // TODO: reporting this module breaks ctrl thread + String8 module_name = dmn_lnx_read_string(arena, thread->process->fd, module->name_vaddr); + if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) + { + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->module = dmn_lnx_handle_from_module(module); + e->arch = thread->process->ctx->arch; + e->address = module->base_vaddr; + e->size = module->size; + e->string = module_name; + e->elf_phdr_vrange = r1u64(module->phvaddr, module->phvaddr + module->phentsize * module->phcount); + e->elf_phdr_entsize = module->phentsize; + e->tls_index = module->tls_index; + e->tls_offset = module->tls_offset; + } +} + +internal void +dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_lnx_handle_from_process(process); + e->module = dmn_lnx_handle_from_module(module); +} + +internal void +dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_HandshakeComplete; + e->process = dmn_lnx_handle_from_process(process); + e->thread = dmn_lnx_handle_from_thread(process->first_thread); + e->arch = process->ctx->arch; +} + +internal void +dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Breakpoint; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->instruction_pointer = address; +} + +internal void +dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_SingleStep; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); +} + +internal void +dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo) +{ + local_persist B8 is_repeatable[] = + { + 0, // null + 1, // 1 SIGHUP + 1, // 2 SIGINT + 1, // 3 SIGQUIT + 1, // 4 SIGTRAP + 1, // 5 SIGABRT + 1, // 6 SIGIOT + 1, // 7 SIGBUS + 1, // 8 SIGFPE + 1, // 9 SIGKILL + 1, // 10 SIGUSR1 + 1, // 11 SIGSEGV + 1, // 12 SIGUSR2 + 1, // 13 SIGPIPE + 1, // 14 SIGALRM + 1, // 15 SIGTERM + 1, // 16 SIGTKFLT + 0, // 17 SIGCHLD + 0, // 18 SIGCONT + 1, // 19 SIGSTOP + 1, // 20 SIGTSP + 1, // 21 SIGTTIN + 1, // 22 SIGTTOU + 0, // 23 SIGURG + 1, // 24 SIGXCPU + 1, // 25 SIGXFSZ + 1, // 26 SIGVTALRM + 1, // 27 SIGPROF + 0, // 28 SIGWINCH + 1, // 29 SIGIO + 1, // 30 SIGPWR + 1, // 31 SIGSYS + 1, // 32 SIGUNUSED + }; + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_lnx_handle_from_process(thread->process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + e->signo = signo; + e->exception_repeated = signo < ArrayCount(is_repeatable) ? is_repeatable[signo] : 0; + + if(signo == SIGSEGV) + { + siginfo_t si = {0}; + OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, thread->tid, 0, &si)); + e->address = (U64)si.si_addr; + } +} + +internal void +dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Halt; +} + +internal void +dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events) +{ + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Error; + e->error_kind = DMN_ErrorKind_NotAttached; +} + +internal DMN_LNX_Thread * +dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid) +{ + DMN_LNX_Thread *thread = dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, tid); + dmn_lnx_push_event_create_thread(arena, events, thread); + return thread; +} + +internal void +dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code) +{ + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Process *process = thread->process; + + // store main thread's exit code + if(thread->tid == thread->process->pid) + { + thread->process->main_thread_exit_code = exit_code; + } + + // push exit event + dmn_lnx_push_event_exit_thread(arena, events, thread, exit_code); + + // release entity + dmn_lnx_thread_release(thread); + + // auto exit process on last thread + if(process->thread_count == 0) + { + dmn_lnx_event_exit_process(arena, events, process->pid); + } +} + +internal DMN_LNX_Process * +dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags) +{ + DMN_LNX_Process *process = dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Normal, parent_process, !!(flags & DMN_LNX_CreateProcessFlag_DebugSubprocesses), !!(flags & DMN_LNX_CreateProcessFlag_Cow)); + + if(flags & DMN_LNX_CreateProcessFlag_ClonedMemory) + { + process->ctx = parent_process->ctx; + } + else + { + process->ctx = dmn_lnx_process_ctx_alloc(process, !!(flags & DMN_LNX_CreateProcessFlag_Rebased)); + } + process->ctx->ref_count += 1; + + // install probes in a process that does not have a cloned memory + if(!(flags & DMN_LNX_CreateProcessFlag_ClonedMemory)) + { + dmn_lnx_process_trap_probes(process); + } + + // create main thread + dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, pid); + + // push events + dmn_lnx_push_event_create_process(arena, events, process); + for EachNode(thread, DMN_LNX_Thread, process->first_thread) + { + dmn_lnx_push_event_create_thread(arena, events, thread); + } + for EachNode(module, DMN_LNX_Module, process->ctx->first_module) + { + dmn_lnx_push_event_load_module(arena, events, process->first_thread, module); + } + dmn_lnx_push_event_handshake_complete(arena, events, process); + + return process; +} + +internal void +dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) +{ + DMN_LNX_Process *process = dmn_lnx_process_from_pid(pid); + AssertAlways(process->thread_count == 0); + + // push module events + for EachNode(module, DMN_LNX_Module, process->ctx->first_module) + { + dmn_lnx_push_event_unload_module(arena, events, process, module); + } + + // push process exit event + dmn_lnx_push_event_exit_process(arena, events, process); + + // release process + dmn_lnx_process_release(process); +} + +internal void +dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr) +{ + DMN_LNX_Process *process = thread->process; + + GNU_LinkMap64 map = {0}; + for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) + { + // read out new link map item + if(gnu_read_link_map(dmn_lnx_machine_op_mem_read, &process->fd, map_vaddr, process->ctx->dl_class, &map) != MachineOpResult_Ok) { break; } + + // was module already loaded? + DMN_LNX_Module *module = hash_table_search_u64_raw(process->ctx->loaded_modules_ht, map.addr_vaddr); + if(module) { continue; } + + // clone process ctx + if(process->is_cow) + { + process->is_cow = 0; + process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); + } + + // alloc module + module = dmn_lnx_module_alloc(process->ctx, process->fd, map.addr_vaddr, map.name_vaddr, name_space_id, 0); + + // push load module event + dmn_lnx_push_event_load_module(arena, events, thread, module); + } +} + +internal void +dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr) +{ + Temp scratch = scratch_begin(&arena, 1); + + DMN_LNX_ProcessCtx *ctx = process->ctx; + + // flag every module as inactive + for EachNode(module, DMN_LNX_Module, ctx->first_module) + { + module->is_live = 0; + } + + // mark live modules + B32 is_64bit = ctx->dl_class == ELF_Class_64; + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); + for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) + { + GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_machine_op_mem_read, &process->fd); + for EachNode(link_map_n, GNU_LinkMapNode, link_map_list.first) + { + DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, link_map_n->v.addr_vaddr); + module->is_live = 1; + } + } + + // collect unloaded modules + DMN_LNX_ModulePtrList to_release = {0}; + for EachNode(module, DMN_LNX_Module, ctx->first_module) + { + if(!module->is_live) + { + dmn_lnx_module_ptr_list_push(scratch.arena, &to_release, module); + } + } + + // clone process context + if(to_release.count > 0) + { + if(process->is_cow) + { + process->is_cow = 0; + process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); + } + } + + // push events and clean up unloaded modules + for EachNode(module_n, DMN_LNX_ModulePtrNode, to_release.first) + { + dmn_lnx_push_event_unload_module(arena, events, process, module_n->v); + dmn_lnx_module_release(process->ctx, module_n->v); + } + + scratch_end(scratch); +} + +internal void +dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid) +{ + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + DMN_LNX_Process *process = thread->process; + U64 ip = dmn_lnx_thread_read_ip(thread); + + // is this user trap? + DMN_ActiveTrap *hit_user_trap = 0; + { + DMN_Handle process_handle = dmn_lnx_handle_from_process(process); + for EachNode(active_trap, DMN_ActiveTrap, user_traps) + { + if(MemoryCompare(&active_trap->trap->process, &process_handle, sizeof(DMN_Handle)) == 0) + { + if(active_trap->trap->vaddr == ip-1) + { + hit_user_trap = active_trap; + break; + } + } + } + } + + // is this a probe trap? + DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; + if(hit_user_trap == 0) + { + for EachNode(active_trap, DMN_ActiveTrap, process->ctx->first_probe_trap) + { + if(active_trap->trap->vaddr == ip-1) + { + probe_type = active_trap->trap->id; + break; + } + } + } + + if(probe_type == DMN_LNX_ProbeType_InitComplete) + { + B32 is_init_completed = 0; + + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_InitComplete]; + U64 name_space_id = 0, rdebug_addr = 0; + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto init_complete_exit; } + if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } + + GNU_RDebugInfo64 rdebug = {0}; + if(gnu_read_r_debug(dmn_lnx_machine_op_mem_read, &process->fd, rdebug_addr, process->ctx->arch, &rdebug) != MachineOpResult_Ok) { goto init_complete_exit; } + if(rdebug.r_version < 1) { goto init_complete_exit; } + + dmn_lnx_event_load_module(arena, events, thread, name_space_id, rdebug.r_map); + + is_init_completed = 1; + init_complete_exit:; + AssertAlways(is_init_completed); + } + else if(probe_type == DMN_LNX_ProbeType_RelocComplete) + { + B32 is_reloc_completed = 0; + + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_RelocComplete]; + U64 name_space_id = 0, new_link_map_addr = 0; + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto reloc_complete_exit; } + if(!stap_read_arg_u(probe->args.v[2], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) { goto reloc_complete_exit; } + + dmn_lnx_event_load_module(arena, events, thread, name_space_id, new_link_map_addr); + + is_reloc_completed = 1; + reloc_complete_exit:; + AssertAlways(is_reloc_completed); + } + else if(probe_type == DMN_LNX_ProbeType_UnmapComplete) + { + B32 is_unmap_completed = 0; + + DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_UnmapComplete]; + U64 name_space_id = 0, rdebug_vaddr = 0; + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } + if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } + + dmn_lnx_event_unload_module(arena, events, process, rdebug_vaddr); + + is_unmap_completed = 1; + unmap_complete_exit:; + AssertAlways(is_unmap_completed); + } + + if(probe_type == DMN_LNX_ProbeType_Null) + { + // rollback IP on user traps + if(hit_user_trap) + { + U64 ip = dmn_lnx_thread_read_ip(thread); + dmn_lnx_thread_write_ip(thread, ip - 1); + } + + DMN_Event *e = dmn_event_list_push(arena, events); + e->kind = DMN_EventKind_Breakpoint; + e->process = dmn_lnx_handle_from_process(process); + e->thread = dmn_lnx_handle_from_thread(thread); + e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + } +} + +internal void +dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) +{ + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + + B32 is_valid = 1; + U64 address = 0; + switch(thread->process->ctx->arch) + { + default:{}break; + case Arch_x64: + { + X64_RegBlock *regs_x64 = thread->reg_block; + if(regs_x64->dr6 & X64_DebugStatusFlag_B0) + { + address = regs_x64->dr0; + } + else if(regs_x64->dr6 & X64_DebugStatusFlag_B1) + { + address = regs_x64->dr1; + } + else if(regs_x64->dr6 & X64_DebugStatusFlag_B2) + { + address = regs_x64->dr2; + } + else if(regs_x64->dr6 & X64_DebugStatusFlag_B3) + { + address = regs_x64->dr3; + } + else + { + is_valid = 0; + } + }break; + } + + if(is_valid) + { + dmn_lnx_push_event_breakpoint(arena, events, thread, address); + } +} + +internal void +dmn_lnx_event_halt(Arena *arena, DMN_EventList *events) +{ + dmn_lnx_push_event_halt(arena, events); +} + +internal void +dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid) +{ + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + + // clear single step flag + dmn_lnx_set_single_step_flag(thread, 0); + + // push event + dmn_lnx_push_event_single_step(arena, events, thread); +} + +internal void +dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo) +{ + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + + thread->pass_through_signal = 1; + thread->pass_through_signo = signo; + + dmn_lnx_push_event_exception(arena, events, thread, signo); +} + +internal DMN_LNX_Process * +dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) +{ + Temp scratch = scratch_begin(&arena, 1); + + // create process + DMN_LNX_Process *process = dmn_lnx_event_create_process(arena, events, pid, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses|DMN_LNX_CreateProcessFlag_Rebased); + + // extract threads from /proc/pid/task + { + String8 task_path = str8f(scratch.arena, "/proc/%d/task", pid); + DIR *task_dirp = opendir((char *)task_path.str); + if(task_dirp) + { + for(;;) + { + struct dirent *dirent = readdir(task_dirp); + if(dirent == 0) { break; } + + String8 tid_str = str8_cstring_capped(dirent->d_name, dirent->d_name + NAME_MAX); + if(str8_match(tid_str, str8_lit(".."), 0) || str8_match(tid_str, str8_lit("."), 0)) { continue; } + U64 tid_64 = u64_from_str8(tid_str, 10); + pid_t tid = (pid_t)tid_64; + AssertAlways(tid == tid_64); + + if(tid == pid) { continue; } // main thread was created during create process sequence + dmn_lnx_event_create_thread(arena, events, process, tid); + } + + OS_LNX_RETRY_ON_EINTR(closedir(task_dirp)); + } + } + + // extract modules from r_debug + { + B32 is_64bit = process->ctx->dl_class == ELF_Class_64; + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->ctx->rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); + U64 name_space_id = 0; + for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) + { + dmn_lnx_event_load_module(arena, events, process->first_thread, name_space_id, rdebug_n->v.r_map); + name_space_id += 1; + } + } + + // handshake complete + dmn_lnx_push_event_handshake_complete(arena, events, process); + + scratch_end(scratch); + return process; +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) + +internal void +dmn_init(void) +{ + if(dmn_lnx_state == 0) + { + local_persist DMN_LNX_State state; + dmn_lnx_state = &state; + + dmn_lnx_state->arena = arena_alloc(); + dmn_lnx_state->access_mutex = mutex_alloc(); + dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain); + dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0); + dmn_lnx_state->tid_ht = hash_table_init(dmn_lnx_state->arena, 0x2000); + dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); + dmn_lnx_state->halter_mutex = mutex_alloc(); + dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Null); + + // find offsets of TLS index and TLS offset in the link_map struct + // + // TODO: assuming that target is using same libc version as debugger + { + DMN_LNX_DbDesc *tls_modid_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_modid"); + DMN_LNX_DbDesc *tls_offset_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_offset"); + if(tls_modid_desc && tls_offset_desc) + { + if(tls_modid_desc->bit_size <= 64 && tls_offset_desc->bit_size <= 64) + { + dmn_lnx_state->tls_modid_desc = *tls_modid_desc; + dmn_lnx_state->tls_offset_desc = *tls_offset_desc; + dmn_lnx_state->is_tls_detected = 1; + } + else { Assert(0 && "invalid TLS desc"); } + } + } + } +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) + +internal DMN_CtrlCtx * +dmn_ctrl_begin(void) +{ + DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; + dmn_lnx_ctrl_thread = 1; + return ctx; +} + +internal void +dmn_ctrl_exclusive_access_begin(void) +{ + MutexScope(dmn_lnx_state->access_mutex) + { + dmn_lnx_state->access_run_state = 1; + } +} + +internal void +dmn_ctrl_exclusive_access_end(void) +{ + MutexScope(dmn_lnx_state->access_mutex) + { + dmn_lnx_state->access_run_state = 0; + } +} + +internal U32 +dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) +{ + Temp scratch = scratch_begin(0, 0); + + // setup target command line + U64 argc = params->cmd_line.node_count + 1; + char **argv = push_array(scratch.arena, char *, argc); + { + U64 idx = 0; + for EachNode(n, String8Node, params->cmd_line.first) + { + argv[idx] = (char *)str8_copy(scratch.arena, n->string).str; + idx += 1; + } + } + + // setup target environment + U64 envc = os_lnx_state.default_env_count + params->env.node_count + 1; + char **envp = push_array(scratch.arena, char *, envc); + { + // copy default environment + MemoryCopyTyped(envp, os_lnx_state.default_env, os_lnx_state.default_env_count); + + // copy user environment + U64 idx = os_lnx_state.default_env_count; + for EachNode(n, String8Node, params->env.first) + { + envp[idx] = (char *)str8_copy(scratch.arena, n->string).str; + idx += 1; + } + } + + // create zero-terminated work directory path + char *work_dir_path = (char *)str8_copy(scratch.arena, params->path).str; + + // fork process + pid_t pid = fork(); + + // child process + if(pid == 0) + { + // wait for seize + if(OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)) < 0) { goto child_exit; } + + // change work directory to tracee + if(OS_LNX_RETRY_ON_EINTR(chdir(work_dir_path)) < 0) { goto child_exit; } + + // replace process with target program + if(OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, envp)) < 0) { goto child_exit; } + + child_exit:; + exit(0); + } + // parent process + else if(pid > 0) + { + // try to seize child process + if(dmn_lnx_ptrace_seize(pid) >= 0) + { + // tracee was successfully seized, create process + dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Launch, 0, params->debug_subprocesses, 0); + } + else + { + Assert(0 && "failed to ptrace child process"); + OS_LNX_RETRY_ON_EINTR(kill(SIGKILL, pid)); + OS_LNX_RETRY_ON_EINTR(waitpid(pid, 0, WNOHANG)); + pid = 0; + } + } + + scratch_end(scratch); + return pid; +} + +internal B32 +dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) +{ + B32 is_attached = 0; + if(dmn_lnx_ptrace_seize(pid) >= 0) + { + if(OS_LNX_RETRY_ON_EINTR(kill(pid, SIGSTOP)) >= 0) + { + dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Attach, 0, 1, 0); + is_attached = 1; + } + else + { + OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, pid, 0, 0)); + } + } + return is_attached; +} + +internal B32 +dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process_handle, U32 exit_code) +{ + B32 result = 0; + mutex_take(dmn_lnx_state->halter_mutex); + DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + if(process) + { + result = OS_LNX_RETRY_ON_EINTR(kill(process->pid, SIGKILL)) >= 0; + } + mutex_drop(dmn_lnx_state->halter_mutex); + return result; +} + +internal B32 +dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process_handle) +{ + B32 result = 0; + mutex_take(dmn_lnx_state->halter_mutex); + DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + if(process) + { + result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, process->pid, 0, 0)) >= 0; + } + mutex_drop(dmn_lnx_state->halter_mutex); + return result; +} + +internal DMN_EventList +dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) +{ + Temp scratch = scratch_begin(&arena, 1); + DMN_EventList events = {0}; + + mutex_take(dmn_lnx_state->halter_mutex); + + // wait for signals from the running threads + if(dmn_lnx_state->process_count > 0) + { + // write traps to memory + DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; + { + HashTable *process_ht = hash_table_init(scratch.arena, dmn_lnx_state->process_count); + for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) + { + for EachIndex(n_idx, n->count) + { + // skip hardware breakpoints + DMN_Trap *trap = n->v+n_idx; + if(trap->flags) { continue; } + + HashTable *active_trap_ht = hash_table_search_u64_raw(process_ht, trap->process.u64[0]); + if(active_trap_ht == 0) + { + active_trap_ht = hash_table_init(scratch.arena, ctrls->traps.trap_count); + hash_table_push_u64_raw(scratch.arena, process_ht, trap->process.u64[0], active_trap_ht); + } + + // TODO: ctrl sends down duplicate traps + DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); + if(is_set) { continue; } + + // TODO: ctrl sends down traps for exited process + DMN_LNX_Process *process = dmn_lnx_process_from_handle(trap->process); + if(!process) { continue; } + + // trap instruction + DMN_ActiveTrap *active_trap = dmn_set_trap(scratch.arena, trap); + + // add trap to the active list + SLLQueuePush(active_trap_first, active_trap_last, active_trap); + + // add (address -> trap) + hash_table_push_u64_raw(scratch.arena, active_trap_ht, trap->vaddr, active_trap); + } + } + } + + // enable single stepping + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) + { + DMN_LNX_Thread *single_step_thread = dmn_lnx_thread_from_handle(ctrls->single_step_thread); + if(single_step_thread) + { + dmn_lnx_set_single_step_flag(single_step_thread, 1); + } + else + { + Assert(0 && "invalid single_step_thread handle"); + } + } + + // schedule threads to run + DMN_LNX_ThreadPtrList running_threads = {0}; + { + for EachNode(process, DMN_LNX_Process, dmn_lnx_state->first_process) + { + //- rjf: determine if this process is frozen + B32 process_is_frozen = 0; + if(ctrls->run_entities_are_processes) + { + for EachIndex(idx, ctrls->run_entity_count) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_process(process))) + { + process_is_frozen = 1; + break; + } + } + } + + for EachNode(thread, DMN_LNX_Thread, process->first_thread) + { + //- rjf: determine if this thread is frozen + B32 is_frozen = 0; + + // rjf: not single-stepping? determine based on run controls freezing info + if(dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) + { + if(ctrls->run_entities_are_processes) + { + is_frozen = process_is_frozen; + } + else + { + for EachIndex(idx, ctrls->run_entity_count) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_thread(thread))) + { + is_frozen = 1; + break; + } + } + } + if(ctrls->run_entities_are_unfrozen) + { + is_frozen ^= 1; + } + } + // rjf: single-step? freeze if not the single-step thread. + else + { + is_frozen = !dmn_handle_match(dmn_lnx_handle_from_thread(thread), ctrls->single_step_thread); + } + + // resume thread + if(!is_frozen) + { + AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); + + // write registers + if(thread->is_reg_block_dirty) + { + thread->is_reg_block_dirty = !dmn_lnx_thread_write_reg_block(thread); + } + + // pass signal to the child process + void *sig_code = 0; + if(thread->pass_through_signal) + { + thread->pass_through_signal = 0; + if(!ctrls->ignore_previous_exception) + { + sig_code = (void *)(uintptr_t)thread->pass_through_signo; + } + } + + // resume thread + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, thread->tid, 0, sig_code)) >= 0) + { + thread->state = DMN_LNX_ThreadState_Running; + thread->is_reg_block_dirty = 1; + dmn_lnx_thread_ptr_list_push(scratch.arena, &running_threads, thread); + } + else + { + if(errno == ESRCH) + { + // Race note: In multithreaded programs, ptrace(PTRACE_CONT) may fail if a running thread calls + // exit_group while we are resuming threads. The kernel begins tearing down the thread group so + // the target might not be in a ptrace-soppped state anymore. Handle this by ignoring, on waitpid + // we will get chance to report exit event. + // + // TODO: unfortunatley, kernel also sends us ESRCH whenever ptrace(PTRACE_CONT) is sent to a tracee + // that is not in a ptace-stop, so how can we tell these errors apart? + } + else + { + InvalidPath; + } + } + } + } + } + } + + // hash running threads tids + HashTable *running_threads_ht = hash_table_init(scratch.arena, running_threads.count * 2); + for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) + { + hash_table_push_u64_raw(scratch.arena, running_threads_ht, n->v->tid, n); + } + + B32 is_halt_done = 0; + DMN_LNX_ThreadPtrList stopped_threads = {0}; + do + { + // wait for a signal + int status = 0; + pid_t wait_id = 0; + { + mutex_drop(dmn_lnx_state->halter_mutex); + for(;;) + { + wait_id = OS_LNX_RETRY_ON_EINTR(waitpid(-1, &status, __WALL|__WNOTHREAD)); + if(wait_id == -1) { InvalidPath; } // TODO: graceful exit + break; + } + mutex_take(dmn_lnx_state->halter_mutex); + } + + // unpack status + int wifexited = WIFEXITED(status); + int wifsignaled = WIFSIGNALED(status); + int wifstopped = WIFSTOPPED(status); + int wstopsig = WSTOPSIG(status); + int event_code = (status >> 16); + + // intercept initing processes + { + DMN_LNX_Process *process = dmn_lnx_process_from_pid(wait_id); + + if(process && process->state != DMN_LNX_ProcessState_Normal) + { + switch(process->state) + { + case DMN_LNX_ProcessState_Null: + case DMN_LNX_ProcessState_Normal: + { + InvalidPath; + } break; + case DMN_LNX_ProcessState_Launch: + { + if(wstopsig == SIGSTOP) + { + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, process->pid, 0, 0)) >= 0) + { + process->state = DMN_LNX_ProcessState_WaitForExec; + goto wait_for_signal; + } + else { Assert(0 && "failed to resume tracee"); } + } + // else { Assert(0 && "unexpected signal"); } + } break; + case DMN_LNX_ProcessState_WaitForExec: + { + if(wstopsig == SIGTRAP && event_code == PTRACE_EVENT_EXEC) + { + DMN_LNX_CreateProcessFlags create_flags = process->debug_subprocesses ? DMN_LNX_CreateProcessFlag_DebugSubprocesses : 0; + dmn_lnx_process_release(process); + dmn_lnx_event_create_process(arena, &events, wait_id, 0, create_flags); + goto wait_for_signal; + } + //else { Assert(0 && "unexpected signal"); } + } break; + case DMN_LNX_ProcessState_ExecFailedDoExit: + { + if(wifexited) + { + dmn_lnx_process_release(process); + goto wait_for_signal; + } + else { Assert(0 && "unexpected signal"); } + } break; + case DMN_LNX_ProcessState_Attach: + { + if(wstopsig == SIGSTOP) + { + DMN_LNX_CreateProcessFlags create_flags = process->debug_subprocesses ? DMN_LNX_CreateProcessFlag_DebugSubprocesses : 0; + dmn_lnx_process_release(process); + dmn_lnx_event_create_process(arena, &events, wait_id, 0, create_flags); + goto wait_for_signal; + } + else { Assert(0 && "unexpected signal"); } + } break; + } + + // shutdown process + { + if(OS_LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)) >= 0) + { + process->state = DMN_LNX_ProcessState_ExecFailedDoExit; + } + else + { + //Assert(0 && "failed to send kill signal to the tracee"); + dmn_lnx_process_release(process); + } + } + + wait_for_signal:; + continue; + } + } + + if(wifstopped || wifsignaled || wifexited) + { + DMN_LNX_ThreadPtrNode *thread_n = hash_table_search_u64_raw(running_threads_ht, wait_id); + if(thread_n) + { + DMN_LNX_Thread *thread = thread_n->v; + AssertAlways(thread->state == DMN_LNX_ThreadState_Running); + + // remove mapping + hash_table_purge_u64(running_threads_ht, thread->tid); + + // move thread to the stopped list + dmn_lnx_thread_ptr_list_remove(&running_threads, thread_n); + dmn_lnx_thread_ptr_list_push_node(&stopped_threads, thread_n); + + // update thread state + if(wifstopped && !wifsignaled && !wifexited) + { + thread->state = DMN_LNX_ThreadState_Stopped; + } + else if(!wifstopped && (wifsignaled || wifexited)) + { + thread->state = DMN_LNX_ThreadState_Exited; + } + else { InvalidPath; } + + // stop all other threads + if(stopped_threads.count == 1) + { + for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) + { + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, n->v->tid, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } + } + } + } + } + + // normal child exit via _exit or exit() + if(wifexited) + { + dmn_lnx_event_exit_thread(arena, &events, wait_id, WEXITSTATUS(status)); + } + + // exit because child did not handle a signal + else if(wifsignaled) + { + dmn_lnx_event_exit_thread(arena, &events, wait_id, WTERMSIG(status)); + } + // thread or group stop + else if(wifstopped) + { + // read thread registers + { + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); + if(thread && thread->state != DMN_LNX_ThreadState_PendingCreation) + { + thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); + Assert(!thread->is_reg_block_dirty); + } + } + + if(wstopsig == SIGTRAP) + { + switch(event_code) + { + case 0: + { + // translate signal code to DEMON event + siginfo_t siginfo = {0}; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) + { + switch(siginfo.si_code) + { + case SI_KERNEL: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_BRKPT: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_TRACE: { dmn_lnx_event_single_step(arena, &events, wait_id); } break; + case TRAP_HWBKPT: { dmn_lnx_event_data_breakpoint(arena, &events, wait_id); } break; + case TRAP_BRANCH: { NotImplemented; }break; + case TRAP_UNK: { NotImplemented; }break; + default: { InvalidPath; } break; + } + } else { Assert(0 && "failed to get signal info"); } + }break; + case PTRACE_EVENT_FORK: + { + NotImplemented; + }break; + case PTRACE_EVENT_VFORK: + { + NotImplemented; + }break; + case PTRACE_EVENT_VFORK_DONE: + { + NotImplemented; + }break; + case PTRACE_EVENT_CLONE: + { + // kernel stopped the parent just before scheduling the child to + // give us a chance to prepare to trace it; next event for the child + // will be a PTRACE_EVENT_STOP + + pid_t new_tid; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid)) >= 0) + { + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); + + // create a new partially inited thread + dmn_lnx_thread_alloc(thread->process, DMN_LNX_ThreadState_PendingCreation, new_tid); + } + else { Assert(0 && "failed to get new tid"); } + }break; + case PTRACE_EVENT_EXEC: + { + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); + DMN_LNX_Process *process = thread->process; + if(process->debug_subprocesses) + { + dmn_lnx_event_exit_thread(arena, &events, wait_id, 0); + dmn_lnx_event_create_process(arena, &events, wait_id, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses); + } + else + { + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, wait_id, 0, 0)) >= 0) + { + dmn_lnx_event_exit_thread(arena, &events, wait_id, 0); + } + else { Assert(0 && "failed to detach"); } + } + }break; + case PTRACE_EVENT_EXIT: + { + AssertAlways(0 && "exit tracing is disabled, this event should not be delivered"); + }break; + case PTRACE_EVENT_SECCOMP: + { + NotImplemented; + }break; + case PTRACE_EVENT_STOP: + { + DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); + if(thread->state == DMN_LNX_ThreadState_PendingCreation) + { + DMN_LNX_Process *process = thread->process; + dmn_lnx_thread_release(thread); + thread = dmn_lnx_event_create_thread(arena, &events, process, wait_id); + } + else + { + AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); + } + }break; + default: { Assert(0 && "unexpected ptrace code"); } break; + } + } + else if(wstopsig == SIGSTOP) + { + siginfo_t siginfo = {0}; + if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) + { + // finish halting if this is our SIGSTOP + if(siginfo.si_pid == dmn_lnx_state->halter_tid) + { + is_halt_done = 1; + } + else + { + // TODO: handle SIGSTOP + } + } + } + else + { + dmn_lnx_event_exception(arena, &events, wait_id, wstopsig); + } + } + else { Assert(0 && "unexpected stop code"); } + } while(running_threads.count > 0 || dmn_lnx_state->process_pending_creation > 0 || dmn_lnx_state->threads_pending_creation > 0); + + // finalize halter state + if(is_halt_done) + { + // push event + dmn_lnx_event_halt(arena, &events); + + // reset state + dmn_lnx_state->halter_tid = 0; + dmn_lnx_state->halt_code = 0; + dmn_lnx_state->halt_user_data = 0; + dmn_lnx_state->is_halting = 0; + } + + // restore original instruction bytes + for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) + { + // skip process that exited during the wait + DMN_LNX_Process *process = dmn_lnx_process_from_handle(active_trap->trap->process); + if(!process) { continue; } + + if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str) && + active_trap->good) + { + // TODO(rjf): log an error here? - we wrote the trap successfully, but we did not remove it successfully, + // implying a change in address mapping. this is maybe not even a bug, since the address is simply now + // unmapped. + } + } + } + + if(events.count == 0 && dmn_lnx_state->process_count == 0) + { + dmn_lnx_push_event_not_attached(arena, &events); + } + + mutex_drop(dmn_lnx_state->halter_mutex); + scratch_end(scratch); + return events; +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) + +internal void +dmn_halt(U64 code, U64 user_data) +{ + mutex_take(dmn_lnx_state->halter_mutex); + if(dmn_lnx_state->process_count) + { + dmn_lnx_state->halter_tid = gettid(); + dmn_lnx_state->halt_code = code; + dmn_lnx_state->halt_user_data = user_data; + for EachNode(process, DMN_LNX_Process, dmn_lnx_state->first_process) + { + if(OS_LNX_RETRY_ON_EINTR(kill(process->pid, SIGSTOP)) < 0) { Assert(0 && "failed to send SIGSTOP"); } + } + } + mutex_drop(dmn_lnx_state->halter_mutex); +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) + +//- rjf: non-blocking-control-thread access barriers + +internal B32 +dmn_access_open(void) +{ + B32 result = 0; + if(dmn_lnx_ctrl_thread) + { + result = 1; + } + else + { + mutex_take(dmn_lnx_state->access_mutex); + result = !dmn_lnx_state->access_run_state; + } + return result; +} + +internal void +dmn_access_close(void) +{ + if(!dmn_lnx_ctrl_thread) + { + mutex_drop(dmn_lnx_state->access_mutex); + } +} + +//- rjf: processes + +internal U64 +dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) +{ + return 0; +} + +internal void +dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size) +{ +} + +internal void +dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size) +{ +} + +internal void +dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) +{ +} + +internal void +dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, AccessFlags flags) +{ +} + +internal U64 +dmn_process_read(DMN_Handle process_handle, Rng1U64 range, void *dst) +{ + DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + U64 result = 0; + if(process) + { + result = dmn_lnx_read(process->fd, range, dst); + } + return result; +} + +internal B32 +dmn_process_write(DMN_Handle process_handle, Rng1U64 range, void *src) +{ + DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + B32 result = 0; + if(process) + { + result = dmn_lnx_write(process->fd, range, src); + } + return result; +} + +//- rjf: threads + +internal Arch +dmn_arch_from_thread(DMN_Handle thread_handle) +{ + Arch arch = Arch_Null; + DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + if(thread) + { + arch = thread->process->ctx->arch; + } + return arch; +} + +internal U64 +dmn_stack_base_vaddr_from_thread(DMN_Handle thread_handle) +{ + return 0; +} + +internal U64 +dmn_tls_root_vaddr_from_thread(DMN_Handle thread_handle) +{ + U64 tls_root_vaddr = max_U64; + DMN_AccessScope + { + DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + if(thread) + { + switch(thread->process->ctx->arch) + { + case Arch_Null: {} break; + case Arch_x64: + { + X64_RegBlock *reg_block = thread->reg_block; + U64 dtv_pointer = 0; + if(dmn_lnx_read_struct(thread->process->fd, reg_block->fsbase + 8, &dtv_pointer)) + { + tls_root_vaddr = dtv_pointer; + } + } break; + case Arch_x86: + case Arch_arm32: + case Arch_arm64: + { + NotImplemented; + } break; + default: { InvalidPath; } break; + } + } + } + return tls_root_vaddr; +} + +internal B32 +dmn_thread_read_reg_block(DMN_Handle thread_handle, void *reg_block) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + if(thread) + { + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + U64 reg_block_size = arch_info->reg_block_size; + MemoryCopy(reg_block, thread->reg_block, reg_block_size); + } + result = 1; + } + return result; +} + +internal B32 +dmn_thread_write_reg_block(DMN_Handle thread_handle, void *reg_block) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + if(thread) + { + ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); + U64 reg_block_size = arch_info->reg_block_size; + MemoryCopy(thread->reg_block, reg_block, reg_block_size); + thread->is_reg_block_dirty = 1; + result = 1; + } + } + return result; +} + +//- rjf: system process listing + +internal void +dmn_process_iter_begin(DMN_ProcessIter *iter) +{ + DIR *dir = opendir("/proc"); + MemoryZeroStruct(iter); + iter->v[0] = IntFromPtr(dir); +} + +internal B32 +dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out) +{ + // rjf: scan for the next process ID in the directory + B32 got_pid = 0; + String8 pid_string = {0}; + { + DIR *dir = (DIR*)PtrFromInt(iter->v[0]); + if(dir != 0 && iter->v[1] == 0) + { + for(;;) + { + // rjf: get next entry + struct dirent *d = readdir(dir); + if(d == 0) + { + break; + } + + // rjf: check file name is integer + String8 file_name = str8_cstring((char*)d->d_name); + B32 is_integer = str8_is_integer(file_name, 10); + + // rjf: break on integers (which represent processes) + if(is_integer) + { + got_pid = 1; + pid_string = file_name; + break; + } + } + } + } + + // rjf: if we found a process id, map id => info + B32 result = 0; + if(got_pid) + { + pid_t pid = u64_from_str8(pid_string, 10); + String8 name = dmn_lnx_exe_path_from_pid(arena, pid); + if(name.size == 0) + { + name = str8_lit("(unknown process)"); + } + info_out->name = name; + info_out->pid = pid; + result = 1; + } + + return result; +} + +internal void +dmn_process_iter_end(DMN_ProcessIter *iter) +{ + DIR *dir = (DIR*)PtrFromInt(iter->v[0]); + if(dir != 0) + { + closedir(dir); + } + MemoryZeroStruct(iter); +} diff --git a/src/demon/linux/demon_core_linux.h b/src/linux/demon/linux_demon.h similarity index 91% rename from src/demon/linux/demon_core_linux.h rename to src/linux/demon/linux_demon.h index 94a667c7..d4308d52 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/linux/demon/linux_demon.h @@ -1,442 +1,502 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_CORE_LINUX_H -#define DEMON_CORE_LINUX_H - -//////////////////////////////// -//~ TLS - -typedef struct DMN_LNX_DbDesc -{ - U32 bit_size; - U32 count; - U32 offset; -} DMN_LNX_DbDesc; - -//////////////////////////////// -//~ SDT Probes - -typedef struct DMN_LNX_Probe -{ - String8 provider; - String8 name; - String8 args_string; - STAP_ArgArray args; - U64 pc; - U64 semaphore; -} DMN_LNX_Probe; - -typedef struct DMN_LNX_ProbeNode -{ - DMN_LNX_Probe v; - struct DMN_LNX_ProbeNode *next; -} DMN_LNX_ProbeNode; - -typedef struct DMN_LNX_ProbeList -{ - U64 count; - DMN_LNX_ProbeNode *first; - DMN_LNX_ProbeNode *last; -} DMN_LNX_ProbeList; - -#define DMN_LNX_Probe_XList \ - X(InitStart, 2, "init_start") \ - X(InitComplete, 2, "init_complete") \ - X(RelocStart, 2, "reloc_start") \ - X(RelocComplete, 3, "reloc_complete") \ - X(MapStart, 2, "map_start") \ - X(MapComplete, 3, "map_complete") \ - X(UnmapStart, 2, "unmap_start") \ - X(UnmapComplete, 2, "unmap_complete") \ - X(LongJmp, 3, "longjmp") \ - X(LongJmpTarget, 3, "longjmp_target") \ - X(SetJmp, 3, "setjmp") - -typedef enum -{ - DMN_LNX_ProbeType_Null, -#define X(_N,...) DMN_LNX_ProbeType_##_N, - DMN_LNX_Probe_XList -#undef X - DMN_LNX_ProbeType_Count, -} DMN_LNX_ProbeType; - -//////////////////////////////// -//~ Process Info - -typedef struct DMN_LNX_Auxv -{ - U64 base; - U64 phnum; - U64 phent; - U64 phdr; - U64 execfn; - U64 pagesz; -} DMN_LNX_Auxv; - -typedef struct DMN_LNX_DynamicInfo -{ - U64 hash_vaddr; - U64 gnu_hash_vaddr; - U64 strtab_vaddr; - U64 strtab_size; - U64 symtab_vaddr; - U64 symtab_entry_size; -} DMN_LNX_DynamicInfo; - -//////////////////////////////// -//~ Entities - -typedef enum DMN_LNX_EntityKind -{ - DMN_LNX_EntityKind_Null, - DMN_LNX_EntityKind_Process, - DMN_LNX_EntityKind_ProcessCtx, - DMN_LNX_EntityKind_Thread, - DMN_LNX_EntityKind_Module, -} DMN_LNX_EntityKind; - -typedef enum DMN_LNX_ThreadState -{ - DMN_LNX_ThreadState_Null, - DMN_LNX_ThreadState_Running, - DMN_LNX_ThreadState_Stopped, - DMN_LNX_ThreadState_Exited, - DMN_LNX_ThreadState_PendingCreation, -} DMN_LNX_ThreadState; - -typedef struct DMN_LNX_Thread -{ - pid_t tid; - DMN_LNX_ThreadState state; - struct DMN_LNX_Process *process; - void *reg_block; - B32 is_reg_block_dirty; - B32 pass_through_signal; - U64 pass_through_signo; - U64 orig_rax; - - struct DMN_LNX_Thread *next; - struct DMN_LNX_Thread *prev; -} DMN_LNX_Thread; - -typedef struct DMN_LNX_ThreadPtrNode -{ - DMN_LNX_Thread *v; - struct DMN_LNX_ThreadPtrNode *next; - struct DMN_LNX_ThreadPtrNode *prev; -} DMN_LNX_ThreadPtrNode; - -typedef struct DMN_LNX_ThreadPtrList -{ - U64 count; - DMN_LNX_ThreadPtrNode *first; - DMN_LNX_ThreadPtrNode *last; -} DMN_LNX_ThreadPtrList; - -typedef struct DMN_LNX_Module -{ - U64 name_vaddr; - U64 base_vaddr; - U64 name_space_id; - U64 size; - U64 phvaddr; - U64 phentsize; - U64 phcount; - U64 tls_index; - U64 tls_offset; - B8 is_live; - B8 is_main; - - struct DMN_LNX_Module *next; - struct DMN_LNX_Module *prev; -} DMN_LNX_Module; - -typedef struct DMN_LNX_ModulePtrNode -{ - DMN_LNX_Module *v; - struct DMN_LNX_ModulePtrNode *next; -} DMN_LNX_ModulePtrNode; - -typedef struct DMN_LNX_ModulePtrList -{ - U64 count; - DMN_LNX_ModulePtrNode *first; - DMN_LNX_ModulePtrNode *last; -} DMN_LNX_ModulePtrList; - -typedef enum -{ - DMN_LNX_ProcessState_Null, - DMN_LNX_ProcessState_Launch, - DMN_LNX_ProcessState_Attach, - DMN_LNX_ProcessState_WaitForExec, - DMN_LNX_ProcessState_ExecFailedDoExit, - DMN_LNX_ProcessState_Normal, -} DMN_LNX_ProcessState; - -typedef enum -{ - DMN_LNX_CreateProcessFlag_DebugSubprocesses = (1 << 0), - DMN_LNX_CreateProcessFlag_Rebased = (1 << 1), - DMN_LNX_CreateProcessFlag_Cow = (1 << 2), - DMN_LNX_CreateProcessFlag_ClonedMemory = (1 << 3), -} DMN_LNX_CreateProcessFlags; - -typedef struct DMN_LNX_Process -{ - pid_t pid; - int fd; - DMN_LNX_ProcessState state; - B32 debug_subprocesses; - B32 is_cow; - B32 vfork_with_spoof; - U64 thread_count; - DMN_LNX_Thread *first_thread; - DMN_LNX_Thread *last_thread; - U64 main_thread_exit_code; - struct DMN_LNX_Process *parent_process; - struct DMN_LNX_ProcessCtx *ctx; - - - struct DMN_LNX_Process *next; - struct DMN_LNX_Process *prev; -} DMN_LNX_Process; - -typedef struct DMN_LNX_ProcessPtrNode -{ - DMN_LNX_Process *v; - struct DMN_LNX_ProcessPtrNode *next; -} DMN_LNX_ProcessPtrNode; - -typedef struct DMN_LNX_ProcessPtrList -{ - U64 count; - DMN_LNX_ProcessPtrNode *first; - DMN_LNX_ProcessPtrNode *last; -} DMN_LNX_ProcessPtrList; - -typedef struct DMN_LNX_ProcessCtx -{ - Arena *arena; - Arch arch; - U64 rdebug_vaddr; - ELF_Class dl_class; - HashTable *loaded_modules_ht; - DMN_LNX_Probe **probes; - DMN_ActiveTrap *first_probe_trap; - DMN_ActiveTrap *last_probe_trap; - DMN_LNX_Module *first_module; - DMN_LNX_Module *last_module; - U64 module_count; - U64 ref_count; - - String8List free_reg_blocks; - String8List free_reg_block_nodes; - - // x64 - U64 xcr0; - U64 xsave_size; - X64_XSaveLayout xsave_layout; -} DMN_LNX_ProcessCtx; - -typedef struct DMN_LNX_Entity -{ - union - { - DMN_LNX_Process process; - DMN_LNX_ProcessCtx process_ctx; - DMN_LNX_Thread thread; - DMN_LNX_Module module; - struct - { - struct DMN_LNX_Entity *next; - }; - }; - U32 gen; - DMN_LNX_EntityKind kind; -} DMN_LNX_Entity; - -typedef struct DMN_LNX_EntityNode -{ - DMN_LNX_Entity *v; - struct DMN_LNX_EntityNode *next; -} DMN_LNX_EntityNode; - -typedef struct DMN_LNX_EntityList -{ - U64 count; - DMN_LNX_EntityNode *first; - DMN_LNX_EntityNode *last; -} DMN_LNX_EntityList; - -//////////////////////////////// -//~ Global State - -typedef struct DMN_LNX_State -{ - Arena *arena; - - // rjf: access locking mechanism - Mutex access_mutex; - B32 access_run_state; - - // rjf: entity storage - Arena *entities_arena; - DMN_LNX_Entity *entities_base; - DMN_LNX_Entity *free_entity; - U64 entities_count; - - HashTable *tid_ht; // thread id -> thread entity - HashTable *pid_ht; // process id -> process entity - - // process tracking - U64 process_count; - DMN_LNX_Process *first_process; - DMN_LNX_Process *last_process; - - // process/thread creation tracking - U64 process_pending_creation; - U64 threads_pending_creation; - - // halter - Mutex halter_mutex; - pid_t halter_tid; - U64 halt_code; - U64 halt_user_data; - B32 is_halting; - - // TLS - B32 is_tls_detected; - DMN_LNX_DbDesc tls_modid_desc; - DMN_LNX_DbDesc tls_offset_desc; -} DMN_LNX_State; - -//////////////////////////////// -//~ Globals - -global B32 dmn_lnx_ctrl_thread; -global DMN_LNX_State *dmn_lnx_state; - -//////////////////////////////// -//~ Memory R/W - -internal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst); -internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); -internal String8 dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size); -internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr); -#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) -#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) - -//////////////////////////////// -//~ ELF/GNU info - -internal Rng1U64 dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum); -internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); -internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased); - -//////////////////////////////// -//~ Process Info - -internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); -internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); -internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid); -internal DMN_LNX_Auxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class); -internal DMN_LNX_Thread * dmn_lnx_thread_from_pid(pid_t pid); -internal DMN_LNX_Process * dmn_lnx_process_from_pid(pid_t pid); - -//////////////////////////////// -//~ Entity - -// alloc -internal DMN_LNX_Entity * dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind); -internal DMN_LNX_Process * dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocess, B32 is_cow); -internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased); -internal DMN_LNX_Thread * dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid); -internal DMN_LNX_Module * dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main); - -// release -internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); -internal void dmn_lnx_process_release(DMN_LNX_Process *process); -internal void dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *process_ctx); -internal void dmn_lnx_thread_release(DMN_LNX_Thread *thread); -internal void dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module); - -// clone -internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_clone(DMN_LNX_Process *process, DMN_LNX_ProcessCtx *ctx); -internal DMN_LNX_Module * dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module); - -// entity -> handle -internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); -internal DMN_Handle dmn_lnx_handle_from_process(DMN_LNX_Process *process); -internal DMN_Handle dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx); -internal DMN_Handle dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread); -internal DMN_Handle dmn_lnx_handle_from_module(DMN_LNX_Module *module); - -// handle -> entity -internal DMN_LNX_Entity * dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind); -internal DMN_LNX_Process * dmn_lnx_process_from_handle(DMN_Handle process_handle); -internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle); -internal DMN_LNX_Thread * dmn_lnx_thread_from_handle(DMN_Handle thread_handle); -internal DMN_LNX_Module * dmn_lnx_module_from_handle(DMN_Handle module_handle); - -//////////////////////////////// -//~ Process Helpers - -internal void dmn_lnx_process_trap_probes(DMN_LNX_Process *process); -internal void dmn_lnx_process_untrap_probes(DMN_LNX_Process *process); - -//////////////////////////////// -//~ Thread Helpers - -internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread); -internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread); -internal void dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip); -internal void dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp); -internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread); -internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread); -internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on); - -//////////////////////////////// -//~ List Helpers - -internal void dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n); -internal DMN_LNX_ThreadPtrNode * dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v); -internal DMN_LNX_ModulePtrNode * dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v); -internal DMN_LNX_ProcessPtrNode * dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v); - -//////////////////////////////// -//~ Debug Event Pushers - -internal void dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); -internal void dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); -internal void dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread); -internal void dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code); -internal void dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module); -internal void dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module); -internal void dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); -internal void dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address); -internal void dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread); -internal void dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo); -internal void dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events); -internal void dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events); - -//////////////////////////////// -//~ Debug Event - -internal DMN_LNX_Thread * dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid); -internal void dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code); -internal DMN_LNX_Process * dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags); -internal void dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid); -internal void dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr); -internal void dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr); -internal void dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid); -internal void dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid); -internal void dmn_lnx_event_halt(Arena *arena, DMN_EventList *events); -internal void dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid); -internal void dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo); -internal DMN_LNX_Process * dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid); - -#endif // DEMON_CORE_LINUX_H - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON_CORE_LINUX_H +#define DEMON_CORE_LINUX_H + +//////////////////////////////// +//~ rjf: Register Layouts +// +// These are defined in , but only for one architecture at a time + +typedef struct OS_LNX_GprsX64 OS_LNX_GprsX64; +struct OS_LNX_GprsX64 +{ + U64 r15; + U64 r14; + U64 r13; + U64 r12; + U64 rbp; + U64 rbx; + U64 r11; + U64 r10; + U64 r9; + U64 r8; + U64 rax; + U64 rcx; + U64 rdx; + U64 rsi; + U64 rdi; + U64 orig_rax; + U64 rip; + U64 cs; + U64 rflags; + U64 rsp; + U64 ss; + U64 fsbase; + U64 gsbase; + U64 ds; + U64 es; + U64 fs; + U64 gs; +}; + +typedef struct OS_LNX_UserX64 OS_LNX_UserX64; +struct OS_LNX_UserX64 +{ + OS_LNX_GprsX64 regs; + S32 u_fpvalid; + U32 _pad0; + X64_FXSave i387; + U64 u_tsize; + U64 u_dsize; + U64 u_ssize; + U64 start_code; + U64 start_stack; + U64 signal; + U32 reserved; + U32 _pad1; + U64 u_ar0; + U64 u_fpstate; + U64 magic; + U8 u_comm[32]; + U64 u_debugreg[8]; +}; +StaticAssert(sizeof(OS_LNX_UserX64) == 912, g_os_lnx_user_x64_size_check); + +//////////////////////////////// +//~ TLS + +typedef struct DMN_LNX_DbDesc +{ + U32 bit_size; + U32 count; + U32 offset; +} DMN_LNX_DbDesc; + +//////////////////////////////// +//~ SDT Probes + +typedef struct DMN_LNX_Probe +{ + String8 provider; + String8 name; + String8 args_string; + STAP_ArgArray args; + U64 pc; + U64 semaphore; +} DMN_LNX_Probe; + +typedef struct DMN_LNX_ProbeNode +{ + DMN_LNX_Probe v; + struct DMN_LNX_ProbeNode *next; +} DMN_LNX_ProbeNode; + +typedef struct DMN_LNX_ProbeList +{ + U64 count; + DMN_LNX_ProbeNode *first; + DMN_LNX_ProbeNode *last; +} DMN_LNX_ProbeList; + +#define DMN_LNX_Probe_XList \ +X(InitStart, 2, "init_start") \ +X(InitComplete, 2, "init_complete") \ +X(RelocStart, 2, "reloc_start") \ +X(RelocComplete, 3, "reloc_complete") \ +X(MapStart, 2, "map_start") \ +X(MapComplete, 3, "map_complete") \ +X(UnmapStart, 2, "unmap_start") \ +X(UnmapComplete, 2, "unmap_complete") \ +X(LongJmp, 3, "longjmp") \ +X(LongJmpTarget, 3, "longjmp_target") \ +X(SetJmp, 3, "setjmp") + +typedef enum +{ + DMN_LNX_ProbeType_Null, +#define X(_N,...) DMN_LNX_ProbeType_##_N, + DMN_LNX_Probe_XList +#undef X + DMN_LNX_ProbeType_Count, +} DMN_LNX_ProbeType; + +//////////////////////////////// +//~ Process Info + +typedef struct DMN_LNX_Auxv +{ + U64 base; + U64 phnum; + U64 phent; + U64 phdr; + U64 execfn; + U64 pagesz; +} DMN_LNX_Auxv; + +typedef struct DMN_LNX_DynamicInfo +{ + U64 hash_vaddr; + U64 gnu_hash_vaddr; + U64 strtab_vaddr; + U64 strtab_size; + U64 symtab_vaddr; + U64 symtab_entry_size; +} DMN_LNX_DynamicInfo; + +//////////////////////////////// +//~ Entities + +typedef enum DMN_LNX_EntityKind +{ + DMN_LNX_EntityKind_Null, + DMN_LNX_EntityKind_Process, + DMN_LNX_EntityKind_ProcessCtx, + DMN_LNX_EntityKind_Thread, + DMN_LNX_EntityKind_Module, +} DMN_LNX_EntityKind; + +typedef enum DMN_LNX_ThreadState +{ + DMN_LNX_ThreadState_Null, + DMN_LNX_ThreadState_Running, + DMN_LNX_ThreadState_Stopped, + DMN_LNX_ThreadState_Exited, + DMN_LNX_ThreadState_PendingCreation, +} DMN_LNX_ThreadState; + +typedef struct DMN_LNX_Thread +{ + pid_t tid; + DMN_LNX_ThreadState state; + struct DMN_LNX_Process *process; + void *reg_block; + B32 is_reg_block_dirty; + B32 pass_through_signal; + U64 pass_through_signo; + U64 orig_rax; + + struct DMN_LNX_Thread *next; + struct DMN_LNX_Thread *prev; +} DMN_LNX_Thread; + +typedef struct DMN_LNX_ThreadPtrNode +{ + DMN_LNX_Thread *v; + struct DMN_LNX_ThreadPtrNode *next; + struct DMN_LNX_ThreadPtrNode *prev; +} DMN_LNX_ThreadPtrNode; + +typedef struct DMN_LNX_ThreadPtrList +{ + U64 count; + DMN_LNX_ThreadPtrNode *first; + DMN_LNX_ThreadPtrNode *last; +} DMN_LNX_ThreadPtrList; + +typedef struct DMN_LNX_Module +{ + U64 name_vaddr; + U64 base_vaddr; + U64 name_space_id; + U64 size; + U64 phvaddr; + U64 phentsize; + U64 phcount; + U64 tls_index; + U64 tls_offset; + B8 is_live; + B8 is_main; + + struct DMN_LNX_Module *next; + struct DMN_LNX_Module *prev; +} DMN_LNX_Module; + +typedef struct DMN_LNX_ModulePtrNode +{ + DMN_LNX_Module *v; + struct DMN_LNX_ModulePtrNode *next; +} DMN_LNX_ModulePtrNode; + +typedef struct DMN_LNX_ModulePtrList +{ + U64 count; + DMN_LNX_ModulePtrNode *first; + DMN_LNX_ModulePtrNode *last; +} DMN_LNX_ModulePtrList; + +typedef enum +{ + DMN_LNX_ProcessState_Null, + DMN_LNX_ProcessState_Launch, + DMN_LNX_ProcessState_Attach, + DMN_LNX_ProcessState_WaitForExec, + DMN_LNX_ProcessState_ExecFailedDoExit, + DMN_LNX_ProcessState_Normal, +} DMN_LNX_ProcessState; + +typedef enum +{ + DMN_LNX_CreateProcessFlag_DebugSubprocesses = (1 << 0), + DMN_LNX_CreateProcessFlag_Rebased = (1 << 1), + DMN_LNX_CreateProcessFlag_Cow = (1 << 2), + DMN_LNX_CreateProcessFlag_ClonedMemory = (1 << 3), +} DMN_LNX_CreateProcessFlags; + +typedef struct DMN_LNX_Process +{ + pid_t pid; + int fd; + DMN_LNX_ProcessState state; + B32 debug_subprocesses; + B32 is_cow; + B32 vfork_with_spoof; + U64 thread_count; + DMN_LNX_Thread *first_thread; + DMN_LNX_Thread *last_thread; + U64 main_thread_exit_code; + struct DMN_LNX_Process *parent_process; + struct DMN_LNX_ProcessCtx *ctx; + + + struct DMN_LNX_Process *next; + struct DMN_LNX_Process *prev; +} DMN_LNX_Process; + +typedef struct DMN_LNX_ProcessPtrNode +{ + DMN_LNX_Process *v; + struct DMN_LNX_ProcessPtrNode *next; +} DMN_LNX_ProcessPtrNode; + +typedef struct DMN_LNX_ProcessPtrList +{ + U64 count; + DMN_LNX_ProcessPtrNode *first; + DMN_LNX_ProcessPtrNode *last; +} DMN_LNX_ProcessPtrList; + +typedef struct DMN_LNX_ProcessCtx +{ + Arena *arena; + Arch arch; + U64 rdebug_vaddr; + ELF_Class dl_class; + HashTable *loaded_modules_ht; + DMN_LNX_Probe **probes; + DMN_ActiveTrap *first_probe_trap; + DMN_ActiveTrap *last_probe_trap; + DMN_LNX_Module *first_module; + DMN_LNX_Module *last_module; + U64 module_count; + U64 ref_count; + + String8List free_reg_blocks; + String8List free_reg_block_nodes; + + // x64 + U64 xcr0; + U64 xsave_size; + X64_XSaveLayout xsave_layout; +} DMN_LNX_ProcessCtx; + +typedef struct DMN_LNX_Entity +{ + union + { + DMN_LNX_Process process; + DMN_LNX_ProcessCtx process_ctx; + DMN_LNX_Thread thread; + DMN_LNX_Module module; + struct + { + struct DMN_LNX_Entity *next; + }; + }; + U32 gen; + DMN_LNX_EntityKind kind; +} DMN_LNX_Entity; + +typedef struct DMN_LNX_EntityNode +{ + DMN_LNX_Entity *v; + struct DMN_LNX_EntityNode *next; +} DMN_LNX_EntityNode; + +typedef struct DMN_LNX_EntityList +{ + U64 count; + DMN_LNX_EntityNode *first; + DMN_LNX_EntityNode *last; +} DMN_LNX_EntityList; + +//////////////////////////////// +//~ Global State + +typedef struct DMN_LNX_State +{ + Arena *arena; + + // rjf: access locking mechanism + Mutex access_mutex; + B32 access_run_state; + + // rjf: entity storage + Arena *entities_arena; + DMN_LNX_Entity *entities_base; + DMN_LNX_Entity *free_entity; + U64 entities_count; + + HashTable *tid_ht; // thread id -> thread entity + HashTable *pid_ht; // process id -> process entity + + // process tracking + U64 process_count; + DMN_LNX_Process *first_process; + DMN_LNX_Process *last_process; + + // process/thread creation tracking + U64 process_pending_creation; + U64 threads_pending_creation; + + // halter + Mutex halter_mutex; + pid_t halter_tid; + U64 halt_code; + U64 halt_user_data; + B32 is_halting; + + // TLS + B32 is_tls_detected; + DMN_LNX_DbDesc tls_modid_desc; + DMN_LNX_DbDesc tls_offset_desc; +} DMN_LNX_State; + +//////////////////////////////// +//~ Globals + +global B32 dmn_lnx_ctrl_thread; +global DMN_LNX_State *dmn_lnx_state; + +//////////////////////////////// +//~ Memory R/W + +internal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst); +internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); +internal String8 dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size); +internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr); +#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) +#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) + +//////////////////////////////// +//~ ELF/GNU info + +internal Rng1U64 dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum); +internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); +internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased); + +//////////////////////////////// +//~ Process Info + +internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); +internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); +internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid); +internal DMN_LNX_Auxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class); +internal DMN_LNX_Thread * dmn_lnx_thread_from_pid(pid_t pid); +internal DMN_LNX_Process * dmn_lnx_process_from_pid(pid_t pid); + +//////////////////////////////// +//~ Entity + +// alloc +internal DMN_LNX_Entity * dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind); +internal DMN_LNX_Process * dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocess, B32 is_cow); +internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased); +internal DMN_LNX_Thread * dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid); +internal DMN_LNX_Module * dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main); + +// release +internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); +internal void dmn_lnx_process_release(DMN_LNX_Process *process); +internal void dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *process_ctx); +internal void dmn_lnx_thread_release(DMN_LNX_Thread *thread); +internal void dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module); + +// clone +internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_clone(DMN_LNX_Process *process, DMN_LNX_ProcessCtx *ctx); +internal DMN_LNX_Module * dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module); + +// entity -> handle +internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); +internal DMN_Handle dmn_lnx_handle_from_process(DMN_LNX_Process *process); +internal DMN_Handle dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx); +internal DMN_Handle dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread); +internal DMN_Handle dmn_lnx_handle_from_module(DMN_LNX_Module *module); + +// handle -> entity +internal DMN_LNX_Entity * dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind); +internal DMN_LNX_Process * dmn_lnx_process_from_handle(DMN_Handle process_handle); +internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle); +internal DMN_LNX_Thread * dmn_lnx_thread_from_handle(DMN_Handle thread_handle); +internal DMN_LNX_Module * dmn_lnx_module_from_handle(DMN_Handle module_handle); + +//////////////////////////////// +//~ Process Helpers + +internal void dmn_lnx_process_trap_probes(DMN_LNX_Process *process); +internal void dmn_lnx_process_untrap_probes(DMN_LNX_Process *process); + +//////////////////////////////// +//~ Thread Helpers + +internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread); +internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread); +internal void dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip); +internal void dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp); +internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread); +internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread); +internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on); + +//////////////////////////////// +//~ List Helpers + +internal void dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n); +internal DMN_LNX_ThreadPtrNode * dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v); +internal DMN_LNX_ModulePtrNode * dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v); +internal DMN_LNX_ProcessPtrNode * dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v); + +//////////////////////////////// +//~ Debug Event Pushers + +internal void dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); +internal void dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); +internal void dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread); +internal void dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code); +internal void dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module); +internal void dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module); +internal void dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); +internal void dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address); +internal void dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread); +internal void dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo); +internal void dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events); +internal void dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events); + +//////////////////////////////// +//~ Debug Event + +internal DMN_LNX_Thread * dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid); +internal void dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code); +internal DMN_LNX_Process * dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags); +internal void dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid); +internal void dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr); +internal void dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr); +internal void dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid); +internal void dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid); +internal void dmn_lnx_event_halt(Arena *arena, DMN_EventList *events); +internal void dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid); +internal void dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo); +internal DMN_LNX_Process * dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid); + +#endif // DEMON_CORE_LINUX_H + diff --git a/src/os/gfx/linux/os_gfx_linux.c b/src/linux/window_manager/linux_window_manager.c similarity index 85% rename from src/os/gfx/linux/os_gfx_linux.c rename to src/linux/window_manager/linux_window_manager.c index 9485225b..905ddef6 100644 --- a/src/os/gfx/linux/os_gfx_linux.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -1,719 +1,719 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Helpers - -internal OS_LNX_Window * -os_lnx_window_from_x11window(Window window) -{ - OS_LNX_Window *result = 0; - for(OS_LNX_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next) - { - if(w->window == window) - { - result = w; - break; - } - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_gfx_init(void) -{ - //- rjf: initialize basics - Arena *arena = arena_alloc(); - os_lnx_gfx_state = push_array(arena, OS_LNX_GfxState, 1); - os_lnx_gfx_state->arena = arena; - os_lnx_gfx_state->display = XOpenDisplay(0); - - //- rjf: calculate atoms - os_lnx_gfx_state->wm_delete_window_atom = XInternAtom(os_lnx_gfx_state->display, "WM_DELETE_WINDOW", 0); - os_lnx_gfx_state->wm_sync_request_atom = XInternAtom(os_lnx_gfx_state->display, "_NET_WM_SYNC_REQUEST", 0); - os_lnx_gfx_state->wm_sync_request_counter_atom = XInternAtom(os_lnx_gfx_state->display, "_NET_WM_SYNC_REQUEST_COUNTER", 0); - - //- rjf: open im - os_lnx_gfx_state->xim = XOpenIM(os_lnx_gfx_state->display, 0, 0, 0); - - //- rjf: fill out gfx info - os_lnx_gfx_state->gfx_info.double_click_time = 0.5f; - os_lnx_gfx_state->gfx_info.caret_blink_time = 0.5f; - os_lnx_gfx_state->gfx_info.default_refresh_rate = 60.f; - - //- rjf: fill out cursors - { - struct - { - OS_Cursor cursor; - unsigned int id; - } - map[] = - { - {OS_Cursor_Pointer, XC_left_ptr}, - {OS_Cursor_IBar, XC_xterm}, - {OS_Cursor_LeftRight, XC_sb_h_double_arrow}, - {OS_Cursor_UpDown, XC_sb_v_double_arrow}, - {OS_Cursor_DownRight, XC_bottom_right_corner}, - {OS_Cursor_UpRight, XC_top_right_corner}, - {OS_Cursor_UpDownLeftRight, XC_fleur}, - {OS_Cursor_HandPoint, XC_hand1}, - {OS_Cursor_Disabled, XC_X_cursor}, - }; - for EachElement(idx, map) - { - os_lnx_gfx_state->cursors[map[idx].cursor] = XCreateFontCursor(os_lnx_gfx_state->display, map[idx].id); - } - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) - -internal OS_GfxInfo * -os_get_gfx_info(void) -{ - return &os_lnx_gfx_state->gfx_info; -} - -//////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) - -internal void -os_set_clipboard_text(String8 string) -{ - -} - -internal String8 -os_get_clipboard_text(Arena *arena) -{ - String8 result = {0}; - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) - -internal OS_Handle -os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) -{ - Vec2F32 resolution = dim_2f32(rect); - - //- rjf: allocate window - OS_LNX_Window *w = os_lnx_gfx_state->free_window; - if(w) - { - SLLStackPop(os_lnx_gfx_state->free_window); - } - else - { - w = push_array_no_zero(os_lnx_gfx_state->arena, OS_LNX_Window, 1); - } - MemoryZeroStruct(w); - DLLPushBack(os_lnx_gfx_state->first_window, os_lnx_gfx_state->last_window, w); - - //- rjf: create window & equip with x11 info - w->window = XCreateWindow(os_lnx_gfx_state->display, - XDefaultRootWindow(os_lnx_gfx_state->display), - 0, 0, resolution.x, resolution.y, - 0, - CopyFromParent, - InputOutput, - CopyFromParent, - 0, - 0); - XSelectInput(os_lnx_gfx_state->display, w->window, - ExposureMask| - PointerMotionMask| - ButtonPressMask| - ButtonReleaseMask| - KeyPressMask| - KeyReleaseMask| - FocusChangeMask); - Atom protocols[] = - { - os_lnx_gfx_state->wm_delete_window_atom, - os_lnx_gfx_state->wm_sync_request_atom, - }; - XSetWMProtocols(os_lnx_gfx_state->display, w->window, protocols, ArrayCount(protocols)); - { - XSyncValue initial_value; - XSyncIntToValue(&initial_value, 0); - w->counter_xid = XSyncCreateCounter(os_lnx_gfx_state->display, initial_value); - } - XChangeProperty(os_lnx_gfx_state->display, w->window, os_lnx_gfx_state->wm_sync_request_counter_atom, XA_CARDINAL, 32, PropModeReplace, (U8 *)&w->counter_xid, 1); - - //- rjf: create xic - w->xic = XCreateIC(os_lnx_gfx_state->xim, - XNInputStyle, XIMPreeditNothing|XIMStatusNothing, - XNClientWindow, w->window, - XNFocusWindow, w->window, - NULL); - - //- rjf: attach name - Temp scratch = scratch_begin(0, 0); - String8 title_copy = push_str8_copy(scratch.arena, title); - XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str); - scratch_end(scratch); - - //- rjf: convert to handle & return - OS_Handle handle = {(U64)w}; - return handle; -} - -internal void -os_window_close(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; - XDestroyWindow(os_lnx_gfx_state->display, w->window); -} - -internal void -os_window_set_title(OS_Handle handle, String8 title) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - Temp scratch = scratch_begin(0, 0); - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; - String8 title_copy = push_str8_copy(scratch.arena, title); - XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str); - scratch_end(scratch); -} - -internal void -os_window_first_paint(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; - XMapWindow(os_lnx_gfx_state->display, w->window); -} - -internal void -os_window_focus(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; - XSetInputFocus(os_lnx_gfx_state->display, w->window, RevertToNone, CurrentTime); -} - -internal B32 -os_window_is_focused(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return 0;} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; - Window focused_window = 0; - int revert_to = 0; - XGetInputFocus(os_lnx_gfx_state->display, &focused_window, &revert_to); - B32 result = (w->window == focused_window); - return result; -} - -internal B32 -os_window_is_fullscreen(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return 0;} - // TODO(rjf) - return 0; -} - -internal void -os_window_set_fullscreen(OS_Handle handle, B32 fullscreen) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal B32 -os_window_is_maximized(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return 0;} - // TODO(rjf) - return 0; -} - -internal void -os_window_set_maximized(OS_Handle handle, B32 maximized) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal B32 -os_window_is_minimized(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return 0;} - // TODO(rjf) - return 0; -} - -internal void -os_window_set_minimized(OS_Handle handle, B32 minimized) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal void -os_window_bring_to_front(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal void -os_window_set_monitor(OS_Handle handle, OS_Handle monitor) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal void -os_window_clear_custom_border_data(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal void -os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal void -os_window_push_custom_edges(OS_Handle handle, F32 thickness) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal void -os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) -{ - if(os_handle_match(handle, os_handle_zero())) {return;} - // TODO(rjf) -} - -internal Rng2F32 -os_rect_from_window(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return r2f32p(0, 0, 0, 0);} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; - XWindowAttributes atts = {0}; - Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts); - Rng2F32 result = r2f32p((F32)atts.x, (F32)atts.y, (F32)atts.x + (F32)atts.width, (F32)atts.y + (F32)atts.height); - return result; -} - -internal Rng2F32 -os_client_rect_from_window(OS_Handle handle) -{ - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; - XWindowAttributes atts = {0}; - Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts); - Rng2F32 result = r2f32p(0, 0, (F32)atts.width, (F32)atts.height); - return result; -} - -internal F32 -os_dpi_from_window(OS_Handle handle) -{ - // TODO(rjf) - return 96.f; -} - -//////////////////////////////// -//~ rjf: @os_hooks External Windows (Implemented Per-OS) - -internal OS_Handle -os_focused_external_window(void) -{ - OS_Handle result = {0}; - // TODO(rjf) - return result; -} - -internal void -os_focus_external_window(OS_Handle handle) -{ - // TODO(rjf) -} - -//////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) - -internal OS_HandleArray -os_push_monitors_array(Arena *arena) -{ - OS_HandleArray result = {0}; - // TODO(rjf) - return result; -} - -internal OS_Handle -os_primary_monitor(void) -{ - OS_Handle result = {0}; - // TODO(rjf) - return result; -} - -internal OS_Handle -os_monitor_from_window(OS_Handle window) -{ - OS_Handle result = {0}; - // TODO(rjf) - return result; -} - -internal String8 -os_name_from_monitor(Arena *arena, OS_Handle monitor) -{ - // TODO(rjf) - return str8_zero(); -} - -internal Vec2F32 -os_dim_from_monitor(OS_Handle monitor) -{ - // TODO(rjf) - return v2f32(0, 0); -} - -internal F32 -os_dpi_from_monitor(OS_Handle monitor) -{ - // TODO(rjf) - return 96.f; -} - -//////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) - -internal void -os_send_wakeup_event(void) -{ - // TODO(rjf) -} - -internal OS_EventList -os_get_events(Arena *arena, B32 wait) -{ - OS_EventList evts = {0}; - for(;XPending(os_lnx_gfx_state->display) > 0 || (wait && evts.count == 0);) - { - XEvent evt = {0}; - XNextEvent(os_lnx_gfx_state->display, &evt); - B32 set_mouse_cursor = 0; - switch(evt.type) - { - default:{}break; - - //- rjf: key presses/releases - case KeyPress: - case KeyRelease: - { - // rjf: determine flags - OS_Modifiers modifiers = 0; - if(evt.xkey.state & ShiftMask) { modifiers |= OS_Modifier_Shift; } - if(evt.xkey.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; } - if(evt.xkey.state & Mod1Mask) { modifiers |= OS_Modifier_Alt; } - - // rjf: map keycode -> keysym & codepoint - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xkey.window); - KeySym keysym = 0; - U8 text[256] = {0}; - U64 text_size = Xutf8LookupString(window->xic, &evt.xkey, (char *)text, sizeof(text), &keysym, 0); - - // rjf: map keysym -> OS_Key - B32 is_right_sided = 0; - OS_Key key = OS_Key_Null; - switch(keysym) - { - default: - { - if(0){} - else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (OS_Key)(OS_Key_F1 + (keysym - XK_F1)); } - else if('0' <= keysym && keysym <= '9') { key = OS_Key_0 + (keysym-'0'); } - }break; - case XK_Escape:{key = OS_Key_Esc;};break; - case XK_BackSpace:{key = OS_Key_Backspace;}break; - case XK_Delete:{key = OS_Key_Delete;}break; - case XK_Return:{key = OS_Key_Return;}break; - case XK_Pause:{key = OS_Key_Pause;}break; - case XK_Tab:{key = OS_Key_Tab;}break; - case XK_Left:{key = OS_Key_Left;}break; - case XK_Right:{key = OS_Key_Right;}break; - case XK_Up:{key = OS_Key_Up;}break; - case XK_Down:{key = OS_Key_Down;}break; - case XK_Home:{key = OS_Key_Home;}break; - case XK_End:{key = OS_Key_End;}break; - case XK_Page_Up:{key = OS_Key_PageUp;}break; - case XK_Page_Down:{key = OS_Key_PageDown;}break; - case XK_Alt_L:{ key = OS_Key_Alt; }break; - case XK_Alt_R:{ key = OS_Key_Alt; is_right_sided = 1;}break; - case XK_Shift_L:{ key = OS_Key_Shift; }break; - case XK_Shift_R:{ key = OS_Key_Shift; is_right_sided = 1;}break; - case XK_Control_L:{ key = OS_Key_Ctrl; }break; - case XK_Control_R:{ key = OS_Key_Ctrl; is_right_sided = 1;}break; - case '-':{key = OS_Key_Minus;}break; - case '=':{key = OS_Key_Equal;}break; - case '[':{key = OS_Key_LeftBracket;}break; - case ']':{key = OS_Key_RightBracket;}break; - case ';':{key = OS_Key_Semicolon;}break; - case '\'':{key = OS_Key_Quote;}break; - case '.':{key = OS_Key_Period;}break; - case ',':{key = OS_Key_Comma;}break; - case '/':{key = OS_Key_Slash;}break; - case '\\':{key = OS_Key_BackSlash;}break; - case '\t':{key = OS_Key_Tab;}break; - case 'a':case 'A':{key = OS_Key_A;}break; - case 'b':case 'B':{key = OS_Key_B;}break; - case 'c':case 'C':{key = OS_Key_C;}break; - case 'd':case 'D':{key = OS_Key_D;}break; - case 'e':case 'E':{key = OS_Key_E;}break; - case 'f':case 'F':{key = OS_Key_F;}break; - case 'g':case 'G':{key = OS_Key_G;}break; - case 'h':case 'H':{key = OS_Key_H;}break; - case 'i':case 'I':{key = OS_Key_I;}break; - case 'j':case 'J':{key = OS_Key_J;}break; - case 'k':case 'K':{key = OS_Key_K;}break; - case 'l':case 'L':{key = OS_Key_L;}break; - case 'm':case 'M':{key = OS_Key_M;}break; - case 'n':case 'N':{key = OS_Key_N;}break; - case 'o':case 'O':{key = OS_Key_O;}break; - case 'p':case 'P':{key = OS_Key_P;}break; - case 'q':case 'Q':{key = OS_Key_Q;}break; - case 'r':case 'R':{key = OS_Key_R;}break; - case 's':case 'S':{key = OS_Key_S;}break; - case 't':case 'T':{key = OS_Key_T;}break; - case 'u':case 'U':{key = OS_Key_U;}break; - case 'v':case 'V':{key = OS_Key_V;}break; - case 'w':case 'W':{key = OS_Key_W;}break; - case 'x':case 'X':{key = OS_Key_X;}break; - case 'y':case 'Y':{key = OS_Key_Y;}break; - case 'z':case 'Z':{key = OS_Key_Z;}break; - case ' ':{key = OS_Key_Space;}break; - } - - // rjf: push text event - if(evt.type == KeyPress && text_size != 0) - { - for(U64 off = 0; off < text_size;) - { - UnicodeDecode decode = utf8_decode(text+off, text_size-off); - if(decode.codepoint != 0 && (decode.codepoint >= 32 || decode.codepoint == '\t')) - { - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Text); - e->window.u64[0] = (U64)window; - e->character = decode.codepoint; - } - if(decode.inc == 0) - { - break; - } - off += decode.inc; - } - } - - // rjf: push key event - { - OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == KeyPress ? OS_EventKind_Press : OS_EventKind_Release); - e->window.u64[0] = (U64)window; - e->modifiers = modifiers; - e->key = key; - e->right_sided = is_right_sided; - } - }break; - - //- rjf: mouse button presses/releases - case ButtonPress: - case ButtonRelease: - { - // rjf: determine flags - OS_Modifiers modifiers = 0; - if(evt.xbutton.state & ShiftMask) { modifiers |= OS_Modifier_Shift; } - if(evt.xbutton.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; } - if(evt.xbutton.state & Mod1Mask) { modifiers |= OS_Modifier_Alt; } - - // rjf: map button -> OS_Key - OS_Key key = OS_Key_Null; - switch(evt.xbutton.button) - { - default:{}break; - case Button1:{key = OS_Key_LeftMouseButton;}break; - case Button2:{key = OS_Key_MiddleMouseButton;}break; - case Button3:{key = OS_Key_RightMouseButton;}break; - } - - // rjf: push event - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xbutton.window); - if(key != OS_Key_Null) - { - OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == ButtonPress ? OS_EventKind_Press : OS_EventKind_Release); - e->window.u64[0] = (U64)window; - e->modifiers = modifiers; - e->key = key; - e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y); - } - else if(evt.xbutton.button == Button4 || - evt.xbutton.button == Button5) - { - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Scroll); - e->window.u64[0] = (U64)window; - e->modifiers = modifiers; - e->delta = v2f32(0, evt.xbutton.button == Button4 ? -1.f : +1.f); - e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y); - } - }break; - - //- rjf: mouse motion - case MotionNotify: - { - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_MouseMove); - e->window.u64[0] = (U64)window; - e->pos.x = (F32)evt.xmotion.x; - e->pos.y = (F32)evt.xmotion.y; - set_mouse_cursor = 1; - }break; - - //- rjf: window focus/unfocus - case FocusIn: - { - }break; - case FocusOut: - { - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xfocus.window); - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowLoseFocus); - e->window.u64[0] = (U64)window; - }break; - - //- rjf: client messages - case ClientMessage: - { - if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_delete_window_atom) - { - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowClose); - e->window.u64[0] = (U64)window; - } - else if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_sync_request_atom) - { - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); - if(window != 0) - { - window->counter_value = 0; - window->counter_value |= evt.xclient.data.l[2]; - window->counter_value |= (evt.xclient.data.l[3] << 32); - XSyncValue value; - XSyncIntToValue(&value, window->counter_value); - XSyncSetCounter(os_lnx_gfx_state->display, window->counter_xid, value); - } - } - }break; - } - if(set_mouse_cursor) - { - Window root_window = 0; - Window child_window = 0; - int root_rel_x = 0; - int root_rel_y = 0; - int child_rel_x = 0; - int child_rel_y = 0; - unsigned int mask = 0; - if(XQueryPointer(os_lnx_gfx_state->display, XDefaultRootWindow(os_lnx_gfx_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) - { - XDefineCursor(os_lnx_gfx_state->display, root_window, os_lnx_gfx_state->cursors[os_lnx_gfx_state->last_set_cursor]); - XFlush(os_lnx_gfx_state->display); - } - } - } - return evts; -} - -internal OS_Modifiers -os_get_modifiers(void) -{ - // TODO(rjf) - return 0; -} - -internal B32 -os_key_is_down(OS_Key key) -{ - // TODO(rjf) - return 0; -} - -internal Vec2F32 -os_mouse_from_window(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) {return v2f32(0, 0);} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; - Vec2F32 result = {0}; - { - Window root_window = 0; - Window child_window = 0; - int root_rel_x = 0; - int root_rel_y = 0; - int child_rel_x = 0; - int child_rel_y = 0; - unsigned int mask = 0; - if(XQueryPointer(os_lnx_gfx_state->display, w->window, &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) - { - result.x = child_rel_x; - result.y = child_rel_y; - } - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) - -internal void -os_set_cursor(OS_Cursor cursor) -{ - os_lnx_gfx_state->last_set_cursor = cursor; -} - -//////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void -os_graphical_message(B32 error, String8 title, String8 message) -{ - if(error) - { - fprintf(stderr, "[X] "); - } - fprintf(stderr, "%.*s\n", str8_varg(title)); - fprintf(stderr, "%.*s\n\n", str8_varg(message)); -} - -internal String8 -os_graphical_pick_file(Arena *arena, String8 initial_path) -{ - return str8_zero(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shell Operations - -internal void -os_show_in_filesystem_ui(String8 path) -{ - // TODO(rjf) -} - -internal void -os_open_in_browser(String8 url) -{ - // TODO(rjf) -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Helpers + +internal OS_LNX_Window * +os_lnx_window_from_x11window(Window window) +{ + OS_LNX_Window *result = 0; + for(OS_LNX_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next) + { + if(w->window == window) + { + result = w; + break; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void +os_gfx_init(void) +{ + //- rjf: initialize basics + Arena *arena = arena_alloc(); + os_lnx_gfx_state = push_array(arena, OS_LNX_GfxState, 1); + os_lnx_gfx_state->arena = arena; + os_lnx_gfx_state->display = XOpenDisplay(0); + + //- rjf: calculate atoms + os_lnx_gfx_state->wm_delete_window_atom = XInternAtom(os_lnx_gfx_state->display, "WM_DELETE_WINDOW", 0); + os_lnx_gfx_state->wm_sync_request_atom = XInternAtom(os_lnx_gfx_state->display, "_NET_WM_SYNC_REQUEST", 0); + os_lnx_gfx_state->wm_sync_request_counter_atom = XInternAtom(os_lnx_gfx_state->display, "_NET_WM_SYNC_REQUEST_COUNTER", 0); + + //- rjf: open im + os_lnx_gfx_state->xim = XOpenIM(os_lnx_gfx_state->display, 0, 0, 0); + + //- rjf: fill out gfx info + os_lnx_gfx_state->gfx_info.double_click_time = 0.5f; + os_lnx_gfx_state->gfx_info.caret_blink_time = 0.5f; + os_lnx_gfx_state->gfx_info.default_refresh_rate = 60.f; + + //- rjf: fill out cursors + { + struct + { + OS_Cursor cursor; + unsigned int id; + } + map[] = + { + {OS_Cursor_Pointer, XC_left_ptr}, + {OS_Cursor_IBar, XC_xterm}, + {OS_Cursor_LeftRight, XC_sb_h_double_arrow}, + {OS_Cursor_UpDown, XC_sb_v_double_arrow}, + {OS_Cursor_DownRight, XC_bottom_right_corner}, + {OS_Cursor_UpRight, XC_top_right_corner}, + {OS_Cursor_UpDownLeftRight, XC_fleur}, + {OS_Cursor_HandPoint, XC_hand1}, + {OS_Cursor_Disabled, XC_X_cursor}, + }; + for EachElement(idx, map) + { + os_lnx_gfx_state->cursors[map[idx].cursor] = XCreateFontCursor(os_lnx_gfx_state->display, map[idx].id); + } + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) + +internal OS_GfxInfo * +os_get_gfx_info(void) +{ + return &os_lnx_gfx_state->gfx_info; +} + +//////////////////////////////// +//~ rjf: @os_hooks Clipboards (Implemented Per-OS) + +internal void +os_set_clipboard_text(String8 string) +{ + +} + +internal String8 +os_get_clipboard_text(Arena *arena) +{ + String8 result = {0}; + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Windows (Implemented Per-OS) + +internal OS_Window +os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) +{ + Vec2F32 resolution = dim_2f32(rect); + + //- rjf: allocate window + OS_LNX_Window *w = os_lnx_gfx_state->free_window; + if(w) + { + SLLStackPop(os_lnx_gfx_state->free_window); + } + else + { + w = push_array_no_zero(os_lnx_gfx_state->arena, OS_LNX_Window, 1); + } + MemoryZeroStruct(w); + DLLPushBack(os_lnx_gfx_state->first_window, os_lnx_gfx_state->last_window, w); + + //- rjf: create window & equip with x11 info + w->window = XCreateWindow(os_lnx_gfx_state->display, + XDefaultRootWindow(os_lnx_gfx_state->display), + 0, 0, resolution.x, resolution.y, + 0, + CopyFromParent, + InputOutput, + CopyFromParent, + 0, + 0); + XSelectInput(os_lnx_gfx_state->display, w->window, + ExposureMask| + PointerMotionMask| + ButtonPressMask| + ButtonReleaseMask| + KeyPressMask| + KeyReleaseMask| + FocusChangeMask); + Atom protocols[] = + { + os_lnx_gfx_state->wm_delete_window_atom, + os_lnx_gfx_state->wm_sync_request_atom, + }; + XSetWMProtocols(os_lnx_gfx_state->display, w->window, protocols, ArrayCount(protocols)); + { + XSyncValue initial_value; + XSyncIntToValue(&initial_value, 0); + w->counter_xid = XSyncCreateCounter(os_lnx_gfx_state->display, initial_value); + } + XChangeProperty(os_lnx_gfx_state->display, w->window, os_lnx_gfx_state->wm_sync_request_counter_atom, XA_CARDINAL, 32, PropModeReplace, (U8 *)&w->counter_xid, 1); + + //- rjf: create xic + w->xic = XCreateIC(os_lnx_gfx_state->xim, + XNInputStyle, XIMPreeditNothing|XIMStatusNothing, + XNClientWindow, w->window, + XNFocusWindow, w->window, + NULL); + + //- rjf: attach name + Temp scratch = scratch_begin(0, 0); + String8 title_copy = push_str8_copy(scratch.arena, title); + XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str); + scratch_end(scratch); + + //- rjf: convert to handle & return + OS_Window handle = {(U64)w}; + return handle; +} + +internal void +os_window_close(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return;} + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + XDestroyWindow(os_lnx_gfx_state->display, w->window); +} + +internal void +os_window_set_title(OS_Window handle, String8 title) +{ + if(os_window_match(handle, os_window_zero())) {return;} + Temp scratch = scratch_begin(0, 0); + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + String8 title_copy = push_str8_copy(scratch.arena, title); + XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str); + scratch_end(scratch); +} + +internal void +os_window_first_paint(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return;} + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + XMapWindow(os_lnx_gfx_state->display, w->window); +} + +internal void +os_window_focus(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return;} + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + XSetInputFocus(os_lnx_gfx_state->display, w->window, RevertToNone, CurrentTime); +} + +internal B32 +os_window_is_focused(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return 0;} + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + Window focused_window = 0; + int revert_to = 0; + XGetInputFocus(os_lnx_gfx_state->display, &focused_window, &revert_to); + B32 result = (w->window == focused_window); + return result; +} + +internal B32 +os_window_is_fullscreen(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return 0;} + // TODO(rjf) + return 0; +} + +internal void +os_window_set_fullscreen(OS_Window handle, B32 fullscreen) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal B32 +os_window_is_maximized(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return 0;} + // TODO(rjf) + return 0; +} + +internal void +os_window_set_maximized(OS_Window handle, B32 maximized) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal B32 +os_window_is_minimized(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return 0;} + // TODO(rjf) + return 0; +} + +internal void +os_window_set_minimized(OS_Window handle, B32 minimized) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal void +os_window_bring_to_front(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal void +os_window_set_monitor(OS_Window handle, OS_Monitor monitor) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal void +os_window_clear_custom_border_data(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal void +os_window_push_custom_title_bar(OS_Window handle, F32 thickness) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal void +os_window_push_custom_edges(OS_Window handle, F32 thickness) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal void +os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect) +{ + if(os_window_match(handle, os_window_zero())) {return;} + // TODO(rjf) +} + +internal Rng2F32 +os_rect_from_window(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return r2f32p(0, 0, 0, 0);} + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + XWindowAttributes atts = {0}; + Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts); + Rng2F32 result = r2f32p((F32)atts.x, (F32)atts.y, (F32)atts.x + (F32)atts.width, (F32)atts.y + (F32)atts.height); + return result; +} + +internal Rng2F32 +os_client_rect_from_window(OS_Window handle) +{ + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + XWindowAttributes atts = {0}; + Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts); + Rng2F32 result = r2f32p(0, 0, (F32)atts.width, (F32)atts.height); + return result; +} + +internal F32 +os_dpi_from_window(OS_Window handle) +{ + // TODO(rjf) + return 96.f; +} + +//////////////////////////////// +//~ rjf: @os_hooks External Windows (Implemented Per-OS) + +internal OS_ExternalWindow +os_focused_external_window(void) +{ + OS_ExternalWindow result = {0}; + // TODO(rjf) + return result; +} + +internal void +os_focus_external_window(OS_ExternalWindow handle) +{ + // TODO(rjf) +} + +//////////////////////////////// +//~ rjf: @os_hooks Monitors (Implemented Per-OS) + +internal OS_MonitorArray +os_push_monitors_array(Arena *arena) +{ + OS_MonitorArray result = {0}; + // TODO(rjf) + return result; +} + +internal OS_Monitor +os_primary_monitor(void) +{ + OS_Monitor result = {0}; + // TODO(rjf) + return result; +} + +internal OS_Monitor +os_monitor_from_window(OS_Window window) +{ + OS_Monitor result = {0}; + // TODO(rjf) + return result; +} + +internal String8 +os_name_from_monitor(Arena *arena, OS_Monitor monitor) +{ + // TODO(rjf) + return str8_zero(); +} + +internal Vec2F32 +os_dim_from_monitor(OS_Monitor monitor) +{ + // TODO(rjf) + return v2f32(0, 0); +} + +internal F32 +os_dpi_from_monitor(OS_Monitor monitor) +{ + // TODO(rjf) + return 96.f; +} + +//////////////////////////////// +//~ rjf: @os_hooks Events (Implemented Per-OS) + +internal void +os_send_wakeup_event(void) +{ + // TODO(rjf) +} + +internal OS_EventList +os_get_events(Arena *arena, B32 wait) +{ + OS_EventList evts = {0}; + for(;XPending(os_lnx_gfx_state->display) > 0 || (wait && evts.count == 0);) + { + XEvent evt = {0}; + XNextEvent(os_lnx_gfx_state->display, &evt); + B32 set_mouse_cursor = 0; + switch(evt.type) + { + default:{}break; + + //- rjf: key presses/releases + case KeyPress: + case KeyRelease: + { + // rjf: determine flags + OS_Modifiers modifiers = 0; + if(evt.xkey.state & ShiftMask) { modifiers |= OS_Modifier_Shift; } + if(evt.xkey.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; } + if(evt.xkey.state & Mod1Mask) { modifiers |= OS_Modifier_Alt; } + + // rjf: map keycode -> keysym & codepoint + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xkey.window); + KeySym keysym = 0; + U8 text[256] = {0}; + U64 text_size = Xutf8LookupString(window->xic, &evt.xkey, (char *)text, sizeof(text), &keysym, 0); + + // rjf: map keysym -> OS_Key + B32 is_right_sided = 0; + OS_Key key = OS_Key_Null; + switch(keysym) + { + default: + { + if(0){} + else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (OS_Key)(OS_Key_F1 + (keysym - XK_F1)); } + else if('0' <= keysym && keysym <= '9') { key = OS_Key_0 + (keysym-'0'); } + }break; + case XK_Escape:{key = OS_Key_Esc;};break; + case XK_BackSpace:{key = OS_Key_Backspace;}break; + case XK_Delete:{key = OS_Key_Delete;}break; + case XK_Return:{key = OS_Key_Return;}break; + case XK_Pause:{key = OS_Key_Pause;}break; + case XK_Tab:{key = OS_Key_Tab;}break; + case XK_Left:{key = OS_Key_Left;}break; + case XK_Right:{key = OS_Key_Right;}break; + case XK_Up:{key = OS_Key_Up;}break; + case XK_Down:{key = OS_Key_Down;}break; + case XK_Home:{key = OS_Key_Home;}break; + case XK_End:{key = OS_Key_End;}break; + case XK_Page_Up:{key = OS_Key_PageUp;}break; + case XK_Page_Down:{key = OS_Key_PageDown;}break; + case XK_Alt_L:{ key = OS_Key_Alt; }break; + case XK_Alt_R:{ key = OS_Key_Alt; is_right_sided = 1;}break; + case XK_Shift_L:{ key = OS_Key_Shift; }break; + case XK_Shift_R:{ key = OS_Key_Shift; is_right_sided = 1;}break; + case XK_Control_L:{ key = OS_Key_Ctrl; }break; + case XK_Control_R:{ key = OS_Key_Ctrl; is_right_sided = 1;}break; + case '-':{key = OS_Key_Minus;}break; + case '=':{key = OS_Key_Equal;}break; + case '[':{key = OS_Key_LeftBracket;}break; + case ']':{key = OS_Key_RightBracket;}break; + case ';':{key = OS_Key_Semicolon;}break; + case '\'':{key = OS_Key_Quote;}break; + case '.':{key = OS_Key_Period;}break; + case ',':{key = OS_Key_Comma;}break; + case '/':{key = OS_Key_Slash;}break; + case '\\':{key = OS_Key_BackSlash;}break; + case '\t':{key = OS_Key_Tab;}break; + case 'a':case 'A':{key = OS_Key_A;}break; + case 'b':case 'B':{key = OS_Key_B;}break; + case 'c':case 'C':{key = OS_Key_C;}break; + case 'd':case 'D':{key = OS_Key_D;}break; + case 'e':case 'E':{key = OS_Key_E;}break; + case 'f':case 'F':{key = OS_Key_F;}break; + case 'g':case 'G':{key = OS_Key_G;}break; + case 'h':case 'H':{key = OS_Key_H;}break; + case 'i':case 'I':{key = OS_Key_I;}break; + case 'j':case 'J':{key = OS_Key_J;}break; + case 'k':case 'K':{key = OS_Key_K;}break; + case 'l':case 'L':{key = OS_Key_L;}break; + case 'm':case 'M':{key = OS_Key_M;}break; + case 'n':case 'N':{key = OS_Key_N;}break; + case 'o':case 'O':{key = OS_Key_O;}break; + case 'p':case 'P':{key = OS_Key_P;}break; + case 'q':case 'Q':{key = OS_Key_Q;}break; + case 'r':case 'R':{key = OS_Key_R;}break; + case 's':case 'S':{key = OS_Key_S;}break; + case 't':case 'T':{key = OS_Key_T;}break; + case 'u':case 'U':{key = OS_Key_U;}break; + case 'v':case 'V':{key = OS_Key_V;}break; + case 'w':case 'W':{key = OS_Key_W;}break; + case 'x':case 'X':{key = OS_Key_X;}break; + case 'y':case 'Y':{key = OS_Key_Y;}break; + case 'z':case 'Z':{key = OS_Key_Z;}break; + case ' ':{key = OS_Key_Space;}break; + } + + // rjf: push text event + if(evt.type == KeyPress && text_size != 0) + { + for(U64 off = 0; off < text_size;) + { + UnicodeDecode decode = utf8_decode(text+off, text_size-off); + if(decode.codepoint != 0 && (decode.codepoint >= 32 || decode.codepoint == '\t')) + { + OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Text); + e->window.u64[0] = (U64)window; + e->character = decode.codepoint; + } + if(decode.inc == 0) + { + break; + } + off += decode.inc; + } + } + + // rjf: push key event + { + OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == KeyPress ? OS_EventKind_Press : OS_EventKind_Release); + e->window.u64[0] = (U64)window; + e->modifiers = modifiers; + e->key = key; + e->right_sided = is_right_sided; + } + }break; + + //- rjf: mouse button presses/releases + case ButtonPress: + case ButtonRelease: + { + // rjf: determine flags + OS_Modifiers modifiers = 0; + if(evt.xbutton.state & ShiftMask) { modifiers |= OS_Modifier_Shift; } + if(evt.xbutton.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; } + if(evt.xbutton.state & Mod1Mask) { modifiers |= OS_Modifier_Alt; } + + // rjf: map button -> OS_Key + OS_Key key = OS_Key_Null; + switch(evt.xbutton.button) + { + default:{}break; + case Button1:{key = OS_Key_LeftMouseButton;}break; + case Button2:{key = OS_Key_MiddleMouseButton;}break; + case Button3:{key = OS_Key_RightMouseButton;}break; + } + + // rjf: push event + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xbutton.window); + if(key != OS_Key_Null) + { + OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == ButtonPress ? OS_EventKind_Press : OS_EventKind_Release); + e->window.u64[0] = (U64)window; + e->modifiers = modifiers; + e->key = key; + e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y); + } + else if(evt.xbutton.button == Button4 || + evt.xbutton.button == Button5) + { + OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Scroll); + e->window.u64[0] = (U64)window; + e->modifiers = modifiers; + e->delta = v2f32(0, evt.xbutton.button == Button4 ? -1.f : +1.f); + e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y); + } + }break; + + //- rjf: mouse motion + case MotionNotify: + { + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_MouseMove); + e->window.u64[0] = (U64)window; + e->pos.x = (F32)evt.xmotion.x; + e->pos.y = (F32)evt.xmotion.y; + set_mouse_cursor = 1; + }break; + + //- rjf: window focus/unfocus + case FocusIn: + { + }break; + case FocusOut: + { + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xfocus.window); + OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowLoseFocus); + e->window.u64[0] = (U64)window; + }break; + + //- rjf: client messages + case ClientMessage: + { + if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_delete_window_atom) + { + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowClose); + e->window.u64[0] = (U64)window; + } + else if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_sync_request_atom) + { + OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + if(window != 0) + { + window->counter_value = 0; + window->counter_value |= evt.xclient.data.l[2]; + window->counter_value |= (evt.xclient.data.l[3] << 32); + XSyncValue value; + XSyncIntToValue(&value, window->counter_value); + XSyncSetCounter(os_lnx_gfx_state->display, window->counter_xid, value); + } + } + }break; + } + if(set_mouse_cursor) + { + Window root_window = 0; + Window child_window = 0; + int root_rel_x = 0; + int root_rel_y = 0; + int child_rel_x = 0; + int child_rel_y = 0; + unsigned int mask = 0; + if(XQueryPointer(os_lnx_gfx_state->display, XDefaultRootWindow(os_lnx_gfx_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) + { + XDefineCursor(os_lnx_gfx_state->display, root_window, os_lnx_gfx_state->cursors[os_lnx_gfx_state->last_set_cursor]); + XFlush(os_lnx_gfx_state->display); + } + } + } + return evts; +} + +internal OS_Modifiers +os_get_modifiers(void) +{ + // TODO(rjf) + return 0; +} + +internal B32 +os_key_is_down(OS_Key key) +{ + // TODO(rjf) + return 0; +} + +internal Vec2F32 +os_mouse_from_window(OS_Window handle) +{ + if(os_window_match(handle, os_window_zero())) {return v2f32(0, 0);} + OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + Vec2F32 result = {0}; + { + Window root_window = 0; + Window child_window = 0; + int root_rel_x = 0; + int root_rel_y = 0; + int child_rel_x = 0; + int child_rel_y = 0; + unsigned int mask = 0; + if(XQueryPointer(os_lnx_gfx_state->display, w->window, &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) + { + result.x = child_rel_x; + result.y = child_rel_y; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Cursors (Implemented Per-OS) + +internal void +os_set_cursor(OS_Cursor cursor) +{ + os_lnx_gfx_state->last_set_cursor = cursor; +} + +//////////////////////////////// +//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) + +internal void +os_graphical_message(B32 error, String8 title, String8 message) +{ + if(error) + { + fprintf(stderr, "[X] "); + } + fprintf(stderr, "%.*s\n", str8_varg(title)); + fprintf(stderr, "%.*s\n\n", str8_varg(message)); +} + +internal String8 +os_graphical_pick_file(Arena *arena, String8 initial_path) +{ + return str8_zero(); +} + +//////////////////////////////// +//~ rjf: @os_hooks Shell Operations + +internal void +os_show_in_filesystem_ui(String8 path) +{ + // TODO(rjf) +} + +internal void +os_open_in_browser(String8 url) +{ + // TODO(rjf) +} diff --git a/src/os/gfx/linux/os_gfx_linux.h b/src/linux/window_manager/linux_window_manager.h similarity index 95% rename from src/os/gfx/linux/os_gfx_linux.h rename to src/linux/window_manager/linux_window_manager.h index 58e51f27..0034adde 100644 --- a/src/os/gfx/linux/os_gfx_linux.h +++ b/src/linux/window_manager/linux_window_manager.h @@ -1,61 +1,61 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_GFX_LINUX_H -#define OS_GFX_LINUX_H - -//////////////////////////////// -//~ rjf: Includes - -#include -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ rjf: Window State - -typedef struct OS_LNX_Window OS_LNX_Window; -struct OS_LNX_Window -{ - OS_LNX_Window *next; - OS_LNX_Window *prev; - Window window; - XIC xic; - XID counter_xid; - U64 counter_value; -}; - -//////////////////////////////// -//~ rjf: State Bundle - -typedef struct OS_LNX_GfxState OS_LNX_GfxState; -struct OS_LNX_GfxState -{ - Arena *arena; - Display *display; - XIM xim; - OS_LNX_Window *first_window; - OS_LNX_Window *last_window; - OS_LNX_Window *free_window; - Atom wm_delete_window_atom; - Atom wm_sync_request_atom; - Atom wm_sync_request_counter_atom; - Cursor cursors[OS_Cursor_COUNT]; - OS_Cursor last_set_cursor; - OS_GfxInfo gfx_info; -}; - -//////////////////////////////// -//~ rjf: Globals - -global OS_LNX_GfxState *os_lnx_gfx_state = 0; - -//////////////////////////////// -//~ rjf: Helpers - -internal OS_LNX_Window *os_lnx_window_from_x11window(Window window); - -#endif // OS_GFX_LINUX_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_GFX_LINUX_H +#define OS_GFX_LINUX_H + +//////////////////////////////// +//~ rjf: Includes + +#include +#include +#include +#include +#include +#include + +//////////////////////////////// +//~ rjf: Window State + +typedef struct OS_LNX_Window OS_LNX_Window; +struct OS_LNX_Window +{ + OS_LNX_Window *next; + OS_LNX_Window *prev; + Window window; + XIC xic; + XID counter_xid; + U64 counter_value; +}; + +//////////////////////////////// +//~ rjf: State Bundle + +typedef struct OS_LNX_GfxState OS_LNX_GfxState; +struct OS_LNX_GfxState +{ + Arena *arena; + Display *display; + XIM xim; + OS_LNX_Window *first_window; + OS_LNX_Window *last_window; + OS_LNX_Window *free_window; + Atom wm_delete_window_atom; + Atom wm_sync_request_atom; + Atom wm_sync_request_counter_atom; + Cursor cursors[OS_Cursor_COUNT]; + OS_Cursor last_set_cursor; + OS_GfxInfo gfx_info; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_LNX_GfxState *os_lnx_gfx_state = 0; + +//////////////////////////////// +//~ rjf: Helpers + +internal OS_LNX_Window *os_lnx_window_from_x11window(Window window); + +#endif // OS_GFX_LINUX_H diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c deleted file mode 100644 index 0e95df77..00000000 --- a/src/os/core/linux/os_core_linux.c +++ /dev/null @@ -1,1570 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Helpers - -internal DateTime -os_lnx_date_time_from_tm(tm in, U32 msec) -{ - DateTime dt = {0}; - dt.sec = in.tm_sec; - dt.min = in.tm_min; - dt.hour = in.tm_hour; - dt.day = in.tm_mday-1; - dt.mon = in.tm_mon; - dt.year = in.tm_year+1900; - dt.msec = msec; - return dt; -} - -internal tm -os_lnx_tm_from_date_time(DateTime dt) -{ - tm result = {0}; - result.tm_sec = dt.sec; - result.tm_min = dt.min; - result.tm_hour= dt.hour; - result.tm_mday= dt.day+1; - result.tm_mon = dt.mon; - result.tm_year= dt.year-1900; - return result; -} - -internal timespec -os_lnx_timespec_from_date_time(DateTime dt) -{ - tm tm_val = os_lnx_tm_from_date_time(dt); - time_t seconds = timegm(&tm_val); - timespec result = {0}; - result.tv_sec = seconds; - return result; -} - -internal DenseTime -os_lnx_dense_time_from_timespec(timespec in) -{ - DenseTime result = 0; - { - struct tm tm_time = {0}; - gmtime_r(&in.tv_sec, &tm_time); - DateTime date_time = os_lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1)); - result = dense_time_from_date_time(date_time); - } - return result; -} - -internal FileProperties -os_lnx_file_properties_from_stat(struct stat *s) -{ - FileProperties props = {0}; - props.size = s->st_size; - props.created = os_lnx_dense_time_from_timespec(s->st_ctim); - props.modified = os_lnx_dense_time_from_timespec(s->st_mtim); - if(s->st_mode & S_IFDIR) - { - props.flags |= FilePropertyFlag_IsFolder; - } - return props; -} - -internal void -os_lnx_safe_call_sig_handler(int x) -{ - OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain; - if(chain != 0 && chain->fail_handler != 0) - { - chain->fail_handler(chain->ptr); - } - abort(); -} - -//////////////////////////////// -//~ rjf: Entities - -internal OS_LNX_Entity * -os_lnx_entity_alloc(OS_LNX_EntityKind kind) -{ - OS_LNX_Entity *entity = 0; - DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), - pthread_mutex_unlock(&os_lnx_state.entity_mutex)) - { - entity = os_lnx_state.entity_free; - if(entity) - { - SLLStackPop(os_lnx_state.entity_free); - } - else - { - entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1); - } - } - MemoryZeroStruct(entity); - entity->kind = kind; - return entity; -} - -internal void -os_lnx_entity_release(OS_LNX_Entity *entity) -{ - DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), - pthread_mutex_unlock(&os_lnx_state.entity_mutex)) - { - SLLStackPush(os_lnx_state.entity_free, entity); - } -} - -//////////////////////////////// -//~ rjf: Thread Entry Point - -internal void * -os_lnx_thread_entry_point(void *ptr) -{ - OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr; - ThreadEntryPointFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - supplement_thread_base_entry_point(func, thread_ptr); - return 0; -} - -//////////////////////////////// -//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) - -internal OS_SystemInfo * -os_get_system_info(void) -{ - return &os_lnx_state.system_info; -} - -internal OS_ProcessInfo * -os_get_process_info(void) -{ - return &os_lnx_state.process_info; -} - -internal String8 -os_get_current_path(Arena *arena) -{ - char *cwdir = getcwd(0, 0); - String8 string = push_str8_copy(arena, str8_cstring(cwdir)); - free(cwdir); - return string; -} - -internal U32 -os_get_process_start_time_unix(void) -{ - Temp scratch = scratch_begin(0,0); - U64 start_time = 0; - pid_t pid = getpid(); - String8 path = push_str8f(scratch.arena, "/proc/%u", pid); - struct stat st; - int err = stat((char *)path.str, &st); - if(err == 0) - { - start_time = st.st_mtime; - } - scratch_end(scratch); - return (U32)start_time; -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -//- rjf: basic - -internal void * -os_reserve(U64 size) -{ - void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - if(result == MAP_FAILED) - { - result = 0; - } - return result; -} - -internal B32 -os_commit(void *ptr, U64 size) -{ - mprotect(ptr, size, PROT_READ|PROT_WRITE); - return 1; -} - -internal void -os_decommit(void *ptr, U64 size) -{ - madvise(ptr, size, MADV_DONTNEED); - mprotect(ptr, size, PROT_NONE); -} - -internal void -os_release(void *ptr, U64 size) -{ - munmap(ptr, size); -} - -//- rjf: large pages - -internal void * -os_reserve_large(U64 size) -{ - void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0); - if(result == MAP_FAILED) - { - result = 0; - } - return result; -} - -internal B32 -os_commit_large(void *ptr, U64 size) -{ - mprotect(ptr, size, PROT_READ|PROT_WRITE); - return 1; -} - -//////////////////////////////// -//~ rjf: @os_hooks Thread Info (Implemented Per-OS) - -internal U32 -os_tid(void) -{ - U32 result = gettid(); - return result; -} - -internal void -os_set_thread_name(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String8 name_copy = push_str8_copy(scratch.arena, name); - pthread_t current_thread = pthread_self(); - pthread_setname_np(current_thread, (char *)name_copy.str); - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: @os_hooks Aborting (Implemented Per-OS) - -internal void -os_abort(S32 exit_code) -{ - exit(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); - int lnx_flags = 0; - if(flags & OS_AccessFlag_Read && flags & OS_AccessFlag_Write) - { - lnx_flags = O_RDWR; - } - else if(flags & OS_AccessFlag_Write) - { - lnx_flags = O_WRONLY; - } - else if(flags & OS_AccessFlag_Read) - { - lnx_flags = O_RDONLY; - } - if(flags & OS_AccessFlag_Append) - { - lnx_flags |= O_APPEND; - } - if(flags & (OS_AccessFlag_Write|OS_AccessFlag_Append)) - { - lnx_flags |= O_CREAT; - } - lnx_flags |= O_CLOEXEC; - int fd = open((char *)path_copy.str, lnx_flags, 0755); - OS_Handle handle = {0}; - if(fd != -1) - { - handle.u64[0] = fd; - } - scratch_end(scratch); - return handle; -} - -internal void -os_file_close(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return; } - int fd = (int)file.u64[0]; - close(fd); -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - int fd = (int)file.u64[0]; - U64 total_num_bytes_to_read = dim_1u64(rng); - U64 total_num_bytes_read = 0; - U64 total_num_bytes_left_to_read = total_num_bytes_to_read; - for(;total_num_bytes_left_to_read > 0;) - { - int read_result = pread(fd, (U8 *)out_data + total_num_bytes_read, total_num_bytes_left_to_read, rng.min + total_num_bytes_read); - if(read_result >= 0) - { - total_num_bytes_read += read_result; - total_num_bytes_left_to_read -= read_result; - } - else if(errno != EINTR) - { - break; - } - } - return total_num_bytes_read; -} - -internal U64 -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - int fd = (int)file.u64[0]; - U64 total_num_bytes_to_write = dim_1u64(rng); - U64 total_num_bytes_written = 0; - U64 total_num_bytes_left_to_write = total_num_bytes_to_write; - for(;total_num_bytes_left_to_write > 0;) - { - int write_result = pwrite(fd, (U8 *)data + total_num_bytes_written, total_num_bytes_left_to_write, rng.min + total_num_bytes_written); - if(write_result >= 0) - { - total_num_bytes_written += write_result; - total_num_bytes_left_to_write -= write_result; - } - else if(errno != EINTR) - { - break; - } - } - return total_num_bytes_written; -} - -internal B32 -os_file_set_times(OS_Handle file, DateTime date_time) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - int fd = (int)file.u64[0]; - timespec time = os_lnx_timespec_from_date_time(date_time); - timespec times[2] = {time, time}; - int futimens_result = futimens(fd, times); - B32 good = (futimens_result != -1); - return good; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return (FileProperties){0}; } - int fd = (int)file.u64[0]; - struct stat fd_stat = {0}; - int fstat_result = fstat(fd, &fd_stat); - FileProperties props = {0}; - if(fstat_result != -1) - { - props = os_lnx_file_properties_from_stat(&fd_stat); - } - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return (OS_FileID){0}; } - int fd = (int)file.u64[0]; - struct stat fd_stat = {0}; - int fstat_result = fstat(fd, &fd_stat); - OS_FileID id = {0}; - if(fstat_result != -1) - { - id.v[0] = fd_stat.st_dev; - id.v[1] = fd_stat.st_ino; - } - return id; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = 0; - String8 path_copy = push_str8_copy(scratch.arena, path); - if(remove((char *)path_copy.str) != -1) - { - result = 1; - } - scratch_end(scratch); - return result; -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - B32 result = 0; - OS_Handle src_h = os_file_open(OS_AccessFlag_Read, src); - OS_Handle dst_h = os_file_open(OS_AccessFlag_Write, dst); - if(!os_handle_match(src_h, os_handle_zero()) && - !os_handle_match(dst_h, os_handle_zero())) - { - int src_fd = (int)src_h.u64[0]; - int dst_fd = (int)dst_h.u64[0]; - FileProperties src_props = os_properties_from_file(src_h); - U64 size = src_props.size; - U64 total_bytes_copied = 0; - U64 bytes_left_to_copy = size; - for(;bytes_left_to_copy > 0;) - { - off_t sendfile_off = total_bytes_copied; - int send_result = sendfile(dst_fd, src_fd, &sendfile_off, bytes_left_to_copy); - if(send_result <= 0) - { - break; - } - U64 bytes_copied = (U64)send_result; - bytes_left_to_copy -= bytes_copied; - total_bytes_copied += bytes_copied; - } - } - os_file_close(src_h); - os_file_close(dst_h); - return result; -} - -internal B32 -os_move_file_path(String8 dst, String8 src) -{ - B32 good = 0; - Temp scratch = scratch_begin(0, 0); - { - char *src_cstr = (char *)str8_copy(scratch.arena, src).str; - char *dst_cstr = (char *)str8_copy(scratch.arena, dst).str; - int rename_result = rename(src_cstr, dst_cstr); - good = (rename_result != -1); - } - scratch_end(scratch); - return good; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 path_copy = str8_copy(scratch.arena, path); - char buffer[PATH_MAX] = {0}; - realpath((char *)path_copy.str, buffer); - String8 result = str8_copy(arena, str8_cstring(buffer)); - scratch_end(scratch); - return result; -} - -internal B32 -os_file_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); - int access_result = access((char *)path_copy.str, F_OK); - B32 result = 0; - if(access_result == 0) - { - result = 1; - } - scratch_end(scratch); - return result; -} - -internal B32 -os_folder_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 exists = 0; - String8 path_copy = str8_copy(scratch.arena, path); - DIR *handle = opendir((char *)path_copy.str); - if(handle) - { - closedir(handle); - exists = 1; - } - scratch_end(scratch); - return exists; -} - -internal FileProperties -os_properties_from_file_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = str8_copy(scratch.arena, path); - struct stat f_stat = {0}; - int stat_result = stat((char *)path_copy.str, &f_stat); - FileProperties props = {0}; - if(stat_result != -1) - { - props = os_lnx_file_properties_from_stat(&f_stat); - } - scratch_end(scratch); - return props; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - OS_Handle map = file; - return map; -} - -internal void -os_file_map_close(OS_Handle map) -{ - // NOTE(rjf): nothing to do; `map` handles are the same as `file` handles in - // the linux implementation (on Windows they require separate handles) -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - if(os_handle_match(map, os_handle_zero())) { return 0; } - int fd = (int)map.u64[0]; - int prot_flags = 0; - if(flags & OS_AccessFlag_Write) { prot_flags |= PROT_WRITE; } - if(flags & OS_AccessFlag_Read) { prot_flags |= PROT_READ; } - int map_flags = MAP_PRIVATE; - void *base = mmap(0, dim_1u64(range), prot_flags, map_flags, fd, range.min); - if(base == MAP_FAILED) - { - base = 0; - } - return base; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) -{ - munmap(ptr, dim_1u64(range)); -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - OS_FileIter *base_iter = push_array(arena, OS_FileIter, 1); - base_iter->flags = flags; - OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory; - { - String8 path_copy = push_str8_copy(arena, path); - iter->dir = opendir((char *)path_copy.str); - iter->path = path_copy; - } - return base_iter; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - B32 good = 0; - OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; - for(;lnx_iter->dir != 0;) - { - // rjf: get next entry - lnx_iter->dp = readdir(lnx_iter->dir); - good = (lnx_iter->dp != 0); - - // rjf: unpack entry info - struct stat st = {0}; - int stat_result = 0; - if(good) - { - Temp scratch = scratch_begin(&arena, 1); - String8 full_path = push_str8f(scratch.arena, "%S/%s", lnx_iter->path, lnx_iter->dp->d_name); - stat_result = stat((char *)full_path.str, &st); - scratch_end(scratch); - } - - // rjf: determine if filtered - B32 filtered = 0; - if(good) - { - filtered = ((st.st_mode == S_IFDIR && iter->flags & OS_FileIterFlag_SkipFolders) || - (st.st_mode == S_IFREG && iter->flags & OS_FileIterFlag_SkipFiles) || - (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == 0) || - (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == '.' && lnx_iter->dp->d_name[2] == 0)); - } - - // rjf: output & exit, if good & unfiltered - if(good && !filtered) - { - info_out->name = push_str8_copy(arena, str8_cstring(lnx_iter->dp->d_name)); - if(stat_result != -1) - { - info_out->props = os_lnx_file_properties_from_stat(&st); - } - break; - } - - // rjf: exit if not good - if(!good) - { - break; - } - } - return good; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; - closedir(lnx_iter->dir); -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = 0; - String8 path_copy = push_str8_copy(scratch.arena, path); - if(mkdir((char *)path_copy.str, 0755) != -1) - { - result = 1; - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR|O_CREAT, 0666); - ftruncate(id, size); - OS_Handle result = {(U64)id}; - scratch_end(scratch); - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR, 0); - OS_Handle result = {(U64)id}; - scratch_end(scratch); - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())){return;} - int id = (int)handle.u64[0]; - close(id); -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - if(os_handle_match(handle, os_handle_zero())){return 0;} - int id = (int)handle.u64[0]; - void *base = mmap(0, dim_1u64(range), PROT_READ|PROT_WRITE, MAP_SHARED, id, range.min); - if(base == MAP_FAILED) - { - base = 0; - } - return base; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) -{ - if(os_handle_match(handle, os_handle_zero())){return;} - munmap(ptr, dim_1u64(range)); -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal U64 -os_now_microseconds(void) -{ - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); - return result; -} - -internal U32 -os_now_unix(void) -{ - time_t t = time(0); - return (U32)t; -} - -internal DateTime -os_now_universal_time(void) -{ - time_t t = 0; - time(&t); - struct tm universal_tm = {0}; - gmtime_r(&t, &universal_tm); - DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); - return result; -} - -internal DateTime -os_universal_time_from_local(DateTime *date_time) -{ - // rjf: local DateTime -> universal time_t - tm local_tm = os_lnx_tm_from_date_time(*date_time); - local_tm.tm_isdst = -1; - time_t universal_t = mktime(&local_tm); - - // rjf: universal time_t -> DateTime - tm universal_tm = {0}; - gmtime_r(&universal_t, &universal_tm); - DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); - return result; -} - -internal DateTime -os_local_time_from_universal(DateTime *date_time) -{ - // rjf: universal DateTime -> local time_t - tm universal_tm = os_lnx_tm_from_date_time(*date_time); - universal_tm.tm_isdst = -1; - time_t universal_t = timegm(&universal_tm); - tm local_tm = {0}; - localtime_r(&universal_t, &local_tm); - - // rjf: local tm -> DateTime - DateTime result = os_lnx_date_time_from_tm(local_tm, 0); - return result; -} - -internal void -os_sleep_milliseconds(U32 msec) -{ - usleep(msec*Thousand(1)); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal OS_Handle -os_process_launch(OS_ProcessLaunchParams *params) -{ - OS_Handle handle = {0}; - posix_spawn_file_actions_t file_actions = {0}; - int file_actions_init_code = posix_spawn_file_actions_init(&file_actions); - if(file_actions_init_code == 0) - { - int stdout_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdout_file.u64[0], STDOUT_FILENO); - int stderr_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stderr_file.u64[0], STDERR_FILENO); - int stdin_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdin_file.u64[0], STDIN_FILENO); - posix_spawnattr_t attr = {0}; - int attr_init_code = posix_spawnattr_init(&attr); - if(attr_init_code == 0) - { - Temp scratch = scratch_begin(0, 0); - - // package argv - char **argv = push_array(scratch.arena, char *, params->cmd_line.node_count + 1); - { - String8List l = str8_split_path(scratch.arena, params->path); - str8_list_push(scratch.arena, &l, params->cmd_line.first->string); - String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); - argv[0] = (char *)path_to_exe.str; - U64 arg_idx = 1; - for EachNode(n, String8Node, params->cmd_line.first->next) - { - argv[arg_idx] = (char *)n->string.str; - arg_idx += 1; - } - } - - // package envp - char **envp = 0; - if(params->inherit_env) - { - envp = os_lnx_state.default_env; - } - else - { - envp = push_array(scratch.arena, char *, params->env.node_count + 2); - U64 env_idx = 0; - for EachNode(n, String8Node, params->cmd_line.first) - { - envp[env_idx] = (char *)n->string.str; - env_idx += 1; - } - } - - // spawn process - pid_t pid = 0; - int spawn_code = posix_spawn(&pid, argv[0], &file_actions, &attr, argv, envp); - if(spawn_code == 0) - { - handle.u64[0] = (U64)pid; - } - - // clean up attributes - int attr_destroy_code = posix_spawnattr_destroy(&attr); - scratch_end(scratch); - } - - // clean up file actions - int file_actions_destroy_code = posix_spawn_file_actions_destroy(&file_actions); - } - return handle; -} - -internal B32 -os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) -{ - pid_t pid = (pid_t)handle.u64[0]; - B32 result = 0; - if(endt_us == 0) - { - if(kill(pid, 0) >= 0) - { - result = (errno == ENOENT); - if(result) - { - int status; - waitpid(pid, &status, 0); - } - } - } - else if(endt_us == max_U64) - { - for(;;) - { - int status = 0; - int w = waitpid(pid, &status, 0); - if(w == -1) - { - break; - } - if(WIFEXITED(status) || WIFSTOPPED(status) || WIFSIGNALED(status)) - { - result = 1; - break; - } - } - } - else - { - NotImplemented; - } - return result; -} - -internal void -os_process_detach(OS_Handle handle) -{ - // no need to close pid -} - -internal B32 -os_process_kill(OS_Handle handle) -{ - int error_code = kill((pid_t)handle.u64[0], SIGKILL); - B32 is_killed = error_code == 0; - return is_killed; -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal Thread -os_thread_launch(ThreadEntryPointFunctionType *func, void *ptr) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread); - entity->thread.func = func; - entity->thread.ptr = ptr; - { - int pthread_result = pthread_create(&entity->thread.handle, 0, os_lnx_thread_entry_point, entity); - if(pthread_result == -1) - { - os_lnx_entity_release(entity); - entity = 0; - } - } - Thread handle = {(U64)entity}; - return handle; -} - -internal B32 -os_thread_join(Thread handle, U64 endt_us) -{ - if(MemoryIsZeroStruct(&handle)) { return 0; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0]; - int join_result = pthread_join(entity->thread.handle, 0); - B32 result = (join_result == 0); - os_lnx_entity_release(entity); - return result; -} - -internal void -os_thread_detach(Thread handle) -{ - if(MemoryIsZeroStruct(&handle)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0]; - os_lnx_entity_release(entity); -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -//- rjf: mutexes - -internal Mutex -os_mutex_alloc(void) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex); - int init_result = pthread_mutex_init(&entity->mutex_handle, 0); - if(init_result == -1) - { - os_lnx_entity_release(entity); - entity = 0; - } - Mutex handle = {(U64)entity}; - return handle; -} - -internal void -os_mutex_release(Mutex mutex) -{ - if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; - pthread_mutex_destroy(&entity->mutex_handle); - os_lnx_entity_release(entity); -} - -internal void -os_mutex_take(Mutex mutex) -{ - if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; - pthread_mutex_lock(&entity->mutex_handle); -} - -internal void -os_mutex_drop(Mutex mutex) -{ - if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; - pthread_mutex_unlock(&entity->mutex_handle); -} - -//- rjf: reader/writer mutexes - -internal RWMutex -os_rw_mutex_alloc(void) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex); - int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0); - if(init_result == -1) - { - os_lnx_entity_release(entity); - entity = 0; - } - RWMutex handle = {(U64)entity}; - return handle; -} - -internal void -os_rw_mutex_release(RWMutex rw_mutex) -{ - if(MemoryIsZeroStruct(&rw_mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; - pthread_rwlock_destroy(&entity->rwmutex_handle); - os_lnx_entity_release(entity); -} - -internal void -os_rw_mutex_take(RWMutex rw_mutex, B32 write_mode) -{ - if(MemoryIsZeroStruct(&rw_mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; - if(write_mode) - { - pthread_rwlock_wrlock(&entity->rwmutex_handle); - } - else - { - pthread_rwlock_rdlock(&entity->rwmutex_handle); - } -} - -internal void -os_rw_mutex_drop(RWMutex rw_mutex, B32 write_mode) -{ - if(MemoryIsZeroStruct(&rw_mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; - pthread_rwlock_unlock(&entity->rwmutex_handle); -} - -//- rjf: condition variables - -internal CondVar -os_cond_var_alloc(void) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable); - int init_result = pthread_cond_init(&entity->cv.cond_handle, 0); - if(init_result == -1) - { - os_lnx_entity_release(entity); - entity = 0; - } - int init2_result = 0; - if(entity) - { - init2_result = pthread_mutex_init(&entity->cv.rwlock_mutex_handle, 0); - } - if(init2_result == -1) - { - pthread_cond_destroy(&entity->cv.cond_handle); - os_lnx_entity_release(entity); - entity = 0; - } - CondVar handle = {(U64)entity}; - return handle; -} - -internal void -os_cond_var_release(CondVar cv) -{ - if(MemoryIsZeroStruct(&cv)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0]; - pthread_cond_destroy(&entity->cv.cond_handle); - pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle); - os_lnx_entity_release(entity); -} - -internal B32 -os_cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us) -{ - if(MemoryIsZeroStruct(&cv)) { return 0; } - if(MemoryIsZeroStruct(&mutex)) { return 0; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0]; - struct timespec endt_timespec; - endt_timespec.tv_sec = endt_us/Million(1); - endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); - int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &mutex_entity->mutex_handle, &endt_timespec); - B32 result = (wait_result != ETIMEDOUT); - return result; -} - -internal B32 -os_cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) -{ - // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack - // this together, but this would probably just be a lot better if we just - // implemented the primitives ourselves with e.g. futexes - // - if(MemoryIsZeroStruct(&cv)) { return 0; } - if(MemoryIsZeroStruct(&mutex_rw)) { return 0; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; - struct timespec endt_timespec; - endt_timespec.tv_sec = endt_us/Million(1); - endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); - B32 result = 0; - pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle); - pthread_rwlock_unlock(&rw_mutex_entity->rwmutex_handle); - for(;;) - { - int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec); - if(wait_result != ETIMEDOUT) - { - if(write_mode) - { - pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle); - } - else - { - pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle); - } - result = 1; - break; - } - if(wait_result == ETIMEDOUT) - { - if(write_mode) - { - pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle); - } - else - { - pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle); - } - break; - } - } - pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); - return result; -} - -internal void -os_cond_var_signal(CondVar cv) -{ - if(MemoryIsZeroStruct(&cv)) { return; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - pthread_cond_signal(&cv_entity->cv.cond_handle); -} - -internal void -os_cond_var_broadcast(CondVar cv) -{ - if(MemoryIsZeroStruct(&cv)) { return; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - pthread_cond_broadcast(&cv_entity->cv.cond_handle); -} - -//- rjf: cross-process semaphores - -internal Semaphore -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - Semaphore result = {0}; - if(name.size > 0) - { - for EachIndex(attempt_idx, 64) - { - String8 name_copy = str8_copy(scratch.arena, name); - sem_t *s = sem_open((char *)name_copy.str, O_CREAT | O_EXCL, 0666, initial_count); - if(s == SEM_FAILED) - { - s = sem_open((char *)name_copy.str, 0); - } - if(s != SEM_FAILED) - { - result.u64[0] = (U64)s; - break; - } - } - } - else - { - sem_t *s = mmap(0, sizeof(*s), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - AssertAlways(s != MAP_FAILED); - int err = sem_init(s, 0, initial_count); - if(err == 0) - { - result.u64[0] = (U64)s; - } - } - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_release(Semaphore semaphore) -{ - int err = munmap((void*)semaphore.u64[0], sizeof(sem_t)); - AssertAlways(err == 0); -} - -internal Semaphore -os_semaphore_open(String8 name) -{ - Semaphore result = {0}; - { - Temp scratch = scratch_begin(0, 0); - String8 name_copy = str8_copy(scratch.arena, name); - sem_t *s = sem_open((char *)name_copy.str, 0); - if(s != SEM_FAILED) - { - result.u64[0] = (U64)s; - } - scratch_end(scratch); - } - return result; -} - -internal void -os_semaphore_close(Semaphore semaphore) -{ - sem_t *s = (sem_t *)semaphore.u64[0]; - sem_close(s); -} - -internal B32 -os_semaphore_take(Semaphore semaphore, U64 endt_us) -{ - // TODO(rjf): we need to use `sem_timedwait` here. - AssertAlways(endt_us == max_U64); - for(;;) - { - int err = sem_wait((sem_t*)semaphore.u64[0]); - if(err == 0) - { - break; - } - else if(errno == EAGAIN) - { - continue; - } - break; - } - return 1; -} - -internal void -os_semaphore_drop(Semaphore semaphore) -{ - for(;;) - { - int err = sem_post((sem_t*)semaphore.u64[0]); - if(err == 0) - { - break; - } - else - { - if(errno == EAGAIN) - { - continue; - } - } - break; - } -} - -//- rjf: barriers - -internal Barrier -os_barrier_alloc(U64 count) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Barrier); - if(entity != 0) - { - pthread_barrier_init(&entity->barrier, 0, count); - } - Barrier result = {IntFromPtr(entity)}; - return result; -} - -internal void -os_barrier_release(Barrier barrier) -{ - OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]); - if(entity != 0) - { - pthread_barrier_destroy(&entity->barrier); - os_lnx_entity_release(entity); - } -} - -internal void -os_barrier_wait(Barrier barrier) -{ - OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]); - if(entity != 0) - { - pthread_barrier_wait(&entity->barrier); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - char *path_cstr = (char *)str8_copy(scratch.arena, path).str; - void *so = dlopen(path_cstr, RTLD_LAZY|RTLD_LOCAL); - OS_Handle lib = { (U64)so }; - scratch_end(scratch); - return lib; -} - -internal VoidProc* -os_library_load_proc(OS_Handle lib, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - void *so = (void *)lib.u64; - char *name_cstr = (char *)str8_copy(scratch.arena, name).str; - VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); - scratch_end(scratch); - return proc; -} - -internal void -os_library_close(OS_Handle lib) -{ - void *so = (void *)lib.u64; - dlclose(so); -} - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void -os_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr) -{ - // rjf: push handler to chain - OS_LNX_SafeCallChain chain = {0}; - SLLStackPush(os_lnx_safe_call_chain, &chain); - chain.fail_handler = fail_handler; - chain.ptr = ptr; - - // rjf: set up sig handler info - struct sigaction new_act = {0}; - new_act.sa_handler = os_lnx_safe_call_sig_handler; - int signals_to_handle[] = - { - SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, - }; - struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; - - // rjf: attach handler info for all signals - for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) - { - sigaction(signals_to_handle[i], &new_act, &og_act[i]); - } - - // rjf: call function - func(ptr); - - // rjf: reset handler info for all signals - for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) - { - sigaction(signals_to_handle[i], &og_act[i], 0); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal Guid -os_make_guid(void) -{ - Guid guid = {0}; - getrandom(guid.v, sizeof(guid.v), 0); - guid.data3 &= 0x0fff; - guid.data3 |= (4 << 12); - guid.data4[0] &= 0x3f; - guid.data4[0] |= 0x80; - return guid; -} - -//////////////////////////////// -//~ rjf: @os_hooks Entry Points (Implemented Per-OS) - -internal void -lnx_signal_handler(int sig, siginfo_t *info, void *arg) -{ - local_persist volatile U32 first = 0; - if (ins_atomic_u32_eval_cond_assign(&first, 1, 0) != 0) - { - for(;;) - { - sleep(UINT32_MAX); - } - } - - local_persist void *ips[4096]; - int ips_count = backtrace(ips, ArrayCount(ips)); - - fprintf(stderr, "A fatal signal was received: %s (%d). The process is terminating.\n", strsignal(sig), sig); - fprintf(stderr, "Create a new issue with this report at %s.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); - fprintf(stderr, "Callstack:\n"); - for EachIndex(i, ips_count) - { - Dl_info info = {0}; - dladdr(ips[i], &info); - - char cmd[2048]; - snprintf(cmd, sizeof(cmd), "llvm-symbolizer --relative-address -f -e %s %lu", info.dli_fname, (unsigned long)ips[i] - (unsigned long)info.dli_fbase); - FILE *f = popen(cmd, "r"); - if(f) - { - char func_name[256], file_name[256]; - if(fgets(func_name, sizeof(func_name), f) && fgets(file_name, sizeof(file_name), f)) - { - String8 func = str8_cstring(func_name); - if(func.size > 0) func.size -= 1; - String8 module = str8_skip_last_slash(str8_cstring(info.dli_fname)); - String8 file = str8_skip_last_slash(str8_cstring_capped(file_name, file_name + sizeof(file_name))); - if(file.size > 0) file.size -= 1; - - B32 no_func = str8_match(func, str8_lit("??"), StringMatchFlag_RightSideSloppy); - B32 no_file = str8_match(file, str8_lit("??"), StringMatchFlag_RightSideSloppy); - if(no_func) { func = str8_zero(); } - if(no_file) { file = str8_zero(); } - - fprintf(stderr, "%ld. [0x%016lx] %.*s%s%.*s %.*s\n", i+1, (unsigned long)ips[i], (int)module.size, module.str, (!no_func || !no_file) ? ", " : "", (int)func.size, func.str, (int)file.size, file.str); - } - pclose(f); - } - else - { - fprintf(stderr, "%ld. [0x%016lx] %s\n", i+1, (unsigned long)ips[i], info.dli_fname); - } - } - fprintf(stderr, "\nVersion: %s%s\n\n", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); - - _exit(1); -} - -int -main(int argc, char **argv) -{ - // install signal handler for the crash call stacks - { - struct sigaction handler = { .sa_sigaction = lnx_signal_handler, .sa_flags = SA_SIGINFO, }; - sigfillset(&handler.sa_mask); - sigaction(SIGILL, &handler, NULL); - sigaction(SIGTRAP, &handler, NULL); - sigaction(SIGABRT, &handler, NULL); - sigaction(SIGFPE, &handler, NULL); - sigaction(SIGBUS, &handler, NULL); - sigaction(SIGSEGV, &handler, NULL); - sigaction(SIGQUIT, &handler, NULL); - } - - //- rjf: set up OS layer - { - //- rjf: get statically-allocated system/process info - { - OS_SystemInfo *info = &os_lnx_state.system_info; - info->logical_processor_count = (U32)get_nprocs(); - info->page_size = (U64)getpagesize(); - info->large_page_size = MB(2); - info->allocation_granularity = info->page_size; - } - { - OS_ProcessInfo *info = &os_lnx_state.process_info; - info->pid = (U32)getpid(); - } - - //- rjf: set up thread context - TCTX *tctx = tctx_alloc(); - tctx_select(tctx); - - //- rjf: set up dynamically allocated state - os_lnx_state.arena = arena_alloc(); - os_lnx_state.entity_arena = arena_alloc(); - pthread_mutex_init(&os_lnx_state.entity_mutex, 0); - - // cache default environment - { - U64 env_count = 0; - for(; __environ[env_count] != 0; env_count += 1) {} - char **default_env = push_array(os_lnx_state.arena, char *, env_count+1); - for EachIndex(idx, env_count) - { - default_env[idx] = (char *)str8_copy(os_lnx_state.arena, str8_cstring(__environ[idx])).str; - } - default_env[env_count] = 0; - os_lnx_state.default_env_count = env_count; - os_lnx_state.default_env = default_env; - } - - //- rjf: grab dynamically allocated system info - { - Temp scratch = scratch_begin(0, 0); - OS_SystemInfo *info = &os_lnx_state.system_info; - - // rjf: get machine name - B32 got_final_result = 0; - U8 *buffer = 0; - int size = 0; - for(S64 cap = 4096, r = 0; r < 4; cap *= 2, r += 1) - { - scratch_end(scratch); - buffer = push_array(scratch.arena, U8, cap); - int gethostname_result = gethostname((char*)buffer, cap); - size = cstring8_length(buffer); - if(gethostname_result == 0 && size < cap) - { - got_final_result = 1; - break; - } - } - - // rjf: save name to info - if(got_final_result && size > 0) - { - info->machine_name.size = size; - info->machine_name.str = push_array_no_zero(os_lnx_state.arena, U8, info->machine_name.size + 1); - MemoryCopy(info->machine_name.str, buffer, info->machine_name.size); - info->machine_name.str[info->machine_name.size] = 0; - } - - scratch_end(scratch); - } - - //- rjf: grab dynamically allocated process info - { - Temp scratch = scratch_begin(0, 0); - OS_ProcessInfo *info = &os_lnx_state.process_info; - - // rjf: grab binary path - { - // rjf: get self string - B32 got_final_result = 0; - U8 *buffer = 0; - int size = 0; - for(S64 cap = PATH_MAX, r = 0; r < 4; cap *= 2, r += 1) - { - scratch_end(scratch); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = readlink("/proc/self/exe", (char*)buffer, cap); - if(size < cap) - { - got_final_result = 1; - break; - } - } - - // rjf: save - if(got_final_result && size > 0) - { - String8 full_name = str8(buffer, size); - String8 name_chopped = str8_chop_last_slash(full_name); - info->binary_path = push_str8_copy(os_lnx_state.arena, name_chopped); - } - } - - // rjf: grab initial directory - { - info->initial_path = os_get_current_path(os_lnx_state.arena); - } - - // rjf: grab home directory - { - char *home = getenv("HOME"); - info->user_program_data_path = str8_cstring(home); - } - - scratch_end(scratch); - } - } - - //- rjf: call into "real" entry point - main_thread_base_entry_point(argc, argv); -} diff --git a/src/os/core/linux/os_core_linux.h b/src/os/core/linux/os_core_linux.h deleted file mode 100644 index 1f3ab4a0..00000000 --- a/src/os/core/linux/os_core_linux.h +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_CORE_LINUX_H -#define OS_CORE_LINUX_H - -//////////////////////////////// -//~ rjf: Includes - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -pid_t gettid(void); -int pthread_setname_np(pthread_t thread, const char *name); -int pthread_getname_np(pthread_t thread, char *name, size_t size); - -typedef struct tm tm; -typedef struct timespec timespec; - -//////////////////////////////// - -#define OS_LNX_RETRY_ON_EINTR(expr) \ - (__extension__({ \ - __typeof__(expr) __ret; \ - do { \ - __ret = (expr); \ - } while ((__ret == -1) && errno == EINTR); \ - __ret; \ - })) - -//////////////////////////////// -//~ rjf: Register Layouts -// -// These are defined in , but only for one architecture at a time - -typedef struct OS_LNX_GprsX64 OS_LNX_GprsX64; -struct OS_LNX_GprsX64 -{ - U64 r15; - U64 r14; - U64 r13; - U64 r12; - U64 rbp; - U64 rbx; - U64 r11; - U64 r10; - U64 r9; - U64 r8; - U64 rax; - U64 rcx; - U64 rdx; - U64 rsi; - U64 rdi; - U64 orig_rax; - U64 rip; - U64 cs; - U64 rflags; - U64 rsp; - U64 ss; - U64 fsbase; - U64 gsbase; - U64 ds; - U64 es; - U64 fs; - U64 gs; -}; - -typedef struct OS_LNX_UserX64 OS_LNX_UserX64; -struct OS_LNX_UserX64 -{ - OS_LNX_GprsX64 regs; - S32 u_fpvalid; - U32 _pad0; - X64_FXSave i387; - U64 u_tsize; - U64 u_dsize; - U64 u_ssize; - U64 start_code; - U64 start_stack; - U64 signal; - U32 reserved; - U32 _pad1; - U64 u_ar0; - U64 u_fpstate; - U64 magic; - U8 u_comm[32]; - U64 u_debugreg[8]; -}; -StaticAssert(sizeof(OS_LNX_UserX64) == 912, g_os_lnx_user_x64_size_check); - -//////////////////////////////// -//~ rjf: File Iterator - -typedef struct OS_LNX_FileIter OS_LNX_FileIter; -struct OS_LNX_FileIter -{ - DIR *dir; - struct dirent *dp; - String8 path; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check); - -//////////////////////////////// -//~ rjf: Safe Call Handler Chain - -typedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain; -struct OS_LNX_SafeCallChain -{ - OS_LNX_SafeCallChain *next; - ThreadEntryPointFunctionType *fail_handler; - void *ptr; -}; - -//////////////////////////////// -//~ rjf: Entities - -typedef enum OS_LNX_EntityKind -{ - OS_LNX_EntityKind_Thread, - OS_LNX_EntityKind_Mutex, - OS_LNX_EntityKind_RWMutex, - OS_LNX_EntityKind_ConditionVariable, - OS_LNX_EntityKind_Barrier, -} -OS_LNX_EntityKind; - -typedef struct OS_LNX_Entity OS_LNX_Entity; -struct OS_LNX_Entity -{ - OS_LNX_Entity *next; - OS_LNX_EntityKind kind; - union - { - struct - { - pthread_t handle; - ThreadEntryPointFunctionType *func; - void *ptr; - } thread; - pthread_mutex_t mutex_handle; - pthread_rwlock_t rwmutex_handle; - struct - { - pthread_cond_t cond_handle; - pthread_mutex_t rwlock_mutex_handle; - } cv; - pthread_barrier_t barrier; - }; -}; - -//////////////////////////////// -//~ rjf: State - -typedef struct OS_LNX_State OS_LNX_State; -struct OS_LNX_State -{ - Arena *arena; - OS_SystemInfo system_info; - OS_ProcessInfo process_info; - pthread_mutex_t entity_mutex; - Arena *entity_arena; - OS_LNX_Entity *entity_free; - U64 default_env_count; - char **default_env; -}; - -//////////////////////////////// -//~ rjf: Globals - -global OS_LNX_State os_lnx_state = {0}; -thread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0; - -//////////////////////////////// -//~ rjf: Helpers - -internal DateTime os_lnx_date_time_from_tm(tm in, U32 msec); -internal tm os_lnx_tm_from_date_time(DateTime dt); -internal timespec os_lnx_timespec_from_date_time(DateTime dt); -internal DenseTime os_lnx_dense_time_from_timespec(timespec in); -internal FileProperties os_lnx_file_properties_from_stat(struct stat *s); -internal void os_lnx_safe_call_sig_handler(int x); - -//////////////////////////////// -//~ rjf: Entities - -internal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind); -internal void os_lnx_entity_release(OS_LNX_Entity *entity); - -//////////////////////////////// -//~ rjf: Thread Entry Point - -internal void *os_lnx_thread_entry_point(void *ptr); - -#endif // OS_CORE_LINUX_H diff --git a/src/os/core/linux/os_core_linux_old.c b/src/os/core/linux/os_core_linux_old.c deleted file mode 100644 index 4d492f06..00000000 --- a/src/os/core/linux/os_core_linux_old.c +++ /dev/null @@ -1,1677 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include - -//////////////////////////////// -//~ rjf: Globals - -global pthread_mutex_t lnx_mutex = {0}; -global Arena *lnx_perm_arena = 0; -global String8List lnx_cmd_line_args = {0}; -global LNX_Entity lnx_entity_buffer[1024]; -global LNX_Entity *lnx_entity_free = 0; -global String8 lnx_initial_path = {0}; -thread_static LNX_SafeCallChain *lnx_safe_call_chain = 0; - -//////////////////////////////// -//~ rjf: Helpers - -internal B32 -lnx_write_list_to_file_descriptor(int fd, String8List list){ - B32 success = true; - - String8Node *node = list.first; - if (node != 0){ - U8 *ptr = node->string.str;; - U8 *opl = ptr + node->string.size; - - U64 p = 0; - for (;p < list.total_size;){ - U64 amt64 = (U64)(opl - ptr); - U32 amt = u32_from_u64_saturate(amt64); - S64 written_amt = write(fd, ptr, amt); - if (written_amt < 0){ - break; - } - p += written_amt; - ptr += written_amt; - - Assert(ptr <= opl); - if (ptr == opl){ - node = node->next; - if (node == 0){ - if (p < list.total_size){ - success = false; - } - break; - } - ptr = node->string.str; - opl = ptr + node->string.size; - } - } - } - - return(success); -} - -internal void -lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec){ - out->msec = msec; - out->sec = in->tm_sec; - out->min = in->tm_min; - out->hour = in->tm_hour; - out->day = in->tm_mday - 1; - out->wday = in->tm_wday; - out->mon = in->tm_mon; - out->year = in->tm_year + 1900; -} - -internal void -lnx_tm_from_date_time(struct tm *out, DateTime *in){ - out->tm_sec = in->sec; - out->tm_min = in->min; - out->tm_hour = in->hour; - out->tm_mday = in->day + 1; - out->tm_mon = in->mon; - out->tm_year = in->year - 1900; -} - -internal void -lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in){ - struct tm tm_time = {0}; - gmtime_r(&in->tv_sec, &tm_time); - DateTime date_time = {0}; - lnx_date_time_from_tm(&date_time, &tm_time, in->tv_nsec/Million(1)); - *out = dense_time_from_date_time(date_time); -} - -internal void -lnx_file_properties_from_stat(FileProperties *out, struct stat *in){ - MemoryZeroStruct(out); - out->size = in->st_size; - lnx_dense_time_from_timespec(&out->created, &in->st_ctim); - lnx_dense_time_from_timespec(&out->modified, &in->st_mtim); - if ((in->st_mode & S_IFDIR) != 0){ - out->flags |= FilePropertyFlag_IsFolder; - } -} - -internal String8 -lnx_string_from_signal(int signum){ - String8 result = str8_lit(""); - switch (signum){ - case SIGABRT: - { - result = str8_lit("SIGABRT"); - }break; - case SIGALRM: - { - result = str8_lit("SIGALRM"); - }break; - case SIGBUS: - { - result = str8_lit("SIGBUS"); - }break; - case SIGCHLD: - { - result = str8_lit("SIGCHLD"); - }break; - case SIGCONT: - { - result = str8_lit("SIGCONT"); - }break; - case SIGFPE: - { - result = str8_lit("SIGFPE"); - }break; - case SIGHUP: - { - result = str8_lit("SIGHUP"); - }break; - case SIGILL: - { - result = str8_lit("SIGILL"); - }break; - case SIGINT: - { - result = str8_lit("SIGINT"); - }break; - case SIGIO: - { - result = str8_lit("SIGIO"); - } - case SIGKILL: - { - result = str8_lit("SIGKILL"); - }break; - case SIGPIPE: - { - result = str8_lit("SIGPIPE"); - }break; - case SIGPROF: - { - result = str8_lit("SIGPROF"); - }break; - case SIGPWR: - { - result = str8_lit("SIGPWR"); - }break; - case SIGQUIT: - { - result = str8_lit("SIGQUIT"); - }break; - case SIGSEGV: - { - result = str8_lit("SIGSEGV"); - }break; - case SIGSTKFLT: - { - result = str8_lit("SIGSTKFLT"); - }break; - case SIGSTOP: - { - result = str8_lit("SIGSTOP"); - }break; - case SIGTSTP: - { - result = str8_lit("SIGTSTP"); - }break; - case SIGSYS: - { - result = str8_lit("SIGSYS"); - }break; - case SIGTERM: - { - result = str8_lit("SIGTERM"); - }break; - case SIGTRAP: - { - result = str8_lit("SIGTRAP"); - }break; - case SIGTTIN: - { - result = str8_lit("SIGTTIN"); - }break; - case SIGTTOU: - { - result = str8_lit("SIGTTOU"); - }break; - case SIGURG: - { - result = str8_lit("SIGURG"); - }break; - case SIGUSR1: - { - result = str8_lit("SIGUSR1"); - }break; - case SIGUSR2: - { - result = str8_lit("SIGUSR2"); - }break; - case SIGVTALRM: - { - result = str8_lit("SIGVTALRM"); - }break; - case SIGXCPU: - { - result = str8_lit("SIGXCPU"); - }break; - case SIGXFSZ: - { - result = str8_lit("SIGXFSZ"); - }break; - case SIGWINCH: - { - result = str8_lit("SIGWINCH"); - }break; - } - return(result); -} - -internal String8 -lnx_string_from_errno(int error_number){ - String8 result = str8_lit(""); - switch (error_number){ - case EPERM: - { - result = str8_lit("EPERM"); - }break; - case ENOENT: - { - result = str8_lit("ENOENT"); - }break; - case ESRCH: - { - result = str8_lit("ESRCH"); - }break; - case EINTR: - { - result = str8_lit("EINTR"); - }break; - case EIO: - { - result = str8_lit("EIO"); - }break; - case ENXIO: - { - result = str8_lit("ENXIO"); - }break; - case E2BIG: - { - result = str8_lit("E2BIG"); - }break; - case ENOEXEC: - { - result = str8_lit("ENOEXEC"); - }break; - case EBADF: - { - result = str8_lit("EBADF"); - }break; - case ECHILD: - { - result = str8_lit("ECHILD"); - }break; - case EAGAIN: - { - result = str8_lit("EAGAIN"); - }break; - case ENOMEM: - { - result = str8_lit("ENOMEM"); - }break; - case EACCES: - { - result = str8_lit("EACCES"); - }break; - case EFAULT: - { - result = str8_lit("EFAULT"); - }break; - case ENOTBLK: - { - result = str8_lit("ENOTBLK"); - }break; - case EBUSY: - { - result = str8_lit("EBUSY"); - }break; - case EEXIST: - { - result = str8_lit("EEXIST"); - }break; - case EXDEV: - { - result = str8_lit("EXDEV"); - }break; - case ENODEV: - { - result = str8_lit("ENODEV"); - }break; - case ENOTDIR: - { - result = str8_lit("ENOTDIR"); - }break; - case EISDIR: - { - result = str8_lit("EISDIR"); - }break; - case EINVAL: - { - result = str8_lit("EINVAL"); - }break; - case ENFILE: - { - result = str8_lit("ENFILE"); - }break; - case EMFILE: - { - result = str8_lit("EMFILE"); - }break; - case ENOTTY: - { - result = str8_lit("ENOTTY"); - }break; - case ETXTBSY: - { - result = str8_lit("ETXTBSY"); - }break; - case EFBIG: - { - result = str8_lit("EFBIG"); - }break; - case ENOSPC: - { - result = str8_lit("ENOSPC"); - }break; - case ESPIPE: - { - result = str8_lit("ESPIPE"); - }break; - case EROFS: - { - result = str8_lit("EROFS"); - }break; - case EMLINK: - { - result = str8_lit("EMLINK"); - }break; - case EPIPE: - { - result = str8_lit("EPIPE"); - }break; - case EDOM: - { - result = str8_lit("EDOM"); - }break; - case ERANGE: - { - result = str8_lit("ERANGE"); - }break; - case EDEADLK: - { - result = str8_lit("EDEADLK"); - }break; - case ENAMETOOLONG: - { - result = str8_lit("ENAMETOOLONG"); - }break; - case ENOLCK: - { - result = str8_lit("ENOLCK"); - }break; - case ENOSYS: - { - result = str8_lit("ENOSYS"); - }break; - case ENOTEMPTY: - { - result = str8_lit("ENOTEMPTY"); - }break; - case ELOOP: - { - result = str8_lit("ELOOP"); - }break; - case ENOMSG: - { - result = str8_lit("ENOMSG"); - }break; - case EIDRM: - { - result = str8_lit("EIDRM"); - }break; - case ECHRNG: - { - result = str8_lit("ECHRNG"); - }break; - case EL2NSYNC: - { - result = str8_lit("EL2NSYNC"); - }break; - case EL3HLT: - { - result = str8_lit("EL3HLT"); - }break; - case EL3RST: - { - result = str8_lit("EL3RST"); - }break; - case ELNRNG: - { - result = str8_lit("ELNRNG"); - }break; - case EUNATCH: - { - result = str8_lit("EUNATCH"); - }break; - case ENOCSI: - { - result = str8_lit("ENOCSI"); - }break; - case EL2HLT: - { - result = str8_lit("EL2HLT"); - }break; - case EBADE: - { - result = str8_lit("EBADE"); - }break; - case EBADR: - { - result = str8_lit("EBADR"); - }break; - case EXFULL: - { - result = str8_lit("EXFULL"); - }break; - case ENOANO: - { - result = str8_lit("ENOANO"); - }break; - case EBADRQC: - { - result = str8_lit("EBADRQC"); - }break; - case EBADSLT: - { - result = str8_lit("EBADSLT"); - }break; - case EBFONT: - { - result = str8_lit("EBFONT"); - }break; - case ENOSTR: - { - result = str8_lit("ENOSTR"); - }break; - case ENODATA: - { - result = str8_lit("ENODATA"); - }break; - case ETIME: - { - result = str8_lit("ETIME"); - }break; - case ENOSR: - { - result = str8_lit("ENOSR"); - }break; - case ENONET: - { - result = str8_lit("ENONET"); - }break; - case ENOPKG: - { - result = str8_lit("ENOPKG"); - }break; - case EREMOTE: - { - result = str8_lit("EREMOTE"); - }break; - case ENOLINK: - { - result = str8_lit("ENOLINK"); - }break; - case EADV: - { - result = str8_lit("EADV"); - }break; - case ESRMNT: - { - result = str8_lit("ESRMNT"); - }break; - case ECOMM: - { - result = str8_lit("ECOMM"); - }break; - case EPROTO: - { - result = str8_lit("EPROTO"); - }break; - case EMULTIHOP: - { - result = str8_lit("EMULTIHOP"); - }break; - case EDOTDOT: - { - result = str8_lit("EDOTDOT"); - }break; - case EBADMSG: - { - result = str8_lit("EBADMSG"); - }break; - case EOVERFLOW: - { - result = str8_lit("EOVERFLOW"); - }break; - case ENOTUNIQ: - { - result = str8_lit("ENOTUNIQ"); - }break; - case EBADFD: - { - result = str8_lit("EBADFD"); - }break; - case EREMCHG: - { - result = str8_lit("EREMCHG"); - }break; - case ELIBACC: - { - result = str8_lit("ELIBACC"); - }break; - case ELIBBAD: - { - result = str8_lit("ELIBBAD"); - }break; - case ELIBSCN: - { - result = str8_lit("ELIBSCN"); - }break; - case ELIBMAX: - { - result = str8_lit("ELIBMAX"); - }break; - case ELIBEXEC: - { - result = str8_lit("ELIBEXEC"); - }break; - case EILSEQ: - { - result = str8_lit("EILSEQ"); - }break; - case ERESTART: - { - result = str8_lit("ERESTART"); - }break; - case ESTRPIPE: - { - result = str8_lit("ESTRPIPE"); - }break; - case EUSERS: - { - result = str8_lit("EUSERS"); - }break; - case ENOTSOCK: - { - result = str8_lit("ENOTSOCK"); - }break; - case EDESTADDRREQ: - { - result = str8_lit("EDESTADDRREQ"); - }break; - case EMSGSIZE: - { - result = str8_lit("EMSGSIZE"); - }break; - case EPROTOTYPE: - { - result = str8_lit("EPROTOTYPE"); - }break; - case ENOPROTOOPT: - { - result = str8_lit("ENOPROTOOPT"); - }break; - case EPROTONOSUPPORT: - { - result = str8_lit("EPROTONOSUPPORT"); - }break; - case ESOCKTNOSUPPORT: - { - result = str8_lit("ESOCKTNOSUPPORT"); - }break; - case EOPNOTSUPP: - { - result = str8_lit("EOPNOTSUPP"); - }break; - case EPFNOSUPPORT: - { - result = str8_lit("EPFNOSUPPORT"); - }break; - case EAFNOSUPPORT: - { - result = str8_lit("EAFNOSUPPORT"); - }break; - case EADDRINUSE: - { - result = str8_lit("EADDRINUSE"); - }break; - case EADDRNOTAVAIL: - { - result = str8_lit("EADDRNOTAVAIL"); - }break; - case ENETDOWN: - { - result = str8_lit("ENETDOWN"); - }break; - case ENETUNREACH: - { - result = str8_lit("ENETUNREACH"); - }break; - case ENETRESET: - { - result = str8_lit("ENETRESET"); - }break; - case ECONNABORTED: - { - result = str8_lit("ECONNABORTED"); - }break; - case ECONNRESET: - { - result = str8_lit("ECONNRESET"); - }break; - case ENOBUFS: - { - result = str8_lit("ENOBUFS"); - }break; - case EISCONN: - { - result = str8_lit("EISCONN"); - }break; - case ENOTCONN: - { - result = str8_lit("ENOTCONN"); - }break; - case ESHUTDOWN: - { - result = str8_lit("ESHUTDOWN"); - }break; - case ETOOMANYREFS: - { - result = str8_lit("ETOOMANYREFS"); - }break; - case ETIMEDOUT: - { - result = str8_lit("ETIMEDOUT"); - }break; - case ECONNREFUSED: - { - result = str8_lit("ECONNREFUSED"); - }break; - case EHOSTDOWN: - { - result = str8_lit("EHOSTDOWN"); - }break; - case EHOSTUNREACH: - { - result = str8_lit("EHOSTUNREACH"); - }break; - case EALREADY: - { - result = str8_lit("EALREADY"); - }break; - case EINPROGRESS: - { - result = str8_lit("EINPROGRESS"); - }break; - case ESTALE: - { - result = str8_lit("ESTALE"); - }break; - case EUCLEAN: - { - result = str8_lit("EUCLEAN"); - }break; - case ENOTNAM: - { - result = str8_lit("ENOTNAM"); - }break; - case ENAVAIL: - { - result = str8_lit("ENAVAIL"); - }break; - case EISNAM: - { - result = str8_lit("EISNAM"); - }break; - case EREMOTEIO: - { - result = str8_lit("EREMOTEIO"); - }break; - case EDQUOT: - { - result = str8_lit("EDQUOT"); - }break; - case ENOMEDIUM: - { - result = str8_lit("ENOMEDIUM"); - }break; - case EMEDIUMTYPE: - { - result = str8_lit("EMEDIUMTYPE"); - }break; - case ECANCELED: - { - result = str8_lit("ECANCELED"); - }break; - case ENOKEY: - { - result = str8_lit("ENOKEY"); - }break; - case EKEYEXPIRED: - { - result = str8_lit("EKEYEXPIRED"); - }break; - case EKEYREVOKED: - { - result = str8_lit("EKEYREVOKED"); - }break; - case EKEYREJECTED: - { - result = str8_lit("EKEYREJECTED"); - }break; - case EOWNERDEAD: - { - result = str8_lit("EOWNERDEAD"); - }break; - case ENOTRECOVERABLE: - { - result = str8_lit("ENOTRECOVERABLE"); - }break; - case ERFKILL: - { - result = str8_lit("ERFKILL"); - }break; - case EHWPOISON: - { - result = str8_lit("EHWPOISON"); - }break; - } - return(result); -} - -internal LNX_Entity* -lnx_alloc_entity(LNX_EntityKind kind){ - pthread_mutex_lock(&lnx_mutex); - LNX_Entity *result = lnx_entity_free; - Assert(result != 0); - SLLStackPop(lnx_entity_free); - pthread_mutex_unlock(&lnx_mutex); - result->kind = kind; - return(result); -} - -internal void -lnx_free_entity(LNX_Entity *entity){ - entity->kind = LNX_EntityKind_Null; - pthread_mutex_lock(&lnx_mutex); - SLLStackPush(lnx_entity_free, entity); - pthread_mutex_unlock(&lnx_mutex); -} - -internal void* -lnx_thread_base(void *ptr){ - LNX_Entity *entity = (LNX_Entity*)ptr; - ThreadEntryPointFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - - TCTX tctx_; - tctx_init_and_equip(&tctx_); - func(thread_ptr); - tctx_release(); - - // remove my bit - U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x2); - // if the other bit is also gone, free entity - if ((result & 0x1) == 0){ - lnx_free_entity(entity); - } - return(0); -} - -internal void -lnx_safe_call_sig_handler(int){ - LNX_SafeCallChain *chain = lnx_safe_call_chain; - if (chain != 0 && chain->fail_handler != 0){ - chain->fail_handler(chain->ptr); - } - abort(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_init(void) -{ - // NOTE(allen): Initialize linux layer mutex - { - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int pthread_result = pthread_mutex_init(&lnx_mutex, &attr); - pthread_mutexattr_destroy(&attr); - if (pthread_result == -1){ - abort(); - } - } - MemoryZeroArray(lnx_entity_buffer); - { - LNX_Entity *ptr = lnx_entity_free = lnx_entity_buffer; - for (U64 i = 1; i < ArrayCount(lnx_entity_buffer); i += 1, ptr += 1){ - ptr->next = ptr + 1; - } - ptr->next = 0; - } - - // NOTE(allen): Permanent memory allocator for this layer - Arena *perm_arena = arena_alloc(); - lnx_perm_arena = perm_arena; - - // NOTE(allen): Initialize Paths - lnx_initial_path = os_get_path(lnx_perm_arena, OS_SystemPath_Current); - - // NOTE(rjf): Setup command line args - lnx_cmd_line_args = os_string_list_from_argcv(lnx_perm_arena, argc, argv); -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -internal void* -os_reserve(U64 size){ - void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - return(result); -} - -internal B32 -os_commit(void *ptr, U64 size){ - mprotect(ptr, size, PROT_READ|PROT_WRITE); - // TODO(allen): can we test this? - return(true); -} - -internal void* -os_reserve_large(U64 size){ - NotImplemented; - return 0; -} - -internal B32 -os_commit_large(void *ptr, U64 size){ - NotImplemented; - return 0; -} - -internal void -os_decommit(void *ptr, U64 size){ - madvise(ptr, size, MADV_DONTNEED); - mprotect(ptr, size, PROT_NONE); -} - -internal void -os_release(void *ptr, U64 size){ - munmap(ptr, size); -} - -internal void -os_set_large_pages_enabled(B32 flag) -{ - NotImplemented; -} - -internal B32 -os_large_pages_enabled(void) -{ - NotImplemented; - return 0; -} - -internal U64 -os_large_page_size(void) -{ - NotImplemented; - return 0; -} - -//////////////////////////////// -//~ rjf: @os_hooks System Info (Implemented Per-OS) - -internal String8 -os_machine_name(void){ - local_persist B32 first = true; - local_persist String8 name = {0}; - - // TODO(allen): let's just pre-compute this at init and skip the complexity - pthread_mutex_lock(&lnx_mutex); - if (first){ - Temp scratch = scratch_begin(0, 0); - first = false; - - // get name - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - for (S64 cap = 4096, r = 0; - r < 4; - cap *= 2, r += 1){ - scratch.restore(); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = gethostname((char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // save string - if (got_final_result && size > 0){ - name.size = size; - name.str = push_array_no_zero(lnx_perm_arena, U8, name.size + 1); - MemoryCopy(name.str, buffer, name.size); - name.str[name.size] = 0; - } - - scratch_end(scratch); - } - pthread_mutex_unlock(&lnx_mutex); - - return(name); -} - -internal U64 -os_page_size(void){ - int size = getpagesize(); - return((U64)size); -} - -internal U64 -os_allocation_granularity(void) -{ - // On linux there is no equivalent of "dwAllocationGranularity" - os_page_size(); -} - -internal U64 -os_logical_core_count(void) -{ - // TODO(rjf): check this - return get_nprocs(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Process & Thread Info (Implemented Per-OS) - -internal String8List -os_get_command_line_arguments(void) -{ - return lnx_cmd_line_args; -} - -internal S32 -os_pid(void){ - S32 result = getpid(); - return(result); -} - -internal S32 -os_tid(void){ - S32 result = 0; -#ifdef SYS_gettid - result = syscall(SYS_gettid); -#else - result = gettid(); -#endif - return(result); -} - -internal String8List -os_environment(void) -{ - NotImplemented; - String8List result = {0}; - return result; -} - -internal U64 -os_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out){ - U64 result = 0; - - switch (path){ - case OS_SystemPath_Binary: - { - local_persist B32 first = true; - local_persist String8 name = {0}; - - // TODO(allen): let's just pre-compute this at init and skip the complexity - pthread_mutex_lock(&lnx_mutex); - if (first){ - Temp scratch = scratch_begin(&arena, 1); - first = false; - - // get self string - B32 got_final_result = false; - U8 *buffer = 0; - int size = 0; - for (S64 cap = PATH_MAX, r = 0; - r < 4; - cap *= 2, r += 1){ - scratch.restore(); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = readlink("/proc/self/exe", (char*)buffer, cap); - if (size < cap){ - got_final_result = true; - break; - } - } - - // save string - if (got_final_result && size > 0){ - String8 full_name = str8(buffer, size); - String8 name_chopped = string_path_chop_last_slash(full_name); - name = push_str8_copy(lnx_perm_arena, name_chopped); - } - - scratch_end(scratch); - } - pthread_mutex_unlock(&lnx_mutex); - - result = 1; - str8_list_push(arena, out, name); - }break; - - case OS_SystemPath_Initial: - { - Assert(lnx_initial_path.str != 0); - result = 1; - str8_list_push(arena, out, lnx_initial_path); - }break; - - case OS_SystemPath_Current: - { - char *cwdir = getcwd(0, 0); - String8 string = push_str8_copy(arena, str8_cstring(cwdir)); - free(cwdir); - result = 1; - str8_list_push(arena, out, string); - }break; - - case OS_SystemPath_UserProgramData: - { - char *home = getenv("HOME"); - String8 string = str8_cstring(home); - result = 1; - str8_list_push(arena, out, string); - }break; - - case OS_SystemPath_ModuleLoad: - { - // TODO(allen): this one is big and complicated and only needed for making - // a debugger, skipping for now. - NotImplemented; - }break; - } - - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Process Control (Implemented Per-OS) - -internal void -os_abort(S32 exit_code){ - exit(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - OS_Handle file = {0}; - NotImplemented; - return file; -} - -internal void -os_file_close(OS_Handle file) -{ - NotImplemented; -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - NotImplemented; - return 0; -} - -internal U64 -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - NotImplemented; -} - -internal B32 -os_file_set_times(OS_Handle file, DateTime time) -{ - NotImplemented; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - FileProperties props = {0}; - NotImplemented; - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - // TODO(nick): querry struct stat with fstat(2) and use st_dev and st_ino as ids - OS_FileID id = {0}; - NotImplemented; - return id; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = false; - String8 name_copy = push_str8_copy(scratch.arena, name); - if (remove((char*)name_copy.str) != -1){ - result = true; - } - scratch_end(scratch); - return(result); -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - NotImplemented; - return 0; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - // TODO: realpath can be used to resolve full path - String8 result = {0}; - NotImplemented; - return result; -} - -internal B32 -os_file_path_exists(String8 path) -{ - NotImplemented; - return 0; -} - -internal FileProperties -os_properties_from_file_path(String8 path) -{ - FileProperties props = {0}; - NotImplemented; - return props; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - NotImplemented; - OS_Handle handle = {0}; - return handle; -} - -internal void -os_file_map_close(OS_Handle map) -{ - NotImplemented; -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - NotImplemented; - return 0; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) -{ - NotImplemented; -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - NotImplemented; - return 0; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - NotImplemented; - return 0; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - NotImplemented; -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = false; - String8 name_copy = push_str8_copy(scratch.arena, name); - if (mkdir((char*)name_copy.str, 0777) != -1){ - result = true; - } - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - NotImplemented; -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - NotImplemented; - return 0; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal U32 -os_now_unix(void) -{ - time_t t = time(0); - return (U32)t; -} - -internal DateTime -os_now_universal_time(void){ - time_t t = 0; - time(&t); - struct tm universal_tm = {0}; - gmtime_r(&t, &universal_tm); - DateTime result = {0}; - lnx_date_time_from_tm(&result, &universal_tm, 0); - return(result); -} - -internal DateTime -os_universal_time_from_local(DateTime *local_time){ - // local time -> universal time (using whatever types it takes) - struct tm local_tm = {0}; - lnx_tm_from_date_time(&local_tm, local_time); - local_tm.tm_isdst = -1; - time_t universal_t = mktime(&local_tm); - - // whatever type we ended up with -> DateTime (don't alter the space along the way) - struct tm universal_tm = {0}; - gmtime_r(&universal_t, &universal_tm); - DateTime result = {0}; - lnx_date_time_from_tm(&result, &universal_tm, 0); - return(result); -} - -internal DateTime -os_local_time_from_universal(DateTime *universal_time){ - // universal time -> local time (using whatever types it takes) - struct tm universal_tm = {0}; - lnx_tm_from_date_time(&universal_tm, universal_time); - universal_tm.tm_isdst = -1; - time_t universal_t = timegm(&universal_tm); - struct tm local_tm = {0}; - localtime_r(&universal_t, &local_tm); - - // whatever type we ended up with -> DateTime (don't alter the space along the way) - DateTime result = {0}; - lnx_date_time_from_tm(&result, &local_tm, 0); - return(result); -} - -internal U64 -os_now_microseconds(void){ - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); - return(result); -} - -internal void -os_sleep_milliseconds(U32 msec){ - usleep(msec*Thousand(1)); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal B32 -os_launch_process(OS_LaunchOptions *options){ - // TODO(allen): I want to redo this API before I bother implementing it here - NotImplemented; - return(false); -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle -os_thread_launch(ThreadEntryPointFunctionType *func, void *ptr, void *params){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Thread); - entity->reference_mask = 0x3; - entity->thread.func = func; - entity->thread.ptr = ptr; - - // pthread - pthread_attr_t attr; - pthread_attr_init(&attr); - int pthread_result = pthread_create(&entity->thread.handle, &attr, lnx_thread_base, entity); - pthread_attr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_release_thread_handle(OS_Handle thread){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(thread.id); - // remove my bit - U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x1); - // if the other bit is also gone, free entity - if ((result & 0x2) == 0){ - lnx_free_entity(entity); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -// NOTE(allen): Mutexes are recursive - support counted acquire/release nesting -// on a single thread - -//- rjf: recursive mutexes - -internal OS_Handle -os_mutex_alloc(void){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Mutex); - - // pthread - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int pthread_result = pthread_mutex_init(&entity->mutex, &attr); - pthread_mutexattr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_mutex_release(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_destroy(&entity->mutex); - lnx_free_entity(entity); -} - -internal void -os_mutex_take_(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_lock(&entity->mutex); -} - -internal void -os_mutex_drop_(OS_Handle mutex){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id); - pthread_mutex_unlock(&entity->mutex); -} - -//- rjf: reader/writer mutexes - -internal OS_Handle -os_rw_mutex_alloc(void) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_rw_mutex_release(OS_Handle rw_mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_take_r_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_drop_r_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_take_w_(OS_Handle mutex) -{ - NotImplemented; -} - -internal void -os_rw_mutex_drop_w_(OS_Handle mutex) -{ - NotImplemented; -} - -//- rjf: condition variables - -internal OS_Handle -os_cond_var_alloc(void){ - // entity - LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_ConditionVariable); - - // pthread - pthread_condattr_t attr; - pthread_condattr_init(&attr); - int pthread_result = pthread_cond_init(&entity->cond, &attr); - pthread_condattr_destroy(&attr); - if (pthread_result == -1){ - lnx_free_entity(entity); - entity = 0; - } - - // cast to opaque handle - OS_Handle result = {IntFromPtr(entity)}; - return(result); -} - -internal void -os_cond_var_release(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - pthread_cond_destroy(&entity->cond); - lnx_free_entity(entity); -} - -internal B32 -os_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us){ - B32 result = false; - LNX_Entity *entity_cond = (LNX_Entity*)PtrFromInt(cv.id); - LNX_Entity *entity_mutex = (LNX_Entity*)PtrFromInt(mutex.id); - // TODO(allen): implement the time control - pthread_cond_timedwait(&entity_cond->cond, &entity_mutex->mutex); - return(result); -} - -internal B32 -os_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - NotImplemented; - return 0; -} - -internal B32 -os_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - NotImplemented; - return 0; -} - -internal void -os_condition_variable_signal_(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - pthread_cond_signal(&entity->cond); -} - -internal void -os_condition_variable_broadcast_(OS_Handle cv){ - LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id); - DontCompile; -} - -//- rjf: cross-process semaphores - -internal OS_Handle -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_semaphore_release(OS_Handle semaphore) -{ - NotImplemented; -} - -internal OS_Handle -os_semaphore_open(String8 name) -{ - OS_Handle result = {0}; - NotImplemented; - return result; -} - -internal void -os_semaphore_close(OS_Handle semaphore) -{ - NotImplemented; -} - -internal B32 -os_semaphore_take(OS_Handle semaphore, U64 endt_us) -{ - NotImplemented; - return 0; -} - -internal void -os_semaphore_drop(OS_Handle semaphore) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str; - void *so = dlopen(path_cstr, RTLD_LAZY); - OS_Handle lib = { (U64)so }; - scratch_end(scratch); - return lib; -} - -internal VoidProc * -os_library_load_proc(OS_Handle lib, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - void *so = (void *)lib.id; - char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str; - VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); - scratch_end(scratch); - return proc; -} - -internal void -os_library_close(OS_Handle lib) -{ - void *so = (void *)lib.id; - dlclose(so); -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal void -os_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr){ - LNX_SafeCallChain chain = {0}; - SLLStackPush(lnx_safe_call_chain, &chain); - chain.fail_handler = fail_handler; - chain.ptr = ptr; - - struct sigaction new_act = {0}; - new_act.sa_handler = lnx_safe_call_sig_handler; - - int signals_to_handle[] = { - SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, - }; - struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; - - for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){ - sigaction(signals_to_handle[i], &new_act, &og_act[i]); - } - - func(ptr); - - for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){ - sigaction(signals_to_handle[i], &og_act[i], 0); - } -} - -//////////////////////////////// - -internal OS_Guid -os_make_guid(void) -{ - NotImplemented; -} - diff --git a/src/os/core/linux/os_core_linux_old.h b/src/os/core/linux/os_core_linux_old.h deleted file mode 100644 index cf133b2a..00000000 --- a/src/os/core/linux/os_core_linux_old.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef LINUX_H -#define LINUX_H - -//////////////////////////////// -//~ NOTE(allen): Get all these linux includes - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ NOTE(allen): File Iterator - -struct LNX_FileIter{ - int fd; - DIR *dir; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(LNX_FileIter), file_iter_memory_size); - -//////////////////////////////// -//~ NOTE(allen): Threading Entities - -enum LNX_EntityKind{ - LNX_EntityKind_Null, - LNX_EntityKind_Thread, - LNX_EntityKind_Mutex, - LNX_EntityKind_ConditionVariable, -}; - -struct LNX_Entity{ - LNX_Entity *next; - LNX_EntityKind kind; - volatile U32 reference_mask; - union{ - struct{ - ThreadEntryPointFunctionType *func; - void *ptr; - pthread_t handle; - } thread; - pthread_mutex_t mutex; - pthread_cond_t cond; - }; -}; - -//////////////////////////////// -//~ NOTE(allen): Safe Call Chain - -struct LNX_SafeCallChain{ - LNX_SafeCallChain *next; - ThreadEntryPointFunctionType *fail_handler; - void *ptr; -}; - -//////////////////////////////// -//~ NOTE(allen): Helpers - -internal B32 lnx_write_list_to_file_descriptor(int fd, String8List list); - -internal void lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec); -internal void lnx_tm_from_date_time(struct tm *out, DateTime *in); -internal void lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in); -internal void lnx_file_properties_from_stat(FileProperties *out, struct stat *in); - -internal String8 lnx_string_from_signal(int signum); -internal String8 lnx_string_from_errno(int error_number); - -internal LNX_Entity* lnx_alloc_entity(LNX_EntityKind kind); -internal void lnx_free_entity(LNX_Entity *entity); -internal void* lnx_thread_base(void *ptr); - -internal void lnx_safe_call_sig_handler(int); - -#endif //LINUX_H diff --git a/src/os/core/os_core.c b/src/os/core/os_core.c deleted file mode 100644 index 670f8486..00000000 --- a/src/os/core/os_core.c +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Handle Type Functions (Helpers, Implemented Once) - -internal OS_Handle -os_handle_zero(void) -{ - OS_Handle handle = {0}; - return handle; -} - -internal B32 -os_handle_match(OS_Handle a, OS_Handle b) -{ - return a.u64[0] == b.u64[0]; -} - -internal void -os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle) -{ - OS_HandleNode *n = push_array(arena, OS_HandleNode, 1); - n->v = handle; - SLLQueuePush(handles->first, handles->last, n); - handles->count += 1; -} - -internal OS_HandleArray -os_handle_array_from_list(Arena *arena, OS_HandleList *list) -{ - OS_HandleArray result = {0}; - result.count = list->count; - result.v = push_array_no_zero(arena, OS_Handle, result.count); - U64 idx = 0; - for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->v; - } - return result; -} - -//////////////////////////////// -//~ rjf: Filesystem Helpers (Helpers, Implemented Once) - -internal String8 -os_data_from_file_path(Arena *arena, String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - FileProperties props = os_properties_from_file(file); - String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); - os_file_close(file); - return data; -} - -internal B32 -os_write_data_to_file_path(String8 path, String8 data) -{ - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - U64 bytes_written = os_file_write(file, r1u64(0, data.size), data.str); - good = (bytes_written == data.size); - os_file_close(file); - } - return good; -} - -internal B32 -os_write_data_list_to_file_path(String8 path, String8List list) -{ - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - Temp scratch = scratch_begin(0, 0); - U64 write_buffer_size = KB(64); - U8 *write_buffer = push_array_no_zero(scratch.arena, U8, write_buffer_size); - U64 write_buffer_write_pos = 0; - U64 write_buffer_read_pos = 0; - U64 file_off = 0; - { - for(String8Node *n = list.first; n != 0; n = n->next) - { - for(U64 n_off = 0; n_off < n->string.size;) - { - U64 write_buffer_unconsumed_size = (write_buffer_write_pos - write_buffer_read_pos); - U64 write_buffer_available_size = (write_buffer_size - write_buffer_unconsumed_size); - if(write_buffer_available_size == 0) - { - U64 file_write_size = os_file_write(file, r1u64(file_off, file_off+write_buffer_size), write_buffer); - if(file_write_size != write_buffer_size) - { - goto dbl_break; - } - file_off += write_buffer_size; - write_buffer_read_pos += write_buffer_size; - } - else - { - U64 bytes_to_copy = Min(write_buffer_available_size, n->string.size - n_off); - write_buffer_write_pos += ring_write(write_buffer, write_buffer_size, write_buffer_write_pos, n->string.str + n_off, bytes_to_copy); - n_off += bytes_to_copy; - } - } - } - if(write_buffer_write_pos > write_buffer_read_pos) - { - U64 file_write_size = os_file_write(file, r1u64(file_off, file_off + (write_buffer_write_pos-write_buffer_read_pos)), write_buffer); - file_off += file_write_size; - } - } - dbl_break:; - good = (file_off == list.total_size); - os_file_close(file); - scratch_end(scratch); - } - return good; -} - -internal B32 -os_append_data_to_file_path(String8 path, String8 data) -{ - B32 good = 0; - if(data.size != 0) - { - OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path); - if(!os_handle_match(file, os_handle_zero())) - { - U64 pos = os_properties_from_file(file).size; - U64 bytes_written = os_file_write(file, r1u64(pos, pos+data.size), data.str); - good = (bytes_written == data.size); - os_file_close(file); - } - } - return good; -} - -internal OS_FileID -os_id_from_file_path(String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - OS_FileID id = os_id_from_file(file); - os_file_close(file); - return id; -} - -internal S64 -os_file_id_compare(OS_FileID a, OS_FileID b) -{ - S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v)); - return cmp; -} - -internal String8 -os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) -{ - U64 pre_pos = arena_pos(arena); - String8 result; - result.size = dim_1u64(range); - result.str = push_array_no_zero(arena, U8, result.size); - U64 actual_read_size = os_file_read(file, range, result.str); - if(actual_read_size < result.size) - { - arena_pop_to(arena, pre_pos + actual_read_size); - result.size = actual_read_size; - } - return result; -} - -internal String8 -os_file_read_cstring(Arena *arena, OS_Handle file, U64 off) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List block_list = {0}; - for(U64 cursor = off, stride = 256;; cursor += stride) - { - U8 *raw_block = push_array_no_zero(scratch.arena, U8, stride); - U64 read_size = os_file_read(file, r1u64(cursor, cursor + stride), raw_block); - String8 block = str8_cstring_capped(raw_block, raw_block+read_size); - str8_list_push(scratch.arena, &block_list, block); - if(read_size != stride || (block.size+1 <= read_size && block.str[block.size] == 0)) - { - break; - } - } - String8 result = str8_list_join(arena, &block_list, 0); - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Process Launcher Helpers - -internal OS_Handle -os_cmd_line_launch(String8 string) -{ - Temp scratch = scratch_begin(0, 0); - U8 split_chars[] = {' '}; - String8List parts = str8_split(scratch.arena, string, split_chars, ArrayCount(split_chars), 0); - OS_Handle handle = {0}; - if(parts.node_count != 0) - { - // rjf: unpack exe part - String8 exe = parts.first->string; - String8 exe_folder = str8_chop_last_slash(exe); - if(exe_folder.size == 0) - { - exe_folder = os_get_current_path(scratch.arena); - } - - // rjf: find stdout delimiter - String8Node *stdout_delimiter_n = 0; - for(String8Node *n = parts.first; n != 0; n = n->next) - { - if(str8_match(n->string, str8_lit(">"), 0)) - { - stdout_delimiter_n = n; - break; - } - } - - // rjf: read stdout path - String8 stdout_path = {0}; - if(stdout_delimiter_n && stdout_delimiter_n->next) - { - stdout_path = stdout_delimiter_n->next->string; - } - - // rjf: open stdout handle - OS_Handle stdout_handle = {0}; - if(stdout_path.size != 0) - { - OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path); - os_file_close(file); - stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdout_path); - } - - // rjf: form command line - String8List cmdline = {0}; - for(String8Node *n = parts.first; n != stdout_delimiter_n && n != 0; n = n->next) - { - str8_list_push(scratch.arena, &cmdline, n->string); - } - - // rjf: launch - OS_ProcessLaunchParams params = {0}; - params.cmd_line = cmdline; - params.path = exe_folder; - params.inherit_env = 1; - params.stdout_file = stdout_handle; - handle = os_process_launch(¶ms); - - // rjf: close stdout handle - { - if(stdout_path.size != 0) - { - os_file_close(stdout_handle); - } - } - } - scratch_end(scratch); - return handle; -} - -internal OS_Handle -os_cmd_line_launchf(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - OS_Handle result = os_cmd_line_launch(string); - va_end(args); - scratch_end(scratch); - return result; -} - diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h deleted file mode 100644 index 2731228f..00000000 --- a/src/os/core/os_core.h +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_CORE_H -#define OS_CORE_H - -//////////////////////////////// -//~ rjf: System Info - -typedef struct OS_SystemInfo OS_SystemInfo; -struct OS_SystemInfo -{ - U32 logical_processor_count; - U64 page_size; - U64 large_page_size; - U64 allocation_granularity; - String8 machine_name; -}; - -//////////////////////////////// -//~ rjf: Process Info - -typedef struct OS_ProcessInfo OS_ProcessInfo; -struct OS_ProcessInfo -{ - U32 pid; - B32 large_pages_allowed; - String8 binary_path; - String8 initial_path; - String8 user_program_data_path; - String8List module_load_paths; - String8List environment; -}; - -//////////////////////////////// -//~ rjf: Access Flags - -typedef U32 OS_AccessFlags; -enum -{ - OS_AccessFlag_Read = (1<<0), - OS_AccessFlag_Write = (1<<1), - OS_AccessFlag_Execute = (1<<2), - OS_AccessFlag_Append = (1<<3), - OS_AccessFlag_ShareRead = (1<<4), - OS_AccessFlag_ShareWrite = (1<<5), - OS_AccessFlag_Inherited = (1<<6), -}; - -//////////////////////////////// -//~ rjf: Files - -typedef U32 OS_FileIterFlags; -enum -{ - OS_FileIterFlag_SkipFolders = (1 << 0), - OS_FileIterFlag_SkipFiles = (1 << 1), - OS_FileIterFlag_SkipHiddenFiles = (1 << 2), - OS_FileIterFlag_Done = (1 << 31), -}; - -typedef struct OS_FileIter OS_FileIter; -struct OS_FileIter -{ - OS_FileIterFlags flags; - U8 memory[800]; -}; - -typedef struct OS_FileInfo OS_FileInfo; -struct OS_FileInfo -{ - String8 name; - FileProperties props; -}; - -// nick: on-disk file identifier -typedef struct OS_FileID OS_FileID; -struct OS_FileID -{ - U64 v[3]; -}; - -//////////////////////////////// -//~ rjf: Handle Type - -typedef struct OS_Handle OS_Handle; -struct OS_Handle -{ - U64 u64[1]; -}; - -typedef struct OS_HandleNode OS_HandleNode; -struct OS_HandleNode -{ - OS_HandleNode *next; - OS_Handle v; -}; - -typedef struct OS_HandleList OS_HandleList; -struct OS_HandleList -{ - OS_HandleNode *first; - OS_HandleNode *last; - U64 count; -}; - -typedef struct OS_HandleArray OS_HandleArray; -struct OS_HandleArray -{ - OS_Handle *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Process Launch Parameters - -typedef struct OS_ProcessLaunchParams OS_ProcessLaunchParams; -struct OS_ProcessLaunchParams -{ - String8List cmd_line; - String8 path; - String8List env; - B32 inherit_env; - B32 debug_subprocesses; - B32 consoleless; - OS_Handle stdout_file; - OS_Handle stderr_file; - OS_Handle stdin_file; -}; - -//////////////////////////////// -//~ rjf: Handle Type Functions (Helpers, Implemented Once) - -internal OS_Handle os_handle_zero(void); -internal B32 os_handle_match(OS_Handle a, OS_Handle b); -internal void os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle); -internal OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list); - -//////////////////////////////// -//~ rjf: Filesystem Helpers (Helpers, Implemented Once) - -internal String8 os_data_from_file_path(Arena *arena, String8 path); -internal B32 os_write_data_to_file_path(String8 path, String8 data); -internal B32 os_write_data_list_to_file_path(String8 path, String8List list); -internal B32 os_append_data_to_file_path(String8 path, String8 data); -internal OS_FileID os_id_from_file_path(String8 path); -internal S64 os_file_id_compare(OS_FileID a, OS_FileID b); -internal String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range); -internal String8 os_file_read_cstring(Arena *arena, OS_Handle file, U64 off); - -//////////////////////////////// -//~ rjf: Process Launcher Helpers - -internal OS_Handle os_cmd_line_launch(String8 string); -internal OS_Handle os_cmd_line_launchf(char *fmt, ...); - -//////////////////////////////// -//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) - -internal OS_SystemInfo *os_get_system_info(void); -internal OS_ProcessInfo *os_get_process_info(void); -internal String8 os_get_current_path(Arena *arena); -internal U32 os_get_process_start_time_unix(void); - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -//- rjf: basic -internal void *os_reserve(U64 size); -internal B32 os_commit(void *ptr, U64 size); -internal void os_decommit(void *ptr, U64 size); -internal void os_release(void *ptr, U64 size); - -//- rjf: large pages -internal void *os_reserve_large(U64 size); -internal B32 os_commit_large(void *ptr, U64 size); - -//////////////////////////////// -//~ rjf: @os_hooks Thread Info (Implemented Per-OS) - -internal U32 os_tid(void); -internal void os_set_thread_name(String8 string); - -//////////////////////////////// -//~ rjf: @os_hooks Aborting (Implemented Per-OS) - -internal void os_abort(S32 exit_code); - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files -internal OS_Handle os_file_open(OS_AccessFlags flags, String8 path); -internal void os_file_close(OS_Handle file); -internal U64 os_file_read(OS_Handle file, Rng1U64 rng, void *out_data); -#define os_file_read_struct(f, off, ptr) os_file_read((f), r1u64((off), (off)+sizeof(*(ptr))), (ptr)) -internal U64 os_file_write(OS_Handle file, Rng1U64 rng, void *data); -internal B32 os_file_set_times(OS_Handle file, DateTime time); -internal FileProperties os_properties_from_file(OS_Handle file); -internal OS_FileID os_id_from_file(OS_Handle file); -internal B32 os_file_reserve_size(OS_Handle file, U64 size); -internal B32 os_delete_file_at_path(String8 path); -internal B32 os_copy_file_path(String8 dst, String8 src); -internal B32 os_move_file_path(String8 dst, String8 src); -internal String8 os_full_path_from_path(Arena *arena, String8 path); -internal B32 os_file_path_exists(String8 path); -internal B32 os_folder_path_exists(String8 path); -internal FileProperties os_properties_from_file_path(String8 path); - -//- rjf: file maps -internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file); -internal void os_file_map_close(OS_Handle map); -internal void * os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range); -internal void os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range); - -//- rjf: directory iteration -internal OS_FileIter *os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags); -internal B32 os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out); -internal void os_file_iter_end(OS_FileIter *iter); - -//- rjf: directory creation -internal B32 os_make_directory(String8 path); - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle os_shared_memory_alloc(U64 size, String8 name); -internal OS_Handle os_shared_memory_open(String8 name); -internal void os_shared_memory_close(OS_Handle handle); -internal void * os_shared_memory_view_open(OS_Handle handle, Rng1U64 range); -internal void os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range); - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal U64 os_now_microseconds(void); -internal U32 os_now_unix(void); -internal DateTime os_now_universal_time(void); -internal DateTime os_universal_time_from_local(DateTime *local_time); -internal DateTime os_local_time_from_universal(DateTime *universal_time); -internal void os_sleep_milliseconds(U32 msec); - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal OS_Handle os_process_launch(OS_ProcessLaunchParams *params); -internal B32 os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out); -internal void os_process_detach(OS_Handle handle); -internal B32 os_process_kill(OS_Handle handle); - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal Thread os_thread_launch(ThreadEntryPointFunctionType *f, void *p); -internal B32 os_thread_join(Thread handle, U64 endt_us); -internal void os_thread_detach(Thread handle); - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -//- rjf: recursive mutexes -internal Mutex os_mutex_alloc(void); -internal void os_mutex_release(Mutex mutex); -internal void os_mutex_take(Mutex mutex); -internal void os_mutex_drop(Mutex mutex); - -//- rjf: reader/writer mutexes -internal RWMutex os_rw_mutex_alloc(void); -internal void os_rw_mutex_release(RWMutex mutex); -internal void os_rw_mutex_take(RWMutex mutex, B32 write_mode); -internal void os_rw_mutex_drop(RWMutex mutex, B32 write_mode); - -//- rjf: condition variables -internal CondVar os_cond_var_alloc(void); -internal void os_cond_var_release(CondVar cv); -// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout -internal B32 os_cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us); -internal B32 os_cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us); -internal void os_cond_var_signal(CondVar cv); -internal void os_cond_var_broadcast(CondVar cv); - -//- rjf: cross-process semaphores -internal Semaphore os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name); -internal void os_semaphore_release(Semaphore semaphore); -internal Semaphore os_semaphore_open(String8 name); -internal void os_semaphore_close(Semaphore semaphore); -internal B32 os_semaphore_take(Semaphore semaphore, U64 endt_us); -internal void os_semaphore_drop(Semaphore semaphore); - -//- rjf: barriers -internal Barrier os_barrier_alloc(U64 count); -internal void os_barrier_release(Barrier barrier); -internal void os_barrier_wait(Barrier barrier); - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle os_library_open(String8 path); -internal void os_library_close(OS_Handle lib); -internal VoidProc *os_library_load_proc(OS_Handle lib, String8 name); - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void os_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr); - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal Guid os_make_guid(void); - -//////////////////////////////// -//~ rjf: @os_hooks Entry Points (Implemented Per-OS) - -// NOTE(rjf): The implementation of `os_core` will define low-level entry -// points if BUILD_ENTRY_DEFINING_UNIT is defined to 1. These will call -// into the standard codebase program entry points, named "entry_point". - -#if BUILD_ENTRY_DEFINING_UNIT -raddbg_entry_point(entry_point); -internal no_inline void entry_point(CmdLine *cmdline); -#endif - -#endif // OS_CORE_H diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c deleted file mode 100644 index 6b216aa1..00000000 --- a/src/os/core/win32/os_core_win32.c +++ /dev/null @@ -1,1765 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) - -internal OS_SystemInfo * -os_get_system_info(void) -{ - return &os_w32_state.system_info; -} - -internal OS_ProcessInfo * -os_get_process_info(void) -{ - return &os_w32_state.process_info; -} - -internal String8 -os_get_current_path(Arena *arena) -{ - Temp scratch = scratch_begin(&arena, 1); - DWORD length = GetCurrentDirectoryW(0, 0); - U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1); - length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory); - String8 name = str8_from_16(arena, str16(memory, length)); - scratch_end(scratch); - return name; -} - -internal U32 -os_get_process_start_time_unix(void) -{ - HANDLE handle = GetCurrentProcess(); - FILETIME start_time = {0}; - FILETIME exit_time; - FILETIME kernel_time; - FILETIME user_time; - if(GetProcessTimes(handle, &start_time, &exit_time, &kernel_time, &user_time)) - { - return os_w32_unix_time_from_file_time(start_time); - } - return 0; -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -//- rjf: basic - -internal void * -os_reserve(U64 size) -{ - void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); - return result; -} - -internal B32 -os_commit(void *ptr, U64 size) -{ - B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0); - if (w32_rio_functions.RIORegisterBuffer) - { - // wine does not implement these functions - w32_rio_functions.RIODeregisterBuffer(w32_rio_functions.RIORegisterBuffer(ptr, size)); - } -#if PROFILE_TELEMETRY - tmAlloc(0, ptr, size / 1024, "Win32 Commit"); -#endif - return result; -} - -internal void -os_decommit(void *ptr, U64 size) -{ - VirtualFree(ptr, size, MEM_DECOMMIT); -#if PROFILE_TELEMETRY - tmFree(0, ptr); -#endif -} - -internal void -os_release(void *ptr, U64 size) -{ - // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes. - VirtualFree(ptr, 0, MEM_RELEASE); -} - -//- rjf: large pages - -internal void * -os_reserve_large(U64 size) -{ - // we commit on reserve because windows - void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE); - return result; -} - -internal B32 -os_commit_large(void *ptr, U64 size) -{ - return 1; -} - -//////////////////////////////// -//~ rjf: @os_hooks Thread Info (Implemented Per-OS) - -internal U32 -os_tid(void) -{ - DWORD id = GetCurrentThreadId(); - return (U32)id; -} - -internal void -os_set_thread_name(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - - // rjf: windows 10 style - if(w32_SetThreadDescription_func) - { - String16 name16 = str16_from_8(scratch.arena, name); - HRESULT hr = w32_SetThreadDescription_func(GetCurrentThread(), (WCHAR*)name16.str); - } - - // rjf: raise-exception style - { - String8 name_copy = push_str8_copy(scratch.arena, name); -#pragma pack(push,8) - typedef struct THREADNAME_INFO THREADNAME_INFO; - struct THREADNAME_INFO - { - U32 dwType; // Must be 0x1000. - char *szName; // Pointer to name (in user addr space). - U32 dwThreadID; // Thread ID (-1=caller thread). - U32 dwFlags; // Reserved for future use, must be zero. - }; -#pragma pack(pop) - THREADNAME_INFO info; - info.dwType = 0x1000; - info.szName = (char *)name_copy.str; - info.dwThreadID = os_tid(); - info.dwFlags = 0; -#pragma warning(push) -#pragma warning(disable: 6320 6322) - __try - { - RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } -#pragma warning(pop) - } - - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: @os_hooks Aborting (Implemented Per-OS) - -internal void -os_abort(S32 exit_code) -{ - ExitProcess(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - OS_Handle result = {0}; - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD access_flags = 0; - DWORD share_mode = 0; - DWORD creation_disposition = OPEN_EXISTING; - SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0}; - if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;} - if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;} - if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} - if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;} - if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;} - if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;} - if(flags & OS_AccessFlag_Append) {creation_disposition = OPEN_ALWAYS; access_flags |= FILE_APPEND_DATA; } - if(flags & OS_AccessFlag_Inherited) - { - security_attributes.bInheritHandle = 1; - } - HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, &security_attributes, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0); - if(file != INVALID_HANDLE_VALUE) - { - result.u64[0] = (U64)file; - } - else - { - DWORD err = GetLastError(); - (void)err; - } - scratch_end(scratch); - return result; -} - -internal void -os_file_close(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return; } - HANDLE handle = (HANDLE)file.u64[0]; - BOOL result = CloseHandle(handle); - (void)result; -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - - HANDLE handle = (HANDLE)file.u64[0]; - U8 *ptr = out_data; - U64 off = rng.min; - while(off != rng.max) - { - U64 amt64 = rng.max - off; - U32 amt32 = (U32)Min(MB(32), amt64); - DWORD read_size = 0; - OVERLAPPED overlapped = { .Offset = (U32)off, .OffsetHigh = (U32)(off >> 32) }; - if( ! ReadFile(handle, ptr, amt32, &read_size, &overlapped)) - { - break; - } - ptr += read_size; - off += read_size; - } - - U64 total_read_size = off - rng.min; - return total_read_size; -} - -internal U64 -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - HANDLE win_handle = (HANDLE)file.u64[0]; - U64 src_off = 0; - U64 dst_off = rng.min; - U64 total_write_size = dim_1u64(rng); - for(;;) - { - void *bytes_src = (U8 *)data + src_off; - U64 bytes_left = total_write_size - src_off; - DWORD write_size = Min(MB(1), bytes_left); - DWORD bytes_written = 0; - OVERLAPPED overlapped = {0}; - overlapped.Offset = (dst_off&0x00000000ffffffffull); - overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32; - BOOL success = WriteFile(win_handle, bytes_src, write_size, &bytes_written, &overlapped); - if(success == 0) - { - break; - } - src_off += bytes_written; - dst_off += bytes_written; - if(bytes_left == 0) - { - break; - } - } - return src_off; -} - -internal B32 -os_file_set_time(OS_Handle file, DateTime time) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - B32 result = 0; - HANDLE handle = (HANDLE)file.u64[0]; - SYSTEMTIME system_time = {0}; - os_w32_system_time_from_date_time(&system_time, &time); - FILETIME file_time = {0}; - result = (SystemTimeToFileTime(&system_time, &file_time) && - SetFileTime(handle, &file_time, &file_time, &file_time)); - return result; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { FileProperties r = {0}; return r; } - FileProperties props = {0}; - HANDLE handle = (HANDLE)file.u64[0]; - BY_HANDLE_FILE_INFORMATION info; - BOOL info_good = GetFileInformationByHandle(handle, &info); - if(info_good) - { - U32 size_lo = info.nFileSizeLow; - U32 size_hi = info.nFileSizeHigh; - props.size = (U64)size_lo | (((U64)size_hi)<<32); - os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); - os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); - props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); - } - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { OS_FileID r = {0}; return r; } - OS_FileID result = {0}; - HANDLE handle = (HANDLE)file.u64[0]; - BY_HANDLE_FILE_INFORMATION info; - BOOL is_ok = GetFileInformationByHandle(handle, &info); - if(is_ok) - { - result.v[0] = info.dwVolumeSerialNumber; - result.v[1] = info.nFileIndexLow; - result.v[2] = info.nFileIndexHigh; - } - return result; -} - -internal B32 -os_file_reserve_size(OS_Handle file, U64 size) -{ - HANDLE handle = (HANDLE)file.u64[0]; - - FILE_ALLOCATION_INFO alloc_info = {0}; - alloc_info.AllocationSize.LowPart = size & max_U32; - alloc_info.AllocationSize.HighPart = (size >> 32) & max_U32; - - BOOL is_reserved = SetFileInformationByHandle(handle, FileAllocationInfo, &alloc_info, sizeof(alloc_info)); - return is_reserved; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - B32 result = DeleteFileW((WCHAR*)path16.str); - scratch_end(scratch); - return result; -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - Temp scratch = scratch_begin(0, 0); - String16 dst16 = str16_from_8(scratch.arena, dst); - String16 src16 = str16_from_8(scratch.arena, src); - B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0); - scratch_end(scratch); - return result; -} - -internal B32 -os_move_file_path(String8 dst, String8 src) -{ - Temp scratch = scratch_begin(0, 0); - String16 dst16 = str16_from_8(scratch.arena, dst); - String16 src16 = str16_from_8(scratch.arena, src); - B32 result = MoveFileW((WCHAR*)src16.str, (WCHAR*)dst16.str); - scratch_end(scratch); - return result; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - Temp scratch = scratch_begin(&arena, 1); - DWORD buffer_size = Max(MAX_PATH, path.size * 2) + 1; - String16 path16 = str16_from_8(scratch.arena, path); - WCHAR *buffer = push_array_no_zero(scratch.arena, WCHAR, buffer_size); - DWORD path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL); - if(path16_size > buffer_size) - { - arena_pop(scratch.arena, buffer_size); - buffer_size = path16_size + 1; - buffer = push_array_no_zero(scratch.arena, WCHAR, buffer_size); - path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL); - } - String8 full_path = str8_from_16(arena, str16((U16*)buffer, path16_size)); - scratch_end(scratch); - return full_path; -} - -internal B32 -os_file_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0,0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); - B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY); - scratch_end(scratch); - return exists; -} - -internal B32 -os_folder_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0,0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); - B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && (attributes & FILE_ATTRIBUTE_DIRECTORY); - scratch_end(scratch); - return exists; -} - -internal FileProperties -os_properties_from_file_path(String8 path) -{ - WIN32_FIND_DATAW find_data = {0}; - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data); - FileProperties props = {0}; - if(handle != INVALID_HANDLE_VALUE) - { - props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow); - os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime); - os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime); - props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes); - } - else - { - Temp scratch = scratch_begin(0, 0); - WCHAR buffer[512] = {0}; - DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); - U64 last_slash_pos = 0; - for(;last_slash_pos < path.size; last_slash_pos = str8_find_needle(path, last_slash_pos+1, str8_lit("/"), StringMatchFlag_SlashInsensitive)); - String8 path_trimmed = str8_prefix(path, last_slash_pos); - for(U64 off = 0; off < (U64)length;) - { - String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); - off += next_drive_string_16.size+1; - String8 next_drive_string = str8_from_16(scratch.arena, next_drive_string_16); - next_drive_string = str8_chop_last_slash(next_drive_string); - if(str8_match(path_trimmed, next_drive_string, StringMatchFlag_CaseInsensitive)) - { - props.flags |= FilePropertyFlag_IsFolder; - break; - } - } - scratch_end(scratch); - } - FindClose(handle); - scratch_end(scratch); - return props; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - OS_Handle map = {0}; - { - HANDLE file_handle = (HANDLE)file.u64[0]; - DWORD protect_flags = 0; - { - switch(flags) - { - default:{}break; - case OS_AccessFlag_Read: - {protect_flags = PAGE_READONLY;}break; - case OS_AccessFlag_Write: - case OS_AccessFlag_Read|OS_AccessFlag_Write: - {protect_flags = PAGE_READWRITE;}break; - case OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Execute: - {protect_flags = PAGE_EXECUTE_READ;}break; - case OS_AccessFlag_Execute|OS_AccessFlag_Write|OS_AccessFlag_Read: - case OS_AccessFlag_Execute|OS_AccessFlag_Write: - {protect_flags = PAGE_EXECUTE_READWRITE;}break; - } - } - HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0); - map.u64[0] = (U64)map_handle; - } - return map; -} - -internal void -os_file_map_close(OS_Handle map) -{ - HANDLE handle = (HANDLE)map.u64[0]; - BOOL result = CloseHandle(handle); - (void)result; -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - HANDLE handle = (HANDLE)map.u64[0]; - U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0); - U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32); - U64 size = dim_1u64(range); - DWORD access_flags = 0; - { - switch(flags) - { - default:{}break; - case OS_AccessFlag_Read: - { - access_flags = FILE_MAP_READ; - }break; - case OS_AccessFlag_Write: - { - access_flags = FILE_MAP_WRITE; - }break; - case OS_AccessFlag_Read|OS_AccessFlag_Write: - { - access_flags = FILE_MAP_ALL_ACCESS; - }break; - case OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Execute: - case OS_AccessFlag_Write|OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Write|OS_AccessFlag_Execute: - { - access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE; - }break; - } - } - void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size); - return result; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) -{ - BOOL result = UnmapViewOfFile(ptr); - (void)result; -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit("\\*")); - String16 path16 = str16_from_8(scratch.arena, path_with_wildcard); - OS_FileIter *iter = push_array(arena, OS_FileIter, 1); - iter->flags = flags; - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; - if(path.size == 0) - { - w32_iter->is_volume_iter = 1; - WCHAR buffer[512] = {0}; - DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); - String8List drive_strings = {0}; - for(U64 off = 0; off < (U64)length;) - { - String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); - off += next_drive_string_16.size+1; - String8 next_drive_string = str8_from_16(arena, next_drive_string_16); - next_drive_string = str8_chop_last_slash(next_drive_string); - str8_list_push(scratch.arena, &drive_strings, next_drive_string); - } - w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings); - w32_iter->drive_strings_iter_idx = 0; - } - else - { - w32_iter->handle = FindFirstFileExW((WCHAR*)path16.str, FindExInfoBasic, &w32_iter->find_data, FindExSearchNameMatch, 0, FIND_FIRST_EX_LARGE_FETCH); - } - scratch_end(scratch); - return iter; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - B32 result = 0; - OS_FileIterFlags flags = iter->flags; - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; - switch(w32_iter->is_volume_iter) - { - //- rjf: file iteration - default: - case 0: - { - if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE) - { - do - { - // check is usable - B32 usable_file = 1; - - WCHAR *file_name = w32_iter->find_data.cFileName; - DWORD attributes = w32_iter->find_data.dwFileAttributes; - if (file_name[0] == '.'){ - if (flags & OS_FileIterFlag_SkipHiddenFiles){ - usable_file = 0; - } - else if (file_name[1] == 0){ - usable_file = 0; - } - else if (file_name[1] == '.' && file_name[2] == 0){ - usable_file = 0; - } - } - if (attributes & FILE_ATTRIBUTE_DIRECTORY){ - if (flags & OS_FileIterFlag_SkipFolders){ - usable_file = 0; - } - } - else{ - if (flags & OS_FileIterFlag_SkipFiles){ - usable_file = 0; - } - } - - // emit if usable - if (usable_file){ - info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name)); - info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32); - os_w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); - os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); - info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes); - result = 1; - if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){ - iter->flags |= OS_FileIterFlag_Done; - } - break; - } - }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data)); - } - }break; - - //- rjf: volume iteration - case 1: - { - result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count; - if(result != 0) - { - MemoryZeroStruct(info_out); - info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx]; - info_out->props.flags |= FilePropertyFlag_IsFolder; - w32_iter->drive_strings_iter_idx += 1; - } - }break; - } - if(!result) - { - iter->flags |= OS_FileIterFlag_Done; - } - return result; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; - HANDLE zero_handle; - MemoryZeroStruct(&zero_handle); - if(!MemoryMatchStruct(&zero_handle, &w32_iter->handle)) - { - FindClose(w32_iter->handle); - } -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, path); - WIN32_FILE_ATTRIBUTE_DATA attributes = {0}; - GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes); - if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - result = 1; - } - else if(CreateDirectoryW((WCHAR*)name16.str, 0)) - { - result = 1; - } - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE, - 0, - PAGE_READWRITE, - (U32)((size & 0xffffffff00000000) >> 32), - (U32)((size & 0x00000000ffffffff)), - (WCHAR *)name16.str); - OS_Handle result = {(U64)file}; - scratch_end(scratch); - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str); - OS_Handle result = {(U64)file}; - scratch_end(scratch); - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - HANDLE file = (HANDLE)(handle.u64[0]); - CloseHandle(file); -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - HANDLE file = (HANDLE)(handle.u64[0]); - U64 offset = range.min; - U64 size = range.max-range.min; - void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS, - (U32)((offset & 0xffffffff00000000) >> 32), - (U32)((offset & 0x00000000ffffffff)), - size); - return ptr; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) -{ - UnmapViewOfFile(ptr); -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal U64 -os_now_microseconds(void) -{ - U64 result = 0; - LARGE_INTEGER large_int_counter; - if(QueryPerformanceCounter(&large_int_counter)) - { - result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution; - } - return result; -} - -internal U32 -os_now_unix(void) -{ - FILETIME file_time; - GetSystemTimeAsFileTime(&file_time); - U32 unix_time = os_w32_unix_time_from_file_time(file_time); - return unix_time; -} - -internal DateTime -os_now_universal_time(void) -{ - SYSTEMTIME systime = {0}; - GetSystemTime(&systime); - DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); - return result; -} - -internal DateTime -os_universal_time_from_local(DateTime *date_time) -{ - SYSTEMTIME systime = {0}; - os_w32_system_time_from_date_time(&systime, date_time); - FILETIME ftime = {0}; - SystemTimeToFileTime(&systime, &ftime); - FILETIME ftime_local = {0}; - LocalFileTimeToFileTime(&ftime, &ftime_local); - FileTimeToSystemTime(&ftime_local, &systime); - DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); - return result; -} - -internal DateTime -os_local_time_from_universal(DateTime *date_time) -{ - SYSTEMTIME systime = {0}; - os_w32_system_time_from_date_time(&systime, date_time); - FILETIME ftime = {0}; - SystemTimeToFileTime(&systime, &ftime); - FILETIME ftime_local = {0}; - FileTimeToLocalFileTime(&ftime, &ftime_local); - FileTimeToSystemTime(&ftime_local, &systime); - DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); - return result; -} - -internal void -os_sleep_milliseconds(U32 msec) -{ - Sleep(msec); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal OS_Handle -os_process_launch(OS_ProcessLaunchParams *params) -{ - OS_Handle result = {0}; - Temp scratch = scratch_begin(0, 0); - - //- rjf: form full command string - String8 cmd = {0}; - { - StringJoin join_params = {0}; - join_params.pre = str8_lit("\""); - join_params.sep = str8_lit("\" \""); - join_params.post = str8_lit("\""); - cmd = str8_list_join(scratch.arena, ¶ms->cmd_line, &join_params); - } - - //- rjf: form environment - B32 use_null_env_arg = 0; - String8 env = {0}; - { - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - String8List all_opts = params->env; - if(params->inherit_env != 0) - { - if(all_opts.node_count != 0) - { - MemoryZeroStruct(&all_opts); - for(String8Node *n = params->env.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - } - else - { - use_null_env_arg = 1; - } - } - if(use_null_env_arg == 0) - { - env = str8_list_join(scratch.arena, &all_opts, &join_params2); - } - } - - //- rjf: utf-8 -> utf-16 - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, params->path); - String16 env16 = {0}; - if(use_null_env_arg == 0) - { - env16 = str16_from_8(scratch.arena, env); - } - - //- rjf: determine creation flags - DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; - if(params->consoleless) - { - creation_flags |= CREATE_NO_WINDOW; - } - - //- rjf: launch - BOOL inherit_handles = 0; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - if(!os_handle_match(params->stdout_file, os_handle_zero())) - { - HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; - startup_info.hStdOutput = stdout_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - if(!os_handle_match(params->stderr_file, os_handle_zero())) - { - HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; - startup_info.hStdError = stderr_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - if(!os_handle_match(params->stdin_file, os_handle_zero())) - { - HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; - startup_info.hStdInput = stdin_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - PROCESS_INFORMATION process_info = {0}; - if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, inherit_handles, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) - { - result.u64[0] = (U64)process_info.hProcess; - CloseHandle(process_info.hThread); - } - - scratch_end(scratch); - return result; -} - -internal B32 -os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out) -{ - HANDLE process = (HANDLE)(handle.u64[0]); - DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - DWORD result = WaitForSingleObject(process, sleep_ms); - B32 process_joined = (result == WAIT_OBJECT_0); - if(process_joined && exit_code_out) - { - DWORD exit_code = 0; - if(GetExitCodeProcess(process, &exit_code)) - { - *exit_code_out = exit_code; - } - } - if(process_joined) - { - CloseHandle(process); - } - return process_joined; -} - -internal B32 -os_process_kill(OS_Handle handle) -{ - HANDLE process = (HANDLE)handle.u64[0]; - BOOL was_terminated = TerminateProcess(process, 999); - return was_terminated; -} - -internal void -os_process_detach(OS_Handle handle) -{ - HANDLE process = (HANDLE)(handle.u64[0]); - CloseHandle(process); -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal Thread -os_thread_launch(ThreadEntryPointFunctionType *f, void *p) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread); - entity->thread.func = f; - entity->thread.ptr = p; - entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid); - Thread result = {IntFromPtr(entity)}; - return result; -} - -internal B32 -os_thread_join(Thread handle, U64 endt_us) -{ - DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(handle.u64[0]); - DWORD wait_result = WAIT_OBJECT_0; - if(entity != 0) - { - wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); - CloseHandle(entity->thread.handle); - os_w32_entity_release(entity); - } - return (wait_result == WAIT_OBJECT_0); -} - -internal void -os_thread_detach(Thread thread) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]); - if(entity != 0) - { - CloseHandle(entity->thread.handle); - os_w32_entity_release(entity); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -//- rjf: mutexes - -internal Mutex -os_mutex_alloc(void) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex); - InitializeCriticalSection(&entity->mutex); - Mutex result = {IntFromPtr(entity)}; - return result; -} - -internal void -os_mutex_release(Mutex mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); - DeleteCriticalSection(&entity->mutex); - os_w32_entity_release(entity); -} - -internal void -os_mutex_take(Mutex mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); - EnterCriticalSection(&entity->mutex); -} - -internal void -os_mutex_drop(Mutex mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); - LeaveCriticalSection(&entity->mutex); -} - -//- rjf: reader/writer mutexes - -internal RWMutex -os_rw_mutex_alloc(void) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex); - InitializeSRWLock(&entity->rw_mutex); - RWMutex result = {IntFromPtr(entity)}; - return result; -} - -internal void -os_rw_mutex_release(RWMutex rw_mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - os_w32_entity_release(entity); -} - -internal void -os_rw_mutex_take(RWMutex rw_mutex, B32 write_mode) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - if(write_mode) - { - AcquireSRWLockExclusive(&entity->rw_mutex); - } - else - { - AcquireSRWLockShared(&entity->rw_mutex); - } -} - -internal void -os_rw_mutex_drop(RWMutex rw_mutex, B32 write_mode) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - if(write_mode) - { - ReleaseSRWLockExclusive(&entity->rw_mutex); - } - else - { - ReleaseSRWLockShared(&entity->rw_mutex); - } -} - -//- rjf: condition variables - -internal CondVar -os_cond_var_alloc(void) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable); - InitializeConditionVariable(&entity->cv); - CondVar result = {IntFromPtr(entity)}; - return result; -} - -internal void -os_cond_var_release(CondVar cv) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - os_w32_entity_release(entity); -} - -internal B32 -os_cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us) -{ - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if(sleep_ms > 0) - { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); - result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms); - } - return result; -} - -internal B32 -os_cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) -{ - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if(sleep_ms > 0) - { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); - result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, - write_mode ? 0 : CONDITION_VARIABLE_LOCKMODE_SHARED); - } - return result; -} - -internal void -os_cond_var_signal(CondVar cv) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - WakeConditionVariable(&entity->cv); -} - -internal void -os_cond_var_broadcast(CondVar cv) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - WakeAllConditionVariable(&entity->cv); -} - -//- rjf: cross-process semaphores - -internal Semaphore -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str); - Semaphore result = {(U64)handle}; - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_release(Semaphore semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - CloseHandle(handle); -} - -internal Semaphore -os_semaphore_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS, 0, (WCHAR *)name16.str); - Semaphore result = {(U64)handle}; - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_close(Semaphore semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - CloseHandle(handle); -} - -internal B32 -os_semaphore_take(Semaphore semaphore, U64 endt_us) -{ - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - HANDLE handle = (HANDLE)semaphore.u64[0]; - DWORD wait_result = WaitForSingleObject(handle, sleep_ms); - B32 result = (wait_result == WAIT_OBJECT_0); - return result; -} - -internal void -os_semaphore_drop(Semaphore semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - ReleaseSemaphore(handle, 1, 0); -} - -//- rjf: barriers - -internal Barrier -os_barrier_alloc(U64 count) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Barrier); - if(entity != 0) - { - BOOL init_good = InitializeSynchronizationBarrier(&entity->sb, count, -1); - (void)init_good; - } - Barrier result = {IntFromPtr(entity)}; - return result; -} - -internal void -os_barrier_release(Barrier barrier) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]); - if(entity != 0) - { - DeleteSynchronizationBarrier(&entity->sb); - os_w32_entity_release(entity); - } -} - -internal void -os_barrier_wait(Barrier barrier) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]); - if(entity != 0) - { - EnterSynchronizationBarrier(&entity->sb, 0); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - HMODULE mod = LoadLibraryW((LPCWSTR)path16.str); - OS_Handle result = { (U64)mod }; - scratch_end(scratch); - return result; -} - -internal VoidProc* -os_library_load_proc(OS_Handle lib, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - HMODULE mod = (HMODULE)lib.u64[0]; - name = push_str8_copy(scratch.arena, name); - VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str); - scratch_end(scratch); - return result; -} - -internal void -os_library_close(OS_Handle lib) -{ - HMODULE mod = (HMODULE)lib.u64[0]; - FreeLibrary(mod); -} - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void -os_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr) -{ - __try - { - func(ptr); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - if(fail_handler != 0) - { - fail_handler(ptr); - } - } -} - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal Guid -os_make_guid(void) -{ - Guid result; MemoryZeroStruct(&result); - UUID uuid; - RPC_STATUS rpc_status = UuidCreate(&uuid); - if(rpc_status == RPC_S_OK) - { - result.data1 = uuid.Data1; - result.data2 = uuid.Data2; - result.data3 = uuid.Data3; - MemoryCopyArray(result.data4, uuid.Data4); - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Entry Points (Implemented Per-OS) - -#include -#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside -#include - -internal B32 win32_g_is_quiet = 0; -internal B32 win32_g_gen_dump = 0; - -internal HRESULT WINAPI -win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data) -{ - if(msg == TDN_HYPERLINK_CLICKED) - { - ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL); - } - return S_OK; -} - -internal LONG WINAPI -win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) -{ - if(win32_g_is_quiet) - { - ExitProcess(1); - } - - static volatile LONG first = 0; - if(InterlockedCompareExchange(&first, 1, 0) != 0) - { - // prevent failures in other threads to popup same message box - // this handler just shows first thread that crashes - // we are terminating afterwards anyway - for (;;) Sleep(1000); - } - - WCHAR buffer[4096] = {0}; - int buflen = 0; - - DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode; - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code); - - // load dbghelp dynamically just in case if it is missing - BOOL (WINAPI *dbg_MiniDumpWriteDump)(HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam) = 0; - HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); - if(dbghelp) - { - DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions); - BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess); - BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, - LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, - PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, - PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); - PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase); - DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr); - BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol); - BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line); - BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo); - - *(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions"); - *(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW"); - *(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64"); - *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64"); - *(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64"); - *(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW"); - *(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64"); - *(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64"); - *(FARPROC*)&dbg_MiniDumpWriteDump = GetProcAddress(dbghelp, "MiniDumpWriteDump"); - - if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64) - { - HANDLE process = GetCurrentProcess(); - HANDLE thread = GetCurrentThread(); - CONTEXT context = *exception_ptrs->ContextRecord; - - WCHAR module_path[MAX_PATH]; - GetModuleFileNameW(NULL, module_path, ArrayCount(module_path)); - PathRemoveFileSpecW(module_path); - - dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); - if(dbg_SymInitializeW(process, module_path, TRUE)) - { - // check that raddbg.pdb file is good - B32 raddbg_pdb_valid = 0; - { - IMAGEHLP_MODULEW64 module = {0}; - module.SizeOfStruct = sizeof(module); - if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module)) - { - raddbg_pdb_valid = (module.SymType == SymPdb); - } - } - - if(!raddbg_pdb_valid) - { - buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, - L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\n"); - } - else - { - STACKFRAME64 frame = {0}; - DWORD image_type; -#if defined(_M_AMD64) - image_type = IMAGE_FILE_MACHINE_AMD64; - frame.AddrPC.Offset = context.Rip; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context.Rbp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context.Rsp; - frame.AddrStack.Mode = AddrModeFlat; -#elif defined(_M_ARM64) - image_type = IMAGE_FILE_MACHINE_ARM64; - frame.AddrPC.Offset = context.Pc; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context.Fp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context.Sp; - frame.AddrStack.Mode = AddrModeFlat; -#else -# error Arch not supported! -#endif - -#if BUILD_CONSOLE_INTERFACE - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); -#else - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, - L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" - L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); -#endif - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); - - U64 frame_offset = 0; - - if (frame.AddrPC.Offset == 0) - { - // if IP address is 0 then most likely we have called indirectly on NULL function pointer - // which means no useful stack unwinding will happen, because there's no unwind info for address 0 - // but we can try reading 8 bytes of return address from stack, and start unwinding there - - ULONG_PTR hi, lo; - GetCurrentThreadStackLimits(&lo, &hi); - if (frame.AddrStack.Offset >= lo && frame.AddrStack.Offset <= hi - sizeof(void*)) - { - frame.AddrPC.Offset = *(DWORD64*)frame.AddrStack.Offset - 1; - frame.AddrStack.Offset += sizeof(void*); -#if defined(_M_AMD64) - context.Rip = frame.AddrPC.Offset; - context.Rsp = frame.AddrStack.Offset; -#elif defined(_M_ARM64) - context.Pc = frame.AddrPC.Offset; - context.Sp = frame.AddrStack.Offset; -#endif - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"1. [NULL]\n"); - frame_offset = 1; - } - - for(U32 idx=0; ;idx++) - { - const U32 max_frames = 32; - if(idx == max_frames) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"..."); - break; - } - - if(!dbg_StackWalk64(image_type, process, thread, &frame, &context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) - { - break; - } - - U64 address = frame.AddrPC.Offset; - if(address == 0) - { - break; - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", frame_offset + idx + 1, address); - - struct { - SYMBOL_INFOW info; - WCHAR name[MAX_SYM_NAME]; - } symbol = {0}; - - symbol.info.SizeOfStruct = sizeof(symbol.info); - symbol.info.MaxNameLen = MAX_SYM_NAME; - - DWORD64 displacement = 0; - if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement); - - IMAGEHLP_LINEW64 line = {0}; - line.SizeOfStruct = sizeof(line); - - DWORD line_displacement = 0; - if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber); - } - } - else - { - IMAGEHLP_MODULEW64 module = {0}; - module.SizeOfStruct = sizeof(module); - if(dbg_SymGetModuleInfoW64(process, address, &module)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s", module.ModuleName); - } - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\n"); - } - } - } - } - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); - - B32 generate_crash_dump = win32_g_gen_dump; -#if BUILD_CONSOLE_INTERFACE - fwprintf(stderr, L"\n--- Fatal Exception ---\n"); - fwprintf(stderr, L"%s\n\n", buffer); -#else - int selected_button = 0; - TASKDIALOG_BUTTON generate_dump = {1, L"Generate Crash Dump File"}; - TASKDIALOGCONFIG dialog = {0}; - dialog.cbSize = sizeof(dialog); - dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; - dialog.pszMainIcon = TD_ERROR_ICON; - dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON; - dialog.pszWindowTitle = L"Fatal Exception"; - dialog.pszContent = buffer; - dialog.pfCallback = &win32_dialog_callback; - dialog.cButtons = 1; - dialog.pButtons = &generate_dump; - TaskDialogIndirect(&dialog, &selected_button, 0, 0); - generate_crash_dump = (selected_button == generate_dump.nButtonID); -#endif - - if(dbg_MiniDumpWriteDump && generate_crash_dump) - { - WCHAR dump_file_path[MAX_PATH] = {0}; - SHGetFolderPathW(0, CSIDL_DESKTOP, 0, 0, dump_file_path); - PathAppendW(dump_file_path, L"raddbg_crash_dump.dmp"); - HANDLE file = CreateFileW(dump_file_path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); - if (file != INVALID_HANDLE_VALUE) - { - MINIDUMP_EXCEPTION_INFORMATION info = {0}; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception_ptrs; - info.ClientPointers = FALSE; - BOOL dump_successful = dbg_MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, MiniDumpNormal, &info, 0, 0); - CloseHandle(file); - - if (dump_successful) - { -#if !BUILD_CONSOLE_INTERFACE - // opens explorer and selects file - SFGAOF flags = 0; - PIDLIST_ABSOLUTE list = 0; - if (SUCCEEDED(SHParseDisplayName(dump_file_path, NULL, &list, 0, &flags))) - { - SHOpenFolderAndSelectItems(list, 0, NULL, 0); - CoTaskMemFree(list); - } -#endif - } - } - } - - ExitProcess(1); -} - -#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside -#define OS_WINDOWS 1 - -internal void -w32_entry_point_caller(int argc, WCHAR **wargv) -{ - SetUnhandledExceptionFilter(&win32_exception_filter); - - //- rjf: dynamically load windows functions which are not guaranteed - // in all SDKs - { - HMODULE module = LoadLibraryA("kernel32.dll"); - w32_SetThreadDescription_func = (W32_SetThreadDescription_Type *)GetProcAddress(module, "SetThreadDescription"); - FreeLibrary(module); - } - - //- rjf: try to allow large pages if we can - B32 large_pages_allowed = 0; - { - HANDLE token; - if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) - { - LUID luid; - if(LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid)) - { - TOKEN_PRIVILEGES priv; - priv.PrivilegeCount = 1; - priv.Privileges[0].Luid = luid; - priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - large_pages_allowed = !!AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0); - } - CloseHandle(token); - } - } - - //- rjf: get RIO extension function table - { - // NOTE(mmozeiko): need to get function pointers to RIO functions, and that requires dummy socket - WSADATA WinSockData; - WSAStartup(MAKEWORD(2, 2), &WinSockData); - GUID guid = WSAID_MULTIPLE_RIO; - DWORD rio_byte = 0; - SOCKET Sock = socket(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP); - WSAIoctl(Sock, SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), (void**)&w32_rio_functions, sizeof(w32_rio_functions), &rio_byte, 0, 0); - closesocket(Sock); - } - - //- rjf: get system info - SYSTEM_INFO sysinfo = {0}; - GetSystemInfo(&sysinfo); - - //- rjf: set up non-dynamically-alloc'd state - // - // (we need to set up some basics before this layer can supply - // memory allocation primitives) - { - os_w32_state.microsecond_resolution = 1; - LARGE_INTEGER large_int_resolution; - if(QueryPerformanceFrequency(&large_int_resolution)) - { - os_w32_state.microsecond_resolution = large_int_resolution.QuadPart; - } - } - { - OS_SystemInfo *info = &os_w32_state.system_info; - info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors; - info->page_size = sysinfo.dwPageSize; - info->large_page_size = GetLargePageMinimum(); - info->allocation_granularity = sysinfo.dwAllocationGranularity; - } - { - OS_ProcessInfo *info = &os_w32_state.process_info; - info->large_pages_allowed = large_pages_allowed; - info->pid = GetCurrentProcessId(); - } - - //- rjf: extract arguments - Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32)); - char **argv = push_array(args_arena, char *, argc); - for(int i = 0; i < argc; i += 1) - { - String16 arg16 = str16_cstring((U16 *)wargv[i]); - String8 arg8 = str8_from_16(args_arena, arg16); - if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive) || - str8_match(arg8, str8_lit("-quiet"), StringMatchFlag_CaseInsensitive)) - { - win32_g_is_quiet = 1; - } - if(str8_match(arg8, str8_lit("--large_pages"), StringMatchFlag_CaseInsensitive) || - str8_match(arg8, str8_lit("-large_pages"), StringMatchFlag_CaseInsensitive)) - { - arena_default_flags = ArenaFlag_LargePages; - arena_default_reserve_size = Max(MB(64), os_w32_state.system_info.large_page_size); - arena_default_commit_size = arena_default_reserve_size; - } - if(str8_match(arg8, str8_lit("--gen_crash_dump"), StringMatchFlag_CaseInsensitive) || - str8_match(arg8, str8_lit("-gen_crash_dump"), StringMatchFlag_CaseInsensitive)) - { - win32_g_gen_dump = 1; - } - argv[i] = (char *)arg8.str; - } - - //- rjf: set up thread context - TCTX *tctx = tctx_alloc(); - tctx_select(tctx); - - //- rjf: set up dynamically-alloc'd state - Arena *arena = arena_alloc(); - { - os_w32_state.arena = arena; - { - OS_SystemInfo *info = &os_w32_state.system_info; - U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0}; - DWORD size = MAX_COMPUTERNAME_LENGTH + 1; - if(GetComputerNameA((char*)buffer, &size)) - { - info->machine_name = push_str8_copy(arena, str8(buffer, size)); - } - } - } - { - OS_ProcessInfo *info = &os_w32_state.process_info; - { - Temp scratch = scratch_begin(0, 0); - DWORD size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size); - String8 name8 = str8_from_16(scratch.arena, str16(buffer, length)); - String8 name_chopped = str8_chop_last_slash(name8); - info->binary_path = push_str8_copy(arena, name_chopped); - scratch_end(scratch); - } - info->initial_path = os_get_current_path(arena); - { - Temp scratch = scratch_begin(0, 0); - U64 size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer))) - { - info->user_program_data_path = str8_from_16(arena, str16_cstring(buffer)); - } - scratch_end(scratch); - } - { - WCHAR *this_proc_env = GetEnvironmentStringsW(); - U64 start_idx = 0; - for(U64 idx = 0;; idx += 1) - { - if(this_proc_env[idx] == 0) - { - if(start_idx == idx) - { - break; - } - else - { - String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); - String8 string = str8_from_16(arena, string16); - str8_list_push(arena, &info->environment, string); - start_idx = idx+1; - } - } - } - } - } - - //- rjf: set up entity storage - InitializeCriticalSection(&os_w32_state.entity_mutex); - os_w32_state.entity_arena = arena_alloc(); - - //- rjf: call into "real" entry point - main_thread_base_entry_point(argc, argv); -} - -#if BUILD_CONSOLE_INTERFACE -int wmain(int argc, WCHAR **argv) -{ - w32_entry_point_caller(argc, argv); - return 0; -} -#else -int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) -{ - CoInitializeEx(0, COINIT_APARTMENTTHREADED); - w32_entry_point_caller(__argc, __wargv); - return 0; -} -#endif diff --git a/src/os/os_inc.c b/src/os/os_inc.c deleted file mode 100644 index 555089ca..00000000 --- a/src/os/os_inc.c +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -// #include "os/core/os_core.c" -#if OS_FEATURE_GRAPHICAL -# include "os/gfx/os_gfx.c" -#endif - -#if OS_WINDOWS -// # include "os/core/win32/os_core_win32.c" -#elif OS_LINUX -# include "os/core/linux/os_core_linux.c" -#else -# error OS core layer not implemented for this operating system. -#endif - -#if OS_FEATURE_GRAPHICAL -# if OS_GFX_STUB -# include "os/gfx/stub/os_gfx_stub.c" -# elif OS_WINDOWS -# include "os/gfx/win32/os_gfx_win32.c" -# elif OS_LINUX -# include "os/gfx/linux/os_gfx_linux.c" -# else -# error OS graphical layer not implemented for this operating system. -# endif -#endif diff --git a/src/os/os_inc.h b/src/os/os_inc.h deleted file mode 100644 index 233b55d3..00000000 --- a/src/os/os_inc.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_INC_H -#define OS_INC_H - -#if !defined(OS_FEATURE_GRAPHICAL) -# define OS_FEATURE_GRAPHICAL 0 -#endif - -#if !defined(OS_GFX_STUB) -# define OS_GFX_STUB 0 -#endif - -// #include "os/core/os_core.h" -#if OS_FEATURE_GRAPHICAL -# include "os/gfx/os_gfx.h" -#endif - -#if OS_WINDOWS -// # include "os/core/win32/os_core_win32.h" -#elif OS_LINUX -# include "os/core/linux/os_core_linux.h" -#else -# error OS core layer not implemented for this operating system. -#endif - -#if OS_FEATURE_GRAPHICAL -# if OS_GFX_STUB -# include "os/gfx/stub/os_gfx_stub.h" -# elif OS_WINDOWS -# include "os/gfx/win32/os_gfx_win32.h" -# elif OS_LINUX -# include "os/gfx/linux/os_gfx_linux.h" -# else -# error OS graphical layer not implemented for this operating system. -# endif -#endif - -#endif // OS_INC_H diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index ee14fe07..816544f6 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -16,7 +16,6 @@ #include "linker/hash_table.h" #include "linker/lf_hash_table.h" #include "linker/base_ext/base_bit_array.h" -#include "os/os_inc.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" #include "coff/coff_inc.h" @@ -47,7 +46,6 @@ #include "linker/hash_table.c" #include "linker/lf_hash_table.c" #include "linker/base_ext/base_bit_array.c" -#include "os/os_inc.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" #include "coff/coff_inc.c" diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 7db1c57c..a6c1d83f 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -265,11 +265,11 @@ #include "linker/hash_table.h" #include "linker/lf_hash_table.h" #include "linker/base_ext/base_bit_array.h" -#include "os/os_inc.h" #include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" #include "mdesk/mdesk.h" +#include "window_manager/window_manager_inc.h" #include "config/config_inc.h" #include "content/content.h" #include "file_stream/file_stream.h" @@ -318,11 +318,11 @@ #include "linker/hash_table.c" #include "linker/lf_hash_table.c" #include "linker/base_ext/base_bit_array.c" -#include "os/os_inc.c" #include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" #include "mdesk/mdesk.c" +#include "window_manager/window_manager_inc.c" #include "config/config_inc.c" #include "content/content.c" #include "file_stream/file_stream.c" diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.c b/src/render/opengl/linux/egl/render_opengl_linux_egl.c index 0e8a6f1d..2df7024b 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.c +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.c @@ -79,7 +79,7 @@ r_ogl_os_init(CmdLine *cmdln) } internal R_Handle -r_ogl_os_window_equip(OS_Handle window) +r_ogl_os_window_equip(OS_Window window) { OS_LNX_Window *window_os = (OS_LNX_Window *)window.u64[0]; R_OGL_LNX_Window *w = r_ogl_lnx_state->free_window; @@ -163,7 +163,7 @@ r_ogl_os_window_equip(OS_Handle window) } internal void -r_ogl_os_window_unequip(OS_Handle os, R_Handle r) +r_ogl_os_window_unequip(OS_Window os, R_Handle r) { R_OGL_LNX_Window *w = (R_OGL_LNX_Window *)r.u64[0]; { @@ -173,7 +173,7 @@ r_ogl_os_window_unequip(OS_Handle os, R_Handle r) } internal void -r_ogl_os_select_window(OS_Handle os, R_Handle r) +r_ogl_os_select_window(OS_Window os, R_Handle r) { OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0]; R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0]; @@ -181,7 +181,7 @@ r_ogl_os_select_window(OS_Handle os, R_Handle r) } internal void -r_ogl_os_window_swap(OS_Handle os, R_Handle r) +r_ogl_os_window_swap(OS_Window os, R_Handle r) { OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0]; R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0]; diff --git a/src/render/opengl/linux/glx/render_opengl_linux_glx.c b/src/render/opengl/linux/glx/render_opengl_linux_glx.c index 6f835515..665403ea 100644 --- a/src/render/opengl/linux/glx/render_opengl_linux_glx.c +++ b/src/render/opengl/linux/glx/render_opengl_linux_glx.c @@ -79,27 +79,27 @@ r_ogl_os_init(CmdLine *cmdln) } internal R_Handle -r_ogl_os_window_equip(OS_Handle window) +r_ogl_os_window_equip(OS_Window window) { R_Handle result = {0}; return result; } internal void -r_ogl_os_window_unequip(OS_Handle os, R_Handle r) +r_ogl_os_window_unequip(OS_Window os, R_Handle r) { } internal void -r_ogl_os_select_window(OS_Handle os, R_Handle r) +r_ogl_os_select_window(OS_Window os, R_Handle r) { OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0]; glXMakeCurrent(os_lnx_gfx_state->display, w->window, r_ogl_lnx_ctx); } internal void -r_ogl_os_window_swap(OS_Handle os, R_Handle r) +r_ogl_os_window_swap(OS_Window os, R_Handle r) { OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0]; glXSwapBuffers(os_lnx_gfx_state->display, w->window); diff --git a/src/render/opengl/render_opengl.c b/src/render/opengl/render_opengl.c index 7f646b36..f985ae0b 100644 --- a/src/render/opengl/render_opengl.c +++ b/src/render/opengl/render_opengl.c @@ -201,14 +201,14 @@ r_init(CmdLine *cmdln) //- rjf: window setup/teardown r_hook R_Handle -r_window_equip(OS_Handle window) +r_window_equip(OS_Window window) { R_Handle result = r_ogl_os_window_equip(window); return result; } r_hook void -r_window_unequip(OS_Handle window, R_Handle window_equip) +r_window_unequip(OS_Window window, R_Handle window_equip) { r_ogl_os_window_unequip(window, window_equip); } @@ -341,7 +341,7 @@ r_end_frame(void) } r_hook void -r_window_begin_frame(OS_Handle os, R_Handle r) +r_window_begin_frame(OS_Window os, R_Handle r) { r_ogl_os_select_window(os, r); @@ -358,7 +358,7 @@ r_window_begin_frame(OS_Handle os, R_Handle r) } r_hook void -r_window_end_frame(OS_Handle os, R_Handle r) +r_window_end_frame(OS_Window os, R_Handle r) { for(R_OGL_FlushBuffer *flush_buffer = r_ogl_state->first_buffer_to_flush; flush_buffer != 0; flush_buffer = flush_buffer->next) { @@ -372,7 +372,7 @@ r_window_end_frame(OS_Handle os, R_Handle r) //- rjf: render pass submission r_hook void -r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes) +r_window_submit(OS_Window window, R_Handle window_equip, R_PassList *passes) { Rng2F32 viewport_rect = os_client_rect_from_window(window); Vec2F32 viewport_dim = dim_2f32(viewport_rect); diff --git a/src/render/opengl/render_opengl.h b/src/render/opengl/render_opengl.h index bdbdf051..cd7c3f2f 100644 --- a/src/render/opengl/render_opengl.h +++ b/src/render/opengl/render_opengl.h @@ -224,9 +224,9 @@ internal void r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id internal VoidProc *r_ogl_os_load_procedure(char *name); internal void r_ogl_os_init(CmdLine *cmdln); -internal R_Handle r_ogl_os_window_equip(OS_Handle window); -internal void r_ogl_os_window_unequip(OS_Handle os, R_Handle r); -internal void r_ogl_os_select_window(OS_Handle os, R_Handle r); -internal void r_ogl_os_window_swap(OS_Handle os, R_Handle r); +internal R_Handle r_ogl_os_window_equip(OS_Window window); +internal void r_ogl_os_window_unequip(OS_Window os, R_Handle r); +internal void r_ogl_os_select_window(OS_Window os, R_Handle r); +internal void r_ogl_os_window_swap(OS_Window os, R_Handle r); #endif // RENDER_OPENGL_H diff --git a/src/render/opengl/win32/render_opengl_win32.c b/src/render/opengl/win32/render_opengl_win32.c index e0951e4c..53b4641b 100644 --- a/src/render/opengl/win32/render_opengl_win32.c +++ b/src/render/opengl/win32/render_opengl_win32.c @@ -101,7 +101,7 @@ r_ogl_os_init(CmdLine *cmdline) } internal R_Handle -r_ogl_os_window_equip(OS_Handle window) +r_ogl_os_window_equip(OS_Window window) { //- rjf: unpack window OS_W32_Window *w = os_w32_window_from_handle(window); @@ -155,12 +155,12 @@ r_ogl_os_window_equip(OS_Handle window) } internal void -r_ogl_os_window_unequip(OS_Handle os, R_Handle r) +r_ogl_os_window_unequip(OS_Window os, R_Handle r) { } internal void -r_ogl_os_select_window(OS_Handle os, R_Handle r) +r_ogl_os_select_window(OS_Window os, R_Handle r) { OS_W32_Window *w = os_w32_window_from_handle(os); if(w != 0) @@ -172,7 +172,7 @@ r_ogl_os_select_window(OS_Handle os, R_Handle r) } internal void -r_ogl_os_window_swap(OS_Handle os, R_Handle r) +r_ogl_os_window_swap(OS_Window os, R_Handle r) { OS_W32_Window *w = os_w32_window_from_handle(os); if(w != 0) diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index cd79bb71..41df35d1 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -12,7 +12,6 @@ //- rjf: [h] #include "base/base_inc.h" -#include "os/os_inc.h" #include "content/content.h" #include "artifact_cache/artifact_cache.h" #include "file_stream/file_stream.h" @@ -21,7 +20,6 @@ //- rjf: [c] #include "base/base_inc.c" -#include "os/os_inc.c" #include "content/content.c" #include "artifact_cache/artifact_cache.c" #include "file_stream/file_stream.c" diff --git a/src/scratch/textperf.c b/src/scratch/textperf.c index 3c6c963c..3821698a 100644 --- a/src/scratch/textperf.c +++ b/src/scratch/textperf.c @@ -12,7 +12,6 @@ //- rjf: [h] #include "base/base_inc.h" -#include "os/os_inc.h" #include "render/render_inc.h" #include "font_provider/font_provider_inc.h" #include "font_cache/font_cache.h" @@ -20,7 +19,6 @@ //- rjf: [c] #include "base/base_inc.c" -#include "os/os_inc.c" #include "render/render_inc.c" #include "font_provider/font_provider_inc.c" #include "font_cache/font_cache.c" diff --git a/src/stap/stap_parse.c b/src/stap/stap_parse.c index 25e696af..0dfd55a8 100644 --- a/src/stap/stap_parse.c +++ b/src/stap/stap_parse.c @@ -69,6 +69,7 @@ stap_list_from_string(Arena *arena, String8 string) internal String8 stap_parse_args_x64(String8 string, STAP_Arg *arg_out) { + ARCH_Info *arch_info = arch_info_from_arch(Arch_x64); String8 error = str8_lit("unknown parse error"); U64 sep_pos = str8_find_needle(string, 0, str8_lit("@"), 0); if (sep_pos < string.size) { @@ -200,14 +201,9 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) index_str = str8_skip(index_str, 1); // parse base - B8 base_is_alias = 0; U32 base_reg_code = 0; if (base_str.size) { - base_reg_code = regs_reg_code_from_name(Arch_x64, base_str); - if (base_reg_code == 0) { - base_reg_code = regs_alias_code_from_name(Arch_x64, base_str); - base_is_alias = base_reg_code != 0; - } + base_reg_code = arch_reg_code_from_name(arch_info, base_str); if (base_reg_code == 0) { error = str8_lit("unknown base register"); goto operand_parse_exit; @@ -215,14 +211,9 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) } // parse index - B8 index_is_alias = 0; U32 index_reg_code = 0; if (index_str.size) { - index_reg_code = regs_reg_code_from_name(Arch_x64, index_str); - if (index_reg_code == 0) { - index_reg_code = regs_alias_code_from_name(Arch_x64, index_str); - index_is_alias = index_reg_code != 0; - } + index_reg_code = arch_reg_code_from_name(arch_info, index_str); if (index_reg_code == 0) { error = str8_lit("unknown index register"); } @@ -247,9 +238,7 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) arg.type = STAP_ArgType_MemoryRef; arg.memory_ref.disp = disp; arg.memory_ref.base.reg_code = base_reg_code; - arg.memory_ref.base.is_alias = base_is_alias; arg.memory_ref.index.reg_code = index_reg_code; - arg.memory_ref.index.is_alias = index_is_alias; arg.memory_ref.scale = scale; } // $imm @@ -296,19 +285,13 @@ stap_parse_args_x64(String8 string, STAP_Arg *arg_out) goto operand_parse_exit; } - B8 is_reg_alias = 0; - U32 reg_code = regs_reg_code_from_name(Arch_x64, reg_str); - if (reg_code == 0) { - reg_code = regs_alias_code_from_name(Arch_x64, reg_str); - is_reg_alias = reg_code != 0; - } + U32 reg_code = arch_reg_code_from_name(arch_info, reg_str); if (reg_code == 0) { error = str8_lit("invalid register name"); goto operand_parse_exit; } arg.type = STAP_ArgType_Reg; - arg.reg.is_alias = is_reg_alias; arg.reg.reg_code = reg_code; } else { goto operand_parse_exit; diff --git a/src/stap/stap_parse.h b/src/stap/stap_parse.h index 8d5164ca..301e66e0 100644 --- a/src/stap/stap_parse.h +++ b/src/stap/stap_parse.h @@ -29,17 +29,14 @@ typedef struct STAP_Arg U64 imm; struct { U32 reg_code; - B8 is_alias; } reg; struct { S64 disp; struct { U32 reg_code; - B8 is_alias; } base; struct { U32 reg_code; - B8 is_alias; } index; U64 scale; } memory_ref; diff --git a/src/stap/stap_test.c b/src/stap/stap_test.c index 7996ae44..155a4562 100644 --- a/src/stap/stap_test.c +++ b/src/stap/stap_test.c @@ -5,12 +5,10 @@ #define BUILD_CONSOLE_INTERFACE 1 #include "base/base_inc.h" -#include "os/os_inc.h" #include "arch/arch_inc.h" #include "stap/stap_parse.h" #include "base/base_inc.c" -#include "os/os_inc.c" #include "arch/arch_inc.c" #include "stap/stap_parse.c" diff --git a/src/strip_lib_debug/strip_lib_debug.c b/src/strip_lib_debug/strip_lib_debug.c index 6bb5f1e5..4bc25e28 100644 --- a/src/strip_lib_debug/strip_lib_debug.c +++ b/src/strip_lib_debug/strip_lib_debug.c @@ -8,7 +8,6 @@ // Headers #include "base/base_inc.h" -#include "os/os_inc.h" #include "coff/coff.h" #include "coff/coff_parse.h" @@ -16,7 +15,6 @@ // Implementations #include "base/base_inc.c" -#include "os/os_inc.c" #include "coff/coff.c" #include "coff/coff_parse.c" diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index fe3e0819..71f530d8 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -24,11 +24,11 @@ #include "linker/hash_table.h" #include "linker/lf_hash_table.h" #include "linker/base_ext/base_bit_array.h" -#include "os/os_inc.h" #include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" #include "mdesk/mdesk.h" +#include "window_manager/window_manager_inc.h" #include "config/config_inc.h" #include "content/content.h" #include "file_stream/file_stream.h" @@ -98,11 +98,11 @@ #include "linker/hash_table.c" #include "linker/lf_hash_table.c" #include "linker/base_ext/base_bit_array.c" -#include "os/os_inc.c" #include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" #include "mdesk/mdesk.c" +#include "window_manager/window_manager_inc.c" #include "config/config_inc.c" #include "content/content.c" #include "file_stream/file_stream.c" diff --git a/src/demon/win32/demon_core_win32.c b/src/win32/demon/win32_demon.c similarity index 97% rename from src/demon/win32/demon_core_win32.c rename to src/win32/demon/win32_demon.c index 0084818d..528f01e5 100644 --- a/src/demon/win32/demon_core_win32.c +++ b/src/win32/demon/win32_demon.c @@ -1,3102 +1,3102 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -dmn_w32_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal U64 -dmn_w32_hash_from_id(U64 id) -{ - return dmn_w32_hash_from_string(str8_struct(&id)); -} - -//////////////////////////////// -//~ rjf: Entity Helpers - -//- rjf: entity <-> handle - -internal DMN_Handle -dmn_w32_handle_from_entity(DMN_W32_Entity *entity) -{ - U32 idx = (U32)(entity - dmn_w32_shared->entities_base); - U32 gen = entity->gen; - DMN_Handle handle = {idx, gen}; - return handle; -} - -internal DMN_W32_Entity * -dmn_w32_entity_from_handle(DMN_Handle handle) -{ - U32 idx = handle.u32[0]; - U32 gen = handle.u32[1]; - DMN_W32_Entity *entity = dmn_w32_shared->entities_base + idx; - if(entity->gen != gen) - { - entity = &dmn_w32_entity_nil; - } - return entity; -} - -//- rjf: entity allocation/deallocation - -internal DMN_W32_Entity * -dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) -{ - // rjf: allocate - DMN_W32_Entity *e = dmn_w32_shared->entities_first_free; - { - U32 gen = 0; - if(e != 0) - { - SLLStackPop(dmn_w32_shared->entities_first_free); - gen = e->gen; - } - else - { - e = push_array_no_zero(dmn_w32_shared->entities_arena, DMN_W32_Entity, 1); - dmn_w32_shared->entities_count += 1; - } - MemoryZeroStruct(e); - e->gen = gen+1; - } - - // rjf: fill - { - e->kind = kind; - e->id = id; - e->parent = parent; - e->next = e->prev = e->first = e->last = &dmn_w32_entity_nil; - if(parent != &dmn_w32_entity_nil) - { - DLLPushBack_NPZ(&dmn_w32_entity_nil, parent->first, parent->last, e, next, prev); - } - } - - // rjf: insert into id -> entity map - if(id != 0) - { - U64 hash = dmn_w32_hash_from_id(id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->id == id) - { - node = n; - break; - } - } - if(node == 0) - { - node = dmn_w32_shared->entities_id_hash_node_free; - if(node != 0) - { - SLLStackPop(dmn_w32_shared->entities_id_hash_node_free); - } - else - { - node = push_array(dmn_w32_shared->arena, DMN_W32_EntityIDHashNode, 1); - } - DLLPushBack(slot->first, slot->last, node); - } - node->id = id; - node->entity = e; - } - - return e; -} - -internal void -dmn_w32_entity_release(DMN_W32_Entity *entity) -{ - // rjf: unhook root - if(entity->parent != &dmn_w32_entity_nil) - { - DLLRemove_NPZ(&dmn_w32_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); - } - - // rjf: walk every entity in this tree, free each - if(entity != &dmn_w32_entity_nil) - { - Temp scratch = scratch_begin(0, 0); - typedef struct Task Task; - struct Task - { - Task *next; - DMN_W32_Entity *e; - }; - Task start_task = {0, entity}; - Task *first_task = &start_task; - Task *last_task = &start_task; - for(Task *t = first_task; t != 0; t = t->next) - { - for(DMN_W32_Entity *child = t->e->first; child != &dmn_w32_entity_nil; child = child->next) - { - Task *t = push_array(scratch.arena, Task, 1); - t->e = child; - SLLQueuePush(first_task, last_task, t); - } - - // rjf: free entity - SLLStackPush(dmn_w32_shared->entities_first_free, t->e); - t->e->gen += 1; - if(t->e->kind == DMN_W32_EntityKind_Module) - { - CloseHandle(t->e->handle); - } - t->e->kind = DMN_W32_EntityKind_Null; - - // rjf: remove from id -> entity map - if(t->e->id != 0) - { - U64 hash = dmn_w32_hash_from_id(t->e->id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->id == t->e->id && n->entity == t->e) - { - DLLRemove(slot->first, slot->last, n); - SLLStackPush(dmn_w32_shared->entities_id_hash_node_free, n); - break; - } - } - } - } - scratch_end(scratch); - } -} - -//- rjf: kind*id -> entity - -internal DMN_W32_Entity * -dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id) -{ - DMN_W32_Entity *result = &dmn_w32_entity_nil; - U64 hash = dmn_w32_hash_from_id(id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) - { - if(n->entity->kind == kind && n->id == id) - { - node = n; - break; - } - } - if(node != 0) - { - result = node->entity; - } - return result; -} - -//////////////////////////////// -//~ rjf: Module Info Extraction - -internal String8 -dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) -{ - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: extract path from module - String16 path16 = {0}; - String8 path8 = {0}; - { - // rjf: handle -> full path - if(module->handle != 0) - { - DWORD cap16 = GetFinalPathNameByHandleW(module->handle, 0, 0, VOLUME_NAME_DOS); - U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); - DWORD size16 = GetFinalPathNameByHandleW(module->handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); - path16 = str16(buffer16, size16); - } - - // rjf: fallback (main module only): process -> full path - if(path16.size == 0 && module->module.is_main) - { - DMN_W32_Entity *process = module->parent; - DWORD size = KB(4); - U16 *buf = push_array_no_zero(scratch.arena, U16, size); - if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size)) - { - path16 = str16(buf, size); - } - } - - // rjf: fallback (any module - no guarantee): address_of_name -> full path - if(path16.size == 0 && module->module.address_of_name_pointer != 0) - { - DMN_W32_Entity *process = module->parent; - U64 ptr_size = bit_size_from_arch(process->arch)/8; - U64 name_pointer = 0; - if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) - { - if(name_pointer != 0) - { - if(module->module.name_is_unicode) - { - path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer); - } - else - { - path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer); - } - } - } - } - } - - // rjf: produce finalized result - String8 result = {0}; - { - if(path16.size > 0) - { - // rjf: skip the extended path thing if necessary - if(path16.size >= 4 && - path16.str[0] == L'\\' && - path16.str[1] == L'\\' && - path16.str[2] == L'?' && - path16.str[3] == L'\\') - { - path16.size -= 4; - path16.str += 4; - } - - // rjf: convert to UTF-8 - result = str8_from_16(arena, path16); - } - else - { - // rjf: skip the extended path thing if necessary - if (path8.size >= 4 && - path8.str[0] == L'\\' && - path8.str[1] == L'\\' && - path8.str[2] == L'?' && - path8.str[3] == L'\\') - { - path8.size -= 4; - path8.str += 4; - } - - // rjf: copy to output arena - result = push_str8_copy(arena, path8); - } - } - - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Win32-Level Process/Thread Reads/Writes - -//- rjf: processes - -internal U64 -dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) -{ - U64 bytes_read = 0; - U8 *ptr = (U8*)dst; - U8 *opl = ptr + dim_1u64(range); - U64 cursor = range.min; - for(;ptr < opl;) - { - SIZE_T to_read = (SIZE_T)(opl - ptr); - SIZE_T actual_read = 0; - if(!ReadProcessMemory(process, (LPCVOID)cursor, ptr, to_read, &actual_read)) - { - DWORD error = GetLastError(); - log_infof("'Win32 ReadProcessMemory failure': { [0x%I64x, 0x%I64x), code: %i }\n", range.min, range.max, error); - // NOTE(rjf): I have discovered that `actual_read` is *NOT* guaranteed to have - // a usable value if `ReadProcessMemory` fails! - // bytes_read += actual_read; - (void)error; - break; - } - ptr += actual_read; - cursor += actual_read; - bytes_read += actual_read; - } - return bytes_read; -} - -internal B32 -dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src) -{ - B32 result = 1; - U8 *ptr = (U8*)src; - U8 *opl = ptr + dim_1u64(range); - U64 cursor = range.min; - for(;ptr < opl;) - { - SIZE_T to_write = (SIZE_T)(opl - ptr); - SIZE_T actual_write = 0; - if(!WriteProcessMemory(process, (LPVOID)cursor, ptr, to_write, &actual_write)) - { - result = 0; - break; - } - ptr += actual_write; - cursor += actual_write; - } - return result; -} - -internal String8 -dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) -{ - // TODO(rjf): @rewrite - // - // OLD: this could be done better with a demon_w32_read_memory - // that returns a read amount instead of a success/fail. - // - // (dmn_w32_process_read now does this, so we can switch to it) - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 0;){ - if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ - break; - } - cap /= 2; - } - read_p += cap; - - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 1){ - if (block[block_opl] == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 result = str8_list_join(arena, &list, 0); - scratch_end(scratch); - return(result); -} - -internal String16 -dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) -{ - // TODO(rjf): @rewrite - // - // OLD: this could be done better with a demon_w32_read_memory - // that returns a read amount instead of a success/fail. - // - // (dmn_w32_process_read now does this, so we can switch to it) - - // scan piece by piece - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 max_cap = 256; - U64 cap = max_cap; - U64 read_p = address; - for (;;){ - U8 *block = push_array(scratch.arena, U8, cap); - for (;cap > 1;){ - if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ - break; - } - cap /= 2; - } - read_p += cap; - - U16 *block16 = (U16*)block; - (void)block16; - U64 block_opl = 0; - for (;block_opl < cap; block_opl += 2){ - if (*(U16*)(block + block_opl) == 0){ - break; - } - } - - if (block_opl > 0){ - str8_list_push(scratch.arena, &list, str8(block, block_opl)); - } - - if (block_opl < cap || cap == 0){ - break; - } - } - - // assemble results - String8 joined = str8_list_join(arena, &list, 0); - String16 result = {(U16*)joined.str, joined.size/2}; - scratch_end(scratch); - return(result); -} - -internal DMN_W32_ImageInfo -dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) -{ - // rjf: find PE offset - U32 pe_offset = 0; - { - U64 dos_magic_off = base_vaddr; - U16 dos_magic = 0; - dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); - if(dos_magic == PE_DOS_MAGIC) - { - U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); - dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset); - } - } - - // rjf: get COFF header - B32 got_coff_header = 0; - U64 coff_header_off = 0; - COFF_FileHeader coff_header = {0}; - if(pe_offset > 0) - { - U64 pe_magic_off = base_vaddr + pe_offset; - U32 pe_magic = 0; - dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); - if(pe_magic == PE_MAGIC) - { - coff_header_off = pe_magic_off + sizeof(pe_magic); - got_coff_header = dmn_w32_process_read_struct(process, coff_header_off, &coff_header); - } - } - - DMN_W32_ImageInfo result = zero_struct; - if(got_coff_header) - { - U64 optional_off = coff_header_off + sizeof(COFF_FileHeader); - - Arch arch = arch_from_coff_machine(coff_header.machine); - U64 image_size = 0; - U64 data_dir_count = 0; - U64 data_dir_off = max_U64; - U64 tls_index = max_U64; - - // parse optional header - if(pe_has_plus_header(coff_header.machine)) - { - PE_OptionalHeader32Plus opt_header = {0}; - if(dmn_w32_process_read_struct(process, optional_off, &opt_header)) - { - image_size = opt_header.sizeof_image; - data_dir_count = opt_header.data_dir_count; - data_dir_off = optional_off + sizeof(opt_header); - } - else { Assert(0 && "failed to read optional header"); } - } - else - { - PE_OptionalHeader32 opt_header = {0}; - if(dmn_w32_process_read_struct(process, optional_off, &opt_header)) - { - image_size = opt_header.sizeof_image; - data_dir_count = opt_header.data_dir_count; - data_dir_off = optional_off + sizeof(opt_header); - } - else { Assert(0 && "failed to read optional header"); } - } - - // extract TLS index - if(PE_DataDirectoryIndex_TLS < data_dir_count) - { - U64 tls_dir_vaddr = data_dir_off + PE_DataDirectoryIndex_TLS * sizeof(PE_DataDirectory); - PE_DataDirectory tls_dir = {0}; - if(dmn_w32_process_read_struct(process, tls_dir_vaddr, &tls_dir)) - { - if(pe_has_plus_header(coff_header.machine)) - { - if(tls_dir.virt_size == sizeof(PE_TLSHeader64)) - { - PE_TLSHeader64 tls_header = {0}; - if(dmn_w32_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) - { - U64 tls_index64 = 0; - if(dmn_w32_process_read_struct(process, tls_header.index_address, &tls_index64)) - { - tls_index = tls_index64; - } - else { Assert(0 && "failed to read TLS Index 64"); } - } - else { Assert(0 && "failed to read TLS Header 64"); } - } - } - else - { - if(tls_dir.virt_size == sizeof(PE_TLSHeader32)) - { - PE_TLSHeader32 tls_header = {0}; - if(dmn_w32_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) - { - U32 tls_index32 = 0; - if(dmn_w32_process_read_struct(process, tls_header.index_address, &tls_index32)) - { - tls_index = tls_index32; - } - else { Assert(0 && "failed to read TLS Index 32"); } - } - else { Assert(0 && "failed to read TLS Header32"); } - } - } - } - else { Assert(0 && "failed to read TLS directory"); } - } - - // fill out result - result.arch = arch; - result.size = image_size; - result.tls_index = tls_index; - } - else { Assert(0 && "failed to find COFF file header"); } - - return result; -} - -//- rjf: threads - -internal B32 -dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) -{ - B32 result = 0; - ProfBeginFunction(); - switch(arch) - { - //////////////////////////// - //- rjf: unimplemented win32/arch combos - // - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - - //////////////////////////// - //- rjf: x64 - // - case Arch_x64: - { - Temp scratch = scratch_begin(0, 0); - X64_RegBlock *dst = (X64_RegBlock *)reg_block; - - //- rjf: unpack info about available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 xstate_enabled = (feature_mask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512 | XSTATE_MASK_CET_U)) != 0; - - //- rjf: set up context - CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0); - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *ctx_memory = push_array(scratch.arena, U8, size); - if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) - { - ctx = 0; - } - } - - //- rjf: unpack features available on this context - if (xstate_enabled) - { - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512 | XSTATE_MASK_CET_U); - } - - //- rjf: get thread context - if(!GetThreadContext(thread, ctx)) - { - ctx = 0; - } - - //- rjf: bad context -> abort - if(ctx == 0) - { - break; - } - result = 1; - - DWORD64 xstate_mask = 0; - GetXStateFeaturesMask(ctx, &xstate_mask); - - //- rjf: convert context -> X64_RegBlock - XSAVE_FORMAT *xsave = &ctx->FltSave; - dst->rax = ctx->Rax; - dst->rcx = ctx->Rcx; - dst->rdx = ctx->Rdx; - dst->rbx = ctx->Rbx; - dst->rsp = ctx->Rsp; - dst->rbp = ctx->Rbp; - dst->rsi = ctx->Rsi; - dst->rdi = ctx->Rdi; - dst->r8 = ctx->R8; - dst->r9 = ctx->R9; - dst->r10 = ctx->R10; - dst->r11 = ctx->R11; - dst->r12 = ctx->R12; - dst->r13 = ctx->R13; - dst->r14 = ctx->R14; - dst->r15 = ctx->R15; - dst->rip = ctx->Rip; - dst->cs = ctx->SegCs; - dst->ds = ctx->SegDs; - dst->es = ctx->SegEs; - dst->fs = ctx->SegFs; - dst->gs = ctx->SegGs; - dst->ss = ctx->SegSs; - dst->dr0 = ctx->Dr0; - dst->dr1 = ctx->Dr1; - dst->dr2 = ctx->Dr2; - dst->dr3 = ctx->Dr3; - dst->dr6 = ctx->Dr6; - dst->dr7 = ctx->Dr7; - // NOTE(rjf): this bit is "supposed to always be 1", according to old info. - // may need to be investigated. - dst->rflags = ctx->EFlags | 0x2; - dst->fcw = xsave->ControlWord; - dst->fsw = xsave->StatusWord; - dst->ftw = xsave->TagWord; - dst->fop = xsave->ErrorOpcode; - MemoryCopy(&dst->fip, &xsave->ErrorOffset, sizeof(U64)); - MemoryCopy(&dst->fdp, &xsave->DataOffset, sizeof(U64)); - dst->mxcsr = xsave->MxCsr; - dst->mxcsr_mask = xsave->MxCsr_Mask; - { - M128A *float_s = xsave->FloatRegisters; - U80 *float_d = &dst->st0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) - { - MemoryCopy(float_d, float_s, sizeof(*float_d)); - } - } - - // SSE registers are always available in x64 - { - M128A *xmm_s = xsave->XmmRegisters; - U512 *zmm_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, xmm_s += 1, zmm_d += 1) - { - MemoryCopy(zmm_d, xmm_s, sizeof(*xmm_s)); - } - } - - // AVX - if(xstate_mask & XSTATE_MASK_AVX) - { - DWORD avx_length = 0; - U8 *avx_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); - if(avx_length == 16 * sizeof(U128)) - { - U512 *zmm_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, avx_s += sizeof(U128), zmm_d += 1) - { - MemoryCopy(&zmm_d->u8[16], avx_s, sizeof(U128)); - } - } - } - else - { - U512 *zmm_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, zmm_d += 1) - { - MemoryZero(&zmm_d->u8[16], sizeof(U128)); - } - } - - // AVX-512 - if(xstate_mask & XSTATE_MASK_AVX512) - { - // rjf: kmask - DWORD kmask_length = 0; - U64 *kmask_s = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); - if(kmask_length == 8 * sizeof(U64)) - { - U64 *kmask_d = &dst->k0; - for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) - { - MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_s)); - } - } - - // rjf: zmmh - DWORD avx512h_length = 0; - U8 *avx512h_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); - if(avx512h_length == 16 * sizeof(U256)) - { - U512 *zmmh_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, avx512h_s += sizeof(U256), zmmh_d += 1) - { - MemoryCopy(&zmmh_d->u8[32], avx512h_s, sizeof(U256)); - } - } - - // rjf: zmm - DWORD avx512_length = 0; - U8 *avx512_s = (U8 *)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); - if(avx512_length == 16 * sizeof(U512)) - { - U512 *zmm_d = &dst->zmm16; - for(U32 n = 0; n < 16; n += 1, avx512_s += sizeof(U512), zmm_d += 1) - { - MemoryCopy(zmm_d, avx512_s, sizeof(U512)); - } - } - } - else - { - U64 *kmask_d = &dst->k0; - for(U32 n = 0; n < 8; n += 1, kmask_d += 1) - { - MemoryZero(kmask_d, sizeof(*kmask_d)); - } - U512 *zmmh_d = &dst->zmm0; - for(U32 n = 0; n < 16; n += 1, zmmh_d += 1) - { - MemoryZero(&zmmh_d->u8[32], sizeof(U256)); - } - U512 *zmm_d = &dst->zmm16; - for(U32 n = 0; n < 16; n += 1, zmm_d += 1) - { - MemoryZero(zmm_d, sizeof(*zmm_d)); - } - } - - // CET / Shadow Stack - if(xstate_mask & XSTATE_MASK_CET_U) - { - DWORD cet_length = 0; - XSAVE_CET_U_FORMAT *cet = LocateXStateFeature(ctx, XSTATE_CET_U, &cet_length); - if (cet_length == sizeof(*cet)) - { - dst->cetmsr = cet->Ia32CetUMsr; - dst->cetssp = cet->Ia32Pl3SspMsr; - } - } - - scratch_end(scratch); - }break; - } - ProfEnd(); - return result; -} - -internal B32 -dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) -{ - B32 result = 0; - ProfBeginFunction(); - switch(arch) - { - //////////////////////////// - //- rjf: unimplemented win32/arch combos - // - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - - //////////////////////////// - //- rjf: x64 - // - case Arch_x64: - { - Temp scratch = scratch_begin(0, 0); - X64_RegBlock *src = (X64_RegBlock *)reg_block; - - //- rjf: unpack info about available features - U32 feature_mask = GetEnabledXStateFeatures(); - B32 xstate_enabled = (feature_mask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512)) != 0; - - //- rjf: set up context - CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0); - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *ctx_memory = push_array(scratch.arena, U8, size); - if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) - { - ctx = 0; - } - } - - //- rjf: unpack features available on this context - if (xstate_enabled) - { - SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512); - } - - //- rjf: bad context -> abort - if(ctx == 0) - { - break; - } - - //- rjf: convert X64_RegBlock -> CONTEXT - XSAVE_FORMAT *fxsave = &ctx->FltSave; - ctx->ContextFlags = ctx_flags; - ctx->MxCsr = src->mxcsr & src->mxcsr_mask; - ctx->Rax = src->rax; - ctx->Rcx = src->rcx; - ctx->Rdx = src->rdx; - ctx->Rbx = src->rbx; - ctx->Rsp = src->rsp; - ctx->Rbp = src->rbp; - ctx->Rsi = src->rsi; - ctx->Rdi = src->rdi; - ctx->R8 = src->r8; - ctx->R9 = src->r9; - ctx->R10 = src->r10; - ctx->R11 = src->r11; - ctx->R12 = src->r12; - ctx->R13 = src->r13; - ctx->R14 = src->r14; - ctx->R15 = src->r15; - ctx->Rip = src->rip; - ctx->SegCs = src->cs; - ctx->SegDs = src->ds; - ctx->SegEs = src->es; - ctx->SegFs = src->fs; - ctx->SegGs = src->gs; - ctx->SegSs = src->ss; - ctx->Dr0 = src->dr0; - ctx->Dr1 = src->dr1; - ctx->Dr2 = src->dr2; - ctx->Dr3 = src->dr3; - ctx->Dr6 = src->dr6; - ctx->Dr7 = src->dr7; - ctx->EFlags = src->rflags; - fxsave->ControlWord = src->fcw; - fxsave->StatusWord = src->fsw; - fxsave->TagWord = src->ftw; - fxsave->ErrorOpcode = src->fop; - MemoryCopy(&fxsave->ErrorOffset, &src->fip, sizeof(U64)); - MemoryCopy(&fxsave->DataOffset, &src->fdp, sizeof(U64)); - { - M128A *float_d = fxsave->FloatRegisters; - U80 *float_s = &src->st0; - for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) - { - MemoryCopy(float_d, float_s, 10); - } - } - - // SSE registers are always available in x64 - { - M128A *xmm_d = fxsave->XmmRegisters; - U512 *zmm_s = &src->zmm0; - for(U32 n = 0; n < 16; n += 1, xmm_d += 1, zmm_s += 1) - { - MemoryCopy(xmm_d, zmm_s, sizeof(*xmm_d)); - } - } - - // AVX - if(feature_mask & XSTATE_MASK_AVX) - { - DWORD avx_length = 0; - U8* avx_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); - if(avx_length == 16 * sizeof(U128)) - { - U512 *zmm_s = &src->zmm0; - for(U32 n = 0; n < 16; n += 1, avx_d += sizeof(U128), zmm_s += 1) - { - MemoryCopy(avx_d, &zmm_s->u8[16], sizeof(U128)); - } - } - } - - // AVX-512 - if(feature_mask & XSTATE_MASK_AVX512) - { - DWORD kmask_length = 0; - U64* kmask_d = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); - if(kmask_length == 8 * sizeof(*kmask_d)) - { - U64 *kmask_s = &src->k0; - for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) - { - MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_d)); - } - } - - DWORD avx512h_length = 0; - U8* avx512h_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); - if(avx512h_length == 16 * sizeof(U256)) - { - U512 *zmmh_s = &src->zmm0; - for(U32 n = 0; n < 16; n += 1, avx512h_d += sizeof(U256), zmmh_s += 1) - { - MemoryCopy(avx512h_d, &zmmh_s->u8[32], sizeof(U256)); - } - } - - DWORD avx512_length = 0; - U8* avx512_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); - if(avx512_length == 16 * sizeof(U512)) - { - U512 *zmm_s = &src->zmm16; - for(U32 n = 0; n < 16; n += 1, avx512_d += sizeof(U512), zmm_s += 1) - { - MemoryCopy(avx512_d, zmm_s, sizeof(U512)); - } - } - } - - //- rjf: set thread context - if(SetThreadContext(thread, ctx)) - { - result = 1; - } - scratch_end(scratch); - }break; - } - ProfEnd(); - return result; -} - -//- rjf: remote thread injection - -internal DWORD -dmn_w32_inject_thread(HANDLE process, U64 start_address) -{ - LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address; - DWORD thread_id = 0; - HANDLE thread = CreateRemoteThread(process, 0, 0, start, 0, 0, &thread_id); - if(thread != 0) - { - CloseHandle(thread); - } - return thread_id; -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) - -internal void -dmn_init(void) -{ - Arena *arena = arena_alloc(); - dmn_w32_shared = push_array(arena, DMN_W32_Shared, 1); - dmn_w32_shared->arena = arena; - dmn_w32_shared->access_mutex = mutex_alloc(); - dmn_w32_shared->detach_arena = arena_alloc(); - dmn_w32_shared->entities_arena = arena_alloc(.reserve_size = GB(8), .commit_size = KB(64)); - dmn_w32_shared->entities_base = dmn_w32_entity_alloc(&dmn_w32_entity_nil, DMN_W32_EntityKind_Root, 0); - dmn_w32_shared->entities_id_hash_slots_count = 4096; - dmn_w32_shared->entities_id_hash_slots = push_array(arena, DMN_W32_EntityIDHashSlot, dmn_w32_shared->entities_id_hash_slots_count); - - // rjf: load Windows 10+ GetThreadDescription API - { - dmn_w32_GetThreadDescription = (DMN_W32_GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetThreadDescription"); - } - - // rjf: setup environment variables - { - WCHAR *this_proc_env = GetEnvironmentStringsW(); - U64 start_idx = 0; - for(U64 idx = 0;; idx += 1) - { - if(this_proc_env[idx] == 0) - { - if(start_idx == idx) - { - break; - } - else - { - String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); - String8 string = str8_from_16(dmn_w32_shared->arena, string16); - str8_list_push(dmn_w32_shared->arena, &dmn_w32_shared->env_strings, string); - start_idx = idx+1; - } - } - } - } -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) - -internal DMN_CtrlCtx * -dmn_ctrl_begin(void) -{ - DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; - dmn_w32_ctrl_thread = 1; - return ctx; -} - -internal void -dmn_ctrl_exclusive_access_begin(void) -{ - MutexScope(dmn_w32_shared->access_mutex) - { - dmn_w32_shared->access_run_state = 1; - } -} - -internal void -dmn_ctrl_exclusive_access_end(void) -{ - MutexScope(dmn_w32_shared->access_mutex) - { - dmn_w32_shared->access_run_state = 0; - } -} - -internal U32 -dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) -{ - Temp scratch = scratch_begin(0, 0); - U32 result = 0; - DMN_AccessScope - { - //- rjf: produce exe / arguments string - String8 cmd = {0}; - if(params->cmd_line.first != 0) - { - String8List args = {0}; - String8 exe_path = params->cmd_line.first->string; - String8List exe_path_parts = str8_split_path(scratch.arena, exe_path); - exe_path = str8_list_join(scratch.arena, &exe_path_parts, &(StringJoin){.sep = str8_lit("\\")}); - str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); - for(String8Node *n = params->cmd_line.first->next; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &args, n->string); - } - StringJoin join_params = {0}; - join_params.sep = str8_lit(" "); - cmd = str8_list_join(scratch.arena, &args, &join_params); - } - - //- rjf: produce environment strings - String8 env = {0}; - { - String8List all_opts = params->env; - if(params->inherit_env != 0) - { - MemoryZeroStruct(&all_opts); - str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); - for(String8Node *n = params->env.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - } - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - env = str8_list_join(scratch.arena, &all_opts, &join_params2); - } - - //- rjf: produce utf-16 strings - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, params->path); - String16 env16 = str16_from_8(scratch.arena, env); - - //- rjf: launch - DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; - if(params->debug_subprocesses) - { - creation_flags |= DEBUG_PROCESS; - } - else - { - creation_flags |= DEBUG_ONLY_THIS_PROCESS; - } - BOOL inherit_handles = 0; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - if(!file_match(params->stdout_file, file_zero())) - { - HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; - startup_info.hStdOutput = stdout_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - if(!file_match(params->stderr_file, file_zero())) - { - HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; - startup_info.hStdError = stderr_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - if(!file_match(params->stdin_file, file_zero())) - { - HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; - startup_info.hStdInput = stdin_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - PROCESS_INFORMATION process_info = {0}; - if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, creation_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) - { - // check if we are 32-bit app, and just close it immediately - BOOL is_wow = 0; - IsWow64Process(process_info.hProcess, &is_wow); - if(is_wow) - { - log_user_errorf("Only 64-bit applications can be debugged currently."); - DebugActiveProcessStop(process_info.dwProcessId); - TerminateProcess(process_info.hProcess,0xffffffff); - } - else - { - result = process_info.dwProcessId; - dmn_w32_shared->new_process_pending = 1; - } - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); - } - else - { - DWORD error = GetLastError(); - LPWSTR message = 0; - FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL), (LPWSTR)&message, 0, 0); - String8 message8 = message ? str8_from_16(scratch.arena, str16_cstring(message)) : str8_lit("unknown error"); - LocalFree(message); - - log_user_errorf("There was an error starting %S: %S", params->cmd_line.first->string, message8); - } - } - scratch_end(scratch); - return result; -} - -internal B32 -dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) -{ - B32 result = 0; - DMN_AccessScope if(DebugActiveProcess((DWORD)pid)) - { - result = 1; - dmn_w32_shared->new_process_pending = 1; - -#if 0 - // TODO(rjf): JIT debugging info - { - typedef struct JIT_DEBUG_INFO JIT_DEBUG_INFO; - struct JIT_DEBUG_INFO - { - DWORD dwSize; - DWORD dwProcessorArchitecture; - DWORD dwThreadID; - DWORD dwReserved0; - ULONG64 lpExceptionAddress; - ULONG64 lpExceptionRecord; - ULONG64 lpContextRecord; - }; - } -#endif - } - return result; -} - -internal B32 -dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - if(TerminateProcess(process_entity->handle, exit_code)) - { - result = 1; - } - } - return result; -} - -internal B32 -dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - - // rjf: resume threads - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; - child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Thread) - { - DWORD resume_result = ResumeThread(child->handle); - (void)resume_result; - } - } - - // rjf: detach - { - DWORD pid = (DWORD)process_entity->id; - if(DebugActiveProcessStop(pid)) - { - result = 1; - } - } - - // rjf: push into list of processes to generate events for later - if(result != 0) - { - dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); - } - } - return result; -} - -internal DMN_EventList -dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) -{ - DMN_EventList events = {0}; - dmn_access_open(); - - ////////////////////////////// - //- rjf: determine event generation path - // - typedef enum DMN_W32_EventGenPath - { - DMN_W32_EventGenPath_NotAttached, - DMN_W32_EventGenPath_Run, - DMN_W32_EventGenPath_DetachProcesses, - } - DMN_W32_EventGenPath; - DMN_W32_EventGenPath event_gen_path = DMN_W32_EventGenPath_Run; - if(dmn_w32_shared->detach_processes.first != 0) - { - event_gen_path = DMN_W32_EventGenPath_DetachProcesses; - } - else - { - B32 any_processes_live = dmn_w32_shared->new_process_pending; - if(!any_processes_live) - { - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; - process = process->next) - { - if(process->kind == DMN_W32_EntityKind_Process) - { - any_processes_live = 1; - break; - } - } - } - if(!any_processes_live) - { - event_gen_path = DMN_W32_EventGenPath_NotAttached; - } - } - - ////////////////////////////// - //- rjf: produce debug events - // - switch(event_gen_path) - { - //////////////////////////// - //- rjf: produce not-attached error events - // - case DMN_W32_EventGenPath_NotAttached: - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_Error; - e->error_kind = DMN_ErrorKind_NotAttached; - }break; - - //////////////////////////// - //- rjf: produce debug events from regular running - // - case DMN_W32_EventGenPath_Run: - { - Temp scratch = scratch_begin(&arena, 1); - - ////////////////////////// - //- rjf: get single step thread's context (x64 single-step-set fast path) - // - CONTEXT *single_step_thread_ctx = 0; - if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); - Arch arch = thread->arch; - switch(arch) - { - default:{}break; - case Arch_x64: - { - U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *ctx_memory = push_array(scratch.arena, U8, size); - if(!InitializeContext(ctx_memory, ctx_flags, &single_step_thread_ctx, &size)) - { - single_step_thread_ctx = 0; - } - } - }break; - } - } - - ////////////////////////// - //- rjf: set single step bit - // - if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("set single step bit") - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); - Arch arch = thread->arch; - switch(arch) - { - //- rjf: unimplemented win32/arch combos - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - - //- rjf: x64 - case Arch_x64: - { - if(!GetThreadContext(thread->handle, single_step_thread_ctx)) - { - single_step_thread_ctx = 0; - } - if(single_step_thread_ctx != 0) - { - U64 rflags = single_step_thread_ctx->EFlags|0x2; - U64 new_rflags = rflags | 0x100; - single_step_thread_ctx->EFlags = new_rflags; - SetThreadContext(thread->handle, single_step_thread_ctx); - } - }break; - } - } - - ////////////////////////// - //- rjf: write all traps into memory - // - U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, ctrls->traps.trap_count); - ProfScope("write all traps into memory") - { - U64 trap_idx = 0; - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) - { - DMN_Trap *trap = n->v+n_idx; - if(trap->flags == 0) - { - trap_swap_bytes[trap_idx] = 0xCC; - dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), trap_swap_bytes+trap_idx); - U8 int3 = 0xCC; - dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3); - } - } - } - } - - ////////////////////////// - //- rjf: gather all flagged traps, bucketed by process - // - typedef struct DMN_FlaggedTrapTask DMN_FlaggedTrapTask; - struct DMN_FlaggedTrapTask - { - DMN_FlaggedTrapTask *next; - DMN_Handle process; - DMN_TrapChunkList traps; - }; - DMN_FlaggedTrapTask *first_flagged_trap_task = 0; - DMN_FlaggedTrapTask *last_flagged_trap_task= 0; - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1) - { - DMN_Trap *trap = n->v+n_idx; - if(trap->flags != 0) - { - DMN_FlaggedTrapTask *task = 0; - for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) - { - if(dmn_handle_match(t->process, trap->process)) - { - task = t; - break; - } - } - if(task == 0) - { - task = push_array(scratch.arena, DMN_FlaggedTrapTask, 1); - SLLQueuePush(first_flagged_trap_task, last_flagged_trap_task, task); - task->process = trap->process; - } - B32 already_in_task = 0; - for(DMN_TrapChunkNode *n = task->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1) - { - if(n->v[n_idx].id == trap->id) - { - already_in_task = 1; - goto end_look_for_existing_trap_in_task; - } - } - } - end_look_for_existing_trap_in_task:; - if(!already_in_task) - { - dmn_trap_chunk_list_push(scratch.arena, &task->traps, 8, trap); - } - } - } - } - - ////////////////////////// - //- rjf: write all debug register states, for flagged-traps - // - ProfScope("write all debug register states, for flagged-traps") - { - //- rjf: for each flagged trap task, iterate all threads in the - // associated process, and prepare debug registers accordingly - for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) - { - DMN_Handle process = t->process; - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; - child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Thread) - { - switch(child->arch) - { - default:{}break; - - //- rjf: x64 - case Arch_x64: - { - X64_RegBlock regs = {0}; - dmn_w32_thread_read_reg_block(child->arch, child->handle, ®s); - { - U64 trap_idx = 0; - for(DMN_TrapChunkNode *n = t->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count && trap_idx < 4; n_idx += 1, trap_idx += 1) - { - DMN_Trap *trap = &n->v[n_idx]; - U64 *addr_reg = ®s.dr0; - switch(trap_idx) - { - default:{}break; - case 0:{addr_reg = ®s.dr0;}break; - case 1:{addr_reg = ®s.dr1;}break; - case 2:{addr_reg = ®s.dr2;}break; - case 3:{addr_reg = ®s.dr3;}break; - } - addr_reg[0] = trap->vaddr; - regs.dr7 |= bit9|bit10|bit11; - regs.dr7 |= (1ull << (trap_idx*2)); - // NOTE(rjf): global-enable regs.dr7.u64 |= (1ull << (trap_idx*2+1)); - regs.dr7 &= ~((U64)(bit17|bit18|bit19|bit20) << (trap_idx*4)); - regs.dr7 &= ~((U64)(bit15|bit16)); - switch(trap->flags) - { - case DMN_TrapFlag_BreakOnExecute: - default:{}break; - case DMN_TrapFlag_BreakOnWrite: - case DMN_TrapFlag_BreakOnWrite|DMN_TrapFlag_BreakOnExecute: - { - regs.dr7 |= ((U64)bit17) << (trap_idx*4); - }break; - case DMN_TrapFlag_BreakOnRead|DMN_TrapFlag_BreakOnWrite|DMN_TrapFlag_BreakOnExecute: - case DMN_TrapFlag_BreakOnRead|DMN_TrapFlag_BreakOnWrite: - case DMN_TrapFlag_BreakOnRead: - { - regs.dr7 |= (((U64)bit17) << (trap_idx*4)); - regs.dr7 |= (((U64)bit18) << (trap_idx*4)); - }break; - } - switch(trap->size) - { - case 1: - default:{}break; - case 2: - { - regs.dr7 |= (((U64)bit19) << (trap_idx*4)); - }break; - case 4: - { - regs.dr7 |= (((U64)bit19) << (trap_idx*4)); - regs.dr7 |= (((U64)bit20) << (trap_idx*4)); - }break; - case 8: - { - regs.dr7 |= (((U64)bit20) << (trap_idx*4)); - }break; - } - } - } - } - dmn_w32_thread_write_reg_block(child->arch, child->handle, ®s); - }break; - } - } - } - } - } - - ////////////////////////// - //- rjf: produce list of threads which will run - // - DMN_W32_EntityNode *first_run_thread = 0; - DMN_W32_EntityNode *last_run_thread = 0; - ProfScope("produce list of threads which will run") - { - //- rjf: scan all processes - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; - process = process->next) - { - if(process->kind != DMN_W32_EntityKind_Process) {continue;} - - //- rjf: determine if this process is frozen - B32 process_is_frozen = 0; - if(ctrls->run_entities_are_processes) - { - for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(process))) - { - process_is_frozen = 1; - break; - } - } - } - - //- rjf: scan all threads in this process - for(DMN_W32_Entity *thread = process->first; - thread != &dmn_w32_entity_nil; - thread = thread->next) - { - if(thread->kind != DMN_W32_EntityKind_Thread) {continue;} - - //- rjf: determine if this thread is frozen - B32 is_frozen = 0; - { - // rjf: single-step? freeze if not the single-step thread. - if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) - { - is_frozen = !dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->single_step_thread); - } - - // rjf: not single-stepping? determine based on run controls freezing info - else - { - if(ctrls->run_entities_are_processes) - { - is_frozen = process_is_frozen; - } - else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) - { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(thread))) - { - is_frozen = 1; - break; - } - } - if(ctrls->run_entities_are_unfrozen) - { - is_frozen ^= 1; - } - } - } - - //- rjf: disregard all other rules if this is the halter thread - if(dmn_w32_shared->halter_tid == thread->id) - { - is_frozen = 0; - } - - //- rjf: add to list - if(!is_frozen) - { - DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); - n->v = thread; - SLLQueuePush(first_run_thread, last_run_thread, n); - } - } - } - } - - ////////////////////////// - //- rjf: loop, consume win32 debug events until we produce the relevant demon events - // - B32 priority_mode = !dmn_handle_match(dmn_handle_zero(), ctrls->priority_thread); - B32 did_priority_mode = priority_mode; - B32 do_threads_resume = 1; - DMN_W32_EntityNode *first_ran_thread = 0; - DMN_W32_EntityNode *last_ran_thread = 0; - U64 begin_time = now_time_us(); - String8List debug_strings = {0}; - DMN_Event *debug_strings_event = 0; - for(B32 keep_going = 1; keep_going;) - { - keep_going = 0; - - //////////////////////// - //- rjf: resume threads that we want to run - // - // if priority mode? => first, just resume priority thread - // if not? => resume all non-priority threads - // - if(do_threads_resume) ProfScope("resume threads that we want to run") - { - do_threads_resume = 0; - for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) - { - DMN_W32_Entity *thread = n->v; - B32 thread_is_priority = dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->priority_thread); - if((priority_mode && !thread_is_priority) || - (!priority_mode && did_priority_mode && thread_is_priority)) - { - continue; - } - DWORD resume_result = ResumeThread(thread->handle); - DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); - SLLQueuePush(first_ran_thread, last_ran_thread, n); - n->v = thread; - switch(resume_result) - { - case 0xffffffffu: - { - // TODO(rjf): error - unknown cause. need to do GetLastError, FormatMessage - }break; - default: - { - DWORD desired_counter = 0; - DWORD current_counter = resume_result - 1; - if(current_counter != desired_counter) - { - // NOTE(rjf): Warning. The user has manually suspended this thread, - // so even though from Demon's perspective it thinks this thread - // should run, it will not, because the user has manually called - // SuspendThread or used CREATE_SUSPENDED or whatever. - } - }break; - } - if(priority_mode && thread_is_priority) - { - break; - } - } - } - - //////////////////////// - //- rjf: choose win32 resume code - // - DWORD resume_code = DBG_CONTINUE; - { - if(dmn_w32_shared->exception_not_handled && !ctrls->ignore_previous_exception) - { - log_infof("using DBG_EXCEPTION_NOT_HANDLED\n"); - resume_code = DBG_EXCEPTION_NOT_HANDLED; - } - else - { - log_infof("using DBG_CONTINUE\n"); - } - dmn_w32_shared->exception_not_handled = 0; - } - - //////////////////////// - //- rjf: inform windows that we're resuming, run, & obtain next debug event - // - DEBUG_EVENT evt = {0}; - B32 evt_good = 0; - ProfScope("inform windows that we're resuming, run, & obtain next debug event") - { - B32 resume_good = 1; - if(dmn_w32_shared->resume_needed) - { - dmn_w32_shared->resume_needed = 0; - resume_good = !!ContinueDebugEvent(dmn_w32_shared->resume_pid, dmn_w32_shared->resume_tid, resume_code); - DWORD error = GetLastError(); - dmn_w32_shared->resume_needed = 0; - dmn_w32_shared->resume_tid = 0; - dmn_w32_shared->resume_pid = 0; - } - if(resume_good) - { - DWORD wait_ms = 100; - if(priority_mode) - { - wait_ms = 30; - } - evt_good = !!WaitForDebugEvent(&evt, wait_ms); - if(evt_good) - { - dmn_w32_shared->resume_needed = 1; - dmn_w32_shared->resume_pid = evt.dwProcessId; - dmn_w32_shared->resume_tid = evt.dwThreadId; - } - else - { - DWORD err = GetLastError(); - (void)err; - keep_going = 1; - } - if(priority_mode) - { - priority_mode = 0; - do_threads_resume = 1; - } - } - } - - //////////////////////// - //- rjf: process the new event - // - if(evt_good) ProfScope("process the new event") - { - switch(evt.dwDebugEventCode) - { - ////////////////////// - //- rjf: process was created - // - case CREATE_PROCESS_DEBUG_EVENT: - { - // rjf: zero out "process pending" state - dmn_w32_shared->new_process_pending = 0; - - // rjf: unpack event - HANDLE process_handle = evt.u.CreateProcessInfo.hProcess; - HANDLE thread_handle = evt.u.CreateProcessInfo.hThread; - HANDLE module_handle = evt.u.CreateProcessInfo.hFile; - U64 tls_base = (U64)evt.u.CreateProcessInfo.lpThreadLocalBase; - U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage; - U64 module_name_vaddr = (U64)evt.u.CreateProcessInfo.lpImageName; - B32 module_name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0); - DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process_handle, module_base); - - // rjf: create entities (thread/module are implied for initial - they are not reported by win32) - DMN_W32_Entity *process = dmn_w32_entity_alloc(dmn_w32_shared->entities_base, DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); - { - process->handle = process_handle; - process->arch = image_info.arch; - thread->handle = thread_handle; - thread->arch = image_info.arch; - thread->thread.thread_local_base = tls_base; - module->handle = module_handle; - module->module.vaddr_range = r1u64(module_base, image_info.size); - module->module.is_main = 1; - module->module.address_of_name_pointer = module_name_vaddr; - module->module.name_is_unicode = module_name_is_unicode; - } - - // rjf: put thread into suspended state, so it matches expected initial state - SuspendThread(thread_handle); - - // rjf: set up per-process injected code (to run halter threads on & - // generate debug events) - { - U8 injection_code[DMN_W32_INJECTED_CODE_SIZE]; - MemorySet(injection_code, 0xCC, DMN_W32_INJECTED_CODE_SIZE); - injection_code[0] = 0xC3; - U64 injection_size = DMN_W32_INJECTED_CODE_SIZE + sizeof(DMN_W32_InjectedBreak); - U64 injection_address = (U64)VirtualAllocEx(process_handle, 0, injection_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE); - dmn_w32_process_write(process_handle, r1u64(injection_address, injection_address+sizeof(injection_code)), injection_code); - process->proc.injection_address = injection_address; - } - - // rjf: generate events - { - // rjf: create process - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_w32_handle_from_entity(process); - e->arch = image_info.arch; - e->code = evt.dwProcessId; - e->tls_model = DMN_TlsModel_WinodwsNt; - } - - // rjf: create thread - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->arch = image_info.arch; - e->code = evt.dwThreadId; - } - - // rjf: load module - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->arch = image_info.arch; - e->address = module_base; - e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module); - e->tls_index = image_info.tls_index; - } - } - }break; - - ////////////////////// - //- rjf: process exited - // - case EXIT_PROCESS_DEBUG_EVENT: - { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - - // rjf: if this was the process we were going to resume, then we will - // just not resume, and wait for another debug event - if(evt.dwProcessId == dmn_w32_shared->resume_pid) - { - dmn_w32_shared->resume_needed = 0; - dmn_w32_shared->resume_tid = 0; - dmn_w32_shared->resume_pid = 0; - } - - // rjf: generate events for children - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) - { - switch(child->kind) - { - default:{}break; - case DMN_W32_EntityKind_Thread: - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(child); - }break; - case DMN_W32_EntityKind_Module: - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(child); - e->string = dmn_w32_full_path_from_module(arena, child); - }break; - } - } - - // rjf: generate event for process - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_w32_handle_from_entity(process); - e->code = evt.u.ExitProcess.dwExitCode; - } - - // rjf: release entity storage - dmn_w32_entity_release(process); - - // rjf: detach - DebugActiveProcessStop(evt.dwProcessId); - }break; - - ////////////////////// - //- rjf: thread was created - // - case CREATE_THREAD_DEBUG_EVENT: - { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - - // rjf: create thread entity - DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); - { - thread->handle = evt.u.CreateThread.hThread; - thread->arch = process->arch; - thread->thread.thread_local_base = (U64)evt.u.CreateThread.lpThreadLocalBase; - } - - // rjf: suspend thread immediately upon creation, to match with expected suspension state - DWORD sus_result = SuspendThread(thread->handle); - (void)sus_result; - - // rjf: unpack thread name - String8 thread_name = {0}; - if(dmn_w32_GetThreadDescription != 0) - { - WCHAR *thread_name_w = 0; - HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); - if(SUCCEEDED(hr)) - { - thread_name = str8_from_16(arena, str16_cstring((U16 *)thread_name_w)); - LocalFree(thread_name_w); - } - } - - // rjf: determine if this is a "halter thread" - the threads we spawn to halt processes - B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); - - // rjf: generate events for non-halter threads - if(!is_halter) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_CreateThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->arch = thread->arch; - e->code = evt.dwThreadId; - e->string = thread_name; - } - }break; - - ////////////////////// - //- rjf: thread exited - // - case EXIT_THREAD_DEBUG_EVENT: - { - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *process = thread->parent; - - // rjf: determine if this is the halter thread - B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); - - // rjf: generate a halt event if this thread is the halter - if(is_halter) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_Halt; - dmn_w32_shared->halter_process = dmn_handle_zero(); - dmn_w32_shared->halter_tid = 0; - keep_going = 0; - } - - // rjf: if this thread is *not* the halter, then generate a regular exit-thread event - if(!is_halter) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->code = evt.u.ExitThread.dwExitCode; - } - - // rjf: release entity storage - dmn_w32_entity_release(thread); - }break; - - ////////////////////// - //- rjf: DLL was loaded - // - case LOAD_DLL_DEBUG_EVENT: - { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - - // rjf: extract image info - U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll; - DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process->handle, module_base); - - // rjf: create module entity - DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); - { - module->handle = evt.u.LoadDll.hFile; - module->arch = image_info.arch; - module->module.vaddr_range = r1u64(module_base, module_base+image_info.size); - module->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName; - module->module.name_is_unicode = (evt.u.LoadDll.fUnicode != 0); - } - - // rjf: generate event - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->arch = module->arch; - e->address = module_base; - e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module); - e->tls_index = image_info.tls_index; - } - }break; - - ////////////////////// - //- rjf: DLL was unloaded - // - case UNLOAD_DLL_DEBUG_EVENT: - { - U64 module_base = (U64)evt.u.UnloadDll.lpBaseOfDll; - DMN_W32_Entity *module = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Module, module_base); - DMN_W32_Entity *process = module->parent; - - // rjf: generate event - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->string = dmn_w32_full_path_from_module(arena, module); - } - - // rjf: release entity storage - dmn_w32_entity_release(module); - }break; - - ////////////////////// - //- rjf: exception was hit - // - case EXCEPTION_DEBUG_EVENT: - { - //- NOTE(rjf): Notes on multithreaded breakpoint events - // (2021/11/1): - // - // When many threads are simultaneously running, multiple threads - // may hit a trap "at the same time". When this happens there will be - // multiple events in an internal queue that we cannot see. If there - // is another event in the queue we will not see it until we call - // ContinueDebugEvent again, in a subsequent call to demon_os_run. - // - // When we get a trap event, the instruction pointer stored - // in the event will have the address of the int 3 instruction that - // was hit. Our RIP register, however, will be one byte past that. - // So, to get the behavior we want, we need to set the RIP register - // back to the address of the int 3. - // - // To deal with the fact that we may get breakpoint events later that - // were actually from this run what we do is: - // - // #1. If we get a trap event, and it corresponds to a user submitted - // trap, then we treat it is a breakpoint event. - // #2. If we get a trap event, and it does NOT correspond to a user - // trap in this call: - // #A. If the actual unmodified instruction byte is NOT an int 3, - // then this is a queued event from a previous run that is no - // longer applicable and we skip it. - // #B. If the actual unmodified instruction is an int 3, then this - // becomes a trap event and we do not reset RIP. - - //- NOTE(rjf): Further notes on MULTITHREADED STEPPING ACCESS VIOLATION - // EVENTS! @rjf @rjf @rjf - // (2024/05/29): - // - // Just adding another comment here to document that the above long - // comment went completely unnoticed by me during a pass over demon, - // and I had removed the proper rollback stuff here without reading - // the above comment. So this comment just serves to make that - // original comment even heftier. - - //- NOTE(rjf): The exception record struct has a 32-bit version and a - // 64-bit version. We only currently handle the 64-bit version. - - //- rjf: unpack - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *process = thread->parent; - EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; - EXCEPTION_RECORD *exception = &edi->ExceptionRecord; - U64 instruction_pointer = (U64)exception->ExceptionAddress; - - //- rjf: determine if this is the first breakpoint in a process - // (breakpoint notifying us that the debugger is attached) - B32 first_bp = 0; - if(!process->proc.did_first_bp && exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT) - { - process->proc.did_first_bp = 1; - first_bp = 1; - } - - //- rjf: determine if this exception is a trap - B32 is_trap = (!first_bp && - (exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT || - exception->ExceptionCode == DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN)); - - //- rjf: check if this trap is a usage-code-specified trap or something else - B32 hit_user_trap = 0; - U64 user_trap_id = 0; - if(is_trap) - { - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) - { - for(U64 idx = 0; idx < n->count; idx += 1) - { - if(dmn_handle_match(n->v[idx].process, dmn_w32_handle_from_entity(process)) && n->v[idx].vaddr == instruction_pointer) - { - hit_user_trap = 1; - user_trap_id = n->v[idx].id; - break; - } - } - } - } - - //- rjf: check if trap is explicit in the actual code memory - B32 hit_explicit_trap = 0; - if(is_trap && !hit_user_trap) - { - U8 instruction_byte = 0; - if(dmn_w32_process_read_struct(process->handle, instruction_pointer, &instruction_byte)) - { - hit_explicit_trap = (instruction_byte == 0xCC || instruction_byte == 0xCD); - } - } - - //- rjf: determine whether to roll back instruction pointer - B32 should_do_rollback = (hit_user_trap || (is_trap && !hit_explicit_trap)); - - //- rjf: roll back thread's instruction pointer - if(should_do_rollback) ProfScope("roll back thread's instruction pointer") - { - switch(thread->arch) - { - //- rjf: default, general path - default: - { - Temp temp = temp_begin(scratch.arena); - ARCH_Info *arch_info = arch_info_from_arch(thread->arch); - U64 regs_block_size = arch_info->reg_block_size; - void *regs_block = push_array(scratch.arena, U8, regs_block_size); - if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block)) - { - arch_reg_block_write_ip(arch_info, regs_block, instruction_pointer); - dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block); - } - temp_end(temp); - }break; - - //- rjf: x64 (fastpath) - case Arch_x64: - { - CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; - DWORD size = 0; - InitializeContext(0, ctx_flags, 0, &size); - if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - void *ctx_memory = push_array(scratch.arena, U8, size); - if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) - { - ctx = 0; - } - } - if(!GetThreadContext(thread->handle, ctx)) - { - ctx = 0; - } - if(ctx != 0) - { - U64 rip = ctx->Rip; - U64 new_rip = instruction_pointer; - ctx->Rip = new_rip; - SetThreadContext(thread->handle, ctx); - } - }break; - } - } - - //- rjf: not a user trap, not an explicit trap, then it's a trap that - // this thread hit previously but has since skipped - B32 hit_previous_trap = (is_trap && !hit_user_trap && !hit_explicit_trap); - - //- rjf: determine whether to skip this event - B32 skip_event = (hit_previous_trap); - - //- rjf: generate event - if(!skip_event) - { - // rjf: fill top-level info - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_Exception; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->code = exception->ExceptionCode; - e->flags = exception->ExceptionFlags; - e->instruction_pointer = (U64)exception->ExceptionAddress; - e->user_data = user_trap_id; - - //- rjf: fill according to exception code - switch(exception->ExceptionCode) - { - //- rjf: fill breakpoint event info - case DMN_W32_EXCEPTION_BREAKPOINT: - { - DMN_EventKind report_event_kind = DMN_EventKind_Trap; - if(first_bp) - { - report_event_kind = DMN_EventKind_HandshakeComplete; - } - else if(hit_user_trap) - { - report_event_kind = DMN_EventKind_Breakpoint; - } - e->kind = report_event_kind; - }break; - - //- rjf: fill stack buffer overrun event info - case DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN: - { - e->kind = DMN_EventKind_Trap; - if(exception->ExceptionInformation[0] == DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS) - { - // TODO(rjf): this is a shadow stack violation - this can imply that the spoof was hit. - // need to handle this correctly in the ctrl layer when stepping w/ a spoof set. - // - // @shadow_stack_step - } - }break; - - //- rjf: fill single-step event info - case DMN_W32_EXCEPTION_SINGLE_STEP: - { - e->kind = DMN_EventKind_SingleStep; - - // NOTE(rjf): data breakpoints are reported via single-steps - // over the instructions which caused the breakpoint to be - // hit - so if we have data breakpoints set, we need to - // check this thread's debug registers, to determine if this - // is a regular single-step or a data breakpoint hit. - { - // rjf: first determine the flagged trap index - U64 flagged_trap_idx = 0; - switch(thread->arch) - { - default:{NotImplemented;}break; - case Arch_x64: - { - X64_RegBlock regs = {0}; - dmn_w32_thread_read_reg_block(thread->arch, thread->handle, ®s); - if(regs.dr6 & 0xF) - { - e->kind = DMN_EventKind_Breakpoint; - if(0){} - else if(regs.dr7 & (1ull<<0) && regs.dr6 & (1ull<<0)) { flagged_trap_idx = 0; e->address = regs.dr0; } - else if(regs.dr7 & (1ull<<2) && regs.dr6 & (1ull<<1)) { flagged_trap_idx = 1; e->address = regs.dr1; } - else if(regs.dr7 & (1ull<<4) && regs.dr6 & (1ull<<2)) { flagged_trap_idx = 2; e->address = regs.dr2; } - else if(regs.dr7 & (1ull<<8) && regs.dr6 & (1ull<<3)) { flagged_trap_idx = 3; e->address = regs.dr3; } - } - }break; - } - - // rjf: find the flagged trap task for this thread's process - DMN_W32_Entity *process = thread->parent; - DMN_FlaggedTrapTask *task = 0; - for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) - { - if(dmn_handle_match(t->process, dmn_w32_handle_from_entity(process))) - { - task = t; - break; - } - } - - // rjf: find the trap - DMN_Trap *trap = 0; - if(task != 0) - { - U64 trap_idx = 0; - for(DMN_TrapChunkNode *n = task->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) - { - if(trap_idx == flagged_trap_idx) - { - trap = &n->v[n_idx]; - goto break_search_for_flagged_trap; - } - } - } - break_search_for_flagged_trap:; - } - - // rjf: fill event based on trap - if(trap != 0) - { - e->user_data = trap->id; - } - } - }break; - - //- rjf: fill throw info - case DMN_W32_EXCEPTION_THROW: - { - U64 exception_sp = 0; - U64 exception_ip = 0; - if(exception->NumberParameters >= 3) - { - exception_sp = (U64)exception->ExceptionInformation[1]; - exception_ip = (U64)exception->ExceptionInformation[2]; - } - e->stack_pointer = exception_sp; - e->exception_kind = DMN_ExceptionKind_CppThrow; - e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); - }break; - - //- rjf: fill access violation info - case DMN_W32_EXCEPTION_ACCESS_VIOLATION: - case DMN_W32_EXCEPTION_IN_PAGE_ERROR: - { - U64 exception_address = 0; - DMN_ExceptionKind exception_kind = DMN_ExceptionKind_Null; - if(exception->NumberParameters >= 2) - { - switch(exception->ExceptionInformation[0]) - { - case 0: exception_kind = DMN_ExceptionKind_MemoryRead; break; - case 1: exception_kind = DMN_ExceptionKind_MemoryWrite; break; - case 8: exception_kind = DMN_ExceptionKind_MemoryExecute; break; - } - exception_address = exception->ExceptionInformation[1]; - } - e->address = exception_address; - e->exception_kind = exception_kind; - e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); - }break; - - //- rjf: fill set-thread-name info - case DMN_W32_EXCEPTION_SET_THREAD_NAME: - if(exception->NumberParameters >= 2) - { - U64 thread_name_address = exception->ExceptionInformation[1]; - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - String8List thread_name_strings = {0}; - { - U64 read_addr = thread_name_address; - U64 total_string_size = 0; - for(;total_string_size < KB(4);) - { - U8 *buffer = push_array(scratch.arena, U8, 256); - B32 good_read = dmn_w32_process_read(process->handle, r1u64(read_addr, read_addr+256), buffer); - if(good_read) - { - U64 size = 256; - for(U64 idx = 0; idx < 256; idx += 1) - { - if(buffer[idx] == 0) - { - size = idx; - break; - } - } - String8 string_part = str8(buffer, size); - str8_list_push(scratch.arena, &thread_name_strings, string_part); - total_string_size += size; - read_addr += size; - if(size < 256) - { - break; - } - } - else - { - break; - } - } - } - e->kind = DMN_EventKind_SetThreadName; - e->string = str8_list_join(arena, &thread_name_strings, 0); - if(exception->NumberParameters > 2) - { - e->code = exception->ExceptionInformation[2]; - } - }break; - - //- rjf: fill set-thread-color info - case DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR: - { - e->kind = DMN_EventKind_SetThreadColor; - e->code = exception->ExceptionInformation[0]; - e->user_data = exception->ExceptionInformation[1]; - }break; - - //- rjf: fill set-data-breakpoint info - case DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT: - { - U64 vaddr = exception->ExceptionInformation[0]; - U64 size = exception->ExceptionInformation[1]; - U64 read = exception->ExceptionInformation[2]; - U64 write = exception->ExceptionInformation[3]; - U64 exec = exception->ExceptionInformation[4]; - U64 set = exception->ExceptionInformation[5]; - e->kind = set ? DMN_EventKind_SetBreakpoint : DMN_EventKind_UnsetBreakpoint; - e->address = vaddr; - e->size = size; - if(read) { e->flags |= DMN_TrapFlag_BreakOnRead; } - if(write) { e->flags |= DMN_TrapFlag_BreakOnWrite; } - if(exec) { e->flags |= DMN_TrapFlag_BreakOnExecute; } - }break; - - //- rjf: fill set-vaddr-range-note info - case DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE: - { - U64 vaddr = exception->ExceptionInformation[0]; - U64 size = exception->ExceptionInformation[1]; - U64 name_vaddr = exception->ExceptionInformation[2]; - U64 name_size = exception->ExceptionInformation[3]; - U8 *name_buffer = push_array(arena, U8, name_size); - dmn_w32_process_read(process->handle, r1u64(name_vaddr, name_vaddr+name_size), name_buffer), - e->kind = DMN_EventKind_SetVAddrRangeNote; - e->address = vaddr; - e->size = size; - e->string = str8(name_buffer, name_size); - }break; - - //- rjf: unhandled exception case - default: - { - e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); - }break; - } - } - }break; - - ////////////////////// - //- rjf: output debug string was gathered - // - case OUTPUT_DEBUG_STRING_EVENT: - { - // rjf: unpack event - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; - U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; - - // rjf: read memory - U8 *buffer = push_array_no_zero(scratch.arena, U8, string_size + 1); - dmn_w32_process_read(process->handle, r1u64(string_address, string_address+string_size), buffer); - buffer[string_size] = 0; - - // rjf: extract into string - String8 debug_string = str8(buffer, string_size); - if(debug_string.size != 0 && buffer[string_size-1] == 0) - { - debug_string.size -= 1; - } - - // rjf: make debug string event - debug_strings_event = dmn_event_list_push(arena, &events); - debug_strings_event->kind = DMN_EventKind_DebugString; - - // rjf: push into debug strings - str8_list_push(scratch.arena, &debug_strings, debug_string); - keep_going = 1; - - // rjf: exit loop, given sufficient amount of text - if(debug_strings.total_size >= KB(4)) - { - keep_going = 0; - } - }break; - - ////////////////////// - //- rjf: a "rip event" - a "system debugging error". - // - case RIP_EVENT: - { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_Exception; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - }break; - - ////////////////////// - //- rjf: default case - some kind of debugging event that we don't currently consume. - // - default: - { - NoOp; - }break; - } - } - - //////////////////////// - //- rjf: exit loop after a little while, so we keep pumping e.g. debug strings - // - if(now_time_us() >= begin_time+100000 && debug_strings.total_size != 0) - { - keep_going = 0; - } - } - - //////////////////////// - //- rjf: send out event for any remaining debug strings - // - if(debug_strings.total_size != 0 && debug_strings_event != 0) - { - String8 debug_strings_joined = str8_list_join(arena, &debug_strings, 0); - debug_strings_event->string = debug_strings_joined; - } - - //////////////////////// - //- rjf: suspend threads which ran - // - ProfScope("suspend threads which ran") - { - for(DMN_W32_EntityNode *n = first_ran_thread; n != 0; n = n->next) - { - DMN_W32_Entity *thread = n->v; - if(thread->kind != DMN_W32_EntityKind_Thread) - { - continue; - } - DWORD suspend_result = SuspendThread(thread->handle); - switch(suspend_result) - { - case 0xffffffffu: - { - // TODO(rjf): error - unknown cause. need to do do GetLastError, FormatMessage - // - // NOTE(rjf): this can happen when the event is EXIT_THREAD_DEBUG_EVENT - // or EXIT_PROCESS_DEBUG_EVENT. after such an event, SuspendThread - // gives error code 5 (access denied). this has no adverse effects, but - // if we want to start reporting errors we should take care to avoid - // calling SuspendThread in that case. - }break; - default: - { - DWORD desired_counter = 1; - DWORD current_counter = suspend_result + 1; - if(current_counter != desired_counter) - { - // NOTE(rjf): Warning. We've suspended to something higher than 1. - // In this case, it means the user probably created the thread in - // a suspended state, or they called SuspendThread. - } - }break; - } - } - } - - //////////////////////// - //- rjf: gather new thread-names - // - ProfScope("gather new thread names") if(dmn_w32_GetThreadDescription != 0) - { - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; - process = process->next) - { - if(process->kind != DMN_W32_EntityKind_Process) { continue; } - for(DMN_W32_Entity *thread = process->first; - thread != &dmn_w32_entity_nil; - thread = thread->next) - { - if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } - if(thread->thread.last_name_hash == 0 || - thread->thread.name_gather_time_us+1000000 <= now_time_us()) - { - String8 name = {0}; - { - WCHAR *thread_name_w = 0; - HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); - if(SUCCEEDED(hr)) - { - name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w)); - LocalFree(thread_name_w); - } - } - U64 name_hash = dmn_w32_hash_from_string(name); - if(name.size != 0 && name_hash != thread->thread.last_name_hash) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_SetThreadName; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); - e->string = push_str8_copy(arena, name); - } - thread->thread.name_gather_time_us = now_time_us(); - thread->thread.last_name_hash = name_hash; - } - } - } - } - - ////////////////////////// - //- rjf: restore original memory at trap locations - // - ProfScope("restore original memory at trap locations") - { - U64 trap_idx = 0; - for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) - { - for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) - { - DMN_Trap *trap = n->v+n_idx; - if(trap->flags == 0) - { - U8 og_byte = trap_swap_bytes[trap_idx]; - if(og_byte != 0xCC) - { - dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &og_byte); - } - } - } - } - } - - ////////////////////////// - //- rjf: clear all debug register states, for flagged-traps - // - ProfScope("clear all debug register states, for flagged-traps") - { - for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) - { - DMN_Handle process = t->process; - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; - child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Thread) - { - switch(child->arch) - { - default:{}break; - - //- rjf: x64 - case Arch_x64: - { - X64_RegBlock regs = {0}; - dmn_w32_thread_read_reg_block(child->arch, child->handle, ®s); - regs.dr7 = 0; - dmn_w32_thread_write_reg_block(child->arch, child->handle, ®s); - }break; - } - } - } - } - } - - ////////////////////////// - //- rjf: unset single step bit - // - if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("unset single step bit") - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); - Arch arch = thread->arch; - switch(arch) - { - //- rjf: unimplemented win32/arch combos - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - - case Arch_x64: - { - if(!GetThreadContext(thread->handle, single_step_thread_ctx)) - { - single_step_thread_ctx = 0; - } - if(single_step_thread_ctx != 0) - { - U64 rflags = single_step_thread_ctx->EFlags|0x2; - U64 new_rflags = rflags & ~0x100; - single_step_thread_ctx->EFlags = new_rflags; - SetThreadContext(thread->handle, single_step_thread_ctx); - } - }break; - } - } - - scratch_end(scratch); - }break; - - //////////////////////////// - //- rjf: produce debug events from queued up detached processes - // - case DMN_W32_EventGenPath_DetachProcesses: - { - for(DMN_HandleNode *n = dmn_w32_shared->detach_processes.first; n != 0; n = n->next) - { - DMN_W32_Entity *process = dmn_w32_entity_from_handle(n->v); - - // rjf: push exit thread events - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Thread) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(child); - } - } - - // rjf: push unload module events - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) - { - if(child->kind == DMN_W32_EntityKind_Module) - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(child); - e->string = dmn_w32_full_path_from_module(arena, child); - } - } - - // rjf: push exit process event - { - DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_w32_handle_from_entity(process); - } - - // rjf: free process - dmn_w32_entity_release(process); - } - - // rjf: reset queued up detached processes - MemoryZeroStruct(&dmn_w32_shared->detach_processes); - arena_clear(dmn_w32_shared->detach_arena); - }break; - } - - dmn_access_close(); - return events; -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) - -internal void -dmn_halt(U64 code, U64 user_data) -{ - if(dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) - { - DMN_W32_Entity *process = &dmn_w32_entity_nil; - for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first; - entity != &dmn_w32_entity_nil; - entity = entity->next) - { - if(entity->kind == DMN_W32_EntityKind_Process) - { - process = entity; - break; - } - } - if(process != &dmn_w32_entity_nil) - { - dmn_w32_shared->halter_process = dmn_w32_handle_from_entity(process); - DMN_W32_InjectedBreak injection = {code, user_data}; - U64 data_injection_address = process->proc.injection_address + DMN_W32_INJECTED_CODE_SIZE; - dmn_w32_process_write_struct(process->handle, data_injection_address, &injection); - dmn_w32_shared->halter_tid = dmn_w32_inject_thread(process->handle, process->proc.injection_address); - } - } -} - -//////////////////////////////// -//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) - -//- rjf: non-blocking-control-thread access barriers - -internal B32 -dmn_access_open(void) -{ - B32 result = 0; - if(dmn_w32_ctrl_thread) - { - result = 1; - } - else - { - mutex_take(dmn_w32_shared->access_mutex); - result = !dmn_w32_shared->access_run_state; - } - return result; -} - -internal void -dmn_access_close(void) -{ - if(!dmn_w32_ctrl_thread) - { - mutex_drop(dmn_w32_shared->access_mutex); - } -} - -//- rjf: processes - -internal U64 -dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) -{ - U64 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - result = (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_RESERVE, PAGE_READWRITE); - if(result == 0) - { - result = (U64)VirtualAllocEx(process_entity->handle, 0, size, MEM_RESERVE, PAGE_READWRITE); - } - } - return result; -} - -internal void -dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size) -{ - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_COMMIT, PAGE_READWRITE); - } -} - -internal void -dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size) -{ - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - VirtualFreeEx(process_entity->handle, (void *)vaddr, size, MEM_DECOMMIT); - } -} - -internal void -dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) -{ - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - VirtualFreeEx(process_entity->handle, (void *)vaddr, 0, MEM_RELEASE); - } -} - -internal void -dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, AccessFlags flags) -{ - DMN_AccessScope - { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - DWORD old_flags = 0; - DWORD new_flags = PAGE_NOACCESS; - switch(flags) - { - default:{}break; - case AccessFlag_Execute:{new_flags = PAGE_EXECUTE;}break; - case AccessFlag_Execute|AccessFlag_Read:{new_flags = PAGE_EXECUTE_READ;}break; - case AccessFlag_Execute|AccessFlag_Read|AccessFlag_Write:{new_flags = PAGE_EXECUTE_READWRITE;}break; - case AccessFlag_Read:{new_flags = PAGE_READONLY;}break; - case AccessFlag_Read|AccessFlag_Write:{new_flags = PAGE_READWRITE;}break; - } - VirtualProtectEx(process_entity->handle, (void *)vaddr, size, new_flags, &old_flags); - } -} - -internal U64 -dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) -{ - U64 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); - result = dmn_w32_process_read(entity->handle, range, dst); - } - return result; -} - -internal B32 -dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); - result = dmn_w32_process_write(entity->handle, range, src); - } - return result; -} - -//- rjf: threads - -internal Arch -dmn_arch_from_thread(DMN_Handle handle) -{ - Arch arch = Arch_Null; - DMN_AccessScope - { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - arch = entity->arch; - } - return arch; -} - -internal U64 -dmn_stack_base_vaddr_from_thread(DMN_Handle handle) -{ - U64 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - if(thread->kind == DMN_W32_EntityKind_Thread) - { - DMN_W32_Entity *process = thread->parent; - U64 tlb = thread->thread.thread_local_base; - switch(thread->arch) - { - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - case Arch_x64: - { - U64 stack_base_addr = tlb + 0x8; - dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); - }break; - } - } - } - return result; -} - -internal U64 -dmn_tls_root_vaddr_from_thread(DMN_Handle handle) -{ - U64 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - if(entity->kind == DMN_W32_EntityKind_Thread) - { - result = entity->thread.thread_local_base; - switch(entity->arch) - { - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - case Arch_x64: - { - result += 88; - }break; - } - } - } - return result; -} - -internal B32 -dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block); - } - return result; -} - -internal B32 -dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) -{ - B32 result = 0; - DMN_AccessScope - { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block); - } - return result; -} - -//- rjf: system process listing - -internal void -dmn_process_iter_begin(DMN_ProcessIter *iter) -{ - MemoryZeroStruct(iter); - iter->v[0] = (U64)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); -} - -internal B32 -dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out) -{ - B32 result = 0; - - //- rjf: get the next process entry - PROCESSENTRY32W process_entry = {sizeof(process_entry)}; - HANDLE snapshot = (HANDLE)iter->v[0]; - if(iter->v[1] == 0) - { - if(Process32FirstW(snapshot, &process_entry)) - { - result = 1; - } - } - else - { - if(Process32NextW(snapshot, &process_entry)) - { - result = 1; - } - } - - //- rjf: increment counter - iter->v[1] += 1; - - //- rjf: convert to process info - if(result) - { - info_out->name = str8_from_16(arena, str16_cstring((U16*)process_entry.szExeFile)); - info_out->pid = (U32)process_entry.th32ProcessID; - } - - return result; -} - -internal void -dmn_process_iter_end(DMN_ProcessIter *iter) -{ - CloseHandle((HANDLE)iter->v[0]); - MemoryZeroStruct(iter); -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +dmn_w32_hash_from_string(String8 string) +{ + U64 result = 5381; + for(U64 i = 0; i < string.size; i += 1) + { + result = ((result << 5) + result) + string.str[i]; + } + return result; +} + +internal U64 +dmn_w32_hash_from_id(U64 id) +{ + return dmn_w32_hash_from_string(str8_struct(&id)); +} + +//////////////////////////////// +//~ rjf: Entity Helpers + +//- rjf: entity <-> handle + +internal DMN_Handle +dmn_w32_handle_from_entity(DMN_W32_Entity *entity) +{ + U32 idx = (U32)(entity - dmn_w32_shared->entities_base); + U32 gen = entity->gen; + DMN_Handle handle = {idx, gen}; + return handle; +} + +internal DMN_W32_Entity * +dmn_w32_entity_from_handle(DMN_Handle handle) +{ + U32 idx = handle.u32[0]; + U32 gen = handle.u32[1]; + DMN_W32_Entity *entity = dmn_w32_shared->entities_base + idx; + if(entity->gen != gen) + { + entity = &dmn_w32_entity_nil; + } + return entity; +} + +//- rjf: entity allocation/deallocation + +internal DMN_W32_Entity * +dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) +{ + // rjf: allocate + DMN_W32_Entity *e = dmn_w32_shared->entities_first_free; + { + U32 gen = 0; + if(e != 0) + { + SLLStackPop(dmn_w32_shared->entities_first_free); + gen = e->gen; + } + else + { + e = push_array_no_zero(dmn_w32_shared->entities_arena, DMN_W32_Entity, 1); + dmn_w32_shared->entities_count += 1; + } + MemoryZeroStruct(e); + e->gen = gen+1; + } + + // rjf: fill + { + e->kind = kind; + e->id = id; + e->parent = parent; + e->next = e->prev = e->first = e->last = &dmn_w32_entity_nil; + if(parent != &dmn_w32_entity_nil) + { + DLLPushBack_NPZ(&dmn_w32_entity_nil, parent->first, parent->last, e, next, prev); + } + } + + // rjf: insert into id -> entity map + if(id != 0) + { + U64 hash = dmn_w32_hash_from_id(id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->id == id) + { + node = n; + break; + } + } + if(node == 0) + { + node = dmn_w32_shared->entities_id_hash_node_free; + if(node != 0) + { + SLLStackPop(dmn_w32_shared->entities_id_hash_node_free); + } + else + { + node = push_array(dmn_w32_shared->arena, DMN_W32_EntityIDHashNode, 1); + } + DLLPushBack(slot->first, slot->last, node); + } + node->id = id; + node->entity = e; + } + + return e; +} + +internal void +dmn_w32_entity_release(DMN_W32_Entity *entity) +{ + // rjf: unhook root + if(entity->parent != &dmn_w32_entity_nil) + { + DLLRemove_NPZ(&dmn_w32_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + } + + // rjf: walk every entity in this tree, free each + if(entity != &dmn_w32_entity_nil) + { + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + DMN_W32_Entity *e; + }; + Task start_task = {0, entity}; + Task *first_task = &start_task; + Task *last_task = &start_task; + for(Task *t = first_task; t != 0; t = t->next) + { + for(DMN_W32_Entity *child = t->e->first; child != &dmn_w32_entity_nil; child = child->next) + { + Task *t = push_array(scratch.arena, Task, 1); + t->e = child; + SLLQueuePush(first_task, last_task, t); + } + + // rjf: free entity + SLLStackPush(dmn_w32_shared->entities_first_free, t->e); + t->e->gen += 1; + if(t->e->kind == DMN_W32_EntityKind_Module) + { + CloseHandle(t->e->handle); + } + t->e->kind = DMN_W32_EntityKind_Null; + + // rjf: remove from id -> entity map + if(t->e->id != 0) + { + U64 hash = dmn_w32_hash_from_id(t->e->id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->id == t->e->id && n->entity == t->e) + { + DLLRemove(slot->first, slot->last, n); + SLLStackPush(dmn_w32_shared->entities_id_hash_node_free, n); + break; + } + } + } + } + scratch_end(scratch); + } +} + +//- rjf: kind*id -> entity + +internal DMN_W32_Entity * +dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id) +{ + DMN_W32_Entity *result = &dmn_w32_entity_nil; + U64 hash = dmn_w32_hash_from_id(id); + U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; + DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; + DMN_W32_EntityIDHashNode *node = 0; + for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + { + if(n->entity->kind == kind && n->id == id) + { + node = n; + break; + } + } + if(node != 0) + { + result = node->entity; + } + return result; +} + +//////////////////////////////// +//~ rjf: Module Info Extraction + +internal String8 +dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) +{ + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: extract path from module + String16 path16 = {0}; + String8 path8 = {0}; + { + // rjf: handle -> full path + if(module->handle != 0) + { + DWORD cap16 = GetFinalPathNameByHandleW(module->handle, 0, 0, VOLUME_NAME_DOS); + U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); + DWORD size16 = GetFinalPathNameByHandleW(module->handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); + path16 = str16(buffer16, size16); + } + + // rjf: fallback (main module only): process -> full path + if(path16.size == 0 && module->module.is_main) + { + DMN_W32_Entity *process = module->parent; + DWORD size = KB(4); + U16 *buf = push_array_no_zero(scratch.arena, U16, size); + if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size)) + { + path16 = str16(buf, size); + } + } + + // rjf: fallback (any module - no guarantee): address_of_name -> full path + if(path16.size == 0 && module->module.address_of_name_pointer != 0) + { + DMN_W32_Entity *process = module->parent; + U64 ptr_size = bit_size_from_arch(process->arch)/8; + U64 name_pointer = 0; + if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) + { + if(name_pointer != 0) + { + if(module->module.name_is_unicode) + { + path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer); + } + else + { + path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer); + } + } + } + } + } + + // rjf: produce finalized result + String8 result = {0}; + { + if(path16.size > 0) + { + // rjf: skip the extended path thing if necessary + if(path16.size >= 4 && + path16.str[0] == L'\\' && + path16.str[1] == L'\\' && + path16.str[2] == L'?' && + path16.str[3] == L'\\') + { + path16.size -= 4; + path16.str += 4; + } + + // rjf: convert to UTF-8 + result = str8_from_16(arena, path16); + } + else + { + // rjf: skip the extended path thing if necessary + if (path8.size >= 4 && + path8.str[0] == L'\\' && + path8.str[1] == L'\\' && + path8.str[2] == L'?' && + path8.str[3] == L'\\') + { + path8.size -= 4; + path8.str += 4; + } + + // rjf: copy to output arena + result = push_str8_copy(arena, path8); + } + } + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Win32-Level Process/Thread Reads/Writes + +//- rjf: processes + +internal U64 +dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) +{ + U64 bytes_read = 0; + U8 *ptr = (U8*)dst; + U8 *opl = ptr + dim_1u64(range); + U64 cursor = range.min; + for(;ptr < opl;) + { + SIZE_T to_read = (SIZE_T)(opl - ptr); + SIZE_T actual_read = 0; + if(!ReadProcessMemory(process, (LPCVOID)cursor, ptr, to_read, &actual_read)) + { + DWORD error = GetLastError(); + log_infof("'Win32 ReadProcessMemory failure': { [0x%I64x, 0x%I64x), code: %i }\n", range.min, range.max, error); + // NOTE(rjf): I have discovered that `actual_read` is *NOT* guaranteed to have + // a usable value if `ReadProcessMemory` fails! + // bytes_read += actual_read; + (void)error; + break; + } + ptr += actual_read; + cursor += actual_read; + bytes_read += actual_read; + } + return bytes_read; +} + +internal B32 +dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src) +{ + B32 result = 1; + U8 *ptr = (U8*)src; + U8 *opl = ptr + dim_1u64(range); + U64 cursor = range.min; + for(;ptr < opl;) + { + SIZE_T to_write = (SIZE_T)(opl - ptr); + SIZE_T actual_write = 0; + if(!WriteProcessMemory(process, (LPVOID)cursor, ptr, to_write, &actual_write)) + { + result = 0; + break; + } + ptr += actual_write; + cursor += actual_write; + } + return result; +} + +internal String8 +dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) +{ + // TODO(rjf): @rewrite + // + // OLD: this could be done better with a demon_w32_read_memory + // that returns a read amount instead of a success/fail. + // + // (dmn_w32_process_read now does this, so we can switch to it) + + // scan piece by piece + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 max_cap = 256; + U64 cap = max_cap; + U64 read_p = address; + for (;;){ + U8 *block = push_array(scratch.arena, U8, cap); + for (;cap > 0;){ + if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ + break; + } + cap /= 2; + } + read_p += cap; + + U64 block_opl = 0; + for (;block_opl < cap; block_opl += 1){ + if (block[block_opl] == 0){ + break; + } + } + + if (block_opl > 0){ + str8_list_push(scratch.arena, &list, str8(block, block_opl)); + } + + if (block_opl < cap || cap == 0){ + break; + } + } + + // assemble results + String8 result = str8_list_join(arena, &list, 0); + scratch_end(scratch); + return(result); +} + +internal String16 +dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) +{ + // TODO(rjf): @rewrite + // + // OLD: this could be done better with a demon_w32_read_memory + // that returns a read amount instead of a success/fail. + // + // (dmn_w32_process_read now does this, so we can switch to it) + + // scan piece by piece + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 max_cap = 256; + U64 cap = max_cap; + U64 read_p = address; + for (;;){ + U8 *block = push_array(scratch.arena, U8, cap); + for (;cap > 1;){ + if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ + break; + } + cap /= 2; + } + read_p += cap; + + U16 *block16 = (U16*)block; + (void)block16; + U64 block_opl = 0; + for (;block_opl < cap; block_opl += 2){ + if (*(U16*)(block + block_opl) == 0){ + break; + } + } + + if (block_opl > 0){ + str8_list_push(scratch.arena, &list, str8(block, block_opl)); + } + + if (block_opl < cap || cap == 0){ + break; + } + } + + // assemble results + String8 joined = str8_list_join(arena, &list, 0); + String16 result = {(U16*)joined.str, joined.size/2}; + scratch_end(scratch); + return(result); +} + +internal DMN_W32_ImageInfo +dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) +{ + // rjf: find PE offset + U32 pe_offset = 0; + { + U64 dos_magic_off = base_vaddr; + U16 dos_magic = 0; + dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); + if(dos_magic == PE_DOS_MAGIC) + { + U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); + dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset); + } + } + + // rjf: get COFF header + B32 got_coff_header = 0; + U64 coff_header_off = 0; + COFF_FileHeader coff_header = {0}; + if(pe_offset > 0) + { + U64 pe_magic_off = base_vaddr + pe_offset; + U32 pe_magic = 0; + dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); + if(pe_magic == PE_MAGIC) + { + coff_header_off = pe_magic_off + sizeof(pe_magic); + got_coff_header = dmn_w32_process_read_struct(process, coff_header_off, &coff_header); + } + } + + DMN_W32_ImageInfo result = zero_struct; + if(got_coff_header) + { + U64 optional_off = coff_header_off + sizeof(COFF_FileHeader); + + Arch arch = arch_from_coff_machine(coff_header.machine); + U64 image_size = 0; + U64 data_dir_count = 0; + U64 data_dir_off = max_U64; + U64 tls_index = max_U64; + + // parse optional header + if(pe_has_plus_header(coff_header.machine)) + { + PE_OptionalHeader32Plus opt_header = {0}; + if(dmn_w32_process_read_struct(process, optional_off, &opt_header)) + { + image_size = opt_header.sizeof_image; + data_dir_count = opt_header.data_dir_count; + data_dir_off = optional_off + sizeof(opt_header); + } + else { Assert(0 && "failed to read optional header"); } + } + else + { + PE_OptionalHeader32 opt_header = {0}; + if(dmn_w32_process_read_struct(process, optional_off, &opt_header)) + { + image_size = opt_header.sizeof_image; + data_dir_count = opt_header.data_dir_count; + data_dir_off = optional_off + sizeof(opt_header); + } + else { Assert(0 && "failed to read optional header"); } + } + + // extract TLS index + if(PE_DataDirectoryIndex_TLS < data_dir_count) + { + U64 tls_dir_vaddr = data_dir_off + PE_DataDirectoryIndex_TLS * sizeof(PE_DataDirectory); + PE_DataDirectory tls_dir = {0}; + if(dmn_w32_process_read_struct(process, tls_dir_vaddr, &tls_dir)) + { + if(pe_has_plus_header(coff_header.machine)) + { + if(tls_dir.virt_size == sizeof(PE_TLSHeader64)) + { + PE_TLSHeader64 tls_header = {0}; + if(dmn_w32_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) + { + U64 tls_index64 = 0; + if(dmn_w32_process_read_struct(process, tls_header.index_address, &tls_index64)) + { + tls_index = tls_index64; + } + else { Assert(0 && "failed to read TLS Index 64"); } + } + else { Assert(0 && "failed to read TLS Header 64"); } + } + } + else + { + if(tls_dir.virt_size == sizeof(PE_TLSHeader32)) + { + PE_TLSHeader32 tls_header = {0}; + if(dmn_w32_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) + { + U32 tls_index32 = 0; + if(dmn_w32_process_read_struct(process, tls_header.index_address, &tls_index32)) + { + tls_index = tls_index32; + } + else { Assert(0 && "failed to read TLS Index 32"); } + } + else { Assert(0 && "failed to read TLS Header32"); } + } + } + } + else { Assert(0 && "failed to read TLS directory"); } + } + + // fill out result + result.arch = arch; + result.size = image_size; + result.tls_index = tls_index; + } + else { Assert(0 && "failed to find COFF file header"); } + + return result; +} + +//- rjf: threads + +internal B32 +dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) +{ + B32 result = 0; + ProfBeginFunction(); + switch(arch) + { + //////////////////////////// + //- rjf: unimplemented win32/arch combos + // + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: + {NotImplemented;}break; + + //////////////////////////// + //- rjf: x64 + // + case Arch_x64: + { + Temp scratch = scratch_begin(0, 0); + X64_RegBlock *dst = (X64_RegBlock *)reg_block; + + //- rjf: unpack info about available features + U32 feature_mask = GetEnabledXStateFeatures(); + B32 xstate_enabled = (feature_mask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512 | XSTATE_MASK_CET_U)) != 0; + + //- rjf: set up context + CONTEXT *ctx = 0; + U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0); + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) + { + ctx = 0; + } + } + + //- rjf: unpack features available on this context + if (xstate_enabled) + { + SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512 | XSTATE_MASK_CET_U); + } + + //- rjf: get thread context + if(!GetThreadContext(thread, ctx)) + { + ctx = 0; + } + + //- rjf: bad context -> abort + if(ctx == 0) + { + break; + } + result = 1; + + DWORD64 xstate_mask = 0; + GetXStateFeaturesMask(ctx, &xstate_mask); + + //- rjf: convert context -> X64_RegBlock + XSAVE_FORMAT *xsave = &ctx->FltSave; + dst->rax = ctx->Rax; + dst->rcx = ctx->Rcx; + dst->rdx = ctx->Rdx; + dst->rbx = ctx->Rbx; + dst->rsp = ctx->Rsp; + dst->rbp = ctx->Rbp; + dst->rsi = ctx->Rsi; + dst->rdi = ctx->Rdi; + dst->r8 = ctx->R8; + dst->r9 = ctx->R9; + dst->r10 = ctx->R10; + dst->r11 = ctx->R11; + dst->r12 = ctx->R12; + dst->r13 = ctx->R13; + dst->r14 = ctx->R14; + dst->r15 = ctx->R15; + dst->rip = ctx->Rip; + dst->cs = ctx->SegCs; + dst->ds = ctx->SegDs; + dst->es = ctx->SegEs; + dst->fs = ctx->SegFs; + dst->gs = ctx->SegGs; + dst->ss = ctx->SegSs; + dst->dr0 = ctx->Dr0; + dst->dr1 = ctx->Dr1; + dst->dr2 = ctx->Dr2; + dst->dr3 = ctx->Dr3; + dst->dr6 = ctx->Dr6; + dst->dr7 = ctx->Dr7; + // NOTE(rjf): this bit is "supposed to always be 1", according to old info. + // may need to be investigated. + dst->rflags = ctx->EFlags | 0x2; + dst->fcw = xsave->ControlWord; + dst->fsw = xsave->StatusWord; + dst->ftw = xsave->TagWord; + dst->fop = xsave->ErrorOpcode; + MemoryCopy(&dst->fip, &xsave->ErrorOffset, sizeof(U64)); + MemoryCopy(&dst->fdp, &xsave->DataOffset, sizeof(U64)); + dst->mxcsr = xsave->MxCsr; + dst->mxcsr_mask = xsave->MxCsr_Mask; + { + M128A *float_s = xsave->FloatRegisters; + U80 *float_d = &dst->st0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, sizeof(*float_d)); + } + } + + // SSE registers are always available in x64 + { + M128A *xmm_s = xsave->XmmRegisters; + U512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, xmm_s += 1, zmm_d += 1) + { + MemoryCopy(zmm_d, xmm_s, sizeof(*xmm_s)); + } + } + + // AVX + if(xstate_mask & XSTATE_MASK_AVX) + { + DWORD avx_length = 0; + U8 *avx_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); + if(avx_length == 16 * sizeof(U128)) + { + U512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, avx_s += sizeof(U128), zmm_d += 1) + { + MemoryCopy(&zmm_d->u8[16], avx_s, sizeof(U128)); + } + } + } + else + { + U512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, zmm_d += 1) + { + MemoryZero(&zmm_d->u8[16], sizeof(U128)); + } + } + + // AVX-512 + if(xstate_mask & XSTATE_MASK_AVX512) + { + // rjf: kmask + DWORD kmask_length = 0; + U64 *kmask_s = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); + if(kmask_length == 8 * sizeof(U64)) + { + U64 *kmask_d = &dst->k0; + for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + { + MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_s)); + } + } + + // rjf: zmmh + DWORD avx512h_length = 0; + U8 *avx512h_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); + if(avx512h_length == 16 * sizeof(U256)) + { + U512 *zmmh_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, avx512h_s += sizeof(U256), zmmh_d += 1) + { + MemoryCopy(&zmmh_d->u8[32], avx512h_s, sizeof(U256)); + } + } + + // rjf: zmm + DWORD avx512_length = 0; + U8 *avx512_s = (U8 *)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); + if(avx512_length == 16 * sizeof(U512)) + { + U512 *zmm_d = &dst->zmm16; + for(U32 n = 0; n < 16; n += 1, avx512_s += sizeof(U512), zmm_d += 1) + { + MemoryCopy(zmm_d, avx512_s, sizeof(U512)); + } + } + } + else + { + U64 *kmask_d = &dst->k0; + for(U32 n = 0; n < 8; n += 1, kmask_d += 1) + { + MemoryZero(kmask_d, sizeof(*kmask_d)); + } + U512 *zmmh_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, zmmh_d += 1) + { + MemoryZero(&zmmh_d->u8[32], sizeof(U256)); + } + U512 *zmm_d = &dst->zmm16; + for(U32 n = 0; n < 16; n += 1, zmm_d += 1) + { + MemoryZero(zmm_d, sizeof(*zmm_d)); + } + } + + // CET / Shadow Stack + if(xstate_mask & XSTATE_MASK_CET_U) + { + DWORD cet_length = 0; + XSAVE_CET_U_FORMAT *cet = LocateXStateFeature(ctx, XSTATE_CET_U, &cet_length); + if (cet_length == sizeof(*cet)) + { + dst->cetmsr = cet->Ia32CetUMsr; + dst->cetssp = cet->Ia32Pl3SspMsr; + } + } + + scratch_end(scratch); + }break; + } + ProfEnd(); + return result; +} + +internal B32 +dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) +{ + B32 result = 0; + ProfBeginFunction(); + switch(arch) + { + //////////////////////////// + //- rjf: unimplemented win32/arch combos + // + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: + {NotImplemented;}break; + + //////////////////////////// + //- rjf: x64 + // + case Arch_x64: + { + Temp scratch = scratch_begin(0, 0); + X64_RegBlock *src = (X64_RegBlock *)reg_block; + + //- rjf: unpack info about available features + U32 feature_mask = GetEnabledXStateFeatures(); + B32 xstate_enabled = (feature_mask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512)) != 0; + + //- rjf: set up context + CONTEXT *ctx = 0; + U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0); + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) + { + ctx = 0; + } + } + + //- rjf: unpack features available on this context + if (xstate_enabled) + { + SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512); + } + + //- rjf: bad context -> abort + if(ctx == 0) + { + break; + } + + //- rjf: convert X64_RegBlock -> CONTEXT + XSAVE_FORMAT *fxsave = &ctx->FltSave; + ctx->ContextFlags = ctx_flags; + ctx->MxCsr = src->mxcsr & src->mxcsr_mask; + ctx->Rax = src->rax; + ctx->Rcx = src->rcx; + ctx->Rdx = src->rdx; + ctx->Rbx = src->rbx; + ctx->Rsp = src->rsp; + ctx->Rbp = src->rbp; + ctx->Rsi = src->rsi; + ctx->Rdi = src->rdi; + ctx->R8 = src->r8; + ctx->R9 = src->r9; + ctx->R10 = src->r10; + ctx->R11 = src->r11; + ctx->R12 = src->r12; + ctx->R13 = src->r13; + ctx->R14 = src->r14; + ctx->R15 = src->r15; + ctx->Rip = src->rip; + ctx->SegCs = src->cs; + ctx->SegDs = src->ds; + ctx->SegEs = src->es; + ctx->SegFs = src->fs; + ctx->SegGs = src->gs; + ctx->SegSs = src->ss; + ctx->Dr0 = src->dr0; + ctx->Dr1 = src->dr1; + ctx->Dr2 = src->dr2; + ctx->Dr3 = src->dr3; + ctx->Dr6 = src->dr6; + ctx->Dr7 = src->dr7; + ctx->EFlags = src->rflags; + fxsave->ControlWord = src->fcw; + fxsave->StatusWord = src->fsw; + fxsave->TagWord = src->ftw; + fxsave->ErrorOpcode = src->fop; + MemoryCopy(&fxsave->ErrorOffset, &src->fip, sizeof(U64)); + MemoryCopy(&fxsave->DataOffset, &src->fdp, sizeof(U64)); + { + M128A *float_d = fxsave->FloatRegisters; + U80 *float_s = &src->st0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, 10); + } + } + + // SSE registers are always available in x64 + { + M128A *xmm_d = fxsave->XmmRegisters; + U512 *zmm_s = &src->zmm0; + for(U32 n = 0; n < 16; n += 1, xmm_d += 1, zmm_s += 1) + { + MemoryCopy(xmm_d, zmm_s, sizeof(*xmm_d)); + } + } + + // AVX + if(feature_mask & XSTATE_MASK_AVX) + { + DWORD avx_length = 0; + U8* avx_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); + if(avx_length == 16 * sizeof(U128)) + { + U512 *zmm_s = &src->zmm0; + for(U32 n = 0; n < 16; n += 1, avx_d += sizeof(U128), zmm_s += 1) + { + MemoryCopy(avx_d, &zmm_s->u8[16], sizeof(U128)); + } + } + } + + // AVX-512 + if(feature_mask & XSTATE_MASK_AVX512) + { + DWORD kmask_length = 0; + U64* kmask_d = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); + if(kmask_length == 8 * sizeof(*kmask_d)) + { + U64 *kmask_s = &src->k0; + for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + { + MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_d)); + } + } + + DWORD avx512h_length = 0; + U8* avx512h_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); + if(avx512h_length == 16 * sizeof(U256)) + { + U512 *zmmh_s = &src->zmm0; + for(U32 n = 0; n < 16; n += 1, avx512h_d += sizeof(U256), zmmh_s += 1) + { + MemoryCopy(avx512h_d, &zmmh_s->u8[32], sizeof(U256)); + } + } + + DWORD avx512_length = 0; + U8* avx512_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); + if(avx512_length == 16 * sizeof(U512)) + { + U512 *zmm_s = &src->zmm16; + for(U32 n = 0; n < 16; n += 1, avx512_d += sizeof(U512), zmm_s += 1) + { + MemoryCopy(avx512_d, zmm_s, sizeof(U512)); + } + } + } + + //- rjf: set thread context + if(SetThreadContext(thread, ctx)) + { + result = 1; + } + scratch_end(scratch); + }break; + } + ProfEnd(); + return result; +} + +//- rjf: remote thread injection + +internal DWORD +dmn_w32_inject_thread(HANDLE process, U64 start_address) +{ + LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address; + DWORD thread_id = 0; + HANDLE thread = CreateRemoteThread(process, 0, 0, start, 0, 0, &thread_id); + if(thread != 0) + { + CloseHandle(thread); + } + return thread_id; +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) + +internal void +dmn_init(void) +{ + Arena *arena = arena_alloc(); + dmn_w32_shared = push_array(arena, DMN_W32_Shared, 1); + dmn_w32_shared->arena = arena; + dmn_w32_shared->access_mutex = mutex_alloc(); + dmn_w32_shared->detach_arena = arena_alloc(); + dmn_w32_shared->entities_arena = arena_alloc(.reserve_size = GB(8), .commit_size = KB(64)); + dmn_w32_shared->entities_base = dmn_w32_entity_alloc(&dmn_w32_entity_nil, DMN_W32_EntityKind_Root, 0); + dmn_w32_shared->entities_id_hash_slots_count = 4096; + dmn_w32_shared->entities_id_hash_slots = push_array(arena, DMN_W32_EntityIDHashSlot, dmn_w32_shared->entities_id_hash_slots_count); + + // rjf: load Windows 10+ GetThreadDescription API + { + dmn_w32_GetThreadDescription = (DMN_W32_GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetThreadDescription"); + } + + // rjf: setup environment variables + { + WCHAR *this_proc_env = GetEnvironmentStringsW(); + U64 start_idx = 0; + for(U64 idx = 0;; idx += 1) + { + if(this_proc_env[idx] == 0) + { + if(start_idx == idx) + { + break; + } + else + { + String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); + String8 string = str8_from_16(dmn_w32_shared->arena, string16); + str8_list_push(dmn_w32_shared->arena, &dmn_w32_shared->env_strings, string); + start_idx = idx+1; + } + } + } + } +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS) + +internal DMN_CtrlCtx * +dmn_ctrl_begin(void) +{ + DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; + dmn_w32_ctrl_thread = 1; + return ctx; +} + +internal void +dmn_ctrl_exclusive_access_begin(void) +{ + MutexScope(dmn_w32_shared->access_mutex) + { + dmn_w32_shared->access_run_state = 1; + } +} + +internal void +dmn_ctrl_exclusive_access_end(void) +{ + MutexScope(dmn_w32_shared->access_mutex) + { + dmn_w32_shared->access_run_state = 0; + } +} + +internal U32 +dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) +{ + Temp scratch = scratch_begin(0, 0); + U32 result = 0; + DMN_AccessScope + { + //- rjf: produce exe / arguments string + String8 cmd = {0}; + if(params->cmd_line.first != 0) + { + String8List args = {0}; + String8 exe_path = params->cmd_line.first->string; + String8List exe_path_parts = str8_split_path(scratch.arena, exe_path); + exe_path = str8_list_join(scratch.arena, &exe_path_parts, &(StringJoin){.sep = str8_lit("\\")}); + str8_list_pushf(scratch.arena, &args, "\"%S\"", exe_path); + for(String8Node *n = params->cmd_line.first->next; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &args, n->string); + } + StringJoin join_params = {0}; + join_params.sep = str8_lit(" "); + cmd = str8_list_join(scratch.arena, &args, &join_params); + } + + //- rjf: produce environment strings + String8 env = {0}; + { + String8List all_opts = params->env; + if(params->inherit_env != 0) + { + MemoryZeroStruct(&all_opts); + str8_list_push(scratch.arena, &all_opts, str8_lit("_NO_DEBUG_HEAP=1")); + for(String8Node *n = params->env.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) + { + str8_list_push(scratch.arena, &all_opts, n->string); + } + } + StringJoin join_params2 = {0}; + join_params2.sep = str8_lit("\0"); + join_params2.post = str8_lit("\0"); + env = str8_list_join(scratch.arena, &all_opts, &join_params2); + } + + //- rjf: produce utf-16 strings + String16 cmd16 = str16_from_8(scratch.arena, cmd); + String16 dir16 = str16_from_8(scratch.arena, params->path); + String16 env16 = str16_from_8(scratch.arena, env); + + //- rjf: launch + DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; + if(params->debug_subprocesses) + { + creation_flags |= DEBUG_PROCESS; + } + else + { + creation_flags |= DEBUG_ONLY_THIS_PROCESS; + } + BOOL inherit_handles = 0; + STARTUPINFOW startup_info = {sizeof(startup_info)}; + if(!file_match(params->stdout_file, file_zero())) + { + HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; + startup_info.hStdOutput = stdout_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!file_match(params->stderr_file, file_zero())) + { + HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; + startup_info.hStdError = stderr_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + if(!file_match(params->stdin_file, file_zero())) + { + HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; + startup_info.hStdInput = stdin_handle; + startup_info.dwFlags |= STARTF_USESTDHANDLES; + inherit_handles = 1; + } + PROCESS_INFORMATION process_info = {0}; + if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, creation_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) + { + // check if we are 32-bit app, and just close it immediately + BOOL is_wow = 0; + IsWow64Process(process_info.hProcess, &is_wow); + if(is_wow) + { + log_user_errorf("Only 64-bit applications can be debugged currently."); + DebugActiveProcessStop(process_info.dwProcessId); + TerminateProcess(process_info.hProcess,0xffffffff); + } + else + { + result = process_info.dwProcessId; + dmn_w32_shared->new_process_pending = 1; + } + CloseHandle(process_info.hProcess); + CloseHandle(process_info.hThread); + } + else + { + DWORD error = GetLastError(); + LPWSTR message = 0; + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL), (LPWSTR)&message, 0, 0); + String8 message8 = message ? str8_from_16(scratch.arena, str16_cstring(message)) : str8_lit("unknown error"); + LocalFree(message); + + log_user_errorf("There was an error starting %S: %S", params->cmd_line.first->string, message8); + } + } + scratch_end(scratch); + return result; +} + +internal B32 +dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) +{ + B32 result = 0; + DMN_AccessScope if(DebugActiveProcess((DWORD)pid)) + { + result = 1; + dmn_w32_shared->new_process_pending = 1; + +#if 0 + // TODO(rjf): JIT debugging info + { + typedef struct JIT_DEBUG_INFO JIT_DEBUG_INFO; + struct JIT_DEBUG_INFO + { + DWORD dwSize; + DWORD dwProcessorArchitecture; + DWORD dwThreadID; + DWORD dwReserved0; + ULONG64 lpExceptionAddress; + ULONG64 lpExceptionRecord; + ULONG64 lpContextRecord; + }; + } +#endif + } + return result; +} + +internal B32 +dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + if(TerminateProcess(process_entity->handle, exit_code)) + { + result = 1; + } + } + return result; +} + +internal B32 +dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + + // rjf: resume threads + for(DMN_W32_Entity *child = process_entity->first; + child != &dmn_w32_entity_nil; + child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + DWORD resume_result = ResumeThread(child->handle); + (void)resume_result; + } + } + + // rjf: detach + { + DWORD pid = (DWORD)process_entity->id; + if(DebugActiveProcessStop(pid)) + { + result = 1; + } + } + + // rjf: push into list of processes to generate events for later + if(result != 0) + { + dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); + } + } + return result; +} + +internal DMN_EventList +dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) +{ + DMN_EventList events = {0}; + dmn_access_open(); + + ////////////////////////////// + //- rjf: determine event generation path + // + typedef enum DMN_W32_EventGenPath + { + DMN_W32_EventGenPath_NotAttached, + DMN_W32_EventGenPath_Run, + DMN_W32_EventGenPath_DetachProcesses, + } + DMN_W32_EventGenPath; + DMN_W32_EventGenPath event_gen_path = DMN_W32_EventGenPath_Run; + if(dmn_w32_shared->detach_processes.first != 0) + { + event_gen_path = DMN_W32_EventGenPath_DetachProcesses; + } + else + { + B32 any_processes_live = dmn_w32_shared->new_process_pending; + if(!any_processes_live) + { + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; + process != &dmn_w32_entity_nil; + process = process->next) + { + if(process->kind == DMN_W32_EntityKind_Process) + { + any_processes_live = 1; + break; + } + } + } + if(!any_processes_live) + { + event_gen_path = DMN_W32_EventGenPath_NotAttached; + } + } + + ////////////////////////////// + //- rjf: produce debug events + // + switch(event_gen_path) + { + //////////////////////////// + //- rjf: produce not-attached error events + // + case DMN_W32_EventGenPath_NotAttached: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Error; + e->error_kind = DMN_ErrorKind_NotAttached; + }break; + + //////////////////////////// + //- rjf: produce debug events from regular running + // + case DMN_W32_EventGenPath_Run: + { + Temp scratch = scratch_begin(&arena, 1); + + ////////////////////////// + //- rjf: get single step thread's context (x64 single-step-set fast path) + // + CONTEXT *single_step_thread_ctx = 0; + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + Arch arch = thread->arch; + switch(arch) + { + default:{}break; + case Arch_x64: + { + U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &single_step_thread_ctx, &size)) + { + single_step_thread_ctx = 0; + } + } + }break; + } + } + + ////////////////////////// + //- rjf: set single step bit + // + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("set single step bit") + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + Arch arch = thread->arch; + switch(arch) + { + //- rjf: unimplemented win32/arch combos + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: + {NotImplemented;}break; + + //- rjf: x64 + case Arch_x64: + { + if(!GetThreadContext(thread->handle, single_step_thread_ctx)) + { + single_step_thread_ctx = 0; + } + if(single_step_thread_ctx != 0) + { + U64 rflags = single_step_thread_ctx->EFlags|0x2; + U64 new_rflags = rflags | 0x100; + single_step_thread_ctx->EFlags = new_rflags; + SetThreadContext(thread->handle, single_step_thread_ctx); + } + }break; + } + } + + ////////////////////////// + //- rjf: write all traps into memory + // + U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, ctrls->traps.trap_count); + ProfScope("write all traps into memory") + { + U64 trap_idx = 0; + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) + { + DMN_Trap *trap = n->v+n_idx; + if(trap->flags == 0) + { + trap_swap_bytes[trap_idx] = 0xCC; + dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), trap_swap_bytes+trap_idx); + U8 int3 = 0xCC; + dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3); + } + } + } + } + + ////////////////////////// + //- rjf: gather all flagged traps, bucketed by process + // + typedef struct DMN_FlaggedTrapTask DMN_FlaggedTrapTask; + struct DMN_FlaggedTrapTask + { + DMN_FlaggedTrapTask *next; + DMN_Handle process; + DMN_TrapChunkList traps; + }; + DMN_FlaggedTrapTask *first_flagged_trap_task = 0; + DMN_FlaggedTrapTask *last_flagged_trap_task= 0; + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1) + { + DMN_Trap *trap = n->v+n_idx; + if(trap->flags != 0) + { + DMN_FlaggedTrapTask *task = 0; + for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) + { + if(dmn_handle_match(t->process, trap->process)) + { + task = t; + break; + } + } + if(task == 0) + { + task = push_array(scratch.arena, DMN_FlaggedTrapTask, 1); + SLLQueuePush(first_flagged_trap_task, last_flagged_trap_task, task); + task->process = trap->process; + } + B32 already_in_task = 0; + for(DMN_TrapChunkNode *n = task->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1) + { + if(n->v[n_idx].id == trap->id) + { + already_in_task = 1; + goto end_look_for_existing_trap_in_task; + } + } + } + end_look_for_existing_trap_in_task:; + if(!already_in_task) + { + dmn_trap_chunk_list_push(scratch.arena, &task->traps, 8, trap); + } + } + } + } + + ////////////////////////// + //- rjf: write all debug register states, for flagged-traps + // + ProfScope("write all debug register states, for flagged-traps") + { + //- rjf: for each flagged trap task, iterate all threads in the + // associated process, and prepare debug registers accordingly + for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) + { + DMN_Handle process = t->process; + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + for(DMN_W32_Entity *child = process_entity->first; + child != &dmn_w32_entity_nil; + child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + switch(child->arch) + { + default:{}break; + + //- rjf: x64 + case Arch_x64: + { + X64_RegBlock regs = {0}; + dmn_w32_thread_read_reg_block(child->arch, child->handle, ®s); + { + U64 trap_idx = 0; + for(DMN_TrapChunkNode *n = t->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count && trap_idx < 4; n_idx += 1, trap_idx += 1) + { + DMN_Trap *trap = &n->v[n_idx]; + U64 *addr_reg = ®s.dr0; + switch(trap_idx) + { + default:{}break; + case 0:{addr_reg = ®s.dr0;}break; + case 1:{addr_reg = ®s.dr1;}break; + case 2:{addr_reg = ®s.dr2;}break; + case 3:{addr_reg = ®s.dr3;}break; + } + addr_reg[0] = trap->vaddr; + regs.dr7 |= bit9|bit10|bit11; + regs.dr7 |= (1ull << (trap_idx*2)); + // NOTE(rjf): global-enable regs.dr7.u64 |= (1ull << (trap_idx*2+1)); + regs.dr7 &= ~((U64)(bit17|bit18|bit19|bit20) << (trap_idx*4)); + regs.dr7 &= ~((U64)(bit15|bit16)); + switch(trap->flags) + { + case DMN_TrapFlag_BreakOnExecute: + default:{}break; + case DMN_TrapFlag_BreakOnWrite: + case DMN_TrapFlag_BreakOnWrite|DMN_TrapFlag_BreakOnExecute: + { + regs.dr7 |= ((U64)bit17) << (trap_idx*4); + }break; + case DMN_TrapFlag_BreakOnRead|DMN_TrapFlag_BreakOnWrite|DMN_TrapFlag_BreakOnExecute: + case DMN_TrapFlag_BreakOnRead|DMN_TrapFlag_BreakOnWrite: + case DMN_TrapFlag_BreakOnRead: + { + regs.dr7 |= (((U64)bit17) << (trap_idx*4)); + regs.dr7 |= (((U64)bit18) << (trap_idx*4)); + }break; + } + switch(trap->size) + { + case 1: + default:{}break; + case 2: + { + regs.dr7 |= (((U64)bit19) << (trap_idx*4)); + }break; + case 4: + { + regs.dr7 |= (((U64)bit19) << (trap_idx*4)); + regs.dr7 |= (((U64)bit20) << (trap_idx*4)); + }break; + case 8: + { + regs.dr7 |= (((U64)bit20) << (trap_idx*4)); + }break; + } + } + } + } + dmn_w32_thread_write_reg_block(child->arch, child->handle, ®s); + }break; + } + } + } + } + } + + ////////////////////////// + //- rjf: produce list of threads which will run + // + DMN_W32_EntityNode *first_run_thread = 0; + DMN_W32_EntityNode *last_run_thread = 0; + ProfScope("produce list of threads which will run") + { + //- rjf: scan all processes + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; + process != &dmn_w32_entity_nil; + process = process->next) + { + if(process->kind != DMN_W32_EntityKind_Process) {continue;} + + //- rjf: determine if this process is frozen + B32 process_is_frozen = 0; + if(ctrls->run_entities_are_processes) + { + for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(process))) + { + process_is_frozen = 1; + break; + } + } + } + + //- rjf: scan all threads in this process + for(DMN_W32_Entity *thread = process->first; + thread != &dmn_w32_entity_nil; + thread = thread->next) + { + if(thread->kind != DMN_W32_EntityKind_Thread) {continue;} + + //- rjf: determine if this thread is frozen + B32 is_frozen = 0; + { + // rjf: single-step? freeze if not the single-step thread. + if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) + { + is_frozen = !dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->single_step_thread); + } + + // rjf: not single-stepping? determine based on run controls freezing info + else + { + if(ctrls->run_entities_are_processes) + { + is_frozen = process_is_frozen; + } + else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) + { + if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(thread))) + { + is_frozen = 1; + break; + } + } + if(ctrls->run_entities_are_unfrozen) + { + is_frozen ^= 1; + } + } + } + + //- rjf: disregard all other rules if this is the halter thread + if(dmn_w32_shared->halter_tid == thread->id) + { + is_frozen = 0; + } + + //- rjf: add to list + if(!is_frozen) + { + DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); + n->v = thread; + SLLQueuePush(first_run_thread, last_run_thread, n); + } + } + } + } + + ////////////////////////// + //- rjf: loop, consume win32 debug events until we produce the relevant demon events + // + B32 priority_mode = !dmn_handle_match(dmn_handle_zero(), ctrls->priority_thread); + B32 did_priority_mode = priority_mode; + B32 do_threads_resume = 1; + DMN_W32_EntityNode *first_ran_thread = 0; + DMN_W32_EntityNode *last_ran_thread = 0; + U64 begin_time = now_time_us(); + String8List debug_strings = {0}; + DMN_Event *debug_strings_event = 0; + for(B32 keep_going = 1; keep_going;) + { + keep_going = 0; + + //////////////////////// + //- rjf: resume threads that we want to run + // + // if priority mode? => first, just resume priority thread + // if not? => resume all non-priority threads + // + if(do_threads_resume) ProfScope("resume threads that we want to run") + { + do_threads_resume = 0; + for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) + { + DMN_W32_Entity *thread = n->v; + B32 thread_is_priority = dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->priority_thread); + if((priority_mode && !thread_is_priority) || + (!priority_mode && did_priority_mode && thread_is_priority)) + { + continue; + } + DWORD resume_result = ResumeThread(thread->handle); + DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); + SLLQueuePush(first_ran_thread, last_ran_thread, n); + n->v = thread; + switch(resume_result) + { + case 0xffffffffu: + { + // TODO(rjf): error - unknown cause. need to do GetLastError, FormatMessage + }break; + default: + { + DWORD desired_counter = 0; + DWORD current_counter = resume_result - 1; + if(current_counter != desired_counter) + { + // NOTE(rjf): Warning. The user has manually suspended this thread, + // so even though from Demon's perspective it thinks this thread + // should run, it will not, because the user has manually called + // SuspendThread or used CREATE_SUSPENDED or whatever. + } + }break; + } + if(priority_mode && thread_is_priority) + { + break; + } + } + } + + //////////////////////// + //- rjf: choose win32 resume code + // + DWORD resume_code = DBG_CONTINUE; + { + if(dmn_w32_shared->exception_not_handled && !ctrls->ignore_previous_exception) + { + log_infof("using DBG_EXCEPTION_NOT_HANDLED\n"); + resume_code = DBG_EXCEPTION_NOT_HANDLED; + } + else + { + log_infof("using DBG_CONTINUE\n"); + } + dmn_w32_shared->exception_not_handled = 0; + } + + //////////////////////// + //- rjf: inform windows that we're resuming, run, & obtain next debug event + // + DEBUG_EVENT evt = {0}; + B32 evt_good = 0; + ProfScope("inform windows that we're resuming, run, & obtain next debug event") + { + B32 resume_good = 1; + if(dmn_w32_shared->resume_needed) + { + dmn_w32_shared->resume_needed = 0; + resume_good = !!ContinueDebugEvent(dmn_w32_shared->resume_pid, dmn_w32_shared->resume_tid, resume_code); + DWORD error = GetLastError(); + dmn_w32_shared->resume_needed = 0; + dmn_w32_shared->resume_tid = 0; + dmn_w32_shared->resume_pid = 0; + } + if(resume_good) + { + DWORD wait_ms = 100; + if(priority_mode) + { + wait_ms = 30; + } + evt_good = !!WaitForDebugEvent(&evt, wait_ms); + if(evt_good) + { + dmn_w32_shared->resume_needed = 1; + dmn_w32_shared->resume_pid = evt.dwProcessId; + dmn_w32_shared->resume_tid = evt.dwThreadId; + } + else + { + DWORD err = GetLastError(); + (void)err; + keep_going = 1; + } + if(priority_mode) + { + priority_mode = 0; + do_threads_resume = 1; + } + } + } + + //////////////////////// + //- rjf: process the new event + // + if(evt_good) ProfScope("process the new event") + { + switch(evt.dwDebugEventCode) + { + ////////////////////// + //- rjf: process was created + // + case CREATE_PROCESS_DEBUG_EVENT: + { + // rjf: zero out "process pending" state + dmn_w32_shared->new_process_pending = 0; + + // rjf: unpack event + HANDLE process_handle = evt.u.CreateProcessInfo.hProcess; + HANDLE thread_handle = evt.u.CreateProcessInfo.hThread; + HANDLE module_handle = evt.u.CreateProcessInfo.hFile; + U64 tls_base = (U64)evt.u.CreateProcessInfo.lpThreadLocalBase; + U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage; + U64 module_name_vaddr = (U64)evt.u.CreateProcessInfo.lpImageName; + B32 module_name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0); + DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process_handle, module_base); + + // rjf: create entities (thread/module are implied for initial - they are not reported by win32) + DMN_W32_Entity *process = dmn_w32_entity_alloc(dmn_w32_shared->entities_base, DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); + { + process->handle = process_handle; + process->arch = image_info.arch; + thread->handle = thread_handle; + thread->arch = image_info.arch; + thread->thread.thread_local_base = tls_base; + module->handle = module_handle; + module->module.vaddr_range = r1u64(module_base, image_info.size); + module->module.is_main = 1; + module->module.address_of_name_pointer = module_name_vaddr; + module->module.name_is_unicode = module_name_is_unicode; + } + + // rjf: put thread into suspended state, so it matches expected initial state + SuspendThread(thread_handle); + + // rjf: set up per-process injected code (to run halter threads on & + // generate debug events) + { + U8 injection_code[DMN_W32_INJECTED_CODE_SIZE]; + MemorySet(injection_code, 0xCC, DMN_W32_INJECTED_CODE_SIZE); + injection_code[0] = 0xC3; + U64 injection_size = DMN_W32_INJECTED_CODE_SIZE + sizeof(DMN_W32_InjectedBreak); + U64 injection_address = (U64)VirtualAllocEx(process_handle, 0, injection_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE); + dmn_w32_process_write(process_handle, r1u64(injection_address, injection_address+sizeof(injection_code)), injection_code); + process->proc.injection_address = injection_address; + } + + // rjf: generate events + { + // rjf: create process + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateProcess; + e->process = dmn_w32_handle_from_entity(process); + e->arch = image_info.arch; + e->code = evt.dwProcessId; + e->tls_model = DMN_TlsModel_WinodwsNt; + } + + // rjf: create thread + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->arch = image_info.arch; + e->code = evt.dwThreadId; + } + + // rjf: load module + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->arch = image_info.arch; + e->address = module_base; + e->size = image_info.size; + e->string = dmn_w32_full_path_from_module(arena, module); + e->tls_index = image_info.tls_index; + } + } + }break; + + ////////////////////// + //- rjf: process exited + // + case EXIT_PROCESS_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: if this was the process we were going to resume, then we will + // just not resume, and wait for another debug event + if(evt.dwProcessId == dmn_w32_shared->resume_pid) + { + dmn_w32_shared->resume_needed = 0; + dmn_w32_shared->resume_tid = 0; + dmn_w32_shared->resume_pid = 0; + } + + // rjf: generate events for children + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + switch(child->kind) + { + default:{}break; + case DMN_W32_EntityKind_Thread: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(child); + }break; + case DMN_W32_EntityKind_Module: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(child); + e->string = dmn_w32_full_path_from_module(arena, child); + }break; + } + } + + // rjf: generate event for process + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_w32_handle_from_entity(process); + e->code = evt.u.ExitProcess.dwExitCode; + } + + // rjf: release entity storage + dmn_w32_entity_release(process); + + // rjf: detach + DebugActiveProcessStop(evt.dwProcessId); + }break; + + ////////////////////// + //- rjf: thread was created + // + case CREATE_THREAD_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: create thread entity + DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); + { + thread->handle = evt.u.CreateThread.hThread; + thread->arch = process->arch; + thread->thread.thread_local_base = (U64)evt.u.CreateThread.lpThreadLocalBase; + } + + // rjf: suspend thread immediately upon creation, to match with expected suspension state + DWORD sus_result = SuspendThread(thread->handle); + (void)sus_result; + + // rjf: unpack thread name + String8 thread_name = {0}; + if(dmn_w32_GetThreadDescription != 0) + { + WCHAR *thread_name_w = 0; + HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); + if(SUCCEEDED(hr)) + { + thread_name = str8_from_16(arena, str16_cstring((U16 *)thread_name_w)); + LocalFree(thread_name_w); + } + } + + // rjf: determine if this is a "halter thread" - the threads we spawn to halt processes + B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); + + // rjf: generate events for non-halter threads + if(!is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_CreateThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->arch = thread->arch; + e->code = evt.dwThreadId; + e->string = thread_name; + } + }break; + + ////////////////////// + //- rjf: thread exited + // + case EXIT_THREAD_DEBUG_EVENT: + { + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *process = thread->parent; + + // rjf: determine if this is the halter thread + B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); + + // rjf: generate a halt event if this thread is the halter + if(is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Halt; + dmn_w32_shared->halter_process = dmn_handle_zero(); + dmn_w32_shared->halter_tid = 0; + keep_going = 0; + } + + // rjf: if this thread is *not* the halter, then generate a regular exit-thread event + if(!is_halter) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->code = evt.u.ExitThread.dwExitCode; + } + + // rjf: release entity storage + dmn_w32_entity_release(thread); + }break; + + ////////////////////// + //- rjf: DLL was loaded + // + case LOAD_DLL_DEBUG_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + + // rjf: extract image info + U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll; + DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process->handle, module_base); + + // rjf: create module entity + DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); + { + module->handle = evt.u.LoadDll.hFile; + module->arch = image_info.arch; + module->module.vaddr_range = r1u64(module_base, module_base+image_info.size); + module->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName; + module->module.name_is_unicode = (evt.u.LoadDll.fUnicode != 0); + } + + // rjf: generate event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->arch = module->arch; + e->address = module_base; + e->size = image_info.size; + e->string = dmn_w32_full_path_from_module(arena, module); + e->tls_index = image_info.tls_index; + } + }break; + + ////////////////////// + //- rjf: DLL was unloaded + // + case UNLOAD_DLL_DEBUG_EVENT: + { + U64 module_base = (U64)evt.u.UnloadDll.lpBaseOfDll; + DMN_W32_Entity *module = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Module, module_base); + DMN_W32_Entity *process = module->parent; + + // rjf: generate event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(module); + e->string = dmn_w32_full_path_from_module(arena, module); + } + + // rjf: release entity storage + dmn_w32_entity_release(module); + }break; + + ////////////////////// + //- rjf: exception was hit + // + case EXCEPTION_DEBUG_EVENT: + { + //- NOTE(rjf): Notes on multithreaded breakpoint events + // (2021/11/1): + // + // When many threads are simultaneously running, multiple threads + // may hit a trap "at the same time". When this happens there will be + // multiple events in an internal queue that we cannot see. If there + // is another event in the queue we will not see it until we call + // ContinueDebugEvent again, in a subsequent call to demon_os_run. + // + // When we get a trap event, the instruction pointer stored + // in the event will have the address of the int 3 instruction that + // was hit. Our RIP register, however, will be one byte past that. + // So, to get the behavior we want, we need to set the RIP register + // back to the address of the int 3. + // + // To deal with the fact that we may get breakpoint events later that + // were actually from this run what we do is: + // + // #1. If we get a trap event, and it corresponds to a user submitted + // trap, then we treat it is a breakpoint event. + // #2. If we get a trap event, and it does NOT correspond to a user + // trap in this call: + // #A. If the actual unmodified instruction byte is NOT an int 3, + // then this is a queued event from a previous run that is no + // longer applicable and we skip it. + // #B. If the actual unmodified instruction is an int 3, then this + // becomes a trap event and we do not reset RIP. + + //- NOTE(rjf): Further notes on MULTITHREADED STEPPING ACCESS VIOLATION + // EVENTS! @rjf @rjf @rjf + // (2024/05/29): + // + // Just adding another comment here to document that the above long + // comment went completely unnoticed by me during a pass over demon, + // and I had removed the proper rollback stuff here without reading + // the above comment. So this comment just serves to make that + // original comment even heftier. + + //- NOTE(rjf): The exception record struct has a 32-bit version and a + // 64-bit version. We only currently handle the 64-bit version. + + //- rjf: unpack + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_W32_Entity *process = thread->parent; + EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; + EXCEPTION_RECORD *exception = &edi->ExceptionRecord; + U64 instruction_pointer = (U64)exception->ExceptionAddress; + + //- rjf: determine if this is the first breakpoint in a process + // (breakpoint notifying us that the debugger is attached) + B32 first_bp = 0; + if(!process->proc.did_first_bp && exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT) + { + process->proc.did_first_bp = 1; + first_bp = 1; + } + + //- rjf: determine if this exception is a trap + B32 is_trap = (!first_bp && + (exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT || + exception->ExceptionCode == DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN)); + + //- rjf: check if this trap is a usage-code-specified trap or something else + B32 hit_user_trap = 0; + U64 user_trap_id = 0; + if(is_trap) + { + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 idx = 0; idx < n->count; idx += 1) + { + if(dmn_handle_match(n->v[idx].process, dmn_w32_handle_from_entity(process)) && n->v[idx].vaddr == instruction_pointer) + { + hit_user_trap = 1; + user_trap_id = n->v[idx].id; + break; + } + } + } + } + + //- rjf: check if trap is explicit in the actual code memory + B32 hit_explicit_trap = 0; + if(is_trap && !hit_user_trap) + { + U8 instruction_byte = 0; + if(dmn_w32_process_read_struct(process->handle, instruction_pointer, &instruction_byte)) + { + hit_explicit_trap = (instruction_byte == 0xCC || instruction_byte == 0xCD); + } + } + + //- rjf: determine whether to roll back instruction pointer + B32 should_do_rollback = (hit_user_trap || (is_trap && !hit_explicit_trap)); + + //- rjf: roll back thread's instruction pointer + if(should_do_rollback) ProfScope("roll back thread's instruction pointer") + { + switch(thread->arch) + { + //- rjf: default, general path + default: + { + Temp temp = temp_begin(scratch.arena); + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); + U64 regs_block_size = arch_info->reg_block_size; + void *regs_block = push_array(scratch.arena, U8, regs_block_size); + if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block)) + { + arch_reg_block_write_ip(arch_info, regs_block, instruction_pointer); + dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block); + } + temp_end(temp); + }break; + + //- rjf: x64 (fastpath) + case Arch_x64: + { + CONTEXT *ctx = 0; + U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; + DWORD size = 0; + InitializeContext(0, ctx_flags, 0, &size); + if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + void *ctx_memory = push_array(scratch.arena, U8, size); + if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size)) + { + ctx = 0; + } + } + if(!GetThreadContext(thread->handle, ctx)) + { + ctx = 0; + } + if(ctx != 0) + { + U64 rip = ctx->Rip; + U64 new_rip = instruction_pointer; + ctx->Rip = new_rip; + SetThreadContext(thread->handle, ctx); + } + }break; + } + } + + //- rjf: not a user trap, not an explicit trap, then it's a trap that + // this thread hit previously but has since skipped + B32 hit_previous_trap = (is_trap && !hit_user_trap && !hit_explicit_trap); + + //- rjf: determine whether to skip this event + B32 skip_event = (hit_previous_trap); + + //- rjf: generate event + if(!skip_event) + { + // rjf: fill top-level info + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->code = exception->ExceptionCode; + e->flags = exception->ExceptionFlags; + e->instruction_pointer = (U64)exception->ExceptionAddress; + e->user_data = user_trap_id; + + //- rjf: fill according to exception code + switch(exception->ExceptionCode) + { + //- rjf: fill breakpoint event info + case DMN_W32_EXCEPTION_BREAKPOINT: + { + DMN_EventKind report_event_kind = DMN_EventKind_Trap; + if(first_bp) + { + report_event_kind = DMN_EventKind_HandshakeComplete; + } + else if(hit_user_trap) + { + report_event_kind = DMN_EventKind_Breakpoint; + } + e->kind = report_event_kind; + }break; + + //- rjf: fill stack buffer overrun event info + case DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN: + { + e->kind = DMN_EventKind_Trap; + if(exception->ExceptionInformation[0] == DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS) + { + // TODO(rjf): this is a shadow stack violation - this can imply that the spoof was hit. + // need to handle this correctly in the ctrl layer when stepping w/ a spoof set. + // + // @shadow_stack_step + } + }break; + + //- rjf: fill single-step event info + case DMN_W32_EXCEPTION_SINGLE_STEP: + { + e->kind = DMN_EventKind_SingleStep; + + // NOTE(rjf): data breakpoints are reported via single-steps + // over the instructions which caused the breakpoint to be + // hit - so if we have data breakpoints set, we need to + // check this thread's debug registers, to determine if this + // is a regular single-step or a data breakpoint hit. + { + // rjf: first determine the flagged trap index + U64 flagged_trap_idx = 0; + switch(thread->arch) + { + default:{NotImplemented;}break; + case Arch_x64: + { + X64_RegBlock regs = {0}; + dmn_w32_thread_read_reg_block(thread->arch, thread->handle, ®s); + if(regs.dr6 & 0xF) + { + e->kind = DMN_EventKind_Breakpoint; + if(0){} + else if(regs.dr7 & (1ull<<0) && regs.dr6 & (1ull<<0)) { flagged_trap_idx = 0; e->address = regs.dr0; } + else if(regs.dr7 & (1ull<<2) && regs.dr6 & (1ull<<1)) { flagged_trap_idx = 1; e->address = regs.dr1; } + else if(regs.dr7 & (1ull<<4) && regs.dr6 & (1ull<<2)) { flagged_trap_idx = 2; e->address = regs.dr2; } + else if(regs.dr7 & (1ull<<8) && regs.dr6 & (1ull<<3)) { flagged_trap_idx = 3; e->address = regs.dr3; } + } + }break; + } + + // rjf: find the flagged trap task for this thread's process + DMN_W32_Entity *process = thread->parent; + DMN_FlaggedTrapTask *task = 0; + for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) + { + if(dmn_handle_match(t->process, dmn_w32_handle_from_entity(process))) + { + task = t; + break; + } + } + + // rjf: find the trap + DMN_Trap *trap = 0; + if(task != 0) + { + U64 trap_idx = 0; + for(DMN_TrapChunkNode *n = task->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) + { + if(trap_idx == flagged_trap_idx) + { + trap = &n->v[n_idx]; + goto break_search_for_flagged_trap; + } + } + } + break_search_for_flagged_trap:; + } + + // rjf: fill event based on trap + if(trap != 0) + { + e->user_data = trap->id; + } + } + }break; + + //- rjf: fill throw info + case DMN_W32_EXCEPTION_THROW: + { + U64 exception_sp = 0; + U64 exception_ip = 0; + if(exception->NumberParameters >= 3) + { + exception_sp = (U64)exception->ExceptionInformation[1]; + exception_ip = (U64)exception->ExceptionInformation[2]; + } + e->stack_pointer = exception_sp; + e->exception_kind = DMN_ExceptionKind_CppThrow; + e->exception_repeated = (edi->dwFirstChance == 0); + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + + //- rjf: fill access violation info + case DMN_W32_EXCEPTION_ACCESS_VIOLATION: + case DMN_W32_EXCEPTION_IN_PAGE_ERROR: + { + U64 exception_address = 0; + DMN_ExceptionKind exception_kind = DMN_ExceptionKind_Null; + if(exception->NumberParameters >= 2) + { + switch(exception->ExceptionInformation[0]) + { + case 0: exception_kind = DMN_ExceptionKind_MemoryRead; break; + case 1: exception_kind = DMN_ExceptionKind_MemoryWrite; break; + case 8: exception_kind = DMN_ExceptionKind_MemoryExecute; break; + } + exception_address = exception->ExceptionInformation[1]; + } + e->address = exception_address; + e->exception_kind = exception_kind; + e->exception_repeated = (edi->dwFirstChance == 0); + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + + //- rjf: fill set-thread-name info + case DMN_W32_EXCEPTION_SET_THREAD_NAME: + if(exception->NumberParameters >= 2) + { + U64 thread_name_address = exception->ExceptionInformation[1]; + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + String8List thread_name_strings = {0}; + { + U64 read_addr = thread_name_address; + U64 total_string_size = 0; + for(;total_string_size < KB(4);) + { + U8 *buffer = push_array(scratch.arena, U8, 256); + B32 good_read = dmn_w32_process_read(process->handle, r1u64(read_addr, read_addr+256), buffer); + if(good_read) + { + U64 size = 256; + for(U64 idx = 0; idx < 256; idx += 1) + { + if(buffer[idx] == 0) + { + size = idx; + break; + } + } + String8 string_part = str8(buffer, size); + str8_list_push(scratch.arena, &thread_name_strings, string_part); + total_string_size += size; + read_addr += size; + if(size < 256) + { + break; + } + } + else + { + break; + } + } + } + e->kind = DMN_EventKind_SetThreadName; + e->string = str8_list_join(arena, &thread_name_strings, 0); + if(exception->NumberParameters > 2) + { + e->code = exception->ExceptionInformation[2]; + } + }break; + + //- rjf: fill set-thread-color info + case DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR: + { + e->kind = DMN_EventKind_SetThreadColor; + e->code = exception->ExceptionInformation[0]; + e->user_data = exception->ExceptionInformation[1]; + }break; + + //- rjf: fill set-data-breakpoint info + case DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT: + { + U64 vaddr = exception->ExceptionInformation[0]; + U64 size = exception->ExceptionInformation[1]; + U64 read = exception->ExceptionInformation[2]; + U64 write = exception->ExceptionInformation[3]; + U64 exec = exception->ExceptionInformation[4]; + U64 set = exception->ExceptionInformation[5]; + e->kind = set ? DMN_EventKind_SetBreakpoint : DMN_EventKind_UnsetBreakpoint; + e->address = vaddr; + e->size = size; + if(read) { e->flags |= DMN_TrapFlag_BreakOnRead; } + if(write) { e->flags |= DMN_TrapFlag_BreakOnWrite; } + if(exec) { e->flags |= DMN_TrapFlag_BreakOnExecute; } + }break; + + //- rjf: fill set-vaddr-range-note info + case DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE: + { + U64 vaddr = exception->ExceptionInformation[0]; + U64 size = exception->ExceptionInformation[1]; + U64 name_vaddr = exception->ExceptionInformation[2]; + U64 name_size = exception->ExceptionInformation[3]; + U8 *name_buffer = push_array(arena, U8, name_size); + dmn_w32_process_read(process->handle, r1u64(name_vaddr, name_vaddr+name_size), name_buffer), + e->kind = DMN_EventKind_SetVAddrRangeNote; + e->address = vaddr; + e->size = size; + e->string = str8(name_buffer, name_size); + }break; + + //- rjf: unhandled exception case + default: + { + e->exception_repeated = (edi->dwFirstChance == 0); + dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + }break; + } + } + }break; + + ////////////////////// + //- rjf: output debug string was gathered + // + case OUTPUT_DEBUG_STRING_EVENT: + { + // rjf: unpack event + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; + U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; + + // rjf: read memory + U8 *buffer = push_array_no_zero(scratch.arena, U8, string_size + 1); + dmn_w32_process_read(process->handle, r1u64(string_address, string_address+string_size), buffer); + buffer[string_size] = 0; + + // rjf: extract into string + String8 debug_string = str8(buffer, string_size); + if(debug_string.size != 0 && buffer[string_size-1] == 0) + { + debug_string.size -= 1; + } + + // rjf: make debug string event + debug_strings_event = dmn_event_list_push(arena, &events); + debug_strings_event->kind = DMN_EventKind_DebugString; + + // rjf: push into debug strings + str8_list_push(scratch.arena, &debug_strings, debug_string); + keep_going = 1; + + // rjf: exit loop, given sufficient amount of text + if(debug_strings.total_size >= KB(4)) + { + keep_going = 0; + } + }break; + + ////////////////////// + //- rjf: a "rip event" - a "system debugging error". + // + case RIP_EVENT: + { + DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Exception; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + }break; + + ////////////////////// + //- rjf: default case - some kind of debugging event that we don't currently consume. + // + default: + { + NoOp; + }break; + } + } + + //////////////////////// + //- rjf: exit loop after a little while, so we keep pumping e.g. debug strings + // + if(now_time_us() >= begin_time+100000 && debug_strings.total_size != 0) + { + keep_going = 0; + } + } + + //////////////////////// + //- rjf: send out event for any remaining debug strings + // + if(debug_strings.total_size != 0 && debug_strings_event != 0) + { + String8 debug_strings_joined = str8_list_join(arena, &debug_strings, 0); + debug_strings_event->string = debug_strings_joined; + } + + //////////////////////// + //- rjf: suspend threads which ran + // + ProfScope("suspend threads which ran") + { + for(DMN_W32_EntityNode *n = first_ran_thread; n != 0; n = n->next) + { + DMN_W32_Entity *thread = n->v; + if(thread->kind != DMN_W32_EntityKind_Thread) + { + continue; + } + DWORD suspend_result = SuspendThread(thread->handle); + switch(suspend_result) + { + case 0xffffffffu: + { + // TODO(rjf): error - unknown cause. need to do do GetLastError, FormatMessage + // + // NOTE(rjf): this can happen when the event is EXIT_THREAD_DEBUG_EVENT + // or EXIT_PROCESS_DEBUG_EVENT. after such an event, SuspendThread + // gives error code 5 (access denied). this has no adverse effects, but + // if we want to start reporting errors we should take care to avoid + // calling SuspendThread in that case. + }break; + default: + { + DWORD desired_counter = 1; + DWORD current_counter = suspend_result + 1; + if(current_counter != desired_counter) + { + // NOTE(rjf): Warning. We've suspended to something higher than 1. + // In this case, it means the user probably created the thread in + // a suspended state, or they called SuspendThread. + } + }break; + } + } + } + + //////////////////////// + //- rjf: gather new thread-names + // + ProfScope("gather new thread names") if(dmn_w32_GetThreadDescription != 0) + { + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; + process != &dmn_w32_entity_nil; + process = process->next) + { + if(process->kind != DMN_W32_EntityKind_Process) { continue; } + for(DMN_W32_Entity *thread = process->first; + thread != &dmn_w32_entity_nil; + thread = thread->next) + { + if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } + if(thread->thread.last_name_hash == 0 || + thread->thread.name_gather_time_us+1000000 <= now_time_us()) + { + String8 name = {0}; + { + WCHAR *thread_name_w = 0; + HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); + if(SUCCEEDED(hr)) + { + name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w)); + LocalFree(thread_name_w); + } + } + U64 name_hash = dmn_w32_hash_from_string(name); + if(name.size != 0 && name_hash != thread->thread.last_name_hash) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_SetThreadName; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(thread); + e->string = push_str8_copy(arena, name); + } + thread->thread.name_gather_time_us = now_time_us(); + thread->thread.last_name_hash = name_hash; + } + } + } + } + + ////////////////////////// + //- rjf: restore original memory at trap locations + // + ProfScope("restore original memory at trap locations") + { + U64 trap_idx = 0; + for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next) + { + for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1) + { + DMN_Trap *trap = n->v+n_idx; + if(trap->flags == 0) + { + U8 og_byte = trap_swap_bytes[trap_idx]; + if(og_byte != 0xCC) + { + dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &og_byte); + } + } + } + } + } + + ////////////////////////// + //- rjf: clear all debug register states, for flagged-traps + // + ProfScope("clear all debug register states, for flagged-traps") + { + for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) + { + DMN_Handle process = t->process; + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + for(DMN_W32_Entity *child = process_entity->first; + child != &dmn_w32_entity_nil; + child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + switch(child->arch) + { + default:{}break; + + //- rjf: x64 + case Arch_x64: + { + X64_RegBlock regs = {0}; + dmn_w32_thread_read_reg_block(child->arch, child->handle, ®s); + regs.dr7 = 0; + dmn_w32_thread_write_reg_block(child->arch, child->handle, ®s); + }break; + } + } + } + } + } + + ////////////////////////// + //- rjf: unset single step bit + // + if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("unset single step bit") + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + Arch arch = thread->arch; + switch(arch) + { + //- rjf: unimplemented win32/arch combos + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: + {NotImplemented;}break; + + case Arch_x64: + { + if(!GetThreadContext(thread->handle, single_step_thread_ctx)) + { + single_step_thread_ctx = 0; + } + if(single_step_thread_ctx != 0) + { + U64 rflags = single_step_thread_ctx->EFlags|0x2; + U64 new_rflags = rflags & ~0x100; + single_step_thread_ctx->EFlags = new_rflags; + SetThreadContext(thread->handle, single_step_thread_ctx); + } + }break; + } + } + + scratch_end(scratch); + }break; + + //////////////////////////// + //- rjf: produce debug events from queued up detached processes + // + case DMN_W32_EventGenPath_DetachProcesses: + { + for(DMN_HandleNode *n = dmn_w32_shared->detach_processes.first; n != 0; n = n->next) + { + DMN_W32_Entity *process = dmn_w32_entity_from_handle(n->v); + + // rjf: push exit thread events + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Thread) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitThread; + e->process = dmn_w32_handle_from_entity(process); + e->thread = dmn_w32_handle_from_entity(child); + } + } + + // rjf: push unload module events + for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + { + if(child->kind == DMN_W32_EntityKind_Module) + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_UnloadModule; + e->process = dmn_w32_handle_from_entity(process); + e->module = dmn_w32_handle_from_entity(child); + e->string = dmn_w32_full_path_from_module(arena, child); + } + } + + // rjf: push exit process event + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_ExitProcess; + e->process = dmn_w32_handle_from_entity(process); + } + + // rjf: free process + dmn_w32_entity_release(process); + } + + // rjf: reset queued up detached processes + MemoryZeroStruct(&dmn_w32_shared->detach_processes); + arena_clear(dmn_w32_shared->detach_arena); + }break; + } + + dmn_access_close(); + return events; +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS) + +internal void +dmn_halt(U64 code, U64 user_data) +{ + if(dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) + { + DMN_W32_Entity *process = &dmn_w32_entity_nil; + for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first; + entity != &dmn_w32_entity_nil; + entity = entity->next) + { + if(entity->kind == DMN_W32_EntityKind_Process) + { + process = entity; + break; + } + } + if(process != &dmn_w32_entity_nil) + { + dmn_w32_shared->halter_process = dmn_w32_handle_from_entity(process); + DMN_W32_InjectedBreak injection = {code, user_data}; + U64 data_injection_address = process->proc.injection_address + DMN_W32_INJECTED_CODE_SIZE; + dmn_w32_process_write_struct(process->handle, data_injection_address, &injection); + dmn_w32_shared->halter_tid = dmn_w32_inject_thread(process->handle, process->proc.injection_address); + } + } +} + +//////////////////////////////// +//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS) + +//- rjf: non-blocking-control-thread access barriers + +internal B32 +dmn_access_open(void) +{ + B32 result = 0; + if(dmn_w32_ctrl_thread) + { + result = 1; + } + else + { + mutex_take(dmn_w32_shared->access_mutex); + result = !dmn_w32_shared->access_run_state; + } + return result; +} + +internal void +dmn_access_close(void) +{ + if(!dmn_w32_ctrl_thread) + { + mutex_drop(dmn_w32_shared->access_mutex); + } +} + +//- rjf: processes + +internal U64 +dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) +{ + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + result = (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_RESERVE, PAGE_READWRITE); + if(result == 0) + { + result = (U64)VirtualAllocEx(process_entity->handle, 0, size, MEM_RESERVE, PAGE_READWRITE); + } + } + return result; +} + +internal void +dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size) +{ + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_COMMIT, PAGE_READWRITE); + } +} + +internal void +dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size) +{ + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + VirtualFreeEx(process_entity->handle, (void *)vaddr, size, MEM_DECOMMIT); + } +} + +internal void +dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) +{ + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + VirtualFreeEx(process_entity->handle, (void *)vaddr, 0, MEM_RELEASE); + } +} + +internal void +dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, AccessFlags flags) +{ + DMN_AccessScope + { + DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + DWORD old_flags = 0; + DWORD new_flags = PAGE_NOACCESS; + switch(flags) + { + default:{}break; + case AccessFlag_Execute:{new_flags = PAGE_EXECUTE;}break; + case AccessFlag_Execute|AccessFlag_Read:{new_flags = PAGE_EXECUTE_READ;}break; + case AccessFlag_Execute|AccessFlag_Read|AccessFlag_Write:{new_flags = PAGE_EXECUTE_READWRITE;}break; + case AccessFlag_Read:{new_flags = PAGE_READONLY;}break; + case AccessFlag_Read|AccessFlag_Write:{new_flags = PAGE_READWRITE;}break; + } + VirtualProtectEx(process_entity->handle, (void *)vaddr, size, new_flags, &old_flags); + } +} + +internal U64 +dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) +{ + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); + result = dmn_w32_process_read(entity->handle, range, dst); + } + return result; +} + +internal B32 +dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); + result = dmn_w32_process_write(entity->handle, range, src); + } + return result; +} + +//- rjf: threads + +internal Arch +dmn_arch_from_thread(DMN_Handle handle) +{ + Arch arch = Arch_Null; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + arch = entity->arch; + } + return arch; +} + +internal U64 +dmn_stack_base_vaddr_from_thread(DMN_Handle handle) +{ + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + if(thread->kind == DMN_W32_EntityKind_Thread) + { + DMN_W32_Entity *process = thread->parent; + U64 tlb = thread->thread.thread_local_base; + switch(thread->arch) + { + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: + {NotImplemented;}break; + case Arch_x64: + { + U64 stack_base_addr = tlb + 0x8; + dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); + }break; + } + } + } + return result; +} + +internal U64 +dmn_tls_root_vaddr_from_thread(DMN_Handle handle) +{ + U64 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + if(entity->kind == DMN_W32_EntityKind_Thread) + { + result = entity->thread.thread_local_base; + switch(entity->arch) + { + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: + {NotImplemented;}break; + case Arch_x64: + { + result += 88; + }break; + } + } + } + return result; +} + +internal B32 +dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block); + } + return result; +} + +internal B32 +dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) +{ + B32 result = 0; + DMN_AccessScope + { + DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); + result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block); + } + return result; +} + +//- rjf: system process listing + +internal void +dmn_process_iter_begin(DMN_ProcessIter *iter) +{ + MemoryZeroStruct(iter); + iter->v[0] = (U64)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); +} + +internal B32 +dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out) +{ + B32 result = 0; + + //- rjf: get the next process entry + PROCESSENTRY32W process_entry = {sizeof(process_entry)}; + HANDLE snapshot = (HANDLE)iter->v[0]; + if(iter->v[1] == 0) + { + if(Process32FirstW(snapshot, &process_entry)) + { + result = 1; + } + } + else + { + if(Process32NextW(snapshot, &process_entry)) + { + result = 1; + } + } + + //- rjf: increment counter + iter->v[1] += 1; + + //- rjf: convert to process info + if(result) + { + info_out->name = str8_from_16(arena, str16_cstring((U16*)process_entry.szExeFile)); + info_out->pid = (U32)process_entry.th32ProcessID; + } + + return result; +} + +internal void +dmn_process_iter_end(DMN_ProcessIter *iter) +{ + CloseHandle((HANDLE)iter->v[0]); + MemoryZeroStruct(iter); +} diff --git a/src/demon/win32/demon_core_win32.h b/src/win32/demon/win32_demon.h similarity index 97% rename from src/demon/win32/demon_core_win32.h rename to src/win32/demon/win32_demon.h index c19b3cd4..58e7dbc7 100644 --- a/src/demon/win32/demon_core_win32.h +++ b/src/win32/demon/win32_demon.h @@ -1,359 +1,359 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DEMON_CORE_WIN32_H -#define DEMON_CORE_WIN32_H - -//////////////////////////////// -//~ rjf: Windows Includes - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include - -//////////////////////////////// -//~ rjf: Win32 Exception Codes - -#define DMN_W32_EXCEPTION_BREAKPOINT 0x80000003u -#define DMN_W32_EXCEPTION_SINGLE_STEP 0x80000004u -#define DMN_W32_EXCEPTION_LONG_JUMP 0x80000026u -#define DMN_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u -#define DMN_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu -#define DMN_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u -#define DMN_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u -#define DMN_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du -#define DMN_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu -#define DMN_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu -#define DMN_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u -#define DMN_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u -#define DMN_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u -#define DMN_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u -#define DMN_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u -#define DMN_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u -#define DMN_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u -#define DMN_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du -#define DMN_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u -#define DMN_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u -#define DMN_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u -#define DMN_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu -#define DMN_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u -#define DMN_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u -#define DMN_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u -#define DMN_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u -#define DMN_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u -#define DMN_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u -#define DMN_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au -#define DMN_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u -#define DMN_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u -#define DMN_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u -#define DMN_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u -#define DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u -#define DMN_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u -#define DMN_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u -#define DMN_W32_EXCEPTION_NO_MEMORY 0xC0000017u -#define DMN_W32_EXCEPTION_THROW 0xE06D7363u -#define DMN_W32_EXCEPTION_SET_THREAD_NAME 0x406d1388u -#define DMN_w32_EXCEPTION_CLRDBG_NOTIFICATION 0x04242420u -#define DMN_w32_EXCEPTION_CLR 0xE0434352u -#define DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR 0x00524144u -#define DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT 0x00524145u -#define DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE 0x00524156u - -//////////////////////////////// -//~ rjf: Win32 Exception ExceptionInformation Codes -// -// used as a subcode, apparently in all cases, for DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN. -// need to somehow pipe this through & interpret it correctly in outer layers... @fastfail - -#define DMN_W32_FAST_FAIL_LEGACY_GS_VIOLATION 0 -#define DMN_W32_FAST_FAIL_VTGUARD_CHECK_FAILURE 1 -#define DMN_W32_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2 -#define DMN_W32_FAST_FAIL_CORRUPT_LIST_ENTRY 3 -#define DMN_W32_FAST_FAIL_INCORRECT_STACK 4 -#define DMN_W32_FAST_FAIL_INVALID_ARG 5 -#define DMN_W32_FAST_FAIL_GS_COOKIE_INIT 6 -#define DMN_W32_FAST_FAIL_FATAL_APP_EXIT 7 -#define DMN_W32_FAST_FAIL_RANGE_CHECK_FAILURE 8 -#define DMN_W32_FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9 -#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10 -#define DMN_W32_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11 -#define DMN_W32_FAST_FAIL_INVALID_FIBER_SWITCH 12 -#define DMN_W32_FAST_FAIL_INVALID_SET_OF_CONTEXT 13 -#define DMN_W32_FAST_FAIL_INVALID_REFERENCE_COUNT 14 -#define DMN_W32_FAST_FAIL_INVALID_JUMP_BUFFER 18 -#define DMN_W32_FAST_FAIL_MRDATA_MODIFIED 19 -#define DMN_W32_FAST_FAIL_CERTIFICATION_FAILURE 20 -#define DMN_W32_FAST_FAIL_INVALID_EXCEPTION_CHAIN 21 -#define DMN_W32_FAST_FAIL_CRYPTO_LIBRARY 22 -#define DMN_W32_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23 -#define DMN_W32_FAST_FAIL_INVALID_IMAGE_BASE 24 -#define DMN_W32_FAST_FAIL_DLOAD_PROTECTION_FAILURE 25 -#define DMN_W32_FAST_FAIL_UNSAFE_EXTENSION_CALL 26 -#define DMN_W32_FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27 -#define DMN_W32_FAST_FAIL_INVALID_BUFFER_ACCESS 28 -#define DMN_W32_FAST_FAIL_INVALID_BALANCED_TREE 29 -#define DMN_W32_FAST_FAIL_INVALID_NEXT_THREAD 30 -#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_APCS_DISABLED 32 -#define DMN_W32_FAST_FAIL_INVALID_IDLE_STATE 33 -#define DMN_W32_FAST_FAIL_MRDATA_PROTECTION_FAILURE 34 -#define DMN_W32_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35 -#define DMN_W32_FAST_FAIL_INVALID_LOCK_STATE 36 -#define DMN_W32_FAST_FAIL_GUARD_JUMPTABLE 37 // Known to compiler, must retain value 37 -#define DMN_W32_FAST_FAIL_INVALID_LONGJUMP_TARGET 38 -#define DMN_W32_FAST_FAIL_INVALID_DISPATCH_CONTEXT 39 -#define DMN_W32_FAST_FAIL_INVALID_THREAD 40 -#define DMN_W32_FAST_FAIL_INVALID_SYSCALL_NUMBER 41 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_INVALID_FILE_OPERATION 42 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_LPAC_ACCESS_DENIED 43 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_GUARD_SS_FAILURE 44 -#define DMN_W32_FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46 -#define DMN_W32_FAST_FAIL_INVALID_CONTROL_STACK 47 -#define DMN_W32_FAST_FAIL_SET_CONTEXT_DENIED 48 -#define DMN_W32_FAST_FAIL_INVALID_IAT 49 -#define DMN_W32_FAST_FAIL_HEAP_METADATA_CORRUPTION 50 -#define DMN_W32_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51 -#define DMN_W32_FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_ENCLAVE_CALL_FAILURE 53 -#define DMN_W32_FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54 -#define DMN_W32_FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_UNEXPECTED_CALL 56 -#define DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57 -#define DMN_W32_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58 -#define DMN_W32_FAST_FAIL_FLAGS_CORRUPTION 59 -#define DMN_W32_FAST_FAIL_VEH_CORRUPTION 60 -#define DMN_W32_FAST_FAIL_ETW_CORRUPTION 61 -#define DMN_W32_FAST_FAIL_RIO_ABORT 62 -#define DMN_W32_FAST_FAIL_INVALID_PFN 63 -#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG 64 -#define DMN_W32_FAST_FAIL_CAST_GUARD 65 // Known to compiler, must retain value 65 -#define DMN_W32_FAST_FAIL_HOST_VISIBILITY_CHANGE 66 -#define DMN_W32_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST 67 -#define DMN_W32_FAST_FAIL_PATCH_CALLBACK_FAILED 68 -#define DMN_W32_FAST_FAIL_NTDLL_PATCH_FAILED 69 -#define DMN_W32_FAST_FAIL_INVALID_FLS_DATA 70 -#define DMN_W32_FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF - -//////////////////////////////// -//~ rjf: Win32 Register Codes - -#define DMN_W32_CTX_X86 0x00010000 -#define DMN_W32_CTX_X64 0x00100000 - -#define DMN_W32_CTX_INTEL_CONTROL 0x0001 // segss, rsp, segcs, rip, and rflags -#define DMN_W32_CTX_INTEL_INTEGER 0x0002 // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15 -#define DMN_W32_CTX_INTEL_SEGMENTS 0x0004 // segds, seges, segfs, and seggs -#define DMN_W32_CTX_INTEL_FLOATS 0x0008 // xmm0-xmm15 -#define DMN_W32_CTX_INTEL_DEBUG 0x0010 // dr0-dr3 and dr6-dr7 -#define DMN_W32_CTX_INTEL_EXTENDED 0x0020 -#define DMN_W32_CTX_INTEL_XSTATE 0x0040 - -#define DMN_W32_CTX_X86_ALL (DMN_W32_CTX_X86 | \ -DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ -DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_DEBUG | \ -DMN_W32_CTX_INTEL_EXTENDED) -#define DMN_W32_CTX_X64_ALL (DMN_W32_CTX_X64 | \ -DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ -DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_FLOATS | \ -DMN_W32_CTX_INTEL_DEBUG) - -//////////////////////////////// -//~ rjf: Per-Entity State - -typedef enum DMN_W32_EntityKind -{ - DMN_W32_EntityKind_Null, - DMN_W32_EntityKind_Root, - DMN_W32_EntityKind_Process, - DMN_W32_EntityKind_Thread, - DMN_W32_EntityKind_Module, - DMN_W32_EntityKind_COUNT -} -DMN_W32_EntityKind; - -typedef struct DMN_W32_Entity DMN_W32_Entity; -struct DMN_W32_Entity -{ - DMN_W32_Entity *first; - DMN_W32_Entity *last; - DMN_W32_Entity *next; - DMN_W32_Entity *prev; - DMN_W32_Entity *parent; - DMN_W32_EntityKind kind; - U32 gen; - U64 id; - HANDLE handle; - Arch arch; - union - { - struct - { - U64 injection_address; - B32 did_first_bp; - } - proc; - struct - { - U64 thread_local_base; - U64 last_name_hash; - U64 name_gather_time_us; - } - thread; - struct - { - Rng1U64 vaddr_range; - U64 address_of_name_pointer; - B32 is_main; - B32 name_is_unicode; - } - module; - }; -}; - -typedef struct DMN_W32_EntityNode DMN_W32_EntityNode; -struct DMN_W32_EntityNode -{ - DMN_W32_EntityNode *next; - DMN_W32_Entity *v; -}; - -typedef struct DMN_W32_EntityIDHashNode DMN_W32_EntityIDHashNode; -struct DMN_W32_EntityIDHashNode -{ - DMN_W32_EntityIDHashNode *next; - DMN_W32_EntityIDHashNode *prev; - U64 id; - DMN_W32_Entity *entity; -}; - -typedef struct DMN_W32_EntityIDHashSlot DMN_W32_EntityIDHashSlot; -struct DMN_W32_EntityIDHashSlot -{ - DMN_W32_EntityIDHashNode *first; - DMN_W32_EntityIDHashNode *last; -}; - -//////////////////////////////// -//~ rjf: Injection Types - -typedef struct DMN_W32_InjectedBreak DMN_W32_InjectedBreak; -struct DMN_W32_InjectedBreak -{ - U64 code; - U64 user_data; -}; - -#define DMN_W32_INJECTED_CODE_SIZE 32 - -//////////////////////////////// -//~ rjf: Image Info Types - -typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo; -struct DMN_W32_ImageInfo -{ - Arch arch; - U32 size; - U64 tls_index; -}; - -//////////////////////////////// -//~ rjf: Dynamically-Loaded Win32 Function Types - -typedef HRESULT DMN_W32_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription); - -//////////////////////////////// -//~ rjf: Shared State Bundle - -typedef struct DMN_W32_Shared DMN_W32_Shared; -struct DMN_W32_Shared -{ - // rjf: top-level info - Arena *arena; - String8List env_strings; - - // rjf: access locking mechanism - Mutex access_mutex; - B32 access_run_state; - - // rjf: detaching info - Arena *detach_arena; - DMN_HandleList detach_processes; - - // rjf: entity state - Arena *entities_arena; - DMN_W32_Entity *entities_base; - DMN_W32_Entity *entities_first_free; - U64 entities_count; - DMN_W32_EntityIDHashSlot *entities_id_hash_slots; - U64 entities_id_hash_slots_count; - DMN_W32_EntityIDHashNode *entities_id_hash_node_free; - - // rjf: launch state - B32 new_process_pending; - - // rjf: run results - B32 resume_needed; - U32 resume_pid; - U32 resume_tid; - B32 exception_not_handled; - - // rjf: halting info - DMN_Handle halter_process; - U32 halter_tid; -}; - -//////////////////////////////// -//~ rjf: Globals - -global DMN_W32_Shared *dmn_w32_shared = 0; -global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil}; -global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0; -thread_static B32 dmn_w32_ctrl_thread = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 dmn_w32_hash_from_string(String8 string); -internal U64 dmn_w32_hash_from_id(U64 id); - -//////////////////////////////// -//~ rjf: Entity Helpers - -//- rjf: entity <-> handle -internal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity); -internal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle); - -//- rjf: entity allocation/deallocation -internal DMN_W32_Entity *dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id); -internal void dmn_w32_entity_release(DMN_W32_Entity *entity); - -//- rjf: kind*id -> entity -internal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id); - -//////////////////////////////// -//~ rjf: Module Info Extraction - -internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module); - -//////////////////////////////// -//~ rjf: Win32-Level Process/Thread Reads/Writes - -//- rjf: processes -internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst); -internal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src); -internal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); -internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); -#define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -#define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); - -//- rjf: threads -internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block); -internal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block); - -//- rjf: remote thread injection -internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); - -#endif // DEMON_CORE_WIN32_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DEMON_CORE_WIN32_H +#define DEMON_CORE_WIN32_H + +//////////////////////////////// +//~ rjf: Windows Includes + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +//////////////////////////////// +//~ rjf: Win32 Exception Codes + +#define DMN_W32_EXCEPTION_BREAKPOINT 0x80000003u +#define DMN_W32_EXCEPTION_SINGLE_STEP 0x80000004u +#define DMN_W32_EXCEPTION_LONG_JUMP 0x80000026u +#define DMN_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u +#define DMN_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu +#define DMN_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u +#define DMN_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u +#define DMN_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du +#define DMN_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu +#define DMN_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu +#define DMN_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u +#define DMN_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u +#define DMN_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u +#define DMN_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u +#define DMN_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u +#define DMN_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u +#define DMN_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u +#define DMN_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du +#define DMN_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u +#define DMN_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u +#define DMN_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u +#define DMN_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu +#define DMN_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u +#define DMN_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u +#define DMN_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u +#define DMN_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u +#define DMN_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u +#define DMN_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u +#define DMN_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au +#define DMN_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u +#define DMN_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u +#define DMN_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u +#define DMN_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u +#define DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u +#define DMN_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u +#define DMN_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u +#define DMN_W32_EXCEPTION_NO_MEMORY 0xC0000017u +#define DMN_W32_EXCEPTION_THROW 0xE06D7363u +#define DMN_W32_EXCEPTION_SET_THREAD_NAME 0x406d1388u +#define DMN_w32_EXCEPTION_CLRDBG_NOTIFICATION 0x04242420u +#define DMN_w32_EXCEPTION_CLR 0xE0434352u +#define DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR 0x00524144u +#define DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT 0x00524145u +#define DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE 0x00524156u + +//////////////////////////////// +//~ rjf: Win32 Exception ExceptionInformation Codes +// +// used as a subcode, apparently in all cases, for DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN. +// need to somehow pipe this through & interpret it correctly in outer layers... @fastfail + +#define DMN_W32_FAST_FAIL_LEGACY_GS_VIOLATION 0 +#define DMN_W32_FAST_FAIL_VTGUARD_CHECK_FAILURE 1 +#define DMN_W32_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2 +#define DMN_W32_FAST_FAIL_CORRUPT_LIST_ENTRY 3 +#define DMN_W32_FAST_FAIL_INCORRECT_STACK 4 +#define DMN_W32_FAST_FAIL_INVALID_ARG 5 +#define DMN_W32_FAST_FAIL_GS_COOKIE_INIT 6 +#define DMN_W32_FAST_FAIL_FATAL_APP_EXIT 7 +#define DMN_W32_FAST_FAIL_RANGE_CHECK_FAILURE 8 +#define DMN_W32_FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9 +#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10 +#define DMN_W32_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11 +#define DMN_W32_FAST_FAIL_INVALID_FIBER_SWITCH 12 +#define DMN_W32_FAST_FAIL_INVALID_SET_OF_CONTEXT 13 +#define DMN_W32_FAST_FAIL_INVALID_REFERENCE_COUNT 14 +#define DMN_W32_FAST_FAIL_INVALID_JUMP_BUFFER 18 +#define DMN_W32_FAST_FAIL_MRDATA_MODIFIED 19 +#define DMN_W32_FAST_FAIL_CERTIFICATION_FAILURE 20 +#define DMN_W32_FAST_FAIL_INVALID_EXCEPTION_CHAIN 21 +#define DMN_W32_FAST_FAIL_CRYPTO_LIBRARY 22 +#define DMN_W32_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23 +#define DMN_W32_FAST_FAIL_INVALID_IMAGE_BASE 24 +#define DMN_W32_FAST_FAIL_DLOAD_PROTECTION_FAILURE 25 +#define DMN_W32_FAST_FAIL_UNSAFE_EXTENSION_CALL 26 +#define DMN_W32_FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27 +#define DMN_W32_FAST_FAIL_INVALID_BUFFER_ACCESS 28 +#define DMN_W32_FAST_FAIL_INVALID_BALANCED_TREE 29 +#define DMN_W32_FAST_FAIL_INVALID_NEXT_THREAD 30 +#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 // Telemetry, nonfatal +#define DMN_W32_FAST_FAIL_APCS_DISABLED 32 +#define DMN_W32_FAST_FAIL_INVALID_IDLE_STATE 33 +#define DMN_W32_FAST_FAIL_MRDATA_PROTECTION_FAILURE 34 +#define DMN_W32_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35 +#define DMN_W32_FAST_FAIL_INVALID_LOCK_STATE 36 +#define DMN_W32_FAST_FAIL_GUARD_JUMPTABLE 37 // Known to compiler, must retain value 37 +#define DMN_W32_FAST_FAIL_INVALID_LONGJUMP_TARGET 38 +#define DMN_W32_FAST_FAIL_INVALID_DISPATCH_CONTEXT 39 +#define DMN_W32_FAST_FAIL_INVALID_THREAD 40 +#define DMN_W32_FAST_FAIL_INVALID_SYSCALL_NUMBER 41 // Telemetry, nonfatal +#define DMN_W32_FAST_FAIL_INVALID_FILE_OPERATION 42 // Telemetry, nonfatal +#define DMN_W32_FAST_FAIL_LPAC_ACCESS_DENIED 43 // Telemetry, nonfatal +#define DMN_W32_FAST_FAIL_GUARD_SS_FAILURE 44 +#define DMN_W32_FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 // Telemetry, nonfatal +#define DMN_W32_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46 +#define DMN_W32_FAST_FAIL_INVALID_CONTROL_STACK 47 +#define DMN_W32_FAST_FAIL_SET_CONTEXT_DENIED 48 +#define DMN_W32_FAST_FAIL_INVALID_IAT 49 +#define DMN_W32_FAST_FAIL_HEAP_METADATA_CORRUPTION 50 +#define DMN_W32_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51 +#define DMN_W32_FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 // Telemetry, nonfatal +#define DMN_W32_FAST_FAIL_ENCLAVE_CALL_FAILURE 53 +#define DMN_W32_FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54 +#define DMN_W32_FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 // Telemetry, nonfatal +#define DMN_W32_FAST_FAIL_UNEXPECTED_CALL 56 +#define DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57 +#define DMN_W32_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58 +#define DMN_W32_FAST_FAIL_FLAGS_CORRUPTION 59 +#define DMN_W32_FAST_FAIL_VEH_CORRUPTION 60 +#define DMN_W32_FAST_FAIL_ETW_CORRUPTION 61 +#define DMN_W32_FAST_FAIL_RIO_ABORT 62 +#define DMN_W32_FAST_FAIL_INVALID_PFN 63 +#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG 64 +#define DMN_W32_FAST_FAIL_CAST_GUARD 65 // Known to compiler, must retain value 65 +#define DMN_W32_FAST_FAIL_HOST_VISIBILITY_CHANGE 66 +#define DMN_W32_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST 67 +#define DMN_W32_FAST_FAIL_PATCH_CALLBACK_FAILED 68 +#define DMN_W32_FAST_FAIL_NTDLL_PATCH_FAILED 69 +#define DMN_W32_FAST_FAIL_INVALID_FLS_DATA 70 +#define DMN_W32_FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF + +//////////////////////////////// +//~ rjf: Win32 Register Codes + +#define DMN_W32_CTX_X86 0x00010000 +#define DMN_W32_CTX_X64 0x00100000 + +#define DMN_W32_CTX_INTEL_CONTROL 0x0001 // segss, rsp, segcs, rip, and rflags +#define DMN_W32_CTX_INTEL_INTEGER 0x0002 // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15 +#define DMN_W32_CTX_INTEL_SEGMENTS 0x0004 // segds, seges, segfs, and seggs +#define DMN_W32_CTX_INTEL_FLOATS 0x0008 // xmm0-xmm15 +#define DMN_W32_CTX_INTEL_DEBUG 0x0010 // dr0-dr3 and dr6-dr7 +#define DMN_W32_CTX_INTEL_EXTENDED 0x0020 +#define DMN_W32_CTX_INTEL_XSTATE 0x0040 + +#define DMN_W32_CTX_X86_ALL (DMN_W32_CTX_X86 | \ +DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ +DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_DEBUG | \ +DMN_W32_CTX_INTEL_EXTENDED) +#define DMN_W32_CTX_X64_ALL (DMN_W32_CTX_X64 | \ +DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ +DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_FLOATS | \ +DMN_W32_CTX_INTEL_DEBUG) + +//////////////////////////////// +//~ rjf: Per-Entity State + +typedef enum DMN_W32_EntityKind +{ + DMN_W32_EntityKind_Null, + DMN_W32_EntityKind_Root, + DMN_W32_EntityKind_Process, + DMN_W32_EntityKind_Thread, + DMN_W32_EntityKind_Module, + DMN_W32_EntityKind_COUNT +} +DMN_W32_EntityKind; + +typedef struct DMN_W32_Entity DMN_W32_Entity; +struct DMN_W32_Entity +{ + DMN_W32_Entity *first; + DMN_W32_Entity *last; + DMN_W32_Entity *next; + DMN_W32_Entity *prev; + DMN_W32_Entity *parent; + DMN_W32_EntityKind kind; + U32 gen; + U64 id; + HANDLE handle; + Arch arch; + union + { + struct + { + U64 injection_address; + B32 did_first_bp; + } + proc; + struct + { + U64 thread_local_base; + U64 last_name_hash; + U64 name_gather_time_us; + } + thread; + struct + { + Rng1U64 vaddr_range; + U64 address_of_name_pointer; + B32 is_main; + B32 name_is_unicode; + } + module; + }; +}; + +typedef struct DMN_W32_EntityNode DMN_W32_EntityNode; +struct DMN_W32_EntityNode +{ + DMN_W32_EntityNode *next; + DMN_W32_Entity *v; +}; + +typedef struct DMN_W32_EntityIDHashNode DMN_W32_EntityIDHashNode; +struct DMN_W32_EntityIDHashNode +{ + DMN_W32_EntityIDHashNode *next; + DMN_W32_EntityIDHashNode *prev; + U64 id; + DMN_W32_Entity *entity; +}; + +typedef struct DMN_W32_EntityIDHashSlot DMN_W32_EntityIDHashSlot; +struct DMN_W32_EntityIDHashSlot +{ + DMN_W32_EntityIDHashNode *first; + DMN_W32_EntityIDHashNode *last; +}; + +//////////////////////////////// +//~ rjf: Injection Types + +typedef struct DMN_W32_InjectedBreak DMN_W32_InjectedBreak; +struct DMN_W32_InjectedBreak +{ + U64 code; + U64 user_data; +}; + +#define DMN_W32_INJECTED_CODE_SIZE 32 + +//////////////////////////////// +//~ rjf: Image Info Types + +typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo; +struct DMN_W32_ImageInfo +{ + Arch arch; + U32 size; + U64 tls_index; +}; + +//////////////////////////////// +//~ rjf: Dynamically-Loaded Win32 Function Types + +typedef HRESULT DMN_W32_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription); + +//////////////////////////////// +//~ rjf: Shared State Bundle + +typedef struct DMN_W32_Shared DMN_W32_Shared; +struct DMN_W32_Shared +{ + // rjf: top-level info + Arena *arena; + String8List env_strings; + + // rjf: access locking mechanism + Mutex access_mutex; + B32 access_run_state; + + // rjf: detaching info + Arena *detach_arena; + DMN_HandleList detach_processes; + + // rjf: entity state + Arena *entities_arena; + DMN_W32_Entity *entities_base; + DMN_W32_Entity *entities_first_free; + U64 entities_count; + DMN_W32_EntityIDHashSlot *entities_id_hash_slots; + U64 entities_id_hash_slots_count; + DMN_W32_EntityIDHashNode *entities_id_hash_node_free; + + // rjf: launch state + B32 new_process_pending; + + // rjf: run results + B32 resume_needed; + U32 resume_pid; + U32 resume_tid; + B32 exception_not_handled; + + // rjf: halting info + DMN_Handle halter_process; + U32 halter_tid; +}; + +//////////////////////////////// +//~ rjf: Globals + +global DMN_W32_Shared *dmn_w32_shared = 0; +global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil}; +global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0; +thread_static B32 dmn_w32_ctrl_thread = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 dmn_w32_hash_from_string(String8 string); +internal U64 dmn_w32_hash_from_id(U64 id); + +//////////////////////////////// +//~ rjf: Entity Helpers + +//- rjf: entity <-> handle +internal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity); +internal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle); + +//- rjf: entity allocation/deallocation +internal DMN_W32_Entity *dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id); +internal void dmn_w32_entity_release(DMN_W32_Entity *entity); + +//- rjf: kind*id -> entity +internal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id); + +//////////////////////////////// +//~ rjf: Module Info Extraction + +internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module); + +//////////////////////////////// +//~ rjf: Win32-Level Process/Thread Reads/Writes + +//- rjf: processes +internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst); +internal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src); +internal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); +internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); +#define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +#define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); + +//- rjf: threads +internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block); +internal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block); + +//- rjf: remote thread injection +internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); + +#endif // DEMON_CORE_WIN32_H diff --git a/src/os/gfx/win32/os_gfx_win32.c b/src/win32/window_manager/win32_window_manager.c similarity index 96% rename from src/os/gfx/win32/os_gfx_win32.c rename to src/win32/window_manager/win32_window_manager.c index 8ffa577d..c7e8708f 100644 --- a/src/os/gfx/win32/os_gfx_win32.c +++ b/src/win32/window_manager/win32_window_manager.c @@ -1,1687 +1,1687 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Modern Windows SDK Functions -// -// (We must dynamically link to them, since they can be missing in older SDKs) - -typedef BOOL w32_SetProcessDpiAwarenessContext_Type(void* value); -typedef UINT w32_GetDpiForWindow_Type(HWND hwnd); -typedef HRESULT w32_GetDpiForMonitor_Type(HMONITOR hmonitor, MONITOR_DPI_TYPE dpiType, UINT *dpiX, UINT *dpiY); -typedef int w32_GetSystemMetricsForDpi_Type(int nIndex, UINT dpi); -#define w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((void*)-4) -global w32_GetDpiForWindow_Type *w32_GetDpiForWindow_func = 0; -global w32_GetDpiForMonitor_Type *w32_GetDpiForMonitor_func = 0; -global w32_GetSystemMetricsForDpi_Type *w32_GetSystemMetricsForDpi_func = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal Rng2F32 -os_w32_rng2f32_from_rect(RECT rect) -{ - Rng2F32 r = {0}; - r.x0 = (F32)rect.left; - r.x1 = (F32)rect.right; - r.y0 = (F32)rect.top; - r.y1 = (F32)rect.bottom; - return r; -} - -//////////////////////////////// -//~ rjf: Windows - -internal OS_Window -os_w32_handle_from_window(OS_W32_Window *window) -{ - OS_Window handle = {(U64)window}; - return handle; -} - -internal OS_W32_Window * -os_w32_window_from_handle(OS_Window handle) -{ - OS_W32_Window *window = (OS_W32_Window *)handle.u64[0]; - return window; -} - -internal OS_W32_Window * -os_w32_window_from_hwnd(HWND hwnd) -{ - OS_W32_Window *result = 0; - for(OS_W32_Window *w = os_w32_gfx_state->first_window; w; w = w->next) - { - if(w->hwnd == hwnd) - { - result = w; - break; - } - } - return result; -} - -internal HWND -os_w32_hwnd_from_window(OS_W32_Window *window) -{ - return window->hwnd; -} - -internal OS_W32_Window * -os_w32_window_alloc(void) -{ - OS_W32_Window *result = os_w32_gfx_state->free_window; - if(result) - { - SLLStackPop(os_w32_gfx_state->free_window); - } - else - { - result = push_array_no_zero(os_w32_gfx_state->arena, OS_W32_Window, 1); - } - MemoryZeroStruct(result); - if(result) - { - DLLPushBack(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, result); - } - result->last_window_placement.length = sizeof(WINDOWPLACEMENT); - return result; -} - -internal void -os_w32_window_release(OS_W32_Window *window) -{ - if(window->paint_arena != 0) - { - arena_release(window->paint_arena); - } - ReleaseDC(window->hwnd, window->hdc); - DestroyWindow(window->hwnd); - DLLRemove(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, window); - SLLStackPush(os_w32_gfx_state->free_window, window); -} - -internal OS_Event * -os_w32_push_event(OS_EventKind kind, OS_W32_Window *window) -{ - OS_Event *result = os_event_list_push_new(os_w32_event_arena, &os_w32_event_list, kind); - result->window = os_w32_handle_from_window(window); - result->modifiers = os_get_modifiers(); - return result; -} - -internal OS_Key -os_w32_os_key_from_vkey(WPARAM vkey) -{ - local_persist B32 first = 1; - local_persist OS_Key key_table[256]; - if (first){ - first = 0; - MemoryZeroArray(key_table); - - key_table[(unsigned int)'A'] = OS_Key_A; - key_table[(unsigned int)'B'] = OS_Key_B; - key_table[(unsigned int)'C'] = OS_Key_C; - key_table[(unsigned int)'D'] = OS_Key_D; - key_table[(unsigned int)'E'] = OS_Key_E; - key_table[(unsigned int)'F'] = OS_Key_F; - key_table[(unsigned int)'G'] = OS_Key_G; - key_table[(unsigned int)'H'] = OS_Key_H; - key_table[(unsigned int)'I'] = OS_Key_I; - key_table[(unsigned int)'J'] = OS_Key_J; - key_table[(unsigned int)'K'] = OS_Key_K; - key_table[(unsigned int)'L'] = OS_Key_L; - key_table[(unsigned int)'M'] = OS_Key_M; - key_table[(unsigned int)'N'] = OS_Key_N; - key_table[(unsigned int)'O'] = OS_Key_O; - key_table[(unsigned int)'P'] = OS_Key_P; - key_table[(unsigned int)'Q'] = OS_Key_Q; - key_table[(unsigned int)'R'] = OS_Key_R; - key_table[(unsigned int)'S'] = OS_Key_S; - key_table[(unsigned int)'T'] = OS_Key_T; - key_table[(unsigned int)'U'] = OS_Key_U; - key_table[(unsigned int)'V'] = OS_Key_V; - key_table[(unsigned int)'W'] = OS_Key_W; - key_table[(unsigned int)'X'] = OS_Key_X; - key_table[(unsigned int)'Y'] = OS_Key_Y; - key_table[(unsigned int)'Z'] = OS_Key_Z; - - for (U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1){ - key_table[i] = (OS_Key)j; - } - for (U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1){ - key_table[i] = (OS_Key)j; - } - for (U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1){ - key_table[i] = (OS_Key)j; - } - - key_table[VK_SPACE] = OS_Key_Space; - key_table[VK_OEM_3] = OS_Key_Tick; - key_table[VK_OEM_MINUS] = OS_Key_Minus; - key_table[VK_OEM_PLUS] = OS_Key_Equal; - key_table[VK_OEM_4] = OS_Key_LeftBracket; - key_table[VK_OEM_6] = OS_Key_RightBracket; - key_table[VK_OEM_1] = OS_Key_Semicolon; - key_table[VK_OEM_7] = OS_Key_Quote; - key_table[VK_OEM_COMMA] = OS_Key_Comma; - key_table[VK_OEM_PERIOD]= OS_Key_Period; - key_table[VK_OEM_2] = OS_Key_Slash; - key_table[VK_OEM_5] = OS_Key_BackSlash; - - key_table[VK_TAB] = OS_Key_Tab; - key_table[VK_PAUSE] = OS_Key_Pause; - key_table[VK_ESCAPE] = OS_Key_Esc; - - key_table[VK_UP] = OS_Key_Up; - key_table[VK_LEFT] = OS_Key_Left; - key_table[VK_DOWN] = OS_Key_Down; - key_table[VK_RIGHT] = OS_Key_Right; - - key_table[VK_BACK] = OS_Key_Backspace; - key_table[VK_RETURN] = OS_Key_Return; - - key_table[VK_DELETE] = OS_Key_Delete; - key_table[VK_INSERT] = OS_Key_Insert; - key_table[VK_PRIOR] = OS_Key_PageUp; - key_table[VK_NEXT] = OS_Key_PageDown; - key_table[VK_HOME] = OS_Key_Home; - key_table[VK_END] = OS_Key_End; - - key_table[VK_CAPITAL] = OS_Key_CapsLock; - key_table[VK_NUMLOCK] = OS_Key_NumLock; - key_table[VK_SCROLL] = OS_Key_ScrollLock; - key_table[VK_APPS] = OS_Key_Menu; - - key_table[VK_CONTROL] = OS_Key_Ctrl; - key_table[VK_LCONTROL] = OS_Key_Ctrl; - key_table[VK_RCONTROL] = OS_Key_Ctrl; - key_table[VK_SHIFT] = OS_Key_Shift; - key_table[VK_LSHIFT] = OS_Key_Shift; - key_table[VK_RSHIFT] = OS_Key_Shift; - key_table[VK_MENU] = OS_Key_Alt; - key_table[VK_LMENU] = OS_Key_Alt; - key_table[VK_RMENU] = OS_Key_Alt; - - key_table[VK_DIVIDE] = OS_Key_NumSlash; - key_table[VK_MULTIPLY] = OS_Key_NumStar; - key_table[VK_SUBTRACT] = OS_Key_NumMinus; - key_table[VK_ADD] = OS_Key_NumPlus; - key_table[VK_DECIMAL] = OS_Key_NumPeriod; - - for (U32 i = 0; i < 10; i += 1){ - key_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); - } - - for (U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1){ - key_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); - } - } - - OS_Key key = key_table[vkey&bitmask8]; - return key; -} - -internal WPARAM -os_w32_vkey_from_os_key(OS_Key key) -{ - WPARAM result = 0; - { - local_persist B32 initialized = 0; - local_persist WPARAM vkey_table[OS_Key_COUNT] = {0}; - if(initialized == 0) - { - initialized = 1; - vkey_table[OS_Key_Esc] = VK_ESCAPE; - for(OS_Key key = OS_Key_F1; key <= OS_Key_F24; key = (OS_Key)(key+1)) - { - vkey_table[key] = VK_F1+(key-OS_Key_F1); - } - vkey_table[OS_Key_Tick] = VK_OEM_3; - for(OS_Key key = OS_Key_0; key <= OS_Key_9; key = (OS_Key)(key+1)) - { - vkey_table[key] = '0'+(key-OS_Key_0); - } - vkey_table[OS_Key_Minus] = VK_OEM_MINUS; - vkey_table[OS_Key_Equal] = VK_OEM_PLUS; - vkey_table[OS_Key_Backspace] = VK_BACK; - vkey_table[OS_Key_Tab] = VK_TAB; - vkey_table[OS_Key_Q] = 'Q'; - vkey_table[OS_Key_W] = 'W'; - vkey_table[OS_Key_E] = 'E'; - vkey_table[OS_Key_R] = 'R'; - vkey_table[OS_Key_T] = 'T'; - vkey_table[OS_Key_Y] = 'Y'; - vkey_table[OS_Key_U] = 'U'; - vkey_table[OS_Key_I] = 'I'; - vkey_table[OS_Key_O] = 'O'; - vkey_table[OS_Key_P] = 'P'; - vkey_table[OS_Key_LeftBracket] = VK_OEM_4; - vkey_table[OS_Key_RightBracket] = VK_OEM_6; - vkey_table[OS_Key_BackSlash] = VK_OEM_5; - vkey_table[OS_Key_CapsLock] = VK_CAPITAL; - vkey_table[OS_Key_A] = 'A'; - vkey_table[OS_Key_S] = 'S'; - vkey_table[OS_Key_D] = 'D'; - vkey_table[OS_Key_F] = 'F'; - vkey_table[OS_Key_G] = 'G'; - vkey_table[OS_Key_H] = 'H'; - vkey_table[OS_Key_J] = 'J'; - vkey_table[OS_Key_K] = 'K'; - vkey_table[OS_Key_L] = 'L'; - vkey_table[OS_Key_Semicolon] = VK_OEM_1; - vkey_table[OS_Key_Quote] = VK_OEM_7; - vkey_table[OS_Key_Return] = VK_RETURN; - vkey_table[OS_Key_Shift] = VK_SHIFT; - vkey_table[OS_Key_Z] = 'Z'; - vkey_table[OS_Key_X] = 'X'; - vkey_table[OS_Key_C] = 'C'; - vkey_table[OS_Key_V] = 'V'; - vkey_table[OS_Key_B] = 'B'; - vkey_table[OS_Key_N] = 'N'; - vkey_table[OS_Key_M] = 'M'; - vkey_table[OS_Key_Comma] = VK_OEM_COMMA; - vkey_table[OS_Key_Period] = VK_OEM_PERIOD; - vkey_table[OS_Key_Slash] = VK_OEM_2; - vkey_table[OS_Key_Ctrl] = VK_CONTROL; - vkey_table[OS_Key_Alt] = VK_MENU; - vkey_table[OS_Key_Space] = VK_SPACE; - vkey_table[OS_Key_Menu] = VK_APPS; - vkey_table[OS_Key_ScrollLock] = VK_SCROLL; - vkey_table[OS_Key_Pause] = VK_PAUSE; - vkey_table[OS_Key_Insert] = VK_INSERT; - vkey_table[OS_Key_Home] = VK_HOME; - vkey_table[OS_Key_PageUp] = VK_PRIOR; - vkey_table[OS_Key_Delete] = VK_DELETE; - vkey_table[OS_Key_End] = VK_END; - vkey_table[OS_Key_PageDown] = VK_NEXT; - vkey_table[OS_Key_Up] = VK_UP; - vkey_table[OS_Key_Left] = VK_LEFT; - vkey_table[OS_Key_Down] = VK_DOWN; - vkey_table[OS_Key_Right] = VK_RIGHT; - for(OS_Key key = OS_Key_Ex0; key <= OS_Key_Ex29; key = (OS_Key)(key+1)) - { - vkey_table[key] = 0xDF + (key-OS_Key_Ex0); - } - vkey_table[OS_Key_NumLock] = VK_NUMLOCK; - vkey_table[OS_Key_NumSlash] = VK_DIVIDE; - vkey_table[OS_Key_NumStar] = VK_MULTIPLY; - vkey_table[OS_Key_NumMinus] = VK_SUBTRACT; - vkey_table[OS_Key_NumPlus] = VK_ADD; - vkey_table[OS_Key_NumPeriod] = VK_DECIMAL; - vkey_table[OS_Key_Num0] = VK_NUMPAD0; - vkey_table[OS_Key_Num1] = VK_NUMPAD1; - vkey_table[OS_Key_Num2] = VK_NUMPAD2; - vkey_table[OS_Key_Num3] = VK_NUMPAD3; - vkey_table[OS_Key_Num4] = VK_NUMPAD4; - vkey_table[OS_Key_Num5] = VK_NUMPAD5; - vkey_table[OS_Key_Num6] = VK_NUMPAD6; - vkey_table[OS_Key_Num7] = VK_NUMPAD7; - vkey_table[OS_Key_Num8] = VK_NUMPAD8; - vkey_table[OS_Key_Num9] = VK_NUMPAD9; - vkey_table[OS_Key_LeftMouseButton] = VK_LBUTTON; - vkey_table[OS_Key_MiddleMouseButton] = VK_MBUTTON; - vkey_table[OS_Key_RightMouseButton] = VK_RBUTTON; - } - result = vkey_table[key]; - } - return result; -} - -internal LRESULT -os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - ProfBeginFunction(); - LRESULT result = 0; - B32 good = 1; - if(os_w32_event_arena == 0) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - good = 0; - } - if(good) - { - OS_W32_Window *window = os_w32_window_from_hwnd(hwnd); - OS_Window window_handle = os_w32_handle_from_window(window); - B32 release = 0; - - switch(uMsg) - { - default: - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - }break; - - case WM_ENTERSIZEMOVE: - { - os_w32_resizing = 1; - }break; - - case WM_EXITSIZEMOVE: - { - os_w32_resizing = 0; - }break; - - case WM_SIZE: - case WM_PAINT: - { - PAINTSTRUCT ps = {0}; - BeginPaint(hwnd, &ps); - update(); - EndPaint(hwnd, &ps); - DwmFlush(); - }break; - - case WM_CLOSE: - { - os_w32_push_event(OS_EventKind_WindowClose, window); - }break; - - case WM_LBUTTONUP: - case WM_MBUTTONUP: - case WM_RBUTTONUP: - { - release = 1; - } // fallthrough; - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - { - OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); - switch (uMsg) - { - case WM_LBUTTONUP: case WM_LBUTTONDOWN: - { - event->key = OS_Key_LeftMouseButton; - }break; - case WM_MBUTTONUP: case WM_MBUTTONDOWN: - { - event->key = OS_Key_MiddleMouseButton; - }break; - case WM_RBUTTONUP: case WM_RBUTTONDOWN: - { - event->key = OS_Key_RightMouseButton; - }break; - } - event->pos.x = (F32)(S16)LOWORD(lParam); - event->pos.y = (F32)(S16)HIWORD(lParam); - if(release) - { - ReleaseCapture(); - } - else - { - SetCapture(hwnd); - } - }break; - - case WM_MOUSEMOVE: - { - OS_Event *event = os_w32_push_event(OS_EventKind_MouseMove, window); - event->pos.x = (F32)(S16)LOWORD(lParam); - event->pos.y = (F32)(S16)HIWORD(lParam); - }break; - - case WM_MOUSEWHEEL: - { - S16 wheel_delta = HIWORD(wParam); - OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window); - POINT p; - p.x = (S32)(S16)LOWORD(lParam); - p.y = (S32)(S16)HIWORD(lParam); - ScreenToClient(window->hwnd, &p); - event->pos.x = (F32)p.x; - event->pos.y = (F32)p.y; - event->delta = v2f32(0.f, -(F32)wheel_delta); - }break; - - case WM_MOUSEHWHEEL: - { - S16 wheel_delta = HIWORD(wParam); - OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window); - POINT p; - p.x = (S32)(S16)LOWORD(lParam); - p.y = (S32)(S16)HIWORD(lParam); - ScreenToClient(window->hwnd, &p); - event->pos.x = (F32)p.x; - event->pos.y = (F32)p.y; - event->delta = v2f32((F32)wheel_delta, 0.f); - }break; - - case WM_SYSKEYDOWN: case WM_SYSKEYUP: - { - if(wParam != VK_MENU && (wParam < VK_F1 || VK_F24 < wParam || wParam == VK_F4)) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - } // fallthrough; - case WM_KEYDOWN: case WM_KEYUP: - { - B32 was_down = (lParam & bit31); - B32 is_down = !(lParam & bit32); - - B32 is_repeat = 0; - if(!is_down) - { - release = 1; - } - else if(was_down) - { - is_repeat = 1; - } - - B32 right_sided = 0; - if ((lParam & bit25) && - (wParam == VK_CONTROL || wParam == VK_RCONTROL || - wParam == VK_MENU || wParam == VK_RMENU || - wParam == VK_SHIFT || wParam == VK_RSHIFT)) - { - right_sided = 1; - } - - OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); - event->key = os_w32_os_key_from_vkey(wParam); - event->repeat_count = lParam & bitmask16; - event->is_repeat = is_repeat; - event->right_sided = right_sided; - if(event->key == OS_Key_Alt && event->modifiers & OS_Modifier_Alt) { event->modifiers &= ~OS_Modifier_Alt; } - if(event->key == OS_Key_Ctrl && event->modifiers & OS_Modifier_Ctrl) { event->modifiers &= ~OS_Modifier_Ctrl; } - if(event->key == OS_Key_Shift && event->modifiers & OS_Modifier_Shift) { event->modifiers &= ~OS_Modifier_Shift; } - }break; - - case WM_SYSCHAR: - { - WORD vk_code = LOWORD(wParam); - if(vk_code == VK_SPACE) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - else - { - result = 0; - } - }break; - - case WM_CHAR: - { - U32 character = wParam; - if(character >= 32 && character != 127) - { - OS_Event *event = os_w32_push_event(OS_EventKind_Text, window); - if(lParam & bit29) - { - event->modifiers |= OS_Modifier_Alt; - } - event->character = character; - } - }break; - - case WM_KILLFOCUS: - { - os_w32_push_event(OS_EventKind_WindowLoseFocus, window); - ReleaseCapture(); - }break; - - case WM_SETCURSOR: - { - Rng2F32 window_rect = os_client_rect_from_window(window_handle); - Vec2F32 mouse = os_mouse_from_window(window_handle); - B32 on_border = 0; - DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; - B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); - if(window != 0 && window->custom_border && !is_fullscreen) - { - B32 on_border_x = (mouse.x <= window->custom_border_edge_thickness || window_rect.x1-window->custom_border_edge_thickness <= mouse.x); - B32 on_border_y = (mouse.y <= window->custom_border_edge_thickness || window_rect.y1-window->custom_border_edge_thickness <= mouse.y); - on_border = on_border_x || on_border_y; - } - if(!os_w32_resizing && !on_border && contains_2f32(window_rect, mouse)) - { - SetCursor(os_w32_gfx_state->hCursor); - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - - case WM_DPICHANGED: - { - F32 new_dpi = (F32)(wParam & 0xffff); - RECT suggested_new_rect = *(RECT *)lParam; - window->dpi = new_dpi; - SetWindowPos(window->hwnd, 0, - suggested_new_rect.left, - suggested_new_rect.top, - suggested_new_rect.right - suggested_new_rect.left, - suggested_new_rect.bottom - suggested_new_rect.top, - 0); - }break; - - //- rjf: [file drop] - case WM_DROPFILES: - { - HDROP drop = (HDROP)wParam; - POINT drop_pt = {0}; - DragQueryPoint(drop, &drop_pt); - U64 num_files_dropped = DragQueryFile(drop, 0xffffffff, 0, 0); - OS_Event *event = os_w32_push_event(OS_EventKind_FileDrop, window); - event->pos = v2f32((F32)drop_pt.x, (F32)drop_pt.y); - for(U64 idx = 0; idx < num_files_dropped; idx += 1) - { - U64 name_size = DragQueryFile(drop, idx, 0, 0) + 1; - U8 *name_ptr = push_array(os_w32_event_arena, U8, name_size); - DragQueryFile(drop, idx, (char *)name_ptr, name_size); - String8 path_string = str8(name_ptr, name_size - 1); - String8 path_string__normalized = path_normalized_from_string(os_w32_event_arena, path_string); - str8_list_push(os_w32_event_arena, &event->strings, path_string__normalized); - } - DragFinish(drop); - }break; - - //- rjf: [custom border] - case WM_NCPAINT: - { - if(os_w32_new_window_custom_border || (window != 0 && window->custom_border && !window->custom_border_composition_enabled)) - { - result = 0; - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - case WM_DWMCOMPOSITIONCHANGED: - { - if(window != 0 && window->custom_border) - { - BOOL enabled = 0; - DwmIsCompositionEnabled(&enabled); - window->custom_border_composition_enabled = enabled; - if(enabled) - { - MARGINS m = { 0, 0, 1, 0 }; - DwmExtendFrameIntoClientArea(hwnd, &m); - DWORD dwmncrp_enabled = DWMNCRP_ENABLED; - DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &enabled, sizeof(dwmncrp_enabled)); - } - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - case WM_WINDOWPOSCHANGED: - { - result = 0; - }break; - case WM_NCUAHDRAWCAPTION: - case WM_NCUAHDRAWFRAME: - { - // NOTE(rjf): undocumented messages for drawing themed window borders. - if(os_w32_new_window_custom_border || (window != 0 && window->custom_border)) - { - result = 0; - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - case WM_SETICON: - case WM_SETTEXT: - { - if(os_w32_new_window_custom_border || (window && window->custom_border && !window->custom_border_composition_enabled)) - { - // NOTE(rjf): - // https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/ - LONG_PTR old_style = GetWindowLongPtrW(hwnd, GWL_STYLE); - SetWindowLongPtrW(hwnd, GWL_STYLE, old_style & ~WS_VISIBLE); - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - SetWindowLongPtrW(hwnd, GWL_STYLE, old_style); - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - }break; - - //- rjf: [custom border] activation - without this `result`, stuff flickers. - case WM_NCACTIVATE: - { - if(!os_w32_new_window_custom_border && (window == 0 || window->custom_border == 0)) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - else - { - result = DefWindowProcW(hwnd, uMsg, wParam, -1); - } - }break; - - //- rjf: [custom border] client/window size calculation - case WM_NCCALCSIZE: - { - if(os_w32_new_window_custom_border || (window && window->custom_border)) - { - F32 dpi = w32_GetDpiForWindow_func ? (F32)w32_GetDpiForWindow_func(hwnd) : 96.f; - S32 frame_x = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXFRAME, dpi) : GetSystemMetrics(SM_CXFRAME); - S32 frame_y = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CYFRAME, dpi) : GetSystemMetrics(SM_CYFRAME); - S32 padding = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXPADDEDBORDER, dpi) : GetSystemMetrics(SM_CXPADDEDBORDER); - DWORD window_style = GetWindowLong(hwnd, GWL_STYLE); - B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); - if(!is_fullscreen) - { - RECT* rect = wParam == 0 ? (RECT*)lParam : ((NCCALCSIZE_PARAMS*)lParam)->rgrc; - rect->right -= frame_x + padding; - rect->left += frame_x + padding; - rect->bottom -= frame_y + padding; - - if(IsMaximized(hwnd)) - { - rect->top += frame_y + padding; - // If we do not do this hidden taskbar can not be unhidden on mouse hover - // Unfortunately it can create an ugly bottom border when maximized... - rect->bottom -= 1; - } - } - } - else - { - result = DefWindowProc(hwnd, uMsg, wParam, lParam); - } - }break; - - //- rjf: [custom border] client/window hit testing (mapping mouse -> action) - case WM_NCHITTEST: - { - DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; - B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); - if(window == 0 || window->custom_border == 0 || is_fullscreen) - { - result = DefWindowProcW(hwnd, uMsg, wParam, lParam); - } - else - { - B32 is_default_handled = 0; - - // Let the default procedure handle resizing areas - result = DefWindowProc(hwnd, uMsg, wParam, lParam); - switch (result) - { - case HTNOWHERE: - case HTRIGHT: - case HTLEFT: - case HTTOPLEFT: - case HTTOPRIGHT: - case HTBOTTOMRIGHT: - case HTBOTTOM: - case HTBOTTOMLEFT: - { - is_default_handled = 1; - } break; - } - - if (!is_default_handled) - { - POINT pos_monitor; - pos_monitor.x = GET_X_LPARAM(lParam); - pos_monitor.y = GET_Y_LPARAM(lParam); - POINT pos_client = pos_monitor; - ScreenToClient(hwnd, &pos_client); - - // Adjustments happening in NCCALCSIZE are messing with the detection - // of the top hit area so manually checking that. - F32 dpi = w32_GetDpiForWindow_func ? (F32)w32_GetDpiForWindow_func(hwnd) : 96.f; - S32 frame_y = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CYFRAME, dpi) : GetSystemMetrics(SM_CYFRAME); - // NOTE(rjf): it seems incorrect to apply this padding here... - // S32 padding = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXPADDEDBORDER, dpi) : GetSystemMetrics(SM_CXPADDEDBORDER); - - B32 is_over_top_resize = pos_client.y >= 0 && pos_client.y < frame_y; // + padding; - B32 is_over_title_bar = pos_client.y >= 0 && pos_client.y < window->custom_border_title_thickness; - - //- rjf: check against title bar client areas - B32 is_over_title_bar_client_area = 0; - for(OS_W32_TitleBarClientArea *area = window->first_title_bar_client_area; - area != 0; - area = area->next) - { - Rng2F32 rect = area->rect; - if(rect.x0 <= pos_client.x && pos_client.x < rect.x1 && - rect.y0 <= pos_client.y && pos_client.y < rect.y1) - { - is_over_title_bar_client_area = 1; - break; - } - } - - if (IsMaximized(hwnd)) - { - if (is_over_title_bar_client_area) - { - result = HTCLIENT; - } - else if (is_over_title_bar) - { - result = HTCAPTION; - } - else - { - result = HTCLIENT; - } - } - else - { - //Swap the first two conditions to choose if hovering the top border - //should prioritize resize or title bar buttons. - if (is_over_title_bar_client_area) - { - result = HTCLIENT; - } - else if (is_over_top_resize) - { - result = HTTOP; - } - else if (is_over_title_bar) - { - result = HTCAPTION; - } - else { - result = HTCLIENT; - } - } - } - } - }break; - } - } - ProfEnd(); - return result; -} - -//////////////////////////////// -//~ rjf: Monitors - -internal BOOL -os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr) -{ - OS_W32_MonitorGatherBundle *bundle = (OS_W32_MonitorGatherBundle *)bundle_ptr; - OS_Monitor m = {(U64)monitor}; - OS_W32_MonitorGatherNode *n = push_array(bundle->arena, OS_W32_MonitorGatherNode, 1); - n->v = m; - SLLQueuePush(bundle->first_monitor, bundle->last_monitor, n); - bundle->monitor_count += 1; - return 1; -} - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_gfx_init(void) -{ - //- rjf: set up base shared state - Arena *arena = arena_alloc(); - os_w32_gfx_state = push_array(arena, OS_W32_GfxState, 1); - os_w32_gfx_state->arena = arena; - os_w32_gfx_state->gfx_thread_tid = (U32)GetCurrentThreadId(); - os_w32_gfx_state->hInstance = GetModuleHandle(0); - - //- rjf: set dpi awareness - w32_SetProcessDpiAwarenessContext_Type *SetProcessDpiAwarenessContext_func = 0; - HMODULE module = LoadLibraryA("user32.dll"); - if(module != 0) - { - SetProcessDpiAwarenessContext_func = - (w32_SetProcessDpiAwarenessContext_Type*)GetProcAddress(module, "SetProcessDpiAwarenessContext"); - w32_GetDpiForWindow_func = - (w32_GetDpiForWindow_Type*)GetProcAddress(module, "GetDpiForWindow"); - w32_GetDpiForMonitor_func = (w32_GetDpiForMonitor_Type *)GetProcAddress(module, "GetDpiForMonitor"); - w32_GetSystemMetricsForDpi_func = (w32_GetSystemMetricsForDpi_Type *)GetProcAddress(module, "GetSystemMetricsForDpi"); - FreeLibrary(module); - } - if(SetProcessDpiAwarenessContext_func != 0) - { - SetProcessDpiAwarenessContext_func(w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); - } - else - { - HMODULE shcore = LoadLibraryA("shcore.dll"); - if(shcore) - { - typedef HRESULT (WINAPI* SetProcessDpiAwareness_t)(int); - SetProcessDpiAwareness_t SetProcessDpiAwareness = (void*)GetProcAddress(shcore, "SetProcessDpiAwareness"); - if(SetProcessDpiAwareness) - { - SetProcessDpiAwareness(2); - } - FreeLibrary(shcore); - } - SetProcessDPIAware(); - } - - //- rjf: register graphical-window class - { - WNDCLASSEXW wndclass = {sizeof(wndclass)}; - wndclass.lpfnWndProc = os_w32_wnd_proc; - wndclass.hInstance = os_w32_gfx_state->hInstance; - wndclass.lpszClassName = L"graphical-window"; - wndclass.hCursor = LoadCursorA(0, IDC_ARROW); - wndclass.hIcon = LoadIcon(os_w32_gfx_state->hInstance, MAKEINTRESOURCE(1)); - wndclass.style = CS_VREDRAW|CS_HREDRAW; - ATOM wndatom = RegisterClassExW(&wndclass); - (void)wndatom; - } - - //- rjf: grab graphics system info - { - os_w32_gfx_state->gfx_info.double_click_time = GetDoubleClickTime()/1000.f; - os_w32_gfx_state->gfx_info.caret_blink_time = GetCaretBlinkTime()/1000.f; - DEVMODEW devmodew = {0}; - if(EnumDisplaySettingsW(0, ENUM_CURRENT_SETTINGS, &devmodew)) - { - os_w32_gfx_state->gfx_info.default_refresh_rate = (F32)devmodew.dmDisplayFrequency; - } - } - - //- rjf: set initial cursor - os_set_cursor(OS_Cursor_Pointer); - - //- rjf: fill vkey -> OS_Key table - { - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'A'] = OS_Key_A; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'B'] = OS_Key_B; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'C'] = OS_Key_C; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'D'] = OS_Key_D; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'E'] = OS_Key_E; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'F'] = OS_Key_F; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'G'] = OS_Key_G; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'H'] = OS_Key_H; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'I'] = OS_Key_I; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'J'] = OS_Key_J; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'K'] = OS_Key_K; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'L'] = OS_Key_L; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'M'] = OS_Key_M; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'N'] = OS_Key_N; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'O'] = OS_Key_O; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'P'] = OS_Key_P; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Q'] = OS_Key_Q; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'R'] = OS_Key_R; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'S'] = OS_Key_S; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'T'] = OS_Key_T; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'U'] = OS_Key_U; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'V'] = OS_Key_V; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'W'] = OS_Key_W; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'X'] = OS_Key_X; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Y'] = OS_Key_Y; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Z'] = OS_Key_Z; - - for(U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1) - { - os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; - } - for(U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1) - { - os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; - } - for(U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1) - { - os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; - } - - os_w32_gfx_state->key_from_vkey_table[VK_SPACE] = OS_Key_Space; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_3] = OS_Key_Tick; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_MINUS] = OS_Key_Minus; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_PLUS] = OS_Key_Equal; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_4] = OS_Key_LeftBracket; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_6] = OS_Key_RightBracket; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_1] = OS_Key_Semicolon; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_7] = OS_Key_Quote; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_COMMA] = OS_Key_Comma; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_PERIOD]= OS_Key_Period; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_2] = OS_Key_Slash; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_5] = OS_Key_BackSlash; - - os_w32_gfx_state->key_from_vkey_table[VK_TAB] = OS_Key_Tab; - os_w32_gfx_state->key_from_vkey_table[VK_PAUSE] = OS_Key_Pause; - os_w32_gfx_state->key_from_vkey_table[VK_ESCAPE] = OS_Key_Esc; - - os_w32_gfx_state->key_from_vkey_table[VK_UP] = OS_Key_Up; - os_w32_gfx_state->key_from_vkey_table[VK_LEFT] = OS_Key_Left; - os_w32_gfx_state->key_from_vkey_table[VK_DOWN] = OS_Key_Down; - os_w32_gfx_state->key_from_vkey_table[VK_RIGHT] = OS_Key_Right; - - os_w32_gfx_state->key_from_vkey_table[VK_BACK] = OS_Key_Backspace; - os_w32_gfx_state->key_from_vkey_table[VK_RETURN] = OS_Key_Return; - - os_w32_gfx_state->key_from_vkey_table[VK_DELETE] = OS_Key_Delete; - os_w32_gfx_state->key_from_vkey_table[VK_INSERT] = OS_Key_Insert; - os_w32_gfx_state->key_from_vkey_table[VK_PRIOR] = OS_Key_PageUp; - os_w32_gfx_state->key_from_vkey_table[VK_NEXT] = OS_Key_PageDown; - os_w32_gfx_state->key_from_vkey_table[VK_HOME] = OS_Key_Home; - os_w32_gfx_state->key_from_vkey_table[VK_END] = OS_Key_End; - - os_w32_gfx_state->key_from_vkey_table[VK_CAPITAL] = OS_Key_CapsLock; - os_w32_gfx_state->key_from_vkey_table[VK_NUMLOCK] = OS_Key_NumLock; - os_w32_gfx_state->key_from_vkey_table[VK_SCROLL] = OS_Key_ScrollLock; - os_w32_gfx_state->key_from_vkey_table[VK_APPS] = OS_Key_Menu; - - os_w32_gfx_state->key_from_vkey_table[VK_CONTROL] = OS_Key_Ctrl; - os_w32_gfx_state->key_from_vkey_table[VK_LCONTROL] = OS_Key_Ctrl; - os_w32_gfx_state->key_from_vkey_table[VK_RCONTROL] = OS_Key_Ctrl; - os_w32_gfx_state->key_from_vkey_table[VK_SHIFT] = OS_Key_Shift; - os_w32_gfx_state->key_from_vkey_table[VK_LSHIFT] = OS_Key_Shift; - os_w32_gfx_state->key_from_vkey_table[VK_RSHIFT] = OS_Key_Shift; - os_w32_gfx_state->key_from_vkey_table[VK_MENU] = OS_Key_Alt; - os_w32_gfx_state->key_from_vkey_table[VK_LMENU] = OS_Key_Alt; - os_w32_gfx_state->key_from_vkey_table[VK_RMENU] = OS_Key_Alt; - - os_w32_gfx_state->key_from_vkey_table[VK_DIVIDE] = OS_Key_NumSlash; - os_w32_gfx_state->key_from_vkey_table[VK_MULTIPLY] = OS_Key_NumStar; - os_w32_gfx_state->key_from_vkey_table[VK_SUBTRACT] = OS_Key_NumMinus; - os_w32_gfx_state->key_from_vkey_table[VK_ADD] = OS_Key_NumPlus; - os_w32_gfx_state->key_from_vkey_table[VK_DECIMAL] = OS_Key_NumPeriod; - - for(U32 i = 0; i < 10; i += 1) - { - os_w32_gfx_state->key_from_vkey_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); - } - - for(U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1) - { - os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); - } - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) - -internal OS_GfxInfo * -os_get_gfx_info(void) -{ - return &os_w32_gfx_state->gfx_info; -} - -//////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) - -internal void -os_set_clipboard_text(String8 string) -{ - Temp scratch = scratch_begin(0, 0); - if(OpenClipboard(0)) - { - EmptyClipboard(); - String16 string16 = str16_from_8(scratch.arena, string); - HANDLE string16_copy_handle = GlobalAlloc(GMEM_MOVEABLE, (string16.size+1)*sizeof(string16.str[0])); - if(string16_copy_handle) - { - U16 *copy_buffer = (U16 *)GlobalLock(string16_copy_handle); - MemoryCopy(copy_buffer, string16.str, string16.size*sizeof(string16.str[0])); - copy_buffer[string16.size] = 0; - GlobalUnlock(string16_copy_handle); - SetClipboardData(CF_UNICODETEXT, string16_copy_handle); - } - CloseClipboard(); - } - scratch_end(scratch); -} - -internal String8 -os_get_clipboard_text(Arena *arena) -{ - String8 result = {0}; - if(IsClipboardFormatAvailable(CF_UNICODETEXT) && - OpenClipboard(0)) - { - HANDLE data_handle = GetClipboardData(CF_UNICODETEXT); - if(data_handle) - { - U16 *buffer = (U16 *)GlobalLock(data_handle); - if(buffer) - { - U64 size = cstring16_length(buffer); - String16 string16 = str16(buffer, size); - result = str8_from_16(arena, string16); - GlobalUnlock(data_handle); - } - } - CloseClipboard(); - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) - -internal OS_Window -os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) -{ - B32 custom_border = !!(flags & OS_WindowFlag_CustomBorder); - B32 use_default_position = !!(flags & OS_WindowFlag_UseDefaultPosition); - Vec2F32 pos = rect.p0; - Vec2F32 dim = dim_2f32(rect); - - //- rjf: make hwnd - HWND hwnd = 0; - { - Temp scratch = scratch_begin(0, 0); - String16 title16 = str16_from_8(scratch.arena, title); - os_w32_new_window_custom_border = custom_border; - DWORD style_flags = WS_EX_APPWINDOW; -#if defined(R_BACKEND) && R_BACKEND != R_BACKEND_OPENGL - style_flags |= WS_EX_NOREDIRECTIONBITMAP; -#endif - hwnd = CreateWindowExW(style_flags, - L"graphical-window", - (WCHAR*)title16.str, - WS_OVERLAPPEDWINDOW | WS_SIZEBOX, - use_default_position ? CW_USEDEFAULT : (S32)pos.x, - use_default_position ? CW_USEDEFAULT : (S32)pos.y, - (S32)dim.x, - (S32)dim.y, - 0, 0, - os_w32_gfx_state->hInstance, - 0); - DragAcceptFiles(hwnd, 1); - os_w32_new_window_custom_border = 0; - scratch_end(scratch); - } - - //- rjf- make/fill window - OS_W32_Window *window = os_w32_window_alloc(); - { - window->hwnd = hwnd; - window->hdc = GetDC(hwnd); - if(w32_GetDpiForWindow_func != 0) - { - window->dpi = (F32)w32_GetDpiForWindow_func(hwnd); - } - else - { - window->dpi = 96.f; - } - } - - //- rjf: early detection of composition - { - BOOL enabled = 0; - DwmIsCompositionEnabled(&enabled); - window->custom_border_composition_enabled = enabled; - } - - //- rjf: custom border - if(flags & OS_WindowFlag_CustomBorder) - { - window->custom_border = 1; - window->paint_arena = arena_alloc(); - } - - //- rjf: convert to handle + return - OS_Window result = os_w32_handle_from_window(window); - return result; -} - -internal void -os_window_close(OS_Window handle) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - os_w32_window_release(window); -} - -internal void -os_window_set_title(OS_Window handle, String8 title) -{ - Temp scratch = scratch_begin(0, 0); - OS_W32_Window *window = os_w32_window_from_handle(handle); - String16 title16 = str16_from_8(scratch.arena, title); - SetWindowTextW(window->hwnd, (WCHAR *)title16.str); - scratch_end(scratch); -} - -internal void -os_window_first_paint(OS_Window window_handle) -{ - OS_W32_Window *window = os_w32_window_from_handle(window_handle); - window->first_paint_done = 1; - ShowWindow(window->hwnd, SW_SHOW); - if(window->maximized) - { - ShowWindow(window->hwnd, SW_MAXIMIZE); - } -} - -internal void -os_window_focus(OS_Window handle) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - SetForegroundWindow(window->hwnd); - SetFocus(window->hwnd); -} - -internal B32 -os_window_is_focused(OS_Window handle) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - HWND active_hwnd = GetActiveWindow(); - return active_hwnd == window->hwnd; -} - -internal B32 -os_window_is_fullscreen(OS_Window handle) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); - return !(window_style & WS_OVERLAPPEDWINDOW); -} - -internal void -os_window_set_fullscreen(OS_Window handle, B32 fullscreen) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); - B32 is_fullscreen_already = os_window_is_fullscreen(handle); - if(fullscreen) - { - if(!is_fullscreen_already) - { - GetWindowPlacement(window->hwnd, &window->last_window_placement); - } - MONITORINFO monitor_info = {sizeof(monitor_info)}; - if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info)) - { - SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW); - SetWindowPos(window->hwnd, HWND_TOP, - monitor_info.rcMonitor.left, - monitor_info.rcMonitor.top, - monitor_info.rcMonitor.right - monitor_info.rcMonitor.left, - monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top, - SWP_NOOWNERZORDER | SWP_FRAMECHANGED); - } - } - else - { - SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW); - SetWindowPlacement(window->hwnd, &window->last_window_placement); - SetWindowPos(window->hwnd, 0, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | - SWP_NOOWNERZORDER | SWP_FRAMECHANGED); - } -} - -internal B32 -os_window_is_maximized(OS_Window handle) -{ - B32 result = 0; - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window) - { - result = !!(IsZoomed(window->hwnd)); - } - return result; -} - -internal void -os_window_set_maximized(OS_Window handle, B32 maximized) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window != 0) - { - if(window->first_paint_done) - { - switch(maximized) - { - default: - case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break; - case 1:{ShowWindow(window->hwnd, SW_MAXIMIZE);}break; - } - } - else - { - window->maximized = maximized; - } - } -} - -internal B32 -os_window_is_minimized(OS_Window handle) -{ - B32 result = 0; - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window) - { - result = !!(IsIconic(window->hwnd)); - } - return result; -} - -internal void -os_window_set_minimized(OS_Window handle, B32 minimized) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window != 0 && minimized != os_window_is_minimized(handle)) - { - switch(minimized) - { - default: - case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break; - case 1:{ShowWindow(window->hwnd, SW_MINIMIZE);}break; - } - } -} - -internal void -os_window_bring_to_front(OS_Window handle) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window != 0) - { - BringWindowToTop(window->hwnd); - } -} - -internal void -os_window_set_monitor(OS_Window window_handle, OS_Monitor monitor) -{ - OS_W32_Window *window = os_w32_window_from_handle(window_handle); - HMONITOR hmonitor = (HMONITOR)monitor.u64[0]; - { - MONITORINFOEXW info; - info.cbSize = sizeof(MONITORINFOEXW); - if(GetMonitorInfoW(hmonitor, (MONITORINFO *)&info)) - { - Rng2F32 existing_rect = os_rect_from_window(window_handle); - Vec2F32 window_size = dim_2f32(existing_rect); - SetWindowPos(window->hwnd, HWND_TOP, - (info.rcWork.left + info.rcWork.right)/2 - window_size.x/2, - (info.rcWork.top + info.rcWork.bottom)/2 - window_size.y/2, - window_size.x, - window_size.y, 0); - } - } -} - -internal void -os_window_clear_custom_border_data(OS_Window handle) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window->custom_border) - { - arena_clear(window->paint_arena); - window->first_title_bar_client_area = window->last_title_bar_client_area = 0; - window->custom_border_title_thickness = 0; - window->custom_border_edge_thickness = 0; - } -} - -internal void -os_window_push_custom_title_bar(OS_Window handle, F32 thickness) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - window->custom_border_title_thickness = thickness; -} - -internal void -os_window_push_custom_edges(OS_Window handle, F32 thickness) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - window->custom_border_edge_thickness = thickness; -} - -internal void -os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect) -{ - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window->custom_border) - { - OS_W32_TitleBarClientArea *area = push_array(window->paint_arena, OS_W32_TitleBarClientArea, 1); - if(area != 0) - { - area->rect = rect; - SLLQueuePush(window->first_title_bar_client_area, window->last_title_bar_client_area, area); - } - } -} - -internal Rng2F32 -os_rect_from_window(OS_Window handle) -{ - Rng2F32 r = {0}; - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window) - { - RECT rect = {0}; - GetWindowRect(os_w32_hwnd_from_window(window), &rect); - r = os_w32_rng2f32_from_rect(rect); - } - return r; -} - -internal Rng2F32 -os_client_rect_from_window(OS_Window handle) -{ - Rng2F32 r = {0}; - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window) - { - RECT rect = {0}; - GetClientRect(os_w32_hwnd_from_window(window), &rect); - r = os_w32_rng2f32_from_rect(rect); - } - return r; -} - -internal F32 -os_dpi_from_window(OS_Window handle) -{ - F32 result = 96.f; - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window != 0) - { - result = window->dpi; - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks External Windows (Implemented Per-OS) - -internal OS_ExternalWindow -os_focused_external_window(void) -{ - HWND hwnd = GetForegroundWindow(); - OS_ExternalWindow result = {(U64)hwnd}; - return result; -} - -internal void -os_focus_external_window(OS_ExternalWindow handle) -{ - HWND hwnd = (HWND)handle.u64[0]; - if(hwnd != 0) - { - SetForegroundWindow(hwnd); - SetFocus(hwnd); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) - -internal OS_MonitorArray -os_push_monitors_array(Arena *arena) -{ - Temp scratch = scratch_begin(&arena, 1); - OS_W32_MonitorGatherBundle bundle = {arena}; - EnumDisplayMonitors(0, 0, os_w32_monitor_gather_enum_proc, (LPARAM)&bundle); - OS_MonitorArray array = {0}; - array.count = bundle.monitor_count; - array.v = push_array(arena, OS_Monitor, array.count); - { - U64 idx = 0; - for EachNode(n, OS_W32_MonitorGatherNode, bundle.first_monitor) - { - array.v[idx] = n->v; - idx += 1; - } - } - scratch_end(scratch); - return array; -} - -internal OS_Monitor -os_primary_monitor(void) -{ - POINT zero_pt = {0, 0}; - HMONITOR monitor = MonitorFromPoint(zero_pt, MONITOR_DEFAULTTOPRIMARY); - OS_Monitor result = {(U64)monitor}; - return result; -} - -internal OS_Monitor -os_monitor_from_window(OS_Window window) -{ - OS_W32_Window *w = os_w32_window_from_handle(window); - HMONITOR handle = MonitorFromWindow(w->hwnd, MONITOR_DEFAULTTOPRIMARY); - OS_Monitor result = {(U64)handle}; - return result; -} - -internal String8 -os_name_from_monitor(Arena *arena, OS_Monitor monitor) -{ - String8 result = {0}; - HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; - MONITORINFOEXW info; - info.cbSize = sizeof(MONITORINFOEXW); - if(GetMonitorInfoW(monitor_handle, (MONITORINFO *)&info)) - { - String16 result16 = str16_cstring((U16 *)info.szDevice); - result = str8_from_16(arena, result16); - } - return result; -} - -internal Vec2F32 -os_dim_from_monitor(OS_Monitor monitor) -{ - Vec2F32 result = {0}; - HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; - MONITORINFO info = {0}; - info.cbSize = sizeof(MONITORINFO); - if(GetMonitorInfoW(monitor_handle, &info)) - { - result.x = info.rcWork.right - info.rcWork.left; - result.y = info.rcWork.bottom - info.rcWork.top; - } - return result; -} - -internal F32 -os_dpi_from_monitor(OS_Monitor monitor) -{ - F32 result = 96.f; - HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; - if(w32_GetDpiForMonitor_func != 0) - { - UINT dpi_x = 0; - UINT dpi_y = 0; - HRESULT hr = w32_GetDpiForMonitor_func(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y); - result = (F32)dpi_x; - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) - -internal void -os_send_wakeup_event(void) -{ - PostThreadMessageA(os_w32_gfx_state->gfx_thread_tid, 0x401, 0, 0); -} - -internal OS_EventList -os_get_events(Arena *arena, B32 wait) -{ - os_w32_event_arena = arena; - MemoryZeroStruct(&os_w32_event_list); - MSG msg = {0}; - if(!wait || GetMessage(&msg, 0, 0, 0)) - { - B32 first_wait = wait; - for(;first_wait || PeekMessage(&msg, 0, 0, 0, PM_REMOVE); first_wait = 0) - { - DispatchMessage(&msg); - TranslateMessage(&msg); - if(msg.message == WM_QUIT) - { - os_w32_push_event(OS_EventKind_WindowClose, 0); - } - } - } - return os_w32_event_list; -} - -internal OS_Modifiers -os_get_modifiers(void) -{ - OS_Modifiers modifiers = 0; - if(GetKeyState(VK_CONTROL) & 0x8000) - { - modifiers |= OS_Modifier_Ctrl; - } - if(GetKeyState(VK_SHIFT) & 0x8000) - { - modifiers |= OS_Modifier_Shift; - } - if(GetKeyState(VK_MENU) & 0x8000) - { - modifiers |= OS_Modifier_Alt; - } - return modifiers; -} - -internal B32 -os_key_is_down(OS_Key key) -{ - B32 down = 0; - WPARAM vkey = os_w32_vkey_from_os_key(key); - if(GetKeyState(vkey) & 0x8000) - { - down = 1; - } - return down; -} - -internal Vec2F32 -os_mouse_from_window(OS_Window handle) -{ - ProfBeginFunction(); - Vec2F32 v = {0}; - POINT p; - if(GetCursorPos(&p)) - { - OS_W32_Window *window = os_w32_window_from_handle(handle); - ScreenToClient(window->hwnd, &p); - v.x = (F32)p.x; - v.y = (F32)p.y; - } - ProfEnd(); - return v; -} - -//////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) - -internal void -os_set_cursor(OS_Cursor cursor) -{ - B32 valid_cursor = 1; - HCURSOR hcursor = 0; - switch(cursor) - { - default: {valid_cursor = 0;}break; -#define Win32CursorXList(X) \ -X(Pointer, IDC_ARROW) \ -X(IBar, IDC_IBEAM) \ -X(LeftRight, IDC_SIZEWE) \ -X(UpDown, IDC_SIZENS) \ -X(DownRight, IDC_SIZENWSE) \ -X(UpRight, IDC_SIZENESW) \ -X(UpDownLeftRight, IDC_SIZEALL) \ -X(HandPoint, IDC_HAND)\ -X(Disabled, IDC_NO) -#define CursorCase(E,R) case OS_Cursor_##E:{ \ -local_persist HCURSOR curs = 0; \ -if (curs == 0){ curs = LoadCursor(NULL, R); } \ -hcursor = curs; }break; - Win32CursorXList(CursorCase) -#undef CursorCase -#undef Win32CursorXList - } - if(valid_cursor && !os_w32_resizing) - { - if(hcursor != os_w32_gfx_state->hCursor) - { - PostMessage(0, WM_SETCURSOR, 0, 0); - POINT p = {0}; - GetCursorPos(&p); - SetCursorPos(p.x, p.y); - } - os_w32_gfx_state->hCursor = hcursor; - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void -os_graphical_message(B32 error, String8 title, String8 message) -{ - Temp scratch = scratch_begin(0, 0); - String16 title16 = str16_from_8(scratch.arena, title); - String16 message16 = str16_from_8(scratch.arena, message); - MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR)); - scratch_end(scratch); -} - -internal String8 -os_graphical_pick_file(Arena *arena, String8 initial_path) -{ - String8 result = {0}; - { - Temp scratch = scratch_begin(&arena, 1); - U64 buffer_size = 4096; - U16 *buffer = push_array(scratch.arena, U16, buffer_size); - OPENFILENAMEW params = {sizeof(params)}; - { - params.lpstrFile = (WCHAR *)buffer; - params.nMaxFile = buffer_size; - params.lpstrInitialDir = (WCHAR *)str16_from_8(scratch.arena, initial_path).str; - } - if(GetOpenFileNameW(¶ms)) - { - result = str8_from_16(arena, str16_cstring((U16 *)buffer)); - } - scratch_end(scratch); - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Shell Operations - -internal void -os_show_in_filesystem_ui(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); - for(U64 idx = 0; idx < path_copy.size; idx += 1) - { - if(path_copy.str[idx] == '/') - { - path_copy.str[idx] = '\\'; - } - } - String16 path16 = str16_from_8(scratch.arena, path_copy); - SFGAOF flags = 0; - PIDLIST_ABSOLUTE list = 0; - if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags))) - { - HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0); - CoTaskMemFree(list); - (void)hr; - } - scratch_end(scratch); -} - -internal void -os_open_in_browser(String8 url) -{ - Temp scratch = scratch_begin(0, 0); - String16 url16 = str16_from_8(scratch.arena, url); - ShellExecuteW(0, L"open", (WCHAR *)url16.str, 0, 0, SW_SHOWNORMAL); - scratch_end(scratch); -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Modern Windows SDK Functions +// +// (We must dynamically link to them, since they can be missing in older SDKs) + +typedef BOOL w32_SetProcessDpiAwarenessContext_Type(void* value); +typedef UINT w32_GetDpiForWindow_Type(HWND hwnd); +typedef HRESULT w32_GetDpiForMonitor_Type(HMONITOR hmonitor, MONITOR_DPI_TYPE dpiType, UINT *dpiX, UINT *dpiY); +typedef int w32_GetSystemMetricsForDpi_Type(int nIndex, UINT dpi); +#define w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((void*)-4) +global w32_GetDpiForWindow_Type *w32_GetDpiForWindow_func = 0; +global w32_GetDpiForMonitor_Type *w32_GetDpiForMonitor_func = 0; +global w32_GetSystemMetricsForDpi_Type *w32_GetSystemMetricsForDpi_func = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal Rng2F32 +os_w32_rng2f32_from_rect(RECT rect) +{ + Rng2F32 r = {0}; + r.x0 = (F32)rect.left; + r.x1 = (F32)rect.right; + r.y0 = (F32)rect.top; + r.y1 = (F32)rect.bottom; + return r; +} + +//////////////////////////////// +//~ rjf: Windows + +internal OS_Window +os_w32_handle_from_window(OS_W32_Window *window) +{ + OS_Window handle = {(U64)window}; + return handle; +} + +internal OS_W32_Window * +os_w32_window_from_handle(OS_Window handle) +{ + OS_W32_Window *window = (OS_W32_Window *)handle.u64[0]; + return window; +} + +internal OS_W32_Window * +os_w32_window_from_hwnd(HWND hwnd) +{ + OS_W32_Window *result = 0; + for(OS_W32_Window *w = os_w32_gfx_state->first_window; w; w = w->next) + { + if(w->hwnd == hwnd) + { + result = w; + break; + } + } + return result; +} + +internal HWND +os_w32_hwnd_from_window(OS_W32_Window *window) +{ + return window->hwnd; +} + +internal OS_W32_Window * +os_w32_window_alloc(void) +{ + OS_W32_Window *result = os_w32_gfx_state->free_window; + if(result) + { + SLLStackPop(os_w32_gfx_state->free_window); + } + else + { + result = push_array_no_zero(os_w32_gfx_state->arena, OS_W32_Window, 1); + } + MemoryZeroStruct(result); + if(result) + { + DLLPushBack(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, result); + } + result->last_window_placement.length = sizeof(WINDOWPLACEMENT); + return result; +} + +internal void +os_w32_window_release(OS_W32_Window *window) +{ + if(window->paint_arena != 0) + { + arena_release(window->paint_arena); + } + ReleaseDC(window->hwnd, window->hdc); + DestroyWindow(window->hwnd); + DLLRemove(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, window); + SLLStackPush(os_w32_gfx_state->free_window, window); +} + +internal OS_Event * +os_w32_push_event(OS_EventKind kind, OS_W32_Window *window) +{ + OS_Event *result = os_event_list_push_new(os_w32_event_arena, &os_w32_event_list, kind); + result->window = os_w32_handle_from_window(window); + result->modifiers = os_get_modifiers(); + return result; +} + +internal OS_Key +os_w32_os_key_from_vkey(WPARAM vkey) +{ + local_persist B32 first = 1; + local_persist OS_Key key_table[256]; + if (first){ + first = 0; + MemoryZeroArray(key_table); + + key_table[(unsigned int)'A'] = OS_Key_A; + key_table[(unsigned int)'B'] = OS_Key_B; + key_table[(unsigned int)'C'] = OS_Key_C; + key_table[(unsigned int)'D'] = OS_Key_D; + key_table[(unsigned int)'E'] = OS_Key_E; + key_table[(unsigned int)'F'] = OS_Key_F; + key_table[(unsigned int)'G'] = OS_Key_G; + key_table[(unsigned int)'H'] = OS_Key_H; + key_table[(unsigned int)'I'] = OS_Key_I; + key_table[(unsigned int)'J'] = OS_Key_J; + key_table[(unsigned int)'K'] = OS_Key_K; + key_table[(unsigned int)'L'] = OS_Key_L; + key_table[(unsigned int)'M'] = OS_Key_M; + key_table[(unsigned int)'N'] = OS_Key_N; + key_table[(unsigned int)'O'] = OS_Key_O; + key_table[(unsigned int)'P'] = OS_Key_P; + key_table[(unsigned int)'Q'] = OS_Key_Q; + key_table[(unsigned int)'R'] = OS_Key_R; + key_table[(unsigned int)'S'] = OS_Key_S; + key_table[(unsigned int)'T'] = OS_Key_T; + key_table[(unsigned int)'U'] = OS_Key_U; + key_table[(unsigned int)'V'] = OS_Key_V; + key_table[(unsigned int)'W'] = OS_Key_W; + key_table[(unsigned int)'X'] = OS_Key_X; + key_table[(unsigned int)'Y'] = OS_Key_Y; + key_table[(unsigned int)'Z'] = OS_Key_Z; + + for (U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1){ + key_table[i] = (OS_Key)j; + } + for (U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1){ + key_table[i] = (OS_Key)j; + } + for (U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1){ + key_table[i] = (OS_Key)j; + } + + key_table[VK_SPACE] = OS_Key_Space; + key_table[VK_OEM_3] = OS_Key_Tick; + key_table[VK_OEM_MINUS] = OS_Key_Minus; + key_table[VK_OEM_PLUS] = OS_Key_Equal; + key_table[VK_OEM_4] = OS_Key_LeftBracket; + key_table[VK_OEM_6] = OS_Key_RightBracket; + key_table[VK_OEM_1] = OS_Key_Semicolon; + key_table[VK_OEM_7] = OS_Key_Quote; + key_table[VK_OEM_COMMA] = OS_Key_Comma; + key_table[VK_OEM_PERIOD]= OS_Key_Period; + key_table[VK_OEM_2] = OS_Key_Slash; + key_table[VK_OEM_5] = OS_Key_BackSlash; + + key_table[VK_TAB] = OS_Key_Tab; + key_table[VK_PAUSE] = OS_Key_Pause; + key_table[VK_ESCAPE] = OS_Key_Esc; + + key_table[VK_UP] = OS_Key_Up; + key_table[VK_LEFT] = OS_Key_Left; + key_table[VK_DOWN] = OS_Key_Down; + key_table[VK_RIGHT] = OS_Key_Right; + + key_table[VK_BACK] = OS_Key_Backspace; + key_table[VK_RETURN] = OS_Key_Return; + + key_table[VK_DELETE] = OS_Key_Delete; + key_table[VK_INSERT] = OS_Key_Insert; + key_table[VK_PRIOR] = OS_Key_PageUp; + key_table[VK_NEXT] = OS_Key_PageDown; + key_table[VK_HOME] = OS_Key_Home; + key_table[VK_END] = OS_Key_End; + + key_table[VK_CAPITAL] = OS_Key_CapsLock; + key_table[VK_NUMLOCK] = OS_Key_NumLock; + key_table[VK_SCROLL] = OS_Key_ScrollLock; + key_table[VK_APPS] = OS_Key_Menu; + + key_table[VK_CONTROL] = OS_Key_Ctrl; + key_table[VK_LCONTROL] = OS_Key_Ctrl; + key_table[VK_RCONTROL] = OS_Key_Ctrl; + key_table[VK_SHIFT] = OS_Key_Shift; + key_table[VK_LSHIFT] = OS_Key_Shift; + key_table[VK_RSHIFT] = OS_Key_Shift; + key_table[VK_MENU] = OS_Key_Alt; + key_table[VK_LMENU] = OS_Key_Alt; + key_table[VK_RMENU] = OS_Key_Alt; + + key_table[VK_DIVIDE] = OS_Key_NumSlash; + key_table[VK_MULTIPLY] = OS_Key_NumStar; + key_table[VK_SUBTRACT] = OS_Key_NumMinus; + key_table[VK_ADD] = OS_Key_NumPlus; + key_table[VK_DECIMAL] = OS_Key_NumPeriod; + + for (U32 i = 0; i < 10; i += 1){ + key_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); + } + + for (U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1){ + key_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); + } + } + + OS_Key key = key_table[vkey&bitmask8]; + return key; +} + +internal WPARAM +os_w32_vkey_from_os_key(OS_Key key) +{ + WPARAM result = 0; + { + local_persist B32 initialized = 0; + local_persist WPARAM vkey_table[OS_Key_COUNT] = {0}; + if(initialized == 0) + { + initialized = 1; + vkey_table[OS_Key_Esc] = VK_ESCAPE; + for(OS_Key key = OS_Key_F1; key <= OS_Key_F24; key = (OS_Key)(key+1)) + { + vkey_table[key] = VK_F1+(key-OS_Key_F1); + } + vkey_table[OS_Key_Tick] = VK_OEM_3; + for(OS_Key key = OS_Key_0; key <= OS_Key_9; key = (OS_Key)(key+1)) + { + vkey_table[key] = '0'+(key-OS_Key_0); + } + vkey_table[OS_Key_Minus] = VK_OEM_MINUS; + vkey_table[OS_Key_Equal] = VK_OEM_PLUS; + vkey_table[OS_Key_Backspace] = VK_BACK; + vkey_table[OS_Key_Tab] = VK_TAB; + vkey_table[OS_Key_Q] = 'Q'; + vkey_table[OS_Key_W] = 'W'; + vkey_table[OS_Key_E] = 'E'; + vkey_table[OS_Key_R] = 'R'; + vkey_table[OS_Key_T] = 'T'; + vkey_table[OS_Key_Y] = 'Y'; + vkey_table[OS_Key_U] = 'U'; + vkey_table[OS_Key_I] = 'I'; + vkey_table[OS_Key_O] = 'O'; + vkey_table[OS_Key_P] = 'P'; + vkey_table[OS_Key_LeftBracket] = VK_OEM_4; + vkey_table[OS_Key_RightBracket] = VK_OEM_6; + vkey_table[OS_Key_BackSlash] = VK_OEM_5; + vkey_table[OS_Key_CapsLock] = VK_CAPITAL; + vkey_table[OS_Key_A] = 'A'; + vkey_table[OS_Key_S] = 'S'; + vkey_table[OS_Key_D] = 'D'; + vkey_table[OS_Key_F] = 'F'; + vkey_table[OS_Key_G] = 'G'; + vkey_table[OS_Key_H] = 'H'; + vkey_table[OS_Key_J] = 'J'; + vkey_table[OS_Key_K] = 'K'; + vkey_table[OS_Key_L] = 'L'; + vkey_table[OS_Key_Semicolon] = VK_OEM_1; + vkey_table[OS_Key_Quote] = VK_OEM_7; + vkey_table[OS_Key_Return] = VK_RETURN; + vkey_table[OS_Key_Shift] = VK_SHIFT; + vkey_table[OS_Key_Z] = 'Z'; + vkey_table[OS_Key_X] = 'X'; + vkey_table[OS_Key_C] = 'C'; + vkey_table[OS_Key_V] = 'V'; + vkey_table[OS_Key_B] = 'B'; + vkey_table[OS_Key_N] = 'N'; + vkey_table[OS_Key_M] = 'M'; + vkey_table[OS_Key_Comma] = VK_OEM_COMMA; + vkey_table[OS_Key_Period] = VK_OEM_PERIOD; + vkey_table[OS_Key_Slash] = VK_OEM_2; + vkey_table[OS_Key_Ctrl] = VK_CONTROL; + vkey_table[OS_Key_Alt] = VK_MENU; + vkey_table[OS_Key_Space] = VK_SPACE; + vkey_table[OS_Key_Menu] = VK_APPS; + vkey_table[OS_Key_ScrollLock] = VK_SCROLL; + vkey_table[OS_Key_Pause] = VK_PAUSE; + vkey_table[OS_Key_Insert] = VK_INSERT; + vkey_table[OS_Key_Home] = VK_HOME; + vkey_table[OS_Key_PageUp] = VK_PRIOR; + vkey_table[OS_Key_Delete] = VK_DELETE; + vkey_table[OS_Key_End] = VK_END; + vkey_table[OS_Key_PageDown] = VK_NEXT; + vkey_table[OS_Key_Up] = VK_UP; + vkey_table[OS_Key_Left] = VK_LEFT; + vkey_table[OS_Key_Down] = VK_DOWN; + vkey_table[OS_Key_Right] = VK_RIGHT; + for(OS_Key key = OS_Key_Ex0; key <= OS_Key_Ex29; key = (OS_Key)(key+1)) + { + vkey_table[key] = 0xDF + (key-OS_Key_Ex0); + } + vkey_table[OS_Key_NumLock] = VK_NUMLOCK; + vkey_table[OS_Key_NumSlash] = VK_DIVIDE; + vkey_table[OS_Key_NumStar] = VK_MULTIPLY; + vkey_table[OS_Key_NumMinus] = VK_SUBTRACT; + vkey_table[OS_Key_NumPlus] = VK_ADD; + vkey_table[OS_Key_NumPeriod] = VK_DECIMAL; + vkey_table[OS_Key_Num0] = VK_NUMPAD0; + vkey_table[OS_Key_Num1] = VK_NUMPAD1; + vkey_table[OS_Key_Num2] = VK_NUMPAD2; + vkey_table[OS_Key_Num3] = VK_NUMPAD3; + vkey_table[OS_Key_Num4] = VK_NUMPAD4; + vkey_table[OS_Key_Num5] = VK_NUMPAD5; + vkey_table[OS_Key_Num6] = VK_NUMPAD6; + vkey_table[OS_Key_Num7] = VK_NUMPAD7; + vkey_table[OS_Key_Num8] = VK_NUMPAD8; + vkey_table[OS_Key_Num9] = VK_NUMPAD9; + vkey_table[OS_Key_LeftMouseButton] = VK_LBUTTON; + vkey_table[OS_Key_MiddleMouseButton] = VK_MBUTTON; + vkey_table[OS_Key_RightMouseButton] = VK_RBUTTON; + } + result = vkey_table[key]; + } + return result; +} + +internal LRESULT +os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + ProfBeginFunction(); + LRESULT result = 0; + B32 good = 1; + if(os_w32_event_arena == 0) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + good = 0; + } + if(good) + { + OS_W32_Window *window = os_w32_window_from_hwnd(hwnd); + OS_Window window_handle = os_w32_handle_from_window(window); + B32 release = 0; + + switch(uMsg) + { + default: + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + }break; + + case WM_ENTERSIZEMOVE: + { + os_w32_resizing = 1; + }break; + + case WM_EXITSIZEMOVE: + { + os_w32_resizing = 0; + }break; + + case WM_SIZE: + case WM_PAINT: + { + PAINTSTRUCT ps = {0}; + BeginPaint(hwnd, &ps); + update(); + EndPaint(hwnd, &ps); + DwmFlush(); + }break; + + case WM_CLOSE: + { + os_w32_push_event(OS_EventKind_WindowClose, window); + }break; + + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + { + release = 1; + } // fallthrough; + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + { + OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); + switch (uMsg) + { + case WM_LBUTTONUP: case WM_LBUTTONDOWN: + { + event->key = OS_Key_LeftMouseButton; + }break; + case WM_MBUTTONUP: case WM_MBUTTONDOWN: + { + event->key = OS_Key_MiddleMouseButton; + }break; + case WM_RBUTTONUP: case WM_RBUTTONDOWN: + { + event->key = OS_Key_RightMouseButton; + }break; + } + event->pos.x = (F32)(S16)LOWORD(lParam); + event->pos.y = (F32)(S16)HIWORD(lParam); + if(release) + { + ReleaseCapture(); + } + else + { + SetCapture(hwnd); + } + }break; + + case WM_MOUSEMOVE: + { + OS_Event *event = os_w32_push_event(OS_EventKind_MouseMove, window); + event->pos.x = (F32)(S16)LOWORD(lParam); + event->pos.y = (F32)(S16)HIWORD(lParam); + }break; + + case WM_MOUSEWHEEL: + { + S16 wheel_delta = HIWORD(wParam); + OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window); + POINT p; + p.x = (S32)(S16)LOWORD(lParam); + p.y = (S32)(S16)HIWORD(lParam); + ScreenToClient(window->hwnd, &p); + event->pos.x = (F32)p.x; + event->pos.y = (F32)p.y; + event->delta = v2f32(0.f, -(F32)wheel_delta); + }break; + + case WM_MOUSEHWHEEL: + { + S16 wheel_delta = HIWORD(wParam); + OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window); + POINT p; + p.x = (S32)(S16)LOWORD(lParam); + p.y = (S32)(S16)HIWORD(lParam); + ScreenToClient(window->hwnd, &p); + event->pos.x = (F32)p.x; + event->pos.y = (F32)p.y; + event->delta = v2f32((F32)wheel_delta, 0.f); + }break; + + case WM_SYSKEYDOWN: case WM_SYSKEYUP: + { + if(wParam != VK_MENU && (wParam < VK_F1 || VK_F24 < wParam || wParam == VK_F4)) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + } // fallthrough; + case WM_KEYDOWN: case WM_KEYUP: + { + B32 was_down = (lParam & bit31); + B32 is_down = !(lParam & bit32); + + B32 is_repeat = 0; + if(!is_down) + { + release = 1; + } + else if(was_down) + { + is_repeat = 1; + } + + B32 right_sided = 0; + if ((lParam & bit25) && + (wParam == VK_CONTROL || wParam == VK_RCONTROL || + wParam == VK_MENU || wParam == VK_RMENU || + wParam == VK_SHIFT || wParam == VK_RSHIFT)) + { + right_sided = 1; + } + + OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); + event->key = os_w32_os_key_from_vkey(wParam); + event->repeat_count = lParam & bitmask16; + event->is_repeat = is_repeat; + event->right_sided = right_sided; + if(event->key == OS_Key_Alt && event->modifiers & OS_Modifier_Alt) { event->modifiers &= ~OS_Modifier_Alt; } + if(event->key == OS_Key_Ctrl && event->modifiers & OS_Modifier_Ctrl) { event->modifiers &= ~OS_Modifier_Ctrl; } + if(event->key == OS_Key_Shift && event->modifiers & OS_Modifier_Shift) { event->modifiers &= ~OS_Modifier_Shift; } + }break; + + case WM_SYSCHAR: + { + WORD vk_code = LOWORD(wParam); + if(vk_code == VK_SPACE) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + else + { + result = 0; + } + }break; + + case WM_CHAR: + { + U32 character = wParam; + if(character >= 32 && character != 127) + { + OS_Event *event = os_w32_push_event(OS_EventKind_Text, window); + if(lParam & bit29) + { + event->modifiers |= OS_Modifier_Alt; + } + event->character = character; + } + }break; + + case WM_KILLFOCUS: + { + os_w32_push_event(OS_EventKind_WindowLoseFocus, window); + ReleaseCapture(); + }break; + + case WM_SETCURSOR: + { + Rng2F32 window_rect = os_client_rect_from_window(window_handle); + Vec2F32 mouse = os_mouse_from_window(window_handle); + B32 on_border = 0; + DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; + B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); + if(window != 0 && window->custom_border && !is_fullscreen) + { + B32 on_border_x = (mouse.x <= window->custom_border_edge_thickness || window_rect.x1-window->custom_border_edge_thickness <= mouse.x); + B32 on_border_y = (mouse.y <= window->custom_border_edge_thickness || window_rect.y1-window->custom_border_edge_thickness <= mouse.y); + on_border = on_border_x || on_border_y; + } + if(!os_w32_resizing && !on_border && contains_2f32(window_rect, mouse)) + { + SetCursor(os_w32_gfx_state->hCursor); + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + + case WM_DPICHANGED: + { + F32 new_dpi = (F32)(wParam & 0xffff); + RECT suggested_new_rect = *(RECT *)lParam; + window->dpi = new_dpi; + SetWindowPos(window->hwnd, 0, + suggested_new_rect.left, + suggested_new_rect.top, + suggested_new_rect.right - suggested_new_rect.left, + suggested_new_rect.bottom - suggested_new_rect.top, + 0); + }break; + + //- rjf: [file drop] + case WM_DROPFILES: + { + HDROP drop = (HDROP)wParam; + POINT drop_pt = {0}; + DragQueryPoint(drop, &drop_pt); + U64 num_files_dropped = DragQueryFile(drop, 0xffffffff, 0, 0); + OS_Event *event = os_w32_push_event(OS_EventKind_FileDrop, window); + event->pos = v2f32((F32)drop_pt.x, (F32)drop_pt.y); + for(U64 idx = 0; idx < num_files_dropped; idx += 1) + { + U64 name_size = DragQueryFile(drop, idx, 0, 0) + 1; + U8 *name_ptr = push_array(os_w32_event_arena, U8, name_size); + DragQueryFile(drop, idx, (char *)name_ptr, name_size); + String8 path_string = str8(name_ptr, name_size - 1); + String8 path_string__normalized = path_normalized_from_string(os_w32_event_arena, path_string); + str8_list_push(os_w32_event_arena, &event->strings, path_string__normalized); + } + DragFinish(drop); + }break; + + //- rjf: [custom border] + case WM_NCPAINT: + { + if(os_w32_new_window_custom_border || (window != 0 && window->custom_border && !window->custom_border_composition_enabled)) + { + result = 0; + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + case WM_DWMCOMPOSITIONCHANGED: + { + if(window != 0 && window->custom_border) + { + BOOL enabled = 0; + DwmIsCompositionEnabled(&enabled); + window->custom_border_composition_enabled = enabled; + if(enabled) + { + MARGINS m = { 0, 0, 1, 0 }; + DwmExtendFrameIntoClientArea(hwnd, &m); + DWORD dwmncrp_enabled = DWMNCRP_ENABLED; + DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &enabled, sizeof(dwmncrp_enabled)); + } + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + case WM_WINDOWPOSCHANGED: + { + result = 0; + }break; + case WM_NCUAHDRAWCAPTION: + case WM_NCUAHDRAWFRAME: + { + // NOTE(rjf): undocumented messages for drawing themed window borders. + if(os_w32_new_window_custom_border || (window != 0 && window->custom_border)) + { + result = 0; + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + case WM_SETICON: + case WM_SETTEXT: + { + if(os_w32_new_window_custom_border || (window && window->custom_border && !window->custom_border_composition_enabled)) + { + // NOTE(rjf): + // https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/ + LONG_PTR old_style = GetWindowLongPtrW(hwnd, GWL_STYLE); + SetWindowLongPtrW(hwnd, GWL_STYLE, old_style & ~WS_VISIBLE); + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + SetWindowLongPtrW(hwnd, GWL_STYLE, old_style); + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + }break; + + //- rjf: [custom border] activation - without this `result`, stuff flickers. + case WM_NCACTIVATE: + { + if(!os_w32_new_window_custom_border && (window == 0 || window->custom_border == 0)) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + else + { + result = DefWindowProcW(hwnd, uMsg, wParam, -1); + } + }break; + + //- rjf: [custom border] client/window size calculation + case WM_NCCALCSIZE: + { + if(os_w32_new_window_custom_border || (window && window->custom_border)) + { + F32 dpi = w32_GetDpiForWindow_func ? (F32)w32_GetDpiForWindow_func(hwnd) : 96.f; + S32 frame_x = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXFRAME, dpi) : GetSystemMetrics(SM_CXFRAME); + S32 frame_y = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CYFRAME, dpi) : GetSystemMetrics(SM_CYFRAME); + S32 padding = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXPADDEDBORDER, dpi) : GetSystemMetrics(SM_CXPADDEDBORDER); + DWORD window_style = GetWindowLong(hwnd, GWL_STYLE); + B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); + if(!is_fullscreen) + { + RECT* rect = wParam == 0 ? (RECT*)lParam : ((NCCALCSIZE_PARAMS*)lParam)->rgrc; + rect->right -= frame_x + padding; + rect->left += frame_x + padding; + rect->bottom -= frame_y + padding; + + if(IsMaximized(hwnd)) + { + rect->top += frame_y + padding; + // If we do not do this hidden taskbar can not be unhidden on mouse hover + // Unfortunately it can create an ugly bottom border when maximized... + rect->bottom -= 1; + } + } + } + else + { + result = DefWindowProc(hwnd, uMsg, wParam, lParam); + } + }break; + + //- rjf: [custom border] client/window hit testing (mapping mouse -> action) + case WM_NCHITTEST: + { + DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; + B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); + if(window == 0 || window->custom_border == 0 || is_fullscreen) + { + result = DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + else + { + B32 is_default_handled = 0; + + // Let the default procedure handle resizing areas + result = DefWindowProc(hwnd, uMsg, wParam, lParam); + switch (result) + { + case HTNOWHERE: + case HTRIGHT: + case HTLEFT: + case HTTOPLEFT: + case HTTOPRIGHT: + case HTBOTTOMRIGHT: + case HTBOTTOM: + case HTBOTTOMLEFT: + { + is_default_handled = 1; + } break; + } + + if (!is_default_handled) + { + POINT pos_monitor; + pos_monitor.x = GET_X_LPARAM(lParam); + pos_monitor.y = GET_Y_LPARAM(lParam); + POINT pos_client = pos_monitor; + ScreenToClient(hwnd, &pos_client); + + // Adjustments happening in NCCALCSIZE are messing with the detection + // of the top hit area so manually checking that. + F32 dpi = w32_GetDpiForWindow_func ? (F32)w32_GetDpiForWindow_func(hwnd) : 96.f; + S32 frame_y = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CYFRAME, dpi) : GetSystemMetrics(SM_CYFRAME); + // NOTE(rjf): it seems incorrect to apply this padding here... + // S32 padding = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXPADDEDBORDER, dpi) : GetSystemMetrics(SM_CXPADDEDBORDER); + + B32 is_over_top_resize = pos_client.y >= 0 && pos_client.y < frame_y; // + padding; + B32 is_over_title_bar = pos_client.y >= 0 && pos_client.y < window->custom_border_title_thickness; + + //- rjf: check against title bar client areas + B32 is_over_title_bar_client_area = 0; + for(OS_W32_TitleBarClientArea *area = window->first_title_bar_client_area; + area != 0; + area = area->next) + { + Rng2F32 rect = area->rect; + if(rect.x0 <= pos_client.x && pos_client.x < rect.x1 && + rect.y0 <= pos_client.y && pos_client.y < rect.y1) + { + is_over_title_bar_client_area = 1; + break; + } + } + + if (IsMaximized(hwnd)) + { + if (is_over_title_bar_client_area) + { + result = HTCLIENT; + } + else if (is_over_title_bar) + { + result = HTCAPTION; + } + else + { + result = HTCLIENT; + } + } + else + { + //Swap the first two conditions to choose if hovering the top border + //should prioritize resize or title bar buttons. + if (is_over_title_bar_client_area) + { + result = HTCLIENT; + } + else if (is_over_top_resize) + { + result = HTTOP; + } + else if (is_over_title_bar) + { + result = HTCAPTION; + } + else { + result = HTCLIENT; + } + } + } + } + }break; + } + } + ProfEnd(); + return result; +} + +//////////////////////////////// +//~ rjf: Monitors + +internal BOOL +os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr) +{ + OS_W32_MonitorGatherBundle *bundle = (OS_W32_MonitorGatherBundle *)bundle_ptr; + OS_Monitor m = {(U64)monitor}; + OS_W32_MonitorGatherNode *n = push_array(bundle->arena, OS_W32_MonitorGatherNode, 1); + n->v = m; + SLLQueuePush(bundle->first_monitor, bundle->last_monitor, n); + bundle->monitor_count += 1; + return 1; +} + +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void +os_gfx_init(void) +{ + //- rjf: set up base shared state + Arena *arena = arena_alloc(); + os_w32_gfx_state = push_array(arena, OS_W32_GfxState, 1); + os_w32_gfx_state->arena = arena; + os_w32_gfx_state->gfx_thread_tid = (U32)GetCurrentThreadId(); + os_w32_gfx_state->hInstance = GetModuleHandle(0); + + //- rjf: set dpi awareness + w32_SetProcessDpiAwarenessContext_Type *SetProcessDpiAwarenessContext_func = 0; + HMODULE module = LoadLibraryA("user32.dll"); + if(module != 0) + { + SetProcessDpiAwarenessContext_func = + (w32_SetProcessDpiAwarenessContext_Type*)GetProcAddress(module, "SetProcessDpiAwarenessContext"); + w32_GetDpiForWindow_func = + (w32_GetDpiForWindow_Type*)GetProcAddress(module, "GetDpiForWindow"); + w32_GetDpiForMonitor_func = (w32_GetDpiForMonitor_Type *)GetProcAddress(module, "GetDpiForMonitor"); + w32_GetSystemMetricsForDpi_func = (w32_GetSystemMetricsForDpi_Type *)GetProcAddress(module, "GetSystemMetricsForDpi"); + FreeLibrary(module); + } + if(SetProcessDpiAwarenessContext_func != 0) + { + SetProcessDpiAwarenessContext_func(w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + } + else + { + HMODULE shcore = LoadLibraryA("shcore.dll"); + if(shcore) + { + typedef HRESULT (WINAPI* SetProcessDpiAwareness_t)(int); + SetProcessDpiAwareness_t SetProcessDpiAwareness = (void*)GetProcAddress(shcore, "SetProcessDpiAwareness"); + if(SetProcessDpiAwareness) + { + SetProcessDpiAwareness(2); + } + FreeLibrary(shcore); + } + SetProcessDPIAware(); + } + + //- rjf: register graphical-window class + { + WNDCLASSEXW wndclass = {sizeof(wndclass)}; + wndclass.lpfnWndProc = os_w32_wnd_proc; + wndclass.hInstance = os_w32_gfx_state->hInstance; + wndclass.lpszClassName = L"graphical-window"; + wndclass.hCursor = LoadCursorA(0, IDC_ARROW); + wndclass.hIcon = LoadIcon(os_w32_gfx_state->hInstance, MAKEINTRESOURCE(1)); + wndclass.style = CS_VREDRAW|CS_HREDRAW; + ATOM wndatom = RegisterClassExW(&wndclass); + (void)wndatom; + } + + //- rjf: grab graphics system info + { + os_w32_gfx_state->gfx_info.double_click_time = GetDoubleClickTime()/1000.f; + os_w32_gfx_state->gfx_info.caret_blink_time = GetCaretBlinkTime()/1000.f; + DEVMODEW devmodew = {0}; + if(EnumDisplaySettingsW(0, ENUM_CURRENT_SETTINGS, &devmodew)) + { + os_w32_gfx_state->gfx_info.default_refresh_rate = (F32)devmodew.dmDisplayFrequency; + } + } + + //- rjf: set initial cursor + os_set_cursor(OS_Cursor_Pointer); + + //- rjf: fill vkey -> OS_Key table + { + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'A'] = OS_Key_A; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'B'] = OS_Key_B; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'C'] = OS_Key_C; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'D'] = OS_Key_D; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'E'] = OS_Key_E; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'F'] = OS_Key_F; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'G'] = OS_Key_G; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'H'] = OS_Key_H; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'I'] = OS_Key_I; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'J'] = OS_Key_J; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'K'] = OS_Key_K; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'L'] = OS_Key_L; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'M'] = OS_Key_M; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'N'] = OS_Key_N; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'O'] = OS_Key_O; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'P'] = OS_Key_P; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Q'] = OS_Key_Q; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'R'] = OS_Key_R; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'S'] = OS_Key_S; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'T'] = OS_Key_T; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'U'] = OS_Key_U; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'V'] = OS_Key_V; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'W'] = OS_Key_W; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'X'] = OS_Key_X; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Y'] = OS_Key_Y; + os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Z'] = OS_Key_Z; + + for(U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1) + { + os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + } + for(U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1) + { + os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + } + for(U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1) + { + os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + } + + os_w32_gfx_state->key_from_vkey_table[VK_SPACE] = OS_Key_Space; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_3] = OS_Key_Tick; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_MINUS] = OS_Key_Minus; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_PLUS] = OS_Key_Equal; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_4] = OS_Key_LeftBracket; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_6] = OS_Key_RightBracket; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_1] = OS_Key_Semicolon; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_7] = OS_Key_Quote; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_COMMA] = OS_Key_Comma; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_PERIOD]= OS_Key_Period; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_2] = OS_Key_Slash; + os_w32_gfx_state->key_from_vkey_table[VK_OEM_5] = OS_Key_BackSlash; + + os_w32_gfx_state->key_from_vkey_table[VK_TAB] = OS_Key_Tab; + os_w32_gfx_state->key_from_vkey_table[VK_PAUSE] = OS_Key_Pause; + os_w32_gfx_state->key_from_vkey_table[VK_ESCAPE] = OS_Key_Esc; + + os_w32_gfx_state->key_from_vkey_table[VK_UP] = OS_Key_Up; + os_w32_gfx_state->key_from_vkey_table[VK_LEFT] = OS_Key_Left; + os_w32_gfx_state->key_from_vkey_table[VK_DOWN] = OS_Key_Down; + os_w32_gfx_state->key_from_vkey_table[VK_RIGHT] = OS_Key_Right; + + os_w32_gfx_state->key_from_vkey_table[VK_BACK] = OS_Key_Backspace; + os_w32_gfx_state->key_from_vkey_table[VK_RETURN] = OS_Key_Return; + + os_w32_gfx_state->key_from_vkey_table[VK_DELETE] = OS_Key_Delete; + os_w32_gfx_state->key_from_vkey_table[VK_INSERT] = OS_Key_Insert; + os_w32_gfx_state->key_from_vkey_table[VK_PRIOR] = OS_Key_PageUp; + os_w32_gfx_state->key_from_vkey_table[VK_NEXT] = OS_Key_PageDown; + os_w32_gfx_state->key_from_vkey_table[VK_HOME] = OS_Key_Home; + os_w32_gfx_state->key_from_vkey_table[VK_END] = OS_Key_End; + + os_w32_gfx_state->key_from_vkey_table[VK_CAPITAL] = OS_Key_CapsLock; + os_w32_gfx_state->key_from_vkey_table[VK_NUMLOCK] = OS_Key_NumLock; + os_w32_gfx_state->key_from_vkey_table[VK_SCROLL] = OS_Key_ScrollLock; + os_w32_gfx_state->key_from_vkey_table[VK_APPS] = OS_Key_Menu; + + os_w32_gfx_state->key_from_vkey_table[VK_CONTROL] = OS_Key_Ctrl; + os_w32_gfx_state->key_from_vkey_table[VK_LCONTROL] = OS_Key_Ctrl; + os_w32_gfx_state->key_from_vkey_table[VK_RCONTROL] = OS_Key_Ctrl; + os_w32_gfx_state->key_from_vkey_table[VK_SHIFT] = OS_Key_Shift; + os_w32_gfx_state->key_from_vkey_table[VK_LSHIFT] = OS_Key_Shift; + os_w32_gfx_state->key_from_vkey_table[VK_RSHIFT] = OS_Key_Shift; + os_w32_gfx_state->key_from_vkey_table[VK_MENU] = OS_Key_Alt; + os_w32_gfx_state->key_from_vkey_table[VK_LMENU] = OS_Key_Alt; + os_w32_gfx_state->key_from_vkey_table[VK_RMENU] = OS_Key_Alt; + + os_w32_gfx_state->key_from_vkey_table[VK_DIVIDE] = OS_Key_NumSlash; + os_w32_gfx_state->key_from_vkey_table[VK_MULTIPLY] = OS_Key_NumStar; + os_w32_gfx_state->key_from_vkey_table[VK_SUBTRACT] = OS_Key_NumMinus; + os_w32_gfx_state->key_from_vkey_table[VK_ADD] = OS_Key_NumPlus; + os_w32_gfx_state->key_from_vkey_table[VK_DECIMAL] = OS_Key_NumPeriod; + + for(U32 i = 0; i < 10; i += 1) + { + os_w32_gfx_state->key_from_vkey_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); + } + + for(U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1) + { + os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); + } + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) + +internal OS_GfxInfo * +os_get_gfx_info(void) +{ + return &os_w32_gfx_state->gfx_info; +} + +//////////////////////////////// +//~ rjf: @os_hooks Clipboards (Implemented Per-OS) + +internal void +os_set_clipboard_text(String8 string) +{ + Temp scratch = scratch_begin(0, 0); + if(OpenClipboard(0)) + { + EmptyClipboard(); + String16 string16 = str16_from_8(scratch.arena, string); + HANDLE string16_copy_handle = GlobalAlloc(GMEM_MOVEABLE, (string16.size+1)*sizeof(string16.str[0])); + if(string16_copy_handle) + { + U16 *copy_buffer = (U16 *)GlobalLock(string16_copy_handle); + MemoryCopy(copy_buffer, string16.str, string16.size*sizeof(string16.str[0])); + copy_buffer[string16.size] = 0; + GlobalUnlock(string16_copy_handle); + SetClipboardData(CF_UNICODETEXT, string16_copy_handle); + } + CloseClipboard(); + } + scratch_end(scratch); +} + +internal String8 +os_get_clipboard_text(Arena *arena) +{ + String8 result = {0}; + if(IsClipboardFormatAvailable(CF_UNICODETEXT) && + OpenClipboard(0)) + { + HANDLE data_handle = GetClipboardData(CF_UNICODETEXT); + if(data_handle) + { + U16 *buffer = (U16 *)GlobalLock(data_handle); + if(buffer) + { + U64 size = cstring16_length(buffer); + String16 string16 = str16(buffer, size); + result = str8_from_16(arena, string16); + GlobalUnlock(data_handle); + } + } + CloseClipboard(); + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Windows (Implemented Per-OS) + +internal OS_Window +os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) +{ + B32 custom_border = !!(flags & OS_WindowFlag_CustomBorder); + B32 use_default_position = !!(flags & OS_WindowFlag_UseDefaultPosition); + Vec2F32 pos = rect.p0; + Vec2F32 dim = dim_2f32(rect); + + //- rjf: make hwnd + HWND hwnd = 0; + { + Temp scratch = scratch_begin(0, 0); + String16 title16 = str16_from_8(scratch.arena, title); + os_w32_new_window_custom_border = custom_border; + DWORD style_flags = WS_EX_APPWINDOW; +#if defined(R_BACKEND) && R_BACKEND != R_BACKEND_OPENGL + style_flags |= WS_EX_NOREDIRECTIONBITMAP; +#endif + hwnd = CreateWindowExW(style_flags, + L"graphical-window", + (WCHAR*)title16.str, + WS_OVERLAPPEDWINDOW | WS_SIZEBOX, + use_default_position ? CW_USEDEFAULT : (S32)pos.x, + use_default_position ? CW_USEDEFAULT : (S32)pos.y, + (S32)dim.x, + (S32)dim.y, + 0, 0, + os_w32_gfx_state->hInstance, + 0); + DragAcceptFiles(hwnd, 1); + os_w32_new_window_custom_border = 0; + scratch_end(scratch); + } + + //- rjf- make/fill window + OS_W32_Window *window = os_w32_window_alloc(); + { + window->hwnd = hwnd; + window->hdc = GetDC(hwnd); + if(w32_GetDpiForWindow_func != 0) + { + window->dpi = (F32)w32_GetDpiForWindow_func(hwnd); + } + else + { + window->dpi = 96.f; + } + } + + //- rjf: early detection of composition + { + BOOL enabled = 0; + DwmIsCompositionEnabled(&enabled); + window->custom_border_composition_enabled = enabled; + } + + //- rjf: custom border + if(flags & OS_WindowFlag_CustomBorder) + { + window->custom_border = 1; + window->paint_arena = arena_alloc(); + } + + //- rjf: convert to handle + return + OS_Window result = os_w32_handle_from_window(window); + return result; +} + +internal void +os_window_close(OS_Window handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + os_w32_window_release(window); +} + +internal void +os_window_set_title(OS_Window handle, String8 title) +{ + Temp scratch = scratch_begin(0, 0); + OS_W32_Window *window = os_w32_window_from_handle(handle); + String16 title16 = str16_from_8(scratch.arena, title); + SetWindowTextW(window->hwnd, (WCHAR *)title16.str); + scratch_end(scratch); +} + +internal void +os_window_first_paint(OS_Window window_handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(window_handle); + window->first_paint_done = 1; + ShowWindow(window->hwnd, SW_SHOW); + if(window->maximized) + { + ShowWindow(window->hwnd, SW_MAXIMIZE); + } +} + +internal void +os_window_focus(OS_Window handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + SetForegroundWindow(window->hwnd); + SetFocus(window->hwnd); +} + +internal B32 +os_window_is_focused(OS_Window handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + HWND active_hwnd = GetActiveWindow(); + return active_hwnd == window->hwnd; +} + +internal B32 +os_window_is_fullscreen(OS_Window handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); + return !(window_style & WS_OVERLAPPEDWINDOW); +} + +internal void +os_window_set_fullscreen(OS_Window handle, B32 fullscreen) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); + B32 is_fullscreen_already = os_window_is_fullscreen(handle); + if(fullscreen) + { + if(!is_fullscreen_already) + { + GetWindowPlacement(window->hwnd, &window->last_window_placement); + } + MONITORINFO monitor_info = {sizeof(monitor_info)}; + if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info)) + { + SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW); + SetWindowPos(window->hwnd, HWND_TOP, + monitor_info.rcMonitor.left, + monitor_info.rcMonitor.top, + monitor_info.rcMonitor.right - monitor_info.rcMonitor.left, + monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } + } + else + { + SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW); + SetWindowPlacement(window->hwnd, &window->last_window_placement); + SetWindowPos(window->hwnd, 0, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } +} + +internal B32 +os_window_is_maximized(OS_Window handle) +{ + B32 result = 0; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window) + { + result = !!(IsZoomed(window->hwnd)); + } + return result; +} + +internal void +os_window_set_maximized(OS_Window handle, B32 maximized) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window != 0) + { + if(window->first_paint_done) + { + switch(maximized) + { + default: + case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break; + case 1:{ShowWindow(window->hwnd, SW_MAXIMIZE);}break; + } + } + else + { + window->maximized = maximized; + } + } +} + +internal B32 +os_window_is_minimized(OS_Window handle) +{ + B32 result = 0; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window) + { + result = !!(IsIconic(window->hwnd)); + } + return result; +} + +internal void +os_window_set_minimized(OS_Window handle, B32 minimized) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window != 0 && minimized != os_window_is_minimized(handle)) + { + switch(minimized) + { + default: + case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break; + case 1:{ShowWindow(window->hwnd, SW_MINIMIZE);}break; + } + } +} + +internal void +os_window_bring_to_front(OS_Window handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window != 0) + { + BringWindowToTop(window->hwnd); + } +} + +internal void +os_window_set_monitor(OS_Window window_handle, OS_Monitor monitor) +{ + OS_W32_Window *window = os_w32_window_from_handle(window_handle); + HMONITOR hmonitor = (HMONITOR)monitor.u64[0]; + { + MONITORINFOEXW info; + info.cbSize = sizeof(MONITORINFOEXW); + if(GetMonitorInfoW(hmonitor, (MONITORINFO *)&info)) + { + Rng2F32 existing_rect = os_rect_from_window(window_handle); + Vec2F32 window_size = dim_2f32(existing_rect); + SetWindowPos(window->hwnd, HWND_TOP, + (info.rcWork.left + info.rcWork.right)/2 - window_size.x/2, + (info.rcWork.top + info.rcWork.bottom)/2 - window_size.y/2, + window_size.x, + window_size.y, 0); + } + } +} + +internal void +os_window_clear_custom_border_data(OS_Window handle) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window->custom_border) + { + arena_clear(window->paint_arena); + window->first_title_bar_client_area = window->last_title_bar_client_area = 0; + window->custom_border_title_thickness = 0; + window->custom_border_edge_thickness = 0; + } +} + +internal void +os_window_push_custom_title_bar(OS_Window handle, F32 thickness) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + window->custom_border_title_thickness = thickness; +} + +internal void +os_window_push_custom_edges(OS_Window handle, F32 thickness) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + window->custom_border_edge_thickness = thickness; +} + +internal void +os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect) +{ + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window->custom_border) + { + OS_W32_TitleBarClientArea *area = push_array(window->paint_arena, OS_W32_TitleBarClientArea, 1); + if(area != 0) + { + area->rect = rect; + SLLQueuePush(window->first_title_bar_client_area, window->last_title_bar_client_area, area); + } + } +} + +internal Rng2F32 +os_rect_from_window(OS_Window handle) +{ + Rng2F32 r = {0}; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window) + { + RECT rect = {0}; + GetWindowRect(os_w32_hwnd_from_window(window), &rect); + r = os_w32_rng2f32_from_rect(rect); + } + return r; +} + +internal Rng2F32 +os_client_rect_from_window(OS_Window handle) +{ + Rng2F32 r = {0}; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window) + { + RECT rect = {0}; + GetClientRect(os_w32_hwnd_from_window(window), &rect); + r = os_w32_rng2f32_from_rect(rect); + } + return r; +} + +internal F32 +os_dpi_from_window(OS_Window handle) +{ + F32 result = 96.f; + OS_W32_Window *window = os_w32_window_from_handle(handle); + if(window != 0) + { + result = window->dpi; + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks External Windows (Implemented Per-OS) + +internal OS_ExternalWindow +os_focused_external_window(void) +{ + HWND hwnd = GetForegroundWindow(); + OS_ExternalWindow result = {(U64)hwnd}; + return result; +} + +internal void +os_focus_external_window(OS_ExternalWindow handle) +{ + HWND hwnd = (HWND)handle.u64[0]; + if(hwnd != 0) + { + SetForegroundWindow(hwnd); + SetFocus(hwnd); + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Monitors (Implemented Per-OS) + +internal OS_MonitorArray +os_push_monitors_array(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + OS_W32_MonitorGatherBundle bundle = {arena}; + EnumDisplayMonitors(0, 0, os_w32_monitor_gather_enum_proc, (LPARAM)&bundle); + OS_MonitorArray array = {0}; + array.count = bundle.monitor_count; + array.v = push_array(arena, OS_Monitor, array.count); + { + U64 idx = 0; + for EachNode(n, OS_W32_MonitorGatherNode, bundle.first_monitor) + { + array.v[idx] = n->v; + idx += 1; + } + } + scratch_end(scratch); + return array; +} + +internal OS_Monitor +os_primary_monitor(void) +{ + POINT zero_pt = {0, 0}; + HMONITOR monitor = MonitorFromPoint(zero_pt, MONITOR_DEFAULTTOPRIMARY); + OS_Monitor result = {(U64)monitor}; + return result; +} + +internal OS_Monitor +os_monitor_from_window(OS_Window window) +{ + OS_W32_Window *w = os_w32_window_from_handle(window); + HMONITOR handle = MonitorFromWindow(w->hwnd, MONITOR_DEFAULTTOPRIMARY); + OS_Monitor result = {(U64)handle}; + return result; +} + +internal String8 +os_name_from_monitor(Arena *arena, OS_Monitor monitor) +{ + String8 result = {0}; + HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; + MONITORINFOEXW info; + info.cbSize = sizeof(MONITORINFOEXW); + if(GetMonitorInfoW(monitor_handle, (MONITORINFO *)&info)) + { + String16 result16 = str16_cstring((U16 *)info.szDevice); + result = str8_from_16(arena, result16); + } + return result; +} + +internal Vec2F32 +os_dim_from_monitor(OS_Monitor monitor) +{ + Vec2F32 result = {0}; + HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; + MONITORINFO info = {0}; + info.cbSize = sizeof(MONITORINFO); + if(GetMonitorInfoW(monitor_handle, &info)) + { + result.x = info.rcWork.right - info.rcWork.left; + result.y = info.rcWork.bottom - info.rcWork.top; + } + return result; +} + +internal F32 +os_dpi_from_monitor(OS_Monitor monitor) +{ + F32 result = 96.f; + HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; + if(w32_GetDpiForMonitor_func != 0) + { + UINT dpi_x = 0; + UINT dpi_y = 0; + HRESULT hr = w32_GetDpiForMonitor_func(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y); + result = (F32)dpi_x; + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Events (Implemented Per-OS) + +internal void +os_send_wakeup_event(void) +{ + PostThreadMessageA(os_w32_gfx_state->gfx_thread_tid, 0x401, 0, 0); +} + +internal OS_EventList +os_get_events(Arena *arena, B32 wait) +{ + os_w32_event_arena = arena; + MemoryZeroStruct(&os_w32_event_list); + MSG msg = {0}; + if(!wait || GetMessage(&msg, 0, 0, 0)) + { + B32 first_wait = wait; + for(;first_wait || PeekMessage(&msg, 0, 0, 0, PM_REMOVE); first_wait = 0) + { + DispatchMessage(&msg); + TranslateMessage(&msg); + if(msg.message == WM_QUIT) + { + os_w32_push_event(OS_EventKind_WindowClose, 0); + } + } + } + return os_w32_event_list; +} + +internal OS_Modifiers +os_get_modifiers(void) +{ + OS_Modifiers modifiers = 0; + if(GetKeyState(VK_CONTROL) & 0x8000) + { + modifiers |= OS_Modifier_Ctrl; + } + if(GetKeyState(VK_SHIFT) & 0x8000) + { + modifiers |= OS_Modifier_Shift; + } + if(GetKeyState(VK_MENU) & 0x8000) + { + modifiers |= OS_Modifier_Alt; + } + return modifiers; +} + +internal B32 +os_key_is_down(OS_Key key) +{ + B32 down = 0; + WPARAM vkey = os_w32_vkey_from_os_key(key); + if(GetKeyState(vkey) & 0x8000) + { + down = 1; + } + return down; +} + +internal Vec2F32 +os_mouse_from_window(OS_Window handle) +{ + ProfBeginFunction(); + Vec2F32 v = {0}; + POINT p; + if(GetCursorPos(&p)) + { + OS_W32_Window *window = os_w32_window_from_handle(handle); + ScreenToClient(window->hwnd, &p); + v.x = (F32)p.x; + v.y = (F32)p.y; + } + ProfEnd(); + return v; +} + +//////////////////////////////// +//~ rjf: @os_hooks Cursors (Implemented Per-OS) + +internal void +os_set_cursor(OS_Cursor cursor) +{ + B32 valid_cursor = 1; + HCURSOR hcursor = 0; + switch(cursor) + { + default: {valid_cursor = 0;}break; +#define Win32CursorXList(X) \ +X(Pointer, IDC_ARROW) \ +X(IBar, IDC_IBEAM) \ +X(LeftRight, IDC_SIZEWE) \ +X(UpDown, IDC_SIZENS) \ +X(DownRight, IDC_SIZENWSE) \ +X(UpRight, IDC_SIZENESW) \ +X(UpDownLeftRight, IDC_SIZEALL) \ +X(HandPoint, IDC_HAND)\ +X(Disabled, IDC_NO) +#define CursorCase(E,R) case OS_Cursor_##E:{ \ +local_persist HCURSOR curs = 0; \ +if (curs == 0){ curs = LoadCursor(NULL, R); } \ +hcursor = curs; }break; + Win32CursorXList(CursorCase) +#undef CursorCase +#undef Win32CursorXList + } + if(valid_cursor && !os_w32_resizing) + { + if(hcursor != os_w32_gfx_state->hCursor) + { + PostMessage(0, WM_SETCURSOR, 0, 0); + POINT p = {0}; + GetCursorPos(&p); + SetCursorPos(p.x, p.y); + } + os_w32_gfx_state->hCursor = hcursor; + } +} + +//////////////////////////////// +//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) + +internal void +os_graphical_message(B32 error, String8 title, String8 message) +{ + Temp scratch = scratch_begin(0, 0); + String16 title16 = str16_from_8(scratch.arena, title); + String16 message16 = str16_from_8(scratch.arena, message); + MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR)); + scratch_end(scratch); +} + +internal String8 +os_graphical_pick_file(Arena *arena, String8 initial_path) +{ + String8 result = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + U64 buffer_size = 4096; + U16 *buffer = push_array(scratch.arena, U16, buffer_size); + OPENFILENAMEW params = {sizeof(params)}; + { + params.lpstrFile = (WCHAR *)buffer; + params.nMaxFile = buffer_size; + params.lpstrInitialDir = (WCHAR *)str16_from_8(scratch.arena, initial_path).str; + } + if(GetOpenFileNameW(¶ms)) + { + result = str8_from_16(arena, str16_cstring((U16 *)buffer)); + } + scratch_end(scratch); + } + return result; +} + +//////////////////////////////// +//~ rjf: @os_hooks Shell Operations + +internal void +os_show_in_filesystem_ui(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + String8 path_copy = push_str8_copy(scratch.arena, path); + for(U64 idx = 0; idx < path_copy.size; idx += 1) + { + if(path_copy.str[idx] == '/') + { + path_copy.str[idx] = '\\'; + } + } + String16 path16 = str16_from_8(scratch.arena, path_copy); + SFGAOF flags = 0; + PIDLIST_ABSOLUTE list = 0; + if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags))) + { + HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0); + CoTaskMemFree(list); + (void)hr; + } + scratch_end(scratch); +} + +internal void +os_open_in_browser(String8 url) +{ + Temp scratch = scratch_begin(0, 0); + String16 url16 = str16_from_8(scratch.arena, url); + ShellExecuteW(0, L"open", (WCHAR *)url16.str, 0, 0, SW_SHOWNORMAL); + scratch_end(scratch); +} diff --git a/src/os/gfx/win32/os_gfx_win32.h b/src/win32/window_manager/win32_window_manager.h similarity index 94% rename from src/os/gfx/win32/os_gfx_win32.h rename to src/win32/window_manager/win32_window_manager.h index 8dc95691..90548121 100644 --- a/src/os/gfx/win32/os_gfx_win32.h +++ b/src/win32/window_manager/win32_window_manager.h @@ -1,123 +1,123 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_GFX_WIN32_H -#define OS_GFX_WIN32_H - -//////////////////////////////// -//~ rjf: Includes / Libraries - -#include -#include -#include -#pragma comment(lib, "gdi32") -#pragma comment(lib, "dwmapi") -#pragma comment(lib, "UxTheme") -#pragma comment(lib, "comdlg32") -#ifndef WM_NCUAHDRAWCAPTION -#define WM_NCUAHDRAWCAPTION (0x00AE) -#endif -#ifndef WM_NCUAHDRAWFRAME -#define WM_NCUAHDRAWFRAME (0x00AF) -#endif - -//////////////////////////////// -//~ rjf: Windows - -typedef struct OS_W32_TitleBarClientArea OS_W32_TitleBarClientArea; -struct OS_W32_TitleBarClientArea -{ - OS_W32_TitleBarClientArea *next; - Rng2F32 rect; -}; - -typedef struct OS_W32_Window OS_W32_Window; -struct OS_W32_Window -{ - OS_W32_Window *next; - OS_W32_Window *prev; - HWND hwnd; - HDC hdc; - WINDOWPLACEMENT last_window_placement; - F32 dpi; - B32 first_paint_done; - B32 maximized; - B32 custom_border; - F32 custom_border_title_thickness; - F32 custom_border_edge_thickness; - B32 custom_border_composition_enabled; - Arena *paint_arena; - OS_W32_TitleBarClientArea *first_title_bar_client_area; - OS_W32_TitleBarClientArea *last_title_bar_client_area; -}; - -//////////////////////////////// -//~ rjf: Monitor Gathering Bundle - -typedef struct OS_W32_MonitorGatherNode OS_W32_MonitorGatherNode; -struct OS_W32_MonitorGatherNode -{ - OS_W32_MonitorGatherNode *next; - OS_Monitor v; -}; - -typedef struct OS_W32_MonitorGatherBundle OS_W32_MonitorGatherBundle; -struct OS_W32_MonitorGatherBundle -{ - Arena *arena; - OS_W32_MonitorGatherNode *first_monitor; - OS_W32_MonitorGatherNode *last_monitor; - U64 monitor_count; -}; - -//////////////////////////////// -//~ rjf: Global State - -typedef struct OS_W32_GfxState OS_W32_GfxState; -struct OS_W32_GfxState -{ - Arena *arena; - U32 gfx_thread_tid; - HINSTANCE hInstance; - HCURSOR hCursor; - OS_GfxInfo gfx_info; - OS_W32_Window *first_window; - OS_W32_Window *last_window; - OS_W32_Window *free_window; - OS_Key key_from_vkey_table[256]; -}; - -//////////////////////////////// -//~ rjf: Globals - -global OS_W32_GfxState *os_w32_gfx_state = 0; -global OS_EventList os_w32_event_list = {0}; -global Arena *os_w32_event_arena = 0; -global B32 os_w32_resizing = 0; -global B32 os_w32_new_window_custom_border = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal Rng2F32 os_w32_rng2f32_from_rect(RECT rect); - -//////////////////////////////// -//~ rjf: Windows - -internal OS_Window os_w32_handle_from_window(OS_W32_Window *window); -internal OS_W32_Window * os_w32_window_from_handle(OS_Window window); -internal OS_W32_Window * os_w32_window_from_hwnd(HWND hwnd); -internal HWND os_w32_hwnd_from_window(OS_W32_Window *window); -internal OS_W32_Window * os_w32_window_alloc(void); -internal void os_w32_window_release(OS_W32_Window *window); -internal OS_Event * os_w32_push_event(OS_EventKind kind, OS_W32_Window *window); -internal OS_Key os_w32_os_key_from_vkey(WPARAM vkey); -internal WPARAM os_w32_vkey_from_os_key(OS_Key key); -internal LRESULT os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - -//////////////////////////////// -//~ rjf: Monitors - -internal BOOL os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr); - -#endif // OS_GFX_WIN32_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef WIN32_WINDOW_MANAGER_H +#define WIN32_WINDOW_MANAGER_H + +//////////////////////////////// +//~ rjf: Includes / Libraries + +#include +#include +#include +#pragma comment(lib, "gdi32") +#pragma comment(lib, "dwmapi") +#pragma comment(lib, "UxTheme") +#pragma comment(lib, "comdlg32") +#ifndef WM_NCUAHDRAWCAPTION +#define WM_NCUAHDRAWCAPTION (0x00AE) +#endif +#ifndef WM_NCUAHDRAWFRAME +#define WM_NCUAHDRAWFRAME (0x00AF) +#endif + +//////////////////////////////// +//~ rjf: Windows + +typedef struct OS_W32_TitleBarClientArea OS_W32_TitleBarClientArea; +struct OS_W32_TitleBarClientArea +{ + OS_W32_TitleBarClientArea *next; + Rng2F32 rect; +}; + +typedef struct OS_W32_Window OS_W32_Window; +struct OS_W32_Window +{ + OS_W32_Window *next; + OS_W32_Window *prev; + HWND hwnd; + HDC hdc; + WINDOWPLACEMENT last_window_placement; + F32 dpi; + B32 first_paint_done; + B32 maximized; + B32 custom_border; + F32 custom_border_title_thickness; + F32 custom_border_edge_thickness; + B32 custom_border_composition_enabled; + Arena *paint_arena; + OS_W32_TitleBarClientArea *first_title_bar_client_area; + OS_W32_TitleBarClientArea *last_title_bar_client_area; +}; + +//////////////////////////////// +//~ rjf: Monitor Gathering Bundle + +typedef struct OS_W32_MonitorGatherNode OS_W32_MonitorGatherNode; +struct OS_W32_MonitorGatherNode +{ + OS_W32_MonitorGatherNode *next; + OS_Monitor v; +}; + +typedef struct OS_W32_MonitorGatherBundle OS_W32_MonitorGatherBundle; +struct OS_W32_MonitorGatherBundle +{ + Arena *arena; + OS_W32_MonitorGatherNode *first_monitor; + OS_W32_MonitorGatherNode *last_monitor; + U64 monitor_count; +}; + +//////////////////////////////// +//~ rjf: Global State + +typedef struct OS_W32_GfxState OS_W32_GfxState; +struct OS_W32_GfxState +{ + Arena *arena; + U32 gfx_thread_tid; + HINSTANCE hInstance; + HCURSOR hCursor; + OS_GfxInfo gfx_info; + OS_W32_Window *first_window; + OS_W32_Window *last_window; + OS_W32_Window *free_window; + OS_Key key_from_vkey_table[256]; +}; + +//////////////////////////////// +//~ rjf: Globals + +global OS_W32_GfxState *os_w32_gfx_state = 0; +global OS_EventList os_w32_event_list = {0}; +global Arena *os_w32_event_arena = 0; +global B32 os_w32_resizing = 0; +global B32 os_w32_new_window_custom_border = 0; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal Rng2F32 os_w32_rng2f32_from_rect(RECT rect); + +//////////////////////////////// +//~ rjf: Windows + +internal OS_Window os_w32_handle_from_window(OS_W32_Window *window); +internal OS_W32_Window * os_w32_window_from_handle(OS_Window window); +internal OS_W32_Window * os_w32_window_from_hwnd(HWND hwnd); +internal HWND os_w32_hwnd_from_window(OS_W32_Window *window); +internal OS_W32_Window * os_w32_window_alloc(void); +internal void os_w32_window_release(OS_W32_Window *window); +internal OS_Event * os_w32_push_event(OS_EventKind kind, OS_W32_Window *window); +internal OS_Key os_w32_os_key_from_vkey(WPARAM vkey); +internal WPARAM os_w32_vkey_from_os_key(OS_Key key); +internal LRESULT os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +//////////////////////////////// +//~ rjf: Monitors + +internal BOOL os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr); + +#endif // WIN32_WINDOW_MANAGER_H diff --git a/src/os/gfx/generated/os_gfx.meta.c b/src/window_manager/generated/window_manager.meta.c similarity index 95% rename from src/os/gfx/generated/os_gfx.meta.c rename to src/window_manager/generated/window_manager.meta.c index b44fa317..a3f50334 100644 --- a/src/os/gfx/generated/os_gfx.meta.c +++ b/src/window_manager/generated/window_manager.meta.c @@ -1,302 +1,302 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 os_g_key_display_string_table[143] = -{ -str8_lit_comp("Invalid Key"), -str8_lit_comp("Escape"), -str8_lit_comp("F1"), -str8_lit_comp("F2"), -str8_lit_comp("F3"), -str8_lit_comp("F4"), -str8_lit_comp("F5"), -str8_lit_comp("F6"), -str8_lit_comp("F7"), -str8_lit_comp("F8"), -str8_lit_comp("F9"), -str8_lit_comp("F10"), -str8_lit_comp("F11"), -str8_lit_comp("F12"), -str8_lit_comp("F13"), -str8_lit_comp("F14"), -str8_lit_comp("F15"), -str8_lit_comp("F16"), -str8_lit_comp("F17"), -str8_lit_comp("F18"), -str8_lit_comp("F19"), -str8_lit_comp("F20"), -str8_lit_comp("F21"), -str8_lit_comp("F22"), -str8_lit_comp("F23"), -str8_lit_comp("F24"), -str8_lit_comp("Tick"), -str8_lit_comp("0"), -str8_lit_comp("1"), -str8_lit_comp("2"), -str8_lit_comp("3"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("6"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("9"), -str8_lit_comp("Minus"), -str8_lit_comp("Equal"), -str8_lit_comp("Backspace"), -str8_lit_comp("Tab"), -str8_lit_comp("Q"), -str8_lit_comp("W"), -str8_lit_comp("E"), -str8_lit_comp("R"), -str8_lit_comp("T"), -str8_lit_comp("Y"), -str8_lit_comp("U"), -str8_lit_comp("I"), -str8_lit_comp("O"), -str8_lit_comp("P"), -str8_lit_comp("Left Bracket"), -str8_lit_comp("Right Bracket"), -str8_lit_comp("Back Slash"), -str8_lit_comp("Caps Lock"), -str8_lit_comp("A"), -str8_lit_comp("S"), -str8_lit_comp("D"), -str8_lit_comp("F"), -str8_lit_comp("G"), -str8_lit_comp("H"), -str8_lit_comp("J"), -str8_lit_comp("K"), -str8_lit_comp("L"), -str8_lit_comp("Semicolon"), -str8_lit_comp("Quote"), -str8_lit_comp("Return"), -str8_lit_comp("Shift"), -str8_lit_comp("Z"), -str8_lit_comp("X"), -str8_lit_comp("C"), -str8_lit_comp("V"), -str8_lit_comp("B"), -str8_lit_comp("N"), -str8_lit_comp("M"), -str8_lit_comp("Comma"), -str8_lit_comp("Period"), -str8_lit_comp("Slash"), -str8_lit_comp("Ctrl"), -str8_lit_comp("Alt"), -str8_lit_comp("Space"), -str8_lit_comp("Menu"), -str8_lit_comp("Scroll Lock"), -str8_lit_comp("Pause"), -str8_lit_comp("Insert"), -str8_lit_comp("Home"), -str8_lit_comp("Page Up"), -str8_lit_comp("Delete"), -str8_lit_comp("End"), -str8_lit_comp("Page Down"), -str8_lit_comp("Up"), -str8_lit_comp("Left"), -str8_lit_comp("Down"), -str8_lit_comp("Right"), -str8_lit_comp("Ex0"), -str8_lit_comp("Ex1"), -str8_lit_comp("Ex2"), -str8_lit_comp("Ex3"), -str8_lit_comp("Ex4"), -str8_lit_comp("Ex5"), -str8_lit_comp("Ex6"), -str8_lit_comp("Ex7"), -str8_lit_comp("Ex8"), -str8_lit_comp("Ex9"), -str8_lit_comp("Ex10"), -str8_lit_comp("Ex11"), -str8_lit_comp("Ex12"), -str8_lit_comp("Ex13"), -str8_lit_comp("Ex14"), -str8_lit_comp("Ex15"), -str8_lit_comp("Ex16"), -str8_lit_comp("Ex17"), -str8_lit_comp("Ex18"), -str8_lit_comp("Ex19"), -str8_lit_comp("Ex20"), -str8_lit_comp("Ex21"), -str8_lit_comp("Ex22"), -str8_lit_comp("Ex23"), -str8_lit_comp("Ex24"), -str8_lit_comp("Ex25"), -str8_lit_comp("Ex26"), -str8_lit_comp("Ex27"), -str8_lit_comp("Ex28"), -str8_lit_comp("Ex29"), -str8_lit_comp("Num Lock"), -str8_lit_comp("Numpad Slash"), -str8_lit_comp("Numpad Star"), -str8_lit_comp("Numpad Minus"), -str8_lit_comp("Numpad Plus"), -str8_lit_comp("Numpad Period"), -str8_lit_comp("Numpad 0"), -str8_lit_comp("Numpad 1"), -str8_lit_comp("Numpad 2"), -str8_lit_comp("Numpad 3"), -str8_lit_comp("Numpad 4"), -str8_lit_comp("Numpad 5"), -str8_lit_comp("Numpad 6"), -str8_lit_comp("Numpad 7"), -str8_lit_comp("Numpad 8"), -str8_lit_comp("Numpad 9"), -str8_lit_comp("Left Mouse Button"), -str8_lit_comp("Middle Mouse Button"), -str8_lit_comp("Right Mouse Button"), -}; - -String8 os_g_key_cfg_string_table[143] = -{ -str8_lit_comp("null"), -str8_lit_comp("esc"), -str8_lit_comp("f1"), -str8_lit_comp("f2"), -str8_lit_comp("f3"), -str8_lit_comp("f4"), -str8_lit_comp("f5"), -str8_lit_comp("f6"), -str8_lit_comp("f7"), -str8_lit_comp("f8"), -str8_lit_comp("f9"), -str8_lit_comp("f10"), -str8_lit_comp("f11"), -str8_lit_comp("f12"), -str8_lit_comp("f13"), -str8_lit_comp("f14"), -str8_lit_comp("f15"), -str8_lit_comp("f16"), -str8_lit_comp("f17"), -str8_lit_comp("f18"), -str8_lit_comp("f19"), -str8_lit_comp("f20"), -str8_lit_comp("f21"), -str8_lit_comp("f22"), -str8_lit_comp("f23"), -str8_lit_comp("f24"), -str8_lit_comp("tick"), -str8_lit_comp("0"), -str8_lit_comp("1"), -str8_lit_comp("2"), -str8_lit_comp("3"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("6"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("9"), -str8_lit_comp("minus"), -str8_lit_comp("equal"), -str8_lit_comp("backspace"), -str8_lit_comp("tab"), -str8_lit_comp("q"), -str8_lit_comp("w"), -str8_lit_comp("e"), -str8_lit_comp("r"), -str8_lit_comp("t"), -str8_lit_comp("y"), -str8_lit_comp("u"), -str8_lit_comp("i"), -str8_lit_comp("o"), -str8_lit_comp("p"), -str8_lit_comp("left_bracket"), -str8_lit_comp("right_bracket"), -str8_lit_comp("backslash"), -str8_lit_comp("caps_lock"), -str8_lit_comp("a"), -str8_lit_comp("s"), -str8_lit_comp("d"), -str8_lit_comp("f"), -str8_lit_comp("g"), -str8_lit_comp("h"), -str8_lit_comp("j"), -str8_lit_comp("k"), -str8_lit_comp("l"), -str8_lit_comp("semicolon"), -str8_lit_comp("quote"), -str8_lit_comp("return"), -str8_lit_comp("shift"), -str8_lit_comp("z"), -str8_lit_comp("x"), -str8_lit_comp("c"), -str8_lit_comp("v"), -str8_lit_comp("b"), -str8_lit_comp("n"), -str8_lit_comp("m"), -str8_lit_comp("comma"), -str8_lit_comp("period"), -str8_lit_comp("slash"), -str8_lit_comp("ctrl"), -str8_lit_comp("alt"), -str8_lit_comp("space"), -str8_lit_comp("menu"), -str8_lit_comp("scroll_lock"), -str8_lit_comp("pause"), -str8_lit_comp("insert"), -str8_lit_comp("home"), -str8_lit_comp("page_up"), -str8_lit_comp("delete"), -str8_lit_comp("end"), -str8_lit_comp("page_down"), -str8_lit_comp("up"), -str8_lit_comp("left"), -str8_lit_comp("down"), -str8_lit_comp("right"), -str8_lit_comp("ex0"), -str8_lit_comp("ex1"), -str8_lit_comp("ex2"), -str8_lit_comp("ex3"), -str8_lit_comp("ex4"), -str8_lit_comp("ex5"), -str8_lit_comp("ex6"), -str8_lit_comp("ex7"), -str8_lit_comp("ex8"), -str8_lit_comp("ex9"), -str8_lit_comp("ex10"), -str8_lit_comp("ex11"), -str8_lit_comp("ex12"), -str8_lit_comp("ex13"), -str8_lit_comp("ex14"), -str8_lit_comp("ex15"), -str8_lit_comp("ex16"), -str8_lit_comp("ex17"), -str8_lit_comp("ex18"), -str8_lit_comp("ex19"), -str8_lit_comp("ex20"), -str8_lit_comp("ex21"), -str8_lit_comp("ex22"), -str8_lit_comp("ex23"), -str8_lit_comp("ex24"), -str8_lit_comp("ex25"), -str8_lit_comp("ex26"), -str8_lit_comp("ex27"), -str8_lit_comp("ex28"), -str8_lit_comp("ex29"), -str8_lit_comp("num_lock"), -str8_lit_comp("numpad_slash"), -str8_lit_comp("numpad_star"), -str8_lit_comp("numpad_minus"), -str8_lit_comp("numpad_plus"), -str8_lit_comp("numpad_period"), -str8_lit_comp("numpad_0"), -str8_lit_comp("numpad_1"), -str8_lit_comp("numpad_2"), -str8_lit_comp("numpad_3"), -str8_lit_comp("numpad_4"), -str8_lit_comp("numpad_5"), -str8_lit_comp("numpad_6"), -str8_lit_comp("numpad_7"), -str8_lit_comp("numpad_8"), -str8_lit_comp("numpad_9"), -str8_lit_comp("left_mouse"), -str8_lit_comp("middle_mouse"), -str8_lit_comp("right_mouse"), -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 os_g_key_display_string_table[143] = +{ +str8_lit_comp("Invalid Key"), +str8_lit_comp("Escape"), +str8_lit_comp("F1"), +str8_lit_comp("F2"), +str8_lit_comp("F3"), +str8_lit_comp("F4"), +str8_lit_comp("F5"), +str8_lit_comp("F6"), +str8_lit_comp("F7"), +str8_lit_comp("F8"), +str8_lit_comp("F9"), +str8_lit_comp("F10"), +str8_lit_comp("F11"), +str8_lit_comp("F12"), +str8_lit_comp("F13"), +str8_lit_comp("F14"), +str8_lit_comp("F15"), +str8_lit_comp("F16"), +str8_lit_comp("F17"), +str8_lit_comp("F18"), +str8_lit_comp("F19"), +str8_lit_comp("F20"), +str8_lit_comp("F21"), +str8_lit_comp("F22"), +str8_lit_comp("F23"), +str8_lit_comp("F24"), +str8_lit_comp("Tick"), +str8_lit_comp("0"), +str8_lit_comp("1"), +str8_lit_comp("2"), +str8_lit_comp("3"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("6"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("9"), +str8_lit_comp("Minus"), +str8_lit_comp("Equal"), +str8_lit_comp("Backspace"), +str8_lit_comp("Tab"), +str8_lit_comp("Q"), +str8_lit_comp("W"), +str8_lit_comp("E"), +str8_lit_comp("R"), +str8_lit_comp("T"), +str8_lit_comp("Y"), +str8_lit_comp("U"), +str8_lit_comp("I"), +str8_lit_comp("O"), +str8_lit_comp("P"), +str8_lit_comp("Left Bracket"), +str8_lit_comp("Right Bracket"), +str8_lit_comp("Back Slash"), +str8_lit_comp("Caps Lock"), +str8_lit_comp("A"), +str8_lit_comp("S"), +str8_lit_comp("D"), +str8_lit_comp("F"), +str8_lit_comp("G"), +str8_lit_comp("H"), +str8_lit_comp("J"), +str8_lit_comp("K"), +str8_lit_comp("L"), +str8_lit_comp("Semicolon"), +str8_lit_comp("Quote"), +str8_lit_comp("Return"), +str8_lit_comp("Shift"), +str8_lit_comp("Z"), +str8_lit_comp("X"), +str8_lit_comp("C"), +str8_lit_comp("V"), +str8_lit_comp("B"), +str8_lit_comp("N"), +str8_lit_comp("M"), +str8_lit_comp("Comma"), +str8_lit_comp("Period"), +str8_lit_comp("Slash"), +str8_lit_comp("Ctrl"), +str8_lit_comp("Alt"), +str8_lit_comp("Space"), +str8_lit_comp("Menu"), +str8_lit_comp("Scroll Lock"), +str8_lit_comp("Pause"), +str8_lit_comp("Insert"), +str8_lit_comp("Home"), +str8_lit_comp("Page Up"), +str8_lit_comp("Delete"), +str8_lit_comp("End"), +str8_lit_comp("Page Down"), +str8_lit_comp("Up"), +str8_lit_comp("Left"), +str8_lit_comp("Down"), +str8_lit_comp("Right"), +str8_lit_comp("Ex0"), +str8_lit_comp("Ex1"), +str8_lit_comp("Ex2"), +str8_lit_comp("Ex3"), +str8_lit_comp("Ex4"), +str8_lit_comp("Ex5"), +str8_lit_comp("Ex6"), +str8_lit_comp("Ex7"), +str8_lit_comp("Ex8"), +str8_lit_comp("Ex9"), +str8_lit_comp("Ex10"), +str8_lit_comp("Ex11"), +str8_lit_comp("Ex12"), +str8_lit_comp("Ex13"), +str8_lit_comp("Ex14"), +str8_lit_comp("Ex15"), +str8_lit_comp("Ex16"), +str8_lit_comp("Ex17"), +str8_lit_comp("Ex18"), +str8_lit_comp("Ex19"), +str8_lit_comp("Ex20"), +str8_lit_comp("Ex21"), +str8_lit_comp("Ex22"), +str8_lit_comp("Ex23"), +str8_lit_comp("Ex24"), +str8_lit_comp("Ex25"), +str8_lit_comp("Ex26"), +str8_lit_comp("Ex27"), +str8_lit_comp("Ex28"), +str8_lit_comp("Ex29"), +str8_lit_comp("Num Lock"), +str8_lit_comp("Numpad Slash"), +str8_lit_comp("Numpad Star"), +str8_lit_comp("Numpad Minus"), +str8_lit_comp("Numpad Plus"), +str8_lit_comp("Numpad Period"), +str8_lit_comp("Numpad 0"), +str8_lit_comp("Numpad 1"), +str8_lit_comp("Numpad 2"), +str8_lit_comp("Numpad 3"), +str8_lit_comp("Numpad 4"), +str8_lit_comp("Numpad 5"), +str8_lit_comp("Numpad 6"), +str8_lit_comp("Numpad 7"), +str8_lit_comp("Numpad 8"), +str8_lit_comp("Numpad 9"), +str8_lit_comp("Left Mouse Button"), +str8_lit_comp("Middle Mouse Button"), +str8_lit_comp("Right Mouse Button"), +}; + +String8 os_g_key_cfg_string_table[143] = +{ +str8_lit_comp("null"), +str8_lit_comp("esc"), +str8_lit_comp("f1"), +str8_lit_comp("f2"), +str8_lit_comp("f3"), +str8_lit_comp("f4"), +str8_lit_comp("f5"), +str8_lit_comp("f6"), +str8_lit_comp("f7"), +str8_lit_comp("f8"), +str8_lit_comp("f9"), +str8_lit_comp("f10"), +str8_lit_comp("f11"), +str8_lit_comp("f12"), +str8_lit_comp("f13"), +str8_lit_comp("f14"), +str8_lit_comp("f15"), +str8_lit_comp("f16"), +str8_lit_comp("f17"), +str8_lit_comp("f18"), +str8_lit_comp("f19"), +str8_lit_comp("f20"), +str8_lit_comp("f21"), +str8_lit_comp("f22"), +str8_lit_comp("f23"), +str8_lit_comp("f24"), +str8_lit_comp("tick"), +str8_lit_comp("0"), +str8_lit_comp("1"), +str8_lit_comp("2"), +str8_lit_comp("3"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("6"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("9"), +str8_lit_comp("minus"), +str8_lit_comp("equal"), +str8_lit_comp("backspace"), +str8_lit_comp("tab"), +str8_lit_comp("q"), +str8_lit_comp("w"), +str8_lit_comp("e"), +str8_lit_comp("r"), +str8_lit_comp("t"), +str8_lit_comp("y"), +str8_lit_comp("u"), +str8_lit_comp("i"), +str8_lit_comp("o"), +str8_lit_comp("p"), +str8_lit_comp("left_bracket"), +str8_lit_comp("right_bracket"), +str8_lit_comp("backslash"), +str8_lit_comp("caps_lock"), +str8_lit_comp("a"), +str8_lit_comp("s"), +str8_lit_comp("d"), +str8_lit_comp("f"), +str8_lit_comp("g"), +str8_lit_comp("h"), +str8_lit_comp("j"), +str8_lit_comp("k"), +str8_lit_comp("l"), +str8_lit_comp("semicolon"), +str8_lit_comp("quote"), +str8_lit_comp("return"), +str8_lit_comp("shift"), +str8_lit_comp("z"), +str8_lit_comp("x"), +str8_lit_comp("c"), +str8_lit_comp("v"), +str8_lit_comp("b"), +str8_lit_comp("n"), +str8_lit_comp("m"), +str8_lit_comp("comma"), +str8_lit_comp("period"), +str8_lit_comp("slash"), +str8_lit_comp("ctrl"), +str8_lit_comp("alt"), +str8_lit_comp("space"), +str8_lit_comp("menu"), +str8_lit_comp("scroll_lock"), +str8_lit_comp("pause"), +str8_lit_comp("insert"), +str8_lit_comp("home"), +str8_lit_comp("page_up"), +str8_lit_comp("delete"), +str8_lit_comp("end"), +str8_lit_comp("page_down"), +str8_lit_comp("up"), +str8_lit_comp("left"), +str8_lit_comp("down"), +str8_lit_comp("right"), +str8_lit_comp("ex0"), +str8_lit_comp("ex1"), +str8_lit_comp("ex2"), +str8_lit_comp("ex3"), +str8_lit_comp("ex4"), +str8_lit_comp("ex5"), +str8_lit_comp("ex6"), +str8_lit_comp("ex7"), +str8_lit_comp("ex8"), +str8_lit_comp("ex9"), +str8_lit_comp("ex10"), +str8_lit_comp("ex11"), +str8_lit_comp("ex12"), +str8_lit_comp("ex13"), +str8_lit_comp("ex14"), +str8_lit_comp("ex15"), +str8_lit_comp("ex16"), +str8_lit_comp("ex17"), +str8_lit_comp("ex18"), +str8_lit_comp("ex19"), +str8_lit_comp("ex20"), +str8_lit_comp("ex21"), +str8_lit_comp("ex22"), +str8_lit_comp("ex23"), +str8_lit_comp("ex24"), +str8_lit_comp("ex25"), +str8_lit_comp("ex26"), +str8_lit_comp("ex27"), +str8_lit_comp("ex28"), +str8_lit_comp("ex29"), +str8_lit_comp("num_lock"), +str8_lit_comp("numpad_slash"), +str8_lit_comp("numpad_star"), +str8_lit_comp("numpad_minus"), +str8_lit_comp("numpad_plus"), +str8_lit_comp("numpad_period"), +str8_lit_comp("numpad_0"), +str8_lit_comp("numpad_1"), +str8_lit_comp("numpad_2"), +str8_lit_comp("numpad_3"), +str8_lit_comp("numpad_4"), +str8_lit_comp("numpad_5"), +str8_lit_comp("numpad_6"), +str8_lit_comp("numpad_7"), +str8_lit_comp("numpad_8"), +str8_lit_comp("numpad_9"), +str8_lit_comp("left_mouse"), +str8_lit_comp("middle_mouse"), +str8_lit_comp("right_mouse"), +}; + +C_LINKAGE_END + diff --git a/src/os/gfx/generated/os_gfx.meta.h b/src/window_manager/generated/window_manager.meta.h similarity index 90% rename from src/os/gfx/generated/os_gfx.meta.h rename to src/window_manager/generated/window_manager.meta.h index 72ccea0c..b81d453f 100644 --- a/src/os/gfx/generated/os_gfx.meta.h +++ b/src/window_manager/generated/window_manager.meta.h @@ -1,163 +1,163 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef OS_GFX_META_H -#define OS_GFX_META_H - -typedef enum OS_Key -{ -OS_Key_Null, -OS_Key_Esc, -OS_Key_F1, -OS_Key_F2, -OS_Key_F3, -OS_Key_F4, -OS_Key_F5, -OS_Key_F6, -OS_Key_F7, -OS_Key_F8, -OS_Key_F9, -OS_Key_F10, -OS_Key_F11, -OS_Key_F12, -OS_Key_F13, -OS_Key_F14, -OS_Key_F15, -OS_Key_F16, -OS_Key_F17, -OS_Key_F18, -OS_Key_F19, -OS_Key_F20, -OS_Key_F21, -OS_Key_F22, -OS_Key_F23, -OS_Key_F24, -OS_Key_Tick, -OS_Key_0, -OS_Key_1, -OS_Key_2, -OS_Key_3, -OS_Key_4, -OS_Key_5, -OS_Key_6, -OS_Key_7, -OS_Key_8, -OS_Key_9, -OS_Key_Minus, -OS_Key_Equal, -OS_Key_Backspace, -OS_Key_Tab, -OS_Key_Q, -OS_Key_W, -OS_Key_E, -OS_Key_R, -OS_Key_T, -OS_Key_Y, -OS_Key_U, -OS_Key_I, -OS_Key_O, -OS_Key_P, -OS_Key_LeftBracket, -OS_Key_RightBracket, -OS_Key_BackSlash, -OS_Key_CapsLock, -OS_Key_A, -OS_Key_S, -OS_Key_D, -OS_Key_F, -OS_Key_G, -OS_Key_H, -OS_Key_J, -OS_Key_K, -OS_Key_L, -OS_Key_Semicolon, -OS_Key_Quote, -OS_Key_Return, -OS_Key_Shift, -OS_Key_Z, -OS_Key_X, -OS_Key_C, -OS_Key_V, -OS_Key_B, -OS_Key_N, -OS_Key_M, -OS_Key_Comma, -OS_Key_Period, -OS_Key_Slash, -OS_Key_Ctrl, -OS_Key_Alt, -OS_Key_Space, -OS_Key_Menu, -OS_Key_ScrollLock, -OS_Key_Pause, -OS_Key_Insert, -OS_Key_Home, -OS_Key_PageUp, -OS_Key_Delete, -OS_Key_End, -OS_Key_PageDown, -OS_Key_Up, -OS_Key_Left, -OS_Key_Down, -OS_Key_Right, -OS_Key_Ex0, -OS_Key_Ex1, -OS_Key_Ex2, -OS_Key_Ex3, -OS_Key_Ex4, -OS_Key_Ex5, -OS_Key_Ex6, -OS_Key_Ex7, -OS_Key_Ex8, -OS_Key_Ex9, -OS_Key_Ex10, -OS_Key_Ex11, -OS_Key_Ex12, -OS_Key_Ex13, -OS_Key_Ex14, -OS_Key_Ex15, -OS_Key_Ex16, -OS_Key_Ex17, -OS_Key_Ex18, -OS_Key_Ex19, -OS_Key_Ex20, -OS_Key_Ex21, -OS_Key_Ex22, -OS_Key_Ex23, -OS_Key_Ex24, -OS_Key_Ex25, -OS_Key_Ex26, -OS_Key_Ex27, -OS_Key_Ex28, -OS_Key_Ex29, -OS_Key_NumLock, -OS_Key_NumSlash, -OS_Key_NumStar, -OS_Key_NumMinus, -OS_Key_NumPlus, -OS_Key_NumPeriod, -OS_Key_Num0, -OS_Key_Num1, -OS_Key_Num2, -OS_Key_Num3, -OS_Key_Num4, -OS_Key_Num5, -OS_Key_Num6, -OS_Key_Num7, -OS_Key_Num8, -OS_Key_Num9, -OS_Key_LeftMouseButton, -OS_Key_MiddleMouseButton, -OS_Key_RightMouseButton, -OS_Key_COUNT, -} OS_Key; - -C_LINKAGE_BEGIN -extern String8 os_g_key_display_string_table[143]; -extern String8 os_g_key_cfg_string_table[143]; - -C_LINKAGE_END - -#endif // OS_GFX_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef WINDOW_MANAGER_META_H +#define WINDOW_MANAGER_META_H + +typedef enum OS_Key +{ +OS_Key_Null, +OS_Key_Esc, +OS_Key_F1, +OS_Key_F2, +OS_Key_F3, +OS_Key_F4, +OS_Key_F5, +OS_Key_F6, +OS_Key_F7, +OS_Key_F8, +OS_Key_F9, +OS_Key_F10, +OS_Key_F11, +OS_Key_F12, +OS_Key_F13, +OS_Key_F14, +OS_Key_F15, +OS_Key_F16, +OS_Key_F17, +OS_Key_F18, +OS_Key_F19, +OS_Key_F20, +OS_Key_F21, +OS_Key_F22, +OS_Key_F23, +OS_Key_F24, +OS_Key_Tick, +OS_Key_0, +OS_Key_1, +OS_Key_2, +OS_Key_3, +OS_Key_4, +OS_Key_5, +OS_Key_6, +OS_Key_7, +OS_Key_8, +OS_Key_9, +OS_Key_Minus, +OS_Key_Equal, +OS_Key_Backspace, +OS_Key_Tab, +OS_Key_Q, +OS_Key_W, +OS_Key_E, +OS_Key_R, +OS_Key_T, +OS_Key_Y, +OS_Key_U, +OS_Key_I, +OS_Key_O, +OS_Key_P, +OS_Key_LeftBracket, +OS_Key_RightBracket, +OS_Key_BackSlash, +OS_Key_CapsLock, +OS_Key_A, +OS_Key_S, +OS_Key_D, +OS_Key_F, +OS_Key_G, +OS_Key_H, +OS_Key_J, +OS_Key_K, +OS_Key_L, +OS_Key_Semicolon, +OS_Key_Quote, +OS_Key_Return, +OS_Key_Shift, +OS_Key_Z, +OS_Key_X, +OS_Key_C, +OS_Key_V, +OS_Key_B, +OS_Key_N, +OS_Key_M, +OS_Key_Comma, +OS_Key_Period, +OS_Key_Slash, +OS_Key_Ctrl, +OS_Key_Alt, +OS_Key_Space, +OS_Key_Menu, +OS_Key_ScrollLock, +OS_Key_Pause, +OS_Key_Insert, +OS_Key_Home, +OS_Key_PageUp, +OS_Key_Delete, +OS_Key_End, +OS_Key_PageDown, +OS_Key_Up, +OS_Key_Left, +OS_Key_Down, +OS_Key_Right, +OS_Key_Ex0, +OS_Key_Ex1, +OS_Key_Ex2, +OS_Key_Ex3, +OS_Key_Ex4, +OS_Key_Ex5, +OS_Key_Ex6, +OS_Key_Ex7, +OS_Key_Ex8, +OS_Key_Ex9, +OS_Key_Ex10, +OS_Key_Ex11, +OS_Key_Ex12, +OS_Key_Ex13, +OS_Key_Ex14, +OS_Key_Ex15, +OS_Key_Ex16, +OS_Key_Ex17, +OS_Key_Ex18, +OS_Key_Ex19, +OS_Key_Ex20, +OS_Key_Ex21, +OS_Key_Ex22, +OS_Key_Ex23, +OS_Key_Ex24, +OS_Key_Ex25, +OS_Key_Ex26, +OS_Key_Ex27, +OS_Key_Ex28, +OS_Key_Ex29, +OS_Key_NumLock, +OS_Key_NumSlash, +OS_Key_NumStar, +OS_Key_NumMinus, +OS_Key_NumPlus, +OS_Key_NumPeriod, +OS_Key_Num0, +OS_Key_Num1, +OS_Key_Num2, +OS_Key_Num3, +OS_Key_Num4, +OS_Key_Num5, +OS_Key_Num6, +OS_Key_Num7, +OS_Key_Num8, +OS_Key_Num9, +OS_Key_LeftMouseButton, +OS_Key_MiddleMouseButton, +OS_Key_RightMouseButton, +OS_Key_COUNT, +} OS_Key; + +C_LINKAGE_BEGIN +extern String8 os_g_key_display_string_table[143]; +extern String8 os_g_key_cfg_string_table[143]; + +C_LINKAGE_END + +#endif // WINDOW_MANAGER_META_H diff --git a/src/os/gfx/os_gfx.c b/src/window_manager/window_manager.c similarity index 96% rename from src/os/gfx/os_gfx.c rename to src/window_manager/window_manager.c index 29f8c544..1f59d2a5 100644 --- a/src/os/gfx/os_gfx.c +++ b/src/window_manager/window_manager.c @@ -1,300 +1,300 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "generated/os_gfx.meta.c" - -//////////////////////////////// -//~ rjf: Handle Type Helpers - -internal OS_Window -os_window_zero(void) -{ - OS_Window result = {0}; - return result; -} - -internal B32 -os_window_match(OS_Window a, OS_Window b) -{ - B32 result = MemoryMatchStruct(&a, &b); - return result; -} - -internal B32 -os_monitor_match(OS_Monitor a, OS_Monitor b) -{ - B32 result = MemoryMatchStruct(&a, &b); - return result; -} - -//////////////////////////////// -//~ rjf: Event Functions (Helpers, Implemented Once) - -internal String8 -os_string_from_event_kind(OS_EventKind kind) -{ - String8 result = {0}; - switch(kind) - { - case OS_EventKind_Null: - case OS_EventKind_COUNT: - {}break; - case OS_EventKind_Press: {result = str8_lit("Press");}break; - case OS_EventKind_Release: {result = str8_lit("Release");}break; - case OS_EventKind_MouseMove: {result = str8_lit("MouseMove");}break; - case OS_EventKind_Text: {result = str8_lit("Text");}break; - case OS_EventKind_Scroll: {result = str8_lit("Scroll");}break; - case OS_EventKind_WindowLoseFocus: {result = str8_lit("WindowLoseFocus");}break; - case OS_EventKind_WindowClose: {result = str8_lit("WindowClose");}break; - case OS_EventKind_FileDrop: {result = str8_lit("FileDrop");}break; - case OS_EventKind_Wakeup: {result = str8_lit("Wakeup");}break; - } - return result; -} - -internal String8List -os_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers) -{ - String8List result = {0}; - if(modifiers & OS_Modifier_Ctrl) { str8_list_push(arena, &result, str8_lit("Ctrl")); } - if(modifiers & OS_Modifier_Shift) { str8_list_push(arena, &result, str8_lit("Shift")); } - if(modifiers & OS_Modifier_Alt) { str8_list_push(arena, &result, str8_lit("Alt")); } - return result; -} - -internal String8 -os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key) -{ - String8 result = {0}; - if(key != OS_Key_Null) - { - Temp scratch = scratch_begin(&arena, 1); - String8List mods = os_string_list_from_modifiers(scratch.arena, modifiers); - String8 key_string = os_g_key_display_string_table[key]; - str8_list_push(scratch.arena, &mods, key_string); - StringJoin join = {0}; - join.sep = str8_lit(" + "); - result = str8_list_join(arena, &mods, &join); - scratch_end(scratch); - } - return result; -} - -internal U32 -os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key) -{ - U32 result = 0; - - // rjf: special-case map - local_persist read_only struct {U32 character; OS_Key key; OS_Modifiers modifiers;} map[] = - { - {'!', OS_Key_1, OS_Modifier_Shift}, - {'@', OS_Key_2, OS_Modifier_Shift}, - {'#', OS_Key_3, OS_Modifier_Shift}, - {'$', OS_Key_4, OS_Modifier_Shift}, - {'%', OS_Key_5, OS_Modifier_Shift}, - {'^', OS_Key_6, OS_Modifier_Shift}, - {'&', OS_Key_7, OS_Modifier_Shift}, - {'*', OS_Key_8, OS_Modifier_Shift}, - {'(', OS_Key_9, OS_Modifier_Shift}, - {')', OS_Key_0, OS_Modifier_Shift}, - {'_', OS_Key_Minus, OS_Modifier_Shift}, - {'_', OS_Key_Minus, OS_Modifier_Shift}, - {'-', OS_Key_Minus, 0}, - {'=', OS_Key_Equal, 0}, - {'+', OS_Key_Equal, OS_Modifier_Shift}, - {'`', OS_Key_Tick, 0}, - {'~', OS_Key_Tick, OS_Modifier_Shift}, - {'[', OS_Key_LeftBracket, 0}, - {']', OS_Key_RightBracket, 0}, - {'{', OS_Key_LeftBracket, OS_Modifier_Shift}, - {'}', OS_Key_RightBracket, OS_Modifier_Shift}, - {'\\', OS_Key_BackSlash, 0}, - {'|', OS_Key_BackSlash, OS_Modifier_Shift}, - {';', OS_Key_Semicolon, 0}, - {':', OS_Key_Semicolon, OS_Modifier_Shift}, - {'\'', OS_Key_Quote, 0}, - {'"', OS_Key_Quote, OS_Modifier_Shift}, - {'.', OS_Key_Period, 0}, - {',', OS_Key_Comma, 0}, - {'<', OS_Key_Period, OS_Modifier_Shift}, - {'>', OS_Key_Comma, OS_Modifier_Shift}, - {'/', OS_Key_Slash, 0}, - {'?', OS_Key_Slash, OS_Modifier_Shift}, - {'a', OS_Key_A, 0}, - {'b', OS_Key_B, 0}, - {'c', OS_Key_C, 0}, - {'d', OS_Key_D, 0}, - {'e', OS_Key_E, 0}, - {'f', OS_Key_F, 0}, - {'g', OS_Key_G, 0}, - {'h', OS_Key_H, 0}, - {'i', OS_Key_I, 0}, - {'j', OS_Key_J, 0}, - {'k', OS_Key_K, 0}, - {'l', OS_Key_L, 0}, - {'m', OS_Key_M, 0}, - {'n', OS_Key_N, 0}, - {'o', OS_Key_O, 0}, - {'p', OS_Key_P, 0}, - {'q', OS_Key_Q, 0}, - {'r', OS_Key_R, 0}, - {'s', OS_Key_S, 0}, - {'t', OS_Key_T, 0}, - {'u', OS_Key_U, 0}, - {'v', OS_Key_V, 0}, - {'w', OS_Key_W, 0}, - {'x', OS_Key_X, 0}, - {'y', OS_Key_Y, 0}, - {'z', OS_Key_Z, 0}, - {'A', OS_Key_A, OS_Modifier_Shift}, - {'B', OS_Key_B, OS_Modifier_Shift}, - {'C', OS_Key_C, OS_Modifier_Shift}, - {'D', OS_Key_D, OS_Modifier_Shift}, - {'E', OS_Key_E, OS_Modifier_Shift}, - {'F', OS_Key_F, OS_Modifier_Shift}, - {'G', OS_Key_G, OS_Modifier_Shift}, - {'H', OS_Key_H, OS_Modifier_Shift}, - {'I', OS_Key_I, OS_Modifier_Shift}, - {'J', OS_Key_J, OS_Modifier_Shift}, - {'K', OS_Key_K, OS_Modifier_Shift}, - {'L', OS_Key_L, OS_Modifier_Shift}, - {'M', OS_Key_M, OS_Modifier_Shift}, - {'N', OS_Key_N, OS_Modifier_Shift}, - {'O', OS_Key_O, OS_Modifier_Shift}, - {'P', OS_Key_P, OS_Modifier_Shift}, - {'Q', OS_Key_Q, OS_Modifier_Shift}, - {'R', OS_Key_R, OS_Modifier_Shift}, - {'S', OS_Key_S, OS_Modifier_Shift}, - {'T', OS_Key_T, OS_Modifier_Shift}, - {'U', OS_Key_U, OS_Modifier_Shift}, - {'V', OS_Key_V, OS_Modifier_Shift}, - {'W', OS_Key_W, OS_Modifier_Shift}, - {'X', OS_Key_X, OS_Modifier_Shift}, - {'Y', OS_Key_Y, OS_Modifier_Shift}, - {'Z', OS_Key_Z, OS_Modifier_Shift}, - {' ', OS_Key_Space, 0}, - }; - - // rjf: check numeric - if(OS_Key_0 <= key && key <= OS_Key_9) - { - result = '0' + (key - OS_Key_0); - } - - // rjf: check special-case map - for(U64 idx = 0; idx < ArrayCount(map); idx += 1) - { - if(map[idx].key == key && map[idx].modifiers == modifiers) - { - result = map[idx].character; - break; - } - } - - return result; -} - -internal void -os_eat_event(OS_EventList *events, OS_Event *event) -{ - DLLRemove(events->first, events->last, event); - events->count -= 1; -} - -internal B32 -os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key) -{ - B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) - { - if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && - event->kind == OS_EventKind_Press && event->key == key && event->modifiers == modifiers) - { - result = 1; - os_eat_event(events, event); - break; - } - } - return result; -} - -internal B32 -os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key) -{ - B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) - { - if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && - event->kind == OS_EventKind_Release && event->key == key && event->modifiers == modifiers) - { - result = 1; - os_eat_event(events, event); - break; - } - } - return result; -} - -internal B32 -os_text(OS_EventList *events, OS_Window window, U32 character) -{ - B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) - { - if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && - event->kind == OS_EventKind_Text && event->character == character) - { - result = 1; - os_eat_event(events, event); - break; - } - } - return result; -} - -internal OS_EventList -os_event_list_copy(Arena *arena, OS_EventList *src) -{ - OS_EventList dst = {0}; - for(OS_Event *s = src->first; s != 0; s = s->next) - { - OS_Event *d = push_array(arena, OS_Event, 1); - MemoryCopyStruct(d, s); - d->strings = str8_list_copy(arena, &s->strings); - DLLPushBack(dst.first, dst.last, d); - dst.count += 1; - } - return dst; -} - -internal void -os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push) -{ - if(dst->last && to_push->first) - { - dst->last->next = to_push->first; - to_push->first->prev = dst->last; - dst->last = to_push->last; - dst->count += to_push->count; - } - else if(!dst->last && to_push->first) - { - MemoryCopyStruct(dst, to_push); - } - MemoryZeroStruct(to_push); -} - -internal OS_Event * -os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind) -{ - OS_Event *evt = push_array(arena, OS_Event, 1); - DLLPushBack(evts->first, evts->last, evt); - evts->count += 1; - evt->timestamp_us = now_time_us(); - evt->kind = kind; - return evt; -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "window_manager/generated/window_manager.meta.c" + +//////////////////////////////// +//~ rjf: Handle Type Helpers + +internal OS_Window +os_window_zero(void) +{ + OS_Window result = {0}; + return result; +} + +internal B32 +os_window_match(OS_Window a, OS_Window b) +{ + B32 result = MemoryMatchStruct(&a, &b); + return result; +} + +internal B32 +os_monitor_match(OS_Monitor a, OS_Monitor b) +{ + B32 result = MemoryMatchStruct(&a, &b); + return result; +} + +//////////////////////////////// +//~ rjf: Event Functions (Helpers, Implemented Once) + +internal String8 +os_string_from_event_kind(OS_EventKind kind) +{ + String8 result = {0}; + switch(kind) + { + case OS_EventKind_Null: + case OS_EventKind_COUNT: + {}break; + case OS_EventKind_Press: {result = str8_lit("Press");}break; + case OS_EventKind_Release: {result = str8_lit("Release");}break; + case OS_EventKind_MouseMove: {result = str8_lit("MouseMove");}break; + case OS_EventKind_Text: {result = str8_lit("Text");}break; + case OS_EventKind_Scroll: {result = str8_lit("Scroll");}break; + case OS_EventKind_WindowLoseFocus: {result = str8_lit("WindowLoseFocus");}break; + case OS_EventKind_WindowClose: {result = str8_lit("WindowClose");}break; + case OS_EventKind_FileDrop: {result = str8_lit("FileDrop");}break; + case OS_EventKind_Wakeup: {result = str8_lit("Wakeup");}break; + } + return result; +} + +internal String8List +os_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers) +{ + String8List result = {0}; + if(modifiers & OS_Modifier_Ctrl) { str8_list_push(arena, &result, str8_lit("Ctrl")); } + if(modifiers & OS_Modifier_Shift) { str8_list_push(arena, &result, str8_lit("Shift")); } + if(modifiers & OS_Modifier_Alt) { str8_list_push(arena, &result, str8_lit("Alt")); } + return result; +} + +internal String8 +os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key) +{ + String8 result = {0}; + if(key != OS_Key_Null) + { + Temp scratch = scratch_begin(&arena, 1); + String8List mods = os_string_list_from_modifiers(scratch.arena, modifiers); + String8 key_string = os_g_key_display_string_table[key]; + str8_list_push(scratch.arena, &mods, key_string); + StringJoin join = {0}; + join.sep = str8_lit(" + "); + result = str8_list_join(arena, &mods, &join); + scratch_end(scratch); + } + return result; +} + +internal U32 +os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key) +{ + U32 result = 0; + + // rjf: special-case map + local_persist read_only struct {U32 character; OS_Key key; OS_Modifiers modifiers;} map[] = + { + {'!', OS_Key_1, OS_Modifier_Shift}, + {'@', OS_Key_2, OS_Modifier_Shift}, + {'#', OS_Key_3, OS_Modifier_Shift}, + {'$', OS_Key_4, OS_Modifier_Shift}, + {'%', OS_Key_5, OS_Modifier_Shift}, + {'^', OS_Key_6, OS_Modifier_Shift}, + {'&', OS_Key_7, OS_Modifier_Shift}, + {'*', OS_Key_8, OS_Modifier_Shift}, + {'(', OS_Key_9, OS_Modifier_Shift}, + {')', OS_Key_0, OS_Modifier_Shift}, + {'_', OS_Key_Minus, OS_Modifier_Shift}, + {'_', OS_Key_Minus, OS_Modifier_Shift}, + {'-', OS_Key_Minus, 0}, + {'=', OS_Key_Equal, 0}, + {'+', OS_Key_Equal, OS_Modifier_Shift}, + {'`', OS_Key_Tick, 0}, + {'~', OS_Key_Tick, OS_Modifier_Shift}, + {'[', OS_Key_LeftBracket, 0}, + {']', OS_Key_RightBracket, 0}, + {'{', OS_Key_LeftBracket, OS_Modifier_Shift}, + {'}', OS_Key_RightBracket, OS_Modifier_Shift}, + {'\\', OS_Key_BackSlash, 0}, + {'|', OS_Key_BackSlash, OS_Modifier_Shift}, + {';', OS_Key_Semicolon, 0}, + {':', OS_Key_Semicolon, OS_Modifier_Shift}, + {'\'', OS_Key_Quote, 0}, + {'"', OS_Key_Quote, OS_Modifier_Shift}, + {'.', OS_Key_Period, 0}, + {',', OS_Key_Comma, 0}, + {'<', OS_Key_Period, OS_Modifier_Shift}, + {'>', OS_Key_Comma, OS_Modifier_Shift}, + {'/', OS_Key_Slash, 0}, + {'?', OS_Key_Slash, OS_Modifier_Shift}, + {'a', OS_Key_A, 0}, + {'b', OS_Key_B, 0}, + {'c', OS_Key_C, 0}, + {'d', OS_Key_D, 0}, + {'e', OS_Key_E, 0}, + {'f', OS_Key_F, 0}, + {'g', OS_Key_G, 0}, + {'h', OS_Key_H, 0}, + {'i', OS_Key_I, 0}, + {'j', OS_Key_J, 0}, + {'k', OS_Key_K, 0}, + {'l', OS_Key_L, 0}, + {'m', OS_Key_M, 0}, + {'n', OS_Key_N, 0}, + {'o', OS_Key_O, 0}, + {'p', OS_Key_P, 0}, + {'q', OS_Key_Q, 0}, + {'r', OS_Key_R, 0}, + {'s', OS_Key_S, 0}, + {'t', OS_Key_T, 0}, + {'u', OS_Key_U, 0}, + {'v', OS_Key_V, 0}, + {'w', OS_Key_W, 0}, + {'x', OS_Key_X, 0}, + {'y', OS_Key_Y, 0}, + {'z', OS_Key_Z, 0}, + {'A', OS_Key_A, OS_Modifier_Shift}, + {'B', OS_Key_B, OS_Modifier_Shift}, + {'C', OS_Key_C, OS_Modifier_Shift}, + {'D', OS_Key_D, OS_Modifier_Shift}, + {'E', OS_Key_E, OS_Modifier_Shift}, + {'F', OS_Key_F, OS_Modifier_Shift}, + {'G', OS_Key_G, OS_Modifier_Shift}, + {'H', OS_Key_H, OS_Modifier_Shift}, + {'I', OS_Key_I, OS_Modifier_Shift}, + {'J', OS_Key_J, OS_Modifier_Shift}, + {'K', OS_Key_K, OS_Modifier_Shift}, + {'L', OS_Key_L, OS_Modifier_Shift}, + {'M', OS_Key_M, OS_Modifier_Shift}, + {'N', OS_Key_N, OS_Modifier_Shift}, + {'O', OS_Key_O, OS_Modifier_Shift}, + {'P', OS_Key_P, OS_Modifier_Shift}, + {'Q', OS_Key_Q, OS_Modifier_Shift}, + {'R', OS_Key_R, OS_Modifier_Shift}, + {'S', OS_Key_S, OS_Modifier_Shift}, + {'T', OS_Key_T, OS_Modifier_Shift}, + {'U', OS_Key_U, OS_Modifier_Shift}, + {'V', OS_Key_V, OS_Modifier_Shift}, + {'W', OS_Key_W, OS_Modifier_Shift}, + {'X', OS_Key_X, OS_Modifier_Shift}, + {'Y', OS_Key_Y, OS_Modifier_Shift}, + {'Z', OS_Key_Z, OS_Modifier_Shift}, + {' ', OS_Key_Space, 0}, + }; + + // rjf: check numeric + if(OS_Key_0 <= key && key <= OS_Key_9) + { + result = '0' + (key - OS_Key_0); + } + + // rjf: check special-case map + for(U64 idx = 0; idx < ArrayCount(map); idx += 1) + { + if(map[idx].key == key && map[idx].modifiers == modifiers) + { + result = map[idx].character; + break; + } + } + + return result; +} + +internal void +os_eat_event(OS_EventList *events, OS_Event *event) +{ + DLLRemove(events->first, events->last, event); + events->count -= 1; +} + +internal B32 +os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key) +{ + B32 result = 0; + for(OS_Event *event = events->first; event != 0; event = event->next) + { + if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && + event->kind == OS_EventKind_Press && event->key == key && event->modifiers == modifiers) + { + result = 1; + os_eat_event(events, event); + break; + } + } + return result; +} + +internal B32 +os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key) +{ + B32 result = 0; + for(OS_Event *event = events->first; event != 0; event = event->next) + { + if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && + event->kind == OS_EventKind_Release && event->key == key && event->modifiers == modifiers) + { + result = 1; + os_eat_event(events, event); + break; + } + } + return result; +} + +internal B32 +os_text(OS_EventList *events, OS_Window window, U32 character) +{ + B32 result = 0; + for(OS_Event *event = events->first; event != 0; event = event->next) + { + if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && + event->kind == OS_EventKind_Text && event->character == character) + { + result = 1; + os_eat_event(events, event); + break; + } + } + return result; +} + +internal OS_EventList +os_event_list_copy(Arena *arena, OS_EventList *src) +{ + OS_EventList dst = {0}; + for(OS_Event *s = src->first; s != 0; s = s->next) + { + OS_Event *d = push_array(arena, OS_Event, 1); + MemoryCopyStruct(d, s); + d->strings = str8_list_copy(arena, &s->strings); + DLLPushBack(dst.first, dst.last, d); + dst.count += 1; + } + return dst; +} + +internal void +os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push) +{ + if(dst->last && to_push->first) + { + dst->last->next = to_push->first; + to_push->first->prev = dst->last; + dst->last = to_push->last; + dst->count += to_push->count; + } + else if(!dst->last && to_push->first) + { + MemoryCopyStruct(dst, to_push); + } + MemoryZeroStruct(to_push); +} + +internal OS_Event * +os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind) +{ + OS_Event *evt = push_array(arena, OS_Event, 1); + DLLPushBack(evts->first, evts->last, evt); + evts->count += 1; + evt->timestamp_us = now_time_us(); + evt->kind = kind; + return evt; +} diff --git a/src/os/gfx/os_gfx.h b/src/window_manager/window_manager.h similarity index 96% rename from src/os/gfx/os_gfx.h rename to src/window_manager/window_manager.h index bc4a7d16..a64ca87f 100644 --- a/src/os/gfx/os_gfx.h +++ b/src/window_manager/window_manager.h @@ -1,246 +1,246 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_GFX_H -#define OS_GFX_H - -//////////////////////////////// -//~ rjf: Graphics System Info - -typedef struct OS_GfxInfo OS_GfxInfo; -struct OS_GfxInfo -{ - F32 double_click_time; - F32 caret_blink_time; - F32 default_refresh_rate; -}; - -//////////////////////////////// -//~ rjf: Window Types - -typedef U32 OS_WindowFlags; -enum -{ - OS_WindowFlag_CustomBorder = (1<<0), - OS_WindowFlag_UseDefaultPosition = (1<<1), -}; - -typedef struct OS_Window OS_Window; -struct OS_Window -{ - U64 u64[1]; -}; - -//////////////////////////////// -//~ rjf: External Window Types - -typedef struct OS_ExternalWindow OS_ExternalWindow; -struct OS_ExternalWindow -{ - U64 u64[1]; -}; - -//////////////////////////////// -//~ rjf: Monitor Types - -typedef struct OS_Monitor OS_Monitor; -struct OS_Monitor -{ - U64 u64[1]; -}; - -typedef struct OS_MonitorArray OS_MonitorArray; -struct OS_MonitorArray -{ - OS_Monitor *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Cursor Types - -typedef enum OS_Cursor -{ - OS_Cursor_Pointer, - OS_Cursor_IBar, - OS_Cursor_LeftRight, - OS_Cursor_UpDown, - OS_Cursor_DownRight, - OS_Cursor_UpRight, - OS_Cursor_UpDownLeftRight, - OS_Cursor_HandPoint, - OS_Cursor_Disabled, - OS_Cursor_COUNT, -} -OS_Cursor; - -//////////////////////////////// -//~ rjf: Generated Code - -#include "os/gfx/generated/os_gfx.meta.h" - -//////////////////////////////// -//~ rjf: Event Types - -typedef enum OS_EventKind -{ - OS_EventKind_Null, - OS_EventKind_Press, - OS_EventKind_Release, - OS_EventKind_MouseMove, - OS_EventKind_Text, - OS_EventKind_Scroll, - OS_EventKind_WindowLoseFocus, - OS_EventKind_WindowClose, - OS_EventKind_FileDrop, - OS_EventKind_Wakeup, - OS_EventKind_COUNT -} -OS_EventKind; - -typedef U32 OS_Modifiers; -enum -{ - OS_Modifier_Ctrl = (1<<0), - OS_Modifier_Shift = (1<<1), - OS_Modifier_Alt = (1<<2), -}; - -typedef struct OS_Event OS_Event; -struct OS_Event -{ - OS_Event *next; - OS_Event *prev; - U64 timestamp_us; - OS_Window window; - OS_EventKind kind; - OS_Modifiers modifiers; - OS_Key key; - B32 is_repeat; - B32 right_sided; - U32 character; - U32 repeat_count; - Vec2F32 pos; - Vec2F32 delta; - String8List strings; -}; - -typedef struct OS_EventList OS_EventList; -struct OS_EventList -{ - U64 count; - OS_Event *first; - OS_Event *last; -}; - -//////////////////////////////// -//~ rjf: Application-Defined Frame Hook Forward Declaration - -internal B32 frame(void); - -//////////////////////////////// -//~ rjf: Handle Type Helpers - -internal OS_Window os_window_zero(void); -internal B32 os_window_match(OS_Window a, OS_Window b); -internal B32 os_monitor_match(OS_Monitor a, OS_Monitor b); - -//////////////////////////////// -//~ rjf: Event Functions (Helpers, Implemented Once) - -internal String8 os_string_from_event_kind(OS_EventKind kind); -internal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers flags); -internal String8 os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key); -internal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers flags, OS_Key key); -internal void os_eat_event(OS_EventList *events, OS_Event *event); -internal B32 os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key); -internal B32 os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key); -internal B32 os_text(OS_EventList *events, OS_Window window, U32 character); -internal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src); -internal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push); -internal OS_Event *os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind); - -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void os_gfx_init(void); - -//////////////////////////////// -//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) - -internal OS_GfxInfo *os_get_gfx_info(void); - -//////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) - -internal void os_set_clipboard_text(String8 string); -internal String8 os_get_clipboard_text(Arena *arena); - -//////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) - -internal OS_Window os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title); -internal void os_window_close(OS_Window window); -internal void os_window_set_title(OS_Window window, String8 title); -internal void os_window_first_paint(OS_Window window); -internal void os_window_focus(OS_Window window); -internal B32 os_window_is_focused(OS_Window window); -internal B32 os_window_is_fullscreen(OS_Window window); -internal void os_window_set_fullscreen(OS_Window window, B32 fullscreen); -internal B32 os_window_is_maximized(OS_Window window); -internal void os_window_set_maximized(OS_Window window, B32 maximized); -internal B32 os_window_is_minimized(OS_Window window); -internal void os_window_set_minimized(OS_Window window, B32 minimized); -internal void os_window_bring_to_front(OS_Window window); -internal void os_window_set_monitor(OS_Window window, OS_Monitor monitor); -internal void os_window_clear_custom_border_data(OS_Window handle); -internal void os_window_push_custom_title_bar(OS_Window handle, F32 thickness); -internal void os_window_push_custom_edges(OS_Window handle, F32 thickness); -internal void os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect); -internal Rng2F32 os_rect_from_window(OS_Window window); -internal Rng2F32 os_client_rect_from_window(OS_Window window); -internal F32 os_dpi_from_window(OS_Window window); - -//////////////////////////////// -//~ rjf: @os_hooks External Windows (Implemented Per-OS) - -internal OS_ExternalWindow os_focused_external_window(void); -internal void os_focus_external_window(OS_ExternalWindow ext_window); - -//////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) - -internal OS_MonitorArray os_push_monitors_array(Arena *arena); -internal OS_Monitor os_primary_monitor(void); -internal OS_Monitor os_monitor_from_window(OS_Window window); -internal String8 os_name_from_monitor(Arena *arena, OS_Monitor monitor); -internal Vec2F32 os_dim_from_monitor(OS_Monitor monitor); -internal F32 os_dpi_from_monitor(OS_Monitor monitor); - -//////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) - -internal void os_send_wakeup_event(void); -internal OS_EventList os_get_events(Arena *arena, B32 wait); -internal OS_Modifiers os_get_modifiers(void); -internal B32 os_key_is_down(OS_Key key); -internal Vec2F32 os_mouse_from_window(OS_Window window); - -//////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) - -internal void os_set_cursor(OS_Cursor cursor); - -//////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void os_graphical_message(B32 error, String8 title, String8 message); -internal String8 os_graphical_pick_file(Arena *arena, String8 initial_path); - -//////////////////////////////// -//~ rjf: @os_hooks Shell Operations - -internal void os_show_in_filesystem_ui(String8 path); -internal void os_open_in_browser(String8 url); - -#endif // OS_GFX_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_GFX_H +#define OS_GFX_H + +//////////////////////////////// +//~ rjf: Graphics System Info + +typedef struct OS_GfxInfo OS_GfxInfo; +struct OS_GfxInfo +{ + F32 double_click_time; + F32 caret_blink_time; + F32 default_refresh_rate; +}; + +//////////////////////////////// +//~ rjf: Window Types + +typedef U32 OS_WindowFlags; +enum +{ + OS_WindowFlag_CustomBorder = (1<<0), + OS_WindowFlag_UseDefaultPosition = (1<<1), +}; + +typedef struct OS_Window OS_Window; +struct OS_Window +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: External Window Types + +typedef struct OS_ExternalWindow OS_ExternalWindow; +struct OS_ExternalWindow +{ + U64 u64[1]; +}; + +//////////////////////////////// +//~ rjf: Monitor Types + +typedef struct OS_Monitor OS_Monitor; +struct OS_Monitor +{ + U64 u64[1]; +}; + +typedef struct OS_MonitorArray OS_MonitorArray; +struct OS_MonitorArray +{ + OS_Monitor *v; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Cursor Types + +typedef enum OS_Cursor +{ + OS_Cursor_Pointer, + OS_Cursor_IBar, + OS_Cursor_LeftRight, + OS_Cursor_UpDown, + OS_Cursor_DownRight, + OS_Cursor_UpRight, + OS_Cursor_UpDownLeftRight, + OS_Cursor_HandPoint, + OS_Cursor_Disabled, + OS_Cursor_COUNT, +} +OS_Cursor; + +//////////////////////////////// +//~ rjf: Generated Code + +#include "window_manager/generated/window_manager.meta.h" + +//////////////////////////////// +//~ rjf: Event Types + +typedef enum OS_EventKind +{ + OS_EventKind_Null, + OS_EventKind_Press, + OS_EventKind_Release, + OS_EventKind_MouseMove, + OS_EventKind_Text, + OS_EventKind_Scroll, + OS_EventKind_WindowLoseFocus, + OS_EventKind_WindowClose, + OS_EventKind_FileDrop, + OS_EventKind_Wakeup, + OS_EventKind_COUNT +} +OS_EventKind; + +typedef U32 OS_Modifiers; +enum +{ + OS_Modifier_Ctrl = (1<<0), + OS_Modifier_Shift = (1<<1), + OS_Modifier_Alt = (1<<2), +}; + +typedef struct OS_Event OS_Event; +struct OS_Event +{ + OS_Event *next; + OS_Event *prev; + U64 timestamp_us; + OS_Window window; + OS_EventKind kind; + OS_Modifiers modifiers; + OS_Key key; + B32 is_repeat; + B32 right_sided; + U32 character; + U32 repeat_count; + Vec2F32 pos; + Vec2F32 delta; + String8List strings; +}; + +typedef struct OS_EventList OS_EventList; +struct OS_EventList +{ + U64 count; + OS_Event *first; + OS_Event *last; +}; + +//////////////////////////////// +//~ rjf: Application-Defined Frame Hook Forward Declaration + +internal B32 frame(void); + +//////////////////////////////// +//~ rjf: Handle Type Helpers + +internal OS_Window os_window_zero(void); +internal B32 os_window_match(OS_Window a, OS_Window b); +internal B32 os_monitor_match(OS_Monitor a, OS_Monitor b); + +//////////////////////////////// +//~ rjf: Event Functions (Helpers, Implemented Once) + +internal String8 os_string_from_event_kind(OS_EventKind kind); +internal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers flags); +internal String8 os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key); +internal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers flags, OS_Key key); +internal void os_eat_event(OS_EventList *events, OS_Event *event); +internal B32 os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key); +internal B32 os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key); +internal B32 os_text(OS_EventList *events, OS_Window window, U32 character); +internal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src); +internal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push); +internal OS_Event *os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind); + +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void os_gfx_init(void); + +//////////////////////////////// +//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) + +internal OS_GfxInfo *os_get_gfx_info(void); + +//////////////////////////////// +//~ rjf: @os_hooks Clipboards (Implemented Per-OS) + +internal void os_set_clipboard_text(String8 string); +internal String8 os_get_clipboard_text(Arena *arena); + +//////////////////////////////// +//~ rjf: @os_hooks Windows (Implemented Per-OS) + +internal OS_Window os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title); +internal void os_window_close(OS_Window window); +internal void os_window_set_title(OS_Window window, String8 title); +internal void os_window_first_paint(OS_Window window); +internal void os_window_focus(OS_Window window); +internal B32 os_window_is_focused(OS_Window window); +internal B32 os_window_is_fullscreen(OS_Window window); +internal void os_window_set_fullscreen(OS_Window window, B32 fullscreen); +internal B32 os_window_is_maximized(OS_Window window); +internal void os_window_set_maximized(OS_Window window, B32 maximized); +internal B32 os_window_is_minimized(OS_Window window); +internal void os_window_set_minimized(OS_Window window, B32 minimized); +internal void os_window_bring_to_front(OS_Window window); +internal void os_window_set_monitor(OS_Window window, OS_Monitor monitor); +internal void os_window_clear_custom_border_data(OS_Window handle); +internal void os_window_push_custom_title_bar(OS_Window handle, F32 thickness); +internal void os_window_push_custom_edges(OS_Window handle, F32 thickness); +internal void os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect); +internal Rng2F32 os_rect_from_window(OS_Window window); +internal Rng2F32 os_client_rect_from_window(OS_Window window); +internal F32 os_dpi_from_window(OS_Window window); + +//////////////////////////////// +//~ rjf: @os_hooks External Windows (Implemented Per-OS) + +internal OS_ExternalWindow os_focused_external_window(void); +internal void os_focus_external_window(OS_ExternalWindow ext_window); + +//////////////////////////////// +//~ rjf: @os_hooks Monitors (Implemented Per-OS) + +internal OS_MonitorArray os_push_monitors_array(Arena *arena); +internal OS_Monitor os_primary_monitor(void); +internal OS_Monitor os_monitor_from_window(OS_Window window); +internal String8 os_name_from_monitor(Arena *arena, OS_Monitor monitor); +internal Vec2F32 os_dim_from_monitor(OS_Monitor monitor); +internal F32 os_dpi_from_monitor(OS_Monitor monitor); + +//////////////////////////////// +//~ rjf: @os_hooks Events (Implemented Per-OS) + +internal void os_send_wakeup_event(void); +internal OS_EventList os_get_events(Arena *arena, B32 wait); +internal OS_Modifiers os_get_modifiers(void); +internal B32 os_key_is_down(OS_Key key); +internal Vec2F32 os_mouse_from_window(OS_Window window); + +//////////////////////////////// +//~ rjf: @os_hooks Cursors (Implemented Per-OS) + +internal void os_set_cursor(OS_Cursor cursor); + +//////////////////////////////// +//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) + +internal void os_graphical_message(B32 error, String8 title, String8 message); +internal String8 os_graphical_pick_file(Arena *arena, String8 initial_path); + +//////////////////////////////// +//~ rjf: @os_hooks Shell Operations + +internal void os_show_in_filesystem_ui(String8 path); +internal void os_open_in_browser(String8 url); + +#endif // OS_GFX_H diff --git a/src/os/gfx/os_gfx.mdesk b/src/window_manager/window_manager.mdesk similarity index 98% rename from src/os/gfx/os_gfx.mdesk rename to src/window_manager/window_manager.mdesk index fc15a5f2..053c5119 100644 --- a/src/os/gfx/os_gfx.mdesk +++ b/src/window_manager/window_manager.mdesk @@ -1,172 +1,172 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Tables - -@table(name, display_string, cfg_string) -OS_KeyTable: -{ - {Null "Invalid Key" "null" } - {Esc "Escape" "esc" } - {F1 "F1" "f1" } - {F2 "F2" "f2" } - {F3 "F3" "f3" } - {F4 "F4" "f4" } - {F5 "F5" "f5" } - {F6 "F6" "f6" } - {F7 "F7" "f7" } - {F8 "F8" "f8" } - {F9 "F9" "f9" } - {F10 "F10" "f10" } - {F11 "F11" "f11" } - {F12 "F12" "f12" } - {F13 "F13" "f13" } - {F14 "F14" "f14" } - {F15 "F15" "f15" } - {F16 "F16" "f16" } - {F17 "F17" "f17" } - {F18 "F18" "f18" } - {F19 "F19" "f19" } - {F20 "F20" "f20" } - {F21 "F21" "f21" } - {F22 "F22" "f22" } - {F23 "F23" "f23" } - {F24 "F24" "f24" } - {Tick "Tick" "tick" } - {0 "0" "0" } - {1 "1" "1" } - {2 "2" "2" } - {3 "3" "3" } - {4 "4" "4" } - {5 "5" "5" } - {6 "6" "6" } - {7 "7" "7" } - {8 "8" "8" } - {9 "9" "9" } - {Minus "Minus" "minus" } - {Equal "Equal" "equal" } - {Backspace "Backspace" "backspace" } - {Tab "Tab" "tab" } - {Q "Q" "q" } - {W "W" "w" } - {E "E" "e" } - {R "R" "r" } - {T "T" "t" } - {Y "Y" "y" } - {U "U" "u" } - {I "I" "i" } - {O "O" "o" } - {P "P" "p" } - {LeftBracket "Left Bracket" "left_bracket" } - {RightBracket "Right Bracket" "right_bracket" } - {BackSlash "Back Slash" "backslash" } - {CapsLock "Caps Lock" "caps_lock" } - {A "A" "a" } - {S "S" "s" } - {D "D" "d" } - {F "F" "f" } - {G "G" "g" } - {H "H" "h" } - {J "J" "j" } - {K "K" "k" } - {L "L" "l" } - {Semicolon "Semicolon" "semicolon" } - {Quote "Quote" "quote" } - {Return "Return" "return" } - {Shift "Shift" "shift" } - {Z "Z" "z" } - {X "X" "x" } - {C "C" "c" } - {V "V" "v" } - {B "B" "b" } - {N "N" "n" } - {M "M" "m" } - {Comma "Comma" "comma" } - {Period "Period" "period" } - {Slash "Slash" "slash" } - {Ctrl "Ctrl" "ctrl" } - {Alt "Alt" "alt" } - {Space "Space" "space" } - {Menu "Menu" "menu" } - {ScrollLock "Scroll Lock" "scroll_lock" } - {Pause "Pause" "pause" } - {Insert "Insert" "insert" } - {Home "Home" "home" } - {PageUp "Page Up" "page_up" } - {Delete "Delete" "delete" } - {End "End" "end" } - {PageDown "Page Down" "page_down" } - {Up "Up" "up" } - {Left "Left" "left" } - {Down "Down" "down" } - {Right "Right" "right" } - {Ex0 "Ex0" "ex0" } - {Ex1 "Ex1" "ex1" } - {Ex2 "Ex2" "ex2" } - {Ex3 "Ex3" "ex3" } - {Ex4 "Ex4" "ex4" } - {Ex5 "Ex5" "ex5" } - {Ex6 "Ex6" "ex6" } - {Ex7 "Ex7" "ex7" } - {Ex8 "Ex8" "ex8" } - {Ex9 "Ex9" "ex9" } - {Ex10 "Ex10" "ex10" } - {Ex11 "Ex11" "ex11" } - {Ex12 "Ex12" "ex12" } - {Ex13 "Ex13" "ex13" } - {Ex14 "Ex14" "ex14" } - {Ex15 "Ex15" "ex15" } - {Ex16 "Ex16" "ex16" } - {Ex17 "Ex17" "ex17" } - {Ex18 "Ex18" "ex18" } - {Ex19 "Ex19" "ex19" } - {Ex20 "Ex20" "ex20" } - {Ex21 "Ex21" "ex21" } - {Ex22 "Ex22" "ex22" } - {Ex23 "Ex23" "ex23" } - {Ex24 "Ex24" "ex24" } - {Ex25 "Ex25" "ex25" } - {Ex26 "Ex26" "ex26" } - {Ex27 "Ex27" "ex27" } - {Ex28 "Ex28" "ex28" } - {Ex29 "Ex29" "ex29" } - {NumLock "Num Lock" "num_lock" } - {NumSlash "Numpad Slash" "numpad_slash" } - {NumStar "Numpad Star" "numpad_star" } - {NumMinus "Numpad Minus" "numpad_minus" } - {NumPlus "Numpad Plus" "numpad_plus" } - {NumPeriod "Numpad Period" "numpad_period" } - {Num0 "Numpad 0" "numpad_0" } - {Num1 "Numpad 1" "numpad_1" } - {Num2 "Numpad 2" "numpad_2" } - {Num3 "Numpad 3" "numpad_3" } - {Num4 "Numpad 4" "numpad_4" } - {Num5 "Numpad 5" "numpad_5" } - {Num6 "Numpad 6" "numpad_6" } - {Num7 "Numpad 7" "numpad_7" } - {Num8 "Numpad 8" "numpad_8" } - {Num9 "Numpad 9" "numpad_9" } - {LeftMouseButton "Left Mouse Button" "left_mouse" } - {MiddleMouseButton "Middle Mouse Button" "middle_mouse" } - {RightMouseButton "Right Mouse Button" "right_mouse" } -} - -//////////////////////////////// -//~ rjf: Generators - -@enum OS_Key: -{ - @expand(OS_KeyTable a) `$(a.name)`, - COUNT, -} - -@data(String8) os_g_key_display_string_table: -{ - @expand(OS_KeyTable a) `str8_lit_comp("$(a.display_string)")`; -} - -@data(String8) os_g_key_cfg_string_table: -{ - @expand(OS_KeyTable a) `str8_lit_comp("$(a.cfg_string)")`; -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Tables + +@table(name, display_string, cfg_string) +OS_KeyTable: +{ + {Null "Invalid Key" "null" } + {Esc "Escape" "esc" } + {F1 "F1" "f1" } + {F2 "F2" "f2" } + {F3 "F3" "f3" } + {F4 "F4" "f4" } + {F5 "F5" "f5" } + {F6 "F6" "f6" } + {F7 "F7" "f7" } + {F8 "F8" "f8" } + {F9 "F9" "f9" } + {F10 "F10" "f10" } + {F11 "F11" "f11" } + {F12 "F12" "f12" } + {F13 "F13" "f13" } + {F14 "F14" "f14" } + {F15 "F15" "f15" } + {F16 "F16" "f16" } + {F17 "F17" "f17" } + {F18 "F18" "f18" } + {F19 "F19" "f19" } + {F20 "F20" "f20" } + {F21 "F21" "f21" } + {F22 "F22" "f22" } + {F23 "F23" "f23" } + {F24 "F24" "f24" } + {Tick "Tick" "tick" } + {0 "0" "0" } + {1 "1" "1" } + {2 "2" "2" } + {3 "3" "3" } + {4 "4" "4" } + {5 "5" "5" } + {6 "6" "6" } + {7 "7" "7" } + {8 "8" "8" } + {9 "9" "9" } + {Minus "Minus" "minus" } + {Equal "Equal" "equal" } + {Backspace "Backspace" "backspace" } + {Tab "Tab" "tab" } + {Q "Q" "q" } + {W "W" "w" } + {E "E" "e" } + {R "R" "r" } + {T "T" "t" } + {Y "Y" "y" } + {U "U" "u" } + {I "I" "i" } + {O "O" "o" } + {P "P" "p" } + {LeftBracket "Left Bracket" "left_bracket" } + {RightBracket "Right Bracket" "right_bracket" } + {BackSlash "Back Slash" "backslash" } + {CapsLock "Caps Lock" "caps_lock" } + {A "A" "a" } + {S "S" "s" } + {D "D" "d" } + {F "F" "f" } + {G "G" "g" } + {H "H" "h" } + {J "J" "j" } + {K "K" "k" } + {L "L" "l" } + {Semicolon "Semicolon" "semicolon" } + {Quote "Quote" "quote" } + {Return "Return" "return" } + {Shift "Shift" "shift" } + {Z "Z" "z" } + {X "X" "x" } + {C "C" "c" } + {V "V" "v" } + {B "B" "b" } + {N "N" "n" } + {M "M" "m" } + {Comma "Comma" "comma" } + {Period "Period" "period" } + {Slash "Slash" "slash" } + {Ctrl "Ctrl" "ctrl" } + {Alt "Alt" "alt" } + {Space "Space" "space" } + {Menu "Menu" "menu" } + {ScrollLock "Scroll Lock" "scroll_lock" } + {Pause "Pause" "pause" } + {Insert "Insert" "insert" } + {Home "Home" "home" } + {PageUp "Page Up" "page_up" } + {Delete "Delete" "delete" } + {End "End" "end" } + {PageDown "Page Down" "page_down" } + {Up "Up" "up" } + {Left "Left" "left" } + {Down "Down" "down" } + {Right "Right" "right" } + {Ex0 "Ex0" "ex0" } + {Ex1 "Ex1" "ex1" } + {Ex2 "Ex2" "ex2" } + {Ex3 "Ex3" "ex3" } + {Ex4 "Ex4" "ex4" } + {Ex5 "Ex5" "ex5" } + {Ex6 "Ex6" "ex6" } + {Ex7 "Ex7" "ex7" } + {Ex8 "Ex8" "ex8" } + {Ex9 "Ex9" "ex9" } + {Ex10 "Ex10" "ex10" } + {Ex11 "Ex11" "ex11" } + {Ex12 "Ex12" "ex12" } + {Ex13 "Ex13" "ex13" } + {Ex14 "Ex14" "ex14" } + {Ex15 "Ex15" "ex15" } + {Ex16 "Ex16" "ex16" } + {Ex17 "Ex17" "ex17" } + {Ex18 "Ex18" "ex18" } + {Ex19 "Ex19" "ex19" } + {Ex20 "Ex20" "ex20" } + {Ex21 "Ex21" "ex21" } + {Ex22 "Ex22" "ex22" } + {Ex23 "Ex23" "ex23" } + {Ex24 "Ex24" "ex24" } + {Ex25 "Ex25" "ex25" } + {Ex26 "Ex26" "ex26" } + {Ex27 "Ex27" "ex27" } + {Ex28 "Ex28" "ex28" } + {Ex29 "Ex29" "ex29" } + {NumLock "Num Lock" "num_lock" } + {NumSlash "Numpad Slash" "numpad_slash" } + {NumStar "Numpad Star" "numpad_star" } + {NumMinus "Numpad Minus" "numpad_minus" } + {NumPlus "Numpad Plus" "numpad_plus" } + {NumPeriod "Numpad Period" "numpad_period" } + {Num0 "Numpad 0" "numpad_0" } + {Num1 "Numpad 1" "numpad_1" } + {Num2 "Numpad 2" "numpad_2" } + {Num3 "Numpad 3" "numpad_3" } + {Num4 "Numpad 4" "numpad_4" } + {Num5 "Numpad 5" "numpad_5" } + {Num6 "Numpad 6" "numpad_6" } + {Num7 "Numpad 7" "numpad_7" } + {Num8 "Numpad 8" "numpad_8" } + {Num9 "Numpad 9" "numpad_9" } + {LeftMouseButton "Left Mouse Button" "left_mouse" } + {MiddleMouseButton "Middle Mouse Button" "middle_mouse" } + {RightMouseButton "Right Mouse Button" "right_mouse" } +} + +//////////////////////////////// +//~ rjf: Generators + +@enum OS_Key: +{ + @expand(OS_KeyTable a) `$(a.name)`, + COUNT, +} + +@data(String8) os_g_key_display_string_table: +{ + @expand(OS_KeyTable a) `str8_lit_comp("$(a.display_string)")`; +} + +@data(String8) os_g_key_cfg_string_table: +{ + @expand(OS_KeyTable a) `str8_lit_comp("$(a.cfg_string)")`; +} diff --git a/src/window_manager/window_manager_inc.c b/src/window_manager/window_manager_inc.c new file mode 100644 index 00000000..5e83758c --- /dev/null +++ b/src/window_manager/window_manager_inc.c @@ -0,0 +1,13 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "window_manager.c" +#if WM_STUB +# include "window_manager_stub.c" +#elif OS_WINDOWS +# include "win32/window_manager/win32_window_manager.c" +#elif OS_LINUX +# include "linux/window_manager/linux_window_manager.c" +#else +# error Window manager layer not implemented for this operating system. +#endif diff --git a/src/window_manager/window_manager_inc.h b/src/window_manager/window_manager_inc.h new file mode 100644 index 00000000..69463a64 --- /dev/null +++ b/src/window_manager/window_manager_inc.h @@ -0,0 +1,18 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef WINDOW_MANAGER_INC_H +#define WINDOW_MANAGER_INC_H + +#include "window_manager.h" +#if WM_STUB +# include "window_manager_stub.h" +#elif OS_WINDOWS +# include "win32/window_manager/win32_window_manager.h" +#elif OS_LINUX +# include "linux/window_manager/linux_window_manager.h" +#else +# error Window manager layer not implemented for this operating system. +#endif + +#endif // WINDOW_MANAGER_INC_H diff --git a/src/os/gfx/stub/os_gfx_stub.c b/src/window_manager/window_manager_stub.c similarity index 93% rename from src/os/gfx/stub/os_gfx_stub.c rename to src/window_manager/window_manager_stub.c index e1e9b805..bf49a3d0 100644 --- a/src/os/gfx/stub/os_gfx_stub.c +++ b/src/window_manager/window_manager_stub.c @@ -1,279 +1,279 @@ -//////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) - -internal void -os_gfx_init(void) -{ -} - -//////////////////////////////// -//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) - -internal OS_GfxInfo * -os_get_gfx_info(void) -{ - local_persist OS_GfxInfo g = {0}; - return &g; -} - -//////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) - -internal void -os_set_clipboard_text(String8 string) -{ -} - -internal String8 -os_get_clipboard_text(Arena *arena) -{ - return str8_zero(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) - -internal OS_Handle -os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) -{ - OS_Handle handle = {1}; - return handle; -} - -internal void -os_window_close(OS_Handle window) -{ -} - -internal void -os_window_set_title(OS_Handle window, String8 title) -{ -} - -internal void -os_window_first_paint(OS_Handle window) -{ -} - -internal void -os_window_focus(OS_Handle window) -{ -} - -internal B32 -os_window_is_focused(OS_Handle window) -{ - return 0; -} - -internal B32 -os_window_is_fullscreen(OS_Handle window) -{ - return 0; -} - -internal void -os_window_set_fullscreen(OS_Handle window, B32 fullscreen) -{ -} - -internal B32 -os_window_is_maximized(OS_Handle window) -{ - return 0; -} - -internal void -os_window_set_maximized(OS_Handle window, B32 maximized) -{ -} - -internal B32 -os_window_is_minimized(OS_Handle window) -{ - return 0; -} - -internal void -os_window_set_minimized(OS_Handle window, B32 minimized) -{ -} - -internal void -os_window_bring_to_front(OS_Handle window) -{ -} - -internal void -os_window_set_monitor(OS_Handle window, OS_Handle monitor) -{ -} - -internal void -os_window_clear_custom_border_data(OS_Handle handle) -{ -} - -internal void -os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) -{ -} - -internal void -os_window_push_custom_edges(OS_Handle handle, F32 thickness) -{ -} - -internal void -os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) -{ -} - -internal Rng2F32 -os_rect_from_window(OS_Handle window) -{ - Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); - return rect; -} - -internal Rng2F32 -os_client_rect_from_window(OS_Handle window) -{ - Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); - return rect; -} - -internal F32 -os_dpi_from_window(OS_Handle window) -{ - return 96.f; -} - -//////////////////////////////// -//~ rjf: @os_hooks External Windows (Implemented Per-OS) - -internal OS_Handle -os_focused_external_window(void) -{ - OS_Handle result = {0}; - // TODO(rjf) - return result; -} - -internal void -os_focus_external_window(OS_Handle handle) -{ - // TODO(rjf) -} - -//////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) - -internal OS_HandleArray -os_push_monitors_array(Arena *arena) -{ - OS_HandleArray arr = {0}; - return arr; -} - -internal OS_Handle -os_primary_monitor(void) -{ - OS_Handle handle = {1}; - return handle; -} - -internal OS_Handle -os_monitor_from_window(OS_Handle window) -{ - OS_Handle handle = {1}; - return handle; -} - -internal String8 -os_name_from_monitor(Arena *arena, OS_Handle monitor) -{ - return str8_zero(); -} - -internal Vec2F32 -os_dim_from_monitor(OS_Handle monitor) -{ - Vec2F32 v = v2f32(1000, 1000); - return v; -} - -internal F32 -os_dpi_from_monitor(OS_Handle monitor) -{ - return 96.f; -} - -//////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) - -internal void -os_send_wakeup_event(void) -{ -} - -internal OS_EventList -os_get_events(Arena *arena, B32 wait) -{ - OS_EventList evts = {0}; - return evts; -} - -internal OS_Modifiers -os_get_modifiers(void) -{ - OS_Modifiers f = 0; - return f; -} - -internal B32 -os_key_is_down(OS_Key key) -{ - return 0; -} - -internal Vec2F32 -os_mouse_from_window(OS_Handle window) -{ - return v2f32(0, 0); -} - -//////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) - -internal void -os_set_cursor(OS_Cursor cursor) -{ -} - -//////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) - -internal void -os_graphical_message(B32 error, String8 title, String8 message) -{ -} - -internal String8 -os_graphical_pick_file(Arena *arena, String8 initial_path) -{ - return str8_zero(); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shell Operations - -internal void -os_show_in_filesystem_ui(String8 path) -{ -} - -internal void -os_open_in_browser(String8 url) -{ -} +//////////////////////////////// +//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) + +internal void +os_gfx_init(void) +{ +} + +//////////////////////////////// +//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) + +internal OS_GfxInfo * +os_get_gfx_info(void) +{ + local_persist OS_GfxInfo g = {0}; + return &g; +} + +//////////////////////////////// +//~ rjf: @os_hooks Clipboards (Implemented Per-OS) + +internal void +os_set_clipboard_text(String8 string) +{ +} + +internal String8 +os_get_clipboard_text(Arena *arena) +{ + return str8_zero(); +} + +//////////////////////////////// +//~ rjf: @os_hooks Windows (Implemented Per-OS) + +internal OS_Handle +os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) +{ + OS_Handle handle = {1}; + return handle; +} + +internal void +os_window_close(OS_Handle window) +{ +} + +internal void +os_window_set_title(OS_Handle window, String8 title) +{ +} + +internal void +os_window_first_paint(OS_Handle window) +{ +} + +internal void +os_window_focus(OS_Handle window) +{ +} + +internal B32 +os_window_is_focused(OS_Handle window) +{ + return 0; +} + +internal B32 +os_window_is_fullscreen(OS_Handle window) +{ + return 0; +} + +internal void +os_window_set_fullscreen(OS_Handle window, B32 fullscreen) +{ +} + +internal B32 +os_window_is_maximized(OS_Handle window) +{ + return 0; +} + +internal void +os_window_set_maximized(OS_Handle window, B32 maximized) +{ +} + +internal B32 +os_window_is_minimized(OS_Handle window) +{ + return 0; +} + +internal void +os_window_set_minimized(OS_Handle window, B32 minimized) +{ +} + +internal void +os_window_bring_to_front(OS_Handle window) +{ +} + +internal void +os_window_set_monitor(OS_Handle window, OS_Handle monitor) +{ +} + +internal void +os_window_clear_custom_border_data(OS_Handle handle) +{ +} + +internal void +os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) +{ +} + +internal void +os_window_push_custom_edges(OS_Handle handle, F32 thickness) +{ +} + +internal void +os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) +{ +} + +internal Rng2F32 +os_rect_from_window(OS_Handle window) +{ + Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); + return rect; +} + +internal Rng2F32 +os_client_rect_from_window(OS_Handle window) +{ + Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); + return rect; +} + +internal F32 +os_dpi_from_window(OS_Handle window) +{ + return 96.f; +} + +//////////////////////////////// +//~ rjf: @os_hooks External Windows (Implemented Per-OS) + +internal OS_Handle +os_focused_external_window(void) +{ + OS_Handle result = {0}; + // TODO(rjf) + return result; +} + +internal void +os_focus_external_window(OS_Handle handle) +{ + // TODO(rjf) +} + +//////////////////////////////// +//~ rjf: @os_hooks Monitors (Implemented Per-OS) + +internal OS_HandleArray +os_push_monitors_array(Arena *arena) +{ + OS_HandleArray arr = {0}; + return arr; +} + +internal OS_Handle +os_primary_monitor(void) +{ + OS_Handle handle = {1}; + return handle; +} + +internal OS_Handle +os_monitor_from_window(OS_Handle window) +{ + OS_Handle handle = {1}; + return handle; +} + +internal String8 +os_name_from_monitor(Arena *arena, OS_Handle monitor) +{ + return str8_zero(); +} + +internal Vec2F32 +os_dim_from_monitor(OS_Handle monitor) +{ + Vec2F32 v = v2f32(1000, 1000); + return v; +} + +internal F32 +os_dpi_from_monitor(OS_Handle monitor) +{ + return 96.f; +} + +//////////////////////////////// +//~ rjf: @os_hooks Events (Implemented Per-OS) + +internal void +os_send_wakeup_event(void) +{ +} + +internal OS_EventList +os_get_events(Arena *arena, B32 wait) +{ + OS_EventList evts = {0}; + return evts; +} + +internal OS_Modifiers +os_get_modifiers(void) +{ + OS_Modifiers f = 0; + return f; +} + +internal B32 +os_key_is_down(OS_Key key) +{ + return 0; +} + +internal Vec2F32 +os_mouse_from_window(OS_Handle window) +{ + return v2f32(0, 0); +} + +//////////////////////////////// +//~ rjf: @os_hooks Cursors (Implemented Per-OS) + +internal void +os_set_cursor(OS_Cursor cursor) +{ +} + +//////////////////////////////// +//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) + +internal void +os_graphical_message(B32 error, String8 title, String8 message) +{ +} + +internal String8 +os_graphical_pick_file(Arena *arena, String8 initial_path) +{ + return str8_zero(); +} + +//////////////////////////////// +//~ rjf: @os_hooks Shell Operations + +internal void +os_show_in_filesystem_ui(String8 path) +{ +} + +internal void +os_open_in_browser(String8 url) +{ +} diff --git a/src/os/gfx/stub/os_gfx_stub.h b/src/window_manager/window_manager_stub.h similarity index 96% rename from src/os/gfx/stub/os_gfx_stub.h rename to src/window_manager/window_manager_stub.h index 009f9802..afdfce32 100644 --- a/src/os/gfx/stub/os_gfx_stub.h +++ b/src/window_manager/window_manager_stub.h @@ -1,7 +1,7 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_GFX_STUB_H -#define OS_GFX_STUB_H - -#endif // OS_GFX_STUB_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef OS_GFX_STUB_H +#define OS_GFX_STUB_H + +#endif // OS_GFX_STUB_H diff --git a/src/x64/x64.h b/src/x64/x64.h index db5edf11..db6ec7d2 100644 --- a/src/x64/x64.h +++ b/src/x64/x64.h @@ -34,7 +34,8 @@ enum //////////////////////////////// //~ fxsave/xsave -typedef struct AlignType(16) X64_FXSave +typedef struct X64_FXSave X64_FXSave; +struct AlignType(16) X64_FXSave { U16 fcw; U16 fsw; @@ -48,23 +49,25 @@ typedef struct AlignType(16) X64_FXSave U128 st_space[8]; U128 xmm_space[16]; U8 padding[96]; -} X64_FXSave; +}; StaticAssert(sizeof(X64_FXSave) == 512, g_x64_xsave_legacy_size_check); -typedef struct X64_XSaveHeader +typedef struct X64_XSaveHeader X64_XSaveHeader; +struct X64_XSaveHeader { U64 xstate_bv; U64 xcomp_bv; U8 reserved[48]; -} X64_XSaveHeader; +}; StaticAssert(sizeof(X64_XSaveHeader) == 64, g_x64_xsave_header_size_check); -typedef struct AlignType(64) X64_XSave +typedef struct X64_XSave X64_XSave; +struct AlignType(64) X64_XSave { X64_FXSave fxsave; X64_XSaveHeader header; // U8 ext_area[0]; -} X64_XSave; +}; StaticAssert(sizeof(X64_XSave) == 576, g_x64_xsave_size_check); typedef U32 X64_XStateComponentIdx; @@ -90,7 +93,6 @@ enum X64_XStateComponentIdx_TILECFG = 17, X64_XStateComponentIdx_TILEDATA = 18, }; - enum { X64_XStateComponentFlag_FP = (1 << X64_XStateComponentIdx_FP), @@ -114,7 +116,8 @@ enum X64_XStateComponentFlag_TILEDATA = (1 << X64_XStateComponentIdx_TILEDATA), }; -typedef struct +typedef struct X64_XSaveLayout X64_XSaveLayout; +struct X64_XSaveLayout { U64 x87_offset; U64 sse_offset; @@ -135,12 +138,12 @@ typedef struct U64 hwp_offset; U64 tile_cfg_offset; U64 tile_data_offset; -} X64_XSaveLayout; +}; //////////////////////////////// //~ Debug Status Register -typedef enum +typedef enum X64_DebugStatusFlags { X64_DebugStatusFlag_B0 = (1 << 0), X64_DebugStatusFlag_B1 = (1 << 1), @@ -151,16 +154,19 @@ typedef enum X64_DebugStatusFlag_SingleStep = (1 << 14), X64_DebugStatusFlag_TaskSwitch = (1 << 15), X64_DebugStatusFlag_RTM = (1 << 16), -} X64_DebugStatusFlags; +} +X64_DebugStatusFlags; //////////////////////////////// //~ Debug Control Register -typedef enum X64_BreakpointType { +typedef enum X64_BreakpointType +{ X64_BreakpointType_Null, X64_BreakpointType_Local, X64_BreakpointType_Global, -} X64_BreakpointType; +} +X64_BreakpointType; typedef enum X64_DebugBreakType { @@ -169,7 +175,8 @@ typedef enum X64_DebugBreakType X64_DebugBreakType_Write, X64_DebugBreakType_ReadWriteIO, X64_DebugBreakType_ReadWriteNoFetch, -} X64_DebugBreakType; +} +X64_DebugBreakType; typedef enum X64_DebugControlFlags { @@ -199,7 +206,8 @@ typedef enum X64_DebugControlFlags X64_DebugControlFlag_LEN1 = (3 << 22), X64_DebugControlFlag_LEN2 = (3 << 26), X64_DebugControlFlag_LEN3 = (3 << 30), -} X64_DebugControlFlags; +} +X64_DebugControlFlags; //////////////////////////////// //~ rjf: Generated From 2f6d0f9aaa5fbd20d8e0a1ee16fcf1f2e8aa6d35 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 8 May 2026 21:17:21 -0700 Subject: [PATCH 504/850] os -> wm; *_w32_ -> w32_*_, *_lnx_ -> lnx_*_ --- project.4coder | 2 +- src/base/base_arena.c | 4 +- src/base/base_entry_point.c | 4 +- src/config/config_bindings.c | 14 +- src/config/config_bindings.h | 4 +- src/config/config_inc.c | 2 +- src/config/config_inc.h | 2 +- src/draw/draw.c | 2 +- src/draw/draw.h | 2 +- src/linux/base/linux_base.c | 66 +- src/linux/base/linux_base.h | 50 +- src/linux/demon/linux_demon.c | 1018 ++++++++--------- src/linux/demon/linux_demon.h | 413 ++++--- .../window_manager/linux_window_manager.c | 378 +++--- .../window_manager/linux_window_manager.h | 28 +- src/raddbg/generated/raddbg.meta.c | 244 ++-- src/raddbg/generated/raddbg.meta.h | 8 +- src/raddbg/raddbg.mdesk | 100 +- src/raddbg/raddbg_core.c | 292 ++--- src/raddbg/raddbg_core.h | 6 +- src/raddbg/raddbg_eval.c | 2 +- src/raddbg/raddbg_main.c | 12 +- src/raddbg/raddbg_views.c | 8 +- src/raddbg/raddbg_widgets.c | 30 +- src/render/d3d11/render_d3d11.c | 26 +- .../linux/egl/render_opengl_linux_egl.c | 30 +- .../linux/glx/render_opengl_linux_glx.c | 16 +- src/render/opengl/render_opengl.c | 14 +- src/render/opengl/render_opengl.h | 8 +- src/render/opengl/win32/render_opengl_win32.c | 14 +- src/render/render_core.h | 10 +- src/scratch/textperf.c | 12 +- src/torture/torture_main.c | 2 +- src/ui/generated/ui.meta.c | 10 +- src/ui/generated/ui.meta.h | 18 +- src/ui/ui.mdesk | 2 +- src/ui/ui_basic_widgets.c | 16 +- src/ui/ui_core.c | 86 +- src/ui/ui_core.h | 28 +- src/win32/base/win32_base.c | 188 +-- src/win32/base/win32_base.h | 56 +- src/win32/demon/win32_demon.c | 674 ++++++----- src/win32/demon/win32_demon.h | 390 ++++--- .../window_manager/win32_window_manager.c | 878 +++++++------- .../window_manager/win32_window_manager.h | 82 +- .../generated/window_manager.meta.c | 4 +- .../generated/window_manager.meta.h | 296 ++--- src/window_manager/window_manager.c | 280 ++--- src/window_manager/window_manager.h | 230 ++-- src/window_manager/window_manager.mdesk | 14 +- src/window_manager/window_manager_stub.c | 120 +- src/window_manager/window_manager_stub.h | 6 +- 52 files changed, 3086 insertions(+), 3115 deletions(-) diff --git a/project.4coder b/project.4coder index 497a4b4f..d796d70e 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/base/base_arena.c b/src/base/base_arena.c index 626a66fd..e754399d 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -51,7 +51,7 @@ arena_alloc_(ArenaParams *params) #if OS_FEATURE_GRAPHICAL if(Unlikely(base == 0)) { - os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); + wm_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); abort_self(1); } #endif @@ -212,7 +212,7 @@ arena_push(Arena *arena, U64 size, U64 align, B32 zero) #if OS_FEATURE_GRAPHICAL if(Unlikely(result == 0)) { - os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); + wm_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); abort_self(1); } #endif diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index 327e0a33..f7fdcf22 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -78,8 +78,8 @@ main_thread_base_entry_point(int arguments_count, char **arguments) #if defined(DBG_ENGINE_CORE_H) && !defined(D_INIT_MANUAL) d_init(); #endif -#if defined(OS_GFX_H) && !defined(OS_GFX_INIT_MANUAL) - os_gfx_init(); +#if defined(WINDOW_MANAGER_H) && !defined(WM_INIT_MANUAL) + wm_init(); #endif #if defined(FONT_PROVIDER_H) && !defined(FP_INIT_MANUAL) fp_init(); diff --git a/src/config/config_bindings.c b/src/config/config_bindings.c index 5d95b3a7..87315dba 100644 --- a/src/config/config_bindings.c +++ b/src/config/config_bindings.c @@ -24,21 +24,21 @@ cfg_key_map_from_cfg(Arena *arena) for(CFG_Node *child = keybinding->first; child != &cfg_nil_node; child = child->next) { if(0){} - else if(str8_match(child->string, str8_lit("ctrl"), 0)) { binding.modifiers |= OS_Modifier_Ctrl; } - else if(str8_match(child->string, str8_lit("alt"), 0)) { binding.modifiers |= OS_Modifier_Alt; } - else if(str8_match(child->string, str8_lit("shift"), 0)) { binding.modifiers |= OS_Modifier_Shift; } + else if(str8_match(child->string, str8_lit("ctrl"), 0)) { binding.modifiers |= WM_Modifier_Ctrl; } + else if(str8_match(child->string, str8_lit("alt"), 0)) { binding.modifiers |= WM_Modifier_Alt; } + else if(str8_match(child->string, str8_lit("shift"), 0)) { binding.modifiers |= WM_Modifier_Shift; } else { - OS_Key key = OS_Key_Null; - for EachEnumVal(OS_Key, k) + WM_Key key = WM_Key_Null; + for EachEnumVal(WM_Key, k) { - if(str8_match(child->string, os_g_key_cfg_string_table[k], StringMatchFlag_CaseInsensitive)) + if(str8_match(child->string, wm_key_cfg_name_table[k], StringMatchFlag_CaseInsensitive)) { key = k; break; } } - if(key != OS_Key_Null) + if(key != WM_Key_Null) { binding.key = key; } diff --git a/src/config/config_bindings.h b/src/config/config_bindings.h index 8bb875e3..4b283447 100644 --- a/src/config/config_bindings.h +++ b/src/config/config_bindings.h @@ -7,8 +7,8 @@ typedef struct CFG_Binding CFG_Binding; struct CFG_Binding { - OS_Key key; - OS_Modifiers modifiers; + WM_Key key; + WM_Modifiers modifiers; }; typedef struct CFG_KeyMapNode CFG_KeyMapNode; diff --git a/src/config/config_inc.c b/src/config/config_inc.c index f927a51d..e0820d64 100644 --- a/src/config/config_inc.c +++ b/src/config/config_inc.c @@ -3,6 +3,6 @@ #include "config_core.c" #include "config_panels.c" -#if defined(OS_GFX_H) +#if defined(WINDOW_MANAGER_H) # include "config_bindings.c" #endif diff --git a/src/config/config_inc.h b/src/config/config_inc.h index 0460d200..141e22ca 100644 --- a/src/config/config_inc.h +++ b/src/config/config_inc.h @@ -6,7 +6,7 @@ #include "config_core.h" #include "config_panels.h" -#if defined(OS_GFX_H) +#if defined(WINDOW_MANAGER_H) # include "config_bindings.h" #endif diff --git a/src/draw/draw.c b/src/draw/draw.c index 7ba72da1..517cad79 100644 --- a/src/draw/draw.c +++ b/src/draw/draw.c @@ -226,7 +226,7 @@ dr_begin_frame(FNT_Tag icon_font) } internal void -dr_submit_bucket(OS_Window os_window, R_Handle r_window, DR_Bucket *bucket) +dr_submit_bucket(WM_Window os_window, R_Handle r_window, DR_Bucket *bucket) { r_window_submit(os_window, r_window, &bucket->passes); } diff --git a/src/draw/draw.h b/src/draw/draw.h index c4ab7ab2..a971b6ad 100644 --- a/src/draw/draw.h +++ b/src/draw/draw.h @@ -134,7 +134,7 @@ internal Vec2F32 dr_dim_from_fstrs(F32 tab_size_px, DR_FStrList *fstrs); // (Frame boundaries & bucket submission) internal void dr_begin_frame(FNT_Tag icon_font); -internal void dr_submit_bucket(OS_Window os_window, R_Handle r_window, DR_Bucket *bucket); +internal void dr_submit_bucket(WM_Window os_window, R_Handle r_window, DR_Bucket *bucket); //////////////////////////////// //~ rjf: Bucket Construction & Selection API diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index eb4fb355..c4e31087 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -71,7 +71,7 @@ os_lnx_file_properties_from_stat(struct stat *s) internal void os_lnx_safe_call_sig_handler(int x) { - OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain; + LNX_SafeCallChain *chain = os_lnx_safe_call_chain; if(chain != 0 && chain->fail_handler != 0) { chain->fail_handler(chain->ptr); @@ -82,10 +82,10 @@ os_lnx_safe_call_sig_handler(int x) //////////////////////////////// //~ rjf: Entities -internal OS_LNX_Entity * -os_lnx_entity_alloc(OS_LNX_EntityKind kind) +internal LNX_Entity * +os_lnx_entity_alloc(LNX_EntityKind kind) { - OS_LNX_Entity *entity = 0; + LNX_Entity *entity = 0; DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), pthread_mutex_unlock(&os_lnx_state.entity_mutex)) { @@ -96,7 +96,7 @@ os_lnx_entity_alloc(OS_LNX_EntityKind kind) } else { - entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1); + entity = push_array_no_zero(os_lnx_state.entity_arena, LNX_Entity, 1); } } MemoryZeroStruct(entity); @@ -105,7 +105,7 @@ os_lnx_entity_alloc(OS_LNX_EntityKind kind) } internal void -os_lnx_entity_release(OS_LNX_Entity *entity) +os_lnx_entity_release(LNX_Entity *entity) { DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), pthread_mutex_unlock(&os_lnx_state.entity_mutex)) @@ -120,7 +120,7 @@ os_lnx_entity_release(OS_LNX_Entity *entity) internal void * os_lnx_thread_entry_point(void *ptr) { - OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr; + LNX_Entity *entity = (LNX_Entity *)ptr; ThreadEntryPointFunctionType *func = entity->thread.func; void *thread_ptr = entity->thread.ptr; supplement_thread_base_entry_point(func, thread_ptr); @@ -353,7 +353,7 @@ set_platform_thread_name(String8 name) internal Thread thread_launch(ThreadEntryPointFunctionType *f, void *p) { - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread); + LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Thread); entity->thread.func = f; entity->thread.ptr = p; { @@ -372,7 +372,7 @@ internal B32 thread_join(Thread thread, U64 endt_us) { if(MemoryIsZeroStruct(&thread)) { return 0; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)thread.u64[0]; + LNX_Entity *entity = (LNX_Entity *)thread.u64[0]; int join_result = pthread_join(entity->thread.handle, 0); B32 result = (join_result == 0); os_lnx_entity_release(entity); @@ -383,7 +383,7 @@ internal void thread_detach(Thread thread) { if(MemoryIsZeroStruct(&thread)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)thread.u64[0]; + LNX_Entity *entity = (LNX_Entity *)thread.u64[0]; os_lnx_entity_release(entity); } @@ -395,7 +395,7 @@ thread_detach(Thread thread) internal Mutex mutex_alloc(void) { - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex); + LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Mutex); int init_result = pthread_mutex_init(&entity->mutex_handle, 0); if(init_result == -1) { @@ -410,7 +410,7 @@ internal void mutex_release(Mutex mutex) { if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + LNX_Entity *entity = (LNX_Entity *)mutex.u64[0]; pthread_mutex_destroy(&entity->mutex_handle); os_lnx_entity_release(entity); } @@ -419,7 +419,7 @@ internal void mutex_take(Mutex mutex) { if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + LNX_Entity *entity = (LNX_Entity *)mutex.u64[0]; pthread_mutex_lock(&entity->mutex_handle); } @@ -427,7 +427,7 @@ internal void mutex_drop(Mutex mutex) { if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + LNX_Entity *entity = (LNX_Entity *)mutex.u64[0]; pthread_mutex_unlock(&entity->mutex_handle); } @@ -436,7 +436,7 @@ mutex_drop(Mutex mutex) internal RWMutex rw_mutex_alloc(void) { - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex); + LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_RWMutex); int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0); if(init_result == -1) { @@ -451,7 +451,7 @@ internal void rw_mutex_release(RWMutex mutex) { if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + LNX_Entity *entity = (LNX_Entity *)mutex.u64[0]; pthread_rwlock_destroy(&entity->rwmutex_handle); os_lnx_entity_release(entity); } @@ -460,7 +460,7 @@ internal void rw_mutex_take(RWMutex mutex, B32 write_mode) { if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + LNX_Entity *entity = (LNX_Entity *)mutex.u64[0]; if(write_mode) { pthread_rwlock_wrlock(&entity->rwmutex_handle); @@ -475,7 +475,7 @@ internal void rw_mutex_drop(RWMutex mutex, B32 write_mode) { if(MemoryIsZeroStruct(&mutex)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; + LNX_Entity *entity = (LNX_Entity *)mutex.u64[0]; pthread_rwlock_unlock(&entity->rwmutex_handle); } @@ -484,7 +484,7 @@ rw_mutex_drop(RWMutex mutex, B32 write_mode) internal CondVar cond_var_alloc(void) { - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable); + LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_ConditionVariable); int init_result = pthread_cond_init(&entity->cv.cond_handle, 0); if(init_result == -1) { @@ -510,7 +510,7 @@ internal void cond_var_release(CondVar cv) { if(MemoryIsZeroStruct(&cv)) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0]; + LNX_Entity *entity = (LNX_Entity *)cv.u64[0]; pthread_cond_destroy(&entity->cv.cond_handle); pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle); os_lnx_entity_release(entity); @@ -521,8 +521,8 @@ cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us) { if(MemoryIsZeroStruct(&cv)) { return 0; } if(MemoryIsZeroStruct(&mutex)) { return 0; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0]; + LNX_Entity *cv_entity = (LNX_Entity *)cv.u64[0]; + LNX_Entity *mutex_entity = (LNX_Entity *)mutex.u64[0]; struct timespec endt_timespec; endt_timespec.tv_sec = endt_us/Million(1); endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); @@ -540,8 +540,8 @@ cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) // if(MemoryIsZeroStruct(&cv)) { return 0; } if(MemoryIsZeroStruct(&mutex_rw)) { return 0; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; + LNX_Entity *cv_entity = (LNX_Entity *)cv.u64[0]; + LNX_Entity *rw_mutex_entity = (LNX_Entity *)mutex_rw.u64[0]; struct timespec endt_timespec; endt_timespec.tv_sec = endt_us/Million(1); endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); @@ -585,7 +585,7 @@ internal void cond_var_signal(CondVar cv) { if(MemoryIsZeroStruct(&cv)) { return; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + LNX_Entity *cv_entity = (LNX_Entity *)cv.u64[0]; pthread_cond_signal(&cv_entity->cv.cond_handle); } @@ -593,7 +593,7 @@ internal void cond_var_broadcast(CondVar cv) { if(MemoryIsZeroStruct(&cv)) { return; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; + LNX_Entity *cv_entity = (LNX_Entity *)cv.u64[0]; pthread_cond_broadcast(&cv_entity->cv.cond_handle); } @@ -713,7 +713,7 @@ semaphore_drop(Semaphore semaphore) internal Barrier barrier_alloc(U64 count) { - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Barrier); + LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Barrier); if(entity != 0) { pthread_barrier_init(&entity->barrier, 0, count); @@ -725,7 +725,7 @@ barrier_alloc(U64 count) internal void barrier_release(Barrier barrier) { - OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]); + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(barrier.u64[0]); if(entity != 0) { pthread_barrier_destroy(&entity->barrier); @@ -736,7 +736,7 @@ barrier_release(Barrier barrier) internal void barrier_wait(Barrier barrier) { - OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]); + LNX_Entity *entity = (LNX_Entity*)PtrFromInt(barrier.u64[0]); if(entity != 0) { pthread_barrier_wait(&entity->barrier); @@ -750,7 +750,7 @@ internal void safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr) { // rjf: push handler to chain - OS_LNX_SafeCallChain chain = {0}; + LNX_SafeCallChain chain = {0}; SLLStackPush(os_lnx_safe_call_chain, &chain); chain.fail_handler = fail_handler; chain.ptr = ptr; @@ -1088,7 +1088,7 @@ file_iter_begin(Arena *arena, String8 path, FileIterFlags flags) { FileIter *base_iter = push_array(arena, FileIter, 1); base_iter->flags = flags; - OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory; + LNX_FileIter *iter = (LNX_FileIter *)base_iter->memory; { String8 path_copy = push_str8_copy(arena, path); iter->dir = opendir((char *)path_copy.str); @@ -1101,7 +1101,7 @@ internal B32 file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out) { B32 good = 0; - OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; + LNX_FileIter *lnx_iter = (LNX_FileIter *)iter->memory; for(;lnx_iter->dir != 0;) { // rjf: get next entry @@ -1152,7 +1152,7 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out) internal void file_iter_end(FileIter *iter) { - OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; + LNX_FileIter *lnx_iter = (LNX_FileIter *)iter->memory; closedir(lnx_iter->dir); } diff --git a/src/linux/base/linux_base.h b/src/linux/base/linux_base.h index a4b069da..b78cbdc3 100644 --- a/src/linux/base/linux_base.h +++ b/src/linux/base/linux_base.h @@ -41,7 +41,7 @@ typedef struct timespec timespec; //////////////////////////////// //~ rjf: Linux Call Interruption Retry Helper -#define OS_LNX_RETRY_ON_EINTR(expr) \ +#define LNX_RETRY_ON_EINTR(expr) \ (__extension__({ \ __typeof__(expr) __ret; \ do { \ @@ -54,22 +54,22 @@ __ret; \ //////////////////////////////// //~ rjf: File Iterator -typedef struct OS_LNX_FileIter OS_LNX_FileIter; -struct OS_LNX_FileIter +typedef struct LNX_FileIter LNX_FileIter; +struct LNX_FileIter { DIR *dir; struct dirent *dp; String8 path; }; -StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check); +StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(LNX_FileIter), os_lnx_file_iter_size_check); //////////////////////////////// //~ rjf: Safe Call Handler Chain -typedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain; -struct OS_LNX_SafeCallChain +typedef struct LNX_SafeCallChain LNX_SafeCallChain; +struct LNX_SafeCallChain { - OS_LNX_SafeCallChain *next; + LNX_SafeCallChain *next; ThreadEntryPointFunctionType *fail_handler; void *ptr; }; @@ -77,21 +77,21 @@ struct OS_LNX_SafeCallChain //////////////////////////////// //~ rjf: Entities -typedef enum OS_LNX_EntityKind +typedef enum LNX_EntityKind { - OS_LNX_EntityKind_Thread, - OS_LNX_EntityKind_Mutex, - OS_LNX_EntityKind_RWMutex, - OS_LNX_EntityKind_ConditionVariable, - OS_LNX_EntityKind_Barrier, + LNX_EntityKind_Thread, + LNX_EntityKind_Mutex, + LNX_EntityKind_RWMutex, + LNX_EntityKind_ConditionVariable, + LNX_EntityKind_Barrier, } -OS_LNX_EntityKind; +LNX_EntityKind; -typedef struct OS_LNX_Entity OS_LNX_Entity; -struct OS_LNX_Entity +typedef struct LNX_Entity LNX_Entity; +struct LNX_Entity { - OS_LNX_Entity *next; - OS_LNX_EntityKind kind; + LNX_Entity *next; + LNX_EntityKind kind; union { struct @@ -114,15 +114,15 @@ struct OS_LNX_Entity //////////////////////////////// //~ rjf: State -typedef struct OS_LNX_State OS_LNX_State; -struct OS_LNX_State +typedef struct LNX_State LNX_State; +struct LNX_State { Arena *arena; SystemInfo system_info; ProcessInfo process_info; pthread_mutex_t entity_mutex; Arena *entity_arena; - OS_LNX_Entity *entity_free; + LNX_Entity *entity_free; U64 default_env_count; char **default_env; }; @@ -130,8 +130,8 @@ struct OS_LNX_State //////////////////////////////// //~ rjf: Globals -global OS_LNX_State os_lnx_state = {0}; -thread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0; +global LNX_State os_lnx_state = {0}; +thread_static LNX_SafeCallChain *os_lnx_safe_call_chain = 0; //////////////////////////////// //~ rjf: Helpers @@ -146,8 +146,8 @@ internal void os_lnx_safe_call_sig_handler(int x); //////////////////////////////// //~ rjf: Entities -internal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind); -internal void os_lnx_entity_release(OS_LNX_Entity *entity); +internal LNX_Entity *os_lnx_entity_alloc(LNX_EntityKind kind); +internal void os_lnx_entity_release(LNX_Entity *entity); //////////////////////////////// //~ rjf: Thread Entry Point diff --git a/src/linux/demon/linux_demon.c b/src/linux/demon/linux_demon.c index 6c1767dc..0503c2de 100644 --- a/src/linux/demon/linux_demon.c +++ b/src/linux/demon/linux_demon.c @@ -11,13 +11,13 @@ //////////////////////////////// internal U64 -dmn_lnx_size_from_fd(int memory_fd, U64 cap) +lnx_dmn_size_from_fd(int memory_fd, U64 cap) { U8 temp[4096]; size_t cursor = 0; while(cursor < cap) { - ssize_t actual_read = OS_LNX_RETRY_ON_EINTR(pread(memory_fd, temp, sizeof(temp), cursor)); + ssize_t actual_read = LNX_RETRY_ON_EINTR(pread(memory_fd, temp, sizeof(temp), cursor)); if(actual_read <= 0) { break; } cursor += (U64)actual_read; } @@ -25,13 +25,13 @@ dmn_lnx_size_from_fd(int memory_fd, U64 cap) } internal U64 -dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst) +lnx_dmn_read(int memory_fd, Rng1U64 range, void *dst) { size_t cursor = 0, size = dim_1u64(range); while(cursor < size) { size_t to_read = size - cursor; - ssize_t actual_read = OS_LNX_RETRY_ON_EINTR(pread(memory_fd, (U8 *)dst + cursor, to_read, range.min + cursor)); + ssize_t actual_read = LNX_RETRY_ON_EINTR(pread(memory_fd, (U8 *)dst + cursor, to_read, range.min + cursor)); if(actual_read < 0) { break; } if(actual_read == 0) { break; } cursor += actual_read; @@ -40,13 +40,13 @@ dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst) } internal B32 -dmn_lnx_write(int memory_fd, Rng1U64 range, void *src) +lnx_dmn_write(int memory_fd, Rng1U64 range, void *src) { size_t cursor = 0, size = dim_1u64(range); while(cursor < size) { size_t to_write = size - cursor; - ssize_t actual_write = OS_LNX_RETRY_ON_EINTR(pwrite(memory_fd, (U8 *)src + cursor, to_write, range.min + cursor)); + ssize_t actual_write = LNX_RETRY_ON_EINTR(pwrite(memory_fd, (U8 *)src + cursor, to_write, range.min + cursor)); if(actual_write <= 0) { break; } cursor += actual_write; } @@ -55,14 +55,14 @@ dmn_lnx_write(int memory_fd, Rng1U64 range, void *src) } internal String8 -dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size) +lnx_dmn_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size) { String8 result = {0}; U64 string_size = 0; for(U64 vaddr = base_vaddr; string_size < cap_size; vaddr += 1, string_size += 1) { char byte = 0; - if(OS_LNX_RETRY_ON_EINTR(pread(memory_fd, &byte, sizeof(byte), vaddr) <= 0)) + if(LNX_RETRY_ON_EINTR(pread(memory_fd, &byte, sizeof(byte), vaddr) <= 0)) { break; } @@ -74,7 +74,7 @@ dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_ if(string_size != 0) { char *buf = push_array_no_zero(arena, char, string_size+1); - OS_LNX_RETRY_ON_EINTR(pread(memory_fd, buf, string_size, base_vaddr)); + LNX_RETRY_ON_EINTR(pread(memory_fd, buf, string_size, base_vaddr)); buf[string_size] = '\0'; result = str8((U8 *)buf, string_size); } @@ -82,27 +82,27 @@ dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_ } internal String8 -dmn_lnx_read_string(Arena *arena, int memory_fd, U64 vaddr) +lnx_dmn_read_string(Arena *arena, int memory_fd, U64 vaddr) { - return dmn_lnx_read_string_capped(arena, memory_fd, vaddr, 4096); + return lnx_dmn_read_string_capped(arena, memory_fd, vaddr, 4096); } internal -MACHINE_OP_MEM_READ(dmn_lnx_machine_op_mem_read) +MACHINE_OP_MEM_READ(lnx_dmn_machine_op_mem_read) { - U64 read_size = dmn_lnx_read(*(int *)ud, r1u64(addr, addr + buffer_size), buffer); + U64 read_size = lnx_dmn_read(*(int *)ud, r1u64(addr, addr + buffer_size), buffer); return read_size == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; } internal int -dmn_lnx_ptrace_seize(pid_t pid) +lnx_dmn_ptrace_seize(pid_t pid) { // TODO: PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACEFORK - return OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE)); + return LNX_RETRY_ON_EINTR(ptrace(PTRACE_SEIZE, pid, 0, PTRACE_O_TRACEEXEC | PTRACE_O_EXITKILL | PTRACE_O_TRACECLONE)); } internal String8 -dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) +lnx_dmn_exe_path_from_pid(Arena *arena, pid_t pid) { Temp scratch = scratch_begin(&arena, 1); @@ -133,19 +133,19 @@ dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid) } internal String8 -dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) +lnx_dmn_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) { Temp scratch = scratch_begin(&arena, 1); String8 dl_path = {0}; - int maps_fd = OS_LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY)); + int maps_fd = LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/maps", pid).str, O_RDONLY)); if(maps_fd != -1) { // read entire /proc/pid/maps - U64 maps_size = dmn_lnx_size_from_fd(maps_fd, MB(1)); + U64 maps_size = lnx_dmn_size_from_fd(maps_fd, MB(1)); U8 *maps_ptr = push_array(scratch.arena, U8, maps_size); - U64 read_size = dmn_lnx_read(maps_fd, r1u64(0, maps_size), maps_ptr); + U64 read_size = lnx_dmn_read(maps_fd, r1u64(0, maps_size), maps_ptr); // split map file on lines String8List lines = str8_split_by_string_chars(scratch.arena, str8(maps_ptr, maps_size), str8_lit("\n"), 0); @@ -195,7 +195,7 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) } } - OS_LNX_RETRY_ON_EINTR(close(maps_fd)); + LNX_RETRY_ON_EINTR(close(maps_fd)); } else { Assert(0 && "failed to open DL fd"); } @@ -205,7 +205,7 @@ dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base) } internal ELF_Hdr64 -dmn_lnx_ehdr_from_pid(pid_t pid) +lnx_dmn_ehdr_from_pid(pid_t pid) { Temp scratch = scratch_begin(0, 0); @@ -213,12 +213,12 @@ dmn_lnx_ehdr_from_pid(pid_t pid) B32 is_read = 0; char *exe_path = (char *)str8f(scratch.arena, "/proc/%d/exe", pid).str; - int exe_fd = OS_LNX_RETRY_ON_EINTR(open(exe_path, O_RDONLY)); + int exe_fd = LNX_RETRY_ON_EINTR(open(exe_path, O_RDONLY)); if(exe_fd >= 0) { - is_read = elf_read_ehdr(dmn_lnx_machine_op_mem_read, &exe_fd, 0, &exe); - OS_LNX_RETRY_ON_EINTR(close(exe_fd)); + is_read = elf_read_ehdr(lnx_dmn_machine_op_mem_read, &exe_fd, 0, &exe); + LNX_RETRY_ON_EINTR(close(exe_fd)); } Assert(is_read); @@ -226,15 +226,15 @@ dmn_lnx_ehdr_from_pid(pid_t pid) return exe; } -internal DMN_LNX_Auxv -dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) +internal LNX_DMN_Auxv +lnx_dmn_auxv_from_pid(pid_t pid, ELF_Class elf_class) { Temp scratch = scratch_begin(0, 0); - DMN_LNX_Auxv result = {0}; + LNX_DMN_Auxv result = {0}; // rjf: open aux data String8 auxv_path = str8f(scratch.arena, "/proc/%d/auxv", pid); - int auxv_fd = OS_LNX_RETRY_ON_EINTR(open((char *)auxv_path.str, O_RDONLY)); + int auxv_fd = LNX_RETRY_ON_EINTR(open((char *)auxv_path.str, O_RDONLY)); // rjf: scan aux data if(auxv_fd >= 0) @@ -273,34 +273,34 @@ dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class) } } brkloop:; - OS_LNX_RETRY_ON_EINTR(close(auxv_fd)); + LNX_RETRY_ON_EINTR(close(auxv_fd)); } scratch_end(scratch); return result; } -internal DMN_LNX_Thread * -dmn_lnx_thread_from_pid(pid_t tid) +internal LNX_DMN_Thread * +lnx_dmn_thread_from_pid(pid_t tid) { - return hash_table_search_u64_raw(dmn_lnx_state->tid_ht, tid); + return hash_table_search_u64_raw(lnx_dmn_state->tid_ht, tid); } -internal DMN_LNX_Process * -dmn_lnx_process_from_pid(pid_t pid) +internal LNX_DMN_Process * +lnx_dmn_process_from_pid(pid_t pid) { - return hash_table_search_u64_raw(dmn_lnx_state->pid_ht, pid); + return hash_table_search_u64_raw(lnx_dmn_state->pid_ht, pid); } internal Rng1U64 -dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) +lnx_dmn_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) { Rng1U64 result = { .min = max_U64 }; for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) { ELF_Phdr64 phdr = {0}; - if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) + if(elf_read_phdr(lnx_dmn_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) { Assert(0 && "unable to read a program header"); } @@ -317,15 +317,15 @@ dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 return result; } -internal DMN_LNX_DynamicInfo -dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr) +internal LNX_DMN_DynamicInfo +lnx_dmn_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr) { - DMN_LNX_DynamicInfo dynamic_info = {0}; + LNX_DMN_DynamicInfo dynamic_info = {0}; for(U64 dynamic_cursor = dynamic_vaddr; ; dynamic_cursor += elf_dyn_size_from_class(elf_class)) { // rjf: read next dyn entry ELF_Dyn64 dyn = {0}; - if(elf_read_dyn(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_cursor, elf_class, &dyn) != MachineOpResult_Ok) { Assert(0 && "unable to read dynamic"); } + if(elf_read_dyn(lnx_dmn_machine_op_mem_read, &memory_fd, dynamic_cursor, elf_class, &dyn) != MachineOpResult_Ok) { Assert(0 && "unable to read dynamic"); } // rjf: break on zero if(dyn.tag == ELF_DynTag_Null) { break; } @@ -360,14 +360,14 @@ dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, } internal U64 -dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) +lnx_dmn_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) { U64 result = max_U64; for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum); ph_cursor < ph_opl; ph_cursor += e_phentsize) { ELF_Phdr64 phdr = {0}; - if(elf_read_phdr(dmn_lnx_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) + if(elf_read_phdr(lnx_dmn_machine_op_mem_read, &memory_fd, ph_cursor, elf_class, &phdr) != MachineOpResult_Ok) { Assert(0 && "unable to read a program header"); } @@ -383,7 +383,7 @@ dmn_lnx_find_dynamic_phdr(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_ } internal U64 -dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) +lnx_dmn_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased) { Temp scratch = scratch_begin(0, 0); @@ -391,18 +391,18 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased // load DL's header ELF_Hdr64 ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, loader_vbase, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); goto exit; } + if(elf_read_ehdr(lnx_dmn_machine_op_mem_read, &memory_fd, loader_vbase, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); goto exit; } U64 rebase = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0; ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class]; // find dynamic program header U64 phdr_vaddr = loader_vbase + ehdr.e_phoff; - U64 dynamic_vaddr = dmn_lnx_find_dynamic_phdr(memory_fd, elf_class, rebase, phdr_vaddr, ehdr.e_phentsize, ehdr.e_phentsize); + U64 dynamic_vaddr = lnx_dmn_find_dynamic_phdr(memory_fd, elf_class, rebase, phdr_vaddr, ehdr.e_phentsize, ehdr.e_phentsize); // extract necessary info out of dynamic program header U64 dynamic_info_rebase = is_rebased ? 0 : rebase; - DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, dynamic_info_rebase, dynamic_vaddr); + LNX_DMN_DynamicInfo dynamic_info = lnx_dmn_dynamic_info_from_memory(memory_fd, elf_class, dynamic_info_rebase, dynamic_vaddr); // extract symbol table count from available options U64 symbol_count = 0; @@ -415,7 +415,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased } U64 chain_count = 0; - if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) + if(lnx_dmn_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size) { symbol_count = chain_count; } @@ -436,7 +436,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased for EachIndex(symbol_idx, symbol_count) { ELF_Sym64 symbol = {0}; - if(elf_read_symbol(dmn_lnx_machine_op_mem_read, &memory_fd, dynamic_info.symtab_vaddr + symbol_idx * dynamic_info.symtab_entry_size, elf_class, &symbol) != MachineOpResult_Ok) + if(elf_read_symbol(lnx_dmn_machine_op_mem_read, &memory_fd, dynamic_info.symtab_vaddr + symbol_idx * dynamic_info.symtab_entry_size, elf_class, &symbol) != MachineOpResult_Ok) { Assert(0 && "failed to read symbol table"); break; @@ -448,7 +448,7 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased if(symbol.st_name < dynamic_info.strtab_size) { U64 cap = dynamic_info.strtab_size - symbol.st_name; - symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); + symbol_name = lnx_dmn_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap); } if(str8_match(symbol_name, str8_lit("_r_debug"), 0)) @@ -470,19 +470,19 @@ dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased return rdebug_vaddr; } -internal DMN_LNX_ProbeList -dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) +internal LNX_DMN_ProbeList +lnx_dmn_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) { Temp scratch = scratch_begin(&arena, 1); - DMN_LNX_ProbeList probes = {0}; + LNX_DMN_ProbeList probes = {0}; ELF_Hdr64 ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &fd, offset, &ehdr) != MachineOpResult_Ok) { goto exit; } + if(elf_read_ehdr(lnx_dmn_machine_op_mem_read, &fd, offset, &ehdr) != MachineOpResult_Ok) { goto exit; } U64 strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize; ELF_Shdr64 strtab_shdr = {0}; - if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr) != MachineOpResult_Ok) { goto exit; } + if(elf_read_shdr(lnx_dmn_machine_op_mem_read, &fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr) != MachineOpResult_Ok) { goto exit; } B32 found_probes = 0; B32 found_probes_base = 0; @@ -493,13 +493,13 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) shdr_off < shdr_opl; shdr_off += ehdr.e_shentsize) { ELF_Shdr64 shdr = {0}; - if(elf_read_shdr(dmn_lnx_machine_op_mem_read, &fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr) != MachineOpResult_Ok) { goto exit; } + if(elf_read_shdr(lnx_dmn_machine_op_mem_read, &fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr) != MachineOpResult_Ok) { goto exit; } if(shdr.sh_type == ELF_ShType_Note) { U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; - String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); + String8 name = lnx_dmn_read_string_capped(scratch.arena, fd, name_offset, name_cap); if(str8_match(name, str8_lit(".note.stapsdt"), 0)) { @@ -511,7 +511,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) { U64 name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name; U64 name_cap = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size; - String8 name = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap); + String8 name = lnx_dmn_read_string_capped(scratch.arena, fd, name_offset, name_cap); if(str8_match(name, str8_lit(".stapsdt.base"), 0)) { @@ -532,7 +532,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) Rng1U64 note_range = shift_1u64(r1u64(stapsdt_shdr.sh_offset, stapsdt_shdr.sh_offset + stapsdt_shdr.sh_size), offset); void *raw_note = push_array(arena, U8, stapsdt_shdr.sh_size); - U64 note_read_size = dmn_lnx_read(fd, note_range, raw_note); + U64 note_read_size = lnx_dmn_read(fd, note_range, raw_note); if(note_read_size != dim_1u64(note_range)) { goto exit; } Arch arch = arch_from_elf_machine(ehdr.e_machine); @@ -544,7 +544,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) if(!str8_match(note->owner, str8_lit("stapsdt"), 0)) { continue; } if(note->type != ELF_NoteType_STapSdt) { continue; } - DMN_LNX_Probe probe = {0}; + LNX_DMN_Probe probe = {0}; { U64 cursor = 0; U64 addr_size = ehdr.e_ident[ELF_Identifier_Class] == ELF_Class_64 ? 8 : 4; @@ -585,7 +585,7 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) probe.semaphore = semaphore ? semaphore + probe_rebase : 0; } - DMN_LNX_ProbeNode *n = push_array(arena, DMN_LNX_ProbeNode, 1); + LNX_DMN_ProbeNode *n = push_array(arena, LNX_DMN_ProbeNode, 1); n->v = probe; SLLQueuePush(probes.first, probes.last, n); probes.count += 1; @@ -597,25 +597,25 @@ dmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base) } internal -STAP_MEMORY_READ(dmn_lnx_stap_memory_read) +STAP_MEMORY_READ(lnx_dmn_stap_memory_read) { - DMN_LNX_Process *process = raw_ctx; - U64 bytes_read = dmn_lnx_read(process->fd, r1u64(addr, addr + read_size), buffer); + LNX_DMN_Process *process = raw_ctx; + U64 bytes_read = lnx_dmn_read(process->fd, r1u64(addr, addr + read_size), buffer); return bytes_read == read_size; } -internal DMN_LNX_Entity * -dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind) +internal LNX_DMN_Entity * +lnx_dmn_entity_alloc(LNX_DMN_EntityKind kind) { - DMN_LNX_Entity *entity = dmn_lnx_state->free_entity; + LNX_DMN_Entity *entity = lnx_dmn_state->free_entity; if(entity != 0) { - SLLStackPop(dmn_lnx_state->free_entity); + SLLStackPop(lnx_dmn_state->free_entity); } else { - entity = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 1); - dmn_lnx_state->entities_count += 1; + entity = push_array(lnx_dmn_state->entities_arena, LNX_DMN_Entity, 1); + lnx_dmn_state->entities_count += 1; } U32 gen = entity->gen; entity->gen += 1; @@ -623,54 +623,54 @@ dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind) return entity; } -internal DMN_LNX_Process * -dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocesses, B32 is_cow) +internal LNX_DMN_Process * +lnx_dmn_process_alloc(pid_t pid, LNX_DMN_ProcessState state, LNX_DMN_Process *parent_process, B32 debug_subprocesses, B32 is_cow) { Temp scratch = scratch_begin(0, 0); - DMN_LNX_Process *process = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Process)->process; + LNX_DMN_Process *process = &lnx_dmn_entity_alloc(LNX_DMN_EntityKind_Process)->process; process->pid = pid; - process->fd = OS_LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR)); + process->fd = LNX_RETRY_ON_EINTR(open((char *)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR)); process->state = state; process->debug_subprocesses = debug_subprocesses; process->is_cow = is_cow; process->parent_process = parent_process; // update pending process tracker - if(state != DMN_LNX_ProcessState_Normal) + if(state != LNX_DMN_ProcessState_Normal) { - dmn_lnx_state->process_pending_creation += 1; + lnx_dmn_state->process_pending_creation += 1; } // add process to the list - DLLPushBack(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); - dmn_lnx_state->process_count += 1; + DLLPushBack(lnx_dmn_state->first_process, lnx_dmn_state->last_process, process); + lnx_dmn_state->process_count += 1; - // push pid -> DMN_LNX_Process mapping - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->pid_ht, pid, process); + // push pid -> LNX_DMN_Process mapping + hash_table_push_u64_raw(lnx_dmn_state->arena, lnx_dmn_state->pid_ht, pid, process); scratch_end(scratch); return process; } -internal DMN_LNX_ProcessCtx * -dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) +internal LNX_DMN_ProcessCtx * +lnx_dmn_process_ctx_alloc(LNX_DMN_Process *process, B32 is_rebased) { - DMN_LNX_ProcessCtx *ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + LNX_DMN_ProcessCtx *ctx = &lnx_dmn_entity_alloc(LNX_DMN_EntityKind_ProcessCtx)->process_ctx; - ELF_Hdr64 exe_ehdr = dmn_lnx_ehdr_from_pid(process->pid); - DMN_LNX_Auxv auxv = dmn_lnx_auxv_from_pid(process->pid, exe_ehdr.e_ident[ELF_Identifier_Class]); + ELF_Hdr64 exe_ehdr = lnx_dmn_ehdr_from_pid(process->pid); + LNX_DMN_Auxv auxv = lnx_dmn_auxv_from_pid(process->pid, exe_ehdr.e_ident[ELF_Identifier_Class]); Arch arch = arch_from_elf_machine(exe_ehdr.e_machine); - U64 rdebug_vaddr = dmn_lnx_rdebug_vaddr_from_memory(process->fd, auxv.base, is_rebased); + U64 rdebug_vaddr = lnx_dmn_rdebug_vaddr_from_memory(process->fd, auxv.base, is_rebased); U64 base_vaddr = (auxv.phdr & ~(auxv.pagesz-1)); U64 rebase = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; - Rng1U64 image_vrange = dmn_lnx_compute_image_vrange(process->fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); + Rng1U64 image_vrange = lnx_dmn_compute_image_vrange(process->fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum); Arena *ctx_arena = arena_alloc(); ELF_Class dl_class; { ELF_Hdr64 ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &process->fd, auxv.base, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); } + if(elf_read_ehdr(lnx_dmn_machine_op_mem_read, &process->fd, auxv.base, &ehdr) != MachineOpResult_Ok) { Assert(0 && "failed to read interp's header"); } dl_class = ehdr.e_ident[ELF_Identifier_Class]; } @@ -681,7 +681,7 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) if(arch == Arch_x64) { X64_XSave xsave = {0}; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, process->pid, (void *)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0)) + if(LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, process->pid, (void *)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0)) { // Linux stores xcr0 bits in fxstate padding, // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25 @@ -693,27 +693,27 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) } // gather probes - DMN_LNX_Probe **known_probes = push_array(ctx_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); + LNX_DMN_Probe **known_probes = push_array(ctx_arena, LNX_DMN_Probe *, LNX_DMN_ProbeType_Count); { Temp scratch = scratch_begin(0, 0); - String8 dl_path = dmn_lnx_dl_path_from_pid(scratch.arena, process->pid, auxv.base); - int dl_fd = OS_LNX_RETRY_ON_EINTR(open((char *)dl_path.str, O_RDONLY)); + String8 dl_path = lnx_dmn_dl_path_from_pid(scratch.arena, process->pid, auxv.base); + int dl_fd = LNX_RETRY_ON_EINTR(open((char *)dl_path.str, O_RDONLY)); - DMN_LNX_ProbeList probes = {0}; + LNX_DMN_ProbeList probes = {0}; if(dl_fd >= 0) { - probes = dmn_lnx_read_probes(ctx_arena, dl_fd, 0, auxv.base); - OS_LNX_RETRY_ON_EINTR(close(dl_fd)); + probes = lnx_dmn_read_probes(ctx_arena, dl_fd, 0, auxv.base); + LNX_RETRY_ON_EINTR(close(dl_fd)); } - for EachNode(n, DMN_LNX_ProbeNode, probes.first) + for EachNode(n, LNX_DMN_ProbeNode, probes.first) { - DMN_LNX_Probe *p = &n->v; + LNX_DMN_Probe *p = &n->v; if(str8_match(p->provider, str8_lit("rtld"), 0)) { -#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; } - DMN_LNX_Probe_XList +#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[LNX_DMN_ProbeType_##_N] = p; continue ; } + LNX_DMN_Probe_XList #undef X } } @@ -721,7 +721,7 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) scratch_end(scratch); } - ctx = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + ctx = &lnx_dmn_entity_alloc(LNX_DMN_EntityKind_ProcessCtx)->process_ctx; ctx->arena = arena_alloc(); ctx->arch = arch; ctx->rdebug_vaddr = rdebug_vaddr; @@ -733,7 +733,7 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) ctx->xsave_layout = xsave_layout; // create main module - DMN_LNX_Module *main_module = dmn_lnx_module_alloc(ctx, process->fd, base_vaddr, auxv.execfn, 1, 1); + LNX_DMN_Module *main_module = lnx_dmn_module_alloc(ctx, process->fd, base_vaddr, auxv.execfn, 1, 1); // glibc has a shortcut mapping for the main module hash_table_push_u64_raw(ctx->arena, ctx->loaded_modules_ht, 0, main_module); @@ -741,8 +741,8 @@ dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased) return ctx; } -internal DMN_LNX_Thread * -dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid) +internal LNX_DMN_Thread * +lnx_dmn_thread_alloc(LNX_DMN_Process *process, LNX_DMN_ThreadState thread_state, pid_t tid) { void *reg_block; if(process->ctx->free_reg_blocks.node_count) @@ -758,14 +758,14 @@ dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, reg_block = push_array(process->ctx->arena, U8, reg_block_size); } - DMN_LNX_Thread *thread = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Thread)->thread; + LNX_DMN_Thread *thread = &lnx_dmn_entity_alloc(LNX_DMN_EntityKind_Thread)->thread; thread->tid = tid; thread->state = thread_state; thread->process = process; thread->reg_block = reg_block; - if(thread_state == DMN_LNX_ThreadState_Stopped) + if(thread_state == LNX_DMN_ThreadState_Stopped) { - thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); + thread->is_reg_block_dirty = !lnx_dmn_thread_read_reg_block(thread); } // add thread to the list @@ -773,31 +773,31 @@ dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, process->thread_count += 1; // push tid -> thread mapping - hash_table_push_u64_raw(dmn_lnx_state->arena, dmn_lnx_state->tid_ht, thread->tid, thread); + hash_table_push_u64_raw(lnx_dmn_state->arena, lnx_dmn_state->tid_ht, thread->tid, thread); // update global thread counter - if(thread_state == DMN_LNX_ThreadState_PendingCreation) + if(thread_state == LNX_DMN_ThreadState_PendingCreation) { - dmn_lnx_state->threads_pending_creation += 1; + lnx_dmn_state->threads_pending_creation += 1; } return thread; } -internal DMN_LNX_Module * -dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main) +internal LNX_DMN_Module * +lnx_dmn_module_alloc(LNX_DMN_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main) { - DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, base_vaddr); + LNX_DMN_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, base_vaddr); if(module) { goto exit; } // parse out module's ELF header ELF_Hdr64 module_ehdr = {0}; - if(elf_read_ehdr(dmn_lnx_machine_op_mem_read, &memory_fd, base_vaddr, &module_ehdr) != MachineOpResult_Ok) { goto exit; } + if(elf_read_ehdr(lnx_dmn_machine_op_mem_read, &memory_fd, base_vaddr, &module_ehdr) != MachineOpResult_Ok) { goto exit; } // gather info about module U64 module_rebase = module_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0; U64 module_phdr_vaddr = module_rebase + module_ehdr.e_phoff; - Rng1U64 module_vrange = dmn_lnx_compute_image_vrange(memory_fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); + Rng1U64 module_vrange = lnx_dmn_compute_image_vrange(memory_fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum); // read TLS index and TLS offset U64 tls_index = max_U64; @@ -809,18 +809,18 @@ dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 } else { - if(dmn_lnx_state->is_tls_detected) + if(lnx_dmn_state->is_tls_detected) { - Rng1U64 tls_modid_range = r1u64(dmn_lnx_state->tls_modid_desc.offset, dmn_lnx_state->tls_modid_desc.offset + dmn_lnx_state->tls_modid_desc.bit_size / 8); - Rng1U64 tls_offset_range = r1u64(dmn_lnx_state->tls_offset_desc.offset, dmn_lnx_state->tls_offset_desc.offset + dmn_lnx_state->tls_offset_desc.bit_size / 8); + Rng1U64 tls_modid_range = r1u64(lnx_dmn_state->tls_modid_desc.offset, lnx_dmn_state->tls_modid_desc.offset + lnx_dmn_state->tls_modid_desc.bit_size / 8); + Rng1U64 tls_offset_range = r1u64(lnx_dmn_state->tls_offset_desc.offset, lnx_dmn_state->tls_offset_desc.offset + lnx_dmn_state->tls_offset_desc.bit_size / 8); tls_modid_range = shift_1u64(tls_modid_range, base_vaddr); tls_offset_range = shift_1u64(tls_offset_range, base_vaddr); - if(!dmn_lnx_read(memory_fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } - if(!dmn_lnx_read(memory_fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } + if(!lnx_dmn_read(memory_fd, tls_modid_range, &tls_index)) { Assert(0 && "failed to read TLS index"); } + if(!lnx_dmn_read(memory_fd, tls_offset_range, &tls_offset)) { Assert(0 && "failed to read TLS offset"); } } } - module = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; + module = &lnx_dmn_entity_alloc(LNX_DMN_EntityKind_Module)->module; module->base_vaddr = base_vaddr; module->name_vaddr = name_vaddr; module->name_space_id = name_space_id; @@ -844,47 +844,47 @@ dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 } internal void -dmn_lnx_entity_release(DMN_LNX_Entity *entity) +lnx_dmn_entity_release(LNX_DMN_Entity *entity) { U32 gen = entity->gen + 1; MemoryZeroStruct(entity); entity->gen = gen; - SLLStackPush(dmn_lnx_state->free_entity, entity); + SLLStackPush(lnx_dmn_state->free_entity, entity); } internal void -dmn_lnx_process_release(DMN_LNX_Process *process) +lnx_dmn_process_release(LNX_DMN_Process *process) { // update global state - AssertAlways(dmn_lnx_state->process_count > 0); - DLLRemove(dmn_lnx_state->first_process, dmn_lnx_state->last_process, process); - dmn_lnx_state->process_count -= 1; + AssertAlways(lnx_dmn_state->process_count > 0); + DLLRemove(lnx_dmn_state->first_process, lnx_dmn_state->last_process, process); + lnx_dmn_state->process_count -= 1; // update pending process tracker - if(process->state != DMN_LNX_ProcessState_Normal) + if(process->state != LNX_DMN_ProcessState_Normal) { - Assert(dmn_lnx_state->process_pending_creation > 0); - dmn_lnx_state->process_pending_creation -= 1; + Assert(lnx_dmn_state->process_pending_creation > 0); + lnx_dmn_state->process_pending_creation -= 1; } // close memory handle - if(OS_LNX_RETRY_ON_EINTR(close(process->fd)) < 0) { Assert(0 && "failed to close memory descriptor"); } + if(LNX_RETRY_ON_EINTR(close(process->fd)) < 0) { Assert(0 && "failed to close memory descriptor"); } // remove pid mapping - hash_table_purge_u64(dmn_lnx_state->pid_ht, process->pid); + hash_table_purge_u64(lnx_dmn_state->pid_ht, process->pid); // release the context if(process->ctx) { - dmn_lnx_process_ctx_release(process->ctx); + lnx_dmn_process_ctx_release(process->ctx); } // release process entity - dmn_lnx_entity_release((DMN_LNX_Entity *)process); + lnx_dmn_entity_release((LNX_DMN_Entity *)process); } internal void -dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *ctx) +lnx_dmn_process_ctx_release(LNX_DMN_ProcessCtx *ctx) { Assert(ctx->ref_count > 0); ctx->ref_count -= 1; @@ -892,23 +892,23 @@ dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *ctx) if(ctx->ref_count == 0) { arena_release(ctx->arena); - dmn_lnx_entity_release((DMN_LNX_Entity *)ctx); + lnx_dmn_entity_release((LNX_DMN_Entity *)ctx); } } internal void -dmn_lnx_thread_release(DMN_LNX_Thread *thread) +lnx_dmn_thread_release(LNX_DMN_Thread *thread) { - DMN_LNX_Process *process = thread->process; + LNX_DMN_Process *process = thread->process; // purge tid mapping - hash_table_purge_u64(dmn_lnx_state->tid_ht, thread->tid); + hash_table_purge_u64(lnx_dmn_state->tid_ht, thread->tid); // update global thread counter - if(thread->state == DMN_LNX_ThreadState_PendingCreation) + if(thread->state == LNX_DMN_ThreadState_PendingCreation) { - AssertAlways(dmn_lnx_state->threads_pending_creation > 0); - dmn_lnx_state->threads_pending_creation -= 1; + AssertAlways(lnx_dmn_state->threads_pending_creation > 0); + lnx_dmn_state->threads_pending_creation -= 1; } // remove thread from the list @@ -929,11 +929,11 @@ dmn_lnx_thread_release(DMN_LNX_Thread *thread) reg_block_node->string = str8(thread->reg_block, 0); str8_list_push_node(&process->ctx->free_reg_blocks, reg_block_node); - dmn_lnx_entity_release((DMN_LNX_Entity *)thread); + lnx_dmn_entity_release((LNX_DMN_Entity *)thread); } internal void -dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module) +lnx_dmn_module_release(LNX_DMN_ProcessCtx *ctx, LNX_DMN_Module *module) { // remove module from the list Assert(ctx->module_count > 0); @@ -943,13 +943,13 @@ dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module) // purge base addr -> module mapping hash_table_purge_u64(ctx->loaded_modules_ht, module->base_vaddr); - dmn_lnx_entity_release((DMN_LNX_Entity *)module); + lnx_dmn_entity_release((LNX_DMN_Entity *)module); } -internal DMN_LNX_ProcessCtx * -dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) +internal LNX_DMN_ProcessCtx * +lnx_dmn_process_ctx_clone(LNX_DMN_Process *new_owner, LNX_DMN_ProcessCtx *ctx) { - DMN_LNX_ProcessCtx *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_ProcessCtx)->process_ctx; + LNX_DMN_ProcessCtx *result = &lnx_dmn_entity_alloc(LNX_DMN_EntityKind_ProcessCtx)->process_ctx; result->arena = arena_alloc(); result->arch = ctx->arch; @@ -961,11 +961,11 @@ dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) result->xsave_layout = ctx->xsave_layout; // clone probes - result->probes = push_array(result->arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count); - for EachIndex(probe_idx, DMN_LNX_ProbeType_Count) + result->probes = push_array(result->arena, LNX_DMN_Probe *, LNX_DMN_ProbeType_Count); + for EachIndex(probe_idx, LNX_DMN_ProbeType_Count) { - DMN_LNX_Probe *dst = result->probes[probe_idx]; - DMN_LNX_Probe *src = ctx->probes[probe_idx]; + LNX_DMN_Probe *dst = result->probes[probe_idx]; + LNX_DMN_Probe *src = ctx->probes[probe_idx]; dst->provider = str8_copy(result->arena, src->provider); dst->name = str8_copy(result->arena, src->name); @@ -980,7 +980,7 @@ dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) { DMN_Trap *src_trap = src->trap; DMN_Trap *dst_trap = push_array(result->arena, DMN_Trap, 1); - dst_trap->process = dmn_lnx_handle_from_process(new_owner); + dst_trap->process = lnx_dmn_handle_from_process(new_owner); dst_trap->vaddr = src_trap->vaddr; dst_trap->id = src_trap->id; dst_trap->flags = src_trap->flags; @@ -994,18 +994,18 @@ dmn_lnx_process_ctx_clone(DMN_LNX_Process *new_owner, DMN_LNX_ProcessCtx *ctx) } // clone modules - for EachNode(module, DMN_LNX_Module, ctx->first_module) + for EachNode(module, LNX_DMN_Module, ctx->first_module) { - dmn_lnx_module_clone(result, module); + lnx_dmn_module_clone(result, module); } return result; } -internal DMN_LNX_Module * -dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module) +internal LNX_DMN_Module * +lnx_dmn_module_clone(LNX_DMN_ProcessCtx *process_ctx, LNX_DMN_Module *module) { - DMN_LNX_Module *result = &dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Module)->module; + LNX_DMN_Module *result = &lnx_dmn_entity_alloc(LNX_DMN_EntityKind_Module)->module; *result = *module; result->next = result->prev = 0; @@ -1020,10 +1020,10 @@ dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module) } internal DMN_Handle -dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity) +lnx_dmn_handle_from_entity(LNX_DMN_Entity *entity) { DMN_Handle handle = {0}; - U64 index = IntFromPtr(entity - dmn_lnx_state->entities_base); + U64 index = IntFromPtr(entity - lnx_dmn_state->entities_base); if(index <= max_U32) { handle.u32[0] = index; @@ -1037,78 +1037,78 @@ dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity) } internal DMN_Handle -dmn_lnx_handle_from_process(DMN_LNX_Process *process) +lnx_dmn_handle_from_process(LNX_DMN_Process *process) { - return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)process); + return lnx_dmn_handle_from_entity((LNX_DMN_Entity *)process); } internal DMN_Handle -dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx) +lnx_dmn_handle_from_process_ctx(LNX_DMN_ProcessCtx *process_ctx) { - return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)process_ctx); + return lnx_dmn_handle_from_entity((LNX_DMN_Entity *)process_ctx); } internal DMN_Handle -dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread) +lnx_dmn_handle_from_thread(LNX_DMN_Thread *thread) { - return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)thread); + return lnx_dmn_handle_from_entity((LNX_DMN_Entity *)thread); } internal DMN_Handle -dmn_lnx_handle_from_module(DMN_LNX_Module *module) +lnx_dmn_handle_from_module(LNX_DMN_Module *module) { - return dmn_lnx_handle_from_entity((DMN_LNX_Entity *)module); + return lnx_dmn_handle_from_entity((LNX_DMN_Entity *)module); } -internal DMN_LNX_Entity * -dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind) +internal LNX_DMN_Entity * +lnx_dmn_entity_from_handle(DMN_Handle handle, LNX_DMN_EntityKind expected_kind) { - DMN_LNX_Entity *result = 0; + LNX_DMN_Entity *result = 0; U32 index = handle.u32[0]; U32 gen = handle.u32[1]; - if(index < dmn_lnx_state->entities_count && dmn_lnx_state->entities_base[index].gen == gen) + if(index < lnx_dmn_state->entities_count && lnx_dmn_state->entities_base[index].gen == gen) { - if(dmn_lnx_state->entities_base[index].kind == expected_kind) + if(lnx_dmn_state->entities_base[index].kind == expected_kind) { - result = &dmn_lnx_state->entities_base[index]; + result = &lnx_dmn_state->entities_base[index]; } } return result; } -internal DMN_LNX_Process * -dmn_lnx_process_from_handle(DMN_Handle process_handle) +internal LNX_DMN_Process * +lnx_dmn_process_from_handle(DMN_Handle process_handle) { - return (DMN_LNX_Process *)dmn_lnx_entity_from_handle(process_handle, DMN_LNX_EntityKind_Process); + return (LNX_DMN_Process *)lnx_dmn_entity_from_handle(process_handle, LNX_DMN_EntityKind_Process); } -internal DMN_LNX_ProcessCtx * -dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle) +internal LNX_DMN_ProcessCtx * +lnx_dmn_process_ctx_from_handle(DMN_Handle process_ctx_handle) { - return (DMN_LNX_ProcessCtx *)dmn_lnx_entity_from_handle(process_ctx_handle, DMN_LNX_EntityKind_ProcessCtx); + return (LNX_DMN_ProcessCtx *)lnx_dmn_entity_from_handle(process_ctx_handle, LNX_DMN_EntityKind_ProcessCtx); } -internal DMN_LNX_Thread * -dmn_lnx_thread_from_handle(DMN_Handle thread_handle) +internal LNX_DMN_Thread * +lnx_dmn_thread_from_handle(DMN_Handle thread_handle) { - return (DMN_LNX_Thread *)dmn_lnx_entity_from_handle(thread_handle, DMN_LNX_EntityKind_Thread); + return (LNX_DMN_Thread *)lnx_dmn_entity_from_handle(thread_handle, LNX_DMN_EntityKind_Thread); } -internal DMN_LNX_Module * -dmn_lnx_module_from_handle(DMN_Handle module_handle) +internal LNX_DMN_Module * +lnx_dmn_module_from_handle(DMN_Handle module_handle) { - return (DMN_LNX_Module *)dmn_lnx_entity_from_handle(module_handle, DMN_LNX_EntityKind_Module); + return (LNX_DMN_Module *)lnx_dmn_entity_from_handle(module_handle, LNX_DMN_EntityKind_Module); } internal void -dmn_lnx_process_trap_probes(DMN_LNX_Process *process) +lnx_dmn_process_trap_probes(LNX_DMN_Process *process) { - for EachIndex(i, DMN_LNX_ProbeType_Count) + for EachIndex(i, LNX_DMN_ProbeType_Count) { if(process->ctx->probes[i] == 0) { continue; } DMN_Trap *trap = push_array(process->ctx->arena, DMN_Trap, 1); - trap->process = dmn_lnx_handle_from_process(process); + trap->process = lnx_dmn_handle_from_process(process); trap->vaddr = process->ctx->probes[i]->pc; trap->id = i; @@ -1123,13 +1123,13 @@ dmn_lnx_process_trap_probes(DMN_LNX_Process *process) } internal void -dmn_lnx_process_untrap_probes(DMN_LNX_Process *process) +lnx_dmn_process_untrap_probes(LNX_DMN_Process *process) { NotImplemented; } internal U64 -dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread) +lnx_dmn_thread_read_ip(LNX_DMN_Thread *thread) { ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); U64 result = arch_ip_from_reg_block(arch_info, thread->reg_block); @@ -1137,7 +1137,7 @@ dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread) } internal U64 -dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread) +lnx_dmn_thread_read_sp(LNX_DMN_Thread *thread) { ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); U64 result = arch_sp_from_reg_block(arch_info, thread->reg_block); @@ -1145,7 +1145,7 @@ dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread) } internal void -dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip) +lnx_dmn_thread_write_ip(LNX_DMN_Thread *thread, U64 ip) { ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); arch_reg_block_write_ip(arch_info, thread->reg_block, ip); @@ -1153,7 +1153,7 @@ dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip) } internal void -dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp) +lnx_dmn_thread_write_sp(LNX_DMN_Thread *thread, U64 sp) { ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); arch_reg_block_write_sp(arch_info, thread->reg_block, sp); @@ -1161,23 +1161,23 @@ dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp) } internal B32 -dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) +lnx_dmn_thread_read_reg_block(LNX_DMN_Thread *thread) { B32 is_reg_block_read = 0; - if(thread->state == DMN_LNX_ThreadState_Stopped) + if(thread->state == LNX_DMN_ThreadState_Stopped) { switch(thread->process->ctx->arch) { default:{}break; case Arch_x64: { - DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; + LNX_DMN_ProcessCtx *process_ctx = thread->process->ctx; X64_RegBlock *dst = thread->reg_block; // general purpose registers { - OS_LNX_GprsX64 src; - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(src), .iov_base = &src })); + LNX_DMN_GprsX64 src; + int ptrace_result = LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(src), .iov_base = &src })); if(ptrace_result < 0) { goto exit; } dst->r15 = src.r15; @@ -1220,7 +1220,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) if(x64_is_xsave_supported()) { void *xsave_raw = push_array(scratch.arena, U8, process_ctx->xsave_size); - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process_ctx->xsave_size, .iov_base = xsave_raw })); + int ptrace_result = LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process_ctx->xsave_size, .iov_base = xsave_raw })); if(ptrace_result < 0) { goto exit; } xsave = xsave_raw; fxsave = &xsave->fxsave; @@ -1230,7 +1230,7 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) if(fxsave == 0) { fxsave = push_array(scratch.arena, X64_FXSave, 1); - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave })); + int ptrace_result = LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETREGSET, thread->tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave })); if(ptrace_result < 0) { goto exit; } fxsave = 0; } @@ -1334,9 +1334,9 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) { if(n != 4 && n != 5) { - U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); + U64 offset = OffsetOf(LNX_DMN_UserX64, u_debugreg[n]); errno = 0; - long peek_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_PEEKUSER, thread->tid, PtrFromInt(offset), 0)); + long peek_result = LNX_RETRY_ON_EINTR(ptrace(PTRACE_PEEKUSER, thread->tid, PtrFromInt(offset), 0)); if(errno != 0) { goto exit; } dr_d[n] = peek_result; } @@ -1352,9 +1352,9 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread) } internal B32 -dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) +lnx_dmn_thread_write_reg_block(LNX_DMN_Thread *thread) { - AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); + AssertAlways(thread->state == LNX_DMN_ThreadState_Stopped); B32 is_reg_block_written = 0; @@ -1363,12 +1363,12 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) case Arch_Null: {} break; case Arch_x64: { - DMN_LNX_ProcessCtx *process_ctx = thread->process->ctx; + LNX_DMN_ProcessCtx *process_ctx = thread->process->ctx; X64_RegBlock *src = thread->reg_block; // general purpose registers { - OS_LNX_GprsX64 dst; + LNX_DMN_GprsX64 dst; dst.r15 = src->r15; dst.r14 = src->r14; dst.r13 = src->r13; @@ -1396,7 +1396,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) dst.es = src->es; dst.fs = src->fs; dst.gs = src->gs; - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) })); + int ptrace_result = LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) })); if(ptrace_result < 0) { goto exit; } } @@ -1511,7 +1511,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) // xsave Assert(dst->header.xcomp_bv == 0); // must always be zero - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process_ctx->xsave_size })); + int ptrace_result = LNX_RETRY_ON_EINTR(ptrace(PTRACE_SETREGSET, thread->tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process_ctx->xsave_size })); if(ptrace_result < 0) { goto exit; } } @@ -1527,8 +1527,8 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) { if(n != 4 && n != 5) { - U64 offset = OffsetOf(OS_LNX_UserX64, u_debugreg[n]); - int ptrace_result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_POKEUSER, thread->tid, PtrFromInt(offset), (void*)(uintptr_t)dr_s[n])); + U64 offset = OffsetOf(LNX_DMN_UserX64, u_debugreg[n]); + int ptrace_result = LNX_RETRY_ON_EINTR(ptrace(PTRACE_POKEUSER, thread->tid, PtrFromInt(offset), (void*)(uintptr_t)dr_s[n])); if(ptrace_result < 0) { goto exit; } } } @@ -1547,7 +1547,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread) } internal B32 -dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on) +lnx_dmn_set_single_step_flag(LNX_DMN_Thread *thread, B32 is_on) { B32 is_flag_set = 0; switch(thread->process->ctx->arch) @@ -1571,42 +1571,42 @@ dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on) } internal void -dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n) +lnx_dmn_thread_ptr_list_push_node(LNX_DMN_ThreadPtrList *list, LNX_DMN_ThreadPtrNode *n) { DLLPushBack(list->first, list->last, n); list->count += 1; } -internal DMN_LNX_ThreadPtrNode * -dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v) +internal LNX_DMN_ThreadPtrNode * +lnx_dmn_thread_ptr_list_push(Arena *arena, LNX_DMN_ThreadPtrList *list, LNX_DMN_Thread *v) { - DMN_LNX_ThreadPtrNode *n = push_array(arena, DMN_LNX_ThreadPtrNode, 1); + LNX_DMN_ThreadPtrNode *n = push_array(arena, LNX_DMN_ThreadPtrNode, 1); n->v = v; - dmn_lnx_thread_ptr_list_push_node(list, n); + lnx_dmn_thread_ptr_list_push_node(list, n); return n; } internal void -dmn_lnx_thread_ptr_list_remove(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n) +lnx_dmn_thread_ptr_list_remove(LNX_DMN_ThreadPtrList *list, LNX_DMN_ThreadPtrNode *n) { DLLRemove(list->first, list->last, n); list->count -= 1; } -internal DMN_LNX_ModulePtrNode * -dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v) +internal LNX_DMN_ModulePtrNode * +lnx_dmn_module_ptr_list_push(Arena *arena, LNX_DMN_ModulePtrList *list, LNX_DMN_Module *v) { - DMN_LNX_ModulePtrNode *n = push_array(arena, DMN_LNX_ModulePtrNode, 1); + LNX_DMN_ModulePtrNode *n = push_array(arena, LNX_DMN_ModulePtrNode, 1); n->v = v; SLLQueuePush(list->first, list->last, n); list->count += 1; return n; } -internal DMN_LNX_ProcessPtrNode * -dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v) +internal LNX_DMN_ProcessPtrNode * +lnx_dmn_process_ptr_list_push(Arena *arena, LNX_DMN_ProcessPtrList *list, LNX_DMN_Process *v) { - DMN_LNX_ProcessPtrNode *n = push_array(arena, DMN_LNX_ProcessPtrNode, 1); + LNX_DMN_ProcessPtrNode *n = push_array(arena, LNX_DMN_ProcessPtrNode, 1); n->v = v; SLLQueuePush(list->first, list->last, n); list->count += 1; @@ -1614,59 +1614,59 @@ dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LN } internal void -dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +lnx_dmn_push_event_create_process(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process) { // push create process event DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_lnx_handle_from_process(process); + e->process = lnx_dmn_handle_from_process(process); e->arch = process->ctx->arch; e->code = process->pid; e->tls_model = DMN_TlsModel_Gnu; // TODO: use dynamic linker path to figure out correct enum here } internal void -dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +lnx_dmn_push_event_exit_process(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_lnx_handle_from_process(process); + e->process = lnx_dmn_handle_from_process(process); e->code = process->main_thread_exit_code; } internal void -dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread) +lnx_dmn_push_event_create_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_CreateThread; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); + e->process = lnx_dmn_handle_from_process(thread->process); + e->thread = lnx_dmn_handle_from_thread(thread); e->arch = thread->process->ctx->arch; e->code = thread->tid; } internal void -dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code) +lnx_dmn_push_event_exit_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 exit_code) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_ExitThread; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); + e->process = lnx_dmn_handle_from_process(thread->process); + e->thread = lnx_dmn_handle_from_thread(thread); e->code = exit_code; } internal void -dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module) +lnx_dmn_push_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, LNX_DMN_Module *module) { // TODO: reporting this module breaks ctrl thread - String8 module_name = dmn_lnx_read_string(arena, thread->process->fd, module->name_vaddr); + String8 module_name = lnx_dmn_read_string(arena, thread->process->fd, module->name_vaddr); if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->module = dmn_lnx_handle_from_module(module); + e->process = lnx_dmn_handle_from_process(thread->process); + e->thread = lnx_dmn_handle_from_thread(thread); + e->module = lnx_dmn_handle_from_module(module); e->arch = thread->process->ctx->arch; e->address = module->base_vaddr; e->size = module->size; @@ -1679,46 +1679,46 @@ dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thre } internal void -dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module) +lnx_dmn_push_event_unload_module(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, LNX_DMN_Module *module) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_lnx_handle_from_process(process); - e->module = dmn_lnx_handle_from_module(module); + e->process = lnx_dmn_handle_from_process(process); + e->module = lnx_dmn_handle_from_module(module); } internal void -dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process) +lnx_dmn_push_event_handshake_complete(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_HandshakeComplete; - e->process = dmn_lnx_handle_from_process(process); - e->thread = dmn_lnx_handle_from_thread(process->first_thread); + e->process = lnx_dmn_handle_from_process(process); + e->thread = lnx_dmn_handle_from_thread(process->first_thread); e->arch = process->ctx->arch; } internal void -dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address) +lnx_dmn_push_event_breakpoint(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 address) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Breakpoint; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); + e->process = lnx_dmn_handle_from_process(thread->process); + e->thread = lnx_dmn_handle_from_thread(thread); e->instruction_pointer = address; } internal void -dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread) +lnx_dmn_push_event_single_step(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_SingleStep; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + e->process = lnx_dmn_handle_from_process(thread->process); + e->thread = lnx_dmn_handle_from_thread(thread); + e->instruction_pointer = lnx_dmn_thread_read_ip(thread); } internal void -dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo) +lnx_dmn_push_event_exception(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 signo) { local_persist B8 is_repeatable[] = { @@ -1759,48 +1759,48 @@ dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Exception; - e->process = dmn_lnx_handle_from_process(thread->process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + e->process = lnx_dmn_handle_from_process(thread->process); + e->thread = lnx_dmn_handle_from_thread(thread); + e->instruction_pointer = lnx_dmn_thread_read_ip(thread); e->signo = signo; e->exception_repeated = signo < ArrayCount(is_repeatable) ? is_repeatable[signo] : 0; if(signo == SIGSEGV) { siginfo_t si = {0}; - OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, thread->tid, 0, &si)); + LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, thread->tid, 0, &si)); e->address = (U64)si.si_addr; } } internal void -dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events) +lnx_dmn_push_event_halt(Arena *arena, DMN_EventList *events) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Halt; } internal void -dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events) +lnx_dmn_push_event_not_attached(Arena *arena, DMN_EventList *events) { DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Error; e->error_kind = DMN_ErrorKind_NotAttached; } -internal DMN_LNX_Thread * -dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid) +internal LNX_DMN_Thread * +lnx_dmn_event_create_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, pid_t tid) { - DMN_LNX_Thread *thread = dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, tid); - dmn_lnx_push_event_create_thread(arena, events, thread); + LNX_DMN_Thread *thread = lnx_dmn_thread_alloc(process, LNX_DMN_ThreadState_Stopped, tid); + lnx_dmn_push_event_create_thread(arena, events, thread); return thread; } internal void -dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code) +lnx_dmn_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code) { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Process *process = thread->process; + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(tid); + LNX_DMN_Process *process = thread->process; // store main thread's exit code if(thread->tid == thread->process->pid) @@ -1809,139 +1809,139 @@ dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 ex } // push exit event - dmn_lnx_push_event_exit_thread(arena, events, thread, exit_code); + lnx_dmn_push_event_exit_thread(arena, events, thread, exit_code); // release entity - dmn_lnx_thread_release(thread); + lnx_dmn_thread_release(thread); // auto exit process on last thread if(process->thread_count == 0) { - dmn_lnx_event_exit_process(arena, events, process->pid); + lnx_dmn_event_exit_process(arena, events, process->pid); } } -internal DMN_LNX_Process * -dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags) +internal LNX_DMN_Process * +lnx_dmn_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, LNX_DMN_Process *parent_process, LNX_DMN_CreateProcessFlags flags) { - DMN_LNX_Process *process = dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Normal, parent_process, !!(flags & DMN_LNX_CreateProcessFlag_DebugSubprocesses), !!(flags & DMN_LNX_CreateProcessFlag_Cow)); + LNX_DMN_Process *process = lnx_dmn_process_alloc(pid, LNX_DMN_ProcessState_Normal, parent_process, !!(flags & LNX_DMN_CreateProcessFlag_DebugSubprocesses), !!(flags & LNX_DMN_CreateProcessFlag_Cow)); - if(flags & DMN_LNX_CreateProcessFlag_ClonedMemory) + if(flags & LNX_DMN_CreateProcessFlag_ClonedMemory) { process->ctx = parent_process->ctx; } else { - process->ctx = dmn_lnx_process_ctx_alloc(process, !!(flags & DMN_LNX_CreateProcessFlag_Rebased)); + process->ctx = lnx_dmn_process_ctx_alloc(process, !!(flags & LNX_DMN_CreateProcessFlag_Rebased)); } process->ctx->ref_count += 1; // install probes in a process that does not have a cloned memory - if(!(flags & DMN_LNX_CreateProcessFlag_ClonedMemory)) + if(!(flags & LNX_DMN_CreateProcessFlag_ClonedMemory)) { - dmn_lnx_process_trap_probes(process); + lnx_dmn_process_trap_probes(process); } // create main thread - dmn_lnx_thread_alloc(process, DMN_LNX_ThreadState_Stopped, pid); + lnx_dmn_thread_alloc(process, LNX_DMN_ThreadState_Stopped, pid); // push events - dmn_lnx_push_event_create_process(arena, events, process); - for EachNode(thread, DMN_LNX_Thread, process->first_thread) + lnx_dmn_push_event_create_process(arena, events, process); + for EachNode(thread, LNX_DMN_Thread, process->first_thread) { - dmn_lnx_push_event_create_thread(arena, events, thread); + lnx_dmn_push_event_create_thread(arena, events, thread); } - for EachNode(module, DMN_LNX_Module, process->ctx->first_module) + for EachNode(module, LNX_DMN_Module, process->ctx->first_module) { - dmn_lnx_push_event_load_module(arena, events, process->first_thread, module); + lnx_dmn_push_event_load_module(arena, events, process->first_thread, module); } - dmn_lnx_push_event_handshake_complete(arena, events, process); + lnx_dmn_push_event_handshake_complete(arena, events, process); return process; } internal void -dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) +lnx_dmn_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid) { - DMN_LNX_Process *process = dmn_lnx_process_from_pid(pid); + LNX_DMN_Process *process = lnx_dmn_process_from_pid(pid); AssertAlways(process->thread_count == 0); // push module events - for EachNode(module, DMN_LNX_Module, process->ctx->first_module) + for EachNode(module, LNX_DMN_Module, process->ctx->first_module) { - dmn_lnx_push_event_unload_module(arena, events, process, module); + lnx_dmn_push_event_unload_module(arena, events, process, module); } // push process exit event - dmn_lnx_push_event_exit_process(arena, events, process); + lnx_dmn_push_event_exit_process(arena, events, process); // release process - dmn_lnx_process_release(process); + lnx_dmn_process_release(process); } internal void -dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr) +lnx_dmn_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr) { - DMN_LNX_Process *process = thread->process; + LNX_DMN_Process *process = thread->process; GNU_LinkMap64 map = {0}; for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr) { // read out new link map item - if(gnu_read_link_map(dmn_lnx_machine_op_mem_read, &process->fd, map_vaddr, process->ctx->dl_class, &map) != MachineOpResult_Ok) { break; } + if(gnu_read_link_map(lnx_dmn_machine_op_mem_read, &process->fd, map_vaddr, process->ctx->dl_class, &map) != MachineOpResult_Ok) { break; } // was module already loaded? - DMN_LNX_Module *module = hash_table_search_u64_raw(process->ctx->loaded_modules_ht, map.addr_vaddr); + LNX_DMN_Module *module = hash_table_search_u64_raw(process->ctx->loaded_modules_ht, map.addr_vaddr); if(module) { continue; } // clone process ctx if(process->is_cow) { process->is_cow = 0; - process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); + process->ctx = lnx_dmn_process_ctx_clone(process, process->ctx); } // alloc module - module = dmn_lnx_module_alloc(process->ctx, process->fd, map.addr_vaddr, map.name_vaddr, name_space_id, 0); + module = lnx_dmn_module_alloc(process->ctx, process->fd, map.addr_vaddr, map.name_vaddr, name_space_id, 0); // push load module event - dmn_lnx_push_event_load_module(arena, events, thread, module); + lnx_dmn_push_event_load_module(arena, events, thread, module); } } internal void -dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr) +lnx_dmn_event_unload_module(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, U64 rdebug_vaddr) { Temp scratch = scratch_begin(&arena, 1); - DMN_LNX_ProcessCtx *ctx = process->ctx; + LNX_DMN_ProcessCtx *ctx = process->ctx; // flag every module as inactive - for EachNode(module, DMN_LNX_Module, ctx->first_module) + for EachNode(module, LNX_DMN_Module, ctx->first_module) { module->is_live = 0; } // mark live modules B32 is_64bit = ctx->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, rdebug_vaddr, lnx_dmn_machine_op_mem_read, &process->fd); for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { - GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, dmn_lnx_machine_op_mem_read, &process->fd); + GNU_LinkMapList link_map_list = gnu_parse_link_map_list(scratch.arena, is_64bit, rdebug_n->v.r_map, lnx_dmn_machine_op_mem_read, &process->fd); for EachNode(link_map_n, GNU_LinkMapNode, link_map_list.first) { - DMN_LNX_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, link_map_n->v.addr_vaddr); + LNX_DMN_Module *module = hash_table_search_u64_raw(ctx->loaded_modules_ht, link_map_n->v.addr_vaddr); module->is_live = 1; } } // collect unloaded modules - DMN_LNX_ModulePtrList to_release = {0}; - for EachNode(module, DMN_LNX_Module, ctx->first_module) + LNX_DMN_ModulePtrList to_release = {0}; + for EachNode(module, LNX_DMN_Module, ctx->first_module) { if(!module->is_live) { - dmn_lnx_module_ptr_list_push(scratch.arena, &to_release, module); + lnx_dmn_module_ptr_list_push(scratch.arena, &to_release, module); } } @@ -1951,31 +1951,31 @@ dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process if(process->is_cow) { process->is_cow = 0; - process->ctx = dmn_lnx_process_ctx_clone(process, process->ctx); + process->ctx = lnx_dmn_process_ctx_clone(process, process->ctx); } } // push events and clean up unloaded modules - for EachNode(module_n, DMN_LNX_ModulePtrNode, to_release.first) + for EachNode(module_n, LNX_DMN_ModulePtrNode, to_release.first) { - dmn_lnx_push_event_unload_module(arena, events, process, module_n->v); - dmn_lnx_module_release(process->ctx, module_n->v); + lnx_dmn_push_event_unload_module(arena, events, process, module_n->v); + lnx_dmn_module_release(process->ctx, module_n->v); } scratch_end(scratch); } internal void -dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid) +lnx_dmn_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid) { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); - DMN_LNX_Process *process = thread->process; - U64 ip = dmn_lnx_thread_read_ip(thread); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(tid); + LNX_DMN_Process *process = thread->process; + U64 ip = lnx_dmn_thread_read_ip(thread); // is this user trap? DMN_ActiveTrap *hit_user_trap = 0; { - DMN_Handle process_handle = dmn_lnx_handle_from_process(process); + DMN_Handle process_handle = lnx_dmn_handle_from_process(process); for EachNode(active_trap, DMN_ActiveTrap, user_traps) { if(MemoryCompare(&active_trap->trap->process, &process_handle, sizeof(DMN_Handle)) == 0) @@ -1990,7 +1990,7 @@ dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us } // is this a probe trap? - DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null; + LNX_DMN_ProbeType probe_type = LNX_DMN_ProbeType_Null; if(hit_user_trap == 0) { for EachNode(active_trap, DMN_ActiveTrap, process->ctx->first_probe_trap) @@ -2003,77 +2003,77 @@ dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us } } - if(probe_type == DMN_LNX_ProbeType_InitComplete) + if(probe_type == LNX_DMN_ProbeType_InitComplete) { B32 is_init_completed = 0; - DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_InitComplete]; + LNX_DMN_Probe *probe = process->ctx->probes[LNX_DMN_ProbeType_InitComplete]; U64 name_space_id = 0, rdebug_addr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto init_complete_exit; } - if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, lnx_dmn_stap_memory_read, process, &name_space_id)) { goto init_complete_exit; } + if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, lnx_dmn_stap_memory_read, process, &rdebug_addr)) { goto init_complete_exit; } GNU_RDebugInfo64 rdebug = {0}; - if(gnu_read_r_debug(dmn_lnx_machine_op_mem_read, &process->fd, rdebug_addr, process->ctx->arch, &rdebug) != MachineOpResult_Ok) { goto init_complete_exit; } + if(gnu_read_r_debug(lnx_dmn_machine_op_mem_read, &process->fd, rdebug_addr, process->ctx->arch, &rdebug) != MachineOpResult_Ok) { goto init_complete_exit; } if(rdebug.r_version < 1) { goto init_complete_exit; } - dmn_lnx_event_load_module(arena, events, thread, name_space_id, rdebug.r_map); + lnx_dmn_event_load_module(arena, events, thread, name_space_id, rdebug.r_map); is_init_completed = 1; init_complete_exit:; AssertAlways(is_init_completed); } - else if(probe_type == DMN_LNX_ProbeType_RelocComplete) + else if(probe_type == LNX_DMN_ProbeType_RelocComplete) { B32 is_reloc_completed = 0; - DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_RelocComplete]; + LNX_DMN_Probe *probe = process->ctx->probes[LNX_DMN_ProbeType_RelocComplete]; U64 name_space_id = 0, new_link_map_addr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto reloc_complete_exit; } - if(!stap_read_arg_u(probe->args.v[2], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr)) { goto reloc_complete_exit; } + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, lnx_dmn_stap_memory_read, process, &name_space_id)) { goto reloc_complete_exit; } + if(!stap_read_arg_u(probe->args.v[2], process->ctx->arch, thread->reg_block, lnx_dmn_stap_memory_read, process, &new_link_map_addr)) { goto reloc_complete_exit; } - dmn_lnx_event_load_module(arena, events, thread, name_space_id, new_link_map_addr); + lnx_dmn_event_load_module(arena, events, thread, name_space_id, new_link_map_addr); is_reloc_completed = 1; reloc_complete_exit:; AssertAlways(is_reloc_completed); } - else if(probe_type == DMN_LNX_ProbeType_UnmapComplete) + else if(probe_type == LNX_DMN_ProbeType_UnmapComplete) { B32 is_unmap_completed = 0; - DMN_LNX_Probe *probe = process->ctx->probes[DMN_LNX_ProbeType_UnmapComplete]; + LNX_DMN_Probe *probe = process->ctx->probes[LNX_DMN_ProbeType_UnmapComplete]; U64 name_space_id = 0, rdebug_vaddr = 0; - if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } - if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } + if(!stap_read_arg_u(probe->args.v[0], process->ctx->arch, thread->reg_block, lnx_dmn_stap_memory_read, process, &name_space_id)) { goto unmap_complete_exit; } + if(!stap_read_arg_u(probe->args.v[1], process->ctx->arch, thread->reg_block, lnx_dmn_stap_memory_read, process, &rdebug_vaddr)) { goto unmap_complete_exit; } - dmn_lnx_event_unload_module(arena, events, process, rdebug_vaddr); + lnx_dmn_event_unload_module(arena, events, process, rdebug_vaddr); is_unmap_completed = 1; unmap_complete_exit:; AssertAlways(is_unmap_completed); } - if(probe_type == DMN_LNX_ProbeType_Null) + if(probe_type == LNX_DMN_ProbeType_Null) { // rollback IP on user traps if(hit_user_trap) { - U64 ip = dmn_lnx_thread_read_ip(thread); - dmn_lnx_thread_write_ip(thread, ip - 1); + U64 ip = lnx_dmn_thread_read_ip(thread); + lnx_dmn_thread_write_ip(thread, ip - 1); } DMN_Event *e = dmn_event_list_push(arena, events); e->kind = DMN_EventKind_Breakpoint; - e->process = dmn_lnx_handle_from_process(process); - e->thread = dmn_lnx_handle_from_thread(thread); - e->instruction_pointer = dmn_lnx_thread_read_ip(thread); + e->process = lnx_dmn_handle_from_process(process); + e->thread = lnx_dmn_handle_from_thread(thread); + e->instruction_pointer = lnx_dmn_thread_read_ip(thread); } } internal void -dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) +lnx_dmn_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(tid); B32 is_valid = 1; U64 address = 0; @@ -2108,46 +2108,46 @@ dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid) if(is_valid) { - dmn_lnx_push_event_breakpoint(arena, events, thread, address); + lnx_dmn_push_event_breakpoint(arena, events, thread, address); } } internal void -dmn_lnx_event_halt(Arena *arena, DMN_EventList *events) +lnx_dmn_event_halt(Arena *arena, DMN_EventList *events) { - dmn_lnx_push_event_halt(arena, events); + lnx_dmn_push_event_halt(arena, events); } internal void -dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid) +lnx_dmn_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid) { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(tid); // clear single step flag - dmn_lnx_set_single_step_flag(thread, 0); + lnx_dmn_set_single_step_flag(thread, 0); // push event - dmn_lnx_push_event_single_step(arena, events, thread); + lnx_dmn_push_event_single_step(arena, events, thread); } internal void -dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo) +lnx_dmn_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo) { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(tid); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(tid); thread->pass_through_signal = 1; thread->pass_through_signo = signo; - dmn_lnx_push_event_exception(arena, events, thread, signo); + lnx_dmn_push_event_exception(arena, events, thread, signo); } -internal DMN_LNX_Process * -dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) +internal LNX_DMN_Process * +lnx_dmn_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) { Temp scratch = scratch_begin(&arena, 1); // create process - DMN_LNX_Process *process = dmn_lnx_event_create_process(arena, events, pid, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses|DMN_LNX_CreateProcessFlag_Rebased); + LNX_DMN_Process *process = lnx_dmn_event_create_process(arena, events, pid, 0, LNX_DMN_CreateProcessFlag_DebugSubprocesses|LNX_DMN_CreateProcessFlag_Rebased); // extract threads from /proc/pid/task { @@ -2167,27 +2167,27 @@ dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) AssertAlways(tid == tid_64); if(tid == pid) { continue; } // main thread was created during create process sequence - dmn_lnx_event_create_thread(arena, events, process, tid); + lnx_dmn_event_create_thread(arena, events, process, tid); } - OS_LNX_RETRY_ON_EINTR(closedir(task_dirp)); + LNX_RETRY_ON_EINTR(closedir(task_dirp)); } } // extract modules from r_debug { B32 is_64bit = process->ctx->dl_class == ELF_Class_64; - GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->ctx->rdebug_vaddr, dmn_lnx_machine_op_mem_read, &process->fd); + GNU_RDebugInfoList rdebug_list = gnu_parse_rdebug(scratch.arena, is_64bit, process->ctx->rdebug_vaddr, lnx_dmn_machine_op_mem_read, &process->fd); U64 name_space_id = 0; for EachNode(rdebug_n, GNU_RDebugInfoNode, rdebug_list.first) { - dmn_lnx_event_load_module(arena, events, process->first_thread, name_space_id, rdebug_n->v.r_map); + lnx_dmn_event_load_module(arena, events, process->first_thread, name_space_id, rdebug_n->v.r_map); name_space_id += 1; } } // handshake complete - dmn_lnx_push_event_handshake_complete(arena, events, process); + lnx_dmn_push_event_handshake_complete(arena, events, process); scratch_end(scratch); return process; @@ -2199,33 +2199,33 @@ dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid) internal void dmn_init(void) { - if(dmn_lnx_state == 0) + if(lnx_dmn_state == 0) { - local_persist DMN_LNX_State state; - dmn_lnx_state = &state; + local_persist LNX_DMN_State state; + lnx_dmn_state = &state; - dmn_lnx_state->arena = arena_alloc(); - dmn_lnx_state->access_mutex = mutex_alloc(); - dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain); - dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0); - dmn_lnx_state->tid_ht = hash_table_init(dmn_lnx_state->arena, 0x2000); - dmn_lnx_state->pid_ht = hash_table_init(dmn_lnx_state->arena, 0x400); - dmn_lnx_state->halter_mutex = mutex_alloc(); - dmn_lnx_entity_alloc(DMN_LNX_EntityKind_Null); + lnx_dmn_state->arena = arena_alloc(); + lnx_dmn_state->access_mutex = mutex_alloc(); + lnx_dmn_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain); + lnx_dmn_state->entities_base = push_array(lnx_dmn_state->entities_arena, LNX_DMN_Entity, 0); + lnx_dmn_state->tid_ht = hash_table_init(lnx_dmn_state->arena, 0x2000); + lnx_dmn_state->pid_ht = hash_table_init(lnx_dmn_state->arena, 0x400); + lnx_dmn_state->halter_mutex = mutex_alloc(); + lnx_dmn_entity_alloc(LNX_DMN_EntityKind_Null); // find offsets of TLS index and TLS offset in the link_map struct // // TODO: assuming that target is using same libc version as debugger { - DMN_LNX_DbDesc *tls_modid_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_modid"); - DMN_LNX_DbDesc *tls_offset_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_offset"); + LNX_DMN_DbDesc *tls_modid_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_modid"); + LNX_DMN_DbDesc *tls_offset_desc = dlsym(RTLD_DEFAULT, "_thread_db_link_map_l_tls_offset"); if(tls_modid_desc && tls_offset_desc) { if(tls_modid_desc->bit_size <= 64 && tls_offset_desc->bit_size <= 64) { - dmn_lnx_state->tls_modid_desc = *tls_modid_desc; - dmn_lnx_state->tls_offset_desc = *tls_offset_desc; - dmn_lnx_state->is_tls_detected = 1; + lnx_dmn_state->tls_modid_desc = *tls_modid_desc; + lnx_dmn_state->tls_offset_desc = *tls_offset_desc; + lnx_dmn_state->is_tls_detected = 1; } else { Assert(0 && "invalid TLS desc"); } } @@ -2240,25 +2240,25 @@ internal DMN_CtrlCtx * dmn_ctrl_begin(void) { DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; - dmn_lnx_ctrl_thread = 1; + lnx_dmn_ctrl_thread = 1; return ctx; } internal void dmn_ctrl_exclusive_access_begin(void) { - MutexScope(dmn_lnx_state->access_mutex) + MutexScope(lnx_dmn_state->access_mutex) { - dmn_lnx_state->access_run_state = 1; + lnx_dmn_state->access_run_state = 1; } } internal void dmn_ctrl_exclusive_access_end(void) { - MutexScope(dmn_lnx_state->access_mutex) + MutexScope(lnx_dmn_state->access_mutex) { - dmn_lnx_state->access_run_state = 0; + lnx_dmn_state->access_run_state = 0; } } @@ -2305,13 +2305,13 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) if(pid == 0) { // wait for seize - if(OS_LNX_RETRY_ON_EINTR(raise(SIGSTOP)) < 0) { goto child_exit; } + if(LNX_RETRY_ON_EINTR(raise(SIGSTOP)) < 0) { goto child_exit; } // change work directory to tracee - if(OS_LNX_RETRY_ON_EINTR(chdir(work_dir_path)) < 0) { goto child_exit; } + if(LNX_RETRY_ON_EINTR(chdir(work_dir_path)) < 0) { goto child_exit; } // replace process with target program - if(OS_LNX_RETRY_ON_EINTR(execve(argv[0], argv, envp)) < 0) { goto child_exit; } + if(LNX_RETRY_ON_EINTR(execve(argv[0], argv, envp)) < 0) { goto child_exit; } child_exit:; exit(0); @@ -2320,16 +2320,16 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) else if(pid > 0) { // try to seize child process - if(dmn_lnx_ptrace_seize(pid) >= 0) + if(lnx_dmn_ptrace_seize(pid) >= 0) { // tracee was successfully seized, create process - dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Launch, 0, params->debug_subprocesses, 0); + lnx_dmn_process_alloc(pid, LNX_DMN_ProcessState_Launch, 0, params->debug_subprocesses, 0); } else { Assert(0 && "failed to ptrace child process"); - OS_LNX_RETRY_ON_EINTR(kill(SIGKILL, pid)); - OS_LNX_RETRY_ON_EINTR(waitpid(pid, 0, WNOHANG)); + LNX_RETRY_ON_EINTR(kill(SIGKILL, pid)); + LNX_RETRY_ON_EINTR(waitpid(pid, 0, WNOHANG)); pid = 0; } } @@ -2342,16 +2342,16 @@ internal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) { B32 is_attached = 0; - if(dmn_lnx_ptrace_seize(pid) >= 0) + if(lnx_dmn_ptrace_seize(pid) >= 0) { - if(OS_LNX_RETRY_ON_EINTR(kill(pid, SIGSTOP)) >= 0) + if(LNX_RETRY_ON_EINTR(kill(pid, SIGSTOP)) >= 0) { - dmn_lnx_process_alloc(pid, DMN_LNX_ProcessState_Attach, 0, 1, 0); + lnx_dmn_process_alloc(pid, LNX_DMN_ProcessState_Attach, 0, 1, 0); is_attached = 1; } else { - OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, pid, 0, 0)); + LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, pid, 0, 0)); } } return is_attached; @@ -2361,13 +2361,13 @@ internal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process_handle, U32 exit_code) { B32 result = 0; - mutex_take(dmn_lnx_state->halter_mutex); - DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + mutex_take(lnx_dmn_state->halter_mutex); + LNX_DMN_Process *process = lnx_dmn_process_from_handle(process_handle); if(process) { - result = OS_LNX_RETRY_ON_EINTR(kill(process->pid, SIGKILL)) >= 0; + result = LNX_RETRY_ON_EINTR(kill(process->pid, SIGKILL)) >= 0; } - mutex_drop(dmn_lnx_state->halter_mutex); + mutex_drop(lnx_dmn_state->halter_mutex); return result; } @@ -2375,13 +2375,13 @@ internal B32 dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process_handle) { B32 result = 0; - mutex_take(dmn_lnx_state->halter_mutex); - DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + mutex_take(lnx_dmn_state->halter_mutex); + LNX_DMN_Process *process = lnx_dmn_process_from_handle(process_handle); if(process) { - result = OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, process->pid, 0, 0)) >= 0; + result = LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, process->pid, 0, 0)) >= 0; } - mutex_drop(dmn_lnx_state->halter_mutex); + mutex_drop(lnx_dmn_state->halter_mutex); return result; } @@ -2391,15 +2391,15 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) Temp scratch = scratch_begin(&arena, 1); DMN_EventList events = {0}; - mutex_take(dmn_lnx_state->halter_mutex); + mutex_take(lnx_dmn_state->halter_mutex); // wait for signals from the running threads - if(dmn_lnx_state->process_count > 0) + if(lnx_dmn_state->process_count > 0) { // write traps to memory DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; { - HashTable *process_ht = hash_table_init(scratch.arena, dmn_lnx_state->process_count); + HashTable *process_ht = hash_table_init(scratch.arena, lnx_dmn_state->process_count); for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) { for EachIndex(n_idx, n->count) @@ -2420,7 +2420,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(is_set) { continue; } // TODO: ctrl sends down traps for exited process - DMN_LNX_Process *process = dmn_lnx_process_from_handle(trap->process); + LNX_DMN_Process *process = lnx_dmn_process_from_handle(trap->process); if(!process) { continue; } // trap instruction @@ -2438,10 +2438,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // enable single stepping if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) { - DMN_LNX_Thread *single_step_thread = dmn_lnx_thread_from_handle(ctrls->single_step_thread); + LNX_DMN_Thread *single_step_thread = lnx_dmn_thread_from_handle(ctrls->single_step_thread); if(single_step_thread) { - dmn_lnx_set_single_step_flag(single_step_thread, 1); + lnx_dmn_set_single_step_flag(single_step_thread, 1); } else { @@ -2450,9 +2450,9 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } // schedule threads to run - DMN_LNX_ThreadPtrList running_threads = {0}; + LNX_DMN_ThreadPtrList running_threads = {0}; { - for EachNode(process, DMN_LNX_Process, dmn_lnx_state->first_process) + for EachNode(process, LNX_DMN_Process, lnx_dmn_state->first_process) { //- rjf: determine if this process is frozen B32 process_is_frozen = 0; @@ -2460,7 +2460,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { for EachIndex(idx, ctrls->run_entity_count) { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_process(process))) + if(dmn_handle_match(ctrls->run_entities[idx], lnx_dmn_handle_from_process(process))) { process_is_frozen = 1; break; @@ -2468,7 +2468,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } - for EachNode(thread, DMN_LNX_Thread, process->first_thread) + for EachNode(thread, LNX_DMN_Thread, process->first_thread) { //- rjf: determine if this thread is frozen B32 is_frozen = 0; @@ -2484,7 +2484,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { for EachIndex(idx, ctrls->run_entity_count) { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_thread(thread))) + if(dmn_handle_match(ctrls->run_entities[idx], lnx_dmn_handle_from_thread(thread))) { is_frozen = 1; break; @@ -2499,18 +2499,18 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: single-step? freeze if not the single-step thread. else { - is_frozen = !dmn_handle_match(dmn_lnx_handle_from_thread(thread), ctrls->single_step_thread); + is_frozen = !dmn_handle_match(lnx_dmn_handle_from_thread(thread), ctrls->single_step_thread); } // resume thread if(!is_frozen) { - AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); + AssertAlways(thread->state == LNX_DMN_ThreadState_Stopped); // write registers if(thread->is_reg_block_dirty) { - thread->is_reg_block_dirty = !dmn_lnx_thread_write_reg_block(thread); + thread->is_reg_block_dirty = !lnx_dmn_thread_write_reg_block(thread); } // pass signal to the child process @@ -2525,11 +2525,11 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } // resume thread - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, thread->tid, 0, sig_code)) >= 0) + if(LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, thread->tid, 0, sig_code)) >= 0) { - thread->state = DMN_LNX_ThreadState_Running; + thread->state = LNX_DMN_ThreadState_Running; thread->is_reg_block_dirty = 1; - dmn_lnx_thread_ptr_list_push(scratch.arena, &running_threads, thread); + lnx_dmn_thread_ptr_list_push(scratch.arena, &running_threads, thread); } else { @@ -2555,27 +2555,27 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // hash running threads tids HashTable *running_threads_ht = hash_table_init(scratch.arena, running_threads.count * 2); - for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) + for EachNode(n, LNX_DMN_ThreadPtrNode, running_threads.first) { hash_table_push_u64_raw(scratch.arena, running_threads_ht, n->v->tid, n); } B32 is_halt_done = 0; - DMN_LNX_ThreadPtrList stopped_threads = {0}; + LNX_DMN_ThreadPtrList stopped_threads = {0}; do { // wait for a signal int status = 0; pid_t wait_id = 0; { - mutex_drop(dmn_lnx_state->halter_mutex); + mutex_drop(lnx_dmn_state->halter_mutex); for(;;) { - wait_id = OS_LNX_RETRY_ON_EINTR(waitpid(-1, &status, __WALL|__WNOTHREAD)); + wait_id = LNX_RETRY_ON_EINTR(waitpid(-1, &status, __WALL|__WNOTHREAD)); if(wait_id == -1) { InvalidPath; } // TODO: graceful exit break; } - mutex_take(dmn_lnx_state->halter_mutex); + mutex_take(lnx_dmn_state->halter_mutex); } // unpack status @@ -2587,57 +2587,57 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // intercept initing processes { - DMN_LNX_Process *process = dmn_lnx_process_from_pid(wait_id); + LNX_DMN_Process *process = lnx_dmn_process_from_pid(wait_id); - if(process && process->state != DMN_LNX_ProcessState_Normal) + if(process && process->state != LNX_DMN_ProcessState_Normal) { switch(process->state) { - case DMN_LNX_ProcessState_Null: - case DMN_LNX_ProcessState_Normal: + case LNX_DMN_ProcessState_Null: + case LNX_DMN_ProcessState_Normal: { InvalidPath; } break; - case DMN_LNX_ProcessState_Launch: + case LNX_DMN_ProcessState_Launch: { if(wstopsig == SIGSTOP) { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, process->pid, 0, 0)) >= 0) + if(LNX_RETRY_ON_EINTR(ptrace(PTRACE_CONT, process->pid, 0, 0)) >= 0) { - process->state = DMN_LNX_ProcessState_WaitForExec; + process->state = LNX_DMN_ProcessState_WaitForExec; goto wait_for_signal; } else { Assert(0 && "failed to resume tracee"); } } // else { Assert(0 && "unexpected signal"); } } break; - case DMN_LNX_ProcessState_WaitForExec: + case LNX_DMN_ProcessState_WaitForExec: { if(wstopsig == SIGTRAP && event_code == PTRACE_EVENT_EXEC) { - DMN_LNX_CreateProcessFlags create_flags = process->debug_subprocesses ? DMN_LNX_CreateProcessFlag_DebugSubprocesses : 0; - dmn_lnx_process_release(process); - dmn_lnx_event_create_process(arena, &events, wait_id, 0, create_flags); + LNX_DMN_CreateProcessFlags create_flags = process->debug_subprocesses ? LNX_DMN_CreateProcessFlag_DebugSubprocesses : 0; + lnx_dmn_process_release(process); + lnx_dmn_event_create_process(arena, &events, wait_id, 0, create_flags); goto wait_for_signal; } //else { Assert(0 && "unexpected signal"); } } break; - case DMN_LNX_ProcessState_ExecFailedDoExit: + case LNX_DMN_ProcessState_ExecFailedDoExit: { if(wifexited) { - dmn_lnx_process_release(process); + lnx_dmn_process_release(process); goto wait_for_signal; } else { Assert(0 && "unexpected signal"); } } break; - case DMN_LNX_ProcessState_Attach: + case LNX_DMN_ProcessState_Attach: { if(wstopsig == SIGSTOP) { - DMN_LNX_CreateProcessFlags create_flags = process->debug_subprocesses ? DMN_LNX_CreateProcessFlag_DebugSubprocesses : 0; - dmn_lnx_process_release(process); - dmn_lnx_event_create_process(arena, &events, wait_id, 0, create_flags); + LNX_DMN_CreateProcessFlags create_flags = process->debug_subprocesses ? LNX_DMN_CreateProcessFlag_DebugSubprocesses : 0; + lnx_dmn_process_release(process); + lnx_dmn_event_create_process(arena, &events, wait_id, 0, create_flags); goto wait_for_signal; } else { Assert(0 && "unexpected signal"); } @@ -2646,14 +2646,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // shutdown process { - if(OS_LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)) >= 0) + if(LNX_RETRY_ON_EINTR(kill(wait_id, SIGKILL)) >= 0) { - process->state = DMN_LNX_ProcessState_ExecFailedDoExit; + process->state = LNX_DMN_ProcessState_ExecFailedDoExit; } else { //Assert(0 && "failed to send kill signal to the tracee"); - dmn_lnx_process_release(process); + lnx_dmn_process_release(process); } } @@ -2664,36 +2664,36 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(wifstopped || wifsignaled || wifexited) { - DMN_LNX_ThreadPtrNode *thread_n = hash_table_search_u64_raw(running_threads_ht, wait_id); + LNX_DMN_ThreadPtrNode *thread_n = hash_table_search_u64_raw(running_threads_ht, wait_id); if(thread_n) { - DMN_LNX_Thread *thread = thread_n->v; - AssertAlways(thread->state == DMN_LNX_ThreadState_Running); + LNX_DMN_Thread *thread = thread_n->v; + AssertAlways(thread->state == LNX_DMN_ThreadState_Running); // remove mapping hash_table_purge_u64(running_threads_ht, thread->tid); // move thread to the stopped list - dmn_lnx_thread_ptr_list_remove(&running_threads, thread_n); - dmn_lnx_thread_ptr_list_push_node(&stopped_threads, thread_n); + lnx_dmn_thread_ptr_list_remove(&running_threads, thread_n); + lnx_dmn_thread_ptr_list_push_node(&stopped_threads, thread_n); // update thread state if(wifstopped && !wifsignaled && !wifexited) { - thread->state = DMN_LNX_ThreadState_Stopped; + thread->state = LNX_DMN_ThreadState_Stopped; } else if(!wifstopped && (wifsignaled || wifexited)) { - thread->state = DMN_LNX_ThreadState_Exited; + thread->state = LNX_DMN_ThreadState_Exited; } else { InvalidPath; } // stop all other threads if(stopped_threads.count == 1) { - for EachNode(n, DMN_LNX_ThreadPtrNode, running_threads.first) + for EachNode(n, LNX_DMN_ThreadPtrNode, running_threads.first) { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, n->v->tid, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } + if(LNX_RETRY_ON_EINTR(ptrace(PTRACE_INTERRUPT, n->v->tid, 0, 0)) < 0) { Assert(0 && "failed to interrupt process"); } } } } @@ -2702,23 +2702,23 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // normal child exit via _exit or exit() if(wifexited) { - dmn_lnx_event_exit_thread(arena, &events, wait_id, WEXITSTATUS(status)); + lnx_dmn_event_exit_thread(arena, &events, wait_id, WEXITSTATUS(status)); } // exit because child did not handle a signal else if(wifsignaled) { - dmn_lnx_event_exit_thread(arena, &events, wait_id, WTERMSIG(status)); + lnx_dmn_event_exit_thread(arena, &events, wait_id, WTERMSIG(status)); } // thread or group stop else if(wifstopped) { // read thread registers { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); - if(thread && thread->state != DMN_LNX_ThreadState_PendingCreation) + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(wait_id); + if(thread && thread->state != LNX_DMN_ThreadState_PendingCreation) { - thread->is_reg_block_dirty = !dmn_lnx_thread_read_reg_block(thread); + thread->is_reg_block_dirty = !lnx_dmn_thread_read_reg_block(thread); Assert(!thread->is_reg_block_dirty); } } @@ -2731,14 +2731,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { // translate signal code to DEMON event siginfo_t siginfo = {0}; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) + if(LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) { switch(siginfo.si_code) { - case SI_KERNEL: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; - case TRAP_BRKPT: { dmn_lnx_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; - case TRAP_TRACE: { dmn_lnx_event_single_step(arena, &events, wait_id); } break; - case TRAP_HWBKPT: { dmn_lnx_event_data_breakpoint(arena, &events, wait_id); } break; + case SI_KERNEL: { lnx_dmn_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_BRKPT: { lnx_dmn_event_breakpoint(arena, &events, active_trap_first, wait_id); } break; + case TRAP_TRACE: { lnx_dmn_event_single_step(arena, &events, wait_id); } break; + case TRAP_HWBKPT: { lnx_dmn_event_data_breakpoint(arena, &events, wait_id); } break; case TRAP_BRANCH: { NotImplemented; }break; case TRAP_UNK: { NotImplemented; }break; default: { InvalidPath; } break; @@ -2764,29 +2764,29 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // will be a PTRACE_EVENT_STOP pid_t new_tid; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid)) >= 0) + if(LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid)) >= 0) { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(wait_id); // create a new partially inited thread - dmn_lnx_thread_alloc(thread->process, DMN_LNX_ThreadState_PendingCreation, new_tid); + lnx_dmn_thread_alloc(thread->process, LNX_DMN_ThreadState_PendingCreation, new_tid); } else { Assert(0 && "failed to get new tid"); } }break; case PTRACE_EVENT_EXEC: { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); - DMN_LNX_Process *process = thread->process; + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(wait_id); + LNX_DMN_Process *process = thread->process; if(process->debug_subprocesses) { - dmn_lnx_event_exit_thread(arena, &events, wait_id, 0); - dmn_lnx_event_create_process(arena, &events, wait_id, 0, DMN_LNX_CreateProcessFlag_DebugSubprocesses); + lnx_dmn_event_exit_thread(arena, &events, wait_id, 0); + lnx_dmn_event_create_process(arena, &events, wait_id, 0, LNX_DMN_CreateProcessFlag_DebugSubprocesses); } else { - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, wait_id, 0, 0)) >= 0) + if(LNX_RETRY_ON_EINTR(ptrace(PTRACE_DETACH, wait_id, 0, 0)) >= 0) { - dmn_lnx_event_exit_thread(arena, &events, wait_id, 0); + lnx_dmn_event_exit_thread(arena, &events, wait_id, 0); } else { Assert(0 && "failed to detach"); } } @@ -2801,16 +2801,16 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; case PTRACE_EVENT_STOP: { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_pid(wait_id); - if(thread->state == DMN_LNX_ThreadState_PendingCreation) + LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(wait_id); + if(thread->state == LNX_DMN_ThreadState_PendingCreation) { - DMN_LNX_Process *process = thread->process; - dmn_lnx_thread_release(thread); - thread = dmn_lnx_event_create_thread(arena, &events, process, wait_id); + LNX_DMN_Process *process = thread->process; + lnx_dmn_thread_release(thread); + thread = lnx_dmn_event_create_thread(arena, &events, process, wait_id); } else { - AssertAlways(thread->state == DMN_LNX_ThreadState_Stopped); + AssertAlways(thread->state == LNX_DMN_ThreadState_Stopped); } }break; default: { Assert(0 && "unexpected ptrace code"); } break; @@ -2819,10 +2819,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) else if(wstopsig == SIGSTOP) { siginfo_t siginfo = {0}; - if(OS_LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) + if(LNX_RETRY_ON_EINTR(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo)) >= 0) { // finish halting if this is our SIGSTOP - if(siginfo.si_pid == dmn_lnx_state->halter_tid) + if(siginfo.si_pid == lnx_dmn_state->halter_tid) { is_halt_done = 1; } @@ -2834,30 +2834,30 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } else { - dmn_lnx_event_exception(arena, &events, wait_id, wstopsig); + lnx_dmn_event_exception(arena, &events, wait_id, wstopsig); } } else { Assert(0 && "unexpected stop code"); } - } while(running_threads.count > 0 || dmn_lnx_state->process_pending_creation > 0 || dmn_lnx_state->threads_pending_creation > 0); + } while(running_threads.count > 0 || lnx_dmn_state->process_pending_creation > 0 || lnx_dmn_state->threads_pending_creation > 0); // finalize halter state if(is_halt_done) { // push event - dmn_lnx_event_halt(arena, &events); + lnx_dmn_event_halt(arena, &events); // reset state - dmn_lnx_state->halter_tid = 0; - dmn_lnx_state->halt_code = 0; - dmn_lnx_state->halt_user_data = 0; - dmn_lnx_state->is_halting = 0; + lnx_dmn_state->halter_tid = 0; + lnx_dmn_state->halt_code = 0; + lnx_dmn_state->halt_user_data = 0; + lnx_dmn_state->is_halting = 0; } // restore original instruction bytes for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) { // skip process that exited during the wait - DMN_LNX_Process *process = dmn_lnx_process_from_handle(active_trap->trap->process); + LNX_DMN_Process *process = lnx_dmn_process_from_handle(active_trap->trap->process); if(!process) { continue; } if(!dmn_process_write(active_trap->trap->process, r1u64(active_trap->trap->vaddr, active_trap->trap->vaddr + active_trap->swap_bytes.size), active_trap->swap_bytes.str) && @@ -2870,12 +2870,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } - if(events.count == 0 && dmn_lnx_state->process_count == 0) + if(events.count == 0 && lnx_dmn_state->process_count == 0) { - dmn_lnx_push_event_not_attached(arena, &events); + lnx_dmn_push_event_not_attached(arena, &events); } - mutex_drop(dmn_lnx_state->halter_mutex); + mutex_drop(lnx_dmn_state->halter_mutex); scratch_end(scratch); return events; } @@ -2886,18 +2886,18 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) internal void dmn_halt(U64 code, U64 user_data) { - mutex_take(dmn_lnx_state->halter_mutex); - if(dmn_lnx_state->process_count) + mutex_take(lnx_dmn_state->halter_mutex); + if(lnx_dmn_state->process_count) { - dmn_lnx_state->halter_tid = gettid(); - dmn_lnx_state->halt_code = code; - dmn_lnx_state->halt_user_data = user_data; - for EachNode(process, DMN_LNX_Process, dmn_lnx_state->first_process) + lnx_dmn_state->halter_tid = gettid(); + lnx_dmn_state->halt_code = code; + lnx_dmn_state->halt_user_data = user_data; + for EachNode(process, LNX_DMN_Process, lnx_dmn_state->first_process) { - if(OS_LNX_RETRY_ON_EINTR(kill(process->pid, SIGSTOP)) < 0) { Assert(0 && "failed to send SIGSTOP"); } + if(LNX_RETRY_ON_EINTR(kill(process->pid, SIGSTOP)) < 0) { Assert(0 && "failed to send SIGSTOP"); } } } - mutex_drop(dmn_lnx_state->halter_mutex); + mutex_drop(lnx_dmn_state->halter_mutex); } //////////////////////////////// @@ -2909,14 +2909,14 @@ internal B32 dmn_access_open(void) { B32 result = 0; - if(dmn_lnx_ctrl_thread) + if(lnx_dmn_ctrl_thread) { result = 1; } else { - mutex_take(dmn_lnx_state->access_mutex); - result = !dmn_lnx_state->access_run_state; + mutex_take(lnx_dmn_state->access_mutex); + result = !lnx_dmn_state->access_run_state; } return result; } @@ -2924,9 +2924,9 @@ dmn_access_open(void) internal void dmn_access_close(void) { - if(!dmn_lnx_ctrl_thread) + if(!lnx_dmn_ctrl_thread) { - mutex_drop(dmn_lnx_state->access_mutex); + mutex_drop(lnx_dmn_state->access_mutex); } } @@ -2961,11 +2961,11 @@ dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, AccessFlags internal U64 dmn_process_read(DMN_Handle process_handle, Rng1U64 range, void *dst) { - DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + LNX_DMN_Process *process = lnx_dmn_process_from_handle(process_handle); U64 result = 0; if(process) { - result = dmn_lnx_read(process->fd, range, dst); + result = lnx_dmn_read(process->fd, range, dst); } return result; } @@ -2973,11 +2973,11 @@ dmn_process_read(DMN_Handle process_handle, Rng1U64 range, void *dst) internal B32 dmn_process_write(DMN_Handle process_handle, Rng1U64 range, void *src) { - DMN_LNX_Process *process = dmn_lnx_process_from_handle(process_handle); + LNX_DMN_Process *process = lnx_dmn_process_from_handle(process_handle); B32 result = 0; if(process) { - result = dmn_lnx_write(process->fd, range, src); + result = lnx_dmn_write(process->fd, range, src); } return result; } @@ -2988,7 +2988,7 @@ internal Arch dmn_arch_from_thread(DMN_Handle thread_handle) { Arch arch = Arch_Null; - DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_handle(thread_handle); if(thread) { arch = thread->process->ctx->arch; @@ -3008,7 +3008,7 @@ dmn_tls_root_vaddr_from_thread(DMN_Handle thread_handle) U64 tls_root_vaddr = max_U64; DMN_AccessScope { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_handle(thread_handle); if(thread) { switch(thread->process->ctx->arch) @@ -3018,7 +3018,7 @@ dmn_tls_root_vaddr_from_thread(DMN_Handle thread_handle) { X64_RegBlock *reg_block = thread->reg_block; U64 dtv_pointer = 0; - if(dmn_lnx_read_struct(thread->process->fd, reg_block->fsbase + 8, &dtv_pointer)) + if(lnx_dmn_read_struct(thread->process->fd, reg_block->fsbase + 8, &dtv_pointer)) { tls_root_vaddr = dtv_pointer; } @@ -3042,7 +3042,7 @@ dmn_thread_read_reg_block(DMN_Handle thread_handle, void *reg_block) B32 result = 0; DMN_AccessScope { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_handle(thread_handle); if(thread) { ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); @@ -3060,7 +3060,7 @@ dmn_thread_write_reg_block(DMN_Handle thread_handle, void *reg_block) B32 result = 0; DMN_AccessScope { - DMN_LNX_Thread *thread = dmn_lnx_thread_from_handle(thread_handle); + LNX_DMN_Thread *thread = lnx_dmn_thread_from_handle(thread_handle); if(thread) { ARCH_Info *arch_info = arch_info_from_arch(thread->process->ctx->arch); @@ -3122,7 +3122,7 @@ dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info if(got_pid) { pid_t pid = u64_from_str8(pid_string, 10); - String8 name = dmn_lnx_exe_path_from_pid(arena, pid); + String8 name = lnx_dmn_exe_path_from_pid(arena, pid); if(name.size == 0) { name = str8_lit("(unknown process)"); diff --git a/src/linux/demon/linux_demon.h b/src/linux/demon/linux_demon.h index d4308d52..128b34f1 100644 --- a/src/linux/demon/linux_demon.h +++ b/src/linux/demon/linux_demon.h @@ -1,16 +1,16 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef DEMON_CORE_LINUX_H -#define DEMON_CORE_LINUX_H +#ifndef LINUX_DEMON_H +#define LINUX_DEMON_H //////////////////////////////// //~ rjf: Register Layouts // // These are defined in , but only for one architecture at a time -typedef struct OS_LNX_GprsX64 OS_LNX_GprsX64; -struct OS_LNX_GprsX64 +typedef struct LNX_DMN_GprsX64 LNX_DMN_GprsX64; +struct LNX_DMN_GprsX64 { U64 r15; U64 r14; @@ -41,10 +41,10 @@ struct OS_LNX_GprsX64 U64 gs; }; -typedef struct OS_LNX_UserX64 OS_LNX_UserX64; -struct OS_LNX_UserX64 +typedef struct LNX_DMN_UserX64 LNX_DMN_UserX64; +struct LNX_DMN_UserX64 { - OS_LNX_GprsX64 regs; + LNX_DMN_GprsX64 regs; S32 u_fpvalid; U32 _pad0; X64_FXSave i387; @@ -62,22 +62,22 @@ struct OS_LNX_UserX64 U8 u_comm[32]; U64 u_debugreg[8]; }; -StaticAssert(sizeof(OS_LNX_UserX64) == 912, g_os_lnx_user_x64_size_check); +StaticAssert(sizeof(LNX_DMN_UserX64) == 912, lnx_user_x64_size_check); //////////////////////////////// //~ TLS -typedef struct DMN_LNX_DbDesc +typedef struct LNX_DMN_DbDesc { U32 bit_size; U32 count; U32 offset; -} DMN_LNX_DbDesc; +} LNX_DMN_DbDesc; //////////////////////////////// //~ SDT Probes -typedef struct DMN_LNX_Probe +typedef struct LNX_DMN_Probe { String8 provider; String8 name; @@ -85,22 +85,22 @@ typedef struct DMN_LNX_Probe STAP_ArgArray args; U64 pc; U64 semaphore; -} DMN_LNX_Probe; +} LNX_DMN_Probe; -typedef struct DMN_LNX_ProbeNode +typedef struct LNX_DMN_ProbeNode { - DMN_LNX_Probe v; - struct DMN_LNX_ProbeNode *next; -} DMN_LNX_ProbeNode; + LNX_DMN_Probe v; + struct LNX_DMN_ProbeNode *next; +} LNX_DMN_ProbeNode; -typedef struct DMN_LNX_ProbeList +typedef struct LNX_DMN_ProbeList { U64 count; - DMN_LNX_ProbeNode *first; - DMN_LNX_ProbeNode *last; -} DMN_LNX_ProbeList; + LNX_DMN_ProbeNode *first; + LNX_DMN_ProbeNode *last; +} LNX_DMN_ProbeList; -#define DMN_LNX_Probe_XList \ +#define LNX_DMN_Probe_XList \ X(InitStart, 2, "init_start") \ X(InitComplete, 2, "init_complete") \ X(RelocStart, 2, "reloc_start") \ @@ -115,17 +115,17 @@ X(SetJmp, 3, "setjmp") typedef enum { - DMN_LNX_ProbeType_Null, -#define X(_N,...) DMN_LNX_ProbeType_##_N, - DMN_LNX_Probe_XList + LNX_DMN_ProbeType_Null, +#define X(_N,...) LNX_DMN_ProbeType_##_N, + LNX_DMN_Probe_XList #undef X - DMN_LNX_ProbeType_Count, -} DMN_LNX_ProbeType; + LNX_DMN_ProbeType_Count, +} LNX_DMN_ProbeType; //////////////////////////////// //~ Process Info -typedef struct DMN_LNX_Auxv +typedef struct LNX_DMN_Auxv { U64 base; U64 phnum; @@ -133,9 +133,9 @@ typedef struct DMN_LNX_Auxv U64 phdr; U64 execfn; U64 pagesz; -} DMN_LNX_Auxv; +} LNX_DMN_Auxv; -typedef struct DMN_LNX_DynamicInfo +typedef struct LNX_DMN_DynamicInfo { U64 hash_vaddr; U64 gnu_hash_vaddr; @@ -143,59 +143,59 @@ typedef struct DMN_LNX_DynamicInfo U64 strtab_size; U64 symtab_vaddr; U64 symtab_entry_size; -} DMN_LNX_DynamicInfo; +} LNX_DMN_DynamicInfo; //////////////////////////////// //~ Entities -typedef enum DMN_LNX_EntityKind +typedef enum LNX_DMN_EntityKind { - DMN_LNX_EntityKind_Null, - DMN_LNX_EntityKind_Process, - DMN_LNX_EntityKind_ProcessCtx, - DMN_LNX_EntityKind_Thread, - DMN_LNX_EntityKind_Module, -} DMN_LNX_EntityKind; + LNX_DMN_EntityKind_Null, + LNX_DMN_EntityKind_Process, + LNX_DMN_EntityKind_ProcessCtx, + LNX_DMN_EntityKind_Thread, + LNX_DMN_EntityKind_Module, +} LNX_DMN_EntityKind; -typedef enum DMN_LNX_ThreadState +typedef enum LNX_DMN_ThreadState { - DMN_LNX_ThreadState_Null, - DMN_LNX_ThreadState_Running, - DMN_LNX_ThreadState_Stopped, - DMN_LNX_ThreadState_Exited, - DMN_LNX_ThreadState_PendingCreation, -} DMN_LNX_ThreadState; + LNX_DMN_ThreadState_Null, + LNX_DMN_ThreadState_Running, + LNX_DMN_ThreadState_Stopped, + LNX_DMN_ThreadState_Exited, + LNX_DMN_ThreadState_PendingCreation, +} LNX_DMN_ThreadState; -typedef struct DMN_LNX_Thread +typedef struct LNX_DMN_Thread { pid_t tid; - DMN_LNX_ThreadState state; - struct DMN_LNX_Process *process; + LNX_DMN_ThreadState state; + struct LNX_DMN_Process *process; void *reg_block; B32 is_reg_block_dirty; B32 pass_through_signal; U64 pass_through_signo; U64 orig_rax; - struct DMN_LNX_Thread *next; - struct DMN_LNX_Thread *prev; -} DMN_LNX_Thread; + struct LNX_DMN_Thread *next; + struct LNX_DMN_Thread *prev; +} LNX_DMN_Thread; -typedef struct DMN_LNX_ThreadPtrNode +typedef struct LNX_DMN_ThreadPtrNode { - DMN_LNX_Thread *v; - struct DMN_LNX_ThreadPtrNode *next; - struct DMN_LNX_ThreadPtrNode *prev; -} DMN_LNX_ThreadPtrNode; + LNX_DMN_Thread *v; + struct LNX_DMN_ThreadPtrNode *next; + struct LNX_DMN_ThreadPtrNode *prev; +} LNX_DMN_ThreadPtrNode; -typedef struct DMN_LNX_ThreadPtrList +typedef struct LNX_DMN_ThreadPtrList { U64 count; - DMN_LNX_ThreadPtrNode *first; - DMN_LNX_ThreadPtrNode *last; -} DMN_LNX_ThreadPtrList; + LNX_DMN_ThreadPtrNode *first; + LNX_DMN_ThreadPtrNode *last; +} LNX_DMN_ThreadPtrList; -typedef struct DMN_LNX_Module +typedef struct LNX_DMN_Module { U64 name_vaddr; U64 base_vaddr; @@ -209,86 +209,86 @@ typedef struct DMN_LNX_Module B8 is_live; B8 is_main; - struct DMN_LNX_Module *next; - struct DMN_LNX_Module *prev; -} DMN_LNX_Module; + struct LNX_DMN_Module *next; + struct LNX_DMN_Module *prev; +} LNX_DMN_Module; -typedef struct DMN_LNX_ModulePtrNode +typedef struct LNX_DMN_ModulePtrNode { - DMN_LNX_Module *v; - struct DMN_LNX_ModulePtrNode *next; -} DMN_LNX_ModulePtrNode; + LNX_DMN_Module *v; + struct LNX_DMN_ModulePtrNode *next; +} LNX_DMN_ModulePtrNode; -typedef struct DMN_LNX_ModulePtrList +typedef struct LNX_DMN_ModulePtrList { U64 count; - DMN_LNX_ModulePtrNode *first; - DMN_LNX_ModulePtrNode *last; -} DMN_LNX_ModulePtrList; + LNX_DMN_ModulePtrNode *first; + LNX_DMN_ModulePtrNode *last; +} LNX_DMN_ModulePtrList; typedef enum { - DMN_LNX_ProcessState_Null, - DMN_LNX_ProcessState_Launch, - DMN_LNX_ProcessState_Attach, - DMN_LNX_ProcessState_WaitForExec, - DMN_LNX_ProcessState_ExecFailedDoExit, - DMN_LNX_ProcessState_Normal, -} DMN_LNX_ProcessState; + LNX_DMN_ProcessState_Null, + LNX_DMN_ProcessState_Launch, + LNX_DMN_ProcessState_Attach, + LNX_DMN_ProcessState_WaitForExec, + LNX_DMN_ProcessState_ExecFailedDoExit, + LNX_DMN_ProcessState_Normal, +} LNX_DMN_ProcessState; typedef enum { - DMN_LNX_CreateProcessFlag_DebugSubprocesses = (1 << 0), - DMN_LNX_CreateProcessFlag_Rebased = (1 << 1), - DMN_LNX_CreateProcessFlag_Cow = (1 << 2), - DMN_LNX_CreateProcessFlag_ClonedMemory = (1 << 3), -} DMN_LNX_CreateProcessFlags; + LNX_DMN_CreateProcessFlag_DebugSubprocesses = (1 << 0), + LNX_DMN_CreateProcessFlag_Rebased = (1 << 1), + LNX_DMN_CreateProcessFlag_Cow = (1 << 2), + LNX_DMN_CreateProcessFlag_ClonedMemory = (1 << 3), +} LNX_DMN_CreateProcessFlags; -typedef struct DMN_LNX_Process +typedef struct LNX_DMN_Process { pid_t pid; int fd; - DMN_LNX_ProcessState state; + LNX_DMN_ProcessState state; B32 debug_subprocesses; B32 is_cow; B32 vfork_with_spoof; U64 thread_count; - DMN_LNX_Thread *first_thread; - DMN_LNX_Thread *last_thread; + LNX_DMN_Thread *first_thread; + LNX_DMN_Thread *last_thread; U64 main_thread_exit_code; - struct DMN_LNX_Process *parent_process; - struct DMN_LNX_ProcessCtx *ctx; + struct LNX_DMN_Process *parent_process; + struct LNX_DMN_ProcessCtx *ctx; - struct DMN_LNX_Process *next; - struct DMN_LNX_Process *prev; -} DMN_LNX_Process; + struct LNX_DMN_Process *next; + struct LNX_DMN_Process *prev; +} LNX_DMN_Process; -typedef struct DMN_LNX_ProcessPtrNode +typedef struct LNX_DMN_ProcessPtrNode { - DMN_LNX_Process *v; - struct DMN_LNX_ProcessPtrNode *next; -} DMN_LNX_ProcessPtrNode; + LNX_DMN_Process *v; + struct LNX_DMN_ProcessPtrNode *next; +} LNX_DMN_ProcessPtrNode; -typedef struct DMN_LNX_ProcessPtrList +typedef struct LNX_DMN_ProcessPtrList { U64 count; - DMN_LNX_ProcessPtrNode *first; - DMN_LNX_ProcessPtrNode *last; -} DMN_LNX_ProcessPtrList; + LNX_DMN_ProcessPtrNode *first; + LNX_DMN_ProcessPtrNode *last; +} LNX_DMN_ProcessPtrList; -typedef struct DMN_LNX_ProcessCtx +typedef struct LNX_DMN_ProcessCtx { Arena *arena; Arch arch; U64 rdebug_vaddr; ELF_Class dl_class; HashTable *loaded_modules_ht; - DMN_LNX_Probe **probes; + LNX_DMN_Probe **probes; DMN_ActiveTrap *first_probe_trap; DMN_ActiveTrap *last_probe_trap; - DMN_LNX_Module *first_module; - DMN_LNX_Module *last_module; + LNX_DMN_Module *first_module; + LNX_DMN_Module *last_module; U64 module_count; U64 ref_count; @@ -299,42 +299,42 @@ typedef struct DMN_LNX_ProcessCtx U64 xcr0; U64 xsave_size; X64_XSaveLayout xsave_layout; -} DMN_LNX_ProcessCtx; +} LNX_DMN_ProcessCtx; -typedef struct DMN_LNX_Entity +typedef struct LNX_DMN_Entity { union { - DMN_LNX_Process process; - DMN_LNX_ProcessCtx process_ctx; - DMN_LNX_Thread thread; - DMN_LNX_Module module; + LNX_DMN_Process process; + LNX_DMN_ProcessCtx process_ctx; + LNX_DMN_Thread thread; + LNX_DMN_Module module; struct { - struct DMN_LNX_Entity *next; + struct LNX_DMN_Entity *next; }; }; U32 gen; - DMN_LNX_EntityKind kind; -} DMN_LNX_Entity; + LNX_DMN_EntityKind kind; +} LNX_DMN_Entity; -typedef struct DMN_LNX_EntityNode +typedef struct LNX_DMN_EntityNode { - DMN_LNX_Entity *v; - struct DMN_LNX_EntityNode *next; -} DMN_LNX_EntityNode; + LNX_DMN_Entity *v; + struct LNX_DMN_EntityNode *next; +} LNX_DMN_EntityNode; -typedef struct DMN_LNX_EntityList +typedef struct LNX_DMN_EntityList { U64 count; - DMN_LNX_EntityNode *first; - DMN_LNX_EntityNode *last; -} DMN_LNX_EntityList; + LNX_DMN_EntityNode *first; + LNX_DMN_EntityNode *last; +} LNX_DMN_EntityList; //////////////////////////////// //~ Global State -typedef struct DMN_LNX_State +typedef struct LNX_DMN_State { Arena *arena; @@ -344,8 +344,8 @@ typedef struct DMN_LNX_State // rjf: entity storage Arena *entities_arena; - DMN_LNX_Entity *entities_base; - DMN_LNX_Entity *free_entity; + LNX_DMN_Entity *entities_base; + LNX_DMN_Entity *free_entity; U64 entities_count; HashTable *tid_ht; // thread id -> thread entity @@ -353,8 +353,8 @@ typedef struct DMN_LNX_State // process tracking U64 process_count; - DMN_LNX_Process *first_process; - DMN_LNX_Process *last_process; + LNX_DMN_Process *first_process; + LNX_DMN_Process *last_process; // process/thread creation tracking U64 process_pending_creation; @@ -369,134 +369,133 @@ typedef struct DMN_LNX_State // TLS B32 is_tls_detected; - DMN_LNX_DbDesc tls_modid_desc; - DMN_LNX_DbDesc tls_offset_desc; -} DMN_LNX_State; + LNX_DMN_DbDesc tls_modid_desc; + LNX_DMN_DbDesc tls_offset_desc; +} LNX_DMN_State; //////////////////////////////// //~ Globals -global B32 dmn_lnx_ctrl_thread; -global DMN_LNX_State *dmn_lnx_state; +global B32 lnx_dmn_ctrl_thread; +global LNX_DMN_State *lnx_dmn_state; //////////////////////////////// //~ Memory R/W -internal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst); -internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); -internal String8 dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size); -internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr); -#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) -#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) +internal U64 lnx_dmn_read(int memory_fd, Rng1U64 range, void *dst); +internal B32 lnx_dmn_write(int memory_fd, Rng1U64 range, void *src); +internal String8 lnx_dmn_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size); +internal String8 lnx_dmn_read_string(Arena *arena, int memory_fd, U64 base_vaddr); +#define lnx_dmn_read_struct(fd, vaddr, ptr) lnx_dmn_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) +#define lnx_dmn_write_struct(fd, vaddr, ptr) lnx_dmn_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) //////////////////////////////// //~ ELF/GNU info -internal Rng1U64 dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum); -internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); -internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased); +internal Rng1U64 lnx_dmn_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum); +internal LNX_DMN_DynamicInfo lnx_dmn_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr); +internal U64 lnx_dmn_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased); //////////////////////////////// //~ Process Info -internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid); -internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); -internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid); -internal DMN_LNX_Auxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class); -internal DMN_LNX_Thread * dmn_lnx_thread_from_pid(pid_t pid); -internal DMN_LNX_Process * dmn_lnx_process_from_pid(pid_t pid); +internal String8 lnx_dmn_exe_path_from_pid(Arena *arena, pid_t pid); +internal String8 lnx_dmn_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base); +internal ELF_Hdr64 lnx_dmn_ehdr_from_pid(pid_t pid); +internal LNX_DMN_Auxv lnx_dmn_auxv_from_pid(pid_t pid, ELF_Class elf_class); +internal LNX_DMN_Thread * lnx_dmn_thread_from_pid(pid_t pid); +internal LNX_DMN_Process * lnx_dmn_process_from_pid(pid_t pid); //////////////////////////////// //~ Entity // alloc -internal DMN_LNX_Entity * dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind); -internal DMN_LNX_Process * dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocess, B32 is_cow); -internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased); -internal DMN_LNX_Thread * dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid); -internal DMN_LNX_Module * dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main); +internal LNX_DMN_Entity * lnx_dmn_entity_alloc(LNX_DMN_EntityKind kind); +internal LNX_DMN_Process * lnx_dmn_process_alloc(pid_t pid, LNX_DMN_ProcessState state, LNX_DMN_Process *parent_process, B32 debug_subprocess, B32 is_cow); +internal LNX_DMN_ProcessCtx * lnx_dmn_process_ctx_alloc(LNX_DMN_Process *process, B32 is_rebased); +internal LNX_DMN_Thread * lnx_dmn_thread_alloc(LNX_DMN_Process *process, LNX_DMN_ThreadState thread_state, pid_t tid); +internal LNX_DMN_Module * lnx_dmn_module_alloc(LNX_DMN_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main); // release -internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity); -internal void dmn_lnx_process_release(DMN_LNX_Process *process); -internal void dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *process_ctx); -internal void dmn_lnx_thread_release(DMN_LNX_Thread *thread); -internal void dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module); +internal void lnx_dmn_entity_release(LNX_DMN_Entity *entity); +internal void lnx_dmn_process_release(LNX_DMN_Process *process); +internal void lnx_dmn_process_ctx_release(LNX_DMN_ProcessCtx *process_ctx); +internal void lnx_dmn_thread_release(LNX_DMN_Thread *thread); +internal void lnx_dmn_module_release(LNX_DMN_ProcessCtx *ctx, LNX_DMN_Module *module); // clone -internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_clone(DMN_LNX_Process *process, DMN_LNX_ProcessCtx *ctx); -internal DMN_LNX_Module * dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module); +internal LNX_DMN_ProcessCtx * lnx_dmn_process_ctx_clone(LNX_DMN_Process *process, LNX_DMN_ProcessCtx *ctx); +internal LNX_DMN_Module * lnx_dmn_module_clone(LNX_DMN_ProcessCtx *process_ctx, LNX_DMN_Module *module); // entity -> handle -internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity); -internal DMN_Handle dmn_lnx_handle_from_process(DMN_LNX_Process *process); -internal DMN_Handle dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx); -internal DMN_Handle dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread); -internal DMN_Handle dmn_lnx_handle_from_module(DMN_LNX_Module *module); +internal DMN_Handle lnx_dmn_handle_from_entity(LNX_DMN_Entity *entity); +internal DMN_Handle lnx_dmn_handle_from_process(LNX_DMN_Process *process); +internal DMN_Handle lnx_dmn_handle_from_process_ctx(LNX_DMN_ProcessCtx *process_ctx); +internal DMN_Handle lnx_dmn_handle_from_thread(LNX_DMN_Thread *thread); +internal DMN_Handle lnx_dmn_handle_from_module(LNX_DMN_Module *module); // handle -> entity -internal DMN_LNX_Entity * dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind); -internal DMN_LNX_Process * dmn_lnx_process_from_handle(DMN_Handle process_handle); -internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle); -internal DMN_LNX_Thread * dmn_lnx_thread_from_handle(DMN_Handle thread_handle); -internal DMN_LNX_Module * dmn_lnx_module_from_handle(DMN_Handle module_handle); +internal LNX_DMN_Entity * lnx_dmn_entity_from_handle(DMN_Handle handle, LNX_DMN_EntityKind expected_kind); +internal LNX_DMN_Process * lnx_dmn_process_from_handle(DMN_Handle process_handle); +internal LNX_DMN_ProcessCtx * lnx_dmn_process_ctx_from_handle(DMN_Handle process_ctx_handle); +internal LNX_DMN_Thread * lnx_dmn_thread_from_handle(DMN_Handle thread_handle); +internal LNX_DMN_Module * lnx_dmn_module_from_handle(DMN_Handle module_handle); //////////////////////////////// //~ Process Helpers -internal void dmn_lnx_process_trap_probes(DMN_LNX_Process *process); -internal void dmn_lnx_process_untrap_probes(DMN_LNX_Process *process); +internal void lnx_dmn_process_trap_probes(LNX_DMN_Process *process); +internal void lnx_dmn_process_untrap_probes(LNX_DMN_Process *process); //////////////////////////////// //~ Thread Helpers -internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread); -internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread); -internal void dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip); -internal void dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp); -internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread); -internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread); -internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on); +internal U64 lnx_dmn_thread_read_ip(LNX_DMN_Thread *thread); +internal U64 lnx_dmn_thread_read_sp(LNX_DMN_Thread *thread); +internal void lnx_dmn_thread_write_ip(LNX_DMN_Thread *thread, U64 ip); +internal void lnx_dmn_thread_write_sp(LNX_DMN_Thread *thread, U64 sp); +internal B32 lnx_dmn_thread_read_reg_block(LNX_DMN_Thread *thread); +internal B32 lnx_dmn_thread_write_reg_block(LNX_DMN_Thread *thread); +internal B32 lnx_dmn_set_single_step_flag(LNX_DMN_Thread *thread, B32 is_on); //////////////////////////////// //~ List Helpers -internal void dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n); -internal DMN_LNX_ThreadPtrNode * dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v); -internal DMN_LNX_ModulePtrNode * dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v); -internal DMN_LNX_ProcessPtrNode * dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v); +internal void lnx_dmn_thread_ptr_list_push_node(LNX_DMN_ThreadPtrList *list, LNX_DMN_ThreadPtrNode *n); +internal LNX_DMN_ThreadPtrNode * lnx_dmn_thread_ptr_list_push(Arena *arena, LNX_DMN_ThreadPtrList *list, LNX_DMN_Thread *v); +internal LNX_DMN_ModulePtrNode * lnx_dmn_module_ptr_list_push(Arena *arena, LNX_DMN_ModulePtrList *list, LNX_DMN_Module *v); +internal LNX_DMN_ProcessPtrNode * lnx_dmn_process_ptr_list_push(Arena *arena, LNX_DMN_ProcessPtrList *list, LNX_DMN_Process *v); //////////////////////////////// //~ Debug Event Pushers -internal void dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); -internal void dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); -internal void dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread); -internal void dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code); -internal void dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module); -internal void dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module); -internal void dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process); -internal void dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address); -internal void dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread); -internal void dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo); -internal void dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events); -internal void dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events); +internal void lnx_dmn_push_event_create_process(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process); +internal void lnx_dmn_push_event_exit_process(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process); +internal void lnx_dmn_push_event_create_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread); +internal void lnx_dmn_push_event_exit_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 exit_code); +internal void lnx_dmn_push_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, LNX_DMN_Module *module); +internal void lnx_dmn_push_event_unload_module(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, LNX_DMN_Module *module); +internal void lnx_dmn_push_event_handshake_complete(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process); +internal void lnx_dmn_push_event_breakpoint(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 address); +internal void lnx_dmn_push_event_single_step(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread); +internal void lnx_dmn_push_event_exception(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 signo); +internal void lnx_dmn_push_event_halt(Arena *arena, DMN_EventList *events); +internal void lnx_dmn_push_event_not_attached(Arena *arena, DMN_EventList *events); //////////////////////////////// //~ Debug Event -internal DMN_LNX_Thread * dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid); -internal void dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code); -internal DMN_LNX_Process * dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags); -internal void dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid); -internal void dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr); -internal void dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr); -internal void dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid); -internal void dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid); -internal void dmn_lnx_event_halt(Arena *arena, DMN_EventList *events); -internal void dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid); -internal void dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo); -internal DMN_LNX_Process * dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid); - -#endif // DEMON_CORE_LINUX_H +internal LNX_DMN_Thread * lnx_dmn_event_create_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, pid_t tid); +internal void lnx_dmn_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code); +internal LNX_DMN_Process * lnx_dmn_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, LNX_DMN_Process *parent_process, LNX_DMN_CreateProcessFlags flags); +internal void lnx_dmn_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid); +internal void lnx_dmn_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr); +internal void lnx_dmn_event_unload_module(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, U64 rdebug_vaddr); +internal void lnx_dmn_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid); +internal void lnx_dmn_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid); +internal void lnx_dmn_event_halt(Arena *arena, DMN_EventList *events); +internal void lnx_dmn_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid); +internal void lnx_dmn_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo); +internal LNX_DMN_Process * lnx_dmn_event_attach(Arena *arena, DMN_EventList *events, pid_t pid); +#endif // LINUX_DEMON_H diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index 905ddef6..f3726fa0 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -4,11 +4,11 @@ //////////////////////////////// //~ rjf: Helpers -internal OS_LNX_Window * +internal LNX_WM_Window * os_lnx_window_from_x11window(Window window) { - OS_LNX_Window *result = 0; - for(OS_LNX_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next) + LNX_WM_Window *result = 0; + for(LNX_WM_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next) { if(w->window == window) { @@ -23,11 +23,11 @@ os_lnx_window_from_x11window(Window window) //~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) internal void -os_gfx_init(void) +wm_init(void) { //- rjf: initialize basics Arena *arena = arena_alloc(); - os_lnx_gfx_state = push_array(arena, OS_LNX_GfxState, 1); + os_lnx_gfx_state = push_array(arena, LNX_WM_GfxState, 1); os_lnx_gfx_state->arena = arena; os_lnx_gfx_state->display = XOpenDisplay(0); @@ -48,20 +48,20 @@ os_gfx_init(void) { struct { - OS_Cursor cursor; + WM_Cursor cursor; unsigned int id; } map[] = { - {OS_Cursor_Pointer, XC_left_ptr}, - {OS_Cursor_IBar, XC_xterm}, - {OS_Cursor_LeftRight, XC_sb_h_double_arrow}, - {OS_Cursor_UpDown, XC_sb_v_double_arrow}, - {OS_Cursor_DownRight, XC_bottom_right_corner}, - {OS_Cursor_UpRight, XC_top_right_corner}, - {OS_Cursor_UpDownLeftRight, XC_fleur}, - {OS_Cursor_HandPoint, XC_hand1}, - {OS_Cursor_Disabled, XC_X_cursor}, + {WM_Cursor_Pointer, XC_left_ptr}, + {WM_Cursor_IBar, XC_xterm}, + {WM_Cursor_LeftRight, XC_sb_h_double_arrow}, + {WM_Cursor_UpDown, XC_sb_v_double_arrow}, + {WM_Cursor_DownRight, XC_bottom_right_corner}, + {WM_Cursor_UpRight, XC_top_right_corner}, + {WM_Cursor_UpDownLeftRight, XC_fleur}, + {WM_Cursor_HandPoint, XC_hand1}, + {WM_Cursor_Disabled, XC_X_cursor}, }; for EachElement(idx, map) { @@ -73,8 +73,8 @@ os_gfx_init(void) //////////////////////////////// //~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) -internal OS_GfxInfo * -os_get_gfx_info(void) +internal WM_SystemInfo * +wm_get_system_info(void) { return &os_lnx_gfx_state->gfx_info; } @@ -83,13 +83,13 @@ os_get_gfx_info(void) //~ rjf: @os_hooks Clipboards (Implemented Per-OS) internal void -os_set_clipboard_text(String8 string) +wm_set_clipboard_text(String8 string) { } internal String8 -os_get_clipboard_text(Arena *arena) +wm_get_clipboard_text(Arena *arena) { String8 result = {0}; return result; @@ -98,20 +98,20 @@ os_get_clipboard_text(Arena *arena) //////////////////////////////// //~ rjf: @os_hooks Windows (Implemented Per-OS) -internal OS_Window -os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) +internal WM_Window +wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) { Vec2F32 resolution = dim_2f32(rect); //- rjf: allocate window - OS_LNX_Window *w = os_lnx_gfx_state->free_window; + LNX_WM_Window *w = os_lnx_gfx_state->free_window; if(w) { SLLStackPop(os_lnx_gfx_state->free_window); } else { - w = push_array_no_zero(os_lnx_gfx_state->arena, OS_LNX_Window, 1); + w = push_array_no_zero(os_lnx_gfx_state->arena, LNX_WM_Window, 1); } MemoryZeroStruct(w); DLLPushBack(os_lnx_gfx_state->first_window, os_lnx_gfx_state->last_window, w); @@ -161,50 +161,50 @@ os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) scratch_end(scratch); //- rjf: convert to handle & return - OS_Window handle = {(U64)w}; + WM_Window handle = {(U64)w}; return handle; } internal void -os_window_close(OS_Window handle) +wm_window_close(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return;} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + if(wm_window_match(handle, wm_window_zero())) {return;} + LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; XDestroyWindow(os_lnx_gfx_state->display, w->window); } internal void -os_window_set_title(OS_Window handle, String8 title) +wm_window_set_title(WM_Window handle, String8 title) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} Temp scratch = scratch_begin(0, 0); - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; String8 title_copy = push_str8_copy(scratch.arena, title); XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str); scratch_end(scratch); } internal void -os_window_first_paint(OS_Window handle) +wm_window_first_paint(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return;} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + if(wm_window_match(handle, wm_window_zero())) {return;} + LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; XMapWindow(os_lnx_gfx_state->display, w->window); } internal void -os_window_focus(OS_Window handle) +wm_window_focus(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return;} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + if(wm_window_match(handle, wm_window_zero())) {return;} + LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; XSetInputFocus(os_lnx_gfx_state->display, w->window, RevertToNone, CurrentTime); } internal B32 -os_window_is_focused(OS_Window handle) +wm_window_is_focused(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return 0;} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + if(wm_window_match(handle, wm_window_zero())) {return 0;} + LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; Window focused_window = 0; int revert_to = 0; XGetInputFocus(os_lnx_gfx_state->display, &focused_window, &revert_to); @@ -213,97 +213,97 @@ os_window_is_focused(OS_Window handle) } internal B32 -os_window_is_fullscreen(OS_Window handle) +wm_window_is_fullscreen(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return 0;} + if(wm_window_match(handle, wm_window_zero())) {return 0;} // TODO(rjf) return 0; } internal void -os_window_set_fullscreen(OS_Window handle, B32 fullscreen) +wm_window_set_fullscreen(WM_Window handle, B32 fullscreen) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal B32 -os_window_is_maximized(OS_Window handle) +wm_window_is_maximized(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return 0;} + if(wm_window_match(handle, wm_window_zero())) {return 0;} // TODO(rjf) return 0; } internal void -os_window_set_maximized(OS_Window handle, B32 maximized) +wm_window_set_maximized(WM_Window handle, B32 maximized) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal B32 -os_window_is_minimized(OS_Window handle) +wm_window_is_minimized(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return 0;} + if(wm_window_match(handle, wm_window_zero())) {return 0;} // TODO(rjf) return 0; } internal void -os_window_set_minimized(OS_Window handle, B32 minimized) +wm_window_set_minimized(WM_Window handle, B32 minimized) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal void -os_window_bring_to_front(OS_Window handle) +wm_window_bring_to_front(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal void -os_window_set_monitor(OS_Window handle, OS_Monitor monitor) +wm_window_set_monitor(WM_Window handle, WM_Monitor monitor) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal void -os_window_clear_custom_border_data(OS_Window handle) +wm_window_clear_custom_border_data(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal void -os_window_push_custom_title_bar(OS_Window handle, F32 thickness) +wm_window_push_custom_title_bar(WM_Window handle, F32 thickness) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal void -os_window_push_custom_edges(OS_Window handle, F32 thickness) +wm_window_push_custom_edges(WM_Window handle, F32 thickness) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal void -os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect) +wm_window_push_custom_title_bar_client_area(WM_Window handle, Rng2F32 rect) { - if(os_window_match(handle, os_window_zero())) {return;} + if(wm_window_match(handle, wm_window_zero())) {return;} // TODO(rjf) } internal Rng2F32 -os_rect_from_window(OS_Window handle) +wm_rect_from_window(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return r2f32p(0, 0, 0, 0);} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + if(wm_window_match(handle, wm_window_zero())) {return r2f32p(0, 0, 0, 0);} + LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; XWindowAttributes atts = {0}; Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts); Rng2F32 result = r2f32p((F32)atts.x, (F32)atts.y, (F32)atts.x + (F32)atts.width, (F32)atts.y + (F32)atts.height); @@ -311,9 +311,9 @@ os_rect_from_window(OS_Window handle) } internal Rng2F32 -os_client_rect_from_window(OS_Window handle) +wm_client_rect_from_window(WM_Window handle) { - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; XWindowAttributes atts = {0}; Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts); Rng2F32 result = r2f32p(0, 0, (F32)atts.width, (F32)atts.height); @@ -321,7 +321,7 @@ os_client_rect_from_window(OS_Window handle) } internal F32 -os_dpi_from_window(OS_Window handle) +wm_dpi_from_window(WM_Window handle) { // TODO(rjf) return 96.f; @@ -330,16 +330,16 @@ os_dpi_from_window(OS_Window handle) //////////////////////////////// //~ rjf: @os_hooks External Windows (Implemented Per-OS) -internal OS_ExternalWindow -os_focused_external_window(void) +internal WM_ExtWindow +wm_focused_external_window(void) { - OS_ExternalWindow result = {0}; + WM_ExtWindow result = {0}; // TODO(rjf) return result; } internal void -os_focus_external_window(OS_ExternalWindow handle) +wm_focus_external_window(WM_ExtWindow handle) { // TODO(rjf) } @@ -347,46 +347,46 @@ os_focus_external_window(OS_ExternalWindow handle) //////////////////////////////// //~ rjf: @os_hooks Monitors (Implemented Per-OS) -internal OS_MonitorArray -os_push_monitors_array(Arena *arena) +internal WM_MonitorArray +wm_push_monitors_array(Arena *arena) { - OS_MonitorArray result = {0}; + WM_MonitorArray result = {0}; // TODO(rjf) return result; } -internal OS_Monitor -os_primary_monitor(void) +internal WM_Monitor +wm_primary_monitor(void) { - OS_Monitor result = {0}; + WM_Monitor result = {0}; // TODO(rjf) return result; } -internal OS_Monitor -os_monitor_from_window(OS_Window window) +internal WM_Monitor +wm_monitor_from_window(WM_Window window) { - OS_Monitor result = {0}; + WM_Monitor result = {0}; // TODO(rjf) return result; } internal String8 -os_name_from_monitor(Arena *arena, OS_Monitor monitor) +wm_name_from_monitor(Arena *arena, WM_Monitor monitor) { // TODO(rjf) return str8_zero(); } internal Vec2F32 -os_dim_from_monitor(OS_Monitor monitor) +wm_dim_from_monitor(WM_Monitor monitor) { // TODO(rjf) return v2f32(0, 0); } internal F32 -os_dpi_from_monitor(OS_Monitor monitor) +wm_dpi_from_monitor(WM_Monitor monitor) { // TODO(rjf) return 96.f; @@ -396,15 +396,15 @@ os_dpi_from_monitor(OS_Monitor monitor) //~ rjf: @os_hooks Events (Implemented Per-OS) internal void -os_send_wakeup_event(void) +wm_send_wakeup_event(void) { // TODO(rjf) } -internal OS_EventList -os_get_events(Arena *arena, B32 wait) +internal WM_EventList +wm_get_events(Arena *arena, B32 wait) { - OS_EventList evts = {0}; + WM_EventList evts = {0}; for(;XPending(os_lnx_gfx_state->display) > 0 || (wait && evts.count == 0);) { XEvent evt = {0}; @@ -419,86 +419,86 @@ os_get_events(Arena *arena, B32 wait) case KeyRelease: { // rjf: determine flags - OS_Modifiers modifiers = 0; - if(evt.xkey.state & ShiftMask) { modifiers |= OS_Modifier_Shift; } - if(evt.xkey.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; } - if(evt.xkey.state & Mod1Mask) { modifiers |= OS_Modifier_Alt; } + WM_Modifiers modifiers = 0; + if(evt.xkey.state & ShiftMask) { modifiers |= WM_Modifier_Shift; } + if(evt.xkey.state & ControlMask) { modifiers |= WM_Modifier_Ctrl; } + if(evt.xkey.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; } // rjf: map keycode -> keysym & codepoint - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xkey.window); + LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xkey.window); KeySym keysym = 0; U8 text[256] = {0}; U64 text_size = Xutf8LookupString(window->xic, &evt.xkey, (char *)text, sizeof(text), &keysym, 0); - // rjf: map keysym -> OS_Key + // rjf: map keysym -> WM_Key B32 is_right_sided = 0; - OS_Key key = OS_Key_Null; + WM_Key key = WM_Key_Null; switch(keysym) { default: { if(0){} - else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (OS_Key)(OS_Key_F1 + (keysym - XK_F1)); } - else if('0' <= keysym && keysym <= '9') { key = OS_Key_0 + (keysym-'0'); } + else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (WM_Key)(WM_Key_F1 + (keysym - XK_F1)); } + else if('0' <= keysym && keysym <= '9') { key = WM_Key_0 + (keysym-'0'); } }break; - case XK_Escape:{key = OS_Key_Esc;};break; - case XK_BackSpace:{key = OS_Key_Backspace;}break; - case XK_Delete:{key = OS_Key_Delete;}break; - case XK_Return:{key = OS_Key_Return;}break; - case XK_Pause:{key = OS_Key_Pause;}break; - case XK_Tab:{key = OS_Key_Tab;}break; - case XK_Left:{key = OS_Key_Left;}break; - case XK_Right:{key = OS_Key_Right;}break; - case XK_Up:{key = OS_Key_Up;}break; - case XK_Down:{key = OS_Key_Down;}break; - case XK_Home:{key = OS_Key_Home;}break; - case XK_End:{key = OS_Key_End;}break; - case XK_Page_Up:{key = OS_Key_PageUp;}break; - case XK_Page_Down:{key = OS_Key_PageDown;}break; - case XK_Alt_L:{ key = OS_Key_Alt; }break; - case XK_Alt_R:{ key = OS_Key_Alt; is_right_sided = 1;}break; - case XK_Shift_L:{ key = OS_Key_Shift; }break; - case XK_Shift_R:{ key = OS_Key_Shift; is_right_sided = 1;}break; - case XK_Control_L:{ key = OS_Key_Ctrl; }break; - case XK_Control_R:{ key = OS_Key_Ctrl; is_right_sided = 1;}break; - case '-':{key = OS_Key_Minus;}break; - case '=':{key = OS_Key_Equal;}break; - case '[':{key = OS_Key_LeftBracket;}break; - case ']':{key = OS_Key_RightBracket;}break; - case ';':{key = OS_Key_Semicolon;}break; - case '\'':{key = OS_Key_Quote;}break; - case '.':{key = OS_Key_Period;}break; - case ',':{key = OS_Key_Comma;}break; - case '/':{key = OS_Key_Slash;}break; - case '\\':{key = OS_Key_BackSlash;}break; - case '\t':{key = OS_Key_Tab;}break; - case 'a':case 'A':{key = OS_Key_A;}break; - case 'b':case 'B':{key = OS_Key_B;}break; - case 'c':case 'C':{key = OS_Key_C;}break; - case 'd':case 'D':{key = OS_Key_D;}break; - case 'e':case 'E':{key = OS_Key_E;}break; - case 'f':case 'F':{key = OS_Key_F;}break; - case 'g':case 'G':{key = OS_Key_G;}break; - case 'h':case 'H':{key = OS_Key_H;}break; - case 'i':case 'I':{key = OS_Key_I;}break; - case 'j':case 'J':{key = OS_Key_J;}break; - case 'k':case 'K':{key = OS_Key_K;}break; - case 'l':case 'L':{key = OS_Key_L;}break; - case 'm':case 'M':{key = OS_Key_M;}break; - case 'n':case 'N':{key = OS_Key_N;}break; - case 'o':case 'O':{key = OS_Key_O;}break; - case 'p':case 'P':{key = OS_Key_P;}break; - case 'q':case 'Q':{key = OS_Key_Q;}break; - case 'r':case 'R':{key = OS_Key_R;}break; - case 's':case 'S':{key = OS_Key_S;}break; - case 't':case 'T':{key = OS_Key_T;}break; - case 'u':case 'U':{key = OS_Key_U;}break; - case 'v':case 'V':{key = OS_Key_V;}break; - case 'w':case 'W':{key = OS_Key_W;}break; - case 'x':case 'X':{key = OS_Key_X;}break; - case 'y':case 'Y':{key = OS_Key_Y;}break; - case 'z':case 'Z':{key = OS_Key_Z;}break; - case ' ':{key = OS_Key_Space;}break; + case XK_Escape:{key = WM_Key_Esc;};break; + case XK_BackSpace:{key = WM_Key_Backspace;}break; + case XK_Delete:{key = WM_Key_Delete;}break; + case XK_Return:{key = WM_Key_Return;}break; + case XK_Pause:{key = WM_Key_Pause;}break; + case XK_Tab:{key = WM_Key_Tab;}break; + case XK_Left:{key = WM_Key_Left;}break; + case XK_Right:{key = WM_Key_Right;}break; + case XK_Up:{key = WM_Key_Up;}break; + case XK_Down:{key = WM_Key_Down;}break; + case XK_Home:{key = WM_Key_Home;}break; + case XK_End:{key = WM_Key_End;}break; + case XK_Page_Up:{key = WM_Key_PageUp;}break; + case XK_Page_Down:{key = WM_Key_PageDown;}break; + case XK_Alt_L:{ key = WM_Key_Alt; }break; + case XK_Alt_R:{ key = WM_Key_Alt; is_right_sided = 1;}break; + case XK_Shift_L:{ key = WM_Key_Shift; }break; + case XK_Shift_R:{ key = WM_Key_Shift; is_right_sided = 1;}break; + case XK_Control_L:{ key = WM_Key_Ctrl; }break; + case XK_Control_R:{ key = WM_Key_Ctrl; is_right_sided = 1;}break; + case '-':{key = WM_Key_Minus;}break; + case '=':{key = WM_Key_Equal;}break; + case '[':{key = WM_Key_LeftBracket;}break; + case ']':{key = WM_Key_RightBracket;}break; + case ';':{key = WM_Key_Semicolon;}break; + case '\'':{key = WM_Key_Quote;}break; + case '.':{key = WM_Key_Period;}break; + case ',':{key = WM_Key_Comma;}break; + case '/':{key = WM_Key_Slash;}break; + case '\\':{key = WM_Key_BackSlash;}break; + case '\t':{key = WM_Key_Tab;}break; + case 'a':case 'A':{key = WM_Key_A;}break; + case 'b':case 'B':{key = WM_Key_B;}break; + case 'c':case 'C':{key = WM_Key_C;}break; + case 'd':case 'D':{key = WM_Key_D;}break; + case 'e':case 'E':{key = WM_Key_E;}break; + case 'f':case 'F':{key = WM_Key_F;}break; + case 'g':case 'G':{key = WM_Key_G;}break; + case 'h':case 'H':{key = WM_Key_H;}break; + case 'i':case 'I':{key = WM_Key_I;}break; + case 'j':case 'J':{key = WM_Key_J;}break; + case 'k':case 'K':{key = WM_Key_K;}break; + case 'l':case 'L':{key = WM_Key_L;}break; + case 'm':case 'M':{key = WM_Key_M;}break; + case 'n':case 'N':{key = WM_Key_N;}break; + case 'o':case 'O':{key = WM_Key_O;}break; + case 'p':case 'P':{key = WM_Key_P;}break; + case 'q':case 'Q':{key = WM_Key_Q;}break; + case 'r':case 'R':{key = WM_Key_R;}break; + case 's':case 'S':{key = WM_Key_S;}break; + case 't':case 'T':{key = WM_Key_T;}break; + case 'u':case 'U':{key = WM_Key_U;}break; + case 'v':case 'V':{key = WM_Key_V;}break; + case 'w':case 'W':{key = WM_Key_W;}break; + case 'x':case 'X':{key = WM_Key_X;}break; + case 'y':case 'Y':{key = WM_Key_Y;}break; + case 'z':case 'Z':{key = WM_Key_Z;}break; + case ' ':{key = WM_Key_Space;}break; } // rjf: push text event @@ -509,7 +509,7 @@ os_get_events(Arena *arena, B32 wait) UnicodeDecode decode = utf8_decode(text+off, text_size-off); if(decode.codepoint != 0 && (decode.codepoint >= 32 || decode.codepoint == '\t')) { - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Text); + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Text); e->window.u64[0] = (U64)window; e->character = decode.codepoint; } @@ -523,7 +523,7 @@ os_get_events(Arena *arena, B32 wait) // rjf: push key event { - OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == KeyPress ? OS_EventKind_Press : OS_EventKind_Release); + WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == KeyPress ? WM_EventKind_Press : WM_EventKind_Release); e->window.u64[0] = (U64)window; e->modifiers = modifiers; e->key = key; @@ -536,26 +536,26 @@ os_get_events(Arena *arena, B32 wait) case ButtonRelease: { // rjf: determine flags - OS_Modifiers modifiers = 0; - if(evt.xbutton.state & ShiftMask) { modifiers |= OS_Modifier_Shift; } - if(evt.xbutton.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; } - if(evt.xbutton.state & Mod1Mask) { modifiers |= OS_Modifier_Alt; } + WM_Modifiers modifiers = 0; + if(evt.xbutton.state & ShiftMask) { modifiers |= WM_Modifier_Shift; } + if(evt.xbutton.state & ControlMask) { modifiers |= WM_Modifier_Ctrl; } + if(evt.xbutton.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; } - // rjf: map button -> OS_Key - OS_Key key = OS_Key_Null; + // rjf: map button -> WM_Key + WM_Key key = WM_Key_Null; switch(evt.xbutton.button) { default:{}break; - case Button1:{key = OS_Key_LeftMouseButton;}break; - case Button2:{key = OS_Key_MiddleMouseButton;}break; - case Button3:{key = OS_Key_RightMouseButton;}break; + case Button1:{key = WM_Key_LeftMouseButton;}break; + case Button2:{key = WM_Key_MiddleMouseButton;}break; + case Button3:{key = WM_Key_RightMouseButton;}break; } // rjf: push event - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xbutton.window); - if(key != OS_Key_Null) + LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xbutton.window); + if(key != WM_Key_Null) { - OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == ButtonPress ? OS_EventKind_Press : OS_EventKind_Release); + WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == ButtonPress ? WM_EventKind_Press : WM_EventKind_Release); e->window.u64[0] = (U64)window; e->modifiers = modifiers; e->key = key; @@ -564,7 +564,7 @@ os_get_events(Arena *arena, B32 wait) else if(evt.xbutton.button == Button4 || evt.xbutton.button == Button5) { - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Scroll); + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Scroll); e->window.u64[0] = (U64)window; e->modifiers = modifiers; e->delta = v2f32(0, evt.xbutton.button == Button4 ? -1.f : +1.f); @@ -575,8 +575,8 @@ os_get_events(Arena *arena, B32 wait) //- rjf: mouse motion case MotionNotify: { - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_MouseMove); + LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_MouseMove); e->window.u64[0] = (U64)window; e->pos.x = (F32)evt.xmotion.x; e->pos.y = (F32)evt.xmotion.y; @@ -589,8 +589,8 @@ os_get_events(Arena *arena, B32 wait) }break; case FocusOut: { - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xfocus.window); - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowLoseFocus); + LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xfocus.window); + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowLoseFocus); e->window.u64[0] = (U64)window; }break; @@ -599,13 +599,13 @@ os_get_events(Arena *arena, B32 wait) { if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_delete_window_atom) { - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); - OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowClose); + LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowClose); e->window.u64[0] = (U64)window; } else if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_sync_request_atom) { - OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window); if(window != 0) { window->counter_value = 0; @@ -637,25 +637,25 @@ os_get_events(Arena *arena, B32 wait) return evts; } -internal OS_Modifiers -os_get_modifiers(void) +internal WM_Modifiers +wm_get_modifiers(void) { // TODO(rjf) return 0; } internal B32 -os_key_is_down(OS_Key key) +wm_key_is_down(WM_Key key) { // TODO(rjf) return 0; } internal Vec2F32 -os_mouse_from_window(OS_Window handle) +wm_mouse_from_window(WM_Window handle) { - if(os_window_match(handle, os_window_zero())) {return v2f32(0, 0);} - OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0]; + if(wm_window_match(handle, wm_window_zero())) {return v2f32(0, 0);} + LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; Vec2F32 result = {0}; { Window root_window = 0; @@ -678,7 +678,7 @@ os_mouse_from_window(OS_Window handle) //~ rjf: @os_hooks Cursors (Implemented Per-OS) internal void -os_set_cursor(OS_Cursor cursor) +wm_set_cursor(WM_Cursor cursor) { os_lnx_gfx_state->last_set_cursor = cursor; } @@ -687,7 +687,7 @@ os_set_cursor(OS_Cursor cursor) //~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) internal void -os_graphical_message(B32 error, String8 title, String8 message) +wm_graphical_message(B32 error, String8 title, String8 message) { if(error) { @@ -698,7 +698,7 @@ os_graphical_message(B32 error, String8 title, String8 message) } internal String8 -os_graphical_pick_file(Arena *arena, String8 initial_path) +wm_graphical_pick_file(Arena *arena, String8 initial_path) { return str8_zero(); } @@ -707,13 +707,13 @@ os_graphical_pick_file(Arena *arena, String8 initial_path) //~ rjf: @os_hooks Shell Operations internal void -os_show_in_filesystem_ui(String8 path) +wm_show_in_filesystem_ui(String8 path) { // TODO(rjf) } internal void -os_open_in_browser(String8 url) +wm_open_in_browser(String8 url) { // TODO(rjf) } diff --git a/src/linux/window_manager/linux_window_manager.h b/src/linux/window_manager/linux_window_manager.h index 0034adde..80b5da01 100644 --- a/src/linux/window_manager/linux_window_manager.h +++ b/src/linux/window_manager/linux_window_manager.h @@ -17,11 +17,11 @@ //////////////////////////////// //~ rjf: Window State -typedef struct OS_LNX_Window OS_LNX_Window; -struct OS_LNX_Window +typedef struct LNX_WM_Window LNX_WM_Window; +struct LNX_WM_Window { - OS_LNX_Window *next; - OS_LNX_Window *prev; + LNX_WM_Window *next; + LNX_WM_Window *prev; Window window; XIC xic; XID counter_xid; @@ -31,31 +31,31 @@ struct OS_LNX_Window //////////////////////////////// //~ rjf: State Bundle -typedef struct OS_LNX_GfxState OS_LNX_GfxState; -struct OS_LNX_GfxState +typedef struct LNX_WM_GfxState LNX_WM_GfxState; +struct LNX_WM_GfxState { Arena *arena; Display *display; XIM xim; - OS_LNX_Window *first_window; - OS_LNX_Window *last_window; - OS_LNX_Window *free_window; + LNX_WM_Window *first_window; + LNX_WM_Window *last_window; + LNX_WM_Window *free_window; Atom wm_delete_window_atom; Atom wm_sync_request_atom; Atom wm_sync_request_counter_atom; - Cursor cursors[OS_Cursor_COUNT]; - OS_Cursor last_set_cursor; - OS_GfxInfo gfx_info; + Cursor cursors[WM_Cursor_COUNT]; + WM_Cursor last_set_cursor; + WM_SystemInfo gfx_info; }; //////////////////////////////// //~ rjf: Globals -global OS_LNX_GfxState *os_lnx_gfx_state = 0; +global LNX_WM_GfxState *os_lnx_gfx_state = 0; //////////////////////////////// //~ rjf: Helpers -internal OS_LNX_Window *os_lnx_window_from_x11window(Window window); +internal LNX_WM_Window *os_lnx_window_from_x11window(Window window); #endif // OS_GFX_LINUX_H diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 6dc53ee3..f85947ff 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -212,7 +212,7 @@ RD_VocabInfo rd_vocab_info_table[360] = {str8_lit_comp("open_palette"), str8_lit_comp(""), str8_lit_comp("Open Palette"), str8_lit_comp(""), RD_IconKind_List}, {str8_lit_comp("run_command"), str8_lit_comp(""), str8_lit_comp("Run Command"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp("Run External Driver Text Command"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Thread}, {str8_lit_comp("select_unwind"), str8_lit_comp(""), str8_lit_comp("Select Unwind"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("up_one_frame"), str8_lit_comp(""), str8_lit_comp("Up One Frame"), str8_lit_comp(""), RD_IconKind_UpArrow}, @@ -520,7 +520,7 @@ str8_lit_comp("activate_with_single_click"), str8_lit_comp("dir2"), str8_lit_comp("string"), str8_lit_comp("cmd_name"), -str8_lit_comp("os_event"), +str8_lit_comp("wm_event"), }; Rng1U64 rd_reg_slot_range_table[49] = @@ -573,7 +573,7 @@ Rng1U64 rd_reg_slot_range_table[49] = {OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)}, {OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)}, {OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)}, -{OffsetOf(RD_Regs, os_event), OffsetOf(RD_Regs, os_event) + sizeof(OS_Event *)}, +{OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; RD_CmdKindInfo rd_cmd_kind_info_table[249] = @@ -615,7 +615,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, { str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, { str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, @@ -831,124 +831,124 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = struct {String8 string; CFG_Binding binding;} rd_default_binding_table[118] = { -{str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("step_over_inst"), {OS_Key_F10, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("step_out"), {OS_Key_F11, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("halt"), {OS_Key_X, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("halt"), {OS_Key_Pause, 0 }}, -{str8_lit_comp("run"), {OS_Key_F5, 0 }}, -{str8_lit_comp("restart"), {OS_Key_F5, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("step_into"), {OS_Key_F11, 0 }}, -{str8_lit_comp("step_over"), {OS_Key_F10, 0 }}, -{str8_lit_comp("run_to_line"), {OS_Key_F10, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("set_next_statement"), {OS_Key_F10, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("inc_window_font_size"), {OS_Key_Equal, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("dec_window_font_size"), {OS_Key_Minus, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("window"), {OS_Key_N, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("toggle_fullscreen"), {OS_Key_Return, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("new_panel_right"), {OS_Key_P, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("new_panel_down"), {OS_Key_Minus, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("rotate_panel_columns"), {OS_Key_2, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("next_panel"), {OS_Key_Comma, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("prev_panel"), {OS_Key_Comma, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("focus_panel_right"), {OS_Key_Right, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, -{str8_lit_comp("focus_panel_left"), {OS_Key_Left, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, -{str8_lit_comp("focus_panel_up"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, -{str8_lit_comp("focus_panel_down"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, -{str8_lit_comp("undo"), {OS_Key_Z, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("redo"), {OS_Key_Y, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("go_back"), {OS_Key_Left, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("go_forward"), {OS_Key_Right, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("close_panel"), {OS_Key_P, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, -{str8_lit_comp("next_tab"), {OS_Key_PageDown, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("prev_tab"), {OS_Key_PageUp, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("next_tab"), {OS_Key_Tab, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("prev_tab"), {OS_Key_Tab, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("move_tab_right"), {OS_Key_PageDown, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("move_tab_left"), {OS_Key_PageUp, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("close_tab"), {OS_Key_W, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("tab_bar_top"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, -{str8_lit_comp("tab_bar_bottom"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, -{str8_lit_comp("open_tab"), {OS_Key_T, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("tab_settings"), {OS_Key_T, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, -{str8_lit_comp("open"), {OS_Key_O, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("switch"), {OS_Key_I, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("switch_to_partner_file"), {OS_Key_O, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("open_user"), {OS_Key_N, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, -{str8_lit_comp("open_project"), {OS_Key_N, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, -{str8_lit_comp("open_user"), {OS_Key_O, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, -{str8_lit_comp("open_project"), {OS_Key_O, 0 |OS_Modifier_Ctrl |OS_Modifier_Alt}}, -{str8_lit_comp("save_user"), {OS_Key_S, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, -{str8_lit_comp("save_project"), {OS_Key_S, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("edit"), {OS_Key_F2, 0 }}, -{str8_lit_comp("accept"), {OS_Key_Return, 0 }}, -{str8_lit_comp("accept"), {OS_Key_Space, 0 }}, -{str8_lit_comp("cancel"), {OS_Key_Esc, 0 }}, -{str8_lit_comp("focus_menu"), {OS_Key_D, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("move_left"), {OS_Key_Left, 0 }}, -{str8_lit_comp("move_right"), {OS_Key_Right, 0 }}, -{str8_lit_comp("move_up"), {OS_Key_Up, 0 }}, -{str8_lit_comp("move_down"), {OS_Key_Down, 0 }}, -{str8_lit_comp("move_left_select"), {OS_Key_Left, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("move_right_select"), {OS_Key_Right, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("move_up_select"), {OS_Key_Up, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("move_down_select"), {OS_Key_Down, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("move_left_chunk"), {OS_Key_Left, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("move_right_chunk"), {OS_Key_Right, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("move_up_chunk"), {OS_Key_Up, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("move_down_chunk"), {OS_Key_Down, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("move_up_page"), {OS_Key_PageUp, 0 }}, -{str8_lit_comp("move_down_page"), {OS_Key_PageDown, 0 }}, -{str8_lit_comp("move_up_whole"), {OS_Key_Home, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("move_down_whole"), {OS_Key_End, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("move_left_chunk_select"), {OS_Key_Left, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("move_right_chunk_select"), {OS_Key_Right, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("move_up_chunk_select"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("move_down_chunk_select"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("move_up_page_select"), {OS_Key_PageUp, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("move_down_page_select"), {OS_Key_PageDown, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("move_up_whole_select"), {OS_Key_Home, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("move_down_whole_select"), {OS_Key_End, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("move_up_reorder"), {OS_Key_Up, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("move_down_reorder"), {OS_Key_Down, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("move_home"), {OS_Key_Home, 0 }}, -{str8_lit_comp("move_end"), {OS_Key_End, 0 }}, -{str8_lit_comp("move_home_select"), {OS_Key_Home, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("move_end_select"), {OS_Key_End, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("select_all"), {OS_Key_A, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("delete_single"), {OS_Key_Delete, 0 }}, -{str8_lit_comp("delete_chunk"), {OS_Key_Delete, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("backspace_single"), {OS_Key_Backspace, 0 }}, -{str8_lit_comp("backspace_chunk"), {OS_Key_Backspace, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("copy"), {OS_Key_C, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("copy"), {OS_Key_Insert, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("cut"), {OS_Key_X, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("paste"), {OS_Key_V, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("paste"), {OS_Key_Insert, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("insert_text"), {OS_Key_Null, 0 }}, -{str8_lit_comp("move_next"), {OS_Key_Tab, 0 }}, -{str8_lit_comp("move_prev"), {OS_Key_Tab, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("goto_line"), {OS_Key_G, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("goto_address"), {OS_Key_G, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("search"), {OS_Key_F, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("search_backwards"), {OS_Key_R, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("find_next"), {OS_Key_F3, 0 }}, -{str8_lit_comp("find_prev"), {OS_Key_F3, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("find_selected_thread"), {OS_Key_F4, 0 }}, -{str8_lit_comp("goto_name"), {OS_Key_J, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("goto_name_at_cursor"), {OS_Key_F12, 0 }}, -{str8_lit_comp("toggle_watch_expr_at_cursor"), {OS_Key_W, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("toggle_watch_expr_at_mouse"), {OS_Key_D, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("toggle_watch_pin"), {OS_Key_F9, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("toggle_breakpoint"), {OS_Key_F9, 0 }}, -{str8_lit_comp("add_address_breakpoint"), {OS_Key_F9, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("add_function_breakpoint"), {OS_Key_F9, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("attach"), {OS_Key_F6, 0 |OS_Modifier_Shift }}, -{str8_lit_comp("open_palette"), {OS_Key_F1, 0 }}, -{str8_lit_comp("open_palette"), {OS_Key_P, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("log_marker"), {OS_Key_M, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, -{str8_lit_comp("toggle_dev_menu"), {OS_Key_D, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, +{str8_lit_comp("kill_all"), {WM_Key_F5, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("step_into_inst"), {WM_Key_F11, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("step_over_inst"), {WM_Key_F10, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("step_out"), {WM_Key_F11, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("halt"), {WM_Key_X, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("halt"), {WM_Key_Pause, 0 }}, +{str8_lit_comp("run"), {WM_Key_F5, 0 }}, +{str8_lit_comp("restart"), {WM_Key_F5, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("step_into"), {WM_Key_F11, 0 }}, +{str8_lit_comp("step_over"), {WM_Key_F10, 0 }}, +{str8_lit_comp("run_to_line"), {WM_Key_F10, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("set_next_statement"), {WM_Key_F10, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("inc_window_font_size"), {WM_Key_Equal, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("dec_window_font_size"), {WM_Key_Minus, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("window"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("toggle_fullscreen"), {WM_Key_Return, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("new_panel_right"), {WM_Key_P, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("new_panel_down"), {WM_Key_Minus, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("rotate_panel_columns"), {WM_Key_2, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("next_panel"), {WM_Key_Comma, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("prev_panel"), {WM_Key_Comma, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("focus_panel_right"), {WM_Key_Right, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("focus_panel_left"), {WM_Key_Left, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("focus_panel_up"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("focus_panel_down"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("undo"), {WM_Key_Z, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("redo"), {WM_Key_Y, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("go_back"), {WM_Key_Left, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("go_forward"), {WM_Key_Right, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("close_panel"), {WM_Key_P, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("next_tab"), {WM_Key_PageDown, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("prev_tab"), {WM_Key_PageUp, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("next_tab"), {WM_Key_Tab, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("prev_tab"), {WM_Key_Tab, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_tab_right"), {WM_Key_PageDown, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_tab_left"), {WM_Key_PageUp, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("close_tab"), {WM_Key_W, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("tab_bar_top"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("tab_bar_bottom"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("open_tab"), {WM_Key_T, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("tab_settings"), {WM_Key_T, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("open"), {WM_Key_O, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("switch"), {WM_Key_I, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("switch_to_partner_file"), {WM_Key_O, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("open_user"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("open_project"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("open_user"), {WM_Key_O, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("open_project"), {WM_Key_O, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("save_user"), {WM_Key_S, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("save_project"), {WM_Key_S, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("edit"), {WM_Key_F2, 0 }}, +{str8_lit_comp("accept"), {WM_Key_Return, 0 }}, +{str8_lit_comp("accept"), {WM_Key_Space, 0 }}, +{str8_lit_comp("cancel"), {WM_Key_Esc, 0 }}, +{str8_lit_comp("focus_menu"), {WM_Key_D, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("move_left"), {WM_Key_Left, 0 }}, +{str8_lit_comp("move_right"), {WM_Key_Right, 0 }}, +{str8_lit_comp("move_up"), {WM_Key_Up, 0 }}, +{str8_lit_comp("move_down"), {WM_Key_Down, 0 }}, +{str8_lit_comp("move_left_select"), {WM_Key_Left, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_right_select"), {WM_Key_Right, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_select"), {WM_Key_Up, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_down_select"), {WM_Key_Down, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_left_chunk"), {WM_Key_Left, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_right_chunk"), {WM_Key_Right, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_up_chunk"), {WM_Key_Up, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_down_chunk"), {WM_Key_Down, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_up_page"), {WM_Key_PageUp, 0 }}, +{str8_lit_comp("move_down_page"), {WM_Key_PageDown, 0 }}, +{str8_lit_comp("move_up_whole"), {WM_Key_Home, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_down_whole"), {WM_Key_End, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_left_chunk_select"), {WM_Key_Left, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_right_chunk_select"), {WM_Key_Right, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_chunk_select"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_down_chunk_select"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_page_select"), {WM_Key_PageUp, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_down_page_select"), {WM_Key_PageDown, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_whole_select"), {WM_Key_Home, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_down_whole_select"), {WM_Key_End, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_reorder"), {WM_Key_Up, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("move_down_reorder"), {WM_Key_Down, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("move_home"), {WM_Key_Home, 0 }}, +{str8_lit_comp("move_end"), {WM_Key_End, 0 }}, +{str8_lit_comp("move_home_select"), {WM_Key_Home, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_end_select"), {WM_Key_End, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("select_all"), {WM_Key_A, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("delete_single"), {WM_Key_Delete, 0 }}, +{str8_lit_comp("delete_chunk"), {WM_Key_Delete, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("backspace_single"), {WM_Key_Backspace, 0 }}, +{str8_lit_comp("backspace_chunk"), {WM_Key_Backspace, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("copy"), {WM_Key_C, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("copy"), {WM_Key_Insert, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("cut"), {WM_Key_X, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("paste"), {WM_Key_V, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("paste"), {WM_Key_Insert, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("insert_text"), {WM_Key_Null, 0 }}, +{str8_lit_comp("move_next"), {WM_Key_Tab, 0 }}, +{str8_lit_comp("move_prev"), {WM_Key_Tab, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("goto_line"), {WM_Key_G, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("goto_address"), {WM_Key_G, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("search"), {WM_Key_F, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("search_backwards"), {WM_Key_R, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("find_next"), {WM_Key_F3, 0 }}, +{str8_lit_comp("find_prev"), {WM_Key_F3, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("find_selected_thread"), {WM_Key_F4, 0 }}, +{str8_lit_comp("goto_name"), {WM_Key_J, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("goto_name_at_cursor"), {WM_Key_F12, 0 }}, +{str8_lit_comp("toggle_watch_expr_at_cursor"), {WM_Key_W, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("toggle_watch_expr_at_mouse"), {WM_Key_D, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("toggle_watch_pin"), {WM_Key_F9, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("toggle_breakpoint"), {WM_Key_F9, 0 }}, +{str8_lit_comp("add_address_breakpoint"), {WM_Key_F9, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("add_function_breakpoint"), {WM_Key_F9, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("attach"), {WM_Key_F6, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("open_palette"), {WM_Key_F1, 0 }}, +{str8_lit_comp("open_palette"), {WM_Key_P, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("log_marker"), {WM_Key_M, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("toggle_dev_menu"), {WM_Key_D, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, }; String8 rd_binding_version_remap_old_name_table[8] = diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index b4aee778..74d7fad6 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -56,7 +56,7 @@ RD_RegSlot_ActivateWithSingleClick, RD_RegSlot_Dir2, RD_RegSlot_String, RD_RegSlot_CmdName, -RD_RegSlot_OSEvent, +RD_RegSlot_WMEvent, RD_RegSlot_COUNT, } RD_RegSlot; @@ -99,7 +99,7 @@ RD_CmdKind_Exit, RD_CmdKind_OpenPalette, RD_CmdKind_RunCommand, RD_CmdKind_RunExternalDriverTextCommand, -RD_CmdKind_OSEvent, +RD_CmdKind_WMEvent, RD_CmdKind_SelectThread, RD_CmdKind_SelectUnwind, RD_CmdKind_UpOneFrame, @@ -498,7 +498,7 @@ B32 activate_with_single_click; Dir2 dir2; String8 string; String8 cmd_name; -OS_Event * os_event; +WM_Event * wm_event; }; typedef struct RD_Query RD_Query; @@ -598,7 +598,7 @@ Z(getting_started)\ .dir2 = rd_regs()->dir2,\ .string = rd_regs()->string,\ .cmd_name = rd_regs()->cmd_name,\ -.os_event = rd_regs()->os_event,\ +.wm_event = rd_regs()->wm_event,\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 35d08264..08c492b1 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -831,68 +831,68 @@ RD_VocabTable: RD_RegTable: { // rjf: ctrl entities - {D_Handle machine Machine } - {D_Handle module Module } - {D_Handle process Process } - {D_Handle thread Thread } - {D_Handle ctrl_entity CtrlEntity } + {D_Handle machine Machine } + {D_Handle module Module } + {D_Handle process Process } + {D_Handle thread Thread } + {D_Handle ctrl_entity CtrlEntity } // rjf: cfgs - {CFG_ID window Window } - {CFG_ID panel Panel } - {CFG_ID tab Tab } - {CFG_ID view View } - {CFG_ID prev_tab PrevTab } - {CFG_ID dst_panel DstPanel } - {CFG_ID cfg Cfg } - {CFG_IDList cfg_list CfgList } + {CFG_ID window Window } + {CFG_ID panel Panel } + {CFG_ID tab Tab } + {CFG_ID view View } + {CFG_ID prev_tab PrevTab } + {CFG_ID dst_panel DstPanel } + {CFG_ID cfg Cfg } + {CFG_IDList cfg_list CfgList } // rjf: evaluation space - {E_Space eval_space EvalSpace } + {E_Space eval_space EvalSpace } // rjf: frame selection - {U64 unwind_count UnwindCount } - {U64 inline_depth InlineDepth } + {U64 unwind_count UnwindCount } + {U64 inline_depth InlineDepth } // rjf: code / address location info - {String8 file_path FilePath } - {TxtPt cursor Cursor } - {TxtPt mark Mark } - {C_Key text_key TextKey } - {TXT_LangKind lang_kind LangKind } - {D_LineList lines Lines } - {DI_Key dbgi_key DbgiKey } - {U64 vaddr Vaddr } - {U64 voff Voff } - {Rng1U64 vaddr_range VaddrRange } - {Rng1U64 voff_range VoffRange } + {String8 file_path FilePath } + {TxtPt cursor Cursor } + {TxtPt mark Mark } + {C_Key text_key TextKey } + {TXT_LangKind lang_kind LangKind } + {D_LineList lines Lines } + {DI_Key dbgi_key DbgiKey } + {U64 vaddr Vaddr } + {U64 voff Voff } + {Rng1U64 vaddr_range VaddrRange } + {Rng1U64 voff_range VoffRange } // rjf: evaluation - {String8 expr Expr } + {String8 expr Expr } // rjf: ui context - {UI_Key ui_key UIKey } - {UI_Key src_ui_key SrcUIKey } - {Vec2F32 off_px OffPx } - {RD_RegSlot reg_slot RegSlot } + {UI_Key ui_key UIKey } + {UI_Key src_ui_key SrcUIKey } + {Vec2F32 off_px OffPx } + {RD_RegSlot reg_slot RegSlot } // rjf: general parameters - {U32 pid PID } - {B32 force_confirm ForceConfirm } - {B32 force_focus ForceFocus } - {B32 prefer_disasm PreferDisasm } - {B32 no_rich_tooltip NoRichTooltip } - {B32 do_implicit_root DoImplicitRoot} - {B32 do_lister DoLister } - {B32 do_big_rows DoBigRows } - {B32 all_windows AllWindows } - {B32 non_graphical NonGraphical } - {B32 prefer_new_tab PreferNewTab } - {B32 activate_with_single_click ActivateWithSingleClick } - {Dir2 dir2 Dir2 } - {String8 string String } - {String8 cmd_name CmdName } - {`OS_Event *` os_event OSEvent } + {U32 pid PID } + {B32 force_confirm ForceConfirm } + {B32 force_focus ForceFocus } + {B32 prefer_disasm PreferDisasm } + {B32 no_rich_tooltip NoRichTooltip } + {B32 do_implicit_root DoImplicitRoot } + {B32 do_lister DoLister } + {B32 do_big_rows DoBigRows } + {B32 all_windows AllWindows } + {B32 non_graphical NonGraphical } + {B32 prefer_new_tab PreferNewTab } + {B32 activate_with_single_click ActivateWithSingleClick } + {Dir2 dir2 Dir2 } + {String8 string String } + {String8 cmd_name CmdName } + {`WM_Event *` wm_event WMEvent } } @enum RD_RegSlot: @@ -945,7 +945,7 @@ RD_CmdTable: // | | | | {RunExternalDriverTextCommand 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 1 1 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } //- rjf: os event passthrough - {OSEvent 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "os_event" "OS Event" "" "" "" } + {WMEvent 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } //- rjf: thread/frame selection {SelectThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } @@ -1437,7 +1437,7 @@ RD_DefaultBindingTable: @data(`struct {String8 string; CFG_Binding binding;}`) @c_file rd_default_binding_table: { - @expand(RD_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_Modifier_Ctrl`) $(a.shift != 0 -> `|OS_Modifier_Shift`) $(a.alt != 0 -> `|OS_Modifier_Alt`)}}```; + @expand(RD_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {WM_Key_$(a.key), 0 $(a.ctrl != 0 -> `|WM_Modifier_Ctrl`) $(a.shift != 0 -> `|WM_Modifier_Shift`) $(a.alt != 0 -> `|WM_Modifier_Alt`)}}```; } //////////////////////////////// diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 334826b6..b89d6efc 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2625,7 +2625,7 @@ rd_view_ui(Rng2F32 rect) // rjf: copy if(op.flags & UI_TxtOpFlag_Copy && selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y) { - os_set_clipboard_text(op.copy); + wm_set_clipboard_text(op.copy); } // rjf: any valid *additive* op & autocomplete hint? -> perform autocomplete first, then re-compute op @@ -2776,7 +2776,7 @@ rd_view_ui(Rng2F32 rect) } } String8 string = str8_list_join(scratch.arena, &strs, 0); - os_set_clipboard_text(string); + wm_set_clipboard_text(string); } ////////////////////////// @@ -3221,7 +3221,7 @@ rd_view_ui(Rng2F32 rect) boundary_start_idx*row_height_px, next_cell_x_px + ui_top_font_size()*0.4f, idx*row_height_px); - UI_Rect(rect) UI_HoverCursor(OS_Cursor_LeftRight) + UI_Rect(rect) UI_HoverCursor(WM_Cursor_LeftRight) { UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_Floating, "boundary_%I64x_%I64x", row_hash, cell_id); UI_Signal sig = ui_signal_from_box(box); @@ -4381,7 +4381,7 @@ rd_view_ui(Rng2F32 rect) U64 value = e_value_from_string(loc.expr).u64; rd_cmd(RD_CmdKind_FindCodeLocation, .vaddr = value); } - else if(str8_match(cfg->string, str8_lit("target"), 0) && sig.event_flags & OS_Modifier_Ctrl) + else if(str8_match(cfg->string, str8_lit("target"), 0) && sig.event_flags & WM_Modifier_Ctrl) { rd_cmd(RD_CmdKind_EnableCfg, .cfg = cfg->id); } @@ -4937,7 +4937,7 @@ rd_window_state_from_cfg(CFG_Node *cfg) B32 has_pos = 0; Vec2F32 pos = {0}; Vec2F32 size = {0}; - OS_Monitor preferred_monitor = {0}; + WM_Monitor preferred_monitor = {0}; { CFG_Node *pos_cfg = cfg_node_child_from_string(window_cfg, str8_lit("pos")); has_pos = (pos_cfg != &cfg_nil_node); @@ -4947,10 +4947,10 @@ rd_window_state_from_cfg(CFG_Node *cfg) pos.y = (F32)f64_from_str8(pos_cfg->first->next->string); size.x = (F32)f64_from_str8(size_cfg->first->string); size.y = (F32)f64_from_str8(size_cfg->first->next->string); - OS_MonitorArray monitors = os_push_monitors_array(scratch.arena); + WM_MonitorArray monitors = wm_push_monitors_array(scratch.arena); for EachIndex(idx, monitors.count) { - String8 monitor_name = os_name_from_monitor(scratch.arena, monitors.v[idx]); + String8 monitor_name = wm_name_from_monitor(scratch.arena, monitors.v[idx]); if(str8_match(monitor_name, monitor_cfg->first->string, StringMatchFlag_CaseInsensitive)) { preferred_monitor = monitors.v[idx]; @@ -4976,7 +4976,7 @@ rd_window_state_from_cfg(CFG_Node *cfg) ws->arena = arena_alloc(); { String8 title = rd_push_window_title(scratch.arena); - ws->os = os_window_open(r2f32p(pos.x, pos.y, pos.x+size.x, pos.y+size.y), (!has_pos*OS_WindowFlag_UseDefaultPosition)|OS_WindowFlag_CustomBorder, title); + ws->os = wm_window_open(r2f32p(pos.x, pos.y, pos.x+size.x, pos.y+size.y), (!has_pos*WM_WindowFlag_UseDefaultPosition)|WM_WindowFlag_CustomBorder, title); } ws->r = r_window_equip(ws->os); ws->ui = ui_state_alloc(); @@ -4984,19 +4984,19 @@ rd_window_state_from_cfg(CFG_Node *cfg) ws->query_arena = arena_alloc(); ws->hover_eval_arena = arena_alloc(); ws->autocomp_arena = arena_alloc(); - ws->last_dpi = os_dpi_from_window(ws->os); - OS_Monitor zero_monitor = {0}; - if(!os_monitor_match(zero_monitor, preferred_monitor)) + ws->last_dpi = wm_dpi_from_window(ws->os); + WM_Monitor zero_monitor = {0}; + if(!wm_monitor_match(zero_monitor, preferred_monitor)) { - os_window_set_monitor(ws->os, preferred_monitor); + wm_window_set_monitor(ws->os, preferred_monitor); } if(cfg_node_child_from_string(window_cfg, str8_lit("fullscreen")) != &cfg_nil_node) { - os_window_set_fullscreen(ws->os, 1); + wm_window_set_fullscreen(ws->os, 1); } if(cfg_node_child_from_string(window_cfg, str8_lit("maximized")) != &cfg_nil_node) { - os_window_set_maximized(ws->os, 1); + wm_window_set_maximized(ws->os, 1); } // rjf: hook up window links @@ -5021,7 +5021,7 @@ rd_window_state_from_cfg(CFG_Node *cfg) } internal RD_WindowState * -rd_window_state_from_os_handle(OS_Window os) +rd_window_state_from_os_handle(WM_Window os) { RD_WindowState *ws = &rd_nil_window_state; { @@ -5029,7 +5029,7 @@ rd_window_state_from_os_handle(OS_Window os) w != &rd_nil_window_state; w = w->order_next) { - if(os_window_match(w->os, os)) + if(wm_window_match(w->os, os)) { ws = w; break; @@ -5055,7 +5055,7 @@ rd_window_frame(void) CFG_Node *window = cfg_node_from_id(rd_regs()->window); RD_WindowState *ws = rd_window_state_from_cfg(cfg_node_from_id(rd_regs()->window)); CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window); - B32 window_is_focused = (os_window_is_focused(ws->os) || ws->window_temporarily_focused_ipc); + B32 window_is_focused = (wm_window_is_focused(ws->os) || ws->window_temporarily_focused_ipc); B32 popup_is_open = (rd_state->popup_active); B32 query_is_open = (ws->query_is_active); U64 hover_eval_open_delay_us = 400000; @@ -5258,9 +5258,9 @@ rd_window_frame(void) // { Temp scratch = scratch_begin(0, 0); - B32 is_fullscreen = os_window_is_fullscreen(ws->os); - B32 is_maximized = os_window_is_maximized(ws->os); - B32 is_minimized = os_window_is_minimized(ws->os); + B32 is_fullscreen = wm_window_is_fullscreen(ws->os); + B32 is_maximized = wm_window_is_maximized(ws->os); + B32 is_minimized = wm_window_is_minimized(ws->os); if(is_fullscreen) { cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit("fullscreen")); @@ -5279,7 +5279,7 @@ rd_window_frame(void) } //- rjf: DPI changes -> xform font size / window size - F32 dpi = os_dpi_from_window(ws->os); + F32 dpi = wm_dpi_from_window(ws->os); if(dpi != ws->last_dpi) { fnt_reset(); @@ -5292,7 +5292,7 @@ rd_window_frame(void) } //- rjf: commit position - Rng2F32 window_rect = os_rect_from_window(ws->os); + Rng2F32 window_rect = wm_rect_from_window(ws->os); if(!is_fullscreen && !is_maximized && !is_minimized) { Vec2F32 pos = window_rect.p0; @@ -5345,8 +5345,8 @@ rd_window_frame(void) //- rjf: commit monitor if(!is_minimized) { - OS_Monitor monitor = os_monitor_from_window(ws->os); - String8 monitor_name = os_name_from_monitor(scratch.arena, monitor); + WM_Monitor monitor = wm_monitor_from_window(ws->os); + String8 monitor_name = wm_name_from_monitor(scratch.arena, monitor); CFG_Node *monitor_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit("monitor")); if(!str8_match(monitor_root->first->string, monitor_name, 0)) { @@ -5422,13 +5422,13 @@ rd_window_frame(void) //////////////////////////// //- rjf: @window_ui_part calculate top-level rectangles/sizes // - Rng2F32 window_rect = os_client_rect_from_window(ws->os); + Rng2F32 window_rect = wm_client_rect_from_window(ws->os); Vec2F32 window_rect_dim = dim_2f32(window_rect); F32 top_bar_dim_px = floor_f32(ui_top_font_size()*3.f); Rng2F32 top_bar_rect = r2f32p(window_rect.x0, window_rect.y0, window_rect.x0+window_rect_dim.x+1, window_rect.y0+top_bar_dim_px); Rng2F32 bottom_bar_rect = r2f32p(window_rect.x0, window_rect_dim.y - top_bar_dim_px, window_rect.x0+window_rect_dim.x, window_rect.y0+window_rect_dim.y); Rng2F32 content_rect = r2f32p(window_rect.x0, top_bar_rect.y1, window_rect.x0+window_rect_dim.x, bottom_bar_rect.y0); - F32 window_edge_px = os_dpi_from_window(ws->os)*0.035f; + F32 window_edge_px = wm_dpi_from_window(ws->os)*0.035f; content_rect = pad_2f32(content_rect, -window_edge_px); //////////////////////////// @@ -6436,7 +6436,7 @@ rd_window_frame(void) if(t->force_inside_window_x || t->force_inside_window_y) { B32 axis_mask[] = {t->force_inside_window_x, t->force_inside_window_y}; - Rng2F32 window_rect = os_client_rect_from_window(ws->os); + Rng2F32 window_rect = wm_client_rect_from_window(ws->os); for EachEnumVal(Axis2, axis) { if(!axis_mask[axis]) { continue; } @@ -6497,7 +6497,7 @@ rd_window_frame(void) for(UI_Event *evt = 0; ui_next_event(&evt);) { if(evt->kind == UI_EventKind_Press && - evt->key == OS_Key_LeftMouseButton) + evt->key == WM_Key_LeftMouseButton) { if(contains_2f32(container->rect, evt->pos)) { @@ -6645,9 +6645,9 @@ rd_window_frame(void) // ProfScope("build top bar") { - os_window_clear_custom_border_data(ws->os); - os_window_push_custom_edges(ws->os, window_edge_px); - os_window_push_custom_title_bar(ws->os, dim_2f32(top_bar_rect).y); + wm_window_clear_custom_border_data(ws->os); + wm_window_push_custom_edges(ws->os, window_edge_px); + wm_window_push_custom_title_bar(ws->os, dim_2f32(top_bar_rect).y); ui_set_next_flags(UI_BoxFlag_DefaultFocusNav|UI_BoxFlag_DisableFocusOverlay); UI_Focus((ws->menu_bar_focused && window_is_focused && !ui_any_ctx_menu_is_open()) ? UI_FocusKind_On : UI_FocusKind_Null) UI_TagF("menu_bar") @@ -6911,7 +6911,7 @@ rd_window_frame(void) if(key_map_nodes.first != 0) { binding = key_map_nodes.first->v->binding; - binding_str = os_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key); + binding_str = wm_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key); } UI_TagF(".") UI_Row @@ -6945,7 +6945,7 @@ rd_window_frame(void) UI_Signal sig = ui_button(str8_lit("Submit request, issue, or bug report")); if(ui_clicked(sig)) { - os_open_in_browser(url); + wm_open_in_browser(url); } } ui_spacer(ui_em(0.5f, 1.f)); @@ -6959,18 +6959,18 @@ rd_window_frame(void) { String8 name; U32 codepoint; - OS_Key key; + WM_Key key; UI_Key menu_key; } items[] = { - {str8_lit("File"), 'f', OS_Key_F, file_menu_key}, - {str8_lit("Window"), 'w', OS_Key_W, window_menu_key}, - {str8_lit("Panel"), 'p', OS_Key_P, panel_menu_key}, - {str8_lit("Tab"), 'b', OS_Key_V, tab_menu_key}, - {str8_lit("Targets"), 't', OS_Key_T, targets_menu_key}, - {str8_lit("Control"), 'c', OS_Key_C, ctrl_menu_key}, - {str8_lit("Help"), 'h', OS_Key_H, help_menu_key}, + {str8_lit("File"), 'f', WM_Key_F, file_menu_key}, + {str8_lit("Window"), 'w', WM_Key_W, window_menu_key}, + {str8_lit("Panel"), 'p', WM_Key_P, panel_menu_key}, + {str8_lit("Tab"), 'b', WM_Key_V, tab_menu_key}, + {str8_lit("Targets"), 't', WM_Key_T, targets_menu_key}, + {str8_lit("Control"), 'c', WM_Key_C, ctrl_menu_key}, + {str8_lit("Help"), 'h', WM_Key_H, help_menu_key}, }; // rjf: determine if one of the menus is already open @@ -7016,7 +7016,7 @@ rd_window_frame(void) { ui_set_next_fastpath_codepoint(items[idx].codepoint); B32 alt_fastpath_key = 0; - if(rd_setting_b32_from_name(str8_lit("focus_menu_bar_with_alt")) && ui_key_press(OS_Modifier_Alt, items[idx].key)) + if(rd_setting_b32_from_name(str8_lit("focus_menu_bar_with_alt")) && ui_key_press(WM_Modifier_Alt, items[idx].key)) { alt_fastpath_key = 1; } @@ -7025,7 +7025,7 @@ rd_window_frame(void) ui_set_next_flags(UI_BoxFlag_DrawTextFastpathCodepoint); } UI_Signal sig = rd_menu_bar_button(items[idx].name); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + wm_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); if(menu_open) { if((ui_hovering(sig) && !ui_ctx_menu_is_open(items[idx].menu_key)) || (open_menu_idx_prime == idx && open_menu_idx_prime != open_menu_idx)) @@ -7086,7 +7086,7 @@ rd_window_frame(void) { String8 cmd_name = center_button_tasks[idx].cmd_name; UI_Signal sig = ui_button(rd_icon_kind_text_table[rd_icon_kind_from_code_name(cmd_name)]); - os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); + wm_window_push_custom_title_bar_client_area(ws->os, sig.box->rect); if(ui_hovering(sig)) { RD_RegsScope(.cmd_name = cmd_name, .ui_key = sig.box->key) rd_set_hover_regs(RD_RegSlot_CmdName); @@ -7119,7 +7119,7 @@ rd_window_frame(void) UI_BoxFlag_DrawHotEffects| UI_BoxFlag_DrawActiveEffects, "###loaded_user_button"); - os_window_push_custom_title_bar_client_area(ws->os, user_box->rect); + wm_window_push_custom_title_bar_client_area(ws->os, user_box->rect); UI_Parent(user_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) { String8 user_path = rd_state->user_path; @@ -7153,7 +7153,7 @@ rd_window_frame(void) UI_BoxFlag_DrawHotEffects| UI_BoxFlag_DrawActiveEffects, "###loaded_project_button"); - os_window_push_custom_title_bar_client_area(ws->os, prof_box->rect); + wm_window_push_custom_title_bar_client_area(ws->os, prof_box->rect); UI_Parent(prof_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center) UI_Padding(ui_em(0.5f, 1.f)) { CFG_Node *root = cfg_node_root(); @@ -7207,7 +7207,7 @@ rd_window_frame(void) UI_FontSize(ui_top_font_size()*0.75f) { min_sig = rd_icon_buttonf(RD_IconKind_WindowMinimize, 0, "##minimize"); - max_sig = rd_icon_buttonf(os_window_is_maximized(ws->os) ? RD_IconKind_WindowRestore : RD_IconKind_Window, 0, "##maximize"); + max_sig = rd_icon_buttonf(wm_window_is_maximized(ws->os) ? RD_IconKind_WindowRestore : RD_IconKind_Window, 0, "##maximize"); } UI_PrefWidth(ui_px(button_dim, 1.f)) UI_TagF("bad_pop") @@ -7216,11 +7216,11 @@ rd_window_frame(void) } if(ui_clicked(min_sig)) { - os_window_set_minimized(ws->os, 1); + wm_window_set_minimized(ws->os, 1); } if(ui_clicked(max_sig)) { - os_window_set_maximized(ws->os, !os_window_is_maximized(ws->os)); + wm_window_set_maximized(ws->os, !wm_window_is_maximized(ws->os)); } if(ui_clicked(cls_sig)) { @@ -7234,9 +7234,9 @@ rd_window_frame(void) rd_cmd(RD_CmdKind_Exit); } } - os_window_push_custom_title_bar_client_area(ws->os, min_sig.box->rect); - os_window_push_custom_title_bar_client_area(ws->os, max_sig.box->rect); - os_window_push_custom_title_bar_client_area(ws->os, pad_2f32(cls_sig.box->rect, 2.f)); + wm_window_push_custom_title_bar_client_area(ws->os, min_sig.box->rect); + wm_window_push_custom_title_bar_client_area(ws->os, max_sig.box->rect); + wm_window_push_custom_title_bar_client_area(ws->os, pad_2f32(cls_sig.box->rect, 2.f)); } } } @@ -7629,7 +7629,7 @@ rd_window_frame(void) UI_Rect(boundary_rect) { - ui_set_next_hover_cursor(split_axis == Axis2_X ? OS_Cursor_LeftRight : OS_Cursor_UpDown); + ui_set_next_hover_cursor(split_axis == Axis2_X ? WM_Cursor_LeftRight : WM_Cursor_UpDown); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%p_%p", min_child->cfg, max_child->cfg); UI_Signal sig = ui_signal_from_box(box); if(ui_double_clicked(sig)) @@ -8569,7 +8569,7 @@ rd_window_frame(void) // for(UI_Event *evt = 0; ui_next_event(&evt);) { - if(evt->kind == UI_EventKind_Scroll && evt->modifiers == OS_Modifier_Ctrl) + if(evt->kind == UI_EventKind_Scroll && evt->modifiers == WM_Modifier_Ctrl) { ui_eat_event(evt); if(evt->delta_2f32.y < 0) @@ -8614,7 +8614,7 @@ rd_window_frame(void) { Temp scratch = scratch_begin(0, 0); F32 box_squish_epsilon = 0.001f; - Rng2F32 window_rect = os_client_rect_from_window(ws->os); + Rng2F32 window_rect = wm_client_rect_from_window(ws->os); //- rjf: unpack settings F32 rounded_corner_amount = rd_setting_f32_from_name(str8_lit("rounded_corner_amount")); @@ -8634,7 +8634,7 @@ rd_window_frame(void) U64 heatmap_bucket_count = 0; if(DEV_draw_ui_box_heatmap) { - Rng2F32 rect = os_client_rect_from_window(ws->os); + Rng2F32 rect = wm_client_rect_from_window(ws->os); Vec2F32 size = dim_2f32(rect); Vec2S32 buckets_dim = {(S32)(size.x/heatmap_bucket_size), (S32)(size.y/heatmap_bucket_size)}; heatmap_bucket_pitch = buckets_dim.x; @@ -8644,12 +8644,12 @@ rd_window_frame(void) //- rjf: draw background color { - dr_rect(os_client_rect_from_window(ws->os), base_background_color, 0, 0, 0); + dr_rect(wm_client_rect_from_window(ws->os), base_background_color, 0, 0, 0); } //- rjf: draw window border { - dr_rect(os_client_rect_from_window(ws->os), base_border_color, 0, 1.f, border_softness*0.5f); + dr_rect(wm_client_rect_from_window(ws->os), base_border_color, 0, 1.f, border_softness*0.5f); } //- rjf: recurse & draw @@ -9117,7 +9117,7 @@ rd_window_frame(void) { Vec4F32 color = ui_color_from_name(str8_lit("text")); color.w *= ws->error_t; - Rng2F32 rect = os_client_rect_from_window(ws->os); + Rng2F32 rect = wm_client_rect_from_window(ws->os); dr_rect(pad_2f32(rect, 24.f), color, 0, 16.f, 12.f); dr_rect(rect, v4f32(color.x, color.y, color.z, color.w*0.025f), 0, 0, 0); } @@ -9126,7 +9126,7 @@ rd_window_frame(void) if(rd_state->bind_change_active) UI_TagF("pop") { Vec4F32 color = ui_color_from_name(str8_lit("background")); - Rng2F32 rect = os_client_rect_from_window(ws->os); + Rng2F32 rect = wm_client_rect_from_window(ws->os); dr_rect(pad_2f32(rect, 24.f), color, 0, 16.f, 12.f); dr_rect(rect, v4f32(color.x, color.y, color.z, color.w*0.025f), 0, 0, 0); } @@ -9138,7 +9138,7 @@ rd_window_frame(void) //- rjf: @window_frame_part update per-window frame counters/info // ws->frames_alive += 1; - ws->last_window_rect = os_client_rect_from_window(ws->os); + ws->last_window_rect = wm_client_rect_from_window(ws->os); ProfEnd(); scratch_end(scratch); @@ -10707,7 +10707,7 @@ rd_frame(void) B32 any_window_is_focused = 0; for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next) { - if(os_window_is_focused(w->os)) + if(wm_window_is_focused(w->os)) { any_window_is_focused = 1; break; @@ -10757,10 +10757,10 @@ rd_frame(void) ////////////////////////////// //- rjf: get events from the OS // - OS_EventList events = {0}; + WM_EventList events = {0}; if(rd_state->frame_depth == 1) { - events = os_get_events(scratch.arena, rd_state->num_frames_requested == 0 && !DEV_always_refresh); + events = wm_get_events(scratch.arena, rd_state->num_frames_requested == 0 && !DEV_always_refresh); } ////////////////////////////// @@ -10794,7 +10794,7 @@ rd_frame(void) // // TODO(rjf): maximize target, given all windows and their monitors // - F32 target_hz = os_get_gfx_info()->default_refresh_rate; + F32 target_hz = wm_get_system_info()->default_refresh_rate; if(rd_state->frame_index > 32) { F32 possible_alternate_hz_targets[] = {target_hz, 60.f, 75.f, 120.f, 144.f, 165.f, 240.f, 360.f}; @@ -10847,30 +10847,30 @@ rd_frame(void) // if(!rd_state->popup_active && rd_state->bind_change_active) { - if(os_key_press(&events, os_window_zero(), 0, OS_Key_Esc)) + if(wm_key_press(&events, wm_window_zero(), 0, WM_Key_Esc)) { rd_request_frame(); rd_state->bind_change_active = 0; } - if(os_key_press(&events, os_window_zero(), 0, OS_Key_Delete)) + if(wm_key_press(&events, wm_window_zero(), 0, WM_Key_Delete)) { rd_request_frame(); cfg_node_release(rd_state->cfg, cfg_node_from_id(rd_state->bind_change_binding_id)); rd_state->bind_change_active = 0; } - for(OS_Event *event = events.first, *next = 0; event != 0; event = next) + for(WM_Event *event = events.first, *next = 0; event != 0; event = next) { - if(event->kind == OS_EventKind_Press && - event->key != OS_Key_Esc && - event->key != OS_Key_Return && - event->key != OS_Key_Backspace && - event->key != OS_Key_Delete && - event->key != OS_Key_LeftMouseButton && - event->key != OS_Key_RightMouseButton && - event->key != OS_Key_MiddleMouseButton && - event->key != OS_Key_Ctrl && - event->key != OS_Key_Alt && - event->key != OS_Key_Shift) + if(event->kind == WM_EventKind_Press && + event->key != WM_Key_Esc && + event->key != WM_Key_Return && + event->key != WM_Key_Backspace && + event->key != WM_Key_Delete && + event->key != WM_Key_LeftMouseButton && + event->key != WM_Key_RightMouseButton && + event->key != WM_Key_MiddleMouseButton && + event->key != WM_Key_Ctrl && + event->key != WM_Key_Alt && + event->key != WM_Key_Shift) { rd_state->bind_change_active = 0; CFG_Node *binding = cfg_node_from_id(rd_state->bind_change_binding_id); @@ -10882,13 +10882,13 @@ rd_frame(void) } cfg_node_release_all_children(rd_state->cfg, binding); cfg_node_new(rd_state->cfg, binding, rd_state->bind_change_cmd_name); - cfg_node_new(rd_state->cfg, binding, os_g_key_cfg_string_table[event->key]); - if(event->modifiers & OS_Modifier_Ctrl) { cfg_node_new(rd_state->cfg, binding, str8_lit("ctrl")); } - if(event->modifiers & OS_Modifier_Shift) { cfg_node_new(rd_state->cfg, binding, str8_lit("shift")); } - if(event->modifiers & OS_Modifier_Alt) { cfg_node_new(rd_state->cfg, binding, str8_lit("alt")); } - U32 codepoint = os_codepoint_from_modifiers_and_key(event->modifiers, event->key); - os_text(&events, event->window, codepoint); - os_eat_event(&events, event); + cfg_node_new(rd_state->cfg, binding, wm_key_cfg_name_table[event->key]); + if(event->modifiers & WM_Modifier_Ctrl) { cfg_node_new(rd_state->cfg, binding, str8_lit("ctrl")); } + if(event->modifiers & WM_Modifier_Shift) { cfg_node_new(rd_state->cfg, binding, str8_lit("shift")); } + if(event->modifiers & WM_Modifier_Alt) { cfg_node_new(rd_state->cfg, binding, str8_lit("alt")); } + U32 codepoint = wm_codepoint_from_modifiers_and_key(event->modifiers, event->key); + wm_text(&events, event->window, codepoint); + wm_eat_event(&events, event); rd_request_frame(); break; } @@ -10928,7 +10928,7 @@ rd_frame(void) // ProfScope("consume events") { - for(OS_Event *event = events.first, *next = 0; + for(WM_Event *event = events.first, *next = 0; event != 0; event = next) RD_RegsScope() @@ -10948,13 +10948,13 @@ rd_frame(void) B32 take = 0; //- rjf: try drag/drop drop-kickoff - if(rd_drag_is_active() && event->kind == OS_EventKind_Release && event->key == OS_Key_LeftMouseButton) + if(rd_drag_is_active() && event->kind == WM_EventKind_Release && event->key == WM_Key_LeftMouseButton) { rd_state->drag_drop_state = RD_DragDropState_Dropping; } //- rjf: try window close - if(!take && event->kind == OS_EventKind_WindowClose && ws != 0) + if(!take && event->kind == WM_EventKind_WindowClose && ws != 0) { take = 1; rd_cmd(RD_CmdKind_Exit); @@ -10963,7 +10963,7 @@ rd_frame(void) //- rjf: try menu bar operations if(rd_state->alt_menu_bar_enabled) { - if(!take && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) + if(!take && event->kind == WM_EventKind_Press && event->key == WM_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) { take = 1; rd_request_frame(); @@ -10971,26 +10971,26 @@ rd_frame(void) ws->menu_bar_key_held = 1; ws->menu_bar_focus_press_started = 1; } - if(!take && event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) + if(!take && event->kind == WM_EventKind_Release && event->key == WM_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) { take = 1; rd_request_frame(); ws->menu_bar_key_held = 0; } - if(ws->menu_bar_focused && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) + if(ws->menu_bar_focused && event->kind == WM_EventKind_Press && event->key == WM_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) { take = 1; rd_request_frame(); ws->menu_bar_focused = 0; } - else if(ws->menu_bar_focus_press_started && !ws->menu_bar_focused && event->kind == OS_EventKind_Release && event->modifiers == 0 && event->key == OS_Key_Alt && event->is_repeat == 0) + else if(ws->menu_bar_focus_press_started && !ws->menu_bar_focused && event->kind == WM_EventKind_Release && event->modifiers == 0 && event->key == WM_Key_Alt && event->is_repeat == 0) { take = 1; rd_request_frame(); ws->menu_bar_focused = !ws->menu_bar_focused_on_press; ws->menu_bar_focus_press_started = 0; } - else if(event->kind == OS_EventKind_Press && event->key == OS_Key_Esc && ws->menu_bar_focused && !ui_any_ctx_menu_is_open()) + else if(event->kind == WM_EventKind_Press && event->key == WM_Key_Esc && ws->menu_bar_focused && !ui_any_ctx_menu_is_open()) { take = 1; rd_request_frame(); @@ -10999,13 +10999,13 @@ rd_frame(void) } //- rjf: try hotkey presses - if(!take && event->kind == OS_EventKind_Press) + if(!take && event->kind == WM_EventKind_Press) { CFG_Binding binding = {event->key, event->modifiers}; CFG_KeyMapNodePtrList key_map_nodes = cfg_key_map_node_ptr_list_from_binding(scratch.arena, rd_state->key_map, binding); if(key_map_nodes.first != 0) { - U32 hit_char = os_codepoint_from_modifiers_and_key(event->modifiers, event->key); + U32 hit_char = wm_codepoint_from_modifiers_and_key(event->modifiers, event->key); if(hit_char == 0 || allow_text_hotkeys) { String8 cmd_name = key_map_nodes.first->v->name; @@ -11019,17 +11019,17 @@ rd_frame(void) rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_name); if(allow_text_hotkeys) { - os_text(&events, event->window, hit_char); + wm_text(&events, event->window, hit_char); next = event->next; } take = 1; - if(event->modifiers & OS_Modifier_Alt) + if(event->modifiers & WM_Modifier_Alt) { ws->menu_bar_focus_press_started = 0; } } } - else if(OS_Key_F1 <= event->key && event->key <= OS_Key_F19) + else if(WM_Key_F1 <= event->key && event->key <= WM_Key_F19) { ws->menu_bar_focus_press_started = 0; } @@ -11037,14 +11037,14 @@ rd_frame(void) } //- rjf: try text events - if(!take && event->kind == OS_EventKind_Text) + if(!take && event->kind == WM_EventKind_Text) { String32 insertion32 = str32(&event->character, 1); String8 insertion8 = str8_from_32(scratch.arena, insertion32); rd_cmd(RD_CmdKind_InsertText, .string = insertion8); rd_request_frame(); take = 1; - if(event->modifiers & OS_Modifier_Alt) + if(event->modifiers & WM_Modifier_Alt) { ws->menu_bar_focus_press_started = 0; } @@ -11054,13 +11054,13 @@ rd_frame(void) if(!take) { take = 1; - rd_cmd(RD_CmdKind_OSEvent, .os_event = event); + rd_cmd(RD_CmdKind_WMEvent, .wm_event = event); } //- rjf: take if(take) { - os_eat_event(&events, event); + wm_eat_event(&events, event); } } } @@ -12146,7 +12146,7 @@ rd_frame(void) // rjf: run -> refocus pre-stop focused window if(kind == RD_CmdKind_Run) { - os_focus_external_window(rd_state->prestop_focused_window); + wm_focus_external_window(rd_state->prestop_focused_window); } // rjf: run -> no active targets, no processes, but we only have one target? -> just launch it, then select it @@ -12278,7 +12278,7 @@ rd_frame(void) { current_path_string = path_normalized_from_string(scratch.arena, get_current_path(scratch.arena)); } - String8 file_path = os_graphical_pick_file(scratch.arena, current_path_string); + String8 file_path = wm_graphical_pick_file(scratch.arena, current_path_string); file_path = path_normalized_from_string(scratch.arena, file_path); if(file_path.size != 0) { @@ -12418,7 +12418,7 @@ rd_frame(void) RD_WindowState *ws = rd_window_state_from_cfg(wcfg); if(ws != &rd_nil_window_state) { - os_window_set_fullscreen(ws->os, !os_window_is_fullscreen(ws->os)); + wm_window_set_fullscreen(ws->os, !wm_window_is_fullscreen(ws->os)); } }break; case RD_CmdKind_BringToFront: @@ -12431,8 +12431,8 @@ rd_frame(void) } if(last_focused_ws != &rd_nil_window_state) { - os_window_set_minimized(last_focused_ws->os, 0); - os_window_focus(last_focused_ws->os); + wm_window_set_minimized(last_focused_ws->os, 0); + wm_window_focus(last_focused_ws->os); } }break; @@ -12468,10 +12468,10 @@ rd_frame(void) CFG_Binding binding = rd_default_binding_table[idx].binding; CFG_Node *binding_root = cfg_node_new(rd_state->cfg, keybindings, str8_zero()); cfg_node_new(rd_state->cfg, binding_root, name); - cfg_node_new(rd_state->cfg, binding_root, os_g_key_cfg_string_table[binding.key]); - if(binding.modifiers & OS_Modifier_Ctrl) {cfg_node_newf(rd_state->cfg, binding_root, "ctrl");} - if(binding.modifiers & OS_Modifier_Shift) {cfg_node_newf(rd_state->cfg, binding_root, "shift");} - if(binding.modifiers & OS_Modifier_Alt) {cfg_node_newf(rd_state->cfg, binding_root, "alt");} + cfg_node_new(rd_state->cfg, binding_root, wm_key_cfg_name_table[binding.key]); + if(binding.modifiers & WM_Modifier_Ctrl) {cfg_node_newf(rd_state->cfg, binding_root, "ctrl");} + if(binding.modifiers & WM_Modifier_Shift) {cfg_node_newf(rd_state->cfg, binding_root, "shift");} + if(binding.modifiers & WM_Modifier_Alt) {cfg_node_newf(rd_state->cfg, binding_root, "alt");} } }break; @@ -12583,10 +12583,10 @@ rd_frame(void) CFG_NodePtrList all_user_windows = cfg_node_child_list_from_string(scratch.arena, file_root, str8_lit("window")); if(all_user_windows.count == 0) { - OS_Monitor monitor = os_primary_monitor(); - String8 monitor_name = os_name_from_monitor(scratch.arena, monitor); - Vec2F32 monitor_dim = os_dim_from_monitor(monitor); - F32 monitor_dpi = os_dpi_from_monitor(monitor); + WM_Monitor monitor = wm_primary_monitor(); + String8 monitor_name = wm_name_from_monitor(scratch.arena, monitor); + Vec2F32 monitor_dim = wm_dim_from_monitor(monitor); + F32 monitor_dpi = wm_dpi_from_monitor(monitor); Vec2F32 window_dim = v2f32(monitor_dim.x*4/5, monitor_dim.y*4/5); if(window_dim.x == 0 || window_dim.y == 0) { @@ -13546,7 +13546,7 @@ rd_frame(void) CFG_Node *tab = cfg_node_from_id(rd_regs()->tab); String8 expr = rd_expr_from_cfg(tab); String8 full_path = rd_file_path_from_eval_string(scratch.arena, expr); - os_set_clipboard_text(full_path); + wm_set_clipboard_text(full_path); }break; case RD_CmdKind_CloseTab: { @@ -13720,7 +13720,7 @@ rd_frame(void) if(rd_regs()->file_path.size != 0) { String8 full_path = rd_regs()->file_path; - os_show_in_filesystem_ui(full_path); + wm_show_in_filesystem_ui(full_path); }break; //- rjf: source <-> disasm @@ -15580,34 +15580,34 @@ rd_frame(void) }break; //- rjf: os event passthrough - case RD_CmdKind_OSEvent: + case RD_CmdKind_WMEvent: { - OS_Event *os_event = rd_regs()->os_event; - RD_WindowState *ws = rd_window_state_from_os_handle(os_event->window); - if(os_event != 0 && ws != &rd_nil_window_state) + WM_Event *wm_event = rd_regs()->wm_event; + RD_WindowState *ws = rd_window_state_from_os_handle(wm_event->window); + if(wm_event != 0 && ws != &rd_nil_window_state) { UI_Event ui_event = zero_struct; UI_EventKind kind = UI_EventKind_Null; { - switch(os_event->kind) + switch(wm_event->kind) { default:{}break; - case OS_EventKind_Press: {kind = UI_EventKind_Press;}break; - case OS_EventKind_Release: {kind = UI_EventKind_Release;}break; - case OS_EventKind_MouseMove: {kind = UI_EventKind_MouseMove;}break; - case OS_EventKind_Text: {kind = UI_EventKind_Text;}break; - case OS_EventKind_Scroll: {kind = UI_EventKind_Scroll;}break; - case OS_EventKind_FileDrop: {kind = UI_EventKind_FileDrop;}break; + case WM_EventKind_Press: {kind = UI_EventKind_Press;}break; + case WM_EventKind_Release: {kind = UI_EventKind_Release;}break; + case WM_EventKind_MouseMove: {kind = UI_EventKind_MouseMove;}break; + case WM_EventKind_Text: {kind = UI_EventKind_Text;}break; + case WM_EventKind_Scroll: {kind = UI_EventKind_Scroll;}break; + case WM_EventKind_FileDrop: {kind = UI_EventKind_FileDrop;}break; } } ui_event.kind = kind; - ui_event.key = os_event->key; - ui_event.modifiers = os_event->modifiers; - ui_event.string = os_event->character ? str8_from_32(ui_build_arena(), str32(&os_event->character, 1)) : str8_zero(); - ui_event.paths = str8_list_copy(ui_build_arena(), &os_event->strings); - ui_event.pos = os_event->pos; - ui_event.delta_2f32 = os_event->delta; - ui_event.timestamp_us = os_event->timestamp_us; + ui_event.key = wm_event->key; + ui_event.modifiers = wm_event->modifiers; + ui_event.string = wm_event->character ? str8_from_32(ui_build_arena(), str32(&wm_event->character, 1)) : str8_zero(); + ui_event.paths = str8_list_copy(ui_build_arena(), &wm_event->strings); + ui_event.pos = wm_event->pos; + ui_event.delta_2f32 = wm_event->delta; + ui_event.timestamp_us = wm_event->timestamp_us; ui_event_list_push(scratch.arena, &ws->ui_events, &ui_event); } }break; @@ -16138,7 +16138,7 @@ rd_frame(void) UI_Event evt = zero_struct; evt.kind = UI_EventKind_Text; evt.flags = UI_EventFlag_Paste; - evt.string = os_get_clipboard_text(scratch.arena); + evt.string = wm_get_clipboard_text(scratch.arena); ui_event_list_push(scratch.arena, &ws->ui_events, &evt); }break; case RD_CmdKind_InsertText: @@ -16483,7 +16483,7 @@ rd_frame(void) B32 any_window_is_focused = 0; for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) { - if(os_window_is_focused(ws->os)) + if(wm_window_is_focused(ws->os)) { any_window_is_focused = 1; break; @@ -16499,10 +16499,10 @@ rd_frame(void) } if(ws != &rd_nil_window_state) { - rd_state->prestop_focused_window = os_focused_external_window(); - os_window_set_minimized(ws->os, 0); - os_window_bring_to_front(ws->os); - os_window_focus(ws->os); + rd_state->prestop_focused_window = wm_focused_external_window(); + wm_window_set_minimized(ws->os, 0); + wm_window_bring_to_front(ws->os); + wm_window_focus(ws->os); } } } @@ -16538,7 +16538,7 @@ rd_frame(void) { for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) { - os_window_set_title(ws->os, window_title); + wm_window_set_title(ws->os, window_title); } } rd_state->last_window_title = str8_copy(rd_frame_arena(), window_title); @@ -16689,7 +16689,7 @@ rd_frame(void) { CFG_Node *window = n->v; RD_WindowState *w = rd_window_state_from_cfg(window); - B32 window_is_focused = os_window_is_focused(w->os); + B32 window_is_focused = wm_window_is_focused(w->os); if(window_is_focused) { rd_state->last_focused_window = w->cfg_id; @@ -16720,7 +16720,7 @@ rd_frame(void) { ui_state_release(ws->ui); r_window_unequip(ws->os, ws->r); - os_window_close(ws->os); + wm_window_close(ws->os); arena_release(ws->drop_completion_arena); arena_release(ws->query_arena); arena_release(ws->hover_eval_arena); @@ -16800,7 +16800,7 @@ rd_frame(void) { CFG_Node *window = cfg_node_from_id(n->v); RD_WindowState *ws = rd_window_state_from_cfg(window); - os_window_first_paint(ws->os); + wm_window_first_paint(ws->os); } } diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 417ccd7a..f554f260 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -283,7 +283,7 @@ struct RD_WindowState // rjf: top-level info & handles Arena *arena; - OS_Window os; + WM_Window os; R_Handle r; UI_State *ui; F32 last_dpi; @@ -543,7 +543,7 @@ struct RD_State String8 bind_change_cmd_name; // rjf: pre-stop focused window - OS_ExternalWindow prestop_focused_window; + WM_ExtWindow prestop_focused_window; }; //////////////////////////////// @@ -730,7 +730,7 @@ internal void rd_store_view_paramf(String8 key, char *fmt, ...); internal String8 rd_push_window_title(Arena *arena); internal CFG_Node *rd_window_from_cfg(CFG_Node *cfg); internal RD_WindowState *rd_window_state_from_cfg(CFG_Node *cfg); -internal RD_WindowState *rd_window_state_from_os_handle(OS_Window os); +internal RD_WindowState *rd_window_state_from_os_handle(WM_Window os); internal void rd_window_frame(void); //////////////////////////////// diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 0bed5d80..28c88fa9 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -46,7 +46,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands) CFG_KeyMapNodePtrList bindings = cfg_key_map_node_ptr_list_from_name(scratch.arena, rd_state->key_map, code_name); for(CFG_KeyMapNodePtr *n = bindings.first; n != 0; n = n->next) { - String8 binding_text = os_string_from_modifiers_key(scratch.arena, n->v->binding.modifiers, n->v->binding.key); + String8 binding_text = wm_string_from_modifiers_key(scratch.arena, n->v->binding.modifiers, n->v->binding.key); FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, binding_text); if(matches.count == matches.needle_part_count) { diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index a6c1d83f..b3da3aef 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -250,7 +250,7 @@ #define DMN_INIT_MANUAL 1 #define D_INIT_MANUAL 1 -#define OS_GFX_INIT_MANUAL 1 +#define WM_INIT_MANUAL 1 #define FP_INIT_MANUAL 1 #define R_INIT_MANUAL 1 #define FNT_INIT_MANUAL 1 @@ -430,7 +430,7 @@ ipc_signaler_thread__entry_point(void *p) cond_var_wait(ipc_s2m_ring_cv, ipc_s2m_ring_mutex, max_U64); } cond_var_broadcast(ipc_s2m_ring_cv); - os_send_wakeup_event(); + wm_send_wakeup_event(); ipc_info->msg_size = 0; semaphore_drop(ipc_sender2main_lock_semaphore); } @@ -443,7 +443,7 @@ ipc_signaler_thread__entry_point(void *p) internal D_WAKEUP_FUNCTION_DEF(wakeup_hook_ctrl) { - os_send_wakeup_event(); + wm_send_wakeup_event(); } //////////////////////////////// @@ -544,7 +544,7 @@ entry_point(CmdLine *cmd_line) { dmn_init(); d_init(); - os_gfx_init(); + wm_init(); fp_init(); r_init(cmd_line); fnt_init(); @@ -621,7 +621,7 @@ entry_point(CmdLine *cmd_line) RD_WindowState *dst_ws = rd_state->first_window_state; for(RD_WindowState *ws = dst_ws; ws != &rd_nil_window_state; ws = ws->order_next) { - if(os_window_is_focused(ws->os)) + if(wm_window_is_focused(ws->os)) { dst_ws = ws; break; @@ -810,7 +810,7 @@ entry_point(CmdLine *cmd_line) //- rjf: help message box case ExecMode_Help: { - os_graphical_message(0, + wm_graphical_message(0, str8_lit("The RAD Debugger - Help"), str8_lit("The following options may be used when starting the RAD Debugger from the command line:\n\n" "--user:\n" diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 05f96794..5f98d4ee 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -641,7 +641,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla } //- rjf: ctrl+pressed? -> go to name - if(ui_pressed(sig.base) && sig.base.event_flags & OS_Modifier_Ctrl) + if(ui_pressed(sig.base) && sig.base.event_flags & WM_Modifier_Ctrl) { ui_kill_action(); rd_cmd(RD_CmdKind_GoToName, .string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng)); @@ -792,7 +792,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla { for(UI_Event *evt = 0; ui_next_event(&evt);) { - if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl && evt->modifiers & OS_Modifier_Shift) + if(evt->kind == UI_EventKind_Scroll && evt->modifiers & WM_Modifier_Ctrl && evt->modifiers & WM_Modifier_Shift) { ui_eat_event(evt); if(evt->delta_2f32.y < 0) @@ -2888,7 +2888,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } String8 data_textified = str8_list_join(scratch.arena, &data_textified_parts, 0); - os_set_clipboard_text(data_textified); + wm_set_clipboard_text(data_textified); } good_action = 1; } @@ -4089,7 +4089,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) { for(UI_Event *evt = 0; ui_next_event(&evt);) { - if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl) + if(evt->kind == UI_EventKind_Scroll && evt->modifiers & WM_Modifier_Ctrl) { ui_eat_event(evt); if(evt->delta_2f32.y < 0) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index a1db6221..9febbbea 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -783,9 +783,9 @@ rd_cmd_binding_buttons(String8 name, String8 filter, B32 add_new) //- rjf: form binding string String8 keybinding_str = {0}; { - if(binding.key != OS_Key_Null) + if(binding.key != WM_Key_Null) { - keybinding_str = os_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key); + keybinding_str = wm_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key); } else { @@ -820,7 +820,7 @@ rd_cmd_binding_buttons(String8 name, String8 filter, B32 add_new) // rjf: click => toggle activity if(!rd_state->bind_change_active && ui_clicked(sig)) { - if((binding.key == OS_Key_Esc || binding.key == OS_Key_Delete) && binding.modifiers == 0) + if((binding.key == WM_Key_Esc || binding.key == WM_Key_Delete) && binding.modifiers == 0) { log_user_error(str8_lit("Cannot rebind; this command uses a reserved keybinding.")); } @@ -1262,7 +1262,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe D_Event stop_event = d_ctrl_last_stop_event(); D_Entity *stopper_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); B32 is_focused = ui_is_focus_active(); - B32 ctrlified = (os_get_modifiers() & OS_Modifier_Ctrl); + B32 ctrlified = (wm_get_modifiers() & WM_Modifier_Ctrl); Vec4F32 code_line_bgs[] = { ui_color_from_name(str8_lit("line_info_0")), @@ -1406,7 +1406,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num += 1, line_idx += 1) { D_EntityList line_ips = params->line_ips[line_idx]; - ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_hover_cursor(WM_Cursor_HandPoint); UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); UI_Parent(line_margin_box) { @@ -1455,7 +1455,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } // rjf: build thread box - ui_set_next_hover_cursor(OS_Cursor_UpDownLeftRight); + ui_set_next_hover_cursor(WM_Cursor_UpDownLeftRight); ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons)); ui_set_next_font_size(params->font_size); ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth); @@ -1561,7 +1561,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe D_EntityList line_ips = params->line_ips[line_idx]; CFG_NodePtrList line_bps = params->line_bps[line_idx]; CFG_NodePtrList line_pins = params->line_pins[line_idx]; - ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_hover_cursor(WM_Cursor_HandPoint); ui_set_next_background_color(v4f32(0, 0, 0, 0)); UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); UI_Parent(line_margin_box) @@ -1611,7 +1611,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } // rjf: build thread box - ui_set_next_hover_cursor(OS_Cursor_UpDownLeftRight); + ui_set_next_hover_cursor(WM_Cursor_UpDownLeftRight); ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons)); ui_set_next_font_size(params->font_size); ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth); @@ -1760,7 +1760,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } // rjf: shift+click => enable breakpoint - if(ui_clicked(bp_sig) && bp_sig.event_flags & OS_Modifier_Shift) + if(ui_clicked(bp_sig) && bp_sig.event_flags & WM_Modifier_Shift) { rd_cmd(bp_is_disabled ? RD_CmdKind_EnableCfg : RD_CmdKind_DisableCfg, .cfg = bp->id); } @@ -1914,7 +1914,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe UI_Box *text_container_box = &ui_nil_box; UI_Parent(top_container_box) UI_Focus(UI_FocusKind_Off) { - ui_set_next_hover_cursor(ctrlified ? OS_Cursor_HandPoint : OS_Cursor_IBar); + ui_set_next_hover_cursor(ctrlified ? WM_Cursor_HandPoint : WM_Cursor_IBar); ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); text_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit("text_container")); } @@ -3049,7 +3049,7 @@ rd_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, Tx if(evt->flags & UI_EventFlag_Copy) { String8 text = txt_string_from_info_data_txt_rng(info, data, txt_rng(*cursor, *mark)); - os_set_clipboard_text(text); + wm_set_clipboard_text(text); taken = 1; } @@ -3447,7 +3447,7 @@ rd_cell(RD_CellParams *params, String8 string) // if(is_focus_active || is_focus_active_disabled) { - ui_set_next_hover_cursor(OS_Cursor_IBar); + ui_set_next_hover_cursor(WM_Cursor_IBar); } UI_Box *box = ui_build_box_from_key(UI_BoxFlag_MouseClickable| (!!build_lhs_name_desc*UI_BoxFlag_DisableFocusBorder)| @@ -3807,7 +3807,7 @@ rd_cell(RD_CellParams *params, String8 string) { F32 extratoggler_padding_px = floor_f32(ui_top_font_size()*0.35f); F32 toggler_size_px = ceil_f32(height_px - extratoggler_padding_px*2.f) - 1.f; - ui_set_next_hover_cursor(OS_Cursor_LeftRight); + ui_set_next_hover_cursor(WM_Cursor_LeftRight); UI_Box *slider_box = ui_build_box_from_stringf(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, "slider"); UI_Parent(slider_box) UI_TagF("pop") { @@ -3883,7 +3883,7 @@ rd_cell(RD_CellParams *params, String8 string) { if(evt->flags & UI_EventFlag_Copy) { - os_set_clipboard_text(params->pre_edit_value); + wm_set_clipboard_text(params->pre_edit_value); } if(evt->flags & UI_EventFlag_Delete) { @@ -4003,7 +4003,7 @@ rd_cell(RD_CellParams *params, String8 string) // rjf: perform copy if(op.flags & UI_TxtOpFlag_Copy) { - os_set_clipboard_text(op.copy); + wm_set_clipboard_text(op.copy); } // rjf: commit op's changed cursor & mark to caller-provided state diff --git a/src/render/d3d11/render_d3d11.c b/src/render/d3d11/render_d3d11.c index 9d80584e..deb28141 100644 --- a/src/render/d3d11/render_d3d11.c +++ b/src/render/d3d11/render_d3d11.c @@ -198,7 +198,7 @@ r_init(CmdLine *cmdln) { char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "D3D11 device creation failure (%lx). The process is terminating.", error); - os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); abort_self(1); } ProfEnd(); @@ -370,7 +370,7 @@ r_init(CmdLine *cmdln) { errors = str8((U8 *)vshad_source_errors->lpVtbl->GetBufferPointer(vshad_source_errors), (U64)vshad_source_errors->lpVtbl->GetBufferSize(vshad_source_errors)); - os_graphical_message(1, str8_lit("Vertex Shader Compilation Failure"), errors); + wm_graphical_message(1, str8_lit("Vertex Shader Compilation Failure"), errors); } else { @@ -425,7 +425,7 @@ r_init(CmdLine *cmdln) { errors = str8((U8 *)pshad_source_errors->lpVtbl->GetBufferPointer(pshad_source_errors), (U64)pshad_source_errors->lpVtbl->GetBufferSize(pshad_source_errors)); - os_graphical_message(1, str8_lit("Pixel Shader Compilation Failure"), errors); + wm_graphical_message(1, str8_lit("Pixel Shader Compilation Failure"), errors); } else { @@ -483,7 +483,7 @@ r_init(CmdLine *cmdln) //- rjf: window setup/teardown r_hook R_Handle -r_window_equip(OS_Window handle) +r_window_equip(WM_Window handle) { ProfBeginFunction(); R_Handle result = {0}; @@ -509,8 +509,8 @@ r_window_equip(OS_Window handle) //- rjf: map os window handle -> hwnd HWND hwnd = {0}; { - OS_W32_Window *w32_layer_window = os_w32_window_from_handle(handle); - hwnd = os_w32_hwnd_from_window(w32_layer_window); + W32_WM_Window *w32_layer_window = w32_wm_window_from_handle(handle); + hwnd = w32_wm_hwnd_from_window(w32_layer_window); } //- rjf: create swapchain @@ -534,7 +534,7 @@ r_window_equip(OS_Window handle) { char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "DXGI swap chain creation failure (%lx). The process is terminating.", error); - os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); abort_self(1); } @@ -556,7 +556,7 @@ r_window_equip(OS_Window handle) } r_hook void -r_window_unequip(OS_Window handle, R_Handle equip_handle) +r_window_unequip(WM_Window handle, R_Handle equip_handle) { ProfBeginFunction(); MutexScopeW(r_d3d11_state->device_rw_mutex) @@ -861,7 +861,7 @@ r_end_frame(void) } r_hook void -r_window_begin_frame(OS_Window window, R_Handle window_equip) +r_window_begin_frame(WM_Window window, R_Handle window_equip) { ProfBeginFunction(); MutexScopeW(r_d3d11_state->device_rw_mutex) @@ -870,7 +870,7 @@ r_window_begin_frame(OS_Window window, R_Handle window_equip) ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx; //- rjf: get resolution - Rng2F32 client_rect = os_client_rect_from_window(window); + Rng2F32 client_rect = wm_client_rect_from_window(window); Vec2S32 resolution = {(S32)(client_rect.x1 - client_rect.x0), (S32)(client_rect.y1 - client_rect.y0)}; //- rjf: resolution change @@ -993,7 +993,7 @@ r_window_begin_frame(OS_Window window, R_Handle window_equip) } r_hook void -r_window_end_frame(OS_Window window, R_Handle window_equip) +r_window_end_frame(WM_Window window, R_Handle window_equip) { ProfBeginFunction(); MutexScopeW(r_d3d11_state->device_rw_mutex) @@ -1052,7 +1052,7 @@ r_window_end_frame(OS_Window window, R_Handle window_equip) { char buffer[256] = {0}; raddbg_snprintf(buffer, sizeof(buffer), "D3D11 present failure (%lx). The process is terminating.", error); - os_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_cstring(buffer)); abort_self(1); } d_ctx->lpVtbl->ClearState(d_ctx); @@ -1063,7 +1063,7 @@ r_window_end_frame(OS_Window window, R_Handle window_equip) //- rjf: render pass submission r_hook void -r_window_submit(OS_Window window, R_Handle window_equip, R_PassList *passes) +r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) { ProfBeginFunction(); MutexScopeW(r_d3d11_state->device_rw_mutex) diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.c b/src/render/opengl/linux/egl/render_opengl_linux_egl.c index 2df7024b..165ffc3e 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.c +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.c @@ -23,7 +23,7 @@ r_ogl_os_init(CmdLine *cmdln) r_ogl_lnx_state->display = eglGetDisplay((EGLNativeDisplayType)os_lnx_gfx_state->display); if(r_ogl_lnx_state->display == EGL_NO_DISPLAY) { - os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display.")); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display.")); abort_self(1); } } @@ -33,14 +33,14 @@ r_ogl_os_init(CmdLine *cmdln) EGLint egl_version_minor = 0; if(!eglInitialize(r_ogl_lnx_state->display, &egl_version_major, &egl_version_minor)) { - os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL display.")); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL display.")); abort_self(1); } if(egl_version_major < 1 || (egl_version_major == 1 && egl_version_minor < 5)) { Temp scratch = scratch_begin(0, 0); String8 message = push_str8f(scratch.arena, "Unsupported EGL version (%i.%i, need at least 1.5)", egl_version_major, egl_version_minor); - os_graphical_message(1, str8_lit("Fatal Error"), message); + wm_graphical_message(1, str8_lit("Fatal Error"), message); abort_self(1); scratch_end(scratch); } @@ -48,7 +48,7 @@ r_ogl_os_init(CmdLine *cmdln) //- rjf: pick GL API if(!eglBindAPI(EGL_OPENGL_API)) { - os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL.")); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL.")); abort_self(1); } @@ -69,7 +69,7 @@ r_ogl_os_init(CmdLine *cmdln) r_ogl_lnx_state->context = eglCreateContext(r_ogl_lnx_state->display, 0, EGL_NO_CONTEXT, options); if(r_ogl_lnx_state->context == EGL_NO_CONTEXT) { - os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL.")); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL.")); abort_self(1); } } @@ -79,9 +79,9 @@ r_ogl_os_init(CmdLine *cmdln) } internal R_Handle -r_ogl_os_window_equip(OS_Window window) +r_ogl_os_window_equip(WM_Window window) { - OS_LNX_Window *window_os = (OS_LNX_Window *)window.u64[0]; + LNX_WM_Window *window_os = (LNX_WM_Window *)window.u64[0]; R_OGL_LNX_Window *w = r_ogl_lnx_state->free_window; if(w != 0) { @@ -120,7 +120,7 @@ r_ogl_os_window_equip(OS_Window window) }; if(!eglChooseConfig(r_ogl_lnx_state->display, options, configs, ArrayCount(configs), &configs_count) || configs_count == 0) { - os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration.")); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration.")); abort_self(1); } } @@ -143,7 +143,7 @@ r_ogl_os_window_equip(OS_Window window) } if(r_ogl_lnx_state->config == 0) { - os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find a suitable EGL configuration.")); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find a suitable EGL configuration.")); abort_self(1); } } @@ -154,7 +154,7 @@ r_ogl_os_window_equip(OS_Window window) } if(w->surface == EGL_NO_SURFACE) { - os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create EGL surface.")); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create EGL surface.")); abort_self(1); } } @@ -163,7 +163,7 @@ r_ogl_os_window_equip(OS_Window window) } internal void -r_ogl_os_window_unequip(OS_Window os, R_Handle r) +r_ogl_os_window_unequip(WM_Window os, R_Handle r) { R_OGL_LNX_Window *w = (R_OGL_LNX_Window *)r.u64[0]; { @@ -173,17 +173,17 @@ r_ogl_os_window_unequip(OS_Window os, R_Handle r) } internal void -r_ogl_os_select_window(OS_Window os, R_Handle r) +r_ogl_os_select_window(WM_Window os, R_Handle r) { - OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0]; + LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0]; eglMakeCurrent(r_ogl_lnx_state->display, w_r->surface, w_r->surface, r_ogl_lnx_state->context); } internal void -r_ogl_os_window_swap(OS_Window os, R_Handle r) +r_ogl_os_window_swap(WM_Window os, R_Handle r) { - OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0]; + LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0]; eglSwapBuffers(r_ogl_lnx_state->display, w_r->surface); } diff --git a/src/render/opengl/linux/glx/render_opengl_linux_glx.c b/src/render/opengl/linux/glx/render_opengl_linux_glx.c index 665403ea..8b0a34a7 100644 --- a/src/render/opengl/linux/glx/render_opengl_linux_glx.c +++ b/src/render/opengl/linux/glx/render_opengl_linux_glx.c @@ -20,7 +20,7 @@ r_ogl_os_init(CmdLine *cmdln) { Temp scratch = scratch_begin(0, 0); String8 message = push_str8f(scratch.arena, "Unsupported GLX version (%i.%i, need at least 1.3)", glx_version_major, glx_version_minor); - os_graphical_message(1, str8_lit("Fatal Error"), message); + wm_graphical_message(1, str8_lit("Fatal Error"), message); abort_self(1); scratch_end(scratch); } @@ -45,7 +45,7 @@ r_ogl_os_init(CmdLine *cmdln) GLXFBConfig *framebuffer_configs = glXChooseFBConfig(os_lnx_gfx_state->display, DefaultScreen(os_lnx_gfx_state->display), framebuffer_config_options, &framebuffer_configs_count); if(framebuffer_configs == 0) { - os_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration.")); + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration.")); abort_self(1); } GLXFBConfig framebuffer_config = framebuffer_configs[0]; @@ -79,28 +79,28 @@ r_ogl_os_init(CmdLine *cmdln) } internal R_Handle -r_ogl_os_window_equip(OS_Window window) +r_ogl_os_window_equip(WM_Window window) { R_Handle result = {0}; return result; } internal void -r_ogl_os_window_unequip(OS_Window os, R_Handle r) +r_ogl_os_window_unequip(WM_Window os, R_Handle r) { } internal void -r_ogl_os_select_window(OS_Window os, R_Handle r) +r_ogl_os_select_window(WM_Window os, R_Handle r) { - OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0]; + LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; glXMakeCurrent(os_lnx_gfx_state->display, w->window, r_ogl_lnx_ctx); } internal void -r_ogl_os_window_swap(OS_Window os, R_Handle r) +r_ogl_os_window_swap(WM_Window os, R_Handle r) { - OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0]; + LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; glXSwapBuffers(os_lnx_gfx_state->display, w->window); } diff --git a/src/render/opengl/render_opengl.c b/src/render/opengl/render_opengl.c index f985ae0b..d3f413ff 100644 --- a/src/render/opengl/render_opengl.c +++ b/src/render/opengl/render_opengl.c @@ -201,14 +201,14 @@ r_init(CmdLine *cmdln) //- rjf: window setup/teardown r_hook R_Handle -r_window_equip(OS_Window window) +r_window_equip(WM_Window window) { R_Handle result = r_ogl_os_window_equip(window); return result; } r_hook void -r_window_unequip(OS_Window window, R_Handle window_equip) +r_window_unequip(WM_Window window, R_Handle window_equip) { r_ogl_os_window_unequip(window, window_equip); } @@ -341,12 +341,12 @@ r_end_frame(void) } r_hook void -r_window_begin_frame(OS_Window os, R_Handle r) +r_window_begin_frame(WM_Window os, R_Handle r) { r_ogl_os_select_window(os, r); //- rjf: unpack window viewport info - Rng2F32 client_rect = os_client_rect_from_window(os); + Rng2F32 client_rect = wm_client_rect_from_window(os); Vec2F32 client_rect_dim = dim_2f32(client_rect); //- rjf: clear and reset state @@ -358,7 +358,7 @@ r_window_begin_frame(OS_Window os, R_Handle r) } r_hook void -r_window_end_frame(OS_Window os, R_Handle r) +r_window_end_frame(WM_Window os, R_Handle r) { for(R_OGL_FlushBuffer *flush_buffer = r_ogl_state->first_buffer_to_flush; flush_buffer != 0; flush_buffer = flush_buffer->next) { @@ -372,9 +372,9 @@ r_window_end_frame(OS_Window os, R_Handle r) //- rjf: render pass submission r_hook void -r_window_submit(OS_Window window, R_Handle window_equip, R_PassList *passes) +r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) { - Rng2F32 viewport_rect = os_client_rect_from_window(window); + Rng2F32 viewport_rect = wm_client_rect_from_window(window); Vec2F32 viewport_dim = dim_2f32(viewport_rect); for(R_PassNode *pass_n = passes->first; pass_n != 0; pass_n = pass_n->next) { diff --git a/src/render/opengl/render_opengl.h b/src/render/opengl/render_opengl.h index cd7c3f2f..0414d724 100644 --- a/src/render/opengl/render_opengl.h +++ b/src/render/opengl/render_opengl.h @@ -224,9 +224,9 @@ internal void r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id internal VoidProc *r_ogl_os_load_procedure(char *name); internal void r_ogl_os_init(CmdLine *cmdln); -internal R_Handle r_ogl_os_window_equip(OS_Window window); -internal void r_ogl_os_window_unequip(OS_Window os, R_Handle r); -internal void r_ogl_os_select_window(OS_Window os, R_Handle r); -internal void r_ogl_os_window_swap(OS_Window os, R_Handle r); +internal R_Handle r_ogl_os_window_equip(WM_Window window); +internal void r_ogl_os_window_unequip(WM_Window os, R_Handle r); +internal void r_ogl_os_select_window(WM_Window os, R_Handle r); +internal void r_ogl_os_window_swap(WM_Window os, R_Handle r); #endif // RENDER_OPENGL_H diff --git a/src/render/opengl/win32/render_opengl_win32.c b/src/render/opengl/win32/render_opengl_win32.c index 53b4641b..aefb4ae0 100644 --- a/src/render/opengl/win32/render_opengl_win32.c +++ b/src/render/opengl/win32/render_opengl_win32.c @@ -101,10 +101,10 @@ r_ogl_os_init(CmdLine *cmdline) } internal R_Handle -r_ogl_os_window_equip(OS_Window window) +r_ogl_os_window_equip(WM_Window window) { //- rjf: unpack window - OS_W32_Window *w = os_w32_window_from_handle(window); + W32_WM_Window *w = w32_wm_window_from_handle(window); HWND hwnd = w->hwnd; HDC hdc = w->hdc; @@ -155,14 +155,14 @@ r_ogl_os_window_equip(OS_Window window) } internal void -r_ogl_os_window_unequip(OS_Window os, R_Handle r) +r_ogl_os_window_unequip(WM_Window os, R_Handle r) { } internal void -r_ogl_os_select_window(OS_Window os, R_Handle r) +r_ogl_os_select_window(WM_Window os, R_Handle r) { - OS_W32_Window *w = os_w32_window_from_handle(os); + W32_WM_Window *w = w32_wm_window_from_handle(os); if(w != 0) { HWND hwnd = w->hwnd; @@ -172,9 +172,9 @@ r_ogl_os_select_window(OS_Window os, R_Handle r) } internal void -r_ogl_os_window_swap(OS_Window os, R_Handle r) +r_ogl_os_window_swap(WM_Window os, R_Handle r) { - OS_W32_Window *w = os_w32_window_from_handle(os); + W32_WM_Window *w = w32_wm_window_from_handle(os); if(w != 0) { HDC dc = w->hdc; diff --git a/src/render/render_core.h b/src/render/render_core.h index 6aa8decb..26d2ac37 100644 --- a/src/render/render_core.h +++ b/src/render/render_core.h @@ -281,8 +281,8 @@ internal R_Pass *r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kin r_hook void r_init(CmdLine *cmdln); //- rjf: window setup/teardown -r_hook R_Handle r_window_equip(OS_Window window); -r_hook void r_window_unequip(OS_Window window, R_Handle window_equip); +r_hook R_Handle r_window_equip(WM_Window window); +r_hook void r_window_unequip(WM_Window window, R_Handle window_equip); //- rjf: textures r_hook R_Handle r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data); @@ -299,10 +299,10 @@ r_hook void r_buffer_release(R_Handle buffer); //- rjf: frame markers r_hook void r_begin_frame(void); r_hook void r_end_frame(void); -r_hook void r_window_begin_frame(OS_Window window, R_Handle window_equip); -r_hook void r_window_end_frame(OS_Window window, R_Handle window_equip); +r_hook void r_window_begin_frame(WM_Window window, R_Handle window_equip); +r_hook void r_window_end_frame(WM_Window window, R_Handle window_equip); //- rjf: render pass submission -r_hook void r_window_submit(OS_Window window, R_Handle window_equip, R_PassList *passes); +r_hook void r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes); #endif // RENDER_CORE_H diff --git a/src/scratch/textperf.c b/src/scratch/textperf.c index 3821698a..3bac8971 100644 --- a/src/scratch/textperf.c +++ b/src/scratch/textperf.c @@ -39,10 +39,10 @@ frame(void) ProfBeginFunction(); B32 quit = 0; Temp scratch = scratch_begin(0, 0); - OS_EventList events = os_get_events(scratch.arena, 0); - for(OS_Event *evt = events.first; evt != 0; evt = evt->next) + WM_EventList events = wm_get_events(scratch.arena, 0); + for(WM_Event *evt = events.first; evt != 0; evt = evt->next) { - if(evt->kind == OS_EventKind_WindowClose) + if(evt->kind == WM_EventKind_WindowClose) { quit = 1; break; @@ -54,7 +54,7 @@ frame(void) DR_Bucket *bucket = dr_bucket_make(); DR_BucketScope(bucket) ProfScope("draw") { - Vec2F32 mouse = os_mouse_from_window(os_window); + Vec2F32 mouse = wm_mouse_from_window(os_window); FNT_Tag font = fnt_tag_from_path(str8_lit("C:/devel/raddebugger/data/Inconsolata-Regular.ttf")); for(F32 x = 0; x < 500; x += 5.f) { @@ -75,8 +75,8 @@ frame(void) internal void entry_point(CmdLine *cmdline) { - os_window = os_window_open(r2f32p(0, 0, 1600, 900), OS_WindowFlag_UseDefaultPosition, str8_lit("textperf")); + os_window = wm_window_open(r2f32p(0, 0, 1600, 900), WM_WindowFlag_UseDefaultPosition, str8_lit("textperf")); r_window = r_window_equip(os_window); - os_window_first_paint(os_window); + wm_window_first_paint(os_window); for(;!update();); } diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 71f530d8..238ae6e7 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -10,7 +10,7 @@ #define OS_FEATURE_GRAPHICAL 1 #define DMN_INIT_MANUAL 1 #define D_INIT_MANUAL 1 -#define OS_GFX_INIT_MANUAL 1 +#define WM_INIT_MANUAL 1 #define FP_INIT_MANUAL 1 #define R_INIT_MANUAL 1 #define FNT_INIT_MANUAL 1 diff --git a/src/ui/generated/ui.meta.c b/src/ui/generated/ui.meta.c index 9bc7c017..96ea8755 100644 --- a/src/ui/generated/ui.meta.c +++ b/src/ui/generated/ui.meta.c @@ -62,7 +62,7 @@ internal Vec4F32 ui_top_background_color(void) { UI_StackTopImpl(ui_state, Backg internal Vec4F32 ui_top_text_color(void) { UI_StackTopImpl(ui_state, TextColor, text_color) } internal Vec4F32 ui_top_border_color(void) { UI_StackTopImpl(ui_state, BorderColor, border_color) } internal F32 ui_top_squish(void) { UI_StackTopImpl(ui_state, Squish, squish) } -internal OS_Cursor ui_top_hover_cursor(void) { UI_StackTopImpl(ui_state, HoverCursor, hover_cursor) } +internal WM_Cursor ui_top_hover_cursor(void) { UI_StackTopImpl(ui_state, HoverCursor, hover_cursor) } internal FNT_Tag ui_top_font(void) { UI_StackTopImpl(ui_state, Font, font) } internal F32 ui_top_font_size(void) { UI_StackTopImpl(ui_state, FontSize, font_size) } internal FNT_RasterFlags ui_top_text_raster_flags(void) { UI_StackTopImpl(ui_state, TextRasterFlags, text_raster_flags) } @@ -96,7 +96,7 @@ internal Vec4F32 ui_bottom_background_color(void) { UI_StackBottomImpl(ui_state, internal Vec4F32 ui_bottom_text_color(void) { UI_StackBottomImpl(ui_state, TextColor, text_color) } internal Vec4F32 ui_bottom_border_color(void) { UI_StackBottomImpl(ui_state, BorderColor, border_color) } internal F32 ui_bottom_squish(void) { UI_StackBottomImpl(ui_state, Squish, squish) } -internal OS_Cursor ui_bottom_hover_cursor(void) { UI_StackBottomImpl(ui_state, HoverCursor, hover_cursor) } +internal WM_Cursor ui_bottom_hover_cursor(void) { UI_StackBottomImpl(ui_state, HoverCursor, hover_cursor) } internal FNT_Tag ui_bottom_font(void) { UI_StackBottomImpl(ui_state, Font, font) } internal F32 ui_bottom_font_size(void) { UI_StackBottomImpl(ui_state, FontSize, font_size) } internal FNT_RasterFlags ui_bottom_text_raster_flags(void) { UI_StackBottomImpl(ui_state, TextRasterFlags, text_raster_flags) } @@ -130,7 +130,7 @@ internal Vec4F32 ui_push_background_color(Vec4F32 v) { UI_StackPushImpl(ui_state internal Vec4F32 ui_push_text_color(Vec4F32 v) { UI_StackPushImpl(ui_state, TextColor, text_color, Vec4F32, v) } internal Vec4F32 ui_push_border_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BorderColor, border_color, Vec4F32, v) } internal F32 ui_push_squish(F32 v) { UI_StackPushImpl(ui_state, Squish, squish, F32, v) } -internal OS_Cursor ui_push_hover_cursor(OS_Cursor v) { UI_StackPushImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) } +internal WM_Cursor ui_push_hover_cursor(WM_Cursor v) { UI_StackPushImpl(ui_state, HoverCursor, hover_cursor, WM_Cursor, v) } internal FNT_Tag ui_push_font(FNT_Tag v) { UI_StackPushImpl(ui_state, Font, font, FNT_Tag, v) } internal F32 ui_push_font_size(F32 v) { UI_StackPushImpl(ui_state, FontSize, font_size, F32, v) } internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v) { UI_StackPushImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) } @@ -164,7 +164,7 @@ internal Vec4F32 ui_pop_background_color(void) { UI_StackPopImpl(ui_state, Backg internal Vec4F32 ui_pop_text_color(void) { UI_StackPopImpl(ui_state, TextColor, text_color) } internal Vec4F32 ui_pop_border_color(void) { UI_StackPopImpl(ui_state, BorderColor, border_color) } internal F32 ui_pop_squish(void) { UI_StackPopImpl(ui_state, Squish, squish) } -internal OS_Cursor ui_pop_hover_cursor(void) { UI_StackPopImpl(ui_state, HoverCursor, hover_cursor) } +internal WM_Cursor ui_pop_hover_cursor(void) { UI_StackPopImpl(ui_state, HoverCursor, hover_cursor) } internal FNT_Tag ui_pop_font(void) { UI_StackPopImpl(ui_state, Font, font) } internal F32 ui_pop_font_size(void) { UI_StackPopImpl(ui_state, FontSize, font_size) } internal FNT_RasterFlags ui_pop_text_raster_flags(void) { UI_StackPopImpl(ui_state, TextRasterFlags, text_raster_flags) } @@ -198,7 +198,7 @@ internal Vec4F32 ui_set_next_background_color(Vec4F32 v) { UI_StackSetNextImpl(u internal Vec4F32 ui_set_next_text_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, TextColor, text_color, Vec4F32, v) } internal Vec4F32 ui_set_next_border_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BorderColor, border_color, Vec4F32, v) } internal F32 ui_set_next_squish(F32 v) { UI_StackSetNextImpl(ui_state, Squish, squish, F32, v) } -internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v) { UI_StackSetNextImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) } +internal WM_Cursor ui_set_next_hover_cursor(WM_Cursor v) { UI_StackSetNextImpl(ui_state, HoverCursor, hover_cursor, WM_Cursor, v) } internal FNT_Tag ui_set_next_font(FNT_Tag v) { UI_StackSetNextImpl(ui_state, Font, font, FNT_Tag, v) } internal F32 ui_set_next_font_size(F32 v) { UI_StackSetNextImpl(ui_state, FontSize, font_size, F32, v) } internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v) { UI_StackSetNextImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) } diff --git a/src/ui/generated/ui.meta.h b/src/ui/generated/ui.meta.h index a3a1648b..852fbe0c 100644 --- a/src/ui/generated/ui.meta.h +++ b/src/ui/generated/ui.meta.h @@ -29,7 +29,7 @@ typedef struct UI_BackgroundColorNode UI_BackgroundColorNode; struct UI_Backgrou typedef struct UI_TextColorNode UI_TextColorNode; struct UI_TextColorNode{UI_TextColorNode *next; Vec4F32 v;}; typedef struct UI_BorderColorNode UI_BorderColorNode; struct UI_BorderColorNode{UI_BorderColorNode *next; Vec4F32 v;}; typedef struct UI_SquishNode UI_SquishNode; struct UI_SquishNode{UI_SquishNode *next; F32 v;}; -typedef struct UI_HoverCursorNode UI_HoverCursorNode; struct UI_HoverCursorNode{UI_HoverCursorNode *next; OS_Cursor v;}; +typedef struct UI_HoverCursorNode UI_HoverCursorNode; struct UI_HoverCursorNode{UI_HoverCursorNode *next; WM_Cursor v;}; typedef struct UI_FontNode UI_FontNode; struct UI_FontNode{UI_FontNode *next; FNT_Tag v;}; typedef struct UI_FontSizeNode UI_FontSizeNode; struct UI_FontSizeNode{UI_FontSizeNode *next; F32 v;}; typedef struct UI_TextRasterFlagsNode UI_TextRasterFlagsNode; struct UI_TextRasterFlagsNode{UI_TextRasterFlagsNode *next; FNT_RasterFlags v;}; @@ -104,7 +104,7 @@ state->background_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ state->text_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ state->border_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ state->squish_nil_stack_top.v = 0;\ -state->hover_cursor_nil_stack_top.v = OS_Cursor_Pointer;\ +state->hover_cursor_nil_stack_top.v = WM_Cursor_Pointer;\ state->font_nil_stack_top.v = fnt_tag_zero();\ state->font_size_nil_stack_top.v = 24.f;\ state->text_raster_flags_nil_stack_top.v = FNT_RasterFlag_Hinted;\ @@ -143,7 +143,7 @@ struct { UI_BackgroundColorNode *top; Vec4F32 bottom_val; UI_BackgroundColorNode struct { UI_TextColorNode *top; Vec4F32 bottom_val; UI_TextColorNode *free; U64 gen; B32 auto_pop; } text_color_stack;\ struct { UI_BorderColorNode *top; Vec4F32 bottom_val; UI_BorderColorNode *free; U64 gen; B32 auto_pop; } border_color_stack;\ struct { UI_SquishNode *top; F32 bottom_val; UI_SquishNode *free; U64 gen; B32 auto_pop; } squish_stack;\ -struct { UI_HoverCursorNode *top; OS_Cursor bottom_val; UI_HoverCursorNode *free; U64 gen; B32 auto_pop; } hover_cursor_stack;\ +struct { UI_HoverCursorNode *top; WM_Cursor bottom_val; UI_HoverCursorNode *free; U64 gen; B32 auto_pop; } hover_cursor_stack;\ struct { UI_FontNode *top; FNT_Tag bottom_val; UI_FontNode *free; U64 gen; B32 auto_pop; } font_stack;\ struct { UI_FontSizeNode *top; F32 bottom_val; UI_FontSizeNode *free; U64 gen; B32 auto_pop; } font_size_stack;\ struct { UI_TextRasterFlagsNode *top; FNT_RasterFlags bottom_val; UI_TextRasterFlagsNode *free; U64 gen; B32 auto_pop; } text_raster_flags_stack;\ @@ -180,7 +180,7 @@ state->background_color_stack.top = &state->background_color_nil_stack_top; stat state->text_color_stack.top = &state->text_color_nil_stack_top; state->text_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->text_color_stack.free = 0; state->text_color_stack.auto_pop = 0;\ state->border_color_stack.top = &state->border_color_nil_stack_top; state->border_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->border_color_stack.free = 0; state->border_color_stack.auto_pop = 0;\ state->squish_stack.top = &state->squish_nil_stack_top; state->squish_stack.bottom_val = 0; state->squish_stack.free = 0; state->squish_stack.auto_pop = 0;\ -state->hover_cursor_stack.top = &state->hover_cursor_nil_stack_top; state->hover_cursor_stack.bottom_val = OS_Cursor_Pointer; state->hover_cursor_stack.free = 0; state->hover_cursor_stack.auto_pop = 0;\ +state->hover_cursor_stack.top = &state->hover_cursor_nil_stack_top; state->hover_cursor_stack.bottom_val = WM_Cursor_Pointer; state->hover_cursor_stack.free = 0; state->hover_cursor_stack.auto_pop = 0;\ state->font_stack.top = &state->font_nil_stack_top; state->font_stack.bottom_val = fnt_tag_zero(); state->font_stack.free = 0; state->font_stack.auto_pop = 0;\ state->font_size_stack.top = &state->font_size_nil_stack_top; state->font_size_stack.bottom_val = 24.f; state->font_size_stack.free = 0; state->font_size_stack.auto_pop = 0;\ state->text_raster_flags_stack.top = &state->text_raster_flags_nil_stack_top; state->text_raster_flags_stack.bottom_val = FNT_RasterFlag_Hinted; state->text_raster_flags_stack.free = 0; state->text_raster_flags_stack.auto_pop = 0;\ @@ -253,7 +253,7 @@ internal Vec4F32 ui_top_background_color(void); internal Vec4F32 ui_top_text_color(void); internal Vec4F32 ui_top_border_color(void); internal F32 ui_top_squish(void); -internal OS_Cursor ui_top_hover_cursor(void); +internal WM_Cursor ui_top_hover_cursor(void); internal FNT_Tag ui_top_font(void); internal F32 ui_top_font_size(void); internal FNT_RasterFlags ui_top_text_raster_flags(void); @@ -288,7 +288,7 @@ internal Vec4F32 ui_bottom_background_color(void); internal Vec4F32 ui_bottom_text_color(void); internal Vec4F32 ui_bottom_border_color(void); internal F32 ui_bottom_squish(void); -internal OS_Cursor ui_bottom_hover_cursor(void); +internal WM_Cursor ui_bottom_hover_cursor(void); internal FNT_Tag ui_bottom_font(void); internal F32 ui_bottom_font_size(void); internal FNT_RasterFlags ui_bottom_text_raster_flags(void); @@ -323,7 +323,7 @@ internal Vec4F32 ui_push_background_color(Vec4F32 v); internal Vec4F32 ui_push_text_color(Vec4F32 v); internal Vec4F32 ui_push_border_color(Vec4F32 v); internal F32 ui_push_squish(F32 v); -internal OS_Cursor ui_push_hover_cursor(OS_Cursor v); +internal WM_Cursor ui_push_hover_cursor(WM_Cursor v); internal FNT_Tag ui_push_font(FNT_Tag v); internal F32 ui_push_font_size(F32 v); internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v); @@ -358,7 +358,7 @@ internal Vec4F32 ui_pop_background_color(void); internal Vec4F32 ui_pop_text_color(void); internal Vec4F32 ui_pop_border_color(void); internal F32 ui_pop_squish(void); -internal OS_Cursor ui_pop_hover_cursor(void); +internal WM_Cursor ui_pop_hover_cursor(void); internal FNT_Tag ui_pop_font(void); internal F32 ui_pop_font_size(void); internal FNT_RasterFlags ui_pop_text_raster_flags(void); @@ -393,7 +393,7 @@ internal Vec4F32 ui_set_next_background_color(Vec4F32 v); internal Vec4F32 ui_set_next_text_color(Vec4F32 v); internal Vec4F32 ui_set_next_border_color(Vec4F32 v); internal F32 ui_set_next_squish(F32 v); -internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v); +internal WM_Cursor ui_set_next_hover_cursor(WM_Cursor v); internal FNT_Tag ui_set_next_font(FNT_Tag v); internal F32 ui_set_next_font_size(F32 v); internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v); diff --git a/src/ui/ui.mdesk b/src/ui/ui.mdesk index 0617f18a..b8636dac 100644 --- a/src/ui/ui.mdesk +++ b/src/ui/ui.mdesk @@ -44,7 +44,7 @@ UI_StackTable: { Squish squish F32 0 } //- rjf: hover cursor - { HoverCursor hover_cursor OS_Cursor OS_Cursor_Pointer } + { HoverCursor hover_cursor WM_Cursor WM_Cursor_Pointer } //- rjf: font { Font font FNT_Tag `fnt_tag_zero()` } diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index 8723c6cd..eea5eae1 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -212,7 +212,7 @@ ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, B32 is_focus_active_disabled = (!is_focus_active && ui_top_focus_active() == UI_FocusKind_On); //- rjf: build top-level box - ui_set_next_hover_cursor(is_focus_active ? OS_Cursor_IBar : OS_Cursor_Pointer); + ui_set_next_hover_cursor(is_focus_active ? WM_Cursor_IBar : WM_Cursor_Pointer); UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawBackground| UI_BoxFlag_DrawBorder| UI_BoxFlag_MouseClickable| @@ -252,7 +252,7 @@ ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, // rjf: perform copy if(op.flags & UI_TxtOpFlag_Copy) { - os_set_clipboard_text(op.copy); + wm_set_clipboard_text(op.copy); } // rjf: commit op's changed cursor & mark to caller-provided state @@ -436,7 +436,7 @@ ui_imagef(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F internal UI_Signal ui_expander(B32 is_expanded, String8 string) { - ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_hover_cursor(WM_Cursor_HandPoint); ui_set_next_text_alignment(UI_TextAlign_Center); ui_set_next_font(ui_icon_font()); UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, string); @@ -462,7 +462,7 @@ internal UI_Signal ui_sort_header(B32 sorting, B32 ascending, String8 string) { ui_set_next_child_layout_axis(Axis2_X); - ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_hover_cursor(WM_Cursor_HandPoint); UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, string); ui_push_parent(box); @@ -649,7 +649,7 @@ internal UI_Signal ui_sat_val_picker(F32 hue, F32 *out_sat, F32 *out_val, String8 string) { // rjf: build & interact - ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_hover_cursor(WM_Cursor_HandPoint); UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); UI_SatValDrawData *user = push_array(ui_build_arena(), UI_SatValDrawData, 1); ui_box_equip_custom_draw(box, ui_sat_val_picker_draw, user); @@ -758,7 +758,7 @@ internal UI_Signal ui_hue_picker(F32 *out_hue, F32 sat, F32 val, String8 string) { // rjf: build & interact - ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_hover_cursor(WM_Cursor_HandPoint); UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); UI_HueDrawData *user = push_array(ui_build_arena(), UI_HueDrawData, 1); ui_box_equip_custom_draw(box, ui_hue_picker_draw, user); @@ -845,7 +845,7 @@ internal UI_Signal ui_alpha_picker(F32 *out_alpha, String8 string) { // rjf: build & interact - ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_hover_cursor(WM_Cursor_HandPoint); UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string); UI_AlphaDrawData *user = push_array(ui_build_arena(), UI_AlphaDrawData, 1); ui_box_equip_custom_draw(box, ui_alpha_picker_draw, user); @@ -1006,7 +1006,7 @@ ui_table_begin(U64 column_pct_count, F32 **column_pcts, String8 string) // rjf: make column boundary widget UI_Rect(rect) { - ui_set_next_hover_cursor(OS_Cursor_LeftRight); + ui_set_next_hover_cursor(WM_Cursor_LeftRight); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "###%S_boundary_%I64u", table->string, column_idx); F32 *left_pct_ptr = column_idx < ui_ts_col_pct_count ? column_pcts[column_idx-1] : 0; diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index b181f976..0504e490 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -233,7 +233,7 @@ ui_single_line_txt_op_from_event(Arena *arena, UI_Event *event, String8 string, if(event->flags & UI_EventFlag_Paste) { range = txt_rng(cursor, mark); - replace = os_get_clipboard_text(arena); + replace = wm_get_clipboard_text(arena); next_cursor = next_mark = txt_pt(cursor.line, cursor.column+replace.size); } @@ -471,7 +471,7 @@ ui_build_arena(void) return result; } -internal OS_Window +internal WM_Window ui_window(void) { return ui_state->window; @@ -523,25 +523,25 @@ ui_next_event(UI_Event **ev) if(!(perms & UI_PermissionFlag_ClicksLeft) && (n->v.kind == UI_EventKind_Press || n->v.kind == UI_EventKind_Release) && - (n->v.key == OS_Key_LeftMouseButton)) + (n->v.key == WM_Key_LeftMouseButton)) { good = 0; } if(!(perms & UI_PermissionFlag_ClicksMiddle) && (n->v.kind == UI_EventKind_Press || n->v.kind == UI_EventKind_Release) && - (n->v.key == OS_Key_MiddleMouseButton)) + (n->v.key == WM_Key_MiddleMouseButton)) { good = 0; } if(!(perms & UI_PermissionFlag_ClicksRight) && (n->v.kind == UI_EventKind_Press || n->v.kind == UI_EventKind_Release) && - (n->v.key == OS_Key_RightMouseButton)) + (n->v.key == WM_Key_RightMouseButton)) { good = 0; } - if(!(perms & UI_PermissionFlag_ScrollX) && (n->v.kind == UI_EventKind_Scroll) && (n->v.delta_2f32.x != 0 || n->v.modifiers == OS_Modifier_Shift)) + if(!(perms & UI_PermissionFlag_ScrollX) && (n->v.kind == UI_EventKind_Scroll) && (n->v.delta_2f32.x != 0 || n->v.modifiers == WM_Modifier_Shift)) { good = 0; } @@ -553,9 +553,9 @@ ui_next_event(UI_Event **ev) n->v.kind == UI_EventKind_Release || n->v.kind == UI_EventKind_Navigate || n->v.kind == UI_EventKind_Edit) && - (n->v.key != OS_Key_LeftMouseButton && - n->v.key != OS_Key_MiddleMouseButton && - n->v.key != OS_Key_RightMouseButton)) + (n->v.key != WM_Key_LeftMouseButton && + n->v.key != WM_Key_MiddleMouseButton && + n->v.key != WM_Key_RightMouseButton)) { if((perms & UI_PermissionFlag_Keyboard) == UI_PermissionFlag_KeyboardSecondary) { @@ -594,7 +594,7 @@ ui_eat_event(UI_Event *ev) //- rjf: event consumption helpers internal B32 -ui_key_press(OS_Modifiers mods, OS_Key key) +ui_key_press(WM_Modifiers mods, WM_Key key) { B32 result = 0; for(UI_Event *evt = 0; ui_next_event(&evt);) @@ -610,7 +610,7 @@ ui_key_press(OS_Modifiers mods, OS_Key key) } internal B32 -ui_key_release(OS_Modifiers mods, OS_Key key) +ui_key_release(WM_Modifiers mods, WM_Key key) { B32 result = 0; for(UI_Event *evt = 0; ui_next_event(&evt);) @@ -796,7 +796,7 @@ ui_box_from_key(UI_Key key) //~ rjf: Top-Level Building API internal void -ui_begin_build(OS_Window window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt) +ui_begin_build(WM_Window window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt) { //- rjf: reset per-build ui state { @@ -872,11 +872,11 @@ ui_begin_build(OS_Window window, UI_EventList *events, UI_IconInfo *icon_info, U //- rjf: detect external press & holds for EachEnumVal(UI_MouseButtonKind, k) { - if(ui_key_match(ui_state->active_box_key[k], ui_key_zero()) && os_key_is_down(OS_Key_LeftMouseButton+k)) + if(ui_key_match(ui_state->active_box_key[k], ui_key_zero()) && wm_key_is_down(WM_Key_LeftMouseButton+k)) { ui_state->active_box_key[k] = ui_state->external_key; } - else if(ui_key_match(ui_state->active_box_key[k], ui_state->external_key) && !os_key_is_down(OS_Key_LeftMouseButton+k)) + else if(ui_key_match(ui_state->active_box_key[k], ui_state->external_key) && !wm_key_is_down(WM_Key_LeftMouseButton+k)) { ui_state->active_box_key[k] = ui_key_zero(); } @@ -887,7 +887,7 @@ ui_begin_build(OS_Window window, UI_EventList *events, UI_IconInfo *icon_info, U ui_state->theme = theme; ui_state->events = events; ui_state->window = window; - ui_state->mouse = (os_window_is_focused(window) || ui_state->last_time_mousemoved_us+500000 >= now_time_us()) ? os_mouse_from_window(window) : v2f32(-100, -100); + ui_state->mouse = (wm_window_is_focused(window) || ui_state->last_time_mousemoved_us+500000 >= now_time_us()) ? wm_mouse_from_window(window) : v2f32(-100, -100); ui_state->animation_dt = animation_dt; MemoryZeroStruct(&ui_state->icon_info); ui_state->icon_info.icon_font = icon_info->icon_font; @@ -921,11 +921,11 @@ ui_begin_build(OS_Window window, UI_EventList *events, UI_IconInfo *icon_info, U B32 nav_next = 0; B32 nav_prev = 0; Axis2 axis_lock = Axis2_Invalid; - if(ui_key_press(0, OS_Key_Tab)) + if(ui_key_press(0, WM_Key_Tab)) { nav_next = 1; } - if(ui_key_press(OS_Modifier_Shift, OS_Key_Tab)) + if(ui_key_press(WM_Modifier_Shift, WM_Key_Tab)) { nav_prev = 1; } @@ -1123,7 +1123,7 @@ ui_begin_build(OS_Window window, UI_EventList *events, UI_IconInfo *icon_info, U //- rjf: build top-level root { - Rng2F32 window_rect = os_client_rect_from_window(window); + Rng2F32 window_rect = wm_client_rect_from_window(window); Vec2F32 window_rect_size = dim_2f32(window_rect); ui_set_next_fixed_width(window_rect_size.x); ui_set_next_fixed_height(window_rect_size.y); @@ -1306,7 +1306,7 @@ ui_end_build(void) UI_Box *root = floating_roots[idx]; if(!ui_box_is_nil(root)) { - Rng2F32 window_rect = os_client_rect_from_window(ui_window()); + Rng2F32 window_rect = wm_client_rect_from_window(ui_window()); Vec2F32 window_dim = dim_2f32(window_rect); Rng2F32 root_rect = root->rect; Vec2F32 shift_down = @@ -1538,7 +1538,7 @@ ui_end_build(void) for(UI_Event *evt = 0; ui_next_event(&evt);) { if(evt->kind == UI_EventKind_Press && - (evt->key == OS_Key_LeftMouseButton || evt->key == OS_Key_RightMouseButton)) + (evt->key == WM_Key_LeftMouseButton || evt->key == WM_Key_RightMouseButton)) { ui_ctx_menu_close(); } @@ -1551,14 +1551,14 @@ ui_end_build(void) UI_Box *hot = ui_box_from_key(ui_state->hot_box_key); UI_Box *active = ui_box_from_key(ui_state->active_box_key[UI_MouseButtonKind_Left]); UI_Box *box = ui_box_is_nil(active) ? hot : active; - OS_Cursor cursor = box->hover_cursor; + WM_Cursor cursor = box->hover_cursor; if(box->flags & UI_BoxFlag_Disabled && box->flags & UI_BoxFlag_Clickable) { - cursor = OS_Cursor_Disabled; + cursor = WM_Cursor_Disabled; } - if(os_window_is_focused(ui_state->window) || !ui_box_is_nil(active)) + if(wm_window_is_focused(ui_state->window) || !ui_box_is_nil(active)) { - os_set_cursor(cursor); + wm_set_cursor(cursor); } } @@ -1583,7 +1583,7 @@ ui_end_build(void) StringJoin join = {0}; join.sep = str8_lit(" "); String8 string = str8_list_join(scratch.arena, &strs, &join); - os_set_clipboard_text(string); + wm_set_clipboard_text(string); } scratch_end(scratch); } @@ -2451,7 +2451,7 @@ ui_build_box_from_key(UI_BoxFlags flags, UI_Key key) box->first = box->last = box->next = box->prev = box->parent = &ui_nil_box; box->child_count = 0; box->flags = 0; - box->hover_cursor = OS_Cursor_Pointer; + box->hover_cursor = WM_Cursor_Pointer; MemoryZeroArray(box->pref_size); MemoryZeroStruct(&box->draw_bucket); } @@ -2809,7 +2809,7 @@ ui_signal_from_box(UI_Box *box) { B32 is_focus_hot = box->flags & UI_BoxFlag_FocusHot && !(box->flags & UI_BoxFlag_FocusHotDisabled); UI_Signal sig = {box}; - sig.event_flags |= os_get_modifiers(); + sig.event_flags |= wm_get_modifiers(); ////////////////////////////// //- rjf: calculate possibly-clipped box rectangle @@ -2858,13 +2858,13 @@ ui_signal_from_box(UI_Box *box) //- rjf: unpack event Vec2F32 evt_mouse = evt->pos; B32 evt_mouse_in_bounds = !contains_2f32(blacklist_rect, evt_mouse) && contains_2f32(rect, evt_mouse); - UI_MouseButtonKind evt_mouse_button_kind = (evt->key == OS_Key_LeftMouseButton ? UI_MouseButtonKind_Left : - evt->key == OS_Key_MiddleMouseButton ? UI_MouseButtonKind_Middle : - evt->key == OS_Key_RightMouseButton ? UI_MouseButtonKind_Right : + UI_MouseButtonKind evt_mouse_button_kind = (evt->key == WM_Key_LeftMouseButton ? UI_MouseButtonKind_Left : + evt->key == WM_Key_MiddleMouseButton ? UI_MouseButtonKind_Middle : + evt->key == WM_Key_RightMouseButton ? UI_MouseButtonKind_Right : UI_MouseButtonKind_Left); - B32 evt_key_is_mouse = (evt->key == OS_Key_LeftMouseButton || - evt->key == OS_Key_MiddleMouseButton || - evt->key == OS_Key_RightMouseButton); + B32 evt_key_is_mouse = (evt->key == WM_Key_LeftMouseButton || + evt->key == WM_Key_MiddleMouseButton || + evt->key == WM_Key_RightMouseButton); sig.event_flags |= evt->modifiers; //- rjf: mouse presses in box -> set hot/active; mark signal accordingly @@ -2878,14 +2878,14 @@ ui_signal_from_box(UI_Box *box) sig.f |= (UI_SignalFlag_LeftPressed<drag_start_mouse = evt->pos; if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) && - evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_get_gfx_info()->double_click_time) + evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*wm_get_system_info()->double_click_time) { sig.f |= (UI_SignalFlag_LeftDoubleClicked<key, ui_state->press_key_history[evt_mouse_button_kind][0]) && ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][1]) && - evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_get_gfx_info()->double_click_time && - ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] - ui_state->press_timestamp_history_us[evt_mouse_button_kind][1] <= 1000000*os_get_gfx_info()->double_click_time) + evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*wm_get_system_info()->double_click_time && + ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] - ui_state->press_timestamp_history_us[evt_mouse_button_kind][1] <= 1000000*wm_get_system_info()->double_click_time) { sig.f |= (UI_SignalFlag_LeftTripleClicked<flags & UI_BoxFlag_Scroll && evt->kind == UI_EventKind_Scroll && - (evt->modifiers == 0 || evt->modifiers == OS_Modifier_Shift) && + (evt->modifiers == 0 || evt->modifiers == WM_Modifier_Shift) && evt_mouse_in_bounds) { Vec2F32 delta = evt->delta_2f32; - if(evt->modifiers & OS_Modifier_Shift) + if(evt->modifiers & WM_Modifier_Shift) { Swap(F32, delta.x, delta.y); } @@ -3001,11 +3001,11 @@ ui_signal_from_box(UI_Box *box) //- rjf: view scrolling if(box->flags & UI_BoxFlag_ViewScroll && box->first_touched_build_index != box->last_touched_build_index && evt->kind == UI_EventKind_Scroll && - (evt->modifiers == 0 || evt->modifiers == OS_Modifier_Shift) && + (evt->modifiers == 0 || evt->modifiers == WM_Modifier_Shift) && evt_mouse_in_bounds) { Vec2F32 delta = evt->delta_2f32; - if(evt->modifiers & OS_Modifier_Shift) + if(evt->modifiers & WM_Modifier_Shift) { Swap(F32, delta.x, delta.y); } @@ -3077,7 +3077,7 @@ ui_signal_from_box(UI_Box *box) if(sig.f & (UI_SignalFlag_LeftDragging<press_key_history[k][0], box->key) && ui_key_match(ui_state->press_key_history[k][1], box->key) && - ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_get_gfx_info()->double_click_time && + ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*wm_get_system_info()->double_click_time && length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f) { sig.f |= (UI_SignalFlag_LeftDoubleDragging<press_key_history[k][0], box->key) && ui_key_match(ui_state->press_key_history[k][1], box->key) && ui_key_match(ui_state->press_key_history[k][2], box->key) && - ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_get_gfx_info()->double_click_time && - ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*os_get_gfx_info()->double_click_time && + ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*wm_get_system_info()->double_click_time && + ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*wm_get_system_info()->double_click_time && length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f && length_2f32(sub_2f32(ui_state->press_pos_history[k][1], ui_state->press_pos_history[k][2])) < 10.f) { diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index 85fdbe53..5bd3e875 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -142,8 +142,8 @@ struct UI_Event UI_EventActionSlot slot; UI_EventFlags flags; UI_EventDeltaUnit delta_unit; - OS_Key key; - OS_Modifiers modifiers; + WM_Key key; + WM_Modifiers modifiers; String8 string; String8List paths; Vec2F32 pos; @@ -389,7 +389,7 @@ struct UI_Box Vec2F32 min_size; UI_Size pref_size[Axis2_COUNT]; Axis2 child_layout_axis; - OS_Cursor hover_cursor; + WM_Cursor hover_cursor; U32 fastpath_codepoint; UI_Key group_key; DR_Bucket *draw_bucket; @@ -524,7 +524,7 @@ typedef struct UI_Signal UI_Signal; struct UI_Signal { UI_Box *box; - OS_Modifiers event_flags; + WM_Modifiers event_flags; Vec2S16 scroll; UI_SignalFlags f; }; @@ -705,7 +705,7 @@ struct UI_State UI_IconInfo icon_info; UI_Theme *theme; UI_AnimationInfo animation_info; - OS_Window window; + WM_Window window; UI_EventList *events; Vec2F32 mouse; F32 animation_dt; @@ -826,7 +826,7 @@ internal UI_State *ui_get_selected_state(void); //- rjf: per-frame info internal Arena * ui_build_arena(void); -internal OS_Window ui_window(void); +internal WM_Window ui_window(void); internal Vec2F32 ui_mouse(void); internal FNT_Tag ui_icon_font(void); internal String8 ui_icon_string_from_kind(UI_IconKind icon_kind); @@ -837,8 +837,8 @@ internal B32 ui_next_event(UI_Event **ev); internal void ui_eat_event(UI_Event *ev); //- rjf: event consumption helpers -internal B32 ui_key_press(OS_Modifiers mods, OS_Key key); -internal B32 ui_key_release(OS_Modifiers mods, OS_Key key); +internal B32 ui_key_press(WM_Modifiers mods, WM_Key key); +internal B32 ui_key_release(WM_Modifiers mods, WM_Key key); internal B32 ui_text(U32 character); internal B32 ui_slot_press(UI_EventActionSlot slot); @@ -873,7 +873,7 @@ internal UI_Box * ui_box_from_key(UI_Key key); //////////////////////////////// //~ rjf: Top-Level Building API -internal void ui_begin_build(OS_Window window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt); +internal void ui_begin_build(WM_Window window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt); internal void ui_end_build(void); internal void ui_calc_sizes_standalone__in_place(UI_Box *root, Axis2 axis); internal void ui_calc_sizes_upwards_dependent__in_place(UI_Box *root, Axis2 axis); @@ -985,7 +985,7 @@ internal Vec4F32 ui_top_background_color(void); internal Vec4F32 ui_top_text_color(void); internal Vec4F32 ui_top_border_color(void); internal F32 ui_top_squish(void); -internal OS_Cursor ui_top_hover_cursor(void); +internal WM_Cursor ui_top_hover_cursor(void); internal FNT_Tag ui_top_font(void); internal F32 ui_top_font_size(void); internal FNT_RasterFlags ui_top_text_raster_flags(void); @@ -1020,7 +1020,7 @@ internal Vec4F32 ui_bottom_background_color(void); internal Vec4F32 ui_bottom_text_color(void); internal Vec4F32 ui_bottom_border_color(void); internal F32 ui_bottom_squish(void); -internal OS_Cursor ui_bottom_hover_cursor(void); +internal WM_Cursor ui_bottom_hover_cursor(void); internal FNT_Tag ui_bottom_font(void); internal F32 ui_bottom_font_size(void); internal FNT_RasterFlags ui_bottom_text_raster_flags(void); @@ -1055,7 +1055,7 @@ internal Vec4F32 ui_push_background_color(Vec4F32 v); internal Vec4F32 ui_push_text_color(Vec4F32 v); internal Vec4F32 ui_push_border_color(Vec4F32 v); internal F32 ui_push_squish(F32 v); -internal OS_Cursor ui_push_hover_cursor(OS_Cursor v); +internal WM_Cursor ui_push_hover_cursor(WM_Cursor v); internal FNT_Tag ui_push_font(FNT_Tag v); internal F32 ui_push_font_size(F32 v); internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v); @@ -1090,7 +1090,7 @@ internal Vec4F32 ui_pop_background_color(void); internal Vec4F32 ui_pop_text_color(void); internal Vec4F32 ui_pop_border_color(void); internal F32 ui_pop_squish(void); -internal OS_Cursor ui_pop_hover_cursor(void); +internal WM_Cursor ui_pop_hover_cursor(void); internal FNT_Tag ui_pop_font(void); internal F32 ui_pop_font_size(void); internal FNT_RasterFlags ui_pop_text_raster_flags(void); @@ -1125,7 +1125,7 @@ internal Vec4F32 ui_set_next_background_color(Vec4F32 v); internal Vec4F32 ui_set_next_text_color(Vec4F32 v); internal Vec4F32 ui_set_next_border_color(Vec4F32 v); internal F32 ui_set_next_squish(F32 v); -internal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v); +internal WM_Cursor ui_set_next_hover_cursor(WM_Cursor v); internal FNT_Tag ui_set_next_font(FNT_Tag v); internal F32 ui_set_next_font_size(F32 v); internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v); diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index 9e98025f..e55504ad 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -14,7 +14,7 @@ global RIO_EXTENSION_FUNCTION_TABLE w32_rio_functions = {0}; //~ rjf: File Info Conversion Helpers internal FilePropertyFlags -os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes) +w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes) { FilePropertyFlags flags = 0; if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) @@ -25,19 +25,19 @@ os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes) } internal void -os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes) +w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes) { properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow); - os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); - os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); - properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); + w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); + w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); + properties->flags = w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); } //////////////////////////////// //~ rjf: Time Conversion Helpers internal void -os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) +w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) { out->year = in->wYear; out->mon = in->wMonth - 1; @@ -50,7 +50,7 @@ os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) } internal void -os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in) +w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in) { out->wYear = (WORD)(in->year); out->wMonth = in->mon + 1; @@ -62,17 +62,17 @@ os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in) } internal void -os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in) +w32_dense_time_from_file_time(DenseTime *out, FILETIME *in) { SYSTEMTIME systime = {0}; FileTimeToSystemTime(in, &systime); DateTime date_time = {0}; - os_w32_date_time_from_system_time(&date_time, &systime); + w32_date_time_from_system_time(&date_time, &systime); *out = dense_time_from_date_time(date_time); } internal U32 -os_w32_sleep_ms_from_endt_us(U64 endt_us) +w32_sleep_ms_from_endt_us(U64 endt_us) { U32 sleep_ms = 0; if(endt_us == max_U64) @@ -92,7 +92,7 @@ os_w32_sleep_ms_from_endt_us(U64 endt_us) } internal U32 -os_w32_unix_time_from_file_time(FILETIME file_time) +w32_unix_time_from_file_time(FILETIME file_time) { U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime; U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000); @@ -106,44 +106,44 @@ os_w32_unix_time_from_file_time(FILETIME file_time) //////////////////////////////// //~ rjf: Entity Functions -internal OS_W32_Entity * -os_w32_entity_alloc(OS_W32_EntityKind kind) +internal W32_Entity * +w32_entity_alloc(W32_EntityKind kind) { - OS_W32_Entity *result = 0; - EnterCriticalSection(&os_w32_state.entity_mutex); + W32_Entity *result = 0; + EnterCriticalSection(&w32_state.entity_mutex); { - result = os_w32_state.entity_free; + result = w32_state.entity_free; if(result) { - SLLStackPop(os_w32_state.entity_free); + SLLStackPop(w32_state.entity_free); } else { - result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1); + result = push_array_no_zero(w32_state.entity_arena, W32_Entity, 1); } MemoryZeroStruct(result); } - LeaveCriticalSection(&os_w32_state.entity_mutex); + LeaveCriticalSection(&w32_state.entity_mutex); result->kind = kind; return result; } internal void -os_w32_entity_release(OS_W32_Entity *entity) +w32_entity_release(W32_Entity *entity) { - entity->kind = OS_W32_EntityKind_Null; - EnterCriticalSection(&os_w32_state.entity_mutex); - SLLStackPush(os_w32_state.entity_free, entity); - LeaveCriticalSection(&os_w32_state.entity_mutex); + entity->kind = W32_EntityKind_Null; + EnterCriticalSection(&w32_state.entity_mutex); + SLLStackPush(w32_state.entity_free, entity); + LeaveCriticalSection(&w32_state.entity_mutex); } //////////////////////////////// //~ rjf: Thread Entry Point internal DWORD -os_w32_thread_entry_point(void *ptr) +w32_thread_entry_point(void *ptr) { - OS_W32_Entity *entity = (OS_W32_Entity *)ptr; + W32_Entity *entity = (W32_Entity *)ptr; ThreadEntryPointFunctionType *func = entity->thread.func; void *thread_ptr = entity->thread.ptr; supplement_thread_base_entry_point(func, thread_ptr); @@ -160,7 +160,7 @@ now_time_us(void) LARGE_INTEGER large_int_counter; if(QueryPerformanceCounter(&large_int_counter)) { - result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution; + result = (large_int_counter.QuadPart*Million(1))/w32_state.microsecond_resolution; } return result; } @@ -170,7 +170,7 @@ now_time_unix(void) { FILETIME file_time; GetSystemTimeAsFileTime(&file_time); - U32 unix_time = os_w32_unix_time_from_file_time(file_time); + U32 unix_time = w32_unix_time_from_file_time(file_time); return unix_time; } @@ -180,7 +180,7 @@ now_time_universal(void) SYSTEMTIME systime = {0}; GetSystemTime(&systime); DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); + w32_date_time_from_system_time(&result, &systime); return result; } @@ -188,14 +188,14 @@ internal DateTime universal_from_local_time(DateTime *date_time) { SYSTEMTIME systime = {0}; - os_w32_system_time_from_date_time(&systime, date_time); + w32_system_time_from_date_time(&systime, date_time); FILETIME ftime = {0}; SystemTimeToFileTime(&systime, &ftime); FILETIME ftime_local = {0}; LocalFileTimeToFileTime(&ftime, &ftime_local); FileTimeToSystemTime(&ftime_local, &systime); DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); + w32_date_time_from_system_time(&result, &systime); return result; } @@ -203,14 +203,14 @@ internal DateTime local_from_universal_time(DateTime *date_time) { SYSTEMTIME systime = {0}; - os_w32_system_time_from_date_time(&systime, date_time); + w32_system_time_from_date_time(&systime, date_time); FILETIME ftime = {0}; SystemTimeToFileTime(&systime, &ftime); FILETIME ftime_local = {0}; FileTimeToLocalFileTime(&ftime, &ftime_local); FileTimeToSystemTime(&ftime_local, &systime); DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); + w32_date_time_from_system_time(&result, &systime); return result; } @@ -361,7 +361,7 @@ shared_memory_view_close(SharedMemory handle, void *ptr, Rng1U64 range) internal SystemInfo * get_system_info(void) { - return &os_w32_state.system_info; + return &w32_state.system_info; } //////////////////////////////// @@ -425,10 +425,10 @@ set_platform_thread_name(String8 name) internal Thread thread_launch(ThreadEntryPointFunctionType *f, void *p) { - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread); + W32_Entity *entity = w32_entity_alloc(W32_EntityKind_Thread); entity->thread.func = f; entity->thread.ptr = p; - entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid); + entity->thread.handle = CreateThread(0, 0, w32_thread_entry_point, entity, 0, &entity->thread.tid); Thread result = {IntFromPtr(entity)}; return result; } @@ -436,14 +436,14 @@ thread_launch(ThreadEntryPointFunctionType *f, void *p) internal B32 thread_join(Thread thread, U64 endt_us) { - DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(thread.u64[0]); + DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us); + W32_Entity *entity = (W32_Entity *)PtrFromInt(thread.u64[0]); DWORD wait_result = WAIT_OBJECT_0; if(entity != 0) { wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); CloseHandle(entity->thread.handle); - os_w32_entity_release(entity); + w32_entity_release(entity); } return (wait_result == WAIT_OBJECT_0); } @@ -451,11 +451,11 @@ thread_join(Thread thread, U64 endt_us) internal void thread_detach(Thread thread) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(thread.u64[0]); if(entity != 0) { CloseHandle(entity->thread.handle); - os_w32_entity_release(entity); + w32_entity_release(entity); } } @@ -486,7 +486,7 @@ safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail internal Mutex mutex_alloc(void) { - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex); + W32_Entity *entity = w32_entity_alloc(W32_EntityKind_Mutex); InitializeCriticalSection(&entity->mutex); Mutex result = {IntFromPtr(entity)}; return result; @@ -495,22 +495,22 @@ mutex_alloc(void) internal void mutex_release(Mutex mutex) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); DeleteCriticalSection(&entity->mutex); - os_w32_entity_release(entity); + w32_entity_release(entity); } internal void mutex_take(Mutex mutex) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); EnterCriticalSection(&entity->mutex); } internal void mutex_drop(Mutex mutex) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); LeaveCriticalSection(&entity->mutex); } @@ -519,7 +519,7 @@ mutex_drop(Mutex mutex) internal RWMutex rw_mutex_alloc(void) { - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex); + W32_Entity *entity = w32_entity_alloc(W32_EntityKind_RWMutex); InitializeSRWLock(&entity->rw_mutex); RWMutex result = {IntFromPtr(entity)}; return result; @@ -528,14 +528,14 @@ rw_mutex_alloc(void) internal void rw_mutex_release(RWMutex rw_mutex) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - os_w32_entity_release(entity); + W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + w32_entity_release(entity); } internal void rw_mutex_take(RWMutex rw_mutex, B32 write_mode) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); if(write_mode) { AcquireSRWLockExclusive(&entity->rw_mutex); @@ -549,7 +549,7 @@ rw_mutex_take(RWMutex rw_mutex, B32 write_mode) internal void rw_mutex_drop(RWMutex rw_mutex, B32 write_mode) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(rw_mutex.u64[0]); if(write_mode) { ReleaseSRWLockExclusive(&entity->rw_mutex); @@ -565,7 +565,7 @@ rw_mutex_drop(RWMutex rw_mutex, B32 write_mode) internal CondVar cond_var_alloc(void) { - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable); + W32_Entity *entity = w32_entity_alloc(W32_EntityKind_ConditionVariable); InitializeConditionVariable(&entity->cv); CondVar result = {IntFromPtr(entity)}; return result; @@ -574,19 +574,19 @@ cond_var_alloc(void) internal void cond_var_release(CondVar cv) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - os_w32_entity_release(entity); + W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); + w32_entity_release(entity); } internal B32 cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us) { - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); BOOL result = 0; if(sleep_ms > 0) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); + W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex.u64[0]); result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms); } return result; @@ -595,12 +595,12 @@ cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us) internal B32 cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) { - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); BOOL result = 0; if(sleep_ms > 0) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); + W32_Entity *mutex_entity = (W32_Entity*)PtrFromInt(mutex_rw.u64[0]); result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, write_mode ? 0 : CONDITION_VARIABLE_LOCKMODE_SHARED); } @@ -610,14 +610,14 @@ cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) internal void cond_var_signal(CondVar cv) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); WakeConditionVariable(&entity->cv); } internal void cond_var_broadcast(CondVar cv) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(cv.u64[0]); WakeAllConditionVariable(&entity->cv); } @@ -662,7 +662,7 @@ semaphore_close(Semaphore semaphore) internal B32 semaphore_take(Semaphore semaphore, U64 endt_us) { - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + U32 sleep_ms = w32_sleep_ms_from_endt_us(endt_us); HANDLE handle = (HANDLE)semaphore.u64[0]; DWORD wait_result = WaitForSingleObject(handle, sleep_ms); B32 result = (wait_result == WAIT_OBJECT_0); @@ -681,7 +681,7 @@ semaphore_drop(Semaphore semaphore) internal Barrier barrier_alloc(U64 count) { - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Barrier); + W32_Entity *entity = w32_entity_alloc(W32_EntityKind_Barrier); if(entity != 0) { BOOL init_good = InitializeSynchronizationBarrier(&entity->sb, count, -1); @@ -694,18 +694,18 @@ barrier_alloc(U64 count) internal void barrier_release(Barrier barrier) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(barrier.u64[0]); if(entity != 0) { DeleteSynchronizationBarrier(&entity->sb); - os_w32_entity_release(entity); + w32_entity_release(entity); } } internal void barrier_wait(Barrier barrier) { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]); + W32_Entity *entity = (W32_Entity*)PtrFromInt(barrier.u64[0]); if(entity != 0) { EnterSynchronizationBarrier(&entity->sb, 0); @@ -826,7 +826,7 @@ file_set_time(File file, DateTime time) B32 result = 0; HANDLE handle = (HANDLE)file.u64[0]; SYSTEMTIME system_time = {0}; - os_w32_system_time_from_date_time(&system_time, &time); + w32_system_time_from_date_time(&system_time, &time); FILETIME file_time = {0}; result = (SystemTimeToFileTime(&system_time, &file_time) && SetFileTime(handle, &file_time, &file_time, &file_time)); @@ -846,9 +846,9 @@ properties_from_file(File file) U32 size_lo = info.nFileSizeLow; U32 size_hi = info.nFileSizeHigh; props.size = (U64)size_lo | (((U64)size_hi)<<32); - os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); - os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); - props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); + w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); + w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); + props.flags = w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); } return props; } @@ -968,9 +968,9 @@ properties_from_file_path(String8 path) if(handle != INVALID_HANDLE_VALUE) { props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow); - os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime); - os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime); - props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes); + w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime); + w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime); + props.flags = w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes); } else { @@ -1093,7 +1093,7 @@ file_iter_begin(Arena *arena, String8 path, FileIterFlags flags) String16 path16 = str16_from_8(scratch.arena, path_with_wildcard); FileIter *iter = push_array(arena, FileIter, 1); iter->flags = flags; - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; if(path.size == 0) { w32_iter->is_volume_iter = 1; @@ -1124,7 +1124,7 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out) { B32 result = 0; FileIterFlags flags = iter->flags; - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; switch(w32_iter->is_volume_iter) { //- rjf: file iteration @@ -1166,9 +1166,9 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out) if (usable_file){ info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name)); info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32); - os_w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); - os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); - info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes); + w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); + w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); + info_out->props.flags = w32_file_property_flags_from_dwFileAttributes(attributes); result = 1; if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){ iter->flags |= FileIterFlag_Done; @@ -1202,7 +1202,7 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out) internal void file_iter_end(FileIter *iter) { - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; + W32_FileIter *w32_iter = (W32_FileIter*)iter->memory; HANDLE zero_handle; MemoryZeroStruct(&zero_handle); if(!MemoryMatchStruct(&zero_handle, &w32_iter->handle)) @@ -1248,7 +1248,7 @@ abort_self(S32 exit_code) internal ProcessInfo * get_process_info(void) { - return &os_w32_state.process_info; + return &w32_state.process_info; } internal String8 @@ -1274,7 +1274,7 @@ get_process_start_time_unix(void) FILETIME user_time; if(GetProcessTimes(handle, &start_time, &exit_time, &kernel_time, &user_time)) { - result = os_w32_unix_time_from_file_time(start_time); + result = w32_unix_time_from_file_time(start_time); } return result; } @@ -1315,7 +1315,7 @@ process_launch(ProcessLaunchParams *params) { str8_list_push(scratch.arena, &all_opts, n->string); } - for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next) + for(String8Node *n = w32_state.process_info.environment.first; n != 0; n = n->next) { str8_list_push(scratch.arena, &all_opts, n->string); } @@ -1386,7 +1386,7 @@ internal B32 process_join(Process process, U64 endt_us, U64 *exit_code_out) { HANDLE process_handle = (HANDLE)(process.u64[0]); - DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + DWORD sleep_ms = w32_sleep_ms_from_endt_us(endt_us); DWORD result = WaitForSingleObject(process_handle, sleep_ms); B32 process_joined = (result == WAIT_OBJECT_0); if(process_joined && exit_code_out) @@ -1784,22 +1784,22 @@ w32_entry_point_caller(int argc, WCHAR **wargv) // (we need to set up some basics before this layer can supply // memory allocation primitives) { - os_w32_state.microsecond_resolution = 1; + w32_state.microsecond_resolution = 1; LARGE_INTEGER large_int_resolution; if(QueryPerformanceFrequency(&large_int_resolution)) { - os_w32_state.microsecond_resolution = large_int_resolution.QuadPart; + w32_state.microsecond_resolution = large_int_resolution.QuadPart; } } { - SystemInfo *info = &os_w32_state.system_info; + SystemInfo *info = &w32_state.system_info; info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors; info->page_size = sysinfo.dwPageSize; info->large_page_size = GetLargePageMinimum(); info->allocation_granularity = sysinfo.dwAllocationGranularity; } { - ProcessInfo *info = &os_w32_state.process_info; + ProcessInfo *info = &w32_state.process_info; info->large_pages_allowed = large_pages_allowed; info->pid = GetCurrentProcessId(); } @@ -1820,7 +1820,7 @@ w32_entry_point_caller(int argc, WCHAR **wargv) str8_match(arg8, str8_lit("-large_pages"), StringMatchFlag_CaseInsensitive)) { arena_default_flags = ArenaFlag_LargePages; - arena_default_reserve_size = Max(MB(64), os_w32_state.system_info.large_page_size); + arena_default_reserve_size = Max(MB(64), w32_state.system_info.large_page_size); arena_default_commit_size = arena_default_reserve_size; } if(str8_match(arg8, str8_lit("--gen_crash_dump"), StringMatchFlag_CaseInsensitive) || @@ -1838,9 +1838,9 @@ w32_entry_point_caller(int argc, WCHAR **wargv) //- rjf: set up dynamically-alloc'd state Arena *arena = arena_alloc(); { - os_w32_state.arena = arena; + w32_state.arena = arena; { - SystemInfo *info = &os_w32_state.system_info; + SystemInfo *info = &w32_state.system_info; U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0}; DWORD size = MAX_COMPUTERNAME_LENGTH + 1; if(GetComputerNameA((char*)buffer, &size)) @@ -1850,7 +1850,7 @@ w32_entry_point_caller(int argc, WCHAR **wargv) } } { - ProcessInfo *info = &os_w32_state.process_info; + ProcessInfo *info = &w32_state.process_info; { Temp scratch = scratch_begin(0, 0); DWORD size = KB(32); @@ -1896,8 +1896,8 @@ w32_entry_point_caller(int argc, WCHAR **wargv) } //- rjf: set up entity storage - InitializeCriticalSection(&os_w32_state.entity_mutex); - os_w32_state.entity_arena = arena_alloc(); + InitializeCriticalSection(&w32_state.entity_mutex); + w32_state.entity_arena = arena_alloc(); //- rjf: call into "real" entry point main_thread_base_entry_point(argc, argv); diff --git a/src/win32/base/win32_base.h b/src/win32/base/win32_base.h index f03113ee..9940e51d 100644 --- a/src/win32/base/win32_base.h +++ b/src/win32/base/win32_base.h @@ -28,8 +28,8 @@ //////////////////////////////// //~ rjf: File Iterator Types -typedef struct OS_W32_FileIter OS_W32_FileIter; -struct OS_W32_FileIter +typedef struct W32_FileIter W32_FileIter; +struct W32_FileIter { HANDLE handle; WIN32_FIND_DATAW find_data; @@ -37,27 +37,27 @@ struct OS_W32_FileIter String8Array drive_strings; U64 drive_strings_iter_idx; }; -StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size); +StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(W32_FileIter), file_iter_memory_size); //////////////////////////////// //~ rjf: Entity Types -typedef enum OS_W32_EntityKind +typedef enum W32_EntityKind { - OS_W32_EntityKind_Null, - OS_W32_EntityKind_Thread, - OS_W32_EntityKind_Mutex, - OS_W32_EntityKind_RWMutex, - OS_W32_EntityKind_ConditionVariable, - OS_W32_EntityKind_Barrier, + W32_EntityKind_Null, + W32_EntityKind_Thread, + W32_EntityKind_Mutex, + W32_EntityKind_RWMutex, + W32_EntityKind_ConditionVariable, + W32_EntityKind_Barrier, } -OS_W32_EntityKind; +W32_EntityKind; -typedef struct OS_W32_Entity OS_W32_Entity; -struct OS_W32_Entity +typedef struct W32_Entity W32_Entity; +struct W32_Entity { - OS_W32_Entity *next; - OS_W32_EntityKind kind; + W32_Entity *next; + W32_EntityKind kind; union { struct @@ -77,8 +77,8 @@ struct OS_W32_Entity //////////////////////////////// //~ rjf: State -typedef struct OS_W32_State OS_W32_State; -struct OS_W32_State +typedef struct W32_State W32_State; +struct W32_State { Arena *arena; @@ -90,37 +90,37 @@ struct OS_W32_State // rjf: entity storage CRITICAL_SECTION entity_mutex; Arena *entity_arena; - OS_W32_Entity *entity_free; + W32_Entity *entity_free; }; //////////////////////////////// //~ rjf: Globals -global OS_W32_State os_w32_state = {0}; +global W32_State w32_state = {0}; //////////////////////////////// //~ rjf: File Info Conversion Helpers -internal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); -internal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); +internal FilePropertyFlags w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); +internal void w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); //////////////////////////////// //~ rjf: Time Conversion Helpers -internal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); -internal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); -internal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); -internal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us); +internal void w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); +internal void w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); +internal void w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); +internal U32 w32_sleep_ms_from_endt_us(U64 endt_us); //////////////////////////////// //~ rjf: Entity Functions -internal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind); -internal void os_w32_entity_release(OS_W32_Entity *entity); +internal W32_Entity *w32_entity_alloc(W32_EntityKind kind); +internal void w32_entity_release(W32_Entity *entity); //////////////////////////////// //~ rjf: Thread Entry Point -internal DWORD os_w32_thread_entry_point(void *ptr); +internal DWORD w32_thread_entry_point(void *ptr); #endif // WIN32_BASE_H diff --git a/src/win32/demon/win32_demon.c b/src/win32/demon/win32_demon.c index 528f01e5..890404d7 100644 --- a/src/win32/demon/win32_demon.c +++ b/src/win32/demon/win32_demon.c @@ -1,71 +1,51 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -dmn_w32_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal U64 -dmn_w32_hash_from_id(U64 id) -{ - return dmn_w32_hash_from_string(str8_struct(&id)); -} - //////////////////////////////// //~ rjf: Entity Helpers //- rjf: entity <-> handle internal DMN_Handle -dmn_w32_handle_from_entity(DMN_W32_Entity *entity) +w32_dmn_handle_from_entity(W32_DMN_Entity *entity) { - U32 idx = (U32)(entity - dmn_w32_shared->entities_base); + U32 idx = (U32)(entity - w32_dmn_shared->entities_base); U32 gen = entity->gen; DMN_Handle handle = {idx, gen}; return handle; } -internal DMN_W32_Entity * -dmn_w32_entity_from_handle(DMN_Handle handle) +internal W32_DMN_Entity * +w32_dmn_entity_from_handle(DMN_Handle handle) { U32 idx = handle.u32[0]; U32 gen = handle.u32[1]; - DMN_W32_Entity *entity = dmn_w32_shared->entities_base + idx; + W32_DMN_Entity *entity = w32_dmn_shared->entities_base + idx; if(entity->gen != gen) { - entity = &dmn_w32_entity_nil; + entity = &w32_dmn_entity_nil; } return entity; } //- rjf: entity allocation/deallocation -internal DMN_W32_Entity * -dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) +internal W32_DMN_Entity * +w32_dmn_entity_alloc(W32_DMN_Entity *parent, W32_DMN_EntityKind kind, U64 id) { // rjf: allocate - DMN_W32_Entity *e = dmn_w32_shared->entities_first_free; + W32_DMN_Entity *e = w32_dmn_shared->entities_first_free; { U32 gen = 0; if(e != 0) { - SLLStackPop(dmn_w32_shared->entities_first_free); + SLLStackPop(w32_dmn_shared->entities_first_free); gen = e->gen; } else { - e = push_array_no_zero(dmn_w32_shared->entities_arena, DMN_W32_Entity, 1); - dmn_w32_shared->entities_count += 1; + e = push_array_no_zero(w32_dmn_shared->entities_arena, W32_DMN_Entity, 1); + w32_dmn_shared->entities_count += 1; } MemoryZeroStruct(e); e->gen = gen+1; @@ -76,21 +56,21 @@ dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) e->kind = kind; e->id = id; e->parent = parent; - e->next = e->prev = e->first = e->last = &dmn_w32_entity_nil; - if(parent != &dmn_w32_entity_nil) + e->next = e->prev = e->first = e->last = &w32_dmn_entity_nil; + if(parent != &w32_dmn_entity_nil) { - DLLPushBack_NPZ(&dmn_w32_entity_nil, parent->first, parent->last, e, next, prev); + DLLPushBack_NPZ(&w32_dmn_entity_nil, parent->first, parent->last, e, next, prev); } } // rjf: insert into id -> entity map if(id != 0) { - U64 hash = dmn_w32_hash_from_id(id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + U64 hash = u64_hash_from_str8(str8_struct(&id)); + U64 slot_idx = hash%w32_dmn_shared->entities_id_hash_slots_count; + W32_DMN_EntityIDHashSlot *slot = &w32_dmn_shared->entities_id_hash_slots[slot_idx]; + W32_DMN_EntityIDHashNode *node = 0; + for(W32_DMN_EntityIDHashNode *n = slot->first; n != 0; n = n->next) { if(n->id == id) { @@ -100,14 +80,14 @@ dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) } if(node == 0) { - node = dmn_w32_shared->entities_id_hash_node_free; + node = w32_dmn_shared->entities_id_hash_node_free; if(node != 0) { - SLLStackPop(dmn_w32_shared->entities_id_hash_node_free); + SLLStackPop(w32_dmn_shared->entities_id_hash_node_free); } else { - node = push_array(dmn_w32_shared->arena, DMN_W32_EntityIDHashNode, 1); + node = push_array(w32_dmn_shared->arena, W32_DMN_EntityIDHashNode, 1); } DLLPushBack(slot->first, slot->last, node); } @@ -119,30 +99,30 @@ dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id) } internal void -dmn_w32_entity_release(DMN_W32_Entity *entity) +w32_dmn_entity_release(W32_DMN_Entity *entity) { // rjf: unhook root - if(entity->parent != &dmn_w32_entity_nil) + if(entity->parent != &w32_dmn_entity_nil) { - DLLRemove_NPZ(&dmn_w32_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); + DLLRemove_NPZ(&w32_dmn_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev); } // rjf: walk every entity in this tree, free each - if(entity != &dmn_w32_entity_nil) + if(entity != &w32_dmn_entity_nil) { Temp scratch = scratch_begin(0, 0); typedef struct Task Task; struct Task { Task *next; - DMN_W32_Entity *e; + W32_DMN_Entity *e; }; Task start_task = {0, entity}; Task *first_task = &start_task; Task *last_task = &start_task; for(Task *t = first_task; t != 0; t = t->next) { - for(DMN_W32_Entity *child = t->e->first; child != &dmn_w32_entity_nil; child = child->next) + for(W32_DMN_Entity *child = t->e->first; child != &w32_dmn_entity_nil; child = child->next) { Task *t = push_array(scratch.arena, Task, 1); t->e = child; @@ -150,27 +130,27 @@ dmn_w32_entity_release(DMN_W32_Entity *entity) } // rjf: free entity - SLLStackPush(dmn_w32_shared->entities_first_free, t->e); + SLLStackPush(w32_dmn_shared->entities_first_free, t->e); t->e->gen += 1; - if(t->e->kind == DMN_W32_EntityKind_Module) + if(t->e->kind == W32_DMN_EntityKind_Module) { CloseHandle(t->e->handle); } - t->e->kind = DMN_W32_EntityKind_Null; + t->e->kind = W32_DMN_EntityKind_Null; // rjf: remove from id -> entity map if(t->e->id != 0) { - U64 hash = dmn_w32_hash_from_id(t->e->id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + U64 hash = u64_hash_from_str8(str8_struct(&t->e->id)); + U64 slot_idx = hash%w32_dmn_shared->entities_id_hash_slots_count; + W32_DMN_EntityIDHashSlot *slot = &w32_dmn_shared->entities_id_hash_slots[slot_idx]; + W32_DMN_EntityIDHashNode *node = 0; + for(W32_DMN_EntityIDHashNode *n = slot->first; n != 0; n = n->next) { if(n->id == t->e->id && n->entity == t->e) { DLLRemove(slot->first, slot->last, n); - SLLStackPush(dmn_w32_shared->entities_id_hash_node_free, n); + SLLStackPush(w32_dmn_shared->entities_id_hash_node_free, n); break; } } @@ -182,15 +162,15 @@ dmn_w32_entity_release(DMN_W32_Entity *entity) //- rjf: kind*id -> entity -internal DMN_W32_Entity * -dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id) +internal W32_DMN_Entity * +w32_dmn_entity_from_kind_id(W32_DMN_EntityKind kind, U64 id) { - DMN_W32_Entity *result = &dmn_w32_entity_nil; - U64 hash = dmn_w32_hash_from_id(id); - U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count; - DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx]; - DMN_W32_EntityIDHashNode *node = 0; - for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next) + W32_DMN_Entity *result = &w32_dmn_entity_nil; + U64 hash = u64_hash_from_str8(str8_struct(&id)); + U64 slot_idx = hash%w32_dmn_shared->entities_id_hash_slots_count; + W32_DMN_EntityIDHashSlot *slot = &w32_dmn_shared->entities_id_hash_slots[slot_idx]; + W32_DMN_EntityIDHashNode *node = 0; + for(W32_DMN_EntityIDHashNode *n = slot->first; n != 0; n = n->next) { if(n->entity->kind == kind && n->id == id) { @@ -209,7 +189,7 @@ dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id) //~ rjf: Module Info Extraction internal String8 -dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) +w32_dmn_full_path_from_module(Arena *arena, W32_DMN_Entity *module) { Temp scratch = scratch_begin(&arena, 1); @@ -229,7 +209,7 @@ dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) // rjf: fallback (main module only): process -> full path if(path16.size == 0 && module->module.is_main) { - DMN_W32_Entity *process = module->parent; + W32_DMN_Entity *process = module->parent; DWORD size = KB(4); U16 *buf = push_array_no_zero(scratch.arena, U16, size); if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size)) @@ -241,20 +221,20 @@ dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) // rjf: fallback (any module - no guarantee): address_of_name -> full path if(path16.size == 0 && module->module.address_of_name_pointer != 0) { - DMN_W32_Entity *process = module->parent; + W32_DMN_Entity *process = module->parent; U64 ptr_size = bit_size_from_arch(process->arch)/8; U64 name_pointer = 0; - if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) + if(w32_dmn_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer)) { if(name_pointer != 0) { if(module->module.name_is_unicode) { - path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer); + path16 = w32_dmn_read_memory_str16(scratch.arena, process->handle, name_pointer); } else { - path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer); + path8 = w32_dmn_read_memory_str(scratch.arena, process->handle, name_pointer); } } } @@ -308,7 +288,7 @@ dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module) //- rjf: processes internal U64 -dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) +w32_dmn_process_read(HANDLE process, Rng1U64 range, void *dst) { U64 bytes_read = 0; U8 *ptr = (U8*)dst; @@ -336,7 +316,7 @@ dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst) } internal B32 -dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src) +w32_dmn_process_write(HANDLE process, Rng1U64 range, void *src) { B32 result = 1; U8 *ptr = (U8*)src; @@ -358,14 +338,14 @@ dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src) } internal String8 -dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) +w32_dmn_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) { // TODO(rjf): @rewrite // // OLD: this could be done better with a demon_w32_read_memory // that returns a read amount instead of a success/fail. // - // (dmn_w32_process_read now does this, so we can switch to it) + // (w32_dmn_process_read now does this, so we can switch to it) // scan piece by piece Temp scratch = scratch_begin(&arena, 1); @@ -377,7 +357,7 @@ dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) for (;;){ U8 *block = push_array(scratch.arena, U8, cap); for (;cap > 0;){ - if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ + if (w32_dmn_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ break; } cap /= 2; @@ -407,14 +387,14 @@ dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) } internal String16 -dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) +w32_dmn_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) { // TODO(rjf): @rewrite // // OLD: this could be done better with a demon_w32_read_memory // that returns a read amount instead of a success/fail. // - // (dmn_w32_process_read now does this, so we can switch to it) + // (w32_dmn_process_read now does this, so we can switch to it) // scan piece by piece Temp scratch = scratch_begin(&arena, 1); @@ -426,7 +406,7 @@ dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) for (;;){ U8 *block = push_array(scratch.arena, U8, cap); for (;cap > 1;){ - if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ + if (w32_dmn_process_read(process_handle, r1u64(read_p, read_p+cap), block)){ break; } cap /= 2; @@ -458,19 +438,19 @@ dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) return(result); } -internal DMN_W32_ImageInfo -dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) +internal W32_DMN_ImageInfo +w32_dmn_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) { // rjf: find PE offset U32 pe_offset = 0; { U64 dos_magic_off = base_vaddr; U16 dos_magic = 0; - dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic); + w32_dmn_process_read_struct(process, dos_magic_off, &dos_magic); if(dos_magic == PE_DOS_MAGIC) { U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); - dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset); + w32_dmn_process_read_struct(process, pe_offset_off, &pe_offset); } } @@ -482,15 +462,15 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) { U64 pe_magic_off = base_vaddr + pe_offset; U32 pe_magic = 0; - dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic); + w32_dmn_process_read_struct(process, pe_magic_off, &pe_magic); if(pe_magic == PE_MAGIC) { coff_header_off = pe_magic_off + sizeof(pe_magic); - got_coff_header = dmn_w32_process_read_struct(process, coff_header_off, &coff_header); + got_coff_header = w32_dmn_process_read_struct(process, coff_header_off, &coff_header); } } - DMN_W32_ImageInfo result = zero_struct; + W32_DMN_ImageInfo result = zero_struct; if(got_coff_header) { U64 optional_off = coff_header_off + sizeof(COFF_FileHeader); @@ -505,7 +485,7 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) if(pe_has_plus_header(coff_header.machine)) { PE_OptionalHeader32Plus opt_header = {0}; - if(dmn_w32_process_read_struct(process, optional_off, &opt_header)) + if(w32_dmn_process_read_struct(process, optional_off, &opt_header)) { image_size = opt_header.sizeof_image; data_dir_count = opt_header.data_dir_count; @@ -516,7 +496,7 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) else { PE_OptionalHeader32 opt_header = {0}; - if(dmn_w32_process_read_struct(process, optional_off, &opt_header)) + if(w32_dmn_process_read_struct(process, optional_off, &opt_header)) { image_size = opt_header.sizeof_image; data_dir_count = opt_header.data_dir_count; @@ -530,17 +510,17 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) { U64 tls_dir_vaddr = data_dir_off + PE_DataDirectoryIndex_TLS * sizeof(PE_DataDirectory); PE_DataDirectory tls_dir = {0}; - if(dmn_w32_process_read_struct(process, tls_dir_vaddr, &tls_dir)) + if(w32_dmn_process_read_struct(process, tls_dir_vaddr, &tls_dir)) { if(pe_has_plus_header(coff_header.machine)) { if(tls_dir.virt_size == sizeof(PE_TLSHeader64)) { PE_TLSHeader64 tls_header = {0}; - if(dmn_w32_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) + if(w32_dmn_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) { U64 tls_index64 = 0; - if(dmn_w32_process_read_struct(process, tls_header.index_address, &tls_index64)) + if(w32_dmn_process_read_struct(process, tls_header.index_address, &tls_index64)) { tls_index = tls_index64; } @@ -554,10 +534,10 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) if(tls_dir.virt_size == sizeof(PE_TLSHeader32)) { PE_TLSHeader32 tls_header = {0}; - if(dmn_w32_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) + if(w32_dmn_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) { U32 tls_index32 = 0; - if(dmn_w32_process_read_struct(process, tls_header.index_address, &tls_index32)) + if(w32_dmn_process_read_struct(process, tls_header.index_address, &tls_index32)) { tls_index = tls_index32; } @@ -583,7 +563,7 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) //- rjf: threads internal B32 -dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) +w32_dmn_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) { B32 result = 0; ProfBeginFunction(); @@ -614,7 +594,7 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) //- rjf: set up context CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0); + U32 ctx_flags = W32_DMN_CTX_X64_ALL | (xstate_enabled ? W32_DMN_CTX_INTEL_XSTATE : 0); DWORD size = 0; InitializeContext(0, ctx_flags, 0, &size); if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) @@ -810,7 +790,7 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) } internal B32 -dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) +w32_dmn_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) { B32 result = 0; ProfBeginFunction(); @@ -841,7 +821,7 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) //- rjf: set up context CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0); + U32 ctx_flags = W32_DMN_CTX_X64_ALL | (xstate_enabled ? W32_DMN_CTX_INTEL_XSTATE : 0); DWORD size = 0; InitializeContext(0, ctx_flags, 0, &size); if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) @@ -991,7 +971,7 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) //- rjf: remote thread injection internal DWORD -dmn_w32_inject_thread(HANDLE process, U64 start_address) +w32_dmn_inject_thread(HANDLE process, U64 start_address) { LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address; DWORD thread_id = 0; @@ -1010,18 +990,18 @@ internal void dmn_init(void) { Arena *arena = arena_alloc(); - dmn_w32_shared = push_array(arena, DMN_W32_Shared, 1); - dmn_w32_shared->arena = arena; - dmn_w32_shared->access_mutex = mutex_alloc(); - dmn_w32_shared->detach_arena = arena_alloc(); - dmn_w32_shared->entities_arena = arena_alloc(.reserve_size = GB(8), .commit_size = KB(64)); - dmn_w32_shared->entities_base = dmn_w32_entity_alloc(&dmn_w32_entity_nil, DMN_W32_EntityKind_Root, 0); - dmn_w32_shared->entities_id_hash_slots_count = 4096; - dmn_w32_shared->entities_id_hash_slots = push_array(arena, DMN_W32_EntityIDHashSlot, dmn_w32_shared->entities_id_hash_slots_count); + w32_dmn_shared = push_array(arena, W32_DMN_Shared, 1); + w32_dmn_shared->arena = arena; + w32_dmn_shared->access_mutex = mutex_alloc(); + w32_dmn_shared->detach_arena = arena_alloc(); + w32_dmn_shared->entities_arena = arena_alloc(.reserve_size = GB(8), .commit_size = KB(64)); + w32_dmn_shared->entities_base = w32_dmn_entity_alloc(&w32_dmn_entity_nil, W32_DMN_EntityKind_Root, 0); + w32_dmn_shared->entities_id_hash_slots_count = 4096; + w32_dmn_shared->entities_id_hash_slots = push_array(arena, W32_DMN_EntityIDHashSlot, w32_dmn_shared->entities_id_hash_slots_count); // rjf: load Windows 10+ GetThreadDescription API { - dmn_w32_GetThreadDescription = (DMN_W32_GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetThreadDescription"); + w32_dmn_GetThreadDescription = (W32_DMN_GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetThreadDescription"); } // rjf: setup environment variables @@ -1039,8 +1019,8 @@ dmn_init(void) else { String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); - String8 string = str8_from_16(dmn_w32_shared->arena, string16); - str8_list_push(dmn_w32_shared->arena, &dmn_w32_shared->env_strings, string); + String8 string = str8_from_16(w32_dmn_shared->arena, string16); + str8_list_push(w32_dmn_shared->arena, &w32_dmn_shared->env_strings, string); start_idx = idx+1; } } @@ -1055,25 +1035,25 @@ internal DMN_CtrlCtx * dmn_ctrl_begin(void) { DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1; - dmn_w32_ctrl_thread = 1; + w32_dmn_ctrl_thread = 1; return ctx; } internal void dmn_ctrl_exclusive_access_begin(void) { - MutexScope(dmn_w32_shared->access_mutex) + MutexScope(w32_dmn_shared->access_mutex) { - dmn_w32_shared->access_run_state = 1; + w32_dmn_shared->access_run_state = 1; } } internal void dmn_ctrl_exclusive_access_end(void) { - MutexScope(dmn_w32_shared->access_mutex) + MutexScope(w32_dmn_shared->access_mutex) { - dmn_w32_shared->access_run_state = 0; + w32_dmn_shared->access_run_state = 0; } } @@ -1114,7 +1094,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) { str8_list_push(scratch.arena, &all_opts, n->string); } - for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next) + for(String8Node *n = w32_dmn_shared->env_strings.first; n != 0; n = n->next) { str8_list_push(scratch.arena, &all_opts, n->string); } @@ -1178,7 +1158,7 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) else { result = process_info.dwProcessId; - dmn_w32_shared->new_process_pending = 1; + w32_dmn_shared->new_process_pending = 1; } CloseHandle(process_info.hProcess); CloseHandle(process_info.hThread); @@ -1205,7 +1185,7 @@ dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid) DMN_AccessScope if(DebugActiveProcess((DWORD)pid)) { result = 1; - dmn_w32_shared->new_process_pending = 1; + w32_dmn_shared->new_process_pending = 1; #if 0 // TODO(rjf): JIT debugging info @@ -1233,7 +1213,7 @@ dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code) B32 result = 0; DMN_AccessScope { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); if(TerminateProcess(process_entity->handle, exit_code)) { result = 1; @@ -1248,14 +1228,14 @@ dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) B32 result = 0; DMN_AccessScope { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); // rjf: resume threads - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; + for(W32_DMN_Entity *child = process_entity->first; + child != &w32_dmn_entity_nil; child = child->next) { - if(child->kind == DMN_W32_EntityKind_Thread) + if(child->kind == W32_DMN_EntityKind_Thread) { DWORD resume_result = ResumeThread(child->handle); (void)resume_result; @@ -1274,7 +1254,7 @@ dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process) // rjf: push into list of processes to generate events for later if(result != 0) { - dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process); + dmn_handle_list_push(w32_dmn_shared->detach_arena, &w32_dmn_shared->detach_processes, process); } } return result; @@ -1289,28 +1269,28 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) ////////////////////////////// //- rjf: determine event generation path // - typedef enum DMN_W32_EventGenPath + typedef enum W32_DMN_EventGenPath { - DMN_W32_EventGenPath_NotAttached, - DMN_W32_EventGenPath_Run, - DMN_W32_EventGenPath_DetachProcesses, + W32_DMN_EventGenPath_NotAttached, + W32_DMN_EventGenPath_Run, + W32_DMN_EventGenPath_DetachProcesses, } - DMN_W32_EventGenPath; - DMN_W32_EventGenPath event_gen_path = DMN_W32_EventGenPath_Run; - if(dmn_w32_shared->detach_processes.first != 0) + W32_DMN_EventGenPath; + W32_DMN_EventGenPath event_gen_path = W32_DMN_EventGenPath_Run; + if(w32_dmn_shared->detach_processes.first != 0) { - event_gen_path = DMN_W32_EventGenPath_DetachProcesses; + event_gen_path = W32_DMN_EventGenPath_DetachProcesses; } else { - B32 any_processes_live = dmn_w32_shared->new_process_pending; + B32 any_processes_live = w32_dmn_shared->new_process_pending; if(!any_processes_live) { - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; + for(W32_DMN_Entity *process = w32_dmn_shared->entities_base->first; + process != &w32_dmn_entity_nil; process = process->next) { - if(process->kind == DMN_W32_EntityKind_Process) + if(process->kind == W32_DMN_EntityKind_Process) { any_processes_live = 1; break; @@ -1319,7 +1299,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } if(!any_processes_live) { - event_gen_path = DMN_W32_EventGenPath_NotAttached; + event_gen_path = W32_DMN_EventGenPath_NotAttached; } } @@ -1331,7 +1311,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //////////////////////////// //- rjf: produce not-attached error events // - case DMN_W32_EventGenPath_NotAttached: + case W32_DMN_EventGenPath_NotAttached: { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_Error; @@ -1341,7 +1321,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //////////////////////////// //- rjf: produce debug events from regular running // - case DMN_W32_EventGenPath_Run: + case W32_DMN_EventGenPath_Run: { Temp scratch = scratch_begin(&arena, 1); @@ -1351,14 +1331,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) CONTEXT *single_step_thread_ctx = 0; if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + W32_DMN_Entity *thread = w32_dmn_entity_from_handle(ctrls->single_step_thread); Arch arch = thread->arch; switch(arch) { default:{}break; case Arch_x64: { - U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; + U32 ctx_flags = W32_DMN_CTX_X64|W32_DMN_CTX_INTEL_CONTROL; DWORD size = 0; InitializeContext(0, ctx_flags, 0, &size); if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) @@ -1378,7 +1358,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("set single step bit") { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + W32_DMN_Entity *thread = w32_dmn_entity_from_handle(ctrls->single_step_thread); Arch arch = thread->arch; switch(arch) { @@ -1497,12 +1477,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) { DMN_Handle process = t->process; - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); + for(W32_DMN_Entity *child = process_entity->first; + child != &w32_dmn_entity_nil; child = child->next) { - if(child->kind == DMN_W32_EntityKind_Thread) + if(child->kind == W32_DMN_EntityKind_Thread) { switch(child->arch) { @@ -1512,7 +1492,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case Arch_x64: { X64_RegBlock regs = {0}; - dmn_w32_thread_read_reg_block(child->arch, child->handle, ®s); + w32_dmn_thread_read_reg_block(child->arch, child->handle, ®s); { U64 trap_idx = 0; for(DMN_TrapChunkNode *n = t->traps.first; n != 0; n = n->next) @@ -1573,7 +1553,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } } } - dmn_w32_thread_write_reg_block(child->arch, child->handle, ®s); + w32_dmn_thread_write_reg_block(child->arch, child->handle, ®s); }break; } } @@ -1584,16 +1564,16 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) ////////////////////////// //- rjf: produce list of threads which will run // - DMN_W32_EntityNode *first_run_thread = 0; - DMN_W32_EntityNode *last_run_thread = 0; + W32_DMN_EntityNode *first_run_thread = 0; + W32_DMN_EntityNode *last_run_thread = 0; ProfScope("produce list of threads which will run") { //- rjf: scan all processes - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; + for(W32_DMN_Entity *process = w32_dmn_shared->entities_base->first; + process != &w32_dmn_entity_nil; process = process->next) { - if(process->kind != DMN_W32_EntityKind_Process) {continue;} + if(process->kind != W32_DMN_EntityKind_Process) {continue;} //- rjf: determine if this process is frozen B32 process_is_frozen = 0; @@ -1601,7 +1581,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(process))) + if(dmn_handle_match(ctrls->run_entities[idx], w32_dmn_handle_from_entity(process))) { process_is_frozen = 1; break; @@ -1610,11 +1590,11 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } //- rjf: scan all threads in this process - for(DMN_W32_Entity *thread = process->first; - thread != &dmn_w32_entity_nil; + for(W32_DMN_Entity *thread = process->first; + thread != &w32_dmn_entity_nil; thread = thread->next) { - if(thread->kind != DMN_W32_EntityKind_Thread) {continue;} + if(thread->kind != W32_DMN_EntityKind_Thread) {continue;} //- rjf: determine if this thread is frozen B32 is_frozen = 0; @@ -1622,7 +1602,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: single-step? freeze if not the single-step thread. if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread)) { - is_frozen = !dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->single_step_thread); + is_frozen = !dmn_handle_match(w32_dmn_handle_from_entity(thread), ctrls->single_step_thread); } // rjf: not single-stepping? determine based on run controls freezing info @@ -1634,7 +1614,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1) { - if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(thread))) + if(dmn_handle_match(ctrls->run_entities[idx], w32_dmn_handle_from_entity(thread))) { is_frozen = 1; break; @@ -1648,7 +1628,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } //- rjf: disregard all other rules if this is the halter thread - if(dmn_w32_shared->halter_tid == thread->id) + if(w32_dmn_shared->halter_tid == thread->id) { is_frozen = 0; } @@ -1656,7 +1636,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //- rjf: add to list if(!is_frozen) { - DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); + W32_DMN_EntityNode *n = push_array(scratch.arena, W32_DMN_EntityNode, 1); n->v = thread; SLLQueuePush(first_run_thread, last_run_thread, n); } @@ -1670,8 +1650,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) B32 priority_mode = !dmn_handle_match(dmn_handle_zero(), ctrls->priority_thread); B32 did_priority_mode = priority_mode; B32 do_threads_resume = 1; - DMN_W32_EntityNode *first_ran_thread = 0; - DMN_W32_EntityNode *last_ran_thread = 0; + W32_DMN_EntityNode *first_ran_thread = 0; + W32_DMN_EntityNode *last_ran_thread = 0; U64 begin_time = now_time_us(); String8List debug_strings = {0}; DMN_Event *debug_strings_event = 0; @@ -1688,17 +1668,17 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(do_threads_resume) ProfScope("resume threads that we want to run") { do_threads_resume = 0; - for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next) + for(W32_DMN_EntityNode *n = first_run_thread; n != 0; n = n->next) { - DMN_W32_Entity *thread = n->v; - B32 thread_is_priority = dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->priority_thread); + W32_DMN_Entity *thread = n->v; + B32 thread_is_priority = dmn_handle_match(w32_dmn_handle_from_entity(thread), ctrls->priority_thread); if((priority_mode && !thread_is_priority) || (!priority_mode && did_priority_mode && thread_is_priority)) { continue; } DWORD resume_result = ResumeThread(thread->handle); - DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1); + W32_DMN_EntityNode *n = push_array(scratch.arena, W32_DMN_EntityNode, 1); SLLQueuePush(first_ran_thread, last_ran_thread, n); n->v = thread; switch(resume_result) @@ -1732,7 +1712,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // DWORD resume_code = DBG_CONTINUE; { - if(dmn_w32_shared->exception_not_handled && !ctrls->ignore_previous_exception) + if(w32_dmn_shared->exception_not_handled && !ctrls->ignore_previous_exception) { log_infof("using DBG_EXCEPTION_NOT_HANDLED\n"); resume_code = DBG_EXCEPTION_NOT_HANDLED; @@ -1741,7 +1721,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { log_infof("using DBG_CONTINUE\n"); } - dmn_w32_shared->exception_not_handled = 0; + w32_dmn_shared->exception_not_handled = 0; } //////////////////////// @@ -1752,14 +1732,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) ProfScope("inform windows that we're resuming, run, & obtain next debug event") { B32 resume_good = 1; - if(dmn_w32_shared->resume_needed) + if(w32_dmn_shared->resume_needed) { - dmn_w32_shared->resume_needed = 0; - resume_good = !!ContinueDebugEvent(dmn_w32_shared->resume_pid, dmn_w32_shared->resume_tid, resume_code); + w32_dmn_shared->resume_needed = 0; + resume_good = !!ContinueDebugEvent(w32_dmn_shared->resume_pid, w32_dmn_shared->resume_tid, resume_code); DWORD error = GetLastError(); - dmn_w32_shared->resume_needed = 0; - dmn_w32_shared->resume_tid = 0; - dmn_w32_shared->resume_pid = 0; + w32_dmn_shared->resume_needed = 0; + w32_dmn_shared->resume_tid = 0; + w32_dmn_shared->resume_pid = 0; } if(resume_good) { @@ -1771,9 +1751,9 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) evt_good = !!WaitForDebugEvent(&evt, wait_ms); if(evt_good) { - dmn_w32_shared->resume_needed = 1; - dmn_w32_shared->resume_pid = evt.dwProcessId; - dmn_w32_shared->resume_tid = evt.dwThreadId; + w32_dmn_shared->resume_needed = 1; + w32_dmn_shared->resume_pid = evt.dwProcessId; + w32_dmn_shared->resume_tid = evt.dwThreadId; } else { @@ -1802,7 +1782,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case CREATE_PROCESS_DEBUG_EVENT: { // rjf: zero out "process pending" state - dmn_w32_shared->new_process_pending = 0; + w32_dmn_shared->new_process_pending = 0; // rjf: unpack event HANDLE process_handle = evt.u.CreateProcessInfo.hProcess; @@ -1812,12 +1792,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage; U64 module_name_vaddr = (U64)evt.u.CreateProcessInfo.lpImageName; B32 module_name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0); - DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process_handle, module_base); + W32_DMN_ImageInfo image_info = w32_dmn_image_info_from_process_base_vaddr(process_handle, module_base); // rjf: create entities (thread/module are implied for initial - they are not reported by win32) - DMN_W32_Entity *process = dmn_w32_entity_alloc(dmn_w32_shared->entities_base, DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); + W32_DMN_Entity *process = w32_dmn_entity_alloc(w32_dmn_shared->entities_base, W32_DMN_EntityKind_Process, evt.dwProcessId); + W32_DMN_Entity *thread = w32_dmn_entity_alloc(process, W32_DMN_EntityKind_Thread, evt.dwThreadId); + W32_DMN_Entity *module = w32_dmn_entity_alloc(process, W32_DMN_EntityKind_Module, module_base); { process->handle = process_handle; process->arch = image_info.arch; @@ -1837,12 +1817,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: set up per-process injected code (to run halter threads on & // generate debug events) { - U8 injection_code[DMN_W32_INJECTED_CODE_SIZE]; - MemorySet(injection_code, 0xCC, DMN_W32_INJECTED_CODE_SIZE); + U8 injection_code[W32_DMN_INJECTED_CODE_SIZE]; + MemorySet(injection_code, 0xCC, W32_DMN_INJECTED_CODE_SIZE); injection_code[0] = 0xC3; - U64 injection_size = DMN_W32_INJECTED_CODE_SIZE + sizeof(DMN_W32_InjectedBreak); + U64 injection_size = W32_DMN_INJECTED_CODE_SIZE + sizeof(W32_DMN_InjectedBreak); U64 injection_address = (U64)VirtualAllocEx(process_handle, 0, injection_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE); - dmn_w32_process_write(process_handle, r1u64(injection_address, injection_address+sizeof(injection_code)), injection_code); + w32_dmn_process_write(process_handle, r1u64(injection_address, injection_address+sizeof(injection_code)), injection_code); process->proc.injection_address = injection_address; } @@ -1852,7 +1832,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_CreateProcess; - e->process = dmn_w32_handle_from_entity(process); + e->process = w32_dmn_handle_from_entity(process); e->arch = image_info.arch; e->code = evt.dwProcessId; e->tls_model = DMN_TlsModel_WinodwsNt; @@ -1862,8 +1842,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_CreateThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(thread); e->arch = image_info.arch; e->code = evt.dwThreadId; } @@ -1872,12 +1852,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_LoadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); + e->process = w32_dmn_handle_from_entity(process); + e->module = w32_dmn_handle_from_entity(module); e->arch = image_info.arch; e->address = module_base; e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module); + e->string = w32_dmn_full_path_from_module(arena, module); e->tls_index = image_info.tls_index; } } @@ -1888,37 +1868,37 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // case EXIT_PROCESS_DEBUG_EVENT: { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + W32_DMN_Entity *process = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Process, evt.dwProcessId); // rjf: if this was the process we were going to resume, then we will // just not resume, and wait for another debug event - if(evt.dwProcessId == dmn_w32_shared->resume_pid) + if(evt.dwProcessId == w32_dmn_shared->resume_pid) { - dmn_w32_shared->resume_needed = 0; - dmn_w32_shared->resume_tid = 0; - dmn_w32_shared->resume_pid = 0; + w32_dmn_shared->resume_needed = 0; + w32_dmn_shared->resume_tid = 0; + w32_dmn_shared->resume_pid = 0; } // rjf: generate events for children - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + for(W32_DMN_Entity *child = process->first; child != &w32_dmn_entity_nil; child = child->next) { switch(child->kind) { default:{}break; - case DMN_W32_EntityKind_Thread: + case W32_DMN_EntityKind_Thread: { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(child); + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(child); }break; - case DMN_W32_EntityKind_Module: + case W32_DMN_EntityKind_Module: { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(child); - e->string = dmn_w32_full_path_from_module(arena, child); + e->process = w32_dmn_handle_from_entity(process); + e->module = w32_dmn_handle_from_entity(child); + e->string = w32_dmn_full_path_from_module(arena, child); }break; } } @@ -1927,12 +1907,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_w32_handle_from_entity(process); + e->process = w32_dmn_handle_from_entity(process); e->code = evt.u.ExitProcess.dwExitCode; } // rjf: release entity storage - dmn_w32_entity_release(process); + w32_dmn_entity_release(process); // rjf: detach DebugActiveProcessStop(evt.dwProcessId); @@ -1943,10 +1923,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // case CREATE_THREAD_DEBUG_EVENT: { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + W32_DMN_Entity *process = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Process, evt.dwProcessId); // rjf: create thread entity - DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId); + W32_DMN_Entity *thread = w32_dmn_entity_alloc(process, W32_DMN_EntityKind_Thread, evt.dwThreadId); { thread->handle = evt.u.CreateThread.hThread; thread->arch = process->arch; @@ -1959,10 +1939,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: unpack thread name String8 thread_name = {0}; - if(dmn_w32_GetThreadDescription != 0) + if(w32_dmn_GetThreadDescription != 0) { WCHAR *thread_name_w = 0; - HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); + HRESULT hr = w32_dmn_GetThreadDescription(thread->handle, &thread_name_w); if(SUCCEEDED(hr)) { thread_name = str8_from_16(arena, str16_cstring((U16 *)thread_name_w)); @@ -1971,15 +1951,15 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } // rjf: determine if this is a "halter thread" - the threads we spawn to halt processes - B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); + B32 is_halter = (evt.dwThreadId == w32_dmn_shared->halter_tid); // rjf: generate events for non-halter threads if(!is_halter) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_CreateThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(thread); e->arch = thread->arch; e->code = evt.dwThreadId; e->string = thread_name; @@ -1991,19 +1971,19 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // case EXIT_THREAD_DEBUG_EVENT: { - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *process = thread->parent; + W32_DMN_Entity *thread = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Thread, evt.dwThreadId); + W32_DMN_Entity *process = thread->parent; // rjf: determine if this is the halter thread - B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid); + B32 is_halter = (evt.dwThreadId == w32_dmn_shared->halter_tid); // rjf: generate a halt event if this thread is the halter if(is_halter) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_Halt; - dmn_w32_shared->halter_process = dmn_handle_zero(); - dmn_w32_shared->halter_tid = 0; + w32_dmn_shared->halter_process = dmn_handle_zero(); + w32_dmn_shared->halter_tid = 0; keep_going = 0; } @@ -2012,13 +1992,13 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(thread); e->code = evt.u.ExitThread.dwExitCode; } // rjf: release entity storage - dmn_w32_entity_release(thread); + w32_dmn_entity_release(thread); }break; ////////////////////// @@ -2026,14 +2006,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // case LOAD_DLL_DEBUG_EVENT: { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + W32_DMN_Entity *process = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Process, evt.dwProcessId); // rjf: extract image info U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll; - DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process->handle, module_base); + W32_DMN_ImageInfo image_info = w32_dmn_image_info_from_process_base_vaddr(process->handle, module_base); // rjf: create module entity - DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base); + W32_DMN_Entity *module = w32_dmn_entity_alloc(process, W32_DMN_EntityKind_Module, module_base); { module->handle = evt.u.LoadDll.hFile; module->arch = image_info.arch; @@ -2046,12 +2026,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_LoadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); + e->process = w32_dmn_handle_from_entity(process); + e->module = w32_dmn_handle_from_entity(module); e->arch = module->arch; e->address = module_base; e->size = image_info.size; - e->string = dmn_w32_full_path_from_module(arena, module); + e->string = w32_dmn_full_path_from_module(arena, module); e->tls_index = image_info.tls_index; } }break; @@ -2062,20 +2042,20 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case UNLOAD_DLL_DEBUG_EVENT: { U64 module_base = (U64)evt.u.UnloadDll.lpBaseOfDll; - DMN_W32_Entity *module = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Module, module_base); - DMN_W32_Entity *process = module->parent; + W32_DMN_Entity *module = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Module, module_base); + W32_DMN_Entity *process = module->parent; // rjf: generate event { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(module); - e->string = dmn_w32_full_path_from_module(arena, module); + e->process = w32_dmn_handle_from_entity(process); + e->module = w32_dmn_handle_from_entity(module); + e->string = w32_dmn_full_path_from_module(arena, module); } // rjf: release entity storage - dmn_w32_entity_release(module); + w32_dmn_entity_release(module); }break; ////////////////////// @@ -2125,8 +2105,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // 64-bit version. We only currently handle the 64-bit version. //- rjf: unpack - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); - DMN_W32_Entity *process = thread->parent; + W32_DMN_Entity *thread = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Thread, evt.dwThreadId); + W32_DMN_Entity *process = thread->parent; EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception; EXCEPTION_RECORD *exception = &edi->ExceptionRecord; U64 instruction_pointer = (U64)exception->ExceptionAddress; @@ -2134,7 +2114,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //- rjf: determine if this is the first breakpoint in a process // (breakpoint notifying us that the debugger is attached) B32 first_bp = 0; - if(!process->proc.did_first_bp && exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT) + if(!process->proc.did_first_bp && exception->ExceptionCode == W32_DMN_EXCEPTION_BREAKPOINT) { process->proc.did_first_bp = 1; first_bp = 1; @@ -2142,8 +2122,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //- rjf: determine if this exception is a trap B32 is_trap = (!first_bp && - (exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT || - exception->ExceptionCode == DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN)); + (exception->ExceptionCode == W32_DMN_EXCEPTION_BREAKPOINT || + exception->ExceptionCode == W32_DMN_EXCEPTION_STACK_BUFFER_OVERRUN)); //- rjf: check if this trap is a usage-code-specified trap or something else B32 hit_user_trap = 0; @@ -2154,7 +2134,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { for(U64 idx = 0; idx < n->count; idx += 1) { - if(dmn_handle_match(n->v[idx].process, dmn_w32_handle_from_entity(process)) && n->v[idx].vaddr == instruction_pointer) + if(dmn_handle_match(n->v[idx].process, w32_dmn_handle_from_entity(process)) && n->v[idx].vaddr == instruction_pointer) { hit_user_trap = 1; user_trap_id = n->v[idx].id; @@ -2169,7 +2149,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(is_trap && !hit_user_trap) { U8 instruction_byte = 0; - if(dmn_w32_process_read_struct(process->handle, instruction_pointer, &instruction_byte)) + if(w32_dmn_process_read_struct(process->handle, instruction_pointer, &instruction_byte)) { hit_explicit_trap = (instruction_byte == 0xCC || instruction_byte == 0xCD); } @@ -2190,10 +2170,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) ARCH_Info *arch_info = arch_info_from_arch(thread->arch); U64 regs_block_size = arch_info->reg_block_size; void *regs_block = push_array(scratch.arena, U8, regs_block_size); - if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block)) + if(w32_dmn_thread_read_reg_block(thread->arch, thread->handle, regs_block)) { arch_reg_block_write_ip(arch_info, regs_block, instruction_pointer); - dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block); + w32_dmn_thread_write_reg_block(thread->arch, thread->handle, regs_block); } temp_end(temp); }break; @@ -2202,7 +2182,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case Arch_x64: { CONTEXT *ctx = 0; - U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; + U32 ctx_flags = W32_DMN_CTX_X64|W32_DMN_CTX_INTEL_CONTROL; DWORD size = 0; InitializeContext(0, ctx_flags, 0, &size); if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) @@ -2241,8 +2221,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: fill top-level info DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_Exception; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(thread); e->code = exception->ExceptionCode; e->flags = exception->ExceptionFlags; e->instruction_pointer = (U64)exception->ExceptionAddress; @@ -2252,7 +2232,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) switch(exception->ExceptionCode) { //- rjf: fill breakpoint event info - case DMN_W32_EXCEPTION_BREAKPOINT: + case W32_DMN_EXCEPTION_BREAKPOINT: { DMN_EventKind report_event_kind = DMN_EventKind_Trap; if(first_bp) @@ -2267,10 +2247,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; //- rjf: fill stack buffer overrun event info - case DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN: + case W32_DMN_EXCEPTION_STACK_BUFFER_OVERRUN: { e->kind = DMN_EventKind_Trap; - if(exception->ExceptionInformation[0] == DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS) + if(exception->ExceptionInformation[0] == W32_DMN_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS) { // TODO(rjf): this is a shadow stack violation - this can imply that the spoof was hit. // need to handle this correctly in the ctrl layer when stepping w/ a spoof set. @@ -2280,7 +2260,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; //- rjf: fill single-step event info - case DMN_W32_EXCEPTION_SINGLE_STEP: + case W32_DMN_EXCEPTION_SINGLE_STEP: { e->kind = DMN_EventKind_SingleStep; @@ -2298,7 +2278,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case Arch_x64: { X64_RegBlock regs = {0}; - dmn_w32_thread_read_reg_block(thread->arch, thread->handle, ®s); + w32_dmn_thread_read_reg_block(thread->arch, thread->handle, ®s); if(regs.dr6 & 0xF) { e->kind = DMN_EventKind_Breakpoint; @@ -2312,11 +2292,11 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } // rjf: find the flagged trap task for this thread's process - DMN_W32_Entity *process = thread->parent; + W32_DMN_Entity *process = thread->parent; DMN_FlaggedTrapTask *task = 0; for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) { - if(dmn_handle_match(t->process, dmn_w32_handle_from_entity(process))) + if(dmn_handle_match(t->process, w32_dmn_handle_from_entity(process))) { task = t; break; @@ -2351,7 +2331,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; //- rjf: fill throw info - case DMN_W32_EXCEPTION_THROW: + case W32_DMN_EXCEPTION_THROW: { U64 exception_sp = 0; U64 exception_ip = 0; @@ -2363,12 +2343,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) e->stack_pointer = exception_sp; e->exception_kind = DMN_ExceptionKind_CppThrow; e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + w32_dmn_shared->exception_not_handled = (edi->dwFirstChance != 0); }break; //- rjf: fill access violation info - case DMN_W32_EXCEPTION_ACCESS_VIOLATION: - case DMN_W32_EXCEPTION_IN_PAGE_ERROR: + case W32_DMN_EXCEPTION_ACCESS_VIOLATION: + case W32_DMN_EXCEPTION_IN_PAGE_ERROR: { U64 exception_address = 0; DMN_ExceptionKind exception_kind = DMN_ExceptionKind_Null; @@ -2385,15 +2365,15 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) e->address = exception_address; e->exception_kind = exception_kind; e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + w32_dmn_shared->exception_not_handled = (edi->dwFirstChance != 0); }break; //- rjf: fill set-thread-name info - case DMN_W32_EXCEPTION_SET_THREAD_NAME: + case W32_DMN_EXCEPTION_SET_THREAD_NAME: if(exception->NumberParameters >= 2) { U64 thread_name_address = exception->ExceptionInformation[1]; - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); + W32_DMN_Entity *process = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Process, evt.dwProcessId); String8List thread_name_strings = {0}; { U64 read_addr = thread_name_address; @@ -2401,7 +2381,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) for(;total_string_size < KB(4);) { U8 *buffer = push_array(scratch.arena, U8, 256); - B32 good_read = dmn_w32_process_read(process->handle, r1u64(read_addr, read_addr+256), buffer); + B32 good_read = w32_dmn_process_read(process->handle, r1u64(read_addr, read_addr+256), buffer); if(good_read) { U64 size = 256; @@ -2437,7 +2417,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; //- rjf: fill set-thread-color info - case DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR: + case W32_DMN_EXCEPTION_RADDBG_SET_THREAD_COLOR: { e->kind = DMN_EventKind_SetThreadColor; e->code = exception->ExceptionInformation[0]; @@ -2445,7 +2425,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; //- rjf: fill set-data-breakpoint info - case DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT: + case W32_DMN_EXCEPTION_RADDBG_SET_BREAKPOINT: { U64 vaddr = exception->ExceptionInformation[0]; U64 size = exception->ExceptionInformation[1]; @@ -2462,14 +2442,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) }break; //- rjf: fill set-vaddr-range-note info - case DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE: + case W32_DMN_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE: { U64 vaddr = exception->ExceptionInformation[0]; U64 size = exception->ExceptionInformation[1]; U64 name_vaddr = exception->ExceptionInformation[2]; U64 name_size = exception->ExceptionInformation[3]; U8 *name_buffer = push_array(arena, U8, name_size); - dmn_w32_process_read(process->handle, r1u64(name_vaddr, name_vaddr+name_size), name_buffer), + w32_dmn_process_read(process->handle, r1u64(name_vaddr, name_vaddr+name_size), name_buffer), e->kind = DMN_EventKind_SetVAddrRangeNote; e->address = vaddr; e->size = size; @@ -2480,7 +2460,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) default: { e->exception_repeated = (edi->dwFirstChance == 0); - dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0); + w32_dmn_shared->exception_not_handled = (edi->dwFirstChance != 0); }break; } } @@ -2492,14 +2472,14 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case OUTPUT_DEBUG_STRING_EVENT: { // rjf: unpack event - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + W32_DMN_Entity *process = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Process, evt.dwProcessId); + W32_DMN_Entity *thread = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Thread, evt.dwThreadId); U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; // rjf: read memory U8 *buffer = push_array_no_zero(scratch.arena, U8, string_size + 1); - dmn_w32_process_read(process->handle, r1u64(string_address, string_address+string_size), buffer); + w32_dmn_process_read(process->handle, r1u64(string_address, string_address+string_size), buffer); buffer[string_size] = 0; // rjf: extract into string @@ -2529,12 +2509,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // case RIP_EVENT: { - DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId); - DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId); + W32_DMN_Entity *process = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Process, evt.dwProcessId); + W32_DMN_Entity *thread = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Thread, evt.dwThreadId); DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_Exception; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(thread); }break; ////////////////////// @@ -2570,10 +2550,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // ProfScope("suspend threads which ran") { - for(DMN_W32_EntityNode *n = first_ran_thread; n != 0; n = n->next) + for(W32_DMN_EntityNode *n = first_ran_thread; n != 0; n = n->next) { - DMN_W32_Entity *thread = n->v; - if(thread->kind != DMN_W32_EntityKind_Thread) + W32_DMN_Entity *thread = n->v; + if(thread->kind != W32_DMN_EntityKind_Thread) { continue; } @@ -2608,38 +2588,38 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //////////////////////// //- rjf: gather new thread-names // - ProfScope("gather new thread names") if(dmn_w32_GetThreadDescription != 0) + ProfScope("gather new thread names") if(w32_dmn_GetThreadDescription != 0) { - for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != &dmn_w32_entity_nil; + for(W32_DMN_Entity *process = w32_dmn_shared->entities_base->first; + process != &w32_dmn_entity_nil; process = process->next) { - if(process->kind != DMN_W32_EntityKind_Process) { continue; } - for(DMN_W32_Entity *thread = process->first; - thread != &dmn_w32_entity_nil; + if(process->kind != W32_DMN_EntityKind_Process) { continue; } + for(W32_DMN_Entity *thread = process->first; + thread != &w32_dmn_entity_nil; thread = thread->next) { - if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } + if(thread->kind != W32_DMN_EntityKind_Thread) { continue; } if(thread->thread.last_name_hash == 0 || thread->thread.name_gather_time_us+1000000 <= now_time_us()) { String8 name = {0}; { WCHAR *thread_name_w = 0; - HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w); + HRESULT hr = w32_dmn_GetThreadDescription(thread->handle, &thread_name_w); if(SUCCEEDED(hr)) { name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w)); LocalFree(thread_name_w); } } - U64 name_hash = dmn_w32_hash_from_string(name); + U64 name_hash = u64_hash_from_str8(name); if(name.size != 0 && name_hash != thread->thread.last_name_hash) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_SetThreadName; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(thread); + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(thread); e->string = push_str8_copy(arena, name); } thread->thread.name_gather_time_us = now_time_us(); @@ -2680,12 +2660,12 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next) { DMN_Handle process = t->process; - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); - for(DMN_W32_Entity *child = process_entity->first; - child != &dmn_w32_entity_nil; + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); + for(W32_DMN_Entity *child = process_entity->first; + child != &w32_dmn_entity_nil; child = child->next) { - if(child->kind == DMN_W32_EntityKind_Thread) + if(child->kind == W32_DMN_EntityKind_Thread) { switch(child->arch) { @@ -2695,9 +2675,9 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) case Arch_x64: { X64_RegBlock regs = {0}; - dmn_w32_thread_read_reg_block(child->arch, child->handle, ®s); + w32_dmn_thread_read_reg_block(child->arch, child->handle, ®s); regs.dr7 = 0; - dmn_w32_thread_write_reg_block(child->arch, child->handle, ®s); + w32_dmn_thread_write_reg_block(child->arch, child->handle, ®s); }break; } } @@ -2710,7 +2690,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("unset single step bit") { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); + W32_DMN_Entity *thread = w32_dmn_entity_from_handle(ctrls->single_step_thread); Arch arch = thread->arch; switch(arch) { @@ -2746,34 +2726,34 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) //////////////////////////// //- rjf: produce debug events from queued up detached processes // - case DMN_W32_EventGenPath_DetachProcesses: + case W32_DMN_EventGenPath_DetachProcesses: { - for(DMN_HandleNode *n = dmn_w32_shared->detach_processes.first; n != 0; n = n->next) + for(DMN_HandleNode *n = w32_dmn_shared->detach_processes.first; n != 0; n = n->next) { - DMN_W32_Entity *process = dmn_w32_entity_from_handle(n->v); + W32_DMN_Entity *process = w32_dmn_entity_from_handle(n->v); // rjf: push exit thread events - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + for(W32_DMN_Entity *child = process->first; child != &w32_dmn_entity_nil; child = child->next) { - if(child->kind == DMN_W32_EntityKind_Thread) + if(child->kind == W32_DMN_EntityKind_Thread) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_ExitThread; - e->process = dmn_w32_handle_from_entity(process); - e->thread = dmn_w32_handle_from_entity(child); + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(child); } } // rjf: push unload module events - for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next) + for(W32_DMN_Entity *child = process->first; child != &w32_dmn_entity_nil; child = child->next) { - if(child->kind == DMN_W32_EntityKind_Module) + if(child->kind == W32_DMN_EntityKind_Module) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_UnloadModule; - e->process = dmn_w32_handle_from_entity(process); - e->module = dmn_w32_handle_from_entity(child); - e->string = dmn_w32_full_path_from_module(arena, child); + e->process = w32_dmn_handle_from_entity(process); + e->module = w32_dmn_handle_from_entity(child); + e->string = w32_dmn_full_path_from_module(arena, child); } } @@ -2781,16 +2761,16 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_ExitProcess; - e->process = dmn_w32_handle_from_entity(process); + e->process = w32_dmn_handle_from_entity(process); } // rjf: free process - dmn_w32_entity_release(process); + w32_dmn_entity_release(process); } // rjf: reset queued up detached processes - MemoryZeroStruct(&dmn_w32_shared->detach_processes); - arena_clear(dmn_w32_shared->detach_arena); + MemoryZeroStruct(&w32_dmn_shared->detach_processes); + arena_clear(w32_dmn_shared->detach_arena); }break; } @@ -2804,26 +2784,26 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) internal void dmn_halt(U64 code, U64 user_data) { - if(dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) + if(dmn_handle_match(dmn_handle_zero(), w32_dmn_shared->halter_process)) { - DMN_W32_Entity *process = &dmn_w32_entity_nil; - for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first; - entity != &dmn_w32_entity_nil; + W32_DMN_Entity *process = &w32_dmn_entity_nil; + for(W32_DMN_Entity *entity = w32_dmn_shared->entities_base->first; + entity != &w32_dmn_entity_nil; entity = entity->next) { - if(entity->kind == DMN_W32_EntityKind_Process) + if(entity->kind == W32_DMN_EntityKind_Process) { process = entity; break; } } - if(process != &dmn_w32_entity_nil) + if(process != &w32_dmn_entity_nil) { - dmn_w32_shared->halter_process = dmn_w32_handle_from_entity(process); - DMN_W32_InjectedBreak injection = {code, user_data}; - U64 data_injection_address = process->proc.injection_address + DMN_W32_INJECTED_CODE_SIZE; - dmn_w32_process_write_struct(process->handle, data_injection_address, &injection); - dmn_w32_shared->halter_tid = dmn_w32_inject_thread(process->handle, process->proc.injection_address); + w32_dmn_shared->halter_process = w32_dmn_handle_from_entity(process); + W32_DMN_InjectedBreak injection = {code, user_data}; + U64 data_injection_address = process->proc.injection_address + W32_DMN_INJECTED_CODE_SIZE; + w32_dmn_process_write_struct(process->handle, data_injection_address, &injection); + w32_dmn_shared->halter_tid = w32_dmn_inject_thread(process->handle, process->proc.injection_address); } } } @@ -2837,14 +2817,14 @@ internal B32 dmn_access_open(void) { B32 result = 0; - if(dmn_w32_ctrl_thread) + if(w32_dmn_ctrl_thread) { result = 1; } else { - mutex_take(dmn_w32_shared->access_mutex); - result = !dmn_w32_shared->access_run_state; + mutex_take(w32_dmn_shared->access_mutex); + result = !w32_dmn_shared->access_run_state; } return result; } @@ -2852,9 +2832,9 @@ dmn_access_open(void) internal void dmn_access_close(void) { - if(!dmn_w32_ctrl_thread) + if(!w32_dmn_ctrl_thread) { - mutex_drop(dmn_w32_shared->access_mutex); + mutex_drop(w32_dmn_shared->access_mutex); } } @@ -2866,7 +2846,7 @@ dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size) U64 result = 0; DMN_AccessScope { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); result = (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_RESERVE, PAGE_READWRITE); if(result == 0) { @@ -2881,7 +2861,7 @@ dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size) { DMN_AccessScope { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_COMMIT, PAGE_READWRITE); } } @@ -2891,7 +2871,7 @@ dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size) { DMN_AccessScope { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); VirtualFreeEx(process_entity->handle, (void *)vaddr, size, MEM_DECOMMIT); } } @@ -2901,7 +2881,7 @@ dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size) { DMN_AccessScope { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); VirtualFreeEx(process_entity->handle, (void *)vaddr, 0, MEM_RELEASE); } } @@ -2911,7 +2891,7 @@ dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, AccessFlags { DMN_AccessScope { - DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process); + W32_DMN_Entity *process_entity = w32_dmn_entity_from_handle(process); DWORD old_flags = 0; DWORD new_flags = PAGE_NOACCESS; switch(flags) @@ -2933,8 +2913,8 @@ dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst) U64 result = 0; DMN_AccessScope { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); - result = dmn_w32_process_read(entity->handle, range, dst); + W32_DMN_Entity *entity = w32_dmn_entity_from_handle(process); + result = w32_dmn_process_read(entity->handle, range, dst); } return result; } @@ -2945,8 +2925,8 @@ dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) B32 result = 0; DMN_AccessScope { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process); - result = dmn_w32_process_write(entity->handle, range, src); + W32_DMN_Entity *entity = w32_dmn_entity_from_handle(process); + result = w32_dmn_process_write(entity->handle, range, src); } return result; } @@ -2959,7 +2939,7 @@ dmn_arch_from_thread(DMN_Handle handle) Arch arch = Arch_Null; DMN_AccessScope { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); + W32_DMN_Entity *entity = w32_dmn_entity_from_handle(handle); arch = entity->arch; } return arch; @@ -2971,10 +2951,10 @@ dmn_stack_base_vaddr_from_thread(DMN_Handle handle) U64 result = 0; DMN_AccessScope { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - if(thread->kind == DMN_W32_EntityKind_Thread) + W32_DMN_Entity *thread = w32_dmn_entity_from_handle(handle); + if(thread->kind == W32_DMN_EntityKind_Thread) { - DMN_W32_Entity *process = thread->parent; + W32_DMN_Entity *process = thread->parent; U64 tlb = thread->thread.thread_local_base; switch(thread->arch) { @@ -2988,7 +2968,7 @@ dmn_stack_base_vaddr_from_thread(DMN_Handle handle) case Arch_x64: { U64 stack_base_addr = tlb + 0x8; - dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); + w32_dmn_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); }break; } } @@ -3002,8 +2982,8 @@ dmn_tls_root_vaddr_from_thread(DMN_Handle handle) U64 result = 0; DMN_AccessScope { - DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); - if(entity->kind == DMN_W32_EntityKind_Thread) + W32_DMN_Entity *entity = w32_dmn_entity_from_handle(handle); + if(entity->kind == W32_DMN_EntityKind_Thread) { result = entity->thread.thread_local_base; switch(entity->arch) @@ -3031,8 +3011,8 @@ dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) B32 result = 0; DMN_AccessScope { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block); + W32_DMN_Entity *thread = w32_dmn_entity_from_handle(handle); + result = w32_dmn_thread_read_reg_block(thread->arch, thread->handle, reg_block); } return result; } @@ -3043,8 +3023,8 @@ dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) B32 result = 0; DMN_AccessScope { - DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle); - result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block); + W32_DMN_Entity *thread = w32_dmn_entity_from_handle(handle); + result = w32_dmn_thread_write_reg_block(thread->arch, thread->handle, reg_block); } return result; } diff --git a/src/win32/demon/win32_demon.h b/src/win32/demon/win32_demon.h index 58e7dbc7..3bf51ff5 100644 --- a/src/win32/demon/win32_demon.h +++ b/src/win32/demon/win32_demon.h @@ -1,8 +1,8 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef DEMON_CORE_WIN32_H -#define DEMON_CORE_WIN32_H +#ifndef WIN32_DEMON_H +#define WIN32_DEMON_H //////////////////////////////// //~ rjf: Windows Includes @@ -15,173 +15,173 @@ //////////////////////////////// //~ rjf: Win32 Exception Codes -#define DMN_W32_EXCEPTION_BREAKPOINT 0x80000003u -#define DMN_W32_EXCEPTION_SINGLE_STEP 0x80000004u -#define DMN_W32_EXCEPTION_LONG_JUMP 0x80000026u -#define DMN_W32_EXCEPTION_ACCESS_VIOLATION 0xC0000005u -#define DMN_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu -#define DMN_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u -#define DMN_W32_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u -#define DMN_W32_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du -#define DMN_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu -#define DMN_W32_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu -#define DMN_W32_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u -#define DMN_W32_EXCEPTION_FLT_OVERFLOW 0xC0000091u -#define DMN_W32_EXCEPTION_FLT_STACK_CHECK 0xC0000092u -#define DMN_W32_EXCEPTION_FLT_UNDERFLOW 0xC0000093u -#define DMN_W32_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u -#define DMN_W32_EXCEPTION_INT_OVERFLOW 0xC0000095u -#define DMN_W32_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u -#define DMN_W32_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du -#define DMN_W32_EXCEPTION_IN_PAGE_ERROR 0xC0000006u -#define DMN_W32_EXCEPTION_INVALID_DISPOSITION 0xC0000026u -#define DMN_W32_EXCEPTION_NONCONTINUABLE 0xC0000025u -#define DMN_W32_EXCEPTION_STACK_OVERFLOW 0xC00000FDu -#define DMN_W32_EXCEPTION_INVALID_HANDLE 0xC0000008u -#define DMN_W32_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u -#define DMN_W32_EXCEPTION_DLL_NOT_FOUND 0xC0000135u -#define DMN_W32_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u -#define DMN_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u -#define DMN_W32_EXCEPTION_DLL_INIT_FAILED 0xC0000142u -#define DMN_W32_EXCEPTION_CONTROL_C_EXIT 0xC000013Au -#define DMN_W32_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u -#define DMN_W32_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u -#define DMN_W32_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u -#define DMN_W32_EXCEPTION_HEAP_CORRUPTION 0xC0000374u -#define DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u -#define DMN_W32_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u -#define DMN_W32_EXCEPTION_ASSERT_FAILURE 0xC0000420u -#define DMN_W32_EXCEPTION_NO_MEMORY 0xC0000017u -#define DMN_W32_EXCEPTION_THROW 0xE06D7363u -#define DMN_W32_EXCEPTION_SET_THREAD_NAME 0x406d1388u +#define W32_DMN_EXCEPTION_BREAKPOINT 0x80000003u +#define W32_DMN_EXCEPTION_SINGLE_STEP 0x80000004u +#define W32_DMN_EXCEPTION_LONG_JUMP 0x80000026u +#define W32_DMN_EXCEPTION_ACCESS_VIOLATION 0xC0000005u +#define W32_DMN_EXCEPTION_ARRAY_BOUNDS_EXCEEDED 0xC000008Cu +#define W32_DMN_EXCEPTION_DATA_TYPE_MISALIGNMENT 0x80000002u +#define W32_DMN_EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001u +#define W32_DMN_EXCEPTION_FLT_DENORMAL_OPERAND 0xC000008Du +#define W32_DMN_EXCEPTION_FLT_DEVIDE_BY_ZERO 0xC000008Eu +#define W32_DMN_EXCEPTION_FLT_INEXACT_RESULT 0xC000008Fu +#define W32_DMN_EXCEPTION_FLT_INVALID_OPERATION 0xC0000090u +#define W32_DMN_EXCEPTION_FLT_OVERFLOW 0xC0000091u +#define W32_DMN_EXCEPTION_FLT_STACK_CHECK 0xC0000092u +#define W32_DMN_EXCEPTION_FLT_UNDERFLOW 0xC0000093u +#define W32_DMN_EXCEPTION_INT_DIVIDE_BY_ZERO 0xC0000094u +#define W32_DMN_EXCEPTION_INT_OVERFLOW 0xC0000095u +#define W32_DMN_EXCEPTION_PRIVILEGED_INSTRUCTION 0xC0000096u +#define W32_DMN_EXCEPTION_ILLEGAL_INSTRUCTION 0xC000001Du +#define W32_DMN_EXCEPTION_IN_PAGE_ERROR 0xC0000006u +#define W32_DMN_EXCEPTION_INVALID_DISPOSITION 0xC0000026u +#define W32_DMN_EXCEPTION_NONCONTINUABLE 0xC0000025u +#define W32_DMN_EXCEPTION_STACK_OVERFLOW 0xC00000FDu +#define W32_DMN_EXCEPTION_INVALID_HANDLE 0xC0000008u +#define W32_DMN_EXCEPTION_UNWIND_CONSOLIDATE 0x80000029u +#define W32_DMN_EXCEPTION_DLL_NOT_FOUND 0xC0000135u +#define W32_DMN_EXCEPTION_ORDINAL_NOT_FOUND 0xC0000138u +#define W32_DMN_EXCEPTION_ENTRY_POINT_NOT_FOUND 0xC0000139u +#define W32_DMN_EXCEPTION_DLL_INIT_FAILED 0xC0000142u +#define W32_DMN_EXCEPTION_CONTROL_C_EXIT 0xC000013Au +#define W32_DMN_EXCEPTION_FLT_MULTIPLE_FAULTS 0xC00002B4u +#define W32_DMN_EXCEPTION_FLT_MULTIPLE_TRAPS 0xC00002B5u +#define W32_DMN_EXCEPTION_NAT_CONSUMPTION 0xC00002C9u +#define W32_DMN_EXCEPTION_HEAP_CORRUPTION 0xC0000374u +#define W32_DMN_EXCEPTION_STACK_BUFFER_OVERRUN 0xC0000409u +#define W32_DMN_EXCEPTION_INVALID_CRUNTIME_PARAM 0xC0000417u +#define W32_DMN_EXCEPTION_ASSERT_FAILURE 0xC0000420u +#define W32_DMN_EXCEPTION_NO_MEMORY 0xC0000017u +#define W32_DMN_EXCEPTION_THROW 0xE06D7363u +#define W32_DMN_EXCEPTION_SET_THREAD_NAME 0x406d1388u #define DMN_w32_EXCEPTION_CLRDBG_NOTIFICATION 0x04242420u #define DMN_w32_EXCEPTION_CLR 0xE0434352u -#define DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR 0x00524144u -#define DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT 0x00524145u -#define DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE 0x00524156u +#define W32_DMN_EXCEPTION_RADDBG_SET_THREAD_COLOR 0x00524144u +#define W32_DMN_EXCEPTION_RADDBG_SET_BREAKPOINT 0x00524145u +#define W32_DMN_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE 0x00524156u //////////////////////////////// //~ rjf: Win32 Exception ExceptionInformation Codes // -// used as a subcode, apparently in all cases, for DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN. +// used as a subcode, apparently in all cases, for W32_DMN_EXCEPTION_STACK_BUFFER_OVERRUN. // need to somehow pipe this through & interpret it correctly in outer layers... @fastfail -#define DMN_W32_FAST_FAIL_LEGACY_GS_VIOLATION 0 -#define DMN_W32_FAST_FAIL_VTGUARD_CHECK_FAILURE 1 -#define DMN_W32_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2 -#define DMN_W32_FAST_FAIL_CORRUPT_LIST_ENTRY 3 -#define DMN_W32_FAST_FAIL_INCORRECT_STACK 4 -#define DMN_W32_FAST_FAIL_INVALID_ARG 5 -#define DMN_W32_FAST_FAIL_GS_COOKIE_INIT 6 -#define DMN_W32_FAST_FAIL_FATAL_APP_EXIT 7 -#define DMN_W32_FAST_FAIL_RANGE_CHECK_FAILURE 8 -#define DMN_W32_FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9 -#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10 -#define DMN_W32_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11 -#define DMN_W32_FAST_FAIL_INVALID_FIBER_SWITCH 12 -#define DMN_W32_FAST_FAIL_INVALID_SET_OF_CONTEXT 13 -#define DMN_W32_FAST_FAIL_INVALID_REFERENCE_COUNT 14 -#define DMN_W32_FAST_FAIL_INVALID_JUMP_BUFFER 18 -#define DMN_W32_FAST_FAIL_MRDATA_MODIFIED 19 -#define DMN_W32_FAST_FAIL_CERTIFICATION_FAILURE 20 -#define DMN_W32_FAST_FAIL_INVALID_EXCEPTION_CHAIN 21 -#define DMN_W32_FAST_FAIL_CRYPTO_LIBRARY 22 -#define DMN_W32_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23 -#define DMN_W32_FAST_FAIL_INVALID_IMAGE_BASE 24 -#define DMN_W32_FAST_FAIL_DLOAD_PROTECTION_FAILURE 25 -#define DMN_W32_FAST_FAIL_UNSAFE_EXTENSION_CALL 26 -#define DMN_W32_FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27 -#define DMN_W32_FAST_FAIL_INVALID_BUFFER_ACCESS 28 -#define DMN_W32_FAST_FAIL_INVALID_BALANCED_TREE 29 -#define DMN_W32_FAST_FAIL_INVALID_NEXT_THREAD 30 -#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_APCS_DISABLED 32 -#define DMN_W32_FAST_FAIL_INVALID_IDLE_STATE 33 -#define DMN_W32_FAST_FAIL_MRDATA_PROTECTION_FAILURE 34 -#define DMN_W32_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35 -#define DMN_W32_FAST_FAIL_INVALID_LOCK_STATE 36 -#define DMN_W32_FAST_FAIL_GUARD_JUMPTABLE 37 // Known to compiler, must retain value 37 -#define DMN_W32_FAST_FAIL_INVALID_LONGJUMP_TARGET 38 -#define DMN_W32_FAST_FAIL_INVALID_DISPATCH_CONTEXT 39 -#define DMN_W32_FAST_FAIL_INVALID_THREAD 40 -#define DMN_W32_FAST_FAIL_INVALID_SYSCALL_NUMBER 41 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_INVALID_FILE_OPERATION 42 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_LPAC_ACCESS_DENIED 43 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_GUARD_SS_FAILURE 44 -#define DMN_W32_FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46 -#define DMN_W32_FAST_FAIL_INVALID_CONTROL_STACK 47 -#define DMN_W32_FAST_FAIL_SET_CONTEXT_DENIED 48 -#define DMN_W32_FAST_FAIL_INVALID_IAT 49 -#define DMN_W32_FAST_FAIL_HEAP_METADATA_CORRUPTION 50 -#define DMN_W32_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51 -#define DMN_W32_FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_ENCLAVE_CALL_FAILURE 53 -#define DMN_W32_FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54 -#define DMN_W32_FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 // Telemetry, nonfatal -#define DMN_W32_FAST_FAIL_UNEXPECTED_CALL 56 -#define DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57 -#define DMN_W32_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58 -#define DMN_W32_FAST_FAIL_FLAGS_CORRUPTION 59 -#define DMN_W32_FAST_FAIL_VEH_CORRUPTION 60 -#define DMN_W32_FAST_FAIL_ETW_CORRUPTION 61 -#define DMN_W32_FAST_FAIL_RIO_ABORT 62 -#define DMN_W32_FAST_FAIL_INVALID_PFN 63 -#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG 64 -#define DMN_W32_FAST_FAIL_CAST_GUARD 65 // Known to compiler, must retain value 65 -#define DMN_W32_FAST_FAIL_HOST_VISIBILITY_CHANGE 66 -#define DMN_W32_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST 67 -#define DMN_W32_FAST_FAIL_PATCH_CALLBACK_FAILED 68 -#define DMN_W32_FAST_FAIL_NTDLL_PATCH_FAILED 69 -#define DMN_W32_FAST_FAIL_INVALID_FLS_DATA 70 -#define DMN_W32_FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF +#define W32_DMN_FAST_FAIL_LEGACY_GS_VIOLATION 0 +#define W32_DMN_FAST_FAIL_VTGUARD_CHECK_FAILURE 1 +#define W32_DMN_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2 +#define W32_DMN_FAST_FAIL_CORRUPT_LIST_ENTRY 3 +#define W32_DMN_FAST_FAIL_INCORRECT_STACK 4 +#define W32_DMN_FAST_FAIL_INVALID_ARG 5 +#define W32_DMN_FAST_FAIL_GS_COOKIE_INIT 6 +#define W32_DMN_FAST_FAIL_FATAL_APP_EXIT 7 +#define W32_DMN_FAST_FAIL_RANGE_CHECK_FAILURE 8 +#define W32_DMN_FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9 +#define W32_DMN_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10 +#define W32_DMN_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11 +#define W32_DMN_FAST_FAIL_INVALID_FIBER_SWITCH 12 +#define W32_DMN_FAST_FAIL_INVALID_SET_OF_CONTEXT 13 +#define W32_DMN_FAST_FAIL_INVALID_REFERENCE_COUNT 14 +#define W32_DMN_FAST_FAIL_INVALID_JUMP_BUFFER 18 +#define W32_DMN_FAST_FAIL_MRDATA_MODIFIED 19 +#define W32_DMN_FAST_FAIL_CERTIFICATION_FAILURE 20 +#define W32_DMN_FAST_FAIL_INVALID_EXCEPTION_CHAIN 21 +#define W32_DMN_FAST_FAIL_CRYPTO_LIBRARY 22 +#define W32_DMN_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23 +#define W32_DMN_FAST_FAIL_INVALID_IMAGE_BASE 24 +#define W32_DMN_FAST_FAIL_DLOAD_PROTECTION_FAILURE 25 +#define W32_DMN_FAST_FAIL_UNSAFE_EXTENSION_CALL 26 +#define W32_DMN_FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27 +#define W32_DMN_FAST_FAIL_INVALID_BUFFER_ACCESS 28 +#define W32_DMN_FAST_FAIL_INVALID_BALANCED_TREE 29 +#define W32_DMN_FAST_FAIL_INVALID_NEXT_THREAD 30 +#define W32_DMN_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 // Telemetry, nonfatal +#define W32_DMN_FAST_FAIL_APCS_DISABLED 32 +#define W32_DMN_FAST_FAIL_INVALID_IDLE_STATE 33 +#define W32_DMN_FAST_FAIL_MRDATA_PROTECTION_FAILURE 34 +#define W32_DMN_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35 +#define W32_DMN_FAST_FAIL_INVALID_LOCK_STATE 36 +#define W32_DMN_FAST_FAIL_GUARD_JUMPTABLE 37 // Known to compiler, must retain value 37 +#define W32_DMN_FAST_FAIL_INVALID_LONGJUMP_TARGET 38 +#define W32_DMN_FAST_FAIL_INVALID_DISPATCH_CONTEXT 39 +#define W32_DMN_FAST_FAIL_INVALID_THREAD 40 +#define W32_DMN_FAST_FAIL_INVALID_SYSCALL_NUMBER 41 // Telemetry, nonfatal +#define W32_DMN_FAST_FAIL_INVALID_FILE_OPERATION 42 // Telemetry, nonfatal +#define W32_DMN_FAST_FAIL_LPAC_ACCESS_DENIED 43 // Telemetry, nonfatal +#define W32_DMN_FAST_FAIL_GUARD_SS_FAILURE 44 +#define W32_DMN_FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 // Telemetry, nonfatal +#define W32_DMN_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46 +#define W32_DMN_FAST_FAIL_INVALID_CONTROL_STACK 47 +#define W32_DMN_FAST_FAIL_SET_CONTEXT_DENIED 48 +#define W32_DMN_FAST_FAIL_INVALID_IAT 49 +#define W32_DMN_FAST_FAIL_HEAP_METADATA_CORRUPTION 50 +#define W32_DMN_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51 +#define W32_DMN_FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 // Telemetry, nonfatal +#define W32_DMN_FAST_FAIL_ENCLAVE_CALL_FAILURE 53 +#define W32_DMN_FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54 +#define W32_DMN_FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 // Telemetry, nonfatal +#define W32_DMN_FAST_FAIL_UNEXPECTED_CALL 56 +#define W32_DMN_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57 +#define W32_DMN_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58 +#define W32_DMN_FAST_FAIL_FLAGS_CORRUPTION 59 +#define W32_DMN_FAST_FAIL_VEH_CORRUPTION 60 +#define W32_DMN_FAST_FAIL_ETW_CORRUPTION 61 +#define W32_DMN_FAST_FAIL_RIO_ABORT 62 +#define W32_DMN_FAST_FAIL_INVALID_PFN 63 +#define W32_DMN_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG 64 +#define W32_DMN_FAST_FAIL_CAST_GUARD 65 // Known to compiler, must retain value 65 +#define W32_DMN_FAST_FAIL_HOST_VISIBILITY_CHANGE 66 +#define W32_DMN_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST 67 +#define W32_DMN_FAST_FAIL_PATCH_CALLBACK_FAILED 68 +#define W32_DMN_FAST_FAIL_NTDLL_PATCH_FAILED 69 +#define W32_DMN_FAST_FAIL_INVALID_FLS_DATA 70 +#define W32_DMN_FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF //////////////////////////////// //~ rjf: Win32 Register Codes -#define DMN_W32_CTX_X86 0x00010000 -#define DMN_W32_CTX_X64 0x00100000 +#define W32_DMN_CTX_X86 0x00010000 +#define W32_DMN_CTX_X64 0x00100000 -#define DMN_W32_CTX_INTEL_CONTROL 0x0001 // segss, rsp, segcs, rip, and rflags -#define DMN_W32_CTX_INTEL_INTEGER 0x0002 // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15 -#define DMN_W32_CTX_INTEL_SEGMENTS 0x0004 // segds, seges, segfs, and seggs -#define DMN_W32_CTX_INTEL_FLOATS 0x0008 // xmm0-xmm15 -#define DMN_W32_CTX_INTEL_DEBUG 0x0010 // dr0-dr3 and dr6-dr7 -#define DMN_W32_CTX_INTEL_EXTENDED 0x0020 -#define DMN_W32_CTX_INTEL_XSTATE 0x0040 +#define W32_DMN_CTX_INTEL_CONTROL 0x0001 // segss, rsp, segcs, rip, and rflags +#define W32_DMN_CTX_INTEL_INTEGER 0x0002 // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15 +#define W32_DMN_CTX_INTEL_SEGMENTS 0x0004 // segds, seges, segfs, and seggs +#define W32_DMN_CTX_INTEL_FLOATS 0x0008 // xmm0-xmm15 +#define W32_DMN_CTX_INTEL_DEBUG 0x0010 // dr0-dr3 and dr6-dr7 +#define W32_DMN_CTX_INTEL_EXTENDED 0x0020 +#define W32_DMN_CTX_INTEL_XSTATE 0x0040 -#define DMN_W32_CTX_X86_ALL (DMN_W32_CTX_X86 | \ -DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ -DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_DEBUG | \ -DMN_W32_CTX_INTEL_EXTENDED) -#define DMN_W32_CTX_X64_ALL (DMN_W32_CTX_X64 | \ -DMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \ -DMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_FLOATS | \ -DMN_W32_CTX_INTEL_DEBUG) +#define W32_DMN_CTX_X86_ALL (W32_DMN_CTX_X86 | \ +W32_DMN_CTX_INTEL_CONTROL | W32_DMN_CTX_INTEL_INTEGER | \ +W32_DMN_CTX_INTEL_SEGMENTS | W32_DMN_CTX_INTEL_DEBUG | \ +W32_DMN_CTX_INTEL_EXTENDED) +#define W32_DMN_CTX_X64_ALL (W32_DMN_CTX_X64 | \ +W32_DMN_CTX_INTEL_CONTROL | W32_DMN_CTX_INTEL_INTEGER | \ +W32_DMN_CTX_INTEL_SEGMENTS | W32_DMN_CTX_INTEL_FLOATS | \ +W32_DMN_CTX_INTEL_DEBUG) //////////////////////////////// //~ rjf: Per-Entity State -typedef enum DMN_W32_EntityKind +typedef enum W32_DMN_EntityKind { - DMN_W32_EntityKind_Null, - DMN_W32_EntityKind_Root, - DMN_W32_EntityKind_Process, - DMN_W32_EntityKind_Thread, - DMN_W32_EntityKind_Module, - DMN_W32_EntityKind_COUNT + W32_DMN_EntityKind_Null, + W32_DMN_EntityKind_Root, + W32_DMN_EntityKind_Process, + W32_DMN_EntityKind_Thread, + W32_DMN_EntityKind_Module, + W32_DMN_EntityKind_COUNT } -DMN_W32_EntityKind; +W32_DMN_EntityKind; -typedef struct DMN_W32_Entity DMN_W32_Entity; -struct DMN_W32_Entity +typedef struct W32_DMN_Entity W32_DMN_Entity; +struct W32_DMN_Entity { - DMN_W32_Entity *first; - DMN_W32_Entity *last; - DMN_W32_Entity *next; - DMN_W32_Entity *prev; - DMN_W32_Entity *parent; - DMN_W32_EntityKind kind; + W32_DMN_Entity *first; + W32_DMN_Entity *last; + W32_DMN_Entity *next; + W32_DMN_Entity *prev; + W32_DMN_Entity *parent; + W32_DMN_EntityKind kind; U32 gen; U64 id; HANDLE handle; @@ -212,46 +212,46 @@ struct DMN_W32_Entity }; }; -typedef struct DMN_W32_EntityNode DMN_W32_EntityNode; -struct DMN_W32_EntityNode +typedef struct W32_DMN_EntityNode W32_DMN_EntityNode; +struct W32_DMN_EntityNode { - DMN_W32_EntityNode *next; - DMN_W32_Entity *v; + W32_DMN_EntityNode *next; + W32_DMN_Entity *v; }; -typedef struct DMN_W32_EntityIDHashNode DMN_W32_EntityIDHashNode; -struct DMN_W32_EntityIDHashNode +typedef struct W32_DMN_EntityIDHashNode W32_DMN_EntityIDHashNode; +struct W32_DMN_EntityIDHashNode { - DMN_W32_EntityIDHashNode *next; - DMN_W32_EntityIDHashNode *prev; + W32_DMN_EntityIDHashNode *next; + W32_DMN_EntityIDHashNode *prev; U64 id; - DMN_W32_Entity *entity; + W32_DMN_Entity *entity; }; -typedef struct DMN_W32_EntityIDHashSlot DMN_W32_EntityIDHashSlot; -struct DMN_W32_EntityIDHashSlot +typedef struct W32_DMN_EntityIDHashSlot W32_DMN_EntityIDHashSlot; +struct W32_DMN_EntityIDHashSlot { - DMN_W32_EntityIDHashNode *first; - DMN_W32_EntityIDHashNode *last; + W32_DMN_EntityIDHashNode *first; + W32_DMN_EntityIDHashNode *last; }; //////////////////////////////// //~ rjf: Injection Types -typedef struct DMN_W32_InjectedBreak DMN_W32_InjectedBreak; -struct DMN_W32_InjectedBreak +typedef struct W32_DMN_InjectedBreak W32_DMN_InjectedBreak; +struct W32_DMN_InjectedBreak { U64 code; U64 user_data; }; -#define DMN_W32_INJECTED_CODE_SIZE 32 +#define W32_DMN_INJECTED_CODE_SIZE 32 //////////////////////////////// //~ rjf: Image Info Types -typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo; -struct DMN_W32_ImageInfo +typedef struct W32_DMN_ImageInfo W32_DMN_ImageInfo; +struct W32_DMN_ImageInfo { Arch arch; U32 size; @@ -261,13 +261,13 @@ struct DMN_W32_ImageInfo //////////////////////////////// //~ rjf: Dynamically-Loaded Win32 Function Types -typedef HRESULT DMN_W32_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription); +typedef HRESULT W32_DMN_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription); //////////////////////////////// //~ rjf: Shared State Bundle -typedef struct DMN_W32_Shared DMN_W32_Shared; -struct DMN_W32_Shared +typedef struct W32_DMN_Shared W32_DMN_Shared; +struct W32_DMN_Shared { // rjf: top-level info Arena *arena; @@ -283,12 +283,12 @@ struct DMN_W32_Shared // rjf: entity state Arena *entities_arena; - DMN_W32_Entity *entities_base; - DMN_W32_Entity *entities_first_free; + W32_DMN_Entity *entities_base; + W32_DMN_Entity *entities_first_free; U64 entities_count; - DMN_W32_EntityIDHashSlot *entities_id_hash_slots; + W32_DMN_EntityIDHashSlot *entities_id_hash_slots; U64 entities_id_hash_slots_count; - DMN_W32_EntityIDHashNode *entities_id_hash_node_free; + W32_DMN_EntityIDHashNode *entities_id_hash_node_free; // rjf: launch state B32 new_process_pending; @@ -307,53 +307,47 @@ struct DMN_W32_Shared //////////////////////////////// //~ rjf: Globals -global DMN_W32_Shared *dmn_w32_shared = 0; -global DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil}; -global DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0; -thread_static B32 dmn_w32_ctrl_thread = 0; - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 dmn_w32_hash_from_string(String8 string); -internal U64 dmn_w32_hash_from_id(U64 id); +global W32_DMN_Shared *w32_dmn_shared = 0; +global W32_DMN_Entity w32_dmn_entity_nil = {&w32_dmn_entity_nil, &w32_dmn_entity_nil, &w32_dmn_entity_nil, &w32_dmn_entity_nil, &w32_dmn_entity_nil}; +global W32_DMN_GetThreadDescriptionFunctionType *w32_dmn_GetThreadDescription = 0; +thread_static B32 w32_dmn_ctrl_thread = 0; //////////////////////////////// //~ rjf: Entity Helpers //- rjf: entity <-> handle -internal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity); -internal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle); +internal DMN_Handle w32_dmn_handle_from_entity(W32_DMN_Entity *entity); +internal W32_DMN_Entity *w32_dmn_entity_from_handle(DMN_Handle handle); //- rjf: entity allocation/deallocation -internal DMN_W32_Entity *dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id); -internal void dmn_w32_entity_release(DMN_W32_Entity *entity); +internal W32_DMN_Entity *w32_dmn_entity_alloc(W32_DMN_Entity *parent, W32_DMN_EntityKind kind, U64 id); +internal void w32_dmn_entity_release(W32_DMN_Entity *entity); //- rjf: kind*id -> entity -internal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id); +internal W32_DMN_Entity *w32_dmn_entity_from_kind_id(W32_DMN_EntityKind kind, U64 id); //////////////////////////////// //~ rjf: Module Info Extraction -internal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module); +internal String8 w32_dmn_full_path_from_module(Arena *arena, W32_DMN_Entity *module); //////////////////////////////// //~ rjf: Win32-Level Process/Thread Reads/Writes //- rjf: processes -internal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst); -internal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src); -internal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); -internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); -#define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -#define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); +internal U64 w32_dmn_process_read(HANDLE process, Rng1U64 range, void *dst); +internal B32 w32_dmn_process_write(HANDLE process, Rng1U64 range, void *src); +internal String8 w32_dmn_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); +internal String16 w32_dmn_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); +#define w32_dmn_process_read_struct(process, vaddr, ptr) w32_dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +#define w32_dmn_process_write_struct(process, vaddr, ptr) w32_dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) +internal W32_DMN_ImageInfo w32_dmn_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); //- rjf: threads -internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block); -internal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block); +internal B32 w32_dmn_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block); +internal B32 w32_dmn_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block); //- rjf: remote thread injection -internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); +internal DWORD w32_dmn_inject_thread(HANDLE process, U64 start_address); #endif // DEMON_CORE_WIN32_H diff --git a/src/win32/window_manager/win32_window_manager.c b/src/win32/window_manager/win32_window_manager.c index c7e8708f..3baaa28c 100644 --- a/src/win32/window_manager/win32_window_manager.c +++ b/src/win32/window_manager/win32_window_manager.c @@ -19,7 +19,7 @@ global w32_GetSystemMetricsForDpi_Type *w32_GetSystemMetricsForDpi_func = 0; //~ rjf: Basic Helpers internal Rng2F32 -os_w32_rng2f32_from_rect(RECT rect) +w32_wm_rng2f32_from_rect(RECT rect) { Rng2F32 r = {0}; r.x0 = (F32)rect.left; @@ -32,25 +32,25 @@ os_w32_rng2f32_from_rect(RECT rect) //////////////////////////////// //~ rjf: Windows -internal OS_Window -os_w32_handle_from_window(OS_W32_Window *window) +internal WM_Window +w32_wm_handle_from_window(W32_WM_Window *window) { - OS_Window handle = {(U64)window}; + WM_Window handle = {(U64)window}; return handle; } -internal OS_W32_Window * -os_w32_window_from_handle(OS_Window handle) +internal W32_WM_Window * +w32_wm_window_from_handle(WM_Window handle) { - OS_W32_Window *window = (OS_W32_Window *)handle.u64[0]; + W32_WM_Window *window = (W32_WM_Window *)handle.u64[0]; return window; } -internal OS_W32_Window * -os_w32_window_from_hwnd(HWND hwnd) +internal W32_WM_Window * +w32_wm_window_from_hwnd(HWND hwnd) { - OS_W32_Window *result = 0; - for(OS_W32_Window *w = os_w32_gfx_state->first_window; w; w = w->next) + W32_WM_Window *result = 0; + for(W32_WM_Window *w = w32_wm_state->first_window; w; w = w->next) { if(w->hwnd == hwnd) { @@ -62,34 +62,34 @@ os_w32_window_from_hwnd(HWND hwnd) } internal HWND -os_w32_hwnd_from_window(OS_W32_Window *window) +w32_wm_hwnd_from_window(W32_WM_Window *window) { return window->hwnd; } -internal OS_W32_Window * -os_w32_window_alloc(void) +internal W32_WM_Window * +w32_wm_window_alloc(void) { - OS_W32_Window *result = os_w32_gfx_state->free_window; + W32_WM_Window *result = w32_wm_state->free_window; if(result) { - SLLStackPop(os_w32_gfx_state->free_window); + SLLStackPop(w32_wm_state->free_window); } else { - result = push_array_no_zero(os_w32_gfx_state->arena, OS_W32_Window, 1); + result = push_array_no_zero(w32_wm_state->arena, W32_WM_Window, 1); } MemoryZeroStruct(result); if(result) { - DLLPushBack(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, result); + DLLPushBack(w32_wm_state->first_window, w32_wm_state->last_window, result); } result->last_window_placement.length = sizeof(WINDOWPLACEMENT); return result; } internal void -os_w32_window_release(OS_W32_Window *window) +w32_wm_window_release(W32_WM_Window *window) { if(window->paint_arena != 0) { @@ -97,231 +97,231 @@ os_w32_window_release(OS_W32_Window *window) } ReleaseDC(window->hwnd, window->hdc); DestroyWindow(window->hwnd); - DLLRemove(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, window); - SLLStackPush(os_w32_gfx_state->free_window, window); + DLLRemove(w32_wm_state->first_window, w32_wm_state->last_window, window); + SLLStackPush(w32_wm_state->free_window, window); } -internal OS_Event * -os_w32_push_event(OS_EventKind kind, OS_W32_Window *window) +internal WM_Event * +w32_wm_push_event(WM_EventKind kind, W32_WM_Window *window) { - OS_Event *result = os_event_list_push_new(os_w32_event_arena, &os_w32_event_list, kind); - result->window = os_w32_handle_from_window(window); - result->modifiers = os_get_modifiers(); + WM_Event *result = wm_event_list_push_new(w32_wm_event_arena, &w32_wm_event_list, kind); + result->window = w32_wm_handle_from_window(window); + result->modifiers = wm_get_modifiers(); return result; } -internal OS_Key -os_w32_os_key_from_vkey(WPARAM vkey) +internal WM_Key +w32_wm_os_key_from_vkey(WPARAM vkey) { local_persist B32 first = 1; - local_persist OS_Key key_table[256]; + local_persist WM_Key key_table[256]; if (first){ first = 0; MemoryZeroArray(key_table); - key_table[(unsigned int)'A'] = OS_Key_A; - key_table[(unsigned int)'B'] = OS_Key_B; - key_table[(unsigned int)'C'] = OS_Key_C; - key_table[(unsigned int)'D'] = OS_Key_D; - key_table[(unsigned int)'E'] = OS_Key_E; - key_table[(unsigned int)'F'] = OS_Key_F; - key_table[(unsigned int)'G'] = OS_Key_G; - key_table[(unsigned int)'H'] = OS_Key_H; - key_table[(unsigned int)'I'] = OS_Key_I; - key_table[(unsigned int)'J'] = OS_Key_J; - key_table[(unsigned int)'K'] = OS_Key_K; - key_table[(unsigned int)'L'] = OS_Key_L; - key_table[(unsigned int)'M'] = OS_Key_M; - key_table[(unsigned int)'N'] = OS_Key_N; - key_table[(unsigned int)'O'] = OS_Key_O; - key_table[(unsigned int)'P'] = OS_Key_P; - key_table[(unsigned int)'Q'] = OS_Key_Q; - key_table[(unsigned int)'R'] = OS_Key_R; - key_table[(unsigned int)'S'] = OS_Key_S; - key_table[(unsigned int)'T'] = OS_Key_T; - key_table[(unsigned int)'U'] = OS_Key_U; - key_table[(unsigned int)'V'] = OS_Key_V; - key_table[(unsigned int)'W'] = OS_Key_W; - key_table[(unsigned int)'X'] = OS_Key_X; - key_table[(unsigned int)'Y'] = OS_Key_Y; - key_table[(unsigned int)'Z'] = OS_Key_Z; + key_table[(unsigned int)'A'] = WM_Key_A; + key_table[(unsigned int)'B'] = WM_Key_B; + key_table[(unsigned int)'C'] = WM_Key_C; + key_table[(unsigned int)'D'] = WM_Key_D; + key_table[(unsigned int)'E'] = WM_Key_E; + key_table[(unsigned int)'F'] = WM_Key_F; + key_table[(unsigned int)'G'] = WM_Key_G; + key_table[(unsigned int)'H'] = WM_Key_H; + key_table[(unsigned int)'I'] = WM_Key_I; + key_table[(unsigned int)'J'] = WM_Key_J; + key_table[(unsigned int)'K'] = WM_Key_K; + key_table[(unsigned int)'L'] = WM_Key_L; + key_table[(unsigned int)'M'] = WM_Key_M; + key_table[(unsigned int)'N'] = WM_Key_N; + key_table[(unsigned int)'O'] = WM_Key_O; + key_table[(unsigned int)'P'] = WM_Key_P; + key_table[(unsigned int)'Q'] = WM_Key_Q; + key_table[(unsigned int)'R'] = WM_Key_R; + key_table[(unsigned int)'S'] = WM_Key_S; + key_table[(unsigned int)'T'] = WM_Key_T; + key_table[(unsigned int)'U'] = WM_Key_U; + key_table[(unsigned int)'V'] = WM_Key_V; + key_table[(unsigned int)'W'] = WM_Key_W; + key_table[(unsigned int)'X'] = WM_Key_X; + key_table[(unsigned int)'Y'] = WM_Key_Y; + key_table[(unsigned int)'Z'] = WM_Key_Z; - for (U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1){ - key_table[i] = (OS_Key)j; + for (U64 i = '0', j = WM_Key_0; i <= '9'; i += 1, j += 1){ + key_table[i] = (WM_Key)j; } - for (U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1){ - key_table[i] = (OS_Key)j; + for (U64 i = VK_NUMPAD0, j = WM_Key_0; i <= VK_NUMPAD9; i += 1, j += 1){ + key_table[i] = (WM_Key)j; } - for (U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1){ - key_table[i] = (OS_Key)j; + for (U64 i = VK_F1, j = WM_Key_F1; i <= VK_F24; i += 1, j += 1){ + key_table[i] = (WM_Key)j; } - key_table[VK_SPACE] = OS_Key_Space; - key_table[VK_OEM_3] = OS_Key_Tick; - key_table[VK_OEM_MINUS] = OS_Key_Minus; - key_table[VK_OEM_PLUS] = OS_Key_Equal; - key_table[VK_OEM_4] = OS_Key_LeftBracket; - key_table[VK_OEM_6] = OS_Key_RightBracket; - key_table[VK_OEM_1] = OS_Key_Semicolon; - key_table[VK_OEM_7] = OS_Key_Quote; - key_table[VK_OEM_COMMA] = OS_Key_Comma; - key_table[VK_OEM_PERIOD]= OS_Key_Period; - key_table[VK_OEM_2] = OS_Key_Slash; - key_table[VK_OEM_5] = OS_Key_BackSlash; + key_table[VK_SPACE] = WM_Key_Space; + key_table[VK_OEM_3] = WM_Key_Tick; + key_table[VK_OEM_MINUS] = WM_Key_Minus; + key_table[VK_OEM_PLUS] = WM_Key_Equal; + key_table[VK_OEM_4] = WM_Key_LeftBracket; + key_table[VK_OEM_6] = WM_Key_RightBracket; + key_table[VK_OEM_1] = WM_Key_Semicolon; + key_table[VK_OEM_7] = WM_Key_Quote; + key_table[VK_OEM_COMMA] = WM_Key_Comma; + key_table[VK_OEM_PERIOD]= WM_Key_Period; + key_table[VK_OEM_2] = WM_Key_Slash; + key_table[VK_OEM_5] = WM_Key_BackSlash; - key_table[VK_TAB] = OS_Key_Tab; - key_table[VK_PAUSE] = OS_Key_Pause; - key_table[VK_ESCAPE] = OS_Key_Esc; + key_table[VK_TAB] = WM_Key_Tab; + key_table[VK_PAUSE] = WM_Key_Pause; + key_table[VK_ESCAPE] = WM_Key_Esc; - key_table[VK_UP] = OS_Key_Up; - key_table[VK_LEFT] = OS_Key_Left; - key_table[VK_DOWN] = OS_Key_Down; - key_table[VK_RIGHT] = OS_Key_Right; + key_table[VK_UP] = WM_Key_Up; + key_table[VK_LEFT] = WM_Key_Left; + key_table[VK_DOWN] = WM_Key_Down; + key_table[VK_RIGHT] = WM_Key_Right; - key_table[VK_BACK] = OS_Key_Backspace; - key_table[VK_RETURN] = OS_Key_Return; + key_table[VK_BACK] = WM_Key_Backspace; + key_table[VK_RETURN] = WM_Key_Return; - key_table[VK_DELETE] = OS_Key_Delete; - key_table[VK_INSERT] = OS_Key_Insert; - key_table[VK_PRIOR] = OS_Key_PageUp; - key_table[VK_NEXT] = OS_Key_PageDown; - key_table[VK_HOME] = OS_Key_Home; - key_table[VK_END] = OS_Key_End; + key_table[VK_DELETE] = WM_Key_Delete; + key_table[VK_INSERT] = WM_Key_Insert; + key_table[VK_PRIOR] = WM_Key_PageUp; + key_table[VK_NEXT] = WM_Key_PageDown; + key_table[VK_HOME] = WM_Key_Home; + key_table[VK_END] = WM_Key_End; - key_table[VK_CAPITAL] = OS_Key_CapsLock; - key_table[VK_NUMLOCK] = OS_Key_NumLock; - key_table[VK_SCROLL] = OS_Key_ScrollLock; - key_table[VK_APPS] = OS_Key_Menu; + key_table[VK_CAPITAL] = WM_Key_CapsLock; + key_table[VK_NUMLOCK] = WM_Key_NumLock; + key_table[VK_SCROLL] = WM_Key_ScrollLock; + key_table[VK_APPS] = WM_Key_Menu; - key_table[VK_CONTROL] = OS_Key_Ctrl; - key_table[VK_LCONTROL] = OS_Key_Ctrl; - key_table[VK_RCONTROL] = OS_Key_Ctrl; - key_table[VK_SHIFT] = OS_Key_Shift; - key_table[VK_LSHIFT] = OS_Key_Shift; - key_table[VK_RSHIFT] = OS_Key_Shift; - key_table[VK_MENU] = OS_Key_Alt; - key_table[VK_LMENU] = OS_Key_Alt; - key_table[VK_RMENU] = OS_Key_Alt; + key_table[VK_CONTROL] = WM_Key_Ctrl; + key_table[VK_LCONTROL] = WM_Key_Ctrl; + key_table[VK_RCONTROL] = WM_Key_Ctrl; + key_table[VK_SHIFT] = WM_Key_Shift; + key_table[VK_LSHIFT] = WM_Key_Shift; + key_table[VK_RSHIFT] = WM_Key_Shift; + key_table[VK_MENU] = WM_Key_Alt; + key_table[VK_LMENU] = WM_Key_Alt; + key_table[VK_RMENU] = WM_Key_Alt; - key_table[VK_DIVIDE] = OS_Key_NumSlash; - key_table[VK_MULTIPLY] = OS_Key_NumStar; - key_table[VK_SUBTRACT] = OS_Key_NumMinus; - key_table[VK_ADD] = OS_Key_NumPlus; - key_table[VK_DECIMAL] = OS_Key_NumPeriod; + key_table[VK_DIVIDE] = WM_Key_NumSlash; + key_table[VK_MULTIPLY] = WM_Key_NumStar; + key_table[VK_SUBTRACT] = WM_Key_NumMinus; + key_table[VK_ADD] = WM_Key_NumPlus; + key_table[VK_DECIMAL] = WM_Key_NumPeriod; for (U32 i = 0; i < 10; i += 1){ - key_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); + key_table[VK_NUMPAD0 + i] = (WM_Key)((U64)WM_Key_Num0 + i); } for (U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1){ - key_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); + key_table[i] = (WM_Key)((U64)WM_Key_Ex0 + j); } } - OS_Key key = key_table[vkey&bitmask8]; + WM_Key key = key_table[vkey&bitmask8]; return key; } internal WPARAM -os_w32_vkey_from_os_key(OS_Key key) +w32_wm_vkey_from_os_key(WM_Key key) { WPARAM result = 0; { local_persist B32 initialized = 0; - local_persist WPARAM vkey_table[OS_Key_COUNT] = {0}; + local_persist WPARAM vkey_table[WM_Key_COUNT] = {0}; if(initialized == 0) { initialized = 1; - vkey_table[OS_Key_Esc] = VK_ESCAPE; - for(OS_Key key = OS_Key_F1; key <= OS_Key_F24; key = (OS_Key)(key+1)) + vkey_table[WM_Key_Esc] = VK_ESCAPE; + for(WM_Key key = WM_Key_F1; key <= WM_Key_F24; key = (WM_Key)(key+1)) { - vkey_table[key] = VK_F1+(key-OS_Key_F1); + vkey_table[key] = VK_F1+(key-WM_Key_F1); } - vkey_table[OS_Key_Tick] = VK_OEM_3; - for(OS_Key key = OS_Key_0; key <= OS_Key_9; key = (OS_Key)(key+1)) + vkey_table[WM_Key_Tick] = VK_OEM_3; + for(WM_Key key = WM_Key_0; key <= WM_Key_9; key = (WM_Key)(key+1)) { - vkey_table[key] = '0'+(key-OS_Key_0); + vkey_table[key] = '0'+(key-WM_Key_0); } - vkey_table[OS_Key_Minus] = VK_OEM_MINUS; - vkey_table[OS_Key_Equal] = VK_OEM_PLUS; - vkey_table[OS_Key_Backspace] = VK_BACK; - vkey_table[OS_Key_Tab] = VK_TAB; - vkey_table[OS_Key_Q] = 'Q'; - vkey_table[OS_Key_W] = 'W'; - vkey_table[OS_Key_E] = 'E'; - vkey_table[OS_Key_R] = 'R'; - vkey_table[OS_Key_T] = 'T'; - vkey_table[OS_Key_Y] = 'Y'; - vkey_table[OS_Key_U] = 'U'; - vkey_table[OS_Key_I] = 'I'; - vkey_table[OS_Key_O] = 'O'; - vkey_table[OS_Key_P] = 'P'; - vkey_table[OS_Key_LeftBracket] = VK_OEM_4; - vkey_table[OS_Key_RightBracket] = VK_OEM_6; - vkey_table[OS_Key_BackSlash] = VK_OEM_5; - vkey_table[OS_Key_CapsLock] = VK_CAPITAL; - vkey_table[OS_Key_A] = 'A'; - vkey_table[OS_Key_S] = 'S'; - vkey_table[OS_Key_D] = 'D'; - vkey_table[OS_Key_F] = 'F'; - vkey_table[OS_Key_G] = 'G'; - vkey_table[OS_Key_H] = 'H'; - vkey_table[OS_Key_J] = 'J'; - vkey_table[OS_Key_K] = 'K'; - vkey_table[OS_Key_L] = 'L'; - vkey_table[OS_Key_Semicolon] = VK_OEM_1; - vkey_table[OS_Key_Quote] = VK_OEM_7; - vkey_table[OS_Key_Return] = VK_RETURN; - vkey_table[OS_Key_Shift] = VK_SHIFT; - vkey_table[OS_Key_Z] = 'Z'; - vkey_table[OS_Key_X] = 'X'; - vkey_table[OS_Key_C] = 'C'; - vkey_table[OS_Key_V] = 'V'; - vkey_table[OS_Key_B] = 'B'; - vkey_table[OS_Key_N] = 'N'; - vkey_table[OS_Key_M] = 'M'; - vkey_table[OS_Key_Comma] = VK_OEM_COMMA; - vkey_table[OS_Key_Period] = VK_OEM_PERIOD; - vkey_table[OS_Key_Slash] = VK_OEM_2; - vkey_table[OS_Key_Ctrl] = VK_CONTROL; - vkey_table[OS_Key_Alt] = VK_MENU; - vkey_table[OS_Key_Space] = VK_SPACE; - vkey_table[OS_Key_Menu] = VK_APPS; - vkey_table[OS_Key_ScrollLock] = VK_SCROLL; - vkey_table[OS_Key_Pause] = VK_PAUSE; - vkey_table[OS_Key_Insert] = VK_INSERT; - vkey_table[OS_Key_Home] = VK_HOME; - vkey_table[OS_Key_PageUp] = VK_PRIOR; - vkey_table[OS_Key_Delete] = VK_DELETE; - vkey_table[OS_Key_End] = VK_END; - vkey_table[OS_Key_PageDown] = VK_NEXT; - vkey_table[OS_Key_Up] = VK_UP; - vkey_table[OS_Key_Left] = VK_LEFT; - vkey_table[OS_Key_Down] = VK_DOWN; - vkey_table[OS_Key_Right] = VK_RIGHT; - for(OS_Key key = OS_Key_Ex0; key <= OS_Key_Ex29; key = (OS_Key)(key+1)) + vkey_table[WM_Key_Minus] = VK_OEM_MINUS; + vkey_table[WM_Key_Equal] = VK_OEM_PLUS; + vkey_table[WM_Key_Backspace] = VK_BACK; + vkey_table[WM_Key_Tab] = VK_TAB; + vkey_table[WM_Key_Q] = 'Q'; + vkey_table[WM_Key_W] = 'W'; + vkey_table[WM_Key_E] = 'E'; + vkey_table[WM_Key_R] = 'R'; + vkey_table[WM_Key_T] = 'T'; + vkey_table[WM_Key_Y] = 'Y'; + vkey_table[WM_Key_U] = 'U'; + vkey_table[WM_Key_I] = 'I'; + vkey_table[WM_Key_O] = 'O'; + vkey_table[WM_Key_P] = 'P'; + vkey_table[WM_Key_LeftBracket] = VK_OEM_4; + vkey_table[WM_Key_RightBracket] = VK_OEM_6; + vkey_table[WM_Key_BackSlash] = VK_OEM_5; + vkey_table[WM_Key_CapsLock] = VK_CAPITAL; + vkey_table[WM_Key_A] = 'A'; + vkey_table[WM_Key_S] = 'S'; + vkey_table[WM_Key_D] = 'D'; + vkey_table[WM_Key_F] = 'F'; + vkey_table[WM_Key_G] = 'G'; + vkey_table[WM_Key_H] = 'H'; + vkey_table[WM_Key_J] = 'J'; + vkey_table[WM_Key_K] = 'K'; + vkey_table[WM_Key_L] = 'L'; + vkey_table[WM_Key_Semicolon] = VK_OEM_1; + vkey_table[WM_Key_Quote] = VK_OEM_7; + vkey_table[WM_Key_Return] = VK_RETURN; + vkey_table[WM_Key_Shift] = VK_SHIFT; + vkey_table[WM_Key_Z] = 'Z'; + vkey_table[WM_Key_X] = 'X'; + vkey_table[WM_Key_C] = 'C'; + vkey_table[WM_Key_V] = 'V'; + vkey_table[WM_Key_B] = 'B'; + vkey_table[WM_Key_N] = 'N'; + vkey_table[WM_Key_M] = 'M'; + vkey_table[WM_Key_Comma] = VK_OEM_COMMA; + vkey_table[WM_Key_Period] = VK_OEM_PERIOD; + vkey_table[WM_Key_Slash] = VK_OEM_2; + vkey_table[WM_Key_Ctrl] = VK_CONTROL; + vkey_table[WM_Key_Alt] = VK_MENU; + vkey_table[WM_Key_Space] = VK_SPACE; + vkey_table[WM_Key_Menu] = VK_APPS; + vkey_table[WM_Key_ScrollLock] = VK_SCROLL; + vkey_table[WM_Key_Pause] = VK_PAUSE; + vkey_table[WM_Key_Insert] = VK_INSERT; + vkey_table[WM_Key_Home] = VK_HOME; + vkey_table[WM_Key_PageUp] = VK_PRIOR; + vkey_table[WM_Key_Delete] = VK_DELETE; + vkey_table[WM_Key_End] = VK_END; + vkey_table[WM_Key_PageDown] = VK_NEXT; + vkey_table[WM_Key_Up] = VK_UP; + vkey_table[WM_Key_Left] = VK_LEFT; + vkey_table[WM_Key_Down] = VK_DOWN; + vkey_table[WM_Key_Right] = VK_RIGHT; + for(WM_Key key = WM_Key_Ex0; key <= WM_Key_Ex29; key = (WM_Key)(key+1)) { - vkey_table[key] = 0xDF + (key-OS_Key_Ex0); + vkey_table[key] = 0xDF + (key-WM_Key_Ex0); } - vkey_table[OS_Key_NumLock] = VK_NUMLOCK; - vkey_table[OS_Key_NumSlash] = VK_DIVIDE; - vkey_table[OS_Key_NumStar] = VK_MULTIPLY; - vkey_table[OS_Key_NumMinus] = VK_SUBTRACT; - vkey_table[OS_Key_NumPlus] = VK_ADD; - vkey_table[OS_Key_NumPeriod] = VK_DECIMAL; - vkey_table[OS_Key_Num0] = VK_NUMPAD0; - vkey_table[OS_Key_Num1] = VK_NUMPAD1; - vkey_table[OS_Key_Num2] = VK_NUMPAD2; - vkey_table[OS_Key_Num3] = VK_NUMPAD3; - vkey_table[OS_Key_Num4] = VK_NUMPAD4; - vkey_table[OS_Key_Num5] = VK_NUMPAD5; - vkey_table[OS_Key_Num6] = VK_NUMPAD6; - vkey_table[OS_Key_Num7] = VK_NUMPAD7; - vkey_table[OS_Key_Num8] = VK_NUMPAD8; - vkey_table[OS_Key_Num9] = VK_NUMPAD9; - vkey_table[OS_Key_LeftMouseButton] = VK_LBUTTON; - vkey_table[OS_Key_MiddleMouseButton] = VK_MBUTTON; - vkey_table[OS_Key_RightMouseButton] = VK_RBUTTON; + vkey_table[WM_Key_NumLock] = VK_NUMLOCK; + vkey_table[WM_Key_NumSlash] = VK_DIVIDE; + vkey_table[WM_Key_NumStar] = VK_MULTIPLY; + vkey_table[WM_Key_NumMinus] = VK_SUBTRACT; + vkey_table[WM_Key_NumPlus] = VK_ADD; + vkey_table[WM_Key_NumPeriod] = VK_DECIMAL; + vkey_table[WM_Key_Num0] = VK_NUMPAD0; + vkey_table[WM_Key_Num1] = VK_NUMPAD1; + vkey_table[WM_Key_Num2] = VK_NUMPAD2; + vkey_table[WM_Key_Num3] = VK_NUMPAD3; + vkey_table[WM_Key_Num4] = VK_NUMPAD4; + vkey_table[WM_Key_Num5] = VK_NUMPAD5; + vkey_table[WM_Key_Num6] = VK_NUMPAD6; + vkey_table[WM_Key_Num7] = VK_NUMPAD7; + vkey_table[WM_Key_Num8] = VK_NUMPAD8; + vkey_table[WM_Key_Num9] = VK_NUMPAD9; + vkey_table[WM_Key_LeftMouseButton] = VK_LBUTTON; + vkey_table[WM_Key_MiddleMouseButton] = VK_MBUTTON; + vkey_table[WM_Key_RightMouseButton] = VK_RBUTTON; } result = vkey_table[key]; } @@ -329,20 +329,20 @@ os_w32_vkey_from_os_key(OS_Key key) } internal LRESULT -os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +w32_wm_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ProfBeginFunction(); LRESULT result = 0; B32 good = 1; - if(os_w32_event_arena == 0) + if(w32_wm_event_arena == 0) { result = DefWindowProcW(hwnd, uMsg, wParam, lParam); good = 0; } if(good) { - OS_W32_Window *window = os_w32_window_from_hwnd(hwnd); - OS_Window window_handle = os_w32_handle_from_window(window); + W32_WM_Window *window = w32_wm_window_from_hwnd(hwnd); + WM_Window window_handle = w32_wm_handle_from_window(window); B32 release = 0; switch(uMsg) @@ -354,12 +354,12 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_ENTERSIZEMOVE: { - os_w32_resizing = 1; + w32_wm_resizing = 1; }break; case WM_EXITSIZEMOVE: { - os_w32_resizing = 0; + w32_wm_resizing = 0; }break; case WM_SIZE: @@ -374,7 +374,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_CLOSE: { - os_w32_push_event(OS_EventKind_WindowClose, window); + w32_wm_push_event(WM_EventKind_WindowClose, window); }break; case WM_LBUTTONUP: @@ -387,20 +387,20 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: { - OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); + WM_Event *event = w32_wm_push_event(release ? WM_EventKind_Release : WM_EventKind_Press, window); switch (uMsg) { case WM_LBUTTONUP: case WM_LBUTTONDOWN: { - event->key = OS_Key_LeftMouseButton; + event->key = WM_Key_LeftMouseButton; }break; case WM_MBUTTONUP: case WM_MBUTTONDOWN: { - event->key = OS_Key_MiddleMouseButton; + event->key = WM_Key_MiddleMouseButton; }break; case WM_RBUTTONUP: case WM_RBUTTONDOWN: { - event->key = OS_Key_RightMouseButton; + event->key = WM_Key_RightMouseButton; }break; } event->pos.x = (F32)(S16)LOWORD(lParam); @@ -417,7 +417,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_MOUSEMOVE: { - OS_Event *event = os_w32_push_event(OS_EventKind_MouseMove, window); + WM_Event *event = w32_wm_push_event(WM_EventKind_MouseMove, window); event->pos.x = (F32)(S16)LOWORD(lParam); event->pos.y = (F32)(S16)HIWORD(lParam); }break; @@ -425,7 +425,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_MOUSEWHEEL: { S16 wheel_delta = HIWORD(wParam); - OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window); + WM_Event *event = w32_wm_push_event(WM_EventKind_Scroll, window); POINT p; p.x = (S32)(S16)LOWORD(lParam); p.y = (S32)(S16)HIWORD(lParam); @@ -438,7 +438,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_MOUSEHWHEEL: { S16 wheel_delta = HIWORD(wParam); - OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window); + WM_Event *event = w32_wm_push_event(WM_EventKind_Scroll, window); POINT p; p.x = (S32)(S16)LOWORD(lParam); p.y = (S32)(S16)HIWORD(lParam); @@ -479,14 +479,14 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) right_sided = 1; } - OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window); - event->key = os_w32_os_key_from_vkey(wParam); + WM_Event *event = w32_wm_push_event(release ? WM_EventKind_Release : WM_EventKind_Press, window); + event->key = w32_wm_os_key_from_vkey(wParam); event->repeat_count = lParam & bitmask16; event->is_repeat = is_repeat; event->right_sided = right_sided; - if(event->key == OS_Key_Alt && event->modifiers & OS_Modifier_Alt) { event->modifiers &= ~OS_Modifier_Alt; } - if(event->key == OS_Key_Ctrl && event->modifiers & OS_Modifier_Ctrl) { event->modifiers &= ~OS_Modifier_Ctrl; } - if(event->key == OS_Key_Shift && event->modifiers & OS_Modifier_Shift) { event->modifiers &= ~OS_Modifier_Shift; } + if(event->key == WM_Key_Alt && event->modifiers & WM_Modifier_Alt) { event->modifiers &= ~WM_Modifier_Alt; } + if(event->key == WM_Key_Ctrl && event->modifiers & WM_Modifier_Ctrl) { event->modifiers &= ~WM_Modifier_Ctrl; } + if(event->key == WM_Key_Shift && event->modifiers & WM_Modifier_Shift) { event->modifiers &= ~WM_Modifier_Shift; } }break; case WM_SYSCHAR: @@ -507,10 +507,10 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) U32 character = wParam; if(character >= 32 && character != 127) { - OS_Event *event = os_w32_push_event(OS_EventKind_Text, window); + WM_Event *event = w32_wm_push_event(WM_EventKind_Text, window); if(lParam & bit29) { - event->modifiers |= OS_Modifier_Alt; + event->modifiers |= WM_Modifier_Alt; } event->character = character; } @@ -518,14 +518,14 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_KILLFOCUS: { - os_w32_push_event(OS_EventKind_WindowLoseFocus, window); + w32_wm_push_event(WM_EventKind_WindowLoseFocus, window); ReleaseCapture(); }break; case WM_SETCURSOR: { - Rng2F32 window_rect = os_client_rect_from_window(window_handle); - Vec2F32 mouse = os_mouse_from_window(window_handle); + Rng2F32 window_rect = wm_client_rect_from_window(window_handle); + Vec2F32 mouse = wm_mouse_from_window(window_handle); B32 on_border = 0; DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0; B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW); @@ -535,9 +535,9 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) B32 on_border_y = (mouse.y <= window->custom_border_edge_thickness || window_rect.y1-window->custom_border_edge_thickness <= mouse.y); on_border = on_border_x || on_border_y; } - if(!os_w32_resizing && !on_border && contains_2f32(window_rect, mouse)) + if(!w32_wm_resizing && !on_border && contains_2f32(window_rect, mouse)) { - SetCursor(os_w32_gfx_state->hCursor); + SetCursor(w32_wm_state->hCursor); } else { @@ -565,16 +565,16 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) POINT drop_pt = {0}; DragQueryPoint(drop, &drop_pt); U64 num_files_dropped = DragQueryFile(drop, 0xffffffff, 0, 0); - OS_Event *event = os_w32_push_event(OS_EventKind_FileDrop, window); + WM_Event *event = w32_wm_push_event(WM_EventKind_FileDrop, window); event->pos = v2f32((F32)drop_pt.x, (F32)drop_pt.y); for(U64 idx = 0; idx < num_files_dropped; idx += 1) { U64 name_size = DragQueryFile(drop, idx, 0, 0) + 1; - U8 *name_ptr = push_array(os_w32_event_arena, U8, name_size); + U8 *name_ptr = push_array(w32_wm_event_arena, U8, name_size); DragQueryFile(drop, idx, (char *)name_ptr, name_size); String8 path_string = str8(name_ptr, name_size - 1); - String8 path_string__normalized = path_normalized_from_string(os_w32_event_arena, path_string); - str8_list_push(os_w32_event_arena, &event->strings, path_string__normalized); + String8 path_string__normalized = path_normalized_from_string(w32_wm_event_arena, path_string); + str8_list_push(w32_wm_event_arena, &event->strings, path_string__normalized); } DragFinish(drop); }break; @@ -582,7 +582,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //- rjf: [custom border] case WM_NCPAINT: { - if(os_w32_new_window_custom_border || (window != 0 && window->custom_border && !window->custom_border_composition_enabled)) + if(w32_wm_new_window_custom_border || (window != 0 && window->custom_border && !window->custom_border_composition_enabled)) { result = 0; } @@ -619,7 +619,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_NCUAHDRAWFRAME: { // NOTE(rjf): undocumented messages for drawing themed window borders. - if(os_w32_new_window_custom_border || (window != 0 && window->custom_border)) + if(w32_wm_new_window_custom_border || (window != 0 && window->custom_border)) { result = 0; } @@ -631,7 +631,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_SETICON: case WM_SETTEXT: { - if(os_w32_new_window_custom_border || (window && window->custom_border && !window->custom_border_composition_enabled)) + if(w32_wm_new_window_custom_border || (window && window->custom_border && !window->custom_border_composition_enabled)) { // NOTE(rjf): // https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/ @@ -649,7 +649,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //- rjf: [custom border] activation - without this `result`, stuff flickers. case WM_NCACTIVATE: { - if(!os_w32_new_window_custom_border && (window == 0 || window->custom_border == 0)) + if(!w32_wm_new_window_custom_border && (window == 0 || window->custom_border == 0)) { result = DefWindowProcW(hwnd, uMsg, wParam, lParam); } @@ -662,7 +662,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //- rjf: [custom border] client/window size calculation case WM_NCCALCSIZE: { - if(os_w32_new_window_custom_border || (window && window->custom_border)) + if(w32_wm_new_window_custom_border || (window && window->custom_border)) { F32 dpi = w32_GetDpiForWindow_func ? (F32)w32_GetDpiForWindow_func(hwnd) : 96.f; S32 frame_x = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXFRAME, dpi) : GetSystemMetrics(SM_CXFRAME); @@ -742,7 +742,7 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //- rjf: check against title bar client areas B32 is_over_title_bar_client_area = 0; - for(OS_W32_TitleBarClientArea *area = window->first_title_bar_client_area; + for(W32_WM_TitleBarClientArea *area = window->first_title_bar_client_area; area != 0; area = area->next) { @@ -803,11 +803,11 @@ os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //~ rjf: Monitors internal BOOL -os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr) +w32_wm_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr) { - OS_W32_MonitorGatherBundle *bundle = (OS_W32_MonitorGatherBundle *)bundle_ptr; - OS_Monitor m = {(U64)monitor}; - OS_W32_MonitorGatherNode *n = push_array(bundle->arena, OS_W32_MonitorGatherNode, 1); + W32_WM_MonitorGatherBundle *bundle = (W32_WM_MonitorGatherBundle *)bundle_ptr; + WM_Monitor m = {(U64)monitor}; + W32_WM_MonitorGatherNode *n = push_array(bundle->arena, W32_WM_MonitorGatherNode, 1); n->v = m; SLLQueuePush(bundle->first_monitor, bundle->last_monitor, n); bundle->monitor_count += 1; @@ -818,14 +818,14 @@ os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM b //~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) internal void -os_gfx_init(void) +wm_init(void) { //- rjf: set up base shared state Arena *arena = arena_alloc(); - os_w32_gfx_state = push_array(arena, OS_W32_GfxState, 1); - os_w32_gfx_state->arena = arena; - os_w32_gfx_state->gfx_thread_tid = (U32)GetCurrentThreadId(); - os_w32_gfx_state->hInstance = GetModuleHandle(0); + w32_wm_state = push_array(arena, W32_WM_State, 1); + w32_wm_state->arena = arena; + w32_wm_state->gfx_thread_tid = (U32)GetCurrentThreadId(); + w32_wm_state->hInstance = GetModuleHandle(0); //- rjf: set dpi awareness w32_SetProcessDpiAwarenessContext_Type *SetProcessDpiAwarenessContext_func = 0; @@ -863,11 +863,11 @@ os_gfx_init(void) //- rjf: register graphical-window class { WNDCLASSEXW wndclass = {sizeof(wndclass)}; - wndclass.lpfnWndProc = os_w32_wnd_proc; - wndclass.hInstance = os_w32_gfx_state->hInstance; + wndclass.lpfnWndProc = w32_wm_wnd_proc; + wndclass.hInstance = w32_wm_state->hInstance; wndclass.lpszClassName = L"graphical-window"; wndclass.hCursor = LoadCursorA(0, IDC_ARROW); - wndclass.hIcon = LoadIcon(os_w32_gfx_state->hInstance, MAKEINTRESOURCE(1)); + wndclass.hIcon = LoadIcon(w32_wm_state->hInstance, MAKEINTRESOURCE(1)); wndclass.style = CS_VREDRAW|CS_HREDRAW; ATOM wndatom = RegisterClassExW(&wndclass); (void)wndatom; @@ -875,121 +875,121 @@ os_gfx_init(void) //- rjf: grab graphics system info { - os_w32_gfx_state->gfx_info.double_click_time = GetDoubleClickTime()/1000.f; - os_w32_gfx_state->gfx_info.caret_blink_time = GetCaretBlinkTime()/1000.f; + w32_wm_state->gfx_info.double_click_time = GetDoubleClickTime()/1000.f; + w32_wm_state->gfx_info.caret_blink_time = GetCaretBlinkTime()/1000.f; DEVMODEW devmodew = {0}; if(EnumDisplaySettingsW(0, ENUM_CURRENT_SETTINGS, &devmodew)) { - os_w32_gfx_state->gfx_info.default_refresh_rate = (F32)devmodew.dmDisplayFrequency; + w32_wm_state->gfx_info.default_refresh_rate = (F32)devmodew.dmDisplayFrequency; } } //- rjf: set initial cursor - os_set_cursor(OS_Cursor_Pointer); + wm_set_cursor(WM_Cursor_Pointer); - //- rjf: fill vkey -> OS_Key table + //- rjf: fill vkey -> WM_Key table { - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'A'] = OS_Key_A; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'B'] = OS_Key_B; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'C'] = OS_Key_C; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'D'] = OS_Key_D; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'E'] = OS_Key_E; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'F'] = OS_Key_F; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'G'] = OS_Key_G; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'H'] = OS_Key_H; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'I'] = OS_Key_I; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'J'] = OS_Key_J; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'K'] = OS_Key_K; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'L'] = OS_Key_L; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'M'] = OS_Key_M; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'N'] = OS_Key_N; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'O'] = OS_Key_O; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'P'] = OS_Key_P; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Q'] = OS_Key_Q; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'R'] = OS_Key_R; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'S'] = OS_Key_S; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'T'] = OS_Key_T; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'U'] = OS_Key_U; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'V'] = OS_Key_V; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'W'] = OS_Key_W; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'X'] = OS_Key_X; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Y'] = OS_Key_Y; - os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Z'] = OS_Key_Z; + w32_wm_state->key_from_vkey_table[(unsigned int)'A'] = WM_Key_A; + w32_wm_state->key_from_vkey_table[(unsigned int)'B'] = WM_Key_B; + w32_wm_state->key_from_vkey_table[(unsigned int)'C'] = WM_Key_C; + w32_wm_state->key_from_vkey_table[(unsigned int)'D'] = WM_Key_D; + w32_wm_state->key_from_vkey_table[(unsigned int)'E'] = WM_Key_E; + w32_wm_state->key_from_vkey_table[(unsigned int)'F'] = WM_Key_F; + w32_wm_state->key_from_vkey_table[(unsigned int)'G'] = WM_Key_G; + w32_wm_state->key_from_vkey_table[(unsigned int)'H'] = WM_Key_H; + w32_wm_state->key_from_vkey_table[(unsigned int)'I'] = WM_Key_I; + w32_wm_state->key_from_vkey_table[(unsigned int)'J'] = WM_Key_J; + w32_wm_state->key_from_vkey_table[(unsigned int)'K'] = WM_Key_K; + w32_wm_state->key_from_vkey_table[(unsigned int)'L'] = WM_Key_L; + w32_wm_state->key_from_vkey_table[(unsigned int)'M'] = WM_Key_M; + w32_wm_state->key_from_vkey_table[(unsigned int)'N'] = WM_Key_N; + w32_wm_state->key_from_vkey_table[(unsigned int)'O'] = WM_Key_O; + w32_wm_state->key_from_vkey_table[(unsigned int)'P'] = WM_Key_P; + w32_wm_state->key_from_vkey_table[(unsigned int)'Q'] = WM_Key_Q; + w32_wm_state->key_from_vkey_table[(unsigned int)'R'] = WM_Key_R; + w32_wm_state->key_from_vkey_table[(unsigned int)'S'] = WM_Key_S; + w32_wm_state->key_from_vkey_table[(unsigned int)'T'] = WM_Key_T; + w32_wm_state->key_from_vkey_table[(unsigned int)'U'] = WM_Key_U; + w32_wm_state->key_from_vkey_table[(unsigned int)'V'] = WM_Key_V; + w32_wm_state->key_from_vkey_table[(unsigned int)'W'] = WM_Key_W; + w32_wm_state->key_from_vkey_table[(unsigned int)'X'] = WM_Key_X; + w32_wm_state->key_from_vkey_table[(unsigned int)'Y'] = WM_Key_Y; + w32_wm_state->key_from_vkey_table[(unsigned int)'Z'] = WM_Key_Z; - for(U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1) + for(U64 i = '0', j = WM_Key_0; i <= '9'; i += 1, j += 1) { - os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + w32_wm_state->key_from_vkey_table[i] = (WM_Key)j; } - for(U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1) + for(U64 i = VK_NUMPAD0, j = WM_Key_0; i <= VK_NUMPAD9; i += 1, j += 1) { - os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + w32_wm_state->key_from_vkey_table[i] = (WM_Key)j; } - for(U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1) + for(U64 i = VK_F1, j = WM_Key_F1; i <= VK_F24; i += 1, j += 1) { - os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j; + w32_wm_state->key_from_vkey_table[i] = (WM_Key)j; } - os_w32_gfx_state->key_from_vkey_table[VK_SPACE] = OS_Key_Space; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_3] = OS_Key_Tick; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_MINUS] = OS_Key_Minus; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_PLUS] = OS_Key_Equal; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_4] = OS_Key_LeftBracket; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_6] = OS_Key_RightBracket; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_1] = OS_Key_Semicolon; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_7] = OS_Key_Quote; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_COMMA] = OS_Key_Comma; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_PERIOD]= OS_Key_Period; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_2] = OS_Key_Slash; - os_w32_gfx_state->key_from_vkey_table[VK_OEM_5] = OS_Key_BackSlash; + w32_wm_state->key_from_vkey_table[VK_SPACE] = WM_Key_Space; + w32_wm_state->key_from_vkey_table[VK_OEM_3] = WM_Key_Tick; + w32_wm_state->key_from_vkey_table[VK_OEM_MINUS] = WM_Key_Minus; + w32_wm_state->key_from_vkey_table[VK_OEM_PLUS] = WM_Key_Equal; + w32_wm_state->key_from_vkey_table[VK_OEM_4] = WM_Key_LeftBracket; + w32_wm_state->key_from_vkey_table[VK_OEM_6] = WM_Key_RightBracket; + w32_wm_state->key_from_vkey_table[VK_OEM_1] = WM_Key_Semicolon; + w32_wm_state->key_from_vkey_table[VK_OEM_7] = WM_Key_Quote; + w32_wm_state->key_from_vkey_table[VK_OEM_COMMA] = WM_Key_Comma; + w32_wm_state->key_from_vkey_table[VK_OEM_PERIOD]= WM_Key_Period; + w32_wm_state->key_from_vkey_table[VK_OEM_2] = WM_Key_Slash; + w32_wm_state->key_from_vkey_table[VK_OEM_5] = WM_Key_BackSlash; - os_w32_gfx_state->key_from_vkey_table[VK_TAB] = OS_Key_Tab; - os_w32_gfx_state->key_from_vkey_table[VK_PAUSE] = OS_Key_Pause; - os_w32_gfx_state->key_from_vkey_table[VK_ESCAPE] = OS_Key_Esc; + w32_wm_state->key_from_vkey_table[VK_TAB] = WM_Key_Tab; + w32_wm_state->key_from_vkey_table[VK_PAUSE] = WM_Key_Pause; + w32_wm_state->key_from_vkey_table[VK_ESCAPE] = WM_Key_Esc; - os_w32_gfx_state->key_from_vkey_table[VK_UP] = OS_Key_Up; - os_w32_gfx_state->key_from_vkey_table[VK_LEFT] = OS_Key_Left; - os_w32_gfx_state->key_from_vkey_table[VK_DOWN] = OS_Key_Down; - os_w32_gfx_state->key_from_vkey_table[VK_RIGHT] = OS_Key_Right; + w32_wm_state->key_from_vkey_table[VK_UP] = WM_Key_Up; + w32_wm_state->key_from_vkey_table[VK_LEFT] = WM_Key_Left; + w32_wm_state->key_from_vkey_table[VK_DOWN] = WM_Key_Down; + w32_wm_state->key_from_vkey_table[VK_RIGHT] = WM_Key_Right; - os_w32_gfx_state->key_from_vkey_table[VK_BACK] = OS_Key_Backspace; - os_w32_gfx_state->key_from_vkey_table[VK_RETURN] = OS_Key_Return; + w32_wm_state->key_from_vkey_table[VK_BACK] = WM_Key_Backspace; + w32_wm_state->key_from_vkey_table[VK_RETURN] = WM_Key_Return; - os_w32_gfx_state->key_from_vkey_table[VK_DELETE] = OS_Key_Delete; - os_w32_gfx_state->key_from_vkey_table[VK_INSERT] = OS_Key_Insert; - os_w32_gfx_state->key_from_vkey_table[VK_PRIOR] = OS_Key_PageUp; - os_w32_gfx_state->key_from_vkey_table[VK_NEXT] = OS_Key_PageDown; - os_w32_gfx_state->key_from_vkey_table[VK_HOME] = OS_Key_Home; - os_w32_gfx_state->key_from_vkey_table[VK_END] = OS_Key_End; + w32_wm_state->key_from_vkey_table[VK_DELETE] = WM_Key_Delete; + w32_wm_state->key_from_vkey_table[VK_INSERT] = WM_Key_Insert; + w32_wm_state->key_from_vkey_table[VK_PRIOR] = WM_Key_PageUp; + w32_wm_state->key_from_vkey_table[VK_NEXT] = WM_Key_PageDown; + w32_wm_state->key_from_vkey_table[VK_HOME] = WM_Key_Home; + w32_wm_state->key_from_vkey_table[VK_END] = WM_Key_End; - os_w32_gfx_state->key_from_vkey_table[VK_CAPITAL] = OS_Key_CapsLock; - os_w32_gfx_state->key_from_vkey_table[VK_NUMLOCK] = OS_Key_NumLock; - os_w32_gfx_state->key_from_vkey_table[VK_SCROLL] = OS_Key_ScrollLock; - os_w32_gfx_state->key_from_vkey_table[VK_APPS] = OS_Key_Menu; + w32_wm_state->key_from_vkey_table[VK_CAPITAL] = WM_Key_CapsLock; + w32_wm_state->key_from_vkey_table[VK_NUMLOCK] = WM_Key_NumLock; + w32_wm_state->key_from_vkey_table[VK_SCROLL] = WM_Key_ScrollLock; + w32_wm_state->key_from_vkey_table[VK_APPS] = WM_Key_Menu; - os_w32_gfx_state->key_from_vkey_table[VK_CONTROL] = OS_Key_Ctrl; - os_w32_gfx_state->key_from_vkey_table[VK_LCONTROL] = OS_Key_Ctrl; - os_w32_gfx_state->key_from_vkey_table[VK_RCONTROL] = OS_Key_Ctrl; - os_w32_gfx_state->key_from_vkey_table[VK_SHIFT] = OS_Key_Shift; - os_w32_gfx_state->key_from_vkey_table[VK_LSHIFT] = OS_Key_Shift; - os_w32_gfx_state->key_from_vkey_table[VK_RSHIFT] = OS_Key_Shift; - os_w32_gfx_state->key_from_vkey_table[VK_MENU] = OS_Key_Alt; - os_w32_gfx_state->key_from_vkey_table[VK_LMENU] = OS_Key_Alt; - os_w32_gfx_state->key_from_vkey_table[VK_RMENU] = OS_Key_Alt; + w32_wm_state->key_from_vkey_table[VK_CONTROL] = WM_Key_Ctrl; + w32_wm_state->key_from_vkey_table[VK_LCONTROL] = WM_Key_Ctrl; + w32_wm_state->key_from_vkey_table[VK_RCONTROL] = WM_Key_Ctrl; + w32_wm_state->key_from_vkey_table[VK_SHIFT] = WM_Key_Shift; + w32_wm_state->key_from_vkey_table[VK_LSHIFT] = WM_Key_Shift; + w32_wm_state->key_from_vkey_table[VK_RSHIFT] = WM_Key_Shift; + w32_wm_state->key_from_vkey_table[VK_MENU] = WM_Key_Alt; + w32_wm_state->key_from_vkey_table[VK_LMENU] = WM_Key_Alt; + w32_wm_state->key_from_vkey_table[VK_RMENU] = WM_Key_Alt; - os_w32_gfx_state->key_from_vkey_table[VK_DIVIDE] = OS_Key_NumSlash; - os_w32_gfx_state->key_from_vkey_table[VK_MULTIPLY] = OS_Key_NumStar; - os_w32_gfx_state->key_from_vkey_table[VK_SUBTRACT] = OS_Key_NumMinus; - os_w32_gfx_state->key_from_vkey_table[VK_ADD] = OS_Key_NumPlus; - os_w32_gfx_state->key_from_vkey_table[VK_DECIMAL] = OS_Key_NumPeriod; + w32_wm_state->key_from_vkey_table[VK_DIVIDE] = WM_Key_NumSlash; + w32_wm_state->key_from_vkey_table[VK_MULTIPLY] = WM_Key_NumStar; + w32_wm_state->key_from_vkey_table[VK_SUBTRACT] = WM_Key_NumMinus; + w32_wm_state->key_from_vkey_table[VK_ADD] = WM_Key_NumPlus; + w32_wm_state->key_from_vkey_table[VK_DECIMAL] = WM_Key_NumPeriod; for(U32 i = 0; i < 10; i += 1) { - os_w32_gfx_state->key_from_vkey_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i); + w32_wm_state->key_from_vkey_table[VK_NUMPAD0 + i] = (WM_Key)((U64)WM_Key_Num0 + i); } for(U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1) { - os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j); + w32_wm_state->key_from_vkey_table[i] = (WM_Key)((U64)WM_Key_Ex0 + j); } } } @@ -997,17 +997,17 @@ os_gfx_init(void) //////////////////////////////// //~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) -internal OS_GfxInfo * -os_get_gfx_info(void) +internal WM_SystemInfo * +wm_get_system_info(void) { - return &os_w32_gfx_state->gfx_info; + return &w32_wm_state->gfx_info; } //////////////////////////////// //~ rjf: @os_hooks Clipboards (Implemented Per-OS) internal void -os_set_clipboard_text(String8 string) +wm_set_clipboard_text(String8 string) { Temp scratch = scratch_begin(0, 0); if(OpenClipboard(0)) @@ -1029,7 +1029,7 @@ os_set_clipboard_text(String8 string) } internal String8 -os_get_clipboard_text(Arena *arena) +wm_get_clipboard_text(Arena *arena) { String8 result = {0}; if(IsClipboardFormatAvailable(CF_UNICODETEXT) && @@ -1055,11 +1055,11 @@ os_get_clipboard_text(Arena *arena) //////////////////////////////// //~ rjf: @os_hooks Windows (Implemented Per-OS) -internal OS_Window -os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) +internal WM_Window +wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) { - B32 custom_border = !!(flags & OS_WindowFlag_CustomBorder); - B32 use_default_position = !!(flags & OS_WindowFlag_UseDefaultPosition); + B32 custom_border = !!(flags & WM_WindowFlag_CustomBorder); + B32 use_default_position = !!(flags & WM_WindowFlag_UseDefaultPosition); Vec2F32 pos = rect.p0; Vec2F32 dim = dim_2f32(rect); @@ -1068,7 +1068,7 @@ os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) { Temp scratch = scratch_begin(0, 0); String16 title16 = str16_from_8(scratch.arena, title); - os_w32_new_window_custom_border = custom_border; + w32_wm_new_window_custom_border = custom_border; DWORD style_flags = WS_EX_APPWINDOW; #if defined(R_BACKEND) && R_BACKEND != R_BACKEND_OPENGL style_flags |= WS_EX_NOREDIRECTIONBITMAP; @@ -1082,15 +1082,15 @@ os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) (S32)dim.x, (S32)dim.y, 0, 0, - os_w32_gfx_state->hInstance, + w32_wm_state->hInstance, 0); DragAcceptFiles(hwnd, 1); - os_w32_new_window_custom_border = 0; + w32_wm_new_window_custom_border = 0; scratch_end(scratch); } //- rjf- make/fill window - OS_W32_Window *window = os_w32_window_alloc(); + W32_WM_Window *window = w32_wm_window_alloc(); { window->hwnd = hwnd; window->hdc = GetDC(hwnd); @@ -1112,38 +1112,38 @@ os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) } //- rjf: custom border - if(flags & OS_WindowFlag_CustomBorder) + if(flags & WM_WindowFlag_CustomBorder) { window->custom_border = 1; window->paint_arena = arena_alloc(); } //- rjf: convert to handle + return - OS_Window result = os_w32_handle_from_window(window); + WM_Window result = w32_wm_handle_from_window(window); return result; } internal void -os_window_close(OS_Window handle) +wm_window_close(WM_Window handle) { - OS_W32_Window *window = os_w32_window_from_handle(handle); - os_w32_window_release(window); + W32_WM_Window *window = w32_wm_window_from_handle(handle); + w32_wm_window_release(window); } internal void -os_window_set_title(OS_Window handle, String8 title) +wm_window_set_title(WM_Window handle, String8 title) { Temp scratch = scratch_begin(0, 0); - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); String16 title16 = str16_from_8(scratch.arena, title); SetWindowTextW(window->hwnd, (WCHAR *)title16.str); scratch_end(scratch); } internal void -os_window_first_paint(OS_Window window_handle) +wm_window_first_paint(WM_Window window_handle) { - OS_W32_Window *window = os_w32_window_from_handle(window_handle); + W32_WM_Window *window = w32_wm_window_from_handle(window_handle); window->first_paint_done = 1; ShowWindow(window->hwnd, SW_SHOW); if(window->maximized) @@ -1153,35 +1153,35 @@ os_window_first_paint(OS_Window window_handle) } internal void -os_window_focus(OS_Window handle) +wm_window_focus(WM_Window handle) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); SetForegroundWindow(window->hwnd); SetFocus(window->hwnd); } internal B32 -os_window_is_focused(OS_Window handle) +wm_window_is_focused(WM_Window handle) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); HWND active_hwnd = GetActiveWindow(); return active_hwnd == window->hwnd; } internal B32 -os_window_is_fullscreen(OS_Window handle) +wm_window_is_fullscreen(WM_Window handle) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); return !(window_style & WS_OVERLAPPEDWINDOW); } internal void -os_window_set_fullscreen(OS_Window handle, B32 fullscreen) +wm_window_set_fullscreen(WM_Window handle, B32 fullscreen) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE); - B32 is_fullscreen_already = os_window_is_fullscreen(handle); + B32 is_fullscreen_already = wm_window_is_fullscreen(handle); if(fullscreen) { if(!is_fullscreen_already) @@ -1211,10 +1211,10 @@ os_window_set_fullscreen(OS_Window handle, B32 fullscreen) } internal B32 -os_window_is_maximized(OS_Window handle) +wm_window_is_maximized(WM_Window handle) { B32 result = 0; - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window) { result = !!(IsZoomed(window->hwnd)); @@ -1223,9 +1223,9 @@ os_window_is_maximized(OS_Window handle) } internal void -os_window_set_maximized(OS_Window handle, B32 maximized) +wm_window_set_maximized(WM_Window handle, B32 maximized) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window != 0) { if(window->first_paint_done) @@ -1245,10 +1245,10 @@ os_window_set_maximized(OS_Window handle, B32 maximized) } internal B32 -os_window_is_minimized(OS_Window handle) +wm_window_is_minimized(WM_Window handle) { B32 result = 0; - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window) { result = !!(IsIconic(window->hwnd)); @@ -1257,10 +1257,10 @@ os_window_is_minimized(OS_Window handle) } internal void -os_window_set_minimized(OS_Window handle, B32 minimized) +wm_window_set_minimized(WM_Window handle, B32 minimized) { - OS_W32_Window *window = os_w32_window_from_handle(handle); - if(window != 0 && minimized != os_window_is_minimized(handle)) + W32_WM_Window *window = w32_wm_window_from_handle(handle); + if(window != 0 && minimized != wm_window_is_minimized(handle)) { switch(minimized) { @@ -1272,9 +1272,9 @@ os_window_set_minimized(OS_Window handle, B32 minimized) } internal void -os_window_bring_to_front(OS_Window handle) +wm_window_bring_to_front(WM_Window handle) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window != 0) { BringWindowToTop(window->hwnd); @@ -1282,16 +1282,16 @@ os_window_bring_to_front(OS_Window handle) } internal void -os_window_set_monitor(OS_Window window_handle, OS_Monitor monitor) +wm_window_set_monitor(WM_Window window_handle, WM_Monitor monitor) { - OS_W32_Window *window = os_w32_window_from_handle(window_handle); + W32_WM_Window *window = w32_wm_window_from_handle(window_handle); HMONITOR hmonitor = (HMONITOR)monitor.u64[0]; { MONITORINFOEXW info; info.cbSize = sizeof(MONITORINFOEXW); if(GetMonitorInfoW(hmonitor, (MONITORINFO *)&info)) { - Rng2F32 existing_rect = os_rect_from_window(window_handle); + Rng2F32 existing_rect = wm_rect_from_window(window_handle); Vec2F32 window_size = dim_2f32(existing_rect); SetWindowPos(window->hwnd, HWND_TOP, (info.rcWork.left + info.rcWork.right)/2 - window_size.x/2, @@ -1303,9 +1303,9 @@ os_window_set_monitor(OS_Window window_handle, OS_Monitor monitor) } internal void -os_window_clear_custom_border_data(OS_Window handle) +wm_window_clear_custom_border_data(WM_Window handle) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window->custom_border) { arena_clear(window->paint_arena); @@ -1316,26 +1316,26 @@ os_window_clear_custom_border_data(OS_Window handle) } internal void -os_window_push_custom_title_bar(OS_Window handle, F32 thickness) +wm_window_push_custom_title_bar(WM_Window handle, F32 thickness) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); window->custom_border_title_thickness = thickness; } internal void -os_window_push_custom_edges(OS_Window handle, F32 thickness) +wm_window_push_custom_edges(WM_Window handle, F32 thickness) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); window->custom_border_edge_thickness = thickness; } internal void -os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect) +wm_window_push_custom_title_bar_client_area(WM_Window handle, Rng2F32 rect) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window->custom_border) { - OS_W32_TitleBarClientArea *area = push_array(window->paint_arena, OS_W32_TitleBarClientArea, 1); + W32_WM_TitleBarClientArea *area = push_array(window->paint_arena, W32_WM_TitleBarClientArea, 1); if(area != 0) { area->rect = rect; @@ -1345,38 +1345,38 @@ os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect) } internal Rng2F32 -os_rect_from_window(OS_Window handle) +wm_rect_from_window(WM_Window handle) { Rng2F32 r = {0}; - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window) { RECT rect = {0}; - GetWindowRect(os_w32_hwnd_from_window(window), &rect); - r = os_w32_rng2f32_from_rect(rect); + GetWindowRect(w32_wm_hwnd_from_window(window), &rect); + r = w32_wm_rng2f32_from_rect(rect); } return r; } internal Rng2F32 -os_client_rect_from_window(OS_Window handle) +wm_client_rect_from_window(WM_Window handle) { Rng2F32 r = {0}; - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window) { RECT rect = {0}; - GetClientRect(os_w32_hwnd_from_window(window), &rect); - r = os_w32_rng2f32_from_rect(rect); + GetClientRect(w32_wm_hwnd_from_window(window), &rect); + r = w32_wm_rng2f32_from_rect(rect); } return r; } internal F32 -os_dpi_from_window(OS_Window handle) +wm_dpi_from_window(WM_Window handle) { F32 result = 96.f; - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); if(window != 0) { result = window->dpi; @@ -1387,16 +1387,16 @@ os_dpi_from_window(OS_Window handle) //////////////////////////////// //~ rjf: @os_hooks External Windows (Implemented Per-OS) -internal OS_ExternalWindow -os_focused_external_window(void) +internal WM_ExtWindow +wm_focused_external_window(void) { HWND hwnd = GetForegroundWindow(); - OS_ExternalWindow result = {(U64)hwnd}; + WM_ExtWindow result = {(U64)hwnd}; return result; } internal void -os_focus_external_window(OS_ExternalWindow handle) +wm_focus_external_window(WM_ExtWindow handle) { HWND hwnd = (HWND)handle.u64[0]; if(hwnd != 0) @@ -1409,18 +1409,18 @@ os_focus_external_window(OS_ExternalWindow handle) //////////////////////////////// //~ rjf: @os_hooks Monitors (Implemented Per-OS) -internal OS_MonitorArray -os_push_monitors_array(Arena *arena) +internal WM_MonitorArray +wm_push_monitors_array(Arena *arena) { Temp scratch = scratch_begin(&arena, 1); - OS_W32_MonitorGatherBundle bundle = {arena}; - EnumDisplayMonitors(0, 0, os_w32_monitor_gather_enum_proc, (LPARAM)&bundle); - OS_MonitorArray array = {0}; + W32_WM_MonitorGatherBundle bundle = {arena}; + EnumDisplayMonitors(0, 0, w32_wm_monitor_gather_enum_proc, (LPARAM)&bundle); + WM_MonitorArray array = {0}; array.count = bundle.monitor_count; - array.v = push_array(arena, OS_Monitor, array.count); + array.v = push_array(arena, WM_Monitor, array.count); { U64 idx = 0; - for EachNode(n, OS_W32_MonitorGatherNode, bundle.first_monitor) + for EachNode(n, W32_WM_MonitorGatherNode, bundle.first_monitor) { array.v[idx] = n->v; idx += 1; @@ -1430,26 +1430,26 @@ os_push_monitors_array(Arena *arena) return array; } -internal OS_Monitor -os_primary_monitor(void) +internal WM_Monitor +wm_primary_monitor(void) { POINT zero_pt = {0, 0}; HMONITOR monitor = MonitorFromPoint(zero_pt, MONITOR_DEFAULTTOPRIMARY); - OS_Monitor result = {(U64)monitor}; + WM_Monitor result = {(U64)monitor}; return result; } -internal OS_Monitor -os_monitor_from_window(OS_Window window) +internal WM_Monitor +wm_monitor_from_window(WM_Window window) { - OS_W32_Window *w = os_w32_window_from_handle(window); + W32_WM_Window *w = w32_wm_window_from_handle(window); HMONITOR handle = MonitorFromWindow(w->hwnd, MONITOR_DEFAULTTOPRIMARY); - OS_Monitor result = {(U64)handle}; + WM_Monitor result = {(U64)handle}; return result; } internal String8 -os_name_from_monitor(Arena *arena, OS_Monitor monitor) +wm_name_from_monitor(Arena *arena, WM_Monitor monitor) { String8 result = {0}; HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; @@ -1464,7 +1464,7 @@ os_name_from_monitor(Arena *arena, OS_Monitor monitor) } internal Vec2F32 -os_dim_from_monitor(OS_Monitor monitor) +wm_dim_from_monitor(WM_Monitor monitor) { Vec2F32 result = {0}; HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; @@ -1479,7 +1479,7 @@ os_dim_from_monitor(OS_Monitor monitor) } internal F32 -os_dpi_from_monitor(OS_Monitor monitor) +wm_dpi_from_monitor(WM_Monitor monitor) { F32 result = 96.f; HMONITOR monitor_handle = (HMONITOR)monitor.u64[0]; @@ -1497,16 +1497,16 @@ os_dpi_from_monitor(OS_Monitor monitor) //~ rjf: @os_hooks Events (Implemented Per-OS) internal void -os_send_wakeup_event(void) +wm_send_wakeup_event(void) { - PostThreadMessageA(os_w32_gfx_state->gfx_thread_tid, 0x401, 0, 0); + PostThreadMessageA(w32_wm_state->gfx_thread_tid, 0x401, 0, 0); } -internal OS_EventList -os_get_events(Arena *arena, B32 wait) +internal WM_EventList +wm_get_events(Arena *arena, B32 wait) { - os_w32_event_arena = arena; - MemoryZeroStruct(&os_w32_event_list); + w32_wm_event_arena = arena; + MemoryZeroStruct(&w32_wm_event_list); MSG msg = {0}; if(!wait || GetMessage(&msg, 0, 0, 0)) { @@ -1517,37 +1517,37 @@ os_get_events(Arena *arena, B32 wait) TranslateMessage(&msg); if(msg.message == WM_QUIT) { - os_w32_push_event(OS_EventKind_WindowClose, 0); + w32_wm_push_event(WM_EventKind_WindowClose, 0); } } } - return os_w32_event_list; + return w32_wm_event_list; } -internal OS_Modifiers -os_get_modifiers(void) +internal WM_Modifiers +wm_get_modifiers(void) { - OS_Modifiers modifiers = 0; + WM_Modifiers modifiers = 0; if(GetKeyState(VK_CONTROL) & 0x8000) { - modifiers |= OS_Modifier_Ctrl; + modifiers |= WM_Modifier_Ctrl; } if(GetKeyState(VK_SHIFT) & 0x8000) { - modifiers |= OS_Modifier_Shift; + modifiers |= WM_Modifier_Shift; } if(GetKeyState(VK_MENU) & 0x8000) { - modifiers |= OS_Modifier_Alt; + modifiers |= WM_Modifier_Alt; } return modifiers; } internal B32 -os_key_is_down(OS_Key key) +wm_key_is_down(WM_Key key) { B32 down = 0; - WPARAM vkey = os_w32_vkey_from_os_key(key); + WPARAM vkey = w32_wm_vkey_from_os_key(key); if(GetKeyState(vkey) & 0x8000) { down = 1; @@ -1556,14 +1556,14 @@ os_key_is_down(OS_Key key) } internal Vec2F32 -os_mouse_from_window(OS_Window handle) +wm_mouse_from_window(WM_Window handle) { ProfBeginFunction(); Vec2F32 v = {0}; POINT p; if(GetCursorPos(&p)) { - OS_W32_Window *window = os_w32_window_from_handle(handle); + W32_WM_Window *window = w32_wm_window_from_handle(handle); ScreenToClient(window->hwnd, &p); v.x = (F32)p.x; v.y = (F32)p.y; @@ -1576,7 +1576,7 @@ os_mouse_from_window(OS_Window handle) //~ rjf: @os_hooks Cursors (Implemented Per-OS) internal void -os_set_cursor(OS_Cursor cursor) +wm_set_cursor(WM_Cursor cursor) { B32 valid_cursor = 1; HCURSOR hcursor = 0; @@ -1593,7 +1593,7 @@ X(UpRight, IDC_SIZENESW) \ X(UpDownLeftRight, IDC_SIZEALL) \ X(HandPoint, IDC_HAND)\ X(Disabled, IDC_NO) -#define CursorCase(E,R) case OS_Cursor_##E:{ \ +#define CursorCase(E,R) case WM_Cursor_##E:{ \ local_persist HCURSOR curs = 0; \ if (curs == 0){ curs = LoadCursor(NULL, R); } \ hcursor = curs; }break; @@ -1601,16 +1601,16 @@ hcursor = curs; }break; #undef CursorCase #undef Win32CursorXList } - if(valid_cursor && !os_w32_resizing) + if(valid_cursor && !w32_wm_resizing) { - if(hcursor != os_w32_gfx_state->hCursor) + if(hcursor != w32_wm_state->hCursor) { PostMessage(0, WM_SETCURSOR, 0, 0); POINT p = {0}; GetCursorPos(&p); SetCursorPos(p.x, p.y); } - os_w32_gfx_state->hCursor = hcursor; + w32_wm_state->hCursor = hcursor; } } @@ -1618,7 +1618,7 @@ hcursor = curs; }break; //~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) internal void -os_graphical_message(B32 error, String8 title, String8 message) +wm_graphical_message(B32 error, String8 title, String8 message) { Temp scratch = scratch_begin(0, 0); String16 title16 = str16_from_8(scratch.arena, title); @@ -1628,7 +1628,7 @@ os_graphical_message(B32 error, String8 title, String8 message) } internal String8 -os_graphical_pick_file(Arena *arena, String8 initial_path) +wm_graphical_pick_file(Arena *arena, String8 initial_path) { String8 result = {0}; { @@ -1654,7 +1654,7 @@ os_graphical_pick_file(Arena *arena, String8 initial_path) //~ rjf: @os_hooks Shell Operations internal void -os_show_in_filesystem_ui(String8 path) +wm_show_in_filesystem_ui(String8 path) { Temp scratch = scratch_begin(0, 0); String8 path_copy = push_str8_copy(scratch.arena, path); @@ -1678,7 +1678,7 @@ os_show_in_filesystem_ui(String8 path) } internal void -os_open_in_browser(String8 url) +wm_open_in_browser(String8 url) { Temp scratch = scratch_begin(0, 0); String16 url16 = str16_from_8(scratch.arena, url); diff --git a/src/win32/window_manager/win32_window_manager.h b/src/win32/window_manager/win32_window_manager.h index 90548121..6dd068c2 100644 --- a/src/win32/window_manager/win32_window_manager.h +++ b/src/win32/window_manager/win32_window_manager.h @@ -24,18 +24,18 @@ //////////////////////////////// //~ rjf: Windows -typedef struct OS_W32_TitleBarClientArea OS_W32_TitleBarClientArea; -struct OS_W32_TitleBarClientArea +typedef struct W32_WM_TitleBarClientArea W32_WM_TitleBarClientArea; +struct W32_WM_TitleBarClientArea { - OS_W32_TitleBarClientArea *next; + W32_WM_TitleBarClientArea *next; Rng2F32 rect; }; -typedef struct OS_W32_Window OS_W32_Window; -struct OS_W32_Window +typedef struct W32_WM_Window W32_WM_Window; +struct W32_WM_Window { - OS_W32_Window *next; - OS_W32_Window *prev; + W32_WM_Window *next; + W32_WM_Window *prev; HWND hwnd; HDC hdc; WINDOWPLACEMENT last_window_placement; @@ -47,77 +47,77 @@ struct OS_W32_Window F32 custom_border_edge_thickness; B32 custom_border_composition_enabled; Arena *paint_arena; - OS_W32_TitleBarClientArea *first_title_bar_client_area; - OS_W32_TitleBarClientArea *last_title_bar_client_area; + W32_WM_TitleBarClientArea *first_title_bar_client_area; + W32_WM_TitleBarClientArea *last_title_bar_client_area; }; //////////////////////////////// //~ rjf: Monitor Gathering Bundle -typedef struct OS_W32_MonitorGatherNode OS_W32_MonitorGatherNode; -struct OS_W32_MonitorGatherNode +typedef struct W32_WM_MonitorGatherNode W32_WM_MonitorGatherNode; +struct W32_WM_MonitorGatherNode { - OS_W32_MonitorGatherNode *next; - OS_Monitor v; + W32_WM_MonitorGatherNode *next; + WM_Monitor v; }; -typedef struct OS_W32_MonitorGatherBundle OS_W32_MonitorGatherBundle; -struct OS_W32_MonitorGatherBundle +typedef struct W32_WM_MonitorGatherBundle W32_WM_MonitorGatherBundle; +struct W32_WM_MonitorGatherBundle { Arena *arena; - OS_W32_MonitorGatherNode *first_monitor; - OS_W32_MonitorGatherNode *last_monitor; + W32_WM_MonitorGatherNode *first_monitor; + W32_WM_MonitorGatherNode *last_monitor; U64 monitor_count; }; //////////////////////////////// //~ rjf: Global State -typedef struct OS_W32_GfxState OS_W32_GfxState; -struct OS_W32_GfxState +typedef struct W32_WM_State W32_WM_State; +struct W32_WM_State { Arena *arena; U32 gfx_thread_tid; HINSTANCE hInstance; HCURSOR hCursor; - OS_GfxInfo gfx_info; - OS_W32_Window *first_window; - OS_W32_Window *last_window; - OS_W32_Window *free_window; - OS_Key key_from_vkey_table[256]; + WM_SystemInfo gfx_info; + W32_WM_Window *first_window; + W32_WM_Window *last_window; + W32_WM_Window *free_window; + WM_Key key_from_vkey_table[256]; }; //////////////////////////////// //~ rjf: Globals -global OS_W32_GfxState *os_w32_gfx_state = 0; -global OS_EventList os_w32_event_list = {0}; -global Arena *os_w32_event_arena = 0; -global B32 os_w32_resizing = 0; -global B32 os_w32_new_window_custom_border = 0; +global W32_WM_State *w32_wm_state = 0; +global WM_EventList w32_wm_event_list = {0}; +global Arena *w32_wm_event_arena = 0; +global B32 w32_wm_resizing = 0; +global B32 w32_wm_new_window_custom_border = 0; //////////////////////////////// //~ rjf: Basic Helpers -internal Rng2F32 os_w32_rng2f32_from_rect(RECT rect); +internal Rng2F32 w32_wm_rng2f32_from_rect(RECT rect); //////////////////////////////// //~ rjf: Windows -internal OS_Window os_w32_handle_from_window(OS_W32_Window *window); -internal OS_W32_Window * os_w32_window_from_handle(OS_Window window); -internal OS_W32_Window * os_w32_window_from_hwnd(HWND hwnd); -internal HWND os_w32_hwnd_from_window(OS_W32_Window *window); -internal OS_W32_Window * os_w32_window_alloc(void); -internal void os_w32_window_release(OS_W32_Window *window); -internal OS_Event * os_w32_push_event(OS_EventKind kind, OS_W32_Window *window); -internal OS_Key os_w32_os_key_from_vkey(WPARAM vkey); -internal WPARAM os_w32_vkey_from_os_key(OS_Key key); -internal LRESULT os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +internal WM_Window w32_wm_handle_from_window(W32_WM_Window *window); +internal W32_WM_Window * w32_wm_window_from_handle(WM_Window window); +internal W32_WM_Window * w32_wm_window_from_hwnd(HWND hwnd); +internal HWND w32_wm_hwnd_from_window(W32_WM_Window *window); +internal W32_WM_Window * w32_wm_window_alloc(void); +internal void w32_wm_window_release(W32_WM_Window *window); +internal WM_Event * w32_wm_push_event(WM_EventKind kind, W32_WM_Window *window); +internal WM_Key w32_wm_os_key_from_vkey(WPARAM vkey); +internal WPARAM w32_wm_vkey_from_os_key(WM_Key key); +internal LRESULT w32_wm_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //////////////////////////////// //~ rjf: Monitors -internal BOOL os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr); +internal BOOL w32_wm_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr); #endif // WIN32_WINDOW_MANAGER_H diff --git a/src/window_manager/generated/window_manager.meta.c b/src/window_manager/generated/window_manager.meta.c index a3f50334..555a6239 100644 --- a/src/window_manager/generated/window_manager.meta.c +++ b/src/window_manager/generated/window_manager.meta.c @@ -4,7 +4,7 @@ //- GENERATED CODE C_LINKAGE_BEGIN -String8 os_g_key_display_string_table[143] = +String8 wm_key_display_name_table[143] = { str8_lit_comp("Invalid Key"), str8_lit_comp("Escape"), @@ -151,7 +151,7 @@ str8_lit_comp("Middle Mouse Button"), str8_lit_comp("Right Mouse Button"), }; -String8 os_g_key_cfg_string_table[143] = +String8 wm_key_cfg_name_table[143] = { str8_lit_comp("null"), str8_lit_comp("esc"), diff --git a/src/window_manager/generated/window_manager.meta.h b/src/window_manager/generated/window_manager.meta.h index b81d453f..f5772be4 100644 --- a/src/window_manager/generated/window_manager.meta.h +++ b/src/window_manager/generated/window_manager.meta.h @@ -6,157 +6,157 @@ #ifndef WINDOW_MANAGER_META_H #define WINDOW_MANAGER_META_H -typedef enum OS_Key +typedef enum WM_Key { -OS_Key_Null, -OS_Key_Esc, -OS_Key_F1, -OS_Key_F2, -OS_Key_F3, -OS_Key_F4, -OS_Key_F5, -OS_Key_F6, -OS_Key_F7, -OS_Key_F8, -OS_Key_F9, -OS_Key_F10, -OS_Key_F11, -OS_Key_F12, -OS_Key_F13, -OS_Key_F14, -OS_Key_F15, -OS_Key_F16, -OS_Key_F17, -OS_Key_F18, -OS_Key_F19, -OS_Key_F20, -OS_Key_F21, -OS_Key_F22, -OS_Key_F23, -OS_Key_F24, -OS_Key_Tick, -OS_Key_0, -OS_Key_1, -OS_Key_2, -OS_Key_3, -OS_Key_4, -OS_Key_5, -OS_Key_6, -OS_Key_7, -OS_Key_8, -OS_Key_9, -OS_Key_Minus, -OS_Key_Equal, -OS_Key_Backspace, -OS_Key_Tab, -OS_Key_Q, -OS_Key_W, -OS_Key_E, -OS_Key_R, -OS_Key_T, -OS_Key_Y, -OS_Key_U, -OS_Key_I, -OS_Key_O, -OS_Key_P, -OS_Key_LeftBracket, -OS_Key_RightBracket, -OS_Key_BackSlash, -OS_Key_CapsLock, -OS_Key_A, -OS_Key_S, -OS_Key_D, -OS_Key_F, -OS_Key_G, -OS_Key_H, -OS_Key_J, -OS_Key_K, -OS_Key_L, -OS_Key_Semicolon, -OS_Key_Quote, -OS_Key_Return, -OS_Key_Shift, -OS_Key_Z, -OS_Key_X, -OS_Key_C, -OS_Key_V, -OS_Key_B, -OS_Key_N, -OS_Key_M, -OS_Key_Comma, -OS_Key_Period, -OS_Key_Slash, -OS_Key_Ctrl, -OS_Key_Alt, -OS_Key_Space, -OS_Key_Menu, -OS_Key_ScrollLock, -OS_Key_Pause, -OS_Key_Insert, -OS_Key_Home, -OS_Key_PageUp, -OS_Key_Delete, -OS_Key_End, -OS_Key_PageDown, -OS_Key_Up, -OS_Key_Left, -OS_Key_Down, -OS_Key_Right, -OS_Key_Ex0, -OS_Key_Ex1, -OS_Key_Ex2, -OS_Key_Ex3, -OS_Key_Ex4, -OS_Key_Ex5, -OS_Key_Ex6, -OS_Key_Ex7, -OS_Key_Ex8, -OS_Key_Ex9, -OS_Key_Ex10, -OS_Key_Ex11, -OS_Key_Ex12, -OS_Key_Ex13, -OS_Key_Ex14, -OS_Key_Ex15, -OS_Key_Ex16, -OS_Key_Ex17, -OS_Key_Ex18, -OS_Key_Ex19, -OS_Key_Ex20, -OS_Key_Ex21, -OS_Key_Ex22, -OS_Key_Ex23, -OS_Key_Ex24, -OS_Key_Ex25, -OS_Key_Ex26, -OS_Key_Ex27, -OS_Key_Ex28, -OS_Key_Ex29, -OS_Key_NumLock, -OS_Key_NumSlash, -OS_Key_NumStar, -OS_Key_NumMinus, -OS_Key_NumPlus, -OS_Key_NumPeriod, -OS_Key_Num0, -OS_Key_Num1, -OS_Key_Num2, -OS_Key_Num3, -OS_Key_Num4, -OS_Key_Num5, -OS_Key_Num6, -OS_Key_Num7, -OS_Key_Num8, -OS_Key_Num9, -OS_Key_LeftMouseButton, -OS_Key_MiddleMouseButton, -OS_Key_RightMouseButton, -OS_Key_COUNT, -} OS_Key; +WM_Key_Null, +WM_Key_Esc, +WM_Key_F1, +WM_Key_F2, +WM_Key_F3, +WM_Key_F4, +WM_Key_F5, +WM_Key_F6, +WM_Key_F7, +WM_Key_F8, +WM_Key_F9, +WM_Key_F10, +WM_Key_F11, +WM_Key_F12, +WM_Key_F13, +WM_Key_F14, +WM_Key_F15, +WM_Key_F16, +WM_Key_F17, +WM_Key_F18, +WM_Key_F19, +WM_Key_F20, +WM_Key_F21, +WM_Key_F22, +WM_Key_F23, +WM_Key_F24, +WM_Key_Tick, +WM_Key_0, +WM_Key_1, +WM_Key_2, +WM_Key_3, +WM_Key_4, +WM_Key_5, +WM_Key_6, +WM_Key_7, +WM_Key_8, +WM_Key_9, +WM_Key_Minus, +WM_Key_Equal, +WM_Key_Backspace, +WM_Key_Tab, +WM_Key_Q, +WM_Key_W, +WM_Key_E, +WM_Key_R, +WM_Key_T, +WM_Key_Y, +WM_Key_U, +WM_Key_I, +WM_Key_O, +WM_Key_P, +WM_Key_LeftBracket, +WM_Key_RightBracket, +WM_Key_BackSlash, +WM_Key_CapsLock, +WM_Key_A, +WM_Key_S, +WM_Key_D, +WM_Key_F, +WM_Key_G, +WM_Key_H, +WM_Key_J, +WM_Key_K, +WM_Key_L, +WM_Key_Semicolon, +WM_Key_Quote, +WM_Key_Return, +WM_Key_Shift, +WM_Key_Z, +WM_Key_X, +WM_Key_C, +WM_Key_V, +WM_Key_B, +WM_Key_N, +WM_Key_M, +WM_Key_Comma, +WM_Key_Period, +WM_Key_Slash, +WM_Key_Ctrl, +WM_Key_Alt, +WM_Key_Space, +WM_Key_Menu, +WM_Key_ScrollLock, +WM_Key_Pause, +WM_Key_Insert, +WM_Key_Home, +WM_Key_PageUp, +WM_Key_Delete, +WM_Key_End, +WM_Key_PageDown, +WM_Key_Up, +WM_Key_Left, +WM_Key_Down, +WM_Key_Right, +WM_Key_Ex0, +WM_Key_Ex1, +WM_Key_Ex2, +WM_Key_Ex3, +WM_Key_Ex4, +WM_Key_Ex5, +WM_Key_Ex6, +WM_Key_Ex7, +WM_Key_Ex8, +WM_Key_Ex9, +WM_Key_Ex10, +WM_Key_Ex11, +WM_Key_Ex12, +WM_Key_Ex13, +WM_Key_Ex14, +WM_Key_Ex15, +WM_Key_Ex16, +WM_Key_Ex17, +WM_Key_Ex18, +WM_Key_Ex19, +WM_Key_Ex20, +WM_Key_Ex21, +WM_Key_Ex22, +WM_Key_Ex23, +WM_Key_Ex24, +WM_Key_Ex25, +WM_Key_Ex26, +WM_Key_Ex27, +WM_Key_Ex28, +WM_Key_Ex29, +WM_Key_NumLock, +WM_Key_NumSlash, +WM_Key_NumStar, +WM_Key_NumMinus, +WM_Key_NumPlus, +WM_Key_NumPeriod, +WM_Key_Num0, +WM_Key_Num1, +WM_Key_Num2, +WM_Key_Num3, +WM_Key_Num4, +WM_Key_Num5, +WM_Key_Num6, +WM_Key_Num7, +WM_Key_Num8, +WM_Key_Num9, +WM_Key_LeftMouseButton, +WM_Key_MiddleMouseButton, +WM_Key_RightMouseButton, +WM_Key_COUNT, +} WM_Key; C_LINKAGE_BEGIN -extern String8 os_g_key_display_string_table[143]; -extern String8 os_g_key_cfg_string_table[143]; +extern String8 wm_key_display_name_table[143]; +extern String8 wm_key_cfg_name_table[143]; C_LINKAGE_END diff --git a/src/window_manager/window_manager.c b/src/window_manager/window_manager.c index 1f59d2a5..c5dc11cb 100644 --- a/src/window_manager/window_manager.c +++ b/src/window_manager/window_manager.c @@ -9,22 +9,22 @@ //////////////////////////////// //~ rjf: Handle Type Helpers -internal OS_Window -os_window_zero(void) +internal WM_Window +wm_window_zero(void) { - OS_Window result = {0}; + WM_Window result = {0}; return result; } internal B32 -os_window_match(OS_Window a, OS_Window b) +wm_window_match(WM_Window a, WM_Window b) { B32 result = MemoryMatchStruct(&a, &b); return result; } internal B32 -os_monitor_match(OS_Monitor a, OS_Monitor b) +wm_monitor_match(WM_Monitor a, WM_Monitor b) { B32 result = MemoryMatchStruct(&a, &b); return result; @@ -34,46 +34,46 @@ os_monitor_match(OS_Monitor a, OS_Monitor b) //~ rjf: Event Functions (Helpers, Implemented Once) internal String8 -os_string_from_event_kind(OS_EventKind kind) +wm_string_from_event_kind(WM_EventKind kind) { String8 result = {0}; switch(kind) { - case OS_EventKind_Null: - case OS_EventKind_COUNT: + case WM_EventKind_Null: + case WM_EventKind_COUNT: {}break; - case OS_EventKind_Press: {result = str8_lit("Press");}break; - case OS_EventKind_Release: {result = str8_lit("Release");}break; - case OS_EventKind_MouseMove: {result = str8_lit("MouseMove");}break; - case OS_EventKind_Text: {result = str8_lit("Text");}break; - case OS_EventKind_Scroll: {result = str8_lit("Scroll");}break; - case OS_EventKind_WindowLoseFocus: {result = str8_lit("WindowLoseFocus");}break; - case OS_EventKind_WindowClose: {result = str8_lit("WindowClose");}break; - case OS_EventKind_FileDrop: {result = str8_lit("FileDrop");}break; - case OS_EventKind_Wakeup: {result = str8_lit("Wakeup");}break; + case WM_EventKind_Press: {result = str8_lit("Press");}break; + case WM_EventKind_Release: {result = str8_lit("Release");}break; + case WM_EventKind_MouseMove: {result = str8_lit("MouseMove");}break; + case WM_EventKind_Text: {result = str8_lit("Text");}break; + case WM_EventKind_Scroll: {result = str8_lit("Scroll");}break; + case WM_EventKind_WindowLoseFocus: {result = str8_lit("WindowLoseFocus");}break; + case WM_EventKind_WindowClose: {result = str8_lit("WindowClose");}break; + case WM_EventKind_FileDrop: {result = str8_lit("FileDrop");}break; + case WM_EventKind_Wakeup: {result = str8_lit("Wakeup");}break; } return result; } internal String8List -os_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers) +wm_string_list_from_modifiers(Arena *arena, WM_Modifiers modifiers) { String8List result = {0}; - if(modifiers & OS_Modifier_Ctrl) { str8_list_push(arena, &result, str8_lit("Ctrl")); } - if(modifiers & OS_Modifier_Shift) { str8_list_push(arena, &result, str8_lit("Shift")); } - if(modifiers & OS_Modifier_Alt) { str8_list_push(arena, &result, str8_lit("Alt")); } + if(modifiers & WM_Modifier_Ctrl) { str8_list_push(arena, &result, str8_lit("Ctrl")); } + if(modifiers & WM_Modifier_Shift) { str8_list_push(arena, &result, str8_lit("Shift")); } + if(modifiers & WM_Modifier_Alt) { str8_list_push(arena, &result, str8_lit("Alt")); } return result; } internal String8 -os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key) +wm_string_from_modifiers_key(Arena *arena, WM_Modifiers modifiers, WM_Key key) { String8 result = {0}; - if(key != OS_Key_Null) + if(key != WM_Key_Null) { Temp scratch = scratch_begin(&arena, 1); - String8List mods = os_string_list_from_modifiers(scratch.arena, modifiers); - String8 key_string = os_g_key_display_string_table[key]; + String8List mods = wm_string_list_from_modifiers(scratch.arena, modifiers); + String8 key_string = wm_key_display_name_table[key]; str8_list_push(scratch.arena, &mods, key_string); StringJoin join = {0}; join.sep = str8_lit(" + "); @@ -84,105 +84,105 @@ os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key) } internal U32 -os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key) +wm_codepoint_from_modifiers_and_key(WM_Modifiers modifiers, WM_Key key) { U32 result = 0; // rjf: special-case map - local_persist read_only struct {U32 character; OS_Key key; OS_Modifiers modifiers;} map[] = + local_persist read_only struct {U32 character; WM_Key key; WM_Modifiers modifiers;} map[] = { - {'!', OS_Key_1, OS_Modifier_Shift}, - {'@', OS_Key_2, OS_Modifier_Shift}, - {'#', OS_Key_3, OS_Modifier_Shift}, - {'$', OS_Key_4, OS_Modifier_Shift}, - {'%', OS_Key_5, OS_Modifier_Shift}, - {'^', OS_Key_6, OS_Modifier_Shift}, - {'&', OS_Key_7, OS_Modifier_Shift}, - {'*', OS_Key_8, OS_Modifier_Shift}, - {'(', OS_Key_9, OS_Modifier_Shift}, - {')', OS_Key_0, OS_Modifier_Shift}, - {'_', OS_Key_Minus, OS_Modifier_Shift}, - {'_', OS_Key_Minus, OS_Modifier_Shift}, - {'-', OS_Key_Minus, 0}, - {'=', OS_Key_Equal, 0}, - {'+', OS_Key_Equal, OS_Modifier_Shift}, - {'`', OS_Key_Tick, 0}, - {'~', OS_Key_Tick, OS_Modifier_Shift}, - {'[', OS_Key_LeftBracket, 0}, - {']', OS_Key_RightBracket, 0}, - {'{', OS_Key_LeftBracket, OS_Modifier_Shift}, - {'}', OS_Key_RightBracket, OS_Modifier_Shift}, - {'\\', OS_Key_BackSlash, 0}, - {'|', OS_Key_BackSlash, OS_Modifier_Shift}, - {';', OS_Key_Semicolon, 0}, - {':', OS_Key_Semicolon, OS_Modifier_Shift}, - {'\'', OS_Key_Quote, 0}, - {'"', OS_Key_Quote, OS_Modifier_Shift}, - {'.', OS_Key_Period, 0}, - {',', OS_Key_Comma, 0}, - {'<', OS_Key_Period, OS_Modifier_Shift}, - {'>', OS_Key_Comma, OS_Modifier_Shift}, - {'/', OS_Key_Slash, 0}, - {'?', OS_Key_Slash, OS_Modifier_Shift}, - {'a', OS_Key_A, 0}, - {'b', OS_Key_B, 0}, - {'c', OS_Key_C, 0}, - {'d', OS_Key_D, 0}, - {'e', OS_Key_E, 0}, - {'f', OS_Key_F, 0}, - {'g', OS_Key_G, 0}, - {'h', OS_Key_H, 0}, - {'i', OS_Key_I, 0}, - {'j', OS_Key_J, 0}, - {'k', OS_Key_K, 0}, - {'l', OS_Key_L, 0}, - {'m', OS_Key_M, 0}, - {'n', OS_Key_N, 0}, - {'o', OS_Key_O, 0}, - {'p', OS_Key_P, 0}, - {'q', OS_Key_Q, 0}, - {'r', OS_Key_R, 0}, - {'s', OS_Key_S, 0}, - {'t', OS_Key_T, 0}, - {'u', OS_Key_U, 0}, - {'v', OS_Key_V, 0}, - {'w', OS_Key_W, 0}, - {'x', OS_Key_X, 0}, - {'y', OS_Key_Y, 0}, - {'z', OS_Key_Z, 0}, - {'A', OS_Key_A, OS_Modifier_Shift}, - {'B', OS_Key_B, OS_Modifier_Shift}, - {'C', OS_Key_C, OS_Modifier_Shift}, - {'D', OS_Key_D, OS_Modifier_Shift}, - {'E', OS_Key_E, OS_Modifier_Shift}, - {'F', OS_Key_F, OS_Modifier_Shift}, - {'G', OS_Key_G, OS_Modifier_Shift}, - {'H', OS_Key_H, OS_Modifier_Shift}, - {'I', OS_Key_I, OS_Modifier_Shift}, - {'J', OS_Key_J, OS_Modifier_Shift}, - {'K', OS_Key_K, OS_Modifier_Shift}, - {'L', OS_Key_L, OS_Modifier_Shift}, - {'M', OS_Key_M, OS_Modifier_Shift}, - {'N', OS_Key_N, OS_Modifier_Shift}, - {'O', OS_Key_O, OS_Modifier_Shift}, - {'P', OS_Key_P, OS_Modifier_Shift}, - {'Q', OS_Key_Q, OS_Modifier_Shift}, - {'R', OS_Key_R, OS_Modifier_Shift}, - {'S', OS_Key_S, OS_Modifier_Shift}, - {'T', OS_Key_T, OS_Modifier_Shift}, - {'U', OS_Key_U, OS_Modifier_Shift}, - {'V', OS_Key_V, OS_Modifier_Shift}, - {'W', OS_Key_W, OS_Modifier_Shift}, - {'X', OS_Key_X, OS_Modifier_Shift}, - {'Y', OS_Key_Y, OS_Modifier_Shift}, - {'Z', OS_Key_Z, OS_Modifier_Shift}, - {' ', OS_Key_Space, 0}, + {'!', WM_Key_1, WM_Modifier_Shift}, + {'@', WM_Key_2, WM_Modifier_Shift}, + {'#', WM_Key_3, WM_Modifier_Shift}, + {'$', WM_Key_4, WM_Modifier_Shift}, + {'%', WM_Key_5, WM_Modifier_Shift}, + {'^', WM_Key_6, WM_Modifier_Shift}, + {'&', WM_Key_7, WM_Modifier_Shift}, + {'*', WM_Key_8, WM_Modifier_Shift}, + {'(', WM_Key_9, WM_Modifier_Shift}, + {')', WM_Key_0, WM_Modifier_Shift}, + {'_', WM_Key_Minus, WM_Modifier_Shift}, + {'_', WM_Key_Minus, WM_Modifier_Shift}, + {'-', WM_Key_Minus, 0}, + {'=', WM_Key_Equal, 0}, + {'+', WM_Key_Equal, WM_Modifier_Shift}, + {'`', WM_Key_Tick, 0}, + {'~', WM_Key_Tick, WM_Modifier_Shift}, + {'[', WM_Key_LeftBracket, 0}, + {']', WM_Key_RightBracket, 0}, + {'{', WM_Key_LeftBracket, WM_Modifier_Shift}, + {'}', WM_Key_RightBracket, WM_Modifier_Shift}, + {'\\', WM_Key_BackSlash, 0}, + {'|', WM_Key_BackSlash, WM_Modifier_Shift}, + {';', WM_Key_Semicolon, 0}, + {':', WM_Key_Semicolon, WM_Modifier_Shift}, + {'\'', WM_Key_Quote, 0}, + {'"', WM_Key_Quote, WM_Modifier_Shift}, + {'.', WM_Key_Period, 0}, + {',', WM_Key_Comma, 0}, + {'<', WM_Key_Period, WM_Modifier_Shift}, + {'>', WM_Key_Comma, WM_Modifier_Shift}, + {'/', WM_Key_Slash, 0}, + {'?', WM_Key_Slash, WM_Modifier_Shift}, + {'a', WM_Key_A, 0}, + {'b', WM_Key_B, 0}, + {'c', WM_Key_C, 0}, + {'d', WM_Key_D, 0}, + {'e', WM_Key_E, 0}, + {'f', WM_Key_F, 0}, + {'g', WM_Key_G, 0}, + {'h', WM_Key_H, 0}, + {'i', WM_Key_I, 0}, + {'j', WM_Key_J, 0}, + {'k', WM_Key_K, 0}, + {'l', WM_Key_L, 0}, + {'m', WM_Key_M, 0}, + {'n', WM_Key_N, 0}, + {'o', WM_Key_O, 0}, + {'p', WM_Key_P, 0}, + {'q', WM_Key_Q, 0}, + {'r', WM_Key_R, 0}, + {'s', WM_Key_S, 0}, + {'t', WM_Key_T, 0}, + {'u', WM_Key_U, 0}, + {'v', WM_Key_V, 0}, + {'w', WM_Key_W, 0}, + {'x', WM_Key_X, 0}, + {'y', WM_Key_Y, 0}, + {'z', WM_Key_Z, 0}, + {'A', WM_Key_A, WM_Modifier_Shift}, + {'B', WM_Key_B, WM_Modifier_Shift}, + {'C', WM_Key_C, WM_Modifier_Shift}, + {'D', WM_Key_D, WM_Modifier_Shift}, + {'E', WM_Key_E, WM_Modifier_Shift}, + {'F', WM_Key_F, WM_Modifier_Shift}, + {'G', WM_Key_G, WM_Modifier_Shift}, + {'H', WM_Key_H, WM_Modifier_Shift}, + {'I', WM_Key_I, WM_Modifier_Shift}, + {'J', WM_Key_J, WM_Modifier_Shift}, + {'K', WM_Key_K, WM_Modifier_Shift}, + {'L', WM_Key_L, WM_Modifier_Shift}, + {'M', WM_Key_M, WM_Modifier_Shift}, + {'N', WM_Key_N, WM_Modifier_Shift}, + {'O', WM_Key_O, WM_Modifier_Shift}, + {'P', WM_Key_P, WM_Modifier_Shift}, + {'Q', WM_Key_Q, WM_Modifier_Shift}, + {'R', WM_Key_R, WM_Modifier_Shift}, + {'S', WM_Key_S, WM_Modifier_Shift}, + {'T', WM_Key_T, WM_Modifier_Shift}, + {'U', WM_Key_U, WM_Modifier_Shift}, + {'V', WM_Key_V, WM_Modifier_Shift}, + {'W', WM_Key_W, WM_Modifier_Shift}, + {'X', WM_Key_X, WM_Modifier_Shift}, + {'Y', WM_Key_Y, WM_Modifier_Shift}, + {'Z', WM_Key_Z, WM_Modifier_Shift}, + {' ', WM_Key_Space, 0}, }; // rjf: check numeric - if(OS_Key_0 <= key && key <= OS_Key_9) + if(WM_Key_0 <= key && key <= WM_Key_9) { - result = '0' + (key - OS_Key_0); + result = '0' + (key - WM_Key_0); } // rjf: check special-case map @@ -199,23 +199,23 @@ os_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key) } internal void -os_eat_event(OS_EventList *events, OS_Event *event) +wm_eat_event(WM_EventList *events, WM_Event *event) { DLLRemove(events->first, events->last, event); events->count -= 1; } internal B32 -os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key) +wm_key_press(WM_EventList *events, WM_Window window, WM_Modifiers modifiers, WM_Key key) { B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) + for(WM_Event *event = events->first; event != 0; event = event->next) { - if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && - event->kind == OS_EventKind_Press && event->key == key && event->modifiers == modifiers) + if((wm_window_match(event->window, window) || wm_window_match(window, wm_window_zero())) && + event->kind == WM_EventKind_Press && event->key == key && event->modifiers == modifiers) { result = 1; - os_eat_event(events, event); + wm_eat_event(events, event); break; } } @@ -223,16 +223,16 @@ os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_ } internal B32 -os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key) +wm_key_release(WM_EventList *events, WM_Window window, WM_Modifiers modifiers, WM_Key key) { B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) + for(WM_Event *event = events->first; event != 0; event = event->next) { - if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && - event->kind == OS_EventKind_Release && event->key == key && event->modifiers == modifiers) + if((wm_window_match(event->window, window) || wm_window_match(window, wm_window_zero())) && + event->kind == WM_EventKind_Release && event->key == key && event->modifiers == modifiers) { result = 1; - os_eat_event(events, event); + wm_eat_event(events, event); break; } } @@ -240,29 +240,29 @@ os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, O } internal B32 -os_text(OS_EventList *events, OS_Window window, U32 character) +wm_text(WM_EventList *events, WM_Window window, U32 character) { B32 result = 0; - for(OS_Event *event = events->first; event != 0; event = event->next) + for(WM_Event *event = events->first; event != 0; event = event->next) { - if((os_window_match(event->window, window) || os_window_match(window, os_window_zero())) && - event->kind == OS_EventKind_Text && event->character == character) + if((wm_window_match(event->window, window) || wm_window_match(window, wm_window_zero())) && + event->kind == WM_EventKind_Text && event->character == character) { result = 1; - os_eat_event(events, event); + wm_eat_event(events, event); break; } } return result; } -internal OS_EventList -os_event_list_copy(Arena *arena, OS_EventList *src) +internal WM_EventList +wm_event_list_copy(Arena *arena, WM_EventList *src) { - OS_EventList dst = {0}; - for(OS_Event *s = src->first; s != 0; s = s->next) + WM_EventList dst = {0}; + for(WM_Event *s = src->first; s != 0; s = s->next) { - OS_Event *d = push_array(arena, OS_Event, 1); + WM_Event *d = push_array(arena, WM_Event, 1); MemoryCopyStruct(d, s); d->strings = str8_list_copy(arena, &s->strings); DLLPushBack(dst.first, dst.last, d); @@ -272,7 +272,7 @@ os_event_list_copy(Arena *arena, OS_EventList *src) } internal void -os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push) +wm_event_list_concat_in_place(WM_EventList *dst, WM_EventList *to_push) { if(dst->last && to_push->first) { @@ -288,10 +288,10 @@ os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push) MemoryZeroStruct(to_push); } -internal OS_Event * -os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind) +internal WM_Event * +wm_event_list_push_new(Arena *arena, WM_EventList *evts, WM_EventKind kind) { - OS_Event *evt = push_array(arena, OS_Event, 1); + WM_Event *evt = push_array(arena, WM_Event, 1); DLLPushBack(evts->first, evts->last, evt); evts->count += 1; evt->timestamp_us = now_time_us(); diff --git a/src/window_manager/window_manager.h b/src/window_manager/window_manager.h index a64ca87f..c17f9c7c 100644 --- a/src/window_manager/window_manager.h +++ b/src/window_manager/window_manager.h @@ -1,14 +1,14 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef OS_GFX_H -#define OS_GFX_H +#ifndef WINDOW_MANAGER_H +#define WINDOW_MANAGER_H //////////////////////////////// //~ rjf: Graphics System Info -typedef struct OS_GfxInfo OS_GfxInfo; -struct OS_GfxInfo +typedef struct WM_SystemInfo WM_SystemInfo; +struct WM_SystemInfo { F32 double_click_time; F32 caret_blink_time; @@ -18,15 +18,15 @@ struct OS_GfxInfo //////////////////////////////// //~ rjf: Window Types -typedef U32 OS_WindowFlags; +typedef U32 WM_WindowFlags; enum { - OS_WindowFlag_CustomBorder = (1<<0), - OS_WindowFlag_UseDefaultPosition = (1<<1), + WM_WindowFlag_CustomBorder = (1<<0), + WM_WindowFlag_UseDefaultPosition = (1<<1), }; -typedef struct OS_Window OS_Window; -struct OS_Window +typedef struct WM_Window WM_Window; +struct WM_Window { U64 u64[1]; }; @@ -34,8 +34,8 @@ struct OS_Window //////////////////////////////// //~ rjf: External Window Types -typedef struct OS_ExternalWindow OS_ExternalWindow; -struct OS_ExternalWindow +typedef struct WM_ExtWindow WM_ExtWindow; +struct WM_ExtWindow { U64 u64[1]; }; @@ -43,36 +43,36 @@ struct OS_ExternalWindow //////////////////////////////// //~ rjf: Monitor Types -typedef struct OS_Monitor OS_Monitor; -struct OS_Monitor +typedef struct WM_Monitor WM_Monitor; +struct WM_Monitor { U64 u64[1]; }; -typedef struct OS_MonitorArray OS_MonitorArray; -struct OS_MonitorArray +typedef struct WM_MonitorArray WM_MonitorArray; +struct WM_MonitorArray { - OS_Monitor *v; + WM_Monitor *v; U64 count; }; //////////////////////////////// //~ rjf: Cursor Types -typedef enum OS_Cursor +typedef enum WM_Cursor { - OS_Cursor_Pointer, - OS_Cursor_IBar, - OS_Cursor_LeftRight, - OS_Cursor_UpDown, - OS_Cursor_DownRight, - OS_Cursor_UpRight, - OS_Cursor_UpDownLeftRight, - OS_Cursor_HandPoint, - OS_Cursor_Disabled, - OS_Cursor_COUNT, + WM_Cursor_Pointer, + WM_Cursor_IBar, + WM_Cursor_LeftRight, + WM_Cursor_UpDown, + WM_Cursor_DownRight, + WM_Cursor_UpRight, + WM_Cursor_UpDownLeftRight, + WM_Cursor_HandPoint, + WM_Cursor_Disabled, + WM_Cursor_COUNT, } -OS_Cursor; +WM_Cursor; //////////////////////////////// //~ rjf: Generated Code @@ -82,40 +82,40 @@ OS_Cursor; //////////////////////////////// //~ rjf: Event Types -typedef enum OS_EventKind +typedef enum WM_EventKind { - OS_EventKind_Null, - OS_EventKind_Press, - OS_EventKind_Release, - OS_EventKind_MouseMove, - OS_EventKind_Text, - OS_EventKind_Scroll, - OS_EventKind_WindowLoseFocus, - OS_EventKind_WindowClose, - OS_EventKind_FileDrop, - OS_EventKind_Wakeup, - OS_EventKind_COUNT + WM_EventKind_Null, + WM_EventKind_Press, + WM_EventKind_Release, + WM_EventKind_MouseMove, + WM_EventKind_Text, + WM_EventKind_Scroll, + WM_EventKind_WindowLoseFocus, + WM_EventKind_WindowClose, + WM_EventKind_FileDrop, + WM_EventKind_Wakeup, + WM_EventKind_COUNT } -OS_EventKind; +WM_EventKind; -typedef U32 OS_Modifiers; +typedef U32 WM_Modifiers; enum { - OS_Modifier_Ctrl = (1<<0), - OS_Modifier_Shift = (1<<1), - OS_Modifier_Alt = (1<<2), + WM_Modifier_Ctrl = (1<<0), + WM_Modifier_Shift = (1<<1), + WM_Modifier_Alt = (1<<2), }; -typedef struct OS_Event OS_Event; -struct OS_Event +typedef struct WM_Event WM_Event; +struct WM_Event { - OS_Event *next; - OS_Event *prev; + WM_Event *next; + WM_Event *prev; U64 timestamp_us; - OS_Window window; - OS_EventKind kind; - OS_Modifiers modifiers; - OS_Key key; + WM_Window window; + WM_EventKind kind; + WM_Modifiers modifiers; + WM_Key key; B32 is_repeat; B32 right_sided; U32 character; @@ -125,12 +125,12 @@ struct OS_Event String8List strings; }; -typedef struct OS_EventList OS_EventList; -struct OS_EventList +typedef struct WM_EventList WM_EventList; +struct WM_EventList { U64 count; - OS_Event *first; - OS_Event *last; + WM_Event *first; + WM_Event *last; }; //////////////////////////////// @@ -141,106 +141,106 @@ internal B32 frame(void); //////////////////////////////// //~ rjf: Handle Type Helpers -internal OS_Window os_window_zero(void); -internal B32 os_window_match(OS_Window a, OS_Window b); -internal B32 os_monitor_match(OS_Monitor a, OS_Monitor b); +internal WM_Window wm_window_zero(void); +internal B32 wm_window_match(WM_Window a, WM_Window b); +internal B32 wm_monitor_match(WM_Monitor a, WM_Monitor b); //////////////////////////////// //~ rjf: Event Functions (Helpers, Implemented Once) -internal String8 os_string_from_event_kind(OS_EventKind kind); -internal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers flags); -internal String8 os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key); -internal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers flags, OS_Key key); -internal void os_eat_event(OS_EventList *events, OS_Event *event); -internal B32 os_key_press(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key); -internal B32 os_key_release(OS_EventList *events, OS_Window window, OS_Modifiers modifiers, OS_Key key); -internal B32 os_text(OS_EventList *events, OS_Window window, U32 character); -internal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src); -internal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push); -internal OS_Event *os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind); +internal String8 wm_string_from_event_kind(WM_EventKind kind); +internal String8List wm_string_list_from_modifiers(Arena *arena, WM_Modifiers flags); +internal String8 wm_string_from_modifiers_key(Arena *arena, WM_Modifiers modifiers, WM_Key key); +internal U32 wm_codepoint_from_modifiers_and_key(WM_Modifiers flags, WM_Key key); +internal void wm_eat_event(WM_EventList *events, WM_Event *event); +internal B32 wm_key_press(WM_EventList *events, WM_Window window, WM_Modifiers modifiers, WM_Key key); +internal B32 wm_key_release(WM_EventList *events, WM_Window window, WM_Modifiers modifiers, WM_Key key); +internal B32 wm_text(WM_EventList *events, WM_Window window, U32 character); +internal WM_EventList wm_event_list_copy(Arena *arena, WM_EventList *src); +internal void wm_event_list_concat_in_place(WM_EventList *dst, WM_EventList *to_push); +internal WM_Event *wm_event_list_push_new(Arena *arena, WM_EventList *evts, WM_EventKind kind); //////////////////////////////// //~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) -internal void os_gfx_init(void); +internal void wm_init(void); //////////////////////////////// //~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) -internal OS_GfxInfo *os_get_gfx_info(void); +internal WM_SystemInfo *wm_get_system_info(void); //////////////////////////////// //~ rjf: @os_hooks Clipboards (Implemented Per-OS) -internal void os_set_clipboard_text(String8 string); -internal String8 os_get_clipboard_text(Arena *arena); +internal void wm_set_clipboard_text(String8 string); +internal String8 wm_get_clipboard_text(Arena *arena); //////////////////////////////// //~ rjf: @os_hooks Windows (Implemented Per-OS) -internal OS_Window os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title); -internal void os_window_close(OS_Window window); -internal void os_window_set_title(OS_Window window, String8 title); -internal void os_window_first_paint(OS_Window window); -internal void os_window_focus(OS_Window window); -internal B32 os_window_is_focused(OS_Window window); -internal B32 os_window_is_fullscreen(OS_Window window); -internal void os_window_set_fullscreen(OS_Window window, B32 fullscreen); -internal B32 os_window_is_maximized(OS_Window window); -internal void os_window_set_maximized(OS_Window window, B32 maximized); -internal B32 os_window_is_minimized(OS_Window window); -internal void os_window_set_minimized(OS_Window window, B32 minimized); -internal void os_window_bring_to_front(OS_Window window); -internal void os_window_set_monitor(OS_Window window, OS_Monitor monitor); -internal void os_window_clear_custom_border_data(OS_Window handle); -internal void os_window_push_custom_title_bar(OS_Window handle, F32 thickness); -internal void os_window_push_custom_edges(OS_Window handle, F32 thickness); -internal void os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect); -internal Rng2F32 os_rect_from_window(OS_Window window); -internal Rng2F32 os_client_rect_from_window(OS_Window window); -internal F32 os_dpi_from_window(OS_Window window); +internal WM_Window wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title); +internal void wm_window_close(WM_Window window); +internal void wm_window_set_title(WM_Window window, String8 title); +internal void wm_window_first_paint(WM_Window window); +internal void wm_window_focus(WM_Window window); +internal B32 wm_window_is_focused(WM_Window window); +internal B32 wm_window_is_fullscreen(WM_Window window); +internal void wm_window_set_fullscreen(WM_Window window, B32 fullscreen); +internal B32 wm_window_is_maximized(WM_Window window); +internal void wm_window_set_maximized(WM_Window window, B32 maximized); +internal B32 wm_window_is_minimized(WM_Window window); +internal void wm_window_set_minimized(WM_Window window, B32 minimized); +internal void wm_window_bring_to_front(WM_Window window); +internal void wm_window_set_monitor(WM_Window window, WM_Monitor monitor); +internal void wm_window_clear_custom_border_data(WM_Window handle); +internal void wm_window_push_custom_title_bar(WM_Window handle, F32 thickness); +internal void wm_window_push_custom_edges(WM_Window handle, F32 thickness); +internal void wm_window_push_custom_title_bar_client_area(WM_Window handle, Rng2F32 rect); +internal Rng2F32 wm_rect_from_window(WM_Window window); +internal Rng2F32 wm_client_rect_from_window(WM_Window window); +internal F32 wm_dpi_from_window(WM_Window window); //////////////////////////////// //~ rjf: @os_hooks External Windows (Implemented Per-OS) -internal OS_ExternalWindow os_focused_external_window(void); -internal void os_focus_external_window(OS_ExternalWindow ext_window); +internal WM_ExtWindow wm_focused_external_window(void); +internal void wm_focus_external_window(WM_ExtWindow ext_window); //////////////////////////////// //~ rjf: @os_hooks Monitors (Implemented Per-OS) -internal OS_MonitorArray os_push_monitors_array(Arena *arena); -internal OS_Monitor os_primary_monitor(void); -internal OS_Monitor os_monitor_from_window(OS_Window window); -internal String8 os_name_from_monitor(Arena *arena, OS_Monitor monitor); -internal Vec2F32 os_dim_from_monitor(OS_Monitor monitor); -internal F32 os_dpi_from_monitor(OS_Monitor monitor); +internal WM_MonitorArray wm_push_monitors_array(Arena *arena); +internal WM_Monitor wm_primary_monitor(void); +internal WM_Monitor wm_monitor_from_window(WM_Window window); +internal String8 wm_name_from_monitor(Arena *arena, WM_Monitor monitor); +internal Vec2F32 wm_dim_from_monitor(WM_Monitor monitor); +internal F32 wm_dpi_from_monitor(WM_Monitor monitor); //////////////////////////////// //~ rjf: @os_hooks Events (Implemented Per-OS) -internal void os_send_wakeup_event(void); -internal OS_EventList os_get_events(Arena *arena, B32 wait); -internal OS_Modifiers os_get_modifiers(void); -internal B32 os_key_is_down(OS_Key key); -internal Vec2F32 os_mouse_from_window(OS_Window window); +internal void wm_send_wakeup_event(void); +internal WM_EventList wm_get_events(Arena *arena, B32 wait); +internal WM_Modifiers wm_get_modifiers(void); +internal B32 wm_key_is_down(WM_Key key); +internal Vec2F32 wm_mouse_from_window(WM_Window window); //////////////////////////////// //~ rjf: @os_hooks Cursors (Implemented Per-OS) -internal void os_set_cursor(OS_Cursor cursor); +internal void wm_set_cursor(WM_Cursor cursor); //////////////////////////////// //~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) -internal void os_graphical_message(B32 error, String8 title, String8 message); -internal String8 os_graphical_pick_file(Arena *arena, String8 initial_path); +internal void wm_graphical_message(B32 error, String8 title, String8 message); +internal String8 wm_graphical_pick_file(Arena *arena, String8 initial_path); //////////////////////////////// //~ rjf: @os_hooks Shell Operations -internal void os_show_in_filesystem_ui(String8 path); -internal void os_open_in_browser(String8 url); +internal void wm_show_in_filesystem_ui(String8 path); +internal void wm_open_in_browser(String8 url); -#endif // OS_GFX_H +#endif // WINDOW_MANAGER_H diff --git a/src/window_manager/window_manager.mdesk b/src/window_manager/window_manager.mdesk index 053c5119..ffa92dcb 100644 --- a/src/window_manager/window_manager.mdesk +++ b/src/window_manager/window_manager.mdesk @@ -5,7 +5,7 @@ //~ rjf: Tables @table(name, display_string, cfg_string) -OS_KeyTable: +WM_KeyTable: { {Null "Invalid Key" "null" } {Esc "Escape" "esc" } @@ -155,18 +155,18 @@ OS_KeyTable: //////////////////////////////// //~ rjf: Generators -@enum OS_Key: +@enum WM_Key: { - @expand(OS_KeyTable a) `$(a.name)`, + @expand(WM_KeyTable a) `$(a.name)`, COUNT, } -@data(String8) os_g_key_display_string_table: +@data(String8) wm_key_display_name_table: { - @expand(OS_KeyTable a) `str8_lit_comp("$(a.display_string)")`; + @expand(WM_KeyTable a) `str8_lit_comp("$(a.display_string)")`; } -@data(String8) os_g_key_cfg_string_table: +@data(String8) wm_key_cfg_name_table: { - @expand(OS_KeyTable a) `str8_lit_comp("$(a.cfg_string)")`; + @expand(WM_KeyTable a) `str8_lit_comp("$(a.cfg_string)")`; } diff --git a/src/window_manager/window_manager_stub.c b/src/window_manager/window_manager_stub.c index bf49a3d0..29ea886d 100644 --- a/src/window_manager/window_manager_stub.c +++ b/src/window_manager/window_manager_stub.c @@ -2,17 +2,17 @@ //~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) internal void -os_gfx_init(void) +wm_init(void) { } //////////////////////////////// //~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) -internal OS_GfxInfo * -os_get_gfx_info(void) +internal WM_SystemInfo * +wm_get_system_info(void) { - local_persist OS_GfxInfo g = {0}; + local_persist WM_SystemInfo g = {0}; return &g; } @@ -20,12 +20,12 @@ os_get_gfx_info(void) //~ rjf: @os_hooks Clipboards (Implemented Per-OS) internal void -os_set_clipboard_text(String8 string) +wm_set_clipboard_text(String8 string) { } internal String8 -os_get_clipboard_text(Arena *arena) +wm_get_clipboard_text(Arena *arena) { return str8_zero(); } @@ -33,118 +33,118 @@ os_get_clipboard_text(Arena *arena) //////////////////////////////// //~ rjf: @os_hooks Windows (Implemented Per-OS) -internal OS_Handle -os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title) +internal WM_Window +wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) { - OS_Handle handle = {1}; + WM_Window handle = {1}; return handle; } internal void -os_window_close(OS_Handle window) +wm_window_close(WM_Window window) { } internal void -os_window_set_title(OS_Handle window, String8 title) +wm_window_set_title(WM_Window window, String8 title) { } internal void -os_window_first_paint(OS_Handle window) +wm_window_first_paint(WM_Window window) { } internal void -os_window_focus(OS_Handle window) +wm_window_focus(WM_Window window) { } internal B32 -os_window_is_focused(OS_Handle window) +wm_window_is_focused(WM_Window window) { return 0; } internal B32 -os_window_is_fullscreen(OS_Handle window) +wm_window_is_fullscreen(WM_Window window) { return 0; } internal void -os_window_set_fullscreen(OS_Handle window, B32 fullscreen) +wm_window_set_fullscreen(WM_Window window, B32 fullscreen) { } internal B32 -os_window_is_maximized(OS_Handle window) +wm_window_is_maximized(WM_Window window) { return 0; } internal void -os_window_set_maximized(OS_Handle window, B32 maximized) +wm_window_set_maximized(WM_Window window, B32 maximized) { } internal B32 -os_window_is_minimized(OS_Handle window) +wm_window_is_minimized(WM_Window window) { return 0; } internal void -os_window_set_minimized(OS_Handle window, B32 minimized) +wm_window_set_minimized(WM_Window window, B32 minimized) { } internal void -os_window_bring_to_front(OS_Handle window) +wm_window_bring_to_front(WM_Window window) { } internal void -os_window_set_monitor(OS_Handle window, OS_Handle monitor) +wm_window_set_monitor(WM_Window window, WM_Monitor monitor) { } internal void -os_window_clear_custom_border_data(OS_Handle handle) +wm_window_clear_custom_border_data(WM_Window handle) { } internal void -os_window_push_custom_title_bar(OS_Handle handle, F32 thickness) +wm_window_push_custom_title_bar(WM_Window handle, F32 thickness) { } internal void -os_window_push_custom_edges(OS_Handle handle, F32 thickness) +wm_window_push_custom_edges(WM_Window handle, F32 thickness) { } internal void -os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect) +wm_window_push_custom_title_bar_client_area(WM_Window handle, Rng2F32 rect) { } internal Rng2F32 -os_rect_from_window(OS_Handle window) +wm_rect_from_window(WM_Window window) { Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); return rect; } internal Rng2F32 -os_client_rect_from_window(OS_Handle window) +wm_client_rect_from_window(WM_Window window) { Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500)); return rect; } internal F32 -os_dpi_from_window(OS_Handle window) +wm_dpi_from_window(WM_Window window) { return 96.f; } @@ -152,59 +152,57 @@ os_dpi_from_window(OS_Handle window) //////////////////////////////// //~ rjf: @os_hooks External Windows (Implemented Per-OS) -internal OS_Handle -os_focused_external_window(void) +internal WM_ExtWindow +wm_focused_external_window(void) { - OS_Handle result = {0}; - // TODO(rjf) + WM_ExtWindow result = {0}; return result; } internal void -os_focus_external_window(OS_Handle handle) +wm_focus_external_window(WM_ExtWindow handle) { - // TODO(rjf) } //////////////////////////////// //~ rjf: @os_hooks Monitors (Implemented Per-OS) -internal OS_HandleArray -os_push_monitors_array(Arena *arena) +internal WM_MonitorArray +wm_push_monitors_array(Arena *arena) { - OS_HandleArray arr = {0}; + WM_MonitorArray arr = {0}; return arr; } -internal OS_Handle -os_primary_monitor(void) +internal WM_Monitor +wm_primary_monitor(void) { - OS_Handle handle = {1}; + WM_Monitor handle = {1}; return handle; } -internal OS_Handle -os_monitor_from_window(OS_Handle window) +internal WM_Monitor +wm_monitor_from_window(WM_Window window) { - OS_Handle handle = {1}; + WM_Monitor handle = {1}; return handle; } internal String8 -os_name_from_monitor(Arena *arena, OS_Handle monitor) +wm_name_from_monitor(Arena *arena, WM_Monitor monitor) { return str8_zero(); } internal Vec2F32 -os_dim_from_monitor(OS_Handle monitor) +wm_dim_from_monitor(WM_Monitor monitor) { Vec2F32 v = v2f32(1000, 1000); return v; } internal F32 -os_dpi_from_monitor(OS_Handle monitor) +wm_dpi_from_monitor(WM_Monitor monitor) { return 96.f; } @@ -213,32 +211,32 @@ os_dpi_from_monitor(OS_Handle monitor) //~ rjf: @os_hooks Events (Implemented Per-OS) internal void -os_send_wakeup_event(void) +wm_send_wakeup_event(void) { } -internal OS_EventList -os_get_events(Arena *arena, B32 wait) +internal WM_EventList +wm_get_events(Arena *arena, B32 wait) { - OS_EventList evts = {0}; + WM_EventList evts = {0}; return evts; } -internal OS_Modifiers -os_get_modifiers(void) +internal WM_Modifiers +wm_get_modifiers(void) { - OS_Modifiers f = 0; + WM_Modifiers f = 0; return f; } internal B32 -os_key_is_down(OS_Key key) +wm_key_is_down(WM_Key key) { return 0; } internal Vec2F32 -os_mouse_from_window(OS_Handle window) +wm_mouse_from_window(WM_Window window) { return v2f32(0, 0); } @@ -247,7 +245,7 @@ os_mouse_from_window(OS_Handle window) //~ rjf: @os_hooks Cursors (Implemented Per-OS) internal void -os_set_cursor(OS_Cursor cursor) +wm_set_cursor(WM_Cursor cursor) { } @@ -255,12 +253,12 @@ os_set_cursor(OS_Cursor cursor) //~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) internal void -os_graphical_message(B32 error, String8 title, String8 message) +wm_graphical_message(B32 error, String8 title, String8 message) { } internal String8 -os_graphical_pick_file(Arena *arena, String8 initial_path) +wm_graphical_pick_file(Arena *arena, String8 initial_path) { return str8_zero(); } @@ -269,11 +267,11 @@ os_graphical_pick_file(Arena *arena, String8 initial_path) //~ rjf: @os_hooks Shell Operations internal void -os_show_in_filesystem_ui(String8 path) +wm_show_in_filesystem_ui(String8 path) { } internal void -os_open_in_browser(String8 url) +wm_open_in_browser(String8 url) { } diff --git a/src/window_manager/window_manager_stub.h b/src/window_manager/window_manager_stub.h index afdfce32..23495c09 100644 --- a/src/window_manager/window_manager_stub.h +++ b/src/window_manager/window_manager_stub.h @@ -1,7 +1,7 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef OS_GFX_STUB_H -#define OS_GFX_STUB_H +#ifndef WINDOW_MANAGER_STUB_H +#define WINDOW_MANAGER_STUB_H -#endif // OS_GFX_STUB_H +#endif // WINDOW_MANAGER_STUB_H From d59d6a21f04b2a726501cd456ae2a90d9454d297 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 9 May 2026 12:18:05 -0700 Subject: [PATCH 505/850] d2r2: do not duplicate line records, were being generated by columnar changes, but these are not currently supported by the debugger --- src/base/base_entry_point.c | 1 + src/dbg_engine/dbg_engine_user.c | 20 ++++---- src/dbg_engine/dbg_engine_user.h | 8 ++-- src/raddbg/raddbg_core.c | 2 +- src/raddbg/raddbg_views.c | 4 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 68 ++++++++++++++++++--------- 6 files changed, 64 insertions(+), 39 deletions(-) diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index f7fdcf22..a3ab9aa8 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -12,6 +12,7 @@ global B32 global_async_exit = 0; thread_static B32 is_async_thread = 0; // NOTE(rjf): defined by target +raddbg_entry_point(entry_point); internal void entry_point(CmdLine *cmdline); internal void diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index bfaffd88..9c9712ff 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -363,7 +363,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) // rjf: gather other ranges on this same textual line, which we don't want to return to Rng1U64List all_vaddr_ranges_on_same_line = {0}; { - D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num); + D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num, max_U64); for EachNode(n, D_LineNode, lines.first) { Rng1U64 voff_range = n->v.voff_range; @@ -574,7 +574,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) // rjf: gather other ranges on this same textual line, which we don't want to return to Rng1U64List all_vaddr_ranges_on_same_line = {0}; { - D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num); + D_LineList lines = d_lines_from_dbgi_key_file_path_line_num(scratch.arena, dbgi_key, file_path, line_num, max_U64); for EachNode(n, D_LineNode, lines.first) { Rng1U64 voff_range = n->v.voff_range; @@ -838,7 +838,7 @@ d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff) // TODO(rjf): this depends on file path maps, needs to move internal D_LineListArray -d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range) +d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range, U64 max_voffs_per_line) { D_LineListArray array = {0}; { @@ -896,7 +896,7 @@ d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, D_LineList *list = &array.v[line_idx]; U32 voff_count = 0; U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count); - if(lines_num_voffs[line_idx] < 8) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) + if(lines_num_voffs[line_idx] < max_voffs_per_line) ProfScope("iterate voffs (%i)", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1) { U64 base_voff = voffs[idx]; U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff); @@ -917,7 +917,7 @@ d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, SLLQueuePush(list->first, list->last, n); list->count += 1; lines_num_voffs[line_idx] += 1; - if(lines_num_voffs[line_idx] >= 8) + if(lines_num_voffs[line_idx] >= max_voffs_per_line) { break; } @@ -932,7 +932,7 @@ d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, } internal D_LineListArray -d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range) +d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range, U64 max_voffs_per_line) { D_LineListArray array = {0}; { @@ -1037,9 +1037,9 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 } internal D_LineList -d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num) +d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num, U64 max_voffs_per_line) { - D_LineListArray array = d_lines_array_from_dbgi_key_file_path_line_range(arena, dbgi_key, file_path, r1s64(line_num, line_num+1)); + D_LineListArray array = d_lines_array_from_dbgi_key_file_path_line_range(arena, dbgi_key, file_path, r1s64(line_num, line_num+1), max_voffs_per_line); D_LineList list = {0}; if(array.count != 0) { @@ -1049,9 +1049,9 @@ d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 } internal D_LineList -d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num) +d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num, U64 max_voffs_per_line) { - D_LineListArray array = d_lines_array_from_file_path_line_range(arena, file_path, r1s64(line_num, line_num+1)); + D_LineListArray array = d_lines_array_from_file_path_line_range(arena, file_path, r1s64(line_num, line_num+1), max_voffs_per_line); D_LineList list = {0}; if(array.count != 0) { diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index bd325413..cad43e6d 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -432,10 +432,10 @@ internal D_LineList d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U6 //- rjf: file:line -> line info // TODO(rjf): this depends on file path maps, needs to move // TODO(rjf): need to clean this up & dedup -internal D_LineListArray d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range); -internal D_LineListArray d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range); -internal D_LineList d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num); -internal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num); +internal D_LineListArray d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range, U64 max_voffs_per_line); +internal D_LineListArray d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range, U64 max_voffs_per_line); +internal D_LineList d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num, U64 max_voffs_per_line); +internal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num, U64 max_voffs_per_line); //////////////////////////////// //~ rjf: Process/Thread/Module Info Lookups diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index b89d6efc..440a465d 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -14287,7 +14287,7 @@ rd_frame(void) // try to map the src coordinates to a vaddr via line info if(vaddr == 0 && file_path.size != 0) { - D_LineList lines = d_lines_from_file_path_line_num(scratch.arena, file_path, point.line); + D_LineList lines = d_lines_from_file_path_line_num(scratch.arena, file_path, point.line, max_U64); for(D_LineNode *n = lines.first; n != 0; n = n->next) { D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 5f98d4ee..eb1834f3 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -342,7 +342,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla String8 file_path = rd_regs()->file_path; D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); DI_Key dbgi_key = d_dbgi_key_from_module(module); - D_LineListArray lines_array = d_lines_array_from_dbgi_key_file_path_line_range(scratch.arena, dbgi_key, file_path, visible_line_num_range); + D_LineListArray lines_array = d_lines_array_from_dbgi_key_file_path_line_range(scratch.arena, dbgi_key, file_path, visible_line_num_range, 8); if(lines_array.count != 0) { MemoryCopy(code_slice_params.line_infos, lines_array.v, sizeof(D_LineList)*lines_array.count); @@ -2226,7 +2226,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) { D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); DI_Key dbgi_key = d_dbgi_key_from_module(module); - rd_regs()->lines = d_lines_from_dbgi_key_file_path_line_num(rd_frame_arena(), dbgi_key, rd_regs()->file_path, rd_regs()->cursor.line); + rd_regs()->lines = d_lines_from_dbgi_key_file_path_line_num(rd_frame_arena(), dbgi_key, rd_regs()->file_path, rd_regs()->cursor.line, 8); } ////////////////////////////// diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index ce5d56f4..4e4cda17 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -725,7 +725,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { DW2_LineTableFile *f = &hdr->files.v[file_idx]; DW2_LineTableFile *dir = &hdr->dirs.v[f->dir_idx]; - String8 full_file_path = str8f(scratch2.arena, "%S/%S", dir->file_name, f->file_name); + String8 full_file_path = str8f(scratch2.arena, "%S%s%S", dir->file_name, dir->file_name.size != 0 ? "/" : "", f->file_name); U64 hash = u64_hash_from_str8(full_file_path); U64 slot_idx = hash%slots_count; SrcFileNode *node = 0; @@ -1112,8 +1112,27 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) if(emit_line && vm_regs.address != 0 && vm_regs.line != 0) { emit_line = 0; + + // rjf: grab the last emitted line info + U32 last_line = 0; + U16 last_col = 0; + if(last_line_seq_chunk != 0 && last_line_seq_chunk->line_count > 0) + { + last_line = last_line_seq_chunk->line_nums[last_line_seq_chunk->line_count-1]; + last_col = last_line_seq_chunk->col_nums[last_line_seq_chunk->line_count-1]; + } + + // rjf: determine if we need a new line + // + // TODO(rjf): in some cases this can trigger w/ DWARF due to columnar changes; + // we need to adjust this when we want to start correctly supporting columnar + // line info / stepping + // + B32 need_new_line = (last_line != (U32)vm_regs.line); + + // rjf: need new line -> grab chunk LineSeqChunk *chunk = last_line_seq_chunk; - if(chunk == 0 || chunk->line_count >= chunk->line_cap) + if(need_new_line && (chunk == 0 || chunk->line_count >= chunk->line_cap)) { chunk = push_array(scratch.arena, LineSeqChunk, 1); SLLQueuePush(first_line_seq_chunk, last_line_seq_chunk, chunk); @@ -1122,28 +1141,33 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) chunk->line_nums = push_array(scratch.arena, U32, chunk->line_cap); chunk->col_nums = push_array(scratch.arena, U16, 2*chunk->line_cap); } - U64 chunk_line_idx = chunk->line_count; - chunk->voffs[chunk_line_idx] = vm_regs.address - base_vaddr; - chunk->line_nums[chunk_line_idx] = (U32)vm_regs.line; - chunk->col_nums[chunk_line_idx] = (U16)vm_regs.column; - chunk->line_count += 1; - total_line_seq_count += 1; - line_seq_src_file = src_file; - // NOTE(rjf): use for comparing against llvm-dwarfdump --debug-line + + // rjf: need new line -> push + if(need_new_line) + { + U64 chunk_line_idx = chunk->line_count; + chunk->voffs[chunk_line_idx] = vm_regs.address - base_vaddr; + chunk->line_nums[chunk_line_idx] = (U32)vm_regs.line; + chunk->col_nums[chunk_line_idx] = (U16)vm_regs.column; + chunk->line_count += 1; + total_line_seq_count += 1; + line_seq_src_file = src_file; + // NOTE(rjf): use for comparing against llvm-dwarfdump --debug-line #if 0 - printf("0x%016I64x %6i %6i %6i %3i %13I64x %7i %s%s%s%s\n", - vm_regs.address, - (int)vm_regs.line, - (int)vm_regs.column, - (int)vm_regs.file_index, - (int)vm_regs.isa, - vm_regs.discriminator, - (int)vm_regs.vliw_op_index, - vm_regs.is_stmt ? " is_stmt" : "", - vm_regs.prologue_end ? " prologue_end" : "", - vm_regs.epilogue_begin ? " epilogue_begin" : "", - vm_regs.end_sequence ? " end_sequence" : ""); + printf("0x%016I64x %6i %6i %6i %3i %13I64x %7i %s%s%s%s\n", + vm_regs.address, + (int)vm_regs.line, + (int)vm_regs.column, + (int)vm_regs.file_index, + (int)vm_regs.isa, + vm_regs.discriminator, + (int)vm_regs.vliw_op_index, + vm_regs.is_stmt ? " is_stmt" : "", + vm_regs.prologue_end ? " prologue_end" : "", + vm_regs.epilogue_begin ? " epilogue_begin" : "", + vm_regs.end_sequence ? " end_sequence" : ""); #endif + } vm_regs.discriminator = 0; vm_regs.basic_block = 0; vm_regs.prologue_end = 0; From a16716eff7a2d99e7d7d5ab9ae0cca03c817df85 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 9 May 2026 12:38:08 -0700 Subject: [PATCH 506/850] d2r2: fix missing function types on functions returning void --- src/linux/window_manager/linux_window_manager.h | 6 +++--- src/raddbg/raddbg_main.c | 1 + src/rdi_from_dwarf/rdi_from_dwarf_2.c | 2 +- src/render/opengl/linux/render_opengl_linux.h | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/linux/window_manager/linux_window_manager.h b/src/linux/window_manager/linux_window_manager.h index 80b5da01..7ee9ddb4 100644 --- a/src/linux/window_manager/linux_window_manager.h +++ b/src/linux/window_manager/linux_window_manager.h @@ -1,8 +1,8 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef OS_GFX_LINUX_H -#define OS_GFX_LINUX_H +#ifndef LINUX_WINDOW_MANAGER_H +#define LINUX_WINDOW_MANAGER_H //////////////////////////////// //~ rjf: Includes @@ -58,4 +58,4 @@ global LNX_WM_GfxState *os_lnx_gfx_state = 0; internal LNX_WM_Window *os_lnx_window_from_x11window(Window window); -#endif // OS_GFX_LINUX_H +#endif // LINUX_WINDOW_MANAGER_H diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index b3da3aef..46b59b94 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -11,6 +11,7 @@ // [ ] type views for `MyByte *` example do not match correctly // // [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! +// [ ] string conditional breakpoints -> size != 0 check seems to fail, can test w/ "rd_init" subprogram type gen in d2r2 // //- evaluation space coverage pass // [ ] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index 4e4cda17..baad683a 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -3381,7 +3381,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: unpack type // RDIM_Type *type = 0; - if(type_attrib != &dw2_attrib_nil) + if(type_attrib != &dw2_attrib_nil || tag.kind == DW_TagKind_SubProgram) { // rjf: functions need to get their type info from themselves; the type attrib // only references the return type. so, in that case, we'll use the procedure's diff --git a/src/render/opengl/linux/render_opengl_linux.h b/src/render/opengl/linux/render_opengl_linux.h index 823e104e..3cab3328 100644 --- a/src/render/opengl/linux/render_opengl_linux.h +++ b/src/render/opengl/linux/render_opengl_linux.h @@ -14,7 +14,7 @@ //~ rjf: Decide On Backend #if !defined(R_OPENGL_LINUX_BACKEND) -# define R_OPENGL_LINUX_BACKEND R_OPENGL_LINUX_BACKEND_EGL +# define R_OPENGL_LINUX_BACKEND R_OPENGL_LINUX_BACKEND_GLX #endif //////////////////////////////// From 0cfc113272ec902cd7346c2123bb97d5dfd0b948 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 9 May 2026 13:30:56 -0700 Subject: [PATCH 507/850] opengl: apply transforms to rendering --- project.4coder | 6 +++--- src/dwarf/dwarf_parse.c | 2 +- src/render/opengl/generated/render_opengl.meta.h | 2 ++ src/render/opengl/render_opengl.c | 5 +++-- src/render/opengl/render_opengl.h | 1 + src/render/opengl/render_opengl.mdesk | 2 ++ 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/project.4coder b/project.4coder index d796d70e..5881d188 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build raddbg opengl", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, @@ -67,8 +67,8 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: running target - .f3 = { .win = "build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - // .f3 = { .win = "raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f3 = { .win = "raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f3 = { .win = "build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "wsl ./build/raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "pushd build && raddbg --user:dev.raddbg_user && popd", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f3 = { .win = "C:/devel/raddebugger/build/raddbg.exe --capture --user:C:/devel/raddebugger/build/local_dev.raddbg_user --project:C:/devel/raddebugger/build/local_dev.raddbg_project", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 9b9b669b..4b8943b8 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -3292,7 +3292,7 @@ dw_parse_cfa_inst(String8 data, case DW_CFA_RememberState: {} break; case DW_CFA_RestoreState: {} break; case DW_CFA_Nop: {} break; - default: { NotImplemented; goto exit; } break; + default: { goto exit; } break; } // fill out output diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index 1ed1de8d..ed115dd8 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -43,6 +43,7 @@ str8_lit_comp( "out float v2p_softness;\n" "out float v2p_omit_texture;\n" "\n" +"uniform mat3 u_xform;\n" "uniform sampler2D u_tex_color;\n" "uniform vec2 u_viewport_size_px;\n" "\n" @@ -59,6 +60,7 @@ str8_lit_comp( " vec2 dst_center = (c2v_dst_rect.zw + c2v_dst_rect.xy) / 2;\n" " vec2 dst_position = vertices[gl_VertexID] * dst_half_size + dst_center;\n" " dst_position.y += shears[gl_VertexID];\n" +" dst_position = (u_xform * vec3(dst_position.x, dst_position.y, 1)).xy;\n" " \n" " // rjf: find src position\n" " vec2 src_half_size = (c2v_src_rect.zw - c2v_src_rect.xy) / 2;\n" diff --git a/src/render/opengl/render_opengl.c b/src/render/opengl/render_opengl.c index d3f413ff..f9fcb290 100644 --- a/src/render/opengl/render_opengl.c +++ b/src/render/opengl/render_opengl.c @@ -469,6 +469,7 @@ r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) glUniformMatrix4fv(glGetUniformLocation(shader, "u_texture_sample_channel_map"), 1, 0, &texture_sample_channel_map.v[0][0]); glUniform2f(glGetUniformLocation(shader, "u_viewport_size_px"), viewport_dim.x, viewport_dim.y); glUniform1f(glGetUniformLocation(shader, "u_opacity"), 1.f - group_params->transparency); + glUniformMatrix3fv(glGetUniformLocation(shader, "u_xform"), 1, 0, &group_params->xform.v[0][0]); } //- rjf: set up scissor @@ -499,8 +500,8 @@ r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) case R_PassKind_Blur: { R_PassParams_Blur *params = pass->params_blur; - GLuint shader = r_ogl_state->shaders[R_OGL_ShaderKind_Blur]; - // TODO(rjf): glBindVertexArrayScope(r_ogl_state->all_purpose_vao) glUseProgramScope(shader) + // GLuint shader = r_ogl_state->shaders[R_OGL_ShaderKind_Blur]; + // glBindVertexArrayScope(r_ogl_state->all_purpose_vao) glUseProgramScope(shader) { // TODO(rjf) } diff --git a/src/render/opengl/render_opengl.h b/src/render/opengl/render_opengl.h index 0414d724..927d2007 100644 --- a/src/render/opengl/render_opengl.h +++ b/src/render/opengl/render_opengl.h @@ -141,6 +141,7 @@ X(glUniform1f, void, (GLint location, GLfloat v0))\ X(glUniform2f, void, (GLint location, GLfloat v0, GLfloat v1))\ X(glUniform3f, void, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2))\ X(glUniform4f, void, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3))\ +X(glUniformMatrix3fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value))\ X(glUniformMatrix4fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value))\ X(glUniform1i, void, (GLint location, GLint v0))\ X(glTexImage3D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels))\ diff --git a/src/render/opengl/render_opengl.mdesk b/src/render/opengl/render_opengl.mdesk index 909c7054..777b17d5 100644 --- a/src/render/opengl/render_opengl.mdesk +++ b/src/render/opengl/render_opengl.mdesk @@ -68,6 +68,7 @@ out float v2p_border_thickness; out float v2p_softness; out float v2p_omit_texture; +uniform mat3 u_xform; uniform sampler2D u_tex_color; uniform vec2 u_viewport_size_px; @@ -84,6 +85,7 @@ void main(void) vec2 dst_center = (c2v_dst_rect.zw + c2v_dst_rect.xy) / 2; vec2 dst_position = vertices[gl_VertexID] * dst_half_size + dst_center; dst_position.y += shears[gl_VertexID]; + dst_position = (u_xform * vec3(dst_position.x, dst_position.y, 1)).xy; // rjf: find src position vec2 src_half_size = (c2v_src_rect.zw - c2v_src_rect.xy) / 2; From 6a95da35e0a794f1e0e528ea6a691d734a3c69c4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 9 May 2026 20:25:14 -0700 Subject: [PATCH 508/850] opengl: more coverage/convergence w/ d3d11 --- .../d3d11/generated/render_d3d11.meta.h | 3 +- src/render/d3d11/render_d3d11.mdesk | 3 +- .../opengl/generated/render_opengl.meta.h | 5 +- src/render/opengl/render_opengl.c | 219 ++++++++++++++++-- src/render/opengl/render_opengl.h | 64 +++++ src/render/opengl/render_opengl.mdesk | 5 +- 6 files changed, 267 insertions(+), 32 deletions(-) diff --git a/src/render/d3d11/generated/render_d3d11.meta.h b/src/render/d3d11/generated/render_d3d11.meta.h index 6578fe5b..9855582f 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.h +++ b/src/render/d3d11/generated/render_d3d11.meta.h @@ -306,7 +306,6 @@ str8_lit_comp( "{\n" " // rjf: blend weighted texture samples into color\n" " float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\n" -" \n" " for(uint i = 1; i < blur_count; i += 1)\n" " {\n" " float weight = kernel[i].x;\n" @@ -321,7 +320,7 @@ str8_lit_comp( " \n" " // rjf: weight output color by sdf\n" " // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n" -" if (corner_sdf_t < 0.9f)\n" +" if(corner_sdf_t < 0.9f)\n" " {\n" " discard;\n" " }\n" diff --git a/src/render/d3d11/render_d3d11.mdesk b/src/render/d3d11/render_d3d11.mdesk index 888fa4a9..102dd590 100644 --- a/src/render/d3d11/render_d3d11.mdesk +++ b/src/render/d3d11/render_d3d11.mdesk @@ -304,7 +304,6 @@ ps_main(Vertex2Pixel v2p) : SV_TARGET { // rjf: blend weighted texture samples into color float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb; - for(uint i = 1; i < blur_count; i += 1) { float weight = kernel[i].x; @@ -319,7 +318,7 @@ ps_main(Vertex2Pixel v2p) : SV_TARGET // rjf: weight output color by sdf // this is doing alpha testing, leave blurring only where mostly opaque pixels are - if (corner_sdf_t < 0.9f) + if(corner_sdf_t < 0.9f) { discard; } diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index ed115dd8..0e94599d 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -216,7 +216,7 @@ str8_lit_comp( " vec2 rect_half_size = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" " \n" " gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f);\n" -" texcoord = vertex_position_pct;\n" +" texcoord = vec2(vertex_position_pct.x, 1-vertex_position_pct.y);\n" " sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size;\n" " rect_half_size = rect_half_size - 2.f;\n" " corner_radius = corner_radii_px[gl_VertexID];\n" @@ -251,7 +251,6 @@ str8_lit_comp( "{\n" " // rjf: blend weighted texture samples into color\n" " vec3 color = kernel[0].x * texture(tex, texcoord).rgb;\n" -" \n" " for(int i = 1; i < blur_count; i += 1)\n" " {\n" " float weight = kernel[i].x;\n" @@ -262,7 +261,7 @@ str8_lit_comp( " \n" " // rjf: sample for corners\n" " float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size, corner_radius);\n" -" float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\n" +" float corner_sdf_t = smoothstep(0, 2, corner_sdf_s);\n" " \n" " // rjf: weight output color by sdf\n" " // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n" diff --git a/src/render/opengl/render_opengl.c b/src/render/opengl/render_opengl.c index f9fcb290..dc58659b 100644 --- a/src/render/opengl/render_opengl.c +++ b/src/render/opengl/render_opengl.c @@ -172,15 +172,28 @@ r_init(CmdLine *cmdln) } //- rjf: set up built-in resources - glGenVertexArrays(1, &r_ogl_state->all_purpose_vao); - glGenBuffers(1, &r_ogl_state->scratch_buffer_64kb); - glBindBuffer(GL_ARRAY_BUFFER, r_ogl_state->scratch_buffer_64kb); - glBufferData(GL_ARRAY_BUFFER, KB(64), 0, GL_DYNAMIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glGenTextures(1, &r_ogl_state->white_texture); - glBindTexture(GL_TEXTURE_2D, r_ogl_state->white_texture); - U32 white_pixel = 0xffffffff; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &white_pixel); + { + // rjf: all-purpose VAO + glGenVertexArrays(1, &r_ogl_state->all_purpose_vao); + + // rjf: scratch buffer + { + glGenBuffers(1, &r_ogl_state->scratch_buffer_64kb); + glBindBuffer(GL_ARRAY_BUFFER, r_ogl_state->scratch_buffer_64kb); + glBufferData(GL_ARRAY_BUFFER, KB(64), 0, GL_DYNAMIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + + // rjf: white texture + { + glGenTextures(1, &r_ogl_state->white_texture); + glBindTexture(GL_TEXTURE_2D, r_ogl_state->white_texture); + U32 white_pixel = 0xffffffff; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &white_pixel); + } + } + + //- rjf: set up options glEnable(GL_FRAMEBUFFER_SRGB); //- rjf: set up buffer flush state @@ -203,14 +216,27 @@ r_init(CmdLine *cmdln) r_hook R_Handle r_window_equip(WM_Window window) { - R_Handle result = r_ogl_os_window_equip(window); + R_OGL_Window *w = r_ogl_state->free_window; + if(w != 0) + { + SLLStackPop(r_ogl_state->free_window); + } + else + { + w = push_array(r_ogl_state->arena, R_OGL_Window, 1); + } + MemoryZeroStruct(w); + w->os = r_ogl_os_window_equip(window); + R_Handle result = {(U64)w}; return result; } r_hook void r_window_unequip(WM_Window window, R_Handle window_equip) { - r_ogl_os_window_unequip(window, window_equip); + R_OGL_Window *w = (R_OGL_Window *)window_equip.u64[0]; + r_ogl_os_window_unequip(window, w->os); + SLLStackPush(r_ogl_state->free_window, w); } //- rjf: textures @@ -337,21 +363,68 @@ r_begin_frame(void) r_hook void r_end_frame(void) { - // TODO(rjf) + for(R_OGL_FlushBuffer *flush_buffer = r_ogl_state->first_buffer_to_flush; flush_buffer != 0; flush_buffer = flush_buffer->next) + { + glDeleteBuffers(1, &flush_buffer->id); + } + arena_clear(r_ogl_state->buffer_flush_arena); + r_ogl_state->first_buffer_to_flush = r_ogl_state->last_buffer_to_flush = 0; } r_hook void r_window_begin_frame(WM_Window os, R_Handle r) { r_ogl_os_select_window(os, r); + R_OGL_Window *window = (R_OGL_Window *)r.u64[0]; //- rjf: unpack window viewport info Rng2F32 client_rect = wm_client_rect_from_window(os); Vec2F32 client_rect_dim = dim_2f32(client_rect); + //- rjf: set up targets if needed + if(client_rect_dim.x != window->last_client_rect_dim.x || client_rect_dim.y != window->last_client_rect_dim.y) + { + window->last_client_rect_dim = client_rect_dim; + R_OGL_RenderTarget *targets[] = + { + &window->stage_target, + &window->stage_scratch_target, + }; + for EachElement(idx, targets) + { + if(targets[idx]->fbo != 0) + { + glDeleteFramebuffers(1, &targets[idx]->fbo); + glDeleteTextures(1, &targets[idx]->color_texture); + } + glGenFramebuffers(1, &targets[idx]->fbo); + glGenTextures(1, &targets[idx]->color_texture); + glBindFramebufferScope(GL_FRAMEBUFFER, targets[idx]->fbo) + glBindTextureScope(GL_TEXTURE_2D, targets[idx]->color_texture) + { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (S32)client_rect_dim.x, (S32)client_rect_dim.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targets[idx]->color_texture, 0); + } + } + } + //- rjf: clear and reset state - glClearColor(0, 0, 0, 0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + { + GLuint fbos[] = + { + window->stage_target.fbo, + window->stage_scratch_target.fbo, + 0, + }; + for EachElement(idx, fbos) + { + glBindFramebufferScope(GL_FRAMEBUFFER, fbos[idx]) + { + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } + } + } glViewport(0, 0, (S32)client_rect_dim.x, (S32)client_rect_dim.y); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -360,12 +433,18 @@ r_window_begin_frame(WM_Window os, R_Handle r) r_hook void r_window_end_frame(WM_Window os, R_Handle r) { - for(R_OGL_FlushBuffer *flush_buffer = r_ogl_state->first_buffer_to_flush; flush_buffer != 0; flush_buffer = flush_buffer->next) + R_OGL_Window *window = (R_OGL_Window *)r.u64[0]; + + //- rjf: blit window's main staging frame buffer to window frame buffer + glBindFramebufferScope(GL_READ_FRAMEBUFFER, window->stage_target.fbo) glBindFramebufferScope(GL_DRAW_FRAMEBUFFER, 0) { - glDeleteBuffers(1, &flush_buffer->id); + glBlitFramebuffer(0, 0, (S32)window->last_client_rect_dim.x, (S32)window->last_client_rect_dim.y, + 0, 0, (S32)window->last_client_rect_dim.x, (S32)window->last_client_rect_dim.y, + GL_COLOR_BUFFER_BIT, + GL_NEAREST); } - arena_clear(r_ogl_state->buffer_flush_arena); - r_ogl_state->first_buffer_to_flush = r_ogl_state->last_buffer_to_flush = 0; + + //- rjf: swap buffers r_ogl_os_window_swap(os, r); } @@ -374,6 +453,7 @@ r_window_end_frame(WM_Window os, R_Handle r) r_hook void r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) { + R_OGL_Window *w = (R_OGL_Window *)window_equip.u64[0]; Rng2F32 viewport_rect = wm_client_rect_from_window(window); Vec2F32 viewport_dim = dim_2f32(viewport_rect); for(R_PassNode *pass_n = passes->first; pass_n != 0; pass_n = pass_n->next) @@ -394,7 +474,9 @@ r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) //- rjf: draw each batch group GLuint shader = r_ogl_state->shaders[R_OGL_ShaderKind_Rect]; - glBindVertexArrayScope(r_ogl_state->all_purpose_vao) glUseProgramScope(shader) + glUseProgramScope(shader) + glBindVertexArrayScope(r_ogl_state->all_purpose_vao) + glBindFramebufferScope(GL_FRAMEBUFFER, w->stage_target.fbo) { for(R_BatchGroup2DNode *group_n = rect_batch_groups->first; group_n != 0; group_n = group_n->next) { @@ -500,10 +582,103 @@ r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) case R_PassKind_Blur: { R_PassParams_Blur *params = pass->params_blur; - // GLuint shader = r_ogl_state->shaders[R_OGL_ShaderKind_Blur]; - // glBindVertexArrayScope(r_ogl_state->all_purpose_vao) glUseProgramScope(shader) + GLuint shader = r_ogl_state->shaders[R_OGL_ShaderKind_Blur]; + glUseProgramScope(shader) + glBindVertexArrayScope(r_ogl_state->all_purpose_vao) { - // TODO(rjf) + //- rjf: form blur sampling kernel + Vec4F32 kernel[32] = {0}; + U64 blur_count = 0; + { + // + // TODO(rjf): adopted from martins' d3d11 impl, should dedup in common render helpers + // + F32 weights[ArrayCount(kernel)*2] = {0}; + F32 blur_size = Min(params->blur_size, ArrayCount(weights)); + blur_count = (U64)round_f32(blur_size); + F32 stdev = (blur_size-1.f)/2.f; + F32 one_over_root_2pi_stdev2 = 1/sqrt_f32(2*pi32*stdev*stdev); + F32 euler32 = 2.718281828459045f; + weights[0] = 1.f; + if(stdev > 0.f) + { + for(U64 idx = 0; idx < blur_count; idx += 1) + { + F32 kernel_x = (F32)idx; + weights[idx] = one_over_root_2pi_stdev2*pow_f32(euler32, -kernel_x*kernel_x/(2.f*stdev*stdev)); + } + } + if(weights[0] > 1.f) + { + MemoryZeroArray(weights); + weights[0] = 1.f; + } + else + { + // prepare weights & offsets for bilinear lookup + // blur filter wants to calculate w0*pixel[pos] + w1*pixel[pos+1] + ... + // with bilinear filter we can do this calulation by doing only w*sample(pos+t) = w*((1-t)*pixel[pos] + t*pixel[pos+1]) + // we can see w0=w*(1-t) and w1=w*t + // thus w=w0+w1 and t=w1/w + for(U64 idx = 1; idx < blur_count; idx += 2) + { + F32 w0 = weights[idx + 0]; + F32 w1 = weights[idx + 1]; + F32 w = w0 + w1; + F32 t = w1 / w; + + // each kernel element is float2(weight, offset) + // weights & offsets are adjusted for bilinear sampling + // zw elements are not used, a bit of waste but it allows for simpler shader code + kernel[(idx+1)/2] = v4f32(w, (F32)idx + t, 0, 0); + } + } + kernel[0].x = weights[0]; + } + + //- rjf: set up uniforms + glUniform4fv(glGetUniformLocation(shader, "rect"), 1, (F32 *)(¶ms->rect)); + glUniform4fv(glGetUniformLocation(shader, "corner_radii_px"), 1, params->corner_radii); + glUniform2f(glGetUniformLocation(shader, "viewport_size"), viewport_dim.x, viewport_dim.y); + glUniform1i(glGetUniformLocation(shader, "blur_count"), blur_count); + glUniform4fv(glGetUniformLocation(shader, "kernel"), ArrayCount(kernel), (F32 *)&kernel[0]); + glActiveTexture(GL_TEXTURE0); + + //- rjf: set up scissor + if(params->clip.x0 != 0 || + params->clip.x1 != 0 || + params->clip.y0 != 0 || + params->clip.y1 != 0) + { + Rng2F32 clip = params->clip; + glScissor(clip.x0, viewport_dim.y - clip.y1, (clip.x1-clip.x0) + 1, (clip.y1-clip.y0)+1); + glEnable(GL_SCISSOR_TEST); + } + + //- rjf: pass 1: stage -(horizontal)-> stage_scratch + glBindFramebufferScope(GL_FRAMEBUFFER, w->stage_scratch_target.fbo) + glBindTextureScope(GL_TEXTURE_2D, w->stage_target.color_texture) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glUniform2f(glGetUniformLocation(shader, "direction"), 1.f/viewport_dim.x, 0); + glUniform1i(glGetUniformLocation(shader, "tex"), 0); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + //- rjf: pass 2: stage_scratch -(vertical)-> stage + glBindFramebufferScope(GL_FRAMEBUFFER, w->stage_target.fbo) + glBindTextureScope(GL_TEXTURE_2D, w->stage_scratch_target.color_texture) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glUniform2f(glGetUniformLocation(shader, "direction"), 0, 1.f/viewport_dim.y); + glUniform1i(glGetUniformLocation(shader, "tex"), 0); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + //- rjf: unset scissor + glDisable(GL_SCISSOR_TEST); } }break; diff --git a/src/render/opengl/render_opengl.h b/src/render/opengl/render_opengl.h index 927d2007..b26fe155 100644 --- a/src/render/opengl/render_opengl.h +++ b/src/render/opengl/render_opengl.h @@ -11,9 +11,46 @@ typedef char GLchar; typedef ptrdiff_t GLsizeiptr; typedef ptrdiff_t GLintptr; +#define GL_FRAMEBUFFER 0x8D40 #define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 + +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF + #define GL_R8 0x8229 #define GL_ARRAY_BUFFER 0x8892 @@ -117,6 +154,8 @@ X(glBindBuffer, void, (GLenum target, GLuint buffer))\ X(glDeleteBuffers, void, (GLsizei n, GLuint *buffers))\ X(glGenVertexArrays, void, (GLsizei n, GLuint *arrays))\ X(glBindVertexArray, void, (GLuint array))\ +X(glGenFramebuffers, void, (GLsizei n, GLuint *fbos))\ +X(glDeleteFramebuffers, void, (GLsizei n, GLuint *fbos))\ X(glCreateProgram, GLuint, (void))\ X(glCreateShader, GLuint, (GLenum type))\ X(glShaderSource, void, (GLuint shader, GLsizei count, char **string, GLint *length))\ @@ -141,6 +180,7 @@ X(glUniform1f, void, (GLint location, GLfloat v0))\ X(glUniform2f, void, (GLint location, GLfloat v0, GLfloat v1))\ X(glUniform3f, void, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2))\ X(glUniform4f, void, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3))\ +X(glUniform4fv, void, (GLint location, GLsizei count, const GLfloat *value))\ X(glUniformMatrix3fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value))\ X(glUniformMatrix4fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value))\ X(glUniform1i, void, (GLint location, GLint v0))\ @@ -149,10 +189,13 @@ X(glTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffs X(glGenerateMipmap, void, (GLenum target))\ X(glBindAttribLocation, void, (GLuint programObj, GLuint index, char *name))\ X(glBindFragDataLocation, void, (GLuint program, GLuint color, char *name))\ +X(glBindFramebuffer, void, (GLenum target, GLuint fbo))\ X(glActiveTexture, void, (GLenum texture))\ X(glVertexAttribDivisor, void, (GLuint index, GLuint divisor))\ X(glDrawArraysInstanced, void, (GLenum mode, GLint first, GLsizei count, GLsizei instancecount))\ X(glDebugMessageCallback, void, (void (*)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam), void *user_data))\ +X(glFramebufferTexture2D, void, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level))\ +X(glBlitFramebuffer, void, (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter))\ #define X(name, r, p) typedef r name##_FunctionType p; R_OGL_ProcedureXList @@ -189,10 +232,28 @@ struct R_OGL_FlushBuffer GLuint id; }; +typedef struct R_OGL_RenderTarget R_OGL_RenderTarget; +struct R_OGL_RenderTarget +{ + GLuint fbo; + GLuint color_texture; +}; + +typedef struct R_OGL_Window R_OGL_Window; +struct R_OGL_Window +{ + R_OGL_Window *next; + R_Handle os; + Vec2F32 last_client_rect_dim; + R_OGL_RenderTarget stage_target; + R_OGL_RenderTarget stage_scratch_target; +}; + typedef struct R_OGL_State R_OGL_State; struct R_OGL_State { Arena *arena; + R_OGL_Window *free_window; R_OGL_Tex2D *free_tex2d; GLuint shaders[R_OGL_ShaderKind_COUNT]; GLuint all_purpose_vao; @@ -219,6 +280,9 @@ internal void r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id #define glUseProgramScope(...) DeferLoop(glUseProgram(__VA_ARGS__), glUseProgram(0)) #define glBindVertexArrayScope(...) DeferLoop(glBindVertexArray(__VA_ARGS__), glBindVertexArray(0)) +#define glBindFramebufferScope(target, ...) DeferLoop(glBindFramebuffer((target), __VA_ARGS__), glBindFramebuffer((target), 0)) +#define glBindTextureScope(target, ...) DeferLoop(glBindTexture((target), __VA_ARGS__), glBindTexture((target), 0)) +#define glEnableScope(...) DeferLoop(glEnable(__VA_ARGS__), glDisable(__VA_ARGS__)) //////////////////////////////// //~ rjf: OS-Specific Hooks diff --git a/src/render/opengl/render_opengl.mdesk b/src/render/opengl/render_opengl.mdesk index 777b17d5..d6d31a7a 100644 --- a/src/render/opengl/render_opengl.mdesk +++ b/src/render/opengl/render_opengl.mdesk @@ -240,7 +240,7 @@ void main(void) vec2 rect_half_size = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2); gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f); - texcoord = vertex_position_pct; + texcoord = vec2(vertex_position_pct.x, 1-vertex_position_pct.y); sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size; rect_half_size = rect_half_size - 2.f; corner_radius = corner_radii_px[gl_VertexID]; @@ -273,7 +273,6 @@ void main(void) { // rjf: blend weighted texture samples into color vec3 color = kernel[0].x * texture(tex, texcoord).rgb; - for(int i = 1; i < blur_count; i += 1) { float weight = kernel[i].x; @@ -284,7 +283,7 @@ void main(void) // rjf: sample for corners float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size, corner_radius); - float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s); + float corner_sdf_t = smoothstep(0, 2, corner_sdf_s); // rjf: weight output color by sdf // this is doing alpha testing, leave blurring only where mostly opaque pixels are From 52da228efeaf10d24c1cb532bf6433123cd01af7 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 11 May 2026 11:49:15 -0700 Subject: [PATCH 509/850] artifact_cache: fix leak of old-generation artifacts, when those artifacts are replaced by newer generation computations. artifacts can opaquely hold things like arena pointers, and so when we replace them in the cache, we need to respect the lookup api's provision of create/destroy hooks for the cache, such that the artifacts can be released correctly (using the destroy hook) before being replaced. this is separate from regular eviction. --- project.4coder | 2 +- src/artifact_cache/artifact_cache.c | 24 +++++++++ src/base/base_arena.c | 80 ++++++++++++++++++++++++++++- src/base/base_arena.h | 3 ++ src/base/base_thread_context.c | 4 +- src/dbg_engine/dbg_engine_ctrl.c | 2 +- src/raddbg/raddbg_main.c | 58 +++++++++++++++------ src/render/opengl/render_opengl.h | 8 +-- 8 files changed, 157 insertions(+), 24 deletions(-) diff --git a/project.4coder b/project.4coder index 5881d188..40c41a21 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build raddbg opengl", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 3dd24a2d..53abac40 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -422,6 +422,18 @@ ac_async_tick(void) { if(str8_match(n->key, r->key, 0)) { + // rjf: eliminate existing values, if nay + if(cache->destroy && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) + { + if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0)) + { + cache->destroy(n->val); + break; + } + cond_var_wait_rw(stripe->cv, stripe->rw_mutex, 1, max_U64); + } + + // rjf: write new value n->last_completed_gen = gen; n->val = val; ins_atomic_u64_dec_eval(&n->working_count); @@ -531,6 +543,18 @@ ac_async_tick(void) { if(str8_match(n->key, r->key, 0)) { + // rjf: eliminate existing values, if nay + if(cache->destroy && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) + { + if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0)) + { + cache->destroy(n->val); + break; + } + cond_var_wait_rw(stripe->cv, stripe->rw_mutex, 1, max_U64); + } + + // rjf: store n->last_completed_gen = gen; n->val = val; ins_atomic_u64_dec_eval(&n->working_count); diff --git a/src/base/base_arena.c b/src/base/base_arena.c index e754399d..c83db36f 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -1,6 +1,25 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Global Arena Table + +#if ARENA_TABLE_DEBUG +typedef struct ArenaTableNode ArenaTableNode; +struct ArenaTableNode +{ + ArenaTableNode *next; + Arena *arena; +}; +global U64 arena_table_take_init = 0; +global U64 arena_table_inited = 0; +global U64 arena_table_lock = 0; +global ArenaTableNode *arena_table = 0; +global U64 arena_table_count = 0; +global U64 arena_table_cap = 0; +global ArenaTableNode *free_arena_table_node = 0; +#endif + //////////////////////////////// //~ rjf: Arena Functions @@ -8,7 +27,7 @@ internal Arena * arena_alloc_(ArenaParams *params) -{ +{ U64 reserve_size = params->reserve_size; U64 commit_size = params->commit_size; @@ -73,6 +92,47 @@ arena_alloc_(ArenaParams *params) #if ARENA_FREE_LIST arena->free_last = 0; #endif + + // rjf: store in global arena table +#if ARENA_TABLE_DEBUG + if(ins_atomic_u64_eval_cond_assign(&arena_table_take_init, 1, 0) == 0) + { + arena_table = reserve_memory(GB(256)); + arena_table_cap = 4096; + commit_memory(arena_table, arena_table_cap * sizeof(arena_table[0])); + ins_atomic_u64_inc_eval(&arena_table_inited); + } + for(;!ins_atomic_u64_eval(&arena_table_inited);) {} + for(;;) + { + B32 got_lock = (ins_atomic_u64_eval_cond_assign(&arena_table_lock, 1, 0) == 0); + if(got_lock) + { + ArenaTableNode *node = free_arena_table_node; + if(node != 0) + { + SLLStackPop(free_arena_table_node); + } + else + { + node = &arena_table[arena_table_count]; + if(arena_table_count >= arena_table_cap) + { + U64 arena_table_cap__pre_grow = arena_table_cap; + arena_table_cap *= 2; + U64 arena_table_cap__post_grow = arena_table_cap; + commit_memory(arena_table + arena_table_cap__pre_grow, sizeof(arena_table[0]) * (arena_table_cap__post_grow - arena_table_cap__pre_grow)); + } + arena_table_count += 1; + } + node->arena = arena; + arena->table_node = node; + ins_atomic_u64_eval_assign(&arena_table_lock, 0); + break; + } + } +#endif + return arena; } @@ -87,6 +147,24 @@ arena_release(Arena *arena) } #endif +#if ARENA_TABLE_DEBUG + for(Arena *n = arena->current; n != 0; n = n->prev) + { + for(;;) + { + B32 got_lock = (ins_atomic_u64_eval_cond_assign(&arena_table_lock, 1, 0) == 0); + if(got_lock) + { + ArenaTableNode *table_node = n->table_node; + MemoryZeroStruct(table_node); + SLLStackPush(free_arena_table_node, table_node); + ins_atomic_u64_eval_assign(&arena_table_lock, 0); + break; + } + } + } +#endif + for(Arena *n = arena->current, *prev = 0; n != 0; n = prev) { prev = n->prev; diff --git a/src/base/base_arena.h b/src/base/base_arena.h index 5a1d82c2..b3ba3782 100644 --- a/src/base/base_arena.h +++ b/src/base/base_arena.h @@ -46,6 +46,9 @@ struct Arena #if ARENA_FREE_LIST Arena *free_last; #endif +#if ARENA_TABLE_DEBUG + struct ArenaTableNode *table_node; +#endif }; StaticAssert(sizeof(Arena) <= ARENA_HEADER_SIZE, arena_header_size_check); diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index a6a8dfc2..42163610 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -19,8 +19,8 @@ tctx_alloc(void) { #if PROFILE_TELEMETRY thread_static static char name[2][1024]; - raddbg_snprintf(name[0], sizeof(name[0]), "Scratch/0[TID:%u]", os_tid()); - raddbg_snprintf(name[1], sizeof(name[1]), "Scratch/1[TID:%u]", os_tid()); + raddbg_snprintf(name[0], sizeof(name[0]), "Scratch/0[TID:%u]", tid()); + raddbg_snprintf(name[1], sizeof(name[1]), "Scratch/1[TID:%u]", tid()); Arena *arena_0 = arena_alloc(.name = name[0]); Arena *arena_1 = arena_alloc(.name = name[1]); #else diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 08523c24..1e821a25 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -6820,7 +6820,7 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 good = 1; call_stack[0] = d_call_stack_from_unwind(arena, process, &unwind); } - if(unwind.flags & D_UnwindFlag_Stale) + else { retry = 1; } diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 46b59b94..e129dfc5 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,19 +4,45 @@ //////////////////////////////// //~ rjf: post-0.9.25 TODO notes // +// [ ] "autos" collection, which can be evaluated +// [ ] show "autos" inline in source code near thread? +// [ ] step out of scopes / loops +// [ ] memory_size(...) view for quickly evaluating memory sizes +// [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold +// +// [ ] project/user file improvements +// [ ] "default" -> "untitled" +// [ ] should clear default project data every time the program starts +// [ ] new project / user should not require picking a path; should just +// by default go to "untitled" in default user path +// [ ] more things should move to user data, but project-tagged - like +// recent files, watches?, etc. +// +// [ ] killing/restarting thread performance (#780) +// [ ] codebase-internal barrier impl (win7/linux support) +// [ ] PDB -> RDI conversion memory usage +// [ ] policy for closing debug info which is no longer relevant? +// [ ] external window focusing bugs +// // [ ] linux/dwarf fixes +// [ ] excessive CPU usage on async threads - barrier impl? // [ ] step-over/step-into doesn't step successfully in many cases, just causes a continue -// [ ] rd_frame has no type info, should be (void -> void) - type should be generated but it +// [x] rd_frame has no type info, should be (void -> void) - type should be generated but it // is not being hooked up correctly // [ ] type views for `MyByte *` example do not match correctly // // [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! // [ ] string conditional breakpoints -> size != 0 check seems to fail, can test w/ "rd_init" subprogram type gen in d2r2 +// [ ] no selected thread -> causing evaluation failures, e.g. with go-to-definition // //- evaluation space coverage pass // [ ] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces // [ ] need concrete ways of referring into a space at any offset - e.g. `process.memory + 0x1234`, `file:"foo".data + 0x1234`, `thread.regs + 0x80`, etc. // [ ] memory view needs to take advantage of above when peeking; ensure peeking works on files etc. +// [ ] need to eliminate accelerators from evaluation context, and build them on the fly instead - +// this is necessary because, for instance, the correct locals_map varies by expression, if we +// want to (we do) support features like "look up call stack to find local" +// [ ] unit / module name qualification // //- memory view pass // [ ] toggleable ascii column @@ -31,10 +57,10 @@ // [ ] signify empty watch window "expression" slot more as a text field? // //- jeff notes -// [ ] option to prefer addresses first with string ptrs // [ ] focus changing on f10/f11? may be related to auto_run/auto_step - look at a bin/jeffr -// [ ] option to turn off transient tabs altogether // [ ] single-line viz for pointers w/ bad (unmapped) addresses +// [ ] option to prefer addresses first with string ptrs +// [x] option to turn off transient tabs altogether // //- namespace/locations/variables RDI pass // [x] RDI_Local, RDI_GlobalVariable, RDI_ThreadVariable -> RDI_Variable @@ -58,12 +84,12 @@ //- urgent fixes // [ ] (use msvc assert as an example) show fastfail exception info (code, name, etc.) - comes from ExceptionInformation @fastfail // [ ] stepping w/ spoofs & shadow stack enabled - writing spoof will send a stack buffer overrun event @shadow_stack_step -// [ ] hardware breakpoints regression (global eval in ctrl) // [ ] native filesystem dialog, resizing raddbg window -> crash! -// [ ] stdout/stderr path target setting is now busted >:( +// [ ] stdout/stderr path target setting is now busted >:( (i think this is because of path confusion? check working dir) // [ ] target ui entry point should override built-in entry point // [ ] list of all tabs in palette // [ ] u64 + (ptr - ptr) seems to produce unexpected results - double check with C rules? +// [x] hardware breakpoints regression (global eval in ctrl) // //- flow notes // [ ] "skip breakpoint, run to source", when stopped at a non-source location @@ -74,9 +100,9 @@ //- memory view // [ ] have smaller visible range than entire memory space, within some bounds (e.g. 64KB) // [ ] dynamically expand memory space, based on scrolling -// [ ] fix clicking through occluded panels etc. // [ ] disambiguate . character in ASCII columns -// [ ] fix type intepretations of cursor in bottom pane +// [x] fix type intepretations of cursor in bottom pane +// [x] fix clicking through occluded panels etc. // //- watch improvements // [ ] *ALL* expressions in watch windows need to be editable. @@ -203,21 +229,21 @@ // [ ] search-in-all-files // [ ] automatically snap to search matches when searching source files // [ ] memory view -// [ ] memory view mutation controls // [ ] memory view user-made annotations // [ ] memory view searching +// [x] memory view mutation controls // [ ] disasm view // [ ] visualize jump destinations in disasm // //- longer-term future features // [ ] long-term future notes from martins -// [ ] core dump saving/loading -// [ ] parallel call stacks view -// [ ] parallel watch view -// [ ] mixed native/interpreted/jit debugging -// - it seems python has a top-level linked list of interpreter states, -// which should allow the debugger to map native callstacks to python -// code +// [ ] core dump saving/loading +// [ ] parallel call stacks view +// [ ] parallel watch view +// [ ] mixed native/interpreted/jit debugging +// - it seems python has a top-level linked list of interpreter states, +// which should allow the debugger to map native callstacks to python +// code // //- code cleanup // [ ] eliminate explicit font parameters in the various ui paths (e.g. @@ -257,6 +283,8 @@ #define FNT_INIT_MANUAL 1 #define RD_INIT_MANUAL 1 +#define ARENA_TABLE_DEBUG BUILD_DEBUG + //////////////////////////////// //~ rjf: Includes diff --git a/src/render/opengl/render_opengl.h b/src/render/opengl/render_opengl.h index b26fe155..e64ec04c 100644 --- a/src/render/opengl/render_opengl.h +++ b/src/render/opengl/render_opengl.h @@ -278,11 +278,11 @@ internal R_OGL_FormatInfo r_ogl_format_info_from_tex2dformat(R_Tex2DFormat fmt); internal GLuint r_ogl_instance_buffer_from_size(U64 size); internal void r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam); -#define glUseProgramScope(...) DeferLoop(glUseProgram(__VA_ARGS__), glUseProgram(0)) -#define glBindVertexArrayScope(...) DeferLoop(glBindVertexArray(__VA_ARGS__), glBindVertexArray(0)) +#define glUseProgramScope(...) DeferLoop(glUseProgram(__VA_ARGS__), glUseProgram(0)) +#define glBindVertexArrayScope(...) DeferLoop(glBindVertexArray(__VA_ARGS__), glBindVertexArray(0)) #define glBindFramebufferScope(target, ...) DeferLoop(glBindFramebuffer((target), __VA_ARGS__), glBindFramebuffer((target), 0)) -#define glBindTextureScope(target, ...) DeferLoop(glBindTexture((target), __VA_ARGS__), glBindTexture((target), 0)) -#define glEnableScope(...) DeferLoop(glEnable(__VA_ARGS__), glDisable(__VA_ARGS__)) +#define glBindTextureScope(target, ...) DeferLoop(glBindTexture((target), __VA_ARGS__), glBindTexture((target), 0)) +#define glEnableScope(...) DeferLoop(glEnable(__VA_ARGS__), glDisable(__VA_ARGS__)) //////////////////////////////// //~ rjf: OS-Specific Hooks From de35a86505ad590b927aa1d66f7d2674b3347d8d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 11 May 2026 13:29:29 -0700 Subject: [PATCH 510/850] fix artifact cache replaced-value deletion - this CAN NOT run if the new value == the old value --- project.4coder | 2 +- src/artifact_cache/artifact_cache.c | 10 ++- src/dbg_engine/dbg_engine_ctrl.c | 2 +- src/dbg_engine/dbg_engine_user.c | 124 ++++++++++++++++++++++++++-- src/dbg_engine/dbg_engine_user.h | 1 + src/raddbg/raddbg_core.c | 11 ++- src/raddbg/raddbg_main.c | 13 +-- src/text/text.c | 5 +- 8 files changed, 142 insertions(+), 26 deletions(-) diff --git a/project.4coder b/project.4coder index 40c41a21..1ff38098 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 53abac40..b5920e6c 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -422,12 +422,13 @@ ac_async_tick(void) { if(str8_match(n->key, r->key, 0)) { - // rjf: eliminate existing values, if nay - if(cache->destroy && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) + // rjf: eliminate existing values, if any, if they do not match the current + if(!MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) { if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0)) { cache->destroy(n->val); + MemoryZeroStruct(&n->val); break; } cond_var_wait_rw(stripe->cv, stripe->rw_mutex, 1, max_U64); @@ -543,12 +544,13 @@ ac_async_tick(void) { if(str8_match(n->key, r->key, 0)) { - // rjf: eliminate existing values, if nay - if(cache->destroy && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) + // rjf: eliminate existing values, if any, if they do not match the current + if(!MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) { if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0)) { cache->destroy(n->val); + MemoryZeroStruct(&n->val); break; } cond_var_wait_rw(stripe->cv, stripe->rw_mutex, 1, max_U64); diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 1e821a25..d33b1f5d 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -288,7 +288,7 @@ internal void d_msg_deep_copy(Arena *arena, D_Msg *dst, D_Msg *src) { MemoryCopyStruct(dst, src); - dst->path = push_str8_copy(arena, src->path); + dst->path = str8_copy(arena, src->path); dst->entry_points = str8_list_copy(arena, &src->entry_points); dst->cmd_line_string_list = str8_list_copy(arena, &src->cmd_line_string_list); dst->env_string_list = str8_list_copy(arena, &src->env_string_list); diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 9c9712ff..5cc0be1f 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -169,10 +169,13 @@ d_cmd_params_copy(Arena *arena, D_CmdParams *src) for(U64 idx = 0; idx < dst.targets.count; idx += 1) { D_Target *target = &dst.targets.v[idx]; - target->exe = push_str8_copy(arena, target->exe); - target->args = push_str8_copy(arena, target->args); - target->working_directory = push_str8_copy(arena, target->working_directory); - target->custom_entry_point_name = push_str8_copy(arena, target->custom_entry_point_name); + target->exe = str8_copy(arena, target->exe); + target->args = str8_copy(arena, target->args); + target->working_directory = str8_copy(arena, target->working_directory); + target->custom_entry_point_name = str8_copy(arena, target->custom_entry_point_name); + target->stdout_path = str8_copy(arena, target->stdout_path); + target->stderr_path = str8_copy(arena, target->stderr_path); + target->stdin_path = str8_copy(arena, target->stdin_path); target->env = str8_list_copy(arena, &target->env); } return dst; @@ -739,6 +742,105 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) return result; } +internal D_TrapNet +d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) +{ + D_TrapNet result = {0}; + { + U64 read_endt_us = now_time_us() + 1000000; + Temp scratch = scratch_begin(&arena, 1); + Access *access = access_open(); + D_EntityCtx *entity_ctx = &d_user_state->ctrl_entity_store->ctx; + + // rjf: unpack thread + Arch arch = thread->arch; + U64 ip_vaddr = d_rip_from_thread(entity_ctx, thread->handle); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + + // rjf: ip => enclosing scope's list(voff_range) + Rng1U64List scope_voff_rngs = {0}; + { + U64 ip_voff = d_voff_from_vaddr(module, ip_vaddr); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); + if(rdi != &rdi_parsed_nil) + { + result.good_line_info = 1; + RDI_Scope *scope = rdi_scope_from_voff(rdi, ip_voff); + U64 all_scope_voffs_count = 0; + U64 *all_scope_voffs = rdi_table_from_name(rdi, ScopeVOffData, &all_scope_voffs_count); + for(U64 voff_idx = scope->voff_range_first; voff_idx+1 < scope->voff_range_opl; voff_idx += 1) + { + Rng1U64 voff_range = r1u64(all_scope_voffs[voff_idx], all_scope_voffs[voff_idx+1]); + rng1u64_list_push(scratch.arena, &scope_voff_rngs, voff_range); + } + } + } + + // rjf: place traps at all possible exit points of all scope's ranges + for EachNode(n, Rng1U64Node, scope_voff_rngs.first) + { + Rng1U64 voff_range = n->v; + Rng1U64 vaddr_range = d_vaddr_range_from_voff_range(module, voff_range); + D_ProcessMemorySlice code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, vaddr_range, 0, read_endt_us); + if(!code_slice.any_byte_bad) + { + String8 code = code_slice.data; + DASM_CtrlFlowInfo ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, DASM_InstFlag_Branch|DASM_InstFlag_UnconditionalJump|DASM_InstFlag_Return, arch, vaddr_range.min, code); + + // rjf: add traps at all jump destinations which do *not* fall into any of the scope's ranges + for EachNode(exit_pt_n, DASM_CtrlFlowPointNode, ctrl_flow_info.exit_points.first) + { + U64 jump_dest_vaddr = exit_pt_n->v.jump_dest_vaddr; + B32 jump_dest_vaddr_is_out_of_scope = 1; + for EachNode(scope_n, Rng1U64Node, scope_voff_rngs.first) + { + if(contains_1u64(scope_n->v, jump_dest_vaddr)) + { + jump_dest_vaddr_is_out_of_scope = 0; + break; + } + } + if(jump_dest_vaddr_is_out_of_scope) + { + D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, jump_dest_vaddr}; + d_trap_list_push(arena, &result.traps, &trap); + } + } + + // rjf: add trap at natural exit point of scope + { + U64 opl_vaddr = vaddr_range.max; + B32 opl_vaddr_is_out_of_scope = 1; + for EachNode(scope_n, Rng1U64Node, scope_voff_rngs.first) + { + if(contains_1u64(scope_n->v, opl_vaddr)) + { + opl_vaddr_is_out_of_scope = 0; + break; + } + } + if(opl_vaddr_is_out_of_scope) + { + D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, opl_vaddr}; + d_trap_list_push(arena, &result.traps, &trap); + } + } + } + else + { + result.good_read = 0; + break; + } + } + + access_close(access); + scratch_end(scratch); + } + return result; +} + //////////////////////////////// //~ rjf: Debug Info Lookups @@ -1684,11 +1786,11 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); msg->kind = D_MsgKind_Launch; - msg->path = working_directory; - msg->cmd_line_string_list = cmdln_strings; - msg->stdout_path = stdout_path; - msg->stderr_path = stderr_path; - msg->stdin_path = stdin_path; + msg->path = str8_copy(scratch.arena, working_directory); + msg->cmd_line_string_list = str8_list_copy(scratch.arena, &cmdln_strings); + msg->stdout_path = str8_copy(scratch.arena, stdout_path); + msg->stderr_path = str8_copy(scratch.arena, stderr_path); + msg->stdin_path = str8_copy(scratch.arena, stdin_path); msg->debug_subprocesses = target->debug_subprocesses; msg->env_inherit = 1; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); @@ -1807,6 +1909,9 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepOverInst: {trap_net = d_trap_net_from_thread__step_over_inst(scratch.arena, thread);}break; case D_CmdKind_StepIntoLine: {trap_net = d_trap_net_from_thread__step_into_line(scratch.arena, thread);}break; case D_CmdKind_StepOverLine: {trap_net = d_trap_net_from_thread__step_over_line(scratch.arena, thread);}break; +#if 0 + case D_CmdKind_StepOut: {trap_net = d_trap_net_from_thread__step_out_scope(scratch.arena, thread);}break; +#else case D_CmdKind_StepOut: { Access *access = access_open(); @@ -1830,6 +1935,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P access_close(access); }break; +#endif } B32 good_trap_net = (trap_net.good_read || !trap_net.good_line_info); if(good_trap_net && trap_net.traps.count != 0) diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index cad43e6d..306de1a2 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -422,6 +422,7 @@ internal void d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, internal D_TrapNet d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread); internal D_TrapNet d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread); internal D_TrapNet d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread); +internal D_TrapNet d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread); //////////////////////////////// //~ rjf: Debug Info Lookups diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 440a465d..e5b2b359 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10488,9 +10488,14 @@ rd_frame(void) ////////////////////////////// //- rjf: do per-frame resets // - arena_clear(rd_frame_arena()); - rd_state->top_regs = &rd_state->base_regs; - rd_regs_copy_contents(rd_frame_arena(), &rd_state->top_regs->v, &rd_state->top_regs->v); + { + Temp scratch = scratch_begin(0, 0); + rd_state->top_regs = &rd_state->base_regs; + rd_regs_copy_contents(scratch.arena, &rd_state->top_regs->v, &rd_state->top_regs->v); + arena_clear(rd_frame_arena()); + rd_regs_copy_contents(rd_frame_arena(), &rd_state->top_regs->v, &rd_state->top_regs->v); + scratch_end(scratch); + } if(rd_state->next_hover_regs != 0) { rd_state->hover_regs = rd_regs_copy(rd_frame_arena(), rd_state->next_hover_regs); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index e129dfc5..b04dd7e5 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -10,6 +10,13 @@ // [ ] memory_size(...) view for quickly evaluating memory sizes // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold // +// [ ] asan pass +// [ ] policy for closing debug info which is no longer relevant? +// [ ] codebase-internal barrier impl (win7/linux support) +// [ ] external window focusing bugs +// [ ] PDB -> RDI conversion memory usage +// [x] killing/restarting thread performance (#780) +// // [ ] project/user file improvements // [ ] "default" -> "untitled" // [ ] should clear default project data every time the program starts @@ -18,12 +25,6 @@ // [ ] more things should move to user data, but project-tagged - like // recent files, watches?, etc. // -// [ ] killing/restarting thread performance (#780) -// [ ] codebase-internal barrier impl (win7/linux support) -// [ ] PDB -> RDI conversion memory usage -// [ ] policy for closing debug info which is no longer relevant? -// [ ] external window focusing bugs -// // [ ] linux/dwarf fixes // [ ] excessive CPU usage on async threads - barrier impl? // [ ] step-over/step-into doesn't step successfully in many cases, just causes a continue diff --git a/src/text/text.c b/src/text/text.c index b2ec582d..759443b7 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -2944,12 +2944,13 @@ txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_ou shared->artifact->info = shared->info; } lane_sync(); + AC_Artifact result = {0}; + result.u64[0] = (U64)shared->artifact; + lane_sync(); access_close(access); scratch_end(scratch); ProfEnd(); - AC_Artifact result = {0}; - result.u64[0] = (U64)shared->artifact; return result; } From cc099f55aafff8ae0db8f047c04791bd6bb8442b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 11 May 2026 13:30:59 -0700 Subject: [PATCH 511/850] do not call destroy on caches without a destroy hook :( --- src/artifact_cache/artifact_cache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index b5920e6c..7ba72310 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -423,7 +423,7 @@ ac_async_tick(void) if(str8_match(n->key, r->key, 0)) { // rjf: eliminate existing values, if any, if they do not match the current - if(!MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) + if(cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) { if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0)) { @@ -545,7 +545,7 @@ ac_async_tick(void) if(str8_match(n->key, r->key, 0)) { // rjf: eliminate existing values, if any, if they do not match the current - if(!MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) + if(cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) { if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0)) { From d1536953b04dd1c0587a0d6e8351376ed2d3ea92 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 11 May 2026 14:21:43 -0700 Subject: [PATCH 512/850] p2r: eliminate spurious duplicate address vmap entries; upgrade step-out with block stepping functionality --- src/dbg_engine/dbg_engine_user.c | 45 ++++++++++++-------------------- src/mule/mule_main.cpp | 8 ++++++ src/rdi_make/rdi_make_local.c | 2 +- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 5cc0be1f..2927988d 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -758,6 +758,7 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); + D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, read_endt_us); // rjf: ip => enclosing scope's list(voff_range) Rng1U64List scope_voff_rngs = {0}; @@ -786,6 +787,7 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) D_ProcessMemorySlice code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, vaddr_range, 0, read_endt_us); if(!code_slice.any_byte_bad) { + result.good_read = 1; String8 code = code_slice.data; DASM_CtrlFlowInfo ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, DASM_InstFlag_Branch|DASM_InstFlag_UnconditionalJump|DASM_InstFlag_Return, arch, vaddr_range.min, code); @@ -796,7 +798,7 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) B32 jump_dest_vaddr_is_out_of_scope = 1; for EachNode(scope_n, Rng1U64Node, scope_voff_rngs.first) { - if(contains_1u64(scope_n->v, jump_dest_vaddr)) + if(contains_1u64(scope_n->v, d_voff_from_vaddr(module, jump_dest_vaddr))) { jump_dest_vaddr_is_out_of_scope = 0; break; @@ -815,7 +817,7 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) B32 opl_vaddr_is_out_of_scope = 1; for EachNode(scope_n, Rng1U64Node, scope_voff_rngs.first) { - if(contains_1u64(scope_n->v, opl_vaddr)) + if(contains_1u64(scope_n->v, d_voff_from_vaddr(module, opl_vaddr))) { opl_vaddr_is_out_of_scope = 0; break; @@ -835,6 +837,19 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) } } + // rjf: use first unwind frame to generate trap + if(result.good_read && callstack.concrete_frames_count > 1) + { + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); + U64 vaddr = arch_ip_from_reg_block(arch_info, callstack.concrete_frames[1]->regs); + D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, vaddr}; + d_trap_list_push(arena, &result.traps, &trap); + } + else + { + result.good_read = 0; + } + access_close(access); scratch_end(scratch); } @@ -1909,33 +1924,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepOverInst: {trap_net = d_trap_net_from_thread__step_over_inst(scratch.arena, thread);}break; case D_CmdKind_StepIntoLine: {trap_net = d_trap_net_from_thread__step_into_line(scratch.arena, thread);}break; case D_CmdKind_StepOverLine: {trap_net = d_trap_net_from_thread__step_over_line(scratch.arena, thread);}break; -#if 0 case D_CmdKind_StepOut: {trap_net = d_trap_net_from_thread__step_out_scope(scratch.arena, thread);}break; -#else - case D_CmdKind_StepOut: - { - Access *access = access_open(); - - // rjf: thread => call stack - D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, now_time_us()+10000); - - // rjf: use first unwind frame to generate trap - if(callstack.concrete_frames_count > 1) - { - ARCH_Info *arch_info = arch_info_from_arch(thread->arch); - U64 vaddr = arch_ip_from_reg_block(arch_info, callstack.concrete_frames[1]->regs); - D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, vaddr}; - d_trap_list_push(scratch.arena, &trap_net.traps, &trap); - trap_net.good_read = 1; - } - else - { - log_user_error(str8_lit("Could not find the return address of the current callstack frame successfully.")); - } - - access_close(access); - }break; -#endif } B32 good_trap_net = (trap_net.good_read || !trap_net.good_line_info); if(good_trap_net && trap_net.traps.count != 0) diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 23948081..be842092 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -681,6 +681,14 @@ type_coverage_eval_tests(void) OutputDebugStringA("\n"); } + if(1) + { + OutputDebugStringA("this is inside a branch!\n"); + OutputDebugStringA("foo"); + OutputDebugStringA("bar"); + OutputDebugStringA("baz"); + } + const int32_t x1 = 3; const int32_t y1 = -10; const int32_t z1 = x1 + y1; diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index b2d1c063..638e456f 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -852,7 +852,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) SLLStackPush(top_range, r); r->voff_range = voff_range; r->idx = idx; - if(voff_range.min != last_recorded_voff || (vmap_ptr->idx != idx && vmap_ptr->idx != 0)) + if(voff_range.min != last_recorded_voff) { vmap_ptr += 1; } From cbbacf0b5f6ec2ff7f4535b5f89373476244bff5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 11 May 2026 14:53:05 -0700 Subject: [PATCH 513/850] sketch out extra disasm instruction outputs for determining read/write locations from instructions (autos) --- src/disasm/disasm.c | 30 +++++++++++++++++++++--------- src/disasm/disasm.h | 6 +++++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index 7945cb0d..2a640475 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -39,11 +39,22 @@ dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Synta // rjf: analyze DASM_InstFlags flags = 0; - U64 jump_dest_vaddr = 0; + U64 dst_vaddr = 0; { ZydisDecodedOperand *first_visible_op = (zinst.info.operand_count_visible > 0 ? &zinst.operands[0] : 0); ZydisDecodedOperand *first_op = (zinst.info.operand_count > 0 ? &zinst.operands[0] : 0); ZydisDecodedOperand *second_op = (zinst.info.operand_count > 1 ? &zinst.operands[1] : 0); + + if(first_op != 0 && + first_op->actions & ZYDIS_OPERAND_ACTION_WRITE) + { + // TODO(rjf): need to pass back register + offset + } + if(second_op != 0 && + second_op->actions & ZYDIS_OPERAND_ACTION_READ) + { + // TODO(rjf): need to pass back register + offset + } if(first_visible_op != 0 && (first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM8 || first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16 || @@ -53,7 +64,7 @@ dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Synta first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32_32_64 || first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_32)) { - ZydisCalcAbsoluteAddress(&zinst.info, first_visible_op, vaddr, &jump_dest_vaddr); + ZydisCalcAbsoluteAddress(&zinst.info, first_visible_op, vaddr, &dst_vaddr); } if(first_op != 0 && second_op != 0 && first_op->type == ZYDIS_OPERAND_TYPE_REGISTER && (first_op->reg.value == ZYDIS_REGISTER_RSP || @@ -136,8 +147,9 @@ dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Synta { inst.flags = flags; inst.size = zinst.info.length; - inst.string = push_str8_copy(arena, str8_cstring(zinst.text)); - inst.jump_dest_vaddr = jump_dest_vaddr; + inst.string = str8_copy(arena, str8_cstring(zinst.text)); + inst.dst_vaddr = dst_vaddr; + inst.src_vaddr = src_vaddr; } }break; } @@ -163,7 +175,7 @@ dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_point DASM_CtrlFlowPoint point = {0}; point.inst_flags = inst.flags; point.vaddr = inst_vaddr; - point.jump_dest_vaddr = inst.jump_dest_vaddr; + point.jump_dest_vaddr = inst.dst_vaddr; DASM_CtrlFlowPointNode *node = push_array(arena, DASM_CtrlFlowPointNode, 1); node->v = point; SLLQueuePush(info.exit_points.first, info.exit_points.last, node); @@ -405,9 +417,9 @@ dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_o code_bytes_part = str8_list_join(scratch.arena, &code_bytes_strings, 0); } String8 symbol_part = {0}; - if(inst.jump_dest_vaddr != 0 && rdi != &rdi_parsed_nil && params.style_flags & DASM_StyleFlag_SymbolNames) + if(inst.dst_vaddr != 0 && rdi != &rdi_parsed_nil && params.style_flags & DASM_StyleFlag_SymbolNames) { - RDI_U32 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, inst.jump_dest_vaddr-params.base_vaddr); + RDI_U32 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, inst.dst_vaddr-params.base_vaddr); if(scope_idx != 0) { RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx); @@ -422,8 +434,8 @@ dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_o } } String8 inst_string = push_str8f(scratch.arena, "%S%S%S%S", addr_part, code_bytes_part, inst.string, symbol_part); - DASM_Line line = {u32_from_u64_saturate(off), 0, inst.jump_dest_vaddr, r1u64(inst_strings.total_size + inst_strings.node_count, - inst_strings.total_size + inst_strings.node_count + inst_string.size)}; + DASM_Line line = {u32_from_u64_saturate(off), 0, inst.dst_vaddr, r1u64(inst_strings.total_size + inst_strings.node_count, + inst_strings.total_size + inst_strings.node_count + inst_string.size)}; dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &line); str8_list_push(scratch.arena, &inst_strings, inst_string); diff --git a/src/disasm/disasm.h b/src/disasm/disasm.h index 11356b8a..ebc8180e 100644 --- a/src/disasm/disasm.h +++ b/src/disasm/disasm.h @@ -37,7 +37,11 @@ struct DASM_Inst DASM_InstFlags flags; U32 size; String8 string; - U64 jump_dest_vaddr; + U64 dst_vaddr; + ARCH_RegCode dst_base_reg; + U64 dst_off; + ARCH_RegCode src_base_reg; + U64 src_off; }; //////////////////////////////// From 9eaff99bbb2f14444f22d92144fd474e46b003f2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 11 May 2026 19:44:26 -0700 Subject: [PATCH 514/850] fix build --- src/disasm/disasm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index 2a640475..1186ba2e 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -149,7 +149,7 @@ dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Synta inst.size = zinst.info.length; inst.string = str8_copy(arena, str8_cstring(zinst.text)); inst.dst_vaddr = dst_vaddr; - inst.src_vaddr = src_vaddr; + // inst.src_vaddr = src_vaddr; } }break; } From d45090a8ccdf212f2a939c8ab502017ab09a4372 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 11 May 2026 19:53:54 -0700 Subject: [PATCH 515/850] adjust kerning to be rounded, rather than floor'd; adjust step-out desc --- src/dbg_engine/dbg_engine.mdesk | 2 +- src/font_provider/dwrite/font_provider_dwrite.c | 2 +- src/raddbg/generated/raddbg.meta.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 496cf811..24328506 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -20,7 +20,7 @@ D_CmdTable: // | | | | {StepOverInst 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" "" } {StepIntoLine 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" "" } {StepOverLine 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" "" } - {StepOut 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the end of the current function and exits it." "" "" } + {StepOut 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the first instruction after the current scope is exited." "" "" } {Halt 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all attached processes." "pause" "" } {SoftHaltRefresh 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all attached processes to collect data, and then resumes them." "" "" } {SetThreadIP 0 1 0 0 "" Vaddr null Nil Null 0 0 0 0 1 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the specified thread's instruction pointer at the specified address." "" "" } diff --git a/src/font_provider/dwrite/font_provider_dwrite.c b/src/font_provider/dwrite/font_provider_dwrite.c index 448d8572..7fbe50bf 100644 --- a/src/font_provider/dwrite/font_provider_dwrite.c +++ b/src/font_provider/dwrite/font_provider_dwrite.c @@ -583,7 +583,7 @@ fp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, S // rjf: fill basics result.atlas_dim = atlas_dim; result.atlas = push_array_no_zero(arena, U8, atlas_dim.x*atlas_dim.y*4); - result.advance = floor_f32(advance); + result.advance = round_f32(advance); // rjf: fill atlas { diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index f85947ff..f5c48ccc 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -589,7 +589,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the end of the current function and exits it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the first instruction after the current scope is exited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, From 15a2d5658fc6d67122458bc2ba6bf4a00a11f49e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 11 May 2026 20:04:36 -0700 Subject: [PATCH 516/850] fix auto-thread-selection rules --- src/raddbg/raddbg_core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index e5b2b359..fdfd46cc 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -16448,20 +16448,20 @@ rd_frame(void) U64 test_cached_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); // rjf: valid stop thread? -> select & snap - if(need_refocus && thread != &d_entity_nil && evt->cause != D_EventCause_InterruptedByHalt) + if(need_refocus && thread->kind == D_EntityKind_Thread && evt->cause != D_EventCause_InterruptedByHalt) { rd_cmd(RD_CmdKind_SelectThread, .thread = thread->handle); } // rjf: no stop-causing thread, but have selected thread? -> snap to selected D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - if(need_refocus && (evt->cause == D_EventCause_InterruptedByHalt || thread == &d_entity_nil) && selected_thread != &d_entity_nil) + if(need_refocus && (evt->cause == D_EventCause_InterruptedByHalt || thread->kind != D_EntityKind_Thread) && selected_thread != &d_entity_nil) { rd_cmd(RD_CmdKind_SelectThread, .thread = selected_thread->handle); } // rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread - if(need_refocus && thread == &d_entity_nil && selected_thread == &d_entity_nil) + if(need_refocus && thread->kind != D_EntityKind_Thread && selected_thread == &d_entity_nil) { D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); D_Entity *first_available_thread = d_entity_array_first(&threads); From 641a7c8b3040708649553807701454daecbd785e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 May 2026 09:38:06 -0700 Subject: [PATCH 517/850] on new debug session: close all loaded debug infos, assume none need to stick around --- src/raddbg/raddbg_core.c | 12 ++++++++++++ src/raddbg/raddbg_main.c | 6 +++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index fdfd46cc..fe8be49c 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -16387,6 +16387,18 @@ rd_frame(void) switch(evt->kind) { default:{}break; + case D_EventKind_NewProc: + { + D_EntityArray all_processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + if(all_processes.count == 1) + { + CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("debug_info")); + for EachNode(n, CFG_NodePtrNode, dbg_infos.first) + { + cfg_node_release(rd_state->cfg, n->v); + } + } + }break; case D_EventKind_NewModule: { D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index b04dd7e5..0823f23a 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -6,13 +6,13 @@ // // [ ] "autos" collection, which can be evaluated // [ ] show "autos" inline in source code near thread? -// [ ] step out of scopes / loops // [ ] memory_size(...) view for quickly evaluating memory sizes // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold +// [x] step out of scopes / loops // -// [ ] asan pass -// [ ] policy for closing debug info which is no longer relevant? +// [x] policy for closing debug info which is no longer relevant? // [ ] codebase-internal barrier impl (win7/linux support) +// [ ] asan pass // [ ] external window focusing bugs // [ ] PDB -> RDI conversion memory usage // [x] killing/restarting thread performance (#780) From d4623a7ddf6bdb1bfe4285eebec7cfe69c930896 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 May 2026 13:48:57 -0700 Subject: [PATCH 518/850] slow & highly contentious implementation of barriers using more basic sync primitives; fall back if sync barriers not present in win32 version --- project.4coder | 4 +- src/base/base_core.h | 4 +- src/base/base_threads.c | 134 ++++++++++++++++++++++++++++++++++++ src/base/base_threads.h | 14 +++- src/radbin/radbin.c | 22 ++++++ src/raddbg/raddbg_main.c | 2 +- src/win32/base/win32_base.c | 63 ++++++++++++----- src/win32/base/win32_base.h | 12 +++- 8 files changed, 230 insertions(+), 25 deletions(-) diff --git a/project.4coder b/project.4coder index 1ff38098..0b48eaac 100644 --- a/project.4coder +++ b/project.4coder @@ -49,13 +49,13 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [scratch] - .f2 = { .win = "wsl ./build.sh radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f2 = { .win = "pushd build && for /l %i in (1, 1, 3) do (radbin --capture --rdi mule_main.pdb --async_thread_count=1 --thread_count=8)", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [textperf] // .f1 = { .win = "raddbg_stable --ipc kill_all && build no_meta telemetry textperf && raddbg_stable --ipc bring_to_front && raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/base/base_core.h b/src/base/base_core.h index 2536e38f..493519ab 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -253,13 +253,13 @@ # include # if ARCH_X64 # define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)InterlockedCompareExchange128((__int64 *)(x), ((__int64 *)&(k))[1], ((__int64 *)&(k))[0], (__int64 *)c) -# define ins_atomic_u64_eval(x) *((volatile U64 *)(x)) +# define ins_atomic_u64_eval(x) InterlockedAdd64((__int64 *)(x), 0) # define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((__int64 *)(x)) # define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((__int64 *)(x)) # define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((__int64 *)(x),(c)) # define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((__int64 *)(x), c) # define ins_atomic_u64_eval_cond_assign(x,k,c) InterlockedCompareExchange64((__int64 *)(x),(k),(c)) -# define ins_atomic_u32_eval(x) *((volatile U32 *)(x)) +# define ins_atomic_u32_eval(x) InterlockedAdd((LONG *)(x), 0) # define ins_atomic_u32_inc_eval(x) InterlockedIncrement((LONG *)(x)) # define ins_atomic_u32_dec_eval(x) InterlockedDecrement((LONG *)(x)) # define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((LONG *)(x),(c)) diff --git a/src/base/base_threads.c b/src/base/base_threads.c index c8b4c1eb..a8c72585 100644 --- a/src/base/base_threads.c +++ b/src/base/base_threads.c @@ -58,3 +58,137 @@ set_thread_namef(char *fmt, ...) va_end(args); scratch_end(scratch); } + +//////////////////////////////// +//~ rjf: Platform-Abstracted Synchronization Primitive Functions + +//- rjf: slow barriers + +typedef struct BarrierNode BarrierNode; +struct BarrierNode +{ + BarrierNode *next; + U64 count; + U64 threads_left_to_enter; + U64 threads_left_to_leave; + RWMutex rw_mutex; + CondVar cv; +}; + +typedef struct BarrierTCTX BarrierTCTX; +struct BarrierTCTX +{ + Arena *arena; + BarrierNode *free_barrier_node; +}; + +thread_static BarrierTCTX *barrier_tctx = 0; + +internal Barrier +slow_barrier_alloc(U64 count) +{ + if(barrier_tctx == 0) + { + Arena *arena = arena_alloc(); + barrier_tctx = push_array(arena, BarrierTCTX, 1); + barrier_tctx->arena = arena; + } + BarrierNode *n = barrier_tctx->free_barrier_node; + if(n != 0) + { + SLLStackPop(barrier_tctx->free_barrier_node); + } + else + { + n = push_array_no_zero(barrier_tctx->arena, BarrierNode, 1); + } + MemoryZeroStruct(n); + n->count = count; + n->threads_left_to_enter = count; + n->rw_mutex = rw_mutex_alloc(); + n->cv = cond_var_alloc(); + Barrier result = {(U64)n}; + return result; +} + +internal void +slow_barrier_release(Barrier barrier) +{ + if(barrier_tctx == 0) + { + Arena *arena = arena_alloc(); + barrier_tctx = push_array(arena, BarrierTCTX, 1); + barrier_tctx->arena = arena; + } + BarrierNode *n = (BarrierNode *)barrier.u64[0]; + rw_mutex_release(n->rw_mutex); + cond_var_release(n->cv); + SLLStackPush(barrier_tctx->free_barrier_node, n); +} + +internal void +slow_barrier_wait(Barrier barrier) +{ + ProfBeginFunction(); + BarrierNode *n = (BarrierNode *)barrier.u64[0]; + U64 threads_left_to_enter = ins_atomic_u64_dec_eval(&n->threads_left_to_enter); + + //- rjf: threads left to enter > 0 => wait + if(threads_left_to_enter > 0) + { + // rjf: first try a spin loop + B32 done_waiting = 0; + ProfScope("spin loop wait") for(U64 spin_count = 0; spin_count < 10000; spin_count += 1) + { + if(ins_atomic_u64_eval(&n->threads_left_to_leave) != 0) + { + done_waiting = 1; + break; + } + } + + // rjf: not done waiting -> need to do slow wait on condition variable + if(!done_waiting) ProfScope("slow wait") + { + RWMutexScope(n->rw_mutex, 0) for(;;) + { + if(ins_atomic_u64_eval(&n->threads_left_to_leave) != 0) + { + break; + } + cond_var_wait_rw(n->cv, n->rw_mutex, 0, max_U64); + } + } + + // rjf: decrement leave counter + if(ins_atomic_u64_dec_eval(&n->threads_left_to_leave) > 0) + { + ProfScope("signal") cond_var_signal(n->cv); + } + } + + //- rjf: threads left to enter == 0 -> last thread, wakeup + else + { + ins_atomic_u64_eval_assign(&n->threads_left_to_enter, n->count); + ProfScope("wake up") RWMutexScope(n->rw_mutex, 1) + { + ins_atomic_u64_eval_assign(&n->threads_left_to_leave, n->count-1); + } + ProfScope("signal") cond_var_signal(n->cv); + } + + //- rjf: wait for threads left to leave == 0 + ProfScope("wait for threads to leave") + { + for(U64 spin_count = 0;; spin_count += 1) + { + if(ins_atomic_u64_eval(&n->threads_left_to_leave) == 0) + { + break; + } + } + } + + ProfEnd(); +} diff --git a/src/base/base_threads.h b/src/base/base_threads.h index f179a219..b34286cc 100644 --- a/src/base/base_threads.h +++ b/src/base/base_threads.h @@ -131,9 +131,9 @@ internal B32 semaphore_take(Semaphore semaphore, U64 endt_us); internal void semaphore_drop(Semaphore semaphore); //- rjf: barriers -internal Barrier barrier_alloc(U64 count); -internal void barrier_release(Barrier barrier); -internal void barrier_wait(Barrier barrier); +internal Barrier barrier_alloc(U64 count); +internal void barrier_release(Barrier barrier); +internal void barrier_wait(Barrier barrier); //- rjf: scope macros #define MutexScope(mutex) DeferLoop(mutex_take(mutex), mutex_drop(mutex)) @@ -142,6 +142,14 @@ internal void barrier_wait(Barrier barrier); #define MutexScopeW(mutex) DeferLoop(rw_mutex_take_w(mutex), rw_mutex_drop_w(mutex)) #define MutexScopeRWPromote(mutex) DeferLoop((rw_mutex_drop_r(mutex), rw_mutex_take_w(mutex)), (rw_mutex_drop_w(mutex), rw_mutex_take_r(mutex))) +//////////////////////////////// +//~ rjf: Platform-Abstracted Synchronization Primitive Functions + +//- rjf: slow barriers +internal Barrier slow_barrier_alloc(U64 count); +internal void slow_barrier_release(Barrier barrier); +internal void slow_barrier_wait(Barrier barrier); + //////////////////////////////// //~ rjf: @per_os_impl Safe Calls diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 734a6d85..b4a2c7f5 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -56,6 +56,28 @@ rb_thread_entry_point(void *p) log_select(log); log_scope_begin(); +#if 0 + ProfScope("work") + { + for(int i = 0; i < 5; i += 1) + { + int sum = 0; + ProfScope("do work") + { + for(int x = 0; x < 10000; x += 1) + { + for(int y = 0; y < 10000; y += 1) + { + sum += x*y + x-y; + } + } + } + lane_sync(); + } + } + abort_self(0); +#endif + ////////////////////////////// //- rjf: set up shared state // diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 0823f23a..4c9d8c6e 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -10,11 +10,11 @@ // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold // [x] step out of scopes / loops // -// [x] policy for closing debug info which is no longer relevant? // [ ] codebase-internal barrier impl (win7/linux support) // [ ] asan pass // [ ] external window focusing bugs // [ ] PDB -> RDI conversion memory usage +// [x] policy for closing debug info which is no longer relevant? // [x] killing/restarting thread performance (#780) // // [ ] project/user file improvements diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index e55504ad..5db1ef65 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -8,6 +8,12 @@ typedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, PCWSTR lpThreadDescription); global W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0; +typedef BOOL W32_InitializeSynchronizationBarrier_Type(W32_SYNCHRONIZATION_BARRIER *lpBarrier, LONG lTotalThreads, LONG lSpinCount); +global W32_InitializeSynchronizationBarrier_Type *w32_InitializeSynchronizationBarrier_func = 0; +typedef BOOL W32_DeleteSynchronizationBarrier_Type(W32_SYNCHRONIZATION_BARRIER *lpBarrier); +global W32_DeleteSynchronizationBarrier_Type *w32_DeleteSynchronizationBarrier_func = 0; +typedef BOOL W32_EnterSynchronizationBarrier_Type(W32_SYNCHRONIZATION_BARRIER *lpBarrier, DWORD dwFlags); +global W32_EnterSynchronizationBarrier_Type *w32_EnterSynchronizationBarrier_func = 0; global RIO_EXTENSION_FUNCTION_TABLE w32_rio_functions = {0}; //////////////////////////////// @@ -42,10 +48,10 @@ w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) out->year = in->wYear; out->mon = in->wMonth - 1; out->wday = in->wDayOfWeek; - out->day = in->wDay; - out->hour = in->wHour; - out->min = in->wMinute; - out->sec = in->wSecond; + out->day = in->wDay; + out->hour = in->wHour; + out->min = in->wMinute; + out->sec = in->wSecond; out->msec = in->wMilliseconds; } @@ -681,34 +687,56 @@ semaphore_drop(Semaphore semaphore) internal Barrier barrier_alloc(U64 count) { - W32_Entity *entity = w32_entity_alloc(W32_EntityKind_Barrier); - if(entity != 0) + Barrier result = {0}; + if(w32_InitializeSynchronizationBarrier_func != 0) { - BOOL init_good = InitializeSynchronizationBarrier(&entity->sb, count, -1); - (void)init_good; + W32_Entity *entity = w32_entity_alloc(W32_EntityKind_Barrier); + if(entity != 0) + { + BOOL init_good = w32_InitializeSynchronizationBarrier_func(&entity->sb, count, -1); + (void)init_good; + } + result.u64[0] = IntFromPtr(entity); + } + else + { + result = slow_barrier_alloc(count); } - Barrier result = {IntFromPtr(entity)}; return result; } internal void barrier_release(Barrier barrier) { - W32_Entity *entity = (W32_Entity*)PtrFromInt(barrier.u64[0]); - if(entity != 0) + if(w32_InitializeSynchronizationBarrier_func != 0) { - DeleteSynchronizationBarrier(&entity->sb); - w32_entity_release(entity); + W32_Entity *entity = (W32_Entity*)PtrFromInt(barrier.u64[0]); + if(entity != 0) + { + w32_DeleteSynchronizationBarrier_func(&entity->sb); + w32_entity_release(entity); + } + } + else + { + slow_barrier_release(barrier); } } internal void barrier_wait(Barrier barrier) { - W32_Entity *entity = (W32_Entity*)PtrFromInt(barrier.u64[0]); - if(entity != 0) + if(w32_InitializeSynchronizationBarrier_func != 0) { - EnterSynchronizationBarrier(&entity->sb, 0); + W32_Entity *entity = (W32_Entity*)PtrFromInt(barrier.u64[0]); + if(entity != 0) + { + w32_EnterSynchronizationBarrier_func(&entity->sb, 0); + } + } + else + { + slow_barrier_wait(barrier); } } @@ -1741,6 +1769,9 @@ w32_entry_point_caller(int argc, WCHAR **wargv) { HMODULE module = LoadLibraryA("kernel32.dll"); w32_SetThreadDescription_func = (W32_SetThreadDescription_Type *)GetProcAddress(module, "SetThreadDescription"); + w32_InitializeSynchronizationBarrier_func = (W32_InitializeSynchronizationBarrier_Type *)GetProcAddress(module, "InitializeSynchronizationBarrier"); + w32_DeleteSynchronizationBarrier_func = (W32_DeleteSynchronizationBarrier_Type *)GetProcAddress(module, "DeleteSynchronizationBarrier"); + w32_EnterSynchronizationBarrier_func = (W32_EnterSynchronizationBarrier_Type *)GetProcAddress(module, "EnterSynchronizationBarrier"); FreeLibrary(module); } diff --git a/src/win32/base/win32_base.h b/src/win32/base/win32_base.h index 9940e51d..fe0e7957 100644 --- a/src/win32/base/win32_base.h +++ b/src/win32/base/win32_base.h @@ -53,6 +53,16 @@ typedef enum W32_EntityKind } W32_EntityKind; +typedef struct W32_SYNCHRONIZATION_BARRIER W32_SYNCHRONIZATION_BARRIER; +struct W32_SYNCHRONIZATION_BARRIER +{ + U32 reserved_0; + U32 reserved_1; + U64 reserved_2[2]; + U32 reserved_3; + U32 reserved_4; +}; + typedef struct W32_Entity W32_Entity; struct W32_Entity { @@ -70,7 +80,7 @@ struct W32_Entity CRITICAL_SECTION mutex; SRWLOCK rw_mutex; CONDITION_VARIABLE cv; - SYNCHRONIZATION_BARRIER sb; + W32_SYNCHRONIZATION_BARRIER sb; }; }; From 50a68b9d8c0d8d88f27230cfce9181d68532a3ff Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 May 2026 13:52:25 -0700 Subject: [PATCH 519/850] adjust internal definition of sync barrier type to match windows --- src/win32/base/win32_base.c | 5 +++++ src/win32/base/win32_base.h | 12 ++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index 5db1ef65..62d0bdbf 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1772,6 +1772,11 @@ w32_entry_point_caller(int argc, WCHAR **wargv) w32_InitializeSynchronizationBarrier_func = (W32_InitializeSynchronizationBarrier_Type *)GetProcAddress(module, "InitializeSynchronizationBarrier"); w32_DeleteSynchronizationBarrier_func = (W32_DeleteSynchronizationBarrier_Type *)GetProcAddress(module, "DeleteSynchronizationBarrier"); w32_EnterSynchronizationBarrier_func = (W32_EnterSynchronizationBarrier_Type *)GetProcAddress(module, "EnterSynchronizationBarrier"); + if(w32_InitializeSynchronizationBarrier_func == 0) + { + w32_DeleteSynchronizationBarrier_func = 0; + w32_EnterSynchronizationBarrier_func = 0; + } FreeLibrary(module); } diff --git a/src/win32/base/win32_base.h b/src/win32/base/win32_base.h index fe0e7957..a70812e1 100644 --- a/src/win32/base/win32_base.h +++ b/src/win32/base/win32_base.h @@ -56,11 +56,15 @@ W32_EntityKind; typedef struct W32_SYNCHRONIZATION_BARRIER W32_SYNCHRONIZATION_BARRIER; struct W32_SYNCHRONIZATION_BARRIER { - U32 reserved_0; - U32 reserved_1; + DWORD reserved_0; + DWORD reserved_1; +#if ARCH_32BIT + U32 reserved_2[2]; +#else U64 reserved_2[2]; - U32 reserved_3; - U32 reserved_4; +#endif + DWORD reserved_3; + DWORD reserved_4; }; typedef struct W32_Entity W32_Entity; From dcc78314ab54331947a5727beaed81d808e08887 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 May 2026 14:42:29 -0700 Subject: [PATCH 520/850] fix dbg_info loader treatment of nil keys, avoid bad usage of blank '.rdi' files; os_lnx_* -> lnx_* --- project.4coder | 2 +- src/dbg_info/dbg_info.c | 56 ++++---- src/linux/base/linux_base.c | 134 +++++++++--------- src/linux/base/linux_base.h | 24 ++-- src/linux/demon/linux_demon.c | 6 +- .../window_manager/linux_window_manager.c | 102 ++++++------- .../window_manager/linux_window_manager.h | 8 +- src/raddbg/raddbg_main.c | 5 +- .../linux/egl/render_opengl_linux_egl.c | 2 +- .../linux/glx/render_opengl_linux_glx.c | 12 +- 10 files changed, 178 insertions(+), 173 deletions(-) diff --git a/project.4coder b/project.4coder index 0b48eaac..d19c9955 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build raddbg asan", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 7b5a58a0..5cbbf1b6 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -205,8 +205,11 @@ di_key_from_path_timestamp(String8 path, U64 min_timestamp) if(!made_key) { made_key = 1; - U128 hash = u128_hash_from_seed_str8(min_timestamp, path); - MemoryCopy(&key, &hash, Min(sizeof(hash), sizeof(key))); + if(path.size != 0) + { + U128 hash = u128_hash_from_seed_str8(min_timestamp, path); + MemoryCopy(&key, &hash, Min(sizeof(hash), sizeof(key))); + } } //- rjf: made key -> store in (key -> path/timestamp) table @@ -698,6 +701,7 @@ di_async_tick(void) //- rjf: compute key's RDI path String8 rdi_path = {0}; + if(og_path.size != 0) { if(og_is_rdi) { @@ -1151,8 +1155,8 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * U64 element_count = 0; void *table_base = rdi_section_raw_table_from_kind(rdi, section_kind, &element_count); U64 element_size = rdi_section_element_size_table[section_kind]; - - // rjf: do search + + // rjf: do search Rng1U64 range = lane_range(element_count); for EachInRange(idx, range) { @@ -1170,7 +1174,7 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * case RDI_SectionKind_UDTs: { RDI_UDT *udt = (RDI_UDT *)element; - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); name = fully_qualified_from_rdi_string_and_container(arena, rdi, type_node->user_defined.name_string_idx, udt->container_idx, udt->container_flags); }break; case RDI_SectionKind_SourceFiles: @@ -1192,9 +1196,9 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * scratch_end(scratch); }break; default: - { - RDI_Symbol *symbol = (RDI_Symbol *)element; - name = fully_qualified_str8_from_rdi_symbol(arena, rdi, symbol); + { + RDI_Symbol *symbol = (RDI_Symbol *)element; + name = fully_qualified_str8_from_rdi_symbol(arena, rdi, symbol); }break; } if(name.size == 0) { continue; } @@ -1496,12 +1500,12 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g Temp scratch = scratch_begin(0, 0); //- rjf: unpack key - U64 index = 0; + U64 index = 0; String8 name = {0}; DI_Key preferred_key = {0}; { U64 key_read_off = 0; - key_read_off += str8_deserial_read_struct(key, key_read_off, &index); + key_read_off += str8_deserial_read_struct(key, key_read_off, &index); key_read_off += str8_deserial_read_struct(key, key_read_off, &preferred_key); key_read_off += str8_deserial_read_struct(key, key_read_off, &name.size); name.str = push_array_no_zero(scratch.arena, U8, name.size); @@ -1634,14 +1638,14 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g RDI_NameMapNode *map_node = rdi_name_map_lookup(rdi, &parsed_name_map, leaf_part_of_name.str, leaf_part_of_name.size); U32 matches_count = 0; U32 *matches = rdi_matches_from_map_node(rdi, map_node, &matches_count); - - // rjf: do we have a container? -> filter matches according to container string also + + // rjf: do we have a container? -> filter matches according to container string also U32 *filtered_matches = matches; - U32 filtered_matches_count = matches_count; + U32 filtered_matches_count = matches_count; if(container_part_of_name.size != 0) - { - filtered_matches = push_array(scratch.arena, U32, matches_count); - filtered_matches_count = 0; + { + filtered_matches = push_array(scratch.arena, U32, matches_count); + filtered_matches_count = 0; for EachIndex(match_idx, matches_count) { Temp scratch = scratch_begin(0, 0); @@ -1678,16 +1682,16 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g } scratch_end(scratch); } - } - - // rjf: do we have a specific unit queried? -> filter matches according to containing unit -#if 0 - if(target_unit_index != 0) - { - - } -#endif - + } + + // rjf: do we have a specific unit queried? -> filter matches according to containing unit +#if 0 + if(target_unit_index != 0) + { + + } +#endif + // rjf: given matches, pick selected & return as result if(filtered_matches_count != 0) { diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index c4e31087..9e22fda5 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -5,7 +5,7 @@ //~ rjf: Helpers internal DateTime -os_lnx_date_time_from_tm(tm in, U32 msec) +lnx_date_time_from_tm(tm in, U32 msec) { DateTime dt = {0}; dt.sec = in.tm_sec; @@ -19,7 +19,7 @@ os_lnx_date_time_from_tm(tm in, U32 msec) } internal tm -os_lnx_tm_from_date_time(DateTime dt) +lnx_tm_from_date_time(DateTime dt) { tm result = {0}; result.tm_sec = dt.sec; @@ -32,9 +32,9 @@ os_lnx_tm_from_date_time(DateTime dt) } internal timespec -os_lnx_timespec_from_date_time(DateTime dt) +lnx_timespec_from_date_time(DateTime dt) { - tm tm_val = os_lnx_tm_from_date_time(dt); + tm tm_val = lnx_tm_from_date_time(dt); time_t seconds = timegm(&tm_val); timespec result = {0}; result.tv_sec = seconds; @@ -42,25 +42,25 @@ os_lnx_timespec_from_date_time(DateTime dt) } internal DenseTime -os_lnx_dense_time_from_timespec(timespec in) +lnx_dense_time_from_timespec(timespec in) { DenseTime result = 0; { struct tm tm_time = {0}; gmtime_r(&in.tv_sec, &tm_time); - DateTime date_time = os_lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1)); + DateTime date_time = lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1)); result = dense_time_from_date_time(date_time); } return result; } internal FileProperties -os_lnx_file_properties_from_stat(struct stat *s) +lnx_file_properties_from_stat(struct stat *s) { FileProperties props = {0}; props.size = s->st_size; - props.created = os_lnx_dense_time_from_timespec(s->st_ctim); - props.modified = os_lnx_dense_time_from_timespec(s->st_mtim); + props.created = lnx_dense_time_from_timespec(s->st_ctim); + props.modified = lnx_dense_time_from_timespec(s->st_mtim); if(s->st_mode & S_IFDIR) { props.flags |= FilePropertyFlag_IsFolder; @@ -69,9 +69,9 @@ os_lnx_file_properties_from_stat(struct stat *s) } internal void -os_lnx_safe_call_sig_handler(int x) +lnx_safe_call_sig_handler(int x) { - LNX_SafeCallChain *chain = os_lnx_safe_call_chain; + LNX_SafeCallChain *chain = lnx_safe_call_chain; if(chain != 0 && chain->fail_handler != 0) { chain->fail_handler(chain->ptr); @@ -83,20 +83,20 @@ os_lnx_safe_call_sig_handler(int x) //~ rjf: Entities internal LNX_Entity * -os_lnx_entity_alloc(LNX_EntityKind kind) +lnx_entity_alloc(LNX_EntityKind kind) { LNX_Entity *entity = 0; - DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), - pthread_mutex_unlock(&os_lnx_state.entity_mutex)) + DeferLoop(pthread_mutex_lock(&lnx_state.entity_mutex), + pthread_mutex_unlock(&lnx_state.entity_mutex)) { - entity = os_lnx_state.entity_free; + entity = lnx_state.entity_free; if(entity) { - SLLStackPop(os_lnx_state.entity_free); + SLLStackPop(lnx_state.entity_free); } else { - entity = push_array_no_zero(os_lnx_state.entity_arena, LNX_Entity, 1); + entity = push_array_no_zero(lnx_state.entity_arena, LNX_Entity, 1); } } MemoryZeroStruct(entity); @@ -105,12 +105,12 @@ os_lnx_entity_alloc(LNX_EntityKind kind) } internal void -os_lnx_entity_release(LNX_Entity *entity) +lnx_entity_release(LNX_Entity *entity) { - DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), - pthread_mutex_unlock(&os_lnx_state.entity_mutex)) + DeferLoop(pthread_mutex_lock(&lnx_state.entity_mutex), + pthread_mutex_unlock(&lnx_state.entity_mutex)) { - SLLStackPush(os_lnx_state.entity_free, entity); + SLLStackPush(lnx_state.entity_free, entity); } } @@ -118,7 +118,7 @@ os_lnx_entity_release(LNX_Entity *entity) //~ rjf: Thread Entry Point internal void * -os_lnx_thread_entry_point(void *ptr) +lnx_thread_entry_point(void *ptr) { LNX_Entity *entity = (LNX_Entity *)ptr; ThreadEntryPointFunctionType *func = entity->thread.func; @@ -153,7 +153,7 @@ now_time_universal(void) time(&t); struct tm universal_tm = {0}; gmtime_r(&t, &universal_tm); - DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); + DateTime result = lnx_date_time_from_tm(universal_tm, 0); return result; } @@ -161,14 +161,14 @@ internal DateTime universal_from_local_time(DateTime *dt) { // rjf: local DateTime -> universal time_t - tm local_tm = os_lnx_tm_from_date_time(*dt); + tm local_tm = lnx_tm_from_date_time(*dt); local_tm.tm_isdst = -1; time_t universal_t = mktime(&local_tm); // rjf: universal time_t -> DateTime tm universal_tm = {0}; gmtime_r(&universal_t, &universal_tm); - DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); + DateTime result = lnx_date_time_from_tm(universal_tm, 0); return result; } @@ -176,14 +176,14 @@ internal DateTime local_from_universal_time(DateTime *dt) { // rjf: universal DateTime -> local time_t - tm universal_tm = os_lnx_tm_from_date_time(*dt); + tm universal_tm = lnx_tm_from_date_time(*dt); universal_tm.tm_isdst = -1; time_t universal_t = timegm(&universal_tm); tm local_tm = {0}; localtime_r(&universal_t, &local_tm); // rjf: local tm -> DateTime - DateTime result = os_lnx_date_time_from_tm(local_tm, 0); + DateTime result = lnx_date_time_from_tm(local_tm, 0); return result; } @@ -324,7 +324,7 @@ shared_memory_view_close(SharedMemory handle, void *ptr, Rng1U64 range) internal SystemInfo * get_system_info(void) { - return &os_lnx_state.system_info; + return &lnx_state.system_info; } //////////////////////////////// @@ -353,14 +353,14 @@ set_platform_thread_name(String8 name) internal Thread thread_launch(ThreadEntryPointFunctionType *f, void *p) { - LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Thread); + LNX_Entity *entity = lnx_entity_alloc(LNX_EntityKind_Thread); entity->thread.func = f; entity->thread.ptr = p; { - int pthread_result = pthread_create(&entity->thread.handle, 0, os_lnx_thread_entry_point, entity); + int pthread_result = pthread_create(&entity->thread.handle, 0, lnx_thread_entry_point, entity); if(pthread_result == -1) { - os_lnx_entity_release(entity); + lnx_entity_release(entity); entity = 0; } } @@ -375,7 +375,7 @@ thread_join(Thread thread, U64 endt_us) LNX_Entity *entity = (LNX_Entity *)thread.u64[0]; int join_result = pthread_join(entity->thread.handle, 0); B32 result = (join_result == 0); - os_lnx_entity_release(entity); + lnx_entity_release(entity); return result; } @@ -384,7 +384,7 @@ thread_detach(Thread thread) { if(MemoryIsZeroStruct(&thread)) { return; } LNX_Entity *entity = (LNX_Entity *)thread.u64[0]; - os_lnx_entity_release(entity); + lnx_entity_release(entity); } //////////////////////////////// @@ -395,11 +395,11 @@ thread_detach(Thread thread) internal Mutex mutex_alloc(void) { - LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Mutex); + LNX_Entity *entity = lnx_entity_alloc(LNX_EntityKind_Mutex); int init_result = pthread_mutex_init(&entity->mutex_handle, 0); if(init_result == -1) { - os_lnx_entity_release(entity); + lnx_entity_release(entity); entity = 0; } Mutex handle = {(U64)entity}; @@ -412,7 +412,7 @@ mutex_release(Mutex mutex) if(MemoryIsZeroStruct(&mutex)) { return; } LNX_Entity *entity = (LNX_Entity *)mutex.u64[0]; pthread_mutex_destroy(&entity->mutex_handle); - os_lnx_entity_release(entity); + lnx_entity_release(entity); } internal void @@ -436,11 +436,11 @@ mutex_drop(Mutex mutex) internal RWMutex rw_mutex_alloc(void) { - LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_RWMutex); + LNX_Entity *entity = lnx_entity_alloc(LNX_EntityKind_RWMutex); int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0); if(init_result == -1) { - os_lnx_entity_release(entity); + lnx_entity_release(entity); entity = 0; } RWMutex handle = {(U64)entity}; @@ -453,7 +453,7 @@ rw_mutex_release(RWMutex mutex) if(MemoryIsZeroStruct(&mutex)) { return; } LNX_Entity *entity = (LNX_Entity *)mutex.u64[0]; pthread_rwlock_destroy(&entity->rwmutex_handle); - os_lnx_entity_release(entity); + lnx_entity_release(entity); } internal void @@ -484,11 +484,11 @@ rw_mutex_drop(RWMutex mutex, B32 write_mode) internal CondVar cond_var_alloc(void) { - LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_ConditionVariable); + LNX_Entity *entity = lnx_entity_alloc(LNX_EntityKind_ConditionVariable); int init_result = pthread_cond_init(&entity->cv.cond_handle, 0); if(init_result == -1) { - os_lnx_entity_release(entity); + lnx_entity_release(entity); entity = 0; } int init2_result = 0; @@ -499,7 +499,7 @@ cond_var_alloc(void) if(init2_result == -1) { pthread_cond_destroy(&entity->cv.cond_handle); - os_lnx_entity_release(entity); + lnx_entity_release(entity); entity = 0; } CondVar handle = {(U64)entity}; @@ -513,7 +513,7 @@ cond_var_release(CondVar cv) LNX_Entity *entity = (LNX_Entity *)cv.u64[0]; pthread_cond_destroy(&entity->cv.cond_handle); pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle); - os_lnx_entity_release(entity); + lnx_entity_release(entity); } internal B32 @@ -713,7 +713,7 @@ semaphore_drop(Semaphore semaphore) internal Barrier barrier_alloc(U64 count) { - LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Barrier); + LNX_Entity *entity = lnx_entity_alloc(LNX_EntityKind_Barrier); if(entity != 0) { pthread_barrier_init(&entity->barrier, 0, count); @@ -729,7 +729,7 @@ barrier_release(Barrier barrier) if(entity != 0) { pthread_barrier_destroy(&entity->barrier); - os_lnx_entity_release(entity); + lnx_entity_release(entity); } } @@ -751,13 +751,13 @@ safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail { // rjf: push handler to chain LNX_SafeCallChain chain = {0}; - SLLStackPush(os_lnx_safe_call_chain, &chain); + SLLStackPush(lnx_safe_call_chain, &chain); chain.fail_handler = fail_handler; chain.ptr = ptr; // rjf: set up sig handler info struct sigaction new_act = {0}; - new_act.sa_handler = os_lnx_safe_call_sig_handler; + new_act.sa_handler = lnx_safe_call_sig_handler; int signals_to_handle[] = { SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, @@ -883,7 +883,7 @@ file_set_times(File file, DateTime date_time) { if(file_match(file, file_zero())) { return 0; } int fd = (int)file.u64[0]; - timespec time = os_lnx_timespec_from_date_time(date_time); + timespec time = lnx_timespec_from_date_time(date_time); timespec times[2] = {time, time}; int futimens_result = futimens(fd, times); B32 good = (futimens_result != -1); @@ -900,7 +900,7 @@ properties_from_file(File file) FileProperties props = {0}; if(fstat_result != -1) { - props = os_lnx_file_properties_from_stat(&fd_stat); + props = lnx_file_properties_from_stat(&fd_stat); } return props; } @@ -1036,7 +1036,7 @@ properties_from_file_path(String8 path) FileProperties props = {0}; if(stat_result != -1) { - props = os_lnx_file_properties_from_stat(&f_stat); + props = lnx_file_properties_from_stat(&f_stat); } scratch_end(scratch); return props; @@ -1135,7 +1135,7 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out) info_out->name = push_str8_copy(arena, str8_cstring(lnx_iter->dp->d_name)); if(stat_result != -1) { - info_out->props = os_lnx_file_properties_from_stat(&st); + info_out->props = lnx_file_properties_from_stat(&st); } break; } @@ -1187,7 +1187,7 @@ abort_self(S32 exit_code) internal ProcessInfo * get_process_info(void) { - return &os_lnx_state.process_info; + return &lnx_state.process_info; } internal String8 @@ -1255,7 +1255,7 @@ process_launch(ProcessLaunchParams *params) char **envp = 0; if(params->inherit_env) { - envp = os_lnx_state.default_env; + envp = lnx_state.default_env; } else { @@ -1453,14 +1453,14 @@ main(int argc, char **argv) { //- rjf: get statically-allocated system/process info { - SystemInfo *info = &os_lnx_state.system_info; + SystemInfo *info = &lnx_state.system_info; info->logical_processor_count = (U32)get_nprocs(); info->page_size = (U64)getpagesize(); info->large_page_size = MB(2); info->allocation_granularity = info->page_size; } { - ProcessInfo *info = &os_lnx_state.process_info; + ProcessInfo *info = &lnx_state.process_info; info->pid = (U32)getpid(); } @@ -1469,28 +1469,28 @@ main(int argc, char **argv) tctx_select(tctx); //- rjf: set up dynamically allocated state - os_lnx_state.arena = arena_alloc(); - os_lnx_state.entity_arena = arena_alloc(); - pthread_mutex_init(&os_lnx_state.entity_mutex, 0); + lnx_state.arena = arena_alloc(); + lnx_state.entity_arena = arena_alloc(); + pthread_mutex_init(&lnx_state.entity_mutex, 0); // cache default environment { U64 env_count = 0; for(; __environ[env_count] != 0; env_count += 1) {} - char **default_env = push_array(os_lnx_state.arena, char *, env_count+1); + char **default_env = push_array(lnx_state.arena, char *, env_count+1); for EachIndex(idx, env_count) { - default_env[idx] = (char *)str8_copy(os_lnx_state.arena, str8_cstring(__environ[idx])).str; + default_env[idx] = (char *)str8_copy(lnx_state.arena, str8_cstring(__environ[idx])).str; } default_env[env_count] = 0; - os_lnx_state.default_env_count = env_count; - os_lnx_state.default_env = default_env; + lnx_state.default_env_count = env_count; + lnx_state.default_env = default_env; } //- rjf: grab dynamically allocated system info { Temp scratch = scratch_begin(0, 0); - SystemInfo *info = &os_lnx_state.system_info; + SystemInfo *info = &lnx_state.system_info; // rjf: get machine name B32 got_final_result = 0; @@ -1513,7 +1513,7 @@ main(int argc, char **argv) if(got_final_result && size > 0) { info->machine_name.size = size; - info->machine_name.str = push_array_no_zero(os_lnx_state.arena, U8, info->machine_name.size + 1); + info->machine_name.str = push_array_no_zero(lnx_state.arena, U8, info->machine_name.size + 1); MemoryCopy(info->machine_name.str, buffer, info->machine_name.size); info->machine_name.str[info->machine_name.size] = 0; } @@ -1524,7 +1524,7 @@ main(int argc, char **argv) //- rjf: grab dynamically allocated process info { Temp scratch = scratch_begin(0, 0); - ProcessInfo *info = &os_lnx_state.process_info; + ProcessInfo *info = &lnx_state.process_info; // rjf: grab binary path { @@ -1549,13 +1549,13 @@ main(int argc, char **argv) { String8 full_name = str8(buffer, size); String8 name_chopped = str8_chop_last_slash(full_name); - info->binary_path = push_str8_copy(os_lnx_state.arena, name_chopped); + info->binary_path = push_str8_copy(lnx_state.arena, name_chopped); } } // rjf: grab initial directory { - info->initial_path = get_current_path(os_lnx_state.arena); + info->initial_path = get_current_path(lnx_state.arena); } // rjf: grab home directory diff --git a/src/linux/base/linux_base.h b/src/linux/base/linux_base.h index b78cbdc3..9b3be274 100644 --- a/src/linux/base/linux_base.h +++ b/src/linux/base/linux_base.h @@ -61,7 +61,7 @@ struct LNX_FileIter struct dirent *dp; String8 path; }; -StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(LNX_FileIter), os_lnx_file_iter_size_check); +StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(LNX_FileIter), lnx_file_iter_size_check); //////////////////////////////// //~ rjf: Safe Call Handler Chain @@ -130,28 +130,28 @@ struct LNX_State //////////////////////////////// //~ rjf: Globals -global LNX_State os_lnx_state = {0}; -thread_static LNX_SafeCallChain *os_lnx_safe_call_chain = 0; +global LNX_State lnx_state = {0}; +thread_static LNX_SafeCallChain *lnx_safe_call_chain = 0; //////////////////////////////// //~ rjf: Helpers -internal DateTime os_lnx_date_time_from_tm(tm in, U32 msec); -internal tm os_lnx_tm_from_date_time(DateTime dt); -internal timespec os_lnx_timespec_from_date_time(DateTime dt); -internal DenseTime os_lnx_dense_time_from_timespec(timespec in); -internal FileProperties os_lnx_file_properties_from_stat(struct stat *s); -internal void os_lnx_safe_call_sig_handler(int x); +internal DateTime lnx_date_time_from_tm(tm in, U32 msec); +internal tm lnx_tm_from_date_time(DateTime dt); +internal timespec lnx_timespec_from_date_time(DateTime dt); +internal DenseTime lnx_dense_time_from_timespec(timespec in); +internal FileProperties lnx_file_properties_from_stat(struct stat *s); +internal void lnx_safe_call_sig_handler(int x); //////////////////////////////// //~ rjf: Entities -internal LNX_Entity *os_lnx_entity_alloc(LNX_EntityKind kind); -internal void os_lnx_entity_release(LNX_Entity *entity); +internal LNX_Entity *lnx_entity_alloc(LNX_EntityKind kind); +internal void lnx_entity_release(LNX_Entity *entity); //////////////////////////////// //~ rjf: Thread Entry Point -internal void *os_lnx_thread_entry_point(void *ptr); +internal void *lnx_thread_entry_point(void *ptr); #endif // LINUX_BASE_H diff --git a/src/linux/demon/linux_demon.c b/src/linux/demon/linux_demon.c index 0503c2de..1f187af9 100644 --- a/src/linux/demon/linux_demon.c +++ b/src/linux/demon/linux_demon.c @@ -2280,14 +2280,14 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, ProcessLaunchParams *params) } // setup target environment - U64 envc = os_lnx_state.default_env_count + params->env.node_count + 1; + U64 envc = lnx_state.default_env_count + params->env.node_count + 1; char **envp = push_array(scratch.arena, char *, envc); { // copy default environment - MemoryCopyTyped(envp, os_lnx_state.default_env, os_lnx_state.default_env_count); + MemoryCopyTyped(envp, lnx_state.default_env, lnx_state.default_env_count); // copy user environment - U64 idx = os_lnx_state.default_env_count; + U64 idx = lnx_state.default_env_count; for EachNode(n, String8Node, params->env.first) { envp[idx] = (char *)str8_copy(scratch.arena, n->string).str; diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index f3726fa0..7a19c3ee 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -5,10 +5,10 @@ //~ rjf: Helpers internal LNX_WM_Window * -os_lnx_window_from_x11window(Window window) +lnx_window_from_x11window(Window window) { LNX_WM_Window *result = 0; - for(LNX_WM_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next) + for(LNX_WM_Window *w = lnx_wm_state->first_window; w != 0; w = w->next) { if(w->window == window) { @@ -27,22 +27,22 @@ wm_init(void) { //- rjf: initialize basics Arena *arena = arena_alloc(); - os_lnx_gfx_state = push_array(arena, LNX_WM_GfxState, 1); - os_lnx_gfx_state->arena = arena; - os_lnx_gfx_state->display = XOpenDisplay(0); + lnx_wm_state = push_array(arena, LNX_WM_State, 1); + lnx_wm_state->arena = arena; + lnx_wm_state->display = XOpenDisplay(0); //- rjf: calculate atoms - os_lnx_gfx_state->wm_delete_window_atom = XInternAtom(os_lnx_gfx_state->display, "WM_DELETE_WINDOW", 0); - os_lnx_gfx_state->wm_sync_request_atom = XInternAtom(os_lnx_gfx_state->display, "_NET_WM_SYNC_REQUEST", 0); - os_lnx_gfx_state->wm_sync_request_counter_atom = XInternAtom(os_lnx_gfx_state->display, "_NET_WM_SYNC_REQUEST_COUNTER", 0); + lnx_wm_state->wm_delete_window_atom = XInternAtom(lnx_wm_state->display, "WM_DELETE_WINDOW", 0); + lnx_wm_state->wm_sync_request_atom = XInternAtom(lnx_wm_state->display, "_NET_WM_SYNC_REQUEST", 0); + lnx_wm_state->wm_sync_request_counter_atom = XInternAtom(lnx_wm_state->display, "_NET_WM_SYNC_REQUEST_COUNTER", 0); //- rjf: open im - os_lnx_gfx_state->xim = XOpenIM(os_lnx_gfx_state->display, 0, 0, 0); + lnx_wm_state->xim = XOpenIM(lnx_wm_state->display, 0, 0, 0); //- rjf: fill out gfx info - os_lnx_gfx_state->gfx_info.double_click_time = 0.5f; - os_lnx_gfx_state->gfx_info.caret_blink_time = 0.5f; - os_lnx_gfx_state->gfx_info.default_refresh_rate = 60.f; + lnx_wm_state->gfx_info.double_click_time = 0.5f; + lnx_wm_state->gfx_info.caret_blink_time = 0.5f; + lnx_wm_state->gfx_info.default_refresh_rate = 60.f; //- rjf: fill out cursors { @@ -65,7 +65,7 @@ wm_init(void) }; for EachElement(idx, map) { - os_lnx_gfx_state->cursors[map[idx].cursor] = XCreateFontCursor(os_lnx_gfx_state->display, map[idx].id); + lnx_wm_state->cursors[map[idx].cursor] = XCreateFontCursor(lnx_wm_state->display, map[idx].id); } } } @@ -76,7 +76,7 @@ wm_init(void) internal WM_SystemInfo * wm_get_system_info(void) { - return &os_lnx_gfx_state->gfx_info; + return &lnx_wm_state->gfx_info; } //////////////////////////////// @@ -104,21 +104,21 @@ wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) Vec2F32 resolution = dim_2f32(rect); //- rjf: allocate window - LNX_WM_Window *w = os_lnx_gfx_state->free_window; + LNX_WM_Window *w = lnx_wm_state->free_window; if(w) { - SLLStackPop(os_lnx_gfx_state->free_window); + SLLStackPop(lnx_wm_state->free_window); } else { - w = push_array_no_zero(os_lnx_gfx_state->arena, LNX_WM_Window, 1); + w = push_array_no_zero(lnx_wm_state->arena, LNX_WM_Window, 1); } MemoryZeroStruct(w); - DLLPushBack(os_lnx_gfx_state->first_window, os_lnx_gfx_state->last_window, w); + DLLPushBack(lnx_wm_state->first_window, lnx_wm_state->last_window, w); //- rjf: create window & equip with x11 info - w->window = XCreateWindow(os_lnx_gfx_state->display, - XDefaultRootWindow(os_lnx_gfx_state->display), + w->window = XCreateWindow(lnx_wm_state->display, + XDefaultRootWindow(lnx_wm_state->display), 0, 0, resolution.x, resolution.y, 0, CopyFromParent, @@ -126,7 +126,7 @@ wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) CopyFromParent, 0, 0); - XSelectInput(os_lnx_gfx_state->display, w->window, + XSelectInput(lnx_wm_state->display, w->window, ExposureMask| PointerMotionMask| ButtonPressMask| @@ -136,19 +136,19 @@ wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) FocusChangeMask); Atom protocols[] = { - os_lnx_gfx_state->wm_delete_window_atom, - os_lnx_gfx_state->wm_sync_request_atom, + lnx_wm_state->wm_delete_window_atom, + lnx_wm_state->wm_sync_request_atom, }; - XSetWMProtocols(os_lnx_gfx_state->display, w->window, protocols, ArrayCount(protocols)); + XSetWMProtocols(lnx_wm_state->display, w->window, protocols, ArrayCount(protocols)); { XSyncValue initial_value; XSyncIntToValue(&initial_value, 0); - w->counter_xid = XSyncCreateCounter(os_lnx_gfx_state->display, initial_value); + w->counter_xid = XSyncCreateCounter(lnx_wm_state->display, initial_value); } - XChangeProperty(os_lnx_gfx_state->display, w->window, os_lnx_gfx_state->wm_sync_request_counter_atom, XA_CARDINAL, 32, PropModeReplace, (U8 *)&w->counter_xid, 1); + XChangeProperty(lnx_wm_state->display, w->window, lnx_wm_state->wm_sync_request_counter_atom, XA_CARDINAL, 32, PropModeReplace, (U8 *)&w->counter_xid, 1); //- rjf: create xic - w->xic = XCreateIC(os_lnx_gfx_state->xim, + w->xic = XCreateIC(lnx_wm_state->xim, XNInputStyle, XIMPreeditNothing|XIMStatusNothing, XNClientWindow, w->window, XNFocusWindow, w->window, @@ -157,7 +157,7 @@ wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) //- rjf: attach name Temp scratch = scratch_begin(0, 0); String8 title_copy = push_str8_copy(scratch.arena, title); - XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str); + XStoreName(lnx_wm_state->display, w->window, (char *)title_copy.str); scratch_end(scratch); //- rjf: convert to handle & return @@ -170,7 +170,7 @@ wm_window_close(WM_Window handle) { if(wm_window_match(handle, wm_window_zero())) {return;} LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; - XDestroyWindow(os_lnx_gfx_state->display, w->window); + XDestroyWindow(lnx_wm_state->display, w->window); } internal void @@ -180,7 +180,7 @@ wm_window_set_title(WM_Window handle, String8 title) Temp scratch = scratch_begin(0, 0); LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; String8 title_copy = push_str8_copy(scratch.arena, title); - XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str); + XStoreName(lnx_wm_state->display, w->window, (char *)title_copy.str); scratch_end(scratch); } @@ -189,7 +189,7 @@ wm_window_first_paint(WM_Window handle) { if(wm_window_match(handle, wm_window_zero())) {return;} LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; - XMapWindow(os_lnx_gfx_state->display, w->window); + XMapWindow(lnx_wm_state->display, w->window); } internal void @@ -197,7 +197,7 @@ wm_window_focus(WM_Window handle) { if(wm_window_match(handle, wm_window_zero())) {return;} LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; - XSetInputFocus(os_lnx_gfx_state->display, w->window, RevertToNone, CurrentTime); + XSetInputFocus(lnx_wm_state->display, w->window, RevertToNone, CurrentTime); } internal B32 @@ -207,7 +207,7 @@ wm_window_is_focused(WM_Window handle) LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; Window focused_window = 0; int revert_to = 0; - XGetInputFocus(os_lnx_gfx_state->display, &focused_window, &revert_to); + XGetInputFocus(lnx_wm_state->display, &focused_window, &revert_to); B32 result = (w->window == focused_window); return result; } @@ -305,7 +305,7 @@ wm_rect_from_window(WM_Window handle) if(wm_window_match(handle, wm_window_zero())) {return r2f32p(0, 0, 0, 0);} LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; XWindowAttributes atts = {0}; - Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts); + Status s = XGetWindowAttributes(lnx_wm_state->display, w->window, &atts); Rng2F32 result = r2f32p((F32)atts.x, (F32)atts.y, (F32)atts.x + (F32)atts.width, (F32)atts.y + (F32)atts.height); return result; } @@ -315,7 +315,7 @@ wm_client_rect_from_window(WM_Window handle) { LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; XWindowAttributes atts = {0}; - Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts); + Status s = XGetWindowAttributes(lnx_wm_state->display, w->window, &atts); Rng2F32 result = r2f32p(0, 0, (F32)atts.width, (F32)atts.height); return result; } @@ -405,10 +405,10 @@ internal WM_EventList wm_get_events(Arena *arena, B32 wait) { WM_EventList evts = {0}; - for(;XPending(os_lnx_gfx_state->display) > 0 || (wait && evts.count == 0);) + for(;XPending(lnx_wm_state->display) > 0 || (wait && evts.count == 0);) { XEvent evt = {0}; - XNextEvent(os_lnx_gfx_state->display, &evt); + XNextEvent(lnx_wm_state->display, &evt); B32 set_mouse_cursor = 0; switch(evt.type) { @@ -425,7 +425,7 @@ wm_get_events(Arena *arena, B32 wait) if(evt.xkey.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; } // rjf: map keycode -> keysym & codepoint - LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xkey.window); + LNX_WM_Window *window = lnx_window_from_x11window(evt.xkey.window); KeySym keysym = 0; U8 text[256] = {0}; U64 text_size = Xutf8LookupString(window->xic, &evt.xkey, (char *)text, sizeof(text), &keysym, 0); @@ -552,7 +552,7 @@ wm_get_events(Arena *arena, B32 wait) } // rjf: push event - LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xbutton.window); + LNX_WM_Window *window = lnx_window_from_x11window(evt.xbutton.window); if(key != WM_Key_Null) { WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == ButtonPress ? WM_EventKind_Press : WM_EventKind_Release); @@ -575,7 +575,7 @@ wm_get_events(Arena *arena, B32 wait) //- rjf: mouse motion case MotionNotify: { - LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + LNX_WM_Window *window = lnx_window_from_x11window(evt.xclient.window); WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_MouseMove); e->window.u64[0] = (U64)window; e->pos.x = (F32)evt.xmotion.x; @@ -589,7 +589,7 @@ wm_get_events(Arena *arena, B32 wait) }break; case FocusOut: { - LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xfocus.window); + LNX_WM_Window *window = lnx_window_from_x11window(evt.xfocus.window); WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowLoseFocus); e->window.u64[0] = (U64)window; }break; @@ -597,15 +597,15 @@ wm_get_events(Arena *arena, B32 wait) //- rjf: client messages case ClientMessage: { - if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_delete_window_atom) + if((Atom)evt.xclient.data.l[0] == lnx_wm_state->wm_delete_window_atom) { - LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + LNX_WM_Window *window = lnx_window_from_x11window(evt.xclient.window); WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowClose); e->window.u64[0] = (U64)window; } - else if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_sync_request_atom) + else if((Atom)evt.xclient.data.l[0] == lnx_wm_state->wm_sync_request_atom) { - LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window); + LNX_WM_Window *window = lnx_window_from_x11window(evt.xclient.window); if(window != 0) { window->counter_value = 0; @@ -613,7 +613,7 @@ wm_get_events(Arena *arena, B32 wait) window->counter_value |= (evt.xclient.data.l[3] << 32); XSyncValue value; XSyncIntToValue(&value, window->counter_value); - XSyncSetCounter(os_lnx_gfx_state->display, window->counter_xid, value); + XSyncSetCounter(lnx_wm_state->display, window->counter_xid, value); } } }break; @@ -627,10 +627,10 @@ wm_get_events(Arena *arena, B32 wait) int child_rel_x = 0; int child_rel_y = 0; unsigned int mask = 0; - if(XQueryPointer(os_lnx_gfx_state->display, XDefaultRootWindow(os_lnx_gfx_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) + if(XQueryPointer(lnx_wm_state->display, XDefaultRootWindow(lnx_wm_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) { - XDefineCursor(os_lnx_gfx_state->display, root_window, os_lnx_gfx_state->cursors[os_lnx_gfx_state->last_set_cursor]); - XFlush(os_lnx_gfx_state->display); + XDefineCursor(lnx_wm_state->display, root_window, lnx_wm_state->cursors[lnx_wm_state->last_set_cursor]); + XFlush(lnx_wm_state->display); } } } @@ -665,7 +665,7 @@ wm_mouse_from_window(WM_Window handle) int child_rel_x = 0; int child_rel_y = 0; unsigned int mask = 0; - if(XQueryPointer(os_lnx_gfx_state->display, w->window, &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) + if(XQueryPointer(lnx_wm_state->display, w->window, &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) { result.x = child_rel_x; result.y = child_rel_y; @@ -680,7 +680,7 @@ wm_mouse_from_window(WM_Window handle) internal void wm_set_cursor(WM_Cursor cursor) { - os_lnx_gfx_state->last_set_cursor = cursor; + lnx_wm_state->last_set_cursor = cursor; } //////////////////////////////// diff --git a/src/linux/window_manager/linux_window_manager.h b/src/linux/window_manager/linux_window_manager.h index 7ee9ddb4..41b3dc65 100644 --- a/src/linux/window_manager/linux_window_manager.h +++ b/src/linux/window_manager/linux_window_manager.h @@ -31,8 +31,8 @@ struct LNX_WM_Window //////////////////////////////// //~ rjf: State Bundle -typedef struct LNX_WM_GfxState LNX_WM_GfxState; -struct LNX_WM_GfxState +typedef struct LNX_WM_State LNX_WM_State; +struct LNX_WM_State { Arena *arena; Display *display; @@ -51,11 +51,11 @@ struct LNX_WM_GfxState //////////////////////////////// //~ rjf: Globals -global LNX_WM_GfxState *os_lnx_gfx_state = 0; +global LNX_WM_State *lnx_wm_state = 0; //////////////////////////////// //~ rjf: Helpers -internal LNX_WM_Window *os_lnx_window_from_x11window(Window window); +internal LNX_WM_Window *lnx_window_from_x11window(Window window); #endif // LINUX_WINDOW_MANAGER_H diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 4c9d8c6e..8f460949 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -10,13 +10,14 @@ // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold // [x] step out of scopes / loops // -// [ ] codebase-internal barrier impl (win7/linux support) // [ ] asan pass // [ ] external window focusing bugs -// [ ] PDB -> RDI conversion memory usage +// [x] codebase-internal barrier impl (win7/linux support) // [x] policy for closing debug info which is no longer relevant? // [x] killing/restarting thread performance (#780) // +// [ ] PDB -> RDI conversion memory usage +// // [ ] project/user file improvements // [ ] "default" -> "untitled" // [ ] should clear default project data every time the program starts diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.c b/src/render/opengl/linux/egl/render_opengl_linux_egl.c index 165ffc3e..43e4d541 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.c +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.c @@ -20,7 +20,7 @@ r_ogl_os_init(CmdLine *cmdln) //- rjf: get EGL display { - r_ogl_lnx_state->display = eglGetDisplay((EGLNativeDisplayType)os_lnx_gfx_state->display); + r_ogl_lnx_state->display = eglGetDisplay((EGLNativeDisplayType)lnx_wm_state->display); if(r_ogl_lnx_state->display == EGL_NO_DISPLAY) { wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Failed to get EGL display.")); diff --git a/src/render/opengl/linux/glx/render_opengl_linux_glx.c b/src/render/opengl/linux/glx/render_opengl_linux_glx.c index 8b0a34a7..69106f1b 100644 --- a/src/render/opengl/linux/glx/render_opengl_linux_glx.c +++ b/src/render/opengl/linux/glx/render_opengl_linux_glx.c @@ -14,7 +14,7 @@ r_ogl_os_init(CmdLine *cmdln) //- rjf: require GLX 1.3+ int glx_version_major = 0; int glx_version_minor = 0; - if(!glXQueryVersion(os_lnx_gfx_state->display, &glx_version_major, &glx_version_minor) || + if(!glXQueryVersion(lnx_wm_state->display, &glx_version_major, &glx_version_minor) || (glx_version_major == 1 && glx_version_minor < 3) || glx_version_major < 1) { @@ -42,7 +42,7 @@ r_ogl_os_init(CmdLine *cmdln) None }; int framebuffer_configs_count = 0; - GLXFBConfig *framebuffer_configs = glXChooseFBConfig(os_lnx_gfx_state->display, DefaultScreen(os_lnx_gfx_state->display), framebuffer_config_options, &framebuffer_configs_count); + GLXFBConfig *framebuffer_configs = glXChooseFBConfig(lnx_wm_state->display, DefaultScreen(lnx_wm_state->display), framebuffer_config_options, &framebuffer_configs_count); if(framebuffer_configs == 0) { wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not find a suitable framebuffer configuration.")); @@ -72,10 +72,10 @@ r_ogl_os_init(CmdLine *cmdln) GLX_CONTEXT_FLAGS_ARB, !!debug_mode*GLX_CONTEXT_DEBUG_BIT_ARB, None }; - r_ogl_lnx_ctx = glXCreateContextAttribsARB(os_lnx_gfx_state->display, framebuffer_config, 0, 1, context_options); + r_ogl_lnx_ctx = glXCreateContextAttribsARB(lnx_wm_state->display, framebuffer_config, 0, 1, context_options); } - glXMakeCurrent(os_lnx_gfx_state->display, 0, r_ogl_lnx_ctx); + glXMakeCurrent(lnx_wm_state->display, 0, r_ogl_lnx_ctx); } internal R_Handle @@ -95,12 +95,12 @@ internal void r_ogl_os_select_window(WM_Window os, R_Handle r) { LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; - glXMakeCurrent(os_lnx_gfx_state->display, w->window, r_ogl_lnx_ctx); + glXMakeCurrent(lnx_wm_state->display, w->window, r_ogl_lnx_ctx); } internal void r_ogl_os_window_swap(WM_Window os, R_Handle r) { LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; - glXSwapBuffers(os_lnx_gfx_state->display, w->window); + glXSwapBuffers(lnx_wm_state->display, w->window); } From b4f15d3111cb60e3ec5cea33f4a08a35ddd978ea Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 May 2026 19:34:42 -0700 Subject: [PATCH 521/850] adjust project/user saving/loading rules to be less idiosyncratic with other applications. user settings persist, to keep the user from needing to specify things like windows/colors/bindings every time, but projects must always be manually specified, e.g. like usual files in other programs. you can do this either via the ui, or via command line still. also, new user/project no longer require a path - they just clear the existing path, then to set the path you just explicitly save. this makes things much more natural & familiar. --- project.4coder | 2 +- src/raddbg/generated/raddbg.meta.c | 14 ++--- src/raddbg/raddbg.mdesk | 12 ++--- src/raddbg/raddbg_core.c | 83 +++++++++--------------------- src/raddbg/raddbg_main.c | 2 +- 5 files changed, 34 insertions(+), 79 deletions(-) diff --git a/project.4coder b/project.4coder index d19c9955..36d19981 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build raddbg asan", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index f5c48ccc..1183bb3e 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -678,8 +678,8 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -829,7 +829,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("geo3d"), str8_lit_comp("Opens a Geometry (3D) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, }; -struct {String8 string; CFG_Binding binding;} rd_default_binding_table[118] = +struct {String8 string; CFG_Binding binding;} rd_default_binding_table[114] = { {str8_lit_comp("kill_all"), {WM_Key_F5, 0 |WM_Modifier_Shift }}, {str8_lit_comp("step_into_inst"), {WM_Key_F11, 0 |WM_Modifier_Alt}}, @@ -845,7 +845,6 @@ struct {String8 string; CFG_Binding binding;} rd_default_binding_table[118] = {str8_lit_comp("set_next_statement"), {WM_Key_F10, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, {str8_lit_comp("inc_window_font_size"), {WM_Key_Equal, 0 |WM_Modifier_Alt}}, {str8_lit_comp("dec_window_font_size"), {WM_Key_Minus, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("window"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, {str8_lit_comp("toggle_fullscreen"), {WM_Key_Return, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("new_panel_right"), {WM_Key_P, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("new_panel_down"), {WM_Key_Minus, 0 |WM_Modifier_Ctrl }}, @@ -875,11 +874,8 @@ struct {String8 string; CFG_Binding binding;} rd_default_binding_table[118] = {str8_lit_comp("open"), {WM_Key_O, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("switch"), {WM_Key_I, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("switch_to_partner_file"), {WM_Key_O, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("open_user"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, -{str8_lit_comp("open_project"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, -{str8_lit_comp("open_user"), {WM_Key_O, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, -{str8_lit_comp("open_project"), {WM_Key_O, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, -{str8_lit_comp("save_user"), {WM_Key_S, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("new_project"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("open_project"), {WM_Key_O, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, {str8_lit_comp("save_project"), {WM_Key_S, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, {str8_lit_comp("edit"), {WM_Key_F2, 0 }}, {str8_lit_comp("accept"), {WM_Key_Return, 0 }}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 08c492b1..1eba80f4 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1040,8 +1040,8 @@ RD_CmdTable: // | | | | {SetFileReplacementPath 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } //- rjf: setting config paths - {NewUser 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } - {NewProject 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } + {NewUser 1 1 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } + {NewProject 1 1 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } {OpenUser 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } {OpenProject 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } {OpenRecentProject 1 1 0 0 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } @@ -1289,7 +1289,6 @@ RD_DefaultBindingTable: { "dec_window_font_size" Minus 0 0 alt } //- rjf: windows - { "window" N ctrl shift 0 } { "toggle_fullscreen" Return ctrl 0 0 } //- rjf: panel splitting @@ -1337,11 +1336,8 @@ RD_DefaultBindingTable: { "switch_to_partner_file" O 0 0 alt } //- rjf: setting config paths - { "open_user" N ctrl shift alt } - { "open_project" N ctrl 0 alt } - { "open_user" O ctrl shift alt } - { "open_project" O ctrl 0 alt } - { "save_user" S ctrl shift alt } + { "new_project" N ctrl shift 0 } + { "open_project" O ctrl shift 0 } { "save_project" S ctrl shift 0 } //- rjf: meta controls diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index fe8be49c..e09efbba 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1633,9 +1633,10 @@ rd_view_ui(Rng2F32 rect) { if(cmd_name.size != 0) { + ui_spacer(ui_em(0.5f, 1.f)); UI_TextAlignment(UI_TextAlign_Center) UI_Transparency(1-search_row_open_t) - UI_PrefWidth(ui_em(2.5f, 1.f)) + UI_PrefWidth(ui_em(3.f, 1.f)) UI_TagF("weak") RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[icon == RD_IconKind_Null ? RD_IconKind_Find : icon]); @@ -6692,17 +6693,17 @@ rd_window_frame(void) rd_cmd_kind_info_table[RD_CmdKind_Open].string, rd_cmd_kind_info_table[RD_CmdKind_Switch].string, {0},//- - rd_cmd_kind_info_table[RD_CmdKind_NewUser].string, - rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string, - rd_cmd_kind_info_table[RD_CmdKind_SaveUser].string, - rd_cmd_kind_info_table[RD_CmdKind_UserSettings].string, - {0},//- rd_cmd_kind_info_table[RD_CmdKind_NewProject].string, rd_cmd_kind_info_table[RD_CmdKind_OpenProject].string, rd_cmd_kind_info_table[RD_CmdKind_OpenRecentProject].string, rd_cmd_kind_info_table[RD_CmdKind_SaveProject].string, rd_cmd_kind_info_table[RD_CmdKind_ProjectSettings].string, {0},//- + rd_cmd_kind_info_table[RD_CmdKind_NewUser].string, + rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string, + rd_cmd_kind_info_table[RD_CmdKind_SaveUser].string, + rd_cmd_kind_info_table[RD_CmdKind_UserSettings].string, + {0},//- rd_cmd_kind_info_table[RD_CmdKind_Exit].string, }; U32 codepoints[] = @@ -6710,17 +6711,17 @@ rd_window_frame(void) 'o', 'i', 0,//- - 'w', - 'u', - 's', - 'e', - 0,//- 'j', 'p', 'r', 'a', 't', 0,//- + 'w', + 'u', + 's', + 'e', + 0,//- 'x', }; Assert(ArrayCount(codepoints) == ArrayCount(cmds)); @@ -7166,6 +7167,10 @@ rd_window_frame(void) prof_path = str8_chop_last_dot(prof_path); project_name = str8_skip_last_slash(prof_path); } + if(project_name.size == 0) + { + project_name = str8_lit("Untitled Project"); + } RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[RD_IconKind_Briefcase]); ui_label(project_name); @@ -12563,12 +12568,12 @@ rd_frame(void) case RD_CmdKind_OpenUser: { arena_clear(rd_state->user_path_arena); - rd_state->user_path = push_str8_copy(rd_state->user_path_arena, file_path); + rd_state->user_path = str8_copy(rd_state->user_path_arena, file_path); }break; case RD_CmdKind_OpenProject: { arena_clear(rd_state->project_path_arena); - rd_state->project_path = push_str8_copy(rd_state->project_path_arena, file_path); + rd_state->project_path = str8_copy(rd_state->project_path_arena, file_path); }break; } } @@ -12660,57 +12665,14 @@ rd_frame(void) } } } - - //- rjf: if we've just loaded the user, and we do not have a project path, - // then we should try to look at the user's data for recent projects and - // load one of those, *or* just the default. - if(file_is_okay && kind == RD_CmdKind_OpenUser && rd_state->project_path.size == 0) - { - CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit("user")); - CFG_Node *recent_project = cfg_node_child_from_string(user, str8_lit("recent_project")); - String8 project_path = rd_path_from_cfg(recent_project); - if(project_path.size == 0) - { - String8 user_program_data_path = get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/%S", user_program_data_path, str8_lit("raddbg")); - make_directory(user_data_folder); - project_path = push_str8f(scratch.arena, "%S/default.raddbg_project", user_data_folder); - } - rd_cmd(RD_CmdKind_OpenProject, .file_path = project_path); - } }break; case RD_CmdKind_NewUser: + { + rd_cmd(RD_CmdKind_OpenUser, .file_path = str8_zero()); + }break; case RD_CmdKind_NewProject: { - String8 new_path = rd_regs()->file_path; - B32 file_will_be_overwritten = (properties_from_file_path(new_path).created != 0); - UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("new_config_overwrite_confirm")); - if(file_will_be_overwritten && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) - { - rd_state->popup_key = key; - rd_state->popup_active = 1; - arena_clear(rd_state->popup_arena); - MemoryZeroStruct(&rd_state->popup_cmds); - rd_state->popup_title = push_str8f(rd_state->popup_arena, "Are you sure you want to save to this path?"); - rd_state->popup_desc = push_str8f(rd_state->popup_arena, "The existing file at '%S' will be overwritten.", new_path); - RD_Regs *regs = rd_regs_copy(rd_frame_arena(), rd_regs()); - regs->force_confirm = 1; - rd_cmd_list_push_new(rd_state->popup_arena, &rd_state->popup_cmds, rd_cmd_kind_info_table[kind].string, regs); - } - else switch(kind) - { - default:{}break; - case RD_CmdKind_NewUser: - { - delete_file_at_path(new_path); - rd_cmd(RD_CmdKind_OpenUser, .file_path = new_path); - }break; - case RD_CmdKind_NewProject: - { - delete_file_at_path(new_path); - rd_cmd(RD_CmdKind_OpenProject, .file_path = new_path); - }break; - } + rd_cmd(RD_CmdKind_OpenProject, .file_path = str8_zero()); }break; case RD_CmdKind_SaveUser: case RD_CmdKind_SaveProject: @@ -12788,6 +12750,7 @@ rd_frame(void) case RD_CmdKind_WriteUserData: dst_path = rd_state->user_path; bucket_name = str8_lit("user"); goto write; case RD_CmdKind_WriteProjectData: dst_path = rd_state->project_path; bucket_name = str8_lit("project"); goto write; write:; + if(dst_path.size != 0) { B32 dst_exists = (properties_from_file_path(dst_path).created != 0); String8 temp_path = push_str8f(scratch.arena, "%S.temp", dst_path); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 8f460949..2c2a48c9 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -10,8 +10,8 @@ // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold // [x] step out of scopes / loops // -// [ ] asan pass // [ ] external window focusing bugs +// [x] asan pass // [x] codebase-internal barrier impl (win7/linux support) // [x] policy for closing debug info which is no longer relevant? // [x] killing/restarting thread performance (#780) From fa5af4fa9f6152b59af374d069850728797f37a4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 May 2026 19:57:01 -0700 Subject: [PATCH 522/850] notes --- src/raddbg/raddbg_main.c | 76 ++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 2c2a48c9..cecefbfb 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -8,29 +8,17 @@ // [ ] show "autos" inline in source code near thread? // [ ] memory_size(...) view for quickly evaluating memory sizes // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold -// [x] step out of scopes / loops // // [ ] external window focusing bugs -// [x] asan pass -// [x] codebase-internal barrier impl (win7/linux support) -// [x] policy for closing debug info which is no longer relevant? -// [x] killing/restarting thread performance (#780) // // [ ] PDB -> RDI conversion memory usage // -// [ ] project/user file improvements -// [ ] "default" -> "untitled" -// [ ] should clear default project data every time the program starts -// [ ] new project / user should not require picking a path; should just -// by default go to "untitled" in default user path -// [ ] more things should move to user data, but project-tagged - like -// recent files, watches?, etc. +// [ ] more things should move to user data, but project-tagged - like +// recent files, watches?, etc. // // [ ] linux/dwarf fixes // [ ] excessive CPU usage on async threads - barrier impl? // [ ] step-over/step-into doesn't step successfully in many cases, just causes a continue -// [x] rd_frame has no type info, should be (void -> void) - type should be generated but it -// is not being hooked up correctly // [ ] type views for `MyByte *` example do not match correctly // // [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! @@ -62,26 +50,6 @@ // [ ] focus changing on f10/f11? may be related to auto_run/auto_step - look at a bin/jeffr // [ ] single-line viz for pointers w/ bad (unmapped) addresses // [ ] option to prefer addresses first with string ptrs -// [x] option to turn off transient tabs altogether -// -//- namespace/locations/variables RDI pass -// [x] RDI_Local, RDI_GlobalVariable, RDI_ThreadVariable -> RDI_Variable -// [x] RDI_Variable gets RDI_ContainerFlags, and a container_idx -// [x] RDI_Namespace can be a container, same as types/procedures -// [x] If procedure-contained, then index goes to scope now, not procedure -// [x] Location sections -> split by location kind, fixed tables for simple locations, one catch-all table for bytecode. -// [x] Location kind -> can be thread-local offset, or module virtual offset, to enclose globals/tlocals cases -// [x] Referring to one location -> kind * index -// [x] Referring to many locations, based on scope offsets -> kind = BlockList; BlockList encodes a first/opl pair into Block table, each Block has scope_off_first/opl, location_kind, location_idx - but a block's location kind CANNOT BE BlockList -// [x] RDI_Variable has location_kind, location_idx -// -// [x] we keep flat tables of symbols, *but*, "sort" by containing unit. unit -> [f, opl) of procedures, globals, threadvars, constants, etc. -// [x] container can also be a unit, so you can also go from procedure/global/tvar -> unit -// [x] *OR*, because we can guarantee that the units themselves will be sorted from lowest -> highest in all symbol tables, we can simply binary search the unit table (small) with a symbol's index to find its corresponding unit. that way, no need to duplicate e.g. namespaces and so on across units. and actually, we have to do this, because containers can be types, and those cannot be unit-locked. -// -// [x] symbols only store their *partly-qualified name*, e.g. `x` for A::B::C::x -// [x] default name maps look up *partly-qualified names* -// [x] to match a *fully qualified name*, there needs to be a second kind of different lookup - instead of string-matching, we need to match against the *fully qualified names*. the maps must be built by hashing the *fully qualified name*, but redirecting to the symbol with the *partially qualified name*. this is to allow fully-qualified lookups, but avoid storing fully-qualified names. // //- urgent fixes // [ ] (use msvc assert as an example) show fastfail exception info (code, name, etc.) - comes from ExceptionInformation @fastfail @@ -91,7 +59,6 @@ // [ ] target ui entry point should override built-in entry point // [ ] list of all tabs in palette // [ ] u64 + (ptr - ptr) seems to produce unexpected results - double check with C rules? -// [x] hardware breakpoints regression (global eval in ctrl) // //- flow notes // [ ] "skip breakpoint, run to source", when stopped at a non-source location @@ -103,8 +70,6 @@ // [ ] have smaller visible range than entire memory space, within some bounds (e.g. 64KB) // [ ] dynamically expand memory space, based on scrolling // [ ] disambiguate . character in ASCII columns -// [x] fix type intepretations of cursor in bottom pane -// [x] fix clicking through occluded panels etc. // //- watch improvements // [ ] *ALL* expressions in watch windows need to be editable. @@ -233,7 +198,6 @@ // [ ] memory view // [ ] memory view user-made annotations // [ ] memory view searching -// [x] memory view mutation controls // [ ] disasm view // [ ] visualize jump destinations in disasm // @@ -270,6 +234,42 @@ // [x] clean up tooltip? it's a bit big/noisy (maybe remove it after above?) // [x] missing call stack frames? // [x] scroll bar +// +// [x] fix type intepretations of cursor in bottom pane +// [x] fix clicking through occluded panels etc. +// [x] hardware breakpoints regression (global eval in ctrl) +// [x] RDI_Local, RDI_GlobalVariable, RDI_ThreadVariable -> RDI_Variable +// [x] RDI_Variable gets RDI_ContainerFlags, and a container_idx +// [x] RDI_Namespace can be a container, same as types/procedures +// [x] If procedure-contained, then index goes to scope now, not procedure +// [x] Location sections -> split by location kind, fixed tables for simple locations, one catch-all table for bytecode. +// [x] Location kind -> can be thread-local offset, or module virtual offset, to enclose globals/tlocals cases +// [x] Referring to one location -> kind * index +// [x] Referring to many locations, based on scope offsets -> kind = BlockList; BlockList encodes a first/opl pair into Block table, each Block has scope_off_first/opl, location_kind, location_idx - but a block's location kind CANNOT BE BlockList +// [x] RDI_Variable has location_kind, location_idx +// +// [x] we keep flat tables of symbols, *but*, "sort" by containing unit. unit -> [f, opl) of procedures, globals, threadvars, constants, etc. +// [x] container can also be a unit, so you can also go from procedure/global/tvar -> unit +// [x] *OR*, because we can guarantee that the units themselves will be sorted from lowest -> highest in all symbol tables, we can simply binary search the unit table (small) with a symbol's index to find its corresponding unit. that way, no need to duplicate e.g. namespaces and so on across units. and actually, we have to do this, because containers can be types, and those cannot be unit-locked. +// +// [x] symbols only store their *partly-qualified name*, e.g. `x` for A::B::C::x +// [x] default name maps look up *partly-qualified names* +// [x] to match a *fully qualified name*, there needs to be a second kind of different lookup - instead of string-matching, we need to match against the *fully qualified names*. the maps must be built by hashing the *fully qualified name*, but redirecting to the symbol with the *partially qualified name*. this is to allow fully-qualified lookups, but avoid storing fully-qualified names. +// +// [x] option to turn off transient tabs altogether +// [x] step out of scopes / loops +// [x] asan pass +// [x] codebase-internal barrier impl (win7/linux support) +// [x] policy for closing debug info which is no longer relevant? +// [x] killing/restarting thread performance (#780) +// [x] rd_frame has no type info, should be (void -> void) - type should be generated but it +// is not being hooked up correctly +// [x] project/user file improvements +// [x] "default" -> "untitled" +// [x] should clear default project data every time the program starts +// [x] new project / user should not require picking a path; should just +// by default go to "untitled" in default user path +// [x] memory view mutation controls //////////////////////////////// //~ rjf: Build Options From a0ace3561f25e3bfe38075579a94eb5efd45e85f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 May 2026 19:58:15 -0700 Subject: [PATCH 523/850] eliminate d2r usage (1) from radbin --- src/radbin/radbin.c | 118 +++++++------------------------------------- 1 file changed, 17 insertions(+), 101 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index b4a2c7f5..4d553846 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -708,7 +708,6 @@ rb_thread_entry_point(void *p) B32 convert_done = 0; RDIM_BakeParams pdb_bake_params = {0}; RDIM_BakeParams dwarf_bake_params = {0}; - RDIM_BakeParams dwarf_bake_params_2 = {0}; typedef struct RDIM_BakeParamsNode RDIM_BakeParamsNode; struct RDIM_BakeParamsNode { @@ -731,89 +730,7 @@ rb_thread_entry_point(void *p) else if(elf_w_dwarf) { log_infof("ELFs specified; converting DWARF data to RDI\n"); } // rjf: convert - D2R_ConvertParams convert_params = {0}; - { - B32 got_exe = 0; - B32 got_dbg = 0; - if(!got_exe && !got_dbg) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_PE].first; n != 0; n = n->next) - { - if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) - { - got_exe = 1; - got_dbg = 1; - convert_params.dbg_name = n->v->path; - convert_params.dbg_data = n->v->data; - convert_params.exe_name = n->v->path; - convert_params.exe_data = n->v->data; - convert_params.exe_kind = ExecutableImageKind_CoffPe; - break; - } - } - } - if(!got_exe) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next) - { - got_exe = 1; - convert_params.exe_name = n->v->path; - convert_params.exe_data = n->v->data; - convert_params.exe_kind = ExecutableImageKind_Elf32; - if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF)) - { - break; - } - } - } - if(!got_exe) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next) - { - got_exe = 1; - convert_params.exe_name = n->v->path; - convert_params.exe_data = n->v->data; - convert_params.exe_kind = ExecutableImageKind_Elf64; - if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF)) - { - break; - } - } - } - if(!got_dbg) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next) - { - if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) - { - got_dbg = 1; - convert_params.dbg_name = n->v->path; - convert_params.dbg_data = n->v->data; - break; - } - } - } - if(!got_dbg) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next) - { - if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) - { - got_dbg = 1; - convert_params.dbg_name = n->v->path; - convert_params.dbg_data = n->v->data; - break; - } - } - } - convert_params.subset_flags = subset_flags; - convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); - convert_params.is_parse_relaxed = 1; // TODO: switch - } - // ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); - - // rjf: convert [2] - D2R2_ConvertParams convert_params_2 = {0}; + D2R2_ConvertParams convert_params = {0}; { B32 got_exe = 0; B32 got_dbg = 0; @@ -903,11 +820,11 @@ rb_thread_entry_point(void *p) String8 raw_sections = str8_substr(exe_data, pe.section_table_range); COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); String8 string_table = str8_substr(exe_data, pe.string_table_range); - convert_params_2.arch = pe.arch; - convert_params_2.base_vaddr = pe.image_base; - convert_params_2.raw = dw_input_from_coff_section_table(scratch.arena, exe_data, string_table, pe.section_count, section_table); - convert_params_2.path_style = PathStyle_WindowsAbsolute; - convert_params_2.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, exe_data, string_table, pe.section_count, section_table); + convert_params.arch = pe.arch; + convert_params.base_vaddr = pe.image_base; + convert_params.raw = dw_input_from_coff_section_table(scratch.arena, exe_data, string_table, pe.section_count, section_table); + convert_params.path_style = PathStyle_WindowsAbsolute; + convert_params.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, exe_data, string_table, pe.section_count, section_table); scratch_end(scratch); }break; case ExecutableImageKind_Elf32: @@ -915,20 +832,20 @@ rb_thread_entry_point(void *p) { Temp scratch = scratch_begin(&arena, 1); ELF_Bin bin = elf_bin_from_data(scratch.arena, dbg_data); - convert_params_2.arch = arch_from_elf_machine(bin.hdr.e_machine); - convert_params_2.base_vaddr = elf_base_addr_from_bin(&bin); - convert_params_2.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); - convert_params_2.path_style = PathStyle_UnixAbsolute; - convert_params_2.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); + convert_params.arch = arch_from_elf_machine(bin.hdr.e_machine); + convert_params.base_vaddr = elf_base_addr_from_bin(&bin); + convert_params.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); + convert_params.path_style = PathStyle_UnixAbsolute; + convert_params.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); scratch_end(scratch); }break; } - convert_params_2.exe_name = exe_name; - convert_params_2.exe_data = exe_data; - convert_params_2.subset_flags = subset_flags; - convert_params_2.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + convert_params.exe_name = exe_name; + convert_params.exe_data = exe_data; + convert_params.subset_flags = subset_flags; + convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } - ProfScope("convert [2]") dwarf_bake_params_2 = d2r2_convert(arena, &convert_params_2); + ProfScope("convert") dwarf_bake_params = d2r2_convert(arena, &convert_params); } //- rjf: PDB inputs => PDB -> RDI conversion @@ -1003,8 +920,7 @@ rb_thread_entry_point(void *p) { bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); - // rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); - rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); + rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) { rdim_bake_params_concat_in_place(bake_params, &n->v); From b198f0b421dabff307461601d502d701bf258d76 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 May 2026 20:02:35 -0700 Subject: [PATCH 524/850] just move metagen onto regular base layer - in theory this causes cycles (metagen w/ bug -> generates busted base layer code -> can't build metagen!) but we do not currently generate anything in base, and we also can just revert in that case. --- src/metagen/metagen_base/metagen_base_arena.c | 248 -- src/metagen/metagen_base/metagen_base_arena.h | 91 - .../metagen_base/metagen_base_command_line.c | 250 -- .../metagen_base/metagen_base_command_line.h | 56 - .../metagen_base_context_cracking.h | 247 -- src/metagen/metagen_base/metagen_base_core.c | 648 ----- src/metagen/metagen_base/metagen_base_core.h | 899 ------ .../metagen_base/metagen_base_entry_point.c | 130 - .../metagen_base/metagen_base_entry_point.h | 12 - src/metagen/metagen_base/metagen_base_inc.c | 20 - src/metagen/metagen_base/metagen_base_inc.h | 24 - src/metagen/metagen_base/metagen_base_log.c | 103 - src/metagen/metagen_base/metagen_base_log.h | 65 - .../metagen_base/metagen_base_markup.c | 21 - .../metagen_base/metagen_base_markup.h | 12 - src/metagen/metagen_base/metagen_base_math.c | 659 ----- src/metagen/metagen_base/metagen_base_math.h | 675 ----- src/metagen/metagen_base/metagen_base_meta.c | 422 --- src/metagen/metagen_base/metagen_base_meta.h | 298 -- .../metagen_base/metagen_base_profile.c | 2 - .../metagen_base/metagen_base_profile.h | 97 - .../metagen_base/metagen_base_strings.c | 2446 ----------------- .../metagen_base/metagen_base_strings.h | 412 --- .../metagen_base_thread_context.c | 87 - .../metagen_base_thread_context.h | 41 - src/metagen/metagen_main.c | 22 +- .../core/linux/metagen_os_core_linux.c | 1337 --------- .../core/linux/metagen_os_core_linux.h | 136 - src/metagen/metagen_os/core/metagen_os_core.c | 240 -- src/metagen/metagen_os/core/metagen_os_core.h | 335 --- .../core/win32/metagen_os_core_win32.c | 1785 ------------ .../core/win32/metagen_os_core_win32.h | 121 - src/metagen/metagen_os/metagen_os_inc.c | 12 - src/metagen/metagen_os/metagen_os_inc.h | 21 - 34 files changed, 10 insertions(+), 11964 deletions(-) delete mode 100644 src/metagen/metagen_base/metagen_base_arena.c delete mode 100644 src/metagen/metagen_base/metagen_base_arena.h delete mode 100644 src/metagen/metagen_base/metagen_base_command_line.c delete mode 100644 src/metagen/metagen_base/metagen_base_command_line.h delete mode 100644 src/metagen/metagen_base/metagen_base_context_cracking.h delete mode 100644 src/metagen/metagen_base/metagen_base_core.c delete mode 100644 src/metagen/metagen_base/metagen_base_core.h delete mode 100644 src/metagen/metagen_base/metagen_base_entry_point.c delete mode 100644 src/metagen/metagen_base/metagen_base_entry_point.h delete mode 100644 src/metagen/metagen_base/metagen_base_inc.c delete mode 100644 src/metagen/metagen_base/metagen_base_inc.h delete mode 100644 src/metagen/metagen_base/metagen_base_log.c delete mode 100644 src/metagen/metagen_base/metagen_base_log.h delete mode 100644 src/metagen/metagen_base/metagen_base_markup.c delete mode 100644 src/metagen/metagen_base/metagen_base_markup.h delete mode 100644 src/metagen/metagen_base/metagen_base_math.c delete mode 100644 src/metagen/metagen_base/metagen_base_math.h delete mode 100644 src/metagen/metagen_base/metagen_base_meta.c delete mode 100644 src/metagen/metagen_base/metagen_base_meta.h delete mode 100644 src/metagen/metagen_base/metagen_base_profile.c delete mode 100644 src/metagen/metagen_base/metagen_base_profile.h delete mode 100644 src/metagen/metagen_base/metagen_base_strings.c delete mode 100644 src/metagen/metagen_base/metagen_base_strings.h delete mode 100644 src/metagen/metagen_base/metagen_base_thread_context.c delete mode 100644 src/metagen/metagen_base/metagen_base_thread_context.h delete mode 100644 src/metagen/metagen_os/core/linux/metagen_os_core_linux.c delete mode 100644 src/metagen/metagen_os/core/linux/metagen_os_core_linux.h delete mode 100644 src/metagen/metagen_os/core/metagen_os_core.c delete mode 100644 src/metagen/metagen_os/core/metagen_os_core.h delete mode 100644 src/metagen/metagen_os/core/win32/metagen_os_core_win32.c delete mode 100644 src/metagen/metagen_os/core/win32/metagen_os_core_win32.h delete mode 100644 src/metagen/metagen_os/metagen_os_inc.c delete mode 100644 src/metagen/metagen_os/metagen_os_inc.h diff --git a/src/metagen/metagen_base/metagen_base_arena.c b/src/metagen/metagen_base/metagen_base_arena.c deleted file mode 100644 index 68ad2544..00000000 --- a/src/metagen/metagen_base/metagen_base_arena.c +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Arena Functions - -//- rjf: arena creation/destruction - -internal Arena * -arena_alloc_(ArenaParams *params) -{ - // rjf: round up reserve/commit sizes - U64 reserve_size = params->reserve_size; - U64 commit_size = params->commit_size; - if(params->flags & ArenaFlag_LargePages) - { - reserve_size = AlignPow2(reserve_size, os_get_system_info()->large_page_size); - commit_size = AlignPow2(commit_size, os_get_system_info()->large_page_size); - } - else - { - reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size); - commit_size = AlignPow2(commit_size, os_get_system_info()->page_size); - } - - // rjf: reserve/commit initial block - void *base = params->optional_backing_buffer; - if(base == 0) - { - if(params->flags & ArenaFlag_LargePages) - { - base = os_reserve_large(reserve_size); - os_commit_large(base, commit_size); - } - else - { - base = os_reserve(reserve_size); - os_commit(base, commit_size); - } - } - - // rjf: panic on arena creation failure -#if OS_FEATURE_GRAPHICAL - if(Unlikely(base == 0)) - { - os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); - os_abort(1); - } -#endif - - // rjf: extract arena header & fill - Arena *arena = (Arena *)base; - arena->current = arena; - arena->flags = params->flags; - arena->cmt_size = params->commit_size; - arena->res_size = params->reserve_size; - arena->base_pos = 0; - arena->pos = ARENA_HEADER_SIZE; - arena->cmt = commit_size; - arena->res = reserve_size; -#if ARENA_FREE_LIST - arena->free_size = 0; - arena->free_last = 0; -#endif - AsanPoisonMemoryRegion(base, commit_size); - AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE); - return arena; -} - -internal void -arena_release(Arena *arena) -{ - for(Arena *n = arena->current, *prev = 0; n != 0; n = prev) - { - prev = n->prev; - os_release(n, n->res); - } -} - -//- rjf: arena push/pop core functions - -internal void * -arena_push(Arena *arena, U64 size, U64 align) -{ - Arena *current = arena->current; - U64 pos_pre = AlignPow2(current->pos, align); - U64 pos_pst = pos_pre + size; - - // rjf: chain, if needed - if(current->res < pos_pst && !(arena->flags & ArenaFlag_NoChain)) - { - Arena *new_block = 0; - -#if ARENA_FREE_LIST - Arena *prev_block; - for(new_block = arena->free_last, prev_block = 0; new_block != 0; prev_block = new_block, new_block = new_block->prev) - { - if(new_block->res >= AlignPow2(size, align)) - { - if(prev_block) - { - prev_block->prev = new_block->prev; - } - else - { - arena->free_last = new_block->prev; - } - arena->free_size -= new_block->res_size; - AsanUnpoisonMemoryRegion((U8*)new_block + ARENA_HEADER_SIZE, new_block->res_size - ARENA_HEADER_SIZE); - break; - } - } -#endif - - if(new_block == 0) - { - U64 res_size = current->res_size; - U64 cmt_size = current->cmt_size; - if(size + ARENA_HEADER_SIZE > res_size) - { - res_size = AlignPow2(size + ARENA_HEADER_SIZE, align); - cmt_size = AlignPow2(size + ARENA_HEADER_SIZE, align); - } - new_block = arena_alloc(.reserve_size = res_size, - .commit_size = cmt_size, - .flags = current->flags); - } - - new_block->base_pos = current->base_pos + current->res; - SLLStackPush_N(arena->current, new_block, prev); - - current = new_block; - pos_pre = AlignPow2(current->pos, align); - pos_pst = pos_pre + size; - } - - // rjf: commit new pages, if needed - if(current->cmt < pos_pst) - { - U64 cmt_pst_aligned = pos_pst + current->cmt_size-1; - cmt_pst_aligned -= cmt_pst_aligned%current->cmt_size; - U64 cmt_pst_clamped = ClampTop(cmt_pst_aligned, current->res); - U64 cmt_size = cmt_pst_clamped - current->cmt; - U8 *cmt_ptr = (U8 *)current + current->cmt; - if(current->flags & ArenaFlag_LargePages) - { - os_commit_large(cmt_ptr, cmt_size); - } - else - { - os_commit(cmt_ptr, cmt_size); - } - current->cmt = cmt_pst_clamped; - } - - // rjf: push onto current block - void *result = 0; - if(current->cmt >= pos_pst) - { - result = (U8 *)current+pos_pre; - current->pos = pos_pst; - AsanUnpoisonMemoryRegion(result, size); - } - - // rjf: panic on failure -#if OS_FEATURE_GRAPHICAL - if(Unlikely(result == 0)) - { - os_graphical_message(1, str8_lit("Fatal Allocation Failure"), str8_lit("Unexpected memory allocation failure.")); - os_abort(1); - } -#endif - - return result; -} - -internal U64 -arena_pos(Arena *arena) -{ - Arena *current = arena->current; - U64 pos = current->base_pos + current->pos; - return pos; -} - -internal void -arena_pop_to(Arena *arena, U64 pos) -{ - U64 big_pos = ClampBot(ARENA_HEADER_SIZE, pos); - Arena *current = arena->current; - -#if ARENA_FREE_LIST - for(Arena *prev = 0; current->base_pos >= big_pos; current = prev) - { - prev = current->prev; - current->pos = ARENA_HEADER_SIZE; - arena->free_size += current->res_size; - SLLStackPush_N(arena->free_last, current, prev); - AsanPoisonMemoryRegion((U8*)current + ARENA_HEADER_SIZE, current->res_size - ARENA_HEADER_SIZE); - } -#else - for(Arena *prev = 0; current->base_pos >= big_pos; current = prev) - { - prev = current->prev; - os_release(current, current->res); - } -#endif - arena->current = current; - U64 new_pos = big_pos - current->base_pos; - AssertAlways(new_pos <= current->pos); - AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos)); - current->pos = new_pos; -} - -//- rjf: arena push/pop helpers - -internal void -arena_clear(Arena *arena) -{ - arena_pop_to(arena, 0); -} - -internal void -arena_pop(Arena *arena, U64 amt) -{ - U64 pos_old = arena_pos(arena); - U64 pos_new = pos_old; - if(amt < pos_old) - { - pos_new = pos_old - amt; - } - arena_pop_to(arena, pos_new); -} - -//- rjf: temporary arena scopes - -internal Temp -temp_begin(Arena *arena) -{ - U64 pos = arena_pos(arena); - Temp temp = {arena, pos}; - return temp; -} - -internal void -temp_end(Temp temp) -{ - arena_pop_to(temp.arena, temp.pos); -} diff --git a/src/metagen/metagen_base/metagen_base_arena.h b/src/metagen/metagen_base/metagen_base_arena.h deleted file mode 100644 index 8696f49f..00000000 --- a/src/metagen/metagen_base/metagen_base_arena.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_ARENA_H -#define BASE_ARENA_H - -//////////////////////////////// -//~ rjf: Constants - -#define ARENA_HEADER_SIZE 128 - -//////////////////////////////// -//~ rjf: Types - -typedef U64 ArenaFlags; -enum -{ - ArenaFlag_NoChain = (1<<0), - ArenaFlag_LargePages = (1<<1), -}; - -typedef struct ArenaParams ArenaParams; -struct ArenaParams -{ - ArenaFlags flags; - U64 reserve_size; - U64 commit_size; - void *optional_backing_buffer; -}; - -typedef struct Arena Arena; -struct Arena -{ - Arena *prev; // previous arena in chain - Arena *current; // current arena in chain - ArenaFlags flags; - U64 cmt_size; - U64 res_size; - U64 base_pos; - U64 pos; - U64 cmt; - U64 res; -#if ARENA_FREE_LIST - U64 free_size; - Arena *free_last; -#endif -}; -StaticAssert(sizeof(Arena) <= ARENA_HEADER_SIZE, arena_header_size_check); - -typedef struct Temp Temp; -struct Temp -{ - Arena *arena; - U64 pos; -}; - -//////////////////////////////// -//~ rjf: Global Defaults - -global U64 arena_default_reserve_size = MB(64); -global U64 arena_default_commit_size = KB(64); -global ArenaFlags arena_default_flags = 0; - -//////////////////////////////// -//~ rjf: Arena Functions - -//- rjf: arena creation/destruction -internal Arena *arena_alloc_(ArenaParams *params); -#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = arena_default_reserve_size, .commit_size = arena_default_commit_size, .flags = arena_default_flags, __VA_ARGS__}) -internal void arena_release(Arena *arena); - -//- rjf: arena push/pop/pos core functions -internal void *arena_push(Arena *arena, U64 size, U64 align); -internal U64 arena_pos(Arena *arena); -internal void arena_pop_to(Arena *arena, U64 pos); - -//- rjf: arena push/pop helpers -internal void arena_clear(Arena *arena); -internal void arena_pop(Arena *arena, U64 amt); - -//- rjf: temporary arena scopes -internal Temp temp_begin(Arena *arena); -internal void temp_end(Temp temp); - -//- rjf: push helper macros -#define push_array_no_zero_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T)*(c), (align)) -#define push_array_aligned(a, T, c, align) (T *)MemoryZero(push_array_no_zero_aligned(a, T, c, align), sizeof(T)*(c)) -#define push_array_no_zero(a, T, c) push_array_no_zero_aligned(a, T, c, Max(8, AlignOf(T))) -#define push_array(a, T, c) push_array_aligned(a, T, c, Max(8, AlignOf(T))) - -#endif // BASE_ARENA_H diff --git a/src/metagen/metagen_base/metagen_base_command_line.c b/src/metagen/metagen_base/metagen_base_command_line.c deleted file mode 100644 index ec726752..00000000 --- a/src/metagen/metagen_base/metagen_base_command_line.c +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ NOTE(rjf): Command Line Option Parsing - -internal U64 -cmd_line_hash_from_string(String8 string) -{ - U64 result = 5381; - for(U64 i = 0; i < string.size; i += 1) - { - result = ((result << 5) + result) + string.str[i]; - } - return result; -} - -internal CmdLineOpt ** -cmd_line_slot_from_string(CmdLine *cmd_line, String8 string) -{ - CmdLineOpt **slot = 0; - if(cmd_line->option_table_size != 0) - { - U64 hash = cmd_line_hash_from_string(string); - U64 bucket = hash % cmd_line->option_table_size; - slot = &cmd_line->option_table[bucket]; - } - return slot; -} - -internal CmdLineOpt * -cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string) -{ - CmdLineOpt *result = 0; - for(CmdLineOpt *var = *slot; var; var = var->hash_next) - { - if(str8_match(string, var->string, 0)) - { - result = var; - break; - } - } - return result; -} - -internal void -cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var) -{ - SLLQueuePush(list->first, list->last, var); - list->count += 1; -} - -internal CmdLineOpt * -cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values) -{ - CmdLineOpt *var = 0; - CmdLineOpt **slot = cmd_line_slot_from_string(cmd_line, string); - CmdLineOpt *existing_var = cmd_line_opt_from_slot(slot, string); - if(existing_var != 0) - { - var = existing_var; - } - else - { - var = push_array(arena, CmdLineOpt, 1); - var->hash_next = *slot; - var->hash = cmd_line_hash_from_string(string); - var->string = push_str8_copy(arena, string); - var->value_strings = values; - StringJoin join = {0}; - join.pre = str8_lit(""); - join.sep = str8_lit(","); - join.post = str8_lit(""); - var->value_string = str8_list_join(arena, &var->value_strings, &join); - *slot = var; - cmd_line_push_opt(&cmd_line->options, var); - } - return var; -} - -internal CmdLine -cmd_line_from_string_list(Arena *arena, String8List command_line) -{ - CmdLine parsed = {0}; - parsed.exe_name = command_line.first->string; - - // NOTE(rjf): Set up config option table. - { - parsed.option_table_size = 4096; - parsed.option_table = push_array(arena, CmdLineOpt *, parsed.option_table_size); - } - - // NOTE(rjf): Parse command line. - B32 after_passthrough_option = 0; - B32 first_passthrough = 1; - for(String8Node *node = command_line.first->next, *next = 0; node != 0; node = next) - { - next = node->next; - String8 option_name = node->string; - - // NOTE(rjf): Look at --, -, or / (only on Windows) at the start of an - // argument to determine if it's a flag option. All arguments after a - // single "--" (with no trailing string on the command line will be - // considered as input files. - B32 is_option = 1; - if(after_passthrough_option == 0) - { - if(str8_match(node->string, str8_lit("--"), 0)) - { - after_passthrough_option = 1; - is_option = 0; - } - else if(str8_match(str8_prefix(node->string, 2), str8_lit("--"), 0)) - { - option_name = str8_skip(option_name, 2); - } - else if(str8_match(str8_prefix(node->string, 1), str8_lit("-"), 0)) - { - option_name = str8_skip(option_name, 1); - } - else if(operating_system_from_context() == OperatingSystem_Windows && - str8_match(str8_prefix(node->string, 1), str8_lit("/"), 0)) - { - option_name = str8_skip(option_name, 1); - } - else - { - is_option = 0; - } - } - else - { - is_option = 0; - } - - // NOTE(rjf): This string is an option. - if(is_option) - { - B32 has_arguments = 0; - U64 arg_signifier_position1 = str8_find_needle(option_name, 0, str8_lit(":"), 0); - U64 arg_signifier_position2 = str8_find_needle(option_name, 0, str8_lit("="), 0); - U64 arg_signifier_position = Min(arg_signifier_position1, arg_signifier_position2); - String8 arg_portion_this_string = str8_skip(option_name, arg_signifier_position+1); - if(arg_signifier_position < option_name.size) - { - has_arguments = 1; - } - option_name = str8_prefix(option_name, arg_signifier_position); - - String8List arguments = {0}; - - // NOTE(rjf): Parse arguments. - if(has_arguments) - { - for(String8Node *n = node; n; n = n->next) - { - next = n->next; - - String8 string = n->string; - if(n == node) - { - string = arg_portion_this_string; - } - - U8 splits[] = { ',' }; - String8List args_in_this_string = str8_split(arena, string, splits, ArrayCount(splits), 0); - for(String8Node *sub_arg = args_in_this_string.first; sub_arg; sub_arg = sub_arg->next) - { - str8_list_push(arena, &arguments, sub_arg->string); - } - if(!str8_match(str8_postfix(n->string, 1), str8_lit(","), 0) && - (n != node || arg_portion_this_string.size != 0)) - { - break; - } - } - } - - // NOTE(rjf): Register config variable. - cmd_line_insert_opt(arena, &parsed, option_name, arguments); - } - - // NOTE(rjf): Default path, treat as a passthrough config option to be - // handled by tool-specific code. - else if(!str8_match(node->string, str8_lit("--"), 0) || !first_passthrough) - { - str8_list_push(arena, &parsed.inputs, node->string); - after_passthrough_option = 1; - first_passthrough = 0; - } - } - - // rjf: fill argc/argv - parsed.argc = command_line.node_count; - parsed.argv = push_array(arena, char *, parsed.argc); - { - U64 idx = 0; - for(String8Node *n = command_line.first; n != 0; n = n->next) - { - parsed.argv[idx] = (char *)push_str8_copy(arena, n->string).str; - idx += 1; - } - } - - return parsed; -} - -internal CmdLineOpt * -cmd_line_opt_from_string(CmdLine *cmd_line, String8 name) -{ - return cmd_line_opt_from_slot(cmd_line_slot_from_string(cmd_line, name), name); -} - -internal String8List -cmd_line_strings(CmdLine *cmd_line, String8 name) -{ - String8List result = {0}; - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - if(var != 0) - { - result = var->value_strings; - } - return result; -} - -internal String8 -cmd_line_string(CmdLine *cmd_line, String8 name) -{ - String8 result = {0}; - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - if(var != 0) - { - result = var->value_string; - } - return result; -} - -internal B32 -cmd_line_has_flag(CmdLine *cmd_line, String8 name) -{ - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - return(var != 0); -} - -internal B32 -cmd_line_has_argument(CmdLine *cmd_line, String8 name) -{ - CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name); - return(var != 0 && var->value_strings.node_count > 0); -} diff --git a/src/metagen/metagen_base/metagen_base_command_line.h b/src/metagen/metagen_base/metagen_base_command_line.h deleted file mode 100644 index acd7f17b..00000000 --- a/src/metagen/metagen_base/metagen_base_command_line.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_COMMAND_LINE_H -#define BASE_COMMAND_LINE_H - -//////////////////////////////// -//~ rjf: Parsed Command Line Types - -typedef struct CmdLineOpt CmdLineOpt; -struct CmdLineOpt -{ - CmdLineOpt *next; - CmdLineOpt *hash_next; - U64 hash; - String8 string; - String8List value_strings; - String8 value_string; -}; - -typedef struct CmdLineOptList CmdLineOptList; -struct CmdLineOptList -{ - U64 count; - CmdLineOpt *first; - CmdLineOpt *last; -}; - -typedef struct CmdLine CmdLine; -struct CmdLine -{ - String8 exe_name; - CmdLineOptList options; - String8List inputs; - U64 option_table_size; - CmdLineOpt **option_table; - U64 argc; - char **argv; -}; - -//////////////////////////////// -//~ NOTE(rjf): Command Line Option Parsing - -internal U64 cmd_line_hash_from_string(String8 string); -internal CmdLineOpt** cmd_line_slot_from_string(CmdLine *cmd_line, String8 string); -internal CmdLineOpt* cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string); -internal void cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var); -internal CmdLineOpt* cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values); -internal CmdLine cmd_line_from_string_list(Arena *arena, String8List arguments); -internal CmdLineOpt* cmd_line_opt_from_string(CmdLine *cmd_line, String8 name); -internal String8List cmd_line_strings(CmdLine *cmd_line, String8 name); -internal String8 cmd_line_string(CmdLine *cmd_line, String8 name); -internal B32 cmd_line_has_flag(CmdLine *cmd_line, String8 name); -internal B32 cmd_line_has_argument(CmdLine *cmd_line, String8 name); - -#endif // BASE_COMMAND_LINE_H diff --git a/src/metagen/metagen_base/metagen_base_context_cracking.h b/src/metagen/metagen_base/metagen_base_context_cracking.h deleted file mode 100644 index bac701dd..00000000 --- a/src/metagen/metagen_base/metagen_base_context_cracking.h +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_CONTEXT_CRACKING_H -#define BASE_CONTEXT_CRACKING_H - -//////////////////////////////// -//~ rjf: Clang OS/Arch Cracking - -#if defined(__clang__) - -# define COMPILER_CLANG 1 - -# if defined(_WIN32) -# define OS_WINDOWS 1 -# elif defined(__gnu_linux__) || defined(__linux__) -# define OS_LINUX 1 -# elif defined(__APPLE__) && defined(__MACH__) -# define OS_MAC 1 -# else -# error This compiler/OS combo is not supported. -# endif - -# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) -# define ARCH_X64 1 -# elif defined(i386) || defined(__i386) || defined(__i386__) -# define ARCH_X86 1 -# elif defined(__aarch64__) -# define ARCH_ARM64 1 -# elif defined(__arm__) -# define ARCH_ARM32 1 -# else -# error Architecture not supported. -# endif - -//////////////////////////////// -//~ rjf: MSVC OS/Arch Cracking - -#elif defined(_MSC_VER) - -# define COMPILER_MSVC 1 - -# if _MSC_VER >= 1920 -# define COMPILER_MSVC_YEAR 2019 -# elif _MSC_VER >= 1910 -# define COMPILER_MSVC_YEAR 2017 -# elif _MSC_VER >= 1900 -# define COMPILER_MSVC_YEAR 2015 -# elif _MSC_VER >= 1800 -# define COMPILER_MSVC_YEAR 2013 -# elif _MSC_VER >= 1700 -# define COMPILER_MSVC_YEAR 2012 -# elif _MSC_VER >= 1600 -# define COMPILER_MSVC_YEAR 2010 -# elif _MSC_VER >= 1500 -# define COMPILER_MSVC_YEAR 2008 -# elif _MSC_VER >= 1400 -# define COMPILER_MSVC_YEAR 2005 -# else -# define COMPILER_MSVC_YEAR 0 -# endif - -# if defined(_WIN32) -# define OS_WINDOWS 1 -# else -# error This compiler/OS combo is not supported. -# endif - -# if defined(_M_AMD64) -# define ARCH_X64 1 -# elif defined(_M_IX86) -# define ARCH_X86 1 -# elif defined(_M_ARM64) -# define ARCH_ARM64 1 -# elif defined(_M_ARM) -# define ARCH_ARM32 1 -# else -# error Architecture not supported. -# endif - -//////////////////////////////// -//~ rjf: GCC OS/Arch Cracking - -#elif defined(__GNUC__) || defined(__GNUG__) - -# define COMPILER_GCC 1 - -# if defined(__gnu_linux__) || defined(__linux__) -# define OS_LINUX 1 -# else -# error This compiler/OS combo is not supported. -# endif - -# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) -# define ARCH_X64 1 -# elif defined(i386) || defined(__i386) || defined(__i386__) -# define ARCH_X86 1 -# elif defined(__aarch64__) -# define ARCH_ARM64 1 -# elif defined(__arm__) -# define ARCH_ARM32 1 -# else -# error Architecture not supported. -# endif - -#else -# error Compiler not supported. -#endif - -//////////////////////////////// -//~ rjf: Arch Cracking - -#if defined(ARCH_X64) -# define ARCH_64BIT 1 -#elif defined(ARCH_X86) -# define ARCH_32BIT 1 -#endif - -#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86 -# define ARCH_LITTLE_ENDIAN 1 -#else -# error Endianness of this architecture not understood by context cracker. -#endif - -//////////////////////////////// -//~ rjf: Language Cracking - -#if defined(__cplusplus) -# define LANG_CPP 1 -#else -# define LANG_C 1 -#endif - -//////////////////////////////// -//~ rjf: Build Option Cracking - -#if !defined(BUILD_DEBUG) -# define BUILD_DEBUG 1 -#endif - -#if !defined(BUILD_SUPPLEMENTARY_UNIT) -# define BUILD_SUPPLEMENTARY_UNIT 0 -#endif - -#if !defined(BUILD_ENTRY_DEFINING_UNIT) -# define BUILD_ENTRY_DEFINING_UNIT 1 -#endif - -#if !defined(BUILD_CONSOLE_INTERFACE) -# define BUILD_CONSOLE_INTERFACE 0 -#endif - -#if !defined(BUILD_VERSION_MAJOR) -# define BUILD_VERSION_MAJOR 0 -#endif - -#if !defined(BUILD_VERSION_MINOR) -# define BUILD_VERSION_MINOR 9 -#endif - -#if !defined(BUILD_VERSION_PATCH) -# define BUILD_VERSION_PATCH 14 -#endif - -#define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) -#if BUILD_DEBUG -# define BUILD_MODE_STRING_LITERAL_APPEND " [Debug]" -#else -# define BUILD_MODE_STRING_LITERAL_APPEND "" -#endif -#if defined(BUILD_GIT_HASH) -# define BUILD_GIT_HASH_STRING_LITERAL_APPEND " [" BUILD_GIT_HASH "]" -#else -# define BUILD_GIT_HASH_STRING_LITERAL_APPEND "" -#endif - -#if !defined(BUILD_TITLE) -# define BUILD_TITLE "Untitled" -#endif - -#if !defined(BUILD_RELEASE_PHASE_STRING_LITERAL) -# define BUILD_RELEASE_PHASE_STRING_LITERAL "ALPHA" -#endif - -#if !defined(BUILD_ISSUES_LINK_STRING_LITERAL) -# define BUILD_ISSUES_LINK_STRING_LITERAL "https://github.com/EpicGamesExt/raddebugger/issues" -#endif - -#define BUILD_TITLE_STRING_LITERAL BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ") - " __DATE__ "" BUILD_GIT_HASH_STRING_LITERAL_APPEND BUILD_MODE_STRING_LITERAL_APPEND - -//////////////////////////////// -//~ rjf: Zero All Undefined Options - -#if !defined(ARCH_32BIT) -# define ARCH_32BIT 0 -#endif -#if !defined(ARCH_64BIT) -# define ARCH_64BIT 0 -#endif -#if !defined(ARCH_X64) -# define ARCH_X64 0 -#endif -#if !defined(ARCH_X86) -# define ARCH_X86 0 -#endif -#if !defined(ARCH_ARM64) -# define ARCH_ARM64 0 -#endif -#if !defined(ARCH_ARM32) -# define ARCH_ARM32 0 -#endif -#if !defined(COMPILER_MSVC) -# define COMPILER_MSVC 0 -#endif -#if !defined(COMPILER_GCC) -# define COMPILER_GCC 0 -#endif -#if !defined(COMPILER_CLANG) -# define COMPILER_CLANG 0 -#endif -#if !defined(OS_WINDOWS) -# define OS_WINDOWS 0 -#endif -#if !defined(OS_LINUX) -# define OS_LINUX 0 -#endif -#if !defined(OS_MAC) -# define OS_MAC 0 -#endif -#if !defined(LANG_CPP) -# define LANG_CPP 0 -#endif -#if !defined(LANG_C) -# define LANG_C 0 -#endif - -//////////////////////////////// -//~ rjf: Unsupported Errors - -#if ARCH_X86 -# error You tried to build in x86 (32 bit) mode, but currently, only building in x64 (64 bit) mode is supported. -#endif -#if !ARCH_X64 -# error You tried to build with an unsupported architecture. Currently, only building in x64 mode is supported. -#endif - -#endif // BASE_CONTEXT_CRACKING_H diff --git a/src/metagen/metagen_base/metagen_base_core.c b/src/metagen/metagen_base/metagen_base_core.c deleted file mode 100644 index d024c6e9..00000000 --- a/src/metagen/metagen_base/metagen_base_core.c +++ /dev/null @@ -1,648 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Safe Casts - -internal U16 -safe_cast_u16(U32 x) -{ - AssertAlways(x <= max_U16); - U16 result = (U16)x; - return result; -} - -internal U32 -safe_cast_u32(U64 x) -{ - AssertAlways(x <= max_U32); - U32 result = (U32)x; - return result; -} - -internal S32 -safe_cast_s32(S64 x) -{ - AssertAlways(x <= max_S32); - S32 result = (S32)x; - return result; -} - -//////////////////////////////// -//~ rjf: Large Base Type Functions - -internal U128 -u128_zero(void) -{ - U128 v = {0}; - return v; -} - -internal U128 -u128_make(U64 v0, U64 v1) -{ - U128 v = {v0, v1}; - return v; -} - -internal B32 -u128_match(U128 a, U128 b) -{ - return MemoryMatchStruct(&a, &b); -} - -//////////////////////////////// -//~ rjf: Bit Patterns - -internal U32 -u32_from_u64_saturate(U64 x){ - U32 x32 = (x > max_U32)?max_U32:(U32)x; - return(x32); -} - -internal U64 -u64_up_to_pow2(U64 x){ - if (x == 0){ - x = 1; - } - else{ - x -= 1; - x |= (x >> 1); - x |= (x >> 2); - x |= (x >> 4); - x |= (x >> 8); - x |= (x >> 16); - x |= (x >> 32); - x += 1; - } - return(x); -} - -internal S32 -extend_sign32(U32 x, U32 size){ - U32 high_bit = size * 8; - U32 shift = 32 - high_bit; - S32 result = ((S32)x << shift) >> shift; - return result; -} - -internal S64 -extend_sign64(U64 x, U64 size){ - U64 high_bit = size * 8; - U64 shift = 64 - high_bit; - S64 result = ((S64)x << shift) >> shift; - return result; -} - -internal F32 -inf32(void){ - union { U32 u; F32 f; } x; - x.u = exponent32; - return(x.f); -} - -internal F32 -neg_inf32(void){ - union { U32 u; F32 f; } x; - x.u = sign32 | exponent32; - return(x.f); -} - -internal U16 -bswap_u16(U16 x) -{ - U16 result = (((x & 0xFF00) >> 8) | - ((x & 0x00FF) << 8)); - return result; -} - -internal U32 -bswap_u32(U32 x) -{ - U32 result = (((x & 0xFF000000) >> 24) | - ((x & 0x00FF0000) >> 8) | - ((x & 0x0000FF00) << 8) | - ((x & 0x000000FF) << 24)); - return result; -} - -internal U64 -bswap_u64(U64 x) -{ - // TODO(nick): naive bswap, replace with something that is faster like an intrinsic - U64 result = (((x & 0xFF00000000000000ULL) >> 56) | - ((x & 0x00FF000000000000ULL) >> 40) | - ((x & 0x0000FF0000000000ULL) >> 24) | - ((x & 0x000000FF00000000ULL) >> 8) | - ((x & 0x00000000FF000000ULL) << 8) | - ((x & 0x0000000000FF0000ULL) << 24) | - ((x & 0x000000000000FF00ULL) << 40) | - ((x & 0x00000000000000FFULL) << 56)); - return result; -} - -#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) - -internal U64 -count_bits_set32(U32 val) -{ - return __popcnt(val); -} - -internal U64 -count_bits_set64(U64 val) -{ - return __popcnt64(val); -} - -internal U64 -ctz32(U32 mask) -{ - unsigned long idx; - _BitScanForward(&idx, mask); - return idx; -} - -internal U64 -ctz64(U64 mask) -{ - unsigned long idx; - _BitScanForward64(&idx, mask); - return idx; -} - -internal U64 -clz32(U32 mask) -{ - unsigned long idx; - _BitScanReverse(&idx, mask); - return 31 - idx; -} - -internal U64 -clz64(U64 mask) -{ - unsigned long idx; - _BitScanReverse64(&idx, mask); - return 63 - idx; -} - -#elif COMPILER_CLANG || COMPILER_GCC - -internal U64 -count_bits_set32(U32 val) -{ - return __builtin_popcount(val); -} - -internal U64 -count_bits_set64(U64 val) -{ - return __builtin_popcountll(val); -} - -internal U64 -ctz32(U32 val) -{ - return __builtin_ctz(val); -} - -internal U64 -clz32(U32 val) -{ - return __builtin_clz(val); -} - -internal U64 -ctz64(U64 val) -{ - return __builtin_ctzll(val); -} - -internal U64 -clz64(U64 val) -{ - return __builtin_clzll(val); -} - -#else -# error "Bit intrinsic functions not defined for this compiler." -#endif - -//////////////////////////////// -//~ rjf: Enum -> Sign - -internal S32 -sign_from_side_S32(Side side){ - return((side == Side_Min)?-1:1); -} - -internal F32 -sign_from_side_F32(Side side){ - return((side == Side_Min)?-1.f:1.f); -} - -//////////////////////////////// -//~ rjf: Memory Functions - -internal B32 -memory_is_zero(void *ptr, U64 size){ - B32 result = 1; - - // break down size - U64 extra = (size&0x7); - U64 count8 = (size >> 3); - - // check with 8-byte stride - U64 *p64 = (U64*)ptr; - if(result) - { - for (U64 i = 0; i < count8; i += 1, p64 += 1){ - if (*p64 != 0){ - result = 0; - goto done; - } - } - } - - // check extra - if(result) - { - U8 *p8 = (U8*)p64; - for (U64 i = 0; i < extra; i += 1, p8 += 1){ - if (*p8 != 0){ - result = 0; - goto done; - } - } - } - - done:; - return(result); -} - -internal void UBSAN_NO_ALIGN -memory_write16(void *ptr, U16 v) -{ - MemoryCopy(ptr, &v, sizeof(v)); -} - -internal void UBSAN_NO_ALIGN -memory_write32(void *ptr, U32 v) -{ - MemoryCopy(ptr, &v, sizeof(v)); -} - -internal U8 UBSAN_NO_ALIGN -memory_read8(void *ptr) -{ - U8 result; - MemoryCopy(&result, ptr, sizeof(result)); - return result; -} - -internal U16 UBSAN_NO_ALIGN -memory_read16(void *ptr) -{ - U16 result; - MemoryCopy(&result, ptr, sizeof(result)); - return result; -} - -internal U32 UBSAN_NO_ALIGN -memory_read32(void *ptr) -{ - U32 result; - MemoryCopy(&result, ptr, sizeof(result)); - return result; -} - -internal U64 UBSAN_NO_ALIGN -memory_read64(void *ptr) -{ - U64 result; - MemoryCopy(&result, ptr, sizeof(result)); - return result; -} - -//////////////////////////////// -//~ rjf: Text 2D Coordinate/Range Functions - -internal TxtPt -txt_pt(S64 line, S64 column) -{ - TxtPt p = {0}; - p.line = line; - p.column = column; - return p; -} - -internal B32 -txt_pt_match(TxtPt a, TxtPt b) -{ - return a.line == b.line && a.column == b.column; -} - -internal B32 -txt_pt_less_than(TxtPt a, TxtPt b) -{ - B32 result = 0; - if(a.line < b.line) - { - result = 1; - } - else if(a.line == b.line) - { - result = a.column < b.column; - } - return result; -} - -internal TxtPt -txt_pt_min(TxtPt a, TxtPt b) -{ - TxtPt result = b; - if(txt_pt_less_than(a, b)) - { - result = a; - } - return result; -} - -internal TxtPt -txt_pt_max(TxtPt a, TxtPt b) -{ - TxtPt result = a; - if(txt_pt_less_than(a, b)) - { - result = b; - } - return result; -} - -internal TxtRng -txt_rng(TxtPt min, TxtPt max) -{ - TxtRng range = {0}; - if(txt_pt_less_than(min, max)) - { - range.min = min; - range.max = max; - } - else - { - range.min = max; - range.max = min; - } - return range; -} - -internal TxtRng -txt_rng_intersect(TxtRng a, TxtRng b) -{ - TxtRng result = {0}; - result.min = txt_pt_max(a.min, b.min); - result.max = txt_pt_min(a.max, b.max); - if(txt_pt_less_than(result.max, result.min)) - { - MemoryZeroStruct(&result); - } - return result; -} - -internal TxtRng -txt_rng_union(TxtRng a, TxtRng b) -{ - TxtRng result = {0}; - result.min = txt_pt_min(a.min, b.min); - result.max = txt_pt_max(a.max, b.max); - return result; -} - -internal B32 -txt_rng_contains(TxtRng r, TxtPt pt) -{ - B32 result = ((txt_pt_less_than(r.min, pt) || txt_pt_match(r.min, pt)) && - txt_pt_less_than(pt, r.max)); - return result; -} - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enum Functions - -internal U64 -bit_size_from_arch(Arch arch) -{ - // TODO(rjf): metacode - U64 arch_bitsize = 0; - switch(arch) - { - case Arch_x64: arch_bitsize = 64; break; - case Arch_x86: arch_bitsize = 32; break; - case Arch_arm64: arch_bitsize = 64; break; - case Arch_arm32: arch_bitsize = 32; break; - default: break; - } - return arch_bitsize; -} - -internal U64 -max_instruction_size_from_arch(Arch arch) -{ - // TODO(rjf): make this real - return 64; -} - -internal OperatingSystem -operating_system_from_context(void){ - OperatingSystem os = OperatingSystem_Null; -#if OS_WINDOWS - os = OperatingSystem_Windows; -#elif OS_LINUX - os = OperatingSystem_Linux; -#elif OS_MAC - os = OperatingSystem_Mac; -#endif - return os; -} - -internal Arch -arch_from_context(void){ - Arch arch = Arch_Null; -#if ARCH_X64 - arch = Arch_x64; -#elif ARCH_X86 - arch = Arch_x86; -#elif ARCH_ARM64 - arch = Arch_arm64; -#elif ARCH_ARM32 - arch = Arch_arm32; -#endif - return arch; -} - -internal Compiler -compiler_from_context(void){ - Compiler compiler = Compiler_Null; -#if COMPILER_MSVC - compiler = Compiler_msvc; -#elif COMPILER_GCC - compiler = Compiler_gcc; -#elif COMPILER_CLANG - compiler = Compiler_clang; -#endif - return compiler; -} - -//////////////////////////////// -//~ rjf: Time Functions - -internal DenseTime -dense_time_from_date_time(DateTime date_time){ - DenseTime result = 0; - result += date_time.year; - result *= 12; - result += date_time.mon; - result *= 31; - result += date_time.day; - result *= 24; - result += date_time.hour; - result *= 60; - result += date_time.min; - result *= 61; - result += date_time.sec; - result *= 1000; - result += date_time.msec; - return(result); -} - -internal DateTime -date_time_from_dense_time(DenseTime time){ - DateTime result = {0}; - result.msec = time%1000; - time /= 1000; - result.sec = time%61; - time /= 61; - result.min = time%60; - time /= 60; - result.hour = time%24; - time /= 24; - result.day = time%31; - time /= 31; - result.mon = time%12; - time /= 12; - Assert(time <= max_U32); - result.year = (U32)time; - return(result); -} - -internal DateTime -date_time_from_micro_seconds(U64 time){ - DateTime result = {0}; - result.micro_sec = time%1000; - time /= 1000; - result.msec = time%1000; - time /= 1000; - result.sec = time%60; - time /= 60; - result.min = time%60; - time /= 60; - result.hour = time%24; - time /= 24; - result.day = time%31; - time /= 31; - result.mon = time%12; - time /= 12; - Assert(time <= max_U32); - result.year = (U32)time; - return(result); -} - -internal DateTime -date_time_from_unix_time(U64 unix_time) -{ - DateTime date = {0}; - date.year = 1970; - date.day = 1 + (unix_time / 86400); - date.sec = (U32)unix_time % 60; - date.min = (U32)(unix_time / 60) % 60; - date.hour = (U32)(unix_time / 3600) % 24; - - for(;;) - { - for(date.month = 0; date.month < 12; ++date.month) - { - U64 c = 0; - switch(date.month) - { - case Month_Jan: c = 31; break; - case Month_Feb: - { - if((date.year % 4 == 0) && ((date.year % 100) != 0 || (date.year % 400) == 0)) - { - c = 29; - } - else - { - c = 28; - } - } break; - case Month_Mar: c = 31; break; - case Month_Apr: c = 30; break; - case Month_May: c = 31; break; - case Month_Jun: c = 30; break; - case Month_Jul: c = 31; break; - case Month_Aug: c = 31; break; - case Month_Sep: c = 30; break; - case Month_Oct: c = 31; break; - case Month_Nov: c = 30; break; - case Month_Dec: c = 31; break; - default: InvalidPath; - } - if(date.day <= c) - { - goto exit; - } - date.day -= c; - } - ++date.year; - } - exit:; - - return date; -} - -//////////////////////////////// -//~ rjf: Non-Fancy Ring Buffer Reads/Writes - -internal U64 -ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size) -{ - Assert(src_data_size <= ring_size); - { - U64 ring_off = ring_pos%ring_size; - U64 bytes_before_split = ring_size-ring_off; - U64 pre_split_bytes = Min(bytes_before_split, src_data_size); - U64 pst_split_bytes = src_data_size-pre_split_bytes; - void *pre_split_data = src_data; - void *pst_split_data = ((U8 *)src_data + pre_split_bytes); - MemoryCopy(ring_base+ring_off, pre_split_data, pre_split_bytes); - MemoryCopy(ring_base+0, pst_split_data, pst_split_bytes); - } - return src_data_size; -} - -internal U64 -ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size) -{ - Assert(read_size <= ring_size); - { - U64 ring_off = ring_pos%ring_size; - U64 bytes_before_split = ring_size-ring_off; - U64 pre_split_bytes = Min(bytes_before_split, read_size); - U64 pst_split_bytes = read_size-pre_split_bytes; - MemoryCopy(dst_data, ring_base+ring_off, pre_split_bytes); - MemoryCopy((U8 *)dst_data + pre_split_bytes, ring_base+0, pst_split_bytes); - } - return read_size; -} diff --git a/src/metagen/metagen_base/metagen_base_core.h b/src/metagen/metagen_base/metagen_base_core.h deleted file mode 100644 index f76e2693..00000000 --- a/src/metagen/metagen_base/metagen_base_core.h +++ /dev/null @@ -1,899 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_CORE_H -#define BASE_CORE_H - -//////////////////////////////// -//~ rjf: Foreign Includes - -#include -#include -#include -#include -#include - -//////////////////////////////// -//~ rjf: Codebase Keywords - -#define internal static -#define global static -#define local_persist static - -#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS) -# pragma section(".rdata$", read) -# define read_only __declspec(allocate(".rdata$")) -#elif (COMPILER_CLANG && OS_LINUX) -# define read_only __attribute__((section(".rodata"))) -#else -// NOTE(rjf): I don't know of a useful way to do this in GCC land. -// __attribute__((section(".rodata"))) looked promising, but it introduces a -// strange warning about malformed section attributes, and it doesn't look -// like writing to that section reliably produces access violations, strangely -// enough. (It does on Clang) -# define read_only -#endif - -#if COMPILER_MSVC -# define thread_static __declspec(thread) -#elif COMPILER_CLANG || COMPILER_GCC -# define thread_static __thread -#endif - -#if COMPILER_MSVC -# define force_inline __forceinline -#elif COMPILER_CLANG || COMPILER_GCC -# define force_inline __attribute__((always_inline)) -#endif - -//////////////////////////////// -//~ rjf: Linkage Keyword Macros - -#if OS_WINDOWS -# define shared_function C_LINKAGE __declspec(dllexport) -#else -# define shared_function C_LINKAGE -#endif - -#if LANG_CPP -# define C_LINKAGE_BEGIN extern "C"{ -# define C_LINKAGE_END } -# define C_LINKAGE extern "C" -#else -# define C_LINKAGE_BEGIN -# define C_LINKAGE_END -# define C_LINKAGE -#endif - -//////////////////////////////// -//~ rjf: Units - -#define KB(n) (((U64)(n)) << 10) -#define MB(n) (((U64)(n)) << 20) -#define GB(n) (((U64)(n)) << 30) -#define TB(n) (((U64)(n)) << 40) -#define Thousand(n) ((n)*1000) -#define Million(n) ((n)*1000000) -#define Billion(n) ((n)*1000000000) - -//////////////////////////////// -//~ rjf: Branch Predictor Hints - -#if defined(__clang__) -# define Expect(expr, val) __builtin_expect((expr), (val)) -#else -# define Expect(expr, val) (expr) -#endif - -#define Likely(expr) Expect(expr,1) -#define Unlikely(expr) Expect(expr,0) - -//////////////////////////////// -//~ rjf: Clamps, Mins, Maxes - -#define Min(A,B) (((A)<(B))?(A):(B)) -#define Max(A,B) (((A)>(B))?(A):(B)) -#define ClampTop(A,X) Min(A,X) -#define ClampBot(X,B) Max(X,B) -#define Clamp(A,X,B) (((X)<(A))?(A):((X)>(B))?(B):(X)) - -//////////////////////////////// -//~ rjf: Type -> Alignment - -#if COMPILER_MSVC -# define AlignOf(T) __alignof(T) -#elif COMPILER_CLANG -# define AlignOf(T) __alignof(T) -#elif COMPILER_GCC -# define AlignOf(T) __alignof__(T) -#else -# error AlignOf not defined for this compiler. -#endif - -//////////////////////////////// -//~ rjf: Member Offsets - -#define Member(T,m) (((T*)0)->m) -#define OffsetOf(T,m) IntFromPtr(&Member(T,m)) -#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off))) -#define CastFromMember(T,m,ptr) (T*)(((U8*)ptr) - OffsetOf(T,m)) - -//////////////////////////////// -//~ rjf: For-Loop Construct Macros - -#define DeferLoop(begin, end) for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end)) -#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end)) - -#define EachIndex(it, count) (U64 it = 0; it < (count); it += 1) -#define EachElement(it, array) (U64 it = 0; it < ArrayCount(array); it += 1) -#define EachEnumVal(type, it) (type it = (type)0; it < type##_COUNT; it = (type)(it+1)) -#define EachNonZeroEnumVal(type, it) (type it = (type)1; it < type##_COUNT; it = (type)(it+1)) - -//////////////////////////////// -//~ rjf: Memory Operation Macros - -#define MemoryCopy(dst, src, size) memmove((dst), (src), (size)) -#define MemorySet(dst, byte, size) memset((dst), (byte), (size)) -#define MemoryCompare(a, b, size) memcmp((a), (b), (size)) -#define MemoryStrlen(ptr) strlen(ptr) - -#define MemoryCopyStruct(d,s) MemoryCopy((d),(s),sizeof(*(d))) -#define MemoryCopyArray(d,s) MemoryCopy((d),(s),sizeof(d)) -#define MemoryCopyTyped(d,s,c) MemoryCopy((d),(s),sizeof(*(d))*(c)) - -#define MemoryZero(s,z) memset((s),0,(z)) -#define MemoryZeroStruct(s) MemoryZero((s),sizeof(*(s))) -#define MemoryZeroArray(a) MemoryZero((a),sizeof(a)) -#define MemoryZeroTyped(m,c) MemoryZero((m),sizeof(*(m))*(c)) - -#define MemoryMatch(a,b,z) (MemoryCompare((a),(b),(z)) == 0) -#define MemoryMatchStruct(a,b) MemoryMatch((a),(b),sizeof(*(a))) -#define MemoryMatchArray(a,b) MemoryMatch((a),(b),sizeof(a)) - -#define MemoryRead(T,p,e) ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) ) -#define MemoryConsume(T,p,e) ( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) ) - -//////////////////////////////// -//~ rjf: Asserts - -#if COMPILER_MSVC -# define Trap() __debugbreak() -#elif COMPILER_CLANG || COMPILER_GCC -# define Trap() __builtin_trap() -#else -# error Unknown trap intrinsic for this compiler. -#endif - -#define AssertAlways(x) do{if(!(x)) {Trap();}}while(0) -#if BUILD_DEBUG -# define Assert(x) AssertAlways(x) -#else -# define Assert(x) (void)(x) -#endif -#define InvalidPath Assert(!"Invalid Path!") -#define NotImplemented Assert(!"Not Implemented!") -#define NoOp ((void)0) -#define StaticAssert(C, ID) global U8 Glue(ID, __LINE__)[(C)?1:-1] - -//////////////////////////////// -//~ rjf: Atomic Operations - -#if COMPILER_MSVC -# include -# if ARCH_X64 -# define ins_atomic_u64_eval(x) *((volatile U64 *)(x)) -# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((volatile __int64 *)(x)) -# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((volatile __int64 *)(x)) -# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((volatile __int64 *)(x),(c)) -# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((volatile __int64 *)(x), c) -# define ins_atomic_u64_eval_cond_assign(x,k,c) InterlockedCompareExchange64((volatile __int64 *)(x),(k),(c)) -# define ins_atomic_u32_eval(x) *((volatile U32 *)(x)) -# define ins_atomic_u32_inc_eval(x) InterlockedIncrement((volatile LONG *)x) -# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((volatile LONG *)(x),(c)) -# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c)) -# define ins_atomic_u32_add_eval(x,c) InterlockedAdd((volatile LONG *)(x), c) -# else -# error Atomic intrinsics not defined for this compiler / architecture combination. -# endif -#elif COMPILER_CLANG || COMPILER_GCC -# define ins_atomic_u64_eval(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) -# define ins_atomic_u64_inc_eval(x) (__atomic_fetch_add((volatile U64 *)(x), 1, __ATOMIC_SEQ_CST) + 1) -# define ins_atomic_u64_dec_eval(x) (__atomic_fetch_sub((volatile U64 *)(x), 1, __ATOMIC_SEQ_CST) - 1) -# define ins_atomic_u64_eval_assign(x,c) __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST) -# define ins_atomic_u64_add_eval(x,c) (__atomic_fetch_add((volatile U64 *)(x), c, __ATOMIC_SEQ_CST) + (c)) -# define ins_atomic_u64_eval_cond_assign(x,k,c) ({ U64 _new = (c); __atomic_compare_exchange_n((volatile U64 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) -# define ins_atomic_u32_eval(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) -# define ins_atomic_u32_inc_eval(x) (__atomic_fetch_add((volatile U32 *)(x), 1, __ATOMIC_SEQ_CST) + 1) -# define ins_atomic_u32_add_eval(x,c) (__atomic_fetch_add((volatile U32 *)(x), c, __ATOMIC_SEQ_CST) + (c)) -# define ins_atomic_u32_eval_assign(x,c) __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST) -# define ins_atomic_u32_eval_cond_assign(x,k,c) ({ U32 _new = (c); __atomic_compare_exchange_n((volatile U32 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) -#else -# error Atomic intrinsics not defined for this compiler / architecture. -#endif - -#if ARCH_64BIT -# define ins_atomic_ptr_eval_cond_assign(x,k,c) (void*)ins_atomic_u64_eval_cond_assign((volatile U64 *)(x), (U64)(k), (U64)(c)) -# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u64_eval_assign((volatile U64 *)(x), (U64)(c)) -# define ins_atomic_ptr_eval(x) (void*)ins_atomic_u64_eval((volatile U64 *)x) -#elif ARCH_32BIT -# define ins_atomic_ptr_eval_cond_assign(x,k,c) (void*)ins_atomic_u32_eval_cond_assign((volatile U32 *)(x), (U32)(k), (U32)(c)) -# define ins_atomic_ptr_eval_assign(x,c) (void*)ins_atomic_u32_eval_assign((volatile U32 *)(x), (U32)(c)) -# define ins_atomic_ptr_eval(x) (void*)ins_atomic_u32_eval((volatile U32 *)x) -#else -# error Atomic intrinsics for pointers not defined for this architecture. -#endif - -//////////////////////////////// -//~ rjf: Linked List Building Macros - -//- rjf: linked list macro helpers -#define CheckNil(nil,p) ((p) == 0 || (p) == nil) -#define SetNil(nil,p) ((p) = nil) - -//- rjf: doubly-linked-lists -#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \ -((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\ -CheckNil(nil,p) ? \ -((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\ -((p)==(l)) ? \ -((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\ -(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p)))) -#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev) -#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next) -#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\ -((n) == (l) ? (l) = (l)->prev : (0)),\ -(CheckNil(nil,(n)->prev) ? (0) :\ -((n)->prev->next = (n)->next)),\ -(CheckNil(nil,(n)->next) ? (0) :\ -((n)->next->prev = (n)->prev))) - -//- rjf: singly-linked, doubly-headed lists (queues) -#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ -((f)=(l)=(n),SetNil(nil,(n)->next)):\ -((l)->next=(n),(l)=(n),SetNil(nil,(n)->next))) -#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\ -((f)=(l)=(n),SetNil(nil,(n)->next)):\ -((n)->next=(f),(f)=(n))) -#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\ -(SetNil(nil,f),SetNil(nil,l)):\ -((f)=(f)->next)) - -//- rjf: singly-linked, singly-headed lists (stacks) -#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n)) -#define SLLStackPop_N(f,next) ((f)=(f)->next) - -//- rjf: doubly-linked-list helpers -#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev) -#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev) -#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev) -#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev) -#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev) -#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev) -#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev) - -//- rjf: singly-linked, doubly-headed list helpers -#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next) -#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next) -#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next) -#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next) -#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next) -#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next) - -//- rjf: singly-linked, singly-headed list helpers -#define SLLStackPush(f,n) SLLStackPush_N(f,n,next) -#define SLLStackPop(f) SLLStackPop_N(f,next) - -//////////////////////////////// -//~ rjf: Address Sanitizer Markup - -#if COMPILER_MSVC -# if defined(__SANITIZE_ADDRESS__) -# define ASAN_ENABLED 1 -# define ASAN_NO_ADDR __declspec(no_sanitize_address) -# endif -#elif COMPILER_CLANG -# if defined(__has_feature) -# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) -# define ASAN_ENABLED 1 -# endif -# endif -# define ASAN_NO_ADDR __attribute__((no_sanitize("address"))) -# define UBSAN_NO_ALIGN __attribute__((no_sanitize("alignment"))) -#endif - -#ifndef ASAN_NO_ADDR -# define ASAN_NO_ADDR -#endif -#ifndef UBSAN_NO_ALIGN -# define UBSAN_NO_ALIGN -#endif - -#if ASAN_ENABLED -C_LINKAGE void __asan_poison_memory_region(void const volatile *addr, size_t size); -C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t size); -# define AsanPoisonMemoryRegion(addr, size) __asan_poison_memory_region((addr), (size)) -# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size)) -#else -# define AsanPoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) -# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size)) -#endif - -//////////////////////////////// -//~ rjf: Misc. Helper Macros - -#define Stringify_(S) #S -#define Stringify(S) Stringify_(S) - -#define Glue_(A,B) A##B -#define Glue(A,B) Glue_(A,B) - -#define ArrayCount(a) (sizeof(a) / sizeof((a)[0])) - -#define CeilIntegerDiv(a,b) (((a) + (b) - 1)/(b)) - -#define Swap(T,a,b) do{T t__ = a; a = b; b = t__;}while(0) - -#if ARCH_64BIT -# define IntFromPtr(ptr) ((U64)(ptr)) -#elif ARCH_32BIT -# define IntFromPtr(ptr) ((U32)(ptr)) -#else -# error Missing pointer-to-integer cast for this architecture. -#endif -#define PtrFromInt(i) (void*)((U8*)0 + (i)) - -#define Compose64Bit(a,b) ((((U64)a) << 32) | ((U64)b)); -#define AlignPow2(x,b) (((x) + (b) - 1)&(~((b) - 1))) -#define AlignDownPow2(x,b) ((x)&(~((b) - 1))) -#define AlignPadPow2(x,b) ((0-(x)) & ((b) - 1)) -#define IsPow2(x) ((x)!=0 && ((x)&((x)-1))==0) -#define IsPow2OrZero(x) ((((x) - 1)&(x)) == 0) - -#define ExtractBit(word, idx) (((word) >> (idx)) & 1) - -#if LANG_CPP -# define zero_struct {} -#else -# define zero_struct {0} -#endif - -#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015 -# define this_function_name "unknown" -#else -# define this_function_name __func__ -#endif - -//////////////////////////////// -//~ rjf: Base Types - -typedef uint8_t U8; -typedef uint16_t U16; -typedef uint32_t U32; -typedef uint64_t U64; -typedef int8_t S8; -typedef int16_t S16; -typedef int32_t S32; -typedef int64_t S64; -typedef S8 B8; -typedef S16 B16; -typedef S32 B32; -typedef S64 B64; -typedef float F32; -typedef double F64; -typedef void VoidProc(void); -typedef struct U128 U128; -struct U128 -{ - U64 u64[2]; -}; - -//////////////////////////////// -//~ rjf: Basic Types & Spaces - -typedef enum Dimension -{ - Dimension_X, - Dimension_Y, - Dimension_Z, - Dimension_W, -} -Dimension; - -typedef enum Side -{ - Side_Invalid = -1, - Side_Min, - Side_Max, - Side_COUNT, -} -Side; -#define side_flip(s) ((Side)(!(s))) - -typedef enum Axis2 -{ - Axis2_Invalid = -1, - Axis2_X, - Axis2_Y, - Axis2_COUNT, -} -Axis2; -#define axis2_flip(a) ((Axis2)(!(a))) - -typedef enum Corner -{ - Corner_Invalid = -1, - Corner_00, - Corner_01, - Corner_10, - Corner_11, - Corner_COUNT -} -Corner; - -typedef enum Dir2 -{ - Dir2_Invalid = -1, - Dir2_Left, - Dir2_Up, - Dir2_Right, - Dir2_Down, - Dir2_COUNT -} -Dir2; -#define axis2_from_dir2(d) (((d) & 1) ? Axis2_Y : Axis2_X) -#define side_from_dir2(d) (((d) < Dir2_Right) ? Side_Min : Side_Max) - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enums - -typedef enum OperatingSystem -{ - OperatingSystem_Null, - OperatingSystem_Windows, - OperatingSystem_Linux, - OperatingSystem_Mac, - OperatingSystem_COUNT, -} -OperatingSystem; - -typedef enum ImageType -{ - Image_Null, - Image_CoffPe, - Image_Elf32, - Image_Elf64, - Image_Macho -} ImageType; - -typedef enum Arch -{ - Arch_Null, - Arch_x64, - Arch_x86, - Arch_arm64, - Arch_arm32, - Arch_COUNT, -} -Arch; - -typedef enum Compiler -{ - Compiler_Null, - Compiler_msvc, - Compiler_gcc, - Compiler_clang, - Compiler_COUNT, -} -Compiler; - -//////////////////////////////// -//~ rjf: Text 2D Coordinates & Ranges - -typedef struct TxtPt TxtPt; -struct TxtPt -{ - S64 line; - S64 column; -}; - -typedef struct TxtRng TxtRng; -struct TxtRng -{ - TxtPt min; - TxtPt max; -}; - -//////////////////////////////// -//~ Globally Unique Ids - -typedef union Guid Guid; -union Guid -{ - struct - { - U32 data1; - U16 data2; - U16 data3; - U8 data4[8]; - }; - U8 v[16]; -}; -StaticAssert(sizeof(Guid) == 16, g_guid_size_check); - -//////////////////////////////// -//~ Arrays - -typedef struct U16Array U16Array; -struct U16Array -{ - U64 count; - U16 *v; -}; -typedef struct U32Array U32Array; -struct U32Array -{ - U64 count; - U32 *v; -}; -typedef struct U64Array U64Array; -struct U64Array -{ - U64 count; - U64 *v; -}; -typedef struct U128Array U128Array; -struct U128Array -{ - U64 count; - U128 *v; -}; - -//////////////////////////////// -//~ NOTE(allen): Constants - -global U32 sign32 = 0x80000000; -global U32 exponent32 = 0x7F800000; -global U32 mantissa32 = 0x007FFFFF; - -global F32 big_golden32 = 1.61803398875f; -global F32 small_golden32 = 0.61803398875f; - -global F32 pi32 = 3.1415926535897f; - -global F64 machine_epsilon64 = 4.94065645841247e-324; - -global U64 max_U64 = 0xffffffffffffffffull; -global U32 max_U32 = 0xffffffff; -global U16 max_U16 = 0xffff; -global U8 max_U8 = 0xff; - -global S64 max_S64 = (S64)0x7fffffffffffffffull; -global S32 max_S32 = (S32)0x7fffffff; -global S16 max_S16 = (S16)0x7fff; -global S8 max_S8 = (S8)0x7f; - -global S64 min_S64 = (S64)0xffffffffffffffffull; -global S32 min_S32 = (S32)0xffffffff; -global S16 min_S16 = (S16)0xffff; -global S8 min_S8 = (S8)0xff; - -global const U32 bitmask1 = 0x00000001; -global const U32 bitmask2 = 0x00000003; -global const U32 bitmask3 = 0x00000007; -global const U32 bitmask4 = 0x0000000f; -global const U32 bitmask5 = 0x0000001f; -global const U32 bitmask6 = 0x0000003f; -global const U32 bitmask7 = 0x0000007f; -global const U32 bitmask8 = 0x000000ff; -global const U32 bitmask9 = 0x000001ff; -global const U32 bitmask10 = 0x000003ff; -global const U32 bitmask11 = 0x000007ff; -global const U32 bitmask12 = 0x00000fff; -global const U32 bitmask13 = 0x00001fff; -global const U32 bitmask14 = 0x00003fff; -global const U32 bitmask15 = 0x00007fff; -global const U32 bitmask16 = 0x0000ffff; -global const U32 bitmask17 = 0x0001ffff; -global const U32 bitmask18 = 0x0003ffff; -global const U32 bitmask19 = 0x0007ffff; -global const U32 bitmask20 = 0x000fffff; -global const U32 bitmask21 = 0x001fffff; -global const U32 bitmask22 = 0x003fffff; -global const U32 bitmask23 = 0x007fffff; -global const U32 bitmask24 = 0x00ffffff; -global const U32 bitmask25 = 0x01ffffff; -global const U32 bitmask26 = 0x03ffffff; -global const U32 bitmask27 = 0x07ffffff; -global const U32 bitmask28 = 0x0fffffff; -global const U32 bitmask29 = 0x1fffffff; -global const U32 bitmask30 = 0x3fffffff; -global const U32 bitmask31 = 0x7fffffff; -global const U32 bitmask32 = 0xffffffff; - -global const U64 bitmask33 = 0x00000001ffffffffull; -global const U64 bitmask34 = 0x00000003ffffffffull; -global const U64 bitmask35 = 0x00000007ffffffffull; -global const U64 bitmask36 = 0x0000000fffffffffull; -global const U64 bitmask37 = 0x0000001fffffffffull; -global const U64 bitmask38 = 0x0000003fffffffffull; -global const U64 bitmask39 = 0x0000007fffffffffull; -global const U64 bitmask40 = 0x000000ffffffffffull; -global const U64 bitmask41 = 0x000001ffffffffffull; -global const U64 bitmask42 = 0x000003ffffffffffull; -global const U64 bitmask43 = 0x000007ffffffffffull; -global const U64 bitmask44 = 0x00000fffffffffffull; -global const U64 bitmask45 = 0x00001fffffffffffull; -global const U64 bitmask46 = 0x00003fffffffffffull; -global const U64 bitmask47 = 0x00007fffffffffffull; -global const U64 bitmask48 = 0x0000ffffffffffffull; -global const U64 bitmask49 = 0x0001ffffffffffffull; -global const U64 bitmask50 = 0x0003ffffffffffffull; -global const U64 bitmask51 = 0x0007ffffffffffffull; -global const U64 bitmask52 = 0x000fffffffffffffull; -global const U64 bitmask53 = 0x001fffffffffffffull; -global const U64 bitmask54 = 0x003fffffffffffffull; -global const U64 bitmask55 = 0x007fffffffffffffull; -global const U64 bitmask56 = 0x00ffffffffffffffull; -global const U64 bitmask57 = 0x01ffffffffffffffull; -global const U64 bitmask58 = 0x03ffffffffffffffull; -global const U64 bitmask59 = 0x07ffffffffffffffull; -global const U64 bitmask60 = 0x0fffffffffffffffull; -global const U64 bitmask61 = 0x1fffffffffffffffull; -global const U64 bitmask62 = 0x3fffffffffffffffull; -global const U64 bitmask63 = 0x7fffffffffffffffull; -global const U64 bitmask64 = 0xffffffffffffffffull; - -global const U32 bit1 = (1<<0); -global const U32 bit2 = (1<<1); -global const U32 bit3 = (1<<2); -global const U32 bit4 = (1<<3); -global const U32 bit5 = (1<<4); -global const U32 bit6 = (1<<5); -global const U32 bit7 = (1<<6); -global const U32 bit8 = (1<<7); -global const U32 bit9 = (1<<8); -global const U32 bit10 = (1<<9); -global const U32 bit11 = (1<<10); -global const U32 bit12 = (1<<11); -global const U32 bit13 = (1<<12); -global const U32 bit14 = (1<<13); -global const U32 bit15 = (1<<14); -global const U32 bit16 = (1<<15); -global const U32 bit17 = (1<<16); -global const U32 bit18 = (1<<17); -global const U32 bit19 = (1<<18); -global const U32 bit20 = (1<<19); -global const U32 bit21 = (1<<20); -global const U32 bit22 = (1<<21); -global const U32 bit23 = (1<<22); -global const U32 bit24 = (1<<23); -global const U32 bit25 = (1<<24); -global const U32 bit26 = (1<<25); -global const U32 bit27 = (1<<26); -global const U32 bit28 = (1<<27); -global const U32 bit29 = (1<<28); -global const U32 bit30 = (1<<29); -global const U32 bit31 = (1<<30); -global const U32 bit32 = (1<<31); - -global const U64 bit33 = (1ull<<32); -global const U64 bit34 = (1ull<<33); -global const U64 bit35 = (1ull<<34); -global const U64 bit36 = (1ull<<35); -global const U64 bit37 = (1ull<<36); -global const U64 bit38 = (1ull<<37); -global const U64 bit39 = (1ull<<38); -global const U64 bit40 = (1ull<<39); -global const U64 bit41 = (1ull<<40); -global const U64 bit42 = (1ull<<41); -global const U64 bit43 = (1ull<<42); -global const U64 bit44 = (1ull<<43); -global const U64 bit45 = (1ull<<44); -global const U64 bit46 = (1ull<<45); -global const U64 bit47 = (1ull<<46); -global const U64 bit48 = (1ull<<47); -global const U64 bit49 = (1ull<<48); -global const U64 bit50 = (1ull<<49); -global const U64 bit51 = (1ull<<50); -global const U64 bit52 = (1ull<<51); -global const U64 bit53 = (1ull<<52); -global const U64 bit54 = (1ull<<53); -global const U64 bit55 = (1ull<<54); -global const U64 bit56 = (1ull<<55); -global const U64 bit57 = (1ull<<56); -global const U64 bit58 = (1ull<<57); -global const U64 bit59 = (1ull<<58); -global const U64 bit60 = (1ull<<59); -global const U64 bit61 = (1ull<<60); -global const U64 bit62 = (1ull<<61); -global const U64 bit63 = (1ull<<62); -global const U64 bit64 = (1ull<<63); - -//////////////////////////////// -//~ allen: Time - -typedef enum WeekDay -{ - WeekDay_Sun, - WeekDay_Mon, - WeekDay_Tue, - WeekDay_Wed, - WeekDay_Thu, - WeekDay_Fri, - WeekDay_Sat, - WeekDay_COUNT, -} -WeekDay; - -typedef enum Month -{ - Month_Jan, - Month_Feb, - Month_Mar, - Month_Apr, - Month_May, - Month_Jun, - Month_Jul, - Month_Aug, - Month_Sep, - Month_Oct, - Month_Nov, - Month_Dec, - Month_COUNT, -} -Month; - -typedef struct DateTime DateTime; -struct DateTime -{ - U16 micro_sec; // [0,999] - U16 msec; // [0,999] - U16 sec; // [0,60] - U16 min; // [0,59] - U16 hour; // [0,24] - U16 day; // [0,30] - union - { - WeekDay week_day; - U32 wday; - }; - union - { - Month month; - U32 mon; - }; - U32 year; // 1 = 1 CE, 0 = 1 BC -}; - -typedef U64 DenseTime; - -//////////////////////////////// -//~ allen: Files - -typedef U32 FilePropertyFlags; -enum -{ - FilePropertyFlag_IsFolder = (1 << 0), -}; - -typedef struct FileProperties FileProperties; -struct FileProperties -{ - U64 size; - DenseTime modified; - DenseTime created; - FilePropertyFlags flags; -}; - -//////////////////////////////// -//~ rjf: Safe Casts - -internal U16 safe_cast_u16(U32 x); -internal U32 safe_cast_u32(U64 x); -internal S32 safe_cast_s32(S64 x); - -//////////////////////////////// -//~ rjf: Large Base Type Functions - -internal U128 u128_zero(void); -internal U128 u128_make(U64 v0, U64 v1); -internal B32 u128_match(U128 a, U128 b); - -//////////////////////////////// -//~ rjf: Bit Patterns - -internal U32 u32_from_u64_saturate(U64 x); -internal U64 u64_up_to_pow2(U64 x); -internal S32 extend_sign32(U32 x, U32 size); -internal S64 extend_sign64(U64 x, U64 size); - -internal F32 inf32(void); -internal F32 neg_inf32(void); - -internal U16 bswap_u16(U16 x); -internal U32 bswap_u32(U32 x); -internal U64 bswap_u64(U64 x); - -#if ARCH_LITTLE_ENDIAN -# define from_be_u16(x) bswap_u16(x) -# define from_be_u32(x) bswap_u32(x) -# define from_be_u64(x) bswap_u64(x) -#else -# define from_be_u16(x) (x) -# define from_be_u32(x) (x) -# define from_be_u64(x) (x) -#endif - -internal U64 count_bits_set32(U32 val); -internal U64 count_bits_set64(U64 val); - -internal U64 ctz32(U32 val); -internal U64 ctz64(U64 val); -internal U64 clz32(U32 val); -internal U64 clz64(U64 val); - -//////////////////////////////// -//~ rjf: Enum -> Sign - -internal S32 sign_from_side_S32(Side side); -internal F32 sign_from_side_F32(Side side); - -//////////////////////////////// -//~ rjf: Memory Functions - -internal B32 memory_is_zero(void *ptr, U64 size); - -internal void memory_write16(void *ptr, U16 v); -internal void memory_write32(void *ptr, U32 v); - -internal U8 memory_read8(void *ptr); -internal U16 memory_read16(void *ptr); -internal U32 memory_read32(void *ptr); -internal U64 memory_read64(void *ptr); - -//////////////////////////////// -//~ rjf: Text 2D Coordinate/Range Functions - -internal TxtPt txt_pt(S64 line, S64 column); -internal B32 txt_pt_match(TxtPt a, TxtPt b); -internal B32 txt_pt_less_than(TxtPt a, TxtPt b); -internal TxtPt txt_pt_min(TxtPt a, TxtPt b); -internal TxtPt txt_pt_max(TxtPt a, TxtPt b); -internal TxtRng txt_rng(TxtPt min, TxtPt max); -internal TxtRng txt_rng_intersect(TxtRng a, TxtRng b); -internal TxtRng txt_rng_union(TxtRng a, TxtRng b); -internal B32 txt_rng_contains(TxtRng r, TxtPt pt); - -//////////////////////////////// -//~ rjf: Toolchain/Environment Enum Functions - -internal U64 bit_size_from_arch(Arch arch); -internal U64 max_instruction_size_from_arch(Arch arch); - -internal OperatingSystem operating_system_from_context(void); -internal Arch arch_from_context(void); -internal Compiler compiler_from_context(void); - -//////////////////////////////// -//~ rjf: Time Functions - -internal DenseTime dense_time_from_date_time(DateTime date_time); -internal DateTime date_time_from_dense_time(DenseTime time); -internal DateTime date_time_from_micro_seconds(U64 time); -internal DateTime date_time_from_unix_time(U64 unix_time); - -//////////////////////////////// -//~ rjf: Non-Fancy Ring Buffer Reads/Writes - -internal U64 ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size); -internal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size); -#define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) -#define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) - -//////////////////////////////// -//~ rjf: Sorts - -#define quick_sort(ptr, count, element_size, cmp_function) qsort((ptr), (count), (element_size), (int (*)(const void *, const void *))(cmp_function)) - -#endif // BASE_CORE_H diff --git a/src/metagen/metagen_base/metagen_base_entry_point.c b/src/metagen/metagen_base/metagen_base_entry_point.c deleted file mode 100644 index 21bbc363..00000000 --- a/src/metagen/metagen_base/metagen_base_entry_point.c +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -global U64 global_update_tick_idx = 0; - -internal void -main_thread_base_entry_point(int arguments_count, char **arguments) -{ - Temp scratch = scratch_begin(0, 0); - ThreadNameF("[main thread]"); - - //- rjf: set up telemetry -#if PROFILE_TELEMETRY - local_persist char tm_data[MB(64)]; - tmLoadLibrary(TM_RELEASE); - tmSetMaxThreadCount(256); - tmInitialize(sizeof(tm_data), tm_data); -#endif - - //- rjf: parse command line - String8List command_line_argument_strings = os_string_list_from_argcv(scratch.arena, arguments_count, arguments); - CmdLine cmdline = cmd_line_from_string_list(scratch.arena, command_line_argument_strings); - - //- rjf: begin captures - B32 capture = cmd_line_has_flag(&cmdline, str8_lit("capture")); - if(capture) - { - ProfBeginCapture(arguments[0]); - } - -#if PROFILE_TELEMETRY - tmMessage(0, TMMF_ICON_NOTE, BUILD_TITLE); -#endif - - //- rjf: initialize all included layers -#if defined(ASYNC_H) && !defined(ASYNC_INIT_MANUAL) - async_init(&cmdline); -#endif -#if defined(RDI_FROM_PDB_H) && !defined(P2R_INIT_MANUAL) - p2r_init(); -#endif -#if defined(HASH_STORE_H) && !defined(HS_INIT_MANUAL) - hs_init(); -#endif -#if defined(FILE_STREAM_H) && !defined(FS_INIT_MANUAL) - fs_init(); -#endif -#if defined(TEXT_CACHE_H) && !defined(TXT_INIT_MANUAL) - txt_init(); -#endif -#if defined(MUTABLE_TEXT_H) && !defined(MTX_INIT_MANUAL) - mtx_init(); -#endif -#if defined(DASM_CACHE_H) && !defined(DASM_INIT_MANUAL) - dasm_init(); -#endif -#if defined(DBGI_H) && !defined(DI_INIT_MANUAL) - di_init(); -#endif -#if defined(DEMON_CORE_H) && !defined(DMN_INIT_MANUAL) - dmn_init(); -#endif -#if defined(CTRL_CORE_H) && !defined(CTRL_INIT_MANUAL) - ctrl_init(); -#endif -#if defined(OS_GFX_H) && !defined(OS_GFX_INIT_MANUAL) - os_gfx_init(); -#endif -#if defined(FONT_PROVIDER_H) && !defined(FP_INIT_MANUAL) - fp_init(); -#endif -#if defined(RENDER_CORE_H) && !defined(R_INIT_MANUAL) - r_init(&cmdline); -#endif -#if defined(TEXTURE_CACHE_H) && !defined(TEX_INIT_MANUAL) - tex_init(); -#endif -#if defined(GEO_CACHE_H) && !defined(GEO_INIT_MANUAL) - geo_init(); -#endif -#if defined(FONT_CACHE_H) && !defined(FNT_INIT_MANUAL) - fnt_init(); -#endif -#if defined(DBG_ENGINE_CORE_H) && !defined(D_INIT_MANUAL) - d_init(); -#endif -#if defined(RADDBG_CORE_H) && !defined(RD_INIT_MANUAL) - rd_init(&cmdline); -#endif - - //- rjf: call into entry point - entry_point(&cmdline); - - //- rjf: end captures - if(capture) - { - ProfEndCapture(); - } - - scratch_end(scratch); -} - -internal void -supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params) -{ - TCTX tctx; - tctx_init_and_equip(&tctx); - entry_point(params); - tctx_release(); -} - -internal U64 -update_tick_idx(void) -{ - U64 result = ins_atomic_u64_eval(&global_update_tick_idx); - return result; -} - -internal B32 -update(void) -{ - ProfTick(0); - ins_atomic_u64_inc_eval(&global_update_tick_idx); -#if OS_FEATURE_GRAPHICAL - B32 result = frame(); -#else - B32 result = 0; -#endif - return result; -} diff --git a/src/metagen/metagen_base/metagen_base_entry_point.h b/src/metagen/metagen_base/metagen_base_entry_point.h deleted file mode 100644 index 318f8d9f..00000000 --- a/src/metagen/metagen_base/metagen_base_entry_point.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_ENTRY_POINT_H -#define BASE_ENTRY_POINT_H - -internal void main_thread_base_entry_point(int argc, char **argv); -internal void supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params); -internal U64 update_tick_idx(void); -internal B32 update(void); - -#endif // BASE_ENTRY_POINT_H diff --git a/src/metagen/metagen_base/metagen_base_inc.c b/src/metagen/metagen_base/metagen_base_inc.c deleted file mode 100644 index 57aa2113..00000000 --- a/src/metagen/metagen_base/metagen_base_inc.c +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Base Includes - -#undef MARKUP_LAYER_COLOR -#define MARKUP_LAYER_COLOR 0.20f, 0.60f, 0.80f - -#include "metagen_base_core.c" -#include "metagen_base_profile.c" -#include "metagen_base_arena.c" -#include "metagen_base_math.c" -#include "metagen_base_strings.c" -#include "metagen_base_thread_context.c" -#include "metagen_base_command_line.c" -#include "metagen_base_markup.c" -#include "metagen_base_meta.c" -#include "metagen_base_log.c" -#include "metagen_base_entry_point.c" diff --git a/src/metagen/metagen_base/metagen_base_inc.h b/src/metagen/metagen_base/metagen_base_inc.h deleted file mode 100644 index 55e2ebe7..00000000 --- a/src/metagen/metagen_base/metagen_base_inc.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_INC_H -#define BASE_INC_H - -//////////////////////////////// -//~ rjf: Base Includes - -#include "metagen_base_context_cracking.h" - -#include "metagen_base_core.h" -#include "metagen_base_profile.h" -#include "metagen_base_arena.h" -#include "metagen_base_math.h" -#include "metagen_base_strings.h" -#include "metagen_base_thread_context.h" -#include "metagen_base_command_line.h" -#include "metagen_base_markup.h" -#include "metagen_base_meta.h" -#include "metagen_base_log.h" -#include "metagen_base_entry_point.h" - -#endif // BASE_INC_H diff --git a/src/metagen/metagen_base/metagen_base_log.c b/src/metagen/metagen_base/metagen_base_log.c deleted file mode 100644 index 1c2a05f8..00000000 --- a/src/metagen/metagen_base/metagen_base_log.c +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Globals/Thread-Locals - -C_LINKAGE thread_static Log *log_active; -#if !BUILD_SUPPLEMENTARY_UNIT -C_LINKAGE thread_static Log *log_active = 0; -#endif - -//////////////////////////////// -//~ rjf: Log Creation/Selection - -internal Log * -log_alloc(void) -{ - Arena *arena = arena_alloc(); - Log *log = push_array(arena, Log, 1); - log->arena = arena; - return log; -} - -internal void -log_release(Log *log) -{ - arena_release(log->arena); -} - -internal void -log_select(Log *log) -{ - log_active = log; -} - -//////////////////////////////// -//~ rjf: Log Building/Clearing - -internal void -log_msg(LogMsgKind kind, String8 string) -{ - if(log_active != 0 && log_active->top_scope != 0) - { - String8 string_copy = push_str8_copy(log_active->arena, string); - str8_list_push(log_active->arena, &log_active->top_scope->strings[kind], string_copy); - } -} - -internal void -log_msgf(LogMsgKind kind, char *fmt, ...) -{ - if(log_active != 0) - { - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - log_msg(kind, string); - va_end(args); - scratch_end(scratch); - } -} - -//////////////////////////////// -//~ rjf: Log Scopes - -internal void -log_scope_begin(void) -{ - if(log_active != 0) - { - U64 pos = arena_pos(log_active->arena); - LogScope *scope = push_array(log_active->arena, LogScope, 1); - scope->pos = pos; - SLLStackPush(log_active->top_scope, scope); - } -} - -internal LogScopeResult -log_scope_end(Arena *arena) -{ - LogScopeResult result = {0}; - if(log_active != 0) - { - LogScope *scope = log_active->top_scope; - if(scope != 0) - { - SLLStackPop(log_active->top_scope); - if(arena != 0) - { - for EachEnumVal(LogMsgKind, kind) - { - Temp scratch = scratch_begin(&arena, 1); - String8 result_unindented = str8_list_join(scratch.arena, &scope->strings[kind], 0); - result.strings[kind] = indented_from_string(arena, result_unindented); - scratch_end(scratch); - } - } - arena_pop_to(log_active->arena, scope->pos); - } - } - return result; -} diff --git a/src/metagen/metagen_base/metagen_base_log.h b/src/metagen/metagen_base/metagen_base_log.h deleted file mode 100644 index 3687390e..00000000 --- a/src/metagen/metagen_base/metagen_base_log.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_LOG_H -#define BASE_LOG_H - -//////////////////////////////// -//~ rjf: Log Types - -typedef enum LogMsgKind -{ - LogMsgKind_Info, - LogMsgKind_UserError, - LogMsgKind_COUNT -} -LogMsgKind; - -typedef struct LogScope LogScope; -struct LogScope -{ - LogScope *next; - U64 pos; - String8List strings[LogMsgKind_COUNT]; -}; - -typedef struct LogScopeResult LogScopeResult; -struct LogScopeResult -{ - String8 strings[LogMsgKind_COUNT]; -}; - -typedef struct Log Log; -struct Log -{ - Arena *arena; - LogScope *top_scope; -}; - -//////////////////////////////// -//~ rjf: Log Creation/Selection - -internal Log *log_alloc(void); -internal void log_release(Log *log); -internal void log_select(Log *log); - -//////////////////////////////// -//~ rjf: Log Building - -internal void log_msg(LogMsgKind kind, String8 string); -internal void log_msgf(LogMsgKind kind, char *fmt, ...); -#define log_info(s) log_msg(LogMsgKind_Info, (s)) -#define log_infof(fmt, ...) log_msgf(LogMsgKind_Info, (fmt), __VA_ARGS__) -#define log_user_error(s) log_msg(LogMsgKind_UserError, (s)) -#define log_user_errorf(fmt, ...) log_msgf(LogMsgKind_UserError, (fmt), __VA_ARGS__) - -#define LogInfoNamedBlock(s) DeferLoop(log_infof("%S:\n{\n", (s)), log_infof("}\n")) -#define LogInfoNamedBlockF(fmt, ...) DeferLoop((log_infof(fmt, __VA_ARGS__), log_infof(":\n{\n")), log_infof("}\n")) - -//////////////////////////////// -//~ rjf: Log Scopes - -internal void log_scope_begin(void); -internal LogScopeResult log_scope_end(Arena *arena); - -#endif // BASE_LOG_H diff --git a/src/metagen/metagen_base/metagen_base_markup.c b/src/metagen/metagen_base/metagen_base_markup.c deleted file mode 100644 index 5ad47ef5..00000000 --- a/src/metagen/metagen_base/metagen_base_markup.c +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal void -set_thread_name(String8 string) -{ - ProfThreadName("%.*s", str8_varg(string)); - os_set_thread_name(string); -} - -internal void -set_thread_namef(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - set_thread_name(string); - va_end(args); - scratch_end(scratch); -} diff --git a/src/metagen/metagen_base/metagen_base_markup.h b/src/metagen/metagen_base/metagen_base_markup.h deleted file mode 100644 index fd291375..00000000 --- a/src/metagen/metagen_base/metagen_base_markup.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_MARKUP_H -#define BASE_MARKUP_H - -internal void set_thread_name(String8 string); -internal void set_thread_namef(char *fmt, ...); -#define ThreadNameF(...) (set_thread_namef(__VA_ARGS__)) -#define ThreadName(str) (set_thread_name(str)) - -#endif // BASE_MARKUP_H diff --git a/src/metagen/metagen_base/metagen_base_math.c b/src/metagen/metagen_base/metagen_base_math.c deleted file mode 100644 index 2c6201f3..00000000 --- a/src/metagen/metagen_base/metagen_base_math.c +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Scalar Ops - -internal F32 -mix_1f32(F32 a, F32 b, F32 t) -{ - F32 c = (a + (b-a) * Clamp(0.f, t, 1.f)); - return c; -} - -internal F64 -mix_1f64(F64 a, F64 b, F64 t) -{ - F64 c = (a + (b-a) * Clamp(0.0, t, 1.0)); - return c; -} - -//////////////////////////////// -//~ rjf: Vector Ops - -internal Vec2F32 vec_2f32(F32 x, F32 y) {Vec2F32 v = {x, y}; return v;} -internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b) {Vec2F32 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2F32 scale_2f32(Vec2F32 v, F32 s) {Vec2F32 c = {v.x*s, v.y*s}; return c;} -internal F32 dot_2f32(Vec2F32 a, Vec2F32 b) {F32 c = a.x*b.x + a.y*b.y; return c;} -internal F32 length_squared_2f32(Vec2F32 v) {F32 c = v.x*v.x + v.y*v.y; return c;} -internal F32 length_2f32(Vec2F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y); return c;} -internal Vec2F32 normalize_2f32(Vec2F32 v) {v = scale_2f32(v, 1.f/length_2f32(v)); return v;} -internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t) {Vec2F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t)}; return c;} - -internal Vec2S64 vec_2s64(S64 x, S64 y) {Vec2S64 v = {x, y}; return v;} -internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b) {Vec2S64 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2S64 scale_2s64(Vec2S64 v, S64 s) {Vec2S64 c = {v.x*s, v.y*s}; return c;} -internal S64 dot_2s64(Vec2S64 a, Vec2S64 b) {S64 c = a.x*b.x + a.y*b.y; return c;} -internal S64 length_squared_2s64(Vec2S64 v) {S64 c = v.x*v.x + v.y*v.y; return c;} -internal S64 length_2s64(Vec2S64 v) {S64 c = (S64)sqrt_f64((F64)(v.x*v.x + v.y*v.y)); return c;} -internal Vec2S64 normalize_2s64(Vec2S64 v) {v = scale_2s64(v, (S64)(1.f/length_2s64(v))); return v;} -internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t) {Vec2S64 c = {(S64)mix_1f32((F32)a.x, (F32)b.x, t), (S64)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec2S32 vec_2s32(S32 x, S32 y) {Vec2S32 v = {x, y}; return v;} -internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x+b.x, a.y+b.y}; return c;} -internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x-b.x, a.y-b.y}; return c;} -internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x*b.x, a.y*b.y}; return c;} -internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b) {Vec2S32 c = {a.x/b.x, a.y/b.y}; return c;} -internal Vec2S32 scale_2s32(Vec2S32 v, S32 s) {Vec2S32 c = {v.x*s, v.y*s}; return c;} -internal S32 dot_2s32(Vec2S32 a, Vec2S32 b) {S32 c = a.x*b.x + a.y*b.y; return c;} -internal S32 length_squared_2s32(Vec2S32 v) {S32 c = v.x*v.x + v.y*v.y; return c;} -internal S32 length_2s32(Vec2S32 v) {S32 c = (S32)sqrt_f32((F32)v.x*(F32)v.x + (F32)v.y*(F32)v.y); return c;} -internal Vec2S32 normalize_2s32(Vec2S32 v) {v = scale_2s32(v, (S32)(1.f/length_2s32(v))); return v;} -internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t) {Vec2S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec2S16 vec_2s16(S16 x, S16 y) {Vec2S16 v = {x, y}; return v;} -internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x+b.x), (S16)(a.y+b.y)}; return c;} -internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x-b.x), (S16)(a.y-b.y)}; return c;} -internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x*b.x), (S16)(a.y*b.y)}; return c;} -internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b) {Vec2S16 c = {(S16)(a.x/b.x), (S16)(a.y/b.y)}; return c;} -internal Vec2S16 scale_2s16(Vec2S16 v, S16 s) {Vec2S16 c = {(S16)(v.x*s), (S16)(v.y*s)}; return c;} -internal S16 dot_2s16(Vec2S16 a, Vec2S16 b) {S16 c = a.x*b.x + a.y*b.y; return c;} -internal S16 length_squared_2s16(Vec2S16 v) {S16 c = v.x*v.x + v.y*v.y; return c;} -internal S16 length_2s16(Vec2S16 v) {S16 c = (S16)sqrt_f32((F32)(v.x*v.x + v.y*v.y)); return c;} -internal Vec2S16 normalize_2s16(Vec2S16 v) {v = scale_2s16(v, (S16)(1.f/length_2s16(v))); return v;} -internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t) {Vec2S16 c = {(S16)mix_1f32((F32)a.x, (F32)b.x, t), (S16)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;} - -internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z) {Vec3F32 v = {x, y, z}; return v;} -internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} -internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} -internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} -internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} -internal Vec3F32 scale_3f32(Vec3F32 v, F32 s) {Vec3F32 c = {v.x*s, v.y*s, v.z*s}; return c;} -internal F32 dot_3f32(Vec3F32 a, Vec3F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} -internal F32 length_squared_3f32(Vec3F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} -internal F32 length_3f32(Vec3F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z); return c;} -internal Vec3F32 normalize_3f32(Vec3F32 v) {v = scale_3f32(v, 1.f/length_3f32(v)); return v;} -internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t) {Vec3F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t)}; return c;} -internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b) {Vec3F32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} - -internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z) {Vec3S32 v = {x, y, z}; return v;} -internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;} -internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;} -internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;} -internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;} -internal Vec3S32 scale_3s32(Vec3S32 v, S32 s) {Vec3S32 c = {v.x*s, v.y*s, v.z*s}; return c;} -internal S32 dot_3s32(Vec3S32 a, Vec3S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;} -internal S32 length_squared_3s32(Vec3S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;} -internal S32 length_3s32(Vec3S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z)); return c;} -internal Vec3S32 normalize_3s32(Vec3S32 v) {v = scale_3s32(v, (S32)(1.f/length_3s32(v))); return v;} -internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t) {Vec3S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t)}; return c;} -internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b) {Vec3S32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;} - -internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w) {Vec4F32 v = {x, y, z, w}; return v;} -internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} -internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} -internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} -internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b) {Vec4F32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} -internal Vec4F32 scale_4f32(Vec4F32 v, F32 s) {Vec4F32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} -internal F32 dot_4f32(Vec4F32 a, Vec4F32 b) {F32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} -internal F32 length_squared_4f32(Vec4F32 v) {F32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} -internal F32 length_4f32(Vec4F32 v) {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w); return c;} -internal Vec4F32 normalize_4f32(Vec4F32 v) {v = scale_4f32(v, 1.f/length_4f32(v)); return v;} -internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t) {Vec4F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t), mix_1f32(a.w, b.w, t)}; return c;} - -internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w) {Vec4S32 v = {x, y, z, w}; return v;} -internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;} -internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;} -internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;} -internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b) {Vec4S32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;} -internal Vec4S32 scale_4s32(Vec4S32 v, S32 s) {Vec4S32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;} -internal S32 dot_4s32(Vec4S32 a, Vec4S32 b) {S32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;} -internal S32 length_squared_4s32(Vec4S32 v) {S32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;} -internal S32 length_4s32(Vec4S32 v) {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w)); return c;} -internal Vec4S32 normalize_4s32(Vec4S32 v) {v = scale_4s32(v, (S32)(1.f/length_4s32(v))); return v;} -internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t) {Vec4S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t), (S32)mix_1f32((F32)a.w, (F32)b.w, t)}; return c;} - -//////////////////////////////// -//~ rjf: Matrix Ops - -internal Mat3x3F32 -mat_3x3f32(F32 diagonal) -{ - Mat3x3F32 result = {0}; - result.v[0][0] = diagonal; - result.v[1][1] = diagonal; - result.v[2][2] = diagonal; - return result; -} - -internal Mat3x3F32 -make_translate_3x3f32(Vec2F32 delta) -{ - Mat3x3F32 mat = mat_3x3f32(1.f); - mat.v[2][0] = delta.x; - mat.v[2][1] = delta.y; - return mat; -} - -internal Mat3x3F32 -make_scale_3x3f32(Vec2F32 scale) -{ - Mat3x3F32 mat = mat_3x3f32(1.f); - mat.v[0][0] = scale.x; - mat.v[1][1] = scale.y; - return mat; -} - -internal Mat3x3F32 -mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b) -{ - Mat3x3F32 c = {0}; - for(int j = 0; j < 3; j += 1) - { - for(int i = 0; i < 3; i += 1) - { - c.v[i][j] = (a.v[0][j]*b.v[i][0] + - a.v[1][j]*b.v[i][1] + - a.v[2][j]*b.v[i][2]); - } - } - return c; -} - -internal Mat4x4F32 -mat_4x4f32(F32 diagonal) -{ - Mat4x4F32 result = {0}; - result.v[0][0] = diagonal; - result.v[1][1] = diagonal; - result.v[2][2] = diagonal; - result.v[3][3] = diagonal; - return result; -} - -internal Mat4x4F32 -make_translate_4x4f32(Vec3F32 delta) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - result.v[3][0] = delta.x; - result.v[3][1] = delta.y; - result.v[3][2] = delta.z; - return result; -} - -internal Mat4x4F32 -make_scale_4x4f32(Vec3F32 scale) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - result.v[0][0] = scale.x; - result.v[1][1] = scale.y; - result.v[2][2] = scale.z; - return result; -} - -internal Mat4x4F32 -make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - F32 tan_theta_over_2 = tan_f32(fov / 2); - result.v[0][0] = 1.f / tan_theta_over_2; - result.v[1][1] = aspect_ratio / tan_theta_over_2; - result.v[2][3] = 1.f; - result.v[2][2] = -(near_z + far_z) / (near_z - far_z); - result.v[3][2] = (2.f * near_z * far_z) / (near_z - far_z); - result.v[3][3] = 0.f; - return result; -} - -internal Mat4x4F32 -make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - - result.v[0][0] = 2.f / (right - left); - result.v[1][1] = 2.f / (top - bottom); - result.v[2][2] = 2.f / (far_z - near_z); - result.v[3][3] = 1.f; - - result.v[3][0] = (left + right) / (left - right); - result.v[3][1] = (bottom + top) / (bottom - top); - result.v[3][2] = (near_z + far_z) / (near_z - far_z); - - return result; -} - -internal Mat4x4F32 -make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up) -{ - Mat4x4F32 result; - Vec3F32 f = normalize_3f32(sub_3f32(eye, center)); - Vec3F32 s = normalize_3f32(cross_3f32(f, up)); - Vec3F32 u = cross_3f32(s, f); - result.v[0][0] = s.x; - result.v[0][1] = u.x; - result.v[0][2] = -f.x; - result.v[0][3] = 0.0f; - result.v[1][0] = s.y; - result.v[1][1] = u.y; - result.v[1][2] = -f.y; - result.v[1][3] = 0.0f; - result.v[2][0] = s.z; - result.v[2][1] = u.z; - result.v[2][2] = -f.z; - result.v[2][3] = 0.0f; - result.v[3][0] = -dot_3f32(s, eye); - result.v[3][1] = -dot_3f32(u, eye); - result.v[3][2] = dot_3f32(f, eye); - result.v[3][3] = 1.0f; - return result; -} - -internal Mat4x4F32 -make_rotate_4x4f32(Vec3F32 axis, F32 turns) -{ - Mat4x4F32 result = mat_4x4f32(1.f); - axis = normalize_3f32(axis); - F32 sin_theta = sin_f32(turns); - F32 cos_theta = cos_f32(turns); - F32 cos_value = 1.f - cos_theta; - result.v[0][0] = (axis.x * axis.x * cos_value) + cos_theta; - result.v[0][1] = (axis.x * axis.y * cos_value) + (axis.z * sin_theta); - result.v[0][2] = (axis.x * axis.z * cos_value) - (axis.y * sin_theta); - result.v[1][0] = (axis.y * axis.x * cos_value) - (axis.z * sin_theta); - result.v[1][1] = (axis.y * axis.y * cos_value) + cos_theta; - result.v[1][2] = (axis.y * axis.z * cos_value) + (axis.x * sin_theta); - result.v[2][0] = (axis.z * axis.x * cos_value) + (axis.y * sin_theta); - result.v[2][1] = (axis.z * axis.y * cos_value) - (axis.x * sin_theta); - result.v[2][2] = (axis.z * axis.z * cos_value) + cos_theta; - return result; -} - -internal Mat4x4F32 -mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b) -{ - Mat4x4F32 c = {0}; - for(int j = 0; j < 4; j += 1) - { - for(int i = 0; i < 4; i += 1) - { - c.v[i][j] = (a.v[0][j]*b.v[i][0] + - a.v[1][j]*b.v[i][1] + - a.v[2][j]*b.v[i][2] + - a.v[3][j]*b.v[i][3]); - } - } - return c; -} - -internal Mat4x4F32 -scale_4x4f32(Mat4x4F32 m, F32 scale) -{ - for(int j = 0; j < 4; j += 1) - { - for(int i = 0; i < 4; i += 1) - { - m.v[i][j] *= scale; - } - } - return m; -} - -internal Mat4x4F32 -inverse_4x4f32(Mat4x4F32 m) -{ - F32 coef00 = m.v[2][2] * m.v[3][3] - m.v[3][2] * m.v[2][3]; - F32 coef02 = m.v[1][2] * m.v[3][3] - m.v[3][2] * m.v[1][3]; - F32 coef03 = m.v[1][2] * m.v[2][3] - m.v[2][2] * m.v[1][3]; - F32 coef04 = m.v[2][1] * m.v[3][3] - m.v[3][1] * m.v[2][3]; - F32 coef06 = m.v[1][1] * m.v[3][3] - m.v[3][1] * m.v[1][3]; - F32 coef07 = m.v[1][1] * m.v[2][3] - m.v[2][1] * m.v[1][3]; - F32 coef08 = m.v[2][1] * m.v[3][2] - m.v[3][1] * m.v[2][2]; - F32 coef10 = m.v[1][1] * m.v[3][2] - m.v[3][1] * m.v[1][2]; - F32 coef11 = m.v[1][1] * m.v[2][2] - m.v[2][1] * m.v[1][2]; - F32 coef12 = m.v[2][0] * m.v[3][3] - m.v[3][0] * m.v[2][3]; - F32 coef14 = m.v[1][0] * m.v[3][3] - m.v[3][0] * m.v[1][3]; - F32 coef15 = m.v[1][0] * m.v[2][3] - m.v[2][0] * m.v[1][3]; - F32 coef16 = m.v[2][0] * m.v[3][2] - m.v[3][0] * m.v[2][2]; - F32 coef18 = m.v[1][0] * m.v[3][2] - m.v[3][0] * m.v[1][2]; - F32 coef19 = m.v[1][0] * m.v[2][2] - m.v[2][0] * m.v[1][2]; - F32 coef20 = m.v[2][0] * m.v[3][1] - m.v[3][0] * m.v[2][1]; - F32 coef22 = m.v[1][0] * m.v[3][1] - m.v[3][0] * m.v[1][1]; - F32 coef23 = m.v[1][0] * m.v[2][1] - m.v[2][0] * m.v[1][1]; - - Vec4F32 fac0 = { coef00, coef00, coef02, coef03 }; - Vec4F32 fac1 = { coef04, coef04, coef06, coef07 }; - Vec4F32 fac2 = { coef08, coef08, coef10, coef11 }; - Vec4F32 fac3 = { coef12, coef12, coef14, coef15 }; - Vec4F32 fac4 = { coef16, coef16, coef18, coef19 }; - Vec4F32 fac5 = { coef20, coef20, coef22, coef23 }; - - Vec4F32 vec0 = { m.v[1][0], m.v[0][0], m.v[0][0], m.v[0][0] }; - Vec4F32 vec1 = { m.v[1][1], m.v[0][1], m.v[0][1], m.v[0][1] }; - Vec4F32 vec2 = { m.v[1][2], m.v[0][2], m.v[0][2], m.v[0][2] }; - Vec4F32 vec3 = { m.v[1][3], m.v[0][3], m.v[0][3], m.v[0][3] }; - - Vec4F32 inv0 = add_4f32(sub_4f32(mul_4f32(vec1, fac0), mul_4f32(vec2, fac1)), mul_4f32(vec3, fac2)); - Vec4F32 inv1 = add_4f32(sub_4f32(mul_4f32(vec0, fac0), mul_4f32(vec2, fac3)), mul_4f32(vec3, fac4)); - Vec4F32 inv2 = add_4f32(sub_4f32(mul_4f32(vec0, fac1), mul_4f32(vec1, fac3)), mul_4f32(vec3, fac5)); - Vec4F32 inv3 = add_4f32(sub_4f32(mul_4f32(vec0, fac2), mul_4f32(vec1, fac4)), mul_4f32(vec2, fac5)); - - Vec4F32 sign_a = { +1, -1, +1, -1 }; - Vec4F32 sign_b = { -1, +1, -1, +1 }; - - Mat4x4F32 inverse; - for(U32 i = 0; i < 4; i += 1) - { - inverse.v[0][i] = inv0.v[i] * sign_a.v[i]; - inverse.v[1][i] = inv1.v[i] * sign_b.v[i]; - inverse.v[2][i] = inv2.v[i] * sign_a.v[i]; - inverse.v[3][i] = inv3.v[i] * sign_b.v[i]; - } - - Vec4F32 row0 = { inverse.v[0][0], inverse.v[1][0], inverse.v[2][0], inverse.v[3][0] }; - Vec4F32 m0 = { m.v[0][0], m.v[0][1], m.v[0][2], m.v[0][3] }; - Vec4F32 dot0 = mul_4f32(m0, row0); - F32 dot1 = (dot0.x + dot0.y) + (dot0.z + dot0.w); - - F32 one_over_det = 1 / dot1; - - return scale_4x4f32(inverse, one_over_det); -} - -internal Mat4x4F32 -derotate_4x4f32(Mat4x4F32 mat) -{ - Vec3F32 scale = - { - length_3f32(v3f32(mat.v[0][0], mat.v[0][1], mat.v[0][2])), - length_3f32(v3f32(mat.v[1][0], mat.v[1][1], mat.v[1][2])), - length_3f32(v3f32(mat.v[2][0], mat.v[2][1], mat.v[2][2])), - }; - mat.v[0][0] = scale.x; - mat.v[1][0] = 0.f; - mat.v[2][0] = 0.f; - mat.v[0][1] = 0.f; - mat.v[1][1] = scale.y; - mat.v[2][1] = 0.f; - mat.v[0][2] = 0.f; - mat.v[1][2] = 0.f; - mat.v[2][2] = scale.z; - return mat; -} - -//////////////////////////////// -//~ rjf: Range Ops - -internal Rng1U32 rng_1u32(U32 min, U32 max) {Rng1U32 r = {min, max}; if(r.min > r.max) { Swap(U32, r.min, r.max); } return r;} -internal Rng1U32 shift_1u32(Rng1U32 r, U32 x) {r.min += x; r.max += x; return r;} -internal Rng1U32 pad_1u32(Rng1U32 r, U32 x) {r.min -= x; r.max += x; return r;} -internal U32 center_1u32(Rng1U32 r) {U32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1u32(Rng1U32 r, U32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal U32 dim_1u32(Rng1U32 r) {U32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;} -internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b) {Rng1U32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal U32 clamp_1u32(Rng1U32 r, U32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1S32 rng_1s32(S32 min, S32 max) {Rng1S32 r = {min, max}; if(r.min > r.max) { Swap(S32, r.min, r.max); } return r;} -internal Rng1S32 shift_1s32(Rng1S32 r, S32 x) {r.min += x; r.max += x; return r;} -internal Rng1S32 pad_1s32(Rng1S32 r, S32 x) {r.min -= x; r.max += x; return r;} -internal S32 center_1s32(Rng1S32 r) {S32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1s32(Rng1S32 r, S32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal S32 dim_1s32(Rng1S32 r) {S32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;} -internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b) {Rng1S32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal S32 clamp_1s32(Rng1S32 r, S32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1U64 rng_1u64(U64 min, U64 max) {Rng1U64 r = {min, max}; if(r.min > r.max) { Swap(U64, r.min, r.max); } return r;} -internal Rng1U64 shift_1u64(Rng1U64 r, U64 x) {r.min += x; r.max += x; return r;} -internal Rng1U64 pad_1u64(Rng1U64 r, U64 x) {r.min -= x; r.max += x; return r;} -internal U64 center_1u64(Rng1U64 r) {U64 c = (r.min+r.max)/2; return c;} -internal B32 contains_1u64(Rng1U64 r, U64 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal U64 dim_1u64(Rng1U64 r) {U64 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;} -internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b) {Rng1U64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal U64 clamp_1u64(Rng1U64 r, U64 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1S64 rng_1s64(S64 min, S64 max) {Rng1S64 r = {min, max}; if(r.min > r.max) { Swap(S64, r.min, r.max); } return r;} -internal Rng1S64 shift_1s64(Rng1S64 r, S64 x) {r.min += x; r.max += x; return r;} -internal Rng1S64 pad_1s64(Rng1S64 r, S64 x) {r.min -= x; r.max += x; return r;} -internal S64 center_1s64(Rng1S64 r) {S64 c = (r.min+r.max)/2; return c;} -internal B32 contains_1s64(Rng1S64 r, S64 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal S64 dim_1s64(Rng1S64 r) {S64 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;} -internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b) {Rng1S64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal S64 clamp_1s64(Rng1S64 r, S64 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng1F32 rng_1f32(F32 min, F32 max) {Rng1F32 r = {min, max}; if(r.min > r.max) { Swap(F32, r.min, r.max); } return r;} -internal Rng1F32 shift_1f32(Rng1F32 r, F32 x) {r.min += x; r.max += x; return r;} -internal Rng1F32 pad_1f32(Rng1F32 r, F32 x) {r.min -= x; r.max += x; return r;} -internal F32 center_1f32(Rng1F32 r) {F32 c = (r.min+r.max)/2; return c;} -internal B32 contains_1f32(Rng1F32 r, F32 x) {B32 c = (r.min <= x && x < r.max); return c;} -internal F32 dim_1f32(Rng1F32 r) {F32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;} -internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;} -internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b) {Rng1F32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;} -internal F32 clamp_1f32(Rng1F32 r, F32 v) {v = Clamp(r.min, v, r.max); return v;} - -internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max) {Rng2S16 r = {min, max}; return r;} -internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x) {r.min = add_2s16(r.min, x); r.max = add_2s16(r.max, x); return r;} -internal Rng2S16 pad_2s16(Rng2S16 r, S16 x) {Vec2S16 xv = {x, x}; r.min = sub_2s16(r.min, xv); r.max = add_2s16(r.max, xv); return r;} -internal Vec2S16 center_2s16(Rng2S16 r) {Vec2S16 c = {(S16)((r.min.x+r.max.x)/2), (S16)((r.min.y+r.max.y)/2)}; return c;} -internal B32 contains_2s16(Rng2S16 r, Vec2S16 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S16 dim_2s16(Rng2S16 r) {Vec2S16 dim = {(S16)(((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0)), (S16)(((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0))}; return dim;} -internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b) {Rng2S16 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max) {Rng2S32 r = {min, max}; return r;} -internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x) {r.min = add_2s32(r.min, x); r.max = add_2s32(r.max, x); return r;} -internal Rng2S32 pad_2s32(Rng2S32 r, S32 x) {Vec2S32 xv = {x, x}; r.min = sub_2s32(r.min, xv); r.max = add_2s32(r.max, xv); return r;} -internal Vec2S32 center_2s32(Rng2S32 r) {Vec2S32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2s32(Rng2S32 r, Vec2S32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S32 dim_2s32(Rng2S32 r) {Vec2S32 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;} -internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b) {Rng2S32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max) {Rng2S64 r = {min, max}; return r;} -internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x) {r.min = add_2s64(r.min, x); r.max = add_2s64(r.max, x); return r;} -internal Rng2S64 pad_2s64(Rng2S64 r, S64 x) {Vec2S64 xv = {x, x}; r.min = sub_2s64(r.min, xv); r.max = add_2s64(r.max, xv); return r;} -internal Vec2S64 center_2s64(Rng2S64 r) {Vec2S64 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2s64(Rng2S64 r, Vec2S64 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2S64 dim_2s64(Rng2S64 r) {Vec2S64 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;} -internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b) {Rng2S64 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max) {Rng2F32 r = {min, max}; return r;} -internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x) {r.min = add_2f32(r.min, x); r.max = add_2f32(r.max, x); return r;} -internal Rng2F32 pad_2f32(Rng2F32 r, F32 x) {Vec2F32 xv = {x, x}; r.min = sub_2f32(r.min, xv); r.max = add_2f32(r.max, xv); return r;} -internal Vec2F32 center_2f32(Rng2F32 r) {Vec2F32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;} -internal B32 contains_2f32(Rng2F32 r, Vec2F32 x) {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;} -internal Vec2F32 dim_2f32(Rng2F32 r) {Vec2F32 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;} -internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;} -internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b) {Rng2F32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;} -internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v) {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;} - -//////////////////////////////// -//~ rjf: Miscellaneous Ops - -internal Vec3F32 -hsv_from_rgb(Vec3F32 rgb) -{ - F32 c_max = Max(rgb.x, Max(rgb.y, rgb.z)); - F32 c_min = Min(rgb.x, Min(rgb.y, rgb.z)); - F32 delta = c_max - c_min; - F32 h = ((delta == 0.f) ? 0.f : - (c_max == rgb.x) ? mod_f32((rgb.y - rgb.z)/delta + 6.f, 6.f) : - (c_max == rgb.y) ? (rgb.z - rgb.x)/delta + 2.f : - (c_max == rgb.z) ? (rgb.x - rgb.y)/delta + 4.f : - 0.f); - F32 s = (c_max == 0.f) ? 0.f : (delta/c_max); - F32 v = c_max; - Vec3F32 hsv = {h/6.f, s, v}; - return hsv; -} - -internal Vec3F32 -rgb_from_hsv(Vec3F32 hsv) -{ - F32 h = mod_f32(hsv.x * 360.f, 360.f); - F32 s = hsv.y; - F32 v = hsv.z; - - F32 c = v*s; - F32 x = c*(1.f - abs_f32(mod_f32(h/60.f, 2.f) - 1.f)); - F32 m = v - c; - - F32 r = 0; - F32 g = 0; - F32 b = 0; - - if ((h >= 0.f && h < 60.f) || (h >= 360.f && h < 420.f)){ - r = c; - g = x; - b = 0; - } - else if (h >= 60.f && h < 120.f){ - r = x; - g = c; - b = 0; - } - else if (h >= 120.f && h < 180.f){ - r = 0; - g = c; - b = x; - } - else if (h >= 180.f && h < 240.f){ - r = 0; - g = x; - b = c; - } - else if (h >= 240.f && h < 300.f){ - r = x; - g = 0; - b = c; - } - else if ((h >= 300.f && h <= 360.f) || (h >= -60.f && h <= 0.f)){ - r = c; - g = 0; - b = x; - } - - Vec3F32 rgb = {r + m, g + m, b + m}; - return(rgb); -} - -internal Vec4F32 -hsva_from_rgba(Vec4F32 rgba) -{ - Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z); - Vec3F32 hsv = hsv_from_rgb(rgb); - Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w); - return hsva; -} - -internal Vec4F32 -rgba_from_hsva(Vec4F32 hsva) -{ - Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z); - Vec3F32 rgb = rgb_from_hsv(hsv); - Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w); - return rgba; -} - -internal Vec4F32 -rgba_from_u32(U32 hex) -{ - Vec4F32 result = v4f32(((hex&0xff000000)>>24)/255.f, - ((hex&0x00ff0000)>>16)/255.f, - ((hex&0x0000ff00)>> 8)/255.f, - ((hex&0x000000ff)>> 0)/255.f); - return result; -} - -internal U32 -u32_from_rgba(Vec4F32 rgba) -{ - U32 result = 0; - result |= ((U32)((U8)(rgba.x*255.f))) << 24; - result |= ((U32)((U8)(rgba.y*255.f))) << 16; - result |= ((U32)((U8)(rgba.z*255.f))) << 8; - result |= ((U32)((U8)(rgba.w*255.f))) << 0; - return result; -} - -//////////////////////////////// -//~ rjf: List Type Functions - -internal void -rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng) -{ - Rng1U64Node *n = push_array(arena, Rng1U64Node, 1); - MemoryCopyStruct(&n->v, &rng); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal void -rng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat) -{ - if(to_concat->first) - { - if(list->first) - { - list->last->next = to_concat->first; - list->last = to_concat->last; - } - else - { - list->first = to_concat->first; - list->last = to_concat->last; - } - MemoryZeroStruct(to_concat); - } -} - -internal Rng1U64Array -rng1u64_array_from_list(Arena *arena, Rng1U64List *list) -{ - Rng1U64Array arr = {0}; - arr.count = list->count; - arr.v = push_array_no_zero(arena, Rng1U64, arr.count); - U64 idx = 0; - for(Rng1U64Node *n = list->first; n != 0; n = n->next) - { - arr.v[idx] = n->v; - idx += 1; - } - return arr; -} - -internal void -rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng) -{ - Rng1S64Node *n = push_array(arena, Rng1S64Node, 1); - MemoryCopyStruct(&n->v, &rng); - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal Rng1S64Array -rng1s64_array_from_list(Arena *arena, Rng1S64List *list) -{ - Rng1S64Array arr = {0}; - arr.count = list->count; - arr.v = push_array_no_zero(arena, Rng1S64, arr.count); - U64 idx = 0; - for(Rng1S64Node *n = list->first; n != 0; n = n->next) - { - arr.v[idx] = n->v; - idx += 1; - } - return arr; -} diff --git a/src/metagen/metagen_base/metagen_base_math.h b/src/metagen/metagen_base/metagen_base_math.h deleted file mode 100644 index b6063ad5..00000000 --- a/src/metagen/metagen_base/metagen_base_math.h +++ /dev/null @@ -1,675 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_MATH_H -#define BASE_MATH_H - -//////////////////////////////// -//~ rjf: Vector Types - -//- rjf: 2-vectors - -typedef union Vec2F32 Vec2F32; -union Vec2F32 -{ - struct - { - F32 x; - F32 y; - }; - F32 v[2]; -}; - -typedef union Vec2S64 Vec2S64; -union Vec2S64 -{ - struct - { - S64 x; - S64 y; - }; - S64 v[2]; -}; - -typedef union Vec2S32 Vec2S32; -union Vec2S32 -{ - struct - { - S32 x; - S32 y; - }; - S32 v[2]; -}; - -typedef union Vec2S16 Vec2S16; -union Vec2S16 -{ - struct - { - S16 x; - S16 y; - }; - S16 v[2]; -}; - -//- rjf: 3-vectors - -typedef union Vec3F32 Vec3F32; -union Vec3F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - }; - struct - { - Vec2F32 xy; - F32 _z0; - }; - struct - { - F32 _x0; - Vec2F32 yz; - }; - F32 v[3]; -}; - -typedef union Vec3S32 Vec3S32; -union Vec3S32 -{ - struct - { - S32 x; - S32 y; - S32 z; - }; - struct - { - Vec2S32 xy; - S32 _z0; - }; - struct - { - S32 _x0; - Vec2S32 yz; - }; - S32 v[3]; -}; - -//- rjf: 4-vectors - -typedef union Vec4F32 Vec4F32; -union Vec4F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - F32 w; - }; - struct - { - Vec2F32 xy; - Vec2F32 zw; - }; - struct - { - Vec3F32 xyz; - F32 _z0; - }; - struct - { - F32 _x0; - Vec3F32 yzw; - }; - F32 v[4]; -}; - -typedef union Vec4S32 Vec4S32; -union Vec4S32 -{ - struct - { - S32 x; - S32 y; - S32 z; - S32 w; - }; - struct - { - Vec2S32 xy; - Vec2S32 zw; - }; - struct - { - Vec3S32 xyz; - S32 _z0; - }; - struct - { - S32 _x0; - Vec3S32 yzw; - }; - S32 v[4]; -}; - -//////////////////////////////// -//~ rjf: Matrix Types - -typedef struct Mat3x3F32 Mat3x3F32; -struct Mat3x3F32 -{ - F32 v[3][3]; -}; - -typedef struct Mat4x4F32 Mat4x4F32; -struct Mat4x4F32 -{ - F32 v[4][4]; -}; - -//////////////////////////////// -//~ rjf: Range Types - -//- rjf: 1-range - -typedef union Rng1U32 Rng1U32; -union Rng1U32 -{ - struct - { - U32 min; - U32 max; - }; - U32 v[2]; -}; - -typedef union Rng1S32 Rng1S32; -union Rng1S32 -{ - struct - { - S32 min; - S32 max; - }; - S32 v[2]; -}; - -typedef union Rng1U64 Rng1U64; -union Rng1U64 -{ - struct - { - U64 min; - U64 max; - }; - U64 v[2]; -}; - -typedef union Rng1S64 Rng1S64; -union Rng1S64 -{ - struct - { - S64 min; - S64 max; - }; - S64 v[2]; -}; - -typedef union Rng1F32 Rng1F32; -union Rng1F32 -{ - struct - { - F32 min; - F32 max; - }; - F32 v[2]; -}; - -//- rjf: 2-range (rectangles) - -typedef union Rng2S16 Rng2S16; -union Rng2S16 -{ - struct - { - Vec2S16 min; - Vec2S16 max; - }; - struct - { - Vec2S16 p0; - Vec2S16 p1; - }; - struct - { - S16 x0; - S16 y0; - S16 x1; - S16 y1; - }; - Vec2S16 v[2]; -}; - -typedef union Rng2S32 Rng2S32; -union Rng2S32 -{ - struct - { - Vec2S32 min; - Vec2S32 max; - }; - struct - { - Vec2S32 p0; - Vec2S32 p1; - }; - struct - { - S32 x0; - S32 y0; - S32 x1; - S32 y1; - }; - Vec2S32 v[2]; -}; - -typedef union Rng2F32 Rng2F32; -union Rng2F32 -{ - struct - { - Vec2F32 min; - Vec2F32 max; - }; - struct - { - Vec2F32 p0; - Vec2F32 p1; - }; - struct - { - F32 x0; - F32 y0; - F32 x1; - F32 y1; - }; - Vec2F32 v[2]; -}; - -typedef union Rng2S64 Rng2S64; -union Rng2S64 -{ - struct - { - Vec2S64 min; - Vec2S64 max; - }; - struct - { - Vec2S64 p0; - Vec2S64 p1; - }; - struct - { - S64 x0; - S64 y0; - S64 x1; - S64 y1; - }; - Vec2S64 v[2]; -}; - -//////////////////////////////// -//~ rjf: List Types - -typedef struct Rng1U64Node Rng1U64Node; -struct Rng1U64Node -{ - Rng1U64Node *next; - Rng1U64 v; -}; - -typedef struct Rng1U64List Rng1U64List; -struct Rng1U64List -{ - U64 count; - Rng1U64Node *first; - Rng1U64Node *last; -}; - -typedef struct Rng1U64Array Rng1U64Array; -struct Rng1U64Array -{ - Rng1U64 *v; - U64 count; -}; - -typedef struct Rng1S64Node Rng1S64Node; -struct Rng1S64Node -{ - Rng1S64Node *next; - Rng1S64 v; -}; - -typedef struct Rng1S64List Rng1S64List; -struct Rng1S64List -{ - Rng1S64Node *first; - Rng1S64Node *last; - U64 count; -}; - -typedef struct Rng1S64Array Rng1S64Array; -struct Rng1S64Array -{ - Rng1S64 *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Scalar Ops - -#define abs_s64(v) (S64)llabs(v) - -#define sqrt_f32(v) sqrtf(v) -#define mod_f32(a, b) fmodf((a), (b)) -#define pow_f32(b, e) powf((b), (e)) -#define ceil_f32(v) ceilf(v) -#define floor_f32(v) floorf(v) -#define round_f32(v) roundf(v) -#define abs_f32(v) fabsf(v) -#define radians_from_turns_f32(v) ((v)*2*3.1415926535897f) -#define turns_from_radians_f32(v) ((v)/2*3.1415926535897f) -#define degrees_from_turns_f32(v) ((v)*360.f) -#define turns_from_degrees_f32(v) ((v)/360.f) -#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v))) -#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v))) -#define sin_f32(v) sinf(radians_from_turns_f32(v)) -#define cos_f32(v) cosf(radians_from_turns_f32(v)) -#define tan_f32(v) tanf(radians_from_turns_f32(v)) - -#define sqrt_f64(v) sqrt(v) -#define mod_f64(a, b) fmod((a), (b)) -#define pow_f64(b, e) pow((b), (e)) -#define ceil_f64(v) ceil(v) -#define floor_f64(v) floor(v) -#define round_f64(v) round(v) -#define abs_f64(v) fabs(v) -#define radians_from_turns_f64(v) ((v)*2*3.1415926535897) -#define turns_from_radians_f64(v) ((v)/2*3.1415926535897) -#define degrees_from_turns_f64(v) ((v)*360.0) -#define turns_from_degrees_f64(v) ((v)/360.0) -#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v))) -#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v))) -#define sin_f64(v) sin(radians_from_turns_f64(v)) -#define cos_f64(v) cos(radians_from_turns_f64(v)) -#define tan_f64(v) tan(radians_from_turns_f64(v)) - -internal F32 mix_1f32(F32 a, F32 b, F32 t); -internal F64 mix_1f64(F64 a, F64 b, F64 t); - -//////////////////////////////// -//~ rjf: Vector Ops - -#define v2f32(x, y) vec_2f32((x), (y)) -internal Vec2F32 vec_2f32(F32 x, F32 y); -internal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b); -internal Vec2F32 scale_2f32(Vec2F32 v, F32 s); -internal F32 dot_2f32(Vec2F32 a, Vec2F32 b); -internal F32 length_squared_2f32(Vec2F32 v); -internal F32 length_2f32(Vec2F32 v); -internal Vec2F32 normalize_2f32(Vec2F32 v); -internal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t); - -#define v2s64(x, y) vec_2s64((x), (y)) -internal Vec2S64 vec_2s64(S64 x, S64 y); -internal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b); -internal Vec2S64 scale_2s64(Vec2S64 v, S64 s); -internal S64 dot_2s64(Vec2S64 a, Vec2S64 b); -internal S64 length_squared_2s64(Vec2S64 v); -internal S64 length_2s64(Vec2S64 v); -internal Vec2S64 normalize_2s64(Vec2S64 v); -internal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t); - -#define v2s32(x, y) vec_2s32((x), (y)) -internal Vec2S32 vec_2s32(S32 x, S32 y); -internal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b); -internal Vec2S32 scale_2s32(Vec2S32 v, S32 s); -internal S32 dot_2s32(Vec2S32 a, Vec2S32 b); -internal S32 length_squared_2s32(Vec2S32 v); -internal S32 length_2s32(Vec2S32 v); -internal Vec2S32 normalize_2s32(Vec2S32 v); -internal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t); - -#define v2s16(x, y) vec_2s16((x), (y)) -internal Vec2S16 vec_2s16(S16 x, S16 y); -internal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b); -internal Vec2S16 scale_2s16(Vec2S16 v, S16 s); -internal S16 dot_2s16(Vec2S16 a, Vec2S16 b); -internal S16 length_squared_2s16(Vec2S16 v); -internal S16 length_2s16(Vec2S16 v); -internal Vec2S16 normalize_2s16(Vec2S16 v); -internal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t); - -#define v3f32(x, y, z) vec_3f32((x), (y), (z)) -internal Vec3F32 vec_3f32(F32 x, F32 y, F32 z); -internal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b); -internal Vec3F32 scale_3f32(Vec3F32 v, F32 s); -internal F32 dot_3f32(Vec3F32 a, Vec3F32 b); -internal F32 length_squared_3f32(Vec3F32 v); -internal F32 length_3f32(Vec3F32 v); -internal Vec3F32 normalize_3f32(Vec3F32 v); -internal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t); -internal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b); - -#define v3s32(x, y, z) vec_3s32((x), (y), (z)) -internal Vec3S32 vec_3s32(S32 x, S32 y, S32 z); -internal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b); -internal Vec3S32 scale_3s32(Vec3S32 v, S32 s); -internal S32 dot_3s32(Vec3S32 a, Vec3S32 b); -internal S32 length_squared_3s32(Vec3S32 v); -internal S32 length_3s32(Vec3S32 v); -internal Vec3S32 normalize_3s32(Vec3S32 v); -internal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t); -internal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b); - -#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w)) -internal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w); -internal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b); -internal Vec4F32 scale_4f32(Vec4F32 v, F32 s); -internal F32 dot_4f32(Vec4F32 a, Vec4F32 b); -internal F32 length_squared_4f32(Vec4F32 v); -internal F32 length_4f32(Vec4F32 v); -internal Vec4F32 normalize_4f32(Vec4F32 v); -internal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t); - -#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w)) -internal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w); -internal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b); -internal Vec4S32 scale_4s32(Vec4S32 v, S32 s); -internal S32 dot_4s32(Vec4S32 a, Vec4S32 b); -internal S32 length_squared_4s32(Vec4S32 v); -internal S32 length_4s32(Vec4S32 v); -internal Vec4S32 normalize_4s32(Vec4S32 v); -internal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t); - -//////////////////////////////// -//~ rjf: Matrix Ops - -internal Mat3x3F32 mat_3x3f32(F32 diagonal); -internal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta); -internal Mat3x3F32 make_scale_3x3f32(Vec2F32 scale); -internal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b); - -internal Mat4x4F32 mat_4x4f32(F32 diagonal); -internal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta); -internal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale); -internal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z); -internal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z); -internal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up); -internal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns); -internal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b); -internal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale); -internal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m); -internal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat); - -//////////////////////////////// -//~ rjf: Range Ops - -#define r1u32(min, max) rng_1u32((min), (max)) -internal Rng1U32 rng_1u32(U32 min, U32 max); -internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); -internal Rng1U32 pad_1u32(Rng1U32 r, U32 x); -internal U32 center_1u32(Rng1U32 r); -internal B32 contains_1u32(Rng1U32 r, U32 x); -internal U32 dim_1u32(Rng1U32 r); -internal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b); -internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b); -internal U32 clamp_1u32(Rng1U32 r, U32 v); - -#define r1s32(min, max) rng_1s32((min), (max)) -internal Rng1S32 rng_1s32(S32 min, S32 max); -internal Rng1S32 shift_1s32(Rng1S32 r, S32 x); -internal Rng1S32 pad_1s32(Rng1S32 r, S32 x); -internal S32 center_1s32(Rng1S32 r); -internal B32 contains_1s32(Rng1S32 r, S32 x); -internal S32 dim_1s32(Rng1S32 r); -internal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b); -internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b); -internal S32 clamp_1s32(Rng1S32 r, S32 v); - -#define r1u64(min, max) rng_1u64((min), (max)) -internal Rng1U64 rng_1u64(U64 min, U64 max); -internal Rng1U64 shift_1u64(Rng1U64 r, U64 x); -internal Rng1U64 pad_1u64(Rng1U64 r, U64 x); -internal U64 center_1u64(Rng1U64 r); -internal B32 contains_1u64(Rng1U64 r, U64 x); -internal U64 dim_1u64(Rng1U64 r); -internal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b); -internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b); -internal U64 clamp_1u64(Rng1U64 r, U64 v); - -#define r1s64(min, max) rng_1s64((min), (max)) -internal Rng1S64 rng_1s64(S64 min, S64 max); -internal Rng1S64 shift_1s64(Rng1S64 r, S64 x); -internal Rng1S64 pad_1s64(Rng1S64 r, S64 x); -internal S64 center_1s64(Rng1S64 r); -internal B32 contains_1s64(Rng1S64 r, S64 x); -internal S64 dim_1s64(Rng1S64 r); -internal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b); -internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b); -internal S64 clamp_1s64(Rng1S64 r, S64 v); - -#define r1f32(min, max) rng_1f32((min), (max)) -internal Rng1F32 rng_1f32(F32 min, F32 max); -internal Rng1F32 shift_1f32(Rng1F32 r, F32 x); -internal Rng1F32 pad_1f32(Rng1F32 r, F32 x); -internal F32 center_1f32(Rng1F32 r); -internal B32 contains_1f32(Rng1F32 r, F32 x); -internal F32 dim_1f32(Rng1F32 r); -internal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b); -internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b); -internal F32 clamp_1f32(Rng1F32 r, F32 v); - -#define r2s16(min, max) rng_2s16((min), (max)) -#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w))) -internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max); -internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x); -internal Rng2S16 pad_2s16(Rng2S16 r, S16 x); -internal Vec2S16 center_2s16(Rng2S16 r); -internal B32 contains_2s16(Rng2S16 r, Vec2S16 x); -internal Vec2S16 dim_2s16(Rng2S16 r); -internal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b); -internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b); -internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v); - -#define r2s32(min, max) rng_2s32((min), (max)) -#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w))) -internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max); -internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x); -internal Rng2S32 pad_2s32(Rng2S32 r, S32 x); -internal Vec2S32 center_2s32(Rng2S32 r); -internal B32 contains_2s32(Rng2S32 r, Vec2S32 x); -internal Vec2S32 dim_2s32(Rng2S32 r); -internal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b); -internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b); -internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v); - -#define r2s64(min, max) rng_2s64((min), (max)) -#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w))) -internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max); -internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x); -internal Rng2S64 pad_2s64(Rng2S64 r, S64 x); -internal Vec2S64 center_2s64(Rng2S64 r); -internal B32 contains_2s64(Rng2S64 r, Vec2S64 x); -internal Vec2S64 dim_2s64(Rng2S64 r); -internal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b); -internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b); -internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v); - -#define r2f32(min, max) rng_2f32((min), (max)) -#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w))) -internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max); -internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x); -internal Rng2F32 pad_2f32(Rng2F32 r, F32 x); -internal Vec2F32 center_2f32(Rng2F32 r); -internal B32 contains_2f32(Rng2F32 r, Vec2F32 x); -internal Vec2F32 dim_2f32(Rng2F32 r); -internal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b); -internal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b); -internal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v); - -//////////////////////////////// -//~ rjf: Miscellaneous Ops - -internal Vec3F32 hsv_from_rgb(Vec3F32 rgb); -internal Vec3F32 rgb_from_hsv(Vec3F32 hsv); -internal Vec4F32 hsva_from_rgba(Vec4F32 rgba); -internal Vec4F32 rgba_from_hsva(Vec4F32 hsva); -internal Vec4F32 rgba_from_u32(U32 hex); -internal U32 u32_from_rgba(Vec4F32 rgba); - -#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f } - -//////////////////////////////// -//~ rjf: List Type Functions - -internal void rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng); -internal void rng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat); -internal Rng1U64Array rng1u64_array_from_list(Arena *arena, Rng1U64List *list); - -internal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng); -internal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list); - -#endif // BASE_MATH_H diff --git a/src/metagen/metagen_base/metagen_base_meta.c b/src/metagen/metagen_base/metagen_base_meta.c deleted file mode 100644 index c60dc237..00000000 --- a/src/metagen/metagen_base/metagen_base_meta.c +++ /dev/null @@ -1,422 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Type Info Lookups - -internal Member * -member_from_name(Type *type, String8 name) -{ - Member *member = &member_nil; - if(type->members != 0 && name.size != 0) - { - for(U64 idx = 0; idx < type->count; idx += 1) - { - if(str8_match(type->members[idx].name, name, 0)) - { - member = &type->members[idx]; - break; - } - } - } - return member; -} - -//////////////////////////////// -//~ rjf: Type Info * Instance Operations - -internal void -typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr) -{ - Temp scratch = scratch_begin(0, 0); - typedef struct RebaseTypeTask RebaseTypeTask; - struct RebaseTypeTask - { - RebaseTypeTask *next; - Type *type; - U8 *ptr; - }; - RebaseTypeTask start_task = {0, type, data.str}; - RebaseTypeTask *first_task = &start_task; - RebaseTypeTask *last_task = first_task; - for(RebaseTypeTask *t = first_task; t != 0; t = t->next) - { - switch(t->type->kind) - { - default:{}break; - case TypeKind_Ptr: - if(!(t->type->flags & TypeFlag_IsExternal)) - { - *(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr)); - }break; - case TypeKind_Array: - { - for(U64 idx = 0; idx < t->type->count; idx += 1) - { - RebaseTypeTask *task = push_array(scratch.arena, RebaseTypeTask, 1); - task->type = t->type->direct; - task->ptr = t->ptr + t->type->direct->size * idx; - SLLQueuePush(first_task, last_task, task); - } - }break; - case TypeKind_Struct: - { - for(U64 idx = 0; idx < t->type->count; idx += 1) - { - Member *member = &t->type->members[idx]; - RebaseTypeTask *task = push_array(scratch.arena, RebaseTypeTask, 1); - task->type = member->type; - task->ptr = t->ptr + member->value; - SLLQueuePush(first_task, last_task, task); - } - }break; - } - } - scratch_end(scratch); -} - -internal String8 -serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List strings = {0}; - str8_serial_begin(scratch.arena, &strings); - { - typedef struct SerializeTypeTask SerializeTypeTask; - struct SerializeTypeTask - { - SerializeTypeTask *next; - Type *type; - U64 count; - U8 *src; - Type *containing_type; - U8 *containing_ptr; - B32 is_post_header; - }; - SerializeTypeTask start_task = {0, type, 1, data.str}; - SerializeTypeTask *first_task = &start_task; - SerializeTypeTask *last_task = first_task; - for(SerializeTypeTask *t = first_task; t != 0; t = t->next) - { - switch(t->type->kind) - { - //- rjf: leaf -> just copy the data directly - default: - if(TypeKind_FirstLeaf <= t->type->kind && t->type->kind <= TypeKind_LastLeaf) - { - str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count)); - }break; - - //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise just write as plain data - case TypeKind_Ptr: - { - // rjf: unpack info about this pointer - TypeSerializePtrRefInfo *ptr_ref_info = 0; - for(U64 idx = 0; idx < params->ptr_ref_infos_count; idx += 1) - { - if(params->ptr_ref_infos[idx].type == t->type->direct) - { - ptr_ref_info = ¶ms->ptr_ref_infos[idx]; - break; - } - } - - // rjf: indexification -> subtract base, divide direct size, write index - if(ptr_ref_info != 0 && ptr_ref_info->indexify_base != 0) - { - U64 ptr_value = 0; - MemoryCopy(&ptr_value, t->src, sizeof(ptr_value)); - U64 ptr_write_value = ((U64)((U8 *)ptr_value - (U8 *)ptr_ref_info->indexify_base)/t->type->direct->size); - str8_serial_push_struct(scratch.arena, &strings, &ptr_write_value); - } - - // rjf: offsetification -> subtract base, write offsets - else if(ptr_ref_info != 0 && ptr_ref_info->offsetify_base != 0) - { - U64 ptr_value = 0; - MemoryCopy(&ptr_value, t->src, sizeof(ptr_value)); - U64 ptr_write_value = (U64)((U8 *)ptr_value - (U8 *)ptr_ref_info->offsetify_base); - str8_serial_push_struct(scratch.arena, &strings, &ptr_write_value); - } - - // rjf: size-by-member (pre-header): still potentially dependent on other members which - // delimit our size, so push a new post-header task for pointer. - else if(t->type->count_delimiter_name.size != 0 && !t->is_post_header) - { - SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); - task->type = t->type; - task->count = t->count; - task->src = t->src; - task->containing_type = t->containing_type; - task->containing_ptr = t->containing_ptr; - task->is_post_header = 1; - SLLQueuePush(first_task, last_task, task); - } - - // rjf: size-by-member (post-header): all flat parts of containing struct have been - // iterated, so now we can read the size, & descend to new task to read pointer - // destination contents - else if(t->type->count_delimiter_name.size != 0 && t->is_post_header) - { - // rjf: determine count of this pointer - U64 count = 0; - { - Member *count_member = member_from_name(t->containing_type, t->type->count_delimiter_name); - MemoryCopy(&count, t->containing_ptr + count_member->value, count_member->type->size); - } - - // rjf: push task - SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); - task->type = t->type->direct; - task->count = count; - task->src = *(void **)t->src; - task->containing_type = t->containing_type; - task->containing_ptr = t->containing_ptr; - SLLQueuePush(first_task, last_task, task); - } - - // rjf: catch-all: write pointer value - else - { - str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count)); - } - }break; - - //- rjf: arrays -> descend to underlying type, + count - case TypeKind_Array: - { - SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); - task->type = t->type->direct; - task->count = t->type->count; - task->src = t->src; - task->containing_type = t->containing_type; - task->containing_ptr = t->containing_ptr; - SLLQueuePush(first_task, last_task, task); - }break; - - //- rjf: struct -> descend to members - case TypeKind_Struct: - { - U64 off = 0; - for(U64 idx = 0; idx < t->count; idx += 1) - { - for(U64 member_idx = 0; member_idx < t->type->count; member_idx += 1) - { - if(t->type->members[member_idx].flags & MemberFlag_DoNotSerialize) - { - continue; - } - SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); - task->type = t->type->members[member_idx].type; - task->count = 1; - task->src = t->src + idx*t->type->size + t->type->members[member_idx].value; - task->containing_type = t->type; - task->containing_ptr = t->src; - SLLQueuePush(first_task, last_task, task); - } - } - }break; - - //- rjf: enum -> descend to basic type interpretation - case TypeKind_Enum: - { - SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1); - task->type = t->type->direct; - task->count = t->count; - task->src = t->src; - task->containing_type = t->containing_type; - task->containing_ptr = t->containing_ptr; - SLLQueuePush(first_task, last_task, task); - }break; - } - } - } - String8 result = str8_serial_end(arena, &strings); - scratch_end(scratch); - return result; -} - -internal String8 -deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params) -{ - String8 result = {0}; - result.size = type->size; - result.str = push_array(arena, U8, result.size); - { - Temp scratch = scratch_begin(&arena, 1); - typedef struct DeserializeTypeTask DeserializeTypeTask; - struct DeserializeTypeTask - { - DeserializeTypeTask *next; - Type *type; - U64 count; - U8 *dst; - Type *containing_type; - U8 *containing_ptr; - B32 is_post_header; - }; - U64 read_off = 0; - DeserializeTypeTask start_task = {0, type, 1, result.str}; - DeserializeTypeTask *first_task = &start_task; - DeserializeTypeTask *last_task = first_task; - for(DeserializeTypeTask *t = first_task; t != 0; t = t->next) - { - U8 *t_src = data.str + read_off; - switch(t->type->kind) - { - //- rjf: leaf -> copy the data directly - default: - if(TypeKind_FirstLeaf <= t->type->kind && t->type->kind <= TypeKind_LastLeaf) - { - MemoryCopy(t->dst, t_src, t->type->size*t->count); - read_off += t->type->size*t->count; - }break; - - //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise skip - case TypeKind_Ptr: - { - // rjf: unpack info about this pointer - TypeSerializePtrRefInfo *ptr_ref_info = 0; - for(U64 idx = 0; idx < params->ptr_ref_infos_count; idx += 1) - { - if(params->ptr_ref_infos[idx].type == t->type->direct) - { - ptr_ref_info = ¶ms->ptr_ref_infos[idx]; - break; - } - } - - // rjf: indexification -> add base, multiply direct size - if(ptr_ref_info != 0 && ptr_ref_info->indexify_base != 0) - { - U64 ptr_value = 0; - MemoryCopy(&ptr_value, t_src, sizeof(ptr_value)); - U64 ptr_write_value = (ptr_value + (U64)ptr_ref_info->indexify_base) * t->type->direct->size; - MemoryCopy(t->dst, &ptr_write_value, sizeof(ptr_write_value)); - read_off += sizeof(ptr_value); - } - - // rjf: offsetification -> subtract base, write offsets - else if(ptr_ref_info != 0 && ptr_ref_info->offsetify_base != 0) - { - U64 ptr_value = 0; - MemoryCopy(&ptr_value, t_src, sizeof(ptr_value)); - U64 ptr_write_value = ptr_value + (U64)ptr_ref_info->offsetify_base; - MemoryCopy(t->dst, &ptr_write_value, sizeof(ptr_write_value)); - read_off += sizeof(ptr_value); - } - - // rjf: size-by-member (pre-header): still potentially dependent on other members which - // delimit our size, so push a new post-header task for pointer. - else if(t->type->count_delimiter_name.size != 0 && !t->is_post_header) - { - DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); - task->type = t->type; - task->count = t->count; - task->dst = t->dst; - task->containing_type = t->containing_type; - task->containing_ptr = t->containing_ptr; - task->is_post_header = 1; - SLLQueuePush(first_task, last_task, task); - } - - // rjf: size-by-member (post-header): all flat parts of containing struct have been - // iterated, so now we can read the size, & descend to new task to read pointer - // destination contents - else if(t->type->count_delimiter_name.size != 0 && t->is_post_header) - { - // rjf: determine count of this pointer - U64 count = 0; - { - Member *count_member = member_from_name(t->containing_type, t->type->count_delimiter_name); - MemoryCopy(&count, t->containing_ptr + count_member->value, count_member->type->size); - } - - // rjf: allocate buffer for pointer destination; write address into pointer value slot - U64 ptr_dest_buffer_size = (count+1)*t->type->direct->size; - U8 *ptr_dest_buffer = push_array(arena, U8, ptr_dest_buffer_size); - MemoryCopy(t->dst, &ptr_dest_buffer, sizeof(ptr_dest_buffer)); - - // rjf: push task - DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); - task->type = t->type->direct; - task->count = count; - task->dst = ptr_dest_buffer; - task->containing_type = t->containing_type; - task->containing_ptr = t->containing_ptr; - SLLQueuePush(first_task, last_task, task); - } - - // rjf: catch-all: read pointer value - else - { - MemoryCopy(t->dst, t_src, t->type->size*t->count); - read_off += t->type->size*t->count; - } - }break; - - //- rjf: arrays -> descend to underlying type, + count - case TypeKind_Array: - { - DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); - task->type = t->type->direct; - task->count = t->type->count; - task->dst = t->dst; - task->containing_type = t->containing_type; - task->containing_ptr = t->containing_ptr; - SLLQueuePush(first_task, last_task, task); - }break; - - //- rjf: struct -> descend to members - case TypeKind_Struct: - { - for(U64 idx = 0; idx < t->count; idx += 1) - { - for(U64 member_idx = 0; member_idx < t->type->count; member_idx += 1) - { - if(t->type->members[member_idx].flags & MemberFlag_DoNotSerialize) - { - continue; - } - DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); - task->type = t->type->members[member_idx].type; - task->count = 1; - task->dst = t->dst + idx*t->type->size + t->type->members[member_idx].value; - task->containing_type = t->type; - task->containing_ptr = t->dst; - SLLQueuePush(first_task, last_task, task); - } - } - }break; - - //- rjf: enum -> descend to basic type interpretation - case TypeKind_Enum: - { - DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1); - task->type = t->type->direct; - task->count = t->count; - task->dst = t->dst; - task->containing_type = t->containing_type; - task->containing_ptr = t->containing_ptr; - SLLQueuePush(first_task, last_task, task); - }break; - } - } - if(params->advance_out != 0) - { - params->advance_out[0] = read_off; - } - scratch_end(scratch); - } - return result; -} - -internal String8 -deep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 data_srlz = serialized_from_typed_data(scratch.arena, type, data, params); - String8 data_copy = deserialized_from_typed_data(arena, type, data_srlz, params); - scratch_end(scratch); - return data_copy; -} diff --git a/src/metagen/metagen_base/metagen_base_meta.h b/src/metagen/metagen_base/metagen_base_meta.h deleted file mode 100644 index 45d01e72..00000000 --- a/src/metagen/metagen_base/metagen_base_meta.h +++ /dev/null @@ -1,298 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_META_H -#define BASE_META_H - -//////////////////////////////// -//~ rjf: Meta Markup Features - -#define EmbedFile(name, path) -#define TweakB32(name, default) (TWEAK_##name) -#define TweakF32(name, default, min, max) (TWEAK_##name) - -//////////////////////////////// -//~ rjf: Tweak Info Tables - -typedef struct TweakB32Info TweakB32Info; -struct TweakB32Info -{ - String8 name; - B32 default_value; - B32 *value_ptr; -}; - -typedef struct TweakF32Info TweakF32Info; -struct TweakF32Info -{ - String8 name; - F32 default_value; - Rng1F32 value_range; - F32 *value_ptr; -}; - -typedef struct TweakB32InfoTable TweakB32InfoTable; -struct TweakB32InfoTable -{ - TweakB32Info *v; - U64 count; -}; - -typedef struct TweakF32InfoTable TweakF32InfoTable; -struct TweakF32InfoTable -{ - TweakF32Info *v; - U64 count; -}; - -typedef struct EmbedInfo EmbedInfo; -struct EmbedInfo -{ - String8 name; - String8 *data; - U128 *hash; -}; - -typedef struct EmbedInfoTable EmbedInfoTable; -struct EmbedInfoTable -{ - EmbedInfo *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Type Info Types - -typedef enum TypeKind -{ - TypeKind_Null, - - // rjf: leaves - TypeKind_Void, TypeKind_FirstLeaf = TypeKind_Void, - TypeKind_U8, - TypeKind_U16, - TypeKind_U32, - TypeKind_U64, - TypeKind_S8, - TypeKind_S16, - TypeKind_S32, - TypeKind_S64, - TypeKind_B8, - TypeKind_B16, - TypeKind_B32, - TypeKind_B64, - TypeKind_F32, - TypeKind_F64, TypeKind_LastLeaf = TypeKind_F64, - - // rjf: operators - TypeKind_Ptr, - TypeKind_Array, - - // rjf: user-defined-types - TypeKind_Struct, - TypeKind_Union, - TypeKind_Enum, - - TypeKind_COUNT -} -TypeKind; - -typedef U32 TypeFlags; -enum -{ - TypeFlag_IsExternal = (1<<0), - TypeFlag_IsPlainText = (1<<1), - TypeFlag_IsCodeText = (1<<2), - TypeFlag_IsPathText = (1<<3), -}; - -typedef U32 MemberFlags; -enum -{ - MemberFlag_DoNotSerialize = (1<<0), -}; - -typedef struct Type Type; -typedef struct Member Member; -struct Member -{ - String8 name; - String8 pretty_name; - Type *type; - U64 value; - MemberFlags flags; -}; - -typedef struct Type Type; -struct Type -{ - TypeKind kind; - TypeFlags flags; - U64 size; - Type *direct; - String8 name; - String8 count_delimiter_name; // gathered from surrounding members, turns *->[1] into *->[N] - U64 count; - Member *members; -}; - -//////////////////////////////// -//~ rjf: Type Serialization Parameters - -typedef struct TypeSerializePtrRefInfo TypeSerializePtrRefInfo; -struct TypeSerializePtrRefInfo -{ - Type *type; // pointers to this - void *indexify_base; // can be indexified using this - void *offsetify_base; // can be offsetified using this - void *nil_ptr; // is terminal if matching 0 or this -}; - -typedef struct TypeSerializeParams TypeSerializeParams; -struct TypeSerializeParams -{ - U64 *advance_out; - TypeSerializePtrRefInfo *ptr_ref_infos; - U64 ptr_ref_infos_count; -}; - -//////////////////////////////// -//~ rjf: Type Name -> Type Info - -#define type(T) (&T##__type) - -//////////////////////////////// -//~ rjf: Type Info Table Initializer Helpers - -#define member_lit_comp(S, ti, m, ...) {str8_lit_comp(#m), {0}, (ti), OffsetOf(S, m), __VA_ARGS__} -#define struct_members(S) read_only global Member S##__members[] = -#define struct_type(S, ...) read_only global Type S##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members, __VA_ARGS__} -#define named_struct_type(name, S, ...) read_only global Type name##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#name), {0}, ArrayCount(name##__members), name##__members, __VA_ARGS__} -#define ptr_type(name, ti, ...) read_only global Type name = {TypeKind_Ptr, 0, sizeof(void *), (ti), __VA_ARGS__} - -//////////////////////////////// -//~ rjf: Globals - -read_only global Type type_nil = {TypeKind_Null, 0, 0, &type_nil}; -read_only global Member member_nil = {{0}, {0}, &type_nil}; - -//////////////////////////////// -//~ rjf: Built-In Types - -//- rjf: leaves -read_only global Type void__type = {TypeKind_Void, 0, 0, &type_nil, str8_lit_comp("void")}; -read_only global Type U8__type = {TypeKind_U8, 0, sizeof(U8), &type_nil, str8_lit_comp("U8")}; -read_only global Type U16__type = {TypeKind_U16, 0, sizeof(U16), &type_nil, str8_lit_comp("U16")}; -read_only global Type U32__type = {TypeKind_U32, 0, sizeof(U32), &type_nil, str8_lit_comp("U32")}; -read_only global Type U64__type = {TypeKind_U64, 0, sizeof(U64), &type_nil, str8_lit_comp("U64")}; -read_only global Type S8__type = {TypeKind_S8, 0, sizeof(S8), &type_nil, str8_lit_comp("S8")}; -read_only global Type S16__type = {TypeKind_S16, 0, sizeof(S16), &type_nil, str8_lit_comp("S16")}; -read_only global Type S32__type = {TypeKind_S32, 0, sizeof(S32), &type_nil, str8_lit_comp("S32")}; -read_only global Type S64__type = {TypeKind_S64, 0, sizeof(S64), &type_nil, str8_lit_comp("S64")}; -read_only global Type B8__type = {TypeKind_B8, 0, sizeof(B8), &type_nil, str8_lit_comp("B8")}; -read_only global Type B16__type = {TypeKind_B16, 0, sizeof(B16), &type_nil, str8_lit_comp("B16")}; -read_only global Type B32__type = {TypeKind_B32, 0, sizeof(B32), &type_nil, str8_lit_comp("B32")}; -read_only global Type B64__type = {TypeKind_B64, 0, sizeof(B64), &type_nil, str8_lit_comp("B64")}; -read_only global Type F32__type = {TypeKind_F32, 0, sizeof(F32), &type_nil, str8_lit_comp("F32")}; -read_only global Type F64__type = {TypeKind_F64, 0, sizeof(F64), &type_nil, str8_lit_comp("F64")}; -read_only global Type *type_kind_type_table[] = -{ - &type_nil, - type(void), - type(U8), - type(U16), - type(U32), - type(U64), - type(S8), - type(S16), - type(S32), - type(S64), - type(B8), - type(B16), - type(B32), - type(B64), - type(F32), - type(F64), - &type_nil, - &type_nil, - &type_nil, - &type_nil, - &type_nil, -}; - -//- rjf: Rng1U64 -struct_members(Rng1U64) -{ - member_lit_comp(Rng1U64, type(U64), min), - member_lit_comp(Rng1U64, type(U64), max), -}; -struct_type(Rng1U64); - -//- rjf: String8 -ptr_type(String8__str_ptr_type, type(U8), str8_lit_comp("size")); -struct_members(String8) -{ - member_lit_comp(String8, &String8__str_ptr_type, str), - member_lit_comp(String8, type(U64), size), -}; -struct_type(String8); - -//- rjf: String8Node -extern Type String8Node__type; -Type String8Node__ptr_type = {TypeKind_Ptr, 0, sizeof(void *), &String8Node__type}; -Member String8Node__members[] = -{ - {str8_lit_comp("next"), {0}, &String8Node__ptr_type, OffsetOf(String8Node, next)}, - {str8_lit_comp("string"), {0}, type(String8), OffsetOf(String8Node, string)}, -}; -Type String8Node__type = -{ - TypeKind_Struct, - 0, - sizeof(String8Node), - &type_nil, - str8_lit_comp("String8Node"), - {0}, - ArrayCount(String8Node__members), - String8Node__members, -}; - -//- rjf: String8List -Member String8List__members[] = -{ - {str8_lit_comp("first"), {0}, &String8Node__ptr_type, OffsetOf(String8List, first)}, - {str8_lit_comp("last"), {0}, &String8Node__ptr_type, OffsetOf(String8List, last), MemberFlag_DoNotSerialize}, - {str8_lit_comp("node_count"), {0}, type(U64), OffsetOf(String8List, node_count)}, - {str8_lit_comp("total_size"), {0}, type(U64), OffsetOf(String8List, total_size)}, -}; -Type String8List__type = -{ - TypeKind_Struct, - 0, - sizeof(String8List), - &type_nil, - str8_lit_comp("String8List"), - {0}, - ArrayCount(String8List__members), - String8List__members, -}; - -//////////////////////////////// -//~ rjf: Type Info Lookups - -internal Member *member_from_name(Type *type, String8 name); -#define EachMember(T, it) (Member *it = (type(T))->members; it != 0 && it < (type(T))->members + (type(T))->count; it += 1) - -//////////////////////////////// -//~ rjf: Type Info * Instance Operations - -internal void typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr); -internal String8 serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params); -internal String8 deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params); -internal String8 deep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params); -#define struct_rebase_ptrs(T, ptr, base) typed_data_rebase_ptrs(type(T), str8_struct(ptr), (base)) -#define serialized_from_struct(arena, T, ptr, ...) serialized_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}) -#define struct_from_serialized(arena, T, string, ...) (T *)deserialized_from_typed_data((arena), type(T), (string), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str -#define deep_copy_from_struct(arena, T, ptr, ...) (T *)deep_copy_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str - -#endif // BASE_META_H diff --git a/src/metagen/metagen_base/metagen_base_profile.c b/src/metagen/metagen_base/metagen_base_profile.c deleted file mode 100644 index 8ac6bce5..00000000 --- a/src/metagen/metagen_base/metagen_base_profile.c +++ /dev/null @@ -1,2 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/metagen/metagen_base/metagen_base_profile.h b/src/metagen/metagen_base/metagen_base_profile.h deleted file mode 100644 index 1e0d938b..00000000 --- a/src/metagen/metagen_base/metagen_base_profile.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_PROFILE_H -#define BASE_PROFILE_H - -//////////////////////////////// -//~ rjf: Zero Settings - -#if !defined(PROFILE_TELEMETRY) -# define PROFILE_TELEMETRY 0 -#endif - -#if !defined(MARKUP_LAYER_COLOR) -# define MARKUP_LAYER_COLOR 1.00f, 0.00f, 1.00f -#endif - -//////////////////////////////// -//~ rjf: Third Party Includes - -#if PROFILE_TELEMETRY -# include "rad_tm.h" -# if OS_WINDOWS -# pragma comment(lib, "ws2_32.lib") -# pragma comment(lib, "rad_tm_win64.lib") -# endif -#endif - -//////////////////////////////// -//~ rjf: Telemetry Profile Defines - -#if PROFILE_TELEMETRY -# define ProfBegin(...) tmEnter(0, 0, __VA_ARGS__) -# define ProfBeginDynamic(...) (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) -# define ProfEnd(...) (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0) -# define ProfTick(...) tmTick(0) -# define ProfIsCapturing(...) tmRunning() -# define ProfBeginCapture(...) tmOpen(0, __VA_ARGS__, __DATE__, "localhost", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100) -# define ProfEndCapture(...) tmClose(0) -# define ProfThreadName(...) (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0) -# define ProfMsg(...) (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0) -# define ProfBeginLockWait(...) tmStartWaitForLock(0, 0, __VA_ARGS__) -# define ProfEndLockWait(...) tmEndWaitForLock(0) -# define ProfLockTake(...) tmAcquiredLock(0, 0, __VA_ARGS__) -# define ProfLockDrop(...) tmReleasedLock(0, __VA_ARGS__) -# define ProfColor(color) tmZoneColorSticky(color) -# define ProfBeginV(...) \ -if (TM_API_PTR) { \ -static tm_uint64 file_id = 0; TM_API_PTR->_tmStaticString(&file_id, __FILE__); \ -Temp scratch = scratch_begin(0,0); \ -String8 string = push_str8f(scratch.arena, __VA_ARGS__); \ -tm_uint64 hash = TM_API_PTR->_tmHash((char*)string.str, string.size); \ -hash = TM_API_PTR->_tmSendDynamicString(hash, (char*)string.str); \ -TM_API_PTR->_tmEnterZoneFast_Core(0, 0, file_id, __LINE__, hash); \ -scratch_end(scratch); \ -} -# define ProfNoteV(...) \ -if (TM_API_PTR) { \ -static tm_uint64 file_id = 0; TM_API_PTR->_tmStaticString(&file_id, __FILE__); \ -Temp scratch = scratch_begin(0,0); \ -String8 string = push_str8f(scratch.arena, __VA_ARGS__); \ -tm_uint64 hash = TM_API_PTR->_tmHash((char*)string.str, string.size); \ -hash = TM_API_PTR->_tmSendDynamicString(hash, (char*)string.str); \ -TM_API_PTR->_tmMessageFast_Core(0, TMMF_ICON_NOTE, file_id, __LINE__, hash); \ -scratch_end(scratch); \ -} -#endif - -//////////////////////////////// -//~ rjf: Zeroify Undefined Defines - -#if !defined(ProfBegin) -# define ProfBegin(...) (0) -# define ProfBeginDynamic(...) (0) -# define ProfEnd(...) (0) -# define ProfTick(...) (0) -# define ProfIsCapturing(...) (0) -# define ProfBeginCapture(...) (0) -# define ProfEndCapture(...) (0) -# define ProfThreadName(...) (0) -# define ProfMsg(...) (0) -# define ProfBeginLockWait(...) (0) -# define ProfEndLockWait(...) (0) -# define ProfLockTake(...) (0) -# define ProfLockDrop(...) (0) -# define ProfColor(...) (0) -# define ProfBeginV(...) (0) -# define ProfNoteV(...) (0) -#endif - -//////////////////////////////// -//~ rjf: Helper Wrappers - -#define ProfBeginFunction(...) ProfBegin(this_function_name) -#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd()) - -#endif // BASE_PROFILE_H diff --git a/src/metagen/metagen_base/metagen_base_strings.c b/src/metagen/metagen_base/metagen_base_strings.c deleted file mode 100644 index 9e42e0cd..00000000 --- a/src/metagen/metagen_base/metagen_base_strings.c +++ /dev/null @@ -1,2446 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Third Party Includes - -#if !BUILD_SUPPLEMENTARY_UNIT -# define STB_SPRINTF_IMPLEMENTATION -# define STB_SPRINTF_STATIC -# include "third_party/stb/stb_sprintf.h" -#endif - -//////////////////////////////// -//~ NOTE(allen): String <-> Integer Tables - -read_only global U8 integer_symbols[16] = { - '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F', -}; - -// NOTE(allen): Includes reverses for uppercase and lowercase hex. -read_only global U8 integer_symbol_reverse[128] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -}; - -read_only global U8 base64[64] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - '_', '$', -}; - -read_only global U8 base64_reverse[128] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, - 0xFF,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, - 0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,0xFF,0xFF,0x3E, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, - 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, -}; - -//////////////////////////////// -//~ rjf: Character Classification & Conversion Functions - -internal B32 -char_is_space(U8 c){ - return(c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' || c == '\v'); -} - -internal B32 -char_is_upper(U8 c){ - return('A' <= c && c <= 'Z'); -} - -internal B32 -char_is_lower(U8 c){ - return('a' <= c && c <= 'z'); -} - -internal B32 -char_is_alpha(U8 c){ - return(char_is_upper(c) || char_is_lower(c)); -} - -internal B32 -char_is_slash(U8 c){ - return(c == '/' || c == '\\'); -} - -internal B32 -char_is_digit(U8 c, U32 base){ - B32 result = 0; - if (0 < base && base <= 16){ - U8 val = integer_symbol_reverse[c]; - if (val < base){ - result = 1; - } - } - return(result); -} - -internal U8 -char_to_lower(U8 c){ - if (char_is_upper(c)){ - c += ('a' - 'A'); - } - return(c); -} - -internal U8 -char_to_upper(U8 c){ - if (char_is_lower(c)){ - c += ('A' - 'a'); - } - return(c); -} - -internal U8 -char_to_correct_slash(U8 c){ - if(char_is_slash(c)){ - c = '/'; - } - return(c); -} - -//////////////////////////////// -//~ rjf: C-String Measurement - -internal U64 -cstring8_length(U8 *c){ - U8 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -internal U64 -cstring16_length(U16 *c){ - U16 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -internal U64 -cstring32_length(U32 *c){ - U32 *p = c; - for (;*p != 0; p += 1); - return(p - c); -} - -//////////////////////////////// -//~ rjf: String Constructors - -internal String8 -str8(U8 *str, U64 size){ - String8 result = {str, size}; - return(result); -} - -internal String8 -str8_range(U8 *first, U8 *one_past_last){ - String8 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String8 -str8_zero(void){ - String8 result = {0}; - return(result); -} - -internal String16 -str16(U16 *str, U64 size){ - String16 result = {str, size}; - return(result); -} - -internal String16 -str16_range(U16 *first, U16 *one_past_last){ - String16 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String16 -str16_zero(void){ - String16 result = {0}; - return(result); -} - -internal String32 -str32(U32 *str, U64 size){ - String32 result = {str, size}; - return(result); -} - -internal String32 -str32_range(U32 *first, U32 *one_past_last){ - String32 result = {first, (U64)(one_past_last - first)}; - return(result); -} - -internal String32 -str32_zero(void){ - String32 result = {0}; - return(result); -} - -internal String8 -str8_cstring(char *c){ - String8 result = {(U8*)c, cstring8_length((U8*)c)}; - return(result); -} - -internal String16 -str16_cstring(U16 *c){ - String16 result = {(U16*)c, cstring16_length((U16*)c)}; - return(result); -} - -internal String32 -str32_cstring(U32 *c){ - String32 result = {(U32*)c, cstring32_length((U32*)c)}; - return(result); -} - -internal String8 -str8_cstring_capped(void *cstr, void *cap) -{ - char *ptr = (char *)cstr; - char *opl = (char *)cap; - for (;ptr < opl && *ptr != 0; ptr += 1); - U64 size = (U64)(ptr - (char *)cstr); - String8 result = str8((U8*)cstr, size); - return result; -} - -internal String16 -str16_cstring_capped(void *cstr, void *cap) -{ - U16 *ptr = (U16 *)cstr; - U16 *opl = (U16 *)cap; - for (;ptr < opl && *ptr != 0; ptr += 1); - U64 size = (U64)(ptr - (U16 *)cstr); - String16 result = str16(cstr, size); - return result; -} - -internal String8 -str8_cstring_capped_reverse(void *raw_start, void *raw_cap) -{ - U8 *start = raw_start; - U8 *ptr = raw_cap; - for(; ptr > start; ) - { - ptr -= 1; - - if (*ptr == '\0') - { - break; - } - } - U64 size = (U64)(ptr - start); - String8 result = str8(start, size); - return result; -} - -//////////////////////////////// -//~ rjf: String Stylization - -internal String8 -upper_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_to_upper(string.str[idx]); - } - return string; -} - -internal String8 -lower_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_to_lower(string.str[idx]); - } - return string; -} - -internal String8 -backslashed_from_str8(Arena *arena, String8 string) -{ - string = push_str8_copy(arena, string); - for(U64 idx = 0; idx < string.size; idx += 1) - { - string.str[idx] = char_is_slash(string.str[idx]) ? '\\' : string.str[idx]; - } - return string; -} - -//////////////////////////////// -//~ rjf: String Matching - -internal B32 -str8_match(String8 a, String8 b, StringMatchFlags flags) -{ - B32 result = 0; - if(a.size == b.size && flags == 0) - { - result = MemoryMatch(a.str, b.str, b.size); - } - else if(a.size == b.size || (flags & StringMatchFlag_RightSideSloppy)) - { - B32 case_insensitive = (flags & StringMatchFlag_CaseInsensitive); - B32 slash_insensitive = (flags & StringMatchFlag_SlashInsensitive); - U64 size = Min(a.size, b.size); - result = 1; - for(U64 i = 0; i < size; i += 1) - { - U8 at = a.str[i]; - U8 bt = b.str[i]; - if(case_insensitive) - { - at = char_to_upper(at); - bt = char_to_upper(bt); - } - if(slash_insensitive) - { - at = char_to_correct_slash(at); - bt = char_to_correct_slash(bt); - } - if(at != bt) - { - result = 0; - break; - } - } - } - return result; -} - -internal U64 -str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags){ - U8 *p = string.str + start_pos; - U64 stop_offset = Max(string.size + 1, needle.size) - needle.size; - U8 *stop_p = string.str + stop_offset; - if (needle.size > 0){ - U8 *string_opl = string.str + string.size; - String8 needle_tail = str8_skip(needle, 1); - StringMatchFlags adjusted_flags = flags | StringMatchFlag_RightSideSloppy; - U8 needle_first_char_adjusted = needle.str[0]; - if(adjusted_flags & StringMatchFlag_CaseInsensitive){ - needle_first_char_adjusted = char_to_upper(needle_first_char_adjusted); - } - for (;p < stop_p; p += 1){ - U8 haystack_char_adjusted = *p; - if(adjusted_flags & StringMatchFlag_CaseInsensitive){ - haystack_char_adjusted = char_to_upper(haystack_char_adjusted); - } - if (haystack_char_adjusted == needle_first_char_adjusted){ - if (str8_match(str8_range(p + 1, string_opl), needle_tail, adjusted_flags)){ - break; - } - } - } - } - U64 result = string.size; - if (p < stop_p){ - result = (U64)(p - string.str); - } - return(result); -} - -internal U64 -str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags) -{ - U64 result = 0; - for(S64 i = string.size - start_pos - needle.size; i >= 0; --i) - { - String8 haystack = str8_substr(string, rng_1u64(i, i + needle.size)); - if(str8_match(haystack, needle, flags)) - { - result = (U64)i + needle.size; - break; - } - } - return result; -} - -internal B32 -str8_ends_with(String8 string, String8 end, StringMatchFlags flags){ - String8 postfix = str8_postfix(string, end.size); - B32 is_match = str8_match(end, postfix, flags); - return is_match; -} - -//////////////////////////////// -//~ rjf: String Slicing - -internal String8 -str8_substr(String8 str, Rng1U64 range){ - range.min = ClampTop(range.min, str.size); - range.max = ClampTop(range.max, str.size); - str.str += range.min; - str.size = dim_1u64(range); - return(str); -} - -internal String8 -str8_prefix(String8 str, U64 size){ - str.size = ClampTop(size, str.size); - return(str); -} - -internal String8 -str8_skip(String8 str, U64 amt){ - amt = ClampTop(amt, str.size); - str.str += amt; - str.size -= amt; - return(str); -} - -internal String8 -str8_postfix(String8 str, U64 size){ - size = ClampTop(size, str.size); - str.str = (str.str + str.size) - size; - str.size = size; - return(str); -} - -internal String8 -str8_chop(String8 str, U64 amt){ - amt = ClampTop(amt, str.size); - str.size -= amt; - return(str); -} - -internal String8 -str8_skip_chop_whitespace(String8 string){ - U8 *first = string.str; - U8 *opl = first + string.size; - for (;first < opl; first += 1){ - if (!char_is_space(*first)){ - break; - } - } - for (;opl > first;){ - opl -= 1; - if (!char_is_space(*opl)){ - opl += 1; - break; - } - } - String8 result = str8_range(first, opl); - return(result); -} - -//////////////////////////////// -//~ rjf: String Formatting & Copying - -internal String8 -push_str8_cat(Arena *arena, String8 s1, String8 s2){ - String8 str; - str.size = s1.size + s2.size; - str.str = push_array_no_zero(arena, U8, str.size + 1); - MemoryCopy(str.str, s1.str, s1.size); - MemoryCopy(str.str + s1.size, s2.str, s2.size); - str.str[str.size] = 0; - return(str); -} - -internal String8 -push_str8_copy(Arena *arena, String8 s){ - String8 str; - str.size = s.size; - str.str = push_array_no_zero(arena, U8, str.size + 1); - MemoryCopy(str.str, s.str, s.size); - str.str[str.size] = 0; - return(str); -} - -internal String8 -push_str8fv(Arena *arena, char *fmt, va_list args){ - va_list args2; - va_copy(args2, args); - U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1; - String8 result = {0}; - result.str = push_array_no_zero(arena, U8, needed_bytes); - result.size = raddbg_vsnprintf((char*)result.str, needed_bytes, fmt, args2); - result.str[result.size] = 0; - va_end(args2); - return(result); -} - -internal String8 -push_str8f(Arena *arena, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 result = push_str8fv(arena, fmt, args); - va_end(args); - return(result); -} - -//////////////////////////////// -//~ rjf: String <=> Integer Conversions - -//- rjf: string -> integer - -internal S64 -sign_from_str8(String8 string, String8 *string_tail){ - // count negative signs - U64 neg_count = 0; - U64 i = 0; - for (; i < string.size; i += 1){ - if (string.str[i] == '-'){ - neg_count += 1; - } - else if (string.str[i] != '+'){ - break; - } - } - - // output part of string after signs - *string_tail = str8_skip(string, i); - - // output integer sign - S64 sign = (neg_count & 1)?-1:+1; - return(sign); -} - -internal B32 -str8_is_integer(String8 string, U32 radix){ - B32 result = 0; - if (string.size > 0){ - if (1 < radix && radix <= 16){ - result = 1; - for (U64 i = 0; i < string.size; i += 1){ - U8 c = string.str[i]; - if (!(c < 0x80) || integer_symbol_reverse[c] >= radix){ - result = 0; - break; - } - } - } - } - return(result); -} - -internal U64 -u64_from_str8(String8 string, U32 radix){ - U64 x = 0; - if (1 < radix && radix <= 16){ - for (U64 i = 0; i < string.size; i += 1){ - x *= radix; - x += integer_symbol_reverse[string.str[i]&0x7F]; - } - } - return(x); -} - -internal S64 -s64_from_str8(String8 string, U32 radix){ - S64 sign = sign_from_str8(string, &string); - S64 x = (S64)u64_from_str8(string, radix) * sign; - return(x); -} - -internal U32 -u32_from_str8(String8 string, U32 radix) -{ - U64 x64 = u64_from_str8(string, radix); - U32 x32 = safe_cast_u32(x64); - return x32; -} - -internal S32 -s32_from_str8(String8 string, U32 radix) -{ - S64 x64 = s64_from_str8(string, radix); - S32 x32 = safe_cast_s32(x64); - return x32; -} - -internal B32 -try_u64_from_str8_c_rules(String8 string, U64 *x){ - B32 is_integer = 0; - if (str8_is_integer(string, 10)){ - is_integer = 1; - *x = u64_from_str8(string, 10); - } - else{ - String8 hex_string = str8_skip(string, 2); - if (str8_match(str8_prefix(string, 2), str8_lit("0x"), 0) && - str8_is_integer(hex_string, 0x10)){ - is_integer = 1; - *x = u64_from_str8(hex_string, 0x10); - } - else if (str8_match(str8_prefix(string, 2), str8_lit("0b"), 0) && - str8_is_integer(hex_string, 2)){ - is_integer = 1; - *x = u64_from_str8(hex_string, 2); - } - else{ - String8 oct_string = str8_skip(string, 1); - if (str8_match(str8_prefix(string, 1), str8_lit("0"), 0) && - str8_is_integer(hex_string, 010)){ - is_integer = 1; - *x = u64_from_str8(oct_string, 010); - } - } - } - return(is_integer); -} - -internal B32 -try_s64_from_str8_c_rules(String8 string, S64 *x){ - String8 string_tail = {0}; - S64 sign = sign_from_str8(string, &string_tail); - U64 x_u64 = 0; - B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64); - *x = x_u64*sign; - return(is_integer); -} - -//- rjf: integer -> string - -internal String8 -str8_from_memory_size(Arena *arena, U64 size) -{ - String8 result; - - if(size < KB(1)) - { - result = push_str8f(arena, "%llu Bytes", size); - } - else if(size < MB(1)) - { - result = push_str8f(arena, "%llu.%02llu KiB", size / KB(1), ((size * 100) / KB(1)) % 100); - } - else if(size < GB(1)) - { - result = push_str8f(arena, "%llu.%02llu MiB", size / MB(1), ((size * 100) / MB(1)) % 100); - } - else if(size < TB(1)) - { - result = push_str8f(arena, "%llu.%02llu GiB", size / GB(1), ((size * 100) / GB(1)) % 100); - } - else - { - result = push_str8f(arena, "%llu.%02llu TiB", size / TB(1), ((size * 100) / TB(1)) % 100); - } - - return result; -} - -internal String8 -str8_from_count(Arena *arena, U64 count) -{ - String8 result; - - if(count < 1 * 1000) - { - result = push_str8f(arena, "%llu", count); - } - else if(count < 1000000) - { - U64 frac = ((count * 100) / 1000) % 100; - if(frac > 0) - { - result = push_str8f(arena, "%llu.%02lluK", count / 1000, frac); - } - else - { - result = push_str8f(arena, "%lluK", count / 1000); - } - } - else if(count < 1000000000) - { - U64 frac = ((count * 100) / 1000000) % 100; - if(frac > 0) - { - result = push_str8f(arena, "%llu.%02lluM", count / 1000000, frac); - } - else - { - result = push_str8f(arena, "%lluM", count / 1000000); - } - } - else - { - U64 frac = ((count * 100) * 1000000000) % 100; - if(frac > 0) - { - result = push_str8f(arena, "%llu.%02lluB", count / 1000000000, frac); - } - else - { - result = push_str8f(arena, "%lluB", count / 1000000000, frac); - } - } - - return result; -} - -internal String8 -str8_from_bits_u32(Arena *arena, U32 x) -{ - U8 c0 = 'a' + ((x >> 28) & 0xf); - U8 c1 = 'a' + ((x >> 24) & 0xf); - U8 c2 = 'a' + ((x >> 20) & 0xf); - U8 c3 = 'a' + ((x >> 16) & 0xf); - U8 c4 = 'a' + ((x >> 12) & 0xf); - U8 c5 = 'a' + ((x >> 8) & 0xf); - U8 c6 = 'a' + ((x >> 4) & 0xf); - U8 c7 = 'a' + ((x >> 0) & 0xf); - String8 result = push_str8f(arena, "%c%c%c%c%c%c%c%c", c0, c1, c2, c3, c4, c5, c6, c7); - return result; -} - -internal String8 -str8_from_bits_u64(Arena *arena, U64 x) -{ - U8 c0 = 'a' + ((x >> 60) & 0xf); - U8 c1 = 'a' + ((x >> 56) & 0xf); - U8 c2 = 'a' + ((x >> 52) & 0xf); - U8 c3 = 'a' + ((x >> 48) & 0xf); - U8 c4 = 'a' + ((x >> 44) & 0xf); - U8 c5 = 'a' + ((x >> 40) & 0xf); - U8 c6 = 'a' + ((x >> 36) & 0xf); - U8 c7 = 'a' + ((x >> 32) & 0xf); - U8 c8 = 'a' + ((x >> 28) & 0xf); - U8 c9 = 'a' + ((x >> 24) & 0xf); - U8 ca = 'a' + ((x >> 20) & 0xf); - U8 cb = 'a' + ((x >> 16) & 0xf); - U8 cc = 'a' + ((x >> 12) & 0xf); - U8 cd = 'a' + ((x >> 8) & 0xf); - U8 ce = 'a' + ((x >> 4) & 0xf); - U8 cf = 'a' + ((x >> 0) & 0xf); - String8 result = push_str8f(arena, - "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", - c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf); - return result; -} - -internal String8 -str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator) -{ - String8 result = {0}; - { - // rjf: prefix - String8 prefix = {0}; - switch(radix) - { - case 16:{prefix = str8_lit("0x");}break; - case 8: {prefix = str8_lit("0o");}break; - case 2: {prefix = str8_lit("0b");}break; - } - - // rjf: determine # of chars between separators - U8 digit_group_size = 3; - switch(radix) - { - default:break; - case 2: - case 8: - case 16: - {digit_group_size = 4;}break; - } - - // rjf: prep - U64 needed_leading_0s = 0; - { - U64 needed_digits = 1; - { - U64 u64_reduce = u64; - for(;;) - { - u64_reduce /= radix; - if(u64_reduce == 0) - { - break; - } - needed_digits += 1; - } - } - needed_leading_0s = (min_digits > needed_digits) ? min_digits - needed_digits : 0; - U64 needed_separators = 0; - if(digit_group_separator != 0) - { - needed_separators = (needed_digits+needed_leading_0s)/digit_group_size; - if(needed_separators > 0 && (needed_digits+needed_leading_0s)%digit_group_size == 0) - { - needed_separators -= 1; - } - } - result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits; - result.str = push_array_no_zero(arena, U8, result.size + 1); - result.str[result.size] = 0; - } - - // rjf: fill contents - { - U64 u64_reduce = u64; - U64 digits_until_separator = digit_group_size; - for(U64 idx = 0; idx < result.size; idx += 1) - { - if(digits_until_separator == 0 && digit_group_separator != 0) - { - result.str[result.size - idx - 1] = digit_group_separator; - digits_until_separator = digit_group_size+1; - } - else - { - result.str[result.size - idx - 1] = char_to_lower(integer_symbols[u64_reduce%radix]); - u64_reduce /= radix; - } - digits_until_separator -= 1; - if(u64_reduce == 0) - { - break; - } - } - for(U64 leading_0_idx = 0; leading_0_idx < needed_leading_0s; leading_0_idx += 1) - { - result.str[prefix.size + leading_0_idx] = '0'; - } - } - - // rjf: fill prefix - if(prefix.size != 0) - { - MemoryCopy(result.str, prefix.str, prefix.size); - } - } - return result; -} - -internal String8 -str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator) -{ - String8 result = {0}; - // TODO(rjf): preeeeetty sloppy... - if(s64 < 0) - { - Temp scratch = scratch_begin(&arena, 1); - String8 numeric_part = str8_from_u64(scratch.arena, (U64)(-s64), radix, min_digits, digit_group_separator); - result = push_str8f(arena, "-%S", numeric_part); - scratch_end(scratch); - } - else - { - result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator); - } - return result; -} - -//////////////////////////////// -//~ rjf: String <=> Float Conversions - -internal F64 -f64_from_str8(String8 string) -{ - // TODO(rjf): crappy implementation for now that just uses atof. - F64 result = 0; - if(string.size > 0) - { - // rjf: find starting pos of numeric string, as well as sign - F64 sign = +1.0; - if(string.str[0] == '-') - { - sign = -1.0; - } - else if(string.str[0] == '+') - { - sign = 1.0; - } - - // rjf: gather numerics - U64 num_valid_chars = 0; - char buffer[64]; - B32 exp = 0; - for(U64 idx = 0; idx < string.size && num_valid_chars < sizeof(buffer)-1; idx += 1) - { - if(char_is_digit(string.str[idx], 10) || string.str[idx] == '.' || string.str[idx] == 'e' || - (exp && (string.str[idx] == '+' || string.str[idx] == '-'))) - { - buffer[num_valid_chars] = string.str[idx]; - num_valid_chars += 1; - exp = 0; - exp = (string.str[idx] == 'e'); - } - } - - // rjf: null-terminate (the reason for all of this!!!!!!) - buffer[num_valid_chars] = 0; - - // rjf: do final conversion - result = sign * atof(buffer); - } - return result; -} - -//////////////////////////////// -//~ rjf: String List Construction Functions - -internal String8Node* -str8_list_push_node(String8List *list, String8Node *node){ - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size += node->string.size; - return(node); -} - -internal String8Node* -str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string){ - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size += string.size; - node->string = string; - return(node); -} - -internal String8Node* -str8_list_push_node_front(String8List *list, String8Node *node){ - SLLQueuePushFront(list->first, list->last, node); - list->node_count += 1; - list->total_size += node->string.size; - return(node); -} - -internal String8Node* -str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string){ - SLLQueuePushFront(list->first, list->last, node); - list->node_count += 1; - list->total_size += string.size; - node->string = string; - return(node); -} - -internal String8Node* -str8_list_push(Arena *arena, String8List *list, String8 string){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - str8_list_push_node_set_string(list, node, string); - return(node); -} - -internal String8Node* -str8_list_push_front(Arena *arena, String8List *list, String8 string){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - str8_list_push_node_front_set_string(list, node, string); - return(node); -} - -internal void -str8_list_concat_in_place(String8List *list, String8List *to_push){ - if(to_push->node_count != 0){ - if (list->last){ - list->node_count += to_push->node_count; - list->total_size += to_push->total_size; - list->last->next = to_push->first; - list->last = to_push->last; - } - else{ - *list = *to_push; - } - MemoryZeroStruct(to_push); - } -} - -internal String8Node* -str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align){ - String8Node *node = push_array_no_zero(arena, String8Node, 1); - U64 new_size = list->total_size + min; - U64 increase_size = 0; - if (align > 1){ - // NOTE(allen): assert is power of 2 - Assert(((align - 1) & align) == 0); - U64 mask = align - 1; - new_size += mask; - new_size &= (~mask); - increase_size = new_size - list->total_size; - } - local_persist const U8 zeroes_buffer[64] = {0}; - Assert(increase_size <= ArrayCount(zeroes_buffer)); - SLLQueuePush(list->first, list->last, node); - list->node_count += 1; - list->total_size = new_size; - node->string.str = (U8*)zeroes_buffer; - node->string.size = increase_size; - return(node); -} - -internal String8Node* -str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(arena, fmt, args); - String8Node *result = str8_list_push(arena, list, string); - va_end(args); - return(result); -} - -internal String8Node* -str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...){ - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(arena, fmt, args); - String8Node *result = str8_list_push_front(arena, list, string); - va_end(args); - return(result); -} - -internal String8List -str8_list_copy(Arena *arena, String8List *list){ - String8List result = {0}; - for (String8Node *node = list->first; - node != 0; - node = node->next){ - String8Node *new_node = push_array_no_zero(arena, String8Node, 1); - String8 new_string = push_str8_copy(arena, node->string); - str8_list_push_node_set_string(&result, new_node, new_string); - } - return(result); -} - -internal String8List -str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags){ - String8List list = {0}; - - B32 keep_empties = (flags & StringSplitFlag_KeepEmpties); - - U8 *ptr = string.str; - U8 *opl = string.str + string.size; - for (;ptr < opl;){ - U8 *first = ptr; - for (;ptr < opl; ptr += 1){ - U8 c = *ptr; - B32 is_split = 0; - for (U64 i = 0; i < split_char_count; i += 1){ - if (split_chars[i] == c){ - is_split = 1; - break; - } - } - if (is_split){ - break; - } - } - - String8 string = str8_range(first, ptr); - if (keep_empties || string.size > 0){ - str8_list_push(arena, &list, string); - } - ptr += 1; - } - - return(list); -} - -internal String8List -str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags){ - String8List list = str8_split(arena, string, split_chars.str, split_chars.size, flags); - return list; -} - -internal String8List -str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags){ - String8List result = {0}; - for (String8Node *node = list.first; node != 0; node = node->next){ - String8List split = str8_split_by_string_chars(arena, node->string, split_chars, flags); - str8_list_concat_in_place(&result, &split); - } - return result; -} - -internal String8 -str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params){ - StringJoin join = {0}; - if (optional_params != 0){ - MemoryCopyStruct(&join, optional_params); - } - - U64 sep_count = 0; - if (list->node_count > 0){ - sep_count = list->node_count - 1; - } - - String8 result; - result.size = join.pre.size + join.post.size + sep_count*join.sep.size + list->total_size; - U8 *ptr = result.str = push_array_no_zero(arena, U8, result.size + 1); - - MemoryCopy(ptr, join.pre.str, join.pre.size); - ptr += join.pre.size; - for (String8Node *node = list->first; - node != 0; - node = node->next){ - MemoryCopy(ptr, node->string.str, node->string.size); - ptr += node->string.size; - if (node->next != 0){ - MemoryCopy(ptr, join.sep.str, join.sep.size); - ptr += join.sep.size; - } - } - MemoryCopy(ptr, join.post.str, join.post.size); - ptr += join.post.size; - - *ptr = 0; - - return(result); -} - -internal void -str8_list_from_flags(Arena *arena, String8List *list, - U32 flags, String8 *flag_string_table, U32 flag_string_count){ - for (U32 i = 0; i < flag_string_count; i += 1){ - U32 flag = (1 << i); - if (flags & flag){ - str8_list_push(arena, list, flag_string_table[i]); - } - } -} - -//////////////////////////////// -//~ rjf; String Arrays - -internal String8Array -str8_array_from_list(Arena *arena, String8List *list) -{ - String8Array array; - array.count = list->node_count; - array.v = push_array_no_zero(arena, String8, array.count); - U64 idx = 0; - for(String8Node *n = list->first; n != 0; n = n->next, idx += 1) - { - array.v[idx] = n->string; - } - return array; -} - -internal String8Array -str8_array_reserve(Arena *arena, U64 count) -{ - String8Array arr; - arr.count = 0; - arr.v = push_array(arena, String8, count); - return arr; -} - -//////////////////////////////// -//~ rjf: String Path Helpers - -internal String8 -str8_chop_last_slash(String8 string){ - if (string.size > 0){ - U8 *ptr = string.str + string.size - 1; - for (;ptr >= string.str; ptr -= 1){ - if (*ptr == '/' || *ptr == '\\'){ - break; - } - } - if (ptr >= string.str){ - string.size = (U64)(ptr - string.str); - } - else{ - string.size = 0; - } - } - return(string); -} - -internal String8 -str8_skip_last_slash(String8 string){ - if (string.size > 0){ - U8 *ptr = string.str + string.size - 1; - for (;ptr >= string.str; ptr -= 1){ - if (*ptr == '/' || *ptr == '\\'){ - break; - } - } - if (ptr >= string.str){ - ptr += 1; - string.size = (U64)(string.str + string.size - ptr); - string.str = ptr; - } - } - return(string); -} - -internal String8 -str8_chop_last_dot(String8 string) -{ - String8 result = string; - U64 p = string.size; - for (;p > 0;){ - p -= 1; - if (string.str[p] == '.'){ - result = str8_prefix(string, p); - break; - } - } - return(result); -} - -internal String8 -str8_skip_last_dot(String8 string){ - String8 result = string; - U64 p = string.size; - for (;p > 0;){ - p -= 1; - if (string.str[p] == '.'){ - result = str8_skip(string, p + 1); - break; - } - } - return(result); -} - -internal PathStyle -path_style_from_str8(String8 string){ - PathStyle result = PathStyle_Relative; - if (string.size >= 1 && string.str[0] == '/'){ - result = PathStyle_UnixAbsolute; - } - else if (string.size >= 2 && - char_is_alpha(string.str[0]) && - string.str[1] == ':'){ - if (string.size == 2 || - char_is_slash(string.str[2])){ - result = PathStyle_WindowsAbsolute; - } - } - return(result); -} - -internal String8List -str8_split_path(Arena *arena, String8 string){ - String8List result = str8_split(arena, string, (U8*)"/\\", 2, 0); - return(result); -} - -internal void -str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style){ - Temp scratch = scratch_begin(0, 0); - - String8MetaNode *stack = 0; - String8MetaNode *free_meta_node = 0; - String8Node *first = path->first; - - MemoryZeroStruct(path); - for (String8Node *node = first, *next = 0; - node != 0; - node = next){ - // save next now - next = node->next; - - // cases: - if (node == first && style == PathStyle_WindowsAbsolute){ - goto save_without_stack; - } - if (node->string.size == 1 && node->string.str[0] == '.'){ - goto do_nothing; - } - if (node->string.size == 2 && node->string.str[0] == '.' && node->string.str[1] == '.'){ - if (stack != 0){ - goto eliminate_stack_top; - } - else{ - goto save_without_stack; - } - } - goto save_with_stack; - - - // handlers: - save_with_stack: - { - str8_list_push_node(path, node); - - String8MetaNode *stack_node = free_meta_node; - if (stack_node != 0){ - SLLStackPop(free_meta_node); - } - else{ - stack_node = push_array_no_zero(scratch.arena, String8MetaNode, 1); - } - SLLStackPush(stack, stack_node); - stack_node->node = node; - - continue; - } - - save_without_stack: - { - str8_list_push_node(path, node); - - continue; - } - - eliminate_stack_top: - { - path->node_count -= 1; - path->total_size -= stack->node->string.size; - - SLLStackPop(stack); - - if (stack == 0){ - path->last = path->first; - } - else{ - path->last = stack->node; - } - continue; - } - - do_nothing: continue; - } - scratch_end(scratch); -} - -internal String8 -str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style){ - StringJoin params = {0}; - switch(style) - { - case PathStyle_Null:{}break; - case PathStyle_Relative: - case PathStyle_WindowsAbsolute: - { - params.sep = str8_lit("/"); - }break; - - case PathStyle_UnixAbsolute: - { - params.pre = str8_lit("/"); - params.sep = str8_lit("/"); - }break; - } - String8 result = str8_list_join(arena, path, ¶ms); - return result; -} - -internal String8TxtPtPair -str8_txt_pt_pair_from_string(String8 string) -{ - String8TxtPtPair pair = {0}; - { - String8 file_part = {0}; - String8 line_part = {0}; - String8 col_part = {0}; - - // rjf: grab file part - for(U64 idx = 0; idx <= string.size; idx += 1) - { - U8 byte = (idx < string.size) ? (string.str[idx]) : 0; - U8 next_byte = ((idx+1 < string.size) ? (string.str[idx+1]) : 0); - if(byte == ':' && next_byte != '/' && next_byte != '\\') - { - file_part = str8_prefix(string, idx); - line_part = str8_skip(string, idx+1); - break; - } - else if(byte == 0) - { - file_part = string; - break; - } - } - - // rjf: grab line/column - { - U64 colon_pos = str8_find_needle(line_part, 0, str8_lit(":"), 0); - if(colon_pos < line_part.size) - { - col_part = str8_skip(line_part, colon_pos+1); - line_part = str8_prefix(line_part, colon_pos); - } - } - - // rjf: convert line/column strings to numerics - U64 line = 0; - U64 column = 0; - try_u64_from_str8_c_rules(line_part, &line); - try_u64_from_str8_c_rules(col_part, &column); - - // rjf: fill - pair.string = file_part; - pair.pt = txt_pt((S64)line, (S64)column); - if(pair.pt.line == 0) { pair.pt.line = 1; } - if(pair.pt.column == 0) { pair.pt.column = 1; } - } - return pair; -} - -//////////////////////////////// -//~ rjf: UTF-8 & UTF-16 Decoding/Encoding - -read_only global U8 utf8_class[32] = { - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5, -}; - -internal UnicodeDecode -utf8_decode(U8 *str, U64 max){ - UnicodeDecode result = {1, max_U32}; - U8 byte = str[0]; - U8 byte_class = utf8_class[byte >> 3]; - switch (byte_class) - { - case 1: - { - result.codepoint = byte; - }break; - case 2: - { - if (2 < max) - { - U8 cont_byte = str[1]; - if (utf8_class[cont_byte >> 3] == 0) - { - result.codepoint = (byte & bitmask5) << 6; - result.codepoint |= (cont_byte & bitmask6); - result.inc = 2; - } - } - }break; - case 3: - { - if (2 < max) - { - U8 cont_byte[2] = {str[1], str[2]}; - if (utf8_class[cont_byte[0] >> 3] == 0 && - utf8_class[cont_byte[1] >> 3] == 0) - { - result.codepoint = (byte & bitmask4) << 12; - result.codepoint |= ((cont_byte[0] & bitmask6) << 6); - result.codepoint |= (cont_byte[1] & bitmask6); - result.inc = 3; - } - } - }break; - case 4: - { - if (3 < max) - { - U8 cont_byte[3] = {str[1], str[2], str[3]}; - if (utf8_class[cont_byte[0] >> 3] == 0 && - utf8_class[cont_byte[1] >> 3] == 0 && - utf8_class[cont_byte[2] >> 3] == 0) - { - result.codepoint = (byte & bitmask3) << 18; - result.codepoint |= ((cont_byte[0] & bitmask6) << 12); - result.codepoint |= ((cont_byte[1] & bitmask6) << 6); - result.codepoint |= (cont_byte[2] & bitmask6); - result.inc = 4; - } - } - } - } - return(result); -} - -internal UnicodeDecode -utf16_decode(U16 *str, U64 max){ - UnicodeDecode result = {1, max_U32}; - result.codepoint = str[0]; - result.inc = 1; - if (max > 1 && 0xD800 <= str[0] && str[0] < 0xDC00 && 0xDC00 <= str[1] && str[1] < 0xE000){ - result.codepoint = ((str[0] - 0xD800) << 10) | ((str[1] - 0xDC00) + 0x10000); - result.inc = 2; - } - return(result); -} - -internal U32 -utf8_encode(U8 *str, U32 codepoint){ - U32 inc = 0; - if (codepoint <= 0x7F){ - str[0] = (U8)codepoint; - inc = 1; - } - else if (codepoint <= 0x7FF){ - str[0] = (bitmask2 << 6) | ((codepoint >> 6) & bitmask5); - str[1] = bit8 | (codepoint & bitmask6); - inc = 2; - } - else if (codepoint <= 0xFFFF){ - str[0] = (bitmask3 << 5) | ((codepoint >> 12) & bitmask4); - str[1] = bit8 | ((codepoint >> 6) & bitmask6); - str[2] = bit8 | ( codepoint & bitmask6); - inc = 3; - } - else if (codepoint <= 0x10FFFF){ - str[0] = (bitmask4 << 4) | ((codepoint >> 18) & bitmask3); - str[1] = bit8 | ((codepoint >> 12) & bitmask6); - str[2] = bit8 | ((codepoint >> 6) & bitmask6); - str[3] = bit8 | ( codepoint & bitmask6); - inc = 4; - } - else{ - str[0] = '?'; - inc = 1; - } - return(inc); -} - -internal U32 -utf16_encode(U16 *str, U32 codepoint){ - U32 inc = 1; - if (codepoint == max_U32){ - str[0] = (U16)'?'; - } - else if (codepoint < 0x10000){ - str[0] = (U16)codepoint; - } - else{ - U32 v = codepoint - 0x10000; - str[0] = safe_cast_u16(0xD800 + (v >> 10)); - str[1] = safe_cast_u16(0xDC00 + (v & bitmask10)); - inc = 2; - } - return(inc); -} - -internal U32 -utf8_from_utf32_single(U8 *buffer, U32 character){ - return(utf8_encode(buffer, character)); -} - -//////////////////////////////// -//~ rjf: Unicode String Conversions - -internal String8 -str8_from_16(Arena *arena, String16 in) -{ - String8 result = str8_zero(); - if(in.size) - { - U64 cap = in.size*3; - U8 *str = push_array_no_zero(arena, U8, cap + 1); - U16 *ptr = in.str; - U16 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for(;ptr < opl; ptr += consume.inc) - { - consume = utf16_decode(ptr, opl - ptr); - size += utf8_encode(str + size, consume.codepoint); - } - str[size] = 0; - arena_pop(arena, (cap - size)); - result = str8(str, size); - } - return result; -} - -internal String16 -str16_from_8(Arena *arena, String8 in) -{ - String16 result = str16_zero(); - if(in.size) - { - U64 cap = in.size*2; - U16 *str = push_array_no_zero(arena, U16, cap + 1); - U8 *ptr = in.str; - U8 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for(;ptr < opl; ptr += consume.inc) - { - consume = utf8_decode(ptr, opl - ptr); - size += utf16_encode(str + size, consume.codepoint); - } - str[size] = 0; - arena_pop(arena, (cap - size)*2); - result = str16(str, size); - } - return result; -} - -internal String8 -str8_from_32(Arena *arena, String32 in) -{ - String8 result = str8_zero(); - if(in.size) - { - U64 cap = in.size*4; - U8 *str = push_array_no_zero(arena, U8, cap + 1); - U32 *ptr = in.str; - U32 *opl = ptr + in.size; - U64 size = 0; - for(;ptr < opl; ptr += 1) - { - size += utf8_encode(str + size, *ptr); - } - str[size] = 0; - arena_pop(arena, (cap - size)); - result = str8(str, size); - } - return result; -} - -internal String32 -str32_from_8(Arena *arena, String8 in) -{ - String32 result = str32_zero(); - if(in.size) - { - U64 cap = in.size; - U32 *str = push_array_no_zero(arena, U32, cap + 1); - U8 *ptr = in.str; - U8 *opl = ptr + in.size; - U64 size = 0; - UnicodeDecode consume; - for(;ptr < opl; ptr += consume.inc) - { - consume = utf8_decode(ptr, opl - ptr); - str[size] = consume.codepoint; - size += 1; - } - str[size] = 0; - arena_pop(arena, (cap - size)*4); - result = str32(str, size); - } - return result; -} - -//////////////////////////////// -//~ String -> Enum Conversions - -read_only global struct -{ - String8 string; - OperatingSystem os; -} g_os_enum_map[] = -{ - { str8_lit_comp(""), OperatingSystem_Null }, - { str8_lit_comp("Windows"), OperatingSystem_Windows, }, - { str8_lit_comp("Linux"), OperatingSystem_Linux, }, - { str8_lit_comp("Mac"), OperatingSystem_Mac, }, -}; -StaticAssert(ArrayCount(g_os_enum_map) == OperatingSystem_COUNT, g_os_enum_map_count_check); - -internal OperatingSystem -operating_system_from_string(String8 string) -{ - for(U64 i = 0; i < ArrayCount(g_os_enum_map); ++i) - { - if(str8_match(g_os_enum_map[i].string, string, StringMatchFlag_CaseInsensitive)) - { - return g_os_enum_map[i].os; - } - } - return OperatingSystem_Null; -} - -//////////////////////////////// -//~ rjf: Basic Types & Space Enum -> String Conversions - -internal String8 -string_from_dimension(Dimension dimension){ - local_persist String8 strings[] = { - str8_lit_comp("X"), - str8_lit_comp("Y"), - str8_lit_comp("Z"), - str8_lit_comp("W"), - }; - String8 result = str8_lit("error"); - if ((U32)dimension < 4){ - result = strings[dimension]; - } - return(result); -} - -internal String8 -string_from_side(Side side){ - local_persist String8 strings[] = { - str8_lit_comp("Min"), - str8_lit_comp("Max"), - }; - String8 result = str8_lit("error"); - if ((U32)side < 2){ - result = strings[side]; - } - return(result); -} - -internal String8 -string_from_operating_system(OperatingSystem os) -{ - String8 result = g_os_enum_map[OperatingSystem_Null].string; - if(os < ArrayCount(g_os_enum_map)) - { - result = g_os_enum_map[os].string; - } - return result; -} - -internal String8 -string_from_arch(Arch arch){ - local_persist String8 strings[] = { - str8_lit_comp("Null"), - str8_lit_comp("x64"), - str8_lit_comp("x86"), - str8_lit_comp("arm64"), - str8_lit_comp("arm32"), - }; - String8 result = str8_lit("error"); - if (arch < Arch_COUNT){ - result = strings[arch]; - } - return(result); -} - -//////////////////////////////// -//~ rjf: Time Types -> String - -internal String8 -string_from_week_day(WeekDay week_day){ - local_persist String8 strings[] = { - str8_lit_comp("Sun"), - str8_lit_comp("Mon"), - str8_lit_comp("Tue"), - str8_lit_comp("Wed"), - str8_lit_comp("Thu"), - str8_lit_comp("Fri"), - str8_lit_comp("Sat"), - }; - String8 result = str8_lit("Err"); - if ((U32)week_day < WeekDay_COUNT){ - result = strings[week_day]; - } - return(result); -} - -internal String8 -string_from_month(Month month){ - local_persist String8 strings[] = { - str8_lit_comp("Jan"), - str8_lit_comp("Feb"), - str8_lit_comp("Mar"), - str8_lit_comp("Apr"), - str8_lit_comp("May"), - str8_lit_comp("Jun"), - str8_lit_comp("Jul"), - str8_lit_comp("Aug"), - str8_lit_comp("Sep"), - str8_lit_comp("Oct"), - str8_lit_comp("Nov"), - str8_lit_comp("Dec"), - }; - String8 result = str8_lit("Err"); - if ((U32)month < Month_COUNT){ - result = strings[month]; - } - return(result); -} - -internal String8 -push_date_time_string(Arena *arena, DateTime *date_time){ - char *mon_str = (char*)string_from_month(date_time->month).str; - U32 adjusted_hour = date_time->hour%12; - if (adjusted_hour == 0){ - adjusted_hour = 12; - } - char *ampm = "am"; - if (date_time->hour >= 12){ - ampm = "pm"; - } - String8 result = push_str8f(arena, "%d %s %d, %02d:%02d:%02d %s", - date_time->day, mon_str, date_time->year, - adjusted_hour, date_time->min, date_time->sec, ampm); - return(result); -} - -internal String8 -push_file_name_date_time_string(Arena *arena, DateTime *date_time){ - char *mon_str = (char*)string_from_month(date_time->month).str; - String8 result = push_str8f(arena, "%d-%s-%0d--%02d-%02d-%02d", - date_time->year, mon_str, date_time->day, - date_time->hour, date_time->min, date_time->sec); - return(result); -} - -internal String8 -string_from_elapsed_time(Arena *arena, DateTime dt){ - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - if (dt.year){ - str8_list_pushf(scratch.arena, &list, "%dy", dt.year); - str8_list_pushf(scratch.arena, &list, "%um", dt.mon); - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } else if (dt.mon){ - str8_list_pushf(scratch.arena, &list, "%um", dt.mon); - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } else if (dt.day){ - str8_list_pushf(scratch.arena, &list, "%ud", dt.day); - } - str8_list_pushf(scratch.arena, &list, "%u:%u:%u:%u ms", dt.hour, dt.min, dt.sec, dt.msec); - StringJoin join = { str8_lit_comp(""), str8_lit_comp(" "), str8_lit_comp("") }; - String8 result = str8_list_join(arena, &list, &join); - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ Globally UNique Ids - -internal String8 -string_from_guid(Arena *arena, Guid guid) -{ - String8 result = push_str8f(arena, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", - guid.data1, - guid.data2, - guid.data3, - guid.data4[0], - guid.data4[1], - guid.data4[2], - guid.data4[3], - guid.data4[4], - guid.data4[5], - guid.data4[6], - guid.data4[7]); - return result; -} - -internal B32 -try_guid_from_string(String8 string, Guid *guid_out) -{ - Temp scratch = scratch_begin(0,0); - B32 is_parsed = 0; - String8List list = str8_split_by_string_chars(scratch.arena, string, str8_lit("-"), StringSplitFlag_KeepEmpties); - if(list.node_count == 5) - { - String8 data1_str = list.first->string; - String8 data2_str = list.first->next->string; - String8 data3_str = list.first->next->next->string; - String8 data4_hi_str = list.first->next->next->next->string; - String8 data4_lo_str = list.first->next->next->next->next->string; - if(str8_is_integer(data1_str, 16) && - str8_is_integer(data2_str, 16) && - str8_is_integer(data3_str, 16) && - str8_is_integer(data4_hi_str, 16) && - str8_is_integer(data4_lo_str, 16)) - { - U64 data1 = u64_from_str8(data1_str, 16); - U64 data2 = u64_from_str8(data2_str, 16); - U64 data3 = u64_from_str8(data3_str, 16); - U64 data4_hi = u64_from_str8(data4_hi_str, 16); - U64 data4_lo = u64_from_str8(data4_lo_str, 16); - if(data1 <= max_U32 && - data2 <= max_U16 && - data3 <= max_U16 && - data4_hi <= max_U16 && - data4_lo <= 0xffffffffffff) - { - guid_out->data1 = (U32)data1; - guid_out->data2 = (U16)data2; - guid_out->data3 = (U16)data3; - U64 data4 = (data4_hi << 48) | data4_lo; - MemoryCopy(&guid_out->data4[0], &data4, sizeof(data4)); - is_parsed = 1; - } - } - } - scratch_end(scratch); - return is_parsed; -} - -internal Guid -guid_from_string(String8 string) -{ - Guid guid = {0}; - try_guid_from_string(string, &guid); - return guid; -} - -//////////////////////////////// -//~ rjf: Basic Text Indentation - -internal String8 -indented_from_string(Arena *arena, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - read_only local_persist U8 indentation_bytes[] = " "; - String8List indented_strings = {0}; - S64 depth = 0; - S64 next_depth = 0; - U64 line_begin_off = 0; - for(U64 off = 0; off <= string.size; off += 1) - { - U8 byte = off width_this_line){ - String8 line = str8_substr(string, line_range); - if (wrapped_indent_level > 0){ - line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); - } - str8_list_push(arena, &list, line); - line_range = r1u64(line_range.max+1, candidate_line_range.max); - wrapped_indent_level = ClampTop(64, wrap_indent); - } - else{ - line_range = candidate_line_range; - } - } - } - if (line_range.min < string.size && line_range.max > line_range.min){ - String8 line = str8_substr(string, line_range); - if (wrapped_indent_level > 0){ - line = push_str8f(arena, "%.*s%S", wrapped_indent_level, spaces, line); - } - str8_list_push(arena, &list, line); - } - return list; -} - -//////////////////////////////// -//~ rjf: String <-> Color - -internal String8 -hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba) -{ - String8 hex_string = push_str8f(arena, "%02x%02x%02x%02x", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f)); - return hex_string; -} - -internal Vec4F32 -rgba_from_hex_string_4f32(String8 hex_string) -{ - U8 byte_text[8] = {0}; - U64 byte_text_idx = 0; - for(U64 idx = 0; idx < hex_string.size && byte_text_idx < ArrayCount(byte_text); idx += 1) - { - if(char_is_digit(hex_string.str[idx], 16)) - { - byte_text[byte_text_idx] = char_to_lower(hex_string.str[idx]); - byte_text_idx += 1; - } - } - U8 byte_vals[4] = {0}; - for(U64 idx = 0; idx < 4; idx += 1) - { - byte_vals[idx] = (U8)u64_from_str8(str8(&byte_text[idx*2], 2), 16); - } - Vec4F32 rgba = v4f32(byte_vals[0]/255.f, byte_vals[1]/255.f, byte_vals[2]/255.f, byte_vals[3]/255.f); - return rgba; -} - -//////////////////////////////// -//~ rjf: String Fuzzy Matching - -internal FuzzyMatchRangeList -fuzzy_match_find(Arena *arena, String8 needle, String8 haystack) -{ - FuzzyMatchRangeList result = {0}; - Temp scratch = scratch_begin(&arena, 1); - String8List needles = str8_split(scratch.arena, needle, (U8*)" ", 1, 0); - result.needle_part_count = needles.node_count; - for(String8Node *needle_n = needles.first; needle_n != 0; needle_n = needle_n->next) - { - U64 find_pos = 0; - for(;find_pos < haystack.size;) - { - find_pos = str8_find_needle(haystack, find_pos, needle_n->string, StringMatchFlag_CaseInsensitive); - B32 is_in_gathered_ranges = 0; - for(FuzzyMatchRangeNode *n = result.first; n != 0; n = n->next) - { - if(n->range.min <= find_pos && find_pos < n->range.max) - { - is_in_gathered_ranges = 1; - find_pos = n->range.max; - break; - } - } - if(!is_in_gathered_ranges) - { - break; - } - } - if(find_pos < haystack.size) - { - Rng1U64 range = r1u64(find_pos, find_pos+needle_n->string.size); - FuzzyMatchRangeNode *n = push_array(arena, FuzzyMatchRangeNode, 1); - n->range = range; - SLLQueuePush(result.first, result.last, n); - result.count += 1; - result.total_dim += dim_1u64(range); - } - } - scratch_end(scratch); - return result; -} - -internal FuzzyMatchRangeList -fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src) -{ - FuzzyMatchRangeList dst = {0}; - for(FuzzyMatchRangeNode *src_n = src->first; src_n != 0; src_n = src_n->next) - { - FuzzyMatchRangeNode *dst_n = push_array(arena, FuzzyMatchRangeNode, 1); - SLLQueuePush(dst.first, dst.last, dst_n); - dst_n->range = src_n->range; - } - dst.count = src->count; - dst.needle_part_count = src->needle_part_count; - dst.total_dim = src->total_dim; - return dst; -} - -//////////////////////////////// -//~ NOTE(allen): Serialization Helpers - -internal void -str8_serial_begin(Arena *arena, String8List *srl){ - String8Node *node = push_array(arena, String8Node, 1); - node->string.str = push_array_no_zero(arena, U8, 0); - srl->first = srl->last = node; - srl->node_count = 1; - srl->total_size = 0; -} - -internal String8 -str8_serial_end(Arena *arena, String8List *srl){ - U64 size = srl->total_size; - U8 *out = push_array_no_zero(arena, U8, size); - str8_serial_write_to_dst(srl, out); - String8 result = str8(out, size); - return result; -} - -internal void -str8_serial_write_to_dst(String8List *srl, void *out){ - U8 *ptr = (U8*)out; - for (String8Node *node = srl->first; - node != 0; - node = node->next){ - U64 size = node->string.size; - MemoryCopy(ptr, node->string.str, size); - ptr += size; - } -} - -internal U64 -str8_serial_push_align(Arena *arena, String8List *srl, U64 align){ - Assert(IsPow2(align)); - - U64 pos = srl->total_size; - U64 new_pos = AlignPow2(pos, align); - U64 size = (new_pos - pos); - - if(size != 0) - { - U8 *buf = push_array(arena, U8, size); - - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += size; - srl->total_size += size; - } - else{ - str8_list_push(arena, srl, str8(buf, size)); - } - } - return size; -} - -internal void * -str8_serial_push_size(Arena *arena, String8List *srl, U64 size) -{ - void *result = 0; - if(size != 0) - { - U8 *buf = push_array_no_zero(arena, U8, size); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += size; - srl->total_size += size; - } - else{ - str8_list_push(arena, srl, str8(buf, size)); - } - result = buf; - } - return result; -} - -internal void * -str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){ - void *result = str8_serial_push_size(arena, srl, size); - if(result != 0) - { - MemoryCopy(result, data, size); - } - return result; -} - -internal void -str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first){ - for (String8Node *node = first; - node != 0; - node = node->next){ - str8_serial_push_data(arena, srl, node->string.str, node->string.size); - } -} - -internal void -str8_serial_push_u64(Arena *arena, String8List *srl, U64 x){ - U8 *buf = push_array_no_zero(arena, U8, 8); - MemoryCopy(buf, &x, 8); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += 8; - srl->total_size += 8; - } - else{ - str8_list_push(arena, srl, str8(buf, 8)); - } -} - -internal void -str8_serial_push_u32(Arena *arena, String8List *srl, U32 x){ - U8 *buf = push_array_no_zero(arena, U8, 4); - MemoryCopy(buf, &x, 4); - String8 *str = &srl->last->string; - if (str->str + str->size == buf){ - srl->last->string.size += 4; - srl->total_size += 4; - } - else{ - str8_list_push(arena, srl, str8(buf, 4)); - } -} - -internal void -str8_serial_push_u16(Arena *arena, String8List *srl, U16 x){ - str8_serial_push_data(arena, srl, &x, sizeof(x)); -} - -internal void -str8_serial_push_u8(Arena *arena, String8List *srl, U8 x){ - str8_serial_push_data(arena, srl, &x, sizeof(x)); -} - -internal void -str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str){ - str8_serial_push_data(arena, srl, str.str, str.size); - str8_serial_push_u8(arena, srl, 0); -} - -internal void -str8_serial_push_string(Arena *arena, String8List *srl, String8 str){ - str8_serial_push_data(arena, srl, str.str, str.size); -} - -//////////////////////////////// -//~ rjf: Deserialization Helpers - -internal U64 -str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity) -{ - U64 bytes_left = string.size-Min(off, string.size); - U64 actually_readable_size = Min(bytes_left, read_size); - U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity; - if(legally_readable_size > 0) - { - MemoryCopy(read_dst, string.str+off, legally_readable_size); - } - return legally_readable_size; -} - -internal U64 -str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val) -{ - U64 cursor = off; - for (;;) { - U16 val = 0; - str8_deserial_read_struct(string, cursor, &val); - if (val == scan_val) { - break; - } - cursor += sizeof(val); - } - return cursor; -} - -internal void * -str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size) -{ - void *raw_ptr = 0; - if (off + size <= string.size) { - raw_ptr = string.str + off; - } - return raw_ptr; -} - -internal U64 -str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out) -{ - U64 cstr_size = 0; - if (off < string.size) { - U8 *ptr = string.str + off; - U8 *cap = string.str + string.size; - *cstr_out = str8_cstring_capped(ptr, cap); - cstr_size = (cstr_out->size + 1); - } - return cstr_size; -} - -internal U64 -str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out) -{ - U64 null_off = str8_deserial_find_first_match(string, off, 0); - U64 size = null_off - off; - U16 *str = (U16 *)str8_deserial_get_raw_ptr(string, off, size); - U64 count = size / sizeof(*str); - *str_out = str16(str, count); - - U64 read_size_with_null = size + sizeof(*str); - return read_size_with_null; -} - -internal U64 -str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out) -{ - Rng1U64 range = rng_1u64(off, off + size); - *block_out = str8_substr(string, range); - return block_out->size; -} - -internal U64 -str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) -{ - U64 value = 0; - U64 shift = 0; - U64 cursor = off; - for(;;) - { - U8 byte = 0; - U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - - if(bytes_read != sizeof(byte)) - { - break; - } - - U8 val = byte & 0x7fu; - value |= ((U64)val) << shift; - - cursor += bytes_read; - shift += 7u; - - if((byte & 0x80u) == 0) - { - break; - } - } - if(value_out != 0) - { - *value_out = value; - } - U64 bytes_read = cursor - off; - return bytes_read; -} - -internal U64 -str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) -{ - U64 value = 0; - U64 shift = 0; - U64 cursor = off; - for(;;) - { - U8 byte; - U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) - { - break; - } - - U8 val = byte & 0x7fu; - value |= ((U64)val) << shift; - - cursor += bytes_read; - shift += 7u; - - if((byte & 0x80u) == 0) - { - if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) - { - value |= -(S64)(1ull << shift); - } - break; - } - } - if(value_out != 0) - { - *value_out = value; - } - U64 bytes_read = cursor - off; - return bytes_read; -} - diff --git a/src/metagen/metagen_base/metagen_base_strings.h b/src/metagen/metagen_base/metagen_base_strings.h deleted file mode 100644 index fc946dd8..00000000 --- a/src/metagen/metagen_base/metagen_base_strings.h +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_STRINGS_H -#define BASE_STRINGS_H - -//////////////////////////////// -//~ rjf: Third Party Includes - -#define STB_SPRINTF_DECORATE(name) raddbg_##name -#include "third_party/stb/stb_sprintf.h" - -//////////////////////////////// -//~ rjf: String Types - -typedef struct String8 String8; -struct String8 -{ - U8 *str; - U64 size; -}; - -typedef struct String16 String16; -struct String16 -{ - U16 *str; - U64 size; -}; - -typedef struct String32 String32; -struct String32 -{ - U32 *str; - U64 size; -}; - -//////////////////////////////// -//~ rjf: String List & Array Types - -typedef struct String8Node String8Node; -struct String8Node -{ - String8Node *next; - String8 string; -}; - -typedef struct String8MetaNode String8MetaNode; -struct String8MetaNode -{ - String8MetaNode *next; - String8Node *node; -}; - -typedef struct String8List String8List; -struct String8List -{ - String8Node *first; - String8Node *last; - U64 node_count; - U64 total_size; -}; - -typedef struct String8Array String8Array; -struct String8Array -{ - String8 *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: String Matching, Splitting, & Joining Types - -typedef U32 StringMatchFlags; -enum -{ - StringMatchFlag_CaseInsensitive = (1 << 0), - StringMatchFlag_RightSideSloppy = (1 << 1), - StringMatchFlag_SlashInsensitive = (1 << 2), -}; - -typedef U32 StringSplitFlags; -enum -{ - StringSplitFlag_KeepEmpties = (1 << 0), -}; - -typedef enum PathStyle -{ - PathStyle_Null, - PathStyle_Relative, - PathStyle_WindowsAbsolute, - PathStyle_UnixAbsolute, - -#if OS_WINDOWS - PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute -#elif OS_LINUX - PathStyle_SystemAbsolute = PathStyle_UnixAbsolute -#else -# error "absolute path style is undefined for this OS" -#endif -} -PathStyle; - -typedef struct StringJoin StringJoin; -struct StringJoin -{ - String8 pre; - String8 sep; - String8 post; -}; - -//////////////////////////////// -//~ rjf: String Pair Types - -typedef struct String8TxtPtPair String8TxtPtPair; -struct String8TxtPtPair -{ - String8 string; - TxtPt pt; -}; - -//////////////////////////////// -//~ rjf: UTF Decoding Types - -typedef struct UnicodeDecode UnicodeDecode; -struct UnicodeDecode -{ - U32 inc; - U32 codepoint; -}; - -//////////////////////////////// -//~ rjf: String Fuzzy Matching Types - -typedef struct FuzzyMatchRangeNode FuzzyMatchRangeNode; -struct FuzzyMatchRangeNode -{ - FuzzyMatchRangeNode *next; - Rng1U64 range; -}; - -typedef struct FuzzyMatchRangeList FuzzyMatchRangeList; -struct FuzzyMatchRangeList -{ - FuzzyMatchRangeNode *first; - FuzzyMatchRangeNode *last; - U64 count; - U64 needle_part_count; - U64 total_dim; -}; - -//////////////////////////////// -//~ rjf: Character Classification & Conversion Functions - -internal B32 char_is_space(U8 c); -internal B32 char_is_upper(U8 c); -internal B32 char_is_lower(U8 c); -internal B32 char_is_alpha(U8 c); -internal B32 char_is_slash(U8 c); -internal B32 char_is_digit(U8 c, U32 base); -internal U8 char_to_lower(U8 c); -internal U8 char_to_upper(U8 c); -internal U8 char_to_correct_slash(U8 c); - -//////////////////////////////// -//~ rjf: C-String Measurement - -internal U64 cstring8_length(U8 *c); -internal U64 cstring16_length(U16 *c); -internal U64 cstring32_length(U32 *c); - -//////////////////////////////// -//~ rjf: String Constructors - -#define str8_lit(S) str8((U8*)(S), sizeof(S) - 1) -#define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,} -#define str8_varg(S) (int)((S).size), ((S).str) - -#define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C)) -#define str8_array_fixed(S) str8((U8*)(S), sizeof(S)) -#define str8_struct(S) str8((U8*)(S), sizeof(*(S))) - -internal String8 str8(U8 *str, U64 size); -internal String8 str8_range(U8 *first, U8 *one_past_last); -internal String8 str8_zero(void); -internal String16 str16(U16 *str, U64 size); -internal String16 str16_range(U16 *first, U16 *one_past_last); -internal String16 str16_zero(void); -internal String32 str32(U32 *str, U64 size); -internal String32 str32_range(U32 *first, U32 *one_past_last); -internal String32 str32_zero(void); -internal String8 str8_cstring(char *c); -internal String16 str16_cstring(U16 *c); -internal String32 str32_cstring(U32 *c); -internal String8 str8_cstring_capped(void *cstr, void *cap); -internal String16 str16_cstring_capped(void *cstr, void *cap); -internal String8 str8_cstring_capped_reverse(void *raw_start, void *raw_cap); - -//////////////////////////////// -//~ rjf: String Stylization - -internal String8 upper_from_str8(Arena *arena, String8 string); -internal String8 lower_from_str8(Arena *arena, String8 string); -internal String8 backslashed_from_str8(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: String Matching - -internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); -internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); -internal U64 str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); -internal B32 str8_ends_with(String8 string, String8 end, StringMatchFlags flags); - -//////////////////////////////// -//~ rjf: String Slicing - -internal String8 str8_substr(String8 str, Rng1U64 range); -internal String8 str8_prefix(String8 str, U64 size); -internal String8 str8_skip(String8 str, U64 amt); -internal String8 str8_postfix(String8 str, U64 size); -internal String8 str8_chop(String8 str, U64 amt); -internal String8 str8_skip_chop_whitespace(String8 string); - -//////////////////////////////// -//~ rjf: String Formatting & Copying - -internal String8 push_str8_cat(Arena *arena, String8 s1, String8 s2); -internal String8 push_str8_copy(Arena *arena, String8 s); -internal String8 push_str8fv(Arena *arena, char *fmt, va_list args); -internal String8 push_str8f(Arena *arena, char *fmt, ...); - -//////////////////////////////// -//~ rjf: String <=> Integer Conversions - -//- rjf: string -> integer -internal S64 sign_from_str8(String8 string, String8 *string_tail); -internal B32 str8_is_integer(String8 string, U32 radix); - -internal U64 u64_from_str8(String8 string, U32 radix); -internal S64 s64_from_str8(String8 string, U32 radix); -internal U32 u32_from_str8(String8 string, U32 radix); -internal S32 s32_from_str8(String8 string, U32 radix); -internal B32 try_u64_from_str8_c_rules(String8 string, U64 *x); -internal B32 try_s64_from_str8_c_rules(String8 string, S64 *x); - -//- rjf: integer -> string -internal String8 str8_from_memory_size(Arena *arena, U64 size); -internal String8 str8_from_count(Arena *arena, U64 count); -internal String8 str8_from_bits_u32(Arena *arena, U32 x); -internal String8 str8_from_bits_u64(Arena *arena, U64 x); -internal String8 str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator); -internal String8 str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator); - -//////////////////////////////// -//~ rjf: String <=> Float Conversions - -internal F64 f64_from_str8(String8 string); - -//////////////////////////////// -//~ rjf: String List Construction Functions - -internal String8Node* str8_list_push_node(String8List *list, String8Node *node); -internal String8Node* str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string); -internal String8Node* str8_list_push_node_front(String8List *list, String8Node *node); -internal String8Node* str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string); -internal String8Node* str8_list_push(Arena *arena, String8List *list, String8 string); -internal String8Node* str8_list_push_front(Arena *arena, String8List *list, String8 string); -internal void str8_list_concat_in_place(String8List *list, String8List *to_push); -internal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align); -internal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...); -internal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...); -internal String8List str8_list_copy(Arena *arena, String8List *list); -#define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero()) - -//////////////////////////////// -//~ rjf: String Splitting & Joining - -internal String8List str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags); -internal String8List str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags); -internal String8List str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags); -internal String8 str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params); -internal void str8_list_from_flags(Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count); - -//////////////////////////////// -//~ rjf; String Arrays - -internal String8Array str8_array_from_list(Arena *arena, String8List *list); -internal String8Array str8_array_reserve(Arena *arena, U64 count); - -//////////////////////////////// -//~ rjf: String Path Helpers - -internal String8 str8_chop_last_slash(String8 string); -internal String8 str8_skip_last_slash(String8 string); -internal String8 str8_chop_last_dot(String8 string); -internal String8 str8_skip_last_dot(String8 string); - -internal PathStyle path_style_from_str8(String8 string); -internal String8List str8_split_path(Arena *arena, String8 string); -internal void str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style); -internal String8 str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style); - -internal String8TxtPtPair str8_txt_pt_pair_from_string(String8 string); - -//////////////////////////////// -//~ rjf: UTF-8 & UTF-16 Decoding/Encoding - -internal UnicodeDecode utf8_decode(U8 *str, U64 max); -internal UnicodeDecode utf16_decode(U16 *str, U64 max); -internal U32 utf8_encode(U8 *str, U32 codepoint); -internal U32 utf16_encode(U16 *str, U32 codepoint); -internal U32 utf8_from_utf32_single(U8 *buffer, U32 character); - -//////////////////////////////// -//~ rjf: Unicode String Conversions - -internal String8 str8_from_16(Arena *arena, String16 in); -internal String16 str16_from_8(Arena *arena, String8 in); -internal String8 str8_from_32(Arena *arena, String32 in); -internal String32 str32_from_8(Arena *arena, String8 in); - -//////////////////////////////// -//~ String -> Enum Conversions - -internal OperatingSystem operating_system_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Basic Types & Space Enum -> String Conversions - -internal String8 string_from_dimension(Dimension dimension); -internal String8 string_from_side(Side side); -internal String8 string_from_operating_system(OperatingSystem os); -internal String8 string_from_arch(Arch arch); - -//////////////////////////////// -//~ rjf: Time Types -> String - -internal String8 string_from_week_day(WeekDay week_day); -internal String8 string_from_month(Month month); -internal String8 push_date_time_string(Arena *arena, DateTime *date_time); -internal String8 push_file_name_date_time_string(Arena *arena, DateTime *date_time); -internal String8 string_from_elapsed_time(Arena *arena, DateTime dt); - -//////////////////////////////// -//~ Globally Unique Ids - -internal String8 string_from_guid(Arena *arena, Guid guid); -internal B32 try_guid_from_string(String8 string, Guid *guid_out); -internal Guid guid_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Basic Text Indentation - -internal String8 indented_from_string(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: Text Escaping - -internal String8 escaped_from_raw_str8(Arena *arena, String8 string); -internal String8 raw_from_escaped_str8(Arena *arena, String8 string); - -//////////////////////////////// -//~ rjf: Text Wrapping - -internal String8List wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent); - -//////////////////////////////// -//~ rjf: String <-> Color - -internal String8 hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba); -internal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string); - -//////////////////////////////// -//~ rjf: String Fuzzy Matching - -internal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8 needle, String8 haystack); -internal FuzzyMatchRangeList fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src); - -//////////////////////////////// -//~ NOTE(allen): Serialization Helpers - -internal void str8_serial_begin(Arena *arena, String8List *srl); -internal String8 str8_serial_end(Arena *arena, String8List *srl); -internal void str8_serial_write_to_dst(String8List *srl, void *out); -internal U64 str8_serial_push_align(Arena *arena, String8List *srl, U64 align); -internal void * str8_serial_push_size(Arena *arena, String8List *srl, U64 size); -internal void * str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size); -internal void str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first); -internal void str8_serial_push_u64(Arena *arena, String8List *srl, U64 x); -internal void str8_serial_push_u32(Arena *arena, String8List *srl, U32 x); -internal void str8_serial_push_u16(Arena *arena, String8List *srl, U16 x); -internal void str8_serial_push_u8(Arena *arena, String8List *srl, U8 x); -internal void str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str); -internal void str8_serial_push_string(Arena *arena, String8List *srl, String8 str); -#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count)) -#define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1) - -//////////////////////////////// -//~ rjf: Deserialization Helpers - -internal U64 str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity); -internal U64 str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val); -internal void * str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size); -internal U64 str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out); -internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out); -internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); -internal U64 str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out); -internal U64 str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out); -#define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) -#define str8_deserial_read_struct(string, off, ptr) str8_deserial_read_array(string, off, ptr, 1) - -#endif // BASE_STRINGS_H diff --git a/src/metagen/metagen_base/metagen_base_thread_context.c b/src/metagen/metagen_base/metagen_base_thread_context.c deleted file mode 100644 index 1a3f84ed..00000000 --- a/src/metagen/metagen_base/metagen_base_thread_context.c +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -// NOTE(allen): Thread Context Functions - -C_LINKAGE thread_static TCTX* tctx_thread_local; -#if !BUILD_SUPPLEMENTARY_UNIT -C_LINKAGE thread_static TCTX* tctx_thread_local = 0; -#endif - -internal void -tctx_init_and_equip(TCTX *tctx){ - MemoryZeroStruct(tctx); - Arena **arena_ptr = tctx->arenas; - for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ - *arena_ptr = arena_alloc(); - } - tctx_thread_local = tctx; -} - -internal void -tctx_release(void) -{ - for(U64 i = 0; i < ArrayCount(tctx_thread_local->arenas); i += 1) - { - arena_release(tctx_thread_local->arenas[i]); - } -} - -internal TCTX* -tctx_get_equipped(void){ - return(tctx_thread_local); -} - -internal Arena* -tctx_get_scratch(Arena **conflicts, U64 count){ - TCTX *tctx = tctx_get_equipped(); - - Arena *result = 0; - Arena **arena_ptr = tctx->arenas; - for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){ - Arena **conflict_ptr = conflicts; - B32 has_conflict = 0; - for (U64 j = 0; j < count; j += 1, conflict_ptr += 1){ - if (*arena_ptr == *conflict_ptr){ - has_conflict = 1; - break; - } - } - if (!has_conflict){ - result = *arena_ptr; - break; - } - } - - return(result); -} - -internal void -tctx_set_thread_name(String8 string){ - TCTX *tctx = tctx_get_equipped(); - U64 size = ClampTop(string.size, sizeof(tctx->thread_name)); - MemoryCopy(tctx->thread_name, string.str, size); - tctx->thread_name_size = size; -} - -internal String8 -tctx_get_thread_name(void){ - TCTX *tctx = tctx_get_equipped(); - String8 result = str8(tctx->thread_name, tctx->thread_name_size); - return(result); -} - -internal void -tctx_write_srcloc(char *file_name, U64 line_number){ - TCTX *tctx = tctx_get_equipped(); - tctx->file_name = file_name; - tctx->line_number = line_number; -} - -internal void -tctx_read_srcloc(char **file_name, U64 *line_number){ - TCTX *tctx = tctx_get_equipped(); - *file_name = tctx->file_name; - *line_number = tctx->line_number; -} diff --git a/src/metagen/metagen_base/metagen_base_thread_context.h b/src/metagen/metagen_base/metagen_base_thread_context.h deleted file mode 100644 index b2515c93..00000000 --- a/src/metagen/metagen_base/metagen_base_thread_context.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef BASE_THREAD_CONTEXT_H -#define BASE_THREAD_CONTEXT_H - -//////////////////////////////// -// NOTE(allen): Thread Context - -typedef struct TCTX TCTX; -struct TCTX -{ - Arena *arenas[2]; - - U8 thread_name[32]; - U64 thread_name_size; - - char *file_name; - U64 line_number; -}; - -//////////////////////////////// -// NOTE(allen): Thread Context Functions - -internal void tctx_init_and_equip(TCTX *tctx); -internal void tctx_release(void); -internal TCTX* tctx_get_equipped(void); - -internal Arena* tctx_get_scratch(Arena **conflicts, U64 countt); - -internal void tctx_set_thread_name(String8 name); -internal String8 tctx_get_thread_name(void); - -internal void tctx_write_srcloc(char *file_name, U64 line_number); -internal void tctx_read_srcloc(char **file_name, U64 *line_number); -#define tctx_write_this_srcloc() tctx_write_srcloc(__FILE__, __LINE__) - -#define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count))) -#define scratch_end(scratch) temp_end(scratch) - -#endif // BASE_THREAD_CONTEXT_H diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 1c19ac5d..9d9a1e78 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -10,14 +10,12 @@ //~ rjf: Includes //- rjf: headers -#include "metagen/metagen_base/metagen_base_inc.h" -#include "metagen/metagen_os/metagen_os_inc.h" +#include "base/base_inc.h" #include "mdesk/mdesk.h" #include "metagen.h" //- rjf: impls -#include "metagen/metagen_base/metagen_base_inc.c" -#include "metagen/metagen_os/metagen_os_inc.c" +#include "base/base_inc.c" #include "mdesk/mdesk.c" #include "metagen.c" @@ -39,9 +37,9 @@ entry_point(CmdLine *cmdline) ////////////////////////////// //- rjf: extract paths // - String8 build_dir_path = os_get_process_info()->binary_path; + String8 build_dir_path = get_process_info()->binary_path; String8 project_dir_path = str8_chop_last_slash(build_dir_path); - String8 code_dir_path = push_str8f(mg_arena, "%S/src", project_dir_path); + String8 code_dir_path = str8f(mg_arena, "%S/src", project_dir_path); ////////////////////////////// //- rjf: search code directories for all files to consider @@ -60,8 +58,8 @@ entry_point(CmdLine *cmdline) Task *last_task = &start_task; for(Task *task = first_task; task != 0; task = task->next) { - OS_FileIter *it = os_file_iter_begin(mg_arena, task->path, 0); - for(OS_FileInfo info = {0}; os_file_iter_next(mg_arena, it, &info);) + FileIter *it = file_iter_begin(mg_arena, task->path, 0); + for(FileInfo info = {0}; file_iter_next(mg_arena, it, &info);) { String8 file_path = push_str8f(mg_arena, "%S/%S", task->path, info.name); if(info.props.flags & FilePropertyFlag_IsFolder) @@ -75,7 +73,7 @@ entry_point(CmdLine *cmdline) str8_list_push(mg_arena, &file_paths, file_path); } } - os_file_iter_end(it); + file_iter_end(it); } } @@ -91,7 +89,7 @@ entry_point(CmdLine *cmdline) String8 file_ext = str8_skip_last_dot(file_path); if(str8_match(file_ext, str8_lit("mdesk"), 0)) { - String8 data = os_data_from_file_path(mg_arena, file_path); + String8 data = data_from_file_path(mg_arena, file_path); MD_TokenizeResult tokenize = md_tokenize_from_text(mg_arena, data); MD_ParseResult parse = md_parse_from_text_tokens(mg_arena, file_path, data, tokenize.tokens); for(MD_Msg *m = parse.msgs.first; m != 0; m = m->next) @@ -421,7 +419,7 @@ entry_point(CmdLine *cmdline) { String8 layer_key = mg_layer_key_from_path(file->string); MG_Layer *layer = mg_layer_from_key(layer_key); - String8 data = os_data_from_file_path(mg_arena, node->first->string); + String8 data = data_from_file_path(mg_arena, node->first->string); String8 embed_string = mg_c_array_literal_contents_from_data(data); str8_list_pushf(mg_arena, &layer->h_tables, "read_only global U8 %S__data[] =\n{\n", node->string); str8_list_push (mg_arena, &layer->h_tables, embed_string); @@ -517,7 +515,7 @@ entry_point(CmdLine *cmdline) String8 gen_folder = str8_lit("generated"); layer_generated_folder = push_str8f(mg_arena, "%S/%S/%S", code_dir_path, layer->key, gen_folder); } - if(os_make_directory(layer_generated_folder)) + if(make_directory(layer_generated_folder)) { String8List layer_key_parts = str8_split_path(mg_arena, layer->key); StringJoin join = {0}; diff --git a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c deleted file mode 100644 index 23ec77cf..00000000 --- a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c +++ /dev/null @@ -1,1337 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Helpers - -internal DateTime -os_lnx_date_time_from_tm(tm in, U32 msec) -{ - DateTime dt = {0}; - dt.sec = in.tm_sec; - dt.min = in.tm_min; - dt.hour = in.tm_hour; - dt.day = in.tm_mday-1; - dt.mon = in.tm_mon; - dt.year = in.tm_year+1900; - dt.msec = msec; - return dt; -} - -internal tm -os_lnx_tm_from_date_time(DateTime dt) -{ - tm result = {0}; - result.tm_sec = dt.sec; - result.tm_min = dt.min; - result.tm_hour= dt.hour; - result.tm_mday= dt.day+1; - result.tm_mon = dt.mon; - result.tm_year= dt.year-1900; - return result; -} - -internal timespec -os_lnx_timespec_from_date_time(DateTime dt) -{ - tm tm_val = os_lnx_tm_from_date_time(dt); - time_t seconds = timegm(&tm_val); - timespec result = {0}; - result.tv_sec = seconds; - return result; -} - -internal DenseTime -os_lnx_dense_time_from_timespec(timespec in) -{ - DenseTime result = 0; - { - struct tm tm_time = {0}; - gmtime_r(&in.tv_sec, &tm_time); - DateTime date_time = os_lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1)); - result = dense_time_from_date_time(date_time); - } - return result; -} - -internal FileProperties -os_lnx_file_properties_from_stat(struct stat *s) -{ - FileProperties props = {0}; - props.size = s->st_size; - props.created = os_lnx_dense_time_from_timespec(s->st_ctim); - props.modified = os_lnx_dense_time_from_timespec(s->st_mtim); - if(s->st_mode & S_IFDIR) - { - props.flags |= FilePropertyFlag_IsFolder; - } - return props; -} - -internal void -os_lnx_safe_call_sig_handler(int x) -{ - OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain; - if(chain != 0 && chain->fail_handler != 0) - { - chain->fail_handler(chain->ptr); - } - abort(); -} - -//////////////////////////////// -//~ rjf: Entities - -internal OS_LNX_Entity * -os_lnx_entity_alloc(OS_LNX_EntityKind kind) -{ - OS_LNX_Entity *entity = 0; - DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), - pthread_mutex_unlock(&os_lnx_state.entity_mutex)) - { - entity = os_lnx_state.entity_free; - if(entity) - { - SLLStackPop(os_lnx_state.entity_free); - } - else - { - entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1); - } - } - MemoryZeroStruct(entity); - entity->kind = kind; - return entity; -} - -internal void -os_lnx_entity_release(OS_LNX_Entity *entity) -{ - DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex), - pthread_mutex_unlock(&os_lnx_state.entity_mutex)) - { - SLLStackPush(os_lnx_state.entity_free, entity); - } -} - -//////////////////////////////// -//~ rjf: Thread Entry Point - -internal void * -os_lnx_thread_entry_point(void *ptr) -{ - OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr; - OS_ThreadFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - TCTX tctx_; - tctx_init_and_equip(&tctx_); - func(thread_ptr); - tctx_release(); - return 0; -} - -//////////////////////////////// -//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) - -internal OS_SystemInfo * -os_get_system_info(void) -{ - return &os_lnx_state.system_info; -} - -internal OS_ProcessInfo * -os_get_process_info(void) -{ - return &os_lnx_state.process_info; -} - -internal String8 -os_get_current_path(Arena *arena) -{ - char *cwdir = getcwd(0, 0); - String8 string = push_str8_copy(arena, str8_cstring(cwdir)); - free(cwdir); - return string; -} - -internal U32 -os_get_process_start_time_unix(void) -{ - Temp scratch = scratch_begin(0,0); - U64 start_time = 0; - pid_t pid = getpid(); - String8 path = push_str8f(scratch.arena, "/proc/%u", pid); - struct stat st; - int err = stat((char*)path.str, &st); - if(err == 0) - { - start_time = st.st_mtime; - } - scratch_end(scratch); - return (U32)start_time; -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -//- rjf: basic - -internal void * -os_reserve(U64 size) -{ - void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - if(result == MAP_FAILED) - { - result = 0; - } - return result; -} - -internal B32 -os_commit(void *ptr, U64 size) -{ - mprotect(ptr, size, PROT_READ|PROT_WRITE); - return 1; -} - -internal void -os_decommit(void *ptr, U64 size) -{ - madvise(ptr, size, MADV_DONTNEED); - mprotect(ptr, size, PROT_NONE); -} - -internal void -os_release(void *ptr, U64 size) -{ - munmap(ptr, size); -} - -//- rjf: large pages - -internal void * -os_reserve_large(U64 size) -{ - void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0); - if(result == MAP_FAILED) - { - result = 0; - } - return result; -} - -internal B32 -os_commit_large(void *ptr, U64 size) -{ - mprotect(ptr, size, PROT_READ|PROT_WRITE); - return 1; -} - -//////////////////////////////// -//~ rjf: @os_hooks Thread Info (Implemented Per-OS) - -internal U32 -os_tid(void) -{ - U32 result = gettid(); - return result; -} - -internal void -os_set_thread_name(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String8 name_copy = push_str8_copy(scratch.arena, name); - pthread_t current_thread = pthread_self(); - pthread_setname_np(current_thread, (char *)name_copy.str); - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: @os_hooks Aborting (Implemented Per-OS) - -internal void -os_abort(S32 exit_code) -{ - exit(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); - int lnx_flags = 0; - if(flags & OS_AccessFlag_Read && flags & OS_AccessFlag_Write) - { - lnx_flags = O_RDWR; - } - else if(flags & OS_AccessFlag_Write) - { - lnx_flags = O_WRONLY; - } - else if(flags & OS_AccessFlag_Read) - { - lnx_flags = O_RDONLY; - } - if(flags & OS_AccessFlag_Append) - { - lnx_flags |= O_APPEND; - } - if(flags & (OS_AccessFlag_Write|OS_AccessFlag_Append)) - { - lnx_flags |= O_CREAT; - } - int fd = open((char *)path_copy.str, lnx_flags, 0755); - OS_Handle handle = {0}; - if(fd != -1) - { - handle.u64[0] = fd; - } - scratch_end(scratch); - return handle; -} - -internal void -os_file_close(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return; } - int fd = (int)file.u64[0]; - close(fd); -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - int fd = (int)file.u64[0]; - U64 total_num_bytes_to_read = dim_1u64(rng); - U64 total_num_bytes_read = 0; - U64 total_num_bytes_left_to_read = total_num_bytes_to_read; - for(;total_num_bytes_left_to_read > 0;) - { - int read_result = pread(fd, (U8 *)out_data + total_num_bytes_read, total_num_bytes_left_to_read, rng.min + total_num_bytes_read); - if(read_result >= 0) - { - total_num_bytes_read += read_result; - total_num_bytes_left_to_read -= read_result; - } - else if(errno != EINTR) - { - break; - } - } - return total_num_bytes_read; -} - -internal U64 -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - int fd = (int)file.u64[0]; - U64 total_num_bytes_to_write = dim_1u64(rng); - U64 total_num_bytes_written = 0; - U64 total_num_bytes_left_to_write = total_num_bytes_to_write; - for(;total_num_bytes_left_to_write > 0;) - { - int write_result = pwrite(fd, (U8 *)data + total_num_bytes_written, total_num_bytes_left_to_write, rng.min + total_num_bytes_written); - if(write_result >= 0) - { - total_num_bytes_written += write_result; - total_num_bytes_left_to_write -= write_result; - } - else if(errno != EINTR) - { - break; - } - } - return total_num_bytes_written; -} - -internal B32 -os_file_set_times(OS_Handle file, DateTime date_time) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - int fd = (int)file.u64[0]; - timespec time = os_lnx_timespec_from_date_time(date_time); - timespec times[2] = {time, time}; - int futimens_result = futimens(fd, times); - B32 good = (futimens_result != -1); - return good; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return (FileProperties){0}; } - int fd = (int)file.u64[0]; - struct stat fd_stat = {0}; - int fstat_result = fstat(fd, &fd_stat); - FileProperties props = {0}; - if(fstat_result != -1) - { - props = os_lnx_file_properties_from_stat(&fd_stat); - } - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return (OS_FileID){0}; } - int fd = (int)file.u64[0]; - struct stat fd_stat = {0}; - int fstat_result = fstat(fd, &fd_stat); - OS_FileID id = {0}; - if(fstat_result != -1) - { - id.v[0] = fd_stat.st_dev; - id.v[1] = fd_stat.st_ino; - } - return id; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = 0; - String8 path_copy = push_str8_copy(scratch.arena, path); - if(remove((char*)path_copy.str) != -1) - { - result = 1; - } - scratch_end(scratch); - return result; -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - B32 result = 0; - OS_Handle src_h = os_file_open(OS_AccessFlag_Read, src); - OS_Handle dst_h = os_file_open(OS_AccessFlag_Write, dst); - if(!os_handle_match(src_h, os_handle_zero()) && - !os_handle_match(dst_h, os_handle_zero())) - { - int src_fd = (int)src_h.u64[0]; - int dst_fd = (int)dst_h.u64[0]; - FileProperties src_props = os_properties_from_file(src_h); - U64 size = src_props.size; - U64 total_bytes_copied = 0; - U64 bytes_left_to_copy = size; - for(;bytes_left_to_copy > 0;) - { - off_t sendfile_off = total_bytes_copied; - int send_result = sendfile(dst_fd, src_fd, &sendfile_off, bytes_left_to_copy); - if(send_result <= 0) - { - break; - } - U64 bytes_copied = (U64)send_result; - bytes_left_to_copy -= bytes_copied; - total_bytes_copied += bytes_copied; - } - } - os_file_close(src_h); - os_file_close(dst_h); - return result; -} - -internal B32 -os_move_file_path(String8 dst, String8 src) -{ - // TODO(rjf) - return 0; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 path_copy = push_str8_copy(scratch.arena, path); - char buffer[PATH_MAX] = {0}; - realpath((char *)path_copy.str, buffer); - String8 result = push_str8_copy(arena, str8_cstring(buffer)); - scratch_end(scratch); - return result; -} - -internal B32 -os_file_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); - int access_result = access((char *)path_copy.str, F_OK); - B32 result = 0; - if(access_result == 0) - { - result = 1; - } - scratch_end(scratch); - return result; -} - -internal B32 -os_folder_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 exists = 0; - String8 path_copy = push_str8_copy(scratch.arena, path); - DIR *handle = opendir((char*)path_copy.str); - if(handle) - { - closedir(handle); - exists = 1; - } - scratch_end(scratch); - return exists; -} - -internal FileProperties -os_properties_from_file_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String8 path_copy = push_str8_copy(scratch.arena, path); - struct stat f_stat = {0}; - int stat_result = stat((char *)path_copy.str, &f_stat); - FileProperties props = {0}; - if(stat_result != -1) - { - props = os_lnx_file_properties_from_stat(&f_stat); - } - scratch_end(scratch); - return props; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - OS_Handle map = file; - return map; -} - -internal void -os_file_map_close(OS_Handle map) -{ - // NOTE(rjf): nothing to do; `map` handles are the same as `file` handles in - // the linux implementation (on Windows they require separate handles) -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - if(os_handle_match(map, os_handle_zero())) { return 0; } - int fd = (int)map.u64[0]; - int prot_flags = 0; - if(flags & OS_AccessFlag_Write) { prot_flags |= PROT_WRITE; } - if(flags & OS_AccessFlag_Read) { prot_flags |= PROT_READ; } - int map_flags = MAP_PRIVATE; - void *base = mmap(0, dim_1u64(range), prot_flags, map_flags, fd, range.min); - if(base == MAP_FAILED) - { - base = 0; - } - return base; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) -{ - munmap(ptr, dim_1u64(range)); -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - OS_FileIter *base_iter = push_array(arena, OS_FileIter, 1); - base_iter->flags = flags; - OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory; - { - String8 path_copy = push_str8_copy(arena, path); - iter->dir = opendir((char *)path_copy.str); - iter->path = path_copy; - } - return base_iter; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - B32 good = 0; - OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; - for(;;) - { - // rjf: get next entry - lnx_iter->dp = readdir(lnx_iter->dir); - good = (lnx_iter->dp != 0); - - // rjf: unpack entry info - struct stat st = {0}; - int stat_result = 0; - if(good) - { - Temp scratch = scratch_begin(&arena, 1); - String8 full_path = push_str8f(scratch.arena, "%S/%s", lnx_iter->path, lnx_iter->dp->d_name); - stat_result = stat((char *)full_path.str, &st); - scratch_end(scratch); - } - - // rjf: determine if filtered - B32 filtered = 0; - if(good) - { - filtered = ((st.st_mode == S_IFDIR && iter->flags & OS_FileIterFlag_SkipFolders) || - (st.st_mode == S_IFREG && iter->flags & OS_FileIterFlag_SkipFiles) || - (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == 0) || - (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == '.' && lnx_iter->dp->d_name[2] == 0)); - } - - // rjf: output & exit, if good & unfiltered - if(good && !filtered) - { - info_out->name = push_str8_copy(arena, str8_cstring(lnx_iter->dp->d_name)); - if(stat_result != -1) - { - info_out->props = os_lnx_file_properties_from_stat(&st); - } - break; - } - - // rjf: exit if not good - if(!good) - { - break; - } - } - return good; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory; - closedir(lnx_iter->dir); -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - B32 result = 0; - String8 path_copy = push_str8_copy(scratch.arena, path); - if(mkdir((char*)path_copy.str, 0755) != -1) - { - result = 1; - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR, 0); - ftruncate(id, size); - OS_Handle result = {(U64)id}; - scratch_end(scratch); - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String8 name_copy = push_str8_copy(scratch.arena, name); - int id = shm_open((char *)name_copy.str, O_RDWR, 0); - OS_Handle result = {(U64)id}; - scratch_end(scratch); - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())){return;} - int id = (int)handle.u64[0]; - close(id); -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - if(os_handle_match(handle, os_handle_zero())){return 0;} - int id = (int)handle.u64[0]; - void *base = mmap(0, dim_1u64(range), PROT_READ|PROT_WRITE, MAP_SHARED, id, range.min); - if(base == MAP_FAILED) - { - base = 0; - } - return base; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) -{ - if(os_handle_match(handle, os_handle_zero())){return;} - munmap(ptr, dim_1u64(range)); -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal U64 -os_now_microseconds(void) -{ - struct timespec t; - clock_gettime(CLOCK_MONOTONIC, &t); - U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1)); - return result; -} - -internal U32 -os_now_unix(void) -{ - time_t t = time(0); - return (U32)t; -} - -internal DateTime -os_now_universal_time(void) -{ - time_t t = 0; - time(&t); - struct tm universal_tm = {0}; - gmtime_r(&t, &universal_tm); - DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); - return result; -} - -internal DateTime -os_universal_time_from_local(DateTime *date_time) -{ - // rjf: local DateTime -> universal time_t - tm local_tm = os_lnx_tm_from_date_time(*date_time); - local_tm.tm_isdst = -1; - time_t universal_t = mktime(&local_tm); - - // rjf: universal time_t -> DateTime - tm universal_tm = {0}; - gmtime_r(&universal_t, &universal_tm); - DateTime result = os_lnx_date_time_from_tm(universal_tm, 0); - return result; -} - -internal DateTime -os_local_time_from_universal(DateTime *date_time) -{ - // rjf: universal DateTime -> local time_t - tm universal_tm = os_lnx_tm_from_date_time(*date_time); - universal_tm.tm_isdst = -1; - time_t universal_t = timegm(&universal_tm); - tm local_tm = {0}; - localtime_r(&universal_t, &local_tm); - - // rjf: local tm -> DateTime - DateTime result = os_lnx_date_time_from_tm(local_tm, 0); - return result; -} - -internal void -os_sleep_milliseconds(U32 msec) -{ - usleep(msec*Thousand(1)); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal OS_Handle -os_process_launch(OS_ProcessLaunchParams *params) -{ - NotImplemented; -} - -internal B32 -os_process_join(OS_Handle handle, U64 endt_us) -{ - NotImplemented; -} - -internal void -os_process_detach(OS_Handle handle) -{ - NotImplemented; -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle -os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread); - entity->thread.func = func; - entity->thread.ptr = ptr; - { - int pthread_result = pthread_create(&entity->thread.handle, 0, os_lnx_thread_entry_point, entity); - if(pthread_result == -1) - { - os_lnx_entity_release(entity); - entity = 0; - } - } - OS_Handle handle = {(U64)entity}; - return handle; -} - -internal B32 -os_thread_join(OS_Handle handle, U64 endt_us) -{ - if(os_handle_match(handle, os_handle_zero())) { return 0; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0]; - int join_result = pthread_join(entity->thread.handle, 0); - B32 result = (join_result == 0); - os_lnx_entity_release(entity); - return result; -} - -internal void -os_thread_detach(OS_Handle handle) -{ - if(os_handle_match(handle, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0]; - os_lnx_entity_release(entity); -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -//- rjf: mutexes - -internal OS_Handle -os_mutex_alloc(void) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex); - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - int init_result = pthread_mutex_init(&entity->mutex_handle, &attr); - pthread_mutexattr_destroy(&attr); - if(init_result == -1) - { - os_lnx_entity_release(entity); - entity = 0; - } - OS_Handle handle = {(U64)entity}; - return handle; -} - -internal void -os_mutex_release(OS_Handle mutex) -{ - if(os_handle_match(mutex, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; - pthread_mutex_destroy(&entity->mutex_handle); - os_lnx_entity_release(entity); -} - -internal void -os_mutex_take(OS_Handle mutex) -{ - if(os_handle_match(mutex, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; - pthread_mutex_lock(&entity->mutex_handle); -} - -internal void -os_mutex_drop(OS_Handle mutex) -{ - if(os_handle_match(mutex, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0]; - pthread_mutex_unlock(&entity->mutex_handle); -} - -//- rjf: reader/writer mutexes - -internal OS_Handle -os_rw_mutex_alloc(void) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex); - int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0); - if(init_result == -1) - { - os_lnx_entity_release(entity); - entity = 0; - } - OS_Handle handle = {(U64)entity}; - return handle; -} - -internal void -os_rw_mutex_release(OS_Handle rw_mutex) -{ - if(os_handle_match(rw_mutex, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; - pthread_rwlock_destroy(&entity->rwmutex_handle); - os_lnx_entity_release(entity); -} - -internal void -os_rw_mutex_take_r(OS_Handle rw_mutex) -{ - if(os_handle_match(rw_mutex, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; - pthread_rwlock_rdlock(&entity->rwmutex_handle); -} - -internal void -os_rw_mutex_drop_r(OS_Handle rw_mutex) -{ - if(os_handle_match(rw_mutex, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; - pthread_rwlock_unlock(&entity->rwmutex_handle); -} - -internal void -os_rw_mutex_take_w(OS_Handle rw_mutex) -{ - if(os_handle_match(rw_mutex, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; - pthread_rwlock_wrlock(&entity->rwmutex_handle); -} - -internal void -os_rw_mutex_drop_w(OS_Handle rw_mutex) -{ - if(os_handle_match(rw_mutex, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0]; - pthread_rwlock_unlock(&entity->rwmutex_handle); -} - -//- rjf: condition variables - -internal OS_Handle -os_condition_variable_alloc(void) -{ - OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable); - int init_result = pthread_cond_init(&entity->cv.cond_handle, 0); - if(init_result == -1) - { - os_lnx_entity_release(entity); - entity = 0; - } - int init2_result = 0; - if(entity) - { - init2_result = pthread_mutex_init(&entity->cv.rwlock_mutex_handle, 0); - } - if(init2_result == -1) - { - pthread_cond_destroy(&entity->cv.cond_handle); - os_lnx_entity_release(entity); - entity = 0; - } - OS_Handle handle = {(U64)entity}; - return handle; -} - -internal void -os_condition_variable_release(OS_Handle cv) -{ - if(os_handle_match(cv, os_handle_zero())) { return; } - OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0]; - pthread_cond_destroy(&entity->cv.cond_handle); - pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle); - os_lnx_entity_release(entity); -} - -internal B32 -os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us) -{ - if(os_handle_match(cv, os_handle_zero())) { return 0; } - if(os_handle_match(mutex, os_handle_zero())) { return 0; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0]; - struct timespec endt_timespec; - endt_timespec.tv_sec = endt_us/Million(1); - endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); - int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &mutex_entity->mutex_handle, &endt_timespec); - B32 result = (wait_result != ETIMEDOUT); - return result; -} - -internal B32 -os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack - // this together, but this would probably just be a lot better if we just - // implemented the primitives ourselves with e.g. futexes - // - if(os_handle_match(cv, os_handle_zero())) { return 0; } - if(os_handle_match(mutex_rw, os_handle_zero())) { return 0; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; - struct timespec endt_timespec; - endt_timespec.tv_sec = endt_us/Million(1); - endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); - B32 result = 0; - for(;;) - { - pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle); - int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec); - if(wait_result != ETIMEDOUT) - { - pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle); - pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); - result = 1; - break; - } - pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); - if(wait_result == ETIMEDOUT) - { - break; - } - } - return result; -} - -internal B32 -os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack - // this together, but this would probably just be a lot better if we just - // implemented the primitives ourselves with e.g. futexes - // - if(os_handle_match(cv, os_handle_zero())) { return 0; } - if(os_handle_match(mutex_rw, os_handle_zero())) { return 0; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0]; - struct timespec endt_timespec; - endt_timespec.tv_sec = endt_us/Million(1); - endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1)); - B32 result = 0; - for(;;) - { - pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle); - int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec); - if(wait_result != ETIMEDOUT) - { - pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle); - pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); - result = 1; - break; - } - pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle); - if(wait_result == ETIMEDOUT) - { - break; - } - } - return result; -} - -internal void -os_condition_variable_signal(OS_Handle cv) -{ - if(os_handle_match(cv, os_handle_zero())) { return; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - pthread_cond_signal(&cv_entity->cv.cond_handle); -} - -internal void -os_condition_variable_broadcast(OS_Handle cv) -{ - if(os_handle_match(cv, os_handle_zero())) { return; } - OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0]; - pthread_cond_broadcast(&cv_entity->cv.cond_handle); -} - -//- rjf: cross-process semaphores - -internal OS_Handle -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - OS_Handle result = {0}; - if (name.size > 0) { - // TODO: we need to allocate shared memory to store sem_t - NotImplemented; - } else { - sem_t *s = mmap(0, sizeof(*s), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - AssertAlways(s != MAP_FAILED); - int err = sem_init(s, 0, initial_count); - if (err == 0) { - result.u64[0] = (U64)s; - } - } - return result; -} - -internal void -os_semaphore_release(OS_Handle semaphore) -{ - int err = munmap((void*)semaphore.u64[0], sizeof(sem_t)); - AssertAlways(err == 0); -} - -internal OS_Handle -os_semaphore_open(String8 name) -{ - NotImplemented; -} - -internal void -os_semaphore_close(OS_Handle semaphore) -{ - NotImplemented; -} - -internal B32 -os_semaphore_take(OS_Handle semaphore, U64 endt_us) -{ - AssertAlways(endt_us == max_U64); - for (;;) { - int err = sem_wait((sem_t*)semaphore.u64[0]); - if (err == 0) { - break; - } else { - if (errno == EAGAIN) { - continue; - } - } - InvalidPath; - break; - } - return 1; -} - -internal void -os_semaphore_drop(OS_Handle semaphore) -{ - for (;;) { - int err = sem_post((sem_t*)semaphore.u64[0]); - if (err == 0) { - break; - } else { - if (errno == EAGAIN) { - continue; - } - } - InvalidPath; - break; - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str; - void *so = dlopen(path_cstr, RTLD_LAZY|RTLD_LOCAL); - OS_Handle lib = { (U64)so }; - scratch_end(scratch); - return lib; -} - -internal VoidProc* -os_library_load_proc(OS_Handle lib, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - void *so = (void *)lib.u64; - char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str; - VoidProc *proc = (VoidProc *)dlsym(so, name_cstr); - scratch_end(scratch); - return proc; -} - -internal void -os_library_close(OS_Handle lib) -{ - void *so = (void *)lib.u64; - dlclose(so); -} - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void -os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr) -{ - // rjf: push handler to chain - OS_LNX_SafeCallChain chain = {0}; - SLLStackPush(os_lnx_safe_call_chain, &chain); - chain.fail_handler = fail_handler; - chain.ptr = ptr; - - // rjf: set up sig handler info - struct sigaction new_act = {0}; - new_act.sa_handler = os_lnx_safe_call_sig_handler; - int signals_to_handle[] = - { - SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, - }; - struct sigaction og_act[ArrayCount(signals_to_handle)] = {0}; - - // rjf: attach handler info for all signals - for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) - { - sigaction(signals_to_handle[i], &new_act, &og_act[i]); - } - - // rjf: call function - func(ptr); - - // rjf: reset handler info for all signals - for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1) - { - sigaction(signals_to_handle[i], &og_act[i], 0); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal Guid -os_make_guid(void) -{ - Guid guid = {0}; - getrandom(guid.v, sizeof(guid.v), 0); - guid.data3 &= 0x0fff; - guid.data3 |= (4 << 12); - guid.data4[0] &= 0x3f; - guid.data4[0] |= 0x80; - return guid; -} - -//////////////////////////////// -//~ rjf: @os_hooks Entry Points (Implemented Per-OS) - -int -main(int argc, char **argv) -{ - //- rjf: set up OS layer - { - //- rjf: get statically-allocated system/process info - { - OS_SystemInfo *info = &os_lnx_state.system_info; - info->logical_processor_count = (U32)get_nprocs(); - info->page_size = (U64)getpagesize(); - info->large_page_size = MB(2); - info->allocation_granularity = info->page_size; - } - { - OS_ProcessInfo *info = &os_lnx_state.process_info; - info->pid = (U32)getpid(); - } - - //- rjf: set up thread context - local_persist TCTX tctx; - tctx_init_and_equip(&tctx); - - //- rjf: set up dynamically allocated state - os_lnx_state.arena = arena_alloc(); - os_lnx_state.entity_arena = arena_alloc(); - pthread_mutex_init(&os_lnx_state.entity_mutex, 0); - - //- rjf: grab dynamically allocated system info - { - Temp scratch = scratch_begin(0, 0); - OS_SystemInfo *info = &os_lnx_state.system_info; - - // rjf: get machine name - B32 got_final_result = 0; - U8 *buffer = 0; - int size = 0; - for(S64 cap = 4096, r = 0; r < 4; cap *= 2, r += 1) - { - scratch_end(scratch); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = gethostname((char*)buffer, cap); - if(size < cap) - { - got_final_result = 1; - break; - } - } - - // rjf: save name to info - if(got_final_result && size > 0) - { - info->machine_name.size = size; - info->machine_name.str = push_array_no_zero(os_lnx_state.arena, U8, info->machine_name.size + 1); - MemoryCopy(info->machine_name.str, buffer, info->machine_name.size); - info->machine_name.str[info->machine_name.size] = 0; - } - - scratch_end(scratch); - } - - //- rjf: grab dynamically allocated process info - { - Temp scratch = scratch_begin(0, 0); - OS_ProcessInfo *info = &os_lnx_state.process_info; - - // rjf: grab binary path - { - // rjf: get self string - B32 got_final_result = 0; - U8 *buffer = 0; - int size = 0; - for(S64 cap = PATH_MAX, r = 0; r < 4; cap *= 2, r += 1) - { - scratch_end(scratch); - buffer = push_array_no_zero(scratch.arena, U8, cap); - size = readlink("/proc/self/exe", (char*)buffer, cap); - if(size < cap) - { - got_final_result = 1; - break; - } - } - - // rjf: save - if(got_final_result && size > 0) - { - String8 full_name = str8(buffer, size); - String8 name_chopped = str8_chop_last_slash(full_name); - info->binary_path = push_str8_copy(os_lnx_state.arena, name_chopped); - } - } - - // rjf: grab initial directory - { - info->initial_path = os_get_current_path(os_lnx_state.arena); - } - - // rjf: grab home directory - { - char *home = getenv("HOME"); - info->user_program_data_path = str8_cstring(home); - } - - scratch_end(scratch); - } - } - - //- rjf: call into "real" entry point - main_thread_base_entry_point(argc, argv); -} diff --git a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h deleted file mode 100644 index c939f2bd..00000000 --- a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_CORE_LINUX_H -#define OS_CORE_LINUX_H - -//////////////////////////////// -//~ rjf: Includes - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -pid_t gettid(void); -int pthread_setname_np(pthread_t thread, const char *name); -int pthread_getname_np(pthread_t thread, char *name, size_t size); - -typedef struct tm tm; -typedef struct timespec timespec; - -//////////////////////////////// -//~ rjf: File Iterator - -typedef struct OS_LNX_FileIter OS_LNX_FileIter; -struct OS_LNX_FileIter -{ - DIR *dir; - struct dirent *dp; - String8 path; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check); - -//////////////////////////////// -//~ rjf: Safe Call Handler Chain - -typedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain; -struct OS_LNX_SafeCallChain -{ - OS_LNX_SafeCallChain *next; - OS_ThreadFunctionType *fail_handler; - void *ptr; -}; - -//////////////////////////////// -//~ rjf: Entities - -typedef enum OS_LNX_EntityKind -{ - OS_LNX_EntityKind_Thread, - OS_LNX_EntityKind_Mutex, - OS_LNX_EntityKind_RWMutex, - OS_LNX_EntityKind_ConditionVariable, -} -OS_LNX_EntityKind; - -typedef struct OS_LNX_Entity OS_LNX_Entity; -struct OS_LNX_Entity -{ - OS_LNX_Entity *next; - OS_LNX_EntityKind kind; - union - { - struct - { - pthread_t handle; - OS_ThreadFunctionType *func; - void *ptr; - } thread; - pthread_mutex_t mutex_handle; - pthread_rwlock_t rwmutex_handle; - struct - { - pthread_cond_t cond_handle; - pthread_mutex_t rwlock_mutex_handle; - } cv; - }; -}; - -//////////////////////////////// -//~ rjf: State - -typedef struct OS_LNX_State OS_LNX_State; -struct OS_LNX_State -{ - Arena *arena; - OS_SystemInfo system_info; - OS_ProcessInfo process_info; - pthread_mutex_t entity_mutex; - Arena *entity_arena; - OS_LNX_Entity *entity_free; -}; - -//////////////////////////////// -//~ rjf: Globals - -global OS_LNX_State os_lnx_state = {0}; -thread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0; - -//////////////////////////////// -//~ rjf: Helpers - -internal DateTime os_lnx_date_time_from_tm(tm in, U32 msec); -internal tm os_lnx_tm_from_date_time(DateTime dt); -internal timespec os_lnx_timespec_from_date_time(DateTime dt); -internal DenseTime os_lnx_dense_time_from_timespec(timespec in); -internal FileProperties os_lnx_file_properties_from_stat(struct stat *s); -internal void os_lnx_safe_call_sig_handler(int x); - -//////////////////////////////// -//~ rjf: Entities - -internal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind); -internal void os_lnx_entity_release(OS_LNX_Entity *entity); - -//////////////////////////////// -//~ rjf: Thread Entry Point - -internal void *os_lnx_thread_entry_point(void *ptr); - -#endif // OS_CORE_LINUX_H diff --git a/src/metagen/metagen_os/core/metagen_os_core.c b/src/metagen/metagen_os/core/metagen_os_core.c deleted file mode 100644 index 21a0a413..00000000 --- a/src/metagen/metagen_os/core/metagen_os_core.c +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Handle Type Functions (Helpers, Implemented Once) - -internal OS_Handle -os_handle_zero(void) -{ - OS_Handle handle = {0}; - return handle; -} - -internal B32 -os_handle_match(OS_Handle a, OS_Handle b) -{ - return a.u64[0] == b.u64[0]; -} - -internal void -os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle) -{ - OS_HandleNode *n = push_array(arena, OS_HandleNode, 1); - n->v = handle; - SLLQueuePush(handles->first, handles->last, n); - handles->count += 1; -} - -internal OS_HandleArray -os_handle_array_from_list(Arena *arena, OS_HandleList *list) -{ - OS_HandleArray result = {0}; - result.count = list->count; - result.v = push_array_no_zero(arena, OS_Handle, result.count); - U64 idx = 0; - for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1) - { - result.v[idx] = n->v; - } - return result; -} - -//////////////////////////////// -//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) - -internal String8List -os_string_list_from_argcv(Arena *arena, int argc, char **argv) -{ - String8List result = {0}; - for(int i = 0; i < argc; i += 1) - { - String8 str = str8_cstring(argv[i]); - str8_list_push(arena, &result, str); - } - return result; -} - -//////////////////////////////// -//~ rjf: Filesystem Helpers (Helpers, Implemented Once) - -internal String8 -os_data_from_file_path(Arena *arena, String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - FileProperties props = os_properties_from_file(file); - String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size)); - os_file_close(file); - return data; -} - -internal B32 -os_write_data_to_file_path(String8 path, String8 data) -{ - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - os_file_write(file, r1u64(0, data.size), data.str); - os_file_close(file); - } - return good; -} - -internal B32 -os_write_data_list_to_file_path(String8 path, String8List list) -{ - B32 good = 0; - OS_Handle file = os_file_open(OS_AccessFlag_Write, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - U64 off = 0; - for(String8Node *n = list.first; n != 0; n = n->next) - { - os_file_write(file, r1u64(off, off+n->string.size), n->string.str); - off += n->string.size; - } - os_file_close(file); - } - return good; -} - -internal B32 -os_append_data_to_file_path(String8 path, String8 data) -{ - B32 good = 0; - if(data.size != 0) - { - OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path); - if(!os_handle_match(file, os_handle_zero())) - { - good = 1; - U64 pos = os_properties_from_file(file).size; - os_file_write(file, r1u64(pos, pos+data.size), data.str); - os_file_close(file); - } - } - return good; -} - -internal OS_FileID -os_id_from_file_path(String8 path) -{ - OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path); - OS_FileID id = os_id_from_file(file); - os_file_close(file); - return id; -} - -internal S64 -os_file_id_compare(OS_FileID a, OS_FileID b) -{ - S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v)); - return cmp; -} - -internal String8 -os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range) -{ - U64 pre_pos = arena_pos(arena); - String8 result; - result.size = dim_1u64(range); - result.str = push_array_no_zero(arena, U8, result.size); - U64 actual_read_size = os_file_read(file, range, result.str); - if(actual_read_size < result.size) - { - arena_pop_to(arena, pre_pos + actual_read_size); - result.size = actual_read_size; - } - return result; -} - -//////////////////////////////// -//~ rjf: Process Launcher Helpers - -internal OS_Handle -os_cmd_line_launch(String8 string) -{ - Temp scratch = scratch_begin(0, 0); - U8 split_chars[] = {' '}; - String8List parts = str8_split(scratch.arena, string, split_chars, ArrayCount(split_chars), 0); - OS_Handle handle = {0}; - if(parts.node_count != 0) - { - // rjf: unpack exe part - String8 exe = parts.first->string; - String8 exe_folder = str8_chop_last_slash(exe); - if(exe_folder.size == 0) - { - exe_folder = os_get_current_path(scratch.arena); - } - - // rjf: find stdout delimiter - String8Node *stdout_delimiter_n = 0; - for(String8Node *n = parts.first; n != 0; n = n->next) - { - if(str8_match(n->string, str8_lit(">"), 0)) - { - stdout_delimiter_n = n; - break; - } - } - - // rjf: read stdout path - String8 stdout_path = {0}; - if(stdout_delimiter_n && stdout_delimiter_n->next) - { - stdout_path = stdout_delimiter_n->next->string; - } - - // rjf: open stdout handle - OS_Handle stdout_handle = {0}; - if(stdout_path.size != 0) - { - OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path); - os_file_close(file); - stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdout_path); - } - - // rjf: form command line - String8List cmdline = {0}; - for(String8Node *n = parts.first; n != stdout_delimiter_n && n != 0; n = n->next) - { - str8_list_push(scratch.arena, &cmdline, n->string); - } - - // rjf: launch - OS_ProcessLaunchParams params = {0}; - params.cmd_line = cmdline; - params.path = exe_folder; - params.inherit_env = 1; - params.stdout_file = stdout_handle; - handle = os_process_launch(¶ms); - - // rjf: close stdout handle - { - if(stdout_path.size != 0) - { - os_file_close(stdout_handle); - } - } - } - scratch_end(scratch); - return handle; -} - -internal OS_Handle -os_cmd_line_launchf(char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - OS_Handle result = os_cmd_line_launch(string); - va_end(args); - scratch_end(scratch); - return result; -} - diff --git a/src/metagen/metagen_os/core/metagen_os_core.h b/src/metagen/metagen_os/core/metagen_os_core.h deleted file mode 100644 index e3a02048..00000000 --- a/src/metagen/metagen_os/core/metagen_os_core.h +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_CORE_H -#define OS_CORE_H - -//////////////////////////////// -//~ rjf: System Info - -typedef struct OS_SystemInfo OS_SystemInfo; -struct OS_SystemInfo -{ - U32 logical_processor_count; - U64 page_size; - U64 large_page_size; - U64 allocation_granularity; - String8 machine_name; -}; - -//////////////////////////////// -//~ rjf: Process Info - -typedef struct OS_ProcessInfo OS_ProcessInfo; -struct OS_ProcessInfo -{ - U32 pid; - B32 large_pages_allowed; - String8 binary_path; - String8 initial_path; - String8 user_program_data_path; - String8List module_load_paths; - String8List environment; -}; - -//////////////////////////////// -//~ rjf: Access Flags - -typedef U32 OS_AccessFlags; -enum -{ - OS_AccessFlag_Read = (1<<0), - OS_AccessFlag_Write = (1<<1), - OS_AccessFlag_Execute = (1<<2), - OS_AccessFlag_Append = (1<<3), - OS_AccessFlag_ShareRead = (1<<4), - OS_AccessFlag_ShareWrite = (1<<5), - OS_AccessFlag_Inherited = (1<<6), -}; - -//////////////////////////////// -//~ rjf: Files - -typedef U32 OS_FileIterFlags; -enum -{ - OS_FileIterFlag_SkipFolders = (1 << 0), - OS_FileIterFlag_SkipFiles = (1 << 1), - OS_FileIterFlag_SkipHiddenFiles = (1 << 2), - OS_FileIterFlag_Done = (1 << 31), -}; - -typedef struct OS_FileIter OS_FileIter; -struct OS_FileIter -{ - OS_FileIterFlags flags; - U8 memory[800]; -}; - -typedef struct OS_FileInfo OS_FileInfo; -struct OS_FileInfo -{ - String8 name; - FileProperties props; -}; - -// nick: on-disk file identifier -typedef struct OS_FileID OS_FileID; -struct OS_FileID -{ - U64 v[3]; -}; - -//////////////////////////////// -//~ rjf: Handle Type - -typedef struct OS_Handle OS_Handle; -struct OS_Handle -{ - U64 u64[1]; -}; - -typedef struct OS_HandleNode OS_HandleNode; -struct OS_HandleNode -{ - OS_HandleNode *next; - OS_Handle v; -}; - -typedef struct OS_HandleList OS_HandleList; -struct OS_HandleList -{ - OS_HandleNode *first; - OS_HandleNode *last; - U64 count; -}; - -typedef struct OS_HandleArray OS_HandleArray; -struct OS_HandleArray -{ - OS_Handle *v; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Process Launch Parameters - -typedef struct OS_ProcessLaunchParams OS_ProcessLaunchParams; -struct OS_ProcessLaunchParams -{ - String8List cmd_line; - String8 path; - String8List env; - B32 inherit_env; - B32 debug_subprocesses; - B32 consoleless; - OS_Handle stdout_file; - OS_Handle stderr_file; - OS_Handle stdin_file; -}; - -//////////////////////////////// -//~ rjf: Thread Types - -typedef void OS_ThreadFunctionType(void *ptr); - -//////////////////////////////// -//~ rjf: Handle Type Functions (Helpers, Implemented Once) - -internal OS_Handle os_handle_zero(void); -internal B32 os_handle_match(OS_Handle a, OS_Handle b); -internal void os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle); -internal OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list); - -//////////////////////////////// -//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once) - -internal String8List os_string_list_from_argcv(Arena *arena, int argc, char **argv); - -//////////////////////////////// -//~ rjf: Filesystem Helpers (Helpers, Implemented Once) - -internal String8 os_data_from_file_path(Arena *arena, String8 path); -internal B32 os_write_data_to_file_path(String8 path, String8 data); -internal B32 os_write_data_list_to_file_path(String8 path, String8List list); -internal B32 os_append_data_to_file_path(String8 path, String8 data); -internal OS_FileID os_id_from_file_path(String8 path); -internal S64 os_file_id_compare(OS_FileID a, OS_FileID b); -internal String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range); - -//////////////////////////////// -//~ rjf: Process Launcher Helpers - -internal OS_Handle os_cmd_line_launch(String8 string); -internal OS_Handle os_cmd_line_launchf(char *fmt, ...); - -//////////////////////////////// -//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) - -internal OS_SystemInfo *os_get_system_info(void); -internal OS_ProcessInfo *os_get_process_info(void); -internal String8 os_get_current_path(Arena *arena); -internal U32 os_get_process_start_time_unix(void); - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -//- rjf: basic -internal void *os_reserve(U64 size); -internal B32 os_commit(void *ptr, U64 size); -internal void os_decommit(void *ptr, U64 size); -internal void os_release(void *ptr, U64 size); - -//- rjf: large pages -internal void *os_reserve_large(U64 size); -internal B32 os_commit_large(void *ptr, U64 size); - -//////////////////////////////// -//~ rjf: @os_hooks Thread Info (Implemented Per-OS) - -internal U32 os_tid(void); -internal void os_set_thread_name(String8 string); - -//////////////////////////////// -//~ rjf: @os_hooks Aborting (Implemented Per-OS) - -internal void os_abort(S32 exit_code); - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files -internal OS_Handle os_file_open(OS_AccessFlags flags, String8 path); -internal void os_file_close(OS_Handle file); -internal U64 os_file_read(OS_Handle file, Rng1U64 rng, void *out_data); -#define os_file_read_struct(f, off, ptr) os_file_read((f), r1u64((off), (off)+sizeof(*(ptr))), (ptr)) -internal U64 os_file_write(OS_Handle file, Rng1U64 rng, void *data); -internal B32 os_file_set_times(OS_Handle file, DateTime time); -internal FileProperties os_properties_from_file(OS_Handle file); -internal OS_FileID os_id_from_file(OS_Handle file); -internal B32 os_file_reserve_size(OS_Handle file, U64 size); -internal B32 os_delete_file_at_path(String8 path); -internal B32 os_copy_file_path(String8 dst, String8 src); -internal B32 os_move_file_path(String8 dst, String8 src); -internal String8 os_full_path_from_path(Arena *arena, String8 path); -internal B32 os_file_path_exists(String8 path); -internal B32 os_folder_path_exists(String8 path); -internal FileProperties os_properties_from_file_path(String8 path); - -//- rjf: file maps -internal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file); -internal void os_file_map_close(OS_Handle map); -internal void * os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range); -internal void os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range); - -//- rjf: directory iteration -internal OS_FileIter *os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags); -internal B32 os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out); -internal void os_file_iter_end(OS_FileIter *iter); - -//- rjf: directory creation -internal B32 os_make_directory(String8 path); - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle os_shared_memory_alloc(U64 size, String8 name); -internal OS_Handle os_shared_memory_open(String8 name); -internal void os_shared_memory_close(OS_Handle handle); -internal void * os_shared_memory_view_open(OS_Handle handle, Rng1U64 range); -internal void os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range); - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal U64 os_now_microseconds(void); -internal U32 os_now_unix(void); -internal DateTime os_now_universal_time(void); -internal DateTime os_universal_time_from_local(DateTime *local_time); -internal DateTime os_local_time_from_universal(DateTime *universal_time); -internal void os_sleep_milliseconds(U32 msec); - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal OS_Handle os_process_launch(OS_ProcessLaunchParams *params); -internal B32 os_process_join(OS_Handle handle, U64 endt_us); -internal void os_process_detach(OS_Handle handle); - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params); -internal B32 os_thread_join(OS_Handle handle, U64 endt_us); -internal void os_thread_detach(OS_Handle handle); - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -//- rjf: recursive mutexes -internal OS_Handle os_mutex_alloc(void); -internal void os_mutex_release(OS_Handle mutex); -internal void os_mutex_take(OS_Handle mutex); -internal void os_mutex_drop(OS_Handle mutex); - -//- rjf: reader/writer mutexes -internal OS_Handle os_rw_mutex_alloc(void); -internal void os_rw_mutex_release(OS_Handle rw_mutex); -internal void os_rw_mutex_take_r(OS_Handle mutex); -internal void os_rw_mutex_drop_r(OS_Handle mutex); -internal void os_rw_mutex_take_w(OS_Handle mutex); -internal void os_rw_mutex_drop_w(OS_Handle mutex); - -//- rjf: condition variables -internal OS_Handle os_condition_variable_alloc(void); -internal void os_condition_variable_release(OS_Handle cv); -// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout -internal B32 os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us); -internal B32 os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); -internal B32 os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us); -internal void os_condition_variable_signal(OS_Handle cv); -internal void os_condition_variable_broadcast(OS_Handle cv); - -//- rjf: cross-process semaphores -internal OS_Handle os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name); -internal void os_semaphore_release(OS_Handle semaphore); -internal OS_Handle os_semaphore_open(String8 name); -internal void os_semaphore_close(OS_Handle semaphore); -internal B32 os_semaphore_take(OS_Handle semaphore, U64 endt_us); -internal void os_semaphore_drop(OS_Handle semaphore); - -//- rjf: scope macros -#define OS_MutexScope(mutex) DeferLoop(os_mutex_take(mutex), os_mutex_drop(mutex)) -#define OS_MutexScopeR(mutex) DeferLoop(os_rw_mutex_take_r(mutex), os_rw_mutex_drop_r(mutex)) -#define OS_MutexScopeW(mutex) DeferLoop(os_rw_mutex_take_w(mutex), os_rw_mutex_drop_w(mutex)) -#define OS_MutexScopeRWPromote(mutex) DeferLoop((os_rw_mutex_drop_r(mutex), os_rw_mutex_take_w(mutex)), (os_rw_mutex_drop_w(mutex), os_rw_mutex_take_r(mutex))) - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle os_library_open(String8 path); -internal void os_library_close(OS_Handle lib); -internal VoidProc *os_library_load_proc(OS_Handle lib, String8 name); - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr); - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal Guid os_make_guid(void); - -//////////////////////////////// -//~ rjf: @os_hooks Entry Points (Implemented Per-OS) - -// NOTE(rjf): The implementation of `os_core` will define low-level entry -// points if BUILD_ENTRY_DEFINING_UNIT is defined to 1. These will call -// into the standard codebase program entry points, named "entry_point". - -#if BUILD_ENTRY_DEFINING_UNIT -internal void entry_point(CmdLine *cmdline); -#endif - -#endif // OS_CORE_H diff --git a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c b/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c deleted file mode 100644 index 6cc494f0..00000000 --- a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c +++ /dev/null @@ -1,1785 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Modern Windows SDK Functions -// -// (We must dynamically link to them, since they can be missing in older SDKs) - -typedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, PCWSTR lpThreadDescription); -global W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0; - -//////////////////////////////// -//~ rjf: File Info Conversion Helpers - -internal FilePropertyFlags -os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes) -{ - FilePropertyFlags flags = 0; - if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - flags |= FilePropertyFlag_IsFolder; - } - return flags; -} - -internal void -os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes) -{ - properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow); - os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime); - os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime); - properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes); -} - -//////////////////////////////// -//~ rjf: Time Conversion Helpers - -internal void -os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in) -{ - out->year = in->wYear; - out->mon = in->wMonth - 1; - out->wday = in->wDayOfWeek; - out->day = in->wDay; - out->hour = in->wHour; - out->min = in->wMinute; - out->sec = in->wSecond; - out->msec = in->wMilliseconds; -} - -internal void -os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in) -{ - out->wYear = (WORD)(in->year); - out->wMonth = in->mon + 1; - out->wDay = in->day; - out->wHour = in->hour; - out->wMinute = in->min; - out->wSecond = in->sec; - out->wMilliseconds = in->msec; -} - -internal void -os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in) -{ - SYSTEMTIME systime = {0}; - FileTimeToSystemTime(in, &systime); - DateTime date_time = {0}; - os_w32_date_time_from_system_time(&date_time, &systime); - *out = dense_time_from_date_time(date_time); -} - -internal U32 -os_w32_sleep_ms_from_endt_us(U64 endt_us) -{ - U32 sleep_ms = 0; - if(endt_us == max_U64) - { - sleep_ms = INFINITE; - } - else - { - U64 begint = os_now_microseconds(); - if(begint < endt_us) - { - U64 sleep_us = endt_us - begint; - sleep_ms = (U32)((sleep_us + 999)/1000); - } - } - return sleep_ms; -} - -internal U32 -os_w32_unix_time_from_file_time(FILETIME file_time) -{ - U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime; - U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000); - - Assert(unix_time64 <= max_U32); - U32 unix_time32 = (U32)unix_time64; - - return unix_time32; -} - -//////////////////////////////// -//~ rjf: Entity Functions - -internal OS_W32_Entity * -os_w32_entity_alloc(OS_W32_EntityKind kind) -{ - OS_W32_Entity *result = 0; - EnterCriticalSection(&os_w32_state.entity_mutex); - { - result = os_w32_state.entity_free; - if(result) - { - SLLStackPop(os_w32_state.entity_free); - } - else - { - result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1); - } - MemoryZeroStruct(result); - } - LeaveCriticalSection(&os_w32_state.entity_mutex); - result->kind = kind; - return result; -} - -internal void -os_w32_entity_release(OS_W32_Entity *entity) -{ - entity->kind = OS_W32_EntityKind_Null; - EnterCriticalSection(&os_w32_state.entity_mutex); - SLLStackPush(os_w32_state.entity_free, entity); - LeaveCriticalSection(&os_w32_state.entity_mutex); -} - -//////////////////////////////// -//~ rjf: Thread Entry Point - -internal DWORD -os_w32_thread_entry_point(void *ptr) -{ - OS_W32_Entity *entity = (OS_W32_Entity *)ptr; - OS_ThreadFunctionType *func = entity->thread.func; - void *thread_ptr = entity->thread.ptr; - TCTX tctx_; - tctx_init_and_equip(&tctx_); - func(thread_ptr); - tctx_release(); - return 0; -} - -//////////////////////////////// -//~ rjf: @os_hooks System/Process Info (Implemented Per-OS) - -internal OS_SystemInfo * -os_get_system_info(void) -{ - return &os_w32_state.system_info; -} - -internal OS_ProcessInfo * -os_get_process_info(void) -{ - return &os_w32_state.process_info; -} - -internal String8 -os_get_current_path(Arena *arena) -{ - Temp scratch = scratch_begin(&arena, 1); - DWORD length = GetCurrentDirectoryW(0, 0); - U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1); - length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory); - String8 name = str8_from_16(arena, str16(memory, length)); - scratch_end(scratch); - return name; -} - -internal U32 -os_get_process_start_time_unix(void) -{ - HANDLE handle = GetCurrentProcess(); - FILETIME start_time = {0}; - FILETIME exit_time; - FILETIME kernel_time; - FILETIME user_time; - if(GetProcessTimes(handle, &start_time, &exit_time, &kernel_time, &user_time)) - { - return os_w32_unix_time_from_file_time(start_time); - } - return 0; -} - -//////////////////////////////// -//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS) - -//- rjf: basic - -internal void * -os_reserve(U64 size) -{ - void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); - return result; -} - -internal B32 -os_commit(void *ptr, U64 size) -{ - B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0); - return result; -} - -internal void -os_decommit(void *ptr, U64 size) -{ - VirtualFree(ptr, size, MEM_DECOMMIT); -} - -internal void -os_release(void *ptr, U64 size) -{ - // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes. - VirtualFree(ptr, 0, MEM_RELEASE); -} - -//- rjf: large pages - -internal void * -os_reserve_large(U64 size) -{ - // we commit on reserve because windows - void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE); - return result; -} - -internal B32 -os_commit_large(void *ptr, U64 size) -{ - return 1; -} - -//////////////////////////////// -//~ rjf: @os_hooks Thread Info (Implemented Per-OS) - -internal U32 -os_tid(void) -{ - DWORD id = GetCurrentThreadId(); - return (U32)id; -} - -internal void -os_set_thread_name(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - - // rjf: windows 10 style - if(w32_SetThreadDescription_func) - { - String16 name16 = str16_from_8(scratch.arena, name); - HRESULT hr = w32_SetThreadDescription_func(GetCurrentThread(), (WCHAR*)name16.str); - } - - // rjf: raise-exception style - { - String8 name_copy = push_str8_copy(scratch.arena, name); -#pragma pack(push,8) - typedef struct THREADNAME_INFO THREADNAME_INFO; - struct THREADNAME_INFO - { - U32 dwType; // Must be 0x1000. - char *szName; // Pointer to name (in user addr space). - U32 dwThreadID; // Thread ID (-1=caller thread). - U32 dwFlags; // Reserved for future use, must be zero. - }; -#pragma pack(pop) - THREADNAME_INFO info; - info.dwType = 0x1000; - info.szName = (char *)name_copy.str; - info.dwThreadID = os_tid(); - info.dwFlags = 0; -#pragma warning(push) -#pragma warning(disable: 6320 6322) - __try - { - RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } -#pragma warning(pop) - } - - scratch_end(scratch); -} - -//////////////////////////////// -//~ rjf: @os_hooks Aborting (Implemented Per-OS) - -internal void -os_abort(S32 exit_code) -{ - ExitProcess(exit_code); -} - -//////////////////////////////// -//~ rjf: @os_hooks File System (Implemented Per-OS) - -//- rjf: files - -internal OS_Handle -os_file_open(OS_AccessFlags flags, String8 path) -{ - OS_Handle result = {0}; - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD access_flags = 0; - DWORD share_mode = 0; - DWORD creation_disposition = OPEN_EXISTING; - SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0}; - if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;} - if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;} - if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;} - if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;} - if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;} - if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;} - if(flags & OS_AccessFlag_Append) {creation_disposition = OPEN_ALWAYS; access_flags |= FILE_APPEND_DATA; } - if(flags & OS_AccessFlag_Inherited) - { - security_attributes.bInheritHandle = 1; - } - HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, &security_attributes, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0); - if(file != INVALID_HANDLE_VALUE) - { - result.u64[0] = (U64)file; - } - scratch_end(scratch); - return result; -} - -internal void -os_file_close(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { return; } - HANDLE handle = (HANDLE)file.u64[0]; - BOOL result = CloseHandle(handle); - (void)result; -} - -internal U64 -os_file_read(OS_Handle file, Rng1U64 rng, void *out_data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - HANDLE handle = (HANDLE)file.u64[0]; - - // rjf: clamp range by file size - U64 size = 0; - GetFileSizeEx(handle, (LARGE_INTEGER *)&size); - Rng1U64 rng_clamped = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size)); - U64 total_read_size = 0; - - // rjf: read loop - { - U64 to_read = dim_1u64(rng_clamped); - for(U64 off = rng.min; total_read_size < to_read;) - { - U64 amt64 = to_read - total_read_size; - U32 amt32 = u32_from_u64_saturate(amt64); - DWORD read_size = 0; - OVERLAPPED overlapped = {0}; - overlapped.Offset = (off&0x00000000ffffffffull); - overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32; - ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped); - off += read_size; - total_read_size += read_size; - if(read_size != amt32) - { - break; - } - } - } - - return total_read_size; -} - -internal U64 -os_file_write(OS_Handle file, Rng1U64 rng, void *data) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - HANDLE win_handle = (HANDLE)file.u64[0]; - U64 src_off = 0; - U64 dst_off = rng.min; - U64 total_write_size = dim_1u64(rng); - for(;;) - { - void *bytes_src = (U8 *)data + src_off; - U64 bytes_left = total_write_size - src_off; - DWORD write_size = Min(MB(1), bytes_left); - DWORD bytes_written = 0; - OVERLAPPED overlapped = {0}; - overlapped.Offset = (dst_off&0x00000000ffffffffull); - overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32; - BOOL success = WriteFile(win_handle, bytes_src, write_size, &bytes_written, &overlapped); - if(success == 0) - { - break; - } - src_off += bytes_written; - dst_off += bytes_written; - if(bytes_left == 0) - { - break; - } - } - return src_off; -} - -internal B32 -os_file_set_time(OS_Handle file, DateTime time) -{ - if(os_handle_match(file, os_handle_zero())) { return 0; } - B32 result = 0; - HANDLE handle = (HANDLE)file.u64[0]; - SYSTEMTIME system_time = {0}; - os_w32_system_time_from_date_time(&system_time, &time); - FILETIME file_time = {0}; - result = (SystemTimeToFileTime(&system_time, &file_time) && - SetFileTime(handle, &file_time, &file_time, &file_time)); - return result; -} - -internal FileProperties -os_properties_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { FileProperties r = {0}; return r; } - FileProperties props = {0}; - HANDLE handle = (HANDLE)file.u64[0]; - BY_HANDLE_FILE_INFORMATION info; - BOOL info_good = GetFileInformationByHandle(handle, &info); - if(info_good) - { - U32 size_lo = info.nFileSizeLow; - U32 size_hi = info.nFileSizeHigh; - props.size = (U64)size_lo | (((U64)size_hi)<<32); - os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime); - os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime); - props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes); - } - return props; -} - -internal OS_FileID -os_id_from_file(OS_Handle file) -{ - if(os_handle_match(file, os_handle_zero())) { OS_FileID r = {0}; return r; } - OS_FileID result = {0}; - HANDLE handle = (HANDLE)file.u64[0]; - BY_HANDLE_FILE_INFORMATION info; - BOOL is_ok = GetFileInformationByHandle(handle, &info); - if(is_ok) - { - result.v[0] = info.dwVolumeSerialNumber; - result.v[1] = info.nFileIndexLow; - result.v[2] = info.nFileIndexHigh; - } - return result; -} - -internal B32 -os_file_reserve_size(OS_Handle file, U64 size) -{ - HANDLE handle = (HANDLE)file.u64[0]; - - FILE_ALLOCATION_INFO alloc_info = {0}; - alloc_info.AllocationSize.LowPart = size & max_U32; - alloc_info.AllocationSize.HighPart = (size >> 32) & max_U32; - - BOOL is_reserved = SetFileInformationByHandle(handle, FileAllocationInfo, &alloc_info, sizeof(alloc_info)); - return is_reserved; -} - -internal B32 -os_delete_file_at_path(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - B32 result = DeleteFileW((WCHAR*)path16.str); - scratch_end(scratch); - return result; -} - -internal B32 -os_copy_file_path(String8 dst, String8 src) -{ - Temp scratch = scratch_begin(0, 0); - String16 dst16 = str16_from_8(scratch.arena, dst); - String16 src16 = str16_from_8(scratch.arena, src); - B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0); - scratch_end(scratch); - return result; -} - -internal B32 -os_move_file_path(String8 dst, String8 src) -{ - Temp scratch = scratch_begin(0, 0); - String16 dst16 = str16_from_8(scratch.arena, dst); - String16 src16 = str16_from_8(scratch.arena, src); - B32 result = MoveFileW((WCHAR*)src16.str, (WCHAR*)dst16.str); - scratch_end(scratch); - return result; -} - -internal String8 -os_full_path_from_path(Arena *arena, String8 path) -{ - Temp scratch = scratch_begin(&arena, 1); - DWORD buffer_size = Max(MAX_PATH, path.size * 2) + 1; - String16 path16 = str16_from_8(scratch.arena, path); - WCHAR *buffer = push_array_no_zero(scratch.arena, WCHAR, buffer_size); - DWORD path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL); - if(path16_size > buffer_size) - { - arena_pop(scratch.arena, buffer_size); - buffer_size = path16_size + 1; - buffer = push_array_no_zero(scratch.arena, WCHAR, buffer_size); - path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL); - } - String8 full_path = str8_from_16(arena, str16((U16*)buffer, path16_size)); - scratch_end(scratch); - return full_path; -} - -internal B32 -os_file_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0,0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); - B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY); - scratch_end(scratch); - return exists; -} - -internal B32 -os_folder_path_exists(String8 path) -{ - Temp scratch = scratch_begin(0,0); - String16 path16 = str16_from_8(scratch.arena, path); - DWORD attributes = GetFileAttributesW((WCHAR *)path16.str); - B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && (attributes & FILE_ATTRIBUTE_DIRECTORY); - scratch_end(scratch); - return exists; -} - -internal FileProperties -os_properties_from_file_path(String8 path) -{ - WIN32_FIND_DATAW find_data = {0}; - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data); - FileProperties props = {0}; - if(handle != INVALID_HANDLE_VALUE) - { - props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow); - os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime); - os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime); - props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes); - } - else - { - Temp scratch = scratch_begin(0, 0); - WCHAR buffer[512] = {0}; - DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); - U64 last_slash_pos = 0; - for(;last_slash_pos < path.size; last_slash_pos = str8_find_needle(path, last_slash_pos+1, str8_lit("/"), StringMatchFlag_SlashInsensitive)); - String8 path_trimmed = str8_prefix(path, last_slash_pos); - for(U64 off = 0; off < (U64)length;) - { - String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); - off += next_drive_string_16.size+1; - String8 next_drive_string = str8_from_16(scratch.arena, next_drive_string_16); - next_drive_string = str8_chop_last_slash(next_drive_string); - if(str8_match(path_trimmed, next_drive_string, StringMatchFlag_CaseInsensitive)) - { - props.flags |= FilePropertyFlag_IsFolder; - break; - } - } - scratch_end(scratch); - } - FindClose(handle); - scratch_end(scratch); - return props; -} - -//- rjf: file maps - -internal OS_Handle -os_file_map_open(OS_AccessFlags flags, OS_Handle file) -{ - OS_Handle map = {0}; - { - HANDLE file_handle = (HANDLE)file.u64[0]; - DWORD protect_flags = 0; - { - switch(flags) - { - default:{}break; - case OS_AccessFlag_Read: - {protect_flags = PAGE_READONLY;}break; - case OS_AccessFlag_Write: - case OS_AccessFlag_Read|OS_AccessFlag_Write: - {protect_flags = PAGE_READWRITE;}break; - case OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Execute: - {protect_flags = PAGE_EXECUTE_READ;}break; - case OS_AccessFlag_Execute|OS_AccessFlag_Write|OS_AccessFlag_Read: - case OS_AccessFlag_Execute|OS_AccessFlag_Write: - {protect_flags = PAGE_EXECUTE_READWRITE;}break; - } - } - HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0); - map.u64[0] = (U64)map_handle; - } - return map; -} - -internal void -os_file_map_close(OS_Handle map) -{ - HANDLE handle = (HANDLE)map.u64[0]; - BOOL result = CloseHandle(handle); - (void)result; -} - -internal void * -os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range) -{ - HANDLE handle = (HANDLE)map.u64[0]; - U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0); - U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32); - U64 size = dim_1u64(range); - DWORD access_flags = 0; - { - switch(flags) - { - default:{}break; - case OS_AccessFlag_Read: - { - access_flags = FILE_MAP_READ; - }break; - case OS_AccessFlag_Write: - { - access_flags = FILE_MAP_WRITE; - }break; - case OS_AccessFlag_Read|OS_AccessFlag_Write: - { - access_flags = FILE_MAP_ALL_ACCESS; - }break; - case OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Execute: - case OS_AccessFlag_Write|OS_AccessFlag_Execute: - case OS_AccessFlag_Read|OS_AccessFlag_Write|OS_AccessFlag_Execute: - { - access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE; - }break; - } - } - void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size); - return result; -} - -internal void -os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range) -{ - BOOL result = UnmapViewOfFile(ptr); - (void)result; -} - -//- rjf: directory iteration - -internal OS_FileIter * -os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit("\\*")); - String16 path16 = str16_from_8(scratch.arena, path_with_wildcard); - OS_FileIter *iter = push_array(arena, OS_FileIter, 1); - iter->flags = flags; - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; - if(path.size == 0) - { - w32_iter->is_volume_iter = 1; - WCHAR buffer[512] = {0}; - DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer); - String8List drive_strings = {0}; - for(U64 off = 0; off < (U64)length;) - { - String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off); - off += next_drive_string_16.size+1; - String8 next_drive_string = str8_from_16(arena, next_drive_string_16); - next_drive_string = str8_chop_last_slash(next_drive_string); - str8_list_push(scratch.arena, &drive_strings, next_drive_string); - } - w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings); - w32_iter->drive_strings_iter_idx = 0; - } - else - { - w32_iter->handle = FindFirstFileW((WCHAR*)path16.str, &w32_iter->find_data); - } - scratch_end(scratch); - return iter; -} - -internal B32 -os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out) -{ - B32 result = 0; - OS_FileIterFlags flags = iter->flags; - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; - switch(w32_iter->is_volume_iter) - { - //- rjf: file iteration - default: - case 0: - { - if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE) - { - do - { - // check is usable - B32 usable_file = 1; - - WCHAR *file_name = w32_iter->find_data.cFileName; - DWORD attributes = w32_iter->find_data.dwFileAttributes; - if (file_name[0] == '.'){ - if (flags & OS_FileIterFlag_SkipHiddenFiles){ - usable_file = 0; - } - else if (file_name[1] == 0){ - usable_file = 0; - } - else if (file_name[1] == '.' && file_name[2] == 0){ - usable_file = 0; - } - } - if (attributes & FILE_ATTRIBUTE_DIRECTORY){ - if (flags & OS_FileIterFlag_SkipFolders){ - usable_file = 0; - } - } - else{ - if (flags & OS_FileIterFlag_SkipFiles){ - usable_file = 0; - } - } - - // emit if usable - if (usable_file){ - info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name)); - info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32); - os_w32_dense_time_from_file_time(&info_out->props.created, &w32_iter->find_data.ftCreationTime); - os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime); - info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes); - result = 1; - if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){ - iter->flags |= OS_FileIterFlag_Done; - } - break; - } - }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data)); - } - }break; - - //- rjf: volume iteration - case 1: - { - result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count; - if(result != 0) - { - MemoryZeroStruct(info_out); - info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx]; - info_out->props.flags |= FilePropertyFlag_IsFolder; - w32_iter->drive_strings_iter_idx += 1; - } - }break; - } - if(!result) - { - iter->flags |= OS_FileIterFlag_Done; - } - return result; -} - -internal void -os_file_iter_end(OS_FileIter *iter) -{ - OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory; - HANDLE zero_handle; - MemoryZeroStruct(&zero_handle); - if(!MemoryMatchStruct(&zero_handle, &w32_iter->handle)) - { - FindClose(w32_iter->handle); - } -} - -//- rjf: directory creation - -internal B32 -os_make_directory(String8 path) -{ - B32 result = 0; - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, path); - WIN32_FILE_ATTRIBUTE_DATA attributes = {0}; - GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes); - if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - result = 1; - } - else if(CreateDirectoryW((WCHAR*)name16.str, 0)) - { - result = 1; - } - scratch_end(scratch); - return(result); -} - -//////////////////////////////// -//~ rjf: @os_hooks Shared Memory (Implemented Per-OS) - -internal OS_Handle -os_shared_memory_alloc(U64 size, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE, - 0, - PAGE_READWRITE, - (U32)((size & 0xffffffff00000000) >> 32), - (U32)((size & 0x00000000ffffffff)), - (WCHAR *)name16.str); - OS_Handle result = {(U64)file}; - scratch_end(scratch); - return result; -} - -internal OS_Handle -os_shared_memory_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str); - OS_Handle result = {(U64)file}; - scratch_end(scratch); - return result; -} - -internal void -os_shared_memory_close(OS_Handle handle) -{ - HANDLE file = (HANDLE)(handle.u64[0]); - CloseHandle(file); -} - -internal void * -os_shared_memory_view_open(OS_Handle handle, Rng1U64 range) -{ - HANDLE file = (HANDLE)(handle.u64[0]); - U64 offset = range.min; - U64 size = range.max-range.min; - void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS, - (U32)((offset & 0xffffffff00000000) >> 32), - (U32)((offset & 0x00000000ffffffff)), - size); - return ptr; -} - -internal void -os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range) -{ - UnmapViewOfFile(ptr); -} - -//////////////////////////////// -//~ rjf: @os_hooks Time (Implemented Per-OS) - -internal U64 -os_now_microseconds(void) -{ - U64 result = 0; - LARGE_INTEGER large_int_counter; - if(QueryPerformanceCounter(&large_int_counter)) - { - result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution; - } - return result; -} - -internal U32 -os_now_unix(void) -{ - FILETIME file_time; - GetSystemTimeAsFileTime(&file_time); - U32 unix_time = os_w32_unix_time_from_file_time(file_time); - return unix_time; -} - -internal DateTime -os_now_universal_time(void) -{ - SYSTEMTIME systime = {0}; - GetSystemTime(&systime); - DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); - return result; -} - -internal DateTime -os_universal_time_from_local(DateTime *date_time) -{ - SYSTEMTIME systime = {0}; - os_w32_system_time_from_date_time(&systime, date_time); - FILETIME ftime = {0}; - SystemTimeToFileTime(&systime, &ftime); - FILETIME ftime_local = {0}; - LocalFileTimeToFileTime(&ftime, &ftime_local); - FileTimeToSystemTime(&ftime_local, &systime); - DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); - return result; -} - -internal DateTime -os_local_time_from_universal(DateTime *date_time) -{ - SYSTEMTIME systime = {0}; - os_w32_system_time_from_date_time(&systime, date_time); - FILETIME ftime = {0}; - SystemTimeToFileTime(&systime, &ftime); - FILETIME ftime_local = {0}; - FileTimeToLocalFileTime(&ftime, &ftime_local); - FileTimeToSystemTime(&ftime_local, &systime); - DateTime result = {0}; - os_w32_date_time_from_system_time(&result, &systime); - return result; -} - -internal void -os_sleep_milliseconds(U32 msec) -{ - Sleep(msec); -} - -//////////////////////////////// -//~ rjf: @os_hooks Child Processes (Implemented Per-OS) - -internal OS_Handle -os_process_launch(OS_ProcessLaunchParams *params) -{ - OS_Handle result = {0}; - Temp scratch = scratch_begin(0, 0); - - //- rjf: form full command string - String8 cmd = {0}; - { - StringJoin join_params = {0}; - join_params.pre = str8_lit("\""); - join_params.sep = str8_lit("\" \""); - join_params.post = str8_lit("\""); - cmd = str8_list_join(scratch.arena, ¶ms->cmd_line, &join_params); - } - - //- rjf: form environment - B32 use_null_env_arg = 0; - String8 env = {0}; - { - StringJoin join_params2 = {0}; - join_params2.sep = str8_lit("\0"); - join_params2.post = str8_lit("\0"); - String8List all_opts = params->env; - if(params->inherit_env != 0) - { - if(all_opts.node_count != 0) - { - MemoryZeroStruct(&all_opts); - for(String8Node *n = params->env.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next) - { - str8_list_push(scratch.arena, &all_opts, n->string); - } - } - else - { - use_null_env_arg = 1; - } - } - if(use_null_env_arg == 0) - { - env = str8_list_join(scratch.arena, &all_opts, &join_params2); - } - } - - //- rjf: utf-8 -> utf-16 - String16 cmd16 = str16_from_8(scratch.arena, cmd); - String16 dir16 = str16_from_8(scratch.arena, params->path); - String16 env16 = {0}; - if(use_null_env_arg == 0) - { - env16 = str16_from_8(scratch.arena, env); - } - - //- rjf: determine creation flags - DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; - if(params->consoleless) - { - creation_flags |= CREATE_NO_WINDOW; - } - - //- rjf: launch - BOOL inherit_handles = 0; - STARTUPINFOW startup_info = {sizeof(startup_info)}; - if(!os_handle_match(params->stdout_file, os_handle_zero())) - { - HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0]; - startup_info.hStdOutput = stdout_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - if(!os_handle_match(params->stderr_file, os_handle_zero())) - { - HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0]; - startup_info.hStdError = stderr_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - if(!os_handle_match(params->stdin_file, os_handle_zero())) - { - HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0]; - startup_info.hStdInput = stdin_handle; - startup_info.dwFlags |= STARTF_USESTDHANDLES; - inherit_handles = 1; - } - PROCESS_INFORMATION process_info = {0}; - if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, inherit_handles, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info)) - { - result.u64[0] = (U64)process_info.hProcess; - CloseHandle(process_info.hThread); - } - - scratch_end(scratch); - return result; -} - -internal B32 -os_process_join(OS_Handle handle, U64 endt_us) -{ - HANDLE process = (HANDLE)(handle.u64[0]); - DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - DWORD result = WaitForSingleObject(process, sleep_ms); - return (result == WAIT_OBJECT_0); -} - -internal void -os_process_detach(OS_Handle handle) -{ - HANDLE process = (HANDLE)(handle.u64[0]); - CloseHandle(process); -} - -//////////////////////////////// -//~ rjf: @os_hooks Threads (Implemented Per-OS) - -internal OS_Handle -os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread); - entity->thread.func = func; - entity->thread.ptr = ptr; - entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid); - OS_Handle result = {IntFromPtr(entity)}; - return result; -} - -internal B32 -os_thread_join(OS_Handle handle, U64 endt_us) -{ - DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(handle.u64[0]); - DWORD wait_result = WAIT_OBJECT_0; - if(entity != 0) - { - wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms); - CloseHandle(entity->thread.handle); - os_w32_entity_release(entity); - } - return (wait_result == WAIT_OBJECT_0); -} - -internal void -os_thread_detach(OS_Handle thread) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]); - if(entity != 0) - { - CloseHandle(entity->thread.handle); - os_w32_entity_release(entity); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS) - -//- rjf: mutexes - -internal OS_Handle -os_mutex_alloc(void) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex); - InitializeCriticalSection(&entity->mutex); - OS_Handle result = {IntFromPtr(entity)}; - return result; -} - -internal void -os_mutex_release(OS_Handle mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); - os_w32_entity_release(entity); -} - -internal void -os_mutex_take(OS_Handle mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); - EnterCriticalSection(&entity->mutex); -} - -internal void -os_mutex_drop(OS_Handle mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); - LeaveCriticalSection(&entity->mutex); -} - -//- rjf: reader/writer mutexes - -internal OS_Handle -os_rw_mutex_alloc(void) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex); - InitializeSRWLock(&entity->rw_mutex); - OS_Handle result = {IntFromPtr(entity)}; - return result; -} - -internal void -os_rw_mutex_release(OS_Handle rw_mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - os_w32_entity_release(entity); -} - -internal void -os_rw_mutex_take_r(OS_Handle rw_mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - AcquireSRWLockShared(&entity->rw_mutex); -} - -internal void -os_rw_mutex_drop_r(OS_Handle rw_mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - ReleaseSRWLockShared(&entity->rw_mutex); -} - -internal void -os_rw_mutex_take_w(OS_Handle rw_mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - AcquireSRWLockExclusive(&entity->rw_mutex); -} - -internal void -os_rw_mutex_drop_w(OS_Handle rw_mutex) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]); - ReleaseSRWLockExclusive(&entity->rw_mutex); -} - -//- rjf: condition variables - -internal OS_Handle -os_condition_variable_alloc(void) -{ - OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable); - InitializeConditionVariable(&entity->cv); - OS_Handle result = {IntFromPtr(entity)}; - return result; -} - -internal void -os_condition_variable_release(OS_Handle cv) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - os_w32_entity_release(entity); -} - -internal B32 -os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us) -{ - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if(sleep_ms > 0) - { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]); - result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms); - } - return result; -} - -internal B32 -os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if(sleep_ms > 0) - { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); - result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, - CONDITION_VARIABLE_LOCKMODE_SHARED); - } - return result; -} - -internal B32 -os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us) -{ - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - BOOL result = 0; - if(sleep_ms > 0) - { - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]); - result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, 0); - } - return result; -} - -internal void -os_condition_variable_signal(OS_Handle cv) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - WakeConditionVariable(&entity->cv); -} - -internal void -os_condition_variable_broadcast(OS_Handle cv) -{ - OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]); - WakeAllConditionVariable(&entity->cv); -} - -//- rjf: cross-process semaphores - -internal OS_Handle -os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str); - OS_Handle result = {(U64)handle}; - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_release(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - CloseHandle(handle); -} - -internal OS_Handle -os_semaphore_open(String8 name) -{ - Temp scratch = scratch_begin(0, 0); - String16 name16 = str16_from_8(scratch.arena, name); - HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS , 0, (WCHAR *)name16.str); - OS_Handle result = {(U64)handle}; - scratch_end(scratch); - return result; -} - -internal void -os_semaphore_close(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - CloseHandle(handle); -} - -internal B32 -os_semaphore_take(OS_Handle semaphore, U64 endt_us) -{ - U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); - HANDLE handle = (HANDLE)semaphore.u64[0]; - DWORD wait_result = WaitForSingleObject(handle, sleep_ms); - B32 result = (wait_result == WAIT_OBJECT_0); - return result; -} - -internal void -os_semaphore_drop(OS_Handle semaphore) -{ - HANDLE handle = (HANDLE)semaphore.u64[0]; - ReleaseSemaphore(handle, 1, 0); -} - -//////////////////////////////// -//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS) - -internal OS_Handle -os_library_open(String8 path) -{ - Temp scratch = scratch_begin(0, 0); - String16 path16 = str16_from_8(scratch.arena, path); - HMODULE mod = LoadLibraryW((LPCWSTR)path16.str); - OS_Handle result = { (U64)mod }; - scratch_end(scratch); - return result; -} - -internal VoidProc* -os_library_load_proc(OS_Handle lib, String8 name) -{ - Temp scratch = scratch_begin(0, 0); - HMODULE mod = (HMODULE)lib.u64[0]; - name = push_str8_copy(scratch.arena, name); - VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str); - scratch_end(scratch); - return result; -} - -internal void -os_library_close(OS_Handle lib) -{ - HMODULE mod = (HMODULE)lib.u64[0]; - FreeLibrary(mod); -} - -//////////////////////////////// -//~ rjf: @os_hooks Safe Calls (Implemented Per-OS) - -internal void -os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr) -{ - __try - { - func(ptr); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - if(fail_handler != 0) - { - fail_handler(ptr); - } - ExitProcess(1); - } -} - -//////////////////////////////// -//~ rjf: @os_hooks GUIDs (Implemented Per-OS) - -internal Guid -os_make_guid(void) -{ - Guid result; MemoryZeroStruct(&result); - UUID uuid; - RPC_STATUS rpc_status = UuidCreate(&uuid); - if(rpc_status == RPC_S_OK) - { - result.data1 = uuid.Data1; - result.data2 = uuid.Data2; - result.data3 = uuid.Data3; - MemoryCopyArray(result.data4, uuid.Data4); - } - return result; -} - -//////////////////////////////// -//~ rjf: @os_hooks Entry Points (Implemented Per-OS) - -#include -#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside -#include - -internal B32 win32_g_is_quiet = 0; - -internal HRESULT WINAPI -win32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data) -{ - if(msg == TDN_HYPERLINK_CLICKED) - { - ShellExecuteW(NULL, L"open", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL); - } - return S_OK; -} - -internal LONG WINAPI -win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) -{ - if(win32_g_is_quiet) - { - ExitProcess(1); - } - - static volatile LONG first = 0; - if(InterlockedCompareExchange(&first, 1, 0) != 0) - { - // prevent failures in other threads to popup same message box - // this handler just shows first thread that crashes - // we are terminating afterwards anyway - for (;;) Sleep(1000); - } - - WCHAR buffer[4096] = {0}; - int buflen = 0; - - DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode; - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"A fatal exception (code 0x%x) occurred. The process is terminating.\n", exception_code); - - // load dbghelp dynamically just in case if it is missing - HMODULE dbghelp = LoadLibraryA("dbghelp.dll"); - if(dbghelp) - { - DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions); - BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess); - BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, - LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, - PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, - PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); - PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase); - DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr); - BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol); - BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line); - BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo); - - *(FARPROC*)&dbg_SymSetOptions = GetProcAddress(dbghelp, "SymSetOptions"); - *(FARPROC*)&dbg_SymInitializeW = GetProcAddress(dbghelp, "SymInitializeW"); - *(FARPROC*)&dbg_StackWalk64 = GetProcAddress(dbghelp, "StackWalk64"); - *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, "SymFunctionTableAccess64"); - *(FARPROC*)&dbg_SymGetModuleBase64 = GetProcAddress(dbghelp, "SymGetModuleBase64"); - *(FARPROC*)&dbg_SymFromAddrW = GetProcAddress(dbghelp, "SymFromAddrW"); - *(FARPROC*)&dbg_SymGetLineFromAddrW64 = GetProcAddress(dbghelp, "SymGetLineFromAddrW64"); - *(FARPROC*)&dbg_SymGetModuleInfoW64 = GetProcAddress(dbghelp, "SymGetModuleInfoW64"); - - if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64) - { - HANDLE process = GetCurrentProcess(); - HANDLE thread = GetCurrentThread(); - CONTEXT* context = exception_ptrs->ContextRecord; - - WCHAR module_path[MAX_PATH]; - GetModuleFileNameW(NULL, module_path, ArrayCount(module_path)); - PathRemoveFileSpecW(module_path); - - dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); - if(dbg_SymInitializeW(process, module_path, TRUE)) - { - // check that raddbg.pdb file is good - B32 raddbg_pdb_valid = 0; - { - IMAGEHLP_MODULEW64 module = {0}; - module.SizeOfStruct = sizeof(module); - if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module)) - { - raddbg_pdb_valid = (module.SymType == SymPdb); - } - } - - if(!raddbg_pdb_valid) - { - buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen, - L"\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\n"); - } - else - { - STACKFRAME64 frame = {0}; - DWORD image_type; -#if defined(_M_AMD64) - image_type = IMAGE_FILE_MACHINE_AMD64; - frame.AddrPC.Offset = context->Rip; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Rbp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Rsp; - frame.AddrStack.Mode = AddrModeFlat; -#elif defined(_M_ARM64) - image_type = IMAGE_FILE_MACHINE_ARM64; - frame.AddrPC.Offset = context->Pc; - frame.AddrPC.Mode = AddrModeFlat; - frame.AddrFrame.Offset = context->Fp; - frame.AddrFrame.Mode = AddrModeFlat; - frame.AddrStack.Offset = context->Sp; - frame.AddrStack.Mode = AddrModeFlat; -#else -# error Arch not supported! -#endif - - for(U32 idx=0; ;idx++) - { - const U32 max_frames = 32; - if(idx == max_frames) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"..."); - break; - } - - if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0)) - { - break; - } - - U64 address = frame.AddrPC.Offset; - if(address == 0) - { - break; - } - - if(idx==0) - { -#if BUILD_CONSOLE_INTERFACE - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nCreate a new issue with this report at %S.\n\n", BUILD_ISSUES_LINK_STRING_LITERAL); -#else - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, - L"\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\n" - L"%S\n\n", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL); -#endif - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"Call stack:\n"); - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"%u. [0x%I64x]", idx + 1, address); - - struct { - SYMBOL_INFOW info; - WCHAR name[MAX_SYM_NAME]; - } symbol = {0}; - - symbol.info.SizeOfStruct = sizeof(symbol.info); - symbol.info.MaxNameLen = MAX_SYM_NAME; - - DWORD64 displacement = 0; - if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s +%u", symbol.info.Name, (DWORD)displacement); - - IMAGEHLP_LINEW64 line = {0}; - line.SizeOfStruct = sizeof(line); - - DWORD line_displacement = 0; - if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L", %s line %u", PathFindFileNameW(line.FileName), line.LineNumber); - } - } - else - { - IMAGEHLP_MODULEW64 module = {0}; - module.SizeOfStruct = sizeof(module); - if(dbg_SymGetModuleInfoW64(process, address, &module)) - { - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L" %s", module.ModuleName); - } - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\n"); - } - } - } - } - } - - buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L"\nVersion: %S%S", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND); - -#if BUILD_CONSOLE_INTERFACE - fwprintf(stderr, L"\n--- Fatal Exception ---\n"); - fwprintf(stderr, L"%s\n\n", buffer); -#else - TASKDIALOGCONFIG dialog = {0}; - dialog.cbSize = sizeof(dialog); - dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION; - dialog.pszMainIcon = TD_ERROR_ICON; - dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON; - dialog.pszWindowTitle = L"Fatal Exception"; - dialog.pszContent = buffer; - dialog.pfCallback = &win32_dialog_callback; - TaskDialogIndirect(&dialog, 0, 0, 0); -#endif - - ExitProcess(1); -} - -#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside -#define OS_WINDOWS 1 - -internal void -w32_entry_point_caller(int argc, WCHAR **wargv) -{ - SetUnhandledExceptionFilter(&win32_exception_filter); - - //- rjf: dynamically load windows functions which are not guaranteed - // in all SDKs - { - HMODULE module = LoadLibraryA("kernel32.dll"); - w32_SetThreadDescription_func = (W32_SetThreadDescription_Type *)GetProcAddress(module, "SetThreadDescription"); - FreeLibrary(module); - } - - //- rjf: try to allow large pages if we can - B32 large_pages_allowed = 0; - { - HANDLE token; - if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) - { - LUID luid; - if(LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid)) - { - TOKEN_PRIVILEGES priv; - priv.PrivilegeCount = 1; - priv.Privileges[0].Luid = luid; - priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - large_pages_allowed = !!AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0); - } - CloseHandle(token); - } - } - - //- rjf: get system info - SYSTEM_INFO sysinfo = {0}; - GetSystemInfo(&sysinfo); - - //- rjf: set up non-dynamically-alloc'd state - // - // (we need to set up some basics before this layer can supply - // memory allocation primitives) - { - os_w32_state.microsecond_resolution = 1; - LARGE_INTEGER large_int_resolution; - if(QueryPerformanceFrequency(&large_int_resolution)) - { - os_w32_state.microsecond_resolution = large_int_resolution.QuadPart; - } - } - { - OS_SystemInfo *info = &os_w32_state.system_info; - info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors; - info->page_size = sysinfo.dwPageSize; - info->large_page_size = GetLargePageMinimum(); - info->allocation_granularity = sysinfo.dwAllocationGranularity; - } - { - OS_ProcessInfo *info = &os_w32_state.process_info; - info->large_pages_allowed = large_pages_allowed; - info->pid = GetCurrentProcessId(); - } - - //- rjf: extract arguments - Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32)); - char **argv = push_array(args_arena, char *, argc); - for(int i = 0; i < argc; i += 1) - { - String16 arg16 = str16_cstring((U16 *)wargv[i]); - String8 arg8 = str8_from_16(args_arena, arg16); - if(str8_match(arg8, str8_lit("--quiet"), StringMatchFlag_CaseInsensitive) || - str8_match(arg8, str8_lit("-quiet"), StringMatchFlag_CaseInsensitive)) - { - win32_g_is_quiet = 1; - } - if(str8_match(arg8, str8_lit("--large_pages"), StringMatchFlag_CaseInsensitive) || - str8_match(arg8, str8_lit("-large_pages"), StringMatchFlag_CaseInsensitive)) - { - arena_default_flags = ArenaFlag_LargePages; - arena_default_reserve_size = Max(MB(64), os_w32_state.system_info.large_page_size); - arena_default_commit_size = arena_default_reserve_size; - } - argv[i] = (char *)arg8.str; - } - - //- rjf: set up thread context - local_persist TCTX tctx; - tctx_init_and_equip(&tctx); - - //- rjf: set up dynamically-alloc'd state - Arena *arena = arena_alloc(); - { - os_w32_state.arena = arena; - { - OS_SystemInfo *info = &os_w32_state.system_info; - U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0}; - DWORD size = MAX_COMPUTERNAME_LENGTH + 1; - if(GetComputerNameA((char*)buffer, &size)) - { - info->machine_name = push_str8_copy(arena, str8(buffer, size)); - } - } - } - { - OS_ProcessInfo *info = &os_w32_state.process_info; - { - Temp scratch = scratch_begin(0, 0); - DWORD size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size); - String8 name8 = str8_from_16(scratch.arena, str16(buffer, length)); - String8 name_chopped = str8_chop_last_slash(name8); - info->binary_path = push_str8_copy(arena, name_chopped); - scratch_end(scratch); - } - info->initial_path = os_get_current_path(arena); - { - Temp scratch = scratch_begin(0, 0); - U64 size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer))) - { - info->user_program_data_path = str8_from_16(arena, str16_cstring(buffer)); - } - scratch_end(scratch); - } - { - WCHAR *this_proc_env = GetEnvironmentStringsW(); - U64 start_idx = 0; - for(U64 idx = 0;; idx += 1) - { - if(this_proc_env[idx] == 0) - { - if(start_idx == idx) - { - break; - } - else - { - String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); - String8 string = str8_from_16(arena, string16); - str8_list_push(arena, &info->environment, string); - start_idx = idx+1; - } - } - } - } - } - - //- rjf: set up entity storage - InitializeCriticalSection(&os_w32_state.entity_mutex); - os_w32_state.entity_arena = arena_alloc(); - - //- rjf: call into "real" entry point - main_thread_base_entry_point(argc, argv); -} - -#if BUILD_CONSOLE_INTERFACE -int wmain(int argc, WCHAR **argv) -{ - w32_entry_point_caller(argc, argv); - return 0; -} -#else -int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) -{ - w32_entry_point_caller(__argc, __wargv); - return 0; -} -#endif diff --git a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.h b/src/metagen/metagen_os/core/win32/metagen_os_core_win32.h deleted file mode 100644 index 9a8f0d12..00000000 --- a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.h +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_CORE_WIN32_H -#define OS_CORE_WIN32_H - -//////////////////////////////// -//~ rjf: Includes / Libraries - -#include -#include -#include -#include -#include -#include -#pragma comment(lib, "user32") -#pragma comment(lib, "winmm") -#pragma comment(lib, "shell32") -#pragma comment(lib, "advapi32") -#pragma comment(lib, "rpcrt4") -#pragma comment(lib, "shlwapi") -#pragma comment(lib, "comctl32") -#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // this is required for loading correct comctl32 dll file - -//////////////////////////////// -//~ rjf: File Iterator Types - -typedef struct OS_W32_FileIter OS_W32_FileIter; -struct OS_W32_FileIter -{ - HANDLE handle; - WIN32_FIND_DATAW find_data; - B32 is_volume_iter; - String8Array drive_strings; - U64 drive_strings_iter_idx; -}; -StaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size); - -//////////////////////////////// -//~ rjf: Entity Types - -typedef enum OS_W32_EntityKind -{ - OS_W32_EntityKind_Null, - OS_W32_EntityKind_Thread, - OS_W32_EntityKind_Mutex, - OS_W32_EntityKind_RWMutex, - OS_W32_EntityKind_ConditionVariable, -} -OS_W32_EntityKind; - -typedef struct OS_W32_Entity OS_W32_Entity; -struct OS_W32_Entity -{ - OS_W32_Entity *next; - OS_W32_EntityKind kind; - union - { - struct - { - OS_ThreadFunctionType *func; - void *ptr; - HANDLE handle; - DWORD tid; - } thread; - CRITICAL_SECTION mutex; - SRWLOCK rw_mutex; - CONDITION_VARIABLE cv; - }; -}; - -//////////////////////////////// -//~ rjf: State - -typedef struct OS_W32_State OS_W32_State; -struct OS_W32_State -{ - Arena *arena; - - // rjf: info - OS_SystemInfo system_info; - OS_ProcessInfo process_info; - U64 microsecond_resolution; - - // rjf: entity storage - CRITICAL_SECTION entity_mutex; - Arena *entity_arena; - OS_W32_Entity *entity_free; -}; - -//////////////////////////////// -//~ rjf: Globals - -global OS_W32_State os_w32_state = {0}; - -//////////////////////////////// -//~ rjf: File Info Conversion Helpers - -internal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes); -internal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes); - -//////////////////////////////// -//~ rjf: Time Conversion Helpers - -internal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in); -internal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in); -internal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in); -internal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us); - -//////////////////////////////// -//~ rjf: Entity Functions - -internal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind); -internal void os_w32_entity_release(OS_W32_Entity *entity); - -//////////////////////////////// -//~ rjf: Thread Entry Point - -internal DWORD os_w32_thread_entry_point(void *ptr); - -#endif // OS_CORE_WIN32_H diff --git a/src/metagen/metagen_os/metagen_os_inc.c b/src/metagen/metagen_os/metagen_os_inc.c deleted file mode 100644 index 70bb1565..00000000 --- a/src/metagen/metagen_os/metagen_os_inc.c +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#include "metagen/metagen_os/core/metagen_os_core.c" - -#if OS_WINDOWS -# include "metagen/metagen_os/core/win32/metagen_os_core_win32.c" -#elif OS_LINUX -# include "metagen/metagen_os/core/linux/metagen_os_core_linux.c" -#else -# error OS core layer not implemented for this operating system. -#endif diff --git a/src/metagen/metagen_os/metagen_os_inc.h b/src/metagen/metagen_os/metagen_os_inc.h deleted file mode 100644 index b2d96f02..00000000 --- a/src/metagen/metagen_os/metagen_os_inc.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2024 Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef OS_INC_H -#define OS_INC_H - -#if !defined(OS_FEATURE_GRAPHICAL) -# define OS_FEATURE_GRAPHICAL 0 -#endif - -#include "metagen/metagen_os/core/metagen_os_core.h" - -#if OS_WINDOWS -# include "metagen/metagen_os/core/win32/metagen_os_core_win32.h" -#elif OS_LINUX -# include "metagen/metagen_os/core/linux/metagen_os_core_linux.h" -#else -# error OS core layer not implemented for this operating system. -#endif - -#endif // OS_INC_H From 264abe57aadb5c8c179cfbcbd8a07f4899e100a8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 08:40:14 -0700 Subject: [PATCH 525/850] allow missing debug info in case of 'step out' - we still want to support traditional behavior especially in e.g. disassembly and so on --- src/dbg_engine/dbg_engine_user.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 2927988d..cce39e00 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -767,7 +767,6 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); if(rdi != &rdi_parsed_nil) { - result.good_line_info = 1; RDI_Scope *scope = rdi_scope_from_voff(rdi, ip_voff); U64 all_scope_voffs_count = 0; U64 *all_scope_voffs = rdi_table_from_name(rdi, ScopeVOffData, &all_scope_voffs_count); @@ -780,6 +779,7 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) } // rjf: place traps at all possible exit points of all scope's ranges + result.good_read = 1; for EachNode(n, Rng1U64Node, scope_voff_rngs.first) { Rng1U64 voff_range = n->v; @@ -850,6 +850,10 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) result.good_read = 0; } + // NOTE(rjf): we always want to support missing line info for "step out", because + // we should always be able to fall back to just using the unwind, so just always + // mark this bit as a success. + result.good_line_info = 1; access_close(access); scratch_end(scratch); } From 1774a76cdb66ac147d47aa7768d67dc8b29403bd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 08:58:46 -0700 Subject: [PATCH 526/850] scope ending annotations --- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 + src/raddbg/raddbg_core.c | 2 +- src/raddbg/raddbg_widgets.c | 678 +++++++++++++++-------------- 4 files changed, 357 insertions(+), 327 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 1183bb3e..bc334703 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -428,7 +428,7 @@ RD_VocabInfo rd_vocab_info_table[360] = RD_NameSchemaInfo rd_name_schema_info_table[40] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 1eba80f4..86eb8621 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -264,6 +264,8 @@ RD_VocabTable: //- rjf: scope decorations @default(1) @display_name('Cursor Scope Lines') @description("Controls whether or not scopes containing the cursor in text views are drawn.") 'cursor_scope_lines': bool, + @default(1) @display_name('Cursor Scope End Annotations') @description("Controls whether or not ending annotations for scopes containing the cursor are drawn.") + 'cursor_scope_end_annotations': bool, //- rjf: cursor decorations @default(1) @display_name('Cursor Trail') @description("Controls whether or not a movement trail of the cursor is drawn.") diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index e09efbba..414c3b99 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4880,7 +4880,7 @@ rd_push_window_title(Arena *arena) prof_path = str8_chop_last_dot(prof_path); project_name = str8_skip_last_slash(prof_path); } - String8 result = push_str8f(arena, "%S - %s", project_name, BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ")"); + String8 result = push_str8f(arena, "%S%s%s", project_name, project_name.size != 0 ? " - " : "", BUILD_TITLE " (" BUILD_VERSION_STRING_LITERAL " " BUILD_RELEASE_PHASE_STRING_LITERAL ")"); return result; } diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 9febbbea..eacdf82a 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1278,6 +1278,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe B32 do_bp_lines = rd_setting_b32_from_name(str8_lit("breakpoint_lines")); B32 do_bp_glow = rd_setting_b32_from_name(str8_lit("breakpoint_glow")); B32 do_scope_lines = rd_setting_b32_from_name(str8_lit("cursor_scope_lines")); + B32 do_scope_end_annotations = rd_setting_b32_from_name(str8_lit("cursor_scope_end_annotations")); B32 do_cursor_trail = rd_setting_b32_from_name(str8_lit("cursor_trail")); Vec4F32 pop_color = {0}; UI_TagF("pop") @@ -1981,6 +1982,358 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe mouse_line_rng = txt_rng(txt_pt(mouse_pt.line, 1), txt_pt(mouse_pt.line, 1+(line_range.max-line_range.min))); } + ////////////////////////////// + //- rjf: interact with margin box & text box + // + B32 search_query_invalidated = 0; + UI_Signal priority_margin_container_sig = ui_signal_from_box(priority_margin_container_box); + UI_Signal catchall_margin_container_sig = ui_signal_from_box(catchall_margin_container_box); + UI_Signal text_container_sig = ui_signal_from_box(text_container_box); + { + //- rjf: determine mouse drag range + TxtRng mouse_drag_rng = txt_rng(mouse_pt, mouse_pt); + if(text_container_sig.f & UI_SignalFlag_LeftTripleDragging) + { + mouse_drag_rng = mouse_line_rng; + } + else if(text_container_sig.f & UI_SignalFlag_LeftDoubleDragging) + { + mouse_drag_rng = mouse_token_rng; + } + + //- rjf: clicking/dragging over the text container + if(!ctrlified && ui_dragging(text_container_sig)) + { + if(mouse_pt.line == 0) + { + mouse_pt.column = 1; + if(ui_mouse().y <= top_container_box->rect.y0) + { + mouse_pt.line = params->line_num_range.min - 2; + } + else if(ui_mouse().y >= top_container_box->rect.y1) + { + mouse_pt.line = params->line_num_range.max + 2; + } + } + if(ui_pressed(text_container_sig)) + { + *cursor = mouse_drag_rng.max; + *mark = mouse_drag_rng.min; + } + if(txt_pt_less_than(mouse_pt, *mark)) + { + *cursor = mouse_drag_rng.min; + } + else + { + *cursor = mouse_drag_rng.max; + } + *preferred_column = cursor->column; + } + + //- rjf: dragging will invalidate the search string, so we don't want to draw it while dragging/releasing + if(ui_dragging(text_container_sig) || ui_released(text_container_sig)) + { + search_query_invalidated = 1; + } + + //- rjf: right-click => code context menu + if(ui_right_clicked(text_container_sig)) + { + if(txt_pt_match(*cursor, *mark)) + { + *cursor = *mark = mouse_pt; + } + U64 vaddr = 0; + D_LineList lines = {0}; + if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max) + { + vaddr = params->line_vaddrs[cursor->line - params->line_num_range.min]; + lines = params->line_infos[cursor->line - params->line_num_range.min]; + } + rd_cmd(RD_CmdKind_FocusPanel); + rd_cmd(RD_CmdKind_PushQuery, + .expr = txt_pt_match(*cursor, *mark) ? str8_lit("query:text_pt_commands") : str8_lit("query:text_range_commands"), + .do_implicit_root = 1, + .do_lister = 1, + .activate_with_single_click = 1, + .ui_key = ui_get_selected_state()->root->key, + .off_px = ui_mouse(), + .cursor = *cursor, + .mark = *mark, + .vaddr = vaddr, + .lines = lines); + } + + //- rjf: drop target is dropped -> process + if(drop_can_hit_lines && ui_key_match(ui_drop_hot_key(), drop_site_key) && rd_drag_drop()) + { + if(rd_state->drag_drop_regs_slot == RD_RegSlot_Expr) + { + S64 line_num = mouse_pt.line; + U64 line_idx = line_num - params->line_num_range.min; + U64 line_vaddr = params->line_vaddrs[line_idx]; + rd_cmd(RD_CmdKind_AddWatchPin, + .expr = rd_state->drag_drop_regs->expr, + .file_path = line_vaddr == 0 ? rd_regs()->file_path : str8_zero(), + .cursor = line_vaddr == 0 ? txt_pt(line_num, 1) : txt_pt(0, 0), + .vaddr = line_vaddr); + } + if(rd_state->drag_drop_regs_slot == RD_RegSlot_Cfg && drop_cfg != &cfg_nil_node) + { + S64 line_num = mouse_pt.line; + U64 line_idx = line_num - params->line_num_range.min; + U64 line_vaddr = params->line_vaddrs[line_idx]; + rd_cmd(RD_CmdKind_RelocateCfg, + .cfg = drop_cfg->id, + .file_path = line_vaddr == 0 ? rd_regs()->file_path : str8_zero(), + .cursor = line_vaddr == 0 ? txt_pt(line_num, 1) : txt_pt(0, 0), + .vaddr = line_vaddr); + } + if(drop_thread != &d_entity_nil) + { + S64 line_num = mouse_pt.line; + U64 line_idx = line_num - params->line_num_range.min; + U64 line_vaddr = params->line_vaddrs[line_idx]; + D_Entity *thread = drop_thread; + U64 new_rip_vaddr = line_vaddr; + if(params->line_vaddrs[line_idx] == 0) + { + D_LineList *lines = ¶ms->line_infos[line_idx]; + for(D_LineNode *n = lines->first; n != 0; n = n->next) + { + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + if(module != &d_entity_nil) + { + new_rip_vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); + break; + } + } + } + rd_cmd(RD_CmdKind_SetThreadIP, .thread = thread->handle, .vaddr = new_rip_vaddr); + } + } + + //- rjf: commit text container signal to main output + result.base = text_container_sig; + } + + ////////////////////////////// + //- rjf: cursor -> scope info + // + TXT_ScopeNode *cursor_scope_node = &txt_scope_node_nil; + if(params->text_info != 0) + { + cursor_scope_node = txt_scope_node_from_info_pt(params->text_info, rd_regs()->cursor); + } + + ////////////////////////////// + //- rjf: equip cursor scope rendering info + // + if(do_scope_lines && cursor_scope_node != &txt_scope_node_nil) + { + F32 scope_line_thickness = params->font_size*0.1f; + scope_line_thickness = Max(scope_line_thickness, 1.f); + DR_Bucket *bucket = dr_bucket_make(); + DR_BucketScope(bucket) + { + Vec2F32 text_base_pos = v2f32(text_container_box->rect.x0 + params->line_num_width_px + line_num_padding_px, + text_container_box->rect.y0); + F32 ancestor_chain_depth = 0; + for(TXT_ScopeNode *scope_n = cursor_scope_node; + scope_n != &txt_scope_node_nil; + scope_n = txt_scope_node_from_info_num(params->text_info, scope_n->parent_num), ancestor_chain_depth += 1) + { + Vec4F32 scope_line_color = highlight_color; + F32 scope_line_color_target = highlight_color.w; + scope_line_color_target *= 1 - ancestor_chain_depth / 6.f; + scope_line_color_target = Max(0.2f, scope_line_color_target); + F32 scope_line_color_t = ui_anim(ui_key_from_stringf(text_container_box->key, "###scope_depth_%I64x_%I64x", scope_n->token_idx_range.min, scope_n->token_idx_range.max), scope_line_color_target, .rate = rd_state->menu_animation_rate__slow); + scope_line_color.w = scope_line_color_t*0.5f; + Rng1U64 token_idx_range = scope_n->token_idx_range; + Rng1U64 off_range = r1u64(params->text_info->tokens.v[token_idx_range.min].range.min, params->text_info->tokens.v[token_idx_range.max].range.min); + TxtRng txt_range = txt_rng(txt_pt_from_info_off__linear_scan(params->text_info, off_range.min), txt_pt_from_info_off__linear_scan(params->text_info, off_range.max)); + + //- rjf: single-line scopes (underline) + if(txt_range.min.line == txt_range.max.line && contains_1s64(params->line_num_range, txt_range.min.line)) + { + S64 line_num = txt_range.min.line; + U64 line_idx = (U64)(line_num - params->line_num_range.min); + String8 line_string = params->line_text[line_idx]; + Rng1U64 line_off_range = r1u64(off_range.min - params->line_ranges[line_idx].min, off_range.max+1 - params->line_ranges[line_idx].min); + Rng1F32 x_px_range = r1f32(fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_string, line_off_range.min)).x, + fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_string, line_off_range.max)).x); + F32 line_y = line_idx*params->line_height_px; + Rng2F32 underline_rect = r2f32p(text_base_pos.x + x_px_range.min, + text_base_pos.y + line_y + params->line_height_px*0.5f, + text_base_pos.x + x_px_range.max+1, + text_base_pos.y + line_y + params->line_height_px + params->font_size*0.1f); + F32 midpoint = center_1f32(r1f32(underline_rect.x0, underline_rect.x1)); + F32 t = ui_anim(ui_key_from_stringf(text_container_box->key, "###scope_%I64x_%I64x", scope_n->token_idx_range.min, scope_n->token_idx_range.max), 1.f, .rate = rd_state->catchall_animation_rate); + Rng2F32 underline_clip = {0}; + underline_clip.x0 = mix_1f32(midpoint, underline_rect.x0 - params->font_size, t); + underline_clip.x1 = mix_1f32(midpoint, underline_rect.x1 + params->font_size, t); + underline_clip.y0 = underline_rect.y0 + (underline_rect.y1 - underline_rect.y0) * 0.65f; + underline_clip.y1 = 10000; + DR_ClipScope(underline_clip) + { + dr_rect(underline_rect, scope_line_color, params->font_size*0.1f, scope_line_thickness, 1.f); + } + } + + //- rjf: cross-line scopes + if(txt_range.min.line != txt_range.max.line && params->line_num_range.max > txt_range.min.line && params->line_num_range.min < txt_range.max.line) + { + String8 opener_line = txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.min.line); + String8 closer_line = txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.max.line); + String8 opener_line_pre_opener = str8_prefix(opener_line, txt_range.min.column-1); + String8 closer_line_pre_closer = str8_prefix(closer_line, txt_range.max.column-1); + F32 opener_line_pre_opener_px = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, opener_line_pre_opener).x; + F32 closer_line_pre_closer_px = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, closer_line_pre_closer).x; + F32 indent_depth_px = Min(opener_line_pre_opener_px, closer_line_pre_closer_px); + Rng1F32 scope_range_y_px = r1f32(0, dim_2f32(text_container_box->rect).y); + if(contains_1s64(params->line_num_range, txt_range.min.line)) + { + scope_range_y_px.min = (txt_range.min.line - params->line_num_range.min) * params->line_height_px; + } + if(contains_1s64(params->line_num_range, txt_range.max.line)) + { + scope_range_y_px.max = ((txt_range.max.line - params->line_num_range.min) + 1) * params->line_height_px; + } + F32 midpoint = center_1f32(scope_range_y_px); + F32 t = ui_anim(ui_key_from_stringf(text_container_box->key, "###scope_%I64x_%I64x", scope_n->token_idx_range.min, scope_n->token_idx_range.max), 1.f, .rate = rd_state->catchall_animation_rate); + Rng2F32 scope_rect = r2f32p(text_base_pos.x + indent_depth_px - params->font_size*0.2f, + text_base_pos.y + scope_range_y_px.min, + text_base_pos.x + indent_depth_px - params->font_size*0.2f + params->font_size*1.f, + text_base_pos.y + scope_range_y_px.max); + Rng2F32 scope_clip_rect = {0}; + { + scope_clip_rect.x0 = scope_rect.x0 - params->font_size*10.f; + scope_clip_rect.x1 = scope_rect.x0 + (scope_rect.x1 - scope_rect.x0)*0.4f; + scope_clip_rect.y0 = mix_1f32(midpoint, scope_rect.y0 - params->font_size*0.1f, t); + scope_clip_rect.y1 = mix_1f32(midpoint, scope_rect.y1 + params->font_size*0.1f, t); + } + DR_ClipScope(scope_clip_rect) + { + dr_rect(scope_rect, scope_line_color, params->font_size*0.1f, scope_line_thickness, 1.f); + } + } + + //- rjf: scope ending annotations + if(do_scope_end_annotations && txt_range.min.line != txt_range.max.line && contains_1s64(params->line_num_range, txt_range.max.line)) UI_TagF("weak") + { + String8 opener_line = str8_skip_chop_whitespace(txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.min.line)); + String8 scope_title_string = opener_line; + if(str8_match(opener_line, str8_lit("{"), 0) || + str8_match(opener_line, str8_lit("["), 0) || + str8_match(opener_line, str8_lit("("), 0)) + { + scope_title_string = str8_skip_chop_whitespace(txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.min.line-1)); + } + if(!str8_match(scope_title_string, str8_lit("{"), 0) && + !str8_match(scope_title_string, str8_lit("["), 0) && + !str8_match(scope_title_string, str8_lit("("), 0)) + { + F32 t = ui_anim(ui_key_from_stringf(text_container_box->key, "###scope_end_annotation_%I64x_%I64x", scope_n->token_idx_range.min, scope_n->token_idx_range.max), 1.f, .rate = rd_state->catchall_animation_rate); + String8 closer_line = txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.max.line); + F32 closer_line_px = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, closer_line).x; + Vec4F32 color = ui_color_from_name(str8_lit("text")); + color.w *= 0.5f*t; + dr_text(params->font, params->font_size * 0.85f, 0, 0, ui_top_text_raster_flags(), + v2f32(text_base_pos.x + closer_line_px + ui_top_font_size()*0.5f*t, + text_base_pos.y + (txt_range.max.line - params->line_num_range.min) * params->line_height_px + params->line_height_px*0.7f), + color, scope_title_string); + } + } + } + } + ui_box_equip_draw_bucket(text_container_box, bucket); + } + + ////////////////////////////// + //- rjf: produce fancy strings for each line + // + DR_FStrList *lines_fstrs = push_array(scratch.arena, DR_FStrList, dim_1s64(params->line_num_range)+1); + { + DR_FStrParams fstr_params = + { + params->font, + rd_raster_flags_from_slot(RD_FontSlot_Code), + rd_rgba_from_code_color_slot(RD_CodeColorSlot_CodeDefault), + params->font_size, + }; + U64 line_idx = 0; + for(S64 line_num = params->line_num_range.min; + line_num <= params->line_num_range.max; + line_num += 1, line_idx += 1) + { + String8 line_string = params->line_text[line_idx]; + Rng1U64 line_range = params->line_ranges[line_idx]; + TXT_TokenArray *line_tokens = ¶ms->line_tokens[line_idx]; + DR_FStrList fstrs = {0}; + if(line_tokens->count == 0) + { + dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, line_string); + } + else + { + TXT_Token *line_tokens_first = line_tokens->v; + TXT_Token *line_tokens_opl = line_tokens->v + line_tokens->count; + B32 preceded_by_dot = 0; + for(TXT_Token *token = line_tokens_first; token < line_tokens_opl; token += 1) + { + // rjf: token -> token string + String8 token_string = {0}; + { + Rng1U64 token_range = r1u64(0, line_string.size); + if(token->range.min > line_range.min) + { + token_range.min += token->range.min-line_range.min; + } + if(token->range.max < line_range.max) + { + token_range.max = token->range.max-line_range.min; + } + token_string = str8_substr(line_string, token_range); + } + + // rjf: token -> token color + RD_CodeColorSlot token_color_slot = rd_code_color_slot_from_txt_token_kind(token->kind); + RD_CodeColorSlot lookup_color_slot = preceded_by_dot ? token_color_slot : rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string, 0, 0); + Vec4F32 token_color = rd_rgba_from_code_color_slot(token_color_slot); + if(lookup_color_slot != RD_CodeColorSlot_CodeDefault) + { + Vec4F32 lookup_color = rd_rgba_from_code_color_slot(lookup_color_slot); + F32 lookup_color_mix_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "%S_lookup", token_string), 1.f); + token_color = mix_4f32(token_color, lookup_color, lookup_color_mix_t); + } + + // rjf: scope endpoints enclosing cursor -> highlight + for(TXT_ScopeNode *scope_n = cursor_scope_node; + scope_n != &txt_scope_node_nil; + scope_n = txt_scope_node_from_info_num(params->text_info, scope_n->parent_num)) + { + if(params->text_info->tokens.v[scope_n->token_idx_range.min].range.min == token->range.min || + params->text_info->tokens.v[scope_n->token_idx_range.max].range.min == token->range.min) + { + token_color = highlight_color; + break; + } + } + + // rjf: push fancy string + dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, token_string, .color = token_color); + + // rjf: . -> mark next token as preceded by dot + preceded_by_dot = (token->kind == TXT_TokenKind_Symbol && str8_match(token_string, str8_lit("."), 0)); + } + } + lines_fstrs[line_idx] = fstrs; + } + } + ////////////////////////////// //- rjf: determine starting offset for each at line, at which we can begin placing extra info to the right // @@ -2152,331 +2505,6 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } } - ////////////////////////////// - //- rjf: interact with margin box & text box - // - B32 search_query_invalidated = 0; - UI_Signal priority_margin_container_sig = ui_signal_from_box(priority_margin_container_box); - UI_Signal catchall_margin_container_sig = ui_signal_from_box(catchall_margin_container_box); - UI_Signal text_container_sig = ui_signal_from_box(text_container_box); - { - //- rjf: determine mouse drag range - TxtRng mouse_drag_rng = txt_rng(mouse_pt, mouse_pt); - if(text_container_sig.f & UI_SignalFlag_LeftTripleDragging) - { - mouse_drag_rng = mouse_line_rng; - } - else if(text_container_sig.f & UI_SignalFlag_LeftDoubleDragging) - { - mouse_drag_rng = mouse_token_rng; - } - - //- rjf: clicking/dragging over the text container - if(!ctrlified && ui_dragging(text_container_sig)) - { - if(mouse_pt.line == 0) - { - mouse_pt.column = 1; - if(ui_mouse().y <= top_container_box->rect.y0) - { - mouse_pt.line = params->line_num_range.min - 2; - } - else if(ui_mouse().y >= top_container_box->rect.y1) - { - mouse_pt.line = params->line_num_range.max + 2; - } - } - if(ui_pressed(text_container_sig)) - { - *cursor = mouse_drag_rng.max; - *mark = mouse_drag_rng.min; - } - if(txt_pt_less_than(mouse_pt, *mark)) - { - *cursor = mouse_drag_rng.min; - } - else - { - *cursor = mouse_drag_rng.max; - } - *preferred_column = cursor->column; - } - - //- rjf: dragging will invalidate the search string, so we don't want to draw it while dragging/releasing - if(ui_dragging(text_container_sig) || ui_released(text_container_sig)) - { - search_query_invalidated = 1; - } - - //- rjf: right-click => code context menu - if(ui_right_clicked(text_container_sig)) - { - if(txt_pt_match(*cursor, *mark)) - { - *cursor = *mark = mouse_pt; - } - U64 vaddr = 0; - D_LineList lines = {0}; - if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max) - { - vaddr = params->line_vaddrs[cursor->line - params->line_num_range.min]; - lines = params->line_infos[cursor->line - params->line_num_range.min]; - } - rd_cmd(RD_CmdKind_FocusPanel); - rd_cmd(RD_CmdKind_PushQuery, - .expr = txt_pt_match(*cursor, *mark) ? str8_lit("query:text_pt_commands") : str8_lit("query:text_range_commands"), - .do_implicit_root = 1, - .do_lister = 1, - .activate_with_single_click = 1, - .ui_key = ui_get_selected_state()->root->key, - .off_px = ui_mouse(), - .cursor = *cursor, - .mark = *mark, - .vaddr = vaddr, - .lines = lines); - } - - //- rjf: drop target is dropped -> process - if(drop_can_hit_lines && ui_key_match(ui_drop_hot_key(), drop_site_key) && rd_drag_drop()) - { - if(rd_state->drag_drop_regs_slot == RD_RegSlot_Expr) - { - S64 line_num = mouse_pt.line; - U64 line_idx = line_num - params->line_num_range.min; - U64 line_vaddr = params->line_vaddrs[line_idx]; - rd_cmd(RD_CmdKind_AddWatchPin, - .expr = rd_state->drag_drop_regs->expr, - .file_path = line_vaddr == 0 ? rd_regs()->file_path : str8_zero(), - .cursor = line_vaddr == 0 ? txt_pt(line_num, 1) : txt_pt(0, 0), - .vaddr = line_vaddr); - } - if(rd_state->drag_drop_regs_slot == RD_RegSlot_Cfg && drop_cfg != &cfg_nil_node) - { - S64 line_num = mouse_pt.line; - U64 line_idx = line_num - params->line_num_range.min; - U64 line_vaddr = params->line_vaddrs[line_idx]; - rd_cmd(RD_CmdKind_RelocateCfg, - .cfg = drop_cfg->id, - .file_path = line_vaddr == 0 ? rd_regs()->file_path : str8_zero(), - .cursor = line_vaddr == 0 ? txt_pt(line_num, 1) : txt_pt(0, 0), - .vaddr = line_vaddr); - } - if(drop_thread != &d_entity_nil) - { - S64 line_num = mouse_pt.line; - U64 line_idx = line_num - params->line_num_range.min; - U64 line_vaddr = params->line_vaddrs[line_idx]; - D_Entity *thread = drop_thread; - U64 new_rip_vaddr = line_vaddr; - if(params->line_vaddrs[line_idx] == 0) - { - D_LineList *lines = ¶ms->line_infos[line_idx]; - for(D_LineNode *n = lines->first; n != 0; n = n->next) - { - D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); - if(module != &d_entity_nil) - { - new_rip_vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); - break; - } - } - } - rd_cmd(RD_CmdKind_SetThreadIP, .thread = thread->handle, .vaddr = new_rip_vaddr); - } - } - - //- rjf: commit text container signal to main output - result.base = text_container_sig; - } - - ////////////////////////////// - //- rjf: cursor -> scope info - // - TXT_ScopeNode *cursor_scope_node = &txt_scope_node_nil; - if(params->text_info != 0) - { - cursor_scope_node = txt_scope_node_from_info_pt(params->text_info, rd_regs()->cursor); - } - - ////////////////////////////// - //- rjf: produce fancy strings for each line - // - DR_FStrList *lines_fstrs = push_array(scratch.arena, DR_FStrList, dim_1s64(params->line_num_range)+1); - { - DR_FStrParams fstr_params = - { - params->font, - rd_raster_flags_from_slot(RD_FontSlot_Code), - rd_rgba_from_code_color_slot(RD_CodeColorSlot_CodeDefault), - params->font_size, - }; - U64 line_idx = 0; - for(S64 line_num = params->line_num_range.min; - line_num <= params->line_num_range.max; - line_num += 1, line_idx += 1) - { - String8 line_string = params->line_text[line_idx]; - Rng1U64 line_range = params->line_ranges[line_idx]; - TXT_TokenArray *line_tokens = ¶ms->line_tokens[line_idx]; - DR_FStrList fstrs = {0}; - if(line_tokens->count == 0) - { - dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, line_string); - } - else - { - TXT_Token *line_tokens_first = line_tokens->v; - TXT_Token *line_tokens_opl = line_tokens->v + line_tokens->count; - B32 preceded_by_dot = 0; - for(TXT_Token *token = line_tokens_first; token < line_tokens_opl; token += 1) - { - // rjf: token -> token string - String8 token_string = {0}; - { - Rng1U64 token_range = r1u64(0, line_string.size); - if(token->range.min > line_range.min) - { - token_range.min += token->range.min-line_range.min; - } - if(token->range.max < line_range.max) - { - token_range.max = token->range.max-line_range.min; - } - token_string = str8_substr(line_string, token_range); - } - - // rjf: token -> token color - RD_CodeColorSlot token_color_slot = rd_code_color_slot_from_txt_token_kind(token->kind); - RD_CodeColorSlot lookup_color_slot = preceded_by_dot ? token_color_slot : rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string, 0, 0); - Vec4F32 token_color = rd_rgba_from_code_color_slot(token_color_slot); - if(lookup_color_slot != RD_CodeColorSlot_CodeDefault) - { - Vec4F32 lookup_color = rd_rgba_from_code_color_slot(lookup_color_slot); - F32 lookup_color_mix_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "%S_lookup", token_string), 1.f); - token_color = mix_4f32(token_color, lookup_color, lookup_color_mix_t); - } - - // rjf: scope endpoints enclosing cursor -> highlight - for(TXT_ScopeNode *scope_n = cursor_scope_node; - scope_n != &txt_scope_node_nil; - scope_n = txt_scope_node_from_info_num(params->text_info, scope_n->parent_num)) - { - if(params->text_info->tokens.v[scope_n->token_idx_range.min].range.min == token->range.min || - params->text_info->tokens.v[scope_n->token_idx_range.max].range.min == token->range.min) - { - token_color = highlight_color; - break; - } - } - - // rjf: push fancy string - dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, token_string, .color = token_color); - - // rjf: . -> mark next token as preceded by dot - preceded_by_dot = (token->kind == TXT_TokenKind_Symbol && str8_match(token_string, str8_lit("."), 0)); - } - } - lines_fstrs[line_idx] = fstrs; - } - } - - ////////////////////////////// - //- rjf: equip cursor scope rendering info - // - if(do_scope_lines && cursor_scope_node != &txt_scope_node_nil) - { - F32 scope_line_thickness = params->font_size*0.1f; - scope_line_thickness = Max(scope_line_thickness, 1.f); - DR_Bucket *bucket = dr_bucket_make(); - DR_BucketScope(bucket) - { - Vec2F32 text_base_pos = v2f32(text_container_box->rect.x0 + params->line_num_width_px + line_num_padding_px, - text_container_box->rect.y0); - F32 ancestor_chain_depth = 0; - for(TXT_ScopeNode *scope_n = cursor_scope_node; - scope_n != &txt_scope_node_nil; - scope_n = txt_scope_node_from_info_num(params->text_info, scope_n->parent_num), ancestor_chain_depth += 1) - { - Vec4F32 scope_line_color = highlight_color; - F32 scope_line_color_target = highlight_color.w; - scope_line_color_target *= 1 - ancestor_chain_depth / 6.f; - scope_line_color_target = Max(0.2f, scope_line_color_target); - F32 scope_line_color_t = ui_anim(ui_key_from_stringf(text_container_box->key, "###scope_depth_%I64x_%I64x", scope_n->token_idx_range.min, scope_n->token_idx_range.max), scope_line_color_target, .rate = rd_state->menu_animation_rate__slow); - scope_line_color.w = scope_line_color_t*0.5f; - Rng1U64 token_idx_range = scope_n->token_idx_range; - Rng1U64 off_range = r1u64(params->text_info->tokens.v[token_idx_range.min].range.min, params->text_info->tokens.v[token_idx_range.max].range.min); - TxtRng txt_range = txt_rng(txt_pt_from_info_off__linear_scan(params->text_info, off_range.min), txt_pt_from_info_off__linear_scan(params->text_info, off_range.max)); - - //- rjf: single-line scopes (underline) - if(txt_range.min.line == txt_range.max.line && contains_1s64(params->line_num_range, txt_range.min.line)) - { - S64 line_num = txt_range.min.line; - U64 line_idx = (U64)(line_num - params->line_num_range.min); - String8 line_string = params->line_text[line_idx]; - Rng1U64 line_off_range = r1u64(off_range.min - params->line_ranges[line_idx].min, off_range.max+1 - params->line_ranges[line_idx].min); - Rng1F32 x_px_range = r1f32(fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_string, line_off_range.min)).x, - fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_string, line_off_range.max)).x); - F32 line_y = line_idx*params->line_height_px; - Rng2F32 underline_rect = r2f32p(text_base_pos.x + x_px_range.min, - text_base_pos.y + line_y + params->line_height_px*0.5f, - text_base_pos.x + x_px_range.max+1, - text_base_pos.y + line_y + params->line_height_px + params->font_size*0.1f); - F32 midpoint = center_1f32(r1f32(underline_rect.x0, underline_rect.x1)); - F32 t = ui_anim(ui_key_from_stringf(text_container_box->key, "###scope_%I64x_%I64x", scope_n->token_idx_range.min, scope_n->token_idx_range.max), 1.f, .rate = rd_state->catchall_animation_rate); - Rng2F32 underline_clip = {0}; - underline_clip.x0 = mix_1f32(midpoint, underline_rect.x0 - params->font_size, t); - underline_clip.x1 = mix_1f32(midpoint, underline_rect.x1 + params->font_size, t); - underline_clip.y0 = underline_rect.y0 + (underline_rect.y1 - underline_rect.y0) * 0.65f; - underline_clip.y1 = 10000; - DR_ClipScope(underline_clip) - { - dr_rect(underline_rect, scope_line_color, params->font_size*0.1f, scope_line_thickness, 1.f); - } - } - - //- rjf: cross-line scopes - if(txt_range.min.line != txt_range.max.line && params->line_num_range.max > txt_range.min.line && params->line_num_range.min < txt_range.max.line) - { - String8 opener_line = txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.min.line); - String8 closer_line = txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.max.line); - String8 opener_line_pre_opener = str8_prefix(opener_line, txt_range.min.column-1); - String8 closer_line_pre_closer = str8_prefix(closer_line, txt_range.max.column-1); - F32 opener_line_pre_opener_px = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, opener_line_pre_opener).x; - F32 closer_line_pre_closer_px = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, closer_line_pre_closer).x; - F32 indent_depth_px = Min(opener_line_pre_opener_px, closer_line_pre_closer_px); - Rng1F32 scope_range_y_px = r1f32(0, dim_2f32(text_container_box->rect).y); - if(contains_1s64(params->line_num_range, txt_range.min.line)) - { - scope_range_y_px.min = (txt_range.min.line - params->line_num_range.min) * params->line_height_px; - } - if(contains_1s64(params->line_num_range, txt_range.max.line)) - { - scope_range_y_px.max = ((txt_range.max.line - params->line_num_range.min) + 1) * params->line_height_px; - } - F32 midpoint = center_1f32(scope_range_y_px); - F32 t = ui_anim(ui_key_from_stringf(text_container_box->key, "###scope_%I64x_%I64x", scope_n->token_idx_range.min, scope_n->token_idx_range.max), 1.f, .rate = rd_state->catchall_animation_rate); - Rng2F32 scope_rect = r2f32p(text_base_pos.x + indent_depth_px - params->font_size*0.2f, - text_base_pos.y + scope_range_y_px.min, - text_base_pos.x + indent_depth_px - params->font_size*0.2f + params->font_size*1.f, - text_base_pos.y + scope_range_y_px.max); - Rng2F32 scope_clip_rect = {0}; - { - scope_clip_rect.x0 = scope_rect.x0 - params->font_size*10.f; - scope_clip_rect.x1 = scope_rect.x0 + (scope_rect.x1 - scope_rect.x0)*0.4f; - scope_clip_rect.y0 = mix_1f32(midpoint, scope_rect.y0 - params->font_size*0.1f, t); - scope_clip_rect.y1 = mix_1f32(midpoint, scope_rect.y1 + params->font_size*0.1f, t); - } - DR_ClipScope(scope_clip_rect) - { - dr_rect(scope_rect, scope_line_color, params->font_size*0.1f, scope_line_thickness, 1.f); - } - } - } - } - ui_box_equip_draw_bucket(text_container_box, bucket); - } - ////////////////////////////// //- rjf: build exception annotations // From 2231228ffb34289edb4287a347734ef12fcc3a0f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 10:18:06 -0700 Subject: [PATCH 527/850] store loaded debug infos as user config, but project-tagged; eliminate 'recent files' from project file (they are almost entirely duplicative of debug info source files); adjust 'last_user' remembering semantics - do not automatically change last_user when setting user explicitly from command line --- src/raddbg/generated/raddbg.meta.c | 12 ++-- src/raddbg/generated/raddbg.meta.h | 5 +- src/raddbg/raddbg.mdesk | 10 +-- src/raddbg/raddbg_core.c | 101 ++++++++++++----------------- src/raddbg/raddbg_eval.c | 24 +++++-- src/raddbg/raddbg_legacy_config.c | 3 +- src/raddbg/raddbg_main.c | 4 +- 7 files changed, 72 insertions(+), 87 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index bc334703..ca2440a2 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[360] = +RD_VocabInfo rd_vocab_info_table[358] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -94,7 +94,6 @@ RD_VocabInfo rd_vocab_info_table[360] = {str8_lit_comp("panel"), str8_lit_comp("panels"), str8_lit_comp("Panel"), str8_lit_comp("Panels"), RD_IconKind_Null}, {str8_lit_comp("tab"), str8_lit_comp("tabs"), str8_lit_comp("Tab"), str8_lit_comp("Tabs"), RD_IconKind_Null}, {str8_lit_comp("recent_project"), str8_lit_comp("recent_projects"), str8_lit_comp("Recent Project"), str8_lit_comp("Recent Projects"), RD_IconKind_Briefcase}, -{str8_lit_comp("recent_file"), str8_lit_comp("recent_files"), str8_lit_comp("Recent File"), str8_lit_comp("Recent Files"), RD_IconKind_FileOutline}, {str8_lit_comp("src"), str8_lit_comp("srcs"), str8_lit_comp("Source"), str8_lit_comp("Sources"), RD_IconKind_Null}, {str8_lit_comp("dst"), str8_lit_comp("dsts"), str8_lit_comp("Destination"), str8_lit_comp("Destinations"), RD_IconKind_Null}, {str8_lit_comp("source"), str8_lit_comp("sources"), str8_lit_comp("Source"), str8_lit_comp("Sources"), RD_IconKind_Null}, @@ -270,7 +269,6 @@ RD_VocabInfo rd_vocab_info_table[360] = {str8_lit_comp("open"), str8_lit_comp(""), str8_lit_comp("Open"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("switch"), str8_lit_comp(""), str8_lit_comp("Switch"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("switch_to_partner_file"), str8_lit_comp(""), str8_lit_comp("Switch To Partner File"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("record_file_in_project"), str8_lit_comp(""), str8_lit_comp("Record File In Project"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("show_file_in_explorer"), str8_lit_comp(""), str8_lit_comp("Show File In Explorer"), str8_lit_comp(""), RD_IconKind_FolderClosedFilled}, {str8_lit_comp("go_to_disassembly"), str8_lit_comp(""), str8_lit_comp("Go To Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, {str8_lit_comp("go_to_source"), str8_lit_comp(""), str8_lit_comp("Go To Source"), str8_lit_comp(""), RD_IconKind_FileOutline}, @@ -426,7 +424,7 @@ RD_VocabInfo rd_vocab_info_table[360] = {str8_lit_comp("geo3d"), str8_lit_comp(""), str8_lit_comp("Geometry (3D)"), str8_lit_comp(""), RD_IconKind_Cube}, }; -RD_NameSchemaInfo rd_name_schema_info_table[40] = +RD_NameSchemaInfo rd_name_schema_info_table[39] = { {str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, @@ -463,7 +461,6 @@ RD_NameSchemaInfo rd_name_schema_info_table[40] = {str8_lit_comp("file_path_map"), 0, str8_lit_comp("@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}")}, {str8_lit_comp("type_view"), 0, str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, {str8_lit_comp("recent_project"), 0, str8_lit_comp("x:{'path':path}")}, -{str8_lit_comp("recent_file"), 0, str8_lit_comp("x:{'path':path}")}, {str8_lit_comp("machine"), 0, str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}")}, {str8_lit_comp("process"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}")}, {str8_lit_comp("module"), 0, str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}")}, @@ -576,7 +573,7 @@ Rng1U64 rd_reg_slot_range_table[49] = {OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[249] = +RD_CmdKindInfo rd_cmd_kind_info_table[248] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -671,9 +668,8 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("switch"), str8_lit_comp("Switches to a recent file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_files, query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("switch"), str8_lit_comp("Switches to a recent file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_file_in_project"), str8_lit_comp("Records the passed file path as a recent file in the currently loaded project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 74d7fad6..2bf5fb03 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -157,7 +157,6 @@ RD_CmdKind_SetCurrentPath, RD_CmdKind_Open, RD_CmdKind_Switch, RD_CmdKind_SwitchToPartnerFile, -RD_CmdKind_RecordFileInProject, RD_CmdKind_ShowFileInExplorer, RD_CmdKind_GoToDisassembly, RD_CmdKind_GoToSource, @@ -603,8 +602,8 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[360]; -extern RD_NameSchemaInfo rd_name_schema_info_table[40]; +extern RD_VocabInfo rd_vocab_info_table[358]; +extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; extern String8 rd_binding_version_remap_old_name_table[8]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 86eb8621..57ef3e0e 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -119,7 +119,6 @@ RD_VocabTable: {panel _ "Panel" _ Null } {tab _ "Tab" _ Null } {recent_project _ "Recent Project" _ Briefcase } - {recent_file _ "Recent File" _ FileOutline } {src _ "Source" _ Null } {dst _ "Destination" _ Null } {source _ "Source" _ Null } @@ -783,12 +782,6 @@ RD_VocabTable: ```x:{'path':path}```, } - //- rjf: @schema recent_file - { - recent_file, 0, - ```x:{'path':path}```, - } - //- rjf: @schema machine { machine, 0, @@ -1029,9 +1022,8 @@ RD_CmdTable: // | | | | //- rjf: files {SetCurrentPath 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } {Open 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } - {Switch 1 0 0 0 "query:recent_files, query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "switch" "Switch" "Switches to a recent file." "code,source,file" "" } + {Switch 1 0 0 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "switch" "Switch" "Switches to a recent file." "code,source,file" "" } {SwitchToPartnerFile 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } - {RecordFileInProject 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "record_file_in_project" "Record File In Project" "Records the passed file path as a recent file in the currently loaded project." "" "" } {ShowFileInExplorer 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "$file," } //- rjf: source <-> disasm diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 414c3b99..cec48d25 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -152,7 +152,7 @@ internal B32 rd_cfg_is_project_filtered(CFG_Node *cfg) { CFG_Node *project = cfg_node_child_from_string(cfg, str8_lit("project")); - B32 result = (project != &cfg_nil_node && !path_match_normalized(rd_state->project_path, project->first->string)); + B32 result = (project != &cfg_nil_node && project->first->string.size != 0 && !path_match_normalized(rd_state->project_path, project->first->string)); return result; } @@ -2412,11 +2412,7 @@ rd_view_ui(Rng2F32 rect) case RD_EvalSpaceKind_MetaCfg: { CFG_Node *cfg = rd_cfg_from_eval_space(eval.space); - if(str8_match(cfg->string, str8_lit("recent_file"), 0)) - { - rd_cmd(RD_CmdKind_Switch, .cfg = cfg->id); - } - else if(str8_match(cfg->string, str8_lit("recent_project"), 0)) + if(str8_match(cfg->string, str8_lit("recent_project"), 0)) { rd_cmd(RD_CmdKind_OpenRecentProject, .cfg = cfg->id); } @@ -10346,7 +10342,7 @@ rd_init(CmdLine *cmdln) } // rjf: do initial load of user (project will be loaded by the initial user load if not specified) - rd_cmd(RD_CmdKind_OpenUser, .file_path = user_path); + rd_cmd(RD_CmdKind_OpenUser, .file_path = user_path, .non_graphical = 1); if(project_path.size != 0) { rd_cmd(RD_CmdKind_OpenProject, .file_path = project_path); @@ -10557,6 +10553,12 @@ rd_frame(void) CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("debug_info")); for EachNode(n, CFG_NodePtrNode, dbg_infos.first) { + // rjf: skip debug infos for other projects + if(rd_cfg_is_project_filtered(n->v)) + { + continue; + } + // rjf: unpack debug info config CFG_Node *di = n->v; String8 path = rd_path_from_cfg(di); @@ -11103,6 +11105,7 @@ rd_frame(void) for EachNode(n, CFG_NodePtrNode, dbg_infos.first) { CFG_Node *di = n->v; + if(rd_cfg_is_project_filtered(di)) { continue; } String8 path = rd_path_from_cfg(di); CFG_Node *timestamp_node = cfg_node_child_from_string(di, str8_lit("timestamp")); U64 timestamp = 0; @@ -11385,7 +11388,6 @@ rd_frame(void) str8_lit("file_path_map"), str8_lit("type_view"), str8_lit("recent_project"), - str8_lit("recent_file"), }; for EachElement(cfg_name_idx, evallable_cfg_names) { @@ -11491,6 +11493,10 @@ rd_frame(void) CFG_Node *watch_tab = n->v; for(CFG_Node *child = watch_tab->first; child != &cfg_nil_node; child = child->next) { + if(rd_cfg_is_project_filtered(child)) + { + continue; + } if(str8_match(child->string, str8_lit("watch"), 0)) { CFG_Node *watch = child; @@ -12248,7 +12254,6 @@ rd_frame(void) } str8_list_pushf(scratch.arena, &exprs, "query:targets"); str8_list_pushf(scratch.arena, &exprs, "query:breakpoints"); - str8_list_pushf(scratch.arena, &exprs, "query:recent_files"); str8_list_pushf(scratch.arena, &exprs, "query:recent_projects"); str8_list_pushf(scratch.arena, &exprs, "query:machines"); str8_list_pushf(scratch.arena, &exprs, "query:processes"); @@ -12630,7 +12635,7 @@ rd_frame(void) } //- rjf: record last-opened user in config directory - if(file_is_okay && kind == RD_CmdKind_OpenUser) + if(file_is_okay && kind == RD_CmdKind_OpenUser && !rd_regs()->non_graphical) { rd_cmd(RD_CmdKind_RecordUserAsLastOpened); } @@ -12652,15 +12657,17 @@ rd_frame(void) { if(rd_cfg_is_project_filtered(panel->selected_tab)) { + CFG_Node *fallback_tab = &cfg_nil_node; for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next) { CFG_Node *tab = tab_n->v; if(!rd_cfg_is_project_filtered(tab)) { - rd_cmd(RD_CmdKind_FocusTab, .tab = tab->id); + fallback_tab = tab; break; } } + rd_cmd(RD_CmdKind_FocusTab, .tab = fallback_tab->id); } } } @@ -12712,6 +12719,7 @@ rd_frame(void) } }break; case RD_CmdKind_RecordProjectInUser: + if(rd_regs()->file_path.size != 0) { String8 file_path = rd_regs()->file_path; CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit("user")); @@ -13601,7 +13609,6 @@ rd_frame(void) FileProperties props = properties_from_file_path(path); if(props.created != 0) { - rd_cmd(RD_CmdKind_RecordFileInProject); rd_cmd(RD_CmdKind_BuildTab, .string = str8_lit("pending"), .expr = rd_eval_string_from_file_path(scratch.arena, path)); } else @@ -13611,17 +13618,7 @@ rd_frame(void) }break; case RD_CmdKind_Switch: { - String8 path = {0}; - if(path.size == 0) - { - CFG_Node *recent_file = cfg_node_from_id(rd_regs()->cfg); - CFG_Node *path_root = cfg_node_child_from_string(recent_file, str8_lit("path")); - path = path_root->first->string; - } - if(path.size == 0) - { - path = rd_regs()->file_path; - } + String8 path = rd_regs()->file_path; rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = path, .cursor = txt_pt(0, 0), .vaddr = 0, .force_focus = 1, .prefer_new_tab = 1); }break; case RD_CmdKind_SwitchToPartnerFile: @@ -13655,35 +13652,6 @@ rd_frame(void) } } }break; - case RD_CmdKind_RecordFileInProject: - if(rd_regs()->file_path.size != 0) - { - String8 path = rd_regs()->file_path; - CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit("project")); - CFG_NodePtrList recent_files = cfg_node_child_list_from_string(scratch.arena, project, str8_lit("recent_file")); - CFG_Node *recent_file = &cfg_nil_node; - for(CFG_NodePtrNode *n = recent_files.first; n != 0; n = n->next) - { - if(path_match_normalized(rd_path_from_cfg(n->v), path)) - { - recent_file = n->v; - break; - } - } - if(recent_file == &cfg_nil_node) - { - recent_file = cfg_node_new(rd_state->cfg, project, str8_lit("recent_file")); - CFG_Node *path_root = cfg_node_new(rd_state->cfg, recent_file, str8_lit("path")); - cfg_node_new(rd_state->cfg, path_root, path); - } - cfg_node_unhook(rd_state->cfg, project, recent_file); - cfg_node_insert_child(rd_state->cfg, project, &cfg_nil_node, recent_file); - recent_files = cfg_node_child_list_from_string(scratch.arena, project, str8_lit("recent_file")); - if(recent_files.count > 256) - { - cfg_node_release(rd_state->cfg, recent_files.last->v); - } - }break; case RD_CmdKind_ShowFileInExplorer: if(rd_regs()->file_path.size != 0) { @@ -14728,6 +14696,7 @@ rd_frame(void) cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit("cursor_column")), str8_lit("1")); cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit("mark_line")), str8_lit("1")); cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit("mark_column")), str8_lit("1")); + cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit("project")), rd_state->project_path); } else if(dst_panel != &cfg_nil_panel_node && dst_tab == &cfg_nil_node) { @@ -14739,6 +14708,7 @@ rd_frame(void) CFG_Node *auto_root = cfg_node_new(rd_state->cfg, dst_tab, str8_lit("auto")); cfg_node_new(rd_state->cfg, auto_root, str8_lit("1")); } + cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit("project")), rd_state->project_path); } // rjf: determine if we need a contain or center @@ -14765,9 +14735,6 @@ rd_frame(void) } rd_cmd(cursor_snap_kind); } - - // rjf: record - rd_cmd(RD_CmdKind_RecordFileInProject, .file_path = file_path); } // rjf: snap to disasm @@ -15242,10 +15209,12 @@ rd_frame(void) //- rjf: debug infos case RD_CmdKind_LoadDebugInfo: { - CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit("project")); - CFG_Node *di = cfg_node_new(rd_state->cfg, project, str8_lit("debug_info")); + CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit("user")); + CFG_Node *di = cfg_node_new(rd_state->cfg, user, str8_lit("debug_info")); CFG_Node *path = cfg_node_new(rd_state->cfg, di, str8_lit("path")); cfg_node_new(rd_state->cfg, path, rd_regs()->file_path); + CFG_Node *project = cfg_node_new(rd_state->cfg, di, str8_lit("project")); + cfg_node_new(rd_state->cfg, project, rd_state->project_path); }break; case RD_CmdKind_UnloadDebugInfo: { @@ -15411,6 +15380,10 @@ rd_frame(void) CFG_Node *existing_watch = &cfg_nil_node; for(CFG_Node *child = watch_tab->first; child != &cfg_nil_node; child = child->next) { + if(rd_cfg_is_project_filtered(child)) + { + continue; + } if(str8_match(child->string, str8_lit("watch"), 0) && str8_match(child->first->string, rd_regs()->string, 0)) { existing_watch = child; @@ -16358,6 +16331,10 @@ rd_frame(void) CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("debug_info")); for EachNode(n, CFG_NodePtrNode, dbg_infos.first) { + if(rd_cfg_is_project_filtered(n->v)) + { + continue; + } cfg_node_release(rd_state->cfg, n->v); } } @@ -16375,6 +16352,10 @@ rd_frame(void) for EachNode(n, CFG_NodePtrNode, dbg_infos.first) { CFG_Node *di = n->v; + if(rd_cfg_is_project_filtered(di)) + { + continue; + } String8 path = rd_path_from_cfg(di); if(str8_match(path, new_path, 0)) { @@ -16385,12 +16366,14 @@ rd_frame(void) } if(!path_found) { - CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit("project")); - CFG_Node *di = cfg_node_new(rd_state->cfg, project, str8_lit("debug_info")); + CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit("user")); + CFG_Node *di = cfg_node_new(rd_state->cfg, user, str8_lit("debug_info")); CFG_Node *path_root = cfg_node_new(rd_state->cfg, di, str8_lit("path")); CFG_Node *timestamp_root = cfg_node_new(rd_state->cfg, di, str8_lit("timestamp")); + CFG_Node *project_root = cfg_node_new(rd_state->cfg, di, str8_lit("project")); cfg_node_new(rd_state->cfg, path_root, new_path); cfg_node_newf(rd_state->cfg, timestamp_root, "%I64u", debug_info_path->timestamp); + cfg_node_new(rd_state->cfg, project_root, rd_state->project_path); } else { diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 28c88fa9..b100e756 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -760,7 +760,18 @@ E_TYPE_IREXT_FUNCTION_DEF(cfgs_slice) String8 cfg_name = rd_singular_from_code_name_plural(type->name); //- rjf: gather cfgs - CFG_NodePtrList cfgs_list = cfg_node_top_level_list_from_string(scratch.arena, cfg_name); + CFG_NodePtrList cfgs_list = {0}; + { + CFG_NodePtrList cfgs_list__all = cfg_node_top_level_list_from_string(scratch.arena, cfg_name); + for EachNode(n, CFG_NodePtrNode, cfgs_list__all.first) + { + if(rd_cfg_is_project_filtered(n->v)) + { + continue; + } + cfg_node_ptr_list_push(scratch.arena, &cfgs_list, n->v); + } + } //- rjf: gather commands String8List cmds_list = {0}; @@ -851,6 +862,10 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_slice) for EachIndex(idx, ext->cfgs.count) { CFG_Node *cfg = ext->cfgs.v[idx]; + if(rd_cfg_is_project_filtered(cfg)) + { + continue; + } DR_FStrList fstrs = rd_title_fstrs_from_cfg(scratch.arena, cfg, 1); String8 string = dr_string_from_fstrs(scratch.arena, &fstrs); FuzzyMatchRangeList fuzzy_matches = fuzzy_match_find(scratch.arena, filter, string); @@ -1198,15 +1213,16 @@ E_TYPE_IREXT_FUNCTION_DEF(watches) E_Interpretation interpret = e_interpret(bytecode); E_Space space = interpret.space; CFG_Node *target = rd_cfg_from_eval_space(space); - CFG_NodePtrList env_strings = {0}; + CFG_NodePtrList cfgs = {0}; for(CFG_Node *child = target->first; child != &cfg_nil_node; child = child->next) { + if(rd_cfg_is_project_filtered(child)) {continue;} if(str8_match(child->string, str8_lit("watch"), 0)) { - cfg_node_ptr_list_push(scratch.arena, &env_strings, child); + cfg_node_ptr_list_push(scratch.arena, &cfgs, child); } } - accel->cfgs = cfg_node_ptr_array_from_list(arena, &env_strings); + accel->cfgs = cfg_node_ptr_array_from_list(arena, &cfgs); scratch_end(scratch); } E_IRExt result = {accel}; diff --git a/src/raddbg/raddbg_legacy_config.c b/src/raddbg/raddbg_legacy_config.c index abf6f692..07b85df6 100644 --- a/src/raddbg/raddbg_legacy_config.c +++ b/src/raddbg/raddbg_legacy_config.c @@ -43,8 +43,7 @@ rd_cfg_tree_list_from_string__pre_0_9_16(Arena *arena, String8 file_path, String } //- rjf: recent files / projects - if(str8_match(tln->string, str8_lit("recent_file"), 0) || - str8_match(tln->string, str8_lit("recent_project"), 0)) + if(str8_match(tln->string, str8_lit("recent_project"), 0)) { CFG_Node *dst_root = cfg_node_new(rd_state->cfg, &cfg_nil_node, tln->string); cfg_node_ptr_list_push(arena, &result, dst_root); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index cecefbfb..83200210 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -2,7 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: post-0.9.25 TODO notes +//~ rjf: post-0.9.26 TODO notes // // [ ] "autos" collection, which can be evaluated // [ ] show "autos" inline in source code near thread? @@ -18,7 +18,6 @@ // // [ ] linux/dwarf fixes // [ ] excessive CPU usage on async threads - barrier impl? -// [ ] step-over/step-into doesn't step successfully in many cases, just causes a continue // [ ] type views for `MyByte *` example do not match correctly // // [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! @@ -270,6 +269,7 @@ // [x] new project / user should not require picking a path; should just // by default go to "untitled" in default user path // [x] memory view mutation controls +// [x] step-over/step-into doesn't step successfully in many cases, just causes a continue //////////////////////////////// //~ rjf: Build Options From 1e0bcf0504259e95614da0936b8704a5fdcc8cf2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 10:30:54 -0700 Subject: [PATCH 528/850] treat relative implicit project args correctly --- src/raddbg/raddbg_core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index cec48d25..989ff286 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10220,11 +10220,11 @@ rd_init(CmdLine *cmdln) String8 header_type_suffix = str8_skip(header_suffix, str8_find_needle(header_suffix, 0, str8_lit(" "), 0)+1); if(str8_match(header_type_suffix, str8_lit("user"), StringMatchFlag_RightSideSloppy)) { - implicit_user_arg = arg; + implicit_user_arg = path_absolute_dst_from_relative_dst_src(scratch.arena, arg, get_process_info()->initial_path); } else if(str8_match(header_type_suffix, str8_lit("project"), StringMatchFlag_RightSideSloppy)) { - implicit_project_arg = arg; + implicit_project_arg = path_absolute_dst_from_relative_dst_src(scratch.arena, arg, get_process_info()->initial_path); } } file_close(file); @@ -10341,7 +10341,7 @@ rd_init(CmdLine *cmdln) rd_state->project_path = push_str8_copy(rd_state->project_path_arena, project_path); } - // rjf: do initial load of user (project will be loaded by the initial user load if not specified) + // rjf: do initial load of user/project rd_cmd(RD_CmdKind_OpenUser, .file_path = user_path, .non_graphical = 1); if(project_path.size != 0) { From 0563cd3b80a89bfcb1d9f3b734defcd0b7ea380c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 10:43:43 -0700 Subject: [PATCH 529/850] fix incorrect lifetime of calculated implicit user/project arguments --- src/raddbg/raddbg_core.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 989ff286..9ca9887e 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10071,6 +10071,7 @@ rd_next_view_cmd(RD_Cmd **cmd) internal void rd_init(CmdLine *cmdln) { + Temp scratch = scratch_begin(0, 0); ProfBeginFunction(); Arena *arena = arena_alloc(); rd_state = push_array(arena, RD_State, 1); @@ -10193,7 +10194,7 @@ rd_init(CmdLine *cmdln) String8 implicit_user_arg = {0}; String8 implicit_project_arg = {0}; { - Temp scratch = scratch_begin(0, 0); + Temp scratch2 = scratch_begin(&scratch.arena, 1); String8List target_args = {0}; { B32 after_first_non_flag = 0; @@ -10235,7 +10236,7 @@ rd_init(CmdLine *cmdln) } if(after_first_non_flag && !is_cfg) { - str8_list_push(scratch.arena, &target_args, arg); + str8_list_push(scratch2.arena, &target_args, arg); } } } @@ -10253,16 +10254,16 @@ rd_init(CmdLine *cmdln) PathStyle style = path_style_from_str8(exe_name); if(style == PathStyle_Relative) { - String8 current_path = get_current_path(scratch.arena); - exe_name = push_str8f(scratch.arena, "%S/%S", current_path, exe_name); - exe_name = path_normalized_from_string(scratch.arena, exe_name); + String8 current_path = get_current_path(scratch2.arena); + exe_name = push_str8f(scratch2.arena, "%S/%S", current_path, exe_name); + exe_name = path_normalized_from_string(scratch2.arena, exe_name); } executable_name_string = exe_name; } // rjf: get current directory, use as working directory { - working_directory_string = path_normalized_from_string(scratch.arena, get_current_path(scratch.arena)); + working_directory_string = path_normalized_from_string(scratch2.arena, get_current_path(scratch2.arena)); } // rjf: unpack arguments @@ -10271,15 +10272,15 @@ rd_init(CmdLine *cmdln) { if(str8_find_needle(n->string, 0, str8_lit(" "), 0) < n->string.size) { - str8_list_pushf(scratch.arena, &passthrough_args_list, "\"%S\"", n->string); + str8_list_pushf(scratch2.arena, &passthrough_args_list, "\"%S\"", n->string); } else { - str8_list_push(scratch.arena, &passthrough_args_list, n->string); + str8_list_push(scratch2.arena, &passthrough_args_list, n->string); } } StringJoin join = {str8_lit(""), str8_lit(" "), str8_lit("")}; - arguments_string = str8_list_join(scratch.arena, &passthrough_args_list, &join); + arguments_string = str8_list_join(scratch2.arena, &passthrough_args_list, &join); } //- rjf: build config tree @@ -10293,12 +10294,12 @@ rd_init(CmdLine *cmdln) cfg_node_new(rd_state->cfg, wdir, working_directory_string); rd_cmd(RD_CmdKind_SelectTarget, .cfg = target->id); } - scratch_end(scratch); + scratch_end(scratch2); } // rjf: set up user / project paths { - Temp scratch = scratch_begin(0, 0); + Temp scratch2 = scratch_begin(&scratch.arena, 1); // rjf: unpack command line arguments String8 user_path = cmd_line_string(cmdln, str8_lit("user")); @@ -10306,16 +10307,16 @@ rd_init(CmdLine *cmdln) { if(user_path.size != 0) { - user_path = path_absolute_dst_from_relative_dst_src(scratch.arena, user_path, get_process_info()->initial_path); + user_path = path_absolute_dst_from_relative_dst_src(scratch2.arena, user_path, get_process_info()->initial_path); } if(project_path.size != 0) { - project_path = path_absolute_dst_from_relative_dst_src(scratch.arena, project_path, get_process_info()->initial_path); + project_path = path_absolute_dst_from_relative_dst_src(scratch2.arena, project_path, get_process_info()->initial_path); } } { String8 user_program_data_path = get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg", user_program_data_path); + String8 user_data_folder = push_str8f(scratch2.arena, "%S/raddbg", user_program_data_path); make_directory(user_data_folder); if(user_path.size == 0) { @@ -10323,12 +10324,12 @@ rd_init(CmdLine *cmdln) } if(user_path.size == 0) { - String8 last_user_path = push_str8f(scratch.arena, "%S/last_user", user_data_folder); - user_path = data_from_file_path(scratch.arena, last_user_path); + String8 last_user_path = push_str8f(scratch2.arena, "%S/last_user", user_data_folder); + user_path = data_from_file_path(scratch2.arena, last_user_path); } if(user_path.size == 0) { - user_path = push_str8f(scratch.arena, "%S/default.raddbg_user", user_data_folder); + user_path = push_str8f(scratch2.arena, "%S/default.raddbg_user", user_data_folder); } } if(project_path.size == 0) @@ -10348,7 +10349,7 @@ rd_init(CmdLine *cmdln) rd_cmd(RD_CmdKind_OpenProject, .file_path = project_path); } - scratch_end(scratch); + scratch_end(scratch2); } // rjf: unpack icon image data @@ -10447,6 +10448,7 @@ rd_init(CmdLine *cmdln) } ProfEnd(); + scratch_end(scratch); } internal void From a1778421c9f901f0ec83bd6c70d8818bf5f6575d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 11:23:48 -0700 Subject: [PATCH 530/850] eval extended opcode for setting base offset - used for correct cross-module evaluations, fixes go-to-definition when thread is not in module of resolved identifier's symbol --- src/dbg_engine/dbg_engine_ctrl.c | 6 ++--- src/eval/eval_core.h | 1 + src/eval/eval_interpret.c | 20 +++++++++------- src/eval/eval_ir.c | 40 +++++++++++++++++++++++++++++++- src/eval/eval_ir.h | 1 + src/raddbg/raddbg_core.c | 3 +-- 6 files changed, 55 insertions(+), 16 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index d33b1f5d..b69a33b4 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -4575,12 +4575,10 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti // U64 eval_modules_count = Max(1, entity_ctx->entity_kind_counts[D_EntityKind_Module]); E_Module *eval_modules = push_array(arena, E_Module, eval_modules_count); - E_Module *eval_modules_primary = &eval_modules[0]; - eval_modules_primary->vaddr_range = r1u64(0, max_U64); + E_Module *eval_modules_primary = &e_module_nil; U64 eval_dbg_infos_count = Max(1, entity_ctx->entity_kind_counts[D_EntityKind_Module]); E_DbgInfo *eval_dbg_infos = push_array(arena, E_DbgInfo, eval_dbg_infos_count); - E_DbgInfo *eval_dbg_infos_primary = &eval_dbg_infos[0]; - MemoryCopyStruct(eval_dbg_infos_primary, &e_dbg_info_nil); + E_DbgInfo *eval_dbg_infos_primary = &e_dbg_info_nil; { U64 eval_module_idx = 0; U64 eval_dbg_info_idx = 0; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 48eaeba0..a870fb59 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -73,6 +73,7 @@ enum { E_IRExtKind_Bytecode = RDI_EvalOp_COUNT, E_IRExtKind_SetSpace, + E_IRExtKind_SetBaseOff, E_IRExtKind_COUNT }; diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 948c9730..4dd1362e 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -173,6 +173,11 @@ e_interpret(String8 bytecode) { selected_space = e_interpret_ctx->primary_space; } + U64 base_off = 0; + if(e_interpret_ctx->module_base != 0) + { + base_off = e_interpret_ctx->module_base[0]; + } //- rjf: iterate bytecode & perform ops U8 *ptr = bytecode.str; @@ -189,6 +194,7 @@ e_interpret(String8 bytecode) else switch(op) { case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break; + case E_IRExtKind_SetBaseOff:{ctrlbits = RDI_EVAL_CTRLBITS(8, 0, 0);}break; default: { result.code = E_InterpretationCode_BadOp; @@ -241,6 +247,10 @@ e_interpret(String8 bytecode) { MemoryCopy(&selected_space, &imm, sizeof(selected_space)); }break; + case E_IRExtKind_SetBaseOff: + { + base_off = imm.u64; + }break; case RDI_EvalOp_Stop: { @@ -325,15 +335,7 @@ e_interpret(String8 bytecode) case RDI_EvalOp_ModuleOff: { - if(e_interpret_ctx->module_base != 0) - { - nval.u64 = *e_interpret_ctx->module_base + imm.u64; - } - else - { - result.code = E_InterpretationCode_BadModuleBase; - goto done; - } + nval.u64 = base_off + imm.u64; }break; case RDI_EvalOp_TLSOff: diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 00125902..919905ba 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -76,6 +76,18 @@ e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space) list->encoded_size += 1 + sizeof(space); } +internal void +e_oplist_push_set_base_off(Arena *arena, E_OpList *list, U64 off) +{ + E_Op *node = push_array_no_zero(arena, E_Op, 1); + node->opcode = E_IRExtKind_SetBaseOff; + StaticAssert(sizeof(node->value) >= sizeof(off), node_value_size_check); + MemoryCopy(&node->value, &off, sizeof(off)); + SLLQueuePush(list->first, list->last, node); + list->op_count += 1; + list->encoded_size += 1 + sizeof(off); +} + internal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string) { @@ -2065,8 +2077,14 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I Arch arch = module->arch; RDI_Parsed *rdi = dbg_info->rdi; RDI_Location location = mapped_location; + E_OpList base_off_adjusted_oplist = {0}; + if(module != e_base_ctx->primary_module) + { + e_oplist_push_set_base_off(scratch.arena, &base_off_adjusted_oplist, module->vaddr_range.min); + } E_OpList oplist = e_oplist_from_location(scratch.arena, rdi, location); - mapped_bytecode = e_bytecode_from_oplist(arena, &oplist); + e_oplist_concat_in_place(&base_off_adjusted_oplist, &oplist); + mapped_bytecode = e_bytecode_from_oplist(arena, &base_off_adjusted_oplist); mapped_bytecode_space = space; if(rdi_kind_from_location(location) == RDI_LocationKind_ConstantDataOff) { @@ -2540,6 +2558,11 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space e_oplist_push_set_space(arena, out, space); }break; + case E_IRExtKind_SetBaseOff: + { + e_oplist_push_set_base_off(arena, out, root->value.u64); + }break; + case RDI_EvalOp_Cond: { // rjf: generate oplists for each child @@ -2682,6 +2705,21 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) // rjf: advance ptr = next_ptr; }break; + + case E_IRExtKind_SetBaseOff: + { + // rjf: compute bytecode advance + U64 extra_byte_count = sizeof(U64); + U8 *next_ptr = ptr + 1 + extra_byte_count; + Assert(next_ptr <= opl); + + // rjf: fill bytecode + ptr[0] = opcode; + MemoryCopy(ptr + 1, &op->value.u64, extra_byte_count); + + // rjf: advance + ptr = next_ptr; + }break; } } diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 51231f44..0f5fdb6a 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -124,6 +124,7 @@ internal void e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x); internal void e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x); internal void e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode); internal void e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space); +internal void e_oplist_push_set_base_off(Arena *arena, E_OpList *list, U64 off); internal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string); internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 9ca9887e..3a694463 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11173,8 +11173,7 @@ rd_frame(void) D_EntityArray all_modules = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); U64 eval_modules_count = Max(1, all_modules.count); E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count); - E_Module *eval_modules_primary = &eval_modules[0]; - eval_modules_primary->vaddr_range = r1u64(0, max_U64); + E_Module *eval_modules_primary = &e_module_nil; ProfScope("produce all eval modules") { for EachIndex(eval_module_idx, all_modules.count) From 9eecffad78d3a1e50c80afadbf41f2171b5b2e4d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 11:55:52 -0700 Subject: [PATCH 531/850] fix mouse-hover-in-source-evaluation (off -> range) rules, to correctly enclose more expressions --- src/raddbg/raddbg_widgets.c | 2 +- src/text/text.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index eacdf82a..54bee4a7 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2600,7 +2600,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe ////////////////////////////// //- rjf: hover eval // - if(!ui_dragging(text_container_sig) && text_container_sig.event_flags == 0 && mouse_expr.size != 0) + if(!ui_dragging(text_container_sig) && text_container_sig.event_flags == 0 && mouse_expr.size != 0) E_ParentKey(e_key_zero()) { E_Eval eval = e_eval_from_string(mouse_expr); B32 eval_implicit_hover = (eval.irtree.mode != E_Mode_Null && diff --git a/src/text/text.c b/src/text/text.c index 759443b7..c64f8c4c 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -2356,7 +2356,7 @@ txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range if(contains_1u64(token->range, off)) { Rng1U64 token_range_clamped = intersect_1u64(line_range, token->range); - String8 token_string = str8_substr(line_text, r1u64(token_range_clamped.max - line_range.min, token_range_clamped.max - line_range.min)); + String8 token_string = str8_substr(line_text, r1u64(token_range_clamped.min - line_range.min, token_range_clamped.max - line_range.min)); B32 token_ender = 0; switch(token->kind) { @@ -2366,6 +2366,7 @@ txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range token_ender = (str8_match(token_string, str8_lit("]"), 0)); }break; case TXT_TokenKind_Identifier: + case TXT_TokenKind_Numeric: case TXT_TokenKind_Keyword: case TXT_TokenKind_Meta: { @@ -2380,6 +2381,26 @@ txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range } } + // rjf: walk forward from pt_token - consume closing braces + if(pt_token != 0) + { + for(TXT_Token *wf_token = pt_token+1; + wf_token < line_tokens_opl; + wf_token += 1) + { + Rng1U64 wf_token_range_clamped = intersect_1u64(line_range, wf_token->range); + String8 wf_token_string = str8_substr(line_text, r1u64(wf_token_range_clamped.min - line_range.min, wf_token_range_clamped.max - line_range.min)); + if(wf_token->kind == TXT_TokenKind_Symbol && str8_match(wf_token_string, str8_lit("]"), 0)) + { + pt_token = wf_token; + } + else + { + break; + } + } + } + // rjf: found token containing `off`? -> mark that as our initial range if(pt_token != 0) { @@ -2420,6 +2441,7 @@ txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range } }break; case TXT_TokenKind_Identifier: + case TXT_TokenKind_Numeric: { include_wb_token = 1; }break; @@ -2434,6 +2456,12 @@ txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range } } } + + // rjf: exclude standalone numerics + if(pt_token != 0 && pt_token->kind == TXT_TokenKind_Numeric && result.min == pt_token->range.min && result.max == pt_token->range.max) + { + MemoryZeroStruct(&result); + } } scratch_end(scratch); return result; From cfbda8bc4d77129dd25e0a191744bb2d897c5ee9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 11:57:03 -0700 Subject: [PATCH 532/850] clear last-focused-external-window on new session --- src/raddbg/raddbg_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 3a694463..dae9b8da 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -16329,6 +16329,7 @@ rd_frame(void) D_EntityArray all_processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); if(all_processes.count == 1) { + MemoryZeroStruct(&rd_state->prestop_focused_window); CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("debug_info")); for EachNode(n, CFG_NodePtrNode, dbg_infos.first) { From 16b1e728bad2f296e3ba7fcccd185a2a92a271d9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 13:38:04 -0700 Subject: [PATCH 533/850] breakpoints -> project-tagged user config --- src/raddbg/raddbg_core.c | 11 +++++++++-- src/raddbg/raddbg_main.c | 3 +++ src/raddbg/raddbg_views.c | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index dae9b8da..1a62a527 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12142,6 +12142,7 @@ rd_frame(void) CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next) { + if(rd_cfg_is_project_filtered(n->v)){ continue; } CFG_Node *hit_count = cfg_node_child_from_string_or_alloc(rd_state->cfg, n->v, str8_lit("hit_count")); cfg_node_new_replace(rd_state->cfg, hit_count, str8_lit("0")); } @@ -15110,6 +15111,7 @@ rd_frame(void) CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next) { + if(rd_cfg_is_project_filtered(n->v)){ continue; } CFG_Node *bp = n->v; CFG_Node *cnd = cfg_node_child_from_string(bp, str8_lit("condition")); RD_Location loc = rd_location_from_cfg(bp); @@ -15127,8 +15129,10 @@ rd_frame(void) } if(!already_exists) { - CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit("project")); - CFG_Node *bp = cfg_node_new(rd_state->cfg, project, str8_lit("breakpoint")); + CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit("user")); + CFG_Node *bp = cfg_node_new(rd_state->cfg, user, str8_lit("breakpoint")); + CFG_Node *project = cfg_node_new(rd_state->cfg, bp, str8_lit("project")); + cfg_node_new(rd_state->cfg, project, rd_state->project_path); rd_cmd(RD_CmdKind_RelocateCfg, .cfg = bp->id); if(rd_regs()->do_lister && !rd_regs()->non_graphical) { @@ -15151,6 +15155,7 @@ rd_frame(void) CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next) { + if(rd_cfg_is_project_filtered(n->v)){ continue; } cfg_node_release(rd_state->cfg, n->v); } }break; @@ -15159,6 +15164,7 @@ rd_frame(void) CFG_NodePtrList list = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); for(CFG_NodePtrNode *n = list.first; n != 0; n = n->next) { + if(rd_cfg_is_project_filtered(n->v)){ continue; } String8 string = cfg_string_from_tree(rd_state->cmd_output_arena, rd_state->cfg_schema_table, str8_zero(), n->v); str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, string); } @@ -16156,6 +16162,7 @@ rd_frame(void) U64 idx = 0; for(CFG_NodePtrNode *n = bp_cfgs.first; n != 0; n = n->next) { + if(rd_cfg_is_project_filtered(n->v)){ continue; } CFG_Node *src_bp = n->v; B32 src_bp_is_disabled = rd_disabled_from_cfg(src_bp); if(src_bp_is_disabled) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 83200210..5ccb838f 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,9 @@ //////////////////////////////// //~ rjf: post-0.9.26 TODO notes // +// [ ] single-line bad address visualization +// [ ] memory view show unmapped memory as non-zeros +// // [ ] "autos" collection, which can be evaluated // [ ] show "autos" inline in source code near thread? // [ ] memory_size(...) view for quickly evaluating memory sizes diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index eb1834f3..69b380df 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -255,6 +255,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next) { + if(rd_cfg_is_project_filtered(n->v)){ continue; } CFG_Node *bp = n->v; RD_Location loc = rd_location_from_cfg(bp); if(visible_line_num_range.min <= loc.pt.line && loc.pt.line <= visible_line_num_range.max) @@ -379,6 +380,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next) { + if(rd_cfg_is_project_filtered(n->v)){ continue; } CFG_Node *bp = n->v; RD_Location loc = rd_location_from_cfg(bp); E_Value loc_value = e_value_from_string(loc.expr); From e6d83f7450080a4e49d82a454a007081acef8f08 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 14:09:21 -0700 Subject: [PATCH 534/850] visualize unmapped addresses in memory view more correctly (not as 0s) - annotate explicitly with unmapped address annotation --- src/base/base_strings.h | 2 ++ src/raddbg/raddbg_views.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 5f0c8359..b0b8c09c 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -160,6 +160,8 @@ internal U64 cstring32_length(U32 *c); //////////////////////////////// //~ rjf: String Constructors +#define s(S) str8_lit(S) + #define str8_lit(S) str8((U8*)(S), sizeof(S) - 1) #define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,} #define str8_lit_cstr(S) str8((U8*)(S), sizeof(S)) diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 69b380df..42c4137d 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -3172,6 +3172,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) ////////////////////////////// //- rjf: produce fancy strings for all possible byte values in all cells // + DR_FStrList unmapped_byte_fstrs = {0}; DR_FStrList byte_fstrs[256] = {0}; DR_FStrList byte_fstrs_selected[256] = {0}; DR_FStrList byte_fstrs_changed[256] = {0}; @@ -3187,6 +3188,10 @@ RD_VIEW_UI_FUNCTION_DEF(memory) UI_TagF("weak") zero_color = ui_color_from_name(str8_lit("text")); Vec4F32 changed_color = full_color; UI_TagF("neutral") changed_color = ui_color_from_name(str8_lit("text")); + { + DR_FStr fstr = {str8_lit("x"), {font, font_raster_flags, zero_color, cell_font_size, 0, 0}}; + dr_fstrs_push(scratch.arena, &unmapped_byte_fstrs, &fstr); + } for(U64 idx = 0; idx < ArrayCount(byte_fstrs); idx += 1) { U8 byte = (U8)idx; @@ -3606,6 +3611,27 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } + //- rjf: fill unmapped annotations + { + Annotation *bad_annotation = push_array(scratch.arena, Annotation, 1); + AnnotationNode *bad_annotation_node = push_array(scratch.arena, AnnotationNode, 1); + bad_annotation_node->v = bad_annotation; + UI_TagF("bad") + { + bad_annotation->name_string = s("(unmapped address)"); + bad_annotation->txt_color = ui_color_from_name(s("text")); + } + for(U64 vaddr = viz_range_bytes.min; vaddr < viz_range_bytes.max; vaddr += 1) + { + U64 visible_byte_idx = vaddr - viz_range_bytes.min; + B32 byte_is_bad = !!(visible_memory_bad_flags[visible_byte_idx/64] & (1ull<<(visible_byte_idx%64))); + if(byte_is_bad) + { + visible_memory_annotations[visible_byte_idx].first = visible_memory_annotations[visible_byte_idx].last = bad_annotation_node; + } + } + } + access_close(access); } @@ -4236,6 +4262,10 @@ RD_VIEW_UI_FUNCTION_DEF(memory) dr_fstrs_push(scratch.arena, &fstrs, &fstr); ui_box_equip_display_fstrs(cell_box, &fstrs); } + else if(byte_is_bad) + { + ui_box_equip_display_fstrs(cell_box, &unmapped_byte_fstrs); + } else if(byte_is_selected) { ui_box_equip_display_fstrs(cell_box, &byte_fstrs_selected[byte_value]); From 58caf0d3d56449a079f2a981e2cfa1c98e69a3d1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 14:48:00 -0700 Subject: [PATCH 535/850] upgrade eval space reads with staleness/bad/change info, to expand process memory cache reading abilities to all evaluation spaces; unmapped address visualization (both memory view & single line eval) --- src/dbg_engine/dbg_engine_ctrl.c | 2 +- src/dbg_engine/dbg_engine_ctrl.h | 2 +- src/eval/eval_core.c | 2 +- src/eval/eval_core.h | 23 +++++- src/eval/eval_interpret.c | 82 +++++++++++++++---- src/eval/eval_interpret.h | 2 +- src/eval/eval_ir.c | 2 +- src/eval/eval_types.c | 4 +- .../eval_visualization_core.c | 17 +++- src/raddbg/raddbg_core.c | 18 +++- src/raddbg/raddbg_core.h | 2 +- src/raddbg/raddbg_main.c | 5 +- src/raddbg/raddbg_views.c | 15 +--- 13 files changed, 130 insertions(+), 46 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index b69a33b4..d5b75eb2 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -4512,7 +4512,7 @@ d_ctrl_eval_space_gen(E_Space space) } internal B32 -d_ctrl_eval_space_read(E_Space space, void *out, Rng1U64 range) +d_ctrl_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 range) { B32 result = 0; switch(space.kind) diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 0db01810..02b83e8a 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -554,7 +554,7 @@ internal DMN_Event *d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctr //- rjf: eval helpers internal U64 d_ctrl_eval_space_gen(E_Space space); -internal B32 d_ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range); +internal B32 d_ctrl_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 vaddr_range); //- rjf: control thread eval scopes internal D_EvalScope *d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Entity *thread); diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 694ddb27..6adc6193 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -1164,7 +1164,7 @@ e_value_eval_from_eval(E_Eval eval) MemoryZeroStruct(&eval.value); if(!e_type_key_match(type_key, e_type_key_zero()) && type_byte_size <= sizeof(E_Value) && - e_space_read(eval.space, &eval.value, value_vaddr_range)) + e_space_read(eval.space, &eval.value, 0, value_vaddr_range)) { eval.irtree.mode = E_Mode_Value; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index a870fb59..82128bc2 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -757,8 +757,25 @@ struct E_AutoHookParams //////////////////////////////// //~ rjf: Evaluation Context +typedef U32 E_SpaceRangeFlags; +enum +{ + E_SpaceRangeFlag_AnyByteBad = (1<<0), + E_SpaceRangeFlag_AnyByteChanged = (1<<1), + E_SpaceRangeFlag_Stale = (1<<2), +}; + +typedef struct E_SpaceRangeInfo E_SpaceRangeInfo; +struct E_SpaceRangeInfo +{ + U64 *byte_bad_flags; + U64 *byte_changed_flags; + E_SpaceRangeFlags flags; +}; + typedef U64 E_SpaceGenFunction(E_Space space); -typedef B32 E_SpaceRWFunction(E_Space space, void *out, Rng1U64 offset_range); +typedef B32 E_SpaceReadFunction(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 offset_range); +typedef B32 E_SpaceWriteFunction(E_Space space, void *out, Rng1U64 offset_range); //- rjf: base context @@ -785,8 +802,8 @@ struct E_BaseCtx // rjf: space hooks E_SpaceGenFunction *space_gen; - E_SpaceRWFunction *space_read; - E_SpaceRWFunction *space_write; + E_SpaceReadFunction *space_read; + E_SpaceWriteFunction *space_write; }; //- rjf: ir generation context diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 4dd1362e..5e64b380 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -46,7 +46,7 @@ e_space_gen(E_Space space) } internal B32 -e_space_read(E_Space space, void *out, Rng1U64 range) +e_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 range) { ProfBeginFunction(); B32 result = 0; @@ -77,6 +77,8 @@ e_space_read(E_Space space, void *out, Rng1U64 range) //- rjf: file reads case E_SpaceKind_File: { + Access *access = access_open(); + // rjf: unpack space/path U64 file_path_string_id = space.u64_0; String8 file_path = e_string_from_id(file_path_string_id); @@ -88,22 +90,70 @@ e_space_read(E_Space space, void *out, Rng1U64 range) containing_range.max += chunk_size-1; containing_range.max -= containing_range.max%chunk_size; - // rjf: map to hash + // rjf: map to hashes C_Key key = fs_key_from_path_range(file_path, containing_range, 0); - U128 hash = c_hash_from_key(key, 0); - - // rjf: look up from hash store - Access *access = access_open(); + U128 hash = {0}; + U128 prev_hash = {0}; + U64 desired_hash_count = 1; + if(out_range_info != 0 && out_range_info->byte_changed_flags != 0) { - String8 data = c_data_from_hash(access, hash); - Rng1U64 legal_range = r1u64(containing_range.min, containing_range.min + data.size); - Rng1U64 read_range = intersect_1u64(range, legal_range); - if(read_range.min < read_range.max) + desired_hash_count = 2; + } + { + U64 hashes_count = 0; + U128 hashes[2] = {0}; + for(U64 rewind_idx = 0; rewind_idx < C_KEY_HASH_HISTORY_COUNT && hashes_count < ArrayCount(hashes) && hashes_count < desired_hash_count; rewind_idx += 1) { - result = 1; - MemoryCopy(out, data.str + read_range.min - containing_range.min, dim_1u64(read_range)); + U128 h = c_hash_from_key(key, rewind_idx); + if(!u128_match(u128_zero(), h)) + { + hashes[hashes_count] = h; + hashes_count += 1; + } + } + hash = hashes[0]; + prev_hash = hashes[1]; + } + + // rjf: unpack hashes + String8 data = c_data_from_hash(access, hash); + String8 prev_data = c_data_from_hash(access, prev_hash); + + // rjf: unpack read range + Rng1U64 legal_range = r1u64(containing_range.min, containing_range.min + data.size); + Rng1U64 read_range = intersect_1u64(range, legal_range); + + // rjf: fill out byte bad flags + if(out_range_info != 0 && out_range_info->byte_bad_flags != 0) + { + // TODO(rjf): need to know whole space range here + } + + // rjf: fill out byte changed flags + if(out_range_info != 0 && out_range_info->byte_changed_flags != 0) + { + U64 num_bytes_read = dim_1u64(read_range); + if(data.size >= num_bytes_read && data.size == prev_data.size) + { + U64 byte_base_idx = read_range.min - containing_range.min; + for(U64 byte_idx = 0; byte_idx < num_bytes_read; byte_idx += 1) + { + if(data.str[byte_base_idx + byte_idx] != prev_data.str[byte_base_idx + byte_idx]) + { + out_range_info->byte_changed_flags[byte_idx/64] |= (1ull<<(byte_idx%64)); + out_range_info->flags |= E_SpaceRangeFlag_AnyByteChanged; + } + } } } + + // rjf: fill output data from data + if(read_range.min < read_range.max) + { + result = 1; + MemoryCopy(out, data.str + read_range.min - containing_range.min, dim_1u64(read_range)); + } + access_close(access); }break; @@ -128,7 +178,7 @@ e_space_read(E_Space space, void *out, Rng1U64 range) default: if(e_base_ctx->space_read != 0) { - result = e_base_ctx->space_read(space, out, range); + result = e_base_ctx->space_read(space, out, out_range_info, range); }break; } } @@ -277,7 +327,7 @@ e_interpret(String8 bytecode) { U64 addr = svals[0].u64; U64 size = imm.u64; - B32 good_read = e_space_read(selected_space, &nval, r1u64(addr, addr+size)); + B32 good_read = e_space_read(selected_space, &nval, 0, r1u64(addr, addr+size)); if(!good_read) { result.code = E_InterpretationCode_BadMemRead; @@ -299,7 +349,7 @@ e_interpret(String8 bytecode) Rng1U16 rng = arch_info->reg_code_rng_table[base_reg_code]; U64 off = (U64)rng.min + byte_off; U64 size = (U64)byte_size; - good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size)); + good_read = e_space_read(e_interpret_ctx->reg_space, &nval, 0, r1u64(off, off+size)); } if(!good_read) { @@ -312,7 +362,7 @@ e_interpret(String8 bytecode) { U64 off = svals[0].u64; U64 size = bit_size_from_arch(e_interpret_ctx->reg_arch)/8; - B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size)); + B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, 0, r1u64(off, off+size)); if(!good_read) { result.code = E_InterpretationCode_BadRegRead; diff --git a/src/eval/eval_interpret.h b/src/eval/eval_interpret.h index 83a82c59..92fb5a6c 100644 --- a/src/eval/eval_interpret.h +++ b/src/eval/eval_interpret.h @@ -34,7 +34,7 @@ internal void e_select_interpret_ctx(E_InterpretCtx *ctx, RDI_Parsed *primary_rd //~ rjf: Space Reading Helpers internal U64 e_space_gen(E_Space space); -internal B32 e_space_read(E_Space space, void *out, Rng1U64 range); +internal B32 e_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 range); internal B32 e_space_write(E_Space space, void *in, Rng1U64 range); //////////////////////////////// diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 919905ba..33f26ec6 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -2386,7 +2386,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I U64 class_base_vaddr = interpret.value.u64; U64 vtable_vaddr = 0; U64 addr_size = e_type_byte_size_from_key(type_key); - if(e_space_read(interpret.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) + if(e_space_read(interpret.space, &vtable_vaddr, 0, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) { Arch arch = e_base_ctx->primary_module->arch; U32 dbg_info_num = 0; diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 451ed179..682bef82 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2587,7 +2587,7 @@ e_list_gather_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U U64 base_off = 0; U64 member_element_off = 0; U64 member_size = 0; - E_SpaceRWFunction *space_read = 0; + E_SpaceReadFunction *space_read = 0; { U64 key_read_off = 0; key_read_off += str8_deserial_read_struct(key, key_read_off, &process); @@ -2812,7 +2812,7 @@ E_TYPE_IREXT_FUNCTION_DEF(list) U64 base_off; U64 member_element_off; U64 member_size; - E_SpaceRWFunction *space_read; + E_SpaceReadFunction *space_read; } key_data = { diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index f41df3a5..93125efd 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1880,7 +1880,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) U64 string_memory_addr = ptr_data->value_eval.value.u64; for(U64 try_size = string_buffer_size; try_size >= 16; try_size /= 2) { - B32 read_good = e_space_read(eval.space, string_buffer, r1u64(string_memory_addr, string_memory_addr+try_size)); + B32 read_good = e_space_read(eval.space, string_buffer, 0, r1u64(string_memory_addr, string_memory_addr+try_size)); if(read_good) { break; @@ -2107,6 +2107,21 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) { Temp scratch = scratch_begin(&arena, 1); String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, 16, 0, 0); + if(params->flags & EV_StringFlag_ReadOnlyDisplayRules) + { + U8 byte = 0; + B32 addr_is_good = 0; + U64 byte_bad_flags = 0; + E_SpaceRangeInfo range_info = {.byte_bad_flags = &byte_bad_flags}; + if(e_space_read(ptr_data->value_eval.space, &byte, &range_info, r1u64(ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64+1))) + { + addr_is_good = !(byte_bad_flags & 1); + } + if(!addr_is_good) + { + ptr_value_string = str8f(scratch.arena, "%S (unmapped)", ptr_value_string); + } + } // // NOTE(rjf): currently, we are not using the string-generation radix parameter when // generating a pointer value - it is weird to want to change pointer value visualization diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 1a62a527..7b86947a 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -736,7 +736,7 @@ rd_eval_space_gen(E_Space space) } internal B32 -rd_eval_space_read(E_Space space, void *out, Rng1U64 range) +rd_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 range) { Temp scratch = scratch_begin(0, 0); B32 result = 0; @@ -744,7 +744,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) { default: { - result = d_ctrl_eval_space_read(space, out, range); + result = d_ctrl_eval_space_read(space, out, out_range_info, range); }break; //- rjf: interior control entity reads (inside process address space or thread register block) @@ -762,6 +762,20 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range) { result = 1; MemoryCopy(out, data.str, data.size); + if(out_range_info != 0 && out_range_info->byte_bad_flags) + { + MemoryCopy(out_range_info->byte_bad_flags, slice.byte_bad_flags, sizeof(U64) * (dim_1u64(range)+63)/64); + } + if(out_range_info != 0 && out_range_info->byte_changed_flags) + { + MemoryCopy(out_range_info->byte_changed_flags, slice.byte_changed_flags, sizeof(U64) * ((dim_1u64(range)+63)/64)); + } + if(out_range_info != 0) + { + out_range_info->flags |= E_SpaceRangeFlag_Stale*!!slice.stale; + out_range_info->flags |= E_SpaceRangeFlag_AnyByteChanged*!!slice.any_byte_changed; + out_range_info->flags |= E_SpaceRangeFlag_AnyByteBad*!!slice.any_byte_bad; + } } }break; case D_EntityKind_Thread: diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index f554f260..498300dc 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -658,7 +658,7 @@ internal String8 rd_cmd_name_from_eval(E_Eval eval); //- rjf: eval space reads/writes internal U64 rd_eval_space_gen(E_Space space); -internal B32 rd_eval_space_read(E_Space space, void *out, Rng1U64 range); +internal B32 rd_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 range); internal B32 rd_eval_space_write(E_Space space, void *in, Rng1U64 range); //- rjf: asynchronous streamed reads -> hashes from spaces diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 5ccb838f..35d1afc4 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,9 +4,6 @@ //////////////////////////////// //~ rjf: post-0.9.26 TODO notes // -// [ ] single-line bad address visualization -// [ ] memory view show unmapped memory as non-zeros -// // [ ] "autos" collection, which can be evaluated // [ ] show "autos" inline in source code near thread? // [ ] memory_size(...) view for quickly evaluating memory sizes @@ -28,7 +25,6 @@ // [ ] no selected thread -> causing evaluation failures, e.g. with go-to-definition // //- evaluation space coverage pass -// [ ] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces // [ ] need concrete ways of referring into a space at any offset - e.g. `process.memory + 0x1234`, `file:"foo".data + 0x1234`, `thread.regs + 0x80`, etc. // [ ] memory view needs to take advantage of above when peeking; ensure peeking works on files etc. // [ ] need to eliminate accelerators from evaluation context, and build them on the fly instead - @@ -273,6 +269,7 @@ // by default go to "untitled" in default user path // [x] memory view mutation controls // [x] step-over/step-into doesn't step successfully in many cases, just causes a continue +// [x] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces //////////////////////////////// //~ rjf: Build Options diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 42c4137d..417f5c98 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2869,7 +2869,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) String8 data = {0}; data.size = dim_1u64(range); data.str = push_array(scratch.arena, U8, data.size); - if(!e_space_read(eval.space, data.str, range)) + if(!e_space_read(eval.space, data.str, 0, range)) { log_user_errorf("Could not successfully read memory."); } @@ -3224,17 +3224,8 @@ RD_VIEW_UI_FUNCTION_DEF(memory) U64 *visible_memory_change_flags = push_array(scratch.arena, U64, (visible_memory_size+63)/64); U64 *visible_memory_bad_flags = push_array(scratch.arena, U64, (visible_memory_size+63)/64); { - e_space_read(eval.space, visible_memory, viz_range_bytes); - } - if(eval.space.kind == D_EvalSpaceKind_Entity) - { - D_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); - if(entity->kind == D_EntityKind_Process) - { - D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, viz_range_bytes, 0, 0); - visible_memory_change_flags = slice.byte_changed_flags; - visible_memory_bad_flags = slice.byte_bad_flags; - } + E_SpaceRangeInfo range_info = {visible_memory_bad_flags, visible_memory_change_flags}; + e_space_read(eval.space, visible_memory, &range_info, viz_range_bytes); } ////////////////////////////// From fbe7b20aee9cc83ec3945df8e17c1989a61b4cf8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 15:22:56 -0700 Subject: [PATCH 536/850] finish addresses-before-content single-line eval visualization path --- .../eval_visualization_core.c | 51 +++++++++++-------- src/raddbg/raddbg_main.c | 5 +- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 93125efd..cb6a9217 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1813,6 +1813,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) B32 did_prefix_string; B32 did_redirect; B32 did_pre_prefix_ptr; + B32 addr_is_good; }; EV_StringPtrData *ptr_data = it->top_task->user_data; if(ptr_data == 0) @@ -1825,6 +1826,13 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) ptr_data->ptee_has_string = ((E_TypeKind_Char8 <= ptr_data->direct_type->kind && ptr_data->direct_type->kind <= E_TypeKind_UChar32) || ptr_data->direct_type->kind == E_TypeKind_S8 || ptr_data->direct_type->kind == E_TypeKind_U8); + U8 byte = 0; + U64 byte_bad_flags = 0; + E_SpaceRangeInfo range_info = {.byte_bad_flags = &byte_bad_flags}; + if(e_space_read(ptr_data->value_eval.space, &byte, &range_info, r1u64(ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64+1))) + { + ptr_data->addr_is_good = !(byte_bad_flags & 1); + } } if(ptr_data->did_redirect) { @@ -1837,13 +1845,22 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) //- rjf: step 0: do pre-prefix pointer value if requested case 0: { - if(!(params->flags & EV_StringFlag_DisableAddresses) && - params->flags & EV_StringFlag_AddressesBeforeContent) + if(!ptr_data->addr_is_good || + (!(params->flags & EV_StringFlag_DisableAddresses) && + params->flags & EV_StringFlag_AddressesBeforeContent)) { - *out_string = str8_from_u64(arena, ptr_data->value_eval.value.u64, 16, 0, 0); + Temp scratch = scratch_begin(&arena, 1); + String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, + ptr_data->value_eval.value.u64 != 0 ? 16 : 10, 0, 0); + if(ptr_data->value_eval.value.u64 != 0 && !ptr_data->addr_is_good && params->flags & EV_StringFlag_ReadOnlyDisplayRules) + { + ptr_value_string = str8f(scratch.arena, "%S (unmapped)", ptr_value_string); + } + *out_string = str8_copy(arena, ptr_value_string); ptr_data->did_pre_prefix_ptr = 1; + scratch_end(scratch); } - need_pop = 0; + need_pop = !ptr_data->addr_is_good; }break; //- rjf: step 1 -> try "prefix content", which we want to print before the pointer value, @@ -2005,6 +2022,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) { Temp scratch = scratch_begin(&arena, 1); String8List list = {0}; + str8_list_push(scratch.arena, &list, pre_prefix); str8_list_pushf(scratch.arena, &list, "[inlined] "); e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0); str8_list_push(scratch.arena, &list, name); @@ -2040,7 +2058,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) String8 joined = str8_list_join(scratch.arena, &list, 0); *out_string = str8f(arena, "%S%S", pre_prefix, joined); } - else + else if(name.size != 0) { *out_string = str8f(arena, "%S%S", pre_prefix, name); } @@ -2068,8 +2086,10 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) RDI_Symbol *procedure = rdi_procedure_from_scope(rdi, scope); String8 procedure_name = {0}; procedure_name.str = rdi_name_from_procedure(rdi, procedure, &procedure_name.size); - - *out_string = str8f(arena, "%S%S", pre_prefix, procedure_name); + if(procedure_name.size != 0) + { + *out_string = str8f(arena, "%S%S", pre_prefix, procedure_name); + } good_symbol_match = (procedure_name.size != 0); } @@ -2106,21 +2126,10 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) case 2: { Temp scratch = scratch_begin(&arena, 1); - String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, 16, 0, 0); - if(params->flags & EV_StringFlag_ReadOnlyDisplayRules) + String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64 != 0 ? 16 : 10, 0, 0); + if(params->flags & EV_StringFlag_ReadOnlyDisplayRules && ptr_data->value_eval.value.u64 != 0 && !ptr_data->addr_is_good) { - U8 byte = 0; - B32 addr_is_good = 0; - U64 byte_bad_flags = 0; - E_SpaceRangeInfo range_info = {.byte_bad_flags = &byte_bad_flags}; - if(e_space_read(ptr_data->value_eval.space, &byte, &range_info, r1u64(ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64+1))) - { - addr_is_good = !(byte_bad_flags & 1); - } - if(!addr_is_good) - { - ptr_value_string = str8f(scratch.arena, "%S (unmapped)", ptr_value_string); - } + ptr_value_string = str8f(scratch.arena, "%S (unmapped)", ptr_value_string); } // // NOTE(rjf): currently, we are not using the string-generation radix parameter when diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 35d1afc4..29eb65ad 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -12,7 +12,6 @@ // [ ] external window focusing bugs // // [ ] PDB -> RDI conversion memory usage -// // [ ] more things should move to user data, but project-tagged - like // recent files, watches?, etc. // @@ -22,7 +21,6 @@ // // [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! // [ ] string conditional breakpoints -> size != 0 check seems to fail, can test w/ "rd_init" subprogram type gen in d2r2 -// [ ] no selected thread -> causing evaluation failures, e.g. with go-to-definition // //- evaluation space coverage pass // [ ] need concrete ways of referring into a space at any offset - e.g. `process.memory + 0x1234`, `file:"foo".data + 0x1234`, `thread.regs + 0x80`, etc. @@ -46,7 +44,6 @@ // //- jeff notes // [ ] focus changing on f10/f11? may be related to auto_run/auto_step - look at a bin/jeffr -// [ ] single-line viz for pointers w/ bad (unmapped) addresses // [ ] option to prefer addresses first with string ptrs // //- urgent fixes @@ -270,6 +267,8 @@ // [x] memory view mutation controls // [x] step-over/step-into doesn't step successfully in many cases, just causes a continue // [x] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces +// [x] no selected thread -> causing evaluation failures, e.g. with go-to-definition +// [x] single-line viz for pointers w/ bad (unmapped) addresses //////////////////////////////// //~ rjf: Build Options From d20739893439104aa6a4e479b4128f68a78f06d4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 15:50:59 -0700 Subject: [PATCH 537/850] display project names in recent project list; fix 0s for address-disabled string viz --- .../eval_visualization_core.c | 11 +++++--- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 +- src/raddbg/raddbg_core.c | 25 +++++++++++++++++++ src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_main.c | 7 +++--- src/raddbg/raddbg_widgets.c | 7 +++--- 7 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index cb6a9217..d1109ace 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1845,9 +1845,8 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) //- rjf: step 0: do pre-prefix pointer value if requested case 0: { - if(!ptr_data->addr_is_good || - (!(params->flags & EV_StringFlag_DisableAddresses) && - params->flags & EV_StringFlag_AddressesBeforeContent)) + if(!(params->flags & EV_StringFlag_DisableAddresses) && + (!ptr_data->addr_is_good || params->flags & EV_StringFlag_AddressesBeforeContent)) { Temp scratch = scratch_begin(&arena, 1); String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, @@ -1858,9 +1857,13 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) } *out_string = str8_copy(arena, ptr_value_string); ptr_data->did_pre_prefix_ptr = 1; + need_pop = !ptr_data->addr_is_good; scratch_end(scratch); } - need_pop = !ptr_data->addr_is_good; + else + { + need_pop = 0; + } }break; //- rjf: step 1 -> try "prefix content", which we want to print before the pointer value, diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index ca2440a2..b96d8a43 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -460,7 +460,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[39] = {str8_lit_comp("debug_info"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @query 'guid': string,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, {str8_lit_comp("file_path_map"), 0, str8_lit_comp("@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}")}, {str8_lit_comp("type_view"), 0, str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, -{str8_lit_comp("recent_project"), 0, str8_lit_comp("x:{'path':path}")}, +{str8_lit_comp("recent_project"), 0, str8_lit_comp("x:{'path':path, 'name':string}")}, {str8_lit_comp("machine"), 0, str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}")}, {str8_lit_comp("process"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}")}, {str8_lit_comp("module"), 0, str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 57ef3e0e..f3cd2a42 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -779,7 +779,7 @@ RD_VocabTable: //- rjf: @schema recent_project { recent_project, 0, - ```x:{'path':path}```, + ```x:{'path':path, 'name':string}```, } //- rjf: @schema machine diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 7b86947a..a107a3a9 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -227,6 +227,14 @@ rd_location_from_cfg(CFG_Node *cfg) return dst_loc; } +internal String8 +rd_name_from_cfg(CFG_Node *cfg) +{ + CFG_Node *name_root = cfg_node_child_from_string(cfg, str8_lit("name")); + String8 result = name_root->first->string; + return result; +} + internal String8 rd_label_from_cfg(CFG_Node *cfg) { @@ -12688,6 +12696,16 @@ rd_frame(void) } } } + + //- rjf: if just opened project -> set new current path + if(kind == RD_CmdKind_OpenProject) + { + String8 new_current_dir = str8_chop_last_slash(rd_regs()->file_path); + if(new_current_dir.size != 0) + { + rd_cmd(RD_CmdKind_SetCurrentPath, .file_path = new_current_dir); + } + } }break; case RD_CmdKind_NewUser: { @@ -12755,6 +12773,13 @@ rd_frame(void) CFG_Node *path_root = cfg_node_new(rd_state->cfg, recent_project, str8_lit("path")); cfg_node_new(rd_state->cfg, path_root, file_path); } + { + CFG_Node *root = cfg_node_root(); + CFG_Node *project = cfg_node_child_from_string(root, s("project")); + CFG_Node *name = cfg_node_child_from_string(project, s("name")); + CFG_Node *recent_project_name_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, recent_project, s("name")); + cfg_node_new_replace(rd_state->cfg, recent_project_name_root, name->first->string); + } cfg_node_unhook(rd_state->cfg, user, recent_project); cfg_node_insert_child(rd_state->cfg, user, &cfg_nil_node, recent_project); recent_projects = cfg_node_child_list_from_string(scratch.arena, user, str8_lit("recent_project")); diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 498300dc..f5e777d3 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -618,6 +618,7 @@ internal Vec4F32 rd_color_from_cfg(CFG_Node *cfg); internal B32 rd_disabled_from_cfg(CFG_Node *cfg); internal RD_Location rd_location_from_cfg(CFG_Node *cfg); +internal String8 rd_name_from_cfg(CFG_Node *cfg); internal String8 rd_label_from_cfg(CFG_Node *cfg); internal String8 rd_expr_from_cfg(CFG_Node *cfg); internal String8 rd_path_from_cfg(CFG_Node *cfg); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 29eb65ad..33973c56 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -9,8 +9,6 @@ // [ ] memory_size(...) view for quickly evaluating memory sizes // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold // -// [ ] external window focusing bugs -// // [ ] PDB -> RDI conversion memory usage // [ ] more things should move to user data, but project-tagged - like // recent files, watches?, etc. @@ -44,7 +42,7 @@ // //- jeff notes // [ ] focus changing on f10/f11? may be related to auto_run/auto_step - look at a bin/jeffr -// [ ] option to prefer addresses first with string ptrs +// auto_step, launching terminal, terminal steals focus from debugger... // //- urgent fixes // [ ] (use msvc assert as an example) show fastfail exception info (code, name, etc.) - comes from ExceptionInformation @fastfail @@ -59,7 +57,6 @@ // [ ] "skip breakpoint, run to source", when stopped at a non-source location // [ ] adjust menu bar rendering when not focused // [ ] treat int 0x29 similarly to int3 -// [ ] auto_step, launching terminal, terminal steals focus from debugger... // //- memory view // [ ] have smaller visible range than entire memory space, within some bounds (e.g. 64KB) @@ -269,6 +266,8 @@ // [x] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces // [x] no selected thread -> causing evaluation failures, e.g. with go-to-definition // [x] single-line viz for pointers w/ bad (unmapped) addresses +// [x] option to prefer addresses first with string ptrs +// [x] external window focusing bugs //////////////////////////////// //~ rjf: Build Options diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 54bee4a7..da8f2c83 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -15,6 +15,7 @@ rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras) B32 is_disabled = rd_disabled_from_cfg(cfg); RD_Location loc = rd_location_from_cfg(cfg); D_Target target = rd_target_from_cfg(scratch.arena, cfg); + String8 name_string = rd_name_from_cfg(cfg); String8 label_string = rd_label_from_cfg(cfg); String8 expr_string = rd_expr_from_cfg(cfg); String8 collection_name = {0}; @@ -163,10 +164,10 @@ rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras) } } - //- rjf: push label - if(label_string.size != 0) + //- rjf: push name + if(name_string.size != 0) { - dr_fstrs_push_new(arena, &result, ¶ms, label_string, .font = rd_font_from_slot(RD_FontSlot_Code), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code)); + dr_fstrs_push_new(arena, &result, ¶ms, name_string); dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); start_secondary(); } From ab4a084c9c0d7437c858740c40f16189def7463e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 16:01:00 -0700 Subject: [PATCH 538/850] fix filtered-tab selection adjustments on project load --- src/raddbg/generated/raddbg.meta.c | 3 ++- src/raddbg/generated/raddbg.meta.h | 2 +- src/raddbg/raddbg.mdesk | 1 + src/raddbg/raddbg_core.c | 25 +++++++++++++++++++++++-- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index b96d8a43..32111c53 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[358] = +RD_VocabInfo rd_vocab_info_table[359] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -115,6 +115,7 @@ RD_VocabInfo rd_vocab_info_table[358] = {str8_lit_comp("vtx"), str8_lit_comp("vtxs"), str8_lit_comp("Vertex Buffer"), str8_lit_comp("Vertex Buffers"), RD_IconKind_Null}, {str8_lit_comp("vtx_size"), str8_lit_comp("vtx_sizes"), str8_lit_comp("Vertex Buffer Size"), str8_lit_comp("Vertex Buffer Sizes"), RD_IconKind_Null}, {str8_lit_comp("label"), str8_lit_comp("labels"), str8_lit_comp("Label"), str8_lit_comp("Labels"), RD_IconKind_Null}, +{str8_lit_comp("name"), str8_lit_comp("names"), str8_lit_comp("Name"), str8_lit_comp("Names"), RD_IconKind_Null}, {str8_lit_comp("thread"), str8_lit_comp("threads"), str8_lit_comp("Thread"), str8_lit_comp("Threads"), RD_IconKind_Thread}, {str8_lit_comp("threads"), str8_lit_comp(""), str8_lit_comp("Threads"), str8_lit_comp(""), RD_IconKind_Threads}, {str8_lit_comp("process"), str8_lit_comp("processes"), str8_lit_comp("Process"), str8_lit_comp("Processes"), RD_IconKind_Scheduler}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 2bf5fb03..6cff775b 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -602,7 +602,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[358]; +extern RD_VocabInfo rd_vocab_info_table[359]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index f3cd2a42..233870b5 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -140,6 +140,7 @@ RD_VocabTable: {vtx _ "Vertex Buffer" _ Null } {vtx_size _ "Vertex Buffer Size" _ Null } {label _ "Label" _ Null } + {name _ "Name" _ Null } {thread _ "Thread" _ Thread } {threads "" "Threads" "" Threads } {process processes "Process" "Processes" Scheduler } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index a107a3a9..79373125 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10553,6 +10553,7 @@ rd_frame(void) CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window); for(CFG_PanelNode *p = panel_tree.root; p != &cfg_nil_panel_node; p = cfg_panel_node_rec__depth_first_pre(panel_tree.root, p).next) { + CFG_Node *first_unfiltered_tab = &cfg_nil_node; for(CFG_NodePtrNode *n = p->tabs.first; n != 0; n = n->next) { CFG_Node *tab = n->v; @@ -10560,8 +10561,16 @@ rd_frame(void) { continue; } + if(first_unfiltered_tab == &cfg_nil_node) + { + first_unfiltered_tab = tab; + } rd_view_state_from_cfg(tab); } + if(p->selected_tab == &cfg_nil_node) + { + rd_cmd(RD_CmdKind_FocusTab, .panel = p->cfg->id, .tab = first_unfiltered_tab->id); + } } } scratch_end(scratch); @@ -12691,7 +12700,7 @@ rd_frame(void) break; } } - rd_cmd(RD_CmdKind_FocusTab, .tab = fallback_tab->id); + rd_cmd(RD_CmdKind_FocusTab, .panel = panel->cfg->id, .tab = fallback_tab->id); } } } @@ -13408,6 +13417,10 @@ rd_frame(void) { CFG_Node *tab = cfg_node_from_id(rd_regs()->tab); CFG_Node *panel = tab->parent; + if(panel == &cfg_nil_node) + { + panel = cfg_node_from_id(rd_regs()->panel); + } CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, panel); CFG_PanelNode *panel_node = cfg_panel_node_from_tree_cfg(panel_tree.root, panel); CFG_Node *selection_cfg = &cfg_nil_node; @@ -13417,6 +13430,7 @@ rd_frame(void) if(selection_cfg == &cfg_nil_node) { selection_cfg = tab_selection_cfg; + cfg_node_unhook(rd_state->cfg, n->v, selection_cfg); } else for(CFG_Node *s = tab_selection_cfg; s != &cfg_nil_node; s = cfg_node_child_from_string(n->v, str8_lit("selected"))) { @@ -13428,7 +13442,14 @@ rd_frame(void) selection_cfg = cfg_node_alloc(rd_state->cfg); cfg_node_equip_string(rd_state->cfg, selection_cfg, str8_lit("selected")); } - cfg_node_insert_child(rd_state->cfg, tab, &cfg_nil_node, selection_cfg); + if(tab != &cfg_nil_node) + { + cfg_node_insert_child(rd_state->cfg, tab, &cfg_nil_node, selection_cfg); + } + else + { + cfg_node_release(rd_state->cfg, selection_cfg); + } }break; case RD_CmdKind_NextTab: { From 5977cb400dcfd2044fbd6b32a12eed28e1b2df89 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 18:41:43 -0700 Subject: [PATCH 539/850] only do pointer value visualization with valid pointer spaces; otherwise it is just a value --- src/eval_visualization/eval_visualization_core.c | 6 +++++- src/render/opengl/generated/render_opengl.meta.h | 1 - src/render/opengl/render_opengl.mdesk | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index d1109ace..66e9273d 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1829,7 +1829,11 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) U8 byte = 0; U64 byte_bad_flags = 0; E_SpaceRangeInfo range_info = {.byte_bad_flags = &byte_bad_flags}; - if(e_space_read(ptr_data->value_eval.space, &byte, &range_info, r1u64(ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64+1))) + if(ptr_data->value_eval.space.kind == E_SpaceKind_Null) + { + ptr_data->addr_is_good = 1; + } + else if(e_space_read(ptr_data->value_eval.space, &byte, &range_info, r1u64(ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64+1))) { ptr_data->addr_is_good = !(byte_bad_flags & 1); } diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index 0e94599d..7ae7980b 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -190,7 +190,6 @@ str8_lit_comp( "uniform vec4 rect;\n" "uniform vec4 corner_radii_px;\n" "uniform vec2 viewport_size;\n" -"uniform uint blur_count;\n" "\n" "out vec2 texcoord;\n" "out vec2 sdf_sample_pos;\n" diff --git a/src/render/opengl/render_opengl.mdesk b/src/render/opengl/render_opengl.mdesk index d6d31a7a..a99e2c33 100644 --- a/src/render/opengl/render_opengl.mdesk +++ b/src/render/opengl/render_opengl.mdesk @@ -214,7 +214,6 @@ void main(void) uniform vec4 rect; uniform vec4 corner_radii_px; uniform vec2 viewport_size; -uniform uint blur_count; out vec2 texcoord; out vec2 sdf_sample_pos; From 14390c01f719cde01288eadd47de9908323f7c06 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 13 May 2026 18:54:23 -0700 Subject: [PATCH 540/850] respect path style in picking file replacements --- src/raddbg/raddbg_core.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 79373125..9ab6ba30 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -13217,6 +13217,8 @@ rd_frame(void) //- rjf: unpack String8 src_path = rd_regs()->string; String8 dst_path = rd_regs()->file_path; + PathStyle src_style = path_style_from_str8(src_path); + PathStyle dst_style = path_style_from_str8(dst_path); String8List src_path_parts = str8_split_path(scratch.arena, src_path); String8List dst_path_parts = str8_split_path(scratch.arena, dst_path); @@ -13259,9 +13261,8 @@ rd_frame(void) { str8_list_push_front(scratch.arena, &map_dst_parts, n->string); } - StringJoin map_join = {.sep = str8_lit("/")}; - String8 map_src = str8_list_join(scratch.arena, &map_src_parts, &map_join); - String8 map_dst = str8_list_join(scratch.arena, &map_dst_parts, &map_join); + String8 map_src = str8_path_list_join_by_style(scratch.arena, &map_src_parts, src_style); + String8 map_dst = str8_path_list_join_by_style(scratch.arena, &map_dst_parts, dst_style); //- rjf: store as file path map cfg CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit("user")); From 54fc7deafa00c1329d427c4478a905ddf208ff23 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 14 May 2026 08:54:38 -0700 Subject: [PATCH 541/850] fix incorrect per-unit line table data offset doubly adding base offset of unit - was breaking non-zero-offset line tables --- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index baad683a..b2fa3672 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -826,7 +826,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); U64 line_info_off = stmt_list->val.u128.u64[0]; String8 all_line_info_data = raw->sec[DW_Section_Line].data; - String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_info_off + line_table_header->line_program_off, line_info_off + line_table_header->total_unit_data_size)); + String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_table_header->line_program_off, line_info_off + line_table_header->total_unit_data_size)); //- rjf: build unit's line table RDIM_LineTable *dst_line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 1); From a60502d7659a99eff6a01c764f19d16aed3f2335 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 14 May 2026 13:50:34 -0700 Subject: [PATCH 542/850] sketch out first pass of autos evaluation --- src/disasm/disasm.c | 138 +---------- src/disasm/disasm.h | 8 +- src/disasm/disasm_inc.c | 7 + src/disasm/disasm_inc.h | 12 + src/raddbg/raddbg_core.c | 35 ++- src/raddbg/raddbg_core.h | 13 + src/raddbg/raddbg_eval.c | 216 +++++++++++++++++ src/raddbg/raddbg_eval.h | 7 + src/raddbg/raddbg_main.c | 9 +- src/torture/torture_main.c | 4 +- src/x64/disasm/x64_disasm.c | 469 ++++++++++++++++++++++++++++++++++++ src/x64/disasm/x64_disasm.h | 9 + 12 files changed, 778 insertions(+), 149 deletions(-) create mode 100644 src/disasm/disasm_inc.c create mode 100644 src/disasm/disasm_inc.h create mode 100644 src/x64/disasm/x64_disasm.c create mode 100644 src/x64/disasm/x64_disasm.h diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index 1186ba2e..dbac0a96 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -7,11 +7,6 @@ //////////////////////////////// //~ rjf: Instruction Decoding/Disassembling Type Functions -#if !defined(ZYDIS_H) -#include "third_party/zydis/zydis.h" -#include "third_party/zydis/zydis.c" -#endif - internal DASM_Inst dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Syntax syntax) { @@ -19,139 +14,12 @@ dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Synta switch(arch) { default:{}break; - - //- rjf: x86/x64 disassembly - case Arch_x86: +#if defined(X64_H) case Arch_x64: { - // rjf: determine zydis formatter style - ZydisFormatterStyle style = ZYDIS_FORMATTER_STYLE_INTEL; - switch(syntax) - { - default:{}break; - case DASM_Syntax_Intel:{style = ZYDIS_FORMATTER_STYLE_INTEL;}break; - case DASM_Syntax_ATT: {style = ZYDIS_FORMATTER_STYLE_ATT;}break; - } - - // rjf: disassemble one instruction - ZydisDisassembledInstruction zinst = {0}; - ZyanStatus status = ZydisDisassemble(ZYDIS_MACHINE_MODE_LONG_64, vaddr, code.str, code.size, &zinst, style); - - // rjf: analyze - DASM_InstFlags flags = 0; - U64 dst_vaddr = 0; - { - ZydisDecodedOperand *first_visible_op = (zinst.info.operand_count_visible > 0 ? &zinst.operands[0] : 0); - ZydisDecodedOperand *first_op = (zinst.info.operand_count > 0 ? &zinst.operands[0] : 0); - ZydisDecodedOperand *second_op = (zinst.info.operand_count > 1 ? &zinst.operands[1] : 0); - - if(first_op != 0 && - first_op->actions & ZYDIS_OPERAND_ACTION_WRITE) - { - // TODO(rjf): need to pass back register + offset - } - if(second_op != 0 && - second_op->actions & ZYDIS_OPERAND_ACTION_READ) - { - // TODO(rjf): need to pass back register + offset - } - if(first_visible_op != 0 && - (first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM8 || - first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16 || - first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32 || - first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM64 || - first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_64 || - first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32_32_64 || - first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_32)) - { - ZydisCalcAbsoluteAddress(&zinst.info, first_visible_op, vaddr, &dst_vaddr); - } - if(first_op != 0 && second_op != 0 && first_op->type == ZYDIS_OPERAND_TYPE_REGISTER && - (first_op->reg.value == ZYDIS_REGISTER_RSP || - first_op->reg.value == ZYDIS_REGISTER_ESP || - first_op->reg.value == ZYDIS_REGISTER_SP)) - { - flags |= DASM_InstFlag_ChangesStackPointer; - if(second_op->type != ZYDIS_OPERAND_TYPE_IMMEDIATE) - { - flags |= DASM_InstFlag_ChangesStackPointerVariably; - } - } - if(zinst.info.attributes & (ZYDIS_ATTRIB_HAS_REP| - ZYDIS_ATTRIB_HAS_REPE| - ZYDIS_ATTRIB_HAS_REPZ| - ZYDIS_ATTRIB_HAS_REPNZ| - ZYDIS_ATTRIB_HAS_REPNE)) - { - flags |= DASM_InstFlag_Repeats; - } - switch(zinst.info.mnemonic) - { - case ZYDIS_MNEMONIC_CALL: - { - flags |= DASM_InstFlag_Call; - }break; - - case ZYDIS_MNEMONIC_JB: - case ZYDIS_MNEMONIC_JBE: - case ZYDIS_MNEMONIC_JCXZ: - case ZYDIS_MNEMONIC_JECXZ: - case ZYDIS_MNEMONIC_JKNZD: - case ZYDIS_MNEMONIC_JKZD: - case ZYDIS_MNEMONIC_JL: - case ZYDIS_MNEMONIC_JLE: - case ZYDIS_MNEMONIC_JNB: - case ZYDIS_MNEMONIC_JNBE: - case ZYDIS_MNEMONIC_JNL: - case ZYDIS_MNEMONIC_JNLE: - case ZYDIS_MNEMONIC_JNO: - case ZYDIS_MNEMONIC_JNP: - case ZYDIS_MNEMONIC_JNS: - case ZYDIS_MNEMONIC_JNZ: - case ZYDIS_MNEMONIC_JO: - case ZYDIS_MNEMONIC_JP: - case ZYDIS_MNEMONIC_JRCXZ: - case ZYDIS_MNEMONIC_JS: - case ZYDIS_MNEMONIC_JZ: - case ZYDIS_MNEMONIC_LOOP: - case ZYDIS_MNEMONIC_LOOPE: - case ZYDIS_MNEMONIC_LOOPNE: - { - flags |= DASM_InstFlag_Branch; - }break; - - case ZYDIS_MNEMONIC_JMP: - { - flags |= DASM_InstFlag_UnconditionalJump; - }break; - - case ZYDIS_MNEMONIC_RET: - { - flags |= DASM_InstFlag_Return; - }break; - - case ZYDIS_MNEMONIC_PUSH: - case ZYDIS_MNEMONIC_POP: - { - flags |= DASM_InstFlag_ChangesStackPointer; - }break; - - default: - { - flags |= DASM_InstFlag_NonFlow; - }break; - } - } - - // rjf: convert - { - inst.flags = flags; - inst.size = zinst.info.length; - inst.string = str8_copy(arena, str8_cstring(zinst.text)); - inst.dst_vaddr = dst_vaddr; - // inst.src_vaddr = src_vaddr; - } + inst = x64_dasm_inst_from_code(arena, vaddr, code, syntax); }break; +#endif } return inst; } diff --git a/src/disasm/disasm.h b/src/disasm/disasm.h index ebc8180e..dbdef297 100644 --- a/src/disasm/disasm.h +++ b/src/disasm/disasm.h @@ -38,10 +38,10 @@ struct DASM_Inst U32 size; String8 string; U64 dst_vaddr; - ARCH_RegCode dst_base_reg; - U64 dst_off; - ARCH_RegCode src_base_reg; - U64 src_off; + ARCH_RegCode dst_reg_code; + S64 dst_reg_off; + ARCH_RegCode src_reg_code; + S64 src_reg_off; }; //////////////////////////////// diff --git a/src/disasm/disasm_inc.c b/src/disasm/disasm_inc.c new file mode 100644 index 00000000..84d70068 --- /dev/null +++ b/src/disasm/disasm_inc.c @@ -0,0 +1,7 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "disasm/disasm.c" +#if defined(X64_H) +# include "x64/disasm/x64_disasm.c" +#endif diff --git a/src/disasm/disasm_inc.h b/src/disasm/disasm_inc.h new file mode 100644 index 00000000..fa7d170a --- /dev/null +++ b/src/disasm/disasm_inc.h @@ -0,0 +1,12 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DISASM_INC_H +#define DISASM_INC_H + +#include "disasm/disasm.h" +#if defined(X64_H) +# include "x64/disasm/x64_disasm.h" +#endif + +#endif // DISASM_INC_H diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 9ab6ba30..cdcef522 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11782,15 +11782,19 @@ rd_frame(void) struct { String8 name; + E_TypeIRExtFunctionType *irext; E_TypeExpandInfoFunctionType *info; E_TypeExpandRangeFunctionType *range; } collection_infos[] = { -#define Collection(name) {str8_lit_comp(#name), E_TYPE_EXPAND_INFO_FUNCTION_NAME(name), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name)} - Collection(locals), - Collection(registers), -#undef Collection +#define Collection1(name) {str8_lit_comp(#name), 0, E_TYPE_EXPAND_INFO_FUNCTION_NAME(name), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name)} +#define Collection2(name) {str8_lit_comp(#name), E_TYPE_IREXT_FUNCTION_NAME(name), E_TYPE_EXPAND_INFO_FUNCTION_NAME(name), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name)} + Collection1(locals), + Collection1(registers), + Collection2(autos), +#undef Collection1 +#undef Collection2 }; for EachElement(idx, collection_infos) { @@ -11798,6 +11802,7 @@ rd_frame(void) E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, + .irext = collection_infos[idx].irext, .expand = { .info = collection_infos[idx].info, @@ -16539,6 +16544,28 @@ rd_frame(void) } } } + + // rjf: update the autos-determining code range + { + D_Handle new_thread_handle = thread->handle; + U64 new_sp = d_rsp_from_thread(&d_user_state->ctrl_entity_store->ctx, new_thread_handle); + if(thread == &d_entity_nil) + { + new_thread_handle = selected_thread->handle; + } + if(d_handle_match(new_thread_handle, rd_state->last_stop_selected_thread) && + new_sp == rd_state->last_stop_selected_thread_sp) + { + rd_state->autos_determining_vaddr_range = r1u64(rd_state->last_stop_selected_thread_ip, vaddr); + } + else + { + MemoryZeroStruct(&rd_state->autos_determining_vaddr_range); + } + rd_state->last_stop_selected_thread = new_thread_handle; + rd_state->last_stop_selected_thread_ip = vaddr; + rd_state->last_stop_selected_thread_sp = new_sp; + } }break; } } diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index f5e777d3..451eb84c 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -495,6 +495,19 @@ struct RD_State RD_Regs *next_hover_regs; RD_RegSlot next_hover_regs_slot; + // rjf: autos-determining code range + // + // NOTE(rjf): this includes only instructions that we've observed the + // selected thread passed. autos are *also* computed from disassembling + // the line at which any thread sits, but we only want to collect autos + // from larger ranges of instructions when we directly observer this + // on a particular selected thread within a single function. + // + D_Handle last_stop_selected_thread; + U64 last_stop_selected_thread_ip; + U64 last_stop_selected_thread_sp; + Rng1U64 autos_determining_vaddr_range; + // rjf: icon texture R_Handle icon_texture; diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index b100e756..fa93bc19 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -306,6 +306,222 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers) } } +//////////////////////////////// +//~ rjf: `autos` Type Hooks + +typedef struct RD_AutosAccel RD_AutosAccel; +struct RD_AutosAccel +{ + String8Array exprs; +}; + +E_TYPE_IREXT_FUNCTION_DEF(autos) +{ + E_IRExt irext = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: compute all autos + String8List auto_exprs = {0}; + ProfScope("compute all autos") + { + Access *access = access_open(); + U64 seen_expr_slots_count = 16; + String8Node **seen_expr_slots = push_array(scratch.arena, String8Node *, seen_expr_slots_count); + D_Handle thread_handle = rd_regs()->thread; + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, thread_handle); + D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 0, 0); + if(call_stack.frames_count != 0) + { + //- rjf: unpack thread / module / debug info / lines + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + U64 thread_ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread_handle); + D_Entity *module = d_module_from_process_vaddr(process, thread_ip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + U64 thread_ip_voff = d_voff_from_vaddr(module, thread_ip_vaddr); + D_LineList thread_ip_lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, thread_ip_voff); + + //- rjf: gather all relevant code vaddr ranges + Rng1U64List code_vaddr_ranges = {0}; + { + U64 line_range_limit = 0; + for EachNode(n, D_LineNode, thread_ip_lines.first) + { + Rng1U64 line_voff_range = n->v.voff_range; + Rng1U64 line_vaddr_range = d_vaddr_range_from_voff_range(module, line_voff_range); + rng1u64_list_push(scratch.arena, &code_vaddr_ranges, line_vaddr_range); + line_range_limit += 1; + if(line_range_limit >= 16) + { + break; + } + } + rng1u64_list_push(scratch.arena, &code_vaddr_ranges, rd_state->autos_determining_vaddr_range); + } + + //- rjf: for each code vaddr range -> disassemble, look at src/dest of instructions, + // map back to location info, & gather expressions for affected symbols + for EachNode(n, Rng1U64Node, code_vaddr_ranges.first) + { + Rng1U64 vaddr_range = n->v; + vaddr_range.max = Min(vaddr_range.min+64, vaddr_range.max); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, vaddr_range, 0, 0); + for(U64 off = 0, next_off = 0; off < slice.data.size; off = next_off) + { + next_off = slice.data.size; + + // rjf: disassemble next instruction + DASM_Inst inst = dasm_inst_from_code(scratch.arena, thread->arch, vaddr_range.min + off, str8_skip(slice.data, off), DASM_Syntax_Intel); + next_off = off + inst.size; + + // rjf: gather locations from instruction + struct + { + ARCH_RegCode reg_code; + U64 reg_off; + } + inst_locations[] = + { + {inst.dst_reg_code, inst.dst_reg_off}, + {inst.src_reg_code, inst.src_reg_off}, + }; + + // rjf: for each location -> map to symbols, gather + for EachElement(location_idx, inst_locations) + { + if(inst_locations[location_idx].reg_code != 0) + { + U64 reg_value = 0; + void *regs = call_stack.frames[0].regs; + Rng1U16 reg_rng = arch_info->reg_code_rng_table[inst_locations[location_idx].reg_code]; + reg_rng.max = Min(reg_rng.max, reg_rng.min + sizeof(reg_value)); + if(arch_reg_block_read_range(arch_info, regs, reg_rng, ®_value)) + { + U64 affected_vaddr = reg_value + inst_locations[location_idx].reg_off; + + // rjf: compare against locals + { + E_String2NumMap *locals_map = e_ir_ctx->locals_map; + for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) + { + U64 local_num = n->num; + if(local_num != 0) + { + U64 local_idx = local_num-1; + RDI_Symbol *local = rdi_element_from_name_idx(rdi, LocalVariables, local_idx); + if(rdi_kind_from_location(local->location) == RDI_LocationKind_AddrBytecodeStream || + rdi_kind_from_location(local->location) == RDI_LocationKind_AddrRegPlusOff || + rdi_kind_from_location(local->location) == RDI_LocationKind_AddrAddrRegPlusOff) + { + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local->type_idx); + E_OpList local_ops = e_oplist_from_location(scratch.arena, rdi, local->location); + String8 local_bytecode = e_bytecode_from_oplist(scratch.arena, &local_ops); + E_Interpretation local_addr_interpret = e_interpret(local_bytecode); + U64 local_vaddr = local_addr_interpret.value.u64; + Rng1U64 local_vaddr_range = r1u64(local_vaddr, local_vaddr+type_node->byte_size); + if(contains_1u64(local_vaddr_range, affected_vaddr)) + { + String8 local_name = str8_from_rdi_string_idx(rdi, local->name_string_idx); + U64 hash = u64_hash_from_str8(local_name); + U64 slot_idx = hash%seen_expr_slots_count; + B32 already_seen = 0; + for(String8Node *n = seen_expr_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, local_name, 0)) + { + already_seen = 1; + break; + } + } + if(!already_seen) + { + str8_list_push(scratch.arena, &auto_exprs, local_name); + String8Node *n = push_array(scratch.arena, String8Node, 1); + SLLStackPush(seen_expr_slots[slot_idx], n); + n->string = local_name; + } + } + } + } + } + } + + // rjf: compare against global variables + { + D_Entity *affected_module = d_module_from_process_vaddr(process, affected_vaddr); + U64 affected_voff = d_voff_from_vaddr(affected_module, affected_vaddr); + DI_Key affected_dbgi_key = d_dbgi_key_from_module(affected_module); + RDI_Parsed *affected_rdi = di_rdi_from_key(access, affected_dbgi_key, 0, 0); + RDI_Symbol *affected_gvar = rdi_global_variable_from_voff(affected_rdi, affected_voff); + if(affected_gvar->name_string_idx != 0) + { + String8 gvar_name = fully_qualified_str8_from_rdi_symbol(arena, affected_rdi, affected_gvar); + U64 hash = u64_hash_from_str8(gvar_name); + U64 slot_idx = hash%seen_expr_slots_count; + B32 already_seen = 0; + for(String8Node *n = seen_expr_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, gvar_name, 0)) + { + already_seen = 1; + break; + } + } + if(!already_seen) + { + str8_list_push(scratch.arena, &auto_exprs, gvar_name); + String8Node *n = push_array(scratch.arena, String8Node, 1); + SLLStackPush(seen_expr_slots[slot_idx], n); + n->string = gvar_name; + } + } + } + } + } + } + } + } + } + access_close(access); + } + + //- rjf: gather + RD_AutosAccel *accel = push_array(arena, RD_AutosAccel, 1); + { + accel->exprs = str8_array_from_list(arena, &auto_exprs); + } + irext.user_data = accel; + + scratch_end(scratch); + } + return irext; +} + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(autos) +{ + E_TypeExpandInfo info = {0}; + RD_AutosAccel *accel = (RD_AutosAccel *)eval.irtree.user_data; + if(accel != 0) + { + info.expr_count = accel->exprs.count; + } + return info; +} + +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(autos) +{ + RD_AutosAccel *accel = (RD_AutosAccel *)eval.irtree.user_data; + if(accel != 0) + { + for EachInRange(idx, idx_range) + { + evals_out[idx - idx_range.min] = e_eval_from_string(accel->exprs.v[idx]); + } + } +} + //////////////////////////////// //~ rjf: Schema Type Hooks diff --git a/src/raddbg/raddbg_eval.h b/src/raddbg/raddbg_eval.h index a9450678..daba97c3 100644 --- a/src/raddbg/raddbg_eval.h +++ b/src/raddbg/raddbg_eval.h @@ -37,6 +37,13 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals); E_TYPE_EXPAND_INFO_FUNCTION_DEF(registers); E_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers); +//////////////////////////////// +//~ rjf: `autos` Type Hooks + +E_TYPE_IREXT_FUNCTION_DEF(autos); +E_TYPE_EXPAND_INFO_FUNCTION_DEF(autos); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(autos); + //////////////////////////////// //~ rjf: Schema Type Hooks diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 33973c56..d1937282 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,9 @@ //////////////////////////////// //~ rjf: post-0.9.26 TODO notes // +// [ ] symbol server +// [ ] core dump saving/loading +// // [ ] "autos" collection, which can be evaluated // [ ] show "autos" inline in source code near thread? // [ ] memory_size(...) view for quickly evaluating memory sizes @@ -173,7 +176,6 @@ // //- control improvements // [ ] debug info overrides (both path-based AND module-based) -// [ ] symbol server // [ ] can it ignore stepping into _RTC_CheckStackVars generated functions? // [ ] jump table thunks, on code w/o /INCREMENTAL:NO // [ ] investigate /DEBUG:FASTLINK - can we somehow alert that we do not @@ -195,7 +197,6 @@ // //- longer-term future features // [ ] long-term future notes from martins -// [ ] core dump saving/loading // [ ] parallel call stacks view // [ ] parallel watch view // [ ] mixed native/interpreted/jit debugging @@ -328,7 +329,7 @@ #include "radbin/radbin.h" #include "arch/arch_inc.h" #include "dbg_info/dbg_info.h" -#include "disasm/disasm.h" +#include "disasm/disasm_inc.h" #include "stap/stap_parse.h" #include "demon/demon_inc.h" #include "eval/eval_inc.h" @@ -381,7 +382,7 @@ #include "radbin/radbin.c" #include "arch/arch_inc.c" #include "dbg_info/dbg_info.c" -#include "disasm/disasm.c" +#include "disasm/disasm_inc.c" #include "stap/stap_parse.c" #include "demon/demon_inc.c" #include "eval/eval_inc.c" diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 238ae6e7..64326bd9 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -64,7 +64,7 @@ #include "radbin/radbin.h" #include "arch/arch_inc.h" #include "dbg_info/dbg_info.h" -#include "disasm/disasm.h" +#include "disasm/disasm_inc.h" #include "stap/stap_parse.h" #include "demon/demon_inc.h" #include "eval/eval_inc.h" @@ -137,7 +137,7 @@ #include "radbin/radbin.c" #include "arch/arch_inc.c" #include "dbg_info/dbg_info.c" -#include "disasm/disasm.c" +#include "disasm/disasm_inc.c" #include "stap/stap_parse.c" #include "demon/demon_inc.c" #include "eval/eval_inc.c" diff --git a/src/x64/disasm/x64_disasm.c b/src/x64/disasm/x64_disasm.c new file mode 100644 index 00000000..f60eef86 --- /dev/null +++ b/src/x64/disasm/x64_disasm.c @@ -0,0 +1,469 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#if !defined(ZYDIS_H) +#include "third_party/zydis/zydis.h" +#include "third_party/zydis/zydis.c" +#endif + +internal DASM_Inst +x64_dasm_inst_from_code(Arena *arena, U64 vaddr, String8 code, DASM_Syntax syntax) +{ + DASM_Inst inst = {0}; + + ////////////////////////////// + //- rjf: determine zydis formatter style + // + ZydisFormatterStyle style = ZYDIS_FORMATTER_STYLE_INTEL; + switch(syntax) + { + default:{}break; + case DASM_Syntax_Intel:{style = ZYDIS_FORMATTER_STYLE_INTEL;}break; + case DASM_Syntax_ATT: {style = ZYDIS_FORMATTER_STYLE_ATT;}break; + } + + ////////////////////////////// + //- rjf: disassemble one instruction + // + ZydisDisassembledInstruction zinst = {0}; + ZyanStatus status = ZydisDisassemble(ZYDIS_MACHINE_MODE_LONG_64, vaddr, code.str, code.size, &zinst, style); + + ////////////////////////////// + //- rjf: analyze + // + DASM_InstFlags flags = 0; + U64 dst_vaddr = 0; + X64_RegCode src_reg_code = 0; + X64_RegCode dst_reg_code = 0; + S64 src_reg_off = 0; + S64 dst_reg_off = 0; + { + //- rjf: unpack operands + ZydisDecodedOperand *first_visible_op = (zinst.info.operand_count_visible > 0 ? &zinst.operands[0] : 0); + ZydisDecodedOperand *first_op = (zinst.info.operand_count > 0 ? &zinst.operands[0] : 0); + ZydisDecodedOperand *second_op = (zinst.info.operand_count > 1 ? &zinst.operands[1] : 0); + + //- rjf: extract registers from operands + ZydisRegister zydis_reg_codes[2] = {0}; + if(first_op != 0 && first_op->type == ZYDIS_OPERAND_TYPE_REGISTER) + { + zydis_reg_codes[0] = first_op->reg.value; + } + if(first_op != 0 && first_op->type == ZYDIS_OPERAND_TYPE_MEMORY) + { + zydis_reg_codes[0] = first_op->mem.base; + } + if(second_op != 0 && second_op->type == ZYDIS_OPERAND_TYPE_REGISTER) + { + zydis_reg_codes[1] = second_op->reg.value; + } + if(second_op != 0 && second_op->type == ZYDIS_OPERAND_TYPE_MEMORY) + { + zydis_reg_codes[1] = second_op->mem.base; + } + + //- rjf: map zydis registers -> x64 layer + X64_RegCode x64_reg_codes[2] = {0}; + for EachElement(reg_code_idx, zydis_reg_codes) + { + ZydisRegister src_reg = zydis_reg_codes[reg_code_idx]; + X64_RegCode dst_reg = 0; + switch(src_reg) + { + default:{}break; + case ZYDIS_REGISTER_AL:{dst_reg = X64_RegCode_al;}break; + case ZYDIS_REGISTER_CL:{dst_reg = X64_RegCode_cl;}break; + case ZYDIS_REGISTER_DL:{dst_reg = X64_RegCode_dl;}break; + case ZYDIS_REGISTER_BL:{dst_reg = X64_RegCode_bl;}break; + case ZYDIS_REGISTER_AH:{dst_reg = X64_RegCode_ah;}break; + case ZYDIS_REGISTER_CH:{dst_reg = X64_RegCode_ch;}break; + case ZYDIS_REGISTER_DH:{dst_reg = X64_RegCode_dh;}break; + case ZYDIS_REGISTER_BH:{dst_reg = X64_RegCode_bh;}break; + case ZYDIS_REGISTER_SPL:{dst_reg = X64_RegCode_spl;}break; + case ZYDIS_REGISTER_BPL:{dst_reg = X64_RegCode_bpl;}break; + case ZYDIS_REGISTER_SIL:{dst_reg = X64_RegCode_sil;}break; + case ZYDIS_REGISTER_DIL:{dst_reg = X64_RegCode_dil;}break; + case ZYDIS_REGISTER_R8B:{dst_reg = X64_RegCode_r8b;}break; + case ZYDIS_REGISTER_R9B:{dst_reg = X64_RegCode_r9b;}break; + case ZYDIS_REGISTER_R10B:{dst_reg = X64_RegCode_r10b;}break; + case ZYDIS_REGISTER_R11B:{dst_reg = X64_RegCode_r11b;}break; + case ZYDIS_REGISTER_R12B:{dst_reg = X64_RegCode_r12b;}break; + case ZYDIS_REGISTER_R13B:{dst_reg = X64_RegCode_r13b;}break; + case ZYDIS_REGISTER_R14B:{dst_reg = X64_RegCode_r14b;}break; + case ZYDIS_REGISTER_R15B:{dst_reg = X64_RegCode_r15b;}break; + case ZYDIS_REGISTER_AX:{dst_reg = X64_RegCode_ax;}break; + case ZYDIS_REGISTER_CX:{dst_reg = X64_RegCode_cx;}break; + case ZYDIS_REGISTER_DX:{dst_reg = X64_RegCode_dx;}break; + case ZYDIS_REGISTER_BX:{dst_reg = X64_RegCode_bx;}break; + case ZYDIS_REGISTER_SP:{dst_reg = X64_RegCode_sp;}break; + case ZYDIS_REGISTER_BP:{dst_reg = X64_RegCode_bp;}break; + case ZYDIS_REGISTER_SI:{dst_reg = X64_RegCode_si;}break; + case ZYDIS_REGISTER_DI:{dst_reg = X64_RegCode_di;}break; + case ZYDIS_REGISTER_R8W:{dst_reg = X64_RegCode_r8w;}break; + case ZYDIS_REGISTER_R9W:{dst_reg = X64_RegCode_r9w;}break; + case ZYDIS_REGISTER_R10W:{dst_reg = X64_RegCode_r10w;}break; + case ZYDIS_REGISTER_R11W:{dst_reg = X64_RegCode_r11w;}break; + case ZYDIS_REGISTER_R12W:{dst_reg = X64_RegCode_r12w;}break; + case ZYDIS_REGISTER_R13W:{dst_reg = X64_RegCode_r13w;}break; + case ZYDIS_REGISTER_R14W:{dst_reg = X64_RegCode_r14w;}break; + case ZYDIS_REGISTER_R15W:{dst_reg = X64_RegCode_r15w;}break; + case ZYDIS_REGISTER_EAX:{dst_reg = X64_RegCode_eax;}break; + case ZYDIS_REGISTER_ECX:{dst_reg = X64_RegCode_ecx;}break; + case ZYDIS_REGISTER_EDX:{dst_reg = X64_RegCode_edx;}break; + case ZYDIS_REGISTER_EBX:{dst_reg = X64_RegCode_ebx;}break; + case ZYDIS_REGISTER_ESP:{dst_reg = X64_RegCode_esp;}break; + case ZYDIS_REGISTER_EBP:{dst_reg = X64_RegCode_ebp;}break; + case ZYDIS_REGISTER_ESI:{dst_reg = X64_RegCode_esi;}break; + case ZYDIS_REGISTER_EDI:{dst_reg = X64_RegCode_edi;}break; + case ZYDIS_REGISTER_R8D:{dst_reg = X64_RegCode_r8d;}break; + case ZYDIS_REGISTER_R9D:{dst_reg = X64_RegCode_r9d;}break; + case ZYDIS_REGISTER_R10D:{dst_reg = X64_RegCode_r10d;}break; + case ZYDIS_REGISTER_R11D:{dst_reg = X64_RegCode_r11d;}break; + case ZYDIS_REGISTER_R12D:{dst_reg = X64_RegCode_r12d;}break; + case ZYDIS_REGISTER_R13D:{dst_reg = X64_RegCode_r13d;}break; + case ZYDIS_REGISTER_R14D:{dst_reg = X64_RegCode_r14d;}break; + case ZYDIS_REGISTER_R15D:{dst_reg = X64_RegCode_r15d;}break; + case ZYDIS_REGISTER_RAX:{dst_reg = X64_RegCode_rax;}break; + case ZYDIS_REGISTER_RCX:{dst_reg = X64_RegCode_rcx;}break; + case ZYDIS_REGISTER_RDX:{dst_reg = X64_RegCode_rdx;}break; + case ZYDIS_REGISTER_RBX:{dst_reg = X64_RegCode_rbx;}break; + case ZYDIS_REGISTER_RSP:{dst_reg = X64_RegCode_rsp;}break; + case ZYDIS_REGISTER_RBP:{dst_reg = X64_RegCode_rbp;}break; + case ZYDIS_REGISTER_RSI:{dst_reg = X64_RegCode_rsi;}break; + case ZYDIS_REGISTER_RDI:{dst_reg = X64_RegCode_rdi;}break; + case ZYDIS_REGISTER_R8:{dst_reg = X64_RegCode_r8;}break; + case ZYDIS_REGISTER_R9:{dst_reg = X64_RegCode_r9;}break; + case ZYDIS_REGISTER_R10:{dst_reg = X64_RegCode_r10;}break; + case ZYDIS_REGISTER_R11:{dst_reg = X64_RegCode_r11;}break; + case ZYDIS_REGISTER_R12:{dst_reg = X64_RegCode_r12;}break; + case ZYDIS_REGISTER_R13:{dst_reg = X64_RegCode_r13;}break; + case ZYDIS_REGISTER_R14:{dst_reg = X64_RegCode_r14;}break; + case ZYDIS_REGISTER_R15:{dst_reg = X64_RegCode_r15;}break; + case ZYDIS_REGISTER_ST0:{dst_reg = X64_RegCode_st0;}break; + case ZYDIS_REGISTER_ST1:{dst_reg = X64_RegCode_st1;}break; + case ZYDIS_REGISTER_ST2:{dst_reg = X64_RegCode_st2;}break; + case ZYDIS_REGISTER_ST3:{dst_reg = X64_RegCode_st3;}break; + case ZYDIS_REGISTER_ST4:{dst_reg = X64_RegCode_st4;}break; + case ZYDIS_REGISTER_ST5:{dst_reg = X64_RegCode_st5;}break; + case ZYDIS_REGISTER_ST6:{dst_reg = X64_RegCode_st6;}break; + case ZYDIS_REGISTER_ST7:{dst_reg = X64_RegCode_st7;}break; + case ZYDIS_REGISTER_MM0:{dst_reg = X64_RegCode_mm0;}break; + case ZYDIS_REGISTER_MM1:{dst_reg = X64_RegCode_mm1;}break; + case ZYDIS_REGISTER_MM2:{dst_reg = X64_RegCode_mm2;}break; + case ZYDIS_REGISTER_MM3:{dst_reg = X64_RegCode_mm3;}break; + case ZYDIS_REGISTER_MM4:{dst_reg = X64_RegCode_mm4;}break; + case ZYDIS_REGISTER_MM5:{dst_reg = X64_RegCode_mm5;}break; + case ZYDIS_REGISTER_MM6:{dst_reg = X64_RegCode_mm6;}break; + case ZYDIS_REGISTER_MM7:{dst_reg = X64_RegCode_mm7;}break; + case ZYDIS_REGISTER_XMM0:{dst_reg = X64_RegCode_xmm0;}break; + case ZYDIS_REGISTER_XMM1:{dst_reg = X64_RegCode_xmm1;}break; + case ZYDIS_REGISTER_XMM2:{dst_reg = X64_RegCode_xmm2;}break; + case ZYDIS_REGISTER_XMM3:{dst_reg = X64_RegCode_xmm3;}break; + case ZYDIS_REGISTER_XMM4:{dst_reg = X64_RegCode_xmm4;}break; + case ZYDIS_REGISTER_XMM5:{dst_reg = X64_RegCode_xmm5;}break; + case ZYDIS_REGISTER_XMM6:{dst_reg = X64_RegCode_xmm6;}break; + case ZYDIS_REGISTER_XMM7:{dst_reg = X64_RegCode_xmm7;}break; + case ZYDIS_REGISTER_XMM8:{dst_reg = X64_RegCode_xmm8;}break; + case ZYDIS_REGISTER_XMM9:{dst_reg = X64_RegCode_xmm9;}break; + case ZYDIS_REGISTER_XMM10:{dst_reg = X64_RegCode_xmm10;}break; + case ZYDIS_REGISTER_XMM11:{dst_reg = X64_RegCode_xmm11;}break; + case ZYDIS_REGISTER_XMM12:{dst_reg = X64_RegCode_xmm12;}break; + case ZYDIS_REGISTER_XMM13:{dst_reg = X64_RegCode_xmm13;}break; + case ZYDIS_REGISTER_XMM14:{dst_reg = X64_RegCode_xmm14;}break; + case ZYDIS_REGISTER_XMM15:{dst_reg = X64_RegCode_xmm15;}break; + case ZYDIS_REGISTER_YMM0:{dst_reg = X64_RegCode_ymm0;}break; + case ZYDIS_REGISTER_YMM1:{dst_reg = X64_RegCode_ymm1;}break; + case ZYDIS_REGISTER_YMM2:{dst_reg = X64_RegCode_ymm2;}break; + case ZYDIS_REGISTER_YMM3:{dst_reg = X64_RegCode_ymm3;}break; + case ZYDIS_REGISTER_YMM4:{dst_reg = X64_RegCode_ymm4;}break; + case ZYDIS_REGISTER_YMM5:{dst_reg = X64_RegCode_ymm5;}break; + case ZYDIS_REGISTER_YMM6:{dst_reg = X64_RegCode_ymm6;}break; + case ZYDIS_REGISTER_YMM7:{dst_reg = X64_RegCode_ymm7;}break; + case ZYDIS_REGISTER_YMM8:{dst_reg = X64_RegCode_ymm8;}break; + case ZYDIS_REGISTER_YMM9:{dst_reg = X64_RegCode_ymm9;}break; + case ZYDIS_REGISTER_YMM10:{dst_reg = X64_RegCode_ymm10;}break; + case ZYDIS_REGISTER_YMM11:{dst_reg = X64_RegCode_ymm11;}break; + case ZYDIS_REGISTER_YMM12:{dst_reg = X64_RegCode_ymm12;}break; + case ZYDIS_REGISTER_YMM13:{dst_reg = X64_RegCode_ymm13;}break; + case ZYDIS_REGISTER_YMM14:{dst_reg = X64_RegCode_ymm14;}break; + case ZYDIS_REGISTER_YMM15:{dst_reg = X64_RegCode_ymm15;}break; + case ZYDIS_REGISTER_ZMM0:{dst_reg = X64_RegCode_zmm0;}break; + case ZYDIS_REGISTER_ZMM1:{dst_reg = X64_RegCode_zmm1;}break; + case ZYDIS_REGISTER_ZMM2:{dst_reg = X64_RegCode_zmm2;}break; + case ZYDIS_REGISTER_ZMM3:{dst_reg = X64_RegCode_zmm3;}break; + case ZYDIS_REGISTER_ZMM4:{dst_reg = X64_RegCode_zmm4;}break; + case ZYDIS_REGISTER_ZMM5:{dst_reg = X64_RegCode_zmm5;}break; + case ZYDIS_REGISTER_ZMM6:{dst_reg = X64_RegCode_zmm6;}break; + case ZYDIS_REGISTER_ZMM7:{dst_reg = X64_RegCode_zmm7;}break; + case ZYDIS_REGISTER_ZMM8:{dst_reg = X64_RegCode_zmm8;}break; + case ZYDIS_REGISTER_ZMM9:{dst_reg = X64_RegCode_zmm9;}break; + case ZYDIS_REGISTER_ZMM10:{dst_reg = X64_RegCode_zmm10;}break; + case ZYDIS_REGISTER_ZMM11:{dst_reg = X64_RegCode_zmm11;}break; + case ZYDIS_REGISTER_ZMM12:{dst_reg = X64_RegCode_zmm12;}break; + case ZYDIS_REGISTER_ZMM13:{dst_reg = X64_RegCode_zmm13;}break; + case ZYDIS_REGISTER_ZMM14:{dst_reg = X64_RegCode_zmm14;}break; + case ZYDIS_REGISTER_ZMM15:{dst_reg = X64_RegCode_zmm15;}break; + case ZYDIS_REGISTER_ZMM16:{dst_reg = X64_RegCode_zmm16;}break; + case ZYDIS_REGISTER_ZMM17:{dst_reg = X64_RegCode_zmm17;}break; + case ZYDIS_REGISTER_ZMM18:{dst_reg = X64_RegCode_zmm18;}break; + case ZYDIS_REGISTER_ZMM19:{dst_reg = X64_RegCode_zmm19;}break; + case ZYDIS_REGISTER_ZMM20:{dst_reg = X64_RegCode_zmm20;}break; + case ZYDIS_REGISTER_ZMM21:{dst_reg = X64_RegCode_zmm21;}break; + case ZYDIS_REGISTER_ZMM22:{dst_reg = X64_RegCode_zmm22;}break; + case ZYDIS_REGISTER_ZMM23:{dst_reg = X64_RegCode_zmm23;}break; + case ZYDIS_REGISTER_ZMM24:{dst_reg = X64_RegCode_zmm24;}break; + case ZYDIS_REGISTER_ZMM25:{dst_reg = X64_RegCode_zmm25;}break; + case ZYDIS_REGISTER_ZMM26:{dst_reg = X64_RegCode_zmm26;}break; + case ZYDIS_REGISTER_ZMM27:{dst_reg = X64_RegCode_zmm27;}break; + case ZYDIS_REGISTER_ZMM28:{dst_reg = X64_RegCode_zmm28;}break; + case ZYDIS_REGISTER_ZMM29:{dst_reg = X64_RegCode_zmm29;}break; + case ZYDIS_REGISTER_ZMM30:{dst_reg = X64_RegCode_zmm30;}break; + case ZYDIS_REGISTER_ZMM31:{dst_reg = X64_RegCode_zmm31;}break; + case ZYDIS_REGISTER_EFLAGS:{dst_reg = X64_RegCode_eflags;}break; + case ZYDIS_REGISTER_RFLAGS:{dst_reg = X64_RegCode_rflags;}break; + case ZYDIS_REGISTER_IP:{dst_reg = X64_RegCode_ip;}break; + case ZYDIS_REGISTER_RIP:{dst_reg = X64_RegCode_rip;}break; + case ZYDIS_REGISTER_ES:{dst_reg = X64_RegCode_es;}break; + case ZYDIS_REGISTER_CS:{dst_reg = X64_RegCode_cs;}break; + case ZYDIS_REGISTER_SS:{dst_reg = X64_RegCode_ss;}break; + case ZYDIS_REGISTER_DS:{dst_reg = X64_RegCode_ds;}break; + case ZYDIS_REGISTER_FS:{dst_reg = X64_RegCode_fs;}break; + case ZYDIS_REGISTER_GS:{dst_reg = X64_RegCode_gs;}break; + case ZYDIS_REGISTER_DR0:{dst_reg = X64_RegCode_dr0;}break; + case ZYDIS_REGISTER_DR1:{dst_reg = X64_RegCode_dr1;}break; + case ZYDIS_REGISTER_DR2:{dst_reg = X64_RegCode_dr2;}break; + case ZYDIS_REGISTER_DR3:{dst_reg = X64_RegCode_dr3;}break; + case ZYDIS_REGISTER_DR4:{dst_reg = X64_RegCode_dr4;}break; + case ZYDIS_REGISTER_DR5:{dst_reg = X64_RegCode_dr5;}break; + case ZYDIS_REGISTER_DR6:{dst_reg = X64_RegCode_dr6;}break; + case ZYDIS_REGISTER_DR7:{dst_reg = X64_RegCode_dr7;}break; + case ZYDIS_REGISTER_K0:{dst_reg = X64_RegCode_k0;}break; + case ZYDIS_REGISTER_K1:{dst_reg = X64_RegCode_k1;}break; + case ZYDIS_REGISTER_K2:{dst_reg = X64_RegCode_k2;}break; + case ZYDIS_REGISTER_K3:{dst_reg = X64_RegCode_k3;}break; + case ZYDIS_REGISTER_K4:{dst_reg = X64_RegCode_k4;}break; + case ZYDIS_REGISTER_K5:{dst_reg = X64_RegCode_k5;}break; + case ZYDIS_REGISTER_K6:{dst_reg = X64_RegCode_k6;}break; + case ZYDIS_REGISTER_K7:{dst_reg = X64_RegCode_k7;}break; + case ZYDIS_REGISTER_MXCSR:{dst_reg = X64_RegCode_mxcsr;}break; + + // rjf: currently unsupported by debugger: +#if 0 + case ZYDIS_REGISTER_EIP:{dst_reg = X64_RegCode_eip;}break; + case ZYDIS_REGISTER_X87CONTROL:{dst_reg = X64_RegCode_x87control;}break; + case ZYDIS_REGISTER_X87STATUS:{dst_reg = X64_RegCode_x87status;}break; + case ZYDIS_REGISTER_X87TAG:{dst_reg = X64_RegCode_x87tag;}break; + case ZYDIS_REGISTER_XMM16:{dst_reg = X64_RegCode_xmm16;}break; + case ZYDIS_REGISTER_XMM17:{dst_reg = X64_RegCode_xmm17;}break; + case ZYDIS_REGISTER_XMM18:{dst_reg = X64_RegCode_xmm18;}break; + case ZYDIS_REGISTER_XMM19:{dst_reg = X64_RegCode_xmm19;}break; + case ZYDIS_REGISTER_XMM20:{dst_reg = X64_RegCode_xmm20;}break; + case ZYDIS_REGISTER_XMM21:{dst_reg = X64_RegCode_xmm21;}break; + case ZYDIS_REGISTER_XMM22:{dst_reg = X64_RegCode_xmm22;}break; + case ZYDIS_REGISTER_XMM23:{dst_reg = X64_RegCode_xmm23;}break; + case ZYDIS_REGISTER_XMM24:{dst_reg = X64_RegCode_xmm24;}break; + case ZYDIS_REGISTER_XMM25:{dst_reg = X64_RegCode_xmm25;}break; + case ZYDIS_REGISTER_XMM26:{dst_reg = X64_RegCode_xmm26;}break; + case ZYDIS_REGISTER_XMM27:{dst_reg = X64_RegCode_xmm27;}break; + case ZYDIS_REGISTER_XMM28:{dst_reg = X64_RegCode_xmm28;}break; + case ZYDIS_REGISTER_XMM29:{dst_reg = X64_RegCode_xmm29;}break; + case ZYDIS_REGISTER_XMM30:{dst_reg = X64_RegCode_xmm30;}break; + case ZYDIS_REGISTER_XMM31:{dst_reg = X64_RegCode_xmm31;}break; + case ZYDIS_REGISTER_YMM16:{dst_reg = X64_RegCode_ymm16;}break; + case ZYDIS_REGISTER_YMM17:{dst_reg = X64_RegCode_ymm17;}break; + case ZYDIS_REGISTER_YMM18:{dst_reg = X64_RegCode_ymm18;}break; + case ZYDIS_REGISTER_YMM19:{dst_reg = X64_RegCode_ymm19;}break; + case ZYDIS_REGISTER_YMM20:{dst_reg = X64_RegCode_ymm20;}break; + case ZYDIS_REGISTER_YMM21:{dst_reg = X64_RegCode_ymm21;}break; + case ZYDIS_REGISTER_YMM22:{dst_reg = X64_RegCode_ymm22;}break; + case ZYDIS_REGISTER_YMM23:{dst_reg = X64_RegCode_ymm23;}break; + case ZYDIS_REGISTER_YMM24:{dst_reg = X64_RegCode_ymm24;}break; + case ZYDIS_REGISTER_YMM25:{dst_reg = X64_RegCode_ymm25;}break; + case ZYDIS_REGISTER_YMM26:{dst_reg = X64_RegCode_ymm26;}break; + case ZYDIS_REGISTER_YMM27:{dst_reg = X64_RegCode_ymm27;}break; + case ZYDIS_REGISTER_YMM28:{dst_reg = X64_RegCode_ymm28;}break; + case ZYDIS_REGISTER_YMM29:{dst_reg = X64_RegCode_ymm29;}break; + case ZYDIS_REGISTER_YMM30:{dst_reg = X64_RegCode_ymm30;}break; + case ZYDIS_REGISTER_YMM31:{dst_reg = X64_RegCode_ymm31;}break; + case ZYDIS_REGISTER_TMM0:{dst_reg = X64_RegCode_tmm0;}break; + case ZYDIS_REGISTER_TMM1:{dst_reg = X64_RegCode_tmm1;}break; + case ZYDIS_REGISTER_TMM2:{dst_reg = X64_RegCode_tmm2;}break; + case ZYDIS_REGISTER_TMM3:{dst_reg = X64_RegCode_tmm3;}break; + case ZYDIS_REGISTER_TMM4:{dst_reg = X64_RegCode_tmm4;}break; + case ZYDIS_REGISTER_TMM5:{dst_reg = X64_RegCode_tmm5;}break; + case ZYDIS_REGISTER_TMM6:{dst_reg = X64_RegCode_tmm6;}break; + case ZYDIS_REGISTER_TMM7:{dst_reg = X64_RegCode_tmm7;}break; + case ZYDIS_REGISTER_FLAGS:{dst_reg = X64_RegCode_flags;}break; + case ZYDIS_REGISTER_GDTR:{dst_reg = X64_RegCode_gdtr;}break; + case ZYDIS_REGISTER_LDTR:{dst_reg = X64_RegCode_ldtr;}break; + case ZYDIS_REGISTER_IDTR:{dst_reg = X64_RegCode_idtr;}break; + case ZYDIS_REGISTER_TR:{dst_reg = X64_RegCode_tr;}break; + case ZYDIS_REGISTER_TR0:{dst_reg = X64_RegCode_tr0;}break; + case ZYDIS_REGISTER_TR1:{dst_reg = X64_RegCode_tr1;}break; + case ZYDIS_REGISTER_TR2:{dst_reg = X64_RegCode_tr2;}break; + case ZYDIS_REGISTER_TR3:{dst_reg = X64_RegCode_tr3;}break; + case ZYDIS_REGISTER_TR4:{dst_reg = X64_RegCode_tr4;}break; + case ZYDIS_REGISTER_TR5:{dst_reg = X64_RegCode_tr5;}break; + case ZYDIS_REGISTER_TR6:{dst_reg = X64_RegCode_tr6;}break; + case ZYDIS_REGISTER_TR7:{dst_reg = X64_RegCode_tr7;}break; + case ZYDIS_REGISTER_CR0:{dst_reg = X64_RegCode_cr0;}break; + case ZYDIS_REGISTER_CR1:{dst_reg = X64_RegCode_cr1;}break; + case ZYDIS_REGISTER_CR2:{dst_reg = X64_RegCode_cr2;}break; + case ZYDIS_REGISTER_CR3:{dst_reg = X64_RegCode_cr3;}break; + case ZYDIS_REGISTER_CR4:{dst_reg = X64_RegCode_cr4;}break; + case ZYDIS_REGISTER_CR5:{dst_reg = X64_RegCode_cr5;}break; + case ZYDIS_REGISTER_CR6:{dst_reg = X64_RegCode_cr6;}break; + case ZYDIS_REGISTER_CR7:{dst_reg = X64_RegCode_cr7;}break; + case ZYDIS_REGISTER_CR8:{dst_reg = X64_RegCode_cr8;}break; + case ZYDIS_REGISTER_CR9:{dst_reg = X64_RegCode_cr9;}break; + case ZYDIS_REGISTER_CR10:{dst_reg = X64_RegCode_cr10;}break; + case ZYDIS_REGISTER_CR11:{dst_reg = X64_RegCode_cr11;}break; + case ZYDIS_REGISTER_CR12:{dst_reg = X64_RegCode_cr12;}break; + case ZYDIS_REGISTER_CR13:{dst_reg = X64_RegCode_cr13;}break; + case ZYDIS_REGISTER_CR14:{dst_reg = X64_RegCode_cr14;}break; + case ZYDIS_REGISTER_CR15:{dst_reg = X64_RegCode_cr15;}break; + case ZYDIS_REGISTER_DR8:{dst_reg = X64_RegCode_dr8;}break; + case ZYDIS_REGISTER_DR9:{dst_reg = X64_RegCode_dr9;}break; + case ZYDIS_REGISTER_DR10:{dst_reg = X64_RegCode_dr10;}break; + case ZYDIS_REGISTER_DR11:{dst_reg = X64_RegCode_dr11;}break; + case ZYDIS_REGISTER_DR12:{dst_reg = X64_RegCode_dr12;}break; + case ZYDIS_REGISTER_DR13:{dst_reg = X64_RegCode_dr13;}break; + case ZYDIS_REGISTER_DR14:{dst_reg = X64_RegCode_dr14;}break; + case ZYDIS_REGISTER_DR15:{dst_reg = X64_RegCode_dr15;}break; + case ZYDIS_REGISTER_BND0:{dst_reg = X64_RegCode_bnd0;}break; + case ZYDIS_REGISTER_BND1:{dst_reg = X64_RegCode_bnd1;}break; + case ZYDIS_REGISTER_BND2:{dst_reg = X64_RegCode_bnd2;}break; + case ZYDIS_REGISTER_BND3:{dst_reg = X64_RegCode_bnd3;}break; + case ZYDIS_REGISTER_BNDCFG:{dst_reg = X64_RegCode_bndcfg;}break; + case ZYDIS_REGISTER_BNDSTATUS:{dst_reg = X64_RegCode_bndstatus;}break; + case ZYDIS_REGISTER_PKRU:{dst_reg = X64_RegCode_pkru;}break; + case ZYDIS_REGISTER_XCR0:{dst_reg = X64_RegCode_xcr0;}break; + case ZYDIS_REGISTER_UIF:{dst_reg = X64_RegCode_uif;}break; +#endif + } + x64_reg_codes[reg_code_idx] = dst_reg; + } + + //- rjf: extract info from operands + if(first_op != 0 && + first_op->actions & ZYDIS_OPERAND_ACTION_WRITE) + { + dst_reg_code = x64_reg_codes[0]; + if(first_op->type == ZYDIS_OPERAND_TYPE_MEMORY) + { + dst_reg_off = first_op->mem.disp.value; + } + } + if(second_op != 0 && + second_op->actions & ZYDIS_OPERAND_ACTION_READ) + { + src_reg_code = x64_reg_codes[0]; + if(second_op->type == ZYDIS_OPERAND_TYPE_MEMORY) + { + src_reg_off = second_op->mem.disp.value; + } + } + if(first_visible_op != 0 && + (first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM8 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM64 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_64 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32_32_64 || + first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_32)) + { + ZydisCalcAbsoluteAddress(&zinst.info, first_visible_op, vaddr, &dst_vaddr); + } + if(first_op != 0 && second_op != 0 && first_op->type == ZYDIS_OPERAND_TYPE_REGISTER && + (first_op->reg.value == ZYDIS_REGISTER_RSP || + first_op->reg.value == ZYDIS_REGISTER_ESP || + first_op->reg.value == ZYDIS_REGISTER_SP)) + { + flags |= DASM_InstFlag_ChangesStackPointer; + if(second_op->type != ZYDIS_OPERAND_TYPE_IMMEDIATE) + { + flags |= DASM_InstFlag_ChangesStackPointerVariably; + } + } + if(zinst.info.attributes & (ZYDIS_ATTRIB_HAS_REP| + ZYDIS_ATTRIB_HAS_REPE| + ZYDIS_ATTRIB_HAS_REPZ| + ZYDIS_ATTRIB_HAS_REPNZ| + ZYDIS_ATTRIB_HAS_REPNE)) + { + flags |= DASM_InstFlag_Repeats; + } + switch(zinst.info.mnemonic) + { + case ZYDIS_MNEMONIC_CALL: + { + flags |= DASM_InstFlag_Call; + }break; + + case ZYDIS_MNEMONIC_JB: + case ZYDIS_MNEMONIC_JBE: + case ZYDIS_MNEMONIC_JCXZ: + case ZYDIS_MNEMONIC_JECXZ: + case ZYDIS_MNEMONIC_JKNZD: + case ZYDIS_MNEMONIC_JKZD: + case ZYDIS_MNEMONIC_JL: + case ZYDIS_MNEMONIC_JLE: + case ZYDIS_MNEMONIC_JNB: + case ZYDIS_MNEMONIC_JNBE: + case ZYDIS_MNEMONIC_JNL: + case ZYDIS_MNEMONIC_JNLE: + case ZYDIS_MNEMONIC_JNO: + case ZYDIS_MNEMONIC_JNP: + case ZYDIS_MNEMONIC_JNS: + case ZYDIS_MNEMONIC_JNZ: + case ZYDIS_MNEMONIC_JO: + case ZYDIS_MNEMONIC_JP: + case ZYDIS_MNEMONIC_JRCXZ: + case ZYDIS_MNEMONIC_JS: + case ZYDIS_MNEMONIC_JZ: + case ZYDIS_MNEMONIC_LOOP: + case ZYDIS_MNEMONIC_LOOPE: + case ZYDIS_MNEMONIC_LOOPNE: + { + flags |= DASM_InstFlag_Branch; + }break; + + case ZYDIS_MNEMONIC_JMP: + { + flags |= DASM_InstFlag_UnconditionalJump; + }break; + + case ZYDIS_MNEMONIC_RET: + { + flags |= DASM_InstFlag_Return; + }break; + + case ZYDIS_MNEMONIC_PUSH: + case ZYDIS_MNEMONIC_POP: + { + flags |= DASM_InstFlag_ChangesStackPointer; + }break; + + default: + { + flags |= DASM_InstFlag_NonFlow; + }break; + } + } + + ////////////////////////////// + //- rjf: bundle + // + { + inst.flags = flags; + inst.size = zinst.info.length; + inst.string = str8_copy(arena, str8_cstring(zinst.text)); + inst.dst_vaddr = dst_vaddr; + inst.dst_reg_code = dst_reg_code; + inst.dst_reg_off = dst_reg_off; + inst.src_reg_code = src_reg_code; + inst.src_reg_off = src_reg_off; + } + + return inst; +} diff --git a/src/x64/disasm/x64_disasm.h b/src/x64/disasm/x64_disasm.h new file mode 100644 index 00000000..a3e21842 --- /dev/null +++ b/src/x64/disasm/x64_disasm.h @@ -0,0 +1,9 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef X64_DISASM_H +#define X64_DISASM_H + +internal DASM_Inst x64_dasm_inst_from_code(Arena *arena, U64 vaddr, String8 code, DASM_Syntax syntax); + +#endif // X64_DISASM_H From cb8f2749d9ca09d88c9f4342a28f92d29ef9b899 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 14 May 2026 14:34:17 -0700 Subject: [PATCH 543/850] source/disassembly inline auto expressions --- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 4 + src/raddbg/raddbg_core.c | 176 +++++++++++++++++++++++++++++ src/raddbg/raddbg_core.h | 5 + src/raddbg/raddbg_eval.c | 175 +--------------------------- src/raddbg/raddbg_widgets.c | 144 +++++++++++++---------- 6 files changed, 273 insertions(+), 233 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 32111c53..19b877bb 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -427,7 +427,7 @@ RD_VocabInfo rd_vocab_info_table[359] = RD_NameSchemaInfo rd_name_schema_info_table[39] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 233870b5..59240a09 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -255,6 +255,10 @@ RD_VocabTable: @no_expand @display_name('User Theme') 'theme_colors': set, + //- rjf: auto eval + @display_name('Show Auto Watches In Source / Disassembly') @description("Enables the display of auto watch expressions inline in source and disassembly views.") @default(1) + 'show_autos_in_src_and_disasm': bool, + //- rjf: autocompletion @display_name('Autocompletion Lister') @description("Enables the autocompletion lister while typing expressions.") @default(1) 'autocompletion_lister': bool, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index cdcef522..597295d6 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9821,6 +9821,182 @@ rd_vocab_info_from_code_name_plural(String8 code_name_plural) return result; } +//////////////////////////////// +//~ rjf: Auto Watch Computation + +internal String8Array +rd_gather_auto_exprs(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List auto_exprs = {0}; + ProfScope("compute all autos") + { + Access *access = access_open(); + U64 seen_expr_slots_count = 16; + String8Node **seen_expr_slots = push_array(scratch.arena, String8Node *, seen_expr_slots_count); + D_Handle thread_handle = rd_regs()->thread; + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, thread_handle); + D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 0, 0); + if(call_stack.frames_count != 0) + { + //- rjf: unpack thread / module / debug info / lines + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + U64 thread_ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread_handle); + D_Entity *module = d_module_from_process_vaddr(process, thread_ip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + U64 thread_ip_voff = d_voff_from_vaddr(module, thread_ip_vaddr); + D_LineList thread_ip_lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, thread_ip_voff); + + //- rjf: gather all relevant code vaddr ranges + Rng1U64List code_vaddr_ranges = {0}; + { + U64 line_range_limit = 0; + for EachNode(n, D_LineNode, thread_ip_lines.first) + { + Rng1U64 line_voff_range = n->v.voff_range; + Rng1U64 line_vaddr_range = d_vaddr_range_from_voff_range(module, line_voff_range); + rng1u64_list_push(scratch.arena, &code_vaddr_ranges, line_vaddr_range); + line_range_limit += 1; + if(line_range_limit >= 16) + { + break; + } + } + rng1u64_list_push(scratch.arena, &code_vaddr_ranges, rd_state->autos_determining_vaddr_range); + } + + //- rjf: for each code vaddr range -> disassemble, look at src/dest of instructions, + // map back to location info, & gather expressions for affected symbols + for EachNode(n, Rng1U64Node, code_vaddr_ranges.first) + { + Rng1U64 vaddr_range = n->v; + vaddr_range.max = Min(vaddr_range.min+64, vaddr_range.max); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, vaddr_range, 0, 0); + for(U64 off = 0, next_off = 0; off < slice.data.size; off = next_off) + { + next_off = slice.data.size; + + // rjf: disassemble next instruction + DASM_Inst inst = dasm_inst_from_code(scratch.arena, thread->arch, vaddr_range.min + off, str8_skip(slice.data, off), DASM_Syntax_Intel); + next_off = off + inst.size; + + // rjf: gather locations from instruction + struct + { + ARCH_RegCode reg_code; + U64 reg_off; + } + inst_locations[] = + { + {inst.dst_reg_code, inst.dst_reg_off}, + {inst.src_reg_code, inst.src_reg_off}, + }; + + // rjf: for each location -> map to symbols, gather + for EachElement(location_idx, inst_locations) + { + if(inst_locations[location_idx].reg_code != 0) + { + U64 reg_value = 0; + void *regs = call_stack.frames[0].regs; + Rng1U16 reg_rng = arch_info->reg_code_rng_table[inst_locations[location_idx].reg_code]; + reg_rng.max = Min(reg_rng.max, reg_rng.min + sizeof(reg_value)); + if(arch_reg_block_read_range(arch_info, regs, reg_rng, ®_value)) + { + U64 affected_vaddr = reg_value + inst_locations[location_idx].reg_off; + + // rjf: compare against locals + { + E_String2NumMap *locals_map = e_ir_ctx->locals_map; + for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) + { + U64 local_num = n->num; + if(local_num != 0) + { + U64 local_idx = local_num-1; + RDI_Symbol *local = rdi_element_from_name_idx(rdi, LocalVariables, local_idx); + if(rdi_kind_from_location(local->location) == RDI_LocationKind_AddrBytecodeStream || + rdi_kind_from_location(local->location) == RDI_LocationKind_AddrRegPlusOff || + rdi_kind_from_location(local->location) == RDI_LocationKind_AddrAddrRegPlusOff) + { + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local->type_idx); + E_OpList local_ops = e_oplist_from_location(scratch.arena, rdi, local->location); + String8 local_bytecode = e_bytecode_from_oplist(scratch.arena, &local_ops); + E_Interpretation local_addr_interpret = e_interpret(local_bytecode); + U64 local_vaddr = local_addr_interpret.value.u64; + Rng1U64 local_vaddr_range = r1u64(local_vaddr, local_vaddr+type_node->byte_size); + if(contains_1u64(local_vaddr_range, affected_vaddr)) + { + String8 local_name = str8_from_rdi_string_idx(rdi, local->name_string_idx); + U64 hash = u64_hash_from_str8(local_name); + U64 slot_idx = hash%seen_expr_slots_count; + B32 already_seen = 0; + for(String8Node *n = seen_expr_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, local_name, 0)) + { + already_seen = 1; + break; + } + } + if(!already_seen) + { + str8_list_push(scratch.arena, &auto_exprs, local_name); + String8Node *n = push_array(scratch.arena, String8Node, 1); + SLLStackPush(seen_expr_slots[slot_idx], n); + n->string = local_name; + } + } + } + } + } + } + + // rjf: compare against global variables + { + D_Entity *affected_module = d_module_from_process_vaddr(process, affected_vaddr); + U64 affected_voff = d_voff_from_vaddr(affected_module, affected_vaddr); + DI_Key affected_dbgi_key = d_dbgi_key_from_module(affected_module); + RDI_Parsed *affected_rdi = di_rdi_from_key(access, affected_dbgi_key, 0, 0); + RDI_Symbol *affected_gvar = rdi_global_variable_from_voff(affected_rdi, affected_voff); + if(affected_gvar->name_string_idx != 0) + { + String8 gvar_name = fully_qualified_str8_from_rdi_symbol(arena, affected_rdi, affected_gvar); + U64 hash = u64_hash_from_str8(gvar_name); + U64 slot_idx = hash%seen_expr_slots_count; + B32 already_seen = 0; + for(String8Node *n = seen_expr_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, gvar_name, 0)) + { + already_seen = 1; + break; + } + } + if(!already_seen) + { + str8_list_push(scratch.arena, &auto_exprs, gvar_name); + String8Node *n = push_array(scratch.arena, String8Node, 1); + SLLStackPush(seen_expr_slots[slot_idx], n); + n->string = gvar_name; + } + } + } + } + } + } + } + } + } + access_close(access); + } + String8Array result = str8_array_from_list(arena, &auto_exprs); + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Continuous Frame Requests diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 451eb84c..e278f87e 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -794,6 +794,11 @@ internal RD_VocabInfo *rd_vocab_info_from_code_name_plural(String8 code_name_plu #define rd_icon_kind_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->icon_kind) #define rd_singular_from_code_name_plural(code_name_plural) (rd_vocab_info_from_code_name_plural(code_name_plural)->code_name) +//////////////////////////////// +//~ rjf: Auto Watch Computation + +internal String8Array rd_gather_auto_exprs(Arena *arena); + //////////////////////////////// //~ rjf: Continuous Frame Requests diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index fa93bc19..c911fbaf 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -319,182 +319,9 @@ E_TYPE_IREXT_FUNCTION_DEF(autos) { E_IRExt irext = {0}; { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: compute all autos - String8List auto_exprs = {0}; - ProfScope("compute all autos") - { - Access *access = access_open(); - U64 seen_expr_slots_count = 16; - String8Node **seen_expr_slots = push_array(scratch.arena, String8Node *, seen_expr_slots_count); - D_Handle thread_handle = rd_regs()->thread; - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, thread_handle); - D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 0, 0); - if(call_stack.frames_count != 0) - { - //- rjf: unpack thread / module / debug info / lines - ARCH_Info *arch_info = arch_info_from_arch(thread->arch); - D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - U64 thread_ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread_handle); - D_Entity *module = d_module_from_process_vaddr(process, thread_ip_vaddr); - DI_Key dbgi_key = d_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - U64 thread_ip_voff = d_voff_from_vaddr(module, thread_ip_vaddr); - D_LineList thread_ip_lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, thread_ip_voff); - - //- rjf: gather all relevant code vaddr ranges - Rng1U64List code_vaddr_ranges = {0}; - { - U64 line_range_limit = 0; - for EachNode(n, D_LineNode, thread_ip_lines.first) - { - Rng1U64 line_voff_range = n->v.voff_range; - Rng1U64 line_vaddr_range = d_vaddr_range_from_voff_range(module, line_voff_range); - rng1u64_list_push(scratch.arena, &code_vaddr_ranges, line_vaddr_range); - line_range_limit += 1; - if(line_range_limit >= 16) - { - break; - } - } - rng1u64_list_push(scratch.arena, &code_vaddr_ranges, rd_state->autos_determining_vaddr_range); - } - - //- rjf: for each code vaddr range -> disassemble, look at src/dest of instructions, - // map back to location info, & gather expressions for affected symbols - for EachNode(n, Rng1U64Node, code_vaddr_ranges.first) - { - Rng1U64 vaddr_range = n->v; - vaddr_range.max = Min(vaddr_range.min+64, vaddr_range.max); - D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, vaddr_range, 0, 0); - for(U64 off = 0, next_off = 0; off < slice.data.size; off = next_off) - { - next_off = slice.data.size; - - // rjf: disassemble next instruction - DASM_Inst inst = dasm_inst_from_code(scratch.arena, thread->arch, vaddr_range.min + off, str8_skip(slice.data, off), DASM_Syntax_Intel); - next_off = off + inst.size; - - // rjf: gather locations from instruction - struct - { - ARCH_RegCode reg_code; - U64 reg_off; - } - inst_locations[] = - { - {inst.dst_reg_code, inst.dst_reg_off}, - {inst.src_reg_code, inst.src_reg_off}, - }; - - // rjf: for each location -> map to symbols, gather - for EachElement(location_idx, inst_locations) - { - if(inst_locations[location_idx].reg_code != 0) - { - U64 reg_value = 0; - void *regs = call_stack.frames[0].regs; - Rng1U16 reg_rng = arch_info->reg_code_rng_table[inst_locations[location_idx].reg_code]; - reg_rng.max = Min(reg_rng.max, reg_rng.min + sizeof(reg_value)); - if(arch_reg_block_read_range(arch_info, regs, reg_rng, ®_value)) - { - U64 affected_vaddr = reg_value + inst_locations[location_idx].reg_off; - - // rjf: compare against locals - { - E_String2NumMap *locals_map = e_ir_ctx->locals_map; - for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) - { - U64 local_num = n->num; - if(local_num != 0) - { - U64 local_idx = local_num-1; - RDI_Symbol *local = rdi_element_from_name_idx(rdi, LocalVariables, local_idx); - if(rdi_kind_from_location(local->location) == RDI_LocationKind_AddrBytecodeStream || - rdi_kind_from_location(local->location) == RDI_LocationKind_AddrRegPlusOff || - rdi_kind_from_location(local->location) == RDI_LocationKind_AddrAddrRegPlusOff) - { - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local->type_idx); - E_OpList local_ops = e_oplist_from_location(scratch.arena, rdi, local->location); - String8 local_bytecode = e_bytecode_from_oplist(scratch.arena, &local_ops); - E_Interpretation local_addr_interpret = e_interpret(local_bytecode); - U64 local_vaddr = local_addr_interpret.value.u64; - Rng1U64 local_vaddr_range = r1u64(local_vaddr, local_vaddr+type_node->byte_size); - if(contains_1u64(local_vaddr_range, affected_vaddr)) - { - String8 local_name = str8_from_rdi_string_idx(rdi, local->name_string_idx); - U64 hash = u64_hash_from_str8(local_name); - U64 slot_idx = hash%seen_expr_slots_count; - B32 already_seen = 0; - for(String8Node *n = seen_expr_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->string, local_name, 0)) - { - already_seen = 1; - break; - } - } - if(!already_seen) - { - str8_list_push(scratch.arena, &auto_exprs, local_name); - String8Node *n = push_array(scratch.arena, String8Node, 1); - SLLStackPush(seen_expr_slots[slot_idx], n); - n->string = local_name; - } - } - } - } - } - } - - // rjf: compare against global variables - { - D_Entity *affected_module = d_module_from_process_vaddr(process, affected_vaddr); - U64 affected_voff = d_voff_from_vaddr(affected_module, affected_vaddr); - DI_Key affected_dbgi_key = d_dbgi_key_from_module(affected_module); - RDI_Parsed *affected_rdi = di_rdi_from_key(access, affected_dbgi_key, 0, 0); - RDI_Symbol *affected_gvar = rdi_global_variable_from_voff(affected_rdi, affected_voff); - if(affected_gvar->name_string_idx != 0) - { - String8 gvar_name = fully_qualified_str8_from_rdi_symbol(arena, affected_rdi, affected_gvar); - U64 hash = u64_hash_from_str8(gvar_name); - U64 slot_idx = hash%seen_expr_slots_count; - B32 already_seen = 0; - for(String8Node *n = seen_expr_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->string, gvar_name, 0)) - { - already_seen = 1; - break; - } - } - if(!already_seen) - { - str8_list_push(scratch.arena, &auto_exprs, gvar_name); - String8Node *n = push_array(scratch.arena, String8Node, 1); - SLLStackPush(seen_expr_slots[slot_idx], n); - n->string = gvar_name; - } - } - } - } - } - } - } - } - } - access_close(access); - } - - //- rjf: gather RD_AutosAccel *accel = push_array(arena, RD_AutosAccel, 1); - { - accel->exprs = str8_array_from_list(arena, &auto_exprs); - } + accel->exprs = rd_gather_auto_exprs(arena); irext.user_data = accel; - - scratch_end(scratch); } return irext; } diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index da8f2c83..cd268b24 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1266,30 +1266,31 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe B32 ctrlified = (wm_get_modifiers() & WM_Modifier_Ctrl); Vec4F32 code_line_bgs[] = { - ui_color_from_name(str8_lit("line_info_0")), - ui_color_from_name(str8_lit("line_info_1")), - ui_color_from_name(str8_lit("line_info_2")), - ui_color_from_name(str8_lit("line_info_3")), + ui_color_from_name(s("line_info_0")), + ui_color_from_name(s("line_info_1")), + ui_color_from_name(s("line_info_2")), + ui_color_from_name(s("line_info_3")), }; F32 line_num_padding_px = ui_top_font_size()*1.f; F32 entity_alive_t_rate = rd_state->entity_alive_animation_rate; F32 entity_hover_t_rate = rd_state->rich_hover_animation_rate; - B32 do_thread_lines = rd_setting_b32_from_name(str8_lit("thread_lines")); - B32 do_thread_glow = rd_setting_b32_from_name(str8_lit("thread_glow")); - B32 do_bp_lines = rd_setting_b32_from_name(str8_lit("breakpoint_lines")); - B32 do_bp_glow = rd_setting_b32_from_name(str8_lit("breakpoint_glow")); - B32 do_scope_lines = rd_setting_b32_from_name(str8_lit("cursor_scope_lines")); - B32 do_scope_end_annotations = rd_setting_b32_from_name(str8_lit("cursor_scope_end_annotations")); - B32 do_cursor_trail = rd_setting_b32_from_name(str8_lit("cursor_trail")); + B32 do_thread_lines = rd_setting_b32_from_name(s("thread_lines")); + B32 do_thread_glow = rd_setting_b32_from_name(s("thread_glow")); + B32 do_bp_lines = rd_setting_b32_from_name(s("breakpoint_lines")); + B32 do_bp_glow = rd_setting_b32_from_name(s("breakpoint_glow")); + B32 do_scope_lines = rd_setting_b32_from_name(s("cursor_scope_lines")); + B32 do_scope_end_annotations = rd_setting_b32_from_name(s("cursor_scope_end_annotations")); + B32 do_cursor_trail = rd_setting_b32_from_name(s("cursor_trail")); + B32 do_autos = rd_setting_b32_from_name(s("show_autos_in_src_and_disasm")); Vec4F32 pop_color = {0}; UI_TagF("pop") { - pop_color = ui_color_from_name(str8_lit("background")); + pop_color = ui_color_from_name(s("background")); } Vec4F32 highlight_color = {0}; UI_TagF("focus") { - highlight_color = ui_color_from_name(str8_lit("border")); + highlight_color = ui_color_from_name(s("border")); } ////////////////////////////// @@ -1325,8 +1326,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { CFG_Node *cfg = cfg_node_from_id(rd_state->drag_drop_regs->cfg); if(rd_state->drag_drop_regs_slot == RD_RegSlot_Cfg && - (str8_match(cfg->string, str8_lit("breakpoint"), 0) || - str8_match(cfg->string, str8_lit("watch_pin"), 0))) + (str8_match(cfg->string, s("breakpoint"), 0) || + str8_match(cfg->string, s("watch_pin"), 0))) { drop_can_hit_lines = 1; drop_cfg = cfg; @@ -1376,7 +1377,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { if(n->v == stopper_thread && (stop_event.cause == D_EventCause_InterruptedByTrap || stop_event.cause == D_EventCause_InterruptedByException)) { - line_bg_colors[line_idx] = ui_color_from_name(str8_lit("background")); + line_bg_colors[line_idx] = ui_color_from_name(s("background")); } } } @@ -1399,7 +1400,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe ui_set_next_pref_width(ui_px(params->priority_margin_width_px, 1)); ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); ui_set_next_child_layout_axis(Axis2_Y); - priority_margin_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit("priority_margin_container")); + priority_margin_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), s("priority_margin_container")); UI_Parent(priority_margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) { U64 line_idx = 0; @@ -1433,18 +1434,18 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { if(color.w == 0) { - color = ui_color_from_name(str8_lit("thread_1")); + color = ui_color_from_name(s("thread_1")); } if(unwind_count != 0) { - color = ui_color_from_name(str8_lit("thread_unwound")); + color = ui_color_from_name(s("thread_unwound")); } else if(thread == stopper_thread && (stop_event.cause == D_EventCause_InterruptedByHalt || stop_event.cause == D_EventCause_InterruptedByTrap || stop_event.cause == D_EventCause_InterruptedByException)) { - color = ui_color_from_name(str8_lit("thread_error")); + color = ui_color_from_name(s("thread_error")); } if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index()) { @@ -1552,7 +1553,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe ui_set_next_pref_width(ui_px(params->catchall_margin_width_px, 1)); ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); ui_set_next_child_layout_axis(Axis2_Y); - catchall_margin_container_box = ui_build_box_from_string(UI_BoxFlag_DrawSideRight|UI_BoxFlag_DrawSideLeft|UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit("catchall_margin_container")); + catchall_margin_container_box = ui_build_box_from_string(UI_BoxFlag_DrawSideRight|UI_BoxFlag_DrawSideLeft|UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), s("catchall_margin_container")); UI_Parent(catchall_margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) { U64 line_idx = 0; @@ -1589,18 +1590,18 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { if(color.w == 0) { - color = ui_color_from_name(str8_lit("thread_1")); + color = ui_color_from_name(s("thread_1")); } if(unwind_count != 0) { - color = ui_color_from_name(str8_lit("thread_unwound")); + color = ui_color_from_name(s("thread_unwound")); } else if(thread == stopper_thread && (stop_event.cause == D_EventCause_InterruptedByHalt || stop_event.cause == D_EventCause_InterruptedByTrap || stop_event.cause == D_EventCause_InterruptedByException)) { - color = ui_color_from_name(str8_lit("thread_error")); + color = ui_color_from_name(s("thread_error")); } if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index()) { @@ -1697,7 +1698,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe Vec4F32 bp_rgba = rd_color_from_cfg(bp); if(bp_rgba.w == 0) { - bp_rgba = ui_color_from_name(str8_lit("breakpoint")); + bp_rgba = ui_color_from_name(s("breakpoint")); } B32 bp_is_disabled = rd_disabled_from_cfg(bp); if(bp_is_disabled) @@ -1716,7 +1717,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe bp_draw->do_lines = do_bp_lines; bp_draw->do_glow = do_bp_glow; bp_draw->is_disabled = bp_is_disabled; - bp_draw->is_conditioned = (cfg_node_child_from_string(bp, str8_lit("condition"))->first->string.size != 0); + bp_draw->is_conditioned = (cfg_node_child_from_string(bp, s("condition"))->first->string.size != 0); if(params->line_vaddrs[line_idx] == 0) { D_LineList *lines = ¶ms->line_infos[line_idx]; @@ -1787,7 +1788,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe Vec4F32 color = rd_color_from_cfg(pin); if(color.w == 0) { - color = ui_color_from_name(str8_lit("code_default")); + color = ui_color_from_name(s("code_default")); } // rjf: build box for watch @@ -1918,7 +1919,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { ui_set_next_hover_cursor(ctrlified ? WM_Cursor_HandPoint : WM_Cursor_IBar); ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); - text_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit("text_container")); + text_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), s("text_container")); } ////////////////////////////// @@ -2055,7 +2056,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } rd_cmd(RD_CmdKind_FocusPanel); rd_cmd(RD_CmdKind_PushQuery, - .expr = txt_pt_match(*cursor, *mark) ? str8_lit("query:text_pt_commands") : str8_lit("query:text_range_commands"), + .expr = txt_pt_match(*cursor, *mark) ? s("query:text_pt_commands") : s("query:text_range_commands"), .do_implicit_root = 1, .do_lister = 1, .activate_with_single_click = 1, @@ -2227,20 +2228,20 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { String8 opener_line = str8_skip_chop_whitespace(txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.min.line)); String8 scope_title_string = opener_line; - if(str8_match(opener_line, str8_lit("{"), 0) || - str8_match(opener_line, str8_lit("["), 0) || - str8_match(opener_line, str8_lit("("), 0)) + if(str8_match(opener_line, s("{"), 0) || + str8_match(opener_line, s("["), 0) || + str8_match(opener_line, s("("), 0)) { scope_title_string = str8_skip_chop_whitespace(txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.min.line-1)); } - if(!str8_match(scope_title_string, str8_lit("{"), 0) && - !str8_match(scope_title_string, str8_lit("["), 0) && - !str8_match(scope_title_string, str8_lit("("), 0)) + if(!str8_match(scope_title_string, s("{"), 0) && + !str8_match(scope_title_string, s("["), 0) && + !str8_match(scope_title_string, s("("), 0)) { F32 t = ui_anim(ui_key_from_stringf(text_container_box->key, "###scope_end_annotation_%I64x_%I64x", scope_n->token_idx_range.min, scope_n->token_idx_range.max), 1.f, .rate = rd_state->catchall_animation_rate); String8 closer_line = txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.max.line); F32 closer_line_px = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, closer_line).x; - Vec4F32 color = ui_color_from_name(str8_lit("text")); + Vec4F32 color = ui_color_from_name(s("text")); color.w *= 0.5f*t; dr_text(params->font, params->font_size * 0.85f, 0, 0, ui_top_text_raster_flags(), v2f32(text_base_pos.x + closer_line_px + ui_top_font_size()*0.5f*t, @@ -2328,7 +2329,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, token_string, .color = token_color); // rjf: . -> mark next token as preceded by dot - preceded_by_dot = (token->kind == TXT_TokenKind_Symbol && str8_match(token_string, str8_lit("."), 0)); + preceded_by_dot = (token->kind == TXT_TokenKind_Symbol && str8_match(token_string, s("."), 0)); } } lines_fstrs[line_idx] = fstrs; @@ -2368,23 +2369,47 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } ////////////////////////////// - //- rjf: build watch pin annotations + //- rjf: build watch pin / auto annotations // UI_Focus(UI_FocusKind_Off) { + String8Array auto_exprs = {0}; + if(do_autos) + { + auto_exprs = rd_gather_auto_exprs(scratch.arena); + } U64 line_idx = 0; for(S64 line_num = params->line_num_range.min; line_num < params->line_num_range.max; line_num += 1, line_idx += 1) { + //- rjf: gather pins from autos CFG_NodePtrList immediate_pins = {0}; + if(do_autos) + { + D_EntityList line_ips = params->line_ips[line_idx]; + if(line_ips.count > 0 && d_handle_match(line_ips.first->v->handle, rd_regs()->thread)) + { + for EachIndex(idx, auto_exprs.count) + { + String8 auto_expr = auto_exprs.v[idx]; + CFG_Node *immediate_root = rd_immediate_cfg_from_keyf("auto_pin_%I64x_%S", ui_active_seed_key().u64[0], auto_expr); + CFG_Node *pin = cfg_node_child_from_string_or_alloc(rd_state->cfg, immediate_root, s("watch_pin")); + CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, pin, s("expression")); + cfg_node_new_replace(rd_state->cfg, expr, auto_expr); + cfg_node_ptr_list_push(scratch.arena, &immediate_pins, pin); + } + } + } + + //- rjf: gather pins from source String8 line_text = params->line_text[line_idx]; for(U64 off = 0, next_off = line_text.size; off < line_text.size; off = next_off) { // rjf: find next opener - String8 markup_opener = str8_lit("raddbg_pin("); + String8 markup_opener = s("raddbg_pin("); next_off = str8_find_needle(line_text, off, markup_opener, 0); next_off += markup_opener.size; @@ -2447,12 +2472,14 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(expr_string.size != 0) { CFG_Node *immediate_root = rd_immediate_cfg_from_keyf("markup_pin_%I64x_%I64x", line_num, off); - CFG_Node *pin = cfg_node_child_from_string_or_alloc(rd_state->cfg, immediate_root, str8_lit("watch_pin")); - CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, pin, str8_lit("expression")); + CFG_Node *pin = cfg_node_child_from_string_or_alloc(rd_state->cfg, immediate_root, s("watch_pin")); + CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, pin, s("expression")); cfg_node_new_replace(rd_state->cfg, expr, expr_string); cfg_node_ptr_list_push(scratch.arena, &immediate_pins, pin); } } + + //- rjf: build pin ui CFG_NodePtrList pin_lists[] = { params->line_pins[line_idx], @@ -2466,6 +2493,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe UI_FontSize(params->font_size) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) { + F32 pin_value_string_max_width_px = params->font_size * (80.f / pins.count); for(CFG_NodePtrNode *n = pins.first; n != 0; n = n->next) { CFG_Node *pin = n->v; @@ -2475,28 +2503,26 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(!e_type_key_match(e_type_key_zero(), eval.irtree.type_key)) { EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, .radix = 10}; - eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, params->font_size*60.f, eval); + eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, pin_value_string_max_width_px, eval); } ui_spacer(ui_em(1.5f, 1.f)); ui_set_next_pref_width(ui_children_sum(1)); UI_Key pin_box_key = ui_key_from_stringf(ui_key_zero(), "###pin_%p", pin); - UI_Box *pin_box = ui_build_box_from_key(UI_BoxFlag_AnimatePos| - UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawBorder, pin_box_key); - UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(10, 1)) + UI_Box *pin_box = ui_build_box_from_key(UI_BoxFlag_AnimatePos, pin_box_key); + F32 pin_t = ui_anim(pin_box_key, 1.f, .rate = rd_state->catchall_animation_rate); + UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(1, 1)) { Vec4F32 pin_color = rd_color_from_cfg(pin); if(pin_color.w == 0) { - pin_color = ui_color_from_name(str8_lit("text")); + pin_color = ui_color_from_name(s("text")); } - Vec4F32 default_code_color = ui_color_from_name(str8_lit("code_default")); - rd_code_label(0.8f, 1, default_code_color, pin_expr); - rd_code_label(0.6f, 1, default_code_color, eval_string); + Vec4F32 default_code_color = ui_color_from_name(s("code_default")); + rd_code_label(pin_t*0.6f, 0, default_code_color, pin_expr); + rd_code_label(pin_t*0.6f, 0, default_code_color, str8_lit("=")); + rd_code_label(pin_t*0.6f, 0, default_code_color, eval_string); } - UI_Signal pin_sig = ui_signal_from_box(pin_box); - if(ui_key_match(pin_box_key, ui_hot_key())) + if(ui_hovering(text_container_sig) && contains_2f32(pin_box->rect, ui_mouse())) { rd_set_hover_eval(v2f32(pin_box->rect.x0, pin_box->rect.y1-2.f), pin_expr); } @@ -2655,16 +2681,16 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { TxtRngColorPairNode *n = push_array(scratch.arena, TxtRngColorPairNode, 1); n->rng = txt_rng(*cursor, *mark); - n->color = ui_color_from_name(str8_lit("selection")); + n->color = ui_color_from_name(s("selection")); SLLQueuePush(first_txt_rng_color_pair, last_txt_rng_color_pair, n); } // rjf: push for ctrlified mouse expr - if(ctrlified && !txt_pt_match(result.mouse_expr_rng.max, result.mouse_expr_rng.min)) UI_Tag(str8_lit("pop")) + if(ctrlified && !txt_pt_match(result.mouse_expr_rng.max, result.mouse_expr_rng.min)) UI_Tag(s("pop")) { TxtRngColorPairNode *n = push_array(scratch.arena, TxtRngColorPairNode, 1); n->rng = result.mouse_expr_rng; - n->color = ui_color_from_name(str8_lit("background")); + n->color = ui_color_from_name(s("background")); n->color.w *= 0.2f; SLLQueuePush(first_txt_rng_color_pair, last_txt_rng_color_pair, n); } @@ -2831,7 +2857,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe ui_box_text_position(line_box).x+trail_off_span.max, line_box->rect.y1+params->font_size*0.125f, }; - Vec4F32 cursor_color = ui_color_from_name(str8_lit("cursor")); + Vec4F32 cursor_color = ui_color_from_name(s("cursor")); Vec4F32 trail_color = cursor_color; if(!is_focused) { @@ -3229,7 +3255,6 @@ rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, { RD_CodeColorSlot token_color_slot = rd_code_color_slot_from_txt_token_kind(token->kind); Vec4F32 token_color_rgba = rd_rgba_from_code_color_slot(token_color_slot); - token_color_rgba.w *= alpha; String8 token_string = str8_substr(string, token->range); if(str8_match(token_string, str8_lit("{"), 0)) { indirection_counter += 1; } if(str8_match(token_string, str8_lit("["), 0)) { indirection_counter += 1; } @@ -3238,6 +3263,7 @@ rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, { default: { + token_color_rgba.w *= alpha; DR_FStr fstr = { token_string, @@ -3265,6 +3291,7 @@ rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, F32 lookup_color_mix_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "%S_lookup", token_string), 1.f); token_color_rgba = mix_4f32(token_color_rgba, lookup_color, lookup_color_mix_t); } + token_color_rgba.w *= alpha; DR_FStr fstr = { token_string, @@ -3279,6 +3306,7 @@ rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, }break; case TXT_TokenKind_Numeric: { + token_color_rgba.w *= alpha; Vec4F32 token_color_rgba_alt = rd_rgba_from_code_color_slot(RD_CodeColorSlot_CodeNumericAltDigitGroup); token_color_rgba_alt.w *= alpha; F32 font_size = ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)); From c90cbb80aa01a6068b2a5eeaf45b6952ec0779d9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 14 May 2026 15:00:07 -0700 Subject: [PATCH 544/850] fix label rendering in cfg title fstr build --- src/raddbg/raddbg_main.c | 4 ++-- src/raddbg/raddbg_widgets.c | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index d1937282..652db922 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -7,8 +7,6 @@ // [ ] symbol server // [ ] core dump saving/loading // -// [ ] "autos" collection, which can be evaluated -// [ ] show "autos" inline in source code near thread? // [ ] memory_size(...) view for quickly evaluating memory sizes // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold // @@ -269,6 +267,8 @@ // [x] single-line viz for pointers w/ bad (unmapped) addresses // [x] option to prefer addresses first with string ptrs // [x] external window focusing bugs +// [x] "autos" collection, which can be evaluated +// [x] show "autos" inline in source code near thread? //////////////////////////////// //~ rjf: Build Options diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index cd268b24..ef103854 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -172,6 +172,14 @@ rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras) start_secondary(); } + //- rjf: push label + if(label_string.size != 0) + { + dr_fstrs_push_new(arena, &result, ¶ms, label_string, .font = rd_font_from_slot(RD_FontSlot_Code), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code)); + dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); + start_secondary(); + } + //- rjf: push collection name if(collection_name.size != 0) { From fddf353ea02ebc1b817faabebcb64a9892c9f4c9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 16 May 2026 18:26:23 -0700 Subject: [PATCH 545/850] minidump format types; open crash dump command, stub out opening path in control thread; expand d_handles to support machine id, entity id, *and* 'controller kind', which can be either a dump file or a demon - this properly separates the true process control abstraction (demon) from opening a regular dump file on any machine, which will let us trivially support any kind of dump file on any platform; also fix bad cfg tree state leak --- src/config/config_core.c | 4 +- src/dbg_engine/dbg_engine.mdesk | 3 + src/dbg_engine/dbg_engine_core.h | 26 +- src/dbg_engine/dbg_engine_ctrl.c | 341 ++++++++++++--------- src/dbg_engine/dbg_engine_ctrl.h | 4 +- src/dbg_engine/dbg_engine_user.c | 14 +- src/dbg_engine/dbg_engine_user.h | 1 + src/dbg_engine/generated/dbg_engine.meta.h | 1 + src/dbg_info/dbg_info.c | 2 +- src/minidump/minidump.c | 2 + src/minidump/minidump.h | 200 ++++++++++++ src/minidump/minidump_parse.c | 3 + src/minidump/minidump_parse.h | 28 ++ src/mule/mule_main.cpp | 6 +- src/raddbg/generated/raddbg.meta.c | 6 +- src/raddbg/generated/raddbg.meta.h | 3 +- src/raddbg/raddbg_core.c | 11 +- src/raddbg/raddbg_main.c | 4 + src/raddbg/raddbg_widgets.c | 2 +- 19 files changed, 496 insertions(+), 165 deletions(-) create mode 100644 src/minidump/minidump.c create mode 100644 src/minidump/minidump.h create mode 100644 src/minidump/minidump_parse.c create mode 100644 src/minidump/minidump_parse.h diff --git a/src/config/config_core.c b/src/config/config_core.c index 65ad565e..e58d5320 100644 --- a/src/config/config_core.c +++ b/src/config/config_core.c @@ -649,13 +649,13 @@ cfg_node_release(CFG_State *state, CFG_Node *node) for(CFG_NodePtrNode *n = nodes.first; n != 0; n = n->next) { CFG_Node *c = n->v; + U64 hash = u64_hash_from_str8(str8_struct(&c->id)); + U64 slot_idx = hash%state->ctx.id_slots_count; cfg_string_release(state, c->string); SLLStackPush(state->free, c); c->first = c->last = c->prev = c->parent = 0; c->id = 0; c->string = str8_zero(); - U64 hash = u64_hash_from_str8(str8_struct(&c->id)); - U64 slot_idx = hash%state->ctx.id_slots_count; for(CFG_NodePtrNode *n = state->ctx.id_slots[slot_idx].first; n != 0; n = n->next) { if(n->v == c) diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 24328506..1424bc48 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -50,6 +50,9 @@ D_CmdTable: // | | | | //- rjf: attaching {Attach 1 1 0 0 "query:unattached_processes" PID null Nil Null 0 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" "" } + + //- rjf: crash dump opening + {OpenCrashDump 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 0 0 0 0 1 1 Null "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } } @enum D_CmdKind: diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 68b68b92..95544f36 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -8,7 +8,13 @@ //~ rjf: ID Types typedef U64 D_MsgID; -typedef U64 D_MachineID; +typedef U32 D_MachineID; +typedef U32 D_ControllerKind; +enum +{ + D_ControllerKind_Demon, + D_ControllerKind_Dump, +}; #define D_MachineID_Local (1) @@ -19,7 +25,8 @@ typedef struct D_Handle D_Handle; struct D_Handle { D_MachineID machine_id; - DMN_Handle dmn_handle; + D_ControllerKind controller_kind; + U64 entity_id; }; typedef struct D_HandleNode D_HandleNode; @@ -227,6 +234,21 @@ struct D_EntityCtxLookupAccel U64 entity_kind_arrays_gens[D_EntityKind_COUNT]; }; +//////////////////////////////// +//~ rjf: Opened Dump Cache Types + +typedef struct D_DumpNode D_DumpNode; +struct D_DumpNode +{ + D_DumpNode *next; + D_DumpNode *prev; + D_Handle process; + File file; + FileProperties props; + FileMap map; + void *base; +}; + //////////////////////////////// //~ rjf: Tick Input Types diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index d5b75eb2..4ab8bc62 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -7,8 +7,8 @@ internal U64 d_hash_from_handle(D_Handle handle) { - U64 buf[] = {handle.machine_id, handle.dmn_handle.u64[0]}; - U64 hash = u64_hash_from_str8(str8((U8 *)buf, sizeof(buf))); + U64 buf[] = {handle.machine_id, handle.controller_kind, handle.entity_id}; + U64 hash = u64_hash_from_str8(str8_struct(&handle)); return hash; } @@ -93,6 +93,7 @@ d_string_from_msg_kind(D_MsgKind kind) default:{}break; case D_MsgKind_Launch: {result = str8_lit("Launch");}break; case D_MsgKind_Attach: {result = str8_lit("Attach");}break; + case D_MsgKind_OpenCrashDump: {result = str8_lit("OpenCrashDump");}break; case D_MsgKind_Kill: {result = str8_lit("Kill");}break; case D_MsgKind_KillAll: {result = str8_lit("KillAll");}break; case D_MsgKind_Detach: {result = str8_lit("Detach");}break; @@ -149,18 +150,10 @@ d_handle_zero(void) return handle; } -internal D_Handle -d_handle_make(D_MachineID machine_id, DMN_Handle dmn_handle) -{ - D_Handle handle = {machine_id, dmn_handle}; - return handle; -} - internal B32 d_handle_match(D_Handle a, D_Handle b) { - B32 result = (a.machine_id == b.machine_id && - dmn_handle_match(a.dmn_handle, b.dmn_handle)); + B32 result = MemoryMatchStruct(&a, &b); return result; } @@ -203,7 +196,7 @@ d_handle_array_from_list(Arena *arena, D_HandleList *src) internal String8 d_string_from_handle(Arena *arena, D_Handle handle) { - String8 result = push_str8f(arena, "$%I64x$%I64x", handle.machine_id, handle.dmn_handle.u64[0]); + String8 result = str8f(arena, "$%x$%x$%I64x", handle.machine_id, handle.controller_kind, handle.entity_id); return result; } @@ -215,19 +208,43 @@ d_handle_from_string(String8 string) Temp scratch = scratch_begin(0, 0); U8 split = '$'; String8List parts = str8_split(scratch.arena, string, &split, 1, 0); - if(parts.first && parts.first->next) + if(parts.first && parts.first->next && parts.first->next->next) { - D_MachineID machine_id = u64_from_str8(parts.first->string, 16); - DMN_Handle dmn_handle = {0}; - dmn_handle.u64[0] = u64_from_str8(parts.first->next->string, 16); + D_MachineID machine_id = (U32)u64_from_str8(parts.first->string, 16); + D_ControllerKind controller_kind = (U32)u64_from_str8(parts.first->next->string, 16); + U64 entity_id = u64_from_str8(parts.first->next->next->string, 16); handle.machine_id = machine_id; - handle.dmn_handle = dmn_handle; + handle.controller_kind = controller_kind; + handle.entity_id = entity_id; } scratch_end(scratch); } return handle; } +internal DMN_Handle +d_dmn_from_handle(D_Handle handle) +{ + DMN_Handle result = {0}; + if(handle.controller_kind == D_ControllerKind_Demon) + { + result.u64[0] = handle.entity_id; + } + return result; +} + +internal D_Handle +d_handle_from_dmn(D_MachineID machine_id, DMN_Handle handle) +{ + D_Handle result = {0}; + { + result.machine_id = machine_id; + result.controller_kind = D_ControllerKind_Demon; + result.entity_id = handle.u64[0]; + } + return result; +} + //////////////////////////////// //~ rjf: Trap Type Functions @@ -883,7 +900,7 @@ d_entity_ctx_rw_store_alloc(void) store->ctx.hash_slots_count = 1024; store->ctx.hash_slots = push_array(arena, D_EntityHashSlot, store->ctx.hash_slots_count); D_Entity *root = store->ctx.root = d_entity_alloc(store, &d_entity_nil, D_EntityKind_Root, Arch_Null, d_handle_zero(), 0); - D_Entity *local_machine = d_entity_alloc(store, root, D_EntityKind_Machine, Arch_CURRENT, d_handle_make(D_MachineID_Local, dmn_handle_zero()), 0); + D_Entity *local_machine = d_entity_alloc(store, root, D_EntityKind_Machine, Arch_CURRENT, d_handle_from_dmn(D_MachineID_Local, dmn_handle_zero()), 0); Temp scratch = scratch_begin(0, 0); String8 local_machine_name = push_str8f(scratch.arena, "This PC (%S)", get_system_info()->machine_name); d_entity_equip_string(store, local_machine, local_machine_name); @@ -1255,7 +1272,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: processes case D_EventKind_NewProc: { - D_Entity *machine = d_entity_from_handle(&store->ctx, d_handle_make(event->entity.machine_id, dmn_handle_zero())); + D_Entity *machine = d_entity_from_handle(&store->ctx, d_handle_from_dmn(event->entity.machine_id, dmn_handle_zero())); if(machine != &d_entity_nil) { D_Entity *process = d_entity_alloc(store, machine, D_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); @@ -1512,8 +1529,8 @@ d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) { U64 current_reg_gen = d_reg_gen(); B32 need_stale = 1; - if(node->reg_gen != current_reg_gen && - dmn_thread_read_reg_block(handle.dmn_handle, result)) + DMN_Handle handle_dmn = d_dmn_from_handle(handle); + if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(handle_dmn, result)) { if(node != 0) { @@ -1534,7 +1551,8 @@ d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) internal U64 d_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle) { - U64 result = dmn_tls_root_vaddr_from_thread(handle.dmn_handle); + DMN_Handle handle_dmn = d_dmn_from_handle(handle); + U64 result = dmn_tls_root_vaddr_from_thread(handle_dmn); return result; } @@ -1570,7 +1588,8 @@ internal B32 d_thread_write_reg_block(D_Handle thread, void *block) { // TODO(rjf): @callstacks immediately reflect this in the call stack cache - B32 good = dmn_thread_write_reg_block(thread.dmn_handle, block); + DMN_Handle handle_dmn = d_dmn_from_handle(thread); + B32 good = dmn_thread_write_reg_block(handle_dmn, block); if(good) { ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); @@ -3383,6 +3402,7 @@ d_ctrl_thread__entry_point(void *p) //- rjf: target operations case D_MsgKind_Launch: {d_ctrl_thread__launch (ctrl_ctx, msg);}break; case D_MsgKind_Attach: {d_ctrl_thread__attach (ctrl_ctx, msg);}break; + case D_MsgKind_OpenCrashDump: {d_ctrl_thread__open_crash_dump (ctrl_ctx, msg);}break; case D_MsgKind_Kill: {d_ctrl_thread__kill (ctrl_ctx, msg);}break; case D_MsgKind_KillAll: {d_ctrl_thread__kill_all (ctrl_ctx, msg);}break; case D_MsgKind_Detach: {d_ctrl_thread__detach (ctrl_ctx, msg);}break; @@ -3483,6 +3503,7 @@ d_ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *e D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; D_Entity *module_entity = d_entity_from_handle(entity_ctx, module); D_Entity *debug_info_path_entity = d_entity_child_from_kind(module_entity, D_EntityKind_DebugInfoPath); + DMN_Handle process_dmn = d_dmn_from_handle(process); DI_Key dbgi_key = d_dbgi_key_from_module(module_entity); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); U64 base_vaddr = module_entity->vaddr_range.min; @@ -3536,7 +3557,7 @@ d_ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *e for(U32 i = 0; i < voff_count; i += 1) { U64 vaddr = voffs[i] + base_vaddr; - DMN_Trap trap = {process.dmn_handle, vaddr, (U64)bp}; + DMN_Trap trap = {process_dmn, vaddr, (U64)bp}; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); } } @@ -3549,7 +3570,7 @@ d_ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *e E_Value value = e_value_from_string(expr); if(value.u64 != 0 || bp->flags != 0) { - DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; + DMN_Trap trap = {process_dmn, value.u64, (U64)bp}; trap.flags = d_dmn_trap_flags_from_breakpoint_flags(bp->flags); trap.size = bp->size; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); @@ -3563,6 +3584,7 @@ d_ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *e internal void d_ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope *eval_scope, D_Handle process, D_BreakpointList *user_bps, DMN_TrapChunkList *traps_out) { + DMN_Handle process_dmn = d_dmn_from_handle(process); for(D_BreakpointNode *n = user_bps->first; n != 0; n = n->next) { D_Breakpoint *bp = &n->v; @@ -3572,7 +3594,7 @@ d_ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, D_EvalScope * E_Value value = e_value_from_string(expr); if(value.u64 != 0 || bp->flags != 0) { - DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp}; + DMN_Trap trap = {process_dmn, value.u64, (U64)bp}; trap.flags = d_dmn_trap_flags_from_breakpoint_flags(bp->flags); trap.size = bp->size; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); @@ -3585,30 +3607,25 @@ internal void d_ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out) { D_Entity *process = bp->parent; + DMN_Handle process_dmn = d_dmn_from_handle(process->handle); DMN_Trap trap = { - .process = process->handle.dmn_handle, - .vaddr = bp->vaddr_range.min, - .id = ((U64)bp|bit64), - .flags = d_dmn_trap_flags_from_breakpoint_flags(bp->bp_flags), - .size = (U32)dim_1u64(bp->vaddr_range), + .process = process_dmn, + .vaddr = bp->vaddr_range.min, + .id = ((U64)bp|bit64), + .flags = d_dmn_trap_flags_from_breakpoint_flags(bp->bp_flags), + .size = (U32)dim_1u64(bp->vaddr_range), }; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); } //- rjf: module lifetime open/close work -internal -MACHINE_OP_MEM_READ(ctrl_dmn_mem_read) -{ - U64 read = dmn_process_read(((D_Handle *)ud)->dmn_handle, r1u64(addr, addr + buffer_size), buffer); - return read == buffer_size ? MachineOpResult_Ok : MachineOpResult_Fail; -} - internal void d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) { Temp scratch = scratch_begin(0,0); + DMN_Handle process_dmn = d_dmn_from_handle(process); //- rjf: set up per-module info Arena *arena = arena_alloc(); @@ -3632,9 +3649,9 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang EH_PtrCtx eh_ptr_ctx = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; //- read module's signature bytes - U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); - U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); - dmn_process_read(process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); + U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); + U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); + dmn_process_read(process_dmn, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); ////////////////////////////// //- parse PE module @@ -3650,7 +3667,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang PE_DosHeader dos_header = {0}; if(is_valid) { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min, &dos_header) || + if(!dmn_process_read_struct(process_dmn, vaddr_range.min, &dos_header) || dos_header.magic != PE_DOS_MAGIC) { is_valid = 0; @@ -3661,7 +3678,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang U32 pe_magic = 0; if(is_valid) { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || + if(!dmn_process_read_struct(process_dmn, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || pe_magic != PE_MAGIC) { is_valid = 0; @@ -3673,7 +3690,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang COFF_FileHeader file_header = {0}; if(is_valid) { - if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + file_header_off, &file_header)) + if(!dmn_process_read_struct(process_dmn, vaddr_range.min + file_header_off, &file_header)) { is_valid = 0; } @@ -3691,7 +3708,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang { // rjf: read magic number U16 opt_ext_magic = 0; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); + dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); // rjf: read info U32 reported_data_dir_offset = 0; @@ -3701,7 +3718,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang case PE_PE32_MAGIC: { PE_OptionalHeader32 pe_optional = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min, &pe_optional); entry_point = pe_optional.entry_point_va; reported_data_dir_offset = sizeof(pe_optional); reported_data_dir_count = pe_optional.data_dir_count; @@ -3709,7 +3726,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang case PE_PE32PLUS_MAGIC: { PE_OptionalHeader32Plus pe_optional = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min, &pe_optional); entry_point = pe_optional.entry_point_va; reported_data_dir_offset = sizeof(pe_optional); reported_data_dir_count = pe_optional.data_dir_count; @@ -3724,18 +3741,18 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) { PE_DataDirectory dir = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); + dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); pdatas = push_array(arena, PE_IntelPdata, pdatas_count); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); + dmn_process_read(process_dmn, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); } // rjf: extract sections U64 sec_array_off = opt_ext_off_range.max; U64 sec_count = file_header.section_count; COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); + dmn_process_read(process_dmn, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); // rjf: grab entry point vaddr entry_point_voff = entry_point; @@ -3745,7 +3762,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang { // rjf: read data dir PE_DataDirectory dir = {0}; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); + dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) @@ -3753,46 +3770,46 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang // rjf: read debug directory U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); PE_DebugDirectory dbg_data = {0}; - dmn_process_read_struct(process.dmn_handle, dir_addr, &dbg_data); + dmn_process_read_struct(process_dmn, dir_addr, &dbg_data); // rjf: extract external file info from codeview header if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) { U32 cv_magic = 0; - dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv_magic); + dmn_process_read_struct(process_dmn, vaddr_range.min + dbg_data.voff, &cv_magic); switch(cv_magic) { default:break; case PE_CODEVIEW_PDB20_MAGIC: { PE_CvHeaderPDB20 cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min+dbg_data.voff, &cv); + U64 read_size = dmn_process_read_struct(process_dmn, vaddr_range.min+dbg_data.voff, &cv); if(read_size == sizeof(cv)) { pdb_dbg_time = cv.time_stamp; pdb_dbg_age = cv.age; - pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + pdb_dbg_path = dmn_process_read_cstring(arena, process_dmn, vaddr_range.min + dbg_data.voff + sizeof(cv)); } }break; case PE_CODEVIEW_PDB70_MAGIC: { PE_CvHeaderPDB70 cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); + U64 read_size = dmn_process_read_struct(process_dmn, vaddr_range.min + dbg_data.voff, &cv); if(read_size == sizeof(cv)) { pdb_dbg_guid = cv.guid; pdb_dbg_age = cv.age; - pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + pdb_dbg_path = dmn_process_read_cstring(arena, process_dmn, vaddr_range.min + dbg_data.voff + sizeof(cv)); } }break; case PE_CODEVIEW_RDI_MAGIC: { PE_CvHeaderRDI cv; - U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv); + U64 read_size = dmn_process_read_struct(process_dmn, vaddr_range.min + dbg_data.voff, &cv); if(read_size == sizeof(cv)) { rdi_dbg_guid = cv.guid; - rdi_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv)); + rdi_dbg_path = dmn_process_read_cstring(arena, process_dmn, vaddr_range.min + dbg_data.voff + sizeof(cv)); } }break; } @@ -3828,15 +3845,15 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang } raddbg_data.size = dim_1u64(raddbg_section_voff_range); raddbg_data.str = push_array(arena, U8, raddbg_data.size); - dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + raddbg_section_voff_range.min, - vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); + dmn_process_read(process_dmn, r1u64(vaddr_range.min + raddbg_section_voff_range.min, + vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); } // rjf: if we have a "raddbg is attached" section, mark the first byte as 1, to signify attachment if(raddbg_is_attached_section_voff_range.max != raddbg_is_attached_section_voff_range.min) { U8 new_value = 1; - dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); + dmn_process_write_struct(process_dmn, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); } } } @@ -3850,7 +3867,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang U64 e_entry = 0; ELF_Type e_type = ELF_Type_None; { - U8 *elf_sig = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max)); + U8 *elf_sig = dmn_process_read_raw(scratch.arena, process_dmn, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max)); if(elf_sig == 0) { goto elf_exit; } switch(elf_sig[ELF_Identifier_Class]) { @@ -3862,7 +3879,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang }break; case ELF_Class_64: { - ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr))); + ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process_dmn, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr))); if(ehdr == 0) { goto elf_exit; } e_entry = ehdr->e_entry; e_type = ehdr->e_type; @@ -3879,7 +3896,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang Rng1U64 eh_frame_hdr_vrange = {0}; String8 eh_frame_hdr_data = {0}; { - void *phdrs_raw = dmn_process_read_raw(scratch.arena, process.dmn_handle, elf_phdr_vrange); + void *phdrs_raw = dmn_process_read_raw(scratch.arena, process_dmn, elf_phdr_vrange); if(phdrs_raw == 0) { goto elf_exit; } if(elf_phdr_entsize == sizeof(ELF_Phdr32)) @@ -3896,7 +3913,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang if(phdr->p_type == ELF_PType_GnuEHFrame) { eh_frame_hdr_vrange = r1u64(cfi_rebase + phdr->p_vaddr, cfi_rebase + phdr->p_vaddr + phdr->p_memsz); - eh_frame_hdr_data = dmn_process_read_block(arena, process.dmn_handle, eh_frame_hdr_vrange); + eh_frame_hdr_data = dmn_process_read_block(arena, process_dmn, eh_frame_hdr_vrange); is_unwind_eh = 1; break; } @@ -4019,6 +4036,8 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang internal void d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range) { + DMN_Handle process_dmn = d_dmn_from_handle(process); + ////////////////////////////// //- rjf: evict module image info from cache // @@ -4055,7 +4074,7 @@ d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_ran if(raddbg_attached_marker_voff != 0) { U8 new_value = 0; - dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_attached_marker_voff, &new_value); + dmn_process_write_struct(process_dmn, vaddr_range.min + raddbg_attached_marker_voff, &new_value); } } @@ -4140,7 +4159,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) { Access *access = access_open(); - D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, ev->process)); + D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, ev->process)); D_Entity *module = &d_entity_nil; for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { @@ -4230,10 +4249,10 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D U64 size_of_spoof = 0; if(do_spoof) ProfScope("prep spoof") { - D_Entity *spoof_process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, spoof->process)); + D_Entity *spoof_process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, spoof->process)); Arch arch = spoof_process->arch; size_of_spoof = bit_size_from_arch(arch)/8; - dmn_process_read(spoof_process->handle.dmn_handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); + dmn_process_read(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); } // rjf: set spoof @@ -4300,7 +4319,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D // simply been sent other debug events first if(spoof != 0) { - D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, spoof->thread)); + D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, spoof->thread)); Arch arch = thread->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); U64 arch_reg_block_size = arch_info->reg_block_size; @@ -4310,7 +4329,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D if(spoof_thread_rip == spoof->new_ip_value) { arch_reg_block_write_ip(arch_info, regs_block, spoof_old_ip_value); - d_thread_write_reg_block(d_handle_make(D_MachineID_Local, spoof->thread), regs_block); + d_thread_write_reg_block(d_handle_from_dmn(D_MachineID_Local, spoof->thread), regs_block); } } @@ -4324,7 +4343,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_NewProc; out_evt->msg_id = msg->msg_id; - out_evt->entity = d_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; out_evt->tls_model = d_dynamic_linker_type_from_dmn(event->tls_model); @@ -4336,8 +4355,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_NewThread; out_evt->msg_id = msg->msg_id; - out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = d_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); @@ -4347,8 +4366,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D }break; case DMN_EventKind_LoadModule: { - D_Handle process_handle = d_handle_make(D_MachineID_Local, event->process); - D_Handle module_handle = d_handle_make(D_MachineID_Local, event->module); + D_Handle process_handle = d_handle_from_dmn(D_MachineID_Local, event->process); + D_Handle module_handle = d_handle_from_dmn(D_MachineID_Local, event->module); D_Event *out_evt1 = d_event_list_push(scratch.arena, &evts); String8 module_path = path_normalized_from_string(scratch.arena, event->string); U64 exe_timestamp = properties_from_file_path(module_path).modified; @@ -4382,7 +4401,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_EndProc; out_evt->msg_id = msg->msg_id; - out_evt->entity = d_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->u64_code = event->code; d_ctrl_state->process_counter -= 1; }break; @@ -4391,14 +4410,14 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_EndThread; out_evt->msg_id = msg->msg_id; - out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->thread); out_evt->entity_id = event->code; }break; case DMN_EventKind_UnloadModule: ProfScope("unload module %.*s", str8_varg(event->string)) { D_Event *out_evt = d_event_list_push(scratch.arena, &evts); - D_Handle module_handle = d_handle_make(D_MachineID_Local, event->module); + D_Handle module_handle = d_handle_from_dmn(D_MachineID_Local, event->module); D_Entity *module_ent = d_entity_from_handle(entity_ctx, module_handle); D_Entity *process_ent = d_process_from_entity(module_ent); String8 module_path = event->string; @@ -4418,8 +4437,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_DebugString; out_evt->msg_id = msg->msg_id; - out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = d_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->string = str8_substr(event->string, r1u64(string_idx*d_ctrl_state->c2u_ring_max_string_size, (string_idx+1)*d_ctrl_state->c2u_ring_max_string_size)); } }break; @@ -4428,8 +4447,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_ThreadName; out_evt->msg_id = msg->msg_id; - out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = d_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->string = event->string; out_evt->entity_id = event->code; }break; @@ -4438,8 +4457,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_ThreadColor; out_evt->msg_id = msg->msg_id; - out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = d_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->entity_id = event->code; out_evt->rgba = event->user_data; }break; @@ -4447,7 +4466,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D { D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_SetVAddrRangeNote; - out_evt->parent = d_handle_make(D_MachineID_Local, event->process); + out_evt->parent = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->msg_id = msg->msg_id; out_evt->vaddr_rng = r1u64(event->address, event->address + event->size); out_evt->string = event->string; @@ -4456,8 +4475,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D { D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_SetBreakpoint; - out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = d_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); out_evt->bp_flags = d_breakpoint_flags_from_dmn_trap_flags(event->flags); }break; @@ -4466,8 +4485,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D // TODO(rjf): this needs to be reflected in the resolved trap list too!!!!!!!! D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_UnsetBreakpoint; - out_evt->entity = d_handle_make(D_MachineID_Local, event->thread); - out_evt->parent = d_handle_make(D_MachineID_Local, event->process); + out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->thread); + out_evt->parent = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); out_evt->bp_flags = d_breakpoint_flags_from_dmn_trap_flags(event->flags); }break; @@ -4528,7 +4547,8 @@ d_ctrl_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_inf default:{}break; case D_EntityKind_Process: { - U64 read_size = dmn_process_read(entity->handle.dmn_handle, range, out); + DMN_Handle handle_dmn = d_dmn_from_handle(entity->handle); + U64 read_size = dmn_process_read(handle_dmn, range, out); result = (read_size == dim_1u64(range)); }break; case D_EntityKind_Thread: @@ -4559,13 +4579,14 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti ProfBeginFunction(); D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; D_EvalScope *scope = push_array(arena, D_EvalScope, 1); + DMN_Handle thread_dmn = d_dmn_from_handle(thread->handle); scope->access = access_open(); ////////////////////////////// //- rjf: unpack thread // Arch arch = thread->arch; - U64 thread_rip_vaddr = dmn_rip_from_thread(thread->handle.dmn_handle); + U64 thread_rip_vaddr = dmn_rip_from_thread(thread_dmn); D_Entity *process = d_process_from_entity(thread); D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); U64 thread_rip_voff = d_voff_from_vaddr(module, thread_rip_vaddr); @@ -4936,12 +4957,39 @@ d_ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) ProfEnd(); } +internal void +d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) +{ + String8 path = msg->path; + File file = file_open(AccessFlag_Read, path); + FileProperties props = properties_from_file(file); + FileMap map = file_map_open(AccessFlag_Read, file); + void *base = file_map_view_open(map, AccessFlag_Read, r1u64(0, props.size)); + String8 data = str8(base, base ? props.size : 0); + { + //- rjf: try minidump parse -> construct events for entity creation + { + MDMP_Header header = {0}; + str8_deserial_read_struct(data, 0, &header); + if(header.magic == MDMP_MAGIC) + { + U64 directories_foff = header.stream_directory_foff; + U64 directories_count = header.number_of_streams; + // MDMP_Directory *directories = + } + } + } + file_map_view_close(map, base, r1u64(0, props.size)); + file_map_close(map); + file_close(file); +} + internal void d_ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - DMN_Handle process = msg->entity.dmn_handle; + DMN_Handle process = d_dmn_from_handle(msg->entity); U32 exit_code = msg->exit_code; //- rjf: send kill @@ -5029,7 +5077,7 @@ d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) for(Task *t = first_task, *next = 0; t != 0; t = next) { next = t->next; - B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, t->process->handle.dmn_handle, exit_code); + B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, d_dmn_from_handle(t->process->handle), exit_code); if(kill_worked) { DLLRemove(first_task, last_task, t); @@ -5045,7 +5093,7 @@ d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) default:{}break; case DMN_EventKind_CreateProcess: { - D_Entity *new_process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->process)); + D_Entity *new_process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->process)); Task *t = push_array(scratch.arena, Task, 1); t->process = new_process; DLLPushBack(first_task, last_task, t); @@ -5082,7 +5130,7 @@ d_ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - DMN_Handle process = msg->entity.dmn_handle; + DMN_Handle process = d_dmn_from_handle(msg->entity); //- rjf: detach B32 detach_worked = dmn_ctrl_detach(ctrl_ctx, process); @@ -5137,6 +5185,8 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; D_Handle target_thread = msg->entity; D_Handle target_process = msg->parent; + DMN_Handle target_thread_dmn = d_dmn_from_handle(target_thread); + DMN_Handle target_process_dmn = d_dmn_from_handle(target_process); D_Entity *target_process_entity = d_entity_from_handle(entity_ctx, target_process); U64 spoof_ip_vaddr = 911; log_infof("d_ctrl_thread__run:\n{\n"); @@ -5185,7 +5235,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // threads, because otherwise, their stack pointer may change, if single-stepping // causes e.g. entrance into a function via a call instruction. // - U64 sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle); + U64 sp_check_value = dmn_rsp_from_thread(target_thread_dmn); log_infof("sp_check_value := 0x%I64x\n", sp_check_value); ////////////////////////////// @@ -5216,7 +5266,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) for(D_Entity *thread = process->first; thread != &d_entity_nil; thread = thread->next) { if(thread->kind != D_EntityKind_Thread) { continue; } - U64 rip = dmn_rip_from_thread(thread->handle.dmn_handle); + U64 rip = dmn_rip_from_thread(d_dmn_from_handle(thread->handle)); // rjf: determine if thread is frozen B32 thread_is_frozen = thread->is_frozen; @@ -5229,7 +5279,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) B32 is_on_user_bp = 0; for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1) { - if(dmn_handle_match(trap_ptr->process, process->handle.dmn_handle) && trap_ptr->vaddr == rip) + if(dmn_handle_match(trap_ptr->process, d_dmn_from_handle(process->handle)) && trap_ptr->vaddr == rip) { is_on_user_bp = 1; } @@ -5244,12 +5294,12 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } } - if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle))) + if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(d_dmn_from_handle(thread->handle), target_thread_dmn))) { - dmn_handle_list_push(scratch.arena, &stuck_threads, thread->handle.dmn_handle); + dmn_handle_list_push(scratch.arena, &stuck_threads, d_dmn_from_handle(thread->handle)); } - if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle)) + if(is_on_user_bp && is_on_net_trap && dmn_handle_match(d_dmn_from_handle(thread->handle), target_thread_dmn)) { target_thread_is_on_user_bp_and_trap_net_trap = 1; } @@ -5337,7 +5387,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) node != 0; node = node->next) { - DMN_Trap trap = {target_process.dmn_handle, node->v.vaddr}; + DMN_Trap trap = {d_dmn_from_handle(target_process), node->v.vaddr}; dmn_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap); } @@ -5395,7 +5445,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) DMN_RunCtrls run_ctrls = {0}; if(run_loop_idx == 0) { - run_ctrls.priority_thread = target_thread.dmn_handle; + run_ctrls.priority_thread = target_thread_dmn; } run_ctrls.ignore_previous_exception = 1; run_ctrls.run_entity_count = frozen_threads.count; @@ -5405,7 +5455,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) U64 idx = 0; for(D_EntityNode *n = frozen_threads.first; n != 0; n = n->next) { - run_ctrls.run_entities[idx] = n->v->handle.dmn_handle; + run_ctrls.run_entities[idx] = d_dmn_from_handle(n->v->handle); idx += 1; } } @@ -5447,7 +5497,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_EvalScope *eval_scope = d_ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, &d_entity_nil); { DMN_TrapChunkList new_traps = {0}; - d_ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, d_handle_make(D_MachineID_Local, event->process), &msg->user_bps, &new_traps); + d_ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, d_handle_from_dmn(D_MachineID_Local, event->process), &msg->user_bps, &new_traps); log_infof("step_rule: create_process -> resolve traps\n"); log_infof("new_traps:\n{\n"); for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) @@ -5466,11 +5516,11 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) }break; case DMN_EventKind_LoadModule: { - D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->thread)); + D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->thread)); D_EvalScope *eval_scope = d_ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); { DMN_TrapChunkList new_traps = {0}; - d_ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, d_handle_make(D_MachineID_Local, event->process), d_handle_make(D_MachineID_Local, event->module), &msg->user_bps, &new_traps); + d_ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, d_handle_from_dmn(D_MachineID_Local, event->process), d_handle_from_dmn(D_MachineID_Local, event->module), &msg->user_bps, &new_traps); log_infof("step_rule: load_module -> resolve traps\n"); log_infof("new_traps:\n{\n"); for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next) @@ -5491,7 +5541,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { D_Entity *bp = &d_entity_nil; { - D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->process)); + D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->process)); for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { if(child->kind == D_EntityKind_Breakpoint && @@ -5523,7 +5573,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) Access *access = access_open(); //- rjf: unpack process/module info - D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->process)); + D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->process)); D_Entity *module = d_entity_child_from_kind(process, D_EntityKind_Module); U64 module_base_vaddr = module->vaddr_range.min; DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -5554,7 +5604,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(voff != 0) { entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + DMN_Trap trap = {d_dmn_from_handle(process->handle), module_base_vaddr + voff}; dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); } } @@ -5588,7 +5638,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(voff != 0) { entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + DMN_Trap trap = {d_dmn_from_handle(process->handle), module_base_vaddr + voff}; dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); } } @@ -5618,7 +5668,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(voff != 0) { entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + DMN_Trap trap = {d_dmn_from_handle(process->handle), module_base_vaddr + voff}; dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); } } @@ -5645,7 +5695,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) U64 voff = rdi_first_voff_from_procedure(rdi, procedure); if(voff != 0) { - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + DMN_Trap trap = {d_dmn_from_handle(process->handle), module_base_vaddr + voff}; dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); break; } @@ -5680,7 +5730,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(voff != 0) { entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + DMN_Trap trap = {d_dmn_from_handle(process->handle), module_base_vaddr + voff}; dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); } } @@ -5692,7 +5742,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) U64 voff = d_entry_point_voff_from_module(module->handle); if(voff != 0) { - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + DMN_Trap trap = {d_dmn_from_handle(process->handle), module_base_vaddr + voff}; dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); } } @@ -5725,7 +5775,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(voff != 0) { entries_found = 1; - DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff}; + DMN_Trap trap = {d_dmn_from_handle(process->handle), module_base_vaddr + voff}; dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap); } } @@ -5746,8 +5796,8 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) ////////////////////////// //- rjf: unpack info about thread attached to event // - D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->thread)); - D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_make(D_MachineID_Local, event->process)); + D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->thread)); + D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->process)); Arch arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); @@ -5770,8 +5820,8 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Exception) { if(spoof_mode && - dmn_handle_match(target_process.dmn_handle, event->process) && - dmn_handle_match(target_thread.dmn_handle, event->thread) && + dmn_handle_match(target_process_dmn, event->process) && + dmn_handle_match(target_thread_dmn, event->thread) && spoof.new_ip_value == event->address) { hit_spoof = 1; @@ -5837,7 +5887,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { if(dmn_handle_match(trap->process, event->process) && trap->vaddr == event->instruction_pointer && - (!dmn_handle_match(event->thread, target_thread.dmn_handle) || !target_thread_is_on_user_bp_and_trap_net_trap)) + (!dmn_handle_match(event->thread, d_dmn_from_handle(target_thread)) || !target_thread_is_on_user_bp_and_trap_net_trap)) { D_Breakpoint *user_bp = (D_Breakpoint *)trap->id; hit_user_bp = 1; @@ -5892,7 +5942,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // rjf: gather trap net hits ProfScope("gather trap net hits") { - if(!hit_user_bp && dmn_handle_match(event->process, target_process.dmn_handle)) + if(!hit_user_bp && dmn_handle_match(event->process, d_dmn_from_handle(target_process))) { for(D_TrapNode *node = msg->traps.first; node != 0; @@ -5974,7 +6024,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) B32 step_past_trap_net = 0; if(!hard_stop && use_stepping_logic && hit_trap_net_bp) { - if(!dmn_handle_match(event->thread, target_thread.dmn_handle)) + if(!dmn_handle_match(event->thread, d_dmn_from_handle(target_thread))) { step_past_trap_net = 1; use_stepping_logic = 0; @@ -5985,7 +6035,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) B32 use_trap_net_logic = 0; if(!hard_stop && use_stepping_logic && hit_trap_net_bp) { - if(dmn_handle_match(event->thread, target_thread.dmn_handle)) + if(dmn_handle_match(event->thread, d_dmn_from_handle(target_thread))) { use_trap_net_logic = 1; } @@ -5995,7 +6045,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) B32 stack_pointer_matches = 0; if(use_trap_net_logic) { - U64 sp = dmn_rsp_from_thread(target_thread.dmn_handle); + U64 sp = dmn_rsp_from_thread(d_dmn_from_handle(target_thread)); stack_pointer_matches = (sp == sp_check_value); } @@ -6006,20 +6056,20 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { if(hit_trap_flags & D_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF("trap_net__single_step_after_hit") { - U64 thread_pre_rip = dmn_rip_from_thread(target_thread.dmn_handle); + U64 thread_pre_rip = dmn_rip_from_thread(d_dmn_from_handle(target_thread)); U64 thread_post_rip = thread_pre_rip; for(B32 single_step_done = 0; single_step_done == 0;) { DMN_RunCtrls single_step_ctrls = {0}; single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &target_thread.dmn_handle; + single_step_ctrls.run_entities = &target_thread_dmn; single_step_ctrls.run_entity_count = 1; if(thread_post_rip == thread_pre_rip) { - single_step_ctrls.single_step_thread = target_thread.dmn_handle; + single_step_ctrls.single_step_thread = target_thread_dmn; } DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(target_thread.dmn_handle); + thread_post_rip = dmn_rip_from_thread(target_thread_dmn); switch(event->kind) { default:{}break; @@ -6036,7 +6086,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) }break; case DMN_EventKind_SingleStep: { - single_step_done = dmn_handle_match(event->thread, target_thread.dmn_handle); + single_step_done = dmn_handle_match(event->thread, target_thread_dmn); single_step_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; } @@ -6052,10 +6102,10 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { // rjf: setup spoof mode begin_spoof_mode = 1; - U64 spoof_sp = dmn_rsp_from_thread(target_thread.dmn_handle); + U64 spoof_sp = dmn_rsp_from_thread(target_thread_dmn); spoof_mode = 1; - spoof.process = target_process.dmn_handle; - spoof.thread = target_thread.dmn_handle; + spoof.process = target_process_dmn; + spoof.thread = target_thread_dmn; spoof.vaddr = spoof_sp; spoof.new_ip_value = spoof_ip_vaddr; log_infof("spoof:{process:[0x%I64x], thread:[0x%I64x], vaddr:0x%I64x, new_ip_value:0x%I64x}\n", spoof.process.u64[0], spoof.thread.u64[0], spoof.vaddr, spoof.new_ip_value); @@ -6071,7 +6121,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(stack_pointer_matches) LogInfoNamedBlockF("trap_net__save_sp") { save_stack_pointer = 1; - sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle); + sp_check_value = dmn_rsp_from_thread(target_thread_dmn); log_infof("sp_check_value = 0x%I64x\n", sp_check_value); } } @@ -6191,8 +6241,8 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_Event *event = d_event_list_push(scratch.arena, &evts); event->kind = D_EventKind_Stopped; event->cause = stop_cause; - event->entity = d_handle_make(D_MachineID_Local, stop_event->thread); - event->parent = d_handle_make(D_MachineID_Local, stop_event->process); + event->entity = d_handle_from_dmn(D_MachineID_Local, stop_event->thread); + event->parent = d_handle_from_dmn(D_MachineID_Local, stop_event->process); event->exception_code = stop_event->code; event->exception_kind = d_exception_kind_from_dmn(stop_event->exception_kind); event->vaddr_rng = r1u64(stop_event->address, stop_event->address); @@ -6228,7 +6278,7 @@ d_ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } //- rjf: single step - DMN_Handle thread = msg->entity.dmn_handle; + DMN_Handle thread = d_dmn_from_handle(msg->entity); B32 thread_is_valid = !dmn_handle_match(thread, dmn_handle_zero()); DMN_Event *stop_event = 0; D_EventCause stop_cause = D_EventCause_Null; @@ -6244,10 +6294,10 @@ d_ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) run_ctrls.run_entity_count = 1; if(thread_post_rip == thread_pre_rip) { - run_ctrls.single_step_thread = msg->entity.dmn_handle; + run_ctrls.single_step_thread = d_dmn_from_handle(msg->entity); } DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(msg->entity.dmn_handle); + thread_post_rip = dmn_rip_from_thread(d_dmn_from_handle(msg->entity)); switch(event->kind) { default:{}break; @@ -6274,8 +6324,8 @@ d_ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) event->cause = stop_cause; if(stop_event != 0) { - event->entity = d_handle_make(D_MachineID_Local, stop_event->thread); - event->parent = d_handle_make(D_MachineID_Local, stop_event->process); + event->entity = d_handle_from_dmn(D_MachineID_Local, stop_event->thread); + event->parent = d_handle_from_dmn(D_MachineID_Local, stop_event->process); event->exception_code = stop_event->code; event->exception_kind = d_exception_kind_from_dmn(stop_event->exception_kind); event->vaddr_rng = r1u64(stop_event->address, stop_event->address); @@ -6306,6 +6356,7 @@ d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g key_read_off += str8_deserial_read_struct(key, key_read_off, &vaddr_range); key_read_off += str8_deserial_read_struct(key, key_read_off, &zero_terminated); } + DMN_Handle process_dmn = d_dmn_from_handle(process); //- rjf: clamp vaddr range Rng1U64 vaddr_range_clamped = vaddr_range; @@ -6341,7 +6392,7 @@ d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g retry_count <= retry_limit; retry_count += 1) { - bytes_read = dmn_process_read(process.dmn_handle, vaddr_range_clamped_retry, range_base); + bytes_read = dmn_process_read(process_dmn, vaddr_range_clamped_retry, range_base); if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min) { U64 diff = (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2; @@ -6649,7 +6700,7 @@ internal B32 d_process_write(D_Handle process, Rng1U64 range, void *src) { ProfBeginFunction(); - B32 result = dmn_process_write(process.dmn_handle, range, src); + B32 result = dmn_process_write(d_dmn_from_handle(process), range, src); //- rjf: success -> bump generation if(result) diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 02b83e8a..8ce80aa6 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -362,13 +362,14 @@ internal D_BreakpointFlags d_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags //~ rjf: Handle Type Functions internal D_Handle d_handle_zero(void); -internal D_Handle d_handle_make(D_MachineID machine_id, DMN_Handle dmn_handle); internal B32 d_handle_match(D_Handle a, D_Handle b); internal void d_handle_list_push(Arena *arena, D_HandleList *list, D_Handle *pair); internal D_HandleList d_handle_list_copy(Arena *arena, D_HandleList *src); internal D_HandleArray d_handle_array_from_list(Arena *arena, D_HandleList *src); internal String8 d_string_from_handle(Arena *arena, D_Handle handle); internal D_Handle d_handle_from_string(String8 string); +internal DMN_Handle d_dmn_from_handle(D_Handle handle); +internal D_Handle d_handle_from_dmn(D_MachineID machine_id, DMN_Handle handle); //////////////////////////////// //~ rjf: Trap Type Functions @@ -566,6 +567,7 @@ internal void d_ctrl_thread__end_and_flush_log(void); //- rjf: msg kind implementations internal void d_ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); internal void d_ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); +internal void d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); internal void d_ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); internal void d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); internal void d_ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index cce39e00..dbcde890 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -2063,12 +2063,12 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_FreezeLocalMachine: { D_MachineID machine_id = D_MachineID_Local; - d_cmd(D_CmdKind_FreezeMachine, .entity = d_handle_make(machine_id, dmn_handle_zero())); + d_cmd(D_CmdKind_FreezeMachine, .entity = d_handle_from_dmn(machine_id, dmn_handle_zero())); }break; case D_CmdKind_ThawLocalMachine: { D_MachineID machine_id = D_MachineID_Local; - d_cmd(D_CmdKind_ThawMachine, .entity = d_handle_make(machine_id, dmn_handle_zero())); + d_cmd(D_CmdKind_ThawMachine, .entity = d_handle_from_dmn(machine_id, dmn_handle_zero())); }break; case D_CmdKind_FreezeEntity: case D_CmdKind_ThawEntity: @@ -2119,6 +2119,16 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P MemoryCopyArray(msg->exception_code_filters, exception_code_filters); } }break; + + //- rjf: opening crash dumps + case D_CmdKind_OpenCrashDump: + { + String8 file_path = params->file_path; + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = D_MsgKind_OpenCrashDump; + msg->path = str8_copy(scratch.arena, file_path); + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + }break; } // rjf: do run if needed diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index 306de1a2..eac970b6 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -159,6 +159,7 @@ typedef enum D_MsgKind D_MsgKind_Null, D_MsgKind_Launch, D_MsgKind_Attach, + D_MsgKind_OpenCrashDump, D_MsgKind_Kill, D_MsgKind_KillAll, D_MsgKind_Detach, diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index 93d86b91..859bab04 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -41,6 +41,7 @@ D_CmdKind_ThawEntity, D_CmdKind_SetEntityColor, D_CmdKind_SetEntityName, D_CmdKind_Attach, +D_CmdKind_OpenCrashDump, D_CmdKind_COUNT, } D_CmdKind; diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 5cbbf1b6..78fdcb29 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1306,7 +1306,7 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * } lane_sync(); - //- rjf: sort records + //- rjf: sort records if we have a query if(!cancelled) ProfScope("sort records") { //- rjf: set up common data diff --git a/src/minidump/minidump.c b/src/minidump/minidump.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/minidump/minidump.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/minidump/minidump.h b/src/minidump/minidump.h new file mode 100644 index 00000000..c609e468 --- /dev/null +++ b/src/minidump/minidump.h @@ -0,0 +1,200 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef MINIDUMP_H +#define MINIDUMP_H + +typedef enum MDMP_DumpKind +{ + MDMP_DumpKind_Normal = 0x00000000, + MDMP_DumpKind_WithDataSegs = 0x00000001, + MDMP_DumpKind_WithFullMemory = 0x00000002, + MDMP_DumpKind_WithHandleData = 0x00000004, + MDMP_DumpKind_FilterMemory = 0x00000008, + MDMP_DumpKind_ScanMemory = 0x00000010, + MDMP_DumpKind_WithUnloadedModules = 0x00000020, + MDMP_DumpKind_WithIndirectlyReferencedMemory = 0x00000040, + MDMP_DumpKind_FilterModulePaths = 0x00000080, + MDMP_DumpKind_WithProcessThreadData = 0x00000100, + MDMP_DumpKind_WithPrivateReadWriteMemory = 0x00000200, + MDMP_DumpKind_WithoutOptionalData = 0x00000400, + MDMP_DumpKind_WithFullMemoryInfo = 0x00000800, + MDMP_DumpKind_WithThreadInfo = 0x00001000, + MDMP_DumpKind_WithCodeSegs = 0x00002000, + MDMP_DumpKind_WithoutAuxiliaryState = 0x00004000, + MDMP_DumpKind_WithFullAuxiliaryState = 0x00008000, + MDMP_DumpKind_WithPrivateWriteCopyMemory = 0x00010000, + MDMP_DumpKind_IgnoreInaccessibleMemory = 0x00020000, + MDMP_DumpKind_WithTokenInformation = 0x00040000, + MDMP_DumpKind_WithModuleHeaders = 0x00080000, + MDMP_DumpKind_FilterTriage = 0x00100000, + MDMP_DumpKind_WithAvxXStateContext = 0x00200000, + MDMP_DumpKind_WithIptTrace = 0x00400000, + MDMP_DumpKind_ScanInaccessiblePartialPages = 0x00800000, + MDMP_DumpKind_FilterWriteCombinedMemory, + MDMP_DumpKind_ValidTypeFlags = 0x01ffffff, + MDMP_DumpKind_NoIgnoreInaccessibleMemory, + MDMP_DumpKind_ValidTypeFlagsEx +} +MDMP_DumpKind; + +typedef enum MDMP_StreamKind +{ + MDMP_StreamKind_Unused = 0, + MDMP_StreamKind_Reserved0 = 1, + MDMP_StreamKind_Reserved1 = 2, + MDMP_StreamKind_ThreadList = 3, + MDMP_StreamKind_ModuleList = 4, + MDMP_StreamKind_MemoryList = 5, + MDMP_StreamKind_Exception = 6, + MDMP_StreamKind_SystemInfo = 7, + MDMP_StreamKind_ThreadExList = 8, + MDMP_StreamKind_Memory64List = 9, + MDMP_StreamKind_CommentA = 10, + MDMP_StreamKind_CommentW = 11, + MDMP_StreamKind_HandleData = 12, + MDMP_StreamKind_FunctionTable = 13, + MDMP_StreamKind_UnloadedModuleList = 14, + MDMP_StreamKind_MiscInfo = 15, + MDMP_StreamKind_MemoryInfoList = 16, + MDMP_StreamKind_ThreadInfoList = 17, + MDMP_StreamKind_HandleOperationList = 18, + MDMP_StreamKind_Token = 19, + MDMP_StreamKind_JavaScriptData = 20, + MDMP_StreamKind_SystemMemoryInfo = 21, + MDMP_StreamKind_ProcessVmCounters = 22, + MDMP_StreamKind_IptTrace = 23, + MDMP_StreamKind_ThreadNames = 24, + MDMP_StreamKind_ceNull = 0x8000, + MDMP_StreamKind_ceSystemInfo = 0x8001, + MDMP_StreamKind_ceException = 0x8002, + MDMP_StreamKind_ceModuleList = 0x8003, + MDMP_StreamKind_ceProcessList = 0x8004, + MDMP_StreamKind_ceThreadList = 0x8005, + MDMP_StreamKind_ceThreadContextList = 0x8006, + MDMP_StreamKind_ceThreadCallStackList = 0x8007, + MDMP_StreamKind_ceMemoryVirtualList = 0x8008, + MDMP_StreamKind_ceMemoryPhysicalList = 0x8009, + MDMP_StreamKind_ceBucketParameters = 0x800A, + MDMP_StreamKind_ceProcessModuleMap = 0x800B, + MDMP_StreamKind_ceDiagnosisList = 0x800C, + MDMP_StreamKind_LastReserved = 0xffff +} +MDMP_StreamKind; + +#define MDMP_MAGIC 0x504d444d + +typedef struct MDMP_Header MDMP_Header; +struct MDMP_Header +{ + U32 magic; + U32 version; + U32 number_of_streams; + U32 stream_directory_foff; + U32 checksum; + U32 reserved_or_time_date_stamp; + U64 flags; // MDMP_DumpKind +}; + +typedef struct MDMP_LocationDescriptor32 MDMP_LocationDescriptor32; +struct MDMP_LocationDescriptor32 +{ + U32 data_size; + U32 voff; +}; + +typedef struct MDMP_LocationDescriptor64 MDMP_LocationDescriptor64; +struct MDMP_LocationDescriptor64 +{ + U64 data_size; + U64 voff; +}; + +typedef struct MDMP_Directory MDMP_Directory; +struct MDMP_Directory +{ + U32 stream_kind; + MDMP_LocationDescriptor32 location; +}; + +typedef struct MDMP_MemoryDescriptor32 MDMP_MemoryDescriptor32; +struct MDMP_MemoryDescriptor32 +{ + U64 start_of_memory_range; + MDMP_LocationDescriptor32 memory_location; +}; + +typedef struct MDMP_MemoryDescriptor64 MDMP_MemoryDescriptor64; +struct MDMP_MemoryDescriptor64 +{ + U64 start_of_memory_range; + U64 size; +}; + +typedef struct MDMP_Thread MDMP_Thread; +struct MDMP_Thread +{ + U32 id; + U32 suspend_count; + U32 priority_class; + U32 priority; + U64 teb; + MDMP_MemoryDescriptor32 stack; + MDMP_LocationDescriptor32 thread_context; +}; + +typedef struct MDMP_FixedFileInfo MDMP_FixedFileInfo; +struct MDMP_FixedFileInfo +{ + U32 signature; + U32 struct_version; + U32 file_version_ms; + U32 file_version_ls; + U32 product_version_ms; + U32 product_version_ls; + U32 file_flags_mask; + U32 file_flags; + U32 file_os; + U32 file_type; + U32 file_subtype; + U32 file_date_ms; + U32 file_date_ls; +}; + +typedef struct MDMP_Module MDMP_Module; +struct MDMP_Module +{ + U64 image_base_vaddr; + U32 image_size; + U32 checksum; + U32 time_date_stamp; + U32 module_name_voff; + MDMP_FixedFileInfo version_info; + MDMP_LocationDescriptor32 cv_record; + MDMP_LocationDescriptor32 misc_record; + U64 reserved_0; + U64 reserved_1; +}; + +typedef struct MDMP_Exception MDMP_Exception; +struct MDMP_Exception +{ + U32 exception_code; + U32 exception_flags; + U64 exception_record; + U64 exception_addr; + U32 number_parameters; + U32 unused_alignment; + U64 exception_information[15]; +}; + +typedef struct MDMP_ExceptionStream MDMP_ExceptionStream; +struct MDMP_ExceptionStream +{ + U32 thread_id; + U32 padding; + MDMP_Exception exception; + MDMP_LocationDescriptor32 thread_context; +}; + +#endif // MINIDUMP_H diff --git a/src/minidump/minidump_parse.c b/src/minidump/minidump_parse.c new file mode 100644 index 00000000..654f300c --- /dev/null +++ b/src/minidump/minidump_parse.c @@ -0,0 +1,3 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + diff --git a/src/minidump/minidump_parse.h b/src/minidump/minidump_parse.h new file mode 100644 index 00000000..8b9d4225 --- /dev/null +++ b/src/minidump/minidump_parse.h @@ -0,0 +1,28 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef MINIDUMP_PARSE_H +#define MINIDUMP_PARSE_H + +typedef struct MDMP_ThreadArray MDMP_ThreadArray; +struct MDMP_ThreadArray +{ + MDMP_Thread *v; + U64 count; +}; + +typedef struct MDMP_ModuleArray MDMP_ModuleArray; +struct MDMP_ModuleArray +{ + MDMP_Module *v; + U64 count; +}; + +typedef struct MDMP_MemoryArray MDMP_MemoryArray; +struct MDMP_MemoryArray +{ + MDMP_MemoryDescriptor64 *v; + U64 count; +}; + +#endif // MINIDUMP_PARSE_H diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index be842092..c32dc590 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -424,14 +424,14 @@ variadic_params(char *fmt, ...) static void type_coverage_eval_tests(void) { - Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; EvalTest(basics.a, -1); + Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; Basics_Stdint basics_stdint = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; uint32_t a = (1<<31); int32_t b = (1<<31); - uint32_t abcd = 0xaabbccdd; EvalTest(abcd, 0xaabbccdd); - int64_t abcd64 = (int64_t)abcd; EvalTest(abcd64, 0xaabbccdd); EvalTest(abcd64, abcd); + uint32_t abcd = 0xaabbccdd; + int64_t abcd64 = (int64_t)abcd; char string[] = "Hello World!"; char longer_text[] = diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 19b877bb..717d10fa 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[359] = +RD_VocabInfo rd_vocab_info_table[360] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -208,6 +208,7 @@ RD_VocabInfo rd_vocab_info_table[359] = {str8_lit_comp("set_entity_color"), str8_lit_comp(""), str8_lit_comp("Set Entity Color"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("set_entity_name"), str8_lit_comp(""), str8_lit_comp("Set Entity Name"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("attach"), str8_lit_comp(""), str8_lit_comp("Attach"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("open_crash_dump"), str8_lit_comp(""), str8_lit_comp("Open Crash Dump"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("exit"), str8_lit_comp(""), str8_lit_comp("Exit"), str8_lit_comp(""), RD_IconKind_X}, {str8_lit_comp("open_palette"), str8_lit_comp(""), str8_lit_comp("Open Palette"), str8_lit_comp(""), RD_IconKind_List}, {str8_lit_comp("run_command"), str8_lit_comp(""), str8_lit_comp("Run Command"), str8_lit_comp(""), RD_IconKind_Null}, @@ -574,7 +575,7 @@ Rng1U64 rd_reg_slot_range_table[49] = {OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[248] = +RD_CmdKindInfo rd_cmd_kind_info_table[249] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -609,6 +610,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[248] = { str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 6cff775b..0ee04afc 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -95,6 +95,7 @@ RD_CmdKind_ThawEntity, RD_CmdKind_SetEntityColor, RD_CmdKind_SetEntityName, RD_CmdKind_Attach, +RD_CmdKind_OpenCrashDump, RD_CmdKind_Exit, RD_CmdKind_OpenPalette, RD_CmdKind_RunCommand, @@ -602,7 +603,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[359]; +extern RD_VocabInfo rd_vocab_info_table[360]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 597295d6..422000bb 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -693,8 +693,9 @@ rd_ctrl_entity_from_eval_space(E_Space space) space.kind == RD_EvalSpaceKind_MetaUnattachedProcess) { D_Handle handle; - handle.machine_id = space.u64s[0]; - handle.dmn_handle.u64[0] = space.u64s[1]; + handle.machine_id = (U32)((space.u64s[0] & 0xffffffff00000000ull) >> 32); + handle.controller_kind = (U32)((space.u64s[0] & 0x00000000ffffffffull) >> 0); + handle.entity_id = space.u64s[1]; entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); } return entity; @@ -704,8 +705,8 @@ internal E_Space rd_eval_space_from_ctrl_entity(D_Entity *entity, E_SpaceKind kind) { E_Space space = e_space_make(kind); - space.u64s[0] = entity->handle.machine_id; - space.u64s[1] = entity->handle.dmn_handle.u64[0]; + space.u64s[0] = (((U64)entity->handle.machine_id) << 32) | (((U64)entity->handle.controller_kind) << 0); + space.u64s[1] = entity->handle.entity_id; return space; } @@ -5755,7 +5756,7 @@ rd_window_frame(void) ID(panel); ID(view); #undef ID -#define Handle(name) ui_labelf("%s: [0x%I64x, 0x%I64x]", #name, (regs->name).machine_id, (regs->name).dmn_handle.u64[0]) +#define Handle(name) ui_labelf("%s: [0x%x, 0x%x, 0x%I64x]", #name, (regs->name).machine_id, (regs->name).controller_kind, (regs->name).entity_id) Handle(machine); Handle(process); Handle(module); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 652db922..a965bd4c 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -298,6 +298,8 @@ #include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" +#include "minidump/minidump.h" +#include "minidump/minidump_parse.h" #include "mdesk/mdesk.h" #include "window_manager/window_manager_inc.h" #include "config/config_inc.h" @@ -351,6 +353,8 @@ #include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" +#include "minidump/minidump.c" +#include "minidump/minidump_parse.c" #include "mdesk/mdesk.c" #include "window_manager/window_manager_inc.c" #include "config/config_inc.c" diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index ef103854..96ada8e6 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2516,7 +2516,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe ui_spacer(ui_em(1.5f, 1.f)); ui_set_next_pref_width(ui_children_sum(1)); UI_Key pin_box_key = ui_key_from_stringf(ui_key_zero(), "###pin_%p", pin); - UI_Box *pin_box = ui_build_box_from_key(UI_BoxFlag_AnimatePos, pin_box_key); + UI_Box *pin_box = ui_build_box_from_key(0, pin_box_key); F32 pin_t = ui_anim(pin_box_key, 1.f, .rate = rd_state->catchall_animation_rate); UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(1, 1)) { From 6d6cd7033da63272f4b1ad1a358eac65b9d3e194 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 16 May 2026 20:53:46 -0700 Subject: [PATCH 546/850] minidumps: initial gather / events for process/modules/threads --- src/dbg_engine/dbg_engine_ctrl.c | 143 +++++++++++++++++++++++++++++-- src/dbg_engine/dbg_engine_ctrl.h | 3 +- src/minidump/minidump.h | 35 +++++++- 3 files changed, 172 insertions(+), 9 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 4ab8bc62..17a0a450 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -43,7 +43,7 @@ d_exception_kind_from_dmn(DMN_ExceptionKind kind) } internal D_TlsModel -d_dynamic_linker_type_from_dmn(DMN_TlsModel type) +d_tls_model_from_dmn(DMN_TlsModel type) { D_TlsModel result = D_TlsModel_Null; switch(type) @@ -245,6 +245,18 @@ d_handle_from_dmn(D_MachineID machine_id, DMN_Handle handle) return result; } +internal D_Handle +d_dump_handle_make(D_MachineID machine_id, U64 id) +{ + D_Handle result = {0}; + { + result.machine_id = machine_id; + result.controller_kind = D_ControllerKind_Dump; + result.entity_id = id; + } + return result; +} + //////////////////////////////// //~ rjf: Trap Type Functions @@ -4346,7 +4358,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; - out_evt->tls_model = d_dynamic_linker_type_from_dmn(event->tls_model); + out_evt->tls_model = d_tls_model_from_dmn(event->tls_model); out_evt->target_os = OperatingSystem_CURRENT; // TODO: operating system of the remote target machine d_ctrl_state->process_counter += 1; }break; @@ -4967,15 +4979,136 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) void *base = file_map_view_open(map, AccessFlag_Read, r1u64(0, props.size)); String8 data = str8(base, base ? props.size : 0); { + Temp scratch = scratch_begin(0, 0); + D_EventList evts = {0}; + //- rjf: try minidump parse -> construct events for entity creation { MDMP_Header header = {0}; str8_deserial_read_struct(data, 0, &header); if(header.magic == MDMP_MAGIC) { - U64 directories_foff = header.stream_directory_foff; - U64 directories_count = header.number_of_streams; - // MDMP_Directory *directories = + // rjf: extract directories + U64 directories_count = 0; + MDMP_Directory *directories = 0; + { + U64 directories_foff = header.stream_directory_foff; + if(directories_foff < data.size) + { + U64 max_directories_count = (data.size - directories_foff) / sizeof(MDMP_Directory); + directories_count = Min(header.number_of_streams, max_directories_count); + directories = (MDMP_Directory *)(data.str + directories_foff); + } + } + + // rjf: gather specific directories + MDMP_SystemInfo *system_info = 0; + MDMP_Thread *threads = 0; + U64 threads_count = 0; + MDMP_Module *modules = 0; + U64 modules_count = 0; + { + for EachIndex(idx, directories_count) + { + MDMP_Directory *dir = &directories[idx]; + switch(dir->stream_kind) + { + default:{}break; + case MDMP_StreamKind_SystemInfo: + if(data.str + dir->location.foff + dir->location.data_size < data.str + data.size) + { + system_info = (MDMP_SystemInfo *)(data.str + dir->location.foff); + }break; + case MDMP_StreamKind_ThreadList: + { + U32 threads_count_32 = 0; + U64 off = dir->location.foff; + off += str8_deserial_read_struct(data, off, &threads_count_32); + U64 threads_count_max = (data.size - off) / sizeof(MDMP_Thread); + threads = (MDMP_Thread *)(data.str + off); + threads_count = Min(threads_count_32, threads_count_max); + }break; + case MDMP_StreamKind_ModuleList: + { + U32 modules_count_32 = 0; + U64 off = dir->location.foff; + off += str8_deserial_read_struct(data, off, &modules_count_32); + U64 modules_count_max = (data.size - off) / sizeof(MDMP_Module); + modules = (MDMP_Module *)(data.str + off); + modules_count = Min(modules_count_32, modules_count_max); + }break; + } + } + } + + // rjf: system info -> arch + Arch arch = Arch_Null; + if(system_info != 0) switch(system_info->processor_architecture) + { + default:{}break; + case MDMP_Arch_x86:{arch = Arch_x86;}break; + case MDMP_Arch_x64:{arch = Arch_x64;}break; + } + + // rjf: process creation + U64 handle_id_gen = 1; + D_Handle process = d_dump_handle_make(D_MachineID_Local, handle_id_gen); + handle_id_gen += 1; + { + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_NewProc; + evt->msg_id = msg->msg_id; + evt->entity = process; + evt->arch = arch; + } + + // rjf: thread creation + for EachIndex(idx, threads_count) + { + MDMP_Thread *thread = &threads[idx]; + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_NewThread; + evt->msg_id = msg->msg_id; + evt->entity = d_dump_handle_make(D_MachineID_Local, handle_id_gen); + evt->parent = process; + evt->arch = arch; + evt->entity_id = thread->id; + // TODO(rjf): evt->stack_base = ; (use thread->stack) + // TODO(rjf): evt->tls_root = ; (use thread->thread_context) + handle_id_gen += 1; + } + + // rjf: module loads + for EachIndex(idx, modules_count) + { + MDMP_Module *module = &modules[idx]; + String8 module_name = {0}; + { + U64 module_name_off = module->module_name_foff; + U64 off = module_name_off; + U32 module_name_size = 0; + off += str8_deserial_read_struct(data, off, &module_name_size); + String8 module_name_raw_data = str8_prefix(str8_skip(data, off), module_name_size); + String16 module_name_16 = str16((U16 *)module_name_raw_data.str, module_name_raw_data.size / sizeof(U16)); + module_name = str8_from_16(scratch.arena, module_name_16); + } + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_NewModule; + evt->msg_id = msg->msg_id; + evt->entity = d_dump_handle_make(D_MachineID_Local, handle_id_gen); + evt->parent = process; + evt->arch = arch; + evt->vaddr_rng = r1u64(module->image_base_vaddr, module->image_base_vaddr + module->image_size); + evt->string = module_name; + // TODO(rjf): evt->stack_base = ; (use thread->stack) + // TODO(rjf): evt->tls_root = ; (use thread->thread_context) + handle_id_gen += 1; + } + + // rjf: push events + d_c2u_push_events(&evts); + + scratch_end(scratch); } } } diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 8ce80aa6..028384fe 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -351,7 +351,7 @@ thread_static D_EntityCtxLookupAccel *d_entity_ctx_lookup_accel = 0; internal U64 d_hash_from_handle(D_Handle handle); internal D_EventCause d_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); internal D_ExceptionKind d_exception_kind_from_dmn(DMN_ExceptionKind kind); -internal D_TlsModel d_dynamic_linker_type_from_dmn(DMN_TlsModel type); +internal D_TlsModel d_tls_model_from_dmn(DMN_TlsModel type); internal String8 d_string_from_event_kind(D_EventKind kind); internal String8 d_string_from_msg_kind(D_MsgKind kind); internal D_EntityKind d_entity_kind_from_string(String8 string); @@ -370,6 +370,7 @@ internal String8 d_string_from_handle(Arena *arena, D_Handle handle); internal D_Handle d_handle_from_string(String8 string); internal DMN_Handle d_dmn_from_handle(D_Handle handle); internal D_Handle d_handle_from_dmn(D_MachineID machine_id, DMN_Handle handle); +internal D_Handle d_dump_handle_make(D_MachineID machine_id, U64 id); //////////////////////////////// //~ rjf: Trap Type Functions diff --git a/src/minidump/minidump.h b/src/minidump/minidump.h index c609e468..db05a8dd 100644 --- a/src/minidump/minidump.h +++ b/src/minidump/minidump.h @@ -100,14 +100,14 @@ typedef struct MDMP_LocationDescriptor32 MDMP_LocationDescriptor32; struct MDMP_LocationDescriptor32 { U32 data_size; - U32 voff; + U32 foff; }; typedef struct MDMP_LocationDescriptor64 MDMP_LocationDescriptor64; struct MDMP_LocationDescriptor64 { U64 data_size; - U64 voff; + U64 foff; }; typedef struct MDMP_Directory MDMP_Directory; @@ -168,7 +168,7 @@ struct MDMP_Module U32 image_size; U32 checksum; U32 time_date_stamp; - U32 module_name_voff; + U32 module_name_foff; MDMP_FixedFileInfo version_info; MDMP_LocationDescriptor32 cv_record; MDMP_LocationDescriptor32 misc_record; @@ -197,4 +197,33 @@ struct MDMP_ExceptionStream MDMP_LocationDescriptor32 thread_context; }; +typedef U16 MDMP_Arch; +typedef enum MDMP_ArchEnum +{ + MDMP_Arch_x86 = 0, + MDMP_Arch_Arm = 5, + MDMP_Arch_IA64 = 6, + MDMP_Arch_x64 = 9, + MDMP_Arch_Unknown = 0xffff, +} +MDMP_ArchEnum; + +typedef struct MDMP_SystemInfo MDMP_SystemInfo; +struct MDMP_SystemInfo +{ + MDMP_Arch processor_architecture; + U16 processor_level; + U16 processor_revision; + U8 number_of_processors; + U8 product_type; + U32 major_version; + U32 minor_version; + U32 build_number; + U32 platform_id; + U32 csd_version_rva; + U16 suite_mask; + U16 padding; + // CPU_INFORMATION Cpu; (architecture dependent) +}; + #endif // MINIDUMP_H From 463a4f85657b218181cc9df0ac25451d3e02a00b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 17 May 2026 20:24:27 -0700 Subject: [PATCH 547/850] eliminate redundant focus tab automatic commands --- src/raddbg/raddbg_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 422000bb..3d979886 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10744,7 +10744,7 @@ rd_frame(void) } rd_view_state_from_cfg(tab); } - if(p->selected_tab == &cfg_nil_node) + if(p->selected_tab == &cfg_nil_node && first_unfiltered_tab != &cfg_nil_node) { rd_cmd(RD_CmdKind_FocusTab, .panel = p->cfg->id, .tab = first_unfiltered_tab->id); } From 4840b46b841ce9d3718e39767117d827abd8e2d2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 18 May 2026 14:51:17 -0700 Subject: [PATCH 548/850] dbg_engine: shift thread register reads / process memory reads -> abstraction layer, rather than directly calling into demon; cache crash dump info, like thread info & memory ranges; implement thread reg reads & memory reads for dumps by using this acceleration structure when we have a dump handle, instead of regular demon reads. --- src/arch/arch_inc.c | 1 + src/arch/arch_inc.h | 1 + src/arch/os/arch_os.c | 16 + src/arch/os/arch_os.h | 9 + src/dbg_engine/dbg_engine_core.c | 6 + src/dbg_engine/dbg_engine_core.h | 24 +- src/dbg_engine/dbg_engine_ctrl.c | 749 ++++++++++++++++++++++--------- src/dbg_engine/dbg_engine_ctrl.h | 97 +++- src/dbg_engine/dbg_engine_user.c | 47 +- src/demon/demon_core.c | 47 -- src/demon/demon_core.h | 6 +- src/eval/eval_ir.c | 2 +- src/minidump/minidump.h | 4 + src/raddbg/raddbg_core.c | 103 ++--- src/raddbg/raddbg_eval.c | 14 +- src/raddbg/raddbg_main.c | 2 + src/raddbg/raddbg_views.c | 24 +- src/raddbg/raddbg_widgets.c | 16 +- src/win32/demon/win32_demon.c | 2 +- src/win32/win32_inc.c | 6 + src/win32/win32_inc.h | 11 + src/win32/x64/win32_x64.c | 139 ++++++ src/win32/x64/win32_x64.h | 110 +++++ 23 files changed, 1035 insertions(+), 401 deletions(-) create mode 100644 src/arch/os/arch_os.c create mode 100644 src/arch/os/arch_os.h create mode 100644 src/win32/win32_inc.c create mode 100644 src/win32/win32_inc.h create mode 100644 src/win32/x64/win32_x64.c create mode 100644 src/win32/x64/win32_x64.h diff --git a/src/arch/arch_inc.c b/src/arch/arch_inc.c index e07d1b7c..eae4b158 100644 --- a/src/arch/arch_inc.c +++ b/src/arch/arch_inc.c @@ -2,6 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #include "arch/arch.c" +#include "arch/os/arch_os.c" #if defined(DWARF_H) # include "arch/dwarf/arch_dwarf.c" #endif diff --git a/src/arch/arch_inc.h b/src/arch/arch_inc.h index 0155cfc4..529c3893 100644 --- a/src/arch/arch_inc.h +++ b/src/arch/arch_inc.h @@ -5,6 +5,7 @@ #define ARCH_INC_H #include "arch/arch.h" +#include "arch/os/arch_os.h" #if defined(DWARF_H) # include "arch/dwarf/arch_dwarf.h" #endif diff --git a/src/arch/os/arch_os.c b/src/arch/os/arch_os.c new file mode 100644 index 00000000..2a3fe22f --- /dev/null +++ b/src/arch/os/arch_os.c @@ -0,0 +1,16 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal B32 +arch_os_write_reg_block_from_thread_ctx(Arch arch, OperatingSystem os, void *reg_block, void *thread_ctx) +{ + B32 result = 0; + if(0){} +#define Case(arch_, os_, impl) else if((arch) == arch_ && (os) == os_) do {result = impl(reg_block, thread_ctx);}while(0) +#if defined(X64_H) && defined(WIN32_X64_H) + Case(Arch_x64, OperatingSystem_Windows, w32_x64_write_reg_block_from_thread_ctx); +#endif +#undef Case + else{} + return result; +} diff --git a/src/arch/os/arch_os.h b/src/arch/os/arch_os.h new file mode 100644 index 00000000..6534eeff --- /dev/null +++ b/src/arch/os/arch_os.h @@ -0,0 +1,9 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef ARCH_OS_H +#define ARCH_OS_H + +internal B32 arch_os_write_reg_block_from_thread_ctx(Arch arch, OperatingSystem os, void *reg_block, void *thread_ctx); + +#endif // ARCH_OS_H diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 4606be04..1f487512 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -80,6 +80,9 @@ d_init(void) } d_ctrl_state->ctrl_thread_log = log_alloc(); d_ctrl_state->ctrl_thread = thread_launch(d_ctrl_thread__entry_point, 0); + d_ctrl_state->dump_cache.slots_count = 64; + d_ctrl_state->dump_cache.slots = push_array(arena, D_DumpSlot, d_ctrl_state->dump_cache.slots_count); + d_ctrl_state->dump_cache.stripes = stripe_array_alloc(arena); } //- rjf: set up user state @@ -111,4 +114,7 @@ d_init(void) // rjf: set up run state d_user_state->ctrl_last_run_arena = arena_alloc(); } + + //- rjf: select user state's entity context + d_select_entity_ctx(&d_user_state->ctrl_entity_store->ctx); } diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 95544f36..74c991da 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -10,11 +10,12 @@ typedef U64 D_MsgID; typedef U32 D_MachineID; typedef U32 D_ControllerKind; -enum +typedef enum D_ControllerKindEnum { D_ControllerKind_Demon, D_ControllerKind_Dump, -}; +} +D_ControllerKindEnum; #define D_MachineID_Local (1) @@ -234,21 +235,6 @@ struct D_EntityCtxLookupAccel U64 entity_kind_arrays_gens[D_EntityKind_COUNT]; }; -//////////////////////////////// -//~ rjf: Opened Dump Cache Types - -typedef struct D_DumpNode D_DumpNode; -struct D_DumpNode -{ - D_DumpNode *next; - D_DumpNode *prev; - D_Handle process; - File file; - FileProperties props; - FileMap map; - void *base; -}; - //////////////////////////////// //~ rjf: Tick Input Types @@ -325,8 +311,8 @@ struct D_TrapList typedef struct D_Spoof D_Spoof; struct D_Spoof { - DMN_Handle process; - DMN_Handle thread; + D_Handle process; + D_Handle thread; U64 vaddr; U64 new_ip_value; }; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 17a0a450..b3ec728e 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -696,6 +696,16 @@ d_event_from_serialized_string(Arena *arena, String8 string) //////////////////////////////// //~ rjf: Entity Type Functions +//- rjf: entity context selection + +internal D_EntityCtx * +d_select_entity_ctx(D_EntityCtx *ctx) +{ + D_EntityCtx *popped = d_entity_ctx; + d_entity_ctx = ctx; + return popped; +} + //- rjf: entity list data structures internal void @@ -708,12 +718,12 @@ d_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity) } internal D_EntityList -d_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList *list) +d_entity_list_from_handle_list(Arena *arena, D_HandleList *list) { D_EntityList result = {0}; for(D_HandleNode *n = list->first; n != 0; n = n->next) { - D_Entity *entity = d_entity_from_handle(ctx, n->v); + D_Entity *entity = d_entity_from_handle(n->v); d_entity_list_push(arena, &result, entity); } return result; @@ -738,14 +748,14 @@ d_entity_array_from_list(Arena *arena, D_EntityList *list) //- rjf: entity context (entity group read-only) functions internal D_Entity * -d_entity_from_handle(D_EntityCtx *ctx, D_Handle handle) +d_entity_from_handle(D_Handle handle) { D_Entity *entity = &d_entity_nil; if(!d_handle_match(handle, d_handle_zero())) { U64 hash = d_hash_from_handle(handle); - U64 slot_idx = hash%ctx->hash_slots_count; - D_EntityHashSlot *slot = &ctx->hash_slots[slot_idx]; + U64 slot_idx = hash%d_entity_ctx->hash_slots_count; + D_EntityHashSlot *slot = &d_entity_ctx->hash_slots[slot_idx]; D_EntityHashNode *node = 0; for(D_EntityHashNode *n = slot->first; n != 0; n = n->next) { @@ -832,10 +842,10 @@ d_dbgi_key_from_module(D_Entity *module) } internal D_Entity * -d_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityList *candidates) +d_module_from_thread_candidates(D_Entity *thread, D_EntityList *candidates) { D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - U64 thread_rip_vaddr = d_rip_from_thread(ctx, thread->handle); + U64 thread_rip_vaddr = d_rip_from_thread(thread->handle); D_Entity *src_module = d_module_from_process_vaddr(process, thread_rip_vaddr); D_Entity *module = &d_entity_nil; for(D_EntityNode *n = candidates->first; n != 0; n = n->next) @@ -1188,23 +1198,23 @@ d_thread_entity_ctx_lookup_accel(void) } internal D_EntityArray -d_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind) +d_entity_array_from_kind(D_EntityKind kind) { D_EntityCtxLookupAccel *accel = d_thread_entity_ctx_lookup_accel(); - if(accel->entity_kind_arrays_gens[kind] != ctx->entity_kind_alloc_gens[kind]) + if(accel->entity_kind_arrays_gens[kind] != d_entity_ctx->entity_kind_alloc_gens[kind]) { Temp scratch = scratch_begin(0, 0); D_EntityList entities = {0}; - for(D_Entity *e = ctx->root; + for(D_Entity *e = d_entity_ctx->root; e != &d_entity_nil; - e = d_entity_rec_depth_first_pre(e, ctx->root).next) + e = d_entity_rec_depth_first_pre(e, d_entity_ctx->root).next) { if(e->kind == kind) { d_entity_list_push(scratch.arena, &entities, e); } } - accel->entity_kind_arrays_gens[kind] = ctx->entity_kind_alloc_gens[kind]; + accel->entity_kind_arrays_gens[kind] = d_entity_ctx->entity_kind_alloc_gens[kind]; arena_clear(accel->entity_kind_arrays_arenas[kind]); accel->entity_kind_arrays[kind] = d_entity_array_from_list(accel->entity_kind_arrays_arenas[kind], &entities); scratch_end(scratch); @@ -1213,10 +1223,10 @@ d_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind) } internal D_EntityList -d_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key) +d_modules_from_dbgi_key(Arena *arena, DI_Key dbgi_key) { D_EntityList list = {0}; - D_EntityArray all_modules = d_entity_array_from_kind(ctx, D_EntityKind_Module); + D_EntityArray all_modules = d_entity_array_from_kind(D_EntityKind_Module); for EachIndex(idx, all_modules.count) { D_Entity *module = all_modules.v[idx]; @@ -1230,10 +1240,10 @@ d_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key) } internal D_Entity * -d_thread_from_id(D_EntityCtx *ctx, U64 id) +d_thread_from_id(U64 id) { D_Entity *thread = &d_entity_nil; - D_EntityArray threads = d_entity_array_from_kind(ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); for EachIndex(idx, threads.count) { if(threads.v[idx]->id == id) @@ -1273,6 +1283,8 @@ d_entity_rec_depth_first(D_Entity *entity, D_Entity *subtree_root, U64 sib_off, internal void d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) { + D_EntityCtx *ctx_restore = d_select_entity_ctx(&store->ctx); + //- rjf: scan events & construct entities for(D_EventNode *n = list->first; n != 0; n = n->next) { @@ -1284,7 +1296,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: processes case D_EventKind_NewProc: { - D_Entity *machine = d_entity_from_handle(&store->ctx, d_handle_from_dmn(event->entity.machine_id, dmn_handle_zero())); + D_Entity *machine = d_entity_from_handle(d_handle_from_dmn(event->entity.machine_id, dmn_handle_zero())); if(machine != &d_entity_nil) { D_Entity *process = d_entity_alloc(store, machine, D_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); @@ -1294,7 +1306,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) }break; case D_EventKind_EndProc: { - D_Entity *process = d_entity_from_handle(&store->ctx, event->entity); + D_Entity *process = d_entity_from_handle(event->entity); d_entity_release(store, process); for(D_Entity *entry = store->ctx.root->first, *next = &d_entity_nil; entry != &d_entity_nil; @@ -1311,7 +1323,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: threads case D_EventKind_NewThread: { - D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(event->parent); if(process != &d_entity_nil) { D_Entity *thread = d_entity_alloc(store, process, D_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id); @@ -1320,7 +1332,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) { d_entity_equip_string(store, thread, str8_lit("main_thread")); } - D_EntityArray pending_thread_names = d_entity_array_from_kind(&store->ctx, D_EntityKind_PendingThreadName); + D_EntityArray pending_thread_names = d_entity_array_from_kind(D_EntityKind_PendingThreadName); for EachIndex(idx, pending_thread_names.count) { D_Entity *entity = pending_thread_names.v[idx]; @@ -1331,7 +1343,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) break; } } - D_EntityArray pending_thread_colors = d_entity_array_from_kind(&store->ctx, D_EntityKind_PendingThreadColor); + D_EntityArray pending_thread_colors = d_entity_array_from_kind(D_EntityKind_PendingThreadColor); for EachIndex(idx, pending_thread_colors.count) { D_Entity *entity = pending_thread_colors.v[idx]; @@ -1348,20 +1360,20 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) }break; case D_EventKind_EndThread: { - D_Entity *thread = d_entity_from_handle(&store->ctx, event->entity); + D_Entity *thread = d_entity_from_handle(event->entity); d_entity_release(store, thread); }break; case D_EventKind_ThreadName: { - D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(event->parent); D_Entity *thread = &d_entity_nil; if(event->entity_id == 0) { - thread = d_entity_from_handle(&store->ctx, event->entity); + thread = d_entity_from_handle(event->entity); } else { - thread = d_thread_from_id(&store->ctx, event->entity_id); + thread = d_thread_from_id(event->entity_id); } if(thread != &d_entity_nil) { @@ -1375,15 +1387,15 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) }break; case D_EventKind_ThreadColor: { - D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(event->parent); D_Entity *thread = &d_entity_nil; if(event->entity_id == 0) { - thread = d_entity_from_handle(&store->ctx, event->entity); + thread = d_entity_from_handle(event->entity); } else { - thread = d_thread_from_id(&store->ctx, event->entity_id); + thread = d_thread_from_id(event->entity_id); } if(thread != &d_entity_nil) { @@ -1397,7 +1409,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) }break; case D_EventKind_ThreadFrozen: { - D_Entity *thread = d_entity_from_handle(&store->ctx, event->entity); + D_Entity *thread = d_entity_from_handle(event->entity); if(thread != &d_entity_nil) { thread->is_frozen = 1; @@ -1405,7 +1417,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) }break; case D_EventKind_ThreadThawed: { - D_Entity *thread = d_entity_from_handle(&store->ctx, event->entity); + D_Entity *thread = d_entity_from_handle(event->entity); if(thread != &d_entity_nil) { thread->is_frozen = 0; @@ -1416,7 +1428,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) case D_EventKind_NewModule: { Temp scratch = scratch_begin(0, 0); - D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(event->parent); D_Entity *module = d_entity_alloc(store, process, D_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min); d_entity_equip_string(store, module, event->string); module->timestamp = event->timestamp; @@ -1432,13 +1444,13 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) }break; case D_EventKind_EndModule: { - D_Entity *module = d_entity_from_handle(&store->ctx, event->entity); + D_Entity *module = d_entity_from_handle(event->entity); d_entity_release(store, module); }break; case D_EventKind_ModuleDebugInfoPathChange: { Temp scratch = scratch_begin(0, 0); - D_Entity *module = d_entity_from_handle(&store->ctx, event->entity); + D_Entity *module = d_entity_from_handle(event->entity); D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); if(debug_info_path == &d_entity_nil) { @@ -1452,14 +1464,14 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: dynamic, program-created breakpoints case D_EventKind_SetBreakpoint: { - D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(event->parent); D_Entity *bp = d_entity_alloc(store, process, D_EntityKind_Breakpoint, Arch_Null, d_handle_zero(), 0); bp->vaddr_range = event->vaddr_rng; bp->bp_flags = event->bp_flags; }break; case D_EventKind_UnsetBreakpoint: { - D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(event->parent); for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { if(child->kind == D_EntityKind_Breakpoint && @@ -1476,13 +1488,15 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) //- rjf: address range annotations case D_EventKind_SetVAddrRangeNote: { - D_Entity *process = d_entity_from_handle(&store->ctx, event->parent); + D_Entity *process = d_entity_from_handle(event->parent); D_Entity *annotation = d_entity_alloc(store, process, D_EntityKind_AddressRangeAnnotation, Arch_Null, d_handle_zero(), 0); annotation->vaddr_range = event->vaddr_rng; d_entity_equip_string(store, annotation, event->string); }break; } } + + d_select_entity_ctx(ctx_restore); } //////////////////////////////// @@ -1497,13 +1511,96 @@ d_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook) //////////////////////////////// //~ rjf: Thread Register Functions +//- rjf: thread handle read/write + +internal B32 +d_thread_read_reg_block(D_Handle handle, void *reg_block) +{ + B32 result = 0; + switch((D_ControllerKindEnum)handle.controller_kind) + { + case D_ControllerKind_Demon: + { + result = dmn_thread_read_reg_block(d_dmn_from_handle(handle), reg_block); + }break; + case D_ControllerKind_Dump: + { + D_Entity *thread = d_entity_from_handle(handle); + D_Entity *process = d_process_from_entity(thread); + D_DumpCache *cache = &d_ctrl_state->dump_cache; + U64 hash = d_hash_from_handle(process->handle); + U64 slot_idx = hash%cache->slots_count; + Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); + RWMutexScope(stripe->rw_mutex, 0) + { + // rjf: process -> dump node + D_DumpNode *node = 0; + for(D_DumpNode *n = cache->slots[slot_idx].first; n != 0; n = n->next) + { + if(d_handle_match(n->process, process->handle)) + { + node = n; + break; + } + } + + // rjf: thread -> context in dump + void *thread_ctx = 0; + if(node != 0) + { + for EachIndex(idx, node->threads_count) + { + if(d_handle_match(thread->handle, node->threads[idx].thread_handle)) + { + thread_ctx = (U8 *)node->base + node->threads[idx].context_foff; + } + } + } + + // rjf: read context structure into reg block + if(thread_ctx != 0) + { + Arch arch = thread->arch; + OperatingSystem os = process->target_os; + result = arch_os_write_reg_block_from_thread_ctx(arch, os, reg_block, thread_ctx); + } + } + }break; + } + return result; +} + +internal B32 +d_thread_write_reg_block(D_Handle thread, void *block) +{ + B32 result = 0; + switch((D_ControllerKindEnum)thread.controller_kind) + { + case D_ControllerKind_Demon: + { + // TODO(rjf): @callstacks immediately reflect this in the call stack cache + DMN_Handle handle_dmn = d_dmn_from_handle(thread); + B32 result = dmn_thread_write_reg_block(handle_dmn, block); + if(result) + { + ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); + } + }break; + case D_ControllerKind_Dump: + { + // TODO(rjf) + }break; + } + return result; +} + //- rjf: thread register cache reading internal void * -d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) +d_reg_block_from_thread(Arena *arena, D_Handle handle) { D_ThreadRegCache *cache = &d_ctrl_state->thread_reg_cache; - D_Entity *thread_entity = d_entity_from_handle(ctx, handle); + D_Entity *thread_entity = d_entity_from_handle(handle); Arch arch = thread_entity->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); U64 reg_block_size = arch_info->reg_block_size; @@ -1541,8 +1638,7 @@ d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) { U64 current_reg_gen = d_reg_gen(); B32 need_stale = 1; - DMN_Handle handle_dmn = d_dmn_from_handle(handle); - if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(handle_dmn, result)) + if(node->reg_gen != current_reg_gen && d_thread_read_reg_block(handle, result)) { if(node != 0) { @@ -1561,7 +1657,7 @@ d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle) } internal U64 -d_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle) +d_tls_root_vaddr_from_thread(D_Handle handle) { DMN_Handle handle_dmn = d_dmn_from_handle(handle); U64 result = dmn_tls_root_vaddr_from_thread(handle_dmn); @@ -1569,46 +1665,31 @@ d_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle) } internal U64 -d_rip_from_thread(D_EntityCtx *ctx, D_Handle handle) +d_rip_from_thread(D_Handle handle) { Temp scratch = scratch_begin(0, 0); - D_Entity *thread_entity = d_entity_from_handle(ctx, handle); + D_Entity *thread_entity = d_entity_from_handle(handle); Arch arch = thread_entity->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); - void *block = d_reg_block_from_thread(scratch.arena, ctx, handle); + void *block = d_reg_block_from_thread(scratch.arena, handle); U64 result = arch_ip_from_reg_block(arch_info, block); scratch_end(scratch); return result; } internal U64 -d_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle) +d_rsp_from_thread(D_Handle handle) { Temp scratch = scratch_begin(0, 0); - D_Entity *thread_entity = d_entity_from_handle(ctx, handle); + D_Entity *thread_entity = d_entity_from_handle(handle); Arch arch = thread_entity->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); - void *block = d_reg_block_from_thread(scratch.arena, ctx, handle); + void *block = d_reg_block_from_thread(scratch.arena, handle); U64 result = arch_sp_from_reg_block(arch_info, block); scratch_end(scratch); return result; } -//- rjf: thread register writing - -internal B32 -d_thread_write_reg_block(D_Handle thread, void *block) -{ - // TODO(rjf): @callstacks immediately reflect this in the call stack cache - DMN_Handle handle_dmn = d_dmn_from_handle(thread); - B32 good = dmn_thread_write_reg_block(handle_dmn, block); - if(good) - { - ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); - } - return good; -} - //////////////////////////////// //~ rjf: Module Image Info Functions @@ -2882,21 +2963,21 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul //- rjf: abstracted full unwind internal D_Unwind -d_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us) +d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); D_Unwind unwind = { .flags = D_UnwindFlag_Error }; //- rjf: unpack args - D_Entity *thread_entity = d_entity_from_handle(ctx, thread); + D_Entity *thread_entity = d_entity_from_handle(thread); D_Entity *process_entity = thread_entity->parent; Arch arch = thread_entity->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); U64 arch_reg_block_size = arch_info->reg_block_size; //- rjf: grab initial register block - void *regs_block = d_reg_block_from_thread(scratch.arena, ctx, thread); + void *regs_block = d_reg_block_from_thread(scratch.arena, thread); B32 regs_block_good = (arch != Arch_Null && regs_block != 0); //- rjf: loop & unwind @@ -3312,6 +3393,7 @@ d_ctrl_thread__entry_point(void *p) ProfBeginFunction(); DMN_CtrlCtx *ctrl_ctx = dmn_ctrl_begin(); log_select(d_ctrl_state->ctrl_thread_log); + d_select_entity_ctx(&d_ctrl_state->ctrl_thread_entity_store->ctx); //- rjf: loop Temp scratch = scratch_begin(0, 0); @@ -3435,7 +3517,7 @@ d_ctrl_thread__entry_point(void *p) { D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; String8 path = msg->path; - D_Entity *module = d_entity_from_handle(entity_ctx, msg->entity); + D_Entity *module = d_entity_from_handle(msg->entity); D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); di_close(old_dbgi_key, 0); @@ -3483,13 +3565,13 @@ d_ctrl_thread__entry_point(void *p) ProfScope("update thread register cache") { D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - D_EntityArray threads = d_entity_array_from_kind(entity_ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); X64_RegBlock *blocks = push_array(scratch.arena, X64_RegBlock, threads.count); { for EachIndex(idx, threads.count) { Temp scratch = scratch_begin(0, 0); - d_reg_block_from_thread(scratch.arena, entity_ctx, threads.v[idx]->handle); + d_reg_block_from_thread(scratch.arena, threads.v[idx]->handle); scratch_end(scratch); } } @@ -3512,8 +3594,7 @@ d_ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *e ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); Access *access = eval_scope->access; - D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - D_Entity *module_entity = d_entity_from_handle(entity_ctx, module); + D_Entity *module_entity = d_entity_from_handle(module); D_Entity *debug_info_path_entity = d_entity_child_from_kind(module_entity, D_EntityKind_DebugInfoPath); DMN_Handle process_dmn = d_dmn_from_handle(process); DI_Key dbgi_key = d_dbgi_key_from_module(module_entity); @@ -3637,7 +3718,6 @@ internal void d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) { Temp scratch = scratch_begin(0,0); - DMN_Handle process_dmn = d_dmn_from_handle(process); //- rjf: set up per-module info Arena *arena = arena_alloc(); @@ -3663,7 +3743,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang //- read module's signature bytes U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); - dmn_process_read(process_dmn, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); + d_process_read(process, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); ////////////////////////////// //- parse PE module @@ -3679,7 +3759,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang PE_DosHeader dos_header = {0}; if(is_valid) { - if(!dmn_process_read_struct(process_dmn, vaddr_range.min, &dos_header) || + if(!d_process_read_struct(process, vaddr_range.min, &dos_header) || dos_header.magic != PE_DOS_MAGIC) { is_valid = 0; @@ -3690,7 +3770,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang U32 pe_magic = 0; if(is_valid) { - if(!dmn_process_read_struct(process_dmn, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || + if(!d_process_read_struct(process, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || pe_magic != PE_MAGIC) { is_valid = 0; @@ -3702,7 +3782,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang COFF_FileHeader file_header = {0}; if(is_valid) { - if(!dmn_process_read_struct(process_dmn, vaddr_range.min + file_header_off, &file_header)) + if(!d_process_read_struct(process, vaddr_range.min + file_header_off, &file_header)) { is_valid = 0; } @@ -3720,7 +3800,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang { // rjf: read magic number U16 opt_ext_magic = 0; - dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); + d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); // rjf: read info U32 reported_data_dir_offset = 0; @@ -3730,7 +3810,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang case PE_PE32_MAGIC: { PE_OptionalHeader32 pe_optional = {0}; - dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &pe_optional); entry_point = pe_optional.entry_point_va; reported_data_dir_offset = sizeof(pe_optional); reported_data_dir_count = pe_optional.data_dir_count; @@ -3738,7 +3818,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang case PE_PE32PLUS_MAGIC: { PE_OptionalHeader32Plus pe_optional = {0}; - dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min, &pe_optional); + d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &pe_optional); entry_point = pe_optional.entry_point_va; reported_data_dir_offset = sizeof(pe_optional); reported_data_dir_count = pe_optional.data_dir_count; @@ -3753,18 +3833,18 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) { PE_DataDirectory dir = {0}; - dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); + d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); pdatas = push_array(arena, PE_IntelPdata, pdatas_count); - dmn_process_read(process_dmn, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); + d_process_read(process, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); } // rjf: extract sections U64 sec_array_off = opt_ext_off_range.max; U64 sec_count = file_header.section_count; COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); - dmn_process_read(process_dmn, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); + d_process_read(process, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); // rjf: grab entry point vaddr entry_point_voff = entry_point; @@ -3774,7 +3854,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang { // rjf: read data dir PE_DataDirectory dir = {0}; - dmn_process_read_struct(process_dmn, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); + d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) @@ -3782,46 +3862,49 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang // rjf: read debug directory U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); PE_DebugDirectory dbg_data = {0}; - dmn_process_read_struct(process_dmn, dir_addr, &dbg_data); + d_process_read_struct(process, dir_addr, &dbg_data); // rjf: extract external file info from codeview header if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) { U32 cv_magic = 0; - dmn_process_read_struct(process_dmn, vaddr_range.min + dbg_data.voff, &cv_magic); + d_process_read_struct(process, vaddr_range.min + dbg_data.voff, &cv_magic); switch(cv_magic) { default:break; case PE_CODEVIEW_PDB20_MAGIC: { PE_CvHeaderPDB20 cv; - U64 read_size = dmn_process_read_struct(process_dmn, vaddr_range.min+dbg_data.voff, &cv); + U64 read_size = d_process_read_struct(process, vaddr_range.min+dbg_data.voff, &cv); if(read_size == sizeof(cv)) { + U64 pdb_dbg_path_vaddr = vaddr_range.min + dbg_data.voff + sizeof(cv); pdb_dbg_time = cv.time_stamp; pdb_dbg_age = cv.age; - pdb_dbg_path = dmn_process_read_cstring(arena, process_dmn, vaddr_range.min + dbg_data.voff + sizeof(cv)); + pdb_dbg_path = d_data_from_process_vaddr_range(arena, process, r1u64(pdb_dbg_path_vaddr, pdb_dbg_path_vaddr+512), 1); } }break; case PE_CODEVIEW_PDB70_MAGIC: { PE_CvHeaderPDB70 cv; - U64 read_size = dmn_process_read_struct(process_dmn, vaddr_range.min + dbg_data.voff, &cv); + U64 read_size = d_process_read_struct(process, vaddr_range.min + dbg_data.voff, &cv); if(read_size == sizeof(cv)) { + U64 pdb_dbg_path_vaddr = vaddr_range.min + dbg_data.voff + sizeof(cv); pdb_dbg_guid = cv.guid; pdb_dbg_age = cv.age; - pdb_dbg_path = dmn_process_read_cstring(arena, process_dmn, vaddr_range.min + dbg_data.voff + sizeof(cv)); + pdb_dbg_path = d_data_from_process_vaddr_range(arena, process, r1u64(pdb_dbg_path_vaddr, pdb_dbg_path_vaddr+512), 1); } }break; case PE_CODEVIEW_RDI_MAGIC: { PE_CvHeaderRDI cv; - U64 read_size = dmn_process_read_struct(process_dmn, vaddr_range.min + dbg_data.voff, &cv); + U64 read_size = d_process_read_struct(process, vaddr_range.min + dbg_data.voff, &cv); if(read_size == sizeof(cv)) { + U64 rdi_dbg_path_vaddr = vaddr_range.min + dbg_data.voff + sizeof(cv); rdi_dbg_guid = cv.guid; - rdi_dbg_path = dmn_process_read_cstring(arena, process_dmn, vaddr_range.min + dbg_data.voff + sizeof(cv)); + rdi_dbg_path = d_data_from_process_vaddr_range(arena, process, r1u64(rdi_dbg_path_vaddr, rdi_dbg_path_vaddr+512), 1); } }break; } @@ -3857,15 +3940,15 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang } raddbg_data.size = dim_1u64(raddbg_section_voff_range); raddbg_data.str = push_array(arena, U8, raddbg_data.size); - dmn_process_read(process_dmn, r1u64(vaddr_range.min + raddbg_section_voff_range.min, - vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); + d_process_read(process, r1u64(vaddr_range.min + raddbg_section_voff_range.min, + vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); } // rjf: if we have a "raddbg is attached" section, mark the first byte as 1, to signify attachment if(raddbg_is_attached_section_voff_range.max != raddbg_is_attached_section_voff_range.min) { U8 new_value = 1; - dmn_process_write_struct(process_dmn, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); + d_process_write_struct(process, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); } } } @@ -3879,7 +3962,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang U64 e_entry = 0; ELF_Type e_type = ELF_Type_None; { - U8 *elf_sig = dmn_process_read_raw(scratch.arena, process_dmn, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max)); + U8 *elf_sig = d_data_from_process_vaddr_range(scratch.arena, process, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max), 0).str; if(elf_sig == 0) { goto elf_exit; } switch(elf_sig[ELF_Identifier_Class]) { @@ -3891,7 +3974,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang }break; case ELF_Class_64: { - ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process_dmn, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr))); + ELF_Hdr64 *ehdr = (ELF_Hdr64 *)d_data_from_process_vaddr_range(scratch.arena, process, r1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr)), 0).str; if(ehdr == 0) { goto elf_exit; } e_entry = ehdr->e_entry; e_type = ehdr->e_type; @@ -3908,7 +3991,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang Rng1U64 eh_frame_hdr_vrange = {0}; String8 eh_frame_hdr_data = {0}; { - void *phdrs_raw = dmn_process_read_raw(scratch.arena, process_dmn, elf_phdr_vrange); + void *phdrs_raw = d_data_from_process_vaddr_range(scratch.arena, process, elf_phdr_vrange, 0).str; if(phdrs_raw == 0) { goto elf_exit; } if(elf_phdr_entsize == sizeof(ELF_Phdr32)) @@ -3925,7 +4008,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang if(phdr->p_type == ELF_PType_GnuEHFrame) { eh_frame_hdr_vrange = r1u64(cfi_rebase + phdr->p_vaddr, cfi_rebase + phdr->p_vaddr + phdr->p_memsz); - eh_frame_hdr_data = dmn_process_read_block(arena, process_dmn, eh_frame_hdr_vrange); + eh_frame_hdr_data = d_data_from_process_vaddr_range(arena, process, eh_frame_hdr_vrange, 0); is_unwind_eh = 1; break; } @@ -3934,8 +4017,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang } // parse .eh_frame_hdr - D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - D_Entity *process_entity = d_entity_from_handle(entity_ctx, process); + D_Entity *process_entity = d_entity_from_handle(process); Arch arch = process_entity->arch; eh_ptr_ctx.pc_vaddr = eh_frame_hdr_vrange.min; eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min; @@ -4086,7 +4168,60 @@ d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_ran if(raddbg_attached_marker_voff != 0) { U8 new_value = 0; - dmn_process_write_struct(process_dmn, vaddr_range.min + raddbg_attached_marker_voff, &new_value); + d_process_write_struct(process, vaddr_range.min + raddbg_attached_marker_voff, &new_value); + } +} + +//- rjf: dump process closing work + +internal void +d_ctrl_thread__close_dump_process(D_MsgID msg_id, D_Handle process) +{ + // rjf: send debug event for process closing + { + Temp scratch = scratch_begin(0, 0); + D_EventList evts = {0}; + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_EndProc; + evt->msg_id = msg_id; + evt->entity = process; + d_c2u_push_events(&evts); + scratch_end(scratch); + } + + // rjf: bump counters + ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->run_gen); + + // rjf: eliminate dump node from cache + { + D_DumpCache *cache = &d_ctrl_state->dump_cache; + U64 hash = d_hash_from_handle(process); + U64 slot_idx = hash%cache->slots_count; + Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); + RWMutexScope(stripe->rw_mutex, 1) + { + D_DumpNode *node = 0; + for(D_DumpNode *n = cache->slots[slot_idx].first; n != 0; n = n->next) + { + if(d_handle_match(n->process, process)) + { + node = n; + break; + } + } + if(node != 0) + { + DLLRemove(cache->slots[slot_idx].first, cache->slots[slot_idx].last, node); + node->next = (D_DumpNode *)stripe->free; + stripe->free = node; + file_map_view_close(node->map, node->base, r1u64(0, node->props.size)); + file_map_close(node->map); + file_close(node->file); + arena_release(node->arena); + } + } } } @@ -4171,7 +4306,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value)) { Access *access = access_open(); - D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, ev->process)); + D_Handle process_handle = d_handle_from_dmn(D_MachineID_Local, ev->process); + D_Entity *process = d_entity_from_handle(process_handle); D_Entity *module = &d_entity_nil; for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { @@ -4205,7 +4341,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D U64 global_var_vaddr = global_var_voff + module->vaddr_range.min; Arch arch = process->arch; U64 addr_size = bit_size_from_arch(arch)/8; - dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); + d_process_read(process_handle, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0); } } @@ -4261,16 +4397,16 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D U64 size_of_spoof = 0; if(do_spoof) ProfScope("prep spoof") { - D_Entity *spoof_process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, spoof->process)); + D_Entity *spoof_process = d_entity_from_handle(spoof->process); Arch arch = spoof_process->arch; size_of_spoof = bit_size_from_arch(arch)/8; - dmn_process_read(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); + d_process_read(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); } // rjf: set spoof if(do_spoof) ProfScope("set spoof") { - dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); + d_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value); } // rjf: run for new events @@ -4321,7 +4457,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D // rjf: unset spoof if(do_spoof) ProfScope("unset spoof") { - dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); + d_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); } } } @@ -4331,17 +4467,17 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D // simply been sent other debug events first if(spoof != 0) { - D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, spoof->thread)); + D_Entity *thread = d_entity_from_handle(spoof->thread); Arch arch = thread->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); U64 arch_reg_block_size = arch_info->reg_block_size; void *regs_block = push_array(scratch.arena, U8, arch_reg_block_size); - dmn_thread_read_reg_block(spoof->thread, regs_block); + d_thread_read_reg_block(spoof->thread, regs_block); U64 spoof_thread_rip = arch_ip_from_reg_block(arch_info, regs_block); if(spoof_thread_rip == spoof->new_ip_value) { arch_reg_block_write_ip(arch_info, regs_block, spoof_old_ip_value); - d_thread_write_reg_block(d_handle_from_dmn(D_MachineID_Local, spoof->thread), regs_block); + d_thread_write_reg_block(spoof->thread, regs_block); } } @@ -4430,7 +4566,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D { D_Event *out_evt = d_event_list_push(scratch.arena, &evts); D_Handle module_handle = d_handle_from_dmn(D_MachineID_Local, event->module); - D_Entity *module_ent = d_entity_from_handle(entity_ctx, module_handle); + D_Entity *module_ent = d_entity_from_handle(module_handle); D_Entity *process_ent = d_process_from_entity(module_ent); String8 module_path = event->string; d_ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range); @@ -4559,17 +4695,15 @@ d_ctrl_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_inf default:{}break; case D_EntityKind_Process: { - DMN_Handle handle_dmn = d_dmn_from_handle(entity->handle); - U64 read_size = dmn_process_read(handle_dmn, range, out); + U64 read_size = d_process_read(entity->handle, range, out); result = (read_size == dim_1u64(range)); }break; case D_EntityKind_Thread: { Temp scratch = scratch_begin(0, 0); - D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; ARCH_Info *arch_info = arch_info_from_arch(entity->arch); U64 regs_size = arch_info->reg_block_size; - void *regs = d_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle); + void *regs = d_reg_block_from_thread(scratch.arena, entity->handle); Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 read_range = intersect_1u64(legal_range, range); U64 read_size = dim_1u64(read_range); @@ -4972,22 +5106,35 @@ d_ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) internal void d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { + Temp scratch = scratch_begin(0, 0); + + //- rjf: unpack path String8 path = msg->path; File file = file_open(AccessFlag_Read, path); FileProperties props = properties_from_file(file); FileMap map = file_map_open(AccessFlag_Read, file); void *base = file_map_view_open(map, AccessFlag_Read, r1u64(0, props.size)); String8 data = str8(base, base ? props.size : 0); + + //- rjf: try to parse file data as a dump file, extract abstracted (over format) dump info + B32 stored = 0; + D_EventList evts = {0}; + Arena *arena = 0; + D_DumpMemoryRange *memory_ranges = 0; + U64 memory_ranges_count = 0; + D_DumpThread *dump_threads = 0; + U64 dump_threads_count = 0; + D_Handle process = {0}; { - Temp scratch = scratch_begin(0, 0); - D_EventList evts = {0}; - //- rjf: try minidump parse -> construct events for entity creation { MDMP_Header header = {0}; str8_deserial_read_struct(data, 0, &header); if(header.magic == MDMP_MAGIC) { + stored = 1; + arena = arena_alloc(); + // rjf: extract directories U64 directories_count = 0; MDMP_Directory *directories = 0; @@ -5007,6 +5154,8 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) U64 threads_count = 0; MDMP_Module *modules = 0; U64 modules_count = 0; + MDMP_MemoryDescriptor32 *memories = 0; + U64 memories_count = 0; { for EachIndex(idx, directories_count) { @@ -5037,6 +5186,15 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) modules = (MDMP_Module *)(data.str + off); modules_count = Min(modules_count_32, modules_count_max); }break; + case MDMP_StreamKind_MemoryList: + { + U32 memories_count_32 = 0; + U64 off = dir->location.foff; + off += str8_deserial_read_struct(data, off, &memories_count_32); + U64 memories_count_max = (data.size - off) / sizeof(MDMP_MemoryDescriptor32); + memories = (MDMP_MemoryDescriptor32 *)(data.str + off); + memories_count = Min(memories_count_32, memories_count_max); + }break; } } } @@ -5052,7 +5210,7 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // rjf: process creation U64 handle_id_gen = 1; - D_Handle process = d_dump_handle_make(D_MachineID_Local, handle_id_gen); + process = d_dump_handle_make(D_MachineID_Local, handle_id_gen); handle_id_gen += 1; { D_Event *evt = d_event_list_push(scratch.arena, &evts); @@ -5060,16 +5218,22 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) evt->msg_id = msg->msg_id; evt->entity = process; evt->arch = arch; + evt->target_os = OperatingSystem_Windows; } // rjf: thread creation + dump_threads_count = threads_count; + dump_threads = push_array(arena, D_DumpThread, dump_threads_count); for EachIndex(idx, threads_count) { MDMP_Thread *thread = &threads[idx]; + D_Handle thread_handle = d_dump_handle_make(D_MachineID_Local, handle_id_gen); + dump_threads[idx].thread_handle = thread_handle; + dump_threads[idx].context_foff = thread->thread_context.foff; D_Event *evt = d_event_list_push(scratch.arena, &evts); evt->kind = D_EventKind_NewThread; evt->msg_id = msg->msg_id; - evt->entity = d_dump_handle_make(D_MachineID_Local, handle_id_gen); + evt->entity = thread_handle; evt->parent = process; evt->arch = arch; evt->entity_id = thread->id; @@ -5105,16 +5269,70 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) handle_id_gen += 1; } - // rjf: push events - d_c2u_push_events(&evts); + // rjf: allocate parse artifact arena + arena = arena_alloc(); - scratch_end(scratch); + // rjf: gather memory ranges + memory_ranges_count = memories_count; + memory_ranges = push_array(arena, D_DumpMemoryRange, memory_ranges_count); + for EachIndex(idx, memories_count) + { + memory_ranges[idx].base_vaddr = memories[idx].start_of_memory_range; + memory_ranges[idx].foff_range = r1u64(memories[idx].memory_location.foff, memories[idx].memory_location.foff+memories[idx].memory_location.data_size); + } } } } - file_map_view_close(map, base, r1u64(0, props.size)); - file_map_close(map); - file_close(file); + + //- rjf: push all events from the parse + ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->run_gen); + d_c2u_push_events(&evts); + + //- rjf: store the dump parse artifacts in the dump cache, otherwise release + if(stored) + { + U64 hash = d_hash_from_handle(process); + D_DumpCache *cache = &d_ctrl_state->dump_cache; + U64 slot_idx = hash%cache->slots_count; + Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); + RWMutexScope(stripe->rw_mutex, 1) + { + D_DumpNode *node = stripe->free; + if(node != 0) + { + stripe->free = node->next; + } + else + { + node = push_array(stripe->arena, D_DumpNode, 1); + } + DLLPushBack(cache->slots[slot_idx].first, cache->slots[slot_idx].last, node); + node->process = process; + node->file = file; + node->props = props; + node->map = map; + node->base = base; + node->arena = arena; + node->memory_ranges = memory_ranges; + node->memory_ranges_count = memory_ranges_count; + node->threads = dump_threads; + node->threads_count = dump_threads_count; + } + } + else + { + if(arena != 0) + { + arena_release(arena); + } + file_map_view_close(map, base, r1u64(0, props.size)); + file_map_close(map); + file_close(file); + } + + scratch_end(scratch); } internal void @@ -5122,36 +5340,51 @@ d_ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - DMN_Handle process = d_dmn_from_handle(msg->entity); - U32 exit_code = msg->exit_code; - - //- rjf: send kill - B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code); - - //- rjf: wait for process to be dead + B32 kill_worked = 0; D_EventCause cause = D_EventCause_Finished; - if(kill_worked) + switch((D_ControllerKindEnum)msg->entity.controller_kind) { - DMN_RunCtrls run_ctrls = {0}; - run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities_are_processes = 1; - run_ctrls.run_entities = &process; - run_ctrls.run_entity_count = 1; - for(B32 done = 0; done == 0;) + //- rjf: demon kills + case D_ControllerKind_Demon: { - DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - switch(event->kind) + DMN_Handle process = d_dmn_from_handle(msg->entity); + U32 exit_code = msg->exit_code; + + //- rjf: send kill + kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code); + + //- rjf: wait for process to be dead + if(kill_worked) { - default:{}break; - case DMN_EventKind_ExitProcess: - if(dmn_handle_match(event->process, process)) + DMN_RunCtrls run_ctrls = {0}; + run_ctrls.run_entities_are_unfrozen = 1; + run_ctrls.run_entities_are_processes = 1; + run_ctrls.run_entities = &process; + run_ctrls.run_entity_count = 1; + for(B32 done = 0; done == 0;) { - done = 1; - }break; - case DMN_EventKind_Error:{done = 1; cause = D_EventCause_Error;}break; - case DMN_EventKind_Halt: {done = 1; cause = D_EventCause_InterruptedByHalt;}break; + DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); + switch(event->kind) + { + default:{}break; + case DMN_EventKind_ExitProcess: + if(dmn_handle_match(event->process, process)) + { + done = 1; + }break; + case DMN_EventKind_Error:{done = 1; cause = D_EventCause_Error;}break; + case DMN_EventKind_Halt: {done = 1; cause = D_EventCause_InterruptedByHalt;}break; + } + } } - } + }break; + + //- rjf: dump kills + case D_ControllerKind_Dump: + { + kill_worked = 1; + d_ctrl_thread__close_dump_process(msg->msg_id, msg->entity); + }break; } //- rjf: record stop @@ -5178,10 +5411,9 @@ d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); U32 exit_code = msg->exit_code; - D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; //- rjf: gather all currently existing processes - D_EntityArray initial_processes = d_entity_array_from_kind(entity_ctx, D_EntityKind_Process); + D_EntityArray initial_processes = d_entity_array_from_kind(D_EntityKind_Process); typedef struct Task Task; struct Task { @@ -5210,7 +5442,12 @@ d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) for(Task *t = first_task, *next = 0; t != 0; t = next) { next = t->next; - B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, d_dmn_from_handle(t->process->handle), exit_code); + B32 kill_worked = 0; + switch((D_ControllerKindEnum)t->process->handle.controller_kind) + { + case D_ControllerKind_Demon:{kill_worked = dmn_ctrl_kill(ctrl_ctx, d_dmn_from_handle(t->process->handle), exit_code);}break; + case D_ControllerKind_Dump: {kill_worked = 1; d_ctrl_thread__close_dump_process(msg->msg_id, t->process->handle);}break; + } if(kill_worked) { DLLRemove(first_task, last_task, t); @@ -5226,7 +5463,7 @@ d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) default:{}break; case DMN_EventKind_CreateProcess: { - D_Entity *new_process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->process)); + D_Entity *new_process = d_entity_from_handle(d_handle_from_dmn(D_MachineID_Local, event->process)); Task *t = push_array(scratch.arena, Task, 1); t->process = new_process; DLLPushBack(first_task, last_task, t); @@ -5236,7 +5473,7 @@ d_ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } // rjf: end if all processes are gone - D_EntityArray processes = d_entity_array_from_kind(entity_ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); if(processes.count == 0) { done = 1; @@ -5320,7 +5557,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_Handle target_process = msg->parent; DMN_Handle target_thread_dmn = d_dmn_from_handle(target_thread); DMN_Handle target_process_dmn = d_dmn_from_handle(target_process); - D_Entity *target_process_entity = d_entity_from_handle(entity_ctx, target_process); + D_Entity *target_process_entity = d_entity_from_handle(target_process); U64 spoof_ip_vaddr = 911; log_infof("d_ctrl_thread__run:\n{\n"); @@ -5329,7 +5566,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // DMN_TrapChunkList user_traps = {0}; { - D_Entity *thread = d_entity_from_handle(entity_ctx, target_thread); + D_Entity *thread = d_entity_from_handle(target_thread); D_EvalScope *eval_scope = d_ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); for(D_Entity *machine = entity_ctx->root->first; machine != &d_entity_nil; @@ -5649,7 +5886,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) }break; case DMN_EventKind_LoadModule: { - D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->thread)); + D_Entity *thread = d_entity_from_handle(d_handle_from_dmn(D_MachineID_Local, event->thread)); D_EvalScope *eval_scope = d_ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread); { DMN_TrapChunkList new_traps = {0}; @@ -5674,7 +5911,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { D_Entity *bp = &d_entity_nil; { - D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->process)); + D_Entity *process = d_entity_from_handle(d_handle_from_dmn(D_MachineID_Local, event->process)); for(D_Entity *child = process->first; child != &d_entity_nil; child = child->next) { if(child->kind == D_EntityKind_Breakpoint && @@ -5706,7 +5943,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) Access *access = access_open(); //- rjf: unpack process/module info - D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->process)); + D_Entity *process = d_entity_from_handle(d_handle_from_dmn(D_MachineID_Local, event->process)); D_Entity *module = d_entity_child_from_kind(process, D_EntityKind_Module); U64 module_base_vaddr = module->vaddr_range.min; DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -5929,8 +6166,8 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) ////////////////////////// //- rjf: unpack info about thread attached to event // - D_Entity *thread = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->thread)); - D_Entity *process = d_entity_from_handle(entity_ctx, d_handle_from_dmn(D_MachineID_Local, event->process)); + D_Entity *thread = d_entity_from_handle(d_handle_from_dmn(D_MachineID_Local, event->thread)); + D_Entity *process = d_entity_from_handle(d_handle_from_dmn(D_MachineID_Local, event->process)); Arch arch = thread->arch; U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); @@ -6237,11 +6474,10 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) begin_spoof_mode = 1; U64 spoof_sp = dmn_rsp_from_thread(target_thread_dmn); spoof_mode = 1; - spoof.process = target_process_dmn; - spoof.thread = target_thread_dmn; + spoof.process = target_process; + spoof.thread = target_thread; spoof.vaddr = spoof_sp; spoof.new_ip_value = spoof_ip_vaddr; - log_infof("spoof:{process:[0x%I64x], thread:[0x%I64x], vaddr:0x%I64x, new_ip_value:0x%I64x}\n", spoof.process.u64[0], spoof.thread.u64[0], spoof.vaddr, spoof.new_ip_value); } } @@ -6474,6 +6710,137 @@ d_ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //////////////////////////////// //~ rjf: Process Memory Artifact Cache Hooks / Lookups +//- rjf: synchronous process memory reading helpers + +internal U64 +d_process_read(D_Handle process, Rng1U64 range, void *dst) +{ + U64 result = 0; + switch((D_ControllerKindEnum)process.controller_kind) + { + //- rjf: demon process reads + case D_ControllerKind_Demon: + { + result = dmn_process_read(d_dmn_from_handle(process), range, dst); + }break; + + //- rjf: dump process reads + case D_ControllerKind_Dump: + { + D_DumpCache *cache = &d_ctrl_state->dump_cache; + U64 hash = d_hash_from_handle(process); + U64 slot_idx = hash%cache->slots_count; + Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); + RWMutexScope(stripe->rw_mutex, 0) + { + // rjf: handle -> node + D_DumpNode *node = 0; + for(D_DumpNode *n = cache->slots[slot_idx].first; n != 0; n = n->next) + { + if(d_handle_match(n->process, process)) + { + node = n; + break; + } + } + + // rjf: find all overlapping memory ranges, & fill respective portion of output + if(node != 0) + { + B32 range_found = 0; + for EachIndex(idx, node->memory_ranges_count) + { + D_DumpMemoryRange *r = &node->memory_ranges[idx]; + Rng1U64 foff_range = r->foff_range; + Rng1U64 vaddr_range = r1u64(r->base_vaddr, r->base_vaddr + dim_1u64(foff_range)); + Rng1U64 legal_vaddr_range = intersect_1u64(vaddr_range, range); + if(legal_vaddr_range.min < legal_vaddr_range.max) + { + range_found = 1; + Rng1U64 legal_foff_range = r1u64(legal_vaddr_range.min - r->base_vaddr + foff_range.min, legal_vaddr_range.max - r->base_vaddr + foff_range.min); + Rng1U64 dst_off_range = r1u64(legal_vaddr_range.min - range.min, legal_vaddr_range.max - range.min); + MemoryCopy((U8 *)dst + dst_off_range.min, (U8 *)node->base + legal_foff_range.min, dim_1u64(dst_off_range)); + } + } + if(range_found) + { + result = dim_1u64(range); + } + } + } + }break; + } + return result; +} + +internal B32 +d_process_write(D_Handle process, Rng1U64 range, void *src) +{ + B32 result = 0; + switch((D_ControllerKindEnum)process.controller_kind) + { + case D_ControllerKind_Demon: + { + result = dmn_process_write(d_dmn_from_handle(process), range, src); + + //- rjf: success -> bump generation + if(result) + { + ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); + } + + //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless + // writes within calling frame's "view" of the memory, at the expense of a small amount of + // time. + if(result) + { + U64 endt_us = now_time_us()+10000; + U64 page_size = get_system_info()->page_size; // TODO(rjf): @page_size_from_process + Rng1U64 page_range = r1u64(range.min/page_size, (range.max+page_size-1)/page_size); + for EachInRange(page_idx, page_range) + { + Temp scratch = scratch_begin(0, 0); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); + scratch_end(scratch); + if(!slice.stale || now_time_us() >= endt_us) + { + break; + } + } + } + }break; + + case D_ControllerKind_Dump: + { + // TODO(rjf) + }break; + } + + return result; +} + +internal String8 +d_data_from_process_vaddr_range(Arena *arena, D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated) +{ + U64 desired_read_size = dim_1u64(vaddr_range); + void *buffer = push_array(arena, U8, desired_read_size); + U64 read_size = d_process_read(process, vaddr_range, buffer); + U64 num_bytes_overallocated = (desired_read_size - read_size); + arena_pop(arena, num_bytes_overallocated); + String8 result = str8((U8 *)buffer, read_size); + if(zero_terminated) + { + U64 pre_zero_termination_size = result.size; + result = str8_cstring_capped((U8 *)result.str, (U8 *)result.str + result.size); + U64 post_zero_termination_size = result.size; + U64 num_bytes_overallocated_after_zero_termination = post_zero_termination_size - pre_zero_termination_size; + arena_pop(arena, num_bytes_overallocated_after_zero_termination); + } + return result; +} + +//- rjf: process memory artifact cache + internal AC_Artifact d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) { @@ -6489,7 +6856,6 @@ d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g key_read_off += str8_deserial_read_struct(key, key_read_off, &vaddr_range); key_read_off += str8_deserial_read_struct(key, key_read_off, &zero_terminated); } - DMN_Handle process_dmn = d_dmn_from_handle(process); //- rjf: clamp vaddr range Rng1U64 vaddr_range_clamped = vaddr_range; @@ -6525,7 +6891,7 @@ d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g retry_count <= retry_limit; retry_count += 1) { - bytes_read = dmn_process_read(process_dmn, vaddr_range_clamped_retry, range_base); + bytes_read = d_process_read(process, vaddr_range_clamped_retry, range_base); if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min) { U64 diff = (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2; @@ -6827,44 +7193,6 @@ d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void * return good; } -//- rjf: process memory writing - -internal B32 -d_process_write(D_Handle process, Rng1U64 range, void *src) -{ - ProfBeginFunction(); - B32 result = dmn_process_write(d_dmn_from_handle(process), range, src); - - //- rjf: success -> bump generation - if(result) - { - ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); - } - - //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless - // writes within calling frame's "view" of the memory, at the expense of a small amount of - // time. - if(result) - { - U64 endt_us = now_time_us()+10000; - U64 page_size = get_system_info()->page_size; // TODO(rjf): @page_size_from_process - Rng1U64 page_range = r1u64(range.min/page_size, (range.max+page_size-1)/page_size); - for EachInRange(page_idx, page_range) - { - Temp scratch = scratch_begin(0, 0); - D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); - scratch_end(scratch); - if(!slice.stale || now_time_us() >= endt_us) - { - break; - } - } - } - - ProfEnd(); - return result; -} - //////////////////////////////// //~ rjf: Call Stack Artifact Cache Hooks / Lookups @@ -6884,6 +7212,7 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 MutexScopeR(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { D_EntityCtx *src_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; + d_select_entity_ctx(src_ctx); D_EntityCtx *dst_ctx = entity_ctx; { dst_ctx->root = &d_entity_nil; @@ -6892,7 +7221,7 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 MemoryCopyArray(dst_ctx->entity_kind_counts, src_ctx->entity_kind_counts); MemoryCopyArray(dst_ctx->entity_kind_alloc_gens, src_ctx->entity_kind_alloc_gens); } - D_Entity *src_thread = d_entity_from_handle(src_ctx, thread_handle); + D_Entity *src_thread = d_entity_from_handle(thread_handle); D_Entity *src_process = d_process_from_entity(src_thread); { D_EntityRec rec = {0}; @@ -6976,8 +7305,11 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 } } + //- rjf: select entity context + d_select_entity_ctx(entity_ctx); + //- rjf: compute call stack - D_Entity *thread = d_entity_from_handle(entity_ctx, thread_handle); + D_Entity *thread = d_entity_from_handle(thread_handle); B32 good = 1; B32 retry = 0; Arena *arena = 0; @@ -6996,7 +7328,7 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 { pre_reg_gen = d_reg_gen(); pre_mem_gen = d_mem_gen(); - unwind = d_unwind_from_thread(arena, entity_ctx, thread_handle, now_time_us()+5000); + unwind = d_unwind_from_thread(arena, thread_handle, now_time_us()+5000); if(!(unwind.flags & D_UnwindFlag_Stale)) { good = 1; @@ -7084,8 +7416,7 @@ d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_ou Arch *threads_arches = 0; MutexScopeR(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { - D_EntityCtx *ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; - D_EntityArray thread_entities = d_entity_array_from_kind(ctx, D_EntityKind_Thread); + D_EntityArray thread_entities = d_entity_array_from_kind(D_EntityKind_Thread); threads_count = thread_entities.count; threads = push_array(scratch.arena, D_Handle, threads_count); threads_processes = push_array(scratch.arena, D_Handle, threads_count); diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 028384fe..054775c4 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -214,6 +214,55 @@ struct D_ModuleImageInfoCache D_ModuleImageInfoCacheStripe *stripes; }; +//////////////////////////////// +//~ rjf: Opened Dump Cache Types + +typedef struct D_DumpMemoryRange D_DumpMemoryRange; +struct D_DumpMemoryRange +{ + U64 base_vaddr; + Rng1U64 foff_range; +}; + +typedef struct D_DumpThread D_DumpThread; +struct D_DumpThread +{ + D_Handle thread_handle; + U64 context_foff; +}; + +typedef struct D_DumpNode D_DumpNode; +struct D_DumpNode +{ + D_DumpNode *next; + D_DumpNode *prev; + D_Handle process; + File file; + FileProperties props; + FileMap map; + void *base; + Arena *arena; + D_DumpMemoryRange *memory_ranges; + U64 memory_ranges_count; + D_DumpThread *threads; + U64 threads_count; +}; + +typedef struct D_DumpSlot D_DumpSlot; +struct D_DumpSlot +{ + D_DumpNode *first; + D_DumpNode *last; +}; + +typedef struct D_DumpCache D_DumpCache; +struct D_DumpCache +{ + U64 slots_count; + D_DumpSlot *slots; + StripeArray stripes; +}; + //////////////////////////////// //~ rjf: Touched Debug Info Directory Cache @@ -275,6 +324,7 @@ struct D_CtrlState // rjf: caches D_ThreadRegCache thread_reg_cache; D_ModuleImageInfoCache module_image_info_cache; + D_DumpCache dump_cache; // rjf: generations U64 run_gen; @@ -327,6 +377,7 @@ struct D_CtrlState //~ rjf: Globals global D_CtrlState *d_ctrl_state = 0; +thread_static D_EntityCtx *d_entity_ctx = 0; read_only global D_Entity d_entity_nil = { &d_entity_nil, @@ -413,9 +464,12 @@ internal D_Event d_event_from_serialized_string(Arena *arena, String8 string); //////////////////////////////// //~ rjf: Entity Type Functions +//- rjf: entity context selection +internal D_EntityCtx *d_select_entity_ctx(D_EntityCtx *ctx); + //- rjf: entity list data structures internal void d_entity_list_push(Arena *arena, D_EntityList *list, D_Entity *entity); -internal D_EntityList d_entity_list_from_handle_list(Arena *arena, D_EntityCtx *ctx, D_HandleList *list); +internal D_EntityList d_entity_list_from_handle_list(Arena *arena, D_HandleList *list); #define d_entity_list_first(list) ((list)->first ? (list)->first->v : &d_entity_nil) //- rjf: entity array data structure @@ -423,13 +477,13 @@ internal D_EntityArray d_entity_array_from_list(Arena *arena, D_EntityList *list #define d_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &d_entity_nil) //- rjf: entity context (entity group read-only) functions -internal D_Entity *d_entity_from_handle(D_EntityCtx *ctx, D_Handle handle); +internal D_Entity *d_entity_from_handle(D_Handle handle); internal D_Entity *d_entity_child_from_kind(D_Entity *parent, D_EntityKind kind); internal D_Entity *d_entity_ancestor_from_kind(D_Entity *entity, D_EntityKind kind); internal D_Entity *d_process_from_entity(D_Entity *entity); internal D_Entity *d_module_from_process_vaddr(D_Entity *process, U64 vaddr); internal DI_Key d_dbgi_key_from_module(D_Entity *module); -internal D_Entity *d_module_from_thread_candidates(D_EntityCtx *ctx, D_Entity *thread, D_EntityList *candidates); +internal D_Entity *d_module_from_thread_candidates(D_Entity *thread, D_EntityList *candidates); internal U64 d_vaddr_from_voff(D_Entity *module, U64 voff); internal U64 d_voff_from_vaddr(D_Entity *module, U64 vaddr); internal Rng1U64 d_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_range); @@ -458,9 +512,9 @@ internal void d_entity_equip_string(D_EntityCtxRWStore *store, D_Entity *entity, //- rjf: accelerated entity context lookups internal D_EntityCtxLookupAccel *d_thread_entity_ctx_lookup_accel(void); -internal D_EntityArray d_entity_array_from_kind(D_EntityCtx *ctx, D_EntityKind kind); -internal D_EntityList d_modules_from_dbgi_key(Arena *arena, D_EntityCtx *ctx, DI_Key dbgi_key); -internal D_Entity *d_thread_from_id(D_EntityCtx *ctx, U64 id); +internal D_EntityArray d_entity_array_from_kind(D_EntityKind kind); +internal D_EntityList d_modules_from_dbgi_key(Arena *arena, DI_Key dbgi_key); +internal D_Entity *d_thread_from_id(U64 id); //- rjf: applying events to entity caches internal void d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list); @@ -473,14 +527,15 @@ internal void d_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook); //////////////////////////////// //~ rjf: Thread Register Functions -//- rjf: thread register cache reading -internal void *d_reg_block_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle handle); -internal U64 d_tls_root_vaddr_from_thread(D_EntityCtx *ctx, D_Handle handle); -internal U64 d_rip_from_thread(D_EntityCtx *ctx, D_Handle handle); -internal U64 d_rsp_from_thread(D_EntityCtx *ctx, D_Handle handle); +//- rjf: thread handle read/write +internal B32 d_thread_read_reg_block(D_Handle handle, void *reg_block); +internal B32 d_thread_write_reg_block(D_Handle thread, void *reg_block); -//- rjf: thread register writing -internal B32 d_thread_write_reg_block(D_Handle thread, void *block); +//- rjf: thread register cache reading +internal void *d_reg_block_from_thread(Arena *arena, D_Handle handle); +internal U64 d_tls_root_vaddr_from_thread(D_Handle handle); +internal U64 d_rip_from_thread(D_Handle handle); +internal U64 d_rsp_from_thread(D_Handle handle); //////////////////////////////// //~ rjf: Module Image Info Functions @@ -504,7 +559,7 @@ internal U64 *d_unwind_reg_from_pe_gpr_reg__pe_x64(X64_RegBlock *regs, PE_Unwind internal D_UnwindStepResult d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, X64_RegBlock *regs, U64 endt_us); //- rjf: abstracted full unwind -internal D_Unwind d_unwind_from_thread(Arena *arena, D_EntityCtx *ctx, D_Handle thread, U64 endt_us); +internal D_Unwind d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us); //////////////////////////////// //~ rjf: Call Stack Building Functions @@ -551,6 +606,9 @@ internal void d_ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Ent internal void d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); internal void d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range); +//- rjf: dump process closing work +internal void d_ctrl_thread__close_dump_process(D_MsgID msg_id, D_Handle process); + //- rjf: attached process running/event gathering internal DMN_Event *d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, DMN_RunCtrls *run_ctrls, D_Spoof *spoof); @@ -578,6 +636,14 @@ internal void d_ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg); //////////////////////////////// //~ rjf: Process Memory Artifact Cache Hooks / Lookups +//- rjf: synchronous process memory reading helpers +internal U64 d_process_read(D_Handle process, Rng1U64 range, void *dst); +internal B32 d_process_write(D_Handle process, Rng1U64 range, void *dst); +internal String8 d_data_from_process_vaddr_range(Arena *arena, D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated); +#define d_process_read_struct(process, vaddr, ptr) d_process_read((process), r1u64((vaddr), (vaddr) + sizeof(*(ptr))), (ptr)) +#define d_process_write_struct(process, vaddr, ptr) d_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), (ptr)) + +//- rjf: process memory artifact cache internal AC_Artifact d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); internal void d_memory_artifact_destroy(AC_Artifact artifact); internal C_Key d_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale); @@ -587,9 +653,6 @@ internal D_ProcessMemorySlice d_process_memory_slice_from_vaddr_range(Arena *are internal B32 d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); #define d_process_memory_read_struct(process, vaddr, is_stale_out, ptr, endt_us) d_process_memory_read((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) -//- rjf: process memory writing -internal B32 d_process_write(D_Handle process, Rng1U64 range, void *src); - //////////////////////////////// //~ rjf: Call Stack Artifact Cache Hooks / Lookups diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index dbcde890..1744db1c 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -297,7 +297,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread) // rjf: thread => unpacked info D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); Arch arch = thread->arch; - U64 ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + U64 ip_vaddr = d_rip_from_thread(thread->handle); // rjf: ip => machine code String8 machine_code = {0}; @@ -336,7 +336,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) // rjf: thread => info Arch arch = thread->arch; - U64 ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + U64 ip_vaddr = d_rip_from_thread(thread->handle); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -549,7 +549,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) // rjf: thread => info Arch arch = thread->arch; - U64 ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + U64 ip_vaddr = d_rip_from_thread(thread->handle); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -750,11 +750,10 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) U64 read_endt_us = now_time_us() + 1000000; Temp scratch = scratch_begin(&arena, 1); Access *access = access_open(); - D_EntityCtx *entity_ctx = &d_user_state->ctrl_entity_store->ctx; // rjf: unpack thread Arch arch = thread->arch; - U64 ip_vaddr = d_rip_from_thread(entity_ctx, thread->handle); + U64 ip_vaddr = d_rip_from_thread(thread->handle); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -1303,7 +1302,7 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena) { DI_KeyList dbgis = {0}; - D_EntityArray modules = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); + D_EntityArray modules = d_entity_array_from_kind(D_EntityKind_Module); for EachIndex(idx, modules.count) { D_Entity *module = modules.v[idx]; @@ -1328,7 +1327,7 @@ d_query_cached_rip_from_thread_unwind(D_Entity *thread, U64 unwind_count) U64 result = 0; if(unwind_count == 0) { - result = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + result = d_rip_from_thread(thread->handle); } else { @@ -1614,7 +1613,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_EventKind_NewProc: { // rjf: the first process? -> clear session output - D_EntityArray existing_processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray existing_processes = d_entity_array_from_kind(D_EntityKind_Process); if(existing_processes.count == 1) { MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; @@ -1678,7 +1677,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: build data strings of all param data String8List strings = {0}; { - D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); for EachIndex(idx, threads.count) { D_Entity *thread = threads.v[idx]; @@ -1833,7 +1832,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Kill: { - D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); + D_Entity *process = d_entity_from_handle(params->process); if(process == &d_entity_nil) { log_user_error(str8_lit("Cannot kill; no process was specified.")); @@ -1856,7 +1855,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Detach: { - D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->process); + D_Entity *process = d_entity_from_handle(params->process); if(process == &d_entity_nil) { log_user_error(str8_lit("Cannot detach; no process specified.")); @@ -1872,7 +1871,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_Continue: { B32 good_to_run = 0; - D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); if(threads.count > 0) { for EachIndex(idx, threads.count) @@ -1888,7 +1887,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { need_run = 1; run_kind = D_RunKind_Run; - run_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + run_thread = d_entity_from_handle(params->thread); } else { @@ -1902,7 +1901,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepOverLine: case D_CmdKind_StepOut: { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + D_Entity *thread = d_entity_from_handle(params->thread); if(thread == &d_entity_nil) { log_user_error(str8_lit("Must have a selected thread to step.")); @@ -1969,16 +1968,16 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { need_run = 1; run_kind = d_user_state->ctrl_last_run_kind; - run_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, d_user_state->ctrl_last_run_thread_handle); + run_thread = d_entity_from_handle(d_user_state->ctrl_last_run_thread_handle); run_flags = d_user_state->ctrl_last_run_flags; run_traps = d_user_state->ctrl_last_run_traps; }break; case D_CmdKind_SetThreadIP: { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->thread); + D_Entity *thread = d_entity_from_handle(params->thread); ARCH_Info *arch_info = arch_info_from_arch(thread->arch); U64 vaddr = params->vaddr; - void *block = d_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, thread->handle); + void *block = d_reg_block_from_thread(scratch.arena, thread->handle); arch_reg_block_write_ip(arch_info, block, vaddr); B32 result = d_thread_write_reg_block(thread->handle, block); (void)result; @@ -2002,7 +2001,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Run: { - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_Continue, .machine = params->machine, .process = params->process, .thread = params->thread); @@ -2014,7 +2013,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Restart: { - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_KillAll); @@ -2024,7 +2023,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepInto: case D_CmdKind_StepOver: { - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); if(processes.count != 0) { D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto @@ -2074,7 +2073,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_ThawEntity: { B32 should_freeze = (cmd->kind == D_CmdKind_FreezeEntity); - D_Entity *root = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + D_Entity *root = d_entity_from_handle(params->entity); for(D_Entity *e = root; e != &d_entity_nil; e = d_entity_rec_depth_first_pre(e, root).next) { if(e->kind == D_EntityKind_Thread) @@ -2089,7 +2088,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P { need_run = 1; run_kind = d_user_state->ctrl_last_run_kind; - run_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, d_user_state->ctrl_last_run_thread_handle); + run_thread = d_entity_from_handle(d_user_state->ctrl_last_run_thread_handle); run_flags = d_user_state->ctrl_last_run_flags; run_traps = d_user_state->ctrl_last_run_traps; } @@ -2098,12 +2097,12 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P //- rjf: entity decoration case D_CmdKind_SetEntityColor: { - D_Entity *entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + D_Entity *entity = d_entity_from_handle(params->entity); entity->rgba = params->rgba; }break; case D_CmdKind_SetEntityName: { - D_Entity *entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, params->entity); + D_Entity *entity = d_entity_from_handle(params->entity); d_entity_equip_string(d_user_state->ctrl_entity_store, entity, params->string); }break; diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 33748624..756f8068 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -162,53 +162,6 @@ dmn_rsp_from_thread(DMN_Handle thread) //////////////////////////////// //~ rjf: Process Reading Helper Functions (Helpers, Implemented Once) -internal String8 -dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List block_list = {0}; - for(U64 cursor = addr, stride = 256;; cursor += stride) - { - U8 *raw_block = push_array_no_zero(scratch.arena, U8, stride); - U64 read_size = dmn_process_read(process, r1u64(cursor, cursor + stride), raw_block); - String8 block = str8_cstring_capped(raw_block, raw_block + read_size); - str8_list_push(scratch.arena, &block_list, block); - if(read_size != stride || (block.size+1 <= read_size && block.str[block.size] == 0)) - { - break; - } - } - String8 result = str8_list_join(arena, &block_list, 0); - scratch_end(scratch); - return result; -} - -internal String8 -dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange) -{ - String8 block = {0}; - void *raw = dmn_process_read_raw(arena, process, vrange); - if(raw) - { - block = str8(raw, dim_1u64(vrange)); - } - return block; -} - -internal void * -dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange) -{ - Temp temp = temp_begin(arena); - void *buffer = push_array(arena, U8, dim_1u64(vrange)); - U64 read_size = dmn_process_read(process, vrange, buffer); - if(read_size != dim_1u64(vrange)) - { - buffer = 0; - temp_end(temp); - } - return buffer; -} - internal String8 dmn_get_trap_inst(void) { diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 6878f837..fa4ed70d 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -219,9 +219,7 @@ internal U64 dmn_rsp_from_thread(DMN_Handle thread); //////////////////////////////// //~ rjf: Process Reading Helper Functions (Helpers, Implemented Once) -internal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr); -internal String8 dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange); -internal void * dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange); +internal String8 dmn_data_from_process_vaddr_range(Arena *arena, DMN_Handle process, Rng1U64 vrange); //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) @@ -262,8 +260,6 @@ internal void dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size internal void dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, AccessFlags flags); internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); -#define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -#define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) //- rjf: threads internal Arch dmn_arch_from_thread(DMN_Handle handle); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 33f26ec6..a8c5906c 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -2028,7 +2028,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I if(reg_num != 0) { string_mapped = 1; - Arch arch = e_base_ctx->primary_module->arch; + Arch arch = e_base_ctx->thread_arch; ARCH_Info *arch_info = arch_info_from_arch(arch); ARCH_RegCode reg_code = reg_num; Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; diff --git a/src/minidump/minidump.h b/src/minidump/minidump.h index db05a8dd..aab59e03 100644 --- a/src/minidump/minidump.h +++ b/src/minidump/minidump.h @@ -4,6 +4,8 @@ #ifndef MINIDUMP_H #define MINIDUMP_H +#pragma pack(push, 1) + typedef enum MDMP_DumpKind { MDMP_DumpKind_Normal = 0x00000000, @@ -226,4 +228,6 @@ struct MDMP_SystemInfo // CPU_INFORMATION Cpu; (architecture dependent) }; +#pragma pack(pop) + #endif // MINIDUMP_H diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 3d979886..5ccca316 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -696,7 +696,7 @@ rd_ctrl_entity_from_eval_space(E_Space space) handle.machine_id = (U32)((space.u64s[0] & 0xffffffff00000000ull) >> 32); handle.controller_kind = (U32)((space.u64s[0] & 0x00000000ffffffffull) >> 0); handle.entity_id = space.u64s[1]; - entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); + entity = d_entity_from_handle(handle); } return entity; } @@ -793,7 +793,7 @@ rd_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, R void *regs_block = 0; if(e_interpret_ctx->reg_unwind_count == 0) { - regs_block = d_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, entity->handle); + regs_block = d_reg_block_from_thread(scratch.arena, entity->handle); } else { @@ -1042,7 +1042,7 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 write_range = intersect_1u64(legal_range, range); U64 write_size = dim_1u64(write_range); - void *new_regs = d_reg_block_from_thread(scratch.arena, &d_user_state->ctrl_entity_store->ctx, entity->handle); + void *new_regs = d_reg_block_from_thread(scratch.arena, entity->handle); MemoryCopy((U8 *)new_regs + write_range.min, in, write_size); result = d_thread_write_reg_block(entity->handle, new_regs); scratch_end(scratch); @@ -1739,7 +1739,7 @@ rd_view_ui(Rng2F32 rect) UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) { CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("target")); - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); //- rjf: icon & info UI_Padding(ui_em(2.f, 1.f)) UI_TagF("weak") @@ -2397,7 +2397,7 @@ rd_view_ui(Rng2F32 rect) String8 name = {0}; { U64 vaddr = eval.value.u64; - D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + D_Entity *process = d_entity_from_handle(rd_regs()->process); D_Entity *module = d_module_from_process_vaddr(process, vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); U64 voff = d_voff_from_vaddr(module, vaddr); @@ -4772,7 +4772,7 @@ rd_arch_from_eval(E_Eval eval) D_Entity *process = d_process_from_entity(ctrl_entity); if(process == &d_entity_nil) { - process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + process = d_entity_from_handle(rd_regs()->process); } Arch arch = process->arch; if(arch == Arch_Null) @@ -5530,11 +5530,11 @@ rd_window_frame(void) //////////////////////// //- rjf: control entity tooltips // - case RD_RegSlot_Machine: {ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->machine); }goto ctrl_entity_tooltip; - case RD_RegSlot_Process: {ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->process); }goto ctrl_entity_tooltip; - case RD_RegSlot_Module: {ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->module); }goto ctrl_entity_tooltip; - case RD_RegSlot_Thread: {ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->thread); }goto ctrl_entity_tooltip; - case RD_RegSlot_CtrlEntity:{ctrl_entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, regs->ctrl_entity); }goto ctrl_entity_tooltip; + case RD_RegSlot_Machine: {ctrl_entity = d_entity_from_handle(regs->machine); }goto ctrl_entity_tooltip; + case RD_RegSlot_Process: {ctrl_entity = d_entity_from_handle(regs->process); }goto ctrl_entity_tooltip; + case RD_RegSlot_Module: {ctrl_entity = d_entity_from_handle(regs->module); }goto ctrl_entity_tooltip; + case RD_RegSlot_Thread: {ctrl_entity = d_entity_from_handle(regs->thread); }goto ctrl_entity_tooltip; + case RD_RegSlot_CtrlEntity:{ctrl_entity = d_entity_from_handle(regs->ctrl_entity); }goto ctrl_entity_tooltip; ctrl_entity_tooltip:; UI_Tooltip { @@ -7080,7 +7080,7 @@ rd_window_frame(void) { Temp scratch = scratch_begin(0, 0); CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("target")); - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); B32 can_send_signal = !d_ctrl_targets_running(); typedef struct CenterButtonTask CenterButtonTask; struct CenterButtonTask @@ -9624,7 +9624,7 @@ rd_string_from_exception_code(U32 code) internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event) { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, event->entity); + D_Entity *thread = d_entity_from_handle(event->entity); DR_FStrList thread_fstrs = rd_title_fstrs_from_ctrl_entity(arena, thread, 0); DR_FStrList fstrs = {0}; DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit("text")), ui_top_font_size()}; @@ -9836,14 +9836,14 @@ rd_gather_auto_exprs(Arena *arena) U64 seen_expr_slots_count = 16; String8Node **seen_expr_slots = push_array(scratch.arena, String8Node *, seen_expr_slots_count); D_Handle thread_handle = rd_regs()->thread; - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, thread_handle); + D_Entity *thread = d_entity_from_handle(thread_handle); D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 0, 0); if(call_stack.frames_count != 0) { //- rjf: unpack thread / module / debug info / lines ARCH_Info *arch_info = arch_info_from_arch(thread->arch); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - U64 thread_ip_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread_handle); + U64 thread_ip_vaddr = d_rip_from_thread(thread_handle); D_Entity *module = d_module_from_process_vaddr(process, thread_ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); @@ -11348,14 +11348,15 @@ rd_frame(void) //- rjf: unpack basic evaluation context // ProfBegin("unpack eval-dependent info"); - D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *process = d_entity_from_handle(rd_regs()->process); + D_Entity *thread = d_entity_from_handle(rd_regs()->thread); Arch arch = thread->arch; + E_Space primary_space = rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity); U64 unwind_count = rd_regs()->unwind_count; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); - U64 tls_root_vaddr = d_tls_root_vaddr_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + U64 tls_root_vaddr = d_tls_root_vaddr_from_thread(thread->handle); ProfEnd(); //////////////////////////// @@ -11378,7 +11379,7 @@ rd_frame(void) //////////////////////////// //- rjf: produce all eval modules // - D_EntityArray all_modules = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); + D_EntityArray all_modules = d_entity_array_from_kind(D_EntityKind_Module); U64 eval_modules_count = Max(1, all_modules.count); E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &e_module_nil; @@ -11787,7 +11788,7 @@ rd_frame(void) { String8 name = evallable_ctrl_names[idx]; D_EntityKind kind = d_entity_kind_from_string(name); - D_EntityArray array = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); + D_EntityArray array = d_entity_array_from_kind(kind); E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); for EachIndex(idx, array.count) { @@ -12158,7 +12159,7 @@ rd_frame(void) //- rjf: gather config from loaded modules // CFG_NodePtrList immediate_type_views = {0}; - D_EntityArray modules = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Module); + D_EntityArray modules = d_entity_array_from_kind(D_EntityKind_Module); ProfScope("gather config from loaded modules") { for EachIndex(idx, modules.count) @@ -12262,7 +12263,7 @@ rd_frame(void) E_IRCtx *ir_ctx = push_array(scratch.arena, E_IRCtx, 1); { E_IRCtx *ctx = ir_ctx; - ctx->regs_map = d_string2reg_from_arch(eval_base_ctx->primary_module->arch); + ctx->regs_map = d_string2reg_from_arch(arch); ctx->locals_map = d_query_cached_locals_map_from_dbgi_key_voff(eval_base_ctx->primary_dbg_info->dbgi_key, rip_voff); ctx->member_map = d_query_cached_member_map_from_dbgi_key_voff(eval_base_ctx->primary_dbg_info->dbgi_key, rip_voff); ctx->macro_map = macro_map; @@ -12276,8 +12277,8 @@ rd_frame(void) E_InterpretCtx *interpret_ctx = push_array(scratch.arena, E_InterpretCtx, 1); { E_InterpretCtx *ctx = interpret_ctx; - ctx->primary_space = eval_modules_primary->space; - ctx->reg_arch = eval_modules_primary->arch; + ctx->primary_space = primary_space; + ctx->reg_arch = arch; ctx->reg_space = rd_eval_space_from_ctrl_entity(thread, D_EvalSpaceKind_Entity); ctx->reg_unwind_count = unwind_count; ctx->module_base = push_array(scratch.arena, U64, 1); @@ -12349,7 +12350,7 @@ rd_frame(void) case RD_CmdKind_Restart: { // rjf: reset hit counts - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); if(processes.count == 0 || kind == RD_CmdKind_Restart) { CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); @@ -12569,7 +12570,7 @@ rd_frame(void) { // rjf: if control processes are live, but this is not force-confirmed, then // get confirmation from user - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("lossy_exit_confirmation")); if(processes.count != 0 && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) { @@ -13907,12 +13908,12 @@ rd_frame(void) //- rjf: source <-> disasm case RD_CmdKind_GoToDisassembly: { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_regs()->thread); U64 vaddr = 0; for(D_LineNode *n = rd_regs()->lines.first; n != 0; n = n->next) { - D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(thread, &modules); if(module != &d_entity_nil) { vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); @@ -14195,7 +14196,7 @@ rd_frame(void) Access *access = access_open(); //- rjf: unpack thread info - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_regs()->thread); U64 unwind_index = rd_regs()->unwind_count; U64 inline_depth = rd_regs()->inline_depth; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_index); @@ -14259,7 +14260,7 @@ rd_frame(void) }break; case RD_CmdKind_FindSelectedThread: { - D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_Entity *selected_thread = d_entity_from_handle(rd_base_regs()->thread); rd_cmd(RD_CmdKind_FindThread, .thread = selected_thread->handle, .unwind_count = rd_base_regs()->unwind_count, @@ -14368,7 +14369,7 @@ rd_frame(void) { D_Entity *process = &d_entity_nil; U64 vaddr = 0; - D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, voff_dbgi_key); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, voff_dbgi_key); D_Entity *module = d_entity_list_first(&modules); process = d_entity_ancestor_from_kind(module, D_EntityKind_Process); if(process != &d_entity_nil) @@ -14448,8 +14449,8 @@ rd_frame(void) { file_path = rd_mapped_from_file_path(scratch.arena, rd_regs()->file_path); point = rd_regs()->cursor; - thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process); + thread = d_entity_from_handle(rd_regs()->thread); + process = d_entity_from_handle(rd_regs()->process); vaddr = rd_regs()->vaddr; prefer_new_tab = rd_regs()->prefer_new_tab; if(file_path.size == 0) @@ -14471,8 +14472,8 @@ rd_frame(void) D_LineList lines = d_lines_from_file_path_line_num(scratch.arena, file_path, point.line, max_U64); for(D_LineNode *n = lines.first; n != 0; n = n->next) { - D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(thread, &modules); vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); break; } @@ -15685,7 +15686,7 @@ rd_frame(void) }break; case RD_CmdKind_SetNextStatement: { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_regs()->thread); String8 file_path = rd_regs()->file_path; U64 new_rip_vaddr = rd_regs()->vaddr_range.min; if(file_path.size != 0) @@ -15693,8 +15694,8 @@ rd_frame(void) D_LineList *lines = &rd_regs()->lines; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(thread, &modules); if(module != &d_entity_nil) { new_rip_vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); @@ -15810,9 +15811,9 @@ rd_frame(void) }break; case RD_CmdKind_SelectThread: { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_regs()->thread); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = d_module_from_process_vaddr(process, d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle)); + D_Entity *module = d_module_from_process_vaddr(process, d_rip_from_thread(thread->handle)); D_Entity *machine = d_entity_ancestor_from_kind(process, D_EntityKind_Machine); rd_state->base_regs.v.unwind_count = 0; rd_state->base_regs.v.inline_depth = 0; @@ -15825,7 +15826,7 @@ rd_frame(void) case RD_CmdKind_SelectUnwind: { Access *access = access_open(); - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 1, now_time_us()+10000); D_CallStackFrame *frame = d_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); if(frame == 0) @@ -15844,7 +15845,7 @@ rd_frame(void) case RD_CmdKind_DownOneFrame: { Access *access = access_open(); - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); D_CallStack call_stack = d_call_stack_from_thread(access, thread->handle, 1, now_time_us()+10000); D_CallStackFrame *current_frame = d_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth); D_CallStackFrame *next_frame = current_frame; @@ -16576,7 +16577,7 @@ rd_frame(void) default:{}break; case D_EventKind_NewProc: { - D_EntityArray all_processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray all_processes = d_entity_array_from_kind(D_EntityKind_Process); if(all_processes.count == 1) { MemoryZeroStruct(&rd_state->prestop_focused_window); @@ -16593,7 +16594,7 @@ rd_frame(void) }break; case D_EventKind_NewModule: { - D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); + D_Entity *module = d_entity_from_handle(evt->entity); D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); String8 new_path = debug_info_path->string; if(new_path.size != 0 && file_path_exists(new_path)) @@ -16637,7 +16638,7 @@ rd_frame(void) case D_EventKind_EndProc: if(rd_state->quit_after_success) { - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); if(evt->u64_code == 0 && processes.count == 0) { rd_cmd(RD_CmdKind_Exit); @@ -16650,12 +16651,12 @@ rd_frame(void) case D_EventKind_Stopped: { B32 need_refocus = (evt->cause != D_EventCause_InterruptedByHalt || !soft_halt_issued); - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, evt->entity); + D_Entity *thread = d_entity_from_handle(evt->entity); U64 vaddr = evt->rip_vaddr; D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, vaddr); U64 voff = d_voff_from_vaddr(module, vaddr); - U64 test_cached_vaddr = d_rip_from_thread(&d_user_state->ctrl_entity_store->ctx, thread->handle); + U64 test_cached_vaddr = d_rip_from_thread(thread->handle); // rjf: valid stop thread? -> select & snap if(need_refocus && thread->kind == D_EntityKind_Thread && evt->cause != D_EventCause_InterruptedByHalt) @@ -16664,7 +16665,7 @@ rd_frame(void) } // rjf: no stop-causing thread, but have selected thread? -> snap to selected - D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_Entity *selected_thread = d_entity_from_handle(rd_base_regs()->thread); if(need_refocus && (evt->cause == D_EventCause_InterruptedByHalt || thread->kind != D_EntityKind_Thread) && selected_thread != &d_entity_nil) { rd_cmd(RD_CmdKind_SelectThread, .thread = selected_thread->handle); @@ -16673,7 +16674,7 @@ rd_frame(void) // rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread if(need_refocus && thread->kind != D_EntityKind_Thread && selected_thread == &d_entity_nil) { - D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); D_Entity *first_available_thread = d_entity_array_first(&threads); rd_cmd(RD_CmdKind_SelectThread, .thread = first_available_thread->handle); } @@ -16725,7 +16726,7 @@ rd_frame(void) // rjf: update the autos-determining code range { D_Handle new_thread_handle = thread->handle; - U64 new_sp = d_rsp_from_thread(&d_user_state->ctrl_entity_store->ctx, new_thread_handle); + U64 new_sp = d_rsp_from_thread(new_thread_handle); if(thread == &d_entity_nil) { new_thread_handle = selected_thread->handle; diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index c911fbaf..8b34dd7a 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -267,7 +267,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals) E_TYPE_EXPAND_INFO_FUNCTION_DEF(registers) { Temp scratch = scratch_begin(&arena, 1); - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_regs()->thread); Arch arch = thread->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); U64 reg_count = arch_info->reg_code_count; @@ -769,7 +769,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(control) str8_match(str8_prefix(rhs->string, 1), str8_lit("$"), 0)) { D_Handle handle = d_handle_from_string(rhs->string); - D_Entity *entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); + D_Entity *entity = d_entity_from_handle(handle); E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0)); result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, d_entity_kind_code_name_table[entity->kind]); @@ -1103,7 +1103,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(call_stack) D_CallStack *call_stack = &accel->call_stack; if(0 <= rhs_value.u64 && rhs_value.u64 < call_stack->frames_count) { - D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, accel->process); + D_Entity *process = d_entity_from_handle(accel->process); ARCH_Info *arch_info = arch_info_from_arch(accel->arch); D_CallStackFrame *f = &call_stack->frames[rhs_value.u64]; result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity), e_irtree_const_u(arena, arch_ip_from_reg_block(arch_info, f->regs))); @@ -1565,7 +1565,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes) } else { - machines = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Machine); + machines = d_entity_array_from_kind(D_EntityKind_Machine); } //- rjf: gather system processes from this machine @@ -1662,7 +1662,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities) { String8 rhs_name = expr->first->next->string; D_Handle handle = d_handle_from_string(rhs_name); - entity = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, handle); + entity = d_entity_from_handle(handle); }break; case E_ExprKind_ArrayIndex: { @@ -1670,7 +1670,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities) D_EntityKind kind = d_entity_kind_from_string(rd_singular_from_code_name_plural(type->name)); E_Value rhs_value = e_value_from_expr(expr->first->next); U64 rhs_idx = rhs_value.u64; - D_EntityArray entities = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, kind); + D_EntityArray entities = d_entity_array_from_kind(kind); if(0 <= rhs_idx && rhs_idx < entities.count) { entity = entities.v[rhs_idx]; @@ -1712,7 +1712,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) D_EntityArray array = {0}; if(scoping_entity == &d_entity_nil) { - array = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, entity_kind); + array = d_entity_array_from_kind(entity_kind); } else { diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index a965bd4c..53331eb0 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -292,6 +292,7 @@ //- rjf: [h] #include "base/base_inc.h" #include "x64/x64.h" +#include "win32/win32_inc.h" #include "linker/hash_table.h" #include "linker/lf_hash_table.h" #include "linker/base_ext/base_bit_array.h" @@ -347,6 +348,7 @@ //- rjf: [c] #include "base/base_inc.c" #include "x64/x64.c" +#include "win32/win32_inc.c" #include "linker/hash_table.c" #include "linker/lf_hash_table.c" #include "linker/base_ext/base_bit_array.c" diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 417f5c98..ad4dec36 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -44,7 +44,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla F32 scroll_bar_dim = floor_f32(main_font_size*1.5f); Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_regs()->thread); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); B32 do_line_numbers = rd_setting_b32_from_name(str8_lit("show_line_numbers")); @@ -278,8 +278,8 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: find live threads mapping to source code if(!dasm_lines) ProfScope("find live threads mapping to this file") { - D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_Entity *selected_thread = d_entity_from_handle(rd_regs()->thread); + D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); for EachIndex(idx, threads.count) { D_Entity *thread = threads.v[idx]; @@ -341,7 +341,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla if(!dasm_lines) ProfScope("find all src -> dasm info for source code") { String8 file_path = rd_regs()->file_path; - D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + D_Entity *module = d_entity_from_handle(rd_regs()->module); DI_Key dbgi_key = d_dbgi_key_from_module(module); D_LineListArray lines_array = d_lines_array_from_dbgi_key_file_path_line_range(scratch.arena, dbgi_key, file_path, visible_line_num_range, 8); if(lines_array.count != 0) @@ -354,8 +354,8 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla // rjf: find live threads mapping to disasm if(dasm_lines) ProfScope("find live threads mapping to this disassembly") { - D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); - D_EntityArray threads = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Thread); + D_Entity *selected_thread = d_entity_from_handle(rd_regs()->thread); + D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); for EachIndex(idx, threads.count) { D_Entity *thread = threads.v[idx]; @@ -2102,7 +2102,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) if(rd_regs()->lang_kind == TXT_LangKind_Null) { Access *access = access_open(); - D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + D_Entity *module = d_entity_from_handle(rd_regs()->module); DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); if(rdi != &rdi_parsed_nil) @@ -2226,7 +2226,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) // if(rd_regs()->file_path.size != 0) { - D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->module); + D_Entity *module = d_entity_from_handle(rd_regs()->module); DI_Key dbgi_key = d_dbgi_key_from_module(module); rd_regs()->lines = d_lines_from_dbgi_key_file_path_line_num(rd_frame_arena(), dbgi_key, rd_regs()->file_path, rd_regs()->cursor.line, 8); } @@ -2436,13 +2436,13 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == d_run_gen()) { auto_selected = 1; - auto_space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, dv->temp_look_process), D_EvalSpaceKind_Entity); + auto_space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(dv->temp_look_process), D_EvalSpaceKind_Entity); eval = e_eval_from_stringf("(0x%I64x & (~(0x4000 - 1)))", dv->temp_look_vaddr); } else { auto_selected = 1; - auto_space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), D_EvalSpaceKind_Entity); + auto_space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(rd_regs()->process), D_EvalSpaceKind_Entity); eval = e_eval_from_stringf("(reg:rip & (~(0x4000 - 1)))"); } } @@ -2683,7 +2683,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Rng1U64 view_range = rd_space_range_from_eval(eval); if(eval.space.kind == 0) { - eval.space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->process), D_EvalSpaceKind_Entity); + eval.space = rd_eval_space_from_ctrl_entity(d_entity_from_handle(rd_regs()->process), D_EvalSpaceKind_Entity); view_range = rd_whole_range_from_eval_space(eval.space); } @@ -3257,7 +3257,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) AnnotationList *visible_memory_annotations = push_array(scratch.arena, AnnotationList, visible_memory_size); { Access *access = access_open(); - D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *selected_thread = d_entity_from_handle(rd_regs()->thread); D_Entity *selected_process = d_entity_ancestor_from_kind(selected_thread, D_EntityKind_Process); D_CallStack selected_call_stack = d_call_stack_from_thread(access, selected_thread->handle, 1, 0); D_Entity *eval_process = &d_entity_nil; diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 96ada8e6..857e89b1 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -109,7 +109,7 @@ rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras) CFG_Node *bp = cfg_node_from_id(stop_event.u64_code); if(bp == cfg) { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); + D_Entity *thread = d_entity_from_handle(stop_event.entity); Vec4F32 thread_color = rd_color_from_ctrl_entity(thread); if(thread_color.w == 0) { @@ -518,7 +518,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr if(entity->kind == D_EntityKind_Thread || entity->kind == D_EntityKind_Module) { - D_EntityArray processes = d_entity_array_from_kind(&d_user_state->ctrl_entity_store->ctx, D_EntityKind_Process); + D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); if(processes.count > 1) { D_Entity *process = d_entity_ancestor_from_kind(entity, D_EntityKind_Process); @@ -1264,12 +1264,12 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe RD_CodeSliceSignal result = {0}; ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - D_Entity *selected_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_regs()->thread); + D_Entity *selected_thread = d_entity_from_handle(rd_regs()->thread); D_Entity *selected_thread_process = d_entity_ancestor_from_kind(selected_thread, D_EntityKind_Process); U64 selected_thread_rip_unwind_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count); D_Entity *selected_thread_module = d_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr); D_Event stop_event = d_ctrl_last_stop_event(); - D_Entity *stopper_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, stop_event.entity); + D_Entity *stopper_thread = d_entity_from_handle(stop_event.entity); B32 is_focused = ui_is_focus_active(); B32 ctrlified = (wm_get_modifiers() & WM_Modifier_Ctrl); Vec4F32 code_line_bgs[] = @@ -1348,7 +1348,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(rd_state->drag_drop_regs_slot == RD_RegSlot_Thread) { drop_can_hit_lines = 1; - drop_thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_state->drag_drop_regs->thread); + drop_thread = d_entity_from_handle(rd_state->drag_drop_regs->thread); drop_color = rd_color_from_ctrl_entity(drop_thread); if(drop_color.w == 0) { @@ -2113,8 +2113,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe D_LineList *lines = ¶ms->line_infos[line_idx]; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, &d_user_state->ctrl_entity_store->ctx, n->v.dbgi_key); - D_Entity *module = d_module_from_thread_candidates(&d_user_state->ctrl_entity_store->ctx, thread, &modules); + D_EntityList modules = d_modules_from_dbgi_key(scratch.arena, n->v.dbgi_key); + D_Entity *module = d_module_from_thread_candidates(thread, &modules); if(module != &d_entity_nil) { new_rip_vaddr = d_vaddr_from_voff(module, n->v.voff_range.min); @@ -2723,7 +2723,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe Rng1U64 hover_voff_range = hover_regs->voff_range; if(hover_voff_range.min == 0 && hover_voff_range.max == 0) { - D_Entity *module = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, hover_regs->module); + D_Entity *module = d_entity_from_handle(hover_regs->module); hover_voff_range = d_voff_range_from_vaddr_range(module, hover_regs->vaddr_range); } ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f)); diff --git a/src/win32/demon/win32_demon.c b/src/win32/demon/win32_demon.c index 890404d7..329d0dfd 100644 --- a/src/win32/demon/win32_demon.c +++ b/src/win32/demon/win32_demon.c @@ -607,7 +607,7 @@ w32_dmn_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block) } //- rjf: unpack features available on this context - if (xstate_enabled) + if(xstate_enabled) { SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512 | XSTATE_MASK_CET_U); } diff --git a/src/win32/win32_inc.c b/src/win32/win32_inc.c new file mode 100644 index 00000000..6f8f5874 --- /dev/null +++ b/src/win32/win32_inc.c @@ -0,0 +1,6 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#if defined(X64_H) +# include "win32/x64/win32_x64.c" +#endif diff --git a/src/win32/win32_inc.h b/src/win32/win32_inc.h new file mode 100644 index 00000000..062fd9e5 --- /dev/null +++ b/src/win32/win32_inc.h @@ -0,0 +1,11 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef WIN32_INC_H +#define WIN32_INC_H + +#if defined(X64_H) +# include "win32/x64/win32_x64.h" +#endif + +#endif // WIN32_INC_H diff --git a/src/win32/x64/win32_x64.c b/src/win32/x64/win32_x64.c new file mode 100644 index 00000000..9cb50c40 --- /dev/null +++ b/src/win32/x64/win32_x64.c @@ -0,0 +1,139 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal B32 +w32_x64_write_reg_block_from_thread_ctx(void *reg_block, void *thread_ctx) +{ + X64_RegBlock *dst = (X64_RegBlock *)reg_block; + W32_X64_ThreadContext *src = (W32_X64_ThreadContext *)thread_ctx; + + //- rjf: convert context -> X64_RegBlock + W32_X64_XSaveFormat *xsave = &src->FltSave; + dst->rax = src->Rax; + dst->rcx = src->Rcx; + dst->rdx = src->Rdx; + dst->rbx = src->Rbx; + dst->rsp = src->Rsp; + dst->rbp = src->Rbp; + dst->rsi = src->Rsi; + dst->rdi = src->Rdi; + dst->r8 = src->R8; + dst->r9 = src->R9; + dst->r10 = src->R10; + dst->r11 = src->R11; + dst->r12 = src->R12; + dst->r13 = src->R13; + dst->r14 = src->R14; + dst->r15 = src->R15; + dst->rip = src->Rip; + dst->cs = src->SegCs; + dst->ds = src->SegDs; + dst->es = src->SegEs; + dst->fs = src->SegFs; + dst->gs = src->SegGs; + dst->ss = src->SegSs; + dst->dr0 = src->Dr0; + dst->dr1 = src->Dr1; + dst->dr2 = src->Dr2; + dst->dr3 = src->Dr3; + dst->dr6 = src->Dr6; + dst->dr7 = src->Dr7; + // NOTE(rjf): this bit is "supposed to always be 1", according to old info. + // may need to be investigated. + dst->rflags = src->EFlags | 0x2; + dst->fcw = xsave->ControlWord; + dst->fsw = xsave->StatusWord; + dst->ftw = xsave->TagWord; + dst->fop = xsave->ErrorOpcode; + MemoryCopy(&dst->fip, &xsave->ErrorOffset, sizeof(U64)); + MemoryCopy(&dst->fdp, &xsave->DataOffset, sizeof(U64)); + dst->mxcsr = xsave->MxCsr; + dst->mxcsr_mask = xsave->MxCsr_Mask; + { + U128 *float_s = xsave->FloatRegisters; + U80 *float_d = &dst->st0; + for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1) + { + MemoryCopy(float_d, float_s, sizeof(*float_d)); + } + } + { + U128 *xmm_s = xsave->XmmRegisters; + U512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, xmm_s += 1, zmm_d += 1) + { + MemoryCopy(zmm_d, xmm_s, sizeof(*xmm_s)); + } + } + + // TODO(rjf): we need to determine how to do LocateXStateFeature without + // actually running on Windows - what is that function actually looking at + // & doing? +#if 0 + // AVX + { + DWORD avx_length = 0; + U8 *avx_s = (U8 *)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length); + if(avx_length == 16 * sizeof(U128)) + { + U512 *zmm_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, avx_s += sizeof(U128), zmm_d += 1) + { + MemoryCopy(&zmm_d->u8[16], avx_s, sizeof(U128)); + } + } + } + + // AVX-512 + { + // rjf: kmask + DWORD kmask_length = 0; + U64 *kmask_s = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length); + if(kmask_length == 8 * sizeof(U64)) + { + U64 *kmask_d = &dst->k0; + for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1) + { + MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_s)); + } + } + + // rjf: zmmh + DWORD avx512h_length = 0; + U8 *avx512h_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length); + if(avx512h_length == 16 * sizeof(U256)) + { + U512 *zmmh_d = &dst->zmm0; + for(U32 n = 0; n < 16; n += 1, avx512h_s += sizeof(U256), zmmh_d += 1) + { + MemoryCopy(&zmmh_d->u8[32], avx512h_s, sizeof(U256)); + } + } + + // rjf: zmm + DWORD avx512_length = 0; + U8 *avx512_s = (U8 *)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length); + if(avx512_length == 16 * sizeof(U512)) + { + U512 *zmm_d = &dst->zmm16; + for(U32 n = 0; n < 16; n += 1, avx512_s += sizeof(U512), zmm_d += 1) + { + MemoryCopy(zmm_d, avx512_s, sizeof(U512)); + } + } + } + + // CET / Shadow Stack + if(xstate_mask & XSTATE_MASK_CET_U) + { + DWORD cet_length = 0; + XSAVE_CET_U_FORMAT *cet = LocateXStateFeature(ctx, XSTATE_CET_U, &cet_length); + if (cet_length == sizeof(*cet)) + { + dst->cetmsr = cet->Ia32CetUMsr; + dst->cetssp = cet->Ia32Pl3SspMsr; + } + } +#endif + return 1; +} diff --git a/src/win32/x64/win32_x64.h b/src/win32/x64/win32_x64.h new file mode 100644 index 00000000..478852b1 --- /dev/null +++ b/src/win32/x64/win32_x64.h @@ -0,0 +1,110 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef WIN32_X64_H +#define WIN32_X64_H + +#pragma pack(push, 1) + +typedef struct W32_X64_XSaveFormat W32_X64_XSaveFormat; +struct W32_X64_XSaveFormat +{ + U16 ControlWord; + U16 StatusWord; + U8 TagWord; + U8 Reserved1; + U16 ErrorOpcode; + U32 ErrorOffset; + U16 ErrorSelector; + U16 Reserved2; + U32 DataOffset; + U16 DataSelector; + U16 Reserved3; + U32 MxCsr; + U32 MxCsr_Mask; + U128 FloatRegisters[8]; + U128 XmmRegisters[16]; + U8 Reserved4[96]; +}; + +typedef struct W32_X64_ThreadContext W32_X64_ThreadContext; +struct W32_X64_ThreadContext +{ + U64 P1Home; + U64 P2Home; + U64 P3Home; + U64 P4Home; + U64 P5Home; + U64 P6Home; + U32 ContextFlags; + U32 MxCsr; + U16 SegCs; + U16 SegDs; + U16 SegEs; + U16 SegFs; + U16 SegGs; + U16 SegSs; + U32 EFlags; + U64 Dr0; + U64 Dr1; + U64 Dr2; + U64 Dr3; + U64 Dr6; + U64 Dr7; + U64 Rax; + U64 Rcx; + U64 Rdx; + U64 Rbx; + U64 Rsp; + U64 Rbp; + U64 Rsi; + U64 Rdi; + U64 R8; + U64 R9; + U64 R10; + U64 R11; + U64 R12; + U64 R13; + U64 R14; + U64 R15; + U64 Rip; + union + { + W32_X64_XSaveFormat FltSave; + struct + { + U128 Header[2]; + U128 Legacy[8]; + U128 Xmm0; + U128 Xmm1; + U128 Xmm2; + U128 Xmm3; + U128 Xmm4; + U128 Xmm5; + U128 Xmm6; + U128 Xmm7; + U128 Xmm8; + U128 Xmm9; + U128 Xmm10; + U128 Xmm11; + U128 Xmm12; + U128 Xmm13; + U128 Xmm14; + U128 Xmm15; + U8 padding_0[96]; + }; + }; + U128 VectorRegister[26]; + U64 VectorControl; + U64 DebugControl; + U64 LastBranchToRip; + U64 LastBranchFromRip; + U64 LastExceptionToRip; + U64 LastExceptionFromRip; +}; + +#pragma pack(pop) + +internal B32 w32_x64_write_reg_block_from_thread_ctx(void *reg_block, void *thread_ctx); + +#endif // WIN32_X64_H From ffb6cb8987707593523978fce3bdc8a065f0eda0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 18:11:33 -0700 Subject: [PATCH 549/850] minidump includes --- src/torture/torture_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 64326bd9..a8ce3ee6 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -27,6 +27,8 @@ #include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" +#include "minidump/minidump.h" +#include "minidump/minidump_parse.h" #include "mdesk/mdesk.h" #include "window_manager/window_manager_inc.h" #include "config/config_inc.h" @@ -101,6 +103,8 @@ #include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" +#include "minidump/minidump.c" +#include "minidump/minidump_parse.c" #include "mdesk/mdesk.c" #include "window_manager/window_manager_inc.c" #include "config/config_inc.c" From b8e85ab9ca7debab7fbb8f32892d09593d299134 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 18:00:55 -0700 Subject: [PATCH 550/850] fix incorrect GSI symbol compars that determ_test exposed --- src/linker/pdb_ext/pdb_builder.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 6302b52c..0c6e5809 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1783,7 +1783,7 @@ psi_addr_map_compar_is_before(void *raw_a, void *raw_b) } else if (a->isect_off.off != b->isect_off.off) { is_before = a->isect_off.off < b->isect_off.off; } else { - is_before = str8_compar_case_sensitive(&a->name, &b->name); + is_before = str8_compar_case_sensitive(&a->name, &b->name) < 0; } return is_before; @@ -1832,6 +1832,12 @@ gsi_symbol_is_before(void *raw_a, void *raw_b) int cmp = str8_compar_ignore_case(&a_name, &b_name); if (cmp == 0) { cmp = u64_compar(&a->offset, &b->offset); + if (cmp == 0) { + cmp = a->kind < b->kind ? -1 : a->kind > b->kind ? +1 : 0; + if (cmp == 0) { + cmp = str8_compar(a->data, b->data, 0); + } + } } is_before = cmp < 0; } @@ -1859,6 +1865,9 @@ gsi_pub_symbol_is_before(void *raw_a, void *raw_b) cmp = u16_compar(&a_sym->sec, &b_sym->sec); if (cmp == 0) { cmp = u32_compar(&a_sym->off, &b_sym->off); + if (cmp == 0) { + cmp = str8_compar(a->data, b->data, 0); + } } } @@ -3193,4 +3202,3 @@ pdb_string_from_src_error(PDB_SrcError error) } return str8(0,0); } - From 921030c43245147695a32df547f549563f85e695 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 13 May 2026 20:29:15 -0700 Subject: [PATCH 551/850] hash map --- src/linker/hash_table.c | 378 +++++++++++++++++++++++++++++++++++++ src/linker/hash_table.h | 89 ++++++++- src/torture/torture_base.c | 165 ++++++++++++++++ 3 files changed, 629 insertions(+), 3 deletions(-) diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index 7cdbbcb7..7280bfc3 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -528,3 +528,381 @@ str8_from_key_value_pairs(Arena *arena, KeyValuePair *v, U64 count) } return result; } + +//////////////////////////////// + +internal U64 +hash_map_hasher(String8 string) +{ + return u64_hash_from_str8(string); +} + +internal HashMapNode ** +hash_map_search_(HashMap *hm, U64 hash, HashMapKey key, HashMapKeyMatchFunc *match_func, B32 *found_out) +{ + HashMapNode **n = &hm->root; + HashMapNode **last_tombstone = 0; + + *found_out = 0; + + for (U64 h = hash; *n != 0; h <<= 2) { + if ((*n)->is_live) { + if (match_func(&(*n)->v.key, &key)) { + *found_out = 1; + return n; + } + } else { + last_tombstone = n; + } + n = &(*n)->children[h >> 62]; + } + + if (last_tombstone != 0) { + hm->tombstone_count -= 1; + return last_tombstone; + } + + return n; +} + +internal HashMapNode * +hash_map_search(HashMap *hm, U64 hash, HashMapKey key, HashMapKeyMatchFunc *match_func) +{ + B32 found = 0; + HashMapNode **n = hash_map_search_(hm, hash, key, match_func, &found); + return found ? *n : 0; +} + +internal HashMapNode * +hash_map_push(Arena *arena, HashMap *hm, U64 hash, HashMapKeyValue key_value, HashMapKeyMatchFunc *match_func) +{ + B32 found = 0; + HashMapNode **n = hash_map_search_(hm, hash, key_value.key, match_func, &found); + if (found) { return *n; } + + if (*n == 0) { + *n = hm->free_list; + if (hm->free_list) { SLLStackPop(hm->free_list); } + else { *n = push_array(arena, HashMapNode, 1); } + } + + (*n)->v = key_value; + (*n)->is_live = 1; + + hm->count += 1; + return *n; +} + +internal B32 +hash_map_purge_item(HashMap *hm, U64 hash, HashMapKey key, HashMapKeyMatchFunc *match_func) +{ + B32 found = 0; + HashMapNode **n = hash_map_search_(hm, hash, key, match_func, &found); + if (found) { + (*n)->is_live = 0; + hm->count -= 1; + hm->tombstone_count += 1; + } + return found; +} + +internal void +hash_map_purge(HashMap *hm) +{ + Temp scratch = scratch_begin(0,0); + + typedef struct Stack { + struct Stack *next; + HashMapNode *node; + U32 next_child_idx; + } Stack; + + Stack *free_list = 0; + Stack *stack = 0; + + if (hm->count > 0) { + stack = push_array(scratch.arena, Stack, 1); + stack->node = hm->root; + } + + while (stack) { + // descend + while (stack->next_child_idx < ArrayCount(stack->node->children)) { + HashMapNode *child = stack->node->children[stack->next_child_idx]; + stack->next_child_idx += 1; + + if (child) { + Stack *f = free_list; + if (f) { SLLStackPop(free_list); } + else { f = push_array(scratch.arena, Stack, 1); } + + f->node = child; + SLLStackPush(stack, f); + break; + } + } + + // ascend + if (stack->next_child_idx >= ArrayCount(stack->node->children)) { + SLLStackPush(hm->free_list, stack->node); + SLLStackPop(stack); + } + } + + scratch_end(scratch); +} + +//////////////////////////////// + +force_inline HASH_MAP_KEY_MATCH(hash_map_match_u32) { return a->key_u32 == b->key_u32; } +force_inline HASH_MAP_KEY_MATCH(hash_map_match_u64) { return a->key_u64 == b->key_u64; } +force_inline HASH_MAP_KEY_MATCH(hash_map_match_raw) { return a->key_raw == b->key_raw; } +force_inline HASH_MAP_KEY_MATCH(hash_map_match_string) { return str8_match(a->key_string, b->key_string, 0); } +force_inline HASH_MAP_KEY_MATCH(hash_map_match_path) { return str8_match(a->key_string, b->key_string, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); } + +internal U64 +hash_map_hash_from_path(String8 path) +{ + Temp scratch = scratch_begin(0, 0); + + String8 path_canon = path; + path_canon = lower_from_str8(scratch.arena, path_canon); + path_canon = path_convert_slashes(scratch.arena, path_canon, PathStyle_UnixAbsolute); + + U64 hash = hash_map_hasher(path_canon); + + scratch_end(scratch); + return hash; +} + +//////////////////////////////// + +internal HashMapNode * +hash_map_push_string_string(Arena *arena, HashMap *hm, String8 key, String8 value) +{ + return hash_map_push(arena, hm, hash_map_hasher(key), (HashMapKeyValue){ .key = { .key_string = key }, .value = { .value_string = value } }, hash_map_match_string); +} + +internal HashMapNode * +hash_map_push_string_raw(Arena *arena, HashMap *hm, String8 key, void *value) +{ + return hash_map_push(arena, hm, hash_map_hasher(key), (HashMapKeyValue){ .key = { .key_string = key }, .value = { .value_raw = value } }, hash_map_match_string); +} + +internal HashMapNode * +hash_map_push_string_u64(Arena *arena, HashMap *hm, String8 key, U64 value) +{ + return hash_map_push(arena, hm, hash_map_hasher(key), (HashMapKeyValue){ .key = { .key_string = key }, .value = { .value_u64 = value } }, hash_map_match_string); +} + +internal HashMapNode * +hash_map_push_u32_raw(Arena *arena, HashMap *hm, U32 key, void *value) +{ + return hash_map_push(arena, hm, hash_map_hasher(str8_struct(&key)), (HashMapKeyValue){ .key = { .key_u32 = key }, .value = { .value_raw = value } }, hash_map_match_u32); +} + +internal HashMapNode * +hash_map_push_u32_string(Arena *arena, HashMap *hm, U32 key, String8 value) +{ + return hash_map_push(arena, hm, hash_map_hasher(str8_struct(&key)), (HashMapKeyValue){ .key = { .key_u32 = key }, .value = { .value_string = value } }, hash_map_match_u32); +} + +internal HashMapNode * +hash_map_push_u64_raw(Arena *arena, HashMap *hm, U64 key, void *value) +{ + return hash_map_push(arena, hm, hash_map_hasher(str8_struct(&key)), (HashMapKeyValue){ .key = { .key_u64 = key }, .value = { .value_raw = value } }, hash_map_match_u64); +} + +internal HashMapNode * +hash_map_push_u64_string(Arena *arena, HashMap *hm, U64 key, String8 value) +{ + return hash_map_push(arena, hm, hash_map_hasher(str8_struct(&key)), (HashMapKeyValue){ .key = { .key_u64 = key }, .value = { .value_string = value } }, hash_map_match_u64); +} + +internal HashMapNode * +hash_map_push_u64_u64(Arena *arena, HashMap *hm, U64 key, U64 value) +{ + return hash_map_push(arena, hm, hash_map_hasher(str8_struct(&key)), (HashMapKeyValue){ .key = { .key_u64 = key }, .value = { .value_u64 = value } }, hash_map_match_u64); +} + +internal HashMapNode * +hash_map_push_path_u64(Arena *arena, HashMap *hm, String8 path, U64 value) +{ + return hash_map_push(arena, hm, hash_map_hasher(path), (HashMapKeyValue){ .key = { .key_string = path }, .value = { .value_u64 = value } }, hash_map_match_path); +} + +internal HashMapNode * +hash_map_push_path_string(Arena *arena, HashMap *hm, String8 path, String8 value) +{ + return hash_map_push(arena, hm, hash_map_hasher(path), (HashMapKeyValue){ .key = { .key_string = path }, .value = { .value_string = value } }, hash_map_match_path); +} + +internal HashMapNode * +hash_map_push_path_raw(Arena *arena, HashMap *hm, String8 path, void *value) +{ + return hash_map_push(arena, hm, hash_map_hash_from_path(path), (HashMapKeyValue){ .key = { .key_string = path }, .value = { .value_raw = value } }, hash_map_match_path); +} + +//////////////////////////////// + +internal void * +hash_map_search_string_raw(HashMap *hm, String8 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hasher(key), (HashMapKey){ .key_string = key }, hash_map_match_string); + return n ? n->v.value.value_raw : 0; +} + +internal U32 * +hash_map_search_string_u32(HashMap *hm, String8 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hasher(key), (HashMapKey){ .key_string = key }, hash_map_match_string); + return n ? &n->v.value.value_u32 : 0; +} + +internal U64 * +hash_map_search_string_u64(HashMap *hm, String8 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hasher(key), (HashMapKey){ .key_string = key }, hash_map_match_string); + return n ? &n->v.value.value_u64 : 0; +} + +internal void * +hash_map_search_path_raw(HashMap *hm, String8 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hash_from_path(key), (HashMapKey){ .key_string = key }, hash_map_match_path); + return n ? n->v.value.value_raw : 0; +} + +internal void * +hash_map_search_u64_raw(HashMap *hm, U64 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hasher(str8_struct(&key)), (HashMapKey){ .key_u64 = key }, hash_map_match_u64); + return n ? n->v.value.value_raw : 0; +} + +internal U64 * +hash_map_search_u64_u64(HashMap *hm, U64 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hasher(str8_struct(&key)), (HashMapKey){ .key_u64 = key }, hash_map_match_u64); + return n ? &n->v.value.value_u64 : 0; +} + +internal void * +hash_map_search_raw_raw(HashMap *hm, void *key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hasher(str8_struct(&key)), (HashMapKey){ .key_raw = key }, hash_map_match_raw); + return n ? n->v.value.value_raw : 0; +} + +//////////////////////////////// + +internal B32 hash_map_purge_u32(HashMap *hm, U32 key) { return hash_map_purge_item(hm, hash_map_hasher(str8_struct(&key)), (HashMapKey){ .key_u32 = key }, hash_map_match_u32); } +internal B32 hash_map_purge_u64(HashMap *hm, U64 key) { return hash_map_purge_item(hm, hash_map_hasher(str8_struct(&key)), (HashMapKey){ .key_u64 = key }, hash_map_match_u64); } +internal B32 hash_map_purge_string(HashMap *hm, String8 key) { return hash_map_purge_item(hm, hash_map_hasher(key), (HashMapKey){ .key_string = key }, hash_map_match_string); } + +//////////////////////////////// + +#define HASH_MAP_EXTRACT_FUNC(name) void name(HashMapKeyValue *kv, void *buffer) +typedef HASH_MAP_EXTRACT_FUNC(HashMapExtractFunc); + +typedef struct +{ + void *keys; + void *values; +} HashMapExtract; + +internal HashMapExtract +hash_map_extract(Arena *arena, + HashMap *hm, + HashMapExtractFunc *key_func, U64 key_size, + HashMapExtractFunc *value_func, U64 value_size) +{ + Temp scratch = scratch_begin(&arena, 1); + + U64 key_offset = 0; + U64 value_offset = 0; + U8 *key_buffer = 0; + U8 *value_buffer = 0; + if (key_func && key_size) { key_buffer = push_array_no_zero(arena, U8, key_size * hm->count); } + if (value_func && value_size) { value_buffer = push_array_no_zero(arena, U8, value_size * hm->count); } + + typedef struct Stack { + struct Stack *next; + HashMapNode *node; + U32 next_child_idx; + } Stack; + + Stack *free_list = 0; + Stack *stack = 0; + + if (hm->count > 0) { + stack = push_array(scratch.arena, Stack, 1); + stack->node = hm->root; + } + + while (stack) { + // descend + while (stack->next_child_idx < ArrayCount(stack->node->children)) { + HashMapNode *child = stack->node->children[stack->next_child_idx]; + stack->next_child_idx += 1; + + if (child) { + Stack *f = free_list; + if (f) { SLLStackPop(free_list); } + else { f = push_array(scratch.arena, Stack, 1); } + + f->node = child; + SLLStackPush(stack, f); + break; + } + } + + // ascend + if (stack->next_child_idx >= ArrayCount(stack->node->children)) { + + if (stack->node->is_live) { + if (key_func) { + key_func(&stack->node->v, key_buffer + key_offset); + key_offset += key_size; + } + if (value_func) { + value_func(&stack->node->v, value_buffer + value_offset); + value_offset += value_size; + } + } + + SLLStackPop(stack); + } + } + + scratch_end(scratch); + return (HashMapExtract){ .keys = key_buffer, .values = value_buffer }; +} + +// { keys, value } +force_inline HASH_MAP_EXTRACT_FUNC(hash_map_extract_key_value) { MemoryCopy(buffer, kv, sizeof(*kv)); } +internal HashMapKeyValue * key_value_from_hash_map ( Arena *arena, HashMap *hm) { return hash_map_extract(arena, hm, hash_map_extract_key_value, sizeof(HashMapKeyValue), 0, 0).keys; } + +// keys +force_inline HASH_MAP_EXTRACT_FUNC(hash_map_extract_key_u32) { MemoryCopy(buffer, &kv->key.key_u32, sizeof(kv->key.key_u32)); } +force_inline HASH_MAP_EXTRACT_FUNC(hash_map_extract_key_u64) { MemoryCopy(buffer, &kv->key.key_u64, sizeof(kv->key.key_u64)); } +force_inline HASH_MAP_EXTRACT_FUNC(hash_map_extract_key_string) { MemoryCopy(buffer, &kv->key.key_string, sizeof(kv->key.key_string)); } +internal U32 * keys_from_hash_map_u32 ( Arena *arena, HashMap *hm) { return hash_map_extract(arena, hm, hash_map_extract_key_u32, sizeof(U32), 0, 0).keys; } +internal U64 * keys_from_hash_map_u64 ( Arena *arena, HashMap *hm) { return hash_map_extract(arena, hm, hash_map_extract_key_u64, sizeof(U64), 0, 0).keys; } +internal String8 * keys_from_hash_map_string( Arena *arena, HashMap *hm) { return hash_map_extract(arena, hm, hash_map_extract_key_string, sizeof(String8), 0, 0).keys; } +internal void * keys_from_hash_map_raw ( Arena *arena, HashMap *hm) { return hash_map_extract(arena, hm, hash_map_extract_key_string, sizeof(void *), 0, 0).keys; } + +// values +force_inline HASH_MAP_EXTRACT_FUNC(hash_map_extract_value_u64) { MemoryCopy(buffer, &kv->value.value_u64, sizeof(kv->value.value_u64)); } +internal U64 * values_from_hash_map_u64(Arena *arena, HashMap *hm) { return hash_map_extract(arena, hm, 0, 0, hash_map_extract_value_u64, sizeof(U64)).values; } + +//////////////////////////////// + +force_inline int hash_map_key_is_before_u32(void *a, void *b) { return ((HashMapKeyValue*)a)->key.key_u32 < ((HashMapKeyValue*)b)->key.key_u32; } +force_inline int hash_map_key_is_before_u64(void *a, void *b) { return ((HashMapKeyValue*)a)->key.key_u64 < ((HashMapKeyValue*)b)->key.key_u64; } +force_inline int hash_map_key_is_before_string(void *a, void *b) { return str8_is_before_case_sensitive(a, b); } + +internal void sort_hash_map_key_value_u32(HashMapKeyValue *pairs, U64 count) { radsort(pairs, count, hash_map_key_is_before_u32); } +internal void sort_hash_map_key_value_u64(HashMapKeyValue *pairs, U64 count) { radsort(pairs, count, hash_map_key_is_before_u64); } +internal void sort_hash_map_key_value_string(HashMapKeyValue *pairs, U64 count) { radsort(pairs, count, hash_map_key_is_before_string); } + diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 326c0b1b..3f9337b5 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -92,11 +92,10 @@ internal B32 hash_table_purge_string(HashTable *ht, String8 key); internal U32 * keys_from_hash_table_u32 (Arena *arena, HashTable *ht); internal U64 * keys_from_hash_table_u64 (Arena *arena, HashTable *ht); -internal String8 keys_from_hash_table_str8 (Arena *arena, HashTable *ht); -internal KeyValuePair * key_value_pairs_from_hash_table(Arena *arena, HashTable *ht); internal void * keys_from_hash_table_raw (Arena *arena, HashTable *ht); -internal U64 * values_from_hash_table_u64(Arena *arena, HashTable *ht); +internal String8 keys_from_hash_table_str8 (Arena *arena, HashTable *ht); +internal KeyValuePair * key_value_pairs_from_hash_table(Arena *arena, HashTable *ht); internal void sort_key_value_pairs_as_u32 (KeyValuePair *pairs, U64 count); internal void sort_key_value_pairs_as_u64 (KeyValuePair *pairs, U64 count); @@ -109,3 +108,87 @@ internal String8 ** str8_from_key_value_pairs(Arena *arena, KeyValuePair *v, U64 internal U64Array remove_duplicates_u64_array(Arena *arena, U64Array arr); internal String8List remove_duplicates_str8_list(Arena *arena, String8List list); +/////////////////////////////////////////////////////////////////////////////////////////// + +typedef union +{ + String8 key_string; + void *key_raw; + U32 key_u32; + U64 key_u64; +} HashMapKey; + +typedef union +{ + String8 value_string; + void *value_raw; + U32 value_u32; + U64 value_u64; +} HashMapValue; + +typedef struct +{ + HashMapKey key; + HashMapValue value; +} HashMapKeyValue; + +typedef union HashMapNode HashMapNode; +union HashMapNode +{ + struct { + HashMapNode *children[4]; + HashMapKeyValue v; + B32 is_live; + }; + HashMapNode *next; +}; + +typedef struct HashMap +{ + HashMapNode *root; + U64 count; + U64 tombstone_count; + HashMapNode *free_list; +} HashMap; + +#define HASH_MAP_KEY_MATCH(name) B32 name(HashMapKey *a, HashMapKey *b) +typedef HASH_MAP_KEY_MATCH(HashMapKeyMatchFunc); + +internal U64 hash_map_hasher(String8 string); + +internal HashMapNode * hash_map_search(HashMap *hm, U64 hash, HashMapKey key, HashMapKeyMatchFunc *match_func); +internal HashMapNode * hash_map_push(Arena *arena, HashMap *hm, U64 hash, HashMapKeyValue key_value, HashMapKeyMatchFunc *match_func); +internal B32 hash_map_purge_item(HashMap *hm, U64 hash, HashMapKey key, HashMapKeyMatchFunc *match_func); +internal void hash_map_purge(HashMap *hm); + +internal HashMapNode * hash_map_push_string_string(Arena *arena, HashMap *hm, String8 key, String8 value); +internal HashMapNode * hash_map_push_string_raw (Arena *arena, HashMap *hm, String8 key, void *value); +internal HashMapNode * hash_map_push_string_u64 (Arena *arena, HashMap *hm, String8 key, U64 value); +internal HashMapNode * hash_map_push_u32_raw (Arena *arena, HashMap *hm, U32 key, void *value); +internal HashMapNode * hash_map_push_u32_string (Arena *arena, HashMap *hm, U32 key, String8 value); +internal HashMapNode * hash_map_push_u64_raw (Arena *arena, HashMap *hm, U64 key, void *value); +internal HashMapNode * hash_map_push_u64_string (Arena *arena, HashMap *hm, U64 key, String8 value); +internal HashMapNode * hash_map_push_u64_u64 (Arena *arena, HashMap *hm, U64 key, U64 value); +internal HashMapNode * hash_map_push_path_u64 (Arena *arena, HashMap *hm, String8 path, U64 value); +internal HashMapNode * hash_map_push_path_string (Arena *arena, HashMap *hm, String8 path, String8 value); +internal HashMapNode * hash_map_push_path_raw (Arena *arena, HashMap *hm, String8 path, void *value); + +internal void * hash_map_search_string_raw(HashMap *hm, String8 key); +internal U32 * hash_map_search_string_u32(HashMap *hm, String8 key); +internal U64 * hash_map_search_string_u64(HashMap *hm, String8 key); +internal void * hash_map_search_path_raw (HashMap *hm, String8 key); +internal void * hash_map_search_u64_raw (HashMap *hm, U64 key); +internal U64 * hash_map_search_u64_u64 (HashMap *hm, U64 key); +internal void * hash_map_search_raw_raw (HashMap *hm, void *key); + +internal HashMapKeyValue * key_value_from_hash_map (Arena *arena, HashMap *hm); +internal U32 * keys_from_hash_map_u32 (Arena *arena, HashMap *hm); +internal U64 * keys_from_hash_map_u64 (Arena *arena, HashMap *hm); +internal String8 * keys_from_hash_map_string(Arena *arena, HashMap *hm); +internal void * keys_from_hash_map_raw (Arena *arena, HashMap *hm); +internal U64 * values_from_hash_map_u64 (Arena *arena, HashMap *hm); + +internal void sort_hash_map_key_value_u32 (HashMapKeyValue *pairs, U64 count); +internal void sort_hash_map_key_value_u64 (HashMapKeyValue *pairs, U64 count); +internal void sort_hash_map_key_value_string(HashMapKeyValue *pairs, U64 count); + diff --git a/src/torture/torture_base.c b/src/torture/torture_base.c index ee6e7ca8..12929bf1 100644 --- a/src/torture/torture_base.c +++ b/src/torture/torture_base.c @@ -176,4 +176,169 @@ TEST(match_wildcard) T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("?*?"), 0) == 0); } +TEST(hash_map) +{ + { + HashMap hm = {0}; + + U64 test_count = 256; + for EachIndex(i, test_count) { hash_map_push_u64_u64(arena, &hm, i, i*2); } + + // test tombstone reuse + for (U64 i = 10; i < test_count; ++i) { + HashMapNode *test_node = hash_map_search(&hm, hash_map_hasher(str8_struct(&i)), (HashMapKey){ .key_u64 = i }, hash_map_match_u64); + T_Ok(hash_map_purge_u64(&hm, i) == 1); + T_Ok(hash_map_push_u64_u64(arena, &hm, i, 10) == test_node); + } + + // delete some items and after search them + for (U64 i = 0; i < 10; ++i) { + T_Ok(hash_map_purge_u64(&hm, i)); + } + T_Ok(hm.tombstone_count == 10); + for (U64 i = 0; i < 10; ++i) { + T_Ok(hash_map_search_u64_raw(&hm, i) == 0); + } + + // extract pairs and test sorting + HashMapKeyValue *pairs = key_value_from_hash_map(arena, &hm); + sort_hash_map_key_value_u64(pairs, hm.count); + for (U64 i = 1; i < hm.count; ++i) { + T_Ok(pairs[i-1].key.key_u64 < pairs[i].key.key_u64); + } + + // did purge put all the nodes on free list? + hash_map_purge(&hm); + U64 free_list_count = 0; + for (HashMapNode *n = hm.free_list; n != 0; n = n->next) { free_list_count += 1; } + T_Ok(free_list_count == test_count); + } + + // test search through tombstones + { + HashMap hm = {0}; + + U64 hash = 12345; + + hash_map_push(arena, &hm, hash, (HashMapKeyValue){ .key = { .key_u64 = 1 }, .value = { .value_u64 = 10 } }, hash_map_match_u64); + hash_map_push(arena, &hm, hash, (HashMapKeyValue){ .key = { .key_u64 = 2 }, .value = { .value_u64 = 20 } }, hash_map_match_u64); + hash_map_push(arena, &hm, hash, (HashMapKeyValue){ .key = { .key_u64 = 3 }, .value = { .value_u64 = 30 } }, hash_map_match_u64); + + T_Ok(hash_map_purge_u64(&hm, 1)); + + T_Ok(hash_map_search(&hm, hash, (HashMapKey){ .key_u64 = 2 }, hash_map_match_u64)->v.value.value_u64 == 20); + T_Ok(hash_map_search(&hm, hash, (HashMapKey){ .key_u64 = 3 }, hash_map_match_u64)->v.value.value_u64 == 30); + } + + // interleaved purges + { + HashMap hm = {0}; + for EachIndex(round, 100) { + for EachIndex(i, 256) { hash_map_push_u64_u64(arena, &hm, i, round); } + for (U64 i = 0; i < 256; i += 2) { hash_map_purge_u64(&hm, i); } + for (U64 i = 0; i < 256; i += 2) { hash_map_push_u64_u64(arena, &hm, i, round + 1); } + + T_Ok(hm.count == 256); + T_Ok(hm.tombstone_count == 0); + } + + for EachIndex(i, 100) { + T_Ok(hash_map_purge_u64(&hm, 123123123 + i) == 0); + } + } + + // empty hash map test + { + HashMap hm = {0}; + + T_Ok(hash_map_search_u64_raw(&hm, 123) == 0); + T_Ok(hash_map_purge_u64(&hm, 123) == 0); + + HashMapKeyValue *pairs = key_value_from_hash_map(arena, &hm); + T_Ok(pairs == 0 || hm.count == 0); + + hash_map_purge(&hm); + T_Ok(hm.count == 0); + T_Ok(hm.tombstone_count == 0); + } + + // heavy collision + { + HashMap hm = {0}; + + U64 hash = 12345; + U64 count = 1024; + + for EachIndex(i, count) { + hash_map_push(arena, &hm, hash, (HashMapKeyValue){ .key = { .key_u64 = i }, .value = { .value_u64 = i*3 } }, hash_map_match_u64); + } + + for EachIndex(i, count) { + T_Ok(hash_map_search(&hm, hash, (HashMapKey){ .key_u64 = i }, hash_map_match_u64)->v.value.value_u64 == i*3); + } + } + + // duplicate key test + { + HashMap hm = {0}; + + U64 a = 1; + U64 b = 2; + + HashMapNode *n0 = hash_map_push_u64_u64(arena, &hm, 1, a); + HashMapNode *n1 = hash_map_push_u64_u64(arena, &hm, 1, b); + + T_Ok(hm.count == 1); + T_Ok(n0 == n1); + U64 test = *hash_map_search_u64_u64(&hm, 1); + T_Ok(test != b); + } + + // test paths + { + HashMap hm = {0}; + + U64 foo = 0; + U64 bar = 1; + + hash_map_push_path_raw(arena, &hm, str8_lit("c:/DEVEL/test"), &foo); + hash_map_push_path_raw(arena, &hm, str8_lit("c:\\DEVEL\\test"), &foo); + hash_map_push_path_raw(arena, &hm, str8_lit("c:/devel\\test"), &foo); + + hash_map_push_path_raw(arena, &hm, str8_lit("/mnt/devel"), &bar); + hash_map_push_path_raw(arena, &hm, str8_lit("/MNT/devel"), &bar); + + T_Ok(hm.count == 2); + + T_Ok(hash_map_search_path_raw(&hm, str8_lit("c:/devel/test")) == &foo); + T_Ok(hash_map_search_path_raw(&hm, str8_lit("c:\\devel\\TEST")) == &foo); + T_Ok(hash_map_search_path_raw(&hm, str8_lit("/mnt/devel")) == &bar); + T_Ok(hash_map_search_path_raw(&hm, str8_lit("/MNT/DEVEL")) == &bar); + } + + // test strings + { + HashMap hm = {0}; + + U64 foo = 0; + U64 bar = 1; + + hash_map_push_string_raw(arena, &hm, str8_lit("c:/DEVEL/test"), &foo); + hash_map_push_string_raw(arena, &hm, str8_lit("c:\\DEVEL\\test"), &foo); + hash_map_push_string_raw(arena, &hm, str8_lit("c:/devel\\test"), &foo); + + hash_map_push_string_raw(arena, &hm, str8_lit("/mnt/devel"), &bar); + hash_map_push_string_raw(arena, &hm, str8_lit("/MNT/devel"), &bar); + + T_Ok(hm.count == 5); + + T_Ok(hash_map_search_string_raw(&hm, str8_lit("c:/DEVEL/test")) == &foo); + T_Ok(hash_map_search_string_raw(&hm, str8_lit("c:\\DEVEL\\test")) == &foo); + T_Ok(hash_map_search_string_raw(&hm, str8_lit("c:/devel\\test")) == &foo); + + T_Ok(hash_map_search_string_raw(&hm, str8_lit("/mnt/devel")) == &bar); + T_Ok(hash_map_search_string_raw(&hm, str8_lit("/MNT/devel")) == &bar); + } +} + #undef T_Group From 1dc72b2bcff369b769660670dd814dde70a885a9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 15 May 2026 14:32:45 -0700 Subject: [PATCH 552/850] replace single-hop associative section walk to multi-hop --- src/base/base_core.h | 2 + src/linker/hash_table.c | 19 ++ src/linker/hash_table.h | 3 + src/linker/lnk.c | 470 ++++++++++++++++++---------------- src/linker/lnk.h | 10 +- src/linker/lnk_debug_info.c | 13 +- src/linker/lnk_log.h | 2 + src/linker/lnk_symbol_table.c | 46 ++++ src/linker/lnk_symbol_table.h | 1 + src/pe/pe_make_import_table.c | 11 +- 10 files changed, 343 insertions(+), 234 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index 493519ab..01e56b26 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -267,6 +267,7 @@ # define ins_atomic_u32_add_eval(x,c) InterlockedAdd((LONG *)(x), (c)) # define ins_atomic_u8_eval_assign(x,c) InterlockedExchange8((CHAR *)(x), (c)) # define ins_atomic_u8_or(x,c) InterlockedOr8((char *)(x), (char)c) +# define ins_atomic_u32_or(x,c) InterlockedOr((LONG *)(x), (LONG)c) # else # error Atomic intrinsics not defined for this compiler / architecture combination. # endif @@ -286,6 +287,7 @@ # define ins_atomic_u32_eval_cond_assign(x,k,c) ({ U32 _new = (c); __atomic_compare_exchange_n((U32 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) # define ins_atomic_u8_eval_assign(x,c) __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST) # define ins_atomic_u8_or(x,c) __atomic_fetch_or((U8 *)(x), (U8)(c), __ATOMIC_SEQ_CST) +# define ins_atomic_u32_or(x,c) __atomic_fetch_or((U32 *)(x), (U32)(c), __ATOMIC_SEQ_CST) #else # error Atomic intrinsics not defined for this compiler / architecture. #endif diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index 7280bfc3..6e33adee 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -725,6 +725,18 @@ hash_map_push_u64_u64(Arena *arena, HashMap *hm, U64 key, U64 value) return hash_map_push(arena, hm, hash_map_hasher(str8_struct(&key)), (HashMapKeyValue){ .key = { .key_u64 = key }, .value = { .value_u64 = value } }, hash_map_match_u64); } +internal HashMapNode * +hash_map_push_raw_raw(Arena *arena, HashMap *hm, void *key, void *value) +{ + return hash_map_push(arena, hm, hash_map_hasher(str8_struct(&key)), (HashMapKeyValue){ .key = { .key_raw = key }, .value = { .value_raw = value } }, hash_map_match_raw); +} + +internal HashMapNode * +hash_map_push_raw_u64(Arena *arena, HashMap *hm, void *key, U64 value) +{ + return hash_map_push(arena, hm, hash_map_hasher(str8_struct(&key)), (HashMapKeyValue){ .key = { .key_raw = key }, .value = { .value_u64 = value } }, hash_map_match_u64); +} + internal HashMapNode * hash_map_push_path_u64(Arena *arena, HashMap *hm, String8 path, U64 value) { @@ -794,6 +806,13 @@ hash_map_search_raw_raw(HashMap *hm, void *key) return n ? n->v.value.value_raw : 0; } +internal U64 * +hash_map_search_raw_u64(HashMap *hm, void *key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hasher(str8_struct(&key)), (HashMapKey){ .key_raw = key }, hash_map_match_raw); + return n ? &n->v.value.value_u64 : 0; +} + //////////////////////////////// internal B32 hash_map_purge_u32(HashMap *hm, U32 key) { return hash_map_purge_item(hm, hash_map_hasher(str8_struct(&key)), (HashMapKey){ .key_u32 = key }, hash_map_match_u32); } diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 3f9337b5..1750a8c3 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -169,6 +169,8 @@ internal HashMapNode * hash_map_push_u32_string (Arena *arena, HashMap *hm, U3 internal HashMapNode * hash_map_push_u64_raw (Arena *arena, HashMap *hm, U64 key, void *value); internal HashMapNode * hash_map_push_u64_string (Arena *arena, HashMap *hm, U64 key, String8 value); internal HashMapNode * hash_map_push_u64_u64 (Arena *arena, HashMap *hm, U64 key, U64 value); +internal HashMapNode * hash_map_push_raw_raw (Arena *arena, HashMap *hm, void *key, void *value); +internal HashMapNode * hash_map_push_raw_u64 (Arena *arena, HashMap *hm, void *key, U64 value); internal HashMapNode * hash_map_push_path_u64 (Arena *arena, HashMap *hm, String8 path, U64 value); internal HashMapNode * hash_map_push_path_string (Arena *arena, HashMap *hm, String8 path, String8 value); internal HashMapNode * hash_map_push_path_raw (Arena *arena, HashMap *hm, String8 path, void *value); @@ -180,6 +182,7 @@ internal void * hash_map_search_path_raw (HashMap *hm, String8 key); internal void * hash_map_search_u64_raw (HashMap *hm, U64 key); internal U64 * hash_map_search_u64_u64 (HashMap *hm, U64 key); internal void * hash_map_search_raw_raw (HashMap *hm, void *key); +internal U64 * hash_map_search_raw_u64 (HashMap *hm, void *key); internal HashMapKeyValue * key_value_from_hash_map (Arena *arena, HashMap *hm); internal U32 * keys_from_hash_map_u32 (Arena *arena, HashMap *hm); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 1f2368cf..943e4605 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1968,7 +1968,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer PE_MakeImportList *imports = hash_table_search_path_raw(delayed_imports_ht, dll_name_n->string); String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string); String8 import_obj = pe_make_import_dll_obj_delayed(arena->v[0], time_stamp, config->machine, dll_name_n->string, config->delay_load_helper_name, import_debug_symbols, *imports, emit_biat, emit_uiat); - lnk_inputer_push_obj(inputer, 0, dll_name_n->string, import_obj); + lnk_inputer_push_obj(inputer, 0, str8f(inputer->arena, "Import:%S", dll_name_n->string), import_obj); } String8 linker_debug_symbols = lnk_make_linker_debug_symbols(arena->v[0], config->machine); @@ -1990,7 +1990,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer PE_MakeImportList *imports = hash_table_search_path_raw(static_imports_ht, dll_name_n->string); String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string); String8 import_obj = pe_make_import_dll_obj_static(arena->v[0], time_stamp, config->machine, dll_name_n->string, import_debug_symbols, *imports); - lnk_inputer_push_obj(inputer, 0, dll_name_n->string, import_obj); + lnk_inputer_push_obj(inputer, 0, str8f(inputer->arena, "Import:%S", dll_name_n->string), import_obj); } String8 linker_debug_symbols = lnk_make_linker_debug_symbols(scratch.arena, config->machine); @@ -2395,133 +2395,272 @@ internal THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) { ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); + + Temp scratch = scratch_begin(0,0); + Temp scratch2 = scratch_begin(&scratch.arena, 1); LNK_OptRefTask *task = raw_task; LNK_SymbolTable *symtab = task->symtab; + LNK_Config *config = task->config; + LNK_ObjList objs = task->objs; + + U8 **is_live = 0; + U64 *active_thread_count = 0; + LNK_RelocRefsList *ref_queue = 0; + LNK_RelocRefsList free_list = {0}; + if (task_id == 0) { + active_thread_count = push_array(scratch.arena, U64, 1); + ref_queue = push_array(scratch.arena, LNK_RelocRefsList, 1); + + // alloc live flags for each section + is_live = push_array_no_zero(scratch.arena, U8 *, objs.count); + { + U64 obj_idx = 0; + for EachNode(n, LNK_ObjNode, task->objs.first) { + is_live[obj_idx] = push_array(scratch.arena, U8, n->data.header.section_count_no_null + 1); + + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(&n->data); + for EachIndex(sect_idx, n->data.header.section_count_no_null) { + COFF_SectionHeader *header = §ion_table[sect_idx]; + is_live[obj_idx][sect_idx + 1] = !(header->flags & COFF_SectionFlag_LnkCOMDAT); + } + + obj_idx += 1; + } + } + + // define roots + { + // tls + LNK_Symbol *tls_symbol = lnk_symbol_table_searchf(symtab, MSCRT_TLS_SYMBOL_NAME); + if (tls_symbol) { + lnk_include_symbol(config, str8_lit(MSCRT_TLS_SYMBOL_NAME), 0); + } + + // push tasks for each root symbol + for EachNode(root_n, LNK_IncludeSymbolNode, config->include_symbol_list.first) { + LNK_Symbol *root = lnk_symbol_table_search(symtab, root_n->v.name); + LNK_ObjSymbolRef root_ref = lnk_ref_from_symbol(root); + + LNK_RelocRefs *r = push_array(scratch.arena, LNK_RelocRefs, 1); + r->obj = root_ref.obj; + r->relocs.count = 1; + r->relocs.v = push_array(scratch.arena, COFF_Reloc, 1); + r->relocs.v[0].isymbol = root_ref.symbol_idx; + + lnk_reloc_refs_list_push(scratch.arena, ref_queue, r); + } + + // push task for every non-COMDAT section + for EachNode(obj_n, LNK_ObjNode, objs.first) { + LNK_Obj *obj = &obj_n->data; + for EachIndex(sect_idx, obj->header.section_count_no_null) { + U32 section_number = sect_idx+1; + COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); + + // is section eligible for walking? + if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } + if (section_header->flags & COFF_SectionFlag_LnkCOMDAT) { continue; } + if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } + if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + + // divide relocs and push task for each reloc block + COFF_RelocArray relocs = lnk_coff_reloc_info_from_section_number(obj, section_number); + U64 new_task_count = CeilIntegerDiv(relocs.count, LNK_RELOCS_PER_TASK); + LNK_RelocRefs *new_tasks = push_array(scratch.arena, LNK_RelocRefs, new_task_count); + for EachIndex(new_task_idx, new_task_count) { + LNK_RelocRefs *r = new_tasks + new_task_idx; + r->obj = obj; + r->relocs.count = Min(LNK_RELOCS_PER_TASK, relocs.count - (new_task_idx * LNK_RELOCS_PER_TASK)); + r->relocs.v = relocs.v + (new_task_idx * LNK_RELOCS_PER_TASK); + + lnk_reloc_refs_list_push(scratch.arena, ref_queue, r); + } + } + } + } + } + tp_broadcast(&is_live); + tp_broadcast(&ref_queue); + tp_broadcast(&active_thread_count); - LNK_RelocRefsList free_list = {0}; for (;;) { // update active thread count - ins_atomic_u32_inc_eval(&task->active_thread_count); + ins_atomic_u32_inc_eval(active_thread_count); for (;;) { // pop head node - LNK_RelocRefsNode *node = lnk_reloc_refs_list_pop_node_atomic(task->reloc_refs); + LNK_RelocRefsNode *node = lnk_reloc_refs_list_pop_node_atomic(ref_queue); if (!node) { break; } LNK_RelocRefs *reloc_refs = node->v; - LNK_RelocRefsNode *first_node = 0, *last_node = 0; + for EachIndex(reloc_idx, reloc_refs->relocs.count) { - COFF_Reloc *reloc = &reloc_refs->relocs.v[reloc_idx]; - LNK_ObjSymbolRef reloc_defn = (LNK_ObjSymbolRef){ .obj = reloc_refs->obj, .symbol_idx = reloc->isymbol }; - COFF_ParsedSymbol reloc_parsed = lnk_parsed_symbol_from_coff_symbol_idx(reloc_defn.obj, reloc_defn.symbol_idx); - COFF_SymbolValueInterpType reloc_interp = coff_interp_from_parsed_symbol(reloc_parsed); + COFF_Reloc *reloc = &reloc_refs->relocs.v[reloc_idx]; - LNK_ObjSymbolRef ref_symbol = reloc_defn; - for (;;) { - COFF_ParsedSymbol ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx); - COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); - - LNK_ObjSymbolRef next_ref = {0}; - if (ref_interp == COFF_SymbolValueInterp_Regular) { - LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(ref_symbol.obj, ref_parsed.section_number); - if (symlink) { - ref_symbol = lnk_ref_from_symbol(symlink); - } - break; - } else if (ref_interp == COFF_SymbolValueInterp_Undefined) { - if (reloc_parsed.storage_class == COFF_SymStorageClass_External) { - LNK_Symbol *defn = lnk_symbol_table_search(symtab, ref_parsed.name); - next_ref = lnk_ref_from_symbol(defn); + // reloc -> symbol + LNK_ObjSymbolRef ref_symbol = (LNK_ObjSymbolRef){ .obj = reloc_refs->obj, .symbol_idx = reloc->isymbol }; + { + Temp temp = temp_begin(scratch2.arena); + HashMap seen_hm = {0}; + B32 keep_walking = 1; + do { + // detect cyclic chains + U64 symbol_key = ((U64)ref_symbol.obj->input_idx << 32ull) | (U64)ref_symbol.symbol_idx; + if (hash_map_search_u64_u64(&seen_hm, symbol_key) == 0) { + hash_map_push_u64_u64(temp.arena, &seen_hm, symbol_key, 1); } else { + COFF_ParsedSymbol reloc_parsed = lnk_parsed_symbol_from_coff_symbol_idx(reloc_refs->obj, reloc->isymbol); + lnk_error_obj(LNK_Warning_CyclicSymbol, reloc_refs->obj, "symbol %S forms a cyclic chain (/OPT:REF)", reloc_parsed.name); MemoryZeroStruct(&ref_symbol); break; } - } else if (ref_interp == COFF_SymbolValueInterp_Weak) { - LNK_Symbol *defn = lnk_symbol_table_search(symtab, ref_parsed.name); - next_ref = lnk_ref_from_symbol(defn); - } else { - break; - } - if (MemoryMatchStruct(&next_ref, &ref_symbol)) { - MemoryZeroStruct(&ref_symbol); - break; - } - ref_symbol = next_ref; + // unpack symbol + COFF_ParsedSymbol ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx); + COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); + + // resolve symbol + LNK_ObjSymbolRef next_ref = {0}; + if (lnk_resolve_symbol(symtab, ref_symbol, &next_ref)) { + keep_walking = (ref_interp == COFF_SymbolValueInterp_Weak || ref_interp == COFF_SymbolValueInterp_Undefined); + ref_symbol = next_ref; + } else { + keep_walking = 0; + } + } while (keep_walking); + temp_end(temp); } // skip unresolved symbol if (ref_symbol.obj == 0) { continue; } + // unpack resolved symbol COFF_ParsedSymbol ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx); COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); - LNK_Obj *ref_obj = ref_symbol.obj; if (ref_interp == COFF_SymbolValueInterp_Regular) { - // make section number list (reloc section + associates) - U32Node *section_number_list = push_array(scratch.arena, U32Node, 1); - section_number_list->data = ref_parsed.section_number; - section_number_list->next = ref_obj->associated_sections[ref_parsed.section_number]; + Temp temp = temp_begin(scratch2.arena); - // push section headers relocations to the task stack - for EachNode(section_number_n, U32Node, section_number_list) { - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(ref_obj, section_number_n->data); + HashMap visited_sections_hm = {0}; + U32Node *stack = push_array(temp.arena, U32Node, 1); + stack->data = ref_parsed.section_number; + do { + U32 section_number = stack->data; + SLLStackPop(stack); + + // is section number valid? + if (section_number == 0 || section_number > ref_symbol.obj->header.section_count_no_null) { continue; } + + // detect cyclic associative sections + if (hash_map_search_u64_u64(&visited_sections_hm, section_number)) { continue; } + hash_map_push_u64_u64(temp.arena, &visited_sections_hm, section_number, 1); + + // push associated section + for EachNode(associated_n, U32Node, ref_symbol.obj->associated_sections[section_number]) { + if (hash_map_search_u64_u64(&visited_sections_hm, associated_n->data)) { continue; } + U32Node *stack_n = push_array(temp.arena, U32Node, 1); + stack_n->data = associated_n->data; + SLLStackPush(stack, stack_n); + } + + COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(ref_symbol.obj, section_number); // is section eligible for walking? if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } - if (section_header->flags & LNK_SECTION_FLAG_LIVE) { continue; } - // mark section live - section_header->flags |= LNK_SECTION_FLAG_LIVE; + // on first section visit set live flag and queue new section to walk + U8 was_visited = ins_atomic_u8_eval_assign(&is_live[ref_symbol.obj->input_idx][section_number], 1); + if (was_visited) { continue; } LNK_RelocRefsNode *node; if (free_list.head.node) { node = lnk_reloc_refs_list_pop_node(&free_list); } else { node = push_array(scratch.arena, LNK_RelocRefsNode, 1); - node->v = push_array(scratch.arena, LNK_RelocRefs, 1); + node->v = push_array(scratch.arena, LNK_RelocRefs, 1); } - node->v->obj = ref_obj; - node->v->relocs = lnk_coff_reloc_info_from_section_number(ref_obj, section_number_n->data); + node->v->obj = ref_symbol.obj; + node->v->relocs = lnk_coff_reloc_info_from_section_number(ref_symbol.obj, section_number); if (first_node == 0) { - first_node = node; - last_node = node; + first_node = node, last_node = node; } else { node->next = first_node; first_node = node; } - } + } while (stack); + + temp_end(temp); } } + // free walk node lnk_reloc_refs_list_push_node(&free_list, node); + // queue new walks if (first_node && last_node) { - lnk_reloc_refs_list_concat_in_place(task->reloc_refs, first_node, last_node); + lnk_reloc_refs_list_concat_in_place(ref_queue, first_node, last_node); } } // are all threads done walking? - U32 active_thread_count = ins_atomic_u32_dec_eval(&task->active_thread_count); - if (active_thread_count == 0 && ins_atomic_ptr_eval(&task->reloc_refs->head.node) == 0) { - break; + { + U32 c = ins_atomic_u32_dec_eval(active_thread_count); + if (c == 0 && ins_atomic_ptr_eval(&ref_queue->head.node) == 0) { + break; + } } // comprehensive solution to the waiting problem - for (; ins_atomic_ptr_eval(&task->reloc_refs->head.node) == 0; ) { + for (; ins_atomic_ptr_eval(&ref_queue->head.node) == 0; ) { // was signaled to exit? - if (ins_atomic_u64_eval(&task->active_thread_count) == 0) { goto exit; } + if (ins_atomic_u32_eval(active_thread_count) == 0) { goto exit; } } } exit:; + barrier_wait(tp->barrier); + // TODO: thread + if (task_id == 0) { + ProfBegin("Remove Unreachable Sections"); + + U64 discard_vsize = 0; + U64 discard_fsize = 0; + U64 discard_count = 0; + + for EachNode(obj_n, LNK_ObjNode, objs.first) { + LNK_Obj *obj = &obj_n->data; + + for EachIndex(sect_idx, obj->header.section_count_no_null) { + U32 section_number = sect_idx+1; + if (is_live[obj->input_idx][section_number]) { continue; } + + COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); + section_header->flags |= COFF_SectionFlag_LnkRemove; + + if (section_header->flags & COFF_SectionFlag_CntUninitializedData) { + discard_vsize += section_header->vsize; + } else { + discard_fsize += section_header->fsize; + } + discard_count += 1; + } + } + + lnk_log(LNK_Log_Debug, "/OPT:REF total virt size discard: %M", (unsigned long long)discard_vsize); + lnk_log(LNK_Log_Debug, "/OPT:REF total file size discard: %M", (unsigned long long)discard_fsize); + lnk_log(LNK_Log_Debug, "/OPT:REF total section discard : %llu", (unsigned long long)discard_count); + + ProfEnd(); + } + barrier_wait(tp->barrier); + + scratch_end(scratch2); scratch_end(scratch); ProfEnd(); } @@ -2529,161 +2668,12 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) internal void lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_ObjList objs) { - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - LNK_RelocRefsList reloc_refs = {0}; - - // - // reset live flag on sections - // - for EachNode(obj_n, LNK_ObjNode, objs.first) { - for EachIndex(sect_idx, obj_n->data.header.section_count_no_null) { - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(&obj_n->data, sect_idx+1); - section_header->flags &= ~LNK_SECTION_FLAG_LIVE; - } - } - - // - // define roots - // - { - // tls - LNK_Symbol *tls_symbol = lnk_symbol_table_searchf(symtab, MSCRT_TLS_SYMBOL_NAME); - if (tls_symbol) { - lnk_include_symbol(config, str8_lit(MSCRT_TLS_SYMBOL_NAME), 0); - } - - // push tasks for each root symbol - for EachNode(root_n, LNK_IncludeSymbolNode, config->include_symbol_list.first) { - LNK_Symbol *root = lnk_symbol_table_search(symtab, root_n->v.name); - LNK_ObjSymbolRef root_ref = lnk_ref_from_symbol(root); - - LNK_RelocRefs *r = push_array(scratch.arena, LNK_RelocRefs, 1); - r->obj = root_ref.obj; - r->relocs.count = 1; - r->relocs.v = push_array(scratch.arena, COFF_Reloc, 1); - r->relocs.v[0].isymbol = root_ref.symbol_idx; - - lnk_reloc_refs_list_push(scratch.arena, &reloc_refs, r); - } - - // push task for every non-COMDAT section - for EachNode(obj_n, LNK_ObjNode, objs.first) { - LNK_Obj *obj = &obj_n->data; - for EachIndex(sect_idx, obj->header.section_count_no_null) { - U32 section_number = sect_idx+1; - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); - - // is section eligible for walking? - if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } - if (section_header->flags & COFF_SectionFlag_LnkCOMDAT) { continue; } - if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } - - // divide relocs and push task for each reloc block - COFF_RelocArray relocs = lnk_coff_reloc_info_from_section_number(obj, section_number); - U64 new_task_count = CeilIntegerDiv(relocs.count, LNK_RELOCS_PER_TASK); - LNK_RelocRefs *new_tasks = push_array(scratch.arena, LNK_RelocRefs, new_task_count); - for EachIndex(new_task_idx, new_task_count) { - LNK_RelocRefs *r = new_tasks + new_task_idx; - r->obj = obj; - r->relocs.count = Min(LNK_RELOCS_PER_TASK, relocs.count - (new_task_idx * LNK_RELOCS_PER_TASK)); - r->relocs.v = relocs.v + (new_task_idx * LNK_RELOCS_PER_TASK); - - lnk_reloc_refs_list_push(scratch.arena, &reloc_refs, r); - } - } - } - } - - // - // walk relocations and mark referenced sections with live flag - // - LNK_OptRefTask task = {0}; - task.symtab = symtab; - task.reloc_refs = &reloc_refs; - tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_walk_relocs_and_mark_ref_sections_task, &task, "Mark Live Sections"); - - ProfBegin("Remove Unreachable Sections"); - for EachNode(obj_n, LNK_ObjNode, objs.first) { - LNK_Obj *obj = &obj_n->data; - - for EachIndex(sect_idx, obj->header.section_count_no_null) { - U32 section_number = sect_idx+1; - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); - - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } - - // remove unreferenced sections - if (~section_header->flags & LNK_SECTION_FLAG_LIVE && section_header->flags & COFF_SectionFlag_LnkCOMDAT) { - section_header->flags |= COFF_SectionFlag_LnkRemove; - } - - // remove associated sections - if (section_header->flags & COFF_SectionFlag_LnkRemove) { - for EachNode(section_number_n, U32Node, obj->associated_sections[section_number]) { - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number_n->data); - section_header->flags |= COFF_SectionFlag_LnkRemove; - } - } - - // TODO: Reset reserved flag so it does not get propagated to the image sections. - // We need to mask out reserved flags when gathering section definitions to actually - // prevent propagation. - section_header->flags &= ~LNK_SECTION_FLAG_LIVE; - } - } - ProfEnd(); - - scratch_end(scratch); - ProfEnd(); -} - -internal B32 -lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *symbol_out) -{ - B32 is_resolved = 1; - COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_coff_symbol_idx(symbol.obj, symbol.symbol_idx); - COFF_SymbolValueInterpType symbol_interp = coff_interp_symbol(symbol_parsed.section_number, symbol_parsed.value, symbol_parsed.storage_class); - switch (symbol_interp) { - case COFF_SymbolValueInterp_Regular: { - LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(symbol.obj, symbol_parsed.section_number); - *symbol_out = symlink ? lnk_ref_from_symbol(symlink) : symbol; - } break; - case COFF_SymbolValueInterp_Weak: { - LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - COFF_ParsedSymbol defn_parsed = lnk_parsed_from_symbol(defn); - COFF_SymbolValueInterpType defn_interp = lnk_interp_from_symbol(defn); - if (defn_interp != COFF_SymbolValueInterp_Undefined) { - *symbol_out = lnk_ref_from_symbol(defn); - } else { - is_resolved = 0; - } - } break; - case COFF_SymbolValueInterp_Undefined: { - LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - if (defn) { - *symbol_out = lnk_ref_from_symbol(defn); - } else { - is_resolved = 0; - } - } break; - case COFF_SymbolValueInterp_Common: { - LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - *symbol_out = lnk_ref_from_symbol(defn); - } break; - case COFF_SymbolValueInterp_Abs: { - if (symbol_parsed.storage_class == COFF_SymStorageClass_External) { - LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); - *symbol_out = lnk_ref_from_symbol(defn); - } else { - *symbol_out = symbol; - } - } break; - case COFF_SymbolValueInterp_Debug: { *symbol_out = symbol; } break; - } - return is_resolved; + ProfScope("Mark Live Sections") + tp_for_parallel(tp, + 0, + tp->worker_count, + lnk_walk_relocs_and_mark_ref_sections_task, + &(LNK_OptRefTask){ .symtab = symtab, .config = config, .objs = objs }); } internal @@ -3728,8 +3718,26 @@ THREAD_POOL_TASK_FUNC(lnk_patch_section_symbols_task) COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class); if (interp == COFF_SymbolValueInterp_Undefined) { if (symbol.storage_class == COFF_SymStorageClass_Section) { + B32 is_referenced = 0; + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + for EachIndex(sect_idx, obj->header.section_count_no_null) { + COFF_SectionHeader *section_header = §ion_table[sect_idx]; + if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } + if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } + if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, section_header); + for EachIndex(reloc_idx, relocs.count) { + if (relocs.v[reloc_idx].isymbol == symbol_idx) { + is_referenced = 1; + break; + } + } + if (is_referenced) { break; } + } + if (!is_referenced) { continue; } + LNK_Section *sect = lnk_section_table_search(task->sectab, symbol.name, symbol.value); - if (sect) { + if (sect && (~sect->flags & COFF_SectionFlag_LnkRemove)) { if (~sect->flags & COFF_SectionFlag_MemDiscardable) { LNK_SectionContrib *first_sc = lnk_get_first_section_contrib(sect); if (obj->header.is_big_obj) { @@ -3747,7 +3755,32 @@ THREAD_POOL_TASK_FUNC(lnk_patch_section_symbols_task) lnk_error_obj(LNK_Error_SectRefsDiscardedMemory, obj, "symbol %S (No. 0x%llx) references section with discard flag", symbol.name, symbol_idx); } } else { - lnk_error_obj(LNK_Error_UnresolvedSymbol, obj, "undefined section symbol %S (No 0x%llx) refers to an image section that doesn't exist", symbol.name, symbol_idx); + U64 fallback_voff = 0; + U64 fallback_align = Max(task->sect_align, KB(4)); + for EachIndex(sect_idx, task->image_sects.count) { + LNK_Section *image_sect = task->image_sects.v[sect_idx]; + U64 image_sect_size = AlignPow2(Max(image_sect->vsize, image_sect->fsize), fallback_align); + if (image_sect_size == 0) { image_sect_size = fallback_align; } + fallback_voff = Max(fallback_voff, image_sect->voff + image_sect_size); + } + fallback_voff = AlignPow2(fallback_voff, fallback_align); + + LNK_Section *fallback_sect = task->image_sects.v[task->image_sects.count-1]; + U32 fallback_section_number = safe_cast_u32(fallback_sect->sect_idx + 1); + U32 fallback_section_offset = safe_cast_u32(fallback_voff - fallback_sect->voff); + if (obj->header.is_big_obj) { + COFF_Symbol32 *symbol32 = symbol.raw_symbol; + symbol32->section_number = fallback_section_number; + symbol32->value = fallback_section_offset; + symbol32->storage_class = COFF_SymStorageClass_Static; + } else { + COFF_Symbol16 *symbol16 = symbol.raw_symbol; + symbol16->section_number = safe_cast_u16(fallback_section_number); + symbol16->value = fallback_section_offset; + symbol16->storage_class = COFF_SymStorageClass_Static; + } + + lnk_error_obj(LNK_Warning_UndefinedSectionSymbol, obj, "undefined section symbol %S (No. 0x%llx) refers to an image section that doesn't exist; patching to %#llx", symbol.name, symbol_idx, fallback_voff); } } } @@ -4275,6 +4308,7 @@ lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolT .objs = objs, .function_pad_min = config->function_pad_min, .default_align = coff_default_align_from_machine(config->machine), + .sect_align = config->sect_align, .null_sc = push_array(arena->v[0], LNK_SectionContrib, 1), }; diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 7ce1ebe3..e5a24863 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -73,8 +73,7 @@ typedef struct LNK_Inputer #define LNK_IMPORT_STUB "*** RAD_IMPORT_STUB ***" #define LNK_NULL_SYMBOL "*** RAD_NULL_SYMBOL ***" -#define LNK_SECTION_FLAG_LIVE (1 << 0) -#define LNK_SECTION_FLAG_DEBUG (1 << 1) +#define LNK_SECTION_FLAG_DEBUG (1 << 0) typedef U8 LNK_LibMemberFlags; enum @@ -214,9 +213,9 @@ typedef struct typedef struct { - LNK_SymbolTable *symtab; - U32 active_thread_count; - LNK_RelocRefsList *reloc_refs; + LNK_SymbolTable *symtab; + LNK_Config *config; + LNK_ObjList objs; } LNK_OptRefTask; typedef struct @@ -263,6 +262,7 @@ typedef struct LNK_Obj **objs; U64 function_pad_min; U64 default_align; + U64 sect_align; LNK_SectionContrib *null_sc; LNK_SectionContrib ***sect_map; HashTable *contribs_ht; diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index b6d998d1..a88682dc 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -2407,14 +2407,16 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) if (obj_sect_header->flags & COFF_SectionFlag_LnkRemove) { continue; } if (obj_sect_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + String8 header_name = str8_cstring_capped(obj_sect_header->name, obj_sect_header->name + sizeof(obj_sect_header->name)); + if (str8_match(header_name, str8_lit(".pdata"), 0)) { continue; } + U64 sect_number; String8 sect_data; U32 sect_off; U32 data_crc; if (obj_sect_header->flags & COFF_SectionFlag_CntUninitializedData) { - if (obj_sect_header->vsize == 0) { - continue; - } + if (obj_sect_header->vsize == 0) { continue; } + U64 sect_num = rng1u64_array_num_from_value__binary_search(&task->image_section_virt_ranges, obj_sect_header->voff); sect_number = sect_num-1; Assert(sect_number < task->image_section_virt_ranges.count); @@ -2422,9 +2424,8 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) sect_off = obj_sect_header->voff - task->image_section_virt_ranges.v[sect_number].min; data_crc = 0; } else { - if (obj_sect_header->fsize == 0) { - continue; - } + if (obj_sect_header->fsize == 0) { continue; } + U64 sect_num = rng1u64_array_num_from_value__binary_search(&task->image_section_file_ranges, obj_sect_header->foff); sect_number = sect_num-1; Assert(sect_number < task->image_section_file_ranges.count); diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index 781a4a20..dc94d47f 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -109,6 +109,8 @@ typedef enum LNK_Warning_TryingToExportEntryPoint, LNK_Warning_InferAsanFail, LNK_Warning_GHash, + LNK_Warning_UndefinedSectionSymbol, + LNK_Warning_CyclicSymbol, LNK_Warning_Last, LNK_Error_Count diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index dc9f37a0..4b945827 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -708,6 +708,52 @@ exit:; return is_resolved; } +internal B32 +lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *symbol_out) +{ + B32 is_resolved = 1; + COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_coff_symbol_idx(symbol.obj, symbol.symbol_idx); + COFF_SymbolValueInterpType symbol_interp = coff_interp_symbol(symbol_parsed.section_number, symbol_parsed.value, symbol_parsed.storage_class); + switch (symbol_interp) { + case COFF_SymbolValueInterp_Regular: { + LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(symbol.obj, symbol_parsed.section_number); + *symbol_out = symlink ? lnk_ref_from_symbol(symlink) : symbol; + } break; + case COFF_SymbolValueInterp_Weak: { + LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); + COFF_ParsedSymbol defn_parsed = lnk_parsed_from_symbol(defn); + COFF_SymbolValueInterpType defn_interp = lnk_interp_from_symbol(defn); + if (defn_interp != COFF_SymbolValueInterp_Undefined) { + *symbol_out = lnk_ref_from_symbol(defn); + } else { + is_resolved = 0; + } + } break; + case COFF_SymbolValueInterp_Undefined: { + LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); + if (defn) { + *symbol_out = lnk_ref_from_symbol(defn); + } else { + is_resolved = 0; + } + } break; + case COFF_SymbolValueInterp_Common: { + LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); + *symbol_out = lnk_ref_from_symbol(defn); + } break; + case COFF_SymbolValueInterp_Abs: { + if (symbol_parsed.storage_class == COFF_SymStorageClass_External) { + LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name); + *symbol_out = lnk_ref_from_symbol(defn); + } else { + *symbol_out = symbol; + } + } break; + case COFF_SymbolValueInterp_Debug: { *symbol_out = symbol; } break; + } + return is_resolved; +} + internal THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task) { diff --git a/src/linker/lnk_symbol_table.h b/src/linker/lnk_symbol_table.h index 7ca55350..cdf38304 100644 --- a/src/linker/lnk_symbol_table.h +++ b/src/linker/lnk_symbol_table.h @@ -134,6 +134,7 @@ internal U64 lnk_foff_from_symbol(COFF_SectionHeader **image_section_table, // --- Weak Symbol ------------------------------------------------------------- internal B32 lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *resolved_symbol_out); +internal B32 lnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *symbol_out); internal void lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab); diff --git a/src/pe/pe_make_import_table.c b/src/pe/pe_make_import_table.c index 450b4a60..8bc39203 100644 --- a/src/pe/pe_make_import_table.c +++ b/src/pe/pe_make_import_table.c @@ -268,7 +268,8 @@ pe_make_import_dll_obj_static(Arena *arena, COFF_TimeStamp time_stamp, COFF_Mach COFF_ObjSection *iat_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".idata$5"), PE_IDATA_SECTION_FLAGS|import_align, str8_zero()); COFF_ObjSection *int_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".idata$6"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, str8_zero()); COFF_ObjSection *dll_name_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".idata$7"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, dll_name_cstr); - COFF_ObjSection *code_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text$zz"), PE_TEXT_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_zero()); + COFF_ObjSection *code_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text$zz"), PE_TEXT_SECTION_FLAGS |COFF_SectionFlag_Align1Bytes, str8_zero()); + COFF_ObjSection *debug_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols); COFF_ObjSymbol *ilt_symbol = coff_obj_writer_push_symbol_static(obj_writer, ilt_sect->name, 0, ilt_sect); COFF_ObjSymbol *iat_symbol = coff_obj_writer_push_symbol_static(obj_writer, iat_sect->name, 0, iat_sect); @@ -352,10 +353,10 @@ pe_make_import_dll_obj_delayed(Arena *arena, COFF_TimeStamp time_stamp, COFF_Mac // DLL handle U64 handle_size = coff_word_size_from_machine(machine); - U8 *handle = push_array(obj_writer->arena, U8, handle_size); + U8 *handle = push_array(obj_writer->arena, U8, handle_size); // import align - U64 import_size = coff_word_size_from_machine(machine); + U64 import_size = coff_word_size_from_machine(machine); COFF_SectionFlags import_align = coff_section_flag_from_align_size(import_size); // push sections @@ -364,8 +365,8 @@ pe_make_import_dll_obj_delayed(Arena *arena, COFF_TimeStamp time_stamp, COFF_Mac COFF_ObjSection *iat_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".didat$5"), PE_IDATA_SECTION_FLAGS|import_align, str8_zero()); COFF_ObjSection *int_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".didat$6"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, str8_zero()); COFF_ObjSection *dll_name_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".didat$7"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, dll_name_cstr); - COFF_ObjSection *code_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text$"), PE_TEXT_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_zero()); - COFF_ObjSection *handle_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data$"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_array(handle, handle_size)); + COFF_ObjSection *code_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".text$"), PE_TEXT_SECTION_FLAGS |COFF_SectionFlag_Align1Bytes, str8_zero()); + COFF_ObjSection *handle_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".data$"), PE_DATA_SECTION_FLAGS |COFF_SectionFlag_Align1Bytes, str8_array(handle, handle_size)); COFF_ObjSection *debug_sect = coff_obj_writer_push_section(obj_writer, str8_lit(".debug$S"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols); COFF_ObjSection *biat_sect = 0; COFF_ObjSection *uiat_sect = 0; From 2f2c975a4a100db21fb4c353afed05085125a354 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 17:34:59 -0700 Subject: [PATCH 553/850] unpoison released memory --- src/base/base_arena.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/base/base_arena.c b/src/base/base_arena.c index c83db36f..f765f700 100644 --- a/src/base/base_arena.c +++ b/src/base/base_arena.c @@ -168,6 +168,7 @@ arena_release(Arena *arena) for(Arena *n = arena->current, *prev = 0; n != 0; n = prev) { prev = n->prev; + AsanUnpoisonMemoryRegion(n, n->cmt); release_memory(n, n->res); } } @@ -324,6 +325,7 @@ arena_pop_to(Arena *arena, U64 pos) for(Arena *prev = 0; current->base_pos >= big_pos; current = prev) { prev = current->prev; + AsanUnpoisonMemoryRegion(current, current->cmt); release_memory(current, current->res); } #endif From e1e8ba826de45a3726b1260d7013f2704eda0046 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 14 May 2026 16:43:22 -0700 Subject: [PATCH 554/850] fix duplicate defer import link --- src/linker/hash_table.c | 13 ++ src/linker/hash_table.h | 1 + src/linker/lnk.c | 112 ++++++++---- src/linker/lnk.h | 4 +- src/torture/torture_radlink.c | 322 +++++++++++++++++++++++++++++++++- 5 files changed, 410 insertions(+), 42 deletions(-) diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index 6e33adee..a47e8929 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -757,6 +757,19 @@ hash_map_push_path_raw(Arena *arena, HashMap *hm, String8 path, void *value) //////////////////////////////// +internal void * +hash_map_search_stringf_raw(HashMap *hm, char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + void *raw = hash_map_search_string_raw(hm, string); + va_end(args); + scratch_end(scratch); + return raw; +} + internal void * hash_map_search_string_raw(HashMap *hm, String8 key) { diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 1750a8c3..39e46a1d 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -175,6 +175,7 @@ internal HashMapNode * hash_map_push_path_u64 (Arena *arena, HashMap *hm, St internal HashMapNode * hash_map_push_path_string (Arena *arena, HashMap *hm, String8 path, String8 value); internal HashMapNode * hash_map_push_path_raw (Arena *arena, HashMap *hm, String8 path, void *value); +internal void * hash_map_search_stringf_raw(HashMap *hm, char *fmt, ...); internal void * hash_map_search_string_raw(HashMap *hm, String8 key); internal U32 * hash_map_search_string_u32(HashMap *hm, String8 key); internal U64 * hash_map_search_string_u64(HashMap *hm, String8 key); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 943e4605..d4f1f46d 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1487,7 +1487,14 @@ lnk_load_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer } internal void -lnk_queue_lib_member(Arena *arena, LNK_LibMemberRefList *queued_members, LNK_Symbol *link_symbol, LNK_Lib *lib, LNK_LibMemberInfo *member_infos, U32 member_idx) +lnk_queue_lib_member(Arena *arena, + HashMap *imports_hm, + HashMap lib_member_info_hm, + LNK_LibMemberRefList *queued_members, + LNK_Symbol *link_symbol, + LNK_Lib *lib, + LNK_LibMemberInfo *member_infos, + U32 member_idx) { // associate link symbol to lib member for (LNK_Symbol *leader = link_symbol;;) { @@ -1511,22 +1518,42 @@ lnk_queue_lib_member(Arena *arena, LNK_LibMemberRefList *queued_members, LNK_Sym } } - B32 was_linked; + LNK_LibMemberRef *is_thunk_import; + LNK_LibMemberRef *is_addr_import; if (str8_starts_with(link_symbol->name, str8_lit("__imp_"))) { - U8 member_flags = ins_atomic_u8_or(&member_infos[member_idx].flags, LNK_LibMemberFlag_LinkedImp); - was_linked = !(member_flags & LNK_LibMemberFlag_LinkedImp); + is_thunk_import = hash_map_search_string_raw(imports_hm, str8_skip(link_symbol->name, 6)); + is_addr_import = hash_map_search_string_raw(imports_hm, link_symbol->name); } else { - U8 flag = LNK_LibMemberFlag_LinkedRegular; - U8 member_flags = ins_atomic_u8_or(&member_infos[member_idx].flags, LNK_LibMemberFlag_LinkedRegular); - was_linked = !(member_flags & LNK_LibMemberFlag_LinkedRegular); + is_thunk_import = hash_map_search_string_raw(imports_hm, link_symbol->name); + is_addr_import = hash_map_search_stringf_raw(imports_hm, "__imp_%S", link_symbol->name); } - if (was_linked) { - LNK_LibMemberRef *member_ref = push_array(arena, LNK_LibMemberRef, 1); - member_ref->lib = lib; - member_ref->member_idx = member_idx; - member_ref->link_symbol = link_symbol; - lnk_lib_member_ref_list_push_node(queued_members, member_ref); + LNK_LibMemberRef *is_queued_import = is_thunk_import ? is_thunk_import : + is_addr_import ? is_addr_import : 0; + + if (is_queued_import) { + // do not queue second import member link -- flag member and continue + U8 flag = str8_starts_with(link_symbol->name, str8_lit("__imp_")) ? LNK_LibMemberFlag_LinkedImp : LNK_LibMemberFlag_LinkedRegular; + LNK_LibMemberInfo *import_member_infos = hash_map_search_raw_raw(&lib_member_info_hm, is_queued_import->lib); + ins_atomic_u8_or(&import_member_infos[member_idx].flags, flag); + } else { + B32 do_queue; + if (str8_starts_with(link_symbol->name, str8_lit("__imp_"))) { + U8 member_flags = ins_atomic_u8_or(&member_infos[member_idx].flags, LNK_LibMemberFlag_LinkedImp); + do_queue = !(member_flags & LNK_LibMemberFlag_LinkedImp); + } else { + U8 flag = LNK_LibMemberFlag_LinkedRegular; + U8 member_flags = ins_atomic_u8_or(&member_infos[member_idx].flags, LNK_LibMemberFlag_LinkedRegular); + do_queue = !(member_flags & LNK_LibMemberFlag_LinkedRegular); + } + + if (do_queue) { + LNK_LibMemberRef *member_ref = push_array(arena, LNK_LibMemberRef, 1); + member_ref->lib = lib; + member_ref->member_idx = member_idx; + member_ref->link_symbol = link_symbol; + lnk_lib_member_ref_list_push_node(queued_members, member_ref); + } } } @@ -1550,14 +1577,14 @@ THREAD_POOL_TASK_FUNC(lnk_search_lib_task) if (symbol_interp == COFF_SymbolValueInterp_Undefined) { U32 member_idx; if (lnk_search_lib(lib, symbol->name, &member_idx)) { - lnk_queue_lib_member(arena, member_ref_list, symbol, lib, lib_member_infos, member_idx); + lnk_queue_lib_member(arena, task->imports_hm, task->link->lib_member_infos_hm, member_ref_list, symbol, lib, lib_member_infos, member_idx); } } else if (symbol_interp == COFF_SymbolValueInterp_Weak) { COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(symbol_parsed, symbol_ref.obj->header.is_big_obj); if (weak_ext->characteristics == COFF_WeakExt_SearchLibrary) { U32 member_idx; if (lnk_search_lib(lib, symbol->name, &member_idx)) { - lnk_queue_lib_member(arena, member_ref_list, symbol, lib, lib_member_infos, member_idx); + lnk_queue_lib_member(arena, task->imports_hm, task->link->lib_member_infos_hm, member_ref_list, symbol, lib, lib_member_infos, member_idx); } } else if (weak_ext->characteristics == COFF_WeakExt_AntiDependency) { if (search_anti_deps) { @@ -1568,7 +1595,7 @@ THREAD_POOL_TASK_FUNC(lnk_search_lib_task) if (dep_interp == COFF_SymbolValueInterp_Weak) { U32 member_idx; if (lnk_search_lib(lib, symbol_parsed.name, &member_idx)) { - lnk_queue_lib_member(arena, member_ref_list, symbol, lib, lib_member_infos, member_idx); + lnk_queue_lib_member(arena, task->imports_hm, task->link->lib_member_infos_hm, member_ref_list, symbol, lib, lib_member_infos, member_idx); } } } @@ -1624,6 +1651,8 @@ lnk_link_inputs(TP_Context *tp, ProfBeginFunction(); Temp scratch = scratch_begin(arena->v, arena->count); + HashMap imports_hm = {0}; + LNK_LibMemberRefList *member_ref_lists = push_array(scratch.arena, LNK_LibMemberRefList, tp->worker_count); B32 search_anti_deps = 0; for (U64 resolved_members_count = 0; ; resolved_members_count = 0) { @@ -1683,10 +1712,10 @@ lnk_link_inputs(TP_Context *tp, } } - LNK_LibMemberInfo *lib_member_infos = hash_table_search_raw_raw(link->lib_member_infos_ht, lib); + LNK_LibMemberInfo *lib_member_infos = hash_map_search_raw_raw(&link->lib_member_infos_hm, lib); if (lib_member_infos == 0) { lib_member_infos = push_array(link->arena, LNK_LibMemberInfo, lib->member_count); - hash_table_push_raw_raw(link->arena, link->lib_member_infos_ht, lib, lib_member_infos); + hash_map_push_raw_raw(link->arena, &link->lib_member_infos_hm, lib, lib_member_infos); } B32 link_whole_archive = config->whole_archive_all; @@ -1708,12 +1737,20 @@ lnk_link_inputs(TP_Context *tp, } LNK_LibMemberRef *member_refs = push_array(scratch.arena, LNK_LibMemberRef, lib->member_count); for EachIndex(member_idx, lib->member_count) { - lnk_queue_lib_member(arena->v[0], &member_ref_lists[0], null_symbol, lib, lib_member_infos, member_idx); + lnk_queue_lib_member(arena->v[0], &imports_hm, link->lib_member_infos_hm, &member_ref_lists[0], null_symbol, lib, lib_member_infos, member_idx); } } else { // search symbols in lib MemoryZeroTyped(member_ref_lists, tp->worker_count); - LNK_SearchLibTask search_task = { .search_anti_deps = search_anti_deps, .lib = lib, .symtab = symtab, .lib_member_infos = lib_member_infos, .member_ref_lists = member_ref_lists }; + LNK_SearchLibTask search_task = { + .search_anti_deps = search_anti_deps, + .link = link, + .imports_hm = &imports_hm, + .lib = lib, + .symtab = symtab, + .lib_member_infos = lib_member_infos, + .member_ref_lists = member_ref_lists + }; tp_for_parallel(tp, arena, tp->worker_count, lnk_search_lib_task, &search_task); } @@ -1765,6 +1802,25 @@ lnk_link_inputs(TP_Context *tp, switch (member_type) { case COFF_DataType_Import: { + { + LNK_LibMemberRef *is_thunk_import; + LNK_LibMemberRef *is_addr_import; + if (str8_starts_with(member_ref->link_symbol->name, str8_lit("__imp_"))) { + is_thunk_import = hash_map_search_string_raw(&imports_hm, str8_skip(member_ref->link_symbol->name, 6)); + is_addr_import = hash_map_search_string_raw(&imports_hm, member_ref->link_symbol->name); + } else { + is_thunk_import = hash_map_search_string_raw(&imports_hm, member_ref->link_symbol->name); + is_addr_import = hash_map_search_stringf_raw(&imports_hm, "__imp_%S", member_ref->link_symbol->name); + } + if (is_thunk_import != 0 || is_addr_import != 0) { + lnk_invalid_path("duplicate import member queue detected"); + break; + } + } + + // store lib member ref to import + hash_map_push_string_raw(scratch.arena, &imports_hm, member_ref->link_symbol->name, member_ref); + // find import stub LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB)); @@ -1775,10 +1831,8 @@ lnk_link_inputs(TP_Context *tp, member_ref->link_symbol->refs = import_stub->refs; // push import member for import obj generation - if (!(lib_member_infos[member_ref->member_idx].flags & LNK_LibMemberFlag_WasGenQueued)) { - lib_member_infos[member_ref->member_idx].flags |= LNK_LibMemberFlag_WasGenQueued; - lnk_lib_member_ref_list_push_node(&link->imports, member_ref); - } + lnk_lib_member_ref_list_push_node(&link->imports, member_ref); + lib_member_infos[member_ref->member_idx].flags |= LNK_LibMemberFlag_WasGenQueued; } break; case COFF_DataType_BigObj: case COFF_DataType_Obj: { @@ -1867,7 +1921,6 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer link->last_default_lib = &config->input_default_lib_list.first; link->last_obj_lib = &config->input_obj_lib_list.first; link->last_cmd_lib = &config->input_list[LNK_Input_Lib].first; - link->lib_member_infos_ht = hash_table_init(link->arena, Max(config->input_list[LNK_Input_Lib].node_count * 2, 1024)); link->try_to_resolve_entry_point = 1; // input :null_obj @@ -1909,7 +1962,7 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer for EachNode(member_ref, LNK_LibMemberRef, link->imports.first) { LNK_Lib *lib = member_ref->lib; U64 member_idx = member_ref->member_idx; - LNK_LibMemberInfo *member_infos = hash_table_search_raw_raw(link->lib_member_infos_ht, lib); + LNK_LibMemberInfo *member_infos = hash_map_search_raw_raw(&link->lib_member_infos_hm, lib); LNK_Symbol *link_symbol = member_infos[member_idx].link; U32 member_offset = memory_read32(lib->member_offsets + member_idx); @@ -1944,13 +1997,8 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer hash_table_push_path_raw(scratch.arena, imports_ht, import_header.dll_name, import_symbols); } - B32 make_jump_thunk = 1; - if (str8_starts_with(link_symbol->name, str8_lit("__imp_"))) { - LNK_Symbol *thunk_symbol = lnk_symbol_table_search(symtab, str8_skip(link_symbol->name, str8_lit("__imp_").size)); - make_jump_thunk = thunk_symbol != 0; - } - // push make import info + B32 make_jump_thunk = !!(member_infos[member_idx].flags & LNK_LibMemberFlag_LinkedRegular); pe_make_import_header_list_push(scratch.arena, import_symbols, (PE_MakeImport){ .header = member_info.data, .make_jump_thunk = make_jump_thunk }); } AssertAlways(delayed_dll_names.node_count == delayed_imports_ht->count); diff --git a/src/linker/lnk.h b/src/linker/lnk.h index e5a24863..b0685482 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -99,7 +99,7 @@ typedef struct LNK_Link String8Node **last_cmd_lib; String8Node **last_default_lib; String8Node **last_obj_lib; - HashTable *lib_member_infos_ht; + HashMap lib_member_infos_hm; LNK_LibMemberRefList imports; B32 try_to_resolve_entry_point; B32 asan_libs_resolved; @@ -204,6 +204,8 @@ typedef struct LNK_BaseRelocPageArray typedef struct { B32 search_anti_deps; + LNK_Link *link; + HashMap *imports_hm; LNK_SymbolTable *symtab; LNK_Symbol *import_stub; LNK_Lib *lib; diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index b937fac5..1c0bbfab 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -1,15 +1,17 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal T_Linker -t_id_linker(void) -{ - String8 name = str8_chop_last_dot(str8_skip_last_slash(g_linker)); - if (str8_match(name, str8_lit("radlink"), StringMatchFlag_CaseInsensitive)) { return T_Linker_RAD; } - if (str8_match(name, str8_lit("link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_MSVC; } - if (str8_match(name, str8_lit("lld-link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_LLVM; } - return T_Linker_Null; -} +// TODO: +// [x] defer_duplicate_imp_link +// [ ] opt_ref_comdat_undef_section +// [ ] opt_ref_weak_alias_comdat +// [ ] reloc_apply_off_out_of_bounds +// [ ] lib_member_reloc_apply_off_out_of_bounds +// [ ] fold_two_funcs +// [ ] same_but_different +// [ ] fold_diamond +// [ ] cyclic_icf +// [ ] fold_with_largest_align //////////////////////////////// // Def -> COFF @@ -4553,6 +4555,118 @@ TEST(defer_impl_link_to_second_search_pass) T_Ok(g_last_exit_code == 0); } +TEST(defer_duplicate_imp_link) +{ + T_COFF_DefLib bar_lib_any = { + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_DllImportStatic, + .dll_import = { .name = "bar.dll" } + }, + { + .type = T_COFF_DefLibMember_Import, + .import = { "bar.dll", "bar", COFF_ImportBy_Name, COFF_ImportHeader_Code, .hit_or_ordinal = 0 } + }, + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\xff\x25\x00\x00\x00\x00"), .flags = "rx:code" + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("__imp_bar"), + T_COFF_DefSymbol_ExternFunc("qwe", "text", 0), + {0}, + } + } + }, + {0} + } + }; + + T_COFF_DefLib foo_lib_any = { + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_DllImportStatic, + .dll_import = { .name = "foo.dll" } + }, + { + .type = T_COFF_DefLibMember_Import, + .import = { "foo.dll", "bar", COFF_ImportBy_Name, COFF_ImportHeader_Code, .hit_or_ordinal = 0 } + }, + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp("\xff\x25\x00\x00\x00\x00"), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 2, "bar"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("bar"), + T_COFF_DefSymbol_Undef("qwe"), + T_COFF_DefSymbol_ExternFunc("thunk", "text", 0), + {0}, + } + } + }, + {0} + } + }; + + String8 bar_lib = t_coff_from_def_lib(arena, bar_lib_any); + String8 foo_lib = t_coff_from_def_lib(arena, foo_lib_any); + + T_Ok(t_write_file(str8_lit("bar.lib"), bar_lib)); + T_Ok(t_write_file(str8_lit("foo.lib"), foo_lib)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe bar.lib foo.lib entry.obj /include:thunk"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + PE_ParsedStaticImportTable static_imptab = pe_static_imports_from_data(arena, pe.is_pe32, pe.section_count, section_table, exe, pe.data_dir_franges[PE_DataDirectoryIndex_IMPORT]); + COFF_SectionHeader *data_sect = coff_section_header_from_name(str8_zero(), section_table, pe.section_count, str8_lit(".data")); + + T_Ok(static_imptab.count == 1); + + PE_ParsedStaticDLLImport *dll = &static_imptab.v[0]; + T_Ok(str8_matchi(dll->name, str8_lit("foo.dll"))); + + T_Ok(dll->import_count == 1); + PE_ParsedImport *imp = &dll->imports[0]; + T_Ok(imp->type == PE_ParsedImport_Name); + T_Ok(str8_match(imp->u.name.string, str8_lit("bar"), 0)); + + U64 iat_foff = pe_foff_from_voff(exe, &pe, dll->import_address_table_voff); + U64 ilt_foff = pe_foff_from_voff(exe, &pe, dll->import_name_table_voff); + + U64 bar_idx = 0; + U64 bar_iat_addr = 0; + U64 bar_ilt_addr = 0; + str8_deserial_read_struct(exe, iat_foff + bar_idx * sizeof(U64), &bar_iat_addr); + str8_deserial_read_struct(exe, ilt_foff + bar_idx * sizeof(U64), &bar_ilt_addr); + + T_Ok(bar_iat_addr != 0); + T_Ok(bar_ilt_addr != 0); + T_Ok(bar_iat_addr == bar_ilt_addr); + T_Ok(data_sect->voff <= bar_iat_addr && bar_iat_addr < data_sect->voff + data_sect->vsize); +} + TEST(opt_ref_dangling_section) { T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ @@ -6893,4 +7007,194 @@ TEST(fold_with_largest_align) #endif +#if 0 +TEST(reloc_apply_off_out_of_bounds) +{ + T_Ok(t_write_def_obj("bad.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, max_U32, "target"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsStatic("target", 0), + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + })); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe bad.obj"); + T_Ok(g_last_exit_code != 0); +} +#endif + +#if 0 +TEST(lib_member_reloc_apply_off_out_of_bounds) +{ + T_Ok(t_write_def_lib("bad.lib", (T_COFF_DefLib){ + .emit_second_member = 1, + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .path = str8_lit("bad_member.obj"), + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "data", ".data", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rw:data@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32, max_U32, "target"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_AbsStatic("target", 0), + T_COFF_DefSymbol_Extern("bad", "data", 0), + {0} + } + } + }, + {0} + } + })); + + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "text", ".text", str8_lit_comp("\xC3"), .flags = "rx:code@1" }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + {0} + } + })); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /include:bad entry.obj bad.lib"); + T_Ok(g_last_exit_code != 0); +} +#endif + +#if 0 +TEST(opt_ref_comdat_undef_section) +{ + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00\xC3"), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "caller"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("caller"), + {0} + } + })); + + T_Ok(t_write_def_obj("caller.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "caller", ".caller", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT, + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 0, ".target"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("caller", COFF_ComdatSelect_Any), + T_COFF_DefSymbol_Extern("caller", "caller", 0), + T_COFF_DefSymbol_UndefSec(".target", COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead), + {0} + } + })); + + T_Ok(t_write_def_obj("target.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "target", ".target", str8_lit("target"), .flags = "r:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("target", COFF_ComdatSelect_Any), + {0} + } + })); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj caller.obj target.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *target_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".target")); + T_Ok(target_sect != 0); +} +#endif + +#if 0 +TEST(opt_ref_weak_alias_comdat) +{ + T_Ok(t_write_def_obj("weak.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "target", ".target", str8_lit("target"), .flags = "r:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("target", COFF_ComdatSelect_Any), + T_COFF_DefSymbol_Extern("target", "target", 0), + T_COFF_DefSymbol_Weak("weak_target", COFF_WeakExt_SearchAlias, "target"), + {0} + } + })); + + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00\xC3"), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "weak_target"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("weak_target"), + {0} + } + })); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj weak.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *target_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".target")); + T_Ok(target_sect != 0); +} +#endif + #undef T_Group From 6daf0a5e59ae086d84d29c20c09da25ed2de8dc3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 14 May 2026 20:32:19 -0700 Subject: [PATCH 555/850] asan is fine --- src/linker/lnk_io.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index 91371dd8..9f6e7781 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -198,8 +198,8 @@ internal THREAD_POOL_TASK_FUNC(lnk_memory_map_file_task) { LNK_DiskReader *task = raw_task; -#if OS_WINDOWS Temp scratch = scratch_begin(&arena, 1); +#if OS_WINDOWS String16 path16 = str16_from_8(scratch.arena, task->path_arr.v[task_id]); HANDLE file_handle = CreateFileW(path16.str, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (file_handle != INVALID_HANDLE_VALUE) { @@ -209,18 +209,28 @@ THREAD_POOL_TASK_FUNC(lnk_memory_map_file_task) GetFileSizeEx(file_handle, &file_size); void *file_data = MapViewOfFile(mapping_handle, FILE_MAP_COPY, 0, 0, file_size.QuadPart); if (file_data) { - // asan crashes for an unknown reason on memory-mapped files, even though the allocation is perfectly fine - AsanUnpoisonMemoryRegion(file_data, file_size.QuadPart); task->data_arr.v[task_id] = str8(file_data, file_size.QuadPart); } CloseHandle(mapping_handle); } CloseHandle(file_handle); } - scratch_end(scratch); +#elif OS_LINUX + int fd = open((char *)push_cstr(scratch.arena, task->path_arr.v[task_id]).str, O_RDONLY); + if (fd != -1) { + struct stat st = {0}; + if (fstat(fd, &st) == 0) { + void *file_data = mmap(0, st.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + if (file_data != MAP_FAILED) { + task->data_arr.v[task_id] = str8(file_data, st.st_size); + } + } + close(fd); + } #else # error "memory mapping files is not supported on this platform" #endif + scratch_end(scratch); } internal String8Array From 488f4eba9a992e0c753936edb192f1f8d4c588ab Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 14 May 2026 18:31:43 -0700 Subject: [PATCH 556/850] update change log --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 809c77b8..37c68476 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ ## Linker Changes - Implemented /DEBUG:GHASH +- Fixed an issue where an import thunk or import address could be linked from the currently searched library + instead of the library where the first import reference was found. For example, if the first pass finds the import + thunk in foo.lib and the second pass resolves symbol to the import address in bar.lib, the linker now always linkes + the import thunk and import address members from the library where the first reference was found. # v0.9.25-alpha From 0c656563b82ba55683aa84844637f629cce7e195 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 11:50:54 -0700 Subject: [PATCH 557/850] todo --- src/linker/lnk_debug_info.c | 2 +- src/torture/torture_d2r.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index a88682dc..4d4c77e0 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -298,7 +298,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, ProfNoteV("Total .debug$S Input Size: %M", total_debug_s_size); ProfNoteV("Total .debug$T Input Size: %M", total_debug_t_size); ProfNoteV("Total .debug$P Input Size: %M", total_debug_p_size); - ProfNoteV("Total .debug$H Input Size: %M", total_debug_H_size); + ProfNoteV("Total .debug$H Input Size: %M", total_debug_h_size); if (lnk_get_log_status(LNK_Log_Debug)) { lnk_log(LNK_Log_Debug, "[Total .debug$S Input Size %M]", total_debug_s_size); diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index c4f5ace2..7006a8b0 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -1,6 +1,10 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +// TODO: +// +// [ ] d2r_types alias size and byte size on __float80 typedef mismatch + #define T_Group "d2r" internal RDI_Parsed * @@ -94,7 +98,7 @@ dw_writer_tag_end(writer); DeclBaseType(uint128_type, "__int128 unsigned", Unsigned, 16); DeclBaseType(float16_type, "_Float16", Float, 2); DeclBaseType(bfloat16_type, "__bf16", Float, 2); - DeclBaseType(float80_type, "__float80", Float, 16); + //DeclBaseType(float80_type, "__float80", Float, 16); DeclBaseType(float128_type, "_float128", Float, 16); DeclBaseType(complex_float_type, "complex float", ComplexFloat, 8); DeclBaseType(complex_doulbe_type, "complex double", ComplexFloat, 16); @@ -184,7 +188,7 @@ T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), s TestBuiltinType("__int128 unsigned", 16, U128); TestBuiltinType("_Float16", 2, F16); TestBuiltinType("__bf16", 2, BF16); - TestBuiltinType("__float80", 16, F80); + //TestBuiltinType("__float80", 16, F80); TestBuiltinType("_float128", 16, F128); TestBuiltinType("complex float", 8, ComplexF32); TestBuiltinType("complex double", 16, ComplexF64); From 2683206ba270e900cbfea9d3baedae3e293b82e6 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 12:03:51 -0700 Subject: [PATCH 558/850] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37c68476..1993a3af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ instead of the library where the first import reference was found. For example, if the first pass finds the import thunk in foo.lib and the second pass resolves symbol to the import address in bar.lib, the linker now always linkes the import thunk and import address members from the library where the first reference was found. +- /OPT:REF: Fixed an issue with garbage collection of associated sections and weak symbols that led linker to remove + live sections. # v0.9.25-alpha From 8c58086585392fef5b22c483d75b4ee3d419335d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 15:00:40 -0700 Subject: [PATCH 559/850] batch relocations to reduce contention on global reference list --- src/linker/lnk.c | 296 +++++++++++++++++++++++------------------------ src/linker/lnk.h | 26 ++--- 2 files changed, 157 insertions(+), 165 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index d4f1f46d..4ce28cc7 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1813,7 +1813,7 @@ lnk_link_inputs(TP_Context *tp, is_addr_import = hash_map_search_stringf_raw(&imports_hm, "__imp_%S", member_ref->link_symbol->name); } if (is_thunk_import != 0 || is_addr_import != 0) { - lnk_invalid_path("duplicate import member queue detected"); + lnk_log(LNK_Log_Debug, "duplicate import %S member queue detected", member_ref->link_symbol->name); break; } } @@ -2379,62 +2379,53 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer } internal void -lnk_reloc_refs_list_push_node(LNK_RelocRefsList *list, LNK_RelocRefsNode *node) +lnk_reloc_ref_batch_list_push_node(LNK_RelocRefsBatchList *list, LNK_RelocRefsBatch *node) { - LNK_RelocRefsPointer old_head = list->head; + LNK_RelocRefsBatchPointer old_head = list->head; node->next = old_head.node; - list->head = (LNK_RelocRefsPointer){ .node = node, .tag = old_head.tag + 1 }; + list->head = (LNK_RelocRefsBatchPointer){ .node = node, .tag = old_head.tag + 1 }; } -internal LNK_RelocRefsNode * -lnk_reloc_refs_list_pop_node(LNK_RelocRefsList *list) +internal void +lnk_reloc_ref_batch_list_push(Arena *arena, LNK_RelocRefsBatchList *list, LNK_RelocRefs v) { - LNK_RelocRefsPointer old_head = list->head; + LNK_RelocRefsBatch *batch = list->head.node; + if (list->head.node == 0 || list->head.node->count >= ArrayCount(list->head.node->v)) { + batch = push_array(arena, LNK_RelocRefsBatch, 1); + lnk_reloc_ref_batch_list_push_node(list, batch); + } + batch->v[batch->count++] = v; +} + +internal LNK_RelocRefsBatch * +lnk_reloc_ref_batch_list_pop(LNK_RelocRefsBatchList *list) +{ + LNK_RelocRefsBatchPointer old_head = list->head; if (old_head.node) { - list->head = (LNK_RelocRefsPointer){ .node = old_head.node->next, .tag = old_head.tag + 1}; + list->head = (LNK_RelocRefsBatchPointer){ .node = old_head.node->next, .tag = old_head.tag + 1}; } return old_head.node; } -internal LNK_RelocRefsNode * -lnk_reloc_refs_list_push(Arena *arena, LNK_RelocRefsList *list, LNK_RelocRefs *v) +internal LNK_RelocRefsBatch * +lnk_reloc_ref_batch_list_pop_atomic(LNK_RelocRefsBatchList *list) { - LNK_RelocRefsNode *node = push_array(arena, LNK_RelocRefsNode, 1); - node->v = v; - lnk_reloc_refs_list_push_node(list, node); - return node; -} - -internal LNK_RelocRefsNode * -lnk_reloc_refs_list_pop_node_atomic(LNK_RelocRefsList *list) -{ - LNK_RelocRefsPointer old_head = { .node = ins_atomic_ptr_eval(&list->head.node), .tag = ins_atomic_u64_eval(&list->head.tag) }; + LNK_RelocRefsBatchPointer old_head = { .node = ins_atomic_ptr_eval(&list->head.node), .tag = ins_atomic_u64_eval(&list->head.tag) }; for (;;) { if (old_head.node == 0) { break; } - LNK_RelocRefsPointer new_head = { .node = old_head.node->next, .tag = old_head.tag + 1 }; + LNK_RelocRefsBatchPointer new_head = { .node = old_head.node->next, .tag = old_head.tag + 1 }; if (ins_atomic_u128_eval_cond_assign(&list->head, &new_head, &old_head)) { break; } } return old_head.node; } internal void -lnk_reloc_refs_list_push_node_atomic(LNK_RelocRefsList *list, LNK_RelocRefsNode *node) +lnk_reloc_ref_batch_list_concat_in_place_atomic(LNK_RelocRefsBatchList *list, LNK_RelocRefsBatch *first, LNK_RelocRefsBatch *last) { - LNK_RelocRefsPointer old_head = { .node = ins_atomic_ptr_eval(&list->head.node), .tag = ins_atomic_u64_eval(&list->head.tag) }; - for (;;) { - node->next = old_head.node; - LNK_RelocRefsPointer new_head = { .node = node, .tag = old_head.tag + 1 }; - if (ins_atomic_u128_eval_cond_assign(&list->head, &new_head, &old_head)) { break; } - } -} - -internal void -lnk_reloc_refs_list_concat_in_place(LNK_RelocRefsList *list, LNK_RelocRefsNode *first, LNK_RelocRefsNode *last) -{ - LNK_RelocRefsPointer old_head = { .node = ins_atomic_ptr_eval(&list->head.node), .tag = ins_atomic_u64_eval(&list->head.tag) }; + LNK_RelocRefsBatchPointer old_head = { .node = ins_atomic_ptr_eval(&list->head.node), .tag = ins_atomic_u64_eval(&list->head.tag) }; for (;;) { last->next = old_head.node; - LNK_RelocRefsPointer new_head = { .node = first, .tag = old_head.tag + 1 }; + LNK_RelocRefsBatchPointer new_head = { .node = first, .tag = old_head.tag + 1 }; if (ins_atomic_u128_eval_cond_assign(&list->head, &new_head, &old_head)) { break; } } } @@ -2452,13 +2443,12 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) LNK_Config *config = task->config; LNK_ObjList objs = task->objs; - U8 **is_live = 0; - U64 *active_thread_count = 0; - LNK_RelocRefsList *ref_queue = 0; - LNK_RelocRefsList free_list = {0}; + U8 **is_live = 0; + U64 *active_thread_count = 0; + LNK_RelocRefsBatchList *global_batch_list = 0; if (task_id == 0) { - active_thread_count = push_array(scratch.arena, U64, 1); - ref_queue = push_array(scratch.arena, LNK_RelocRefsList, 1); + active_thread_count = push_array(scratch.arena, U64, 1); + global_batch_list = push_array(scratch.arena, LNK_RelocRefsBatchList, 1); // alloc live flags for each section is_live = push_array_no_zero(scratch.arena, U8 *, objs.count); @@ -2490,13 +2480,13 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) LNK_Symbol *root = lnk_symbol_table_search(symtab, root_n->v.name); LNK_ObjSymbolRef root_ref = lnk_ref_from_symbol(root); - LNK_RelocRefs *r = push_array(scratch.arena, LNK_RelocRefs, 1); - r->obj = root_ref.obj; - r->relocs.count = 1; - r->relocs.v = push_array(scratch.arena, COFF_Reloc, 1); - r->relocs.v[0].isymbol = root_ref.symbol_idx; + LNK_RelocRefs r = {0}; + r.obj = root_ref.obj; + r.relocs.count = 1; + r.relocs.v = push_array(scratch.arena, COFF_Reloc, 1); + r.relocs.v[0].isymbol = root_ref.symbol_idx; - lnk_reloc_refs_list_push(scratch.arena, ref_queue, r); + lnk_reloc_ref_batch_list_push(scratch.arena, global_batch_list, r); } // push task for every non-COMDAT section @@ -2513,159 +2503,161 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } // divide relocs and push task for each reloc block - COFF_RelocArray relocs = lnk_coff_reloc_info_from_section_number(obj, section_number); - U64 new_task_count = CeilIntegerDiv(relocs.count, LNK_RELOCS_PER_TASK); - LNK_RelocRefs *new_tasks = push_array(scratch.arena, LNK_RelocRefs, new_task_count); + COFF_RelocArray relocs = lnk_coff_reloc_info_from_section_number(obj, section_number); + U64 relocs_per_batch = 1000; + U64 new_task_count = CeilIntegerDiv(relocs.count, relocs_per_batch); for EachIndex(new_task_idx, new_task_count) { - LNK_RelocRefs *r = new_tasks + new_task_idx; - r->obj = obj; - r->relocs.count = Min(LNK_RELOCS_PER_TASK, relocs.count - (new_task_idx * LNK_RELOCS_PER_TASK)); - r->relocs.v = relocs.v + (new_task_idx * LNK_RELOCS_PER_TASK); - - lnk_reloc_refs_list_push(scratch.arena, ref_queue, r); + LNK_RelocRefs r = {0}; + r.obj = obj; + r.relocs.count = Min(relocs_per_batch, relocs.count - (new_task_idx * relocs_per_batch)); + r.relocs.v = relocs.v + (new_task_idx * relocs_per_batch); + lnk_reloc_ref_batch_list_push(scratch.arena, global_batch_list, r); } } } } } tp_broadcast(&is_live); - tp_broadcast(&ref_queue); + tp_broadcast(&global_batch_list); tp_broadcast(&active_thread_count); + LNK_RelocRefsBatchList free_list = {0}; for (;;) { // update active thread count ins_atomic_u32_inc_eval(active_thread_count); for (;;) { - // pop head node - LNK_RelocRefsNode *node = lnk_reloc_refs_list_pop_node_atomic(ref_queue); - if (!node) { break; } + // pop batch + LNK_RelocRefsBatch *batch = lnk_reloc_ref_batch_list_pop_atomic(global_batch_list); + if (!batch) { break; } - LNK_RelocRefs *reloc_refs = node->v; - LNK_RelocRefsNode *first_node = 0, *last_node = 0; + // walk batch relocations + LNK_RelocRefsBatch *first_batch = 0, *last_batch = 0; + for EachIndex(i, batch->count) { + for EachIndex(reloc_idx, batch->v[i].relocs.count) { + COFF_Reloc *reloc = &batch->v[i].relocs.v[reloc_idx]; - for EachIndex(reloc_idx, reloc_refs->relocs.count) { - COFF_Reloc *reloc = &reloc_refs->relocs.v[reloc_idx]; + // reloc -> symbol + LNK_ObjSymbolRef ref_symbol = (LNK_ObjSymbolRef){ .obj = batch->v[i].obj, .symbol_idx = reloc->isymbol }; + { + Temp temp = temp_begin(scratch2.arena); + HashMap seen_hm = {0}; + B32 keep_walking = 1; + do { + // detect cyclic chains + U64 symbol_key = ((U64)ref_symbol.obj->input_idx << 32ull) | (U64)ref_symbol.symbol_idx; + if (hash_map_search_u64_u64(&seen_hm, symbol_key) == 0) { + hash_map_push_u64_u64(temp.arena, &seen_hm, symbol_key, 1); + } else { + COFF_ParsedSymbol reloc_parsed = lnk_parsed_symbol_from_coff_symbol_idx(batch->v[i].obj, reloc->isymbol); + lnk_error_obj(LNK_Warning_CyclicSymbol, batch->v[i].obj, "symbol %S forms a cyclic chain (/OPT:REF)", reloc_parsed.name); + MemoryZeroStruct(&ref_symbol); + break; + } - // reloc -> symbol - LNK_ObjSymbolRef ref_symbol = (LNK_ObjSymbolRef){ .obj = reloc_refs->obj, .symbol_idx = reloc->isymbol }; - { - Temp temp = temp_begin(scratch2.arena); - HashMap seen_hm = {0}; - B32 keep_walking = 1; - do { - // detect cyclic chains - U64 symbol_key = ((U64)ref_symbol.obj->input_idx << 32ull) | (U64)ref_symbol.symbol_idx; - if (hash_map_search_u64_u64(&seen_hm, symbol_key) == 0) { - hash_map_push_u64_u64(temp.arena, &seen_hm, symbol_key, 1); - } else { - COFF_ParsedSymbol reloc_parsed = lnk_parsed_symbol_from_coff_symbol_idx(reloc_refs->obj, reloc->isymbol); - lnk_error_obj(LNK_Warning_CyclicSymbol, reloc_refs->obj, "symbol %S forms a cyclic chain (/OPT:REF)", reloc_parsed.name); - MemoryZeroStruct(&ref_symbol); - break; - } + // unpack symbol + COFF_ParsedSymbol ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx); + COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); - // unpack symbol - COFF_ParsedSymbol ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx); - COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); + // resolve symbol + LNK_ObjSymbolRef next_ref = {0}; + if (lnk_resolve_symbol(symtab, ref_symbol, &next_ref)) { + keep_walking = (ref_interp == COFF_SymbolValueInterp_Weak || ref_interp == COFF_SymbolValueInterp_Undefined); + ref_symbol = next_ref; + } else { + keep_walking = 0; + } + } while (keep_walking); + temp_end(temp); + } - // resolve symbol - LNK_ObjSymbolRef next_ref = {0}; - if (lnk_resolve_symbol(symtab, ref_symbol, &next_ref)) { - keep_walking = (ref_interp == COFF_SymbolValueInterp_Weak || ref_interp == COFF_SymbolValueInterp_Undefined); - ref_symbol = next_ref; - } else { - keep_walking = 0; - } - } while (keep_walking); - temp_end(temp); - } + // skip unresolved symbol + if (ref_symbol.obj == 0) { continue; } - // skip unresolved symbol - if (ref_symbol.obj == 0) { continue; } + // unpack resolved symbol + COFF_ParsedSymbol ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx); + COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); - // unpack resolved symbol - COFF_ParsedSymbol ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx); - COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed); + if (ref_interp == COFF_SymbolValueInterp_Regular) { + Temp temp = temp_begin(scratch2.arena); - if (ref_interp == COFF_SymbolValueInterp_Regular) { - Temp temp = temp_begin(scratch2.arena); + HashMap visited_sections_hm = {0}; + U32Node *stack = push_array(temp.arena, U32Node, 1); + stack->data = ref_parsed.section_number; + do { + U32 section_number = stack->data; + SLLStackPop(stack); - HashMap visited_sections_hm = {0}; - U32Node *stack = push_array(temp.arena, U32Node, 1); - stack->data = ref_parsed.section_number; - do { - U32 section_number = stack->data; - SLLStackPop(stack); + // is section number valid? + if (section_number == 0 || section_number > ref_symbol.obj->header.section_count_no_null) { continue; } - // is section number valid? - if (section_number == 0 || section_number > ref_symbol.obj->header.section_count_no_null) { continue; } + // detect cyclic associative sections + if (hash_map_search_u64_u64(&visited_sections_hm, section_number)) { continue; } + hash_map_push_u64_u64(temp.arena, &visited_sections_hm, section_number, 1); - // detect cyclic associative sections - if (hash_map_search_u64_u64(&visited_sections_hm, section_number)) { continue; } - hash_map_push_u64_u64(temp.arena, &visited_sections_hm, section_number, 1); + // push associated section + for EachNode(associated_n, U32Node, ref_symbol.obj->associated_sections[section_number]) { + if (hash_map_search_u64_u64(&visited_sections_hm, associated_n->data)) { continue; } + U32Node *stack_n = push_array(temp.arena, U32Node, 1); + stack_n->data = associated_n->data; + SLLStackPush(stack, stack_n); + } - // push associated section - for EachNode(associated_n, U32Node, ref_symbol.obj->associated_sections[section_number]) { - if (hash_map_search_u64_u64(&visited_sections_hm, associated_n->data)) { continue; } - U32Node *stack_n = push_array(temp.arena, U32Node, 1); - stack_n->data = associated_n->data; - SLLStackPush(stack, stack_n); - } + COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(ref_symbol.obj, section_number); - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(ref_symbol.obj, section_number); + // is section eligible for walking? + if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } + if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } + if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } - // is section eligible for walking? - if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } - if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + // on first section visit, set live flag and enqueue section + U8 was_visited = ins_atomic_u8_eval_assign(&is_live[ref_symbol.obj->input_idx][section_number], 1); + if (was_visited) { continue; } - // on first section visit set live flag and queue new section to walk - U8 was_visited = ins_atomic_u8_eval_assign(&is_live[ref_symbol.obj->input_idx][section_number], 1); - if (was_visited) { continue; } + LNK_RelocRefs refs = {0}; + refs.obj = ref_symbol.obj; + refs.relocs = lnk_coff_reloc_info_from_section_number(ref_symbol.obj, section_number); - LNK_RelocRefsNode *node; - if (free_list.head.node) { - node = lnk_reloc_refs_list_pop_node(&free_list); - } else { - node = push_array(scratch.arena, LNK_RelocRefsNode, 1); - node->v = push_array(scratch.arena, LNK_RelocRefs, 1); - } + // get a batch node + LNK_RelocRefsBatch *batch = last_batch; + if (last_batch == 0 || last_batch->count >= ArrayCount(last_batch->v)) { + if (free_list.head.node) { + batch = lnk_reloc_ref_batch_list_pop(&free_list); + MemoryZeroStruct(batch); + } else { + batch = push_array(scratch.arena, LNK_RelocRefsBatch, 1); + } + SLLQueuePush(first_batch, last_batch, batch); + } - node->v->obj = ref_symbol.obj; - node->v->relocs = lnk_coff_reloc_info_from_section_number(ref_symbol.obj, section_number); + batch->v[batch->count++] = refs; - if (first_node == 0) { - first_node = node, last_node = node; - } else { - node->next = first_node; - first_node = node; - } - } while (stack); + } while (stack); - temp_end(temp); + temp_end(temp); + } } } - // free walk node - lnk_reloc_refs_list_push_node(&free_list, node); - // queue new walks - if (first_node && last_node) { - lnk_reloc_refs_list_concat_in_place(ref_queue, first_node, last_node); + if (first_batch && last_batch) { + lnk_reloc_ref_batch_list_concat_in_place_atomic(global_batch_list, first_batch, last_batch); } + + // put batch on the free list + lnk_reloc_ref_batch_list_push_node(&free_list, batch); } // are all threads done walking? { U32 c = ins_atomic_u32_dec_eval(active_thread_count); - if (c == 0 && ins_atomic_ptr_eval(&ref_queue->head.node) == 0) { + if (c == 0 && ins_atomic_ptr_eval(&global_batch_list->head.node) == 0) { break; } } // comprehensive solution to the waiting problem - for (; ins_atomic_ptr_eval(&ref_queue->head.node) == 0; ) { + for (; ins_atomic_ptr_eval(&global_batch_list->head.node) == 0; ) { // was signaled to exit? if (ins_atomic_u32_eval(active_thread_count) == 0) { goto exit; } } diff --git a/src/linker/lnk.h b/src/linker/lnk.h index b0685482..95210356 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -140,9 +140,7 @@ typedef struct LNK_CommonBlockContrib } u; } LNK_CommonBlockContrib; -// --- Ref --------------------------------------------------------------------- - -#define LNK_RELOCS_PER_TASK 0x1000 +// --- Reloc Ref --------------------------------------------------------------- typedef struct LNK_RelocRefs { @@ -150,25 +148,27 @@ typedef struct LNK_RelocRefs COFF_RelocArray relocs; } LNK_RelocRefs; -typedef struct LNK_RelocRefsNode +typedef struct LNK_RelocRefsBatch LNK_RelocRefsBatch; +struct LNK_RelocRefsBatch { - LNK_RelocRefs *v; - struct LNK_RelocRefsNode *next; -} LNK_RelocRefsNode; + LNK_RelocRefsBatch *next; + U64 count; + LNK_RelocRefs v[64]; +}; -typedef union LNK_RelocRefsPointer +typedef union { struct { - LNK_RelocRefsNode *node; + LNK_RelocRefsBatch *node; U64 tag; }; U64 v[2]; -} LNK_RelocRefsPointer; +} LNK_RelocRefsBatchPointer; -typedef struct AlignType(16) LNK_RelocRefsList +typedef struct AlignType(16) { - LNK_RelocRefsPointer head; -} LNK_RelocRefsList; + LNK_RelocRefsBatchPointer head; +} LNK_RelocRefsBatchList; // --- Base Reloc -------------------------------------------------------------- From 034f2bf0d9ae1150fc944b414b2dfa86edf52446 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 16:04:44 -0700 Subject: [PATCH 560/850] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1993a3af..9d7b2d74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ the import thunk and import address members from the library where the first reference was found. - /OPT:REF: Fixed an issue with garbage collection of associated sections and weak symbols that led linker to remove live sections. +- /OPT:REF Added relocation batching to reduce contention on the global reference list during garbage collection. # v0.9.25-alpha From a73105b296892850eb698aad5bb08ffc7ee0f372 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 18:18:18 -0700 Subject: [PATCH 561/850] torture merge build fixes --- src/torture/torture.c | 10 ++++++++++ src/torture/torture_radlink.c | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index f2c285e1..ab8ec208 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -35,6 +35,16 @@ t_string_from_result(T_RunStatus v) return 0; } +internal T_Linker +t_id_linker(void) +{ + String8 name = str8_chop_last_dot(str8_skip_last_slash(g_linker)); + if (str8_match(name, str8_lit("radlink"), StringMatchFlag_CaseInsensitive)) { return T_Linker_RAD; } + if (str8_match(name, str8_lit("link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_MSVC; } + if (str8_match(name, str8_lit("lld-link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_LLVM; } + return T_Linker_Null; +} + internal B32 t_write_file_list(String8 name, String8List data) { diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 1c0bbfab..f19db27b 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4645,7 +4645,7 @@ TEST(defer_duplicate_imp_link) T_Ok(static_imptab.count == 1); PE_ParsedStaticDLLImport *dll = &static_imptab.v[0]; - T_Ok(str8_matchi(dll->name, str8_lit("foo.dll"))); + T_Ok(str8_match(dll->name, str8_lit("foo.dll"), StringMatchFlag_CaseInsensitive)); T_Ok(dll->import_count == 1); PE_ParsedImport *imp = &dll->imports[0]; From 80d68b7f95db102aa60b826842754cf1a716eadd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 18 May 2026 19:40:31 -0700 Subject: [PATCH 562/850] dbg_engine: minidump memory64 parsing; rename switch -> better thing for what it is --- src/dbg_engine/dbg_engine_ctrl.c | 85 +++- src/raddbg/generated/raddbg.meta.c | 12 +- src/raddbg/generated/raddbg.meta.h | 6 +- src/raddbg/raddbg.mdesk | 609 +++++++++++++++-------------- src/raddbg/raddbg_core.c | 8 +- src/raddbg/raddbg_widgets.c | 2 +- src/win32/base/win32_base.c | 5 +- 7 files changed, 394 insertions(+), 333 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index b3ec728e..b6c38679 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1302,6 +1302,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) D_Entity *process = d_entity_alloc(store, machine, D_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); process->tls_model = event->tls_model; process->target_os = event->target_os; + d_entity_equip_string(store, process, event->string); } }break; case D_EventKind_EndProc: @@ -1436,9 +1437,9 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) module->tls_index = event->tls_index; module->tls_offset = event->tls_offset; D_Entity *first_module = d_entity_child_from_kind(process, D_EntityKind_Module); - if(first_module == module) + if(first_module == module && process->string.size == 0) { - d_entity_equip_string(store, process, str8_skip_last_slash(event->string)); + d_entity_equip_string(store, process, event->string); } scratch_end(scratch); }break; @@ -5156,6 +5157,9 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) U64 modules_count = 0; MDMP_MemoryDescriptor32 *memories = 0; U64 memories_count = 0; + MDMP_MemoryDescriptor64 *memories64 = 0; + U64 memories64_count = 0; + U64 memories64_base_foff = 0; { for EachIndex(idx, directories_count) { @@ -5195,6 +5199,16 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) memories = (MDMP_MemoryDescriptor32 *)(data.str + off); memories_count = Min(memories_count_32, memories_count_max); }break; + case MDMP_StreamKind_Memory64List: + { + U64 memories64_count = 0; + U64 off = dir->location.foff; + off += str8_deserial_read_struct(data, off, &memories64_count); + off += str8_deserial_read_struct(data, off, &memories64_base_foff); + U64 memories64_count_max = (data.size - off) / sizeof(MDMP_MemoryDescriptor64); + memories64 = (MDMP_MemoryDescriptor64 *)(data.str + off); + memories64_count = Min(memories64_count, memories64_count_max); + }break; } } } @@ -5219,6 +5233,7 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) evt->entity = process; evt->arch = arch; evt->target_os = OperatingSystem_Windows; + evt->string = path; } // rjf: thread creation @@ -5245,7 +5260,9 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // rjf: module loads for EachIndex(idx, modules_count) { + // rjf: unpack module MDMP_Module *module = &modules[idx]; + Rng1U64 vaddr_range = r1u64(module->image_base_vaddr, module->image_base_vaddr + module->image_size); String8 module_name = {0}; { U64 module_name_off = module->module_name_foff; @@ -5256,34 +5273,76 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) String16 module_name_16 = str16((U16 *)module_name_raw_data.str, module_name_raw_data.size / sizeof(U16)); module_name = str8_from_16(scratch.arena, module_name_16); } - D_Event *evt = d_event_list_push(scratch.arena, &evts); - evt->kind = D_EventKind_NewModule; - evt->msg_id = msg->msg_id; - evt->entity = d_dump_handle_make(D_MachineID_Local, handle_id_gen); - evt->parent = process; - evt->arch = arch; - evt->vaddr_rng = r1u64(module->image_base_vaddr, module->image_base_vaddr + module->image_size); - evt->string = module_name; - // TODO(rjf): evt->stack_base = ; (use thread->stack) - // TODO(rjf): evt->tls_root = ; (use thread->thread_context) + + // rjf: open module + D_Handle module_handle = d_dump_handle_make(D_MachineID_Local, handle_id_gen); handle_id_gen += 1; + d_ctrl_thread__module_open(process, module_handle, vaddr_range, module_name, r1u64(0, 0), 0); + + // rjf: open debug info + String8 initial_debug_info_path = d_initial_debug_info_path_from_module(scratch.arena, module_handle); + U64 debug_info_timestamp = properties_from_file_path(initial_debug_info_path).modified; + DI_Key initial_dbgi_key = di_key_from_path_timestamp(initial_debug_info_path, debug_info_timestamp); + di_open(initial_dbgi_key); + + // rjf: push module load event + { + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_NewModule; + evt->msg_id = msg->msg_id; + evt->entity = module_handle; + evt->parent = process; + evt->arch = arch; + evt->vaddr_rng = vaddr_range; + evt->string = module_name; + // TODO(rjf): evt->stack_base = ; (use thread->stack) + // TODO(rjf): evt->tls_root = ; (use thread->thread_context) + } + + // rjf: push debug info initial path set event + { + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_ModuleDebugInfoPathChange; + evt->msg_id = msg->msg_id; + evt->entity = module_handle; + evt->parent = process; + evt->timestamp = debug_info_timestamp; + evt->string = initial_debug_info_path; + } } // rjf: allocate parse artifact arena arena = arena_alloc(); // rjf: gather memory ranges - memory_ranges_count = memories_count; + memory_ranges_count = memories_count + memories64_count; memory_ranges = push_array(arena, D_DumpMemoryRange, memory_ranges_count); for EachIndex(idx, memories_count) { memory_ranges[idx].base_vaddr = memories[idx].start_of_memory_range; memory_ranges[idx].foff_range = r1u64(memories[idx].memory_location.foff, memories[idx].memory_location.foff+memories[idx].memory_location.data_size); } + { + U64 foff = memories64_base_foff; + for EachIndex(idx, memories64_count) + { + memory_ranges[memories_count + idx].base_vaddr = memories64[memories_count + idx].start_of_memory_range; + memory_ranges[memories_count + idx].foff_range = r1u64(foff, foff+memories64[idx].size); + foff += memories64[idx].size; + } + } } } } + //- rjf: record stop + { + D_Event *event = d_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Stopped; + event->cause = D_EventCause_Finished; + event->msg_id = msg->msg_id; + } + //- rjf: push all events from the parse ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 717d10fa..35ab2031 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -269,7 +269,7 @@ RD_VocabInfo rd_vocab_info_table[360] = {str8_lit_comp("tab_settings"), str8_lit_comp(""), str8_lit_comp("Selected Tab Settings"), str8_lit_comp(""), RD_IconKind_Gear}, {str8_lit_comp("set_current_path"), str8_lit_comp(""), str8_lit_comp("Set Current Path"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("open"), str8_lit_comp(""), str8_lit_comp("Open"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("switch"), str8_lit_comp(""), str8_lit_comp("Switch"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp(""), str8_lit_comp("Open Source File From Debug Info"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("switch_to_partner_file"), str8_lit_comp(""), str8_lit_comp("Switch To Partner File"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("show_file_in_explorer"), str8_lit_comp(""), str8_lit_comp("Show File In Explorer"), str8_lit_comp(""), RD_IconKind_FolderClosedFilled}, {str8_lit_comp("go_to_disassembly"), str8_lit_comp(""), str8_lit_comp("Go To Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, @@ -671,7 +671,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("switch"), str8_lit_comp("Switches to a recent file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, @@ -871,7 +871,7 @@ struct {String8 string; CFG_Binding binding;} rd_default_binding_table[114] = {str8_lit_comp("open_tab"), {WM_Key_T, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("tab_settings"), {WM_Key_T, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, {str8_lit_comp("open"), {WM_Key_O, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("switch"), {WM_Key_I, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("open_source_file_from_debug_info"), {WM_Key_I, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("switch_to_partner_file"), {WM_Key_O, 0 |WM_Modifier_Alt}}, {str8_lit_comp("new_project"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, {str8_lit_comp("open_project"), {WM_Key_O, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, @@ -946,7 +946,7 @@ struct {String8 string; CFG_Binding binding;} rd_default_binding_table[114] = {str8_lit_comp("toggle_dev_menu"), {WM_Key_D, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, }; -String8 rd_binding_version_remap_old_name_table[8] = +String8 rd_binding_version_remap_old_name_table[9] = { str8_lit_comp("commands"), str8_lit_comp("load_user"), @@ -956,9 +956,10 @@ str8_lit_comp("open_profile"), str8_lit_comp("address_breakpoint"), str8_lit_comp("function_breakpoint"), str8_lit_comp("toggle_breakpoint_cursor"), +str8_lit_comp("switch"), }; -String8 rd_binding_version_remap_new_name_table[8] = +String8 rd_binding_version_remap_new_name_table[9] = { str8_lit_comp("run_command"), str8_lit_comp("open_user"), @@ -968,6 +969,7 @@ str8_lit_comp("open_project"), str8_lit_comp("add_address_breakpoint"), str8_lit_comp("add_function_breakpoint"), str8_lit_comp("toggle_breakpoint"), +str8_lit_comp("open_source_file_from_debug_info"), }; String8 rd_icon_kind_text_table[75] = diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 0ee04afc..cbefffbc 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -156,7 +156,7 @@ RD_CmdKind_TabBarBottom, RD_CmdKind_TabSettings, RD_CmdKind_SetCurrentPath, RD_CmdKind_Open, -RD_CmdKind_Switch, +RD_CmdKind_OpenSourceFileFromDebugInfo, RD_CmdKind_SwitchToPartnerFile, RD_CmdKind_ShowFileInExplorer, RD_CmdKind_GoToDisassembly, @@ -607,8 +607,8 @@ extern RD_VocabInfo rd_vocab_info_table[360]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; -extern String8 rd_binding_version_remap_old_name_table[8]; -extern String8 rd_binding_version_remap_new_name_table[8]; +extern String8 rd_binding_version_remap_old_name_table[9]; +extern String8 rd_binding_version_remap_new_name_table[9]; extern String8 rd_icon_kind_text_table[75]; extern String8 rd_code_color_slot_name_table[14]; extern String8 rd_theme_preset_display_string_table[11]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 59240a09..f91d2377 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -935,286 +935,286 @@ RD_RegTable: RD_CmdTable: // | | | | | | | | | | | | | { //- rjf: exiting - {Exit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } + {Exit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } //- rjf: palette - {OpenPalette 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } + {OpenPalette 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } //- rjf: command runners - {RunCommand 1 1 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } - {RunExternalDriverTextCommand 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 1 1 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } + {RunCommand 1 1 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } + {RunExternalDriverTextCommand 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 1 1 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } //- rjf: os event passthrough - {WMEvent 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } + {WMEvent 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } //- rjf: thread/frame selection - {SelectThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } - {SelectUnwind 0 1 0 0 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } - {UpOneFrame 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } - {DownOneFrame 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } - {SelectEntity 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } - {DeselectEntity 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } + {SelectThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } + {SelectUnwind 0 1 0 0 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } + {UpOneFrame 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } + {DownOneFrame 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } + {SelectEntity 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } + {DeselectEntity 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } //- rjf: font sizes - {IncWindowFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } - {DecWindowFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } - {IncViewFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } - {DecViewFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } + {IncWindowFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } + {DecWindowFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } + {IncViewFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } + {DecViewFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } //- rjf: windows - {OpenWindow 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } - {WindowSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } - {CloseWindow 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } - {ToggleFullscreen 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } - {BringToFront 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } + {OpenWindow 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } + {WindowSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } + {CloseWindow 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } + {ToggleFullscreen 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } + {BringToFront 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } //- rjf: popups - {PopupAccept 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } - {PopupCancel 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } + {PopupAccept 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } + {PopupCancel 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } //- rjf: keybindings - {ResetToDefaultBindings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } + {ResetToDefaultBindings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } //- rjf: panel splitting - {ResetToDefaultPanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } - {ResetToCompactPanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } - {ResetToSimplePanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } - {NewPanelLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } - {NewPanelUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } - {NewPanelRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } - {NewPanelDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } - {SplitPanel 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } + {ResetToDefaultPanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } + {ResetToCompactPanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } + {ResetToSimplePanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } + {NewPanelLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } + {NewPanelUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } + {NewPanelRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } + {NewPanelDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } + {SplitPanel 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } //- rjf: panel rotation - {RotatePanelColumns 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } + {RotatePanelColumns 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } //- rjf: focused panel changing - {NextPanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } - {PrevPanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } - {FocusPanel 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } - {FocusPanelRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } - {FocusPanelLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } - {FocusPanelUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } - {FocusPanelDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } + {NextPanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } + {PrevPanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } + {FocusPanel 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } + {FocusPanelRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } + {FocusPanelLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } + {FocusPanelUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } + {FocusPanelDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } //- rjf: undo/redo - {Undo 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } - {Redo 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } + {Undo 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } + {Redo 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } //- rjf: focus history - {GoBack 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } - {GoForward 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } + {GoBack 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } + {GoForward 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } //- rjf: panel removal - {ClosePanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } + {ClosePanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } //- rjf: panel tab - {FocusTab 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } - {NextTab 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } - {PrevTab 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } - {MoveTabRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "$tab," } - {MoveTabLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "$tab," } - {OpenTab 1 1 0 0 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } - {BuildTab 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } - {DuplicateTab 1 1 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "$tab," } - {CopyTabFullPath 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "$tab," } - {CloseTab 1 1 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "$tab," } - {MoveView 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } - {TabBarTop 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "$tab," } - {TabBarBottom 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "$tab," } - {TabSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } + {FocusTab 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } + {NextTab 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } + {PrevTab 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } + {MoveTabRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "$tab," } + {MoveTabLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "$tab," } + {OpenTab 1 1 0 0 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } + {BuildTab 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } + {DuplicateTab 1 1 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "$tab," } + {CopyTabFullPath 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "$tab," } + {CloseTab 1 1 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "$tab," } + {MoveView 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } + {TabBarTop 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "$tab," } + {TabBarBottom 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "$tab," } + {TabSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } //- rjf: files - {SetCurrentPath 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } - {Open 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } - {Switch 1 0 0 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "switch" "Switch" "Switches to a recent file." "code,source,file" "" } - {SwitchToPartnerFile 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } - {ShowFileInExplorer 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "$file," } + {SetCurrentPath 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } + {Open 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } + {OpenSourceFileFromDebugInfo 1 0 0 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } + {SwitchToPartnerFile 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } + {ShowFileInExplorer 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "$file," } //- rjf: source <-> disasm - {GoToDisassembly 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "$text_pt," } - {GoToSource 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "" } + {GoToDisassembly 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "$text_pt," } + {GoToSource 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "" } //- rjf: override file links - {SetFileReplacementPath 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } + {SetFileReplacementPath 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } //- rjf: setting config paths - {NewUser 1 1 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } - {NewProject 1 1 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } - {OpenUser 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } - {OpenProject 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } - {OpenRecentProject 1 1 0 0 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } - {SaveUser 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } - {SaveProject 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } - {RecordUserAsLastOpened 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } - {RecordProjectInUser 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } + {NewUser 1 1 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } + {NewProject 1 1 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } + {OpenUser 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } + {OpenProject 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } + {OpenRecentProject 1 1 0 0 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } + {SaveUser 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } + {SaveProject 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } + {RecordUserAsLastOpened 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } + {RecordProjectInUser 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } //- rjf: writing config changes - {WriteUserData 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } - {WriteProjectData 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } + {WriteUserData 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } + {WriteProjectData 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } //- rjf: opening user/project settings - {UserSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } - {ProjectSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } + {UserSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } + {ProjectSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } //- rjf: meta controls - {Edit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } - {Accept 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } - {Cancel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } - {FocusMenu 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } + {Edit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } + {Accept 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } + {Cancel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } + {FocusMenu 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } //- rjf: directional movement & text controls - {MoveLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } - {MoveRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } - {MoveUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } - {MoveDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } - {MoveLeftSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } - {MoveRightSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } - {MoveUpSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } - {MoveDownSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } - {MoveLeftChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPage 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } - {MoveDownPage 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } - {MoveUpWhole 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } - {MoveDownWhole 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } - {MoveLeftChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPageSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } - {MoveDownPageSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } - {MoveUpWholeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } - {MoveDownWholeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } - {MoveUpReorder 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } - {MoveDownReorder 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } - {MoveHome 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } - {MoveEnd 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } - {MoveHomeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } - {MoveEndSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } - {SelectAll 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } - {DeleteSingle 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } - {DeleteChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } - {BackspaceSingle 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } - {BackspaceChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } - {Copy 1 1 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "$text_rng," } - {Cut 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } - {Paste 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } - {InsertText 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } + {MoveLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } + {MoveRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } + {MoveUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } + {MoveDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } + {MoveLeftSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } + {MoveRightSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } + {MoveUpSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } + {MoveDownSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } + {MoveLeftChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPage 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } + {MoveDownPage 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } + {MoveUpWhole 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } + {MoveDownWhole 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } + {MoveLeftChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPageSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } + {MoveDownPageSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } + {MoveUpWholeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } + {MoveDownWholeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } + {MoveUpReorder 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } + {MoveDownReorder 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } + {MoveHome 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } + {MoveEnd 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } + {MoveHomeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } + {MoveEndSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } + {SelectAll 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } + {DeleteSingle 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } + {DeleteChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } + {BackspaceSingle 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } + {BackspaceChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } + {Copy 1 1 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "$text_rng," } + {Cut 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } + {Paste 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } + {InsertText 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } //- rjf: directionless navigation - {MoveNext 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } - {MovePrev 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } + {MoveNext 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } + {MovePrev 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } //- rjf: code navigation - {GoToLine 1 1 0 0 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } - {GoToAddress 1 1 0 0 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } - {CenterCursor 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } - {ContainCursor 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } - {FindNext 1 1 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } - {FindPrev 1 1 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } + {GoToLine 1 1 0 0 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } + {GoToAddress 1 1 0 0 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } + {CenterCursor 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } + {ContainCursor 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } + {FindNext 1 1 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } + {FindPrev 1 1 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } //- rjf: thread finding - {FindThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } - {FindSelectedThread 1 1 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "" } + {FindThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } + {FindSelectedThread 1 1 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "" } //- rjf: name finding - {GoToName 1 1 0 0 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "$text_pt," } - {GoToNameAtCursor 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } + {GoToName 1 1 0 0 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "$text_pt," } + {GoToNameAtCursor 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } //- rjf: watch expressions - {ToggleWatchExpression 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "$text_pt," } - {ToggleWatchExpressionAtCursor 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "" } - {ToggleWatchExpressionAtMouse 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } + {ToggleWatchExpression 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "$text_pt," } + {ToggleWatchExpressionAtCursor 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "" } + {ToggleWatchExpressionAtMouse 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } //- rjf: general config operations - {EnableCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } - {DisableCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } - {SelectCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } - {DeselectCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } - {RemoveCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } - {NameCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } - {ConditionCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } - {DuplicateCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } - {RelocateCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } - {SaveToProject 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } + {EnableCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } + {DisableCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } + {SelectCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } + {DeselectCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } + {RemoveCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } + {NameCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } + {ConditionCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } + {DuplicateCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } + {RelocateCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } + {SaveToProject 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } //- rjf: breakpoints - {AddBreakpoint 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } - {AddAddressBreakpoint 1 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "$breakpoints," } - {AddFunctionBreakpoint 1 0 0 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "$breakpoints," } - {ToggleBreakpoint 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "$text_pt," } - {RemoveBreakpoint 1 0 0 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "$breakpoints," } - {EnableBreakpoint 1 1 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } - {DisableBreakpoint 1 1 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } - {ClearBreakpoints 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } - {ListBreakpoints 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "list_breakpoints" "List Breakpoints" "Lists all breakpoints." "" "" } + {AddBreakpoint 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } + {AddAddressBreakpoint 1 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "$breakpoints," } + {AddFunctionBreakpoint 1 0 0 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "$breakpoints," } + {ToggleBreakpoint 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "$text_pt," } + {RemoveBreakpoint 1 0 0 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "$breakpoints," } + {EnableBreakpoint 1 1 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } + {DisableBreakpoint 1 1 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } + {ClearBreakpoints 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } + {ListBreakpoints 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "list_breakpoints" "List Breakpoints" "Lists all breakpoints." "" "" } //- rjf: output - {ClearOutput 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } + {ClearOutput 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } //- rjf: watch pins - {AddWatchPin 1 1 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "$watch_pins," } - {ToggleWatchPin 1 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } + {AddWatchPin 1 1 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "$watch_pins," } + {ToggleWatchPin 1 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } //- rjf: debug infos - {LoadDebugInfo 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "$debug_infos," } - {UnloadDebugInfo 1 1 0 0 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "$debug_infos," } + {LoadDebugInfo 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "$debug_infos," } + {UnloadDebugInfo 1 1 0 0 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "$debug_infos," } //- rjf: type views - {AddTypeView 0 0 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } + {AddTypeView 0 0 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } //- rjf: file path maps - {AddFilePathMap 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } + {AddFilePathMap 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } //- rjf: themes - {EditUserTheme 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } - {EditProjectTheme 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } - {AddThemeColor 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } - {ForkTheme 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } - {SaveTheme 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } - {SaveAndSetTheme 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } + {EditUserTheme 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } + {EditProjectTheme 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } + {AddThemeColor 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } + {ForkTheme 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } + {SaveTheme 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } + {SaveAndSetTheme 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } //- rjf: line operations - {SetNextStatement 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "$text_pt," } + {SetNextStatement 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "$text_pt," } //- rjf: targets - {AddTarget 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "$targets," } - {SelectTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } - {EnableTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } - {DisableTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } - {RemoveTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } + {AddTarget 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "$targets," } + {SelectTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } + {EnableTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } + {DisableTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } + {RemoveTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } //- rjf: attaching - {RegisterAsJITDebugger 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } + {RegisterAsJITDebugger 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } //- rjf: snap-to-code-location - {FindCodeLocation 0 1 0 0 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } + {FindCodeLocation 0 1 0 0 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } //- rjf: searching - {Search 1 1 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } - {SearchBackwards 1 1 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } + {Search 1 1 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } + {SearchBackwards 1 1 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } //- rjf: queries - {PickFile 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } - {PickFolder 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } - {PickFileOrFolder 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } + {PickFile 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } + {PickFolder 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } + {PickFileOrFolder 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } //- rjf: query stack - {PushQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } - {CompleteQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } - {CancelQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } - {UpdateQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } + {PushQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } + {CompleteQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } + {CancelQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } + {UpdateQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } //- rjf: event buffers - {OpenEventBuffer 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } - {CloseEventBuffer 0 1 0 0 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } + {OpenEventBuffer 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } + {CloseEventBuffer 0 1 0 0 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } //- rjf: developer commands - {ToggleDevMenu 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } - {LogMarker 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } + {ToggleDevMenu 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } + {LogMarker 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } } @enum RD_CmdKind: @@ -1268,166 +1268,166 @@ RD_CmdTable: // | | | | RD_DefaultBindingTable: { //- rjf: low-level target control operations - { "kill_all" F5 0 shift 0 } - { "step_into_inst" F11 0 0 alt } - { "step_over_inst" F10 0 0 alt } - { "step_out" F11 0 shift 0 } - { "halt" X ctrl shift 0 } - { "halt" Pause 0 0 0 } + { "kill_all" F5 0 shift 0 } + { "step_into_inst" F11 0 0 alt } + { "step_over_inst" F10 0 0 alt } + { "step_out" F11 0 shift 0 } + { "halt" X ctrl shift 0 } + { "halt" Pause 0 0 0 } //- rjf: high-level composite target control operations - { "run" F5 0 0 0 } - { "restart" F5 ctrl shift 0 } - { "step_into" F11 0 0 0 } - { "step_over" F10 0 0 0 } - { "run_to_line" F10 ctrl 0 0 } - { "set_next_statement" F10 ctrl shift 0 } + { "run" F5 0 0 0 } + { "restart" F5 ctrl shift 0 } + { "step_into" F11 0 0 0 } + { "step_over" F10 0 0 0 } + { "run_to_line" F10 ctrl 0 0 } + { "set_next_statement" F10 ctrl shift 0 } //- rjf: font sizes - { "inc_window_font_size" Equal 0 0 alt } - { "dec_window_font_size" Minus 0 0 alt } + { "inc_window_font_size" Equal 0 0 alt } + { "dec_window_font_size" Minus 0 0 alt } //- rjf: windows - { "toggle_fullscreen" Return ctrl 0 0 } + { "toggle_fullscreen" Return ctrl 0 0 } //- rjf: panel splitting - { "new_panel_right" P ctrl 0 0 } - { "new_panel_down" Minus ctrl 0 0 } + { "new_panel_right" P ctrl 0 0 } + { "new_panel_down" Minus ctrl 0 0 } //- rjf: panel rotation - { "rotate_panel_columns" 2 ctrl 0 0 } + { "rotate_panel_columns" 2 ctrl 0 0 } //- rjf: focused panel changing - { "next_panel" Comma ctrl 0 0 } - { "prev_panel" Comma ctrl shift 0 } - { "focus_panel_right" Right ctrl 0 alt } - { "focus_panel_left" Left ctrl 0 alt } - { "focus_panel_up" Up ctrl 0 alt } - { "focus_panel_down" Down ctrl 0 alt } + { "next_panel" Comma ctrl 0 0 } + { "prev_panel" Comma ctrl shift 0 } + { "focus_panel_right" Right ctrl 0 alt } + { "focus_panel_left" Left ctrl 0 alt } + { "focus_panel_up" Up ctrl 0 alt } + { "focus_panel_down" Down ctrl 0 alt } //- rjf: undo/redo - { "undo" Z ctrl 0 0 } - { "redo" Y ctrl 0 0 } + { "undo" Z ctrl 0 0 } + { "redo" Y ctrl 0 0 } //- rjf: focus history - { "go_back" Left 0 0 alt } - { "go_forward" Right 0 0 alt } + { "go_back" Left 0 0 alt } + { "go_forward" Right 0 0 alt } //- rjf: panel removal - { "close_panel" P ctrl shift alt } + { "close_panel" P ctrl shift alt } //- rjf: panel tab - { "next_tab" PageDown ctrl 0 0 } - { "prev_tab" PageUp ctrl 0 0 } - { "next_tab" Tab ctrl 0 0 } - { "prev_tab" Tab ctrl shift 0 } - { "move_tab_right" PageDown ctrl shift 0 } - { "move_tab_left" PageUp ctrl shift 0 } - { "close_tab" W ctrl 0 0 } - { "tab_bar_top" Up ctrl shift alt } - { "tab_bar_bottom" Down ctrl shift alt } - { "open_tab" T ctrl 0 0 } - { "tab_settings" T ctrl 0 alt } + { "next_tab" PageDown ctrl 0 0 } + { "prev_tab" PageUp ctrl 0 0 } + { "next_tab" Tab ctrl 0 0 } + { "prev_tab" Tab ctrl shift 0 } + { "move_tab_right" PageDown ctrl shift 0 } + { "move_tab_left" PageUp ctrl shift 0 } + { "close_tab" W ctrl 0 0 } + { "tab_bar_top" Up ctrl shift alt } + { "tab_bar_bottom" Down ctrl shift alt } + { "open_tab" T ctrl 0 0 } + { "tab_settings" T ctrl 0 alt } //- rjf: files - { "open" O ctrl 0 0 } - { "switch" I ctrl 0 0 } - { "switch_to_partner_file" O 0 0 alt } + { "open" O ctrl 0 0 } + { "open_source_file_from_debug_info" I ctrl 0 0 } + { "switch_to_partner_file" O 0 0 alt } //- rjf: setting config paths - { "new_project" N ctrl shift 0 } - { "open_project" O ctrl shift 0 } - { "save_project" S ctrl shift 0 } + { "new_project" N ctrl shift 0 } + { "open_project" O ctrl shift 0 } + { "save_project" S ctrl shift 0 } //- rjf: meta controls - { "edit" F2 0 0 0 } - { "accept" Return 0 0 0 } - { "accept" Space 0 0 0 } - { "cancel" Esc 0 0 0 } - { "focus_menu" D 0 0 alt } + { "edit" F2 0 0 0 } + { "accept" Return 0 0 0 } + { "accept" Space 0 0 0 } + { "cancel" Esc 0 0 0 } + { "focus_menu" D 0 0 alt } //- rjf: directional movement & text controls - { "move_left" Left 0 0 0 } - { "move_right" Right 0 0 0 } - { "move_up" Up 0 0 0 } - { "move_down" Down 0 0 0 } - { "move_left_select" Left 0 shift 0 } - { "move_right_select" Right 0 shift 0 } - { "move_up_select" Up 0 shift 0 } - { "move_down_select" Down 0 shift 0 } - { "move_left_chunk" Left ctrl 0 0 } - { "move_right_chunk" Right ctrl 0 0 } - { "move_up_chunk" Up ctrl 0 0 } - { "move_down_chunk" Down ctrl 0 0 } - { "move_up_page" PageUp 0 0 0 } - { "move_down_page" PageDown 0 0 0 } - { "move_up_whole" Home ctrl 0 0 } - { "move_down_whole" End ctrl 0 0 } - { "move_left_chunk_select" Left ctrl shift 0 } - { "move_right_chunk_select" Right ctrl shift 0 } - { "move_up_chunk_select" Up ctrl shift 0 } - { "move_down_chunk_select" Down ctrl shift 0 } - { "move_up_page_select" PageUp 0 shift 0 } - { "move_down_page_select" PageDown 0 shift 0 } - { "move_up_whole_select" Home ctrl shift 0 } - { "move_down_whole_select" End ctrl shift 0 } - { "move_up_reorder" Up 0 0 alt } - { "move_down_reorder" Down 0 0 alt } - { "move_home" Home 0 0 0 } - { "move_end" End 0 0 0 } - { "move_home_select" Home 0 shift 0 } - { "move_end_select" End 0 shift 0 } - { "select_all" A ctrl 0 0 } - { "delete_single" Delete 0 0 0 } - { "delete_chunk" Delete ctrl 0 0 } - { "backspace_single" Backspace 0 0 0 } - { "backspace_chunk" Backspace ctrl 0 0 } - { "copy" C ctrl 0 0 } - { "copy" Insert ctrl 0 0 } - { "cut" X ctrl 0 0 } - { "paste" V ctrl 0 0 } - { "paste" Insert 0 shift 0 } - { "insert_text" Null 0 0 0 } + { "move_left" Left 0 0 0 } + { "move_right" Right 0 0 0 } + { "move_up" Up 0 0 0 } + { "move_down" Down 0 0 0 } + { "move_left_select" Left 0 shift 0 } + { "move_right_select" Right 0 shift 0 } + { "move_up_select" Up 0 shift 0 } + { "move_down_select" Down 0 shift 0 } + { "move_left_chunk" Left ctrl 0 0 } + { "move_right_chunk" Right ctrl 0 0 } + { "move_up_chunk" Up ctrl 0 0 } + { "move_down_chunk" Down ctrl 0 0 } + { "move_up_page" PageUp 0 0 0 } + { "move_down_page" PageDown 0 0 0 } + { "move_up_whole" Home ctrl 0 0 } + { "move_down_whole" End ctrl 0 0 } + { "move_left_chunk_select" Left ctrl shift 0 } + { "move_right_chunk_select" Right ctrl shift 0 } + { "move_up_chunk_select" Up ctrl shift 0 } + { "move_down_chunk_select" Down ctrl shift 0 } + { "move_up_page_select" PageUp 0 shift 0 } + { "move_down_page_select" PageDown 0 shift 0 } + { "move_up_whole_select" Home ctrl shift 0 } + { "move_down_whole_select" End ctrl shift 0 } + { "move_up_reorder" Up 0 0 alt } + { "move_down_reorder" Down 0 0 alt } + { "move_home" Home 0 0 0 } + { "move_end" End 0 0 0 } + { "move_home_select" Home 0 shift 0 } + { "move_end_select" End 0 shift 0 } + { "select_all" A ctrl 0 0 } + { "delete_single" Delete 0 0 0 } + { "delete_chunk" Delete ctrl 0 0 } + { "backspace_single" Backspace 0 0 0 } + { "backspace_chunk" Backspace ctrl 0 0 } + { "copy" C ctrl 0 0 } + { "copy" Insert ctrl 0 0 } + { "cut" X ctrl 0 0 } + { "paste" V ctrl 0 0 } + { "paste" Insert 0 shift 0 } + { "insert_text" Null 0 0 0 } //- rjf: secondary navigation - { "move_next" Tab 0 0 0 } - { "move_prev" Tab 0 shift 0 } + { "move_next" Tab 0 0 0 } + { "move_prev" Tab 0 shift 0 } //- rjf: code navigation - { "goto_line" G ctrl 0 0 } - { "goto_address" G 0 0 alt } - { "search" F ctrl 0 0 } - { "search_backwards" R ctrl 0 0 } - { "find_next" F3 0 0 0 } - { "find_prev" F3 shift 0 0 } + { "goto_line" G ctrl 0 0 } + { "goto_address" G 0 0 alt } + { "search" F ctrl 0 0 } + { "search_backwards" R ctrl 0 0 } + { "find_next" F3 0 0 0 } + { "find_prev" F3 shift 0 0 } //- rjf: thread finding - { "find_selected_thread" F4 0 0 0 } + { "find_selected_thread" F4 0 0 0 } //- rjf: name finding - { "goto_name" J ctrl 0 0 } - { "goto_name_at_cursor" F12 0 0 0 } + { "goto_name" J ctrl 0 0 } + { "goto_name_at_cursor" F12 0 0 0 } //- rjf: watch expressions - { "toggle_watch_expr_at_cursor" W 0 0 alt } - { "toggle_watch_expr_at_mouse" D ctrl 0 0 } - { "toggle_watch_pin" F9 ctrl 0 0 } + { "toggle_watch_expr_at_cursor" W 0 0 alt } + { "toggle_watch_expr_at_mouse" D ctrl 0 0 } + { "toggle_watch_pin" F9 ctrl 0 0 } //- rjf: breakpoints - { "toggle_breakpoint" F9 0 0 0 } - { "add_address_breakpoint" F9 0 shift 0 } - { "add_function_breakpoint" F9 ctrl shift 0 } + { "toggle_breakpoint" F9 0 0 0 } + { "add_address_breakpoint" F9 0 shift 0 } + { "add_function_breakpoint" F9 ctrl shift 0 } //- rjf: attaching - { "attach" F6 0 shift 0 } + { "attach" F6 0 shift 0 } //- rjf: command lister - { "open_palette" F1 0 0 0 } - { "open_palette" P ctrl shift 0 } + { "open_palette" F1 0 0 0 } + { "open_palette" P ctrl shift 0 } //- rjf: developer commands - { "log_marker" M ctrl shift alt } - { "toggle_dev_menu" D ctrl shift alt } + { "log_marker" M ctrl shift alt } + { "toggle_dev_menu" D ctrl shift alt } } @data(`struct {String8 string; CFG_Binding binding;}`) @c_file rd_default_binding_table: @@ -1449,6 +1449,7 @@ RD_BindingVersionRemapTable: {"address_breakpoint" "add_address_breakpoint"} {"function_breakpoint" "add_function_breakpoint"} {"toggle_breakpoint_cursor" "toggle_breakpoint"} + {"switch" "open_source_file_from_debug_info"} } @data(String8) rd_binding_version_remap_old_name_table: diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 5ccca316..cf14a2ef 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -650,7 +650,7 @@ rd_name_from_ctrl_entity(Arena *arena, D_Entity *entity) { string = str8_lit("unnamed"); } - if(entity->kind == D_EntityKind_Module) + if(entity->kind == D_EntityKind_Module || entity->kind == D_EntityKind_Process) { string = str8_skip_last_slash(string); } @@ -4426,7 +4426,7 @@ rd_view_ui(Rng2F32 rect) // rjf: is file eval? -> switch to file else if(cell_info.file_path.size != 0) { - rd_cmd(RD_CmdKind_Switch, .cfg = 0, .file_path = cell_info.file_path); + rd_cmd(RD_CmdKind_FindCodeLocation, .cfg = 0, .file_path = cell_info.file_path, .cursor = txt_pt(0, 0)); } } @@ -6710,7 +6710,7 @@ rd_window_frame(void) String8 cmds[] = { rd_cmd_kind_info_table[RD_CmdKind_Open].string, - rd_cmd_kind_info_table[RD_CmdKind_Switch].string, + rd_cmd_kind_info_table[RD_CmdKind_OpenSourceFileFromDebugInfo].string, {0},//- rd_cmd_kind_info_table[RD_CmdKind_NewProject].string, rd_cmd_kind_info_table[RD_CmdKind_OpenProject].string, @@ -13862,7 +13862,7 @@ rd_frame(void) log_user_errorf("Couldn't open file at \"%S\".", path); } }break; - case RD_CmdKind_Switch: + case RD_CmdKind_OpenSourceFileFromDebugInfo: { String8 path = rd_regs()->file_path; rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = path, .cursor = txt_pt(0, 0), .vaddr = 0, .force_focus = 1, .prefer_new_tab = 1); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 857e89b1..e516a1e8 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -545,7 +545,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr .color = color); //- rjf: push PID - if(entity->kind == D_EntityKind_Process) + if(entity->kind == D_EntityKind_Process && entity->id != 0) { dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); dr_fstrs_push_new(arena, &result, ¶ms, push_str8f(arena, " (PID: %I64u)", entity->id), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .color = secondary_color, .size = ui_top_font_size()*0.85f); diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index 62d0bdbf..8de2f830 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1728,7 +1728,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) SHGetFolderPathW(0, CSIDL_DESKTOP, 0, 0, dump_file_path); PathAppendW(dump_file_path, L"raddbg_crash_dump.dmp"); HANDLE file = CreateFileW(dump_file_path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); - if (file != INVALID_HANDLE_VALUE) + if(file != INVALID_HANDLE_VALUE) { MINIDUMP_EXCEPTION_INFORMATION info = {0}; info.ThreadId = GetCurrentThreadId(); @@ -1736,8 +1736,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs) info.ClientPointers = FALSE; BOOL dump_successful = dbg_MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, MiniDumpNormal, &info, 0, 0); CloseHandle(file); - - if (dump_successful) + if(dump_successful) { #if !BUILD_CONSOLE_INTERFACE // opens explorer and selects file From 40885a3f59cbe710fe0605866303eb90e984f425 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 18 May 2026 20:01:15 -0700 Subject: [PATCH 563/850] fix unmapped address visualization when reading is impossible + stop it from terminating rest of useful visualization --- src/dbg_engine/dbg_engine_ctrl.c | 1 + src/eval_visualization/eval_visualization_core.c | 13 ++++--------- src/eval_visualization/eval_visualization_core.h | 1 + src/font_cache/font_cache.h | 4 ++-- src/font_provider/font_provider.h | 4 ++-- src/raddbg/raddbg_core.c | 4 ++++ 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index b6c38679..7fd180da 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -5272,6 +5272,7 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) String8 module_name_raw_data = str8_prefix(str8_skip(data, off), module_name_size); String16 module_name_16 = str16((U16 *)module_name_raw_data.str, module_name_raw_data.size / sizeof(U16)); module_name = str8_from_16(scratch.arena, module_name_16); + module_name = path_normalized_from_string(scratch.arena, module_name); } // rjf: open module diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 66e9273d..3b0794b5 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1849,25 +1849,20 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) //- rjf: step 0: do pre-prefix pointer value if requested case 0: { - if(!(params->flags & EV_StringFlag_DisableAddresses) && - (!ptr_data->addr_is_good || params->flags & EV_StringFlag_AddressesBeforeContent)) + if(!(params->flags & EV_StringFlag_DisableAddresses) && params->flags & EV_StringFlag_AddressesBeforeContent) { Temp scratch = scratch_begin(&arena, 1); String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64 != 0 ? 16 : 10, 0, 0); - if(ptr_data->value_eval.value.u64 != 0 && !ptr_data->addr_is_good && params->flags & EV_StringFlag_ReadOnlyDisplayRules) + if(params->flags & EV_StringFlag_DisplayAddressUnmappedStatus && ptr_data->value_eval.value.u64 != 0 && !ptr_data->addr_is_good && params->flags & EV_StringFlag_ReadOnlyDisplayRules) { ptr_value_string = str8f(scratch.arena, "%S (unmapped)", ptr_value_string); } *out_string = str8_copy(arena, ptr_value_string); ptr_data->did_pre_prefix_ptr = 1; - need_pop = !ptr_data->addr_is_good; scratch_end(scratch); } - else - { - need_pop = 0; - } + need_pop = 0; }break; //- rjf: step 1 -> try "prefix content", which we want to print before the pointer value, @@ -2134,7 +2129,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) { Temp scratch = scratch_begin(&arena, 1); String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, ptr_data->value_eval.value.u64 != 0 ? 16 : 10, 0, 0); - if(params->flags & EV_StringFlag_ReadOnlyDisplayRules && ptr_data->value_eval.value.u64 != 0 && !ptr_data->addr_is_good) + if(params->flags & EV_StringFlag_DisplayAddressUnmappedStatus && params->flags & EV_StringFlag_ReadOnlyDisplayRules && ptr_data->value_eval.value.u64 != 0 && !ptr_data->addr_is_good) { ptr_value_string = str8f(scratch.arena, "%S (unmapped)", ptr_value_string); } diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 0d9a788b..4a7067af 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -234,6 +234,7 @@ enum EV_StringFlag_DisableChars = (1<<4), EV_StringFlag_DisableStringQuotes = (1<<5), EV_StringFlag_AddressesBeforeContent = (1<<6), + EV_StringFlag_DisplayAddressUnmappedStatus = (1<<7), }; typedef struct EV_StringParams EV_StringParams; diff --git a/src/font_cache/font_cache.h b/src/font_cache/font_cache.h index 647cfaf4..a79f2abc 100644 --- a/src/font_cache/font_cache.h +++ b/src/font_cache/font_cache.h @@ -10,8 +10,8 @@ typedef U32 FNT_RasterFlags; enum { - FNT_RasterFlag_Smooth = (1<<0), - FNT_RasterFlag_Hinted = (1<<1), + FNT_RasterFlag_Smooth = (1<<0), + FNT_RasterFlag_Hinted = (1<<1), }; //////////////////////////////// diff --git a/src/font_provider/font_provider.h b/src/font_provider/font_provider.h index 3f010552..5b57c7e7 100644 --- a/src/font_provider/font_provider.h +++ b/src/font_provider/font_provider.h @@ -12,8 +12,8 @@ typedef U32 FP_RasterFlags; enum { - FP_RasterFlag_Smooth = (1<<0), - FP_RasterFlag_Hinted = (1<<1), + FP_RasterFlag_Smooth = (1<<0), + FP_RasterFlag_Hinted = (1<<1), }; typedef struct FP_Handle FP_Handle; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index cf14a2ef..3b559d9e 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12302,6 +12302,10 @@ rd_frame(void) { rd_state->eval_viz_base_string_flags |= EV_StringFlag_AddressesBeforeContent; } + if(!d_user_state->ctrl_is_running) + { + rd_state->eval_viz_base_string_flags |= EV_StringFlag_DisplayAddressUnmappedStatus; + } //////////////////////////// //- rjf: autosave if needed From a75cb2c32dd5a325ad5069233ca8661f1f4366ff Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 18 May 2026 20:06:05 -0700 Subject: [PATCH 564/850] display folder in title fstr generation for file evaluations, but only if not inside a folder context --- src/raddbg/raddbg_views.c | 3 ++- src/raddbg/raddbg_widgets.c | 13 ++++++++++++- src/raddbg/raddbg_widgets.h | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index ad4dec36..59f942f0 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1636,7 +1636,8 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla //- rjf: files -> button for file else if(result.file_path.size != 0) { - result.expr_fstrs = rd_title_fstrs_from_file_path(arena, result.file_path); + B32 need_folder = !str8_match(row_info->group_cfg_name, str8_lit("folder"), 0); + result.expr_fstrs = rd_title_fstrs_from_file_path(arena, result.file_path, need_folder); result.flags |= RD_WatchCellFlag_Button; } diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index e516a1e8..a5e8f160 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -659,7 +659,7 @@ rd_title_fstrs_from_code_name(Arena *arena, String8 code_name) } internal DR_FStrList -rd_title_fstrs_from_file_path(Arena *arena, String8 file_path) +rd_title_fstrs_from_file_path(Arena *arena, String8 file_path, B32 include_folder) { DR_FStrList fstrs = {0}; String8 file_name = str8_skip_last_slash(file_path); @@ -685,6 +685,17 @@ rd_title_fstrs_from_file_path(Arena *arena, String8 file_path) } dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); dr_fstrs_push_new(arena, &fstrs, ¶ms, file_name); + if(include_folder) + { + dr_fstrs_push_new(arena, &fstrs, ¶ms, str8_lit(" ")); + UI_TagF("weak") + { + dr_fstrs_push_new(arena, &fstrs, ¶ms, + str8_chop_last_slash(file_path), + .size = params.size*0.9f, + .color = ui_color_from_name(str8_lit("text"))); + } + } return fstrs; } diff --git a/src/raddbg/raddbg_widgets.h b/src/raddbg/raddbg_widgets.h index 70d4f127..4a1cd3a0 100644 --- a/src/raddbg/raddbg_widgets.h +++ b/src/raddbg/raddbg_widgets.h @@ -142,7 +142,7 @@ struct RD_CodeSliceSignal internal DR_FStrList rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras); internal DR_FStrList rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extras); internal DR_FStrList rd_title_fstrs_from_code_name(Arena *arena, String8 code_name); -internal DR_FStrList rd_title_fstrs_from_file_path(Arena *arena, String8 file_path); +internal DR_FStrList rd_title_fstrs_from_file_path(Arena *arena, String8 file_path, B32 include_folder); //////////////////////////////// //~ rjf: UI Widgets: Loading Overlay From fe4de192e4e5ed72d7bec3852adf11b87182cb66 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 18 May 2026 20:18:53 -0700 Subject: [PATCH 565/850] linux -> prefix user raddbg data with ., so we get ~/.raddbg normally - on windows keep normal style --- src/base/base_strings.c | 16 ++++++++++++ src/base/base_strings.h | 2 ++ src/dbg_engine/dbg_engine.mdesk | 2 +- src/dbg_engine/dbg_engine_core.c | 2 +- src/dbg_engine/dbg_engine_ctrl.c | 42 +++++++++++++++--------------- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg_core.c | 8 +++--- src/raddbg/raddbg_eval.c | 2 +- 8 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index ec28906a..89e87012 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1443,6 +1443,22 @@ str8_from_version(Arena *arena, U64 version) //////////////////////////////// //~ rjf: String Path Helpers +internal String8 +program_data_folder_prefix_from_os(OperatingSystem os) +{ + String8 result = {0}; + switch(os) + { + default:{}break; + case OperatingSystem_Linux: + case OperatingSystem_Mac: + { + result = s("."); + }break; + } + return result; +} + internal String8 str8_chop_last_slash(String8 string) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index b0b8c09c..a8332c30 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -319,6 +319,8 @@ g_path_style_map[] = { str8_lit_comp("system"), PathStyle_SystemAbsolute }, }; +internal String8 program_data_folder_prefix_from_os(OperatingSystem os); + internal String8 str8_chop_last_slash(String8 string); internal String8 str8_skip_last_slash(String8 string); internal String8 str8_chop_last_dot(String8 string); diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 1424bc48..5e320930 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -52,7 +52,7 @@ D_CmdTable: // | | | | {Attach 1 1 0 0 "query:unattached_processes" PID null Nil Null 0 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" "" } //- rjf: crash dump opening - {OpenCrashDump 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 0 0 0 0 1 1 Null "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } + {OpenCrashDump 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } } @enum D_CmdKind: diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 1f487512..e55ef168 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -58,7 +58,7 @@ d_init(void) { Temp scratch = scratch_begin(0, 0); String8 user_program_data_path = get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); + String8 user_data_folder = push_str8f(scratch.arena, "%S/%Sraddbg/logs", user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); make_directory(user_data_folder); d_ctrl_state->ctrl_thread_log_path = push_str8f(d_ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); write_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, str8_zero()); diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 7fd180da..b3f77090 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -5213,6 +5213,27 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } } + // rjf: allocate parse artifact arena + arena = arena_alloc(); + + // rjf: gather memory ranges + memory_ranges_count = memories_count + memories64_count; + memory_ranges = push_array(arena, D_DumpMemoryRange, memory_ranges_count); + for EachIndex(idx, memories_count) + { + memory_ranges[idx].base_vaddr = memories[idx].start_of_memory_range; + memory_ranges[idx].foff_range = r1u64(memories[idx].memory_location.foff, memories[idx].memory_location.foff+memories[idx].memory_location.data_size); + } + { + U64 foff = memories64_base_foff; + for EachIndex(idx, memories64_count) + { + memory_ranges[memories_count + idx].base_vaddr = memories64[memories_count + idx].start_of_memory_range; + memory_ranges[memories_count + idx].foff_range = r1u64(foff, foff+memories64[idx].size); + foff += memories64[idx].size; + } + } + // rjf: system info -> arch Arch arch = Arch_Null; if(system_info != 0) switch(system_info->processor_architecture) @@ -5311,27 +5332,6 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) evt->string = initial_debug_info_path; } } - - // rjf: allocate parse artifact arena - arena = arena_alloc(); - - // rjf: gather memory ranges - memory_ranges_count = memories_count + memories64_count; - memory_ranges = push_array(arena, D_DumpMemoryRange, memory_ranges_count); - for EachIndex(idx, memories_count) - { - memory_ranges[idx].base_vaddr = memories[idx].start_of_memory_range; - memory_ranges[idx].foff_range = r1u64(memories[idx].memory_location.foff, memories[idx].memory_location.foff+memories[idx].memory_location.data_size); - } - { - U64 foff = memories64_base_foff; - for EachIndex(idx, memories64_count) - { - memory_ranges[memories_count + idx].base_vaddr = memories64[memories_count + idx].start_of_memory_range; - memory_ranges[memories_count + idx].foff_range = r1u64(foff, foff+memories64[idx].size); - foff += memories64[idx].size; - } - } } } } diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 35ab2031..db5f0111 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -208,7 +208,7 @@ RD_VocabInfo rd_vocab_info_table[360] = {str8_lit_comp("set_entity_color"), str8_lit_comp(""), str8_lit_comp("Set Entity Color"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("set_entity_name"), str8_lit_comp(""), str8_lit_comp("Set Entity Name"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("attach"), str8_lit_comp(""), str8_lit_comp("Attach"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("open_crash_dump"), str8_lit_comp(""), str8_lit_comp("Open Crash Dump"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("open_crash_dump"), str8_lit_comp(""), str8_lit_comp("Open Crash Dump"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("exit"), str8_lit_comp(""), str8_lit_comp("Exit"), str8_lit_comp(""), RD_IconKind_X}, {str8_lit_comp("open_palette"), str8_lit_comp(""), str8_lit_comp("Open Palette"), str8_lit_comp(""), RD_IconKind_List}, {str8_lit_comp("run_command"), str8_lit_comp(""), str8_lit_comp("Run Command"), str8_lit_comp(""), RD_IconKind_Null}, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 3b559d9e..79fbb5a3 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9460,7 +9460,7 @@ rd_theme_tree_from_name(Arena *arena, Access *access, String8 theme_name) } if(theme_tree == &md_nil_node) { - String8 path = str8f(scratch.arena, "%S/raddbg/themes/%S", get_process_info()->user_program_data_path, theme_name); + String8 path = str8f(scratch.arena, "%S/%Sraddbg/themes/%S", program_data_folder_prefix_from_os(OperatingSystem_CURRENT), get_process_info()->user_program_data_path, theme_name); U64 endt_us = now_time_us()+100; if(rd_state->frame_index <= 5) { @@ -10293,7 +10293,7 @@ rd_init(CmdLine *cmdln) { Temp scratch = scratch_begin(0, 0); String8 user_program_data_path = get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); + String8 user_data_folder = push_str8f(scratch.arena, "%S/%Sraddbg/logs", user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); rd_state->log_path = push_str8f(rd_state->arena, "%S/ui_thread.raddbg_log", user_data_folder); make_directory(user_data_folder); write_data_to_file_path(rd_state->log_path, str8_zero()); @@ -12987,7 +12987,7 @@ rd_frame(void) case RD_CmdKind_RecordUserAsLastOpened: { String8 file_path = rd_regs()->file_path; - String8 last_user_path = str8f(scratch.arena, "%S/raddbg/last_user", get_process_info()->user_program_data_path); + String8 last_user_path = str8f(scratch.arena, "%S/%Sraddbg/last_user", get_process_info()->user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); write_data_to_file_path(last_user_path, file_path); }break; @@ -15555,7 +15555,7 @@ rd_frame(void) String8 name = rd_regs()->string; if(name.size != 0) { - String8 themes_folder = str8f(scratch.arena, "%S/raddbg/themes", get_process_info()->user_program_data_path); + String8 themes_folder = str8f(scratch.arena, "%S/%Sraddbg/themes", get_process_info()->user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); if(make_directory(themes_folder)) { String8 dst_path = push_str8f(scratch.arena, "%S/%S", themes_folder, name); diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 8b34dd7a..ffd50cee 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -122,7 +122,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(themes) //- rjf: gather theme files { - String8 theme_folder = push_str8f(scratch.arena, "%S/raddbg/themes", get_process_info()->user_program_data_path); + String8 theme_folder = push_str8f(scratch.arena, "%S/%Sraddbg/themes", get_process_info()->user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); FileIter *it = file_iter_begin(scratch.arena, theme_folder, FileIterFlag_SkipFolders); for(FileInfo info = {0}; file_iter_next(scratch.arena, it, &info);) { From 1a481551161afefd25b0d832b6daeeadffd4d6a8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 19 May 2026 09:56:01 -0700 Subject: [PATCH 566/850] checkpoint on dump file parsing / cache construction; temporarily turn off crash dump command, since still wip --- src/coff/coff.h | 33 ++-- src/dbg_engine/dbg_engine.mdesk | 2 +- src/dbg_engine/dbg_engine_ctrl.c | 248 +++++++++++++++++------------ src/dbg_engine/dbg_engine_ctrl.h | 16 ++ src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg_core.c | 4 +- src/raddbg/raddbg_widgets.c | 2 +- src/win32/base/win32_base.c | 1 + 8 files changed, 186 insertions(+), 122 deletions(-) diff --git a/src/coff/coff.h b/src/coff/coff.h index 6c321fc6..5459f97c 100644 --- a/src/coff/coff.h +++ b/src/coff/coff.h @@ -163,24 +163,25 @@ enum #define COFF_SectionFlags_ExtractAlign(f) (COFF_SectionAlign)(((f) >> COFF_SectionFlag_AlignShift) & COFF_SectionFlag_AlignMask) #define COFF_SectionFlags_LnkFlags ((COFF_SectionFlag_AlignMask << COFF_SectionFlag_AlignShift) | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_LnkInfo | COFF_SectionFlag_LnkOther | COFF_SectionFlag_LnkRemove | COFF_SectionFlag_LnkNRelocOvfl) -typedef struct COFF_SectionHeader +typedef struct COFF_SectionHeader COFF_SectionHeader; +struct COFF_SectionHeader { - U8 name[8]; - U32 vsize; - U32 voff; - U32 fsize; - U32 foff; - U32 relocs_foff; - U32 lines_foff; - U16 reloc_count; - U16 line_count; + U8 name[8]; + U32 vsize; + U32 voff; + U32 fsize; + U32 foff; + U32 relocs_foff; + U32 lines_foff; + U16 reloc_count; + U16 line_count; COFF_SectionFlags flags; -} COFF_SectionHeader; +}; //////////////////////////////// typedef U8 COFF_SymType; -enum +typedef enum COFF_SymTypeEnum { COFF_SymType_Null, COFF_SymType_Void, @@ -198,10 +199,11 @@ enum COFF_SymType_Word, COFF_SymType_UInt, COFF_SymType_DWord -}; +} +COFF_SymTypeEnum; typedef U8 COFF_SymStorageClass; -enum +typedef enum COFF_SymStorageClassEnum { COFF_SymStorageClass_Null = 0x00, COFF_SymStorageClass_Automatic = 0x01, @@ -230,7 +232,8 @@ enum COFF_SymStorageClass_WeakExternal = 0x69, COFF_SymStorageClass_CLRToken = 0x6b, COFF_SymStorageClass_EndOfFunction = 0xff -}; +} +COFF_SymStorageClassEnum; typedef U8 COFF_SymDType; enum diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 5e320930..61e65300 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -52,7 +52,7 @@ D_CmdTable: // | | | | {Attach 1 1 0 0 "query:unattached_processes" PID null Nil Null 0 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" "" } //- rjf: crash dump opening - {OpenCrashDump 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } + {OpenCrashDump 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } } @enum D_CmdKind: diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index b3f77090..60ed51e4 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -3830,6 +3830,12 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); + // rjf: extract sections + U64 sec_array_off = opt_ext_off_range.max; + U64 sec_count = file_header.section_count; + COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); + d_process_read(process, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); + // rjf: grab pdatas from exceptions section if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) { @@ -3841,12 +3847,6 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang d_process_read(process, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); } - // rjf: extract sections - U64 sec_array_off = opt_ext_off_range.max; - U64 sec_count = file_header.section_count; - COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); - d_process_read(process, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); - // rjf: grab entry point vaddr entry_point_voff = entry_point; @@ -3960,19 +3960,17 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang // else if(str8_match(str8(module_sig_bytes, elf_magic_string.size), elf_magic_string, 0)) { - U64 e_entry = 0; - ELF_Type e_type = ELF_Type_None; + U64 e_entry = 0; + ELF_Type e_type = ELF_Type_None; { U8 *elf_sig = d_data_from_process_vaddr_range(scratch.arena, process, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max), 0).str; if(elf_sig == 0) { goto elf_exit; } switch(elf_sig[ELF_Identifier_Class]) { default: - case ELF_Class_None:{}break; + case ELF_Class_None: case ELF_Class_32: - { - NotImplemented; - }break; + {}break; case ELF_Class_64: { ELF_Hdr64 *ehdr = (ELF_Hdr64 *)d_data_from_process_vaddr_range(scratch.arena, process, r1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr)), 0).str; @@ -3994,12 +3992,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang { void *phdrs_raw = d_data_from_process_vaddr_range(scratch.arena, process, elf_phdr_vrange, 0).str; if(phdrs_raw == 0) { goto elf_exit; } - - if(elf_phdr_entsize == sizeof(ELF_Phdr32)) - { - NotImplemented; - } - else if(elf_phdr_entsize == sizeof(ELF_Phdr64)) + if(elf_phdr_entsize == sizeof(ELF_Phdr64)) { U64 elf_phcount = dim_1u64(elf_phdr_vrange) / elf_phdr_entsize; ELF_Phdr64 *phdrs64 = phdrs_raw; @@ -4201,9 +4194,11 @@ d_ctrl_thread__close_dump_process(D_MsgID msg_id, D_Handle process) U64 hash = d_hash_from_handle(process); U64 slot_idx = hash%cache->slots_count; Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); + + // rjf: remove node + D_DumpNode *node = 0; RWMutexScope(stripe->rw_mutex, 1) { - D_DumpNode *node = 0; for(D_DumpNode *n = cache->slots[slot_idx].first; n != 0; n = n->next) { if(d_handle_match(n->process, process)) @@ -4215,14 +4210,30 @@ d_ctrl_thread__close_dump_process(D_MsgID msg_id, D_Handle process) if(node != 0) { DLLRemove(cache->slots[slot_idx].first, cache->slots[slot_idx].last, node); - node->next = (D_DumpNode *)stripe->free; - stripe->free = node; - file_map_view_close(node->map, node->base, r1u64(0, node->props.size)); - file_map_close(node->map); - file_close(node->file); - arena_release(node->arena); } } + + // rjf: release node contents + if(node != 0) + { + for EachIndex(idx, node->modules_count) + { + file_map_view_close(node->modules[idx].map, node->modules[idx].base, r1u64(0, node->modules[idx].props.size)); + file_map_close(node->modules[idx].map); + file_close(node->modules[idx].file); + } + file_map_view_close(node->map, node->base, r1u64(0, node->props.size)); + file_map_close(node->map); + file_close(node->file); + arena_release(node->arena); + } + + // rjf: attach node to free list + if(node != 0) RWMutexScope(stripe->rw_mutex, 1) + { + node->next = (D_DumpNode *)stripe->free; + stripe->free = node; + } } } @@ -5125,7 +5136,11 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) U64 memory_ranges_count = 0; D_DumpThread *dump_threads = 0; U64 dump_threads_count = 0; + D_DumpModule *dump_modules = 0; + U64 dump_modules_count = 0; D_Handle process = {0}; + Arch process_arch = Arch_Null; + OperatingSystem process_os = OperatingSystem_Null; { //- rjf: try minidump parse -> construct events for entity creation { @@ -5213,9 +5228,6 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } } - // rjf: allocate parse artifact arena - arena = arena_alloc(); - // rjf: gather memory ranges memory_ranges_count = memories_count + memories64_count; memory_ranges = push_array(arena, D_DumpMemoryRange, memory_ranges_count); @@ -5235,50 +5247,34 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } // rjf: system info -> arch - Arch arch = Arch_Null; if(system_info != 0) switch(system_info->processor_architecture) { default:{}break; - case MDMP_Arch_x86:{arch = Arch_x86;}break; - case MDMP_Arch_x64:{arch = Arch_x64;}break; + case MDMP_Arch_x86:{process_arch = Arch_x86;}break; + case MDMP_Arch_x64:{process_arch = Arch_x64;}break; } - // rjf: process creation - U64 handle_id_gen = 1; - process = d_dump_handle_make(D_MachineID_Local, handle_id_gen); - handle_id_gen += 1; - { - D_Event *evt = d_event_list_push(scratch.arena, &evts); - evt->kind = D_EventKind_NewProc; - evt->msg_id = msg->msg_id; - evt->entity = process; - evt->arch = arch; - evt->target_os = OperatingSystem_Windows; - evt->string = path; - } + // rjf: create process handle + d_ctrl_state->ctrl_thread_dump_handle_id_gen += 1; + process = d_dump_handle_make(D_MachineID_Local, d_ctrl_state->ctrl_thread_dump_handle_id_gen); + process_os = OperatingSystem_Windows; // NOTE(rjf): minidumps are always windows - // rjf: thread creation + // rjf: gather threads dump_threads_count = threads_count; dump_threads = push_array(arena, D_DumpThread, dump_threads_count); for EachIndex(idx, threads_count) { + d_ctrl_state->ctrl_thread_dump_handle_id_gen += 1; MDMP_Thread *thread = &threads[idx]; - D_Handle thread_handle = d_dump_handle_make(D_MachineID_Local, handle_id_gen); + D_Handle thread_handle = d_dump_handle_make(D_MachineID_Local, d_ctrl_state->ctrl_thread_dump_handle_id_gen); dump_threads[idx].thread_handle = thread_handle; + dump_threads[idx].id = thread->id; dump_threads[idx].context_foff = thread->thread_context.foff; - D_Event *evt = d_event_list_push(scratch.arena, &evts); - evt->kind = D_EventKind_NewThread; - evt->msg_id = msg->msg_id; - evt->entity = thread_handle; - evt->parent = process; - evt->arch = arch; - evt->entity_id = thread->id; - // TODO(rjf): evt->stack_base = ; (use thread->stack) - // TODO(rjf): evt->tls_root = ; (use thread->thread_context) - handle_id_gen += 1; } - // rjf: module loads + // rjf: gather modules + dump_modules_count = modules_count; + dump_modules = push_array(arena, D_DumpModule, dump_modules_count); for EachIndex(idx, modules_count) { // rjf: unpack module @@ -5296,60 +5292,37 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) module_name = path_normalized_from_string(scratch.arena, module_name); } - // rjf: open module - D_Handle module_handle = d_dump_handle_make(D_MachineID_Local, handle_id_gen); - handle_id_gen += 1; - d_ctrl_thread__module_open(process, module_handle, vaddr_range, module_name, r1u64(0, 0), 0); + // rjf: open module file + File module_file = file_open(AccessFlag_Read|AccessFlag_ShareRead, module_name); + FileProperties module_props = properties_from_file(module_file); + FileMap module_map = file_map_open(AccessFlag_Read, module_file); + void *module_base = file_map_view_open(module_map, AccessFlag_Read, r1u64(0, module_props.size)); - // rjf: open debug info - String8 initial_debug_info_path = d_initial_debug_info_path_from_module(scratch.arena, module_handle); - U64 debug_info_timestamp = properties_from_file_path(initial_debug_info_path).modified; - DI_Key initial_dbgi_key = di_key_from_path_timestamp(initial_debug_info_path, debug_info_timestamp); - di_open(initial_dbgi_key); - - // rjf: push module load event - { - D_Event *evt = d_event_list_push(scratch.arena, &evts); - evt->kind = D_EventKind_NewModule; - evt->msg_id = msg->msg_id; - evt->entity = module_handle; - evt->parent = process; - evt->arch = arch; - evt->vaddr_rng = vaddr_range; - evt->string = module_name; - // TODO(rjf): evt->stack_base = ; (use thread->stack) - // TODO(rjf): evt->tls_root = ; (use thread->thread_context) - } - - // rjf: push debug info initial path set event - { - D_Event *evt = d_event_list_push(scratch.arena, &evts); - evt->kind = D_EventKind_ModuleDebugInfoPathChange; - evt->msg_id = msg->msg_id; - evt->entity = module_handle; - evt->parent = process; - evt->timestamp = debug_info_timestamp; - evt->string = initial_debug_info_path; - } + // rjf: store + d_ctrl_state->ctrl_thread_dump_handle_id_gen += 1; + dump_modules[idx].module_handle = d_dump_handle_make(D_MachineID_Local, d_ctrl_state->ctrl_thread_dump_handle_id_gen); + dump_modules[idx].vaddr_range = vaddr_range; + dump_modules[idx].path = str8_copy(arena, module_name); + dump_modules[idx].file = module_file; + dump_modules[idx].props = module_props; + dump_modules[idx].map = module_map; + dump_modules[idx].base = module_base; } } } } - //- rjf: record stop + //- rjf: record process creation { - D_Event *event = d_event_list_push(scratch.arena, &evts); - event->kind = D_EventKind_Stopped; - event->cause = D_EventCause_Finished; - event->msg_id = msg->msg_id; + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_NewProc; + evt->msg_id = msg->msg_id; + evt->entity = process; + evt->arch = process_arch; + evt->target_os = process_os; + evt->string = path; } - //- rjf: push all events from the parse - ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); - ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); - ins_atomic_u64_inc_eval(&d_ctrl_state->run_gen); - d_c2u_push_events(&evts); - //- rjf: store the dump parse artifacts in the dump cache, otherwise release if(stored) { @@ -5379,6 +5352,8 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) node->memory_ranges_count = memory_ranges_count; node->threads = dump_threads; node->threads_count = dump_threads_count; + node->modules = dump_modules; + node->modules_count = dump_modules_count; } } else @@ -5392,6 +5367,75 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) file_close(file); } + //- rjf: record thread creation + for EachIndex(idx, dump_threads_count) + { + D_Handle thread_handle = dump_threads[idx].thread_handle; + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_NewThread; + evt->msg_id = msg->msg_id; + evt->entity = thread_handle; + evt->parent = process; + evt->arch = process_arch; + evt->entity_id = dump_threads[idx].id; + // TODO(rjf): evt->stack_base = ; (use thread->stack) + // TODO(rjf): evt->tls_root = ; (use thread->thread_context) + } + + //- rjf: record module loading + for EachIndex(idx, dump_modules_count) + { + // rjf: open module + D_Handle module_handle = dump_modules[idx].module_handle; + Rng1U64 vaddr_range = dump_modules[idx].vaddr_range; + d_ctrl_thread__module_open(process, module_handle, vaddr_range, dump_modules[idx].path, r1u64(0, 0), 0); + + // rjf: open debug info + String8 initial_debug_info_path = d_initial_debug_info_path_from_module(scratch.arena, module_handle); + U64 debug_info_timestamp = properties_from_file_path(initial_debug_info_path).modified; + DI_Key initial_dbgi_key = di_key_from_path_timestamp(initial_debug_info_path, debug_info_timestamp); + di_open(initial_dbgi_key); + + // rjf: push module load event + { + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_NewModule; + evt->msg_id = msg->msg_id; + evt->entity = module_handle; + evt->parent = process; + evt->arch = process_arch; + evt->vaddr_rng = vaddr_range; + evt->string = dump_modules[idx].path; + // TODO(rjf): evt->stack_base = ; (use thread->stack) + // TODO(rjf): evt->tls_root = ; (use thread->thread_context) + } + + // rjf: push debug info initial path set event + { + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_ModuleDebugInfoPathChange; + evt->msg_id = msg->msg_id; + evt->entity = module_handle; + evt->parent = process; + evt->timestamp = debug_info_timestamp; + evt->string = initial_debug_info_path; + } + } + + //- rjf: record stop + { + D_Event *event = d_event_list_push(scratch.arena, &evts); + event->kind = D_EventKind_Stopped; + event->cause = D_EventCause_Finished; + event->msg_id = msg->msg_id; + } + + //- rjf: push all events from the parse + ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->reg_gen); + ins_atomic_u64_inc_eval(&d_ctrl_state->run_gen); + d_c2u_push_events(&evts); + scratch_end(scratch); } diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 054775c4..4dc4090c 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -228,9 +228,22 @@ typedef struct D_DumpThread D_DumpThread; struct D_DumpThread { D_Handle thread_handle; + U32 id; U64 context_foff; }; +typedef struct D_DumpModule D_DumpModule; +struct D_DumpModule +{ + D_Handle module_handle; + Rng1U64 vaddr_range; + String8 path; + File file; + FileProperties props; + FileMap map; + void *base; +}; + typedef struct D_DumpNode D_DumpNode; struct D_DumpNode { @@ -246,6 +259,8 @@ struct D_DumpNode U64 memory_ranges_count; D_DumpThread *threads; U64 threads_count; + D_DumpModule *modules; + U64 modules_count; }; typedef struct D_DumpSlot D_DumpSlot; @@ -349,6 +364,7 @@ struct D_CtrlState CondVar c2u_ring_cv; // rjf: ctrl thread state + U64 ctrl_thread_dump_handle_id_gen; U64 ctrl_thread_run_state; String8 ctrl_thread_log_path; Thread ctrl_thread; diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index db5f0111..909305e7 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -610,7 +610,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 79fbb5a3..c2dc44b7 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5575,11 +5575,11 @@ rd_window_frame(void) } else if(dbg_info_entity->string.size != 0) { - ui_labelf("Debug information not found at %S", dbg_info_entity->string); + ui_labelf("Debug info not found at %S", dbg_info_entity->string); } else if(dbg_info_entity->string.size == 0) { - ui_labelf("Debug information location not found in module file"); + ui_labelf("Debug info location not found in module file"); } access_close(access); } diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index a5e8f160..0170ddd9 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -612,7 +612,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr if(rdi->raw_data_size == 0) { dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" ")); - dr_fstrs_push_new(arena, &result, ¶ms, str8_lit("(Debug information not loaded)"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .size = extras_size, .color = secondary_color); + dr_fstrs_push_new(arena, &result, ¶ms, str8_lit("(Debug info not loaded)"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .size = extras_size, .color = secondary_color); } access_close(access); } diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index 8de2f830..ea451af3 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1101,6 +1101,7 @@ file_map_view_open(FileMap map, AccessFlags flags, Rng1U64 range) } } void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size); + DWORD err = GetLastError(); return result; } From 3360d97e3752439b14d1cb7d93e18b59e6d5191f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 19 May 2026 11:14:19 -0700 Subject: [PATCH 567/850] fix eval space creation for nil entities --- src/dbg_info/dbg_info.c | 2 +- src/raddbg/raddbg_core.c | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 78fdcb29..5cbbf1b6 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1306,7 +1306,7 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 * } lane_sync(); - //- rjf: sort records if we have a query + //- rjf: sort records if(!cancelled) ProfScope("sort records") { //- rjf: set up common data diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index c2dc44b7..f8dd89a9 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -704,9 +704,13 @@ rd_ctrl_entity_from_eval_space(E_Space space) internal E_Space rd_eval_space_from_ctrl_entity(D_Entity *entity, E_SpaceKind kind) { - E_Space space = e_space_make(kind); - space.u64s[0] = (((U64)entity->handle.machine_id) << 32) | (((U64)entity->handle.controller_kind) << 0); - space.u64s[1] = entity->handle.entity_id; + E_Space space = {0}; + if(entity != &d_entity_nil) + { + space = e_space_make(kind); + space.u64s[0] = (((U64)entity->handle.machine_id) << 32) | (((U64)entity->handle.controller_kind) << 0); + space.u64s[1] = entity->handle.entity_id; + } return space; } From 82f47e34360525a3019571344f0a93c1ba555f87 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 19 May 2026 11:55:27 -0700 Subject: [PATCH 568/850] changelog notes --- CHANGELOG.md | 113 ++++++++++++++++++++++++++++++++++++++++++++--- src/ui/ui_core.c | 6 +-- 2 files changed, 109 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d7b2d74..80b0a19d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,114 @@ # v0.9.26-alpha +## Debugger Changes + +- Added scope ending visualizations to the text view, to display the header of + a scope at the closing position of the scope. This can be turned off via the + `Cursor Scope End Annotations` setting. +- Added the ability to evaluate `autos`, which is a collection of expressions + that the debugger determines refer to symbols which are being (or about to + be) changed by the selected thread. +- Added source-inline and disassembly-inline visualization of auto expressions. + This can be turned off via the `Show Auto Watches In Source / Disassembly` + setting. +- Added the ability to evaluate local static variables unambiguously, when the + same name is used for multiple local static variables, even when outside the + function containing the local static. This can be done by namespacing the + variable name with the containing function, either using a `::` or `.` + operator. +- Added a setting, `Transient Tabs`, to disable transient tabs being opened, + when the debugger automatically snaps to new code locations. +- Added a setting, `Display Pointer Addresses Before Contents`, to always + force the debugger to show pointer addresses before attempting to visualize + to what the pointer points. +- Adjusted the `Step Out` command to perform scope-granularity stepping, rather + than only being function-frame-granularity. This uses scope information found + in debug info to step out of scopes when possible, rather than always exiting + the current function frame. This makes the command much more useful for + stepping through larger functions with several scopes of larger work, or for + stepping out of loops. +- Adjusted the debugger's user & project configuration file behavior to be less + idiosyncratic with other programs. Project files are no longer auto-loaded + based on the project last loaded during the previous debugger runtime. + Creating a new user or project also does not immediately require choosing a + path for the file; these can later be specified using the respective `Save` + commands. +- Added syntax highlighting and tab-completion for view identifiers in + watch expressions. +- Added more in-debugger documentation for views and their arguments, when + written in a watch expression. +- Moved configuration data previously treated as project data to being user + data, tagged with the associated project. This includes loaded debug info and + breakpoints. The effect of this is that project files are much easier to + check into source control (they do not change in spurious ways for other + users on a project), but project-related user configuration will still be + correctly filtered based on whatever project is loaded. +- Improved the debugger's behavior with respect to keeping previously-loaded + debug info around. Now, when the debugger begins a new debugging session, it + will unload all loaded debug info, and it will only reload debug info that is + actively found to be needed by debuggees. This preserves the debugger's + ability to use debug info without debugging for features like + go-to-definition and type evaluation, but it stops the debugger from keeping + old and unneeded debug info loaded indefinitely (until it is manually + unloaded). +- Adjusted recent project visualization to include the name of the project, + specified with the `Project Name` setting. +- Renamed `Switch` to `Open Source File From Debug Info`, to better represent + the command's functionality. +- Adjusted file path evaluation visualization to include the full path to the + containing folder, when it is not obvious from context (for instance, if the + file evaluation is a child evaluation of a folder evaluation, the containing + folder path is not shown; if the file path is evaluated standalone, as it is + in the lister generated for the `Open Source File From Debug Info` command, + then the containing folder path is shown). +- Improved visualization of unmapped addresses in the memory view. Now, instead + of bytes at these addresses being displayed as `0` with a special background, + they are displayed as `x`, and the annotations for these addresses (displayed + at the bottom of the memory view, for the cursor's cell) explicitly label + them as being unmapped. +- Improved visualization of unmapped addresses in watch expressions. Now, + instead of only being colored differently with evaluations reading as zeroed + memory, the value will explicitly label addresses as unmapped when possible. +- Fixed a leak which most notably manifested during rapid creation/destruction + of new threads. +- Fixed a leak related to debugger's config state. This was difficult to + reproduce, but it may fix leaks experienced after running the debugger for an + extended period of time. +- Fixed a bug where cross-module evaluations would resolve to incorrect + addresses, due to using the incorrect module's base virtual address. This was + also causing broken behavior sometimes in the `Go To Name` lister, and + other similar UIs. +- Fixed a bug where panels without tabs were unnecessarily keeping the debugger + UI awake in some cases. +- Replaced the DWARF -> RDI converter with a new multithreaded version, which + should execute much faster on larger DWARF debug info, and produce much + smaller RDI output, due to the addition of type deduplication. +- Introduced structured namespaces to RDI, which structurally encode namespace + hierarchies for debug info symbols, instead of this information being + implicitly baked using language-specific conventions into symbol names. This + is used to deduplicate repeated namespace prefixes from symbol names, leading + to a smaller string footprint for generated RDIs. Symbols now only store + their partially-qualified name. For example, for a C++ symbol `A::B::C`, the + symbol itself will store its name as `C`, but it will also record its + container as being `B`. `B`, then, will record its container as being `A`. + This allows users of RDI to dynamically construct the fully-qualified name as + needed, and it allows for more reliable and language-agnostic usage of + partially-qualified symbol names. + + ## Linker Changes - Implemented /DEBUG:GHASH -- Fixed an issue where an import thunk or import address could be linked from the currently searched library - instead of the library where the first import reference was found. For example, if the first pass finds the import - thunk in foo.lib and the second pass resolves symbol to the import address in bar.lib, the linker now always linkes - the import thunk and import address members from the library where the first reference was found. -- /OPT:REF: Fixed an issue with garbage collection of associated sections and weak symbols that led linker to remove - live sections. -- /OPT:REF Added relocation batching to reduce contention on the global reference list during garbage collection. +- Fixed an issue where an import thunk or import address could be linked from + the currently searched library instead of the library where the first import + reference was found. For example, if the first pass finds the import thunk in + foo.lib and the second pass resolves symbol to the import address in bar.lib, + the linker now always linkes the import thunk and import address members from + the library where the first reference was found. +- /OPT:REF: Fixed an issue with garbage collection of associated sections and + weak symbols that led linker to remove live sections. +- /OPT:REF Added relocation batching to reduce contention on the global + reference list during garbage collection. # v0.9.25-alpha diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 0504e490..a632976d 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2890,11 +2890,11 @@ ui_signal_from_box(UI_Box *box) sig.f |= (UI_SignalFlag_LeftTripleClicked<press_timestamp_history_us[evt_mouse_button_kind][1], &ui_state->press_timestamp_history_us[evt_mouse_button_kind][0], - sizeof(ui_state->press_timestamp_history_us[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_timestamp_history_us[evt_mouse_button_kind])-1); + sizeof(ui_state->press_timestamp_history_us[evt_mouse_button_kind][0]) * (ArrayCount(ui_state->press_timestamp_history_us[evt_mouse_button_kind])-1)); MemoryCopy(&ui_state->press_key_history[evt_mouse_button_kind][1], &ui_state->press_key_history[evt_mouse_button_kind][0], - sizeof(ui_state->press_key_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_key_history[evt_mouse_button_kind])-1); + sizeof(ui_state->press_key_history[evt_mouse_button_kind][0]) * (ArrayCount(ui_state->press_key_history[evt_mouse_button_kind])-1)); MemoryCopy(&ui_state->press_pos_history[evt_mouse_button_kind][1], &ui_state->press_pos_history[evt_mouse_button_kind][0], - sizeof(ui_state->press_pos_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_pos_history[evt_mouse_button_kind])-1); + sizeof(ui_state->press_pos_history[evt_mouse_button_kind][0]) * (ArrayCount(ui_state->press_pos_history[evt_mouse_button_kind])-1)); ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] = evt->timestamp_us; ui_state->press_key_history[evt_mouse_button_kind][0] = box->key; ui_state->press_pos_history[evt_mouse_button_kind][0] = evt_mouse; From 161663016f5b0e33c8dce193e30211fa7df0c6e0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 19 May 2026 11:56:08 -0700 Subject: [PATCH 569/850] project.raddbg --- project.raddbg | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 project.raddbg diff --git a/project.raddbg b/project.raddbg new file mode 100644 index 00000000..39d39fdf --- /dev/null +++ b/project.raddbg @@ -0,0 +1,34 @@ +// raddbg 0.9.26 project file + +name: "The RAD Debugger" +theme: "VS (Dark)" +target: +{ + executable: "build/raddbg.exe" + working_directory: build + arguments: "--user:raddbg_test.user --project:raddbg_test.project" + enabled: 1 +} +target: +{ + executable: "build/raddbg.exe" + working_directory: "../raddebugger" + arguments: "project.raddbg" +} +target: +{ + executable: "build/mule_main.exe" + working_directory: build +} +target: +{ + executable: "build/radbin.exe" + working_directory: build + arguments: "--rdi simple --thread_count=1" +} +target: +{ + executable: "build/raddbg.exe" + working_directory: "build/dwarf" + arguments: "--bin --rdi a.exe" +} From 17cdf458d32f2268b4ed43d855543624a635bfb4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 19 May 2026 12:08:26 -0700 Subject: [PATCH 570/850] on ambiguous debug info matches, inside primary debug info -> try building a fully qualified name from context, and replacing initial debug info match if it hits --- src/dbg_info/dbg_info.c | 6 ++++-- src/dbg_info/dbg_info.h | 1 + src/eval/eval_ir.c | 23 ++++++++++++++++++++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 5cbbf1b6..7bd22698 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1699,6 +1699,7 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g lane_matches[lane_idx()].key = dbgi_key; lane_matches[lane_idx()].section_kind = name_map_section_kinds[name_map_kind_idx]; lane_matches[lane_idx()].idx = filtered_matches[selected_match_idx]; + lane_matches[lane_idx()].count = filtered_matches_count; } } } @@ -1732,7 +1733,7 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g artifact.u64[0] = match.key.u64[0]; artifact.u64[1] = match.key.u64[1]; artifact.u64[2] = match.section_kind; - artifact.u64[3] = match.idx; + artifact.u64[3] = ((U64)(match.idx & 0xffffffffull) << 32) | ((U64)(match.count & 0xffffffffull) << 0); } lane_sync(); @@ -1760,7 +1761,8 @@ di_match_from_string(String8 string, U64 match_index, DI_Key preferred_dbgi_key, result.key.u64[0] = artifact.u64[0]; result.key.u64[1] = artifact.u64[1]; result.section_kind = artifact.u64[2]; - result.idx = artifact.u64[3]; + result.idx = (artifact.u64[3] & 0xffffffff00000000ull) >> 32; + result.count = (artifact.u64[3] & 0x00000000ffffffffull) >> 0; } scratch_end(scratch); access_close(access); diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 654a94c9..26e821bf 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -202,6 +202,7 @@ struct DI_Match DI_Key key; RDI_SectionKind section_kind; U32 idx; + U32 count; }; //////////////////////////////// diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index a8c5906c..5fd76795 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1900,6 +1900,26 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I // rjf: find match DI_Match match = di_match_from_string(string, match_disambiguating_idx, e_base_ctx->primary_dbg_info->dbgi_key, 0); + // rjf: match -> RDI + RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0); + + // rjf: ambiguous global/thread variable in primary debug info -> try fully qualifying the name implicitly. + if((match.section_kind == RDI_SectionKind_GlobalVariables || + match.section_kind == RDI_SectionKind_ThreadVariables) && + match.count != 1 && + rdi == e_base_ctx->primary_dbg_info->rdi) + { + U64 voff = e_base_ctx->thread_ip_voff; + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); + String8 procedure_name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, procedure); + String8 fully_qualified_name = str8f(scratch.arena, "%S.%S", procedure_name, string); + DI_Match fully_qualified_match_maybe = di_match_from_string(fully_qualified_name, match_disambiguating_idx, e_base_ctx->primary_dbg_info->dbgi_key, 0); + if(fully_qualified_match_maybe.idx != 0) + { + match = fully_qualified_match_maybe; + } + } + #if 0 //~ TODO(rjf): vvvvv this used to be used for namespaceifying partially-qualified strings. // now, the debugger just stores partially-qualified strings, so we instead need to do the @@ -1943,9 +1963,6 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I } #endif - // rjf: match -> RDI - RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0); - // rjf: find dbg info from rdi E_DbgInfo *dbg_info = &e_dbg_info_nil; U32 dbg_info_num = 0; From 7a5ae846e9f1b27bfea86ec405b609b50bdfa12d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 19 May 2026 12:34:37 -0700 Subject: [PATCH 571/850] annotate changelog notes with issue numbers --- CHANGELOG.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80b0a19d..0df036ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ same name is used for multiple local static variables, even when outside the function containing the local static. This can be done by namespacing the variable name with the containing function, either using a `::` or `.` - operator. + operator. (#359) - Added a setting, `Transient Tabs`, to disable transient tabs being opened, when the debugger automatically snaps to new code locations. - Added a setting, `Display Pointer Addresses Before Contents`, to always @@ -26,13 +26,15 @@ in debug info to step out of scopes when possible, rather than always exiting the current function frame. This makes the command much more useful for stepping through larger functions with several scopes of larger work, or for - stepping out of loops. + stepping out of loops. (#746) - Adjusted the debugger's user & project configuration file behavior to be less idiosyncratic with other programs. Project files are no longer auto-loaded based on the project last loaded during the previous debugger runtime. Creating a new user or project also does not immediately require choosing a path for the file; these can later be specified using the respective `Save` - commands. + commands. (#743) +- Adjusted the debugger to automatically set the current path when loading a + project file. (#743) - Added syntax highlighting and tab-completion for view identifiers in watch expressions. - Added more in-debugger documentation for views and their arguments, when @@ -50,7 +52,7 @@ ability to use debug info without debugging for features like go-to-definition and type evaluation, but it stops the debugger from keeping old and unneeded debug info loaded indefinitely (until it is manually - unloaded). + unloaded). (#711) - Adjusted recent project visualization to include the name of the project, specified with the `Project Name` setting. - Renamed `Switch` to `Open Source File From Debug Info`, to better represent @@ -70,7 +72,7 @@ instead of only being colored differently with evaluations reading as zeroed memory, the value will explicitly label addresses as unmapped when possible. - Fixed a leak which most notably manifested during rapid creation/destruction - of new threads. + of new threads. (#780) - Fixed a leak related to debugger's config state. This was difficult to reproduce, but it may fix leaks experienced after running the debugger for an extended period of time. @@ -80,6 +82,8 @@ other similar UIs. - Fixed a bug where panels without tabs were unnecessarily keeping the debugger UI awake in some cases. +- Fixed a bug preventing hover evaluation from working on indexing expressions. + (#707) - Replaced the DWARF -> RDI converter with a new multithreaded version, which should execute much faster on larger DWARF debug info, and produce much smaller RDI output, due to the addition of type deduplication. @@ -94,6 +98,8 @@ This allows users of RDI to dynamically construct the fully-qualified name as needed, and it allows for more reliable and language-agnostic usage of partially-qualified symbol names. +- Adjusted the debugger to not rely on `SynchronizationBarrier` functions on + Windows when they're not available (pre-Windows-8). (#739) ## Linker Changes From 95f4ade10d5e4c9a4345fb460363bf60b15aed0e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 19 May 2026 14:35:29 -0700 Subject: [PATCH 572/850] lift wait-for-process-memory-cache-update out of d_process_write, since that path runs on control thread now too as the general 'process handle write' abstraction - just move into the rd_eval_space_write path, since that wait was only for UI benefit anyways --- src/arch/arch.c | 2 + src/arch/arch.h | 3 +- src/dbg_engine/dbg_engine_ctrl.c | 149 +++++++++++++++++-------------- src/dbg_engine/dbg_engine_ctrl.h | 10 ++- src/dbg_engine/dbg_engine_user.c | 12 +-- src/demon/demon_core.c | 69 -------------- src/demon/demon_core.h | 20 ----- src/linux/demon/linux_demon.c | 44 ++++++--- src/linux/demon/linux_demon.h | 23 ++++- src/raddbg/raddbg_core.c | 34 +++++-- 10 files changed, 177 insertions(+), 189 deletions(-) diff --git a/src/arch/arch.c b/src/arch/arch.c index 1a31d949..f8521b21 100644 --- a/src/arch/arch.c +++ b/src/arch/arch.c @@ -14,12 +14,14 @@ arch_info_from_arch(Arch arch) #if defined(X64_H) case Arch_x64: { + local_persist U8 trap_inst_bytes[] = {0xcc}; local_persist read_only ARCH_Info info = { .reg_block_size = sizeof(X64_RegBlock), .instruction_pointer_reg_code = X64_RegCode_rip, .stack_pointer_reg_code = X64_RegCode_rsp, .reg_code_count = X64_RegCode_COUNT, + .trap_instruction = {trap_inst_bytes, sizeof(trap_inst_bytes)}, .reg_code_rng_table = x64_reg_code_rng_table, .reg_code_name_table = x64_reg_code_name_table, .reg_code_base_table = x64_reg_code_base_table, diff --git a/src/arch/arch.h b/src/arch/arch.h index 824cfe7a..fa1b1e64 100644 --- a/src/arch/arch.h +++ b/src/arch/arch.h @@ -16,6 +16,7 @@ struct ARCH_Info ARCH_RegCode instruction_pointer_reg_code; ARCH_RegCode stack_pointer_reg_code; U16 reg_code_count; + String8 trap_instruction; Rng1U16 *reg_code_rng_table; String8 *reg_code_name_table; U8 *reg_code_base_table; @@ -29,7 +30,7 @@ global read_only Rng1U16 arch_reg_code_rng_nil = {0}; global read_only String8 arch_reg_code_name_nil = {0}; global read_only U8 arch_reg_code_u8_nil = 0; global read_only B8 arch_reg_code_b8_nil = 0; -global read_only ARCH_Info arch_info_nil = {0, 0, 0, 0, &arch_reg_code_rng_nil, &arch_reg_code_name_nil, &arch_reg_code_u8_nil, &arch_reg_code_b8_nil}; +global read_only ARCH_Info arch_info_nil = {0, 0, 0, 0, {0}, &arch_reg_code_rng_nil, &arch_reg_code_name_nil, &arch_reg_code_u8_nil, &arch_reg_code_b8_nil}; //////////////////////////////// //~ rjf: Abstracted Architecture Functions diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 60ed51e4..6c1d7947 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -845,7 +845,7 @@ internal D_Entity * d_module_from_thread_candidates(D_Entity *thread, D_EntityList *candidates) { D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - U64 thread_rip_vaddr = d_rip_from_thread(thread->handle); + U64 thread_rip_vaddr = d_cached_ip_from_thread(thread->handle); D_Entity *src_module = d_module_from_process_vaddr(process, thread_rip_vaddr); D_Entity *module = &d_entity_nil; for(D_EntityNode *n = candidates->first; n != 0; n = n->next) @@ -1357,7 +1357,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) } thread->stack_base = event->stack_base; } - //d_rip_from_thread(&store->ctx, event->entity); + //d_cached_ip_from_thread(&store->ctx, event->entity); }break; case D_EventKind_EndThread: { @@ -1595,10 +1595,46 @@ d_thread_write_reg_block(D_Handle thread, void *block) return result; } +internal U64 +d_ip_from_thread(D_Handle handle) +{ + U64 result = 0; + Temp scratch = scratch_begin(0, 0); + D_Entity *thread = d_entity_from_handle(handle); + Arch arch = thread->arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 reg_block_size = arch_info->reg_block_size; + void *reg_block = push_array(scratch.arena, U8, reg_block_size); + if(d_thread_read_reg_block(handle, reg_block)) + { + result = arch_ip_from_reg_block(arch_info, reg_block); + } + scratch_end(scratch); + return result; +} + +internal U64 +d_sp_from_thread(D_Handle handle) +{ + U64 result = 0; + Temp scratch = scratch_begin(0, 0); + D_Entity *thread = d_entity_from_handle(handle); + Arch arch = thread->arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 reg_block_size = arch_info->reg_block_size; + void *reg_block = push_array(scratch.arena, U8, reg_block_size); + if(d_thread_read_reg_block(handle, reg_block)) + { + result = arch_sp_from_reg_block(arch_info, reg_block); + } + scratch_end(scratch); + return result; +} + //- rjf: thread register cache reading internal void * -d_reg_block_from_thread(Arena *arena, D_Handle handle) +d_cached_reg_block_from_thread(Arena *arena, D_Handle handle) { D_ThreadRegCache *cache = &d_ctrl_state->thread_reg_cache; D_Entity *thread_entity = d_entity_from_handle(handle); @@ -1658,7 +1694,7 @@ d_reg_block_from_thread(Arena *arena, D_Handle handle) } internal U64 -d_tls_root_vaddr_from_thread(D_Handle handle) +d_cached_tls_root_vaddr_from_thread(D_Handle handle) { DMN_Handle handle_dmn = d_dmn_from_handle(handle); U64 result = dmn_tls_root_vaddr_from_thread(handle_dmn); @@ -1666,26 +1702,26 @@ d_tls_root_vaddr_from_thread(D_Handle handle) } internal U64 -d_rip_from_thread(D_Handle handle) +d_cached_ip_from_thread(D_Handle handle) { Temp scratch = scratch_begin(0, 0); D_Entity *thread_entity = d_entity_from_handle(handle); Arch arch = thread_entity->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); - void *block = d_reg_block_from_thread(scratch.arena, handle); + void *block = d_cached_reg_block_from_thread(scratch.arena, handle); U64 result = arch_ip_from_reg_block(arch_info, block); scratch_end(scratch); return result; } internal U64 -d_rsp_from_thread(D_Handle handle) +d_cached_sp_from_thread(D_Handle handle) { Temp scratch = scratch_begin(0, 0); D_Entity *thread_entity = d_entity_from_handle(handle); Arch arch = thread_entity->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); - void *block = d_reg_block_from_thread(scratch.arena, handle); + void *block = d_cached_reg_block_from_thread(scratch.arena, handle); U64 result = arch_sp_from_reg_block(arch_info, block); scratch_end(scratch); return result; @@ -2978,7 +3014,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) U64 arch_reg_block_size = arch_info->reg_block_size; //- rjf: grab initial register block - void *regs_block = d_reg_block_from_thread(scratch.arena, thread); + void *regs_block = d_cached_reg_block_from_thread(scratch.arena, thread); B32 regs_block_good = (arch != Arch_Null && regs_block != 0); //- rjf: loop & unwind @@ -3572,7 +3608,7 @@ d_ctrl_thread__entry_point(void *p) for EachIndex(idx, threads.count) { Temp scratch = scratch_begin(0, 0); - d_reg_block_from_thread(scratch.arena, threads.v[idx]->handle); + d_cached_reg_block_from_thread(scratch.arena, threads.v[idx]->handle); scratch_end(scratch); } } @@ -4715,7 +4751,7 @@ d_ctrl_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_inf Temp scratch = scratch_begin(0, 0); ARCH_Info *arch_info = arch_info_from_arch(entity->arch); U64 regs_size = arch_info->reg_block_size; - void *regs = d_reg_block_from_thread(scratch.arena, entity->handle); + void *regs = d_cached_reg_block_from_thread(scratch.arena, entity->handle); Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 read_range = intersect_1u64(legal_range, range); U64 read_size = dim_1u64(read_range); @@ -4737,14 +4773,13 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti ProfBeginFunction(); D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; D_EvalScope *scope = push_array(arena, D_EvalScope, 1); - DMN_Handle thread_dmn = d_dmn_from_handle(thread->handle); scope->access = access_open(); ////////////////////////////// //- rjf: unpack thread // Arch arch = thread->arch; - U64 thread_rip_vaddr = dmn_rip_from_thread(thread_dmn); + U64 thread_rip_vaddr = d_ip_from_thread(thread->handle); D_Entity *process = d_process_from_entity(thread); D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); U64 thread_rip_voff = d_voff_from_vaddr(module, thread_rip_vaddr); @@ -5709,7 +5744,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // threads, because otherwise, their stack pointer may change, if single-stepping // causes e.g. entrance into a function via a call instruction. // - U64 sp_check_value = dmn_rsp_from_thread(target_thread_dmn); + U64 sp_check_value = d_sp_from_thread(target_thread); log_infof("sp_check_value := 0x%I64x\n", sp_check_value); ////////////////////////////// @@ -5740,7 +5775,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) for(D_Entity *thread = process->first; thread != &d_entity_nil; thread = thread->next) { if(thread->kind != D_EntityKind_Thread) { continue; } - U64 rip = dmn_rip_from_thread(d_dmn_from_handle(thread->handle)); + U64 rip = d_ip_from_thread(thread->handle); // rjf: determine if thread is frozen B32 thread_is_frozen = thread->is_frozen; @@ -5788,27 +5823,26 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) node != 0; node = node->next) { - DMN_Handle thread = node->v; - U64 thread_pre_rip = dmn_rip_from_thread(thread); + D_Handle thread = d_handle_from_dmn(D_MachineID_Local, node->v); + U64 thread_pre_rip = d_ip_from_thread(thread); U64 thread_post_rip = thread_pre_rip; for(B32 done = 0; !done;) { - log_infof("single_step_stuck_thread([0x%I64x])\n", thread.u64[0]); DMN_RunCtrls run_ctrls = {0}; run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities = &thread; + run_ctrls.run_entities = &node->v; run_ctrls.run_entity_count = 1; if(thread_post_rip == thread_pre_rip) { - run_ctrls.single_step_thread = thread; + run_ctrls.single_step_thread = node->v; } DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); + thread_post_rip = d_ip_from_thread(thread); switch(event->kind) { default:{}break; case DMN_EventKind_ExitThread: - if(dmn_handle_match(event->thread, thread)) + if(d_handle_match(d_handle_from_dmn(D_MachineID_Local, event->thread), thread)) { stop_cause = D_EventCause_Error; goto stop; @@ -6273,7 +6307,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_Entity *thread = d_entity_from_handle(d_handle_from_dmn(D_MachineID_Local, event->thread)); D_Entity *process = d_entity_from_handle(d_handle_from_dmn(D_MachineID_Local, event->process)); Arch arch = thread->arch; - U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); + U64 thread_rip_vaddr = d_ip_from_thread(thread->handle); D_Entity *module = d_module_from_process_vaddr(process, thread_rip_vaddr); ////////////////////////// @@ -6441,21 +6475,21 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_EventCause cond_bp_single_step_stop_cause = D_EventCause_Null; if(hit_conditional_bp_but_filtered) LogInfoNamedBlockF("conditional_bp_hit_single_step") { - DMN_Handle thread = event->thread; - U64 thread_pre_rip = dmn_rip_from_thread(thread); + D_Handle thread = d_handle_from_dmn(D_MachineID_Local, event->thread); + U64 thread_pre_rip = d_ip_from_thread(thread); U64 thread_post_rip = thread_pre_rip; for(B32 single_step_done = 0; !single_step_done;) { DMN_RunCtrls single_step_ctrls = {0}; single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &thread; + single_step_ctrls.run_entities = &event->thread; single_step_ctrls.run_entity_count = 1; if(thread_post_rip == thread_pre_rip) { - single_step_ctrls.single_step_thread = thread; + single_step_ctrls.single_step_thread = event->thread; } DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); + thread_post_rip = d_ip_from_thread(thread); switch(event->kind) { default:{}break; @@ -6471,7 +6505,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) }break; case DMN_EventKind_SingleStep: { - single_step_done = dmn_handle_match(event->thread, thread); + single_step_done = d_handle_match(d_handle_from_dmn(D_MachineID_Local, event->thread), thread); cond_bp_single_step_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; } @@ -6519,7 +6553,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) B32 stack_pointer_matches = 0; if(use_trap_net_logic) { - U64 sp = dmn_rsp_from_thread(d_dmn_from_handle(target_thread)); + U64 sp = d_sp_from_thread(target_thread); stack_pointer_matches = (sp == sp_check_value); } @@ -6530,7 +6564,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { if(hit_trap_flags & D_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF("trap_net__single_step_after_hit") { - U64 thread_pre_rip = dmn_rip_from_thread(d_dmn_from_handle(target_thread)); + U64 thread_pre_rip = d_ip_from_thread(target_thread); U64 thread_post_rip = thread_pre_rip; for(B32 single_step_done = 0; single_step_done == 0;) { @@ -6543,7 +6577,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) single_step_ctrls.single_step_thread = target_thread_dmn; } DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(target_thread_dmn); + thread_post_rip = d_ip_from_thread(target_thread); switch(event->kind) { default:{}break; @@ -6576,7 +6610,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { // rjf: setup spoof mode begin_spoof_mode = 1; - U64 spoof_sp = dmn_rsp_from_thread(target_thread_dmn); + U64 spoof_sp = d_sp_from_thread(target_thread); spoof_mode = 1; spoof.process = target_process; spoof.thread = target_thread; @@ -6594,7 +6628,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) if(stack_pointer_matches) LogInfoNamedBlockF("trap_net__save_sp") { save_stack_pointer = 1; - sp_check_value = dmn_rsp_from_thread(target_thread_dmn); + sp_check_value = d_sp_from_thread(target_thread); log_infof("sp_check_value = 0x%I64x\n", sp_check_value); } } @@ -6625,21 +6659,21 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) D_EventCause step_past_trap_net_stop_cause = D_EventCause_Null; if(step_past_trap_net) LogInfoNamedBlockF("trap_net__single_step_past_trap_net") { - DMN_Handle thread = event->thread; - U64 thread_pre_rip = dmn_rip_from_thread(thread); + D_Handle thread = d_handle_from_dmn(D_MachineID_Local, event->thread); + U64 thread_pre_rip = d_ip_from_thread(thread); U64 thread_post_rip = thread_pre_rip; for(B32 single_step_done = 0; single_step_done == 0;) { DMN_RunCtrls single_step_ctrls = {0}; single_step_ctrls.run_entities_are_unfrozen = 1; - single_step_ctrls.run_entities = &thread; + single_step_ctrls.run_entities = &event->thread; single_step_ctrls.run_entity_count = 1; if(thread_post_rip == thread_pre_rip) { - single_step_ctrls.single_step_thread = thread; + single_step_ctrls.single_step_thread = event->thread; } DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(thread); + thread_post_rip = d_ip_from_thread(thread); switch(event->kind) { default:{}break; @@ -6654,7 +6688,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) }break; case DMN_EventKind_SingleStep: { - single_step_done = dmn_handle_match(event->thread, thread); + single_step_done = d_handle_match(d_handle_from_dmn(D_MachineID_Local, event->thread), thread); step_past_trap_net_stop_cause = d_event_cause_from_dmn_event_kind(event->kind); }break; } @@ -6751,26 +6785,27 @@ d_ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } //- rjf: single step - DMN_Handle thread = d_dmn_from_handle(msg->entity); - B32 thread_is_valid = !dmn_handle_match(thread, dmn_handle_zero()); + D_Handle thread = msg->entity; + B32 thread_is_valid = !d_handle_match(thread, d_handle_zero()); DMN_Event *stop_event = 0; D_EventCause stop_cause = D_EventCause_Null; if(thread_is_valid) { - U64 thread_pre_rip = dmn_rip_from_thread(thread); + U64 thread_pre_rip = d_ip_from_thread(thread); U64 thread_post_rip = thread_pre_rip; for(B32 done = 0; done == 0;) { + DMN_Handle thread_dmn = d_dmn_from_handle(thread); DMN_RunCtrls run_ctrls = {0}; run_ctrls.run_entities_are_unfrozen = 1; - run_ctrls.run_entities = &thread; + run_ctrls.run_entities = &thread_dmn; run_ctrls.run_entity_count = 1; if(thread_post_rip == thread_pre_rip) { - run_ctrls.single_step_thread = d_dmn_from_handle(msg->entity); + run_ctrls.single_step_thread = thread_dmn; } DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0); - thread_post_rip = dmn_rip_from_thread(d_dmn_from_handle(msg->entity)); + thread_post_rip = d_ip_from_thread(thread); switch(event->kind) { default:{}break; @@ -6886,32 +6921,10 @@ d_process_write(D_Handle process, Rng1U64 range, void *src) case D_ControllerKind_Demon: { result = dmn_process_write(d_dmn_from_handle(process), range, src); - - //- rjf: success -> bump generation if(result) { ins_atomic_u64_inc_eval(&d_ctrl_state->mem_gen); } - - //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless - // writes within calling frame's "view" of the memory, at the expense of a small amount of - // time. - if(result) - { - U64 endt_us = now_time_us()+10000; - U64 page_size = get_system_info()->page_size; // TODO(rjf): @page_size_from_process - Rng1U64 page_range = r1u64(range.min/page_size, (range.max+page_size-1)/page_size); - for EachInRange(page_idx, page_range) - { - Temp scratch = scratch_begin(0, 0); - D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); - scratch_end(scratch); - if(!slice.stale || now_time_us() >= endt_us) - { - break; - } - } - } }break; case D_ControllerKind_Dump: diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 4dc4090c..7463567c 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -546,12 +546,14 @@ internal void d_set_wakeup_hook(D_WakeupFunctionType *wakeup_hook); //- rjf: thread handle read/write internal B32 d_thread_read_reg_block(D_Handle handle, void *reg_block); internal B32 d_thread_write_reg_block(D_Handle thread, void *reg_block); +internal U64 d_ip_from_thread(D_Handle handle); +internal U64 d_sp_from_thread(D_Handle handle); //- rjf: thread register cache reading -internal void *d_reg_block_from_thread(Arena *arena, D_Handle handle); -internal U64 d_tls_root_vaddr_from_thread(D_Handle handle); -internal U64 d_rip_from_thread(D_Handle handle); -internal U64 d_rsp_from_thread(D_Handle handle); +internal void *d_cached_reg_block_from_thread(Arena *arena, D_Handle handle); +internal U64 d_cached_tls_root_vaddr_from_thread(D_Handle handle); +internal U64 d_cached_ip_from_thread(D_Handle handle); +internal U64 d_cached_sp_from_thread(D_Handle handle); //////////////////////////////// //~ rjf: Module Image Info Functions diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 1744db1c..13ac7665 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -297,7 +297,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread) // rjf: thread => unpacked info D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); Arch arch = thread->arch; - U64 ip_vaddr = d_rip_from_thread(thread->handle); + U64 ip_vaddr = d_cached_ip_from_thread(thread->handle); // rjf: ip => machine code String8 machine_code = {0}; @@ -336,7 +336,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) // rjf: thread => info Arch arch = thread->arch; - U64 ip_vaddr = d_rip_from_thread(thread->handle); + U64 ip_vaddr = d_cached_ip_from_thread(thread->handle); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -549,7 +549,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) // rjf: thread => info Arch arch = thread->arch; - U64 ip_vaddr = d_rip_from_thread(thread->handle); + U64 ip_vaddr = d_cached_ip_from_thread(thread->handle); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -753,7 +753,7 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) // rjf: unpack thread Arch arch = thread->arch; - U64 ip_vaddr = d_rip_from_thread(thread->handle); + U64 ip_vaddr = d_cached_ip_from_thread(thread->handle); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); @@ -1327,7 +1327,7 @@ d_query_cached_rip_from_thread_unwind(D_Entity *thread, U64 unwind_count) U64 result = 0; if(unwind_count == 0) { - result = d_rip_from_thread(thread->handle); + result = d_cached_ip_from_thread(thread->handle); } else { @@ -1977,7 +1977,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P D_Entity *thread = d_entity_from_handle(params->thread); ARCH_Info *arch_info = arch_info_from_arch(thread->arch); U64 vaddr = params->vaddr; - void *block = d_reg_block_from_thread(scratch.arena, thread->handle); + void *block = d_cached_reg_block_from_thread(scratch.arena, thread->handle); arch_reg_block_write_ip(arch_info, block, vaddr); B32 result = d_thread_write_reg_block(thread->handle, block); (void)result; diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 756f8068..4fd59c89 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -121,72 +121,3 @@ dmn_event_list_push(Arena *arena, DMN_EventList *list) DMN_Event *result = &n->v; return result; } - -//////////////////////////////// -//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) - -internal U64 -dmn_rip_from_thread(DMN_Handle thread) -{ - U64 result = 0; - Temp scratch = scratch_begin(0, 0); - { - Arch arch = dmn_arch_from_thread(thread); - ARCH_Info *arch_info = arch_info_from_arch(arch); - U64 reg_block_size = arch_info->reg_block_size; - void *reg_block = push_array(scratch.arena, U8, reg_block_size); - dmn_thread_read_reg_block(thread, reg_block); - result = arch_ip_from_reg_block(arch_info, reg_block); - } - scratch_end(scratch); - return result; -} - -internal U64 -dmn_rsp_from_thread(DMN_Handle thread) -{ - U64 result = 0; - Temp scratch = scratch_begin(0, 0); - { - Arch arch = dmn_arch_from_thread(thread); - ARCH_Info *arch_info = arch_info_from_arch(arch); - U64 reg_block_size = arch_info->reg_block_size; - void *reg_block = push_array(scratch.arena, U8, reg_block_size); - dmn_thread_read_reg_block(thread, reg_block); - result = arch_sp_from_reg_block(arch_info, reg_block); - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Process Reading Helper Functions (Helpers, Implemented Once) - -internal String8 -dmn_get_trap_inst(void) -{ -#if ARCH_X64 - local_persist U8 inst[] = { 0xcc }; -#else -# error "trap instruction is not defined for this arch" -#endif - return str8_array_fixed(inst); -} - -internal DMN_ActiveTrap * -dmn_set_trap(Arena *arena, DMN_Trap *trap) -{ - String8 trap_inst = dmn_get_trap_inst(); - U8 *swap_bytes = push_array(arena, U8, trap_inst.size); - B32 good_read = dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), swap_bytes); - B32 good_write = 0; - if(good_read) - { - good_write = dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), trap_inst.str); - } - DMN_ActiveTrap *result = push_array(arena, DMN_ActiveTrap, 1); - result->good = (good_read && good_write); - result->trap = trap; - result->swap_bytes = str8(swap_bytes, trap_inst.size); - return result; -} diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index fa4ed70d..802766c4 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -152,15 +152,6 @@ struct DMN_TrapChunkList U64 trap_count; }; -typedef struct DMN_ActiveTrap DMN_ActiveTrap; -struct DMN_ActiveTrap -{ - DMN_ActiveTrap *next; - B32 good; - DMN_Trap *trap; - String8 swap_bytes; -}; - typedef struct DMN_RunCtrls DMN_RunCtrls; struct DMN_RunCtrls { @@ -210,12 +201,6 @@ internal DMN_HandleArray dmn_handle_array_copy(Arena *arena, DMN_HandleArray *sr //- rjf: event list building internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list); -//////////////////////////////// -//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once) - -internal U64 dmn_rip_from_thread(DMN_Handle thread); -internal U64 dmn_rsp_from_thread(DMN_Handle thread); - //////////////////////////////// //~ rjf: Process Reading Helper Functions (Helpers, Implemented Once) @@ -273,9 +258,4 @@ internal void dmn_process_iter_begin(DMN_ProcessIter *iter); internal B32 dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out); internal void dmn_process_iter_end(DMN_ProcessIter *iter); -//- arch trap -internal String8 dmn_get_trap_inst(void); - -internal DMN_ActiveTrap * dmn_set_trap(Arena *arena, DMN_Trap *trap); - #endif // DEMON_CORE_H diff --git a/src/linux/demon/linux_demon.c b/src/linux/demon/linux_demon.c index 1f187af9..9a16e3aa 100644 --- a/src/linux/demon/linux_demon.c +++ b/src/linux/demon/linux_demon.c @@ -292,6 +292,28 @@ lnx_dmn_process_from_pid(pid_t pid) return hash_table_search_u64_raw(lnx_dmn_state->pid_ht, pid); } +//////////////////////////////// +//~ rjf: Trap Setting + +internal LNX_DMN_ActiveTrap * +lnx_dmn_set_trap(Arena *arena, DMN_Trap *trap) +{ + ARCH_Info *arch = arch_info_from_arch(Arch_CURRENT); + String8 trap_inst = arch->trap_instruction; + U8 *swap_bytes = push_array(arena, U8, trap_inst.size); + B32 good_read = dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), swap_bytes); + B32 good_write = 0; + if(good_read) + { + good_write = dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr + trap_inst.size), trap_inst.str); + } + LNX_DMN_ActiveTrap *result = push_array(arena, LNX_DMN_ActiveTrap, 1); + result->good = (good_read && good_write); + result->trap = trap; + result->swap_bytes = str8(swap_bytes, trap_inst.size); + return result; +} + internal Rng1U64 lnx_dmn_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum) { @@ -976,7 +998,7 @@ lnx_dmn_process_ctx_clone(LNX_DMN_Process *new_owner, LNX_DMN_ProcessCtx *ctx) } // clone probe traps - for EachNode(src, DMN_ActiveTrap, ctx->first_probe_trap) + for EachNode(src, LNX_DMN_ActiveTrap, ctx->first_probe_trap) { DMN_Trap *src_trap = src->trap; DMN_Trap *dst_trap = push_array(result->arena, DMN_Trap, 1); @@ -986,7 +1008,7 @@ lnx_dmn_process_ctx_clone(LNX_DMN_Process *new_owner, LNX_DMN_ProcessCtx *ctx) dst_trap->flags = src_trap->flags; dst_trap->size = src_trap->size; - DMN_ActiveTrap *dst = push_array(result->arena, DMN_ActiveTrap, 1); + LNX_DMN_ActiveTrap *dst = push_array(result->arena, LNX_DMN_ActiveTrap, 1); dst->trap = dst_trap; dst->swap_bytes = str8_copy(result->arena, src->swap_bytes); @@ -1112,7 +1134,7 @@ lnx_dmn_process_trap_probes(LNX_DMN_Process *process) trap->vaddr = process->ctx->probes[i]->pc; trap->id = i; - DMN_ActiveTrap *active_trap = dmn_set_trap(process->ctx->arena, trap); + LNX_DMN_ActiveTrap *active_trap = lnx_dmn_set_trap(process->ctx->arena, trap); SLLQueuePush(process->ctx->first_probe_trap, process->ctx->last_probe_trap, active_trap); if(BUILD_DEBUG && process->ctx->arch == Arch_x64) @@ -1966,17 +1988,17 @@ lnx_dmn_event_unload_module(Arena *arena, DMN_EventList *events, LNX_DMN_Process } internal void -lnx_dmn_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid) +lnx_dmn_event_breakpoint(Arena *arena, DMN_EventList *events, LNX_DMN_ActiveTrap *user_traps, pid_t tid) { LNX_DMN_Thread *thread = lnx_dmn_thread_from_pid(tid); LNX_DMN_Process *process = thread->process; U64 ip = lnx_dmn_thread_read_ip(thread); // is this user trap? - DMN_ActiveTrap *hit_user_trap = 0; + LNX_DMN_ActiveTrap *hit_user_trap = 0; { DMN_Handle process_handle = lnx_dmn_handle_from_process(process); - for EachNode(active_trap, DMN_ActiveTrap, user_traps) + for EachNode(active_trap, LNX_DMN_ActiveTrap, user_traps) { if(MemoryCompare(&active_trap->trap->process, &process_handle, sizeof(DMN_Handle)) == 0) { @@ -1993,7 +2015,7 @@ lnx_dmn_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *us LNX_DMN_ProbeType probe_type = LNX_DMN_ProbeType_Null; if(hit_user_trap == 0) { - for EachNode(active_trap, DMN_ActiveTrap, process->ctx->first_probe_trap) + for EachNode(active_trap, LNX_DMN_ActiveTrap, process->ctx->first_probe_trap) { if(active_trap->trap->vaddr == ip-1) { @@ -2397,7 +2419,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(lnx_dmn_state->process_count > 0) { // write traps to memory - DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; + LNX_DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0; { HashTable *process_ht = hash_table_init(scratch.arena, lnx_dmn_state->process_count); for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first) @@ -2416,7 +2438,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } // TODO: ctrl sends down duplicate traps - DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); + LNX_DMN_ActiveTrap *is_set = hash_table_search_u64_raw(active_trap_ht, trap->vaddr); if(is_set) { continue; } // TODO: ctrl sends down traps for exited process @@ -2424,7 +2446,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) if(!process) { continue; } // trap instruction - DMN_ActiveTrap *active_trap = dmn_set_trap(scratch.arena, trap); + LNX_DMN_ActiveTrap *active_trap = lnx_dmn_set_trap(scratch.arena, trap); // add trap to the active list SLLQueuePush(active_trap_first, active_trap_last, active_trap); @@ -2854,7 +2876,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) } // restore original instruction bytes - for EachNode(active_trap, DMN_ActiveTrap, active_trap_first) + for EachNode(active_trap, LNX_DMN_ActiveTrap, active_trap_first) { // skip process that exited during the wait LNX_DMN_Process *process = lnx_dmn_process_from_handle(active_trap->trap->process); diff --git a/src/linux/demon/linux_demon.h b/src/linux/demon/linux_demon.h index 128b34f1..a84a573c 100644 --- a/src/linux/demon/linux_demon.h +++ b/src/linux/demon/linux_demon.h @@ -285,8 +285,8 @@ typedef struct LNX_DMN_ProcessCtx ELF_Class dl_class; HashTable *loaded_modules_ht; LNX_DMN_Probe **probes; - DMN_ActiveTrap *first_probe_trap; - DMN_ActiveTrap *last_probe_trap; + LNX_DMN_ActiveTrap *first_probe_trap; + LNX_DMN_ActiveTrap *last_probe_trap; LNX_DMN_Module *first_module; LNX_DMN_Module *last_module; U64 module_count; @@ -331,6 +331,18 @@ typedef struct LNX_DMN_EntityList LNX_DMN_EntityNode *last; } LNX_DMN_EntityList; +//////////////////////////////// +//~ rjf: Active Trap Data Structure + +typedef struct LNX_DMN_ActiveTrap LNX_DMN_ActiveTrap; +struct LNX_DMN_ActiveTrap +{ + LNX_DMN_ActiveTrap *next; + B32 good; + DMN_Trap *trap; + String8 swap_bytes; +}; + //////////////////////////////// //~ Global State @@ -389,6 +401,11 @@ internal String8 lnx_dmn_read_string(Arena *arena, int memory_fd, U64 base_vaddr #define lnx_dmn_read_struct(fd, vaddr, ptr) lnx_dmn_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) #define lnx_dmn_write_struct(fd, vaddr, ptr) lnx_dmn_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) +//////////////////////////////// +//~ rjf: Trap Setting + +internal LNX_DMN_ActiveTrap *lnx_dmn_set_trap(Arena *arena, DMN_Trap *trap); + //////////////////////////////// //~ ELF/GNU info @@ -491,7 +508,7 @@ internal LNX_DMN_Process * lnx_dmn_event_create_process(Arena *arena, DMN_EventL internal void lnx_dmn_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid); internal void lnx_dmn_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr); internal void lnx_dmn_event_unload_module(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, U64 rdebug_vaddr); -internal void lnx_dmn_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid); +internal void lnx_dmn_event_breakpoint(Arena *arena, DMN_EventList *events, LNX_DMN_ActiveTrap *user_traps, pid_t tid); internal void lnx_dmn_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid); internal void lnx_dmn_event_halt(Arena *arena, DMN_EventList *events); internal void lnx_dmn_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index f8dd89a9..ee659835 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -797,7 +797,7 @@ rd_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, R void *regs_block = 0; if(e_interpret_ctx->reg_unwind_count == 0) { - regs_block = d_reg_block_from_thread(scratch.arena, entity->handle); + regs_block = d_cached_reg_block_from_thread(scratch.arena, entity->handle); } else { @@ -1037,6 +1037,26 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) case D_EntityKind_Process: { result = d_process_write(entity->handle, range, in); + + //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless + // writes within calling frame's "view" of the memory, at the expense of a small amount of + // time. + if(result) + { + U64 endt_us = now_time_us()+10000; + U64 page_size = get_system_info()->page_size; // TODO(rjf): @page_size_from_process + Rng1U64 page_range = r1u64(range.min/page_size, (range.max+page_size-1)/page_size); + for EachInRange(page_idx, page_range) + { + Temp scratch = scratch_begin(0, 0); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us); + scratch_end(scratch); + if(!slice.stale || now_time_us() >= endt_us) + { + break; + } + } + } }break; case D_EntityKind_Thread: { @@ -1046,7 +1066,7 @@ rd_eval_space_write(E_Space space, void *in, Rng1U64 range) Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 write_range = intersect_1u64(legal_range, range); U64 write_size = dim_1u64(write_range); - void *new_regs = d_reg_block_from_thread(scratch.arena, entity->handle); + void *new_regs = d_cached_reg_block_from_thread(scratch.arena, entity->handle); MemoryCopy((U8 *)new_regs + write_range.min, in, write_size); result = d_thread_write_reg_block(entity->handle, new_regs); scratch_end(scratch); @@ -9847,7 +9867,7 @@ rd_gather_auto_exprs(Arena *arena) //- rjf: unpack thread / module / debug info / lines ARCH_Info *arch_info = arch_info_from_arch(thread->arch); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - U64 thread_ip_vaddr = d_rip_from_thread(thread_handle); + U64 thread_ip_vaddr = d_cached_ip_from_thread(thread_handle); D_Entity *module = d_module_from_process_vaddr(process, thread_ip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); @@ -11360,7 +11380,7 @@ rd_frame(void) U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); - U64 tls_root_vaddr = d_tls_root_vaddr_from_thread(thread->handle); + U64 tls_root_vaddr = d_cached_tls_root_vaddr_from_thread(thread->handle); ProfEnd(); //////////////////////////// @@ -15821,7 +15841,7 @@ rd_frame(void) { D_Entity *thread = d_entity_from_handle(rd_regs()->thread); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - D_Entity *module = d_module_from_process_vaddr(process, d_rip_from_thread(thread->handle)); + D_Entity *module = d_module_from_process_vaddr(process, d_cached_ip_from_thread(thread->handle)); D_Entity *machine = d_entity_ancestor_from_kind(process, D_EntityKind_Machine); rd_state->base_regs.v.unwind_count = 0; rd_state->base_regs.v.inline_depth = 0; @@ -16664,7 +16684,7 @@ rd_frame(void) D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *module = d_module_from_process_vaddr(process, vaddr); U64 voff = d_voff_from_vaddr(module, vaddr); - U64 test_cached_vaddr = d_rip_from_thread(thread->handle); + U64 test_cached_vaddr = d_cached_ip_from_thread(thread->handle); // rjf: valid stop thread? -> select & snap if(need_refocus && thread->kind == D_EntityKind_Thread && evt->cause != D_EventCause_InterruptedByHalt) @@ -16734,7 +16754,7 @@ rd_frame(void) // rjf: update the autos-determining code range { D_Handle new_thread_handle = thread->handle; - U64 new_sp = d_rsp_from_thread(new_thread_handle); + U64 new_sp = d_cached_sp_from_thread(new_thread_handle); if(thread == &d_entity_nil) { new_thread_handle = selected_thread->handle; From bc22adc440ab56537b791a1e27fe13dcbbb28ca4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 19 May 2026 14:42:28 -0700 Subject: [PATCH 573/850] bump to 27 --- src/base/base_context_cracking.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index b3e979c0..2a31c48d 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -159,7 +159,7 @@ #endif #if !defined(BUILD_VERSION_PATCH) -# define BUILD_VERSION_PATCH 26 +# define BUILD_VERSION_PATCH 27 #endif #define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) From 1912774377d5cca63e01270055518cdfd07f5f86 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 20 May 2026 11:37:53 -0700 Subject: [PATCH 574/850] pass over default theme --- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 148 ++++++++++++++--------------- 2 files changed, 70 insertions(+), 80 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 909305e7..ed5e4ffa 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -1101,7 +1101,7 @@ str8_lit_comp("far_manager"), String8 rd_theme_preset_cfg_string_table[11] = { -str8_lit_comp("theme:\n{\n theme_color: {tags:\"background\", value: 0x1b1b1bff }\n theme_color: {tags:\"alt background\", value: 0x222222ff }\n theme_color: {tags:\"pop background\", value: 0x355b6eff }\n theme_color: {tags:\"fresh background\", value: 0x31393dff }\n theme_color: {tags:\"match background\", value: 0x31393dff }\n theme_color: {tags:\"border\", value: 0x404040ff }\n theme_color: {tags:\"text\", value: 0xe5e5e5ff }\n theme_color: {tags:\"weak text\", value: 0xa4a4a4ff }\n theme_color: {tags:\"good text\", value: 0x32a852ff }\n theme_color: {tags:\"neutral text\", value: 0x3a90bbff }\n theme_color: {tags:\"bad text\", value: 0xcf5242ff }\n theme_color: {tags:\"hover\", value: 0xffffffff }\n theme_color: {tags:\"focus overlay\", value: 0xfda20012 }\n theme_color: {tags:\"focus border\", value: 0xfda200ff }\n theme_color: {tags:\"cursor\", value: 0x8aff00ff }\n theme_color: {tags:\"selection\", value: 0x99ccff0f }\n theme_color: {tags:\"inactive background\", value: 0x0000002f }\n theme_color: {tags:\"drop_shadow\", value: 0x0000007f }\n theme_color: {tags:\"good_pop background\", value: 0x2c5b36ff }\n theme_color: {tags:\"good_pop border\", value: 0x568761ff }\n theme_color: {tags:\"good_pop hover\", value: 0xe3f5d3ff }\n theme_color: {tags:\"good_pop weak text\", value: 0xe3f5d3ff }\n theme_color: {tags:\"bad_pop background\", value: 0x803425ff }\n theme_color: {tags:\"bad_pop hover\", value: 0xff825cff }\n theme_color: {tags:\"code_default\", value: 0xcbcbcbff }\n theme_color: {tags:\"code_symbol\", value: 0x42a2cfff }\n theme_color: {tags:\"code_type\", value: 0xfec746ff }\n theme_color: {tags:\"code_local\", value: 0x98bc80ff }\n theme_color: {tags:\"code_register\", value: 0xb7afd5ff }\n theme_color: {tags:\"code_keyword\", value: 0xb38d4cff }\n theme_color: {tags:\"code_delimiter_or_operator\", value: 0x767676ff }\n theme_color: {tags:\"code_numeric\", value: 0x98abb1ff }\n theme_color: {tags:\"code_numeric_alt_digit_group\", value: 0x738287ff }\n theme_color: {tags:\"code_string\", value: 0x98abb1ff }\n theme_color: {tags:\"code_meta\", value: 0xd96759ff }\n theme_color: {tags:\"code_comment\", value: 0x717171ff }\n theme_color: {tags:\"line_info_0\", value: 0x4f3022ff }\n theme_color: {tags:\"line_info_1\", value: 0x4f3e15ff }\n theme_color: {tags:\"line_info_2\", value: 0x434e2aff }\n theme_color: {tags:\"line_info_3\", value: 0x36241fff }\n theme_color: {tags:\"line_info_4\", value: 0x4f3022ff }\n theme_color: {tags:\"line_info_5\", value: 0x4f3e15ff }\n theme_color: {tags:\"line_info_6\", value: 0x434e2aff }\n theme_color: {tags:\"line_info_7\", value: 0x36241fff }\n theme_color: {tags:\"thread_0\", value: 0xffcb7fff }\n theme_color: {tags:\"thread_1\", value: 0xb2ff65ff }\n theme_color: {tags:\"thread_2\", value: 0xff99e5ff }\n theme_color: {tags:\"thread_3\", value: 0x6598ffff }\n theme_color: {tags:\"thread_4\", value: 0x65ffcbff }\n theme_color: {tags:\"thread_5\", value: 0xff9819ff }\n theme_color: {tags:\"thread_6\", value: 0x9932ffff }\n theme_color: {tags:\"thread_7\", value: 0x65ff4cff }\n theme_color: {tags:\"thread_unwound\", value: 0xb2ccd8ff }\n theme_color: {tags:\"thread_error\", value: 0xb23219ff }\n theme_color: {tags:\"breakpoint\", value: 0xa72911ff }\n theme_color: {tags:\"floating background\", value: 0x1b1b1baf }\n theme_color: {tags:\"floating background alt\", value: 0x0000005f }\n theme_color: {tags:\"floating background fresh\", value: 0x31393d5f }\n theme_color: {tags:\"floating border\", value: 0xbfbfbf1f }\n theme_color: {tags:\"floating scroll_bar background\", value: 0x3b3b3b5f }\n theme_color: {tags:\"floating scroll_bar border\", value: 0x5f5f5f5f }\n theme_color: {tags:\"menu_bar background\", value: 0x2b3740ff }\n theme_color: {tags:\"menu_bar border\", value: 0x3e4c57ff }\n theme_color: {tags:\"scroll_bar background\", value: 0x2b2b2bff }\n theme_color: {tags:\"scroll_bar border\", value: 0x3f3f3fff }\n theme_color: {tags:\"implicit background\", value: 0x00000000 }\n theme_color: {tags:\"implicit border\", value: 0x00000000 }\n theme_color: {tags:\"hollow background\", value: 0x00000000 }\n theme_color: {tags:\"hollow border\", value: 0xffffff1f }\n theme_color: {tags:\"tab background\", value: 0x6f5135ff }\n theme_color: {tags:\"tab border\", value: 0x8a6e54ff }\n theme_color: {tags:\"tab inactive background\", value: 0x2b3740ff }\n theme_color: {tags:\"tab inactive border\", value: 0x3e4c57ff }\n theme_color: {tags:\"tab auto background\", value: 0x693847ff }\n theme_color: {tags:\"tab auto border\", value: 0x9e6274ff }\n theme_color: {tags:\"tab auto inactive background\", value: 0x2f2633ff }\n theme_color: {tags:\"tab auto inactive border\", value: 0x685073ff }\n theme_color: {tags:\"drop_site background\", value: 0xffffff05 }\n theme_color: {tags:\"drop_site border\", value: 0xffffff0f }\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x1f1f1fff}\n theme_color:{tags: \"alt background\", value: 0x222222ff}\n theme_color:{tags: \"pop background\", value: 0x675331ff}\n theme_color:{tags: \"fresh background\", value: 0x3d3631ff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x404040ff}\n theme_color:{tags: text, value: 0xe5e5e5ff}\n theme_color:{tags: \"weak text\", value: 0xa4a4a4ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xabdeffff}\n theme_color:{tags: \"focus overlay\", value: 0x2292eb14}\n theme_color:{tags: \"focus border\", value: 0x2392ebff}\n theme_color:{tags: cursor, value: 0x8aff00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x16}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xecececff}\n theme_color:{tags: code_symbol, value: 0xebb624ff}\n theme_color:{tags: code_type, value: 0xebb624ff}\n theme_color:{tags: code_local, value: 0xa7dae8ff}\n theme_color:{tags: code_register, value: 0xb7afd5ff}\n theme_color:{tags: code_keyword, value: 0x838b8fff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x838b8fff}\n theme_color:{tags: code_numeric, value: 0x9cb198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x6d8e67ff}\n theme_color:{tags: code_string, value: 0x9cb198ff}\n theme_color:{tags: code_meta, value: 0xb9819aff}\n theme_color:{tags: code_comment, value: 0x627b5eff}\n theme_color:{tags: line_info_0, value: 0x3c2d25ff}\n theme_color:{tags: line_info_1, value: 0x3c3925ff}\n theme_color:{tags: line_info_2, value: 0x2e4837ff}\n theme_color:{tags: line_info_3, value: 0x2e3d48ff}\n theme_color:{tags: line_info_4, value: 0x3c2d25ff}\n theme_color:{tags: line_info_5, value: 0x3c3925ff}\n theme_color:{tags: line_info_6, value: 0x2e4837ff}\n theme_color:{tags: line_info_7, value: 0x2e3d48ff}\n theme_color:{tags: thread_0, value: 0xebb624ff}\n theme_color:{tags: thread_1, value: 0x26d0d2ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x1b1b1baf}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\n theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x333333ff}\n theme_color:{tags: \"tab border\", value: 0x2392ebff}\n theme_color:{tags: \"tab inactive background\", value: 0}\n theme_color:{tags: \"tab inactive border\", value: 0x42494eff}\n theme_color:{tags: \"tab auto background\", value: 0x3e4d6eff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x3e4d6e39}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0xffffffff }\n theme_color:{ tags: \"alt background\" , value: 0xf8f8f8ff }\n theme_color:{ tags: \"pop background\" , value: 0xcbe4f2ff }\n theme_color:{ tags: \"menu_bar pop background\" , value: 0x5aabd9ff }\n theme_color:{ tags: \"fresh background\" , value: 0xeaddceff }\n theme_color:{ tags: \"match background\" , value: 0xc1e9c4ff }\n theme_color:{ tags: border , value: 0xcbcbcbff }\n theme_color:{ tags: text , value: 0xff }\n theme_color:{ tags: \"weak text\" , value: 0x727272ff }\n theme_color:{ tags: \"good text\" , value: 0x217538ff }\n theme_color:{ tags: \"neutral text\" , value: 0x1a5b7cff }\n theme_color:{ tags: \"bad text\" , value: 0x972717ff }\n theme_color:{ tags: hover , value: 0xff }\n theme_color:{ tags: \"focus overlay\" , value: 0x67ff4b }\n theme_color:{ tags: \"focus border\" , value: 0x67ffff }\n theme_color:{ tags: cursor , value: 0xff }\n theme_color:{ tags: selection , value: 0x283d5166 }\n theme_color:{ tags: \"inactive background\" , value: 0x8 }\n theme_color:{ tags: drop_shadow , value: 0xb }\n theme_color:{ tags: \"good_pop background\" , value: 0x90c09aff }\n theme_color:{ tags: \"good_pop border\" , value: 0x1e7231ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0xa93620ff }\n theme_color:{ tags: \"bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar bad_pop background\" , value: 0xff2a00ff }\n theme_color:{ tags: \"menu_bar bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0x80808ff }\n theme_color:{ tags: code_symbol , value: 0x4ac3ff }\n theme_color:{ tags: code_type , value: 0xf46200ff }\n theme_color:{ tags: code_local , value: 0x317c00ff }\n theme_color:{ tags: code_register , value: 0x9a00ffff }\n theme_color:{ tags: code_keyword , value: 0xff0600ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x8a8a8aff }\n theme_color:{ tags: code_numeric , value: 0x7d49ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0xb56aff }\n theme_color:{ tags: code_string , value: 0x63549fff }\n theme_color:{ tags: code_meta , value: 0xd96759ff }\n theme_color:{ tags: code_comment , value: 0x717171ff }\n theme_color:{ tags: line_info_0 , value: 0xe6d5cdff }\n theme_color:{ tags: line_info_1 , value: 0xdbcfb2ff }\n theme_color:{ tags: line_info_2 , value: 0xddeac1ff }\n theme_color:{ tags: line_info_3 , value: 0xddc4bdff }\n theme_color:{ tags: line_info_4 , value: 0xba917eff }\n theme_color:{ tags: thread_0 , value: 0xffa700ff }\n theme_color:{ tags: thread_1 , value: 0xb41fff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xff2800ff }\n theme_color:{ tags: \"floating background\" , value: 0xffffffc7 }\n theme_color:{ tags: \"floating background alt\" , value: 0x23 }\n theme_color:{ tags: \"floating background fresh\" , value: 0xeaddceff }\n theme_color:{ tags: \"floating border\" , value: 0x88888884 }\n theme_color:{ tags: \"scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"menu_bar background\" , value: 0x2b6b9aff }\n theme_color:{ tags: \"menu_bar border\" , value: 0x4d }\n theme_color:{ tags: \"menu_bar text\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"good menu_bar text\" , value: 0x70db8dff }\n theme_color:{ tags: \"bad menu_bar text\" , value: 0xffa79bff }\n theme_color:{ tags: \"neutral menu_bar text\" , value: 0xc4dbe7ff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab text\" , value: 0xffffffff }\n theme_color:{ tags: \"tab text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"tab background\" , value: 0xb67e48ff }\n theme_color:{ tags: \"tab border\" , value: 0x875b31ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0xcacacaff }\n theme_color:{ tags: \"tab inactive border\" , value: 0xb5b5b5ff }\n theme_color:{ tags: \"tab auto background\" , value: 0xc41c69ff }\n theme_color:{ tags: \"tab auto border\" , value: 0x981039ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x9b88a3ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x373737ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0x1f1f1fff }\n theme_color:{ tags: \"alt background\" , value: 0x222222ff }\n theme_color:{ tags: \"pop background\" , value: 0x383167ff }\n theme_color:{ tags: \"fresh background\" , value: 0x31393dff }\n theme_color:{ tags: \"match background\" , value: 0x31393dff }\n theme_color:{ tags: border , value: 0x404040ff }\n theme_color:{ tags: text , value: 0xe5e5e5ff }\n theme_color:{ tags: \"weak text\" , value: 0xa4a4a4ff }\n theme_color:{ tags: \"good text\" , value: 0x32a852ff }\n theme_color:{ tags: \"neutral text\" , value: 0x3a90bbff }\n theme_color:{ tags: \"bad text\" , value: 0xcf5242ff }\n theme_color:{ tags: hover , value: 0xffffffff }\n theme_color:{ tags: \"focus overlay\" , value: 0x7160e81e }\n theme_color:{ tags: \"focus border\" , value: 0x7160e8ff }\n theme_color:{ tags: cursor , value: 0x8aff00ff }\n theme_color:{ tags: selection , value: 0x99ccff0f }\n theme_color:{ tags: \"inactive background\" , value: 0x0000002f }\n theme_color:{ tags: drop_shadow , value: 0x0000007f }\n theme_color:{ tags: \"good_pop background\" , value: 0x2c5b36ff }\n theme_color:{ tags: \"good_pop border\" , value: 0x568761ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0x803425ff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0xe0e0e0ff }\n theme_color:{ tags: code_symbol , value: 0xdcdcaaff }\n theme_color:{ tags: code_type , value: 0x4ec9b0ff }\n theme_color:{ tags: code_local , value: 0x9cdcfeff }\n theme_color:{ tags: code_register , value: 0xb7afd5ff }\n theme_color:{ tags: code_keyword , value: 0x569cd6ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x767676ff }\n theme_color:{ tags: code_numeric , value: 0xb5cea8ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0x7c986dff }\n theme_color:{ tags: code_string , value: 0xd69d85ff }\n theme_color:{ tags: code_meta , value: 0x9b9b9bff }\n theme_color:{ tags: code_comment , value: 0x51a644ff }\n theme_color:{ tags: line_info_0 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_1 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_2 , value: 0x434e2aff }\n theme_color:{ tags: line_info_3 , value: 0x36241fff }\n theme_color:{ tags: line_info_4 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_5 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_6 , value: 0x434e2aff }\n theme_color:{ tags: line_info_7 , value: 0x36241fff }\n theme_color:{ tags: thread_0 , value: 0xffdc48ff }\n theme_color:{ tags: thread_1 , value: 0xb2ff65ff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xa72911ff }\n theme_color:{ tags: \"floating background\" , value: 0x1b1b1baf }\n theme_color:{ tags: \"floating background alt\" , value: 0x0000005f }\n theme_color:{ tags: \"floating background fresh\" , value: 0x31393d5f }\n theme_color:{ tags: \"floating border\" , value: 0xbfbfbf1f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0x3b3b3b5f }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"scroll_bar background\" , value: 0x2b2b2bff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x3f3f3fff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab background\" , value: 0x333333ff }\n theme_color:{ tags: \"tab border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0x171717ff }\n theme_color:{ tags: \"tab inactive border\" , value: 0x3e4c57ff }\n theme_color:{ tags: \"tab auto background\" , value: 0x3f386dff }\n theme_color:{ tags: \"tab auto border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x2f2633ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x685073ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0xffffffff}\n theme_color:{tags: \"alt background\", value: 0xefefefff}\n theme_color:{tags: \"pop background\", value: 0xe3eaf2ff}\n theme_color:{tags: \"fresh background\", value: 0xeccbbeff}\n theme_color:{tags: \"match background\", value: 0xedcbf9ff}\n theme_color:{tags: border, value: 0xe7e7e7ff}\n theme_color:{tags: text, value: 0xff}\n theme_color:{tags: \"weak text\", value: 0x353535ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xa7ffff}\n theme_color:{tags: \"focus overlay\", value: 0x8eff3f}\n theme_color:{tags: \"focus border\", value: 0x8effff}\n theme_color:{tags: cursor, value: 0xff}\n theme_color:{tags: selection, value: 0x56aaff77}\n theme_color:{tags: \"inactive background\", value: 0x17}\n theme_color:{tags: drop_shadow, value: 0xe7b27}\n theme_color:{tags: \"good_pop background\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop border\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0xcb3f23ff}\n theme_color:{tags: \"bad_pop text\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop text weak\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0x000000ff}\n theme_color:{tags: code_symbol, value: 0x74531fff}\n theme_color:{tags: code_type, value: 0x2b91afff}\n theme_color:{tags: code_local, value: 0x1f377fff}\n theme_color:{tags: code_register, value: 0x8a1bffff}\n theme_color:{tags: code_keyword, value: 0x0000ffff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\n theme_color:{tags: code_numeric, value: 0xff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x1d1d1dff}\n theme_color:{tags: code_string, value: 0xa61515ff}\n theme_color:{tags: code_meta, value: 0x808080ff}\n theme_color:{tags: code_comment, value: 0x008000ff}\n theme_color:{tags: line_info_0, value: 0xb5d9c8ff}\n theme_color:{tags: line_info_1, value: 0xa9c1d0ff}\n theme_color:{tags: line_info_2, value: 0x99abc5ff}\n theme_color:{tags: line_info_3, value: 0xc6bcd5ff}\n theme_color:{tags: thread_0, value: 0xffb141ff}\n theme_color:{tags: thread_1, value: 0x66c407ff}\n theme_color:{tags: thread_unwound, value: 0x67b3d7ff}\n theme_color:{tags: thread_error, value: 0xff2900ff}\n theme_color:{tags: breakpoint, value: 0xff2800ff}\n theme_color:{tags: \"floating background\", value: 0xffffffff}\n theme_color:{tags: \"floating background alt\", value: 0x11}\n theme_color:{tags: \"floating background fresh\", value: 0xa0c2d318}\n theme_color:{tags: \"floating border\", value: 0x50}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"menu_bar background\", value: 0xccd5f0ff}\n theme_color:{tags: \"menu_bar border\", value: 0xbabdc3ff}\n theme_color:{tags: \"scroll_bar background\", value: 0xe4e4e4ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0xf5cc84ff}\n theme_color:{tags: \"tab border\", value: 0xae7718ff}\n theme_color:{tags: \"tab inactive background\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab inactive text\", value: 0xffffffff}\n theme_color:{tags: \"tab inactive border\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab auto background\", value: 0xe99595ff}\n theme_color:{tags: \"tab auto border\", value: 0xff6262ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0xac6060ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0xff6262ff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xa7ffff}\n}\n"), diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index f91d2377..08d4c374 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1567,85 +1567,75 @@ RD_ThemePresetTable: DefaultDark default_dark "Default (Dark)", ```theme: { - theme_color: {tags:"background", value: 0x1b1b1bff } - theme_color: {tags:"alt background", value: 0x222222ff } - theme_color: {tags:"pop background", value: 0x355b6eff } - theme_color: {tags:"fresh background", value: 0x31393dff } - theme_color: {tags:"match background", value: 0x31393dff } - theme_color: {tags:"border", value: 0x404040ff } - theme_color: {tags:"text", value: 0xe5e5e5ff } - theme_color: {tags:"weak text", value: 0xa4a4a4ff } - theme_color: {tags:"good text", value: 0x32a852ff } - theme_color: {tags:"neutral text", value: 0x3a90bbff } - theme_color: {tags:"bad text", value: 0xcf5242ff } - theme_color: {tags:"hover", value: 0xffffffff } - theme_color: {tags:"focus overlay", value: 0xfda20012 } - theme_color: {tags:"focus border", value: 0xfda200ff } - theme_color: {tags:"cursor", value: 0x8aff00ff } - theme_color: {tags:"selection", value: 0x99ccff0f } - theme_color: {tags:"inactive background", value: 0x0000002f } - theme_color: {tags:"drop_shadow", value: 0x0000007f } - theme_color: {tags:"good_pop background", value: 0x2c5b36ff } - theme_color: {tags:"good_pop border", value: 0x568761ff } - theme_color: {tags:"good_pop hover", value: 0xe3f5d3ff } - theme_color: {tags:"good_pop weak text", value: 0xe3f5d3ff } - theme_color: {tags:"bad_pop background", value: 0x803425ff } - theme_color: {tags:"bad_pop hover", value: 0xff825cff } - theme_color: {tags:"code_default", value: 0xcbcbcbff } - theme_color: {tags:"code_symbol", value: 0x42a2cfff } - theme_color: {tags:"code_type", value: 0xfec746ff } - theme_color: {tags:"code_local", value: 0x98bc80ff } - theme_color: {tags:"code_register", value: 0xb7afd5ff } - theme_color: {tags:"code_keyword", value: 0xb38d4cff } - theme_color: {tags:"code_delimiter_or_operator", value: 0x767676ff } - theme_color: {tags:"code_numeric", value: 0x98abb1ff } - theme_color: {tags:"code_numeric_alt_digit_group", value: 0x738287ff } - theme_color: {tags:"code_string", value: 0x98abb1ff } - theme_color: {tags:"code_meta", value: 0xd96759ff } - theme_color: {tags:"code_comment", value: 0x717171ff } - theme_color: {tags:"line_info_0", value: 0x4f3022ff } - theme_color: {tags:"line_info_1", value: 0x4f3e15ff } - theme_color: {tags:"line_info_2", value: 0x434e2aff } - theme_color: {tags:"line_info_3", value: 0x36241fff } - theme_color: {tags:"line_info_4", value: 0x4f3022ff } - theme_color: {tags:"line_info_5", value: 0x4f3e15ff } - theme_color: {tags:"line_info_6", value: 0x434e2aff } - theme_color: {tags:"line_info_7", value: 0x36241fff } - theme_color: {tags:"thread_0", value: 0xffcb7fff } - theme_color: {tags:"thread_1", value: 0xb2ff65ff } - theme_color: {tags:"thread_2", value: 0xff99e5ff } - theme_color: {tags:"thread_3", value: 0x6598ffff } - theme_color: {tags:"thread_4", value: 0x65ffcbff } - theme_color: {tags:"thread_5", value: 0xff9819ff } - theme_color: {tags:"thread_6", value: 0x9932ffff } - theme_color: {tags:"thread_7", value: 0x65ff4cff } - theme_color: {tags:"thread_unwound", value: 0xb2ccd8ff } - theme_color: {tags:"thread_error", value: 0xb23219ff } - theme_color: {tags:"breakpoint", value: 0xa72911ff } - theme_color: {tags:"floating background", value: 0x1b1b1baf } - theme_color: {tags:"floating background alt", value: 0x0000005f } - theme_color: {tags:"floating background fresh", value: 0x31393d5f } - theme_color: {tags:"floating border", value: 0xbfbfbf1f } - theme_color: {tags:"floating scroll_bar background", value: 0x3b3b3b5f } - theme_color: {tags:"floating scroll_bar border", value: 0x5f5f5f5f } - theme_color: {tags:"menu_bar background", value: 0x2b3740ff } - theme_color: {tags:"menu_bar border", value: 0x3e4c57ff } - theme_color: {tags:"scroll_bar background", value: 0x2b2b2bff } - theme_color: {tags:"scroll_bar border", value: 0x3f3f3fff } - theme_color: {tags:"implicit background", value: 0x00000000 } - theme_color: {tags:"implicit border", value: 0x00000000 } - theme_color: {tags:"hollow background", value: 0x00000000 } - theme_color: {tags:"hollow border", value: 0xffffff1f } - theme_color: {tags:"tab background", value: 0x6f5135ff } - theme_color: {tags:"tab border", value: 0x8a6e54ff } - theme_color: {tags:"tab inactive background", value: 0x2b3740ff } - theme_color: {tags:"tab inactive border", value: 0x3e4c57ff } - theme_color: {tags:"tab auto background", value: 0x693847ff } - theme_color: {tags:"tab auto border", value: 0x9e6274ff } - theme_color: {tags:"tab auto inactive background", value: 0x2f2633ff } - theme_color: {tags:"tab auto inactive border", value: 0x685073ff } - theme_color: {tags:"drop_site background", value: 0xffffff05 } - theme_color: {tags:"drop_site border", value: 0xffffff0f } + theme_color:{tags: background, value: 0x1f1f1fff} + theme_color:{tags: "alt background", value: 0x222222ff} + theme_color:{tags: "pop background", value: 0x675331ff} + theme_color:{tags: "fresh background", value: 0x3d3631ff} + theme_color:{tags: "match background", value: 0x31393dff} + theme_color:{tags: border, value: 0x404040ff} + theme_color:{tags: text, value: 0xe5e5e5ff} + theme_color:{tags: "weak text", value: 0xa4a4a4ff} + theme_color:{tags: "good text", value: 0x32a852ff} + theme_color:{tags: "neutral text", value: 0x3a90bbff} + theme_color:{tags: "bad text", value: 0xcf5242ff} + theme_color:{tags: hover, value: 0xabdeffff} + theme_color:{tags: "focus overlay", value: 0x2292eb14} + theme_color:{tags: "focus border", value: 0x2392ebff} + theme_color:{tags: cursor, value: 0x8aff00ff} + theme_color:{tags: selection, value: 0x99ccff0f} + theme_color:{tags: "inactive background", value: 0x16} + theme_color:{tags: drop_shadow, value: 0x0000007f} + theme_color:{tags: "good_pop background", value: 0x2c5b36ff} + theme_color:{tags: "good_pop border", value: 0x568761ff} + theme_color:{tags: "good_pop hover", value: 0xe3f5d3ff} + theme_color:{tags: "good_pop weak text", value: 0xe3f5d3ff} + theme_color:{tags: "bad_pop background", value: 0x803425ff} + theme_color:{tags: "bad_pop hover", value: 0xff825cff} + theme_color:{tags: code_default, value: 0xecececff} + theme_color:{tags: code_symbol, value: 0xebb624ff} + theme_color:{tags: code_type, value: 0xebb624ff} + theme_color:{tags: code_local, value: 0xa7dae8ff} + theme_color:{tags: code_register, value: 0xb7afd5ff} + theme_color:{tags: code_keyword, value: 0x838b8fff} + theme_color:{tags: code_delimiter_or_operator, value: 0x838b8fff} + theme_color:{tags: code_numeric, value: 0x9cb198ff} + theme_color:{tags: code_numeric_alt_digit_group, value: 0x6d8e67ff} + theme_color:{tags: code_string, value: 0x9cb198ff} + theme_color:{tags: code_meta, value: 0xb9819aff} + theme_color:{tags: code_comment, value: 0x627b5eff} + theme_color:{tags: line_info_0, value: 0x3c2d25ff} + theme_color:{tags: line_info_1, value: 0x3c3925ff} + theme_color:{tags: line_info_2, value: 0x2e4837ff} + theme_color:{tags: line_info_3, value: 0x2e3d48ff} + theme_color:{tags: line_info_4, value: 0x3c2d25ff} + theme_color:{tags: line_info_5, value: 0x3c3925ff} + theme_color:{tags: line_info_6, value: 0x2e4837ff} + theme_color:{tags: line_info_7, value: 0x2e3d48ff} + theme_color:{tags: thread_0, value: 0xebb624ff} + theme_color:{tags: thread_1, value: 0x26d0d2ff} + theme_color:{tags: thread_unwound, value: 0xb2ccd8ff} + theme_color:{tags: thread_error, value: 0xb23219ff} + theme_color:{tags: breakpoint, value: 0xa72911ff} + theme_color:{tags: "floating background", value: 0x1b1b1baf} + theme_color:{tags: "floating background alt", value: 0x0000005f} + theme_color:{tags: "floating background fresh", value: 0x31393d5f} + theme_color:{tags: "floating border", value: 0xbfbfbf1f} + theme_color:{tags: "floating scroll_bar background", value: 0x3b3b3b5f} + theme_color:{tags: "floating scroll_bar border", value: 0x5f5f5f5f} + theme_color:{tags: "scroll_bar background", value: 0x2b2b2bff} + theme_color:{tags: "scroll_bar border", value: 0x3f3f3fff} + theme_color:{tags: "implicit background", value: 0x00000000} + theme_color:{tags: "implicit border", value: 0x00000000} + theme_color:{tags: "hollow background", value: 0x00000000} + theme_color:{tags: "hollow border", value: 0xffffff1f} + theme_color:{tags: "tab background", value: 0x333333ff} + theme_color:{tags: "tab border", value: 0x2392ebff} + theme_color:{tags: "tab inactive background", value: 0} + theme_color:{tags: "tab inactive border", value: 0x42494eff} + theme_color:{tags: "tab auto background", value: 0x3e4d6eff} + theme_color:{tags: "tab auto inactive background", value: 0x3e4d6e39} + theme_color:{tags: "drop_site background", value: 0xffffff05} + theme_color:{tags: "drop_site border", value: 0xffffff0f} } ``` } From 58e643095558cc55145f3e6b0e6c1c19498470ef Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 20 May 2026 14:02:08 -0700 Subject: [PATCH 575/850] p2r: more carefully choose symbol chunk sizes - we were spending dramatically more memory than needed in cases where there were many translation units, with very few symbols, because of our overly-aggressive chunk sizes (e.g. chrome.dll.pdb). also, since we just parse the msf by forming contiguous streams, let's just always map input files in radbin by default, so that we don't pay twice for the memory. --- src/codeview/codeview_parse.h | 12 +++--- src/radbin/radbin.c | 35 ++++++----------- src/radbin/radbin.h | 2 + src/rdi_from_pdb/rdi_from_pdb.c | 69 +++++++++++++++++++++++++++++---- 4 files changed, 82 insertions(+), 36 deletions(-) diff --git a/src/codeview/codeview_parse.h b/src/codeview/codeview_parse.h index e6a5c6c1..c3337798 100644 --- a/src/codeview/codeview_parse.h +++ b/src/codeview/codeview_parse.h @@ -24,7 +24,7 @@ struct CV_NumericParsed typedef struct CV_RecRange CV_RecRange; struct CV_RecRange { - U32 off; + U32 off; CV_RecHeader hdr; }; @@ -34,7 +34,7 @@ typedef struct CV_RecRangeChunk CV_RecRangeChunk; struct CV_RecRangeChunk { struct CV_RecRangeChunk *next; - CV_RecRange ranges[CV_REC_RANGE_CHUNK_SIZE]; + CV_RecRange ranges[CV_REC_RANGE_CHUNK_SIZE]; }; typedef struct CV_RecRangeStream CV_RecRangeStream; @@ -42,14 +42,14 @@ struct CV_RecRangeStream { CV_RecRangeChunk *first_chunk; CV_RecRangeChunk *last_chunk; - U64 total_count; + U64 total_count; }; typedef struct CV_RecRangeArray CV_RecRangeArray; struct CV_RecRangeArray { CV_RecRange *ranges; - U64 count; + U64 count; }; //////////////////////////////// @@ -58,9 +58,9 @@ struct CV_RecRangeArray typedef struct CV_SymTopLevelInfo CV_SymTopLevelInfo; struct CV_SymTopLevelInfo { - CV_Arch arch; + CV_Arch arch; CV_Language language; - String8 compiler_name; + String8 compiler_name; }; typedef struct CV_SymParsed CV_SymParsed; diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 4d553846..380f46a7 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -56,28 +56,6 @@ rb_thread_entry_point(void *p) log_select(log); log_scope_begin(); -#if 0 - ProfScope("work") - { - for(int i = 0; i < 5; i += 1) - { - int sum = 0; - ProfScope("do work") - { - for(int x = 0; x < 10000; x += 1) - { - for(int y = 0; y < 10000; y += 1) - { - sum += x*y + x-y; - } - } - } - lane_sync(); - } - } - abort_self(0); -#endif - ////////////////////////////// //- rjf: set up shared state // @@ -314,10 +292,19 @@ rb_thread_entry_point(void *p) ////////////////////////// //- rjf: load recognized files // + File file = {0}; + FileMap file_map = {0}; String8 file_data = {0}; if(file_format != RB_FileFormat_Null) ProfScope("load recognized file") { - file_data = data_from_file_path(arena, input_file_path); + file = file_open(AccessFlag_ShareRead|AccessFlag_Read, input_file_path); + file_map = file_map_open(AccessFlag_Read, file); + FileProperties props = properties_from_file(file); + void *base = file_map_view_open(file_map, AccessFlag_Read, r1u64(0, props.size)); + if(base != 0) + { + file_data = str8((U8 *)base, props.size); + } } ////////////////////////// @@ -441,6 +428,8 @@ rb_thread_entry_point(void *p) f->format = file_format; f->format_flags = file_format_flags; f->path = input_file_path; + f->file = file; + f->file_map = file_map; f->data = file_data; RB_FileNode *file_n = push_array(arena, RB_FileNode, 1); file_n->v = f; diff --git a/src/radbin/radbin.h b/src/radbin/radbin.h index 3323f6c1..b18e45a5 100644 --- a/src/radbin/radbin.h +++ b/src/radbin/radbin.h @@ -35,6 +35,8 @@ struct RB_File RB_FileFormat format; RB_FileFormatFlags format_flags; String8 path; + File file; + FileMap file_map; String8 data; }; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index d4c9bc8f..e6b37e15 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -401,6 +401,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: do base MSF parse // MSF_Parsed *msf = 0; + ProfScope("do base MSF parse") { Temp scratch2 = scratch_begin(&scratch.arena, 1); @@ -3135,13 +3136,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: unpack sym Temp scratch = scratch_begin(&arena, 1); CV_SymParsed *sym = all_syms[sym_idx]; - U64 sym_locations_chunk_cap = 4096; - U64 sym_procedures_chunk_cap = 2048; - U64 sym_global_variables_chunk_cap = 2048; - U64 sym_thread_variables_chunk_cap = 2048; - U64 sym_constants_chunk_cap = 2048; - U64 sym_scopes_chunk_cap = 4096; - U64 sym_inline_sites_chunk_cap = 2048; RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; @@ -3151,6 +3145,67 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_InlineSiteChunkList *sym_inline_sites = &sym_unit->inline_sites; RDIM_TypeChunkList *typedefs = &syms_typedefs[sym_idx]; + ////////////////////////// + //- rjf: symbols pass 0: predict symbol chunk counts by record kinds + // + U64 sym_procedures_chunk_cap = sym->sym_ranges.count/4 + 1; + U64 sym_global_variables_chunk_cap = sym->sym_ranges.count/12 + 1; + U64 sym_thread_variables_chunk_cap = sym->sym_ranges.count/12 + 1; + U64 sym_constants_chunk_cap = sym->sym_ranges.count/6 + 1; + U64 sym_scopes_chunk_cap = sym->sym_ranges.count/4 + 1; + U64 sym_inline_sites_chunk_cap = sym->sym_ranges.count/6 + 1; + ProfScope("symbols pass 0: predict symbol chunk counts by record kinds") + { + U64 procedure_record_count = 0; + U64 global_variable_record_count = 0; + U64 thread_variable_record_count = 0; + U64 constant_record_count = 0; + U64 scope_record_count = 0; + U64 inline_site_record_count = 0; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + procedure_record_count += 1; + scope_record_count += 1; + }break; + case CV_SymKind_BLOCK32: + { + scope_record_count += 1; + }break; + case CV_SymKind_INLINESITE: + { + scope_record_count += 1; + inline_site_record_count += 1; + }break; + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + global_variable_record_count += 1; + }break; + case CV_SymKind_CONSTANT: + { + constant_record_count += 1; + }break; + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + { + thread_variable_record_count += 1; + }break; + } + } + sym_procedures_chunk_cap = Max(1, procedure_record_count); + sym_global_variables_chunk_cap = Max(1, global_variable_record_count); + sym_thread_variables_chunk_cap = Max(1, thread_variable_record_count); + sym_constants_chunk_cap = Max(1, constant_record_count); + sym_scopes_chunk_cap = Max(1, scope_record_count); + sym_inline_sites_chunk_cap = Max(1, inline_site_record_count); + } + ////////////////////////// //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) // From a645622b1011888973574dc7780a9cfe6a5628e1 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 27 Apr 2026 13:25:04 -0700 Subject: [PATCH 576/850] basic debugger stepping test run to completion --- src/base/base_strings.h | 1 + src/raddbg/raddbg_core.c | 373 ++++++++++- src/raddbg/raddbg_core.h | 22 + src/torture/dbg_tests/basic_stepping_test.c | 47 ++ src/torture/torture.c | 117 ++-- src/torture/torture.h | 24 +- src/torture/torture_dbg.c | 692 ++++++++++++++++++++ src/torture/torture_dbg.h | 176 +++++ src/torture/torture_main.c | 2 + 9 files changed, 1397 insertions(+), 57 deletions(-) create mode 100644 src/torture/dbg_tests/basic_stepping_test.c create mode 100644 src/torture/torture_dbg.c create mode 100644 src/torture/torture_dbg.h diff --git a/src/base/base_strings.h b/src/base/base_strings.h index a8332c30..9eb9b4ea 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -200,6 +200,7 @@ internal String8 backslashed_from_str8(Arena *arena, String8 string); #define str8_match_lit(a_lit, b, flags) str8_match(str8_lit(a_lit), (b), (flags)) #define str8_match_cstr(a_cstr, b, flags) str8_match(str8_cstring(a_cstr), (b), (flags)) internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); +#define str8_matchi(a, b) str8_match(a, b, StringMatchFlag_CaseInsensitive) internal B32 str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags); internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); internal U64 str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index ee659835..60b25d9c 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9226,6 +9226,26 @@ rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringParams *params, return result; } +internal String8 +rd_value_string_from_eval2(Arena *arena, String8 filter, EV_StringParams *params, U64 cap, E_Eval eval) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strs = {0}; + EV_StringIter *iter = ev_string_iter_begin(scratch.arena, eval, params); + for(String8 string = {0}; ev_string_iter_next(scratch.arena, iter, &string);) + { + if(strs.total_size + string.size > cap) + { + str8_list_push(scratch.arena, &strs, str8_lit("...")); + break; + } + str8_list_push(scratch.arena, &strs, string); + } + String8 result = str8_list_join(arena, &strs, 0); + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Hover Eval @@ -10282,7 +10302,270 @@ rd_next_view_cmd(RD_Cmd **cmd) } //////////////////////////////// -//~ rjf: Main Layer Top-Level Calls +//~ IPC + +internal RD_IpcReply +rd_ipc_mdesk_reply_from_string(Arena *arena, String8 string) +{ + MD_ParseResult parse = md_parse_from_text(arena, str8_lit("ipc_reply"), string); + return (RD_IpcReply){ .parse = parse, .root = parse.root, parse.root->first }; +} + +internal B32 +rd_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out) +{ + MD_Node *child = md_child_from_string(node, child_name, 0); + if (!md_node_is_nil(child) && !md_node_is_nil(child->first)) + { + if (out) { *out = child->first->string; } + return 1; + } + return 0; +} + +internal B32 +rd_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out) +{ + String8 value = {0}; + if (rd_ipc_parse_string(node, child_name, &value)) + { + U64 v64 = 0; + if (try_u64_from_str8_c_rules(value, &v64)) + { + if (out) { *out = safe_cast_u32(v64); } + return 1; + } + } + return 0; +} + +internal B32 +rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out) +{ + String8 value = {0}; + if (rd_ipc_parse_string(node, child_name, &value)) + { + U64 v64 = 0; + if (try_u64_from_str8_c_rules(value, &v64)) + { + if (out) { MemoryCopy(out, &v64, out_size); } + return 1; + } + } + return 0; +} + +internal B32 +rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out) +{ + B32 is_ok = 0; + String8 s = {0}; + U64 value = 0; + if (rd_ipc_parse_string(node, child_name, &s)) + { + if (str8_matchi(s, str8_lit("true"))) { value = 1; is_ok = 1; } + else if (str8_matchi(s, str8_lit("false"))) { value = 0; is_ok = 1; } + else + { + is_ok = try_u64_from_str8_c_rules(s, &value); + value = !!value; + } + } + if (is_ok && out) { *out = value; } + return is_ok; +} + +internal B32 +rd_ipc_reply_is_ok(RD_IpcReply *reply) +{ + return reply->parse.msgs.worst_message_kind < MD_MsgKind_Error; +} + +internal void +rd_ipc_reply_push(Arena *arena, String8List *out, char *name, String8 value) +{ + str8_list_pushf(arena, out, "%s: \"%S\"\n", name, escaped_from_raw_str8(arena, value)); +} + +internal void +rd_ipc_reply_block_begin(Arena *arena, String8List *out, char *name) +{ + str8_list_pushf(arena, out, "%s: {\n", name); +} + +internal void +rd_ipc_reply_block_end(Arena *arena, String8List *out) +{ + str8_list_pushf(arena, out, "}\n"); +} + +internal void +rd_ipc_reply_push_u64(Arena *arena, String8List *out, char *name, U64 value) +{ + str8_list_pushf(arena, out, "%s: %I64u\n", name, value); +} + +internal void +rd_ipc_reply_push_str8(Arena *arena, String8List *out, char *name, String8 value) +{ + str8_list_pushf(arena, out, "%s: \"%S\"\n", name, escaped_from_raw_str8(arena, value)); +} + +internal void +rd_ipc_reply_push_b32(Arena *arena, String8List *out, char *name, B32 value) +{ + rd_ipc_reply_push_u64(arena, out, name, !!value); +} + +internal String8 +rd_ipc_make_reply_ack(Arena *arena, String8 cmd, B32 ok) +{ + String8List s = {0}; + rd_ipc_reply_block_begin(arena, &s, "cmd_reply"); + rd_ipc_reply_push_b32(arena, &s, "ok", ok); + rd_ipc_reply_push (arena, &s, "cmd", cmd); + rd_ipc_reply_block_end(arena, &s); + return str8_list_join(arena, &s, 0); +} + +internal String8 +rd_ipc_make_reply_status(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List s = {0}; + rd_ipc_reply_block_begin(arena, &s, "status"); + rd_ipc_reply_push_b32 (arena, &s, "ok", 1); + rd_ipc_reply_push_b32 (arena, &s, "running", d_ctrl_targets_running()); + rd_ipc_reply_push_u64 (arena, &s, "run_gen", d_run_gen()); + rd_ipc_reply_block_end(arena, &s); + scratch_end(scratch); + return str8_list_join(arena, &s, 0); +} + +internal String8 +rd_ipc_make_reply_stop_event(Arena *arena) +{ + Temp scratch = scratch_begin(&arena, 1); + + D_Event e = d_ctrl_last_stop_event(); + + String8List stop_cause_list = {0}; + DR_FStrList stop_cause_fstr = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &e); + for EachNode (n, DR_FStrNode, stop_cause_fstr.first) { str8_list_push(scratch.arena, &stop_cause_list, n->v.string); } + String8 stop_cause = str8_list_join(arena, &stop_cause_list, &(StringJoin){.sep=str8_lit(" ")}); + + String8List s = {0}; + rd_ipc_reply_block_begin(arena, &s, "stop_event"); + rd_ipc_reply_push_b32 (arena, &s, "ok", 1); + rd_ipc_reply_push_u64 (arena, &s, "arch", e.arch); + rd_ipc_reply_push_u64 (arena, &s, "vaddr_min", e.vaddr_rng.min); + rd_ipc_reply_push_u64 (arena, &s, "vaddr_max", e.vaddr_rng.max); + rd_ipc_reply_push_u64 (arena, &s, "ip_vaddr", e.rip_vaddr); + rd_ipc_reply_push_u64 (arena, &s, "sp_base", e.stack_base); + rd_ipc_reply_push_u64 (arena, &s, "tls_root", e.tls_root); + rd_ipc_reply_push_u64 (arena, &s, "tls_index", e.tls_index); + rd_ipc_reply_push_u64 (arena, &s, "tls_offset", e.tls_offset); + rd_ipc_reply_push_u64 (arena, &s, "timestamp", e.timestamp); + rd_ipc_reply_push_u64 (arena, &s, "exception_code", e.exception_code); + rd_ipc_reply_push_u64 (arena, &s, "bp_flags", e.bp_flags); + rd_ipc_reply_push_str8(arena, &s, "string", e.string); + rd_ipc_reply_push_u64 (arena, &s, "target_os", e.target_os); + rd_ipc_reply_push_u64 (arena, &s, "tls_model", e.tls_model); + rd_ipc_reply_push_str8(arena, &s, "stop_cause", stop_cause); + rd_ipc_reply_block_end(arena, &s); + + String8 result = str8_list_join(arena, &s, 0); + scratch_end(scratch); + return result; +} + +internal String8 +rd_ipc_make_reply_eval(Arena *arena, String8 expr, E_Eval eval, U64 cap) +{ + Temp scratch = scratch_begin(&arena, 1); + + // gather value & type + EV_StringParams string_params = + { + .flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, + .radix = 10, + }; + String8 value_string = rd_value_string_from_eval2(scratch.arena, str8_zero(), &string_params, cap, eval); + String8 type_string = e_type_string_from_key(scratch.arena, eval.irtree.type_key); + + String8List errors = {0}; + for EachNode(msg, E_Msg, eval.msgs.first) { str8_list_push(scratch.arena, &errors, msg->text); } + String8 error_string = str8_list_join(scratch.arena, &errors, &(StringJoin){.sep = str8_lit("; ")}); + + // format reply + String8List reply = {0}; + rd_ipc_reply_block_begin(arena, &reply, "eval"); + rd_ipc_reply_push_b32 (arena, &reply, "ok", 1); + rd_ipc_reply_push (arena, &reply, "cmd", str8_lit("eval")); + rd_ipc_reply_push (arena, &reply, "expr", expr); + rd_ipc_reply_push (arena, &reply, "value", value_string); + rd_ipc_reply_push (arena, &reply, "type", type_string); + rd_ipc_reply_push (arena, &reply, "error", error_string); + rd_ipc_reply_block_end(arena, &reply); + String8 result = str8_list_join(arena, &reply, 0); + + scratch_end(scratch); + return result; +} + +internal String8 +rd_ipc_make_reply_source_location_from_address(Arena *arena, U64 vaddr) +{ + Temp scratch = scratch_begin(&arena, 1); + + D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->process); + if(process == &d_entity_nil) + { + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + } + + D_Entity *module = &d_entity_nil; + DI_Key dbgi_key = {0}; + U64 voff = 0; + D_LineList lines = {0}; + if(process != &d_entity_nil) + { + module = d_module_from_process_vaddr(process, vaddr); + if(module != &d_entity_nil) + { + dbgi_key = d_dbgi_key_from_module(module); + voff = d_voff_from_vaddr(module, vaddr); + lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); + } + } + D_Line line = {0}; + if(lines.first != 0) + { + line = lines.first->v; + } + + B32 is_ok = (process != &d_entity_nil && module != &d_entity_nil && lines.first != 0); + + String8List reply = {0}; + rd_ipc_reply_block_begin(arena, &reply, "source_location_from_address"); + rd_ipc_reply_push_b32 (arena, &reply, "ok", is_ok); + rd_ipc_reply_push_u64 (arena, &reply, "vaddr", vaddr); + rd_ipc_reply_push_u64 (arena, &reply, "voff", voff); + rd_ipc_reply_push_str8(arena, &reply, "file_path", line.file_path); + rd_ipc_reply_push_u64 (arena, &reply, "line", line.pt.line); + rd_ipc_reply_push_u64 (arena, &reply, "column", line.pt.column); + rd_ipc_reply_push_u64 (arena, &reply, "voff_min", line.voff_range.min); + rd_ipc_reply_push_u64 (arena, &reply, "voff_max", line.voff_range.max); + rd_ipc_reply_block_end(arena, &reply); + String8 result = str8_list_join(arena, &reply, 0); + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Main Layer Top-Level Calls #if !defined(STBI_INCLUDE_STB_IMAGE_H) # define STB_IMAGE_IMPLEMENTATION @@ -12558,17 +12841,93 @@ rd_frame(void) //- rjf: external driver textual commands case RD_CmdKind_RunExternalDriverTextCommand: { - String8 msg = rd_regs()->string; - String8List msg_parts = str8_split(scratch.arena, msg, (U8 *)" ", 1, 0); - CmdLine msg_cmd_line = cmd_line_from_string_list(scratch.arena, msg_parts); - String8 cmd_kind_name = str8_list_first(&msg_cmd_line.inputs); + String8 msg = rd_regs()->string; + String8List msg_parts = str8_split(scratch.arena, msg, (U8 *)" ", 1, 0); + CmdLine msg_cmd_line = cmd_line_from_string_list(scratch.arena, msg_parts); + String8 cmd_kind_name = str8_list_first(&msg_cmd_line.inputs); RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name); - if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope() + U64 cmd_args_pos = str8_find_needle(msg, 0, cmd_kind_name, StringMatchFlag_CaseInsensitive); + String8 cmd_args = str8_skip_chop_whitespace(str8_skip(msg, cmd_args_pos + cmd_kind_name.size)); + if(str8_match(cmd_kind_name, str8_lit("status"), 0)) { + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_status(rd_state->cmd_output_arena)); + } + else if(str8_match(cmd_kind_name, str8_lit("stop_event"), 0)) + { + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_stop_event(rd_state->cmd_output_arena)); + } + else if(str8_match(cmd_kind_name, str8_lit("run"), 0)) + { + rd_cmd(RD_CmdKind_Run); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("run"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("halt"), 0)) + { + rd_cmd(RD_CmdKind_Halt); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("halt"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("kill_all"), 0)) + { + rd_cmd(RD_CmdKind_KillAll); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("kill_all"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("step_over"), 0)) + { + rd_cmd(RD_CmdKind_StepOver); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_over"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("step_into"), 0)) + { + rd_cmd(RD_CmdKind_StepInto); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_into"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("step_out"), 0)) + { + rd_cmd(RD_CmdKind_StepOut); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_out"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("step_over_inst"), 0)) + { + rd_cmd(RD_CmdKind_StepOverInst); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_over_inst"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("step_into_inst"), 0)) + { + rd_cmd(RD_CmdKind_StepIntoInst); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_into_inst"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("step_over_line"), 0)) + { + rd_cmd(RD_CmdKind_StepOverLine); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_over_line"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("step_into_line"), 0)) + { + rd_cmd(RD_CmdKind_StepIntoLine); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_into_line"), 1)); + } + else if(str8_match(cmd_kind_name, str8_lit("eval"), 0)) + { + U64 cap_end = str8_find_needle(cmd_args, 0, str8_lit(" "), 0); + String8 cap_str = str8_substr(cmd_args, r1u64(0, cap_end)); + U64 cap = 0; + try_u64_from_str8_c_rules(cap_str, &cap); + String8 expr = str8_skip(cmd_args, cap_str.size); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_eval(rd_state->cmd_output_arena, expr, e_eval_from_string(expr), cap)); + } + else if(str8_match(cmd_kind_name, str8_lit("source_location_from_address"), 0)) + { + String8 vaddr_str = str8_skip_chop_whitespace(cmd_args); + U64 vaddr = 0; + try_u64_from_str8_c_rules(vaddr_str, &vaddr); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_source_location_from_address(rd_state->cmd_output_arena, vaddr)); + } + else if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope() + { for EachNonZeroEnumVal(RD_RegSlot, s) { String8 reg_slot_name = rd_reg_slot_code_name_table[s]; - String8 value = cmd_line_string(&msg_cmd_line, reg_slot_name); + String8 value = cmd_line_string(&msg_cmd_line, reg_slot_name); if(value.size != 0) { rd_regs_fill_slot_from_string(s, cmd_kind_info->query.expr, value); diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index e278f87e..0e3ecd64 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -93,6 +93,17 @@ enum RD_CmdKindFlag_ListInTextRng = (1<<4), }; +//////////////////////////////// +//~ IPC + +typedef struct RD_IpcReply RD_IpcReply; +struct RD_IpcReply +{ + MD_ParseResult parse; + MD_Node *root; + MD_Node *msg; +}; + //////////////////////////////// //~ rjf: Autocompletion Cursor Info Type @@ -751,6 +762,7 @@ internal void rd_window_frame(void); //~ rjf: Eval Visualization internal String8 rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval); +internal String8 rd_value_string_from_eval2(Arena *arena, String8 filter, EV_StringParams *params, U64 cap, E_Eval eval); //////////////////////////////// //~ rjf: Hover Eval @@ -836,6 +848,16 @@ internal void rd_push_cmd(String8 name, RD_Regs *regs); internal B32 rd_next_cmd(RD_Cmd **cmd); internal B32 rd_next_view_cmd(RD_Cmd **cmd); +//////////////////////////////// +//~ IPC + +internal RD_IpcReply rd_ipc_mdesk_reply_from_string(Arena *arena, String8 string); +internal B32 rd_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out); +internal B32 rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out); +#define rd_ipc_parse_int(a, b, c) rd_ipc_parse_int_(a, b, sizeof(*c), c) +internal B32 rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out); +internal B32 rd_ipc_reply_is_ok(RD_IpcReply *reply); + //////////////////////////////// //~ rjf: Main Layer Top-Level Calls diff --git a/src/torture/dbg_tests/basic_stepping_test.c b/src/torture/dbg_tests/basic_stepping_test.c new file mode 100644 index 00000000..a60c5e05 --- /dev/null +++ b/src/torture/dbg_tests/basic_stepping_test.c @@ -0,0 +1,47 @@ +/// test: { +/// windows: { +/// compile: "/Od /Z7 /c main.c /Fo:main.obj" +/// compile: "/Od /Z7 /c foo.c /Fo:foo.obj" +/// link: "/debug:full /dll foo.obj /out:foo.dll /implib:foo.lib" +/// link: "/debug:full main.obj foo.lib /out:main.exe" +/// launch: "main.exe" +/// } +/// linux: { +/// compile: "-O0 -g main.c foo.c -o main" +/// launch: "./main" +/// } +/// } + +/// file: "foo.c" + +#if defined(_WIN32) +__declspec(dllexport) +#endif +int foo(int a) +{ /// 6: at + /// 7: step_over + return a + 1; /// 8: at + /// 9: step_out +} + +/// file: "main.c" + +#include + +#if defined(_WIN32) +__declspec(dllimport) +#endif +int foo(); + +int main() /// 1: step_into +{ /// 2: at + /// 3: step_over + int x = foo(123); /// 4: at + /// 5: step_into + /// 10: at: -2 + /// 11: step_over + printf("Hello, world!\n"); /// 12: at + /// 13: step_over + /// 14: run +} + diff --git a/src/torture/torture.c b/src/torture/torture.c index ab8ec208..aa6b79ee 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -45,6 +45,17 @@ t_id_linker(void) return T_Linker_Null; } +internal void +t_break_if_debugger_present(void) +{ +#if OS_WINDOWS + if(IsDebuggerPresent()) + { + DebugBreak(); + } +#endif +} + internal B32 t_write_file_list(String8 name, String8List data) { @@ -136,7 +147,7 @@ t_run_caller(void *raw_ctx) T_RunCtx *ctx = raw_ctx; String8List test_out = {0}; ctx->result.status = T_RunStatus_Pass; - ctx->run(scratch.arena, &ctx->result, &test_out); + ctx->run(scratch.arena, ctx->user_data, &ctx->result, &test_out); if (ctx->result.status == T_RunStatus_Fail) { for EachNode(n, String8Node, test_out.first) { fprintf(stderr, "%.*s", str8_varg(n->string)); @@ -155,10 +166,9 @@ t_run_fail_handler(void *raw_ctx) } internal T_RunResult -t_run(T_Run run) +t_run(T_Run run, String8 user_data) { - T_RunCtx ctx = { .run = run }; - + T_RunCtx ctx = { .run = run, .user_data = user_data }; B32 do_safe_call = 1; #if OS_WINDOWS if (IsDebuggerPresent()) { @@ -263,6 +273,24 @@ t_radlink_path(void) return path; } +internal String8 +t_raddbg_path(void) +{ + local_persist String8 path = {0}; + if (path.size == 0) { + local_persist U8 buffer[4096]; + ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; + Arena *arena = arena_alloc_(¶ms); +#if OS_WINDOWS + path = os_full_path_from_path(arena, str8_lit("raddbg.exe")); +#else + path = os_full_path_from_path(arena, str8_lit("raddbg")); +#endif + AssertAlways(path.size); + } + return path; +} + internal String8 t_cwd_path(void) { @@ -384,6 +412,30 @@ t_invoke(String8 exe_path, String8 cmdline, U64 timeout) return t_invoke_(exe_path, cmdline, timeout, 0, 0); } +internal void +t_kill_all(String8 pattern) +{ + Temp scratch = scratch_begin(0,0); + DMN_ProcessIter it = {0}; + dmn_process_iter_begin(&it); + DMN_ProcessInfo info = {0}; + while (dmn_process_iter_next(scratch.arena, &it, &info)) { + if (str8_match_wildcard(info.name, pattern, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive)) { +#if OS_WINDOWS + if (!t_invoke_(str8_lit("taskkill"), str8f(scratch.arena, "/PID %u /F", info.pid), max_U64, 0, 0)) { fprintf(stderr, "ERROR: failed to invoke taskkill\n"); } +#elif OS_LINUX + NotImplemented; // TODO: test + if (!t_invoke_(str8_lit("kill"), str8f(scratch.arena, " -9 %u", info.pid), max_U64, 0, 0)) { fprintf(stderr, "ERROR: failed to invoke kill\n"); } +#else +# error NotImplemented +#endif + if (g_last_exit_code != 0) { fprintf(stderr, "ERROR: failed to kill %u\n", info.pid); } + } + } + dmn_process_iter_end(&it); + scratch_end(scratch); +} + internal String8 t_chop_line(String8 *output) { @@ -422,14 +474,20 @@ t_match_linef(String8 *output, char *fmt, ...) } internal int -t_test_is_before(void *raw_a, void *raw_b) +t_test_compar(const void *raw_a, const void *raw_b) { - T_Test *a = raw_a, *b = raw_b; + const T_Test *a = raw_a, *b = raw_b; int cmp = str8_compar(str8_cstring(a->group), str8_cstring(b->group), 0); if (cmp == 0) { cmp = u64_compar(&a->decl_line, &b->decl_line); } - return cmp < 0; + return cmp; +} + +internal int +t_test_is_before(void *raw_a, void *raw_b) +{ + return t_test_compar(raw_a, raw_b) < 0; } internal String8List @@ -549,32 +607,9 @@ t_entry_point(CmdLine *cmdline) abort_self(0); } } - -#if 0 - // - // config - // - { - DateTime start_time_uni = os_now_universal_time(); - DateTime start_time_loc = os_local_time_from_universal(&start_time_uni); - PrintHeader("Config"); - fprintf(stderr, " Build %s\n", BUILD_TITLE_STRING_LITERAL); - fprintf(stderr, " Start %.*s\n", str8_varg(string_from_date_time(scratch.arena, &start_time_loc))); - fprintf(stderr, "\n"); - fprintf(stderr, " Tools\n"); -#if OS_WINDOWS - AssertAlways(t_cl_path().size && t_cl_version().size); - fprintf(stderr, " MSVC %.*s\n", str8_varg(t_cl_version())); - fprintf(stderr, " %.*s\n", str8_varg(t_cl_path())); -#endif - fprintf(stderr, " radlink %.*s\n", str8_varg(t_radlink_version())); - fprintf(stderr, " %.*s\n", str8_varg(t_radlink_path())); - fprintf(stderr, " radbin %.*s\n", str8_varg(t_radbin_version())); - fprintf(stderr, " %.*s\n", str8_varg(t_radbin_path())); - fprintf(stderr, "\n"); - } -#endif - + // register debugger tests + String8 test_folder_path = str8f(scratch.arena, "%S/torture/dbg_tests", t_src_path()); + t_dbg_register_script_tests(scratch.arena, test_folder_path); // // Handle -list // @@ -631,8 +666,12 @@ t_entry_point(CmdLine *cmdline) } if (target_opt) { HashTable *ht = hash_table_init(scratch.arena, g_torture_test_count*2); - if (target_opt->value_strings.node_count > 0) { - for EachNode(pattern_n, String8Node, target_opt->value_strings.first) { + + String8List targets = target_opt->value_strings; + str8_list_concat_in_place(&targets, &cmdline->inputs); + + if (targets.node_count > 0) { + for EachNode(pattern_n, String8Node, targets.first) { B32 do_namespace = str8_find_needle(pattern_n->string, 0, str8_lit("::"), 0) < pattern_n->string.size; for EachIndex(test_idx, g_torture_test_count) { String8 name = str8_cstring(g_torture_tests[test_idx].label); @@ -794,10 +833,9 @@ t_entry_point(CmdLine *cmdline) } // run test - U64 run_start_time = now_time_us(); - T_RunResult result = t_run(g_torture_tests[target_idx].r); - U64 run_end_time = now_time_us(); - + U64 run_start_time = os_now_microseconds(); + T_RunResult result = t_run(g_torture_tests[target_idx].r, g_torture_tests[target_idx].user_data); + U64 run_end_time = os_now_microseconds(); // print result if (result.status == T_RunStatus_Pass) { fprintf(stdout, "\x1b[32m" "%s" "\x1b[0m", t_string_from_result(result.status)); @@ -889,4 +927,3 @@ t_entry_point(CmdLine *cmdline) scratch_end(scratch); } - diff --git a/src/torture/torture.h b/src/torture/torture.h index 993ad818..f4742a2e 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -20,25 +20,30 @@ typedef struct char *fail_cond; } T_RunResult; -#define T_RunSig(name) void t_##name(Arena *arena, T_RunResult *result_out, String8List *test_out) -typedef void (*T_Run)(Arena *arena, T_RunResult *result_out, String8List *test_out); +#define T_RunSig(name) void t_##name(Arena *arena, String8 user_data, T_RunResult *result_out, String8List *test_out) +typedef void (*T_Run)(Arena *arena, String8 user_data, T_RunResult *result_out, String8List *test_out); typedef struct { T_Run run; + String8 user_data; T_RunResult result; } T_RunCtx; typedef struct { - char *group; - char *label; - int decl_line; - T_Run r; + char *group; + char *label; + int decl_line; + T_Run r; + String8 user_data; } T_Test; extern U64 g_torture_test_count; extern T_Test g_torture_tests[0xffffff]; +extern U64 g_torture_running_test_idx; + +internal void t_break_if_debugger_present(void); #define T_AddTest(name, l, ...) \ T_RunSig(name); \ @@ -61,7 +66,7 @@ extern T_Test g_torture_tests[0xffffff]; TEST_(name) \ T_RunSig(name) -#define T_Ok(c) do { if (!(c)) { result_out->fail_file = __FILE__; result_out->fail_line = __LINE__; result_out->fail_cond = Stringify(c); result_out->status = T_RunStatus_Fail; return; } } while(0) +#define T_Ok(c) do { if (!(c)) { result_out->fail_file = __FILE__; result_out->fail_line = __LINE__; result_out->fail_cond = Stringify(c); result_out->status = T_RunStatus_Fail; t_break_if_debugger_present(); return; } } while(0) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) #define t_outf(...) str8_list_pushf(arena, test_out, ## __VA_ARGS__) @@ -77,7 +82,7 @@ internal String8 t_make_file_path(Arena *arena, String8 name); // test runner internal void t_run_caller(void *raw_ctx); internal void t_run_fail_handler(void *raw_ctx); -internal T_RunResult t_run(T_Run run); +internal T_RunResult t_run(T_Run run, String8 user_data); internal String8 t_radbin_path(void); internal String8 t_cl_path(void); @@ -87,6 +92,5 @@ internal String8 t_src_path(void); internal B32 t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, String8 *output_out); internal B32 t_invoke(String8 exe, String8 cmdline, U64 timeout); - #define t_invoke_cl(f, ...) t_invoke_(t_cl_path(), str8f(scratch.arena, f, ## __VA_ARGS__), max_U64, 0, 0) - +internal void t_kill_all(String8 pattern); diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c new file mode 100644 index 00000000..c081dd5a --- /dev/null +++ b/src/torture/torture_dbg.c @@ -0,0 +1,692 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#define T_Group "Dbg" + +//////////////////////////////////////////////////////////////// + +#define TIMEOUT_US(x) (x) +#define TIMEOUT_MS(x) TIMEOUT_US((x)*1000ull) +#define TIMEOUT_SEC(x) TIMEOUT_MS((x)*1000ull) + +#define ENDT_US(x) (os_now_microseconds() + (x)) +#define ENDT_MS(x) TIMEOUT_US((x)*1000ull) +#define ENDT_SEC(x) TIMEOUT_MS((x)*1000ull) + +//////////////////////////////// +// IPC Controller + +internal OS_Handle g_dbg_handle; + +internal B32 +t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *reply_out) +{ + Temp scratch = scratch_begin(&reply_arena, 1); + B32 is_sent = 0; + +#if OS_WINDOWS + U32 dbg_pid = GetProcessId((HANDLE)g_dbg_handle.u64[0]); +#elif OS_LINUX + U32 dbg_pid = safe_cast_u32(handle.u64[0]); +#else +# error NotImplemented +#endif + + // send command + String8 cmdline = str8f(scratch.arena, "--ipc --pid:%u %S", dbg_pid, cmd); + Arena *output_arena = reply_arena ? reply_arena : scratch.arena; + String8 output = {0}; + if (t_invoke_(t_raddbg_path(), cmdline, timeout_us, output_arena, &output) == 0) { goto exit; } + + B32 has_reply = 1; + + char *no_reply_cmds[] = { + "add_breakpoint", + "add_function_breakpoint", + "add_address_breakpoint", + "clear_breakpoints", + }; + for EachElement(i, no_reply_cmds) { + if (str8_match_wildcard(cmd, str8f(scratch.arena, "%s*", no_reply_cmds[i]), 0)) { + has_reply = 0; + break; + } + } + + if (has_reply) { + // parse reply + RD_IpcReply reply = rd_ipc_mdesk_reply_from_string(output_arena, output); + if (rd_ipc_reply_is_ok(&reply) == 0) { goto exit; } + if (md_node_is_nil(reply.msg)) { goto exit; } + if (reply_arena && reply_out) { *reply_out = reply; } + } + + is_sent = 1; + exit:; + scratch_end(scratch); + return is_sent; +} + +internal B32 +t_dbg_send_cmdf(U64 timeout_us, Arena *reply_arena, RD_IpcReply *reply_out, char *fmt, ...) +{ + Temp scratch = scratch_begin(&reply_arena, 1); + va_list args; + va_start(args, fmt); + String8 cmd = str8fv(scratch.arena, fmt, args); + B32 is_ok = t_dbg_send_cmd(cmd, timeout_us, reply_arena, reply_out); + va_end(args); + scratch_end(scratch); + return is_ok; +} + +internal B32 +t_dbg_status(T_DbgStatus *status_out, U64 timeout_us) +{ + Temp scratch = scratch_begin(0, 0); + T_DbgStatus status = {0}; + B32 is_ok = 0; + + // send status request + RD_IpcReply reply = {0}; + if ( ! t_dbg_send_cmd(str8_lit("status"), timeout_us, scratch.arena, &reply)) { goto exit; } + + // parse reply + if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("running"), &status.running)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int(reply.msg, str8_lit("run_gen"), &status.run_gen)) { AssertAlways(0); goto exit; } + if (status_out != 0) { *status_out = status; } + + exit:; + return is_ok; +} + +internal B32 +t_dbg_stop_event(Arena *arena, T_DbgStopEvent *out, U64 timeout_us) +{ + Temp scratch = scratch_begin(0, 0); + + T_DbgStopEvent v = {0}; + B32 is_ok = 0; + + // send status request + RD_IpcReply reply = {0}; + if ( ! t_dbg_send_cmd(str8_lit("stop_event"), timeout_us, scratch.arena, &reply)) { goto exit; } + + // parse reply + if ( ! rd_ipc_parse_b32 (reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("arch"), &v.arch)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("vaddr_min"), &v.vaddr_min)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("vaddr_max"), &v.vaddr_max)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("ip_vaddr"), &v.ip_vaddr)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("sp_base"), &v.sp_base)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_root"), &v.tls_root)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_index"), &v.tls_index)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_offset"), &v.tls_offset)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("timestamp"), &v.timestamp)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("exception_code"), &v.exception_code)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("bp_flags"), &v.bp_flags)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_string (reply.msg, str8_lit("string"), &v.string)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("target_os"), &v.target_os)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_model"), &v.tls_model)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_string (reply.msg, str8_lit("stop_cause"), &v.stop_cause)) { AssertAlways(0); goto exit; } + + if (out != 0) { *out = v; } + + exit:; + return is_ok; +} + +internal B32 +t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgSourceLocation *loc_out, U64 timeout_us) +{ + Temp scratch = scratch_begin(&arena, 1); + + B32 is_ok = 0; + + RD_IpcReply reply = {0}; + if(!t_dbg_send_cmdf(timeout_us, arena, &reply, "source_location_from_address 0x%llx", vaddr)) { goto exit; } + + T_DbgSourceLocation loc = {0}; + + if ( ! rd_ipc_parse_b32 (reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("vaddr"), &loc.vaddr)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff"), &loc.voff)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("file_path"), &loc.file_path)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("line"), &loc.pt.line)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("column"), &loc.pt.column)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff_min"), &loc.voff_range.min)){ AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff_max"), &loc.voff_range.max)){ AssertAlways(0); goto exit; } + + if (loc_out != 0) { *loc_out = loc; } + + exit:; + scratch_end(scratch); + return is_ok; +} + +internal String8 +t_dbg_value_from_expr(Arena *arena, String8 expr) +{ + T_Eval eval = {0}; + if ( ! t_dbg_eval(arena, expr, &eval)) { AssertAlways("failed on eval"); } + return eval.value; +} + +internal String8 +t_dbg_value_from_exprf(Arena *arena, char *fmt, ...) +{ + Temp scratch = scratch_begin(&arena, 1); + va_list args; + va_start(args, fmt); + String8 expr = push_str8fv(scratch.arena, fmt, args); + String8 result = t_dbg_value_from_expr(arena, expr); + va_end(args); + scratch_end(scratch); + return result; +} + +internal B32 +t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) +{ + Temp scratch = scratch_begin(0,0); + B32 is_stopped = 0; + + // snapshot status + T_DbgStatus status_before = {0}; + if (t_dbg_status(&status_before, max_U64) == 0) { Assert(0 && "failed to snapshot status"); goto exit; } + + // send command + if (t_dbg_send_cmd(cmd, max_U64, 0, 0) == 0) { Assert(0 && "failed to the command"); goto exit; } + + // wait for debugger to stop + U64 t = timeout_us; + do { + // query debugger status + U64 begint_us = os_now_microseconds(); + T_DbgStatus status = {0}; + if (t_dbg_status(&status, t) == 0) { Assert(0 && "failed to acquire debugger status"); goto exit; } + U64 endt_us = os_now_microseconds(); + + // did state change? -> break + if (!status.running && status.run_gen != status_before.run_gen) { + is_stopped = 1; + break; + } + + U64 dt_us = (endt_us - begint_us) + TIMEOUT_MS(10); + if (dt_us >= t) { break; } + t -= dt_us; + + // "solve" the wait problem + os_sleep_milliseconds(10); + } while (t > 0); + + //--- Status --------------------- + if (is_stopped) { + T_DbgStatus status = {0}; + AssertAlways(t_dbg_status(&status, 0)); + + String8 process_id = str8_skip(str8_chop(t_dbg_value_from_exprf(scratch.arena, "query:current_process.id"), 2), 2); + String8 process_label = str8_chop(str8_skip(t_dbg_value_from_exprf(scratch.arena, "query:current_process.label"), 2), 2); + String8 process_active = t_dbg_value_from_exprf(scratch.arena, "query:current_process.active"); + String8 thread_id = t_dbg_value_from_exprf(scratch.arena, "query:current_thread.id"); + String8 thread_active = t_dbg_value_from_exprf(scratch.arena, "query:current_thread.active"); + String8 thread_label = str8_skip(str8_chop(t_dbg_value_from_exprf(scratch.arena, "query:current_thread.label"), 2), 2); + String8 ip = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rip)"); + String8 sp = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rsp)"); + + T_DbgStopEvent last_stop = {0}; + AssertAlways(t_dbg_stop_event(scratch.arena, &last_stop, 0)); + + T_DbgSourceLocation loc = {0}; + AssertAlways(t_dbg_src_line(scratch.arena, last_stop.ip_vaddr, &loc, 0)); + + printf("------------------------------------------------------------------------------------------------------------------------\n"); + printf(" Process: %.*s [%.*s] (Active: %.*s)\n", str8_varg(process_id), str8_varg(process_label), str8_varg(process_active)); + printf(" Thread: %.*s [%.*s] (Active: %.*s)\n", str8_varg(thread_id), str8_varg(thread_label), str8_varg(thread_active)); + printf(" IP: %.*s\n", str8_varg(ip)); + printf(" SP: %.*s\n", str8_varg(sp)); + printf(" File Path: %.*s\n", str8_varg(loc.file_path)); + printf(" Line: %lld\n", loc.pt.line); + printf(" Column: %lld\n", loc.pt.column); + printf(" Run Gen: %llu\n", status.run_gen); + printf(" Stop Cause: \"%.*s\"\n", str8_varg(last_stop.stop_cause)); + } + //-------------------------------- + + exit:; + scratch_end(scratch); + return is_stopped; +} + +internal B32 t_dbg_ping (U64 timeout_us) { return t_dbg_status(0, timeout_us); } +internal B32 t_dbg_bp_add_line(String8 file, U64 line) { return t_dbg_send_cmdf(0,0,0, "add_breakpoint \"%S\":%llu", file, line); } +internal B32 t_dbg_bp_add_func(String8 func_name) { return t_dbg_send_cmdf(0,0,0, "add_function_breakpoint %S", func_name); } +internal B32 t_dbg_bp_add_addr(U64 addr) { return t_dbg_send_cmdf(0,0,0, "add_address_breakpoint 0x%llx", addr); } + +internal B32 +t_dbg_launch(String8 cmdline, U64 timeout_us) +{ + Temp scratch = scratch_begin(0, 0); + B32 dbg_ready = 0; + + String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user")); + cmdline = str8f(scratch.arena, "--user:\"%S\" %S", user_path, cmdline); + + // launch debugger + OS_ProcessLaunchParams launch_opts = { + .path = g_wdir, + .inherit_env = 1, + .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), + }; + str8_list_push_front(scratch.arena, &launch_opts.cmd_line, t_raddbg_path()); + g_dbg_handle = os_process_launch(&launch_opts); + if (os_handle_match(g_dbg_handle, os_handle_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } + os_process_join(g_dbg_handle, 0, 0); + + // now wait for debugger to init + U64 t = timeout_us; + do { + // time the ping + U64 ping_begint_us = os_now_microseconds(); + dbg_ready = t_dbg_ping(t); + if (dbg_ready) { break; } + U64 ping_endt_us = os_now_microseconds(); + + // dbg did not pong -> compute remaining timeout and loop back + U64 ping_dt_us = (ping_endt_us - ping_begint_us) + TIMEOUT_MS(10); + if (ping_dt_us >= t) { break; } + t -= ping_dt_us; + + // "solve" the wait problem + os_sleep_milliseconds(10); + } while (t > 0); + + exit:; + scratch_end(scratch); + return dbg_ready; +} + +internal B32 +t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) +{ + Temp scratch = scratch_begin(&arena, 1); + + RD_IpcReply reply = {0}; + String8 cmd = str8f(scratch.arena, "eval %llu %S", /* value char cap: */ 10000, expr); + B32 is_ok = t_dbg_send_cmd(cmd, 0, arena, &reply); + + T_Eval e = {0}; + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("value"), &e.value)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("type"), &e.type)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("error"), &e.error)) { AssertAlways(0); goto exit; } + if (eval_out) { *eval_out = e; } + + exit:; + scratch_end(scratch); + return is_ok; +} + +//////////////////////////////// +// Dbg Script + +force_inline int +t_dbg_script_program_compar(const void *raw_a, const void *raw_b) +{ + T_DbgScriptProgram * const *a = raw_a, * const *b = raw_b; + return u64_compar(&(*a)->order, &(*b)->order); +} + +force_inline int +t_dbg_script_program_is_before(void *raw_a, void *raw_b) +{ + return t_dbg_script_program_compar(raw_a, raw_b) < 0; +} + +internal T_DbgScriptCmdKind +t_dbg_script_cmd_kind_from_string(String8 cmd) +{ + if (str8_matchi(cmd, str8_lit("bp"))) { return T_DbgScriptCmdKind_Breakpoint; } + else if (str8_matchi(cmd, str8_lit("bp_clear"))) { return T_DbgScriptCmdKind_ClearBreakpoints; } + else if (str8_matchi(cmd, str8_lit("run"))) { return T_DbgScriptCmdKind_Run; } + else if (str8_matchi(cmd, str8_lit("halt"))) { return T_DbgScriptCmdKind_Halt; } + else if (str8_matchi(cmd, str8_lit("step_over"))) { return T_DbgScriptCmdKind_StepOver; } + else if (str8_matchi(cmd, str8_lit("step_into"))) { return T_DbgScriptCmdKind_StepInto; } + else if (str8_matchi(cmd, str8_lit("step_out"))) { return T_DbgScriptCmdKind_StepOut; } + else if (str8_matchi(cmd, str8_lit("step_over_inst"))) { return T_DbgScriptCmdKind_StepOverInst; } + else if (str8_matchi(cmd, str8_lit("step_into_inst"))) { return T_DbgScriptCmdKind_StepIntoInst; } + else if (str8_matchi(cmd, str8_lit("step_over_line"))) { return T_DbgScriptCmdKind_StepOverLine; } + else if (str8_matchi(cmd, str8_lit("step_into_line"))) { return T_DbgScriptCmdKind_StepIntoLine; } + else if (str8_matchi(cmd, str8_lit("at"))) { return T_DbgScriptCmdKind_At; } + else if (str8_matchi(cmd, str8_lit("eval"))) { return T_DbgScriptCmdKind_Eval; } + return T_DbgScriptCmdKind_Null; +} + +internal T_DbgScript +t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source) +{ + Temp scratch = scratch_begin(&arena, 1); + + T_DbgScript script = { .file_path = push_str8_copy(arena, file_path) }; + + // scrape MD comment tokens out of source while preserving original source offsets + MD_TokenArray script_tokens = {0}; + { + MD_TokenizeResult source_tokens = md_tokenize_from_text(scratch.arena, source); + MD_TokenChunkList script_token_chunks = {0}; + for EachIndex(token_idx, source_tokens.tokens.count) { + MD_Token token = source_tokens.tokens.v[token_idx]; + if (token.flags & MD_TokenFlag_Comment) { + String8 token_string = str8_substr(source, token.range); + String8 comment = str8_skip_chop_whitespace(token_string); + String8 prefix = str8_lit("///"); + if (str8_matchi(str8_prefix(comment, prefix.size), prefix)) { + String8 script_part = str8_skip(comment, prefix.size); + U64 script_part_base_off = (U64)(script_part.str - source.str); + MD_TokenizeResult script_part_tokenize = md_tokenize_from_text(scratch.arena, script_part); + for EachIndex(script_token_idx, script_part_tokenize.tokens.count) { + MD_Token script_token = script_part_tokenize.tokens.v[script_token_idx]; + script_token.range.min += script_part_base_off; + script_token.range.max += script_part_base_off; + md_token_chunk_list_push(scratch.arena, &script_token_chunks, 4096, script_token); + } + MD_Token newline_token = md_token_make(r1u64(token.range.max, token.range.max), MD_TokenFlag_Newline); + md_token_chunk_list_push(scratch.arena, &script_token_chunks, 4096, newline_token); + } + } + } + script_tokens = md_token_array_from_chunk_list(scratch.arena, &script_token_chunks); + } + + // script tokens -> mdesk tree + MD_ParseResult script_parse = md_parse_from_text_tokens(scratch.arena, file_path, source, script_tokens); + AssertAlways(script_parse.msgs.worst_message_kind < MD_MsgKind_Error); + + // test + { + MD_Node *test = script_parse.root->first; + AssertAlways( ! md_node_is_nil(test)); + AssertAlways(str8_matchi(test->string, str8_lit("test"))); + + String8 os_name = string_from_operating_system(OperatingSystem_CURRENT); + + for MD_EachNode(n, test->first) { + OperatingSystem os = operating_system_from_string(n->string); + AssertAlways(os != OperatingSystem_Null); + + for MD_EachNode(field, n->first) { + T_DbgScriptDirectiveKind kind = T_DbgScriptDirectiveKind_Null; + if (str8_matchi(field->string, str8_lit("compile"))) { kind = T_DbgScriptDirectiveKind_Compile; } + else if (str8_matchi(field->string, str8_lit("link"))) { kind = T_DbgScriptDirectiveKind_Link; } + else if (str8_matchi(field->string, str8_lit("launch"))) { kind = T_DbgScriptDirectiveKind_Launch; } + AssertAlways(kind != T_DbgScriptDirectiveKind_Null); + + // syntax check + AssertAlways( !md_node_is_nil(field->first)); + AssertAlways(md_node_is_nil(field->first->next)); + Assert(field->first->flags & MD_NodeFlag_StringLiteral); + + // src_offset -> line + // + // TODO: super silly!! mdesk should export line numbers + U64 line = 1; + String8 text_before_src = str8_prefix(source, field->src_offset); + for EachIndex(idx, text_before_src.size) { line += (text_before_src.str[idx] == '\n'); } + + T_DbgScriptDirective *n = push_array(arena, T_DbgScriptDirective, 1); + n->kind = kind; + n->line = line; + n->args = str8_copy(arena, field->first->string); + // TODO: expand % in compile: and link: to current source file name and esacpe with %% + + T_DbgScriptDirectiveList *list = &script.directives[os][kind]; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + } + } + } + + // file + { + MD_Node *last_file = 0; + for MD_EachNode(n, script_parse.root->first->next) { + B32 is_end = (md_node_is_nil(n->next) && last_file != 0); + if (str8_matchi(n->string, str8_lit("file")) || is_end) { + if (!is_end) { + AssertAlways( ! md_node_is_nil(n->first)); + AssertAlways(md_node_is_nil(n->first->next)); + } + + if (last_file) { + // src_offset -> base_line + // + // TODO: super silly!! mdesk should export line numbers + U64 line = 1; + for EachIndex(idx, last_file->src_offset) { line += (source.str[idx] == '\n'); } + + String8 sub_source = str8_substr(source, r1u64(last_file->src_offset, is_end ? source.size : n->src_offset)); + U64 file_dir_end = str8_find_needle(sub_source, 0, str8_lit("\n"), 0); + U64 next_file_dir_begin = str8_find_needle_reverse(sub_source, 0, str8_lit("\n"), n->src_offset); + sub_source = str8_substr(sub_source, r1u64(file_dir_end + 1, next_file_dir_begin)); + + T_DbgScriptFile *file = push_array(arena, T_DbgScriptFile, 1); + file->path = t_make_file_path(arena, last_file->first->string); + file->source = sub_source; + file->line = line; + SLLQueuePush(script.files.first, script.files.last, file); + script.files.count += 1; + } + + last_file = n; + } + } + + // no file directives? assume script file as main source file + if (last_file == 0) { + T_DbgScriptFile *file = push_array(arena, T_DbgScriptFile, 1); + file->path = file_path; + file->source = source; + SLLQueuePush(script.files.first, script.files.last, file); + script.files.count += 1; + } + } + + // programs + { + HashTable *ht = hash_table_init(scratch.arena, 256); // + for MD_EachNode(n, script_parse.root->first->next) { + U64 order = 0; + if (try_u64_from_str8_c_rules(n->string, &order)) { + T_DbgScriptFile *file = 0; + for (file = script.files.first; file != 0; file = file->next) { + if (file->source.str <= n->string.str && n->string.str < (file->source.str + file->source.size)) { + break; + } + } + AssertAlways(file != 0); + + // src_offset -> line + // + // TODO: super silly!! mdesk should export line numbers + U64 line = 1; + for EachIndex(i, n->src_offset) { line += (source.str[i] == '\n'); } + + T_DbgScriptProgram *p = hash_table_search_u64_raw(ht, order); + if (p == 0) { + p = push_array(arena, T_DbgScriptProgram, 1); + p->line = line; + p->order = order; + p->os = OperatingSystem_CURRENT; + p->file = file; + hash_table_push_u64_raw(scratch.arena, ht, order, p); + } else { + fprintf(stderr, "ERROR: duplicate order number %llu found on line %llu\n", order, p->line); + } + + MD_Node *cmd_name = n->first; + MD_Node *cmd_arg = cmd_name->first; + AssertAlways(!md_node_is_nil(cmd_name)); + + // push new cmd + T_DbgScriptCmd *cmd = push_array(arena, T_DbgScriptCmd, 1); + cmd->kind = t_dbg_script_cmd_kind_from_string(cmd_name->string); + AssertAlways(cmd->kind != T_DbgScriptCmdKind_Null); + SLLQueuePush(p->first, p->first, cmd); + p->count += 1; + + // parse cmd args + if ( ! md_node_is_nil(cmd_arg)) { + if (cmd->kind == T_DbgScriptCmdKind_At) { + AssertAlways(try_s64_from_str8_c_rules(cmd_arg->string, &cmd->at.delta)); + } else if (cmd->kind == T_DbgScriptCmdKind_Eval) { + NotImplemented; + } else if (cmd->kind == T_DbgScriptCmdKind_Breakpoint) { + NotImplemented; + } + } + } + } + + script.program_count = ht->count; + script.programs = values_from_hash_table_raw(arena, ht); + radsort(script.programs, script.program_count, t_dbg_script_program_is_before); + } + + scratch_end(scratch); + return script; +} + +internal B32 +t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) +{ + Temp scratch = scratch_begin(0,0); + + B32 is_ok = 0; + + for EachIndex(i, script->program_count) { + T_DbgScriptProgram *program = script->programs[i]; + + if (program->os == OperatingSystem_CURRENT) { + for EachNode(cmd, T_DbgScriptCmd, program->first) { + switch (cmd->kind) { + case T_DbgScriptCmdKind_Null: break; + case T_DbgScriptCmdKind_Halt: t_dbg_send_cmd_and_wait_stop(str8_lit("halt"), timeout_us); break; // NOTE: does not auto-magically select main thread on stop + case T_DbgScriptCmdKind_StepOver: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over"), timeout_us); break; + case T_DbgScriptCmdKind_StepInto: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into"), timeout_us); break; + case T_DbgScriptCmdKind_StepOut: t_dbg_send_cmd_and_wait_stop(str8_lit("step_out"), timeout_us); break; + case T_DbgScriptCmdKind_StepOverInst: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over_inst"), timeout_us); break; + case T_DbgScriptCmdKind_StepIntoInst: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into_inst"), timeout_us); break; + case T_DbgScriptCmdKind_StepOverLine: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over_line"), timeout_us); break; + case T_DbgScriptCmdKind_StepIntoLine: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into_line"), timeout_us); break; + case T_DbgScriptCmdKind_KillAll: t_dbg_send_cmd_and_wait_stop(str8_lit("kill_all"), timeout_us); break; + case T_DbgScriptCmdKind_Breakpoint: NotImplemented; break; + case T_DbgScriptCmdKind_ClearBreakpoints: t_dbg_send_cmdf(0,0,0, "clear_breakpoints"); break; + case T_DbgScriptCmdKind_Run: t_dbg_send_cmd(str8_lit("run"), timeout_us, 0, 0); break; + case T_DbgScriptCmdKind_At: { + // map IP -> source location + U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); + T_DbgSourceLocation loc = {0}; + AssertAlways(t_dbg_src_line(scratch.arena, ip, &loc, TIMEOUT_SEC(5))); + + // compute line where debugger must be + S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta; + U64 at_line_u64 = at_line_s64 >= 0 ? (U64)at_line_s64 : 0; + AssertAlways(at_line_u64 > 0); + + // match expected vs current debugger locations + B32 mismatch = loc.pt.line != at_line_u64 || + !str8_match(loc.file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); + if (mismatch) { + fprintf(stderr, "ERROR: location check did not pass:\n"); + fprintf(stderr, " Script : %.*s\n", str8_varg(script->file_path)); + fprintf(stderr, " Expected: %.*s:%llu\n", str8_varg(program->file->path), at_line_u64); + fprintf(stderr, " Got : %.*s:%llu\n", str8_varg(loc.file_path), loc.pt.line); + goto exit; + } + } break; + case T_DbgScriptCmdKind_Eval: NotImplemented; break; + default: { InvalidPath; } + } + } + } + + is_ok = (i+1 == script->program_count); + } + + exit:; + scratch_end(scratch); + return is_ok; +} + +internal +T_RunSig(dbg_script_runner) +{ + t_kill_all(str8_lit("*raddbg*")); + + // read source file + String8 source = os_data_from_file_path(arena, user_data); + T_Ok(source.size != 0); + + // source -> script + T_DbgScript script = t_dbg_script_from_source(arena, user_data, source); + + // write source files to test folder + for EachNode(file, T_DbgScriptFile, script.files.first) { T_Ok(os_write_data_to_file_path(file->path, file->source)); } + + String8 compiler_path = t_cl_path(); + String8 linker_path = t_radlink_path(); + + // run compilers + for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Compile].first) { + T_Ok(t_invoke(compiler_path, directive->args, max_U64)); + } + + // run linkers + for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Link].first) { + T_Ok(t_invoke(linker_path, directive->args, max_U64)); + } + + // launch targets + for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Launch].first) { + String8 cmdl = str8f(arena, "--user:%S.raddbg_user %S ", t_make_file_path(arena, str8_lit("temp")), directive->args); + T_Ok(t_dbg_launch(cmdl, ENDT_SEC(10))); + } + + // debugger is ready, now call script + t_dbg_script_invoke(&script, ENDT_SEC(60*3)); + + // clean up + os_process_kill(g_dbg_handle); +} + +internal void +t_dbg_register_script_tests(Arena *arena, String8 folder_path) +{ + Temp scratch = scratch_begin(&arena, 1); + AssertAlways(os_folder_path_exists(folder_path)); + + // gather file paths in a folder + String8List paths = t_file_paths_from_dir(arena, folder_path); + + // register a test for each file + for EachNode(n, String8Node, paths.first) { + String8 file_path = n->string; + + // test files may contain dots for extensions we have to escape them when creating output folder for a test + String8List file_name_parts = str8_split(scratch.arena, str8_skip_last_slash(file_path), ".", 1, 0); + String8 file_name_escaped = str8_list_join(arena, &file_name_parts, &(StringJoin){.sep=str8_lit("-"), .post = str8_lit("\0") }); + + g_torture_tests[g_torture_test_count++] = (T_Test){ + .group = T_Group, + .label = file_name_escaped.str, + .r = t_dbg_script_runner, + .user_data = str8_copy(arena, file_path), + }; + } + + scratch_end(scratch); +} + +#undef T_Group diff --git a/src/torture/torture_dbg.h b/src/torture/torture_dbg.h new file mode 100644 index 00000000..ab5fd0ad --- /dev/null +++ b/src/torture/torture_dbg.h @@ -0,0 +1,176 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#pragma once + +//////////////////////////////// +// Dbg Script + +typedef struct T_DbgScriptFile +{ + struct T_DbgScriptFile *next; + String8 path; + String8 source; + U64 line; +} T_DbgScriptFile; + +typedef struct +{ + U64 count; + T_DbgScriptFile *first; + T_DbgScriptFile *last; +} T_DbgScriptFileList; + +typedef enum +{ + T_DbgScriptCmdKind_Null, + T_DbgScriptCmdKind_Breakpoint, + T_DbgScriptCmdKind_ClearBreakpoints, + T_DbgScriptCmdKind_Run, + T_DbgScriptCmdKind_Halt, + T_DbgScriptCmdKind_StepOver, + T_DbgScriptCmdKind_StepInto, + T_DbgScriptCmdKind_StepOut, + T_DbgScriptCmdKind_StepOverInst, + T_DbgScriptCmdKind_StepIntoInst, + T_DbgScriptCmdKind_StepOverLine, + T_DbgScriptCmdKind_StepIntoLine, + T_DbgScriptCmdKind_KillAll, + T_DbgScriptCmdKind_At, + T_DbgScriptCmdKind_Eval, +} T_DbgScriptCmdKind; + +typedef struct T_DbgScriptCmd +{ + struct T_DbgScriptCmd *next; + T_DbgScriptCmdKind kind; + U64 line; + union { + struct { + S64 delta; + } at; + }; +} T_DbgScriptCmd; + +typedef struct T_DbgScriptProgram +{ + U64 line; + U64 order; + OperatingSystem os; + T_DbgScriptFile *file; + U64 count; + T_DbgScriptCmd *first; + T_DbgScriptCmd *last; + struct T_DbgScriptProgram *next; +} T_DbgScriptProgram; + +typedef struct +{ + U64 count; + T_DbgScriptProgram *first; + T_DbgScriptProgram *last; +} T_DbgScriptProgramList; + +typedef enum +{ + T_DbgScriptDirectiveKind_Null, + T_DbgScriptDirectiveKind_Compile, + T_DbgScriptDirectiveKind_Link, + T_DbgScriptDirectiveKind_Launch, + T_DbgScriptDirectiveKind_Count, +} T_DbgScriptDirectiveKind; + +typedef struct T_DbgScriptDirective +{ + struct T_DbgScriptDirective *next; + T_DbgScriptDirectiveKind kind; + U64 line; + String8 args; +} T_DbgScriptDirective; + +typedef struct +{ + U64 count; + T_DbgScriptDirective *first; + T_DbgScriptDirective *last; +} T_DbgScriptDirectiveList; + +typedef struct +{ + String8 file_path; + T_DbgScriptDirectiveList directives[OperatingSystem_COUNT][T_DbgScriptDirectiveKind_Count]; + T_DbgScriptFileList files; + U64 program_count; + T_DbgScriptProgram **programs; +} T_DbgScript; + +//////////////////////////////// +// IPC Controller + +typedef struct +{ + B32 running; + U64 run_gen; +} T_DbgStatus; + +typedef struct +{ + U64 vaddr; + U64 voff; + String8 file_path; + TxtPt pt; + Rng1U64 voff_range; +} T_DbgSourceLocation; + +typedef struct +{ + Arch arch; + U64 vaddr_min; + U64 vaddr_max; + U64 ip_vaddr; + U64 sp_base; + U64 tls_root; + U64 tls_index; + U64 tls_offset; + U64 timestamp; + U64 exception_code; + U64 bp_flags; + String8 string; + OperatingSystem target_os; + U64 tls_model; + String8 stop_cause; +} T_DbgStopEvent; + +typedef struct +{ + String8 expr; + String8 value; + String8 type; + String8 error; +} T_Eval; + +//////////////////////////////// +// Dbg Script + +internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path); +internal B32 t_dbg_run_script(Arena *arena, T_DbgScript *script, U64 timeout_us); + +//////////////////////////////// +// Dbg Tester + +internal B32 t_dbg_ping (U64 timeout_us); +internal B32 t_dbg_run (U64 timeout_us); +internal B32 t_dbg_kill_all (U64 timeout_us); +internal B32 t_dbg_halt (U64 timeout_us); +internal B32 t_dbg_step_over (U64 timeout_us); +internal B32 t_dbg_step_into (U64 timeout_us); +internal B32 t_dbg_step_out (U64 timeout_us); +internal B32 t_dbg_step_over_inst(U64 timeout_us); +internal B32 t_dbg_step_into_inst(U64 timeout_us); +internal B32 t_dbg_step_over_line(U64 timeout_us); +internal B32 t_dbg_step_into_line(U64 timeout_us); +internal B32 t_dbg_launch(String8 cmdline, U64 timeout_us); +internal B32 t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out); +// TODO: need a source location query in eval +internal B32 t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgSourceLocation *loc_out, U64 timeout_us); + diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index a8ce3ee6..4017869d 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -94,6 +94,7 @@ #include "linker/lnk_debug_helper.h" #include "torture.h" #include "torture_radlink.h" +#include "torture_dbg.h" #include "base/base_inc.c" #include "x64/x64.c" @@ -172,6 +173,7 @@ #include "torture_d2r.c" #include "torture_p2r.c" #include "torture_eval.c" +#include "torture_dbg.c" internal B32 frame(void) { return 0; } From 887ee21d940da7d3794824a5e409b1d8ddb1ba93 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 27 Apr 2026 18:24:41 -0700 Subject: [PATCH 577/850] print out last captured output when a test fails or crashes --- src/raddbg/raddbg_core.c | 154 ++++++++++++++-------------- src/torture/torture.c | 182 ++++++++++++++++++++-------------- src/torture/torture.h | 10 +- src/torture/torture_d2r.c | 8 +- src/torture/torture_dbg.c | 25 +++-- src/torture/torture_radlink.c | 75 ++++++-------- src/torture/torture_radlink.h | 5 - 7 files changed, 245 insertions(+), 214 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 60b25d9c..0fa56b46 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10479,9 +10479,9 @@ rd_ipc_make_reply_stop_event(Arena *arena) return result; } -internal String8 -rd_ipc_make_reply_eval(Arena *arena, String8 expr, E_Eval eval, U64 cap) -{ +internal String8 +rd_ipc_make_reply_eval(Arena *arena, String8 expr, E_Eval eval, U64 cap) +{ Temp scratch = scratch_begin(&arena, 1); // gather value & type @@ -10510,62 +10510,62 @@ rd_ipc_make_reply_eval(Arena *arena, String8 expr, E_Eval eval, U64 cap) String8 result = str8_list_join(arena, &reply, 0); scratch_end(scratch); - return result; -} - -internal String8 -rd_ipc_make_reply_source_location_from_address(Arena *arena, U64 vaddr) -{ - Temp scratch = scratch_begin(&arena, 1); - - D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->process); - if(process == &d_entity_nil) - { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); - process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - } - - D_Entity *module = &d_entity_nil; - DI_Key dbgi_key = {0}; - U64 voff = 0; - D_LineList lines = {0}; - if(process != &d_entity_nil) - { - module = d_module_from_process_vaddr(process, vaddr); - if(module != &d_entity_nil) - { - dbgi_key = d_dbgi_key_from_module(module); - voff = d_voff_from_vaddr(module, vaddr); - lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); - } - } - D_Line line = {0}; - if(lines.first != 0) - { - line = lines.first->v; - } - - B32 is_ok = (process != &d_entity_nil && module != &d_entity_nil && lines.first != 0); - - String8List reply = {0}; - rd_ipc_reply_block_begin(arena, &reply, "source_location_from_address"); - rd_ipc_reply_push_b32 (arena, &reply, "ok", is_ok); - rd_ipc_reply_push_u64 (arena, &reply, "vaddr", vaddr); - rd_ipc_reply_push_u64 (arena, &reply, "voff", voff); - rd_ipc_reply_push_str8(arena, &reply, "file_path", line.file_path); - rd_ipc_reply_push_u64 (arena, &reply, "line", line.pt.line); - rd_ipc_reply_push_u64 (arena, &reply, "column", line.pt.column); - rd_ipc_reply_push_u64 (arena, &reply, "voff_min", line.voff_range.min); - rd_ipc_reply_push_u64 (arena, &reply, "voff_max", line.voff_range.max); - rd_ipc_reply_block_end(arena, &reply); - String8 result = str8_list_join(arena, &reply, 0); - - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Main Layer Top-Level Calls + return result; +} + +internal String8 +rd_ipc_make_reply_source_location_from_address(Arena *arena, U64 vaddr) +{ + Temp scratch = scratch_begin(&arena, 1); + + D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->process); + if(process == &d_entity_nil) + { + D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + } + + D_Entity *module = &d_entity_nil; + DI_Key dbgi_key = {0}; + U64 voff = 0; + D_LineList lines = {0}; + if(process != &d_entity_nil) + { + module = d_module_from_process_vaddr(process, vaddr); + if(module != &d_entity_nil) + { + dbgi_key = d_dbgi_key_from_module(module); + voff = d_voff_from_vaddr(module, vaddr); + lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); + } + } + D_Line line = {0}; + if(lines.first != 0) + { + line = lines.first->v; + } + + B32 is_ok = (process != &d_entity_nil && module != &d_entity_nil && lines.first != 0); + + String8List reply = {0}; + rd_ipc_reply_block_begin(arena, &reply, "source_location_from_address"); + rd_ipc_reply_push_b32 (arena, &reply, "ok", is_ok); + rd_ipc_reply_push_u64 (arena, &reply, "vaddr", vaddr); + rd_ipc_reply_push_u64 (arena, &reply, "voff", voff); + rd_ipc_reply_push_str8(arena, &reply, "file_path", line.file_path); + rd_ipc_reply_push_u64 (arena, &reply, "line", line.pt.line); + rd_ipc_reply_push_u64 (arena, &reply, "column", line.pt.column); + rd_ipc_reply_push_u64 (arena, &reply, "voff_min", line.voff_range.min); + rd_ipc_reply_push_u64 (arena, &reply, "voff_max", line.voff_range.max); + rd_ipc_reply_block_end(arena, &reply); + String8 result = str8_list_join(arena, &reply, 0); + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Main Layer Top-Level Calls #if !defined(STBI_INCLUDE_STB_IMAGE_H) # define STB_IMAGE_IMPLEMENTATION @@ -12906,24 +12906,24 @@ rd_frame(void) rd_cmd(RD_CmdKind_StepIntoLine); str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_into_line"), 1)); } - else if(str8_match(cmd_kind_name, str8_lit("eval"), 0)) - { - U64 cap_end = str8_find_needle(cmd_args, 0, str8_lit(" "), 0); - String8 cap_str = str8_substr(cmd_args, r1u64(0, cap_end)); - U64 cap = 0; - try_u64_from_str8_c_rules(cap_str, &cap); - String8 expr = str8_skip(cmd_args, cap_str.size); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_eval(rd_state->cmd_output_arena, expr, e_eval_from_string(expr), cap)); - } - else if(str8_match(cmd_kind_name, str8_lit("source_location_from_address"), 0)) - { - String8 vaddr_str = str8_skip_chop_whitespace(cmd_args); - U64 vaddr = 0; - try_u64_from_str8_c_rules(vaddr_str, &vaddr); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_source_location_from_address(rd_state->cmd_output_arena, vaddr)); - } - else if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope() - { + else if(str8_match(cmd_kind_name, str8_lit("eval"), 0)) + { + U64 cap_end = str8_find_needle(cmd_args, 0, str8_lit(" "), 0); + String8 cap_str = str8_substr(cmd_args, r1u64(0, cap_end)); + U64 cap = 0; + try_u64_from_str8_c_rules(cap_str, &cap); + String8 expr = str8_skip(cmd_args, cap_str.size); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_eval(rd_state->cmd_output_arena, expr, e_eval_from_string(expr), cap)); + } + else if(str8_match(cmd_kind_name, str8_lit("source_location_from_address"), 0)) + { + String8 vaddr_str = str8_skip_chop_whitespace(cmd_args); + U64 vaddr = 0; + try_u64_from_str8_c_rules(vaddr_str, &vaddr); + str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_source_location_from_address(rd_state->cmd_output_arena, vaddr)); + } + else if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope() + { for EachNonZeroEnumVal(RD_RegSlot, s) { String8 reg_slot_name = rd_reg_slot_code_name_table[s]; diff --git a/src/torture/torture.c b/src/torture/torture.c index aa6b79ee..f218c0a8 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -2,21 +2,23 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) // command line -global String8 g_stdout_file_name = str8_lit_comp("torture.out"); -global String8 g_wdir; -global String8 g_out = str8_lit_comp("torture"); -global B32 g_verbose; -global B32 g_redirect_stdout = 1; -global B32 g_stop_on_first_fail_or_crash = 1; -global String8 g_linker; -global String8 g_test_data; +global String8 g_stdout_file_name = str8_lit_comp("torture.out"); +global String8 g_wdir; +global String8 g_out = str8_lit_comp("torture"); +global B32 g_verbose; +global B32 g_redirect_stdout = 1; +global B32 g_stop_on_first_fail_or_crash = 1; +global String8 g_linker; +global String8 g_test_data; // tests U64 g_torture_test_count; T_Test g_torture_tests[0xffffff]; // invoke -global int g_last_exit_code; +global int g_last_exit_code; +global Arena *g_output_arena; +global String8 g_output; internal String8 t_test_name_from_idx(Arena *arena, U64 test_idx) @@ -180,6 +182,11 @@ t_run(T_Run run, String8 user_data) } else { t_run_caller(&ctx); } + + if (ctx.result.status == T_RunStatus_Fail || ctx.result.status == T_RunStatus_Crash) { + fprintf(stderr, "Last captured output:\n%.*s\n", str8_varg(g_output)); + } + return ctx.result; } @@ -228,27 +235,27 @@ t_cl_version(void) if ( ! version.size) { Temp scratch = scratch_begin(0, 0); - - String8 output = {0}; - t_invoke_(t_cl_path(), str8_zero(), max_U64, scratch.arena, &output); + + t_invoke_cl(""); AssertAlways(g_last_exit_code == 0); String8 needle = str8_lit("Version"); - U64 version_lo = str8_find_needle(output, 0, needle, 0); + U64 version_lo = str8_find_needle(g_output, 0, needle, 0); version_lo += needle.size + 1; - AssertAlways(version_lo < output.size); - - U64 version_hi = str8_find_needle(output, version_lo, str8_lit(" "), 0); - AssertAlways(version_hi < output.size); - - version = str8_substr(output, r1u64(version_lo, version_hi)); + AssertAlways(version_lo < g_output.size); + + U64 version_hi = str8_find_needle(g_output, version_lo, str8_lit(" "), 0); + AssertAlways(version_hi < g_output.size); + + version = str8_substr(g_output, r1u64(version_lo, version_hi)); AssertAlways(version.size > 0); local_persist U8 buffer[4096]; ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); version = str8_copy(arena, version); - + + MemoryZeroStruct(&g_output); scratch_end(scratch); } @@ -322,27 +329,27 @@ t_src_path(void) } internal B32 -t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout, Arena *output_arena, String8 *output_out) +t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout) { - Temp scratch = scratch_begin(&output_arena,1); - + Temp scratch = scratch_begin(&g_output_arena,1); + B32 is_ok = 0; - - B32 capture_output = output_out || g_redirect_stdout; - + + // clean up global state + arena_pop_to(g_output_arena, 0); + MemoryZeroStruct(&g_output); g_last_exit_code = -1; - + +#if OS_WINDOWS File read_pipe_handle = {0}, write_pipe_handle = {0}; - if (capture_output) { - HANDLE read_pipe, write_pipe; - SECURITY_ATTRIBUTES at = { .nLength = sizeof(at), .bInheritHandle = 1 }; - if (!CreatePipe(&read_pipe, &write_pipe, &at, 0)) { - AssertAlways(0 && "failed to create a pipe"); - } - read_pipe_handle = (File){ .u64[0] = (U64)read_pipe }; - write_pipe_handle = (File){ .u64[0] = (U64)write_pipe }; - } - + HANDLE read_pipe, write_pipe; + SECURITY_ATTRIBUTES at = { .nLength = sizeof(at), .bInheritHandle = 1 }; + if (!CreatePipe(&read_pipe, &write_pipe, &at, 0)) { AssertAlways(0 && "failed to create a pipe"); } + read_pipe_handle = (File){ .u64[0] = (U64)read_pipe }; + write_pipe_handle = (File){ .u64[0] = (U64)write_pipe }; +#else +# error NotImplemented +#endif // Build Launch Options ProcessLaunchParams launch_opts = { .path = g_wdir, @@ -362,54 +369,84 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout, Ar // invoke exe Process process_handle = process_launch(&launch_opts); + if (process_match(process_handle, process_zero())) { goto exit; } // close handle so last to ReadFile does not block file_close(write_pipe_handle); - if ( ! process_match(process_handle, process_zero())) { - if (capture_output) { - // capture process output - String8List output = {0}; - for (;;) { - String8 string = file_read_cstring(scratch.arena, read_pipe_handle, 0); - if (string.size == 0) { break; } - str8_list_push(scratch.arena, &output, string); - } - file_close(read_pipe_handle); - - if (output_out) { - *output_out = str8_list_join(output_arena, &output, 0); - } - - // write to the output file - if (g_redirect_stdout) { - write_data_list_to_file_path(g_stdout_file_name, output); - } - } - - U64 exit_code_u64 = 0; - if (process_join(process_handle, timeout, &exit_code_u64)) { - g_last_exit_code = (int)exit_code_u64; - is_ok = 1; - } else { - process_kill(process_handle); - } + // capture process output + String8List output = {0}; + for (;;) { + String8 string = file_read_cstring(scratch.arena, read_pipe_handle, 0); + if (string.size == 0) { break; } + str8_list_push(scratch.arena, &output, string); + } + file_close(read_pipe_handle); + + // update output global + g_output = str8_list_join(g_output_arena, &output, 0); + + // write to the output file + if (g_redirect_stdout) { + write_data_list_to_file_path(g_stdout_file_name, output); + } + + U64 exit_code_u64 = 0; + if (process_join(process_handle, timeout, &exit_code_u64)) { + g_last_exit_code = (int)exit_code_u64; + is_ok = 1; + } else { + process_kill(process_handle); } + exit:; scratch_end(scratch); return is_ok; } internal B32 -t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, String8 *output_out) +t_invoke(String8 exe_path, String8 cmdline, U64 timeout) { - return t_invoke_env(exe_path, cmdline, (String8List){0}, timeout, output_arena, output_out); + return t_invoke_env(exe_path, cmdline, (String8List){0}, timeout); } internal B32 -t_invoke(String8 exe_path, String8 cmdline, U64 timeout) +t_invoke_cl(char *fmt, ...) { - return t_invoke_(exe_path, cmdline, timeout, 0, 0); + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 cmdl = push_str8fv(scratch.arena, fmt, args); + va_end(args); + B32 is_ok = t_invoke(t_cl_path(), cmdl, max_U64); + scratch_end(scratch); + return is_ok; +} + +internal B32 +t_invoke_linkerf(char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 cmdl = push_str8fv(scratch.arena, fmt, args); + va_end(args); + B32 is_ok = t_invoke(t_radlink_path(), cmdl, max_U64); + scratch_end(scratch); + return is_ok; +} + +internal B32 +t_invoke_radbin(char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 cmdl = push_str8fv(scratch.arena, fmt, args); + va_end(args); + B32 is_ok = t_invoke(t_radbin_path(), cmdl, max_U64); + scratch_end(scratch); + return is_ok; } internal void @@ -422,10 +459,10 @@ t_kill_all(String8 pattern) while (dmn_process_iter_next(scratch.arena, &it, &info)) { if (str8_match_wildcard(info.name, pattern, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive)) { #if OS_WINDOWS - if (!t_invoke_(str8_lit("taskkill"), str8f(scratch.arena, "/PID %u /F", info.pid), max_U64, 0, 0)) { fprintf(stderr, "ERROR: failed to invoke taskkill\n"); } + if (!t_invoke(str8_lit("taskkill"), str8f(scratch.arena, "/PID %u /F", info.pid), max_U64)) { fprintf(stderr, "ERROR: failed to invoke taskkill\n"); } #elif OS_LINUX NotImplemented; // TODO: test - if (!t_invoke_(str8_lit("kill"), str8f(scratch.arena, " -9 %u", info.pid), max_U64, 0, 0)) { fprintf(stderr, "ERROR: failed to invoke kill\n"); } + if (!t_invoke(str8_lit("kill"), str8f(scratch.arena, " -9 %u", info.pid), max_U64)) { fprintf(stderr, "ERROR: failed to invoke kill\n"); } #else # error NotImplemented #endif @@ -703,7 +740,8 @@ t_entry_point(CmdLine *cmdline) g_verbose = cmd_line_has_flag(cmdline, str8_lit("verbose")); g_redirect_stdout = !cmd_line_has_flag(cmdline, str8_lit("print_stdout")); g_stop_on_first_fail_or_crash = !cmd_line_has_flag(cmdline, str8_lit("keep_going")); - + g_output_arena = arena_alloc(); + // default options when running under debugger #if OS_WINDOWS if (!cmd_line_has_flag(cmdline, str8_lit("print_stdout")) && IsDebuggerPresent()) { diff --git a/src/torture/torture.h b/src/torture/torture.h index f4742a2e..140ab95f 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -90,7 +90,13 @@ internal String8 t_radlink_path(void); internal String8 t_cwd_path(void); internal String8 t_src_path(void); -internal B32 t_invoke_(String8 exe_path, String8 cmdline, U64 timeout, Arena *output_arena, String8 *output_out); internal B32 t_invoke(String8 exe, String8 cmdline, U64 timeout); -#define t_invoke_cl(f, ...) t_invoke_(t_cl_path(), str8f(scratch.arena, f, ## __VA_ARGS__), max_U64, 0, 0) +internal B32 t_invoke_cl(char *fmt, ...); +internal B32 t_invoke_linkerf(char *fmt, ...); +internal B32 t_invoke_radbin(char *fmt, ...); internal void t_kill_all(String8 pattern); + +#define t_invoke_linker_timeout(c, t) T_Ok(t_invoke(g_linker, c, t)) +#define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(arena, f, ##__VA_ARGS__), t) +#define t_invoke_linker(c) t_invoke_linker_timeout(c, max_U64) + diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 7006a8b0..98b23d9f 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -32,7 +32,7 @@ d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) B32 was_pdb_deleted = delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); Assert(was_pdb_deleted); - t_invoke_(t_radbin_path(), str8_lit("-rdi a.exe -out:a.rdi"), max_U64, 0, 0); + t_invoke(t_radbin_path(), str8_lit("-rdi a.exe -out:a.rdi"), max_U64); Assert(g_last_exit_code == 0); String8 raw_rdi = t_read_file(arena, str8_lit("a.rdi")); @@ -275,11 +275,9 @@ TEST(d2r_line_table) for EachElement(i, test_table) { for EachIndex(k, test_table[i].line_size) { - String8 cmd_line = str8f(arena, "-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); - String8 output = {0}; - t_invoke_(t_radbin_path(), cmd_line, max_U64, arena, &output); + t_invoke_radbin("-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); T_Ok(g_last_exit_code == 0); - T_MatchLinef(&output, "%S:%llu", test_table[i].file->path, test_table[i].ln); + T_MatchLinef(&g_output, "%S:%llu", test_table[i].file->path, test_table[i].ln); } } diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index c081dd5a..c3cbd477 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -33,10 +33,8 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep #endif // send command - String8 cmdline = str8f(scratch.arena, "--ipc --pid:%u %S", dbg_pid, cmd); - Arena *output_arena = reply_arena ? reply_arena : scratch.arena; - String8 output = {0}; - if (t_invoke_(t_raddbg_path(), cmdline, timeout_us, output_arena, &output) == 0) { goto exit; } + String8 cmdline = str8f(scratch.arena, "--ipc --pid:%u %S", dbg_pid, cmd); + if (t_invoke(t_raddbg_path(), cmdline, timeout_us) == 0) { goto exit; } B32 has_reply = 1; @@ -55,7 +53,9 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep if (has_reply) { // parse reply - RD_IpcReply reply = rd_ipc_mdesk_reply_from_string(output_arena, output); + Arena *a = reply_arena ? reply_arena : scratch.arena; + String8 reply_text = str8_copy(a, g_output); + RD_IpcReply reply = rd_ipc_mdesk_reply_from_string(a, reply_text); if (rd_ipc_reply_is_ok(&reply) == 0) { goto exit; } if (md_node_is_nil(reply.msg)) { goto exit; } if (reply_arena && reply_out) { *reply_out = reply; } @@ -111,7 +111,7 @@ t_dbg_stop_event(Arena *arena, T_DbgStopEvent *out, U64 timeout_us) // send status request RD_IpcReply reply = {0}; - if ( ! t_dbg_send_cmd(str8_lit("stop_event"), timeout_us, scratch.arena, &reply)) { goto exit; } + if ( ! t_dbg_send_cmd(str8_lit("stop_event"), timeout_us, arena ? arena : scratch.arena, &reply)) { goto exit; } // parse reply if ( ! rd_ipc_parse_b32 (reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } @@ -131,7 +131,7 @@ t_dbg_stop_event(Arena *arena, T_DbgStopEvent *out, U64 timeout_us) if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_model"), &v.tls_model)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_string (reply.msg, str8_lit("stop_cause"), &v.stop_cause)) { AssertAlways(0); goto exit; } - if (out != 0) { *out = v; } + if (arena && out != 0) { *out = v; } exit:; return is_ok; @@ -223,7 +223,7 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) } while (t > 0); //--- Status --------------------- - if (is_stopped) { + if (0 && is_stopped) { T_DbgStatus status = {0}; AssertAlways(t_dbg_status(&status, 0)); @@ -271,8 +271,9 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) Temp scratch = scratch_begin(0, 0); B32 dbg_ready = 0; - String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user")); - cmdline = str8f(scratch.arena, "--user:\"%S\" %S", user_path, cmdline); + String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user")); + String8 project_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_project")); + cmdline = str8f(scratch.arena, "--user:\"%S\" --project:\"%S\" %S", user_path, project_path, cmdline); // launch debugger OS_ProcessLaunchParams launch_opts = { @@ -585,6 +586,10 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) case T_DbgScriptCmdKind_ClearBreakpoints: t_dbg_send_cmdf(0,0,0, "clear_breakpoints"); break; case T_DbgScriptCmdKind_Run: t_dbg_send_cmd(str8_lit("run"), timeout_us, 0, 0); break; case T_DbgScriptCmdKind_At: { + T_DbgStatus status = {0}; + AssertAlways(t_dbg_status(&status, 0)); + AssertAlways(status.running == 0); + // map IP -> source location U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); T_DbgSourceLocation loc = {0}; diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index f19db27b..e21192ef 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -5011,14 +5011,15 @@ TEST(debug_p_sig_mismatch) T_Ok(t_write_file(str8_lit("b.obj"), b_obj)); T_Ok(t_write_entry_obj()); - String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full a.obj b.obj entry.obj"), max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full a.obj b.obj entry.obj"); T_Ok(g_last_exit_code == 0); B32 found_error = 0; String8 a_obj_path = t_make_file_path(arena, str8_lit("a.obj")); String8 b_obj_path = t_make_file_path(arena, str8_lit("b.obj")); String8 expected_line = str8f(arena, "Error(%03d): %S: PCH signature mismatch, expected 0x%x got 0x%x; PCH obj %S", LNK_Error_PrecompSigMismatch, b_obj_path, b_sig, a_sig, a_obj_path); + + String8 output = g_output; while (output.size) { String8 line = t_chop_line(&output); found_error = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive); @@ -5124,10 +5125,10 @@ TEST(debug_p_and_debug_t_in_obj) } })); T_Ok(t_write_entry_obj()); - String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full pch.obj entry.obj"), max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full pch.obj entry.obj"); T_Ok(g_last_exit_code == 0); + String8 output = g_output; B32 found_warning = 0; String8 pch_obj_path = t_make_file_path(arena, str8_lit("pch.obj")); String8 expected_line = str8f(arena, "Warning(%03d): %S: multiple sections with debug types detected, obj must have either .debug$T or .debug$P; discarding both sections", LNK_Warning_MultipleDebugTAndDebugP, pch_obj_path); @@ -5531,12 +5532,11 @@ TEST(cyclic_type) T_Ok(t_write_entry_obj()); T_Ok(t_write_file(str8_lit("cycle.obj"), raw_coff)); - String8 cmd_line = str8f(arena, "/subsystem:console /entry:entry /out:a.exe /debug:full /rad_ignore:-%u cycle.obj entry.obj", LNK_Error_InvalidTypeIndex); - String8 output = {0}; - t_invoke_(t_radlink_path(), cmd_line, max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full /rad_ignore:-%u cycle.obj entry.obj", LNK_Error_InvalidTypeIndex); T_Ok(g_last_exit_code == 0); - B32 is_cycle_detected = 0; + String8 output = g_output; + B32 is_cycle_detected = 0; while (output.size && !is_cycle_detected) { is_cycle_detected = t_match_linef(&output, "Error(043): %S: LF_POINTER(type_index: 0x1000) forward refs member type index 0x1001 (leaf struct offset: 0x0)", @@ -6006,14 +6006,13 @@ TEST(ghash_check_corrupt) T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); - String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"); T_Ok(g_last_exit_code == 0); B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); String8 expected_line = str8f(arena, "Warning(%03u): %S: .debug$H section is too small to contain the header", LNK_Warning_GHash, debug_obj_path, LLVM_GHash_Magic); - for (String8 i = output; i.size > 0 && !is_warning_found; ) { + for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6056,14 +6055,13 @@ TEST(ghash_check_magic) T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); - String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"); T_Ok(g_last_exit_code == 0); B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); String8 expected_line = str8f(arena, "Warning(%03u): %S: .debug$H contains invalid magic: got 0x7b, expected 0x%x", LNK_Warning_GHash, debug_obj_path, LLVM_GHash_Magic); - for (String8 i = output; i.size > 0 && !is_warning_found; ) { + for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6106,14 +6104,13 @@ TEST(ghash_check_version) T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); - String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"); T_Ok(g_last_exit_code == 0); B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H version: got %u, expected %u", LNK_Warning_GHash, debug_obj_path, 0xbeef, LLVM_GHash_CurrentVersion); - for (String8 i = output; i.size > 0 && !is_warning_found; ) { + for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6148,14 +6145,13 @@ TEST(ghash_check_hash_alg) T_Ok(t_write_file(str8_lit("debug.obj"), debug_obj)); T_Ok(t_write_entry_obj()); - String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"); T_Ok(g_last_exit_code == 0); - B32 is_warning_found = 0; - String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); - String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash algorithm: got SHA1_8, expected BALK3", LNK_Warning_GHash, debug_obj_path); - for (String8 i = output; i.size > 0 && !is_warning_found; ) { + B32 is_warning_found = 0; + String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); + String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash algorithm: got SHA1_8, expected BALK3", LNK_Warning_GHash, debug_obj_path); + for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6191,13 +6187,13 @@ TEST(ghash_match_debug_t) T_Ok(t_write_entry_obj()); String8 output = {0}; - t_invoke_(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"), max_U64, arena, &output); + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:ghash entry.obj debug.obj"); T_Ok(g_last_exit_code == 0); - B32 is_warning_found = 0; - String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); - String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash count and type count: got 3 hashes for 2 types", LNK_Warning_GHash, debug_obj_path); - for (String8 i = output; i.size > 0 && !is_warning_found; ) { + B32 is_warning_found = 0; + String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); + String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash count and type count: got 3 hashes for 2 types", LNK_Warning_GHash, debug_obj_path); + for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6426,18 +6422,17 @@ t_radlink_validate_asan_out(String8 obj_name) Temp scratch = scratch_begin(0,0); B32 is_ok = 0; - t_invoke_(t_radlink_path(), str8f(scratch.arena, "%S /debug:full", obj_name), max_U64, 0, 0); + t_invoke_linkerf("%S /debug:full", obj_name); if (g_last_exit_code != 0) { goto exit; } String8 exe_path = t_make_file_path(scratch.arena, str8f(scratch.arena, "%S.exe", str8_chop_last_dot(obj_name))); - String8 out = {0}; char *old_path_cstr = getenv("PATH"); String8List env = {0}; str8_list_pushf(scratch.arena, &env, "PATH=%S;%S", str8_chop_last_slash(t_cl_path()), str8_cstring(old_path_cstr)); - t_invoke_env(exe_path, str8_zero(), env, max_U64, scratch.arena, &out); + t_invoke_env(exe_path, str8_zero(), env, max_U64); - String8 s = out; + String8 s = g_output; String8 header = t_chop_line(&s); if ( ! str8_match(header, str8_lit("================================================================="), 0)) { @@ -6469,8 +6464,7 @@ TEST(infer_asan) // /MD { T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); - String8 cl_output = {0}; - t_invoke_(t_cl_path(), str8_lit("/MD /fsanitize=address /Z7 /c /Fo:main_md.obj main.c"), max_U64, arena, &cl_output); + t_invoke_cl("/MD /fsanitize=address /Z7 /c /Fo:main_md.obj main.c"); T_Ok(g_last_exit_code == 0); T_Ok(t_radlink_validate_asan_out(str8_lit("main_md.obj"))); } @@ -6478,8 +6472,7 @@ TEST(infer_asan) // /MDd { T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); - String8 cl_output = {0}; - t_invoke_(t_cl_path(), str8_lit("/MDd /fsanitize=address /Z7 /c /Fo:main_mdd.obj main.c"), max_U64, arena, &cl_output); + t_invoke_cl("/MDd /fsanitize=address /Z7 /c /Fo:main_mdd.obj main.c"); T_Ok(g_last_exit_code == 0); T_Ok(t_radlink_validate_asan_out(str8_lit("main_mdd.obj"))); } @@ -6487,8 +6480,7 @@ TEST(infer_asan) // /MT { T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); - String8 cl_output = {0}; - t_invoke_(t_cl_path(), str8_lit("/MT /fsanitize=address /Z7 /c /Fo:main_mt.obj main.c"), max_U64, arena, &cl_output); + t_invoke_cl("/MT /fsanitize=address /Z7 /c /Fo:main_mt.obj main.c"); T_Ok(g_last_exit_code == 0); T_Ok(t_radlink_validate_asan_out(str8_lit("main_mt.obj"))); } @@ -6496,8 +6488,7 @@ TEST(infer_asan) // /MTd { T_Ok(t_write_file(str8_lit("main.c"), str8_cstring(program))); - String8 cl_output = {0}; - t_invoke_(t_cl_path(), str8_lit("/MT /fsanitize=address /Z7 /c /Fo:main_mtd.obj main.c"), max_U64, arena, &cl_output); + t_invoke_cl("/MT /fsanitize=address /Z7 /c /Fo:main_mtd.obj main.c"); T_Ok(g_last_exit_code == 0); T_Ok(t_radlink_validate_asan_out(str8_lit("main_mtd.obj"))); } @@ -6509,9 +6500,7 @@ TEST(infer_asan) TEST(determ_test) { // compile the test target (torture) - String8 cl_line = str8f(arena, "/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); - String8 cl_out = {0}; - t_invoke_(t_cl_path(), cl_line, max_U64, arena, &cl_out); + t_invoke_cl("/fsanitize=address /c /Z7 /Fo:test.obj -I%S /Zc:preprocessor %S/torture/torture_main.c", t_src_path(), t_src_path()); T_Ok(g_last_exit_code == 0); U64 run_count = 25; diff --git a/src/torture/torture_radlink.h b/src/torture/torture_radlink.h index fcfd5820..53858548 100644 --- a/src/torture/torture_radlink.h +++ b/src/torture/torture_radlink.h @@ -22,11 +22,6 @@ typedef enum //////////////////////////////// -#define t_invoke_linker_timeout(c, t) T_Ok(t_invoke(g_linker, c, t)) -#define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(arena, f, ##__VA_ARGS__), t) -#define t_invoke_linker(c) t_invoke_linker_timeout(c, max_U64) -#define t_invoke_linkerf(f, ...) t_invoke_linker(push_str8f(arena, f, ##__VA_ARGS__)) - internal T_Linker t_id_linker(void); internal COFF_ObjSection * t_push_text_section(COFF_ObjWriter *obj_writer, String8 data); From 22353d3642f72c52795819ff5d22e80bd9795112 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 27 Apr 2026 18:24:59 -0700 Subject: [PATCH 578/850] build debugger without asan --- run_tests.bat | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/run_tests.bat b/run_tests.bat index 75e29493..c1271718 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -3,7 +3,7 @@ setlocal enabledelayedexpansion rem Make sure that your VS install does not have LLVM included otherwise this script will use VS clang -set TARGET_VALUES=raddbg radlink radbin mule_main mule_module torture +set TARGET_VALUES=radlink radbin mule_main mule_module torture set CC_VALUES=msvc clang set MODE_VALUES=debug release @@ -32,6 +32,8 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( ) else ( call build.bat meta asan %%c %%m %TARGET_VALUES% || exit /b 1 ) + rem raddbg dies under asan on statup + call build.bat meta %%c %%m raddbg || exit /b 1 pushd build torture %* || exit /b 1 From a6175fecf690e132fad0d3110e52317d0a561b36 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 27 Apr 2026 18:33:00 -0700 Subject: [PATCH 579/850] skip debugger tests (there is no way to launch debugger without window) --- run_tests.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_tests.bat b/run_tests.bat index c1271718..7719fd79 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -36,7 +36,7 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( call build.bat meta %%c %%m raddbg || exit /b 1 pushd build - torture %* || exit /b 1 + torture -s:Dbg* %* || exit /b 1 popd endlocal From f991a80c85f39d0bafdf641ee80ac8b7f97ee2aa Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 27 Apr 2026 19:47:35 -0700 Subject: [PATCH 580/850] remove safe call so crashes in github actions print out callstack --- src/torture/torture.c | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index f218c0a8..773fc4a4 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -158,35 +158,17 @@ t_run_caller(void *raw_ctx) scratch_end(scratch); } -internal void -t_run_fail_handler(void *raw_ctx) -{ - T_RunCtx *ctx = raw_ctx; - ctx->result.status = T_RunStatus_Crash; - fflush(stdout); - fflush(stderr); -} - internal T_RunResult t_run(T_Run run, String8 user_data) { - T_RunCtx ctx = { .run = run, .user_data = user_data }; - B32 do_safe_call = 1; -#if OS_WINDOWS - if (IsDebuggerPresent()) { - do_safe_call = 0; - } -#endif - if (do_safe_call) { - safe_call(t_run_caller, t_run_fail_handler, &ctx); - } else { - t_run_caller(&ctx); - } + T_RunCtx ctx = { .run = run, .user_data = user_data, .result.status = T_RunStatus_Fail }; + t_run_caller(&ctx); + fflush(stdout); + fflush(stderr); if (ctx.result.status == T_RunStatus_Fail || ctx.result.status == T_RunStatus_Crash) { fprintf(stderr, "Last captured output:\n%.*s\n", str8_varg(g_output)); } - return ctx.result; } From 210b6a212a94ff7ed386c3dbf78a646a3bd92f86 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Apr 2026 17:05:52 -0700 Subject: [PATCH 581/850] capture stderr and print out when test fails/crashes --- src/torture/torture.c | 263 ++++++++++++++++++++++++++++++++++++------ src/torture/torture.h | 10 ++ 2 files changed, 237 insertions(+), 36 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index 773fc4a4..fd92e756 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -16,9 +16,10 @@ U64 g_torture_test_count; T_Test g_torture_tests[0xffffff]; // invoke -global int g_last_exit_code; -global Arena *g_output_arena; -global String8 g_output; +global U64 g_last_exit_code; +global Arena *g_output_arena; +global String8 g_output; +global String8 g_errors; internal String8 t_test_name_from_idx(Arena *arena, U64 test_idx) @@ -150,10 +151,12 @@ t_run_caller(void *raw_ctx) String8List test_out = {0}; ctx->result.status = T_RunStatus_Pass; ctx->run(scratch.arena, ctx->user_data, &ctx->result, &test_out); - if (ctx->result.status == T_RunStatus_Fail) { + if (ctx->result.status == T_RunStatus_Fail || ctx->result.status == T_RunStatus_Crash) { for EachNode(n, String8Node, test_out.first) { fprintf(stderr, "%.*s", str8_varg(n->string)); } + fprintf(stderr, "STDERR:\n", str8_varg(g_errors)); + fprintf(stderr, "STDOUT:\n", str8_varg(g_output)); } scratch_end(scratch); } @@ -311,7 +314,7 @@ t_src_path(void) } internal B32 -t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout) +t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) { Temp scratch = scratch_begin(&g_output_arena,1); @@ -320,15 +323,61 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout) // clean up global state arena_pop_to(g_output_arena, 0); MemoryZeroStruct(&g_output); - g_last_exit_code = -1; + g_last_exit_code = max_U64; + + String8List stdout_parts = {0}; + String8List stderr_parts = {0}; + U64 stdout_idx = 0; + U64 stderr_idx = 1; #if OS_WINDOWS - File read_pipe_handle = {0}, write_pipe_handle = {0}; - HANDLE read_pipe, write_pipe; - SECURITY_ATTRIBUTES at = { .nLength = sizeof(at), .bInheritHandle = 1 }; - if (!CreatePipe(&read_pipe, &write_pipe, &at, 0)) { AssertAlways(0 && "failed to create a pipe"); } - read_pipe_handle = (File){ .u64[0] = (U64)read_pipe }; - write_pipe_handle = (File){ .u64[0] = (U64)write_pipe }; + typedef enum { + Win32CaptureState_Null, + Win32CaptureState_Pending, + Win32CaptureState_EOF, + } Win32CaptureState; + typedef struct { + HANDLE read_pipe_handle; + HANDLE write_pipe_handle; + HANDLE event; + OVERLAPPED overlapped; + U64 buffer_size; + U8 *buffer; + U64 wait_idx; + String8List *parts; + Win32CaptureState state; + } Win32Capture; + + Win32Capture captures_win32[2] = {0}; + for EachElement(i, captures_win32) { + // create read pipe + local_persist U64 pipe_counter; ins_atomic_u64_inc_eval(&pipe_counter); + String8 pipe_name = str8f(scratch.arena, "\\\\.\\pipe\\rad_torture_%u_%llu", GetCurrentProcessId(), pipe_counter); + String16 pipe_name16 = str16_from_8(scratch.arena, pipe_name); + SECURITY_ATTRIBUTES read_at = { .nLength = sizeof(read_at), .bInheritHandle = 0 }; + captures_win32[i].read_pipe_handle = CreateNamedPipeW(pipe_name16.str, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_WAIT, 1, MB(1), MB(1), 0, &read_at); + AssertAlways(captures_win32[i].read_pipe_handle != INVALID_HANDLE_VALUE); + + // create overlapped write file + SECURITY_ATTRIBUTES write_at = { .nLength = sizeof(write_at), .bInheritHandle = 1 }; + captures_win32[i].write_pipe_handle = CreateFileW(pipe_name16.str, GENERIC_WRITE, 0, &write_at, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + AssertAlways(captures_win32[i].write_pipe_handle != INVALID_HANDLE_VALUE); + + // create event for overlapped + captures_win32[i].event = CreateEventW(0, 1, 0, 0); + AssertAlways(captures_win32[i].event != NULL); + + // alloc capture buffer + captures_win32[i].buffer_size = MB(1); + captures_win32[i].buffer = push_array(scratch.arena, U8, captures_win32[i].buffer_size); + } + captures_win32[stdout_idx].parts = &stdout_parts; + captures_win32[stderr_idx].parts = &stderr_parts; + + File read_capture_handles [ArrayCount(captures_win32)] = {0}; + File write_capture_handles[ArrayCount(captures_win32)] = {0}; + for EachElement(i, captures_win32) { read_capture_handles[i] = (File){ (U64)captures_win32[i].read_pipe_handle }; } + for EachElement(i, captures_win32) { write_capture_handles[i] = (File){ (U64)captures_win32[i].write_pipe_handle }; } #else # error NotImplemented #endif @@ -337,51 +386,193 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout) .path = g_wdir, .inherit_env = 1, .env = env, - .stdout_file = write_pipe_handle, - .stderr_file = write_pipe_handle, + .stdout_file = write_capture_handles[stdout_idx], + .stderr_file = write_capture_handles[stderr_idx], .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), }; str8_list_push_front(scratch.arena, &launch_opts.cmd_line, exe_path); - + if (g_verbose) { String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(" ") }); fprintf(stdout, "Command Line: %.*s\n", str8_varg(full_cmd_line)); fprintf(stdout, "Working Dir: %.*s\n", str8_varg(g_wdir)); } - + // invoke exe Process process_handle = process_launch(&launch_opts); if (process_match(process_handle, process_zero())) { goto exit; } - - // close handle so last to ReadFile does not block - file_close(write_pipe_handle); - + // capture process output - String8List output = {0}; - for (;;) { - String8 string = file_read_cstring(scratch.arena, read_pipe_handle, 0); - if (string.size == 0) { break; } - str8_list_push(scratch.arena, &output, string); +#if OS_WINDOWS + { + // close handle so last to ReadFile does not block + for EachElement(i, captures_win32) { + CloseHandle(captures_win32[i].write_pipe_handle); + MemoryZeroStruct(&write_capture_handles[i]); + } + + B32 is_process_live = 1; + for (U64 endt_us = ENDT_US(timeout_us);;) { + HANDLE wait_handles[ArrayCount(captures_win32) + 1] = {0}; + U64 wait_handle_count = 0; + + // queue process + if (is_process_live) { + wait_handles[wait_handle_count++] = (HANDLE)process_handle.u64[0]; + } + + for EachElement(i, captures_win32) { + while (captures_win32[i].state == Win32CaptureState_Null) { + // init overlapped so when child writes to capture buffer this event is signaled + AssertAlways(ResetEvent(captures_win32[i].event)); + MemoryZeroStruct(&captures_win32[i].overlapped); + captures_win32[i].overlapped.hEvent = captures_win32[i].event; + + // begin overlapped read + DWORD read_size = 0; + if (ReadFile(captures_win32[i].read_pipe_handle, captures_win32[i].buffer, captures_win32[i].buffer_size, &read_size, &captures_win32[i].overlapped)) { + if (read_size > 0) { + String8 string = str8(captures_win32[i].buffer, read_size); + String8 string_copy = str8_copy(scratch.arena, string); + str8_list_push(scratch.arena, captures_win32[i].parts, string_copy); + } else { + captures_win32[i].state = Win32CaptureState_EOF; + } + } else { + DWORD error = GetLastError(); + if (error == ERROR_IO_PENDING) { + captures_win32[i].state = Win32CaptureState_Pending; + } else { + AssertAlways(error == ERROR_HANDLE_EOF || error == ERROR_BROKEN_PIPE); + captures_win32[i].state = Win32CaptureState_EOF; + } + break; + } + } + + if (captures_win32[i].state == Win32CaptureState_Pending) { + // event now should signal whenever pipe has data to read + captures_win32[i].wait_idx = wait_handle_count++; + wait_handles[captures_win32[i].wait_idx] = captures_win32[i].event; + } else { + captures_win32[i].wait_idx = max_U64; + } + } + + // exit if there are no handles + if (wait_handle_count == 0) { break; } + + // compute wait time + DWORD wait_ms = INFINITE; + if (timeout_us != max_U64) { + U64 now_us = os_now_microseconds(); + wait_ms = now_us < endt_us ? ClampTop((endt_us - now_us + 999) / 1000, max_U32-1) : 0; + } + + // wait on process and read pipes + DWORD wait_result = WaitForMultipleObjects(wait_handle_count, wait_handles, 0, wait_ms); + + if (wait_result >= WAIT_OBJECT_0 && wait_result < WAIT_OBJECT_0 + wait_handle_count) { + DWORD wait_idx = wait_result - WAIT_OBJECT_0; + + if (is_process_live && wait_idx == 0) { + DWORD exit_code = 0; + if(GetExitCodeProcess((HANDLE)process_handle.u64[0], &exit_code)) { + g_last_exit_code = exit_code; + } + is_process_live = 0; + } else { + // find signaled pipe + U64 pipe_idx = max_U64; + for EachElement(i, captures_win32) { + if (captures_win32[i].wait_idx == wait_idx) { + pipe_idx = i; + } + } + AssertAlways(pipe_idx != max_U64); + + DWORD read_size; + if (GetOverlappedResult(captures_win32[pipe_idx].read_pipe_handle, &captures_win32[pipe_idx].overlapped, &read_size, 0)) { + if (read_size > 0) { + // append capture part + String8 string = str8(captures_win32[pipe_idx].buffer, read_size); + String8 string_copy = str8_copy(scratch.arena, string); + str8_list_push(scratch.arena, captures_win32[pipe_idx].parts, string_copy); + + // queue next overlapped read + captures_win32[pipe_idx].state = Win32CaptureState_Null; + } else { + captures_win32[pipe_idx].state = Win32CaptureState_EOF; + } + } else { + captures_win32[pipe_idx].state = Win32CaptureState_EOF; + } + } + } else if (wait_result == WAIT_TIMEOUT) { + // nothing woke up in the given timeout -- stop reading pipes and being exit + break; + } + } + + // (timeout) kill process if alive so we can safeley cancel async IO + if (is_process_live) { + if (TerminateProcess((HANDLE)process_handle.u64[0], 999)) { + if (WaitForSingleObject((HANDLE)process_handle.u64[0], 10000) != WAIT_OBJECT_0) { + Assert(0 && "process is taking too long to exit"); + } + } else { Assert(0 && "failed to kill process"); } + + DWORD exit_code = 0; + if (GetExitCodeProcess((HANDLE)process_handle.u64[0], &exit_code)) { + g_last_exit_code = exit_code; + } else { Assert(0 && "failed to get process exit code"); } + } + + // (timeout) cancel pending async IO + for EachElement(i, captures_win32) { + if (captures_win32[i].state == Win32CaptureState_Pending) { + BOOL cancel_ok = CancelIoEx(captures_win32[i].read_pipe_handle, &captures_win32[i].overlapped); + DWORD cancel_error = cancel_ok ? ERROR_SUCCESS : GetLastError(); + AssertAlways(cancel_ok || cancel_error == ERROR_NOT_FOUND); + + DWORD read_size = 0; + if (GetOverlappedResult(captures_win32[i].read_pipe_handle, &captures_win32[i].overlapped, &read_size, 1)) { + if (read_size > 0) { + String8 string = str8(captures_win32[i].buffer, read_size); + String8 string_copy = str8_copy(scratch.arena, string); + str8_list_push(scratch.arena, captures_win32[i].parts, string_copy); + } + } else { + DWORD error = GetLastError(); + AssertAlways(error == ERROR_OPERATION_ABORTED || error == ERROR_HANDLE_EOF || error == ERROR_BROKEN_PIPE); + } + captures_win32[i].state = Win32CaptureState_EOF; + } + } + + // close windows specific handles + CloseHandle((HANDLE)process_handle.u64[0]); + for EachElement(i, captures_win32) { + CloseHandle(captures_win32[i].event); + } } - file_close(read_pipe_handle); +#elif OS_LINUX +# error NotImplemented +#endif // update output global - g_output = str8_list_join(g_output_arena, &output, 0); + g_output = str8_list_join(g_output_arena, &stdout_parts, 0); + g_errors = str8_list_join(g_output_arena, &stderr_parts, 0); // write to the output file if (g_redirect_stdout) { - write_data_list_to_file_path(g_stdout_file_name, output); + write_data_to_file_path(g_stdout_file_name, g_output); } - U64 exit_code_u64 = 0; - if (process_join(process_handle, timeout, &exit_code_u64)) { - g_last_exit_code = (int)exit_code_u64; - is_ok = 1; - } else { - process_kill(process_handle); - } - + is_ok = 1; // process was launched (does not mean exited successfully) exit:; + for EachElement(i, read_capture_handles) { file_close(read_capture_handles[i]); } + for EachElement(i, write_capture_handles) { file_close(write_capture_handles[i]); } scratch_end(scratch); return is_ok; } diff --git a/src/torture/torture.h b/src/torture/torture.h index 140ab95f..36d0fe90 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -70,6 +70,16 @@ internal void t_break_if_debugger_present(void); #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) #define t_outf(...) str8_list_pushf(arena, test_out, ## __VA_ARGS__) +//////////////////////////////////////////////////////////////// + +#define TIMEOUT_US(x) (x) +#define TIMEOUT_MS(x) TIMEOUT_US((x)*1000ull) +#define TIMEOUT_SEC(x) TIMEOUT_MS((x)*1000ull) + +#define ENDT_US(x) (os_now_microseconds() + (x)) +#define ENDT_MS(x) TIMEOUT_US((x)*1000ull) +#define ENDT_SEC(x) TIMEOUT_MS((x)*1000ull) + //////////////////////////////// // output directory From 8fe39ca2b936a046a5a6fb6d1504f9727fd92e83 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Apr 2026 17:07:05 -0700 Subject: [PATCH 582/850] test asan summary print in github actions --- run_tests.bat | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/run_tests.bat b/run_tests.bat index 7719fd79..042d60b6 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -26,14 +26,15 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;!PATH! ) + rem raddbg dies under asan on statup + call build.bat meta %%c %%m asan raddbg || exit /b 1 + rem clang does not compile with asan in release mode because it runs out of memory if "%%c" equ "clang" ( call build.bat meta %%c %%m %TARGET_VALUES% || exit /b 1 ) else ( call build.bat meta asan %%c %%m %TARGET_VALUES% || exit /b 1 ) - rem raddbg dies under asan on statup - call build.bat meta %%c %%m raddbg || exit /b 1 pushd build torture -s:Dbg* %* || exit /b 1 From 3878a4cd9588ccb0c406258d2d51d74fc5249ae9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Apr 2026 17:07:38 -0700 Subject: [PATCH 583/850] minor fixes to basic stepping test --- src/torture/torture_dbg.c | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index c3cbd477..e8973ac2 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -3,16 +3,6 @@ #define T_Group "Dbg" -//////////////////////////////////////////////////////////////// - -#define TIMEOUT_US(x) (x) -#define TIMEOUT_MS(x) TIMEOUT_US((x)*1000ull) -#define TIMEOUT_SEC(x) TIMEOUT_MS((x)*1000ull) - -#define ENDT_US(x) (os_now_microseconds() + (x)) -#define ENDT_MS(x) TIMEOUT_US((x)*1000ull) -#define ENDT_SEC(x) TIMEOUT_MS((x)*1000ull) - //////////////////////////////// // IPC Controller @@ -223,9 +213,9 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) } while (t > 0); //--- Status --------------------- - if (0 && is_stopped) { + if (is_stopped) { T_DbgStatus status = {0}; - AssertAlways(t_dbg_status(&status, 0)); + AssertAlways(t_dbg_status(&status, TIMEOUT_SEC(5))); String8 process_id = str8_skip(str8_chop(t_dbg_value_from_exprf(scratch.arena, "query:current_process.id"), 2), 2); String8 process_label = str8_chop(str8_skip(t_dbg_value_from_exprf(scratch.arena, "query:current_process.label"), 2), 2); @@ -237,10 +227,10 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) String8 sp = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rsp)"); T_DbgStopEvent last_stop = {0}; - AssertAlways(t_dbg_stop_event(scratch.arena, &last_stop, 0)); + AssertAlways(t_dbg_stop_event(scratch.arena, &last_stop, TIMEOUT_SEC(5))); T_DbgSourceLocation loc = {0}; - AssertAlways(t_dbg_src_line(scratch.arena, last_stop.ip_vaddr, &loc, 0)); + AssertAlways(t_dbg_src_line(scratch.arena, last_stop.ip_vaddr, &loc, TIMEOUT_SEC(5))); printf("------------------------------------------------------------------------------------------------------------------------\n"); printf(" Process: %.*s [%.*s] (Active: %.*s)\n", str8_varg(process_id), str8_varg(process_label), str8_varg(process_active)); @@ -316,7 +306,7 @@ t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) RD_IpcReply reply = {0}; String8 cmd = str8f(scratch.arena, "eval %llu %S", /* value char cap: */ 10000, expr); - B32 is_ok = t_dbg_send_cmd(cmd, 0, arena, &reply); + B32 is_ok = t_dbg_send_cmd(cmd, TIMEOUT_SEC(5), arena, &reply); T_Eval e = {0}; if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { AssertAlways(0); goto exit; } @@ -586,10 +576,6 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) case T_DbgScriptCmdKind_ClearBreakpoints: t_dbg_send_cmdf(0,0,0, "clear_breakpoints"); break; case T_DbgScriptCmdKind_Run: t_dbg_send_cmd(str8_lit("run"), timeout_us, 0, 0); break; case T_DbgScriptCmdKind_At: { - T_DbgStatus status = {0}; - AssertAlways(t_dbg_status(&status, 0)); - AssertAlways(status.running == 0); - // map IP -> source location U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); T_DbgSourceLocation loc = {0}; From b6bc8d89b0c7f53140cfeb922f4c154228c996c1 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Apr 2026 23:20:26 -0700 Subject: [PATCH 584/850] bifurcate output into stderr and stdout --- src/torture/torture.c | 8 ++++++-- src/torture/torture_radlink.c | 18 +++++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index fd92e756..dc4c12b3 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -155,8 +155,12 @@ t_run_caller(void *raw_ctx) for EachNode(n, String8Node, test_out.first) { fprintf(stderr, "%.*s", str8_varg(n->string)); } - fprintf(stderr, "STDERR:\n", str8_varg(g_errors)); - fprintf(stderr, "STDOUT:\n", str8_varg(g_output)); + if (g_errors.size) { + fprintf(stderr, "STDERR:\n", str8_varg(g_errors)); + } + if (g_output.size) { + fprintf(stderr, "STDOUT:\n", str8_varg(g_output)); + } } scratch_end(scratch); } diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index e21192ef..4ddefb54 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -5019,7 +5019,7 @@ TEST(debug_p_sig_mismatch) String8 b_obj_path = t_make_file_path(arena, str8_lit("b.obj")); String8 expected_line = str8f(arena, "Error(%03d): %S: PCH signature mismatch, expected 0x%x got 0x%x; PCH obj %S", LNK_Error_PrecompSigMismatch, b_obj_path, b_sig, a_sig, a_obj_path); - String8 output = g_output; + String8 output = g_errors; while (output.size) { String8 line = t_chop_line(&output); found_error = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive); @@ -5128,7 +5128,7 @@ TEST(debug_p_and_debug_t_in_obj) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full pch.obj entry.obj"); T_Ok(g_last_exit_code == 0); - String8 output = g_output; + String8 output = g_errors; B32 found_warning = 0; String8 pch_obj_path = t_make_file_path(arena, str8_lit("pch.obj")); String8 expected_line = str8f(arena, "Warning(%03d): %S: multiple sections with debug types detected, obj must have either .debug$T or .debug$P; discarding both sections", LNK_Warning_MultipleDebugTAndDebugP, pch_obj_path); @@ -5535,7 +5535,7 @@ TEST(cyclic_type) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full /rad_ignore:-%u cycle.obj entry.obj", LNK_Error_InvalidTypeIndex); T_Ok(g_last_exit_code == 0); - String8 output = g_output; + String8 output = g_errors; B32 is_cycle_detected = 0; while (output.size && !is_cycle_detected) { is_cycle_detected = t_match_linef(&output, @@ -6012,7 +6012,7 @@ TEST(ghash_check_corrupt) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); String8 expected_line = str8f(arena, "Warning(%03u): %S: .debug$H section is too small to contain the header", LNK_Warning_GHash, debug_obj_path, LLVM_GHash_Magic); - for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { + for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6061,7 +6061,7 @@ TEST(ghash_check_magic) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); String8 expected_line = str8f(arena, "Warning(%03u): %S: .debug$H contains invalid magic: got 0x7b, expected 0x%x", LNK_Warning_GHash, debug_obj_path, LLVM_GHash_Magic); - for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { + for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6110,7 +6110,7 @@ TEST(ghash_check_version) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H version: got %u, expected %u", LNK_Warning_GHash, debug_obj_path, 0xbeef, LLVM_GHash_CurrentVersion); - for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { + for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6151,7 +6151,7 @@ TEST(ghash_check_hash_alg) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash algorithm: got SHA1_8, expected BALK3", LNK_Warning_GHash, debug_obj_path); - for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { + for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6193,7 +6193,7 @@ TEST(ghash_match_debug_t) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash count and type count: got 3 hashes for 2 types", LNK_Warning_GHash, debug_obj_path); - for (String8 i = g_output; i.size > 0 && !is_warning_found; ) { + for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); } @@ -6432,7 +6432,7 @@ t_radlink_validate_asan_out(String8 obj_name) str8_list_pushf(scratch.arena, &env, "PATH=%S;%S", str8_chop_last_slash(t_cl_path()), str8_cstring(old_path_cstr)); t_invoke_env(exe_path, str8_zero(), env, max_U64); - String8 s = g_output; + String8 s = g_errors; String8 header = t_chop_line(&s); if ( ! str8_match(header, str8_lit("================================================================="), 0)) { From b60f5ec7cb8844204f18b63b200bfe6c8592b6c9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 28 Apr 2026 23:24:01 -0700 Subject: [PATCH 585/850] wire non graphical raddbg build target --- build.bat | 1 + run_tests.bat | 6 +++--- src/render/stub/render_stub.c | 2 +- src/torture/torture.c | 4 ++-- src/window_manager/window_manager_stub.c | 3 +++ 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/build.bat b/build.bat index b9ed9538..29b62a43 100644 --- a/build.bat +++ b/build.bat @@ -140,6 +140,7 @@ popd :: --- Build Everything (@build_targets) -------------------------------------- pushd build if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg.exe || exit /b 1 +if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% -DWM_STUB=1 -DWM_STUB_DEFAULT_REFRESH_RATE=60.f -DR_BACKEND=R_BACKEND_STUB ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg_non_graphical.exe || exit /b 1 if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% %linker% /NOIMPLIB %linker% /NATVIS:"%~dp0\src\linker\linker.natvis" %out%radlink.exe || exit /b 1 if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% %out%radbin.exe || exit /b 1 if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% %out%raddump.exe || exit /b 1 diff --git a/run_tests.bat b/run_tests.bat index 042d60b6..0894b8e6 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -26,8 +26,8 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;!PATH! ) - rem raddbg dies under asan on statup - call build.bat meta %%c %%m asan raddbg || exit /b 1 + rem TODO: unblock asan + call build.bat meta %%c %%m raddbg_non_graphical || exit /b 1 rem clang does not compile with asan in release mode because it runs out of memory if "%%c" equ "clang" ( @@ -37,7 +37,7 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( ) pushd build - torture -s:Dbg* %* || exit /b 1 + torture || exit /b 1 popd endlocal diff --git a/src/render/stub/render_stub.c b/src/render/stub/render_stub.c index 702327f3..b34177a9 100644 --- a/src/render/stub/render_stub.c +++ b/src/render/stub/render_stub.c @@ -41,7 +41,7 @@ r_tex2d_release(R_Handle texture) r_hook R_ResourceKind r_kind_from_tex2d(R_Handle texture) { - return R_ResourceStatic; + return R_ResourceKind_Static; } r_hook Vec2S32 diff --git a/src/torture/torture.c b/src/torture/torture.c index dc4c12b3..b54496ef 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -278,9 +278,9 @@ t_raddbg_path(void) ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); #if OS_WINDOWS - path = os_full_path_from_path(arena, str8_lit("raddbg.exe")); + path = os_full_path_from_path(arena, str8_lit("raddbg_non_graphical.exe")); #else - path = os_full_path_from_path(arena, str8_lit("raddbg")); + path = os_full_path_from_path(arena, str8_lit("raddbg_non_graphical")); #endif AssertAlways(path.size); } diff --git a/src/window_manager/window_manager_stub.c b/src/window_manager/window_manager_stub.c index 29ea886d..e6e252f8 100644 --- a/src/window_manager/window_manager_stub.c +++ b/src/window_manager/window_manager_stub.c @@ -13,6 +13,9 @@ internal WM_SystemInfo * wm_get_system_info(void) { local_persist WM_SystemInfo g = {0}; +#if defined(WM_STUB_DEFAULT_REFRESH_RATE) + g.default_refresh_rate = WM_STUB_DEFAULT_REFRESH_RATE; +#endif return &g; } From 3ec7ae6746bf1a0c929222156ab9ff16f871e075 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 29 Apr 2026 00:08:11 -0700 Subject: [PATCH 586/850] explain failed launch --- src/torture/torture.h | 7 ++++++- src/torture/torture_dbg.c | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/torture/torture.h b/src/torture/torture.h index 36d0fe90..6d7e274c 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -66,7 +66,12 @@ internal void t_break_if_debugger_present(void); TEST_(name) \ T_RunSig(name) -#define T_Ok(c) do { if (!(c)) { result_out->fail_file = __FILE__; result_out->fail_line = __LINE__; result_out->fail_cond = Stringify(c); result_out->status = T_RunStatus_Fail; t_break_if_debugger_present(); return; } } while(0) +#define T_Ok(c) do { if (!(c)) { \ + *result_out = (T_RunResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) }; \ + t_break_if_debugger_present(); \ + return; \ +} } while(0) + #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) #define t_outf(...) str8_list_pushf(arena, test_out, ## __VA_ARGS__) diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index e8973ac2..07298994 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -641,8 +641,11 @@ T_RunSig(dbg_script_runner) // launch targets for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Launch].first) { - String8 cmdl = str8f(arena, "--user:%S.raddbg_user %S ", t_make_file_path(arena, str8_lit("temp")), directive->args); - T_Ok(t_dbg_launch(cmdl, ENDT_SEC(10))); + String8 cmdl = str8f(arena, "--user:%S.raddbg_user %S", t_make_file_path(arena, str8_lit("temp")), directive->args); + if ( ! t_dbg_launch(cmdl, ENDT_SEC(10))) { + t_outf("failed to launch debugger with command line \"%S %S\" work dir \"%S\"\n", t_raddbg_path(), cmdl, g_wdir); + T_Ok(0); + } } // debugger is ready, now call script From 5a3741a26489c5204a90d1e23152ef6400ec2656 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 29 Apr 2026 00:22:31 -0700 Subject: [PATCH 587/850] gen crash dumps --- .github/workflows/builds.yml | 13 ++++++++++++- src/base/base_strings.c | 12 ++++++++++++ src/base/base_strings.h | 2 ++ src/linker/base_ext/base_strings.c | 6 ------ src/linker/base_ext/base_strings.h | 2 -- .../metagen_os/core/win32/metagen_os_core_win32.c | 1 + src/raddbg/raddbg_main.c | 9 +++++++-- src/torture/torture.c | 5 +++++ src/torture/torture_dbg.c | 12 +++++++----- 9 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 src/metagen/metagen_os/core/win32/metagen_os_core_win32.c diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 3f26623a..5fa02873 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -65,7 +65,18 @@ jobs: for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v if "${{matrix.compiler}}" == "clang" set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;%PATH% + call build meta raddbg_non_graphical || exit /b 1 call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 cd build - torture || exit /b 1 + torture --gen_crash_dump || exit /b 1 + - name: upload torture crash dumps + if: failure() + uses: actions/upload-artifact@v7 + with: + name: torture-crash-dumps-${{ matrix.compiler }}-${{ matrix.mode }} + path: | + build/*.dmp + build/*.exe + build/*.pdb + if-no-files-found: ignore diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 89e87012..32e668cb 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -395,6 +395,18 @@ str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags) return matched; } +internal B32 +str8_starts_with(String8 string, String8 expected_prefix) +{ + return str8_match(str8_prefix(string, expected_prefix.size), expected_prefix, 0); +} + +internal B32 +str8_starts_withi(String8 string, String8 expected_prefix) +{ + return str8_match(str8_prefix(string, expected_prefix.size), expected_prefix, StringMatchFlag_CaseInsensitive); +} + internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 9eb9b4ea..b7b67787 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -202,6 +202,8 @@ internal String8 backslashed_from_str8(Arena *arena, String8 string); internal B32 str8_match(String8 a, String8 b, StringMatchFlags flags); #define str8_matchi(a, b) str8_match(a, b, StringMatchFlag_CaseInsensitive) internal B32 str8_match_wildcard(String8 string, String8 pattern, StringMatchFlags flags); +internal B32 str8_starts_with(String8 string, String8 expected_prefix); +internal B32 str8_starts_withi(String8 string, String8 expected_prefix); internal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); internal U64 str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags); internal B32 str8_is_before(String8 a, String8 b); diff --git a/src/linker/base_ext/base_strings.c b/src/linker/base_ext/base_strings.c index 7d9510c1..b0952373 100644 --- a/src/linker/base_ext/base_strings.c +++ b/src/linker/base_ext/base_strings.c @@ -1,12 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal B32 -str8_starts_with(String8 string, String8 expected_prefix) -{ - return str8_match(str8_prefix(string, expected_prefix.size), expected_prefix, 0); -} - internal U64 str8_array_bsearch(String8Array arr, String8 value) { diff --git a/src/linker/base_ext/base_strings.h b/src/linker/base_ext/base_strings.h index dc61d504..ae9e5eb5 100644 --- a/src/linker/base_ext/base_strings.h +++ b/src/linker/base_ext/base_strings.h @@ -3,6 +3,4 @@ #pragma once -internal B32 str8_starts_with(String8 string, String8 expected_prefix); - internal U64 str8_array_bsearch(String8Array arr, String8 value); diff --git a/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c b/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/metagen/metagen_os/core/win32/metagen_os_core_win32.c @@ -0,0 +1 @@ + diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 53331eb0..33d5e65f 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -499,7 +499,7 @@ internal void entry_point(CmdLine *cmd_line) { Temp scratch = scratch_begin(0, 0); - + //- rjf: unpack command line arguments ExecMode exec_mode = ExecMode_Normal; B32 auto_run = 0; @@ -860,7 +860,12 @@ entry_point(CmdLine *cmd_line) "--quit_after_success (or -q)\n" "This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\n\n" "--ipc \n" - "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n")); + "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n" + "--gen_crash_dump\n" + "Bypass crash prompt and write dump to --crash_dump_path.\n\n" + "--crash_dump_path:\n" + "Sets crash dump file path.\n\n" + )); }break; } diff --git a/src/torture/torture.c b/src/torture/torture.c index b54496ef..5b2b1aa3 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -473,6 +473,10 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) wait_ms = now_us < endt_us ? ClampTop((endt_us - now_us + 999) / 1000, max_U32-1) : 0; } + if (wait_ms == 0) { + DebugBreakProcess((HANDLE)process_handle.u64[0]); + } + // wait on process and read pipes DWORD wait_result = WaitForMultipleObjects(wait_handle_count, wait_handles, 0, wait_ms); @@ -577,6 +581,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) exit:; for EachElement(i, read_capture_handles) { file_close(read_capture_handles[i]); } for EachElement(i, write_capture_handles) { file_close(write_capture_handles[i]); } + AssertAlways(is_ok); scratch_end(scratch); return is_ok; } diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 07298994..32121526 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -23,7 +23,7 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep #endif // send command - String8 cmdline = str8f(scratch.arena, "--ipc --pid:%u %S", dbg_pid, cmd); + String8 cmdline = str8f(scratch.arena, "--gen_crash_dump --ipc --pid:%u %S", dbg_pid, cmd); if (t_invoke(t_raddbg_path(), cmdline, timeout_us) == 0) { goto exit; } B32 has_reply = 1; @@ -242,6 +242,7 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) printf(" Column: %lld\n", loc.pt.column); printf(" Run Gen: %llu\n", status.run_gen); printf(" Stop Cause: \"%.*s\"\n", str8_varg(last_stop.stop_cause)); + fflush(stdout); } //-------------------------------- @@ -261,9 +262,10 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) Temp scratch = scratch_begin(0, 0); B32 dbg_ready = 0; - String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user")); - String8 project_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_project")); - cmdline = str8f(scratch.arena, "--user:\"%S\" --project:\"%S\" %S", user_path, project_path, cmdline); + String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user")); + String8 project_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_project")); + String8 crash_dump_path = t_make_file_path(scratch.arena, str8_lit("raddbg_crash_dump.dmp")); + cmdline = str8f(scratch.arena, "--gen_crash_dump --crash_dump_path:\"%S\" --user:\"%S\" --project:\"%S\" %S", crash_dump_path, user_path, project_path, cmdline); // launch debugger OS_ProcessLaunchParams launch_opts = { @@ -579,7 +581,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) // map IP -> source location U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); T_DbgSourceLocation loc = {0}; - AssertAlways(t_dbg_src_line(scratch.arena, ip, &loc, TIMEOUT_SEC(5))); + AssertAlways(t_dbg_src_line(scratch.arena, ip, &loc, TIMEOUT_SEC(15))); // compute line where debugger must be S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta; From a6da558b448e33d05b0147579da6fa8d9cc75984 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 30 Apr 2026 16:05:33 -0700 Subject: [PATCH 588/850] query binary name in converter command line setup --- src/dbg_info/dbg_info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 7bd22698..3adf15e9 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -797,7 +797,7 @@ di_async_tick(void) params.path = get_process_info()->binary_path; params.inherit_env = 1; params.consoleless = 1; - str8_list_pushf(scratch.arena, ¶ms.cmd_line, "raddbg"); + str8_list_push(scratch.arena, ¶ms.cmd_line, os_get_process_info()->binary_path); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--bin"); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--quiet"); if(should_compress) From 8be21e599e7bbbf1980a6623134bc4f87d988bfa Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 30 Apr 2026 16:12:40 -0700 Subject: [PATCH 589/850] zip torture artifacts on run fail --- .github/workflows/builds.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 5fa02873..9d2d322e 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -78,5 +78,6 @@ jobs: build/*.dmp build/*.exe build/*.pdb + build/torture if-no-files-found: ignore From 7289338d5341738d25e44885d8a238c7b50619e2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 30 Apr 2026 16:12:52 -0700 Subject: [PATCH 590/850] simplify timeouts --- src/torture/torture_dbg.c | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 32121526..8a162b7e 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -190,13 +190,11 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) if (t_dbg_send_cmd(cmd, max_U64, 0, 0) == 0) { Assert(0 && "failed to the command"); goto exit; } // wait for debugger to stop - U64 t = timeout_us; - do { + U64 t = ENDT_US(timeout_us); + for (;;) { // query debugger status - U64 begint_us = os_now_microseconds(); T_DbgStatus status = {0}; if (t_dbg_status(&status, t) == 0) { Assert(0 && "failed to acquire debugger status"); goto exit; } - U64 endt_us = os_now_microseconds(); // did state change? -> break if (!status.running && status.run_gen != status_before.run_gen) { @@ -204,13 +202,10 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) break; } - U64 dt_us = (endt_us - begint_us) + TIMEOUT_MS(10); - if (dt_us >= t) { break; } - t -= dt_us; - // "solve" the wait problem + if (os_now_microseconds() >= t) { Assert(0 && "timeout"); goto exit; } os_sleep_milliseconds(10); - } while (t > 0); + } //--- Status --------------------- if (is_stopped) { @@ -279,22 +274,16 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) os_process_join(g_dbg_handle, 0, 0); // now wait for debugger to init - U64 t = timeout_us; - do { + U64 t = ENDT_US(timeout_us); + for (;;) { // time the ping - U64 ping_begint_us = os_now_microseconds(); dbg_ready = t_dbg_ping(t); if (dbg_ready) { break; } - U64 ping_endt_us = os_now_microseconds(); - - // dbg did not pong -> compute remaining timeout and loop back - U64 ping_dt_us = (ping_endt_us - ping_begint_us) + TIMEOUT_MS(10); - if (ping_dt_us >= t) { break; } - t -= ping_dt_us; // "solve" the wait problem + if (os_now_microseconds() >= t) { Assert(0 && "timeout"); break; } os_sleep_milliseconds(10); - } while (t > 0); + } exit:; scratch_end(scratch); From 5d8c568d82cebde94412b50d70346ae4e9cb2fff Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 30 Apr 2026 16:39:11 -0700 Subject: [PATCH 591/850] use PID to find and kill running debugger after tests, and add automatic kill on when torture crashes --- src/torture/torture_dbg.c | 48 ++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 8a162b7e..c4138ae9 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -6,7 +6,7 @@ //////////////////////////////// // IPC Controller -internal OS_Handle g_dbg_handle; +internal U32 g_dbg_pid; internal B32 t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *reply_out) @@ -14,16 +14,9 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep Temp scratch = scratch_begin(&reply_arena, 1); B32 is_sent = 0; -#if OS_WINDOWS - U32 dbg_pid = GetProcessId((HANDLE)g_dbg_handle.u64[0]); -#elif OS_LINUX - U32 dbg_pid = safe_cast_u32(handle.u64[0]); -#else -# error NotImplemented -#endif // send command - String8 cmdline = str8f(scratch.arena, "--gen_crash_dump --ipc --pid:%u %S", dbg_pid, cmd); + String8 cmdline = str8f(scratch.arena, "--gen_crash_dump --ipc --pid:%u %S", g_dbg_pid, cmd); if (t_invoke(t_raddbg_path(), cmdline, timeout_us) == 0) { goto exit; } B32 has_reply = 1; @@ -269,9 +262,29 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), }; str8_list_push_front(scratch.arena, &launch_opts.cmd_line, t_raddbg_path()); - g_dbg_handle = os_process_launch(&launch_opts); - if (os_handle_match(g_dbg_handle, os_handle_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } - os_process_join(g_dbg_handle, 0, 0); + OS_Handle dbg_handle = os_process_launch(&launch_opts); + if (os_handle_match(dbg_handle, os_handle_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } + +#if OS_WINDOWS + // automatically close child processes on exit + { + HANDLE job_handle = CreateJobObjectA(0, 0); + AssertAlways(job_handle != 0); + JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { .BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE }; + AssertAlways(SetInformationJobObject(job_handle, JobObjectExtendedLimitInformation, &job_info, sizeof(job_info))); + AssertAlways(AssignProcessToJobObject(job_handle, GetCurrentProcess())); + } + + // cache debugger PID + g_dbg_pid = GetProcessId((HANDLE)dbg_handle.u64[0]); +#elif OS_LINUX + g_dbg_pid = safe_cast_u32(handle.u64[0]); +#else +# error NotImplemented +#endif + + // close debugger handle + os_process_join(dbg_handle, 0, 0); // now wait for debugger to init U64 t = ENDT_US(timeout_us); @@ -643,7 +656,16 @@ T_RunSig(dbg_script_runner) t_dbg_script_invoke(&script, ENDT_SEC(60*3)); // clean up - os_process_kill(g_dbg_handle); +#if OS_WINDOWS + HANDLE dbg_handle = OpenProcess(PROCESS_ALL_ACCESS, 0, g_dbg_pid); + if (dbg_handle != 0) { + TerminateProcess(dbg_handle, 1); + CloseHandle(dbg_handle); + } +#else + kill(g_dbg_pid, SIGKILL); +#endif + g_dbg_pid = 0; } internal void From 2643d14e06915af7f71ae9f3929fbd8a9fde9c5e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 30 Apr 2026 16:58:11 -0700 Subject: [PATCH 592/850] extend os info struct with binary file path --- src/base/base_processes.h | 1 + src/dbg_info/dbg_info.c | 2 +- src/linux/base/linux_base.c | 4 ++-- src/metagen/metagen_os/core/metagen_os_core.h | 1 + src/win32/base/win32_base.c | 4 ++-- 5 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 src/metagen/metagen_os/core/metagen_os_core.h diff --git a/src/base/base_processes.h b/src/base/base_processes.h index a2d1bdee..57a48aa1 100644 --- a/src/base/base_processes.h +++ b/src/base/base_processes.h @@ -9,6 +9,7 @@ struct ProcessInfo { U32 pid; B32 large_pages_allowed; + String8 binary_file_path; String8 binary_path; String8 initial_path; String8 user_program_data_path; diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 3adf15e9..1ac09aeb 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -797,7 +797,7 @@ di_async_tick(void) params.path = get_process_info()->binary_path; params.inherit_env = 1; params.consoleless = 1; - str8_list_push(scratch.arena, ¶ms.cmd_line, os_get_process_info()->binary_path); + str8_list_push(scratch.arena, ¶ms.cmd_line, get_process_info()->binary_file_path); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--bin"); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--quiet"); if(should_compress) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 9e22fda5..86cfe292 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1548,8 +1548,8 @@ main(int argc, char **argv) if(got_final_result && size > 0) { String8 full_name = str8(buffer, size); - String8 name_chopped = str8_chop_last_slash(full_name); - info->binary_path = push_str8_copy(lnx_state.arena, name_chopped); + info->binary_file_path = push_str8_copy(os_lnx_state.arena, full_name); + info->binary_path = str8_chop_last_slash(info->binary_file_path); } } diff --git a/src/metagen/metagen_os/core/metagen_os_core.h b/src/metagen/metagen_os/core/metagen_os_core.h new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/metagen/metagen_os/core/metagen_os_core.h @@ -0,0 +1 @@ + diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index ea451af3..f7f1e38f 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1893,8 +1893,8 @@ w32_entry_point_caller(int argc, WCHAR **wargv) U16 *buffer = push_array_no_zero(scratch.arena, U16, size); DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size); String8 name8 = str8_from_16(scratch.arena, str16(buffer, length)); - String8 name_chopped = str8_chop_last_slash(name8); - info->binary_path = push_str8_copy(arena, name_chopped); + info->binary_file_path = push_str8_copy(arena, name8); + info->binary_path = str8_chop_last_slash(info->binary_file_path); scratch_end(scratch); } info->initial_path = get_current_path(arena); From 7b01038f0549a7ee043bc5cfc9b171e6c008ba11 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 30 Apr 2026 17:25:54 -0700 Subject: [PATCH 593/850] add error messages in script runner and create a global default timeout --- src/torture/torture_dbg.c | 51 ++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index c4138ae9..cb671482 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -3,6 +3,8 @@ #define T_Group "Dbg" +#define T_Dbg_DefaultTimeout TIMEOUT_SEC(5) + //////////////////////////////// // IPC Controller @@ -201,9 +203,9 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) } //--- Status --------------------- - if (is_stopped) { + if (0 && is_stopped) { T_DbgStatus status = {0}; - AssertAlways(t_dbg_status(&status, TIMEOUT_SEC(5))); + AssertAlways(t_dbg_status(&status, T_Dbg_DefaultTimeout)); String8 process_id = str8_skip(str8_chop(t_dbg_value_from_exprf(scratch.arena, "query:current_process.id"), 2), 2); String8 process_label = str8_chop(str8_skip(t_dbg_value_from_exprf(scratch.arena, "query:current_process.label"), 2), 2); @@ -215,10 +217,10 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) String8 sp = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rsp)"); T_DbgStopEvent last_stop = {0}; - AssertAlways(t_dbg_stop_event(scratch.arena, &last_stop, TIMEOUT_SEC(5))); + AssertAlways(t_dbg_stop_event(scratch.arena, &last_stop, T_Dbg_DefaultTimeout)); T_DbgSourceLocation loc = {0}; - AssertAlways(t_dbg_src_line(scratch.arena, last_stop.ip_vaddr, &loc, TIMEOUT_SEC(5))); + AssertAlways(t_dbg_src_line(scratch.arena, last_stop.ip_vaddr, &loc, T_Dbg_DefaultTimeout)); printf("------------------------------------------------------------------------------------------------------------------------\n"); printf(" Process: %.*s [%.*s] (Active: %.*s)\n", str8_varg(process_id), str8_varg(process_label), str8_varg(process_active)); @@ -310,7 +312,7 @@ t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) RD_IpcReply reply = {0}; String8 cmd = str8f(scratch.arena, "eval %llu %S", /* value char cap: */ 10000, expr); - B32 is_ok = t_dbg_send_cmd(cmd, TIMEOUT_SEC(5), arena, &reply); + B32 is_ok = t_dbg_send_cmd(cmd, T_Dbg_DefaultTimeout, arena, &reply); T_Eval e = {0}; if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { AssertAlways(0); goto exit; } @@ -583,7 +585,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) // map IP -> source location U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); T_DbgSourceLocation loc = {0}; - AssertAlways(t_dbg_src_line(scratch.arena, ip, &loc, TIMEOUT_SEC(15))); + AssertAlways(t_dbg_src_line(scratch.arena, ip, &loc, T_Dbg_DefaultTimeout)); // compute line where debugger must be S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta; @@ -618,42 +620,53 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) internal T_RunSig(dbg_script_runner) { - t_kill_all(str8_lit("*raddbg*")); - // read source file String8 source = os_data_from_file_path(arena, user_data); - T_Ok(source.size != 0); + if (source.size == 0) { + fprintf(stderr, "ERROR: failed to read script: \"%.*s\"\n", str8_varg(user_data)); + T_Ok(0); + } // source -> script T_DbgScript script = t_dbg_script_from_source(arena, user_data, source); // write source files to test folder - for EachNode(file, T_DbgScriptFile, script.files.first) { T_Ok(os_write_data_to_file_path(file->path, file->source)); } - - String8 compiler_path = t_cl_path(); - String8 linker_path = t_radlink_path(); + for EachNode(file, T_DbgScriptFile, script.files.first) { + if (os_write_data_to_file_path(file->path, file->source) == 0) { + fprintf(stderr, "ERROR: %.*s:%llu: failed to write: \"%.*s\"\n", str8_varg(user_data), file->line, str8_varg(file->path)); + T_Ok(0); + } + } // run compilers + String8 compiler_path = t_cl_path(); for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Compile].first) { - T_Ok(t_invoke(compiler_path, directive->args, max_U64)); + if (t_invoke(compiler_path, directive->args, max_U64) == 0) { + fprintf(stderr, "ERROR: failed to launch compiler: \"%.*s %.*s\"\n", str8_varg(compiler_path), str8_varg(directive->args)); + T_Ok(0); + } } // run linkers + String8 linker_path = t_radlink_path(); for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Link].first) { - T_Ok(t_invoke(linker_path, directive->args, max_U64)); + if (t_invoke(linker_path, directive->args, max_U64) == 0) { + fprintf(stderr, "ERROR: failed to launch linker: \"%.*s %.*s\"\n", str8_varg(linker_path), str8_varg(directive->args)); + T_Ok(0); + } } // launch targets for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Launch].first) { String8 cmdl = str8f(arena, "--user:%S.raddbg_user %S", t_make_file_path(arena, str8_lit("temp")), directive->args); - if ( ! t_dbg_launch(cmdl, ENDT_SEC(10))) { - t_outf("failed to launch debugger with command line \"%S %S\" work dir \"%S\"\n", t_raddbg_path(), cmdl, g_wdir); + if (t_dbg_launch(cmdl, T_Dbg_DefaultTimeout) == 0) { + fprintf(stderr, "ERROR: failed to launch debugger with command line \"%.*s %.*s\"; work dir \"%.*s\"\n", str8_varg(t_raddbg_path()), str8_varg(cmdl), str8_varg(g_wdir)); T_Ok(0); } } - // debugger is ready, now call script - t_dbg_script_invoke(&script, ENDT_SEC(60*3)); + // debugger is ready -- now invoke script + t_dbg_script_invoke(&script, T_Dbg_DefaultTimeout); // clean up #if OS_WINDOWS From fbdfeea8e6db2be710598a3344b038a6ab27c7b8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 30 Apr 2026 17:28:21 -0700 Subject: [PATCH 594/850] minor fix --- run_tests.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_tests.bat b/run_tests.bat index 0894b8e6..d3c7f1d6 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -37,7 +37,7 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( ) pushd build - torture || exit /b 1 + torture %* || exit /b 1 popd endlocal From d7161ea6e6896509c6c7623cbd16fba65312df48 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 30 Apr 2026 18:33:09 -0700 Subject: [PATCH 595/850] clean up stepping test, and remove switch for overriding crash dump path --- .github/workflows/builds.yml | 2 +- src/raddbg/raddbg_core.c | 1 + src/raddbg/raddbg_main.c | 4 +--- src/torture/torture.c | 9 +++++++++ src/torture/torture_dbg.c | 30 ++++++++++++++++-------------- src/torture/torture_dbg.h | 1 + 6 files changed, 29 insertions(+), 18 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 9d2d322e..e3e54643 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -68,7 +68,7 @@ jobs: call build meta raddbg_non_graphical || exit /b 1 call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 cd build - torture --gen_crash_dump || exit /b 1 + torture --gen_crash_dump -s:Dbg::* || exit /b 1 - name: upload torture crash dumps if: failure() uses: actions/upload-artifact@v7 diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 0fa56b46..3d8b53c1 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10437,6 +10437,7 @@ rd_ipc_make_reply_status(Arena *arena) rd_ipc_reply_push_b32 (arena, &s, "ok", 1); rd_ipc_reply_push_b32 (arena, &s, "running", d_ctrl_targets_running()); rd_ipc_reply_push_u64 (arena, &s, "run_gen", d_run_gen()); + rd_ipc_reply_push_u64 (arena, &s, "ip", d_ctrl_last_stop_event().rip_vaddr); rd_ipc_reply_block_end(arena, &s); scratch_end(scratch); return str8_list_join(arena, &s, 0); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 33d5e65f..7395e32b 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -862,9 +862,7 @@ entry_point(CmdLine *cmd_line) "--ipc \n" "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n" "--gen_crash_dump\n" - "Bypass crash prompt and write dump to --crash_dump_path.\n\n" - "--crash_dump_path:\n" - "Sets crash dump file path.\n\n" + "Generate mini dump on crash.\n\n" )); }break; } diff --git a/src/torture/torture.c b/src/torture/torture.c index 5b2b1aa3..cd09c6ee 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -929,6 +929,15 @@ t_entry_point(CmdLine *cmdline) if (!cmd_line_has_flag(cmdline, str8_lit("print_stdout")) && IsDebuggerPresent()) { g_redirect_stdout = 0; } + + // automatically close child processes on exit + { + HANDLE job_handle = CreateJobObjectA(0, 0); + AssertAlways(job_handle != 0); + JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { .BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE }; + AssertAlways(SetInformationJobObject(job_handle, JobObjectExtendedLimitInformation, &job_info, sizeof(job_info))); + AssertAlways(AssignProcessToJobObject(job_handle, GetCurrentProcess())); + } #endif // Handle -out diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index cb671482..46a15c7a 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -40,6 +40,7 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep // parse reply Arena *a = reply_arena ? reply_arena : scratch.arena; String8 reply_text = str8_copy(a, g_output); + //fprintf(stderr, "Reply: %.*s\n", str8_varg(reply_text)); RD_IpcReply reply = rd_ipc_mdesk_reply_from_string(a, reply_text); if (rd_ipc_reply_is_ok(&reply) == 0) { goto exit; } if (md_node_is_nil(reply.msg)) { goto exit; } @@ -80,6 +81,7 @@ t_dbg_status(T_DbgStatus *status_out, U64 timeout_us) if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("running"), &status.running)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_int(reply.msg, str8_lit("run_gen"), &status.run_gen)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_int(reply.msg, str8_lit("ip"), &status.ip)) { AssertAlways(0); goto exit; } if (status_out != 0) { *status_out = status; } exit:; @@ -254,8 +256,7 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user")); String8 project_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_project")); - String8 crash_dump_path = t_make_file_path(scratch.arena, str8_lit("raddbg_crash_dump.dmp")); - cmdline = str8f(scratch.arena, "--gen_crash_dump --crash_dump_path:\"%S\" --user:\"%S\" --project:\"%S\" %S", crash_dump_path, user_path, project_path, cmdline); + cmdline = str8f(scratch.arena, "--gen_crash_dump --user:\"%S\" --project:\"%S\" %S", user_path, project_path, cmdline); // launch debugger OS_ProcessLaunchParams launch_opts = { @@ -268,15 +269,6 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) if (os_handle_match(dbg_handle, os_handle_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } #if OS_WINDOWS - // automatically close child processes on exit - { - HANDLE job_handle = CreateJobObjectA(0, 0); - AssertAlways(job_handle != 0); - JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { .BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE }; - AssertAlways(SetInformationJobObject(job_handle, JobObjectExtendedLimitInformation, &job_info, sizeof(job_info))); - AssertAlways(AssignProcessToJobObject(job_handle, GetCurrentProcess())); - } - // cache debugger PID g_dbg_pid = GetProcessId((HANDLE)dbg_handle.u64[0]); #elif OS_LINUX @@ -583,9 +575,16 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) case T_DbgScriptCmdKind_Run: t_dbg_send_cmd(str8_lit("run"), timeout_us, 0, 0); break; case T_DbgScriptCmdKind_At: { // map IP -> source location - U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); + U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); + if (ip == 0) { + fprintf(stderr, "ERROR: invalid IP address: 0x%llx\n", (unsigned long long)ip); + goto exit; + } T_DbgSourceLocation loc = {0}; - AssertAlways(t_dbg_src_line(scratch.arena, ip, &loc, T_Dbg_DefaultTimeout)); + if (t_dbg_src_line(scratch.arena, ip, &loc, T_Dbg_DefaultTimeout) == 0) { + fprintf(stderr, "ERROR: failed to map IP (0x%llx) to source location\n", (unsigned long long)ip); + goto exit; + } // compute line where debugger must be S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta; @@ -666,7 +665,10 @@ T_RunSig(dbg_script_runner) } // debugger is ready -- now invoke script - t_dbg_script_invoke(&script, T_Dbg_DefaultTimeout); + if (t_dbg_script_invoke(&script, T_Dbg_DefaultTimeout) == 0) { + fprintf(stderr, "ERROR: %.*s: failed to run to completion\n", str8_varg(user_data)); + T_Ok(0); + } // clean up #if OS_WINDOWS diff --git a/src/torture/torture_dbg.h b/src/torture/torture_dbg.h index ab5fd0ad..7267a98d 100644 --- a/src/torture/torture_dbg.h +++ b/src/torture/torture_dbg.h @@ -111,6 +111,7 @@ typedef struct { B32 running; U64 run_gen; + U64 ip; } T_DbgStatus; typedef struct From 0cd3cc02ab39f693388fad8246a521c44e8cfe79 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 1 May 2026 15:57:11 -0700 Subject: [PATCH 596/850] older bash compatibility improvements and use pkg-config library detection for external libraries --- build.sh | 84 +++++++++++++++++++++++++------------------------------- 1 file changed, 38 insertions(+), 46 deletions(-) diff --git a/build.sh b/build.sh index a1df2af2..ecb3f550 100644 --- a/build.sh +++ b/build.sh @@ -2,76 +2,68 @@ set -eu cd "$(dirname "$0")" -# --- Unpack Arguments -------------------------------------------------------- -for arg in "$@"; do declare $arg='1'; done -if [ ! -v gcc ]; then clang=1; fi -if [ ! -v release ]; then debug=1; fi -if [ -v debug ]; then echo "[debug mode]"; fi -if [ -v release ]; then echo "[release mode]"; fi -if [ -v clang ]; then compiler="${CC:-clang}"; echo "[clang compile]"; fi -if [ -v gcc ]; then compiler="${CC:-gcc}"; echo "[gcc compile]"; fi - -# --- Unpack Command Line Build Arguments ------------------------------------- -auto_compile_flags='' - # --- Get Current Git Commit Id ----------------------------------------------- git_hash=$(git describe --always --dirty) git_hash_full=$(git rev-parse HEAD) # --- Compile/Link Line Definitions ------------------------------------------- -clang_common="-I../src/ -I/usr/include/freetype2/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wno-unknown-warning-option -fdiagnostics-absolute-paths -Wall -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Wno-for-loop-analysis -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" -clang_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${clang_common} ${auto_compile_flags}" -clang_release="$compiler -g -O2 -DBUILD_DEBUG=0 ${clang_common} ${auto_compile_flags}" -clang_link="-lpthread -lm -lrt -ldl" -clang_out="-o" -gcc_common="-I../src/ -I../local/ -g -D_GNU_SOURCE -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wno-unknown-warning-option -Wall -Wno-missing-braces -Wno-unused-function -Wno-attributes -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-compare-distinct-pointer-types -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" -gcc_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${gcc_common} ${auto_compile_flags}" -gcc_release="$compiler -g -O2 -DBUILD_DEBUG=0 ${gcc_common} ${auto_compile_flags}" -gcc_link="-lpthread -lm -lrt -ldl" -gcc_out="-o" +cc_cflags_gcc="" +cc_cflags_clang="-fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" +cc_common="-I../src/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wall -Wno-missing-braces -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" +cc_debug="-g -O0 -DBUILD_DEBUG=1 ${cc_common}" +cc_release="-g -O2 -DBUILD_DEBUG=0 ${cc_common}" +cc_link="-lpthread -lm -lrt -ldl" # --- Per-Build Settings ------------------------------------------------------ -link_dll="-fPIC" -link_os_gfx="-lX11 -lXext" -link_render="-lGL -lEGL" -link_font_provider="-lfreetype" +cc_link_dll="-fPIC" + +# --- External Libraries ------------------------------------------------------ +if [[ -x "$(command -v pkg-config)" ]]; then + cc_font_provider="$(pkg-config --cflags --libs freetype2)" + cc_os_gfx="$(pkg-config --cflags --libs x11 xext)" + cc_render="$(pkg-config --cflags --libs gl egl)" +else + cc_font_provider="-I/usr/include/freetype2 -lfreetype" + cc_os_gfx="-lX11 -lXext" + cc_render="-lGL -lEGL" +fi + +# --- Unpack Arguments -------------------------------------------------------- +for arg in "$@"; do declare $arg='1'; done +if [[ "$#" == "0" ]]; then raddbg='1'; fi # --- Choose Compile/Link Lines ----------------------------------------------- -if [ -v gcc ]; then compile_debug="$gcc_debug"; fi -if [ -v gcc ]; then compile_release="$gcc_release"; fi -if [ -v gcc ]; then compile_link="$gcc_link"; fi -if [ -v gcc ]; then out="$gcc_out"; fi -if [ -v clang ]; then compile_debug="$clang_debug"; fi -if [ -v clang ]; then compile_release="$clang_release"; fi -if [ -v clang ]; then compile_link="$clang_link"; fi -if [ -v clang ]; then out="$clang_out"; fi -if [ -v debug ]; then compile="$compile_debug"; fi -if [ -v release ]; then compile="$compile_release"; fi +if [[ "${gcc:-0}" == "1" ]]; then compiler="${CC:-gcc} $cc_cflags_gcc"; echo "[gcc compile]"; +elif [[ "${clang:-1}" == "1" ]]; then compiler="${CC:-clang} $cc_cflags_clang"; echo "[clang compile]"; +fi +if [[ "${release:-0}" == "1" ]]; then echo "[release mode]"; compile="$compiler $cc_release"; +elif [[ "${debug:-1}" == "1" ]]; then echo "[debug mode]"; compile="$compiler $cc_debug"; +fi # --- Prep Directories -------------------------------------------------------- -mkdir -p build -mkdir -p local +mkdir -p build local # --- Build & Run Metaprogram ------------------------------------------------- -if [ -v meta ] +if [[ "${no_meta:-0}" == "0" ]] then - echo "[doing metagen]" + echo "[building metagen]" cd build - $compile_debug ../src/metagen/metagen_main.c $compile_link $out metagen + $compiler $cc_debug ../src/metagen/metagen_main.c $cc_link -o metagen ./metagen cd .. fi # --- Build Everything (@build_targets) --------------------------------------- cd build -if [ -v raddbg ]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c $compile_link $link_os_gfx $link_render $link_font_provider $out raddbg; fi -if [ -v radbin ]; then didbuild=1 && $compile ../src/radbin/radbin_main.c $compile_link $out radbin; fi -if [ -v radlink ]; then didbuild=1 && $compile ../src/linker/lnk.c $compile_link $out radlink; fi +if [[ "${raddbg:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg; fi +if [[ "${radbin:-0}" == "1" ]]; then didbuild=1 && $compile ../src/radbin/radbin_main.c $cc_link -o radbin; fi +if [[ "${radlink:-0}" == "1" ]]; then didbuild=1 && $compile ../src/linker/lnk.c $cc_link -o radlink; fi cd .. # --- Warn On No Builds ------------------------------------------------------- -if [ ! -v didbuild ] +if [[ "${didbuild:-0}" == "0" ]] then - echo "[WARNING] no valid build target specified; must use build target names as arguments to this script, like \`./build.sh raddbg\` or \`./build.sh rdi_from_pdb\`." + echo "[WARNING] no valid build target specified; must use build target names as arguments to this script, like \`./build.sh raddbg\` or \`./build.sh radlink\`." exit 1 fi + From 25d2d12fc9a0351330c46caa2610981347739a00 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 1 May 2026 16:03:19 -0700 Subject: [PATCH 597/850] set executable permission bit on build.sh --- build.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 build.sh diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 From cb190ff9e3ca6a5369ea9ae85a807ac66a0d99c6 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 5 May 2026 14:32:48 -0700 Subject: [PATCH 598/850] set work directory for new process --- src/linux/base/linux_base.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 86cfe292..b3b0b0d7 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1227,6 +1227,12 @@ process_launch(ProcessLaunchParams *params) int file_actions_init_code = posix_spawn_file_actions_init(&file_actions); if(file_actions_init_code == 0) { + Temp scratch = scratch_begin(0, 0); + if(params->path.size != 0) + { + int chdir_code = posix_spawn_file_actions_addchdir_np(&file_actions, (char *)push_cstr(scratch.arena, params->path).str); + Assert(chdir_code == 0); + } int stdout_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdout_file.u64[0], STDOUT_FILENO); int stderr_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stderr_file.u64[0], STDERR_FILENO); int stdin_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdin_file.u64[0], STDIN_FILENO); @@ -1234,8 +1240,6 @@ process_launch(ProcessLaunchParams *params) int attr_init_code = posix_spawnattr_init(&attr); if(attr_init_code == 0) { - Temp scratch = scratch_begin(0, 0); - // package argv char **argv = push_array(scratch.arena, char *, params->cmd_line.node_count + 1); { @@ -1278,8 +1282,8 @@ process_launch(ProcessLaunchParams *params) // clean up attributes int attr_destroy_code = posix_spawnattr_destroy(&attr); - scratch_end(scratch); } + scratch_end(scratch); // clean up file actions int file_actions_destroy_code = posix_spawn_file_actions_destroy(&file_actions); From 55172718c9b97186f6d97f536a633160a888672b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 5 May 2026 16:42:54 -0700 Subject: [PATCH 599/850] implement semaphore take with timeout --- src/linux/base/linux_base.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index b3b0b0d7..cf764611 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -669,22 +669,9 @@ semaphore_close(Semaphore semaphore) internal B32 semaphore_take(Semaphore semaphore, U64 endt_us) { - // TODO(rjf): we need to use `sem_timedwait` here. - AssertAlways(endt_us == max_U64); - for(;;) - { - int err = sem_wait((sem_t*)semaphore.u64[0]); - if(err == 0) - { - break; - } - else if(errno == EAGAIN) - { - continue; - } - break; - } - return 1; + struct timespec t = { .tv_sec = endt_us / 1000000, .tv_nsec = (endt_us % 1000000) * 1000 }; + int err = OS_LNX_RETRY_ON_EINTR(sem_clockwait((sem_t*)semaphore.u64[0], CLOCK_MONOTONIC, &t)); + return err == 0; } internal void From 846b2bdf70bf9e10f35d3778c2923ee44dc37b97 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 5 May 2026 14:34:43 -0700 Subject: [PATCH 600/850] fix process reap in the join API --- src/linux/base/linux_base.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index cf764611..0152d64c 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1285,15 +1285,12 @@ process_join(Process process, U64 endt_us, U64 *exit_code_out) B32 result = 0; if(endt_us == 0) { - if(kill(pid, 0) >= 0) + if(kill(pid, 0) == 0) { - result = (errno == ENOENT); - if(result) - { - int status; - waitpid(pid, &status, 0); - } + int status; + waitpid(pid, &status, WNOHANG); } + else { Assert(0 && "failed to get status from pid"); } } else if(endt_us == max_U64) { From 6d6acc737a500fb7be5a831f4c506c114d439e81 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 5 May 2026 14:35:25 -0700 Subject: [PATCH 601/850] set torture as launch target --- launch.vs.json | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/launch.vs.json b/launch.vs.json index f92b78e1..1b86c5d8 100644 --- a/launch.vs.json +++ b/launch.vs.json @@ -7,21 +7,20 @@ "name": "raddbg", "request": "launch", "project": "c://windows//system32//cmd.exe", - "program": "build/raddbg", - "args": [ "-no_stdout_buffer" ], + "cwd": "build/", + "program": "torture", + "args": [ "basic_stepping_test-c" ], "stopAtEntry": false, - "cwd": ".", "environment": [], - "externalConsole": true, + "externalConsole": false, "pipeTransport": { "pipeCwd": "${workspaceRoot}", "pipeProgram": "wsl", "pipeArgs": [ "${debuggerCommand}" ] }, - "setupCommands": - [ - { "text": "handle SIGUSR1 nostop" } - ], + "setupCommands": [ + { "text": "handle SIGUSR1 nostop" } + ], "MIMode": "gdb" } ] From 559e73098617c84c5666c7622bc3080e8128b44d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 5 May 2026 14:36:23 -0700 Subject: [PATCH 602/850] add non-graphical debugger and torture targets --- build.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index ecb3f550..baab318c 100755 --- a/build.sh +++ b/build.sh @@ -55,9 +55,11 @@ fi # --- Build Everything (@build_targets) --------------------------------------- cd build -if [[ "${raddbg:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg; fi -if [[ "${radbin:-0}" == "1" ]]; then didbuild=1 && $compile ../src/radbin/radbin_main.c $cc_link -o radbin; fi -if [[ "${radlink:-0}" == "1" ]]; then didbuild=1 && $compile ../src/linker/lnk.c $cc_link -o radlink; fi +if [[ "${raddbg:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg; fi +if [[ "${raddbg_non_graphical:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c -DOS_GFX_STUB=1 -DOS_GFX_STUB_DEFAULT_REFRESH_RATE=60.f -DR_BACKEND=R_BACKEND_STUB $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg_non_graphical; fi +if [[ "${radbin:-0}" == "1" ]]; then didbuild=1 && $compile ../src/radbin/radbin_main.c $cc_link -o radbin; fi +if [[ "${radlink:-0}" == "1" ]]; then didbuild=1 && $compile ../src/linker/lnk.c $cc_link -o radlink; fi +if [[ "${torture:-0}" == "1" ]]; then didbuild=1 && $compile ../src/torture/torture_main.c $cc_link $cc_os_gfx $cc_render $cc_font_provider -o torture; fi cd .. # --- Warn On No Builds ------------------------------------------------------- From b4dd1f6fd3f6aae38a697b10041507725349006e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 17:02:35 -0700 Subject: [PATCH 603/850] implement os wakeup --- .../window_manager/linux_window_manager.c | 67 +++++++++++++------ .../window_manager/linux_window_manager.h | 3 + .../core/linux/metagen_os_core_linux.h | 1 + 3 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 src/metagen/metagen_os/core/linux/metagen_os_core_linux.h diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index 7a19c3ee..a8a34c32 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -68,6 +68,10 @@ wm_init(void) lnx_wm_state->cursors[map[idx].cursor] = XCreateFontCursor(lnx_wm_state->display, map[idx].id); } } + + // create wakeup event for polling + os_lnx_gfx_state->wakeup_fd = eventfd(0, EFD_CLOEXEC); + Assert(os_lnx_gfx_state->wakeup_fd > 0); } //////////////////////////////// @@ -398,21 +402,42 @@ wm_dpi_from_monitor(WM_Monitor monitor) internal void wm_send_wakeup_event(void) { - // TODO(rjf) + U64 dummy = 1; + ssize_t size = OS_LNX_RETRY_ON_EINTR(write(os_lnx_gfx_state->wakeup_fd, &dummy, sizeof(dummy))); + Assert(size == sizeof(dummy)); } internal WM_EventList wm_get_events(Arena *arena, B32 wait) { WM_EventList evts = {0}; - for(;XPending(lnx_wm_state->display) > 0 || (wait && evts.count == 0);) + for(;;) { - XEvent evt = {0}; - XNextEvent(lnx_wm_state->display, &evt); - B32 set_mouse_cursor = 0; - switch(evt.type) + if(XPending(os_lnx_gfx_state->display) == 0) { - default:{}break; + struct pollfd poll_fds[2] = + { + { .fd = ConnectionNumber(os_lnx_gfx_state->display), .events = POLLIN }, + { .fd = os_lnx_gfx_state->wakeup_fd, .events = POLLIN }, + }; + int timeout = wait && evts.count == 0 ? -1 : 0; + int poll_status = poll(poll_fds, ArrayCount(poll_fds), timeout); + Assert(poll_status >= 0); + if(poll_fds[1].revents & POLLIN) + { + U64 dummy = 0; + read(os_lnx_gfx_state->wakeup_fd, &dummy, sizeof(dummy)); + wait = 0; + } + } + while(XPending(os_lnx_gfx_state->display)) + { + XEvent evt = {0}; + XNextEvent(os_lnx_gfx_state->display, &evt); + B32 set_mouse_cursor = 0; + switch(evt.type) + { + default:{}break; //- rjf: key presses/releases case KeyPress: @@ -617,20 +642,22 @@ wm_get_events(Arena *arena, B32 wait) } } }break; - } - if(set_mouse_cursor) - { - Window root_window = 0; - Window child_window = 0; - int root_rel_x = 0; - int root_rel_y = 0; - int child_rel_x = 0; - int child_rel_y = 0; - unsigned int mask = 0; - if(XQueryPointer(lnx_wm_state->display, XDefaultRootWindow(lnx_wm_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) + } + + if(set_mouse_cursor) { - XDefineCursor(lnx_wm_state->display, root_window, lnx_wm_state->cursors[lnx_wm_state->last_set_cursor]); - XFlush(lnx_wm_state->display); + Window root_window = 0; + Window child_window = 0; + int root_rel_x = 0; + int root_rel_y = 0; + int child_rel_x = 0; + int child_rel_y = 0; + unsigned int mask = 0; + if(XQueryPointer(os_lnx_gfx_state->display, XDefaultRootWindow(os_lnx_gfx_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) + { + XDefineCursor(os_lnx_gfx_state->display, root_window, os_lnx_gfx_state->cursors[os_lnx_gfx_state->last_set_cursor]); + XFlush(os_lnx_gfx_state->display); + } } } } diff --git a/src/linux/window_manager/linux_window_manager.h b/src/linux/window_manager/linux_window_manager.h index 41b3dc65..eb93d05b 100644 --- a/src/linux/window_manager/linux_window_manager.h +++ b/src/linux/window_manager/linux_window_manager.h @@ -13,6 +13,8 @@ #include #include #include +#include +#include //////////////////////////////// //~ rjf: Window State @@ -46,6 +48,7 @@ struct LNX_WM_State Cursor cursors[WM_Cursor_COUNT]; WM_Cursor last_set_cursor; WM_SystemInfo gfx_info; + int wakeup_fd; }; //////////////////////////////// diff --git a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.h @@ -0,0 +1 @@ + From b23323c03d6cfe5773c8ca76a6d5052ccb071084 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 5 May 2026 17:38:01 -0700 Subject: [PATCH 604/850] add switch to override default logs folder --- src/base/base_log.c | 2 ++ src/base/base_log.h | 5 +++++ src/dbg_engine/dbg_engine_core.c | 17 ++++++----------- src/raddbg/raddbg_core.c | 17 +++++++---------- src/raddbg/raddbg_main.c | 13 ++++++++++++- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/base/base_log.c b/src/base/base_log.c index 3916ce1c..5adf5a8a 100644 --- a/src/base/base_log.c +++ b/src/base/base_log.c @@ -9,6 +9,8 @@ C_LINKAGE thread_static Log *log_active; C_LINKAGE thread_static Log *log_active = 0; #endif +String8 g_logs_folder; + //////////////////////////////// //~ rjf: Log Creation/Selection diff --git a/src/base/base_log.h b/src/base/base_log.h index 1cc58ff0..8ef71a37 100644 --- a/src/base/base_log.h +++ b/src/base/base_log.h @@ -36,6 +36,11 @@ struct Log LogScope *top_scope; }; +//////////////////////////////// +// Globals + +extern String8 g_logs_folder; + //////////////////////////////// //~ rjf: Log Creation/Selection diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index e55ef168..3885ca13 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -53,17 +53,12 @@ d_init(void) d_ctrl_state->c2u_ring_size = KB(64); d_ctrl_state->c2u_ring_max_string_size = d_ctrl_state->c2u_ring_size/2; d_ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, d_ctrl_state->c2u_ring_size); - d_ctrl_state->c2u_ring_mutex = mutex_alloc(); - d_ctrl_state->c2u_ring_cv = cond_var_alloc(); - { - Temp scratch = scratch_begin(0, 0); - String8 user_program_data_path = get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/%Sraddbg/logs", user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); - make_directory(user_data_folder); - d_ctrl_state->ctrl_thread_log_path = push_str8f(d_ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); - write_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, str8_zero()); - scratch_end(scratch); - } + d_ctrl_state->c2u_ring_mutex = mutex_alloc(); + d_ctrl_state->c2u_ring_cv = cond_var_alloc(); + { + d_ctrl_state->ctrl_thread_log_path = push_str8f(d_ctrl_state->arena, "%S/ctrl_thread.raddbg_log", g_logs_folder); + write_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, str8_zero()); + } d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc(); d_ctrl_state->ctrl_thread_entity_store = d_entity_ctx_rw_store_alloc(); d_ctrl_state->ctrl_thread_eval_cache = e_cache_alloc(); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 3d8b53c1..1806e204 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10597,16 +10597,13 @@ rd_init(CmdLine *cmdln) rd_state->frame_arenas[idx] = arena_alloc(); } rd_state->log = log_alloc(); - log_select(rd_state->log); - { - Temp scratch = scratch_begin(0, 0); - String8 user_program_data_path = get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/%Sraddbg/logs", user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); - rd_state->log_path = push_str8f(rd_state->arena, "%S/ui_thread.raddbg_log", user_data_folder); - make_directory(user_data_folder); - write_data_to_file_path(rd_state->log_path, str8_zero()); - scratch_end(scratch); - } + log_select(rd_state->log); + { + Temp scratch = scratch_begin(0, 0); + rd_state->log_path = push_str8f(rd_state->arena, "%S/ui_thread.raddbg_log", g_logs_folder); + write_data_to_file_path(rd_state->log_path, str8_zero()); + scratch_end(scratch); + } rd_state->num_frames_requested = 2; rd_state->seconds_until_autosave = 0.5f; rd_state->eval_cache = e_cache_alloc(); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 7395e32b..efaab158 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -532,7 +532,16 @@ entry_point(CmdLine *cmd_line) try_u64_from_str8_c_rules(jit_addr_string, &jit_addr); jit_attach = (jit_addr != 0); } - + + // init log + g_logs_folder = cmd_line_string(cmd_line, str8_lit("logs")); + if(g_logs_folder.size == 0) + { + String8 user_program_data_path = get_process_info()->user_program_data_path; + g_logs_folder = push_str8f(scratch.arena, "%S/%Sraddbg/logs", program_data_folder_prefix_from_os(OperatingSystem_CURRENT), user_program_data_path); + } + make_directory(g_logs_folder); + //- rjf: dispatch to top-level codepath based on execution mode switch(exec_mode) { @@ -863,6 +872,8 @@ entry_point(CmdLine *cmd_line) "This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\n\n" "--gen_crash_dump\n" "Generate mini dump on crash.\n\n" + "--logs:\n" + "Overrides default path to the folder with logs.\n" )); }break; } From a8c167c6ae2549efc831c79b9b4bb0577c5ee45d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 5 May 2026 18:45:54 -0700 Subject: [PATCH 605/850] builds --- .github/workflows/builds.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index e3e54643..c2b83301 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -10,7 +10,7 @@ on: jobs: build-windows-2022: - runs-on: windows-2025 + runs-on: windows-2022 strategy: fail-fast: false matrix: @@ -35,7 +35,7 @@ jobs: call build meta "${{ matrix.target }}" "${{ matrix.compiler }}" "${{ matrix.mode }}" || exit /b 1 run-torture: - runs-on: windows-2025 + runs-on: windows-2022 strategy: fail-fast: false matrix: @@ -68,7 +68,7 @@ jobs: call build meta raddbg_non_graphical || exit /b 1 call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 cd build - torture --gen_crash_dump -s:Dbg::* || exit /b 1 + torture --gen_crash_dump -s:Dbg* || exit /b 1 - name: upload torture crash dumps if: failure() uses: actions/upload-artifact@v7 From 4648b27a06882206e3d563b1f6ada2fa16eddd06 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 6 May 2026 15:54:04 -0700 Subject: [PATCH 606/850] increase wait time for memory slice in line stepping --- src/dbg_engine/dbg_engine_user.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 13ac7665..715583fc 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -396,7 +396,10 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, now_time_us()+50000); + // TODO: Under WSL, memory fetch takes longer to complete. Previously, 50ms was not enough and d_process_memory_slice_from_vaddr_range + // would return stale memory, causing stepping alg to stop mid-source-line. If I understand correctly, 'wait_for_fresh' should + // guarantee successful stepping here, but even after enabling it, stale memory is returned. + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, now_time_us()+10000000); machine_code = machine_code_slice.data; good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); LogInfoNamedBlockF("machine_code_slice") From b7e86b038b0426536b78178e2d087d5bc9f64c0e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 6 May 2026 17:22:13 -0700 Subject: [PATCH 607/850] add asan to build.sh --- build.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/build.sh b/build.sh index baab318c..2034b72b 100755 --- a/build.sh +++ b/build.sh @@ -2,13 +2,23 @@ set -eu cd "$(dirname "$0")" +# --- Unpack Arguments -------------------------------------------------------- +for arg in "$@"; do declare $arg='1'; done +if [[ "$#" == "0" ]]; then raddbg='1'; fi + +cc_sanitize="" +if [[ "${asan:-0}" == "1" ]]; then + echo "[asan enabled]" + cc_sanitize="-fsanitize=address" +fi + # --- Get Current Git Commit Id ----------------------------------------------- git_hash=$(git describe --always --dirty) git_hash_full=$(git rev-parse HEAD) # --- Compile/Link Line Definitions ------------------------------------------- cc_cflags_gcc="" -cc_cflags_clang="-fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" +cc_cflags_clang=${cc_sanitize}" -fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" cc_common="-I../src/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wall -Wno-missing-braces -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" cc_debug="-g -O0 -DBUILD_DEBUG=1 ${cc_common}" cc_release="-g -O2 -DBUILD_DEBUG=0 ${cc_common}" @@ -28,10 +38,6 @@ else cc_render="-lGL -lEGL" fi -# --- Unpack Arguments -------------------------------------------------------- -for arg in "$@"; do declare $arg='1'; done -if [[ "$#" == "0" ]]; then raddbg='1'; fi - # --- Choose Compile/Link Lines ----------------------------------------------- if [[ "${gcc:-0}" == "1" ]]; then compiler="${CC:-gcc} $cc_cflags_gcc"; echo "[gcc compile]"; elif [[ "${clang:-1}" == "1" ]]; then compiler="${CC:-clang} $cc_cflags_clang"; echo "[clang compile]"; From 61f7d0c43aed0a1db6850e7628276b8d79aa53ba Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:36:19 -0700 Subject: [PATCH 608/850] minor fixes --- src/rdi_from_dwarf/rdi_from_dwarf.c | 10 ++++++++-- src/torture/dbg_tests/basic_stepping_test.c | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 445281a6..36fd2e51 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2861,10 +2861,16 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // make file path String8 path; { - String8List path_list = {0}; - str8_list_push_node(&path_list, &(String8Node){ .string = lookup->vm->header.dir_table.v[src->dir_idx] }); + Temp temp = temp_begin(scratch.arena); + PathStyle path_style = PathStyle_Null; + path_style = path_style_from_str8(lookup->vm->header.dir_table.v[src->dir_idx]); + if (path_style == PathStyle_Relative) { + path_style = path_style_from_str8(src->path); + } + String8List path_list = str8_split_path(temp.arena, lookup->vm->header.dir_table.v[src->dir_idx]); str8_list_push_node(&path_list, &(String8Node){ .string = src->path }); path = str8_path_list_join_by_style(arena, &path_list, path_style); + temp_end(temp); } // fill out source file diff --git a/src/torture/dbg_tests/basic_stepping_test.c b/src/torture/dbg_tests/basic_stepping_test.c index a60c5e05..1edac62d 100644 --- a/src/torture/dbg_tests/basic_stepping_test.c +++ b/src/torture/dbg_tests/basic_stepping_test.c @@ -36,11 +36,11 @@ int foo(); int main() /// 1: step_into { /// 2: at /// 3: step_over - int x = foo(123); /// 4: at + int x = foo(123); /// 4: at /// 5: step_into /// 10: at: -2 /// 11: step_over - printf("Hello, world!\n"); /// 12: at + printf("Hello, world!\n"); /// 12: at /// 13: step_over /// 14: run } From 05fc085dc6831000757ba9ce5e77a3e2c7ef671b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 6 May 2026 16:39:42 -0700 Subject: [PATCH 609/850] new launch target --- launch.vs.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/launch.vs.json b/launch.vs.json index 1b86c5d8..e5caf1c4 100644 --- a/launch.vs.json +++ b/launch.vs.json @@ -4,7 +4,7 @@ "configurations": [ { "type": "cppdbg", - "name": "raddbg", + "name": "launch - torture", "request": "launch", "project": "c://windows//system32//cmd.exe", "cwd": "build/", @@ -22,6 +22,26 @@ { "text": "handle SIGUSR1 nostop" } ], "MIMode": "gdb" + }, + { + "type": "cppdbg", + "name": "launch - raddbg", + "request": "launch", + "project": "c://windows//system32//cmd.exe", + "cwd": "build/", + "program": "/mnt/c/devel/raddebugger/build/raddbg", + //"processId": "65821", + "environment": [], + "externalConsole": false, + "pipeTransport": { + "pipeCwd": "${workspaceRoot}", + "pipeProgram": "wsl", + "pipeArgs": [ "${debuggerCommand}" ] + }, + "setupCommands": [ + { "text": "handle SIGUSR1 nostop" } + ], + "MIMode": "gdb" } ] } From 60a38247afb1ed22778871457e7e374d68e33e7e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 6 May 2026 16:43:06 -0700 Subject: [PATCH 610/850] capture output on linux --- src/torture/torture.c | 181 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 155 insertions(+), 26 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index cd09c6ee..5df6dc68 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -295,7 +295,6 @@ t_cwd_path(void) Temp scratch = scratch_begin(0, 0); String8 cwd = get_current_path(scratch.arena); cwd = str8_chop_last_slash(cwd); - cwd = str8f(scratch.arena, "%S", cwd); MemoryCopyStr8(path, cwd); path[cwd.size] = 0; scratch_end(scratch); @@ -325,7 +324,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) B32 is_ok = 0; // clean up global state - arena_pop_to(g_output_arena, 0); + arena_clear(g_output_arena); MemoryZeroStruct(&g_output); g_last_exit_code = max_U64; @@ -383,12 +382,36 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) for EachElement(i, captures_win32) { read_capture_handles[i] = (File){ (U64)captures_win32[i].read_pipe_handle }; } for EachElement(i, captures_win32) { write_capture_handles[i] = (File){ (U64)captures_win32[i].write_pipe_handle }; } #else -# error NotImplemented + typedef struct { + int fds[2]; + String8List *parts; + B32 is_live; + struct pollfd *poll_fd; + } LinuxCapture; + + LinuxCapture captures_linux[2] = {0}; + for EachElement(i, captures_linux) { + if (pipe2(captures_linux[i].fds, 0) != 0) { + fprintf(stderr, "ERROR: failed to create pipe for output capture\n"); + goto exit; + } + captures_linux[i].is_live = 1; + } + + captures_linux[0].parts = &stdout_parts; + captures_linux[1].parts = &stderr_parts; + + File read_capture_handles[2] = {0}, write_capture_handles[2] = {0}; + read_capture_handles[0].u64[0] = captures_linux[0].fds[0]; + read_capture_handles[1].u64[0] = captures_linux[1].fds[0]; + write_capture_handles[0].u64[0] = captures_linux[0].fds[1]; + write_capture_handles[1].u64[0] = captures_linux[1].fds[1]; #endif // Build Launch Options ProcessLaunchParams launch_opts = { .path = g_wdir, .inherit_env = 1, + .consoleless = 1, .env = env, .stdout_file = write_capture_handles[stdout_idx], .stderr_file = write_capture_handles[stderr_idx], @@ -425,41 +448,41 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) wait_handles[wait_handle_count++] = (HANDLE)process_handle.u64[0]; } - for EachElement(i, captures_win32) { - while (captures_win32[i].state == Win32CaptureState_Null) { + for EachElement(capture_idx, captures_win32) { + while (captures_win32[capture_idx].state == Win32CaptureState_Null) { // init overlapped so when child writes to capture buffer this event is signaled - AssertAlways(ResetEvent(captures_win32[i].event)); - MemoryZeroStruct(&captures_win32[i].overlapped); - captures_win32[i].overlapped.hEvent = captures_win32[i].event; + AssertAlways(ResetEvent(captures_win32[capture_idx].event)); + MemoryZeroStruct(&captures_win32[capture_idx].overlapped); + captures_win32[capture_idx].overlapped.hEvent = captures_win32[capture_idx].event; // begin overlapped read DWORD read_size = 0; - if (ReadFile(captures_win32[i].read_pipe_handle, captures_win32[i].buffer, captures_win32[i].buffer_size, &read_size, &captures_win32[i].overlapped)) { + if (ReadFile(captures_win32[capture_idx].read_pipe_handle, captures_win32[capture_idx].buffer, captures_win32[capture_idx].buffer_size, &read_size, &captures_win32[capture_idx].overlapped)) { if (read_size > 0) { - String8 string = str8(captures_win32[i].buffer, read_size); + String8 string = str8(captures_win32[capture_idx].buffer, read_size); String8 string_copy = str8_copy(scratch.arena, string); - str8_list_push(scratch.arena, captures_win32[i].parts, string_copy); + str8_list_push(scratch.arena, captures_win32[capture_idx].parts, string_copy); } else { - captures_win32[i].state = Win32CaptureState_EOF; + captures_win32[capture_idx].state = Win32CaptureState_EOF; } } else { DWORD error = GetLastError(); if (error == ERROR_IO_PENDING) { - captures_win32[i].state = Win32CaptureState_Pending; + captures_win32[capture_idx].state = Win32CaptureState_Pending; } else { AssertAlways(error == ERROR_HANDLE_EOF || error == ERROR_BROKEN_PIPE); - captures_win32[i].state = Win32CaptureState_EOF; + captures_win32[capture_idx].state = Win32CaptureState_EOF; } break; } } - if (captures_win32[i].state == Win32CaptureState_Pending) { + if (captures_win32[capture_idx].state == Win32CaptureState_Pending) { // event now should signal whenever pipe has data to read - captures_win32[i].wait_idx = wait_handle_count++; - wait_handles[captures_win32[i].wait_idx] = captures_win32[i].event; + captures_win32[capture_idx].wait_idx = wait_handle_count++; + wait_handles[captures_win32[capture_idx].wait_idx] = captures_win32[capture_idx].event; } else { - captures_win32[i].wait_idx = max_U64; + captures_win32[capture_idx].wait_idx = max_U64; } } @@ -469,14 +492,10 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) // compute wait time DWORD wait_ms = INFINITE; if (timeout_us != max_U64) { - U64 now_us = os_now_microseconds(); + U64 now_us = now_time_us(); wait_ms = now_us < endt_us ? ClampTop((endt_us - now_us + 999) / 1000, max_U32-1) : 0; } - if (wait_ms == 0) { - DebugBreakProcess((HANDLE)process_handle.u64[0]); - } - // wait on process and read pipes DWORD wait_result = WaitForMultipleObjects(wait_handle_count, wait_handles, 0, wait_ms); @@ -565,7 +584,117 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) } } #elif OS_LINUX -# error NotImplemented + // close handle so read(2) does not block + for EachElement(i, write_capture_handles) { + close((int)write_capture_handles[i].u64[0]); + MemoryZeroStruct(&write_capture_handles[i]); + } + + pid_t pid = (pid_t)process_handle.u64[0]; + int pidfd = syscall(SYS_pidfd_open, pid, 0); + if (pidfd < 0) { + fprintf(stderr, "ERROR: failed to translate pid(%d) to pidfd\n", pid); + goto exit; + } + + B32 is_process_live = 1; + U64 endt_us = ENDT_US(timeout_us); + U64 read_buffer_default_size = MB(1); + U64 read_buffer_size = read_buffer_default_size; + U8 *read_buffer = push_array(scratch.arena, U8, read_buffer_default_size); + for (;;) { + struct pollfd fds[3] = {0}; + int nfds = 0; + + // append process + if (is_process_live) { + fds[nfds++] = (struct pollfd){ .fd = pidfd, .events = POLLIN | POLLHUP }; + } + + // append pipes + for EachElement(i, captures_linux) { + if (captures_linux[i].is_live) { + captures_linux[i].poll_fd = &fds[nfds]; + fds[nfds++] = (struct pollfd){ .fd = captures_linux[i].fds[0], .events = POLLIN | POLLHUP }; + } + } + + // exit if there are no more handles to poll + if (nfds == 0) { break; } + + // compute wait time + int wait_ms = -1; + if (timeout_us != max_U64) { + U64 now_us = now_time_us(); + wait_ms = now_us < endt_us ? ClampTop((endt_us - now_us + 999) / 1000, max_U32-1) : 0; + } + + // wait for kernel to signal any of the wait handles + int poll_result = poll(fds, nfds, wait_ms); + if (poll_result < 0) { + fprintf(stderr, "ERROR: poll failed with errono %d\n", errno); + break; + } + if (poll_result == 0) { + fprintf(stderr, "WARNING: poll timeout\n"); + break; + } + // handle case where process exited while waiting for a signal + if (is_process_live) { + if (fds[0].revents & POLLIN) { + // reap process + int status; + if (waitpid(pid, &status, 0) >= 0) { + g_last_exit_code = WEXITSTATUS(status); + } else { + fprintf(stderr, "ERROR: failed to reap process %d\n", pid); + } + + // signal on process fd means exit + is_process_live = 0; + } + } + + for EachElement(i, captures_linux) { + if (captures_linux[i].is_live) { + if (captures_linux[i].poll_fd->revents & POLLIN) { + for (;;) { + if (read_buffer_size == 0) { + read_buffer_size = read_buffer_default_size; + read_buffer = push_array(scratch.arena, U8, read_buffer_default_size); + } + + ssize_t read_size = OS_LNX_RETRY_ON_EINTR(read(captures_linux[i].poll_fd->fd, read_buffer, read_buffer_size)); + if (read_size > 0) { + str8_list_push(scratch.arena, captures_linux[i].parts, str8(read_buffer, read_size)); + read_buffer += read_size; + read_buffer_size -= read_size; + } else if (read_size == 0) { + captures_linux[i].is_live = 0; + break; + } else { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + // no more data in the pipe + } else { + fprintf(stderr, "ERROR: failed to read pipe, errno %d\n", errno); + captures_linux[i].is_live = 0; + } + break; + } + } + } + + if (captures_linux[i].poll_fd->revents & POLLHUP) { + captures_linux[i].is_live = 0; + } + } + } + } + + // close process handle + if (close(pidfd) < 0) { + fprintf(stderr, "ERROR: failed to close process handle %d\n", pidfd); + } #endif // update output global @@ -1062,9 +1191,9 @@ t_entry_point(CmdLine *cmdline) } // run test - U64 run_start_time = os_now_microseconds(); + U64 run_start_time = now_time_us(); T_RunResult result = t_run(g_torture_tests[target_idx].r, g_torture_tests[target_idx].user_data); - U64 run_end_time = os_now_microseconds(); + U64 run_end_time = now_time_us(); // print result if (result.status == T_RunStatus_Pass) { fprintf(stdout, "\x1b[32m" "%s" "\x1b[0m", t_string_from_result(result.status)); From de03edc69ebb30069daf83483a8fb4e2a41490dc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 6 May 2026 16:43:49 -0700 Subject: [PATCH 611/850] rename artifact folder so it does not collide with torture program on linux --- src/torture/torture.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index 5df6dc68..b627d141 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -4,7 +4,7 @@ // command line global String8 g_stdout_file_name = str8_lit_comp("torture.out"); global String8 g_wdir; -global String8 g_out = str8_lit_comp("torture"); +global String8 g_out = str8_lit_comp("torture_artifacts"); global B32 g_verbose; global B32 g_redirect_stdout = 1; global B32 g_stop_on_first_fail_or_crash = 1; From 1b868928ea1bd04185a4a8abf968f0a7436426bd Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:01:21 -0700 Subject: [PATCH 612/850] infer path style from top node --- src/radbin/radbin.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 380f46a7..ce798280 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1229,13 +1229,46 @@ rb_thread_entry_point(void *p) RDI_SourceFile *null_inline_src_file = rdi_element_from_name_idx(rdi, SourceFiles, 0); if(inline_src_file && inline_src_file != null_inline_src_file) { - String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, PathStyle_SystemAbsolute, src_file->file_path_node_idx); + // TODO: remove 'path_style' from the str8_from_rdi_path_node_idx and detect + // path style based on the top node "?:" -> windows, "/" -> unix + String8 top_part = {0}; + for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, src_file->file_path_node_idx); + fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0); + fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node)) + { + if(fpn->parent_path_node == 0) + { + top_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &top_part.size); + } + } + PathStyle path_style = PathStyle_SystemAbsolute; + if (str8_match_wildcard(top_part, str8_lit("?:"), 0)) { path_style = PathStyle_WindowsAbsolute; } + else if(str8_match(top_part, str8_lit("/"), 0)) { path_style = PathStyle_UnixAbsolute; } + + String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, path_style, src_file->file_path_node_idx); str8_list_pushf(arena, &output_blobs, "[inlined] %S %S:%u\n", inline_name, path, inline_line.line_num); } } } } - String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, PathStyle_SystemAbsolute, src_file->file_path_node_idx); + + // TODO: remove 'path_style' from the str8_from_rdi_path_node_idx and detect + // path style based on the top node [c:|d:] -> windows, / -> unix + String8 top_part = {0}; + for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, src_file->file_path_node_idx); + fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0); + fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node)) + { + if(fpn->parent_path_node == 0) + { + top_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &top_part.size); + } + } + PathStyle path_style = PathStyle_SystemAbsolute; + if (str8_match_wildcard(top_part, str8_lit("?:"), 0)) { path_style = PathStyle_WindowsAbsolute; } + else if(str8_match(top_part, str8_lit("/"), 0)) { path_style = PathStyle_UnixAbsolute; } + + String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, path_style, src_file->file_path_node_idx); str8_list_pushf(arena, &output_blobs, "%S:%u\n", path, line.line_num); scratch_end(scratch); } From 61724e88ad6d2d8e45b37153d35a340844c36045 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:03:10 -0700 Subject: [PATCH 613/850] event shadowing in dbg engine ctrl causes debugger to return incorrect last event --- src/dbg_engine/dbg_engine_ctrl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 6c1d7947..7314c462 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -6488,7 +6488,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { single_step_ctrls.single_step_thread = event->thread; } - DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); thread_post_rip = d_ip_from_thread(thread); switch(event->kind) { @@ -6576,7 +6576,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) { single_step_ctrls.single_step_thread = target_thread_dmn; } - DMN_Event *event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); + event = d_ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0); thread_post_rip = d_ip_from_thread(target_thread); switch(event->kind) { From 22159ac7791c8ee4caa071651fcfbce4da7db564 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:04:06 -0700 Subject: [PATCH 614/850] delete unnecessary helper --- src/raddbg/raddbg_core.c | 6 ------ src/raddbg/raddbg_core.h | 1 - 2 files changed, 7 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 1806e204..49aa5bf9 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10375,12 +10375,6 @@ rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out) return is_ok; } -internal B32 -rd_ipc_reply_is_ok(RD_IpcReply *reply) -{ - return reply->parse.msgs.worst_message_kind < MD_MsgKind_Error; -} - internal void rd_ipc_reply_push(Arena *arena, String8List *out, char *name, String8 value) { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 0e3ecd64..72ac095f 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -856,7 +856,6 @@ internal B32 rd_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out internal B32 rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out); #define rd_ipc_parse_int(a, b, c) rd_ipc_parse_int_(a, b, sizeof(*c), c) internal B32 rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out); -internal B32 rd_ipc_reply_is_ok(RD_IpcReply *reply); //////////////////////////////// //~ rjf: Main Layer Top-Level Calls From 7c6ad4c56382c0b5b295675d51aff155dc8fc921 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:05:33 -0700 Subject: [PATCH 615/850] add file reserve Linux OS API for radlink --- src/linux/base/linux_base.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 0152d64c..1693aeb5 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -908,6 +908,13 @@ id_from_file(File file) return id; } +internal B32 +file_reserve_size(File file, U64 size) +{ + int status = fallocate((int)file.u64[0], FALLOC_FL_KEEP_SIZE, 0, size); + return status == 0; +} + internal B32 delete_file_at_path(String8 path) { From 3da0b89ac6c68a1d88499832250b21865ba546f8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:06:05 -0700 Subject: [PATCH 616/850] null check semaphore otherwise sem_* crashes --- src/linux/base/linux_base.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 1693aeb5..01abe524 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -662,36 +662,33 @@ semaphore_open(String8 name) internal void semaphore_close(Semaphore semaphore) { - sem_t *s = (sem_t *)semaphore.u64[0]; - sem_close(s); + if(semaphore.u64[0] != 0) + { + sem_t *s = (sem_t *)semaphore.u64[0]; + sem_close(s); + } } internal B32 semaphore_take(Semaphore semaphore, U64 endt_us) { - struct timespec t = { .tv_sec = endt_us / 1000000, .tv_nsec = (endt_us % 1000000) * 1000 }; - int err = OS_LNX_RETRY_ON_EINTR(sem_clockwait((sem_t*)semaphore.u64[0], CLOCK_MONOTONIC, &t)); + int err = -1; + if(semaphore.u64[0] != 0) + { + struct timespec t = { .tv_sec = endt_us / 1000000, .tv_nsec = (endt_us % 1000000) * 1000 }; + err = OS_LNX_RETRY_ON_EINTR(sem_clockwait((sem_t*)semaphore.u64[0], CLOCK_MONOTONIC, &t)); + } return err == 0; } internal void semaphore_drop(Semaphore semaphore) { - for(;;) + int err = -1; + if(semaphore.u64[0] != 0) { - int err = sem_post((sem_t*)semaphore.u64[0]); - if(err == 0) - { - break; - } - else - { - if(errno == EAGAIN) - { - continue; - } - } - break; + err = OS_LNX_RETRY_ON_EINTR(sem_post((sem_t*)semaphore.u64[0])); + Assert(err == 0); } } From d92d2d435d92110f928d1a8ccee785bbac7b4448 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:07:32 -0700 Subject: [PATCH 617/850] enable 16-byte CAS intrinsic --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 2034b72b..a122bc61 100755 --- a/build.sh +++ b/build.sh @@ -19,7 +19,7 @@ git_hash_full=$(git rev-parse HEAD) # --- Compile/Link Line Definitions ------------------------------------------- cc_cflags_gcc="" cc_cflags_clang=${cc_sanitize}" -fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" -cc_common="-I../src/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wall -Wno-missing-braces -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" +cc_common="-I../src/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wall -Wno-missing-braces -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -mcx16" cc_debug="-g -O0 -DBUILD_DEBUG=1 ${cc_common}" cc_release="-g -O2 -DBUILD_DEBUG=0 ${cc_common}" cc_link="-lpthread -lm -lrt -ldl" From fc0b0d15866cd45d42f888d5f6b41fbc7a4db63c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:07:44 -0700 Subject: [PATCH 618/850] more targets --- launch.vs.json | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/launch.vs.json b/launch.vs.json index e5caf1c4..a9cfe1d9 100644 --- a/launch.vs.json +++ b/launch.vs.json @@ -9,7 +9,53 @@ "project": "c://windows//system32//cmd.exe", "cwd": "build/", "program": "torture", - "args": [ "basic_stepping_test-c" ], + "args": [ "d2r_checksums" ], + "stopAtEntry": false, + "environment": [], + "externalConsole": false, + "pipeTransport": { + "pipeCwd": "${workspaceRoot}", + "pipeProgram": "wsl", + "pipeArgs": [ "${debuggerCommand}" ] + }, + "setupCommands": [ + { "text": "-gdb-set follow-fork-mode parent" }, + { "text": "-gdb-set detach-on-fork on" }, + { "text": "handle SIGUSR1 nostop" } + ], + "MIMode": "gdb" + }, + { + "type": "cppdbg", + "name": "launch - radbin", + "request": "launch", + "project": "c://windows//system32//cmd.exe", + "cwd": "build/", + "program": "radbin", + "args": [ "-voff2line", "-voff:0x1000", "torture_artifacts/d2r_line_table/a.rdi" ], + "stopAtEntry": false, + "environment": [], + "externalConsole": false, + "pipeTransport": { + "pipeCwd": "${workspaceRoot}", + "pipeProgram": "wsl", + "pipeArgs": [ "${debuggerCommand}" ] + }, + "setupCommands": [ + { "text": "-gdb-set follow-fork-mode parent" }, + { "text": "-gdb-set detach-on-fork on" }, + { "text": "handle SIGUSR1 nostop" } + ], + "MIMode": "gdb" + }, + { + "type": "cppdbg", + "name": "launch - radlink", + "request": "launch", + "project": "c://windows//system32//cmd.exe", + "cwd": "/mnt/c/devel/raddebugger/build/torture_artifacts/debug_p_sig_mismatch", + "program": "/mnt/c/devel/raddebugger/build/radlink", + "args": [ "/subsystem:console", "/entry:entry", "/out:a.exe", "/debug:full", "a.obj", "b.obj", "entry.obj" ], "stopAtEntry": false, "environment": [], "externalConsole": false, From f59784bba0fab3015f0f2176e8129c4fe8795c61 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:08:37 -0700 Subject: [PATCH 619/850] headers for Linux OS layer --- src/linker/lnk.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 4ce28cc7..c933bd29 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -17,6 +17,8 @@ // --- Code Base --------------------------------------------------------------- #include "base/base_inc.h" +#include "x64/x64.h" +#include "os/os_inc.h" #include "hash_table.h" #include "coff/coff.h" #include "coff/coff_parse.h" @@ -36,6 +38,8 @@ #include "llvm/llvm.h" #include "base/base_inc.c" +#include "x64/x64.c" +#include "os/os_inc.c" #include "hash_table.c" #include "coff/coff.c" #include "coff/coff_parse.c" @@ -5471,4 +5475,3 @@ entry_point(CmdLine *cmdline) lnk_log_end(); scratch_end(scratch); } - From 2ded251f7ec820829d1a31bc8b0a64d009b79af9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:11:34 -0700 Subject: [PATCH 620/850] update stepping test to produce a fixed exe on windows --- src/torture/dbg_tests/basic_stepping_test.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/torture/dbg_tests/basic_stepping_test.c b/src/torture/dbg_tests/basic_stepping_test.c index 1edac62d..ff1043c8 100644 --- a/src/torture/dbg_tests/basic_stepping_test.c +++ b/src/torture/dbg_tests/basic_stepping_test.c @@ -2,8 +2,8 @@ /// windows: { /// compile: "/Od /Z7 /c main.c /Fo:main.obj" /// compile: "/Od /Z7 /c foo.c /Fo:foo.obj" -/// link: "/debug:full /dll foo.obj /out:foo.dll /implib:foo.lib" -/// link: "/debug:full main.obj foo.lib /out:main.exe" +/// link: "/fixed /debug:full /dll foo.obj /out:foo.dll /implib:foo.lib" +/// link: "/fixed /debug:full main.obj foo.lib /out:main.exe" /// launch: "main.exe" /// } /// linux: { @@ -11,6 +11,8 @@ /// launch: "./main" /// } /// } +/// +// TODO: linux: -no-pie crashes the tracer /// file: "foo.c" From 2d99f5600c59cd35740fb6619a0cb70507adb6be Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:12:46 -0700 Subject: [PATCH 621/850] move linker id helper to the main file so we can use it in other torture layers --- src/torture/torture.c | 163 +++++++++++++++++++++------------- src/torture/torture.h | 12 ++- src/torture/torture_radlink.h | 8 -- 3 files changed, 110 insertions(+), 73 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index b627d141..5e34e843 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -8,7 +8,6 @@ global String8 g_out = str8_lit_comp("torture_artifacts"); global B32 g_verbose; global B32 g_redirect_stdout = 1; global B32 g_stop_on_first_fail_or_crash = 1; -global String8 g_linker; global String8 g_test_data; // tests @@ -21,6 +20,13 @@ global Arena *g_output_arena; global String8 g_output; global String8 g_errors; +// tools +global String8 g_radbin_path; +global String8 g_cl_path; +global String8 g_clang_path; +global String8 g_gcc_path; +global String8 g_linker_path; + internal String8 t_test_name_from_idx(Arena *arena, U64 test_idx) { @@ -38,16 +44,6 @@ t_string_from_result(T_RunStatus v) return 0; } -internal T_Linker -t_id_linker(void) -{ - String8 name = str8_chop_last_dot(str8_skip_last_slash(g_linker)); - if (str8_match(name, str8_lit("radlink"), StringMatchFlag_CaseInsensitive)) { return T_Linker_RAD; } - if (str8_match(name, str8_lit("link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_MSVC; } - if (str8_match(name, str8_lit("lld-link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_LLVM; } - return T_Linker_Null; -} - internal void t_break_if_debugger_present(void) { @@ -59,6 +55,16 @@ t_break_if_debugger_present(void) #endif } +internal T_Linker +t_id_linker(void) +{ + String8 name = str8_chop_last_dot(str8_skip_last_slash(g_linker_path)); + if (str8_match(name, str8_lit("radlink"), StringMatchFlag_CaseInsensitive)) { return T_Linker_RAD; } + if (str8_match(name, str8_lit("link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_MSVC; } + if (str8_match(name, str8_lit("lld-link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_LLVM; } + return T_Linker_Null; +} + internal B32 t_write_file_list(String8 name, String8List data) { @@ -131,7 +137,7 @@ t_delete_dir(String8 path) internal String8 t_make_file_path(Arena *arena, String8 name) { - return push_str8f(arena, "%S\\%S", g_wdir, name); + return push_str8f(arena, "%S/%S", g_wdir, name); } internal B32 @@ -156,10 +162,12 @@ t_run_caller(void *raw_ctx) fprintf(stderr, "%.*s", str8_varg(n->string)); } if (g_errors.size) { - fprintf(stderr, "STDERR:\n", str8_varg(g_errors)); + fprintf(stderr, "--- STDERR ---------------------------------------------------------------------\n"); + fprintf(stderr, "%.*s\n", str8_varg(g_errors)); } if (g_output.size) { - fprintf(stderr, "STDOUT:\n", str8_varg(g_output)); + fprintf(stderr, "--- STDOUT ---------------------------------------------------------------------\n"); + fprintf(stderr, "%.*s\n", str8_varg(g_output)); } } scratch_end(scratch); @@ -182,39 +190,71 @@ t_run(T_Run run, String8 user_data) internal String8 t_radbin_path(void) { - local_persist String8 path = {0}; - if (path.size == 0) { + if (g_radbin_path.size == 0) { local_persist U8 buffer[4096]; - ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; - Arena *arena = arena_alloc_(¶ms); + Arena *arena = arena_alloc_(&(ArenaParams){ .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }); #if OS_WINDOWS - path = full_path_from_path(arena, str8_lit("radbin.exe")); + g_radbin_path = full_path_from_path(arena, str8_lit("radbin.exe")); #else - path = full_path_from_path(arena, str8_lit("radbin")); + g_radbin_path = full_path_from_path(arena, str8_lit("radbin")); #endif - AssertAlways(path.size); } - return path; + AssertAlways(g_radbin_path.size); + return g_radbin_path; } internal String8 t_cl_path(void) { - local_persist String8 path = {0}; - if (path.size == 0) { - local_persist U8 buffer[4096]; - ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; - Arena *arena = arena_alloc_(¶ms); + if (g_cl_path.size == 0) { #if OS_WINDOWS - wchar_t full_cl_path[MAX_PATH]; - DWORD full_cl_path_size = SearchPathW(0, L"cl.exe", 0, ArrayCount(full_cl_path), full_cl_path, 0); - path = str8_from_16(arena, str16((U16*)full_cl_path, full_cl_path_size)); + local_persist U8 buffer[4096]; + Arena *arena = arena_alloc_(&(ArenaParams){ .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }); + wchar_t full_path[MAX_PATH]; + DWORD full_path_size = SearchPathW(0, L"cl.exe", 0, ArrayCount(full_path), full_path, 0); + g_cl_path = str8_from_16(arena, str16((U16*)full_path, full_path_size)); #else - path = str8_lit("cl"); + g_cl_path = str8_zero(); #endif - AssertAlways(path.size); } - return path; + AssertAlways(g_cl_path.size); + return g_cl_path; +} + +internal String8 +t_clang_path(void) +{ + if (g_clang_path.size == 0) { +#if OS_WINDOWS + local_persist U8 buffer[4096]; + Arena *arena = arena_alloc_(&(ArenaParams){ .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }); + wchar_t full_path[MAX_PATH]; + DWORD full_path_size = SearchPathW(0, L"clang.exe", 0, ArrayCount(full_path), full_path, 0); + g_clang_path = str8_from_16(arena, str16((U16*)full_path, full_path_size)); +#else + g_clang_path = str8_lit("clang"); +#endif + } + AssertAlways(g_clang_path.size); + return g_clang_path; +} + +internal String8 +t_gcc_path(void) +{ + if (g_gcc_path.size == 0) { +#if OS_WINDOWS + local_persist U8 buffer[4096]; + Arena *arena = arena_alloc_(&(ArenaParams){ .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }); + wchar_t full_path[MAX_PATH]; + DWORD full_path_size = SearchPathW(0, L"gcc.exe", 0, ArrayCount(full_path), full_path, 0); + g_gcc_path = str8_from_16(arena, str16((U16*)full_path, full_path_size)); +#else + g_gcc_path = str8_lit("gcc"); +#endif + } + AssertAlways(g_gcc_path.size); + return g_gcc_path; } internal String8 @@ -255,7 +295,11 @@ internal String8 t_radlink_path(void) { local_persist String8 path = {0}; - if (path.size == 0) { + if(g_linker_path.size != 0) + { + path = g_linker_path; + } + else if (path.size == 0) { local_persist U8 buffer[4096]; ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); @@ -278,9 +322,9 @@ t_raddbg_path(void) ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); #if OS_WINDOWS - path = os_full_path_from_path(arena, str8_lit("raddbg_non_graphical.exe")); + path = full_path_from_path(arena, str8_lit("raddbg.exe")); #else - path = os_full_path_from_path(arena, str8_lit("raddbg_non_graphical")); + path = full_path_from_path(arena, str8_lit("raddbg")); #endif AssertAlways(path.size); } @@ -944,12 +988,15 @@ t_entry_point(CmdLine *cmdline) fprintf(stderr, " %s\n\n", BUILD_TITLE_STRING_LITERAL); fprintf(stderr, " Usage: torture [Options] [Files]\n\n"); fprintf(stderr, " Options:\n"); - fprintf(stderr, " -linker:{path} Path to PE/COFF linker\n"); fprintf(stderr, " -target:{name[,name]} Selects targets to test\n"); fprintf(stderr, " -skip:{name[,name]} Selects targets to skip\n"); fprintf(stderr, " -list Print available test targets and exit\n"); fprintf(stderr, " -out:{path} Directory path for test outputs (default \"%.*s\")\n", str8_varg(g_out)); fprintf(stderr, " -verbose Enable verbose mode\n"); + fprintf(stderr, " -cl:{path} Override default cl path\n"); + fprintf(stderr, " -clang:{path} Override default clang path\n"); + fprintf(stderr, " -gcc:{path} Override default gcc path\n"); + fprintf(stderr, " -linker:{path} Path to PE/COFF linker\n"); fprintf(stderr, " -print_stdout Print to console stdout and stderr of a run\n"); fprintf(stderr, " -help Print help menu and exit\n"); abort_self(0); @@ -972,26 +1019,13 @@ t_entry_point(CmdLine *cmdline) } // - // Handle -linker + // Compiler overrides // - { - CmdLineOpt *linker_opt = cmd_line_opt_from_string(cmdline, str8_lit("linker")); - if (linker_opt == 0) { - linker_opt = cmd_line_opt_from_string(cmdline, str8_lit("l")); - } - if (linker_opt) { - if (linker_opt->value_strings.node_count == 1) { - g_linker = linker_opt->value_string; - } else { - fprintf(stderr, "ERROR: -linker has invalid number of arguments\n"); - abort_self(1); - } - } else { - // assume default linker - g_linker = str8_lit("radlink"); - } - } - + g_cl_path = cmd_line_string(cmdline, str8_lit("cl")); + g_clang_path = cmd_line_string(cmdline, str8_lit("clang")); + g_gcc_path = cmd_line_string(cmdline, str8_lit("gcc")); + g_linker_path = cmd_line_string(cmdline, str8_lit("linker")); + // // Handle -test_data // @@ -1171,14 +1205,15 @@ t_entry_point(CmdLine *cmdline) U64 dots_count = (max_label_size - cstring8_length((U8*)g_torture_tests[target_idx].label)) + dots_min; U64 curr_digit_count = count_digits_u64(i+1, 10); int idx_align_space_count = (int)(max_digit_count - curr_digit_count); - fprintf(stdout, "[%.*s%I64u/%I64u] ", idx_align_space_count, spaces, i+1, target_indices.count); + fprintf(stdout, "[%.*s%llu/%llu] ", idx_align_space_count, spaces, (unsigned long long)i+1, (unsigned long long)target_indices.count); fprintf(stdout, "%s %.*s:: %s", g_torture_tests[target_idx].group, (int)(max_group_size - cstring8_length((U8*)g_torture_tests[target_idx].group)), spaces, g_torture_tests[target_idx].label); fprintf(stdout, " %.*s ", (int)dots_count, dots); - + fflush(stdout); + // setup output directory - g_wdir = push_str8f(scratch.arena, "%S\\%s", g_out, g_torture_tests[target_idx].label); + g_wdir = push_str8f(scratch.arena, "%S/%s", g_out, g_torture_tests[target_idx].label); g_wdir = full_path_from_path(scratch.arena, g_wdir); - + // delete files from last run in the work directory if (folder_path_exists(g_wdir)) { t_delete_dir(g_wdir); @@ -1243,10 +1278,10 @@ t_entry_point(CmdLine *cmdline) PrintHeader("Summary"); U64 total_time_dt = total_time_end - total_time_start; String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); - fprintf(stderr, " Passed %llu\n", pass_count); - fprintf(stderr, " Failed %llu\n", fail_count); - fprintf(stderr, " Crashed %llu\n", crash_count); - fprintf(stderr, " Skipped %llu\n", skip_count); + fprintf(stderr, " Passed %llu\n", (unsigned long long)pass_count); + fprintf(stderr, " Failed %llu\n", (unsigned long long)fail_count); + fprintf(stderr, " Crashed %llu\n", (unsigned long long)crash_count); + fprintf(stderr, " Skipped %llu\n", (unsigned long long)skip_count); fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); fprintf(stderr, "\n"); diff --git a/src/torture/torture.h b/src/torture/torture.h index 6d7e274c..ca49aa43 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -39,6 +39,14 @@ typedef struct String8 user_data; } T_Test; +typedef enum +{ + T_Linker_Null, + T_Linker_RAD, + T_Linker_MSVC, + T_Linker_LLVM +} T_Linker; + extern U64 g_torture_test_count; extern T_Test g_torture_tests[0xffffff]; extern U64 g_torture_running_test_idx; @@ -101,6 +109,8 @@ internal T_RunResult t_run(T_Run run, String8 user_data); internal String8 t_radbin_path(void); internal String8 t_cl_path(void); +internal String8 t_clang_path(void); +internal String8 t_gcc_path(void); internal String8 t_radlink_path(void); internal String8 t_cwd_path(void); internal String8 t_src_path(void); @@ -111,7 +121,7 @@ internal B32 t_invoke_linkerf(char *fmt, ...); internal B32 t_invoke_radbin(char *fmt, ...); internal void t_kill_all(String8 pattern); -#define t_invoke_linker_timeout(c, t) T_Ok(t_invoke(g_linker, c, t)) +#define t_invoke_linker_timeout(c, t) T_Ok(t_invoke(t_radlink_path(), c, t)) #define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(arena, f, ##__VA_ARGS__), t) #define t_invoke_linker(c) t_invoke_linker_timeout(c, max_U64) diff --git a/src/torture/torture_radlink.h b/src/torture/torture_radlink.h index 53858548..17ce34d9 100644 --- a/src/torture/torture_radlink.h +++ b/src/torture/torture_radlink.h @@ -5,14 +5,6 @@ //////////////////////////////// -typedef enum -{ - T_Linker_Null, - T_Linker_RAD, - T_Linker_MSVC, - T_Linker_LLVM -} T_Linker; - typedef enum { T_MsvcLinkExitCode_UnresolvedExternals = 1120, From 14dff337d4afbc7d470c34cd581099890acf373b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:13:19 -0700 Subject: [PATCH 622/850] disable radlink tests for windows --- src/torture/torture_radlink.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 4ddefb54..764f5ae3 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -2511,6 +2511,7 @@ TEST(simple_lib_test) T_Ok(*data_addr32nb == data_sect->voff); } +#if OS_WINDOWS TEST(import_export) { // write objs @@ -2705,10 +2706,8 @@ TEST(import_export) T_Ok(export_table.exports[2].ordinal == 4); T_Ok(export_table.exports[3].ordinal == 1); } - } - #if OS_WINDOWS { T_Ok(SetDllDirectoryA((LPCSTR)g_wdir.str)); HANDLE export_dll = LoadLibrary("export.dll"); @@ -2732,11 +2731,11 @@ TEST(import_export) T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(7))); T_Ok(GetProcAddress(export_dll, MAKEINTRESOURCE(8))); } - #endif //T_Ok(t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /delayload:export.dll /export:entry kernel32.Lib delayimp.lib libcmt.lib export.lib import.obj entry.obj") == 0); // TODO: check import table } +#endif TEST(image_base) { @@ -3929,6 +3928,7 @@ TEST(communal_var_vs_regular_comdat) } } +#if OS_WINDOWS TEST(import_kernel32) { T_Ok(t_write_def_obj("import.obj", (T_COFF_DefObj){ @@ -3978,7 +3978,6 @@ TEST(import_kernel32) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /fixed import.obj kernel32.lib"); T_Ok(g_last_exit_code == 0); -#if OS_WINDOWS { String8 test_file_path = push_str8f(arena, "%S/test", g_wdir); delete_file_at_path(test_file_path); @@ -3994,7 +3993,6 @@ TEST(import_kernel32) T_Ok(exit_code == 0); T_Ok(file_path_exists(test_file_path)); } -#endif } TEST(delay_import) @@ -4210,6 +4208,8 @@ TEST(delay_import_user32) T_Ok(g_last_exit_code == 0); } +#endif + TEST(empty_section) { T_Ok(t_write_def_obj("empty_section.obj", (T_COFF_DefObj){ From f3c631973b54f8cb44371f3b51010f5fb6594934 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:15:42 -0700 Subject: [PATCH 623/850] various fixes in torture for Linux compatibility --- src/linker/lnk_debug_info.c | 6 +- src/torture/torture.h | 8 +++ src/torture/torture_d2r.c | 28 +++++----- src/torture/torture_dbg.c | 107 +++++++++++++++++++++++++++--------- src/torture/torture_dbg.h | 5 ++ src/torture/torture_dwarf.c | 2 +- 6 files changed, 113 insertions(+), 43 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 4d4c77e0..7176e96e 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -1692,7 +1692,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) B32 is_lambda = colon_pos != 0; if (is_lambda) { - U64 size = raddbg_snprintf(temp, sizeof(temp), "%llx", name_hash); + U64 size = raddbg_snprintf(temp, sizeof(temp), "%llx", (long long)name_hash); Assert(size < udt_info.name.size); Assert(size < udt_info.unique_name.size); MemoryCopy(udt_info.name.str, temp, size+1); @@ -1712,7 +1712,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task) } else { // replace uniuqe type name with hash udt_info.unique_name.str = udt_info.name.str + udt_info.name.size + 1; - udt_info.unique_name.size = raddbg_snprintf((char *)udt_info.unique_name.str, udt_info.unique_name.size, "%llx", name_hash); + udt_info.unique_name.size = raddbg_snprintf((char *)udt_info.unique_name.str, udt_info.unique_name.size, "%llx", (long long)name_hash); // update leaf header U64 new_size = sizeof(CV_LeafKind) + @@ -1778,7 +1778,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task) } // replace name with hash - udt_info.name.size = raddbg_snprintf((char *)udt_info.name.str, udt_info.name.size, "%llx", name_hash); + udt_info.name.size = raddbg_snprintf((char *)udt_info.name.str, udt_info.name.size, "%llx", (long long)name_hash); // parse struct size CV_NumericParsed dummy; diff --git a/src/torture/torture.h b/src/torture/torture.h index ca49aa43..ecc383a8 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -39,6 +39,14 @@ typedef struct String8 user_data; } T_Test; +typedef enum +{ + T_Compiler_Null, + T_Compiler_Cl, + T_Compiler_Clang, + T_Compiler_Gcc, +} T_Compiler; + typedef enum { T_Linker_Null, diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 98b23d9f..af7e5a74 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -151,19 +151,21 @@ dw_writer_tag_end(writer); \ RDI_ParsedNameMap types_map = {0}; rdi_parsed_from_name_map(rdi, types_nm, &types_map); -#define TestBuiltinType(n, bs, r) \ -do { \ -RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ -T_Ok(alias); \ -T_Ok(alias->kind == RDI_TypeKind_Alias); \ -T_Ok(alias->flags == 0); \ -T_Ok(alias->byte_size == bs); \ -RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, alias->user_defined.direct_type_idx); \ -T_Ok(type); \ -T_Ok(type->kind == RDI_TypeKind_##r); \ -T_Ok(type->flags == 0); \ -T_Ok(type->byte_size == alias->byte_size); \ -T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8_lit(Stringify(r)), 0)); \ +#define TestBuiltinType(n, bs, r) \ +do { \ + RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ + T_Ok(alias); \ + T_Ok(alias->kind == RDI_TypeKind_Alias); \ + T_Ok(alias->flags == 0); \ + T_Ok(alias->byte_size == bs); \ + RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, alias->user_defined.direct_type_idx); \ + T_Ok(type); \ + T_Ok(type->kind == RDI_TypeKind_##r); \ + T_Ok(type->flags == 0); \ + T_Ok(type->byte_size == alias->byte_size); \ + U64 expected_name_size = 0; \ + U8 *expected_name = rdi_string_from_type_kind(RDI_TypeKind_##r, &expected_name_size); \ + T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8(expected_name, expected_name_size), 0)); \ } while (0) TestBuiltinType("char", 1, Char8); TestBuiltinType("char8_t", 1, UChar8); diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 46a15c7a..d6f6aaa4 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -5,6 +5,8 @@ #define T_Dbg_DefaultTimeout TIMEOUT_SEC(5) +extern B32 g_stop_on_first_fail_or_crash; + //////////////////////////////// // IPC Controller @@ -40,10 +42,15 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep // parse reply Arena *a = reply_arena ? reply_arena : scratch.arena; String8 reply_text = str8_copy(a, g_output); - //fprintf(stderr, "Reply: %.*s\n", str8_varg(reply_text)); RD_IpcReply reply = rd_ipc_mdesk_reply_from_string(a, reply_text); - if (rd_ipc_reply_is_ok(&reply) == 0) { goto exit; } - if (md_node_is_nil(reply.msg)) { goto exit; } + + //fprintf(stderr, "Reply: %.*s\n", str8_varg(reply_text)); + + // validate reply + if (reply.parse.msgs.worst_message_kind >= MD_MsgKind_Error) { goto exit; } + if (md_node_is_nil(reply.msg)) { goto exit; } + //if ( ! str8_matchi(reply.parse.root->first->string, cmd)) { Assert(0); goto exit; } + if (reply_arena && reply_out) { *reply_out = reply; } } @@ -70,21 +77,26 @@ internal B32 t_dbg_status(T_DbgStatus *status_out, U64 timeout_us) { Temp scratch = scratch_begin(0, 0); + + B32 is_ok = 0; T_DbgStatus status = {0}; - B32 is_ok = 0; // send status request RD_IpcReply reply = {0}; if ( ! t_dbg_send_cmd(str8_lit("status"), timeout_us, scratch.arena, &reply)) { goto exit; } // parse reply - if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("running"), &status.running)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int(reply.msg, str8_lit("run_gen"), &status.run_gen)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int(reply.msg, str8_lit("ip"), &status.ip)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("ok"), &is_ok)) { fprintf(stderr, "ERROR: failed to parse reply member: ok\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("running"), &status.running)) { fprintf(stderr, "ERROR: failed to parse reply member: running\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_int(reply.msg, str8_lit("run_gen"), &status.run_gen)) { fprintf(stderr, "ERROR: failed to parse reply member: run_gen\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_int(reply.msg, str8_lit("ip"), &status.ip)) { fprintf(stderr, "ERROR: failed to parse reply member: ip\n"); Assert(0); goto exit; } if (status_out != 0) { *status_out = status; } exit:; + if ( ! is_ok && reply.parse.root) { + fprintf(stderr, "\tReply: %.*s\n", str8_varg(reply.parse.root->raw_string)); + } + scratch_end(scratch); return is_ok; } @@ -230,9 +242,9 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) printf(" IP: %.*s\n", str8_varg(ip)); printf(" SP: %.*s\n", str8_varg(sp)); printf(" File Path: %.*s\n", str8_varg(loc.file_path)); - printf(" Line: %lld\n", loc.pt.line); - printf(" Column: %lld\n", loc.pt.column); - printf(" Run Gen: %llu\n", status.run_gen); + printf(" Line: %lld\n", (long long)loc.pt.line); + printf(" Column: %lld\n", (long long)loc.pt.column); + printf(" Run Gen: %llu\n", (unsigned long long)status.run_gen); printf(" Stop Cause: \"%.*s\"\n", str8_varg(last_stop.stop_cause)); fflush(stdout); } @@ -256,15 +268,15 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user")); String8 project_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_project")); - cmdline = str8f(scratch.arena, "--gen_crash_dump --user:\"%S\" --project:\"%S\" %S", user_path, project_path, cmdline); + cmdline = str8f(scratch.arena, "%S --gen_crash_dump --user:\"%S\" --project:\"%S\" --logs:\"%S\" %S", t_raddbg_path(), user_path, project_path, g_wdir, cmdline); // launch debugger OS_ProcessLaunchParams launch_opts = { .path = g_wdir, .inherit_env = 1, + .consoleless = 1, .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), }; - str8_list_push_front(scratch.arena, &launch_opts.cmd_line, t_raddbg_path()); OS_Handle dbg_handle = os_process_launch(&launch_opts); if (os_handle_match(dbg_handle, os_handle_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } @@ -272,7 +284,7 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) // cache debugger PID g_dbg_pid = GetProcessId((HANDLE)dbg_handle.u64[0]); #elif OS_LINUX - g_dbg_pid = safe_cast_u32(handle.u64[0]); + g_dbg_pid = (int)dbg_handle.u64[0]; #else # error NotImplemented #endif @@ -307,10 +319,10 @@ t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) B32 is_ok = t_dbg_send_cmd(cmd, T_Dbg_DefaultTimeout, arena, &reply); T_Eval e = {0}; - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("value"), &e.value)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("type"), &e.type)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("error"), &e.error)) { AssertAlways(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { fprintf(stderr, "ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("value"), &e.value)) { fprintf(stderr, "ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("type"), &e.type)) { fprintf(stderr, "ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("error"), &e.error)) { fprintf(stderr, "ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } if (eval_out) { *eval_out = e; } exit:; @@ -511,7 +523,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source) p->file = file; hash_table_push_u64_raw(scratch.arena, ht, order, p); } else { - fprintf(stderr, "ERROR: duplicate order number %llu found on line %llu\n", order, p->line); + fprintf(stderr, "ERROR: duplicate order number %llu found on line %llu\n", (unsigned long long)order, (unsigned long long)p->line); } MD_Node *cmd_name = n->first; @@ -574,12 +586,24 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) case T_DbgScriptCmdKind_ClearBreakpoints: t_dbg_send_cmdf(0,0,0, "clear_breakpoints"); break; case T_DbgScriptCmdKind_Run: t_dbg_send_cmd(str8_lit("run"), timeout_us, 0, 0); break; case T_DbgScriptCmdKind_At: { - // map IP -> source location + // TODO: debugger does not populate eval cache with registers before first frame, + // so this racy, for now use lower level option +#if 0 U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); if (ip == 0) { fprintf(stderr, "ERROR: invalid IP address: 0x%llx\n", (unsigned long long)ip); goto exit; } +#else + T_DbgStatus temp_status = {0}; + if ( ! t_dbg_status(&temp_status, T_Dbg_DefaultTimeout)) { + fprintf(stderr, "ERROR: failed to query IP\n"); + goto exit; + } + U64 ip = temp_status.ip; +#endif + + // map IP -> source location T_DbgSourceLocation loc = {0}; if (t_dbg_src_line(scratch.arena, ip, &loc, T_Dbg_DefaultTimeout) == 0) { fprintf(stderr, "ERROR: failed to map IP (0x%llx) to source location\n", (unsigned long long)ip); @@ -597,8 +621,9 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) if (mismatch) { fprintf(stderr, "ERROR: location check did not pass:\n"); fprintf(stderr, " Script : %.*s\n", str8_varg(script->file_path)); - fprintf(stderr, " Expected: %.*s:%llu\n", str8_varg(program->file->path), at_line_u64); - fprintf(stderr, " Got : %.*s:%llu\n", str8_varg(loc.file_path), loc.pt.line); + fprintf(stderr, " Expected: %.*s:%llu\n", str8_varg(program->file->path), (unsigned long long)at_line_u64); + fprintf(stderr, " Got : %.*s:%llu\n", str8_varg(loc.file_path), (unsigned long long)loc.pt.line); + fprintf(stderr, " IP : 0x%llx\n", (unsigned long long)ip); goto exit; } } break; @@ -619,6 +644,11 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) internal T_RunSig(dbg_script_runner) { + if ( ! os_file_path_exists(t_raddbg_path())) { + fprintf(stderr, "ERROR: failed to find debugger \"%.*s\"\n", str8_varg(t_raddbg_path())); + T_Ok(0); + } + // read source file String8 source = os_data_from_file_path(arena, user_data); if (source.size == 0) { @@ -632,18 +662,43 @@ T_RunSig(dbg_script_runner) // write source files to test folder for EachNode(file, T_DbgScriptFile, script.files.first) { if (os_write_data_to_file_path(file->path, file->source) == 0) { - fprintf(stderr, "ERROR: %.*s:%llu: failed to write: \"%.*s\"\n", str8_varg(user_data), file->line, str8_varg(file->path)); + fprintf(stderr, "ERROR: %.*s:%llu: failed to write: \"%.*s\"\n", str8_varg(user_data), (unsigned long long)file->line, str8_varg(file->path)); T_Ok(0); } } // run compilers - String8 compiler_path = t_cl_path(); for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Compile].first) { + T_Compiler compiler = directive->compile.compiler; + + // pick default compiler if none selected + if (compiler == T_Compiler_Null) { + switch (OperatingSystem_CURRENT) { + case OperatingSystem_Windows: { compiler = T_Compiler_Cl; } break; + case OperatingSystem_Linux: { compiler = T_Compiler_Clang; } break; + } + } + + // get compiler path + String8 compiler_path = {0}; + switch (compiler) { + case T_Compiler_Null: break; + case T_Compiler_Cl: compiler_path = t_cl_path(); break; + case T_Compiler_Clang: compiler_path = t_clang_path(); break; + case T_Compiler_Gcc: compiler_path = t_gcc_path(); break; + } + + // invoke compiler with arguments from directive if (t_invoke(compiler_path, directive->args, max_U64) == 0) { fprintf(stderr, "ERROR: failed to launch compiler: \"%.*s %.*s\"\n", str8_varg(compiler_path), str8_varg(directive->args)); T_Ok(0); } + if (g_last_exit_code) { + fprintf(stderr, "ERROR: %.*s\n", str8_varg(g_output)); + if (g_stop_on_first_fail_or_crash) { + T_Ok(0); + } + } } // run linkers @@ -697,12 +752,12 @@ t_dbg_register_script_tests(Arena *arena, String8 folder_path) String8 file_path = n->string; // test files may contain dots for extensions we have to escape them when creating output folder for a test - String8List file_name_parts = str8_split(scratch.arena, str8_skip_last_slash(file_path), ".", 1, 0); + String8List file_name_parts = str8_split_by_string_chars(scratch.arena, str8_skip_last_slash(file_path), str8_lit("."), 0); String8 file_name_escaped = str8_list_join(arena, &file_name_parts, &(StringJoin){.sep=str8_lit("-"), .post = str8_lit("\0") }); g_torture_tests[g_torture_test_count++] = (T_Test){ .group = T_Group, - .label = file_name_escaped.str, + .label = (char*)file_name_escaped.str, .r = t_dbg_script_runner, .user_data = str8_copy(arena, file_path), }; diff --git a/src/torture/torture_dbg.h b/src/torture/torture_dbg.h index 7267a98d..85366d9b 100644 --- a/src/torture/torture_dbg.h +++ b/src/torture/torture_dbg.h @@ -86,6 +86,11 @@ typedef struct T_DbgScriptDirective T_DbgScriptDirectiveKind kind; U64 line; String8 args; + union { + struct { + T_Compiler compiler; + } compile; + }; } T_DbgScriptDirective; typedef struct diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 5d346368..46d2d185 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -120,7 +120,7 @@ dw_input_from_writer(Arena *arena, DW_Writer *writer) String8 raw_coff = coff_from_obj(scratch.arena, obj); t_write_file(str8_lit("dwarf.obj"), raw_coff); - t_invoke(str8_lit("radlink"), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full dwarf.obj"), max_U64); + t_invoke(t_radlink_path(), str8_lit("/subsystem:console /entry:entry /out:a.exe /debug:full dwarf.obj"), max_U64); delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); String8 exe = t_read_file(arena, str8_lit("a.exe")); From 2102239b810d2a5f250846c5afc1adf07dce5a12 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:19:54 -0700 Subject: [PATCH 624/850] make test ignore slashes --- src/torture/torture_radlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 764f5ae3..3e8a7d21 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -5022,7 +5022,7 @@ TEST(debug_p_sig_mismatch) String8 output = g_errors; while (output.size) { String8 line = t_chop_line(&output); - found_error = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive); + found_error = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); if (found_error) { break; } } T_Ok(found_error); From 857ab15aaaca094445825a62d27d7c859cd64711 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:28:31 -0700 Subject: [PATCH 625/850] hack-in temp backslash for windows --- src/torture/torture.c | 4 ++++ src/torture/torture_radlink.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index 5e34e843..b2ff533e 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -137,7 +137,11 @@ t_delete_dir(String8 path) internal String8 t_make_file_path(Arena *arena, String8 name) { +#if OS_WINDOWS + return push_str8f(arena, "%S\\%S", g_wdir, name); +#else return push_str8f(arena, "%S/%S", g_wdir, name); +#endif } internal B32 diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 3e8a7d21..a53ba3b8 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -5134,7 +5134,7 @@ TEST(debug_p_and_debug_t_in_obj) String8 expected_line = str8f(arena, "Warning(%03d): %S: multiple sections with debug types detected, obj must have either .debug$T or .debug$P; discarding both sections", LNK_Warning_MultipleDebugTAndDebugP, pch_obj_path); while (output.size) { String8 line = t_chop_line(&output); - found_warning = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive); + found_warning = str8_match(line, expected_line, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); if (found_warning) { break; } } T_Ok(found_warning); From e17bcd3058350bbe55a16b55e4f83f2e8b05d730 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 7 May 2026 17:48:27 -0700 Subject: [PATCH 626/850] switch for launching debugger with window --- src/torture/torture.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index b2ff533e..3a959839 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -21,6 +21,7 @@ global String8 g_output; global String8 g_errors; // tools +global B32 g_dbg_graphical; global String8 g_radbin_path; global String8 g_cl_path; global String8 g_clang_path; @@ -325,10 +326,13 @@ t_raddbg_path(void) local_persist U8 buffer[4096]; ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); + String8 raddbg_base_name = g_dbg_graphical ? str8_lit("raddbg") : str8_lit("raddbg_non_graphical"); #if OS_WINDOWS - path = full_path_from_path(arena, str8_lit("raddbg.exe")); + Temp scratch = scratch_begin(0, 0); + path = full_path_from_path(arena, str8f(scratch.arena, "%S.exe", raddbg_base_name)); + scratch_end(scratch); #else - path = full_path_from_path(arena, str8_lit("raddbg")); + path = full_path_from_path(arena, raddbg_base_name); #endif AssertAlways(path.size); } @@ -1001,6 +1005,7 @@ t_entry_point(CmdLine *cmdline) fprintf(stderr, " -clang:{path} Override default clang path\n"); fprintf(stderr, " -gcc:{path} Override default gcc path\n"); fprintf(stderr, " -linker:{path} Path to PE/COFF linker\n"); + fprintf(stderr, " --dbg_graphical Launch debugger with window\n"); fprintf(stderr, " -print_stdout Print to console stdout and stderr of a run\n"); fprintf(stderr, " -help Print help menu and exit\n"); abort_self(0); @@ -1025,10 +1030,11 @@ t_entry_point(CmdLine *cmdline) // // Compiler overrides // - g_cl_path = cmd_line_string(cmdline, str8_lit("cl")); - g_clang_path = cmd_line_string(cmdline, str8_lit("clang")); - g_gcc_path = cmd_line_string(cmdline, str8_lit("gcc")); - g_linker_path = cmd_line_string(cmdline, str8_lit("linker")); + g_dbg_graphical = cmd_line_has_flag(cmdline, str8_lit("dbg_graphical")); + g_cl_path = cmd_line_string(cmdline, str8_lit("cl")); + g_clang_path = cmd_line_string(cmdline, str8_lit("clang")); + g_gcc_path = cmd_line_string(cmdline, str8_lit("gcc")); + g_linker_path = cmd_line_string(cmdline, str8_lit("linker")); // // Handle -test_data From bcf248682caa12864cabe6c70a63a00192104e81 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 01:25:42 -0700 Subject: [PATCH 627/850] guard against relative path nodes --- src/radbin/radbin.c | 4 ++-- src/rdi/rdi_local.c | 4 +++- src/rdi_from_dwarf/rdi_from_dwarf.c | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index ce798280..1704ddef 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1243,7 +1243,7 @@ rb_thread_entry_point(void *p) } PathStyle path_style = PathStyle_SystemAbsolute; if (str8_match_wildcard(top_part, str8_lit("?:"), 0)) { path_style = PathStyle_WindowsAbsolute; } - else if(str8_match(top_part, str8_lit("/"), 0)) { path_style = PathStyle_UnixAbsolute; } + else if(str8_match_wildcard(top_part, str8_lit("/*"), 0)) { path_style = PathStyle_UnixAbsolute; } String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, path_style, src_file->file_path_node_idx); str8_list_pushf(arena, &output_blobs, "[inlined] %S %S:%u\n", inline_name, path, inline_line.line_num); @@ -1266,7 +1266,7 @@ rb_thread_entry_point(void *p) } PathStyle path_style = PathStyle_SystemAbsolute; if (str8_match_wildcard(top_part, str8_lit("?:"), 0)) { path_style = PathStyle_WindowsAbsolute; } - else if(str8_match(top_part, str8_lit("/"), 0)) { path_style = PathStyle_UnixAbsolute; } + else if(str8_match_wildcard(top_part, str8_lit("/*"), 0)) { path_style = PathStyle_UnixAbsolute; } String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, path_style, src_file->file_path_node_idx); str8_list_pushf(arena, &output_blobs, "%S:%u\n", path, line.line_num); diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index b575ea3e..d99f00be 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -61,7 +61,9 @@ str8_from_rdi_path_node_idx(Arena *arena, RDI_Parsed *rdi, PathStyle path_style, { String8 path_part = {0}; path_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &path_part.size); - str8_list_push_front(scratch.arena, &path_parts, path_part); + String8List s = str8_split_path(scratch.arena, path_part); + str8_list_concat_in_place(&s, &path_parts); + path_parts = s; } String8 path = str8_path_list_join_by_style(arena, &path_parts, path_style); scratch_end(scratch); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 36fd2e51..30315302 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2862,8 +2862,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) String8 path; { Temp temp = temp_begin(scratch.arena); - PathStyle path_style = PathStyle_Null; - path_style = path_style_from_str8(lookup->vm->header.dir_table.v[src->dir_idx]); + PathStyle path_style = path_style_from_str8(lookup->vm->header.dir_table.v[src->dir_idx]); if (path_style == PathStyle_Relative) { path_style = path_style_from_str8(src->path); } From e92947057d65625981535e4b28db61e2c1e65c38 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 01:45:01 -0700 Subject: [PATCH 628/850] workaround os_get_current_path --- src/torture/torture.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index 3a959839..9bc1a1d0 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -346,7 +346,15 @@ t_cwd_path(void) if (path[0] == 0) { Temp scratch = scratch_begin(0, 0); String8 cwd = get_current_path(scratch.arena); - cwd = str8_chop_last_slash(cwd); + + // TODO: linux and windows return two different things, we need to settle what to do here + // should get_current_path return directory paths with slash or no slash + if ((str8_match_wildcard(cwd, str8_lit("*\\"), 0) && str8_match_wildcard(cwd, str8_lit("*/"), 0))) { + cwd = str8_chop_last_slash(cwd); + cwd = str8_chop_last_slash(cwd); + } else { + cwd = str8_chop_last_slash(cwd); + } MemoryCopyStr8(path, cwd); path[cwd.size] = 0; scratch_end(scratch); From ffe18834dd9cf13539e8ef39ae10ef62a20f64a0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 01:45:24 -0700 Subject: [PATCH 629/850] run tests on Linux --- run_tests.sh | 12 ++++++++++++ src/torture/torture.c | 14 +++++++++----- src/torture/torture_d2r.c | 14 +++++++++++++- src/torture/torture_dbg.c | 6 +++++- 4 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 run_tests.sh diff --git a/run_tests.sh b/run_tests.sh new file mode 100644 index 00000000..6713d22f --- /dev/null +++ b/run_tests.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -eu +cd "$(dirname "$0")" + +# compile our targets +./build.sh raddbg raddbg_non_graphical radlink radbin torture + +# run torture +cd build +./torture +cd .. + diff --git a/src/torture/torture.c b/src/torture/torture.c index 9bc1a1d0..6ffa0086 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -167,12 +167,10 @@ t_run_caller(void *raw_ctx) fprintf(stderr, "%.*s", str8_varg(n->string)); } if (g_errors.size) { - fprintf(stderr, "--- STDERR ---------------------------------------------------------------------\n"); - fprintf(stderr, "%.*s\n", str8_varg(g_errors)); + fprintf(stderr, "stderr: \"%.*s\"\n", str8_varg(g_errors)); } if (g_output.size) { - fprintf(stderr, "--- STDOUT ---------------------------------------------------------------------\n"); - fprintf(stderr, "%.*s\n", str8_varg(g_output)); + fprintf(stderr, "stdout: \"%.*s\"\n", str8_varg(g_output)); } } scratch_end(scratch); @@ -355,6 +353,7 @@ t_cwd_path(void) } else { cwd = str8_chop_last_slash(cwd); } + MemoryCopyStr8(path, cwd); path[cwd.size] = 0; scratch_end(scratch); @@ -1325,7 +1324,12 @@ t_entry_point(CmdLine *cmdline) (int)(label_max - strlen(g_torture_tests[s.target_idx].label)) + 4, dots, str8_varg(elapsed_time)); } - + + if (pass_count == target_indices.count) { + fprintf(stdout, "\n \x1b[32m" "%s" "\x1b[0m\n\n", "All Tests Passed!"); + fprintf(stderr, "--------------------------------------------------------------------------------\n"); + } + fprintf(stderr, "\n"); } diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index af7e5a74..1382ed41 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -279,7 +279,19 @@ TEST(d2r_line_table) for EachIndex(k, test_table[i].line_size) { t_invoke_radbin("-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); T_Ok(g_last_exit_code == 0); - T_MatchLinef(&g_output, "%S:%llu", test_table[i].file->path, test_table[i].ln); + + if ( ! t_match_linef(&g_output, "%S:%llu", test_table[i].file->path, test_table[i].ln)) { + + fprintf(stderr, + "ERROR: conversion produced unexpected lines for voff 0x%llx\n" \ + "\tExpected: %.*s:%llu\n" \ + "\tGot: %.*s\n", + (unsigned long long)test_table[i].voff, + str8_varg(test_table[i].file->path), (unsigned long long)test_table[i].ln, + str8_varg(g_output)); + + T_Ok(0); + } } } diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index d6f6aaa4..184dc363 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -742,7 +742,11 @@ internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path) { Temp scratch = scratch_begin(&arena, 1); - AssertAlways(os_folder_path_exists(folder_path)); + + if ( ! os_folder_path_exists(folder_path)) { + fprintf(stderr, "ERROR: this folder does not exists: %.*s\n", str8_varg(folder_path)); + return; + } // gather file paths in a folder String8List paths = t_file_paths_from_dir(arena, folder_path); From 388bbb95a5e52fa1bf964958a767660e76c64fc8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 01:49:09 -0700 Subject: [PATCH 630/850] update nuke --- run_tests.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_tests.bat b/run_tests.bat index d3c7f1d6..08ec4987 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -20,7 +20,7 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( echo Build %%c+%%m rem nuke artifacts from last run - rmdir /s /q build\torture + rmdir /s /q build\torture_artifacts if "%%c" equ "clang" ( set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;!PATH! From 7b2743a4d69b5731f21be0d0dea55b04f8dfe5c0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 01:54:37 -0700 Subject: [PATCH 631/850] enable stepping test --- .github/workflows/builds.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index c2b83301..108c4dca 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -68,7 +68,7 @@ jobs: call build meta raddbg_non_graphical || exit /b 1 call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 cd build - torture --gen_crash_dump -s:Dbg* || exit /b 1 + torture --gen_crash_dump || exit /b 1 - name: upload torture crash dumps if: failure() uses: actions/upload-artifact@v7 From b4cfc614088cd515a004f69219897aca04bfe362 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 13:17:12 -0700 Subject: [PATCH 632/850] add Ubuntu build and torture steps to GH actions --- .github/workflows/builds.yml | 239 +++++++++++++++++++++++------------ build.bat | 2 +- build.sh | 4 +- run_tests.bat | 2 +- run_tests.sh | 25 +++- 5 files changed, 179 insertions(+), 93 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 108c4dca..ab651b42 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -1,83 +1,156 @@ -name: builds - -on: - push: - paths-ignore: - - '**.md' - pull_request: - paths-ignore: - - '**.md' - -jobs: - build-windows-2022: - runs-on: windows-2022 - strategy: - fail-fast: false - matrix: - target: - - raddbg - - radlink - - radbin - - mule_main - compiler: - - msvc - - clang - mode: - - debug - - release - steps: - - name: checkout - uses: actions/checkout@v6 - - name: build (vs 2022) - shell: cmd - run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - call build meta "${{ matrix.target }}" "${{ matrix.compiler }}" "${{ matrix.mode }}" || exit /b 1 - - run-torture: - runs-on: windows-2022 - strategy: - fail-fast: false - matrix: - compiler: - - msvc - - clang - mode: - - debug - - release - exclude: - - { compiler: clang, mode: release } # clang runs OOM in release with ASAN - steps: - - name: checkout - uses: actions/checkout@v6 - - name: run-torture - shell: cmd - run: | - rem find path to clang - for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi - - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - - rem set clang path before MSVC's clang path - set PATH=%clang_path%;%PATH% - - rem parse out clang version number out of --version to build path to the folder with ASAN DLL - for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v - if "${{matrix.compiler}}" == "clang" set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;%PATH% - - call build meta raddbg_non_graphical || exit /b 1 - call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 - cd build - torture --gen_crash_dump || exit /b 1 - - name: upload torture crash dumps - if: failure() - uses: actions/upload-artifact@v7 - with: - name: torture-crash-dumps-${{ matrix.compiler }}-${{ matrix.mode }} - path: | - build/*.dmp - build/*.exe - build/*.pdb - build/torture - if-no-files-found: ignore - +name: builds + +on: + push: + paths-ignore: + - '**.md' + pull_request: + paths-ignore: + - '**.md' + +jobs: + build-ubuntu-24-04: + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + target: + - raddbg + - raddbg_non_graphical + - radlink + - radbin + - torture + compiler: + - clang-22 + # TODO: - gcc + mode: + - debug + - release + steps: + - name: checkout + uses: actions/checkout@v6 + - name: install dependencies + shell: bash + run: | + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo apt-add-repository -y "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-22 main" + sudo apt-get update + sudo apt-get install -y clang-22 lld-22 llvm-22 gcc-14 pkg-config libfreetype6-dev libx11-dev libxext-dev libgl1-mesa-dev libegl1-mesa-dev + sudo ln -s /usr/bin/llvm-symbolizer-22 /usr/bin/llvm-symbolizer + - name: build + shell: bash + run: | + CC="${{ matrix.compiler }}" ./build.sh "${{ matrix.target }}" "${{ matrix.mode }}" + + build-windows-2022: + runs-on: windows-2022 + strategy: + fail-fast: false + matrix: + target: + - raddbg + - radlink + - radbin + - mule_main + compiler: + - msvc + - clang + mode: + - debug + - release + steps: + - name: checkout + uses: actions/checkout@v6 + - name: build (vs 2022) + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 + call build meta "${{ matrix.target }}" "${{ matrix.compiler }}" "${{ matrix.mode }}" || exit /b 1 + + run-torture-ubuntu-24-04: + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + compiler: + - clang-22 + # TODO: - gcc + mode: + - debug + # TODO: - release + steps: + - name: checkout + uses: actions/checkout@v6 + - name: install external libraries + shell: bash + run: | + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo apt-add-repository -y "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-22 main" + sudo apt-get update + sudo apt-get install -y clang-22 lld-22 llvm-22 gcc-14 pkg-config libfreetype6-dev libx11-dev libxext-dev libgl1-mesa-dev libegl1-mesa-dev + sudo ln -s /usr/bin/llvm-symbolizer-22 /usr/bin/llvm-symbolizer + - name: run-torture + shell: bash + run: | + CC="${{ matrix.compiler }}" ./build.sh meta raddbg raddbg_non_graphical radbin radlink torture "${{ matrix.mode }}" + cd build + ./torture --gen_crash_dump + - name: upload torture artifacts + if: failure() + uses: actions/upload-artifact@v7 + with: + name: torture-crash-dumps-${{ matrix.compiler }}-${{ matrix.mode }} + path: | + build/*.core + build/*.exe + build/*.pdb + build/torture_artifacts/** + if-no-files-found: ignore + + run-torture-windows-2022: + runs-on: windows-2022 + strategy: + fail-fast: false + matrix: + compiler: + - msvc + - clang + mode: + - debug + - release + exclude: + - { compiler: clang, mode: release } # clang runs OOM in release with ASAN + steps: + - name: checkout + uses: actions/checkout@v6 + - name: run-torture + shell: cmd + run: | + rem find path to clang + for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi + + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 + + rem set clang path before MSVC's clang path + set PATH=%clang_path%;%PATH% + + rem parse out clang version number out of --version to build path to the folder with ASAN DLL + for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v + if "${{matrix.compiler}}" == "clang" set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;%PATH% + + call build meta raddbg_non_graphical || exit /b 1 + call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 + cd build + torture --gen_crash_dump || exit /b 1 + - name: upload torture crash dumps + if: failure() + uses: actions/upload-artifact@v7 + with: + name: torture-crash-dumps-${{ matrix.compiler }}-${{ matrix.mode }} + path: | + build/*.dmp + build/*.exe + build/*.pdb + build/torture_artifacts/** + if-no-files-found: ignore + diff --git a/build.bat b/build.bat index 29b62a43..e338509d 100644 --- a/build.bat +++ b/build.bat @@ -75,7 +75,7 @@ set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%% set cl_out= /out: set cl_obj_out= /Fo: set cl_linker= -set clang_common= -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -mcx16 -msha +set clang_common= -mcx16 -msha -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:noicf diff --git a/build.sh b/build.sh index a122bc61..3a34a8bc 100755 --- a/build.sh +++ b/build.sh @@ -18,8 +18,8 @@ git_hash_full=$(git rev-parse HEAD) # --- Compile/Link Line Definitions ------------------------------------------- cc_cflags_gcc="" -cc_cflags_clang=${cc_sanitize}" -fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" -cc_common="-I../src/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wall -Wno-missing-braces -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -mcx16" +cc_cflags_clang=${cc_sanitize}" -fuse-ld=lld -fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" +cc_common="-mcx16 -I../src/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wall -Wno-missing-braces -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" cc_debug="-g -O0 -DBUILD_DEBUG=1 ${cc_common}" cc_release="-g -O2 -DBUILD_DEBUG=0 ${cc_common}" cc_link="-lpthread -lm -lrt -ldl" diff --git a/run_tests.bat b/run_tests.bat index 08ec4987..a0651fc5 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -27,7 +27,7 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( ) rem TODO: unblock asan - call build.bat meta %%c %%m raddbg_non_graphical || exit /b 1 + call build.bat meta %%c %%m raddbg raddbg_non_graphical || exit /b 1 rem clang does not compile with asan in release mode because it runs out of memory if "%%c" equ "clang" ( diff --git a/run_tests.sh b/run_tests.sh index 6713d22f..a7441389 100644 --- a/run_tests.sh +++ b/run_tests.sh @@ -2,11 +2,24 @@ set -eu cd "$(dirname "$0")" -# compile our targets -./build.sh raddbg raddbg_non_graphical radlink radbin torture +target_values=(raddbg raddbg_non_graphical radlink radbin torture) +# TODO: gcc +cc_values=(clang) +mode_values=(debug release) -# run torture -cd build -./torture -cd .. +for m in "${mode_values[@]}"; do + for c in "${cc_values[@]}"; do + + # nuke artifacts from last run + rm -rf build/torture_artifacts + + ./build.sh meta "$c" "$m" "${target_values[@]}" + + # run torture + cd build + ./torture "$@" + cd .. + + done +done From 1de3be3b8b5f00e941bf893220ad34bd3022d209 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 19:11:23 -0700 Subject: [PATCH 633/850] on windows test clang in release without asan --- .github/workflows/builds.yml | 21 +----- run_tests.bat | 130 +++++++++++++++++++++++------------ 2 files changed, 88 insertions(+), 63 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index ab651b42..5cdba0d5 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -118,30 +118,16 @@ jobs: mode: - debug - release - exclude: - - { compiler: clang, mode: release } # clang runs OOM in release with ASAN steps: - name: checkout uses: actions/checkout@v6 - name: run-torture shell: cmd run: | - rem find path to clang - for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - - rem set clang path before MSVC's clang path - set PATH=%clang_path%;%PATH% - - rem parse out clang version number out of --version to build path to the folder with ASAN DLL - for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v - if "${{matrix.compiler}}" == "clang" set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;%PATH% - - call build meta raddbg_non_graphical || exit /b 1 - call build asan meta torture radlink radbin mule_main mule_module "${{matrix.mode}}" "${{matrix.compiler}}" || exit /b 1 - cd build - torture --gen_crash_dump || exit /b 1 + where clang + clang --version + call run_tests.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- --gen_crash_dump || exit /b 1 - name: upload torture crash dumps if: failure() uses: actions/upload-artifact@v7 @@ -153,4 +139,3 @@ jobs: build/*.pdb build/torture_artifacts/** if-no-files-found: ignore - diff --git a/run_tests.bat b/run_tests.bat index a0651fc5..443c1b8b 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -1,45 +1,85 @@ -@echo off -setlocal enabledelayedexpansion - -rem Make sure that your VS install does not have LLVM included otherwise this script will use VS clang - -set TARGET_VALUES=radlink radbin mule_main mule_module torture -set CC_VALUES=msvc clang -set MODE_VALUES=debug release - -rem find path to clang -for /f "tokens=*" %%i in ('where clang') do set clang_path=%%~dpi - -rem parse out clang version number out of --version to build path to the folder with ASAN DLL -for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v - -for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( - setlocal - - echo -------------------------------------------------------------------------------- - echo Build %%c+%%m - - rem nuke artifacts from last run - rmdir /s /q build\torture_artifacts - - if "%%c" equ "clang" ( - set PATH=%clang_path%..\lib\clang\%clang_version%\lib\windows;!PATH! - ) - - rem TODO: unblock asan - call build.bat meta %%c %%m raddbg raddbg_non_graphical || exit /b 1 - - rem clang does not compile with asan in release mode because it runs out of memory - if "%%c" equ "clang" ( - call build.bat meta %%c %%m %TARGET_VALUES% || exit /b 1 - ) else ( - call build.bat meta asan %%c %%m %TARGET_VALUES% || exit /b 1 - ) - - pushd build - torture %* || exit /b 1 - popd - - endlocal -) - +@echo off +setlocal enabledelayedexpansion + +set TARGET_VALUES=radlink radbin mule_main mule_module torture +set CC_VALUES=msvc clang +set MODE_VALUES=debug release +set RAW_ARGS=%* +set TORTURE_ARGS= +set RUN_TORTURE=1 + +:parse_args +if "%~1" == "" goto parse_done +if "%~1" == "--" goto parse_torture_args +if /i "%~1" == "msvc" set CC_VALUES=msvc && shift /1 && goto parse_args +if /i "%~1" == "clang" set CC_VALUES=clang && shift /1 && goto parse_args +if /i "%~1" == "debug" set MODE_VALUES=debug && shift /1 && goto parse_args +if /i "%~1" == "release" set MODE_VALUES=release && shift /1 && goto parse_args +if /i "%~1" == "no_torture" set RUN_TORTURE=0 && shift /1 && goto parse_args +echo usage: run_tests.bat [msvc^|clang] [debug^|release] [no_torture] [-- ] +exit /b 1 + +:parse_torture_args +shift /1 +if "%~1" == "" set "TORTURE_ARGS=" && goto parse_done +set "TORTURE_ARGS=%RAW_ARGS%" +if "%TORTURE_ARGS:~0,3%" == "-- " set "TORTURE_ARGS=%TORTURE_ARGS:~3%" && goto parse_done +set "TORTURE_ARGS=%TORTURE_ARGS:* -- =%" + +:parse_done + +for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( + setlocal + + :: nuke artifacts from last run + if exist build/torture_artifacts rmdir /s /q build\torture_artifacts + if exist build\metagen.exe del /q build\metagen.exe + for %%t in (%TARGET_VALUES%) do ( + if exist build\%%t.exe del /q build\%%t.exe + if exist build\%%t.pdb del /q build\%%t.pdb + ) + + if "%%c" == "clang" ( + :: Prefer standalone LLVM clang over Visual Studio clang so ASAN runtime files match the compiler. + set "clang_path=" + for /f "tokens=*" %%i in ('where clang') do ( + set "candidate_clang_path=%%~dpi" + if "!candidate_clang_path:Microsoft Visual Studio=!"=="!candidate_clang_path!" ( + if not defined clang_path set "clang_path=!candidate_clang_path!" + ) + ) + if not defined clang_path ( + echo ERROR: standalone LLVM clang not found in PATH + exit /b 1 + ) + set PATH=!clang_path!;!PATH! + for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v + if not defined clang_version ( + echo ERROR: failed to detect clang version + exit /b 1 + ) + set PATH=!clang_path!..\lib\clang\!clang_version!\lib\windows;!PATH! + ) + + :: TODO: unblock asan + call build.bat meta %%c %%m raddbg raddbg_non_graphical || exit /b 1 + + :: clang does not compile with asan in release mode because it runs out of memory + if "%%c" equ "clang" ( + if /i "%%m" equ "release" ( + call build.bat meta %%c %%m !TARGET_VALUES! || exit /b 1 + ) else ( + call build.bat meta asan %%c %%m !TARGET_VALUES! || exit /b 1 + ) + ) else ( + call build.bat meta asan %%c %%m !TARGET_VALUES! || exit /b 1 + ) + + if "%RUN_TORTURE%" equ "1" ( + pushd build + torture %TORTURE_ARGS% || exit /b 1 + popd + ) + + endlocal +) From 56c503659347722714ba943ee69394e2acf9f53a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 21:07:46 -0700 Subject: [PATCH 634/850] use run_tests.sh to drive builds.yml --- .github/workflows/builds.yml | 5 ++-- build.sh | 2 +- run_tests.sh | 53 ++++++++++++++++++++++++++++++------ 3 files changed, 48 insertions(+), 12 deletions(-) mode change 100644 => 100755 run_tests.sh diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 5cdba0d5..d9519d9c 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -88,13 +88,12 @@ jobs: sudo apt-add-repository -y "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-22 main" sudo apt-get update sudo apt-get install -y clang-22 lld-22 llvm-22 gcc-14 pkg-config libfreetype6-dev libx11-dev libxext-dev libgl1-mesa-dev libegl1-mesa-dev + # crash callstack symbolizer depends on LLVM sudo ln -s /usr/bin/llvm-symbolizer-22 /usr/bin/llvm-symbolizer - name: run-torture shell: bash run: | - CC="${{ matrix.compiler }}" ./build.sh meta raddbg raddbg_non_graphical radbin radlink torture "${{ matrix.mode }}" - cd build - ./torture --gen_crash_dump + CC="${{ matrix.compiler }}" ./run_tests.sh "${{ matrix.compiler }}" "${{ matrix.mode }}" -- --gen_crash_dump - name: upload torture artifacts if: failure() uses: actions/upload-artifact@v7 diff --git a/build.sh b/build.sh index 3a34a8bc..e1ef4605 100755 --- a/build.sh +++ b/build.sh @@ -18,7 +18,7 @@ git_hash_full=$(git rev-parse HEAD) # --- Compile/Link Line Definitions ------------------------------------------- cc_cflags_gcc="" -cc_cflags_clang=${cc_sanitize}" -fuse-ld=lld -fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" +cc_cflags_clang=${cc_sanitize}" -fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" cc_common="-mcx16 -I../src/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wall -Wno-missing-braces -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" cc_debug="-g -O0 -DBUILD_DEBUG=1 ${cc_common}" cc_release="-g -O2 -DBUILD_DEBUG=0 ${cc_common}" diff --git a/run_tests.sh b/run_tests.sh old mode 100644 new mode 100755 index a7441389..be90422f --- a/run_tests.sh +++ b/run_tests.sh @@ -3,23 +3,60 @@ set -eu cd "$(dirname "$0")" target_values=(raddbg raddbg_non_graphical radlink radbin torture) -# TODO: gcc -cc_values=(clang) +cc_values=(clang gcc) mode_values=(debug release) +run_torture=1 +torture_args=() + +while [[ $# -gt 0 ]]; do + case "$1" in + --) + shift + torture_args=("$@") + break + ;; + clang|clang-*) + cc_values=("$1") + shift + ;; + gcc|gcc-*) + cc_values=("$1") + shift + ;; + debug|release) + mode_values=("$1") + shift + ;; + no_torture) + run_torture=0 + shift + ;; + *) + echo "usage: $0 [clang|clang-*|gcc|gcc-*] [debug|release] [no_torture] [-- ]" + exit 1 + ;; + esac +done for m in "${mode_values[@]}"; do for c in "${cc_values[@]}"; do + build_cc=clang + if [[ "$c" == gcc* ]]; then build_cc=gcc; fi # nuke artifacts from last run rm -rf build/torture_artifacts + rm -f build/metagen + for t in "${target_values[@]}"; do + rm -f "build/$t" + done - ./build.sh meta "$c" "$m" "${target_values[@]}" + # build targets + CC="$c" ./build.sh meta "$build_cc" "$m" "${target_values[@]}" - # run torture - cd build - ./torture "$@" - cd .. + # run torture from build folder + if [[ "$run_torture" == "1" ]]; then + (cd build && ./torture "${torture_args[@]}") + fi done done - From 608c42a2612a2bb350f86e1d5d27e9d5c8b8d08d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 21:19:29 -0700 Subject: [PATCH 635/850] run_tests -> run --- .github/workflows/builds.yml | 4 ++-- run_tests.bat => run.bat | 0 run_tests.sh => run.sh | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename run_tests.bat => run.bat (100%) rename run_tests.sh => run.sh (100%) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index d9519d9c..b77fcec7 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -93,7 +93,7 @@ jobs: - name: run-torture shell: bash run: | - CC="${{ matrix.compiler }}" ./run_tests.sh "${{ matrix.compiler }}" "${{ matrix.mode }}" -- --gen_crash_dump + CC="${{ matrix.compiler }}" ./run.sh "${{ matrix.compiler }}" "${{ matrix.mode }}" -- --gen_crash_dump - name: upload torture artifacts if: failure() uses: actions/upload-artifact@v7 @@ -126,7 +126,7 @@ jobs: call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 where clang clang --version - call run_tests.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- --gen_crash_dump || exit /b 1 + call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- --gen_crash_dump || exit /b 1 - name: upload torture crash dumps if: failure() uses: actions/upload-artifact@v7 diff --git a/run_tests.bat b/run.bat similarity index 100% rename from run_tests.bat rename to run.bat diff --git a/run_tests.sh b/run.sh similarity index 100% rename from run_tests.sh rename to run.sh From bf1fd5fbe87fd2f03c46d7477a9f7e304a2d802e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 8 May 2026 21:25:05 -0700 Subject: [PATCH 636/850] delete debug code --- .github/workflows/builds.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index b77fcec7..32db13cb 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -124,8 +124,6 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 - where clang - clang --version call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- --gen_crash_dump || exit /b 1 - name: upload torture crash dumps if: failure() From a60b61cafded2d63f4887726d62c6a9abf1234da Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 9 May 2026 00:43:10 -0700 Subject: [PATCH 637/850] run --- run.bat | 4 ++-- run.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/run.bat b/run.bat index 443c1b8b..cf69de5b 100644 --- a/run.bat +++ b/run.bat @@ -9,14 +9,14 @@ set TORTURE_ARGS= set RUN_TORTURE=1 :parse_args -if "%~1" == "" goto parse_done +if "%~1" == "" goto parse_done if "%~1" == "--" goto parse_torture_args if /i "%~1" == "msvc" set CC_VALUES=msvc && shift /1 && goto parse_args if /i "%~1" == "clang" set CC_VALUES=clang && shift /1 && goto parse_args if /i "%~1" == "debug" set MODE_VALUES=debug && shift /1 && goto parse_args if /i "%~1" == "release" set MODE_VALUES=release && shift /1 && goto parse_args if /i "%~1" == "no_torture" set RUN_TORTURE=0 && shift /1 && goto parse_args -echo usage: run_tests.bat [msvc^|clang] [debug^|release] [no_torture] [-- ] +echo usage: %~nx0 [msvc^|clang] [debug^|release] [no_torture] [-- torture-args] exit /b 1 :parse_torture_args diff --git a/run.sh b/run.sh index be90422f..e4ceece1 100755 --- a/run.sh +++ b/run.sh @@ -32,7 +32,7 @@ while [[ $# -gt 0 ]]; do shift ;; *) - echo "usage: $0 [clang|clang-*|gcc|gcc-*] [debug|release] [no_torture] [-- ]" + echo "usage: $0 [clang|clang-*|gcc|gcc-*] [debug|release] [no_torture] [-- torture-args]" exit 1 ;; esac From 266d66250cb8ceb77ac04a3c11e4739f743c2fda Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 9 May 2026 10:36:24 -0700 Subject: [PATCH 638/850] process join --- src/linux/base/linux_base.c | 47 +++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 01abe524..6ec9e469 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1285,37 +1285,34 @@ process_launch(ProcessLaunchParams *params) internal B32 process_join(Process process, U64 endt_us, U64 *exit_code_out) { - pid_t pid = (pid_t)process.u64[0]; B32 result = 0; - if(endt_us == 0) + + pid_t pid = (pid_t)process.u64[0]; + for(;;) { - if(kill(pid, 0) == 0) + int status = 0; + pid_t wait_result = OS_LNX_RETRY_ON_EINTR(waitpid(pid, &status, (endt_us == max_U64) ? 0 : WNOHANG)); + + if((wait_result == pid) && (WIFEXITED(status) || WIFSIGNALED(status))) { - int status; - waitpid(pid, &status, WNOHANG); - } - else { Assert(0 && "failed to get status from pid"); } - } - else if(endt_us == max_U64) - { - for(;;) - { - int status = 0; - int w = waitpid(pid, &status, 0); - if(w == -1) + result = 1; + if(exit_code_out != 0) { - break; - } - if(WIFEXITED(status) || WIFSTOPPED(status) || WIFSIGNALED(status)) - { - result = 1; - break; + if (WIFEXITED(status)) { *exit_code_out = WEXITSTATUS(status); } + else if(WIFSIGNALED(status)) { *exit_code_out = WTERMSIG(status) + 128; } } + break; } - } - else - { - NotImplemented; + + if(wait_result == -1) { break; } + if(endt_us == 0) { break; } + + U64 now_us = now_time_us(); + if(now_us >= endt_us) { break; } + + U64 left_us = endt_us - now_us; + U64 sleep_us = Min(left_us, Thousand(1)); + usleep((useconds_t)sleep_us); } return result; } From ec3da445686040531a9c3e3c32fa71dc980ce3a5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 9 May 2026 12:24:39 -0700 Subject: [PATCH 639/850] minor fix --- src/rdi_from_dwarf/rdi_from_dwarf.c | 35 +++++++++++++++++++++++------ src/rdi_from_dwarf/rdi_from_dwarf.h | 1 + 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 30315302..201b3ca6 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1492,6 +1492,7 @@ d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) iter->stack->node->sibling = 0; iter->visit_children = 1; iter->tag_node = root; + iter->null_tag_node = push_array(arena, DW_TagNode, 1); return iter; } @@ -1536,7 +1537,7 @@ d2r_tag_iterator_skip_children(D2R_TagIterator *iter) internal DW_TagNode * d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter) { - return iter->stack->next->node; + return iter->stack == 0 || iter->stack->next == 0 ? iter->null_tag_node : iter->stack->next->node; } internal DW_Tag @@ -1938,7 +1939,8 @@ d2r_convert_types(Arena *arena, // TODO: @native_vector_support extract byte size from the base type tag // and convert to U256, U512, S256 and S512 B32 is_vector = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_GNU_Vector); - if (is_vector) { NotImplemented; } + // TODO: + //if (is_vector) { NotImplemented; } B32 error = 1; @@ -2862,13 +2864,32 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) String8 path; { Temp temp = temp_begin(scratch.arena); - PathStyle path_style = path_style_from_str8(lookup->vm->header.dir_table.v[src->dir_idx]); - if (path_style == PathStyle_Relative) { - path_style = path_style_from_str8(src->path); + + String8 comp_dir = lookup->vm->header.dir_table.v[0]; + + PathStyle comp_path_style = path_style_from_str8(comp_dir); + PathStyle dir_path_style = path_style_from_str8(lookup->vm->header.dir_table.v[src->dir_idx]); + PathStyle file_path_style = path_style_from_str8(src->path); + + String8List dir_path_list = str8_split_path(temp.arena, lookup->vm->header.dir_table.v[src->dir_idx]); + String8List file_path_list = str8_split_path(temp.arena, src->path); + + String8List path_list = {0}; + if (dir_path_style == PathStyle_Relative) { + String8List comp_dir_list = str8_split_path(temp.arena, comp_dir); + str8_list_concat_in_place(&path_list, &comp_dir_list); } - String8List path_list = str8_split_path(temp.arena, lookup->vm->header.dir_table.v[src->dir_idx]); - str8_list_push_node(&path_list, &(String8Node){ .string = src->path }); + str8_list_concat_in_place(&path_list, &dir_path_list); + str8_list_concat_in_place(&path_list, &file_path_list); + + PathStyle path_style = PathStyle_SystemAbsolute; + if (dir_path_style != PathStyle_Relative) { path_style = dir_path_style; } + else if (file_path_style != PathStyle_Relative) { path_style = file_path_style; } + else if (comp_path_style != PathStyle_Relative) { path_style = comp_path_style; } + + str8_path_list_resolve_dots_in_place(&path_list, path_style); path = str8_path_list_join_by_style(arena, &path_list, path_style); + temp_end(temp); } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index c2569b14..550162cc 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -141,6 +141,7 @@ typedef struct D2R_TagIterator { D2R_TagFrame *free_list; D2R_TagFrame *stack; + DW_TagNode *null_tag_node; DW_TagNode *tag_node; B32 visit_children; } D2R_TagIterator; From 146ef012c45fa3c8295ea91c05846a8580bb755a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 9 May 2026 13:07:46 -0700 Subject: [PATCH 640/850] on error restore PATH --- run.bat | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/run.bat b/run.bat index cf69de5b..ec42fd94 100644 --- a/run.bat +++ b/run.bat @@ -62,23 +62,27 @@ for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( ) :: TODO: unblock asan - call build.bat meta %%c %%m raddbg raddbg_non_graphical || exit /b 1 + call build.bat meta %%c %%m raddbg raddbg_non_graphical || (endlocal exit /b 1) :: clang does not compile with asan in release mode because it runs out of memory if "%%c" equ "clang" ( if /i "%%m" equ "release" ( - call build.bat meta %%c %%m !TARGET_VALUES! || exit /b 1 + call build.bat no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) ) else ( - call build.bat meta asan %%c %%m !TARGET_VALUES! || exit /b 1 + call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) ) ) else ( - call build.bat meta asan %%c %%m !TARGET_VALUES! || exit /b 1 + call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) ) if "%RUN_TORTURE%" equ "1" ( pushd build - torture %TORTURE_ARGS% || exit /b 1 + torture %TORTURE_ARGS% popd + if errorlevel 1 ( + endlocal + exit /b 1 + ) ) endlocal From 3e9fff93f1bdde07bb596058e41c53d2fe73f1e3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 9 May 2026 13:23:13 -0700 Subject: [PATCH 641/850] tidy up names in builds.yml --- .github/workflows/builds.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 32db13cb..30aebcbd 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -27,9 +27,9 @@ jobs: - debug - release steps: - - name: checkout + - name: Checkout uses: actions/checkout@v6 - - name: install dependencies + - name: Install Dependencies shell: bash run: | wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - @@ -59,7 +59,7 @@ jobs: - debug - release steps: - - name: checkout + - name: Checkout uses: actions/checkout@v6 - name: build (vs 2022) shell: cmd @@ -67,7 +67,7 @@ jobs: call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 call build meta "${{ matrix.target }}" "${{ matrix.compiler }}" "${{ matrix.mode }}" || exit /b 1 - run-torture-ubuntu-24-04: + run-ubuntu-24-04: runs-on: ubuntu-24.04 strategy: fail-fast: false @@ -79,9 +79,9 @@ jobs: - debug # TODO: - release steps: - - name: checkout + - name: Checkout uses: actions/checkout@v6 - - name: install external libraries + - name: Install Dependencies shell: bash run: | wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - @@ -90,11 +90,11 @@ jobs: sudo apt-get install -y clang-22 lld-22 llvm-22 gcc-14 pkg-config libfreetype6-dev libx11-dev libxext-dev libgl1-mesa-dev libegl1-mesa-dev # crash callstack symbolizer depends on LLVM sudo ln -s /usr/bin/llvm-symbolizer-22 /usr/bin/llvm-symbolizer - - name: run-torture + - name: Run shell: bash run: | CC="${{ matrix.compiler }}" ./run.sh "${{ matrix.compiler }}" "${{ matrix.mode }}" -- --gen_crash_dump - - name: upload torture artifacts + - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 with: @@ -106,7 +106,7 @@ jobs: build/torture_artifacts/** if-no-files-found: ignore - run-torture-windows-2022: + run-windows-2022: runs-on: windows-2022 strategy: fail-fast: false @@ -118,14 +118,14 @@ jobs: - debug - release steps: - - name: checkout + - name: Checkout uses: actions/checkout@v6 - - name: run-torture + - name: Run shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- --gen_crash_dump || exit /b 1 - - name: upload torture crash dumps + - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 with: From 528b0fde5620e62eb8195539fbbdd37db4cbc056 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 9 May 2026 13:41:46 -0700 Subject: [PATCH 642/850] replace hard-coded visual studio path with vswhere --- .github/workflows/builds.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 30aebcbd..774afbc3 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -64,7 +64,8 @@ jobs: - name: build (vs 2022) shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 + for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do set "VS_INSTALL=%%i" + call "%VS_INSTALL%\VC\Auxiliary\Build\vcvarsall.bat" x64 call build meta "${{ matrix.target }}" "${{ matrix.compiler }}" "${{ matrix.mode }}" || exit /b 1 run-ubuntu-24-04: @@ -123,7 +124,8 @@ jobs: - name: Run shell: cmd run: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" x64 + for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do set "VS_INSTALL=%%i" + call "%VS_INSTALL%\VC\Auxiliary\Build\vcvarsall.bat" x64 call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- --gen_crash_dump || exit /b 1 - name: Upload Artifacts if: failure() From 4acd8a9b86c70250e61421ae39df4cf7d4c68547 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 9 May 2026 14:58:06 -0700 Subject: [PATCH 643/850] fill out address --- src/linux/demon/linux_demon.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/linux/demon/linux_demon.c b/src/linux/demon/linux_demon.c index 9a16e3aa..d3124366 100644 --- a/src/linux/demon/linux_demon.c +++ b/src/linux/demon/linux_demon.c @@ -1727,6 +1727,7 @@ lnx_dmn_push_event_breakpoint(Arena *arena, DMN_EventList *events, LNX_DMN_Threa e->process = lnx_dmn_handle_from_process(thread->process); e->thread = lnx_dmn_handle_from_thread(thread); e->instruction_pointer = address; + e->address = address; } internal void @@ -1737,6 +1738,7 @@ lnx_dmn_push_event_single_step(Arena *arena, DMN_EventList *events, LNX_DMN_Thre e->process = lnx_dmn_handle_from_process(thread->process); e->thread = lnx_dmn_handle_from_thread(thread); e->instruction_pointer = lnx_dmn_thread_read_ip(thread); + e->address = e->instruction_pointer; } internal void @@ -1784,6 +1786,7 @@ lnx_dmn_push_event_exception(Arena *arena, DMN_EventList *events, LNX_DMN_Thread e->process = lnx_dmn_handle_from_process(thread->process); e->thread = lnx_dmn_handle_from_thread(thread); e->instruction_pointer = lnx_dmn_thread_read_ip(thread); + e->address = e->instruction_pointer; e->signo = signo; e->exception_repeated = signo < ArrayCount(is_repeatable) ? is_repeatable[signo] : 0; From d7e5c5a830aa34de15efc66eba3920b517f18894 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 11 May 2026 12:07:23 -0700 Subject: [PATCH 644/850] dbg_engine: bugfix memory fetch in step_over, step_over_inst, and step_into and incorrect boolean logic for trap-net --- src/dbg_engine/dbg_engine_user.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 715583fc..bfca5f1c 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -301,14 +301,17 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread) // rjf: ip => machine code String8 machine_code = {0}; + B32 good_machine_code = 0; { Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, now_time_us()+5000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 1, now_time_us()+10000); machine_code = machine_code_slice.data; + good_machine_code = (machine_code.size != 0 && !machine_code_slice.any_byte_bad && !machine_code_slice.stale); } + result.good_line_info = 1; // rjf: build traps if machine code was read successfully - if(machine_code.size != 0) + if(good_machine_code) { result.good_read = 1; @@ -396,12 +399,9 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - // TODO: Under WSL, memory fetch takes longer to complete. Previously, 50ms was not enough and d_process_memory_slice_from_vaddr_range - // would return stale memory, causing stepping alg to stop mid-source-line. If I understand correctly, 'wait_for_fresh' should - // guarantee successful stepping here, but even after enabling it, stale memory is returned. - D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, now_time_us()+10000000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 1, now_time_us()+10000); machine_code = machine_code_slice.data; - good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); + good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad && !machine_code_slice.stale); LogInfoNamedBlockF("machine_code_slice") { log_infof("stale: %i\n", machine_code_slice.stale); @@ -527,7 +527,6 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) } // rjf: store goodness - if(good_machine_code) { result.good_line_info = good_line_info; result.good_read = good_machine_code; @@ -610,9 +609,9 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) B32 good_machine_code = 0; if(good_line_info) { - D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, now_time_us()+5000); + D_ProcessMemorySlice machine_code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 1, now_time_us()+10000); machine_code = machine_code_slice.data; - good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad); + good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad && !machine_code_slice.stale); } // rjf: machine code => ctrl flow analysis From 65288208affd7ae28dd8bb6fce2ed8710aa37390 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 11 May 2026 17:33:42 -0700 Subject: [PATCH 645/850] dbg_engine: extend trap-net range across contiguous same-source-line ranges --- src/dbg_engine/dbg_engine_user.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index bfca5f1c..ae1f5d13 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -377,6 +377,23 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); } } + + // extend trap-net range across contiguous same-source-line, possibly unsorted, ranges + // + // TODO: @ns: converter should never produce these ranges in the first place, + // once fixed, assert this invariant + for(B32 changed = 1; changed;) + { + changed = 0; + for EachNode(n, Rng1U64Node, all_vaddr_ranges_on_same_line.first) + { + if(n->v.min <= line_vaddr_rng.max && line_vaddr_rng.max < n->v.max) + { + line_vaddr_rng.max = n->v.max; + changed = 1; + } + } + } // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range // From 96e20759d56e04a40ab43220b4f28e1df5ebe52f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 11 May 2026 14:35:16 -0700 Subject: [PATCH 646/850] file endings --- run.bat | 178 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 89 insertions(+), 89 deletions(-) diff --git a/run.bat b/run.bat index ec42fd94..61e41464 100644 --- a/run.bat +++ b/run.bat @@ -1,89 +1,89 @@ -@echo off -setlocal enabledelayedexpansion - -set TARGET_VALUES=radlink radbin mule_main mule_module torture -set CC_VALUES=msvc clang -set MODE_VALUES=debug release -set RAW_ARGS=%* -set TORTURE_ARGS= -set RUN_TORTURE=1 - -:parse_args -if "%~1" == "" goto parse_done -if "%~1" == "--" goto parse_torture_args -if /i "%~1" == "msvc" set CC_VALUES=msvc && shift /1 && goto parse_args -if /i "%~1" == "clang" set CC_VALUES=clang && shift /1 && goto parse_args -if /i "%~1" == "debug" set MODE_VALUES=debug && shift /1 && goto parse_args -if /i "%~1" == "release" set MODE_VALUES=release && shift /1 && goto parse_args -if /i "%~1" == "no_torture" set RUN_TORTURE=0 && shift /1 && goto parse_args -echo usage: %~nx0 [msvc^|clang] [debug^|release] [no_torture] [-- torture-args] -exit /b 1 - -:parse_torture_args -shift /1 -if "%~1" == "" set "TORTURE_ARGS=" && goto parse_done -set "TORTURE_ARGS=%RAW_ARGS%" -if "%TORTURE_ARGS:~0,3%" == "-- " set "TORTURE_ARGS=%TORTURE_ARGS:~3%" && goto parse_done -set "TORTURE_ARGS=%TORTURE_ARGS:* -- =%" - -:parse_done - -for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( - setlocal - - :: nuke artifacts from last run - if exist build/torture_artifacts rmdir /s /q build\torture_artifacts - if exist build\metagen.exe del /q build\metagen.exe - for %%t in (%TARGET_VALUES%) do ( - if exist build\%%t.exe del /q build\%%t.exe - if exist build\%%t.pdb del /q build\%%t.pdb - ) - - if "%%c" == "clang" ( - :: Prefer standalone LLVM clang over Visual Studio clang so ASAN runtime files match the compiler. - set "clang_path=" - for /f "tokens=*" %%i in ('where clang') do ( - set "candidate_clang_path=%%~dpi" - if "!candidate_clang_path:Microsoft Visual Studio=!"=="!candidate_clang_path!" ( - if not defined clang_path set "clang_path=!candidate_clang_path!" - ) - ) - if not defined clang_path ( - echo ERROR: standalone LLVM clang not found in PATH - exit /b 1 - ) - set PATH=!clang_path!;!PATH! - for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v - if not defined clang_version ( - echo ERROR: failed to detect clang version - exit /b 1 - ) - set PATH=!clang_path!..\lib\clang\!clang_version!\lib\windows;!PATH! - ) - - :: TODO: unblock asan - call build.bat meta %%c %%m raddbg raddbg_non_graphical || (endlocal exit /b 1) - - :: clang does not compile with asan in release mode because it runs out of memory - if "%%c" equ "clang" ( - if /i "%%m" equ "release" ( - call build.bat no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) - ) else ( - call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) - ) - ) else ( - call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) - ) - - if "%RUN_TORTURE%" equ "1" ( - pushd build - torture %TORTURE_ARGS% - popd - if errorlevel 1 ( - endlocal - exit /b 1 - ) - ) - - endlocal -) +@echo on +setlocal enabledelayedexpansion + +set TARGET_VALUES=radlink radbin mule_main mule_module torture +set CC_VALUES=msvc clang +set MODE_VALUES=debug release +set RAW_ARGS=%* +set TORTURE_ARGS= +set RUN_TORTURE=1 + +:parse_args +if "%~1" == "" goto parse_done +if "%~1" == "--" goto parse_torture_args +if /i "%~1" == "msvc" set CC_VALUES=msvc && shift /1 && goto parse_args +if /i "%~1" == "clang" set CC_VALUES=clang && shift /1 && goto parse_args +if /i "%~1" == "debug" set MODE_VALUES=debug && shift /1 && goto parse_args +if /i "%~1" == "release" set MODE_VALUES=release && shift /1 && goto parse_args +if /i "%~1" == "no_torture" set RUN_TORTURE=0 && shift /1 && goto parse_args +echo usage: %~nx0 [msvc^|clang] [debug^|release] [no_torture] [-- torture-args] +exit /b 1 + +:parse_torture_args +shift /1 +if "%~1" == "" set "TORTURE_ARGS=" && goto parse_done +set "TORTURE_ARGS=%RAW_ARGS%" +if "%TORTURE_ARGS:~0,3%" == "-- " set "TORTURE_ARGS=%TORTURE_ARGS:~3%" && goto parse_done +set "TORTURE_ARGS=%TORTURE_ARGS:* -- =%" + +:parse_done + +for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( + setlocal + + :: nuke artifacts from last run + if exist build/torture_artifacts rmdir /s /q build\torture_artifacts + if exist build\metagen.exe del /q build\metagen.exe + for %%t in (%TARGET_VALUES%) do ( + if exist build\%%t.exe del /q build\%%t.exe + if exist build\%%t.pdb del /q build\%%t.pdb + ) + + if "%%c" == "clang" ( + :: Prefer standalone LLVM clang over Visual Studio clang so ASAN runtime files match the compiler. + set "clang_path=" + for /f "tokens=*" %%i in ('where clang') do ( + set "candidate_clang_path=%%~dpi" + if "!candidate_clang_path:Microsoft Visual Studio=!"=="!candidate_clang_path!" ( + if not defined clang_path set "clang_path=!candidate_clang_path!" + ) + ) + if not defined clang_path ( + echo ERROR: standalone LLVM clang not found in PATH + exit /b 1 + ) + set PATH=!clang_path!;!PATH! + for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v + if not defined clang_version ( + echo ERROR: failed to detect clang version + exit /b 1 + ) + set PATH=!clang_path!..\lib\clang\!clang_version!\lib\windows;!PATH! + ) + + :: TODO: unblock asan + call build.bat meta %%c %%m raddbg raddbg_non_graphical || (endlocal exit /b 1) + + :: clang does not compile with asan in release mode because it runs out of memory + if "%%c" equ "clang" ( + if /i "%%m" equ "release" ( + call build.bat no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) + ) else ( + call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) + ) + ) else ( + call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) + ) + + if "%RUN_TORTURE%" equ "1" ( + pushd build + torture %TORTURE_ARGS% + popd + if errorlevel 1 ( + endlocal + exit /b 1 + ) + ) + + endlocal +) From 58fc57f6a35df8f502dd74bacd57be4d78f55eae Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 11 May 2026 18:20:33 -0700 Subject: [PATCH 647/850] torture_dbg: reuse Windows env-var expander in the harness compile/link/launch steps --- src/linker/lnk_cmd_line.c | 34 +++++++++++++++++++++ src/linker/lnk_cmd_line.h | 2 ++ src/linker/lnk_config.c | 33 -------------------- src/torture/dbg_tests/basic_stepping_test.c | 10 ++++++ src/torture/torture_dbg.c | 17 ++++++++--- 5 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/linker/lnk_cmd_line.c b/src/linker/lnk_cmd_line.c index 696ee180..80f07c53 100644 --- a/src/linker/lnk_cmd_line.c +++ b/src/linker/lnk_cmd_line.c @@ -243,3 +243,37 @@ lnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line) return result; } + +internal String8 +lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List list = {0}; + for (U64 i = 0; i < string.size; ) { + U64 open = str8_find_needle(string, i, str8_lit("%"), 0); + U64 close = str8_find_needle(string, open+1, str8_lit("%"), 0); + + String8 text = str8_substr(string, rng_1u64(i, open)); + str8_list_push(scratch.arena, &list, text); + i += text.size; + + if (open < close) { + String8 env_var_name = str8_substr(string, rng_1u64(open+1, close)); + BucketNode *match = hash_table_search_path(env_vars, env_var_name); + if (match) { + str8_list_push(scratch.arena, &list, match->v.value_string); + i = close+1; + } else { + str8_list_pushf(scratch.arena, &list, "%%%S", env_var_name); + i = close; + } + } + } + + String8 result = str8_list_join(arena, &list, 0); + + scratch_end(scratch); + return result; +} + diff --git a/src/linker/lnk_cmd_line.h b/src/linker/lnk_cmd_line.h index dee7f13a..b1ad7d16 100644 --- a/src/linker/lnk_cmd_line.h +++ b/src/linker/lnk_cmd_line.h @@ -32,3 +32,5 @@ internal void lnk_cmd_line_concat_in_place(LNK_CmdLine *list, LNK_CmdLine *to_co internal String8List lnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line); +internal String8 lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string); + diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index d6e708b4..9f92dfad 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -1069,39 +1069,6 @@ lnk_print_help(void) scratch_end(scratch); } -internal String8 -lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - - String8List list = {0}; - for (U64 i = 0; i < string.size; ) { - U64 open = str8_find_needle(string, i, str8_lit("%"), 0); - U64 close = str8_find_needle(string, open+1, str8_lit("%"), 0); - - String8 text = str8_substr(string, rng_1u64(i, open)); - str8_list_push(scratch.arena, &list, text); - i += text.size; - - if (open < close) { - String8 env_var_name = str8_substr(string, rng_1u64(open+1, close)); - BucketNode *match = hash_table_search_path(env_vars, env_var_name); - if (match) { - str8_list_push(scratch.arena, &list, match->v.value_string); - i = close+1; - } else { - str8_list_pushf(scratch.arena, &list, "%%%S", env_var_name); - i = close; - } - } - } - - String8 result = str8_list_join(arena, &list, 0); - - scratch_end(scratch); - return result; -} - internal String8List lnk_unwrap_rsp(Arena *arena, String8List arg_list) { diff --git a/src/torture/dbg_tests/basic_stepping_test.c b/src/torture/dbg_tests/basic_stepping_test.c index ff1043c8..1dac1470 100644 --- a/src/torture/dbg_tests/basic_stepping_test.c +++ b/src/torture/dbg_tests/basic_stepping_test.c @@ -12,7 +12,17 @@ /// } /// } /// + // TODO: linux: -no-pie crashes the tracer +// +// TODO: crashes +// compile: "-O0 -g foo.c -fPIC -shared -o libfoo.so" +// compile: "-O0 -g main.c -L. -lfoo -o main -Wl,-rpath,%CWD%" +// ... +// dw_compute_cfa dwarf_unwind.c:261:5 +// d_establish_frame_unwind_context__dwarf dbg_engine_ctrl.c:1946:25 +// d_unwind_from_thread dbg_engine_ctrl.c:2913:30 +// ... /// file: "foo.c" diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 184dc363..101e945d 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -667,6 +667,10 @@ T_RunSig(dbg_script_runner) } } + // compiler vars + HashTable *script_vars = hash_table_init(arena, 1000); + hash_table_push_path_string(arena, script_vars, str8_lit("CWD"), g_wdir); + // run compilers for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Compile].first) { T_Compiler compiler = directive->compile.compiler; @@ -689,8 +693,9 @@ T_RunSig(dbg_script_runner) } // invoke compiler with arguments from directive - if (t_invoke(compiler_path, directive->args, max_U64) == 0) { - fprintf(stderr, "ERROR: failed to launch compiler: \"%.*s %.*s\"\n", str8_varg(compiler_path), str8_varg(directive->args)); + String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); + if (t_invoke(compiler_path, expanded_args, max_U64) == 0) { + fprintf(stderr, "ERROR: failed to launch compiler: \"%.*s %.*s\"\n", str8_varg(compiler_path), str8_varg(expanded_args)); T_Ok(0); } if (g_last_exit_code) { @@ -704,15 +709,17 @@ T_RunSig(dbg_script_runner) // run linkers String8 linker_path = t_radlink_path(); for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Link].first) { - if (t_invoke(linker_path, directive->args, max_U64) == 0) { - fprintf(stderr, "ERROR: failed to launch linker: \"%.*s %.*s\"\n", str8_varg(linker_path), str8_varg(directive->args)); + String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); + if (t_invoke(linker_path, expanded_args, max_U64) == 0) { + fprintf(stderr, "ERROR: failed to launch linker: \"%.*s %.*s\"\n", str8_varg(linker_path), str8_varg(expanded_args)); T_Ok(0); } } // launch targets for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Launch].first) { - String8 cmdl = str8f(arena, "--user:%S.raddbg_user %S", t_make_file_path(arena, str8_lit("temp")), directive->args); + String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); + String8 cmdl = str8f(arena, "--user:%S.raddbg_user %S", t_make_file_path(arena, str8_lit("temp")), expanded_args); if (t_dbg_launch(cmdl, T_Dbg_DefaultTimeout) == 0) { fprintf(stderr, "ERROR: failed to launch debugger with command line \"%.*s %.*s\"; work dir \"%.*s\"\n", str8_varg(t_raddbg_path()), str8_varg(cmdl), str8_varg(g_wdir)); T_Ok(0); From a3bac20a73075cde4f13c6f8b33b9416be5d8fd7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 14:56:31 -0700 Subject: [PATCH 648/850] rebase fixes normalize line endings sort test pointers rebase fixes rebase fixes --- build.bat | 2 +- run.bat | 2 +- run.sh | 27 ++++--- src/dbg_engine/dbg_engine_core.c | 12 ++-- src/dbg_info/dbg_info.c | 2 +- src/linker/lnk.c | 7 +- src/linker/lnk_io.c | 3 +- src/linux/base/linux_base.c | 15 ++-- .../window_manager/linux_window_manager.c | 2 +- src/metagen/metagen.c | 30 ++++---- src/metagen/metagen_base/metagen_base_meta.c | 1 + .../metagen_base/metagen_base_strings.h | 1 + src/raddbg/raddbg_core.c | 14 ++-- src/render/stub/render_stub.c | 10 +-- src/torture/torture.c | 70 ++++++++++++------- src/torture/torture.h | 11 ++- src/torture/torture_dbg.c | 26 +++---- 17 files changed, 131 insertions(+), 104 deletions(-) create mode 100644 src/metagen/metagen_base/metagen_base_meta.c create mode 100644 src/metagen/metagen_base/metagen_base_strings.h diff --git a/build.bat b/build.bat index e338509d..470b5f1d 100644 --- a/build.bat +++ b/build.bat @@ -140,7 +140,7 @@ popd :: --- Build Everything (@build_targets) -------------------------------------- pushd build if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg.exe || exit /b 1 -if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% -DWM_STUB=1 -DWM_STUB_DEFAULT_REFRESH_RATE=60.f -DR_BACKEND=R_BACKEND_STUB ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg_non_graphical.exe || exit /b 1 +if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% -DWM_STUB=1 -DWM_STUB_DEFAULT_REFRESH_RATE=60.f -DR_BACKEND=R_BACKEND_STUB ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg_non_graphical.exe || exit /b 1 if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% %linker% /NOIMPLIB %linker% /NATVIS:"%~dp0\src\linker\linker.natvis" %out%radlink.exe || exit /b 1 if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% %out%radbin.exe || exit /b 1 if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% %out%raddump.exe || exit /b 1 diff --git a/run.bat b/run.bat index 61e41464..43a26831 100644 --- a/run.bat +++ b/run.bat @@ -1,4 +1,4 @@ -@echo on +@echo off setlocal enabledelayedexpansion set TARGET_VALUES=radlink radbin mule_main mule_module torture diff --git a/run.sh b/run.sh index e4ceece1..39191afc 100755 --- a/run.sh +++ b/run.sh @@ -15,11 +15,11 @@ while [[ $# -gt 0 ]]; do torture_args=("$@") break ;; - clang|clang-*) + clang) cc_values=("$1") shift ;; - gcc|gcc-*) + gcc) cc_values=("$1") shift ;; @@ -32,7 +32,7 @@ while [[ $# -gt 0 ]]; do shift ;; *) - echo "usage: $0 [clang|clang-*|gcc|gcc-*] [debug|release] [no_torture] [-- torture-args]" + echo "usage: $0 [clang|gcc] [debug|release] [no_torture] [-- torture-args]" exit 1 ;; esac @@ -40,9 +40,6 @@ done for m in "${mode_values[@]}"; do for c in "${cc_values[@]}"; do - build_cc=clang - if [[ "$c" == gcc* ]]; then build_cc=gcc; fi - # nuke artifacts from last run rm -rf build/torture_artifacts rm -f build/metagen @@ -51,11 +48,25 @@ for m in "${mode_values[@]}"; do done # build targets - CC="$c" ./build.sh meta "$build_cc" "$m" "${target_values[@]}" + ./build.sh meta "$c" "$m" "${target_values[@]}" # run torture from build folder if [[ "$run_torture" == "1" ]]; then - (cd build && ./torture "${torture_args[@]}") + torture_compiler_args=() + has_clang_arg=0 + has_gcc_arg=0 + for arg in "${torture_args[@]}"; do + case "$arg" in + -clang:*|--clang:*) has_clang_arg=1 ;; + -gcc:*|--gcc:*) has_gcc_arg=1 ;; + esac + done + if [[ "$c" == clang && "$has_clang_arg" == "0" ]]; then + torture_compiler_args=("-clang:$(command -v "${CC:-clang}")") + elif [[ "$c" == gcc && "$has_gcc_arg" == "0" ]]; then + torture_compiler_args=("-gcc:$(command -v "${CC:-gcc}")") + fi + (cd build && ./torture "${torture_compiler_args[@]}" "${torture_args[@]}") fi done diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 3885ca13..652379e8 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -53,12 +53,12 @@ d_init(void) d_ctrl_state->c2u_ring_size = KB(64); d_ctrl_state->c2u_ring_max_string_size = d_ctrl_state->c2u_ring_size/2; d_ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, d_ctrl_state->c2u_ring_size); - d_ctrl_state->c2u_ring_mutex = mutex_alloc(); - d_ctrl_state->c2u_ring_cv = cond_var_alloc(); - { - d_ctrl_state->ctrl_thread_log_path = push_str8f(d_ctrl_state->arena, "%S/ctrl_thread.raddbg_log", g_logs_folder); - write_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, str8_zero()); - } + d_ctrl_state->c2u_ring_mutex = mutex_alloc(); + d_ctrl_state->c2u_ring_cv = cond_var_alloc(); + { + d_ctrl_state->ctrl_thread_log_path = push_str8f(d_ctrl_state->arena, "%S/ctrl_thread.raddbg_log", g_logs_folder); + write_data_to_file_path(d_ctrl_state->ctrl_thread_log_path, str8_zero()); + } d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc(); d_ctrl_state->ctrl_thread_entity_store = d_entity_ctx_rw_store_alloc(); d_ctrl_state->ctrl_thread_eval_cache = e_cache_alloc(); diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 1ac09aeb..3859cfd8 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -797,7 +797,7 @@ di_async_tick(void) params.path = get_process_info()->binary_path; params.inherit_env = 1; params.consoleless = 1; - str8_list_push(scratch.arena, ¶ms.cmd_line, get_process_info()->binary_file_path); + str8_list_push(scratch.arena, ¶ms.cmd_line, get_process_info()->binary_file_path); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--bin"); str8_list_pushf(scratch.arena, ¶ms.cmd_line, "--quiet"); if(should_compress) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index c933bd29..6fa2636b 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -18,7 +18,6 @@ #include "base/base_inc.h" #include "x64/x64.h" -#include "os/os_inc.h" #include "hash_table.h" #include "coff/coff.h" #include "coff/coff_parse.h" @@ -36,10 +35,11 @@ #include "pdb/pdb.h" #include "msvc_crt/msvc_crt.h" #include "llvm/llvm.h" +#include "dwarf/dwarf.h" +#include "dwarf/x64/dwarf_x64.h" #include "base/base_inc.c" #include "x64/x64.c" -#include "os/os_inc.c" #include "hash_table.c" #include "coff/coff.c" #include "coff/coff_parse.c" @@ -56,11 +56,14 @@ #include "pdb/pdb.c" #include "msvc_crt/msvc_crt.c" #include "llvm/llvm.c" +#include "dwarf/x64/dwarf_x64.c" // --- RDI --------------------------------------------------------------------- #include "rdi/rdi_local.h" +#include "arch/arch_inc.h" #include "rdi/rdi_local.c" +#include "arch/arch_inc.c" // --- Code Base Extensions ---------------------------------------------------- diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index 9f6e7781..f50039df 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -103,7 +103,7 @@ lnk_file_open_with_rename_permissions(String8 path) scratch_end(scratch); #else -# error "TODO: file rename" + file_handle = file_open(AccessFlag_Read|AccessFlag_Write, path); #endif return file_handle; } @@ -369,4 +369,3 @@ lnk_write_data_to_file_path(String8 path, String8 temp_path, String8 data) lnk_write_data_list_to_file_path(path, temp_path, data_list); scratch_end(scratch); } - diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 6ec9e469..a8e31b9a 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -676,7 +676,7 @@ semaphore_take(Semaphore semaphore, U64 endt_us) if(semaphore.u64[0] != 0) { struct timespec t = { .tv_sec = endt_us / 1000000, .tv_nsec = (endt_us % 1000000) * 1000 }; - err = OS_LNX_RETRY_ON_EINTR(sem_clockwait((sem_t*)semaphore.u64[0], CLOCK_MONOTONIC, &t)); + err = LNX_RETRY_ON_EINTR(sem_clockwait((sem_t*)semaphore.u64[0], CLOCK_MONOTONIC, &t)); } return err == 0; } @@ -687,7 +687,7 @@ semaphore_drop(Semaphore semaphore) int err = -1; if(semaphore.u64[0] != 0) { - err = OS_LNX_RETRY_ON_EINTR(sem_post((sem_t*)semaphore.u64[0])); + err = LNX_RETRY_ON_EINTR(sem_post((sem_t*)semaphore.u64[0])); Assert(err == 0); } } @@ -1234,14 +1234,11 @@ process_launch(ProcessLaunchParams *params) // package argv char **argv = push_array(scratch.arena, char *, params->cmd_line.node_count + 1); { - String8List l = str8_split_path(scratch.arena, params->path); - str8_list_push(scratch.arena, &l, params->cmd_line.first->string); - String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute); - argv[0] = (char *)path_to_exe.str; + argv[0] = (char *)push_cstr(scratch.arena, params->cmd_line.first->string).str; U64 arg_idx = 1; for EachNode(n, String8Node, params->cmd_line.first->next) { - argv[arg_idx] = (char *)n->string.str; + argv[arg_idx] = (char *)push_cstr(scratch.arena, n->string).str; arg_idx += 1; } } @@ -1265,7 +1262,7 @@ process_launch(ProcessLaunchParams *params) // spawn process pid_t pid = 0; - int spawn_code = posix_spawn(&pid, argv[0], &file_actions, &attr, argv, envp); + int spawn_code = posix_spawnp(&pid, argv[0], &file_actions, &attr, argv, envp); if(spawn_code == 0) { handle.u64[0] = (U64)pid; @@ -1291,7 +1288,7 @@ process_join(Process process, U64 endt_us, U64 *exit_code_out) for(;;) { int status = 0; - pid_t wait_result = OS_LNX_RETRY_ON_EINTR(waitpid(pid, &status, (endt_us == max_U64) ? 0 : WNOHANG)); + pid_t wait_result = LNX_RETRY_ON_EINTR(waitpid(pid, &status, (endt_us == max_U64) ? 0 : WNOHANG)); if((wait_result == pid) && (WIFEXITED(status) || WIFSIGNALED(status))) { diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index a8a34c32..2edcfc3b 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -403,7 +403,7 @@ internal void wm_send_wakeup_event(void) { U64 dummy = 1; - ssize_t size = OS_LNX_RETRY_ON_EINTR(write(os_lnx_gfx_state->wakeup_fd, &dummy, sizeof(dummy))); + ssize_t size = LNX_RETRY_ON_EINTR(write(os_lnx_gfx_state->wakeup_fd, &dummy, sizeof(dummy))); Assert(size == sizeof(dummy)); } diff --git a/src/metagen/metagen.c b/src/metagen/metagen.c index 2bce9e88..0d3e1f98 100644 --- a/src/metagen/metagen.c +++ b/src/metagen/metagen.c @@ -686,8 +686,8 @@ mg_string_from_row_desc_idx(MD_Node *row_parent, MG_ColumnDescArray descs, U64 i cell_idx -= 1; } } - MD_Node *node = md_child_from_index(row_parent, cell_idx); - result = node->string; + MD_Node *node = md_child_from_index(row_parent, cell_idx); + result = node->string; }break; case MG_ColumnKind_CheckForTag: @@ -828,8 +828,8 @@ mg_eval_table_expand_expr__string(Arena *arena, MG_StrExpr *expr, MG_TableExpand }break; case MG_StrExprOp_Null: - { - str8_list_push(arena, out, expr->node->string); + { + str8_list_push(arena, out, expr->node->string); }break; case MG_StrExprOp_Dot: @@ -900,14 +900,14 @@ mg_eval_table_expand_expr__string(Arena *arena, MG_StrExpr *expr, MG_TableExpand } // rjf: push lookup string - { - B32 is_multiline = (str8_find_needle(lookup_string, 0, str8_lit("\n"), 0) < lookup_string.size); - if(is_multiline) - { - lookup_string = indented_from_string(mg_arena, lookup_string); - lookup_string = escaped_from_raw_str8(mg_arena, lookup_string); - lookup_string = escaped_from_raw_str8(mg_arena, lookup_string); - } + { + B32 is_multiline = (str8_find_needle(lookup_string, 0, str8_lit("\n"), 0) < lookup_string.size); + if(is_multiline) + { + lookup_string = indented_from_string(mg_arena, lookup_string); + lookup_string = escaped_from_raw_str8(mg_arena, lookup_string); + lookup_string = escaped_from_raw_str8(mg_arena, lookup_string); + } str8_list_push(arena, out, lookup_string); } }break; @@ -1017,10 +1017,10 @@ mg_loop_table_column_expansion(Arena *arena, String8 strexpr, MG_TableExpandInfo char_idx += 1; } } - String8 expansion_str = str8_list_join(arena, &expansion_strs, 0); + String8 expansion_str = str8_list_join(arena, &expansion_strs, 0); if(expansion_str.size != 0) - { - expansion_str = raw_from_escaped_str8(mg_arena, expansion_str); + { + expansion_str = raw_from_escaped_str8(mg_arena, expansion_str); str8_list_push(arena, out, expansion_str); } } diff --git a/src/metagen/metagen_base/metagen_base_meta.c b/src/metagen/metagen_base/metagen_base_meta.c new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/metagen/metagen_base/metagen_base_meta.c @@ -0,0 +1 @@ + diff --git a/src/metagen/metagen_base/metagen_base_strings.h b/src/metagen/metagen_base/metagen_base_strings.h new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/metagen/metagen_base/metagen_base_strings.h @@ -0,0 +1 @@ + diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 49aa5bf9..41033175 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10591,13 +10591,13 @@ rd_init(CmdLine *cmdln) rd_state->frame_arenas[idx] = arena_alloc(); } rd_state->log = log_alloc(); - log_select(rd_state->log); - { - Temp scratch = scratch_begin(0, 0); - rd_state->log_path = push_str8f(rd_state->arena, "%S/ui_thread.raddbg_log", g_logs_folder); - write_data_to_file_path(rd_state->log_path, str8_zero()); - scratch_end(scratch); - } + log_select(rd_state->log); + { + Temp scratch = scratch_begin(0, 0); + rd_state->log_path = push_str8f(rd_state->arena, "%S/ui_thread.raddbg_log", g_logs_folder); + write_data_to_file_path(rd_state->log_path, str8_zero()); + scratch_end(scratch); + } rd_state->num_frames_requested = 2; rd_state->seconds_until_autosave = 0.5f; rd_state->eval_cache = e_cache_alloc(); diff --git a/src/render/stub/render_stub.c b/src/render/stub/render_stub.c index b34177a9..537f1638 100644 --- a/src/render/stub/render_stub.c +++ b/src/render/stub/render_stub.c @@ -11,7 +11,7 @@ r_init(CmdLine *cmdln) //- rjf: window setup/teardown r_hook R_Handle -r_window_equip(OS_Handle window) +r_window_equip(WM_Window window) { R_Handle handle = {0}; handle.u64[0] = 1; @@ -19,7 +19,7 @@ r_window_equip(OS_Handle window) } r_hook void -r_window_unequip(OS_Handle window, R_Handle window_equip) +r_window_unequip(WM_Window window, R_Handle window_equip) { } @@ -89,18 +89,18 @@ r_end_frame(void) } r_hook void -r_window_begin_frame(OS_Handle window, R_Handle window_equip) +r_window_begin_frame(WM_Window window, R_Handle window_equip) { } r_hook void -r_window_end_frame(OS_Handle window, R_Handle window_equip) +r_window_end_frame(WM_Window window, R_Handle window_equip) { } //- rjf: render pass submission r_hook void -r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes) +r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) { } diff --git a/src/torture/torture.c b/src/torture/torture.c index 6ffa0086..ed66b958 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -11,8 +11,9 @@ global B32 g_stop_on_first_fail_or_crash = 1; global String8 g_test_data; // tests -U64 g_torture_test_count; -T_Test g_torture_tests[0xffffff]; +U64 g_torture_test_count; +T_Test **g_torture_tests; +T_Test g_torture_tests_[0xffffff]; // invoke global U64 g_last_exit_code; @@ -31,7 +32,7 @@ global String8 g_linker_path; internal String8 t_test_name_from_idx(Arena *arena, U64 test_idx) { - return str8f(arena, "%s::%s", g_torture_tests[test_idx].group, g_torture_tests[test_idx].label); + return str8f(arena, "%s::%s", g_torture_tests[test_idx]->group, g_torture_tests[test_idx]->label); } internal char * @@ -723,7 +724,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) read_buffer = push_array(scratch.arena, U8, read_buffer_default_size); } - ssize_t read_size = OS_LNX_RETRY_ON_EINTR(read(captures_linux[i].poll_fd->fd, read_buffer, read_buffer_size)); + ssize_t read_size = LNX_RETRY_ON_EINTR(read(captures_linux[i].poll_fd->fd, read_buffer, read_buffer_size)); if (read_size > 0) { str8_list_push(scratch.arena, captures_linux[i].parts, str8(read_buffer, read_size)); read_buffer += read_size; @@ -891,12 +892,18 @@ t_test_compar(const void *raw_a, const void *raw_b) return cmp; } -internal int +force_inline int t_test_is_before(void *raw_a, void *raw_b) { return t_test_compar(raw_a, raw_b) < 0; } +force_inline int +t_test_ptr_is_before(void *raw_a, void *raw_b) +{ + return t_test_compar(*((T_Test * const *)raw_a), *((T_Test * const *)raw_b)) < 0; +} + internal String8List t_file_paths_from_dir(Arena *arena, String8 dir) { @@ -1018,9 +1025,19 @@ t_entry_point(CmdLine *cmdline) abort_self(0); } } - // register debugger tests - String8 test_folder_path = str8f(scratch.arena, "%S/torture/dbg_tests", t_src_path()); - t_dbg_register_script_tests(scratch.arena, test_folder_path); + + // Gather tests + { + // register debugger tests + String8 test_folder_path = str8f(scratch.arena, "%S/torture/dbg_tests", t_src_path()); + t_dbg_register_script_tests(scratch.arena, test_folder_path); + + // sort tests + g_torture_tests = push_array(scratch.arena, T_Test *, g_torture_test_count); + for EachIndex(i, g_torture_test_count) { g_torture_tests[i] = &g_torture_tests_[i]; } + radsort(g_torture_tests, g_torture_test_count, t_test_ptr_is_before); + } + // // Handle -list // @@ -1028,7 +1045,7 @@ t_entry_point(CmdLine *cmdline) if (cmd_line_has_flag(cmdline, str8_lit("list"))) { PrintHeader("Tests"); for EachIndex(i, g_torture_test_count) { - fprintf(stdout, " %s\n", g_torture_tests[i].label); + fprintf(stdout, " %s\n", g_torture_tests[i]->label); } abort_self(0); } @@ -1073,14 +1090,14 @@ t_entry_point(CmdLine *cmdline) for EachNode(pattern_n, String8Node, targets.first) { B32 do_namespace = str8_find_needle(pattern_n->string, 0, str8_lit("::"), 0) < pattern_n->string.size; for EachIndex(test_idx, g_torture_test_count) { - String8 name = str8_cstring(g_torture_tests[test_idx].label); + String8 name = str8_cstring(g_torture_tests[test_idx]->label); if (do_namespace) { name = t_test_name_from_idx(scratch.arena, test_idx); } if (str8_match_wildcard(name, pattern_n->string, 0)) { if ( ! hash_table_search_string(ht, name)) { hash_table_push_string_raw(scratch.arena, ht, name, 0); - str8_list_push(scratch.arena, &target, str8_cstring(g_torture_tests[test_idx].label)); + str8_list_push(scratch.arena, &target, str8_cstring(g_torture_tests[test_idx]->label)); } } } @@ -1149,9 +1166,7 @@ t_entry_point(CmdLine *cmdline) // // Run tests // - { - radsort(g_torture_tests, g_torture_test_count, t_test_is_before); - + { U64List target_indices_list = {0}; if (target.node_count == 0) { for EachIndex(i, g_torture_test_count) { u64_list_push(scratch.arena, &target_indices_list, i); } @@ -1159,7 +1174,7 @@ t_entry_point(CmdLine *cmdline) for EachNode(target_n, String8Node, target.first) { B32 is_target_unknown = 1; for EachIndex(i, g_torture_test_count) { - if (str8_match(str8_cstring(g_torture_tests[i].label), target_n->string, 0)) { + if (str8_match(str8_cstring(g_torture_tests[i]->label), target_n->string, 0)) { u64_list_push(scratch.arena, &target_indices_list, i); is_target_unknown = 0; break; @@ -1201,8 +1216,8 @@ t_entry_point(CmdLine *cmdline) U64 max_group_size = 0; for EachIndex(i, target_indices.count) { U64 test_idx = target_indices.v[i]; - max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[test_idx].label)); - max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[test_idx].group)); + max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[test_idx]->label)); + max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[test_idx]->group)); } PrintHeader("Tests"); @@ -1216,19 +1231,20 @@ t_entry_point(CmdLine *cmdline) for EachElement(i, slowest) { slowest[i].target_idx = max_U64; } for EachIndex(i, target_indices.count) { U64 target_idx = target_indices.v[i]; + T_Test *test = g_torture_tests[target_idx]; // print run progress U64 dots_min = 10; - U64 dots_count = (max_label_size - cstring8_length((U8*)g_torture_tests[target_idx].label)) + dots_min; + U64 dots_count = (max_label_size - cstring8_length((U8*)test->label)) + dots_min; U64 curr_digit_count = count_digits_u64(i+1, 10); int idx_align_space_count = (int)(max_digit_count - curr_digit_count); fprintf(stdout, "[%.*s%llu/%llu] ", idx_align_space_count, spaces, (unsigned long long)i+1, (unsigned long long)target_indices.count); - fprintf(stdout, "%s %.*s:: %s", g_torture_tests[target_idx].group, (int)(max_group_size - cstring8_length((U8*)g_torture_tests[target_idx].group)), spaces, g_torture_tests[target_idx].label); + fprintf(stdout, "%s %.*s:: %s", test->group, (int)(max_group_size - cstring8_length((U8*)test->group)), spaces, test->label); fprintf(stdout, " %.*s ", (int)dots_count, dots); fflush(stdout); // setup output directory - g_wdir = push_str8f(scratch.arena, "%S/%s", g_out, g_torture_tests[target_idx].label); + g_wdir = push_str8f(scratch.arena, "%S/%s", g_out, test->label); g_wdir = full_path_from_path(scratch.arena, g_wdir); // delete files from last run in the work directory @@ -1244,7 +1260,7 @@ t_entry_point(CmdLine *cmdline) // run test U64 run_start_time = now_time_us(); - T_RunResult result = t_run(g_torture_tests[target_idx].r, g_torture_tests[target_idx].user_data); + T_RunResult result = t_run(test->r, test->user_data); U64 run_end_time = now_time_us(); // print result if (result.status == T_RunStatus_Pass) { @@ -1309,8 +1325,8 @@ t_entry_point(CmdLine *cmdline) for EachElement(i, slowest) { Slowest s = slowest[i]; if (s.target_idx >= g_torture_test_count) { break; } - label_max = Max(strlen(g_torture_tests[s.target_idx].label), label_max); - group_max = Max(strlen(g_torture_tests[s.target_idx].group), group_max); + label_max = Max(strlen(g_torture_tests[s.target_idx]->label), label_max); + group_max = Max(strlen(g_torture_tests[s.target_idx]->group), group_max); } for EachElement(i, slowest) { @@ -1318,10 +1334,10 @@ t_entry_point(CmdLine *cmdline) if (s.target_idx >= g_torture_test_count) { break; } String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); fprintf(stderr, " %s %.*s:: %s %.*s %.*s\n", - g_torture_tests[s.target_idx].group, - (int)(group_max - strlen(g_torture_tests[s.target_idx].group)), spaces, - g_torture_tests[s.target_idx].label, - (int)(label_max - strlen(g_torture_tests[s.target_idx].label)) + 4, dots, + g_torture_tests[s.target_idx]->group, + (int)(group_max - strlen(g_torture_tests[s.target_idx]->group)), spaces, + g_torture_tests[s.target_idx]->label, + (int)(label_max - strlen(g_torture_tests[s.target_idx]->label)) + 4, dots, str8_varg(elapsed_time)); } diff --git a/src/torture/torture.h b/src/torture/torture.h index ecc383a8..9007056c 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -55,9 +55,9 @@ typedef enum T_Linker_LLVM } T_Linker; -extern U64 g_torture_test_count; -extern T_Test g_torture_tests[0xffffff]; -extern U64 g_torture_running_test_idx; +extern U64 g_torture_test_count; +extern T_Test **g_torture_tests; +extern T_Test g_torture_tests_[0xffffff]; internal void t_break_if_debugger_present(void); @@ -65,7 +65,7 @@ internal void t_break_if_debugger_present(void); T_RunSig(name); \ __VA_ARGS__ void t_add_test_##name(void) \ { \ - g_torture_tests[g_torture_test_count++] = (T_Test){ .group = T_Group, .label = Stringify(name), .r = &t_##name, .decl_line = l }; \ + g_torture_tests_[g_torture_test_count++] = (T_Test){ .group = T_Group, .label = Stringify(name), .r = &t_##name, .decl_line = l }; \ } #if COMPILER_MSVC @@ -97,7 +97,7 @@ internal void t_break_if_debugger_present(void); #define TIMEOUT_MS(x) TIMEOUT_US((x)*1000ull) #define TIMEOUT_SEC(x) TIMEOUT_MS((x)*1000ull) -#define ENDT_US(x) (os_now_microseconds() + (x)) +#define ENDT_US(x) (now_time_us() + (x)) #define ENDT_MS(x) TIMEOUT_US((x)*1000ull) #define ENDT_SEC(x) TIMEOUT_MS((x)*1000ull) @@ -132,4 +132,3 @@ internal void t_kill_all(String8 pattern); #define t_invoke_linker_timeout(c, t) T_Ok(t_invoke(t_radlink_path(), c, t)) #define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(arena, f, ##__VA_ARGS__), t) #define t_invoke_linker(c) t_invoke_linker_timeout(c, max_U64) - diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 101e945d..e60d1591 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -212,8 +212,8 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) } // "solve" the wait problem - if (os_now_microseconds() >= t) { Assert(0 && "timeout"); goto exit; } - os_sleep_milliseconds(10); + if (now_time_us() >= t) { Assert(0 && "timeout"); goto exit; } + sleep_ms(10); } //--- Status --------------------- @@ -271,14 +271,14 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) cmdline = str8f(scratch.arena, "%S --gen_crash_dump --user:\"%S\" --project:\"%S\" --logs:\"%S\" %S", t_raddbg_path(), user_path, project_path, g_wdir, cmdline); // launch debugger - OS_ProcessLaunchParams launch_opts = { + ProcessLaunchParams launch_opts = { .path = g_wdir, .inherit_env = 1, .consoleless = 1, .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), }; - OS_Handle dbg_handle = os_process_launch(&launch_opts); - if (os_handle_match(dbg_handle, os_handle_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } + Process dbg_handle = process_launch(&launch_opts); + if (process_match(dbg_handle, process_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } #if OS_WINDOWS // cache debugger PID @@ -290,7 +290,7 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) #endif // close debugger handle - os_process_join(dbg_handle, 0, 0); + process_detach(dbg_handle); // now wait for debugger to init U64 t = ENDT_US(timeout_us); @@ -300,8 +300,8 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) if (dbg_ready) { break; } // "solve" the wait problem - if (os_now_microseconds() >= t) { Assert(0 && "timeout"); break; } - os_sleep_milliseconds(10); + if (now_time_us() >= t) { Assert(0 && "timeout"); break; } + sleep_ms(10); } exit:; @@ -644,13 +644,13 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) internal T_RunSig(dbg_script_runner) { - if ( ! os_file_path_exists(t_raddbg_path())) { + if ( ! file_path_exists(t_raddbg_path())) { fprintf(stderr, "ERROR: failed to find debugger \"%.*s\"\n", str8_varg(t_raddbg_path())); T_Ok(0); } // read source file - String8 source = os_data_from_file_path(arena, user_data); + String8 source = data_from_file_path(arena, user_data); if (source.size == 0) { fprintf(stderr, "ERROR: failed to read script: \"%.*s\"\n", str8_varg(user_data)); T_Ok(0); @@ -661,7 +661,7 @@ T_RunSig(dbg_script_runner) // write source files to test folder for EachNode(file, T_DbgScriptFile, script.files.first) { - if (os_write_data_to_file_path(file->path, file->source) == 0) { + if (write_data_to_file_path(file->path, file->source) == 0) { fprintf(stderr, "ERROR: %.*s:%llu: failed to write: \"%.*s\"\n", str8_varg(user_data), (unsigned long long)file->line, str8_varg(file->path)); T_Ok(0); } @@ -750,7 +750,7 @@ t_dbg_register_script_tests(Arena *arena, String8 folder_path) { Temp scratch = scratch_begin(&arena, 1); - if ( ! os_folder_path_exists(folder_path)) { + if ( ! folder_path_exists(folder_path)) { fprintf(stderr, "ERROR: this folder does not exists: %.*s\n", str8_varg(folder_path)); return; } @@ -766,7 +766,7 @@ t_dbg_register_script_tests(Arena *arena, String8 folder_path) String8List file_name_parts = str8_split_by_string_chars(scratch.arena, str8_skip_last_slash(file_path), str8_lit("."), 0); String8 file_name_escaped = str8_list_join(arena, &file_name_parts, &(StringJoin){.sep=str8_lit("-"), .post = str8_lit("\0") }); - g_torture_tests[g_torture_test_count++] = (T_Test){ + g_torture_tests_[g_torture_test_count++] = (T_Test){ .group = T_Group, .label = (char*)file_name_escaped.str, .r = t_dbg_script_runner, From 15bf3431689b3cf56bed767286f5e68e08a0e0ee Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 15:55:20 -0700 Subject: [PATCH 649/850] gate for dwarf converter --- src/radbin/radbin.c | 93 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 1704ddef..828dca48 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -719,7 +719,89 @@ rb_thread_entry_point(void *p) else if(elf_w_dwarf) { log_infof("ELFs specified; converting DWARF data to RDI\n"); } // rjf: convert - D2R2_ConvertParams convert_params = {0}; + D2R_ConvertParams convert_params = {0}; + { + B32 got_exe = 0; + B32 got_dbg = 0; + if(!got_exe && !got_dbg) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_PE].first; n != 0; n = n->next) + { + if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) + { + got_exe = 1; + got_dbg = 1; + convert_params.dbg_name = n->v->path; + convert_params.dbg_data = n->v->data; + convert_params.exe_name = n->v->path; + convert_params.exe_data = n->v->data; + convert_params.exe_kind = ExecutableImageKind_CoffPe; + break; + } + } + } + if(!got_exe) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next) + { + got_exe = 1; + convert_params.exe_name = n->v->path; + convert_params.exe_data = n->v->data; + convert_params.exe_kind = ExecutableImageKind_Elf32; + if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF)) + { + break; + } + } + } + if(!got_exe) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next) + { + got_exe = 1; + convert_params.exe_name = n->v->path; + convert_params.exe_data = n->v->data; + convert_params.exe_kind = ExecutableImageKind_Elf64; + if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF)) + { + break; + } + } + } + if(!got_dbg) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next) + { + if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) + { + got_dbg = 1; + convert_params.dbg_name = n->v->path; + convert_params.dbg_data = n->v->data; + break; + } + } + } + if(!got_dbg) + { + for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next) + { + if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) + { + got_dbg = 1; + convert_params.dbg_name = n->v->path; + convert_params.dbg_data = n->v->data; + break; + } + } + } + convert_params.subset_flags = subset_flags; + convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + convert_params.is_parse_relaxed = 1; // TODO: switch + } +#if DWARF_2 + + // rjf: convert [2] + D2R2_ConvertParams convert_params_2 = {0}; { B32 got_exe = 0; B32 got_dbg = 0; @@ -834,7 +916,10 @@ rb_thread_entry_point(void *p) convert_params.subset_flags = subset_flags; convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } - ProfScope("convert") dwarf_bake_params = d2r2_convert(arena, &convert_params); + ProfScope("convert [2]") dwarf_bake_params_2 = d2r2_convert(arena, &convert_params_2); +#else + ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); +#endif } //- rjf: PDB inputs => PDB -> RDI conversion @@ -909,7 +994,11 @@ rb_thread_entry_point(void *p) { bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); +#if DWARF_2 + rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); +#else rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); +#endif for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) { rdim_bake_params_concat_in_place(bake_params, &n->v); From 1e0f1d026bad54a2aa560f4a00ac4ca67d0d4551 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 16:38:37 -0700 Subject: [PATCH 650/850] sanity-check scissor region, fix var shadowing bug in blur GLSL shader, and remove 'blur_count' that causes linking issues [OpenGL] GL_INVALID_OPERATION in glGetUniformLocation(program not linked) [OpenGL] GL_INVALID_OPERATION in glUniform(program not linked) [OpenGL] GL_INVALID_VALUE in glScissor --- .../opengl/generated/render_opengl.meta.h | 16 +++++----- src/render/opengl/render_opengl.c | 30 +++++++++++++++---- src/render/opengl/render_opengl.mdesk | 16 +++++----- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index 7ae7980b..b8c2117b 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -202,23 +202,23 @@ str8_lit_comp( " rect.xy,\n" " rect.zw,\n" " rect.zy);\n" -" float corner_radii_px[] = float[](corner_radii_px.y,\n" -" corner_radii_px.x,\n" -" corner_radii_px.w,\n" -" corner_radii_px.z);\n" +" float corner_radii[] = float[](corner_radii_px.y,\n" +" corner_radii_px.x,\n" +" corner_radii_px.w,\n" +" corner_radii_px.z);\n" " vec2 cornercoords_pct = vec2((gl_VertexID >> 1) != 0 ? 1.f : 0.f,\n" " (gl_VertexID & 1) != 0 ? 0.f : 1.f);\n" " \n" " vec2 vertex_position_pct = vertex_positions_scrn[gl_VertexID] / viewport_size;\n" " vec2 vertex_position_scr = 2.f * vertex_position_pct - 1.f;\n" " \n" -" vec2 rect_half_size = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" +" vec2 rect_half_size_local = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" " \n" " gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f);\n" " texcoord = vec2(vertex_position_pct.x, 1-vertex_position_pct.y);\n" -" sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size;\n" -" rect_half_size = rect_half_size - 2.f;\n" -" corner_radius = corner_radii_px[gl_VertexID];\n" +" sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size_local;\n" +" rect_half_size = rect_half_size_local - 2.f;\n" +" corner_radius = corner_radii[gl_VertexID];\n" "}\n" "" ); diff --git a/src/render/opengl/render_opengl.c b/src/render/opengl/render_opengl.c index dc58659b..d9814293 100644 --- a/src/render/opengl/render_opengl.c +++ b/src/render/opengl/render_opengl.c @@ -95,6 +95,22 @@ r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum sever fprintf(stderr, "[OpenGL] %.*s\n", (int)length, message); } +internal B32 +r_ogl_scissor(Rng2F32 clip, Vec2F32 viewport_dim) +{ + S32 x0 = Clamp(0, (S32)floor_f32(clip.x0), (S32)viewport_dim.x); + S32 y0 = Clamp(0, (S32)floor_f32(clip.y0), (S32)viewport_dim.y); + S32 x1 = Clamp(0, (S32)ceil_f32(clip.x1), (S32)viewport_dim.x); + S32 y1 = Clamp(0, (S32)ceil_f32(clip.y1), (S32)viewport_dim.y); + S32 width = x1 - x0; + S32 height = y1 - y0; + if(width > 0 && height > 0) + { + glScissor(x0, (S32)viewport_dim.y - y1, width, height); + } + return width > 0 && height > 0; +} + //////////////////////////////// //~ rjf: Backend Hooks @@ -560,9 +576,10 @@ r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) group_params->clip.y0 != 0 || group_params->clip.y1 != 0) { - Rng2F32 clip = group_params->clip; - glScissor(clip.x0, viewport_dim.y - clip.y1, (clip.x1-clip.x0) + 1, (clip.y1-clip.y0)+1); - glEnable(GL_SCISSOR_TEST); + if(r_ogl_scissor(group_params->clip, viewport_dim)) + { + glEnable(GL_SCISSOR_TEST); + } } //- rjf: draw @@ -650,9 +667,10 @@ r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) params->clip.y0 != 0 || params->clip.y1 != 0) { - Rng2F32 clip = params->clip; - glScissor(clip.x0, viewport_dim.y - clip.y1, (clip.x1-clip.x0) + 1, (clip.y1-clip.y0)+1); - glEnable(GL_SCISSOR_TEST); + if(r_ogl_scissor(params->clip, viewport_dim)) + { + glEnable(GL_SCISSOR_TEST); + } } //- rjf: pass 1: stage -(horizontal)-> stage_scratch diff --git a/src/render/opengl/render_opengl.mdesk b/src/render/opengl/render_opengl.mdesk index a99e2c33..c2665929 100644 --- a/src/render/opengl/render_opengl.mdesk +++ b/src/render/opengl/render_opengl.mdesk @@ -226,23 +226,23 @@ void main(void) rect.xy, rect.zw, rect.zy); - float corner_radii_px[] = float[](corner_radii_px.y, - corner_radii_px.x, - corner_radii_px.w, - corner_radii_px.z); + float corner_radii[] = float[](corner_radii_px.y, + corner_radii_px.x, + corner_radii_px.w, + corner_radii_px.z); vec2 cornercoords_pct = vec2((gl_VertexID >> 1) != 0 ? 1.f : 0.f, (gl_VertexID & 1) != 0 ? 0.f : 1.f); vec2 vertex_position_pct = vertex_positions_scrn[gl_VertexID] / viewport_size; vec2 vertex_position_scr = 2.f * vertex_position_pct - 1.f; - vec2 rect_half_size = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2); + vec2 rect_half_size_local = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2); gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f); texcoord = vec2(vertex_position_pct.x, 1-vertex_position_pct.y); - sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size; - rect_half_size = rect_half_size - 2.f; - corner_radius = corner_radii_px[gl_VertexID]; + sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size_local; + rect_half_size = rect_half_size_local - 2.f; + corner_radius = corner_radii[gl_VertexID]; } ``` From 612ac8f414212db0231a9f54848279c0712484ce Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 17:06:01 -0700 Subject: [PATCH 651/850] fix regression introduced in aea4a4ff --- src/dwarf/dwarf_unwind.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index 9bb808bb..28764c8f 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -254,10 +254,10 @@ dw_compute_cfa(Arch arch, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *m Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; if(!arch_reg_block_read_range(arch_info, reg_block, reg_rng, &cfa_reg_value)) { - unwind_status = MachineOpResult_Fail; break; } *cfa_out = cfa_reg_value + row->cfa.off; + unwind_status = MachineOpResult_Ok; }break; case DW_CFA_Rule_Expression: { @@ -360,4 +360,3 @@ dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, void *reg_block scratch_end(scratch); return unwind_status; } - From fb48dcf42b8a9c01614fbc5b68a72db52152304b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 17:09:29 -0700 Subject: [PATCH 652/850] update defines for non-graphical debugger build --- build.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.sh b/build.sh index e1ef4605..bd1aa75a 100755 --- a/build.sh +++ b/build.sh @@ -62,7 +62,7 @@ fi # --- Build Everything (@build_targets) --------------------------------------- cd build if [[ "${raddbg:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg; fi -if [[ "${raddbg_non_graphical:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c -DOS_GFX_STUB=1 -DOS_GFX_STUB_DEFAULT_REFRESH_RATE=60.f -DR_BACKEND=R_BACKEND_STUB $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg_non_graphical; fi +if [[ "${raddbg_non_graphical:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c -DWM_STUB=1 -DWM_STUB_DEFAULT_REFRESH_RATE=60.f -DR_BACKEND=R_BACKEND_STUB $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg_non_graphical; fi if [[ "${radbin:-0}" == "1" ]]; then didbuild=1 && $compile ../src/radbin/radbin_main.c $cc_link -o radbin; fi if [[ "${radlink:-0}" == "1" ]]; then didbuild=1 && $compile ../src/linker/lnk.c $cc_link -o radlink; fi if [[ "${torture:-0}" == "1" ]]; then didbuild=1 && $compile ../src/torture/torture_main.c $cc_link $cc_os_gfx $cc_render $cc_font_provider -o torture; fi @@ -74,4 +74,3 @@ then echo "[WARNING] no valid build target specified; must use build target names as arguments to this script, like \`./build.sh raddbg\` or \`./build.sh radlink\`." exit 1 fi - From a1f0df2d76b7e48ac0c6e6104746ef877fa76fc6 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 17:13:46 -0700 Subject: [PATCH 653/850] run clang build for now --- .github/workflows/builds.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 774afbc3..a675df2b 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -94,7 +94,7 @@ jobs: - name: Run shell: bash run: | - CC="${{ matrix.compiler }}" ./run.sh "${{ matrix.compiler }}" "${{ matrix.mode }}" -- --gen_crash_dump + CC="${{ matrix.compiler }}" ./run.sh clang "${{ matrix.mode }}" -- --gen_crash_dump - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 From 5089a010584b0937329ef2e920c96adb32ae5b7d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 18:23:29 -0700 Subject: [PATCH 654/850] change make_directory behavior on Linux to match Windows behavior --- src/linux/base/linux_base.c | 5 +++++ src/metagen/metagen_os/core/linux/metagen_os_core_linux.c | 1 + 2 files changed, 6 insertions(+) create mode 100644 src/metagen/metagen_os/core/linux/metagen_os_core_linux.c diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index a8e31b9a..93a4a47c 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1159,6 +1159,11 @@ make_directory(String8 path) { result = 1; } + else + { + // match windows behavior + result = file_path_exists(path); + } scratch_end(scratch); return result; } diff --git a/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/metagen/metagen_os/core/linux/metagen_os_core_linux.c @@ -0,0 +1 @@ + From 9447cce94d2249f0c6a730283ac83a91b1f09092 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 18:24:57 -0700 Subject: [PATCH 655/850] open generated files as binary so we have consistent line endings across Linux and Windows --- src/metagen/metagen_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 9d9a1e78..52393377 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -533,7 +533,7 @@ entry_point(CmdLine *cmdline) c_path = push_str8f(mg_arena, "%S/%S", layer_generated_folder, str8_skip_last_slash(layer->c_name_override)); } { - FILE *h = fopen((char *)h_path.str, "w"); + FILE *h = fopen((char *)h_path.str, "wb"); fprintf(h, "// Copyright (c) Epic Games Tools\n"); fprintf(h, "// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n"); if(layer->h_header.first == 0) @@ -589,7 +589,7 @@ entry_point(CmdLine *cmdline) fclose(h); } { - FILE *c = fopen((char *)c_path.str, "w"); + FILE *c = fopen((char *)c_path.str, "wb"); fprintf(c, "// Copyright (c) Epic Games Tools\n"); fprintf(c, "// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n"); if(layer->c_header.first == 0) From c62afbcf8341af03a672dc23d7e622e7d0a40d26 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 18:25:18 -0700 Subject: [PATCH 656/850] normalize line endings in generated files --- src/codeview/generated/codeview.meta.c | 1436 ++++---- src/codeview/generated/codeview.meta.h | 1056 +++--- src/dbg_engine/generated/dbg_engine.meta.c | 416 +-- src/demon/generated/demon.meta.c | 84 +- src/demon/generated/demon.meta.h | 140 +- src/draw/generated/draw.meta.c | 34 +- src/draw/generated/draw.meta.h | 98 +- src/eval/generated/eval.meta.c | 544 +-- src/eval/generated/eval.meta.h | 362 +- src/lib_rdi/rdi.c | 710 ++-- src/lib_rdi/rdi.h | 2964 ++++++++--------- src/radbin/generated/radbin.meta.c | 44 +- src/radbin/generated/radbin.meta.h | 58 +- .../d3d11/generated/render_d3d11.meta.c | 138 +- .../d3d11/generated/render_d3d11.meta.h | 966 +++--- src/render/generated/render.meta.c | 136 +- src/render/generated/render.meta.h | 130 +- .../opengl/generated/render_opengl.meta.c | 76 +- .../opengl/generated/render_opengl.meta.h | 561 ++-- src/text/generated/text.meta.c | 916 ++--- src/text/generated/text.meta.h | 82 +- src/ui/generated/ui.meta.c | 424 +-- src/ui/generated/ui.meta.h | 816 ++--- 23 files changed, 6096 insertions(+), 6095 deletions(-) diff --git a/src/codeview/generated/codeview.meta.c b/src/codeview/generated/codeview.meta.c index 672e674a..2fcfaa11 100644 --- a/src/codeview/generated/codeview.meta.c +++ b/src/codeview/generated/codeview.meta.c @@ -1,718 +1,718 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -internal String8 -cv_string_from_numeric_kind(CV_NumericKind v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_NumericKind_CHAR:{result = str8_lit("CHAR");}break; -case CV_NumericKind_SHORT:{result = str8_lit("SHORT");}break; -case CV_NumericKind_USHORT:{result = str8_lit("USHORT");}break; -case CV_NumericKind_LONG:{result = str8_lit("LONG");}break; -case CV_NumericKind_ULONG:{result = str8_lit("ULONG");}break; -case CV_NumericKind_FLOAT32:{result = str8_lit("FLOAT32");}break; -case CV_NumericKind_FLOAT64:{result = str8_lit("FLOAT64");}break; -case CV_NumericKind_FLOAT80:{result = str8_lit("FLOAT80");}break; -case CV_NumericKind_FLOAT128:{result = str8_lit("FLOAT128");}break; -case CV_NumericKind_QUADWORD:{result = str8_lit("QUADWORD");}break; -case CV_NumericKind_UQUADWORD:{result = str8_lit("UQUADWORD");}break; -case CV_NumericKind_FLOAT48:{result = str8_lit("FLOAT48");}break; -case CV_NumericKind_COMPLEX32:{result = str8_lit("COMPLEX32");}break; -case CV_NumericKind_COMPLEX64:{result = str8_lit("COMPLEX64");}break; -case CV_NumericKind_COMPLEX80:{result = str8_lit("COMPLEX80");}break; -case CV_NumericKind_COMPLEX128:{result = str8_lit("COMPLEX128");}break; -case CV_NumericKind_VARSTRING:{result = str8_lit("VARSTRING");}break; -case CV_NumericKind_OCTWORD:{result = str8_lit("OCTWORD");}break; -case CV_NumericKind_UOCTWORD:{result = str8_lit("UOCTWORD");}break; -case CV_NumericKind_DECIMAL:{result = str8_lit("DECIMAL");}break; -case CV_NumericKind_DATE:{result = str8_lit("DATE");}break; -case CV_NumericKind_UTF8STRING:{result = str8_lit("UTF8STRING");}break; -case CV_NumericKind_FLOAT16:{result = str8_lit("FLOAT16");}break; -} -return result; -} - -internal String8 -cv_string_from_arch(CV_Arch v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_Arch_8080:{result = str8_lit("8080");}break; -case CV_Arch_8086:{result = str8_lit("8086");}break; -case CV_Arch_80286:{result = str8_lit("80286");}break; -case CV_Arch_80386:{result = str8_lit("80386");}break; -case CV_Arch_80486:{result = str8_lit("80486");}break; -case CV_Arch_PENTIUM:{result = str8_lit("PENTIUM");}break; -case CV_Arch_PENTIUMII:{result = str8_lit("PENTIUMII");}break; -case CV_Arch_PENTIUMIII:{result = str8_lit("PENTIUMIII");}break; -case CV_Arch_MIPS:{result = str8_lit("MIPS");}break; -case CV_Arch_MIPS16:{result = str8_lit("MIPS16");}break; -case CV_Arch_MIPS32:{result = str8_lit("MIPS32");}break; -case CV_Arch_MIPS64:{result = str8_lit("MIPS64");}break; -case CV_Arch_MIPSI:{result = str8_lit("MIPSI");}break; -case CV_Arch_MIPSII:{result = str8_lit("MIPSII");}break; -case CV_Arch_MIPSIII:{result = str8_lit("MIPSIII");}break; -case CV_Arch_MIPSIV:{result = str8_lit("MIPSIV");}break; -case CV_Arch_MIPSV:{result = str8_lit("MIPSV");}break; -case CV_Arch_M68000:{result = str8_lit("M68000");}break; -case CV_Arch_M68010:{result = str8_lit("M68010");}break; -case CV_Arch_M68020:{result = str8_lit("M68020");}break; -case CV_Arch_M68030:{result = str8_lit("M68030");}break; -case CV_Arch_M68040:{result = str8_lit("M68040");}break; -case CV_Arch_ALPHA:{result = str8_lit("ALPHA");}break; -case CV_Arch_ALPHA_21164:{result = str8_lit("ALPHA_21164");}break; -case CV_Arch_ALPHA_21164A:{result = str8_lit("ALPHA_21164A");}break; -case CV_Arch_ALPHA_21264:{result = str8_lit("ALPHA_21264");}break; -case CV_Arch_ALPHA_21364:{result = str8_lit("ALPHA_21364");}break; -case CV_Arch_PPC601:{result = str8_lit("PPC601");}break; -case CV_Arch_PPC603:{result = str8_lit("PPC603");}break; -case CV_Arch_PPC604:{result = str8_lit("PPC604");}break; -case CV_Arch_PPC620:{result = str8_lit("PPC620");}break; -case CV_Arch_PPCFP:{result = str8_lit("PPCFP");}break; -case CV_Arch_PPCBE:{result = str8_lit("PPCBE");}break; -case CV_Arch_SH3:{result = str8_lit("SH3");}break; -case CV_Arch_SH3E:{result = str8_lit("SH3E");}break; -case CV_Arch_SH3DSP:{result = str8_lit("SH3DSP");}break; -case CV_Arch_SH4:{result = str8_lit("SH4");}break; -case CV_Arch_SHMEDIA:{result = str8_lit("SHMEDIA");}break; -case CV_Arch_ARM3:{result = str8_lit("ARM3");}break; -case CV_Arch_ARM4:{result = str8_lit("ARM4");}break; -case CV_Arch_ARM4T:{result = str8_lit("ARM4T");}break; -case CV_Arch_ARM5:{result = str8_lit("ARM5");}break; -case CV_Arch_ARM5T:{result = str8_lit("ARM5T");}break; -case CV_Arch_ARM6:{result = str8_lit("ARM6");}break; -case CV_Arch_ARM_XMAC:{result = str8_lit("ARM_XMAC");}break; -case CV_Arch_ARM_WMMX:{result = str8_lit("ARM_WMMX");}break; -case CV_Arch_ARM7:{result = str8_lit("ARM7");}break; -case CV_Arch_OMNI:{result = str8_lit("OMNI");}break; -case CV_Arch_IA64_1:{result = str8_lit("IA64_1");}break; -case CV_Arch_IA64_2:{result = str8_lit("IA64_2");}break; -case CV_Arch_CEE:{result = str8_lit("CEE");}break; -case CV_Arch_AM33:{result = str8_lit("AM33");}break; -case CV_Arch_M32R:{result = str8_lit("M32R");}break; -case CV_Arch_TRICORE:{result = str8_lit("TRICORE");}break; -case CV_Arch_X64:{result = str8_lit("X64");}break; -case CV_Arch_EBC:{result = str8_lit("EBC");}break; -case CV_Arch_THUMB:{result = str8_lit("THUMB");}break; -case CV_Arch_ARMNT:{result = str8_lit("ARMNT");}break; -case CV_Arch_ARM64:{result = str8_lit("ARM64");}break; -case CV_Arch_D3D11_SHADER:{result = str8_lit("D3D11_SHADER");}break; -} -return result; -} - -internal String8 -cv_string_from_sym_kind(CV_SymKind v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_SymKind_COMPILE:{result = str8_lit("COMPILE");}break; -case CV_SymKind_REGISTER_16t:{result = str8_lit("REGISTER_16t");}break; -case CV_SymKind_CONSTANT_16t:{result = str8_lit("CONSTANT_16t");}break; -case CV_SymKind_UDT_16t:{result = str8_lit("UDT_16t");}break; -case CV_SymKind_SSEARCH:{result = str8_lit("SSEARCH");}break; -case CV_SymKind_END:{result = str8_lit("END");}break; -case CV_SymKind_SKIP:{result = str8_lit("SKIP");}break; -case CV_SymKind_CVRESERVE:{result = str8_lit("CVRESERVE");}break; -case CV_SymKind_OBJNAME_ST:{result = str8_lit("OBJNAME_ST");}break; -case CV_SymKind_ENDARG:{result = str8_lit("ENDARG");}break; -case CV_SymKind_COBOLUDT_16t:{result = str8_lit("COBOLUDT_16t");}break; -case CV_SymKind_MANYREG_16t:{result = str8_lit("MANYREG_16t");}break; -case CV_SymKind_RETURN:{result = str8_lit("RETURN");}break; -case CV_SymKind_ENTRYTHIS:{result = str8_lit("ENTRYTHIS");}break; -case CV_SymKind_BPREL16:{result = str8_lit("BPREL16");}break; -case CV_SymKind_LDATA16:{result = str8_lit("LDATA16");}break; -case CV_SymKind_GDATA16:{result = str8_lit("GDATA16");}break; -case CV_SymKind_PUB16:{result = str8_lit("PUB16");}break; -case CV_SymKind_LPROC16:{result = str8_lit("LPROC16");}break; -case CV_SymKind_GPROC16:{result = str8_lit("GPROC16");}break; -case CV_SymKind_THUNK16:{result = str8_lit("THUNK16");}break; -case CV_SymKind_BLOCK16:{result = str8_lit("BLOCK16");}break; -case CV_SymKind_WITH16:{result = str8_lit("WITH16");}break; -case CV_SymKind_LABEL16:{result = str8_lit("LABEL16");}break; -case CV_SymKind_CEXMODEL16:{result = str8_lit("CEXMODEL16");}break; -case CV_SymKind_VFTABLE16:{result = str8_lit("VFTABLE16");}break; -case CV_SymKind_REGREL16:{result = str8_lit("REGREL16");}break; -case CV_SymKind_BPREL32_16t:{result = str8_lit("BPREL32_16t");}break; -case CV_SymKind_LDATA32_16t:{result = str8_lit("LDATA32_16t");}break; -case CV_SymKind_GDATA32_16t:{result = str8_lit("GDATA32_16t");}break; -case CV_SymKind_PUB32_16t:{result = str8_lit("PUB32_16t");}break; -case CV_SymKind_LPROC32_16t:{result = str8_lit("LPROC32_16t");}break; -case CV_SymKind_GPROC32_16t:{result = str8_lit("GPROC32_16t");}break; -case CV_SymKind_THUNK32_ST:{result = str8_lit("THUNK32_ST");}break; -case CV_SymKind_BLOCK32_ST:{result = str8_lit("BLOCK32_ST");}break; -case CV_SymKind_WITH32_ST:{result = str8_lit("WITH32_ST");}break; -case CV_SymKind_LABEL32_ST:{result = str8_lit("LABEL32_ST");}break; -case CV_SymKind_CEXMODEL32:{result = str8_lit("CEXMODEL32");}break; -case CV_SymKind_VFTABLE32_16t:{result = str8_lit("VFTABLE32_16t");}break; -case CV_SymKind_REGREL32_16t:{result = str8_lit("REGREL32_16t");}break; -case CV_SymKind_LTHREAD32_16t:{result = str8_lit("LTHREAD32_16t");}break; -case CV_SymKind_GTHREAD32_16t:{result = str8_lit("GTHREAD32_16t");}break; -case CV_SymKind_SLINK32:{result = str8_lit("SLINK32");}break; -case CV_SymKind_LPROCMIPS_16t:{result = str8_lit("LPROCMIPS_16t");}break; -case CV_SymKind_GPROCMIPS_16t:{result = str8_lit("GPROCMIPS_16t");}break; -case CV_SymKind_PROCREF_ST:{result = str8_lit("PROCREF_ST");}break; -case CV_SymKind_DATAREF_ST:{result = str8_lit("DATAREF_ST");}break; -case CV_SymKind_ALIGN:{result = str8_lit("ALIGN");}break; -case CV_SymKind_LPROCREF_ST:{result = str8_lit("LPROCREF_ST");}break; -case CV_SymKind_OEM:{result = str8_lit("OEM");}break; -case CV_SymKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; -case CV_SymKind_CONSTANT_ST:{result = str8_lit("CONSTANT_ST");}break; -case CV_SymKind_UDT_ST:{result = str8_lit("UDT_ST");}break; -case CV_SymKind_COBOLUDT_ST:{result = str8_lit("COBOLUDT_ST");}break; -case CV_SymKind_MANYREG_ST:{result = str8_lit("MANYREG_ST");}break; -case CV_SymKind_BPREL32_ST:{result = str8_lit("BPREL32_ST");}break; -case CV_SymKind_LDATA32_ST:{result = str8_lit("LDATA32_ST");}break; -case CV_SymKind_GDATA32_ST:{result = str8_lit("GDATA32_ST");}break; -case CV_SymKind_PUB32_ST:{result = str8_lit("PUB32_ST");}break; -case CV_SymKind_LPROC32_ST:{result = str8_lit("LPROC32_ST");}break; -case CV_SymKind_GPROC32_ST:{result = str8_lit("GPROC32_ST");}break; -case CV_SymKind_VFTABLE32:{result = str8_lit("VFTABLE32");}break; -case CV_SymKind_REGREL32_ST:{result = str8_lit("REGREL32_ST");}break; -case CV_SymKind_LTHREAD32_ST:{result = str8_lit("LTHREAD32_ST");}break; -case CV_SymKind_GTHREAD32_ST:{result = str8_lit("GTHREAD32_ST");}break; -case CV_SymKind_LPROCMIPS_ST:{result = str8_lit("LPROCMIPS_ST");}break; -case CV_SymKind_GPROCMIPS_ST:{result = str8_lit("GPROCMIPS_ST");}break; -case CV_SymKind_FRAMEPROC:{result = str8_lit("FRAMEPROC");}break; -case CV_SymKind_COMPILE2_ST:{result = str8_lit("COMPILE2_ST");}break; -case CV_SymKind_MANYREG2_ST:{result = str8_lit("MANYREG2_ST");}break; -case CV_SymKind_LPROCIA64_ST:{result = str8_lit("LPROCIA64_ST");}break; -case CV_SymKind_GPROCIA64_ST:{result = str8_lit("GPROCIA64_ST");}break; -case CV_SymKind_LOCALSLOT_ST:{result = str8_lit("LOCALSLOT_ST");}break; -case CV_SymKind_PARAMSLOT_ST:{result = str8_lit("PARAMSLOT_ST");}break; -case CV_SymKind_ANNOTATION:{result = str8_lit("ANNOTATION");}break; -case CV_SymKind_GMANPROC_ST:{result = str8_lit("GMANPROC_ST");}break; -case CV_SymKind_LMANPROC_ST:{result = str8_lit("LMANPROC_ST");}break; -case CV_SymKind_RESERVED1:{result = str8_lit("RESERVED1");}break; -case CV_SymKind_RESERVED2:{result = str8_lit("RESERVED2");}break; -case CV_SymKind_RESERVED3:{result = str8_lit("RESERVED3");}break; -case CV_SymKind_RESERVED4:{result = str8_lit("RESERVED4");}break; -case CV_SymKind_LMANDATA_ST:{result = str8_lit("LMANDATA_ST");}break; -case CV_SymKind_GMANDATA_ST:{result = str8_lit("GMANDATA_ST");}break; -case CV_SymKind_MANFRAMEREL_ST:{result = str8_lit("MANFRAMEREL_ST");}break; -case CV_SymKind_MANREGISTER_ST:{result = str8_lit("MANREGISTER_ST");}break; -case CV_SymKind_MANSLOT_ST:{result = str8_lit("MANSLOT_ST");}break; -case CV_SymKind_MANMANYREG_ST:{result = str8_lit("MANMANYREG_ST");}break; -case CV_SymKind_MANREGREL_ST:{result = str8_lit("MANREGREL_ST");}break; -case CV_SymKind_MANMANYREG2_ST:{result = str8_lit("MANMANYREG2_ST");}break; -case CV_SymKind_MANTYPREF:{result = str8_lit("MANTYPREF");}break; -case CV_SymKind_UNAMESPACE_ST:{result = str8_lit("UNAMESPACE_ST");}break; -case CV_SymKind_ST_MAX:{result = str8_lit("ST_MAX");}break; -case CV_SymKind_OBJNAME:{result = str8_lit("OBJNAME");}break; -case CV_SymKind_THUNK32:{result = str8_lit("THUNK32");}break; -case CV_SymKind_BLOCK32:{result = str8_lit("BLOCK32");}break; -case CV_SymKind_WITH32:{result = str8_lit("WITH32");}break; -case CV_SymKind_LABEL32:{result = str8_lit("LABEL32");}break; -case CV_SymKind_REGISTER:{result = str8_lit("REGISTER");}break; -case CV_SymKind_CONSTANT:{result = str8_lit("CONSTANT");}break; -case CV_SymKind_UDT:{result = str8_lit("UDT");}break; -case CV_SymKind_COBOLUDT:{result = str8_lit("COBOLUDT");}break; -case CV_SymKind_MANYREG:{result = str8_lit("MANYREG");}break; -case CV_SymKind_BPREL32:{result = str8_lit("BPREL32");}break; -case CV_SymKind_LDATA32:{result = str8_lit("LDATA32");}break; -case CV_SymKind_GDATA32:{result = str8_lit("GDATA32");}break; -case CV_SymKind_PUB32:{result = str8_lit("PUB32");}break; -case CV_SymKind_LPROC32:{result = str8_lit("LPROC32");}break; -case CV_SymKind_GPROC32:{result = str8_lit("GPROC32");}break; -case CV_SymKind_REGREL32:{result = str8_lit("REGREL32");}break; -case CV_SymKind_LTHREAD32:{result = str8_lit("LTHREAD32");}break; -case CV_SymKind_GTHREAD32:{result = str8_lit("GTHREAD32");}break; -case CV_SymKind_LPROCMIPS:{result = str8_lit("LPROCMIPS");}break; -case CV_SymKind_GPROCMIPS:{result = str8_lit("GPROCMIPS");}break; -case CV_SymKind_COMPILE2:{result = str8_lit("COMPILE2");}break; -case CV_SymKind_MANYREG2:{result = str8_lit("MANYREG2");}break; -case CV_SymKind_LPROCIA64:{result = str8_lit("LPROCIA64");}break; -case CV_SymKind_GPROCIA64:{result = str8_lit("GPROCIA64");}break; -case CV_SymKind_LOCALSLOT:{result = str8_lit("LOCALSLOT");}break; -case CV_SymKind_PARAMSLOT:{result = str8_lit("PARAMSLOT");}break; -case CV_SymKind_LMANDATA:{result = str8_lit("LMANDATA");}break; -case CV_SymKind_GMANDATA:{result = str8_lit("GMANDATA");}break; -case CV_SymKind_MANFRAMEREL:{result = str8_lit("MANFRAMEREL");}break; -case CV_SymKind_MANREGISTER:{result = str8_lit("MANREGISTER");}break; -case CV_SymKind_MANSLOT:{result = str8_lit("MANSLOT");}break; -case CV_SymKind_MANMANYREG:{result = str8_lit("MANMANYREG");}break; -case CV_SymKind_MANREGREL:{result = str8_lit("MANREGREL");}break; -case CV_SymKind_MANMANYREG2:{result = str8_lit("MANMANYREG2");}break; -case CV_SymKind_UNAMESPACE:{result = str8_lit("UNAMESPACE");}break; -case CV_SymKind_PROCREF:{result = str8_lit("PROCREF");}break; -case CV_SymKind_DATAREF:{result = str8_lit("DATAREF");}break; -case CV_SymKind_LPROCREF:{result = str8_lit("LPROCREF");}break; -case CV_SymKind_ANNOTATIONREF:{result = str8_lit("ANNOTATIONREF");}break; -case CV_SymKind_TOKENREF:{result = str8_lit("TOKENREF");}break; -case CV_SymKind_GMANPROC:{result = str8_lit("GMANPROC");}break; -case CV_SymKind_LMANPROC:{result = str8_lit("LMANPROC");}break; -case CV_SymKind_TRAMPOLINE:{result = str8_lit("TRAMPOLINE");}break; -case CV_SymKind_MANCONSTANT:{result = str8_lit("MANCONSTANT");}break; -case CV_SymKind_ATTR_FRAMEREL:{result = str8_lit("ATTR_FRAMEREL");}break; -case CV_SymKind_ATTR_REGISTER:{result = str8_lit("ATTR_REGISTER");}break; -case CV_SymKind_ATTR_REGREL:{result = str8_lit("ATTR_REGREL");}break; -case CV_SymKind_ATTR_MANYREG:{result = str8_lit("ATTR_MANYREG");}break; -case CV_SymKind_SEPCODE:{result = str8_lit("SEPCODE");}break; -case CV_SymKind_DEFRANGE_2005:{result = str8_lit("DEFRANGE_2005");}break; -case CV_SymKind_DEFRANGE2_2005:{result = str8_lit("DEFRANGE2_2005");}break; -case CV_SymKind_SECTION:{result = str8_lit("SECTION");}break; -case CV_SymKind_COFFGROUP:{result = str8_lit("COFFGROUP");}break; -case CV_SymKind_EXPORT:{result = str8_lit("EXPORT");}break; -case CV_SymKind_CALLSITEINFO:{result = str8_lit("CALLSITEINFO");}break; -case CV_SymKind_FRAMECOOKIE:{result = str8_lit("FRAMECOOKIE");}break; -case CV_SymKind_DISCARDED:{result = str8_lit("DISCARDED");}break; -case CV_SymKind_COMPILE3:{result = str8_lit("COMPILE3");}break; -case CV_SymKind_ENVBLOCK:{result = str8_lit("ENVBLOCK");}break; -case CV_SymKind_LOCAL:{result = str8_lit("LOCAL");}break; -case CV_SymKind_DEFRANGE:{result = str8_lit("DEFRANGE");}break; -case CV_SymKind_DEFRANGE_SUBFIELD:{result = str8_lit("DEFRANGE_SUBFIELD");}break; -case CV_SymKind_DEFRANGE_REGISTER:{result = str8_lit("DEFRANGE_REGISTER");}break; -case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL");}break; -case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = str8_lit("DEFRANGE_SUBFIELD_REGISTER");}break; -case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE");}break; -case CV_SymKind_DEFRANGE_REGISTER_REL:{result = str8_lit("DEFRANGE_REGISTER_REL");}break; -case CV_SymKind_LPROC32_ID:{result = str8_lit("LPROC32_ID");}break; -case CV_SymKind_GPROC32_ID:{result = str8_lit("GPROC32_ID");}break; -case CV_SymKind_LPROCMIPS_ID:{result = str8_lit("LPROCMIPS_ID");}break; -case CV_SymKind_GPROCMIPS_ID:{result = str8_lit("GPROCMIPS_ID");}break; -case CV_SymKind_LPROCIA64_ID:{result = str8_lit("LPROCIA64_ID");}break; -case CV_SymKind_GPROCIA64_ID:{result = str8_lit("GPROCIA64_ID");}break; -case CV_SymKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; -case CV_SymKind_INLINESITE:{result = str8_lit("INLINESITE");}break; -case CV_SymKind_INLINESITE_END:{result = str8_lit("INLINESITE_END");}break; -case CV_SymKind_PROC_ID_END:{result = str8_lit("PROC_ID_END");}break; -case CV_SymKind_DEFRANGE_HLSL:{result = str8_lit("DEFRANGE_HLSL");}break; -case CV_SymKind_GDATA_HLSL:{result = str8_lit("GDATA_HLSL");}break; -case CV_SymKind_LDATA_HLSL:{result = str8_lit("LDATA_HLSL");}break; -case CV_SymKind_FILESTATIC:{result = str8_lit("FILESTATIC");}break; -case CV_SymKind_LPROC32_DPC:{result = str8_lit("LPROC32_DPC");}break; -case CV_SymKind_LPROC32_DPC_ID:{result = str8_lit("LPROC32_DPC_ID");}break; -case CV_SymKind_DEFRANGE_DPC_PTR_TAG:{result = str8_lit("DEFRANGE_DPC_PTR_TAG");}break; -case CV_SymKind_DPC_SYM_TAG_MAP:{result = str8_lit("DPC_SYM_TAG_MAP");}break; -case CV_SymKind_ARMSWITCHTABLE:{result = str8_lit("ARMSWITCHTABLE");}break; -case CV_SymKind_CALLEES:{result = str8_lit("CALLEES");}break; -case CV_SymKind_CALLERS:{result = str8_lit("CALLERS");}break; -case CV_SymKind_POGODATA:{result = str8_lit("POGODATA");}break; -case CV_SymKind_INLINESITE2:{result = str8_lit("INLINESITE2");}break; -case CV_SymKind_HEAPALLOCSITE:{result = str8_lit("HEAPALLOCSITE");}break; -case CV_SymKind_MOD_TYPEREF:{result = str8_lit("MOD_TYPEREF");}break; -case CV_SymKind_REF_MINIPDB:{result = str8_lit("REF_MINIPDB");}break; -case CV_SymKind_PDBMAP:{result = str8_lit("PDBMAP");}break; -case CV_SymKind_GDATA_HLSL32:{result = str8_lit("GDATA_HLSL32");}break; -case CV_SymKind_LDATA_HLSL32:{result = str8_lit("LDATA_HLSL32");}break; -case CV_SymKind_GDATA_HLSL32_EX:{result = str8_lit("GDATA_HLSL32_EX");}break; -case CV_SymKind_LDATA_HLSL32_EX:{result = str8_lit("LDATA_HLSL32_EX");}break; -case CV_SymKind_FASTLINK:{result = str8_lit("FASTLINK");}break; -case CV_SymKind_INLINEES:{result = str8_lit("INLINEES");}break; -} -return result; -} - -internal String8 -cv_string_from_basic_type(CV_BasicType v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_BasicType_NOTYPE:{result = str8_lit("NOTYPE");}break; -case CV_BasicType_ABS:{result = str8_lit("ABS");}break; -case CV_BasicType_SEGMENT:{result = str8_lit("SEGMENT");}break; -case CV_BasicType_VOID:{result = str8_lit("VOID");}break; -case CV_BasicType_CURRENCY:{result = str8_lit("CURRENCY");}break; -case CV_BasicType_NBASICSTR:{result = str8_lit("NBASICSTR");}break; -case CV_BasicType_FBASICSTR:{result = str8_lit("FBASICSTR");}break; -case CV_BasicType_NOTTRANS:{result = str8_lit("NOTTRANS");}break; -case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; -case CV_BasicType_CHAR:{result = str8_lit("CHAR");}break; -case CV_BasicType_SHORT:{result = str8_lit("SHORT");}break; -case CV_BasicType_LONG:{result = str8_lit("LONG");}break; -case CV_BasicType_QUAD:{result = str8_lit("QUAD");}break; -case CV_BasicType_OCT:{result = str8_lit("OCT");}break; -case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; -case CV_BasicType_USHORT:{result = str8_lit("USHORT");}break; -case CV_BasicType_ULONG:{result = str8_lit("ULONG");}break; -case CV_BasicType_UQUAD:{result = str8_lit("UQUAD");}break; -case CV_BasicType_UOCT:{result = str8_lit("UOCT");}break; -case CV_BasicType_BOOL8:{result = str8_lit("BOOL8");}break; -case CV_BasicType_BOOL16:{result = str8_lit("BOOL16");}break; -case CV_BasicType_BOOL32:{result = str8_lit("BOOL32");}break; -case CV_BasicType_BOOL64:{result = str8_lit("BOOL64");}break; -case CV_BasicType_FLOAT32:{result = str8_lit("FLOAT32");}break; -case CV_BasicType_FLOAT64:{result = str8_lit("FLOAT64");}break; -case CV_BasicType_FLOAT80:{result = str8_lit("FLOAT80");}break; -case CV_BasicType_FLOAT128:{result = str8_lit("FLOAT128");}break; -case CV_BasicType_FLOAT48:{result = str8_lit("FLOAT48");}break; -case CV_BasicType_FLOAT32PP:{result = str8_lit("FLOAT32PP");}break; -case CV_BasicType_FLOAT16:{result = str8_lit("FLOAT16");}break; -case CV_BasicType_COMPLEX32:{result = str8_lit("COMPLEX32");}break; -case CV_BasicType_COMPLEX64:{result = str8_lit("COMPLEX64");}break; -case CV_BasicType_COMPLEX80:{result = str8_lit("COMPLEX80");}break; -case CV_BasicType_COMPLEX128:{result = str8_lit("COMPLEX128");}break; -case CV_BasicType_BIT:{result = str8_lit("BIT");}break; -case CV_BasicType_PASCHAR:{result = str8_lit("PASCHAR");}break; -case CV_BasicType_BOOL32FF:{result = str8_lit("BOOL32FF");}break; -case CV_BasicType_INT8:{result = str8_lit("INT8");}break; -case CV_BasicType_UINT8:{result = str8_lit("UINT8");}break; -case CV_BasicType_RCHAR:{result = str8_lit("RCHAR");}break; -case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; -case CV_BasicType_INT16:{result = str8_lit("INT16");}break; -case CV_BasicType_UINT16:{result = str8_lit("UINT16");}break; -case CV_BasicType_INT32:{result = str8_lit("INT32");}break; -case CV_BasicType_UINT32:{result = str8_lit("UINT32");}break; -case CV_BasicType_INT64:{result = str8_lit("INT64");}break; -case CV_BasicType_UINT64:{result = str8_lit("UINT64");}break; -case CV_BasicType_INT128:{result = str8_lit("INT128");}break; -case CV_BasicType_UINT128:{result = str8_lit("UINT128");}break; -case CV_BasicType_CHAR16:{result = str8_lit("CHAR16");}break; -case CV_BasicType_CHAR32:{result = str8_lit("CHAR32");}break; -case CV_BasicType_CHAR8:{result = str8_lit("CHAR8");}break; -case CV_BasicType_PTR:{result = str8_lit("PTR");}break; -} -return result; -} - -internal String8 -cv_type_name_from_basic_type(CV_BasicType v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_BasicType_NOTYPE:{result = str8_lit("");}break; -case CV_BasicType_ABS:{result = str8_lit("");}break; -case CV_BasicType_SEGMENT:{result = str8_lit("");}break; -case CV_BasicType_VOID:{result = str8_lit("void");}break; -case CV_BasicType_CURRENCY:{result = str8_lit("");}break; -case CV_BasicType_NBASICSTR:{result = str8_lit("");}break; -case CV_BasicType_FBASICSTR:{result = str8_lit("");}break; -case CV_BasicType_NOTTRANS:{result = str8_lit("");}break; -case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; -case CV_BasicType_CHAR:{result = str8_lit("CHAR");}break; -case CV_BasicType_SHORT:{result = str8_lit("SHORT");}break; -case CV_BasicType_LONG:{result = str8_lit("LONG");}break; -case CV_BasicType_QUAD:{result = str8_lit("QUAD");}break; -case CV_BasicType_OCT:{result = str8_lit("OCT");}break; -case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; -case CV_BasicType_USHORT:{result = str8_lit("USHORT");}break; -case CV_BasicType_ULONG:{result = str8_lit("ULONG");}break; -case CV_BasicType_UQUAD:{result = str8_lit("UQUAD");}break; -case CV_BasicType_UOCT:{result = str8_lit("UOCT");}break; -case CV_BasicType_BOOL8:{result = str8_lit("BOOL8");}break; -case CV_BasicType_BOOL16:{result = str8_lit("BOOL16");}break; -case CV_BasicType_BOOL32:{result = str8_lit("BOOL32");}break; -case CV_BasicType_BOOL64:{result = str8_lit("BOOL64");}break; -case CV_BasicType_FLOAT32:{result = str8_lit("FLOAT32");}break; -case CV_BasicType_FLOAT64:{result = str8_lit("FLOAT64");}break; -case CV_BasicType_FLOAT80:{result = str8_lit("FLOAT80");}break; -case CV_BasicType_FLOAT128:{result = str8_lit("FLOAT128");}break; -case CV_BasicType_FLOAT48:{result = str8_lit("FLOAT48");}break; -case CV_BasicType_FLOAT32PP:{result = str8_lit("FLOAT32PP");}break; -case CV_BasicType_FLOAT16:{result = str8_lit("FLOAT16");}break; -case CV_BasicType_COMPLEX32:{result = str8_lit("ComplexF32");}break; -case CV_BasicType_COMPLEX64:{result = str8_lit("ComplexF64");}break; -case CV_BasicType_COMPLEX80:{result = str8_lit("ComplexF80");}break; -case CV_BasicType_COMPLEX128:{result = str8_lit("ComplexF128");}break; -case CV_BasicType_BIT:{result = str8_lit("");}break; -case CV_BasicType_PASCHAR:{result = str8_lit("");}break; -case CV_BasicType_BOOL32FF:{result = str8_lit("BOOL32FF");}break; -case CV_BasicType_INT8:{result = str8_lit("int8");}break; -case CV_BasicType_UINT8:{result = str8_lit("uint8");}break; -case CV_BasicType_RCHAR:{result = str8_lit("char");}break; -case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; -case CV_BasicType_INT16:{result = str8_lit("int16");}break; -case CV_BasicType_UINT16:{result = str8_lit("uint16");}break; -case CV_BasicType_INT32:{result = str8_lit("int32");}break; -case CV_BasicType_UINT32:{result = str8_lit("uint32");}break; -case CV_BasicType_INT64:{result = str8_lit("int64");}break; -case CV_BasicType_UINT64:{result = str8_lit("uint64");}break; -case CV_BasicType_INT128:{result = str8_lit("int128");}break; -case CV_BasicType_UINT128:{result = str8_lit("uint128");}break; -case CV_BasicType_CHAR16:{result = str8_lit("char16");}break; -case CV_BasicType_CHAR32:{result = str8_lit("char32");}break; -case CV_BasicType_CHAR8:{result = str8_lit("char");}break; -case CV_BasicType_PTR:{result = str8_lit("PTR");}break; -} -return result; -} - -internal String8 -cv_string_from_leaf_kind(CV_LeafKind v) -{ -String8 result = str8_lit(""); -switch(v) -{ -default:{}break; -case CV_LeafKind_NOTYPE:{result = str8_lit("NOTYPE");}break; -case CV_LeafKind_MODIFIER_16t:{result = str8_lit("MODIFIER_16t");}break; -case CV_LeafKind_POINTER_16t:{result = str8_lit("POINTER_16t");}break; -case CV_LeafKind_ARRAY_16t:{result = str8_lit("ARRAY_16t");}break; -case CV_LeafKind_CLASS_16t:{result = str8_lit("CLASS_16t");}break; -case CV_LeafKind_STRUCTURE_16t:{result = str8_lit("STRUCTURE_16t");}break; -case CV_LeafKind_UNION_16t:{result = str8_lit("UNION_16t");}break; -case CV_LeafKind_ENUM_16t:{result = str8_lit("ENUM_16t");}break; -case CV_LeafKind_PROCEDURE_16t:{result = str8_lit("PROCEDURE_16t");}break; -case CV_LeafKind_MFUNCTION_16t:{result = str8_lit("MFUNCTION_16t");}break; -case CV_LeafKind_VTSHAPE:{result = str8_lit("VTSHAPE");}break; -case CV_LeafKind_COBOL0_16t:{result = str8_lit("COBOL0_16t");}break; -case CV_LeafKind_COBOL1:{result = str8_lit("COBOL1");}break; -case CV_LeafKind_BARRAY_16t:{result = str8_lit("BARRAY_16t");}break; -case CV_LeafKind_LABEL:{result = str8_lit("LABEL");}break; -case CV_LeafKind_NULL:{result = str8_lit("NULL");}break; -case CV_LeafKind_NOTTRAN:{result = str8_lit("NOTTRAN");}break; -case CV_LeafKind_DIMARRAY_16t:{result = str8_lit("DIMARRAY_16t");}break; -case CV_LeafKind_VFTPATH_16t:{result = str8_lit("VFTPATH_16t");}break; -case CV_LeafKind_PRECOMP_16t:{result = str8_lit("PRECOMP_16t");}break; -case CV_LeafKind_ENDPRECOMP:{result = str8_lit("ENDPRECOMP");}break; -case CV_LeafKind_OEM_16t:{result = str8_lit("OEM_16t");}break; -case CV_LeafKind_TYPESERVER_ST:{result = str8_lit("TYPESERVER_ST");}break; -case CV_LeafKind_SKIP_16t:{result = str8_lit("SKIP_16t");}break; -case CV_LeafKind_ARGLIST_16t:{result = str8_lit("ARGLIST_16t");}break; -case CV_LeafKind_DEFARG_16t:{result = str8_lit("DEFARG_16t");}break; -case CV_LeafKind_LIST:{result = str8_lit("LIST");}break; -case CV_LeafKind_FIELDLIST_16t:{result = str8_lit("FIELDLIST_16t");}break; -case CV_LeafKind_DERIVED_16t:{result = str8_lit("DERIVED_16t");}break; -case CV_LeafKind_BITFIELD_16t:{result = str8_lit("BITFIELD_16t");}break; -case CV_LeafKind_METHODLIST_16t:{result = str8_lit("METHODLIST_16t");}break; -case CV_LeafKind_DIMCONU_16t:{result = str8_lit("DIMCONU_16t");}break; -case CV_LeafKind_DIMCONLU_16t:{result = str8_lit("DIMCONLU_16t");}break; -case CV_LeafKind_DIMVARU_16t:{result = str8_lit("DIMVARU_16t");}break; -case CV_LeafKind_DIMVARLU_16t:{result = str8_lit("DIMVARLU_16t");}break; -case CV_LeafKind_REFSYM:{result = str8_lit("REFSYM");}break; -case CV_LeafKind_BCLASS_16t:{result = str8_lit("BCLASS_16t");}break; -case CV_LeafKind_VBCLASS_16t:{result = str8_lit("VBCLASS_16t");}break; -case CV_LeafKind_IVBCLASS_16t:{result = str8_lit("IVBCLASS_16t");}break; -case CV_LeafKind_ENUMERATE_ST:{result = str8_lit("ENUMERATE_ST");}break; -case CV_LeafKind_FRIENDFCN_16t:{result = str8_lit("FRIENDFCN_16t");}break; -case CV_LeafKind_INDEX_16t:{result = str8_lit("INDEX_16t");}break; -case CV_LeafKind_MEMBER_16t:{result = str8_lit("MEMBER_16t");}break; -case CV_LeafKind_STMEMBER_16t:{result = str8_lit("STMEMBER_16t");}break; -case CV_LeafKind_METHOD_16t:{result = str8_lit("METHOD_16t");}break; -case CV_LeafKind_NESTTYPE_16t:{result = str8_lit("NESTTYPE_16t");}break; -case CV_LeafKind_VFUNCTAB_16t:{result = str8_lit("VFUNCTAB_16t");}break; -case CV_LeafKind_FRIENDCLS_16t:{result = str8_lit("FRIENDCLS_16t");}break; -case CV_LeafKind_ONEMETHOD_16t:{result = str8_lit("ONEMETHOD_16t");}break; -case CV_LeafKind_VFUNCOFF_16t:{result = str8_lit("VFUNCOFF_16t");}break; -case CV_LeafKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; -case CV_LeafKind_MODIFIER:{result = str8_lit("MODIFIER");}break; -case CV_LeafKind_POINTER:{result = str8_lit("POINTER");}break; -case CV_LeafKind_ARRAY_ST:{result = str8_lit("ARRAY_ST");}break; -case CV_LeafKind_CLASS_ST:{result = str8_lit("CLASS_ST");}break; -case CV_LeafKind_STRUCTURE_ST:{result = str8_lit("STRUCTURE_ST");}break; -case CV_LeafKind_UNION_ST:{result = str8_lit("UNION_ST");}break; -case CV_LeafKind_ENUM_ST:{result = str8_lit("ENUM_ST");}break; -case CV_LeafKind_PROCEDURE:{result = str8_lit("PROCEDURE");}break; -case CV_LeafKind_MFUNCTION:{result = str8_lit("MFUNCTION");}break; -case CV_LeafKind_COBOL0:{result = str8_lit("COBOL0");}break; -case CV_LeafKind_BARRAY:{result = str8_lit("BARRAY");}break; -case CV_LeafKind_DIMARRAY_ST:{result = str8_lit("DIMARRAY_ST");}break; -case CV_LeafKind_VFTPATH:{result = str8_lit("VFTPATH");}break; -case CV_LeafKind_PRECOMP_ST:{result = str8_lit("PRECOMP_ST");}break; -case CV_LeafKind_OEM:{result = str8_lit("OEM");}break; -case CV_LeafKind_ALIAS_ST:{result = str8_lit("ALIAS_ST");}break; -case CV_LeafKind_OEM2:{result = str8_lit("OEM2");}break; -case CV_LeafKind_SKIP:{result = str8_lit("SKIP");}break; -case CV_LeafKind_ARGLIST:{result = str8_lit("ARGLIST");}break; -case CV_LeafKind_DEFARG_ST:{result = str8_lit("DEFARG_ST");}break; -case CV_LeafKind_FIELDLIST:{result = str8_lit("FIELDLIST");}break; -case CV_LeafKind_DERIVED:{result = str8_lit("DERIVED");}break; -case CV_LeafKind_BITFIELD:{result = str8_lit("BITFIELD");}break; -case CV_LeafKind_METHODLIST:{result = str8_lit("METHODLIST");}break; -case CV_LeafKind_DIMCONU:{result = str8_lit("DIMCONU");}break; -case CV_LeafKind_DIMCONLU:{result = str8_lit("DIMCONLU");}break; -case CV_LeafKind_DIMVARU:{result = str8_lit("DIMVARU");}break; -case CV_LeafKind_DIMVARLU:{result = str8_lit("DIMVARLU");}break; -case CV_LeafKind_BCLASS:{result = str8_lit("BCLASS");}break; -case CV_LeafKind_VBCLASS:{result = str8_lit("VBCLASS");}break; -case CV_LeafKind_IVBCLASS:{result = str8_lit("IVBCLASS");}break; -case CV_LeafKind_FRIENDFCN_ST:{result = str8_lit("FRIENDFCN_ST");}break; -case CV_LeafKind_INDEX:{result = str8_lit("INDEX");}break; -case CV_LeafKind_MEMBER_ST:{result = str8_lit("MEMBER_ST");}break; -case CV_LeafKind_STMEMBER_ST:{result = str8_lit("STMEMBER_ST");}break; -case CV_LeafKind_METHOD_ST:{result = str8_lit("METHOD_ST");}break; -case CV_LeafKind_NESTTYPE_ST:{result = str8_lit("NESTTYPE_ST");}break; -case CV_LeafKind_VFUNCTAB:{result = str8_lit("VFUNCTAB");}break; -case CV_LeafKind_FRIENDCLS:{result = str8_lit("FRIENDCLS");}break; -case CV_LeafKind_ONEMETHOD_ST:{result = str8_lit("ONEMETHOD_ST");}break; -case CV_LeafKind_VFUNCOFF:{result = str8_lit("VFUNCOFF");}break; -case CV_LeafKind_NESTTYPEEX_ST:{result = str8_lit("NESTTYPEEX_ST");}break; -case CV_LeafKind_MEMBERMODIFY_ST:{result = str8_lit("MEMBERMODIFY_ST");}break; -case CV_LeafKind_MANAGED_ST:{result = str8_lit("MANAGED_ST");}break; -case CV_LeafKind_ST_MAX:{result = str8_lit("ST_MAX");}break; -case CV_LeafKind_TYPESERVER:{result = str8_lit("TYPESERVER");}break; -case CV_LeafKind_ENUMERATE:{result = str8_lit("ENUMERATE");}break; -case CV_LeafKind_ARRAY:{result = str8_lit("ARRAY");}break; -case CV_LeafKind_CLASS:{result = str8_lit("CLASS");}break; -case CV_LeafKind_STRUCTURE:{result = str8_lit("STRUCTURE");}break; -case CV_LeafKind_UNION:{result = str8_lit("UNION");}break; -case CV_LeafKind_ENUM:{result = str8_lit("ENUM");}break; -case CV_LeafKind_DIMARRAY:{result = str8_lit("DIMARRAY");}break; -case CV_LeafKind_PRECOMP:{result = str8_lit("PRECOMP");}break; -case CV_LeafKind_ALIAS:{result = str8_lit("ALIAS");}break; -case CV_LeafKind_DEFARG:{result = str8_lit("DEFARG");}break; -case CV_LeafKind_FRIENDFCN:{result = str8_lit("FRIENDFCN");}break; -case CV_LeafKind_MEMBER:{result = str8_lit("MEMBER");}break; -case CV_LeafKind_STMEMBER:{result = str8_lit("STMEMBER");}break; -case CV_LeafKind_METHOD:{result = str8_lit("METHOD");}break; -case CV_LeafKind_NESTTYPE:{result = str8_lit("NESTTYPE");}break; -case CV_LeafKind_ONEMETHOD:{result = str8_lit("ONEMETHOD");}break; -case CV_LeafKind_NESTTYPEEX:{result = str8_lit("NESTTYPEEX");}break; -case CV_LeafKind_MEMBERMODIFY:{result = str8_lit("MEMBERMODIFY");}break; -case CV_LeafKind_MANAGED:{result = str8_lit("MANAGED");}break; -case CV_LeafKind_TYPESERVER2:{result = str8_lit("TYPESERVER2");}break; -case CV_LeafKind_STRIDED_ARRAY:{result = str8_lit("STRIDED_ARRAY");}break; -case CV_LeafKind_HLSL:{result = str8_lit("HLSL");}break; -case CV_LeafKind_MODIFIER_EX:{result = str8_lit("MODIFIER_EX");}break; -case CV_LeafKind_INTERFACE:{result = str8_lit("INTERFACE");}break; -case CV_LeafKind_BINTERFACE:{result = str8_lit("BINTERFACE");}break; -case CV_LeafKind_VECTOR:{result = str8_lit("VECTOR");}break; -case CV_LeafKind_MATRIX:{result = str8_lit("MATRIX");}break; -case CV_LeafKind_VFTABLE:{result = str8_lit("VFTABLE");}break; -case CV_LeafKind_FUNC_ID:{result = str8_lit("FUNC_ID");}break; -case CV_LeafKind_MFUNC_ID:{result = str8_lit("MFUNC_ID");}break; -case CV_LeafKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; -case CV_LeafKind_SUBSTR_LIST:{result = str8_lit("SUBSTR_LIST");}break; -case CV_LeafKind_STRING_ID:{result = str8_lit("STRING_ID");}break; -case CV_LeafKind_UDT_SRC_LINE:{result = str8_lit("UDT_SRC_LINE");}break; -case CV_LeafKind_UDT_MOD_SRC_LINE:{result = str8_lit("UDT_MOD_SRC_LINE");}break; -case CV_LeafKind_CLASS2:{result = str8_lit("CLASS2");}break; -case CV_LeafKind_STRUCT2:{result = str8_lit("STRUCT2");}break; -} -return result; -} - -internal U64 -cv_header_struct_size_from_sym_kind(CV_SymKind v) -{ -U64 result = 0; -switch(v) -{ -default:{}break; -case CV_SymKind_COMPILE:{result = sizeof(CV_SymCompile);}break; -case CV_SymKind_SSEARCH:{result = sizeof(CV_SymStartSearch);}break; -case CV_SymKind_RETURN:{result = sizeof(CV_SymReturn);}break; -case CV_SymKind_SLINK32:{result = sizeof(CV_SymSLink32);}break; -case CV_SymKind_OEM:{result = sizeof(CV_SymOEM);}break; -case CV_SymKind_VFTABLE32:{result = sizeof(CV_SymVPath32);}break; -case CV_SymKind_FRAMEPROC:{result = sizeof(CV_SymFrameproc);}break; -case CV_SymKind_ANNOTATION:{result = sizeof(CV_SymAnnotation);}break; -case CV_SymKind_OBJNAME:{result = sizeof(CV_SymObjName);}break; -case CV_SymKind_THUNK32:{result = sizeof(CV_SymThunk32);}break; -case CV_SymKind_BLOCK32:{result = sizeof(CV_SymBlock32);}break; -case CV_SymKind_LABEL32:{result = sizeof(CV_SymLabel32);}break; -case CV_SymKind_REGISTER:{result = sizeof(CV_SymRegister);}break; -case CV_SymKind_CONSTANT:{result = sizeof(CV_SymConstant);}break; -case CV_SymKind_UDT:{result = sizeof(CV_SymUDT);}break; -case CV_SymKind_MANYREG:{result = sizeof(CV_SymManyreg);}break; -case CV_SymKind_BPREL32:{result = sizeof(CV_SymBPRel32);}break; -case CV_SymKind_LDATA32:{result = sizeof(CV_SymData32);}break; -case CV_SymKind_GDATA32:{result = sizeof(CV_SymData32);}break; -case CV_SymKind_PUB32:{result = sizeof(CV_SymPub32);}break; -case CV_SymKind_LPROC32:{result = sizeof(CV_SymProc32);}break; -case CV_SymKind_GPROC32:{result = sizeof(CV_SymProc32);}break; -case CV_SymKind_REGREL32:{result = sizeof(CV_SymRegrel32);}break; -case CV_SymKind_LTHREAD32:{result = sizeof(CV_SymThread32);}break; -case CV_SymKind_GTHREAD32:{result = sizeof(CV_SymThread32);}break; -case CV_SymKind_COMPILE2:{result = sizeof(CV_SymCompile2);}break; -case CV_SymKind_MANYREG2:{result = sizeof(CV_SymManyreg2);}break; -case CV_SymKind_LOCALSLOT:{result = sizeof(CV_SymSlot);}break; -case CV_SymKind_MANFRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; -case CV_SymKind_MANREGISTER:{result = sizeof(CV_SymAttrReg);}break; -case CV_SymKind_MANMANYREG:{result = sizeof(CV_SymAttrManyReg);}break; -case CV_SymKind_MANREGREL:{result = sizeof(CV_SymAttrRegRel);}break; -case CV_SymKind_UNAMESPACE:{result = sizeof(CV_SymUNamespace);}break; -case CV_SymKind_PROCREF:{result = sizeof(CV_SymRef2);}break; -case CV_SymKind_DATAREF:{result = sizeof(CV_SymRef2);}break; -case CV_SymKind_LPROCREF:{result = sizeof(CV_SymRef2);}break; -case CV_SymKind_TRAMPOLINE:{result = sizeof(CV_SymTrampoline);}break; -case CV_SymKind_ATTR_FRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; -case CV_SymKind_ATTR_REGISTER:{result = sizeof(CV_SymAttrReg);}break; -case CV_SymKind_ATTR_REGREL:{result = sizeof(CV_SymAttrRegRel);}break; -case CV_SymKind_ATTR_MANYREG:{result = sizeof(CV_SymAttrManyReg);}break; -case CV_SymKind_SEPCODE:{result = sizeof(CV_SymSepcode);}break; -case CV_SymKind_SECTION:{result = sizeof(CV_SymSection);}break; -case CV_SymKind_COFFGROUP:{result = sizeof(CV_SymCoffGroup);}break; -case CV_SymKind_EXPORT:{result = sizeof(CV_SymExport);}break; -case CV_SymKind_CALLSITEINFO:{result = sizeof(CV_SymCallSiteInfo);}break; -case CV_SymKind_FRAMECOOKIE:{result = sizeof(CV_SymFrameCookie);}break; -case CV_SymKind_DISCARDED:{result = sizeof(CV_SymDiscarded);}break; -case CV_SymKind_COMPILE3:{result = sizeof(CV_SymCompile3);}break; -case CV_SymKind_ENVBLOCK:{result = sizeof(CV_SymEnvBlock);}break; -case CV_SymKind_LOCAL:{result = sizeof(CV_SymLocal);}break; -case CV_SymKind_DEFRANGE_SUBFIELD:{result = sizeof(CV_SymDefrangeSubfield);}break; -case CV_SymKind_DEFRANGE_REGISTER:{result = sizeof(CV_SymDefrangeRegister);}break; -case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = sizeof(CV_SymDefrangeFramepointerRel);}break; -case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = sizeof(CV_SymDefrangeSubfieldRegister);}break; -case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = sizeof(CV_SymDefrangeFramepointerRelFullScope);}break; -case CV_SymKind_DEFRANGE_REGISTER_REL:{result = sizeof(CV_SymDefrangeRegisterRel);}break; -case CV_SymKind_BUILDINFO:{result = sizeof(CV_SymBuildInfo);}break; -case CV_SymKind_INLINESITE:{result = sizeof(CV_SymInlineSite);}break; -case CV_SymKind_FILESTATIC:{result = sizeof(CV_SymFileStatic);}break; -case CV_SymKind_CALLEES:{result = sizeof(CV_SymFunctionList);}break; -case CV_SymKind_CALLERS:{result = sizeof(CV_SymFunctionList);}break; -case CV_SymKind_POGODATA:{result = sizeof(CV_SymPogoInfo);}break; -case CV_SymKind_INLINESITE2:{result = sizeof(CV_SymInlineSite2);}break; -case CV_SymKind_HEAPALLOCSITE:{result = sizeof(CV_SymHeapAllocSite);}break; -case CV_SymKind_MOD_TYPEREF:{result = sizeof(CV_SymModTypeRef);}break; -case CV_SymKind_REF_MINIPDB:{result = sizeof(CV_SymRefMiniPdb);}break; -case CV_SymKind_FASTLINK:{result = sizeof(CV_SymFastLink);}break; -case CV_SymKind_INLINEES:{result = sizeof(CV_SymInlinees);}break; -} -return result; -} -internal U64 -cv_header_struct_size_from_leaf_kind(CV_LeafKind v) -{ -U64 result = 0; -switch(v) -{ -default:{}break; -case CV_LeafKind_VTSHAPE:{result = sizeof(CV_LeafVTShape);}break; -case CV_LeafKind_LABEL:{result = sizeof(CV_LeafLabel);}break; -case CV_LeafKind_MODIFIER:{result = sizeof(CV_LeafModifier);}break; -case CV_LeafKind_POINTER:{result = sizeof(CV_LeafPointer);}break; -case CV_LeafKind_PROCEDURE:{result = sizeof(CV_LeafProcedure);}break; -case CV_LeafKind_MFUNCTION:{result = sizeof(CV_LeafMFunction);}break; -case CV_LeafKind_VFTPATH:{result = sizeof(CV_LeafVFPath);}break; -case CV_LeafKind_SKIP:{result = sizeof(CV_LeafSkip);}break; -case CV_LeafKind_ARGLIST:{result = sizeof(CV_LeafArgList);}break; -case CV_LeafKind_BITFIELD:{result = sizeof(CV_LeafBitField);}break; -case CV_LeafKind_METHODLIST:{result = sizeof(CV_LeafMethodListMember);}break; -case CV_LeafKind_BCLASS:{result = sizeof(CV_LeafBClass);}break; -case CV_LeafKind_VBCLASS:{result = sizeof(CV_LeafVBClass);}break; -case CV_LeafKind_INDEX:{result = sizeof(CV_LeafIndex);}break; -case CV_LeafKind_VFUNCTAB:{result = sizeof(CV_LeafVFuncTab);}break; -case CV_LeafKind_VFUNCOFF:{result = sizeof(CV_LeafVFuncOff);}break; -case CV_LeafKind_TYPESERVER:{result = sizeof(CV_LeafTypeServer);}break; -case CV_LeafKind_ENUMERATE:{result = sizeof(CV_LeafEnumerate);}break; -case CV_LeafKind_ARRAY:{result = sizeof(CV_LeafArray);}break; -case CV_LeafKind_CLASS:{result = sizeof(CV_LeafStruct);}break; -case CV_LeafKind_STRUCTURE:{result = sizeof(CV_LeafStruct);}break; -case CV_LeafKind_UNION:{result = sizeof(CV_LeafUnion);}break; -case CV_LeafKind_ENUM:{result = sizeof(CV_LeafEnum);}break; -case CV_LeafKind_PRECOMP:{result = sizeof(CV_LeafPreComp);}break; -case CV_LeafKind_ALIAS:{result = sizeof(CV_LeafAlias);}break; -case CV_LeafKind_MEMBER:{result = sizeof(CV_LeafMember);}break; -case CV_LeafKind_STMEMBER:{result = sizeof(CV_LeafStMember);}break; -case CV_LeafKind_METHOD:{result = sizeof(CV_LeafMethod);}break; -case CV_LeafKind_NESTTYPE:{result = sizeof(CV_LeafNestType);}break; -case CV_LeafKind_ONEMETHOD:{result = sizeof(CV_LeafOneMethod);}break; -case CV_LeafKind_NESTTYPEEX:{result = sizeof(CV_LeafNestTypeEx);}break; -case CV_LeafKind_TYPESERVER2:{result = sizeof(CV_LeafTypeServer2);}break; -case CV_LeafKind_INTERFACE:{result = sizeof(CV_LeafStruct);}break; -case CV_LeafKind_FUNC_ID:{result = sizeof(CV_LeafFuncId);}break; -case CV_LeafKind_MFUNC_ID:{result = sizeof(CV_LeafMFuncId);}break; -case CV_LeafKind_BUILDINFO:{result = sizeof(CV_LeafBuildInfo);}break; -case CV_LeafKind_SUBSTR_LIST:{result = sizeof(CV_LeafSubstrList);}break; -case CV_LeafKind_STRING_ID:{result = sizeof(CV_LeafStringId);}break; -case CV_LeafKind_UDT_SRC_LINE:{result = sizeof(CV_LeafUDTSrcLine);}break; -case CV_LeafKind_UDT_MOD_SRC_LINE:{result = sizeof(CV_LeafUDTModSrcLine);}break; -case CV_LeafKind_CLASS2:{result = sizeof(CV_LeafStruct2);}break; -case CV_LeafKind_STRUCT2:{result = sizeof(CV_LeafStruct2);}break; -} -return result; -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +internal String8 +cv_string_from_numeric_kind(CV_NumericKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_NumericKind_CHAR:{result = str8_lit("CHAR");}break; +case CV_NumericKind_SHORT:{result = str8_lit("SHORT");}break; +case CV_NumericKind_USHORT:{result = str8_lit("USHORT");}break; +case CV_NumericKind_LONG:{result = str8_lit("LONG");}break; +case CV_NumericKind_ULONG:{result = str8_lit("ULONG");}break; +case CV_NumericKind_FLOAT32:{result = str8_lit("FLOAT32");}break; +case CV_NumericKind_FLOAT64:{result = str8_lit("FLOAT64");}break; +case CV_NumericKind_FLOAT80:{result = str8_lit("FLOAT80");}break; +case CV_NumericKind_FLOAT128:{result = str8_lit("FLOAT128");}break; +case CV_NumericKind_QUADWORD:{result = str8_lit("QUADWORD");}break; +case CV_NumericKind_UQUADWORD:{result = str8_lit("UQUADWORD");}break; +case CV_NumericKind_FLOAT48:{result = str8_lit("FLOAT48");}break; +case CV_NumericKind_COMPLEX32:{result = str8_lit("COMPLEX32");}break; +case CV_NumericKind_COMPLEX64:{result = str8_lit("COMPLEX64");}break; +case CV_NumericKind_COMPLEX80:{result = str8_lit("COMPLEX80");}break; +case CV_NumericKind_COMPLEX128:{result = str8_lit("COMPLEX128");}break; +case CV_NumericKind_VARSTRING:{result = str8_lit("VARSTRING");}break; +case CV_NumericKind_OCTWORD:{result = str8_lit("OCTWORD");}break; +case CV_NumericKind_UOCTWORD:{result = str8_lit("UOCTWORD");}break; +case CV_NumericKind_DECIMAL:{result = str8_lit("DECIMAL");}break; +case CV_NumericKind_DATE:{result = str8_lit("DATE");}break; +case CV_NumericKind_UTF8STRING:{result = str8_lit("UTF8STRING");}break; +case CV_NumericKind_FLOAT16:{result = str8_lit("FLOAT16");}break; +} +return result; +} + +internal String8 +cv_string_from_arch(CV_Arch v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_Arch_8080:{result = str8_lit("8080");}break; +case CV_Arch_8086:{result = str8_lit("8086");}break; +case CV_Arch_80286:{result = str8_lit("80286");}break; +case CV_Arch_80386:{result = str8_lit("80386");}break; +case CV_Arch_80486:{result = str8_lit("80486");}break; +case CV_Arch_PENTIUM:{result = str8_lit("PENTIUM");}break; +case CV_Arch_PENTIUMII:{result = str8_lit("PENTIUMII");}break; +case CV_Arch_PENTIUMIII:{result = str8_lit("PENTIUMIII");}break; +case CV_Arch_MIPS:{result = str8_lit("MIPS");}break; +case CV_Arch_MIPS16:{result = str8_lit("MIPS16");}break; +case CV_Arch_MIPS32:{result = str8_lit("MIPS32");}break; +case CV_Arch_MIPS64:{result = str8_lit("MIPS64");}break; +case CV_Arch_MIPSI:{result = str8_lit("MIPSI");}break; +case CV_Arch_MIPSII:{result = str8_lit("MIPSII");}break; +case CV_Arch_MIPSIII:{result = str8_lit("MIPSIII");}break; +case CV_Arch_MIPSIV:{result = str8_lit("MIPSIV");}break; +case CV_Arch_MIPSV:{result = str8_lit("MIPSV");}break; +case CV_Arch_M68000:{result = str8_lit("M68000");}break; +case CV_Arch_M68010:{result = str8_lit("M68010");}break; +case CV_Arch_M68020:{result = str8_lit("M68020");}break; +case CV_Arch_M68030:{result = str8_lit("M68030");}break; +case CV_Arch_M68040:{result = str8_lit("M68040");}break; +case CV_Arch_ALPHA:{result = str8_lit("ALPHA");}break; +case CV_Arch_ALPHA_21164:{result = str8_lit("ALPHA_21164");}break; +case CV_Arch_ALPHA_21164A:{result = str8_lit("ALPHA_21164A");}break; +case CV_Arch_ALPHA_21264:{result = str8_lit("ALPHA_21264");}break; +case CV_Arch_ALPHA_21364:{result = str8_lit("ALPHA_21364");}break; +case CV_Arch_PPC601:{result = str8_lit("PPC601");}break; +case CV_Arch_PPC603:{result = str8_lit("PPC603");}break; +case CV_Arch_PPC604:{result = str8_lit("PPC604");}break; +case CV_Arch_PPC620:{result = str8_lit("PPC620");}break; +case CV_Arch_PPCFP:{result = str8_lit("PPCFP");}break; +case CV_Arch_PPCBE:{result = str8_lit("PPCBE");}break; +case CV_Arch_SH3:{result = str8_lit("SH3");}break; +case CV_Arch_SH3E:{result = str8_lit("SH3E");}break; +case CV_Arch_SH3DSP:{result = str8_lit("SH3DSP");}break; +case CV_Arch_SH4:{result = str8_lit("SH4");}break; +case CV_Arch_SHMEDIA:{result = str8_lit("SHMEDIA");}break; +case CV_Arch_ARM3:{result = str8_lit("ARM3");}break; +case CV_Arch_ARM4:{result = str8_lit("ARM4");}break; +case CV_Arch_ARM4T:{result = str8_lit("ARM4T");}break; +case CV_Arch_ARM5:{result = str8_lit("ARM5");}break; +case CV_Arch_ARM5T:{result = str8_lit("ARM5T");}break; +case CV_Arch_ARM6:{result = str8_lit("ARM6");}break; +case CV_Arch_ARM_XMAC:{result = str8_lit("ARM_XMAC");}break; +case CV_Arch_ARM_WMMX:{result = str8_lit("ARM_WMMX");}break; +case CV_Arch_ARM7:{result = str8_lit("ARM7");}break; +case CV_Arch_OMNI:{result = str8_lit("OMNI");}break; +case CV_Arch_IA64_1:{result = str8_lit("IA64_1");}break; +case CV_Arch_IA64_2:{result = str8_lit("IA64_2");}break; +case CV_Arch_CEE:{result = str8_lit("CEE");}break; +case CV_Arch_AM33:{result = str8_lit("AM33");}break; +case CV_Arch_M32R:{result = str8_lit("M32R");}break; +case CV_Arch_TRICORE:{result = str8_lit("TRICORE");}break; +case CV_Arch_X64:{result = str8_lit("X64");}break; +case CV_Arch_EBC:{result = str8_lit("EBC");}break; +case CV_Arch_THUMB:{result = str8_lit("THUMB");}break; +case CV_Arch_ARMNT:{result = str8_lit("ARMNT");}break; +case CV_Arch_ARM64:{result = str8_lit("ARM64");}break; +case CV_Arch_D3D11_SHADER:{result = str8_lit("D3D11_SHADER");}break; +} +return result; +} + +internal String8 +cv_string_from_sym_kind(CV_SymKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_SymKind_COMPILE:{result = str8_lit("COMPILE");}break; +case CV_SymKind_REGISTER_16t:{result = str8_lit("REGISTER_16t");}break; +case CV_SymKind_CONSTANT_16t:{result = str8_lit("CONSTANT_16t");}break; +case CV_SymKind_UDT_16t:{result = str8_lit("UDT_16t");}break; +case CV_SymKind_SSEARCH:{result = str8_lit("SSEARCH");}break; +case CV_SymKind_END:{result = str8_lit("END");}break; +case CV_SymKind_SKIP:{result = str8_lit("SKIP");}break; +case CV_SymKind_CVRESERVE:{result = str8_lit("CVRESERVE");}break; +case CV_SymKind_OBJNAME_ST:{result = str8_lit("OBJNAME_ST");}break; +case CV_SymKind_ENDARG:{result = str8_lit("ENDARG");}break; +case CV_SymKind_COBOLUDT_16t:{result = str8_lit("COBOLUDT_16t");}break; +case CV_SymKind_MANYREG_16t:{result = str8_lit("MANYREG_16t");}break; +case CV_SymKind_RETURN:{result = str8_lit("RETURN");}break; +case CV_SymKind_ENTRYTHIS:{result = str8_lit("ENTRYTHIS");}break; +case CV_SymKind_BPREL16:{result = str8_lit("BPREL16");}break; +case CV_SymKind_LDATA16:{result = str8_lit("LDATA16");}break; +case CV_SymKind_GDATA16:{result = str8_lit("GDATA16");}break; +case CV_SymKind_PUB16:{result = str8_lit("PUB16");}break; +case CV_SymKind_LPROC16:{result = str8_lit("LPROC16");}break; +case CV_SymKind_GPROC16:{result = str8_lit("GPROC16");}break; +case CV_SymKind_THUNK16:{result = str8_lit("THUNK16");}break; +case CV_SymKind_BLOCK16:{result = str8_lit("BLOCK16");}break; +case CV_SymKind_WITH16:{result = str8_lit("WITH16");}break; +case CV_SymKind_LABEL16:{result = str8_lit("LABEL16");}break; +case CV_SymKind_CEXMODEL16:{result = str8_lit("CEXMODEL16");}break; +case CV_SymKind_VFTABLE16:{result = str8_lit("VFTABLE16");}break; +case CV_SymKind_REGREL16:{result = str8_lit("REGREL16");}break; +case CV_SymKind_BPREL32_16t:{result = str8_lit("BPREL32_16t");}break; +case CV_SymKind_LDATA32_16t:{result = str8_lit("LDATA32_16t");}break; +case CV_SymKind_GDATA32_16t:{result = str8_lit("GDATA32_16t");}break; +case CV_SymKind_PUB32_16t:{result = str8_lit("PUB32_16t");}break; +case CV_SymKind_LPROC32_16t:{result = str8_lit("LPROC32_16t");}break; +case CV_SymKind_GPROC32_16t:{result = str8_lit("GPROC32_16t");}break; +case CV_SymKind_THUNK32_ST:{result = str8_lit("THUNK32_ST");}break; +case CV_SymKind_BLOCK32_ST:{result = str8_lit("BLOCK32_ST");}break; +case CV_SymKind_WITH32_ST:{result = str8_lit("WITH32_ST");}break; +case CV_SymKind_LABEL32_ST:{result = str8_lit("LABEL32_ST");}break; +case CV_SymKind_CEXMODEL32:{result = str8_lit("CEXMODEL32");}break; +case CV_SymKind_VFTABLE32_16t:{result = str8_lit("VFTABLE32_16t");}break; +case CV_SymKind_REGREL32_16t:{result = str8_lit("REGREL32_16t");}break; +case CV_SymKind_LTHREAD32_16t:{result = str8_lit("LTHREAD32_16t");}break; +case CV_SymKind_GTHREAD32_16t:{result = str8_lit("GTHREAD32_16t");}break; +case CV_SymKind_SLINK32:{result = str8_lit("SLINK32");}break; +case CV_SymKind_LPROCMIPS_16t:{result = str8_lit("LPROCMIPS_16t");}break; +case CV_SymKind_GPROCMIPS_16t:{result = str8_lit("GPROCMIPS_16t");}break; +case CV_SymKind_PROCREF_ST:{result = str8_lit("PROCREF_ST");}break; +case CV_SymKind_DATAREF_ST:{result = str8_lit("DATAREF_ST");}break; +case CV_SymKind_ALIGN:{result = str8_lit("ALIGN");}break; +case CV_SymKind_LPROCREF_ST:{result = str8_lit("LPROCREF_ST");}break; +case CV_SymKind_OEM:{result = str8_lit("OEM");}break; +case CV_SymKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; +case CV_SymKind_CONSTANT_ST:{result = str8_lit("CONSTANT_ST");}break; +case CV_SymKind_UDT_ST:{result = str8_lit("UDT_ST");}break; +case CV_SymKind_COBOLUDT_ST:{result = str8_lit("COBOLUDT_ST");}break; +case CV_SymKind_MANYREG_ST:{result = str8_lit("MANYREG_ST");}break; +case CV_SymKind_BPREL32_ST:{result = str8_lit("BPREL32_ST");}break; +case CV_SymKind_LDATA32_ST:{result = str8_lit("LDATA32_ST");}break; +case CV_SymKind_GDATA32_ST:{result = str8_lit("GDATA32_ST");}break; +case CV_SymKind_PUB32_ST:{result = str8_lit("PUB32_ST");}break; +case CV_SymKind_LPROC32_ST:{result = str8_lit("LPROC32_ST");}break; +case CV_SymKind_GPROC32_ST:{result = str8_lit("GPROC32_ST");}break; +case CV_SymKind_VFTABLE32:{result = str8_lit("VFTABLE32");}break; +case CV_SymKind_REGREL32_ST:{result = str8_lit("REGREL32_ST");}break; +case CV_SymKind_LTHREAD32_ST:{result = str8_lit("LTHREAD32_ST");}break; +case CV_SymKind_GTHREAD32_ST:{result = str8_lit("GTHREAD32_ST");}break; +case CV_SymKind_LPROCMIPS_ST:{result = str8_lit("LPROCMIPS_ST");}break; +case CV_SymKind_GPROCMIPS_ST:{result = str8_lit("GPROCMIPS_ST");}break; +case CV_SymKind_FRAMEPROC:{result = str8_lit("FRAMEPROC");}break; +case CV_SymKind_COMPILE2_ST:{result = str8_lit("COMPILE2_ST");}break; +case CV_SymKind_MANYREG2_ST:{result = str8_lit("MANYREG2_ST");}break; +case CV_SymKind_LPROCIA64_ST:{result = str8_lit("LPROCIA64_ST");}break; +case CV_SymKind_GPROCIA64_ST:{result = str8_lit("GPROCIA64_ST");}break; +case CV_SymKind_LOCALSLOT_ST:{result = str8_lit("LOCALSLOT_ST");}break; +case CV_SymKind_PARAMSLOT_ST:{result = str8_lit("PARAMSLOT_ST");}break; +case CV_SymKind_ANNOTATION:{result = str8_lit("ANNOTATION");}break; +case CV_SymKind_GMANPROC_ST:{result = str8_lit("GMANPROC_ST");}break; +case CV_SymKind_LMANPROC_ST:{result = str8_lit("LMANPROC_ST");}break; +case CV_SymKind_RESERVED1:{result = str8_lit("RESERVED1");}break; +case CV_SymKind_RESERVED2:{result = str8_lit("RESERVED2");}break; +case CV_SymKind_RESERVED3:{result = str8_lit("RESERVED3");}break; +case CV_SymKind_RESERVED4:{result = str8_lit("RESERVED4");}break; +case CV_SymKind_LMANDATA_ST:{result = str8_lit("LMANDATA_ST");}break; +case CV_SymKind_GMANDATA_ST:{result = str8_lit("GMANDATA_ST");}break; +case CV_SymKind_MANFRAMEREL_ST:{result = str8_lit("MANFRAMEREL_ST");}break; +case CV_SymKind_MANREGISTER_ST:{result = str8_lit("MANREGISTER_ST");}break; +case CV_SymKind_MANSLOT_ST:{result = str8_lit("MANSLOT_ST");}break; +case CV_SymKind_MANMANYREG_ST:{result = str8_lit("MANMANYREG_ST");}break; +case CV_SymKind_MANREGREL_ST:{result = str8_lit("MANREGREL_ST");}break; +case CV_SymKind_MANMANYREG2_ST:{result = str8_lit("MANMANYREG2_ST");}break; +case CV_SymKind_MANTYPREF:{result = str8_lit("MANTYPREF");}break; +case CV_SymKind_UNAMESPACE_ST:{result = str8_lit("UNAMESPACE_ST");}break; +case CV_SymKind_ST_MAX:{result = str8_lit("ST_MAX");}break; +case CV_SymKind_OBJNAME:{result = str8_lit("OBJNAME");}break; +case CV_SymKind_THUNK32:{result = str8_lit("THUNK32");}break; +case CV_SymKind_BLOCK32:{result = str8_lit("BLOCK32");}break; +case CV_SymKind_WITH32:{result = str8_lit("WITH32");}break; +case CV_SymKind_LABEL32:{result = str8_lit("LABEL32");}break; +case CV_SymKind_REGISTER:{result = str8_lit("REGISTER");}break; +case CV_SymKind_CONSTANT:{result = str8_lit("CONSTANT");}break; +case CV_SymKind_UDT:{result = str8_lit("UDT");}break; +case CV_SymKind_COBOLUDT:{result = str8_lit("COBOLUDT");}break; +case CV_SymKind_MANYREG:{result = str8_lit("MANYREG");}break; +case CV_SymKind_BPREL32:{result = str8_lit("BPREL32");}break; +case CV_SymKind_LDATA32:{result = str8_lit("LDATA32");}break; +case CV_SymKind_GDATA32:{result = str8_lit("GDATA32");}break; +case CV_SymKind_PUB32:{result = str8_lit("PUB32");}break; +case CV_SymKind_LPROC32:{result = str8_lit("LPROC32");}break; +case CV_SymKind_GPROC32:{result = str8_lit("GPROC32");}break; +case CV_SymKind_REGREL32:{result = str8_lit("REGREL32");}break; +case CV_SymKind_LTHREAD32:{result = str8_lit("LTHREAD32");}break; +case CV_SymKind_GTHREAD32:{result = str8_lit("GTHREAD32");}break; +case CV_SymKind_LPROCMIPS:{result = str8_lit("LPROCMIPS");}break; +case CV_SymKind_GPROCMIPS:{result = str8_lit("GPROCMIPS");}break; +case CV_SymKind_COMPILE2:{result = str8_lit("COMPILE2");}break; +case CV_SymKind_MANYREG2:{result = str8_lit("MANYREG2");}break; +case CV_SymKind_LPROCIA64:{result = str8_lit("LPROCIA64");}break; +case CV_SymKind_GPROCIA64:{result = str8_lit("GPROCIA64");}break; +case CV_SymKind_LOCALSLOT:{result = str8_lit("LOCALSLOT");}break; +case CV_SymKind_PARAMSLOT:{result = str8_lit("PARAMSLOT");}break; +case CV_SymKind_LMANDATA:{result = str8_lit("LMANDATA");}break; +case CV_SymKind_GMANDATA:{result = str8_lit("GMANDATA");}break; +case CV_SymKind_MANFRAMEREL:{result = str8_lit("MANFRAMEREL");}break; +case CV_SymKind_MANREGISTER:{result = str8_lit("MANREGISTER");}break; +case CV_SymKind_MANSLOT:{result = str8_lit("MANSLOT");}break; +case CV_SymKind_MANMANYREG:{result = str8_lit("MANMANYREG");}break; +case CV_SymKind_MANREGREL:{result = str8_lit("MANREGREL");}break; +case CV_SymKind_MANMANYREG2:{result = str8_lit("MANMANYREG2");}break; +case CV_SymKind_UNAMESPACE:{result = str8_lit("UNAMESPACE");}break; +case CV_SymKind_PROCREF:{result = str8_lit("PROCREF");}break; +case CV_SymKind_DATAREF:{result = str8_lit("DATAREF");}break; +case CV_SymKind_LPROCREF:{result = str8_lit("LPROCREF");}break; +case CV_SymKind_ANNOTATIONREF:{result = str8_lit("ANNOTATIONREF");}break; +case CV_SymKind_TOKENREF:{result = str8_lit("TOKENREF");}break; +case CV_SymKind_GMANPROC:{result = str8_lit("GMANPROC");}break; +case CV_SymKind_LMANPROC:{result = str8_lit("LMANPROC");}break; +case CV_SymKind_TRAMPOLINE:{result = str8_lit("TRAMPOLINE");}break; +case CV_SymKind_MANCONSTANT:{result = str8_lit("MANCONSTANT");}break; +case CV_SymKind_ATTR_FRAMEREL:{result = str8_lit("ATTR_FRAMEREL");}break; +case CV_SymKind_ATTR_REGISTER:{result = str8_lit("ATTR_REGISTER");}break; +case CV_SymKind_ATTR_REGREL:{result = str8_lit("ATTR_REGREL");}break; +case CV_SymKind_ATTR_MANYREG:{result = str8_lit("ATTR_MANYREG");}break; +case CV_SymKind_SEPCODE:{result = str8_lit("SEPCODE");}break; +case CV_SymKind_DEFRANGE_2005:{result = str8_lit("DEFRANGE_2005");}break; +case CV_SymKind_DEFRANGE2_2005:{result = str8_lit("DEFRANGE2_2005");}break; +case CV_SymKind_SECTION:{result = str8_lit("SECTION");}break; +case CV_SymKind_COFFGROUP:{result = str8_lit("COFFGROUP");}break; +case CV_SymKind_EXPORT:{result = str8_lit("EXPORT");}break; +case CV_SymKind_CALLSITEINFO:{result = str8_lit("CALLSITEINFO");}break; +case CV_SymKind_FRAMECOOKIE:{result = str8_lit("FRAMECOOKIE");}break; +case CV_SymKind_DISCARDED:{result = str8_lit("DISCARDED");}break; +case CV_SymKind_COMPILE3:{result = str8_lit("COMPILE3");}break; +case CV_SymKind_ENVBLOCK:{result = str8_lit("ENVBLOCK");}break; +case CV_SymKind_LOCAL:{result = str8_lit("LOCAL");}break; +case CV_SymKind_DEFRANGE:{result = str8_lit("DEFRANGE");}break; +case CV_SymKind_DEFRANGE_SUBFIELD:{result = str8_lit("DEFRANGE_SUBFIELD");}break; +case CV_SymKind_DEFRANGE_REGISTER:{result = str8_lit("DEFRANGE_REGISTER");}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL");}break; +case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = str8_lit("DEFRANGE_SUBFIELD_REGISTER");}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = str8_lit("DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE");}break; +case CV_SymKind_DEFRANGE_REGISTER_REL:{result = str8_lit("DEFRANGE_REGISTER_REL");}break; +case CV_SymKind_LPROC32_ID:{result = str8_lit("LPROC32_ID");}break; +case CV_SymKind_GPROC32_ID:{result = str8_lit("GPROC32_ID");}break; +case CV_SymKind_LPROCMIPS_ID:{result = str8_lit("LPROCMIPS_ID");}break; +case CV_SymKind_GPROCMIPS_ID:{result = str8_lit("GPROCMIPS_ID");}break; +case CV_SymKind_LPROCIA64_ID:{result = str8_lit("LPROCIA64_ID");}break; +case CV_SymKind_GPROCIA64_ID:{result = str8_lit("GPROCIA64_ID");}break; +case CV_SymKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; +case CV_SymKind_INLINESITE:{result = str8_lit("INLINESITE");}break; +case CV_SymKind_INLINESITE_END:{result = str8_lit("INLINESITE_END");}break; +case CV_SymKind_PROC_ID_END:{result = str8_lit("PROC_ID_END");}break; +case CV_SymKind_DEFRANGE_HLSL:{result = str8_lit("DEFRANGE_HLSL");}break; +case CV_SymKind_GDATA_HLSL:{result = str8_lit("GDATA_HLSL");}break; +case CV_SymKind_LDATA_HLSL:{result = str8_lit("LDATA_HLSL");}break; +case CV_SymKind_FILESTATIC:{result = str8_lit("FILESTATIC");}break; +case CV_SymKind_LPROC32_DPC:{result = str8_lit("LPROC32_DPC");}break; +case CV_SymKind_LPROC32_DPC_ID:{result = str8_lit("LPROC32_DPC_ID");}break; +case CV_SymKind_DEFRANGE_DPC_PTR_TAG:{result = str8_lit("DEFRANGE_DPC_PTR_TAG");}break; +case CV_SymKind_DPC_SYM_TAG_MAP:{result = str8_lit("DPC_SYM_TAG_MAP");}break; +case CV_SymKind_ARMSWITCHTABLE:{result = str8_lit("ARMSWITCHTABLE");}break; +case CV_SymKind_CALLEES:{result = str8_lit("CALLEES");}break; +case CV_SymKind_CALLERS:{result = str8_lit("CALLERS");}break; +case CV_SymKind_POGODATA:{result = str8_lit("POGODATA");}break; +case CV_SymKind_INLINESITE2:{result = str8_lit("INLINESITE2");}break; +case CV_SymKind_HEAPALLOCSITE:{result = str8_lit("HEAPALLOCSITE");}break; +case CV_SymKind_MOD_TYPEREF:{result = str8_lit("MOD_TYPEREF");}break; +case CV_SymKind_REF_MINIPDB:{result = str8_lit("REF_MINIPDB");}break; +case CV_SymKind_PDBMAP:{result = str8_lit("PDBMAP");}break; +case CV_SymKind_GDATA_HLSL32:{result = str8_lit("GDATA_HLSL32");}break; +case CV_SymKind_LDATA_HLSL32:{result = str8_lit("LDATA_HLSL32");}break; +case CV_SymKind_GDATA_HLSL32_EX:{result = str8_lit("GDATA_HLSL32_EX");}break; +case CV_SymKind_LDATA_HLSL32_EX:{result = str8_lit("LDATA_HLSL32_EX");}break; +case CV_SymKind_FASTLINK:{result = str8_lit("FASTLINK");}break; +case CV_SymKind_INLINEES:{result = str8_lit("INLINEES");}break; +} +return result; +} + +internal String8 +cv_string_from_basic_type(CV_BasicType v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_BasicType_NOTYPE:{result = str8_lit("NOTYPE");}break; +case CV_BasicType_ABS:{result = str8_lit("ABS");}break; +case CV_BasicType_SEGMENT:{result = str8_lit("SEGMENT");}break; +case CV_BasicType_VOID:{result = str8_lit("VOID");}break; +case CV_BasicType_CURRENCY:{result = str8_lit("CURRENCY");}break; +case CV_BasicType_NBASICSTR:{result = str8_lit("NBASICSTR");}break; +case CV_BasicType_FBASICSTR:{result = str8_lit("FBASICSTR");}break; +case CV_BasicType_NOTTRANS:{result = str8_lit("NOTTRANS");}break; +case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; +case CV_BasicType_CHAR:{result = str8_lit("CHAR");}break; +case CV_BasicType_SHORT:{result = str8_lit("SHORT");}break; +case CV_BasicType_LONG:{result = str8_lit("LONG");}break; +case CV_BasicType_QUAD:{result = str8_lit("QUAD");}break; +case CV_BasicType_OCT:{result = str8_lit("OCT");}break; +case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; +case CV_BasicType_USHORT:{result = str8_lit("USHORT");}break; +case CV_BasicType_ULONG:{result = str8_lit("ULONG");}break; +case CV_BasicType_UQUAD:{result = str8_lit("UQUAD");}break; +case CV_BasicType_UOCT:{result = str8_lit("UOCT");}break; +case CV_BasicType_BOOL8:{result = str8_lit("BOOL8");}break; +case CV_BasicType_BOOL16:{result = str8_lit("BOOL16");}break; +case CV_BasicType_BOOL32:{result = str8_lit("BOOL32");}break; +case CV_BasicType_BOOL64:{result = str8_lit("BOOL64");}break; +case CV_BasicType_FLOAT32:{result = str8_lit("FLOAT32");}break; +case CV_BasicType_FLOAT64:{result = str8_lit("FLOAT64");}break; +case CV_BasicType_FLOAT80:{result = str8_lit("FLOAT80");}break; +case CV_BasicType_FLOAT128:{result = str8_lit("FLOAT128");}break; +case CV_BasicType_FLOAT48:{result = str8_lit("FLOAT48");}break; +case CV_BasicType_FLOAT32PP:{result = str8_lit("FLOAT32PP");}break; +case CV_BasicType_FLOAT16:{result = str8_lit("FLOAT16");}break; +case CV_BasicType_COMPLEX32:{result = str8_lit("COMPLEX32");}break; +case CV_BasicType_COMPLEX64:{result = str8_lit("COMPLEX64");}break; +case CV_BasicType_COMPLEX80:{result = str8_lit("COMPLEX80");}break; +case CV_BasicType_COMPLEX128:{result = str8_lit("COMPLEX128");}break; +case CV_BasicType_BIT:{result = str8_lit("BIT");}break; +case CV_BasicType_PASCHAR:{result = str8_lit("PASCHAR");}break; +case CV_BasicType_BOOL32FF:{result = str8_lit("BOOL32FF");}break; +case CV_BasicType_INT8:{result = str8_lit("INT8");}break; +case CV_BasicType_UINT8:{result = str8_lit("UINT8");}break; +case CV_BasicType_RCHAR:{result = str8_lit("RCHAR");}break; +case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; +case CV_BasicType_INT16:{result = str8_lit("INT16");}break; +case CV_BasicType_UINT16:{result = str8_lit("UINT16");}break; +case CV_BasicType_INT32:{result = str8_lit("INT32");}break; +case CV_BasicType_UINT32:{result = str8_lit("UINT32");}break; +case CV_BasicType_INT64:{result = str8_lit("INT64");}break; +case CV_BasicType_UINT64:{result = str8_lit("UINT64");}break; +case CV_BasicType_INT128:{result = str8_lit("INT128");}break; +case CV_BasicType_UINT128:{result = str8_lit("UINT128");}break; +case CV_BasicType_CHAR16:{result = str8_lit("CHAR16");}break; +case CV_BasicType_CHAR32:{result = str8_lit("CHAR32");}break; +case CV_BasicType_CHAR8:{result = str8_lit("CHAR8");}break; +case CV_BasicType_PTR:{result = str8_lit("PTR");}break; +} +return result; +} + +internal String8 +cv_type_name_from_basic_type(CV_BasicType v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_BasicType_NOTYPE:{result = str8_lit("");}break; +case CV_BasicType_ABS:{result = str8_lit("");}break; +case CV_BasicType_SEGMENT:{result = str8_lit("");}break; +case CV_BasicType_VOID:{result = str8_lit("void");}break; +case CV_BasicType_CURRENCY:{result = str8_lit("");}break; +case CV_BasicType_NBASICSTR:{result = str8_lit("");}break; +case CV_BasicType_FBASICSTR:{result = str8_lit("");}break; +case CV_BasicType_NOTTRANS:{result = str8_lit("");}break; +case CV_BasicType_HRESULT:{result = str8_lit("HRESULT");}break; +case CV_BasicType_CHAR:{result = str8_lit("CHAR");}break; +case CV_BasicType_SHORT:{result = str8_lit("SHORT");}break; +case CV_BasicType_LONG:{result = str8_lit("LONG");}break; +case CV_BasicType_QUAD:{result = str8_lit("QUAD");}break; +case CV_BasicType_OCT:{result = str8_lit("OCT");}break; +case CV_BasicType_UCHAR:{result = str8_lit("UCHAR");}break; +case CV_BasicType_USHORT:{result = str8_lit("USHORT");}break; +case CV_BasicType_ULONG:{result = str8_lit("ULONG");}break; +case CV_BasicType_UQUAD:{result = str8_lit("UQUAD");}break; +case CV_BasicType_UOCT:{result = str8_lit("UOCT");}break; +case CV_BasicType_BOOL8:{result = str8_lit("BOOL8");}break; +case CV_BasicType_BOOL16:{result = str8_lit("BOOL16");}break; +case CV_BasicType_BOOL32:{result = str8_lit("BOOL32");}break; +case CV_BasicType_BOOL64:{result = str8_lit("BOOL64");}break; +case CV_BasicType_FLOAT32:{result = str8_lit("FLOAT32");}break; +case CV_BasicType_FLOAT64:{result = str8_lit("FLOAT64");}break; +case CV_BasicType_FLOAT80:{result = str8_lit("FLOAT80");}break; +case CV_BasicType_FLOAT128:{result = str8_lit("FLOAT128");}break; +case CV_BasicType_FLOAT48:{result = str8_lit("FLOAT48");}break; +case CV_BasicType_FLOAT32PP:{result = str8_lit("FLOAT32PP");}break; +case CV_BasicType_FLOAT16:{result = str8_lit("FLOAT16");}break; +case CV_BasicType_COMPLEX32:{result = str8_lit("ComplexF32");}break; +case CV_BasicType_COMPLEX64:{result = str8_lit("ComplexF64");}break; +case CV_BasicType_COMPLEX80:{result = str8_lit("ComplexF80");}break; +case CV_BasicType_COMPLEX128:{result = str8_lit("ComplexF128");}break; +case CV_BasicType_BIT:{result = str8_lit("");}break; +case CV_BasicType_PASCHAR:{result = str8_lit("");}break; +case CV_BasicType_BOOL32FF:{result = str8_lit("BOOL32FF");}break; +case CV_BasicType_INT8:{result = str8_lit("int8");}break; +case CV_BasicType_UINT8:{result = str8_lit("uint8");}break; +case CV_BasicType_RCHAR:{result = str8_lit("char");}break; +case CV_BasicType_WCHAR:{result = str8_lit("WCHAR");}break; +case CV_BasicType_INT16:{result = str8_lit("int16");}break; +case CV_BasicType_UINT16:{result = str8_lit("uint16");}break; +case CV_BasicType_INT32:{result = str8_lit("int32");}break; +case CV_BasicType_UINT32:{result = str8_lit("uint32");}break; +case CV_BasicType_INT64:{result = str8_lit("int64");}break; +case CV_BasicType_UINT64:{result = str8_lit("uint64");}break; +case CV_BasicType_INT128:{result = str8_lit("int128");}break; +case CV_BasicType_UINT128:{result = str8_lit("uint128");}break; +case CV_BasicType_CHAR16:{result = str8_lit("char16");}break; +case CV_BasicType_CHAR32:{result = str8_lit("char32");}break; +case CV_BasicType_CHAR8:{result = str8_lit("char");}break; +case CV_BasicType_PTR:{result = str8_lit("PTR");}break; +} +return result; +} + +internal String8 +cv_string_from_leaf_kind(CV_LeafKind v) +{ +String8 result = str8_lit(""); +switch(v) +{ +default:{}break; +case CV_LeafKind_NOTYPE:{result = str8_lit("NOTYPE");}break; +case CV_LeafKind_MODIFIER_16t:{result = str8_lit("MODIFIER_16t");}break; +case CV_LeafKind_POINTER_16t:{result = str8_lit("POINTER_16t");}break; +case CV_LeafKind_ARRAY_16t:{result = str8_lit("ARRAY_16t");}break; +case CV_LeafKind_CLASS_16t:{result = str8_lit("CLASS_16t");}break; +case CV_LeafKind_STRUCTURE_16t:{result = str8_lit("STRUCTURE_16t");}break; +case CV_LeafKind_UNION_16t:{result = str8_lit("UNION_16t");}break; +case CV_LeafKind_ENUM_16t:{result = str8_lit("ENUM_16t");}break; +case CV_LeafKind_PROCEDURE_16t:{result = str8_lit("PROCEDURE_16t");}break; +case CV_LeafKind_MFUNCTION_16t:{result = str8_lit("MFUNCTION_16t");}break; +case CV_LeafKind_VTSHAPE:{result = str8_lit("VTSHAPE");}break; +case CV_LeafKind_COBOL0_16t:{result = str8_lit("COBOL0_16t");}break; +case CV_LeafKind_COBOL1:{result = str8_lit("COBOL1");}break; +case CV_LeafKind_BARRAY_16t:{result = str8_lit("BARRAY_16t");}break; +case CV_LeafKind_LABEL:{result = str8_lit("LABEL");}break; +case CV_LeafKind_NULL:{result = str8_lit("NULL");}break; +case CV_LeafKind_NOTTRAN:{result = str8_lit("NOTTRAN");}break; +case CV_LeafKind_DIMARRAY_16t:{result = str8_lit("DIMARRAY_16t");}break; +case CV_LeafKind_VFTPATH_16t:{result = str8_lit("VFTPATH_16t");}break; +case CV_LeafKind_PRECOMP_16t:{result = str8_lit("PRECOMP_16t");}break; +case CV_LeafKind_ENDPRECOMP:{result = str8_lit("ENDPRECOMP");}break; +case CV_LeafKind_OEM_16t:{result = str8_lit("OEM_16t");}break; +case CV_LeafKind_TYPESERVER_ST:{result = str8_lit("TYPESERVER_ST");}break; +case CV_LeafKind_SKIP_16t:{result = str8_lit("SKIP_16t");}break; +case CV_LeafKind_ARGLIST_16t:{result = str8_lit("ARGLIST_16t");}break; +case CV_LeafKind_DEFARG_16t:{result = str8_lit("DEFARG_16t");}break; +case CV_LeafKind_LIST:{result = str8_lit("LIST");}break; +case CV_LeafKind_FIELDLIST_16t:{result = str8_lit("FIELDLIST_16t");}break; +case CV_LeafKind_DERIVED_16t:{result = str8_lit("DERIVED_16t");}break; +case CV_LeafKind_BITFIELD_16t:{result = str8_lit("BITFIELD_16t");}break; +case CV_LeafKind_METHODLIST_16t:{result = str8_lit("METHODLIST_16t");}break; +case CV_LeafKind_DIMCONU_16t:{result = str8_lit("DIMCONU_16t");}break; +case CV_LeafKind_DIMCONLU_16t:{result = str8_lit("DIMCONLU_16t");}break; +case CV_LeafKind_DIMVARU_16t:{result = str8_lit("DIMVARU_16t");}break; +case CV_LeafKind_DIMVARLU_16t:{result = str8_lit("DIMVARLU_16t");}break; +case CV_LeafKind_REFSYM:{result = str8_lit("REFSYM");}break; +case CV_LeafKind_BCLASS_16t:{result = str8_lit("BCLASS_16t");}break; +case CV_LeafKind_VBCLASS_16t:{result = str8_lit("VBCLASS_16t");}break; +case CV_LeafKind_IVBCLASS_16t:{result = str8_lit("IVBCLASS_16t");}break; +case CV_LeafKind_ENUMERATE_ST:{result = str8_lit("ENUMERATE_ST");}break; +case CV_LeafKind_FRIENDFCN_16t:{result = str8_lit("FRIENDFCN_16t");}break; +case CV_LeafKind_INDEX_16t:{result = str8_lit("INDEX_16t");}break; +case CV_LeafKind_MEMBER_16t:{result = str8_lit("MEMBER_16t");}break; +case CV_LeafKind_STMEMBER_16t:{result = str8_lit("STMEMBER_16t");}break; +case CV_LeafKind_METHOD_16t:{result = str8_lit("METHOD_16t");}break; +case CV_LeafKind_NESTTYPE_16t:{result = str8_lit("NESTTYPE_16t");}break; +case CV_LeafKind_VFUNCTAB_16t:{result = str8_lit("VFUNCTAB_16t");}break; +case CV_LeafKind_FRIENDCLS_16t:{result = str8_lit("FRIENDCLS_16t");}break; +case CV_LeafKind_ONEMETHOD_16t:{result = str8_lit("ONEMETHOD_16t");}break; +case CV_LeafKind_VFUNCOFF_16t:{result = str8_lit("VFUNCOFF_16t");}break; +case CV_LeafKind_TI16_MAX:{result = str8_lit("TI16_MAX");}break; +case CV_LeafKind_MODIFIER:{result = str8_lit("MODIFIER");}break; +case CV_LeafKind_POINTER:{result = str8_lit("POINTER");}break; +case CV_LeafKind_ARRAY_ST:{result = str8_lit("ARRAY_ST");}break; +case CV_LeafKind_CLASS_ST:{result = str8_lit("CLASS_ST");}break; +case CV_LeafKind_STRUCTURE_ST:{result = str8_lit("STRUCTURE_ST");}break; +case CV_LeafKind_UNION_ST:{result = str8_lit("UNION_ST");}break; +case CV_LeafKind_ENUM_ST:{result = str8_lit("ENUM_ST");}break; +case CV_LeafKind_PROCEDURE:{result = str8_lit("PROCEDURE");}break; +case CV_LeafKind_MFUNCTION:{result = str8_lit("MFUNCTION");}break; +case CV_LeafKind_COBOL0:{result = str8_lit("COBOL0");}break; +case CV_LeafKind_BARRAY:{result = str8_lit("BARRAY");}break; +case CV_LeafKind_DIMARRAY_ST:{result = str8_lit("DIMARRAY_ST");}break; +case CV_LeafKind_VFTPATH:{result = str8_lit("VFTPATH");}break; +case CV_LeafKind_PRECOMP_ST:{result = str8_lit("PRECOMP_ST");}break; +case CV_LeafKind_OEM:{result = str8_lit("OEM");}break; +case CV_LeafKind_ALIAS_ST:{result = str8_lit("ALIAS_ST");}break; +case CV_LeafKind_OEM2:{result = str8_lit("OEM2");}break; +case CV_LeafKind_SKIP:{result = str8_lit("SKIP");}break; +case CV_LeafKind_ARGLIST:{result = str8_lit("ARGLIST");}break; +case CV_LeafKind_DEFARG_ST:{result = str8_lit("DEFARG_ST");}break; +case CV_LeafKind_FIELDLIST:{result = str8_lit("FIELDLIST");}break; +case CV_LeafKind_DERIVED:{result = str8_lit("DERIVED");}break; +case CV_LeafKind_BITFIELD:{result = str8_lit("BITFIELD");}break; +case CV_LeafKind_METHODLIST:{result = str8_lit("METHODLIST");}break; +case CV_LeafKind_DIMCONU:{result = str8_lit("DIMCONU");}break; +case CV_LeafKind_DIMCONLU:{result = str8_lit("DIMCONLU");}break; +case CV_LeafKind_DIMVARU:{result = str8_lit("DIMVARU");}break; +case CV_LeafKind_DIMVARLU:{result = str8_lit("DIMVARLU");}break; +case CV_LeafKind_BCLASS:{result = str8_lit("BCLASS");}break; +case CV_LeafKind_VBCLASS:{result = str8_lit("VBCLASS");}break; +case CV_LeafKind_IVBCLASS:{result = str8_lit("IVBCLASS");}break; +case CV_LeafKind_FRIENDFCN_ST:{result = str8_lit("FRIENDFCN_ST");}break; +case CV_LeafKind_INDEX:{result = str8_lit("INDEX");}break; +case CV_LeafKind_MEMBER_ST:{result = str8_lit("MEMBER_ST");}break; +case CV_LeafKind_STMEMBER_ST:{result = str8_lit("STMEMBER_ST");}break; +case CV_LeafKind_METHOD_ST:{result = str8_lit("METHOD_ST");}break; +case CV_LeafKind_NESTTYPE_ST:{result = str8_lit("NESTTYPE_ST");}break; +case CV_LeafKind_VFUNCTAB:{result = str8_lit("VFUNCTAB");}break; +case CV_LeafKind_FRIENDCLS:{result = str8_lit("FRIENDCLS");}break; +case CV_LeafKind_ONEMETHOD_ST:{result = str8_lit("ONEMETHOD_ST");}break; +case CV_LeafKind_VFUNCOFF:{result = str8_lit("VFUNCOFF");}break; +case CV_LeafKind_NESTTYPEEX_ST:{result = str8_lit("NESTTYPEEX_ST");}break; +case CV_LeafKind_MEMBERMODIFY_ST:{result = str8_lit("MEMBERMODIFY_ST");}break; +case CV_LeafKind_MANAGED_ST:{result = str8_lit("MANAGED_ST");}break; +case CV_LeafKind_ST_MAX:{result = str8_lit("ST_MAX");}break; +case CV_LeafKind_TYPESERVER:{result = str8_lit("TYPESERVER");}break; +case CV_LeafKind_ENUMERATE:{result = str8_lit("ENUMERATE");}break; +case CV_LeafKind_ARRAY:{result = str8_lit("ARRAY");}break; +case CV_LeafKind_CLASS:{result = str8_lit("CLASS");}break; +case CV_LeafKind_STRUCTURE:{result = str8_lit("STRUCTURE");}break; +case CV_LeafKind_UNION:{result = str8_lit("UNION");}break; +case CV_LeafKind_ENUM:{result = str8_lit("ENUM");}break; +case CV_LeafKind_DIMARRAY:{result = str8_lit("DIMARRAY");}break; +case CV_LeafKind_PRECOMP:{result = str8_lit("PRECOMP");}break; +case CV_LeafKind_ALIAS:{result = str8_lit("ALIAS");}break; +case CV_LeafKind_DEFARG:{result = str8_lit("DEFARG");}break; +case CV_LeafKind_FRIENDFCN:{result = str8_lit("FRIENDFCN");}break; +case CV_LeafKind_MEMBER:{result = str8_lit("MEMBER");}break; +case CV_LeafKind_STMEMBER:{result = str8_lit("STMEMBER");}break; +case CV_LeafKind_METHOD:{result = str8_lit("METHOD");}break; +case CV_LeafKind_NESTTYPE:{result = str8_lit("NESTTYPE");}break; +case CV_LeafKind_ONEMETHOD:{result = str8_lit("ONEMETHOD");}break; +case CV_LeafKind_NESTTYPEEX:{result = str8_lit("NESTTYPEEX");}break; +case CV_LeafKind_MEMBERMODIFY:{result = str8_lit("MEMBERMODIFY");}break; +case CV_LeafKind_MANAGED:{result = str8_lit("MANAGED");}break; +case CV_LeafKind_TYPESERVER2:{result = str8_lit("TYPESERVER2");}break; +case CV_LeafKind_STRIDED_ARRAY:{result = str8_lit("STRIDED_ARRAY");}break; +case CV_LeafKind_HLSL:{result = str8_lit("HLSL");}break; +case CV_LeafKind_MODIFIER_EX:{result = str8_lit("MODIFIER_EX");}break; +case CV_LeafKind_INTERFACE:{result = str8_lit("INTERFACE");}break; +case CV_LeafKind_BINTERFACE:{result = str8_lit("BINTERFACE");}break; +case CV_LeafKind_VECTOR:{result = str8_lit("VECTOR");}break; +case CV_LeafKind_MATRIX:{result = str8_lit("MATRIX");}break; +case CV_LeafKind_VFTABLE:{result = str8_lit("VFTABLE");}break; +case CV_LeafKind_FUNC_ID:{result = str8_lit("FUNC_ID");}break; +case CV_LeafKind_MFUNC_ID:{result = str8_lit("MFUNC_ID");}break; +case CV_LeafKind_BUILDINFO:{result = str8_lit("BUILDINFO");}break; +case CV_LeafKind_SUBSTR_LIST:{result = str8_lit("SUBSTR_LIST");}break; +case CV_LeafKind_STRING_ID:{result = str8_lit("STRING_ID");}break; +case CV_LeafKind_UDT_SRC_LINE:{result = str8_lit("UDT_SRC_LINE");}break; +case CV_LeafKind_UDT_MOD_SRC_LINE:{result = str8_lit("UDT_MOD_SRC_LINE");}break; +case CV_LeafKind_CLASS2:{result = str8_lit("CLASS2");}break; +case CV_LeafKind_STRUCT2:{result = str8_lit("STRUCT2");}break; +} +return result; +} + +internal U64 +cv_header_struct_size_from_sym_kind(CV_SymKind v) +{ +U64 result = 0; +switch(v) +{ +default:{}break; +case CV_SymKind_COMPILE:{result = sizeof(CV_SymCompile);}break; +case CV_SymKind_SSEARCH:{result = sizeof(CV_SymStartSearch);}break; +case CV_SymKind_RETURN:{result = sizeof(CV_SymReturn);}break; +case CV_SymKind_SLINK32:{result = sizeof(CV_SymSLink32);}break; +case CV_SymKind_OEM:{result = sizeof(CV_SymOEM);}break; +case CV_SymKind_VFTABLE32:{result = sizeof(CV_SymVPath32);}break; +case CV_SymKind_FRAMEPROC:{result = sizeof(CV_SymFrameproc);}break; +case CV_SymKind_ANNOTATION:{result = sizeof(CV_SymAnnotation);}break; +case CV_SymKind_OBJNAME:{result = sizeof(CV_SymObjName);}break; +case CV_SymKind_THUNK32:{result = sizeof(CV_SymThunk32);}break; +case CV_SymKind_BLOCK32:{result = sizeof(CV_SymBlock32);}break; +case CV_SymKind_LABEL32:{result = sizeof(CV_SymLabel32);}break; +case CV_SymKind_REGISTER:{result = sizeof(CV_SymRegister);}break; +case CV_SymKind_CONSTANT:{result = sizeof(CV_SymConstant);}break; +case CV_SymKind_UDT:{result = sizeof(CV_SymUDT);}break; +case CV_SymKind_MANYREG:{result = sizeof(CV_SymManyreg);}break; +case CV_SymKind_BPREL32:{result = sizeof(CV_SymBPRel32);}break; +case CV_SymKind_LDATA32:{result = sizeof(CV_SymData32);}break; +case CV_SymKind_GDATA32:{result = sizeof(CV_SymData32);}break; +case CV_SymKind_PUB32:{result = sizeof(CV_SymPub32);}break; +case CV_SymKind_LPROC32:{result = sizeof(CV_SymProc32);}break; +case CV_SymKind_GPROC32:{result = sizeof(CV_SymProc32);}break; +case CV_SymKind_REGREL32:{result = sizeof(CV_SymRegrel32);}break; +case CV_SymKind_LTHREAD32:{result = sizeof(CV_SymThread32);}break; +case CV_SymKind_GTHREAD32:{result = sizeof(CV_SymThread32);}break; +case CV_SymKind_COMPILE2:{result = sizeof(CV_SymCompile2);}break; +case CV_SymKind_MANYREG2:{result = sizeof(CV_SymManyreg2);}break; +case CV_SymKind_LOCALSLOT:{result = sizeof(CV_SymSlot);}break; +case CV_SymKind_MANFRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; +case CV_SymKind_MANREGISTER:{result = sizeof(CV_SymAttrReg);}break; +case CV_SymKind_MANMANYREG:{result = sizeof(CV_SymAttrManyReg);}break; +case CV_SymKind_MANREGREL:{result = sizeof(CV_SymAttrRegRel);}break; +case CV_SymKind_UNAMESPACE:{result = sizeof(CV_SymUNamespace);}break; +case CV_SymKind_PROCREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_DATAREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_LPROCREF:{result = sizeof(CV_SymRef2);}break; +case CV_SymKind_TRAMPOLINE:{result = sizeof(CV_SymTrampoline);}break; +case CV_SymKind_ATTR_FRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break; +case CV_SymKind_ATTR_REGISTER:{result = sizeof(CV_SymAttrReg);}break; +case CV_SymKind_ATTR_REGREL:{result = sizeof(CV_SymAttrRegRel);}break; +case CV_SymKind_ATTR_MANYREG:{result = sizeof(CV_SymAttrManyReg);}break; +case CV_SymKind_SEPCODE:{result = sizeof(CV_SymSepcode);}break; +case CV_SymKind_SECTION:{result = sizeof(CV_SymSection);}break; +case CV_SymKind_COFFGROUP:{result = sizeof(CV_SymCoffGroup);}break; +case CV_SymKind_EXPORT:{result = sizeof(CV_SymExport);}break; +case CV_SymKind_CALLSITEINFO:{result = sizeof(CV_SymCallSiteInfo);}break; +case CV_SymKind_FRAMECOOKIE:{result = sizeof(CV_SymFrameCookie);}break; +case CV_SymKind_DISCARDED:{result = sizeof(CV_SymDiscarded);}break; +case CV_SymKind_COMPILE3:{result = sizeof(CV_SymCompile3);}break; +case CV_SymKind_ENVBLOCK:{result = sizeof(CV_SymEnvBlock);}break; +case CV_SymKind_LOCAL:{result = sizeof(CV_SymLocal);}break; +case CV_SymKind_DEFRANGE_SUBFIELD:{result = sizeof(CV_SymDefrangeSubfield);}break; +case CV_SymKind_DEFRANGE_REGISTER:{result = sizeof(CV_SymDefrangeRegister);}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = sizeof(CV_SymDefrangeFramepointerRel);}break; +case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = sizeof(CV_SymDefrangeSubfieldRegister);}break; +case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = sizeof(CV_SymDefrangeFramepointerRelFullScope);}break; +case CV_SymKind_DEFRANGE_REGISTER_REL:{result = sizeof(CV_SymDefrangeRegisterRel);}break; +case CV_SymKind_BUILDINFO:{result = sizeof(CV_SymBuildInfo);}break; +case CV_SymKind_INLINESITE:{result = sizeof(CV_SymInlineSite);}break; +case CV_SymKind_FILESTATIC:{result = sizeof(CV_SymFileStatic);}break; +case CV_SymKind_CALLEES:{result = sizeof(CV_SymFunctionList);}break; +case CV_SymKind_CALLERS:{result = sizeof(CV_SymFunctionList);}break; +case CV_SymKind_POGODATA:{result = sizeof(CV_SymPogoInfo);}break; +case CV_SymKind_INLINESITE2:{result = sizeof(CV_SymInlineSite2);}break; +case CV_SymKind_HEAPALLOCSITE:{result = sizeof(CV_SymHeapAllocSite);}break; +case CV_SymKind_MOD_TYPEREF:{result = sizeof(CV_SymModTypeRef);}break; +case CV_SymKind_REF_MINIPDB:{result = sizeof(CV_SymRefMiniPdb);}break; +case CV_SymKind_FASTLINK:{result = sizeof(CV_SymFastLink);}break; +case CV_SymKind_INLINEES:{result = sizeof(CV_SymInlinees);}break; +} +return result; +} +internal U64 +cv_header_struct_size_from_leaf_kind(CV_LeafKind v) +{ +U64 result = 0; +switch(v) +{ +default:{}break; +case CV_LeafKind_VTSHAPE:{result = sizeof(CV_LeafVTShape);}break; +case CV_LeafKind_LABEL:{result = sizeof(CV_LeafLabel);}break; +case CV_LeafKind_MODIFIER:{result = sizeof(CV_LeafModifier);}break; +case CV_LeafKind_POINTER:{result = sizeof(CV_LeafPointer);}break; +case CV_LeafKind_PROCEDURE:{result = sizeof(CV_LeafProcedure);}break; +case CV_LeafKind_MFUNCTION:{result = sizeof(CV_LeafMFunction);}break; +case CV_LeafKind_VFTPATH:{result = sizeof(CV_LeafVFPath);}break; +case CV_LeafKind_SKIP:{result = sizeof(CV_LeafSkip);}break; +case CV_LeafKind_ARGLIST:{result = sizeof(CV_LeafArgList);}break; +case CV_LeafKind_BITFIELD:{result = sizeof(CV_LeafBitField);}break; +case CV_LeafKind_METHODLIST:{result = sizeof(CV_LeafMethodListMember);}break; +case CV_LeafKind_BCLASS:{result = sizeof(CV_LeafBClass);}break; +case CV_LeafKind_VBCLASS:{result = sizeof(CV_LeafVBClass);}break; +case CV_LeafKind_INDEX:{result = sizeof(CV_LeafIndex);}break; +case CV_LeafKind_VFUNCTAB:{result = sizeof(CV_LeafVFuncTab);}break; +case CV_LeafKind_VFUNCOFF:{result = sizeof(CV_LeafVFuncOff);}break; +case CV_LeafKind_TYPESERVER:{result = sizeof(CV_LeafTypeServer);}break; +case CV_LeafKind_ENUMERATE:{result = sizeof(CV_LeafEnumerate);}break; +case CV_LeafKind_ARRAY:{result = sizeof(CV_LeafArray);}break; +case CV_LeafKind_CLASS:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_STRUCTURE:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_UNION:{result = sizeof(CV_LeafUnion);}break; +case CV_LeafKind_ENUM:{result = sizeof(CV_LeafEnum);}break; +case CV_LeafKind_PRECOMP:{result = sizeof(CV_LeafPreComp);}break; +case CV_LeafKind_ALIAS:{result = sizeof(CV_LeafAlias);}break; +case CV_LeafKind_MEMBER:{result = sizeof(CV_LeafMember);}break; +case CV_LeafKind_STMEMBER:{result = sizeof(CV_LeafStMember);}break; +case CV_LeafKind_METHOD:{result = sizeof(CV_LeafMethod);}break; +case CV_LeafKind_NESTTYPE:{result = sizeof(CV_LeafNestType);}break; +case CV_LeafKind_ONEMETHOD:{result = sizeof(CV_LeafOneMethod);}break; +case CV_LeafKind_NESTTYPEEX:{result = sizeof(CV_LeafNestTypeEx);}break; +case CV_LeafKind_TYPESERVER2:{result = sizeof(CV_LeafTypeServer2);}break; +case CV_LeafKind_INTERFACE:{result = sizeof(CV_LeafStruct);}break; +case CV_LeafKind_FUNC_ID:{result = sizeof(CV_LeafFuncId);}break; +case CV_LeafKind_MFUNC_ID:{result = sizeof(CV_LeafMFuncId);}break; +case CV_LeafKind_BUILDINFO:{result = sizeof(CV_LeafBuildInfo);}break; +case CV_LeafKind_SUBSTR_LIST:{result = sizeof(CV_LeafSubstrList);}break; +case CV_LeafKind_STRING_ID:{result = sizeof(CV_LeafStringId);}break; +case CV_LeafKind_UDT_SRC_LINE:{result = sizeof(CV_LeafUDTSrcLine);}break; +case CV_LeafKind_UDT_MOD_SRC_LINE:{result = sizeof(CV_LeafUDTModSrcLine);}break; +case CV_LeafKind_CLASS2:{result = sizeof(CV_LeafStruct2);}break; +case CV_LeafKind_STRUCT2:{result = sizeof(CV_LeafStruct2);}break; +} +return result; +} diff --git a/src/codeview/generated/codeview.meta.h b/src/codeview/generated/codeview.meta.h index 84612e5e..24265ebc 100644 --- a/src/codeview/generated/codeview.meta.h +++ b/src/codeview/generated/codeview.meta.h @@ -1,528 +1,528 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef CODEVIEW_META_H -#define CODEVIEW_META_H - -typedef U16 CV_NumericKind; -typedef enum CV_NumericKindEnum -{ -CV_NumericKind_CHAR = 0x8000, -CV_NumericKind_SHORT = 0x8001, -CV_NumericKind_USHORT = 0x8002, -CV_NumericKind_LONG = 0x8003, -CV_NumericKind_ULONG = 0x8004, -CV_NumericKind_FLOAT32 = 0x8005, -CV_NumericKind_FLOAT64 = 0x8006, -CV_NumericKind_FLOAT80 = 0x8007, -CV_NumericKind_FLOAT128 = 0x8008, -CV_NumericKind_QUADWORD = 0x8009, -CV_NumericKind_UQUADWORD = 0x800a, -CV_NumericKind_FLOAT48 = 0x800b, -CV_NumericKind_COMPLEX32 = 0x800c, -CV_NumericKind_COMPLEX64 = 0x800d, -CV_NumericKind_COMPLEX80 = 0x800e, -CV_NumericKind_COMPLEX128 = 0x800f, -CV_NumericKind_VARSTRING = 0x8010, -CV_NumericKind_OCTWORD = 0x8017, -CV_NumericKind_UOCTWORD = 0x8018, -CV_NumericKind_DECIMAL = 0x8019, -CV_NumericKind_DATE = 0x801a, -CV_NumericKind_UTF8STRING = 0x801b, -CV_NumericKind_FLOAT16 = 0x801c, -} CV_NumericKindEnum; - -typedef U16 CV_Arch; -typedef enum CV_ArchEnum -{ -CV_Arch_8080 = 0x00, -CV_Arch_8086 = 0x01, -CV_Arch_80286 = 0x02, -CV_Arch_80386 = 0x03, -CV_Arch_80486 = 0x04, -CV_Arch_PENTIUM = 0x05, -CV_Arch_PENTIUMII = 0x06, -CV_Arch_PENTIUMIII = 0x07, -CV_Arch_MIPS = 0x10, -CV_Arch_MIPS16 = 0x11, -CV_Arch_MIPS32 = 0x12, -CV_Arch_MIPS64 = 0x13, -CV_Arch_MIPSI = 0x14, -CV_Arch_MIPSII = 0x15, -CV_Arch_MIPSIII = 0x16, -CV_Arch_MIPSIV = 0x17, -CV_Arch_MIPSV = 0x18, -CV_Arch_M68000 = 0x20, -CV_Arch_M68010 = 0x21, -CV_Arch_M68020 = 0x22, -CV_Arch_M68030 = 0x23, -CV_Arch_M68040 = 0x24, -CV_Arch_ALPHA = 0x30, -CV_Arch_ALPHA_21164 = 0x31, -CV_Arch_ALPHA_21164A = 0x32, -CV_Arch_ALPHA_21264 = 0x33, -CV_Arch_ALPHA_21364 = 0x34, -CV_Arch_PPC601 = 0x40, -CV_Arch_PPC603 = 0x41, -CV_Arch_PPC604 = 0x42, -CV_Arch_PPC620 = 0x43, -CV_Arch_PPCFP = 0x44, -CV_Arch_PPCBE = 0x45, -CV_Arch_SH3 = 0x50, -CV_Arch_SH3E = 0x51, -CV_Arch_SH3DSP = 0x52, -CV_Arch_SH4 = 0x53, -CV_Arch_SHMEDIA = 0x54, -CV_Arch_ARM3 = 0x60, -CV_Arch_ARM4 = 0x61, -CV_Arch_ARM4T = 0x62, -CV_Arch_ARM5 = 0x63, -CV_Arch_ARM5T = 0x64, -CV_Arch_ARM6 = 0x65, -CV_Arch_ARM_XMAC = 0x66, -CV_Arch_ARM_WMMX = 0x67, -CV_Arch_ARM7 = 0x68, -CV_Arch_OMNI = 0x70, -CV_Arch_IA64_1 = 0x80, -CV_Arch_IA64_2 = 0x81, -CV_Arch_CEE = 0x90, -CV_Arch_AM33 = 0xA0, -CV_Arch_M32R = 0xB0, -CV_Arch_TRICORE = 0xC0, -CV_Arch_X64 = 0xD0, -CV_Arch_EBC = 0xE0, -CV_Arch_THUMB = 0xF0, -CV_Arch_ARMNT = 0xF4, -CV_Arch_ARM64 = 0xF6, -CV_Arch_D3D11_SHADER = 0x100, -CV_Arch_IA64 = CV_Arch_IA64_1, -CV_Arch_PENTIUMPRO = CV_Arch_PENTIUMII, -CV_Arch_MIPSR4000 = CV_Arch_MIPS, -CV_Arch_ALPHA_21064 = CV_Arch_ALPHA, -CV_Arch_AMD64 = CV_Arch_X64, -} CV_ArchEnum; - -typedef U16 CV_AllReg; -typedef enum CV_AllRegEnum -{ -CV_AllReg_ERR = 30000, -CV_AllReg_TEB = 30001, -CV_AllReg_TIMER = 30002, -CV_AllReg_EFAD1 = 30003, -CV_AllReg_EFAD2 = 30004, -CV_AllReg_EFAD3 = 30005, -CV_AllReg_VFRAME = 30006, -CV_AllReg_HANDLE = 30007, -CV_AllReg_PARAMS = 30008, -CV_AllReg_LOCALS = 30009, -CV_AllReg_TID = 30010, -CV_AllReg_ENV = 30011, -CV_AllReg_CMDLN = 30012, -} CV_AllRegEnum; - -typedef U16 CV_SymKind; -typedef enum CV_SymKindEnum -{ -CV_SymKind_COMPILE = 0x0001, -CV_SymKind_REGISTER_16t = 0x0002, -CV_SymKind_CONSTANT_16t = 0x0003, -CV_SymKind_UDT_16t = 0x0004, -CV_SymKind_SSEARCH = 0x0005, -CV_SymKind_END = 0x0006, -CV_SymKind_SKIP = 0x0007, -CV_SymKind_CVRESERVE = 0x0008, -CV_SymKind_OBJNAME_ST = 0x0009, -CV_SymKind_ENDARG = 0x000a, -CV_SymKind_COBOLUDT_16t = 0x000b, -CV_SymKind_MANYREG_16t = 0x000c, -CV_SymKind_RETURN = 0x000d, -CV_SymKind_ENTRYTHIS = 0x000e, -CV_SymKind_BPREL16 = 0x0100, -CV_SymKind_LDATA16 = 0x0101, -CV_SymKind_GDATA16 = 0x0102, -CV_SymKind_PUB16 = 0x0103, -CV_SymKind_LPROC16 = 0x0104, -CV_SymKind_GPROC16 = 0x0105, -CV_SymKind_THUNK16 = 0x0106, -CV_SymKind_BLOCK16 = 0x0107, -CV_SymKind_WITH16 = 0x0108, -CV_SymKind_LABEL16 = 0x0109, -CV_SymKind_CEXMODEL16 = 0x010a, -CV_SymKind_VFTABLE16 = 0x010b, -CV_SymKind_REGREL16 = 0x010c, -CV_SymKind_BPREL32_16t = 0x0200, -CV_SymKind_LDATA32_16t = 0x0201, -CV_SymKind_GDATA32_16t = 0x0202, -CV_SymKind_PUB32_16t = 0x0203, -CV_SymKind_LPROC32_16t = 0x0204, -CV_SymKind_GPROC32_16t = 0x0205, -CV_SymKind_THUNK32_ST = 0x0206, -CV_SymKind_BLOCK32_ST = 0x0207, -CV_SymKind_WITH32_ST = 0x0208, -CV_SymKind_LABEL32_ST = 0x0209, -CV_SymKind_CEXMODEL32 = 0x020a, -CV_SymKind_VFTABLE32_16t = 0x020b, -CV_SymKind_REGREL32_16t = 0x020c, -CV_SymKind_LTHREAD32_16t = 0x020d, -CV_SymKind_GTHREAD32_16t = 0x020e, -CV_SymKind_SLINK32 = 0x020f, -CV_SymKind_LPROCMIPS_16t = 0x0300, -CV_SymKind_GPROCMIPS_16t = 0x0301, -CV_SymKind_PROCREF_ST = 0x0400, -CV_SymKind_DATAREF_ST = 0x0401, -CV_SymKind_ALIGN = 0x0402, -CV_SymKind_LPROCREF_ST = 0x0403, -CV_SymKind_OEM = 0x0404, -CV_SymKind_TI16_MAX = 0x1000, -CV_SymKind_CONSTANT_ST = 0x1002, -CV_SymKind_UDT_ST = 0x1003, -CV_SymKind_COBOLUDT_ST = 0x1004, -CV_SymKind_MANYREG_ST = 0x1005, -CV_SymKind_BPREL32_ST = 0x1006, -CV_SymKind_LDATA32_ST = 0x1007, -CV_SymKind_GDATA32_ST = 0x1008, -CV_SymKind_PUB32_ST = 0x1009, -CV_SymKind_LPROC32_ST = 0x100a, -CV_SymKind_GPROC32_ST = 0x100b, -CV_SymKind_VFTABLE32 = 0x100c, -CV_SymKind_REGREL32_ST = 0x100d, -CV_SymKind_LTHREAD32_ST = 0x100e, -CV_SymKind_GTHREAD32_ST = 0x100f, -CV_SymKind_LPROCMIPS_ST = 0x1010, -CV_SymKind_GPROCMIPS_ST = 0x1011, -CV_SymKind_FRAMEPROC = 0x1012, -CV_SymKind_COMPILE2_ST = 0x1013, -CV_SymKind_MANYREG2_ST = 0x1014, -CV_SymKind_LPROCIA64_ST = 0x1015, -CV_SymKind_GPROCIA64_ST = 0x1016, -CV_SymKind_LOCALSLOT_ST = 0x1017, -CV_SymKind_PARAMSLOT_ST = 0x1018, -CV_SymKind_ANNOTATION = 0x1019, -CV_SymKind_GMANPROC_ST = 0x101a, -CV_SymKind_LMANPROC_ST = 0x101b, -CV_SymKind_RESERVED1 = 0x101c, -CV_SymKind_RESERVED2 = 0x101d, -CV_SymKind_RESERVED3 = 0x101e, -CV_SymKind_RESERVED4 = 0x101f, -CV_SymKind_LMANDATA_ST = 0x1020, -CV_SymKind_GMANDATA_ST = 0x1021, -CV_SymKind_MANFRAMEREL_ST = 0x1022, -CV_SymKind_MANREGISTER_ST = 0x1023, -CV_SymKind_MANSLOT_ST = 0x1024, -CV_SymKind_MANMANYREG_ST = 0x1025, -CV_SymKind_MANREGREL_ST = 0x1026, -CV_SymKind_MANMANYREG2_ST = 0x1027, -CV_SymKind_MANTYPREF = 0x1028, -CV_SymKind_UNAMESPACE_ST = 0x1029, -CV_SymKind_ST_MAX = 0x1100, -CV_SymKind_OBJNAME = 0x1101, -CV_SymKind_THUNK32 = 0x1102, -CV_SymKind_BLOCK32 = 0x1103, -CV_SymKind_WITH32 = 0x1104, -CV_SymKind_LABEL32 = 0x1105, -CV_SymKind_REGISTER = 0x1106, -CV_SymKind_CONSTANT = 0x1107, -CV_SymKind_UDT = 0x1108, -CV_SymKind_COBOLUDT = 0x1109, -CV_SymKind_MANYREG = 0x110a, -CV_SymKind_BPREL32 = 0x110b, -CV_SymKind_LDATA32 = 0x110c, -CV_SymKind_GDATA32 = 0x110d, -CV_SymKind_PUB32 = 0x110e, -CV_SymKind_LPROC32 = 0x110f, -CV_SymKind_GPROC32 = 0x1110, -CV_SymKind_REGREL32 = 0x1111, -CV_SymKind_LTHREAD32 = 0x1112, -CV_SymKind_GTHREAD32 = 0x1113, -CV_SymKind_LPROCMIPS = 0x1114, -CV_SymKind_GPROCMIPS = 0x1115, -CV_SymKind_COMPILE2 = 0x1116, -CV_SymKind_MANYREG2 = 0x1117, -CV_SymKind_LPROCIA64 = 0x1118, -CV_SymKind_GPROCIA64 = 0x1119, -CV_SymKind_LOCALSLOT = 0x111a, -CV_SymKind_PARAMSLOT = 0x111b, -CV_SymKind_LMANDATA = 0x111c, -CV_SymKind_GMANDATA = 0x111d, -CV_SymKind_MANFRAMEREL = 0x111e, -CV_SymKind_MANREGISTER = 0x111f, -CV_SymKind_MANSLOT = 0x1120, -CV_SymKind_MANMANYREG = 0x1121, -CV_SymKind_MANREGREL = 0x1122, -CV_SymKind_MANMANYREG2 = 0x1123, -CV_SymKind_UNAMESPACE = 0x1124, -CV_SymKind_PROCREF = 0x1125, -CV_SymKind_DATAREF = 0x1126, -CV_SymKind_LPROCREF = 0x1127, -CV_SymKind_ANNOTATIONREF = 0x1128, -CV_SymKind_TOKENREF = 0x1129, -CV_SymKind_GMANPROC = 0x112a, -CV_SymKind_LMANPROC = 0x112b, -CV_SymKind_TRAMPOLINE = 0x112c, -CV_SymKind_MANCONSTANT = 0x112d, -CV_SymKind_ATTR_FRAMEREL = 0x112e, -CV_SymKind_ATTR_REGISTER = 0x112f, -CV_SymKind_ATTR_REGREL = 0x1130, -CV_SymKind_ATTR_MANYREG = 0x1131, -CV_SymKind_SEPCODE = 0x1132, -CV_SymKind_DEFRANGE_2005 = 0x1134, -CV_SymKind_DEFRANGE2_2005 = 0x1135, -CV_SymKind_SECTION = 0x1136, -CV_SymKind_COFFGROUP = 0x1137, -CV_SymKind_EXPORT = 0x1138, -CV_SymKind_CALLSITEINFO = 0x1139, -CV_SymKind_FRAMECOOKIE = 0x113a, -CV_SymKind_DISCARDED = 0x113b, -CV_SymKind_COMPILE3 = 0x113c, -CV_SymKind_ENVBLOCK = 0x113d, -CV_SymKind_LOCAL = 0x113e, -CV_SymKind_DEFRANGE = 0x113f, -CV_SymKind_DEFRANGE_SUBFIELD = 0x1140, -CV_SymKind_DEFRANGE_REGISTER = 0x1141, -CV_SymKind_DEFRANGE_FRAMEPOINTER_REL = 0x1142, -CV_SymKind_DEFRANGE_SUBFIELD_REGISTER = 0x1143, -CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE = 0x1144, -CV_SymKind_DEFRANGE_REGISTER_REL = 0x1145, -CV_SymKind_LPROC32_ID = 0x1146, -CV_SymKind_GPROC32_ID = 0x1147, -CV_SymKind_LPROCMIPS_ID = 0x1148, -CV_SymKind_GPROCMIPS_ID = 0x1149, -CV_SymKind_LPROCIA64_ID = 0x114a, -CV_SymKind_GPROCIA64_ID = 0x114b, -CV_SymKind_BUILDINFO = 0x114c, -CV_SymKind_INLINESITE = 0x114d, -CV_SymKind_INLINESITE_END = 0x114e, -CV_SymKind_PROC_ID_END = 0x114f, -CV_SymKind_DEFRANGE_HLSL = 0x1150, -CV_SymKind_GDATA_HLSL = 0x1151, -CV_SymKind_LDATA_HLSL = 0x1152, -CV_SymKind_FILESTATIC = 0x1153, -CV_SymKind_LPROC32_DPC = 0x1155, -CV_SymKind_LPROC32_DPC_ID = 0x1156, -CV_SymKind_DEFRANGE_DPC_PTR_TAG = 0x1157, -CV_SymKind_DPC_SYM_TAG_MAP = 0x1158, -CV_SymKind_ARMSWITCHTABLE = 0x1159, -CV_SymKind_CALLEES = 0x115a, -CV_SymKind_CALLERS = 0x115b, -CV_SymKind_POGODATA = 0x115c, -CV_SymKind_INLINESITE2 = 0x115d, -CV_SymKind_HEAPALLOCSITE = 0x115e, -CV_SymKind_MOD_TYPEREF = 0x115f, -CV_SymKind_REF_MINIPDB = 0x1160, -CV_SymKind_PDBMAP = 0x1161, -CV_SymKind_GDATA_HLSL32 = 0x1162, -CV_SymKind_LDATA_HLSL32 = 0x1163, -CV_SymKind_GDATA_HLSL32_EX = 0x1164, -CV_SymKind_LDATA_HLSL32_EX = 0x1165, -CV_SymKind_FASTLINK = 0x1167, -CV_SymKind_INLINEES = 0x1168, -} CV_SymKindEnum; - -typedef U8 CV_BasicType; -typedef enum CV_BasicTypeEnum -{ -CV_BasicType_NOTYPE = 0x00, -CV_BasicType_ABS = 0x01, -CV_BasicType_SEGMENT = 0x02, -CV_BasicType_VOID = 0x03, -CV_BasicType_CURRENCY = 0x04, -CV_BasicType_NBASICSTR = 0x05, -CV_BasicType_FBASICSTR = 0x06, -CV_BasicType_NOTTRANS = 0x07, -CV_BasicType_HRESULT = 0x08, -CV_BasicType_CHAR = 0x10, -CV_BasicType_SHORT = 0x11, -CV_BasicType_LONG = 0x12, -CV_BasicType_QUAD = 0x13, -CV_BasicType_OCT = 0x14, -CV_BasicType_UCHAR = 0x20, -CV_BasicType_USHORT = 0x21, -CV_BasicType_ULONG = 0x22, -CV_BasicType_UQUAD = 0x23, -CV_BasicType_UOCT = 0x24, -CV_BasicType_BOOL8 = 0x30, -CV_BasicType_BOOL16 = 0x31, -CV_BasicType_BOOL32 = 0x32, -CV_BasicType_BOOL64 = 0x33, -CV_BasicType_FLOAT32 = 0x40, -CV_BasicType_FLOAT64 = 0x41, -CV_BasicType_FLOAT80 = 0x42, -CV_BasicType_FLOAT128 = 0x43, -CV_BasicType_FLOAT48 = 0x44, -CV_BasicType_FLOAT32PP = 0x45, -CV_BasicType_FLOAT16 = 0x46, -CV_BasicType_COMPLEX32 = 0x50, -CV_BasicType_COMPLEX64 = 0x51, -CV_BasicType_COMPLEX80 = 0x52, -CV_BasicType_COMPLEX128 = 0x53, -CV_BasicType_BIT = 0x60, -CV_BasicType_PASCHAR = 0x61, -CV_BasicType_BOOL32FF = 0x62, -CV_BasicType_INT8 = 0x68, -CV_BasicType_UINT8 = 0x69, -CV_BasicType_RCHAR = 0x70, -CV_BasicType_WCHAR = 0x71, -CV_BasicType_INT16 = 0x72, -CV_BasicType_UINT16 = 0x73, -CV_BasicType_INT32 = 0x74, -CV_BasicType_UINT32 = 0x75, -CV_BasicType_INT64 = 0x76, -CV_BasicType_UINT64 = 0x77, -CV_BasicType_INT128 = 0x78, -CV_BasicType_UINT128 = 0x79, -CV_BasicType_CHAR16 = 0x7a, -CV_BasicType_CHAR32 = 0x7b, -CV_BasicType_CHAR8 = 0x7c, -CV_BasicType_PTR = 0xf0, -} CV_BasicTypeEnum; - -typedef U16 CV_LeafKind; -typedef enum CV_LeafKindEnum -{ -CV_LeafKind_NOTYPE = 0x0000, -CV_LeafKind_MODIFIER_16t = 0x0001, -CV_LeafKind_POINTER_16t = 0x0002, -CV_LeafKind_ARRAY_16t = 0x0003, -CV_LeafKind_CLASS_16t = 0x0004, -CV_LeafKind_STRUCTURE_16t = 0x0005, -CV_LeafKind_UNION_16t = 0x0006, -CV_LeafKind_ENUM_16t = 0x0007, -CV_LeafKind_PROCEDURE_16t = 0x0008, -CV_LeafKind_MFUNCTION_16t = 0x0009, -CV_LeafKind_VTSHAPE = 0x000a, -CV_LeafKind_COBOL0_16t = 0x000b, -CV_LeafKind_COBOL1 = 0x000c, -CV_LeafKind_BARRAY_16t = 0x000d, -CV_LeafKind_LABEL = 0x000e, -CV_LeafKind_NULL = 0x000f, -CV_LeafKind_NOTTRAN = 0x0010, -CV_LeafKind_DIMARRAY_16t = 0x0011, -CV_LeafKind_VFTPATH_16t = 0x0012, -CV_LeafKind_PRECOMP_16t = 0x0013, -CV_LeafKind_ENDPRECOMP = 0x0014, -CV_LeafKind_OEM_16t = 0x0015, -CV_LeafKind_TYPESERVER_ST = 0x0016, -CV_LeafKind_SKIP_16t = 0x0200, -CV_LeafKind_ARGLIST_16t = 0x0201, -CV_LeafKind_DEFARG_16t = 0x0202, -CV_LeafKind_LIST = 0x0203, -CV_LeafKind_FIELDLIST_16t = 0x0204, -CV_LeafKind_DERIVED_16t = 0x0205, -CV_LeafKind_BITFIELD_16t = 0x0206, -CV_LeafKind_METHODLIST_16t = 0x0207, -CV_LeafKind_DIMCONU_16t = 0x0208, -CV_LeafKind_DIMCONLU_16t = 0x0209, -CV_LeafKind_DIMVARU_16t = 0x020a, -CV_LeafKind_DIMVARLU_16t = 0x020b, -CV_LeafKind_REFSYM = 0x020c, -CV_LeafKind_BCLASS_16t = 0x0400, -CV_LeafKind_VBCLASS_16t = 0x0401, -CV_LeafKind_IVBCLASS_16t = 0x0402, -CV_LeafKind_ENUMERATE_ST = 0x0403, -CV_LeafKind_FRIENDFCN_16t = 0x0404, -CV_LeafKind_INDEX_16t = 0x0405, -CV_LeafKind_MEMBER_16t = 0x0406, -CV_LeafKind_STMEMBER_16t = 0x0407, -CV_LeafKind_METHOD_16t = 0x0408, -CV_LeafKind_NESTTYPE_16t = 0x0409, -CV_LeafKind_VFUNCTAB_16t = 0x040a, -CV_LeafKind_FRIENDCLS_16t = 0x040b, -CV_LeafKind_ONEMETHOD_16t = 0x040c, -CV_LeafKind_VFUNCOFF_16t = 0x040d, -CV_LeafKind_TI16_MAX = 0x1000, -CV_LeafKind_MODIFIER = 0x1001, -CV_LeafKind_POINTER = 0x1002, -CV_LeafKind_ARRAY_ST = 0x1003, -CV_LeafKind_CLASS_ST = 0x1004, -CV_LeafKind_STRUCTURE_ST = 0x1005, -CV_LeafKind_UNION_ST = 0x1006, -CV_LeafKind_ENUM_ST = 0x1007, -CV_LeafKind_PROCEDURE = 0x1008, -CV_LeafKind_MFUNCTION = 0x1009, -CV_LeafKind_COBOL0 = 0x100a, -CV_LeafKind_BARRAY = 0x100b, -CV_LeafKind_DIMARRAY_ST = 0x100c, -CV_LeafKind_VFTPATH = 0x100d, -CV_LeafKind_PRECOMP_ST = 0x100e, -CV_LeafKind_OEM = 0x100f, -CV_LeafKind_ALIAS_ST = 0x1010, -CV_LeafKind_OEM2 = 0x1011, -CV_LeafKind_SKIP = 0x1200, -CV_LeafKind_ARGLIST = 0x1201, -CV_LeafKind_DEFARG_ST = 0x1202, -CV_LeafKind_FIELDLIST = 0x1203, -CV_LeafKind_DERIVED = 0x1204, -CV_LeafKind_BITFIELD = 0x1205, -CV_LeafKind_METHODLIST = 0x1206, -CV_LeafKind_DIMCONU = 0x1207, -CV_LeafKind_DIMCONLU = 0x1208, -CV_LeafKind_DIMVARU = 0x1209, -CV_LeafKind_DIMVARLU = 0x120a, -CV_LeafKind_BCLASS = 0x1400, -CV_LeafKind_VBCLASS = 0x1401, -CV_LeafKind_IVBCLASS = 0x1402, -CV_LeafKind_FRIENDFCN_ST = 0x1403, -CV_LeafKind_INDEX = 0x1404, -CV_LeafKind_MEMBER_ST = 0x1405, -CV_LeafKind_STMEMBER_ST = 0x1406, -CV_LeafKind_METHOD_ST = 0x1407, -CV_LeafKind_NESTTYPE_ST = 0x1408, -CV_LeafKind_VFUNCTAB = 0x1409, -CV_LeafKind_FRIENDCLS = 0x140a, -CV_LeafKind_ONEMETHOD_ST = 0x140b, -CV_LeafKind_VFUNCOFF = 0x140c, -CV_LeafKind_NESTTYPEEX_ST = 0x140d, -CV_LeafKind_MEMBERMODIFY_ST = 0x140e, -CV_LeafKind_MANAGED_ST = 0x140f, -CV_LeafKind_ST_MAX = 0x1500, -CV_LeafKind_TYPESERVER = 0x1501, -CV_LeafKind_ENUMERATE = 0x1502, -CV_LeafKind_ARRAY = 0x1503, -CV_LeafKind_CLASS = 0x1504, -CV_LeafKind_STRUCTURE = 0x1505, -CV_LeafKind_UNION = 0x1506, -CV_LeafKind_ENUM = 0x1507, -CV_LeafKind_DIMARRAY = 0x1508, -CV_LeafKind_PRECOMP = 0x1509, -CV_LeafKind_ALIAS = 0x150a, -CV_LeafKind_DEFARG = 0x150b, -CV_LeafKind_FRIENDFCN = 0x150c, -CV_LeafKind_MEMBER = 0x150d, -CV_LeafKind_STMEMBER = 0x150e, -CV_LeafKind_METHOD = 0x150f, -CV_LeafKind_NESTTYPE = 0x1510, -CV_LeafKind_ONEMETHOD = 0x1511, -CV_LeafKind_NESTTYPEEX = 0x1512, -CV_LeafKind_MEMBERMODIFY = 0x1513, -CV_LeafKind_MANAGED = 0x1514, -CV_LeafKind_TYPESERVER2 = 0x1515, -CV_LeafKind_STRIDED_ARRAY = 0x1516, -CV_LeafKind_HLSL = 0x1517, -CV_LeafKind_MODIFIER_EX = 0x1518, -CV_LeafKind_INTERFACE = 0x1519, -CV_LeafKind_BINTERFACE = 0x151a, -CV_LeafKind_VECTOR = 0x151b, -CV_LeafKind_MATRIX = 0x151c, -CV_LeafKind_VFTABLE = 0x151d, -CV_LeafKind_FUNC_ID = 0x1601, -CV_LeafKind_MFUNC_ID = 0x1602, -CV_LeafKind_BUILDINFO = 0x1603, -CV_LeafKind_SUBSTR_LIST = 0x1604, -CV_LeafKind_STRING_ID = 0x1605, -CV_LeafKind_UDT_SRC_LINE = 0x1606, -CV_LeafKind_UDT_MOD_SRC_LINE = 0x1607, -CV_LeafKind_CLASS2 = 0x1608, -CV_LeafKind_STRUCT2 = 0x1609, -} CV_LeafKindEnum; - -internal String8 cv_string_from_numeric_kind(CV_NumericKind v); -internal String8 cv_string_from_arch(CV_Arch v); -internal String8 cv_string_from_sym_kind(CV_SymKind v); -internal String8 cv_string_from_basic_type(CV_BasicType v); -internal String8 cv_type_name_from_basic_type(CV_BasicType v); -internal String8 cv_string_from_leaf_kind(CV_LeafKind v); -internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v); -internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v); -#endif // CODEVIEW_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef CODEVIEW_META_H +#define CODEVIEW_META_H + +typedef U16 CV_NumericKind; +typedef enum CV_NumericKindEnum +{ +CV_NumericKind_CHAR = 0x8000, +CV_NumericKind_SHORT = 0x8001, +CV_NumericKind_USHORT = 0x8002, +CV_NumericKind_LONG = 0x8003, +CV_NumericKind_ULONG = 0x8004, +CV_NumericKind_FLOAT32 = 0x8005, +CV_NumericKind_FLOAT64 = 0x8006, +CV_NumericKind_FLOAT80 = 0x8007, +CV_NumericKind_FLOAT128 = 0x8008, +CV_NumericKind_QUADWORD = 0x8009, +CV_NumericKind_UQUADWORD = 0x800a, +CV_NumericKind_FLOAT48 = 0x800b, +CV_NumericKind_COMPLEX32 = 0x800c, +CV_NumericKind_COMPLEX64 = 0x800d, +CV_NumericKind_COMPLEX80 = 0x800e, +CV_NumericKind_COMPLEX128 = 0x800f, +CV_NumericKind_VARSTRING = 0x8010, +CV_NumericKind_OCTWORD = 0x8017, +CV_NumericKind_UOCTWORD = 0x8018, +CV_NumericKind_DECIMAL = 0x8019, +CV_NumericKind_DATE = 0x801a, +CV_NumericKind_UTF8STRING = 0x801b, +CV_NumericKind_FLOAT16 = 0x801c, +} CV_NumericKindEnum; + +typedef U16 CV_Arch; +typedef enum CV_ArchEnum +{ +CV_Arch_8080 = 0x00, +CV_Arch_8086 = 0x01, +CV_Arch_80286 = 0x02, +CV_Arch_80386 = 0x03, +CV_Arch_80486 = 0x04, +CV_Arch_PENTIUM = 0x05, +CV_Arch_PENTIUMII = 0x06, +CV_Arch_PENTIUMIII = 0x07, +CV_Arch_MIPS = 0x10, +CV_Arch_MIPS16 = 0x11, +CV_Arch_MIPS32 = 0x12, +CV_Arch_MIPS64 = 0x13, +CV_Arch_MIPSI = 0x14, +CV_Arch_MIPSII = 0x15, +CV_Arch_MIPSIII = 0x16, +CV_Arch_MIPSIV = 0x17, +CV_Arch_MIPSV = 0x18, +CV_Arch_M68000 = 0x20, +CV_Arch_M68010 = 0x21, +CV_Arch_M68020 = 0x22, +CV_Arch_M68030 = 0x23, +CV_Arch_M68040 = 0x24, +CV_Arch_ALPHA = 0x30, +CV_Arch_ALPHA_21164 = 0x31, +CV_Arch_ALPHA_21164A = 0x32, +CV_Arch_ALPHA_21264 = 0x33, +CV_Arch_ALPHA_21364 = 0x34, +CV_Arch_PPC601 = 0x40, +CV_Arch_PPC603 = 0x41, +CV_Arch_PPC604 = 0x42, +CV_Arch_PPC620 = 0x43, +CV_Arch_PPCFP = 0x44, +CV_Arch_PPCBE = 0x45, +CV_Arch_SH3 = 0x50, +CV_Arch_SH3E = 0x51, +CV_Arch_SH3DSP = 0x52, +CV_Arch_SH4 = 0x53, +CV_Arch_SHMEDIA = 0x54, +CV_Arch_ARM3 = 0x60, +CV_Arch_ARM4 = 0x61, +CV_Arch_ARM4T = 0x62, +CV_Arch_ARM5 = 0x63, +CV_Arch_ARM5T = 0x64, +CV_Arch_ARM6 = 0x65, +CV_Arch_ARM_XMAC = 0x66, +CV_Arch_ARM_WMMX = 0x67, +CV_Arch_ARM7 = 0x68, +CV_Arch_OMNI = 0x70, +CV_Arch_IA64_1 = 0x80, +CV_Arch_IA64_2 = 0x81, +CV_Arch_CEE = 0x90, +CV_Arch_AM33 = 0xA0, +CV_Arch_M32R = 0xB0, +CV_Arch_TRICORE = 0xC0, +CV_Arch_X64 = 0xD0, +CV_Arch_EBC = 0xE0, +CV_Arch_THUMB = 0xF0, +CV_Arch_ARMNT = 0xF4, +CV_Arch_ARM64 = 0xF6, +CV_Arch_D3D11_SHADER = 0x100, +CV_Arch_IA64 = CV_Arch_IA64_1, +CV_Arch_PENTIUMPRO = CV_Arch_PENTIUMII, +CV_Arch_MIPSR4000 = CV_Arch_MIPS, +CV_Arch_ALPHA_21064 = CV_Arch_ALPHA, +CV_Arch_AMD64 = CV_Arch_X64, +} CV_ArchEnum; + +typedef U16 CV_AllReg; +typedef enum CV_AllRegEnum +{ +CV_AllReg_ERR = 30000, +CV_AllReg_TEB = 30001, +CV_AllReg_TIMER = 30002, +CV_AllReg_EFAD1 = 30003, +CV_AllReg_EFAD2 = 30004, +CV_AllReg_EFAD3 = 30005, +CV_AllReg_VFRAME = 30006, +CV_AllReg_HANDLE = 30007, +CV_AllReg_PARAMS = 30008, +CV_AllReg_LOCALS = 30009, +CV_AllReg_TID = 30010, +CV_AllReg_ENV = 30011, +CV_AllReg_CMDLN = 30012, +} CV_AllRegEnum; + +typedef U16 CV_SymKind; +typedef enum CV_SymKindEnum +{ +CV_SymKind_COMPILE = 0x0001, +CV_SymKind_REGISTER_16t = 0x0002, +CV_SymKind_CONSTANT_16t = 0x0003, +CV_SymKind_UDT_16t = 0x0004, +CV_SymKind_SSEARCH = 0x0005, +CV_SymKind_END = 0x0006, +CV_SymKind_SKIP = 0x0007, +CV_SymKind_CVRESERVE = 0x0008, +CV_SymKind_OBJNAME_ST = 0x0009, +CV_SymKind_ENDARG = 0x000a, +CV_SymKind_COBOLUDT_16t = 0x000b, +CV_SymKind_MANYREG_16t = 0x000c, +CV_SymKind_RETURN = 0x000d, +CV_SymKind_ENTRYTHIS = 0x000e, +CV_SymKind_BPREL16 = 0x0100, +CV_SymKind_LDATA16 = 0x0101, +CV_SymKind_GDATA16 = 0x0102, +CV_SymKind_PUB16 = 0x0103, +CV_SymKind_LPROC16 = 0x0104, +CV_SymKind_GPROC16 = 0x0105, +CV_SymKind_THUNK16 = 0x0106, +CV_SymKind_BLOCK16 = 0x0107, +CV_SymKind_WITH16 = 0x0108, +CV_SymKind_LABEL16 = 0x0109, +CV_SymKind_CEXMODEL16 = 0x010a, +CV_SymKind_VFTABLE16 = 0x010b, +CV_SymKind_REGREL16 = 0x010c, +CV_SymKind_BPREL32_16t = 0x0200, +CV_SymKind_LDATA32_16t = 0x0201, +CV_SymKind_GDATA32_16t = 0x0202, +CV_SymKind_PUB32_16t = 0x0203, +CV_SymKind_LPROC32_16t = 0x0204, +CV_SymKind_GPROC32_16t = 0x0205, +CV_SymKind_THUNK32_ST = 0x0206, +CV_SymKind_BLOCK32_ST = 0x0207, +CV_SymKind_WITH32_ST = 0x0208, +CV_SymKind_LABEL32_ST = 0x0209, +CV_SymKind_CEXMODEL32 = 0x020a, +CV_SymKind_VFTABLE32_16t = 0x020b, +CV_SymKind_REGREL32_16t = 0x020c, +CV_SymKind_LTHREAD32_16t = 0x020d, +CV_SymKind_GTHREAD32_16t = 0x020e, +CV_SymKind_SLINK32 = 0x020f, +CV_SymKind_LPROCMIPS_16t = 0x0300, +CV_SymKind_GPROCMIPS_16t = 0x0301, +CV_SymKind_PROCREF_ST = 0x0400, +CV_SymKind_DATAREF_ST = 0x0401, +CV_SymKind_ALIGN = 0x0402, +CV_SymKind_LPROCREF_ST = 0x0403, +CV_SymKind_OEM = 0x0404, +CV_SymKind_TI16_MAX = 0x1000, +CV_SymKind_CONSTANT_ST = 0x1002, +CV_SymKind_UDT_ST = 0x1003, +CV_SymKind_COBOLUDT_ST = 0x1004, +CV_SymKind_MANYREG_ST = 0x1005, +CV_SymKind_BPREL32_ST = 0x1006, +CV_SymKind_LDATA32_ST = 0x1007, +CV_SymKind_GDATA32_ST = 0x1008, +CV_SymKind_PUB32_ST = 0x1009, +CV_SymKind_LPROC32_ST = 0x100a, +CV_SymKind_GPROC32_ST = 0x100b, +CV_SymKind_VFTABLE32 = 0x100c, +CV_SymKind_REGREL32_ST = 0x100d, +CV_SymKind_LTHREAD32_ST = 0x100e, +CV_SymKind_GTHREAD32_ST = 0x100f, +CV_SymKind_LPROCMIPS_ST = 0x1010, +CV_SymKind_GPROCMIPS_ST = 0x1011, +CV_SymKind_FRAMEPROC = 0x1012, +CV_SymKind_COMPILE2_ST = 0x1013, +CV_SymKind_MANYREG2_ST = 0x1014, +CV_SymKind_LPROCIA64_ST = 0x1015, +CV_SymKind_GPROCIA64_ST = 0x1016, +CV_SymKind_LOCALSLOT_ST = 0x1017, +CV_SymKind_PARAMSLOT_ST = 0x1018, +CV_SymKind_ANNOTATION = 0x1019, +CV_SymKind_GMANPROC_ST = 0x101a, +CV_SymKind_LMANPROC_ST = 0x101b, +CV_SymKind_RESERVED1 = 0x101c, +CV_SymKind_RESERVED2 = 0x101d, +CV_SymKind_RESERVED3 = 0x101e, +CV_SymKind_RESERVED4 = 0x101f, +CV_SymKind_LMANDATA_ST = 0x1020, +CV_SymKind_GMANDATA_ST = 0x1021, +CV_SymKind_MANFRAMEREL_ST = 0x1022, +CV_SymKind_MANREGISTER_ST = 0x1023, +CV_SymKind_MANSLOT_ST = 0x1024, +CV_SymKind_MANMANYREG_ST = 0x1025, +CV_SymKind_MANREGREL_ST = 0x1026, +CV_SymKind_MANMANYREG2_ST = 0x1027, +CV_SymKind_MANTYPREF = 0x1028, +CV_SymKind_UNAMESPACE_ST = 0x1029, +CV_SymKind_ST_MAX = 0x1100, +CV_SymKind_OBJNAME = 0x1101, +CV_SymKind_THUNK32 = 0x1102, +CV_SymKind_BLOCK32 = 0x1103, +CV_SymKind_WITH32 = 0x1104, +CV_SymKind_LABEL32 = 0x1105, +CV_SymKind_REGISTER = 0x1106, +CV_SymKind_CONSTANT = 0x1107, +CV_SymKind_UDT = 0x1108, +CV_SymKind_COBOLUDT = 0x1109, +CV_SymKind_MANYREG = 0x110a, +CV_SymKind_BPREL32 = 0x110b, +CV_SymKind_LDATA32 = 0x110c, +CV_SymKind_GDATA32 = 0x110d, +CV_SymKind_PUB32 = 0x110e, +CV_SymKind_LPROC32 = 0x110f, +CV_SymKind_GPROC32 = 0x1110, +CV_SymKind_REGREL32 = 0x1111, +CV_SymKind_LTHREAD32 = 0x1112, +CV_SymKind_GTHREAD32 = 0x1113, +CV_SymKind_LPROCMIPS = 0x1114, +CV_SymKind_GPROCMIPS = 0x1115, +CV_SymKind_COMPILE2 = 0x1116, +CV_SymKind_MANYREG2 = 0x1117, +CV_SymKind_LPROCIA64 = 0x1118, +CV_SymKind_GPROCIA64 = 0x1119, +CV_SymKind_LOCALSLOT = 0x111a, +CV_SymKind_PARAMSLOT = 0x111b, +CV_SymKind_LMANDATA = 0x111c, +CV_SymKind_GMANDATA = 0x111d, +CV_SymKind_MANFRAMEREL = 0x111e, +CV_SymKind_MANREGISTER = 0x111f, +CV_SymKind_MANSLOT = 0x1120, +CV_SymKind_MANMANYREG = 0x1121, +CV_SymKind_MANREGREL = 0x1122, +CV_SymKind_MANMANYREG2 = 0x1123, +CV_SymKind_UNAMESPACE = 0x1124, +CV_SymKind_PROCREF = 0x1125, +CV_SymKind_DATAREF = 0x1126, +CV_SymKind_LPROCREF = 0x1127, +CV_SymKind_ANNOTATIONREF = 0x1128, +CV_SymKind_TOKENREF = 0x1129, +CV_SymKind_GMANPROC = 0x112a, +CV_SymKind_LMANPROC = 0x112b, +CV_SymKind_TRAMPOLINE = 0x112c, +CV_SymKind_MANCONSTANT = 0x112d, +CV_SymKind_ATTR_FRAMEREL = 0x112e, +CV_SymKind_ATTR_REGISTER = 0x112f, +CV_SymKind_ATTR_REGREL = 0x1130, +CV_SymKind_ATTR_MANYREG = 0x1131, +CV_SymKind_SEPCODE = 0x1132, +CV_SymKind_DEFRANGE_2005 = 0x1134, +CV_SymKind_DEFRANGE2_2005 = 0x1135, +CV_SymKind_SECTION = 0x1136, +CV_SymKind_COFFGROUP = 0x1137, +CV_SymKind_EXPORT = 0x1138, +CV_SymKind_CALLSITEINFO = 0x1139, +CV_SymKind_FRAMECOOKIE = 0x113a, +CV_SymKind_DISCARDED = 0x113b, +CV_SymKind_COMPILE3 = 0x113c, +CV_SymKind_ENVBLOCK = 0x113d, +CV_SymKind_LOCAL = 0x113e, +CV_SymKind_DEFRANGE = 0x113f, +CV_SymKind_DEFRANGE_SUBFIELD = 0x1140, +CV_SymKind_DEFRANGE_REGISTER = 0x1141, +CV_SymKind_DEFRANGE_FRAMEPOINTER_REL = 0x1142, +CV_SymKind_DEFRANGE_SUBFIELD_REGISTER = 0x1143, +CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE = 0x1144, +CV_SymKind_DEFRANGE_REGISTER_REL = 0x1145, +CV_SymKind_LPROC32_ID = 0x1146, +CV_SymKind_GPROC32_ID = 0x1147, +CV_SymKind_LPROCMIPS_ID = 0x1148, +CV_SymKind_GPROCMIPS_ID = 0x1149, +CV_SymKind_LPROCIA64_ID = 0x114a, +CV_SymKind_GPROCIA64_ID = 0x114b, +CV_SymKind_BUILDINFO = 0x114c, +CV_SymKind_INLINESITE = 0x114d, +CV_SymKind_INLINESITE_END = 0x114e, +CV_SymKind_PROC_ID_END = 0x114f, +CV_SymKind_DEFRANGE_HLSL = 0x1150, +CV_SymKind_GDATA_HLSL = 0x1151, +CV_SymKind_LDATA_HLSL = 0x1152, +CV_SymKind_FILESTATIC = 0x1153, +CV_SymKind_LPROC32_DPC = 0x1155, +CV_SymKind_LPROC32_DPC_ID = 0x1156, +CV_SymKind_DEFRANGE_DPC_PTR_TAG = 0x1157, +CV_SymKind_DPC_SYM_TAG_MAP = 0x1158, +CV_SymKind_ARMSWITCHTABLE = 0x1159, +CV_SymKind_CALLEES = 0x115a, +CV_SymKind_CALLERS = 0x115b, +CV_SymKind_POGODATA = 0x115c, +CV_SymKind_INLINESITE2 = 0x115d, +CV_SymKind_HEAPALLOCSITE = 0x115e, +CV_SymKind_MOD_TYPEREF = 0x115f, +CV_SymKind_REF_MINIPDB = 0x1160, +CV_SymKind_PDBMAP = 0x1161, +CV_SymKind_GDATA_HLSL32 = 0x1162, +CV_SymKind_LDATA_HLSL32 = 0x1163, +CV_SymKind_GDATA_HLSL32_EX = 0x1164, +CV_SymKind_LDATA_HLSL32_EX = 0x1165, +CV_SymKind_FASTLINK = 0x1167, +CV_SymKind_INLINEES = 0x1168, +} CV_SymKindEnum; + +typedef U8 CV_BasicType; +typedef enum CV_BasicTypeEnum +{ +CV_BasicType_NOTYPE = 0x00, +CV_BasicType_ABS = 0x01, +CV_BasicType_SEGMENT = 0x02, +CV_BasicType_VOID = 0x03, +CV_BasicType_CURRENCY = 0x04, +CV_BasicType_NBASICSTR = 0x05, +CV_BasicType_FBASICSTR = 0x06, +CV_BasicType_NOTTRANS = 0x07, +CV_BasicType_HRESULT = 0x08, +CV_BasicType_CHAR = 0x10, +CV_BasicType_SHORT = 0x11, +CV_BasicType_LONG = 0x12, +CV_BasicType_QUAD = 0x13, +CV_BasicType_OCT = 0x14, +CV_BasicType_UCHAR = 0x20, +CV_BasicType_USHORT = 0x21, +CV_BasicType_ULONG = 0x22, +CV_BasicType_UQUAD = 0x23, +CV_BasicType_UOCT = 0x24, +CV_BasicType_BOOL8 = 0x30, +CV_BasicType_BOOL16 = 0x31, +CV_BasicType_BOOL32 = 0x32, +CV_BasicType_BOOL64 = 0x33, +CV_BasicType_FLOAT32 = 0x40, +CV_BasicType_FLOAT64 = 0x41, +CV_BasicType_FLOAT80 = 0x42, +CV_BasicType_FLOAT128 = 0x43, +CV_BasicType_FLOAT48 = 0x44, +CV_BasicType_FLOAT32PP = 0x45, +CV_BasicType_FLOAT16 = 0x46, +CV_BasicType_COMPLEX32 = 0x50, +CV_BasicType_COMPLEX64 = 0x51, +CV_BasicType_COMPLEX80 = 0x52, +CV_BasicType_COMPLEX128 = 0x53, +CV_BasicType_BIT = 0x60, +CV_BasicType_PASCHAR = 0x61, +CV_BasicType_BOOL32FF = 0x62, +CV_BasicType_INT8 = 0x68, +CV_BasicType_UINT8 = 0x69, +CV_BasicType_RCHAR = 0x70, +CV_BasicType_WCHAR = 0x71, +CV_BasicType_INT16 = 0x72, +CV_BasicType_UINT16 = 0x73, +CV_BasicType_INT32 = 0x74, +CV_BasicType_UINT32 = 0x75, +CV_BasicType_INT64 = 0x76, +CV_BasicType_UINT64 = 0x77, +CV_BasicType_INT128 = 0x78, +CV_BasicType_UINT128 = 0x79, +CV_BasicType_CHAR16 = 0x7a, +CV_BasicType_CHAR32 = 0x7b, +CV_BasicType_CHAR8 = 0x7c, +CV_BasicType_PTR = 0xf0, +} CV_BasicTypeEnum; + +typedef U16 CV_LeafKind; +typedef enum CV_LeafKindEnum +{ +CV_LeafKind_NOTYPE = 0x0000, +CV_LeafKind_MODIFIER_16t = 0x0001, +CV_LeafKind_POINTER_16t = 0x0002, +CV_LeafKind_ARRAY_16t = 0x0003, +CV_LeafKind_CLASS_16t = 0x0004, +CV_LeafKind_STRUCTURE_16t = 0x0005, +CV_LeafKind_UNION_16t = 0x0006, +CV_LeafKind_ENUM_16t = 0x0007, +CV_LeafKind_PROCEDURE_16t = 0x0008, +CV_LeafKind_MFUNCTION_16t = 0x0009, +CV_LeafKind_VTSHAPE = 0x000a, +CV_LeafKind_COBOL0_16t = 0x000b, +CV_LeafKind_COBOL1 = 0x000c, +CV_LeafKind_BARRAY_16t = 0x000d, +CV_LeafKind_LABEL = 0x000e, +CV_LeafKind_NULL = 0x000f, +CV_LeafKind_NOTTRAN = 0x0010, +CV_LeafKind_DIMARRAY_16t = 0x0011, +CV_LeafKind_VFTPATH_16t = 0x0012, +CV_LeafKind_PRECOMP_16t = 0x0013, +CV_LeafKind_ENDPRECOMP = 0x0014, +CV_LeafKind_OEM_16t = 0x0015, +CV_LeafKind_TYPESERVER_ST = 0x0016, +CV_LeafKind_SKIP_16t = 0x0200, +CV_LeafKind_ARGLIST_16t = 0x0201, +CV_LeafKind_DEFARG_16t = 0x0202, +CV_LeafKind_LIST = 0x0203, +CV_LeafKind_FIELDLIST_16t = 0x0204, +CV_LeafKind_DERIVED_16t = 0x0205, +CV_LeafKind_BITFIELD_16t = 0x0206, +CV_LeafKind_METHODLIST_16t = 0x0207, +CV_LeafKind_DIMCONU_16t = 0x0208, +CV_LeafKind_DIMCONLU_16t = 0x0209, +CV_LeafKind_DIMVARU_16t = 0x020a, +CV_LeafKind_DIMVARLU_16t = 0x020b, +CV_LeafKind_REFSYM = 0x020c, +CV_LeafKind_BCLASS_16t = 0x0400, +CV_LeafKind_VBCLASS_16t = 0x0401, +CV_LeafKind_IVBCLASS_16t = 0x0402, +CV_LeafKind_ENUMERATE_ST = 0x0403, +CV_LeafKind_FRIENDFCN_16t = 0x0404, +CV_LeafKind_INDEX_16t = 0x0405, +CV_LeafKind_MEMBER_16t = 0x0406, +CV_LeafKind_STMEMBER_16t = 0x0407, +CV_LeafKind_METHOD_16t = 0x0408, +CV_LeafKind_NESTTYPE_16t = 0x0409, +CV_LeafKind_VFUNCTAB_16t = 0x040a, +CV_LeafKind_FRIENDCLS_16t = 0x040b, +CV_LeafKind_ONEMETHOD_16t = 0x040c, +CV_LeafKind_VFUNCOFF_16t = 0x040d, +CV_LeafKind_TI16_MAX = 0x1000, +CV_LeafKind_MODIFIER = 0x1001, +CV_LeafKind_POINTER = 0x1002, +CV_LeafKind_ARRAY_ST = 0x1003, +CV_LeafKind_CLASS_ST = 0x1004, +CV_LeafKind_STRUCTURE_ST = 0x1005, +CV_LeafKind_UNION_ST = 0x1006, +CV_LeafKind_ENUM_ST = 0x1007, +CV_LeafKind_PROCEDURE = 0x1008, +CV_LeafKind_MFUNCTION = 0x1009, +CV_LeafKind_COBOL0 = 0x100a, +CV_LeafKind_BARRAY = 0x100b, +CV_LeafKind_DIMARRAY_ST = 0x100c, +CV_LeafKind_VFTPATH = 0x100d, +CV_LeafKind_PRECOMP_ST = 0x100e, +CV_LeafKind_OEM = 0x100f, +CV_LeafKind_ALIAS_ST = 0x1010, +CV_LeafKind_OEM2 = 0x1011, +CV_LeafKind_SKIP = 0x1200, +CV_LeafKind_ARGLIST = 0x1201, +CV_LeafKind_DEFARG_ST = 0x1202, +CV_LeafKind_FIELDLIST = 0x1203, +CV_LeafKind_DERIVED = 0x1204, +CV_LeafKind_BITFIELD = 0x1205, +CV_LeafKind_METHODLIST = 0x1206, +CV_LeafKind_DIMCONU = 0x1207, +CV_LeafKind_DIMCONLU = 0x1208, +CV_LeafKind_DIMVARU = 0x1209, +CV_LeafKind_DIMVARLU = 0x120a, +CV_LeafKind_BCLASS = 0x1400, +CV_LeafKind_VBCLASS = 0x1401, +CV_LeafKind_IVBCLASS = 0x1402, +CV_LeafKind_FRIENDFCN_ST = 0x1403, +CV_LeafKind_INDEX = 0x1404, +CV_LeafKind_MEMBER_ST = 0x1405, +CV_LeafKind_STMEMBER_ST = 0x1406, +CV_LeafKind_METHOD_ST = 0x1407, +CV_LeafKind_NESTTYPE_ST = 0x1408, +CV_LeafKind_VFUNCTAB = 0x1409, +CV_LeafKind_FRIENDCLS = 0x140a, +CV_LeafKind_ONEMETHOD_ST = 0x140b, +CV_LeafKind_VFUNCOFF = 0x140c, +CV_LeafKind_NESTTYPEEX_ST = 0x140d, +CV_LeafKind_MEMBERMODIFY_ST = 0x140e, +CV_LeafKind_MANAGED_ST = 0x140f, +CV_LeafKind_ST_MAX = 0x1500, +CV_LeafKind_TYPESERVER = 0x1501, +CV_LeafKind_ENUMERATE = 0x1502, +CV_LeafKind_ARRAY = 0x1503, +CV_LeafKind_CLASS = 0x1504, +CV_LeafKind_STRUCTURE = 0x1505, +CV_LeafKind_UNION = 0x1506, +CV_LeafKind_ENUM = 0x1507, +CV_LeafKind_DIMARRAY = 0x1508, +CV_LeafKind_PRECOMP = 0x1509, +CV_LeafKind_ALIAS = 0x150a, +CV_LeafKind_DEFARG = 0x150b, +CV_LeafKind_FRIENDFCN = 0x150c, +CV_LeafKind_MEMBER = 0x150d, +CV_LeafKind_STMEMBER = 0x150e, +CV_LeafKind_METHOD = 0x150f, +CV_LeafKind_NESTTYPE = 0x1510, +CV_LeafKind_ONEMETHOD = 0x1511, +CV_LeafKind_NESTTYPEEX = 0x1512, +CV_LeafKind_MEMBERMODIFY = 0x1513, +CV_LeafKind_MANAGED = 0x1514, +CV_LeafKind_TYPESERVER2 = 0x1515, +CV_LeafKind_STRIDED_ARRAY = 0x1516, +CV_LeafKind_HLSL = 0x1517, +CV_LeafKind_MODIFIER_EX = 0x1518, +CV_LeafKind_INTERFACE = 0x1519, +CV_LeafKind_BINTERFACE = 0x151a, +CV_LeafKind_VECTOR = 0x151b, +CV_LeafKind_MATRIX = 0x151c, +CV_LeafKind_VFTABLE = 0x151d, +CV_LeafKind_FUNC_ID = 0x1601, +CV_LeafKind_MFUNC_ID = 0x1602, +CV_LeafKind_BUILDINFO = 0x1603, +CV_LeafKind_SUBSTR_LIST = 0x1604, +CV_LeafKind_STRING_ID = 0x1605, +CV_LeafKind_UDT_SRC_LINE = 0x1606, +CV_LeafKind_UDT_MOD_SRC_LINE = 0x1607, +CV_LeafKind_CLASS2 = 0x1608, +CV_LeafKind_STRUCT2 = 0x1609, +} CV_LeafKindEnum; + +internal String8 cv_string_from_numeric_kind(CV_NumericKind v); +internal String8 cv_string_from_arch(CV_Arch v); +internal String8 cv_string_from_sym_kind(CV_SymKind v); +internal String8 cv_string_from_basic_type(CV_BasicType v); +internal String8 cv_type_name_from_basic_type(CV_BasicType v); +internal String8 cv_string_from_leaf_kind(CV_LeafKind v); +internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v); +internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v); +#endif // CODEVIEW_META_H diff --git a/src/dbg_engine/generated/dbg_engine.meta.c b/src/dbg_engine/generated/dbg_engine.meta.c index 12e147c8..2d300773 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.c +++ b/src/dbg_engine/generated/dbg_engine.meta.c @@ -1,208 +1,208 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 d_entity_kind_code_name_table[12] = -{ -{0}, -str8_lit_comp("root"), -str8_lit_comp("machine"), -str8_lit_comp("process"), -str8_lit_comp("thread"), -str8_lit_comp("module"), -str8_lit_comp("entry_point"), -str8_lit_comp("debug_info_path"), -str8_lit_comp("pending_thread_name"), -str8_lit_comp("pending_thread_color"), -str8_lit_comp("breakpoint"), -str8_lit_comp("address_range_annotation"), -}; - -String8 d_entity_kind_display_string_table[12] = -{ -{0}, -str8_lit_comp("Root"), -str8_lit_comp("Machine"), -str8_lit_comp("Process"), -str8_lit_comp("Thread"), -str8_lit_comp("Module"), -str8_lit_comp("EntryPoint"), -str8_lit_comp("DebugInfoPath"), -str8_lit_comp("PendingThreadName"), -str8_lit_comp("PendingThreadColor"), -str8_lit_comp("Breakpoint"), -str8_lit_comp("AddressRangeAnnotation"), -}; - -U32 d_exception_code_kind_code_table[38] = -{ -0, -0x40010005, -0x40010008, -0x40080201, -0x40080202, -0x0000071a, -0x80000002, -0xc0000005, -0xc0000006, -0xc0000008, -0xc0000017, -0xc000001d, -0xc0000025, -0xc0000026, -0xc000008c, -0xc000008d, -0xc000008e, -0xc000008f, -0xc0000090, -0xc0000091, -0xc0000092, -0xc0000093, -0xc0000094, -0xc0000095, -0xc0000096, -0xc00000fd, -0xc0000135, -0xc0000138, -0xc0000139, -0xc0000142, -0xc00002b4, -0xc00002b5, -0xc0000420, -0xc06d007e, -0xc06d007f, -0xe073616e, -0xe0736171, -0x0000087a, -}; - -String8 d_exception_code_kind_display_string_table[38] = -{ -{0}, -str8_lit_comp("(Win32) Control-C"), -str8_lit_comp("(Win32) Control-Break"), -str8_lit_comp("(Win32) WinRT Originate Error"), -str8_lit_comp("(Win32) WinRT Transform Error"), -str8_lit_comp("(Win32) RPC Call Cancelled"), -str8_lit_comp("(Win32) Data Type Misalignment"), -str8_lit_comp("(Win32) Access Violation"), -str8_lit_comp("(Win32) In Page Error"), -str8_lit_comp("(Win32) Invalid Handle Specified"), -str8_lit_comp("(Win32) Not Enough Quota"), -str8_lit_comp("(Win32) Illegal Instruction"), -str8_lit_comp("(Win32) Cannot Continue From Exception"), -str8_lit_comp("(Win32) Invalid Exception Disposition Returned By Handler"), -str8_lit_comp("(Win32) Array Bounds Exceeded"), -str8_lit_comp("(Win32) Floating-Point Denormal Operand"), -str8_lit_comp("(Win32) Floating-Point Division By Zero"), -str8_lit_comp("(Win32) Floating-Point Inexact Result"), -str8_lit_comp("(Win32) Floating-Point Invalid Operation"), -str8_lit_comp("(Win32) Floating-Point Overflow"), -str8_lit_comp("(Win32) Floating-Point Stack Check"), -str8_lit_comp("(Win32) Floating-Point Underflow"), -str8_lit_comp("(Win32) Integer Division By Zero"), -str8_lit_comp("(Win32) Integer Overflow"), -str8_lit_comp("(Win32) Privileged Instruction"), -str8_lit_comp("(Win32) Stack Overflow"), -str8_lit_comp("(Win32) Unable To Locate DLL"), -str8_lit_comp("(Win32) Ordinal Not Found"), -str8_lit_comp("(Win32) Entry Point Not Found"), -str8_lit_comp("(Win32) DLL Initialization Failed"), -str8_lit_comp("(Win32) Floating Point SSE Multiple Faults"), -str8_lit_comp("(Win32) Floating Point SSE Multiple Traps"), -str8_lit_comp("(Win32) Assertion Failed"), -str8_lit_comp("(Win32) Module Not Found"), -str8_lit_comp("(Win32) Procedure Not Found"), -str8_lit_comp("(Win32) Sanitizer Error Detected"), -str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), -str8_lit_comp("(Win32) DirectX Debug Layer"), -}; - -String8 d_exception_code_kind_lowercase_code_string_table[38] = -{ -{0}, -str8_lit_comp("win32_ctrl_c"), -str8_lit_comp("win32_ctrl_break"), -str8_lit_comp("win32_win_rt_originate_error"), -str8_lit_comp("win32_win_rt_transform_error"), -str8_lit_comp("win32_rpc_call_cancelled"), -str8_lit_comp("win32_datatype_misalignment"), -str8_lit_comp("win32_access_violation"), -str8_lit_comp("win32_in_page_error"), -str8_lit_comp("win32_invalid_handle"), -str8_lit_comp("win32_not_enough_quota"), -str8_lit_comp("win32_illegal_instruction"), -str8_lit_comp("win32_cannot_continue_exception"), -str8_lit_comp("win32_invalid_exception_disposition"), -str8_lit_comp("win32_array_bounds_exceeded"), -str8_lit_comp("win32_floating_point_denormal_operand"), -str8_lit_comp("win32_floating_point_division_by_zero"), -str8_lit_comp("win32_floating_point_inexact_result"), -str8_lit_comp("win32_floating_point_invalid_operation"), -str8_lit_comp("win32_floating_point_overflow"), -str8_lit_comp("win32_floating_point_stack_check"), -str8_lit_comp("win32_floating_point_underflow"), -str8_lit_comp("win32_integer_division_by_zero"), -str8_lit_comp("win32_integer_overflow"), -str8_lit_comp("win32_privileged_instruction"), -str8_lit_comp("win32_stack_overflow"), -str8_lit_comp("win32_unable_to_locate_dll"), -str8_lit_comp("win32_ordinal_not_found"), -str8_lit_comp("win32_entry_point_not_found"), -str8_lit_comp("win32_dll_initialization_failed"), -str8_lit_comp("win32_floating_point_sse_multiple_faults"), -str8_lit_comp("win32_floating_point_sse_multiple_traps"), -str8_lit_comp("win32_assertion_failed"), -str8_lit_comp("win32_module_not_found"), -str8_lit_comp("win32_procedure_not_found"), -str8_lit_comp("win32_sanitizer_error_detected"), -str8_lit_comp("win32_sanitizer_raw_access_violation"), -str8_lit_comp("win32_directx_debug_layer"), -}; - -B8 d_exception_code_kind_default_enable_table[38] = -{ -0, -1, -1, -0, -0, -0, -0, -1, -0, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -1, -0, -0, -1, -0, -1, -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 d_entity_kind_code_name_table[12] = +{ +{0}, +str8_lit_comp("root"), +str8_lit_comp("machine"), +str8_lit_comp("process"), +str8_lit_comp("thread"), +str8_lit_comp("module"), +str8_lit_comp("entry_point"), +str8_lit_comp("debug_info_path"), +str8_lit_comp("pending_thread_name"), +str8_lit_comp("pending_thread_color"), +str8_lit_comp("breakpoint"), +str8_lit_comp("address_range_annotation"), +}; + +String8 d_entity_kind_display_string_table[12] = +{ +{0}, +str8_lit_comp("Root"), +str8_lit_comp("Machine"), +str8_lit_comp("Process"), +str8_lit_comp("Thread"), +str8_lit_comp("Module"), +str8_lit_comp("EntryPoint"), +str8_lit_comp("DebugInfoPath"), +str8_lit_comp("PendingThreadName"), +str8_lit_comp("PendingThreadColor"), +str8_lit_comp("Breakpoint"), +str8_lit_comp("AddressRangeAnnotation"), +}; + +U32 d_exception_code_kind_code_table[38] = +{ +0, +0x40010005, +0x40010008, +0x40080201, +0x40080202, +0x0000071a, +0x80000002, +0xc0000005, +0xc0000006, +0xc0000008, +0xc0000017, +0xc000001d, +0xc0000025, +0xc0000026, +0xc000008c, +0xc000008d, +0xc000008e, +0xc000008f, +0xc0000090, +0xc0000091, +0xc0000092, +0xc0000093, +0xc0000094, +0xc0000095, +0xc0000096, +0xc00000fd, +0xc0000135, +0xc0000138, +0xc0000139, +0xc0000142, +0xc00002b4, +0xc00002b5, +0xc0000420, +0xc06d007e, +0xc06d007f, +0xe073616e, +0xe0736171, +0x0000087a, +}; + +String8 d_exception_code_kind_display_string_table[38] = +{ +{0}, +str8_lit_comp("(Win32) Control-C"), +str8_lit_comp("(Win32) Control-Break"), +str8_lit_comp("(Win32) WinRT Originate Error"), +str8_lit_comp("(Win32) WinRT Transform Error"), +str8_lit_comp("(Win32) RPC Call Cancelled"), +str8_lit_comp("(Win32) Data Type Misalignment"), +str8_lit_comp("(Win32) Access Violation"), +str8_lit_comp("(Win32) In Page Error"), +str8_lit_comp("(Win32) Invalid Handle Specified"), +str8_lit_comp("(Win32) Not Enough Quota"), +str8_lit_comp("(Win32) Illegal Instruction"), +str8_lit_comp("(Win32) Cannot Continue From Exception"), +str8_lit_comp("(Win32) Invalid Exception Disposition Returned By Handler"), +str8_lit_comp("(Win32) Array Bounds Exceeded"), +str8_lit_comp("(Win32) Floating-Point Denormal Operand"), +str8_lit_comp("(Win32) Floating-Point Division By Zero"), +str8_lit_comp("(Win32) Floating-Point Inexact Result"), +str8_lit_comp("(Win32) Floating-Point Invalid Operation"), +str8_lit_comp("(Win32) Floating-Point Overflow"), +str8_lit_comp("(Win32) Floating-Point Stack Check"), +str8_lit_comp("(Win32) Floating-Point Underflow"), +str8_lit_comp("(Win32) Integer Division By Zero"), +str8_lit_comp("(Win32) Integer Overflow"), +str8_lit_comp("(Win32) Privileged Instruction"), +str8_lit_comp("(Win32) Stack Overflow"), +str8_lit_comp("(Win32) Unable To Locate DLL"), +str8_lit_comp("(Win32) Ordinal Not Found"), +str8_lit_comp("(Win32) Entry Point Not Found"), +str8_lit_comp("(Win32) DLL Initialization Failed"), +str8_lit_comp("(Win32) Floating Point SSE Multiple Faults"), +str8_lit_comp("(Win32) Floating Point SSE Multiple Traps"), +str8_lit_comp("(Win32) Assertion Failed"), +str8_lit_comp("(Win32) Module Not Found"), +str8_lit_comp("(Win32) Procedure Not Found"), +str8_lit_comp("(Win32) Sanitizer Error Detected"), +str8_lit_comp("(Win32) Sanitizer Raw Access Violation"), +str8_lit_comp("(Win32) DirectX Debug Layer"), +}; + +String8 d_exception_code_kind_lowercase_code_string_table[38] = +{ +{0}, +str8_lit_comp("win32_ctrl_c"), +str8_lit_comp("win32_ctrl_break"), +str8_lit_comp("win32_win_rt_originate_error"), +str8_lit_comp("win32_win_rt_transform_error"), +str8_lit_comp("win32_rpc_call_cancelled"), +str8_lit_comp("win32_datatype_misalignment"), +str8_lit_comp("win32_access_violation"), +str8_lit_comp("win32_in_page_error"), +str8_lit_comp("win32_invalid_handle"), +str8_lit_comp("win32_not_enough_quota"), +str8_lit_comp("win32_illegal_instruction"), +str8_lit_comp("win32_cannot_continue_exception"), +str8_lit_comp("win32_invalid_exception_disposition"), +str8_lit_comp("win32_array_bounds_exceeded"), +str8_lit_comp("win32_floating_point_denormal_operand"), +str8_lit_comp("win32_floating_point_division_by_zero"), +str8_lit_comp("win32_floating_point_inexact_result"), +str8_lit_comp("win32_floating_point_invalid_operation"), +str8_lit_comp("win32_floating_point_overflow"), +str8_lit_comp("win32_floating_point_stack_check"), +str8_lit_comp("win32_floating_point_underflow"), +str8_lit_comp("win32_integer_division_by_zero"), +str8_lit_comp("win32_integer_overflow"), +str8_lit_comp("win32_privileged_instruction"), +str8_lit_comp("win32_stack_overflow"), +str8_lit_comp("win32_unable_to_locate_dll"), +str8_lit_comp("win32_ordinal_not_found"), +str8_lit_comp("win32_entry_point_not_found"), +str8_lit_comp("win32_dll_initialization_failed"), +str8_lit_comp("win32_floating_point_sse_multiple_faults"), +str8_lit_comp("win32_floating_point_sse_multiple_traps"), +str8_lit_comp("win32_assertion_failed"), +str8_lit_comp("win32_module_not_found"), +str8_lit_comp("win32_procedure_not_found"), +str8_lit_comp("win32_sanitizer_error_detected"), +str8_lit_comp("win32_sanitizer_raw_access_violation"), +str8_lit_comp("win32_directx_debug_layer"), +}; + +B8 d_exception_code_kind_default_enable_table[38] = +{ +0, +1, +1, +0, +0, +0, +0, +1, +0, +1, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +1, +0, +0, +1, +0, +1, +}; + +C_LINKAGE_END + diff --git a/src/demon/generated/demon.meta.c b/src/demon/generated/demon.meta.c index cf282f4a..41c98976 100644 --- a/src/demon/generated/demon.meta.c +++ b/src/demon/generated/demon.meta.c @@ -1,42 +1,42 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 dmn_event_kind_string_table[21] = -{ -str8_lit_comp("Null"), -str8_lit_comp("Error"), -str8_lit_comp("HandshakeComplete"), -str8_lit_comp("CreateProcess"), -str8_lit_comp("ExitProcess"), -str8_lit_comp("CreateThread"), -str8_lit_comp("ExitThread"), -str8_lit_comp("LoadModule"), -str8_lit_comp("UnloadModule"), -str8_lit_comp("Breakpoint"), -str8_lit_comp("Trap"), -str8_lit_comp("SingleStep"), -str8_lit_comp("Exception"), -str8_lit_comp("Halt"), -str8_lit_comp("Memory"), -str8_lit_comp("DebugString"), -str8_lit_comp("SetThreadName"), -str8_lit_comp("SetThreadColor"), -str8_lit_comp("SetBreakpoint"), -str8_lit_comp("UnsetBreakpoint"), -str8_lit_comp("SetVAddrRangeNote"), -}; - -String8 dmn_exception_kind_string_table[5] = -{ -str8_lit_comp("Null"), -str8_lit_comp("MemoryRead"), -str8_lit_comp("MemoryWrite"), -str8_lit_comp("MemoryExecute"), -str8_lit_comp("CppThrow"), -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 dmn_event_kind_string_table[21] = +{ +str8_lit_comp("Null"), +str8_lit_comp("Error"), +str8_lit_comp("HandshakeComplete"), +str8_lit_comp("CreateProcess"), +str8_lit_comp("ExitProcess"), +str8_lit_comp("CreateThread"), +str8_lit_comp("ExitThread"), +str8_lit_comp("LoadModule"), +str8_lit_comp("UnloadModule"), +str8_lit_comp("Breakpoint"), +str8_lit_comp("Trap"), +str8_lit_comp("SingleStep"), +str8_lit_comp("Exception"), +str8_lit_comp("Halt"), +str8_lit_comp("Memory"), +str8_lit_comp("DebugString"), +str8_lit_comp("SetThreadName"), +str8_lit_comp("SetThreadColor"), +str8_lit_comp("SetBreakpoint"), +str8_lit_comp("UnsetBreakpoint"), +str8_lit_comp("SetVAddrRangeNote"), +}; + +String8 dmn_exception_kind_string_table[5] = +{ +str8_lit_comp("Null"), +str8_lit_comp("MemoryRead"), +str8_lit_comp("MemoryWrite"), +str8_lit_comp("MemoryExecute"), +str8_lit_comp("CppThrow"), +}; + +C_LINKAGE_END + diff --git a/src/demon/generated/demon.meta.h b/src/demon/generated/demon.meta.h index 7e1513e0..24ee3bf3 100644 --- a/src/demon/generated/demon.meta.h +++ b/src/demon/generated/demon.meta.h @@ -1,70 +1,70 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef DEMON_META_H -#define DEMON_META_H - -typedef enum DMN_EventKind -{ -DMN_EventKind_Null, -DMN_EventKind_Error, -DMN_EventKind_HandshakeComplete, -DMN_EventKind_CreateProcess, -DMN_EventKind_ExitProcess, -DMN_EventKind_CreateThread, -DMN_EventKind_ExitThread, -DMN_EventKind_LoadModule, -DMN_EventKind_UnloadModule, -DMN_EventKind_Breakpoint, -DMN_EventKind_Trap, -DMN_EventKind_SingleStep, -DMN_EventKind_Exception, -DMN_EventKind_Halt, -DMN_EventKind_Memory, -DMN_EventKind_DebugString, -DMN_EventKind_SetThreadName, -DMN_EventKind_SetThreadColor, -DMN_EventKind_SetBreakpoint, -DMN_EventKind_UnsetBreakpoint, -DMN_EventKind_SetVAddrRangeNote, -DMN_EventKind_COUNT, -} DMN_EventKind; - -typedef enum DMN_ErrorKind -{ -DMN_ErrorKind_Null, -DMN_ErrorKind_NotAttached, -DMN_ErrorKind_UnexpectedFailure, -DMN_ErrorKind_InvalidHandle, -DMN_ErrorKind_COUNT, -} DMN_ErrorKind; - -typedef enum DMN_MemoryEventKind -{ -DMN_MemoryEventKind_Null, -DMN_MemoryEventKind_Commit, -DMN_MemoryEventKind_Reserve, -DMN_MemoryEventKind_Decommit, -DMN_MemoryEventKind_Release, -DMN_MemoryEventKind_COUNT, -} DMN_MemoryEventKind; - -typedef enum DMN_ExceptionKind -{ -DMN_ExceptionKind_Null, -DMN_ExceptionKind_MemoryRead, -DMN_ExceptionKind_MemoryWrite, -DMN_ExceptionKind_MemoryExecute, -DMN_ExceptionKind_CppThrow, -DMN_ExceptionKind_COUNT, -} DMN_ExceptionKind; - -C_LINKAGE_BEGIN -extern String8 dmn_event_kind_string_table[21]; -extern String8 dmn_exception_kind_string_table[5]; - -C_LINKAGE_END - -#endif // DEMON_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DEMON_META_H +#define DEMON_META_H + +typedef enum DMN_EventKind +{ +DMN_EventKind_Null, +DMN_EventKind_Error, +DMN_EventKind_HandshakeComplete, +DMN_EventKind_CreateProcess, +DMN_EventKind_ExitProcess, +DMN_EventKind_CreateThread, +DMN_EventKind_ExitThread, +DMN_EventKind_LoadModule, +DMN_EventKind_UnloadModule, +DMN_EventKind_Breakpoint, +DMN_EventKind_Trap, +DMN_EventKind_SingleStep, +DMN_EventKind_Exception, +DMN_EventKind_Halt, +DMN_EventKind_Memory, +DMN_EventKind_DebugString, +DMN_EventKind_SetThreadName, +DMN_EventKind_SetThreadColor, +DMN_EventKind_SetBreakpoint, +DMN_EventKind_UnsetBreakpoint, +DMN_EventKind_SetVAddrRangeNote, +DMN_EventKind_COUNT, +} DMN_EventKind; + +typedef enum DMN_ErrorKind +{ +DMN_ErrorKind_Null, +DMN_ErrorKind_NotAttached, +DMN_ErrorKind_UnexpectedFailure, +DMN_ErrorKind_InvalidHandle, +DMN_ErrorKind_COUNT, +} DMN_ErrorKind; + +typedef enum DMN_MemoryEventKind +{ +DMN_MemoryEventKind_Null, +DMN_MemoryEventKind_Commit, +DMN_MemoryEventKind_Reserve, +DMN_MemoryEventKind_Decommit, +DMN_MemoryEventKind_Release, +DMN_MemoryEventKind_COUNT, +} DMN_MemoryEventKind; + +typedef enum DMN_ExceptionKind +{ +DMN_ExceptionKind_Null, +DMN_ExceptionKind_MemoryRead, +DMN_ExceptionKind_MemoryWrite, +DMN_ExceptionKind_MemoryExecute, +DMN_ExceptionKind_CppThrow, +DMN_ExceptionKind_COUNT, +} DMN_ExceptionKind; + +C_LINKAGE_BEGIN +extern String8 dmn_event_kind_string_table[21]; +extern String8 dmn_exception_kind_string_table[5]; + +C_LINKAGE_END + +#endif // DEMON_META_H diff --git a/src/draw/generated/draw.meta.c b/src/draw/generated/draw.meta.c index 2efd51aa..1f40856a 100644 --- a/src/draw/generated/draw.meta.c +++ b/src/draw/generated/draw.meta.c @@ -1,17 +1,17 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -internal R_Tex2DSampleKind dr_push_tex2d_sample_kind(R_Tex2DSampleKind v) {DR_StackPushImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind, v);} -internal Mat3x3F32 dr_push_xform2d(Mat3x3F32 v) {DR_StackPushImpl(XForm2D, xform2d, Mat3x3F32, v);} -internal Rng2F32 dr_push_clip(Rng2F32 v) {DR_StackPushImpl(Clip, clip, Rng2F32, v);} -internal F32 dr_push_transparency(F32 v) {DR_StackPushImpl(Transparency, transparency, F32, v);} -internal R_Tex2DSampleKind dr_pop_tex2d_sample_kind(void) {DR_StackPopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);} -internal Mat3x3F32 dr_pop_xform2d(void) {DR_StackPopImpl(XForm2D, xform2d, Mat3x3F32);} -internal Rng2F32 dr_pop_clip(void) {DR_StackPopImpl(Clip, clip, Rng2F32);} -internal F32 dr_pop_transparency(void) {DR_StackPopImpl(Transparency, transparency, F32);} -internal R_Tex2DSampleKind dr_top_tex2d_sample_kind(void) {DR_StackTopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);} -internal Mat3x3F32 dr_top_xform2d(void) {DR_StackTopImpl(XForm2D, xform2d, Mat3x3F32);} -internal Rng2F32 dr_top_clip(void) {DR_StackTopImpl(Clip, clip, Rng2F32);} -internal F32 dr_top_transparency(void) {DR_StackTopImpl(Transparency, transparency, F32);} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +internal R_Tex2DSampleKind dr_push_tex2d_sample_kind(R_Tex2DSampleKind v) {DR_StackPushImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind, v);} +internal Mat3x3F32 dr_push_xform2d(Mat3x3F32 v) {DR_StackPushImpl(XForm2D, xform2d, Mat3x3F32, v);} +internal Rng2F32 dr_push_clip(Rng2F32 v) {DR_StackPushImpl(Clip, clip, Rng2F32, v);} +internal F32 dr_push_transparency(F32 v) {DR_StackPushImpl(Transparency, transparency, F32, v);} +internal R_Tex2DSampleKind dr_pop_tex2d_sample_kind(void) {DR_StackPopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);} +internal Mat3x3F32 dr_pop_xform2d(void) {DR_StackPopImpl(XForm2D, xform2d, Mat3x3F32);} +internal Rng2F32 dr_pop_clip(void) {DR_StackPopImpl(Clip, clip, Rng2F32);} +internal F32 dr_pop_transparency(void) {DR_StackPopImpl(Transparency, transparency, F32);} +internal R_Tex2DSampleKind dr_top_tex2d_sample_kind(void) {DR_StackTopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);} +internal Mat3x3F32 dr_top_xform2d(void) {DR_StackTopImpl(XForm2D, xform2d, Mat3x3F32);} +internal Rng2F32 dr_top_clip(void) {DR_StackTopImpl(Clip, clip, Rng2F32);} +internal F32 dr_top_transparency(void) {DR_StackTopImpl(Transparency, transparency, F32);} diff --git a/src/draw/generated/draw.meta.h b/src/draw/generated/draw.meta.h index 58db1f4e..017fb418 100644 --- a/src/draw/generated/draw.meta.h +++ b/src/draw/generated/draw.meta.h @@ -1,49 +1,49 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef DRAW_META_H -#define DRAW_META_H - -typedef struct DR_Tex2DSampleKindNode DR_Tex2DSampleKindNode; struct DR_Tex2DSampleKindNode {DR_Tex2DSampleKindNode *next; R_Tex2DSampleKind v;}; -typedef struct DR_XForm2DNode DR_XForm2DNode; struct DR_XForm2DNode {DR_XForm2DNode *next; Mat3x3F32 v;}; -typedef struct DR_ClipNode DR_ClipNode; struct DR_ClipNode {DR_ClipNode *next; Rng2F32 v;}; -typedef struct DR_TransparencyNode DR_TransparencyNode; struct DR_TransparencyNode {DR_TransparencyNode *next; F32 v;}; -#define DR_BucketStackDecls struct{\ -DR_Tex2DSampleKindNode *top_tex2d_sample_kind;\ -DR_XForm2DNode *top_xform2d;\ -DR_ClipNode *top_clip;\ -DR_TransparencyNode *top_transparency;\ -} -read_only global DR_Tex2DSampleKindNode dr_nil_tex2d_sample_kind = {0, R_Tex2DSampleKind_Nearest}; -read_only global DR_XForm2DNode dr_nil_xform2d = {0, {1, 0, 0, 0, 1, 0, 0, 0, 1}}; -read_only global DR_ClipNode dr_nil_clip = {0, {0}}; -read_only global DR_TransparencyNode dr_nil_transparency = {0, 0}; -#define DR_BucketStackInits(b) do{\ -(b)->top_tex2d_sample_kind = &dr_nil_tex2d_sample_kind;\ -(b)->top_xform2d = &dr_nil_xform2d;\ -(b)->top_clip = &dr_nil_clip;\ -(b)->top_transparency = &dr_nil_transparency;\ -}while(0) -#if 0 -internal R_Tex2DSampleKind dr_push_tex2d_sample_kind(R_Tex2DSampleKind v); -internal Mat3x3F32 dr_push_xform2d(Mat3x3F32 v); -internal Rng2F32 dr_push_clip(Rng2F32 v); -internal F32 dr_push_transparency(F32 v); -internal R_Tex2DSampleKind dr_pop_tex2d_sample_kind(void); -internal Mat3x3F32 dr_pop_xform2d(void); -internal Rng2F32 dr_pop_clip(void); -internal F32 dr_pop_transparency(void); -internal R_Tex2DSampleKind dr_top_tex2d_sample_kind(void); -internal Mat3x3F32 dr_top_xform2d(void); -internal Rng2F32 dr_top_clip(void); -internal F32 dr_top_transparency(void); -#endif -#if 0 -#define DR_Tex2DSampleKindScope(v) DeferLoop(dr_push_tex2d_sample_kind(v), dr_pop_tex2d_sample_kind()) -#define DR_XForm2DScope(v) DeferLoop(dr_push_xform2d(v), dr_pop_xform2d()) -#define DR_ClipScope(v) DeferLoop(dr_push_clip(v), dr_pop_clip()) -#define DR_TransparencyScope(v) DeferLoop(dr_push_transparency(v), dr_pop_transparency()) -#endif -#endif // DRAW_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DRAW_META_H +#define DRAW_META_H + +typedef struct DR_Tex2DSampleKindNode DR_Tex2DSampleKindNode; struct DR_Tex2DSampleKindNode {DR_Tex2DSampleKindNode *next; R_Tex2DSampleKind v;}; +typedef struct DR_XForm2DNode DR_XForm2DNode; struct DR_XForm2DNode {DR_XForm2DNode *next; Mat3x3F32 v;}; +typedef struct DR_ClipNode DR_ClipNode; struct DR_ClipNode {DR_ClipNode *next; Rng2F32 v;}; +typedef struct DR_TransparencyNode DR_TransparencyNode; struct DR_TransparencyNode {DR_TransparencyNode *next; F32 v;}; +#define DR_BucketStackDecls struct{\ +DR_Tex2DSampleKindNode *top_tex2d_sample_kind;\ +DR_XForm2DNode *top_xform2d;\ +DR_ClipNode *top_clip;\ +DR_TransparencyNode *top_transparency;\ +} +read_only global DR_Tex2DSampleKindNode dr_nil_tex2d_sample_kind = {0, R_Tex2DSampleKind_Nearest}; +read_only global DR_XForm2DNode dr_nil_xform2d = {0, {1, 0, 0, 0, 1, 0, 0, 0, 1}}; +read_only global DR_ClipNode dr_nil_clip = {0, {0}}; +read_only global DR_TransparencyNode dr_nil_transparency = {0, 0}; +#define DR_BucketStackInits(b) do{\ +(b)->top_tex2d_sample_kind = &dr_nil_tex2d_sample_kind;\ +(b)->top_xform2d = &dr_nil_xform2d;\ +(b)->top_clip = &dr_nil_clip;\ +(b)->top_transparency = &dr_nil_transparency;\ +}while(0) +#if 0 +internal R_Tex2DSampleKind dr_push_tex2d_sample_kind(R_Tex2DSampleKind v); +internal Mat3x3F32 dr_push_xform2d(Mat3x3F32 v); +internal Rng2F32 dr_push_clip(Rng2F32 v); +internal F32 dr_push_transparency(F32 v); +internal R_Tex2DSampleKind dr_pop_tex2d_sample_kind(void); +internal Mat3x3F32 dr_pop_xform2d(void); +internal Rng2F32 dr_pop_clip(void); +internal F32 dr_pop_transparency(void); +internal R_Tex2DSampleKind dr_top_tex2d_sample_kind(void); +internal Mat3x3F32 dr_top_xform2d(void); +internal Rng2F32 dr_top_clip(void); +internal F32 dr_top_transparency(void); +#endif +#if 0 +#define DR_Tex2DSampleKindScope(v) DeferLoop(dr_push_tex2d_sample_kind(v), dr_pop_tex2d_sample_kind()) +#define DR_XForm2DScope(v) DeferLoop(dr_push_xform2d(v), dr_pop_xform2d()) +#define DR_ClipScope(v) DeferLoop(dr_push_clip(v), dr_pop_clip()) +#define DR_TransparencyScope(v) DeferLoop(dr_push_transparency(v), dr_pop_transparency()) +#endif +#endif // DRAW_META_H diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index caab4db9..e3af8aa3 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -1,272 +1,272 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 e_token_kind_strings[7] = -{ -str8_lit_comp("Null"), -str8_lit_comp("Identifier"), -str8_lit_comp("Numeric"), -str8_lit_comp("StringLiteral"), -str8_lit_comp("CharLiteral"), -str8_lit_comp("Symbol"), -str8_lit_comp("Comment"), -}; - -String8 e_type_kind_basic_string_table[61] = -{ -str8_lit_comp(""), -str8_lit_comp("void"), -str8_lit_comp("HANDLE"), -str8_lit_comp("HRESULT"), -str8_lit_comp("char8"), -str8_lit_comp("char16"), -str8_lit_comp("char32"), -str8_lit_comp("uchar8"), -str8_lit_comp("uchar16"), -str8_lit_comp("uchar32"), -str8_lit_comp("uint8"), -str8_lit_comp("uint16"), -str8_lit_comp("uint32"), -str8_lit_comp("uint64"), -str8_lit_comp("uint128"), -str8_lit_comp("uint256"), -str8_lit_comp("uint512"), -str8_lit_comp("int8"), -str8_lit_comp("int16"), -str8_lit_comp("int32"), -str8_lit_comp("int64"), -str8_lit_comp("int128"), -str8_lit_comp("int256"), -str8_lit_comp("int512"), -str8_lit_comp("bool"), -str8_lit_comp("float16"), -str8_lit_comp("float32"), -str8_lit_comp("float32PP"), -str8_lit_comp("float48"), -str8_lit_comp("float64"), -str8_lit_comp("float80"), -str8_lit_comp("float128"), -str8_lit_comp("complex_float32"), -str8_lit_comp("complex_float64"), -str8_lit_comp("complex_float80"), -str8_lit_comp("complex_float128"), -str8_lit_comp("modifier"), -str8_lit_comp("ptr"), -str8_lit_comp("lref"), -str8_lit_comp("rref"), -str8_lit_comp("array"), -str8_lit_comp("function"), -str8_lit_comp("method"), -str8_lit_comp("member_ptr"), -str8_lit_comp("struct"), -str8_lit_comp("class"), -str8_lit_comp("union"), -str8_lit_comp("enum"), -str8_lit_comp("typedef"), -str8_lit_comp("struct"), -str8_lit_comp("union"), -str8_lit_comp("class"), -str8_lit_comp("enum"), -str8_lit_comp("bitfield"), -str8_lit_comp("variadic"), -str8_lit_comp("set"), -str8_lit_comp("lens"), -str8_lit_comp("lens_spec"), -str8_lit_comp("meta_expr"), -str8_lit_comp("meta_display_name"), -str8_lit_comp("meta_description"), -}; - -U8 e_type_kind_basic_byte_size_table[61] = -{ -0, -0, -0xFF, -4, -1, -2, -4, -1, -2, -4, -1, -2, -4, -8, -16, -32, -64, -1, -2, -4, -8, -16, -32, -64, -1, -2, -4, -4, -6, -8, -10, -16, -8, -16, -20, -32, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -}; - -String8 e_expr_kind_strings[50] = -{ -str8_lit_comp("Nil"), -str8_lit_comp("Ref"), -str8_lit_comp("ArrayIndex"), -str8_lit_comp("MemberAccess"), -str8_lit_comp("Deref"), -str8_lit_comp("Address"), -str8_lit_comp("Cast"), -str8_lit_comp("Sizeof"), -str8_lit_comp("Typeof"), -str8_lit_comp("Symbolof"), -str8_lit_comp("ByteSwap"), -str8_lit_comp("Pos"), -str8_lit_comp("Neg"), -str8_lit_comp("LogNot"), -str8_lit_comp("BitNot"), -str8_lit_comp("Mul"), -str8_lit_comp("Div"), -str8_lit_comp("Mod"), -str8_lit_comp("Add"), -str8_lit_comp("Sub"), -str8_lit_comp("LShift"), -str8_lit_comp("RShift"), -str8_lit_comp("Less"), -str8_lit_comp("LsEq"), -str8_lit_comp("Grtr"), -str8_lit_comp("GrEq"), -str8_lit_comp("EqEq"), -str8_lit_comp("NtEq"), -str8_lit_comp("BitAnd"), -str8_lit_comp("BitXor"), -str8_lit_comp("BitOr"), -str8_lit_comp("LogAnd"), -str8_lit_comp("LogOr"), -str8_lit_comp("Ternary"), -str8_lit_comp("Call"), -str8_lit_comp("LeafBytecode"), -str8_lit_comp("LeafStringLiteral"), -str8_lit_comp("LeafU64"), -str8_lit_comp("LeafF64"), -str8_lit_comp("LeafF32"), -str8_lit_comp("LeafIdentifier"), -str8_lit_comp("LeafOffset"), -str8_lit_comp("LeafValue"), -str8_lit_comp("LeafFilePath"), -str8_lit_comp("TypeIdent"), -str8_lit_comp("Ptr"), -str8_lit_comp("Array"), -str8_lit_comp("Func"), -str8_lit_comp("Unsigned"), -str8_lit_comp("Define"), -}; - -E_OpInfo e_expr_kind_op_info_table[50] = -{ -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("["), str8_lit_comp("]"), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 1, str8_lit_comp("cast("), str8_lit_comp(")"), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("sizeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("typeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("symbolof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("bswap "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("~"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" * "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" / "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" % "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp(" + "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp(" - "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(" << "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(" >> "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" < "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" <= "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" > "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" >= "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp(" == "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp(" != "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 8, str8_lit_comp(""), str8_lit_comp(" & "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 9, str8_lit_comp(""), str8_lit_comp(" ^ "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 10, str8_lit_comp(""), str8_lit_comp(" | "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 11, str8_lit_comp(""), str8_lit_comp(" && "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 12, str8_lit_comp(""), str8_lit_comp(" || "), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(" ? "), str8_lit_comp(""), str8_lit_comp(" : ") }, -{ E_OpKind_Null, 15, str8_lit_comp(""), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(", ") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp("unsigned "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp(" = "), str8_lit_comp(""), str8_lit_comp("") }, -}; - -String8 e_interpretation_code_display_strings[11] = -{ -str8_lit_comp(""), -str8_lit_comp("Cannot divide by zero."), -str8_lit_comp("Invalid operation."), -str8_lit_comp("Invalid operation types."), -str8_lit_comp("Failed memory read."), -str8_lit_comp("Failed register read."), -str8_lit_comp("Invalid frame base address."), -str8_lit_comp("Invalid module base address."), -str8_lit_comp("Invalid thread-local storage base address."), -str8_lit_comp("Insufficient evaluation machine stack space."), -str8_lit_comp("Malformed bytecode."), -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 e_token_kind_strings[7] = +{ +str8_lit_comp("Null"), +str8_lit_comp("Identifier"), +str8_lit_comp("Numeric"), +str8_lit_comp("StringLiteral"), +str8_lit_comp("CharLiteral"), +str8_lit_comp("Symbol"), +str8_lit_comp("Comment"), +}; + +String8 e_type_kind_basic_string_table[61] = +{ +str8_lit_comp(""), +str8_lit_comp("void"), +str8_lit_comp("HANDLE"), +str8_lit_comp("HRESULT"), +str8_lit_comp("char8"), +str8_lit_comp("char16"), +str8_lit_comp("char32"), +str8_lit_comp("uchar8"), +str8_lit_comp("uchar16"), +str8_lit_comp("uchar32"), +str8_lit_comp("uint8"), +str8_lit_comp("uint16"), +str8_lit_comp("uint32"), +str8_lit_comp("uint64"), +str8_lit_comp("uint128"), +str8_lit_comp("uint256"), +str8_lit_comp("uint512"), +str8_lit_comp("int8"), +str8_lit_comp("int16"), +str8_lit_comp("int32"), +str8_lit_comp("int64"), +str8_lit_comp("int128"), +str8_lit_comp("int256"), +str8_lit_comp("int512"), +str8_lit_comp("bool"), +str8_lit_comp("float16"), +str8_lit_comp("float32"), +str8_lit_comp("float32PP"), +str8_lit_comp("float48"), +str8_lit_comp("float64"), +str8_lit_comp("float80"), +str8_lit_comp("float128"), +str8_lit_comp("complex_float32"), +str8_lit_comp("complex_float64"), +str8_lit_comp("complex_float80"), +str8_lit_comp("complex_float128"), +str8_lit_comp("modifier"), +str8_lit_comp("ptr"), +str8_lit_comp("lref"), +str8_lit_comp("rref"), +str8_lit_comp("array"), +str8_lit_comp("function"), +str8_lit_comp("method"), +str8_lit_comp("member_ptr"), +str8_lit_comp("struct"), +str8_lit_comp("class"), +str8_lit_comp("union"), +str8_lit_comp("enum"), +str8_lit_comp("typedef"), +str8_lit_comp("struct"), +str8_lit_comp("union"), +str8_lit_comp("class"), +str8_lit_comp("enum"), +str8_lit_comp("bitfield"), +str8_lit_comp("variadic"), +str8_lit_comp("set"), +str8_lit_comp("lens"), +str8_lit_comp("lens_spec"), +str8_lit_comp("meta_expr"), +str8_lit_comp("meta_display_name"), +str8_lit_comp("meta_description"), +}; + +U8 e_type_kind_basic_byte_size_table[61] = +{ +0, +0, +0xFF, +4, +1, +2, +4, +1, +2, +4, +1, +2, +4, +8, +16, +32, +64, +1, +2, +4, +8, +16, +32, +64, +1, +2, +4, +4, +6, +8, +10, +16, +8, +16, +20, +32, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +}; + +String8 e_expr_kind_strings[50] = +{ +str8_lit_comp("Nil"), +str8_lit_comp("Ref"), +str8_lit_comp("ArrayIndex"), +str8_lit_comp("MemberAccess"), +str8_lit_comp("Deref"), +str8_lit_comp("Address"), +str8_lit_comp("Cast"), +str8_lit_comp("Sizeof"), +str8_lit_comp("Typeof"), +str8_lit_comp("Symbolof"), +str8_lit_comp("ByteSwap"), +str8_lit_comp("Pos"), +str8_lit_comp("Neg"), +str8_lit_comp("LogNot"), +str8_lit_comp("BitNot"), +str8_lit_comp("Mul"), +str8_lit_comp("Div"), +str8_lit_comp("Mod"), +str8_lit_comp("Add"), +str8_lit_comp("Sub"), +str8_lit_comp("LShift"), +str8_lit_comp("RShift"), +str8_lit_comp("Less"), +str8_lit_comp("LsEq"), +str8_lit_comp("Grtr"), +str8_lit_comp("GrEq"), +str8_lit_comp("EqEq"), +str8_lit_comp("NtEq"), +str8_lit_comp("BitAnd"), +str8_lit_comp("BitXor"), +str8_lit_comp("BitOr"), +str8_lit_comp("LogAnd"), +str8_lit_comp("LogOr"), +str8_lit_comp("Ternary"), +str8_lit_comp("Call"), +str8_lit_comp("LeafBytecode"), +str8_lit_comp("LeafStringLiteral"), +str8_lit_comp("LeafU64"), +str8_lit_comp("LeafF64"), +str8_lit_comp("LeafF32"), +str8_lit_comp("LeafIdentifier"), +str8_lit_comp("LeafOffset"), +str8_lit_comp("LeafValue"), +str8_lit_comp("LeafFilePath"), +str8_lit_comp("TypeIdent"), +str8_lit_comp("Ptr"), +str8_lit_comp("Array"), +str8_lit_comp("Func"), +str8_lit_comp("Unsigned"), +str8_lit_comp("Define"), +}; + +E_OpInfo e_expr_kind_op_info_table[50] = +{ +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("["), str8_lit_comp("]"), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 1, str8_lit_comp("cast("), str8_lit_comp(")"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("sizeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("typeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("symbolof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("bswap "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 2, str8_lit_comp("~"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" * "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" / "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 3, str8_lit_comp(""), str8_lit_comp(" % "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp(" + "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 4, str8_lit_comp(""), str8_lit_comp(" - "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(" << "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(" >> "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" < "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" <= "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" > "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(" >= "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp(" == "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 7, str8_lit_comp(""), str8_lit_comp(" != "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 8, str8_lit_comp(""), str8_lit_comp(" & "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 9, str8_lit_comp(""), str8_lit_comp(" ^ "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 10, str8_lit_comp(""), str8_lit_comp(" | "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 11, str8_lit_comp(""), str8_lit_comp(" && "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 12, str8_lit_comp(""), str8_lit_comp(" || "), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(" ? "), str8_lit_comp(""), str8_lit_comp(" : ") }, +{ E_OpKind_Null, 15, str8_lit_comp(""), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(", ") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Null, 0, str8_lit_comp("unsigned "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp(" = "), str8_lit_comp(""), str8_lit_comp("") }, +}; + +String8 e_interpretation_code_display_strings[11] = +{ +str8_lit_comp(""), +str8_lit_comp("Cannot divide by zero."), +str8_lit_comp("Invalid operation."), +str8_lit_comp("Invalid operation types."), +str8_lit_comp("Failed memory read."), +str8_lit_comp("Failed register read."), +str8_lit_comp("Invalid frame base address."), +str8_lit_comp("Invalid module base address."), +str8_lit_comp("Invalid thread-local storage base address."), +str8_lit_comp("Insufficient evaluation machine stack space."), +str8_lit_comp("Malformed bytecode."), +}; + +C_LINKAGE_END + diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 65847eb1..03a7d5b7 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -1,181 +1,181 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef EVAL_META_H -#define EVAL_META_H - -typedef enum E_TokenKind -{ -E_TokenKind_Null, -E_TokenKind_Identifier, -E_TokenKind_Numeric, -E_TokenKind_StringLiteral, -E_TokenKind_CharLiteral, -E_TokenKind_Symbol, -E_TokenKind_Comment, -E_TokenKind_COUNT, -} E_TokenKind; - -typedef enum E_TypeKind -{ -E_TypeKind_Null, -E_TypeKind_Void, -E_TypeKind_Handle, -E_TypeKind_HResult, -E_TypeKind_Char8, -E_TypeKind_Char16, -E_TypeKind_Char32, -E_TypeKind_UChar8, -E_TypeKind_UChar16, -E_TypeKind_UChar32, -E_TypeKind_U8, -E_TypeKind_U16, -E_TypeKind_U32, -E_TypeKind_U64, -E_TypeKind_U128, -E_TypeKind_U256, -E_TypeKind_U512, -E_TypeKind_S8, -E_TypeKind_S16, -E_TypeKind_S32, -E_TypeKind_S64, -E_TypeKind_S128, -E_TypeKind_S256, -E_TypeKind_S512, -E_TypeKind_Bool, -E_TypeKind_F16, -E_TypeKind_F32, -E_TypeKind_F32PP, -E_TypeKind_F48, -E_TypeKind_F64, -E_TypeKind_F80, -E_TypeKind_F128, -E_TypeKind_ComplexF32, -E_TypeKind_ComplexF64, -E_TypeKind_ComplexF80, -E_TypeKind_ComplexF128, -E_TypeKind_Modifier, -E_TypeKind_Ptr, -E_TypeKind_LRef, -E_TypeKind_RRef, -E_TypeKind_Array, -E_TypeKind_Function, -E_TypeKind_Method, -E_TypeKind_MemberPtr, -E_TypeKind_Struct, -E_TypeKind_Class, -E_TypeKind_Union, -E_TypeKind_Enum, -E_TypeKind_Alias, -E_TypeKind_IncompleteStruct, -E_TypeKind_IncompleteUnion, -E_TypeKind_IncompleteClass, -E_TypeKind_IncompleteEnum, -E_TypeKind_Bitfield, -E_TypeKind_Variadic, -E_TypeKind_Set, -E_TypeKind_Lens, -E_TypeKind_LensSpec, -E_TypeKind_MetaExpr, -E_TypeKind_MetaDisplayName, -E_TypeKind_MetaDescription, -E_TypeKind_COUNT, -E_TypeKind_FirstBasic = E_TypeKind_Void, -E_TypeKind_LastBasic = E_TypeKind_ComplexF128, -E_TypeKind_FirstInteger = E_TypeKind_Char8, -E_TypeKind_LastInteger = E_TypeKind_S512, -E_TypeKind_FirstSigned1 = E_TypeKind_Char8, -E_TypeKind_LastSigned1 = E_TypeKind_Char32, -E_TypeKind_FirstSigned2 = E_TypeKind_S8, -E_TypeKind_LastSigned2 = E_TypeKind_S512, -E_TypeKind_FirstIncomplete = E_TypeKind_IncompleteStruct, -E_TypeKind_LastIncomplete = E_TypeKind_IncompleteEnum, -E_TypeKind_FirstMeta = E_TypeKind_MetaExpr, -E_TypeKind_LastMeta = E_TypeKind_MetaDescription, -} E_TypeKind; - -typedef U32 E_ExprKind; -typedef enum E_ExprKindEnum -{ -E_ExprKind_Nil, -E_ExprKind_Ref, -E_ExprKind_ArrayIndex, -E_ExprKind_MemberAccess, -E_ExprKind_Deref, -E_ExprKind_Address, -E_ExprKind_Cast, -E_ExprKind_Sizeof, -E_ExprKind_Typeof, -E_ExprKind_Symbolof, -E_ExprKind_ByteSwap, -E_ExprKind_Pos, -E_ExprKind_Neg, -E_ExprKind_LogNot, -E_ExprKind_BitNot, -E_ExprKind_Mul, -E_ExprKind_Div, -E_ExprKind_Mod, -E_ExprKind_Add, -E_ExprKind_Sub, -E_ExprKind_LShift, -E_ExprKind_RShift, -E_ExprKind_Less, -E_ExprKind_LsEq, -E_ExprKind_Grtr, -E_ExprKind_GrEq, -E_ExprKind_EqEq, -E_ExprKind_NtEq, -E_ExprKind_BitAnd, -E_ExprKind_BitXor, -E_ExprKind_BitOr, -E_ExprKind_LogAnd, -E_ExprKind_LogOr, -E_ExprKind_Ternary, -E_ExprKind_Call, -E_ExprKind_LeafBytecode, -E_ExprKind_LeafStringLiteral, -E_ExprKind_LeafU64, -E_ExprKind_LeafF64, -E_ExprKind_LeafF32, -E_ExprKind_LeafIdentifier, -E_ExprKind_LeafOffset, -E_ExprKind_LeafValue, -E_ExprKind_LeafFilePath, -E_ExprKind_TypeIdent, -E_ExprKind_Ptr, -E_ExprKind_Array, -E_ExprKind_Func, -E_ExprKind_Unsigned, -E_ExprKind_Define, -E_ExprKind_COUNT, -} E_ExprKindEnum; - -typedef enum E_InterpretationCode -{ -E_InterpretationCode_Good, -E_InterpretationCode_DivideByZero, -E_InterpretationCode_BadOp, -E_InterpretationCode_BadOpTypes, -E_InterpretationCode_BadMemRead, -E_InterpretationCode_BadRegRead, -E_InterpretationCode_BadFrameBase, -E_InterpretationCode_BadModuleBase, -E_InterpretationCode_BadTLSBase, -E_InterpretationCode_InsufficientStackSpace, -E_InterpretationCode_MalformedBytecode, -E_InterpretationCode_COUNT, -} E_InterpretationCode; - -C_LINKAGE_BEGIN -extern String8 e_token_kind_strings[7]; -extern String8 e_type_kind_basic_string_table[61]; -extern U8 e_type_kind_basic_byte_size_table[61]; -extern String8 e_expr_kind_strings[50]; -extern E_OpInfo e_expr_kind_op_info_table[50]; -extern String8 e_interpretation_code_display_strings[11]; - -C_LINKAGE_END - -#endif // EVAL_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef EVAL_META_H +#define EVAL_META_H + +typedef enum E_TokenKind +{ +E_TokenKind_Null, +E_TokenKind_Identifier, +E_TokenKind_Numeric, +E_TokenKind_StringLiteral, +E_TokenKind_CharLiteral, +E_TokenKind_Symbol, +E_TokenKind_Comment, +E_TokenKind_COUNT, +} E_TokenKind; + +typedef enum E_TypeKind +{ +E_TypeKind_Null, +E_TypeKind_Void, +E_TypeKind_Handle, +E_TypeKind_HResult, +E_TypeKind_Char8, +E_TypeKind_Char16, +E_TypeKind_Char32, +E_TypeKind_UChar8, +E_TypeKind_UChar16, +E_TypeKind_UChar32, +E_TypeKind_U8, +E_TypeKind_U16, +E_TypeKind_U32, +E_TypeKind_U64, +E_TypeKind_U128, +E_TypeKind_U256, +E_TypeKind_U512, +E_TypeKind_S8, +E_TypeKind_S16, +E_TypeKind_S32, +E_TypeKind_S64, +E_TypeKind_S128, +E_TypeKind_S256, +E_TypeKind_S512, +E_TypeKind_Bool, +E_TypeKind_F16, +E_TypeKind_F32, +E_TypeKind_F32PP, +E_TypeKind_F48, +E_TypeKind_F64, +E_TypeKind_F80, +E_TypeKind_F128, +E_TypeKind_ComplexF32, +E_TypeKind_ComplexF64, +E_TypeKind_ComplexF80, +E_TypeKind_ComplexF128, +E_TypeKind_Modifier, +E_TypeKind_Ptr, +E_TypeKind_LRef, +E_TypeKind_RRef, +E_TypeKind_Array, +E_TypeKind_Function, +E_TypeKind_Method, +E_TypeKind_MemberPtr, +E_TypeKind_Struct, +E_TypeKind_Class, +E_TypeKind_Union, +E_TypeKind_Enum, +E_TypeKind_Alias, +E_TypeKind_IncompleteStruct, +E_TypeKind_IncompleteUnion, +E_TypeKind_IncompleteClass, +E_TypeKind_IncompleteEnum, +E_TypeKind_Bitfield, +E_TypeKind_Variadic, +E_TypeKind_Set, +E_TypeKind_Lens, +E_TypeKind_LensSpec, +E_TypeKind_MetaExpr, +E_TypeKind_MetaDisplayName, +E_TypeKind_MetaDescription, +E_TypeKind_COUNT, +E_TypeKind_FirstBasic = E_TypeKind_Void, +E_TypeKind_LastBasic = E_TypeKind_ComplexF128, +E_TypeKind_FirstInteger = E_TypeKind_Char8, +E_TypeKind_LastInteger = E_TypeKind_S512, +E_TypeKind_FirstSigned1 = E_TypeKind_Char8, +E_TypeKind_LastSigned1 = E_TypeKind_Char32, +E_TypeKind_FirstSigned2 = E_TypeKind_S8, +E_TypeKind_LastSigned2 = E_TypeKind_S512, +E_TypeKind_FirstIncomplete = E_TypeKind_IncompleteStruct, +E_TypeKind_LastIncomplete = E_TypeKind_IncompleteEnum, +E_TypeKind_FirstMeta = E_TypeKind_MetaExpr, +E_TypeKind_LastMeta = E_TypeKind_MetaDescription, +} E_TypeKind; + +typedef U32 E_ExprKind; +typedef enum E_ExprKindEnum +{ +E_ExprKind_Nil, +E_ExprKind_Ref, +E_ExprKind_ArrayIndex, +E_ExprKind_MemberAccess, +E_ExprKind_Deref, +E_ExprKind_Address, +E_ExprKind_Cast, +E_ExprKind_Sizeof, +E_ExprKind_Typeof, +E_ExprKind_Symbolof, +E_ExprKind_ByteSwap, +E_ExprKind_Pos, +E_ExprKind_Neg, +E_ExprKind_LogNot, +E_ExprKind_BitNot, +E_ExprKind_Mul, +E_ExprKind_Div, +E_ExprKind_Mod, +E_ExprKind_Add, +E_ExprKind_Sub, +E_ExprKind_LShift, +E_ExprKind_RShift, +E_ExprKind_Less, +E_ExprKind_LsEq, +E_ExprKind_Grtr, +E_ExprKind_GrEq, +E_ExprKind_EqEq, +E_ExprKind_NtEq, +E_ExprKind_BitAnd, +E_ExprKind_BitXor, +E_ExprKind_BitOr, +E_ExprKind_LogAnd, +E_ExprKind_LogOr, +E_ExprKind_Ternary, +E_ExprKind_Call, +E_ExprKind_LeafBytecode, +E_ExprKind_LeafStringLiteral, +E_ExprKind_LeafU64, +E_ExprKind_LeafF64, +E_ExprKind_LeafF32, +E_ExprKind_LeafIdentifier, +E_ExprKind_LeafOffset, +E_ExprKind_LeafValue, +E_ExprKind_LeafFilePath, +E_ExprKind_TypeIdent, +E_ExprKind_Ptr, +E_ExprKind_Array, +E_ExprKind_Func, +E_ExprKind_Unsigned, +E_ExprKind_Define, +E_ExprKind_COUNT, +} E_ExprKindEnum; + +typedef enum E_InterpretationCode +{ +E_InterpretationCode_Good, +E_InterpretationCode_DivideByZero, +E_InterpretationCode_BadOp, +E_InterpretationCode_BadOpTypes, +E_InterpretationCode_BadMemRead, +E_InterpretationCode_BadRegRead, +E_InterpretationCode_BadFrameBase, +E_InterpretationCode_BadModuleBase, +E_InterpretationCode_BadTLSBase, +E_InterpretationCode_InsufficientStackSpace, +E_InterpretationCode_MalformedBytecode, +E_InterpretationCode_COUNT, +} E_InterpretationCode; + +C_LINKAGE_BEGIN +extern String8 e_token_kind_strings[7]; +extern String8 e_type_kind_basic_string_table[61]; +extern U8 e_type_kind_basic_byte_size_table[61]; +extern String8 e_expr_kind_strings[50]; +extern E_OpInfo e_expr_kind_op_info_table[50]; +extern String8 e_interpretation_code_display_strings[11]; + +C_LINKAGE_END + +#endif // EVAL_META_H diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index dcbb9c1d..c87679b5 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -1,355 +1,355 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -//~ (R)AD (D)ebug (I)nfo Format Library -// -// Defines standard RDI debug information format types and -// functions. - -#ifndef RDI_C -#define RDI_C - -RDI_U16 rdi_section_element_size_table[44] = -{ -sizeof(RDI_U8), -sizeof(RDI_TopLevelInfo), -sizeof(RDI_U8), -sizeof(RDI_U32), -sizeof(RDI_U32), -sizeof(RDI_BinarySection), -sizeof(RDI_FilePathNode), -sizeof(RDI_SourceFile), -sizeof(RDI_LineTable), -sizeof(RDI_U64), -sizeof(RDI_Line), -sizeof(RDI_Column), -sizeof(RDI_SourceLineMap), -sizeof(RDI_U32), -sizeof(RDI_U32), -sizeof(RDI_U64), -sizeof(RDI_Unit), -sizeof(RDI_VMapEntry), -sizeof(RDI_Namespace), -sizeof(RDI_TypeNode), -sizeof(RDI_UDT), -sizeof(RDI_Member), -sizeof(RDI_EnumMember), -sizeof(RDI_Scope), -sizeof(RDI_U64), -sizeof(RDI_VMapEntry), -sizeof(RDI_InlineSite), -sizeof(RDI_Symbol), -sizeof(RDI_VMapEntry), -sizeof(RDI_Symbol), -sizeof(RDI_Symbol), -sizeof(RDI_Symbol), -sizeof(RDI_Symbol), -sizeof(RDI_U8), -sizeof(RDI_U8), -sizeof(RDI_LocationSetElement), -sizeof(RDI_MD5), -sizeof(RDI_SHA1), -sizeof(RDI_SHA256), -sizeof(RDI_U64), -sizeof(RDI_NameMap), -sizeof(RDI_NameMapBucket), -sizeof(RDI_NameMapNode), -sizeof(RDI_U8), -}; - -RDI_U16 rdi_eval_op_ctrlbits_table[54] = -{ -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(2, 1, 0), -RDI_EVAL_CTRLBITS(2, 0, 0), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 1, 1), -RDI_EVAL_CTRLBITS(8, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(0, 0, 0), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(2, 0, 1), -RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(8, 0, 1), -RDI_EVAL_CTRLBITS(16, 0, 1), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(2, 2, 1), -RDI_EVAL_CTRLBITS(2, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(2, 1, 1), -RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(0, 1, 0), -RDI_EVAL_CTRLBITS(1, 0, 0), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(4, 0, 0), -RDI_EVAL_CTRLBITS(4, 0, 0), -RDI_EVAL_CTRLBITS(8, 0, 0), -RDI_EVAL_CTRLBITS(0, 2, 2), -RDI_EVAL_CTRLBITS(0, 0, 1), -RDI_EVAL_CTRLBITS(0, 0, 0), -}; - -struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[8] = -{ -{{RDI_EvalConversionKind_OtherToOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, -{{RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop}}, -}; - -struct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] = -{ -{(RDI_U8 *)"", sizeof("")}, -{(RDI_U8 *)"", sizeof("")}, -{(RDI_U8 *)"Cannot convert between these types.", sizeof("Cannot convert between these types.")}, -{(RDI_U8 *)"Cannot convert to this type.", sizeof("Cannot convert to this type.")}, -{(RDI_U8 *)"Cannot convert this type.", sizeof("Cannot convert this type.")}, -{(RDI_U8 *)"", sizeof("")}, -}; - -RDI_PROC RDI_U64 -rdi_hash(RDI_U8 *ptr, RDI_U64 size) -{ - RDI_U64 result = 0; - if(size != 0) - { - result = 5381; - RDI_U8 *opl = ptr + size; - for(;ptr < opl; ptr += 1) - { - result = ((result << 5) + result) + *ptr; - } - } - return result; -} - -RDI_PROC RDI_U8 * -rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out) -{ -RDI_U8 *result = 0; -*size_out = 0; -switch (kind) -{ -default:{}break; -case RDI_TypeKind_NULL: {result = (RDI_U8*)"NULL"; *size_out = sizeof("NULL")-1;}break; -case RDI_TypeKind_Void: {result = (RDI_U8*)"Void"; *size_out = sizeof("Void")-1;}break; -case RDI_TypeKind_Handle: {result = (RDI_U8*)"Handle"; *size_out = sizeof("Handle")-1;}break; -case RDI_TypeKind_HResult: {result = (RDI_U8*)"HResult"; *size_out = sizeof("HResult")-1;}break; -case RDI_TypeKind_Char8: {result = (RDI_U8*)"Char8"; *size_out = sizeof("Char8")-1;}break; -case RDI_TypeKind_Char16: {result = (RDI_U8*)"Char16"; *size_out = sizeof("Char16")-1;}break; -case RDI_TypeKind_Char32: {result = (RDI_U8*)"Char32"; *size_out = sizeof("Char32")-1;}break; -case RDI_TypeKind_UChar8: {result = (RDI_U8*)"UChar8"; *size_out = sizeof("UChar8")-1;}break; -case RDI_TypeKind_UChar16: {result = (RDI_U8*)"UChar16"; *size_out = sizeof("UChar16")-1;}break; -case RDI_TypeKind_UChar32: {result = (RDI_U8*)"UChar32"; *size_out = sizeof("UChar32")-1;}break; -case RDI_TypeKind_U8: {result = (RDI_U8*)"U8"; *size_out = sizeof("U8")-1;}break; -case RDI_TypeKind_U16: {result = (RDI_U8*)"U16"; *size_out = sizeof("U16")-1;}break; -case RDI_TypeKind_U32: {result = (RDI_U8*)"U32"; *size_out = sizeof("U32")-1;}break; -case RDI_TypeKind_U64: {result = (RDI_U8*)"U64"; *size_out = sizeof("U64")-1;}break; -case RDI_TypeKind_U128: {result = (RDI_U8*)"U128"; *size_out = sizeof("U128")-1;}break; -case RDI_TypeKind_U256: {result = (RDI_U8*)"U256"; *size_out = sizeof("U256")-1;}break; -case RDI_TypeKind_U512: {result = (RDI_U8*)"U512"; *size_out = sizeof("U512")-1;}break; -case RDI_TypeKind_S8: {result = (RDI_U8*)"S8"; *size_out = sizeof("S8")-1;}break; -case RDI_TypeKind_S16: {result = (RDI_U8*)"S16"; *size_out = sizeof("S16")-1;}break; -case RDI_TypeKind_S32: {result = (RDI_U8*)"S32"; *size_out = sizeof("S32")-1;}break; -case RDI_TypeKind_S64: {result = (RDI_U8*)"S64"; *size_out = sizeof("S64")-1;}break; -case RDI_TypeKind_S128: {result = (RDI_U8*)"S128"; *size_out = sizeof("S128")-1;}break; -case RDI_TypeKind_S256: {result = (RDI_U8*)"S256"; *size_out = sizeof("S256")-1;}break; -case RDI_TypeKind_S512: {result = (RDI_U8*)"S512"; *size_out = sizeof("S512")-1;}break; -case RDI_TypeKind_Bool: {result = (RDI_U8*)"Bool"; *size_out = sizeof("Bool")-1;}break; -case RDI_TypeKind_BF16: {result = (RDI_U8*)"BF16"; *size_out = sizeof("BF16")-1;}break; -case RDI_TypeKind_F16: {result = (RDI_U8*)"F16"; *size_out = sizeof("F16")-1;}break; -case RDI_TypeKind_F32: {result = (RDI_U8*)"F32"; *size_out = sizeof("F32")-1;}break; -case RDI_TypeKind_F32PP: {result = (RDI_U8*)"F32PP"; *size_out = sizeof("F32PP")-1;}break; -case RDI_TypeKind_F48: {result = (RDI_U8*)"F48"; *size_out = sizeof("F48")-1;}break; -case RDI_TypeKind_F64: {result = (RDI_U8*)"F64"; *size_out = sizeof("F64")-1;}break; -case RDI_TypeKind_F80: {result = (RDI_U8*)"F80"; *size_out = sizeof("F80")-1;}break; -case RDI_TypeKind_F96: {result = (RDI_U8*)"F96"; *size_out = sizeof("F96")-1;}break; -case RDI_TypeKind_F128: {result = (RDI_U8*)"F128"; *size_out = sizeof("F128")-1;}break; -case RDI_TypeKind_ComplexF32: {result = (RDI_U8*)"ComplexF32"; *size_out = sizeof("ComplexF32")-1;}break; -case RDI_TypeKind_ComplexF64: {result = (RDI_U8*)"ComplexF64"; *size_out = sizeof("ComplexF64")-1;}break; -case RDI_TypeKind_ComplexF80: {result = (RDI_U8*)"ComplexF80"; *size_out = sizeof("ComplexF80")-1;}break; -case RDI_TypeKind_ComplexF128: {result = (RDI_U8*)"ComplexF128"; *size_out = sizeof("ComplexF128")-1;}break; -case RDI_TypeKind_Decimal32: {result = (RDI_U8*)"Decimal32"; *size_out = sizeof("Decimal32")-1;}break; -case RDI_TypeKind_Decimal64: {result = (RDI_U8*)"Decimal64"; *size_out = sizeof("Decimal64")-1;}break; -case RDI_TypeKind_Decimal128: {result = (RDI_U8*)"Decimal128"; *size_out = sizeof("Decimal128")-1;}break; -case RDI_TypeKind_Variadic: {result = (RDI_U8*)"Variadic"; *size_out = sizeof("Variadic")-1;}break; -case RDI_TypeKind_Modifier: {result = (RDI_U8*)"Modifier"; *size_out = sizeof("Modifier")-1;}break; -case RDI_TypeKind_Ptr: {result = (RDI_U8*)"Ptr"; *size_out = sizeof("Ptr")-1;}break; -case RDI_TypeKind_LRef: {result = (RDI_U8*)"LRef"; *size_out = sizeof("LRef")-1;}break; -case RDI_TypeKind_RRef: {result = (RDI_U8*)"RRef"; *size_out = sizeof("RRef")-1;}break; -case RDI_TypeKind_Array: {result = (RDI_U8*)"Array"; *size_out = sizeof("Array")-1;}break; -case RDI_TypeKind_Function: {result = (RDI_U8*)"Function"; *size_out = sizeof("Function")-1;}break; -case RDI_TypeKind_Method: {result = (RDI_U8*)"Method"; *size_out = sizeof("Method")-1;}break; -case RDI_TypeKind_MemberPtr: {result = (RDI_U8*)"MemberPtr"; *size_out = sizeof("MemberPtr")-1;}break; -case RDI_TypeKind_Struct: {result = (RDI_U8*)"Struct"; *size_out = sizeof("Struct")-1;}break; -case RDI_TypeKind_Class: {result = (RDI_U8*)"Class"; *size_out = sizeof("Class")-1;}break; -case RDI_TypeKind_Union: {result = (RDI_U8*)"Union"; *size_out = sizeof("Union")-1;}break; -case RDI_TypeKind_Enum: {result = (RDI_U8*)"Enum"; *size_out = sizeof("Enum")-1;}break; -case RDI_TypeKind_Alias: {result = (RDI_U8*)"Alias"; *size_out = sizeof("Alias")-1;}break; -case RDI_TypeKind_IncompleteStruct: {result = (RDI_U8*)"IncompleteStruct"; *size_out = sizeof("IncompleteStruct")-1;}break; -case RDI_TypeKind_IncompleteUnion: {result = (RDI_U8*)"IncompleteUnion"; *size_out = sizeof("IncompleteUnion")-1;}break; -case RDI_TypeKind_IncompleteClass: {result = (RDI_U8*)"IncompleteClass"; *size_out = sizeof("IncompleteClass")-1;}break; -case RDI_TypeKind_IncompleteEnum: {result = (RDI_U8*)"IncompleteEnum"; *size_out = sizeof("IncompleteEnum")-1;}break; -case RDI_TypeKind_Bitfield: {result = (RDI_U8*)"Bitfield"; *size_out = sizeof("Bitfield")-1;}break; -case RDI_TypeKind_COUNT: {result = (RDI_U8*)"COUNT"; *size_out = sizeof("COUNT")-1;}break; -} -return result; -} - -RDI_PROC RDI_U32 -rdi_size_from_basic_type_kind(RDI_TypeKind kind) -{ -RDI_U32 result = 0; -switch(kind) -{ -default:{}break; -case RDI_TypeKind_Handle:{result = 0xFFFFFFFF;}break; -case RDI_TypeKind_HResult:{result = 4;}break; -case RDI_TypeKind_Char8:{result = 1;}break; -case RDI_TypeKind_Char16:{result = 2;}break; -case RDI_TypeKind_Char32:{result = 4;}break; -case RDI_TypeKind_UChar8:{result = 1;}break; -case RDI_TypeKind_UChar16:{result = 2;}break; -case RDI_TypeKind_UChar32:{result = 4;}break; -case RDI_TypeKind_U8:{result = 1;}break; -case RDI_TypeKind_U16:{result = 2;}break; -case RDI_TypeKind_U32:{result = 4;}break; -case RDI_TypeKind_U64:{result = 8;}break; -case RDI_TypeKind_U128:{result = 16;}break; -case RDI_TypeKind_U256:{result = 32;}break; -case RDI_TypeKind_U512:{result = 64;}break; -case RDI_TypeKind_S8:{result = 1;}break; -case RDI_TypeKind_S16:{result = 2;}break; -case RDI_TypeKind_S32:{result = 4;}break; -case RDI_TypeKind_S64:{result = 8;}break; -case RDI_TypeKind_S128:{result = 16;}break; -case RDI_TypeKind_S256:{result = 32;}break; -case RDI_TypeKind_S512:{result = 64;}break; -case RDI_TypeKind_Bool:{result = 1;}break; -case RDI_TypeKind_BF16:{result = 2;}break; -case RDI_TypeKind_F16:{result = 2;}break; -case RDI_TypeKind_F32:{result = 4;}break; -case RDI_TypeKind_F32PP:{result = 4;}break; -case RDI_TypeKind_F48:{result = 6;}break; -case RDI_TypeKind_F64:{result = 8;}break; -case RDI_TypeKind_F80:{result = 10;}break; -case RDI_TypeKind_F96:{result = 12;}break; -case RDI_TypeKind_F128:{result = 16;}break; -case RDI_TypeKind_ComplexF32:{result = 8;}break; -case RDI_TypeKind_ComplexF64:{result = 16;}break; -case RDI_TypeKind_ComplexF80:{result = 20;}break; -case RDI_TypeKind_ComplexF128:{result = 32;}break; -case RDI_TypeKind_Decimal32:{result = 4;}break; -case RDI_TypeKind_Decimal64:{result = 8;}break; -case RDI_TypeKind_Decimal128:{result = 16;}break; -} -return result; -} - -RDI_PROC RDI_U32 -rdi_addr_size_from_arch(RDI_Arch arch) -{ -RDI_U32 result = 0; -switch(arch) -{ -default:{}break; -case RDI_Arch_X64:{result = 8;}break; -case RDI_Arch_X86:{result = 4;}break; -} -return result; -} - -RDI_PROC RDI_EvalConversionKind -rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out) -{ - RDI_EvalConversionKind k = rdi_eval_typegroup_conversion_kind_matrix[in].dst_typegroups[out]; - return k; -} - -RDI_PROC RDI_S32 -rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group) -{ - RDI_S32 result = 0; - switch(op) - { - case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub: - case RDI_EvalOp_Mul: case RDI_EvalOp_Div: - case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq: - case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq: - case RDI_EvalOp_Less:case RDI_EvalOp_Grtr: - { - if(group != RDI_EvalTypeGroup_Other) - { - result = 1; - } - }break; - case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift: - case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor: - case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd: - case RDI_EvalOp_LogOr: - { - if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U) - { - result = 1; - } - }break; - } - return result; -} - -RDI_PROC RDI_U8 * -rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out) -{ - *size_out = rdi_eval_conversion_kind_message_string_table[kind].size; - return rdi_eval_conversion_kind_message_string_table[kind].str; -} - -RDI_PROC RDI_SectionKind -rdi_section_kind_from_checksum_kind(RDI_ChecksumKind kind) -{ -RDI_SectionKind result = 0; -switch(kind) -{ -default:{}break; -case RDI_ChecksumKind_NULL:{result = RDI_SectionKind_NULL;}break; -case RDI_ChecksumKind_MD5:{result = RDI_SectionKind_MD5Checksums;}break; -case RDI_ChecksumKind_SHA1:{result = RDI_SectionKind_SHA1Checksums;}break; -case RDI_ChecksumKind_SHA256:{result = RDI_SectionKind_SHA256Checksums;}break; -case RDI_ChecksumKind_Timestamp:{result = RDI_SectionKind_Timestamps;}break; -case RDI_ChecksumKind_COUNT:{result = RDI_SectionKind_NULL;}break; -} -return result; -} - -#endif // RDI_C +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ (R)AD (D)ebug (I)nfo Format Library +// +// Defines standard RDI debug information format types and +// functions. + +#ifndef RDI_C +#define RDI_C + +RDI_U16 rdi_section_element_size_table[44] = +{ +sizeof(RDI_U8), +sizeof(RDI_TopLevelInfo), +sizeof(RDI_U8), +sizeof(RDI_U32), +sizeof(RDI_U32), +sizeof(RDI_BinarySection), +sizeof(RDI_FilePathNode), +sizeof(RDI_SourceFile), +sizeof(RDI_LineTable), +sizeof(RDI_U64), +sizeof(RDI_Line), +sizeof(RDI_Column), +sizeof(RDI_SourceLineMap), +sizeof(RDI_U32), +sizeof(RDI_U32), +sizeof(RDI_U64), +sizeof(RDI_Unit), +sizeof(RDI_VMapEntry), +sizeof(RDI_Namespace), +sizeof(RDI_TypeNode), +sizeof(RDI_UDT), +sizeof(RDI_Member), +sizeof(RDI_EnumMember), +sizeof(RDI_Scope), +sizeof(RDI_U64), +sizeof(RDI_VMapEntry), +sizeof(RDI_InlineSite), +sizeof(RDI_Symbol), +sizeof(RDI_VMapEntry), +sizeof(RDI_Symbol), +sizeof(RDI_Symbol), +sizeof(RDI_Symbol), +sizeof(RDI_Symbol), +sizeof(RDI_U8), +sizeof(RDI_U8), +sizeof(RDI_LocationSetElement), +sizeof(RDI_MD5), +sizeof(RDI_SHA1), +sizeof(RDI_SHA256), +sizeof(RDI_U64), +sizeof(RDI_NameMap), +sizeof(RDI_NameMapBucket), +sizeof(RDI_NameMapNode), +sizeof(RDI_U8), +}; + +RDI_U16 rdi_eval_op_ctrlbits_table[54] = +{ +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(2, 1, 0), +RDI_EVAL_CTRLBITS(2, 0, 0), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(0, 1, 1), +RDI_EVAL_CTRLBITS(8, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(0, 0, 0), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(2, 0, 1), +RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(8, 0, 1), +RDI_EVAL_CTRLBITS(16, 0, 1), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(2, 1, 1), +RDI_EVAL_CTRLBITS(1, 0, 1), +RDI_EVAL_CTRLBITS(0, 1, 0), +RDI_EVAL_CTRLBITS(1, 0, 0), +RDI_EVAL_CTRLBITS(1, 2, 1), +RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(4, 0, 0), +RDI_EVAL_CTRLBITS(4, 0, 0), +RDI_EVAL_CTRLBITS(8, 0, 0), +RDI_EVAL_CTRLBITS(0, 2, 2), +RDI_EVAL_CTRLBITS(0, 0, 1), +RDI_EVAL_CTRLBITS(0, 0, 0), +}; + +struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[8] = +{ +{{RDI_EvalConversionKind_OtherToOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}}, +{{RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop}}, +}; + +struct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] = +{ +{(RDI_U8 *)"", sizeof("")}, +{(RDI_U8 *)"", sizeof("")}, +{(RDI_U8 *)"Cannot convert between these types.", sizeof("Cannot convert between these types.")}, +{(RDI_U8 *)"Cannot convert to this type.", sizeof("Cannot convert to this type.")}, +{(RDI_U8 *)"Cannot convert this type.", sizeof("Cannot convert this type.")}, +{(RDI_U8 *)"", sizeof("")}, +}; + +RDI_PROC RDI_U64 +rdi_hash(RDI_U8 *ptr, RDI_U64 size) +{ + RDI_U64 result = 0; + if(size != 0) + { + result = 5381; + RDI_U8 *opl = ptr + size; + for(;ptr < opl; ptr += 1) + { + result = ((result << 5) + result) + *ptr; + } + } + return result; +} + +RDI_PROC RDI_U8 * +rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out) +{ +RDI_U8 *result = 0; +*size_out = 0; +switch (kind) +{ +default:{}break; +case RDI_TypeKind_NULL: {result = (RDI_U8*)"NULL"; *size_out = sizeof("NULL")-1;}break; +case RDI_TypeKind_Void: {result = (RDI_U8*)"Void"; *size_out = sizeof("Void")-1;}break; +case RDI_TypeKind_Handle: {result = (RDI_U8*)"Handle"; *size_out = sizeof("Handle")-1;}break; +case RDI_TypeKind_HResult: {result = (RDI_U8*)"HResult"; *size_out = sizeof("HResult")-1;}break; +case RDI_TypeKind_Char8: {result = (RDI_U8*)"Char8"; *size_out = sizeof("Char8")-1;}break; +case RDI_TypeKind_Char16: {result = (RDI_U8*)"Char16"; *size_out = sizeof("Char16")-1;}break; +case RDI_TypeKind_Char32: {result = (RDI_U8*)"Char32"; *size_out = sizeof("Char32")-1;}break; +case RDI_TypeKind_UChar8: {result = (RDI_U8*)"UChar8"; *size_out = sizeof("UChar8")-1;}break; +case RDI_TypeKind_UChar16: {result = (RDI_U8*)"UChar16"; *size_out = sizeof("UChar16")-1;}break; +case RDI_TypeKind_UChar32: {result = (RDI_U8*)"UChar32"; *size_out = sizeof("UChar32")-1;}break; +case RDI_TypeKind_U8: {result = (RDI_U8*)"U8"; *size_out = sizeof("U8")-1;}break; +case RDI_TypeKind_U16: {result = (RDI_U8*)"U16"; *size_out = sizeof("U16")-1;}break; +case RDI_TypeKind_U32: {result = (RDI_U8*)"U32"; *size_out = sizeof("U32")-1;}break; +case RDI_TypeKind_U64: {result = (RDI_U8*)"U64"; *size_out = sizeof("U64")-1;}break; +case RDI_TypeKind_U128: {result = (RDI_U8*)"U128"; *size_out = sizeof("U128")-1;}break; +case RDI_TypeKind_U256: {result = (RDI_U8*)"U256"; *size_out = sizeof("U256")-1;}break; +case RDI_TypeKind_U512: {result = (RDI_U8*)"U512"; *size_out = sizeof("U512")-1;}break; +case RDI_TypeKind_S8: {result = (RDI_U8*)"S8"; *size_out = sizeof("S8")-1;}break; +case RDI_TypeKind_S16: {result = (RDI_U8*)"S16"; *size_out = sizeof("S16")-1;}break; +case RDI_TypeKind_S32: {result = (RDI_U8*)"S32"; *size_out = sizeof("S32")-1;}break; +case RDI_TypeKind_S64: {result = (RDI_U8*)"S64"; *size_out = sizeof("S64")-1;}break; +case RDI_TypeKind_S128: {result = (RDI_U8*)"S128"; *size_out = sizeof("S128")-1;}break; +case RDI_TypeKind_S256: {result = (RDI_U8*)"S256"; *size_out = sizeof("S256")-1;}break; +case RDI_TypeKind_S512: {result = (RDI_U8*)"S512"; *size_out = sizeof("S512")-1;}break; +case RDI_TypeKind_Bool: {result = (RDI_U8*)"Bool"; *size_out = sizeof("Bool")-1;}break; +case RDI_TypeKind_BF16: {result = (RDI_U8*)"BF16"; *size_out = sizeof("BF16")-1;}break; +case RDI_TypeKind_F16: {result = (RDI_U8*)"F16"; *size_out = sizeof("F16")-1;}break; +case RDI_TypeKind_F32: {result = (RDI_U8*)"F32"; *size_out = sizeof("F32")-1;}break; +case RDI_TypeKind_F32PP: {result = (RDI_U8*)"F32PP"; *size_out = sizeof("F32PP")-1;}break; +case RDI_TypeKind_F48: {result = (RDI_U8*)"F48"; *size_out = sizeof("F48")-1;}break; +case RDI_TypeKind_F64: {result = (RDI_U8*)"F64"; *size_out = sizeof("F64")-1;}break; +case RDI_TypeKind_F80: {result = (RDI_U8*)"F80"; *size_out = sizeof("F80")-1;}break; +case RDI_TypeKind_F96: {result = (RDI_U8*)"F96"; *size_out = sizeof("F96")-1;}break; +case RDI_TypeKind_F128: {result = (RDI_U8*)"F128"; *size_out = sizeof("F128")-1;}break; +case RDI_TypeKind_ComplexF32: {result = (RDI_U8*)"ComplexF32"; *size_out = sizeof("ComplexF32")-1;}break; +case RDI_TypeKind_ComplexF64: {result = (RDI_U8*)"ComplexF64"; *size_out = sizeof("ComplexF64")-1;}break; +case RDI_TypeKind_ComplexF80: {result = (RDI_U8*)"ComplexF80"; *size_out = sizeof("ComplexF80")-1;}break; +case RDI_TypeKind_ComplexF128: {result = (RDI_U8*)"ComplexF128"; *size_out = sizeof("ComplexF128")-1;}break; +case RDI_TypeKind_Decimal32: {result = (RDI_U8*)"Decimal32"; *size_out = sizeof("Decimal32")-1;}break; +case RDI_TypeKind_Decimal64: {result = (RDI_U8*)"Decimal64"; *size_out = sizeof("Decimal64")-1;}break; +case RDI_TypeKind_Decimal128: {result = (RDI_U8*)"Decimal128"; *size_out = sizeof("Decimal128")-1;}break; +case RDI_TypeKind_Variadic: {result = (RDI_U8*)"Variadic"; *size_out = sizeof("Variadic")-1;}break; +case RDI_TypeKind_Modifier: {result = (RDI_U8*)"Modifier"; *size_out = sizeof("Modifier")-1;}break; +case RDI_TypeKind_Ptr: {result = (RDI_U8*)"Ptr"; *size_out = sizeof("Ptr")-1;}break; +case RDI_TypeKind_LRef: {result = (RDI_U8*)"LRef"; *size_out = sizeof("LRef")-1;}break; +case RDI_TypeKind_RRef: {result = (RDI_U8*)"RRef"; *size_out = sizeof("RRef")-1;}break; +case RDI_TypeKind_Array: {result = (RDI_U8*)"Array"; *size_out = sizeof("Array")-1;}break; +case RDI_TypeKind_Function: {result = (RDI_U8*)"Function"; *size_out = sizeof("Function")-1;}break; +case RDI_TypeKind_Method: {result = (RDI_U8*)"Method"; *size_out = sizeof("Method")-1;}break; +case RDI_TypeKind_MemberPtr: {result = (RDI_U8*)"MemberPtr"; *size_out = sizeof("MemberPtr")-1;}break; +case RDI_TypeKind_Struct: {result = (RDI_U8*)"Struct"; *size_out = sizeof("Struct")-1;}break; +case RDI_TypeKind_Class: {result = (RDI_U8*)"Class"; *size_out = sizeof("Class")-1;}break; +case RDI_TypeKind_Union: {result = (RDI_U8*)"Union"; *size_out = sizeof("Union")-1;}break; +case RDI_TypeKind_Enum: {result = (RDI_U8*)"Enum"; *size_out = sizeof("Enum")-1;}break; +case RDI_TypeKind_Alias: {result = (RDI_U8*)"Alias"; *size_out = sizeof("Alias")-1;}break; +case RDI_TypeKind_IncompleteStruct: {result = (RDI_U8*)"IncompleteStruct"; *size_out = sizeof("IncompleteStruct")-1;}break; +case RDI_TypeKind_IncompleteUnion: {result = (RDI_U8*)"IncompleteUnion"; *size_out = sizeof("IncompleteUnion")-1;}break; +case RDI_TypeKind_IncompleteClass: {result = (RDI_U8*)"IncompleteClass"; *size_out = sizeof("IncompleteClass")-1;}break; +case RDI_TypeKind_IncompleteEnum: {result = (RDI_U8*)"IncompleteEnum"; *size_out = sizeof("IncompleteEnum")-1;}break; +case RDI_TypeKind_Bitfield: {result = (RDI_U8*)"Bitfield"; *size_out = sizeof("Bitfield")-1;}break; +case RDI_TypeKind_COUNT: {result = (RDI_U8*)"COUNT"; *size_out = sizeof("COUNT")-1;}break; +} +return result; +} + +RDI_PROC RDI_U32 +rdi_size_from_basic_type_kind(RDI_TypeKind kind) +{ +RDI_U32 result = 0; +switch(kind) +{ +default:{}break; +case RDI_TypeKind_Handle:{result = 0xFFFFFFFF;}break; +case RDI_TypeKind_HResult:{result = 4;}break; +case RDI_TypeKind_Char8:{result = 1;}break; +case RDI_TypeKind_Char16:{result = 2;}break; +case RDI_TypeKind_Char32:{result = 4;}break; +case RDI_TypeKind_UChar8:{result = 1;}break; +case RDI_TypeKind_UChar16:{result = 2;}break; +case RDI_TypeKind_UChar32:{result = 4;}break; +case RDI_TypeKind_U8:{result = 1;}break; +case RDI_TypeKind_U16:{result = 2;}break; +case RDI_TypeKind_U32:{result = 4;}break; +case RDI_TypeKind_U64:{result = 8;}break; +case RDI_TypeKind_U128:{result = 16;}break; +case RDI_TypeKind_U256:{result = 32;}break; +case RDI_TypeKind_U512:{result = 64;}break; +case RDI_TypeKind_S8:{result = 1;}break; +case RDI_TypeKind_S16:{result = 2;}break; +case RDI_TypeKind_S32:{result = 4;}break; +case RDI_TypeKind_S64:{result = 8;}break; +case RDI_TypeKind_S128:{result = 16;}break; +case RDI_TypeKind_S256:{result = 32;}break; +case RDI_TypeKind_S512:{result = 64;}break; +case RDI_TypeKind_Bool:{result = 1;}break; +case RDI_TypeKind_BF16:{result = 2;}break; +case RDI_TypeKind_F16:{result = 2;}break; +case RDI_TypeKind_F32:{result = 4;}break; +case RDI_TypeKind_F32PP:{result = 4;}break; +case RDI_TypeKind_F48:{result = 6;}break; +case RDI_TypeKind_F64:{result = 8;}break; +case RDI_TypeKind_F80:{result = 10;}break; +case RDI_TypeKind_F96:{result = 12;}break; +case RDI_TypeKind_F128:{result = 16;}break; +case RDI_TypeKind_ComplexF32:{result = 8;}break; +case RDI_TypeKind_ComplexF64:{result = 16;}break; +case RDI_TypeKind_ComplexF80:{result = 20;}break; +case RDI_TypeKind_ComplexF128:{result = 32;}break; +case RDI_TypeKind_Decimal32:{result = 4;}break; +case RDI_TypeKind_Decimal64:{result = 8;}break; +case RDI_TypeKind_Decimal128:{result = 16;}break; +} +return result; +} + +RDI_PROC RDI_U32 +rdi_addr_size_from_arch(RDI_Arch arch) +{ +RDI_U32 result = 0; +switch(arch) +{ +default:{}break; +case RDI_Arch_X64:{result = 8;}break; +case RDI_Arch_X86:{result = 4;}break; +} +return result; +} + +RDI_PROC RDI_EvalConversionKind +rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out) +{ + RDI_EvalConversionKind k = rdi_eval_typegroup_conversion_kind_matrix[in].dst_typegroups[out]; + return k; +} + +RDI_PROC RDI_S32 +rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group) +{ + RDI_S32 result = 0; + switch(op) + { + case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub: + case RDI_EvalOp_Mul: case RDI_EvalOp_Div: + case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq: + case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq: + case RDI_EvalOp_Less:case RDI_EvalOp_Grtr: + { + if(group != RDI_EvalTypeGroup_Other) + { + result = 1; + } + }break; + case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift: + case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor: + case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd: + case RDI_EvalOp_LogOr: + { + if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U) + { + result = 1; + } + }break; + } + return result; +} + +RDI_PROC RDI_U8 * +rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out) +{ + *size_out = rdi_eval_conversion_kind_message_string_table[kind].size; + return rdi_eval_conversion_kind_message_string_table[kind].str; +} + +RDI_PROC RDI_SectionKind +rdi_section_kind_from_checksum_kind(RDI_ChecksumKind kind) +{ +RDI_SectionKind result = 0; +switch(kind) +{ +default:{}break; +case RDI_ChecksumKind_NULL:{result = RDI_SectionKind_NULL;}break; +case RDI_ChecksumKind_MD5:{result = RDI_SectionKind_MD5Checksums;}break; +case RDI_ChecksumKind_SHA1:{result = RDI_SectionKind_SHA1Checksums;}break; +case RDI_ChecksumKind_SHA256:{result = RDI_SectionKind_SHA256Checksums;}break; +case RDI_ChecksumKind_Timestamp:{result = RDI_SectionKind_Timestamps;}break; +case RDI_ChecksumKind_COUNT:{result = RDI_SectionKind_NULL;}break; +} +return result; +} + +#endif // RDI_C diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index db869bd3..17098d15 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -1,1482 +1,1482 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////////////////////////////////////// -//~ (R)AD (D)ebug (I)nfo Format Library -// -// Defines standard RDI debug information format types and -// functions. - -#ifndef RDI_H -#define RDI_H - -//////////////////////////////////////////////////////////////// -//~ Overridable Procedure Decoration - -#if !defined(RDI_PROC) -# define RDI_PROC static -#endif - -//////////////////////////////////////////////////////////////// -//~ Overridable Basic Integer Types - -#if !defined(RDI_U8) -# define RDI_U8 RDI_U8 -# define RDI_U16 RDI_U16 -# define RDI_U32 RDI_U32 -# define RDI_U64 RDI_U64 -# define RDI_S8 RDI_S8 -# define RDI_S16 RDI_S16 -# define RDI_S32 RDI_S32 -# define RDI_S64 RDI_S64 -#include -typedef uint8_t RDI_U8; -typedef uint16_t RDI_U16; -typedef uint32_t RDI_U32; -typedef uint64_t RDI_U64; -typedef int8_t RDI_S8; -typedef int16_t RDI_S16; -typedef int32_t RDI_S32; -typedef int64_t RDI_S64; -#endif - -//////////////////////////////////////////////////////////////// -//~ Checksum Types - -typedef union RDI_MD5 RDI_MD5; -union RDI_MD5 {RDI_U8 u8[16]; RDI_U64 u64[2];}; - -typedef union RDI_SHA1 RDI_SHA1; -union RDI_SHA1 {RDI_U8 u8[20];}; - -typedef union RDI_SHA256 RDI_SHA256; -union RDI_SHA256 {RDI_U8 u8[32]; RDI_U64 u64[4];}; - -typedef union RDI_GUID RDI_GUID; -union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; - -//////////////////////////////////////////////////////////////// -//~ Overridable Enabling/Disabling Of Table Index Typechecking - -#if !defined(RDI_DISABLE_TABLE_INDEX_TYPECHECKING) -# define RDI_DISABLE_TABLE_INDEX_TYPECHECKING 0 -#endif - -//////////////////////////////////////////////////////////////// -//~ Format Constants - -// "raddbg\0\0" -#define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 22 - -//////////////////////////////////////////////////////////////// -//~ Format Types & Functions - -typedef RDI_U32 RDI_SectionKind; -typedef enum RDI_SectionKindEnum -{ -RDI_SectionKind_NULL = 0x0000, -RDI_SectionKind_TopLevelInfo = 0x0001, -RDI_SectionKind_StringData = 0x0002, -RDI_SectionKind_StringTable = 0x0003, -RDI_SectionKind_IndexRuns = 0x0004, -RDI_SectionKind_BinarySections = 0x0005, -RDI_SectionKind_FilePathNodes = 0x0006, -RDI_SectionKind_SourceFiles = 0x0007, -RDI_SectionKind_LineTables = 0x0008, -RDI_SectionKind_LineInfoVOffs = 0x0009, -RDI_SectionKind_LineInfoLines = 0x000A, -RDI_SectionKind_LineInfoColumns = 0x000B, -RDI_SectionKind_SourceLineMaps = 0x000C, -RDI_SectionKind_SourceLineMapNumbers = 0x000D, -RDI_SectionKind_SourceLineMapRanges = 0x000E, -RDI_SectionKind_SourceLineMapVOffs = 0x000F, -RDI_SectionKind_Units = 0x0010, -RDI_SectionKind_UnitVMap = 0x0011, -RDI_SectionKind_Namespaces = 0x0012, -RDI_SectionKind_TypeNodes = 0x0013, -RDI_SectionKind_UDTs = 0x0014, -RDI_SectionKind_Members = 0x0015, -RDI_SectionKind_EnumMembers = 0x0016, -RDI_SectionKind_Scopes = 0x0017, -RDI_SectionKind_ScopeVOffData = 0x0018, -RDI_SectionKind_ScopeVMap = 0x0019, -RDI_SectionKind_InlineSites = 0x001A, -RDI_SectionKind_GlobalVariables = 0x001B, -RDI_SectionKind_GlobalVMap = 0x001C, -RDI_SectionKind_ThreadVariables = 0x001D, -RDI_SectionKind_Constants = 0x001E, -RDI_SectionKind_Procedures = 0x001F, -RDI_SectionKind_LocalVariables = 0x0020, -RDI_SectionKind_LocationsBytecodeData = 0x0021, -RDI_SectionKind_LocationsConstantData = 0x0022, -RDI_SectionKind_LocationsSetElements = 0x0023, -RDI_SectionKind_MD5Checksums = 0x0024, -RDI_SectionKind_SHA1Checksums = 0x0025, -RDI_SectionKind_SHA256Checksums = 0x0026, -RDI_SectionKind_Timestamps = 0x0027, -RDI_SectionKind_NameMaps = 0x0028, -RDI_SectionKind_NameMapBuckets = 0x0029, -RDI_SectionKind_NameMapNodes = 0x002A, -RDI_SectionKind_COUNT = 0x002B, -} RDI_SectionKindEnum; - -typedef RDI_U32 RDI_SectionEncoding; -typedef enum RDI_SectionEncodingEnum -{ -RDI_SectionEncoding_Unpacked = 0, -RDI_SectionEncoding_LZB = 1, -} RDI_SectionEncodingEnum; - -typedef RDI_U32 RDI_Arch; -typedef enum RDI_ArchEnum -{ -RDI_Arch_NULL = 0, -RDI_Arch_X64 = 1, -RDI_Arch_X86 = 2, -} RDI_ArchEnum; - -typedef RDI_U8 RDI_RegCode; -typedef enum RDI_RegCodeEnum -{ -RDI_RegCode_nil, -} RDI_RegCodeEnum; - -typedef RDI_U8 RDI_RegCodeX64; -typedef enum RDI_RegCodeX64Enum -{ -RDI_RegCodeX64_nil = 0, -RDI_RegCodeX64_rax = 1, -RDI_RegCodeX64_rcx = 2, -RDI_RegCodeX64_rdx = 3, -RDI_RegCodeX64_rbx = 4, -RDI_RegCodeX64_rsp = 5, -RDI_RegCodeX64_rbp = 6, -RDI_RegCodeX64_rsi = 7, -RDI_RegCodeX64_rdi = 8, -RDI_RegCodeX64_r8 = 9, -RDI_RegCodeX64_r9 = 10, -RDI_RegCodeX64_r10 = 11, -RDI_RegCodeX64_r11 = 12, -RDI_RegCodeX64_r12 = 13, -RDI_RegCodeX64_r13 = 14, -RDI_RegCodeX64_r14 = 15, -RDI_RegCodeX64_r15 = 16, -RDI_RegCodeX64_es = 17, -RDI_RegCodeX64_cs = 18, -RDI_RegCodeX64_ss = 19, -RDI_RegCodeX64_ds = 20, -RDI_RegCodeX64_fs = 21, -RDI_RegCodeX64_gs = 22, -RDI_RegCodeX64_rip = 23, -RDI_RegCodeX64_rflags = 24, -RDI_RegCodeX64_dr0 = 25, -RDI_RegCodeX64_dr1 = 26, -RDI_RegCodeX64_dr2 = 27, -RDI_RegCodeX64_dr3 = 28, -RDI_RegCodeX64_dr4 = 29, -RDI_RegCodeX64_dr5 = 30, -RDI_RegCodeX64_dr6 = 31, -RDI_RegCodeX64_dr7 = 32, -RDI_RegCodeX64_st0 = 33, -RDI_RegCodeX64_st1 = 34, -RDI_RegCodeX64_st2 = 35, -RDI_RegCodeX64_st3 = 36, -RDI_RegCodeX64_st4 = 37, -RDI_RegCodeX64_st5 = 38, -RDI_RegCodeX64_st6 = 39, -RDI_RegCodeX64_st7 = 40, -RDI_RegCodeX64_zmm0 = 41, -RDI_RegCodeX64_zmm1 = 42, -RDI_RegCodeX64_zmm2 = 43, -RDI_RegCodeX64_zmm3 = 44, -RDI_RegCodeX64_zmm4 = 45, -RDI_RegCodeX64_zmm5 = 46, -RDI_RegCodeX64_zmm6 = 47, -RDI_RegCodeX64_zmm7 = 48, -RDI_RegCodeX64_zmm8 = 49, -RDI_RegCodeX64_zmm9 = 50, -RDI_RegCodeX64_zmm10 = 51, -RDI_RegCodeX64_zmm11 = 52, -RDI_RegCodeX64_zmm12 = 53, -RDI_RegCodeX64_zmm13 = 54, -RDI_RegCodeX64_zmm14 = 55, -RDI_RegCodeX64_zmm15 = 56, -RDI_RegCodeX64_zmm16 = 57, -RDI_RegCodeX64_zmm17 = 58, -RDI_RegCodeX64_zmm18 = 59, -RDI_RegCodeX64_zmm19 = 60, -RDI_RegCodeX64_zmm20 = 61, -RDI_RegCodeX64_zmm21 = 62, -RDI_RegCodeX64_zmm22 = 63, -RDI_RegCodeX64_zmm23 = 64, -RDI_RegCodeX64_zmm24 = 65, -RDI_RegCodeX64_zmm25 = 66, -RDI_RegCodeX64_zmm26 = 67, -RDI_RegCodeX64_zmm27 = 68, -RDI_RegCodeX64_zmm28 = 69, -RDI_RegCodeX64_zmm29 = 70, -RDI_RegCodeX64_zmm30 = 71, -RDI_RegCodeX64_zmm31 = 72, -RDI_RegCodeX64_k0 = 73, -RDI_RegCodeX64_k1 = 74, -RDI_RegCodeX64_k2 = 75, -RDI_RegCodeX64_k3 = 76, -RDI_RegCodeX64_k4 = 77, -RDI_RegCodeX64_k5 = 78, -RDI_RegCodeX64_k6 = 79, -RDI_RegCodeX64_k7 = 80, -RDI_RegCodeX64_mxcsr = 81, -RDI_RegCodeX64_fsbase = 82, -RDI_RegCodeX64_gsbase = 83, -RDI_RegCodeX64_fcw = 84, -RDI_RegCodeX64_fsw = 85, -RDI_RegCodeX64_ftw = 86, -RDI_RegCodeX64_fop = 87, -RDI_RegCodeX64_fcs = 88, -RDI_RegCodeX64_fds = 89, -RDI_RegCodeX64_fip = 90, -RDI_RegCodeX64_fdp = 91, -RDI_RegCodeX64_mxcsr_mask = 92, -RDI_RegCodeX64_cetmsr = 93, -RDI_RegCodeX64_cetssp = 94, -} RDI_RegCodeX64Enum; - -typedef RDI_U32 RDI_BinarySectionFlags; -typedef enum RDI_BinarySectionFlagsEnum -{ -RDI_BinarySectionFlag_Read = 1<<0, -RDI_BinarySectionFlag_Write = 1<<1, -RDI_BinarySectionFlag_Execute = 1<<2, -} RDI_BinarySectionFlagsEnum; - -typedef RDI_U32 RDI_ChecksumKind; -typedef enum RDI_ChecksumKindEnum -{ -RDI_ChecksumKind_NULL = 0, -RDI_ChecksumKind_MD5 = 1, -RDI_ChecksumKind_SHA1 = 2, -RDI_ChecksumKind_SHA256 = 3, -RDI_ChecksumKind_Timestamp = 4, -RDI_ChecksumKind_COUNT = 5, -} RDI_ChecksumKindEnum; - -typedef RDI_U32 RDI_Language; -typedef enum RDI_LanguageEnum -{ -RDI_Language_NULL = 0, -RDI_Language_C = 1, -RDI_Language_CPlusPlus = 2, -RDI_Language_Masm = 3, -RDI_Language_COUNT = 4, -} RDI_LanguageEnum; - -typedef RDI_U16 RDI_TypeKind; -typedef enum RDI_TypeKindEnum -{ -RDI_TypeKind_NULL = 0x0000, -RDI_TypeKind_Void = 0x0001, -RDI_TypeKind_Handle = 0x0002, -RDI_TypeKind_HResult = 0x0003, -RDI_TypeKind_Char8 = 0x0004, -RDI_TypeKind_Char16 = 0x0005, -RDI_TypeKind_Char32 = 0x0006, -RDI_TypeKind_UChar8 = 0x0007, -RDI_TypeKind_UChar16 = 0x0008, -RDI_TypeKind_UChar32 = 0x0009, -RDI_TypeKind_U8 = 0x000A, -RDI_TypeKind_U16 = 0x000B, -RDI_TypeKind_U32 = 0x000C, -RDI_TypeKind_U64 = 0x000D, -RDI_TypeKind_U128 = 0x000E, -RDI_TypeKind_U256 = 0x000F, -RDI_TypeKind_U512 = 0x0010, -RDI_TypeKind_S8 = 0x0011, -RDI_TypeKind_S16 = 0x0012, -RDI_TypeKind_S32 = 0x0013, -RDI_TypeKind_S64 = 0x0014, -RDI_TypeKind_S128 = 0x0015, -RDI_TypeKind_S256 = 0x0016, -RDI_TypeKind_S512 = 0x0017, -RDI_TypeKind_Bool = 0x0018, -RDI_TypeKind_BF16 = 0x0019, -RDI_TypeKind_F16 = 0x001A, -RDI_TypeKind_F32 = 0x001B, -RDI_TypeKind_F32PP = 0x001C, -RDI_TypeKind_F48 = 0x001D, -RDI_TypeKind_F64 = 0x001E, -RDI_TypeKind_F80 = 0x001F, -RDI_TypeKind_F96 = 0x0020, -RDI_TypeKind_F128 = 0x0021, -RDI_TypeKind_ComplexF32 = 0x0022, -RDI_TypeKind_ComplexF64 = 0x0023, -RDI_TypeKind_ComplexF80 = 0x0024, -RDI_TypeKind_ComplexF128 = 0x0025, -RDI_TypeKind_Decimal32 = 0x0026, -RDI_TypeKind_Decimal64 = 0x0027, -RDI_TypeKind_Decimal128 = 0x0028, -RDI_TypeKind_Variadic = 0x0029, -RDI_TypeKind_Modifier = 0x1000, -RDI_TypeKind_Ptr = 0x1001, -RDI_TypeKind_LRef = 0x1002, -RDI_TypeKind_RRef = 0x1003, -RDI_TypeKind_Array = 0x1004, -RDI_TypeKind_Function = 0x1005, -RDI_TypeKind_Method = 0x1006, -RDI_TypeKind_MemberPtr = 0x1007, -RDI_TypeKind_Struct = 0x2000, -RDI_TypeKind_Class = 0x2001, -RDI_TypeKind_Union = 0x2002, -RDI_TypeKind_Enum = 0x2003, -RDI_TypeKind_Alias = 0x2004, -RDI_TypeKind_IncompleteStruct = 0x2005, -RDI_TypeKind_IncompleteUnion = 0x2006, -RDI_TypeKind_IncompleteClass = 0x2007, -RDI_TypeKind_IncompleteEnum = 0x2008, -RDI_TypeKind_Bitfield = 0xF000, -RDI_TypeKind_COUNT = 0xF002, -RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, -RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Variadic, -RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, -RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, -RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, -RDI_TypeKind_LastRecord = RDI_TypeKind_Union, -RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, -RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, -RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, -RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, -} RDI_TypeKindEnum; - -typedef RDI_U16 RDI_TypeModifierFlags; -typedef enum RDI_TypeModifierFlagsEnum -{ -RDI_TypeModifierFlag_Const = 1<<0, -RDI_TypeModifierFlag_Volatile = 1<<1, -RDI_TypeModifierFlag_Restrict = 1<<2, -} RDI_TypeModifierFlagsEnum; - -typedef RDI_U8 RDI_UDTFlags; -typedef enum RDI_UDTFlagsEnum -{ -RDI_UDTFlag_EnumMembers = 1<<0, -} RDI_UDTFlagsEnum; - -typedef RDI_U16 RDI_MemberKind; -typedef enum RDI_MemberKindEnum -{ -RDI_MemberKind_NULL = 0x0000, -RDI_MemberKind_DataField = 0x0001, -RDI_MemberKind_StaticData = 0x0002, -RDI_MemberKind_Method = 0x0100, -RDI_MemberKind_StaticMethod = 0x0101, -RDI_MemberKind_VirtualMethod = 0x0102, -RDI_MemberKind_VTablePtr = 0x0200, -RDI_MemberKind_Base = 0x0201, -RDI_MemberKind_VirtualBase = 0x0202, -RDI_MemberKind_NestedType = 0x0300, -} RDI_MemberKindEnum; - -typedef RDI_U8 RDI_ContainerKind; -typedef enum RDI_ContainerKindEnum -{ -RDI_ContainerKind_NULL = 0x0, -RDI_ContainerKind_Type = 0x1, -RDI_ContainerKind_Scope = 0x2, -RDI_ContainerKind_Namespace = 0x3, -} RDI_ContainerKindEnum; - -typedef RDI_U8 RDI_ContainerFlags; -typedef enum RDI_ContainerFlagsEnum -{ -RDI_ContainerFlag_External = 1u<<7, -RDI_ContainerFlag_KindMask = 0x7f, -} RDI_ContainerFlagsEnum; - -typedef RDI_U8 RDI_SymbolFlags; -typedef enum RDI_SymbolFlagsEnum -{ -RDI_SymbolFlag_IsParam = 0x1, -} RDI_SymbolFlagsEnum; - -typedef RDI_U8 RDI_LocationKind; -typedef enum RDI_LocationKindEnum -{ -RDI_LocationKind_NULL = 0x0, -RDI_LocationKind_AddrBytecodeStream = 0x1, -RDI_LocationKind_ValBytecodeStream = 0x2, -RDI_LocationKind_AddrRegPlusOff = 0x3, -RDI_LocationKind_AddrAddrRegPlusOff = 0x4, -RDI_LocationKind_ValReg = 0x5, -RDI_LocationKind_ModuleOff = 0x6, -RDI_LocationKind_TLSOff = 0x7, -RDI_LocationKind_ConstantDataOff = 0x8, -RDI_LocationKind_Set = 0x9, -} RDI_LocationKindEnum; - -typedef RDI_U8 RDI_EvalOp; -typedef enum RDI_EvalOpEnum -{ -RDI_EvalOp_Stop = 0, -RDI_EvalOp_Noop = 1, -RDI_EvalOp_Cond = 2, -RDI_EvalOp_Skip = 3, -RDI_EvalOp_MemRead = 4, -RDI_EvalOp_RegRead = 5, -RDI_EvalOp_RegReadDyn = 6, -RDI_EvalOp_FrameOff = 7, -RDI_EvalOp_ModuleOff = 8, -RDI_EvalOp_TLSOff = 9, -RDI_EvalOp_ObjectOff = 10, -RDI_EvalOp_CFA = 11, -RDI_EvalOp_ConstU8 = 12, -RDI_EvalOp_ConstU16 = 13, -RDI_EvalOp_ConstU32 = 14, -RDI_EvalOp_ConstU64 = 15, -RDI_EvalOp_ConstU128 = 16, -RDI_EvalOp_ConstString = 17, -RDI_EvalOp_Abs = 18, -RDI_EvalOp_Neg = 19, -RDI_EvalOp_Add = 20, -RDI_EvalOp_Sub = 21, -RDI_EvalOp_Mul = 22, -RDI_EvalOp_Div = 23, -RDI_EvalOp_Mod = 24, -RDI_EvalOp_LShift = 25, -RDI_EvalOp_RShift = 26, -RDI_EvalOp_BitAnd = 27, -RDI_EvalOp_BitOr = 28, -RDI_EvalOp_BitXor = 29, -RDI_EvalOp_BitNot = 30, -RDI_EvalOp_LogAnd = 31, -RDI_EvalOp_LogOr = 32, -RDI_EvalOp_LogNot = 33, -RDI_EvalOp_EqEq = 34, -RDI_EvalOp_NtEq = 35, -RDI_EvalOp_LsEq = 36, -RDI_EvalOp_GrEq = 37, -RDI_EvalOp_Less = 38, -RDI_EvalOp_Grtr = 39, -RDI_EvalOp_Trunc = 40, -RDI_EvalOp_TruncSigned = 41, -RDI_EvalOp_Convert = 42, -RDI_EvalOp_Pick = 43, -RDI_EvalOp_Pop = 44, -RDI_EvalOp_Insert = 45, -RDI_EvalOp_ValueRead = 46, -RDI_EvalOp_ByteSwap = 47, -RDI_EvalOp_CallSiteValue = 48, -RDI_EvalOp_PartialValue = 49, -RDI_EvalOp_PartialValueBit = 50, -RDI_EvalOp_Swap = 51, -RDI_EvalOp_PushCfa = 52, -RDI_EvalOp_COUNT = 53, -} RDI_EvalOpEnum; - -typedef RDI_U8 RDI_EvalTypeGroup; -typedef enum RDI_EvalTypeGroupEnum -{ -RDI_EvalTypeGroup_Other = 0, -RDI_EvalTypeGroup_U = 1, -RDI_EvalTypeGroup_S = 2, -RDI_EvalTypeGroup_F32 = 3, -RDI_EvalTypeGroup_F64 = 4, -RDI_EvalTypeGroup_F80 = 5, -RDI_EvalTypeGroup_F128 = 6, -RDI_EvalTypeGroup_COUNT = 7, -} RDI_EvalTypeGroupEnum; - -typedef RDI_U8 RDI_EvalConversionKind; -typedef enum RDI_EvalConversionKindEnum -{ -RDI_EvalConversionKind_Noop = 0, -RDI_EvalConversionKind_Legal = 1, -RDI_EvalConversionKind_OtherToOther = 2, -RDI_EvalConversionKind_ToOther = 3, -RDI_EvalConversionKind_FromOther = 4, -RDI_EvalConversionKind_COUNT = 5, -} RDI_EvalConversionKindEnum; - -typedef RDI_U32 RDI_NameMapKind; -typedef enum RDI_NameMapKindEnum -{ -RDI_NameMapKind_NULL = 0, -RDI_NameMapKind_GlobalVariables = 1, -RDI_NameMapKind_ThreadVariables = 2, -RDI_NameMapKind_Constants = 3, -RDI_NameMapKind_Procedures = 4, -RDI_NameMapKind_Types = 5, -RDI_NameMapKind_LinkNameProcedures = 6, -RDI_NameMapKind_NormalSourcePaths = 7, -RDI_NameMapKind_COUNT = 8, -} RDI_NameMapKindEnum; - -#define RDI_Header_XList \ -X(RDI_U64, magic)\ -X(RDI_U32, encoding_version)\ -X(RDI_U32, data_section_off)\ -X(RDI_U32, data_section_count)\ - -#define RDI_SectionKind_XList \ -X(NULL, null, RDI_U8)\ -X(TopLevelInfo, top_level_info, RDI_TopLevelInfo)\ -X(StringData, string_data, RDI_U8)\ -X(StringTable, string_table, RDI_U32)\ -X(IndexRuns, index_runs, RDI_U32)\ -X(BinarySections, binary_sections, RDI_BinarySection)\ -X(FilePathNodes, file_path_nodes, RDI_FilePathNode)\ -X(SourceFiles, source_files, RDI_SourceFile)\ -X(LineTables, line_tables, RDI_LineTable)\ -X(LineInfoVOffs, line_info_voffs, RDI_U64)\ -X(LineInfoLines, line_info_lines, RDI_Line)\ -X(LineInfoColumns, line_info_columns, RDI_Column)\ -X(SourceLineMaps, source_line_maps, RDI_SourceLineMap)\ -X(SourceLineMapNumbers, source_line_map_numbers, RDI_U32)\ -X(SourceLineMapRanges, source_line_map_ranges, RDI_U32)\ -X(SourceLineMapVOffs, source_line_map_voffs, RDI_U64)\ -X(Units, units, RDI_Unit)\ -X(UnitVMap, unit_vmap, RDI_VMapEntry)\ -X(Namespaces, namespaces, RDI_Namespace)\ -X(TypeNodes, type_nodes, RDI_TypeNode)\ -X(UDTs, udts, RDI_UDT)\ -X(Members, members, RDI_Member)\ -X(EnumMembers, enum_members, RDI_EnumMember)\ -X(Scopes, scopes, RDI_Scope)\ -X(ScopeVOffData, scope_voff_data, RDI_U64)\ -X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ -X(InlineSites, inline_sites, RDI_InlineSite)\ -X(GlobalVariables, global_variables, RDI_Symbol)\ -X(GlobalVMap, global_vmap, RDI_VMapEntry)\ -X(ThreadVariables, thread_variables, RDI_Symbol)\ -X(Constants, constants, RDI_Symbol)\ -X(Procedures, procedures, RDI_Symbol)\ -X(LocalVariables, local_variables, RDI_Symbol)\ -X(LocationsBytecodeData, locations_bytecode_data, RDI_U8)\ -X(LocationsConstantData, locations_constant_data, RDI_U8)\ -X(LocationsSetElements, locations_set_elements, RDI_LocationSetElement)\ -X(MD5Checksums, md5_checksums, RDI_MD5)\ -X(SHA1Checksums, sha1_checksums, RDI_SHA1)\ -X(SHA256Checksums, sha256_checksums, RDI_SHA256)\ -X(Timestamps, timestamps, RDI_U64)\ -X(NameMaps, name_maps, RDI_NameMap)\ -X(NameMapBuckets, name_map_buckets, RDI_NameMapBucket)\ -X(NameMapNodes, name_map_nodes, RDI_NameMapNode)\ - -#define RDI_SectionEncoding_XList \ -X(Unpacked)\ -X(LZB)\ - -#define RDI_Section_XList \ -X(RDI_SectionEncoding, encoding)\ -X(RDI_U32, pad)\ -X(RDI_U64, off)\ -X(RDI_U64, encoded_size)\ -X(RDI_U64, unpacked_size)\ - -#define RDI_VMapEntry_XList \ -X(RDI_U64, voff)\ -X(RDI_U64, idx)\ - -#define RDI_Arch_XList \ -X(NULL)\ -X(X64)\ -X(X86)\ - -#define RDI_RegCodeX64_XList \ -X(nil, 0)\ -X(rax, 1)\ -X(rcx, 2)\ -X(rdx, 3)\ -X(rbx, 4)\ -X(rsp, 5)\ -X(rbp, 6)\ -X(rsi, 7)\ -X(rdi, 8)\ -X(r8, 9)\ -X(r9, 10)\ -X(r10, 11)\ -X(r11, 12)\ -X(r12, 13)\ -X(r13, 14)\ -X(r14, 15)\ -X(r15, 16)\ -X(es, 17)\ -X(cs, 18)\ -X(ss, 19)\ -X(ds, 20)\ -X(fs, 21)\ -X(gs, 22)\ -X(rip, 23)\ -X(rflags, 24)\ -X(dr0, 25)\ -X(dr1, 26)\ -X(dr2, 27)\ -X(dr3, 28)\ -X(dr4, 29)\ -X(dr5, 30)\ -X(dr6, 31)\ -X(dr7, 32)\ -X(st0, 33)\ -X(st1, 34)\ -X(st2, 35)\ -X(st3, 36)\ -X(st4, 37)\ -X(st5, 38)\ -X(st6, 39)\ -X(st7, 40)\ -X(zmm0, 41)\ -X(zmm1, 42)\ -X(zmm2, 43)\ -X(zmm3, 44)\ -X(zmm4, 45)\ -X(zmm5, 46)\ -X(zmm6, 47)\ -X(zmm7, 48)\ -X(zmm8, 49)\ -X(zmm9, 50)\ -X(zmm10, 51)\ -X(zmm11, 52)\ -X(zmm12, 53)\ -X(zmm13, 54)\ -X(zmm14, 55)\ -X(zmm15, 56)\ -X(zmm16, 57)\ -X(zmm17, 58)\ -X(zmm18, 59)\ -X(zmm19, 60)\ -X(zmm20, 61)\ -X(zmm21, 62)\ -X(zmm22, 63)\ -X(zmm23, 64)\ -X(zmm24, 65)\ -X(zmm25, 66)\ -X(zmm26, 67)\ -X(zmm27, 68)\ -X(zmm28, 69)\ -X(zmm29, 70)\ -X(zmm30, 71)\ -X(zmm31, 72)\ -X(k0, 73)\ -X(k1, 74)\ -X(k2, 75)\ -X(k3, 76)\ -X(k4, 77)\ -X(k5, 78)\ -X(k6, 79)\ -X(k7, 80)\ -X(mxcsr, 81)\ -X(fsbase, 82)\ -X(gsbase, 83)\ -X(fcw, 84)\ -X(fsw, 85)\ -X(ftw, 86)\ -X(fop, 87)\ -X(fcs, 88)\ -X(fds, 89)\ -X(fip, 90)\ -X(fdp, 91)\ -X(mxcsr_mask, 92)\ -X(cetmsr, 93)\ -X(cetssp, 94)\ - -#define RDI_TopLevelInfo_XList \ -X(RDI_Arch, arch)\ -X(RDI_U32, exe_name_string_idx)\ -X(RDI_U64, exe_hash)\ -X(RDI_U64, voff_max)\ -X(RDI_GUID, guid)\ -X(RDI_U32, producer_name_string_idx)\ - -#define RDI_BinarySectionFlags_XList \ -X(Read)\ -X(Write)\ -X(Execute)\ - -#define RDI_BinarySection_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_BinarySectionFlags, flags)\ -X(RDI_U64, voff_first)\ -X(RDI_U64, voff_opl)\ -X(RDI_U64, foff_first)\ -X(RDI_U64, foff_opl)\ - -#define RDI_ChecksumKind_XList \ -X(NULL, NULL)\ -X(MD5, MD5Checksums)\ -X(SHA1, SHA1Checksums)\ -X(SHA256, SHA256Checksums)\ -X(Timestamp, Timestamps)\ -X(COUNT, NULL)\ - -#define RDI_FilePathNode_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, parent_path_node)\ -X(RDI_U32, first_child)\ -X(RDI_U32, next_sibling)\ -X(RDI_U32, source_file_idx)\ - -#define RDI_SourceFile_XList \ -X(RDI_U32, file_path_node_idx)\ -X(RDI_U32, normal_full_path_string_idx)\ -X(RDI_U32, source_line_map_idx)\ -X(RDI_ChecksumKind, checksum_kind)\ -X(RDI_U32, checksum_idx)\ - -#define RDI_Unit_XList \ -X(RDI_U32, unit_name_string_idx)\ -X(RDI_U32, compiler_name_string_idx)\ -X(RDI_U32, source_file_path_node)\ -X(RDI_U32, object_file_path_node)\ -X(RDI_U32, archive_file_path_node)\ -X(RDI_U32, build_path_node)\ -X(RDI_Language, language)\ -X(RDI_U32, line_table_idx)\ -X(RDI_U32, procedures_first_idx)\ -X(RDI_U32, procedures_count)\ -X(RDI_U32, global_variables_first_idx)\ -X(RDI_U32, global_variables_count)\ -X(RDI_U32, thread_variables_first_idx)\ -X(RDI_U32, thread_variables_count)\ -X(RDI_U32, constants_first_idx)\ -X(RDI_U32, constants_count)\ - -#define RDI_LineTable_XList \ -X(RDI_U32, voffs_base_idx)\ -X(RDI_U32, lines_base_idx)\ -X(RDI_U32, cols_base_idx)\ -X(RDI_U32, lines_count)\ -X(RDI_U32, cols_count)\ - -#define RDI_Line_XList \ -X(RDI_U32, file_idx)\ -X(RDI_U32, line_num)\ - -#define RDI_Column_XList \ -X(RDI_U16, col_first)\ -X(RDI_U16, col_opl)\ - -#define RDI_SourceLineMapMemberTable \ -X(RDI_U32, line_count)\ -X(RDI_U32, voff_count)\ -X(RDI_U32, line_map_nums_base_idx)\ -X(RDI_U32, line_map_range_base_idx)\ -X(RDI_U32, line_map_voff_base_idx)\ - -#define RDI_Language_XList \ -X(NULL)\ -X(C)\ -X(CPlusPlus)\ -X(Masm)\ -X(COUNT)\ - -#define RDI_TypeKind_XList \ -X(NULL)\ -X(Void)\ -X(Handle)\ -X(HResult)\ -X(Char8)\ -X(Char16)\ -X(Char32)\ -X(UChar8)\ -X(UChar16)\ -X(UChar32)\ -X(U8)\ -X(U16)\ -X(U32)\ -X(U64)\ -X(U128)\ -X(U256)\ -X(U512)\ -X(S8)\ -X(S16)\ -X(S32)\ -X(S64)\ -X(S128)\ -X(S256)\ -X(S512)\ -X(Bool)\ -X(BF16)\ -X(F16)\ -X(F32)\ -X(F32PP)\ -X(F48)\ -X(F64)\ -X(F80)\ -X(F96)\ -X(F128)\ -X(ComplexF32)\ -X(ComplexF64)\ -X(ComplexF80)\ -X(ComplexF128)\ -X(Decimal32)\ -X(Decimal64)\ -X(Decimal128)\ -X(Variadic)\ -X(Modifier)\ -X(Ptr)\ -X(LRef)\ -X(RRef)\ -X(Array)\ -X(Function)\ -X(Method)\ -X(MemberPtr)\ -X(Struct)\ -X(Class)\ -X(Union)\ -X(Enum)\ -X(Alias)\ -X(IncompleteStruct)\ -X(IncompleteUnion)\ -X(IncompleteClass)\ -X(IncompleteEnum)\ -X(Bitfield)\ -X(COUNT)\ - -#define RDI_TypeModifierFlags_XList \ -X(Const)\ -X(Volatile)\ -X(Restrict)\ - -#define RDI_TypeNode_XList \ -X(RDI_TypeKind, kind)\ -X(RDI_U16, flags)\ -X(RDI_U32, byte_size)\ - -#define RDI_UDTFlags_XList \ -X(EnumMembers)\ - -#define RDI_UDT_XList \ -X(RDI_U32, self_type_idx)\ -X(RDI_UDTFlags, flags)\ -X(RDI_ContainerFlags, container_flags)\ -X(RDI_U16, reserved_0)\ -X(RDI_U32, member_first)\ -X(RDI_U32, member_count)\ -X(RDI_U32, file_idx)\ -X(RDI_U32, line)\ -X(RDI_U32, col)\ -X(RDI_U32, container_idx)\ - -#define RDI_MemberKind_XList \ -X(NULL)\ -X(DataField)\ -X(StaticData)\ -X(Method)\ -X(StaticMethod)\ -X(VirtualMethod)\ -X(VTablePtr)\ -X(Base)\ -X(VirtualBase)\ -X(NestedType)\ - -#define RDI_Member_XList \ -X(RDI_MemberKind, kind)\ -X(RDI_U16, pad)\ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, off)\ - -#define RDI_EnumMember_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, pad)\ -X(RDI_U64, val)\ - -#define RDI_LinkFlags_XList \ -X($(a.name != COUNT -> a.name))\ - -#define RDI_LocationKind_XList \ -X(NULL)\ -X(AddrBytecodeStream)\ -X(ValBytecodeStream)\ -X(AddrRegPlusOff)\ -X(AddrAddrRegPlusOff)\ -X(ValReg)\ -X(ModuleOff)\ -X(TLSOff)\ -X(ConstantDataOff)\ -X(Set)\ - -#define RDI_Namespace_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_ContainerFlags, container_flags)\ -X(RDI_U8, padding_0)\ -X(RDI_U16, padding_1)\ -X(RDI_U32, container_idx)\ - -#define RDI_Symbol_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_SymbolFlags, symbol_flags)\ -X(RDI_ContainerFlags, container_flags)\ -X(RDI_U16, reserved_0)\ -X(RDI_Location, location)\ -X(RDI_U32, container_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, root_scope_idx)\ -X(RDI_U32, link_name_string_idx)\ - -#define RDI_Scope_XList \ -X(RDI_U32, proc_idx)\ -X(RDI_U32, parent_scope_idx)\ -X(RDI_U32, first_child_scope_idx)\ -X(RDI_U32, next_sibling_scope_idx)\ -X(RDI_U32, voff_range_first)\ -X(RDI_U32, voff_range_opl)\ -X(RDI_U32, local_first)\ -X(RDI_U32, local_count)\ -X(RDI_U32, inline_site_idx)\ - -#define RDI_InlineSite_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, owner_type_idx)\ -X(RDI_U32, line_table_idx)\ - -#define RDI_EvalOp_XList \ -X(Stop)\ -X(Noop)\ -X(Cond)\ -X(Skip)\ -X(MemRead)\ -X(RegRead)\ -X(RegReadDyn)\ -X(FrameOff)\ -X(ModuleOff)\ -X(TLSOff)\ -X(ObjectOff)\ -X(CFA)\ -X(ConstU8)\ -X(ConstU16)\ -X(ConstU32)\ -X(ConstU64)\ -X(ConstU128)\ -X(ConstString)\ -X(Abs)\ -X(Neg)\ -X(Add)\ -X(Sub)\ -X(Mul)\ -X(Div)\ -X(Mod)\ -X(LShift)\ -X(RShift)\ -X(BitAnd)\ -X(BitOr)\ -X(BitXor)\ -X(BitNot)\ -X(LogAnd)\ -X(LogOr)\ -X(LogNot)\ -X(EqEq)\ -X(NtEq)\ -X(LsEq)\ -X(GrEq)\ -X(Less)\ -X(Grtr)\ -X(Trunc)\ -X(TruncSigned)\ -X(Convert)\ -X(Pick)\ -X(Pop)\ -X(Insert)\ -X(ValueRead)\ -X(ByteSwap)\ -X(CallSiteValue)\ -X(PartialValue)\ -X(PartialValueBit)\ -X(Swap)\ -X(PushCfa)\ - -#define RDI_EvalTypeGroup_XList \ -X(Other)\ -X(U)\ -X(S)\ -X(F32)\ -X(F64)\ -X(F80)\ -X(F128)\ - -#define RDI_EvalConversionKind_XList \ -X(Noop)\ -X(Legal)\ -X(OtherToOther)\ -X(ToOther)\ -X(FromOther)\ - -#define RDI_NameMapKind_XList \ -X(NULL)\ -X(GlobalVariables)\ -X(ThreadVariables)\ -X(Constants)\ -X(Procedures)\ -X(Types)\ -X(LinkNameProcedures)\ -X(NormalSourcePaths)\ - -#define RDI_NameMap_XList \ -X(RDI_U32, bucket_base_idx)\ -X(RDI_U32, node_base_idx)\ -X(RDI_U32, bucket_count)\ -X(RDI_U32, node_count)\ - -#define RDI_NameMapBucket_XList \ -X(RDI_U32, first_node)\ -X(RDI_U32, node_count)\ - -#define RDI_NameMapNode_XList \ -X(RDI_U32, string_idx)\ -X(RDI_U32, match_count)\ -X(RDI_U32, match_idx_or_idx_run_first)\ - -#if !RDI_DISABLE_TABLE_INDEX_TYPECHECKING -typedef struct RDI_U32_StringTable { RDI_U32 v; } RDI_U32_StringTable; -typedef struct RDI_U32_IndexRuns { RDI_U32 v; } RDI_U32_IndexRuns; -typedef struct RDI_U32_BinarySections { RDI_U32 v; } RDI_U32_BinarySections; -typedef struct RDI_U32_FilePathNodes { RDI_U32 v; } RDI_U32_FilePathNodes; -typedef struct RDI_U32_SourceFiles { RDI_U32 v; } RDI_U32_SourceFiles; -typedef struct RDI_U32_LineTables { RDI_U32 v; } RDI_U32_LineTables; -typedef struct RDI_U32_LineInfoVOffs { RDI_U32 v; } RDI_U32_LineInfoVOffs; -typedef struct RDI_U32_LineInfoLines { RDI_U32 v; } RDI_U32_LineInfoLines; -typedef struct RDI_U32_LineInfoColumns { RDI_U32 v; } RDI_U32_LineInfoColumns; -typedef struct RDI_U32_SourceLineMaps { RDI_U32 v; } RDI_U32_SourceLineMaps; -typedef struct RDI_U32_SourceLineMapNumbers { RDI_U32 v; } RDI_U32_SourceLineMapNumbers; -typedef struct RDI_U32_SourceLineMapRanges { RDI_U32 v; } RDI_U32_SourceLineMapRanges; -typedef struct RDI_U32_SourceLineMapVOffs { RDI_U32 v; } RDI_U32_SourceLineMapVOffs; -typedef struct RDI_U32_Units { RDI_U32 v; } RDI_U32_Units; -typedef struct RDI_U32_Namespaces { RDI_U32 v; } RDI_U32_Namespaces; -typedef struct RDI_U32_TypeNodes { RDI_U32 v; } RDI_U32_TypeNodes; -typedef struct RDI_U32_UDTs { RDI_U32 v; } RDI_U32_UDTs; -typedef struct RDI_U32_Members { RDI_U32 v; } RDI_U32_Members; -typedef struct RDI_U32_EnumMembers { RDI_U32 v; } RDI_U32_EnumMembers; -typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; -typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; -typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; -typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_GlobalVariables; -typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; -typedef struct RDI_U32_Constants { RDI_U32 v; } RDI_U32_Constants; -typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; -typedef struct RDI_U32_LocalVariables { RDI_U32 v; } RDI_U32_LocalVariables; -typedef struct RDI_U32_LocationsBytecodeData { RDI_U32 v; } RDI_U32_LocationsBytecodeData; -typedef struct RDI_U32_LocationsConstantData { RDI_U32 v; } RDI_U32_LocationsConstantData; -typedef struct RDI_U32_LocationsSetElements { RDI_U32 v; } RDI_U32_LocationsSetElements; -typedef struct RDI_U32_MD5Checksums { RDI_U32 v; } RDI_U32_MD5Checksums; -typedef struct RDI_U32_SHA1Checksums { RDI_U32 v; } RDI_U32_SHA1Checksums; -typedef struct RDI_U32_SHA256Checksums { RDI_U32 v; } RDI_U32_SHA256Checksums; -typedef struct RDI_U32_Timestamps { RDI_U32 v; } RDI_U32_Timestamps; -typedef struct RDI_U32_NameMaps { RDI_U32 v; } RDI_U32_NameMaps; -typedef struct RDI_U32_NameMapBuckets { RDI_U32 v; } RDI_U32_NameMapBuckets; -typedef struct RDI_U32_NameMapNodes { RDI_U32 v; } RDI_U32_NameMapNodes; -#else -typedef struct RDI_U32_Table { RDI_U32 v; } RDI_U32_Table; -typedef struct RDI_U64_Table { RDI_U64 v; } RDI_U64_Table; -typedef RDI_U32_Table RDI_U32_StringTable; -typedef RDI_U32_Table RDI_U32_IndexRuns; -typedef RDI_U32_Table RDI_U32_BinarySections; -typedef RDI_U32_Table RDI_U32_FilePathNodes; -typedef RDI_U32_Table RDI_U32_SourceFiles; -typedef RDI_U32_Table RDI_U32_LineTables; -typedef RDI_U32_Table RDI_U32_LineInfoVOffs; -typedef RDI_U32_Table RDI_U32_LineInfoLines; -typedef RDI_U32_Table RDI_U32_LineInfoColumns; -typedef RDI_U32_Table RDI_U32_SourceLineMaps; -typedef RDI_U32_Table RDI_U32_SourceLineMapNumbers; -typedef RDI_U32_Table RDI_U32_SourceLineMapRanges; -typedef RDI_U32_Table RDI_U32_SourceLineMapVOffs; -typedef RDI_U32_Table RDI_U32_Units; -typedef RDI_U32_Table RDI_U32_Namespaces; -typedef RDI_U32_Table RDI_U32_TypeNodes; -typedef RDI_U32_Table RDI_U32_UDTs; -typedef RDI_U32_Table RDI_U32_Members; -typedef RDI_U32_Table RDI_U32_EnumMembers; -typedef RDI_U32_Table RDI_U32_Scopes; -typedef RDI_U32_Table RDI_U32_ScopeVOffData; -typedef RDI_U32_Table RDI_U32_InlineSites; -typedef RDI_U32_Table RDI_U32_GlobalVariables; -typedef RDI_U32_Table RDI_U32_ThreadVariables; -typedef RDI_U32_Table RDI_U32_Constants; -typedef RDI_U32_Table RDI_U32_Procedures; -typedef RDI_U32_Table RDI_U32_LocalVariables; -typedef RDI_U32_Table RDI_U32_LocationsBytecodeData; -typedef RDI_U32_Table RDI_U32_LocationsConstantData; -typedef RDI_U32_Table RDI_U32_LocationsSetElements; -typedef RDI_U32_Table RDI_U32_MD5Checksums; -typedef RDI_U32_Table RDI_U32_SHA1Checksums; -typedef RDI_U32_Table RDI_U32_SHA256Checksums; -typedef RDI_U32_Table RDI_U32_Timestamps; -typedef RDI_U32_Table RDI_U32_NameMaps; -typedef RDI_U32_Table RDI_U32_NameMapBuckets; -typedef RDI_U32_Table RDI_U32_NameMapNodes; -#endif - -typedef RDI_U64 RDI_Location; -#define RDI_Location_KindMask 0xff00000000000000ull -#define RDI_Location_KindShift 56 -#define RDI_Location_OffMask 0x00ffffffffffffffull -#define RDI_Location_OffShift 0 -#define RDI_Location_SetFirstIndexMask 0x00000000ffffffffull -#define RDI_Location_SetFirstIndexShift 0 -#define RDI_Location_SetCountMask 0x00ffffff00000000ull -#define RDI_Location_SetCountShift 32 -#define RDI_Location_RegCodeMask 0x00ff000000000000ull -#define RDI_Location_RegCodeShift 48 -#define RDI_Location_RegOffMask 0x0000ffff00000000ull -#define RDI_Location_RegOffShift 32 -#define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift)) -#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0) -#define rdi_regoff_from_location(l) (RDI_S64)(RDI_S32)(RDI_S16)((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) -#define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) -#define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) -#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) -#define rdi_bytecode_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_AddrBytecodeStream || rdi_kind_from_location(l) == RDI_LocationKind_ValBytecodeStream ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) -#define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0) -#define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0) -#define rdi_location_voff(voff) ((((RDI_U64)RDI_LocationKind_ModuleOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((voff) & ~RDI_Location_KindMask)) -#define rdi_location_toff(toff) ((((RDI_U64)RDI_LocationKind_TLSOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((toff) & ~RDI_Location_KindMask)) -#define rdi_location_constant_data_off(off) ((((RDI_U64)RDI_LocationKind_ConstantDataOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((off) & ~RDI_Location_KindMask)) -#define rdi_location_reg(kind, reg, off) ((((RDI_U64)(kind) << RDI_Location_KindShift) & RDI_Location_KindMask) | (((RDI_U64)(reg) << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask) | (((RDI_U64)(off) << RDI_Location_RegOffShift) & RDI_Location_RegOffMask)) -#define rdi_location_bytecode(kind, off) ((((RDI_U64)(kind) << RDI_Location_KindShift) & RDI_Location_KindMask) | (((RDI_U64)(off) << RDI_Location_OffShift) & RDI_Location_OffMask)) -#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) -#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) -#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) -#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 0) & 0xf) -#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) - -typedef struct RDI_Header RDI_Header; -struct RDI_Header -{ -RDI_U64 magic; -RDI_U32 encoding_version; -RDI_U32 data_section_off; -RDI_U32 data_section_count; -}; - -typedef struct RDI_Section RDI_Section; -struct RDI_Section -{ -RDI_SectionEncoding encoding; -RDI_U32 pad; -RDI_U64 off; -RDI_U64 encoded_size; -RDI_U64 unpacked_size; -}; - -typedef struct RDI_VMapEntry RDI_VMapEntry; -struct RDI_VMapEntry -{ -RDI_U64 voff; -RDI_U64 idx; -}; - -typedef struct RDI_TopLevelInfo RDI_TopLevelInfo; -struct RDI_TopLevelInfo -{ -RDI_Arch arch; -RDI_U32 exe_name_string_idx; -RDI_U64 exe_hash; -RDI_U64 voff_max; -RDI_GUID guid; -RDI_U32 producer_name_string_idx; -}; - -typedef struct RDI_BinarySection RDI_BinarySection; -struct RDI_BinarySection -{ -RDI_U32 name_string_idx; -RDI_BinarySectionFlags flags; -RDI_U64 voff_first; -RDI_U64 voff_opl; -RDI_U64 foff_first; -RDI_U64 foff_opl; -}; - -typedef struct RDI_FilePathNode RDI_FilePathNode; -struct RDI_FilePathNode -{ -RDI_U32 name_string_idx; -RDI_U32 parent_path_node; -RDI_U32 first_child; -RDI_U32 next_sibling; -RDI_U32 source_file_idx; -}; - -typedef struct RDI_SourceFile RDI_SourceFile; -struct RDI_SourceFile -{ -RDI_U32 file_path_node_idx; -RDI_U32 normal_full_path_string_idx; -RDI_U32 source_line_map_idx; -RDI_ChecksumKind checksum_kind; -RDI_U32 checksum_idx; -}; - -typedef struct RDI_Unit RDI_Unit; -struct RDI_Unit -{ -RDI_U32 unit_name_string_idx; -RDI_U32 compiler_name_string_idx; -RDI_U32 source_file_path_node; -RDI_U32 object_file_path_node; -RDI_U32 archive_file_path_node; -RDI_U32 build_path_node; -RDI_Language language; -RDI_U32 line_table_idx; -RDI_U32 procedures_first_idx; -RDI_U32 procedures_count; -RDI_U32 global_variables_first_idx; -RDI_U32 global_variables_count; -RDI_U32 thread_variables_first_idx; -RDI_U32 thread_variables_count; -RDI_U32 constants_first_idx; -RDI_U32 constants_count; -}; - -typedef struct RDI_LineTable RDI_LineTable; -struct RDI_LineTable -{ -RDI_U32 voffs_base_idx; -RDI_U32 lines_base_idx; -RDI_U32 cols_base_idx; -RDI_U32 lines_count; -RDI_U32 cols_count; -}; - -typedef struct RDI_Line RDI_Line; -struct RDI_Line -{ -RDI_U32 file_idx; -RDI_U32 line_num; -}; - -typedef struct RDI_Column RDI_Column; -struct RDI_Column -{ -RDI_U16 col_first; -RDI_U16 col_opl; -}; - -typedef struct RDI_SourceLineMap RDI_SourceLineMap; -struct RDI_SourceLineMap -{ -RDI_U32 line_count; -RDI_U32 voff_count; -RDI_U32 line_map_nums_base_idx; -RDI_U32 line_map_range_base_idx; -RDI_U32 line_map_voff_base_idx; -}; - -typedef struct RDI_TypeNode RDI_TypeNode; -struct RDI_TypeNode -{ -RDI_TypeKind kind; -RDI_U16 flags; -RDI_U32 byte_size; - - union - { - // kind is 'built-in' - struct - { - RDI_U32 name_string_idx; - } built_in; - - // kind is 'constructed' - struct - { - RDI_U32 direct_type_idx; - RDI_U32 count; - union - { - // when kind is 'Function' or 'Method' - RDI_U32 param_idx_run_first; - // when kind is 'MemberPtr' - RDI_U32 owner_type_idx; - }; - } - constructed; - - // kind is 'user defined' - struct - { - RDI_U32 name_string_idx; - RDI_U32 direct_type_idx; - RDI_U32 udt_idx; - } - user_defined; - - // (kind = Bitfield) - struct - { - RDI_U32 direct_type_idx; - RDI_U32 off; - RDI_U32 size; - } - bitfield; - } - ; -}; - -typedef struct RDI_UDT RDI_UDT; -struct RDI_UDT -{ -RDI_U32 self_type_idx; -RDI_UDTFlags flags; -RDI_ContainerFlags container_flags; -RDI_U16 reserved_0; -RDI_U32 member_first; -RDI_U32 member_count; -RDI_U32 file_idx; -RDI_U32 line; -RDI_U32 col; -RDI_U32 container_idx; -}; - -typedef struct RDI_Member RDI_Member; -struct RDI_Member -{ -RDI_MemberKind kind; -RDI_U16 pad; -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 off; -}; - -typedef struct RDI_EnumMember RDI_EnumMember; -struct RDI_EnumMember -{ -RDI_U32 name_string_idx; -RDI_U32 pad; -RDI_U64 val; -}; - -typedef struct RDI_Namespace RDI_Namespace; -struct RDI_Namespace -{ -RDI_U32 name_string_idx; -RDI_ContainerFlags container_flags; -RDI_U8 padding_0; -RDI_U16 padding_1; -RDI_U32 container_idx; -}; - -typedef struct RDI_Symbol RDI_Symbol; -struct RDI_Symbol -{ -RDI_U32 name_string_idx; -RDI_SymbolFlags symbol_flags; -RDI_ContainerFlags container_flags; -RDI_U16 reserved_0; -RDI_Location location; -RDI_U32 container_idx; -RDI_U32 type_idx; -RDI_U32 root_scope_idx; -RDI_U32 link_name_string_idx; -}; - -typedef struct RDI_Scope RDI_Scope; -struct RDI_Scope -{ -RDI_U32 proc_idx; -RDI_U32 parent_scope_idx; -RDI_U32 first_child_scope_idx; -RDI_U32 next_sibling_scope_idx; -RDI_U32 voff_range_first; -RDI_U32 voff_range_opl; -RDI_U32 local_first; -RDI_U32 local_count; -RDI_U32 inline_site_idx; -}; - -typedef struct RDI_InlineSite RDI_InlineSite; -struct RDI_InlineSite -{ -RDI_U32 name_string_idx; -RDI_U32 type_idx; -RDI_U32 owner_type_idx; -RDI_U32 line_table_idx; -}; - -typedef struct RDI_LocationSetElement RDI_LocationSetElement; -struct RDI_LocationSetElement -{ -RDI_U64 voff_first; -RDI_U64 voff_opl; -RDI_Location location; -}; - -typedef struct RDI_NameMap RDI_NameMap; -struct RDI_NameMap -{ -RDI_U32 bucket_base_idx; -RDI_U32 node_base_idx; -RDI_U32 bucket_count; -RDI_U32 node_count; -}; - -typedef struct RDI_NameMapBucket RDI_NameMapBucket; -struct RDI_NameMapBucket -{ -RDI_U32 first_node; -RDI_U32 node_count; -}; - -typedef struct RDI_NameMapNode RDI_NameMapNode; -struct RDI_NameMapNode -{ -RDI_U32 string_idx; -RDI_U32 match_count; -RDI_U32 match_idx_or_idx_run_first; -}; - -typedef RDI_TopLevelInfo RDI_SectionElementType_TopLevelInfo; -typedef RDI_U8 RDI_SectionElementType_StringData; -typedef RDI_U32 RDI_SectionElementType_StringTable; -typedef RDI_U32 RDI_SectionElementType_IndexRuns; -typedef RDI_BinarySection RDI_SectionElementType_BinarySections; -typedef RDI_FilePathNode RDI_SectionElementType_FilePathNodes; -typedef RDI_SourceFile RDI_SectionElementType_SourceFiles; -typedef RDI_LineTable RDI_SectionElementType_LineTables; -typedef RDI_U64 RDI_SectionElementType_LineInfoVOffs; -typedef RDI_Line RDI_SectionElementType_LineInfoLines; -typedef RDI_Column RDI_SectionElementType_LineInfoColumns; -typedef RDI_SourceLineMap RDI_SectionElementType_SourceLineMaps; -typedef RDI_U32 RDI_SectionElementType_SourceLineMapNumbers; -typedef RDI_U32 RDI_SectionElementType_SourceLineMapRanges; -typedef RDI_U64 RDI_SectionElementType_SourceLineMapVOffs; -typedef RDI_Unit RDI_SectionElementType_Units; -typedef RDI_VMapEntry RDI_SectionElementType_UnitVMap; -typedef RDI_Namespace RDI_SectionElementType_Namespaces; -typedef RDI_TypeNode RDI_SectionElementType_TypeNodes; -typedef RDI_UDT RDI_SectionElementType_UDTs; -typedef RDI_Member RDI_SectionElementType_Members; -typedef RDI_EnumMember RDI_SectionElementType_EnumMembers; -typedef RDI_Scope RDI_SectionElementType_Scopes; -typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; -typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; -typedef RDI_InlineSite RDI_SectionElementType_InlineSites; -typedef RDI_Symbol RDI_SectionElementType_GlobalVariables; -typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; -typedef RDI_Symbol RDI_SectionElementType_ThreadVariables; -typedef RDI_Symbol RDI_SectionElementType_Constants; -typedef RDI_Symbol RDI_SectionElementType_Procedures; -typedef RDI_Symbol RDI_SectionElementType_LocalVariables; -typedef RDI_U8 RDI_SectionElementType_LocationsBytecodeData; -typedef RDI_U8 RDI_SectionElementType_LocationsConstantData; -typedef RDI_LocationSetElement RDI_SectionElementType_LocationsSetElements; -typedef RDI_MD5 RDI_SectionElementType_MD5Checksums; -typedef RDI_SHA1 RDI_SectionElementType_SHA1Checksums; -typedef RDI_SHA256 RDI_SectionElementType_SHA256Checksums; -typedef RDI_U64 RDI_SectionElementType_Timestamps; -typedef RDI_NameMap RDI_SectionElementType_NameMaps; -typedef RDI_NameMapBucket RDI_SectionElementType_NameMapBuckets; -typedef RDI_NameMapNode RDI_SectionElementType_NameMapNodes; - -RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); -RDI_PROC RDI_U8 *rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out); -RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind); -RDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch); -RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); -RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); -RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); - -extern RDI_U16 rdi_section_element_size_table[44]; -extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; - -#endif // RDI_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ (R)AD (D)ebug (I)nfo Format Library +// +// Defines standard RDI debug information format types and +// functions. + +#ifndef RDI_H +#define RDI_H + +//////////////////////////////////////////////////////////////// +//~ Overridable Procedure Decoration + +#if !defined(RDI_PROC) +# define RDI_PROC static +#endif + +//////////////////////////////////////////////////////////////// +//~ Overridable Basic Integer Types + +#if !defined(RDI_U8) +# define RDI_U8 RDI_U8 +# define RDI_U16 RDI_U16 +# define RDI_U32 RDI_U32 +# define RDI_U64 RDI_U64 +# define RDI_S8 RDI_S8 +# define RDI_S16 RDI_S16 +# define RDI_S32 RDI_S32 +# define RDI_S64 RDI_S64 +#include +typedef uint8_t RDI_U8; +typedef uint16_t RDI_U16; +typedef uint32_t RDI_U32; +typedef uint64_t RDI_U64; +typedef int8_t RDI_S8; +typedef int16_t RDI_S16; +typedef int32_t RDI_S32; +typedef int64_t RDI_S64; +#endif + +//////////////////////////////////////////////////////////////// +//~ Checksum Types + +typedef union RDI_MD5 RDI_MD5; +union RDI_MD5 {RDI_U8 u8[16]; RDI_U64 u64[2];}; + +typedef union RDI_SHA1 RDI_SHA1; +union RDI_SHA1 {RDI_U8 u8[20];}; + +typedef union RDI_SHA256 RDI_SHA256; +union RDI_SHA256 {RDI_U8 u8[32]; RDI_U64 u64[4];}; + +typedef union RDI_GUID RDI_GUID; +union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; + +//////////////////////////////////////////////////////////////// +//~ Overridable Enabling/Disabling Of Table Index Typechecking + +#if !defined(RDI_DISABLE_TABLE_INDEX_TYPECHECKING) +# define RDI_DISABLE_TABLE_INDEX_TYPECHECKING 0 +#endif + +//////////////////////////////////////////////////////////////// +//~ Format Constants + +// "raddbg\0\0" +#define RDI_MAGIC_CONSTANT 0x0000676264646172 +#define RDI_ENCODING_VERSION 22 + +//////////////////////////////////////////////////////////////// +//~ Format Types & Functions + +typedef RDI_U32 RDI_SectionKind; +typedef enum RDI_SectionKindEnum +{ +RDI_SectionKind_NULL = 0x0000, +RDI_SectionKind_TopLevelInfo = 0x0001, +RDI_SectionKind_StringData = 0x0002, +RDI_SectionKind_StringTable = 0x0003, +RDI_SectionKind_IndexRuns = 0x0004, +RDI_SectionKind_BinarySections = 0x0005, +RDI_SectionKind_FilePathNodes = 0x0006, +RDI_SectionKind_SourceFiles = 0x0007, +RDI_SectionKind_LineTables = 0x0008, +RDI_SectionKind_LineInfoVOffs = 0x0009, +RDI_SectionKind_LineInfoLines = 0x000A, +RDI_SectionKind_LineInfoColumns = 0x000B, +RDI_SectionKind_SourceLineMaps = 0x000C, +RDI_SectionKind_SourceLineMapNumbers = 0x000D, +RDI_SectionKind_SourceLineMapRanges = 0x000E, +RDI_SectionKind_SourceLineMapVOffs = 0x000F, +RDI_SectionKind_Units = 0x0010, +RDI_SectionKind_UnitVMap = 0x0011, +RDI_SectionKind_Namespaces = 0x0012, +RDI_SectionKind_TypeNodes = 0x0013, +RDI_SectionKind_UDTs = 0x0014, +RDI_SectionKind_Members = 0x0015, +RDI_SectionKind_EnumMembers = 0x0016, +RDI_SectionKind_Scopes = 0x0017, +RDI_SectionKind_ScopeVOffData = 0x0018, +RDI_SectionKind_ScopeVMap = 0x0019, +RDI_SectionKind_InlineSites = 0x001A, +RDI_SectionKind_GlobalVariables = 0x001B, +RDI_SectionKind_GlobalVMap = 0x001C, +RDI_SectionKind_ThreadVariables = 0x001D, +RDI_SectionKind_Constants = 0x001E, +RDI_SectionKind_Procedures = 0x001F, +RDI_SectionKind_LocalVariables = 0x0020, +RDI_SectionKind_LocationsBytecodeData = 0x0021, +RDI_SectionKind_LocationsConstantData = 0x0022, +RDI_SectionKind_LocationsSetElements = 0x0023, +RDI_SectionKind_MD5Checksums = 0x0024, +RDI_SectionKind_SHA1Checksums = 0x0025, +RDI_SectionKind_SHA256Checksums = 0x0026, +RDI_SectionKind_Timestamps = 0x0027, +RDI_SectionKind_NameMaps = 0x0028, +RDI_SectionKind_NameMapBuckets = 0x0029, +RDI_SectionKind_NameMapNodes = 0x002A, +RDI_SectionKind_COUNT = 0x002B, +} RDI_SectionKindEnum; + +typedef RDI_U32 RDI_SectionEncoding; +typedef enum RDI_SectionEncodingEnum +{ +RDI_SectionEncoding_Unpacked = 0, +RDI_SectionEncoding_LZB = 1, +} RDI_SectionEncodingEnum; + +typedef RDI_U32 RDI_Arch; +typedef enum RDI_ArchEnum +{ +RDI_Arch_NULL = 0, +RDI_Arch_X64 = 1, +RDI_Arch_X86 = 2, +} RDI_ArchEnum; + +typedef RDI_U8 RDI_RegCode; +typedef enum RDI_RegCodeEnum +{ +RDI_RegCode_nil, +} RDI_RegCodeEnum; + +typedef RDI_U8 RDI_RegCodeX64; +typedef enum RDI_RegCodeX64Enum +{ +RDI_RegCodeX64_nil = 0, +RDI_RegCodeX64_rax = 1, +RDI_RegCodeX64_rcx = 2, +RDI_RegCodeX64_rdx = 3, +RDI_RegCodeX64_rbx = 4, +RDI_RegCodeX64_rsp = 5, +RDI_RegCodeX64_rbp = 6, +RDI_RegCodeX64_rsi = 7, +RDI_RegCodeX64_rdi = 8, +RDI_RegCodeX64_r8 = 9, +RDI_RegCodeX64_r9 = 10, +RDI_RegCodeX64_r10 = 11, +RDI_RegCodeX64_r11 = 12, +RDI_RegCodeX64_r12 = 13, +RDI_RegCodeX64_r13 = 14, +RDI_RegCodeX64_r14 = 15, +RDI_RegCodeX64_r15 = 16, +RDI_RegCodeX64_es = 17, +RDI_RegCodeX64_cs = 18, +RDI_RegCodeX64_ss = 19, +RDI_RegCodeX64_ds = 20, +RDI_RegCodeX64_fs = 21, +RDI_RegCodeX64_gs = 22, +RDI_RegCodeX64_rip = 23, +RDI_RegCodeX64_rflags = 24, +RDI_RegCodeX64_dr0 = 25, +RDI_RegCodeX64_dr1 = 26, +RDI_RegCodeX64_dr2 = 27, +RDI_RegCodeX64_dr3 = 28, +RDI_RegCodeX64_dr4 = 29, +RDI_RegCodeX64_dr5 = 30, +RDI_RegCodeX64_dr6 = 31, +RDI_RegCodeX64_dr7 = 32, +RDI_RegCodeX64_st0 = 33, +RDI_RegCodeX64_st1 = 34, +RDI_RegCodeX64_st2 = 35, +RDI_RegCodeX64_st3 = 36, +RDI_RegCodeX64_st4 = 37, +RDI_RegCodeX64_st5 = 38, +RDI_RegCodeX64_st6 = 39, +RDI_RegCodeX64_st7 = 40, +RDI_RegCodeX64_zmm0 = 41, +RDI_RegCodeX64_zmm1 = 42, +RDI_RegCodeX64_zmm2 = 43, +RDI_RegCodeX64_zmm3 = 44, +RDI_RegCodeX64_zmm4 = 45, +RDI_RegCodeX64_zmm5 = 46, +RDI_RegCodeX64_zmm6 = 47, +RDI_RegCodeX64_zmm7 = 48, +RDI_RegCodeX64_zmm8 = 49, +RDI_RegCodeX64_zmm9 = 50, +RDI_RegCodeX64_zmm10 = 51, +RDI_RegCodeX64_zmm11 = 52, +RDI_RegCodeX64_zmm12 = 53, +RDI_RegCodeX64_zmm13 = 54, +RDI_RegCodeX64_zmm14 = 55, +RDI_RegCodeX64_zmm15 = 56, +RDI_RegCodeX64_zmm16 = 57, +RDI_RegCodeX64_zmm17 = 58, +RDI_RegCodeX64_zmm18 = 59, +RDI_RegCodeX64_zmm19 = 60, +RDI_RegCodeX64_zmm20 = 61, +RDI_RegCodeX64_zmm21 = 62, +RDI_RegCodeX64_zmm22 = 63, +RDI_RegCodeX64_zmm23 = 64, +RDI_RegCodeX64_zmm24 = 65, +RDI_RegCodeX64_zmm25 = 66, +RDI_RegCodeX64_zmm26 = 67, +RDI_RegCodeX64_zmm27 = 68, +RDI_RegCodeX64_zmm28 = 69, +RDI_RegCodeX64_zmm29 = 70, +RDI_RegCodeX64_zmm30 = 71, +RDI_RegCodeX64_zmm31 = 72, +RDI_RegCodeX64_k0 = 73, +RDI_RegCodeX64_k1 = 74, +RDI_RegCodeX64_k2 = 75, +RDI_RegCodeX64_k3 = 76, +RDI_RegCodeX64_k4 = 77, +RDI_RegCodeX64_k5 = 78, +RDI_RegCodeX64_k6 = 79, +RDI_RegCodeX64_k7 = 80, +RDI_RegCodeX64_mxcsr = 81, +RDI_RegCodeX64_fsbase = 82, +RDI_RegCodeX64_gsbase = 83, +RDI_RegCodeX64_fcw = 84, +RDI_RegCodeX64_fsw = 85, +RDI_RegCodeX64_ftw = 86, +RDI_RegCodeX64_fop = 87, +RDI_RegCodeX64_fcs = 88, +RDI_RegCodeX64_fds = 89, +RDI_RegCodeX64_fip = 90, +RDI_RegCodeX64_fdp = 91, +RDI_RegCodeX64_mxcsr_mask = 92, +RDI_RegCodeX64_cetmsr = 93, +RDI_RegCodeX64_cetssp = 94, +} RDI_RegCodeX64Enum; + +typedef RDI_U32 RDI_BinarySectionFlags; +typedef enum RDI_BinarySectionFlagsEnum +{ +RDI_BinarySectionFlag_Read = 1<<0, +RDI_BinarySectionFlag_Write = 1<<1, +RDI_BinarySectionFlag_Execute = 1<<2, +} RDI_BinarySectionFlagsEnum; + +typedef RDI_U32 RDI_ChecksumKind; +typedef enum RDI_ChecksumKindEnum +{ +RDI_ChecksumKind_NULL = 0, +RDI_ChecksumKind_MD5 = 1, +RDI_ChecksumKind_SHA1 = 2, +RDI_ChecksumKind_SHA256 = 3, +RDI_ChecksumKind_Timestamp = 4, +RDI_ChecksumKind_COUNT = 5, +} RDI_ChecksumKindEnum; + +typedef RDI_U32 RDI_Language; +typedef enum RDI_LanguageEnum +{ +RDI_Language_NULL = 0, +RDI_Language_C = 1, +RDI_Language_CPlusPlus = 2, +RDI_Language_Masm = 3, +RDI_Language_COUNT = 4, +} RDI_LanguageEnum; + +typedef RDI_U16 RDI_TypeKind; +typedef enum RDI_TypeKindEnum +{ +RDI_TypeKind_NULL = 0x0000, +RDI_TypeKind_Void = 0x0001, +RDI_TypeKind_Handle = 0x0002, +RDI_TypeKind_HResult = 0x0003, +RDI_TypeKind_Char8 = 0x0004, +RDI_TypeKind_Char16 = 0x0005, +RDI_TypeKind_Char32 = 0x0006, +RDI_TypeKind_UChar8 = 0x0007, +RDI_TypeKind_UChar16 = 0x0008, +RDI_TypeKind_UChar32 = 0x0009, +RDI_TypeKind_U8 = 0x000A, +RDI_TypeKind_U16 = 0x000B, +RDI_TypeKind_U32 = 0x000C, +RDI_TypeKind_U64 = 0x000D, +RDI_TypeKind_U128 = 0x000E, +RDI_TypeKind_U256 = 0x000F, +RDI_TypeKind_U512 = 0x0010, +RDI_TypeKind_S8 = 0x0011, +RDI_TypeKind_S16 = 0x0012, +RDI_TypeKind_S32 = 0x0013, +RDI_TypeKind_S64 = 0x0014, +RDI_TypeKind_S128 = 0x0015, +RDI_TypeKind_S256 = 0x0016, +RDI_TypeKind_S512 = 0x0017, +RDI_TypeKind_Bool = 0x0018, +RDI_TypeKind_BF16 = 0x0019, +RDI_TypeKind_F16 = 0x001A, +RDI_TypeKind_F32 = 0x001B, +RDI_TypeKind_F32PP = 0x001C, +RDI_TypeKind_F48 = 0x001D, +RDI_TypeKind_F64 = 0x001E, +RDI_TypeKind_F80 = 0x001F, +RDI_TypeKind_F96 = 0x0020, +RDI_TypeKind_F128 = 0x0021, +RDI_TypeKind_ComplexF32 = 0x0022, +RDI_TypeKind_ComplexF64 = 0x0023, +RDI_TypeKind_ComplexF80 = 0x0024, +RDI_TypeKind_ComplexF128 = 0x0025, +RDI_TypeKind_Decimal32 = 0x0026, +RDI_TypeKind_Decimal64 = 0x0027, +RDI_TypeKind_Decimal128 = 0x0028, +RDI_TypeKind_Variadic = 0x0029, +RDI_TypeKind_Modifier = 0x1000, +RDI_TypeKind_Ptr = 0x1001, +RDI_TypeKind_LRef = 0x1002, +RDI_TypeKind_RRef = 0x1003, +RDI_TypeKind_Array = 0x1004, +RDI_TypeKind_Function = 0x1005, +RDI_TypeKind_Method = 0x1006, +RDI_TypeKind_MemberPtr = 0x1007, +RDI_TypeKind_Struct = 0x2000, +RDI_TypeKind_Class = 0x2001, +RDI_TypeKind_Union = 0x2002, +RDI_TypeKind_Enum = 0x2003, +RDI_TypeKind_Alias = 0x2004, +RDI_TypeKind_IncompleteStruct = 0x2005, +RDI_TypeKind_IncompleteUnion = 0x2006, +RDI_TypeKind_IncompleteClass = 0x2007, +RDI_TypeKind_IncompleteEnum = 0x2008, +RDI_TypeKind_Bitfield = 0xF000, +RDI_TypeKind_COUNT = 0xF002, +RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, +RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Variadic, +RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, +RDI_TypeKind_LastConstructed = RDI_TypeKind_MemberPtr, +RDI_TypeKind_FirstUserDefined = RDI_TypeKind_Struct, +RDI_TypeKind_LastRecord = RDI_TypeKind_Union, +RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, +RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, +RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, +RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, +} RDI_TypeKindEnum; + +typedef RDI_U16 RDI_TypeModifierFlags; +typedef enum RDI_TypeModifierFlagsEnum +{ +RDI_TypeModifierFlag_Const = 1<<0, +RDI_TypeModifierFlag_Volatile = 1<<1, +RDI_TypeModifierFlag_Restrict = 1<<2, +} RDI_TypeModifierFlagsEnum; + +typedef RDI_U8 RDI_UDTFlags; +typedef enum RDI_UDTFlagsEnum +{ +RDI_UDTFlag_EnumMembers = 1<<0, +} RDI_UDTFlagsEnum; + +typedef RDI_U16 RDI_MemberKind; +typedef enum RDI_MemberKindEnum +{ +RDI_MemberKind_NULL = 0x0000, +RDI_MemberKind_DataField = 0x0001, +RDI_MemberKind_StaticData = 0x0002, +RDI_MemberKind_Method = 0x0100, +RDI_MemberKind_StaticMethod = 0x0101, +RDI_MemberKind_VirtualMethod = 0x0102, +RDI_MemberKind_VTablePtr = 0x0200, +RDI_MemberKind_Base = 0x0201, +RDI_MemberKind_VirtualBase = 0x0202, +RDI_MemberKind_NestedType = 0x0300, +} RDI_MemberKindEnum; + +typedef RDI_U8 RDI_ContainerKind; +typedef enum RDI_ContainerKindEnum +{ +RDI_ContainerKind_NULL = 0x0, +RDI_ContainerKind_Type = 0x1, +RDI_ContainerKind_Scope = 0x2, +RDI_ContainerKind_Namespace = 0x3, +} RDI_ContainerKindEnum; + +typedef RDI_U8 RDI_ContainerFlags; +typedef enum RDI_ContainerFlagsEnum +{ +RDI_ContainerFlag_External = 1u<<7, +RDI_ContainerFlag_KindMask = 0x7f, +} RDI_ContainerFlagsEnum; + +typedef RDI_U8 RDI_SymbolFlags; +typedef enum RDI_SymbolFlagsEnum +{ +RDI_SymbolFlag_IsParam = 0x1, +} RDI_SymbolFlagsEnum; + +typedef RDI_U8 RDI_LocationKind; +typedef enum RDI_LocationKindEnum +{ +RDI_LocationKind_NULL = 0x0, +RDI_LocationKind_AddrBytecodeStream = 0x1, +RDI_LocationKind_ValBytecodeStream = 0x2, +RDI_LocationKind_AddrRegPlusOff = 0x3, +RDI_LocationKind_AddrAddrRegPlusOff = 0x4, +RDI_LocationKind_ValReg = 0x5, +RDI_LocationKind_ModuleOff = 0x6, +RDI_LocationKind_TLSOff = 0x7, +RDI_LocationKind_ConstantDataOff = 0x8, +RDI_LocationKind_Set = 0x9, +} RDI_LocationKindEnum; + +typedef RDI_U8 RDI_EvalOp; +typedef enum RDI_EvalOpEnum +{ +RDI_EvalOp_Stop = 0, +RDI_EvalOp_Noop = 1, +RDI_EvalOp_Cond = 2, +RDI_EvalOp_Skip = 3, +RDI_EvalOp_MemRead = 4, +RDI_EvalOp_RegRead = 5, +RDI_EvalOp_RegReadDyn = 6, +RDI_EvalOp_FrameOff = 7, +RDI_EvalOp_ModuleOff = 8, +RDI_EvalOp_TLSOff = 9, +RDI_EvalOp_ObjectOff = 10, +RDI_EvalOp_CFA = 11, +RDI_EvalOp_ConstU8 = 12, +RDI_EvalOp_ConstU16 = 13, +RDI_EvalOp_ConstU32 = 14, +RDI_EvalOp_ConstU64 = 15, +RDI_EvalOp_ConstU128 = 16, +RDI_EvalOp_ConstString = 17, +RDI_EvalOp_Abs = 18, +RDI_EvalOp_Neg = 19, +RDI_EvalOp_Add = 20, +RDI_EvalOp_Sub = 21, +RDI_EvalOp_Mul = 22, +RDI_EvalOp_Div = 23, +RDI_EvalOp_Mod = 24, +RDI_EvalOp_LShift = 25, +RDI_EvalOp_RShift = 26, +RDI_EvalOp_BitAnd = 27, +RDI_EvalOp_BitOr = 28, +RDI_EvalOp_BitXor = 29, +RDI_EvalOp_BitNot = 30, +RDI_EvalOp_LogAnd = 31, +RDI_EvalOp_LogOr = 32, +RDI_EvalOp_LogNot = 33, +RDI_EvalOp_EqEq = 34, +RDI_EvalOp_NtEq = 35, +RDI_EvalOp_LsEq = 36, +RDI_EvalOp_GrEq = 37, +RDI_EvalOp_Less = 38, +RDI_EvalOp_Grtr = 39, +RDI_EvalOp_Trunc = 40, +RDI_EvalOp_TruncSigned = 41, +RDI_EvalOp_Convert = 42, +RDI_EvalOp_Pick = 43, +RDI_EvalOp_Pop = 44, +RDI_EvalOp_Insert = 45, +RDI_EvalOp_ValueRead = 46, +RDI_EvalOp_ByteSwap = 47, +RDI_EvalOp_CallSiteValue = 48, +RDI_EvalOp_PartialValue = 49, +RDI_EvalOp_PartialValueBit = 50, +RDI_EvalOp_Swap = 51, +RDI_EvalOp_PushCfa = 52, +RDI_EvalOp_COUNT = 53, +} RDI_EvalOpEnum; + +typedef RDI_U8 RDI_EvalTypeGroup; +typedef enum RDI_EvalTypeGroupEnum +{ +RDI_EvalTypeGroup_Other = 0, +RDI_EvalTypeGroup_U = 1, +RDI_EvalTypeGroup_S = 2, +RDI_EvalTypeGroup_F32 = 3, +RDI_EvalTypeGroup_F64 = 4, +RDI_EvalTypeGroup_F80 = 5, +RDI_EvalTypeGroup_F128 = 6, +RDI_EvalTypeGroup_COUNT = 7, +} RDI_EvalTypeGroupEnum; + +typedef RDI_U8 RDI_EvalConversionKind; +typedef enum RDI_EvalConversionKindEnum +{ +RDI_EvalConversionKind_Noop = 0, +RDI_EvalConversionKind_Legal = 1, +RDI_EvalConversionKind_OtherToOther = 2, +RDI_EvalConversionKind_ToOther = 3, +RDI_EvalConversionKind_FromOther = 4, +RDI_EvalConversionKind_COUNT = 5, +} RDI_EvalConversionKindEnum; + +typedef RDI_U32 RDI_NameMapKind; +typedef enum RDI_NameMapKindEnum +{ +RDI_NameMapKind_NULL = 0, +RDI_NameMapKind_GlobalVariables = 1, +RDI_NameMapKind_ThreadVariables = 2, +RDI_NameMapKind_Constants = 3, +RDI_NameMapKind_Procedures = 4, +RDI_NameMapKind_Types = 5, +RDI_NameMapKind_LinkNameProcedures = 6, +RDI_NameMapKind_NormalSourcePaths = 7, +RDI_NameMapKind_COUNT = 8, +} RDI_NameMapKindEnum; + +#define RDI_Header_XList \ +X(RDI_U64, magic)\ +X(RDI_U32, encoding_version)\ +X(RDI_U32, data_section_off)\ +X(RDI_U32, data_section_count)\ + +#define RDI_SectionKind_XList \ +X(NULL, null, RDI_U8)\ +X(TopLevelInfo, top_level_info, RDI_TopLevelInfo)\ +X(StringData, string_data, RDI_U8)\ +X(StringTable, string_table, RDI_U32)\ +X(IndexRuns, index_runs, RDI_U32)\ +X(BinarySections, binary_sections, RDI_BinarySection)\ +X(FilePathNodes, file_path_nodes, RDI_FilePathNode)\ +X(SourceFiles, source_files, RDI_SourceFile)\ +X(LineTables, line_tables, RDI_LineTable)\ +X(LineInfoVOffs, line_info_voffs, RDI_U64)\ +X(LineInfoLines, line_info_lines, RDI_Line)\ +X(LineInfoColumns, line_info_columns, RDI_Column)\ +X(SourceLineMaps, source_line_maps, RDI_SourceLineMap)\ +X(SourceLineMapNumbers, source_line_map_numbers, RDI_U32)\ +X(SourceLineMapRanges, source_line_map_ranges, RDI_U32)\ +X(SourceLineMapVOffs, source_line_map_voffs, RDI_U64)\ +X(Units, units, RDI_Unit)\ +X(UnitVMap, unit_vmap, RDI_VMapEntry)\ +X(Namespaces, namespaces, RDI_Namespace)\ +X(TypeNodes, type_nodes, RDI_TypeNode)\ +X(UDTs, udts, RDI_UDT)\ +X(Members, members, RDI_Member)\ +X(EnumMembers, enum_members, RDI_EnumMember)\ +X(Scopes, scopes, RDI_Scope)\ +X(ScopeVOffData, scope_voff_data, RDI_U64)\ +X(ScopeVMap, scope_vmap, RDI_VMapEntry)\ +X(InlineSites, inline_sites, RDI_InlineSite)\ +X(GlobalVariables, global_variables, RDI_Symbol)\ +X(GlobalVMap, global_vmap, RDI_VMapEntry)\ +X(ThreadVariables, thread_variables, RDI_Symbol)\ +X(Constants, constants, RDI_Symbol)\ +X(Procedures, procedures, RDI_Symbol)\ +X(LocalVariables, local_variables, RDI_Symbol)\ +X(LocationsBytecodeData, locations_bytecode_data, RDI_U8)\ +X(LocationsConstantData, locations_constant_data, RDI_U8)\ +X(LocationsSetElements, locations_set_elements, RDI_LocationSetElement)\ +X(MD5Checksums, md5_checksums, RDI_MD5)\ +X(SHA1Checksums, sha1_checksums, RDI_SHA1)\ +X(SHA256Checksums, sha256_checksums, RDI_SHA256)\ +X(Timestamps, timestamps, RDI_U64)\ +X(NameMaps, name_maps, RDI_NameMap)\ +X(NameMapBuckets, name_map_buckets, RDI_NameMapBucket)\ +X(NameMapNodes, name_map_nodes, RDI_NameMapNode)\ + +#define RDI_SectionEncoding_XList \ +X(Unpacked)\ +X(LZB)\ + +#define RDI_Section_XList \ +X(RDI_SectionEncoding, encoding)\ +X(RDI_U32, pad)\ +X(RDI_U64, off)\ +X(RDI_U64, encoded_size)\ +X(RDI_U64, unpacked_size)\ + +#define RDI_VMapEntry_XList \ +X(RDI_U64, voff)\ +X(RDI_U64, idx)\ + +#define RDI_Arch_XList \ +X(NULL)\ +X(X64)\ +X(X86)\ + +#define RDI_RegCodeX64_XList \ +X(nil, 0)\ +X(rax, 1)\ +X(rcx, 2)\ +X(rdx, 3)\ +X(rbx, 4)\ +X(rsp, 5)\ +X(rbp, 6)\ +X(rsi, 7)\ +X(rdi, 8)\ +X(r8, 9)\ +X(r9, 10)\ +X(r10, 11)\ +X(r11, 12)\ +X(r12, 13)\ +X(r13, 14)\ +X(r14, 15)\ +X(r15, 16)\ +X(es, 17)\ +X(cs, 18)\ +X(ss, 19)\ +X(ds, 20)\ +X(fs, 21)\ +X(gs, 22)\ +X(rip, 23)\ +X(rflags, 24)\ +X(dr0, 25)\ +X(dr1, 26)\ +X(dr2, 27)\ +X(dr3, 28)\ +X(dr4, 29)\ +X(dr5, 30)\ +X(dr6, 31)\ +X(dr7, 32)\ +X(st0, 33)\ +X(st1, 34)\ +X(st2, 35)\ +X(st3, 36)\ +X(st4, 37)\ +X(st5, 38)\ +X(st6, 39)\ +X(st7, 40)\ +X(zmm0, 41)\ +X(zmm1, 42)\ +X(zmm2, 43)\ +X(zmm3, 44)\ +X(zmm4, 45)\ +X(zmm5, 46)\ +X(zmm6, 47)\ +X(zmm7, 48)\ +X(zmm8, 49)\ +X(zmm9, 50)\ +X(zmm10, 51)\ +X(zmm11, 52)\ +X(zmm12, 53)\ +X(zmm13, 54)\ +X(zmm14, 55)\ +X(zmm15, 56)\ +X(zmm16, 57)\ +X(zmm17, 58)\ +X(zmm18, 59)\ +X(zmm19, 60)\ +X(zmm20, 61)\ +X(zmm21, 62)\ +X(zmm22, 63)\ +X(zmm23, 64)\ +X(zmm24, 65)\ +X(zmm25, 66)\ +X(zmm26, 67)\ +X(zmm27, 68)\ +X(zmm28, 69)\ +X(zmm29, 70)\ +X(zmm30, 71)\ +X(zmm31, 72)\ +X(k0, 73)\ +X(k1, 74)\ +X(k2, 75)\ +X(k3, 76)\ +X(k4, 77)\ +X(k5, 78)\ +X(k6, 79)\ +X(k7, 80)\ +X(mxcsr, 81)\ +X(fsbase, 82)\ +X(gsbase, 83)\ +X(fcw, 84)\ +X(fsw, 85)\ +X(ftw, 86)\ +X(fop, 87)\ +X(fcs, 88)\ +X(fds, 89)\ +X(fip, 90)\ +X(fdp, 91)\ +X(mxcsr_mask, 92)\ +X(cetmsr, 93)\ +X(cetssp, 94)\ + +#define RDI_TopLevelInfo_XList \ +X(RDI_Arch, arch)\ +X(RDI_U32, exe_name_string_idx)\ +X(RDI_U64, exe_hash)\ +X(RDI_U64, voff_max)\ +X(RDI_GUID, guid)\ +X(RDI_U32, producer_name_string_idx)\ + +#define RDI_BinarySectionFlags_XList \ +X(Read)\ +X(Write)\ +X(Execute)\ + +#define RDI_BinarySection_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_BinarySectionFlags, flags)\ +X(RDI_U64, voff_first)\ +X(RDI_U64, voff_opl)\ +X(RDI_U64, foff_first)\ +X(RDI_U64, foff_opl)\ + +#define RDI_ChecksumKind_XList \ +X(NULL, NULL)\ +X(MD5, MD5Checksums)\ +X(SHA1, SHA1Checksums)\ +X(SHA256, SHA256Checksums)\ +X(Timestamp, Timestamps)\ +X(COUNT, NULL)\ + +#define RDI_FilePathNode_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, parent_path_node)\ +X(RDI_U32, first_child)\ +X(RDI_U32, next_sibling)\ +X(RDI_U32, source_file_idx)\ + +#define RDI_SourceFile_XList \ +X(RDI_U32, file_path_node_idx)\ +X(RDI_U32, normal_full_path_string_idx)\ +X(RDI_U32, source_line_map_idx)\ +X(RDI_ChecksumKind, checksum_kind)\ +X(RDI_U32, checksum_idx)\ + +#define RDI_Unit_XList \ +X(RDI_U32, unit_name_string_idx)\ +X(RDI_U32, compiler_name_string_idx)\ +X(RDI_U32, source_file_path_node)\ +X(RDI_U32, object_file_path_node)\ +X(RDI_U32, archive_file_path_node)\ +X(RDI_U32, build_path_node)\ +X(RDI_Language, language)\ +X(RDI_U32, line_table_idx)\ +X(RDI_U32, procedures_first_idx)\ +X(RDI_U32, procedures_count)\ +X(RDI_U32, global_variables_first_idx)\ +X(RDI_U32, global_variables_count)\ +X(RDI_U32, thread_variables_first_idx)\ +X(RDI_U32, thread_variables_count)\ +X(RDI_U32, constants_first_idx)\ +X(RDI_U32, constants_count)\ + +#define RDI_LineTable_XList \ +X(RDI_U32, voffs_base_idx)\ +X(RDI_U32, lines_base_idx)\ +X(RDI_U32, cols_base_idx)\ +X(RDI_U32, lines_count)\ +X(RDI_U32, cols_count)\ + +#define RDI_Line_XList \ +X(RDI_U32, file_idx)\ +X(RDI_U32, line_num)\ + +#define RDI_Column_XList \ +X(RDI_U16, col_first)\ +X(RDI_U16, col_opl)\ + +#define RDI_SourceLineMapMemberTable \ +X(RDI_U32, line_count)\ +X(RDI_U32, voff_count)\ +X(RDI_U32, line_map_nums_base_idx)\ +X(RDI_U32, line_map_range_base_idx)\ +X(RDI_U32, line_map_voff_base_idx)\ + +#define RDI_Language_XList \ +X(NULL)\ +X(C)\ +X(CPlusPlus)\ +X(Masm)\ +X(COUNT)\ + +#define RDI_TypeKind_XList \ +X(NULL)\ +X(Void)\ +X(Handle)\ +X(HResult)\ +X(Char8)\ +X(Char16)\ +X(Char32)\ +X(UChar8)\ +X(UChar16)\ +X(UChar32)\ +X(U8)\ +X(U16)\ +X(U32)\ +X(U64)\ +X(U128)\ +X(U256)\ +X(U512)\ +X(S8)\ +X(S16)\ +X(S32)\ +X(S64)\ +X(S128)\ +X(S256)\ +X(S512)\ +X(Bool)\ +X(BF16)\ +X(F16)\ +X(F32)\ +X(F32PP)\ +X(F48)\ +X(F64)\ +X(F80)\ +X(F96)\ +X(F128)\ +X(ComplexF32)\ +X(ComplexF64)\ +X(ComplexF80)\ +X(ComplexF128)\ +X(Decimal32)\ +X(Decimal64)\ +X(Decimal128)\ +X(Variadic)\ +X(Modifier)\ +X(Ptr)\ +X(LRef)\ +X(RRef)\ +X(Array)\ +X(Function)\ +X(Method)\ +X(MemberPtr)\ +X(Struct)\ +X(Class)\ +X(Union)\ +X(Enum)\ +X(Alias)\ +X(IncompleteStruct)\ +X(IncompleteUnion)\ +X(IncompleteClass)\ +X(IncompleteEnum)\ +X(Bitfield)\ +X(COUNT)\ + +#define RDI_TypeModifierFlags_XList \ +X(Const)\ +X(Volatile)\ +X(Restrict)\ + +#define RDI_TypeNode_XList \ +X(RDI_TypeKind, kind)\ +X(RDI_U16, flags)\ +X(RDI_U32, byte_size)\ + +#define RDI_UDTFlags_XList \ +X(EnumMembers)\ + +#define RDI_UDT_XList \ +X(RDI_U32, self_type_idx)\ +X(RDI_UDTFlags, flags)\ +X(RDI_ContainerFlags, container_flags)\ +X(RDI_U16, reserved_0)\ +X(RDI_U32, member_first)\ +X(RDI_U32, member_count)\ +X(RDI_U32, file_idx)\ +X(RDI_U32, line)\ +X(RDI_U32, col)\ +X(RDI_U32, container_idx)\ + +#define RDI_MemberKind_XList \ +X(NULL)\ +X(DataField)\ +X(StaticData)\ +X(Method)\ +X(StaticMethod)\ +X(VirtualMethod)\ +X(VTablePtr)\ +X(Base)\ +X(VirtualBase)\ +X(NestedType)\ + +#define RDI_Member_XList \ +X(RDI_MemberKind, kind)\ +X(RDI_U16, pad)\ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, off)\ + +#define RDI_EnumMember_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, pad)\ +X(RDI_U64, val)\ + +#define RDI_LinkFlags_XList \ +X($(a.name != COUNT -> a.name))\ + +#define RDI_LocationKind_XList \ +X(NULL)\ +X(AddrBytecodeStream)\ +X(ValBytecodeStream)\ +X(AddrRegPlusOff)\ +X(AddrAddrRegPlusOff)\ +X(ValReg)\ +X(ModuleOff)\ +X(TLSOff)\ +X(ConstantDataOff)\ +X(Set)\ + +#define RDI_Namespace_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_ContainerFlags, container_flags)\ +X(RDI_U8, padding_0)\ +X(RDI_U16, padding_1)\ +X(RDI_U32, container_idx)\ + +#define RDI_Symbol_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_SymbolFlags, symbol_flags)\ +X(RDI_ContainerFlags, container_flags)\ +X(RDI_U16, reserved_0)\ +X(RDI_Location, location)\ +X(RDI_U32, container_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, root_scope_idx)\ +X(RDI_U32, link_name_string_idx)\ + +#define RDI_Scope_XList \ +X(RDI_U32, proc_idx)\ +X(RDI_U32, parent_scope_idx)\ +X(RDI_U32, first_child_scope_idx)\ +X(RDI_U32, next_sibling_scope_idx)\ +X(RDI_U32, voff_range_first)\ +X(RDI_U32, voff_range_opl)\ +X(RDI_U32, local_first)\ +X(RDI_U32, local_count)\ +X(RDI_U32, inline_site_idx)\ + +#define RDI_InlineSite_XList \ +X(RDI_U32, name_string_idx)\ +X(RDI_U32, type_idx)\ +X(RDI_U32, owner_type_idx)\ +X(RDI_U32, line_table_idx)\ + +#define RDI_EvalOp_XList \ +X(Stop)\ +X(Noop)\ +X(Cond)\ +X(Skip)\ +X(MemRead)\ +X(RegRead)\ +X(RegReadDyn)\ +X(FrameOff)\ +X(ModuleOff)\ +X(TLSOff)\ +X(ObjectOff)\ +X(CFA)\ +X(ConstU8)\ +X(ConstU16)\ +X(ConstU32)\ +X(ConstU64)\ +X(ConstU128)\ +X(ConstString)\ +X(Abs)\ +X(Neg)\ +X(Add)\ +X(Sub)\ +X(Mul)\ +X(Div)\ +X(Mod)\ +X(LShift)\ +X(RShift)\ +X(BitAnd)\ +X(BitOr)\ +X(BitXor)\ +X(BitNot)\ +X(LogAnd)\ +X(LogOr)\ +X(LogNot)\ +X(EqEq)\ +X(NtEq)\ +X(LsEq)\ +X(GrEq)\ +X(Less)\ +X(Grtr)\ +X(Trunc)\ +X(TruncSigned)\ +X(Convert)\ +X(Pick)\ +X(Pop)\ +X(Insert)\ +X(ValueRead)\ +X(ByteSwap)\ +X(CallSiteValue)\ +X(PartialValue)\ +X(PartialValueBit)\ +X(Swap)\ +X(PushCfa)\ + +#define RDI_EvalTypeGroup_XList \ +X(Other)\ +X(U)\ +X(S)\ +X(F32)\ +X(F64)\ +X(F80)\ +X(F128)\ + +#define RDI_EvalConversionKind_XList \ +X(Noop)\ +X(Legal)\ +X(OtherToOther)\ +X(ToOther)\ +X(FromOther)\ + +#define RDI_NameMapKind_XList \ +X(NULL)\ +X(GlobalVariables)\ +X(ThreadVariables)\ +X(Constants)\ +X(Procedures)\ +X(Types)\ +X(LinkNameProcedures)\ +X(NormalSourcePaths)\ + +#define RDI_NameMap_XList \ +X(RDI_U32, bucket_base_idx)\ +X(RDI_U32, node_base_idx)\ +X(RDI_U32, bucket_count)\ +X(RDI_U32, node_count)\ + +#define RDI_NameMapBucket_XList \ +X(RDI_U32, first_node)\ +X(RDI_U32, node_count)\ + +#define RDI_NameMapNode_XList \ +X(RDI_U32, string_idx)\ +X(RDI_U32, match_count)\ +X(RDI_U32, match_idx_or_idx_run_first)\ + +#if !RDI_DISABLE_TABLE_INDEX_TYPECHECKING +typedef struct RDI_U32_StringTable { RDI_U32 v; } RDI_U32_StringTable; +typedef struct RDI_U32_IndexRuns { RDI_U32 v; } RDI_U32_IndexRuns; +typedef struct RDI_U32_BinarySections { RDI_U32 v; } RDI_U32_BinarySections; +typedef struct RDI_U32_FilePathNodes { RDI_U32 v; } RDI_U32_FilePathNodes; +typedef struct RDI_U32_SourceFiles { RDI_U32 v; } RDI_U32_SourceFiles; +typedef struct RDI_U32_LineTables { RDI_U32 v; } RDI_U32_LineTables; +typedef struct RDI_U32_LineInfoVOffs { RDI_U32 v; } RDI_U32_LineInfoVOffs; +typedef struct RDI_U32_LineInfoLines { RDI_U32 v; } RDI_U32_LineInfoLines; +typedef struct RDI_U32_LineInfoColumns { RDI_U32 v; } RDI_U32_LineInfoColumns; +typedef struct RDI_U32_SourceLineMaps { RDI_U32 v; } RDI_U32_SourceLineMaps; +typedef struct RDI_U32_SourceLineMapNumbers { RDI_U32 v; } RDI_U32_SourceLineMapNumbers; +typedef struct RDI_U32_SourceLineMapRanges { RDI_U32 v; } RDI_U32_SourceLineMapRanges; +typedef struct RDI_U32_SourceLineMapVOffs { RDI_U32 v; } RDI_U32_SourceLineMapVOffs; +typedef struct RDI_U32_Units { RDI_U32 v; } RDI_U32_Units; +typedef struct RDI_U32_Namespaces { RDI_U32 v; } RDI_U32_Namespaces; +typedef struct RDI_U32_TypeNodes { RDI_U32 v; } RDI_U32_TypeNodes; +typedef struct RDI_U32_UDTs { RDI_U32 v; } RDI_U32_UDTs; +typedef struct RDI_U32_Members { RDI_U32 v; } RDI_U32_Members; +typedef struct RDI_U32_EnumMembers { RDI_U32 v; } RDI_U32_EnumMembers; +typedef struct RDI_U32_Scopes { RDI_U32 v; } RDI_U32_Scopes; +typedef struct RDI_U32_ScopeVOffData { RDI_U32 v; } RDI_U32_ScopeVOffData; +typedef struct RDI_U32_InlineSites { RDI_U32 v; } RDI_U32_InlineSites; +typedef struct RDI_U32_GlobalVariables { RDI_U32 v; } RDI_U32_GlobalVariables; +typedef struct RDI_U32_ThreadVariables { RDI_U32 v; } RDI_U32_ThreadVariables; +typedef struct RDI_U32_Constants { RDI_U32 v; } RDI_U32_Constants; +typedef struct RDI_U32_Procedures { RDI_U32 v; } RDI_U32_Procedures; +typedef struct RDI_U32_LocalVariables { RDI_U32 v; } RDI_U32_LocalVariables; +typedef struct RDI_U32_LocationsBytecodeData { RDI_U32 v; } RDI_U32_LocationsBytecodeData; +typedef struct RDI_U32_LocationsConstantData { RDI_U32 v; } RDI_U32_LocationsConstantData; +typedef struct RDI_U32_LocationsSetElements { RDI_U32 v; } RDI_U32_LocationsSetElements; +typedef struct RDI_U32_MD5Checksums { RDI_U32 v; } RDI_U32_MD5Checksums; +typedef struct RDI_U32_SHA1Checksums { RDI_U32 v; } RDI_U32_SHA1Checksums; +typedef struct RDI_U32_SHA256Checksums { RDI_U32 v; } RDI_U32_SHA256Checksums; +typedef struct RDI_U32_Timestamps { RDI_U32 v; } RDI_U32_Timestamps; +typedef struct RDI_U32_NameMaps { RDI_U32 v; } RDI_U32_NameMaps; +typedef struct RDI_U32_NameMapBuckets { RDI_U32 v; } RDI_U32_NameMapBuckets; +typedef struct RDI_U32_NameMapNodes { RDI_U32 v; } RDI_U32_NameMapNodes; +#else +typedef struct RDI_U32_Table { RDI_U32 v; } RDI_U32_Table; +typedef struct RDI_U64_Table { RDI_U64 v; } RDI_U64_Table; +typedef RDI_U32_Table RDI_U32_StringTable; +typedef RDI_U32_Table RDI_U32_IndexRuns; +typedef RDI_U32_Table RDI_U32_BinarySections; +typedef RDI_U32_Table RDI_U32_FilePathNodes; +typedef RDI_U32_Table RDI_U32_SourceFiles; +typedef RDI_U32_Table RDI_U32_LineTables; +typedef RDI_U32_Table RDI_U32_LineInfoVOffs; +typedef RDI_U32_Table RDI_U32_LineInfoLines; +typedef RDI_U32_Table RDI_U32_LineInfoColumns; +typedef RDI_U32_Table RDI_U32_SourceLineMaps; +typedef RDI_U32_Table RDI_U32_SourceLineMapNumbers; +typedef RDI_U32_Table RDI_U32_SourceLineMapRanges; +typedef RDI_U32_Table RDI_U32_SourceLineMapVOffs; +typedef RDI_U32_Table RDI_U32_Units; +typedef RDI_U32_Table RDI_U32_Namespaces; +typedef RDI_U32_Table RDI_U32_TypeNodes; +typedef RDI_U32_Table RDI_U32_UDTs; +typedef RDI_U32_Table RDI_U32_Members; +typedef RDI_U32_Table RDI_U32_EnumMembers; +typedef RDI_U32_Table RDI_U32_Scopes; +typedef RDI_U32_Table RDI_U32_ScopeVOffData; +typedef RDI_U32_Table RDI_U32_InlineSites; +typedef RDI_U32_Table RDI_U32_GlobalVariables; +typedef RDI_U32_Table RDI_U32_ThreadVariables; +typedef RDI_U32_Table RDI_U32_Constants; +typedef RDI_U32_Table RDI_U32_Procedures; +typedef RDI_U32_Table RDI_U32_LocalVariables; +typedef RDI_U32_Table RDI_U32_LocationsBytecodeData; +typedef RDI_U32_Table RDI_U32_LocationsConstantData; +typedef RDI_U32_Table RDI_U32_LocationsSetElements; +typedef RDI_U32_Table RDI_U32_MD5Checksums; +typedef RDI_U32_Table RDI_U32_SHA1Checksums; +typedef RDI_U32_Table RDI_U32_SHA256Checksums; +typedef RDI_U32_Table RDI_U32_Timestamps; +typedef RDI_U32_Table RDI_U32_NameMaps; +typedef RDI_U32_Table RDI_U32_NameMapBuckets; +typedef RDI_U32_Table RDI_U32_NameMapNodes; +#endif + +typedef RDI_U64 RDI_Location; +#define RDI_Location_KindMask 0xff00000000000000ull +#define RDI_Location_KindShift 56 +#define RDI_Location_OffMask 0x00ffffffffffffffull +#define RDI_Location_OffShift 0 +#define RDI_Location_SetFirstIndexMask 0x00000000ffffffffull +#define RDI_Location_SetFirstIndexShift 0 +#define RDI_Location_SetCountMask 0x00ffffff00000000ull +#define RDI_Location_SetCountShift 32 +#define RDI_Location_RegCodeMask 0x00ff000000000000ull +#define RDI_Location_RegCodeShift 48 +#define RDI_Location_RegOffMask 0x0000ffff00000000ull +#define RDI_Location_RegOffShift 32 +#define rdi_kind_from_location(l) ((((l) & RDI_Location_KindMask) >> RDI_Location_KindShift)) +#define rdi_regcode_from_location(l) ((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_ValReg) ? (((l) & RDI_Location_RegCodeMask) >> RDI_Location_RegCodeShift) : 0) +#define rdi_regoff_from_location(l) (RDI_S64)(RDI_S32)(RDI_S16)((rdi_kind_from_location(l) == RDI_LocationKind_AddrRegPlusOff || rdi_kind_from_location(l) == RDI_LocationKind_AddrAddrRegPlusOff) ? (((l) & RDI_Location_RegOffMask) >> RDI_Location_RegOffShift) : 0) +#define rdi_voff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ModuleOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) +#define rdi_toff_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_TLSOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) +#define rdi_constant_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_ConstantDataOff ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) +#define rdi_bytecode_data_off_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_AddrBytecodeStream || rdi_kind_from_location(l) == RDI_LocationKind_ValBytecodeStream ? (((l) & RDI_Location_OffMask) >> RDI_Location_OffShift) : 0) +#define rdi_set_first_index_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetFirstIndexMask) >> RDI_Location_SetFirstIndexShift) : 0) +#define rdi_set_count_from_location(l) (rdi_kind_from_location(l) == RDI_LocationKind_Set ? (((l) & RDI_Location_SetCountMask) >> RDI_Location_SetCountShift) : 0) +#define rdi_location_voff(voff) ((((RDI_U64)RDI_LocationKind_ModuleOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((voff) & ~RDI_Location_KindMask)) +#define rdi_location_toff(toff) ((((RDI_U64)RDI_LocationKind_TLSOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((toff) & ~RDI_Location_KindMask)) +#define rdi_location_constant_data_off(off) ((((RDI_U64)RDI_LocationKind_ConstantDataOff << RDI_Location_KindShift) & RDI_Location_KindMask) | ((off) & ~RDI_Location_KindMask)) +#define rdi_location_reg(kind, reg, off) ((((RDI_U64)(kind) << RDI_Location_KindShift) & RDI_Location_KindMask) | (((RDI_U64)(reg) << RDI_Location_RegCodeShift) & RDI_Location_RegCodeMask) | (((RDI_U64)(off) << RDI_Location_RegOffShift) & RDI_Location_RegOffMask)) +#define rdi_location_bytecode(kind, off) ((((RDI_U64)(kind) << RDI_Location_KindShift) & RDI_Location_KindMask) | (((RDI_U64)(off) << RDI_Location_OffShift) & RDI_Location_OffMask)) +#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0)) +#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 8) & 0xff) +#define RDI_POPN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 4) & 0xf) +#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits) (((ctrlbits) >> 0) & 0xf) +#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16)) + +typedef struct RDI_Header RDI_Header; +struct RDI_Header +{ +RDI_U64 magic; +RDI_U32 encoding_version; +RDI_U32 data_section_off; +RDI_U32 data_section_count; +}; + +typedef struct RDI_Section RDI_Section; +struct RDI_Section +{ +RDI_SectionEncoding encoding; +RDI_U32 pad; +RDI_U64 off; +RDI_U64 encoded_size; +RDI_U64 unpacked_size; +}; + +typedef struct RDI_VMapEntry RDI_VMapEntry; +struct RDI_VMapEntry +{ +RDI_U64 voff; +RDI_U64 idx; +}; + +typedef struct RDI_TopLevelInfo RDI_TopLevelInfo; +struct RDI_TopLevelInfo +{ +RDI_Arch arch; +RDI_U32 exe_name_string_idx; +RDI_U64 exe_hash; +RDI_U64 voff_max; +RDI_GUID guid; +RDI_U32 producer_name_string_idx; +}; + +typedef struct RDI_BinarySection RDI_BinarySection; +struct RDI_BinarySection +{ +RDI_U32 name_string_idx; +RDI_BinarySectionFlags flags; +RDI_U64 voff_first; +RDI_U64 voff_opl; +RDI_U64 foff_first; +RDI_U64 foff_opl; +}; + +typedef struct RDI_FilePathNode RDI_FilePathNode; +struct RDI_FilePathNode +{ +RDI_U32 name_string_idx; +RDI_U32 parent_path_node; +RDI_U32 first_child; +RDI_U32 next_sibling; +RDI_U32 source_file_idx; +}; + +typedef struct RDI_SourceFile RDI_SourceFile; +struct RDI_SourceFile +{ +RDI_U32 file_path_node_idx; +RDI_U32 normal_full_path_string_idx; +RDI_U32 source_line_map_idx; +RDI_ChecksumKind checksum_kind; +RDI_U32 checksum_idx; +}; + +typedef struct RDI_Unit RDI_Unit; +struct RDI_Unit +{ +RDI_U32 unit_name_string_idx; +RDI_U32 compiler_name_string_idx; +RDI_U32 source_file_path_node; +RDI_U32 object_file_path_node; +RDI_U32 archive_file_path_node; +RDI_U32 build_path_node; +RDI_Language language; +RDI_U32 line_table_idx; +RDI_U32 procedures_first_idx; +RDI_U32 procedures_count; +RDI_U32 global_variables_first_idx; +RDI_U32 global_variables_count; +RDI_U32 thread_variables_first_idx; +RDI_U32 thread_variables_count; +RDI_U32 constants_first_idx; +RDI_U32 constants_count; +}; + +typedef struct RDI_LineTable RDI_LineTable; +struct RDI_LineTable +{ +RDI_U32 voffs_base_idx; +RDI_U32 lines_base_idx; +RDI_U32 cols_base_idx; +RDI_U32 lines_count; +RDI_U32 cols_count; +}; + +typedef struct RDI_Line RDI_Line; +struct RDI_Line +{ +RDI_U32 file_idx; +RDI_U32 line_num; +}; + +typedef struct RDI_Column RDI_Column; +struct RDI_Column +{ +RDI_U16 col_first; +RDI_U16 col_opl; +}; + +typedef struct RDI_SourceLineMap RDI_SourceLineMap; +struct RDI_SourceLineMap +{ +RDI_U32 line_count; +RDI_U32 voff_count; +RDI_U32 line_map_nums_base_idx; +RDI_U32 line_map_range_base_idx; +RDI_U32 line_map_voff_base_idx; +}; + +typedef struct RDI_TypeNode RDI_TypeNode; +struct RDI_TypeNode +{ +RDI_TypeKind kind; +RDI_U16 flags; +RDI_U32 byte_size; + + union + { + // kind is 'built-in' + struct + { + RDI_U32 name_string_idx; + } built_in; + + // kind is 'constructed' + struct + { + RDI_U32 direct_type_idx; + RDI_U32 count; + union + { + // when kind is 'Function' or 'Method' + RDI_U32 param_idx_run_first; + // when kind is 'MemberPtr' + RDI_U32 owner_type_idx; + }; + } + constructed; + + // kind is 'user defined' + struct + { + RDI_U32 name_string_idx; + RDI_U32 direct_type_idx; + RDI_U32 udt_idx; + } + user_defined; + + // (kind = Bitfield) + struct + { + RDI_U32 direct_type_idx; + RDI_U32 off; + RDI_U32 size; + } + bitfield; + } + ; +}; + +typedef struct RDI_UDT RDI_UDT; +struct RDI_UDT +{ +RDI_U32 self_type_idx; +RDI_UDTFlags flags; +RDI_ContainerFlags container_flags; +RDI_U16 reserved_0; +RDI_U32 member_first; +RDI_U32 member_count; +RDI_U32 file_idx; +RDI_U32 line; +RDI_U32 col; +RDI_U32 container_idx; +}; + +typedef struct RDI_Member RDI_Member; +struct RDI_Member +{ +RDI_MemberKind kind; +RDI_U16 pad; +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 off; +}; + +typedef struct RDI_EnumMember RDI_EnumMember; +struct RDI_EnumMember +{ +RDI_U32 name_string_idx; +RDI_U32 pad; +RDI_U64 val; +}; + +typedef struct RDI_Namespace RDI_Namespace; +struct RDI_Namespace +{ +RDI_U32 name_string_idx; +RDI_ContainerFlags container_flags; +RDI_U8 padding_0; +RDI_U16 padding_1; +RDI_U32 container_idx; +}; + +typedef struct RDI_Symbol RDI_Symbol; +struct RDI_Symbol +{ +RDI_U32 name_string_idx; +RDI_SymbolFlags symbol_flags; +RDI_ContainerFlags container_flags; +RDI_U16 reserved_0; +RDI_Location location; +RDI_U32 container_idx; +RDI_U32 type_idx; +RDI_U32 root_scope_idx; +RDI_U32 link_name_string_idx; +}; + +typedef struct RDI_Scope RDI_Scope; +struct RDI_Scope +{ +RDI_U32 proc_idx; +RDI_U32 parent_scope_idx; +RDI_U32 first_child_scope_idx; +RDI_U32 next_sibling_scope_idx; +RDI_U32 voff_range_first; +RDI_U32 voff_range_opl; +RDI_U32 local_first; +RDI_U32 local_count; +RDI_U32 inline_site_idx; +}; + +typedef struct RDI_InlineSite RDI_InlineSite; +struct RDI_InlineSite +{ +RDI_U32 name_string_idx; +RDI_U32 type_idx; +RDI_U32 owner_type_idx; +RDI_U32 line_table_idx; +}; + +typedef struct RDI_LocationSetElement RDI_LocationSetElement; +struct RDI_LocationSetElement +{ +RDI_U64 voff_first; +RDI_U64 voff_opl; +RDI_Location location; +}; + +typedef struct RDI_NameMap RDI_NameMap; +struct RDI_NameMap +{ +RDI_U32 bucket_base_idx; +RDI_U32 node_base_idx; +RDI_U32 bucket_count; +RDI_U32 node_count; +}; + +typedef struct RDI_NameMapBucket RDI_NameMapBucket; +struct RDI_NameMapBucket +{ +RDI_U32 first_node; +RDI_U32 node_count; +}; + +typedef struct RDI_NameMapNode RDI_NameMapNode; +struct RDI_NameMapNode +{ +RDI_U32 string_idx; +RDI_U32 match_count; +RDI_U32 match_idx_or_idx_run_first; +}; + +typedef RDI_TopLevelInfo RDI_SectionElementType_TopLevelInfo; +typedef RDI_U8 RDI_SectionElementType_StringData; +typedef RDI_U32 RDI_SectionElementType_StringTable; +typedef RDI_U32 RDI_SectionElementType_IndexRuns; +typedef RDI_BinarySection RDI_SectionElementType_BinarySections; +typedef RDI_FilePathNode RDI_SectionElementType_FilePathNodes; +typedef RDI_SourceFile RDI_SectionElementType_SourceFiles; +typedef RDI_LineTable RDI_SectionElementType_LineTables; +typedef RDI_U64 RDI_SectionElementType_LineInfoVOffs; +typedef RDI_Line RDI_SectionElementType_LineInfoLines; +typedef RDI_Column RDI_SectionElementType_LineInfoColumns; +typedef RDI_SourceLineMap RDI_SectionElementType_SourceLineMaps; +typedef RDI_U32 RDI_SectionElementType_SourceLineMapNumbers; +typedef RDI_U32 RDI_SectionElementType_SourceLineMapRanges; +typedef RDI_U64 RDI_SectionElementType_SourceLineMapVOffs; +typedef RDI_Unit RDI_SectionElementType_Units; +typedef RDI_VMapEntry RDI_SectionElementType_UnitVMap; +typedef RDI_Namespace RDI_SectionElementType_Namespaces; +typedef RDI_TypeNode RDI_SectionElementType_TypeNodes; +typedef RDI_UDT RDI_SectionElementType_UDTs; +typedef RDI_Member RDI_SectionElementType_Members; +typedef RDI_EnumMember RDI_SectionElementType_EnumMembers; +typedef RDI_Scope RDI_SectionElementType_Scopes; +typedef RDI_U64 RDI_SectionElementType_ScopeVOffData; +typedef RDI_VMapEntry RDI_SectionElementType_ScopeVMap; +typedef RDI_InlineSite RDI_SectionElementType_InlineSites; +typedef RDI_Symbol RDI_SectionElementType_GlobalVariables; +typedef RDI_VMapEntry RDI_SectionElementType_GlobalVMap; +typedef RDI_Symbol RDI_SectionElementType_ThreadVariables; +typedef RDI_Symbol RDI_SectionElementType_Constants; +typedef RDI_Symbol RDI_SectionElementType_Procedures; +typedef RDI_Symbol RDI_SectionElementType_LocalVariables; +typedef RDI_U8 RDI_SectionElementType_LocationsBytecodeData; +typedef RDI_U8 RDI_SectionElementType_LocationsConstantData; +typedef RDI_LocationSetElement RDI_SectionElementType_LocationsSetElements; +typedef RDI_MD5 RDI_SectionElementType_MD5Checksums; +typedef RDI_SHA1 RDI_SectionElementType_SHA1Checksums; +typedef RDI_SHA256 RDI_SectionElementType_SHA256Checksums; +typedef RDI_U64 RDI_SectionElementType_Timestamps; +typedef RDI_NameMap RDI_SectionElementType_NameMaps; +typedef RDI_NameMapBucket RDI_SectionElementType_NameMapBuckets; +typedef RDI_NameMapNode RDI_SectionElementType_NameMapNodes; + +RDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size); +RDI_PROC RDI_U8 *rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out); +RDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind); +RDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch); +RDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out); +RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group); +RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); + +extern RDI_U16 rdi_section_element_size_table[44]; +extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; + +#endif // RDI_H diff --git a/src/radbin/generated/radbin.meta.c b/src/radbin/generated/radbin.meta.c index 11d620e7..022956eb 100644 --- a/src/radbin/generated/radbin.meta.c +++ b/src/radbin/generated/radbin.meta.c @@ -1,22 +1,22 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 rb_file_format_display_name_table[10] = -{ -{0}, -str8_lit_comp("PDB"), -str8_lit_comp("PE"), -str8_lit_comp("COFF (OBJ)"), -str8_lit_comp("COFF (Big OBJ)"), -str8_lit_comp("COFF (Archive)"), -str8_lit_comp("COFF (Thin Archive)"), -str8_lit_comp("ELF32"), -str8_lit_comp("ELF64"), -str8_lit_comp("RDI"), -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 rb_file_format_display_name_table[10] = +{ +{0}, +str8_lit_comp("PDB"), +str8_lit_comp("PE"), +str8_lit_comp("COFF (OBJ)"), +str8_lit_comp("COFF (Big OBJ)"), +str8_lit_comp("COFF (Archive)"), +str8_lit_comp("COFF (Thin Archive)"), +str8_lit_comp("ELF32"), +str8_lit_comp("ELF64"), +str8_lit_comp("RDI"), +}; + +C_LINKAGE_END + diff --git a/src/radbin/generated/radbin.meta.h b/src/radbin/generated/radbin.meta.h index 8f8260de..bcfda7d1 100644 --- a/src/radbin/generated/radbin.meta.h +++ b/src/radbin/generated/radbin.meta.h @@ -1,29 +1,29 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef RADBIN_META_H -#define RADBIN_META_H - -typedef enum RB_FileFormat -{ -RB_FileFormat_Null, -RB_FileFormat_PDB, -RB_FileFormat_PE, -RB_FileFormat_COFF_OBJ, -RB_FileFormat_COFF_BigOBJ, -RB_FileFormat_COFF_Archive, -RB_FileFormat_COFF_ThinArchive, -RB_FileFormat_ELF32, -RB_FileFormat_ELF64, -RB_FileFormat_RDI, -RB_FileFormat_COUNT, -} RB_FileFormat; - -C_LINKAGE_BEGIN -extern String8 rb_file_format_display_name_table[10]; - -C_LINKAGE_END - -#endif // RADBIN_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef RADBIN_META_H +#define RADBIN_META_H + +typedef enum RB_FileFormat +{ +RB_FileFormat_Null, +RB_FileFormat_PDB, +RB_FileFormat_PE, +RB_FileFormat_COFF_OBJ, +RB_FileFormat_COFF_BigOBJ, +RB_FileFormat_COFF_Archive, +RB_FileFormat_COFF_ThinArchive, +RB_FileFormat_ELF32, +RB_FileFormat_ELF64, +RB_FileFormat_RDI, +RB_FileFormat_COUNT, +} RB_FileFormat; + +C_LINKAGE_BEGIN +extern String8 rb_file_format_display_name_table[10]; + +C_LINKAGE_END + +#endif // RADBIN_META_H diff --git a/src/render/d3d11/generated/render_d3d11.meta.c b/src/render/d3d11/generated/render_d3d11.meta.c index e6393a68..2b5ce20c 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.c +++ b/src/render/d3d11/generated/render_d3d11.meta.c @@ -1,69 +1,69 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8* r_d3d11_g_vshad_kind_source_table[5] = -{ -&r_d3d11_g_rect_shader_src, -&r_d3d11_g_blur_shader_src, -&r_d3d11_g_mesh_shader_src, -&r_d3d11_g_geo3dcomposite_shader_src, -&r_d3d11_g_finalize_shader_src, -}; - -String8 r_d3d11_g_vshad_kind_source_name_table[5] = -{ -str8_lit_comp("r_d3d11_g_rect_shader_src"), -str8_lit_comp("r_d3d11_g_blur_shader_src"), -str8_lit_comp("r_d3d11_g_mesh_shader_src"), -str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), -str8_lit_comp("r_d3d11_g_finalize_shader_src"), -}; - -D3D11_INPUT_ELEMENT_DESC * r_d3d11_g_vshad_kind_elements_ptr_table[5] = -{ -r_d3d11_g_rect_ilay_elements, -0, -r_d3d11_g_mesh_ilay_elements, -0, -0, -}; - -U64 r_d3d11_g_vshad_kind_elements_count_table[5] = -{ -ArrayCount(r_d3d11_g_rect_ilay_elements) , - 0, -ArrayCount(r_d3d11_g_mesh_ilay_elements) , - 0, - 0, -}; - -String8* r_d3d11_g_pshad_kind_source_table[5] = -{ -&r_d3d11_g_rect_shader_src, -&r_d3d11_g_blur_shader_src, -&r_d3d11_g_mesh_shader_src, -&r_d3d11_g_geo3dcomposite_shader_src, -&r_d3d11_g_finalize_shader_src, -}; - -String8 r_d3d11_g_pshad_kind_source_name_table[5] = -{ -str8_lit_comp("r_d3d11_g_rect_shader_src"), -str8_lit_comp("r_d3d11_g_blur_shader_src"), -str8_lit_comp("r_d3d11_g_mesh_shader_src"), -str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), -str8_lit_comp("r_d3d11_g_finalize_shader_src"), -}; - -U64 r_d3d11_g_uniform_type_kind_size_table[3] = -{ -sizeof(R_D3D11_Uniforms_Rect), -sizeof(R_D3D11_Uniforms_Blur), -sizeof(R_D3D11_Uniforms_Mesh), -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8* r_d3d11_g_vshad_kind_source_table[5] = +{ +&r_d3d11_g_rect_shader_src, +&r_d3d11_g_blur_shader_src, +&r_d3d11_g_mesh_shader_src, +&r_d3d11_g_geo3dcomposite_shader_src, +&r_d3d11_g_finalize_shader_src, +}; + +String8 r_d3d11_g_vshad_kind_source_name_table[5] = +{ +str8_lit_comp("r_d3d11_g_rect_shader_src"), +str8_lit_comp("r_d3d11_g_blur_shader_src"), +str8_lit_comp("r_d3d11_g_mesh_shader_src"), +str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), +str8_lit_comp("r_d3d11_g_finalize_shader_src"), +}; + +D3D11_INPUT_ELEMENT_DESC * r_d3d11_g_vshad_kind_elements_ptr_table[5] = +{ +r_d3d11_g_rect_ilay_elements, +0, +r_d3d11_g_mesh_ilay_elements, +0, +0, +}; + +U64 r_d3d11_g_vshad_kind_elements_count_table[5] = +{ +ArrayCount(r_d3d11_g_rect_ilay_elements) , + 0, +ArrayCount(r_d3d11_g_mesh_ilay_elements) , + 0, + 0, +}; + +String8* r_d3d11_g_pshad_kind_source_table[5] = +{ +&r_d3d11_g_rect_shader_src, +&r_d3d11_g_blur_shader_src, +&r_d3d11_g_mesh_shader_src, +&r_d3d11_g_geo3dcomposite_shader_src, +&r_d3d11_g_finalize_shader_src, +}; + +String8 r_d3d11_g_pshad_kind_source_name_table[5] = +{ +str8_lit_comp("r_d3d11_g_rect_shader_src"), +str8_lit_comp("r_d3d11_g_blur_shader_src"), +str8_lit_comp("r_d3d11_g_mesh_shader_src"), +str8_lit_comp("r_d3d11_g_geo3dcomposite_shader_src"), +str8_lit_comp("r_d3d11_g_finalize_shader_src"), +}; + +U64 r_d3d11_g_uniform_type_kind_size_table[3] = +{ +sizeof(R_D3D11_Uniforms_Rect), +sizeof(R_D3D11_Uniforms_Blur), +sizeof(R_D3D11_Uniforms_Mesh), +}; + +C_LINKAGE_END + diff --git a/src/render/d3d11/generated/render_d3d11.meta.h b/src/render/d3d11/generated/render_d3d11.meta.h index 9855582f..ff65e632 100644 --- a/src/render/d3d11/generated/render_d3d11.meta.h +++ b/src/render/d3d11/generated/render_d3d11.meta.h @@ -1,483 +1,483 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef RENDER_D3D11_META_H -#define RENDER_D3D11_META_H - -typedef enum R_D3D11_VShadKind -{ -R_D3D11_VShadKind_Rect, -R_D3D11_VShadKind_Blur, -R_D3D11_VShadKind_Mesh, -R_D3D11_VShadKind_Geo3DComposite, -R_D3D11_VShadKind_Finalize, -R_D3D11_VShadKind_COUNT, -} R_D3D11_VShadKind; - -typedef enum R_D3D11_PShadKind -{ -R_D3D11_PShadKind_Rect, -R_D3D11_PShadKind_Blur, -R_D3D11_PShadKind_Mesh, -R_D3D11_PShadKind_Geo3DComposite, -R_D3D11_PShadKind_Finalize, -R_D3D11_PShadKind_COUNT, -} R_D3D11_PShadKind; - -typedef enum R_D3D11_UniformTypeKind -{ -R_D3D11_UniformTypeKind_Rect, -R_D3D11_UniformTypeKind_Blur, -R_D3D11_UniformTypeKind_Mesh, -R_D3D11_UniformTypeKind_COUNT, -} R_D3D11_UniformTypeKind; - -C_LINKAGE_BEGIN -read_only global String8 r_d3d11_g_rect_shader_src = -str8_lit_comp( -"" -"\n" -"cbuffer Globals : register(b0)\n" -"{\n" -" float2 viewport_size_px;\n" -" float opacity;\n" -" row_major float4x4 texture_sample_channel_map;\n" -" float2 texture_t2d_size_px;\n" -" row_major float3x3 xform;\n" -" float2 xform_scale;\n" -"}\n" -"\n" -"struct CPU2Vertex\n" -"{\n" -" float4 dst_rect_px : POS;\n" -" float4 src_rect_px : TEX;\n" -" float4 color00 : COL0;\n" -" float4 color01 : COL1;\n" -" float4 color10 : COL2;\n" -" float4 color11 : COL3;\n" -" float4 corner_radii_px : CRAD;\n" -" float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\n" -" uint vertex_id : SV_VertexID;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" nointerpolation float2 rect_half_size_px : PSIZE;\n" -" float2 texcoord_pct : TEX;\n" -" float2 sdf_sample_pos : SDF;\n" -" float4 tint : TINT;\n" -" float corner_radius_px : CRAD;\n" -" nointerpolation float border_thickness_px : BTHC;\n" -" nointerpolation float softness_px : SFT;\n" -" nointerpolation float omit_texture : OTX;\n" -"};\n" -"\n" -"Texture2D main_t2d : register(t0);\n" -"SamplerState main_sampler : register(s0);\n" -"\n" -"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\n" -"{\n" -" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" -"}\n" -"\n" -"float linear_from_srgb_f32(float x)\n" -"{\n" -" return x < 0.0404482362771082 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n" -"}\n" -"\n" -"float4 linear_from_srgba(float4 v)\n" -"{\n" -" float4 result = float4(linear_from_srgb_f32(v.x),\n" -" linear_from_srgb_f32(v.y),\n" -" linear_from_srgb_f32(v.z),\n" -" v.w);\n" -" return result;\n" -"}\n" -"\n" -"//- rjf: vertex shader\n" -"\n" -"Vertex2Pixel\n" -"vs_main(CPU2Vertex cpu2vertex)\n" -"{\n" -" //- rjf: unpack & xform rectangle src/dst vertices\n" -" float2 dst_p0_px = cpu2vertex.dst_rect_px.xy;\n" -" float2 dst_p1_px = cpu2vertex.dst_rect_px.zw;\n" -" float2 src_p0_px = cpu2vertex.src_rect_px.xy;\n" -" float2 src_p1_px = cpu2vertex.src_rect_px.zw;\n" -" float2 dst_size_px = abs(dst_p1_px - dst_p0_px);\n" -" \n" -" //- rjf: unpack style params\n" -" float border_thickness_px = cpu2vertex.style_params.x;\n" -" float softness_px = cpu2vertex.style_params.y;\n" -" float omit_texture = cpu2vertex.style_params.z;\n" -" float shear_px = cpu2vertex.style_params.w;\n" -" \n" -" //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\n" -" float2 dst_p_verts_px[] =\n" -" {\n" -" float2(dst_p0_px.x, dst_p1_px.y),\n" -" float2(dst_p0_px.x, dst_p0_px.y),\n" -" float2(dst_p1_px.x, dst_p1_px.y + shear_px),\n" -" float2(dst_p1_px.x, dst_p0_px.y + shear_px),\n" -" };\n" -" float2 src_p_verts_px[] =\n" -" {\n" -" float2(src_p0_px.x, src_p1_px.y),\n" -" float2(src_p0_px.x, src_p0_px.y),\n" -" float2(src_p1_px.x, src_p1_px.y),\n" -" float2(src_p1_px.x, src_p0_px.y),\n" -" };\n" -" float dst_r_verts_px[] =\n" -" {\n" -" cpu2vertex.corner_radii_px.y,\n" -" cpu2vertex.corner_radii_px.x,\n" -" cpu2vertex.corner_radii_px.w,\n" -" cpu2vertex.corner_radii_px.z,\n" -" };\n" -" float4 src_color[] =\n" -" {\n" -" cpu2vertex.color01,\n" -" cpu2vertex.color00,\n" -" cpu2vertex.color11,\n" -" cpu2vertex.color10,\n" -" };\n" -" float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f,\n" -" (cpu2vertex.vertex_id & 1) ? 0.f : 1.f);\n" -" \n" -" // rjf: fill vertex -> pixel data\n" -" Vertex2Pixel vertex2pixel;\n" -" {\n" -" float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy;\n" -" xformed_pos.y = viewport_size_px.y - xformed_pos.y;\n" -" vertex2pixel.position.xy = 2.f * xformed_pos/viewport_size_px - 1.f;\n" -" vertex2pixel.position.z = 0.f;\n" -" vertex2pixel.position.w = 1.f;\n" -" vertex2pixel.rect_half_size_px = dst_size_px / 2.f * xform_scale;\n" -" vertex2pixel.texcoord_pct = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px;\n" -" vertex2pixel.sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px;\n" -" vertex2pixel.tint = src_color[cpu2vertex.vertex_id];\n" -" vertex2pixel.corner_radius_px = dst_r_verts_px[cpu2vertex.vertex_id];\n" -" vertex2pixel.border_thickness_px = border_thickness_px;\n" -" vertex2pixel.softness_px = softness_px;\n" -" vertex2pixel.omit_texture = omit_texture;\n" -" }\n" -" return vertex2pixel;\n" -"}\n" -"\n" -"//- rjf: pixel shader\n" -"\n" -"float4\n" -"ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET\n" -"{\n" -" // rjf: blend corner colors to produce final tint\n" -" float4 tint = vertex2pixel.tint;\n" -" \n" -" // rjf: sample texture\n" -" float4 albedo_sample = float4(1, 1, 1, 1);\n" -" if(vertex2pixel.omit_texture < 1)\n" -" {\n" -" albedo_sample = mul(main_t2d.Sample(main_sampler, vertex2pixel.texcoord_pct), texture_sample_channel_map);\n" -" albedo_sample = linear_from_srgba(albedo_sample);\n" -" }\n" -" \n" -" // rjf: determine SDF sample position\n" -" float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos;\n" -" \n" -" // rjf: sample for borders\n" -" float border_sdf_t = 1;\n" -" if(vertex2pixel.border_thickness_px > 0)\n" -" {\n" -" float border_sdf_s = rect_sdf(sdf_sample_pos,\n" -" vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f) - vertex2pixel.border_thickness_px,\n" -" max(vertex2pixel.corner_radius_px-vertex2pixel.border_thickness_px, 0));\n" -" border_sdf_t = smoothstep(0, 2*vertex2pixel.softness_px, border_sdf_s);\n" -" }\n" -" if(border_sdf_t < 0.001f)\n" -" {\n" -" discard;\n" -" }\n" -" \n" -" // rjf: sample for corners\n" -" float corner_sdf_t = 1;\n" -" if(vertex2pixel.corner_radius_px > 0 || vertex2pixel.softness_px > 0.75f)\n" -" {\n" -" float corner_sdf_s = rect_sdf(sdf_sample_pos,\n" -" vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f),\n" -" vertex2pixel.corner_radius_px);\n" -" corner_sdf_t = 1-smoothstep(0, 2*vertex2pixel.softness_px, corner_sdf_s);\n" -" }\n" -" \n" -" // rjf: form+return final color\n" -" float4 final_color = albedo_sample;\n" -" final_color *= tint;\n" -" final_color.a *= opacity;\n" -" final_color.a *= corner_sdf_t;\n" -" final_color.a *= border_sdf_t;\n" -" return final_color;\n" -"}\n" -"" -); - -read_only global String8 r_d3d11_g_blur_shader_src = -str8_lit_comp( -"" -"\n" -"cbuffer Globals : register(b0)\n" -"{\n" -" float4 rect;\n" -" float4 corner_radii_px;\n" -" float2 direction;\n" -" float2 viewport_size;\n" -" uint blur_count;\n" -"}\n" -"\n" -"cbuffer Kernel : register(b1)\n" -"{\n" -" float4 kernel[32];\n" -"}\n" -"\n" -"struct CPU2Vertex\n" -"{\n" -" uint vertex_id : SV_VertexID;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" float2 texcoord : TEX;\n" -" float2 sdf_sample_pos : SDF;\n" -" nointerpolation float2 rect_half_size : RHS;\n" -" float corner_radius : RAD;\n" -"};\n" -"\n" -"Texture2D stage_t2d : register(t0);\n" -"SamplerState stage_sampler : register(s0);\n" -"\n" -"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\n" -"{\n" -" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" -"}\n" -"\n" -"//- rjf: vertex shader\n" -"\n" -"Vertex2Pixel\n" -"vs_main(CPU2Vertex c2v)\n" -"{\n" -" float2 vertex_positions__scrn[] =\n" -" {\n" -" rect.xw,\n" -" rect.xy,\n" -" rect.zw,\n" -" rect.zy,\n" -" };\n" -" float corner_radii__px[] =\n" -" {\n" -" corner_radii_px.y,\n" -" corner_radii_px.x,\n" -" corner_radii_px.w,\n" -" corner_radii_px.z,\n" -" };\n" -" float2 cornercoords__pct = float2((c2v.vertex_id >> 1) ? 1.f : 0.f,\n" -" (c2v.vertex_id & 1) ? 0.f : 1.f);\n" -" \n" -" float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size;\n" -" float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f;\n" -" \n" -" float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" -" \n" -" Vertex2Pixel v2p;\n" -" {\n" -" v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);\n" -" v2p.texcoord = vertex_position__pct;\n" -" v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;\n" -" v2p.rect_half_size = rect_half_size - 2.f;\n" -" v2p.corner_radius = corner_radii__px[c2v.vertex_id];\n" -" }\n" -" return v2p;\n" -"}\n" -"\n" -"//- rjf: pixel shader\n" -"\n" -"float4\n" -"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" -"{\n" -" // rjf: blend weighted texture samples into color\n" -" float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\n" -" for(uint i = 1; i < blur_count; i += 1)\n" -" {\n" -" float weight = kernel[i].x;\n" -" float offset = kernel[i].y;\n" -" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;\n" -" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;\n" -" }\n" -" \n" -" // rjf: sample for corners\n" -" float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);\n" -" float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\n" -" \n" -" // rjf: weight output color by sdf\n" -" // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n" -" if(corner_sdf_t < 0.9f)\n" -" {\n" -" discard;\n" -" }\n" -" \n" -" return float4(color, 1.f);\n" -"}\n" -"" -); - -read_only global String8 r_d3d11_g_mesh_shader_src = -str8_lit_comp( -"" -"\n" -"cbuffer Uniforms : register(b0)\n" -"{\n" -" row_major float4x4 xform;\n" -"}\n" -"\n" -"struct CPU2Vertex\n" -"{\n" -" float3 position : POS;\n" -" float3 normal : NOR;\n" -" float2 texcoord : TEX;\n" -" float3 color : COL;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" float2 texcoord : TEX;\n" -" float4 color : COL;\n" -"};\n" -"\n" -"Vertex2Pixel vs_main(CPU2Vertex c2v)\n" -"{\n" -" Vertex2Pixel v2p;\n" -" v2p.position = mul(float4(c2v.position, 1.f), xform);\n" -" v2p.texcoord = c2v.texcoord;\n" -" v2p.color = float4(c2v.color, 1.f);\n" -" return v2p;\n" -"}\n" -"\n" -"float4 ps_main(Vertex2Pixel v2p) : SV_TARGET\n" -"{\n" -" return v2p.color;\n" -"}\n" -"" -); - -read_only global String8 r_d3d11_g_geo3dcomposite_shader_src = -str8_lit_comp( -"" -"\n" -"struct CPU2Vertex\n" -"{\n" -" uint vertex_id : SV_VertexID;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" float2 texcoord : TEX;\n" -"};\n" -"\n" -"Texture2D stage_t2d : register(t0);\n" -"SamplerState stage_sampler : register(s0);\n" -"\n" -"//- rjf: vertex shader\n" -"\n" -"Vertex2Pixel\n" -"vs_main(CPU2Vertex c2v)\n" -"{\n" -" float4 vertex_positions__modl[] =\n" -" {\n" -" float4(0, 0, 0, 1),\n" -" float4(0, 1, 0, 1),\n" -" float4(1, 0, 0, 1),\n" -" float4(1, 1, 0, 1),\n" -" };\n" -" float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\n" -" float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\n" -" float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y);\n" -" texcoord.y = 1-texcoord.y;\n" -" Vertex2Pixel v2p;\n" -" {\n" -" v2p.position = vertex_position__clip;\n" -" v2p.texcoord = texcoord;\n" -" }\n" -" return v2p;\n" -"}\n" -"\n" -"//- rjf: pixel shader\n" -"\n" -"float4\n" -"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" -"{\n" -" float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\n" -" return final_color;\n" -"}\n" -"" -); - -read_only global String8 r_d3d11_g_finalize_shader_src = -str8_lit_comp( -"" -"\n" -"struct CPU2Vertex\n" -"{\n" -" uint vertex_id : SV_VertexID;\n" -"};\n" -"\n" -"struct Vertex2Pixel\n" -"{\n" -" float4 position : SV_POSITION;\n" -" float2 texcoord : TEX;\n" -"};\n" -"\n" -"Texture2D stage_t2d : register(t0);\n" -"SamplerState stage_sampler : register(s0);\n" -"\n" -"//- rjf: vertex shader\n" -"\n" -"Vertex2Pixel\n" -"vs_main(CPU2Vertex c2v)\n" -"{\n" -" float4 vertex_positions__modl[] =\n" -" {\n" -" float4(0, 0, 0, 1),\n" -" float4(0, 1, 0, 1),\n" -" float4(1, 0, 0, 1),\n" -" float4(1, 1, 0, 1),\n" -" };\n" -" float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\n" -" float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\n" -" float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y);\n" -" texcoord.y = 1-texcoord.y;\n" -" Vertex2Pixel v2p;\n" -" {\n" -" v2p.position = vertex_position__clip;\n" -" v2p.texcoord = texcoord;\n" -" }\n" -" return v2p;\n" -"}\n" -"\n" -"//- rjf: pixel shader\n" -"\n" -"float4\n" -"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" -"{\n" -" float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\n" -" final_color.a = 1;\n" -" return final_color;\n" -"}\n" -"" -); - - -C_LINKAGE_END - -#endif // RENDER_D3D11_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef RENDER_D3D11_META_H +#define RENDER_D3D11_META_H + +typedef enum R_D3D11_VShadKind +{ +R_D3D11_VShadKind_Rect, +R_D3D11_VShadKind_Blur, +R_D3D11_VShadKind_Mesh, +R_D3D11_VShadKind_Geo3DComposite, +R_D3D11_VShadKind_Finalize, +R_D3D11_VShadKind_COUNT, +} R_D3D11_VShadKind; + +typedef enum R_D3D11_PShadKind +{ +R_D3D11_PShadKind_Rect, +R_D3D11_PShadKind_Blur, +R_D3D11_PShadKind_Mesh, +R_D3D11_PShadKind_Geo3DComposite, +R_D3D11_PShadKind_Finalize, +R_D3D11_PShadKind_COUNT, +} R_D3D11_PShadKind; + +typedef enum R_D3D11_UniformTypeKind +{ +R_D3D11_UniformTypeKind_Rect, +R_D3D11_UniformTypeKind_Blur, +R_D3D11_UniformTypeKind_Mesh, +R_D3D11_UniformTypeKind_COUNT, +} R_D3D11_UniformTypeKind; + +C_LINKAGE_BEGIN +read_only global String8 r_d3d11_g_rect_shader_src = +str8_lit_comp( +"" +"\n" +"cbuffer Globals : register(b0)\n" +"{\n" +" float2 viewport_size_px;\n" +" float opacity;\n" +" row_major float4x4 texture_sample_channel_map;\n" +" float2 texture_t2d_size_px;\n" +" row_major float3x3 xform;\n" +" float2 xform_scale;\n" +"}\n" +"\n" +"struct CPU2Vertex\n" +"{\n" +" float4 dst_rect_px : POS;\n" +" float4 src_rect_px : TEX;\n" +" float4 color00 : COL0;\n" +" float4 color01 : COL1;\n" +" float4 color10 : COL2;\n" +" float4 color11 : COL3;\n" +" float4 corner_radii_px : CRAD;\n" +" float4 style_params : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\n" +" uint vertex_id : SV_VertexID;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" nointerpolation float2 rect_half_size_px : PSIZE;\n" +" float2 texcoord_pct : TEX;\n" +" float2 sdf_sample_pos : SDF;\n" +" float4 tint : TINT;\n" +" float corner_radius_px : CRAD;\n" +" nointerpolation float border_thickness_px : BTHC;\n" +" nointerpolation float softness_px : SFT;\n" +" nointerpolation float omit_texture : OTX;\n" +"};\n" +"\n" +"Texture2D main_t2d : register(t0);\n" +"SamplerState main_sampler : register(s0);\n" +"\n" +"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\n" +"{\n" +" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" +"}\n" +"\n" +"float linear_from_srgb_f32(float x)\n" +"{\n" +" return x < 0.0404482362771082 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n" +"}\n" +"\n" +"float4 linear_from_srgba(float4 v)\n" +"{\n" +" float4 result = float4(linear_from_srgb_f32(v.x),\n" +" linear_from_srgb_f32(v.y),\n" +" linear_from_srgb_f32(v.z),\n" +" v.w);\n" +" return result;\n" +"}\n" +"\n" +"//- rjf: vertex shader\n" +"\n" +"Vertex2Pixel\n" +"vs_main(CPU2Vertex cpu2vertex)\n" +"{\n" +" //- rjf: unpack & xform rectangle src/dst vertices\n" +" float2 dst_p0_px = cpu2vertex.dst_rect_px.xy;\n" +" float2 dst_p1_px = cpu2vertex.dst_rect_px.zw;\n" +" float2 src_p0_px = cpu2vertex.src_rect_px.xy;\n" +" float2 src_p1_px = cpu2vertex.src_rect_px.zw;\n" +" float2 dst_size_px = abs(dst_p1_px - dst_p0_px);\n" +" \n" +" //- rjf: unpack style params\n" +" float border_thickness_px = cpu2vertex.style_params.x;\n" +" float softness_px = cpu2vertex.style_params.y;\n" +" float omit_texture = cpu2vertex.style_params.z;\n" +" float shear_px = cpu2vertex.style_params.w;\n" +" \n" +" //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\n" +" float2 dst_p_verts_px[] =\n" +" {\n" +" float2(dst_p0_px.x, dst_p1_px.y),\n" +" float2(dst_p0_px.x, dst_p0_px.y),\n" +" float2(dst_p1_px.x, dst_p1_px.y + shear_px),\n" +" float2(dst_p1_px.x, dst_p0_px.y + shear_px),\n" +" };\n" +" float2 src_p_verts_px[] =\n" +" {\n" +" float2(src_p0_px.x, src_p1_px.y),\n" +" float2(src_p0_px.x, src_p0_px.y),\n" +" float2(src_p1_px.x, src_p1_px.y),\n" +" float2(src_p1_px.x, src_p0_px.y),\n" +" };\n" +" float dst_r_verts_px[] =\n" +" {\n" +" cpu2vertex.corner_radii_px.y,\n" +" cpu2vertex.corner_radii_px.x,\n" +" cpu2vertex.corner_radii_px.w,\n" +" cpu2vertex.corner_radii_px.z,\n" +" };\n" +" float4 src_color[] =\n" +" {\n" +" cpu2vertex.color01,\n" +" cpu2vertex.color00,\n" +" cpu2vertex.color11,\n" +" cpu2vertex.color10,\n" +" };\n" +" float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f,\n" +" (cpu2vertex.vertex_id & 1) ? 0.f : 1.f);\n" +" \n" +" // rjf: fill vertex -> pixel data\n" +" Vertex2Pixel vertex2pixel;\n" +" {\n" +" float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy;\n" +" xformed_pos.y = viewport_size_px.y - xformed_pos.y;\n" +" vertex2pixel.position.xy = 2.f * xformed_pos/viewport_size_px - 1.f;\n" +" vertex2pixel.position.z = 0.f;\n" +" vertex2pixel.position.w = 1.f;\n" +" vertex2pixel.rect_half_size_px = dst_size_px / 2.f * xform_scale;\n" +" vertex2pixel.texcoord_pct = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px;\n" +" vertex2pixel.sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px;\n" +" vertex2pixel.tint = src_color[cpu2vertex.vertex_id];\n" +" vertex2pixel.corner_radius_px = dst_r_verts_px[cpu2vertex.vertex_id];\n" +" vertex2pixel.border_thickness_px = border_thickness_px;\n" +" vertex2pixel.softness_px = softness_px;\n" +" vertex2pixel.omit_texture = omit_texture;\n" +" }\n" +" return vertex2pixel;\n" +"}\n" +"\n" +"//- rjf: pixel shader\n" +"\n" +"float4\n" +"ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET\n" +"{\n" +" // rjf: blend corner colors to produce final tint\n" +" float4 tint = vertex2pixel.tint;\n" +" \n" +" // rjf: sample texture\n" +" float4 albedo_sample = float4(1, 1, 1, 1);\n" +" if(vertex2pixel.omit_texture < 1)\n" +" {\n" +" albedo_sample = mul(main_t2d.Sample(main_sampler, vertex2pixel.texcoord_pct), texture_sample_channel_map);\n" +" albedo_sample = linear_from_srgba(albedo_sample);\n" +" }\n" +" \n" +" // rjf: determine SDF sample position\n" +" float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos;\n" +" \n" +" // rjf: sample for borders\n" +" float border_sdf_t = 1;\n" +" if(vertex2pixel.border_thickness_px > 0)\n" +" {\n" +" float border_sdf_s = rect_sdf(sdf_sample_pos,\n" +" vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f) - vertex2pixel.border_thickness_px,\n" +" max(vertex2pixel.corner_radius_px-vertex2pixel.border_thickness_px, 0));\n" +" border_sdf_t = smoothstep(0, 2*vertex2pixel.softness_px, border_sdf_s);\n" +" }\n" +" if(border_sdf_t < 0.001f)\n" +" {\n" +" discard;\n" +" }\n" +" \n" +" // rjf: sample for corners\n" +" float corner_sdf_t = 1;\n" +" if(vertex2pixel.corner_radius_px > 0 || vertex2pixel.softness_px > 0.75f)\n" +" {\n" +" float corner_sdf_s = rect_sdf(sdf_sample_pos,\n" +" vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f),\n" +" vertex2pixel.corner_radius_px);\n" +" corner_sdf_t = 1-smoothstep(0, 2*vertex2pixel.softness_px, corner_sdf_s);\n" +" }\n" +" \n" +" // rjf: form+return final color\n" +" float4 final_color = albedo_sample;\n" +" final_color *= tint;\n" +" final_color.a *= opacity;\n" +" final_color.a *= corner_sdf_t;\n" +" final_color.a *= border_sdf_t;\n" +" return final_color;\n" +"}\n" +"" +); + +read_only global String8 r_d3d11_g_blur_shader_src = +str8_lit_comp( +"" +"\n" +"cbuffer Globals : register(b0)\n" +"{\n" +" float4 rect;\n" +" float4 corner_radii_px;\n" +" float2 direction;\n" +" float2 viewport_size;\n" +" uint blur_count;\n" +"}\n" +"\n" +"cbuffer Kernel : register(b1)\n" +"{\n" +" float4 kernel[32];\n" +"}\n" +"\n" +"struct CPU2Vertex\n" +"{\n" +" uint vertex_id : SV_VertexID;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" float2 texcoord : TEX;\n" +" float2 sdf_sample_pos : SDF;\n" +" nointerpolation float2 rect_half_size : RHS;\n" +" float corner_radius : RAD;\n" +"};\n" +"\n" +"Texture2D stage_t2d : register(t0);\n" +"SamplerState stage_sampler : register(s0);\n" +"\n" +"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\n" +"{\n" +" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" +"}\n" +"\n" +"//- rjf: vertex shader\n" +"\n" +"Vertex2Pixel\n" +"vs_main(CPU2Vertex c2v)\n" +"{\n" +" float2 vertex_positions__scrn[] =\n" +" {\n" +" rect.xw,\n" +" rect.xy,\n" +" rect.zw,\n" +" rect.zy,\n" +" };\n" +" float corner_radii__px[] =\n" +" {\n" +" corner_radii_px.y,\n" +" corner_radii_px.x,\n" +" corner_radii_px.w,\n" +" corner_radii_px.z,\n" +" };\n" +" float2 cornercoords__pct = float2((c2v.vertex_id >> 1) ? 1.f : 0.f,\n" +" (c2v.vertex_id & 1) ? 0.f : 1.f);\n" +" \n" +" float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size;\n" +" float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f;\n" +" \n" +" float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" +" \n" +" Vertex2Pixel v2p;\n" +" {\n" +" v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);\n" +" v2p.texcoord = vertex_position__pct;\n" +" v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;\n" +" v2p.rect_half_size = rect_half_size - 2.f;\n" +" v2p.corner_radius = corner_radii__px[c2v.vertex_id];\n" +" }\n" +" return v2p;\n" +"}\n" +"\n" +"//- rjf: pixel shader\n" +"\n" +"float4\n" +"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" +"{\n" +" // rjf: blend weighted texture samples into color\n" +" float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\n" +" for(uint i = 1; i < blur_count; i += 1)\n" +" {\n" +" float weight = kernel[i].x;\n" +" float offset = kernel[i].y;\n" +" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;\n" +" color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;\n" +" }\n" +" \n" +" // rjf: sample for corners\n" +" float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);\n" +" float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\n" +" \n" +" // rjf: weight output color by sdf\n" +" // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n" +" if(corner_sdf_t < 0.9f)\n" +" {\n" +" discard;\n" +" }\n" +" \n" +" return float4(color, 1.f);\n" +"}\n" +"" +); + +read_only global String8 r_d3d11_g_mesh_shader_src = +str8_lit_comp( +"" +"\n" +"cbuffer Uniforms : register(b0)\n" +"{\n" +" row_major float4x4 xform;\n" +"}\n" +"\n" +"struct CPU2Vertex\n" +"{\n" +" float3 position : POS;\n" +" float3 normal : NOR;\n" +" float2 texcoord : TEX;\n" +" float3 color : COL;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" float2 texcoord : TEX;\n" +" float4 color : COL;\n" +"};\n" +"\n" +"Vertex2Pixel vs_main(CPU2Vertex c2v)\n" +"{\n" +" Vertex2Pixel v2p;\n" +" v2p.position = mul(float4(c2v.position, 1.f), xform);\n" +" v2p.texcoord = c2v.texcoord;\n" +" v2p.color = float4(c2v.color, 1.f);\n" +" return v2p;\n" +"}\n" +"\n" +"float4 ps_main(Vertex2Pixel v2p) : SV_TARGET\n" +"{\n" +" return v2p.color;\n" +"}\n" +"" +); + +read_only global String8 r_d3d11_g_geo3dcomposite_shader_src = +str8_lit_comp( +"" +"\n" +"struct CPU2Vertex\n" +"{\n" +" uint vertex_id : SV_VertexID;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" float2 texcoord : TEX;\n" +"};\n" +"\n" +"Texture2D stage_t2d : register(t0);\n" +"SamplerState stage_sampler : register(s0);\n" +"\n" +"//- rjf: vertex shader\n" +"\n" +"Vertex2Pixel\n" +"vs_main(CPU2Vertex c2v)\n" +"{\n" +" float4 vertex_positions__modl[] =\n" +" {\n" +" float4(0, 0, 0, 1),\n" +" float4(0, 1, 0, 1),\n" +" float4(1, 0, 0, 1),\n" +" float4(1, 1, 0, 1),\n" +" };\n" +" float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\n" +" float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\n" +" float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y);\n" +" texcoord.y = 1-texcoord.y;\n" +" Vertex2Pixel v2p;\n" +" {\n" +" v2p.position = vertex_position__clip;\n" +" v2p.texcoord = texcoord;\n" +" }\n" +" return v2p;\n" +"}\n" +"\n" +"//- rjf: pixel shader\n" +"\n" +"float4\n" +"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" +"{\n" +" float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\n" +" return final_color;\n" +"}\n" +"" +); + +read_only global String8 r_d3d11_g_finalize_shader_src = +str8_lit_comp( +"" +"\n" +"struct CPU2Vertex\n" +"{\n" +" uint vertex_id : SV_VertexID;\n" +"};\n" +"\n" +"struct Vertex2Pixel\n" +"{\n" +" float4 position : SV_POSITION;\n" +" float2 texcoord : TEX;\n" +"};\n" +"\n" +"Texture2D stage_t2d : register(t0);\n" +"SamplerState stage_sampler : register(s0);\n" +"\n" +"//- rjf: vertex shader\n" +"\n" +"Vertex2Pixel\n" +"vs_main(CPU2Vertex c2v)\n" +"{\n" +" float4 vertex_positions__modl[] =\n" +" {\n" +" float4(0, 0, 0, 1),\n" +" float4(0, 1, 0, 1),\n" +" float4(1, 0, 0, 1),\n" +" float4(1, 1, 0, 1),\n" +" };\n" +" float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\n" +" float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\n" +" float2 texcoord = float2(vertex_position__modl.x, vertex_position__modl.y);\n" +" texcoord.y = 1-texcoord.y;\n" +" Vertex2Pixel v2p;\n" +" {\n" +" v2p.position = vertex_position__clip;\n" +" v2p.texcoord = texcoord;\n" +" }\n" +" return v2p;\n" +"}\n" +"\n" +"//- rjf: pixel shader\n" +"\n" +"float4\n" +"ps_main(Vertex2Pixel v2p) : SV_TARGET\n" +"{\n" +" float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\n" +" final_color.a = 1;\n" +" return final_color;\n" +"}\n" +"" +); + + +C_LINKAGE_END + +#endif // RENDER_D3D11_META_H diff --git a/src/render/generated/render.meta.c b/src/render/generated/render.meta.c index c1897062..d2225d54 100644 --- a/src/render/generated/render.meta.c +++ b/src/render/generated/render.meta.c @@ -1,68 +1,68 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 r_tex2d_format_display_string_table[9] = -{ -str8_lit_comp("R8"), -str8_lit_comp("RG8"), -str8_lit_comp("RGBA8"), -str8_lit_comp("BGRA8"), -str8_lit_comp("R16"), -str8_lit_comp("RGBA16"), -str8_lit_comp("R32"), -str8_lit_comp("RG32"), -str8_lit_comp("RGBA32"), -}; - -U8 r_tex2d_format_bytes_per_pixel_table[9] = -{ -1, -2, -4, -4, -2, -8, -4, -8, -16, -}; - -String8 r_resource_kind_display_string_table[3] = -{ -str8_lit_comp("Static"), -str8_lit_comp("Dynamic"), -str8_lit_comp("Stream "), -}; - -String8 r_tex2d_sample_kind_display_string_table[2] = -{ -str8_lit_comp("Nearest"), -str8_lit_comp("Linear"), -}; - -String8 r_pass_kind_display_string_table[3] = -{ -str8_lit_comp("UI"), -str8_lit_comp("Blur"), -str8_lit_comp("Geo3D"), -}; - -U8 r_pass_kind_batch_table[3] = -{ -1, -0, -1, -}; - -U64 r_pass_kind_params_size_table[3] = -{ -sizeof(R_PassParams_UI), -sizeof(R_PassParams_Blur), -sizeof(R_PassParams_Geo3D), -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 r_tex2d_format_display_string_table[9] = +{ +str8_lit_comp("R8"), +str8_lit_comp("RG8"), +str8_lit_comp("RGBA8"), +str8_lit_comp("BGRA8"), +str8_lit_comp("R16"), +str8_lit_comp("RGBA16"), +str8_lit_comp("R32"), +str8_lit_comp("RG32"), +str8_lit_comp("RGBA32"), +}; + +U8 r_tex2d_format_bytes_per_pixel_table[9] = +{ +1, +2, +4, +4, +2, +8, +4, +8, +16, +}; + +String8 r_resource_kind_display_string_table[3] = +{ +str8_lit_comp("Static"), +str8_lit_comp("Dynamic"), +str8_lit_comp("Stream "), +}; + +String8 r_tex2d_sample_kind_display_string_table[2] = +{ +str8_lit_comp("Nearest"), +str8_lit_comp("Linear"), +}; + +String8 r_pass_kind_display_string_table[3] = +{ +str8_lit_comp("UI"), +str8_lit_comp("Blur"), +str8_lit_comp("Geo3D"), +}; + +U8 r_pass_kind_batch_table[3] = +{ +1, +0, +1, +}; + +U64 r_pass_kind_params_size_table[3] = +{ +sizeof(R_PassParams_UI), +sizeof(R_PassParams_Blur), +sizeof(R_PassParams_Geo3D), +}; + +C_LINKAGE_END + diff --git a/src/render/generated/render.meta.h b/src/render/generated/render.meta.h index e7b65c2b..454181d2 100644 --- a/src/render/generated/render.meta.h +++ b/src/render/generated/render.meta.h @@ -1,65 +1,65 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef RENDER_META_H -#define RENDER_META_H - -typedef enum R_Tex2DFormat -{ -R_Tex2DFormat_R8, -R_Tex2DFormat_RG8, -R_Tex2DFormat_RGBA8, -R_Tex2DFormat_BGRA8, -R_Tex2DFormat_R16, -R_Tex2DFormat_RGBA16, -R_Tex2DFormat_R32, -R_Tex2DFormat_RG32, -R_Tex2DFormat_RGBA32, -R_Tex2DFormat_COUNT, -} R_Tex2DFormat; - -typedef enum R_ResourceKind -{ -R_ResourceKind_Static, -R_ResourceKind_Dynamic, -R_ResourceKind_Stream, -R_ResourceKind_COUNT, -} R_ResourceKind; - -typedef enum R_Tex2DSampleKind -{ -R_Tex2DSampleKind_Nearest, -R_Tex2DSampleKind_Linear, -R_Tex2DSampleKind_COUNT, -} R_Tex2DSampleKind; - -typedef enum R_GeoTopologyKind -{ -R_GeoTopologyKind_Lines, -R_GeoTopologyKind_LineStrip, -R_GeoTopologyKind_Triangles, -R_GeoTopologyKind_TriangleStrip, -R_GeoTopologyKind_COUNT, -} R_GeoTopologyKind; - -typedef enum R_PassKind -{ -R_PassKind_UI, -R_PassKind_Blur, -R_PassKind_Geo3D, -R_PassKind_COUNT, -} R_PassKind; - -C_LINKAGE_BEGIN -extern String8 r_tex2d_format_display_string_table[9]; -extern U8 r_tex2d_format_bytes_per_pixel_table[9]; -extern String8 r_resource_kind_display_string_table[3]; -extern String8 r_tex2d_sample_kind_display_string_table[2]; -extern String8 r_pass_kind_display_string_table[3]; -extern U8 r_pass_kind_batch_table[3]; - -C_LINKAGE_END - -#endif // RENDER_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef RENDER_META_H +#define RENDER_META_H + +typedef enum R_Tex2DFormat +{ +R_Tex2DFormat_R8, +R_Tex2DFormat_RG8, +R_Tex2DFormat_RGBA8, +R_Tex2DFormat_BGRA8, +R_Tex2DFormat_R16, +R_Tex2DFormat_RGBA16, +R_Tex2DFormat_R32, +R_Tex2DFormat_RG32, +R_Tex2DFormat_RGBA32, +R_Tex2DFormat_COUNT, +} R_Tex2DFormat; + +typedef enum R_ResourceKind +{ +R_ResourceKind_Static, +R_ResourceKind_Dynamic, +R_ResourceKind_Stream, +R_ResourceKind_COUNT, +} R_ResourceKind; + +typedef enum R_Tex2DSampleKind +{ +R_Tex2DSampleKind_Nearest, +R_Tex2DSampleKind_Linear, +R_Tex2DSampleKind_COUNT, +} R_Tex2DSampleKind; + +typedef enum R_GeoTopologyKind +{ +R_GeoTopologyKind_Lines, +R_GeoTopologyKind_LineStrip, +R_GeoTopologyKind_Triangles, +R_GeoTopologyKind_TriangleStrip, +R_GeoTopologyKind_COUNT, +} R_GeoTopologyKind; + +typedef enum R_PassKind +{ +R_PassKind_UI, +R_PassKind_Blur, +R_PassKind_Geo3D, +R_PassKind_COUNT, +} R_PassKind; + +C_LINKAGE_BEGIN +extern String8 r_tex2d_format_display_string_table[9]; +extern U8 r_tex2d_format_bytes_per_pixel_table[9]; +extern String8 r_resource_kind_display_string_table[3]; +extern String8 r_tex2d_sample_kind_display_string_table[2]; +extern String8 r_pass_kind_display_string_table[3]; +extern U8 r_pass_kind_batch_table[3]; + +C_LINKAGE_END + +#endif // RENDER_META_H diff --git a/src/render/opengl/generated/render_opengl.meta.c b/src/render/opengl/generated/render_opengl.meta.c index 228b658d..73c41e60 100644 --- a/src/render/opengl/generated/render_opengl.meta.c +++ b/src/render/opengl/generated/render_opengl.meta.c @@ -1,38 +1,38 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 r_ogl_shader_kind_name_table[2] = -{ -str8_lit_comp("rect"), -str8_lit_comp("blur"), -}; - -String8 * r_ogl_shader_kind_vshad_src_table[2] = -{ -&r_ogl_rect_vshad_src, -&r_ogl_blur_vshad_src, -}; - -String8 * r_ogl_shader_kind_pshad_src_table[2] = -{ -&r_ogl_rect_pshad_src, -&r_ogl_blur_pshad_src, -}; - -R_OGL_AttributeArray r_ogl_shader_kind_input_attributes_table[2] = -{ -{ r_ogl_rect_input_attributes, ArrayCount(r_ogl_rect_input_attributes) }, -{ 0, }, -}; - -R_OGL_AttributeArray r_ogl_shader_kind_output_attributes_table[2] = -{ -{ r_ogl_single_color_output_attributes, ArrayCount(r_ogl_single_color_output_attributes) }, -{ r_ogl_single_color_output_attributes, ArrayCount(r_ogl_single_color_output_attributes) }, -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 r_ogl_shader_kind_name_table[2] = +{ +str8_lit_comp("rect"), +str8_lit_comp("blur"), +}; + +String8 * r_ogl_shader_kind_vshad_src_table[2] = +{ +&r_ogl_rect_vshad_src, +&r_ogl_blur_vshad_src, +}; + +String8 * r_ogl_shader_kind_pshad_src_table[2] = +{ +&r_ogl_rect_pshad_src, +&r_ogl_blur_pshad_src, +}; + +R_OGL_AttributeArray r_ogl_shader_kind_input_attributes_table[2] = +{ +{ r_ogl_rect_input_attributes, ArrayCount(r_ogl_rect_input_attributes) }, +{ 0, }, +}; + +R_OGL_AttributeArray r_ogl_shader_kind_output_attributes_table[2] = +{ +{ r_ogl_single_color_output_attributes, ArrayCount(r_ogl_single_color_output_attributes) }, +{ r_ogl_single_color_output_attributes, ArrayCount(r_ogl_single_color_output_attributes) }, +}; + +C_LINKAGE_END + diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index b8c2117b..b59412d9 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -1,280 +1,281 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef RENDER_OPENGL_META_H -#define RENDER_OPENGL_META_H - -typedef enum R_OGL_ShaderKind -{ -R_OGL_ShaderKind_Rect, -R_OGL_ShaderKind_Blur, -R_OGL_ShaderKind_COUNT, -} R_OGL_ShaderKind; - -C_LINKAGE_BEGIN -extern String8 r_ogl_shader_kind_name_table[2]; -extern String8 * r_ogl_shader_kind_vshad_src_table[2]; -extern String8 * r_ogl_shader_kind_pshad_src_table[2]; -extern R_OGL_AttributeArray r_ogl_shader_kind_input_attributes_table[2]; -extern R_OGL_AttributeArray r_ogl_shader_kind_output_attributes_table[2]; -read_only global String8 r_ogl_rect_vshad_src = -str8_lit_comp( -"" -"\n" -"#version 330 core\n" -"\n" -"in vec4 c2v_dst_rect;\n" -"in vec4 c2v_src_rect;\n" -"in vec4 c2v_colors_0;\n" -"in vec4 c2v_colors_1;\n" -"in vec4 c2v_colors_2;\n" -"in vec4 c2v_colors_3;\n" -"in vec4 c2v_corner_radii;\n" -"in vec4 c2v_style; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\n" -"\n" -"out vec2 v2p_sdf_sample_pos;\n" -"out vec2 v2p_texcoord_pct;\n" -"out vec2 v2p_rect_half_size_px;\n" -"out vec4 v2p_tint;\n" -"out float v2p_corner_radius;\n" -"out float v2p_border_thickness;\n" -"out float v2p_softness;\n" -"out float v2p_omit_texture;\n" -"\n" -"uniform mat3 u_xform;\n" -"uniform sampler2D u_tex_color;\n" -"uniform vec2 u_viewport_size_px;\n" -"\n" -"void main(void)\n" -"{\n" -" // rjf: constants\n" -" vec2 vertices[] = vec2[](vec2(-1, -1), vec2(-1, +1), vec2(+1, -1), vec2(+1, +1));\n" -" \n" -" // rjf: unpack shears\n" -" float shears[] = float[](0, 0, c2v_style.w, c2v_style.w);\n" -" \n" -" // rjf: find dst position\n" -" vec2 dst_half_size = (c2v_dst_rect.zw - c2v_dst_rect.xy) / 2;\n" -" vec2 dst_center = (c2v_dst_rect.zw + c2v_dst_rect.xy) / 2;\n" -" vec2 dst_position = vertices[gl_VertexID] * dst_half_size + dst_center;\n" -" dst_position.y += shears[gl_VertexID];\n" -" dst_position = (u_xform * vec3(dst_position.x, dst_position.y, 1)).xy;\n" -" \n" -" // rjf: find src position\n" -" vec2 src_half_size = (c2v_src_rect.zw - c2v_src_rect.xy) / 2;\n" -" vec2 src_center = (c2v_src_rect.zw + c2v_src_rect.xy) / 2;\n" -" vec2 src_position = vertices[gl_VertexID] * src_half_size + src_center;\n" -" \n" -" // rjf: find color\n" -" vec4 colors[] = vec4[](c2v_colors_0, c2v_colors_1, c2v_colors_2, c2v_colors_3);\n" -" vec4 color = colors[gl_VertexID];\n" -" \n" -" // rjf: find corner radius\n" -" float corner_radii[] = float[](c2v_corner_radii.x, c2v_corner_radii.y, c2v_corner_radii.z, c2v_corner_radii.w);\n" -" float corner_radius = corner_radii[gl_VertexID];\n" -" \n" -" // rjf: fill outputs\n" -" vec2 dst_verts_pct = vec2(((gl_VertexID >> 1) != 1) ? 1.f : 0.f,\n" -" ((gl_VertexID & 1) != 0) ? 0.f : 1.f);\n" -" ivec2 u_tex_color_size_i = textureSize(u_tex_color, 0);\n" -" vec2 u_tex_color_size = vec2(float(u_tex_color_size_i.x), float(u_tex_color_size_i.y));\n" -" {\n" -" gl_Position = vec4(2 * dst_position.x / u_viewport_size_px.x - 1,\n" -" 2 * (1 - dst_position.y / u_viewport_size_px.y) - 1,\n" -" 0.0, 1.0);\n" -" v2p_sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * dst_half_size;\n" -" v2p_texcoord_pct = src_position / u_tex_color_size;\n" -" v2p_rect_half_size_px = dst_half_size;\n" -" v2p_tint = color;\n" -" v2p_corner_radius = corner_radius;\n" -" v2p_border_thickness = c2v_style.x;\n" -" v2p_softness = c2v_style.y;\n" -" v2p_omit_texture = c2v_style.z;\n" -" }\n" -"}\n" -"" -); - -read_only global String8 r_ogl_rect_pshad_src = -str8_lit_comp( -"" -"\n" -"#version 330 core\n" -"\n" -"in vec2 v2p_sdf_sample_pos;\n" -"in vec2 v2p_texcoord_pct;\n" -"in vec2 v2p_rect_half_size_px;\n" -"in vec4 v2p_tint;\n" -"in float v2p_corner_radius;\n" -"in float v2p_border_thickness;\n" -"in float v2p_softness;\n" -"in float v2p_omit_texture;\n" -"\n" -"out vec4 final_color;\n" -"\n" -"uniform float u_opacity;\n" -"uniform sampler2D u_tex_color;\n" -"uniform mat4 u_texture_sample_channel_map;\n" -"\n" -"float rect_sdf(vec2 sample_pos, vec2 rect_half_size, float r)\n" -"{\n" -" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" -"}\n" -"\n" -"float linear_from_srgb_f32(float x)\n" -"{\n" -" return x < 0.0404482362771082 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n" -"}\n" -"\n" -"vec4 linear_from_srgba(vec4 v)\n" -"{\n" -" vec4 result = vec4(linear_from_srgb_f32(v.x),\n" -" linear_from_srgb_f32(v.y),\n" -" linear_from_srgb_f32(v.z),\n" -" v.w);\n" -" return result;\n" -"}\n" -"\n" -"void main(void)\n" -"{\n" -" // rjf: sample texture\n" -" vec4 albedo_sample = vec4(1, 1, 1, 1);\n" -" if(v2p_omit_texture < 1)\n" -" {\n" -" albedo_sample = u_texture_sample_channel_map * texture(u_tex_color, v2p_texcoord_pct);\n" -" albedo_sample = linear_from_srgba(albedo_sample);\n" -" }\n" -" \n" -" // rjf: sample for borders\n" -" float border_sdf_t = 1;\n" -" if(v2p_border_thickness > 0)\n" -" {\n" -" float border_sdf_s = rect_sdf(v2p_sdf_sample_pos,\n" -" v2p_rect_half_size_px - vec2(v2p_softness*2.f, v2p_softness*2.f) - v2p_border_thickness,\n" -" max(v2p_corner_radius-v2p_border_thickness, 0));\n" -" border_sdf_t = smoothstep(0, 2*v2p_softness, border_sdf_s);\n" -" }\n" -" if(border_sdf_t < 0.001f)\n" -" {\n" -" discard;\n" -" }\n" -" \n" -" // rjf: sample for corners\n" -" float corner_sdf_t = 1;\n" -" if(v2p_corner_radius > 0 || v2p_softness > 0.75f)\n" -" {\n" -" float corner_sdf_s = rect_sdf(v2p_sdf_sample_pos,\n" -" v2p_rect_half_size_px - vec2(v2p_softness*2.f, v2p_softness*2.f),\n" -" v2p_corner_radius);\n" -" corner_sdf_t = 1-smoothstep(0, 2*v2p_softness, corner_sdf_s);\n" -" }\n" -" \n" -" // rjf: form+return final color\n" -" final_color = albedo_sample;\n" -" final_color *= v2p_tint;\n" -" final_color.a *= u_opacity;\n" -" final_color.a *= corner_sdf_t;\n" -" final_color.a *= border_sdf_t;\n" -"}\n" -"" -); - -read_only global String8 r_ogl_blur_vshad_src = -str8_lit_comp( -"" -"\n" -"#version 330 core\n" -"\n" -"uniform vec4 rect;\n" -"uniform vec4 corner_radii_px;\n" -"uniform vec2 viewport_size;\n" -"\n" -"out vec2 texcoord;\n" -"out vec2 sdf_sample_pos;\n" -"out vec2 rect_half_size;\n" -"out float corner_radius;\n" -"\n" -"void main(void)\n" -"{\n" -" vec2 vertex_positions_scrn[] = vec2[](rect.xw,\n" -" rect.xy,\n" -" rect.zw,\n" -" rect.zy);\n" -" float corner_radii[] = float[](corner_radii_px.y,\n" -" corner_radii_px.x,\n" -" corner_radii_px.w,\n" -" corner_radii_px.z);\n" -" vec2 cornercoords_pct = vec2((gl_VertexID >> 1) != 0 ? 1.f : 0.f,\n" -" (gl_VertexID & 1) != 0 ? 0.f : 1.f);\n" -" \n" -" vec2 vertex_position_pct = vertex_positions_scrn[gl_VertexID] / viewport_size;\n" -" vec2 vertex_position_scr = 2.f * vertex_position_pct - 1.f;\n" -" \n" -" vec2 rect_half_size_local = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" -" \n" -" gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f);\n" -" texcoord = vec2(vertex_position_pct.x, 1-vertex_position_pct.y);\n" -" sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size_local;\n" -" rect_half_size = rect_half_size_local - 2.f;\n" -" corner_radius = corner_radii[gl_VertexID];\n" -"}\n" -"" -); - -read_only global String8 r_ogl_blur_pshad_src = -str8_lit_comp( -"" -"\n" -"#version 330 core\n" -"\n" -"uniform sampler2D tex;\n" -"uniform vec4 kernel[32];\n" -"uniform int blur_count;\n" -"uniform vec2 direction;\n" -"\n" -"in vec2 texcoord;\n" -"in vec2 sdf_sample_pos;\n" -"in vec2 rect_half_size;\n" -"in float corner_radius;\n" -"\n" -"out vec4 final_color;\n" -"\n" -"float rect_sdf(vec2 sample_pos, vec2 rect_half_size, float r)\n" -"{\n" -" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" -"}\n" -"\n" -"void main(void)\n" -"{\n" -" // rjf: blend weighted texture samples into color\n" -" vec3 color = kernel[0].x * texture(tex, texcoord).rgb;\n" -" for(int i = 1; i < blur_count; i += 1)\n" -" {\n" -" float weight = kernel[i].x;\n" -" float offset = kernel[i].y;\n" -" color += weight * texture(tex, texcoord - offset * direction).rgb;\n" -" color += weight * texture(tex, texcoord + offset * direction).rgb;\n" -" }\n" -" \n" -" // rjf: sample for corners\n" -" float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size, corner_radius);\n" -" float corner_sdf_t = smoothstep(0, 2, corner_sdf_s);\n" -" \n" -" // rjf: weight output color by sdf\n" -" // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n" -" if(corner_sdf_t < 0.9f)\n" -" {\n" -" discard;\n" -" }\n" -" \n" -" final_color = vec4(color, 1.f);\n" -"}\n" -"" -); - - -C_LINKAGE_END - -#endif // RENDER_OPENGL_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef RENDER_OPENGL_META_H +#define RENDER_OPENGL_META_H + +typedef enum R_OGL_ShaderKind +{ +R_OGL_ShaderKind_Rect, +R_OGL_ShaderKind_Blur, +R_OGL_ShaderKind_COUNT, +} R_OGL_ShaderKind; + +C_LINKAGE_BEGIN +extern String8 r_ogl_shader_kind_name_table[2]; +extern String8 * r_ogl_shader_kind_vshad_src_table[2]; +extern String8 * r_ogl_shader_kind_pshad_src_table[2]; +extern R_OGL_AttributeArray r_ogl_shader_kind_input_attributes_table[2]; +extern R_OGL_AttributeArray r_ogl_shader_kind_output_attributes_table[2]; +read_only global String8 r_ogl_rect_vshad_src = +str8_lit_comp( +"" +"\n" +"#version 330 core\n" +"\n" +"in vec4 c2v_dst_rect;\n" +"in vec4 c2v_src_rect;\n" +"in vec4 c2v_colors_0;\n" +"in vec4 c2v_colors_1;\n" +"in vec4 c2v_colors_2;\n" +"in vec4 c2v_colors_3;\n" +"in vec4 c2v_corner_radii;\n" +"in vec4 c2v_style; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\n" +"\n" +"out vec2 v2p_sdf_sample_pos;\n" +"out vec2 v2p_texcoord_pct;\n" +"out vec2 v2p_rect_half_size_px;\n" +"out vec4 v2p_tint;\n" +"out float v2p_corner_radius;\n" +"out float v2p_border_thickness;\n" +"out float v2p_softness;\n" +"out float v2p_omit_texture;\n" +"\n" +"uniform mat3 u_xform;\n" +"uniform sampler2D u_tex_color;\n" +"uniform vec2 u_viewport_size_px;\n" +"\n" +"void main(void)\n" +"{\n" +" // rjf: constants\n" +" vec2 vertices[] = vec2[](vec2(-1, -1), vec2(-1, +1), vec2(+1, -1), vec2(+1, +1));\n" +" \n" +" // rjf: unpack shears\n" +" float shears[] = float[](0, 0, c2v_style.w, c2v_style.w);\n" +" \n" +" // rjf: find dst position\n" +" vec2 dst_half_size = (c2v_dst_rect.zw - c2v_dst_rect.xy) / 2;\n" +" vec2 dst_center = (c2v_dst_rect.zw + c2v_dst_rect.xy) / 2;\n" +" vec2 dst_position = vertices[gl_VertexID] * dst_half_size + dst_center;\n" +" dst_position.y += shears[gl_VertexID];\n" +" dst_position = (u_xform * vec3(dst_position.x, dst_position.y, 1)).xy;\n" +" \n" +" // rjf: find src position\n" +" vec2 src_half_size = (c2v_src_rect.zw - c2v_src_rect.xy) / 2;\n" +" vec2 src_center = (c2v_src_rect.zw + c2v_src_rect.xy) / 2;\n" +" vec2 src_position = vertices[gl_VertexID] * src_half_size + src_center;\n" +" \n" +" // rjf: find color\n" +" vec4 colors[] = vec4[](c2v_colors_0, c2v_colors_1, c2v_colors_2, c2v_colors_3);\n" +" vec4 color = colors[gl_VertexID];\n" +" \n" +" // rjf: find corner radius\n" +" float corner_radii[] = float[](c2v_corner_radii.x, c2v_corner_radii.y, c2v_corner_radii.z, c2v_corner_radii.w);\n" +" float corner_radius = corner_radii[gl_VertexID];\n" +" \n" +" // rjf: fill outputs\n" +" vec2 dst_verts_pct = vec2(((gl_VertexID >> 1) != 1) ? 1.f : 0.f,\n" +" ((gl_VertexID & 1) != 0) ? 0.f : 1.f);\n" +" ivec2 u_tex_color_size_i = textureSize(u_tex_color, 0);\n" +" vec2 u_tex_color_size = vec2(float(u_tex_color_size_i.x), float(u_tex_color_size_i.y));\n" +" {\n" +" gl_Position = vec4(2 * dst_position.x / u_viewport_size_px.x - 1,\n" +" 2 * (1 - dst_position.y / u_viewport_size_px.y) - 1,\n" +" 0.0, 1.0);\n" +" v2p_sdf_sample_pos = (2.f * dst_verts_pct - 1.f) * dst_half_size;\n" +" v2p_texcoord_pct = src_position / u_tex_color_size;\n" +" v2p_rect_half_size_px = dst_half_size;\n" +" v2p_tint = color;\n" +" v2p_corner_radius = corner_radius;\n" +" v2p_border_thickness = c2v_style.x;\n" +" v2p_softness = c2v_style.y;\n" +" v2p_omit_texture = c2v_style.z;\n" +" }\n" +"}\n" +"" +); + +read_only global String8 r_ogl_rect_pshad_src = +str8_lit_comp( +"" +"\n" +"#version 330 core\n" +"\n" +"in vec2 v2p_sdf_sample_pos;\n" +"in vec2 v2p_texcoord_pct;\n" +"in vec2 v2p_rect_half_size_px;\n" +"in vec4 v2p_tint;\n" +"in float v2p_corner_radius;\n" +"in float v2p_border_thickness;\n" +"in float v2p_softness;\n" +"in float v2p_omit_texture;\n" +"\n" +"out vec4 final_color;\n" +"\n" +"uniform float u_opacity;\n" +"uniform sampler2D u_tex_color;\n" +"uniform mat4 u_texture_sample_channel_map;\n" +"\n" +"float rect_sdf(vec2 sample_pos, vec2 rect_half_size, float r)\n" +"{\n" +" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" +"}\n" +"\n" +"float linear_from_srgb_f32(float x)\n" +"{\n" +" return x < 0.0404482362771082 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n" +"}\n" +"\n" +"vec4 linear_from_srgba(vec4 v)\n" +"{\n" +" vec4 result = vec4(linear_from_srgb_f32(v.x),\n" +" linear_from_srgb_f32(v.y),\n" +" linear_from_srgb_f32(v.z),\n" +" v.w);\n" +" return result;\n" +"}\n" +"\n" +"void main(void)\n" +"{\n" +" // rjf: sample texture\n" +" vec4 albedo_sample = vec4(1, 1, 1, 1);\n" +" if(v2p_omit_texture < 1)\n" +" {\n" +" albedo_sample = u_texture_sample_channel_map * texture(u_tex_color, v2p_texcoord_pct);\n" +" albedo_sample = linear_from_srgba(albedo_sample);\n" +" }\n" +" \n" +" // rjf: sample for borders\n" +" float border_sdf_t = 1;\n" +" if(v2p_border_thickness > 0)\n" +" {\n" +" float border_sdf_s = rect_sdf(v2p_sdf_sample_pos,\n" +" v2p_rect_half_size_px - vec2(v2p_softness*2.f, v2p_softness*2.f) - v2p_border_thickness,\n" +" max(v2p_corner_radius-v2p_border_thickness, 0));\n" +" border_sdf_t = smoothstep(0, 2*v2p_softness, border_sdf_s);\n" +" }\n" +" if(border_sdf_t < 0.001f)\n" +" {\n" +" discard;\n" +" }\n" +" \n" +" // rjf: sample for corners\n" +" float corner_sdf_t = 1;\n" +" if(v2p_corner_radius > 0 || v2p_softness > 0.75f)\n" +" {\n" +" float corner_sdf_s = rect_sdf(v2p_sdf_sample_pos,\n" +" v2p_rect_half_size_px - vec2(v2p_softness*2.f, v2p_softness*2.f),\n" +" v2p_corner_radius);\n" +" corner_sdf_t = 1-smoothstep(0, 2*v2p_softness, corner_sdf_s);\n" +" }\n" +" \n" +" // rjf: form+return final color\n" +" final_color = albedo_sample;\n" +" final_color *= v2p_tint;\n" +" final_color.a *= u_opacity;\n" +" final_color.a *= corner_sdf_t;\n" +" final_color.a *= border_sdf_t;\n" +"}\n" +"" +); + +read_only global String8 r_ogl_blur_vshad_src = +str8_lit_comp( +"" +"\n" +"#version 330 core\n" +"\n" +"uniform vec4 rect;\n" +"uniform vec4 corner_radii_px;\n" +"uniform vec2 viewport_size;\n" +"uniform uint blur_count;\n" +"\n" +"out vec2 texcoord;\n" +"out vec2 sdf_sample_pos;\n" +"out vec2 rect_half_size;\n" +"out float corner_radius;\n" +"\n" +"void main(void)\n" +"{\n" +" vec2 vertex_positions_scrn[] = vec2[](rect.xw,\n" +" rect.xy,\n" +" rect.zw,\n" +" rect.zy);\n" +" float corner_radii[] = float[](corner_radii_px.y,\n" +" corner_radii_px.x,\n" +" corner_radii_px.w,\n" +" corner_radii_px.z);\n" +" vec2 cornercoords_pct = vec2((gl_VertexID >> 1) != 0 ? 1.f : 0.f,\n" +" (gl_VertexID & 1) != 0 ? 0.f : 1.f);\n" +" \n" +" vec2 vertex_position_pct = vertex_positions_scrn[gl_VertexID] / viewport_size;\n" +" vec2 vertex_position_scr = 2.f * vertex_position_pct - 1.f;\n" +" \n" +" vec2 rect_half_size_local = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" +" \n" +" gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f);\n" +" texcoord = vec2(vertex_position_pct.x, 1-vertex_position_pct.y);\n" +" sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size_local;\n" +" rect_half_size = rect_half_size_local - 2.f;\n" +" corner_radius = corner_radii[gl_VertexID];\n" +"}\n" +"" +); + +read_only global String8 r_ogl_blur_pshad_src = +str8_lit_comp( +"" +"\n" +"#version 330 core\n" +"\n" +"uniform sampler2D tex;\n" +"uniform vec4 kernel[32];\n" +"uniform int blur_count;\n" +"uniform vec2 direction;\n" +"\n" +"in vec2 texcoord;\n" +"in vec2 sdf_sample_pos;\n" +"in vec2 rect_half_size;\n" +"in float corner_radius;\n" +"\n" +"out vec4 final_color;\n" +"\n" +"float rect_sdf(vec2 sample_pos, vec2 rect_half_size, float r)\n" +"{\n" +" return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n" +"}\n" +"\n" +"void main(void)\n" +"{\n" +" // rjf: blend weighted texture samples into color\n" +" vec3 color = kernel[0].x * texture(tex, texcoord).rgb;\n" +" for(int i = 1; i < blur_count; i += 1)\n" +" {\n" +" float weight = kernel[i].x;\n" +" float offset = kernel[i].y;\n" +" color += weight * texture(tex, texcoord - offset * direction).rgb;\n" +" color += weight * texture(tex, texcoord + offset * direction).rgb;\n" +" }\n" +" \n" +" // rjf: sample for corners\n" +" float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size, corner_radius);\n" +" float corner_sdf_t = smoothstep(0, 2, corner_sdf_s);\n" +" \n" +" // rjf: weight output color by sdf\n" +" // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n" +" if(corner_sdf_t < 0.9f)\n" +" {\n" +" discard;\n" +" }\n" +" \n" +" final_color = vec4(color, 1.f);\n" +"}\n" +"" +); + + +C_LINKAGE_END + +#endif // RENDER_OPENGL_META_H diff --git a/src/text/generated/text.meta.c b/src/text/generated/text.meta.c index bb00c67a..e826c980 100644 --- a/src/text/generated/text.meta.c +++ b/src/text/generated/text.meta.c @@ -1,458 +1,458 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 txt_lang_kind_ext_table[8] = -{ -str8_lit_comp("null"), -str8_lit_comp("c"), -str8_lit_comp("cpp"), -str8_lit_comp("odin"), -str8_lit_comp("jai"), -str8_lit_comp("zig"), -str8_lit_comp("rs"), -str8_lit_comp("disasm_x64_intel"), -}; - -struct {String8 ext; TXT_LangKind kind;} txt_ext_lang_kind_table[24] = -{ -{str8_lit_comp("null"), TXT_LangKind_Null}, -{str8_lit_comp("c"), TXT_LangKind_C}, -{str8_lit_comp("cpp"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("odin"), TXT_LangKind_Odin}, -{str8_lit_comp("jai"), TXT_LangKind_Jai}, -{str8_lit_comp("zig"), TXT_LangKind_Zig}, -{str8_lit_comp("rs"), TXT_LangKind_Rust}, -{str8_lit_comp("disasm_x64_intel"), TXT_LangKind_DisasmX64Intel}, -{str8_lit_comp("h"), TXT_LangKind_C}, -{str8_lit_comp("cxx"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("cc"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("c++"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("ixx"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("cxxm"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("c++m"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("ccm"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("cppm"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("mpp"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("C"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("hpp"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("hxx"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("hh"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("h++"), TXT_LangKind_CPlusPlus}, -{str8_lit_comp("H"), TXT_LangKind_CPlusPlus}, -}; - -String8Array txt_keywords_from_lang_kind_table[8] = -{ -{txt_keywords__null, ArrayCount(txt_keywords__null)}, -{txt_keywords__c, ArrayCount(txt_keywords__c)}, -{txt_keywords__cpp, ArrayCount(txt_keywords__cpp)}, -{txt_keywords__odin, ArrayCount(txt_keywords__odin)}, -{txt_keywords__jai, ArrayCount(txt_keywords__jai)}, -{txt_keywords__zig, ArrayCount(txt_keywords__zig)}, -{txt_keywords__rust, ArrayCount(txt_keywords__rust)}, -{txt_keywords__null, ArrayCount(txt_keywords__null)}, -}; - -String8Array txt_multichar_symbols_from_lang_kind_table[8] = -{ -{txt_multichar_symbols__null, ArrayCount(txt_multichar_symbols__null)}, -{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, -{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, -{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, -{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, -{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, -{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, -{txt_multichar_symbols__null, ArrayCount(txt_multichar_symbols__null)}, -}; - -TXT_TokenizerRuleArray txt_tokenizer_rules_from_lang_kind_table[8] = -{ -{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, -{txt_tokenizer_rules__c, ArrayCount(txt_tokenizer_rules__c)}, -{txt_tokenizer_rules__c, ArrayCount(txt_tokenizer_rules__c)}, -{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, -{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, -{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, -{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, -{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, -}; - -String8 txt_keywords__null[1] = -{ -{0}, -}; - -String8 txt_multichar_symbols__null[1] = -{ -{0}, -}; - -TXT_TokenizerRule txt_tokenizer_rules__null[1] = -{ -{TXT_TokenKind_Null}, -}; - -String8 txt_keywords__c[32] = -{ -str8_lit_comp("auto"), -str8_lit_comp("break"), -str8_lit_comp("case"), -str8_lit_comp("char"), -str8_lit_comp("const"), -str8_lit_comp("continue"), -str8_lit_comp("default"), -str8_lit_comp("do"), -str8_lit_comp("double"), -str8_lit_comp("else"), -str8_lit_comp("enum"), -str8_lit_comp("extern"), -str8_lit_comp("float"), -str8_lit_comp("for"), -str8_lit_comp("goto"), -str8_lit_comp("if"), -str8_lit_comp("int"), -str8_lit_comp("long"), -str8_lit_comp("register"), -str8_lit_comp("return"), -str8_lit_comp("short"), -str8_lit_comp("signed"), -str8_lit_comp("sizeof"), -str8_lit_comp("static"), -str8_lit_comp("struct"), -str8_lit_comp("switch"), -str8_lit_comp("typedef"), -str8_lit_comp("union"), -str8_lit_comp("unsigned"), -str8_lit_comp("void"), -str8_lit_comp("volatile"), -str8_lit_comp("while"), -}; - -String8 txt_multichar_symbols__c[20] = -{ -str8_lit_comp("<<"), -str8_lit_comp(">>"), -str8_lit_comp("<="), -str8_lit_comp(">="), -str8_lit_comp("=="), -str8_lit_comp("!="), -str8_lit_comp("&&"), -str8_lit_comp("||"), -str8_lit_comp("|="), -str8_lit_comp("&="), -str8_lit_comp("^="), -str8_lit_comp("~="), -str8_lit_comp("+="), -str8_lit_comp("-="), -str8_lit_comp("*="), -str8_lit_comp("/="), -str8_lit_comp("%="), -str8_lit_comp("<<="), -str8_lit_comp(">>="), -str8_lit_comp("->"), -}; - -TXT_TokenizerRule txt_tokenizer_rules__c[7] = -{ -{TXT_TokenKind_Comment, str8_lit_comp("//"), str8_lit_comp("\n"), 0, 0, 1, 0}, -{TXT_TokenKind_Comment, str8_lit_comp("/*"), str8_lit_comp("*/"), 2, 0, 0, 0}, -{TXT_TokenKind_Meta, str8_lit_comp("#"), str8_lit_comp("\n"), 0, 0, 1, 0}, -{TXT_TokenKind_String, str8_lit_comp("\""), str8_lit_comp("\""), 1, 0, 1, 0}, -{TXT_TokenKind_String, str8_lit_comp("'"), str8_lit_comp("'"), 1, 0, 1, 0}, -{TXT_TokenKind_String, str8_lit_comp("\""), str8_lit_comp("\""), 1, 0, 1, 3}, -{TXT_TokenKind_String, str8_lit_comp("<"), str8_lit_comp(">"), 1, 0, 1, 3}, -}; - -String8 txt_keywords__cpp[97] = -{ -str8_lit_comp("alignas"), -str8_lit_comp("alignof"), -str8_lit_comp("and"), -str8_lit_comp("and_eq"), -str8_lit_comp("asm"), -str8_lit_comp("atomic_cancel"), -str8_lit_comp("atomic_commit"), -str8_lit_comp("atomic_noexcept"), -str8_lit_comp("auto"), -str8_lit_comp("bitand"), -str8_lit_comp("bitor"), -str8_lit_comp("bool"), -str8_lit_comp("break"), -str8_lit_comp("case"), -str8_lit_comp("catch"), -str8_lit_comp("char"), -str8_lit_comp("char8_t"), -str8_lit_comp("char16_t"), -str8_lit_comp("char32_t"), -str8_lit_comp("class"), -str8_lit_comp("compl"), -str8_lit_comp("concept"), -str8_lit_comp("const"), -str8_lit_comp("consteval"), -str8_lit_comp("constexpr"), -str8_lit_comp("constinit"), -str8_lit_comp("const_cast"), -str8_lit_comp("continue"), -str8_lit_comp("co_await"), -str8_lit_comp("co_return"), -str8_lit_comp("co_yield"), -str8_lit_comp("decltype"), -str8_lit_comp("default"), -str8_lit_comp("delete"), -str8_lit_comp("do"), -str8_lit_comp("double"), -str8_lit_comp("dynamic_cast"), -str8_lit_comp("else"), -str8_lit_comp("enum"), -str8_lit_comp("explicit"), -str8_lit_comp("export"), -str8_lit_comp("extern"), -str8_lit_comp("false"), -str8_lit_comp("float"), -str8_lit_comp("for"), -str8_lit_comp("friend"), -str8_lit_comp("goto"), -str8_lit_comp("if"), -str8_lit_comp("inline"), -str8_lit_comp("int"), -str8_lit_comp("long"), -str8_lit_comp("mutable"), -str8_lit_comp("namespace"), -str8_lit_comp("new"), -str8_lit_comp("noexcept"), -str8_lit_comp("not"), -str8_lit_comp("not_eq"), -str8_lit_comp("nullptr"), -str8_lit_comp("operator"), -str8_lit_comp("or"), -str8_lit_comp("or_eq"), -str8_lit_comp("private"), -str8_lit_comp("protected"), -str8_lit_comp("public"), -str8_lit_comp("reflexpr"), -str8_lit_comp("register"), -str8_lit_comp("reinterpret_cast"), -str8_lit_comp("requires"), -str8_lit_comp("return"), -str8_lit_comp("short"), -str8_lit_comp("signed"), -str8_lit_comp("sizeof"), -str8_lit_comp("static"), -str8_lit_comp("static_assert"), -str8_lit_comp("static_cast"), -str8_lit_comp("struct"), -str8_lit_comp("switch"), -str8_lit_comp("synchronized"), -str8_lit_comp("template"), -str8_lit_comp("this"), -str8_lit_comp("thread_local"), -str8_lit_comp("throw"), -str8_lit_comp("true"), -str8_lit_comp("try"), -str8_lit_comp("typedef"), -str8_lit_comp("typeid"), -str8_lit_comp("typename"), -str8_lit_comp("union"), -str8_lit_comp("unsigned"), -str8_lit_comp("using"), -str8_lit_comp("virtual"), -str8_lit_comp("void"), -str8_lit_comp("volatile"), -str8_lit_comp("wchar_t"), -str8_lit_comp("while"), -str8_lit_comp("xor"), -str8_lit_comp("xor_eq"), -}; - -String8 txt_keywords__odin[40] = -{ -str8_lit_comp("align_of"), -str8_lit_comp("asm"), -str8_lit_comp("auto_cast"), -str8_lit_comp("bit_set"), -str8_lit_comp("break"), -str8_lit_comp("case"), -str8_lit_comp("cast"), -str8_lit_comp("context"), -str8_lit_comp("continue"), -str8_lit_comp("defer"), -str8_lit_comp("distinct"), -str8_lit_comp("do"), -str8_lit_comp("dynamic"), -str8_lit_comp("else"), -str8_lit_comp("enum"), -str8_lit_comp("fallthrough"), -str8_lit_comp("for"), -str8_lit_comp("foreign"), -str8_lit_comp("if"), -str8_lit_comp("in"), -str8_lit_comp("map"), -str8_lit_comp("matrix"), -str8_lit_comp("not_in"), -str8_lit_comp("or_break"), -str8_lit_comp("or_continue"), -str8_lit_comp("or_else"), -str8_lit_comp("or_return"), -str8_lit_comp("package"), -str8_lit_comp("proc"), -str8_lit_comp("return"), -str8_lit_comp("size_of"), -str8_lit_comp("struct"), -str8_lit_comp("switch"), -str8_lit_comp("transmute"), -str8_lit_comp("typeid"), -str8_lit_comp("union"), -str8_lit_comp("using"), -str8_lit_comp("when"), -str8_lit_comp("where"), -str8_lit_comp("import"), -}; - -String8 txt_keywords__jai[39] = -{ -str8_lit_comp("bool"), -str8_lit_comp("true"), -str8_lit_comp("false"), -str8_lit_comp("int"), -str8_lit_comp("s8"), -str8_lit_comp("u8"), -str8_lit_comp("s16"), -str8_lit_comp("u16"), -str8_lit_comp("s32"), -str8_lit_comp("u32"), -str8_lit_comp("s64"), -str8_lit_comp("u64"), -str8_lit_comp("s128"), -str8_lit_comp("u128"), -str8_lit_comp("float"), -str8_lit_comp("float32"), -str8_lit_comp("float64"), -str8_lit_comp("void"), -str8_lit_comp("enum"), -str8_lit_comp("enum_flags"), -str8_lit_comp("size_of"), -str8_lit_comp("string"), -str8_lit_comp("type_of"), -str8_lit_comp("cast"), -str8_lit_comp("if"), -str8_lit_comp("ifs"), -str8_lit_comp("then"), -str8_lit_comp("else"), -str8_lit_comp("case"), -str8_lit_comp("for"), -str8_lit_comp("while"), -str8_lit_comp("break"), -str8_lit_comp("continue"), -str8_lit_comp("remove"), -str8_lit_comp("return"), -str8_lit_comp("inline"), -str8_lit_comp("null"), -str8_lit_comp("defer"), -str8_lit_comp("xx"), -}; - -String8 txt_keywords__zig[49] = -{ -str8_lit_comp("addrspace"), -str8_lit_comp("align"), -str8_lit_comp("allowzero"), -str8_lit_comp("and"), -str8_lit_comp("anyframe"), -str8_lit_comp("anytype"), -str8_lit_comp("asm"), -str8_lit_comp("async"), -str8_lit_comp("await"), -str8_lit_comp("break"), -str8_lit_comp("callconv"), -str8_lit_comp("catch"), -str8_lit_comp("comptime"), -str8_lit_comp("const"), -str8_lit_comp("continue"), -str8_lit_comp("defer"), -str8_lit_comp("else"), -str8_lit_comp("enum"), -str8_lit_comp("errdefer"), -str8_lit_comp("error"), -str8_lit_comp("export"), -str8_lit_comp("extern"), -str8_lit_comp("fn"), -str8_lit_comp("for"), -str8_lit_comp("if"), -str8_lit_comp("inline"), -str8_lit_comp("noalias"), -str8_lit_comp("nosuspend"), -str8_lit_comp("noinline"), -str8_lit_comp("opaque"), -str8_lit_comp("or"), -str8_lit_comp("orelse"), -str8_lit_comp("packed"), -str8_lit_comp("pub"), -str8_lit_comp("resume"), -str8_lit_comp("return"), -str8_lit_comp("linksection"), -str8_lit_comp("struct"), -str8_lit_comp("suspend"), -str8_lit_comp("switch"), -str8_lit_comp("test"), -str8_lit_comp("threadlocal"), -str8_lit_comp("try"), -str8_lit_comp("union"), -str8_lit_comp("unreachable"), -str8_lit_comp("usingnamespace"), -str8_lit_comp("var"), -str8_lit_comp("volatile"), -str8_lit_comp("while"), -}; - -String8 txt_keywords__rust[43] = -{ -str8_lit_comp("as"), -str8_lit_comp("break"), -str8_lit_comp("const"), -str8_lit_comp("continue"), -str8_lit_comp("crate"), -str8_lit_comp("else"), -str8_lit_comp("enum"), -str8_lit_comp("extern"), -str8_lit_comp("false"), -str8_lit_comp("fn"), -str8_lit_comp("for"), -str8_lit_comp("if"), -str8_lit_comp("impl"), -str8_lit_comp("in"), -str8_lit_comp("let"), -str8_lit_comp("loop"), -str8_lit_comp("match"), -str8_lit_comp("mod"), -str8_lit_comp("move"), -str8_lit_comp("mut"), -str8_lit_comp("pub"), -str8_lit_comp("ref"), -str8_lit_comp("return"), -str8_lit_comp("self"), -str8_lit_comp("Self"), -str8_lit_comp("static"), -str8_lit_comp("struct"), -str8_lit_comp("super"), -str8_lit_comp("trait"), -str8_lit_comp("true"), -str8_lit_comp("type"), -str8_lit_comp("unsafe"), -str8_lit_comp("use"), -str8_lit_comp("where"), -str8_lit_comp("while"), -str8_lit_comp("yield"), -str8_lit_comp("async"), -str8_lit_comp("await"), -str8_lit_comp("dyn"), -str8_lit_comp("macro_rules"), -str8_lit_comp("raw"), -str8_lit_comp("safe"), -str8_lit_comp("union"), -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 txt_lang_kind_ext_table[8] = +{ +str8_lit_comp("null"), +str8_lit_comp("c"), +str8_lit_comp("cpp"), +str8_lit_comp("odin"), +str8_lit_comp("jai"), +str8_lit_comp("zig"), +str8_lit_comp("rs"), +str8_lit_comp("disasm_x64_intel"), +}; + +struct {String8 ext; TXT_LangKind kind;} txt_ext_lang_kind_table[24] = +{ +{str8_lit_comp("null"), TXT_LangKind_Null}, +{str8_lit_comp("c"), TXT_LangKind_C}, +{str8_lit_comp("cpp"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("odin"), TXT_LangKind_Odin}, +{str8_lit_comp("jai"), TXT_LangKind_Jai}, +{str8_lit_comp("zig"), TXT_LangKind_Zig}, +{str8_lit_comp("rs"), TXT_LangKind_Rust}, +{str8_lit_comp("disasm_x64_intel"), TXT_LangKind_DisasmX64Intel}, +{str8_lit_comp("h"), TXT_LangKind_C}, +{str8_lit_comp("cxx"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("cc"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("c++"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("ixx"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("cxxm"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("c++m"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("ccm"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("cppm"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("mpp"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("C"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("hpp"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("hxx"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("hh"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("h++"), TXT_LangKind_CPlusPlus}, +{str8_lit_comp("H"), TXT_LangKind_CPlusPlus}, +}; + +String8Array txt_keywords_from_lang_kind_table[8] = +{ +{txt_keywords__null, ArrayCount(txt_keywords__null)}, +{txt_keywords__c, ArrayCount(txt_keywords__c)}, +{txt_keywords__cpp, ArrayCount(txt_keywords__cpp)}, +{txt_keywords__odin, ArrayCount(txt_keywords__odin)}, +{txt_keywords__jai, ArrayCount(txt_keywords__jai)}, +{txt_keywords__zig, ArrayCount(txt_keywords__zig)}, +{txt_keywords__rust, ArrayCount(txt_keywords__rust)}, +{txt_keywords__null, ArrayCount(txt_keywords__null)}, +}; + +String8Array txt_multichar_symbols_from_lang_kind_table[8] = +{ +{txt_multichar_symbols__null, ArrayCount(txt_multichar_symbols__null)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)}, +{txt_multichar_symbols__null, ArrayCount(txt_multichar_symbols__null)}, +}; + +TXT_TokenizerRuleArray txt_tokenizer_rules_from_lang_kind_table[8] = +{ +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__c, ArrayCount(txt_tokenizer_rules__c)}, +{txt_tokenizer_rules__c, ArrayCount(txt_tokenizer_rules__c)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)}, +}; + +String8 txt_keywords__null[1] = +{ +{0}, +}; + +String8 txt_multichar_symbols__null[1] = +{ +{0}, +}; + +TXT_TokenizerRule txt_tokenizer_rules__null[1] = +{ +{TXT_TokenKind_Null}, +}; + +String8 txt_keywords__c[32] = +{ +str8_lit_comp("auto"), +str8_lit_comp("break"), +str8_lit_comp("case"), +str8_lit_comp("char"), +str8_lit_comp("const"), +str8_lit_comp("continue"), +str8_lit_comp("default"), +str8_lit_comp("do"), +str8_lit_comp("double"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("extern"), +str8_lit_comp("float"), +str8_lit_comp("for"), +str8_lit_comp("goto"), +str8_lit_comp("if"), +str8_lit_comp("int"), +str8_lit_comp("long"), +str8_lit_comp("register"), +str8_lit_comp("return"), +str8_lit_comp("short"), +str8_lit_comp("signed"), +str8_lit_comp("sizeof"), +str8_lit_comp("static"), +str8_lit_comp("struct"), +str8_lit_comp("switch"), +str8_lit_comp("typedef"), +str8_lit_comp("union"), +str8_lit_comp("unsigned"), +str8_lit_comp("void"), +str8_lit_comp("volatile"), +str8_lit_comp("while"), +}; + +String8 txt_multichar_symbols__c[20] = +{ +str8_lit_comp("<<"), +str8_lit_comp(">>"), +str8_lit_comp("<="), +str8_lit_comp(">="), +str8_lit_comp("=="), +str8_lit_comp("!="), +str8_lit_comp("&&"), +str8_lit_comp("||"), +str8_lit_comp("|="), +str8_lit_comp("&="), +str8_lit_comp("^="), +str8_lit_comp("~="), +str8_lit_comp("+="), +str8_lit_comp("-="), +str8_lit_comp("*="), +str8_lit_comp("/="), +str8_lit_comp("%="), +str8_lit_comp("<<="), +str8_lit_comp(">>="), +str8_lit_comp("->"), +}; + +TXT_TokenizerRule txt_tokenizer_rules__c[7] = +{ +{TXT_TokenKind_Comment, str8_lit_comp("//"), str8_lit_comp("\n"), 0, 0, 1, 0}, +{TXT_TokenKind_Comment, str8_lit_comp("/*"), str8_lit_comp("*/"), 2, 0, 0, 0}, +{TXT_TokenKind_Meta, str8_lit_comp("#"), str8_lit_comp("\n"), 0, 0, 1, 0}, +{TXT_TokenKind_String, str8_lit_comp("\""), str8_lit_comp("\""), 1, 0, 1, 0}, +{TXT_TokenKind_String, str8_lit_comp("'"), str8_lit_comp("'"), 1, 0, 1, 0}, +{TXT_TokenKind_String, str8_lit_comp("\""), str8_lit_comp("\""), 1, 0, 1, 3}, +{TXT_TokenKind_String, str8_lit_comp("<"), str8_lit_comp(">"), 1, 0, 1, 3}, +}; + +String8 txt_keywords__cpp[97] = +{ +str8_lit_comp("alignas"), +str8_lit_comp("alignof"), +str8_lit_comp("and"), +str8_lit_comp("and_eq"), +str8_lit_comp("asm"), +str8_lit_comp("atomic_cancel"), +str8_lit_comp("atomic_commit"), +str8_lit_comp("atomic_noexcept"), +str8_lit_comp("auto"), +str8_lit_comp("bitand"), +str8_lit_comp("bitor"), +str8_lit_comp("bool"), +str8_lit_comp("break"), +str8_lit_comp("case"), +str8_lit_comp("catch"), +str8_lit_comp("char"), +str8_lit_comp("char8_t"), +str8_lit_comp("char16_t"), +str8_lit_comp("char32_t"), +str8_lit_comp("class"), +str8_lit_comp("compl"), +str8_lit_comp("concept"), +str8_lit_comp("const"), +str8_lit_comp("consteval"), +str8_lit_comp("constexpr"), +str8_lit_comp("constinit"), +str8_lit_comp("const_cast"), +str8_lit_comp("continue"), +str8_lit_comp("co_await"), +str8_lit_comp("co_return"), +str8_lit_comp("co_yield"), +str8_lit_comp("decltype"), +str8_lit_comp("default"), +str8_lit_comp("delete"), +str8_lit_comp("do"), +str8_lit_comp("double"), +str8_lit_comp("dynamic_cast"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("explicit"), +str8_lit_comp("export"), +str8_lit_comp("extern"), +str8_lit_comp("false"), +str8_lit_comp("float"), +str8_lit_comp("for"), +str8_lit_comp("friend"), +str8_lit_comp("goto"), +str8_lit_comp("if"), +str8_lit_comp("inline"), +str8_lit_comp("int"), +str8_lit_comp("long"), +str8_lit_comp("mutable"), +str8_lit_comp("namespace"), +str8_lit_comp("new"), +str8_lit_comp("noexcept"), +str8_lit_comp("not"), +str8_lit_comp("not_eq"), +str8_lit_comp("nullptr"), +str8_lit_comp("operator"), +str8_lit_comp("or"), +str8_lit_comp("or_eq"), +str8_lit_comp("private"), +str8_lit_comp("protected"), +str8_lit_comp("public"), +str8_lit_comp("reflexpr"), +str8_lit_comp("register"), +str8_lit_comp("reinterpret_cast"), +str8_lit_comp("requires"), +str8_lit_comp("return"), +str8_lit_comp("short"), +str8_lit_comp("signed"), +str8_lit_comp("sizeof"), +str8_lit_comp("static"), +str8_lit_comp("static_assert"), +str8_lit_comp("static_cast"), +str8_lit_comp("struct"), +str8_lit_comp("switch"), +str8_lit_comp("synchronized"), +str8_lit_comp("template"), +str8_lit_comp("this"), +str8_lit_comp("thread_local"), +str8_lit_comp("throw"), +str8_lit_comp("true"), +str8_lit_comp("try"), +str8_lit_comp("typedef"), +str8_lit_comp("typeid"), +str8_lit_comp("typename"), +str8_lit_comp("union"), +str8_lit_comp("unsigned"), +str8_lit_comp("using"), +str8_lit_comp("virtual"), +str8_lit_comp("void"), +str8_lit_comp("volatile"), +str8_lit_comp("wchar_t"), +str8_lit_comp("while"), +str8_lit_comp("xor"), +str8_lit_comp("xor_eq"), +}; + +String8 txt_keywords__odin[40] = +{ +str8_lit_comp("align_of"), +str8_lit_comp("asm"), +str8_lit_comp("auto_cast"), +str8_lit_comp("bit_set"), +str8_lit_comp("break"), +str8_lit_comp("case"), +str8_lit_comp("cast"), +str8_lit_comp("context"), +str8_lit_comp("continue"), +str8_lit_comp("defer"), +str8_lit_comp("distinct"), +str8_lit_comp("do"), +str8_lit_comp("dynamic"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("fallthrough"), +str8_lit_comp("for"), +str8_lit_comp("foreign"), +str8_lit_comp("if"), +str8_lit_comp("in"), +str8_lit_comp("map"), +str8_lit_comp("matrix"), +str8_lit_comp("not_in"), +str8_lit_comp("or_break"), +str8_lit_comp("or_continue"), +str8_lit_comp("or_else"), +str8_lit_comp("or_return"), +str8_lit_comp("package"), +str8_lit_comp("proc"), +str8_lit_comp("return"), +str8_lit_comp("size_of"), +str8_lit_comp("struct"), +str8_lit_comp("switch"), +str8_lit_comp("transmute"), +str8_lit_comp("typeid"), +str8_lit_comp("union"), +str8_lit_comp("using"), +str8_lit_comp("when"), +str8_lit_comp("where"), +str8_lit_comp("import"), +}; + +String8 txt_keywords__jai[39] = +{ +str8_lit_comp("bool"), +str8_lit_comp("true"), +str8_lit_comp("false"), +str8_lit_comp("int"), +str8_lit_comp("s8"), +str8_lit_comp("u8"), +str8_lit_comp("s16"), +str8_lit_comp("u16"), +str8_lit_comp("s32"), +str8_lit_comp("u32"), +str8_lit_comp("s64"), +str8_lit_comp("u64"), +str8_lit_comp("s128"), +str8_lit_comp("u128"), +str8_lit_comp("float"), +str8_lit_comp("float32"), +str8_lit_comp("float64"), +str8_lit_comp("void"), +str8_lit_comp("enum"), +str8_lit_comp("enum_flags"), +str8_lit_comp("size_of"), +str8_lit_comp("string"), +str8_lit_comp("type_of"), +str8_lit_comp("cast"), +str8_lit_comp("if"), +str8_lit_comp("ifs"), +str8_lit_comp("then"), +str8_lit_comp("else"), +str8_lit_comp("case"), +str8_lit_comp("for"), +str8_lit_comp("while"), +str8_lit_comp("break"), +str8_lit_comp("continue"), +str8_lit_comp("remove"), +str8_lit_comp("return"), +str8_lit_comp("inline"), +str8_lit_comp("null"), +str8_lit_comp("defer"), +str8_lit_comp("xx"), +}; + +String8 txt_keywords__zig[49] = +{ +str8_lit_comp("addrspace"), +str8_lit_comp("align"), +str8_lit_comp("allowzero"), +str8_lit_comp("and"), +str8_lit_comp("anyframe"), +str8_lit_comp("anytype"), +str8_lit_comp("asm"), +str8_lit_comp("async"), +str8_lit_comp("await"), +str8_lit_comp("break"), +str8_lit_comp("callconv"), +str8_lit_comp("catch"), +str8_lit_comp("comptime"), +str8_lit_comp("const"), +str8_lit_comp("continue"), +str8_lit_comp("defer"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("errdefer"), +str8_lit_comp("error"), +str8_lit_comp("export"), +str8_lit_comp("extern"), +str8_lit_comp("fn"), +str8_lit_comp("for"), +str8_lit_comp("if"), +str8_lit_comp("inline"), +str8_lit_comp("noalias"), +str8_lit_comp("nosuspend"), +str8_lit_comp("noinline"), +str8_lit_comp("opaque"), +str8_lit_comp("or"), +str8_lit_comp("orelse"), +str8_lit_comp("packed"), +str8_lit_comp("pub"), +str8_lit_comp("resume"), +str8_lit_comp("return"), +str8_lit_comp("linksection"), +str8_lit_comp("struct"), +str8_lit_comp("suspend"), +str8_lit_comp("switch"), +str8_lit_comp("test"), +str8_lit_comp("threadlocal"), +str8_lit_comp("try"), +str8_lit_comp("union"), +str8_lit_comp("unreachable"), +str8_lit_comp("usingnamespace"), +str8_lit_comp("var"), +str8_lit_comp("volatile"), +str8_lit_comp("while"), +}; + +String8 txt_keywords__rust[43] = +{ +str8_lit_comp("as"), +str8_lit_comp("break"), +str8_lit_comp("const"), +str8_lit_comp("continue"), +str8_lit_comp("crate"), +str8_lit_comp("else"), +str8_lit_comp("enum"), +str8_lit_comp("extern"), +str8_lit_comp("false"), +str8_lit_comp("fn"), +str8_lit_comp("for"), +str8_lit_comp("if"), +str8_lit_comp("impl"), +str8_lit_comp("in"), +str8_lit_comp("let"), +str8_lit_comp("loop"), +str8_lit_comp("match"), +str8_lit_comp("mod"), +str8_lit_comp("move"), +str8_lit_comp("mut"), +str8_lit_comp("pub"), +str8_lit_comp("ref"), +str8_lit_comp("return"), +str8_lit_comp("self"), +str8_lit_comp("Self"), +str8_lit_comp("static"), +str8_lit_comp("struct"), +str8_lit_comp("super"), +str8_lit_comp("trait"), +str8_lit_comp("true"), +str8_lit_comp("type"), +str8_lit_comp("unsafe"), +str8_lit_comp("use"), +str8_lit_comp("where"), +str8_lit_comp("while"), +str8_lit_comp("yield"), +str8_lit_comp("async"), +str8_lit_comp("await"), +str8_lit_comp("dyn"), +str8_lit_comp("macro_rules"), +str8_lit_comp("raw"), +str8_lit_comp("safe"), +str8_lit_comp("union"), +}; + +C_LINKAGE_END + diff --git a/src/text/generated/text.meta.h b/src/text/generated/text.meta.h index f4cc1eab..23db1766 100644 --- a/src/text/generated/text.meta.h +++ b/src/text/generated/text.meta.h @@ -1,41 +1,41 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef TEXT_META_H -#define TEXT_META_H - -typedef enum TXT_LangKind -{ -TXT_LangKind_Null, -TXT_LangKind_C, -TXT_LangKind_CPlusPlus, -TXT_LangKind_Odin, -TXT_LangKind_Jai, -TXT_LangKind_Zig, -TXT_LangKind_Rust, -TXT_LangKind_DisasmX64Intel, -TXT_LangKind_COUNT, -} TXT_LangKind; - -C_LINKAGE_BEGIN -extern String8 txt_lang_kind_ext_table[8]; -extern String8Array txt_keywords_from_lang_kind_table[8]; -extern String8Array txt_multichar_symbols_from_lang_kind_table[8]; -extern TXT_TokenizerRuleArray txt_tokenizer_rules_from_lang_kind_table[8]; -extern String8 txt_keywords__null[1]; -extern String8 txt_multichar_symbols__null[1]; -extern TXT_TokenizerRule txt_tokenizer_rules__null[1]; -extern String8 txt_keywords__c[32]; -extern String8 txt_multichar_symbols__c[20]; -extern TXT_TokenizerRule txt_tokenizer_rules__c[7]; -extern String8 txt_keywords__cpp[97]; -extern String8 txt_keywords__odin[40]; -extern String8 txt_keywords__jai[39]; -extern String8 txt_keywords__zig[49]; -extern String8 txt_keywords__rust[43]; - -C_LINKAGE_END - -#endif // TEXT_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef TEXT_META_H +#define TEXT_META_H + +typedef enum TXT_LangKind +{ +TXT_LangKind_Null, +TXT_LangKind_C, +TXT_LangKind_CPlusPlus, +TXT_LangKind_Odin, +TXT_LangKind_Jai, +TXT_LangKind_Zig, +TXT_LangKind_Rust, +TXT_LangKind_DisasmX64Intel, +TXT_LangKind_COUNT, +} TXT_LangKind; + +C_LINKAGE_BEGIN +extern String8 txt_lang_kind_ext_table[8]; +extern String8Array txt_keywords_from_lang_kind_table[8]; +extern String8Array txt_multichar_symbols_from_lang_kind_table[8]; +extern TXT_TokenizerRuleArray txt_tokenizer_rules_from_lang_kind_table[8]; +extern String8 txt_keywords__null[1]; +extern String8 txt_multichar_symbols__null[1]; +extern TXT_TokenizerRule txt_tokenizer_rules__null[1]; +extern String8 txt_keywords__c[32]; +extern String8 txt_multichar_symbols__c[20]; +extern TXT_TokenizerRule txt_tokenizer_rules__c[7]; +extern String8 txt_keywords__cpp[97]; +extern String8 txt_keywords__odin[40]; +extern String8 txt_keywords__jai[39]; +extern String8 txt_keywords__zig[49]; +extern String8 txt_keywords__rust[43]; + +C_LINKAGE_END + +#endif // TEXT_META_H diff --git a/src/ui/generated/ui.meta.c b/src/ui/generated/ui.meta.c index 96ea8755..790b5877 100644 --- a/src/ui/generated/ui.meta.c +++ b/src/ui/generated/ui.meta.c @@ -1,212 +1,212 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#if 0 -#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent()) -#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis()) -#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x()) -#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y()) -#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width()) -#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height()) -#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width()) -#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height()) -#define UI_MinWidth(v) DeferLoop(ui_push_min_width(v), ui_pop_min_width()) -#define UI_MinHeight(v) DeferLoop(ui_push_min_height(v), ui_pop_min_height()) -#define UI_PermissionFlags(v) DeferLoop(ui_push_permission_flags(v), ui_pop_permission_flags()) -#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags()) -#define UI_OmitFlags(v) DeferLoop(ui_push_omit_flags(v), ui_pop_omit_flags()) -#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot()) -#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active()) -#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint()) -#define UI_GroupKey(v) DeferLoop(ui_push_group_key(v), ui_pop_group_key()) -#define UI_Transparency(v) DeferLoop(ui_push_transparency(v), ui_pop_transparency()) -#define UI_Tag(v) DeferLoop(ui_push_tag(v), ui_pop_tag()) -#define UI_BackgroundColor(v) DeferLoop(ui_push_background_color(v), ui_pop_background_color()) -#define UI_TextColor(v) DeferLoop(ui_push_text_color(v), ui_pop_text_color()) -#define UI_BorderColor(v) DeferLoop(ui_push_border_color(v), ui_pop_border_color()) -#define UI_Squish(v) DeferLoop(ui_push_squish(v), ui_pop_squish()) -#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor()) -#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font()) -#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size()) -#define UI_TextRasterFlags(v) DeferLoop(ui_push_text_raster_flags(v), ui_pop_text_raster_flags()) -#define UI_TabSize(v) DeferLoop(ui_push_tab_size(v), ui_pop_tab_size()) -#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00()) -#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01()) -#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10()) -#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11()) -#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size()) -#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding()) -#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment()) -#endif -internal UI_Box * ui_top_parent(void) { UI_StackTopImpl(ui_state, Parent, parent) } -internal Axis2 ui_top_child_layout_axis(void) { UI_StackTopImpl(ui_state, ChildLayoutAxis, child_layout_axis) } -internal F32 ui_top_fixed_x(void) { UI_StackTopImpl(ui_state, FixedX, fixed_x) } -internal F32 ui_top_fixed_y(void) { UI_StackTopImpl(ui_state, FixedY, fixed_y) } -internal F32 ui_top_fixed_width(void) { UI_StackTopImpl(ui_state, FixedWidth, fixed_width) } -internal F32 ui_top_fixed_height(void) { UI_StackTopImpl(ui_state, FixedHeight, fixed_height) } -internal UI_Size ui_top_pref_width(void) { UI_StackTopImpl(ui_state, PrefWidth, pref_width) } -internal UI_Size ui_top_pref_height(void) { UI_StackTopImpl(ui_state, PrefHeight, pref_height) } -internal F32 ui_top_min_width(void) { UI_StackTopImpl(ui_state, MinWidth, min_width) } -internal F32 ui_top_min_height(void) { UI_StackTopImpl(ui_state, MinHeight, min_height) } -internal UI_PermissionFlags ui_top_permission_flags(void) { UI_StackTopImpl(ui_state, PermissionFlags, permission_flags) } -internal UI_BoxFlags ui_top_flags(void) { UI_StackTopImpl(ui_state, Flags, flags) } -internal UI_BoxFlags ui_top_omit_flags(void) { UI_StackTopImpl(ui_state, OmitFlags, omit_flags) } -internal UI_FocusKind ui_top_focus_hot(void) { UI_StackTopImpl(ui_state, FocusHot, focus_hot) } -internal UI_FocusKind ui_top_focus_active(void) { UI_StackTopImpl(ui_state, FocusActive, focus_active) } -internal U32 ui_top_fastpath_codepoint(void) { UI_StackTopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } -internal UI_Key ui_top_group_key(void) { UI_StackTopImpl(ui_state, GroupKey, group_key) } -internal F32 ui_top_transparency(void) { UI_StackTopImpl(ui_state, Transparency, transparency) } -internal Vec4F32 ui_top_background_color(void) { UI_StackTopImpl(ui_state, BackgroundColor, background_color) } -internal Vec4F32 ui_top_text_color(void) { UI_StackTopImpl(ui_state, TextColor, text_color) } -internal Vec4F32 ui_top_border_color(void) { UI_StackTopImpl(ui_state, BorderColor, border_color) } -internal F32 ui_top_squish(void) { UI_StackTopImpl(ui_state, Squish, squish) } -internal WM_Cursor ui_top_hover_cursor(void) { UI_StackTopImpl(ui_state, HoverCursor, hover_cursor) } -internal FNT_Tag ui_top_font(void) { UI_StackTopImpl(ui_state, Font, font) } -internal F32 ui_top_font_size(void) { UI_StackTopImpl(ui_state, FontSize, font_size) } -internal FNT_RasterFlags ui_top_text_raster_flags(void) { UI_StackTopImpl(ui_state, TextRasterFlags, text_raster_flags) } -internal F32 ui_top_tab_size(void) { UI_StackTopImpl(ui_state, TabSize, tab_size) } -internal F32 ui_top_corner_radius_00(void) { UI_StackTopImpl(ui_state, CornerRadius00, corner_radius_00) } -internal F32 ui_top_corner_radius_01(void) { UI_StackTopImpl(ui_state, CornerRadius01, corner_radius_01) } -internal F32 ui_top_corner_radius_10(void) { UI_StackTopImpl(ui_state, CornerRadius10, corner_radius_10) } -internal F32 ui_top_corner_radius_11(void) { UI_StackTopImpl(ui_state, CornerRadius11, corner_radius_11) } -internal F32 ui_top_blur_size(void) { UI_StackTopImpl(ui_state, BlurSize, blur_size) } -internal F32 ui_top_text_padding(void) { UI_StackTopImpl(ui_state, TextPadding, text_padding) } -internal UI_TextAlign ui_top_text_alignment(void) { UI_StackTopImpl(ui_state, TextAlignment, text_alignment) } -internal UI_Box * ui_bottom_parent(void) { UI_StackBottomImpl(ui_state, Parent, parent) } -internal Axis2 ui_bottom_child_layout_axis(void) { UI_StackBottomImpl(ui_state, ChildLayoutAxis, child_layout_axis) } -internal F32 ui_bottom_fixed_x(void) { UI_StackBottomImpl(ui_state, FixedX, fixed_x) } -internal F32 ui_bottom_fixed_y(void) { UI_StackBottomImpl(ui_state, FixedY, fixed_y) } -internal F32 ui_bottom_fixed_width(void) { UI_StackBottomImpl(ui_state, FixedWidth, fixed_width) } -internal F32 ui_bottom_fixed_height(void) { UI_StackBottomImpl(ui_state, FixedHeight, fixed_height) } -internal UI_Size ui_bottom_pref_width(void) { UI_StackBottomImpl(ui_state, PrefWidth, pref_width) } -internal UI_Size ui_bottom_pref_height(void) { UI_StackBottomImpl(ui_state, PrefHeight, pref_height) } -internal F32 ui_bottom_min_width(void) { UI_StackBottomImpl(ui_state, MinWidth, min_width) } -internal F32 ui_bottom_min_height(void) { UI_StackBottomImpl(ui_state, MinHeight, min_height) } -internal UI_PermissionFlags ui_bottom_permission_flags(void) { UI_StackBottomImpl(ui_state, PermissionFlags, permission_flags) } -internal UI_BoxFlags ui_bottom_flags(void) { UI_StackBottomImpl(ui_state, Flags, flags) } -internal UI_BoxFlags ui_bottom_omit_flags(void) { UI_StackBottomImpl(ui_state, OmitFlags, omit_flags) } -internal UI_FocusKind ui_bottom_focus_hot(void) { UI_StackBottomImpl(ui_state, FocusHot, focus_hot) } -internal UI_FocusKind ui_bottom_focus_active(void) { UI_StackBottomImpl(ui_state, FocusActive, focus_active) } -internal U32 ui_bottom_fastpath_codepoint(void) { UI_StackBottomImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } -internal UI_Key ui_bottom_group_key(void) { UI_StackBottomImpl(ui_state, GroupKey, group_key) } -internal F32 ui_bottom_transparency(void) { UI_StackBottomImpl(ui_state, Transparency, transparency) } -internal Vec4F32 ui_bottom_background_color(void) { UI_StackBottomImpl(ui_state, BackgroundColor, background_color) } -internal Vec4F32 ui_bottom_text_color(void) { UI_StackBottomImpl(ui_state, TextColor, text_color) } -internal Vec4F32 ui_bottom_border_color(void) { UI_StackBottomImpl(ui_state, BorderColor, border_color) } -internal F32 ui_bottom_squish(void) { UI_StackBottomImpl(ui_state, Squish, squish) } -internal WM_Cursor ui_bottom_hover_cursor(void) { UI_StackBottomImpl(ui_state, HoverCursor, hover_cursor) } -internal FNT_Tag ui_bottom_font(void) { UI_StackBottomImpl(ui_state, Font, font) } -internal F32 ui_bottom_font_size(void) { UI_StackBottomImpl(ui_state, FontSize, font_size) } -internal FNT_RasterFlags ui_bottom_text_raster_flags(void) { UI_StackBottomImpl(ui_state, TextRasterFlags, text_raster_flags) } -internal F32 ui_bottom_tab_size(void) { UI_StackBottomImpl(ui_state, TabSize, tab_size) } -internal F32 ui_bottom_corner_radius_00(void) { UI_StackBottomImpl(ui_state, CornerRadius00, corner_radius_00) } -internal F32 ui_bottom_corner_radius_01(void) { UI_StackBottomImpl(ui_state, CornerRadius01, corner_radius_01) } -internal F32 ui_bottom_corner_radius_10(void) { UI_StackBottomImpl(ui_state, CornerRadius10, corner_radius_10) } -internal F32 ui_bottom_corner_radius_11(void) { UI_StackBottomImpl(ui_state, CornerRadius11, corner_radius_11) } -internal F32 ui_bottom_blur_size(void) { UI_StackBottomImpl(ui_state, BlurSize, blur_size) } -internal F32 ui_bottom_text_padding(void) { UI_StackBottomImpl(ui_state, TextPadding, text_padding) } -internal UI_TextAlign ui_bottom_text_alignment(void) { UI_StackBottomImpl(ui_state, TextAlignment, text_alignment) } -internal UI_Box * ui_push_parent(UI_Box * v) { UI_StackPushImpl(ui_state, Parent, parent, UI_Box *, v) } -internal Axis2 ui_push_child_layout_axis(Axis2 v) { UI_StackPushImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) } -internal F32 ui_push_fixed_x(F32 v) { UI_StackPushImpl(ui_state, FixedX, fixed_x, F32, v) } -internal F32 ui_push_fixed_y(F32 v) { UI_StackPushImpl(ui_state, FixedY, fixed_y, F32, v) } -internal F32 ui_push_fixed_width(F32 v) { UI_StackPushImpl(ui_state, FixedWidth, fixed_width, F32, v) } -internal F32 ui_push_fixed_height(F32 v) { UI_StackPushImpl(ui_state, FixedHeight, fixed_height, F32, v) } -internal UI_Size ui_push_pref_width(UI_Size v) { UI_StackPushImpl(ui_state, PrefWidth, pref_width, UI_Size, v) } -internal UI_Size ui_push_pref_height(UI_Size v) { UI_StackPushImpl(ui_state, PrefHeight, pref_height, UI_Size, v) } -internal F32 ui_push_min_width(F32 v) { UI_StackPushImpl(ui_state, MinWidth, min_width, F32, v) } -internal F32 ui_push_min_height(F32 v) { UI_StackPushImpl(ui_state, MinHeight, min_height, F32, v) } -internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v) { UI_StackPushImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) } -internal UI_BoxFlags ui_push_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, Flags, flags, UI_BoxFlags, v) } -internal UI_BoxFlags ui_push_omit_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, OmitFlags, omit_flags, UI_BoxFlags, v) } -internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) } -internal UI_FocusKind ui_push_focus_active(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) } -internal U32 ui_push_fastpath_codepoint(U32 v) { UI_StackPushImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) } -internal UI_Key ui_push_group_key(UI_Key v) { UI_StackPushImpl(ui_state, GroupKey, group_key, UI_Key, v) } -internal F32 ui_push_transparency(F32 v) { UI_StackPushImpl(ui_state, Transparency, transparency, F32, v) } -internal Vec4F32 ui_push_background_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BackgroundColor, background_color, Vec4F32, v) } -internal Vec4F32 ui_push_text_color(Vec4F32 v) { UI_StackPushImpl(ui_state, TextColor, text_color, Vec4F32, v) } -internal Vec4F32 ui_push_border_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BorderColor, border_color, Vec4F32, v) } -internal F32 ui_push_squish(F32 v) { UI_StackPushImpl(ui_state, Squish, squish, F32, v) } -internal WM_Cursor ui_push_hover_cursor(WM_Cursor v) { UI_StackPushImpl(ui_state, HoverCursor, hover_cursor, WM_Cursor, v) } -internal FNT_Tag ui_push_font(FNT_Tag v) { UI_StackPushImpl(ui_state, Font, font, FNT_Tag, v) } -internal F32 ui_push_font_size(F32 v) { UI_StackPushImpl(ui_state, FontSize, font_size, F32, v) } -internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v) { UI_StackPushImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) } -internal F32 ui_push_tab_size(F32 v) { UI_StackPushImpl(ui_state, TabSize, tab_size, F32, v) } -internal F32 ui_push_corner_radius_00(F32 v) { UI_StackPushImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) } -internal F32 ui_push_corner_radius_01(F32 v) { UI_StackPushImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) } -internal F32 ui_push_corner_radius_10(F32 v) { UI_StackPushImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) } -internal F32 ui_push_corner_radius_11(F32 v) { UI_StackPushImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) } -internal F32 ui_push_blur_size(F32 v) { UI_StackPushImpl(ui_state, BlurSize, blur_size, F32, v) } -internal F32 ui_push_text_padding(F32 v) { UI_StackPushImpl(ui_state, TextPadding, text_padding, F32, v) } -internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v) { UI_StackPushImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } -internal UI_Box * ui_pop_parent(void) { UI_StackPopImpl(ui_state, Parent, parent) } -internal Axis2 ui_pop_child_layout_axis(void) { UI_StackPopImpl(ui_state, ChildLayoutAxis, child_layout_axis) } -internal F32 ui_pop_fixed_x(void) { UI_StackPopImpl(ui_state, FixedX, fixed_x) } -internal F32 ui_pop_fixed_y(void) { UI_StackPopImpl(ui_state, FixedY, fixed_y) } -internal F32 ui_pop_fixed_width(void) { UI_StackPopImpl(ui_state, FixedWidth, fixed_width) } -internal F32 ui_pop_fixed_height(void) { UI_StackPopImpl(ui_state, FixedHeight, fixed_height) } -internal UI_Size ui_pop_pref_width(void) { UI_StackPopImpl(ui_state, PrefWidth, pref_width) } -internal UI_Size ui_pop_pref_height(void) { UI_StackPopImpl(ui_state, PrefHeight, pref_height) } -internal F32 ui_pop_min_width(void) { UI_StackPopImpl(ui_state, MinWidth, min_width) } -internal F32 ui_pop_min_height(void) { UI_StackPopImpl(ui_state, MinHeight, min_height) } -internal UI_PermissionFlags ui_pop_permission_flags(void) { UI_StackPopImpl(ui_state, PermissionFlags, permission_flags) } -internal UI_BoxFlags ui_pop_flags(void) { UI_StackPopImpl(ui_state, Flags, flags) } -internal UI_BoxFlags ui_pop_omit_flags(void) { UI_StackPopImpl(ui_state, OmitFlags, omit_flags) } -internal UI_FocusKind ui_pop_focus_hot(void) { UI_StackPopImpl(ui_state, FocusHot, focus_hot) } -internal UI_FocusKind ui_pop_focus_active(void) { UI_StackPopImpl(ui_state, FocusActive, focus_active) } -internal U32 ui_pop_fastpath_codepoint(void) { UI_StackPopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } -internal UI_Key ui_pop_group_key(void) { UI_StackPopImpl(ui_state, GroupKey, group_key) } -internal F32 ui_pop_transparency(void) { UI_StackPopImpl(ui_state, Transparency, transparency) } -internal Vec4F32 ui_pop_background_color(void) { UI_StackPopImpl(ui_state, BackgroundColor, background_color) } -internal Vec4F32 ui_pop_text_color(void) { UI_StackPopImpl(ui_state, TextColor, text_color) } -internal Vec4F32 ui_pop_border_color(void) { UI_StackPopImpl(ui_state, BorderColor, border_color) } -internal F32 ui_pop_squish(void) { UI_StackPopImpl(ui_state, Squish, squish) } -internal WM_Cursor ui_pop_hover_cursor(void) { UI_StackPopImpl(ui_state, HoverCursor, hover_cursor) } -internal FNT_Tag ui_pop_font(void) { UI_StackPopImpl(ui_state, Font, font) } -internal F32 ui_pop_font_size(void) { UI_StackPopImpl(ui_state, FontSize, font_size) } -internal FNT_RasterFlags ui_pop_text_raster_flags(void) { UI_StackPopImpl(ui_state, TextRasterFlags, text_raster_flags) } -internal F32 ui_pop_tab_size(void) { UI_StackPopImpl(ui_state, TabSize, tab_size) } -internal F32 ui_pop_corner_radius_00(void) { UI_StackPopImpl(ui_state, CornerRadius00, corner_radius_00) } -internal F32 ui_pop_corner_radius_01(void) { UI_StackPopImpl(ui_state, CornerRadius01, corner_radius_01) } -internal F32 ui_pop_corner_radius_10(void) { UI_StackPopImpl(ui_state, CornerRadius10, corner_radius_10) } -internal F32 ui_pop_corner_radius_11(void) { UI_StackPopImpl(ui_state, CornerRadius11, corner_radius_11) } -internal F32 ui_pop_blur_size(void) { UI_StackPopImpl(ui_state, BlurSize, blur_size) } -internal F32 ui_pop_text_padding(void) { UI_StackPopImpl(ui_state, TextPadding, text_padding) } -internal UI_TextAlign ui_pop_text_alignment(void) { UI_StackPopImpl(ui_state, TextAlignment, text_alignment) } -internal UI_Box * ui_set_next_parent(UI_Box * v) { UI_StackSetNextImpl(ui_state, Parent, parent, UI_Box *, v) } -internal Axis2 ui_set_next_child_layout_axis(Axis2 v) { UI_StackSetNextImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) } -internal F32 ui_set_next_fixed_x(F32 v) { UI_StackSetNextImpl(ui_state, FixedX, fixed_x, F32, v) } -internal F32 ui_set_next_fixed_y(F32 v) { UI_StackSetNextImpl(ui_state, FixedY, fixed_y, F32, v) } -internal F32 ui_set_next_fixed_width(F32 v) { UI_StackSetNextImpl(ui_state, FixedWidth, fixed_width, F32, v) } -internal F32 ui_set_next_fixed_height(F32 v) { UI_StackSetNextImpl(ui_state, FixedHeight, fixed_height, F32, v) } -internal UI_Size ui_set_next_pref_width(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefWidth, pref_width, UI_Size, v) } -internal UI_Size ui_set_next_pref_height(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefHeight, pref_height, UI_Size, v) } -internal F32 ui_set_next_min_width(F32 v) { UI_StackSetNextImpl(ui_state, MinWidth, min_width, F32, v) } -internal F32 ui_set_next_min_height(F32 v) { UI_StackSetNextImpl(ui_state, MinHeight, min_height, F32, v) } -internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v) { UI_StackSetNextImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) } -internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, Flags, flags, UI_BoxFlags, v) } -internal UI_BoxFlags ui_set_next_omit_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, OmitFlags, omit_flags, UI_BoxFlags, v) } -internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) } -internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) } -internal U32 ui_set_next_fastpath_codepoint(U32 v) { UI_StackSetNextImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) } -internal UI_Key ui_set_next_group_key(UI_Key v) { UI_StackSetNextImpl(ui_state, GroupKey, group_key, UI_Key, v) } -internal F32 ui_set_next_transparency(F32 v) { UI_StackSetNextImpl(ui_state, Transparency, transparency, F32, v) } -internal Vec4F32 ui_set_next_background_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BackgroundColor, background_color, Vec4F32, v) } -internal Vec4F32 ui_set_next_text_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, TextColor, text_color, Vec4F32, v) } -internal Vec4F32 ui_set_next_border_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BorderColor, border_color, Vec4F32, v) } -internal F32 ui_set_next_squish(F32 v) { UI_StackSetNextImpl(ui_state, Squish, squish, F32, v) } -internal WM_Cursor ui_set_next_hover_cursor(WM_Cursor v) { UI_StackSetNextImpl(ui_state, HoverCursor, hover_cursor, WM_Cursor, v) } -internal FNT_Tag ui_set_next_font(FNT_Tag v) { UI_StackSetNextImpl(ui_state, Font, font, FNT_Tag, v) } -internal F32 ui_set_next_font_size(F32 v) { UI_StackSetNextImpl(ui_state, FontSize, font_size, F32, v) } -internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v) { UI_StackSetNextImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) } -internal F32 ui_set_next_tab_size(F32 v) { UI_StackSetNextImpl(ui_state, TabSize, tab_size, F32, v) } -internal F32 ui_set_next_corner_radius_00(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) } -internal F32 ui_set_next_corner_radius_01(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) } -internal F32 ui_set_next_corner_radius_10(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) } -internal F32 ui_set_next_corner_radius_11(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) } -internal F32 ui_set_next_blur_size(F32 v) { UI_StackSetNextImpl(ui_state, BlurSize, blur_size, F32, v) } -internal F32 ui_set_next_text_padding(F32 v) { UI_StackSetNextImpl(ui_state, TextPadding, text_padding, F32, v) } -internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v) { UI_StackSetNextImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#if 0 +#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent()) +#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis()) +#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x()) +#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y()) +#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width()) +#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height()) +#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width()) +#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height()) +#define UI_MinWidth(v) DeferLoop(ui_push_min_width(v), ui_pop_min_width()) +#define UI_MinHeight(v) DeferLoop(ui_push_min_height(v), ui_pop_min_height()) +#define UI_PermissionFlags(v) DeferLoop(ui_push_permission_flags(v), ui_pop_permission_flags()) +#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags()) +#define UI_OmitFlags(v) DeferLoop(ui_push_omit_flags(v), ui_pop_omit_flags()) +#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot()) +#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active()) +#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint()) +#define UI_GroupKey(v) DeferLoop(ui_push_group_key(v), ui_pop_group_key()) +#define UI_Transparency(v) DeferLoop(ui_push_transparency(v), ui_pop_transparency()) +#define UI_Tag(v) DeferLoop(ui_push_tag(v), ui_pop_tag()) +#define UI_BackgroundColor(v) DeferLoop(ui_push_background_color(v), ui_pop_background_color()) +#define UI_TextColor(v) DeferLoop(ui_push_text_color(v), ui_pop_text_color()) +#define UI_BorderColor(v) DeferLoop(ui_push_border_color(v), ui_pop_border_color()) +#define UI_Squish(v) DeferLoop(ui_push_squish(v), ui_pop_squish()) +#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor()) +#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font()) +#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size()) +#define UI_TextRasterFlags(v) DeferLoop(ui_push_text_raster_flags(v), ui_pop_text_raster_flags()) +#define UI_TabSize(v) DeferLoop(ui_push_tab_size(v), ui_pop_tab_size()) +#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00()) +#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01()) +#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10()) +#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11()) +#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size()) +#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding()) +#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment()) +#endif +internal UI_Box * ui_top_parent(void) { UI_StackTopImpl(ui_state, Parent, parent) } +internal Axis2 ui_top_child_layout_axis(void) { UI_StackTopImpl(ui_state, ChildLayoutAxis, child_layout_axis) } +internal F32 ui_top_fixed_x(void) { UI_StackTopImpl(ui_state, FixedX, fixed_x) } +internal F32 ui_top_fixed_y(void) { UI_StackTopImpl(ui_state, FixedY, fixed_y) } +internal F32 ui_top_fixed_width(void) { UI_StackTopImpl(ui_state, FixedWidth, fixed_width) } +internal F32 ui_top_fixed_height(void) { UI_StackTopImpl(ui_state, FixedHeight, fixed_height) } +internal UI_Size ui_top_pref_width(void) { UI_StackTopImpl(ui_state, PrefWidth, pref_width) } +internal UI_Size ui_top_pref_height(void) { UI_StackTopImpl(ui_state, PrefHeight, pref_height) } +internal F32 ui_top_min_width(void) { UI_StackTopImpl(ui_state, MinWidth, min_width) } +internal F32 ui_top_min_height(void) { UI_StackTopImpl(ui_state, MinHeight, min_height) } +internal UI_PermissionFlags ui_top_permission_flags(void) { UI_StackTopImpl(ui_state, PermissionFlags, permission_flags) } +internal UI_BoxFlags ui_top_flags(void) { UI_StackTopImpl(ui_state, Flags, flags) } +internal UI_BoxFlags ui_top_omit_flags(void) { UI_StackTopImpl(ui_state, OmitFlags, omit_flags) } +internal UI_FocusKind ui_top_focus_hot(void) { UI_StackTopImpl(ui_state, FocusHot, focus_hot) } +internal UI_FocusKind ui_top_focus_active(void) { UI_StackTopImpl(ui_state, FocusActive, focus_active) } +internal U32 ui_top_fastpath_codepoint(void) { UI_StackTopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } +internal UI_Key ui_top_group_key(void) { UI_StackTopImpl(ui_state, GroupKey, group_key) } +internal F32 ui_top_transparency(void) { UI_StackTopImpl(ui_state, Transparency, transparency) } +internal Vec4F32 ui_top_background_color(void) { UI_StackTopImpl(ui_state, BackgroundColor, background_color) } +internal Vec4F32 ui_top_text_color(void) { UI_StackTopImpl(ui_state, TextColor, text_color) } +internal Vec4F32 ui_top_border_color(void) { UI_StackTopImpl(ui_state, BorderColor, border_color) } +internal F32 ui_top_squish(void) { UI_StackTopImpl(ui_state, Squish, squish) } +internal WM_Cursor ui_top_hover_cursor(void) { UI_StackTopImpl(ui_state, HoverCursor, hover_cursor) } +internal FNT_Tag ui_top_font(void) { UI_StackTopImpl(ui_state, Font, font) } +internal F32 ui_top_font_size(void) { UI_StackTopImpl(ui_state, FontSize, font_size) } +internal FNT_RasterFlags ui_top_text_raster_flags(void) { UI_StackTopImpl(ui_state, TextRasterFlags, text_raster_flags) } +internal F32 ui_top_tab_size(void) { UI_StackTopImpl(ui_state, TabSize, tab_size) } +internal F32 ui_top_corner_radius_00(void) { UI_StackTopImpl(ui_state, CornerRadius00, corner_radius_00) } +internal F32 ui_top_corner_radius_01(void) { UI_StackTopImpl(ui_state, CornerRadius01, corner_radius_01) } +internal F32 ui_top_corner_radius_10(void) { UI_StackTopImpl(ui_state, CornerRadius10, corner_radius_10) } +internal F32 ui_top_corner_radius_11(void) { UI_StackTopImpl(ui_state, CornerRadius11, corner_radius_11) } +internal F32 ui_top_blur_size(void) { UI_StackTopImpl(ui_state, BlurSize, blur_size) } +internal F32 ui_top_text_padding(void) { UI_StackTopImpl(ui_state, TextPadding, text_padding) } +internal UI_TextAlign ui_top_text_alignment(void) { UI_StackTopImpl(ui_state, TextAlignment, text_alignment) } +internal UI_Box * ui_bottom_parent(void) { UI_StackBottomImpl(ui_state, Parent, parent) } +internal Axis2 ui_bottom_child_layout_axis(void) { UI_StackBottomImpl(ui_state, ChildLayoutAxis, child_layout_axis) } +internal F32 ui_bottom_fixed_x(void) { UI_StackBottomImpl(ui_state, FixedX, fixed_x) } +internal F32 ui_bottom_fixed_y(void) { UI_StackBottomImpl(ui_state, FixedY, fixed_y) } +internal F32 ui_bottom_fixed_width(void) { UI_StackBottomImpl(ui_state, FixedWidth, fixed_width) } +internal F32 ui_bottom_fixed_height(void) { UI_StackBottomImpl(ui_state, FixedHeight, fixed_height) } +internal UI_Size ui_bottom_pref_width(void) { UI_StackBottomImpl(ui_state, PrefWidth, pref_width) } +internal UI_Size ui_bottom_pref_height(void) { UI_StackBottomImpl(ui_state, PrefHeight, pref_height) } +internal F32 ui_bottom_min_width(void) { UI_StackBottomImpl(ui_state, MinWidth, min_width) } +internal F32 ui_bottom_min_height(void) { UI_StackBottomImpl(ui_state, MinHeight, min_height) } +internal UI_PermissionFlags ui_bottom_permission_flags(void) { UI_StackBottomImpl(ui_state, PermissionFlags, permission_flags) } +internal UI_BoxFlags ui_bottom_flags(void) { UI_StackBottomImpl(ui_state, Flags, flags) } +internal UI_BoxFlags ui_bottom_omit_flags(void) { UI_StackBottomImpl(ui_state, OmitFlags, omit_flags) } +internal UI_FocusKind ui_bottom_focus_hot(void) { UI_StackBottomImpl(ui_state, FocusHot, focus_hot) } +internal UI_FocusKind ui_bottom_focus_active(void) { UI_StackBottomImpl(ui_state, FocusActive, focus_active) } +internal U32 ui_bottom_fastpath_codepoint(void) { UI_StackBottomImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } +internal UI_Key ui_bottom_group_key(void) { UI_StackBottomImpl(ui_state, GroupKey, group_key) } +internal F32 ui_bottom_transparency(void) { UI_StackBottomImpl(ui_state, Transparency, transparency) } +internal Vec4F32 ui_bottom_background_color(void) { UI_StackBottomImpl(ui_state, BackgroundColor, background_color) } +internal Vec4F32 ui_bottom_text_color(void) { UI_StackBottomImpl(ui_state, TextColor, text_color) } +internal Vec4F32 ui_bottom_border_color(void) { UI_StackBottomImpl(ui_state, BorderColor, border_color) } +internal F32 ui_bottom_squish(void) { UI_StackBottomImpl(ui_state, Squish, squish) } +internal WM_Cursor ui_bottom_hover_cursor(void) { UI_StackBottomImpl(ui_state, HoverCursor, hover_cursor) } +internal FNT_Tag ui_bottom_font(void) { UI_StackBottomImpl(ui_state, Font, font) } +internal F32 ui_bottom_font_size(void) { UI_StackBottomImpl(ui_state, FontSize, font_size) } +internal FNT_RasterFlags ui_bottom_text_raster_flags(void) { UI_StackBottomImpl(ui_state, TextRasterFlags, text_raster_flags) } +internal F32 ui_bottom_tab_size(void) { UI_StackBottomImpl(ui_state, TabSize, tab_size) } +internal F32 ui_bottom_corner_radius_00(void) { UI_StackBottomImpl(ui_state, CornerRadius00, corner_radius_00) } +internal F32 ui_bottom_corner_radius_01(void) { UI_StackBottomImpl(ui_state, CornerRadius01, corner_radius_01) } +internal F32 ui_bottom_corner_radius_10(void) { UI_StackBottomImpl(ui_state, CornerRadius10, corner_radius_10) } +internal F32 ui_bottom_corner_radius_11(void) { UI_StackBottomImpl(ui_state, CornerRadius11, corner_radius_11) } +internal F32 ui_bottom_blur_size(void) { UI_StackBottomImpl(ui_state, BlurSize, blur_size) } +internal F32 ui_bottom_text_padding(void) { UI_StackBottomImpl(ui_state, TextPadding, text_padding) } +internal UI_TextAlign ui_bottom_text_alignment(void) { UI_StackBottomImpl(ui_state, TextAlignment, text_alignment) } +internal UI_Box * ui_push_parent(UI_Box * v) { UI_StackPushImpl(ui_state, Parent, parent, UI_Box *, v) } +internal Axis2 ui_push_child_layout_axis(Axis2 v) { UI_StackPushImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) } +internal F32 ui_push_fixed_x(F32 v) { UI_StackPushImpl(ui_state, FixedX, fixed_x, F32, v) } +internal F32 ui_push_fixed_y(F32 v) { UI_StackPushImpl(ui_state, FixedY, fixed_y, F32, v) } +internal F32 ui_push_fixed_width(F32 v) { UI_StackPushImpl(ui_state, FixedWidth, fixed_width, F32, v) } +internal F32 ui_push_fixed_height(F32 v) { UI_StackPushImpl(ui_state, FixedHeight, fixed_height, F32, v) } +internal UI_Size ui_push_pref_width(UI_Size v) { UI_StackPushImpl(ui_state, PrefWidth, pref_width, UI_Size, v) } +internal UI_Size ui_push_pref_height(UI_Size v) { UI_StackPushImpl(ui_state, PrefHeight, pref_height, UI_Size, v) } +internal F32 ui_push_min_width(F32 v) { UI_StackPushImpl(ui_state, MinWidth, min_width, F32, v) } +internal F32 ui_push_min_height(F32 v) { UI_StackPushImpl(ui_state, MinHeight, min_height, F32, v) } +internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v) { UI_StackPushImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) } +internal UI_BoxFlags ui_push_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, Flags, flags, UI_BoxFlags, v) } +internal UI_BoxFlags ui_push_omit_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, OmitFlags, omit_flags, UI_BoxFlags, v) } +internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) } +internal UI_FocusKind ui_push_focus_active(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) } +internal U32 ui_push_fastpath_codepoint(U32 v) { UI_StackPushImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) } +internal UI_Key ui_push_group_key(UI_Key v) { UI_StackPushImpl(ui_state, GroupKey, group_key, UI_Key, v) } +internal F32 ui_push_transparency(F32 v) { UI_StackPushImpl(ui_state, Transparency, transparency, F32, v) } +internal Vec4F32 ui_push_background_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BackgroundColor, background_color, Vec4F32, v) } +internal Vec4F32 ui_push_text_color(Vec4F32 v) { UI_StackPushImpl(ui_state, TextColor, text_color, Vec4F32, v) } +internal Vec4F32 ui_push_border_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BorderColor, border_color, Vec4F32, v) } +internal F32 ui_push_squish(F32 v) { UI_StackPushImpl(ui_state, Squish, squish, F32, v) } +internal WM_Cursor ui_push_hover_cursor(WM_Cursor v) { UI_StackPushImpl(ui_state, HoverCursor, hover_cursor, WM_Cursor, v) } +internal FNT_Tag ui_push_font(FNT_Tag v) { UI_StackPushImpl(ui_state, Font, font, FNT_Tag, v) } +internal F32 ui_push_font_size(F32 v) { UI_StackPushImpl(ui_state, FontSize, font_size, F32, v) } +internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v) { UI_StackPushImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) } +internal F32 ui_push_tab_size(F32 v) { UI_StackPushImpl(ui_state, TabSize, tab_size, F32, v) } +internal F32 ui_push_corner_radius_00(F32 v) { UI_StackPushImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) } +internal F32 ui_push_corner_radius_01(F32 v) { UI_StackPushImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) } +internal F32 ui_push_corner_radius_10(F32 v) { UI_StackPushImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) } +internal F32 ui_push_corner_radius_11(F32 v) { UI_StackPushImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) } +internal F32 ui_push_blur_size(F32 v) { UI_StackPushImpl(ui_state, BlurSize, blur_size, F32, v) } +internal F32 ui_push_text_padding(F32 v) { UI_StackPushImpl(ui_state, TextPadding, text_padding, F32, v) } +internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v) { UI_StackPushImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } +internal UI_Box * ui_pop_parent(void) { UI_StackPopImpl(ui_state, Parent, parent) } +internal Axis2 ui_pop_child_layout_axis(void) { UI_StackPopImpl(ui_state, ChildLayoutAxis, child_layout_axis) } +internal F32 ui_pop_fixed_x(void) { UI_StackPopImpl(ui_state, FixedX, fixed_x) } +internal F32 ui_pop_fixed_y(void) { UI_StackPopImpl(ui_state, FixedY, fixed_y) } +internal F32 ui_pop_fixed_width(void) { UI_StackPopImpl(ui_state, FixedWidth, fixed_width) } +internal F32 ui_pop_fixed_height(void) { UI_StackPopImpl(ui_state, FixedHeight, fixed_height) } +internal UI_Size ui_pop_pref_width(void) { UI_StackPopImpl(ui_state, PrefWidth, pref_width) } +internal UI_Size ui_pop_pref_height(void) { UI_StackPopImpl(ui_state, PrefHeight, pref_height) } +internal F32 ui_pop_min_width(void) { UI_StackPopImpl(ui_state, MinWidth, min_width) } +internal F32 ui_pop_min_height(void) { UI_StackPopImpl(ui_state, MinHeight, min_height) } +internal UI_PermissionFlags ui_pop_permission_flags(void) { UI_StackPopImpl(ui_state, PermissionFlags, permission_flags) } +internal UI_BoxFlags ui_pop_flags(void) { UI_StackPopImpl(ui_state, Flags, flags) } +internal UI_BoxFlags ui_pop_omit_flags(void) { UI_StackPopImpl(ui_state, OmitFlags, omit_flags) } +internal UI_FocusKind ui_pop_focus_hot(void) { UI_StackPopImpl(ui_state, FocusHot, focus_hot) } +internal UI_FocusKind ui_pop_focus_active(void) { UI_StackPopImpl(ui_state, FocusActive, focus_active) } +internal U32 ui_pop_fastpath_codepoint(void) { UI_StackPopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) } +internal UI_Key ui_pop_group_key(void) { UI_StackPopImpl(ui_state, GroupKey, group_key) } +internal F32 ui_pop_transparency(void) { UI_StackPopImpl(ui_state, Transparency, transparency) } +internal Vec4F32 ui_pop_background_color(void) { UI_StackPopImpl(ui_state, BackgroundColor, background_color) } +internal Vec4F32 ui_pop_text_color(void) { UI_StackPopImpl(ui_state, TextColor, text_color) } +internal Vec4F32 ui_pop_border_color(void) { UI_StackPopImpl(ui_state, BorderColor, border_color) } +internal F32 ui_pop_squish(void) { UI_StackPopImpl(ui_state, Squish, squish) } +internal WM_Cursor ui_pop_hover_cursor(void) { UI_StackPopImpl(ui_state, HoverCursor, hover_cursor) } +internal FNT_Tag ui_pop_font(void) { UI_StackPopImpl(ui_state, Font, font) } +internal F32 ui_pop_font_size(void) { UI_StackPopImpl(ui_state, FontSize, font_size) } +internal FNT_RasterFlags ui_pop_text_raster_flags(void) { UI_StackPopImpl(ui_state, TextRasterFlags, text_raster_flags) } +internal F32 ui_pop_tab_size(void) { UI_StackPopImpl(ui_state, TabSize, tab_size) } +internal F32 ui_pop_corner_radius_00(void) { UI_StackPopImpl(ui_state, CornerRadius00, corner_radius_00) } +internal F32 ui_pop_corner_radius_01(void) { UI_StackPopImpl(ui_state, CornerRadius01, corner_radius_01) } +internal F32 ui_pop_corner_radius_10(void) { UI_StackPopImpl(ui_state, CornerRadius10, corner_radius_10) } +internal F32 ui_pop_corner_radius_11(void) { UI_StackPopImpl(ui_state, CornerRadius11, corner_radius_11) } +internal F32 ui_pop_blur_size(void) { UI_StackPopImpl(ui_state, BlurSize, blur_size) } +internal F32 ui_pop_text_padding(void) { UI_StackPopImpl(ui_state, TextPadding, text_padding) } +internal UI_TextAlign ui_pop_text_alignment(void) { UI_StackPopImpl(ui_state, TextAlignment, text_alignment) } +internal UI_Box * ui_set_next_parent(UI_Box * v) { UI_StackSetNextImpl(ui_state, Parent, parent, UI_Box *, v) } +internal Axis2 ui_set_next_child_layout_axis(Axis2 v) { UI_StackSetNextImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) } +internal F32 ui_set_next_fixed_x(F32 v) { UI_StackSetNextImpl(ui_state, FixedX, fixed_x, F32, v) } +internal F32 ui_set_next_fixed_y(F32 v) { UI_StackSetNextImpl(ui_state, FixedY, fixed_y, F32, v) } +internal F32 ui_set_next_fixed_width(F32 v) { UI_StackSetNextImpl(ui_state, FixedWidth, fixed_width, F32, v) } +internal F32 ui_set_next_fixed_height(F32 v) { UI_StackSetNextImpl(ui_state, FixedHeight, fixed_height, F32, v) } +internal UI_Size ui_set_next_pref_width(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefWidth, pref_width, UI_Size, v) } +internal UI_Size ui_set_next_pref_height(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefHeight, pref_height, UI_Size, v) } +internal F32 ui_set_next_min_width(F32 v) { UI_StackSetNextImpl(ui_state, MinWidth, min_width, F32, v) } +internal F32 ui_set_next_min_height(F32 v) { UI_StackSetNextImpl(ui_state, MinHeight, min_height, F32, v) } +internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v) { UI_StackSetNextImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) } +internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, Flags, flags, UI_BoxFlags, v) } +internal UI_BoxFlags ui_set_next_omit_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, OmitFlags, omit_flags, UI_BoxFlags, v) } +internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) } +internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) } +internal U32 ui_set_next_fastpath_codepoint(U32 v) { UI_StackSetNextImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) } +internal UI_Key ui_set_next_group_key(UI_Key v) { UI_StackSetNextImpl(ui_state, GroupKey, group_key, UI_Key, v) } +internal F32 ui_set_next_transparency(F32 v) { UI_StackSetNextImpl(ui_state, Transparency, transparency, F32, v) } +internal Vec4F32 ui_set_next_background_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BackgroundColor, background_color, Vec4F32, v) } +internal Vec4F32 ui_set_next_text_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, TextColor, text_color, Vec4F32, v) } +internal Vec4F32 ui_set_next_border_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BorderColor, border_color, Vec4F32, v) } +internal F32 ui_set_next_squish(F32 v) { UI_StackSetNextImpl(ui_state, Squish, squish, F32, v) } +internal WM_Cursor ui_set_next_hover_cursor(WM_Cursor v) { UI_StackSetNextImpl(ui_state, HoverCursor, hover_cursor, WM_Cursor, v) } +internal FNT_Tag ui_set_next_font(FNT_Tag v) { UI_StackSetNextImpl(ui_state, Font, font, FNT_Tag, v) } +internal F32 ui_set_next_font_size(F32 v) { UI_StackSetNextImpl(ui_state, FontSize, font_size, F32, v) } +internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v) { UI_StackSetNextImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) } +internal F32 ui_set_next_tab_size(F32 v) { UI_StackSetNextImpl(ui_state, TabSize, tab_size, F32, v) } +internal F32 ui_set_next_corner_radius_00(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) } +internal F32 ui_set_next_corner_radius_01(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) } +internal F32 ui_set_next_corner_radius_10(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) } +internal F32 ui_set_next_corner_radius_11(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) } +internal F32 ui_set_next_blur_size(F32 v) { UI_StackSetNextImpl(ui_state, BlurSize, blur_size, F32, v) } +internal F32 ui_set_next_text_padding(F32 v) { UI_StackSetNextImpl(ui_state, TextPadding, text_padding, F32, v) } +internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v) { UI_StackSetNextImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) } diff --git a/src/ui/generated/ui.meta.h b/src/ui/generated/ui.meta.h index 852fbe0c..fbed7a1a 100644 --- a/src/ui/generated/ui.meta.h +++ b/src/ui/generated/ui.meta.h @@ -1,408 +1,408 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef UI_META_H -#define UI_META_H - -typedef struct UI_ParentNode UI_ParentNode; struct UI_ParentNode{UI_ParentNode *next; UI_Box * v;}; -typedef struct UI_ChildLayoutAxisNode UI_ChildLayoutAxisNode; struct UI_ChildLayoutAxisNode{UI_ChildLayoutAxisNode *next; Axis2 v;}; -typedef struct UI_FixedXNode UI_FixedXNode; struct UI_FixedXNode{UI_FixedXNode *next; F32 v;}; -typedef struct UI_FixedYNode UI_FixedYNode; struct UI_FixedYNode{UI_FixedYNode *next; F32 v;}; -typedef struct UI_FixedWidthNode UI_FixedWidthNode; struct UI_FixedWidthNode{UI_FixedWidthNode *next; F32 v;}; -typedef struct UI_FixedHeightNode UI_FixedHeightNode; struct UI_FixedHeightNode{UI_FixedHeightNode *next; F32 v;}; -typedef struct UI_PrefWidthNode UI_PrefWidthNode; struct UI_PrefWidthNode{UI_PrefWidthNode *next; UI_Size v;}; -typedef struct UI_PrefHeightNode UI_PrefHeightNode; struct UI_PrefHeightNode{UI_PrefHeightNode *next; UI_Size v;}; -typedef struct UI_MinWidthNode UI_MinWidthNode; struct UI_MinWidthNode{UI_MinWidthNode *next; F32 v;}; -typedef struct UI_MinHeightNode UI_MinHeightNode; struct UI_MinHeightNode{UI_MinHeightNode *next; F32 v;}; -typedef struct UI_PermissionFlagsNode UI_PermissionFlagsNode; struct UI_PermissionFlagsNode{UI_PermissionFlagsNode *next; UI_PermissionFlags v;}; -typedef struct UI_FlagsNode UI_FlagsNode; struct UI_FlagsNode{UI_FlagsNode *next; UI_BoxFlags v;}; -typedef struct UI_OmitFlagsNode UI_OmitFlagsNode; struct UI_OmitFlagsNode{UI_OmitFlagsNode *next; UI_BoxFlags v;}; -typedef struct UI_FocusHotNode UI_FocusHotNode; struct UI_FocusHotNode{UI_FocusHotNode *next; UI_FocusKind v;}; -typedef struct UI_FocusActiveNode UI_FocusActiveNode; struct UI_FocusActiveNode{UI_FocusActiveNode *next; UI_FocusKind v;}; -typedef struct UI_FastpathCodepointNode UI_FastpathCodepointNode; struct UI_FastpathCodepointNode{UI_FastpathCodepointNode *next; U32 v;}; -typedef struct UI_GroupKeyNode UI_GroupKeyNode; struct UI_GroupKeyNode{UI_GroupKeyNode *next; UI_Key v;}; -typedef struct UI_TransparencyNode UI_TransparencyNode; struct UI_TransparencyNode{UI_TransparencyNode *next; F32 v;}; -typedef struct UI_TagNode UI_TagNode; struct UI_TagNode{UI_TagNode *next; String8 v;}; -typedef struct UI_BackgroundColorNode UI_BackgroundColorNode; struct UI_BackgroundColorNode{UI_BackgroundColorNode *next; Vec4F32 v;}; -typedef struct UI_TextColorNode UI_TextColorNode; struct UI_TextColorNode{UI_TextColorNode *next; Vec4F32 v;}; -typedef struct UI_BorderColorNode UI_BorderColorNode; struct UI_BorderColorNode{UI_BorderColorNode *next; Vec4F32 v;}; -typedef struct UI_SquishNode UI_SquishNode; struct UI_SquishNode{UI_SquishNode *next; F32 v;}; -typedef struct UI_HoverCursorNode UI_HoverCursorNode; struct UI_HoverCursorNode{UI_HoverCursorNode *next; WM_Cursor v;}; -typedef struct UI_FontNode UI_FontNode; struct UI_FontNode{UI_FontNode *next; FNT_Tag v;}; -typedef struct UI_FontSizeNode UI_FontSizeNode; struct UI_FontSizeNode{UI_FontSizeNode *next; F32 v;}; -typedef struct UI_TextRasterFlagsNode UI_TextRasterFlagsNode; struct UI_TextRasterFlagsNode{UI_TextRasterFlagsNode *next; FNT_RasterFlags v;}; -typedef struct UI_TabSizeNode UI_TabSizeNode; struct UI_TabSizeNode{UI_TabSizeNode *next; F32 v;}; -typedef struct UI_CornerRadius00Node UI_CornerRadius00Node; struct UI_CornerRadius00Node{UI_CornerRadius00Node *next; F32 v;}; -typedef struct UI_CornerRadius01Node UI_CornerRadius01Node; struct UI_CornerRadius01Node{UI_CornerRadius01Node *next; F32 v;}; -typedef struct UI_CornerRadius10Node UI_CornerRadius10Node; struct UI_CornerRadius10Node{UI_CornerRadius10Node *next; F32 v;}; -typedef struct UI_CornerRadius11Node UI_CornerRadius11Node; struct UI_CornerRadius11Node{UI_CornerRadius11Node *next; F32 v;}; -typedef struct UI_BlurSizeNode UI_BlurSizeNode; struct UI_BlurSizeNode{UI_BlurSizeNode *next; F32 v;}; -typedef struct UI_TextPaddingNode UI_TextPaddingNode; struct UI_TextPaddingNode{UI_TextPaddingNode *next; F32 v;}; -typedef struct UI_TextAlignmentNode UI_TextAlignmentNode; struct UI_TextAlignmentNode{UI_TextAlignmentNode *next; UI_TextAlign v;}; -#define UI_DeclStackNils \ -struct\ -{\ -UI_ParentNode parent_nil_stack_top;\ -UI_ChildLayoutAxisNode child_layout_axis_nil_stack_top;\ -UI_FixedXNode fixed_x_nil_stack_top;\ -UI_FixedYNode fixed_y_nil_stack_top;\ -UI_FixedWidthNode fixed_width_nil_stack_top;\ -UI_FixedHeightNode fixed_height_nil_stack_top;\ -UI_PrefWidthNode pref_width_nil_stack_top;\ -UI_PrefHeightNode pref_height_nil_stack_top;\ -UI_MinWidthNode min_width_nil_stack_top;\ -UI_MinHeightNode min_height_nil_stack_top;\ -UI_PermissionFlagsNode permission_flags_nil_stack_top;\ -UI_FlagsNode flags_nil_stack_top;\ -UI_OmitFlagsNode omit_flags_nil_stack_top;\ -UI_FocusHotNode focus_hot_nil_stack_top;\ -UI_FocusActiveNode focus_active_nil_stack_top;\ -UI_FastpathCodepointNode fastpath_codepoint_nil_stack_top;\ -UI_GroupKeyNode group_key_nil_stack_top;\ -UI_TransparencyNode transparency_nil_stack_top;\ -UI_TagNode tag_nil_stack_top;\ -UI_BackgroundColorNode background_color_nil_stack_top;\ -UI_TextColorNode text_color_nil_stack_top;\ -UI_BorderColorNode border_color_nil_stack_top;\ -UI_SquishNode squish_nil_stack_top;\ -UI_HoverCursorNode hover_cursor_nil_stack_top;\ -UI_FontNode font_nil_stack_top;\ -UI_FontSizeNode font_size_nil_stack_top;\ -UI_TextRasterFlagsNode text_raster_flags_nil_stack_top;\ -UI_TabSizeNode tab_size_nil_stack_top;\ -UI_CornerRadius00Node corner_radius_00_nil_stack_top;\ -UI_CornerRadius01Node corner_radius_01_nil_stack_top;\ -UI_CornerRadius10Node corner_radius_10_nil_stack_top;\ -UI_CornerRadius11Node corner_radius_11_nil_stack_top;\ -UI_BlurSizeNode blur_size_nil_stack_top;\ -UI_TextPaddingNode text_padding_nil_stack_top;\ -UI_TextAlignmentNode text_alignment_nil_stack_top;\ -} -#define UI_InitStackNils(state) \ -state->parent_nil_stack_top.v = &ui_nil_box;\ -state->child_layout_axis_nil_stack_top.v = Axis2_X;\ -state->fixed_x_nil_stack_top.v = 0;\ -state->fixed_y_nil_stack_top.v = 0;\ -state->fixed_width_nil_stack_top.v = 0;\ -state->fixed_height_nil_stack_top.v = 0;\ -state->pref_width_nil_stack_top.v = ui_px(250.f, 1.f);\ -state->pref_height_nil_stack_top.v = ui_px(30.f, 1.f);\ -state->min_width_nil_stack_top.v = 0;\ -state->min_height_nil_stack_top.v = 0;\ -state->permission_flags_nil_stack_top.v = UI_PermissionFlag_All;\ -state->flags_nil_stack_top.v = 0;\ -state->omit_flags_nil_stack_top.v = 0;\ -state->focus_hot_nil_stack_top.v = UI_FocusKind_Null;\ -state->focus_active_nil_stack_top.v = UI_FocusKind_Null;\ -state->fastpath_codepoint_nil_stack_top.v = 0;\ -state->group_key_nil_stack_top.v = ui_key_zero();\ -state->transparency_nil_stack_top.v = 0;\ -state->tag_nil_stack_top.v = str8_lit("");\ -state->background_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ -state->text_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ -state->border_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ -state->squish_nil_stack_top.v = 0;\ -state->hover_cursor_nil_stack_top.v = WM_Cursor_Pointer;\ -state->font_nil_stack_top.v = fnt_tag_zero();\ -state->font_size_nil_stack_top.v = 24.f;\ -state->text_raster_flags_nil_stack_top.v = FNT_RasterFlag_Hinted;\ -state->tab_size_nil_stack_top.v = 24.f*4.f;\ -state->corner_radius_00_nil_stack_top.v = 0;\ -state->corner_radius_01_nil_stack_top.v = 0;\ -state->corner_radius_10_nil_stack_top.v = 0;\ -state->corner_radius_11_nil_stack_top.v = 0;\ -state->blur_size_nil_stack_top.v = 0;\ -state->text_padding_nil_stack_top.v = 0;\ -state->text_alignment_nil_stack_top.v = UI_TextAlign_Left;\ - -#define UI_DeclStacks \ -struct\ -{\ -struct { UI_ParentNode *top; UI_Box * bottom_val; UI_ParentNode *free; U64 gen; B32 auto_pop; } parent_stack;\ -struct { UI_ChildLayoutAxisNode *top; Axis2 bottom_val; UI_ChildLayoutAxisNode *free; U64 gen; B32 auto_pop; } child_layout_axis_stack;\ -struct { UI_FixedXNode *top; F32 bottom_val; UI_FixedXNode *free; U64 gen; B32 auto_pop; } fixed_x_stack;\ -struct { UI_FixedYNode *top; F32 bottom_val; UI_FixedYNode *free; U64 gen; B32 auto_pop; } fixed_y_stack;\ -struct { UI_FixedWidthNode *top; F32 bottom_val; UI_FixedWidthNode *free; U64 gen; B32 auto_pop; } fixed_width_stack;\ -struct { UI_FixedHeightNode *top; F32 bottom_val; UI_FixedHeightNode *free; U64 gen; B32 auto_pop; } fixed_height_stack;\ -struct { UI_PrefWidthNode *top; UI_Size bottom_val; UI_PrefWidthNode *free; U64 gen; B32 auto_pop; } pref_width_stack;\ -struct { UI_PrefHeightNode *top; UI_Size bottom_val; UI_PrefHeightNode *free; U64 gen; B32 auto_pop; } pref_height_stack;\ -struct { UI_MinWidthNode *top; F32 bottom_val; UI_MinWidthNode *free; U64 gen; B32 auto_pop; } min_width_stack;\ -struct { UI_MinHeightNode *top; F32 bottom_val; UI_MinHeightNode *free; U64 gen; B32 auto_pop; } min_height_stack;\ -struct { UI_PermissionFlagsNode *top; UI_PermissionFlags bottom_val; UI_PermissionFlagsNode *free; U64 gen; B32 auto_pop; } permission_flags_stack;\ -struct { UI_FlagsNode *top; UI_BoxFlags bottom_val; UI_FlagsNode *free; U64 gen; B32 auto_pop; } flags_stack;\ -struct { UI_OmitFlagsNode *top; UI_BoxFlags bottom_val; UI_OmitFlagsNode *free; U64 gen; B32 auto_pop; } omit_flags_stack;\ -struct { UI_FocusHotNode *top; UI_FocusKind bottom_val; UI_FocusHotNode *free; U64 gen; B32 auto_pop; } focus_hot_stack;\ -struct { UI_FocusActiveNode *top; UI_FocusKind bottom_val; UI_FocusActiveNode *free; U64 gen; B32 auto_pop; } focus_active_stack;\ -struct { UI_FastpathCodepointNode *top; U32 bottom_val; UI_FastpathCodepointNode *free; U64 gen; B32 auto_pop; } fastpath_codepoint_stack;\ -struct { UI_GroupKeyNode *top; UI_Key bottom_val; UI_GroupKeyNode *free; U64 gen; B32 auto_pop; } group_key_stack;\ -struct { UI_TransparencyNode *top; F32 bottom_val; UI_TransparencyNode *free; U64 gen; B32 auto_pop; } transparency_stack;\ -struct { UI_TagNode *top; String8 bottom_val; UI_TagNode *free; U64 gen; B32 auto_pop; } tag_stack;\ -struct { UI_BackgroundColorNode *top; Vec4F32 bottom_val; UI_BackgroundColorNode *free; U64 gen; B32 auto_pop; } background_color_stack;\ -struct { UI_TextColorNode *top; Vec4F32 bottom_val; UI_TextColorNode *free; U64 gen; B32 auto_pop; } text_color_stack;\ -struct { UI_BorderColorNode *top; Vec4F32 bottom_val; UI_BorderColorNode *free; U64 gen; B32 auto_pop; } border_color_stack;\ -struct { UI_SquishNode *top; F32 bottom_val; UI_SquishNode *free; U64 gen; B32 auto_pop; } squish_stack;\ -struct { UI_HoverCursorNode *top; WM_Cursor bottom_val; UI_HoverCursorNode *free; U64 gen; B32 auto_pop; } hover_cursor_stack;\ -struct { UI_FontNode *top; FNT_Tag bottom_val; UI_FontNode *free; U64 gen; B32 auto_pop; } font_stack;\ -struct { UI_FontSizeNode *top; F32 bottom_val; UI_FontSizeNode *free; U64 gen; B32 auto_pop; } font_size_stack;\ -struct { UI_TextRasterFlagsNode *top; FNT_RasterFlags bottom_val; UI_TextRasterFlagsNode *free; U64 gen; B32 auto_pop; } text_raster_flags_stack;\ -struct { UI_TabSizeNode *top; F32 bottom_val; UI_TabSizeNode *free; U64 gen; B32 auto_pop; } tab_size_stack;\ -struct { UI_CornerRadius00Node *top; F32 bottom_val; UI_CornerRadius00Node *free; U64 gen; B32 auto_pop; } corner_radius_00_stack;\ -struct { UI_CornerRadius01Node *top; F32 bottom_val; UI_CornerRadius01Node *free; U64 gen; B32 auto_pop; } corner_radius_01_stack;\ -struct { UI_CornerRadius10Node *top; F32 bottom_val; UI_CornerRadius10Node *free; U64 gen; B32 auto_pop; } corner_radius_10_stack;\ -struct { UI_CornerRadius11Node *top; F32 bottom_val; UI_CornerRadius11Node *free; U64 gen; B32 auto_pop; } corner_radius_11_stack;\ -struct { UI_BlurSizeNode *top; F32 bottom_val; UI_BlurSizeNode *free; U64 gen; B32 auto_pop; } blur_size_stack;\ -struct { UI_TextPaddingNode *top; F32 bottom_val; UI_TextPaddingNode *free; U64 gen; B32 auto_pop; } text_padding_stack;\ -struct { UI_TextAlignmentNode *top; UI_TextAlign bottom_val; UI_TextAlignmentNode *free; U64 gen; B32 auto_pop; } text_alignment_stack;\ -} -#define UI_InitStacks(state) \ -state->parent_stack.top = &state->parent_nil_stack_top; state->parent_stack.bottom_val = &ui_nil_box; state->parent_stack.free = 0; state->parent_stack.auto_pop = 0;\ -state->child_layout_axis_stack.top = &state->child_layout_axis_nil_stack_top; state->child_layout_axis_stack.bottom_val = Axis2_X; state->child_layout_axis_stack.free = 0; state->child_layout_axis_stack.auto_pop = 0;\ -state->fixed_x_stack.top = &state->fixed_x_nil_stack_top; state->fixed_x_stack.bottom_val = 0; state->fixed_x_stack.free = 0; state->fixed_x_stack.auto_pop = 0;\ -state->fixed_y_stack.top = &state->fixed_y_nil_stack_top; state->fixed_y_stack.bottom_val = 0; state->fixed_y_stack.free = 0; state->fixed_y_stack.auto_pop = 0;\ -state->fixed_width_stack.top = &state->fixed_width_nil_stack_top; state->fixed_width_stack.bottom_val = 0; state->fixed_width_stack.free = 0; state->fixed_width_stack.auto_pop = 0;\ -state->fixed_height_stack.top = &state->fixed_height_nil_stack_top; state->fixed_height_stack.bottom_val = 0; state->fixed_height_stack.free = 0; state->fixed_height_stack.auto_pop = 0;\ -state->pref_width_stack.top = &state->pref_width_nil_stack_top; state->pref_width_stack.bottom_val = ui_px(250.f, 1.f); state->pref_width_stack.free = 0; state->pref_width_stack.auto_pop = 0;\ -state->pref_height_stack.top = &state->pref_height_nil_stack_top; state->pref_height_stack.bottom_val = ui_px(30.f, 1.f); state->pref_height_stack.free = 0; state->pref_height_stack.auto_pop = 0;\ -state->min_width_stack.top = &state->min_width_nil_stack_top; state->min_width_stack.bottom_val = 0; state->min_width_stack.free = 0; state->min_width_stack.auto_pop = 0;\ -state->min_height_stack.top = &state->min_height_nil_stack_top; state->min_height_stack.bottom_val = 0; state->min_height_stack.free = 0; state->min_height_stack.auto_pop = 0;\ -state->permission_flags_stack.top = &state->permission_flags_nil_stack_top; state->permission_flags_stack.bottom_val = UI_PermissionFlag_All; state->permission_flags_stack.free = 0; state->permission_flags_stack.auto_pop = 0;\ -state->flags_stack.top = &state->flags_nil_stack_top; state->flags_stack.bottom_val = 0; state->flags_stack.free = 0; state->flags_stack.auto_pop = 0;\ -state->omit_flags_stack.top = &state->omit_flags_nil_stack_top; state->omit_flags_stack.bottom_val = 0; state->omit_flags_stack.free = 0; state->omit_flags_stack.auto_pop = 0;\ -state->focus_hot_stack.top = &state->focus_hot_nil_stack_top; state->focus_hot_stack.bottom_val = UI_FocusKind_Null; state->focus_hot_stack.free = 0; state->focus_hot_stack.auto_pop = 0;\ -state->focus_active_stack.top = &state->focus_active_nil_stack_top; state->focus_active_stack.bottom_val = UI_FocusKind_Null; state->focus_active_stack.free = 0; state->focus_active_stack.auto_pop = 0;\ -state->fastpath_codepoint_stack.top = &state->fastpath_codepoint_nil_stack_top; state->fastpath_codepoint_stack.bottom_val = 0; state->fastpath_codepoint_stack.free = 0; state->fastpath_codepoint_stack.auto_pop = 0;\ -state->group_key_stack.top = &state->group_key_nil_stack_top; state->group_key_stack.bottom_val = ui_key_zero(); state->group_key_stack.free = 0; state->group_key_stack.auto_pop = 0;\ -state->transparency_stack.top = &state->transparency_nil_stack_top; state->transparency_stack.bottom_val = 0; state->transparency_stack.free = 0; state->transparency_stack.auto_pop = 0;\ -state->tag_stack.top = &state->tag_nil_stack_top; state->tag_stack.bottom_val = str8_lit(""); state->tag_stack.free = 0; state->tag_stack.auto_pop = 0;\ -state->background_color_stack.top = &state->background_color_nil_stack_top; state->background_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->background_color_stack.free = 0; state->background_color_stack.auto_pop = 0;\ -state->text_color_stack.top = &state->text_color_nil_stack_top; state->text_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->text_color_stack.free = 0; state->text_color_stack.auto_pop = 0;\ -state->border_color_stack.top = &state->border_color_nil_stack_top; state->border_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->border_color_stack.free = 0; state->border_color_stack.auto_pop = 0;\ -state->squish_stack.top = &state->squish_nil_stack_top; state->squish_stack.bottom_val = 0; state->squish_stack.free = 0; state->squish_stack.auto_pop = 0;\ -state->hover_cursor_stack.top = &state->hover_cursor_nil_stack_top; state->hover_cursor_stack.bottom_val = WM_Cursor_Pointer; state->hover_cursor_stack.free = 0; state->hover_cursor_stack.auto_pop = 0;\ -state->font_stack.top = &state->font_nil_stack_top; state->font_stack.bottom_val = fnt_tag_zero(); state->font_stack.free = 0; state->font_stack.auto_pop = 0;\ -state->font_size_stack.top = &state->font_size_nil_stack_top; state->font_size_stack.bottom_val = 24.f; state->font_size_stack.free = 0; state->font_size_stack.auto_pop = 0;\ -state->text_raster_flags_stack.top = &state->text_raster_flags_nil_stack_top; state->text_raster_flags_stack.bottom_val = FNT_RasterFlag_Hinted; state->text_raster_flags_stack.free = 0; state->text_raster_flags_stack.auto_pop = 0;\ -state->tab_size_stack.top = &state->tab_size_nil_stack_top; state->tab_size_stack.bottom_val = 24.f*4.f; state->tab_size_stack.free = 0; state->tab_size_stack.auto_pop = 0;\ -state->corner_radius_00_stack.top = &state->corner_radius_00_nil_stack_top; state->corner_radius_00_stack.bottom_val = 0; state->corner_radius_00_stack.free = 0; state->corner_radius_00_stack.auto_pop = 0;\ -state->corner_radius_01_stack.top = &state->corner_radius_01_nil_stack_top; state->corner_radius_01_stack.bottom_val = 0; state->corner_radius_01_stack.free = 0; state->corner_radius_01_stack.auto_pop = 0;\ -state->corner_radius_10_stack.top = &state->corner_radius_10_nil_stack_top; state->corner_radius_10_stack.bottom_val = 0; state->corner_radius_10_stack.free = 0; state->corner_radius_10_stack.auto_pop = 0;\ -state->corner_radius_11_stack.top = &state->corner_radius_11_nil_stack_top; state->corner_radius_11_stack.bottom_val = 0; state->corner_radius_11_stack.free = 0; state->corner_radius_11_stack.auto_pop = 0;\ -state->blur_size_stack.top = &state->blur_size_nil_stack_top; state->blur_size_stack.bottom_val = 0; state->blur_size_stack.free = 0; state->blur_size_stack.auto_pop = 0;\ -state->text_padding_stack.top = &state->text_padding_nil_stack_top; state->text_padding_stack.bottom_val = 0; state->text_padding_stack.free = 0; state->text_padding_stack.auto_pop = 0;\ -state->text_alignment_stack.top = &state->text_alignment_nil_stack_top; state->text_alignment_stack.bottom_val = UI_TextAlign_Left; state->text_alignment_stack.free = 0; state->text_alignment_stack.auto_pop = 0;\ - -#define UI_AutoPopStacks(state) \ -if(state->parent_stack.auto_pop) { ui_pop_parent(); state->parent_stack.auto_pop = 0; }\ -if(state->child_layout_axis_stack.auto_pop) { ui_pop_child_layout_axis(); state->child_layout_axis_stack.auto_pop = 0; }\ -if(state->fixed_x_stack.auto_pop) { ui_pop_fixed_x(); state->fixed_x_stack.auto_pop = 0; }\ -if(state->fixed_y_stack.auto_pop) { ui_pop_fixed_y(); state->fixed_y_stack.auto_pop = 0; }\ -if(state->fixed_width_stack.auto_pop) { ui_pop_fixed_width(); state->fixed_width_stack.auto_pop = 0; }\ -if(state->fixed_height_stack.auto_pop) { ui_pop_fixed_height(); state->fixed_height_stack.auto_pop = 0; }\ -if(state->pref_width_stack.auto_pop) { ui_pop_pref_width(); state->pref_width_stack.auto_pop = 0; }\ -if(state->pref_height_stack.auto_pop) { ui_pop_pref_height(); state->pref_height_stack.auto_pop = 0; }\ -if(state->min_width_stack.auto_pop) { ui_pop_min_width(); state->min_width_stack.auto_pop = 0; }\ -if(state->min_height_stack.auto_pop) { ui_pop_min_height(); state->min_height_stack.auto_pop = 0; }\ -if(state->permission_flags_stack.auto_pop) { ui_pop_permission_flags(); state->permission_flags_stack.auto_pop = 0; }\ -if(state->flags_stack.auto_pop) { ui_pop_flags(); state->flags_stack.auto_pop = 0; }\ -if(state->omit_flags_stack.auto_pop) { ui_pop_omit_flags(); state->omit_flags_stack.auto_pop = 0; }\ -if(state->focus_hot_stack.auto_pop) { ui_pop_focus_hot(); state->focus_hot_stack.auto_pop = 0; }\ -if(state->focus_active_stack.auto_pop) { ui_pop_focus_active(); state->focus_active_stack.auto_pop = 0; }\ -if(state->fastpath_codepoint_stack.auto_pop) { ui_pop_fastpath_codepoint(); state->fastpath_codepoint_stack.auto_pop = 0; }\ -if(state->group_key_stack.auto_pop) { ui_pop_group_key(); state->group_key_stack.auto_pop = 0; }\ -if(state->transparency_stack.auto_pop) { ui_pop_transparency(); state->transparency_stack.auto_pop = 0; }\ -if(state->tag_stack.auto_pop) { ui_pop_tag(); state->tag_stack.auto_pop = 0; }\ -if(state->background_color_stack.auto_pop) { ui_pop_background_color(); state->background_color_stack.auto_pop = 0; }\ -if(state->text_color_stack.auto_pop) { ui_pop_text_color(); state->text_color_stack.auto_pop = 0; }\ -if(state->border_color_stack.auto_pop) { ui_pop_border_color(); state->border_color_stack.auto_pop = 0; }\ -if(state->squish_stack.auto_pop) { ui_pop_squish(); state->squish_stack.auto_pop = 0; }\ -if(state->hover_cursor_stack.auto_pop) { ui_pop_hover_cursor(); state->hover_cursor_stack.auto_pop = 0; }\ -if(state->font_stack.auto_pop) { ui_pop_font(); state->font_stack.auto_pop = 0; }\ -if(state->font_size_stack.auto_pop) { ui_pop_font_size(); state->font_size_stack.auto_pop = 0; }\ -if(state->text_raster_flags_stack.auto_pop) { ui_pop_text_raster_flags(); state->text_raster_flags_stack.auto_pop = 0; }\ -if(state->tab_size_stack.auto_pop) { ui_pop_tab_size(); state->tab_size_stack.auto_pop = 0; }\ -if(state->corner_radius_00_stack.auto_pop) { ui_pop_corner_radius_00(); state->corner_radius_00_stack.auto_pop = 0; }\ -if(state->corner_radius_01_stack.auto_pop) { ui_pop_corner_radius_01(); state->corner_radius_01_stack.auto_pop = 0; }\ -if(state->corner_radius_10_stack.auto_pop) { ui_pop_corner_radius_10(); state->corner_radius_10_stack.auto_pop = 0; }\ -if(state->corner_radius_11_stack.auto_pop) { ui_pop_corner_radius_11(); state->corner_radius_11_stack.auto_pop = 0; }\ -if(state->blur_size_stack.auto_pop) { ui_pop_blur_size(); state->blur_size_stack.auto_pop = 0; }\ -if(state->text_padding_stack.auto_pop) { ui_pop_text_padding(); state->text_padding_stack.auto_pop = 0; }\ -if(state->text_alignment_stack.auto_pop) { ui_pop_text_alignment(); state->text_alignment_stack.auto_pop = 0; }\ - -internal UI_Box * ui_top_parent(void); -internal Axis2 ui_top_child_layout_axis(void); -internal F32 ui_top_fixed_x(void); -internal F32 ui_top_fixed_y(void); -internal F32 ui_top_fixed_width(void); -internal F32 ui_top_fixed_height(void); -internal UI_Size ui_top_pref_width(void); -internal UI_Size ui_top_pref_height(void); -internal F32 ui_top_min_width(void); -internal F32 ui_top_min_height(void); -internal UI_PermissionFlags ui_top_permission_flags(void); -internal UI_BoxFlags ui_top_flags(void); -internal UI_BoxFlags ui_top_omit_flags(void); -internal UI_FocusKind ui_top_focus_hot(void); -internal UI_FocusKind ui_top_focus_active(void); -internal U32 ui_top_fastpath_codepoint(void); -internal UI_Key ui_top_group_key(void); -internal F32 ui_top_transparency(void); -internal String8 ui_top_tag(void); -internal Vec4F32 ui_top_background_color(void); -internal Vec4F32 ui_top_text_color(void); -internal Vec4F32 ui_top_border_color(void); -internal F32 ui_top_squish(void); -internal WM_Cursor ui_top_hover_cursor(void); -internal FNT_Tag ui_top_font(void); -internal F32 ui_top_font_size(void); -internal FNT_RasterFlags ui_top_text_raster_flags(void); -internal F32 ui_top_tab_size(void); -internal F32 ui_top_corner_radius_00(void); -internal F32 ui_top_corner_radius_01(void); -internal F32 ui_top_corner_radius_10(void); -internal F32 ui_top_corner_radius_11(void); -internal F32 ui_top_blur_size(void); -internal F32 ui_top_text_padding(void); -internal UI_TextAlign ui_top_text_alignment(void); -internal UI_Box * ui_bottom_parent(void); -internal Axis2 ui_bottom_child_layout_axis(void); -internal F32 ui_bottom_fixed_x(void); -internal F32 ui_bottom_fixed_y(void); -internal F32 ui_bottom_fixed_width(void); -internal F32 ui_bottom_fixed_height(void); -internal UI_Size ui_bottom_pref_width(void); -internal UI_Size ui_bottom_pref_height(void); -internal F32 ui_bottom_min_width(void); -internal F32 ui_bottom_min_height(void); -internal UI_PermissionFlags ui_bottom_permission_flags(void); -internal UI_BoxFlags ui_bottom_flags(void); -internal UI_BoxFlags ui_bottom_omit_flags(void); -internal UI_FocusKind ui_bottom_focus_hot(void); -internal UI_FocusKind ui_bottom_focus_active(void); -internal U32 ui_bottom_fastpath_codepoint(void); -internal UI_Key ui_bottom_group_key(void); -internal F32 ui_bottom_transparency(void); -internal String8 ui_bottom_tag(void); -internal Vec4F32 ui_bottom_background_color(void); -internal Vec4F32 ui_bottom_text_color(void); -internal Vec4F32 ui_bottom_border_color(void); -internal F32 ui_bottom_squish(void); -internal WM_Cursor ui_bottom_hover_cursor(void); -internal FNT_Tag ui_bottom_font(void); -internal F32 ui_bottom_font_size(void); -internal FNT_RasterFlags ui_bottom_text_raster_flags(void); -internal F32 ui_bottom_tab_size(void); -internal F32 ui_bottom_corner_radius_00(void); -internal F32 ui_bottom_corner_radius_01(void); -internal F32 ui_bottom_corner_radius_10(void); -internal F32 ui_bottom_corner_radius_11(void); -internal F32 ui_bottom_blur_size(void); -internal F32 ui_bottom_text_padding(void); -internal UI_TextAlign ui_bottom_text_alignment(void); -internal UI_Box * ui_push_parent(UI_Box * v); -internal Axis2 ui_push_child_layout_axis(Axis2 v); -internal F32 ui_push_fixed_x(F32 v); -internal F32 ui_push_fixed_y(F32 v); -internal F32 ui_push_fixed_width(F32 v); -internal F32 ui_push_fixed_height(F32 v); -internal UI_Size ui_push_pref_width(UI_Size v); -internal UI_Size ui_push_pref_height(UI_Size v); -internal F32 ui_push_min_width(F32 v); -internal F32 ui_push_min_height(F32 v); -internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v); -internal UI_BoxFlags ui_push_flags(UI_BoxFlags v); -internal UI_BoxFlags ui_push_omit_flags(UI_BoxFlags v); -internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v); -internal UI_FocusKind ui_push_focus_active(UI_FocusKind v); -internal U32 ui_push_fastpath_codepoint(U32 v); -internal UI_Key ui_push_group_key(UI_Key v); -internal F32 ui_push_transparency(F32 v); -internal String8 ui_push_tag(String8 v); -internal Vec4F32 ui_push_background_color(Vec4F32 v); -internal Vec4F32 ui_push_text_color(Vec4F32 v); -internal Vec4F32 ui_push_border_color(Vec4F32 v); -internal F32 ui_push_squish(F32 v); -internal WM_Cursor ui_push_hover_cursor(WM_Cursor v); -internal FNT_Tag ui_push_font(FNT_Tag v); -internal F32 ui_push_font_size(F32 v); -internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v); -internal F32 ui_push_tab_size(F32 v); -internal F32 ui_push_corner_radius_00(F32 v); -internal F32 ui_push_corner_radius_01(F32 v); -internal F32 ui_push_corner_radius_10(F32 v); -internal F32 ui_push_corner_radius_11(F32 v); -internal F32 ui_push_blur_size(F32 v); -internal F32 ui_push_text_padding(F32 v); -internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v); -internal UI_Box * ui_pop_parent(void); -internal Axis2 ui_pop_child_layout_axis(void); -internal F32 ui_pop_fixed_x(void); -internal F32 ui_pop_fixed_y(void); -internal F32 ui_pop_fixed_width(void); -internal F32 ui_pop_fixed_height(void); -internal UI_Size ui_pop_pref_width(void); -internal UI_Size ui_pop_pref_height(void); -internal F32 ui_pop_min_width(void); -internal F32 ui_pop_min_height(void); -internal UI_PermissionFlags ui_pop_permission_flags(void); -internal UI_BoxFlags ui_pop_flags(void); -internal UI_BoxFlags ui_pop_omit_flags(void); -internal UI_FocusKind ui_pop_focus_hot(void); -internal UI_FocusKind ui_pop_focus_active(void); -internal U32 ui_pop_fastpath_codepoint(void); -internal UI_Key ui_pop_group_key(void); -internal F32 ui_pop_transparency(void); -internal String8 ui_pop_tag(void); -internal Vec4F32 ui_pop_background_color(void); -internal Vec4F32 ui_pop_text_color(void); -internal Vec4F32 ui_pop_border_color(void); -internal F32 ui_pop_squish(void); -internal WM_Cursor ui_pop_hover_cursor(void); -internal FNT_Tag ui_pop_font(void); -internal F32 ui_pop_font_size(void); -internal FNT_RasterFlags ui_pop_text_raster_flags(void); -internal F32 ui_pop_tab_size(void); -internal F32 ui_pop_corner_radius_00(void); -internal F32 ui_pop_corner_radius_01(void); -internal F32 ui_pop_corner_radius_10(void); -internal F32 ui_pop_corner_radius_11(void); -internal F32 ui_pop_blur_size(void); -internal F32 ui_pop_text_padding(void); -internal UI_TextAlign ui_pop_text_alignment(void); -internal UI_Box * ui_set_next_parent(UI_Box * v); -internal Axis2 ui_set_next_child_layout_axis(Axis2 v); -internal F32 ui_set_next_fixed_x(F32 v); -internal F32 ui_set_next_fixed_y(F32 v); -internal F32 ui_set_next_fixed_width(F32 v); -internal F32 ui_set_next_fixed_height(F32 v); -internal UI_Size ui_set_next_pref_width(UI_Size v); -internal UI_Size ui_set_next_pref_height(UI_Size v); -internal F32 ui_set_next_min_width(F32 v); -internal F32 ui_set_next_min_height(F32 v); -internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v); -internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v); -internal UI_BoxFlags ui_set_next_omit_flags(UI_BoxFlags v); -internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v); -internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v); -internal U32 ui_set_next_fastpath_codepoint(U32 v); -internal UI_Key ui_set_next_group_key(UI_Key v); -internal F32 ui_set_next_transparency(F32 v); -internal String8 ui_set_next_tag(String8 v); -internal Vec4F32 ui_set_next_background_color(Vec4F32 v); -internal Vec4F32 ui_set_next_text_color(Vec4F32 v); -internal Vec4F32 ui_set_next_border_color(Vec4F32 v); -internal F32 ui_set_next_squish(F32 v); -internal WM_Cursor ui_set_next_hover_cursor(WM_Cursor v); -internal FNT_Tag ui_set_next_font(FNT_Tag v); -internal F32 ui_set_next_font_size(F32 v); -internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v); -internal F32 ui_set_next_tab_size(F32 v); -internal F32 ui_set_next_corner_radius_00(F32 v); -internal F32 ui_set_next_corner_radius_01(F32 v); -internal F32 ui_set_next_corner_radius_10(F32 v); -internal F32 ui_set_next_corner_radius_11(F32 v); -internal F32 ui_set_next_blur_size(F32 v); -internal F32 ui_set_next_text_padding(F32 v); -internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v); -#endif // UI_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef UI_META_H +#define UI_META_H + +typedef struct UI_ParentNode UI_ParentNode; struct UI_ParentNode{UI_ParentNode *next; UI_Box * v;}; +typedef struct UI_ChildLayoutAxisNode UI_ChildLayoutAxisNode; struct UI_ChildLayoutAxisNode{UI_ChildLayoutAxisNode *next; Axis2 v;}; +typedef struct UI_FixedXNode UI_FixedXNode; struct UI_FixedXNode{UI_FixedXNode *next; F32 v;}; +typedef struct UI_FixedYNode UI_FixedYNode; struct UI_FixedYNode{UI_FixedYNode *next; F32 v;}; +typedef struct UI_FixedWidthNode UI_FixedWidthNode; struct UI_FixedWidthNode{UI_FixedWidthNode *next; F32 v;}; +typedef struct UI_FixedHeightNode UI_FixedHeightNode; struct UI_FixedHeightNode{UI_FixedHeightNode *next; F32 v;}; +typedef struct UI_PrefWidthNode UI_PrefWidthNode; struct UI_PrefWidthNode{UI_PrefWidthNode *next; UI_Size v;}; +typedef struct UI_PrefHeightNode UI_PrefHeightNode; struct UI_PrefHeightNode{UI_PrefHeightNode *next; UI_Size v;}; +typedef struct UI_MinWidthNode UI_MinWidthNode; struct UI_MinWidthNode{UI_MinWidthNode *next; F32 v;}; +typedef struct UI_MinHeightNode UI_MinHeightNode; struct UI_MinHeightNode{UI_MinHeightNode *next; F32 v;}; +typedef struct UI_PermissionFlagsNode UI_PermissionFlagsNode; struct UI_PermissionFlagsNode{UI_PermissionFlagsNode *next; UI_PermissionFlags v;}; +typedef struct UI_FlagsNode UI_FlagsNode; struct UI_FlagsNode{UI_FlagsNode *next; UI_BoxFlags v;}; +typedef struct UI_OmitFlagsNode UI_OmitFlagsNode; struct UI_OmitFlagsNode{UI_OmitFlagsNode *next; UI_BoxFlags v;}; +typedef struct UI_FocusHotNode UI_FocusHotNode; struct UI_FocusHotNode{UI_FocusHotNode *next; UI_FocusKind v;}; +typedef struct UI_FocusActiveNode UI_FocusActiveNode; struct UI_FocusActiveNode{UI_FocusActiveNode *next; UI_FocusKind v;}; +typedef struct UI_FastpathCodepointNode UI_FastpathCodepointNode; struct UI_FastpathCodepointNode{UI_FastpathCodepointNode *next; U32 v;}; +typedef struct UI_GroupKeyNode UI_GroupKeyNode; struct UI_GroupKeyNode{UI_GroupKeyNode *next; UI_Key v;}; +typedef struct UI_TransparencyNode UI_TransparencyNode; struct UI_TransparencyNode{UI_TransparencyNode *next; F32 v;}; +typedef struct UI_TagNode UI_TagNode; struct UI_TagNode{UI_TagNode *next; String8 v;}; +typedef struct UI_BackgroundColorNode UI_BackgroundColorNode; struct UI_BackgroundColorNode{UI_BackgroundColorNode *next; Vec4F32 v;}; +typedef struct UI_TextColorNode UI_TextColorNode; struct UI_TextColorNode{UI_TextColorNode *next; Vec4F32 v;}; +typedef struct UI_BorderColorNode UI_BorderColorNode; struct UI_BorderColorNode{UI_BorderColorNode *next; Vec4F32 v;}; +typedef struct UI_SquishNode UI_SquishNode; struct UI_SquishNode{UI_SquishNode *next; F32 v;}; +typedef struct UI_HoverCursorNode UI_HoverCursorNode; struct UI_HoverCursorNode{UI_HoverCursorNode *next; WM_Cursor v;}; +typedef struct UI_FontNode UI_FontNode; struct UI_FontNode{UI_FontNode *next; FNT_Tag v;}; +typedef struct UI_FontSizeNode UI_FontSizeNode; struct UI_FontSizeNode{UI_FontSizeNode *next; F32 v;}; +typedef struct UI_TextRasterFlagsNode UI_TextRasterFlagsNode; struct UI_TextRasterFlagsNode{UI_TextRasterFlagsNode *next; FNT_RasterFlags v;}; +typedef struct UI_TabSizeNode UI_TabSizeNode; struct UI_TabSizeNode{UI_TabSizeNode *next; F32 v;}; +typedef struct UI_CornerRadius00Node UI_CornerRadius00Node; struct UI_CornerRadius00Node{UI_CornerRadius00Node *next; F32 v;}; +typedef struct UI_CornerRadius01Node UI_CornerRadius01Node; struct UI_CornerRadius01Node{UI_CornerRadius01Node *next; F32 v;}; +typedef struct UI_CornerRadius10Node UI_CornerRadius10Node; struct UI_CornerRadius10Node{UI_CornerRadius10Node *next; F32 v;}; +typedef struct UI_CornerRadius11Node UI_CornerRadius11Node; struct UI_CornerRadius11Node{UI_CornerRadius11Node *next; F32 v;}; +typedef struct UI_BlurSizeNode UI_BlurSizeNode; struct UI_BlurSizeNode{UI_BlurSizeNode *next; F32 v;}; +typedef struct UI_TextPaddingNode UI_TextPaddingNode; struct UI_TextPaddingNode{UI_TextPaddingNode *next; F32 v;}; +typedef struct UI_TextAlignmentNode UI_TextAlignmentNode; struct UI_TextAlignmentNode{UI_TextAlignmentNode *next; UI_TextAlign v;}; +#define UI_DeclStackNils \ +struct\ +{\ +UI_ParentNode parent_nil_stack_top;\ +UI_ChildLayoutAxisNode child_layout_axis_nil_stack_top;\ +UI_FixedXNode fixed_x_nil_stack_top;\ +UI_FixedYNode fixed_y_nil_stack_top;\ +UI_FixedWidthNode fixed_width_nil_stack_top;\ +UI_FixedHeightNode fixed_height_nil_stack_top;\ +UI_PrefWidthNode pref_width_nil_stack_top;\ +UI_PrefHeightNode pref_height_nil_stack_top;\ +UI_MinWidthNode min_width_nil_stack_top;\ +UI_MinHeightNode min_height_nil_stack_top;\ +UI_PermissionFlagsNode permission_flags_nil_stack_top;\ +UI_FlagsNode flags_nil_stack_top;\ +UI_OmitFlagsNode omit_flags_nil_stack_top;\ +UI_FocusHotNode focus_hot_nil_stack_top;\ +UI_FocusActiveNode focus_active_nil_stack_top;\ +UI_FastpathCodepointNode fastpath_codepoint_nil_stack_top;\ +UI_GroupKeyNode group_key_nil_stack_top;\ +UI_TransparencyNode transparency_nil_stack_top;\ +UI_TagNode tag_nil_stack_top;\ +UI_BackgroundColorNode background_color_nil_stack_top;\ +UI_TextColorNode text_color_nil_stack_top;\ +UI_BorderColorNode border_color_nil_stack_top;\ +UI_SquishNode squish_nil_stack_top;\ +UI_HoverCursorNode hover_cursor_nil_stack_top;\ +UI_FontNode font_nil_stack_top;\ +UI_FontSizeNode font_size_nil_stack_top;\ +UI_TextRasterFlagsNode text_raster_flags_nil_stack_top;\ +UI_TabSizeNode tab_size_nil_stack_top;\ +UI_CornerRadius00Node corner_radius_00_nil_stack_top;\ +UI_CornerRadius01Node corner_radius_01_nil_stack_top;\ +UI_CornerRadius10Node corner_radius_10_nil_stack_top;\ +UI_CornerRadius11Node corner_radius_11_nil_stack_top;\ +UI_BlurSizeNode blur_size_nil_stack_top;\ +UI_TextPaddingNode text_padding_nil_stack_top;\ +UI_TextAlignmentNode text_alignment_nil_stack_top;\ +} +#define UI_InitStackNils(state) \ +state->parent_nil_stack_top.v = &ui_nil_box;\ +state->child_layout_axis_nil_stack_top.v = Axis2_X;\ +state->fixed_x_nil_stack_top.v = 0;\ +state->fixed_y_nil_stack_top.v = 0;\ +state->fixed_width_nil_stack_top.v = 0;\ +state->fixed_height_nil_stack_top.v = 0;\ +state->pref_width_nil_stack_top.v = ui_px(250.f, 1.f);\ +state->pref_height_nil_stack_top.v = ui_px(30.f, 1.f);\ +state->min_width_nil_stack_top.v = 0;\ +state->min_height_nil_stack_top.v = 0;\ +state->permission_flags_nil_stack_top.v = UI_PermissionFlag_All;\ +state->flags_nil_stack_top.v = 0;\ +state->omit_flags_nil_stack_top.v = 0;\ +state->focus_hot_nil_stack_top.v = UI_FocusKind_Null;\ +state->focus_active_nil_stack_top.v = UI_FocusKind_Null;\ +state->fastpath_codepoint_nil_stack_top.v = 0;\ +state->group_key_nil_stack_top.v = ui_key_zero();\ +state->transparency_nil_stack_top.v = 0;\ +state->tag_nil_stack_top.v = str8_lit("");\ +state->background_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ +state->text_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ +state->border_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\ +state->squish_nil_stack_top.v = 0;\ +state->hover_cursor_nil_stack_top.v = WM_Cursor_Pointer;\ +state->font_nil_stack_top.v = fnt_tag_zero();\ +state->font_size_nil_stack_top.v = 24.f;\ +state->text_raster_flags_nil_stack_top.v = FNT_RasterFlag_Hinted;\ +state->tab_size_nil_stack_top.v = 24.f*4.f;\ +state->corner_radius_00_nil_stack_top.v = 0;\ +state->corner_radius_01_nil_stack_top.v = 0;\ +state->corner_radius_10_nil_stack_top.v = 0;\ +state->corner_radius_11_nil_stack_top.v = 0;\ +state->blur_size_nil_stack_top.v = 0;\ +state->text_padding_nil_stack_top.v = 0;\ +state->text_alignment_nil_stack_top.v = UI_TextAlign_Left;\ + +#define UI_DeclStacks \ +struct\ +{\ +struct { UI_ParentNode *top; UI_Box * bottom_val; UI_ParentNode *free; U64 gen; B32 auto_pop; } parent_stack;\ +struct { UI_ChildLayoutAxisNode *top; Axis2 bottom_val; UI_ChildLayoutAxisNode *free; U64 gen; B32 auto_pop; } child_layout_axis_stack;\ +struct { UI_FixedXNode *top; F32 bottom_val; UI_FixedXNode *free; U64 gen; B32 auto_pop; } fixed_x_stack;\ +struct { UI_FixedYNode *top; F32 bottom_val; UI_FixedYNode *free; U64 gen; B32 auto_pop; } fixed_y_stack;\ +struct { UI_FixedWidthNode *top; F32 bottom_val; UI_FixedWidthNode *free; U64 gen; B32 auto_pop; } fixed_width_stack;\ +struct { UI_FixedHeightNode *top; F32 bottom_val; UI_FixedHeightNode *free; U64 gen; B32 auto_pop; } fixed_height_stack;\ +struct { UI_PrefWidthNode *top; UI_Size bottom_val; UI_PrefWidthNode *free; U64 gen; B32 auto_pop; } pref_width_stack;\ +struct { UI_PrefHeightNode *top; UI_Size bottom_val; UI_PrefHeightNode *free; U64 gen; B32 auto_pop; } pref_height_stack;\ +struct { UI_MinWidthNode *top; F32 bottom_val; UI_MinWidthNode *free; U64 gen; B32 auto_pop; } min_width_stack;\ +struct { UI_MinHeightNode *top; F32 bottom_val; UI_MinHeightNode *free; U64 gen; B32 auto_pop; } min_height_stack;\ +struct { UI_PermissionFlagsNode *top; UI_PermissionFlags bottom_val; UI_PermissionFlagsNode *free; U64 gen; B32 auto_pop; } permission_flags_stack;\ +struct { UI_FlagsNode *top; UI_BoxFlags bottom_val; UI_FlagsNode *free; U64 gen; B32 auto_pop; } flags_stack;\ +struct { UI_OmitFlagsNode *top; UI_BoxFlags bottom_val; UI_OmitFlagsNode *free; U64 gen; B32 auto_pop; } omit_flags_stack;\ +struct { UI_FocusHotNode *top; UI_FocusKind bottom_val; UI_FocusHotNode *free; U64 gen; B32 auto_pop; } focus_hot_stack;\ +struct { UI_FocusActiveNode *top; UI_FocusKind bottom_val; UI_FocusActiveNode *free; U64 gen; B32 auto_pop; } focus_active_stack;\ +struct { UI_FastpathCodepointNode *top; U32 bottom_val; UI_FastpathCodepointNode *free; U64 gen; B32 auto_pop; } fastpath_codepoint_stack;\ +struct { UI_GroupKeyNode *top; UI_Key bottom_val; UI_GroupKeyNode *free; U64 gen; B32 auto_pop; } group_key_stack;\ +struct { UI_TransparencyNode *top; F32 bottom_val; UI_TransparencyNode *free; U64 gen; B32 auto_pop; } transparency_stack;\ +struct { UI_TagNode *top; String8 bottom_val; UI_TagNode *free; U64 gen; B32 auto_pop; } tag_stack;\ +struct { UI_BackgroundColorNode *top; Vec4F32 bottom_val; UI_BackgroundColorNode *free; U64 gen; B32 auto_pop; } background_color_stack;\ +struct { UI_TextColorNode *top; Vec4F32 bottom_val; UI_TextColorNode *free; U64 gen; B32 auto_pop; } text_color_stack;\ +struct { UI_BorderColorNode *top; Vec4F32 bottom_val; UI_BorderColorNode *free; U64 gen; B32 auto_pop; } border_color_stack;\ +struct { UI_SquishNode *top; F32 bottom_val; UI_SquishNode *free; U64 gen; B32 auto_pop; } squish_stack;\ +struct { UI_HoverCursorNode *top; WM_Cursor bottom_val; UI_HoverCursorNode *free; U64 gen; B32 auto_pop; } hover_cursor_stack;\ +struct { UI_FontNode *top; FNT_Tag bottom_val; UI_FontNode *free; U64 gen; B32 auto_pop; } font_stack;\ +struct { UI_FontSizeNode *top; F32 bottom_val; UI_FontSizeNode *free; U64 gen; B32 auto_pop; } font_size_stack;\ +struct { UI_TextRasterFlagsNode *top; FNT_RasterFlags bottom_val; UI_TextRasterFlagsNode *free; U64 gen; B32 auto_pop; } text_raster_flags_stack;\ +struct { UI_TabSizeNode *top; F32 bottom_val; UI_TabSizeNode *free; U64 gen; B32 auto_pop; } tab_size_stack;\ +struct { UI_CornerRadius00Node *top; F32 bottom_val; UI_CornerRadius00Node *free; U64 gen; B32 auto_pop; } corner_radius_00_stack;\ +struct { UI_CornerRadius01Node *top; F32 bottom_val; UI_CornerRadius01Node *free; U64 gen; B32 auto_pop; } corner_radius_01_stack;\ +struct { UI_CornerRadius10Node *top; F32 bottom_val; UI_CornerRadius10Node *free; U64 gen; B32 auto_pop; } corner_radius_10_stack;\ +struct { UI_CornerRadius11Node *top; F32 bottom_val; UI_CornerRadius11Node *free; U64 gen; B32 auto_pop; } corner_radius_11_stack;\ +struct { UI_BlurSizeNode *top; F32 bottom_val; UI_BlurSizeNode *free; U64 gen; B32 auto_pop; } blur_size_stack;\ +struct { UI_TextPaddingNode *top; F32 bottom_val; UI_TextPaddingNode *free; U64 gen; B32 auto_pop; } text_padding_stack;\ +struct { UI_TextAlignmentNode *top; UI_TextAlign bottom_val; UI_TextAlignmentNode *free; U64 gen; B32 auto_pop; } text_alignment_stack;\ +} +#define UI_InitStacks(state) \ +state->parent_stack.top = &state->parent_nil_stack_top; state->parent_stack.bottom_val = &ui_nil_box; state->parent_stack.free = 0; state->parent_stack.auto_pop = 0;\ +state->child_layout_axis_stack.top = &state->child_layout_axis_nil_stack_top; state->child_layout_axis_stack.bottom_val = Axis2_X; state->child_layout_axis_stack.free = 0; state->child_layout_axis_stack.auto_pop = 0;\ +state->fixed_x_stack.top = &state->fixed_x_nil_stack_top; state->fixed_x_stack.bottom_val = 0; state->fixed_x_stack.free = 0; state->fixed_x_stack.auto_pop = 0;\ +state->fixed_y_stack.top = &state->fixed_y_nil_stack_top; state->fixed_y_stack.bottom_val = 0; state->fixed_y_stack.free = 0; state->fixed_y_stack.auto_pop = 0;\ +state->fixed_width_stack.top = &state->fixed_width_nil_stack_top; state->fixed_width_stack.bottom_val = 0; state->fixed_width_stack.free = 0; state->fixed_width_stack.auto_pop = 0;\ +state->fixed_height_stack.top = &state->fixed_height_nil_stack_top; state->fixed_height_stack.bottom_val = 0; state->fixed_height_stack.free = 0; state->fixed_height_stack.auto_pop = 0;\ +state->pref_width_stack.top = &state->pref_width_nil_stack_top; state->pref_width_stack.bottom_val = ui_px(250.f, 1.f); state->pref_width_stack.free = 0; state->pref_width_stack.auto_pop = 0;\ +state->pref_height_stack.top = &state->pref_height_nil_stack_top; state->pref_height_stack.bottom_val = ui_px(30.f, 1.f); state->pref_height_stack.free = 0; state->pref_height_stack.auto_pop = 0;\ +state->min_width_stack.top = &state->min_width_nil_stack_top; state->min_width_stack.bottom_val = 0; state->min_width_stack.free = 0; state->min_width_stack.auto_pop = 0;\ +state->min_height_stack.top = &state->min_height_nil_stack_top; state->min_height_stack.bottom_val = 0; state->min_height_stack.free = 0; state->min_height_stack.auto_pop = 0;\ +state->permission_flags_stack.top = &state->permission_flags_nil_stack_top; state->permission_flags_stack.bottom_val = UI_PermissionFlag_All; state->permission_flags_stack.free = 0; state->permission_flags_stack.auto_pop = 0;\ +state->flags_stack.top = &state->flags_nil_stack_top; state->flags_stack.bottom_val = 0; state->flags_stack.free = 0; state->flags_stack.auto_pop = 0;\ +state->omit_flags_stack.top = &state->omit_flags_nil_stack_top; state->omit_flags_stack.bottom_val = 0; state->omit_flags_stack.free = 0; state->omit_flags_stack.auto_pop = 0;\ +state->focus_hot_stack.top = &state->focus_hot_nil_stack_top; state->focus_hot_stack.bottom_val = UI_FocusKind_Null; state->focus_hot_stack.free = 0; state->focus_hot_stack.auto_pop = 0;\ +state->focus_active_stack.top = &state->focus_active_nil_stack_top; state->focus_active_stack.bottom_val = UI_FocusKind_Null; state->focus_active_stack.free = 0; state->focus_active_stack.auto_pop = 0;\ +state->fastpath_codepoint_stack.top = &state->fastpath_codepoint_nil_stack_top; state->fastpath_codepoint_stack.bottom_val = 0; state->fastpath_codepoint_stack.free = 0; state->fastpath_codepoint_stack.auto_pop = 0;\ +state->group_key_stack.top = &state->group_key_nil_stack_top; state->group_key_stack.bottom_val = ui_key_zero(); state->group_key_stack.free = 0; state->group_key_stack.auto_pop = 0;\ +state->transparency_stack.top = &state->transparency_nil_stack_top; state->transparency_stack.bottom_val = 0; state->transparency_stack.free = 0; state->transparency_stack.auto_pop = 0;\ +state->tag_stack.top = &state->tag_nil_stack_top; state->tag_stack.bottom_val = str8_lit(""); state->tag_stack.free = 0; state->tag_stack.auto_pop = 0;\ +state->background_color_stack.top = &state->background_color_nil_stack_top; state->background_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->background_color_stack.free = 0; state->background_color_stack.auto_pop = 0;\ +state->text_color_stack.top = &state->text_color_nil_stack_top; state->text_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->text_color_stack.free = 0; state->text_color_stack.auto_pop = 0;\ +state->border_color_stack.top = &state->border_color_nil_stack_top; state->border_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->border_color_stack.free = 0; state->border_color_stack.auto_pop = 0;\ +state->squish_stack.top = &state->squish_nil_stack_top; state->squish_stack.bottom_val = 0; state->squish_stack.free = 0; state->squish_stack.auto_pop = 0;\ +state->hover_cursor_stack.top = &state->hover_cursor_nil_stack_top; state->hover_cursor_stack.bottom_val = WM_Cursor_Pointer; state->hover_cursor_stack.free = 0; state->hover_cursor_stack.auto_pop = 0;\ +state->font_stack.top = &state->font_nil_stack_top; state->font_stack.bottom_val = fnt_tag_zero(); state->font_stack.free = 0; state->font_stack.auto_pop = 0;\ +state->font_size_stack.top = &state->font_size_nil_stack_top; state->font_size_stack.bottom_val = 24.f; state->font_size_stack.free = 0; state->font_size_stack.auto_pop = 0;\ +state->text_raster_flags_stack.top = &state->text_raster_flags_nil_stack_top; state->text_raster_flags_stack.bottom_val = FNT_RasterFlag_Hinted; state->text_raster_flags_stack.free = 0; state->text_raster_flags_stack.auto_pop = 0;\ +state->tab_size_stack.top = &state->tab_size_nil_stack_top; state->tab_size_stack.bottom_val = 24.f*4.f; state->tab_size_stack.free = 0; state->tab_size_stack.auto_pop = 0;\ +state->corner_radius_00_stack.top = &state->corner_radius_00_nil_stack_top; state->corner_radius_00_stack.bottom_val = 0; state->corner_radius_00_stack.free = 0; state->corner_radius_00_stack.auto_pop = 0;\ +state->corner_radius_01_stack.top = &state->corner_radius_01_nil_stack_top; state->corner_radius_01_stack.bottom_val = 0; state->corner_radius_01_stack.free = 0; state->corner_radius_01_stack.auto_pop = 0;\ +state->corner_radius_10_stack.top = &state->corner_radius_10_nil_stack_top; state->corner_radius_10_stack.bottom_val = 0; state->corner_radius_10_stack.free = 0; state->corner_radius_10_stack.auto_pop = 0;\ +state->corner_radius_11_stack.top = &state->corner_radius_11_nil_stack_top; state->corner_radius_11_stack.bottom_val = 0; state->corner_radius_11_stack.free = 0; state->corner_radius_11_stack.auto_pop = 0;\ +state->blur_size_stack.top = &state->blur_size_nil_stack_top; state->blur_size_stack.bottom_val = 0; state->blur_size_stack.free = 0; state->blur_size_stack.auto_pop = 0;\ +state->text_padding_stack.top = &state->text_padding_nil_stack_top; state->text_padding_stack.bottom_val = 0; state->text_padding_stack.free = 0; state->text_padding_stack.auto_pop = 0;\ +state->text_alignment_stack.top = &state->text_alignment_nil_stack_top; state->text_alignment_stack.bottom_val = UI_TextAlign_Left; state->text_alignment_stack.free = 0; state->text_alignment_stack.auto_pop = 0;\ + +#define UI_AutoPopStacks(state) \ +if(state->parent_stack.auto_pop) { ui_pop_parent(); state->parent_stack.auto_pop = 0; }\ +if(state->child_layout_axis_stack.auto_pop) { ui_pop_child_layout_axis(); state->child_layout_axis_stack.auto_pop = 0; }\ +if(state->fixed_x_stack.auto_pop) { ui_pop_fixed_x(); state->fixed_x_stack.auto_pop = 0; }\ +if(state->fixed_y_stack.auto_pop) { ui_pop_fixed_y(); state->fixed_y_stack.auto_pop = 0; }\ +if(state->fixed_width_stack.auto_pop) { ui_pop_fixed_width(); state->fixed_width_stack.auto_pop = 0; }\ +if(state->fixed_height_stack.auto_pop) { ui_pop_fixed_height(); state->fixed_height_stack.auto_pop = 0; }\ +if(state->pref_width_stack.auto_pop) { ui_pop_pref_width(); state->pref_width_stack.auto_pop = 0; }\ +if(state->pref_height_stack.auto_pop) { ui_pop_pref_height(); state->pref_height_stack.auto_pop = 0; }\ +if(state->min_width_stack.auto_pop) { ui_pop_min_width(); state->min_width_stack.auto_pop = 0; }\ +if(state->min_height_stack.auto_pop) { ui_pop_min_height(); state->min_height_stack.auto_pop = 0; }\ +if(state->permission_flags_stack.auto_pop) { ui_pop_permission_flags(); state->permission_flags_stack.auto_pop = 0; }\ +if(state->flags_stack.auto_pop) { ui_pop_flags(); state->flags_stack.auto_pop = 0; }\ +if(state->omit_flags_stack.auto_pop) { ui_pop_omit_flags(); state->omit_flags_stack.auto_pop = 0; }\ +if(state->focus_hot_stack.auto_pop) { ui_pop_focus_hot(); state->focus_hot_stack.auto_pop = 0; }\ +if(state->focus_active_stack.auto_pop) { ui_pop_focus_active(); state->focus_active_stack.auto_pop = 0; }\ +if(state->fastpath_codepoint_stack.auto_pop) { ui_pop_fastpath_codepoint(); state->fastpath_codepoint_stack.auto_pop = 0; }\ +if(state->group_key_stack.auto_pop) { ui_pop_group_key(); state->group_key_stack.auto_pop = 0; }\ +if(state->transparency_stack.auto_pop) { ui_pop_transparency(); state->transparency_stack.auto_pop = 0; }\ +if(state->tag_stack.auto_pop) { ui_pop_tag(); state->tag_stack.auto_pop = 0; }\ +if(state->background_color_stack.auto_pop) { ui_pop_background_color(); state->background_color_stack.auto_pop = 0; }\ +if(state->text_color_stack.auto_pop) { ui_pop_text_color(); state->text_color_stack.auto_pop = 0; }\ +if(state->border_color_stack.auto_pop) { ui_pop_border_color(); state->border_color_stack.auto_pop = 0; }\ +if(state->squish_stack.auto_pop) { ui_pop_squish(); state->squish_stack.auto_pop = 0; }\ +if(state->hover_cursor_stack.auto_pop) { ui_pop_hover_cursor(); state->hover_cursor_stack.auto_pop = 0; }\ +if(state->font_stack.auto_pop) { ui_pop_font(); state->font_stack.auto_pop = 0; }\ +if(state->font_size_stack.auto_pop) { ui_pop_font_size(); state->font_size_stack.auto_pop = 0; }\ +if(state->text_raster_flags_stack.auto_pop) { ui_pop_text_raster_flags(); state->text_raster_flags_stack.auto_pop = 0; }\ +if(state->tab_size_stack.auto_pop) { ui_pop_tab_size(); state->tab_size_stack.auto_pop = 0; }\ +if(state->corner_radius_00_stack.auto_pop) { ui_pop_corner_radius_00(); state->corner_radius_00_stack.auto_pop = 0; }\ +if(state->corner_radius_01_stack.auto_pop) { ui_pop_corner_radius_01(); state->corner_radius_01_stack.auto_pop = 0; }\ +if(state->corner_radius_10_stack.auto_pop) { ui_pop_corner_radius_10(); state->corner_radius_10_stack.auto_pop = 0; }\ +if(state->corner_radius_11_stack.auto_pop) { ui_pop_corner_radius_11(); state->corner_radius_11_stack.auto_pop = 0; }\ +if(state->blur_size_stack.auto_pop) { ui_pop_blur_size(); state->blur_size_stack.auto_pop = 0; }\ +if(state->text_padding_stack.auto_pop) { ui_pop_text_padding(); state->text_padding_stack.auto_pop = 0; }\ +if(state->text_alignment_stack.auto_pop) { ui_pop_text_alignment(); state->text_alignment_stack.auto_pop = 0; }\ + +internal UI_Box * ui_top_parent(void); +internal Axis2 ui_top_child_layout_axis(void); +internal F32 ui_top_fixed_x(void); +internal F32 ui_top_fixed_y(void); +internal F32 ui_top_fixed_width(void); +internal F32 ui_top_fixed_height(void); +internal UI_Size ui_top_pref_width(void); +internal UI_Size ui_top_pref_height(void); +internal F32 ui_top_min_width(void); +internal F32 ui_top_min_height(void); +internal UI_PermissionFlags ui_top_permission_flags(void); +internal UI_BoxFlags ui_top_flags(void); +internal UI_BoxFlags ui_top_omit_flags(void); +internal UI_FocusKind ui_top_focus_hot(void); +internal UI_FocusKind ui_top_focus_active(void); +internal U32 ui_top_fastpath_codepoint(void); +internal UI_Key ui_top_group_key(void); +internal F32 ui_top_transparency(void); +internal String8 ui_top_tag(void); +internal Vec4F32 ui_top_background_color(void); +internal Vec4F32 ui_top_text_color(void); +internal Vec4F32 ui_top_border_color(void); +internal F32 ui_top_squish(void); +internal WM_Cursor ui_top_hover_cursor(void); +internal FNT_Tag ui_top_font(void); +internal F32 ui_top_font_size(void); +internal FNT_RasterFlags ui_top_text_raster_flags(void); +internal F32 ui_top_tab_size(void); +internal F32 ui_top_corner_radius_00(void); +internal F32 ui_top_corner_radius_01(void); +internal F32 ui_top_corner_radius_10(void); +internal F32 ui_top_corner_radius_11(void); +internal F32 ui_top_blur_size(void); +internal F32 ui_top_text_padding(void); +internal UI_TextAlign ui_top_text_alignment(void); +internal UI_Box * ui_bottom_parent(void); +internal Axis2 ui_bottom_child_layout_axis(void); +internal F32 ui_bottom_fixed_x(void); +internal F32 ui_bottom_fixed_y(void); +internal F32 ui_bottom_fixed_width(void); +internal F32 ui_bottom_fixed_height(void); +internal UI_Size ui_bottom_pref_width(void); +internal UI_Size ui_bottom_pref_height(void); +internal F32 ui_bottom_min_width(void); +internal F32 ui_bottom_min_height(void); +internal UI_PermissionFlags ui_bottom_permission_flags(void); +internal UI_BoxFlags ui_bottom_flags(void); +internal UI_BoxFlags ui_bottom_omit_flags(void); +internal UI_FocusKind ui_bottom_focus_hot(void); +internal UI_FocusKind ui_bottom_focus_active(void); +internal U32 ui_bottom_fastpath_codepoint(void); +internal UI_Key ui_bottom_group_key(void); +internal F32 ui_bottom_transparency(void); +internal String8 ui_bottom_tag(void); +internal Vec4F32 ui_bottom_background_color(void); +internal Vec4F32 ui_bottom_text_color(void); +internal Vec4F32 ui_bottom_border_color(void); +internal F32 ui_bottom_squish(void); +internal WM_Cursor ui_bottom_hover_cursor(void); +internal FNT_Tag ui_bottom_font(void); +internal F32 ui_bottom_font_size(void); +internal FNT_RasterFlags ui_bottom_text_raster_flags(void); +internal F32 ui_bottom_tab_size(void); +internal F32 ui_bottom_corner_radius_00(void); +internal F32 ui_bottom_corner_radius_01(void); +internal F32 ui_bottom_corner_radius_10(void); +internal F32 ui_bottom_corner_radius_11(void); +internal F32 ui_bottom_blur_size(void); +internal F32 ui_bottom_text_padding(void); +internal UI_TextAlign ui_bottom_text_alignment(void); +internal UI_Box * ui_push_parent(UI_Box * v); +internal Axis2 ui_push_child_layout_axis(Axis2 v); +internal F32 ui_push_fixed_x(F32 v); +internal F32 ui_push_fixed_y(F32 v); +internal F32 ui_push_fixed_width(F32 v); +internal F32 ui_push_fixed_height(F32 v); +internal UI_Size ui_push_pref_width(UI_Size v); +internal UI_Size ui_push_pref_height(UI_Size v); +internal F32 ui_push_min_width(F32 v); +internal F32 ui_push_min_height(F32 v); +internal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v); +internal UI_BoxFlags ui_push_flags(UI_BoxFlags v); +internal UI_BoxFlags ui_push_omit_flags(UI_BoxFlags v); +internal UI_FocusKind ui_push_focus_hot(UI_FocusKind v); +internal UI_FocusKind ui_push_focus_active(UI_FocusKind v); +internal U32 ui_push_fastpath_codepoint(U32 v); +internal UI_Key ui_push_group_key(UI_Key v); +internal F32 ui_push_transparency(F32 v); +internal String8 ui_push_tag(String8 v); +internal Vec4F32 ui_push_background_color(Vec4F32 v); +internal Vec4F32 ui_push_text_color(Vec4F32 v); +internal Vec4F32 ui_push_border_color(Vec4F32 v); +internal F32 ui_push_squish(F32 v); +internal WM_Cursor ui_push_hover_cursor(WM_Cursor v); +internal FNT_Tag ui_push_font(FNT_Tag v); +internal F32 ui_push_font_size(F32 v); +internal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v); +internal F32 ui_push_tab_size(F32 v); +internal F32 ui_push_corner_radius_00(F32 v); +internal F32 ui_push_corner_radius_01(F32 v); +internal F32 ui_push_corner_radius_10(F32 v); +internal F32 ui_push_corner_radius_11(F32 v); +internal F32 ui_push_blur_size(F32 v); +internal F32 ui_push_text_padding(F32 v); +internal UI_TextAlign ui_push_text_alignment(UI_TextAlign v); +internal UI_Box * ui_pop_parent(void); +internal Axis2 ui_pop_child_layout_axis(void); +internal F32 ui_pop_fixed_x(void); +internal F32 ui_pop_fixed_y(void); +internal F32 ui_pop_fixed_width(void); +internal F32 ui_pop_fixed_height(void); +internal UI_Size ui_pop_pref_width(void); +internal UI_Size ui_pop_pref_height(void); +internal F32 ui_pop_min_width(void); +internal F32 ui_pop_min_height(void); +internal UI_PermissionFlags ui_pop_permission_flags(void); +internal UI_BoxFlags ui_pop_flags(void); +internal UI_BoxFlags ui_pop_omit_flags(void); +internal UI_FocusKind ui_pop_focus_hot(void); +internal UI_FocusKind ui_pop_focus_active(void); +internal U32 ui_pop_fastpath_codepoint(void); +internal UI_Key ui_pop_group_key(void); +internal F32 ui_pop_transparency(void); +internal String8 ui_pop_tag(void); +internal Vec4F32 ui_pop_background_color(void); +internal Vec4F32 ui_pop_text_color(void); +internal Vec4F32 ui_pop_border_color(void); +internal F32 ui_pop_squish(void); +internal WM_Cursor ui_pop_hover_cursor(void); +internal FNT_Tag ui_pop_font(void); +internal F32 ui_pop_font_size(void); +internal FNT_RasterFlags ui_pop_text_raster_flags(void); +internal F32 ui_pop_tab_size(void); +internal F32 ui_pop_corner_radius_00(void); +internal F32 ui_pop_corner_radius_01(void); +internal F32 ui_pop_corner_radius_10(void); +internal F32 ui_pop_corner_radius_11(void); +internal F32 ui_pop_blur_size(void); +internal F32 ui_pop_text_padding(void); +internal UI_TextAlign ui_pop_text_alignment(void); +internal UI_Box * ui_set_next_parent(UI_Box * v); +internal Axis2 ui_set_next_child_layout_axis(Axis2 v); +internal F32 ui_set_next_fixed_x(F32 v); +internal F32 ui_set_next_fixed_y(F32 v); +internal F32 ui_set_next_fixed_width(F32 v); +internal F32 ui_set_next_fixed_height(F32 v); +internal UI_Size ui_set_next_pref_width(UI_Size v); +internal UI_Size ui_set_next_pref_height(UI_Size v); +internal F32 ui_set_next_min_width(F32 v); +internal F32 ui_set_next_min_height(F32 v); +internal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v); +internal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v); +internal UI_BoxFlags ui_set_next_omit_flags(UI_BoxFlags v); +internal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v); +internal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v); +internal U32 ui_set_next_fastpath_codepoint(U32 v); +internal UI_Key ui_set_next_group_key(UI_Key v); +internal F32 ui_set_next_transparency(F32 v); +internal String8 ui_set_next_tag(String8 v); +internal Vec4F32 ui_set_next_background_color(Vec4F32 v); +internal Vec4F32 ui_set_next_text_color(Vec4F32 v); +internal Vec4F32 ui_set_next_border_color(Vec4F32 v); +internal F32 ui_set_next_squish(F32 v); +internal WM_Cursor ui_set_next_hover_cursor(WM_Cursor v); +internal FNT_Tag ui_set_next_font(FNT_Tag v); +internal F32 ui_set_next_font_size(F32 v); +internal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v); +internal F32 ui_set_next_tab_size(F32 v); +internal F32 ui_set_next_corner_radius_00(F32 v); +internal F32 ui_set_next_corner_radius_01(F32 v); +internal F32 ui_set_next_corner_radius_10(F32 v); +internal F32 ui_set_next_corner_radius_11(F32 v); +internal F32 ui_set_next_blur_size(F32 v); +internal F32 ui_set_next_text_padding(F32 v); +internal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v); +#endif // UI_META_H From cc93bf44390310cd72fae27ecbda9e29cde755ac Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 12 May 2026 18:30:19 -0700 Subject: [PATCH 657/850] mismatched type on 'blur_count' --- src/render/opengl/generated/render_opengl.meta.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index b59412d9..bedacd71 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -190,7 +190,7 @@ str8_lit_comp( "uniform vec4 rect;\n" "uniform vec4 corner_radii_px;\n" "uniform vec2 viewport_size;\n" -"uniform uint blur_count;\n" +"uniform int blur_count;\n" "\n" "out vec2 texcoord;\n" "out vec2 sdf_sample_pos;\n" From 19cee2d6467154ae0e28494ce5781ca0382beb15 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 13 May 2026 00:25:52 -0700 Subject: [PATCH 658/850] todo --- .../window_manager/linux_window_manager.c | 12 +- src/torture/torture_radlink.c | 168 +++++++++--------- 2 files changed, 95 insertions(+), 85 deletions(-) diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index 2edcfc3b..2c54fce6 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -201,7 +201,17 @@ wm_window_focus(WM_Window handle) { if(wm_window_match(handle, wm_window_zero())) {return;} LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; - XSetInputFocus(lnx_wm_state->display, w->window, RevertToNone, CurrentTime); + // + // TODO: if the target is lightweight, the debugger may launch it even before the first frame is drawn; + // this is a problem because XSetInputFocus is now called before XMapWindow, we need a guard + // to prevent an X server error: + // + // X Error of failed request: BadMatch (invalid parameter attributes) + // Major opcode of failed request: 42 (X_SetInputFocus) + // Serial number of failed request: 373 + // Current serial number in output stream: 374 + // + XSetInputFocus(os_lnx_gfx_state->display, w->window, RevertToNone, CurrentTime); } internal B32 diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index a53ba3b8..b4e0e97b 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -4396,90 +4396,6 @@ TEST(second_member_header) T_Ok(g_last_exit_code == 0); } -#if 0 -TEST(defer_imp_link) -{ - T_COFF_DefLib bar_lib_any = { - .members = (T_COFF_DefLibMember[]){ - { - .type = T_COFF_DefLibMember_DllImportStatic, - .dll_import = { .name = "bar.dll" } - }, - { - .type = T_COFF_DefLibMember_Import, - .import = { "bar.dll", "bar", COFF_ImportBy_Name, COFF_ImportHeader_Code, .hit_or_ordinal = 0 } - }, - { - .type = T_COFF_DefLibMember_Obj, - .obj = { - .machine = T_COFF_DefSetMachine(X64), - .sections = (T_COFF_DefSection[]){ - { - "text", ".text", str8_lit_comp("\xff\x25\x00\x00\x00\x00"), .flags = "rx:code" - }, - {0} - }, - .symbols = (T_COFF_DefSymbol[]){ - T_COFF_DefSymbol_Undef("__imp_bar"), - T_COFF_DefSymbol_ExternFunc("qwe", "text", 0), - {0}, - } - } - }, - {0} - } - }; - - T_COFF_DefLib foo_lib_any = { - .members = (T_COFF_DefLibMember[]){ - { - .type = T_COFF_DefLibMember_DllImportStatic, - .dll_import = { .name = "foo.dll" } - }, - { - .type = T_COFF_DefLibMember_Import, - .import = { "foo.dll", "bar", COFF_ImportBy_Name, COFF_ImportHeader_Code, .hit_or_ordinal = 0 } - }, - { - .type = T_COFF_DefLibMember_Obj, - .obj = { - .machine = T_COFF_DefSetMachine(X64), - .sections = (T_COFF_DefSection[]){ - { - "text", ".text", - str8_lit_comp("\xff\x25\x00\x00\x00\x00"), - .flags = "rx:code", - .relocs = (T_COFF_DefReloc[]){ - T_COFF_DefReloc(X64_Rel32, 2, "bar"), - {0} - } - }, - {0} - }, - .symbols = (T_COFF_DefSymbol[]){ - T_COFF_DefSymbol_Undef("bar"), - T_COFF_DefSymbol_Undef("qwe"), - T_COFF_DefSymbol_ExternFunc("thunk", "text", 0), - {0}, - } - } - }, - {0} - } - }; - - String8 bar_lib = t_coff_from_def_lib(arena, bar_lib_any); - String8 foo_lib = t_coff_from_def_lib(arena, foo_lib_any); - - T_Ok(t_write_file(str8_lit("bar.lib"), bar_lib)); - T_Ok(t_write_file(str8_lit("foo.lib"), foo_lib)); - T_Ok(t_write_entry_obj()); - - t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe bar.lib foo.lib entry.obj /include:thunk"); - T_Ok(g_last_exit_code == 0); -} -#endif - TEST(defer_impl_link_to_second_search_pass) { T_Ok(t_write_def_obj("imp_ref.obj", (T_COFF_DefObj){ @@ -6996,6 +6912,90 @@ TEST(fold_with_largest_align) #endif +#if 0 +TEST(defer_imp_link) +{ + T_COFF_DefLib bar_lib_any = { + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_DllImportStatic, + .dll_import = { .name = "bar.dll" } + }, + { + .type = T_COFF_DefLibMember_Import, + .import = { "bar.dll", "bar", COFF_ImportBy_Name, COFF_ImportHeader_Code, .hit_or_ordinal = 0 } + }, + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\xff\x25\x00\x00\x00\x00"), .flags = "rx:code" + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("__imp_bar"), + T_COFF_DefSymbol_ExternFunc("qwe", "text", 0), + {0}, + } + } + }, + {0} + } + }; + + T_COFF_DefLib foo_lib_any = { + .members = (T_COFF_DefLibMember[]){ + { + .type = T_COFF_DefLibMember_DllImportStatic, + .dll_import = { .name = "foo.dll" } + }, + { + .type = T_COFF_DefLibMember_Import, + .import = { "foo.dll", "bar", COFF_ImportBy_Name, COFF_ImportHeader_Code, .hit_or_ordinal = 0 } + }, + { + .type = T_COFF_DefLibMember_Obj, + .obj = { + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", + str8_lit_comp("\xff\x25\x00\x00\x00\x00"), + .flags = "rx:code", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Rel32, 2, "bar"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Undef("bar"), + T_COFF_DefSymbol_Undef("qwe"), + T_COFF_DefSymbol_ExternFunc("thunk", "text", 0), + {0}, + } + } + }, + {0} + } + }; + + String8 bar_lib = t_coff_from_def_lib(arena, bar_lib_any); + String8 foo_lib = t_coff_from_def_lib(arena, foo_lib_any); + + T_Ok(t_write_file(str8_lit("bar.lib"), bar_lib)); + T_Ok(t_write_file(str8_lit("foo.lib"), foo_lib)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe bar.lib foo.lib entry.obj /include:thunk"); + T_Ok(g_last_exit_code == 0); +} +#endif + #if 0 TEST(reloc_apply_off_out_of_bounds) { From 31662822db30082ebc2aa4d1f27cb870d21458c6 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 14 May 2026 02:46:21 -0700 Subject: [PATCH 659/850] rebase --- src/linux/base/linux_base.c | 2 +- .../window_manager/linux_window_manager.c | 30 +++++++++++-------- src/radbin/radbin.c | 29 +++++++++--------- .../opengl/generated/render_opengl.meta.h | 1 - 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 93a4a47c..183d85e9 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1539,7 +1539,7 @@ main(int argc, char **argv) if(got_final_result && size > 0) { String8 full_name = str8(buffer, size); - info->binary_file_path = push_str8_copy(os_lnx_state.arena, full_name); + info->binary_file_path = push_str8_copy(lnx_state.arena, full_name); info->binary_path = str8_chop_last_slash(info->binary_file_path); } } diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index 2c54fce6..3787a031 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -70,8 +70,8 @@ wm_init(void) } // create wakeup event for polling - os_lnx_gfx_state->wakeup_fd = eventfd(0, EFD_CLOEXEC); - Assert(os_lnx_gfx_state->wakeup_fd > 0); + lnx_wm_state->wakeup_fd = eventfd(0, EFD_CLOEXEC); + Assert(lnx_wm_state->wakeup_fd > 0); } //////////////////////////////// @@ -211,7 +211,7 @@ wm_window_focus(WM_Window handle) // Serial number of failed request: 373 // Current serial number in output stream: 374 // - XSetInputFocus(os_lnx_gfx_state->display, w->window, RevertToNone, CurrentTime); + XSetInputFocus(lnx_wm_state->display, w->window, RevertToNone, CurrentTime); } internal B32 @@ -413,7 +413,7 @@ internal void wm_send_wakeup_event(void) { U64 dummy = 1; - ssize_t size = LNX_RETRY_ON_EINTR(write(os_lnx_gfx_state->wakeup_fd, &dummy, sizeof(dummy))); + ssize_t size = LNX_RETRY_ON_EINTR(write(lnx_wm_state->wakeup_fd, &dummy, sizeof(dummy))); Assert(size == sizeof(dummy)); } @@ -423,12 +423,12 @@ wm_get_events(Arena *arena, B32 wait) WM_EventList evts = {0}; for(;;) { - if(XPending(os_lnx_gfx_state->display) == 0) + if(XPending(lnx_wm_state->display) == 0) { struct pollfd poll_fds[2] = { - { .fd = ConnectionNumber(os_lnx_gfx_state->display), .events = POLLIN }, - { .fd = os_lnx_gfx_state->wakeup_fd, .events = POLLIN }, + { .fd = ConnectionNumber(lnx_wm_state->display), .events = POLLIN }, + { .fd = lnx_wm_state->wakeup_fd, .events = POLLIN }, }; int timeout = wait && evts.count == 0 ? -1 : 0; int poll_status = poll(poll_fds, ArrayCount(poll_fds), timeout); @@ -436,14 +436,14 @@ wm_get_events(Arena *arena, B32 wait) if(poll_fds[1].revents & POLLIN) { U64 dummy = 0; - read(os_lnx_gfx_state->wakeup_fd, &dummy, sizeof(dummy)); + read(lnx_wm_state->wakeup_fd, &dummy, sizeof(dummy)); wait = 0; } } - while(XPending(os_lnx_gfx_state->display)) + while(XPending(lnx_wm_state->display)) { XEvent evt = {0}; - XNextEvent(os_lnx_gfx_state->display, &evt); + XNextEvent(lnx_wm_state->display, &evt); B32 set_mouse_cursor = 0; switch(evt.type) { @@ -663,13 +663,17 @@ wm_get_events(Arena *arena, B32 wait) int child_rel_x = 0; int child_rel_y = 0; unsigned int mask = 0; - if(XQueryPointer(os_lnx_gfx_state->display, XDefaultRootWindow(os_lnx_gfx_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) + if(XQueryPointer(lnx_wm_state->display, XDefaultRootWindow(lnx_wm_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask)) { - XDefineCursor(os_lnx_gfx_state->display, root_window, os_lnx_gfx_state->cursors[os_lnx_gfx_state->last_set_cursor]); - XFlush(os_lnx_gfx_state->display); + XDefineCursor(lnx_wm_state->display, root_window, lnx_wm_state->cursors[lnx_wm_state->last_set_cursor]); + XFlush(lnx_wm_state->display); } } } + if(evts.count > 0 || (wait == 0 && evts.count == 0)) + { + break; + } } return evts; } diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 828dca48..74e7177b 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -697,6 +697,7 @@ rb_thread_entry_point(void *p) B32 convert_done = 0; RDIM_BakeParams pdb_bake_params = {0}; RDIM_BakeParams dwarf_bake_params = {0}; + RDIM_BakeParams dwarf_bake_params_2 = {0}; typedef struct RDIM_BakeParamsNode RDIM_BakeParamsNode; struct RDIM_BakeParamsNode { @@ -891,11 +892,11 @@ rb_thread_entry_point(void *p) String8 raw_sections = str8_substr(exe_data, pe.section_table_range); COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); String8 string_table = str8_substr(exe_data, pe.string_table_range); - convert_params.arch = pe.arch; - convert_params.base_vaddr = pe.image_base; - convert_params.raw = dw_input_from_coff_section_table(scratch.arena, exe_data, string_table, pe.section_count, section_table); - convert_params.path_style = PathStyle_WindowsAbsolute; - convert_params.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, exe_data, string_table, pe.section_count, section_table); + convert_params_2.arch = pe.arch; + convert_params_2.base_vaddr = pe.image_base; + convert_params_2.raw = dw_input_from_coff_section_table(scratch.arena, exe_data, string_table, pe.section_count, section_table); + convert_params_2.path_style = PathStyle_WindowsAbsolute; + convert_params_2.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, exe_data, string_table, pe.section_count, section_table); scratch_end(scratch); }break; case ExecutableImageKind_Elf32: @@ -903,18 +904,18 @@ rb_thread_entry_point(void *p) { Temp scratch = scratch_begin(&arena, 1); ELF_Bin bin = elf_bin_from_data(scratch.arena, dbg_data); - convert_params.arch = arch_from_elf_machine(bin.hdr.e_machine); - convert_params.base_vaddr = elf_base_addr_from_bin(&bin); - convert_params.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); - convert_params.path_style = PathStyle_UnixAbsolute; - convert_params.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); + convert_params_2.arch = arch_from_elf_machine(bin.hdr.e_machine); + convert_params_2.base_vaddr = elf_base_addr_from_bin(&bin); + convert_params_2.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); + convert_params_2.path_style = PathStyle_UnixAbsolute; + convert_params_2.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); scratch_end(scratch); }break; } - convert_params.exe_name = exe_name; - convert_params.exe_data = exe_data; - convert_params.subset_flags = subset_flags; - convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + convert_params_2.exe_name = exe_name; + convert_params_2.exe_data = exe_data; + convert_params_2.subset_flags = subset_flags; + convert_params_2.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } ProfScope("convert [2]") dwarf_bake_params_2 = d2r2_convert(arena, &convert_params_2); #else diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index bedacd71..f4851da7 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -190,7 +190,6 @@ str8_lit_comp( "uniform vec4 rect;\n" "uniform vec4 corner_radii_px;\n" "uniform vec2 viewport_size;\n" -"uniform int blur_count;\n" "\n" "out vec2 texcoord;\n" "out vec2 sdf_sample_pos;\n" From 49af8248efc83dc7a22e68b1870bd8adcae2fbc7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 15 May 2026 18:38:17 -0700 Subject: [PATCH 660/850] update tests summary --- src/base/base_strings.c | 12 +++++ src/base/base_strings.h | 1 + src/torture/torture.c | 114 +++++++++++++++++++--------------------- 3 files changed, 67 insertions(+), 60 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 32e668cb..70d538d6 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -536,6 +536,18 @@ str8_chop(String8 str, U64 amt) return str; } +internal String8 +str8_chop_line(String8 *str) +{ + U64 new_line_pos = str8_find_needle(*str, 0, str8_lit("\n"), 0); + String8 line = str8_prefix(*str, new_line_pos); + if (str8_ends_with(line, str8_lit("\r"), 0)) { + line = str8_chop(line, 1); + } + *str = str8_skip(*str, new_line_pos + 1); + return line; +} + internal String8 str8_skip_chop_whitespace(String8 string) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index b7b67787..cbe9ad53 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -217,6 +217,7 @@ internal String8 str8_prefix(String8 str, U64 size); internal String8 str8_skip(String8 str, U64 amt); internal String8 str8_postfix(String8 str, U64 size); internal String8 str8_chop(String8 str, U64 amt); +internal String8 str8_chop_line(String8 *str); internal String8 str8_skip_chop_whitespace(String8 string); internal String8 str8_skip_chop_slashes(String8 string); diff --git a/src/torture/torture.c b/src/torture/torture.c index ed66b958..754c05b4 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -844,28 +844,17 @@ t_kill_all(String8 pattern) scratch_end(scratch); } +// TODO: obsolete internal String8 -t_chop_line(String8 *output) +t_chop_line(String8 *string) { - U64 new_line_pos = str8_find_needle(*output, 0, str8_lit("\n"), 0); - String8 line = str8_prefix(*output, new_line_pos); - if (str8_ends_with(line, str8_lit("\r"), 0)) { - line = str8_chop(line, 1); - } - *output = str8_skip(*output, new_line_pos + 1); - return line; + return str8_chop_line(string); } - +// TODO: obsolete internal B32 t_match_line(String8 *output, String8 expected_line) { - String8 before_chop = *output; - String8 line = t_chop_line(output); - B32 is_match = str8_match(line, expected_line, 0); - if ( ! is_match) { - *output = before_chop; - } - return is_match; + return str8_match_wildcard(t_chop_line(output), expected_line, 0); } internal B32 @@ -1220,16 +1209,19 @@ t_entry_point(CmdLine *cmdline) max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[test_idx]->group)); } - PrintHeader("Tests"); - U64 pass_count = 0; - U64 fail_count = 0; - U64 crash_count = 0; - U64 max_digit_count = count_digits_u64(target_indices.count, 10); + U64 pass_count = 0; + U64 fail_count = 0; + U64 crash_count = 0; + U64 max_digit_count = count_digits_u64(target_indices.count, 10); U64 total_time_start = now_time_us(); + typedef struct { U64 target_idx, d; } Slowest; Slowest slowest[5] = {0}; for EachElement(i, slowest) { slowest[i].target_idx = max_U64; } + for EachIndex(i, target_indices.count) { + if (i == 0) { PrintHeader("Tests"); } + U64 target_idx = target_indices.v[i]; T_Test *test = g_torture_tests[target_idx]; @@ -1279,6 +1271,8 @@ t_entry_point(CmdLine *cmdline) DateTime t = date_time_from_micro_seconds(d); String8 s = string_from_elapsed_time(scratch.arena, t); fprintf(stdout, " %.*s", str8_varg(s)); + + fflush(stdout); U64 insert_idx = max_U64; for EachElement(i, slowest) { @@ -1305,48 +1299,48 @@ t_entry_point(CmdLine *cmdline) if (g_stop_on_first_fail_or_crash) { goto exit; } } } - fprintf(stderr, "\n"); U64 total_time_end = now_time_us(); - PrintHeader("Summary"); - U64 total_time_dt = total_time_end - total_time_start; - String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); - fprintf(stderr, " Passed %llu\n", (unsigned long long)pass_count); - fprintf(stderr, " Failed %llu\n", (unsigned long long)fail_count); - fprintf(stderr, " Crashed %llu\n", (unsigned long long)crash_count); - fprintf(stderr, " Skipped %llu\n", (unsigned long long)skip_count); - fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); - fprintf(stderr, "\n"); - - { - fprintf(stderr, " Slow Tests\n"); - U64 label_max = 0; - U64 group_max = 0; - for EachElement(i, slowest) { - Slowest s = slowest[i]; - if (s.target_idx >= g_torture_test_count) { break; } - label_max = Max(strlen(g_torture_tests[s.target_idx]->label), label_max); - group_max = Max(strlen(g_torture_tests[s.target_idx]->group), group_max); - } - - for EachElement(i, slowest) { - Slowest s = slowest[i]; - if (s.target_idx >= g_torture_test_count) { break; } - String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); - fprintf(stderr, " %s %.*s:: %s %.*s %.*s\n", - g_torture_tests[s.target_idx]->group, - (int)(group_max - strlen(g_torture_tests[s.target_idx]->group)), spaces, - g_torture_tests[s.target_idx]->label, - (int)(label_max - strlen(g_torture_tests[s.target_idx]->label)) + 4, dots, - str8_varg(elapsed_time)); - } - - if (pass_count == target_indices.count) { - fprintf(stdout, "\n \x1b[32m" "%s" "\x1b[0m\n\n", "All Tests Passed!"); - fprintf(stderr, "--------------------------------------------------------------------------------\n"); - } - + if (target_indices.count > 0 && (pass_count > 0 || fail_count > 0 || crash_count > 0 || skip_count > 0)) { fprintf(stderr, "\n"); + PrintHeader("Summary"); + U64 total_time_dt = total_time_end - total_time_start; + String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); + fprintf(stderr, " Passed %llu\n", (unsigned long long)pass_count); + fprintf(stderr, " Failed %llu\n", (unsigned long long)fail_count); + fprintf(stderr, " Crashed %llu\n", (unsigned long long)crash_count); + fprintf(stderr, " Skipped %llu\n", (unsigned long long)skip_count); + fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); + + U64 slow_count = 0; + for EachElement(i, slowest) { + Slowest s = slowest[i]; + if (s.target_idx >= g_torture_test_count) { break; } + slow_count += 1; + } + + if (slow_count > 3) { + U64 label_max = 0; + U64 group_max = 0; + for EachElement(i, slowest) { + Slowest s = slowest[i]; + label_max = Max(strlen(g_torture_tests[s.target_idx]->label), label_max); + group_max = Max(strlen(g_torture_tests[s.target_idx]->group), group_max); + } + + fprintf(stderr, " Slow Tests\n"); + for EachElement(i, slowest) { + Slowest s = slowest[i]; + if (s.target_idx >= g_torture_test_count) { break; } + String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); + fprintf(stderr, " %s %.*s:: %s %.*s %.*s\n", + g_torture_tests[s.target_idx]->group, + (int)(group_max - strlen(g_torture_tests[s.target_idx]->group)), spaces, + g_torture_tests[s.target_idx]->label, + (int)(label_max - strlen(g_torture_tests[s.target_idx]->label)) + 4, dots, + str8_varg(elapsed_time)); + } + } } exit:; From 2f799e0e0e094864b6d26a11a1ca788fd9d96fe1 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 15 May 2026 18:39:23 -0700 Subject: [PATCH 661/850] more /OPT:REF tests --- src/torture/torture_radlink.c | 245 ++++++++++++++++++---------------- 1 file changed, 131 insertions(+), 114 deletions(-) diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index b4e0e97b..56dcd802 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -12,6 +12,7 @@ // [ ] fold_diamond // [ ] cyclic_icf // [ ] fold_with_largest_align +// [ ] relocate_undefined_section_symbol //////////////////////////////// // Def -> COFF @@ -4669,6 +4670,136 @@ TEST(opt_ref_dangling_section) T_Ok(sect != 0); } +// TODO: relocations against undefined section symbols +#if 1 +TEST(relocate_undefined_section_symbol) +{ + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00\xC3"), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "caller"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("caller"), + {0} + } + })); + + U64 target_count = 25; + + String8 caller_data = str8( + push_array(arena, U8, target_count * 4), target_count * 4); + T_COFF_DefReloc *caller_relocs = push_array(arena, T_COFF_DefReloc, target_count + 1); + T_COFF_DefSymbol *caller_symbols = push_array(arena, T_COFF_DefSymbol, target_count + 3); + + caller_symbols[0] = (T_COFF_DefSymbol)T_COFF_DefSymbol_Secdef("caller", COFF_ComdatSelect_Any); + caller_symbols[1] = (T_COFF_DefSymbol)T_COFF_DefSymbol_Extern("caller", "caller", 0); + + String8List targets = {0}; + + for EachIndex(i, target_count) { + char *obj_name = (char *)str8f(arena, "target%u.obj", i).str; + char *target_name = (char *)str8f(arena, "target%u", i).str; + char *sect_name = (char *)str8f(arena, ".target%u", i).str; + T_Ok(t_write_def_obj(obj_name, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { target_name, sect_name, target_name, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef(target_name, COFF_ComdatSelect_Any), + T_COFF_DefSymbol_Extern(target_name, target_name, 0), + {0} + } + })); + + caller_relocs[i] = (T_COFF_DefReloc)T_COFF_DefReloc(X64_Addr32Nb, i * 4, sect_name); + caller_symbols[i + 2] = (T_COFF_DefSymbol)T_COFF_DefSymbol_UndefSec(sect_name, COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead); + + str8_list_pushf(arena, &targets, obj_name); + } + + T_Ok(t_write_def_obj("caller.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "caller", ".caller", caller_data, .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT, .relocs = caller_relocs}, + {0} + }, + .symbols = caller_symbols, + })); + + String8 target_paths = str8_list_join(arena, &targets, &(StringJoin){.sep=str8_lit(" ")}); + T_Ok(t_invoke_linkerf("/subsystem:console /entry:entry /opt:ref /out:a.exe entry.obj caller.obj %S", target_paths) && g_last_exit_code == 0); + + String8 output = g_errors; + U64 match_count = 0; + while (output.size) { + if (t_match_line(&output, str8_lit("WARNING(*): *: relocation * in section *+* points to an undefined symbol *(*)"))) { + match_count += 1; + } + } + //T_Ok(match_count > 0); +} +#endif + +#if 1 +TEST(opt_ref_weak_alias_comdat) +{ + T_Ok(t_write_def_obj("weak.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "target", ".target", str8_lit("target"), .flags = "r:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Secdef("target", COFF_ComdatSelect_Any), + T_COFF_DefSymbol_Extern("target", "target", 0), + T_COFF_DefSymbol_Weak("weak_target", COFF_WeakExt_SearchAlias, "target"), + {0} + } + })); + + T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { + "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00\xC3"), .flags = "rx:code@1", + .relocs = (T_COFF_DefReloc[]){ + T_COFF_DefReloc(X64_Addr32Nb, 3, "weak_target"), + {0} + } + }, + {0} + }, + .symbols = (T_COFF_DefSymbol[]){ + T_COFF_DefSymbol_Extern("entry", "text", 0), + T_COFF_DefSymbol_Undef("weak_target"), + {0} + } + })); + + t_invoke_linkerf("/subsystem:console /entry:entry /opt:ref /out:a.exe entry.obj weak.obj"); + T_Ok(g_last_exit_code == 0); + + String8 exe = t_read_file(arena, str8_lit("a.exe")); + PE_BinInfo pe = pe_bin_info_from_data(arena, exe); + COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; + String8 string_table = str8_substr(exe, pe.string_table_range); + COFF_SectionHeader *target_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".target")); + T_Ok(target_sect != 0); +} +#endif + + TEST(fail_if_mismatch) { T_Ok(t_write_entry_obj()); @@ -7072,118 +7203,4 @@ TEST(lib_member_reloc_apply_off_out_of_bounds) } #endif -#if 0 -TEST(opt_ref_comdat_undef_section) -{ - T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ - .machine = T_COFF_DefSetMachine(X64), - .sections = (T_COFF_DefSection[]){ - { - "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00\xC3"), .flags = "rx:code@1", - .relocs = (T_COFF_DefReloc[]){ - T_COFF_DefReloc(X64_Addr32Nb, 3, "caller"), - {0} - } - }, - {0} - }, - .symbols = (T_COFF_DefSymbol[]){ - T_COFF_DefSymbol_Extern("entry", "text", 0), - T_COFF_DefSymbol_Undef("caller"), - {0} - } - })); - - T_Ok(t_write_def_obj("caller.obj", (T_COFF_DefObj){ - .machine = T_COFF_DefSetMachine(X64), - .sections = (T_COFF_DefSection[]){ - { - "caller", ".caller", str8_lit_comp("\x00\x00\x00\x00"), .flags = "rw:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT, - .relocs = (T_COFF_DefReloc[]){ - T_COFF_DefReloc(X64_Addr32Nb, 0, ".target"), - {0} - } - }, - {0} - }, - .symbols = (T_COFF_DefSymbol[]){ - T_COFF_DefSymbol_Secdef("caller", COFF_ComdatSelect_Any), - T_COFF_DefSymbol_Extern("caller", "caller", 0), - T_COFF_DefSymbol_UndefSec(".target", COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead), - {0} - } - })); - - T_Ok(t_write_def_obj("target.obj", (T_COFF_DefObj){ - .machine = T_COFF_DefSetMachine(X64), - .sections = (T_COFF_DefSection[]){ - { "target", ".target", str8_lit("target"), .flags = "r:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, - {0} - }, - .symbols = (T_COFF_DefSymbol[]){ - T_COFF_DefSymbol_Secdef("target", COFF_ComdatSelect_Any), - {0} - } - })); - - t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj caller.obj target.obj"); - T_Ok(g_last_exit_code == 0); - - String8 exe = t_read_file(arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *target_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".target")); - T_Ok(target_sect != 0); -} -#endif - -#if 0 -TEST(opt_ref_weak_alias_comdat) -{ - T_Ok(t_write_def_obj("weak.obj", (T_COFF_DefObj){ - .machine = T_COFF_DefSetMachine(X64), - .sections = (T_COFF_DefSection[]){ - { "target", ".target", str8_lit("target"), .flags = "r:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, - {0} - }, - .symbols = (T_COFF_DefSymbol[]){ - T_COFF_DefSymbol_Secdef("target", COFF_ComdatSelect_Any), - T_COFF_DefSymbol_Extern("target", "target", 0), - T_COFF_DefSymbol_Weak("weak_target", COFF_WeakExt_SearchAlias, "target"), - {0} - } - })); - - T_Ok(t_write_def_obj("entry.obj", (T_COFF_DefObj){ - .machine = T_COFF_DefSetMachine(X64), - .sections = (T_COFF_DefSection[]){ - { - "text", ".text", str8_lit_comp("\x48\xC7\xC0\x00\x00\x00\x00\xC3"), .flags = "rx:code@1", - .relocs = (T_COFF_DefReloc[]){ - T_COFF_DefReloc(X64_Addr32Nb, 3, "weak_target"), - {0} - } - }, - {0} - }, - .symbols = (T_COFF_DefSymbol[]){ - T_COFF_DefSymbol_Extern("entry", "text", 0), - T_COFF_DefSymbol_Undef("weak_target"), - {0} - } - })); - - t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj weak.obj"); - T_Ok(g_last_exit_code == 0); - - String8 exe = t_read_file(arena, str8_lit("a.exe")); - PE_BinInfo pe = pe_bin_info_from_data(arena, exe); - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str; - String8 string_table = str8_substr(exe, pe.string_table_range); - COFF_SectionHeader *target_sect = coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(".target")); - T_Ok(target_sect != 0); -} -#endif - #undef T_Group From 1883649e1869477e0041af09cd2c10abfcde9eee Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 15 May 2026 18:40:28 -0700 Subject: [PATCH 662/850] debug util for PDB section map --- build.bat | 1 + src/scratch/unit_sizes_from_pdb.c | 154 ++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 src/scratch/unit_sizes_from_pdb.c diff --git a/build.bat b/build.bat index 470b5f1d..1f8b727a 100644 --- a/build.bat +++ b/build.bat @@ -155,6 +155,7 @@ if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\m if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% %out%torture.exe || exit /b1 if "%dwarf_expr_test%"=="1" set didbuild=1 && %compile% ..\src\torture\dwarf_expr_test.c %compile_link% %out%dwarf_expr_test.exe || exit /b1 +if "%unit_sizes_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\scratch\unit_sizes_from_pdb.c %compile_link% %out%unit_sizes_from_pdb.exe || exit /b1 if "%mule_peb_trample%"=="1" ( set didbuild=1 if exist mule_peb_trample.exe move mule_peb_trample.exe mule_peb_trample_old_%random%.exe diff --git a/src/scratch/unit_sizes_from_pdb.c b/src/scratch/unit_sizes_from_pdb.c new file mode 100644 index 00000000..a2fd7766 --- /dev/null +++ b/src/scratch/unit_sizes_from_pdb.c @@ -0,0 +1,154 @@ +#define BUILD_CONSOLE_INTERFACE 1 +#define NO_ASYNC 1 + +#include "base/base_inc.h" +#include "x64/x64.h" +#include "linker/hash_table.h" +#include "coff/coff.h" +#include "coff/coff_parse.h" +#include "coff/coff_obj_writer.h" +#include "coff/coff_lib_writer.h" +#include "pe/pe.h" +#include "pe/pe_section_flags.h" +#include "pe/pe_make_import_table.h" +#include "pe/pe_make_export_table.h" +#include "pe/pe_make_debug_dir.h" +#include "codeview/codeview.h" +#include "codeview/codeview_parse.h" +#include "msf/msf.h" +#include "msf/msf_parse.h" +#include "pdb/pdb.h" +#include "pdb/pdb_parse.h" +#include "msvc_crt/msvc_crt.h" +#include "llvm/llvm.h" +#include "dwarf/dwarf.h" +#include "dwarf/x64/dwarf_x64.h" + +#include "base/base_inc.c" +#include "x64/x64.c" +#include "linker/hash_table.c" +#include "coff/coff.c" +#include "coff/coff_parse.c" +#include "coff/coff_obj_writer.c" +#include "coff/coff_lib_writer.c" +#include "pe/pe.c" +#include "pe/pe_make_import_table.c" +#include "pe/pe_make_export_table.c" +#include "pe/pe_make_debug_dir.c" +#include "codeview/codeview.c" +#include "codeview/codeview_parse.c" +#include "msf/msf.c" +#include "msf/msf_parse.c" +#include "pdb/pdb.c" +#include "pdb/pdb_parse.c" +#include "msvc_crt/msvc_crt.c" +#include "llvm/llvm.c" +#include "dwarf/x64/dwarf_x64.c" + +int is_before(void *a, void *b) +{ + return str8_compar_ignore_case(&(*(PDB_CompUnit**)a)->obj_name, &(*(PDB_CompUnit**)b)->obj_name) < 0; +} + +int sc_is_before(void *a, void *b) +{ + return (*(PDB_CompUnitContribution **)a)->voff_first < (*(PDB_CompUnitContribution **)b)->voff_first; +} + +internal void +entry_point(CmdLine *cmdline) +{ + Temp scratch = scratch_begin(0,0); + + String8 data = data_from_file_path(scratch.arena, cmdline->inputs.first->string); + if (data.size == 0) { + fprintf(stderr, "ERROR: input file was not read %.*s\n", str8_varg(cmdline->inputs.first->string)); + goto exit; + } + + // parse msf + MSF_Parsed *msf = msf_parsed_from_data(scratch.arena, data); + + // parse dbi + String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); + PDB_DbiParsed *dbi = pdb_dbi_from_data(scratch.arena, dbi_data); + + // parse image section table + COFF_SectionHeaderArray coff_sections = {0}; + MSF_StreamNumber section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]; + String8 section_data = msf_data_from_stream(msf, section_stream); + coff_sections = pdb_coff_section_array_from_data(scratch.arena, section_data); + + // parse section contribs + String8 contribs_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon); + PDB_CompUnitContributionArray comp_unit_contributions = pdb_comp_unit_contribution_array_from_data(scratch.arena, contribs_data, coff_sections); + + // parse compile units + String8 comp_units_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); + PDB_CompUnitArray *comp_units = pdb_comp_unit_array_from_data(scratch.arena, comp_units_data); + + HashMap sc_hm = {0}; + + typedef struct SC_Node { + PDB_CompUnitContribution *v; + struct SC_Node *next; + } SC_Node; + + typedef struct { + U64 count; + SC_Node *first; + SC_Node *last; + } SC_List; + + U64 *sizes = push_array(scratch.arena, U64, comp_units->count + 1); + for EachIndex(i, comp_unit_contributions.count) { + PDB_CompUnitContribution *sc = &comp_unit_contributions.contributions[i]; + + U64 s = sc->voff_opl - sc->voff_first; + sizes[sc->mod] += s; + + PDB_CompUnit *cu = comp_units->units[sc->mod]; + SC_List *list = hash_map_search_raw_raw(&sc_hm, cu); + if (list == 0) { + list = push_array(scratch.arena, SC_List, 1); + hash_map_push_raw_raw(scratch.arena, &sc_hm, cu, list); + } + SC_Node *n = push_array(scratch.arena, SC_Node, 1); + n->v = sc; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + } + + PDB_CompUnit **sorted_comp_units = push_array(scratch.arena, PDB_CompUnit *, comp_units->count); + for EachIndex(i, comp_units->count) { sorted_comp_units[i] = comp_units->units[i]; } + radsort(sorted_comp_units, comp_units->count, is_before); + + HashMap hm = {0}; + for EachIndex(i, comp_units->count) { hash_map_push_raw_u64(scratch.arena, &hm, comp_units->units[i], i); } + + for (U64 i = 0; i < comp_units->count; ++i) { + U64 *cu_idx = hash_map_search_raw_u64(&hm, sorted_comp_units[i]); + SC_List *sc_list = hash_map_search_raw_raw(&sc_hm, sorted_comp_units[i]); + + PDB_CompUnitContribution **cu_sc = 0; + if (sc_list) { + cu_sc = push_array(scratch.arena, PDB_CompUnitContribution *, sc_list->count); + U64 sc_idx = 0; + for EachNode(n, SC_Node, sc_list->first) { + cu_sc[sc_idx++] = n->v; + } + radsort(cu_sc, sc_idx, sc_is_before); + } + + fprintf(stdout, "0x%llx - %.*s %.*s\n", sizes[*cu_idx], str8_varg(sorted_comp_units[i]->obj_name), str8_varg(str8_skip_last_slash(sorted_comp_units[i]->group_name))); + if (cu_sc) { + for EachIndex(i, sc_list->count) { + fprintf(stdout, "\t0x%llx 0x%llx\n", (unsigned long long)(cu_sc[i]->voff_opl - cu_sc[i]->voff_first), (unsigned long long)cu_sc[i]->voff_first); + } + } + } + + exit:; + scratch_end(scratch); +} + From 03180247c9951d9d8abc073507d038e2ad452f14 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 18:11:25 -0700 Subject: [PATCH 663/850] rebase fixes --- src/dbg_engine/generated/dbg_engine.meta.h | 278 ++++++++++----------- src/linker/lnk_io.c | 20 +- src/raddbg/raddbg_core.c | 4 +- 3 files changed, 158 insertions(+), 144 deletions(-) diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index 859bab04..31d446fe 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -1,139 +1,139 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef DBG_ENGINE_META_H -#define DBG_ENGINE_META_H - -typedef enum D_CmdKind -{ -D_CmdKind_Null, -D_CmdKind_LaunchAndRun, -D_CmdKind_LaunchAndStepInto, -D_CmdKind_Kill, -D_CmdKind_KillAll, -D_CmdKind_Detach, -D_CmdKind_Continue, -D_CmdKind_StepIntoInst, -D_CmdKind_StepOverInst, -D_CmdKind_StepIntoLine, -D_CmdKind_StepOverLine, -D_CmdKind_StepOut, -D_CmdKind_Halt, -D_CmdKind_SoftHaltRefresh, -D_CmdKind_SetThreadIP, -D_CmdKind_RunToLine, -D_CmdKind_Run, -D_CmdKind_Restart, -D_CmdKind_StepInto, -D_CmdKind_StepOver, -D_CmdKind_FreezeThread, -D_CmdKind_ThawThread, -D_CmdKind_FreezeProcess, -D_CmdKind_ThawProcess, -D_CmdKind_FreezeMachine, -D_CmdKind_ThawMachine, -D_CmdKind_FreezeLocalMachine, -D_CmdKind_ThawLocalMachine, -D_CmdKind_FreezeEntity, -D_CmdKind_ThawEntity, -D_CmdKind_SetEntityColor, -D_CmdKind_SetEntityName, -D_CmdKind_Attach, -D_CmdKind_OpenCrashDump, -D_CmdKind_COUNT, -} D_CmdKind; - -typedef enum D_EntityKind -{ -D_EntityKind_Null, -D_EntityKind_Root, -D_EntityKind_Machine, -D_EntityKind_Process, -D_EntityKind_Thread, -D_EntityKind_Module, -D_EntityKind_EntryPoint, -D_EntityKind_DebugInfoPath, -D_EntityKind_PendingThreadName, -D_EntityKind_PendingThreadColor, -D_EntityKind_Breakpoint, -D_EntityKind_AddressRangeAnnotation, -D_EntityKind_COUNT, -} D_EntityKind; - -typedef enum D_ExceptionCodeKind -{ -D_ExceptionCodeKind_Null, -D_ExceptionCodeKind_Win32CtrlC, -D_ExceptionCodeKind_Win32CtrlBreak, -D_ExceptionCodeKind_Win32WinRTOriginateError, -D_ExceptionCodeKind_Win32WinRTTransformError, -D_ExceptionCodeKind_Win32RPCCallCancelled, -D_ExceptionCodeKind_Win32DatatypeMisalignment, -D_ExceptionCodeKind_Win32AccessViolation, -D_ExceptionCodeKind_Win32InPageError, -D_ExceptionCodeKind_Win32InvalidHandle, -D_ExceptionCodeKind_Win32NotEnoughQuota, -D_ExceptionCodeKind_Win32IllegalInstruction, -D_ExceptionCodeKind_Win32CannotContinueException, -D_ExceptionCodeKind_Win32InvalidExceptionDisposition, -D_ExceptionCodeKind_Win32ArrayBoundsExceeded, -D_ExceptionCodeKind_Win32FloatingPointDenormalOperand, -D_ExceptionCodeKind_Win32FloatingPointDivisionByZero, -D_ExceptionCodeKind_Win32FloatingPointInexactResult, -D_ExceptionCodeKind_Win32FloatingPointInvalidOperation, -D_ExceptionCodeKind_Win32FloatingPointOverflow, -D_ExceptionCodeKind_Win32FloatingPointStackCheck, -D_ExceptionCodeKind_Win32FloatingPointUnderflow, -D_ExceptionCodeKind_Win32IntegerDivisionByZero, -D_ExceptionCodeKind_Win32IntegerOverflow, -D_ExceptionCodeKind_Win32PrivilegedInstruction, -D_ExceptionCodeKind_Win32StackOverflow, -D_ExceptionCodeKind_Win32UnableToLocateDLL, -D_ExceptionCodeKind_Win32OrdinalNotFound, -D_ExceptionCodeKind_Win32EntryPointNotFound, -D_ExceptionCodeKind_Win32DLLInitializationFailed, -D_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults, -D_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps, -D_ExceptionCodeKind_Win32AssertionFailed, -D_ExceptionCodeKind_Win32ModuleNotFound, -D_ExceptionCodeKind_Win32ProcedureNotFound, -D_ExceptionCodeKind_Win32SanitizerErrorDetected, -D_ExceptionCodeKind_Win32SanitizerRawAccessViolation, -D_ExceptionCodeKind_Win32DirectXDebugLayer, -D_ExceptionCodeKind_COUNT, -} D_ExceptionCodeKind; - -global B32 DEV_always_refresh = 0; -global B32 DEV_simulate_lag = 0; -global B32 DEV_draw_ui_text_pos = 0; -global B32 DEV_draw_ui_focus_debug = 0; -global B32 DEV_draw_ui_box_heatmap = 0; -global B32 DEV_eval_compiler_tooltips = 0; -global B32 DEV_eval_watch_key_tooltips = 0; -global B32 DEV_cmd_context_tooltips = 0; -global B32 DEV_updating_indicator = 0; -struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = -{ -{&DEV_always_refresh, str8_lit_comp("always_refresh")}, -{&DEV_simulate_lag, str8_lit_comp("simulate_lag")}, -{&DEV_draw_ui_text_pos, str8_lit_comp("draw_ui_text_pos")}, -{&DEV_draw_ui_focus_debug, str8_lit_comp("draw_ui_focus_debug")}, -{&DEV_draw_ui_box_heatmap, str8_lit_comp("draw_ui_box_heatmap")}, -{&DEV_eval_compiler_tooltips, str8_lit_comp("eval_compiler_tooltips")}, -{&DEV_eval_watch_key_tooltips, str8_lit_comp("eval_watch_key_tooltips")}, -{&DEV_cmd_context_tooltips, str8_lit_comp("cmd_context_tooltips")}, -{&DEV_updating_indicator, str8_lit_comp("updating_indicator")}, -}; -C_LINKAGE_BEGIN -extern String8 d_entity_kind_code_name_table[12]; -extern String8 d_entity_kind_display_string_table[12]; -extern U32 d_exception_code_kind_code_table[38]; -extern String8 d_exception_code_kind_display_string_table[38]; -extern String8 d_exception_code_kind_lowercase_code_string_table[38]; -extern B8 d_exception_code_kind_default_enable_table[38]; - -C_LINKAGE_END - -#endif // DBG_ENGINE_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef DBG_ENGINE_META_H +#define DBG_ENGINE_META_H + +typedef enum D_CmdKind +{ +D_CmdKind_Null, +D_CmdKind_LaunchAndRun, +D_CmdKind_LaunchAndStepInto, +D_CmdKind_Kill, +D_CmdKind_KillAll, +D_CmdKind_Detach, +D_CmdKind_Continue, +D_CmdKind_StepIntoInst, +D_CmdKind_StepOverInst, +D_CmdKind_StepIntoLine, +D_CmdKind_StepOverLine, +D_CmdKind_StepOut, +D_CmdKind_Halt, +D_CmdKind_SoftHaltRefresh, +D_CmdKind_SetThreadIP, +D_CmdKind_RunToLine, +D_CmdKind_Run, +D_CmdKind_Restart, +D_CmdKind_StepInto, +D_CmdKind_StepOver, +D_CmdKind_FreezeThread, +D_CmdKind_ThawThread, +D_CmdKind_FreezeProcess, +D_CmdKind_ThawProcess, +D_CmdKind_FreezeMachine, +D_CmdKind_ThawMachine, +D_CmdKind_FreezeLocalMachine, +D_CmdKind_ThawLocalMachine, +D_CmdKind_FreezeEntity, +D_CmdKind_ThawEntity, +D_CmdKind_SetEntityColor, +D_CmdKind_SetEntityName, +D_CmdKind_Attach, +D_CmdKind_OpenCrashDump, +D_CmdKind_COUNT, +} D_CmdKind; + +typedef enum D_EntityKind +{ +D_EntityKind_Null, +D_EntityKind_Root, +D_EntityKind_Machine, +D_EntityKind_Process, +D_EntityKind_Thread, +D_EntityKind_Module, +D_EntityKind_EntryPoint, +D_EntityKind_DebugInfoPath, +D_EntityKind_PendingThreadName, +D_EntityKind_PendingThreadColor, +D_EntityKind_Breakpoint, +D_EntityKind_AddressRangeAnnotation, +D_EntityKind_COUNT, +} D_EntityKind; + +typedef enum D_ExceptionCodeKind +{ +D_ExceptionCodeKind_Null, +D_ExceptionCodeKind_Win32CtrlC, +D_ExceptionCodeKind_Win32CtrlBreak, +D_ExceptionCodeKind_Win32WinRTOriginateError, +D_ExceptionCodeKind_Win32WinRTTransformError, +D_ExceptionCodeKind_Win32RPCCallCancelled, +D_ExceptionCodeKind_Win32DatatypeMisalignment, +D_ExceptionCodeKind_Win32AccessViolation, +D_ExceptionCodeKind_Win32InPageError, +D_ExceptionCodeKind_Win32InvalidHandle, +D_ExceptionCodeKind_Win32NotEnoughQuota, +D_ExceptionCodeKind_Win32IllegalInstruction, +D_ExceptionCodeKind_Win32CannotContinueException, +D_ExceptionCodeKind_Win32InvalidExceptionDisposition, +D_ExceptionCodeKind_Win32ArrayBoundsExceeded, +D_ExceptionCodeKind_Win32FloatingPointDenormalOperand, +D_ExceptionCodeKind_Win32FloatingPointDivisionByZero, +D_ExceptionCodeKind_Win32FloatingPointInexactResult, +D_ExceptionCodeKind_Win32FloatingPointInvalidOperation, +D_ExceptionCodeKind_Win32FloatingPointOverflow, +D_ExceptionCodeKind_Win32FloatingPointStackCheck, +D_ExceptionCodeKind_Win32FloatingPointUnderflow, +D_ExceptionCodeKind_Win32IntegerDivisionByZero, +D_ExceptionCodeKind_Win32IntegerOverflow, +D_ExceptionCodeKind_Win32PrivilegedInstruction, +D_ExceptionCodeKind_Win32StackOverflow, +D_ExceptionCodeKind_Win32UnableToLocateDLL, +D_ExceptionCodeKind_Win32OrdinalNotFound, +D_ExceptionCodeKind_Win32EntryPointNotFound, +D_ExceptionCodeKind_Win32DLLInitializationFailed, +D_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults, +D_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps, +D_ExceptionCodeKind_Win32AssertionFailed, +D_ExceptionCodeKind_Win32ModuleNotFound, +D_ExceptionCodeKind_Win32ProcedureNotFound, +D_ExceptionCodeKind_Win32SanitizerErrorDetected, +D_ExceptionCodeKind_Win32SanitizerRawAccessViolation, +D_ExceptionCodeKind_Win32DirectXDebugLayer, +D_ExceptionCodeKind_COUNT, +} D_ExceptionCodeKind; + +global B32 DEV_always_refresh = 0; +global B32 DEV_simulate_lag = 0; +global B32 DEV_draw_ui_text_pos = 0; +global B32 DEV_draw_ui_focus_debug = 0; +global B32 DEV_draw_ui_box_heatmap = 0; +global B32 DEV_eval_compiler_tooltips = 0; +global B32 DEV_eval_watch_key_tooltips = 0; +global B32 DEV_cmd_context_tooltips = 0; +global B32 DEV_updating_indicator = 0; +struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = +{ +{&DEV_always_refresh, str8_lit_comp("always_refresh")}, +{&DEV_simulate_lag, str8_lit_comp("simulate_lag")}, +{&DEV_draw_ui_text_pos, str8_lit_comp("draw_ui_text_pos")}, +{&DEV_draw_ui_focus_debug, str8_lit_comp("draw_ui_focus_debug")}, +{&DEV_draw_ui_box_heatmap, str8_lit_comp("draw_ui_box_heatmap")}, +{&DEV_eval_compiler_tooltips, str8_lit_comp("eval_compiler_tooltips")}, +{&DEV_eval_watch_key_tooltips, str8_lit_comp("eval_watch_key_tooltips")}, +{&DEV_cmd_context_tooltips, str8_lit_comp("cmd_context_tooltips")}, +{&DEV_updating_indicator, str8_lit_comp("updating_indicator")}, +}; +C_LINKAGE_BEGIN +extern String8 d_entity_kind_code_name_table[12]; +extern String8 d_entity_kind_display_string_table[12]; +extern U32 d_exception_code_kind_code_table[38]; +extern String8 d_exception_code_kind_display_string_table[38]; +extern String8 d_exception_code_kind_lowercase_code_string_table[38]; +extern B8 d_exception_code_kind_default_enable_table[38]; + +C_LINKAGE_END + +#endif // DBG_ENGINE_META_H diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index f50039df..20e180c0 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -111,10 +111,14 @@ lnk_file_open_with_rename_permissions(String8 path) internal B32 lnk_file_set_delete_on_close(File handle, B32 delete_file) { + B32 is_set = 0; #if OS_WINDOWS FILE_DISPOSITION_INFO file_disposition = {0}; file_disposition.DeleteFile = (BOOL)delete_file; - B32 is_set = SetFileInformationByHandle((HANDLE)handle.u64[0], FileDispositionInfo, &file_disposition, sizeof(file_disposition)); + is_set = SetFileInformationByHandle((HANDLE)handle.u64[0], FileDispositionInfo, &file_disposition, sizeof(file_disposition)); +#elif OS_LINUX + // no equivalent + is_set = 1; #else # error "TODO: file rename" #endif @@ -125,6 +129,7 @@ internal B32 lnk_file_rename(File handle, String8 new_name) { Temp scratch = scratch_begin(0,0); + B32 is_renamed = 0; #if OS_WINDOWS String16 new_name16 = str16_from_8(scratch.arena, new_name); @@ -137,9 +142,18 @@ lnk_file_rename(File handle, String8 new_name) rename_info->FileNameLength = new_name16.size * sizeof(new_name16.str[0]); MemoryCopy(rename_info->FileName, new_name16.str, new_name16.size * sizeof(new_name16.str[0])); - B32 is_renamed = SetFileInformationByHandle((HANDLE)handle.u64[0], FileRenameInfo, buffer, buffer_size); + is_renamed = SetFileInformationByHandle((HANDLE)handle.u64[0], FileRenameInfo, buffer, buffer_size); #else -#error "TODO: file rename" + char fd_proc_path[128]; + raddbg_snprintf(fd_proc_path, sizeof(fd_proc_path), "/proc/self/fd/%d", (int)handle.u64[0]); + + U64 path_max = 4096; + char *path = push_array(scratch.arena, char, path_max); + ssize_t path_size = readlink(fd_proc_path, path, path_max); + + if (path_size > 0) { + is_renamed = rename(path, (char *)push_cstr(scratch.arena, new_name).str) == 0; + } #endif scratch_end(scratch); return is_renamed; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 41033175..9178874e 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10513,10 +10513,10 @@ rd_ipc_make_reply_source_location_from_address(Arena *arena, U64 vaddr) { Temp scratch = scratch_begin(&arena, 1); - D_Entity *process = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->process); + D_Entity *process = d_entity_from_handle(rd_base_regs()->process); if(process == &d_entity_nil) { - D_Entity *thread = d_entity_from_handle(&d_user_state->ctrl_entity_store->ctx, rd_base_regs()->thread); + D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); } From 8126f1f18e4937d0d2f60b4c07c209b991ec91e7 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 19:30:24 -0700 Subject: [PATCH 664/850] first popped value off the stack is right-hand-side --- src/dwarf/dwarf_expr.c | 38 +++++++++++++++++++------------------- src/dwarf/dwarf_expr.h | 38 +++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 4f4f0b22..f5f7f6e0 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -81,7 +81,7 @@ dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k) } internal DW_ExprValueType -dw_expr_pick_common_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs) +dw_expr_pick_common_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs) { if (lhs == rhs) { return lhs; @@ -144,7 +144,7 @@ dw_expr_pick_common_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs) } internal DW_ExprValueType -dw_expr_pick_common_compar_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs) +dw_expr_pick_common_compar_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs) { DW_ExprValueType result; if (lhs == DW_ExprValueType_Generic || rhs == DW_ExprValueType_Generic) { @@ -213,7 +213,7 @@ default: { InvalidPath; } break; } internal DW_ExprValue -dw_expr_add(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_add(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); @@ -254,7 +254,7 @@ dw_expr_add(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_minus(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_minus(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); @@ -295,7 +295,7 @@ dw_expr_minus(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_mul(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_mul(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); @@ -336,7 +336,7 @@ dw_expr_mul(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_div(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_div(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); @@ -377,7 +377,7 @@ dw_expr_div(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_mod(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_mod(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); @@ -418,7 +418,7 @@ dw_expr_mod(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_eq(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_eq(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -460,7 +460,7 @@ dw_expr_eq(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_ge(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_ge(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -502,7 +502,7 @@ dw_expr_ge(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_gt(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_gt(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -544,7 +544,7 @@ dw_expr_gt(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_le(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_le(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -586,7 +586,7 @@ dw_expr_le(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_lt(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_lt(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -628,7 +628,7 @@ dw_expr_lt(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_ne(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_ne(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -670,7 +670,7 @@ dw_expr_ne(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_xor(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_xor(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -712,7 +712,7 @@ dw_expr_xor(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_and(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_and(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -754,7 +754,7 @@ dw_expr_and(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_or(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_or(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -796,7 +796,7 @@ dw_expr_or(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_shl(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_shl(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -838,7 +838,7 @@ dw_expr_shl(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_shr(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_shr(DW_ExprValue rhs, DW_ExprValue lhs) { DW_ExprValue result = {0}; result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); @@ -879,7 +879,7 @@ dw_expr_shr(DW_ExprValue lhs, DW_ExprValue rhs) } internal DW_ExprValue -dw_expr_shra(DW_ExprValue lhs, DW_ExprValue rhs) +dw_expr_shra(DW_ExprValue rhs, DW_ExprValue lhs) { if (DW_ExprValueType_IsUnsigned(lhs.type)) { DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, lhs.type) * 8); diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index 7e8e74d7..d9c3bdae 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -184,32 +184,32 @@ internal DW_ExprValueType dw_expr_float_type_from_bit_size(U64 bit_size); internal U64 dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k); // typer -internal DW_ExprValueType dw_expr_pick_common_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs); -internal DW_ExprValueType dw_expr_pick_common_compar_value_type(DW_ExprValueType lhs, DW_ExprValueType rhs); +internal DW_ExprValueType dw_expr_pick_common_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs); +internal DW_ExprValueType dw_expr_pick_common_compar_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs); internal DW_ExprValue dw_expr_cast(DW_ExprValue value, DW_ExprValueType type); // arithmetic operators -internal DW_ExprValue dw_expr_add(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_minus(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_mul(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_div(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_mod(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_add (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_minus(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_mul (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_div (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_mod (DW_ExprValue rhs, DW_ExprValue lhs); // comparison operators -internal DW_ExprValue dw_expr_eq(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_ge(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_gt(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_le(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_lt(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_ne(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_eq(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_ge(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_gt(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_le(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_lt(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_ne(DW_ExprValue rhs, DW_ExprValue lhs); // bitwise operators -internal DW_ExprValue dw_expr_xor(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_and(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_or(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_shl(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_shr(DW_ExprValue lhs, DW_ExprValue rhs); -internal DW_ExprValue dw_expr_shra(DW_ExprValue lhs, DW_ExprValue rhs); +internal DW_ExprValue dw_expr_xor (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_and (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_or (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_shl (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_shr (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_shra(DW_ExprValue rhs, DW_ExprValue lhs); // unary operators internal DW_ExprValue dw_expr_abs(DW_ExprValue value); From c5677cf5f41b80c3e1c90c4441b481732e75a89e Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 18 May 2026 19:30:59 -0700 Subject: [PATCH 665/850] wire DWARF expression eval to the unwinder --- src/dwarf/dwarf_unwind.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index 28764c8f..c8124236 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -261,8 +261,19 @@ dw_compute_cfa(Arch arch, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *m }break; case DW_CFA_Rule_Expression: { - // TODO: evaluate expression - NotImplemented; + Temp scratch = scratch_begin(0,0); + DW_ExprValue value = {0}; + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_32Bit, byte_size_from_arch(arch), row->cfa.expr); + DW_ExprEvalResult eval_result = dw_eval_expr(scratch.arena, arch, DW_Format_32Bit, 0, 0, 0, 9999, expr, reg_block, mem_read_func, mem_read_ud, &value); + if (eval_result == DW_ExprEvalResult_Ok) { + if (DW_ExprValueType_IsInt(value.type)) { + *cfa_out = value.u64; + unwind_status = MachineOpResult_Ok; + } + } else if (eval_result == DW_ExprEvalResult_Maybe) { + unwind_status = MachineOpResult_Maybe; + } + scratch_end(scratch); }break; } return unwind_status; From 2e4069b89af28e4e0c48b83958951a6e60efde1f Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 19 May 2026 12:31:16 -0700 Subject: [PATCH 666/850] debug stats for /OPT:REF --- src/linker/lnk.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 6fa2636b..13fb8d1a 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -2676,9 +2676,9 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) if (task_id == 0) { ProfBegin("Remove Unreachable Sections"); - U64 discard_vsize = 0; - U64 discard_fsize = 0; - U64 discard_count = 0; + typedef struct { U64 vsize; U64 fsize; U64 section_count; } Stat; + enum { Stat_Null, Stat_Code, Stat_Data, Stat_Debug, Stat_Count }; + Stat stats[Stat_Count] = {0}; for EachNode(obj_n, LNK_ObjNode, objs.first) { LNK_Obj *obj = &obj_n->data; @@ -2690,18 +2690,35 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); section_header->flags |= COFF_SectionFlag_LnkRemove; + U64 stat_kind = Stat_Null; + if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { stat_kind = Stat_Debug; } + else if (section_header->flags & COFF_SectionFlag_CntCode) { stat_kind = Stat_Code; } + else { stat_kind = Stat_Data; } + if (section_header->flags & COFF_SectionFlag_CntUninitializedData) { - discard_vsize += section_header->vsize; + stats[stat_kind].vsize += section_header->vsize; } else { - discard_fsize += section_header->fsize; + stats[stat_kind].fsize += section_header->fsize; } - discard_count += 1; + stats[stat_kind].section_count += 1; } } - lnk_log(LNK_Log_Debug, "/OPT:REF total virt size discard: %M", (unsigned long long)discard_vsize); - lnk_log(LNK_Log_Debug, "/OPT:REF total file size discard: %M", (unsigned long long)discard_fsize); - lnk_log(LNK_Log_Debug, "/OPT:REF total section discard : %llu", (unsigned long long)discard_count); + if (lnk_get_log_status(LNK_Log_Debug)) { + U64 total_vsize = 0, total_fsize = 0, total_section_count = 0; + for EachElement(i, stats) { + total_vsize += stats[i].vsize; + total_fsize += stats[i].fsize; + total_section_count += stats[i].section_count; + } + String8List stat_list = {0}; + str8_list_pushf(scratch.arena, &stat_list, "Code : vsize: %M, fsize: %M, section count %llu", stats[Stat_Code].vsize, stats[Stat_Code].fsize, (unsigned long long)stats[Stat_Code].section_count ); + str8_list_pushf(scratch.arena, &stat_list, "Data : vsize: %M, fsize: %M, section count %llu", stats[Stat_Data].vsize, stats[Stat_Data].fsize, (unsigned long long)stats[Stat_Data].section_count ); + str8_list_pushf(scratch.arena, &stat_list, "Debug: vsize: %M, fsize: %M, section count %llu", stats[Stat_Debug].vsize, stats[Stat_Debug].fsize, (unsigned long long)stats[Stat_Debug].section_count); + str8_list_pushf(scratch.arena, &stat_list, "Total: vsize: %M, fsize: %M, section count %llu", total_vsize, total_fsize, total_section_count); + String8 stat_str = str8_list_join(scratch.arena, &stat_list, &(StringJoin){.pre = str8_lit(" "), .sep = str8_lit("\n ")}); + lnk_log(LNK_Log_Debug, "/OPT:REF Stats:\n%S", stat_str); + } ProfEnd(); } From 8127763fa49adc7bd49e6e40c2c9e762e41007fa Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 19 May 2026 14:46:10 -0700 Subject: [PATCH 667/850] fix linux build --- src/linux/demon/linux_demon.h | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/linux/demon/linux_demon.h b/src/linux/demon/linux_demon.h index a84a573c..fafdc925 100644 --- a/src/linux/demon/linux_demon.h +++ b/src/linux/demon/linux_demon.h @@ -277,6 +277,15 @@ typedef struct LNX_DMN_ProcessPtrList LNX_DMN_ProcessPtrNode *last; } LNX_DMN_ProcessPtrList; +typedef struct LNX_DMN_ActiveTrap LNX_DMN_ActiveTrap; +struct LNX_DMN_ActiveTrap +{ + LNX_DMN_ActiveTrap *next; + B32 good; + DMN_Trap *trap; + String8 swap_bytes; +}; + typedef struct LNX_DMN_ProcessCtx { Arena *arena; @@ -331,18 +340,6 @@ typedef struct LNX_DMN_EntityList LNX_DMN_EntityNode *last; } LNX_DMN_EntityList; -//////////////////////////////// -//~ rjf: Active Trap Data Structure - -typedef struct LNX_DMN_ActiveTrap LNX_DMN_ActiveTrap; -struct LNX_DMN_ActiveTrap -{ - LNX_DMN_ActiveTrap *next; - B32 good; - DMN_Trap *trap; - String8 swap_bytes; -}; - //////////////////////////////// //~ Global State From 4a57087d813cfdbd38783ce6b42133e6d3b8f905 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 May 2026 11:24:40 -0700 Subject: [PATCH 668/850] dump RDI local vars --- src/rdi/rdi_local.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index d99f00be..23f0dae6 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -990,6 +990,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope((char *)rdi_name_title_from_du {RDI_DumpSubset_ThreadVariables, RDI_SectionKind_ThreadVariables}, {RDI_DumpSubset_LocalVariables, RDI_SectionKind_LocalVariables}, {RDI_DumpSubset_Constants, RDI_SectionKind_Constants}, + {RDI_DumpSubset_LocalVariables, RDI_SectionKind_LocalVariables}, }; for EachElement(symbol_table_idx, symbol_tables) { From 0b5651eecd3f0d5d29ea6b3d9d1fe78fd1b63e87 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 20 May 2026 14:02:52 -0700 Subject: [PATCH 669/850] project files --- project.4coder | 2 +- project.raddbg | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/project.4coder b/project.4coder index 36d19981..dae43a1f 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 39d39fdf..74ff8bda 100644 --- a/project.raddbg +++ b/project.raddbg @@ -1,13 +1,11 @@ -// raddbg 0.9.26 project file +// raddbg 0.9.27 project file name: "The RAD Debugger" -theme: "VS (Dark)" target: { executable: "build/raddbg.exe" working_directory: build arguments: "--user:raddbg_test.user --project:raddbg_test.project" - enabled: 1 } target: { @@ -32,3 +30,10 @@ target: working_directory: "build/dwarf" arguments: "--bin --rdi a.exe" } +target: +{ + executable: "build/radbin.exe" + working_directory: "build/" + enabled: 1 + arguments: "--rdi chrome.dll.pdb" +} From eb8cee76c06aa86a82932a013d18454c66b2e8d4 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 May 2026 14:19:10 -0700 Subject: [PATCH 670/850] update .gitattributes to set LF endings on meta files so metagen files have consistent line endings regardless of the host preference --- .gitattributes | 3 + src/raddbg/generated/raddbg.meta.c | 2236 +- src/raddbg/generated/raddbg.meta.h | 40722 +++++++++++++-------------- 3 files changed, 21482 insertions(+), 21479 deletions(-) diff --git a/.gitattributes b/.gitattributes index e7657f67..4fc1dfa1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,4 @@ *.sh text=auto eol=lf +src/lib_rdi/rdi.h text=auto eol=lf +src/lib_rdi/rdi.c text=auto eol=lf +generated/*.meta.* text=auto eol=lf diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index ed5e4ffa..176d3d8e 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -1,1118 +1,1118 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -C_LINKAGE_BEGIN -String8 rd_tab_fast_path_view_name_table[25] = -{ -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("watch"), -str8_lit_comp("text"), -str8_lit_comp("text"), -str8_lit_comp("disasm"), -str8_lit_comp("memory"), -str8_lit_comp("bitmap"), -str8_lit_comp("color"), -str8_lit_comp("geo3d"), -}; - -String8 rd_tab_fast_path_query_name_table[25] = -{ -str8_lit_comp(""), -str8_lit_comp("query:locals"), -str8_lit_comp("query:registers"), -str8_lit_comp("query:globals"), -str8_lit_comp("query:thread_locals"), -str8_lit_comp("query:types"), -str8_lit_comp("query:procedures"), -str8_lit_comp("query:call_stack"), -str8_lit_comp("query:targets"), -str8_lit_comp("query:breakpoints"), -str8_lit_comp("query:watch_pins"), -str8_lit_comp("query:debug_infos"), -str8_lit_comp("query:threads"), -str8_lit_comp("query:processes"), -str8_lit_comp("query:machines"), -str8_lit_comp("query:modules"), -str8_lit_comp("query:file_path_maps"), -str8_lit_comp("query:type_views"), -str8_lit_comp("query:output"), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -str8_lit_comp(""), -}; - -RD_VocabInfo rd_vocab_info_table[360] = -{ -{str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, -{str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, -{str8_lit_comp("watch_pin"), str8_lit_comp("watch_pins"), str8_lit_comp("Watch Pin"), str8_lit_comp("Watch Pins"), RD_IconKind_Pin}, -{str8_lit_comp("debug_info"), str8_lit_comp("debug_infos"), str8_lit_comp("Debug Info"), str8_lit_comp("Debug Info"), RD_IconKind_Module}, -{str8_lit_comp("watch"), str8_lit_comp("watches"), str8_lit_comp("Watch"), str8_lit_comp("Watches"), RD_IconKind_Binoculars}, -{str8_lit_comp("view"), str8_lit_comp("views"), str8_lit_comp("View"), str8_lit_comp("Views"), RD_IconKind_Binoculars}, -{str8_lit_comp("breakpoint"), str8_lit_comp("breakpoints"), str8_lit_comp("Breakpoint"), str8_lit_comp("Breakpoints"), RD_IconKind_CircleFilled}, -{str8_lit_comp("condition"), str8_lit_comp("conditions"), str8_lit_comp("Condition"), str8_lit_comp("Conditions"), RD_IconKind_Null}, -{str8_lit_comp("location"), str8_lit_comp("locations"), str8_lit_comp("Location"), str8_lit_comp("Locations"), RD_IconKind_Null}, -{str8_lit_comp("source_location"), str8_lit_comp("source_locations"), str8_lit_comp("Source Location"), str8_lit_comp("Source Locations"), RD_IconKind_Null}, -{str8_lit_comp("address_location"), str8_lit_comp("address_locations"), str8_lit_comp("Address Location"), str8_lit_comp("Address Locations"), RD_IconKind_Null}, -{str8_lit_comp("target"), str8_lit_comp("targets"), str8_lit_comp("Target"), str8_lit_comp("Targets"), RD_IconKind_Target}, -{str8_lit_comp("color"), str8_lit_comp("colors"), str8_lit_comp("Color"), str8_lit_comp("Colors"), RD_IconKind_Palette}, -{str8_lit_comp("theme_color"), str8_lit_comp("theme_colors"), str8_lit_comp("Theme Color"), str8_lit_comp("Theme Colors"), RD_IconKind_Palette}, -{str8_lit_comp("executable"), str8_lit_comp("executables"), str8_lit_comp("Executable"), str8_lit_comp("Executables"), RD_IconKind_Module}, -{str8_lit_comp("arguments"), str8_lit_comp("arguments"), str8_lit_comp("Arguments"), str8_lit_comp("Arguments"), RD_IconKind_Null}, -{str8_lit_comp("exe"), str8_lit_comp("exes"), str8_lit_comp("Executable"), str8_lit_comp("Executables"), RD_IconKind_Module}, -{str8_lit_comp("dbg"), str8_lit_comp("dbgs"), str8_lit_comp("Debug Info Path"), str8_lit_comp("Debug Info Paths"), RD_IconKind_Module}, -{str8_lit_comp("vaddr_range"), str8_lit_comp("vaddr_ranges"), str8_lit_comp("Virtual Address Range"), str8_lit_comp("Virtual Address Ranges"), RD_IconKind_Null}, -{str8_lit_comp("min"), str8_lit_comp("mins"), str8_lit_comp("Minimum"), str8_lit_comp("Minimums"), RD_IconKind_Null}, -{str8_lit_comp("max"), str8_lit_comp("maxs"), str8_lit_comp("Maximum"), str8_lit_comp("Maximums"), RD_IconKind_Null}, -{str8_lit_comp("working_directory"), str8_lit_comp("working_directories"), str8_lit_comp("Working Directory"), str8_lit_comp("Working Directories"), RD_IconKind_FolderClosedFilled}, -{str8_lit_comp("entry_point"), str8_lit_comp("entry_points"), str8_lit_comp("Entry Point"), str8_lit_comp("Entry Points"), RD_IconKind_Null}, -{str8_lit_comp("stdout_path"), str8_lit_comp("stdout_paths"), str8_lit_comp("Standard Output Path"), str8_lit_comp("Standard Output Paths"), RD_IconKind_Null}, -{str8_lit_comp("stderr_path"), str8_lit_comp("stderr_paths"), str8_lit_comp("Standard Error Path"), str8_lit_comp("Standard Error Paths"), RD_IconKind_Null}, -{str8_lit_comp("stdin_path"), str8_lit_comp("stdin_paths"), str8_lit_comp("Standard Input Path"), str8_lit_comp("Standard Input Paths"), RD_IconKind_Null}, -{str8_lit_comp("window"), str8_lit_comp("windows"), str8_lit_comp("Window"), str8_lit_comp("Windows"), RD_IconKind_Window}, -{str8_lit_comp("panel"), str8_lit_comp("panels"), str8_lit_comp("Panel"), str8_lit_comp("Panels"), RD_IconKind_Null}, -{str8_lit_comp("tab"), str8_lit_comp("tabs"), str8_lit_comp("Tab"), str8_lit_comp("Tabs"), RD_IconKind_Null}, -{str8_lit_comp("recent_project"), str8_lit_comp("recent_projects"), str8_lit_comp("Recent Project"), str8_lit_comp("Recent Projects"), RD_IconKind_Briefcase}, -{str8_lit_comp("src"), str8_lit_comp("srcs"), str8_lit_comp("Source"), str8_lit_comp("Sources"), RD_IconKind_Null}, -{str8_lit_comp("dst"), str8_lit_comp("dsts"), str8_lit_comp("Destination"), str8_lit_comp("Destinations"), RD_IconKind_Null}, -{str8_lit_comp("source"), str8_lit_comp("sources"), str8_lit_comp("Source"), str8_lit_comp("Sources"), RD_IconKind_Null}, -{str8_lit_comp("dest"), str8_lit_comp("dests"), str8_lit_comp("Destination"), str8_lit_comp("Destinations"), RD_IconKind_Null}, -{str8_lit_comp("conversion_task"), str8_lit_comp("conversion_tasks"), str8_lit_comp("Conversion Task"), str8_lit_comp("Conversion Tasks"), RD_IconKind_Null}, -{str8_lit_comp("conversion_fail"), str8_lit_comp("conversion_fails"), str8_lit_comp("Conversion Fail"), str8_lit_comp("Conversion Fails"), RD_IconKind_Null}, -{str8_lit_comp("lang"), str8_lit_comp("langs"), str8_lit_comp("Language"), str8_lit_comp("Languages"), RD_IconKind_Null}, -{str8_lit_comp("arch"), str8_lit_comp("archs"), str8_lit_comp("Architecture"), str8_lit_comp("Architectures"), RD_IconKind_Null}, -{str8_lit_comp("expr"), str8_lit_comp("exprs"), str8_lit_comp("Expression"), str8_lit_comp("Expressions"), RD_IconKind_Null}, -{str8_lit_comp("expression"), str8_lit_comp("expressions"), str8_lit_comp("Expression"), str8_lit_comp("Expressions"), RD_IconKind_Null}, -{str8_lit_comp("size"), str8_lit_comp("sizes"), str8_lit_comp("Size"), str8_lit_comp("Sizes"), RD_IconKind_Null}, -{str8_lit_comp("count"), str8_lit_comp("counts"), str8_lit_comp("Count"), str8_lit_comp("Counts"), RD_IconKind_Null}, -{str8_lit_comp("bool"), str8_lit_comp("bools"), str8_lit_comp("Boolean"), str8_lit_comp("Booleans"), RD_IconKind_Null}, -{str8_lit_comp("w"), str8_lit_comp("ws"), str8_lit_comp("Width"), str8_lit_comp("Widths"), RD_IconKind_Null}, -{str8_lit_comp("h"), str8_lit_comp("hs"), str8_lit_comp("Height"), str8_lit_comp("Heights"), RD_IconKind_Null}, -{str8_lit_comp("fmt"), str8_lit_comp("fmts"), str8_lit_comp("Format"), str8_lit_comp("Formats"), RD_IconKind_Null}, -{str8_lit_comp("addresses"), str8_lit_comp("addresses"), str8_lit_comp("Addresses"), str8_lit_comp("Addresses"), RD_IconKind_Null}, -{str8_lit_comp("code_bytes"), str8_lit_comp("code_bytes"), str8_lit_comp("Code Bytes"), str8_lit_comp("Code Bytes"), RD_IconKind_Null}, -{str8_lit_comp("vtx"), str8_lit_comp("vtxs"), str8_lit_comp("Vertex Buffer"), str8_lit_comp("Vertex Buffers"), RD_IconKind_Null}, -{str8_lit_comp("vtx_size"), str8_lit_comp("vtx_sizes"), str8_lit_comp("Vertex Buffer Size"), str8_lit_comp("Vertex Buffer Sizes"), RD_IconKind_Null}, -{str8_lit_comp("label"), str8_lit_comp("labels"), str8_lit_comp("Label"), str8_lit_comp("Labels"), RD_IconKind_Null}, -{str8_lit_comp("name"), str8_lit_comp("names"), str8_lit_comp("Name"), str8_lit_comp("Names"), RD_IconKind_Null}, -{str8_lit_comp("thread"), str8_lit_comp("threads"), str8_lit_comp("Thread"), str8_lit_comp("Threads"), RD_IconKind_Thread}, -{str8_lit_comp("threads"), str8_lit_comp(""), str8_lit_comp("Threads"), str8_lit_comp(""), RD_IconKind_Threads}, -{str8_lit_comp("process"), str8_lit_comp("processes"), str8_lit_comp("Process"), str8_lit_comp("Processes"), RD_IconKind_Scheduler}, -{str8_lit_comp("processes"), str8_lit_comp(""), str8_lit_comp("Processes"), str8_lit_comp(""), RD_IconKind_Scheduler}, -{str8_lit_comp("machine"), str8_lit_comp("machines"), str8_lit_comp("Machine"), str8_lit_comp("Machines"), RD_IconKind_Machine}, -{str8_lit_comp("module"), str8_lit_comp("modules"), str8_lit_comp("Module"), str8_lit_comp("Modules"), RD_IconKind_Module}, -{str8_lit_comp("getting_started"), str8_lit_comp(""), str8_lit_comp("Getting Started"), str8_lit_comp(""), RD_IconKind_QuestionMark}, -{str8_lit_comp("disasm"), str8_lit_comp(""), str8_lit_comp("Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, -{str8_lit_comp("text"), str8_lit_comp(""), str8_lit_comp("Text"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("type"), str8_lit_comp("types"), str8_lit_comp("Type"), str8_lit_comp("Types"), RD_IconKind_Null}, -{str8_lit_comp("procedure"), str8_lit_comp("procedures"), str8_lit_comp("Procedure"), str8_lit_comp("Procedures"), RD_IconKind_Null}, -{str8_lit_comp("global_variable"), str8_lit_comp("global_variables"), str8_lit_comp("Global Variable"), str8_lit_comp("Global Variables"), RD_IconKind_Null}, -{str8_lit_comp("global"), str8_lit_comp("globals"), str8_lit_comp("Global"), str8_lit_comp("Globals"), RD_IconKind_Null}, -{str8_lit_comp("thread_variable"), str8_lit_comp("thread_variables"), str8_lit_comp("Thread Variable"), str8_lit_comp("Thread Variables"), RD_IconKind_Null}, -{str8_lit_comp("thread_local"), str8_lit_comp("thread_locals"), str8_lit_comp("Thread Local"), str8_lit_comp("Thread Locals"), RD_IconKind_Null}, -{str8_lit_comp("call_stack"), str8_lit_comp("call_stacks"), str8_lit_comp("Call Stack"), str8_lit_comp("Call Stacks"), RD_IconKind_Thread}, -{str8_lit_comp("output"), str8_lit_comp("outputs"), str8_lit_comp("Output"), str8_lit_comp("Outputs"), RD_IconKind_List}, -{str8_lit_comp("scheduler"), str8_lit_comp("schedulers"), str8_lit_comp("Scheduler"), str8_lit_comp("Schedulers"), RD_IconKind_Scheduler}, -{str8_lit_comp("register"), str8_lit_comp("registers"), str8_lit_comp("Register"), str8_lit_comp("Registers"), RD_IconKind_Null}, -{str8_lit_comp("local"), str8_lit_comp("locals"), str8_lit_comp("Local"), str8_lit_comp("Locals"), RD_IconKind_Null}, -{str8_lit_comp("memory"), str8_lit_comp("memories"), str8_lit_comp("Memory"), str8_lit_comp("Memories"), RD_IconKind_Grid}, -{str8_lit_comp("hit_count"), str8_lit_comp("hit_counts"), str8_lit_comp("Hit Count"), str8_lit_comp("Hit Counts"), RD_IconKind_Null}, -{str8_lit_comp("enabled"), str8_lit_comp(""), str8_lit_comp("Enabled"), str8_lit_comp("Enabled"), RD_IconKind_Null}, -{str8_lit_comp("disabled"), str8_lit_comp(""), str8_lit_comp("Disabled"), str8_lit_comp("Disabled"), RD_IconKind_Null}, -{str8_lit_comp("debug_subprocesses"), str8_lit_comp(""), str8_lit_comp("Debug Subprocesses"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("environment"), str8_lit_comp("environments"), str8_lit_comp("Environment"), str8_lit_comp("Environments"), RD_IconKind_Null}, -{str8_lit_comp("frozen"), str8_lit_comp(""), str8_lit_comp("Frozen"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("id"), str8_lit_comp("ids"), str8_lit_comp("ID"), str8_lit_comp("IDs"), RD_IconKind_Null}, -{str8_lit_comp("last_modified_time"), str8_lit_comp("last_modified_times"), str8_lit_comp("Last Modified Time"), str8_lit_comp("Last Modified Times"), RD_IconKind_Null}, -{str8_lit_comp("creation_time"), str8_lit_comp("creation_times"), str8_lit_comp("Creation Time"), str8_lit_comp("Creation Times"), RD_IconKind_Null}, -{str8_lit_comp("data"), str8_lit_comp("datas"), str8_lit_comp("Data"), str8_lit_comp("Datas"), RD_IconKind_Null}, -{str8_lit_comp("unattached_processes"), str8_lit_comp(""), str8_lit_comp("Unattached Processes"), str8_lit_comp(""), RD_IconKind_Scheduler}, -{str8_lit_comp("user"), str8_lit_comp("users"), str8_lit_comp("User"), str8_lit_comp("Users"), RD_IconKind_Person}, -{str8_lit_comp("project"), str8_lit_comp("projects"), str8_lit_comp("Project"), str8_lit_comp("Projects"), RD_IconKind_Briefcase}, -{str8_lit_comp("recent_project"), str8_lit_comp("recent_projects"), str8_lit_comp("Recent Project"), str8_lit_comp("Recent Projects"), RD_IconKind_Briefcase}, -{str8_lit_comp("recent_file"), str8_lit_comp("recent_files"), str8_lit_comp("Recent File"), str8_lit_comp("Recent Files"), RD_IconKind_FileOutline}, -{str8_lit_comp("show_addresses"), str8_lit_comp(""), str8_lit_comp("Show Addresses"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("show_code_bytes"), str8_lit_comp(""), str8_lit_comp("Show Code Bytes"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("show_source_lines"), str8_lit_comp(""), str8_lit_comp("Show Source Lines"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("show_symbol_names"), str8_lit_comp(""), str8_lit_comp("Show Symbol Names"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("show_line_numbers"), str8_lit_comp(""), str8_lit_comp("Show Line Numbers"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("syntax"), str8_lit_comp("syntaxes"), str8_lit_comp("Syntax"), str8_lit_comp("Syntaxes"), RD_IconKind_Null}, -{str8_lit_comp("num_columns"), str8_lit_comp(""), str8_lit_comp("Number of Columns"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("bytes_per_cell"), str8_lit_comp(""), str8_lit_comp("Bytes Per Cell"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("bitmap"), str8_lit_comp("bitmaps"), str8_lit_comp("Bitmap"), str8_lit_comp("Bitmaps"), RD_IconKind_Bitmap}, -{str8_lit_comp("geo3d"), str8_lit_comp(""), str8_lit_comp("Geometry (3D)"), str8_lit_comp(""), RD_IconKind_Cube}, -{str8_lit_comp("address_range_size"), str8_lit_comp("address_range_sizes"), str8_lit_comp("Address Range Size"), str8_lit_comp("Address Range Sizes"), RD_IconKind_Null}, -{str8_lit_comp("break_on_read"), str8_lit_comp(""), str8_lit_comp("Break On Read"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("break_on_write"), str8_lit_comp(""), str8_lit_comp("Break On Write"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("break_on_execute"), str8_lit_comp(""), str8_lit_comp("Break On Execution"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("yaw"), str8_lit_comp(""), str8_lit_comp("Yaw"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("pitch"), str8_lit_comp(""), str8_lit_comp("Pitch"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("zoom"), str8_lit_comp(""), str8_lit_comp("Zoom"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("font_size"), str8_lit_comp(""), str8_lit_comp("Font Size"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("row_height"), str8_lit_comp(""), str8_lit_comp("Row Height"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("tab_height"), str8_lit_comp(""), str8_lit_comp("Tab Height"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("rgba"), str8_lit_comp(""), str8_lit_comp("RGBA"), str8_lit_comp(""), RD_IconKind_Palette}, -{str8_lit_comp("path"), str8_lit_comp(""), str8_lit_comp("Path"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("guid"), str8_lit_comp(""), str8_lit_comp("GUID"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("peek_type"), str8_lit_comp("peek_types"), str8_lit_comp("Peek Type"), str8_lit_comp("Peek Types"), RD_IconKind_Null}, -{str8_lit_comp("launch_and_run"), str8_lit_comp(""), str8_lit_comp("Launch and Run"), str8_lit_comp(""), RD_IconKind_Play}, -{str8_lit_comp("launch_and_step_into"), str8_lit_comp(""), str8_lit_comp("Launch and Step Into"), str8_lit_comp(""), RD_IconKind_PlayStepForward}, -{str8_lit_comp("kill"), str8_lit_comp(""), str8_lit_comp("Kill"), str8_lit_comp(""), RD_IconKind_X}, -{str8_lit_comp("kill_all"), str8_lit_comp(""), str8_lit_comp("Kill All"), str8_lit_comp(""), RD_IconKind_Stop}, -{str8_lit_comp("detach"), str8_lit_comp(""), str8_lit_comp("Detach"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("continue"), str8_lit_comp(""), str8_lit_comp("Continue"), str8_lit_comp(""), RD_IconKind_Play}, -{str8_lit_comp("step_into_inst"), str8_lit_comp(""), str8_lit_comp("Step Into (Assembly)"), str8_lit_comp(""), RD_IconKind_StepInto}, -{str8_lit_comp("step_over_inst"), str8_lit_comp(""), str8_lit_comp("Step Over (Assembly)"), str8_lit_comp(""), RD_IconKind_StepOver}, -{str8_lit_comp("step_into_line"), str8_lit_comp(""), str8_lit_comp("Step Into (Line)"), str8_lit_comp(""), RD_IconKind_StepInto}, -{str8_lit_comp("step_over_line"), str8_lit_comp(""), str8_lit_comp("Step Over (Line)"), str8_lit_comp(""), RD_IconKind_StepOver}, -{str8_lit_comp("step_out"), str8_lit_comp(""), str8_lit_comp("Step Out"), str8_lit_comp(""), RD_IconKind_StepOut}, -{str8_lit_comp("halt"), str8_lit_comp(""), str8_lit_comp("Halt"), str8_lit_comp(""), RD_IconKind_Pause}, -{str8_lit_comp("soft_halt_refresh"), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), str8_lit_comp(""), RD_IconKind_Refresh}, -{str8_lit_comp("set_thread_ip"), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("run_to_line"), str8_lit_comp(""), str8_lit_comp("Run To Line"), str8_lit_comp(""), RD_IconKind_Play}, -{str8_lit_comp("run"), str8_lit_comp(""), str8_lit_comp("Run"), str8_lit_comp(""), RD_IconKind_Play}, -{str8_lit_comp("restart"), str8_lit_comp(""), str8_lit_comp("Restart"), str8_lit_comp(""), RD_IconKind_Redo}, -{str8_lit_comp("step_into"), str8_lit_comp(""), str8_lit_comp("Step Into"), str8_lit_comp(""), RD_IconKind_StepInto}, -{str8_lit_comp("step_over"), str8_lit_comp(""), str8_lit_comp("Step Over"), str8_lit_comp(""), RD_IconKind_StepOver}, -{str8_lit_comp("freeze_thread"), str8_lit_comp(""), str8_lit_comp("Freeze Thread"), str8_lit_comp(""), RD_IconKind_Locked}, -{str8_lit_comp("thaw_thread"), str8_lit_comp(""), str8_lit_comp("Thaw Thread"), str8_lit_comp(""), RD_IconKind_Unlocked}, -{str8_lit_comp("freeze_process"), str8_lit_comp(""), str8_lit_comp("Freeze Process"), str8_lit_comp(""), RD_IconKind_Locked}, -{str8_lit_comp("thaw_process"), str8_lit_comp(""), str8_lit_comp("Thaw Process"), str8_lit_comp(""), RD_IconKind_Unlocked}, -{str8_lit_comp("freeze_machine"), str8_lit_comp(""), str8_lit_comp("Freeze Machine"), str8_lit_comp(""), RD_IconKind_Locked}, -{str8_lit_comp("thaw_machine"), str8_lit_comp(""), str8_lit_comp("Thaw Machine"), str8_lit_comp(""), RD_IconKind_Unlocked}, -{str8_lit_comp("freeze_local_machine"), str8_lit_comp(""), str8_lit_comp("Freeze Local Machine"), str8_lit_comp(""), RD_IconKind_Machine}, -{str8_lit_comp("thaw_local_machine"), str8_lit_comp(""), str8_lit_comp("Thaw Local Machine"), str8_lit_comp(""), RD_IconKind_Machine}, -{str8_lit_comp("freeze_entity"), str8_lit_comp(""), str8_lit_comp("Freeze Entity"), str8_lit_comp(""), RD_IconKind_Unlocked}, -{str8_lit_comp("thaw_entity"), str8_lit_comp(""), str8_lit_comp("Thaw Entity"), str8_lit_comp(""), RD_IconKind_Locked}, -{str8_lit_comp("set_entity_color"), str8_lit_comp(""), str8_lit_comp("Set Entity Color"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("set_entity_name"), str8_lit_comp(""), str8_lit_comp("Set Entity Name"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("attach"), str8_lit_comp(""), str8_lit_comp("Attach"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("open_crash_dump"), str8_lit_comp(""), str8_lit_comp("Open Crash Dump"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("exit"), str8_lit_comp(""), str8_lit_comp("Exit"), str8_lit_comp(""), RD_IconKind_X}, -{str8_lit_comp("open_palette"), str8_lit_comp(""), str8_lit_comp("Open Palette"), str8_lit_comp(""), RD_IconKind_List}, -{str8_lit_comp("run_command"), str8_lit_comp(""), str8_lit_comp("Run Command"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp("Run External Driver Text Command"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Thread}, -{str8_lit_comp("select_unwind"), str8_lit_comp(""), str8_lit_comp("Select Unwind"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("up_one_frame"), str8_lit_comp(""), str8_lit_comp("Up One Frame"), str8_lit_comp(""), RD_IconKind_UpArrow}, -{str8_lit_comp("down_one_frame"), str8_lit_comp(""), str8_lit_comp("Down One Frame"), str8_lit_comp(""), RD_IconKind_DownArrow}, -{str8_lit_comp("select_entity"), str8_lit_comp(""), str8_lit_comp("Select"), str8_lit_comp(""), RD_IconKind_RadioHollow}, -{str8_lit_comp("deselect_entity"), str8_lit_comp(""), str8_lit_comp("Deselect"), str8_lit_comp(""), RD_IconKind_RadioFilled}, -{str8_lit_comp("inc_window_font_size"), str8_lit_comp(""), str8_lit_comp("Increase Window Font Size"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("dec_window_font_size"), str8_lit_comp(""), str8_lit_comp("Decrease Window Font Size"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("inc_view_font_size"), str8_lit_comp(""), str8_lit_comp("Increase View Font Size"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("dec_view_font_size"), str8_lit_comp(""), str8_lit_comp("Decrease View Font Size"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("open_window"), str8_lit_comp(""), str8_lit_comp("Open New Window"), str8_lit_comp(""), RD_IconKind_Window}, -{str8_lit_comp("window_settings"), str8_lit_comp(""), str8_lit_comp("Window Settings"), str8_lit_comp(""), RD_IconKind_Gear}, -{str8_lit_comp("close_window"), str8_lit_comp(""), str8_lit_comp("Close Window"), str8_lit_comp(""), RD_IconKind_Window}, -{str8_lit_comp("toggle_fullscreen"), str8_lit_comp(""), str8_lit_comp("Toggle Fullscreen"), str8_lit_comp(""), RD_IconKind_Window}, -{str8_lit_comp("bring_to_front"), str8_lit_comp(""), str8_lit_comp("Bring To Front"), str8_lit_comp(""), RD_IconKind_Window}, -{str8_lit_comp("popup_accept"), str8_lit_comp(""), str8_lit_comp("Popup Accept"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("popup_cancel"), str8_lit_comp(""), str8_lit_comp("Popup Cancel"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("reset_to_default_bindings"), str8_lit_comp(""), str8_lit_comp("Reset To Default Bindings"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("reset_to_default_panels"), str8_lit_comp(""), str8_lit_comp("Reset To Default Panel Layout"), str8_lit_comp(""), RD_IconKind_Window}, -{str8_lit_comp("reset_to_compact_panels"), str8_lit_comp(""), str8_lit_comp("Reset To Compact Panel Layout"), str8_lit_comp(""), RD_IconKind_Window}, -{str8_lit_comp("reset_to_simple_panels"), str8_lit_comp(""), str8_lit_comp("Reset To Simple Panel Layout"), str8_lit_comp(""), RD_IconKind_Window}, -{str8_lit_comp("new_panel_left"), str8_lit_comp(""), str8_lit_comp("Split Panel Left"), str8_lit_comp(""), RD_IconKind_XSplit}, -{str8_lit_comp("new_panel_up"), str8_lit_comp(""), str8_lit_comp("Split Panel Up"), str8_lit_comp(""), RD_IconKind_YSplit}, -{str8_lit_comp("new_panel_right"), str8_lit_comp(""), str8_lit_comp("Split Panel Right"), str8_lit_comp(""), RD_IconKind_XSplit}, -{str8_lit_comp("new_panel_down"), str8_lit_comp(""), str8_lit_comp("Split Panel Down"), str8_lit_comp(""), RD_IconKind_YSplit}, -{str8_lit_comp("split_panel"), str8_lit_comp(""), str8_lit_comp("Split Panel"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("rotate_panel_columns"), str8_lit_comp(""), str8_lit_comp("Rotate Panel Columns"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("next_panel"), str8_lit_comp(""), str8_lit_comp("Focus Next Panel"), str8_lit_comp(""), RD_IconKind_RightArrow}, -{str8_lit_comp("prev_panel"), str8_lit_comp(""), str8_lit_comp("Focus Previous Panel"), str8_lit_comp(""), RD_IconKind_LeftArrow}, -{str8_lit_comp("focus_panel"), str8_lit_comp(""), str8_lit_comp("Focus Panel"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("focus_panel_right"), str8_lit_comp(""), str8_lit_comp("Focus Panel Right"), str8_lit_comp(""), RD_IconKind_RightArrow}, -{str8_lit_comp("focus_panel_left"), str8_lit_comp(""), str8_lit_comp("Focus Panel Left"), str8_lit_comp(""), RD_IconKind_LeftArrow}, -{str8_lit_comp("focus_panel_up"), str8_lit_comp(""), str8_lit_comp("Focus Panel Up"), str8_lit_comp(""), RD_IconKind_UpArrow}, -{str8_lit_comp("focus_panel_down"), str8_lit_comp(""), str8_lit_comp("Focus Panel Down"), str8_lit_comp(""), RD_IconKind_DownArrow}, -{str8_lit_comp("undo"), str8_lit_comp(""), str8_lit_comp("Undo"), str8_lit_comp(""), RD_IconKind_Undo}, -{str8_lit_comp("redo"), str8_lit_comp(""), str8_lit_comp("Redo"), str8_lit_comp(""), RD_IconKind_Redo}, -{str8_lit_comp("go_back"), str8_lit_comp(""), str8_lit_comp("Go Back"), str8_lit_comp(""), RD_IconKind_LeftArrow}, -{str8_lit_comp("go_forward"), str8_lit_comp(""), str8_lit_comp("Go Forward"), str8_lit_comp(""), RD_IconKind_RightArrow}, -{str8_lit_comp("close_panel"), str8_lit_comp(""), str8_lit_comp("Close Panel"), str8_lit_comp(""), RD_IconKind_ClosePanel}, -{str8_lit_comp("focus_tab"), str8_lit_comp(""), str8_lit_comp("Focus Tab"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("next_tab"), str8_lit_comp(""), str8_lit_comp("Focus Next Tab"), str8_lit_comp(""), RD_IconKind_RightArrow}, -{str8_lit_comp("prev_tab"), str8_lit_comp(""), str8_lit_comp("Focus Previous Tab"), str8_lit_comp(""), RD_IconKind_LeftArrow}, -{str8_lit_comp("move_tab_right"), str8_lit_comp(""), str8_lit_comp("Move Tab Right"), str8_lit_comp(""), RD_IconKind_RightArrow}, -{str8_lit_comp("move_tab_left"), str8_lit_comp(""), str8_lit_comp("Move Tab Left"), str8_lit_comp(""), RD_IconKind_LeftArrow}, -{str8_lit_comp("open_tab"), str8_lit_comp(""), str8_lit_comp("Open New Tab"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("build_tab"), str8_lit_comp(""), str8_lit_comp("Build Tab"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("duplicate_tab"), str8_lit_comp(""), str8_lit_comp("Duplicate Tab"), str8_lit_comp(""), RD_IconKind_Duplicate}, -{str8_lit_comp("copy_tab_full_path"), str8_lit_comp(""), str8_lit_comp("Copy Full Path"), str8_lit_comp(""), RD_IconKind_Clipboard}, -{str8_lit_comp("close_tab"), str8_lit_comp(""), str8_lit_comp("Close Tab"), str8_lit_comp(""), RD_IconKind_X}, -{str8_lit_comp("move_view"), str8_lit_comp(""), str8_lit_comp("Move View"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("tab_bar_top"), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Top"), str8_lit_comp(""), RD_IconKind_UpArrow}, -{str8_lit_comp("tab_bar_bottom"), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Bottom"), str8_lit_comp(""), RD_IconKind_DownArrow}, -{str8_lit_comp("tab_settings"), str8_lit_comp(""), str8_lit_comp("Selected Tab Settings"), str8_lit_comp(""), RD_IconKind_Gear}, -{str8_lit_comp("set_current_path"), str8_lit_comp(""), str8_lit_comp("Set Current Path"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("open"), str8_lit_comp(""), str8_lit_comp("Open"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp(""), str8_lit_comp("Open Source File From Debug Info"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("switch_to_partner_file"), str8_lit_comp(""), str8_lit_comp("Switch To Partner File"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("show_file_in_explorer"), str8_lit_comp(""), str8_lit_comp("Show File In Explorer"), str8_lit_comp(""), RD_IconKind_FolderClosedFilled}, -{str8_lit_comp("go_to_disassembly"), str8_lit_comp(""), str8_lit_comp("Go To Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, -{str8_lit_comp("go_to_source"), str8_lit_comp(""), str8_lit_comp("Go To Source"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("set_file_replacement_path"), str8_lit_comp(""), str8_lit_comp("Set File Replacement Path"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("new_user"), str8_lit_comp(""), str8_lit_comp("New User"), str8_lit_comp(""), RD_IconKind_Add}, -{str8_lit_comp("new_project"), str8_lit_comp(""), str8_lit_comp("New Project"), str8_lit_comp(""), RD_IconKind_Add}, -{str8_lit_comp("open_user"), str8_lit_comp(""), str8_lit_comp("Open User"), str8_lit_comp(""), RD_IconKind_Person}, -{str8_lit_comp("open_project"), str8_lit_comp(""), str8_lit_comp("Open Project"), str8_lit_comp(""), RD_IconKind_Briefcase}, -{str8_lit_comp("open_recent_project"), str8_lit_comp(""), str8_lit_comp("Open Recent Project"), str8_lit_comp(""), RD_IconKind_Briefcase}, -{str8_lit_comp("save_user"), str8_lit_comp(""), str8_lit_comp("Save User"), str8_lit_comp(""), RD_IconKind_Save}, -{str8_lit_comp("save_project"), str8_lit_comp(""), str8_lit_comp("Save Project"), str8_lit_comp(""), RD_IconKind_Save}, -{str8_lit_comp("record_user_as_last_opened"), str8_lit_comp(""), str8_lit_comp("Record User As Last Opened"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("record_project_in_user"), str8_lit_comp(""), str8_lit_comp("Records Project In User"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("write_user_data"), str8_lit_comp(""), str8_lit_comp("Write User Data"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("write_project_data"), str8_lit_comp(""), str8_lit_comp("Write Project Data"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("user_settings"), str8_lit_comp(""), str8_lit_comp("User Settings"), str8_lit_comp(""), RD_IconKind_Gear}, -{str8_lit_comp("project_settings"), str8_lit_comp(""), str8_lit_comp("Project Settings"), str8_lit_comp(""), RD_IconKind_Gear}, -{str8_lit_comp("edit"), str8_lit_comp(""), str8_lit_comp("Edit"), str8_lit_comp(""), RD_IconKind_Pencil}, -{str8_lit_comp("accept"), str8_lit_comp(""), str8_lit_comp("Accept"), str8_lit_comp(""), RD_IconKind_CheckFilled}, -{str8_lit_comp("cancel"), str8_lit_comp(""), str8_lit_comp("Cancel"), str8_lit_comp(""), RD_IconKind_X}, -{str8_lit_comp("focus_menu"), str8_lit_comp(""), str8_lit_comp("Focus Menu"), str8_lit_comp(""), RD_IconKind_List}, -{str8_lit_comp("move_left"), str8_lit_comp(""), str8_lit_comp("Move Left"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_right"), str8_lit_comp(""), str8_lit_comp("Move Right"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up"), str8_lit_comp(""), str8_lit_comp("Move Up"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down"), str8_lit_comp(""), str8_lit_comp("Move Down"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_left_select"), str8_lit_comp(""), str8_lit_comp("Move Left Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_right_select"), str8_lit_comp(""), str8_lit_comp("Move Right Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up_select"), str8_lit_comp(""), str8_lit_comp("Move Up Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down_select"), str8_lit_comp(""), str8_lit_comp("Move Down Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_left_chunk"), str8_lit_comp(""), str8_lit_comp("Move Left Chunk"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_right_chunk"), str8_lit_comp(""), str8_lit_comp("Move Right Chunk"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up_chunk"), str8_lit_comp(""), str8_lit_comp("Move Up Chunk"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down_chunk"), str8_lit_comp(""), str8_lit_comp("Move Down Chunk"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up_page"), str8_lit_comp(""), str8_lit_comp("Move Up Page"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down_page"), str8_lit_comp(""), str8_lit_comp("Move Down Page"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up_whole"), str8_lit_comp(""), str8_lit_comp("Move Up Whole"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down_whole"), str8_lit_comp(""), str8_lit_comp("Move Down Whole"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_left_chunk_select"), str8_lit_comp(""), str8_lit_comp("Move Left Chunk Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_right_chunk_select"), str8_lit_comp(""), str8_lit_comp("Move Right Chunk Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up_chunk_select"), str8_lit_comp(""), str8_lit_comp("Move Up Chunk Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down_chunk_select"), str8_lit_comp(""), str8_lit_comp("Move Down Chunk Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up_page_select"), str8_lit_comp(""), str8_lit_comp("Move Up Page Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down_page_select"), str8_lit_comp(""), str8_lit_comp("Move Down Page Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up_whole_select"), str8_lit_comp(""), str8_lit_comp("Move Up Whole Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down_whole_select"), str8_lit_comp(""), str8_lit_comp("Move Down Whole Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_up_reorder"), str8_lit_comp(""), str8_lit_comp("Move Up Reorder"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_down_reorder"), str8_lit_comp(""), str8_lit_comp("Move Down Reorder"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_home"), str8_lit_comp(""), str8_lit_comp("Move Home"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_end"), str8_lit_comp(""), str8_lit_comp("Move End"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_home_select"), str8_lit_comp(""), str8_lit_comp("Move Home Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_end_select"), str8_lit_comp(""), str8_lit_comp("Move End Select"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("select_all"), str8_lit_comp(""), str8_lit_comp("Select All"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("delete_single"), str8_lit_comp(""), str8_lit_comp("Delete Single"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("delete_chunk"), str8_lit_comp(""), str8_lit_comp("Delete Chunk"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("backspace_single"), str8_lit_comp(""), str8_lit_comp("Backspace Single"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("backspace_chunk"), str8_lit_comp(""), str8_lit_comp("Backspace Chunk"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("copy"), str8_lit_comp(""), str8_lit_comp("Copy"), str8_lit_comp(""), RD_IconKind_Clipboard}, -{str8_lit_comp("cut"), str8_lit_comp(""), str8_lit_comp("Cut"), str8_lit_comp(""), RD_IconKind_Clipboard}, -{str8_lit_comp("paste"), str8_lit_comp(""), str8_lit_comp("Paste"), str8_lit_comp(""), RD_IconKind_Clipboard}, -{str8_lit_comp("insert_text"), str8_lit_comp(""), str8_lit_comp("Insert Text"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_next"), str8_lit_comp(""), str8_lit_comp("Move Next"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("move_prev"), str8_lit_comp(""), str8_lit_comp("Move Previous"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("goto_line"), str8_lit_comp(""), str8_lit_comp("Go To Line"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("goto_address"), str8_lit_comp(""), str8_lit_comp("Go To Address"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("center_cursor"), str8_lit_comp(""), str8_lit_comp("Center Cursor"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("contain_cursor"), str8_lit_comp(""), str8_lit_comp("Contain Cursor"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("find_next"), str8_lit_comp(""), str8_lit_comp("Find Next"), str8_lit_comp(""), RD_IconKind_Find}, -{str8_lit_comp("find_prev"), str8_lit_comp(""), str8_lit_comp("Find Previous"), str8_lit_comp(""), RD_IconKind_Find}, -{str8_lit_comp("find_thread"), str8_lit_comp(""), str8_lit_comp("Find Thread"), str8_lit_comp(""), RD_IconKind_Find}, -{str8_lit_comp("find_selected_thread"), str8_lit_comp(""), str8_lit_comp("Find Selected Thread"), str8_lit_comp(""), RD_IconKind_Find}, -{str8_lit_comp("goto_name"), str8_lit_comp(""), str8_lit_comp("Go To Name"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("goto_name_at_cursor"), str8_lit_comp(""), str8_lit_comp("Go To Name At Cursor"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("toggle_watch_expr"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Cursor"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Mouse"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("enable_cfg"), str8_lit_comp(""), str8_lit_comp("Enable"), str8_lit_comp(""), RD_IconKind_CheckHollow}, -{str8_lit_comp("disable_cfg"), str8_lit_comp(""), str8_lit_comp("Disable"), str8_lit_comp(""), RD_IconKind_CheckFilled}, -{str8_lit_comp("select_cfg"), str8_lit_comp(""), str8_lit_comp("Select"), str8_lit_comp(""), RD_IconKind_RadioHollow}, -{str8_lit_comp("deselect_cfg"), str8_lit_comp(""), str8_lit_comp("Deselect"), str8_lit_comp(""), RD_IconKind_RadioFilled}, -{str8_lit_comp("remove_cfg"), str8_lit_comp(""), str8_lit_comp("Remove"), str8_lit_comp(""), RD_IconKind_Trash}, -{str8_lit_comp("name_cfg"), str8_lit_comp(""), str8_lit_comp("Name"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("condition_cfg"), str8_lit_comp(""), str8_lit_comp("Condition"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("duplicate_cfg"), str8_lit_comp(""), str8_lit_comp("Duplicate"), str8_lit_comp(""), RD_IconKind_Duplicate}, -{str8_lit_comp("relocate_cfg"), str8_lit_comp(""), str8_lit_comp("Relocate"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("save_cfg_to_project"), str8_lit_comp(""), str8_lit_comp("Save To Project"), str8_lit_comp(""), RD_IconKind_Briefcase}, -{str8_lit_comp("add_breakpoint"), str8_lit_comp(""), str8_lit_comp("Add Line Breakpoint"), str8_lit_comp(""), RD_IconKind_CircleFilled}, -{str8_lit_comp("add_address_breakpoint"), str8_lit_comp(""), str8_lit_comp("Add Address Breakpoint"), str8_lit_comp(""), RD_IconKind_CircleFilled}, -{str8_lit_comp("add_function_breakpoint"), str8_lit_comp(""), str8_lit_comp("Add Function Breakpoint"), str8_lit_comp(""), RD_IconKind_CircleFilled}, -{str8_lit_comp("toggle_breakpoint"), str8_lit_comp(""), str8_lit_comp("Toggle Line Breakpoint"), str8_lit_comp(""), RD_IconKind_CircleFilled}, -{str8_lit_comp("remove_breakpoint"), str8_lit_comp(""), str8_lit_comp("Remove Breakpoint"), str8_lit_comp(""), RD_IconKind_Trash}, -{str8_lit_comp("enable_breakpoint"), str8_lit_comp(""), str8_lit_comp("Enable Breakpoint"), str8_lit_comp(""), RD_IconKind_CheckFilled}, -{str8_lit_comp("disable_breakpoint"), str8_lit_comp(""), str8_lit_comp("Disable Breakpoint"), str8_lit_comp(""), RD_IconKind_CheckHollow}, -{str8_lit_comp("clear_breakpoints"), str8_lit_comp(""), str8_lit_comp("Clear Breakpoints"), str8_lit_comp(""), RD_IconKind_Trash}, -{str8_lit_comp("list_breakpoints"), str8_lit_comp(""), str8_lit_comp("List Breakpoints"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("clear_output"), str8_lit_comp(""), str8_lit_comp("Clear Output"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("add_watch_pin"), str8_lit_comp(""), str8_lit_comp("Add Watch Pin"), str8_lit_comp(""), RD_IconKind_Pin}, -{str8_lit_comp("toggle_watch_pin"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin"), str8_lit_comp(""), RD_IconKind_Pin}, -{str8_lit_comp("load_debug_info"), str8_lit_comp(""), str8_lit_comp("Load Debug Info"), str8_lit_comp(""), RD_IconKind_Module}, -{str8_lit_comp("unload_debug_info"), str8_lit_comp(""), str8_lit_comp("Unload Debug Info"), str8_lit_comp(""), RD_IconKind_Module}, -{str8_lit_comp("add_type_view"), str8_lit_comp(""), str8_lit_comp("Add Type View"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("add_file_path_map"), str8_lit_comp(""), str8_lit_comp("Add File Path Map"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("edit_user_theme"), str8_lit_comp(""), str8_lit_comp("Edit User Theme"), str8_lit_comp(""), RD_IconKind_Palette}, -{str8_lit_comp("edit_project_theme"), str8_lit_comp(""), str8_lit_comp("Edit Project Theme"), str8_lit_comp(""), RD_IconKind_Palette}, -{str8_lit_comp("add_theme_color"), str8_lit_comp(""), str8_lit_comp("Add Theme Color"), str8_lit_comp(""), RD_IconKind_Palette}, -{str8_lit_comp("fork_theme"), str8_lit_comp(""), str8_lit_comp("Fork Theme"), str8_lit_comp(""), RD_IconKind_Palette}, -{str8_lit_comp("save_theme"), str8_lit_comp(""), str8_lit_comp("Save Theme"), str8_lit_comp(""), RD_IconKind_Save}, -{str8_lit_comp("save_and_set_theme"), str8_lit_comp(""), str8_lit_comp("Save And Set Theme"), str8_lit_comp(""), RD_IconKind_Save}, -{str8_lit_comp("set_next_statement"), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), str8_lit_comp(""), RD_IconKind_RightArrow}, -{str8_lit_comp("add_target"), str8_lit_comp(""), str8_lit_comp("Add Target"), str8_lit_comp(""), RD_IconKind_Target}, -{str8_lit_comp("select_target"), str8_lit_comp(""), str8_lit_comp("Select Target"), str8_lit_comp(""), RD_IconKind_Target}, -{str8_lit_comp("enable_target"), str8_lit_comp(""), str8_lit_comp("Enable Target"), str8_lit_comp(""), RD_IconKind_CheckFilled}, -{str8_lit_comp("disable_target"), str8_lit_comp(""), str8_lit_comp("Disable Target"), str8_lit_comp(""), RD_IconKind_CheckHollow}, -{str8_lit_comp("remove_target"), str8_lit_comp(""), str8_lit_comp("Remove Target"), str8_lit_comp(""), RD_IconKind_Trash}, -{str8_lit_comp("register_as_jit_debugger"), str8_lit_comp(""), str8_lit_comp("Register As Just-In-Time (JIT) Debugger"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("find_code_location"), str8_lit_comp(""), str8_lit_comp("Find Code Location"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("search"), str8_lit_comp(""), str8_lit_comp("Search"), str8_lit_comp(""), RD_IconKind_Find}, -{str8_lit_comp("search_backwards"), str8_lit_comp(""), str8_lit_comp("Search Backwards"), str8_lit_comp(""), RD_IconKind_Find}, -{str8_lit_comp("pick_file"), str8_lit_comp(""), str8_lit_comp("Pick File"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("pick_folder"), str8_lit_comp(""), str8_lit_comp("Pick Folder"), str8_lit_comp(""), RD_IconKind_FolderOpenFilled}, -{str8_lit_comp("pick_file_or_folder"), str8_lit_comp(""), str8_lit_comp("Pick File/Folder"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("push_query"), str8_lit_comp(""), str8_lit_comp("Push Query"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("complete_query"), str8_lit_comp(""), str8_lit_comp("Complete Query"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("cancel_query"), str8_lit_comp(""), str8_lit_comp("Cancel Query"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("update_query"), str8_lit_comp(""), str8_lit_comp("Update Query"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("open_event_buffer"), str8_lit_comp(""), str8_lit_comp("Open Event Buffer"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("close_event_buffer"), str8_lit_comp(""), str8_lit_comp("Close Event Buffer"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("toggle_dev_menu"), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("log_marker"), str8_lit_comp(""), str8_lit_comp("Log Marker"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("watches"), str8_lit_comp(""), str8_lit_comp("Watch"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("locals"), str8_lit_comp(""), str8_lit_comp("Locals"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("registers"), str8_lit_comp(""), str8_lit_comp("Registers"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("globals"), str8_lit_comp(""), str8_lit_comp("Globals"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("thread_locals"), str8_lit_comp(""), str8_lit_comp("Thread Locals"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("types"), str8_lit_comp(""), str8_lit_comp("Types"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("procedures"), str8_lit_comp(""), str8_lit_comp("Procedures"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("call_stack"), str8_lit_comp(""), str8_lit_comp("Call Stack"), str8_lit_comp(""), RD_IconKind_Thread}, -{str8_lit_comp("targets"), str8_lit_comp(""), str8_lit_comp("Targets"), str8_lit_comp(""), RD_IconKind_Target}, -{str8_lit_comp("breakpoints"), str8_lit_comp(""), str8_lit_comp("Breakpoints"), str8_lit_comp(""), RD_IconKind_CircleFilled}, -{str8_lit_comp("watch_pins"), str8_lit_comp(""), str8_lit_comp("Watch Pins"), str8_lit_comp(""), RD_IconKind_Pin}, -{str8_lit_comp("debug_infos"), str8_lit_comp(""), str8_lit_comp("Debug Info"), str8_lit_comp(""), RD_IconKind_Module}, -{str8_lit_comp("threads"), str8_lit_comp(""), str8_lit_comp("Threads"), str8_lit_comp(""), RD_IconKind_Threads}, -{str8_lit_comp("processes"), str8_lit_comp(""), str8_lit_comp("Processes"), str8_lit_comp(""), RD_IconKind_Scheduler}, -{str8_lit_comp("machines"), str8_lit_comp(""), str8_lit_comp("Machines"), str8_lit_comp(""), RD_IconKind_Machine}, -{str8_lit_comp("modules"), str8_lit_comp(""), str8_lit_comp("Modules"), str8_lit_comp(""), RD_IconKind_Module}, -{str8_lit_comp("file_path_maps"), str8_lit_comp(""), str8_lit_comp("File Path Map"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("type_views"), str8_lit_comp(""), str8_lit_comp("Type Views"), str8_lit_comp(""), RD_IconKind_Binoculars}, -{str8_lit_comp("output"), str8_lit_comp(""), str8_lit_comp("Output"), str8_lit_comp(""), RD_IconKind_List}, -{str8_lit_comp("text"), str8_lit_comp(""), str8_lit_comp("Text"), str8_lit_comp(""), RD_IconKind_FileOutline}, -{str8_lit_comp("disasm"), str8_lit_comp(""), str8_lit_comp("Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, -{str8_lit_comp("memory"), str8_lit_comp(""), str8_lit_comp("Memory"), str8_lit_comp(""), RD_IconKind_Grid}, -{str8_lit_comp("bitmap"), str8_lit_comp(""), str8_lit_comp("Bitmap"), str8_lit_comp(""), RD_IconKind_Bitmap}, -{str8_lit_comp("color"), str8_lit_comp(""), str8_lit_comp("Color"), str8_lit_comp(""), RD_IconKind_Palette}, -{str8_lit_comp("geo3d"), str8_lit_comp(""), str8_lit_comp("Geometry (3D)"), str8_lit_comp(""), RD_IconKind_Cube}, -}; - -RD_NameSchemaInfo rd_name_schema_info_table[39] = -{ -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, -{str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, -{str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, -{str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, -{str8_lit_comp("tab"), 0, str8_lit_comp("@row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\nx:\n{\n @override @display_name('Tab Font Size') @description(\"Controls the tab's font size.\") @no_callee_helper\n 'font_size': @range[6, 72] u64,\n}\n")}, -{str8_lit_comp("bin"), 1, str8_lit_comp("x:{ @description('An expression to which the 2-radix display should apply.') 'expression': expr_string }")}, -{str8_lit_comp("oct"), 1, str8_lit_comp("x:{ @description('An expression to which the 8-radix display should apply.') 'expression': expr_string }")}, -{str8_lit_comp("hex"), 1, str8_lit_comp("x:{ @description('An expression to which the 16-radix display should apply.') 'expression': expr_string }")}, -{str8_lit_comp("digits"), 1, str8_lit_comp("x:{ @description('An expression to which the digit display should apply.') 'expression': expr_string, @description('The minimum number of digits to display.') 'digit_count': u64 }")}, -{str8_lit_comp("no_string"), 1, str8_lit_comp("x:{ @description('The expression for which string visualization should be disabled.') 'expression': expr_string}")}, -{str8_lit_comp("no_char"), 1, str8_lit_comp("x:{ @description('The expression for which character visualization should be disabled.') 'expression': expr_string}")}, -{str8_lit_comp("no_addr"), 1, str8_lit_comp("x:{ @description('The expression for which address visualization should be disabled.') 'expression': expr_string}")}, -{str8_lit_comp("sequence"), 1, str8_lit_comp("x:{ @description('The number of expansions to generate.') 'count': expr_string}")}, -{str8_lit_comp("rows"), 1, str8_lit_comp("x:{ @description('The expression for which rows should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate rows.') '...'}")}, -{str8_lit_comp("columns"), 1, str8_lit_comp("x:{ @description('The expression for whose expansions columns should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate columns for each expansion from `expression`.') '...'}")}, -{str8_lit_comp("omit"), 1, str8_lit_comp("x:{ @description('The expression for which certain members should be omitted.') 'expression': expr_string, @description('A list of member names to omit from the expansion.') '...'}")}, -{str8_lit_comp("range1"), 1, str8_lit_comp("x:{ @description('The expression which should be bounded by `min` and `max`.') 'expression': expr_string, @description('The lower bound.') min, @description('The upper bound.') max}")}, -{str8_lit_comp("array"), 1, str8_lit_comp("x:{ @description('An expression of the base address of the array.') 'base_address': expr_string, @description('The number of elements in the array.') count}")}, -{str8_lit_comp("slice"), 1, str8_lit_comp("x:{ @description('An expression of a structure that is to be interpreted as a slice.') 'expression': expr_string}")}, -{str8_lit_comp("list"), 1, str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, -{str8_lit_comp("watch"), 0, str8_lit_comp("@inherit(tab) x:\n{\n @override @display_name('Tab Row Height') @description(\"Controls the tab's row height, in multiples of the font size.\")\n 'row_height': @range[1.75f, 5.f] f32,\n 'label': code_string,\n @description(\"The root expression which is evaluated to produce the watch window.\")\n 'expression': expr_string,\n @no_expand 'watches': set,\n}\n")}, -{str8_lit_comp("text"), 1, str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @optional @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, -{str8_lit_comp("disasm"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n @optional @description(\"The maximum number of bytes to disassemble.\")\n 'size': expr_string,\n @optional @description(\"The architecture to interpret the data as when disassembling.\")\n 'arch': code_string,\n @optional @description(\"The syntax style to use when displaying the disassembly textually.\")\n 'syntax': code_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, -{str8_lit_comp("memory"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @no_callee_helper @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1.0) 'zoom': @range[0.5, 2] f32,\n @optional @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @no_callee_helper @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @no_callee_helper @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @optional @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @optional @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @no_callee_helper @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @no_callee_helper @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @no_callee_helper @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @no_callee_helper @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': set,\n}\n")}, -{str8_lit_comp("bitmap"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, -{str8_lit_comp("color"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, -{str8_lit_comp("geo3d"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, -{str8_lit_comp("getting_started"), 0, str8_lit_comp("@inherit(tab) x:\n{\n}\n")}, -{str8_lit_comp("target"), 0, str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': set,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, -{str8_lit_comp("breakpoint"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\nx:\n{\n 'label': code_string,\n 'condition': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n 'hit_count': u64,\n 'address_range_size': @or(0, 1, 2, 4, 8) u64,\n 'break_on_write': bool,\n 'break_on_read': bool,\n 'break_on_execute': bool,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, -{str8_lit_comp("watch_pin"), 0, str8_lit_comp("@row_commands(duplicate_cfg, remove_cfg)\n@collection_commands(add_watch_pin, toggle_watch_pin)\nx:\n{\n 'expression': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n}\n")}, -{str8_lit_comp("debug_info"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @query 'guid': string,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, -{str8_lit_comp("file_path_map"), 0, str8_lit_comp("@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}")}, -{str8_lit_comp("type_view"), 0, str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, -{str8_lit_comp("recent_project"), 0, str8_lit_comp("x:{'path':path, 'name':string}")}, -{str8_lit_comp("machine"), 0, str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}")}, -{str8_lit_comp("process"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}")}, -{str8_lit_comp("module"), 0, str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}")}, -{str8_lit_comp("thread"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, -}; - -String8 rd_reg_slot_code_name_table[49] = -{ -{0}, -str8_lit_comp("machine"), -str8_lit_comp("module"), -str8_lit_comp("process"), -str8_lit_comp("thread"), -str8_lit_comp("ctrl_entity"), -str8_lit_comp("window"), -str8_lit_comp("panel"), -str8_lit_comp("tab"), -str8_lit_comp("view"), -str8_lit_comp("prev_tab"), -str8_lit_comp("dst_panel"), -str8_lit_comp("cfg"), -str8_lit_comp("cfg_list"), -str8_lit_comp("eval_space"), -str8_lit_comp("unwind_count"), -str8_lit_comp("inline_depth"), -str8_lit_comp("file_path"), -str8_lit_comp("cursor"), -str8_lit_comp("mark"), -str8_lit_comp("text_key"), -str8_lit_comp("lang_kind"), -str8_lit_comp("lines"), -str8_lit_comp("dbgi_key"), -str8_lit_comp("vaddr"), -str8_lit_comp("voff"), -str8_lit_comp("vaddr_range"), -str8_lit_comp("voff_range"), -str8_lit_comp("expr"), -str8_lit_comp("ui_key"), -str8_lit_comp("src_ui_key"), -str8_lit_comp("off_px"), -str8_lit_comp("reg_slot"), -str8_lit_comp("pid"), -str8_lit_comp("force_confirm"), -str8_lit_comp("force_focus"), -str8_lit_comp("prefer_disasm"), -str8_lit_comp("no_rich_tooltip"), -str8_lit_comp("do_implicit_root"), -str8_lit_comp("do_lister"), -str8_lit_comp("do_big_rows"), -str8_lit_comp("all_windows"), -str8_lit_comp("non_graphical"), -str8_lit_comp("prefer_new_tab"), -str8_lit_comp("activate_with_single_click"), -str8_lit_comp("dir2"), -str8_lit_comp("string"), -str8_lit_comp("cmd_name"), -str8_lit_comp("wm_event"), -}; - -Rng1U64 rd_reg_slot_range_table[49] = -{ -{0}, -{OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(D_Handle)}, -{OffsetOf(RD_Regs, module), OffsetOf(RD_Regs, module) + sizeof(D_Handle)}, -{OffsetOf(RD_Regs, process), OffsetOf(RD_Regs, process) + sizeof(D_Handle)}, -{OffsetOf(RD_Regs, thread), OffsetOf(RD_Regs, thread) + sizeof(D_Handle)}, -{OffsetOf(RD_Regs, ctrl_entity), OffsetOf(RD_Regs, ctrl_entity) + sizeof(D_Handle)}, -{OffsetOf(RD_Regs, window), OffsetOf(RD_Regs, window) + sizeof(CFG_ID)}, -{OffsetOf(RD_Regs, panel), OffsetOf(RD_Regs, panel) + sizeof(CFG_ID)}, -{OffsetOf(RD_Regs, tab), OffsetOf(RD_Regs, tab) + sizeof(CFG_ID)}, -{OffsetOf(RD_Regs, view), OffsetOf(RD_Regs, view) + sizeof(CFG_ID)}, -{OffsetOf(RD_Regs, prev_tab), OffsetOf(RD_Regs, prev_tab) + sizeof(CFG_ID)}, -{OffsetOf(RD_Regs, dst_panel), OffsetOf(RD_Regs, dst_panel) + sizeof(CFG_ID)}, -{OffsetOf(RD_Regs, cfg), OffsetOf(RD_Regs, cfg) + sizeof(CFG_ID)}, -{OffsetOf(RD_Regs, cfg_list), OffsetOf(RD_Regs, cfg_list) + sizeof(CFG_IDList)}, -{OffsetOf(RD_Regs, eval_space), OffsetOf(RD_Regs, eval_space) + sizeof(E_Space)}, -{OffsetOf(RD_Regs, unwind_count), OffsetOf(RD_Regs, unwind_count) + sizeof(U64)}, -{OffsetOf(RD_Regs, inline_depth), OffsetOf(RD_Regs, inline_depth) + sizeof(U64)}, -{OffsetOf(RD_Regs, file_path), OffsetOf(RD_Regs, file_path) + sizeof(String8)}, -{OffsetOf(RD_Regs, cursor), OffsetOf(RD_Regs, cursor) + sizeof(TxtPt)}, -{OffsetOf(RD_Regs, mark), OffsetOf(RD_Regs, mark) + sizeof(TxtPt)}, -{OffsetOf(RD_Regs, text_key), OffsetOf(RD_Regs, text_key) + sizeof(C_Key)}, -{OffsetOf(RD_Regs, lang_kind), OffsetOf(RD_Regs, lang_kind) + sizeof(TXT_LangKind)}, -{OffsetOf(RD_Regs, lines), OffsetOf(RD_Regs, lines) + sizeof(D_LineList)}, -{OffsetOf(RD_Regs, dbgi_key), OffsetOf(RD_Regs, dbgi_key) + sizeof(DI_Key)}, -{OffsetOf(RD_Regs, vaddr), OffsetOf(RD_Regs, vaddr) + sizeof(U64)}, -{OffsetOf(RD_Regs, voff), OffsetOf(RD_Regs, voff) + sizeof(U64)}, -{OffsetOf(RD_Regs, vaddr_range), OffsetOf(RD_Regs, vaddr_range) + sizeof(Rng1U64)}, -{OffsetOf(RD_Regs, voff_range), OffsetOf(RD_Regs, voff_range) + sizeof(Rng1U64)}, -{OffsetOf(RD_Regs, expr), OffsetOf(RD_Regs, expr) + sizeof(String8)}, -{OffsetOf(RD_Regs, ui_key), OffsetOf(RD_Regs, ui_key) + sizeof(UI_Key)}, -{OffsetOf(RD_Regs, src_ui_key), OffsetOf(RD_Regs, src_ui_key) + sizeof(UI_Key)}, -{OffsetOf(RD_Regs, off_px), OffsetOf(RD_Regs, off_px) + sizeof(Vec2F32)}, -{OffsetOf(RD_Regs, reg_slot), OffsetOf(RD_Regs, reg_slot) + sizeof(RD_RegSlot)}, -{OffsetOf(RD_Regs, pid), OffsetOf(RD_Regs, pid) + sizeof(U32)}, -{OffsetOf(RD_Regs, force_confirm), OffsetOf(RD_Regs, force_confirm) + sizeof(B32)}, -{OffsetOf(RD_Regs, force_focus), OffsetOf(RD_Regs, force_focus) + sizeof(B32)}, -{OffsetOf(RD_Regs, prefer_disasm), OffsetOf(RD_Regs, prefer_disasm) + sizeof(B32)}, -{OffsetOf(RD_Regs, no_rich_tooltip), OffsetOf(RD_Regs, no_rich_tooltip) + sizeof(B32)}, -{OffsetOf(RD_Regs, do_implicit_root), OffsetOf(RD_Regs, do_implicit_root) + sizeof(B32)}, -{OffsetOf(RD_Regs, do_lister), OffsetOf(RD_Regs, do_lister) + sizeof(B32)}, -{OffsetOf(RD_Regs, do_big_rows), OffsetOf(RD_Regs, do_big_rows) + sizeof(B32)}, -{OffsetOf(RD_Regs, all_windows), OffsetOf(RD_Regs, all_windows) + sizeof(B32)}, -{OffsetOf(RD_Regs, non_graphical), OffsetOf(RD_Regs, non_graphical) + sizeof(B32)}, -{OffsetOf(RD_Regs, prefer_new_tab), OffsetOf(RD_Regs, prefer_new_tab) + sizeof(B32)}, -{OffsetOf(RD_Regs, activate_with_single_click), OffsetOf(RD_Regs, activate_with_single_click) + sizeof(B32)}, -{OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)}, -{OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)}, -{OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)}, -{OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, -}; - -RD_CmdKindInfo rd_cmd_kind_info_table[249] = -{ -{0}, -{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("launch_and_step_into"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the first instruction after the current scope is exited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, -{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, -{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("list_breakpoints"), str8_lit_comp("Lists all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("globals"), str8_lit_comp("Opens a Globals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("thread_locals"), str8_lit_comp("Opens a Thread Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("types"), str8_lit_comp("Opens a Types tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("procedures"), str8_lit_comp("Opens a Procedures tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("call_stack"), str8_lit_comp("Opens a Call Stack tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("targets"), str8_lit_comp("Opens a Targets tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("breakpoints"), str8_lit_comp("Opens a Breakpoints tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("watch_pins"), str8_lit_comp("Opens a Watch Pins tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("debug_infos"), str8_lit_comp("Opens a Debug Info tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("threads"), str8_lit_comp("Opens a Threads tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("processes"), str8_lit_comp("Opens a Processes tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("machines"), str8_lit_comp("Opens a Machines tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("modules"), str8_lit_comp("Opens a Modules tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("file_path_maps"), str8_lit_comp("Opens a File Path Map tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("type_views"), str8_lit_comp("Opens a Type Views tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("output"), str8_lit_comp("Opens a Output tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("text"), str8_lit_comp("Opens a Text tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("disasm"), str8_lit_comp("Opens a Disassembly tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("memory"), str8_lit_comp("Opens a Memory tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("bitmap"), str8_lit_comp("Opens a Bitmap tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("color"), str8_lit_comp("Opens a Color tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("geo3d"), str8_lit_comp("Opens a Geometry (3D) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -}; - -struct {String8 string; CFG_Binding binding;} rd_default_binding_table[114] = -{ -{str8_lit_comp("kill_all"), {WM_Key_F5, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("step_into_inst"), {WM_Key_F11, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("step_over_inst"), {WM_Key_F10, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("step_out"), {WM_Key_F11, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("halt"), {WM_Key_X, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("halt"), {WM_Key_Pause, 0 }}, -{str8_lit_comp("run"), {WM_Key_F5, 0 }}, -{str8_lit_comp("restart"), {WM_Key_F5, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("step_into"), {WM_Key_F11, 0 }}, -{str8_lit_comp("step_over"), {WM_Key_F10, 0 }}, -{str8_lit_comp("run_to_line"), {WM_Key_F10, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("set_next_statement"), {WM_Key_F10, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("inc_window_font_size"), {WM_Key_Equal, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("dec_window_font_size"), {WM_Key_Minus, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("toggle_fullscreen"), {WM_Key_Return, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("new_panel_right"), {WM_Key_P, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("new_panel_down"), {WM_Key_Minus, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("rotate_panel_columns"), {WM_Key_2, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("next_panel"), {WM_Key_Comma, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("prev_panel"), {WM_Key_Comma, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("focus_panel_right"), {WM_Key_Right, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, -{str8_lit_comp("focus_panel_left"), {WM_Key_Left, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, -{str8_lit_comp("focus_panel_up"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, -{str8_lit_comp("focus_panel_down"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, -{str8_lit_comp("undo"), {WM_Key_Z, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("redo"), {WM_Key_Y, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("go_back"), {WM_Key_Left, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("go_forward"), {WM_Key_Right, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("close_panel"), {WM_Key_P, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, -{str8_lit_comp("next_tab"), {WM_Key_PageDown, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("prev_tab"), {WM_Key_PageUp, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("next_tab"), {WM_Key_Tab, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("prev_tab"), {WM_Key_Tab, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("move_tab_right"), {WM_Key_PageDown, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("move_tab_left"), {WM_Key_PageUp, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("close_tab"), {WM_Key_W, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("tab_bar_top"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, -{str8_lit_comp("tab_bar_bottom"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, -{str8_lit_comp("open_tab"), {WM_Key_T, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("tab_settings"), {WM_Key_T, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, -{str8_lit_comp("open"), {WM_Key_O, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("open_source_file_from_debug_info"), {WM_Key_I, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("switch_to_partner_file"), {WM_Key_O, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("new_project"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("open_project"), {WM_Key_O, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("save_project"), {WM_Key_S, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("edit"), {WM_Key_F2, 0 }}, -{str8_lit_comp("accept"), {WM_Key_Return, 0 }}, -{str8_lit_comp("accept"), {WM_Key_Space, 0 }}, -{str8_lit_comp("cancel"), {WM_Key_Esc, 0 }}, -{str8_lit_comp("focus_menu"), {WM_Key_D, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("move_left"), {WM_Key_Left, 0 }}, -{str8_lit_comp("move_right"), {WM_Key_Right, 0 }}, -{str8_lit_comp("move_up"), {WM_Key_Up, 0 }}, -{str8_lit_comp("move_down"), {WM_Key_Down, 0 }}, -{str8_lit_comp("move_left_select"), {WM_Key_Left, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("move_right_select"), {WM_Key_Right, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("move_up_select"), {WM_Key_Up, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("move_down_select"), {WM_Key_Down, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("move_left_chunk"), {WM_Key_Left, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("move_right_chunk"), {WM_Key_Right, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("move_up_chunk"), {WM_Key_Up, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("move_down_chunk"), {WM_Key_Down, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("move_up_page"), {WM_Key_PageUp, 0 }}, -{str8_lit_comp("move_down_page"), {WM_Key_PageDown, 0 }}, -{str8_lit_comp("move_up_whole"), {WM_Key_Home, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("move_down_whole"), {WM_Key_End, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("move_left_chunk_select"), {WM_Key_Left, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("move_right_chunk_select"), {WM_Key_Right, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("move_up_chunk_select"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("move_down_chunk_select"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("move_up_page_select"), {WM_Key_PageUp, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("move_down_page_select"), {WM_Key_PageDown, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("move_up_whole_select"), {WM_Key_Home, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("move_down_whole_select"), {WM_Key_End, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("move_up_reorder"), {WM_Key_Up, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("move_down_reorder"), {WM_Key_Down, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("move_home"), {WM_Key_Home, 0 }}, -{str8_lit_comp("move_end"), {WM_Key_End, 0 }}, -{str8_lit_comp("move_home_select"), {WM_Key_Home, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("move_end_select"), {WM_Key_End, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("select_all"), {WM_Key_A, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("delete_single"), {WM_Key_Delete, 0 }}, -{str8_lit_comp("delete_chunk"), {WM_Key_Delete, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("backspace_single"), {WM_Key_Backspace, 0 }}, -{str8_lit_comp("backspace_chunk"), {WM_Key_Backspace, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("copy"), {WM_Key_C, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("copy"), {WM_Key_Insert, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("cut"), {WM_Key_X, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("paste"), {WM_Key_V, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("paste"), {WM_Key_Insert, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("insert_text"), {WM_Key_Null, 0 }}, -{str8_lit_comp("move_next"), {WM_Key_Tab, 0 }}, -{str8_lit_comp("move_prev"), {WM_Key_Tab, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("goto_line"), {WM_Key_G, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("goto_address"), {WM_Key_G, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("search"), {WM_Key_F, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("search_backwards"), {WM_Key_R, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("find_next"), {WM_Key_F3, 0 }}, -{str8_lit_comp("find_prev"), {WM_Key_F3, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("find_selected_thread"), {WM_Key_F4, 0 }}, -{str8_lit_comp("goto_name"), {WM_Key_J, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("goto_name_at_cursor"), {WM_Key_F12, 0 }}, -{str8_lit_comp("toggle_watch_expr_at_cursor"), {WM_Key_W, 0 |WM_Modifier_Alt}}, -{str8_lit_comp("toggle_watch_expr_at_mouse"), {WM_Key_D, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("toggle_watch_pin"), {WM_Key_F9, 0 |WM_Modifier_Ctrl }}, -{str8_lit_comp("toggle_breakpoint"), {WM_Key_F9, 0 }}, -{str8_lit_comp("add_address_breakpoint"), {WM_Key_F9, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("add_function_breakpoint"), {WM_Key_F9, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("attach"), {WM_Key_F6, 0 |WM_Modifier_Shift }}, -{str8_lit_comp("open_palette"), {WM_Key_F1, 0 }}, -{str8_lit_comp("open_palette"), {WM_Key_P, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, -{str8_lit_comp("log_marker"), {WM_Key_M, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, -{str8_lit_comp("toggle_dev_menu"), {WM_Key_D, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, -}; - -String8 rd_binding_version_remap_old_name_table[9] = -{ -str8_lit_comp("commands"), -str8_lit_comp("load_user"), -str8_lit_comp("load_profile"), -str8_lit_comp("load_project"), -str8_lit_comp("open_profile"), -str8_lit_comp("address_breakpoint"), -str8_lit_comp("function_breakpoint"), -str8_lit_comp("toggle_breakpoint_cursor"), -str8_lit_comp("switch"), -}; - -String8 rd_binding_version_remap_new_name_table[9] = -{ -str8_lit_comp("run_command"), -str8_lit_comp("open_user"), -str8_lit_comp("open_profile"), -str8_lit_comp("open_project"), -str8_lit_comp("open_project"), -str8_lit_comp("add_address_breakpoint"), -str8_lit_comp("add_function_breakpoint"), -str8_lit_comp("toggle_breakpoint"), -str8_lit_comp("open_source_file_from_debug_info"), -}; - -String8 rd_icon_kind_text_table[75] = -{ -str8_lit_comp(""), -str8_lit_comp("b"), -str8_lit_comp("c"), -str8_lit_comp("B"), -str8_lit_comp("C"), -str8_lit_comp("f"), -str8_lit_comp("F"), -str8_lit_comp("g"), -str8_lit_comp("h"), -str8_lit_comp("r"), -str8_lit_comp("s"), -str8_lit_comp("i"), -str8_lit_comp("w"), -str8_lit_comp("W"), -str8_lit_comp("k"), -str8_lit_comp("K"), -str8_lit_comp("L"), -str8_lit_comp("R"), -str8_lit_comp("U"), -str8_lit_comp("D"), -str8_lit_comp("G"), -str8_lit_comp("P"), -str8_lit_comp("3"), -str8_lit_comp("p"), -str8_lit_comp("O"), -str8_lit_comp("o"), -str8_lit_comp("!"), -str8_lit_comp("1"), -str8_lit_comp("V"), -str8_lit_comp("<"), -str8_lit_comp(">"), -str8_lit_comp("^"), -str8_lit_comp("v"), -str8_lit_comp("9"), -str8_lit_comp("0"), -str8_lit_comp("7"), -str8_lit_comp("8"), -str8_lit_comp("+"), -str8_lit_comp("-"), -str8_lit_comp("'"), -str8_lit_comp("\""), -str8_lit_comp("M"), -str8_lit_comp("."), -str8_lit_comp("x"), -str8_lit_comp("q"), -str8_lit_comp("j"), -str8_lit_comp("u"), -str8_lit_comp("m"), -str8_lit_comp("n"), -str8_lit_comp("l"), -str8_lit_comp("a"), -str8_lit_comp("z"), -str8_lit_comp("y"), -str8_lit_comp("X"), -str8_lit_comp("Y"), -str8_lit_comp("S"), -str8_lit_comp("T"), -str8_lit_comp("Z"), -str8_lit_comp("d"), -str8_lit_comp("N"), -str8_lit_comp("E"), -str8_lit_comp("H"), -str8_lit_comp("e"), -str8_lit_comp("I"), -str8_lit_comp("J"), -str8_lit_comp("A"), -str8_lit_comp("?"), -str8_lit_comp("4"), -str8_lit_comp("5"), -str8_lit_comp("6"), -str8_lit_comp("&"), -str8_lit_comp("*"), -str8_lit_comp("("), -str8_lit_comp(")"), -str8_lit_comp("#"), -}; - -String8 rd_code_color_slot_name_table[14] = -{ -str8_lit_comp("code_default"), -str8_lit_comp("code_symbol"), -str8_lit_comp("code_type"), -str8_lit_comp("code_local"), -str8_lit_comp("code_register"), -str8_lit_comp("code_keyword"), -str8_lit_comp("code_delimiter_or_operator"), -str8_lit_comp("code_numeric"), -str8_lit_comp("code_numeric_alt_digit_group"), -str8_lit_comp("code_string"), -str8_lit_comp("code_meta"), -str8_lit_comp("code_comment"), -str8_lit_comp("code_line_numbers"), -str8_lit_comp("code_line_numbers_selected"), -}; - -String8 rd_theme_preset_display_string_table[11] = -{ -str8_lit_comp("Default (Dark)"), -str8_lit_comp("Default (Light)"), -str8_lit_comp("VS (Dark)"), -str8_lit_comp("VS (Light)"), -str8_lit_comp("Solarized (Dark)"), -str8_lit_comp("Solarized (Light)"), -str8_lit_comp("Handmade Hero"), -str8_lit_comp("Naysayer"), -str8_lit_comp("4coder"), -str8_lit_comp("Grove"), -str8_lit_comp("Far Manager"), -}; - -String8 rd_theme_preset_code_string_table[11] = -{ -str8_lit_comp("default_dark"), -str8_lit_comp("default_light"), -str8_lit_comp("vs_dark"), -str8_lit_comp("vs_light"), -str8_lit_comp("solarized_dark"), -str8_lit_comp("solarized_light"), -str8_lit_comp("handmade_hero"), -str8_lit_comp("naysayer"), -str8_lit_comp("four_coder"), -str8_lit_comp("grove"), -str8_lit_comp("far_manager"), -}; - -String8 rd_theme_preset_cfg_string_table[11] = -{ -str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x1f1f1fff}\n theme_color:{tags: \"alt background\", value: 0x222222ff}\n theme_color:{tags: \"pop background\", value: 0x675331ff}\n theme_color:{tags: \"fresh background\", value: 0x3d3631ff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x404040ff}\n theme_color:{tags: text, value: 0xe5e5e5ff}\n theme_color:{tags: \"weak text\", value: 0xa4a4a4ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xabdeffff}\n theme_color:{tags: \"focus overlay\", value: 0x2292eb14}\n theme_color:{tags: \"focus border\", value: 0x2392ebff}\n theme_color:{tags: cursor, value: 0x8aff00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x16}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xecececff}\n theme_color:{tags: code_symbol, value: 0xebb624ff}\n theme_color:{tags: code_type, value: 0xebb624ff}\n theme_color:{tags: code_local, value: 0xa7dae8ff}\n theme_color:{tags: code_register, value: 0xb7afd5ff}\n theme_color:{tags: code_keyword, value: 0x838b8fff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x838b8fff}\n theme_color:{tags: code_numeric, value: 0x9cb198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x6d8e67ff}\n theme_color:{tags: code_string, value: 0x9cb198ff}\n theme_color:{tags: code_meta, value: 0xb9819aff}\n theme_color:{tags: code_comment, value: 0x627b5eff}\n theme_color:{tags: line_info_0, value: 0x3c2d25ff}\n theme_color:{tags: line_info_1, value: 0x3c3925ff}\n theme_color:{tags: line_info_2, value: 0x2e4837ff}\n theme_color:{tags: line_info_3, value: 0x2e3d48ff}\n theme_color:{tags: line_info_4, value: 0x3c2d25ff}\n theme_color:{tags: line_info_5, value: 0x3c3925ff}\n theme_color:{tags: line_info_6, value: 0x2e4837ff}\n theme_color:{tags: line_info_7, value: 0x2e3d48ff}\n theme_color:{tags: thread_0, value: 0xebb624ff}\n theme_color:{tags: thread_1, value: 0x26d0d2ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x1b1b1baf}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\n theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x333333ff}\n theme_color:{tags: \"tab border\", value: 0x2392ebff}\n theme_color:{tags: \"tab inactive background\", value: 0}\n theme_color:{tags: \"tab inactive border\", value: 0x42494eff}\n theme_color:{tags: \"tab auto background\", value: 0x3e4d6eff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x3e4d6e39}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0xffffffff }\n theme_color:{ tags: \"alt background\" , value: 0xf8f8f8ff }\n theme_color:{ tags: \"pop background\" , value: 0xcbe4f2ff }\n theme_color:{ tags: \"menu_bar pop background\" , value: 0x5aabd9ff }\n theme_color:{ tags: \"fresh background\" , value: 0xeaddceff }\n theme_color:{ tags: \"match background\" , value: 0xc1e9c4ff }\n theme_color:{ tags: border , value: 0xcbcbcbff }\n theme_color:{ tags: text , value: 0xff }\n theme_color:{ tags: \"weak text\" , value: 0x727272ff }\n theme_color:{ tags: \"good text\" , value: 0x217538ff }\n theme_color:{ tags: \"neutral text\" , value: 0x1a5b7cff }\n theme_color:{ tags: \"bad text\" , value: 0x972717ff }\n theme_color:{ tags: hover , value: 0xff }\n theme_color:{ tags: \"focus overlay\" , value: 0x67ff4b }\n theme_color:{ tags: \"focus border\" , value: 0x67ffff }\n theme_color:{ tags: cursor , value: 0xff }\n theme_color:{ tags: selection , value: 0x283d5166 }\n theme_color:{ tags: \"inactive background\" , value: 0x8 }\n theme_color:{ tags: drop_shadow , value: 0xb }\n theme_color:{ tags: \"good_pop background\" , value: 0x90c09aff }\n theme_color:{ tags: \"good_pop border\" , value: 0x1e7231ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0xa93620ff }\n theme_color:{ tags: \"bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar bad_pop background\" , value: 0xff2a00ff }\n theme_color:{ tags: \"menu_bar bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0x80808ff }\n theme_color:{ tags: code_symbol , value: 0x4ac3ff }\n theme_color:{ tags: code_type , value: 0xf46200ff }\n theme_color:{ tags: code_local , value: 0x317c00ff }\n theme_color:{ tags: code_register , value: 0x9a00ffff }\n theme_color:{ tags: code_keyword , value: 0xff0600ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x8a8a8aff }\n theme_color:{ tags: code_numeric , value: 0x7d49ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0xb56aff }\n theme_color:{ tags: code_string , value: 0x63549fff }\n theme_color:{ tags: code_meta , value: 0xd96759ff }\n theme_color:{ tags: code_comment , value: 0x717171ff }\n theme_color:{ tags: line_info_0 , value: 0xe6d5cdff }\n theme_color:{ tags: line_info_1 , value: 0xdbcfb2ff }\n theme_color:{ tags: line_info_2 , value: 0xddeac1ff }\n theme_color:{ tags: line_info_3 , value: 0xddc4bdff }\n theme_color:{ tags: line_info_4 , value: 0xba917eff }\n theme_color:{ tags: thread_0 , value: 0xffa700ff }\n theme_color:{ tags: thread_1 , value: 0xb41fff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xff2800ff }\n theme_color:{ tags: \"floating background\" , value: 0xffffffc7 }\n theme_color:{ tags: \"floating background alt\" , value: 0x23 }\n theme_color:{ tags: \"floating background fresh\" , value: 0xeaddceff }\n theme_color:{ tags: \"floating border\" , value: 0x88888884 }\n theme_color:{ tags: \"scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"menu_bar background\" , value: 0x2b6b9aff }\n theme_color:{ tags: \"menu_bar border\" , value: 0x4d }\n theme_color:{ tags: \"menu_bar text\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"good menu_bar text\" , value: 0x70db8dff }\n theme_color:{ tags: \"bad menu_bar text\" , value: 0xffa79bff }\n theme_color:{ tags: \"neutral menu_bar text\" , value: 0xc4dbe7ff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab text\" , value: 0xffffffff }\n theme_color:{ tags: \"tab text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"tab background\" , value: 0xb67e48ff }\n theme_color:{ tags: \"tab border\" , value: 0x875b31ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0xcacacaff }\n theme_color:{ tags: \"tab inactive border\" , value: 0xb5b5b5ff }\n theme_color:{ tags: \"tab auto background\" , value: 0xc41c69ff }\n theme_color:{ tags: \"tab auto border\" , value: 0x981039ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x9b88a3ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x373737ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0x1f1f1fff }\n theme_color:{ tags: \"alt background\" , value: 0x222222ff }\n theme_color:{ tags: \"pop background\" , value: 0x383167ff }\n theme_color:{ tags: \"fresh background\" , value: 0x31393dff }\n theme_color:{ tags: \"match background\" , value: 0x31393dff }\n theme_color:{ tags: border , value: 0x404040ff }\n theme_color:{ tags: text , value: 0xe5e5e5ff }\n theme_color:{ tags: \"weak text\" , value: 0xa4a4a4ff }\n theme_color:{ tags: \"good text\" , value: 0x32a852ff }\n theme_color:{ tags: \"neutral text\" , value: 0x3a90bbff }\n theme_color:{ tags: \"bad text\" , value: 0xcf5242ff }\n theme_color:{ tags: hover , value: 0xffffffff }\n theme_color:{ tags: \"focus overlay\" , value: 0x7160e81e }\n theme_color:{ tags: \"focus border\" , value: 0x7160e8ff }\n theme_color:{ tags: cursor , value: 0x8aff00ff }\n theme_color:{ tags: selection , value: 0x99ccff0f }\n theme_color:{ tags: \"inactive background\" , value: 0x0000002f }\n theme_color:{ tags: drop_shadow , value: 0x0000007f }\n theme_color:{ tags: \"good_pop background\" , value: 0x2c5b36ff }\n theme_color:{ tags: \"good_pop border\" , value: 0x568761ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0x803425ff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0xe0e0e0ff }\n theme_color:{ tags: code_symbol , value: 0xdcdcaaff }\n theme_color:{ tags: code_type , value: 0x4ec9b0ff }\n theme_color:{ tags: code_local , value: 0x9cdcfeff }\n theme_color:{ tags: code_register , value: 0xb7afd5ff }\n theme_color:{ tags: code_keyword , value: 0x569cd6ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x767676ff }\n theme_color:{ tags: code_numeric , value: 0xb5cea8ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0x7c986dff }\n theme_color:{ tags: code_string , value: 0xd69d85ff }\n theme_color:{ tags: code_meta , value: 0x9b9b9bff }\n theme_color:{ tags: code_comment , value: 0x51a644ff }\n theme_color:{ tags: line_info_0 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_1 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_2 , value: 0x434e2aff }\n theme_color:{ tags: line_info_3 , value: 0x36241fff }\n theme_color:{ tags: line_info_4 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_5 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_6 , value: 0x434e2aff }\n theme_color:{ tags: line_info_7 , value: 0x36241fff }\n theme_color:{ tags: thread_0 , value: 0xffdc48ff }\n theme_color:{ tags: thread_1 , value: 0xb2ff65ff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xa72911ff }\n theme_color:{ tags: \"floating background\" , value: 0x1b1b1baf }\n theme_color:{ tags: \"floating background alt\" , value: 0x0000005f }\n theme_color:{ tags: \"floating background fresh\" , value: 0x31393d5f }\n theme_color:{ tags: \"floating border\" , value: 0xbfbfbf1f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0x3b3b3b5f }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"scroll_bar background\" , value: 0x2b2b2bff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x3f3f3fff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab background\" , value: 0x333333ff }\n theme_color:{ tags: \"tab border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0x171717ff }\n theme_color:{ tags: \"tab inactive border\" , value: 0x3e4c57ff }\n theme_color:{ tags: \"tab auto background\" , value: 0x3f386dff }\n theme_color:{ tags: \"tab auto border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x2f2633ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x685073ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0xffffffff}\n theme_color:{tags: \"alt background\", value: 0xefefefff}\n theme_color:{tags: \"pop background\", value: 0xe3eaf2ff}\n theme_color:{tags: \"fresh background\", value: 0xeccbbeff}\n theme_color:{tags: \"match background\", value: 0xedcbf9ff}\n theme_color:{tags: border, value: 0xe7e7e7ff}\n theme_color:{tags: text, value: 0xff}\n theme_color:{tags: \"weak text\", value: 0x353535ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xa7ffff}\n theme_color:{tags: \"focus overlay\", value: 0x8eff3f}\n theme_color:{tags: \"focus border\", value: 0x8effff}\n theme_color:{tags: cursor, value: 0xff}\n theme_color:{tags: selection, value: 0x56aaff77}\n theme_color:{tags: \"inactive background\", value: 0x17}\n theme_color:{tags: drop_shadow, value: 0xe7b27}\n theme_color:{tags: \"good_pop background\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop border\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0xcb3f23ff}\n theme_color:{tags: \"bad_pop text\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop text weak\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0x000000ff}\n theme_color:{tags: code_symbol, value: 0x74531fff}\n theme_color:{tags: code_type, value: 0x2b91afff}\n theme_color:{tags: code_local, value: 0x1f377fff}\n theme_color:{tags: code_register, value: 0x8a1bffff}\n theme_color:{tags: code_keyword, value: 0x0000ffff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\n theme_color:{tags: code_numeric, value: 0xff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x1d1d1dff}\n theme_color:{tags: code_string, value: 0xa61515ff}\n theme_color:{tags: code_meta, value: 0x808080ff}\n theme_color:{tags: code_comment, value: 0x008000ff}\n theme_color:{tags: line_info_0, value: 0xb5d9c8ff}\n theme_color:{tags: line_info_1, value: 0xa9c1d0ff}\n theme_color:{tags: line_info_2, value: 0x99abc5ff}\n theme_color:{tags: line_info_3, value: 0xc6bcd5ff}\n theme_color:{tags: thread_0, value: 0xffb141ff}\n theme_color:{tags: thread_1, value: 0x66c407ff}\n theme_color:{tags: thread_unwound, value: 0x67b3d7ff}\n theme_color:{tags: thread_error, value: 0xff2900ff}\n theme_color:{tags: breakpoint, value: 0xff2800ff}\n theme_color:{tags: \"floating background\", value: 0xffffffff}\n theme_color:{tags: \"floating background alt\", value: 0x11}\n theme_color:{tags: \"floating background fresh\", value: 0xa0c2d318}\n theme_color:{tags: \"floating border\", value: 0x50}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"menu_bar background\", value: 0xccd5f0ff}\n theme_color:{tags: \"menu_bar border\", value: 0xbabdc3ff}\n theme_color:{tags: \"scroll_bar background\", value: 0xe4e4e4ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0xf5cc84ff}\n theme_color:{tags: \"tab border\", value: 0xae7718ff}\n theme_color:{tags: \"tab inactive background\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab inactive text\", value: 0xffffffff}\n theme_color:{tags: \"tab inactive border\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab auto background\", value: 0xe99595ff}\n theme_color:{tags: \"tab auto border\", value: 0xff6262ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0xac6060ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0xff6262ff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xa7ffff}\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x002a35ff}\n theme_color:{tags: \"alt background\", value: 0x053542ff}\n theme_color:{tags: \"pop background\", value: 0x355b6eff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x65166ff}\n theme_color:{tags: text, value: 0xeee8d5ff}\n theme_color:{tags: \"weak text\", value: 0x93a1a1ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xca4b16ff}\n theme_color:{tags: \"focus overlay\", value: 0xca4b151f}\n theme_color:{tags: \"focus border\", value: 0xca4b16ff}\n theme_color:{tags: cursor, value: 0xca4b16ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x5f8700ff}\n theme_color:{tags: \"good_pop border\", value: 0x5f8700ff}\n theme_color:{tags: \"bad_pop background\", value: 0x810000ff}\n theme_color:{tags: code_default, value: 0x839496ff}\n theme_color:{tags: code_symbol, value: 0xb3880eff}\n theme_color:{tags: code_type, value: 0xb3880eff}\n theme_color:{tags: code_local, value: 0xeee8d5ff}\n theme_color:{tags: code_register, value: 0xeee8d5ff}\n theme_color:{tags: code_keyword, value: 0x849804ff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\n theme_color:{tags: code_numeric, value: 0x2aa198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\n theme_color:{tags: code_string, value: 0x2aa198ff}\n theme_color:{tags: code_meta, value: 0xca4b16ff}\n theme_color:{tags: code_comment, value: 0x586e75ff}\n theme_color:{tags: line_info_0, value: 0x4f3022ff}\n theme_color:{tags: line_info_1, value: 0x4f3e15ff}\n theme_color:{tags: line_info_2, value: 0x434e2aff}\n theme_color:{tags: line_info_3, value: 0x36241fff}\n theme_color:{tags: thread_0, value: 0xffcb7fff}\n theme_color:{tags: thread_1, value: 0xb2ff65ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x2a3574}\n theme_color:{tags: \"floating background alt\", value: 0x4f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x53542ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x53542ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x586e75ff}\n theme_color:{tags: \"tab border\", value: 0x90abb3ff}\n theme_color:{tags: \"tab inactive background\", value: 0x0}\n theme_color:{tags: \"tab inactive border\", value: 0x33494fff}\n theme_color:{tags: \"tab auto background\", value: 0x565ed2ff}\n theme_color:{tags: \"tab auto border\", value: 0xa2a6dfff}\n theme_color:{tags: \"tab auto inactive background\", value: 0}\n theme_color:{tags: \"tab auto inactive border\", value: 0x595fbcff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0xfdf6e3ff}\n theme_color:{tags: \"alt background\", value: 0xeee8d5ff}\n theme_color:{tags: \"pop background\", value: 0x29a19890}\n theme_color:{tags: \"fresh background\", value: 0xf7d38dff}\n theme_color:{tags: \"match background\", value: 0xdcddddff}\n theme_color:{tags: border, value: 0xd1ccbdff}\n theme_color:{tags: \"weak text\", value: 0x93a1a1ff}\n theme_color:{tags: text, value: 0x657b83ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xca4b16ff}\n theme_color:{tags: \"focus overlay\", value: 0xca4b1454}\n theme_color:{tags: \"focus border\", value: 0xca4b16ff}\n theme_color:{tags: cursor, value: 0xca4b16ff}\n theme_color:{tags: selection, value: 0x8594a264}\n theme_color:{tags: \"inactive background\", value: 0x14}\n theme_color:{tags: drop_shadow, value: 0x3a}\n theme_color:{tags: \"good_pop background\", value: 0xd1e99aff}\n theme_color:{tags: \"good_pop border\", value: 0xd1e99aff}\n theme_color:{tags: \"bad_pop background\", value: 0xd26c6cff}\n theme_color:{tags: \"bad_pop border\", value: 0xd26c6cff}\n theme_color:{tags: \"bad_pop weak text\", value: 0xffffffff}\n theme_color:{tags: \"bad_pop text\", value: 0xffffffff}\n theme_color:{tags: code_default, value: 0x839496ff}\n theme_color:{tags: code_symbol, value: 0xb3880eff}\n theme_color:{tags: code_type, value: 0xb3880eff}\n theme_color:{tags: code_local, value: 0x657b83ff}\n theme_color:{tags: code_register, value: 0x947298ff}\n theme_color:{tags: code_keyword, value: 0x849804ff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\n theme_color:{tags: code_numeric, value: 0x2aa198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\n theme_color:{tags: code_string, value: 0x2aa198ff}\n theme_color:{tags: code_meta, value: 0xca4b16ff}\n theme_color:{tags: code_comment, value: 0x586e75ff}\n theme_color:{tags: line_info_0, value: 0xeee1dbff}\n theme_color:{tags: line_info_1, value: 0xe5d5b1ff}\n theme_color:{tags: line_info_2, value: 0xd9e8b6ff}\n theme_color:{tags: line_info_3, value: 0xf5d5ccff}\n theme_color:{tags: thread_0, value: 0xffa100ff}\n theme_color:{tags: thread_1, value: 0x6edd00ff}\n theme_color:{tags: thread_unwound, value: 0x708f9eff}\n theme_color:{tags: thread_error, value: 0xff5231ff}\n theme_color:{tags: breakpoint, value: 0xff411dff}\n theme_color:{tags: \"floating background\", value: 0xfdf6e3b1}\n theme_color:{tags: \"floating background alt\", value: 0x22}\n theme_color:{tags: \"floating background fresh\", value: 0xf7d38dff}\n theme_color:{tags: \"scroll_bar background\", value: 0xeee6d0ff}\n theme_color:{tags: \"scroll_bar floating background\", value: 0xd5ccb5ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0xfdf6e3ff}\n theme_color:{tags: \"tab inactive background\", value: 0xe0d6bbff}\n theme_color:{tags: \"tab auto background\", value: 0xf5cfe1ff}\n theme_color:{tags: \"tab auto border\", value: 0xa2a6dfff}\n theme_color:{tags: \"tab auto inactive background\", value: 0xc8a5b5ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x595fbcff}\n theme_color:{tags: \"drop_site background\", value: 0x29a19890}\n theme_color:{tags: \"drop_site border\", value: 0x81ddd690}\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x0c0c0cff}\n theme_color:{tags: \"alt background\", value: 0x161616ff}\n theme_color:{tags: \"pop background\", value: 0x355b6eff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x404040ff}\n theme_color:{tags: text, value: 0xcac1b6ff}\n theme_color:{tags: \"weak text\", value: 0xa08563ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xffffffff}\n theme_color:{tags: \"focus overlay\", value: 0x7485971e}\n theme_color:{tags: \"focus border\", value: 0x5e6b79ff}\n theme_color:{tags: cursor, value: 0x00ee00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xa08563ff}\n theme_color:{tags: code_symbol, value: 0xcc5735ff}\n theme_color:{tags: code_type, value: 0xd8a51cff}\n theme_color:{tags: code_local, value: 0xd6b995ff}\n theme_color:{tags: code_register, value: 0xc04047ff}\n theme_color:{tags: code_keyword, value: 0xac7b0aff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x907553ff}\n theme_color:{tags: code_numeric, value: 0x6b8e23ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x4f681cff}\n theme_color:{tags: code_string, value: 0x6b8e23ff}\n theme_color:{tags: code_meta, value: 0xdab98fff}\n theme_color:{tags: code_comment, value: 0x686868ff}\n theme_color:{tags: line_info_0, value: 0x4f3022ff}\n theme_color:{tags: line_info_1, value: 0x4f3e15ff}\n theme_color:{tags: line_info_2, value: 0x434e2aff}\n theme_color:{tags: line_info_3, value: 0x36241fff}\n theme_color:{tags: thread_0, value: 0xffcb7fff}\n theme_color:{tags: thread_1, value: 0xb2ff65ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x18181980}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"menu_bar background\", value: 0x1f1f27ff}\n theme_color:{tags: \"menu_bar border\", value: 0x3d3d47ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\n theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x1f1f27ff}\n theme_color:{tags: \"tab border\", value: 0x3d3d47ff}\n theme_color:{tags: \"tab text\", value: 0xca9301ff}\n theme_color:{tags: \"tab text weak\", value: 0x8c690eff}\n theme_color:{tags: \"tab inactive background\", value: 0x171718ff}\n theme_color:{tags: \"tab inactive border\", value: 0x1f1f27ff}\n theme_color:{tags: \"tab auto background\", value: 0x243b38ff}\n theme_color:{tags: \"tab auto border\", value: 0x478980ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x102623ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x1e5850ff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x042327ff}\n theme_color:{tags: \"alt background\", value: 0x11b1fff}\n theme_color:{tags: \"pop background\", value: 0x355b6eff}\n theme_color:{tags: \"pop text\", value: 0xbad7e6ff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x334d50ff}\n theme_color:{tags: text, value: 0xdad3beff}\n theme_color:{tags: \"weak text\", value: 0xb0a688ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: \"menu_bar good text\", value: 0x2a8242ff}\n theme_color:{tags: \"menu_bar neutral text\", value: 0x5681ff}\n theme_color:{tags: \"menu_bar bad text\", value: 0xa21200ff}\n theme_color:{tags: \"menu_bar weak text\", value: 0x313131ff}\n theme_color:{tags: \"menu_bar bad_pop text weak\", value: 0xffffffff}\n theme_color:{tags: hover, value: 0xffffffff}\n theme_color:{tags: \"focus overlay\", value: 0x86e08e20}\n theme_color:{tags: \"focus border\", value: 0x86e08fff}\n theme_color:{tags: cursor, value: 0x86e08fff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xbdb395ff}\n theme_color:{tags: code_symbol, value: 0xcbe0f5ff}\n theme_color:{tags: code_type, value: 0xcbe0f5ff}\n theme_color:{tags: code_local, value: 0xd9cfb3ff}\n theme_color:{tags: code_register, value: 0xb7afd5ff}\n theme_color:{tags: code_keyword, value: 0x9de3c0ff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\n theme_color:{tags: code_numeric, value: 0x2ca198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x217770ff}\n theme_color:{tags: code_string, value: 0x2ca198ff}\n theme_color:{tags: code_meta, value: 0xB0FFB0ff}\n theme_color:{tags: code_comment, value: 0x31b72cff}\n theme_color:{tags: line_info_0, value: 0x4f3022ff}\n theme_color:{tags: line_info_1, value: 0x4f3e15ff}\n theme_color:{tags: line_info_2, value: 0x434e2aff}\n theme_color:{tags: line_info_3, value: 0x36241fff}\n theme_color:{tags: thread_0, value: 0xffcb7fff}\n theme_color:{tags: thread_1, value: 0xb2ff65ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x3232792}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0xe363bff}\n theme_color:{tags: \"menu_bar background\", value: 0xb59e7aff}\n theme_color:{tags: \"menu_bar text\", value: 0xff}\n theme_color:{tags: \"menu_bar border\", value: 0x947d5aff}\n theme_color:{tags: \"scroll_bar background\", value: 0xe363bff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x13533aff}\n theme_color:{tags: \"tab border\", value: 0x6c9182ff}\n theme_color:{tags: \"tab inactive background\", value: 0x0}\n theme_color:{tags: \"tab inactive border\", value: 0x947d5a6c}\n theme_color:{tags: \"tab auto background\", value: 0x5b3939ff}\n theme_color:{tags: \"tab auto border\", value: 0x875c5cff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x251b1bff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x563d3dff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{tags: background,value: 0xc0c0cff}\n theme_color:{tags: \"alt background\", value: 0x131313ff}\n theme_color:{tags: \"pop background\", value: 0x4c00ff}\n theme_color:{tags: \"fresh background\", value: 0x4c00ff}\n theme_color:{tags: \"match background\", value: 0x4c00ff}\n theme_color:{tags: border, value: 0x272727ff}\n theme_color:{tags: text, value: 0x90b080ff}\n theme_color:{tags: \"weak text\", value: 0x6b845fff}\n theme_color:{tags: \"menu_bar background\", value: 0x888888ff}\n theme_color:{tags: \"menu_bar text\", value: 0x20202ff}\n theme_color:{tags: \"menu_bar text weak\", value: 0x525252ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xee00ff}\n theme_color:{tags: \"focus overlay\", value: 0xee0012}\n theme_color:{tags: \"focus border\", value: 0x00ee00ff}\n theme_color:{tags: cursor, value: 0x00ee00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x4900ff}\n theme_color:{tags: \"good_pop border\", value: 0x4900ff}\n theme_color:{tags: \"bad_pop background\", value: 0x430b00ff}\n theme_color:{tags: code_default, value: 0x90b080ff}\n theme_color:{tags: code_symbol, value: 0xbfd9b2ff}\n theme_color:{tags: code_type, value: 0xbfd9b2ff}\n theme_color:{tags: code_local, value: 0xbfd9b2ff}\n theme_color:{tags: code_register, value: 0xb84cffff}\n theme_color:{tags: code_keyword, value: 0xd08f1fff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x90b080ff}\n theme_color:{tags: code_numeric, value: 0x50ff2fff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x30af18ff}\n theme_color:{tags: code_string, value: 0x50ff2fff}\n theme_color:{tags: code_meta, value: 0x90b080ff}\n theme_color:{tags: code_comment, value: 0x1f90f0ff}\n theme_color:{tags: line_info_0, value: 0xa253dff}\n theme_color:{tags: line_info_1, value: 0x9103dff}\n theme_color:{tags: line_info_2, value: 0x1e083dff}\n theme_color:{tags: line_info_3, value: 0x1e083dff}\n theme_color:{tags: thread_0, value: 0xd08f1fff}\n theme_color:{tags: thread_1, value: 0x1ea5d0ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x1d1d1dff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x15490cff}\n theme_color:{tags: \"tab border\", value: 0x15490cff}\n theme_color:{tags: \"tab text\", value: 0x90b080ff}\n theme_color:{tags: \"tab text weak\", value: 0x90b080ff}\n theme_color:{tags: \"tab inactive background\", value: 0x21321eff}\n theme_color:{tags: \"tab inactive border\", value: 0x21321eff}\n theme_color:{tags: \"tab auto background\", value: 0x674f3eff}\n theme_color:{tags: \"tab auto border\", value: 0x674f3eff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x47382eff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x47382eff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0x1b1f22ff }\n theme_color:{ tags: \"alt background\" , value: 0x232929ff }\n theme_color:{ tags: \"pop background\" , value: 0x2f4838ff }\n theme_color:{ tags: \"fresh background\" , value: 0x31393dff }\n theme_color:{ tags: \"match background\" , value: 0x31393dff }\n theme_color:{ tags: border , value: 0x485347ff }\n theme_color:{ tags: text , value: 0xffffffff }\n theme_color:{ tags: \"weak text\" , value: 0xa2a2a2ff }\n theme_color:{ tags: \"good text\" , value: 0x32a852ff }\n theme_color:{ tags: \"neutral text\" , value: 0x3a90bbff }\n theme_color:{ tags: \"bad text\" , value: 0xcf5242ff }\n theme_color:{ tags: hover , value: 0xffffffff }\n theme_color:{ tags: \"focus overlay\" , value: 0xfda20012 }\n theme_color:{ tags: \"focus border\" , value: 0xfda200ff }\n theme_color:{ tags: cursor , value: 0x8aff00ff }\n theme_color:{ tags: selection , value: 0x99ccff0f }\n theme_color:{ tags: \"inactive background\" , value: 0x0 }\n theme_color:{ tags: drop_shadow , value: 0x0000007f }\n theme_color:{ tags: \"good_pop background\" , value: 0x2c5b36ff }\n theme_color:{ tags: \"good_pop border\" , value: 0x568761ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0x803425ff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0xad8b69ff }\n theme_color:{ tags: code_symbol , value: 0x87ad6aff }\n theme_color:{ tags: code_type , value: 0xb67474ff }\n theme_color:{ tags: code_local , value: 0xe9bf95ff }\n theme_color:{ tags: code_register , value: 0xa688b2ff }\n theme_color:{ tags: code_keyword , value: 0xe49e17ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x795e43ff }\n theme_color:{ tags: code_numeric , value: 0x98b19eff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0x688b71ff }\n theme_color:{ tags: code_string , value: 0x98b19eff }\n theme_color:{ tags: code_meta , value: 0xad5979ff }\n theme_color:{ tags: code_comment , value: 0x52675dff }\n theme_color:{ tags: line_info_0 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_1 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_2 , value: 0x434e2aff }\n theme_color:{ tags: line_info_3 , value: 0x36241fff }\n theme_color:{ tags: line_info_4 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_5 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_6 , value: 0x434e2aff }\n theme_color:{ tags: line_info_7 , value: 0x36241fff }\n theme_color:{ tags: thread_0 , value: 0xffc258ff }\n theme_color:{ tags: thread_1 , value: 0x82d331ff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xa72911ff }\n theme_color:{ tags: \"floating background\" , value: 0x1b1f2276 }\n theme_color:{ tags: \"floating background alt\" , value: 0x0000005f }\n theme_color:{ tags: \"floating background fresh\" , value: 0x31393d5f }\n theme_color:{ tags: \"floating border\" , value: 0xbfbfbf1f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0x3b3b3b5f }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"menu_bar background\" , value: 0x243d32ff }\n theme_color:{ tags: \"menu_bar border\" , value: 0x597b63ff }\n theme_color:{ tags: \"scroll_bar background\" , value: 0x232929ff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x3c4a3fff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab background\" , value: 0x243d32ff }\n theme_color:{ tags: \"tab border\" , value: 0x597b63ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0x30383eff }\n theme_color:{ tags: \"tab inactive border\" , value: 0x6b7680ff }\n theme_color:{ tags: \"tab auto background\" , value: 0x30636dff }\n theme_color:{ tags: \"tab auto border\" , value: 0x768f94ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x2f2633ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x685073ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x000080ff}\n theme_color:{tags: \"pop background\", value: 0x8080ff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x8080ff}\n theme_color:{tags: text, value: 0xffffffff}\n theme_color:{tags: \"weak text\", value: 0xffffffff}\n theme_color:{tags: \"good text\", value: 0x00ff00ff}\n theme_color:{tags: \"neutral text\", value: 0x00ffffff}\n theme_color:{tags: \"bad text\", value: 0xff0000ff}\n theme_color:{tags: hover, value: 0xffffffff}\n theme_color:{tags: \"focus overlay\", value: 0xffff0012}\n theme_color:{tags: \"focus border\", value: 0xffff00ff}\n theme_color:{tags: cursor, value: 0xffff00ff}\n theme_color:{tags: selection, value: 0xffff0018}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x6c17ff}\n theme_color:{tags: \"good_pop border\", value: 0x6c17ff}\n theme_color:{tags: \"bad_pop background\", value: 0xff0000ff}\n theme_color:{tags: code_default, value: 0xffffffff}\n theme_color:{tags: code_symbol, value: 0xffffff}\n theme_color:{tags: code_type, value: 0x00ff00ff}\n theme_color:{tags: code_local, value: 0x00ffffff}\n theme_color:{tags: code_register, value: 0xff00ffff}\n theme_color:{tags: code_keyword, value: 0xffffffff}\n theme_color:{tags: code_delimiter_or_operator, value: 0xffffffff}\n theme_color:{tags: code_numeric, value: 0xffff00ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0xffff00ff}\n theme_color:{tags: code_string, value: 0xffff00ff}\n theme_color:{tags: code_meta, value: 0xff0000ff}\n theme_color:{tags: code_comment, value: 0x008080ff}\n theme_color:{tags: line_info_0, value: 0x8080ff}\n theme_color:{tags: line_info_1, value: 0x800080ff}\n theme_color:{tags: line_info_2, value: 0x800000ff}\n theme_color:{tags: line_info_3, value: 0x08000ff}\n theme_color:{tags: thread_0, value: 0xffff00ff}\n theme_color:{tags: thread_1, value: 0x00ff00ff}\n theme_color:{tags: thread_unwound, value: 0x00ffffff}\n theme_color:{tags: thread_error, value: 0xff0000ff}\n theme_color:{tags: breakpoint, value: 0xff0000ff}\n theme_color:{tags: \"menu_bar background\", value: 0x008080ff}\n theme_color:{tags: \"menu_bar border\", value: 0x8080ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x008080ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x8080ff}\n theme_color:{tags: \"tab border\", value: 0x8080ff}\n theme_color:{tags: \"tab inactive background\", value:0}\n theme_color:{tags: \"tab auto background\", value: 0x800000ff}\n theme_color:{tags: \"tab auto border\", value: 0x8080ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x300000ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x8080ff}\n theme_color:{tags: \"drop_site background\", value: 0x80ff}\n theme_color:{tags: \"drop_site border\", value: 0xffffff}\n}\n"), -}; - -C_LINKAGE_END - +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +C_LINKAGE_BEGIN +String8 rd_tab_fast_path_view_name_table[25] = +{ +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("watch"), +str8_lit_comp("text"), +str8_lit_comp("text"), +str8_lit_comp("disasm"), +str8_lit_comp("memory"), +str8_lit_comp("bitmap"), +str8_lit_comp("color"), +str8_lit_comp("geo3d"), +}; + +String8 rd_tab_fast_path_query_name_table[25] = +{ +str8_lit_comp(""), +str8_lit_comp("query:locals"), +str8_lit_comp("query:registers"), +str8_lit_comp("query:globals"), +str8_lit_comp("query:thread_locals"), +str8_lit_comp("query:types"), +str8_lit_comp("query:procedures"), +str8_lit_comp("query:call_stack"), +str8_lit_comp("query:targets"), +str8_lit_comp("query:breakpoints"), +str8_lit_comp("query:watch_pins"), +str8_lit_comp("query:debug_infos"), +str8_lit_comp("query:threads"), +str8_lit_comp("query:processes"), +str8_lit_comp("query:machines"), +str8_lit_comp("query:modules"), +str8_lit_comp("query:file_path_maps"), +str8_lit_comp("query:type_views"), +str8_lit_comp("query:output"), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +str8_lit_comp(""), +}; + +RD_VocabInfo rd_vocab_info_table[360] = +{ +{str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, +{str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, +{str8_lit_comp("watch_pin"), str8_lit_comp("watch_pins"), str8_lit_comp("Watch Pin"), str8_lit_comp("Watch Pins"), RD_IconKind_Pin}, +{str8_lit_comp("debug_info"), str8_lit_comp("debug_infos"), str8_lit_comp("Debug Info"), str8_lit_comp("Debug Info"), RD_IconKind_Module}, +{str8_lit_comp("watch"), str8_lit_comp("watches"), str8_lit_comp("Watch"), str8_lit_comp("Watches"), RD_IconKind_Binoculars}, +{str8_lit_comp("view"), str8_lit_comp("views"), str8_lit_comp("View"), str8_lit_comp("Views"), RD_IconKind_Binoculars}, +{str8_lit_comp("breakpoint"), str8_lit_comp("breakpoints"), str8_lit_comp("Breakpoint"), str8_lit_comp("Breakpoints"), RD_IconKind_CircleFilled}, +{str8_lit_comp("condition"), str8_lit_comp("conditions"), str8_lit_comp("Condition"), str8_lit_comp("Conditions"), RD_IconKind_Null}, +{str8_lit_comp("location"), str8_lit_comp("locations"), str8_lit_comp("Location"), str8_lit_comp("Locations"), RD_IconKind_Null}, +{str8_lit_comp("source_location"), str8_lit_comp("source_locations"), str8_lit_comp("Source Location"), str8_lit_comp("Source Locations"), RD_IconKind_Null}, +{str8_lit_comp("address_location"), str8_lit_comp("address_locations"), str8_lit_comp("Address Location"), str8_lit_comp("Address Locations"), RD_IconKind_Null}, +{str8_lit_comp("target"), str8_lit_comp("targets"), str8_lit_comp("Target"), str8_lit_comp("Targets"), RD_IconKind_Target}, +{str8_lit_comp("color"), str8_lit_comp("colors"), str8_lit_comp("Color"), str8_lit_comp("Colors"), RD_IconKind_Palette}, +{str8_lit_comp("theme_color"), str8_lit_comp("theme_colors"), str8_lit_comp("Theme Color"), str8_lit_comp("Theme Colors"), RD_IconKind_Palette}, +{str8_lit_comp("executable"), str8_lit_comp("executables"), str8_lit_comp("Executable"), str8_lit_comp("Executables"), RD_IconKind_Module}, +{str8_lit_comp("arguments"), str8_lit_comp("arguments"), str8_lit_comp("Arguments"), str8_lit_comp("Arguments"), RD_IconKind_Null}, +{str8_lit_comp("exe"), str8_lit_comp("exes"), str8_lit_comp("Executable"), str8_lit_comp("Executables"), RD_IconKind_Module}, +{str8_lit_comp("dbg"), str8_lit_comp("dbgs"), str8_lit_comp("Debug Info Path"), str8_lit_comp("Debug Info Paths"), RD_IconKind_Module}, +{str8_lit_comp("vaddr_range"), str8_lit_comp("vaddr_ranges"), str8_lit_comp("Virtual Address Range"), str8_lit_comp("Virtual Address Ranges"), RD_IconKind_Null}, +{str8_lit_comp("min"), str8_lit_comp("mins"), str8_lit_comp("Minimum"), str8_lit_comp("Minimums"), RD_IconKind_Null}, +{str8_lit_comp("max"), str8_lit_comp("maxs"), str8_lit_comp("Maximum"), str8_lit_comp("Maximums"), RD_IconKind_Null}, +{str8_lit_comp("working_directory"), str8_lit_comp("working_directories"), str8_lit_comp("Working Directory"), str8_lit_comp("Working Directories"), RD_IconKind_FolderClosedFilled}, +{str8_lit_comp("entry_point"), str8_lit_comp("entry_points"), str8_lit_comp("Entry Point"), str8_lit_comp("Entry Points"), RD_IconKind_Null}, +{str8_lit_comp("stdout_path"), str8_lit_comp("stdout_paths"), str8_lit_comp("Standard Output Path"), str8_lit_comp("Standard Output Paths"), RD_IconKind_Null}, +{str8_lit_comp("stderr_path"), str8_lit_comp("stderr_paths"), str8_lit_comp("Standard Error Path"), str8_lit_comp("Standard Error Paths"), RD_IconKind_Null}, +{str8_lit_comp("stdin_path"), str8_lit_comp("stdin_paths"), str8_lit_comp("Standard Input Path"), str8_lit_comp("Standard Input Paths"), RD_IconKind_Null}, +{str8_lit_comp("window"), str8_lit_comp("windows"), str8_lit_comp("Window"), str8_lit_comp("Windows"), RD_IconKind_Window}, +{str8_lit_comp("panel"), str8_lit_comp("panels"), str8_lit_comp("Panel"), str8_lit_comp("Panels"), RD_IconKind_Null}, +{str8_lit_comp("tab"), str8_lit_comp("tabs"), str8_lit_comp("Tab"), str8_lit_comp("Tabs"), RD_IconKind_Null}, +{str8_lit_comp("recent_project"), str8_lit_comp("recent_projects"), str8_lit_comp("Recent Project"), str8_lit_comp("Recent Projects"), RD_IconKind_Briefcase}, +{str8_lit_comp("src"), str8_lit_comp("srcs"), str8_lit_comp("Source"), str8_lit_comp("Sources"), RD_IconKind_Null}, +{str8_lit_comp("dst"), str8_lit_comp("dsts"), str8_lit_comp("Destination"), str8_lit_comp("Destinations"), RD_IconKind_Null}, +{str8_lit_comp("source"), str8_lit_comp("sources"), str8_lit_comp("Source"), str8_lit_comp("Sources"), RD_IconKind_Null}, +{str8_lit_comp("dest"), str8_lit_comp("dests"), str8_lit_comp("Destination"), str8_lit_comp("Destinations"), RD_IconKind_Null}, +{str8_lit_comp("conversion_task"), str8_lit_comp("conversion_tasks"), str8_lit_comp("Conversion Task"), str8_lit_comp("Conversion Tasks"), RD_IconKind_Null}, +{str8_lit_comp("conversion_fail"), str8_lit_comp("conversion_fails"), str8_lit_comp("Conversion Fail"), str8_lit_comp("Conversion Fails"), RD_IconKind_Null}, +{str8_lit_comp("lang"), str8_lit_comp("langs"), str8_lit_comp("Language"), str8_lit_comp("Languages"), RD_IconKind_Null}, +{str8_lit_comp("arch"), str8_lit_comp("archs"), str8_lit_comp("Architecture"), str8_lit_comp("Architectures"), RD_IconKind_Null}, +{str8_lit_comp("expr"), str8_lit_comp("exprs"), str8_lit_comp("Expression"), str8_lit_comp("Expressions"), RD_IconKind_Null}, +{str8_lit_comp("expression"), str8_lit_comp("expressions"), str8_lit_comp("Expression"), str8_lit_comp("Expressions"), RD_IconKind_Null}, +{str8_lit_comp("size"), str8_lit_comp("sizes"), str8_lit_comp("Size"), str8_lit_comp("Sizes"), RD_IconKind_Null}, +{str8_lit_comp("count"), str8_lit_comp("counts"), str8_lit_comp("Count"), str8_lit_comp("Counts"), RD_IconKind_Null}, +{str8_lit_comp("bool"), str8_lit_comp("bools"), str8_lit_comp("Boolean"), str8_lit_comp("Booleans"), RD_IconKind_Null}, +{str8_lit_comp("w"), str8_lit_comp("ws"), str8_lit_comp("Width"), str8_lit_comp("Widths"), RD_IconKind_Null}, +{str8_lit_comp("h"), str8_lit_comp("hs"), str8_lit_comp("Height"), str8_lit_comp("Heights"), RD_IconKind_Null}, +{str8_lit_comp("fmt"), str8_lit_comp("fmts"), str8_lit_comp("Format"), str8_lit_comp("Formats"), RD_IconKind_Null}, +{str8_lit_comp("addresses"), str8_lit_comp("addresses"), str8_lit_comp("Addresses"), str8_lit_comp("Addresses"), RD_IconKind_Null}, +{str8_lit_comp("code_bytes"), str8_lit_comp("code_bytes"), str8_lit_comp("Code Bytes"), str8_lit_comp("Code Bytes"), RD_IconKind_Null}, +{str8_lit_comp("vtx"), str8_lit_comp("vtxs"), str8_lit_comp("Vertex Buffer"), str8_lit_comp("Vertex Buffers"), RD_IconKind_Null}, +{str8_lit_comp("vtx_size"), str8_lit_comp("vtx_sizes"), str8_lit_comp("Vertex Buffer Size"), str8_lit_comp("Vertex Buffer Sizes"), RD_IconKind_Null}, +{str8_lit_comp("label"), str8_lit_comp("labels"), str8_lit_comp("Label"), str8_lit_comp("Labels"), RD_IconKind_Null}, +{str8_lit_comp("name"), str8_lit_comp("names"), str8_lit_comp("Name"), str8_lit_comp("Names"), RD_IconKind_Null}, +{str8_lit_comp("thread"), str8_lit_comp("threads"), str8_lit_comp("Thread"), str8_lit_comp("Threads"), RD_IconKind_Thread}, +{str8_lit_comp("threads"), str8_lit_comp(""), str8_lit_comp("Threads"), str8_lit_comp(""), RD_IconKind_Threads}, +{str8_lit_comp("process"), str8_lit_comp("processes"), str8_lit_comp("Process"), str8_lit_comp("Processes"), RD_IconKind_Scheduler}, +{str8_lit_comp("processes"), str8_lit_comp(""), str8_lit_comp("Processes"), str8_lit_comp(""), RD_IconKind_Scheduler}, +{str8_lit_comp("machine"), str8_lit_comp("machines"), str8_lit_comp("Machine"), str8_lit_comp("Machines"), RD_IconKind_Machine}, +{str8_lit_comp("module"), str8_lit_comp("modules"), str8_lit_comp("Module"), str8_lit_comp("Modules"), RD_IconKind_Module}, +{str8_lit_comp("getting_started"), str8_lit_comp(""), str8_lit_comp("Getting Started"), str8_lit_comp(""), RD_IconKind_QuestionMark}, +{str8_lit_comp("disasm"), str8_lit_comp(""), str8_lit_comp("Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, +{str8_lit_comp("text"), str8_lit_comp(""), str8_lit_comp("Text"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("type"), str8_lit_comp("types"), str8_lit_comp("Type"), str8_lit_comp("Types"), RD_IconKind_Null}, +{str8_lit_comp("procedure"), str8_lit_comp("procedures"), str8_lit_comp("Procedure"), str8_lit_comp("Procedures"), RD_IconKind_Null}, +{str8_lit_comp("global_variable"), str8_lit_comp("global_variables"), str8_lit_comp("Global Variable"), str8_lit_comp("Global Variables"), RD_IconKind_Null}, +{str8_lit_comp("global"), str8_lit_comp("globals"), str8_lit_comp("Global"), str8_lit_comp("Globals"), RD_IconKind_Null}, +{str8_lit_comp("thread_variable"), str8_lit_comp("thread_variables"), str8_lit_comp("Thread Variable"), str8_lit_comp("Thread Variables"), RD_IconKind_Null}, +{str8_lit_comp("thread_local"), str8_lit_comp("thread_locals"), str8_lit_comp("Thread Local"), str8_lit_comp("Thread Locals"), RD_IconKind_Null}, +{str8_lit_comp("call_stack"), str8_lit_comp("call_stacks"), str8_lit_comp("Call Stack"), str8_lit_comp("Call Stacks"), RD_IconKind_Thread}, +{str8_lit_comp("output"), str8_lit_comp("outputs"), str8_lit_comp("Output"), str8_lit_comp("Outputs"), RD_IconKind_List}, +{str8_lit_comp("scheduler"), str8_lit_comp("schedulers"), str8_lit_comp("Scheduler"), str8_lit_comp("Schedulers"), RD_IconKind_Scheduler}, +{str8_lit_comp("register"), str8_lit_comp("registers"), str8_lit_comp("Register"), str8_lit_comp("Registers"), RD_IconKind_Null}, +{str8_lit_comp("local"), str8_lit_comp("locals"), str8_lit_comp("Local"), str8_lit_comp("Locals"), RD_IconKind_Null}, +{str8_lit_comp("memory"), str8_lit_comp("memories"), str8_lit_comp("Memory"), str8_lit_comp("Memories"), RD_IconKind_Grid}, +{str8_lit_comp("hit_count"), str8_lit_comp("hit_counts"), str8_lit_comp("Hit Count"), str8_lit_comp("Hit Counts"), RD_IconKind_Null}, +{str8_lit_comp("enabled"), str8_lit_comp(""), str8_lit_comp("Enabled"), str8_lit_comp("Enabled"), RD_IconKind_Null}, +{str8_lit_comp("disabled"), str8_lit_comp(""), str8_lit_comp("Disabled"), str8_lit_comp("Disabled"), RD_IconKind_Null}, +{str8_lit_comp("debug_subprocesses"), str8_lit_comp(""), str8_lit_comp("Debug Subprocesses"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("environment"), str8_lit_comp("environments"), str8_lit_comp("Environment"), str8_lit_comp("Environments"), RD_IconKind_Null}, +{str8_lit_comp("frozen"), str8_lit_comp(""), str8_lit_comp("Frozen"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("id"), str8_lit_comp("ids"), str8_lit_comp("ID"), str8_lit_comp("IDs"), RD_IconKind_Null}, +{str8_lit_comp("last_modified_time"), str8_lit_comp("last_modified_times"), str8_lit_comp("Last Modified Time"), str8_lit_comp("Last Modified Times"), RD_IconKind_Null}, +{str8_lit_comp("creation_time"), str8_lit_comp("creation_times"), str8_lit_comp("Creation Time"), str8_lit_comp("Creation Times"), RD_IconKind_Null}, +{str8_lit_comp("data"), str8_lit_comp("datas"), str8_lit_comp("Data"), str8_lit_comp("Datas"), RD_IconKind_Null}, +{str8_lit_comp("unattached_processes"), str8_lit_comp(""), str8_lit_comp("Unattached Processes"), str8_lit_comp(""), RD_IconKind_Scheduler}, +{str8_lit_comp("user"), str8_lit_comp("users"), str8_lit_comp("User"), str8_lit_comp("Users"), RD_IconKind_Person}, +{str8_lit_comp("project"), str8_lit_comp("projects"), str8_lit_comp("Project"), str8_lit_comp("Projects"), RD_IconKind_Briefcase}, +{str8_lit_comp("recent_project"), str8_lit_comp("recent_projects"), str8_lit_comp("Recent Project"), str8_lit_comp("Recent Projects"), RD_IconKind_Briefcase}, +{str8_lit_comp("recent_file"), str8_lit_comp("recent_files"), str8_lit_comp("Recent File"), str8_lit_comp("Recent Files"), RD_IconKind_FileOutline}, +{str8_lit_comp("show_addresses"), str8_lit_comp(""), str8_lit_comp("Show Addresses"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("show_code_bytes"), str8_lit_comp(""), str8_lit_comp("Show Code Bytes"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("show_source_lines"), str8_lit_comp(""), str8_lit_comp("Show Source Lines"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("show_symbol_names"), str8_lit_comp(""), str8_lit_comp("Show Symbol Names"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("show_line_numbers"), str8_lit_comp(""), str8_lit_comp("Show Line Numbers"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("syntax"), str8_lit_comp("syntaxes"), str8_lit_comp("Syntax"), str8_lit_comp("Syntaxes"), RD_IconKind_Null}, +{str8_lit_comp("num_columns"), str8_lit_comp(""), str8_lit_comp("Number of Columns"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("bytes_per_cell"), str8_lit_comp(""), str8_lit_comp("Bytes Per Cell"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("bitmap"), str8_lit_comp("bitmaps"), str8_lit_comp("Bitmap"), str8_lit_comp("Bitmaps"), RD_IconKind_Bitmap}, +{str8_lit_comp("geo3d"), str8_lit_comp(""), str8_lit_comp("Geometry (3D)"), str8_lit_comp(""), RD_IconKind_Cube}, +{str8_lit_comp("address_range_size"), str8_lit_comp("address_range_sizes"), str8_lit_comp("Address Range Size"), str8_lit_comp("Address Range Sizes"), RD_IconKind_Null}, +{str8_lit_comp("break_on_read"), str8_lit_comp(""), str8_lit_comp("Break On Read"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("break_on_write"), str8_lit_comp(""), str8_lit_comp("Break On Write"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("break_on_execute"), str8_lit_comp(""), str8_lit_comp("Break On Execution"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("yaw"), str8_lit_comp(""), str8_lit_comp("Yaw"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("pitch"), str8_lit_comp(""), str8_lit_comp("Pitch"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("zoom"), str8_lit_comp(""), str8_lit_comp("Zoom"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("font_size"), str8_lit_comp(""), str8_lit_comp("Font Size"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("row_height"), str8_lit_comp(""), str8_lit_comp("Row Height"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("tab_height"), str8_lit_comp(""), str8_lit_comp("Tab Height"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("rgba"), str8_lit_comp(""), str8_lit_comp("RGBA"), str8_lit_comp(""), RD_IconKind_Palette}, +{str8_lit_comp("path"), str8_lit_comp(""), str8_lit_comp("Path"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("guid"), str8_lit_comp(""), str8_lit_comp("GUID"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("peek_type"), str8_lit_comp("peek_types"), str8_lit_comp("Peek Type"), str8_lit_comp("Peek Types"), RD_IconKind_Null}, +{str8_lit_comp("launch_and_run"), str8_lit_comp(""), str8_lit_comp("Launch and Run"), str8_lit_comp(""), RD_IconKind_Play}, +{str8_lit_comp("launch_and_step_into"), str8_lit_comp(""), str8_lit_comp("Launch and Step Into"), str8_lit_comp(""), RD_IconKind_PlayStepForward}, +{str8_lit_comp("kill"), str8_lit_comp(""), str8_lit_comp("Kill"), str8_lit_comp(""), RD_IconKind_X}, +{str8_lit_comp("kill_all"), str8_lit_comp(""), str8_lit_comp("Kill All"), str8_lit_comp(""), RD_IconKind_Stop}, +{str8_lit_comp("detach"), str8_lit_comp(""), str8_lit_comp("Detach"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("continue"), str8_lit_comp(""), str8_lit_comp("Continue"), str8_lit_comp(""), RD_IconKind_Play}, +{str8_lit_comp("step_into_inst"), str8_lit_comp(""), str8_lit_comp("Step Into (Assembly)"), str8_lit_comp(""), RD_IconKind_StepInto}, +{str8_lit_comp("step_over_inst"), str8_lit_comp(""), str8_lit_comp("Step Over (Assembly)"), str8_lit_comp(""), RD_IconKind_StepOver}, +{str8_lit_comp("step_into_line"), str8_lit_comp(""), str8_lit_comp("Step Into (Line)"), str8_lit_comp(""), RD_IconKind_StepInto}, +{str8_lit_comp("step_over_line"), str8_lit_comp(""), str8_lit_comp("Step Over (Line)"), str8_lit_comp(""), RD_IconKind_StepOver}, +{str8_lit_comp("step_out"), str8_lit_comp(""), str8_lit_comp("Step Out"), str8_lit_comp(""), RD_IconKind_StepOut}, +{str8_lit_comp("halt"), str8_lit_comp(""), str8_lit_comp("Halt"), str8_lit_comp(""), RD_IconKind_Pause}, +{str8_lit_comp("soft_halt_refresh"), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), str8_lit_comp(""), RD_IconKind_Refresh}, +{str8_lit_comp("set_thread_ip"), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("run_to_line"), str8_lit_comp(""), str8_lit_comp("Run To Line"), str8_lit_comp(""), RD_IconKind_Play}, +{str8_lit_comp("run"), str8_lit_comp(""), str8_lit_comp("Run"), str8_lit_comp(""), RD_IconKind_Play}, +{str8_lit_comp("restart"), str8_lit_comp(""), str8_lit_comp("Restart"), str8_lit_comp(""), RD_IconKind_Redo}, +{str8_lit_comp("step_into"), str8_lit_comp(""), str8_lit_comp("Step Into"), str8_lit_comp(""), RD_IconKind_StepInto}, +{str8_lit_comp("step_over"), str8_lit_comp(""), str8_lit_comp("Step Over"), str8_lit_comp(""), RD_IconKind_StepOver}, +{str8_lit_comp("freeze_thread"), str8_lit_comp(""), str8_lit_comp("Freeze Thread"), str8_lit_comp(""), RD_IconKind_Locked}, +{str8_lit_comp("thaw_thread"), str8_lit_comp(""), str8_lit_comp("Thaw Thread"), str8_lit_comp(""), RD_IconKind_Unlocked}, +{str8_lit_comp("freeze_process"), str8_lit_comp(""), str8_lit_comp("Freeze Process"), str8_lit_comp(""), RD_IconKind_Locked}, +{str8_lit_comp("thaw_process"), str8_lit_comp(""), str8_lit_comp("Thaw Process"), str8_lit_comp(""), RD_IconKind_Unlocked}, +{str8_lit_comp("freeze_machine"), str8_lit_comp(""), str8_lit_comp("Freeze Machine"), str8_lit_comp(""), RD_IconKind_Locked}, +{str8_lit_comp("thaw_machine"), str8_lit_comp(""), str8_lit_comp("Thaw Machine"), str8_lit_comp(""), RD_IconKind_Unlocked}, +{str8_lit_comp("freeze_local_machine"), str8_lit_comp(""), str8_lit_comp("Freeze Local Machine"), str8_lit_comp(""), RD_IconKind_Machine}, +{str8_lit_comp("thaw_local_machine"), str8_lit_comp(""), str8_lit_comp("Thaw Local Machine"), str8_lit_comp(""), RD_IconKind_Machine}, +{str8_lit_comp("freeze_entity"), str8_lit_comp(""), str8_lit_comp("Freeze Entity"), str8_lit_comp(""), RD_IconKind_Unlocked}, +{str8_lit_comp("thaw_entity"), str8_lit_comp(""), str8_lit_comp("Thaw Entity"), str8_lit_comp(""), RD_IconKind_Locked}, +{str8_lit_comp("set_entity_color"), str8_lit_comp(""), str8_lit_comp("Set Entity Color"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("set_entity_name"), str8_lit_comp(""), str8_lit_comp("Set Entity Name"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("attach"), str8_lit_comp(""), str8_lit_comp("Attach"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("open_crash_dump"), str8_lit_comp(""), str8_lit_comp("Open Crash Dump"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("exit"), str8_lit_comp(""), str8_lit_comp("Exit"), str8_lit_comp(""), RD_IconKind_X}, +{str8_lit_comp("open_palette"), str8_lit_comp(""), str8_lit_comp("Open Palette"), str8_lit_comp(""), RD_IconKind_List}, +{str8_lit_comp("run_command"), str8_lit_comp(""), str8_lit_comp("Run Command"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp("Run External Driver Text Command"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Thread}, +{str8_lit_comp("select_unwind"), str8_lit_comp(""), str8_lit_comp("Select Unwind"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("up_one_frame"), str8_lit_comp(""), str8_lit_comp("Up One Frame"), str8_lit_comp(""), RD_IconKind_UpArrow}, +{str8_lit_comp("down_one_frame"), str8_lit_comp(""), str8_lit_comp("Down One Frame"), str8_lit_comp(""), RD_IconKind_DownArrow}, +{str8_lit_comp("select_entity"), str8_lit_comp(""), str8_lit_comp("Select"), str8_lit_comp(""), RD_IconKind_RadioHollow}, +{str8_lit_comp("deselect_entity"), str8_lit_comp(""), str8_lit_comp("Deselect"), str8_lit_comp(""), RD_IconKind_RadioFilled}, +{str8_lit_comp("inc_window_font_size"), str8_lit_comp(""), str8_lit_comp("Increase Window Font Size"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("dec_window_font_size"), str8_lit_comp(""), str8_lit_comp("Decrease Window Font Size"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("inc_view_font_size"), str8_lit_comp(""), str8_lit_comp("Increase View Font Size"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("dec_view_font_size"), str8_lit_comp(""), str8_lit_comp("Decrease View Font Size"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("open_window"), str8_lit_comp(""), str8_lit_comp("Open New Window"), str8_lit_comp(""), RD_IconKind_Window}, +{str8_lit_comp("window_settings"), str8_lit_comp(""), str8_lit_comp("Window Settings"), str8_lit_comp(""), RD_IconKind_Gear}, +{str8_lit_comp("close_window"), str8_lit_comp(""), str8_lit_comp("Close Window"), str8_lit_comp(""), RD_IconKind_Window}, +{str8_lit_comp("toggle_fullscreen"), str8_lit_comp(""), str8_lit_comp("Toggle Fullscreen"), str8_lit_comp(""), RD_IconKind_Window}, +{str8_lit_comp("bring_to_front"), str8_lit_comp(""), str8_lit_comp("Bring To Front"), str8_lit_comp(""), RD_IconKind_Window}, +{str8_lit_comp("popup_accept"), str8_lit_comp(""), str8_lit_comp("Popup Accept"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("popup_cancel"), str8_lit_comp(""), str8_lit_comp("Popup Cancel"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("reset_to_default_bindings"), str8_lit_comp(""), str8_lit_comp("Reset To Default Bindings"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("reset_to_default_panels"), str8_lit_comp(""), str8_lit_comp("Reset To Default Panel Layout"), str8_lit_comp(""), RD_IconKind_Window}, +{str8_lit_comp("reset_to_compact_panels"), str8_lit_comp(""), str8_lit_comp("Reset To Compact Panel Layout"), str8_lit_comp(""), RD_IconKind_Window}, +{str8_lit_comp("reset_to_simple_panels"), str8_lit_comp(""), str8_lit_comp("Reset To Simple Panel Layout"), str8_lit_comp(""), RD_IconKind_Window}, +{str8_lit_comp("new_panel_left"), str8_lit_comp(""), str8_lit_comp("Split Panel Left"), str8_lit_comp(""), RD_IconKind_XSplit}, +{str8_lit_comp("new_panel_up"), str8_lit_comp(""), str8_lit_comp("Split Panel Up"), str8_lit_comp(""), RD_IconKind_YSplit}, +{str8_lit_comp("new_panel_right"), str8_lit_comp(""), str8_lit_comp("Split Panel Right"), str8_lit_comp(""), RD_IconKind_XSplit}, +{str8_lit_comp("new_panel_down"), str8_lit_comp(""), str8_lit_comp("Split Panel Down"), str8_lit_comp(""), RD_IconKind_YSplit}, +{str8_lit_comp("split_panel"), str8_lit_comp(""), str8_lit_comp("Split Panel"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("rotate_panel_columns"), str8_lit_comp(""), str8_lit_comp("Rotate Panel Columns"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("next_panel"), str8_lit_comp(""), str8_lit_comp("Focus Next Panel"), str8_lit_comp(""), RD_IconKind_RightArrow}, +{str8_lit_comp("prev_panel"), str8_lit_comp(""), str8_lit_comp("Focus Previous Panel"), str8_lit_comp(""), RD_IconKind_LeftArrow}, +{str8_lit_comp("focus_panel"), str8_lit_comp(""), str8_lit_comp("Focus Panel"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("focus_panel_right"), str8_lit_comp(""), str8_lit_comp("Focus Panel Right"), str8_lit_comp(""), RD_IconKind_RightArrow}, +{str8_lit_comp("focus_panel_left"), str8_lit_comp(""), str8_lit_comp("Focus Panel Left"), str8_lit_comp(""), RD_IconKind_LeftArrow}, +{str8_lit_comp("focus_panel_up"), str8_lit_comp(""), str8_lit_comp("Focus Panel Up"), str8_lit_comp(""), RD_IconKind_UpArrow}, +{str8_lit_comp("focus_panel_down"), str8_lit_comp(""), str8_lit_comp("Focus Panel Down"), str8_lit_comp(""), RD_IconKind_DownArrow}, +{str8_lit_comp("undo"), str8_lit_comp(""), str8_lit_comp("Undo"), str8_lit_comp(""), RD_IconKind_Undo}, +{str8_lit_comp("redo"), str8_lit_comp(""), str8_lit_comp("Redo"), str8_lit_comp(""), RD_IconKind_Redo}, +{str8_lit_comp("go_back"), str8_lit_comp(""), str8_lit_comp("Go Back"), str8_lit_comp(""), RD_IconKind_LeftArrow}, +{str8_lit_comp("go_forward"), str8_lit_comp(""), str8_lit_comp("Go Forward"), str8_lit_comp(""), RD_IconKind_RightArrow}, +{str8_lit_comp("close_panel"), str8_lit_comp(""), str8_lit_comp("Close Panel"), str8_lit_comp(""), RD_IconKind_ClosePanel}, +{str8_lit_comp("focus_tab"), str8_lit_comp(""), str8_lit_comp("Focus Tab"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("next_tab"), str8_lit_comp(""), str8_lit_comp("Focus Next Tab"), str8_lit_comp(""), RD_IconKind_RightArrow}, +{str8_lit_comp("prev_tab"), str8_lit_comp(""), str8_lit_comp("Focus Previous Tab"), str8_lit_comp(""), RD_IconKind_LeftArrow}, +{str8_lit_comp("move_tab_right"), str8_lit_comp(""), str8_lit_comp("Move Tab Right"), str8_lit_comp(""), RD_IconKind_RightArrow}, +{str8_lit_comp("move_tab_left"), str8_lit_comp(""), str8_lit_comp("Move Tab Left"), str8_lit_comp(""), RD_IconKind_LeftArrow}, +{str8_lit_comp("open_tab"), str8_lit_comp(""), str8_lit_comp("Open New Tab"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("build_tab"), str8_lit_comp(""), str8_lit_comp("Build Tab"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("duplicate_tab"), str8_lit_comp(""), str8_lit_comp("Duplicate Tab"), str8_lit_comp(""), RD_IconKind_Duplicate}, +{str8_lit_comp("copy_tab_full_path"), str8_lit_comp(""), str8_lit_comp("Copy Full Path"), str8_lit_comp(""), RD_IconKind_Clipboard}, +{str8_lit_comp("close_tab"), str8_lit_comp(""), str8_lit_comp("Close Tab"), str8_lit_comp(""), RD_IconKind_X}, +{str8_lit_comp("move_view"), str8_lit_comp(""), str8_lit_comp("Move View"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("tab_bar_top"), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Top"), str8_lit_comp(""), RD_IconKind_UpArrow}, +{str8_lit_comp("tab_bar_bottom"), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Bottom"), str8_lit_comp(""), RD_IconKind_DownArrow}, +{str8_lit_comp("tab_settings"), str8_lit_comp(""), str8_lit_comp("Selected Tab Settings"), str8_lit_comp(""), RD_IconKind_Gear}, +{str8_lit_comp("set_current_path"), str8_lit_comp(""), str8_lit_comp("Set Current Path"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("open"), str8_lit_comp(""), str8_lit_comp("Open"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp(""), str8_lit_comp("Open Source File From Debug Info"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("switch_to_partner_file"), str8_lit_comp(""), str8_lit_comp("Switch To Partner File"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("show_file_in_explorer"), str8_lit_comp(""), str8_lit_comp("Show File In Explorer"), str8_lit_comp(""), RD_IconKind_FolderClosedFilled}, +{str8_lit_comp("go_to_disassembly"), str8_lit_comp(""), str8_lit_comp("Go To Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, +{str8_lit_comp("go_to_source"), str8_lit_comp(""), str8_lit_comp("Go To Source"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("set_file_replacement_path"), str8_lit_comp(""), str8_lit_comp("Set File Replacement Path"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("new_user"), str8_lit_comp(""), str8_lit_comp("New User"), str8_lit_comp(""), RD_IconKind_Add}, +{str8_lit_comp("new_project"), str8_lit_comp(""), str8_lit_comp("New Project"), str8_lit_comp(""), RD_IconKind_Add}, +{str8_lit_comp("open_user"), str8_lit_comp(""), str8_lit_comp("Open User"), str8_lit_comp(""), RD_IconKind_Person}, +{str8_lit_comp("open_project"), str8_lit_comp(""), str8_lit_comp("Open Project"), str8_lit_comp(""), RD_IconKind_Briefcase}, +{str8_lit_comp("open_recent_project"), str8_lit_comp(""), str8_lit_comp("Open Recent Project"), str8_lit_comp(""), RD_IconKind_Briefcase}, +{str8_lit_comp("save_user"), str8_lit_comp(""), str8_lit_comp("Save User"), str8_lit_comp(""), RD_IconKind_Save}, +{str8_lit_comp("save_project"), str8_lit_comp(""), str8_lit_comp("Save Project"), str8_lit_comp(""), RD_IconKind_Save}, +{str8_lit_comp("record_user_as_last_opened"), str8_lit_comp(""), str8_lit_comp("Record User As Last Opened"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("record_project_in_user"), str8_lit_comp(""), str8_lit_comp("Records Project In User"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("write_user_data"), str8_lit_comp(""), str8_lit_comp("Write User Data"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("write_project_data"), str8_lit_comp(""), str8_lit_comp("Write Project Data"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("user_settings"), str8_lit_comp(""), str8_lit_comp("User Settings"), str8_lit_comp(""), RD_IconKind_Gear}, +{str8_lit_comp("project_settings"), str8_lit_comp(""), str8_lit_comp("Project Settings"), str8_lit_comp(""), RD_IconKind_Gear}, +{str8_lit_comp("edit"), str8_lit_comp(""), str8_lit_comp("Edit"), str8_lit_comp(""), RD_IconKind_Pencil}, +{str8_lit_comp("accept"), str8_lit_comp(""), str8_lit_comp("Accept"), str8_lit_comp(""), RD_IconKind_CheckFilled}, +{str8_lit_comp("cancel"), str8_lit_comp(""), str8_lit_comp("Cancel"), str8_lit_comp(""), RD_IconKind_X}, +{str8_lit_comp("focus_menu"), str8_lit_comp(""), str8_lit_comp("Focus Menu"), str8_lit_comp(""), RD_IconKind_List}, +{str8_lit_comp("move_left"), str8_lit_comp(""), str8_lit_comp("Move Left"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_right"), str8_lit_comp(""), str8_lit_comp("Move Right"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up"), str8_lit_comp(""), str8_lit_comp("Move Up"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down"), str8_lit_comp(""), str8_lit_comp("Move Down"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_left_select"), str8_lit_comp(""), str8_lit_comp("Move Left Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_right_select"), str8_lit_comp(""), str8_lit_comp("Move Right Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up_select"), str8_lit_comp(""), str8_lit_comp("Move Up Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down_select"), str8_lit_comp(""), str8_lit_comp("Move Down Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_left_chunk"), str8_lit_comp(""), str8_lit_comp("Move Left Chunk"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_right_chunk"), str8_lit_comp(""), str8_lit_comp("Move Right Chunk"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up_chunk"), str8_lit_comp(""), str8_lit_comp("Move Up Chunk"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down_chunk"), str8_lit_comp(""), str8_lit_comp("Move Down Chunk"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up_page"), str8_lit_comp(""), str8_lit_comp("Move Up Page"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down_page"), str8_lit_comp(""), str8_lit_comp("Move Down Page"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up_whole"), str8_lit_comp(""), str8_lit_comp("Move Up Whole"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down_whole"), str8_lit_comp(""), str8_lit_comp("Move Down Whole"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_left_chunk_select"), str8_lit_comp(""), str8_lit_comp("Move Left Chunk Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_right_chunk_select"), str8_lit_comp(""), str8_lit_comp("Move Right Chunk Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up_chunk_select"), str8_lit_comp(""), str8_lit_comp("Move Up Chunk Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down_chunk_select"), str8_lit_comp(""), str8_lit_comp("Move Down Chunk Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up_page_select"), str8_lit_comp(""), str8_lit_comp("Move Up Page Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down_page_select"), str8_lit_comp(""), str8_lit_comp("Move Down Page Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up_whole_select"), str8_lit_comp(""), str8_lit_comp("Move Up Whole Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down_whole_select"), str8_lit_comp(""), str8_lit_comp("Move Down Whole Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_up_reorder"), str8_lit_comp(""), str8_lit_comp("Move Up Reorder"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_down_reorder"), str8_lit_comp(""), str8_lit_comp("Move Down Reorder"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_home"), str8_lit_comp(""), str8_lit_comp("Move Home"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_end"), str8_lit_comp(""), str8_lit_comp("Move End"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_home_select"), str8_lit_comp(""), str8_lit_comp("Move Home Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_end_select"), str8_lit_comp(""), str8_lit_comp("Move End Select"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("select_all"), str8_lit_comp(""), str8_lit_comp("Select All"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("delete_single"), str8_lit_comp(""), str8_lit_comp("Delete Single"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("delete_chunk"), str8_lit_comp(""), str8_lit_comp("Delete Chunk"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("backspace_single"), str8_lit_comp(""), str8_lit_comp("Backspace Single"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("backspace_chunk"), str8_lit_comp(""), str8_lit_comp("Backspace Chunk"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("copy"), str8_lit_comp(""), str8_lit_comp("Copy"), str8_lit_comp(""), RD_IconKind_Clipboard}, +{str8_lit_comp("cut"), str8_lit_comp(""), str8_lit_comp("Cut"), str8_lit_comp(""), RD_IconKind_Clipboard}, +{str8_lit_comp("paste"), str8_lit_comp(""), str8_lit_comp("Paste"), str8_lit_comp(""), RD_IconKind_Clipboard}, +{str8_lit_comp("insert_text"), str8_lit_comp(""), str8_lit_comp("Insert Text"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_next"), str8_lit_comp(""), str8_lit_comp("Move Next"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("move_prev"), str8_lit_comp(""), str8_lit_comp("Move Previous"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("goto_line"), str8_lit_comp(""), str8_lit_comp("Go To Line"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("goto_address"), str8_lit_comp(""), str8_lit_comp("Go To Address"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("center_cursor"), str8_lit_comp(""), str8_lit_comp("Center Cursor"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("contain_cursor"), str8_lit_comp(""), str8_lit_comp("Contain Cursor"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("find_next"), str8_lit_comp(""), str8_lit_comp("Find Next"), str8_lit_comp(""), RD_IconKind_Find}, +{str8_lit_comp("find_prev"), str8_lit_comp(""), str8_lit_comp("Find Previous"), str8_lit_comp(""), RD_IconKind_Find}, +{str8_lit_comp("find_thread"), str8_lit_comp(""), str8_lit_comp("Find Thread"), str8_lit_comp(""), RD_IconKind_Find}, +{str8_lit_comp("find_selected_thread"), str8_lit_comp(""), str8_lit_comp("Find Selected Thread"), str8_lit_comp(""), RD_IconKind_Find}, +{str8_lit_comp("goto_name"), str8_lit_comp(""), str8_lit_comp("Go To Name"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("goto_name_at_cursor"), str8_lit_comp(""), str8_lit_comp("Go To Name At Cursor"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("toggle_watch_expr"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Cursor"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Expression At Mouse"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("enable_cfg"), str8_lit_comp(""), str8_lit_comp("Enable"), str8_lit_comp(""), RD_IconKind_CheckHollow}, +{str8_lit_comp("disable_cfg"), str8_lit_comp(""), str8_lit_comp("Disable"), str8_lit_comp(""), RD_IconKind_CheckFilled}, +{str8_lit_comp("select_cfg"), str8_lit_comp(""), str8_lit_comp("Select"), str8_lit_comp(""), RD_IconKind_RadioHollow}, +{str8_lit_comp("deselect_cfg"), str8_lit_comp(""), str8_lit_comp("Deselect"), str8_lit_comp(""), RD_IconKind_RadioFilled}, +{str8_lit_comp("remove_cfg"), str8_lit_comp(""), str8_lit_comp("Remove"), str8_lit_comp(""), RD_IconKind_Trash}, +{str8_lit_comp("name_cfg"), str8_lit_comp(""), str8_lit_comp("Name"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("condition_cfg"), str8_lit_comp(""), str8_lit_comp("Condition"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("duplicate_cfg"), str8_lit_comp(""), str8_lit_comp("Duplicate"), str8_lit_comp(""), RD_IconKind_Duplicate}, +{str8_lit_comp("relocate_cfg"), str8_lit_comp(""), str8_lit_comp("Relocate"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("save_cfg_to_project"), str8_lit_comp(""), str8_lit_comp("Save To Project"), str8_lit_comp(""), RD_IconKind_Briefcase}, +{str8_lit_comp("add_breakpoint"), str8_lit_comp(""), str8_lit_comp("Add Line Breakpoint"), str8_lit_comp(""), RD_IconKind_CircleFilled}, +{str8_lit_comp("add_address_breakpoint"), str8_lit_comp(""), str8_lit_comp("Add Address Breakpoint"), str8_lit_comp(""), RD_IconKind_CircleFilled}, +{str8_lit_comp("add_function_breakpoint"), str8_lit_comp(""), str8_lit_comp("Add Function Breakpoint"), str8_lit_comp(""), RD_IconKind_CircleFilled}, +{str8_lit_comp("toggle_breakpoint"), str8_lit_comp(""), str8_lit_comp("Toggle Line Breakpoint"), str8_lit_comp(""), RD_IconKind_CircleFilled}, +{str8_lit_comp("remove_breakpoint"), str8_lit_comp(""), str8_lit_comp("Remove Breakpoint"), str8_lit_comp(""), RD_IconKind_Trash}, +{str8_lit_comp("enable_breakpoint"), str8_lit_comp(""), str8_lit_comp("Enable Breakpoint"), str8_lit_comp(""), RD_IconKind_CheckFilled}, +{str8_lit_comp("disable_breakpoint"), str8_lit_comp(""), str8_lit_comp("Disable Breakpoint"), str8_lit_comp(""), RD_IconKind_CheckHollow}, +{str8_lit_comp("clear_breakpoints"), str8_lit_comp(""), str8_lit_comp("Clear Breakpoints"), str8_lit_comp(""), RD_IconKind_Trash}, +{str8_lit_comp("list_breakpoints"), str8_lit_comp(""), str8_lit_comp("List Breakpoints"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("clear_output"), str8_lit_comp(""), str8_lit_comp("Clear Output"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("add_watch_pin"), str8_lit_comp(""), str8_lit_comp("Add Watch Pin"), str8_lit_comp(""), RD_IconKind_Pin}, +{str8_lit_comp("toggle_watch_pin"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin"), str8_lit_comp(""), RD_IconKind_Pin}, +{str8_lit_comp("load_debug_info"), str8_lit_comp(""), str8_lit_comp("Load Debug Info"), str8_lit_comp(""), RD_IconKind_Module}, +{str8_lit_comp("unload_debug_info"), str8_lit_comp(""), str8_lit_comp("Unload Debug Info"), str8_lit_comp(""), RD_IconKind_Module}, +{str8_lit_comp("add_type_view"), str8_lit_comp(""), str8_lit_comp("Add Type View"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("add_file_path_map"), str8_lit_comp(""), str8_lit_comp("Add File Path Map"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("edit_user_theme"), str8_lit_comp(""), str8_lit_comp("Edit User Theme"), str8_lit_comp(""), RD_IconKind_Palette}, +{str8_lit_comp("edit_project_theme"), str8_lit_comp(""), str8_lit_comp("Edit Project Theme"), str8_lit_comp(""), RD_IconKind_Palette}, +{str8_lit_comp("add_theme_color"), str8_lit_comp(""), str8_lit_comp("Add Theme Color"), str8_lit_comp(""), RD_IconKind_Palette}, +{str8_lit_comp("fork_theme"), str8_lit_comp(""), str8_lit_comp("Fork Theme"), str8_lit_comp(""), RD_IconKind_Palette}, +{str8_lit_comp("save_theme"), str8_lit_comp(""), str8_lit_comp("Save Theme"), str8_lit_comp(""), RD_IconKind_Save}, +{str8_lit_comp("save_and_set_theme"), str8_lit_comp(""), str8_lit_comp("Save And Set Theme"), str8_lit_comp(""), RD_IconKind_Save}, +{str8_lit_comp("set_next_statement"), str8_lit_comp(""), str8_lit_comp("Set Next Statement"), str8_lit_comp(""), RD_IconKind_RightArrow}, +{str8_lit_comp("add_target"), str8_lit_comp(""), str8_lit_comp("Add Target"), str8_lit_comp(""), RD_IconKind_Target}, +{str8_lit_comp("select_target"), str8_lit_comp(""), str8_lit_comp("Select Target"), str8_lit_comp(""), RD_IconKind_Target}, +{str8_lit_comp("enable_target"), str8_lit_comp(""), str8_lit_comp("Enable Target"), str8_lit_comp(""), RD_IconKind_CheckFilled}, +{str8_lit_comp("disable_target"), str8_lit_comp(""), str8_lit_comp("Disable Target"), str8_lit_comp(""), RD_IconKind_CheckHollow}, +{str8_lit_comp("remove_target"), str8_lit_comp(""), str8_lit_comp("Remove Target"), str8_lit_comp(""), RD_IconKind_Trash}, +{str8_lit_comp("register_as_jit_debugger"), str8_lit_comp(""), str8_lit_comp("Register As Just-In-Time (JIT) Debugger"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("find_code_location"), str8_lit_comp(""), str8_lit_comp("Find Code Location"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("search"), str8_lit_comp(""), str8_lit_comp("Search"), str8_lit_comp(""), RD_IconKind_Find}, +{str8_lit_comp("search_backwards"), str8_lit_comp(""), str8_lit_comp("Search Backwards"), str8_lit_comp(""), RD_IconKind_Find}, +{str8_lit_comp("pick_file"), str8_lit_comp(""), str8_lit_comp("Pick File"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("pick_folder"), str8_lit_comp(""), str8_lit_comp("Pick Folder"), str8_lit_comp(""), RD_IconKind_FolderOpenFilled}, +{str8_lit_comp("pick_file_or_folder"), str8_lit_comp(""), str8_lit_comp("Pick File/Folder"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("push_query"), str8_lit_comp(""), str8_lit_comp("Push Query"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("complete_query"), str8_lit_comp(""), str8_lit_comp("Complete Query"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("cancel_query"), str8_lit_comp(""), str8_lit_comp("Cancel Query"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("update_query"), str8_lit_comp(""), str8_lit_comp("Update Query"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("open_event_buffer"), str8_lit_comp(""), str8_lit_comp("Open Event Buffer"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("close_event_buffer"), str8_lit_comp(""), str8_lit_comp("Close Event Buffer"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("toggle_dev_menu"), str8_lit_comp(""), str8_lit_comp("Toggle Developer Menu"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("log_marker"), str8_lit_comp(""), str8_lit_comp("Log Marker"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("watches"), str8_lit_comp(""), str8_lit_comp("Watch"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("locals"), str8_lit_comp(""), str8_lit_comp("Locals"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("registers"), str8_lit_comp(""), str8_lit_comp("Registers"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("globals"), str8_lit_comp(""), str8_lit_comp("Globals"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("thread_locals"), str8_lit_comp(""), str8_lit_comp("Thread Locals"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("types"), str8_lit_comp(""), str8_lit_comp("Types"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("procedures"), str8_lit_comp(""), str8_lit_comp("Procedures"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("call_stack"), str8_lit_comp(""), str8_lit_comp("Call Stack"), str8_lit_comp(""), RD_IconKind_Thread}, +{str8_lit_comp("targets"), str8_lit_comp(""), str8_lit_comp("Targets"), str8_lit_comp(""), RD_IconKind_Target}, +{str8_lit_comp("breakpoints"), str8_lit_comp(""), str8_lit_comp("Breakpoints"), str8_lit_comp(""), RD_IconKind_CircleFilled}, +{str8_lit_comp("watch_pins"), str8_lit_comp(""), str8_lit_comp("Watch Pins"), str8_lit_comp(""), RD_IconKind_Pin}, +{str8_lit_comp("debug_infos"), str8_lit_comp(""), str8_lit_comp("Debug Info"), str8_lit_comp(""), RD_IconKind_Module}, +{str8_lit_comp("threads"), str8_lit_comp(""), str8_lit_comp("Threads"), str8_lit_comp(""), RD_IconKind_Threads}, +{str8_lit_comp("processes"), str8_lit_comp(""), str8_lit_comp("Processes"), str8_lit_comp(""), RD_IconKind_Scheduler}, +{str8_lit_comp("machines"), str8_lit_comp(""), str8_lit_comp("Machines"), str8_lit_comp(""), RD_IconKind_Machine}, +{str8_lit_comp("modules"), str8_lit_comp(""), str8_lit_comp("Modules"), str8_lit_comp(""), RD_IconKind_Module}, +{str8_lit_comp("file_path_maps"), str8_lit_comp(""), str8_lit_comp("File Path Map"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("type_views"), str8_lit_comp(""), str8_lit_comp("Type Views"), str8_lit_comp(""), RD_IconKind_Binoculars}, +{str8_lit_comp("output"), str8_lit_comp(""), str8_lit_comp("Output"), str8_lit_comp(""), RD_IconKind_List}, +{str8_lit_comp("text"), str8_lit_comp(""), str8_lit_comp("Text"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("disasm"), str8_lit_comp(""), str8_lit_comp("Disassembly"), str8_lit_comp(""), RD_IconKind_Glasses}, +{str8_lit_comp("memory"), str8_lit_comp(""), str8_lit_comp("Memory"), str8_lit_comp(""), RD_IconKind_Grid}, +{str8_lit_comp("bitmap"), str8_lit_comp(""), str8_lit_comp("Bitmap"), str8_lit_comp(""), RD_IconKind_Bitmap}, +{str8_lit_comp("color"), str8_lit_comp(""), str8_lit_comp("Color"), str8_lit_comp(""), RD_IconKind_Palette}, +{str8_lit_comp("geo3d"), str8_lit_comp(""), str8_lit_comp("Geometry (3D)"), str8_lit_comp(""), RD_IconKind_Cube}, +}; + +RD_NameSchemaInfo rd_name_schema_info_table[39] = +{ +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, +{str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, +{str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, +{str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, +{str8_lit_comp("tab"), 0, str8_lit_comp("@row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\nx:\n{\n @override @display_name('Tab Font Size') @description(\"Controls the tab's font size.\") @no_callee_helper\n 'font_size': @range[6, 72] u64,\n}\n")}, +{str8_lit_comp("bin"), 1, str8_lit_comp("x:{ @description('An expression to which the 2-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("oct"), 1, str8_lit_comp("x:{ @description('An expression to which the 8-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("hex"), 1, str8_lit_comp("x:{ @description('An expression to which the 16-radix display should apply.') 'expression': expr_string }")}, +{str8_lit_comp("digits"), 1, str8_lit_comp("x:{ @description('An expression to which the digit display should apply.') 'expression': expr_string, @description('The minimum number of digits to display.') 'digit_count': u64 }")}, +{str8_lit_comp("no_string"), 1, str8_lit_comp("x:{ @description('The expression for which string visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("no_char"), 1, str8_lit_comp("x:{ @description('The expression for which character visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("no_addr"), 1, str8_lit_comp("x:{ @description('The expression for which address visualization should be disabled.') 'expression': expr_string}")}, +{str8_lit_comp("sequence"), 1, str8_lit_comp("x:{ @description('The number of expansions to generate.') 'count': expr_string}")}, +{str8_lit_comp("rows"), 1, str8_lit_comp("x:{ @description('The expression for which rows should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate rows.') '...'}")}, +{str8_lit_comp("columns"), 1, str8_lit_comp("x:{ @description('The expression for whose expansions columns should be generated.') 'expression': expr_string, @description('A list of expressions which will be used to generate columns for each expansion from `expression`.') '...'}")}, +{str8_lit_comp("omit"), 1, str8_lit_comp("x:{ @description('The expression for which certain members should be omitted.') 'expression': expr_string, @description('A list of member names to omit from the expansion.') '...'}")}, +{str8_lit_comp("range1"), 1, str8_lit_comp("x:{ @description('The expression which should be bounded by `min` and `max`.') 'expression': expr_string, @description('The lower bound.') min, @description('The upper bound.') max}")}, +{str8_lit_comp("array"), 1, str8_lit_comp("x:{ @description('An expression of the base address of the array.') 'base_address': expr_string, @description('The number of elements in the array.') count}")}, +{str8_lit_comp("slice"), 1, str8_lit_comp("x:{ @description('An expression of a structure that is to be interpreted as a slice.') 'expression': expr_string}")}, +{str8_lit_comp("list"), 1, str8_lit_comp("x:\n{\n @description(\"An expression describing the first node in the list.\")\n 'expression': expr_string,\n @order(0) @description(\"The name of the member which encodes the link to the next node.\")\n 'member_name': code_string,\n}\n")}, +{str8_lit_comp("watch"), 0, str8_lit_comp("@inherit(tab) x:\n{\n @override @display_name('Tab Row Height') @description(\"Controls the tab's row height, in multiples of the font size.\")\n 'row_height': @range[1.75f, 5.f] f32,\n 'label': code_string,\n @description(\"The root expression which is evaluated to produce the watch window.\")\n 'expression': expr_string,\n @no_expand 'watches': set,\n}\n")}, +{str8_lit_comp("text"), 1, str8_lit_comp("@inherit(tab) @expand_commands(@output clear_output) x:\n{\n @description(\"An expression to describe data which should be viewed as text or code.\")\n 'expression': expr_string,\n @optional @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\n 'lang': code_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers':bool,\n @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\n 'line_wrapping': bool,\n @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\n 'scroll_to_bottom_on_change': bool,\n @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\n 'auto': bool,\n}\n")}, +{str8_lit_comp("disasm"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression to describe the base address or offset of the disassembly.\")\n 'expression': expr_string,\n @optional @description(\"The maximum number of bytes to disassemble.\")\n 'size': expr_string,\n @optional @description(\"The architecture to interpret the data as when disassembling.\")\n 'arch': code_string,\n @optional @description(\"The syntax style to use when displaying the disassembly textually.\")\n 'syntax': code_string,\n @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\n 'show_addresses': bool,\n @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\n 'show_code_bytes': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\n 'show_source_lines': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\n 'show_symbol_names': bool,\n @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\n 'show_line_numbers': bool,\n}\n")}, +{str8_lit_comp("memory"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Base Address\") @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\n 'expression': expr_string,\n @no_callee_helper @display_name(\"Zoom\") @description(\"The zoom level for displaying bytes in the memory view.\")\n @default(1.0) 'zoom': @range[0.5, 2] f32,\n @optional @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\n 'size': expr_string,\n @no_callee_helper @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\n 'cursor': expr_string,\n @no_callee_helper @default(1) @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\n 'cursor_size': @range[1, 16] u64,\n @optional @expand_if(\"!$.auto_columns\") @default(16) @description(\"The number of columns to build before building new rows.\")\n 'num_columns': @range[1, 64] u64,\n @optional @default(16) @display_name(\"Default Radix\") @description(\"The default radix with which numeric values should be displayed, when peeking.\")\n @or(2, 8, 10, 16)\n 'default_radix': u64,\n @no_callee_helper @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\n 'track_mark_to_cursor': bool,\n @no_callee_helper @default(1) @display_name(\"Allow Mutation\") @description(\"Allows operations which mutate memory.\")\n 'allow_mutation': bool,\n @no_callee_helper @default(0) @display_name(\"Automatically Size Columns\") @description(\"Determines the number of columns based on the available space.\")\n 'auto_columns': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Unsigned\") 'peek_as_unsigned': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Signed\") 'peek_as_signed': bool,\n @no_callee_helper @default(1) @display_name(\"Peek As Float\") 'peek_as_float': bool,\n @no_callee_helper @display_name(\"Extra Peek Types\") @description(\"A list of types as which to interpret selected memory.\")\n 'peek_types': set,\n}\n")}, +{str8_lit_comp("bitmap"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\n 'expression': expr_string,\n @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\n @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\n @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\n 'fmt': code_string,\n}\n")}, +{str8_lit_comp("color"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, +{str8_lit_comp("geo3d"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, +{str8_lit_comp("getting_started"), 0, str8_lit_comp("@inherit(tab) x:\n{\n}\n")}, +{str8_lit_comp("target"), 0, str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': set,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, +{str8_lit_comp("breakpoint"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\nx:\n{\n 'label': code_string,\n 'condition': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n 'hit_count': u64,\n 'address_range_size': @or(0, 1, 2, 4, 8) u64,\n 'break_on_write': bool,\n 'break_on_read': bool,\n 'break_on_execute': bool,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, +{str8_lit_comp("watch_pin"), 0, str8_lit_comp("@row_commands(duplicate_cfg, remove_cfg)\n@collection_commands(add_watch_pin, toggle_watch_pin)\nx:\n{\n 'expression': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n}\n")}, +{str8_lit_comp("debug_info"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @query 'guid': string,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, +{str8_lit_comp("file_path_map"), 0, str8_lit_comp("@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}")}, +{str8_lit_comp("type_view"), 0, str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, +{str8_lit_comp("recent_project"), 0, str8_lit_comp("x:{'path':path, 'name':string}")}, +{str8_lit_comp("machine"), 0, str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}")}, +{str8_lit_comp("process"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}")}, +{str8_lit_comp("module"), 0, str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}")}, +{str8_lit_comp("thread"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, +}; + +String8 rd_reg_slot_code_name_table[49] = +{ +{0}, +str8_lit_comp("machine"), +str8_lit_comp("module"), +str8_lit_comp("process"), +str8_lit_comp("thread"), +str8_lit_comp("ctrl_entity"), +str8_lit_comp("window"), +str8_lit_comp("panel"), +str8_lit_comp("tab"), +str8_lit_comp("view"), +str8_lit_comp("prev_tab"), +str8_lit_comp("dst_panel"), +str8_lit_comp("cfg"), +str8_lit_comp("cfg_list"), +str8_lit_comp("eval_space"), +str8_lit_comp("unwind_count"), +str8_lit_comp("inline_depth"), +str8_lit_comp("file_path"), +str8_lit_comp("cursor"), +str8_lit_comp("mark"), +str8_lit_comp("text_key"), +str8_lit_comp("lang_kind"), +str8_lit_comp("lines"), +str8_lit_comp("dbgi_key"), +str8_lit_comp("vaddr"), +str8_lit_comp("voff"), +str8_lit_comp("vaddr_range"), +str8_lit_comp("voff_range"), +str8_lit_comp("expr"), +str8_lit_comp("ui_key"), +str8_lit_comp("src_ui_key"), +str8_lit_comp("off_px"), +str8_lit_comp("reg_slot"), +str8_lit_comp("pid"), +str8_lit_comp("force_confirm"), +str8_lit_comp("force_focus"), +str8_lit_comp("prefer_disasm"), +str8_lit_comp("no_rich_tooltip"), +str8_lit_comp("do_implicit_root"), +str8_lit_comp("do_lister"), +str8_lit_comp("do_big_rows"), +str8_lit_comp("all_windows"), +str8_lit_comp("non_graphical"), +str8_lit_comp("prefer_new_tab"), +str8_lit_comp("activate_with_single_click"), +str8_lit_comp("dir2"), +str8_lit_comp("string"), +str8_lit_comp("cmd_name"), +str8_lit_comp("wm_event"), +}; + +Rng1U64 rd_reg_slot_range_table[49] = +{ +{0}, +{OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, module), OffsetOf(RD_Regs, module) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, process), OffsetOf(RD_Regs, process) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, thread), OffsetOf(RD_Regs, thread) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, ctrl_entity), OffsetOf(RD_Regs, ctrl_entity) + sizeof(D_Handle)}, +{OffsetOf(RD_Regs, window), OffsetOf(RD_Regs, window) + sizeof(CFG_ID)}, +{OffsetOf(RD_Regs, panel), OffsetOf(RD_Regs, panel) + sizeof(CFG_ID)}, +{OffsetOf(RD_Regs, tab), OffsetOf(RD_Regs, tab) + sizeof(CFG_ID)}, +{OffsetOf(RD_Regs, view), OffsetOf(RD_Regs, view) + sizeof(CFG_ID)}, +{OffsetOf(RD_Regs, prev_tab), OffsetOf(RD_Regs, prev_tab) + sizeof(CFG_ID)}, +{OffsetOf(RD_Regs, dst_panel), OffsetOf(RD_Regs, dst_panel) + sizeof(CFG_ID)}, +{OffsetOf(RD_Regs, cfg), OffsetOf(RD_Regs, cfg) + sizeof(CFG_ID)}, +{OffsetOf(RD_Regs, cfg_list), OffsetOf(RD_Regs, cfg_list) + sizeof(CFG_IDList)}, +{OffsetOf(RD_Regs, eval_space), OffsetOf(RD_Regs, eval_space) + sizeof(E_Space)}, +{OffsetOf(RD_Regs, unwind_count), OffsetOf(RD_Regs, unwind_count) + sizeof(U64)}, +{OffsetOf(RD_Regs, inline_depth), OffsetOf(RD_Regs, inline_depth) + sizeof(U64)}, +{OffsetOf(RD_Regs, file_path), OffsetOf(RD_Regs, file_path) + sizeof(String8)}, +{OffsetOf(RD_Regs, cursor), OffsetOf(RD_Regs, cursor) + sizeof(TxtPt)}, +{OffsetOf(RD_Regs, mark), OffsetOf(RD_Regs, mark) + sizeof(TxtPt)}, +{OffsetOf(RD_Regs, text_key), OffsetOf(RD_Regs, text_key) + sizeof(C_Key)}, +{OffsetOf(RD_Regs, lang_kind), OffsetOf(RD_Regs, lang_kind) + sizeof(TXT_LangKind)}, +{OffsetOf(RD_Regs, lines), OffsetOf(RD_Regs, lines) + sizeof(D_LineList)}, +{OffsetOf(RD_Regs, dbgi_key), OffsetOf(RD_Regs, dbgi_key) + sizeof(DI_Key)}, +{OffsetOf(RD_Regs, vaddr), OffsetOf(RD_Regs, vaddr) + sizeof(U64)}, +{OffsetOf(RD_Regs, voff), OffsetOf(RD_Regs, voff) + sizeof(U64)}, +{OffsetOf(RD_Regs, vaddr_range), OffsetOf(RD_Regs, vaddr_range) + sizeof(Rng1U64)}, +{OffsetOf(RD_Regs, voff_range), OffsetOf(RD_Regs, voff_range) + sizeof(Rng1U64)}, +{OffsetOf(RD_Regs, expr), OffsetOf(RD_Regs, expr) + sizeof(String8)}, +{OffsetOf(RD_Regs, ui_key), OffsetOf(RD_Regs, ui_key) + sizeof(UI_Key)}, +{OffsetOf(RD_Regs, src_ui_key), OffsetOf(RD_Regs, src_ui_key) + sizeof(UI_Key)}, +{OffsetOf(RD_Regs, off_px), OffsetOf(RD_Regs, off_px) + sizeof(Vec2F32)}, +{OffsetOf(RD_Regs, reg_slot), OffsetOf(RD_Regs, reg_slot) + sizeof(RD_RegSlot)}, +{OffsetOf(RD_Regs, pid), OffsetOf(RD_Regs, pid) + sizeof(U32)}, +{OffsetOf(RD_Regs, force_confirm), OffsetOf(RD_Regs, force_confirm) + sizeof(B32)}, +{OffsetOf(RD_Regs, force_focus), OffsetOf(RD_Regs, force_focus) + sizeof(B32)}, +{OffsetOf(RD_Regs, prefer_disasm), OffsetOf(RD_Regs, prefer_disasm) + sizeof(B32)}, +{OffsetOf(RD_Regs, no_rich_tooltip), OffsetOf(RD_Regs, no_rich_tooltip) + sizeof(B32)}, +{OffsetOf(RD_Regs, do_implicit_root), OffsetOf(RD_Regs, do_implicit_root) + sizeof(B32)}, +{OffsetOf(RD_Regs, do_lister), OffsetOf(RD_Regs, do_lister) + sizeof(B32)}, +{OffsetOf(RD_Regs, do_big_rows), OffsetOf(RD_Regs, do_big_rows) + sizeof(B32)}, +{OffsetOf(RD_Regs, all_windows), OffsetOf(RD_Regs, all_windows) + sizeof(B32)}, +{OffsetOf(RD_Regs, non_graphical), OffsetOf(RD_Regs, non_graphical) + sizeof(B32)}, +{OffsetOf(RD_Regs, prefer_new_tab), OffsetOf(RD_Regs, prefer_new_tab) + sizeof(B32)}, +{OffsetOf(RD_Regs, activate_with_single_click), OffsetOf(RD_Regs, activate_with_single_click) + sizeof(B32)}, +{OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)}, +{OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)}, +{OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)}, +{OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, +}; + +RD_CmdKindInfo rd_cmd_kind_info_table[249] = +{ +{0}, +{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("launch_and_step_into"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the first instruction after the current scope is exited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, +{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, +{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("list_breakpoints"), str8_lit_comp("Lists all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("globals"), str8_lit_comp("Opens a Globals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("thread_locals"), str8_lit_comp("Opens a Thread Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("types"), str8_lit_comp("Opens a Types tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("procedures"), str8_lit_comp("Opens a Procedures tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("call_stack"), str8_lit_comp("Opens a Call Stack tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("targets"), str8_lit_comp("Opens a Targets tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("breakpoints"), str8_lit_comp("Opens a Breakpoints tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("watch_pins"), str8_lit_comp("Opens a Watch Pins tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("debug_infos"), str8_lit_comp("Opens a Debug Info tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("threads"), str8_lit_comp("Opens a Threads tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("processes"), str8_lit_comp("Opens a Processes tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("machines"), str8_lit_comp("Opens a Machines tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("modules"), str8_lit_comp("Opens a Modules tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("file_path_maps"), str8_lit_comp("Opens a File Path Map tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("type_views"), str8_lit_comp("Opens a Type Views tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("output"), str8_lit_comp("Opens a Output tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("text"), str8_lit_comp("Opens a Text tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("disasm"), str8_lit_comp("Opens a Disassembly tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("memory"), str8_lit_comp("Opens a Memory tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("bitmap"), str8_lit_comp("Opens a Bitmap tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("color"), str8_lit_comp("Opens a Color tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("geo3d"), str8_lit_comp("Opens a Geometry (3D) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +}; + +struct {String8 string; CFG_Binding binding;} rd_default_binding_table[114] = +{ +{str8_lit_comp("kill_all"), {WM_Key_F5, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("step_into_inst"), {WM_Key_F11, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("step_over_inst"), {WM_Key_F10, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("step_out"), {WM_Key_F11, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("halt"), {WM_Key_X, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("halt"), {WM_Key_Pause, 0 }}, +{str8_lit_comp("run"), {WM_Key_F5, 0 }}, +{str8_lit_comp("restart"), {WM_Key_F5, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("step_into"), {WM_Key_F11, 0 }}, +{str8_lit_comp("step_over"), {WM_Key_F10, 0 }}, +{str8_lit_comp("run_to_line"), {WM_Key_F10, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("set_next_statement"), {WM_Key_F10, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("inc_window_font_size"), {WM_Key_Equal, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("dec_window_font_size"), {WM_Key_Minus, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("toggle_fullscreen"), {WM_Key_Return, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("new_panel_right"), {WM_Key_P, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("new_panel_down"), {WM_Key_Minus, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("rotate_panel_columns"), {WM_Key_2, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("next_panel"), {WM_Key_Comma, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("prev_panel"), {WM_Key_Comma, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("focus_panel_right"), {WM_Key_Right, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("focus_panel_left"), {WM_Key_Left, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("focus_panel_up"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("focus_panel_down"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("undo"), {WM_Key_Z, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("redo"), {WM_Key_Y, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("go_back"), {WM_Key_Left, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("go_forward"), {WM_Key_Right, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("close_panel"), {WM_Key_P, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("next_tab"), {WM_Key_PageDown, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("prev_tab"), {WM_Key_PageUp, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("next_tab"), {WM_Key_Tab, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("prev_tab"), {WM_Key_Tab, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_tab_right"), {WM_Key_PageDown, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_tab_left"), {WM_Key_PageUp, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("close_tab"), {WM_Key_W, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("tab_bar_top"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("tab_bar_bottom"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("open_tab"), {WM_Key_T, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("tab_settings"), {WM_Key_T, 0 |WM_Modifier_Ctrl |WM_Modifier_Alt}}, +{str8_lit_comp("open"), {WM_Key_O, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("open_source_file_from_debug_info"), {WM_Key_I, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("switch_to_partner_file"), {WM_Key_O, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("new_project"), {WM_Key_N, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("open_project"), {WM_Key_O, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("save_project"), {WM_Key_S, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("edit"), {WM_Key_F2, 0 }}, +{str8_lit_comp("accept"), {WM_Key_Return, 0 }}, +{str8_lit_comp("accept"), {WM_Key_Space, 0 }}, +{str8_lit_comp("cancel"), {WM_Key_Esc, 0 }}, +{str8_lit_comp("focus_menu"), {WM_Key_D, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("move_left"), {WM_Key_Left, 0 }}, +{str8_lit_comp("move_right"), {WM_Key_Right, 0 }}, +{str8_lit_comp("move_up"), {WM_Key_Up, 0 }}, +{str8_lit_comp("move_down"), {WM_Key_Down, 0 }}, +{str8_lit_comp("move_left_select"), {WM_Key_Left, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_right_select"), {WM_Key_Right, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_select"), {WM_Key_Up, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_down_select"), {WM_Key_Down, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_left_chunk"), {WM_Key_Left, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_right_chunk"), {WM_Key_Right, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_up_chunk"), {WM_Key_Up, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_down_chunk"), {WM_Key_Down, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_up_page"), {WM_Key_PageUp, 0 }}, +{str8_lit_comp("move_down_page"), {WM_Key_PageDown, 0 }}, +{str8_lit_comp("move_up_whole"), {WM_Key_Home, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_down_whole"), {WM_Key_End, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("move_left_chunk_select"), {WM_Key_Left, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_right_chunk_select"), {WM_Key_Right, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_chunk_select"), {WM_Key_Up, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_down_chunk_select"), {WM_Key_Down, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_page_select"), {WM_Key_PageUp, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_down_page_select"), {WM_Key_PageDown, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_whole_select"), {WM_Key_Home, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_down_whole_select"), {WM_Key_End, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("move_up_reorder"), {WM_Key_Up, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("move_down_reorder"), {WM_Key_Down, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("move_home"), {WM_Key_Home, 0 }}, +{str8_lit_comp("move_end"), {WM_Key_End, 0 }}, +{str8_lit_comp("move_home_select"), {WM_Key_Home, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("move_end_select"), {WM_Key_End, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("select_all"), {WM_Key_A, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("delete_single"), {WM_Key_Delete, 0 }}, +{str8_lit_comp("delete_chunk"), {WM_Key_Delete, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("backspace_single"), {WM_Key_Backspace, 0 }}, +{str8_lit_comp("backspace_chunk"), {WM_Key_Backspace, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("copy"), {WM_Key_C, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("copy"), {WM_Key_Insert, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("cut"), {WM_Key_X, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("paste"), {WM_Key_V, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("paste"), {WM_Key_Insert, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("insert_text"), {WM_Key_Null, 0 }}, +{str8_lit_comp("move_next"), {WM_Key_Tab, 0 }}, +{str8_lit_comp("move_prev"), {WM_Key_Tab, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("goto_line"), {WM_Key_G, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("goto_address"), {WM_Key_G, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("search"), {WM_Key_F, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("search_backwards"), {WM_Key_R, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("find_next"), {WM_Key_F3, 0 }}, +{str8_lit_comp("find_prev"), {WM_Key_F3, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("find_selected_thread"), {WM_Key_F4, 0 }}, +{str8_lit_comp("goto_name"), {WM_Key_J, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("goto_name_at_cursor"), {WM_Key_F12, 0 }}, +{str8_lit_comp("toggle_watch_expr_at_cursor"), {WM_Key_W, 0 |WM_Modifier_Alt}}, +{str8_lit_comp("toggle_watch_expr_at_mouse"), {WM_Key_D, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("toggle_watch_pin"), {WM_Key_F9, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("toggle_breakpoint"), {WM_Key_F9, 0 }}, +{str8_lit_comp("add_address_breakpoint"), {WM_Key_F9, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("add_function_breakpoint"), {WM_Key_F9, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("attach"), {WM_Key_F6, 0 |WM_Modifier_Shift }}, +{str8_lit_comp("open_palette"), {WM_Key_F1, 0 }}, +{str8_lit_comp("open_palette"), {WM_Key_P, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift }}, +{str8_lit_comp("log_marker"), {WM_Key_M, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +{str8_lit_comp("toggle_dev_menu"), {WM_Key_D, 0 |WM_Modifier_Ctrl |WM_Modifier_Shift |WM_Modifier_Alt}}, +}; + +String8 rd_binding_version_remap_old_name_table[9] = +{ +str8_lit_comp("commands"), +str8_lit_comp("load_user"), +str8_lit_comp("load_profile"), +str8_lit_comp("load_project"), +str8_lit_comp("open_profile"), +str8_lit_comp("address_breakpoint"), +str8_lit_comp("function_breakpoint"), +str8_lit_comp("toggle_breakpoint_cursor"), +str8_lit_comp("switch"), +}; + +String8 rd_binding_version_remap_new_name_table[9] = +{ +str8_lit_comp("run_command"), +str8_lit_comp("open_user"), +str8_lit_comp("open_profile"), +str8_lit_comp("open_project"), +str8_lit_comp("open_project"), +str8_lit_comp("add_address_breakpoint"), +str8_lit_comp("add_function_breakpoint"), +str8_lit_comp("toggle_breakpoint"), +str8_lit_comp("open_source_file_from_debug_info"), +}; + +String8 rd_icon_kind_text_table[75] = +{ +str8_lit_comp(""), +str8_lit_comp("b"), +str8_lit_comp("c"), +str8_lit_comp("B"), +str8_lit_comp("C"), +str8_lit_comp("f"), +str8_lit_comp("F"), +str8_lit_comp("g"), +str8_lit_comp("h"), +str8_lit_comp("r"), +str8_lit_comp("s"), +str8_lit_comp("i"), +str8_lit_comp("w"), +str8_lit_comp("W"), +str8_lit_comp("k"), +str8_lit_comp("K"), +str8_lit_comp("L"), +str8_lit_comp("R"), +str8_lit_comp("U"), +str8_lit_comp("D"), +str8_lit_comp("G"), +str8_lit_comp("P"), +str8_lit_comp("3"), +str8_lit_comp("p"), +str8_lit_comp("O"), +str8_lit_comp("o"), +str8_lit_comp("!"), +str8_lit_comp("1"), +str8_lit_comp("V"), +str8_lit_comp("<"), +str8_lit_comp(">"), +str8_lit_comp("^"), +str8_lit_comp("v"), +str8_lit_comp("9"), +str8_lit_comp("0"), +str8_lit_comp("7"), +str8_lit_comp("8"), +str8_lit_comp("+"), +str8_lit_comp("-"), +str8_lit_comp("'"), +str8_lit_comp("\""), +str8_lit_comp("M"), +str8_lit_comp("."), +str8_lit_comp("x"), +str8_lit_comp("q"), +str8_lit_comp("j"), +str8_lit_comp("u"), +str8_lit_comp("m"), +str8_lit_comp("n"), +str8_lit_comp("l"), +str8_lit_comp("a"), +str8_lit_comp("z"), +str8_lit_comp("y"), +str8_lit_comp("X"), +str8_lit_comp("Y"), +str8_lit_comp("S"), +str8_lit_comp("T"), +str8_lit_comp("Z"), +str8_lit_comp("d"), +str8_lit_comp("N"), +str8_lit_comp("E"), +str8_lit_comp("H"), +str8_lit_comp("e"), +str8_lit_comp("I"), +str8_lit_comp("J"), +str8_lit_comp("A"), +str8_lit_comp("?"), +str8_lit_comp("4"), +str8_lit_comp("5"), +str8_lit_comp("6"), +str8_lit_comp("&"), +str8_lit_comp("*"), +str8_lit_comp("("), +str8_lit_comp(")"), +str8_lit_comp("#"), +}; + +String8 rd_code_color_slot_name_table[14] = +{ +str8_lit_comp("code_default"), +str8_lit_comp("code_symbol"), +str8_lit_comp("code_type"), +str8_lit_comp("code_local"), +str8_lit_comp("code_register"), +str8_lit_comp("code_keyword"), +str8_lit_comp("code_delimiter_or_operator"), +str8_lit_comp("code_numeric"), +str8_lit_comp("code_numeric_alt_digit_group"), +str8_lit_comp("code_string"), +str8_lit_comp("code_meta"), +str8_lit_comp("code_comment"), +str8_lit_comp("code_line_numbers"), +str8_lit_comp("code_line_numbers_selected"), +}; + +String8 rd_theme_preset_display_string_table[11] = +{ +str8_lit_comp("Default (Dark)"), +str8_lit_comp("Default (Light)"), +str8_lit_comp("VS (Dark)"), +str8_lit_comp("VS (Light)"), +str8_lit_comp("Solarized (Dark)"), +str8_lit_comp("Solarized (Light)"), +str8_lit_comp("Handmade Hero"), +str8_lit_comp("Naysayer"), +str8_lit_comp("4coder"), +str8_lit_comp("Grove"), +str8_lit_comp("Far Manager"), +}; + +String8 rd_theme_preset_code_string_table[11] = +{ +str8_lit_comp("default_dark"), +str8_lit_comp("default_light"), +str8_lit_comp("vs_dark"), +str8_lit_comp("vs_light"), +str8_lit_comp("solarized_dark"), +str8_lit_comp("solarized_light"), +str8_lit_comp("handmade_hero"), +str8_lit_comp("naysayer"), +str8_lit_comp("four_coder"), +str8_lit_comp("grove"), +str8_lit_comp("far_manager"), +}; + +String8 rd_theme_preset_cfg_string_table[11] = +{ +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x1f1f1fff}\n theme_color:{tags: \"alt background\", value: 0x222222ff}\n theme_color:{tags: \"pop background\", value: 0x675331ff}\n theme_color:{tags: \"fresh background\", value: 0x3d3631ff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x404040ff}\n theme_color:{tags: text, value: 0xe5e5e5ff}\n theme_color:{tags: \"weak text\", value: 0xa4a4a4ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xabdeffff}\n theme_color:{tags: \"focus overlay\", value: 0x2292eb14}\n theme_color:{tags: \"focus border\", value: 0x2392ebff}\n theme_color:{tags: cursor, value: 0x8aff00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x16}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xecececff}\n theme_color:{tags: code_symbol, value: 0xebb624ff}\n theme_color:{tags: code_type, value: 0xebb624ff}\n theme_color:{tags: code_local, value: 0xa7dae8ff}\n theme_color:{tags: code_register, value: 0xb7afd5ff}\n theme_color:{tags: code_keyword, value: 0x838b8fff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x838b8fff}\n theme_color:{tags: code_numeric, value: 0x9cb198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x6d8e67ff}\n theme_color:{tags: code_string, value: 0x9cb198ff}\n theme_color:{tags: code_meta, value: 0xb9819aff}\n theme_color:{tags: code_comment, value: 0x627b5eff}\n theme_color:{tags: line_info_0, value: 0x3c2d25ff}\n theme_color:{tags: line_info_1, value: 0x3c3925ff}\n theme_color:{tags: line_info_2, value: 0x2e4837ff}\n theme_color:{tags: line_info_3, value: 0x2e3d48ff}\n theme_color:{tags: line_info_4, value: 0x3c2d25ff}\n theme_color:{tags: line_info_5, value: 0x3c3925ff}\n theme_color:{tags: line_info_6, value: 0x2e4837ff}\n theme_color:{tags: line_info_7, value: 0x2e3d48ff}\n theme_color:{tags: thread_0, value: 0xebb624ff}\n theme_color:{tags: thread_1, value: 0x26d0d2ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x1b1b1baf}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\n theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x333333ff}\n theme_color:{tags: \"tab border\", value: 0x2392ebff}\n theme_color:{tags: \"tab inactive background\", value: 0}\n theme_color:{tags: \"tab inactive border\", value: 0x42494eff}\n theme_color:{tags: \"tab auto background\", value: 0x3e4d6eff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x3e4d6e39}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0xffffffff }\n theme_color:{ tags: \"alt background\" , value: 0xf8f8f8ff }\n theme_color:{ tags: \"pop background\" , value: 0xcbe4f2ff }\n theme_color:{ tags: \"menu_bar pop background\" , value: 0x5aabd9ff }\n theme_color:{ tags: \"fresh background\" , value: 0xeaddceff }\n theme_color:{ tags: \"match background\" , value: 0xc1e9c4ff }\n theme_color:{ tags: border , value: 0xcbcbcbff }\n theme_color:{ tags: text , value: 0xff }\n theme_color:{ tags: \"weak text\" , value: 0x727272ff }\n theme_color:{ tags: \"good text\" , value: 0x217538ff }\n theme_color:{ tags: \"neutral text\" , value: 0x1a5b7cff }\n theme_color:{ tags: \"bad text\" , value: 0x972717ff }\n theme_color:{ tags: hover , value: 0xff }\n theme_color:{ tags: \"focus overlay\" , value: 0x67ff4b }\n theme_color:{ tags: \"focus border\" , value: 0x67ffff }\n theme_color:{ tags: cursor , value: 0xff }\n theme_color:{ tags: selection , value: 0x283d5166 }\n theme_color:{ tags: \"inactive background\" , value: 0x8 }\n theme_color:{ tags: drop_shadow , value: 0xb }\n theme_color:{ tags: \"good_pop background\" , value: 0x90c09aff }\n theme_color:{ tags: \"good_pop border\" , value: 0x1e7231ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0xa93620ff }\n theme_color:{ tags: \"bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar bad_pop background\" , value: 0xff2a00ff }\n theme_color:{ tags: \"menu_bar bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0x80808ff }\n theme_color:{ tags: code_symbol , value: 0x4ac3ff }\n theme_color:{ tags: code_type , value: 0xf46200ff }\n theme_color:{ tags: code_local , value: 0x317c00ff }\n theme_color:{ tags: code_register , value: 0x9a00ffff }\n theme_color:{ tags: code_keyword , value: 0xff0600ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x8a8a8aff }\n theme_color:{ tags: code_numeric , value: 0x7d49ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0xb56aff }\n theme_color:{ tags: code_string , value: 0x63549fff }\n theme_color:{ tags: code_meta , value: 0xd96759ff }\n theme_color:{ tags: code_comment , value: 0x717171ff }\n theme_color:{ tags: line_info_0 , value: 0xe6d5cdff }\n theme_color:{ tags: line_info_1 , value: 0xdbcfb2ff }\n theme_color:{ tags: line_info_2 , value: 0xddeac1ff }\n theme_color:{ tags: line_info_3 , value: 0xddc4bdff }\n theme_color:{ tags: line_info_4 , value: 0xba917eff }\n theme_color:{ tags: thread_0 , value: 0xffa700ff }\n theme_color:{ tags: thread_1 , value: 0xb41fff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xff2800ff }\n theme_color:{ tags: \"floating background\" , value: 0xffffffc7 }\n theme_color:{ tags: \"floating background alt\" , value: 0x23 }\n theme_color:{ tags: \"floating background fresh\" , value: 0xeaddceff }\n theme_color:{ tags: \"floating border\" , value: 0x88888884 }\n theme_color:{ tags: \"scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"menu_bar background\" , value: 0x2b6b9aff }\n theme_color:{ tags: \"menu_bar border\" , value: 0x4d }\n theme_color:{ tags: \"menu_bar text\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"good menu_bar text\" , value: 0x70db8dff }\n theme_color:{ tags: \"bad menu_bar text\" , value: 0xffa79bff }\n theme_color:{ tags: \"neutral menu_bar text\" , value: 0xc4dbe7ff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab text\" , value: 0xffffffff }\n theme_color:{ tags: \"tab text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"tab background\" , value: 0xb67e48ff }\n theme_color:{ tags: \"tab border\" , value: 0x875b31ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0xcacacaff }\n theme_color:{ tags: \"tab inactive border\" , value: 0xb5b5b5ff }\n theme_color:{ tags: \"tab auto background\" , value: 0xc41c69ff }\n theme_color:{ tags: \"tab auto border\" , value: 0x981039ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x9b88a3ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x373737ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0x1f1f1fff }\n theme_color:{ tags: \"alt background\" , value: 0x222222ff }\n theme_color:{ tags: \"pop background\" , value: 0x383167ff }\n theme_color:{ tags: \"fresh background\" , value: 0x31393dff }\n theme_color:{ tags: \"match background\" , value: 0x31393dff }\n theme_color:{ tags: border , value: 0x404040ff }\n theme_color:{ tags: text , value: 0xe5e5e5ff }\n theme_color:{ tags: \"weak text\" , value: 0xa4a4a4ff }\n theme_color:{ tags: \"good text\" , value: 0x32a852ff }\n theme_color:{ tags: \"neutral text\" , value: 0x3a90bbff }\n theme_color:{ tags: \"bad text\" , value: 0xcf5242ff }\n theme_color:{ tags: hover , value: 0xffffffff }\n theme_color:{ tags: \"focus overlay\" , value: 0x7160e81e }\n theme_color:{ tags: \"focus border\" , value: 0x7160e8ff }\n theme_color:{ tags: cursor , value: 0x8aff00ff }\n theme_color:{ tags: selection , value: 0x99ccff0f }\n theme_color:{ tags: \"inactive background\" , value: 0x0000002f }\n theme_color:{ tags: drop_shadow , value: 0x0000007f }\n theme_color:{ tags: \"good_pop background\" , value: 0x2c5b36ff }\n theme_color:{ tags: \"good_pop border\" , value: 0x568761ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0x803425ff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0xe0e0e0ff }\n theme_color:{ tags: code_symbol , value: 0xdcdcaaff }\n theme_color:{ tags: code_type , value: 0x4ec9b0ff }\n theme_color:{ tags: code_local , value: 0x9cdcfeff }\n theme_color:{ tags: code_register , value: 0xb7afd5ff }\n theme_color:{ tags: code_keyword , value: 0x569cd6ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x767676ff }\n theme_color:{ tags: code_numeric , value: 0xb5cea8ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0x7c986dff }\n theme_color:{ tags: code_string , value: 0xd69d85ff }\n theme_color:{ tags: code_meta , value: 0x9b9b9bff }\n theme_color:{ tags: code_comment , value: 0x51a644ff }\n theme_color:{ tags: line_info_0 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_1 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_2 , value: 0x434e2aff }\n theme_color:{ tags: line_info_3 , value: 0x36241fff }\n theme_color:{ tags: line_info_4 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_5 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_6 , value: 0x434e2aff }\n theme_color:{ tags: line_info_7 , value: 0x36241fff }\n theme_color:{ tags: thread_0 , value: 0xffdc48ff }\n theme_color:{ tags: thread_1 , value: 0xb2ff65ff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xa72911ff }\n theme_color:{ tags: \"floating background\" , value: 0x1b1b1baf }\n theme_color:{ tags: \"floating background alt\" , value: 0x0000005f }\n theme_color:{ tags: \"floating background fresh\" , value: 0x31393d5f }\n theme_color:{ tags: \"floating border\" , value: 0xbfbfbf1f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0x3b3b3b5f }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"scroll_bar background\" , value: 0x2b2b2bff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x3f3f3fff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab background\" , value: 0x333333ff }\n theme_color:{ tags: \"tab border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0x171717ff }\n theme_color:{ tags: \"tab inactive border\" , value: 0x3e4c57ff }\n theme_color:{ tags: \"tab auto background\" , value: 0x3f386dff }\n theme_color:{ tags: \"tab auto border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x2f2633ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x685073ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0xffffffff}\n theme_color:{tags: \"alt background\", value: 0xefefefff}\n theme_color:{tags: \"pop background\", value: 0xe3eaf2ff}\n theme_color:{tags: \"fresh background\", value: 0xeccbbeff}\n theme_color:{tags: \"match background\", value: 0xedcbf9ff}\n theme_color:{tags: border, value: 0xe7e7e7ff}\n theme_color:{tags: text, value: 0xff}\n theme_color:{tags: \"weak text\", value: 0x353535ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xa7ffff}\n theme_color:{tags: \"focus overlay\", value: 0x8eff3f}\n theme_color:{tags: \"focus border\", value: 0x8effff}\n theme_color:{tags: cursor, value: 0xff}\n theme_color:{tags: selection, value: 0x56aaff77}\n theme_color:{tags: \"inactive background\", value: 0x17}\n theme_color:{tags: drop_shadow, value: 0xe7b27}\n theme_color:{tags: \"good_pop background\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop border\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0xcb3f23ff}\n theme_color:{tags: \"bad_pop text\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop text weak\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0x000000ff}\n theme_color:{tags: code_symbol, value: 0x74531fff}\n theme_color:{tags: code_type, value: 0x2b91afff}\n theme_color:{tags: code_local, value: 0x1f377fff}\n theme_color:{tags: code_register, value: 0x8a1bffff}\n theme_color:{tags: code_keyword, value: 0x0000ffff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\n theme_color:{tags: code_numeric, value: 0xff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x1d1d1dff}\n theme_color:{tags: code_string, value: 0xa61515ff}\n theme_color:{tags: code_meta, value: 0x808080ff}\n theme_color:{tags: code_comment, value: 0x008000ff}\n theme_color:{tags: line_info_0, value: 0xb5d9c8ff}\n theme_color:{tags: line_info_1, value: 0xa9c1d0ff}\n theme_color:{tags: line_info_2, value: 0x99abc5ff}\n theme_color:{tags: line_info_3, value: 0xc6bcd5ff}\n theme_color:{tags: thread_0, value: 0xffb141ff}\n theme_color:{tags: thread_1, value: 0x66c407ff}\n theme_color:{tags: thread_unwound, value: 0x67b3d7ff}\n theme_color:{tags: thread_error, value: 0xff2900ff}\n theme_color:{tags: breakpoint, value: 0xff2800ff}\n theme_color:{tags: \"floating background\", value: 0xffffffff}\n theme_color:{tags: \"floating background alt\", value: 0x11}\n theme_color:{tags: \"floating background fresh\", value: 0xa0c2d318}\n theme_color:{tags: \"floating border\", value: 0x50}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"menu_bar background\", value: 0xccd5f0ff}\n theme_color:{tags: \"menu_bar border\", value: 0xbabdc3ff}\n theme_color:{tags: \"scroll_bar background\", value: 0xe4e4e4ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0xf5cc84ff}\n theme_color:{tags: \"tab border\", value: 0xae7718ff}\n theme_color:{tags: \"tab inactive background\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab inactive text\", value: 0xffffffff}\n theme_color:{tags: \"tab inactive border\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab auto background\", value: 0xe99595ff}\n theme_color:{tags: \"tab auto border\", value: 0xff6262ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0xac6060ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0xff6262ff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xa7ffff}\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x002a35ff}\n theme_color:{tags: \"alt background\", value: 0x053542ff}\n theme_color:{tags: \"pop background\", value: 0x355b6eff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x65166ff}\n theme_color:{tags: text, value: 0xeee8d5ff}\n theme_color:{tags: \"weak text\", value: 0x93a1a1ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xca4b16ff}\n theme_color:{tags: \"focus overlay\", value: 0xca4b151f}\n theme_color:{tags: \"focus border\", value: 0xca4b16ff}\n theme_color:{tags: cursor, value: 0xca4b16ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x5f8700ff}\n theme_color:{tags: \"good_pop border\", value: 0x5f8700ff}\n theme_color:{tags: \"bad_pop background\", value: 0x810000ff}\n theme_color:{tags: code_default, value: 0x839496ff}\n theme_color:{tags: code_symbol, value: 0xb3880eff}\n theme_color:{tags: code_type, value: 0xb3880eff}\n theme_color:{tags: code_local, value: 0xeee8d5ff}\n theme_color:{tags: code_register, value: 0xeee8d5ff}\n theme_color:{tags: code_keyword, value: 0x849804ff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\n theme_color:{tags: code_numeric, value: 0x2aa198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\n theme_color:{tags: code_string, value: 0x2aa198ff}\n theme_color:{tags: code_meta, value: 0xca4b16ff}\n theme_color:{tags: code_comment, value: 0x586e75ff}\n theme_color:{tags: line_info_0, value: 0x4f3022ff}\n theme_color:{tags: line_info_1, value: 0x4f3e15ff}\n theme_color:{tags: line_info_2, value: 0x434e2aff}\n theme_color:{tags: line_info_3, value: 0x36241fff}\n theme_color:{tags: thread_0, value: 0xffcb7fff}\n theme_color:{tags: thread_1, value: 0xb2ff65ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x2a3574}\n theme_color:{tags: \"floating background alt\", value: 0x4f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x53542ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x53542ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x586e75ff}\n theme_color:{tags: \"tab border\", value: 0x90abb3ff}\n theme_color:{tags: \"tab inactive background\", value: 0x0}\n theme_color:{tags: \"tab inactive border\", value: 0x33494fff}\n theme_color:{tags: \"tab auto background\", value: 0x565ed2ff}\n theme_color:{tags: \"tab auto border\", value: 0xa2a6dfff}\n theme_color:{tags: \"tab auto inactive background\", value: 0}\n theme_color:{tags: \"tab auto inactive border\", value: 0x595fbcff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0xfdf6e3ff}\n theme_color:{tags: \"alt background\", value: 0xeee8d5ff}\n theme_color:{tags: \"pop background\", value: 0x29a19890}\n theme_color:{tags: \"fresh background\", value: 0xf7d38dff}\n theme_color:{tags: \"match background\", value: 0xdcddddff}\n theme_color:{tags: border, value: 0xd1ccbdff}\n theme_color:{tags: \"weak text\", value: 0x93a1a1ff}\n theme_color:{tags: text, value: 0x657b83ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xca4b16ff}\n theme_color:{tags: \"focus overlay\", value: 0xca4b1454}\n theme_color:{tags: \"focus border\", value: 0xca4b16ff}\n theme_color:{tags: cursor, value: 0xca4b16ff}\n theme_color:{tags: selection, value: 0x8594a264}\n theme_color:{tags: \"inactive background\", value: 0x14}\n theme_color:{tags: drop_shadow, value: 0x3a}\n theme_color:{tags: \"good_pop background\", value: 0xd1e99aff}\n theme_color:{tags: \"good_pop border\", value: 0xd1e99aff}\n theme_color:{tags: \"bad_pop background\", value: 0xd26c6cff}\n theme_color:{tags: \"bad_pop border\", value: 0xd26c6cff}\n theme_color:{tags: \"bad_pop weak text\", value: 0xffffffff}\n theme_color:{tags: \"bad_pop text\", value: 0xffffffff}\n theme_color:{tags: code_default, value: 0x839496ff}\n theme_color:{tags: code_symbol, value: 0xb3880eff}\n theme_color:{tags: code_type, value: 0xb3880eff}\n theme_color:{tags: code_local, value: 0x657b83ff}\n theme_color:{tags: code_register, value: 0x947298ff}\n theme_color:{tags: code_keyword, value: 0x849804ff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\n theme_color:{tags: code_numeric, value: 0x2aa198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\n theme_color:{tags: code_string, value: 0x2aa198ff}\n theme_color:{tags: code_meta, value: 0xca4b16ff}\n theme_color:{tags: code_comment, value: 0x586e75ff}\n theme_color:{tags: line_info_0, value: 0xeee1dbff}\n theme_color:{tags: line_info_1, value: 0xe5d5b1ff}\n theme_color:{tags: line_info_2, value: 0xd9e8b6ff}\n theme_color:{tags: line_info_3, value: 0xf5d5ccff}\n theme_color:{tags: thread_0, value: 0xffa100ff}\n theme_color:{tags: thread_1, value: 0x6edd00ff}\n theme_color:{tags: thread_unwound, value: 0x708f9eff}\n theme_color:{tags: thread_error, value: 0xff5231ff}\n theme_color:{tags: breakpoint, value: 0xff411dff}\n theme_color:{tags: \"floating background\", value: 0xfdf6e3b1}\n theme_color:{tags: \"floating background alt\", value: 0x22}\n theme_color:{tags: \"floating background fresh\", value: 0xf7d38dff}\n theme_color:{tags: \"scroll_bar background\", value: 0xeee6d0ff}\n theme_color:{tags: \"scroll_bar floating background\", value: 0xd5ccb5ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0xfdf6e3ff}\n theme_color:{tags: \"tab inactive background\", value: 0xe0d6bbff}\n theme_color:{tags: \"tab auto background\", value: 0xf5cfe1ff}\n theme_color:{tags: \"tab auto border\", value: 0xa2a6dfff}\n theme_color:{tags: \"tab auto inactive background\", value: 0xc8a5b5ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x595fbcff}\n theme_color:{tags: \"drop_site background\", value: 0x29a19890}\n theme_color:{tags: \"drop_site border\", value: 0x81ddd690}\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x0c0c0cff}\n theme_color:{tags: \"alt background\", value: 0x161616ff}\n theme_color:{tags: \"pop background\", value: 0x355b6eff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x404040ff}\n theme_color:{tags: text, value: 0xcac1b6ff}\n theme_color:{tags: \"weak text\", value: 0xa08563ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xffffffff}\n theme_color:{tags: \"focus overlay\", value: 0x7485971e}\n theme_color:{tags: \"focus border\", value: 0x5e6b79ff}\n theme_color:{tags: cursor, value: 0x00ee00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xa08563ff}\n theme_color:{tags: code_symbol, value: 0xcc5735ff}\n theme_color:{tags: code_type, value: 0xd8a51cff}\n theme_color:{tags: code_local, value: 0xd6b995ff}\n theme_color:{tags: code_register, value: 0xc04047ff}\n theme_color:{tags: code_keyword, value: 0xac7b0aff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x907553ff}\n theme_color:{tags: code_numeric, value: 0x6b8e23ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x4f681cff}\n theme_color:{tags: code_string, value: 0x6b8e23ff}\n theme_color:{tags: code_meta, value: 0xdab98fff}\n theme_color:{tags: code_comment, value: 0x686868ff}\n theme_color:{tags: line_info_0, value: 0x4f3022ff}\n theme_color:{tags: line_info_1, value: 0x4f3e15ff}\n theme_color:{tags: line_info_2, value: 0x434e2aff}\n theme_color:{tags: line_info_3, value: 0x36241fff}\n theme_color:{tags: thread_0, value: 0xffcb7fff}\n theme_color:{tags: thread_1, value: 0xb2ff65ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x18181980}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"menu_bar background\", value: 0x1f1f27ff}\n theme_color:{tags: \"menu_bar border\", value: 0x3d3d47ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\n theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x1f1f27ff}\n theme_color:{tags: \"tab border\", value: 0x3d3d47ff}\n theme_color:{tags: \"tab text\", value: 0xca9301ff}\n theme_color:{tags: \"tab text weak\", value: 0x8c690eff}\n theme_color:{tags: \"tab inactive background\", value: 0x171718ff}\n theme_color:{tags: \"tab inactive border\", value: 0x1f1f27ff}\n theme_color:{tags: \"tab auto background\", value: 0x243b38ff}\n theme_color:{tags: \"tab auto border\", value: 0x478980ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x102623ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x1e5850ff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x042327ff}\n theme_color:{tags: \"alt background\", value: 0x11b1fff}\n theme_color:{tags: \"pop background\", value: 0x355b6eff}\n theme_color:{tags: \"pop text\", value: 0xbad7e6ff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x334d50ff}\n theme_color:{tags: text, value: 0xdad3beff}\n theme_color:{tags: \"weak text\", value: 0xb0a688ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: \"menu_bar good text\", value: 0x2a8242ff}\n theme_color:{tags: \"menu_bar neutral text\", value: 0x5681ff}\n theme_color:{tags: \"menu_bar bad text\", value: 0xa21200ff}\n theme_color:{tags: \"menu_bar weak text\", value: 0x313131ff}\n theme_color:{tags: \"menu_bar bad_pop text weak\", value: 0xffffffff}\n theme_color:{tags: hover, value: 0xffffffff}\n theme_color:{tags: \"focus overlay\", value: 0x86e08e20}\n theme_color:{tags: \"focus border\", value: 0x86e08fff}\n theme_color:{tags: cursor, value: 0x86e08fff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xbdb395ff}\n theme_color:{tags: code_symbol, value: 0xcbe0f5ff}\n theme_color:{tags: code_type, value: 0xcbe0f5ff}\n theme_color:{tags: code_local, value: 0xd9cfb3ff}\n theme_color:{tags: code_register, value: 0xb7afd5ff}\n theme_color:{tags: code_keyword, value: 0x9de3c0ff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\n theme_color:{tags: code_numeric, value: 0x2ca198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x217770ff}\n theme_color:{tags: code_string, value: 0x2ca198ff}\n theme_color:{tags: code_meta, value: 0xB0FFB0ff}\n theme_color:{tags: code_comment, value: 0x31b72cff}\n theme_color:{tags: line_info_0, value: 0x4f3022ff}\n theme_color:{tags: line_info_1, value: 0x4f3e15ff}\n theme_color:{tags: line_info_2, value: 0x434e2aff}\n theme_color:{tags: line_info_3, value: 0x36241fff}\n theme_color:{tags: thread_0, value: 0xffcb7fff}\n theme_color:{tags: thread_1, value: 0xb2ff65ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x3232792}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0xe363bff}\n theme_color:{tags: \"menu_bar background\", value: 0xb59e7aff}\n theme_color:{tags: \"menu_bar text\", value: 0xff}\n theme_color:{tags: \"menu_bar border\", value: 0x947d5aff}\n theme_color:{tags: \"scroll_bar background\", value: 0xe363bff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x13533aff}\n theme_color:{tags: \"tab border\", value: 0x6c9182ff}\n theme_color:{tags: \"tab inactive background\", value: 0x0}\n theme_color:{tags: \"tab inactive border\", value: 0x947d5a6c}\n theme_color:{tags: \"tab auto background\", value: 0x5b3939ff}\n theme_color:{tags: \"tab auto border\", value: 0x875c5cff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x251b1bff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x563d3dff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background,value: 0xc0c0cff}\n theme_color:{tags: \"alt background\", value: 0x131313ff}\n theme_color:{tags: \"pop background\", value: 0x4c00ff}\n theme_color:{tags: \"fresh background\", value: 0x4c00ff}\n theme_color:{tags: \"match background\", value: 0x4c00ff}\n theme_color:{tags: border, value: 0x272727ff}\n theme_color:{tags: text, value: 0x90b080ff}\n theme_color:{tags: \"weak text\", value: 0x6b845fff}\n theme_color:{tags: \"menu_bar background\", value: 0x888888ff}\n theme_color:{tags: \"menu_bar text\", value: 0x20202ff}\n theme_color:{tags: \"menu_bar text weak\", value: 0x525252ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xee00ff}\n theme_color:{tags: \"focus overlay\", value: 0xee0012}\n theme_color:{tags: \"focus border\", value: 0x00ee00ff}\n theme_color:{tags: cursor, value: 0x00ee00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x4900ff}\n theme_color:{tags: \"good_pop border\", value: 0x4900ff}\n theme_color:{tags: \"bad_pop background\", value: 0x430b00ff}\n theme_color:{tags: code_default, value: 0x90b080ff}\n theme_color:{tags: code_symbol, value: 0xbfd9b2ff}\n theme_color:{tags: code_type, value: 0xbfd9b2ff}\n theme_color:{tags: code_local, value: 0xbfd9b2ff}\n theme_color:{tags: code_register, value: 0xb84cffff}\n theme_color:{tags: code_keyword, value: 0xd08f1fff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x90b080ff}\n theme_color:{tags: code_numeric, value: 0x50ff2fff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x30af18ff}\n theme_color:{tags: code_string, value: 0x50ff2fff}\n theme_color:{tags: code_meta, value: 0x90b080ff}\n theme_color:{tags: code_comment, value: 0x1f90f0ff}\n theme_color:{tags: line_info_0, value: 0xa253dff}\n theme_color:{tags: line_info_1, value: 0x9103dff}\n theme_color:{tags: line_info_2, value: 0x1e083dff}\n theme_color:{tags: line_info_3, value: 0x1e083dff}\n theme_color:{tags: thread_0, value: 0xd08f1fff}\n theme_color:{tags: thread_1, value: 0x1ea5d0ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x1d1d1dff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x15490cff}\n theme_color:{tags: \"tab border\", value: 0x15490cff}\n theme_color:{tags: \"tab text\", value: 0x90b080ff}\n theme_color:{tags: \"tab text weak\", value: 0x90b080ff}\n theme_color:{tags: \"tab inactive background\", value: 0x21321eff}\n theme_color:{tags: \"tab inactive border\", value: 0x21321eff}\n theme_color:{tags: \"tab auto background\", value: 0x674f3eff}\n theme_color:{tags: \"tab auto border\", value: 0x674f3eff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x47382eff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x47382eff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0x1b1f22ff }\n theme_color:{ tags: \"alt background\" , value: 0x232929ff }\n theme_color:{ tags: \"pop background\" , value: 0x2f4838ff }\n theme_color:{ tags: \"fresh background\" , value: 0x31393dff }\n theme_color:{ tags: \"match background\" , value: 0x31393dff }\n theme_color:{ tags: border , value: 0x485347ff }\n theme_color:{ tags: text , value: 0xffffffff }\n theme_color:{ tags: \"weak text\" , value: 0xa2a2a2ff }\n theme_color:{ tags: \"good text\" , value: 0x32a852ff }\n theme_color:{ tags: \"neutral text\" , value: 0x3a90bbff }\n theme_color:{ tags: \"bad text\" , value: 0xcf5242ff }\n theme_color:{ tags: hover , value: 0xffffffff }\n theme_color:{ tags: \"focus overlay\" , value: 0xfda20012 }\n theme_color:{ tags: \"focus border\" , value: 0xfda200ff }\n theme_color:{ tags: cursor , value: 0x8aff00ff }\n theme_color:{ tags: selection , value: 0x99ccff0f }\n theme_color:{ tags: \"inactive background\" , value: 0x0 }\n theme_color:{ tags: drop_shadow , value: 0x0000007f }\n theme_color:{ tags: \"good_pop background\" , value: 0x2c5b36ff }\n theme_color:{ tags: \"good_pop border\" , value: 0x568761ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0x803425ff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0xad8b69ff }\n theme_color:{ tags: code_symbol , value: 0x87ad6aff }\n theme_color:{ tags: code_type , value: 0xb67474ff }\n theme_color:{ tags: code_local , value: 0xe9bf95ff }\n theme_color:{ tags: code_register , value: 0xa688b2ff }\n theme_color:{ tags: code_keyword , value: 0xe49e17ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x795e43ff }\n theme_color:{ tags: code_numeric , value: 0x98b19eff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0x688b71ff }\n theme_color:{ tags: code_string , value: 0x98b19eff }\n theme_color:{ tags: code_meta , value: 0xad5979ff }\n theme_color:{ tags: code_comment , value: 0x52675dff }\n theme_color:{ tags: line_info_0 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_1 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_2 , value: 0x434e2aff }\n theme_color:{ tags: line_info_3 , value: 0x36241fff }\n theme_color:{ tags: line_info_4 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_5 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_6 , value: 0x434e2aff }\n theme_color:{ tags: line_info_7 , value: 0x36241fff }\n theme_color:{ tags: thread_0 , value: 0xffc258ff }\n theme_color:{ tags: thread_1 , value: 0x82d331ff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xa72911ff }\n theme_color:{ tags: \"floating background\" , value: 0x1b1f2276 }\n theme_color:{ tags: \"floating background alt\" , value: 0x0000005f }\n theme_color:{ tags: \"floating background fresh\" , value: 0x31393d5f }\n theme_color:{ tags: \"floating border\" , value: 0xbfbfbf1f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0x3b3b3b5f }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"menu_bar background\" , value: 0x243d32ff }\n theme_color:{ tags: \"menu_bar border\" , value: 0x597b63ff }\n theme_color:{ tags: \"scroll_bar background\" , value: 0x232929ff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x3c4a3fff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab background\" , value: 0x243d32ff }\n theme_color:{ tags: \"tab border\" , value: 0x597b63ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0x30383eff }\n theme_color:{ tags: \"tab inactive border\" , value: 0x6b7680ff }\n theme_color:{ tags: \"tab auto background\" , value: 0x30636dff }\n theme_color:{ tags: \"tab auto border\" , value: 0x768f94ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x2f2633ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x685073ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x000080ff}\n theme_color:{tags: \"pop background\", value: 0x8080ff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x8080ff}\n theme_color:{tags: text, value: 0xffffffff}\n theme_color:{tags: \"weak text\", value: 0xffffffff}\n theme_color:{tags: \"good text\", value: 0x00ff00ff}\n theme_color:{tags: \"neutral text\", value: 0x00ffffff}\n theme_color:{tags: \"bad text\", value: 0xff0000ff}\n theme_color:{tags: hover, value: 0xffffffff}\n theme_color:{tags: \"focus overlay\", value: 0xffff0012}\n theme_color:{tags: \"focus border\", value: 0xffff00ff}\n theme_color:{tags: cursor, value: 0xffff00ff}\n theme_color:{tags: selection, value: 0xffff0018}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x6c17ff}\n theme_color:{tags: \"good_pop border\", value: 0x6c17ff}\n theme_color:{tags: \"bad_pop background\", value: 0xff0000ff}\n theme_color:{tags: code_default, value: 0xffffffff}\n theme_color:{tags: code_symbol, value: 0xffffff}\n theme_color:{tags: code_type, value: 0x00ff00ff}\n theme_color:{tags: code_local, value: 0x00ffffff}\n theme_color:{tags: code_register, value: 0xff00ffff}\n theme_color:{tags: code_keyword, value: 0xffffffff}\n theme_color:{tags: code_delimiter_or_operator, value: 0xffffffff}\n theme_color:{tags: code_numeric, value: 0xffff00ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0xffff00ff}\n theme_color:{tags: code_string, value: 0xffff00ff}\n theme_color:{tags: code_meta, value: 0xff0000ff}\n theme_color:{tags: code_comment, value: 0x008080ff}\n theme_color:{tags: line_info_0, value: 0x8080ff}\n theme_color:{tags: line_info_1, value: 0x800080ff}\n theme_color:{tags: line_info_2, value: 0x800000ff}\n theme_color:{tags: line_info_3, value: 0x08000ff}\n theme_color:{tags: thread_0, value: 0xffff00ff}\n theme_color:{tags: thread_1, value: 0x00ff00ff}\n theme_color:{tags: thread_unwound, value: 0x00ffffff}\n theme_color:{tags: thread_error, value: 0xff0000ff}\n theme_color:{tags: breakpoint, value: 0xff0000ff}\n theme_color:{tags: \"menu_bar background\", value: 0x008080ff}\n theme_color:{tags: \"menu_bar border\", value: 0x8080ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x008080ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x8080ff}\n theme_color:{tags: \"tab border\", value: 0x8080ff}\n theme_color:{tags: \"tab inactive background\", value:0}\n theme_color:{tags: \"tab auto background\", value: 0x800000ff}\n theme_color:{tags: \"tab auto border\", value: 0x8080ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x300000ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0x8080ff}\n theme_color:{tags: \"drop_site background\", value: 0x80ff}\n theme_color:{tags: \"drop_site border\", value: 0xffffff}\n}\n"), +}; + +C_LINKAGE_END + diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index cbefffbc..a8b6ab71 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -1,20361 +1,20361 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//- GENERATED CODE - -#ifndef RADDBG_META_H -#define RADDBG_META_H - -typedef enum RD_RegSlot -{ -RD_RegSlot_Null, -RD_RegSlot_Machine, -RD_RegSlot_Module, -RD_RegSlot_Process, -RD_RegSlot_Thread, -RD_RegSlot_CtrlEntity, -RD_RegSlot_Window, -RD_RegSlot_Panel, -RD_RegSlot_Tab, -RD_RegSlot_View, -RD_RegSlot_PrevTab, -RD_RegSlot_DstPanel, -RD_RegSlot_Cfg, -RD_RegSlot_CfgList, -RD_RegSlot_EvalSpace, -RD_RegSlot_UnwindCount, -RD_RegSlot_InlineDepth, -RD_RegSlot_FilePath, -RD_RegSlot_Cursor, -RD_RegSlot_Mark, -RD_RegSlot_TextKey, -RD_RegSlot_LangKind, -RD_RegSlot_Lines, -RD_RegSlot_DbgiKey, -RD_RegSlot_Vaddr, -RD_RegSlot_Voff, -RD_RegSlot_VaddrRange, -RD_RegSlot_VoffRange, -RD_RegSlot_Expr, -RD_RegSlot_UIKey, -RD_RegSlot_SrcUIKey, -RD_RegSlot_OffPx, -RD_RegSlot_RegSlot, -RD_RegSlot_PID, -RD_RegSlot_ForceConfirm, -RD_RegSlot_ForceFocus, -RD_RegSlot_PreferDisasm, -RD_RegSlot_NoRichTooltip, -RD_RegSlot_DoImplicitRoot, -RD_RegSlot_DoLister, -RD_RegSlot_DoBigRows, -RD_RegSlot_AllWindows, -RD_RegSlot_NonGraphical, -RD_RegSlot_PreferNewTab, -RD_RegSlot_ActivateWithSingleClick, -RD_RegSlot_Dir2, -RD_RegSlot_String, -RD_RegSlot_CmdName, -RD_RegSlot_WMEvent, -RD_RegSlot_COUNT, -} RD_RegSlot; - -typedef enum RD_CmdKind -{ -RD_CmdKind_Null, -RD_CmdKind_LaunchAndRun, -RD_CmdKind_LaunchAndStepInto, -RD_CmdKind_Kill, -RD_CmdKind_KillAll, -RD_CmdKind_Detach, -RD_CmdKind_Continue, -RD_CmdKind_StepIntoInst, -RD_CmdKind_StepOverInst, -RD_CmdKind_StepIntoLine, -RD_CmdKind_StepOverLine, -RD_CmdKind_StepOut, -RD_CmdKind_Halt, -RD_CmdKind_SoftHaltRefresh, -RD_CmdKind_SetThreadIP, -RD_CmdKind_RunToLine, -RD_CmdKind_Run, -RD_CmdKind_Restart, -RD_CmdKind_StepInto, -RD_CmdKind_StepOver, -RD_CmdKind_FreezeThread, -RD_CmdKind_ThawThread, -RD_CmdKind_FreezeProcess, -RD_CmdKind_ThawProcess, -RD_CmdKind_FreezeMachine, -RD_CmdKind_ThawMachine, -RD_CmdKind_FreezeLocalMachine, -RD_CmdKind_ThawLocalMachine, -RD_CmdKind_FreezeEntity, -RD_CmdKind_ThawEntity, -RD_CmdKind_SetEntityColor, -RD_CmdKind_SetEntityName, -RD_CmdKind_Attach, -RD_CmdKind_OpenCrashDump, -RD_CmdKind_Exit, -RD_CmdKind_OpenPalette, -RD_CmdKind_RunCommand, -RD_CmdKind_RunExternalDriverTextCommand, -RD_CmdKind_WMEvent, -RD_CmdKind_SelectThread, -RD_CmdKind_SelectUnwind, -RD_CmdKind_UpOneFrame, -RD_CmdKind_DownOneFrame, -RD_CmdKind_SelectEntity, -RD_CmdKind_DeselectEntity, -RD_CmdKind_IncWindowFontSize, -RD_CmdKind_DecWindowFontSize, -RD_CmdKind_IncViewFontSize, -RD_CmdKind_DecViewFontSize, -RD_CmdKind_OpenWindow, -RD_CmdKind_WindowSettings, -RD_CmdKind_CloseWindow, -RD_CmdKind_ToggleFullscreen, -RD_CmdKind_BringToFront, -RD_CmdKind_PopupAccept, -RD_CmdKind_PopupCancel, -RD_CmdKind_ResetToDefaultBindings, -RD_CmdKind_ResetToDefaultPanels, -RD_CmdKind_ResetToCompactPanels, -RD_CmdKind_ResetToSimplePanels, -RD_CmdKind_NewPanelLeft, -RD_CmdKind_NewPanelUp, -RD_CmdKind_NewPanelRight, -RD_CmdKind_NewPanelDown, -RD_CmdKind_SplitPanel, -RD_CmdKind_RotatePanelColumns, -RD_CmdKind_NextPanel, -RD_CmdKind_PrevPanel, -RD_CmdKind_FocusPanel, -RD_CmdKind_FocusPanelRight, -RD_CmdKind_FocusPanelLeft, -RD_CmdKind_FocusPanelUp, -RD_CmdKind_FocusPanelDown, -RD_CmdKind_Undo, -RD_CmdKind_Redo, -RD_CmdKind_GoBack, -RD_CmdKind_GoForward, -RD_CmdKind_ClosePanel, -RD_CmdKind_FocusTab, -RD_CmdKind_NextTab, -RD_CmdKind_PrevTab, -RD_CmdKind_MoveTabRight, -RD_CmdKind_MoveTabLeft, -RD_CmdKind_OpenTab, -RD_CmdKind_BuildTab, -RD_CmdKind_DuplicateTab, -RD_CmdKind_CopyTabFullPath, -RD_CmdKind_CloseTab, -RD_CmdKind_MoveView, -RD_CmdKind_TabBarTop, -RD_CmdKind_TabBarBottom, -RD_CmdKind_TabSettings, -RD_CmdKind_SetCurrentPath, -RD_CmdKind_Open, -RD_CmdKind_OpenSourceFileFromDebugInfo, -RD_CmdKind_SwitchToPartnerFile, -RD_CmdKind_ShowFileInExplorer, -RD_CmdKind_GoToDisassembly, -RD_CmdKind_GoToSource, -RD_CmdKind_SetFileReplacementPath, -RD_CmdKind_NewUser, -RD_CmdKind_NewProject, -RD_CmdKind_OpenUser, -RD_CmdKind_OpenProject, -RD_CmdKind_OpenRecentProject, -RD_CmdKind_SaveUser, -RD_CmdKind_SaveProject, -RD_CmdKind_RecordUserAsLastOpened, -RD_CmdKind_RecordProjectInUser, -RD_CmdKind_WriteUserData, -RD_CmdKind_WriteProjectData, -RD_CmdKind_UserSettings, -RD_CmdKind_ProjectSettings, -RD_CmdKind_Edit, -RD_CmdKind_Accept, -RD_CmdKind_Cancel, -RD_CmdKind_FocusMenu, -RD_CmdKind_MoveLeft, -RD_CmdKind_MoveRight, -RD_CmdKind_MoveUp, -RD_CmdKind_MoveDown, -RD_CmdKind_MoveLeftSelect, -RD_CmdKind_MoveRightSelect, -RD_CmdKind_MoveUpSelect, -RD_CmdKind_MoveDownSelect, -RD_CmdKind_MoveLeftChunk, -RD_CmdKind_MoveRightChunk, -RD_CmdKind_MoveUpChunk, -RD_CmdKind_MoveDownChunk, -RD_CmdKind_MoveUpPage, -RD_CmdKind_MoveDownPage, -RD_CmdKind_MoveUpWhole, -RD_CmdKind_MoveDownWhole, -RD_CmdKind_MoveLeftChunkSelect, -RD_CmdKind_MoveRightChunkSelect, -RD_CmdKind_MoveUpChunkSelect, -RD_CmdKind_MoveDownChunkSelect, -RD_CmdKind_MoveUpPageSelect, -RD_CmdKind_MoveDownPageSelect, -RD_CmdKind_MoveUpWholeSelect, -RD_CmdKind_MoveDownWholeSelect, -RD_CmdKind_MoveUpReorder, -RD_CmdKind_MoveDownReorder, -RD_CmdKind_MoveHome, -RD_CmdKind_MoveEnd, -RD_CmdKind_MoveHomeSelect, -RD_CmdKind_MoveEndSelect, -RD_CmdKind_SelectAll, -RD_CmdKind_DeleteSingle, -RD_CmdKind_DeleteChunk, -RD_CmdKind_BackspaceSingle, -RD_CmdKind_BackspaceChunk, -RD_CmdKind_Copy, -RD_CmdKind_Cut, -RD_CmdKind_Paste, -RD_CmdKind_InsertText, -RD_CmdKind_MoveNext, -RD_CmdKind_MovePrev, -RD_CmdKind_GoToLine, -RD_CmdKind_GoToAddress, -RD_CmdKind_CenterCursor, -RD_CmdKind_ContainCursor, -RD_CmdKind_FindNext, -RD_CmdKind_FindPrev, -RD_CmdKind_FindThread, -RD_CmdKind_FindSelectedThread, -RD_CmdKind_GoToName, -RD_CmdKind_GoToNameAtCursor, -RD_CmdKind_ToggleWatchExpression, -RD_CmdKind_ToggleWatchExpressionAtCursor, -RD_CmdKind_ToggleWatchExpressionAtMouse, -RD_CmdKind_EnableCfg, -RD_CmdKind_DisableCfg, -RD_CmdKind_SelectCfg, -RD_CmdKind_DeselectCfg, -RD_CmdKind_RemoveCfg, -RD_CmdKind_NameCfg, -RD_CmdKind_ConditionCfg, -RD_CmdKind_DuplicateCfg, -RD_CmdKind_RelocateCfg, -RD_CmdKind_SaveToProject, -RD_CmdKind_AddBreakpoint, -RD_CmdKind_AddAddressBreakpoint, -RD_CmdKind_AddFunctionBreakpoint, -RD_CmdKind_ToggleBreakpoint, -RD_CmdKind_RemoveBreakpoint, -RD_CmdKind_EnableBreakpoint, -RD_CmdKind_DisableBreakpoint, -RD_CmdKind_ClearBreakpoints, -RD_CmdKind_ListBreakpoints, -RD_CmdKind_ClearOutput, -RD_CmdKind_AddWatchPin, -RD_CmdKind_ToggleWatchPin, -RD_CmdKind_LoadDebugInfo, -RD_CmdKind_UnloadDebugInfo, -RD_CmdKind_AddTypeView, -RD_CmdKind_AddFilePathMap, -RD_CmdKind_EditUserTheme, -RD_CmdKind_EditProjectTheme, -RD_CmdKind_AddThemeColor, -RD_CmdKind_ForkTheme, -RD_CmdKind_SaveTheme, -RD_CmdKind_SaveAndSetTheme, -RD_CmdKind_SetNextStatement, -RD_CmdKind_AddTarget, -RD_CmdKind_SelectTarget, -RD_CmdKind_EnableTarget, -RD_CmdKind_DisableTarget, -RD_CmdKind_RemoveTarget, -RD_CmdKind_RegisterAsJITDebugger, -RD_CmdKind_FindCodeLocation, -RD_CmdKind_Search, -RD_CmdKind_SearchBackwards, -RD_CmdKind_PickFile, -RD_CmdKind_PickFolder, -RD_CmdKind_PickFileOrFolder, -RD_CmdKind_PushQuery, -RD_CmdKind_CompleteQuery, -RD_CmdKind_CancelQuery, -RD_CmdKind_UpdateQuery, -RD_CmdKind_OpenEventBuffer, -RD_CmdKind_CloseEventBuffer, -RD_CmdKind_ToggleDevMenu, -RD_CmdKind_LogMarker, -RD_CmdKind_OpenWatch, -RD_CmdKind_OpenLocals, -RD_CmdKind_OpenRegisters, -RD_CmdKind_OpenGlobals, -RD_CmdKind_OpenThreadLocals, -RD_CmdKind_OpenTypes, -RD_CmdKind_OpenProcedures, -RD_CmdKind_OpenCallStack, -RD_CmdKind_OpenTargets, -RD_CmdKind_OpenBreakpoints, -RD_CmdKind_OpenWatchPins, -RD_CmdKind_OpenDebugInfos, -RD_CmdKind_OpenThreads, -RD_CmdKind_OpenProcesses, -RD_CmdKind_OpenMachines, -RD_CmdKind_OpenModules, -RD_CmdKind_OpenFilePathMaps, -RD_CmdKind_OpenTypeViews, -RD_CmdKind_OpenOutput, -RD_CmdKind_OpenText, -RD_CmdKind_OpenDisasm, -RD_CmdKind_OpenMemory, -RD_CmdKind_OpenBitmap, -RD_CmdKind_OpenColor, -RD_CmdKind_OpenGeo3D, -RD_CmdKind_COUNT, -RD_CmdKind_FirstTabFastPathCmd = RD_CmdKind_OpenWatch, -} RD_CmdKind; - -typedef enum RD_IconKind -{ -RD_IconKind_Null, -RD_IconKind_FolderOpenOutline, -RD_IconKind_FolderClosedOutline, -RD_IconKind_FolderOpenFilled, -RD_IconKind_FolderClosedFilled, -RD_IconKind_FileOutline, -RD_IconKind_FileFilled, -RD_IconKind_Play, -RD_IconKind_PlayStepForward, -RD_IconKind_Pause, -RD_IconKind_Stop, -RD_IconKind_Info, -RD_IconKind_WarningSmall, -RD_IconKind_WarningBig, -RD_IconKind_Unlocked, -RD_IconKind_Locked, -RD_IconKind_LeftArrow, -RD_IconKind_RightArrow, -RD_IconKind_UpArrow, -RD_IconKind_DownArrow, -RD_IconKind_Gear, -RD_IconKind_Pencil, -RD_IconKind_Trash, -RD_IconKind_Pin, -RD_IconKind_RadioHollow, -RD_IconKind_RadioFilled, -RD_IconKind_CheckHollow, -RD_IconKind_CheckFilled, -RD_IconKind_Check, -RD_IconKind_LeftCaret, -RD_IconKind_RightCaret, -RD_IconKind_UpCaret, -RD_IconKind_DownCaret, -RD_IconKind_UpScroll, -RD_IconKind_DownScroll, -RD_IconKind_LeftScroll, -RD_IconKind_RightScroll, -RD_IconKind_Add, -RD_IconKind_Minus, -RD_IconKind_Thread, -RD_IconKind_Threads, -RD_IconKind_Machine, -RD_IconKind_CircleFilled, -RD_IconKind_X, -RD_IconKind_Refresh, -RD_IconKind_Undo, -RD_IconKind_Redo, -RD_IconKind_Save, -RD_IconKind_Window, -RD_IconKind_Target, -RD_IconKind_Clipboard, -RD_IconKind_Scheduler, -RD_IconKind_Module, -RD_IconKind_XSplit, -RD_IconKind_YSplit, -RD_IconKind_ClosePanel, -RD_IconKind_StepInto, -RD_IconKind_StepOver, -RD_IconKind_StepOut, -RD_IconKind_Find, -RD_IconKind_Palette, -RD_IconKind_Thumbnails, -RD_IconKind_Glasses, -RD_IconKind_Binoculars, -RD_IconKind_List, -RD_IconKind_Grid, -RD_IconKind_QuestionMark, -RD_IconKind_Person, -RD_IconKind_Briefcase, -RD_IconKind_Dot, -RD_IconKind_Bitmap, -RD_IconKind_Cube, -RD_IconKind_WindowRestore, -RD_IconKind_WindowMinimize, -RD_IconKind_Duplicate, -RD_IconKind_COUNT, -} RD_IconKind; - -typedef enum RD_CodeColorSlot -{ -RD_CodeColorSlot_CodeDefault, -RD_CodeColorSlot_CodeSymbol, -RD_CodeColorSlot_CodeType, -RD_CodeColorSlot_CodeLocal, -RD_CodeColorSlot_CodeRegister, -RD_CodeColorSlot_CodeKeyword, -RD_CodeColorSlot_CodeDelimiterOperator, -RD_CodeColorSlot_CodeNumeric, -RD_CodeColorSlot_CodeNumericAltDigitGroup, -RD_CodeColorSlot_CodeString, -RD_CodeColorSlot_CodeMeta, -RD_CodeColorSlot_CodeComment, -RD_CodeColorSlot_CodeLineNumbers, -RD_CodeColorSlot_CodeLineNumbersSelected, -RD_CodeColorSlot_COUNT, -} RD_CodeColorSlot; - -typedef enum RD_ThemePreset -{ -RD_ThemePreset_DefaultDark, -RD_ThemePreset_DefaultLight, -RD_ThemePreset_VSDark, -RD_ThemePreset_VSLight, -RD_ThemePreset_SolarizedDark, -RD_ThemePreset_SolarizedLight, -RD_ThemePreset_HandmadeHero, -RD_ThemePreset_Naysayer, -RD_ThemePreset_FourCoder, -RD_ThemePreset_Grove, -RD_ThemePreset_FarManager, -RD_ThemePreset_COUNT, -} RD_ThemePreset; - -typedef struct RD_VocabInfo RD_VocabInfo; -struct RD_VocabInfo -{ -String8 code_name; -String8 code_name_plural; -String8 display_name; -String8 display_name_plural; -RD_IconKind icon_kind; -}; - -typedef struct RD_NameSchemaInfo RD_NameSchemaInfo; -struct RD_NameSchemaInfo -{ -String8 name; -B32 is_view; -String8 schema; -}; - -typedef struct RD_Regs RD_Regs; -struct RD_Regs -{ -D_Handle machine; -D_Handle module; -D_Handle process; -D_Handle thread; -D_Handle ctrl_entity; -CFG_ID window; -CFG_ID panel; -CFG_ID tab; -CFG_ID view; -CFG_ID prev_tab; -CFG_ID dst_panel; -CFG_ID cfg; -CFG_IDList cfg_list; -E_Space eval_space; -U64 unwind_count; -U64 inline_depth; -String8 file_path; -TxtPt cursor; -TxtPt mark; -C_Key text_key; -TXT_LangKind lang_kind; -D_LineList lines; -DI_Key dbgi_key; -U64 vaddr; -U64 voff; -Rng1U64 vaddr_range; -Rng1U64 voff_range; -String8 expr; -UI_Key ui_key; -UI_Key src_ui_key; -Vec2F32 off_px; -RD_RegSlot reg_slot; -U32 pid; -B32 force_confirm; -B32 force_focus; -B32 prefer_disasm; -B32 no_rich_tooltip; -B32 do_implicit_root; -B32 do_lister; -B32 do_big_rows; -B32 all_windows; -B32 non_graphical; -B32 prefer_new_tab; -B32 activate_with_single_click; -Dir2 dir2; -String8 string; -String8 cmd_name; -WM_Event * wm_event; -}; - -typedef struct RD_Query RD_Query; -struct RD_Query -{ -RD_QueryFlags flags; -RD_RegSlot slot; -String8 expr; -String8 view_name; -D_EntityKind ctrl_entity_kind; -}; - -typedef struct RD_CmdKindInfo RD_CmdKindInfo; -struct RD_CmdKindInfo -{ -String8 string; -String8 description; -String8 search_tags; -String8 ctx_filter; -RD_CmdKindFlags flags; -RD_Query query; -}; - -#define RD_FixedTabXList \ -Y(watches, watch, "")\ -X(locals) \ -X(registers) \ -X(globals) \ -X(thread_locals) \ -X(types) \ -X(procedures) \ -X(call_stack) \ -X(targets) \ -X(breakpoints) \ -X(watch_pins) \ -X(debug_infos) \ -X(threads) \ -X(processes) \ -X(machines) \ -X(modules) \ -X(file_path_maps) \ -X(type_views) \ -Y(output, text, "query:output")\ -Y(text, text, "")\ -Y(disasm, disasm, "")\ -Y(memory, memory, "")\ -Y(bitmap, bitmap, "")\ -Y(color, color, "")\ -Y(geo3d, geo3d, "")\ -Z(getting_started)\ - -#define rd_regs_lit_init_top \ -.machine = rd_regs()->machine,\ -.module = rd_regs()->module,\ -.process = rd_regs()->process,\ -.thread = rd_regs()->thread,\ -.ctrl_entity = rd_regs()->ctrl_entity,\ -.window = rd_regs()->window,\ -.panel = rd_regs()->panel,\ -.tab = rd_regs()->tab,\ -.view = rd_regs()->view,\ -.prev_tab = rd_regs()->prev_tab,\ -.dst_panel = rd_regs()->dst_panel,\ -.cfg = rd_regs()->cfg,\ -.cfg_list = rd_regs()->cfg_list,\ -.eval_space = rd_regs()->eval_space,\ -.unwind_count = rd_regs()->unwind_count,\ -.inline_depth = rd_regs()->inline_depth,\ -.file_path = rd_regs()->file_path,\ -.cursor = rd_regs()->cursor,\ -.mark = rd_regs()->mark,\ -.text_key = rd_regs()->text_key,\ -.lang_kind = rd_regs()->lang_kind,\ -.lines = rd_regs()->lines,\ -.dbgi_key = rd_regs()->dbgi_key,\ -.vaddr = rd_regs()->vaddr,\ -.voff = rd_regs()->voff,\ -.vaddr_range = rd_regs()->vaddr_range,\ -.voff_range = rd_regs()->voff_range,\ -.expr = rd_regs()->expr,\ -.ui_key = rd_regs()->ui_key,\ -.src_ui_key = rd_regs()->src_ui_key,\ -.off_px = rd_regs()->off_px,\ -.reg_slot = rd_regs()->reg_slot,\ -.pid = rd_regs()->pid,\ -.force_confirm = rd_regs()->force_confirm,\ -.force_focus = rd_regs()->force_focus,\ -.prefer_disasm = rd_regs()->prefer_disasm,\ -.no_rich_tooltip = rd_regs()->no_rich_tooltip,\ -.do_implicit_root = rd_regs()->do_implicit_root,\ -.do_lister = rd_regs()->do_lister,\ -.do_big_rows = rd_regs()->do_big_rows,\ -.all_windows = rd_regs()->all_windows,\ -.non_graphical = rd_regs()->non_graphical,\ -.prefer_new_tab = rd_regs()->prefer_new_tab,\ -.activate_with_single_click = rd_regs()->activate_with_single_click,\ -.dir2 = rd_regs()->dir2,\ -.string = rd_regs()->string,\ -.cmd_name = rd_regs()->cmd_name,\ -.wm_event = rd_regs()->wm_event,\ - -C_LINKAGE_BEGIN -extern String8 rd_tab_fast_path_view_name_table[25]; -extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[360]; -extern RD_NameSchemaInfo rd_name_schema_info_table[39]; -extern String8 rd_reg_slot_code_name_table[49]; -extern Rng1U64 rd_reg_slot_range_table[49]; -extern String8 rd_binding_version_remap_old_name_table[9]; -extern String8 rd_binding_version_remap_new_name_table[9]; -extern String8 rd_icon_kind_text_table[75]; -extern String8 rd_code_color_slot_name_table[14]; -extern String8 rd_theme_preset_display_string_table[11]; -extern String8 rd_theme_preset_code_string_table[11]; -extern String8 rd_theme_preset_cfg_string_table[11]; -read_only global U8 rd_icon_font_bytes__data[] = -{ -0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x80,0x00,0x03,0x00,0x70,0x47,0x53,0x55,0x42,0x20,0x8b,0x25,0x7a,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x4f,0x53,0x2f,0x32,0x56,0x43,0x62,0x25,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0xa3,0x60,0xa4,0x23,0x00,0x00,0x01,0xb0,0x00,0x00,0x06,0x12,0x63,0x76,0x74,0x20, -0x0e,0x1f,0x06,0xf3,0x00,0x00,0x51,0x34,0x00,0x00,0x00,0x38,0x66,0x70,0x67,0x6d,0x62,0x31,0xfb,0x7b,0x00,0x00,0x51,0x6c,0x00,0x00,0x0e,0x0c,0x67,0x61,0x73,0x70,0x00,0x00,0x00,0x10,0x00,0x00,0x51,0x2c,0x00,0x00,0x00,0x08,0x67,0x6c,0x79,0x66,0x71,0xda,0x4c,0xc8,0x00,0x00,0x07,0xc4,0x00,0x00,0x40,0x90,0x68,0x65,0x61,0x64, -0x2b,0xeb,0xd3,0xaf,0x00,0x00,0x48,0x54,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,0x07,0xc2,0x04,0x27,0x00,0x00,0x48,0x8c,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,0x06,0x4b,0xff,0xca,0x00,0x00,0x48,0xb0,0x00,0x00,0x01,0x44,0x6c,0x6f,0x63,0x61,0x71,0xa6,0x82,0xac,0x00,0x00,0x49,0xf4,0x00,0x00,0x00,0xa4,0x6d,0x61,0x78,0x70, -0x01,0xe8,0x0f,0x19,0x00,0x00,0x4a,0x98,0x00,0x00,0x00,0x20,0x6e,0x61,0x6d,0x65,0xcd,0x9d,0x1c,0x1d,0x00,0x00,0x4a,0xb8,0x00,0x00,0x02,0xcd,0x70,0x6f,0x73,0x74,0x77,0x9e,0x36,0x3b,0x00,0x00,0x4d,0x88,0x00,0x00,0x03,0xa2,0x70,0x72,0x65,0x70,0xeb,0x48,0xca,0x9d,0x00,0x00,0x5f,0x78,0x00,0x00,0x00,0xa7,0x00,0x01,0x00,0x00, -0x00,0x0a,0x00,0x30,0x00,0x3e,0x00,0x02,0x44,0x46,0x4c,0x54,0x00,0x0e,0x6c,0x61,0x74,0x6e,0x00,0x1a,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x6c,0x69,0x67,0x61,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x04, -0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x03,0x3d,0x01,0x90,0x00,0x05,0x00,0x00,0x02,0x7a,0x02,0xbc,0x00,0x00,0x00,0x8c,0x02,0x7a,0x02,0xbc,0x00,0x00,0x01,0xe0,0x00,0x31,0x01,0x02,0x00,0x00,0x02,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x66,0x45,0x64,0x00,0xc0,0x00,0x21,0x00,0x7d,0x03,0x52,0xff,0x6a,0x00,0x5a,0x03,0xac,0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x04, -0x00,0x00,0x02,0x42,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x3c,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x2c,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x42,0x00,0x04,0x01,0x10,0x00,0x00,0x00,0x18,0x00,0x10,0x00,0x03,0x00,0x08,0x00,0x23,0x00,0x2b,0x00,0x2e,0x00,0x31,0x00,0x39,0x00,0x3c,0x00,0x5b,0x00,0x5e,0x00,0x73,0x00,0x7b,0x00,0x7d, -0xff,0xff,0x00,0x00,0x00,0x21,0x00,0x26,0x00,0x2d,0x00,0x30,0x00,0x33,0x00,0x3c,0x00,0x3e,0x00,0x5d,0x00,0x61,0x00,0x75,0x00,0x7d,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x1c,0x00,0x26,0x00,0x28,0x00,0x2a,0x00,0x36, -0x00,0x36,0x00,0x70,0x00,0x72,0x00,0x96,0x00,0xa2,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a, -0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20,0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2c,0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x39,0x00,0x3a, -0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x4a,0x00,0x4b,0x00,0x4c,0x00,0x4d,0x00,0x4e,0x00,0x4f,0x00,0x50,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x00,0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x0a,0x0b,0x00,0x0c,0x0d,0x00,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x00,0x00,0x15,0x00,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25, -0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x00,0x34,0x35,0x00,0x00,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x00,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x03,0xd0,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x50,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x05,0x00,0x00, -0x00,0x28,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x2e,0x00,0x00, -0x00,0x2e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x35,0x00,0x00, -0x00,0x10,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x15,0x00,0x00, -0x00,0x3e,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x43,0x00,0x00, -0x00,0x43,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00, -0x00,0x20,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x25,0x00,0x00, -0x00,0x4e,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x53,0x00,0x00, -0x00,0x53,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x58,0x00,0x00, -0x00,0x30,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x35,0x00,0x00, -0x00,0x61,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x66,0x00,0x00, -0x00,0x66,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x6b,0x00,0x00, -0x00,0x40,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x45,0x00,0x00, -0x00,0x71,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x77,0x00,0x00, -0x00,0x77,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x7d,0x00,0x00, -0x00,0x50,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x25,0x40,0x22,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x13,0x00,0x4e,0x02,0x00,0x1e,0x1b,0x16,0x13,0x0a,0x07,0x00,0x0f,0x02,0x0f,0x05,0x07,0x16,0x2b,0x01,0x21,0x22,0x06,0x07,0x11,0x14, -0x16,0x17,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x17,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x71,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x34,0x7c,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x02,0xc3,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01, -0xd0,0x25,0x34,0x59,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x5e,0x01,0x60,0x00,0x06,0x00,0x00,0xff,0xba,0x02,0x80,0x03,0x02,0x00,0x13,0x00,0x1c,0x00,0x25,0x00,0x39,0x00,0x42,0x00,0x4b,0x00,0x54,0x40,0x51,0x39,0x30,0x2f,0x26,0x0d,0x0c,0x03,0x02,0x08,0x02,0x04,0x01,0x4c,0x08,0x0c,0x02,0x04,0x0b,0x01,0x02,0x03,0x04, -0x02,0x69,0x09,0x01,0x05,0x05,0x01,0x61,0x07,0x01,0x01,0x01,0x13,0x4d,0x0d,0x0a,0x02,0x03,0x03,0x00,0x61,0x06,0x01,0x00,0x00,0x11,0x00,0x4e,0x44,0x43,0x1e,0x1d,0x48,0x47,0x43,0x4b,0x44,0x4b,0x41,0x40,0x3d,0x3c,0x35,0x34,0x2b,0x2a,0x22,0x21,0x1d,0x25,0x1e,0x25,0x13,0x14,0x19,0x17,0x0e,0x07,0x1a,0x2b,0x13,0x14,0x07,0x11, -0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16,0x03,0x34,0x26,0x22,0x06,0x14,0x16,0x32,0x36,0x03,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x01,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16,0x15,0x14,0x07,0x27,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13, -0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0xf0,0x48,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x32,0x2a,0x38,0x28,0x28,0x38,0x2a,0x46,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x01,0xdc,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x48,0x74,0x28,0x38,0x2a,0x2a,0x38,0x28,0x44,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x02,0x8a,0x4c,0x22,0xfe, -0x86,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0xfd,0x76,0x1e,0x28,0x28,0x3a,0x28,0x28,0x02,0x30,0x28,0x3a,0x28,0x28,0x3a,0x28,0xfe,0x5c,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c,0x22,0x6e,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x46,0x28,0x3a,0x28, -0x28,0x3a,0x28,0x00,0x00,0x05,0x00,0x00,0xff,0x6a,0x03,0xe8,0x03,0x52,0x00,0x1f,0x00,0x22,0x00,0x25,0x00,0x33,0x00,0x3c,0x00,0x70,0x40,0x6d,0x23,0x01,0x00,0x06,0x1d,0x01,0x09,0x00,0x27,0x20,0x02,0x07,0x05,0x03,0x4c,0x00,0x03,0x00,0x06,0x00,0x03,0x06,0x67,0x0c,0x01,0x00,0x00,0x09,0x05,0x00,0x09,0x67,0x00,0x05,0x00,0x07, -0x04,0x05,0x07,0x67,0x00,0x04,0x00,0x0a,0x08,0x04,0x0a,0x67,0x00,0x08,0x00,0x02,0x0b,0x08,0x02,0x67,0x0d,0x01,0x0b,0x01,0x01,0x0b,0x57,0x0d,0x01,0x0b,0x0b,0x01,0x5f,0x00,0x01,0x0b,0x01,0x4f,0x34,0x34,0x01,0x00,0x34,0x3c,0x34,0x3c,0x3b,0x39,0x36,0x35,0x30,0x2f,0x2e,0x2c,0x29,0x28,0x25,0x24,0x22,0x21,0x1a,0x17,0x0e,0x0c, -0x09,0x06,0x00,0x1f,0x01,0x1e,0x0e,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x35,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x3f,0x01,0x3e,0x01,0x3b,0x01,0x32,0x16,0x17,0x15,0x36,0x33,0x0f,0x01,0x33,0x01,0x07,0x33,0x17,0x37,0x35,0x23,0x15,0x14,0x06,0x07,0x23,0x11,0x21,0x35,0x34,0x36,0x01,0x11, -0x23,0x15,0x14,0x06,0x27,0x23,0x11,0x03,0xb2,0x17,0x1e,0x01,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0xfe,0xd1,0x17,0x1e,0x01,0x16,0x10,0xe4,0x0f,0x36,0x16,0xe8,0x17,0x1e,0x01,0x26,0x21,0x47,0xa7,0xa7,0xfe,0x9b,0xa7,0xa7,0x6d,0xb0,0xd6,0x1e,0x17,0xe9,0x01,0x1e,0x16,0x02,0x26,0xd7,0x1e,0x17,0xe8,0x02,0x7c,0x20,0x16,0xfd,0x5a, -0x17,0x1e,0x01,0x20,0x16,0xa0,0x20,0x16,0x01,0x77,0x16,0x36,0x0f,0xe4,0x10,0x16,0x20,0x16,0xb7,0x17,0x77,0xa7,0x01,0x7d,0xa7,0xc2,0xb0,0xe9,0xe9,0x16,0x1e,0x01,0xfe,0x9b,0x8f,0x16,0x36,0xfe,0x4e,0x02,0x83,0xe8,0x16,0x20,0x01,0xfe,0x9a,0x00,0x00,0x04,0xff,0xff,0xff,0xb1,0x04,0x2f,0x03,0x0b,0x00,0x08,0x00,0x0f,0x00,0x1f, -0x00,0x2f,0x00,0x52,0x40,0x4f,0x1d,0x14,0x02,0x01,0x03,0x0f,0x01,0x00,0x01,0x0e,0x0d,0x0c,0x09,0x04,0x02,0x00,0x1c,0x15,0x02,0x04,0x02,0x04,0x4c,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x69,0x07,0x01,0x03,0x03,0x06,0x5f,0x00,0x06,0x06,0x13,0x4d,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05, -0x11,0x05,0x4e,0x11,0x10,0x2e,0x2b,0x26,0x23,0x19,0x17,0x10,0x1f,0x11,0x1f,0x13,0x13,0x12,0x08,0x07,0x19,0x2b,0x01,0x14,0x0e,0x01,0x26,0x34,0x36,0x1e,0x01,0x01,0x15,0x21,0x35,0x37,0x17,0x01,0x25,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x37,0x21,0x32,0x36,0x27,0x11,0x34,0x26,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x11, -0x34,0x36,0x37,0x21,0x32,0x16,0x01,0x65,0x3e,0x5a,0x3e,0x3e,0x5a,0x3e,0x02,0x3c,0xfc,0xee,0xb2,0x5a,0x01,0x1d,0x01,0x1e,0xfc,0x83,0x07,0x0a,0x01,0x0c,0x06,0x03,0x7d,0x07,0x0c,0x01,0x0a,0x51,0x34,0x25,0xfc,0x83,0x24,0x36,0x01,0x34,0x25,0x03,0x7d,0x25,0x34,0x02,0x11,0x2d,0x3e,0x02,0x42,0x56,0x42,0x04,0x3a,0xfe,0xfa,0xfa, -0x6b,0xb3,0x59,0x01,0x1d,0xa1,0x0a,0x08,0xfd,0x5a,0x07,0x0c,0x01,0x0a,0x08,0x02,0xa6,0x08,0x0a,0x12,0xfd,0x5a,0x25,0x34,0x01,0x36,0x24,0x02,0xa6,0x25,0x34,0x01,0x36,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xba,0x00,0xf0,0x03,0x02,0x00,0x13,0x00,0x1c,0x00,0x25,0x00,0x39,0x40,0x36,0x13,0x0a,0x09,0x00,0x04,0x05,0x02,0x01, -0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x13,0x4d,0x06,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x11,0x00,0x4e,0x1e,0x1d,0x22,0x21,0x1d,0x25,0x1e,0x25,0x13,0x17,0x19,0x14,0x07,0x07,0x1a,0x2b,0x37,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16, -0x15,0x14,0x07,0x27,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0xa8,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x48,0x74,0x28,0x38,0x2a,0x2a,0x38,0x28,0x44,0x1c,0x2a,0x2a,0x38,0x28,0x28,0xa2,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c, -0x22,0x6e,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x46,0x28,0x3a,0x28,0x28,0x3a,0x28,0x00,0x03,0xff,0xff,0xff,0x6a,0x04,0x78,0x03,0x52,0x00,0x03,0x00,0x0c,0x00,0x26,0x00,0x38,0x40,0x35,0x00,0x08,0x00,0x03,0x04,0x08,0x03,0x67,0x07,0x01,0x04,0x00,0x01,0x02,0x04,0x01,0x67,0x00,0x02,0x00,0x05,0x00,0x02,0x05,0x67,0x00,0x00,0x06, -0x06,0x00,0x57,0x00,0x00,0x00,0x06,0x60,0x00,0x06,0x00,0x06,0x50,0x33,0x25,0x33,0x26,0x21,0x11,0x11,0x11,0x10,0x09,0x07,0x1f,0x2b,0x17,0x21,0x11,0x29,0x02,0x11,0x21,0x15,0x33,0x32,0x16,0x15,0x01,0x11,0x14,0x06,0x23,0x21,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x33,0x21,0x35,0x34,0x36,0x33,0x21,0x32,0x16, -0x8f,0x01,0xac,0xfe,0x54,0x02,0x3b,0x01,0x1e,0xfe,0x53,0x36,0x25,0x34,0x01,0xad,0x34,0x25,0xfe,0xac,0x34,0x25,0xfd,0xe8,0x24,0x36,0x01,0x34,0x25,0x01,0x54,0x34,0x25,0x02,0x18,0x24,0x36,0x07,0x01,0x1e,0x01,0xac,0x8f,0x34,0x25,0x01,0x1e,0xfd,0xe8,0x25,0x34,0xc5,0x25,0x34,0x34,0x25,0x02,0x18,0x25,0x34,0xc5,0x25,0x34,0x34, -0x00,0x01,0xff,0xff,0xff,0xb1,0x03,0xe8,0x00,0xcf,0x00,0x0f,0x00,0x13,0x40,0x10,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x11,0x00,0x4e,0x35,0x33,0x02,0x07,0x18,0x2b,0x25,0x15,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0xe8,0x34,0x25,0xfc,0xca,0x24,0x36,0x01,0x34,0x25,0x03,0x36,0x25,0x34, -0x76,0x6b,0x25,0x34,0x01,0x36,0x24,0x6b,0x25,0x34,0x34,0x00,0x00,0x03,0x00,0x00,0xff,0x6a,0x03,0xa1,0x03,0x0b,0x00,0x03,0x00,0x07,0x00,0x1f,0x00,0x1f,0x40,0x1c,0x07,0x06,0x05,0x03,0x02,0x01,0x00,0x07,0x00,0x01,0x01,0x4c,0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x13,0x00,0x4e,0x1b,0x1e,0x02,0x07,0x18,0x2b,0x05,0x25,0x11, -0x05,0x27,0x2d,0x01,0x0d,0x01,0x11,0x14,0x06,0x07,0x05,0x06,0x22,0x27,0x25,0x2e,0x01,0x35,0x11,0x34,0x36,0x37,0x25,0x36,0x32,0x17,0x05,0x1e,0x01,0x01,0xf4,0x01,0x65,0xfe,0x9b,0x24,0x01,0x86,0xfe,0x7a,0xfe,0x7b,0x03,0x56,0x14,0x12,0xfe,0x77,0x0f,0x26,0x0f,0xfe,0x77,0x11,0x14,0x1a,0x15,0x01,0x89,0x0c,0x18,0x0d,0x01,0x89, -0x15,0x1a,0x3b,0xc3,0x01,0x63,0x82,0x3f,0x8d,0x8e,0x8e,0x01,0xfe,0x54,0x14,0x22,0x09,0xd6,0x09,0x09,0xd6,0x0a,0x20,0x15,0x01,0xac,0x17,0x24,0x08,0x8f,0x05,0x05,0x8f,0x08,0x24,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x44,0x02,0x80,0x00,0x13,0x00,0x31,0x40,0x2e,0x00,0x05,0x00,0x02,0x05,0x59,0x04,0x06,0x02,0x00,0x03,0x01, -0x01,0x02,0x00,0x01,0x67,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x05,0x02,0x51,0x01,0x00,0x11,0x10,0x0e,0x0c,0x0b,0x09,0x07,0x06,0x04,0x02,0x00,0x13,0x01,0x13,0x07,0x07,0x16,0x2b,0x01,0x32,0x14,0x2b,0x01,0x15,0x14,0x22,0x3d,0x01,0x23,0x22,0x34,0x3b,0x01,0x35,0x34,0x32,0x1d,0x01,0x02,0x26,0x1e,0x1e,0xd2,0x64,0xd2,0x1e,0x1e, -0xd2,0x64,0x01,0x90,0x64,0xd2,0x1e,0x1e,0xd2,0x64,0xd2,0x1e,0x1e,0xd2,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x44,0x01,0x90,0x00,0x07,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x01,0x00,0x05,0x02,0x00,0x07,0x01,0x06,0x03,0x07,0x16,0x2b,0x01,0x32, -0x14,0x23,0x21,0x22,0x34,0x33,0x02,0x26,0x1e,0x1e,0xfd,0xf8,0x1e,0x1e,0x01,0x90,0x64,0x64,0x00,0x00,0x00,0x01,0xff,0xfd,0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x0c,0x00,0x13,0x40,0x10,0x00,0x01,0x01,0x13,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x15,0x13,0x02,0x07,0x18,0x2b,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e, -0x01,0x03,0x59,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xf4,0xba,0x7e,0x01,0x5e,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x3c,0x01,0xed,0x00,0x0e,0x00,0x1e,0x40,0x1b,0x00,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01, -0x00,0x51,0x35,0x14,0x02,0x07,0x18,0x2b,0x01,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x26,0x34,0x36,0x33,0x21,0x32,0x16,0x02,0x3b,0x0a,0xfa,0x0b,0x1c,0x0b,0xfa,0x0b,0x16,0x0e,0x01,0xf4,0x0e,0x16,0x01,0xc9,0x0e,0x0b,0xfa,0x0b,0x0b,0xfa,0x0b,0x1c,0x16,0x16,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0xa0,0x03,0x0b,0x00,0x2d, -0x00,0x42,0x00,0x48,0x40,0x45,0x3b,0x01,0x04,0x06,0x25,0x01,0x05,0x04,0x02,0x4c,0x00,0x07,0x01,0x02,0x01,0x07,0x02,0x80,0x00,0x06,0x02,0x04,0x02,0x06,0x04,0x80,0x00,0x04,0x05,0x02,0x04,0x05,0x7e,0x00,0x05,0x03,0x02,0x05,0x03,0x7e,0x00,0x03,0x00,0x00,0x03,0x00,0x64,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x13,0x02,0x4e, -0x14,0x17,0x15,0x27,0x35,0x39,0x35,0x33,0x08,0x07,0x1e,0x2b,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x17,0x1e,0x01,0x0f,0x01,0x06,0x23,0x27,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x3d,0x01,0x34,0x3f,0x01,0x36,0x33,0x32,0x17,0x16,0x13,0x01,0x06,0x22,0x2f,0x01, -0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x01,0x36,0x32,0x1f,0x01,0x16,0x14,0x03,0x12,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x23,0x1e,0x09,0x03,0x07,0x1b,0x06,0x07,0x05,0x0d,0x0c,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x05,0x24,0x06,0x07,0x03,0x04,0x0b,0x81,0xfe,0x39,0x0d,0x24,0x0e,0xf0,0x0e, -0x0e,0x3d,0x0e,0x24,0x0e,0x93,0x01,0x69,0x0d,0x24,0x0e,0x3e,0x0d,0x01,0x4b,0xb1,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x5e,0x01,0x0e,0x04,0x13,0x06,0x1c,0x05,0x01,0x03,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x8d,0x08,0x05,0x23,0x06,0x02,0x04,0x01,0x05,0xfe,0x3a,0x0e,0x0e,0xf0,0x0d,0x24,0x0e,0x3e,0x0d,0x0d,0x93,0x01, -0x69,0x0d,0x0d,0x3d,0x0e,0x24,0x00,0x00,0x00,0x06,0x00,0x00,0xff,0xb1,0x03,0x12,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3b,0x00,0x43,0x00,0x67,0x00,0x5d,0x40,0x5a,0x57,0x45,0x02,0x06,0x08,0x29,0x21,0x19,0x11,0x09,0x01,0x06,0x00,0x01,0x02,0x4c,0x00,0x09,0x0e,0x08,0x0e,0x09,0x08,0x80,0x0f,0x0d,0x02,0x08,0x0c,0x0a, -0x02,0x06,0x01,0x08,0x06,0x68,0x05,0x03,0x02,0x01,0x04,0x02,0x02,0x00,0x07,0x01,0x00,0x69,0x00,0x0e,0x0e,0x13,0x4d,0x00,0x07,0x07,0x0b,0x5f,0x00,0x0b,0x0b,0x11,0x0b,0x4e,0x65,0x64,0x61,0x5e,0x5b,0x59,0x53,0x52,0x4f,0x4c,0x49,0x47,0x41,0x3f,0x14,0x24,0x14,0x26,0x26,0x26,0x26,0x26,0x23,0x10,0x07,0x1f,0x2b,0x01,0x11,0x14, -0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x13,0x11,0x21,0x11,0x14,0x1e,0x01,0x33,0x21,0x32,0x3e,0x01,0x01,0x33,0x27,0x26,0x27,0x23,0x06, -0x07,0x05,0x15,0x14,0x06,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x37,0x3e,0x01,0x37,0x33,0x32,0x16,0x1f,0x01,0x33,0x32,0x16,0x01,0x1e,0x0a,0x08,0x24,0x08,0x0a,0x0a,0x08,0x24,0x08,0x0a,0x8f,0x0a,0x08,0x24,0x08,0x0a,0x0a,0x08,0x24,0x08,0x0a,0x8e,0x0a,0x07,0x24, -0x08,0x0a,0x0a,0x08,0x24,0x07,0x0a,0x48,0xfe,0x0c,0x08,0x08,0x02,0x01,0xd0,0x02,0x08,0x08,0xfe,0x89,0xfa,0x1b,0x04,0x05,0xb1,0x06,0x04,0x01,0xeb,0x0a,0x08,0x36,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x35,0x08,0x0a,0x0a,0x08,0xac,0x27,0x09,0x2c,0x16,0xb2,0x17,0x2a,0x09,0x27,0xad,0x08,0x0a,0x01,0xb7,0xfe,0xbf,0x08,0x0a,0x0a, -0x08,0x01,0x41,0x08,0x0a,0x0a,0x08,0xfe,0xbf,0x08,0x0a,0x0a,0x08,0x01,0x41,0x08,0x0a,0x0a,0x08,0xfe,0xbf,0x08,0x0a,0x0a,0x08,0x01,0x41,0x08,0x0a,0x0a,0xfe,0x64,0x02,0x11,0xfd,0xef,0x0c,0x14,0x0a,0x0a,0x14,0x02,0x65,0x41,0x05,0x01,0x01,0x05,0x53,0x24,0x08,0x0a,0xfd,0xef,0x2e,0x44,0x42,0x2e,0x02,0x13,0x0a,0x08,0x24,0x08, -0x0a,0x5d,0x15,0x1c,0x01,0x1e,0x14,0x5d,0x0a,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0x9c,0x03,0xac,0x03,0x20,0x00,0x2a,0x00,0x34,0x40,0x09,0x20,0x1e,0x16,0x12,0x04,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x00,0x01,0x01,0x10,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x1b,0x40,0x0b,0x00,0x00,0x00,0x01,0x61,0x00, -0x01,0x01,0x10,0x00,0x4e,0x59,0xb5,0x1b,0x1a,0x13,0x02,0x07,0x17,0x2b,0x25,0x16,0x1d,0x01,0x21,0x35,0x34,0x37,0x3e,0x01,0x35,0x34,0x26,0x27,0x2e,0x03,0x27,0x34,0x36,0x3f,0x01,0x26,0x27,0x26,0x36,0x32,0x16,0x0f,0x01,0x16,0x15,0x0e,0x03,0x07,0x0e,0x01,0x15,0x14,0x16,0x02,0xe0,0xcc,0xfc,0x54,0xcc,0x5e,0x44,0x2c,0x0a,0x02, -0x0e,0x0e,0x0e,0x02,0x0a,0x04,0x04,0x08,0x04,0x04,0x5a,0xe0,0x5c,0x06,0x0c,0x12,0x02,0x0e,0x0e,0x0e,0x02,0x08,0x2e,0x46,0x80,0x48,0x32,0x6a,0x6a,0x32,0x48,0x22,0x46,0x3c,0x16,0x36,0x2e,0x0c,0x0c,0x04,0x1e,0x1c,0x10,0x14,0x02,0x04,0x32,0x26,0x36,0x74,0x74,0x36,0x58,0x08,0x22,0x1c,0x1e,0x04,0x0c,0x0c,0x30,0x34,0x16,0x3c, -0x46,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xb6,0x03,0xe8,0x03,0x08,0x00,0x18,0x00,0x20,0x00,0x2d,0x00,0x94,0xb5,0x25,0x01,0x09,0x0b,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x30,0x0d,0x01,0x0b,0x08,0x09,0x08,0x0b,0x72,0x0c,0x01,0x05,0x00,0x01,0x05,0x57,0x06,0x03,0x02,0x01,0x04,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x07, -0x07,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x0a,0x01,0x08,0x08,0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x1b,0x40,0x31,0x0d,0x01,0x0b,0x08,0x09,0x08,0x0b,0x09,0x80,0x0c,0x01,0x05,0x00,0x01,0x05,0x57,0x06,0x03,0x02,0x01,0x04,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x07,0x07,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x0a,0x01,0x08,0x08, -0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x59,0x40,0x1e,0x21,0x21,0x00,0x00,0x21,0x2d,0x21,0x2d,0x2c,0x2b,0x29,0x26,0x23,0x22,0x20,0x1d,0x1b,0x1a,0x00,0x18,0x00,0x18,0x12,0x24,0x35,0x22,0x11,0x0e,0x07,0x1b,0x2b,0x01,0x15,0x21,0x13,0x36,0x3b,0x01,0x36,0x3f,0x01,0x3e,0x01,0x3b,0x01,0x32,0x16,0x17,0x16,0x17,0x33,0x32,0x17, -0x13,0x21,0x35,0x03,0x07,0x21,0x27,0x26,0x2b,0x01,0x22,0x13,0x35,0x21,0x06,0x07,0x06,0x23,0x21,0x22,0x35,0x27,0x21,0x15,0x01,0xc8,0xfe,0x38,0x0a,0x04,0x60,0xa0,0x10,0x15,0x17,0x0e,0x12,0x1c,0xde,0x1a,0x14,0x0c,0x12,0x2a,0xa0,0x60,0x04,0x0a,0xfe,0x3a,0xa4,0x1c,0x01,0x24,0x1c,0x0e,0x1c,0x98,0x1c,0x96,0x01,0xae,0x06,0x04, -0x06,0x54,0xfd,0x12,0x5a,0x0a,0x01,0xae,0x01,0x46,0x64,0x01,0x24,0x6c,0x1a,0x29,0x2d,0x1a,0x0c,0x0e,0x18,0x20,0x50,0x6c,0xfe,0xdc,0x64,0x01,0x62,0x36,0x36,0x1a,0xfd,0x8a,0x64,0x58,0x4e,0x54,0x54,0xa6,0x64,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0xcc,0x00,0x08,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01, -0x01,0x00,0x59,0x02,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x01,0x00,0x05,0x04,0x00,0x08,0x01,0x08,0x03,0x07,0x16,0x2b,0x13,0x32,0x16,0x14,0x06,0x22,0x26,0x34,0x36,0x6e,0x2e,0x40,0x40,0x5c,0x40,0x40,0x01,0xcc,0x40,0x5a,0x42,0x42,0x5a,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x67,0x02,0x7c,0x00,0x0d, -0x00,0x1e,0x40,0x1b,0x00,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x17,0x13,0x02,0x07,0x18,0x2b,0x01,0x11,0x14,0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x16,0x01,0x65,0x14,0x20,0x09,0xfa,0x0a,0x0a,0xfa,0x0b,0x1c,0x18,0x02,0x58,0xfe,0x0c,0x0e,0x16, -0x0b,0xfa,0x0b,0x1c,0x0b,0xfa,0x0b,0x16,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x41,0x02,0x7d,0x00,0x0e,0x00,0x0a,0xb7,0x00,0x00,0x00,0x76,0x14,0x01,0x07,0x17,0x2b,0x01,0x14,0x0f,0x01,0x06,0x22,0x26,0x35,0x11,0x34,0x3e,0x01,0x1f,0x01,0x16,0x01,0x41,0x0a,0xfa,0x0b,0x1c,0x16,0x16,0x1c,0x0b,0xfa,0x0a,0x01,0x5e,0x0e,0x0b,0xfa, -0x0b,0x16,0x0e,0x01,0xf4,0x0f,0x14,0x02,0x0c,0xfa,0x0a,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x02,0x3b,0x01,0xc9,0x00,0x0e,0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x15,0x32,0x02,0x07,0x18,0x2b,0x25,0x14,0x06,0x27,0x21,0x22,0x2e,0x01,0x3f,0x01,0x36,0x32,0x1f,0x01, -0x16,0x02,0x3b,0x14,0x0f,0xfe,0x0c,0x0f,0x14,0x02,0x0c,0xfa,0x0a,0x1e,0x0a,0xfa,0x0a,0xab,0x0e,0x16,0x01,0x14,0x1e,0x0b,0xfa,0x0a,0x0a,0xfa,0x0b,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x5e,0x02,0x51,0x00,0x15,0x00,0x1e,0x40,0x1b,0x03,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00, -0x61,0x00,0x00,0x01,0x00,0x51,0x17,0x19,0x02,0x07,0x18,0x2b,0x01,0x14,0x0f,0x01,0x17,0x16,0x14,0x0f,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x37,0x01,0x36,0x32,0x1f,0x01,0x16,0x01,0x5e,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x0e,0x06,0xfe,0xfc,0x06,0x06,0x01,0x04,0x05,0x10,0x04,0x1c,0x06,0x02,0x22,0x07,0x05,0xdc,0xdb,0x06,0x0e, -0x06,0x1c,0x05,0x05,0x01,0x05,0x05,0x0e,0x06,0x01,0x04,0x06,0x06,0x1c,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x4c,0x02,0x51,0x00,0x15,0x00,0x1e,0x40,0x1b,0x0b,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1c,0x14,0x02,0x07,0x18,0x2b,0x01,0x14,0x07,0x01, -0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x27,0x26,0x34,0x3f,0x01,0x36,0x32,0x17,0x01,0x16,0x01,0x4c,0x05,0xfe,0xfb,0x05,0x0e,0x06,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x10,0x04,0x01,0x05,0x05,0x01,0x3a,0x07,0x05,0xfe,0xfb,0x05,0x05,0x1c,0x06,0x0e,0x06,0xdb,0xdc,0x05,0x0e,0x06,0x1c,0x06,0x06,0xfe,0xfc,0x05,0x00, -0x00,0x03,0xff,0xfc,0xff,0x90,0x03,0x9a,0x03,0x2c,0x00,0x08,0x00,0x16,0x00,0x3f,0x00,0x83,0x40,0x0b,0x38,0x36,0x02,0x03,0x05,0x13,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x24,0x50,0x58,0x40,0x24,0x00,0x05,0x06,0x03,0x06,0x05,0x03,0x80,0x00,0x06,0x00,0x03,0x02,0x06,0x03,0x69,0x08,0x01,0x02,0x00,0x01,0x02,0x01,0x66,0x00,0x04, -0x04,0x00,0x61,0x07,0x01,0x00,0x00,0x12,0x04,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x06,0x03,0x06,0x05,0x03,0x80,0x07,0x01,0x00,0x00,0x04,0x06,0x00,0x04,0x69,0x00,0x06,0x00,0x03,0x02,0x06,0x03,0x69,0x08,0x01,0x02,0x01,0x01,0x02,0x59,0x08,0x01,0x02,0x02,0x01,0x62,0x00,0x01,0x02,0x01,0x52,0x59,0x40,0x19,0x0a,0x09,0x01,0x00,0x27, -0x26,0x22,0x20,0x1d,0x1b,0x11,0x0e,0x09,0x16,0x0a,0x16,0x05,0x04,0x00,0x08,0x01,0x08,0x09,0x07,0x16,0x2b,0x01,0x36,0x00,0x12,0x00,0x04,0x00,0x02,0x00,0x13,0x32,0x36,0x35,0x36,0x26,0x2b,0x01,0x22,0x06,0x07,0x14,0x16,0x17,0x13,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x07,0x15,0x33,0x35,0x34,0x37,0x36,0x32,0x17,0x16,0x15, -0x14,0x07,0x06,0x0f,0x01,0x06,0x0f,0x01,0x06,0x07,0x06,0x07,0x15,0x33,0x35,0x34,0x37,0x36,0x3f,0x01,0x36,0x01,0xc6,0xbe,0x01,0x10,0x06,0xfe,0xf6,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0c,0xbc,0x1e,0x26,0x02,0x26,0x1e,0x02,0x1c,0x26,0x02,0x26,0x1c,0xa8,0x1a,0x6a,0x52,0x40,0x28,0x44,0x04,0x6e,0x10,0x10,0x4e,0x0c,0x10,0x10,0x08, -0x0c,0x16,0x0a,0x0a,0x15,0x0b,0x06,0x0e,0x04,0x6c,0x04,0x06,0x16,0x1c,0x2e,0x03,0x2a,0x02,0xfe,0xf8,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0a,0x01,0x7c,0x01,0x12,0xfd,0x1e,0x26,0x1c,0x1e,0x26,0x24,0x1c,0x1e,0x26,0x02,0x01,0x48,0x22,0x2c,0x4e,0x4c,0x1a,0x2a,0x68,0x04,0x04,0x1a,0x1c,0x18,0x14,0x14,0x18,0x12,0x16,0x0c,0x08,0x0f, -0x07,0x08,0x11,0x09,0x08,0x14,0x3a,0x08,0x04,0x0c,0x10,0x14,0x10,0x12,0x22,0x00,0x00,0x02,0x00,0x00,0xff,0xbd,0x03,0x4d,0x03,0x0b,0x00,0x08,0x00,0x1d,0x00,0x3a,0xb5,0x00,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x29,0x50,0x58,0x40,0x10,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x00,0x01,0x01,0x11,0x01,0x4e,0x1b,0x40, -0x10,0x00,0x01,0x00,0x01,0x86,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x13,0x00,0x4e,0x59,0xb5,0x38,0x1a,0x12,0x03,0x07,0x19,0x2b,0x13,0x34,0x26,0x0e,0x01,0x1e,0x02,0x36,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x2e,0x01,0x3d,0x01,0x34,0x36,0x37,0x33,0x32,0x16,0x17,0x01,0x16,0xfa,0x2a,0x3a,0x2c,0x02,0x28,0x3e,0x26,0x02, -0x55,0x14,0xfe,0xee,0x16,0x3b,0x14,0xfe,0x71,0x15,0x1e,0x2a,0x1d,0xe9,0x1d,0x48,0x15,0x01,0x8f,0x14,0x02,0x58,0x1e,0x2a,0x02,0x26,0x40,0x24,0x06,0x30,0xfe,0xd9,0x1e,0x15,0xfe,0xee,0x15,0x15,0x01,0x8f,0x15,0x48,0x1d,0xe8,0x1d,0x2a,0x01,0x1e,0x15,0xfe,0x71,0x15,0x00,0x0d,0x00,0x00,0xff,0xea,0x03,0xca,0x02,0xd2,0x00,0x03, -0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0xa9,0x40,0xa6,0x18,0x12,0x0c,0x03,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x20,0x19,0x13,0x1d,0x0d,0x05,0x07,0x03,0x00,0x07,0x03,0x7e,0x17,0x11,0x0b,0x03,0x05,0x02,0x04,0x02,0x05,0x04,0x80,0x16,0x10, -0x0a,0x03,0x04,0x01,0x02,0x04,0x01,0x7e,0x00,0x00,0x14,0x1e,0x0f,0x08,0x1b,0x05,0x03,0x02,0x00,0x03,0x67,0x1f,0x15,0x0e,0x1c,0x09,0x05,0x02,0x05,0x01,0x02,0x58,0x1f,0x15,0x0e,0x1c,0x09,0x05,0x02,0x02,0x01,0x5f,0x1a,0x01,0x01,0x02,0x01,0x4f,0x30,0x30,0x28,0x28,0x1c,0x1c,0x18,0x18,0x10,0x10,0x04,0x04,0x00,0x00,0x30,0x33, -0x30,0x33,0x32,0x31,0x2f,0x2e,0x2d,0x2c,0x28,0x2b,0x28,0x2b,0x2a,0x29,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x17,0x16,0x15,0x14,0x10,0x13,0x10,0x13,0x12,0x11,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x21, -0x07,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x33,0x35,0x03,0x33,0x35,0x23,0x13,0x23,0x15,0x33,0x17,0x35,0x23,0x1d,0x01,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x05,0x15,0x33,0x35,0x03,0x33,0x35,0x23,0x13,0x23,0x15,0x33,0x17,0x35,0x23,0x1d,0x01,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x03,0xca,0xfe,0x3d,0x9f,0x9f,0x9f,0x9f,0x9f, -0x9f,0x9f,0xe1,0x9e,0x9e,0x9e,0x9e,0x9e,0xfd,0x5b,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0xe1,0x9d,0x9d,0x9d,0x9d,0x9d,0x16,0x02,0xe8,0xfd,0x18,0x01,0xc4,0x9f,0x9f,0xfe,0x80,0x9d,0x01,0xc4,0x9e,0xe2,0x9f,0x9f,0xe1,0x9d,0x01,0x26,0x9e,0x9e,0x43,0x9f,0x9f,0xfe,0x80,0x9d,0x01,0xc4,0x9e,0xe2,0x9f,0x9f,0xe1,0x9d,0x01,0x26,0x9e, -0x9e,0x00,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0xf9,0x04,0x19,0x03,0x0b,0x00,0x12,0x00,0x29,0x00,0x20,0x40,0x1d,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x00,0x63,0x00,0x03,0x03,0x13,0x03,0x4e,0x23,0x3a,0x23,0x36,0x35,0x05,0x07,0x1b,0x2b,0x01,0x14,0x0f,0x01,0x0e,0x01,0x23,0x21,0x22,0x2e,0x01,0x3f, -0x01,0x3e,0x01,0x33,0x21,0x32,0x16,0x27,0x15,0x21,0x22,0x06,0x0f,0x02,0x27,0x26,0x37,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x04,0x19,0x12,0xbb,0x18,0x56,0x26,0xfd,0xa1,0x13,0x1c,0x01,0x11,0xbc,0x18,0x56,0x25,0x02,0x5f,0x13,0x1e,0xc0,0xfe,0x30,0x35,0x72,0x23,0xbc,0x02,0x01,0x01,0x01,0x4a,0x33,0xb3, -0x33,0x4a,0x01,0x2f,0x34,0x48,0x01,0x3f,0x11,0x14,0xdd,0x1c,0x28,0x0e,0x22,0x14,0xdd,0x1c,0x28,0x0e,0xaf,0x5a,0x34,0x29,0xdd,0x03,0x07,0x05,0x02,0x02,0x18,0x33,0x4a,0x4a,0x33,0x12,0x4a,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf9,0x03,0xa1,0x03,0x0b,0x00,0x14,0x00,0x16,0x40,0x13,0x00,0x02,0x00,0x00,0x02,0x00,0x64,0x00, -0x01,0x01,0x13,0x01,0x4e,0x23,0x35,0x33,0x03,0x07,0x19,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x03,0xa1,0x4a,0x33,0xfd,0x59,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x77,0x33,0x4a,0x01,0xff,0xfe,0x77,0x33,0x4a,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33, -0x12,0x4a,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf2,0x02,0xf8,0x02,0xcc,0x00,0x06,0x00,0x1d,0x40,0x1a,0x01,0x01,0x00,0x49,0x00,0x01,0x00,0x01,0x85,0x03,0x02,0x02,0x00,0x00,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x12,0x04,0x07,0x18,0x2b,0x09,0x02,0x33,0x11,0x21,0x11,0x02,0xf8,0xfe,0x84,0xfe,0x84,0xc0,0x01,0x78,0x01,0x6e, -0xfe,0x84,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0x00,0x02,0xff,0xf7,0xff,0xe2,0x03,0xdb,0x03,0x12,0x00,0x17,0x00,0x20,0x00,0x26,0x40,0x23,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x19,0x18,0x1d,0x1c,0x18,0x20,0x19,0x20,0x2f,0x04,0x07,0x17,0x2b,0x01,0x1e, -0x01,0x06,0x07,0x06,0x26,0x06,0x07,0x06,0x1e,0x01,0x07,0x0e,0x02,0x23,0x22,0x26,0x37,0x3e,0x01,0x37,0x24,0x03,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x03,0x59,0x48,0x3a,0x12,0x1a,0x10,0x4c,0x54,0x26,0x1e,0x12,0x32,0x02,0x02,0x44,0xb8,0x7c,0xba,0xd2,0x0a,0x08,0xc0,0x78,0x01,0x22,0x48,0x1e,0x2c,0x2c,0x3e,0x2c,0x2c,0x02, -0x6e,0x30,0x7c,0x54,0x06,0x04,0x1c,0x08,0x2a,0x2e,0x3a,0x48,0x0e,0x1a,0x4a,0x4a,0xca,0x90,0x76,0xea,0x22,0x54,0xfd,0x8a,0x2c,0x40,0x2a,0x2a,0x40,0x2c,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x6a,0x03,0x59,0x03,0x52,0x00,0x06,0x00,0x18,0x00,0x33,0x40,0x30,0x01,0x01,0x00,0x03,0x01,0x4c,0x00,0x03,0x00,0x03,0x85,0x04,0x01,0x00, -0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x18,0x16,0x11,0x0e,0x0b,0x09,0x00,0x06,0x00,0x06,0x05,0x07,0x16,0x2b,0x01,0x11,0x16,0x1f,0x01,0x16,0x17,0x05,0x14,0x16,0x17,0x21,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x21,0x02,0x3b,0x0d,0x08, -0xe3,0x08,0x08,0xfe,0xb1,0x20,0x16,0x01,0x2f,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x01,0xbe,0x02,0x34,0x01,0x08,0x08,0x08,0xe4,0x07,0x0d,0x12,0x16,0x1e,0x01,0xfd,0xb3,0x17,0x1e,0x01,0x20,0x16,0x03,0x7c,0x17,0x1e,0x01,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x08,0x00,0x6a,0x00,0x45, -0x40,0x42,0x65,0x59,0x4c,0x41,0x04,0x00,0x04,0x3b,0x0a,0x02,0x01,0x00,0x34,0x28,0x1b,0x10,0x04,0x03,0x01,0x03,0x4c,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x69,0x00,0x00,0x00,0x05,0x5f,0x00,0x05,0x05,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x5c,0x5b,0x53,0x51,0x49,0x48,0x2b,0x2a,0x22,0x20,0x13, -0x12,0x07,0x07,0x18,0x2b,0x01,0x34,0x26,0x22,0x0e,0x01,0x16,0x32,0x36,0x25,0x15,0x14,0x06,0x0f,0x01,0x06,0x07,0x16,0x17,0x16,0x14,0x07,0x0e,0x01,0x27,0x22,0x2f,0x01,0x06,0x07,0x06,0x07,0x06,0x2b,0x01,0x22,0x26,0x35,0x27,0x26,0x27,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x34,0x37,0x3e,0x01,0x37,0x26,0x2f,0x01,0x2e,0x01,0x27, -0x35,0x34,0x36,0x3f,0x01,0x36,0x37,0x26,0x27,0x26,0x34,0x37,0x3e,0x01,0x33,0x32,0x1f,0x01,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x32,0x16,0x1f,0x01,0x16,0x17,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x14,0x07,0x0e,0x01,0x07,0x16,0x1f,0x01,0x1e,0x01,0x02,0x3b,0x52,0x78,0x52,0x02,0x56,0x74,0x56,0x01,0x1c,0x08,0x07,0x68,0x0a,0x0b, -0x13,0x28,0x06,0x05,0x0f,0x50,0x0d,0x07,0x07,0x4d,0x19,0x1a,0x09,0x07,0x04,0x10,0x7c,0x08,0x0c,0x10,0x1b,0x17,0x4f,0x06,0x10,0x06,0x46,0x16,0x04,0x05,0x08,0x28,0x0a,0x0f,0x08,0x66,0x07,0x08,0x01,0x0a,0x05,0x68,0x08,0x0e,0x17,0x25,0x06,0x05,0x0f,0x50,0x0d,0x07,0x08,0x4d,0x18,0x1a,0x09,0x08,0x03,0x11,0x7c,0x07,0x0c,0x01, -0x0f,0x1c,0x17,0x4f,0x05,0x0f,0x07,0x48,0x14,0x04,0x04,0x09,0x28,0x0a,0x0f,0x08,0x66,0x07,0x0a,0x01,0x5e,0x3b,0x54,0x54,0x76,0x54,0x54,0x78,0x7c,0x07,0x0c,0x01,0x10,0x1e,0x15,0x1b,0x32,0x06,0x0e,0x06,0x15,0x50,0x01,0x05,0x3c,0x0d,0x08,0x4c,0x1c,0x10,0x0a,0x07,0x67,0x09,0x0c,0x3c,0x05,0x06,0x40,0x1e,0x05,0x0e,0x06,0x0c, -0x32,0x0f,0x1c,0x1b,0x0f,0x01,0x0c,0x07,0x7c,0x07,0x0c,0x01,0x10,0x19,0x1a,0x20,0x2d,0x07,0x0c,0x07,0x14,0x50,0x05,0x3c,0x0d,0x08,0x4c,0x1c,0x10,0x0a,0x07,0x67,0x09,0x0b,0x3b,0x05,0x05,0x43,0x1c,0x05,0x0e,0x06,0x0c,0x32,0x0f,0x1c,0x1a,0x10,0x01,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0xff,0xf9,0x03,0xe8,0x03,0x0b,0x00,0x0f, -0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x5f,0x00,0x6f,0x00,0x7f,0x00,0x8f,0x00,0x47,0x40,0x44,0x0f,0x09,0x02,0x03,0x0e,0x08,0x02,0x02,0x01,0x03,0x02,0x67,0x0b,0x05,0x02,0x01,0x0a,0x04,0x02,0x00,0x01,0x00,0x63,0x10,0x0c,0x02,0x06,0x06,0x07,0x5f,0x11,0x0d,0x02,0x07,0x07,0x13,0x06,0x4e,0x8e,0x8b,0x86,0x83,0x7e,0x7b, -0x76,0x73,0x6e,0x6b,0x66,0x63,0x5e,0x5b,0x56,0x53,0x4e,0x4b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x12,0x07,0x1f,0x2b,0x25,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x13,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x07,0x23,0x22, -0x26,0x27,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x27,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x17,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22, -0x26,0x27,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x37,0x33,0x32,0x16,0x13,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x1e,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2, -0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0xfe,0x9c,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0xfe,0x9c,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2, -0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0x9a,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x01,0x06,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0xfe,0xcd,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x02, -0x24,0x6b,0x16,0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0xfe,0xcc,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0xfe,0xcd,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x02,0x24,0x6b,0x16,0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0xfe,0xcc,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0x01,0x08,0x6b,0x16, -0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0x00,0x00,0x05,0x00,0x00,0xff,0x6a,0x03,0xe8,0x03,0x52,0x00,0x10,0x00,0x14,0x00,0x25,0x00,0x2f,0x00,0x39,0x00,0x65,0x40,0x62,0x33,0x29,0x02,0x07,0x08,0x21,0x01,0x05,0x02,0x1d,0x15,0x0d,0x0c,0x04,0x00,0x05,0x03,0x4c,0x04,0x01,0x05,0x01,0x4b,0x0a,0x01,0x08,0x09,0x01,0x07,0x01,0x08,0x07, -0x67,0x00,0x02,0x05,0x01,0x02,0x57,0x06,0x0c,0x03,0x0b,0x04,0x01,0x00,0x05,0x00,0x01,0x05,0x69,0x06,0x0c,0x03,0x0b,0x04,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x00,0x00,0x37,0x35,0x32,0x31,0x2d,0x2b,0x28,0x27,0x24,0x22,0x1f,0x1e,0x1b,0x19,0x11,0x14,0x11,0x14,0x13,0x12,0x00,0x10,0x00,0x0f,0x37,0x0d, -0x07,0x17,0x2b,0x01,0x11,0x14,0x06,0x07,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x13,0x36,0x33,0x21,0x11,0x23,0x11,0x01,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x22,0x26,0x27,0x11,0x33,0x32,0x17,0x25,0x15,0x23,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x05,0x15,0x23,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x89,0x16, -0x0e,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x8b,0x04,0x0d,0x01,0x9f,0x8e,0x02,0x3b,0x16,0x0e,0xfe,0xe3,0x0f,0x14,0x01,0x0f,0x14,0x01,0xed,0x0d,0x04,0xfe,0x3e,0xc5,0x0a,0x08,0xa1,0x08,0x0a,0x01,0x77,0xc5,0x0a,0x08,0xa1,0x08,0x0a,0x02,0x9f,0xfe,0x54,0x0f,0x14,0x01,0xfe,0xbf,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x01,0xe8,0x0c, -0xfe,0x78,0x01,0x88,0xfe,0x0c,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x41,0x16,0x0e,0x01,0xac,0x0c,0xad,0x7d,0x7d,0x08,0x0a,0x0a,0x08,0x7d,0x7d,0x08,0x0a,0x0a,0x00,0x08,0xff,0xff,0xff,0xf8,0x03,0xe9,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x5f,0x00,0x6f,0x00,0x7f,0x00,0x6f,0x40,0x6c,0x79,0x78, -0x71,0x49,0x48,0x41,0x06,0x08,0x09,0x69,0x61,0x60,0x29,0x21,0x20,0x06,0x04,0x05,0x59,0x58,0x51,0x50,0x19,0x18,0x11,0x10,0x08,0x02,0x03,0x39,0x38,0x31,0x09,0x08,0x01,0x06,0x00,0x01,0x04,0x4c,0x0d,0x01,0x05,0x0c,0x01,0x04,0x03,0x05,0x04,0x67,0x0b,0x01,0x03,0x0a,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01,0x06,0x01,0x00, -0x01,0x00,0x63,0x0e,0x01,0x08,0x08,0x09,0x5f,0x0f,0x01,0x09,0x09,0x13,0x08,0x4e,0x7d,0x7b,0x75,0x73,0x6d,0x6b,0x65,0x64,0x5d,0x5b,0x55,0x54,0x4d,0x4c,0x26,0x26,0x17,0x26,0x17,0x17,0x17,0x17,0x14,0x10,0x07,0x1f,0x2b,0x37,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x27,0x15,0x14,0x06,0x27, -0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x27,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x37,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x27, -0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x17,0x21,0x32,0x16,0x27,0x15,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x27,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x8f,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08, -0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x03,0x58,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0xfc,0xa6,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x03,0x58,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x01,0x0a,0x08,0xfd,0x12,0x07, -0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x01,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x76,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0xd0,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0xce,0x6b,0x07,0x0a,0x01,0x0c,0x06,0x6b,0x08,0x0a,0x0a,0xfe,0x4c,0x6b,0x07,0x0c,0x01,0x0a, -0x08,0x6b,0x07,0x0a,0x01,0x0c,0x02,0x7d,0x6b,0x08,0x0a,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0xfe,0x4d,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0xce,0x6b,0x07,0x0a,0x01,0x0c,0x06,0x6b,0x08,0x0a,0x0a,0xcf,0x6b,0x08,0x0a,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x02,0x83, -0x03,0x0b,0x00,0x07,0x00,0x1f,0x00,0x20,0x40,0x1d,0x05,0x03,0x02,0x00,0x00,0x02,0x00,0x02,0x63,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x13,0x01,0x4e,0x23,0x13,0x25,0x36,0x13,0x10,0x06,0x07,0x1c,0x2b,0x13,0x21,0x35,0x34,0x26,0x0e,0x01,0x17,0x05,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x17,0x33,0x35,0x34, -0x36,0x32,0x16,0x07,0x15,0x33,0x32,0x16,0xb3,0x01,0x1d,0x54,0x76,0x54,0x01,0x01,0xd0,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0x20,0x16,0x11,0x94,0xcc,0x96,0x02,0x12,0x17,0x1e,0x01,0xa5,0x6c,0x3b,0x54,0x02,0x50,0x3d,0xa1,0xfe,0xbe,0x16,0x1e,0x01,0x20,0x15,0x01,0x42,0x16,0x20,0x01,0x6c,0x66,0x94,0x94,0x66,0x6c,0x1e,0x00,0x00, -0x00,0x01,0x00,0x00,0xff,0xe2,0x02,0xda,0x02,0xda,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x01,0x00,0x01,0x4c,0x00,0x01,0x00,0x4a,0x05,0x01,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x11,0x11,0x02,0x07,0x18,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x01,0x01,0x7a,0x01,0x60,0xfe, -0xa0,0xfe,0x86,0x02,0xda,0xbe,0xfe,0x86,0xc0,0x01,0x7c,0x00,0x00,0x02,0xff,0xff,0xff,0xb1,0x04,0x2f,0x03,0x52,0x00,0x0f,0x00,0x2f,0x00,0x2e,0x40,0x2b,0x09,0x01,0x02,0x01,0x00,0x20,0x01,0x03,0x02,0x02,0x4c,0x00,0x05,0x00,0x00,0x01,0x05,0x00,0x67,0x00,0x01,0x04,0x01,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x03,0x11,0x03,0x4e, -0x35,0x26,0x36,0x26,0x26,0x14,0x06,0x07,0x1c,0x2b,0x01,0x11,0x34,0x26,0x27,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x14,0x1e,0x01,0x17,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x34,0x3e,0x01,0x35,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0xe8,0x0a,0x08,0xfc,0x83, -0x07,0x0a,0x01,0x0c,0x06,0x03,0x7d,0x07,0x0c,0x46,0x34,0x25,0xfe,0xd1,0x12,0x10,0x01,0x14,0x0f,0xfe,0xe2,0x0f,0x14,0x01,0x12,0x12,0xfe,0xd0,0x24,0x36,0x01,0x34,0x25,0x03,0x7d,0x25,0x34,0x01,0x28,0x01,0xd1,0x07,0x0a,0x01,0x0c,0x06,0xfe,0x2f,0x07,0x0a,0x0a,0x01,0xd8,0xfd,0xa1,0x25,0x34,0x01,0x14,0x2e,0x22,0x07,0x0e,0x16, -0x16,0x0e,0x08,0x22,0x2c,0x15,0x36,0x24,0x02,0x5f,0x25,0x34,0x34,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xe1,0x02,0xf8,0x02,0xdb,0x00,0x21,0x00,0x31,0x00,0x2f,0x40,0x2c,0x11,0x06,0x02,0x00,0x03,0x01,0x4c,0x00,0x01,0x00,0x01,0x86,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x69,0x00,0x03,0x00,0x00,0x03,0x59,0x00,0x03,0x03,0x00, -0x61,0x00,0x00,0x03,0x00,0x51,0x15,0x2b,0x1d,0x25,0x22,0x05,0x07,0x1b,0x2b,0x01,0x0e,0x01,0x23,0x22,0x26,0x27,0x0f,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x3f,0x02,0x2e,0x01,0x35,0x34,0x37,0x3e,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x25,0x1e,0x01,0x33,0x32,0x3e,0x01,0x34,0x2e,0x01,0x22,0x0e,0x01,0x15,0x14,0x16, -0x02,0xa8,0x29,0x66,0x36,0x31,0x5d,0x28,0x33,0x82,0x15,0x18,0x1e,0x2d,0x0f,0x81,0x7e,0x20,0x22,0x27,0x25,0x80,0x95,0x40,0x3f,0x26,0x26,0x14,0x14,0xfe,0x99,0x19,0x40,0x21,0x2d,0x4f,0x2e,0x2f,0x4e,0x5b,0x4f,0x2f,0x1a,0x01,0x00,0x29,0x2a,0x22,0x20,0x7d,0x82,0x0f,0x2f,0x1e,0x1a,0x13,0x82,0x33,0x26,0x5e,0x32,0x4b,0x40,0x3f, -0x4b,0x27,0x25,0x3f,0x41,0x4a,0x38,0x32,0x34,0x24,0x18,0x1a,0x2e,0x4f,0x5d,0x4e,0x2e,0x2f,0x4e,0x2d,0x22,0x40,0x00,0x00,0x00,0x02,0xff,0xfd,0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x0c,0x00,0x19,0x00,0x28,0x40,0x25,0x04,0x01,0x00,0x00,0x03,0x61,0x00,0x03,0x03,0x13,0x4d,0x00,0x01,0x01,0x02,0x61,0x00,0x02,0x02,0x11,0x02,0x4e, -0x01,0x00,0x17,0x16,0x11,0x10,0x07,0x06,0x00,0x0c,0x01,0x0c,0x05,0x07,0x16,0x2b,0x01,0x22,0x0e,0x02,0x1e,0x01,0x32,0x3e,0x01,0x2e,0x02,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e,0x01,0x01,0xad,0x53,0x8c,0x50,0x02,0x54,0x88,0xaa,0x86,0x56,0x04,0x4e,0x8e,0x01,0x5b,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xf4, -0xba,0x7e,0x02,0x8e,0x52,0x8c,0xa4,0x8c,0x52,0x52,0x8c,0xa4,0x8c,0x52,0xfe,0xd0,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0xb1,0x03,0x4d,0x02,0xff,0x00,0x06,0x00,0x14,0x00,0x19,0x00,0x24,0x00,0xe3,0x40,0x17,0x1e,0x01,0x02,0x05,0x1d,0x16,0x0e,0x07,0x04,0x03,0x02,0x19,0x03,0x02, -0x03,0x00,0x03,0x01,0x01,0x01,0x00,0x04,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x26,0x00,0x02,0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x00,0x03,0x70,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x72,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x4b,0xb0,0x12,0x50,0x58,0x40,0x27,0x00,0x02, -0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x05,0x03,0x00,0x7e,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x72,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x4b,0xb0,0x29,0x50,0x58,0x40,0x28,0x00,0x02,0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x05,0x03,0x00,0x7e,0x06,0x01,0x01,0x00, -0x04,0x00,0x01,0x04,0x80,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x40,0x23,0x00,0x05,0x02,0x05,0x85,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x00,0x03,0x85,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x04,0x80,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x59,0x59,0x59,0x40,0x12, -0x00,0x00,0x21,0x20,0x18,0x17,0x10,0x0f,0x09,0x08,0x00,0x06,0x00,0x06,0x14,0x07,0x07,0x17,0x2b,0x17,0x37,0x27,0x07,0x15,0x33,0x15,0x01,0x34,0x23,0x22,0x07,0x01,0x06,0x15,0x14,0x33,0x32,0x37,0x01,0x36,0x27,0x17,0x01,0x23,0x35,0x01,0x14,0x0f,0x01,0x27,0x37,0x36,0x32,0x1f,0x01,0x16,0xcb,0x32,0x83,0x33,0x48,0x01,0x5f,0x0c, -0x05,0x04,0xfe,0xd1,0x04,0x0d,0x05,0x04,0x01,0x2f,0x03,0x1e,0xe8,0xfe,0x30,0xe8,0x03,0x4d,0x14,0x5d,0xe8,0x5d,0x14,0x3b,0x16,0x83,0x14,0x07,0x33,0x83,0x33,0x3c,0x47,0x02,0x06,0x0c,0x04,0xfe,0xd2,0x04,0x06,0x0c,0x04,0x01,0x2e,0x04,0x71,0xe8,0xfe,0x2f,0xe9,0x01,0x9a,0x1d,0x15,0x5d,0xe9,0x5c,0x15,0x15,0x83,0x16,0x00,0x00, -0x00,0x05,0xff,0xff,0xff,0xf9,0x03,0x59,0x02,0xc4,0x00,0x08,0x00,0x11,0x00,0x21,0x00,0x2b,0x00,0x41,0x00,0x8e,0x40,0x0f,0x13,0x01,0x01,0x04,0x09,0x00,0x02,0x00,0x01,0x1b,0x01,0x05,0x00,0x03,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x03,0x01,0x01,0x04,0x00,0x04,0x01,0x00,0x80,0x02,0x01,0x00,0x05,0x08,0x00,0x70,0x00,0x09, -0x00,0x07,0x06,0x09,0x07,0x67,0x00,0x06,0x00,0x04,0x01,0x06,0x04,0x67,0x00,0x05,0x08,0x08,0x05,0x58,0x00,0x05,0x05,0x08,0x60,0x00,0x08,0x05,0x08,0x50,0x1b,0x40,0x31,0x03,0x01,0x01,0x04,0x00,0x04,0x01,0x00,0x80,0x02,0x01,0x00,0x05,0x04,0x00,0x05,0x7e,0x00,0x09,0x00,0x07,0x06,0x09,0x07,0x67,0x00,0x06,0x00,0x04,0x01,0x06, -0x04,0x67,0x00,0x05,0x08,0x08,0x05,0x58,0x00,0x05,0x05,0x08,0x60,0x00,0x08,0x05,0x08,0x50,0x59,0x40,0x0e,0x3d,0x3a,0x37,0x23,0x13,0x26,0x25,0x13,0x14,0x13,0x12,0x0a,0x07,0x1f,0x2b,0x25,0x14,0x06,0x22,0x26,0x3e,0x01,0x1e,0x01,0x17,0x14,0x06,0x22,0x26,0x3e,0x01,0x1e,0x01,0x17,0x35,0x34,0x26,0x27,0x21,0x22,0x06,0x07,0x15, -0x14,0x16,0x17,0x21,0x32,0x36,0x01,0x21,0x03,0x2e,0x01,0x23,0x21,0x22,0x06,0x07,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x35,0x34,0x37,0x13,0x3e,0x01,0x17,0x21,0x32,0x16,0x17,0x13,0x16,0x02,0x44,0x1a,0x24,0x1c,0x02,0x18,0x28,0x16,0x91,0x1a,0x24,0x1c,0x02,0x18,0x28,0x16,0x41,0x0c,0x06,0xfd,0x59,0x07,0x0a,0x01,0x0c, -0x06,0x02,0xa7,0x07,0x0a,0xfd,0x52,0x02,0x93,0x58,0x02,0x0e,0x07,0xfe,0x4b,0x07,0x0e,0x02,0x02,0x9e,0x34,0x25,0xfd,0x59,0x24,0x36,0x01,0x09,0x6e,0x09,0x34,0x1e,0x01,0xb5,0x1f,0x32,0x0a,0x6e,0x09,0xab,0x12,0x1a,0x1a,0x24,0x1c,0x02,0x18,0x14,0x12,0x1a,0x1a,0x24,0x1c,0x02,0x18,0x6d,0xb3,0x07,0x0a,0x01,0x0c,0x06,0xb3,0x07, -0x0a,0x01,0x0c,0x01,0x12,0x01,0x0d,0x07,0x0a,0x0a,0x07,0xfe,0x9a,0xb3,0x25,0x34,0x34,0x25,0xb3,0x0e,0x1c,0x01,0x52,0x1d,0x26,0x01,0x24,0x1e,0xfe,0xae,0x1c,0x00,0x00,0x01,0x00,0x00,0xff,0xe2,0x02,0xda,0x02,0xda,0x00,0x06,0x00,0x26,0x40,0x23,0x01,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x4a,0x02,0x01,0x00,0x49,0x00,0x01, -0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x13,0x02,0x07,0x18,0x2b,0x09,0x02,0x35,0x21,0x11,0x21,0x01,0x5e,0x01,0x7c,0xfe,0x84,0xfe,0xa2,0x01,0x5e,0x02,0xda,0xfe,0x84,0xfe,0x84,0xc0,0x01,0x7a,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xab,0x03,0x6b,0x03,0x20,0x00,0x0f,0x00,0x13,0x00,0x1f, -0x00,0x38,0x40,0x35,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x0b,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x00,0x5f,0x04,0x01,0x00,0x00,0x10,0x4d,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x11,0x01,0x4e,0x01,0x00,0x13,0x12,0x11,0x10,0x09,0x06,0x00,0x0f,0x01,0x0e,0x05,0x07,0x16,0x2b,0x13,0x22,0x06,0x15,0x11,0x14, -0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x05,0x21,0x11,0x21,0x01,0x07,0x17,0x07,0x17,0x37,0x17,0x37,0x27,0x37,0x27,0x07,0x87,0x0c,0x11,0x11,0x0c,0x02,0xc6,0x0c,0x11,0x11,0x0c,0xfd,0x58,0x02,0x8b,0xfd,0x75,0x01,0x87,0x2d,0x52,0x52,0x2d,0x53,0x52,0x2e,0x53,0x53,0x2e,0x52,0x03,0x1f,0x12,0x0c,0xfc,0xc8,0x0c,0x11, -0x11,0x0c,0x03,0x38,0x0c,0x12,0x3b,0xfd,0x02,0x02,0xcb,0x2e,0x52,0x53,0x2d,0x52,0x52,0x2d,0x53,0x52,0x2e,0x52,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x84,0x03,0x8f,0x03,0x33,0x00,0x02,0x00,0x10,0x00,0x3c,0x00,0x68,0x01,0x4d,0x40,0x0b,0x01,0x01,0x0a,0x02,0x62,0x36,0x02,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x36, -0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x72,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b,0x4b,0xb0,0x13,0x50,0x58,0x40,0x3c,0x12,0x01, -0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x70,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b,0x4b,0xb0,0x16,0x50,0x58, -0x40,0x3d,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b, -0x40,0x44,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x00,0x03,0x04,0x0a,0x03,0x57,0x0e,0x05,0x02,0x02,0x0f,0x01,0x0a,0x06,0x02,0x0a,0x69,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61, -0x0b,0x01,0x08,0x09,0x08,0x51,0x59,0x59,0x59,0x40,0x2d,0x04,0x03,0x00,0x00,0x68,0x66,0x5e,0x5c,0x5b,0x59,0x4d,0x4b,0x4a,0x48,0x3f,0x3d,0x3c,0x3a,0x32,0x30,0x2f,0x2d,0x21,0x1f,0x1e,0x1c,0x13,0x11,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x03,0x10,0x04,0x0f,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x01,0x07,0x27,0x25,0x22,0x06,0x1d, -0x01,0x33,0x35,0x21,0x15,0x33,0x35,0x34,0x26,0x23,0x13,0x33,0x32,0x16,0x1d,0x01,0x14,0x16,0x17,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x1d,0x01,0x14,0x0e,0x02,0x2b,0x01,0x35,0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e, -0x01,0x2b,0x01,0x35,0x33,0x32,0x36,0x37,0x36,0x37,0x36,0x3d,0x01,0x34,0x37,0x3e,0x02,0x3b,0x01,0x15,0x23,0x22,0x1d,0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x02,0x90,0x63,0x64,0xfe,0xcd,0x0d,0x13,0x3f,0x01,0x58,0x3f,0x12,0x0d,0x55,0x1b,0x47,0x45,0x07,0x0b,0x09,0x12,0x0e,0x1c,0x0f,0x0f,0x1a,0x12,0x0f,0x0c,0x08,0x05, -0x03,0x0f,0x22,0x34,0x27,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa8,0x1b,0x47,0x44,0x04,0x04,0x0b,0x09,0x23,0x18,0x10,0x10,0x1c,0x20,0x0a,0x08,0x05,0x04,0x07,0x07,0x23,0x33,0x27,0x1b,0x15,0x55,0x4e,0x4e,0x55,0x15,0x02,0xb1,0xac,0xac,0x82,0x12,0x0d,0xe7,0xc7,0x2e,0x4e,0x0d,0x12,0xfe,0xfa,0x42,0x44,0x54,0x14,0x1b,0x09,0x0a, -0x05,0x05,0x33,0x05,0x03,0x0a,0x08,0x0f,0x0d,0x14,0x80,0x1d,0x33,0x23,0x13,0x34,0x52,0x7f,0x5a,0x0a,0x09,0x5c,0x54,0x54,0xfd,0x8a,0x43,0x43,0x7e,0x0e,0x12,0x0e,0x0a,0x09,0x0b,0x33,0x08,0x09,0x08,0x0f,0x14,0x0d,0x57,0x21,0x16,0x19,0x24,0x12,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x00, -0xff,0xf2,0x02,0xf8,0x02,0xcc,0x00,0x06,0x00,0x17,0x40,0x14,0x06,0x01,0x00,0x4a,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x11,0x11,0x10,0x03,0x07,0x19,0x2b,0x01,0x23,0x11,0x21,0x11,0x23,0x01,0x02,0xf8,0xc0,0xfe,0x88,0xc0,0x01,0x7c,0x01,0x50,0xfe,0xa2,0x01,0x5e,0x01,0x7c,0x00,0x01,0x00,0x00,0x00,0x00,0x03,0xa5, -0x02,0x98,0x00,0x15,0x00,0x1d,0x40,0x1a,0x0f,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x14,0x17,0x14,0x03,0x07,0x19,0x2b,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x01,0x36,0x32,0x1f,0x01,0x16,0x03,0xa5,0x10,0xfe,0x20,0x10,0x2c, -0x10,0xfe,0xea,0x0f,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0x01,0x6e,0x10,0x2c,0x10,0x4c,0x10,0x02,0x16,0x16,0x10,0xfe,0x20,0x0f,0x0f,0x01,0x16,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa5,0x01,0x6f,0x10,0x10,0x4c,0x0f,0x00,0x03,0xff,0xf5,0xff,0xb1,0x03,0xf3,0x03,0x52,0x00,0x0f,0x00,0x21,0x00,0x33,0x00,0x33,0x40,0x30,0x1b,0x11,0x02,0x03, -0x02,0x09,0x01,0x02,0x01,0x00,0x02,0x4c,0x00,0x05,0x00,0x02,0x03,0x05,0x02,0x67,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x67,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x11,0x04,0x4e,0x17,0x38,0x27,0x27,0x26,0x23,0x06,0x07,0x1c,0x2b,0x25,0x35,0x34,0x26,0x2b,0x01,0x22,0x06,0x1d,0x01,0x14,0x16,0x17,0x33,0x32,0x36,0x27,0x13,0x34, -0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x15,0x17,0x14,0x16,0x37,0x33,0x32,0x36,0x03,0x01,0x16,0x07,0x0e,0x01,0x07,0x21,0x22,0x26,0x27,0x26,0x37,0x01,0x3e,0x01,0x32,0x16,0x02,0x3b,0x0a,0x07,0x6c,0x07,0x0a,0x0a,0x07,0x6c,0x07,0x0a,0x01,0x0a,0x05,0x07,0x07,0x7a,0x06,0x08,0x05,0x09,0x0c,0x07,0x67,0x08,0x0c,0x08,0x01,0xac,0x14, -0x15,0x09,0x22,0x12,0xfc,0xa6,0x12,0x22,0x09,0x15,0x14,0x01,0xad,0x09,0x22,0x26,0x22,0x53,0x6a,0x08,0x0a,0x0a,0x08,0x6a,0x08,0x0a,0x01,0x0c,0xd7,0x01,0x01,0x06,0x04,0x06,0x06,0x04,0x08,0xff,0x05,0x08,0x01,0x06,0x02,0x10,0xfc,0xee,0x23,0x23,0x11,0x12,0x01,0x14,0x10,0x23,0x23,0x03,0x12,0x11,0x14,0x14,0x00,0x04,0x00,0x00, -0xff,0x79,0x03,0xd1,0x03,0x3c,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x36,0x40,0x33,0x07,0x01,0x05,0x03,0x01,0x01,0x05,0x01,0x63,0x06,0x01,0x04,0x04,0x00,0x5f,0x09,0x02,0x08,0x03,0x00,0x00,0x12,0x04,0x4e,0x11,0x10,0x01,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x19,0x16,0x10,0x1f,0x11,0x1e,0x09,0x06,0x00,0x0f, -0x01,0x0e,0x0a,0x07,0x16,0x2b,0x13,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x33,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x05,0x21,0x11,0x21,0x01,0x21,0x11,0x21,0x38,0x0d,0x13,0x13,0x0d,0x01,0x7c,0x0d,0x12,0x12,0x0d,0x80,0x0d,0x12,0x12,0x0d,0x01,0x7d, -0x0d,0x12,0x12,0x0d,0xfc,0xa6,0x01,0x3e,0xfe,0xc2,0x01,0xfc,0x01,0x3e,0xfe,0xc2,0x03,0x3b,0x12,0x0d,0xfc,0x7d,0x0d,0x12,0x12,0x0d,0x03,0x83,0x0d,0x12,0x12,0x0d,0xfc,0x7d,0x0d,0x12,0x12,0x0d,0x03,0x83,0x0d,0x12,0x3e,0xfc,0xbb,0x03,0x45,0xfc,0xbb,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x7e,0x03,0xd6,0x03,0x37,0x00,0x0f, -0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x3d,0x40,0x3a,0x00,0x04,0x00,0x01,0x02,0x04,0x01,0x67,0x00,0x02,0x09,0x01,0x07,0x06,0x02,0x07,0x67,0x00,0x06,0x00,0x03,0x06,0x03,0x63,0x08,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x12,0x05,0x4e,0x24,0x24,0x20,0x20,0x24,0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x14,0x35,0x35,0x35, -0x32,0x0a,0x07,0x1b,0x2b,0x01,0x34,0x26,0x23,0x21,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x15,0x34,0x26,0x23,0x21,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x03,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x03,0xd5,0x12,0x0d,0xfc,0x7d,0x0d,0x13,0x13,0x0d,0x03,0x83,0x0d,0x12,0x12,0x0d,0xfc,0x7d,0x0d, -0x13,0x13,0x0d,0x03,0x83,0x0d,0x12,0x3f,0xfc,0xbc,0x03,0x44,0xfc,0xbc,0x03,0x17,0x0d,0x12,0x12,0x0d,0xfe,0x84,0x0d,0x12,0x12,0x0d,0x80,0x0d,0x12,0x12,0x0d,0xfe,0x83,0x0d,0x12,0x12,0x0d,0x03,0x5a,0xfe,0xc2,0x01,0x3e,0xfe,0x04,0xfe,0xc1,0x01,0x3f,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x89,0x03,0xdc,0x03,0x38,0x00,0x02, -0x00,0x10,0x00,0x39,0x00,0x62,0x01,0x0d,0x40,0x0b,0x01,0x01,0x06,0x0a,0x5c,0x33,0x02,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x1c,0x50,0x58,0x40,0x38,0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x02,0x80,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10, -0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x0a,0x4e,0x1b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x3f,0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x02,0x80,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x00,0x03,0x0f,0x01,0x0a,0x06,0x03,0x0a,0x69,0x0d,0x01, -0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61,0x0b,0x01,0x08,0x09,0x08,0x51,0x1b,0x40,0x45,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x00,0x03,0x0f, -0x01,0x0a,0x06,0x03,0x0a,0x69,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61,0x0b,0x01,0x08,0x09,0x08,0x51,0x59,0x59,0x40,0x2d,0x04,0x03,0x00,0x00,0x62,0x60,0x58,0x56,0x55,0x53,0x4a,0x48,0x47,0x45,0x3c,0x3a,0x39,0x37,0x2f,0x2d,0x2c,0x2a,0x1f,0x1d,0x1c, -0x1a,0x13,0x11,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x03,0x10,0x04,0x0f,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x01,0x07,0x27,0x25,0x22,0x06,0x1d,0x01,0x33,0x35,0x21,0x15,0x33,0x35,0x34,0x26,0x23,0x01,0x33,0x32,0x16,0x1d,0x01,0x14,0x1e,0x02,0x3b,0x01,0x15,0x23,0x22,0x07,0x0e,0x02,0x1d,0x01,0x14,0x07,0x0e,0x02,0x2b,0x01,0x35, -0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e,0x01,0x2b,0x01,0x35,0x33,0x32,0x3e,0x02,0x3d,0x01,0x34,0x3e,0x02,0x3b,0x01,0x15,0x23,0x22,0x1d,0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x03,0xdc,0x63,0x64,0xfd,0x31,0x0d,0x13,0x3f,0x02,0xf4,0x3f,0x12, -0x0d,0xfe,0xb9,0x1b,0x47,0x45,0x07,0x16,0x22,0x18,0x10,0x10,0x16,0x16,0x10,0x14,0x07,0x08,0x06,0x21,0x38,0x25,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa8,0x1b,0x47,0x44,0x04,0x04,0x0b,0x09,0x23,0x18,0x10,0x10,0x1c,0x1f,0x15,0x07,0x0f,0x21,0x34,0x27,0x1b,0x15,0x55,0x4d,0x4e,0x54,0x15,0x02,0x85,0xad,0xad,0xb3,0x12,0x0d,0xe7, -0xc7,0x6d,0x8d,0x0d,0x12,0xfe,0xfa,0x42,0x44,0x54,0x14,0x1b,0x13,0x0a,0x33,0x04,0x04,0x12,0x1c,0x14,0x80,0x1d,0x1a,0x19,0x23,0x13,0x34,0x52,0x7f,0x5a,0x0a,0x09,0x5c,0x54,0x54,0xfd,0x8a,0x43,0x43,0x7e,0x0e,0x12,0x0e,0x0a,0x09,0x0b,0x33,0x08,0x13,0x1a,0x14,0x57,0x20,0x30,0x23,0x13,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d, -0x54,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x23,0x00,0x33,0x00,0x43,0x00,0x44,0x40,0x41,0x18,0x01,0x03,0x04,0x13,0x01,0x02,0x00,0x03,0x06,0x01,0x01,0x00,0x03,0x4c,0x05,0x01,0x03,0x02,0x01,0x00,0x01,0x03,0x00,0x67,0x00,0x04,0x00,0x01,0x07,0x04,0x01,0x69,0x00,0x07,0x00,0x08,0x07,0x08,0x63, -0x00,0x06,0x06,0x09,0x5f,0x00,0x09,0x09,0x13,0x06,0x4e,0x42,0x3f,0x35,0x35,0x36,0x14,0x23,0x26,0x14,0x23,0x23,0x0a,0x07,0x1f,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3d,0x01,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x33,0x32,0x16,0x13,0x11, -0x34,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x83,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x47,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24, -0x01,0xd0,0x25,0x34,0x48,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x01,0x94,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x07,0x0a,0xc5,0x08,0x0a,0x0a,0x08,0xc5,0x0a,0xfe,0xff,0x01,0xd0,0x25,0x34,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x01,0xf4,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0, -0x42,0x5e,0x01,0x60,0x00,0x03,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x2d,0x40,0x2a,0x09,0x01,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x00,0x02,0x02,0x05,0x5f,0x00,0x05,0x05,0x13,0x02,0x4e,0x35,0x35,0x35,0x36,0x26,0x23,0x06, -0x07,0x1c,0x2b,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x3d,0x01,0x34,0x36,0x33,0x21,0x32,0x16,0x13,0x11,0x34,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x83,0x0a,0x08,0xfe,0x30,0x08,0x0a,0x0a,0x08,0x01,0xd0,0x08, -0x0a,0x47,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x48,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x01,0x94,0x24,0x08,0x0a,0x0a,0x08,0x24,0x07,0x0a,0x0a,0xfe,0xff,0x01,0xd0,0x25,0x34,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x01,0xf4,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42, -0x5e,0x01,0x60,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x01,0xd4,0x00,0x15,0x00,0x21,0xb1,0x06,0x64,0x44,0x40,0x16,0x07,0x01,0x00,0x02,0x01,0x4c,0x00,0x02,0x00,0x02,0x85,0x01,0x01,0x00,0x00,0x76,0x17,0x14,0x14,0x03,0x07,0x19,0x2b,0xb1,0x06,0x00,0x44,0x25,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x07,0x06,0x22,0x2f,0x01, -0x26,0x34,0x37,0x01,0x36,0x32,0x17,0x01,0x16,0x02,0x58,0x06,0x1c,0x05,0x0e,0x06,0xdc,0xdb,0x05,0x10,0x04,0x1c,0x06,0x06,0x01,0x04,0x05,0x0e,0x06,0x01,0x04,0x06,0xbd,0x07,0x05,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x0e,0x06,0x01,0x04,0x06,0x06,0xfe,0xfc,0x05,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xff,0x89,0x03,0x42, -0x03,0x33,0x00,0x0f,0x00,0x19,0x00,0x33,0x00,0x3f,0x00,0x4b,0x00,0x57,0x00,0x8c,0x40,0x89,0x56,0x01,0x0c,0x0d,0x44,0x01,0x0a,0x0b,0x3e,0x01,0x08,0x09,0x03,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x0d,0x03,0x05,0x0d,0x7e,0x00,0x0b,0x0c,0x0a,0x0c,0x0b,0x0a,0x80,0x00,0x0a,0x09,0x0c,0x0a,0x09,0x7e,0x00,0x09, -0x08,0x0c,0x09,0x08,0x7e,0x10,0x01,0x08,0x07,0x0c,0x08,0x07,0x7e,0x00,0x0d,0x11,0x01,0x0c,0x0b,0x0d,0x0c,0x67,0x00,0x07,0x00,0x01,0x07,0x01,0x64,0x06,0x04,0x0f,0x03,0x03,0x03,0x00,0x5f,0x0e,0x01,0x00,0x00,0x12,0x03,0x4e,0x4e,0x4c,0x36,0x34,0x10,0x10,0x01,0x00,0x54,0x52,0x4c,0x57,0x4e,0x57,0x48,0x45,0x42,0x40,0x3c,0x3a, -0x34,0x3f,0x36,0x3f,0x32,0x2f,0x2a,0x28,0x25,0x22,0x1f,0x1d,0x10,0x19,0x10,0x19,0x16,0x13,0x09,0x06,0x00,0x0f,0x01,0x0e,0x12,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x17,0x15,0x14,0x16,0x3b,0x01,0x32,0x36,0x3d,0x01,0x13,0x11,0x34,0x26,0x07,0x23,0x15,0x14,0x06,0x07, -0x23,0x22,0x26,0x37,0x35,0x23,0x22,0x06,0x17,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x27,0x21,0x22,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x07,0x14,0x27,0x21,0x22,0x26,0x37,0x34,0x33,0x21,0x32,0x15,0x14,0x06,0x27,0x21,0x22,0x35,0x34,0x36,0x17,0x21,0x32,0x16,0x07,0x14,0x02,0xa6,0x41,0x5a,0x01,0x5c,0x40,0xfd,0xf6,0x41,0x5a,0x01, -0x5c,0x40,0x68,0x20,0x15,0xd0,0x16,0x1e,0x9c,0x1e,0x15,0x35,0x3c,0x2c,0xd0,0x2b,0x3e,0x01,0x35,0x15,0x20,0x01,0x1e,0x16,0x02,0x0a,0x15,0x1e,0x68,0xfe,0x60,0x1a,0x0e,0x0c,0x01,0xa0,0x0b,0x10,0x01,0x1a,0xfe,0x60,0x0b,0x10,0x01,0x1a,0x01,0xa0,0x1a,0x0e,0x0c,0xfe,0x60,0x1a,0x0e,0x0c,0x01,0xa0,0x0b,0x10,0x01,0x03,0x33,0x5c, -0x40,0xfd,0x8f,0x41,0x5c,0x5c,0x41,0x02,0x71,0x41,0x5a,0x01,0x68,0x34,0x15,0x20,0x20,0x15,0x34,0xfd,0x5b,0x02,0x71,0x15,0x20,0x01,0x34,0x2b,0x3c,0x01,0x3e,0x2a,0x34,0x1e,0x16,0xfd,0x8f,0x15,0x20,0x20,0x49,0x19,0x0c,0x0e,0x01,0x10,0x0b,0x19,0x9d,0x0e,0x0c,0x19,0x19,0x0b,0x10,0x9d,0x19,0x0b,0x10,0x01,0x0e,0x0c,0x19,0x00, -0x00,0x03,0x00,0x00,0xff,0xf9,0x04,0x29,0x03,0x0b,0x00,0x11,0x00,0x27,0x00,0x45,0x00,0x4b,0x40,0x48,0x24,0x01,0x01,0x00,0x01,0x4c,0x00,0x07,0x04,0x03,0x04,0x07,0x03,0x80,0x00,0x03,0x02,0x04,0x03,0x02,0x7e,0x08,0x09,0x02,0x02,0x00,0x00,0x01,0x02,0x00,0x68,0x00,0x01,0x00,0x05,0x01,0x05,0x63,0x00,0x04,0x04,0x06,0x5f,0x00, -0x06,0x06,0x13,0x04,0x4e,0x13,0x12,0x42,0x40,0x3d,0x3b,0x38,0x35,0x30,0x2d,0x21,0x1e,0x19,0x16,0x12,0x27,0x13,0x27,0x36,0x31,0x0a,0x07,0x18,0x2b,0x01,0x34,0x23,0x21,0x22,0x06,0x0f,0x01,0x06,0x15,0x14,0x33,0x21,0x32,0x36,0x3f,0x01,0x36,0x25,0x21,0x35,0x34,0x26,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x26,0x07,0x23,0x22,0x06, -0x15,0x11,0x37,0x3e,0x01,0x05,0x14,0x0f,0x01,0x0e,0x01,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x17,0x15,0x33,0x32,0x16,0x17,0x16,0x03,0xe2,0x1e,0xfd,0xa1,0x16,0x34,0x0d,0xa4,0x0b,0x1e,0x02,0x5f,0x17,0x32,0x0f,0xa4,0x0a,0xfd,0x83,0x01,0xad,0x20,0x16,0xfe,0xbf,0x17,0x1e,0x01, -0x1e,0x17,0xb3,0x16,0x20,0x8f,0x19,0x50,0x02,0xea,0x19,0xa5,0x18,0x52,0x25,0xfd,0xa1,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x2f,0x34,0x48,0x01,0x6b,0x1e,0x34,0x0b,0x08,0x01,0x4b,0x13,0x18,0x11,0xcb,0x0d,0x09,0x14,0x1a,0x10,0xcb,0x0c,0x64,0x5a,0x16,0x20,0x01,0x20,0x16,0x24,0x16,0x20,0x01,0x1e,0x17,0xfe,0x24,0xaf,0x1e, -0x26,0x5a,0x23,0x20,0xcb,0x1e,0x26,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33,0x12,0x4a,0x33,0x5a,0x1a,0x1b,0x11,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0xa1,0x03,0x0b,0x00,0x17,0x00,0x2c,0x00,0x26,0x40,0x23,0x00,0x05,0x00,0x00,0x02,0x05,0x00,0x67,0x00,0x02,0x00,0x03,0x02,0x03,0x63,0x00,0x01,0x01,0x04,0x5f,0x00,0x04, -0x04,0x13,0x01,0x4e,0x23,0x35,0x35,0x35,0x35,0x33,0x06,0x07,0x1c,0x2b,0x25,0x11,0x34,0x26,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x26,0x07,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x03,0x59,0x1e,0x17,0xfe, -0x77,0x17,0x1e,0x01,0x1e,0x17,0xb3,0x16,0x20,0x20,0x16,0x02,0xa7,0x16,0x20,0x47,0x4a,0x33,0xfd,0x59,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x77,0x33,0x4a,0x76,0x01,0x89,0x16,0x20,0x01,0x20,0x16,0x24,0x16,0x20,0x01,0x1e,0x17,0xfd,0xe8,0x16,0x20,0x20,0x01,0x9f,0xfe,0x77,0x33,0x4a,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33, -0x12,0x4a,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0xb8,0x03,0x94,0x03,0x1f,0x00,0x02,0x00,0x10,0x00,0x39,0x00,0x66,0x01,0x0d,0x40,0x0b,0x60,0x33,0x02,0x07,0x06,0x01,0x01,0x02,0x07,0x02,0x4c,0x4b,0xb0,0x13,0x50,0x58,0x40,0x38,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x00,0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02, -0x06,0x07,0x69,0x0b,0x08,0x12,0x04,0x11,0x05,0x00,0x01,0x09,0x00,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x1b,0x4b,0xb0,0x1b,0x50,0x58,0x40,0x3f,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x12,0x04,0x11,0x03,0x00,0x08,0x01,0x08,0x00,0x01,0x80,0x00, -0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02,0x06,0x07,0x69,0x0b,0x01,0x08,0x00,0x09,0x08,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x1b,0x40,0x45,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x11,0x01,0x00,0x08,0x04,0x08,0x00,0x04,0x80,0x12, -0x01,0x04,0x01,0x08,0x04,0x01,0x7e,0x00,0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02,0x06,0x07,0x69,0x0b,0x01,0x08,0x00,0x09,0x08,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x59,0x59,0x40,0x2d,0x03,0x03,0x00,0x00,0x66,0x64,0x5c,0x5a,0x59, -0x57,0x4a,0x48,0x47,0x45,0x3c,0x3a,0x39,0x37,0x2f,0x2d,0x2c,0x2a,0x20,0x1e,0x1d,0x1b,0x13,0x11,0x03,0x10,0x03,0x10,0x0d,0x0a,0x07,0x06,0x05,0x04,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x25,0x37,0x17,0x07,0x15,0x21,0x35,0x23,0x15,0x14,0x16,0x33,0x21,0x32,0x36,0x3d,0x01,0x01,0x33,0x32,0x16,0x1d,0x01,0x14,0x17,0x1e,0x02, -0x3b,0x01,0x15,0x23,0x22,0x0e,0x02,0x1d,0x01,0x14,0x07,0x0e,0x02,0x2b,0x01,0x35,0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e,0x01,0x2b,0x01,0x35,0x33,0x32,0x3e,0x01,0x37,0x36,0x3d,0x01,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x1d, -0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x02,0xcd,0x64,0x63,0x82,0xfe,0xa7,0x3e,0x12,0x0d,0x01,0x97,0x0d,0x13,0xfe,0xa0,0x1c,0x47,0x44,0x04,0x05,0x11,0x25,0x18,0x10,0x10,0x1c,0x20,0x14,0x07,0x07,0x07,0x22,0x35,0x26,0x1c,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa7,0x1b,0x48,0x44,0x04,0x05,0x09,0x0a,0x23,0x18,0x0f,0x0f,0x1d, -0x20,0x13,0x03,0x04,0x07,0x08,0x10,0x10,0x1b,0x1b,0x27,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0x6a,0xac,0xac,0x09,0x6a,0xb3,0xd3,0x0d,0x12,0x12,0x0d,0x8a,0x02,0xbe,0x42,0x44,0x54,0x14,0x0c,0x10,0x10,0x0c,0x33,0x08,0x14,0x19,0x15,0x80,0x21,0x16,0x19,0x23,0x12,0x33,0x52,0x7f,0x59,0x0b,0x09,0x5c,0x54,0x54,0xfd,0x8b,0x42,0x43, -0x7e,0x14,0x0c,0x10,0x08,0x0b,0x09,0x33,0x09,0x12,0x0e,0x0c,0x15,0x56,0x1a,0x1e,0x18,0x12,0x10,0x0b,0x09,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d,0x54,0x00,0x00,0x00,0x03,0xff,0xfe,0x00,0x00,0x03,0xe8,0x02,0x60,0x00,0x20,0x00,0x24,0x00,0x28,0x00,0x36,0x40,0x33,0x00,0x00,0x08,0x06,0x07,0x03,0x04,0x03,0x00,0x04,0x67,0x05, -0x01,0x03,0x01,0x01,0x03,0x57,0x05,0x01,0x03,0x03,0x01,0x5f,0x02,0x01,0x01,0x03,0x01,0x4f,0x25,0x25,0x21,0x21,0x25,0x28,0x25,0x28,0x27,0x26,0x21,0x24,0x21,0x24,0x14,0x27,0x2a,0x18,0x09,0x07,0x1a,0x2b,0x11,0x26,0x37,0x25,0x36,0x17,0x16,0x0f,0x01,0x21,0x27,0x26,0x37,0x36,0x17,0x05,0x16,0x07,0x03,0x06,0x23,0x21,0x26,0x2f, -0x01,0x26,0x0f,0x01,0x06,0x23,0x21,0x26,0x27,0x37,0x17,0x21,0x37,0x33,0x17,0x21,0x37,0x02,0x0a,0x01,0x68,0x1d,0x0c,0x0b,0x19,0xe3,0x02,0x92,0xe4,0x19,0x0b,0x0e,0x1d,0x01,0x6a,0x0b,0x02,0x1b,0x08,0x19,0xfe,0xc7,0x19,0x06,0x31,0x27,0x35,0x32,0x06,0x1a,0xfe,0xc8,0x1b,0x04,0x27,0x13,0x01,0x04,0x2b,0xdd,0x29,0x01,0x03,0x14, -0x01,0x82,0x0d,0x0c,0xba,0x0b,0x1b,0x21,0x0c,0x68,0x68,0x10,0x1d,0x1b,0x0b,0xba,0x0c,0x0d,0xff,0x00,0x1e,0x02,0x18,0xdf,0x19,0x18,0xe0,0x1a,0x02,0x1c,0xe2,0xbd,0xbd,0xbd,0xbd,0x00,0x00,0x03,0x00,0x00,0xff,0x6a,0x03,0x59,0x03,0x52,0x00,0x13,0x00,0x1a,0x00,0x23,0x00,0x39,0x40,0x36,0x14,0x01,0x02,0x04,0x01,0x4c,0x00,0x01, -0x00,0x04,0x02,0x01,0x04,0x67,0x00,0x02,0x00,0x03,0x05,0x02,0x03,0x67,0x06,0x01,0x05,0x00,0x00,0x05,0x57,0x06,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05,0x00,0x4f,0x1b,0x1b,0x1b,0x23,0x1b,0x23,0x13,0x26,0x14,0x35,0x36,0x07,0x07,0x1b,0x2b,0x01,0x1e,0x01,0x15,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x21, -0x32,0x16,0x17,0x07,0x15,0x33,0x26,0x2f,0x01,0x26,0x13,0x11,0x23,0x22,0x26,0x27,0x35,0x21,0x11,0x03,0x33,0x10,0x16,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x01,0xf4,0x16,0x36,0x0f,0x4a,0xd2,0x05,0x07,0xaf,0x06,0xc6,0xe8,0x17,0x1e,0x01,0xfe,0x53,0x02,0x7e,0x10,0x34,0x18,0xfd,0x7e,0x17,0x1e,0x01,0x20,0x16,0x03,0x7c, -0x17,0x1e,0x01,0x16,0x10,0x26,0xd2,0x11,0x06,0xaf,0x07,0xfc,0xb0,0x02,0x3c,0x20,0x15,0xe9,0xfc,0xa6,0x00,0x01,0x00,0x00,0xff,0xaa,0x03,0x11,0x03,0x13,0x00,0x0b,0x00,0x06,0xb3,0x07,0x02,0x01,0x32,0x2b,0x09,0x01,0x06,0x26,0x35,0x11,0x34,0x36,0x17,0x01,0x16,0x14,0x03,0x04,0xfd,0x1b,0x0d,0x12,0x12,0x0d,0x02,0xe5,0x0d,0x01, -0x4d,0xfe,0x64,0x07,0x0a,0x0f,0x03,0x36,0x0e,0x0c,0x08,0xfe,0x64,0x07,0x14,0x00,0x00,0x01,0xff,0xff,0xff,0xae,0x02,0x3c,0x03,0x0f,0x00,0x1d,0x00,0x1b,0x40,0x18,0x1b,0x1a,0x12,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x13,0x4d,0x00,0x01,0x01,0x11,0x01,0x4e,0x35,0x3d,0x02,0x07,0x18,0x2b,0x17,0x06,0x26,0x37,0x11,0x34,0x36, -0x17,0x01,0x16,0x17,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x07,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x37,0x11,0x06,0x07,0x19,0x0a,0x10,0x01,0x0e,0x0b,0x01,0x8c,0x05,0x03,0x14,0x0f,0x48,0x0e,0x16,0x01,0x14,0x0f,0x48,0x0e,0x16,0x01,0x03,0x05,0x47,0x0b,0x06,0x0f,0x03,0x36,0x0e,0x08,0x0c,0xfe,0x74,0x05,0x05,0x01,0x7a,0x0e,0x16, -0x16,0x0e,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x01,0x7b,0x06,0x05,0x00,0x03,0xff,0xfc,0xff,0x90,0x03,0x9a,0x03,0x2c,0x00,0x08,0x00,0x13,0x00,0x29,0x00,0xa7,0x40,0x0d,0x0c,0x01,0x03,0x02,0x23,0x22,0x18,0x17,0x04,0x05,0x07,0x02,0x4c,0x4b,0xb0,0x24,0x50,0x58,0x40,0x32,0x00,0x03,0x02,0x06,0x02,0x03,0x06,0x80,0x00,0x06,0x07,0x02, -0x06,0x07,0x7e,0x00,0x07,0x05,0x02,0x07,0x05,0x7e,0x00,0x05,0x04,0x02,0x05,0x04,0x7e,0x0a,0x01,0x04,0x00,0x01,0x04,0x01,0x66,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x12,0x02,0x4e,0x1b,0x40,0x39,0x00,0x03,0x02,0x06,0x02,0x03,0x06,0x80,0x00,0x06,0x07,0x02,0x06,0x07,0x7e,0x00,0x07,0x05,0x02,0x07,0x05,0x7e,0x00, -0x05,0x04,0x02,0x05,0x04,0x7e,0x08,0x01,0x00,0x09,0x01,0x02,0x03,0x00,0x02,0x69,0x0a,0x01,0x04,0x01,0x01,0x04,0x59,0x0a,0x01,0x04,0x04,0x01,0x62,0x00,0x01,0x04,0x01,0x52,0x59,0x40,0x1f,0x15,0x14,0x0a,0x09,0x01,0x00,0x26,0x24,0x20,0x1e,0x1b,0x19,0x14,0x29,0x15,0x29,0x10,0x0e,0x09,0x13,0x0a,0x13,0x05,0x04,0x00,0x08,0x01, -0x08,0x0b,0x07,0x16,0x2b,0x01,0x36,0x00,0x12,0x00,0x04,0x00,0x02,0x00,0x17,0x22,0x06,0x15,0x06,0x16,0x33,0x32,0x36,0x35,0x34,0x03,0x32,0x36,0x37,0x27,0x06,0x23,0x22,0x3f,0x01,0x36,0x23,0x22,0x06,0x07,0x17,0x36,0x33,0x32,0x0f,0x01,0x06,0x01,0xc6,0xbe,0x01,0x10,0x06,0xfe,0xf6,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0c,0xf2,0x2a, -0x2e,0x02,0x22,0x20,0x26,0x2e,0xb4,0x1e,0x6c,0x34,0x12,0x30,0x18,0x0e,0x0a,0x2a,0x1a,0x30,0x1e,0x76,0x38,0x10,0x34,0x16,0x0c,0x0c,0x24,0x1a,0x03,0x2a,0x02,0xfe,0xf8,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0a,0x01,0x7c,0x01,0x12,0x96,0x30,0x1a,0x1c,0x20,0x2c,0x20,0x3a,0xfd,0xae,0x34,0x34,0x18,0x24,0x26,0xa0,0x60,0x3a,0x2e,0x1a, -0x22,0x22,0x98,0x68,0x00,0x01,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x31,0x00,0x3b,0x40,0x38,0x2a,0x01,0x03,0x05,0x25,0x1d,0x02,0x04,0x03,0x02,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x03,0x03,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x02,0x02,0x00,0x61,0x00,0x00,0x00, -0x11,0x00,0x4e,0x29,0x35,0x17,0x23,0x17,0x24,0x06,0x07,0x1c,0x2b,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x34,0x3f,0x01,0x36,0x16,0x17,0x1e,0x01,0x33,0x32,0x3e,0x03,0x2e,0x02,0x22,0x06,0x07,0x17,0x16,0x06,0x2b,0x01,0x22,0x26,0x27,0x35,0x34,0x36,0x1f,0x01,0x3e,0x01,0x33,0x32,0x1e,0x02,0x03,0x59,0x44,0x72,0xa0,0x56, -0x60,0xae,0x3c,0x04,0x05,0x4c,0x06,0x11,0x04,0x29,0x76,0x43,0x3a,0x68,0x50,0x2a,0x02,0x2e,0x4c,0x6c,0x6f,0x64,0x28,0x4d,0x11,0x13,0x17,0xfa,0x0f,0x14,0x01,0x2c,0x11,0x48,0x3c,0x9a,0x52,0x57,0x9e,0x74,0x42,0x01,0x5e,0x57,0x9e,0x74,0x44,0x52,0x49,0x06,0x0e,0x04,0x4d,0x05,0x01,0x06,0x35,0x3a,0x2e,0x4c,0x6a,0x74,0x6a,0x4c, -0x2e,0x28,0x25,0x4d,0x10,0x2d,0x16,0x0e,0xfa,0x18,0x13,0x12,0x48,0x39,0x3e,0x44,0x74,0x9e,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf9,0x02,0x83,0x03,0x53,0x00,0x23,0x00,0x3a,0x40,0x37,0x00,0x04,0x05,0x00,0x05,0x04,0x00,0x80,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x02,0x06,0x02,0x00,0x01,0x01,0x00,0x59,0x02,0x06,0x02,0x00, -0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x01,0x00,0x20,0x1f,0x1b,0x18,0x14,0x13,0x10,0x0e,0x09,0x06,0x00,0x23,0x01,0x23,0x07,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x17,0x33,0x35,0x34,0x36,0x1e,0x01,0x07,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x34,0x26,0x22,0x06,0x17,0x15, -0x02,0x4d,0x17,0x1e,0x01,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0x20,0x16,0x11,0x94,0xcc,0x96,0x02,0x14,0x0f,0x24,0x0e,0x16,0x54,0x76,0x54,0x01,0x01,0xa5,0x1e,0x17,0xfe,0xbe,0x16,0x1e,0x01,0x20,0x15,0x01,0x42,0x16,0x20,0x01,0xb3,0x67,0x94,0x02,0x90,0x69,0x0e,0x16,0x16,0x0e,0x3b,0x54,0x54,0x3b,0xb3,0x00,0x00,0x08,0x00,0x00, -0xff,0x9f,0x03,0x8f,0x03,0x1d,0x00,0x04,0x00,0x09,0x00,0x0e,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x2b,0x00,0x33,0x00,0x41,0x40,0x3e,0x21,0x20,0x15,0x14,0x0e,0x01,0x06,0x00,0x4a,0x31,0x30,0x25,0x24,0x10,0x09,0x06,0x01,0x49,0x05,0x04,0x02,0x08,0x04,0x00,0x01,0x00,0x85,0x07,0x06,0x09,0x03,0x04,0x01,0x01,0x76,0x0f,0x0f,0x00, -0x00,0x2d,0x2c,0x29,0x28,0x1d,0x1c,0x19,0x18,0x0f,0x13,0x0f,0x13,0x0b,0x0a,0x06,0x05,0x00,0x04,0x00,0x04,0x0a,0x07,0x16,0x2b,0x01,0x35,0x1e,0x01,0x17,0x07,0x33,0x0e,0x01,0x07,0x03,0x23,0x3e,0x01,0x37,0x11,0x15,0x2e,0x01,0x27,0x01,0x35,0x1e,0x01,0x17,0x23,0x2e,0x01,0x01,0x23,0x3e,0x01,0x37,0x15,0x0e,0x01,0x01,0x15,0x2e, -0x01,0x27,0x33,0x1e,0x01,0x01,0x33,0x0e,0x01,0x07,0x35,0x3e,0x01,0x02,0x09,0x3c,0x56,0x10,0xa2,0xa2,0x10,0x56,0x3c,0x71,0xa2,0x10,0x56,0x3c,0x3c,0x56,0x10,0x01,0x13,0x98,0xda,0x14,0x71,0x12,0x9a,0xfe,0x11,0x71,0x13,0xda,0x99,0x6a,0x98,0x01,0x02,0x9a,0xd8,0x14,0x71,0x12,0x9a,0x01,0xef,0x71,0x15,0xd8,0x99,0x69,0x9a,0x01, -0x97,0xa2,0x10,0x58,0x3a,0x71,0x3b,0x58,0x0f,0x01,0x13,0x3b,0x56,0x11,0xfe,0xed,0xa2,0x10,0x56,0x3c,0x01,0x86,0x71,0x13,0xda,0x99,0x6b,0x98,0xfe,0xfd,0x98,0xda,0x14,0x71,0x12,0x98,0xfe,0x0f,0x72,0x13,0xdc,0x98,0x6b,0x98,0x01,0x03,0x99,0xda,0x14,0x72,0x12,0x98,0x00,0x04,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x03, -0x00,0x21,0x00,0x31,0x00,0x45,0x00,0x53,0x40,0x50,0x2b,0x2a,0x23,0x22,0x04,0x08,0x04,0x01,0x4c,0x0d,0x01,0x04,0x06,0x01,0x08,0x02,0x4b,0x00,0x08,0x04,0x03,0x04,0x08,0x03,0x80,0x00,0x03,0x06,0x04,0x03,0x06,0x7e,0x00,0x06,0x00,0x01,0x00,0x06,0x01,0x68,0x07,0x01,0x04,0x04,0x0a,0x5f,0x00,0x0a,0x0a,0x13,0x4d,0x05,0x02,0x02, -0x00,0x00,0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x40,0x3d,0x38,0x35,0x17,0x26,0x33,0x11,0x13,0x3b,0x11,0x11,0x10,0x0b,0x07,0x1f,0x2b,0x17,0x21,0x35,0x21,0x05,0x33,0x11,0x34,0x26,0x2f,0x01,0x2e,0x01,0x07,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x35,0x23,0x11,0x33,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x07,0x03,0x35,0x34, -0x26,0x2b,0x01,0x22,0x06,0x17,0x15,0x14,0x16,0x37,0x33,0x32,0x36,0x05,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x1f,0x01,0x1e,0x01,0xd6,0x01,0xad,0xfe,0x53,0x01,0xf4,0x48,0x0c,0x05,0x9d,0x05,0x1c,0x08,0x1e,0x17,0xfe,0xbe,0x16,0x1e,0x01,0x48,0x48,0x20,0x15,0x01,0xd1,0x16,0x20,0x01,0xd6, -0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x64,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x02,0x05,0x17,0x36,0x0f,0x9c,0x10,0x16,0x07,0xd6,0xd6,0x01,0xf4,0x08,0x1a,0x07,0x9c,0x06,0x0c,0x01,0xe8,0x16,0x20,0x20,0x16,0xe8,0xfd,0x36,0xe8,0x16,0x20,0x20,0x16,0x01,0x1e,0xb2,0x08,0x0a,0x0a,0x08,0xb2,0x07, -0x0c,0x01,0x0a,0x0a,0xfd,0xfa,0x16,0x20,0x20,0x16,0x02,0xee,0x16,0x20,0x18,0x0e,0x9d,0x0f,0x36,0x00,0x00,0x02,0xff,0xff,0xff,0xb1,0x03,0xe8,0x03,0x0b,0x00,0x03,0x00,0x13,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x03,0x5f,0x00,0x03,0x03,0x13,0x4d,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x35,0x34,0x11,0x10,0x04, -0x07,0x1a,0x2b,0x37,0x21,0x11,0x21,0x25,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x8f,0x02,0xca,0xfd,0x36,0x03,0x59,0x34,0x25,0xfc,0xca,0x24,0x36,0x01,0x34,0x25,0x03,0x36,0x25,0x34,0x40,0x01,0xad,0xc4,0xfd,0x5a,0x25,0x34,0x01,0x36,0x24,0x02,0xa6,0x25,0x34,0x01,0x36,0x00,0x03,0xff,0xfd, -0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x08,0x00,0x15,0x00,0x22,0x00,0x32,0x40,0x2f,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x69,0x06,0x01,0x02,0x02,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x03,0x03,0x04,0x61,0x00,0x04,0x04,0x11,0x04,0x4e,0x0a,0x09,0x20,0x1f,0x1a,0x19,0x10,0x0f,0x09,0x15,0x0a,0x15,0x13,0x12,0x07,0x07,0x18,0x2b, -0x01,0x14,0x06,0x22,0x2e,0x01,0x36,0x32,0x16,0x27,0x22,0x0e,0x02,0x1e,0x01,0x32,0x3e,0x01,0x2e,0x02,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e,0x01,0x02,0x3b,0x52,0x78,0x52,0x02,0x56,0x74,0x56,0x90,0x53,0x8c,0x50,0x02,0x54,0x88,0xaa,0x86,0x56,0x04,0x4e,0x8e,0x01,0x5b,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc, -0xf4,0xba,0x7e,0x01,0x5e,0x3b,0x54,0x54,0x76,0x54,0x54,0xf5,0x52,0x8c,0xa4,0x8c,0x52,0x52,0x8c,0xa4,0x8c,0x52,0xfe,0xd0,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x6a,0x02,0x83,0x03,0x0b,0x00,0x0b,0x00,0x2e,0x00,0x35,0x40,0x32,0x07,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x03,0x02, -0x03,0x86,0x09,0x05,0x02,0x01,0x04,0x01,0x02,0x03,0x01,0x02,0x67,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x00,0x07,0x07,0x13,0x00,0x4e,0x2d,0x2c,0x13,0x33,0x11,0x14,0x22,0x33,0x15,0x15,0x13,0x0a,0x07,0x1f,0x2b,0x01,0x35,0x34,0x26,0x22,0x06,0x1d,0x01,0x14,0x16,0x32,0x36,0x05,0x14,0x06,0x27,0x23,0x03,0x0e,0x01,0x07,0x23,0x22, -0x27,0x03,0x23,0x22,0x26,0x27,0x34,0x36,0x33,0x11,0x22,0x2e,0x01,0x36,0x37,0x21,0x32,0x16,0x14,0x06,0x27,0x11,0x32,0x16,0x01,0x0c,0x0a,0x10,0x0a,0x0a,0x10,0x0a,0x01,0x77,0x16,0x0e,0xef,0x1d,0x01,0x0a,0x06,0x01,0x0f,0x02,0x2b,0xe1,0x0f,0x14,0x01,0x58,0x37,0x1d,0x2a,0x02,0x2e,0x1b,0x01,0x65,0x1d,0x2a,0x2a,0x1d,0x37,0x58, -0x01,0x70,0xfa,0x08,0x0a,0x0a,0x08,0xfa,0x08,0x0a,0x0a,0xbd,0x0e,0x16,0x01,0xfe,0xf2,0x07,0x08,0x01,0x0f,0x01,0x0f,0x14,0x0f,0x45,0x6e,0x01,0x1e,0x2a,0x3a,0x2a,0x01,0x2c,0x38,0x2c,0x01,0xfe,0xe2,0x6e,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5b,0x03,0x0b,0x00,0x24,0x00,0x47,0x00,0x4b,0x40,0x48,0x43,0x25,0x02,0x06,0x09,0x2f, -0x01,0x05,0x06,0x17,0x01,0x03,0x02,0x08,0x01,0x01,0x03,0x04,0x4c,0x00,0x09,0x07,0x01,0x05,0x02,0x09,0x05,0x67,0x04,0x01,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x06,0x06,0x08,0x61,0x00,0x08,0x08,0x13,0x4d,0x00,0x03,0x03,0x00,0x61,0x00,0x00,0x00,0x11,0x00,0x4e,0x46,0x45,0x26,0x25,0x25,0x36,0x25,0x26,0x35,0x14,0x24,0x0a, -0x07,0x1f,0x2b,0x01,0x14,0x15,0x0e,0x01,0x23,0x22,0x26,0x27,0x07,0x06,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x32,0x16,0x06,0x0f,0x01,0x1e,0x01,0x37,0x32,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x32,0x16,0x13,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x36,0x3f,0x01,0x26,0x23,0x22,0x06,0x07,0x06,0x07,0x06,0x2b,0x01,0x22,0x26,0x37, -0x35,0x3e,0x01,0x33,0x32,0x16,0x17,0x37,0x36,0x32,0x16,0x03,0x4b,0x24,0xe4,0x99,0x51,0x98,0x3c,0x48,0x0b,0x1c,0x16,0x16,0x0e,0xfa,0x0e,0x16,0x02,0x09,0x4d,0x28,0x64,0x37,0x4a,0x82,0x27,0x06,0x18,0x04,0x0c,0x6b,0x08,0x0a,0x0e,0x14,0x10,0xfa,0x0e,0x16,0x02,0x09,0x4d,0x52,0x70,0x4b,0x82,0x27,0x06,0x17,0x05,0x0c,0x6f,0x07, -0x0c,0x01,0x24,0xe6,0x99,0x51,0x9a,0x3c,0x48,0x0b,0x1c,0x18,0x01,0x05,0x03,0x01,0x96,0xba,0x3e,0x39,0x48,0x0b,0x16,0x0e,0xfa,0x0e,0x16,0x16,0x1c,0x0b,0x4d,0x24,0x2a,0x01,0x4a,0x3e,0x0a,0x38,0x0d,0x0c,0x01,0xb8,0xfa,0x0e,0x16,0x16,0x1c,0x0b,0x4d,0x4d,0x4a,0x3e,0x0a,0x38,0x0d,0x0c,0x06,0x04,0x96,0xba,0x3e,0x39,0x48,0x0b, -0x16,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x20,0x40,0x1d,0x18,0x10,0x08,0x00,0x04,0x00,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x13,0x4d,0x02,0x01,0x00,0x00,0x11,0x00,0x4e,0x35,0x35,0x35,0x33,0x04,0x07,0x1a,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36, -0x33,0x21,0x32,0x16,0x05,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0x59,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x0f,0x16,0xfe,0x0b,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x0f,0x16,0x02,0xe7,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x0e, -0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x00,0x00,0x01,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x0f,0x00,0x1a,0x40,0x17,0x08,0x00,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x13,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x35,0x33,0x02,0x07,0x18,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36, -0x33,0x21,0x32,0x16,0x03,0x59,0x14,0x10,0xfc,0xef,0x0f,0x14,0x01,0x16,0x0e,0x03,0x11,0x0f,0x16,0x02,0xe7,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x00,0x01,0xff,0xfe,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x30,0x00,0x3a,0x40,0x37,0x2d,0x01,0x01,0x05,0x09,0x01,0x00,0x01,0x02,0x4c,0x00,0x00,0x01,0x03,0x01,0x00, -0x03,0x80,0x00,0x03,0x02,0x01,0x03,0x02,0x7e,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x11,0x04,0x4e,0x27,0x27,0x13,0x27,0x24,0x33,0x06,0x07,0x1c,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3f,0x01,0x26,0x23,0x22,0x0e,0x02,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x3e,0x01, -0x1f,0x01,0x1e,0x01,0x07,0x0e,0x01,0x07,0x22,0x2e,0x02,0x3e,0x03,0x33,0x32,0x16,0x17,0x37,0x36,0x16,0x03,0x59,0x14,0x10,0xfa,0x17,0x13,0x11,0x4d,0x52,0x70,0x3a,0x6a,0x4c,0x2e,0x2e,0x4c,0x6a,0x3a,0x42,0x76,0x29,0x04,0x11,0x06,0x4c,0x05,0x02,0x06,0x3c,0xae,0x5f,0x57,0xa0,0x70,0x48,0x04,0x40,0x78,0x98,0x5b,0x52,0x98,0x3d, -0x48,0x11,0x2c,0x02,0xc3,0xfa,0x0e,0x16,0x2d,0x10,0x4d,0x4d,0x2e,0x4c,0x6a,0x74,0x6a,0x4c,0x2e,0x3a,0x35,0x06,0x01,0x05,0x4d,0x04,0x0e,0x06,0x4a,0x50,0x01,0x44,0x74,0x9e,0xae,0x9e,0x74,0x44,0x3e,0x39,0x48,0x12,0x13,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x01,0xe6,0x00,0x15,0x00,0x19,0x40,0x16,0x0f,0x01,0x00,0x01, -0x01,0x4c,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x14,0x17,0x14,0x03,0x07,0x19,0x2b,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x37,0x36,0x32,0x1f,0x01,0x16,0x02,0x58,0x06,0xfe,0xfc,0x05,0x10,0x04,0xfe,0xfc,0x06,0x06,0x1c,0x05,0x0e,0x06,0xdb,0xdc,0x05,0x10,0x04,0x1c,0x06, -0x01,0xb7,0x07,0x05,0xfe,0xfb,0x05,0x05,0x01,0x05,0x05,0x0e,0x06,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x00,0x00,0x00,0x03,0xff,0xfd,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x0c,0x00,0x1c,0x00,0x2e,0x00,0x41,0x40,0x3e,0x28,0x1e,0x02,0x05,0x04,0x16,0x15,0x0e,0x03,0x03,0x02,0x02,0x4c,0x00,0x05,0x00,0x02,0x03,0x05,0x02, -0x67,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x13,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x11,0x01,0x4e,0x01,0x00,0x2c,0x2a,0x23,0x21,0x1a,0x18,0x12,0x10,0x07,0x06,0x00,0x0c,0x01,0x0c,0x07,0x07,0x16,0x2b,0x01,0x32,0x1e,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x13,0x35,0x34,0x26,0x2b,0x01,0x22,0x06,0x07, -0x15,0x14,0x16,0x17,0x33,0x32,0x36,0x27,0x13,0x34,0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x15,0x13,0x14,0x16,0x3b,0x01,0x32,0x36,0x01,0xad,0x74,0xc6,0x72,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xc1,0x0a,0x07,0x6b,0x08,0x0a,0x01,0x0c,0x07,0x6b,0x07,0x0a,0x01,0x0a,0x06,0x05,0x08,0x7b,0x08,0x05,0x06,0x0a,0x0a,0x09,0x67,0x08, -0x0a,0x03,0x0b,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0xfd,0x48,0x6a,0x08,0x0a,0x0a,0x08,0x6a,0x08,0x0a,0x01,0x0c,0xc7,0x01,0x5a,0x07,0x03,0x05,0x05,0x03,0x07,0xfe,0xa6,0x06,0x08,0x08,0x00,0x00,0x01,0x00,0x00,0xff,0xef,0x02,0xd4,0x02,0x86,0x00,0x24,0x00,0x26,0x40,0x23,0x22,0x19,0x10,0x07,0x04,0x00,0x02,0x01, -0x4c,0x03,0x01,0x02,0x00,0x00,0x02,0x59,0x03,0x01,0x02,0x02,0x00,0x61,0x01,0x01,0x00,0x02,0x00,0x51,0x14,0x1c,0x14,0x14,0x04,0x07,0x1a,0x2b,0x25,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x07,0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x27,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x37,0x36,0x32,0x1f,0x01,0x16,0x14,0x0f,0x01,0x17, -0x16,0x02,0xd4,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa4,0xa4,0x10,0x10,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x0f,0x0f,0xa4,0xa4,0x0f,0x70,0x16,0x10,0x4c,0x0f,0x0f,0xa5,0xa5,0x0f,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa4,0xa4,0x10,0x10,0x4c,0x0f,0x2e, -0x0f,0xa4,0xa4,0x0f,0x00,0x03,0x00,0x00,0xff,0xb1,0x03,0xc5,0x03,0x0b,0x00,0x0c,0x00,0x1c,0x00,0x2c,0x00,0x34,0x40,0x31,0x25,0x1d,0x02,0x04,0x05,0x00,0x01,0x01,0x00,0x02,0x4c,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x67,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e, -0x35,0x35,0x35,0x35,0x24,0x32,0x06,0x07,0x1c,0x2b,0x01,0x34,0x26,0x07,0x23,0x22,0x0e,0x01,0x16,0x17,0x33,0x32,0x36,0x25,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x37,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x02,0x5f,0x14,0x10,0x8e,0x0f,0x14,0x02,0x18, -0x0d,0x8e,0x0f,0x16,0x01,0x41,0x16,0x0e,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x23,0x14,0x0f,0xfc,0xa6,0x0e,0x16,0x01,0x14,0x0f,0x03,0x5a,0x0e,0x16,0x01,0x82,0x0e,0x16,0x01,0x14,0x1e,0x14,0x01,0x16,0x79,0xfd,0xe8,0x0e,0x16,0x16,0x0e,0x02,0x18,0x0e,0x16,0x16,0xec,0x8f,0x0e,0x16,0x16,0x0e,0x8f,0x0e,0x16,0x16, -0x00,0x05,0x00,0x00,0xff,0x88,0x03,0xac,0x03,0x34,0x00,0x43,0x00,0x4c,0x00,0x55,0x00,0x5e,0x00,0x67,0x00,0x61,0x40,0x5e,0x3c,0x33,0x02,0x05,0x0a,0x1a,0x0f,0x02,0x01,0x05,0x2b,0x22,0x19,0x10,0x09,0x00,0x06,0x08,0x01,0x03,0x4c,0x07,0x01,0x05,0x03,0x01,0x01,0x08,0x05,0x01,0x67,0x00,0x0a,0x0f,0x0c,0x02,0x08,0x09,0x0a,0x08, -0x69,0x10,0x0e,0x0d,0x03,0x09,0x04,0x02,0x02,0x00,0x09,0x00,0x65,0x00,0x0b,0x0b,0x06,0x61,0x00,0x06,0x06,0x12,0x0b,0x4e,0x60,0x5f,0x64,0x63,0x5f,0x67,0x60,0x67,0x5d,0x5c,0x59,0x58,0x54,0x53,0x50,0x4f,0x4b,0x4a,0x15,0x36,0x16,0x37,0x18,0x36,0x16,0x36,0x14,0x11,0x07,0x1f,0x2b,0x25,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34, -0x37,0x35,0x34,0x2b,0x01,0x22,0x27,0x15,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x35,0x06,0x2b,0x01,0x22,0x0e,0x01,0x1d,0x01,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x35,0x34,0x36,0x3b,0x01,0x32,0x3d,0x01,0x26,0x35,0x34,0x36,0x32,0x16,0x15,0x14,0x07,0x15,0x14,0x3b,0x01,0x32,0x16,0x15,0x05,0x34,0x26,0x22,0x06, -0x14,0x16,0x32,0x36,0x13,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13,0x34,0x26,0x22,0x06,0x14,0x16,0x32,0x36,0x05,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x03,0x64,0x48,0x46,0x64,0x46,0x48,0x4c,0x64,0x2c,0x22,0x48,0x46,0x64,0x46,0x48,0x1e,0x2e,0x64,0x22,0x26,0x06,0x48,0x46,0x64,0x46,0x48,0x56,0x58,0x64,0x4c,0x48,0x46, -0x64,0x46,0x48,0x4e,0x64,0x56,0x56,0xfd,0x5a,0x2a,0x38,0x28,0x28,0x38,0x2a,0xd4,0x28,0x38,0x2a,0x2a,0x38,0x28,0x8a,0x2a,0x38,0x28,0x28,0x38,0x2a,0x01,0x18,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x70,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x72,0x4e,0x0c,0xcc,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0xcc,0x0c,0x26,0x1c,0x0c,0x72, -0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x72,0x40,0x6c,0x34,0x8c,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c,0x22,0x8c,0x34,0x6c,0x40,0xe2,0x1e,0x28,0x28,0x3a,0x28,0x28,0x02,0xd8,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x26,0x1e,0x28,0x28,0x3a,0x28,0x28,0x28,0x28,0x3a,0x28,0x28,0x3a,0x28,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x59, -0x03,0x0b,0x00,0x23,0x00,0x33,0x00,0x3e,0x40,0x3b,0x0d,0x01,0x00,0x01,0x1f,0x01,0x04,0x03,0x02,0x4c,0x02,0x01,0x00,0x01,0x03,0x01,0x00,0x03,0x80,0x05,0x01,0x03,0x04,0x01,0x03,0x04,0x7e,0x00,0x01,0x01,0x07,0x5f,0x00,0x07,0x07,0x13,0x4d,0x00,0x04,0x04,0x06,0x60,0x00,0x06,0x06,0x11,0x06,0x4e,0x35,0x35,0x23,0x33,0x16,0x23, -0x24,0x23,0x08,0x07,0x1e,0x2b,0x01,0x35,0x34,0x26,0x07,0x23,0x35,0x34,0x26,0x27,0x23,0x22,0x06,0x07,0x15,0x23,0x22,0x06,0x07,0x15,0x14,0x16,0x37,0x33,0x15,0x14,0x16,0x3b,0x01,0x32,0x36,0x37,0x35,0x33,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0xca,0x14,0x0f,0xb3,0x16, -0x0e,0x47,0x0f,0x14,0x01,0xb2,0x0f,0x14,0x01,0x16,0x0e,0xb2,0x16,0x0e,0x47,0x0f,0x14,0x01,0xb3,0x0e,0x16,0x8e,0x5e,0x43,0xfd,0xe9,0x43,0x5e,0x5e,0x43,0x02,0x17,0x43,0x5e,0x01,0x3a,0x48,0x0e,0x16,0x01,0xb3,0x0f,0x14,0x01,0x16,0x0e,0xb3,0x14,0x0f,0x48,0x0e,0x16,0x01,0xb3,0x0e,0x16,0x16,0x0e,0xb3,0x14,0x01,0x3f,0xfd,0xe8, -0x42,0x5e,0x01,0x60,0x41,0x02,0x18,0x42,0x5e,0x01,0x60,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x1f,0x40,0x1c,0x00,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x35,0x35,0x26,0x33,0x04,0x07,0x1a,0x2b,0x01,0x35,0x34,0x26,0x07, -0x21,0x22,0x06,0x07,0x15,0x14,0x16,0x37,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0xca,0x14,0x0f,0xfe,0x0c,0x0f,0x14,0x01,0x16,0x0e,0x01,0xf4,0x0e,0x16,0x8e,0x5e,0x43,0xfd,0xe9,0x43,0x5e,0x5e,0x43,0x02,0x17,0x43,0x5e,0x01,0x3a,0x48,0x0e,0x16,0x01,0x14,0x0f,0x48, -0x0e,0x16,0x01,0x14,0x01,0x3f,0xfd,0xe8,0x42,0x5e,0x01,0x60,0x41,0x02,0x18,0x42,0x5e,0x01,0x60,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x07,0xb3,0xdb,0xee,0x5f,0x0f,0x3c,0xf5,0x00,0x0f,0x03,0xe8,0x00,0x00,0x00,0x00,0xe4,0x2d,0xc8,0x06,0x00,0x00,0x00,0x00,0xe4,0x2d,0xc8,0x07,0xff,0xf5,0xff,0x6a,0x04,0x78,0x03,0x53, -0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x52,0xff,0x6a,0x00,0x00,0x04,0x76,0xff,0xf5,0xff,0xf5,0x04,0x78,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x03,0xe8,0x00,0x00,0x03,0x11,0x00,0x00,0x02,0x80,0x00,0x00,0x03,0xe8,0x00,0x00, -0x04,0x2f,0xff,0xff,0x00,0xf0,0x00,0x00,0x04,0x76,0xff,0xff,0x03,0xe8,0xff,0xff,0x03,0xe8,0x00,0x00,0x02,0x44,0x00,0x00,0x02,0x44,0x00,0x00,0x03,0x59,0xff,0xfd,0x02,0x3b,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0x11,0x00,0x00,0x03,0xac,0x00,0x00,0x03,0xe8,0x00,0x00,0x00,0xdc,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00, -0x02,0x3b,0xff,0xff,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00,0x03,0x98,0xff,0xfc,0x03,0x59,0x00,0x00,0x03,0xca,0x00,0x00,0x04,0x2f,0xff,0xff,0x03,0xa0,0x00,0x00,0x02,0xf8,0x00,0x00,0x03,0xd4,0xff,0xf7,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0xff,0xff,0x02,0x82,0x00,0x00, -0x02,0xda,0x00,0x00,0x04,0x2f,0xff,0xff,0x02,0xf8,0x00,0x00,0x03,0x59,0xff,0xfd,0x03,0x59,0x00,0x00,0x03,0x59,0xff,0xff,0x02,0xda,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x02,0xf8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0xff,0xf5,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0x11,0x00,0x00, -0x03,0x11,0x00,0x00,0x02,0x82,0x00,0x00,0x03,0x42,0x00,0x00,0x04,0x2f,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe7,0xff,0xfe,0x03,0x59,0x00,0x00,0x03,0x11,0x00,0x00,0x02,0x3b,0xff,0xff,0x03,0x98,0xff,0xfc,0x03,0x59,0x00,0x00,0x02,0x82,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0xe8,0xff,0xff, -0x03,0x59,0xff,0xfd,0x02,0x82,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0xff,0xfe,0x02,0x82,0x00,0x00,0x03,0x59,0xff,0xfd,0x03,0x11,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xac,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0xe0,0x01,0x76,0x01,0xf0, -0x02,0x46,0x02,0x9e,0x02,0xc4,0x03,0x10,0x03,0x46,0x03,0x68,0x03,0x8c,0x03,0xb8,0x04,0x42,0x05,0x04,0x05,0x60,0x05,0xf4,0x06,0x18,0x06,0x42,0x06,0x64,0x06,0x8e,0x06,0xc6,0x06,0xfe,0x07,0xa6,0x07,0xf8,0x08,0xa0,0x08,0xf2,0x09,0x20,0x09,0x42,0x09,0x8e,0x09,0xd6,0x0a,0x98,0x0b,0x82,0x0c,0x0e,0x0c,0xfa,0x0d,0x3e,0x0d,0x64, -0x0d,0xc6,0x0e,0x2a,0x0e,0x6c,0x0f,0x1e,0x0f,0xce,0x0f,0xf6,0x10,0x4a,0x11,0x7c,0x11,0x9a,0x11,0xd2,0x12,0x3c,0x12,0x98,0x12,0xf8,0x14,0x00,0x14,0x80,0x14,0xe0,0x15,0x1a,0x15,0xde,0x16,0x6a,0x16,0xc0,0x17,0xce,0x18,0x30,0x18,0x88,0x18,0xa6,0x18,0xe4,0x19,0x80,0x19,0xe8,0x1a,0x3c,0x1a,0xb8,0x1b,0x48,0x1b,0x7c,0x1b,0xd0, -0x1c,0x32,0x1c,0xc0,0x1d,0x04,0x1d,0x2e,0x1d,0x94,0x1d,0xca,0x1e,0x32,0x1e,0x80,0x1e,0xde,0x1f,0x9a,0x20,0x04,0x20,0x48,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x90,0x00,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x7b,0x00,0x8d,0x00,0x00,0x00,0xba,0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0xde,0x00,0x01, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x35,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x00,0x3d,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x08,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x4c,0x00,0x01,0x00,0x00,0x00,0x00, -0x00,0x05,0x00,0x0b,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x08,0x00,0x5f,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x2b,0x00,0x67,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x13,0x00,0x92,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x00,0x00,0x6a,0x00,0xa5,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x10, -0x01,0x0f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e,0x01,0x1f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x10,0x01,0x2d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x10,0x01,0x3d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x16,0x01,0x4d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x10,0x01,0x63,0x00,0x03, -0x00,0x01,0x04,0x09,0x00,0x0a,0x00,0x56,0x01,0x73,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x26,0x01,0xc9,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x43,0x29,0x20,0x32,0x30,0x32,0x35,0x20,0x62,0x79,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x73,0x20,0x40,0x20,0x66, -0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x2e,0x63,0x6f,0x6d,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x52,0x65,0x67,0x75,0x6c,0x61,0x72,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x31,0x2e,0x30,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x47,0x65,0x6e, -0x65,0x72,0x61,0x74,0x65,0x64,0x20,0x62,0x79,0x20,0x73,0x76,0x67,0x32,0x74,0x74,0x66,0x20,0x66,0x72,0x6f,0x6d,0x20,0x46,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x20,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x2e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x2e,0x63,0x6f,0x6d,0x00,0x43,0x00,0x6f,0x00, -0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x28,0x00,0x43,0x00,0x29,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x32,0x00,0x35,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x69,0x00,0x6e,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x61,0x00,0x75,0x00,0x74,0x00, -0x68,0x00,0x6f,0x00,0x72,0x00,0x73,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00, -0x61,0x00,0x72,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x31,0x00,0x2e,0x00,0x30,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00, -0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x47,0x00,0x65,0x00,0x6e,0x00,0x65,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x73,0x00,0x76,0x00,0x67,0x00,0x32,0x00,0x74,0x00,0x74,0x00,0x66,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x46,0x00, -0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x2e,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x2e,0x00, -0x63,0x00,0x6f,0x00,0x6d,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x02,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x01,0x07,0x01,0x08,0x01,0x09,0x01,0x0a,0x01,0x0b,0x01,0x0c, -0x01,0x0d,0x01,0x0e,0x01,0x0f,0x01,0x10,0x01,0x11,0x01,0x12,0x01,0x13,0x01,0x14,0x01,0x15,0x01,0x16,0x01,0x17,0x01,0x18,0x01,0x19,0x01,0x1a,0x01,0x1b,0x01,0x1c,0x01,0x1d,0x01,0x1e,0x01,0x1f,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x24,0x01,0x25,0x01,0x26,0x01,0x27,0x01,0x28,0x01,0x29,0x01,0x2a,0x01,0x2b,0x01,0x2c, -0x01,0x2d,0x01,0x2e,0x01,0x2f,0x01,0x30,0x01,0x31,0x01,0x32,0x01,0x33,0x01,0x34,0x01,0x35,0x01,0x36,0x01,0x37,0x01,0x38,0x01,0x39,0x01,0x3a,0x01,0x3b,0x01,0x3c,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01,0x40,0x01,0x41,0x01,0x42,0x01,0x43,0x01,0x44,0x01,0x45,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x01,0x4b,0x01,0x4c, -0x01,0x4d,0x01,0x4e,0x01,0x4f,0x01,0x50,0x01,0x51,0x01,0x52,0x00,0x0b,0x63,0x68,0x65,0x63,0x6b,0x2d,0x65,0x6d,0x70,0x74,0x79,0x0d,0x66,0x6c,0x6f,0x77,0x2d,0x70,0x61,0x72,0x61,0x6c,0x6c,0x65,0x6c,0x04,0x64,0x6f,0x63,0x73,0x07,0x70,0x69,0x63,0x74,0x75,0x72,0x65,0x09,0x66,0x6c,0x6f,0x77,0x2d,0x6c,0x69,0x6e,0x65,0x0e,0x77, -0x69,0x6e,0x64,0x6f,0x77,0x2d,0x72,0x65,0x73,0x74,0x6f,0x72,0x65,0x0f,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2d,0x6d,0x69,0x6e,0x69,0x6d,0x69,0x7a,0x65,0x04,0x63,0x75,0x62,0x65,0x04,0x70,0x6c,0x75,0x73,0x05,0x6d,0x69,0x6e,0x75,0x73,0x06,0x63,0x69,0x72,0x63,0x6c,0x65,0x08,0x64,0x6f,0x77,0x6e,0x2d,0x64,0x69,0x72,0x05,0x63,0x68, -0x65,0x63,0x6b,0x0b,0x74,0x72,0x61,0x73,0x68,0x2d,0x65,0x6d,0x70,0x74,0x79,0x04,0x75,0x73,0x65,0x72,0x09,0x62,0x72,0x69,0x65,0x66,0x63,0x61,0x73,0x65,0x03,0x64,0x6f,0x74,0x08,0x6c,0x65,0x66,0x74,0x2d,0x64,0x69,0x72,0x09,0x72,0x69,0x67,0x68,0x74,0x2d,0x64,0x69,0x72,0x06,0x75,0x70,0x2d,0x64,0x69,0x72,0x0a,0x61,0x6e,0x67, -0x6c,0x65,0x2d,0x6c,0x65,0x66,0x74,0x0b,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x72,0x69,0x67,0x68,0x74,0x0c,0x68,0x65,0x6c,0x70,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x03,0x74,0x61,0x67,0x04,0x67,0x72,0x69,0x64,0x0b,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x6f,0x70,0x65,0x6e,0x06,0x66,0x6f,0x6c,0x64,0x65,0x72,0x09,0x64,0x6f,0x77, -0x6e,0x2d,0x62,0x6f,0x6c,0x64,0x07,0x70,0x61,0x6c,0x65,0x74,0x74,0x65,0x07,0x64,0x6f,0x63,0x2d,0x69,0x6e,0x76,0x03,0x63,0x6f,0x67,0x02,0x74,0x68,0x0a,0x62,0x69,0x6e,0x6f,0x63,0x75,0x6c,0x61,0x72,0x73,0x04,0x6c,0x69,0x73,0x74,0x04,0x6c,0x6f,0x63,0x6b,0x09,0x6c,0x65,0x66,0x74,0x2d,0x62,0x6f,0x6c,0x64,0x07,0x64,0x65,0x73, -0x6b,0x74,0x6f,0x70,0x06,0x73,0x65,0x61,0x72,0x63,0x68,0x0c,0x63,0x69,0x72,0x63,0x6c,0x65,0x2d,0x65,0x6d,0x70,0x74,0x79,0x06,0x70,0x65,0x6e,0x63,0x69,0x6c,0x03,0x68,0x64,0x64,0x0a,0x72,0x69,0x67,0x68,0x74,0x2d,0x62,0x6f,0x6c,0x64,0x0b,0x63,0x6c,0x6f,0x73,0x65,0x5f,0x70,0x61,0x6e,0x65,0x6c,0x08,0x73,0x74,0x65,0x70,0x69, -0x6e,0x74,0x6f,0x07,0x75,0x70,0x2d,0x62,0x6f,0x6c,0x64,0x02,0x6f,0x6b,0x09,0x61,0x74,0x74,0x65,0x6e,0x74,0x69,0x6f,0x6e,0x10,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x5f,0x73,0x70,0x6c,0x69,0x74,0x0e,0x76,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x5f,0x73,0x70,0x6c,0x69,0x74,0x08,0x73,0x74,0x65,0x70,0x6f,0x76,0x65, -0x72,0x10,0x70,0x6c,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x2d,0x61,0x6c,0x74,0x11,0x6d,0x69,0x6e,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x2d,0x61,0x6c,0x74,0x08,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x75,0x70,0x09,0x63,0x6c,0x69,0x70,0x62,0x6f,0x61,0x72,0x64,0x11,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x6f, -0x70,0x65,0x6e,0x2d,0x65,0x6d,0x70,0x74,0x79,0x0c,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x65,0x6d,0x70,0x74,0x79,0x07,0x73,0x74,0x65,0x70,0x6f,0x75,0x74,0x07,0x67,0x6c,0x61,0x73,0x73,0x65,0x73,0x03,0x64,0x6f,0x63,0x04,0x70,0x6c,0x61,0x79,0x06,0x74,0x6f,0x2d,0x65,0x6e,0x64,0x0c,0x69,0x6e,0x66,0x6f,0x2d,0x63,0x69,0x72,0x63, -0x6c,0x65,0x64,0x03,0x63,0x63,0x77,0x0d,0x6c,0x6f,0x63,0x6b,0x2d,0x6f,0x70,0x65,0x6e,0x2d,0x61,0x6c,0x74,0x06,0x74,0x61,0x72,0x67,0x65,0x74,0x06,0x66,0x6c,0x6f,0x70,0x70,0x79,0x0f,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2d,0x6d,0x61,0x78,0x69,0x6d,0x69,0x7a,0x65,0x0b,0x64,0x6f,0x74,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x03, -0x70,0x69,0x6e,0x09,0x61,0x72,0x72,0x6f,0x77,0x73,0x2d,0x63,0x77,0x05,0x70,0x61,0x75,0x73,0x65,0x04,0x73,0x74,0x6f,0x70,0x02,0x63,0x77,0x0a,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x64,0x6f,0x77,0x6e,0x11,0x61,0x74,0x74,0x65,0x6e,0x74,0x69,0x6f,0x6e,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x06,0x63,0x61,0x6e,0x63,0x65,0x6c,0x03, -0x62,0x6f,0x78,0x09,0x66,0x6c,0x6f,0x77,0x2d,0x74,0x72,0x65,0x65,0x0c,0x70,0x6c,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x0d,0x6d,0x69,0x6e,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x7e,0x01,0x1e,0x00,0x7d,0x00,0x7d,0x01,0x1e,0x03,0x18,0xff,0xb1,0x03,0x38,0x03,0x0b,0xff,0xb1,0xff,0xb1,0x03,0x18,0xff,0xb1,0x03,0x38,0x03,0x0b,0xff,0xb1,0xff,0xb1,0xb0,0x00,0x2c,0x20,0xb0,0x00,0x55,0x58,0x45,0x59,0x20,0x20,0x4b,0xb8,0x00,0x0e,0x51,0x4b,0xb0,0x06, -0x53,0x5a,0x58,0xb0,0x34,0x1b,0xb0,0x28,0x59,0x60,0x66,0x20,0x8a,0x55,0x58,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x62,0x1b,0x21,0x21,0xb0,0x00,0x59,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x01,0x2c,0xb0,0x20,0x60,0x66,0x2d,0xb0,0x02,0x2c,0x23,0x21,0x23,0x21,0x2d,0xb0, -0x03,0x2c,0x20,0x64,0xb3,0x03,0x14,0x15,0x00,0x42,0x43,0xb0,0x13,0x43,0x20,0x60,0x60,0x42,0xb1,0x02,0x14,0x43,0x42,0xb1,0x25,0x03,0x43,0xb0,0x02,0x43,0x54,0x78,0x20,0xb0,0x0c,0x23,0xb0,0x02,0x43,0x43,0x61,0x64,0xb0,0x04,0x50,0x78,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb0,0x21,0x65,0x1c,0x21,0xb0,0x02,0x43,0x43,0xb2,0x0e, -0x15,0x01,0x42,0x1c,0x20,0xb0,0x02,0x43,0x23,0x42,0xb2,0x13,0x01,0x13,0x43,0x60,0x42,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb2,0x16,0x01,0x02,0x43,0x60,0x42,0x2d,0xb0,0x04,0x2c,0xb0,0x03,0x2b,0xb0,0x15,0x43,0x58,0x23,0x21,0x23,0x21,0xb0,0x16,0x43,0x43,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x1b,0x20,0x64,0x20,0xb0,0xc0,0x50, -0xb0,0x04,0x26,0x5a,0xb2,0x28,0x01,0x0d,0x43,0x45,0x63,0x45,0xb0,0x06,0x45,0x58,0x21,0xb0,0x03,0x25,0x59,0x52,0x5b,0x58,0x21,0x23,0x21,0x1b,0x8a,0x58,0x20,0xb0,0x50,0x50,0x58,0x21,0xb0,0x40,0x59,0x1b,0x20,0xb0,0x38,0x50,0x58,0x21,0xb0,0x38,0x59,0x59,0x20,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x61,0x64,0xb0,0x28,0x50,0x58, -0x21,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x20,0xb0,0x30,0x50,0x58,0x21,0xb0,0x30,0x59,0x1b,0x20,0xb0,0xc0,0x50,0x58,0x20,0x66,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x0a,0x50,0x58,0x60,0x1b,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x0a,0x60,0x1b,0x20,0xb0,0x36,0x50,0x58,0x21,0xb0,0x36,0x60,0x1b,0x60,0x59,0x59,0x59,0x1b,0xb0,0x02,0x25, -0xb0,0x0c,0x43,0x63,0xb0,0x00,0x52,0x58,0xb0,0x00,0x4b,0xb0,0x0a,0x50,0x58,0x21,0xb0,0x0c,0x43,0x1b,0x4b,0xb0,0x1e,0x50,0x58,0x21,0xb0,0x1e,0x4b,0x61,0xb8,0x10,0x00,0x63,0xb0,0x0c,0x43,0x63,0xb8,0x05,0x00,0x62,0x59,0x59,0x64,0x61,0x59,0xb0,0x01,0x2b,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x59,0x20,0x64,0xb0,0x16, -0x43,0x23,0x42,0x59,0x2d,0xb0,0x05,0x2c,0x20,0x45,0x20,0xb0,0x04,0x25,0x61,0x64,0x20,0xb0,0x07,0x43,0x50,0x58,0xb0,0x07,0x23,0x42,0xb0,0x08,0x23,0x42,0x1b,0x21,0x21,0x59,0xb0,0x01,0x60,0x2d,0xb0,0x06,0x2c,0x23,0x21,0x23,0x21,0xb0,0x03,0x2b,0x20,0x64,0xb1,0x07,0x62,0x42,0x20,0xb0,0x08,0x23,0x42,0xb0,0x06,0x45,0x58,0x1b, -0xb1,0x01,0x0d,0x43,0x45,0x63,0xb1,0x01,0x0d,0x43,0xb0,0x01,0x60,0x45,0x63,0xb0,0x05,0x2a,0x21,0x20,0xb0,0x08,0x43,0x20,0x8a,0x20,0x8a,0xb0,0x01,0x2b,0xb1,0x30,0x05,0x25,0xb0,0x04,0x26,0x51,0x58,0x60,0x50,0x1b,0x61,0x52,0x59,0x58,0x23,0x59,0x21,0x59,0x20,0xb0,0x40,0x53,0x58,0xb0,0x01,0x2b,0x1b,0x21,0xb0,0x40,0x59,0x23, -0xb0,0x00,0x50,0x58,0x65,0x59,0x2d,0xb0,0x07,0x2c,0xb0,0x09,0x43,0x2b,0xb2,0x00,0x02,0x00,0x43,0x60,0x42,0x2d,0xb0,0x08,0x2c,0xb0,0x09,0x23,0x42,0x23,0x20,0xb0,0x00,0x23,0x42,0x61,0xb0,0x02,0x62,0x66,0xb0,0x01,0x63,0xb0,0x01,0x60,0xb0,0x07,0x2a,0x2d,0xb0,0x09,0x2c,0x20,0x20,0x45,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00, -0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0a,0x2c,0xb2,0x09,0x0e,0x00,0x43,0x45,0x42,0x2a,0x21,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0b,0x2c,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0c,0x2c,0x20,0x20,0x45,0x20,0xb0, -0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a,0x23,0x61,0x20,0x64,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x00,0x1b,0xb0,0x30,0x50,0x58,0xb0,0x20,0x1b,0xb0,0x40,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0d,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01, -0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a,0x23,0x61,0x20,0x64,0xb0,0x24,0x50,0x58,0xb0,0x00,0x1b,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0e,0x2c,0x20,0xb0,0x00,0x23,0x42,0xb3,0x0d,0x0c,0x00,0x03,0x45,0x50,0x58,0x21,0x1b,0x23,0x21, -0x59,0x2a,0x21,0x2d,0xb0,0x0f,0x2c,0xb1,0x02,0x02,0x45,0xb0,0x64,0x61,0x44,0x2d,0xb0,0x10,0x2c,0xb0,0x01,0x60,0x20,0x20,0xb0,0x0f,0x43,0x4a,0xb0,0x00,0x50,0x58,0x20,0xb0,0x0f,0x23,0x42,0x59,0xb0,0x10,0x43,0x4a,0xb0,0x00,0x52,0x58,0x20,0xb0,0x10,0x23,0x42,0x59,0x2d,0xb0,0x11,0x2c,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63, -0x20,0xb8,0x04,0x00,0x63,0x8a,0x23,0x61,0xb0,0x11,0x43,0x60,0x20,0x8a,0x60,0x20,0xb0,0x11,0x23,0x42,0x23,0x2d,0xb0,0x12,0x2c,0x4b,0x54,0x58,0xb1,0x04,0x64,0x44,0x59,0x24,0xb0,0x0d,0x65,0x23,0x78,0x2d,0xb0,0x13,0x2c,0x4b,0x51,0x58,0x4b,0x53,0x58,0xb1,0x04,0x64,0x44,0x59,0x1b,0x21,0x59,0x24,0xb0,0x13,0x65,0x23,0x78,0x2d, -0xb0,0x14,0x2c,0xb1,0x00,0x12,0x43,0x55,0x58,0xb1,0x12,0x12,0x43,0xb0,0x01,0x61,0x42,0xb0,0x11,0x2b,0x59,0xb0,0x00,0x43,0xb0,0x02,0x25,0x42,0xb1,0x0f,0x02,0x25,0x42,0xb1,0x10,0x02,0x25,0x42,0xb0,0x01,0x16,0x23,0x20,0xb0,0x03,0x25,0x50,0x58,0xb1,0x01,0x00,0x43,0x60,0xb0,0x04,0x25,0x42,0x8a,0x8a,0x20,0x8a,0x23,0x61,0xb0, -0x10,0x2a,0x21,0x23,0xb0,0x01,0x61,0x20,0x8a,0x23,0x61,0xb0,0x10,0x2a,0x21,0x1b,0xb1,0x01,0x00,0x43,0x60,0xb0,0x02,0x25,0x42,0xb0,0x02,0x25,0x61,0xb0,0x10,0x2a,0x21,0x59,0xb0,0x0f,0x43,0x47,0xb0,0x10,0x43,0x47,0x60,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x20,0xb0,0x0e,0x43,0x63, -0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb1,0x00,0x00,0x13,0x23,0x44,0xb0,0x01,0x43,0xb0,0x00,0x3e,0xb2,0x01,0x01,0x01,0x43,0x60,0x42,0x2d,0xb0,0x15,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x01,0x60, -0x42,0x20,0x60,0xb7,0x18,0x18,0x01,0x00,0x11,0x00,0x13,0x00,0x42,0x42,0x42,0x8a,0x60,0x20,0xb0,0x14,0x23,0x42,0xb0,0x01,0x61,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x16,0x2c,0xb1,0x00,0x15,0x2b,0x2d,0xb0,0x17,0x2c,0xb1,0x01,0x15,0x2b,0x2d,0xb0,0x18,0x2c,0xb1,0x02,0x15,0x2b,0x2d,0xb0,0x19,0x2c,0xb1, -0x03,0x15,0x2b,0x2d,0xb0,0x1a,0x2c,0xb1,0x04,0x15,0x2b,0x2d,0xb0,0x1b,0x2c,0xb1,0x05,0x15,0x2b,0x2d,0xb0,0x1c,0x2c,0xb1,0x06,0x15,0x2b,0x2d,0xb0,0x1d,0x2c,0xb1,0x07,0x15,0x2b,0x2d,0xb0,0x1e,0x2c,0xb1,0x08,0x15,0x2b,0x2d,0xb0,0x1f,0x2c,0xb1,0x09,0x15,0x2b,0x2d,0xb0,0x2b,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63, -0xb0,0x06,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x5d,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2c,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x16,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x71,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2d,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x26,0x60,0x4b,0x54,0x58, -0x23,0x20,0x2e,0xb0,0x01,0x72,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x20,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x01,0x60,0x42,0x20,0x60,0xb0,0x01,0x61,0xb5,0x18,0x18,0x01,0x00,0x11,0x00,0x42,0x42,0x8a,0x60,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b, -0x1b,0x22,0x59,0x2d,0xb0,0x21,0x2c,0xb1,0x00,0x20,0x2b,0x2d,0xb0,0x22,0x2c,0xb1,0x01,0x20,0x2b,0x2d,0xb0,0x23,0x2c,0xb1,0x02,0x20,0x2b,0x2d,0xb0,0x24,0x2c,0xb1,0x03,0x20,0x2b,0x2d,0xb0,0x25,0x2c,0xb1,0x04,0x20,0x2b,0x2d,0xb0,0x26,0x2c,0xb1,0x05,0x20,0x2b,0x2d,0xb0,0x27,0x2c,0xb1,0x06,0x20,0x2b,0x2d,0xb0,0x28,0x2c,0xb1, -0x07,0x20,0x2b,0x2d,0xb0,0x29,0x2c,0xb1,0x08,0x20,0x2b,0x2d,0xb0,0x2a,0x2c,0xb1,0x09,0x20,0x2b,0x2d,0xb0,0x2e,0x2c,0x20,0x3c,0xb0,0x01,0x60,0x2d,0xb0,0x2f,0x2c,0x20,0x60,0xb0,0x18,0x60,0x20,0x43,0x23,0xb0,0x01,0x60,0x43,0xb0,0x02,0x25,0x61,0xb0,0x01,0x60,0xb0,0x2e,0x2a,0x21,0x2d,0xb0,0x30,0x2c,0xb0,0x2f,0x2b,0xb0,0x2f, -0x2a,0x2d,0xb0,0x31,0x2c,0x20,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x23,0x20,0x8a,0x55,0x58,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01, -0x63,0x60,0x23,0x61,0x38,0x1b,0x21,0x59,0x2d,0xb0,0x32,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x33,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x16,0xb0, -0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x34,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0xb0,0x35,0x2c,0x00,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x45,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62, -0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x00,0x16,0xb4,0x00,0x00,0x00,0x00,0x00,0x44,0x3e,0x23,0x38,0xb1,0x34,0x01,0x15,0x2a,0x21,0x2d,0xb0,0x36,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01, -0x63,0x60,0xb0,0x00,0x43,0x61,0x38,0x2d,0xb0,0x37,0x2c,0x2e,0x17,0x3c,0x2d,0xb0,0x38,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0xb0,0x01,0x43,0x63,0x38,0x2d,0xb0,0x39,0x2c,0xb1,0x02,0x00,0x16,0x25,0x20, -0x2e,0x20,0x47,0xb0,0x00,0x23,0x42,0xb0,0x02,0x25,0x49,0x8a,0x8a,0x47,0x23,0x47,0x23,0x61,0x20,0x58,0x62,0x1b,0x21,0x59,0xb0,0x01,0x23,0x42,0xb2,0x38,0x01,0x01,0x15,0x14,0x2a,0x2d,0xb0,0x3a,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43, -0x2b,0x65,0x8a,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x3b,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3, -0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0xb0,0x0a,0x43,0x20,0x8a,0x23,0x47,0x23,0x47,0x23,0x61,0x23,0x46,0x60,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50, -0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x1b,0x23,0xb0,0x0a,0x43,0x46,0xb0,0x02,0x25,0xb0,0x0a,0x43,0x47,0x23,0x47,0x23,0x61,0x60,0x20,0xb0,0x06,0x43,0xb0, -0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x06,0x43,0x60,0xb0,0x01,0x2b,0xb0,0x05,0x25,0x61,0xb0,0x05,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x04,0x26,0x61,0x20,0xb0,0x04,0x25,0x60,0x64,0x23,0xb0, -0x03,0x25,0x60,0x64,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x59,0x2d,0xb0,0x3c,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0x20,0x20,0xb0,0x05,0x26,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x23,0x3c,0x38,0x2d,0xb0,0x3d,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x23, -0x42,0x20,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x2d,0xb0,0x3e,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x03,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x00,0x54,0x58,0x2e,0x20,0x3c,0x23,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x05,0x25,0xb0,0x04,0x25,0x47, -0x23,0x47,0x23,0x61,0xb0,0x06,0x25,0xb0,0x05,0x25,0x49,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x20,0x58,0x62,0x1b,0x21,0x59,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x23,0x21,0x59,0x2d,0xb0,0x3f,0x2c,0xb0, -0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x43,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0x60,0xb0,0x20,0x60,0x66,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x40,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52, -0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x41,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x42,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c, -0x59,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x43,0x2c,0xb0,0x3a,0x2b,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x44,0x2c, -0xb0,0x3b,0x2b,0x8a,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x8a,0x38,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x45,0x2c,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x26,0x20,0x20,0x20,0x46,0x23, -0x47,0x61,0xb0,0x0c,0x23,0x42,0x2e,0x47,0x23,0x47,0x23,0x61,0xb0,0x0b,0x43,0x2b,0x23,0x20,0x3c,0x20,0x2e,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x46,0x2c,0xb1,0x0a,0x04,0x25,0x42,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b, -0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0x47,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23, -0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0xb0,0x02,0x25,0x46,0x61,0x38,0x23,0x20,0x3c,0x23,0x38,0x1b,0x21,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x21,0x59,0xb1, -0x30,0x01,0x14,0x2b,0x2d,0xb0,0x47,0x2c,0xb1,0x00,0x3a,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x48,0x2c,0xb1,0x00,0x3b,0x2b,0x21,0x23,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x49,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00, -0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4a,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4b,0x2c,0xb1,0x00,0x01,0x14,0x13,0xb0,0x37,0x2a,0x2d,0xb0,0x4c,0x2c,0xb0,0x39,0x2a,0x2d,0xb0,0x4d,0x2c,0xb0,0x00,0x16,0x45,0x23,0x20,0x2e,0x20, -0x46,0x8a,0x23,0x61,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x4e,0x2c,0xb0,0x0a,0x23,0x42,0xb0,0x4d,0x2b,0x2d,0xb0,0x4f,0x2c,0xb2,0x00,0x00,0x46,0x2b,0x2d,0xb0,0x50,0x2c,0xb2,0x00,0x01,0x46,0x2b,0x2d,0xb0,0x51,0x2c,0xb2,0x01,0x00,0x46,0x2b,0x2d,0xb0,0x52,0x2c,0xb2,0x01,0x01,0x46,0x2b,0x2d,0xb0,0x53,0x2c,0xb2,0x00,0x00, -0x47,0x2b,0x2d,0xb0,0x54,0x2c,0xb2,0x00,0x01,0x47,0x2b,0x2d,0xb0,0x55,0x2c,0xb2,0x01,0x00,0x47,0x2b,0x2d,0xb0,0x56,0x2c,0xb2,0x01,0x01,0x47,0x2b,0x2d,0xb0,0x57,0x2c,0xb3,0x00,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x58,0x2c,0xb3,0x00,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x59,0x2c,0xb3,0x01,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x5a,0x2c,0xb3, -0x01,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x5b,0x2c,0xb3,0x00,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5c,0x2c,0xb3,0x00,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5d,0x2c,0xb3,0x01,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5e,0x2c,0xb3,0x01,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5f,0x2c,0xb2,0x00,0x00,0x45,0x2b,0x2d,0xb0,0x60,0x2c,0xb2,0x00,0x01,0x45,0x2b,0x2d, -0xb0,0x61,0x2c,0xb2,0x01,0x00,0x45,0x2b,0x2d,0xb0,0x62,0x2c,0xb2,0x01,0x01,0x45,0x2b,0x2d,0xb0,0x63,0x2c,0xb2,0x00,0x00,0x48,0x2b,0x2d,0xb0,0x64,0x2c,0xb2,0x00,0x01,0x48,0x2b,0x2d,0xb0,0x65,0x2c,0xb2,0x01,0x00,0x48,0x2b,0x2d,0xb0,0x66,0x2c,0xb2,0x01,0x01,0x48,0x2b,0x2d,0xb0,0x67,0x2c,0xb3,0x00,0x00,0x00,0x44,0x2b,0x2d, -0xb0,0x68,0x2c,0xb3,0x00,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x69,0x2c,0xb3,0x01,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x6a,0x2c,0xb3,0x01,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x6b,0x2c,0xb3,0x00,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6c,0x2c,0xb3,0x00,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6d,0x2c,0xb3,0x01,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6e,0x2c,0xb3, -0x01,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6f,0x2c,0xb1,0x00,0x3c,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x70,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x71,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x72,0x2c,0xb0,0x00,0x16,0xb1,0x00,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x73,0x2c,0xb1,0x01,0x3c,0x2b,0xb0, -0x40,0x2b,0x2d,0xb0,0x74,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x75,0x2c,0xb0,0x00,0x16,0xb1,0x01,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x76,0x2c,0xb1,0x00,0x3d,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x77,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x78,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x41,0x2b,0x2d, -0xb0,0x79,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7a,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7b,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x7c,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7d,0x2c,0xb1,0x00,0x3e,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x7e,0x2c,0xb1,0x00,0x3e, -0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7f,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x80,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x81,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x82,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x83,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x84,0x2c,0xb1, -0x00,0x3f,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x85,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x86,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x87,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x88,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x89,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x41,0x2b, -0x2d,0xb0,0x8a,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x8b,0x2c,0xb2,0x0b,0x00,0x03,0x45,0x50,0x58,0xb0,0x06,0x1b,0xb2,0x04,0x02,0x03,0x45,0x58,0x23,0x21,0x1b,0x21,0x59,0x59,0x42,0x2b,0xb0,0x08,0x65,0xb0,0x03,0x24,0x50,0x78,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x2d,0x00,0x4b,0xb8,0x00,0xc8,0x52,0x58,0xb1, -0x01,0x01,0x8e,0x59,0xb0,0x01,0xb9,0x08,0x00,0x08,0x00,0x63,0x70,0xb1,0x00,0x07,0x42,0xb2,0x19,0x01,0x00,0x2a,0xb1,0x00,0x07,0x42,0xb3,0x0d,0x09,0x01,0x0a,0x2a,0xb1,0x00,0x07,0x42,0xb3,0x16,0x06,0x01,0x0a,0x2a,0xb1,0x00,0x08,0x42,0xba,0x03,0x80,0x00,0x01,0x00,0x0b,0x2a,0xb1,0x00,0x09,0x42,0xba,0x00,0x80,0x00,0x01,0x00, -0x0b,0x2a,0xb9,0x00,0x03,0x00,0x00,0x44,0xb1,0x24,0x01,0x88,0x51,0x58,0xb0,0x40,0x88,0x58,0xb9,0x00,0x03,0x00,0x64,0x44,0xb1,0x28,0x01,0x88,0x51,0x58,0xb8,0x08,0x00,0x88,0x58,0xb9,0x00,0x03,0x00,0x00,0x44,0x59,0x1b,0xb1,0x27,0x01,0x88,0x51,0x58,0xba,0x08,0x80,0x00,0x01,0x04,0x40,0x88,0x63,0x54,0x58,0xb9,0x00,0x03,0x00, -0x00,0x44,0x59,0x59,0x59,0x59,0x59,0xb3,0x10,0x06,0x01,0x0e,0x2a,0xb8,0x01,0xff,0x85,0xb0,0x04,0x8d,0xb1,0x02,0x00,0x44,0xb3,0x05,0x64,0x06,0x00,0x44,0x44,0x00, -}; - -read_only global String8 rd_icon_font_bytes = {rd_icon_font_bytes__data, sizeof(rd_icon_font_bytes__data)}; -read_only global U8 rd_default_main_font_bytes__data[] = -{ -0x00,0x01,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x04,0x00,0x80,0x44,0x53,0x49,0x47,0x63,0xbc,0x04,0x48,0x00,0x0c,0x94,0x20,0x00,0x00,0x23,0xa0,0x47,0x44,0x45,0x46,0xb9,0xab,0xc5,0xc1,0x00,0x0c,0xb7,0xc0,0x00,0x00,0x03,0x58,0x47,0x50,0x4f,0x53,0x5b,0xad,0x7e,0xc2,0x00,0x0c,0xbb,0x18,0x00,0x01,0x4c,0xc8,0x47,0x53,0x55,0x42, -0x62,0x6c,0x1b,0xf3,0x00,0x0e,0x07,0xe0,0x00,0x00,0x8d,0x2e,0x4c,0x54,0x53,0x48,0x69,0x2b,0xe4,0xa7,0x00,0x00,0x55,0xe8,0x00,0x00,0x14,0xe4,0x4d,0x45,0x52,0x47,0x00,0x16,0x00,0x01,0x00,0x0e,0x95,0x10,0x00,0x00,0x00,0x0c,0x4f,0x53,0x2f,0x32,0x5f,0x62,0x3d,0x91,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x60,0x56,0x44,0x4d,0x58, -0x76,0x58,0x7d,0xd3,0x00,0x00,0x6a,0xcc,0x00,0x00,0x05,0xe0,0x63,0x6d,0x61,0x70,0x33,0x66,0x8a,0xbf,0x00,0x01,0xd3,0xd8,0x00,0x00,0x1c,0xe4,0x63,0x76,0x74,0x20,0x82,0x03,0x5d,0xdb,0x00,0x02,0x03,0x58,0x00,0x00,0x0a,0x22,0x66,0x70,0x67,0x6d,0x49,0x44,0xd8,0x67,0x00,0x01,0xf0,0xbc,0x00,0x00,0x0a,0x5c,0x67,0x61,0x73,0x70, -0x00,0x1b,0x00,0x23,0x00,0x0c,0x94,0x10,0x00,0x00,0x00,0x10,0x67,0x6c,0x79,0x66,0x2b,0xa3,0xa5,0xc9,0x00,0x02,0x61,0x00,0x00,0x09,0x4b,0xfc,0x68,0x64,0x6d,0x78,0xf0,0x92,0x4d,0xb8,0x00,0x00,0x70,0xac,0x00,0x01,0x63,0x2c,0x68,0x65,0x61,0x64,0xf3,0x00,0x6d,0x9b,0x00,0x00,0x01,0x8c,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61, -0x14,0x0e,0x1d,0xa4,0x00,0x00,0x01,0xc4,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,0x5e,0x06,0x4f,0x2c,0x00,0x00,0x02,0x68,0x00,0x00,0x53,0x80,0x6b,0x65,0x72,0x6e,0xcc,0xce,0xe6,0xda,0x00,0x0b,0xac,0xfc,0x00,0x00,0xc2,0x6a,0x6c,0x6f,0x63,0x61,0x5a,0x85,0x46,0xd0,0x00,0x02,0x0d,0x7c,0x00,0x00,0x53,0x84,0x6d,0x61,0x78,0x70, -0x1a,0xb0,0x0d,0xea,0x00,0x00,0x01,0xe8,0x00,0x00,0x00,0x20,0x6d,0x65,0x74,0x61,0x4d,0x44,0xb7,0xb7,0x00,0x0e,0x95,0x1c,0x00,0x00,0x00,0x80,0x6e,0x61,0x6d,0x65,0x4e,0xc3,0x16,0xb3,0x00,0x0c,0x6f,0x68,0x00,0x00,0x24,0x88,0x70,0x6f,0x73,0x74,0xff,0x51,0x00,0x77,0x00,0x0c,0x93,0xf0,0x00,0x00,0x00,0x20,0x70,0x72,0x65,0x70, -0x93,0xee,0x1e,0xb9,0x00,0x01,0xfb,0x18,0x00,0x00,0x08,0x40,0x00,0x01,0x00,0x00,0x00,0x05,0x9e,0xb8,0xa0,0x2c,0x85,0x86,0x5f,0x0f,0x3c,0xf5,0x00,0x1b,0x08,0x00,0x00,0x00,0x00,0x00,0xaf,0xf5,0x3c,0xaf,0x00,0x00,0x00,0x00,0xd8,0x6f,0x46,0x1c,0xfb,0x6b,0xfc,0xb6,0x0f,0xfe,0x0a,0x63,0x00,0x00,0x00,0x09,0x00,0x01,0x00,0x01, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x08,0xa2,0xfd,0xfe,0x00,0x00,0x0f,0xf4,0xfb,0x6b,0xfa,0xd1,0x0f,0xfe,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xe0,0x00,0x01,0x00,0x00,0x14,0xe0,0x02,0xb9,0x00,0x20,0x00,0xa3,0x00,0x07,0x00,0x02,0x00,0x10,0x00,0x2f,0x00,0x86,0x00,0x00, -0x05,0x0e,0x0a,0x5c,0x00,0x04,0x00,0x01,0x00,0x03,0x04,0x4f,0x01,0x90,0x00,0x05,0x00,0x08,0x05,0x9a,0x05,0x33,0x00,0x00,0x01,0x1b,0x05,0x9a,0x05,0x33,0x00,0x00,0x03,0xd1,0x00,0x66,0x02,0x12,0x08,0x05,0x02,0x0b,0x05,0x02,0x04,0x02,0x04,0x02,0x02,0x03,0xe4,0x00,0x2e,0xff,0xc0,0x00,0xe4,0x7f,0x00,0x00,0x00,0x09,0x00,0x00, -0x00,0x00,0x4d,0x53,0x20,0x20,0x00,0x40,0x00,0x0d,0xff,0xfd,0x05,0xd3,0xfe,0x51,0x01,0x0d,0x08,0xa2,0x02,0x02,0x20,0x00,0x01,0xff,0x00,0x00,0x00,0x00,0x04,0x00,0x05,0x9a,0x00,0x00,0x00,0x20,0x00,0x17,0x05,0x2a,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x46,0x00,0xb4,0x03,0x23,0x00,0xa3, -0x04,0xba,0x00,0x21,0x04,0x50,0x00,0xa2,0x06,0x8c,0x00,0x50,0x06,0x67,0x00,0x77,0x01,0xd7,0x00,0xa3,0x02,0x6a,0x00,0x8c,0x02,0x6a,0x00,0x16,0x03,0x56,0x00,0x4c,0x05,0x79,0x00,0xe8,0x01,0xbc,0x00,0x27,0x03,0x33,0x00,0x90,0x01,0xbc,0x00,0x70,0x03,0x1e,0xff,0xe4,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0xe4,0x04,0x50,0x00,0x6d, -0x04,0x50,0x00,0x7b,0x04,0x50,0x00,0x0e,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x50,0x00,0x62,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x01,0xbc,0x00,0x70,0x01,0xbc,0x00,0x27,0x05,0x79,0x01,0x10,0x05,0x79,0x00,0xe8,0x05,0x79,0x01,0x10,0x03,0x96,0x00,0x83,0x07,0xa4,0x00,0xac,0x05,0x29,0x00,0x16,0x04,0x96,0x00,0xbc, -0x04,0xf4,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x03,0xe8,0x00,0xbc,0x05,0x7d,0x00,0x5e,0x05,0xae,0x00,0xbc,0x02,0x21,0x00,0xbc,0x02,0xdb,0x00,0x14,0x04,0xa4,0x00,0xbc,0x03,0xc4,0x00,0xbc,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x06,0x08,0x00,0x5e,0x04,0x7b,0x00,0xbc,0x06,0x08,0x00,0x5e,0x04,0xc9,0x00,0xbc, -0x04,0x40,0x00,0x79,0x04,0x31,0x00,0x29,0x05,0x7f,0x00,0xaa,0x04,0xf8,0x00,0x12,0x07,0x79,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x04,0x6c,0x00,0x12,0x04,0x90,0x00,0x21,0x02,0x6a,0x00,0xc8,0x03,0x08,0xff,0xe6,0x02,0x6a,0x00,0x35,0x05,0x79,0x00,0xe6,0x03,0x52,0x00,0x00,0x02,0x25,0x00,0x52,0x04,0x12,0x00,0x5a,0x04,0xb4,0x00,0xa6, -0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x60,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x04,0x87,0x00,0xa6,0x01,0xf0,0x00,0x90,0x01,0xf0,0xff,0x3a,0x03,0xfa,0x00,0xa6,0x01,0xf0,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xb0,0x00,0x60,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0x60,0x02,0xc8,0x00,0xa6, -0x03,0x65,0x00,0x68,0x02,0xb6,0x00,0x2b,0x04,0x87,0x00,0x90,0x03,0xd5,0x00,0x0e,0x05,0xc8,0x00,0x18,0x03,0xac,0x00,0x1a,0x03,0xdf,0x00,0x0e,0x03,0x9e,0x00,0x21,0x02,0x6a,0x00,0x5c,0x01,0xea,0x00,0xac,0x02,0x6a,0x00,0x42,0x05,0x79,0x00,0xd1,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x04,0xf4,0x00,0x5e,0x04,0x0c,0x00,0xbc, -0x05,0xfc,0x00,0xbc,0x06,0x08,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x03,0xb2,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x01,0xf0,0x00,0x58,0x01,0xf0,0xff,0xec, -0x01,0xf0,0xff,0xd3,0x01,0xf0,0xff,0xc9,0x04,0x87,0x00,0xa6,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x03,0x00,0x00,0x30,0x03,0x04,0x00,0x6c,0x04,0x50,0x00,0xb8,0x04,0x50,0x00,0x6a, -0x03,0x96,0x00,0x83,0x03,0x40,0x00,0xa4,0x03,0xaa,0x00,0x54,0x04,0x5a,0x00,0xa6,0x03,0x33,0x00,0x90,0x07,0x1f,0x01,0x38,0x07,0x1f,0x00,0xa2,0x06,0x2f,0x00,0x4c,0x02,0x42,0x00,0x87,0x03,0x50,0x00,0x7d,0x05,0x7b,0x00,0xe8,0x06,0xe2,0x00,0x0a,0x06,0x08,0x00,0x5e,0x06,0x89,0x00,0x52,0x05,0x79,0x00,0xe8,0x05,0x7b,0x00,0xe8, -0x05,0x7b,0x00,0xe8,0x04,0x50,0x00,0x44,0x04,0x9e,0x00,0xa6,0x04,0x48,0x00,0x4e,0x04,0xef,0x00,0x33,0x06,0x08,0x00,0xbc,0x04,0x51,0x00,0xbe,0x03,0x23,0x00,0x52,0x03,0x72,0x00,0x4e,0x06,0x0a,0x00,0x64,0x06,0xa8,0x00,0x5a,0x04,0xb0,0x00,0x31,0x03,0x96,0x00,0x8f,0x02,0x31,0x00,0x00,0x02,0x46,0x00,0xb4,0x05,0x79,0x00,0xe8, -0x05,0x33,0x00,0x7b,0x04,0x50,0x00,0x5e,0x05,0x7b,0x00,0xd1,0x05,0x28,0x00,0x33,0x04,0x0c,0x00,0x5c,0x04,0x0c,0x00,0x5a,0x05,0xdd,0x00,0x8c,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x06,0x08,0x00,0x5e,0x07,0x72,0x00,0x5e,0x07,0x6c,0x00,0x60,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x04,0x00,0x6a,0x03,0x04,0x00,0x6e, -0x01,0xd5,0x00,0x6a,0x01,0xd5,0x00,0x6e,0x05,0x79,0x00,0xe8,0x04,0xab,0x00,0x6c,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x01,0x62,0xfe,0xc8,0x04,0x50,0x00,0x66,0x02,0x87,0x00,0x5c,0x02,0x87,0x00,0x5c,0x04,0x70,0x00,0x35,0x04,0x70,0x00,0x35,0x03,0x00,0x00,0x30,0x01,0xbc,0x00,0x70,0x01,0xd5,0x00,0x58,0x03,0x04,0x00,0x58, -0x09,0xae,0x00,0x50,0x05,0x29,0x00,0x16,0x04,0x0c,0x00,0xbc,0x05,0x29,0x00,0x16,0x04,0x0c,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x02,0x21,0x00,0x78,0x02,0x21,0xff,0xfc,0x02,0x21,0xff,0xf1,0x02,0x21,0x00,0x1b,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa, -0x01,0xf0,0x00,0xa6,0x02,0xf8,0x00,0x5c,0x02,0xb2,0x00,0x23,0x02,0x7b,0x00,0x3e,0x02,0x6e,0x00,0x25,0x01,0x9c,0x00,0x6c,0x02,0x3e,0x00,0x52,0x01,0xa4,0x00,0x33,0x02,0x98,0x00,0x40,0x01,0x7b,0x00,0x3e,0x02,0xf8,0x00,0x66,0x03,0xc4,0x00,0x21,0x02,0x31,0x00,0x16,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x90,0x00,0x21, -0x03,0x9e,0x00,0x21,0x01,0xea,0x00,0xac,0x05,0x9c,0x00,0x1c,0x04,0x79,0x00,0x60,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x05,0x79,0x00,0xe8,0x05,0x79,0x01,0x0c,0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x07,0x72,0x00,0x50,0x07,0x40,0x00,0x50,0x07,0x9e,0x00,0x81, -0x03,0xe8,0x00,0x1c,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x02,0x21,0x00,0xad,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x03,0x52,0x00,0x00,0x01,0xbc,0x00,0x70,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16, -0x04,0x12,0x00,0x5a,0x05,0x9c,0x00,0xbc,0x05,0x65,0x00,0x60,0x05,0x9c,0x00,0x1c,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x8e,0x03,0xc4,0x00,0xbc,0x02,0x75,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x02,0x85,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6, -0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0x97,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x03,0x85,0x00,0x2b,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90, -0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x03,0xc6,0x00,0xbc,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x60,0x04,0xea,0x00,0x5a,0x04,0xac,0x00,0x5c,0x03,0x81,0x00,0x52,0x04,0x99,0x00,0x61,0x03,0xe6,0x00,0x22,0x05,0x98,0x00,0x60,0x03,0x52,0x00,0x00, -0x03,0xd7,0x00,0xb4,0x03,0x23,0x00,0x6e,0x08,0xe2,0x00,0xbc,0x04,0xfc,0x00,0xbc,0x03,0xf6,0x00,0x90,0x04,0xd9,0xff,0xd7,0x01,0xd5,0x00,0x82,0x03,0x04,0x00,0x8d,0x06,0x6e,0x00,0x96,0x02,0x96,0x00,0x0e,0x04,0xd5,0x00,0x92,0x02,0xd5,0x00,0x83,0x02,0xd5,0x00,0x83,0x04,0xd5,0x00,0xb2,0x02,0xd5,0x00,0x70,0x05,0x29,0x00,0x16, -0x04,0x12,0x00,0x5a,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e, -0x04,0xb6,0x00,0x60,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0x1c,0x04,0x87,0x00,0x1e,0x02,0x21,0xff,0xd0,0x01,0xf0,0xff,0xad,0x02,0x21,0x00,0x13,0x01,0xf0,0xff,0xef,0x02,0x21,0xff,0xfe,0x01,0xf0,0xff,0xdb,0x02,0x21,0x00,0x50,0x01,0xf0,0x00,0x37,0x02,0xdb,0x00,0x14,0x01,0xf0,0xff,0x3a,0x04,0xa4,0x00,0xbc, -0x03,0xfa,0x00,0xa6,0x03,0xfa,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x27,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68, -0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x01,0xee,0x00,0xa6,0x05,0x29,0x00,0x16, -0x04,0x12,0x00,0x5a,0x06,0xe2,0x00,0x0a,0x06,0xa8,0x00,0x5a,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x31,0x01,0xbc,0x00,0x70,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x01,0xd5,0x00,0x6e,0x03,0x52,0x00,0x00, -0x04,0x50,0x00,0x6a,0x04,0xcd,0x00,0x55,0x07,0x60,0x00,0x50,0x07,0x60,0x00,0x81,0x07,0x6e,0x00,0x8c,0x07,0x23,0x00,0xa2,0x03,0x1e,0x00,0xdb,0x03,0x1e,0x00,0xdb,0x01,0xbc,0x00,0x27,0x02,0x2e,0x00,0xce,0x02,0x2e,0xff,0xda,0x05,0x29,0x00,0x16,0x04,0x90,0xff,0xc5,0x06,0x31,0xff,0xc5,0x03,0x07,0xff,0xc6,0x06,0x68,0xff,0xd1, -0x05,0x56,0xff,0xb3,0x06,0x9c,0xff,0xd1,0x02,0x22,0xff,0xb2,0x05,0x29,0x00,0x16,0x04,0x96,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x04,0x90,0x00,0x21,0x05,0xae,0x00,0xbc,0x02,0x21,0x00,0xbc,0x04,0xa4,0x00,0xbc,0x05,0x08,0x00,0x18,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x04,0x14,0x00,0x3a,0x06,0x08,0x00,0x5e,0x05,0xb4,0x00,0xbc, -0x04,0x7b,0x00,0xbc,0x04,0x21,0x00,0x2e,0x04,0x31,0x00,0x29,0x04,0x6c,0x00,0x12,0x04,0xb8,0x00,0x1a,0x06,0x35,0x00,0x88,0x06,0x0a,0x00,0x64,0x02,0x21,0xff,0xf1,0x04,0x6c,0x00,0x12,0x04,0xea,0x00,0x5a,0x03,0x81,0x00,0x52,0x04,0x9a,0x00,0x82,0x02,0x22,0x00,0xa6,0x04,0x6c,0x00,0x14,0x04,0x62,0x00,0xa7,0x04,0x27,0x00,0x05, -0x03,0x89,0x00,0x4c,0x04,0x9a,0x00,0x82,0x04,0xb1,0x00,0x61,0x02,0x22,0x00,0xa6,0x04,0x31,0x00,0xa6,0x03,0xfc,0xff,0xfe,0x04,0x9e,0x00,0xa7,0x04,0x35,0x00,0x0c,0x03,0x8f,0x00,0x4d,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0xa1,0x03,0xaf,0x00,0x57,0x04,0x6c,0x00,0x14,0x04,0x4e,0x00,0x0c,0x06,0x00,0x00,0x98,0x06,0x77,0x00,0x77, -0x02,0x22,0xff,0xed,0x04,0x6c,0x00,0x14,0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x14,0x06,0x77,0x00,0x77,0x04,0x0c,0x00,0xbc,0x05,0x9a,0x00,0x29,0x03,0xc6,0x00,0xbc,0x04,0xf0,0x00,0x5e,0x04,0x40,0x00,0x79,0x02,0x21,0xff,0xf1,0x07,0xd9,0x00,0x10,0x07,0xde,0x00,0xbc,0x05,0xc8,0x00,0x29,0x04,0xa4,0x00,0xbc,0x04,0x8a,0x00,0x3c, -0x05,0xab,0x00,0xbc,0x05,0x29,0x00,0x16,0x04,0x93,0x00,0xbc,0x04,0x96,0x00,0xbc,0x03,0xc6,0x00,0xbc,0x05,0x8c,0x00,0x0f,0x04,0x0c,0x00,0xbc,0x06,0xef,0xff,0xea,0x04,0x52,0x00,0x60,0x05,0xfe,0x00,0xbc,0x05,0xfe,0x00,0xbc,0x04,0xa4,0x00,0xbc,0x05,0x62,0x00,0x10,0x07,0x2f,0x00,0xbc,0x05,0xae,0x00,0xbc,0x06,0x08,0x00,0x5e, -0x05,0xb4,0x00,0xbc,0x04,0x7b,0x00,0xbc,0x04,0xf4,0x00,0x5e,0x04,0x31,0x00,0x29,0x04,0x8a,0x00,0x3c,0x05,0xd0,0x00,0x5e,0x04,0xb8,0x00,0x1a,0x05,0xf0,0x00,0xbc,0x05,0x4a,0x00,0xa6,0x07,0x98,0x00,0xbc,0x07,0xd7,0x00,0xbc,0x05,0xa5,0x00,0x29,0x06,0x44,0x00,0xbc,0x04,0x9c,0x00,0xbc,0x04,0xee,0x00,0x68,0x08,0x26,0x00,0xbc, -0x04,0xba,0x00,0x3d,0x04,0x12,0x00,0x5a,0x04,0xa2,0x00,0x77,0x04,0x3d,0x00,0xa6,0x03,0x10,0x00,0xa6,0x04,0x60,0x00,0x12,0x04,0x2f,0x00,0x60,0x05,0xf8,0x00,0x04,0x03,0x91,0x00,0x50,0x04,0xa6,0x00,0xa6,0x04,0xa6,0x00,0xa6,0x03,0xfa,0x00,0xa6,0x04,0x37,0x00,0x10,0x05,0x9e,0x00,0xa6,0x04,0x9e,0x00,0xa6,0x04,0xb0,0x00,0x60, -0x04,0x9e,0x00,0xa6,0x04,0xb4,0x00,0xa6,0x03,0xb2,0x00,0x60,0x03,0x48,0x00,0x1e,0x03,0xdf,0x00,0x0e,0x05,0x7d,0x00,0x60,0x03,0xac,0x00,0x1a,0x04,0xcd,0x00,0xa6,0x04,0x85,0x00,0x98,0x06,0x66,0x00,0xa6,0x06,0x98,0x00,0xa6,0x04,0xba,0x00,0x1e,0x05,0xad,0x00,0xa6,0x04,0x08,0x00,0xa6,0x03,0xb2,0x00,0x5a,0x06,0x81,0x00,0xa6, -0x04,0x06,0x00,0x3e,0x04,0x2f,0x00,0x60,0x04,0x9e,0x00,0x27,0x03,0x10,0x00,0xa6,0x03,0xb2,0x00,0x60,0x03,0x65,0x00,0x68,0x01,0xf0,0xff,0xd3,0x06,0x52,0x00,0x10,0x06,0x74,0x00,0xa6,0x04,0x8a,0x00,0x27,0x03,0xfa,0x00,0xa6,0x03,0xdf,0x00,0x0e,0x04,0x9e,0x00,0xa6,0x03,0xc0,0x00,0xbc,0x03,0x20,0x00,0xa6,0x08,0x00,0x00,0x00, -0x08,0xfa,0x00,0xbc,0x05,0x04,0x00,0x11,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x01,0xf0,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x72,0x00,0x64,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x02,0x6e,0x00,0xab,0x02,0xaa,0x00,0xf2, -0x02,0x25,0x00,0x66,0x02,0x25,0x00,0x64,0x03,0xd3,0x00,0x42,0x03,0xd3,0x00,0x42,0x03,0xd3,0x00,0x6c,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0x25,0x02,0x6e,0x00,0x38,0x02,0x6e,0x00,0x25,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0xab,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0x25,0x02,0x6e,0x00,0x38,0x02,0x6e,0x00,0x25,0x03,0xd3,0x00,0xa9, -0x03,0xd3,0x00,0x6c,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0xff,0xe8,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16, -0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc, -0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0x0e,0x04,0x2f,0x00,0x0c,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x02,0x21,0x00,0x9a,0x01,0xf0,0x00,0x88,0x02,0x21,0x00,0xb2,0x01,0xf0,0x00,0x90,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e, -0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x30,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e, -0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa, -0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x02,0x21,0x00,0xbc, -0x02,0xdb,0x00,0x14,0x01,0xf0,0x00,0x90,0x01,0xf0,0xff,0x3a,0x04,0x1e,0x00,0x29,0x03,0x48,0x00,0x1e,0x07,0x48,0xff,0xea,0x06,0x3e,0x00,0x04,0x04,0xe6,0x00,0xbc,0x04,0x3e,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x03,0xf6,0x00,0xa6,0x05,0xf0,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12, -0x03,0xdf,0x00,0x0e,0x05,0x04,0x00,0x1a,0x03,0xf2,0x00,0x1a,0x05,0x3e,0x00,0xa6,0x04,0x85,0x00,0x98,0x05,0x4a,0x00,0xa6,0x04,0x87,0x00,0xa6,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x03,0x50,0x00,0x7d, -0x03,0x50,0x00,0x7d,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x02,0x25,0x00,0x14,0x02,0x25,0x00,0x14,0x02,0x6e,0x00,0x1e,0x02,0x6e,0x00,0x1e,0x02,0x6e,0x00,0x14,0x02,0x6e,0x00,0x14,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x04,0x96,0x00,0xbc, -0x04,0xb4,0x00,0xa6,0x04,0x96,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x96,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc, -0x04,0xb6,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x03,0xe8,0x00,0xbc,0x02,0x81,0x00,0x35,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0xae,0x00,0xbc, -0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xa0,0x04,0x87,0x00,0x8c,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x02,0x21,0xff,0xcf,0x01,0xf0,0xff,0xb9,0x02,0x21,0xff,0xf2,0x01,0xf0,0xff,0xd4,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0xbc, -0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x95,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xfa,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xfc,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xdf,0x07,0x2f,0x00,0xbc,0x06,0xe4,0x00,0xa6,0x07,0x2f,0x00,0xbc,0x06,0xe4,0x00,0xa6,0x07,0x2f,0x00,0xbc, -0x06,0xe4,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e, -0x04,0xb0,0x00,0x60,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79, -0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x7f,0x00,0xaa, -0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0xf8,0x00,0x12,0x03,0xd5,0x00,0x0e,0x04,0xf8,0x00,0x12,0x03,0xd5,0x00,0x0e,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a, -0x05,0xc8,0x00,0x18,0x04,0xb8,0x00,0x1a,0x03,0xac,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x03,0xac,0x00,0x1a,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x87,0x00,0xa6,0x02,0xb6,0x00,0x2b,0x05,0xc8,0x00,0x18, -0x03,0xdf,0x00,0x0e,0x04,0x12,0x00,0x5a,0x01,0xee,0x00,0x4e,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0xee,0xff,0xbc,0x05,0xee,0xff,0xbe,0x05,0xee,0xff,0xbc, -0x05,0xee,0xff,0xbe,0x05,0xee,0xff,0xbc,0x05,0xee,0xff,0xbc,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x04,0x90,0xff,0xbd,0x04,0x90,0xff,0xbe,0x05,0xb2,0xff,0xbc,0x05,0xb2,0xff,0xc0,0x05,0xb2,0xff,0xbd,0x05,0xb2,0xff,0xbf,0x04,0x9a,0x00,0x82, -0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x06,0x30,0xff,0xbd,0x06,0x30,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xc0,0x07,0x56,0xff,0xbd,0x07,0x56,0xff,0xbf,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbc,0x02,0x22,0x00,0x94, -0x02,0x22,0x00,0x6e,0x02,0x22,0xff,0xdd,0x02,0x22,0xff,0xb3,0x02,0x22,0x00,0x1b,0x02,0x22,0xff,0xea,0x02,0x22,0xff,0xc0,0x02,0x22,0xff,0xc0,0x03,0x06,0xff,0xbd,0x03,0x06,0xff,0xbe,0x03,0xf8,0xff,0xbd,0x03,0xf8,0xff,0xc0,0x04,0x2a,0xff,0xbc,0x04,0x34,0xff,0xbf,0x04,0x2a,0xff,0xbd,0x04,0x2a,0xff,0xbd,0x04,0xb0,0x00,0x60, -0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x06,0x6e,0xff,0xbd,0x06,0x6e,0xff,0xbe,0x07,0xa0,0xff,0xbc,0x07,0xa0,0xff,0xbe,0x07,0xa0,0xff,0xbc,0x07,0xa0,0xff,0xbe,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14, -0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x05,0x56,0xff,0xbe,0x06,0x8c,0xff,0xc0,0x06,0x8c,0xff,0xbf,0x06,0x8c,0xff,0xbc,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xbd, -0x06,0x9c,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xc0,0x07,0xa6,0xff,0xbd,0x07,0xa6,0xff,0xbf,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbc,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x02,0x22,0x00,0x34,0x02,0x22,0x00,0xa6,0x04,0xb0,0x00,0x60, -0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0xee,0xff,0xbd, -0x05,0xee,0xff,0xc1,0x05,0xee,0xff,0xbd,0x05,0xee,0xff,0xbf,0x05,0xee,0xff,0xbd,0x05,0xee,0xff,0xbc,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x06,0x31,0xff,0xbc,0x06,0x30,0xff,0xbe,0x07,0x56,0xff,0xbc, -0x07,0x56,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbc,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xbc,0x06,0x9c,0xff,0xbe,0x07,0xa6,0xff,0xbc, -0x07,0xa6,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbc,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0x29,0xff,0xfb,0x05,0x29,0x00,0x16, -0x05,0x29,0x00,0x16,0x04,0xb0,0x01,0xe4,0x04,0xb0,0x01,0xba,0x04,0xb0,0x01,0xe4,0x04,0xb0,0x01,0x40,0x04,0xb0,0x01,0x33,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x90,0xff,0xac,0x04,0x90,0xff,0xc4,0x06,0x31,0xff,0xac,0x06,0x31,0xff,0xc4,0x05,0xae,0x00,0xbc, -0x04,0xb0,0x01,0x4a,0x04,0xb0,0x01,0x42,0x04,0xb0,0x01,0x33,0x02,0x22,0xff,0xec,0x02,0x22,0xff,0xfa,0x02,0x22,0xff,0xb2,0x02,0x22,0xff,0xb2,0x02,0x22,0xff,0xdf,0x02,0x22,0xff,0xd5,0x02,0x21,0xff,0xfe,0x02,0x21,0x00,0x12,0x02,0xe8,0xff,0xae,0x03,0x07,0xff,0xc6,0x04,0xb0,0x01,0x44,0x04,0xb0,0x01,0x38,0x04,0xb0,0x01,0x33, -0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0xb0,0x00,0xa1,0x04,0xb0,0x00,0xa1,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x12,0x04,0x6c,0x00,0x12,0x05,0x56,0xff,0x96,0x05,0x56,0xff,0xb2,0x05,0x04,0xff,0xbe,0x04,0xb0,0x01,0x02,0x04,0xb0,0x01,0x02,0x04,0xb0,0x01,0xd1, -0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xac,0x06,0x9c,0xff,0xd1,0x06,0xb3,0xff,0xac,0x06,0x9c,0xff,0xd1,0x06,0x0a,0x00,0x64,0x04,0xb0,0x01,0xd1,0x04,0xb0,0x01,0xe2,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x02,0x00,0x00,0xfe,0x58, -0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x9e,0x00,0x00,0xfe,0xdd,0x00,0x00,0xff,0x33,0x00,0x00,0xfe,0xdd,0x00,0x00,0xfe,0xe8,0x00,0x00,0xff,0xcb,0x00,0x00,0xff,0x58,0x00,0x00,0xfe,0xdd,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x8c,0x00,0x00,0xff,0x8c,0x00,0x00,0xff,0x8c,0x00,0x00,0x00,0x2f,0x00,0x00,0xff,0x3e, -0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x48,0x00,0x00,0xff,0x48,0x00,0x00,0xff,0x16,0x00,0x00,0xff,0x52,0x00,0x00,0xff,0xa6,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x03,0x00,0x00,0xff,0x1a,0x00,0x00,0xff,0x1a,0x00,0x00,0xfe,0xdd,0x00,0x00,0xff,0x35,0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x56, -0x00,0x00,0xff,0x5d,0x00,0x00,0xff,0xcb,0x00,0x00,0xfe,0x9c,0x00,0x00,0xfe,0xb1,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xe9,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x05,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x02,0x00,0x00,0xfe,0x58,0x00,0x00,0xfe,0x66, -0x00,0x00,0xfe,0x70,0x00,0x00,0xff,0xa6,0x00,0x00,0xfe,0x9c,0x00,0x00,0xff,0x44,0x00,0x00,0xfe,0xa5,0x00,0x00,0xff,0x30,0x00,0x00,0xff,0x9e,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0x70,0x00,0x00,0x00,0x0a,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xaa,0x00,0x00,0xff,0x64,0x00,0x00,0xfe,0x9c,0x00,0x00,0xfe,0x2a, -0x00,0x00,0xff,0x58,0x00,0x00,0xff,0x4c,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xa8,0x00,0x00,0xff,0x5c,0x00,0x00,0xfd,0x0e,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfd,0xaf,0x04,0xb4,0x00,0x21,0x04,0xe8,0xff,0xac,0x04,0x93,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x9e,0x00,0x33,0x04,0xb4,0x00,0x21, -0x04,0xf6,0x00,0x6a,0x04,0xf6,0x00,0x5e,0x03,0xba,0x00,0x60,0x05,0x9c,0x00,0x1c,0x05,0xee,0xff,0xac,0x04,0x94,0x00,0x5c,0x04,0xb4,0x00,0x60,0x04,0xbc,0x00,0x60,0x04,0x0e,0x00,0x5a,0x04,0x54,0x00,0x70,0x03,0xe8,0xff,0x9a,0x05,0x89,0x00,0x5e,0x04,0xf8,0x00,0x12,0x06,0xfe,0x00,0xa6,0x02,0x4e,0x00,0xb8,0x02,0x3a,0x00,0x29, -0x04,0xa4,0x00,0xbc,0x03,0xfc,0x00,0xa6,0x01,0xf0,0x00,0x14,0x03,0xfc,0xff,0xfe,0x07,0x23,0x00,0xb8,0x05,0xfc,0xff,0x9a,0x04,0x9a,0x00,0x83,0x06,0x08,0x00,0x5e,0x07,0xc0,0x00,0x5e,0x06,0x52,0x00,0x60,0x04,0xcf,0xff,0xac,0x04,0xb4,0x00,0xa6,0x04,0x9c,0x00,0xbc,0x04,0x40,0x00,0x62,0x03,0x65,0x00,0x56,0x04,0x21,0x00,0x2d, -0x02,0x5e,0xff,0x83,0x02,0xb8,0x00,0x2b,0x04,0x33,0xff,0xcd,0x02,0xb8,0x00,0x2b,0x04,0x33,0x00,0x27,0x06,0x0a,0x00,0x62,0x05,0xb2,0x00,0xb8,0x04,0x8e,0x00,0x0f,0x04,0x23,0x00,0x0e,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0xe2,0x00,0x0a,0x04,0xe2,0x00,0x5e,0x03,0x89,0x00,0x1e,0x03,0x46,0x00,0x0a,0x04,0x50,0x00,0x60, -0x04,0x50,0x00,0x74,0x03,0x0a,0x00,0x48,0x03,0x27,0x00,0x1e,0x04,0x5e,0x00,0xa6,0x01,0xea,0x00,0xac,0x03,0x10,0x00,0xac,0x03,0xa6,0x00,0x33,0x02,0x46,0x00,0xb4,0x09,0xe8,0x00,0xbc,0x09,0x1c,0x00,0xbc,0x08,0x33,0x00,0x60,0x06,0xd9,0x00,0xbc,0x05,0xc2,0x00,0xbc,0x04,0x01,0x00,0xa6,0x08,0x94,0x00,0xbc,0x07,0xbe,0x00,0xbc, -0x06,0x77,0x00,0xa6,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x02,0x21,0xff,0xf7,0x01,0xf0,0xff,0xdf,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa, -0x04,0x87,0x00,0x90,0x04,0x2f,0x00,0x52,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x06,0xe2,0x00,0x0a,0x06,0xa0,0x00,0x52,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60, -0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xe2,0x00,0x0a,0x03,0x89,0xff,0xdd,0x01,0xf0,0xff,0x3a,0x09,0xe8,0x00,0xbc,0x09,0x1c,0x00,0xbc,0x08,0x33,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0xfe,0x00,0xbc,0x05,0x83,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52, -0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x04,0x0c,0x00,0x9e,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x02,0x21,0xff,0x86,0x01,0xf0,0xff,0x6e,0x02,0x21,0xff,0xf8,0x01,0xf0,0xff,0xe6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x9a,0x00,0xa0,0x02,0xc8,0x00,0x04, -0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0x9a,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0x08,0x00,0x10,0x03,0x70,0x00,0x1e,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xdf,0x00,0xbc,0x04,0xb8,0x00,0x3e,0x04,0x89,0x00,0x48,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x05,0x29,0x00,0x16, -0x04,0x0a,0x00,0x52,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0xb0,0x01,0x33,0x04,0x0a,0x01,0x08,0x04,0x87,0x01,0x1c,0x04,0x87,0x01,0x1c,0x04,0xb0,0x01,0x23, -0x04,0x0a,0x00,0x90,0x04,0xb6,0x00,0x60,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0xa6,0x03,0xba,0x00,0x5a,0x03,0xba,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x52,0x04,0xe6,0x00,0x50,0x03,0x4e,0x00,0x60,0x03,0x4e,0x00,0x5a,0x04,0x0e,0x00,0x5a,0x04,0x68,0x00,0x60,0x02,0x38,0xff,0x81,0x04,0xb6,0x00,0x60, -0x04,0xb6,0x00,0x60,0x04,0x3c,0x00,0x60,0x03,0xd5,0x00,0x0e,0x03,0xa8,0x00,0x0a,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0xa6,0x02,0x18,0x00,0x0a,0x02,0x3a,0x00,0x94,0x02,0x90,0x00,0x4c,0x02,0x3e,0xff,0xec,0x03,0x02,0xff,0xec,0x01,0xee,0x00,0xa6,0x04,0xd3,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x06,0xe4,0x00,0xa6, -0x06,0xe4,0x00,0xa6,0x04,0x72,0xff,0x96,0x04,0x72,0x00,0xa6,0x04,0xb0,0x00,0xa6,0x04,0xb0,0x00,0x60,0x05,0x96,0x00,0x60,0x05,0xc4,0x00,0x60,0x05,0x1a,0x00,0x60,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0xa6,0x02,0xc8,0x00,0xa6,0x02,0xae,0x00,0x90,0x02,0xae,0x00,0x0c,0x03,0xa2,0x00,0xa6, -0x03,0xa2,0x00,0xa6,0x03,0x2f,0x00,0x68,0x01,0xfa,0xff,0x92,0x02,0x10,0xff,0x9e,0x02,0x4e,0xff,0xa6,0x02,0x44,0xff,0x44,0x02,0xb8,0x00,0x38,0x02,0xb8,0x00,0x2b,0x04,0xcb,0x00,0x21,0x04,0xc2,0x00,0x60,0x04,0x77,0x00,0x90,0x03,0xd5,0x00,0x0c,0x05,0xc8,0x00,0x18,0x03,0xdf,0x00,0x0c,0x03,0x56,0x00,0x0a,0x03,0x9e,0x00,0x21, -0x04,0x18,0x00,0x21,0x03,0x89,0xff,0xdd,0x03,0x89,0xff,0xea,0x02,0xec,0x00,0x1c,0x02,0xec,0x00,0x04,0x02,0xec,0x00,0x00,0x03,0xba,0x00,0x60,0x04,0xf2,0x00,0x60,0x03,0xdf,0x00,0xa6,0x04,0x62,0x00,0x5c,0x04,0x3c,0x00,0x60,0x04,0x87,0x00,0xa6,0x01,0xee,0xff,0x18,0x03,0xfc,0x00,0x04,0x03,0x14,0x00,0xa6,0x04,0xb6,0x00,0x60, -0x02,0xec,0x00,0x1c,0x02,0xec,0x00,0x04,0x07,0x54,0x00,0x60,0x07,0x98,0x00,0x60,0x07,0xcf,0x00,0x60,0x04,0xe8,0x00,0x2b,0x03,0xcf,0x00,0x2b,0x05,0xbe,0x00,0x2b,0x06,0x58,0x00,0x35,0x04,0xa4,0x00,0x98,0x04,0x8e,0x00,0xa6,0x03,0xf4,0x00,0x31,0x03,0xf4,0x00,0x74,0x04,0x62,0x00,0xa6,0x04,0xba,0x00,0x14,0x04,0x85,0x00,0x12, -0x05,0x6c,0xff,0xb1,0x04,0x85,0x00,0x12,0x05,0x1a,0x00,0x60,0x06,0x6a,0x00,0x00,0x04,0x90,0x00,0x00,0x05,0x9e,0x00,0x56,0x04,0xb0,0x00,0x60,0x04,0xa8,0x00,0x5e,0x03,0xa4,0x00,0x60,0x03,0xfc,0x00,0xbc,0x03,0x9c,0x00,0x90,0x04,0xc4,0x00,0x48,0x04,0x04,0x00,0x33,0x04,0xe4,0x00,0x00,0x03,0xf2,0xff,0x7b,0x07,0x23,0x00,0xb8, -0x06,0xe4,0x00,0xa6,0x04,0xd5,0x00,0x33,0x04,0x14,0x00,0x33,0x05,0x16,0x00,0x00,0x04,0x44,0xff,0xec,0x04,0xe2,0x00,0x48,0x03,0xae,0x00,0x3e,0x04,0xc4,0x00,0x14,0x03,0xe2,0x00,0x14,0x05,0x4c,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x85,0x00,0x0a,0x03,0x44,0x00,0x00,0x04,0x90,0x00,0x00,0x04,0xa8,0x00,0xa2,0x03,0xb2,0x00,0x60, -0x01,0xf0,0xff,0x3a,0x06,0x08,0x00,0x5e,0x03,0xbc,0x00,0x60,0x03,0xbc,0x00,0x60,0x06,0xe8,0x00,0x1e,0x05,0x6c,0x00,0x1e,0x05,0x2b,0x00,0x29,0x04,0xa4,0x00,0x29,0x07,0x44,0x00,0xbc,0x05,0xb8,0x00,0xa6,0x05,0x52,0x00,0x16,0x03,0xfe,0x00,0x0c,0x06,0xfc,0x00,0xbc,0x05,0x87,0x00,0xa6,0x05,0xd3,0x00,0x29,0x04,0x85,0x00,0x1e, -0x07,0x70,0x00,0xbc,0x05,0xfe,0x00,0xa6,0x04,0x52,0x00,0x31,0x03,0x99,0x00,0x21,0x06,0x44,0x00,0x66,0x06,0x14,0x00,0x66,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x05,0xc2,0x00,0x12,0x04,0xa0,0x00,0x0e,0x05,0xc2,0x00,0x12,0x04,0xa0,0x00,0x0e,0x0a,0x7f,0x00,0x5e,0x08,0xf2,0x00,0x58,0x06,0x9c,0x00,0x5e,0x05,0x33,0x00,0x60, -0x09,0x08,0x00,0x5e,0x07,0x27,0x00,0x60,0x06,0xe8,0x00,0x1e,0x05,0x6c,0x00,0x1e,0x04,0xb4,0x00,0x5e,0x03,0x81,0x00,0x60,0x04,0x00,0x00,0x2d,0x03,0x27,0x00,0x52,0x03,0x4c,0x00,0x5e,0x00,0x00,0xff,0x90,0x00,0x00,0xff,0x86,0x07,0xe2,0x00,0x21,0x07,0x98,0x00,0x35,0x04,0x9c,0x00,0x29,0x04,0x0c,0x00,0x2d,0x04,0x7c,0x00,0xbc, -0x04,0xb5,0x00,0xa6,0x04,0x8c,0x00,0xbc,0x04,0x04,0x00,0xa6,0x04,0x52,0x00,0x60,0x03,0xa2,0x00,0x58,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x27,0x05,0xae,0x00,0x29,0x04,0xa6,0x00,0x1e,0x06,0xb8,0x00,0xbc,0x05,0x4e,0x00,0xa6,0x08,0x16,0x00,0xbc,0x06,0xb0,0x00,0xa6,0x05,0xc6,0x00,0x5e,0x04,0x74,0x00,0x60,0x04,0xf4,0x00,0x5e, -0x03,0xb2,0x00,0x60,0x04,0x35,0x00,0x29,0x03,0x48,0x00,0x1e,0x06,0xfa,0x00,0x29,0x05,0x79,0x00,0x1e,0x05,0x7f,0x00,0xa6,0x04,0xb4,0x00,0x98,0x06,0xae,0x00,0x29,0x05,0x10,0x00,0x29,0x06,0xae,0x00,0x29,0x05,0x10,0x00,0x29,0x02,0x21,0x00,0xbc,0x06,0xef,0xff,0xea,0x05,0xf8,0x00,0x04,0x04,0xa4,0x00,0xbe,0x04,0x0c,0x00,0xa6, -0x05,0xae,0x00,0xbc,0x04,0x9e,0x00,0xa6,0x05,0x3e,0x00,0xa6,0x04,0x85,0x00,0x98,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x06,0xe2,0x00,0x0a,0x06,0xa8,0x00,0x5a,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52, -0x06,0xef,0xff,0xea,0x05,0xf8,0x00,0x04,0x04,0x52,0x00,0x60,0x03,0x91,0x00,0x50,0x04,0x2f,0x00,0x52,0x03,0x89,0xff,0xdd,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xee,0x00,0x68,0x03,0xb2,0x00,0x5a, -0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x05,0x4a,0x00,0xa6,0x04,0x85,0x00,0x98,0x06,0x44,0x00,0xbc,0x05,0xad,0x00,0xa6,0x04,0x8e,0x00,0x56,0x04,0xb6,0x00,0x60,0x06,0xd3,0x00,0x64,0x06,0xe2,0x00,0x60,0x06,0x70,0x00,0x29,0x05,0xc6,0x00,0x1e, -0x04,0x77,0x00,0x29,0x03,0xcb,0x00,0x1e,0x07,0x3e,0x00,0x18,0x06,0x5e,0x00,0x14,0x07,0xea,0x00,0xbc,0x06,0xcb,0x00,0xa6,0x05,0xb8,0x00,0x5e,0x04,0x3e,0x00,0x60,0x05,0x66,0x00,0x29,0x04,0xc8,0x00,0x1e,0x04,0xb0,0x01,0x33,0x04,0x87,0x01,0x1c,0x04,0x87,0x01,0x1c,0x04,0x0a,0x01,0x08,0x04,0xb0,0x01,0x23,0x02,0xaa,0xff,0x8c, -0x00,0x00,0xff,0x27,0x00,0x00,0xff,0x21,0x00,0x00,0xff,0xcb,0x00,0x00,0xff,0x04,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0x14,0x00,0x00,0xff,0x2b,0x00,0x00,0xfe,0x96,0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x6a,0x00,0x00,0xff,0x10,0x00,0x00,0xff,0x23,0x01,0xd5,0x00,0x72,0x01,0xd5,0x00,0x72,0x04,0xb0,0x01,0xba, -0x02,0xb0,0x00,0x66,0x02,0xb0,0x00,0x66,0x01,0x4e,0xff,0xbe,0x01,0xb2,0x00,0x66,0x01,0xb2,0x00,0x0a,0x01,0xb2,0x00,0x0a,0x02,0x3e,0x00,0x66,0x03,0x2d,0x00,0x14,0x02,0x3a,0x00,0x0a,0x01,0xd5,0x00,0x82,0x03,0x04,0x00,0x8d,0x01,0xc7,0x00,0x6a,0x01,0xc7,0x00,0x6e,0x01,0xc7,0x00,0x6e,0x02,0xaa,0x00,0xfb,0x02,0xaa,0x00,0xfb, -0x01,0xba,0x00,0x14,0x01,0xba,0x00,0x0a,0x04,0xac,0x00,0x72,0x04,0xac,0x00,0x70,0x04,0xac,0x00,0x66,0x04,0xac,0x00,0x66,0x02,0xaa,0x01,0x20,0x02,0x42,0x00,0x87,0x02,0x25,0x00,0x52,0x02,0xaa,0x01,0x20,0x02,0x7b,0x00,0x3e,0x02,0x25,0x00,0x52,0x02,0x42,0x00,0x87,0x02,0x39,0x00,0xb6,0x02,0x39,0x00,0xb6,0x02,0xaa,0x00,0xfb, -0x02,0xaa,0x00,0xfb,0x02,0xaa,0x00,0xa0,0x02,0xaa,0x00,0xa0,0x02,0xaa,0x00,0xa0,0x02,0x7b,0x00,0x3e,0x02,0xaa,0x00,0x79,0x02,0xb0,0x00,0x48,0x02,0x56,0x00,0x0a,0x01,0x4c,0x00,0x66,0x01,0xf0,0x00,0x3e,0x02,0x42,0x00,0x14,0x01,0xba,0x00,0x0a,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96, -0x03,0x10,0x00,0x96,0x02,0xaa,0x00,0x62,0x02,0xaa,0x00,0x62,0x02,0xaa,0x00,0x3c,0x03,0x52,0x00,0x00,0x02,0xaa,0x00,0x6e,0x01,0xf0,0xff,0x3a,0x02,0x18,0x00,0x0a,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43, -0x04,0x57,0x00,0x43,0x03,0x10,0x00,0x43,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a, -0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x03,0x10,0x00,0x1a,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42, -0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f, -0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x03,0x10,0x00,0x26,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42, -0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x03,0x10,0x00,0x26,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23, -0x03,0x10,0x00,0x23,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x03,0x10,0x00,0x4b,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96, -0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x03,0x10,0x00,0x1a,0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24, -0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24,0x03,0x10,0x00,0x24,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x03,0x10,0x00,0x4e,0x04,0x57,0x00,0x96, -0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x54,0x00,0x00,0xff,0x54,0x00,0x00,0xfd,0xa7,0x00,0x00,0xff,0x68,0x05,0x27,0x00,0x60,0x02,0x60,0x00,0xa6,0x05,0x0e,0x00,0xa6,0x02,0xb6,0x00,0x2b,0x04,0xbc,0xff,0xdb,0x04,0xbc,0xff,0xdb,0x02,0xaa,0x00,0x85,0x02,0xaa,0x00,0x85, -0x02,0xaa,0x00,0xc8,0x02,0xaa,0x00,0xc8,0x02,0xaa,0x00,0x87,0x02,0x25,0x00,0x52,0x02,0x98,0x00,0x28,0x02,0x98,0x00,0x28,0x02,0xb2,0x00,0x23,0x02,0x39,0x00,0xad,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0xff,0xf0,0x02,0xaa,0xff,0xf2,0x02,0xaa,0x00,0x3a,0x00,0x00,0xff,0x74, -0x00,0x00,0xff,0xa6,0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x30,0x00,0x00,0xff,0x74,0x00,0x00,0xff,0x74,0x00,0x00,0xfe,0xa1,0x00,0x00,0xff,0xa6,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfc,0xe6,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x03,0xc0,0x00,0x0a,0x05,0x4a,0x00,0x00,0x06,0xa2,0x00,0x52,0x03,0xdf,0x00,0x3e, -0x03,0xb2,0x00,0x60,0x04,0x66,0x00,0xa6,0x04,0x70,0x00,0x3c,0x03,0x56,0x00,0xa6,0x03,0x4c,0x00,0x5a,0x01,0xee,0x00,0x8e,0x02,0x62,0x00,0x14,0x03,0xfa,0x00,0xa6,0x03,0x23,0x00,0x42,0x05,0x9e,0x00,0xa6,0x04,0xa6,0x00,0xa6,0x04,0xb0,0x00,0x60,0x03,0xcd,0x00,0x5a,0x04,0xf2,0x00,0x60,0x04,0xf2,0x00,0x60,0x04,0xf2,0x00,0x4c, -0x07,0x70,0x00,0x52,0x04,0x4a,0x00,0x60,0x04,0xc2,0x00,0x60,0x04,0xc2,0x00,0x60,0x03,0xb2,0x00,0xa6,0x03,0xa2,0x00,0x1e,0x03,0xa2,0x00,0x1e,0x03,0x48,0x00,0x1e,0x04,0x46,0x00,0x90,0x04,0x89,0x00,0x66,0x05,0xbe,0x00,0x3e,0x04,0x89,0x00,0x66,0x03,0xd5,0x00,0x0e,0x05,0xc8,0x00,0x18,0x03,0x9e,0x00,0x21,0x03,0x58,0x00,0x50, -0x03,0x4a,0x00,0x50,0x04,0x3a,0x00,0x14,0x03,0x10,0x00,0xa6,0x03,0xc0,0x00,0x0a,0x04,0x9e,0x00,0xa6,0x03,0xb2,0x00,0xa6,0x04,0xba,0x00,0x60,0x04,0x7d,0x00,0x0a,0x02,0xe2,0x00,0x0a,0x03,0xe6,0xff,0xf6,0x02,0xc6,0x00,0x7b,0x02,0xdb,0x00,0x23,0x03,0x46,0x00,0x7b,0x02,0x72,0x00,0x7b,0x02,0x72,0x00,0x48,0x03,0x46,0x00,0x3e, -0x03,0x64,0x00,0x7b,0x01,0x79,0x00,0x7b,0x01,0xd3,0x00,0x0a,0x02,0xd5,0x00,0x7b,0x02,0x44,0x00,0x7b,0x04,0x31,0x00,0x7b,0x03,0x81,0x00,0x7b,0x03,0x81,0x00,0x7b,0x03,0x68,0x00,0x3e,0x03,0x0c,0x00,0x3e,0x02,0xb6,0x00,0x7b,0x02,0xc2,0x00,0x7b,0x02,0x52,0x00,0x0a,0x03,0x50,0x00,0x74,0x04,0x35,0x00,0x10,0x02,0x85,0x00,0x3e, -0x02,0x85,0x00,0x66,0x02,0xc6,0x00,0x3e,0x03,0xdf,0x00,0x48,0x02,0xc6,0x00,0x66,0x02,0xc6,0x00,0x3e,0x02,0x7d,0x00,0x3e,0x02,0x7d,0x00,0x48,0x02,0x1c,0x00,0x3e,0x02,0x1c,0x00,0x42,0x02,0xc6,0x00,0x3e,0x01,0x4e,0x00,0x58,0x02,0x6a,0x00,0x66,0x03,0xfa,0x00,0x66,0x02,0xb0,0x00,0x66,0x02,0xbc,0x00,0x3e,0x02,0x29,0x00,0x3e, -0x02,0xbc,0x00,0x3e,0x02,0xbc,0x00,0x3e,0x02,0xbe,0x00,0x66,0x01,0x9c,0x00,0x0a,0x02,0xa6,0x00,0x5c,0x02,0x9c,0x00,0x3e,0x03,0xfa,0x00,0x60,0x02,0x40,0x00,0x0a,0x02,0x8e,0x00,0x14,0x02,0xac,0x00,0x60,0x02,0x56,0xff,0xec,0x02,0xbc,0x00,0x3e,0x03,0x44,0x00,0x3e,0x02,0x62,0xff,0xf6,0x01,0x4e,0x00,0x58,0x01,0xb2,0x00,0x66, -0x02,0xa6,0x00,0x5c,0x02,0x40,0x00,0x0a,0x02,0xac,0x00,0x60,0x02,0x56,0xff,0xec,0x02,0xc6,0x00,0x66,0x03,0x44,0x00,0x3e,0x02,0x62,0xff,0xf6,0x04,0xa6,0x00,0xfc,0x01,0x4e,0x00,0x58,0x02,0xc6,0x00,0x66,0x04,0x57,0x00,0x42,0x07,0x04,0x00,0x8f,0x04,0xfe,0x00,0x74,0x04,0x50,0x00,0x76,0x04,0x50,0x00,0x76,0x06,0xe4,0x00,0xa6, -0x05,0x2a,0x00,0x23,0x06,0xda,0x00,0xbc,0x05,0xf4,0x00,0x14,0x04,0x37,0x00,0x64,0x04,0xb6,0x00,0x60,0x04,0x00,0x00,0x2a,0x03,0x96,0x00,0x29,0x09,0x00,0x00,0x2c,0x03,0xa4,0x00,0x30,0x04,0xb5,0x00,0x26,0x07,0x1f,0x00,0xa2,0x07,0x7a,0x00,0x60,0x07,0x7a,0x00,0x60,0x05,0x06,0x00,0x16,0x05,0x29,0x00,0x16,0x04,0xf4,0x00,0x16, -0x03,0xb2,0x00,0x21,0x03,0xc4,0x00,0x12,0x04,0x31,0xff,0xef,0x03,0x65,0x00,0x68,0x03,0x9e,0x00,0x21,0x04,0x16,0x00,0x30,0x01,0x9c,0x00,0x6c,0x00,0x00,0xff,0x2b,0x00,0x00,0xfe,0xbd,0x00,0x00,0xff,0x60,0x00,0x00,0xfc,0xe6,0x04,0xb0,0x00,0x21,0x04,0xf4,0x00,0x68,0x04,0xf4,0x00,0x5e,0x04,0xf4,0x00,0x68,0x03,0xc6,0x00,0xbc, -0x03,0x10,0x00,0xa6,0x04,0xb4,0xff,0xbb,0x04,0xb6,0x00,0x60,0x02,0x81,0xff,0xf8,0x06,0xe4,0xff,0xc0,0x04,0x87,0xff,0xc0,0x04,0xb4,0xff,0xbb,0x02,0xc8,0xff,0xbb,0x02,0xae,0xff,0xa5,0x03,0xb5,0x00,0x27,0x02,0xb6,0xff,0xef,0x03,0x9e,0x00,0x21,0x04,0xb6,0x00,0xa6,0x03,0xb1,0x00,0x7a,0x04,0x9f,0x00,0x60,0x07,0x3d,0x00,0x16, -0x05,0x2e,0x00,0x16,0x02,0x90,0x00,0x4a,0x02,0x22,0xff,0xfb,0x04,0xb4,0x00,0x22,0x04,0x46,0x00,0x22,0x04,0xc2,0x00,0x14,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0x60,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x03,0xfa,0x00,0xa6,0x01,0xf0,0x00,0x5c,0x06,0xe4,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xb4,0x00,0xa6,0x02,0xc8,0x00,0x5c, -0x03,0x65,0x00,0x68,0x03,0x76,0xff,0x92,0x03,0xd5,0x00,0x0e,0x03,0xac,0x00,0x1a,0x03,0x9e,0x00,0x21,0x04,0x12,0x00,0x5a,0x04,0xb6,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x60,0x03,0x81,0x00,0x52,0x03,0x91,0x00,0x50,0x05,0xe0,0x00,0x52,0x01,0xf0,0x00,0x90,0x03,0xba,0x00,0x5a,0x01,0xfa,0xff,0x92,0x04,0x87,0x00,0x90, -0x03,0x89,0xff,0xdd,0x02,0xc6,0x00,0x66,0x02,0x22,0x00,0x3e,0x02,0x26,0x00,0x3d,0x02,0xbd,0x00,0x3e,0x02,0x1c,0x00,0x42,0x01,0x77,0x00,0x0a,0x01,0x4e,0xff,0xdd,0x02,0xc6,0x00,0x3e,0x02,0xa6,0x00,0x5c,0x01,0x4e,0x00,0x0f,0x01,0x74,0x00,0x66,0x01,0x62,0x00,0x11,0x01,0x62,0x00,0x11,0x01,0x4e,0xff,0x87,0x01,0x74,0x00,0x66, -0x01,0x4c,0x00,0x31,0x01,0xcb,0x00,0x66,0x03,0xfa,0x00,0x66,0x03,0xfa,0x00,0x60,0x02,0xb0,0xff,0xbc,0x02,0xb0,0x00,0x66,0x02,0xd0,0x00,0x66,0x02,0xb0,0x00,0x3e,0x02,0xef,0x00,0x3e,0x01,0xd8,0x00,0x42,0x01,0x4e,0xff,0xc9,0x01,0x9c,0x00,0x0a,0x02,0xa6,0x00,0x05,0x02,0xbd,0x00,0x3e,0x02,0xa2,0x00,0x5c,0x02,0x93,0x00,0x5c, -0x02,0x40,0x00,0x0b,0x02,0x17,0x00,0x1a,0x02,0x17,0x00,0x1a,0x02,0x5b,0x00,0x1a,0x02,0x12,0xff,0xfb,0x02,0xbd,0x00,0x3e,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xdd,0x01,0xbc,0x00,0x70,0x02,0x85,0x00,0x3e,0x02,0x7d,0x00,0x3e,0x02,0xbc,0x00,0x3e,0x02,0x23,0x00,0x12,0x02,0x7d,0x00,0x48, -0x04,0x51,0x00,0x54,0x04,0x51,0x00,0x0c,0x04,0x51,0x00,0x69,0x04,0x51,0x00,0x56,0x02,0xaa,0x00,0x42,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x29,0x03,0xb5,0x00,0x27,0x02,0x7b,0x00,0x3e,0x02,0x23,0x00,0x12,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a, -0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x02,0x22,0xff,0xf9,0x02,0x22,0x00,0x02,0x02,0x22,0xff,0xfc,0x02,0x22,0xff,0xe5,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14, -0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4, -0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x04,0x51,0x00,0xbc,0x02,0xee,0x00,0x48,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x01,0x60,0x00,0x5b, -0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x48,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x02,0xee,0x00,0x48, -0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x06,0x46,0x00,0xbc,0x05,0x0d,0x00,0xa6, -0x05,0xaa,0x00,0x10,0x04,0x9f,0x00,0x10,0x05,0xf8,0x00,0xbc,0x05,0x06,0x00,0xa6,0x07,0x78,0x00,0xbc,0x06,0x06,0x00,0xa6,0x04,0x50,0x00,0x5a,0x03,0x04,0x00,0x6e,0x04,0x1d,0x00,0x8d,0x05,0x79,0x00,0xe8,0x04,0x47,0x00,0x5e,0x06,0x8e,0x00,0xbc,0x05,0x9e,0x00,0xa6,0x00,0x00,0xff,0xdc,0x00,0x00,0xff,0x25,0x00,0x00,0xff,0xdc, -0x00,0x00,0xfe,0x51,0x02,0x01,0x00,0xab,0x02,0x01,0x00,0x49,0x02,0x01,0xff,0xa2,0x02,0x01,0x00,0x49,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba, -0x08,0x04,0xff,0xba,0x03,0x56,0x00,0xb9,0x02,0x01,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xad,0x00,0x2b,0x03,0x57,0x00,0x62,0x04,0x02,0x00,0x4f,0x04,0x02,0xff,0xef,0x04,0xad,0xff,0xf4,0x04,0xad,0x00,0x49,0x04,0x02,0x00,0x22,0x08,0x04,0xff,0xba,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba, -0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x65,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x05,0x2a,0x00,0xa6,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xae,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x53,0x05,0x58,0x00,0x67,0x04,0x02,0x00,0xa1,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x9a, -0x04,0x02,0x00,0xa1,0x06,0xae,0x00,0x9a,0x02,0x01,0x00,0x6f,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x04,0xad,0x00,0x49,0x04,0xad,0x00,0x49,0x04,0xad,0xff,0xa2,0x06,0xae,0x00,0x82,0x02,0x01,0x00,0x00,0x04,0xad,0xff,0xa2,0x02,0x01,0x00,0x6f, -0x04,0x02,0x00,0xab,0x03,0x57,0x00,0x5a,0x02,0x01,0xff,0xa2,0x02,0x01,0x00,0x49,0x04,0x02,0x00,0x00,0x02,0x01,0x00,0x49,0x06,0x03,0x00,0x82,0x02,0x01,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0x02,0x00,0x52, -0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x0a,0xb1,0x00,0x9b,0x0a,0xb1,0x00,0x9b,0x06,0xae,0x00,0x19,0x06,0xae,0x00,0x19,0x04,0x02,0x00,0x65,0x04,0x02,0x00,0x65,0x01,0x56,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x06,0xae,0x00,0xab,0x05,0x58,0x00,0x9b, -0x04,0xad,0x00,0x39,0x05,0x58,0x00,0x9b,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0x00,0x06,0x03,0x00,0x9a,0x06,0x03,0x00,0x9a,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0x33,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xd4,0x00,0x00,0x00,0x45,0x04,0xad,0x00,0x52,0x02,0x01,0x00,0x52, -0x05,0x2a,0x00,0xa6,0x00,0x00,0xff,0xa2,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x02,0xac,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x03,0x57,0x00,0x00, -0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0xa1,0x04,0x02,0x00,0xab,0x03,0x56,0x00,0xb9,0x02,0x01,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xad,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xae,0x00,0x72,0x04,0x02,0x00,0x2f, -0x04,0xad,0xff,0xf4,0x04,0xad,0x00,0x49,0x04,0x02,0x00,0x22,0x05,0x58,0x00,0x9b,0x05,0x2a,0x00,0xa6,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x05,0x58,0x00,0x9b,0x04,0x02,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xab,0x07,0x59,0x00,0x72, -0x02,0xac,0x00,0x72,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x02,0x01,0x00,0x2d,0x04,0xae,0x00,0x7c,0x03,0x1d,0x00,0x42,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x08,0x04,0x00,0xa1,0x04,0x02,0x00,0x57,0x00,0x00,0x00,0xc4,0x00,0x00,0xff,0x17,0x00,0x00,0x00,0x10, -0x05,0x2a,0x00,0xa6,0x00,0x00,0xff,0xc2,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x06,0x03,0x00,0x9b,0x05,0x2a,0x00,0xa6,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x02,0x01,0xff,0x97,0x02,0x01,0xff,0x97,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2, -0x03,0x57,0x00,0xab,0x03,0x57,0x00,0xab,0x04,0x02,0x00,0x00,0x04,0x02,0xff,0xe7,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, -0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e, -0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0x02,0x00,0x00, -0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65, -0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b, -0x06,0x03,0x00,0x9b,0x08,0xaf,0x00,0x19,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab, -0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b, -0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x04,0x58,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x06,0xae,0x00,0x32, -0x07,0x58,0x00,0x1e,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x00,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x00,0x00,0xff,0xa8,0x00,0x00,0xff,0xb7,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x1d,0x00,0x00,0xff,0x2b,0x08,0xfc,0x00,0x2d,0x08,0xad,0x01,0x46, -0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x16,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0xc9,0x02,0x01,0x00,0x4d,0x03,0x57,0x00,0x21,0x00,0x00,0xff,0x82,0x00,0x00,0x00,0x32,0x04,0xcd,0x00,0x64,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x16,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba, -0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x03,0x57,0x00,0x5a,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xc2,0x04,0xad,0xff,0xc2,0x04,0xad,0x00,0x34,0x04,0xad,0x00,0x34,0x04,0xad,0x00,0x3a,0x04,0xad,0x00,0x3a,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52, -0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x65,0x04,0x02,0x00,0x52,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x02,0xfe,0x00,0x00,0x04,0xad,0xff,0x97,0x04,0xad,0xff,0x97,0x04,0xc1,0x00,0x66,0x09,0xd0,0x00,0x73,0x06,0xa8,0x00,0x73, -0x04,0x40,0x00,0x49,0x0c,0x2d,0x00,0x73,0x08,0xaf,0x00,0x49,0x02,0xac,0x00,0x46,0x04,0xad,0x00,0x32,0x00,0x00,0xff,0xc9,0x00,0x00,0xff,0xe9,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x88,0x00,0x00,0xff,0xc4,0x00,0x00,0x00,0xc4,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x32,0x00,0x00,0xff,0xc6,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52, -0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x06,0x03,0x00,0x53,0x05,0x58,0x00,0x67,0x05,0x58,0xff,0xba,0x04,0x02,0xff,0xba,0x00,0x00,0xfe,0x93,0x00,0x00,0xfe,0xa9,0x00,0x00,0xfe,0x91,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x0a,0x05,0x00,0xa1,0x0c,0x06,0x00,0x9b,0x00,0x00,0xff,0xd4, -0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0x6c,0x00,0x00,0xff,0xd4,0x04,0xad,0x00,0x35,0x04,0x02,0x00,0x65,0x00,0x00,0xff,0xe7,0x00,0x00,0xff,0xdf,0x00,0x00,0xff,0xdf,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x05,0x07,0x59,0x00,0xab,0x03,0x56,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, -0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba, -0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba, -0x04,0xad,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba, -0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00, -0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x05,0x2a,0x00,0xa6,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x00,0x00,0xff,0x1a,0x04,0x00,0xff,0x1a,0x04,0x00,0x01,0x9f,0x04,0x00,0x01,0xb3,0x02,0xf4,0x00,0x14,0x04,0x96,0x00,0x1c,0x05,0x7f,0x00,0x1e,0x05,0x07,0x00,0x18,0x04,0x0c,0x00,0x8b,0x04,0x2f,0x00,0x60,0x02,0xdb,0x00,0x14, -0x01,0xf0,0xff,0x3a,0x06,0x01,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xc9,0x00,0x1c,0x02,0xc8,0x00,0x1c,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x03,0xcd,0x00,0x5a,0x03,0xb2,0x00,0x60,0x03,0xcd,0x00,0x5a,0x01,0xf0,0x00,0xa6,0x04,0x1e,0x00,0x29,0x03,0x48,0x00,0x1e,0x04,0xf4,0x00,0x1a,0x03,0xe0,0x00,0x1a,0x04,0xb8,0x00,0x1a, -0x03,0xac,0x00,0x1a,0x04,0x54,0x00,0x70,0x03,0x81,0x00,0x52,0x05,0x62,0x00,0x10,0x04,0x37,0x00,0x10,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xdb,0x05,0xed,0x00,0x35,0x03,0x9c,0x00,0x48, -0x03,0xcd,0x00,0x5a,0x03,0xc4,0x00,0x1c,0x02,0x4a,0x00,0x14,0x04,0x19,0x00,0x27,0x04,0x7b,0x00,0x1c,0x04,0xc9,0x00,0xbc,0x04,0x12,0x00,0x5a,0x02,0xb6,0xff,0xb5,0x05,0xf0,0x00,0xbc,0x04,0xb3,0x00,0xa6,0x05,0x1c,0x00,0xbc,0x04,0x4a,0x00,0xa6,0x04,0xf5,0x00,0x21,0x03,0xfb,0x00,0x21,0x04,0x8d,0x00,0x4b,0x04,0x1f,0x00,0xbc, -0x03,0x2b,0x00,0xa6,0x05,0x98,0x00,0x60,0x02,0xf7,0x00,0xaf,0x03,0x4f,0x00,0xaf,0x03,0x5a,0x00,0xaf,0x03,0xde,0x00,0x75,0x04,0xc9,0x00,0x75,0x04,0xc9,0x00,0x75,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x55,0x00,0x00,0x04,0x50,0x00,0x00, -0x01,0xbc,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00, -0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xa1,0x07,0x6c,0x00,0x79,0x03,0x64,0x00,0x3f,0x06,0x08,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0xf5,0x00,0xb0,0x00,0x00,0xfc,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x60,0x00,0x4a,0x07,0x60,0x00,0x8d,0x06,0xe7,0x00,0x96,0x03,0xc7,0x00,0x96,0x06,0xe7,0x00,0xe7,0x03,0xc7,0x00,0x96,0x06,0xe5,0x00,0x96,0x05,0x28,0x00,0x33,0x05,0x78,0x00,0xe6,0x05,0x9d,0x00,0xe6,0x05,0x92,0x00,0xe6,0x06,0x1e,0x00,0xe6, -0x06,0xe4,0x00,0xa5,0x08,0x00,0x00,0xa5,0x06,0xe4,0x00,0x50,0x06,0xe4,0x00,0xa5,0x06,0xe4,0x00,0x50,0x06,0xe4,0x00,0xa5,0x06,0xe4,0x00,0x8c,0x06,0xe4,0x02,0x0d,0x06,0xe4,0x00,0xa5,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0xcd,0x05,0xe8,0x00,0x5e,0x04,0xa0,0x00,0x0e,0x08,0x7e,0x00,0x1a, -0x06,0x9d,0x00,0x18,0x03,0xc7,0x00,0x96,0x03,0xc7,0x00,0x96,0x02,0x46,0x00,0xb4,0x02,0x46,0x00,0xb4,0x02,0x46,0x00,0xb4,0x02,0xf8,0x00,0x63,0x01,0xbc,0x00,0x70,0x04,0x82,0x00,0xe8,0x01,0xd7,0x00,0x94,0x01,0xd7,0x00,0xa3,0x06,0xae,0x03,0x9b,0x05,0x10,0x02,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xa5,0x00,0x00,0xff,0xcd,0x03,0x33,0x00,0x4b,0x00,0x00,0xfe,0xd2,0x01,0x9d,0x00,0x94,0x00,0x00,0x02,0x00,0x00,0x00,0xfd,0x3c,0x01,0xbc,0x00,0x70, -0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x9c,0x05,0x18,0x00,0xa5,0x04,0x90,0x00,0x50,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x02,0x25,0x00,0xbe,0x02,0xb2,0x00,0x31,0x05,0x65,0x00,0xbe,0x05,0x72,0x00,0xa0,0x02,0x25,0x00,0xbe,0x04,0x78,0x00,0x2f,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x8d,0x00,0xbe, -0x05,0x65,0x00,0xa4,0x02,0x25,0x00,0xbe,0x03,0x32,0x00,0x67,0x05,0x68,0x00,0x96,0x04,0xd6,0x00,0x59,0x04,0xe4,0x00,0x6c,0x05,0x0c,0x00,0x96,0x04,0x85,0x00,0x1e,0x04,0xaf,0x00,0x4b,0x05,0x4f,0x00,0x42,0x04,0x79,0x00,0x2f,0x06,0x47,0x00,0x6e,0x05,0xcf,0x00,0x34,0x04,0x2e,0x00,0xbe,0x04,0x2e,0x00,0xbe,0x04,0x2e,0x00,0xbe, -0x01,0xd5,0x00,0x6e,0x03,0x04,0x00,0x6e,0x04,0x78,0x00,0x2f,0x04,0x78,0x00,0x2f,0x04,0x68,0xff,0x51,0x04,0x68,0xff,0x51,0x04,0x53,0x00,0xbe,0x04,0xd6,0x00,0x59,0x05,0x18,0x00,0xa5,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x8d,0x00,0xbe,0x04,0x79,0x00,0x2f,0x05,0xcf,0x00,0x34, -0x04,0x6a,0x00,0x5f,0x06,0x47,0x00,0x6e,0x06,0x47,0x00,0x61,0x06,0x47,0x00,0x6e,0x06,0x47,0x00,0x61,0x05,0x18,0x00,0xa5,0x05,0x18,0x00,0xa5,0x05,0x18,0x00,0xa5,0x04,0x90,0x00,0x50,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x02,0x6b,0xff,0xfb,0x02,0xda,0xff,0xfa,0x05,0x72,0x00,0xa0,0x02,0x6b,0xff,0xfb, -0x04,0x78,0x00,0x2f,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x65,0x00,0xa4,0x03,0x32,0x00,0x67,0x05,0x68,0x00,0x96,0x04,0xe4,0x00,0x6c,0x05,0x0c,0x00,0x96,0x04,0xaf,0x00,0x4b,0x05,0x4f,0x00,0x42,0x04,0x79,0x00,0x2f,0x06,0x47,0x00,0x6e,0x05,0xcf,0x00,0x34,0x02,0x25,0x00,0xb5,0x04,0x90,0x00,0x50,0x04,0x5c,0x00,0x4e, -0x05,0x0c,0x00,0x96,0x05,0x38,0x00,0x59,0x09,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x18,0x00,0xa5,0x04,0x68,0x00,0x59,0x05,0x38,0x00,0x59,0x05,0x52,0x00,0x59,0x05,0x38,0x00,0x59,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x15,0x00,0x00,0xff,0x73,0x00,0x00,0xff,0xa1,0x00,0x00,0xff,0x49,0x00,0x00,0xff,0x45,0x00,0x00,0xff,0x61, -0x00,0x00,0xfe,0xab,0x00,0x00,0xfe,0x26,0x00,0x00,0x00,0x64,0x00,0x00,0xff,0x42,0x00,0x00,0xff,0x45,0x00,0x00,0x00,0x64,0x00,0x00,0xfe,0xe1,0x00,0x00,0xfe,0x06,0x00,0x00,0xff,0x17,0x00,0x00,0xff,0x5b,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x6a,0x00,0x00,0xff,0x4b,0x00,0x00,0xff,0x45,0x00,0x00,0xfe,0xe1,0x00,0x00,0xff,0x68, -0x00,0x00,0xff,0x45,0x00,0x00,0xff,0x17,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x4b,0x00,0x00,0xff,0x6a,0x00,0x00,0x00,0x64,0x00,0x00,0xfd,0x87,0x00,0x00,0xff,0x29,0x00,0x00,0xff,0xa4,0x03,0x32,0x00,0xab,0x02,0x25,0x00,0xb6,0x00,0x00,0xfe,0xb2,0x06,0x08,0x00,0x5e,0x05,0x22,0x00,0x33,0x05,0x55,0x00,0x64,0x05,0xa6,0x00,0x5a, -0x04,0x68,0x00,0x64,0x05,0x55,0x00,0x64,0x05,0xf6,0x00,0x32,0x06,0x19,0x00,0x5e,0x03,0xc4,0x00,0x20,0x05,0x08,0x00,0x8c,0x05,0xf6,0x00,0x32,0x05,0xe2,0x00,0x5c,0x05,0x4a,0x00,0xc9,0x06,0x08,0x00,0x5e,0x06,0x7f,0x00,0x32,0x06,0x36,0x00,0x32,0x05,0x55,0x00,0x64,0x04,0x68,0x00,0xb0,0x04,0x7b,0x00,0xbc,0x06,0x08,0x00,0x5e, -0x05,0xa6,0x00,0x5a,0x04,0x94,0x00,0x32,0x05,0x7f,0x00,0xaa,0x05,0x6b,0x00,0xa6,0x05,0x4a,0x00,0xa6,0x05,0x6b,0x00,0xc9,0x05,0x7d,0x00,0x5e,0x05,0xe2,0x00,0x5c,0x04,0x9c,0x00,0xbc,0x05,0x19,0x00,0x64,0x05,0x6b,0x00,0xc9,0x05,0x3b,0x00,0x32,0x06,0x31,0x00,0x32,0x05,0x0e,0x00,0xc9,0x04,0xf4,0x00,0x5e,0x05,0x22,0x00,0x33, -0x05,0x5a,0x00,0x96,0x06,0x8c,0x00,0x52,0x03,0xf8,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x07,0x00,0x00,0x60,0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x60,0x06,0x2c,0x00,0x3c,0x07,0x21,0x00,0x60,0x04,0xe1,0x00,0x60,0x04,0x51,0x00,0x60,0x08,0x66,0x00,0x60,0x04,0x88,0x00,0x60,0x04,0x88,0x00,0x60,0x06,0x0e,0x00,0x60, -0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x3f,0x06,0x0e,0x00,0x60,0x04,0x7d,0x00,0x9a,0x06,0x08,0x00,0x5e,0x06,0x82,0x00,0x60,0x06,0xff,0x00,0x40,0x04,0x51,0x00,0x60,0x06,0x2e,0x00,0x60,0x04,0x51,0x00,0x60,0x05,0x3b,0x00,0x32,0x04,0x58,0x00,0xa6,0x04,0xeb,0x00,0x60,0x04,0x88,0x00,0x60,0x05,0x0d,0x00,0x32,0x04,0x50,0x00,0x50, -0x04,0xd6,0x00,0xae,0x06,0x27,0x00,0x21,0x04,0x53,0x00,0x60,0x04,0xf5,0x00,0x60,0x05,0x4f,0x00,0x32,0x04,0x51,0x00,0x5e,0x04,0x51,0x00,0x60,0x04,0xc4,0x00,0x52,0x07,0xa8,0x00,0x60,0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x5f,0x04,0xb0,0x00,0x60,0x04,0xb1,0x00,0x40,0x03,0x64,0x00,0x70,0x02,0xa8,0x00,0x32,0x04,0x75,0x00,0x28, -0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x28,0x04,0x48,0x00,0x30,0x04,0x75,0x00,0x28,0x07,0x10,0x00,0x28,0x04,0x75,0xff,0x3f,0x07,0x13,0x00,0x5b,0x03,0xf4,0x00,0x28,0x04,0x75,0x00,0x59,0x07,0x17,0x00,0x31,0x05,0x51,0x00,0x30,0x04,0x75,0x00,0x31,0x07,0x13,0x00,0x5b,0x05,0xf2,0x00,0x28,0x05,0xf2,0x00,0x28,0x07,0x0c,0x00,0x59, -0x04,0x9c,0x00,0x59,0x04,0x75,0x00,0x42,0x07,0x13,0x00,0x5b,0x07,0x13,0x00,0x5b,0x04,0x72,0x00,0x71,0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x5b,0x04,0x75,0x00,0x2f,0x04,0x75,0x00,0x42,0x07,0x0c,0x00,0x59,0x07,0x10,0x00,0x3f,0x04,0xb0,0x00,0x21,0x04,0x75,0x00,0x42,0x04,0x89,0xff,0x8a,0x07,0x17,0x00,0x31, -0x04,0xc5,0x00,0x2f,0x04,0x56,0x00,0x35,0x04,0x75,0x00,0x46,0x04,0x75,0x00,0x28,0x07,0x0c,0x00,0x59,0x06,0x3a,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x05,0x86,0x00,0x5e,0x05,0x94,0x00,0x78,0x05,0x7f,0x00,0xaa,0x05,0xa8,0x00,0x64,0x04,0xff,0x00,0xbc,0x05,0x7f,0x00,0xaa,0x06,0x3f,0x00,0xaa,0x05,0x86,0x00,0x5e,0x05,0x33,0x00,0xaa, -0x04,0x58,0x00,0xbc,0x06,0x53,0x00,0xbc,0x05,0x62,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x04,0x90,0x00,0x21,0x05,0x54,0x00,0x5e,0x05,0x94,0x00,0x78,0x05,0xf6,0x00,0x62,0x05,0xc6,0x00,0xaa,0x04,0xab,0x00,0x5e,0x05,0x94,0xff,0xf6,0x05,0x54,0x00,0x5e,0x05,0xcf,0x00,0xaa,0x05,0x54,0x00,0x5e,0x06,0x33,0x00,0x82,0x05,0x9a,0x00,0x64, -0x05,0xc6,0x00,0xaa,0x05,0xcf,0x00,0xaa,0x05,0x7a,0x00,0x5e,0x05,0x19,0x00,0x64,0x05,0x9d,0x00,0xaa,0x05,0x6f,0x00,0x90,0x05,0xc6,0x00,0xaa,0x06,0x56,0x00,0x5e,0x05,0x3f,0x00,0x14,0x06,0x08,0x00,0x5e,0x05,0xcb,0x00,0x86,0x00,0xca,0x00,0x00,0x00,0xe1,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x92,0x00,0x00,0x01,0x35,0x00,0x00, -0x02,0x29,0x00,0x00,0x02,0xce,0x00,0x00,0x06,0xe4,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0xf2,0x00,0x60,0x04,0xc3,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xec,0x00,0x60,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0xa6,0x05,0x2b,0x00,0xa6,0x04,0xca,0x00,0x5e,0x04,0x87,0x00,0xa6,0x02,0x76,0x00,0xa6,0x06,0xb1,0x00,0xa6,0x04,0xb0,0x00,0x60, -0x04,0x87,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0x57,0x00,0x60,0x04,0xd4,0x00,0xa6,0x04,0x18,0x00,0x60,0x04,0xa5,0x00,0x90,0x02,0x26,0xff,0x70,0x04,0xb0,0xff,0xf6,0x04,0x26,0x00,0x60,0x04,0x87,0x00,0xa6,0x03,0x4c,0x00,0x60,0x06,0xe4,0x00,0x90,0x04,0x64,0x00,0x60,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0x90,0x04,0xbe,0x00,0x90, -0x06,0xa6,0x00,0x8f,0x04,0x87,0x00,0xa6,0x04,0xb6,0x00,0x60,0x03,0x26,0x00,0xa6,0x06,0xa6,0x00,0x8f,0x04,0xb4,0x00,0x00,0x04,0xb0,0x00,0x60,0x05,0x7f,0x00,0x60,0x05,0x72,0x00,0x90,0x01,0xbc,0x00,0x70,0x02,0x42,0x00,0x2a,0x09,0x0e,0x00,0x90,0x08,0xf8,0x00,0x90,0x08,0xf8,0x00,0x90,0x09,0x0e,0x00,0x90,0x0b,0x67,0x00,0x90, -0x04,0x50,0x00,0x83,0x04,0x50,0x00,0x37,0x01,0xf0,0x00,0x90,0x04,0x50,0x00,0x5c,0x03,0x1e,0x00,0x79,0x04,0x50,0x00,0x99,0x04,0x50,0x00,0x7b,0x04,0x7d,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x1e,0x00,0x45,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x5c,0x04,0x50,0x00,0xe8,0x04,0x50,0x00,0x99, -0x04,0x50,0x00,0x7b,0x04,0x50,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x50,0x00,0x60,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x56,0x03,0x1e,0x00,0x53,0x04,0x50,0x00,0x6d,0x04,0x50,0x00,0x7b,0x04,0x7d,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x1e,0x00,0x45,0x04,0x50,0x00,0x5a, -0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0xa8,0x04,0x50,0x00,0x60,0x04,0x50,0x00,0x83,0x04,0x50,0x00,0x0e,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6e,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0x64,0x04,0x50,0x00,0x5e,0x02,0xee,0x00,0x48,0x02,0xee,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xee,0x00,0x2f, -0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x04,0x04,0x00,0x00,0x03,0xec,0x00,0xb0,0x04,0x0f,0x00,0x58,0x04,0xac,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x5b,0x00,0xb0,0x04,0x94,0x00,0x58,0x04,0xe9,0x00,0xb0,0x02,0x04,0x00,0xb0,0x02,0x81,0x00,0x11,0x03,0xec,0x00,0xb0, -0x03,0x4c,0x00,0xb0,0x06,0x12,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x04,0xed,0x00,0x58,0x03,0xe0,0x00,0xb0,0x04,0xed,0x00,0x58,0x03,0xf8,0x00,0xb0,0x03,0x5d,0x00,0x68,0x03,0x85,0x00,0x19,0x04,0xc2,0x00,0x9c,0x04,0x15,0x00,0x00,0x06,0x69,0x00,0x05,0x04,0x02,0x00,0x1e,0x03,0xbb,0x00,0x14,0x03,0xdb,0x00,0x29,0x05,0x9f,0xff,0xf8, -0x06,0x31,0x00,0x58,0x03,0x4c,0x00,0x38,0x05,0x01,0x00,0x41,0x03,0xe0,0x00,0xb0,0x04,0xac,0x00,0x2d,0x04,0x33,0x00,0xa6,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x0f,0x00,0x58,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0, -0x03,0x70,0x00,0xb0,0x02,0x04,0xff,0xfc,0x02,0x04,0x00,0x87,0x02,0x04,0xff,0xe9,0x02,0x04,0xff,0xe0,0x05,0x2a,0x00,0xb0,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x03,0xbb,0x00,0x14, -0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x0f,0x00,0x58,0x04,0x0f,0x00,0x58,0x04,0x94,0x00,0x58,0x04,0xac,0x00,0xb0,0x04,0xac,0x00,0x2d,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x04,0x94,0x00,0x58,0x04,0x94,0x00,0x58,0x04,0x0f,0x00,0x58, -0x04,0xe9,0x00,0xb0,0x04,0xe9,0x00,0x2d,0x02,0x04,0xff,0xc3,0x02,0x04,0x00,0x04,0x02,0x04,0xff,0xf1,0x02,0x04,0x00,0x3f,0x02,0x04,0x00,0xa0,0x04,0x85,0x00,0xb0,0x02,0x81,0x00,0x11,0x03,0xec,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x05,0x2a,0x00,0xb0, -0x05,0x2a,0x00,0xb0,0x05,0x38,0x00,0xb0,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x03,0xf8,0x00,0xb0,0x03,0xf8,0x00,0xb0,0x03,0xf8,0x00,0xb0,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19, -0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x03,0xbb,0x00,0x14,0x03,0xbb,0x00,0x14,0x03,0xbb,0x00,0x14,0x03,0xdb,0x00,0x29,0x03,0xdb,0x00,0x29,0x03,0xdb,0x00,0x29, -0x04,0x04,0x00,0x00,0x05,0x9f,0xff,0xf8,0x05,0x01,0x00,0x41,0x04,0x04,0x00,0x00,0x03,0xec,0x00,0xb0,0x03,0x22,0x00,0x9c,0x04,0x4a,0x00,0x2a,0x03,0x70,0x00,0xb0,0x03,0xdb,0x00,0x29,0x04,0xe9,0x00,0xb0,0x04,0xed,0x00,0x58,0x02,0x04,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x15,0x00,0x00,0x06,0x12,0x00,0xb0,0x05,0x2a,0x00,0xb0, -0x03,0x95,0x00,0x49,0x04,0xed,0x00,0x58,0x04,0xe7,0x00,0xb0,0x03,0xe0,0x00,0xb0,0x03,0xac,0x00,0x30,0x03,0x85,0x00,0x19,0x03,0xbb,0x00,0x14,0x05,0x02,0x00,0x50,0x04,0x02,0x00,0x1e,0x05,0x40,0x00,0x7d,0x05,0x10,0x00,0x58,0x04,0x04,0x00,0x00,0x03,0x70,0x00,0xb0,0x04,0xe9,0x00,0xb0,0x02,0x04,0x00,0x87,0x04,0xed,0x00,0x58, -0x03,0xbb,0x00,0x14,0x05,0x10,0x00,0x58,0x02,0x04,0xff,0xe0,0x03,0xbb,0x00,0x14,0x03,0x70,0x00,0xb0,0x04,0x8d,0x00,0x22,0x03,0x36,0x00,0xb0,0x04,0x19,0x00,0x58,0x03,0x5d,0x00,0x68,0x02,0x04,0x00,0xb0,0x02,0x04,0xff,0xe0,0x02,0x81,0x00,0x11,0x06,0x80,0x00,0x0d,0x06,0x94,0x00,0xb0,0x04,0xe1,0x00,0x22,0x03,0xec,0x00,0xb0, -0x03,0xf4,0x00,0x36,0x04,0xdf,0x00,0xb0,0x04,0x04,0x00,0x00,0x03,0xe7,0x00,0xb0,0x03,0xec,0x00,0xb0,0x03,0x36,0x00,0xb0,0x04,0xaf,0x00,0x12,0x03,0x70,0x00,0xb0,0x05,0xe7,0x00,0x00,0x03,0x88,0x00,0x50,0x05,0x2a,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x8a,0x00,0x0d,0x06,0x12,0x00,0xb0,0x04,0xe9,0x00,0xb0, -0x04,0xed,0x00,0x58,0x04,0xe7,0x00,0xb0,0x03,0xe0,0x00,0xb0,0x04,0x0f,0x00,0x58,0x03,0x85,0x00,0x19,0x03,0xf4,0x00,0x36,0x05,0x02,0x00,0x50,0x04,0x02,0x00,0x1e,0x05,0x11,0x00,0xb0,0x04,0x60,0x00,0x7d,0x06,0x73,0x00,0xb0,0x06,0xa4,0x00,0xb0,0x04,0x89,0x00,0x22,0x05,0xa1,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x1e,0x00,0x54, -0x06,0xe0,0x00,0xb0,0x03,0xe9,0x00,0x12,0x03,0x31,0x00,0xb0,0x04,0xa5,0x00,0x35,0x04,0xa7,0x00,0x35,0x04,0xfa,0x00,0x35,0x07,0x1e,0x00,0x35,0x07,0x1e,0x00,0x35,0x05,0x45,0x00,0x57,0x04,0x0f,0x00,0x58,0x04,0x94,0x00,0x58,0x03,0x5d,0x00,0x68,0x04,0x96,0x00,0xbc,0x04,0x7b,0x00,0xbc,0x04,0x7b,0x00,0x52,0x05,0x9c,0x00,0xbc, -0x04,0x31,0x00,0x29,0x04,0x31,0x00,0x27,0x05,0x7d,0x00,0x5e,0x04,0xa4,0x00,0xbc,0x04,0xa4,0x00,0x02,0x02,0xdb,0x00,0x14,0x04,0xf4,0x00,0x5e,0x04,0xf4,0x00,0x68,0x04,0x90,0x00,0x21,0x03,0xe8,0x00,0xbc,0x03,0xe8,0x00,0x54,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x03,0xc4,0x00,0xbc,0x04,0x40,0x00,0x79,0x04,0xc9,0x00,0xbc, -0x04,0xc9,0x00,0x09,0x04,0xf8,0x00,0x12,0x04,0xf8,0x00,0x12,0x05,0xae,0x00,0xbc,0x05,0x7d,0x00,0x91,0x02,0xdb,0x00,0xb0,0x07,0x79,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x04,0x6c,0x00,0x12,0x04,0x96,0x00,0x67,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x17,0x04,0x0c,0x00,0xbc,0x04,0x0c,0x00,0x58,0x02,0x21,0x00,0xbc,0x06,0x08,0x00,0x5e, -0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x03,0xc4,0x00,0x20,0x05,0x9c,0x00,0x5e,0x01,0xbc,0x00,0x70,0x01,0xbc,0x00,0x27,0x03,0x78,0x00,0x70,0x03,0x78,0x00,0x70,0x01,0xbc,0x00,0x27,0x01,0xbc,0x00,0x70,0x04,0xef,0x00,0x90,0x03,0x33,0x00,0x90,0x02,0x21,0x00,0x30,0x06,0x08,0x00,0x5e,0x05,0xa6,0x00,0x77,0x02,0x46,0x00,0xb4, -0x01,0xbc,0x00,0x5c,0x01,0xbc,0x00,0x5e,0x03,0x96,0x00,0x83,0x03,0x04,0x00,0x6f,0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x6f,0x01,0xd5,0x00,0x74,0x01,0xd5,0x00,0x62,0x03,0x04,0x00,0x68,0x05,0x65,0x00,0x60,0x03,0xc4,0x00,0xbc,0x02,0x75,0x00,0xa6,0x04,0xd9,0xff,0xe4,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xa4,0x00,0xbc, -0x03,0xfa,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x03,0x85,0x00,0x2b,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x01,0xbc,0x00,0x5e,0x01,0xd5,0x00,0x74,0x03,0x1f,0x01,0x3d,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x58,0xff,0xba,0x05,0x58,0xff,0xba,0x05,0x58,0xff,0xba, -0x07,0x59,0x00,0x1e,0x06,0x03,0x00,0x7c,0x07,0x59,0x00,0x7c,0x02,0x01,0x00,0x76,0x00,0x00,0xff,0xc8,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x37,0x02,0x01,0x00,0x70,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba, -0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb0,0x00,0x9b, -0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba, -0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x06,0xae,0x00,0xab, -0x04,0x02,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0xff,0xba,0x06,0x03,0x00,0x53,0x04,0x02,0xff,0xba,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd8,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd4, -0x00,0x00,0xff,0x6c,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xf8,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x01,0x00,0x4f,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0x01,0x00,0x49,0x04,0x02,0x00,0x00,0x04,0x02,0xff,0xe7, -0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, -0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52, -0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x08,0x04,0x00,0xab, -0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x08,0xaf,0x00,0x19,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab, -0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab, -0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b, -0x02,0xac,0xff,0xba,0x05,0x58,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x57,0x04,0x02,0x00,0x57,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba, -0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x00,0x00,0x00,0x81,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, -0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x08,0x04,0x00,0xab, -0x08,0x04,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba, -0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e, -0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x02,0xac,0x00,0x17,0x02,0xac,0x00,0x17,0x02,0xac,0x00,0x16,0x02,0xac,0x00,0x16,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a, -0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x17,0x04,0xad,0x00,0x17,0x04,0xad,0x00,0x16,0x04,0xad,0x00,0x16,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b, -0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0xab,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0x01,0x00,0xa4,0x02,0x01,0x00,0x03,0x02,0x01,0x00,0xa4,0x02,0x01,0x00,0x03,0x02,0x01,0x00,0x03,0x02,0x01,0xff,0x62, -0x02,0x01,0x00,0x03,0x02,0x01,0xff,0xc6,0x00,0x00,0xff,0x97,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x89,0x02,0x01,0x00,0x60,0x02,0xac,0x00,0x1e,0x02,0x01,0x00,0x3c,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x30,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xa2,0x02,0xac,0x00,0x49,0x02,0xac,0x00,0x72,0x02,0xac,0x00,0x72, -0x02,0xac,0xff,0x97,0x02,0xac,0xff,0xc2,0x02,0xac,0x00,0x34,0x02,0xac,0x00,0x3a,0x03,0x57,0x00,0x17,0x03,0x57,0x00,0x16,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8, -0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8, -0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6, -0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39, -0x03,0x57,0x00,0x39,0x05,0x58,0x00,0x82,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x06,0x03,0x00,0x1e,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x04,0xad,0x00,0x72, -0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x02,0x01,0xff,0xf1,0x02,0x01,0xff,0xea,0x04,0x02,0x00,0xa1,0x03,0x57,0x00,0x39,0x04,0xa9,0x00,0x64,0x05,0x19,0x00,0x65, -0x04,0x90,0x00,0x21,0x04,0x51,0x00,0x5f,0x04,0x70,0x00,0x0a,0x04,0xb0,0x00,0x60,0x04,0x51,0xff,0xe6,0x04,0x55,0x00,0x2d,0x04,0x50,0x00,0x72,0x04,0x50,0x00,0xa1,0x04,0x50,0x00,0xc2,0x04,0x50,0x01,0x1f,0x04,0x50,0x00,0xf7,0x04,0x50,0x01,0x08,0x04,0x50,0x00,0xe1,0x04,0x50,0x00,0xa1,0x04,0x50,0x00,0xa9,0x04,0x50,0x00,0xbc, -0x04,0x26,0x00,0x76,0x03,0xb0,0x00,0x8a,0x04,0x61,0x00,0x6d,0x04,0x32,0x00,0x76,0x04,0xb4,0x00,0x6c,0x04,0xe2,0x00,0x97,0x04,0xe7,0x00,0x90,0x05,0x40,0x00,0x76,0x04,0xa3,0x00,0x80,0x04,0x87,0x00,0x76,0x05,0x35,0x00,0x96,0x04,0x1e,0x00,0x64,0x05,0x59,0x00,0x78,0x06,0x0d,0x00,0x82,0x05,0x1d,0x00,0x8c,0x05,0xfa,0x00,0x96, -0x06,0xa1,0x00,0x64,0x05,0x18,0x00,0x87,0x06,0x1c,0x00,0x78,0x05,0x81,0x00,0x96,0x04,0x84,0x00,0x98,0x04,0x84,0x01,0x00,0x04,0x84,0x00,0x5d,0x04,0x84,0x00,0x6b,0x04,0x84,0x00,0x94,0x04,0x84,0x00,0x59,0x04,0x84,0x00,0x7d,0x04,0x84,0x00,0xbf,0x04,0x84,0x00,0x2b,0x04,0x84,0x00,0x2b,0x04,0x3e,0x00,0x76,0x03,0xb2,0x00,0x2d, -0x04,0x52,0x00,0x7c,0x04,0xd7,0x00,0x0f,0x04,0xce,0x00,0x0a,0x05,0x44,0x00,0x16,0x04,0x94,0x00,0x41,0x05,0x2c,0x00,0x36,0x04,0x99,0x00,0x80,0x04,0xc2,0x00,0x7d,0x04,0xd1,0x00,0x82,0x04,0x15,0x00,0x82,0x04,0x15,0x00,0x96,0x06,0x00,0x00,0x82,0x05,0x6f,0x00,0x64,0x05,0x87,0x00,0x64,0x05,0x64,0x00,0x64,0x05,0x6f,0x00,0x64, -0x04,0xbe,0x00,0xb4,0x04,0xa6,0x00,0x82,0x04,0xa5,0x00,0x77,0x05,0xe4,0x00,0x50,0x06,0x2c,0x00,0x50,0x06,0x03,0x00,0x8c,0x06,0x1b,0x00,0x50,0x07,0x62,0x00,0x8c,0x07,0x62,0x00,0x50,0x05,0x9b,0x00,0x50,0x07,0x62,0x00,0x32,0x07,0x62,0x00,0x50,0x05,0xde,0x00,0x72,0x06,0xfc,0x00,0x74,0x06,0xc4,0x00,0x60,0x04,0x74,0x00,0x58, -0x06,0x24,0x00,0x73,0x06,0xcc,0x00,0x5d,0x06,0x1a,0x00,0x73,0x04,0xc0,0x00,0x70,0x06,0xce,0x00,0x74,0x05,0xe8,0x00,0x73,0x05,0x87,0x00,0x82,0x05,0x9d,0x00,0x82,0x04,0xd6,0x00,0x64,0x05,0x25,0x00,0x82,0x05,0xf8,0x00,0x6e,0x06,0x5a,0x00,0x82,0x05,0x93,0x00,0x64,0x04,0xee,0x00,0x6e,0x05,0xa7,0x00,0x82,0x04,0xa8,0x00,0x82, -0x04,0x46,0x00,0x5d,0x07,0x60,0x00,0x00,0x07,0x58,0x00,0x64,0x07,0x5d,0x00,0x64,0x06,0x96,0x00,0x61,0x07,0x62,0x00,0x61,0x07,0x62,0x00,0x64,0x05,0x78,0x00,0x46,0x07,0x62,0x00,0x64,0x07,0x62,0x00,0x61,0x05,0xad,0x00,0x82,0x06,0x25,0x00,0x82,0x06,0x44,0x00,0xb4,0x05,0xf5,0x00,0x82,0x05,0xcd,0x00,0x82,0x05,0xcd,0x00,0x82, -0x05,0x29,0x00,0x50,0x07,0x0c,0x00,0x82,0x06,0x1e,0x00,0x82,0x06,0x9d,0x00,0x82,0x05,0xb7,0x00,0x78,0x05,0xb3,0x00,0x78,0x04,0xa2,0x00,0x78,0x05,0xe9,0x00,0x50,0x05,0x89,0x00,0x78,0x05,0x89,0x00,0x78,0x06,0xd0,0x00,0x78,0x06,0x10,0x00,0x64,0x05,0xcb,0x00,0x70,0x07,0x2d,0x00,0x78,0x04,0x56,0x00,0x78,0x04,0x10,0x00,0x64, -0x04,0x78,0x00,0x78,0x04,0x4b,0x00,0x78,0x04,0xe5,0x00,0x78,0x04,0xff,0x00,0x78,0x05,0x94,0x00,0x78,0x05,0xde,0x00,0x64,0x04,0xa0,0x00,0x78,0x04,0x8e,0x00,0x78,0x04,0x84,0x00,0x80,0x04,0x5d,0x00,0x7f,0x04,0x8b,0x00,0x3a,0x04,0x5d,0x00,0x7f,0x04,0x5d,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x9f,0x00,0x80, -0x04,0x84,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x11,0x00,0x66,0x04,0x3c,0x00,0x80,0x04,0xb8,0x00,0x66,0x04,0xf5,0x00,0x66,0x04,0xd3,0x00,0x80,0x04,0xd3,0x00,0x80,0x03,0xaa,0x00,0x67,0x04,0x84,0x00,0x80,0x04,0x84,0x00,0x80,0x04,0xb4,0x00,0xa0,0x04,0xd9,0x00,0x8c,0x06,0x1f,0x00,0x64,0x06,0xbe,0x00,0xa0, -0x05,0x3c,0x00,0xa0,0x05,0x3c,0x00,0xa0,0x05,0x01,0x00,0x7b,0x06,0x25,0x00,0xa0,0x05,0x1a,0x00,0xa0,0x05,0x78,0x00,0xe9,0x04,0x1a,0x00,0x84,0x03,0xcc,0x00,0x69,0x04,0xb5,0x00,0x84,0x04,0x80,0x00,0x84,0x03,0xc9,0x00,0x84,0x03,0xf3,0x00,0x84,0x04,0x61,0x00,0x84,0x04,0x6c,0x00,0x84,0x03,0xdb,0x00,0x70,0x03,0xb7,0x00,0x84, -0x05,0x02,0x00,0x60,0x03,0xa4,0x00,0x50,0x04,0x5c,0x00,0x2d,0x03,0xf6,0x00,0x50,0x04,0x62,0x00,0x60,0x06,0x3f,0x00,0x60,0x04,0x81,0x00,0x77,0x06,0x9e,0x00,0x60,0x04,0x4a,0x00,0x0a,0x04,0x85,0x00,0x60,0x04,0x8f,0x00,0x60,0x05,0xf2,0x00,0x82,0x02,0x81,0x00,0xf0,0x06,0x51,0x00,0x64,0x05,0x7c,0x00,0x64,0x05,0xbe,0x00,0xb4, -0x05,0x48,0x00,0xb4,0x04,0x7c,0x00,0x64,0x06,0x01,0x00,0x00,0x04,0xd0,0x00,0x82,0x06,0x41,0x00,0x64,0x04,0xd5,0x00,0x67,0x04,0xd5,0x00,0x84,0x04,0xd5,0x00,0x67,0x04,0xd5,0x00,0x3f,0x04,0xd5,0x00,0x6b,0x04,0xd5,0x00,0x5c,0x04,0x9f,0x00,0xd6,0x04,0xd5,0x00,0x59,0x04,0xd5,0x00,0x7b,0x04,0xd5,0x00,0x8b,0x02,0x21,0x00,0x30, -0x02,0x21,0xff,0xd0,0x02,0x21,0xff,0xf9,0x02,0x21,0xff,0x86,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0xff,0xfd,0x03,0x89,0xff,0xbe,0x03,0x9f,0xff,0xbd,0x03,0x98,0xff,0xc1,0x03,0x9f,0xff,0xbe,0x03,0xb9,0xff,0xc0,0x03,0x9f,0xff,0xbe,0x02,0x79,0xff,0xbf,0x02,0x7b,0xff,0xbe,0x02,0x21,0xff,0xfe,0x02,0x21,0xff,0xf2, -0x02,0x21,0xff,0xf2,0x02,0x21,0xff,0xf2,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x04,0xfc,0x00,0x30,0x02,0x21,0xff,0xd1,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x1c,0x02,0x7b,0xff,0xc7,0x02,0x7b,0xff,0xc7,0x02,0x21,0xff,0xf3,0x02,0x21,0xff,0xf8,0x02,0x21,0x00,0x12,0x02,0x5d,0xff,0xaf, -0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x14,0x02,0x21,0xff,0xff,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x03,0xe8,0x00,0x93,0x05,0xee,0x00,0x48,0x05,0xcd,0x00,0x6c,0x03,0xe8,0x00,0x60,0x03,0x40,0x00,0x77,0x03,0xe8,0x00,0x3e,0x04,0x2f,0x00,0x96,0x04,0x78,0x00,0x2e,0x03,0xe8,0x00,0x5c, -0x06,0xbf,0x00,0x73,0x06,0x92,0x00,0x73,0x06,0xe7,0x00,0x75,0x03,0x8a,0x00,0x19,0x08,0x0c,0x00,0xaa,0x03,0xe8,0x00,0x60,0x06,0xaf,0x00,0x73,0x06,0xaf,0x00,0x75,0x06,0xbb,0x00,0x82,0x06,0x77,0x00,0x93,0x04,0x86,0x00,0x69,0x03,0xe8,0x00,0x6b,0x03,0xe8,0x00,0x6b,0x06,0x3e,0x00,0x96,0x04,0xae,0x00,0x20,0x06,0x35,0x00,0xaa, -0x05,0x65,0x00,0x12,0x04,0x45,0x00,0x57,0x03,0xa0,0x00,0x26,0x03,0x40,0x00,0x25,0x08,0x27,0x00,0x28,0x03,0x4c,0x00,0x2b,0x04,0x44,0x00,0x22,0x03,0xe9,0x00,0x4c,0x03,0xe9,0x00,0x0b,0x03,0xe9,0x00,0x5f,0x03,0xe9,0x00,0x4e,0x03,0xe9,0x00,0xaa,0x0a,0xe5,0x00,0x8c,0x06,0xaf,0x00,0x6e,0x06,0xaf,0x00,0x80,0x03,0x6e,0x00,0xb2, -0x02,0x03,0x00,0xb2,0x03,0xa5,0x00,0x53,0x01,0xe5,0x00,0x2b,0x03,0xb3,0x00,0xa6,0x01,0xe5,0x00,0x7a,0x01,0xe5,0x00,0x7a,0x01,0xe5,0x00,0x2b,0x03,0xd7,0x00,0x00,0x04,0xae,0x00,0x6a,0x04,0xae,0x00,0x68,0x04,0x5f,0x00,0x00,0x03,0x04,0x00,0x6f,0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x6f,0x01,0xd5,0x00,0x74,0x01,0xd5,0x00,0x62, -0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x74,0x03,0x4c,0x00,0x90,0x06,0xe4,0x00,0x8d,0x01,0xbc,0x00,0x70,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x04,0xad,0x00,0xab,0x04,0xad,0x00,0xab,0x06,0xae,0x00,0xa1,0x06,0xae,0x00,0xa1,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00, -0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x09,0x5a,0x00,0x9a,0x09,0x5a,0x00,0x9a,0x05,0x58,0xff,0xba,0x09,0x5a,0x00,0x9a,0x09,0x5a,0x00,0x9a,0x05,0x58,0xff,0xba,0x00,0x00,0xff,0x0e,0x00,0x00,0xff,0x36,0x00,0x00,0xff,0x72,0x00,0x00,0xfe,0xfc,0x00,0x00,0xfe,0x84,0x00,0x00,0xff,0x46, -0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x20,0x00,0x00,0xfe,0xec,0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x04,0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x15,0x00,0x00,0xff,0x40,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x23,0x00,0x00,0xff,0x06,0x00,0x00,0xff,0x2f,0x00,0x00,0xfe,0xba,0x00,0x00,0xfe,0x93,0x00,0x00,0xff,0x04,0x00,0x00,0xfe,0x94, -0x00,0x00,0xff,0x36,0x00,0x00,0xff,0x21,0x00,0x00,0xff,0x27,0x00,0x00,0xff,0x18,0x00,0x00,0xfe,0xf7,0x00,0x00,0xfe,0xa2,0x00,0x00,0xfe,0xc2,0x00,0x00,0xff,0x07,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xb2,0x04,0xa9,0x00,0x21,0x03,0xc1,0x00,0x21,0x04,0xa9,0x00,0x21,0x03,0xc1,0x00,0x21,0x04,0x40,0x00,0x77,0x03,0x65,0x00,0x70, -0x02,0xd9,0x00,0xbc,0x02,0xc9,0x00,0xa6,0x05,0x7f,0x00,0xaa,0x04,0x61,0x00,0x7d,0x05,0xbb,0x00,0x48,0x03,0x72,0x00,0x19,0x09,0x08,0x00,0x5e,0x07,0x26,0x00,0x60,0x04,0xbe,0xff,0xf3,0x04,0x6d,0x00,0x32,0x07,0x5f,0x00,0x33,0x06,0x55,0x00,0x1c,0x06,0xc1,0x00,0xbb,0x05,0xfe,0x00,0xa6,0x08,0x26,0x00,0x60,0x06,0x81,0x00,0x63, -0x07,0x67,0x00,0xbc,0x06,0x30,0x00,0xa6,0x05,0x29,0x00,0x16,0x03,0xd1,0x00,0x0a,0x05,0xd3,0x00,0x29,0x04,0xb1,0x00,0x1e,0x07,0x67,0x00,0xbc,0x05,0xda,0x00,0xa6,0x06,0x03,0x00,0x1e,0x04,0xdf,0x00,0x05,0x05,0xf0,0x00,0x3e,0x04,0xcd,0x00,0x3e,0x06,0xe8,0x00,0x0f,0x05,0x51,0x00,0x12,0x07,0x05,0x00,0x10,0x05,0x57,0x00,0x10, -0x08,0xd3,0x00,0xbc,0x06,0xbe,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x09,0xb6,0x00,0x5e,0x07,0x1e,0x00,0x60,0x06,0x55,0x00,0x7e,0x00,0x00,0xfe,0xc2,0x07,0xe2,0x00,0x6f,0x07,0xe2,0x01,0x13,0x07,0xe2,0x00,0x26,0x03,0xd1,0x00,0x7d,0x00,0x00,0xfe,0x9c,0x00,0x00,0xff,0x33, -0x04,0xa6,0x00,0xfc,0x04,0x01,0x01,0x33,0x05,0x98,0x00,0x0f,0x04,0x76,0x00,0x12,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x67,0x08,0x9c,0x00,0x60,0x07,0x3b,0x00,0x50,0x07,0x8f,0x00,0xa6,0x06,0xe1,0x00,0x98,0x05,0xbe,0x00,0x0f,0x04,0xa4,0x00,0x12,0x05,0x96,0x00,0x29,0x04,0xb0,0x00,0x1e,0x04,0x31,0x00,0x29,0x03,0x48,0x00,0x1e, -0x05,0xeb,0x00,0xae,0x04,0xc7,0x00,0x8f,0x04,0x31,0x00,0x29,0x03,0x48,0x00,0x1e,0x06,0x8e,0x00,0x29,0x05,0x54,0x00,0x1e,0x05,0x4a,0x00,0xa6,0x04,0x87,0x00,0xa6,0x07,0xd1,0x00,0xbc,0x06,0x8f,0x00,0xa6,0x04,0x50,0x00,0x2b,0x04,0x99,0x00,0x32,0x05,0xdc,0x00,0xe7,0x05,0xdc,0x00,0xe7,0x06,0x78,0x00,0x00,0x03,0x96,0x00,0x83, -0x01,0x9a,0x00,0x00,0x03,0xac,0x00,0xac,0x05,0x7a,0x00,0x5e,0x03,0x73,0x00,0x30,0x08,0x00,0x00,0xe6,0x08,0x00,0x00,0xe6,0x01,0xf0,0x00,0x37,0x00,0x00,0xfd,0x33,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00, -0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x03,0x33,0x00,0x90,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x04,0x50,0x00,0x53,0x04,0xb0,0x00,0xbb,0x04,0xb0,0x01,0x01, -0x04,0xb0,0x00,0xaf,0x04,0xb0,0x00,0xc2,0x04,0xb0,0x00,0x6a,0x04,0xb0,0x00,0x64,0x04,0xb0,0x00,0x39,0x04,0xb0,0x00,0x2e,0x04,0xb0,0x00,0x79,0x04,0xb0,0x00,0x81,0x06,0x04,0x00,0xfd,0x06,0x04,0x01,0x70,0x06,0x04,0x00,0xb9,0x06,0x04,0x00,0x7d,0x06,0x04,0x00,0xff,0x06,0x04,0x00,0x8c,0x06,0x04,0x00,0x1f,0x06,0x04,0x00,0xf5, -0x06,0x04,0x00,0x3a,0x06,0x04,0x00,0xaf,0x04,0xc4,0x00,0xb7,0x04,0xc4,0x01,0x2a,0x04,0xc4,0x00,0x7d,0x04,0xc4,0x00,0x8b,0x04,0xc4,0x00,0xb4,0x04,0xc4,0x00,0x79,0x04,0xc4,0x00,0x9d,0x04,0xc4,0x00,0xdf,0x04,0xc4,0x00,0x4b,0x04,0xc4,0x00,0x4b,0x05,0x14,0x00,0xe1,0x05,0x14,0x00,0xdc,0x05,0x14,0x00,0xa6,0x05,0x14,0x00,0x68, -0x05,0x14,0x00,0x2d,0x05,0x14,0x00,0x0c,0x05,0x14,0x00,0x68,0x05,0x14,0x00,0x4d,0x05,0x14,0x00,0xab,0x05,0x14,0x00,0x7d,0x05,0x28,0x00,0xad,0x05,0x28,0x01,0x15,0x05,0x28,0x01,0x15,0x05,0x28,0x00,0x2f,0x05,0x28,0x00,0x40,0x05,0x28,0x00,0x34,0x05,0x28,0x00,0x55,0x05,0x28,0x00,0x4f,0x05,0x28,0x00,0xc1,0x05,0x28,0x00,0xdc, -0x07,0x44,0x01,0xbd,0x07,0x44,0x01,0x00,0x07,0x44,0x00,0xd2,0x07,0x44,0x00,0xff,0x07,0x44,0x00,0xf8,0x07,0x44,0x00,0x5c,0x07,0x44,0x00,0x27,0x07,0x44,0x01,0x1a,0x07,0x44,0x00,0x48,0x07,0x44,0x00,0x23,0x06,0x68,0x00,0xbf,0x06,0x68,0x00,0x34,0x06,0x68,0x00,0x45,0x06,0x68,0x01,0x78,0x06,0x68,0x00,0x9e,0x06,0x68,0x00,0x36, -0x06,0x68,0x00,0x99,0x06,0x68,0x01,0x4a,0x06,0x68,0x00,0x28,0x06,0x68,0x00,0x99,0x05,0xdc,0x00,0xac,0x05,0xdc,0x00,0xa1,0x05,0xdc,0x00,0xf6,0x05,0xdc,0x00,0xdd,0x05,0xdc,0x00,0x60,0x05,0xdc,0x00,0x43,0x05,0xdc,0x00,0x7e,0x05,0xdc,0x00,0xd6,0x05,0xdc,0x00,0x8d,0x05,0xdc,0x01,0x0d,0x07,0x1c,0x01,0xc8,0x07,0x1c,0x00,0x24, -0x07,0x1c,0x00,0x37,0x07,0x1c,0x00,0x32,0x07,0x1c,0x00,0x7e,0x07,0x1c,0x00,0x37,0x07,0x1c,0x00,0x46,0x07,0x1c,0x01,0x25,0x07,0x1c,0x00,0x4b,0x07,0x1c,0x00,0x3d,0x06,0x68,0x00,0xdf,0x06,0x68,0x00,0xa3,0x06,0x68,0x00,0xc6,0x06,0x68,0x00,0xbb,0x06,0x68,0x00,0xcf,0x06,0x68,0x00,0xcf,0x06,0x68,0x01,0x08,0x06,0x68,0x00,0x35, -0x06,0x68,0x00,0xa7,0x06,0x68,0x00,0x67,0x06,0x68,0x00,0xd0,0x06,0x68,0x00,0xd2,0x06,0x68,0x01,0x47,0x06,0x68,0x00,0xa3,0x06,0x68,0x00,0xdd,0x06,0x68,0x00,0xdd,0x06,0x68,0x00,0x44,0x06,0x68,0x00,0x9a,0x06,0x68,0x00,0xb9,0x06,0x68,0x00,0x15,0x05,0x78,0x01,0x09,0x05,0x78,0x01,0x22,0x05,0x78,0x00,0xf8,0x05,0x78,0x01,0x0e, -0x05,0x78,0x00,0xb7,0x05,0x78,0x00,0x78,0x05,0x78,0x00,0x6c,0x05,0x78,0x00,0x3b,0x05,0x78,0x00,0xcb,0x05,0x78,0x00,0xe3,0x04,0x10,0x00,0x47,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x30,0x04,0x10,0x00,0x47,0x04,0x10,0x00,0x44, -0x04,0x88,0x00,0x80,0x04,0x88,0x00,0xa3,0x04,0x88,0x00,0x9b,0x04,0x88,0x00,0x5d,0x04,0x88,0x00,0x31,0x04,0x88,0x00,0x57,0x04,0x88,0x00,0x57,0x04,0x88,0x00,0xd7,0x04,0x88,0x00,0x83,0x04,0x88,0x00,0x83,0x06,0x04,0x01,0x48,0x06,0x04,0x01,0x21,0x06,0x04,0x00,0x74,0x06,0x04,0x00,0x43,0x06,0x04,0x00,0xf0,0x06,0x04,0x00,0xd6, -0x06,0x04,0x01,0x0f,0x06,0x04,0x00,0x8f,0x06,0x04,0x01,0x0b,0x06,0x04,0x01,0x20,0x04,0x4c,0x00,0x9d,0x04,0x4c,0x00,0xb6,0x04,0x4c,0x00,0x36,0x04,0x4c,0x00,0x5a,0x04,0x4c,0x00,0xc5,0x04,0x4c,0x00,0xab,0x04,0x4c,0x00,0x79,0x04,0x4c,0x00,0x74,0x04,0x4c,0x00,0xa8,0x04,0x4c,0x00,0xce,0x05,0xc8,0x00,0xc3,0x05,0xc8,0x01,0x6a, -0x05,0xc8,0x01,0x08,0x05,0xc8,0x01,0x20,0x05,0xc8,0x01,0x21,0x05,0xc8,0x00,0x3c,0x05,0xc8,0x01,0x05,0x05,0xc8,0x00,0x50,0x05,0xc8,0x00,0xc9,0x05,0xc8,0x01,0x01,0x05,0xc8,0x00,0xd6,0x06,0x04,0x00,0x8b,0x06,0x04,0x02,0xb1,0x06,0x04,0x00,0x1f,0x06,0x04,0x00,0xb7,0x06,0x04,0x00,0xd7,0x06,0x04,0x00,0xf9,0x06,0x04,0x01,0x37, -0x06,0x04,0x00,0x33,0x06,0x04,0x01,0x1c,0x06,0x04,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xe6,0x00,0x00,0xff,0x9c,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x05,0xcf,0x00,0x34,0x02,0x39,0x00,0x6d,0x01,0xac,0x00,0x5a,0x02,0x39,0x00,0x5b, -0x01,0xac,0x00,0x4e,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xf1,0x00,0x29,0x05,0x05,0x00,0x2b,0x04,0x6b,0x00,0x66,0x03,0xc5,0x00,0x26,0x04,0x45,0x00,0x51,0x03,0xda,0x00,0x21,0x04,0xba,0x00,0x51,0x04,0x90,0x00,0x21,0x03,0x5b,0x00,0xb0,0x03,0x5d,0x00,0x68,0x09,0x08,0x00,0x16,0x06,0x8b,0x00,0x5a,0x09,0x39,0x00,0x16, -0x07,0x16,0x00,0x5a,0x07,0xe4,0x00,0x16,0x06,0xc3,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x04,0xf4,0x00,0x68,0x03,0xb2,0x00,0x50,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x27,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0x12, -0x03,0xfa,0x00,0x27,0x04,0x5b,0x00,0xbc,0x02,0x82,0x00,0xa6,0x03,0xc4,0x00,0x12,0x01,0xf0,0x00,0x1e,0x06,0x08,0x00,0x00,0x04,0xb0,0x00,0x00,0x06,0xdf,0x00,0x5e,0x05,0x64,0x00,0x60,0x0a,0xa5,0x00,0x5e,0x07,0xf8,0x00,0x60,0x04,0x7b,0x00,0x19,0x04,0xb4,0x00,0x1e,0x05,0x83,0x00,0x1e,0x05,0xa6,0x00,0x05,0x06,0x79,0x00,0x0a, -0x06,0xe5,0x00,0x05,0x06,0x08,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0xd4,0x00,0x5e,0x06,0x42,0x00,0x60,0x04,0x5c,0x00,0x1e,0x03,0x2e,0x00,0x0f,0x04,0x79,0x00,0x3d,0x03,0xee,0x00,0x0f,0x04,0xf8,0x00,0x12,0x03,0xd5,0xff,0xe8,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0xea,0x00,0x55,0x04,0x2d,0x00,0x3e,0x04,0x7b,0x00,0x12, -0x04,0xb4,0x00,0x27,0x04,0x7b,0x00,0x12,0x04,0xb4,0x00,0x27,0x03,0xd9,0x00,0xbc,0x03,0x32,0x00,0xa6,0x03,0xcd,0x00,0x60,0x03,0x19,0x00,0x1e,0x03,0xc8,0x00,0x14,0x02,0xf2,0xff,0x76,0x04,0x24,0x00,0x38,0x04,0x2a,0x00,0x43,0x02,0x69,0x00,0x28,0x05,0x65,0x00,0x60,0x02,0x9f,0x00,0xa6,0x07,0xa9,0x00,0xa6,0x05,0x4d,0x00,0xa6, -0x02,0xc8,0x00,0xa6,0x04,0xa7,0x00,0xa6,0x04,0xea,0x00,0x2b,0x03,0xb0,0xff,0xec,0x06,0x08,0x00,0x0f,0x04,0x79,0x00,0x60,0x03,0x08,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xa4,0x00,0x5a,0x04,0xa4,0x00,0x59,0x04,0x9f,0x00,0x60,0x03,0xc4,0x00,0x20,0x01,0xf0,0x00,0xa6,0x06,0x15,0x00,0xbc,0x04,0xc9,0x00,0xa6,0x02,0xf4,0x00,0xbc, -0x02,0xc8,0x00,0xa6,0x04,0xfa,0x00,0x5e,0x03,0xac,0x00,0x60,0x05,0xae,0x00,0xbc,0x03,0x17,0xff,0xe5,0x06,0x3d,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x04,0xf4,0x00,0x00,0x03,0xb2,0x00,0x00,0x05,0x7d,0x00,0x01,0x04,0xb6,0x00,0x00,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x26,0x05,0xfc,0x00,0x12,0x04,0x87,0x00,0x19,0x04,0xc9,0x00,0x12, -0x02,0xc8,0x00,0x23,0x04,0x40,0x00,0x45,0x03,0x65,0x00,0x60,0x06,0x00,0xff,0xac,0x03,0x64,0x00,0x19,0x04,0x3e,0x00,0x3e,0x06,0xe4,0x00,0x90,0x03,0xe8,0x00,0x54,0x04,0x7b,0x00,0x52,0x07,0x2f,0x00,0xbd,0x02,0x21,0x00,0xbc,0x09,0x2b,0x00,0x1a,0x07,0x25,0x00,0x50,0x07,0x31,0x00,0x50,0x09,0x76,0x00,0x4a,0x07,0x11,0x00,0x50, -0x07,0x53,0x00,0x8d,0x07,0x53,0x00,0x81,0x07,0x07,0x00,0x2f,0x07,0x17,0x00,0x50,0x07,0x60,0x00,0x7b,0x04,0x21,0x00,0x50,0x03,0xc4,0x00,0xbc,0x04,0xf4,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x07,0x2f,0x00,0xbc,0x05,0x9c,0x00,0x1a,0x07,0x8c,0x00,0x1a,0x01,0xf0,0x00,0xa6,0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x06,0xe4,0x00,0xa6, -0x08,0x3c,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x08,0x3c,0x00,0x5e,0x04,0xf4,0x00,0x68,0x04,0xf4,0x00,0x5e,0x06,0x5c,0x01,0x05,0x05,0x9c,0x00,0xbc,0x09,0x18,0x00,0x5e,0x07,0x60,0x00,0x48,0x04,0x27,0x00,0x00,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e, -0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0x19,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba, -0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x39,0x06,0x03,0x00,0x82,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x82,0x06,0x03,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x9a,0x03,0x57,0xff,0xa6,0x03,0x57,0xff,0xa6, -0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x1c,0x00,0x02,0x04,0x1c,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x0c,0x66,0x00,0x73, -0x04,0x1f,0x00,0xbc,0x03,0x2b,0x00,0xa6,0x04,0x83,0x00,0x50,0x04,0x38,0x00,0x50,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x07,0x02,0x00,0x10,0x05,0x5a,0x00,0x10,0x05,0xfe,0x00,0xbc,0x06,0x04,0x00,0xa6,0x06,0xa5,0x00,0x3d,0x06,0x8a,0x00,0x3e,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x08,0x09,0x00,0x10, -0x06,0x73,0x00,0x10,0x08,0x57,0x00,0xbc,0x06,0xda,0x00,0xa6,0x05,0x7d,0x00,0xa6,0x04,0xb4,0x00,0x98,0x02,0x81,0x00,0x35,0x02,0x81,0x00,0x35,0x04,0xac,0x00,0x5c,0x05,0x2c,0x00,0xbc,0x03,0x44,0x00,0x1e,0x04,0xcc,0x00,0x81,0x04,0x21,0x00,0x77,0x04,0xa2,0x00,0x06,0x03,0xdf,0xff,0xbd,0x05,0xea,0x00,0xbc,0x06,0x68,0x00,0x60, -0x03,0x34,0x00,0x78,0x04,0xb0,0x00,0x60,0x03,0x70,0x00,0x49,0x01,0xae,0x00,0x06,0x02,0xf7,0x00,0x1c,0x04,0x40,0x00,0x79,0x04,0x68,0x00,0x21,0x01,0xbb,0x00,0x70,0x01,0xbc,0x00,0x70,0x01,0x78,0x00,0x27,0x01,0xbc,0x00,0x6f,0x03,0x00,0x00,0x30,0x03,0x00,0x01,0x2e,0x03,0x00,0x00,0x30,0x03,0x96,0x00,0x83,0x0b,0xe8,0x00,0x00, -0x0f,0xf4,0x00,0x00,0x02,0xb7,0x00,0x25,0x03,0x4c,0x00,0x5b,0x01,0x11,0xff,0xda,0x02,0x21,0xff,0xf7,0x03,0x1b,0x00,0x0c,0x03,0x72,0x00,0x5b,0x02,0x89,0x00,0x5a,0x03,0xf3,0x00,0x1e,0x04,0x38,0x00,0x5c,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x96, -0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x0a,0xa0,0x00,0xb4,0x04,0x50,0x00,0x40,0x06,0x18,0x00,0x32,0x07,0x57,0x00,0x26,0x07,0x2f,0x00,0xbc,0x05,0x29,0x00,0x16,0x03,0xb2,0x00,0x60, -0x04,0x87,0x00,0xa6,0x05,0xc2,0x00,0x6e,0x05,0xe0,0x00,0x75,0x03,0xe8,0xff,0x9a,0x02,0x81,0x00,0x35,0x05,0x4a,0x00,0x5e,0x04,0x26,0x00,0x60,0x05,0x72,0x00,0x5e,0x04,0x70,0x00,0x60,0x05,0x4a,0x00,0x5e,0x04,0x43,0x00,0x60,0x04,0x52,0x00,0x60,0x05,0xf3,0x00,0x5e,0x04,0xbd,0x00,0x28,0x04,0xa4,0x00,0x02,0x04,0x31,0x00,0x29, -0x05,0xfe,0x00,0x32,0x04,0xea,0xff,0xf9,0x06,0xa8,0x00,0x5a,0x03,0xa4,0x00,0x64,0x04,0x2f,0x00,0x13,0x05,0x10,0x00,0x29,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x02,0xb7,0x00,0x00,0x02,0xc7,0x00,0x23,0x01,0xf0,0xff,0xf6,0x07,0x04,0x00,0xa6,0x04,0xa8,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0x2d,0x00,0x64,0x04,0x2d,0x00,0x54, -0x04,0xb0,0x00,0x80,0x07,0x6c,0x00,0x60,0x07,0x6c,0x00,0x60,0x07,0x8d,0x00,0x60,0x07,0xf8,0x00,0x60,0x07,0xf8,0x00,0x60,0x04,0x61,0x00,0x7d,0x03,0xff,0x00,0xb0,0x02,0x42,0x00,0xa6,0x04,0x01,0x00,0xa6,0x03,0xaa,0x00,0x1c,0x04,0xde,0x00,0x1c,0x03,0xa3,0x00,0x3c,0x05,0x57,0x00,0x3c,0x01,0xfa,0xff,0x92,0x04,0x87,0x00,0x90, -0x04,0xcb,0x00,0x21,0x06,0xe4,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x04,0xeb,0x00,0x0e,0x04,0x4e,0x00,0x0c,0x04,0x9c,0x00,0x0c,0x04,0x4e,0x00,0x0c,0x04,0x2c,0x00,0x1a,0x03,0xac,0xff,0x1f,0x04,0x2c,0xff,0x1f,0x03,0xac,0xfe,0xc8,0x03,0xdf,0x00,0x0e,0x02,0x6e,0x00,0x25,0x02,0xb2,0x00,0x64,0x01,0xf4,0x00,0x00,0x01,0xbf,0x00,0x00, -0x02,0xe4,0x00,0x00,0x04,0xa0,0x00,0x60,0x05,0x10,0x00,0x58,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0xcf, -0x02,0x58,0x00,0x8b,0x02,0x8a,0x00,0x0c,0x02,0x8a,0x00,0x0c,0x00,0x00,0xff,0xd4,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x02,0x01,0x00,0x05,0x02,0x01,0x00,0x05,0x0d,0x74,0x00,0x52,0x07,0xf5,0x00,0x32,0x06,0xf9,0x00,0x32,0x08,0x63,0x00,0x32,0x02,0x4e,0x00,0x29,0x02,0x4e,0xff,0xba,0x02,0x9e,0x00,0x05, -0x03,0x2a,0x00,0x9a,0x02,0x0c,0x00,0x05,0x02,0x26,0x00,0x15,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x21,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x29,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xf8,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x69,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x00,0x00,0xff,0xe7,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, -0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0x12,0x00,0xc4,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xab,0x03,0x57,0x00,0x00, -0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0xfe,0x45,0x02,0xdb,0x00,0x14,0x05,0xfa,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x05,0xae,0xff,0x98,0x04,0x9e,0xff,0x5c,0x0a,0x08,0x00,0x0f,0x08,0x46,0x00,0x12,0x05,0x8c,0x00,0x0f,0x04,0x60,0x00,0x12,0x05,0x9e,0x00,0x10,0x04,0x65,0x00,0x10,0x0a,0xa5,0x00,0x5e,0x07,0xf8,0x00,0x60, -0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x03,0x1b,0x00,0x0c,0x02,0x89,0x00,0x5a,0x04,0xf2,0x00,0x28,0x00,0x00,0xff,0x38,0x05,0x76,0x00,0x50,0x04,0x50,0x00,0xbc,0x02,0xb0,0x00,0x66,0x02,0x6a,0x00,0x66,0x01,0x4c,0x00,0x66,0x03,0xfa,0x00,0x66,0x02,0xb0,0x00,0x66,0x02,0xbe,0x00,0x66,0x02,0x09,0x00,0x3c,0x01,0x9c,0x00,0x0a, -0x03,0xb1,0x00,0x1e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x01,0xbc,0x00,0x70,0x04,0x31,0x00,0x29,0x03,0x68,0x00,0x20,0x04,0xb8,0x00,0x1a,0x04,0x96,0x00,0xbc,0x04,0x62,0x00,0xa7,0x07,0xb2,0x00,0x5a, -0x06,0x77,0x00,0x77,0x06,0x74,0x00,0xa6,0x06,0x50,0x00,0xa6,0x06,0x89,0x00,0x60,0x07,0x8a,0x00,0x90,0x05,0x03,0x00,0x35,0x05,0x7c,0x00,0x68,0x04,0xcf,0x00,0x50,0x03,0x25,0x00,0x50,0x07,0x6e,0x00,0x3c,0x09,0x01,0x00,0x54,0x03,0x85,0x00,0x74,0x09,0x3d,0xff,0xf8,0x04,0x02,0x00,0x65,0x06,0xae,0x00,0xab,0x07,0x59,0x00,0xab, -0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x03,0x57,0x00,0x00,0x06,0x03,0x00,0x9a,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x05,0x58,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x32,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfb,0x6b,0x00,0x00,0xfb,0x9b, -0x00,0x00,0xfc,0x00,0x00,0x00,0xfd,0x71,0x00,0x00,0xfd,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xfe,0x04,0x64,0x00,0xdc,0x00,0x00,0xfe,0xd4,0x04,0xad,0x00,0x65,0x04,0xad,0xff,0xba,0x04,0xae,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba, -0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x03,0xf1,0xff,0xba,0x03,0xf1,0xff,0xba,0x00,0x00,0xfe,0x84,0x03,0x57,0x00,0x00,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba, -0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0x58,0x00,0xab,0x02,0x58,0x00,0xd4,0x02,0x58,0x00,0x66,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x7f,0x02,0x58,0x00,0x4f,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x53,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x59,0x02,0x58,0x00,0x2b, -0x02,0x58,0x00,0x4d,0x0c,0x05,0x00,0xa1,0x0c,0x05,0x00,0xa1,0x07,0x0a,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0a,0x00,0x73,0x07,0x0a,0x00,0x73,0x03,0x4d,0x00,0xf2,0x03,0x4d,0x01,0x2f,0x03,0x4d,0x00,0x76,0x03,0x4d,0x00,0x25,0x03,0x4d,0x00,0xab,0x03,0x4d,0x00,0x62,0x03,0x4d,0x00,0x42,0x03,0x4d,0x00,0x1c, -0x03,0x4d,0x00,0x1d,0x03,0x4d,0x00,0x3c,0x03,0x4d,0x00,0x69,0x03,0x4d,0x00,0x3c,0x03,0x4d,0x00,0x6f,0x03,0x4d,0x00,0x41,0x03,0x4d,0x00,0x6b,0x03,0x57,0x00,0x39,0x05,0x58,0x00,0x9a,0x04,0xf1,0x00,0x55,0x05,0x26,0x00,0x78,0x05,0x30,0x00,0x78,0x07,0x1a,0x00,0x82,0x05,0x27,0x00,0x64,0x05,0x0b,0x00,0x6e,0x06,0x62,0x00,0x28, -0x07,0xce,0x00,0x82,0x05,0x34,0x00,0x82,0x05,0x0b,0x00,0x6e,0x08,0x8a,0x00,0x82,0x05,0x14,0x00,0x82,0x05,0x14,0x00,0xa0,0x07,0x7a,0x00,0x82,0x05,0x0b,0x00,0x6e,0x05,0x63,0x00,0x64,0x06,0x52,0x00,0x82,0x05,0x1a,0x00,0xa0,0x06,0x28,0x00,0x6e,0x06,0xc3,0x00,0x0a,0x07,0x4d,0x00,0x55,0x05,0x1d,0x00,0x5a,0x06,0x24,0x00,0x82, -0x05,0x31,0x00,0x6e,0x05,0x93,0x00,0x32,0x04,0xf8,0x00,0xa0,0x05,0x95,0x00,0x82,0x05,0x00,0x00,0x6e,0x05,0x45,0x00,0x50,0x05,0x7b,0x00,0x32,0x05,0x00,0x00,0xa0,0x06,0x3a,0x00,0x50,0x04,0xc8,0x00,0x50,0x05,0x4e,0x00,0x82,0x06,0x48,0x00,0x64,0x04,0xf2,0x00,0x64,0x05,0x01,0x00,0x64,0x04,0x8d,0x00,0x6e,0x06,0x47,0x00,0x6e, -0x05,0x23,0x00,0x76,0x05,0x31,0x00,0xa0,0x05,0x30,0x00,0x78,0x05,0x96,0x00,0x82,0x03,0x93,0x00,0x00,0x04,0x39,0x00,0x00,0x05,0x23,0x00,0x62,0x06,0x48,0x00,0x64,0x06,0x36,0x00,0x78,0x04,0x56,0x00,0xbe,0x00,0x00,0x14,0xe0,0x19,0x01,0x25,0x01,0x01,0x01,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0c,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x01,0x0c,0x2c,0x01,0x01,0x24,0x01,0x01,0x01,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x09,0x22,0x27,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x2e,0x01,0x0c,0x2e,0x0c,0x01,0x01,0x0c,0x01,0x0d,0x0c,0x0c,0x0c, -0x2e,0x01,0x01,0x01,0x0c,0x19,0x0c,0x01,0x01,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x03,0x0c,0x09,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x23,0x01,0x2a,0x2a,0x01,0x01,0x24,0x1c,0x01,0x0c,0x2a, -0x01,0x1c,0x1c,0x01,0x0c,0x0f,0x01,0x01,0x01,0x01,0x01,0x0c,0x04,0x0c,0x01,0x01,0x01,0x01,0x1f,0x01,0x1c,0x27,0x01,0x01,0x0e,0x01,0x01,0x0c,0x01,0x08,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x0c,0x1b,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x09, -0x09,0x09,0x01,0x01,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0e,0x01,0x01,0x01,0x16,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x01,0x01,0x01,0x10,0x10,0x01,0x01,0x01,0x01,0x2c,0x2e,0x01,0x01,0x01,0x0d,0x01,0x0d,0x01,0x2e,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x01,0x16,0x01,0x16,0x01,0x01,0x0e,0x24,0x0c,0x01,0x15,0x29,0x0d,0x01,0x01,0x01,0x01,0x05,0x0c,0x01,0x19,0x01,0x01,0x12,0x19,0x19,0x19,0x19,0x19,0x01,0x01,0x0d,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x2c, -0x2e,0x2c,0x2e,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x0c,0x0c,0x01,0x01,0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x27,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x04,0x0c,0x0c,0x0c,0x27,0x0c,0x27,0x0c,0x27,0x0c,0x0c,0x01, -0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x03,0x01,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x0e,0x0c,0x01,0x0c,0x24,0x01,0x0c,0x01,0x0c,0x01,0x1b,0x01,0x0c,0x0c,0x01,0x01,0x04,0x0e,0x01,0x01,0x0c,0x0c,0x27,0x0c,0x01, -0x0e,0x0d,0x01,0x0c,0x0c,0x0c,0x0d,0x01,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x0d,0x0d,0x07,0x07,0x01,0x1b,0x01,0x01,0x0c,0x01,0x01,0x0d,0x01,0x01,0x0c,0x01,0x22,0x20,0x0e,0x1a,0x01,0x1f,0x01,0x2c,0x01,0x22,0x01,0x0c,0x01,0x0c,0x0d,0x01,0x0e,0x26,0x26,0x26,0x0c,0x26,0x0d, -0x0e,0x0c,0x0e,0x0c,0x01,0x01,0x01,0x2c,0x01,0x0e,0x0c,0x0e,0x26,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x0e,0x0c,0x01,0x01,0x01,0x0e,0x2d,0x0c,0x0c,0x01,0x0e,0x01,0x01,0x01,0x2e,0x01,0x01,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x0c,0x25,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x25,0x0c, -0x25,0x0c,0x25,0x0c,0x25,0x0c,0x25,0x09,0x0c,0x09,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x07,0x26,0x01,0x24,0x01,0x01,0x23,0x01,0x28,0x01,0x29,0x22,0x01,0x02,0x22,0x0e,0x0c,0x0e,0x0c,0x0e,0x01,0x02,0x01,0x0c,0x20,0x0c,0x01,0x01,0x01,0x0c,0x01,0x01,0x01, -0x01,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x0d,0x01,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x2c,0x2e,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01, -0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x0d,0x01,0x0d,0x03,0x0c,0x03,0x0c,0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x22,0x19,0x22,0x19,0x27,0x0c,0x27,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x16,0x01,0x16,0x01,0x16,0x0c,0x01,0x0c,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x22,0x22, -0x22,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x2a,0x02,0x02,0x19,0x01,0x19,0x19,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, -0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01, -0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x01,0x01,0x29,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x1e,0x01,0x01,0x01,0x01,0x0d,0x01,0x01,0x22,0x05,0x01,0x01,0x01,0x04,0x01,0x04,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x32,0x1a,0x15,0x1a,0x15,0x01,0x22,0x25,0x01,0x01,0x16,0x0a,0x0a,0x01,0x01,0x01,0x01,0x1a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x13,0x15,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x2c,0x2e,0x01,0x0c, -0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x01,0x13,0x15,0x2c,0x2e,0x01,0x01,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x01,0x01,0x01,0x0c,0x30,0x01,0x01,0x01,0x16,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x2e,0x01,0x2e,0x2d,0x2d,0x2e,0x2e,0x01,0x29,0x01,0x01,0x01,0x01,0x0a,0x2e,0x2e,0x01,0x19,0x01,0x01,0x01,0x01,0x16,0x01,0x28,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x03,0x01,0x01,0x1f,0x1a,0x1a,0x01,0x01,0x01,0x19,0x01,0x01, -0x01,0x16,0x2b,0x01,0x01,0x1b,0x1b,0x1b,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x04,0x01,0x2e,0x1b,0x1b,0x07,0x0b,0x16,0x17,0x01,0x01,0x01,0x01,0x25,0x02,0x02,0x01,0x22,0x01,0x2e,0x01,0x1e,0x01,0x01,0x01,0x01,0x07,0x01,0x04,0x2a,0x01,0x01,0x01,0x02,0x01,0x01,0x19,0x01,0x01,0x01,0x0a,0x1a,0x01,0x01,0x26,0x01,0x01,0x01,0x01, -0x07,0x01,0x01,0x01,0x01,0x01,0x0c,0x2e,0x01,0x01,0x01,0x01,0x01,0x08,0x05,0x01,0x01,0x01,0x01,0x07,0x01,0x0b,0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x01,0x1f,0x01,0x01,0x0c,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0b,0x01,0x01,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x26,0x01,0x01,0x2f,0x01,0x0a, -0x2d,0x01,0x01,0x01,0x01,0x2c,0x01,0x09,0x01,0x01,0x10,0x01,0x10,0x01,0x0d,0x0e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x0e,0x0d,0x26,0x01,0x01,0x07,0x26,0x07,0x26,0x0c,0x0c,0x01,0x0c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x0c,0x1f,0x01,0x25,0x2e,0x01,0x01, -0x01,0x0a,0x01,0x01,0x26,0x01,0x30,0x01,0x01,0x22,0x15,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30, -0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30, -0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0d,0x26,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x0c,0x16,0x01,0x01,0x01,0x0c,0x01,0x0e,0x01,0x22,0x01,0x2c,0x29,0x01,0x24,0x01,0x01, -0x01,0x01,0x2f,0x14,0x01,0x19,0x1f,0x01,0x01,0x01,0x1c,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x25,0x01,0x01,0x01,0x02,0x01,0x14,0x01,0x14,0x14,0x01,0x01,0x01,0x01,0x02,0x01,0x25,0x01,0x01,0x14,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x26,0x01,0x01,0x30,0x01,0x05,0x01, -0x01,0x01,0x19,0x01,0x01,0x26,0x2e,0x01,0x01,0x01,0x01,0x01,0x2a,0x18,0x18,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x16,0x2f,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0d,0x01,0x01,0x01,0x0c,0x2e,0x0c,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x16,0x2e,0x01,0x01,0x01,0x01,0x28,0x01,0x01,0x01,0x01,0x0c,0x2e,0x0c,0x2e,0x0c,0x01,0x0d,0x0c, -0x0c,0x01,0x01,0x01,0x19,0x01,0x16,0x01,0x2e,0x2e,0x01,0x01,0x26,0x01,0x01,0x2d,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x25,0x1f,0x01,0x01,0x01,0x01,0x01,0x1b,0x1b,0x01,0x01,0x01,0x1e,0x02,0x02,0x01,0x01,0x1c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x2d,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x14, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x01, -0x01,0x01,0x10,0x10,0x01,0x10,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x10,0x01,0x10,0x10,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x2c,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x30,0x01,0x01,0x01,0x01,0x01,0x19,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x19,0x19,0x19,0x19,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01, -0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x05,0x01,0x01,0x01,0x0c,0x04,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x30,0x01,0x01, -0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x01,0x30,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x01,0x01,0x24,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01, -0x01,0x01,0x01,0x0d,0x01,0x1b,0x26,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x29,0x13,0x01,0x01,0x04,0x1e,0x01,0x01,0x06,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x08,0x2f,0x01,0x2e,0x27,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x13,0x01,0x13,0x01,0x27,0x32,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x1b,0x13,0x13,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x10,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x2f,0x01,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x01,0x08,0x2b,0x17,0x17,0x17,0x19,0x01,0x12,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01, -0x01,0x2b,0x01,0x08,0x08,0x08,0x08,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x08,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x08,0x2b,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0xfd,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x20,0x01,0x09,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x20,0x01,0x2c,0x01,0x01,0x01,0x01,0x28,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x18,0x01,0x01,0x1f,0x10, -0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x0c,0x01,0x28,0x01,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x2f,0x01,0x24,0x24,0x24,0x0f,0x24,0x30,0x24,0x0e,0x02,0x24,0x17,0x01,0x24,0x0e,0x26,0x26,0x16,0x01,0x24,0x0e,0x0e,0x01,0x24,0x24,0x24,0x24,0x24,0x16,0x30,0x01,0x24, -0x01,0x17,0x01,0x01,0x24,0x24,0x16,0x01,0x09,0x16,0x27,0x09,0x01,0x0d,0x09,0x11,0x16,0x1f,0x01,0x01,0x1b,0x09,0x01,0x01,0x27,0x01,0x0a,0x01,0x27,0x01,0x2b,0x01,0x15,0x01,0x0a,0x2b,0x01,0x01,0x01,0x01,0x0a,0x01,0x11,0x01,0x01,0x06,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x0c,0x30,0x01,0x2b,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x04,0x01,0x2e,0x30,0x04,0x01,0x0c,0x09,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x02,0x2d,0x01,0x01,0x31,0x01,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x2d,0x2d,0x2d,0x2d,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x1d,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x31,0x01,0x19,0x31,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x01,0x01,0x01,0x1e,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01,0x01,0x01,0x32,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x24,0x0d,0x01,0x01,0x0c,0x01,0x01,0x03,0x01, -0x01,0x01,0x01,0x22,0x22,0x01,0x2c,0x24,0x27,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x09,0x09,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x0c,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x01,0x0c,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01, -0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x01,0x01,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x30,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,0x01,0x01,0x01,0x01,0x0c,0x01,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x16,0x01,0x01,0x0a,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x28,0x01,0x03,0x01,0x01,0x25,0x01,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x01,0x01,0x14,0x01,0x01,0x01,0x01,0x15,0x01,0x01,0x31,0x31,0x01,0x01,0x01,0x18,0x01,0x01,0x26,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x05, -0x01,0x2d,0x1d,0x0b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x12,0x01,0x2c,0x01,0x07,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x32,0x01,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x01,0x16,0x01,0x1b,0x01,0x29,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x23,0x01,0x01,0x12,0x01,0x01,0x0d,0x27,0x01,0x01,0x25,0x20,0x01,0x17,0x01,0x01,0x17, -0x17,0x01,0x20,0x17,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x20,0x20,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x1e,0x32,0x01,0x15,0x01,0x01,0x01,0x02,0x16,0x01,0x1d,0x01,0x01,0x01,0x01,0x02,0x01,0x11,0x01,0x01,0x01,0x01,0x01,0x26,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x01,0x01,0x19,0x19,0x19,0x19,0x19,0x19,0x01,0x19,0x19, -0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0b,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x12,0x01,0x11,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x01,0x01,0x01, -0x30,0x01,0x01,0x01,0x01,0x01,0x1b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x14,0x29,0x14,0x14,0x14,0x01,0x30,0x30,0x2c,0x01,0x01,0x19,0x19,0x19,0x01,0x19,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,0x01,0x07,0x01,0x01,0x01,0x01,0x01,0x09,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x01,0x07,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x0c,0x01, -0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x08,0x01,0x25,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x26,0x01,0x06,0x1b,0x01,0x01,0x01,0x1b,0x01,0x1a,0x01,0x01,0x01,0x01,0x01,0x01,0x1a,0x25,0x01,0x01,0x25,0x01,0x20,0x01,0x17,0x1a,0x01,0x15,0x2c,0x2c,0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x01,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, -0x27,0x27,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x32, -0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x14,0x01,0x01,0x01,0x22,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x26,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x02,0x01,0x02,0x2e,0x01,0x01,0x01,0x01,0x01,0x28,0x18,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x19,0x27,0x01,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x31,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x1a,0x01,0x01,0x01,0x2c,0x2e,0x01,0x02,0x03, -0x01,0x01,0x01,0x01,0x01,0x01,0x2f,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x06,0x01,0x1f,0x07,0x07,0x01,0x17,0x01,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x0d,0x12,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x1b,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x13,0x07,0x26,0x01,0x01,0x01,0x07,0x01,0x01,0x01,0x01, -0x02,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x02,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x01,0x20,0x01,0x0d,0x01,0x01,0x01,0x01,0x07,0x24,0x04,0x01,0x01,0x10,0x0c,0x2e,0x01,0x25,0x01,0x01,0x07,0x01,0x01,0x01,0x01,0x08,0x08,0x0a,0x01,0x01,0x16,0x10,0x01,0x01,0x0d,0x01,0x01,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2f, -0x2c,0x11,0x01,0x01,0x10,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x01,0x20,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01, -0x01,0x01,0x01,0x01,0x01,0x24,0x03,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x0b,0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x1c,0x01,0x01,0x01,0x01,0x0d,0x2d,0x01,0x2a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, -0x01,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x2c,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x01,0x18,0x30,0x01,0x01,0x18,0x26,0x01,0x01,0x18,0x18,0x01,0x01,0x1e,0x01,0x2b,0x01,0x01,0x1d,0x30,0x01,0x22,0x31,0x01,0x01,0x1c,0x01,0x01,0x2f,0x01,0x08,0x01,0x01, -0x1e,0x08,0x08,0x30,0x01,0x01,0x01,0x01,0x08,0x08,0x01,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x0c,0x00,0xf8,0x08,0xff,0x00,0x08,0x00,0x09,0xff,0xfe,0x00,0x09,0x00,0x0a,0xff,0xfe,0x00,0x0a,0x00,0x0a,0xff,0xfe,0x00,0x0b,0x00,0x0b,0xff,0xfe,0x00,0x0c,0x00,0x0c,0xff,0xfd,0x00,0x0d,0x00,0x0e,0xff,0xfd, -0x00,0x0e,0x00,0x0f,0xff,0xfc,0x00,0x0f,0x00,0x10,0xff,0xfc,0x00,0x10,0x00,0x11,0xff,0xfc,0x00,0x11,0x00,0x12,0xff,0xfb,0x00,0x12,0x00,0x14,0xff,0xfb,0x00,0x13,0x00,0x14,0xff,0xfb,0x00,0x14,0x00,0x17,0xff,0xfb,0x00,0x15,0x00,0x18,0xff,0xfa,0x00,0x16,0x00,0x18,0xff,0xfa,0x00,0x17,0x00,0x19,0xff,0xfa,0x00,0x18,0x00,0x1a, -0xff,0xfa,0x00,0x19,0x00,0x1c,0xff,0xf9,0x00,0x1a,0x00,0x1d,0xff,0xf9,0x00,0x1b,0x00,0x1e,0xff,0xf9,0x00,0x1c,0x00,0x1f,0xff,0xf9,0x00,0x1d,0x00,0x20,0xff,0xf8,0x00,0x1e,0x00,0x21,0xff,0xf8,0x00,0x1f,0x00,0x22,0xff,0xf8,0x00,0x20,0x00,0x24,0xff,0xf7,0x00,0x21,0x00,0x24,0xff,0xf7,0x00,0x22,0x00,0x25,0xff,0xf7,0x00,0x23, -0x00,0x26,0xff,0xf7,0x00,0x24,0x00,0x27,0xff,0xf7,0x00,0x25,0x00,0x28,0xff,0xf6,0x00,0x26,0x00,0x29,0xff,0xf6,0x00,0x27,0x00,0x2a,0xff,0xf6,0x00,0x28,0x00,0x2b,0xff,0xf5,0x00,0x29,0x00,0x2c,0xff,0xf5,0x00,0x2a,0x00,0x2e,0xff,0xf5,0x00,0x2b,0x00,0x2f,0xff,0xf4,0x00,0x2c,0x00,0x30,0xff,0xf4,0x00,0x2d,0x00,0x31,0xff,0xf4, -0x00,0x2e,0x00,0x32,0xff,0xf4,0x00,0x2f,0x00,0x32,0xff,0xf4,0x00,0x30,0x00,0x34,0xff,0xf3,0x00,0x31,0x00,0x35,0xff,0xf3,0x00,0x32,0x00,0x36,0xff,0xf3,0x00,0x33,0x00,0x37,0xff,0xf3,0x00,0x34,0x00,0x38,0xff,0xf2,0x00,0x35,0x00,0x39,0xff,0xf2,0x00,0x36,0x00,0x3a,0xff,0xf2,0x00,0x37,0x00,0x3c,0xff,0xf2,0x00,0x38,0x00,0x3c, -0xff,0xf2,0x00,0x39,0x00,0x3d,0xff,0xf1,0x00,0x3a,0x00,0x3e,0xff,0xf1,0x00,0x3b,0x00,0x3f,0xff,0xf1,0x00,0x3c,0x00,0x41,0xff,0xf0,0x00,0x3d,0x00,0x42,0xff,0xf0,0x00,0x3e,0x00,0x44,0xff,0xf0,0x00,0x3f,0x00,0x45,0xff,0xf0,0x00,0x40,0x00,0x45,0xff,0xef,0x00,0x41,0x00,0x46,0xff,0xef,0x00,0x42,0x00,0x47,0xff,0xef,0x00,0x43, -0x00,0x48,0xff,0xef,0x00,0x44,0x00,0x49,0xff,0xee,0x00,0x45,0x00,0x4a,0xff,0xee,0x00,0x46,0x00,0x4b,0xff,0xee,0x00,0x47,0x00,0x4c,0xff,0xee,0x00,0x48,0x00,0x4d,0xff,0xed,0x00,0x49,0x00,0x4f,0xff,0xed,0x00,0x4a,0x00,0x50,0xff,0xed,0x00,0x4b,0x00,0x51,0xff,0xed,0x00,0x4c,0x00,0x51,0xff,0xec,0x00,0x4d,0x00,0x52,0xff,0xec, -0x00,0x4e,0x00,0x54,0xff,0xec,0x00,0x4f,0x00,0x55,0xff,0xec,0x00,0x50,0x00,0x56,0xff,0xec,0x00,0x51,0x00,0x57,0xff,0xeb,0x00,0x52,0x00,0x58,0xff,0xeb,0x00,0x53,0x00,0x59,0xff,0xeb,0x00,0x54,0x00,0x5a,0xff,0xea,0x00,0x55,0x00,0x5b,0xff,0xea,0x00,0x56,0x00,0x5c,0xff,0xea,0x00,0x57,0x00,0x5e,0xff,0xea,0x00,0x58,0x00,0x5e, -0xff,0xea,0x00,0x59,0x00,0x5f,0xff,0xe9,0x00,0x5a,0x00,0x61,0xff,0xe9,0x00,0x5b,0x00,0x61,0xff,0xe9,0x00,0x5c,0x00,0x63,0xff,0xe8,0x00,0x5d,0x00,0x64,0xff,0xe8,0x00,0x5e,0x00,0x65,0xff,0xe8,0x00,0x5f,0x00,0x66,0xff,0xe7,0x00,0x60,0x00,0x67,0xff,0xe7,0x00,0x61,0x00,0x69,0xff,0xe7,0x00,0x62,0x00,0x69,0xff,0xe7,0x00,0x63, -0x00,0x6a,0xff,0xe7,0x00,0x64,0x00,0x6b,0xff,0xe6,0x00,0x65,0x00,0x6d,0xff,0xe6,0x00,0x66,0x00,0x6e,0xff,0xe6,0x00,0x67,0x00,0x6f,0xff,0xe6,0x00,0x68,0x00,0x70,0xff,0xe5,0x00,0x69,0x00,0x71,0xff,0xe5,0x00,0x6a,0x00,0x72,0xff,0xe5,0x00,0x6b,0x00,0x73,0xff,0xe5,0x00,0x6c,0x00,0x75,0xff,0xe4,0x00,0x6d,0x00,0x76,0xff,0xe4, -0x00,0x6e,0x00,0x76,0xff,0xe4,0x00,0x6f,0x00,0x77,0xff,0xe4,0x00,0x70,0x00,0x79,0xff,0xe4,0x00,0x71,0x00,0x79,0xff,0xe3,0x00,0x72,0x00,0x7b,0xff,0xe3,0x00,0x73,0x00,0x7b,0xff,0xe3,0x00,0x74,0x00,0x7c,0xff,0xe3,0x00,0x75,0x00,0x7d,0xff,0xe2,0x00,0x76,0x00,0x7e,0xff,0xe2,0x00,0x77,0x00,0x80,0xff,0xe2,0x00,0x78,0x00,0x80, -0xff,0xe1,0x00,0x79,0x00,0x82,0xff,0xe1,0x00,0x7a,0x00,0x82,0xff,0xe1,0x00,0x7b,0x00,0x84,0xff,0xe1,0x00,0x7c,0x00,0x85,0xff,0xe1,0x00,0x7d,0x00,0x86,0xff,0xe0,0x00,0x7e,0x00,0x87,0xff,0xe0,0x00,0x7f,0x00,0x88,0xff,0xe0,0x00,0x80,0x00,0x89,0xff,0xdf,0x00,0x81,0x00,0x8a,0xff,0xdf,0x00,0x82,0x00,0x8c,0xff,0xdf,0x00,0x83, -0x00,0x8d,0xff,0xdf,0x00,0x84,0x00,0x8e,0xff,0xde,0x00,0x85,0x00,0x8e,0xff,0xdf,0x00,0x86,0x00,0x8f,0xff,0xde,0x00,0x87,0x00,0x90,0xff,0xde,0x00,0x88,0x00,0x92,0xff,0xde,0x00,0x89,0x00,0x93,0xff,0xdd,0x00,0x8a,0x00,0x94,0xff,0xdd,0x00,0x8b,0x00,0x95,0xff,0xdd,0x00,0x8c,0x00,0x96,0xff,0xdc,0x00,0x8d,0x00,0x97,0xff,0xdc, -0x00,0x8e,0x00,0x99,0xff,0xdc,0x00,0x8f,0x00,0x9a,0xff,0xdc,0x00,0x90,0x00,0x9a,0xff,0xdb,0x00,0x91,0x00,0x9b,0xff,0xdb,0x00,0x92,0x00,0x9c,0xff,0xdb,0x00,0x93,0x00,0x9e,0xff,0xdb,0x00,0x94,0x00,0x9f,0xff,0xda,0x00,0x95,0x00,0xa0,0xff,0xda,0x00,0x96,0x00,0xa1,0xff,0xda,0x00,0x97,0x00,0xa2,0xff,0xda,0x00,0x98,0x00,0xa3, -0xff,0xd9,0x00,0x99,0x00,0xa4,0xff,0xd9,0x00,0x9a,0x00,0xa5,0xff,0xd9,0x00,0x9b,0x00,0xa6,0xff,0xd9,0x00,0x9c,0x00,0xa7,0xff,0xd8,0x00,0x9d,0x00,0xa8,0xff,0xd8,0x00,0x9e,0x00,0xa9,0xff,0xd8,0x00,0x9f,0x00,0xab,0xff,0xd8,0x00,0xa0,0x00,0xab,0xff,0xd7,0x00,0xa1,0x00,0xad,0xff,0xd7,0x00,0xa2,0x00,0xae,0xff,0xd7,0x00,0xa3, -0x00,0xaf,0xff,0xd7,0x00,0xa4,0x00,0xb1,0xff,0xd6,0x00,0xa5,0x00,0xb1,0xff,0xd6,0x00,0xa6,0x00,0xb2,0xff,0xd6,0x00,0xa7,0x00,0xb3,0xff,0xd6,0x00,0xa8,0x00,0xb3,0xff,0xd5,0x00,0xa9,0x00,0xb6,0xff,0xd5,0x00,0xaa,0x00,0xb7,0xff,0xd5,0x00,0xab,0x00,0xb8,0xff,0xd5,0x00,0xac,0x00,0xb8,0xff,0xd4,0x00,0xad,0x00,0xb9,0xff,0xd4, -0x00,0xae,0x00,0xba,0xff,0xd4,0x00,0xaf,0x00,0xbb,0xff,0xd3,0x00,0xb0,0x00,0xbe,0xff,0xd3,0x00,0xb1,0x00,0xbe,0xff,0xd3,0x00,0xb2,0x00,0xbf,0xff,0xd3,0x00,0xb3,0x00,0xc0,0xff,0xd3,0x00,0xb4,0x00,0xc1,0xff,0xd2,0x00,0xb5,0x00,0xc2,0xff,0xd2,0x00,0xb6,0x00,0xc3,0xff,0xd2,0x00,0xb7,0x00,0xc5,0xff,0xd2,0x00,0xb8,0x00,0xc5, -0xff,0xd1,0x00,0xb9,0x00,0xc6,0xff,0xd1,0x00,0xba,0x00,0xc8,0xff,0xd1,0x00,0xbb,0x00,0xc9,0xff,0xd1,0x00,0xbc,0x00,0xca,0xff,0xd0,0x00,0xbd,0x00,0xcb,0xff,0xd0,0x00,0xbe,0x00,0xcb,0xff,0xd0,0x00,0xbf,0x00,0xcd,0xff,0xd0,0x00,0xc0,0x00,0xcd,0xff,0xcf,0x00,0xc1,0x00,0xcf,0xff,0xcf,0x00,0xc2,0x00,0xd0,0xff,0xcf,0x00,0xc3, -0x00,0xd0,0xff,0xcf,0x00,0xc4,0x00,0xd1,0xff,0xce,0x00,0xc5,0x00,0xd3,0xff,0xce,0x00,0xc6,0x00,0xd4,0xff,0xce,0x00,0xc7,0x00,0xd5,0xff,0xce,0x00,0xc8,0x00,0xd6,0xff,0xcd,0x00,0xc9,0x00,0xd7,0xff,0xcd,0x00,0xca,0x00,0xd8,0xff,0xcd,0x00,0xcb,0x00,0xd9,0xff,0xcd,0x00,0xcc,0x00,0xda,0xff,0xcc,0x00,0xcd,0x00,0xdc,0xff,0xcc, -0x00,0xce,0x00,0xdc,0xff,0xcc,0x00,0xcf,0x00,0xdd,0xff,0xcc,0x00,0xd0,0x00,0xde,0xff,0xcb,0x00,0xd1,0x00,0xe0,0xff,0xcb,0x00,0xd2,0x00,0xe1,0xff,0xcb,0x00,0xd3,0x00,0xe2,0xff,0xcb,0x00,0xd4,0x00,0xe3,0xff,0xca,0x00,0xd5,0x00,0xe4,0xff,0xca,0x00,0xd6,0x00,0xe5,0xff,0xca,0x00,0xd7,0x00,0xe6,0xff,0xca,0x00,0xd8,0x00,0xe7, -0xff,0xc9,0x00,0xd9,0x00,0xe8,0xff,0xc9,0x00,0xda,0x00,0xea,0xff,0xc9,0x00,0xdb,0x00,0xeb,0xff,0xc9,0x00,0xdc,0x00,0xeb,0xff,0xc8,0x00,0xdd,0x00,0xed,0xff,0xc8,0x00,0xde,0x00,0xee,0xff,0xc8,0x00,0xdf,0x00,0xee,0xff,0xc8,0x00,0xe0,0x00,0xf0,0xff,0xc7,0x00,0xe1,0x00,0xf1,0xff,0xc7,0x00,0xe2,0x00,0xf3,0xff,0xc6,0x00,0xe3, -0x00,0xf3,0xff,0xc6,0x00,0xe4,0x00,0xf4,0xff,0xc6,0x00,0xe5,0x00,0xf5,0xff,0xc6,0x00,0xe6,0x00,0xf6,0xff,0xc6,0x00,0xe7,0x00,0xf8,0xff,0xc6,0x00,0xe8,0x00,0xf8,0xff,0xc5,0x00,0xe9,0x00,0xfa,0xff,0xc5,0x00,0xea,0x00,0xfb,0xff,0xc5,0x00,0xeb,0x00,0xfb,0xff,0xc5,0x00,0xec,0x00,0xfd,0xff,0xc4,0x00,0xed,0x00,0xfd,0xff,0xc4, -0x00,0xee,0x00,0xff,0xff,0xc4,0x00,0xef,0x01,0x01,0xff,0xc4,0x00,0xf0,0x01,0x01,0xff,0xc3,0x00,0xf1,0x01,0x03,0xff,0xc3,0x00,0xf2,0x01,0x03,0xff,0xc3,0x00,0xf3,0x01,0x04,0xff,0xc3,0x00,0xf4,0x01,0x05,0xff,0xc2,0x00,0xf5,0x01,0x07,0xff,0xc2,0x00,0xf6,0x01,0x08,0xff,0xc2,0x00,0xf7,0x01,0x09,0xff,0xc2,0x00,0xf8,0x01,0x0a, -0xff,0xc1,0x00,0xf9,0x01,0x0b,0xff,0xc1,0x00,0xfa,0x01,0x0c,0xff,0xc1,0x00,0xfb,0x01,0x0d,0xff,0xc1,0x00,0xfc,0x01,0x0f,0xff,0xc0,0x00,0xfd,0x01,0x10,0xff,0xc0,0x00,0xfe,0x01,0x10,0xff,0xc0,0x00,0xff,0x01,0x11,0xff,0xc0,0x00,0x00,0x00,0x11,0x00,0x00,0x14,0xe4,0x0b,0x16,0x07,0x00,0x01,0x03,0x03,0x04,0x07,0x06,0x09,0x09, -0x03,0x03,0x03,0x05,0x08,0x03,0x04,0x03,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x08,0x08,0x08,0x05,0x0b,0x07,0x06,0x07,0x08,0x06,0x06,0x08,0x08,0x03,0x04,0x06,0x05,0x0a,0x08,0x09,0x06,0x08,0x07,0x06,0x06,0x08,0x07,0x0b,0x06,0x05,0x06,0x03,0x04,0x03,0x08,0x05,0x03,0x06,0x07,0x05,0x07,0x06,0x04, -0x07,0x07,0x03,0x03,0x06,0x03,0x09,0x07,0x07,0x07,0x07,0x04,0x05,0x04,0x07,0x05,0x09,0x05,0x05,0x05,0x03,0x03,0x03,0x08,0x07,0x07,0x07,0x06,0x08,0x09,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x04,0x06,0x06,0x05,0x04,0x05,0x06, -0x04,0x0a,0x0a,0x09,0x03,0x05,0x08,0x09,0x09,0x09,0x08,0x08,0x08,0x06,0x07,0x06,0x07,0x08,0x06,0x04,0x05,0x09,0x09,0x07,0x05,0x03,0x03,0x08,0x07,0x06,0x08,0x07,0x06,0x06,0x09,0x07,0x07,0x09,0x0a,0x0a,0x06,0x0b,0x04,0x04,0x03,0x03,0x08,0x06,0x05,0x05,0x02,0x06,0x03,0x03,0x06,0x06,0x04,0x03,0x03,0x04,0x0d,0x07,0x06,0x07, -0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x09,0x09,0x08,0x08,0x08,0x03,0x04,0x04,0x03,0x03,0x02,0x03,0x02,0x04,0x02,0x04,0x05,0x03,0x06,0x05,0x06,0x05,0x03,0x08,0x07,0x05,0x05,0x06,0x07,0x08,0x08,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x05,0x08,0x07,0x03,0x06,0x05,0x07,0x05,0x07,0x05,0x07,0x05,0x03,0x07,0x06,0x07,0x06,0x08,0x07,0x08, -0x06,0x06,0x06,0x06,0x05,0x03,0x05,0x03,0x05,0x03,0x08,0x07,0x08,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x04,0x06,0x05,0x08,0x07,0x08,0x07,0x06,0x05,0x06,0x05,0x05,0x08,0x07,0x07,0x07,0x05,0x07,0x05,0x09,0x05,0x05,0x04,0x0c,0x07,0x06,0x07,0x03,0x04,0x09,0x04,0x07,0x04,0x04,0x07,0x04,0x07,0x06,0x07,0x05,0x07, -0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x06,0x06,0x06,0x05,0x03,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x06,0x05,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x0b,0x09,0x05,0x05,0x03,0x07,0x06,0x09,0x09,0x09, -0x07,0x03,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x05,0x05,0x03,0x05,0x06,0x07,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x03,0x03,0x03,0x07,0x06,0x09,0x04,0x09,0x07,0x09,0x03,0x07,0x06,0x06,0x06,0x08,0x03,0x06,0x07,0x0a,0x08,0x06,0x09,0x08,0x06,0x06,0x06,0x05,0x06,0x09,0x09,0x03,0x05,0x07,0x05,0x07,0x03,0x07,0x06,0x06,0x05,0x07,0x07,0x03, -0x06,0x05,0x07,0x06,0x05,0x07,0x07,0x05,0x07,0x06,0x09,0x09,0x03,0x07,0x07,0x07,0x09,0x06,0x08,0x05,0x07,0x06,0x03,0x0b,0x0b,0x08,0x06,0x06,0x08,0x07,0x06,0x06,0x05,0x08,0x06,0x0b,0x06,0x08,0x08,0x06,0x07,0x0a,0x08,0x09,0x08,0x06,0x07,0x06,0x06,0x07,0x06,0x08,0x07,0x0b,0x0b,0x08,0x09,0x06,0x07,0x0b,0x07,0x06,0x07,0x06, -0x05,0x06,0x06,0x09,0x05,0x07,0x07,0x06,0x06,0x08,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x09,0x05,0x07,0x07,0x09,0x09,0x07,0x08,0x06,0x05,0x09,0x06,0x06,0x07,0x05,0x05,0x05,0x03,0x09,0x09,0x07,0x06,0x05,0x07,0x05,0x04,0x0b,0x0c,0x07,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x06,0x09,0x07,0x08,0x07,0x03,0x04,0x03,0x03,0x05,0x05, -0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x03,0x03,0x03,0x05,0x05,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09, -0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x04,0x06,0x06,0x08,0x07,0x03,0x04,0x03,0x03,0x06,0x05,0x0b,0x09,0x07,0x06,0x06,0x05,0x08,0x07,0x05,0x05,0x05,0x05,0x07,0x05,0x07, -0x07,0x07,0x07,0x08,0x06,0x08,0x07,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x06,0x07,0x07,0x05,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08, -0x07,0x08,0x07,0x08,0x07,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x05,0x03,0x05,0x03,0x05,0x03,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x06,0x07,0x06,0x07,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x05,0x06,0x05,0x06, -0x05,0x06,0x05,0x06,0x04,0x06,0x04,0x06,0x04,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x05,0x07,0x05,0x0b,0x09,0x0b,0x09,0x06,0x05,0x06,0x05,0x05,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x07,0x04,0x09,0x05,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x05, -0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x05,0x05,0x07,0x07,0x03,0x03,0x07,0x07,0x07,0x07,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a, -0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x09,0x09,0x08,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x06,0x06,0x06,0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07,0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x05,0x08,0x08,0x06,0x06,0x07,0x06,0x06,0x05,0x08,0x07,0x0a,0x03,0x03,0x06,0x05,0x03,0x05, -0x0a,0x08,0x06,0x08,0x0b,0x09,0x07,0x06,0x06,0x06,0x05,0x06,0x03,0x04,0x06,0x04,0x06,0x08,0x08,0x06,0x06,0x06,0x05,0x07,0x07,0x05,0x05,0x06,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x0e,0x0d,0x0b,0x09,0x08,0x06,0x0c,0x0b,0x09,0x07,0x06,0x03,0x03,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x07,0x06, -0x07,0x06,0x09,0x09,0x08,0x06,0x08,0x07,0x06,0x06,0x08,0x06,0x08,0x06,0x07,0x05,0x03,0x0e,0x0d,0x0b,0x08,0x07,0x0b,0x08,0x08,0x07,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x06,0x04,0x07,0x04,0x08,0x07,0x08,0x07,0x06,0x05,0x08,0x07,0x08,0x06,0x06,0x06,0x05,0x07,0x06,0x09,0x07,0x09, -0x07,0x09,0x07,0x09,0x07,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x05,0x05,0x06,0x06,0x03,0x06,0x07,0x06,0x05,0x05,0x06,0x06,0x06,0x03,0x03,0x04,0x03,0x04,0x03,0x07,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x08,0x08,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x03,0x03, -0x03,0x03,0x04,0x04,0x07,0x07,0x06,0x05,0x08,0x05,0x05,0x05,0x06,0x05,0x05,0x04,0x04,0x04,0x05,0x07,0x05,0x06,0x06,0x06,0x03,0x05,0x04,0x06,0x04,0x04,0x0a,0x0a,0x0b,0x07,0x05,0x08,0x09,0x06,0x06,0x05,0x05,0x06,0x07,0x06,0x07,0x06,0x07,0x09,0x06,0x08,0x06,0x06,0x05,0x05,0x05,0x07,0x06,0x07,0x05,0x0a,0x09,0x07,0x06,0x07, -0x06,0x07,0x05,0x07,0x05,0x07,0x06,0x06,0x04,0x06,0x06,0x05,0x03,0x08,0x05,0x05,0x0a,0x07,0x07,0x06,0x0a,0x08,0x07,0x05,0x0a,0x08,0x08,0x06,0x0a,0x08,0x06,0x05,0x09,0x08,0x08,0x06,0x08,0x06,0x08,0x06,0x0e,0x0c,0x09,0x07,0x0c,0x0a,0x0a,0x07,0x06,0x05,0x06,0x04,0x05,0x00,0x00,0x0b,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x06, -0x05,0x06,0x05,0x08,0x06,0x09,0x07,0x0b,0x09,0x08,0x06,0x07,0x05,0x06,0x05,0x0a,0x08,0x08,0x06,0x09,0x07,0x09,0x07,0x03,0x0b,0x09,0x06,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x09,0x09,0x06,0x06,0x08,0x06,0x08,0x06,0x0b,0x09,0x06,0x05,0x06,0x05,0x08,0x07,0x08,0x07,0x09,0x07,0x08,0x07,0x07,0x05,0x06,0x05,0x06,0x05, -0x06,0x05,0x07,0x07,0x09,0x08,0x06,0x07,0x09,0x09,0x09,0x08,0x06,0x05,0x0a,0x09,0x0b,0x09,0x08,0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x06,0x04,0x04,0x02,0x02,0x02,0x02,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x02,0x04,0x04,0x02,0x02,0x06,0x06, -0x06,0x06,0x04,0x03,0x03,0x04,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x03,0x02,0x03,0x03,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04, -0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06, -0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x07,0x04,0x07,0x07,0x04,0x04,0x04,0x04,0x04,0x03, -0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x07,0x09,0x05,0x05,0x06,0x06,0x05,0x05,0x03,0x03,0x06,0x04,0x08,0x07,0x07,0x05,0x07,0x07,0x07,0x0a,0x06,0x07,0x07,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x06,0x05,0x09,0x05,0x05,0x05,0x06,0x05,0x05, -0x07,0x05,0x07,0x06,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x05,0x05,0x02,0x03,0x04,0x03,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x03,0x05,0x06,0x03,0x03,0x04,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x02,0x03,0x05,0x04,0x04,0x03,0x04,0x04,0x04,0x02,0x04,0x04,0x05,0x03,0x04,0x04,0x03,0x04,0x04,0x03,0x02,0x02,0x04,0x03,0x04,0x03, -0x04,0x04,0x03,0x06,0x02,0x04,0x06,0x0a,0x07,0x06,0x06,0x09,0x07,0x09,0x08,0x06,0x06,0x06,0x05,0x0c,0x05,0x06,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x02,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x05,0x04,0x07,0x07,0x04,0x09,0x06,0x07,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x06,0x0a,0x07,0x04,0x03,0x06, -0x06,0x07,0x07,0x07,0x04,0x07,0x06,0x03,0x09,0x07,0x07,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x05,0x05,0x08,0x03,0x05,0x03,0x07,0x05,0x04,0x03,0x03,0x04,0x03,0x02,0x02,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03, -0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x05,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, -0x0f,0x0f,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x09,0x07,0x08,0x06,0x08,0x07,0x0a,0x08,0x06,0x04,0x06,0x08,0x06,0x09,0x08,0x00,0x00,0x00,0x00,0x03,0x03,0x03, -0x03,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x0b,0x05,0x03,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x0b,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x04,0x06,0x04,0x08,0x07,0x06,0x04,0x09,0x06,0x09,0x03,0x04,0x06,0x06,0x07,0x07,0x07,0x06,0x06,0x06,0x09,0x03,0x06,0x03,0x06,0x05,0x03,0x03, -0x06,0x03,0x08,0x03,0x0a,0x06,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0d,0x0f,0x0f,0x09,0x09,0x06,0x06,0x02,0x0b,0x08,0x09,0x07,0x06,0x07,0x06,0x06,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x07,0x00,0x07,0x07,0x07,0x04,0x06,0x06,0x0a,0x04,0x0a,0x04,0x06,0x07,0x06,0x05,0x0a,0x06,0x0a,0x06, -0x08,0x09,0x04,0x06,0x06,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x0a,0x04,0x06,0x05,0x07,0x06,0x04,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x03,0x06,0x04,0x0b,0x06,0x06,0x07,0x07,0x0b,0x06,0x00,0x00,0x00,0x07,0x00,0x07,0x07,0x07,0x07,0x08,0x07,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06, -0x08,0x09,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x06,0x06,0x06,0x06,0x0b,0x0b, -0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x08,0x08,0x0c,0x0b,0x0a,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x07,0x04,0x07,0x04,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x0a,0x08,0x09,0x04, -0x06,0x08,0x09,0x08,0x09,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x09,0x0f,0x0b,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x04,0x06,0x06,0x07,0x0e,0x09,0x06,0x11,0x0c,0x04, -0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x05,0x08,0x07,0x07,0x06,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x0e,0x11,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x05,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x0d, -0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0a,0x06,0x06,0x0a,0x06,0x06,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x07,0x04,0x04,0x05,0x05,0x0d,0x09,0x07,0x06,0x06,0x00,0x06,0x06,0x06,0x04,0x06,0x08,0x07,0x06,0x06,0x04,0x03,0x08,0x06,0x07, -0x04,0x06,0x05,0x05,0x05,0x05,0x03,0x06,0x05,0x07,0x05,0x06,0x05,0x06,0x05,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x05,0x05,0x03,0x06,0x06,0x07,0x06,0x04,0x08,0x06,0x07,0x06,0x07,0x05,0x06,0x06,0x04,0x08,0x04,0x05,0x05,0x05,0x07,0x07,0x06,0x0b,0x06,0x0b,0x04,0x03,0x02,0x06,0x02,0x01,0x00,0x02, -0x02,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0a,0x05,0x08,0x07,0x0b,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x09,0x05,0x09,0x05,0x09,0x07,0x08,0x08,0x08,0x08,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x06,0x0c,0x09,0x05,0x05,0x03, -0x03,0x03,0x04,0x03,0x06,0x03,0x03,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x07,0x06,0x05,0x05,0x07,0x03,0x04,0x07,0x07,0x03,0x06,0x06,0x06,0x08,0x07,0x03,0x04,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x06,0x09,0x08,0x06,0x06,0x06,0x03,0x04,0x06,0x06, -0x06,0x06,0x06,0x07,0x07,0x05,0x07,0x06,0x06,0x08,0x06,0x08,0x06,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x06,0x05,0x05,0x07,0x03,0x04,0x07,0x03,0x06,0x06,0x06,0x07,0x04,0x07,0x07,0x07,0x06,0x07,0x06,0x09,0x08,0x03,0x06,0x06,0x07,0x07,0x0d,0x00,0x07,0x06,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x08,0x07,0x07,0x08,0x06,0x07,0x08,0x08,0x05,0x07,0x08,0x08,0x07,0x08,0x09,0x09,0x07,0x06,0x06,0x08,0x08,0x06,0x08,0x07,0x07,0x07,0x08,0x08,0x06,0x07,0x07,0x07,0x09,0x07,0x07,0x07,0x07,0x09,0x05,0x06, -0x06,0x0a,0x06,0x06,0x08,0x0a,0x07,0x06,0x0c,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x08,0x09,0x0a,0x06,0x09,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x08,0x06,0x07,0x07,0x06,0x06,0x07,0x0b,0x06,0x06,0x06,0x06,0x05,0x04,0x06,0x06,0x06,0x06,0x06,0x0a,0x06,0x0a,0x05,0x06,0x0a,0x07,0x06,0x0a,0x08,0x08,0x0a,0x06,0x06,0x0a,0x0a, -0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x07,0x06,0x06,0x06,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x09,0x08,0x07,0x06,0x09,0x07,0x08,0x06,0x07,0x08,0x08,0x08,0x06,0x08,0x07,0x08,0x07,0x09,0x08,0x08,0x08,0x08,0x07,0x08,0x07,0x08,0x09,0x07,0x08,0x08,0x01,0x01,0x02,0x02,0x02,0x03,0x04,0x09,0x06, -0x07,0x07,0x06,0x07,0x06,0x06,0x07,0x07,0x06,0x03,0x09,0x06,0x06,0x07,0x06,0x07,0x06,0x06,0x03,0x06,0x06,0x07,0x05,0x09,0x06,0x06,0x07,0x07,0x09,0x06,0x06,0x04,0x09,0x06,0x07,0x08,0x07,0x03,0x03,0x0c,0x0c,0x0c,0x0c,0x10,0x06,0x06,0x03,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x07,0x03,0x03,0x05,0x05,0x08,0x07,0x07,0x05,0x07,0x05,0x05,0x05,0x07,0x06,0x09,0x06,0x05,0x05,0x08,0x09,0x05,0x07,0x05, -0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x06,0x03,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07, -0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x08,0x07,0x06,0x05,0x04,0x06,0x05,0x05,0x07,0x07,0x03,0x05,0x06,0x08,0x07,0x05,0x07,0x07,0x05,0x05,0x05,0x05,0x07,0x06,0x07,0x07,0x06,0x05,0x07,0x03,0x07,0x05,0x07,0x03,0x05, -0x05,0x06,0x04,0x06,0x05,0x03,0x03,0x03,0x09,0x09,0x07,0x05,0x05,0x07,0x06,0x05,0x05,0x04,0x06,0x05,0x08,0x05,0x07,0x07,0x05,0x06,0x08,0x07,0x07,0x07,0x05,0x06,0x05,0x05,0x07,0x06,0x07,0x06,0x09,0x09,0x06,0x08,0x05,0x06,0x09,0x05,0x04,0x06,0x06,0x07,0x0a,0x0a,0x07,0x06,0x06,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x06, -0x06,0x04,0x07,0x07,0x06,0x06,0x05,0x0a,0x08,0x05,0x06,0x07,0x07,0x07,0x07,0x08,0x08,0x04,0x0b,0x06,0x05,0x06,0x07,0x07,0x06,0x06,0x03,0x09,0x08,0x08,0x05,0x08,0x03,0x03,0x05,0x05,0x03,0x03,0x07,0x04,0x03,0x09,0x08,0x03,0x02,0x02,0x05,0x04,0x04,0x03,0x03,0x03,0x04,0x07,0x05,0x03,0x07,0x08,0x07,0x06,0x06,0x08,0x07,0x07, -0x04,0x05,0x06,0x05,0x02,0x03,0x04,0x06,0x04,0x07,0x07,0x07,0x0a,0x08,0x0a,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x08,0x09,0x04,0x04,0x06,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x06,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x06,0x06,0x0a,0x0a,0x06,0x06,0x08,0x09,0x04, -0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x0b,0x08,0x09,0x06,0x06,0x06,0x07,0x04,0x07,0x08,0x06,0x06,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0a,0x04,0x08,0x06,0x06,0x03,0x06,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06, -0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x06,0x06,0x08,0x06,0x06,0x0a,0x06,0x0c,0x0b,0x0a,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x07, -0x07,0x07,0x07,0x07,0x04,0x07,0x07,0x04,0x04,0x07,0x04,0x07,0x04,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x00,0x0d,0x09,0x0f,0x0b,0x0a,0x06,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x05,0x0d,0x09,0x0b,0x0b,0x0a,0x0a,0x0a, -0x06,0x06,0x06,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x0d,0x09,0x06,0x07,0x06,0x06,0x06,0x07,0x06,0x06,0x0d,0x0d,0x09,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x06,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x06,0x07,0x06,0x06,0x0d,0x0d,0x09,0x09,0x0d,0x0d, -0x09,0x09,0x09,0x09,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, -0x0a,0x0a,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x09,0x07,0x07,0x07,0x03,0x03,0x06,0x05,0x06,0x07,0x06,0x06,0x06,0x07, -0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x07,0x08,0x09,0x07,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x07,0x07,0x07,0x06,0x07,0x06,0x07,0x07,0x06,0x06,0x08,0x07,0x08,0x07,0x07,0x07,0x06,0x06,0x08, -0x08,0x08,0x08,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x0a,0x09,0x06,0x08,0x09,0x08,0x07,0x09,0x08,0x08,0x08,0x07,0x07,0x08,0x09,0x08,0x07,0x08,0x06,0x06,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x08,0x09,0x08,0x08,0x08,0x07,0x0a,0x08,0x09,0x08,0x08,0x06,0x08,0x08,0x08,0x09,0x08,0x08,0x0a,0x06,0x06,0x06,0x06,0x07,0x07, -0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x05,0x06,0x06,0x06,0x07,0x08,0x09,0x07,0x07,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x06,0x05,0x05,0x07,0x05,0x06,0x05,0x06,0x09,0x06,0x09,0x06,0x06,0x06,0x08,0x03,0x09,0x08,0x08,0x07,0x06,0x08,0x07, -0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x0a,0x0a,0x0a,0x0a,0x05,0x08,0x08,0x05,0x04,0x05,0x06,0x06,0x05,0x09,0x09,0x09,0x05, -0x0b,0x05,0x09,0x09,0x09,0x09,0x06,0x05,0x05,0x09,0x06,0x09,0x07,0x06,0x05,0x04,0x0b,0x05,0x06,0x05,0x05,0x05,0x05,0x05,0x0f,0x09,0x09,0x05,0x03,0x05,0x03,0x05,0x03,0x03,0x03,0x05,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x05,0x09,0x03,0x0a,0x0a,0x0a,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x0d,0x0d,0x07,0x0d,0x0d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x06,0x05,0x06,0x05,0x04,0x04,0x08,0x06,0x08,0x05,0x0c,0x0a,0x07,0x06,0x0a,0x09,0x09,0x08,0x0b,0x09,0x0a,0x09,0x07,0x05, -0x08,0x06,0x0a,0x08,0x08,0x07,0x08,0x07,0x0a,0x07,0x0a,0x07,0x0c,0x09,0x08,0x06,0x08,0x06,0x0d,0x0a,0x09,0x00,0x0b,0x0b,0x0b,0x05,0x00,0x00,0x06,0x06,0x08,0x06,0x06,0x05,0x0c,0x0a,0x0a,0x09,0x08,0x06,0x08,0x06,0x06,0x05,0x08,0x07,0x06,0x05,0x09,0x07,0x07,0x06,0x0b,0x09,0x06,0x06,0x08,0x08,0x09,0x05,0x02,0x05,0x08,0x05, -0x0b,0x0b,0x03,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x04,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x07,0x08,0x03,0x02,0x03,0x02,0x08,0x06,0x08,0x07,0x06,0x05,0x06,0x05,0x07,0x06,0x05,0x05,0x0c,0x09,0x0d,0x0a,0x0b,0x09,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x07,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x03,0x05, -0x03,0x08,0x06,0x09,0x07,0x0f,0x0b,0x06,0x06,0x08,0x08,0x09,0x09,0x08,0x06,0x0b,0x09,0x06,0x04,0x06,0x05,0x07,0x05,0x0a,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x05,0x04,0x05,0x04,0x05,0x04,0x06,0x06,0x03,0x07,0x04,0x0b,0x07,0x04,0x06,0x07,0x05,0x08,0x06,0x04,0x04,0x06,0x06,0x06,0x05,0x03,0x08,0x07,0x04,0x04,0x07,0x05,0x08, -0x04,0x09,0x07,0x07,0x05,0x08,0x06,0x06,0x05,0x08,0x06,0x07,0x04,0x06,0x05,0x08,0x05,0x06,0x09,0x05,0x06,0x0a,0x03,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x05,0x07,0x08,0x0a,0x08,0x0a,0x03,0x05,0x07,0x09,0x0b,0x08,0x0b,0x07,0x07,0x09,0x08,0x0d,0x0a,0x06,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x09,0x09, -0x09,0x09,0x0b,0x06,0x06,0x0b,0x08,0x06,0x06,0x08,0x07,0x04,0x04,0x07,0x06,0x06,0x06,0x06,0x08,0x04,0x04,0x09,0x08,0x04,0x04,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x06,0x04,0x06,0x06, -0x08,0x07,0x06,0x0a,0x07,0x08,0x08,0x09,0x09,0x06,0x05,0x0b,0x09,0x0b,0x09,0x08,0x06,0x03,0x03,0x06,0x07,0x04,0x07,0x06,0x06,0x05,0x08,0x09,0x04,0x06,0x05,0x02,0x04,0x06,0x06,0x02,0x02,0x02,0x02,0x04,0x04,0x04,0x05,0x10,0x16,0x04,0x05,0x01,0x03,0x04,0x05,0x03,0x05,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, -0x05,0x05,0x05,0x05,0x05,0x0f,0x06,0x08,0x0a,0x0a,0x07,0x05,0x07,0x08,0x08,0x05,0x03,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x08,0x07,0x06,0x06,0x08,0x07,0x09,0x05,0x06,0x07,0x04,0x06,0x04,0x04,0x03,0x0a,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x06,0x03,0x06,0x05,0x07,0x05,0x07,0x03,0x06,0x07,0x09,0x09,0x07, -0x06,0x06,0x06,0x06,0x05,0x06,0x05,0x05,0x03,0x04,0x03,0x02,0x04,0x06,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x03,0x03,0x03,0x03,0x03,0x13,0x0b,0x0a,0x0c,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x0a,0x04,0x04,0x0a,0x03,0x06, -0x06,0x0f,0x0b,0x0b,0x0f,0x0a,0x06,0x06,0x0a,0x06,0x06,0x05,0x05,0x00,0x00,0x04,0x08,0x07,0x08,0x06,0x0e,0x0b,0x08,0x06,0x08,0x06,0x0f,0x0b,0x08,0x06,0x04,0x03,0x07,0x00,0x08,0x06,0x04,0x03,0x02,0x05,0x04,0x04,0x03,0x02,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x06,0x06,0x06,0x0b,0x09,0x09,0x09,0x09, -0x0a,0x07,0x08,0x07,0x04,0x0a,0x0c,0x05,0x0d,0x06,0x09,0x0a,0x0a,0x0a,0x05,0x08,0x0b,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x06,0x06,0x09,0x06,0x06,0x0a,0x04,0x04,0x0a,0x04,0x04,0x0a,0x05,0x05,0x00,0x05,0x09,0x04,0x04,0x0b,0x06,0x06,0x08,0x06,0x06,0x07,0x03,0x03, -0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x11,0x11,0x0a,0x00,0x00,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x0a,0x07,0x07,0x09,0x0b,0x07,0x07,0x0c,0x07,0x07,0x0a,0x07,0x07,0x09,0x07,0x08,0x09,0x0a,0x07,0x08,0x07,0x08,0x07,0x08, -0x07,0x07,0x08,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x06,0x09,0x07,0x07,0x07,0x08,0x05,0x06,0x07,0x09,0x09,0x06,0x00,0x00,0x0c,0x18,0x08,0x00,0x01,0x03,0x03,0x05,0x07,0x06,0x0a,0x0a,0x03,0x04,0x04,0x05,0x08,0x03,0x05,0x03,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x08,0x08,0x08,0x05,0x0b,0x08,0x07, -0x08,0x08,0x06,0x06,0x08,0x09,0x03,0x04,0x07,0x06,0x0b,0x09,0x09,0x07,0x09,0x07,0x06,0x06,0x08,0x07,0x0b,0x07,0x07,0x07,0x04,0x05,0x04,0x08,0x05,0x03,0x06,0x07,0x06,0x07,0x06,0x04,0x07,0x07,0x03,0x03,0x06,0x03,0x0b,0x07,0x07,0x07,0x07,0x04,0x05,0x04,0x07,0x06,0x09,0x06,0x06,0x05,0x04,0x03,0x04,0x08,0x08,0x08,0x08,0x06, -0x09,0x09,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x06,0x06,0x05,0x05,0x06,0x07,0x05,0x0b,0x0b,0x09,0x03,0x05,0x08,0x0a,0x09,0x0a,0x08,0x08,0x08,0x06,0x07,0x06,0x07,0x09,0x06,0x05,0x05,0x09,0x0a,0x07,0x05,0x03,0x03,0x08, -0x08,0x06,0x08,0x08,0x06,0x06,0x09,0x08,0x08,0x09,0x0b,0x0b,0x06,0x0c,0x05,0x05,0x03,0x03,0x08,0x07,0x06,0x07,0x02,0x06,0x04,0x04,0x07,0x07,0x05,0x03,0x03,0x05,0x0f,0x08,0x06,0x08,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x09,0x09,0x08,0x08,0x08,0x03,0x04,0x04,0x04,0x04,0x02,0x03,0x02,0x04,0x02,0x04,0x06,0x03,0x06,0x05,0x07, -0x05,0x03,0x08,0x07,0x07,0x06,0x07,0x07,0x08,0x08,0x04,0x04,0x04,0x0b,0x0b,0x0b,0x06,0x08,0x07,0x03,0x06,0x05,0x08,0x06,0x08,0x06,0x07,0x05,0x03,0x08,0x06,0x08,0x06,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x03,0x06,0x04,0x06,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x04,0x06,0x05,0x08,0x07, -0x08,0x07,0x07,0x05,0x07,0x05,0x06,0x09,0x09,0x07,0x07,0x05,0x07,0x06,0x09,0x05,0x06,0x05,0x0d,0x07,0x06,0x07,0x03,0x05,0x0a,0x04,0x07,0x04,0x04,0x07,0x04,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x07, -0x06,0x06,0x06,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x06,0x05,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x0b,0x09,0x07,0x06,0x03,0x08,0x06,0x0a,0x0a,0x09,0x07,0x03,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x07,0x06,0x03,0x05,0x06,0x07,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x03,0x03,0x03,0x08,0x07,0x09,0x05,0x0a, -0x08,0x0a,0x03,0x08,0x07,0x06,0x07,0x09,0x03,0x07,0x08,0x0b,0x09,0x06,0x09,0x09,0x07,0x06,0x06,0x07,0x07,0x09,0x09,0x03,0x07,0x07,0x05,0x07,0x03,0x07,0x07,0x06,0x05,0x07,0x07,0x03,0x06,0x06,0x07,0x06,0x05,0x07,0x07,0x06,0x07,0x06,0x09,0x0b,0x03,0x07,0x07,0x07,0x0b,0x06,0x08,0x06,0x07,0x06,0x03,0x0c,0x0c,0x09,0x07,0x07, -0x09,0x08,0x07,0x07,0x06,0x08,0x06,0x0b,0x07,0x09,0x09,0x07,0x08,0x0b,0x09,0x09,0x09,0x07,0x08,0x06,0x07,0x09,0x07,0x09,0x08,0x0b,0x0c,0x08,0x09,0x07,0x07,0x0c,0x07,0x06,0x07,0x06,0x05,0x06,0x06,0x09,0x05,0x07,0x07,0x06,0x07,0x09,0x07,0x07,0x07,0x07,0x06,0x05,0x06,0x09,0x06,0x07,0x07,0x0b,0x0b,0x07,0x09,0x06,0x06,0x0a, -0x06,0x06,0x07,0x05,0x06,0x05,0x03,0x09,0x0a,0x07,0x06,0x06,0x07,0x06,0x05,0x0c,0x0d,0x08,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x07,0x09,0x07,0x08,0x07,0x04,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08, -0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08, -0x07,0x08,0x07,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x04,0x06,0x06,0x09,0x07,0x03,0x04,0x03,0x03,0x06,0x05,0x0c,0x09,0x07,0x06,0x07,0x06,0x09,0x07,0x07,0x06,0x07,0x06,0x08,0x06,0x08,0x07,0x08,0x07,0x09,0x06,0x09,0x07,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x06,0x07, -0x07,0x07,0x07,0x07,0x07,0x08,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x0b,0x0b,0x0b,0x0b,0x0b, -0x0b,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x04,0x06,0x04,0x06,0x04,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x06,0x07,0x06,0x0b,0x09,0x0b, -0x09,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x05,0x07,0x05,0x07,0x05,0x07,0x04,0x09,0x06,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x03, -0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x05,0x05,0x07,0x07,0x03,0x03,0x07, -0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08, -0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x07,0x07,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x08,0x09,0x07,0x07,0x07,0x06,0x07,0x06,0x08,0x07,0x0a,0x03,0x03,0x07,0x06,0x03,0x06,0x0b,0x09,0x07,0x09,0x0c,0x09,0x07,0x07,0x07,0x06,0x05,0x06,0x04,0x04,0x06,0x04,0x06,0x09,0x09,0x07,0x06,0x07,0x05,0x07,0x07,0x05,0x05,0x06, -0x06,0x05,0x05,0x07,0x03,0x05,0x05,0x03,0x0f,0x0e,0x0c,0x0a,0x09,0x06,0x0d,0x0c,0x0a,0x08,0x06,0x03,0x03,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x08,0x06,0x08,0x06,0x0a,0x0a,0x08,0x07,0x08,0x07,0x07,0x06,0x09,0x07,0x09,0x07,0x07,0x05,0x03,0x0f,0x0e,0x0c,0x08,0x07,0x0c,0x08,0x09,0x07,0x08,0x06, -0x08,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x08,0x07,0x08,0x07,0x06,0x05,0x09,0x07,0x09,0x07,0x07,0x07,0x05,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x06,0x07,0x05,0x05,0x06,0x07,0x03,0x07, -0x07,0x06,0x06,0x05,0x07,0x07,0x07,0x03,0x03,0x04,0x03,0x05,0x03,0x07,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x08,0x09,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x04,0x04,0x07,0x07,0x07,0x06,0x09,0x06,0x05,0x05,0x06,0x05,0x05,0x04,0x04,0x04,0x06,0x07,0x06,0x07,0x06,0x07,0x03,0x06,0x05,0x07, -0x04,0x04,0x0b,0x0b,0x0c,0x07,0x06,0x09,0x0a,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x08,0x07,0x08,0x0a,0x07,0x08,0x07,0x07,0x05,0x06,0x05,0x07,0x06,0x07,0x06,0x0b,0x0a,0x07,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x08,0x07,0x07,0x05,0x07,0x07,0x06,0x03,0x09,0x06,0x06,0x0a,0x08,0x08,0x07,0x0b,0x09,0x08,0x06,0x0a,0x08,0x09,0x07, -0x0b,0x09,0x06,0x05,0x09,0x09,0x09,0x07,0x09,0x07,0x09,0x07,0x10,0x0d,0x0a,0x08,0x0e,0x0b,0x0a,0x08,0x07,0x05,0x06,0x05,0x05,0x00,0x00,0x0c,0x0b,0x07,0x06,0x07,0x07,0x07,0x06,0x06,0x05,0x07,0x06,0x09,0x07,0x0a,0x08,0x0c,0x0a,0x09,0x07,0x07,0x06,0x06,0x05,0x0a,0x08,0x08,0x07,0x0a,0x08,0x0a,0x08,0x03,0x0b,0x09,0x07,0x06, -0x09,0x07,0x08,0x07,0x08,0x06,0x08,0x06,0x0a,0x0a,0x06,0x06,0x09,0x06,0x09,0x06,0x0b,0x09,0x07,0x05,0x06,0x05,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x08,0x07,0x09,0x09,0x07,0x07,0x0a,0x0a,0x0a,0x09,0x07,0x06,0x0b,0x0a,0x0c,0x0a,0x09,0x06,0x08,0x07,0x07,0x07,0x07,0x06,0x07,0x04, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x07,0x04,0x04,0x02,0x03,0x03,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x04,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x03,0x03,0x03,0x05,0x05,0x05,0x05, -0x05,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05, -0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07, -0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x08,0x04,0x07,0x07,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x06,0x08,0x0a,0x06, -0x06,0x07,0x07,0x05,0x05,0x03,0x04,0x06,0x05,0x09,0x07,0x07,0x06,0x07,0x07,0x07,0x0b,0x06,0x07,0x07,0x06,0x05,0x05,0x05,0x06,0x07,0x09,0x07,0x06,0x09,0x05,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x07,0x07,0x04,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x05,0x02,0x03,0x04,0x03,0x06,0x05,0x05,0x05,0x05,0x04,0x04,0x03,0x05,0x06,0x04, -0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x02,0x04,0x06,0x04,0x04,0x03,0x04,0x04,0x04,0x02,0x04,0x04,0x06,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0x03,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x07,0x02,0x04,0x07,0x0b,0x07,0x06,0x06,0x0a,0x08,0x0a,0x09,0x06,0x07,0x06,0x05,0x0e,0x05,0x07,0x0b,0x0b,0x0b,0x08,0x08,0x08, -0x06,0x06,0x06,0x05,0x05,0x06,0x02,0x00,0x00,0x00,0x00,0x07,0x07,0x08,0x07,0x06,0x05,0x07,0x07,0x04,0x0a,0x07,0x07,0x04,0x04,0x06,0x04,0x05,0x07,0x06,0x07,0x0b,0x08,0x04,0x03,0x07,0x06,0x07,0x07,0x07,0x04,0x07,0x06,0x03,0x0b,0x07,0x07,0x04,0x05,0x05,0x06,0x06,0x05,0x06,0x07,0x07,0x06,0x05,0x05,0x09,0x03,0x06,0x03,0x07, -0x05,0x04,0x03,0x03,0x04,0x03,0x02,0x02,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x06,0x06,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x04,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x06,0x04,0x03,0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, -0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x08,0x09,0x07,0x09,0x08,0x0b,0x09,0x06,0x05,0x06,0x08,0x06,0x0a,0x08,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x05,0x03,0x06,0x07,0x05,0x06,0x06,0x07,0x07,0x06,0x0c,0x07,0x07,0x07,0x07, -0x07,0x07,0x06,0x06,0x08,0x06,0x06,0x06,0x04,0x07,0x04,0x09,0x08,0x06,0x04,0x0a,0x06,0x0a,0x03,0x04,0x07,0x07,0x08,0x08,0x08,0x07,0x07,0x07,0x0a,0x03,0x07,0x03,0x06,0x05,0x03,0x03,0x06,0x03,0x09,0x03,0x0b,0x06,0x0b,0x0b,0x07,0x07,0x07,0x06,0x06,0x05,0x05,0x0e,0x0e,0x10,0x10,0x0a,0x0a,0x06,0x06,0x02,0x0c,0x09,0x0a,0x08, -0x07,0x08,0x06,0x06,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x08,0x00,0x08,0x08,0x08,0x04,0x06,0x06,0x0b,0x04,0x0b,0x04,0x07,0x08,0x07,0x05,0x0b,0x06,0x0b,0x06,0x09,0x0a,0x04,0x06,0x06,0x05,0x03,0x06,0x07,0x06,0x07,0x06,0x07,0x07,0x06,0x08,0x08,0x0b,0x04,0x06,0x05,0x08,0x06,0x04,0x06,0x06,0x06,0x0b, -0x04,0x0b,0x04,0x03,0x07,0x05,0x0c,0x06,0x06,0x08,0x08,0x0c,0x06,0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x09,0x08,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x09,0x0a,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x07,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x06,0x07,0x07,0x07,0x0c,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0c,0x06,0x06,0x09,0x09,0x0d,0x0c,0x0b,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0b,0x06,0x0b,0x06,0x0b, -0x06,0x0b,0x06,0x0b,0x06,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x08,0x04,0x08,0x04,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0b,0x09,0x0a,0x04,0x06,0x09,0x0a,0x09,0x0a,0x00,0x00,0x00,0x00,0x00,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x0a, -0x10,0x0c,0x06,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x0b,0x0b,0x04,0x07,0x07,0x07,0x0f,0x0a,0x06,0x12,0x0d,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x05,0x09,0x08,0x08,0x06,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x0f,0x12,0x00, -0x00,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x08,0x07,0x06,0x06,0x05,0x0e,0x0a,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06, -0x07,0x07,0x07,0x07,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x08,0x04,0x04,0x05,0x05,0x0e,0x0a,0x08,0x07,0x07,0x00,0x06,0x06,0x06,0x04,0x07,0x08,0x08,0x06,0x06,0x04,0x03,0x09,0x07,0x07,0x04,0x07,0x06,0x06,0x06,0x06,0x03,0x06,0x05,0x07,0x06,0x07,0x06,0x07,0x05,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x05, -0x06,0x06,0x03,0x06,0x07,0x07,0x06,0x04,0x09,0x07,0x08,0x06,0x07,0x06,0x07,0x06,0x05,0x08,0x04,0x05,0x05,0x06,0x07,0x07,0x06,0x0c,0x06,0x0c,0x04,0x03,0x02,0x06,0x03,0x02,0x00,0x02,0x03,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x05,0x09,0x07,0x0b,0x09,0x07,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x0b,0x0b,0x0a,0x06,0x0a,0x06,0x0a,0x08,0x08,0x08,0x08,0x09,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x09,0x07,0x0d,0x0a,0x06,0x06,0x03,0x03,0x03,0x04,0x03,0x07,0x03,0x03,0x0a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x00,0x03, -0x00,0x00,0x08,0x07,0x05,0x06,0x08,0x03,0x04,0x08,0x08,0x03,0x07,0x07,0x07,0x08,0x08,0x03,0x05,0x08,0x07,0x07,0x08,0x07,0x07,0x08,0x07,0x09,0x09,0x06,0x06,0x06,0x03,0x05,0x07,0x07,0x07,0x07,0x06,0x07,0x08,0x06,0x08,0x07,0x07,0x08,0x07,0x09,0x07,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x07,0x05,0x06,0x08,0x04,0x04,0x08,0x04, -0x07,0x07,0x07,0x08,0x05,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x09,0x03,0x07,0x07,0x08,0x08,0x0e,0x00,0x08,0x07,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x09,0x08,0x08,0x08, -0x07,0x08,0x09,0x09,0x06,0x08,0x09,0x09,0x08,0x09,0x0a,0x09,0x08,0x07,0x07,0x09,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x08,0x08,0x08,0x09,0x08,0x07,0x08,0x08,0x0a,0x06,0x07,0x07,0x0b,0x06,0x06,0x09,0x0b,0x07,0x06,0x0d,0x07,0x07,0x09,0x06,0x06,0x09,0x07,0x09,0x0a,0x0b,0x06,0x09,0x06,0x08,0x07,0x07,0x07,0x08,0x06, -0x07,0x09,0x06,0x07,0x08,0x06,0x06,0x07,0x0b,0x06,0x06,0x07,0x07,0x05,0x04,0x07,0x07,0x07,0x06,0x07,0x0b,0x07,0x0b,0x06,0x07,0x0b,0x08,0x07,0x0b,0x09,0x09,0x0b,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x07,0x07,0x07,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x08, -0x07,0x09,0x08,0x08,0x07,0x08,0x08,0x09,0x09,0x07,0x08,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x08,0x08,0x08,0x09,0x0a,0x08,0x09,0x09,0x01,0x01,0x02,0x02,0x02,0x03,0x04,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x04,0x0a,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x03,0x07,0x06,0x07,0x05,0x0a,0x07,0x07,0x07,0x07, -0x0a,0x07,0x07,0x05,0x0a,0x07,0x07,0x08,0x08,0x03,0x03,0x0e,0x0d,0x0d,0x0e,0x11,0x06,0x06,0x03,0x06,0x05,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x04, -0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x07,0x05,0x05,0x07,0x07,0x03,0x04,0x06,0x05,0x09,0x08,0x07,0x06,0x07,0x06,0x05,0x05,0x07,0x06,0x0a,0x06,0x06,0x06,0x08,0x09,0x05,0x08,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06, -0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x06,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x07,0x04,0x06,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06, -0x06,0x08,0x08,0x06,0x06,0x05,0x06,0x05,0x06,0x07,0x07,0x03,0x06,0x06,0x09,0x08,0x05,0x07,0x07,0x06,0x06,0x05,0x06,0x08,0x06,0x08,0x08,0x06,0x05,0x07,0x03,0x07,0x06,0x08,0x03,0x06,0x05,0x07,0x05,0x06,0x05,0x03,0x03,0x04,0x0a,0x0a,0x07,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x07,0x05,0x09,0x05,0x08,0x08,0x06,0x07,0x09,0x07, -0x07,0x07,0x06,0x06,0x05,0x06,0x08,0x06,0x08,0x07,0x0a,0x0a,0x07,0x08,0x06,0x06,0x0a,0x06,0x05,0x07,0x07,0x07,0x0b,0x0b,0x08,0x06,0x07,0x05,0x07,0x07,0x07,0x08,0x06,0x06,0x08,0x07,0x07,0x04,0x08,0x07,0x07,0x06,0x06,0x0b,0x09,0x06,0x06,0x07,0x07,0x07,0x07,0x09,0x08,0x04,0x0b,0x07,0x07,0x07,0x08,0x08,0x06,0x06,0x03,0x09, -0x08,0x08,0x06,0x08,0x03,0x03,0x05,0x05,0x03,0x03,0x07,0x05,0x03,0x09,0x08,0x03,0x03,0x03,0x05,0x05,0x05,0x03,0x03,0x03,0x05,0x08,0x06,0x04,0x07,0x08,0x07,0x07,0x06,0x09,0x07,0x07,0x04,0x05,0x06,0x05,0x03,0x03,0x05,0x06,0x04,0x08,0x08,0x08,0x0b,0x09,0x0b,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x09,0x0a,0x04,0x04,0x06,0x04, -0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x06,0x06,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x06,0x0b,0x0b,0x06,0x06,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x0c,0x09,0x0a,0x06,0x07,0x07,0x08,0x04,0x08,0x09,0x06,0x06,0x04,0x04,0x04,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0b,0x04,0x09,0x06,0x06,0x03,0x06,0x06,0x06,0x06,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x0a,0x0a,0x0c, -0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x06,0x06,0x09,0x06,0x06,0x0b,0x06,0x0d,0x0c,0x0b,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x08,0x08,0x08,0x08,0x08,0x04,0x08,0x08,0x04,0x04,0x08,0x04,0x08,0x04,0x08,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04, -0x06,0x04,0x04,0x04,0x04,0x00,0x0e,0x0a,0x10,0x0c,0x0b,0x06,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x06,0x06,0x05,0x0e,0x0a,0x0c,0x0c,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x08,0x04,0x08,0x04,0x08,0x04,0x0e,0x0a,0x07,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x0e,0x0e,0x0a,0x0a,0x05,0x05,0x07,0x07, -0x07,0x07,0x04,0x04,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x07,0x07,0x07,0x07,0x0b,0x04,0x0b,0x04,0x07,0x08,0x07,0x07,0x0e,0x0e,0x0a,0x0a,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x0a,0x04,0x04,0x04,0x04, -0x04,0x04,0x04,0x04,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, -0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x08,0x08,0x03,0x03,0x06,0x05,0x07,0x08,0x07,0x06,0x07,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x07,0x07,0x08,0x07,0x07,0x08,0x06,0x08,0x09,0x08,0x09, -0x0a,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x06,0x06,0x09,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x0a,0x0a,0x07,0x09,0x0a,0x09,0x07,0x0a,0x09,0x08,0x08,0x07,0x08,0x09,0x0a,0x08,0x07,0x08,0x07, -0x06,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0b,0x09,0x0a,0x09,0x09,0x07,0x09,0x08,0x08,0x0a,0x09,0x09,0x0b,0x07,0x06,0x07,0x06,0x07,0x08,0x08,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x07,0x09,0x0a, -0x08,0x08,0x08,0x09,0x08,0x08,0x06,0x06,0x07,0x07,0x06,0x06,0x07,0x07,0x06,0x06,0x08,0x05,0x07,0x06,0x07,0x09,0x07,0x0a,0x06,0x07,0x07,0x09,0x04,0x09,0x08,0x09,0x08,0x07,0x09,0x07,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x06,0x05,0x04,0x04,0x03,0x03, -0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x0b,0x0b,0x0b,0x0b,0x06,0x09,0x09,0x06,0x05,0x06,0x06,0x07,0x06,0x0a,0x0a,0x0a,0x05,0x0c,0x06,0x0a,0x0a,0x0a,0x0a,0x07,0x06,0x06,0x09,0x07,0x09,0x08,0x06,0x05,0x05,0x0c,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x10,0x0a,0x0a,0x05, -0x03,0x05,0x03,0x06,0x03,0x03,0x03,0x06,0x07,0x07,0x07,0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x0a,0x03,0x0b,0x0b,0x0b,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x08,0x0e,0x0e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x07,0x06,0x06,0x05,0x04,0x04,0x08,0x07,0x09,0x05,0x0e,0x0b,0x07,0x07,0x0b,0x0a,0x0a,0x09,0x0c,0x0a,0x0b,0x09,0x08,0x06,0x09,0x07,0x0b,0x09,0x09,0x07,0x09,0x07,0x0a,0x08,0x0b,0x08,0x0d,0x0a,0x09,0x07,0x09,0x07,0x0f,0x0b,0x0a,0x00,0x0c,0x0c,0x0c,0x06,0x00,0x00, -0x07,0x06,0x08,0x07,0x06,0x05,0x0d,0x0b,0x0b,0x0a,0x09,0x07,0x08,0x07,0x06,0x05,0x09,0x07,0x06,0x05,0x0a,0x08,0x08,0x07,0x0c,0x0a,0x06,0x07,0x09,0x09,0x0a,0x05,0x02,0x06,0x08,0x05,0x0c,0x0c,0x03,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x05,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x07,0x07, -0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, -0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, -0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x08,0x09,0x03,0x03,0x03, -0x03,0x09,0x07,0x09,0x08,0x07,0x06,0x06,0x06,0x07,0x07,0x05,0x05,0x0e,0x0a,0x0e,0x0b,0x0c,0x0a,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x06,0x03,0x09,0x07,0x0a,0x08,0x10,0x0c,0x07,0x07,0x08,0x08,0x0a,0x0a,0x09,0x07,0x0c,0x09,0x07,0x05,0x07,0x06,0x07,0x06,0x0b,0x09,0x07,0x06,0x07, -0x07,0x07,0x07,0x06,0x05,0x06,0x05,0x06,0x04,0x06,0x06,0x04,0x08,0x04,0x0b,0x08,0x04,0x07,0x07,0x06,0x09,0x07,0x05,0x04,0x07,0x07,0x07,0x06,0x03,0x09,0x07,0x04,0x04,0x07,0x06,0x09,0x05,0x09,0x07,0x07,0x06,0x08,0x07,0x07,0x06,0x09,0x07,0x07,0x04,0x06,0x05,0x09,0x05,0x06,0x0a,0x06,0x07,0x0b,0x03,0x0e,0x0b,0x0b,0x0e,0x0b, -0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x08,0x08,0x0b,0x08,0x0b,0x03,0x06,0x07,0x0b,0x0c,0x08,0x0c,0x07,0x07,0x0a,0x08,0x0e,0x0b,0x06,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0c,0x06,0x06,0x0c,0x09,0x06,0x06,0x09,0x08,0x04,0x04,0x08,0x07,0x07,0x07,0x07,0x09,0x04,0x04,0x0a,0x09,0x04,0x04,0x0a,0x05,0x05, -0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x06,0x05,0x07,0x06,0x09,0x07,0x07,0x0b,0x08,0x09,0x09,0x0a,0x0a,0x07,0x06,0x0c,0x0a,0x0d,0x0a,0x08,0x07,0x04,0x04,0x07,0x08,0x05,0x07,0x06,0x07,0x06,0x09,0x0a, -0x05,0x07,0x05,0x03,0x04,0x06,0x07,0x03,0x03,0x02,0x03,0x05,0x05,0x05,0x05,0x12,0x18,0x04,0x05,0x02,0x03,0x05,0x05,0x04,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x10,0x06,0x09,0x0b,0x0b,0x08,0x06,0x07,0x09,0x09,0x06,0x04,0x08,0x06,0x08,0x07,0x08,0x06,0x07,0x09,0x07,0x07,0x06, -0x09,0x07,0x0a,0x05,0x06,0x08,0x04,0x07,0x04,0x04,0x03,0x0b,0x07,0x07,0x06,0x06,0x07,0x0b,0x0b,0x0b,0x0c,0x0c,0x07,0x06,0x03,0x06,0x06,0x07,0x05,0x08,0x03,0x07,0x07,0x0a,0x0a,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x04,0x07,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, -0x04,0x04,0x04,0x00,0x03,0x03,0x03,0x03,0x03,0x14,0x0c,0x0a,0x0d,0x03,0x03,0x04,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x0b,0x04,0x04,0x0b,0x03,0x06,0x06,0x10,0x0c,0x0c,0x10,0x0b,0x06,0x06,0x0b,0x06,0x06,0x05,0x05,0x00,0x00,0x04,0x09,0x07,0x09,0x07,0x0f,0x0c,0x08,0x07,0x08,0x07,0x10,0x0c, -0x09,0x07,0x05,0x04,0x07,0x00,0x08,0x06,0x04,0x04,0x02,0x06,0x04,0x04,0x03,0x02,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x07,0x07,0x07,0x0c,0x0b,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x07,0x05,0x0b,0x0e,0x05,0x0e,0x06,0x0a,0x0b,0x0b,0x0b,0x05,0x09,0x0c,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x07,0x07,0x0a,0x06,0x06,0x0b,0x04,0x04,0x0b,0x04,0x04,0x0b,0x06,0x06,0x00,0x05,0x0a,0x04,0x04,0x0c,0x06,0x06,0x09,0x06,0x06,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x12,0x12,0x0b,0x00,0x00,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, -0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x07,0x08,0x08,0x0b,0x08,0x08,0x0a,0x0c,0x08,0x08,0x0d,0x08,0x08,0x0b,0x08,0x08,0x09,0x08,0x09,0x0a,0x0b,0x08,0x09,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x08,0x09,0x07,0x08,0x07,0x09,0x08,0x08,0x08,0x08,0x05,0x06,0x08,0x09,0x09,0x07,0x00,0x00,0x0d,0x1a,0x08,0x00, -0x01,0x04,0x04,0x05,0x08,0x07,0x0b,0x0a,0x03,0x04,0x04,0x05,0x09,0x03,0x05,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x09,0x09,0x09,0x06,0x0c,0x08,0x07,0x08,0x09,0x07,0x06,0x09,0x09,0x03,0x05,0x08,0x06,0x0c,0x0a,0x0a,0x07,0x0a,0x08,0x07,0x07,0x09,0x08,0x0c,0x08,0x07,0x07,0x04,0x05,0x04,0x09, -0x05,0x03,0x07,0x08,0x06,0x08,0x07,0x04,0x08,0x07,0x03,0x03,0x06,0x03,0x0b,0x07,0x08,0x08,0x08,0x05,0x06,0x04,0x07,0x06,0x09,0x06,0x06,0x06,0x04,0x03,0x04,0x09,0x08,0x08,0x08,0x07,0x0a,0x0a,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07, -0x05,0x05,0x07,0x07,0x06,0x05,0x06,0x07,0x05,0x0c,0x0c,0x0a,0x04,0x05,0x09,0x0b,0x0a,0x0b,0x09,0x09,0x09,0x07,0x08,0x07,0x08,0x0a,0x07,0x05,0x06,0x0a,0x0b,0x08,0x06,0x04,0x04,0x09,0x08,0x07,0x09,0x08,0x07,0x07,0x09,0x08,0x08,0x0a,0x0c,0x0c,0x07,0x0d,0x05,0x05,0x03,0x03,0x09,0x08,0x06,0x07,0x02,0x07,0x04,0x04,0x07,0x07, -0x05,0x03,0x03,0x05,0x10,0x08,0x07,0x08,0x07,0x07,0x03,0x03,0x03,0x03,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x03,0x05,0x04,0x04,0x04,0x03,0x04,0x03,0x04,0x02,0x05,0x06,0x03,0x07,0x06,0x07,0x06,0x03,0x09,0x07,0x07,0x06,0x07,0x08,0x09,0x09,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x06,0x09,0x08,0x03,0x07,0x06,0x08,0x06,0x08,0x06,0x08,0x05, -0x03,0x08,0x07,0x08,0x07,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x06,0x03,0x06,0x04,0x06,0x04,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x08,0x05,0x08,0x05,0x07,0x06,0x07,0x04,0x07,0x06,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x06,0x0a,0x09,0x08,0x08,0x06,0x07,0x06,0x09,0x05,0x06,0x05,0x0e,0x08,0x06,0x08,0x03,0x05,0x0a,0x04,0x08,0x05, -0x05,0x08,0x05,0x08,0x07,0x08,0x06,0x08,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x03,0x08,0x06,0x06,0x06,0x03,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x0a,0x08,0x08,0x05,0x07,0x06,0x07,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x0c,0x09, -0x07,0x06,0x03,0x08,0x07,0x0b,0x0b,0x0a,0x08,0x03,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x07,0x06,0x03,0x05,0x07,0x08,0x0c,0x0c,0x0c,0x0c,0x05,0x05,0x03,0x04,0x04,0x08,0x07,0x0a,0x05,0x0a,0x09,0x0b,0x03,0x08,0x07,0x07,0x07,0x09,0x03,0x08,0x08,0x0c,0x0a,0x07,0x0a,0x09,0x07,0x07,0x07,0x07,0x08,0x0b,0x0a,0x03,0x07,0x08,0x06,0x07, -0x03,0x07,0x07,0x07,0x06,0x07,0x08,0x03,0x07,0x06,0x07,0x07,0x06,0x08,0x08,0x06,0x07,0x07,0x09,0x0b,0x03,0x07,0x08,0x07,0x0b,0x07,0x09,0x06,0x08,0x07,0x03,0x0d,0x0d,0x09,0x08,0x07,0x09,0x08,0x07,0x07,0x06,0x09,0x07,0x0b,0x07,0x0a,0x0a,0x08,0x09,0x0c,0x09,0x0a,0x09,0x07,0x08,0x07,0x07,0x09,0x08,0x0a,0x09,0x0d,0x0e,0x09, -0x0a,0x07,0x08,0x0d,0x08,0x07,0x08,0x07,0x05,0x07,0x07,0x09,0x06,0x07,0x07,0x06,0x07,0x09,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x09,0x06,0x07,0x07,0x0b,0x0b,0x08,0x09,0x07,0x06,0x0b,0x07,0x07,0x07,0x05,0x06,0x06,0x03,0x0b,0x0b,0x07,0x06,0x06,0x07,0x06,0x05,0x0d,0x0f,0x08,0x05,0x05,0x05,0x05,0x03,0x07,0x06,0x07,0x0a,0x08, -0x09,0x08,0x04,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03, -0x03,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x07,0x07,0x0a,0x07,0x03,0x05,0x03,0x03,0x07,0x05,0x0c,0x0a,0x08,0x07,0x08,0x06,0x0a, -0x07,0x07,0x07,0x07,0x07,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x0a,0x08,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x04,0x04,0x04,0x04,0x07,0x07,0x08,0x07,0x07,0x08,0x07,0x08,0x07,0x08,0x08,0x06,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06, -0x04,0x09,0x08,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x07,0x08,0x07,0x08,0x08,0x05,0x08,0x05,0x08,0x05,0x08, -0x05,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x06,0x08,0x06,0x0c,0x09,0x0c,0x09,0x08,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x09,0x06,0x07,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, -0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x07, -0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x06,0x06,0x07,0x07,0x03,0x03,0x08,0x08,0x07,0x07,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x09,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05, -0x05,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x08,0x08,0x07,0x07,0x07,0x07,0x09,0x09,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x06,0x09,0x0a,0x07,0x08,0x08,0x07,0x07,0x06,0x09, -0x08,0x0b,0x04,0x04,0x08,0x06,0x03,0x06,0x0c,0x0a,0x07,0x0a,0x0d,0x0a,0x08,0x08,0x07,0x07,0x06,0x07,0x04,0x04,0x07,0x04,0x07,0x0a,0x09,0x07,0x07,0x07,0x06,0x08,0x08,0x06,0x05,0x07,0x07,0x05,0x05,0x07,0x03,0x05,0x06,0x04,0x10,0x0f,0x0d,0x0b,0x09,0x07,0x0e,0x0d,0x0b,0x08,0x07,0x03,0x03,0x0a,0x08,0x09,0x07,0x09,0x07,0x09, -0x07,0x09,0x07,0x09,0x07,0x07,0x08,0x07,0x08,0x07,0x0b,0x0b,0x09,0x08,0x09,0x08,0x08,0x06,0x0a,0x08,0x0a,0x08,0x08,0x06,0x03,0x10,0x0f,0x0d,0x09,0x08,0x0d,0x09,0x0a,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x0a,0x08,0x0a,0x08,0x07,0x05,0x08,0x05,0x09,0x07,0x09,0x07,0x07,0x06,0x09,0x07,0x0a,0x08, -0x07,0x07,0x06,0x08,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x07,0x06,0x08,0x07,0x07,0x07,0x08,0x07,0x08,0x08,0x08,0x06,0x06,0x08,0x08,0x07,0x08,0x05,0x05,0x07,0x07,0x04,0x08,0x08,0x07,0x06,0x06,0x07,0x07,0x07,0x03,0x04,0x04,0x04,0x05,0x03,0x08,0x0b,0x0b,0x0b,0x07,0x07,0x08,0x08,0x09,0x09,0x08,0x05,0x05,0x05,0x05, -0x05,0x04,0x04,0x06,0x06,0x05,0x03,0x03,0x04,0x04,0x04,0x04,0x08,0x08,0x07,0x06,0x09,0x06,0x05,0x06,0x07,0x06,0x06,0x05,0x05,0x05,0x06,0x08,0x06,0x07,0x07,0x07,0x03,0x06,0x05,0x08,0x05,0x05,0x0c,0x0c,0x0d,0x08,0x06,0x09,0x0a,0x08,0x07,0x06,0x06,0x07,0x08,0x07,0x09,0x07,0x08,0x0a,0x07,0x09,0x08,0x08,0x06,0x06,0x06,0x08, -0x07,0x08,0x06,0x0c,0x0b,0x08,0x07,0x08,0x07,0x08,0x06,0x08,0x06,0x09,0x08,0x07,0x05,0x07,0x08,0x06,0x03,0x0a,0x06,0x06,0x0b,0x09,0x08,0x08,0x0c,0x09,0x09,0x06,0x0b,0x09,0x09,0x07,0x0c,0x0a,0x07,0x06,0x0a,0x0a,0x0a,0x08,0x09,0x08,0x09,0x08,0x11,0x0f,0x0b,0x08,0x0f,0x0c,0x0b,0x09,0x08,0x06,0x07,0x05,0x05,0x00,0x00,0x0d, -0x0c,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x06,0x08,0x06,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x09,0x07,0x08,0x06,0x07,0x05,0x0b,0x09,0x09,0x08,0x0b,0x08,0x0b,0x08,0x03,0x0b,0x09,0x08,0x07,0x09,0x08,0x09,0x07,0x08,0x07,0x08,0x07,0x0b,0x0b,0x07,0x07,0x09,0x07,0x09,0x07,0x0b,0x09,0x07,0x06,0x07,0x06,0x0a,0x07,0x0a,0x07,0x0a,0x08, -0x0a,0x08,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x09,0x07,0x0a,0x09,0x07,0x08,0x0b,0x0b,0x0a,0x09,0x07,0x06,0x0c,0x0a,0x0d,0x0b,0x09,0x07,0x09,0x08,0x08,0x07,0x07,0x07,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x08,0x04,0x04,0x02,0x03,0x03,0x03,0x04,0x05,0x04,0x03,0x05,0x03, -0x03,0x03,0x04,0x04,0x03,0x03,0x08,0x08,0x08,0x08,0x04,0x04,0x03,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x03,0x04,0x03,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07, -0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07, -0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x08,0x04, -0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x06,0x09,0x0b,0x06,0x06,0x07,0x07,0x05,0x05,0x03,0x04,0x06,0x05,0x09,0x07,0x08,0x06,0x08,0x08,0x08,0x0c,0x07,0x08,0x08,0x06,0x06,0x06,0x05,0x07,0x07,0x09,0x07, -0x06,0x09,0x06,0x05,0x05,0x07,0x05,0x06,0x07,0x06,0x08,0x07,0x05,0x06,0x05,0x05,0x05,0x04,0x04,0x05,0x06,0x02,0x03,0x05,0x04,0x07,0x06,0x06,0x06,0x05,0x04,0x04,0x04,0x05,0x07,0x04,0x04,0x05,0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x05,0x02,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x04, -0x05,0x04,0x02,0x03,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x08,0x02,0x05,0x07,0x0b,0x08,0x07,0x07,0x0b,0x08,0x0b,0x0a,0x07,0x08,0x07,0x06,0x0f,0x06,0x08,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x03,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x06,0x05,0x08,0x08,0x04,0x0b,0x07,0x08,0x05,0x04,0x06,0x04,0x06, -0x08,0x06,0x08,0x0c,0x08,0x04,0x03,0x08,0x07,0x08,0x08,0x08,0x04,0x08,0x06,0x03,0x0b,0x07,0x08,0x05,0x06,0x06,0x06,0x06,0x06,0x07,0x08,0x08,0x07,0x06,0x06,0x0a,0x03,0x06,0x03,0x07,0x06,0x05,0x03,0x03,0x04,0x03,0x02,0x02,0x05,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x06,0x06,0x04,0x04,0x05,0x04,0x05,0x03,0x02,0x03, -0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x04,0x07,0x07,0x07,0x07,0x04,0x00,0x00,0x00,0x00,0x06,0x04,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x02,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x0a,0x08,0x09,0x08,0x0a,0x08,0x0c,0x0a,0x07,0x05,0x07,0x09,0x07,0x0b, -0x09,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0d,0x05,0x03,0x07,0x08,0x05,0x07,0x07,0x08,0x08,0x07,0x0d,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x08,0x07,0x07,0x07,0x04,0x08,0x04,0x0a,0x09,0x07,0x04,0x0b,0x07,0x0b,0x03,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, -0x0b,0x03,0x08,0x03,0x07,0x05,0x03,0x03,0x07,0x03,0x0a,0x03,0x0c,0x07,0x0c,0x0c,0x08,0x08,0x08,0x07,0x07,0x05,0x05,0x0f,0x0f,0x11,0x11,0x0b,0x0b,0x07,0x07,0x02,0x0d,0x0a,0x0b,0x09,0x08,0x09,0x07,0x07,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x08,0x00,0x08,0x08,0x08,0x04,0x07,0x07,0x0c,0x04,0x0c,0x04, -0x08,0x09,0x08,0x05,0x0c,0x07,0x0c,0x07,0x0a,0x0b,0x04,0x07,0x07,0x05,0x03,0x07,0x08,0x07,0x08,0x07,0x08,0x08,0x07,0x09,0x08,0x0c,0x04,0x07,0x05,0x09,0x07,0x04,0x07,0x07,0x07,0x0c,0x04,0x0c,0x04,0x03,0x08,0x05,0x0d,0x07,0x07,0x08,0x08,0x0d,0x07,0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x0a,0x08,0x00,0x00,0x03,0x03, -0x03,0x03,0x03,0x03,0x05,0x05,0x07,0x07,0x0a,0x0b,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x07,0x05,0x05,0x05,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11, -0x0d,0x0b,0x07,0x08,0x08,0x08,0x0d,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0a,0x0a,0x0e,0x0d,0x0c,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x09,0x04,0x09,0x04,0x07,0x09,0x08,0x07,0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x0b,0x0c,0x0a,0x0b,0x04,0x07,0x0a,0x0b,0x0a,0x0b,0x00,0x00,0x00,0x00,0x00,0x0f,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x08,0x00,0x00,0x00,0x0f,0x0b,0x11,0x0d,0x07,0x08,0x08,0x08,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0c,0x0c,0x05,0x08, -0x08,0x08,0x10,0x0b,0x07,0x14,0x0e,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x05,0x05,0x0a,0x09,0x09,0x07,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x10,0x14,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08, -0x08,0x08,0x09,0x08,0x07,0x07,0x05,0x0f,0x0b,0x07,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0c,0x07,0x07,0x0c,0x07,0x07,0x0c,0x07,0x07,0x08,0x08,0x08,0x08,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x09,0x04,0x04,0x05,0x05,0x0f,0x0b,0x08,0x08,0x08,0x00,0x07,0x07,0x07,0x05,0x07,0x09, -0x08,0x07,0x07,0x05,0x03,0x0a,0x08,0x08,0x05,0x07,0x06,0x06,0x06,0x06,0x03,0x07,0x05,0x08,0x06,0x08,0x06,0x07,0x06,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x06,0x06,0x04,0x07,0x07,0x08,0x07,0x04,0x0a,0x08,0x08,0x07,0x08,0x06,0x07,0x07,0x05,0x09,0x05,0x05,0x05,0x06,0x08,0x08,0x07,0x0d,0x07,0x0d, -0x04,0x03,0x02,0x07,0x03,0x02,0x00,0x02,0x03,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0c,0x06,0x0a,0x08,0x0c,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0b,0x06,0x0b,0x06,0x0b,0x08,0x09,0x09,0x09,0x0a,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09, -0x09,0x0a,0x08,0x0e,0x0b,0x06,0x06,0x04,0x04,0x04,0x05,0x03,0x07,0x03,0x03,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x08,0x07,0x06,0x06,0x09,0x03,0x04,0x09,0x09,0x03,0x07,0x07,0x07,0x09,0x09,0x03,0x05,0x09,0x08,0x08,0x08,0x07,0x08,0x09,0x07,0x0a, -0x09,0x07,0x07,0x07,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x06,0x09,0x07,0x07,0x09,0x07,0x09,0x07,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x06,0x06,0x09,0x04,0x05,0x09,0x04,0x07,0x07,0x07,0x09,0x05,0x09,0x08,0x08,0x08,0x09,0x07,0x0a,0x09,0x03,0x07,0x07,0x08,0x08,0x10,0x00,0x08,0x07,0x08,0x08,0x08,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x0a,0x08,0x09,0x09,0x07,0x09,0x0a,0x0a,0x06,0x08,0x0a,0x0a,0x09,0x0a,0x0b,0x0a,0x09,0x07,0x07,0x0a,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x0a,0x07,0x08,0x09,0x09, -0x0a,0x08,0x08,0x08,0x09,0x0b,0x06,0x08,0x08,0x0b,0x07,0x07,0x0a,0x0c,0x08,0x07,0x0e,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x0a,0x0b,0x0b,0x07,0x0a,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x0a,0x07,0x08,0x09,0x07,0x07,0x08,0x0c,0x07,0x07,0x08,0x08,0x06,0x04,0x07,0x07,0x07,0x07,0x07,0x0b,0x07,0x0c,0x06,0x07,0x0c,0x09,0x07, -0x0c,0x0a,0x0a,0x0b,0x07,0x07,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x08,0x07,0x07,0x0c,0x08,0x07,0x07,0x07,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x0a,0x09,0x08,0x07,0x0a,0x09,0x09,0x07,0x09,0x09,0x0a,0x09,0x08,0x09,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x0a,0x09,0x0a,0x09,0x01, -0x01,0x02,0x03,0x02,0x04,0x05,0x0b,0x07,0x08,0x08,0x07,0x08,0x07,0x07,0x08,0x08,0x07,0x04,0x0b,0x08,0x07,0x07,0x07,0x08,0x07,0x08,0x03,0x08,0x07,0x07,0x05,0x0b,0x07,0x07,0x07,0x08,0x0b,0x07,0x08,0x05,0x0b,0x08,0x08,0x09,0x09,0x03,0x04,0x0f,0x0f,0x0f,0x0f,0x13,0x07,0x07,0x03,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x06,0x07,0x08,0x06,0x05,0x07,0x08,0x03,0x04,0x06,0x05,0x0a,0x08,0x08,0x06,0x08,0x06,0x05,0x06,0x08,0x07,0x0a, -0x07,0x06,0x06,0x09,0x0a,0x05,0x08,0x06,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x07,0x04,0x06,0x05,0x05, -0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x09,0x08,0x07,0x06,0x05,0x07,0x06,0x06,0x08,0x08,0x03,0x06,0x07,0x0a,0x08,0x06,0x08,0x08,0x06,0x06,0x06,0x06,0x08,0x07,0x09,0x08,0x07, -0x06,0x08,0x03,0x08,0x06,0x08,0x03,0x06,0x06,0x07,0x05,0x07,0x05,0x03,0x03,0x04,0x0b,0x0b,0x08,0x06,0x06,0x08,0x07,0x06,0x06,0x05,0x08,0x06,0x0a,0x06,0x08,0x08,0x06,0x07,0x0a,0x08,0x08,0x08,0x06,0x07,0x06,0x06,0x08,0x07,0x08,0x07,0x0a,0x0b,0x07,0x09,0x06,0x07,0x0b,0x06,0x05,0x08,0x08,0x08,0x0c,0x0c,0x09,0x07,0x07,0x05, -0x07,0x07,0x07,0x09,0x07,0x07,0x09,0x08,0x08,0x05,0x08,0x08,0x07,0x06,0x06,0x0c,0x0a,0x06,0x07,0x08,0x08,0x08,0x08,0x09,0x09,0x05,0x0c,0x08,0x07,0x07,0x08,0x08,0x07,0x07,0x03,0x0a,0x09,0x09,0x06,0x09,0x03,0x03,0x06,0x06,0x03,0x03,0x08,0x05,0x03,0x0a,0x09,0x04,0x03,0x03,0x06,0x05,0x05,0x03,0x03,0x03,0x05,0x09,0x06,0x04, -0x08,0x09,0x08,0x08,0x06,0x0a,0x07,0x08,0x05,0x06,0x07,0x06,0x03,0x03,0x05,0x07,0x04,0x09,0x09,0x09,0x0c,0x0a,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x0a,0x0b,0x04,0x04,0x07,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x07,0x07,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x07, -0x07,0x0c,0x0c,0x07,0x07,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0d,0x0a,0x0b,0x07,0x08,0x08,0x09,0x04,0x09,0x0a,0x07,0x07,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0c,0x04,0x0a,0x07,0x07,0x03,0x07,0x07,0x07,0x07,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04, -0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11,0x0d,0x0b,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0c,0x07,0x0e,0x0d,0x0c,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0c,0x07,0x0c,0x07,0x0c, -0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x09,0x09,0x09,0x09,0x09,0x04,0x09,0x09,0x04,0x04,0x09,0x04,0x09,0x04,0x09,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x00,0x0f,0x0b,0x11,0x0d,0x0c,0x07,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x07,0x07, -0x05,0x0f,0x0b,0x0d,0x0d,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x08,0x09,0x04,0x09,0x04,0x09,0x04,0x0f,0x0b,0x08,0x09,0x08,0x08,0x08,0x09,0x08,0x08,0x0f,0x0f,0x0b,0x0b,0x05,0x05,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x08,0x08,0x08,0x08,0x0c,0x04,0x0c,0x04,0x08,0x09, -0x08,0x08,0x0f,0x0f,0x0b,0x0b,0x0f,0x0f,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x0b,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, -0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x09,0x09,0x03,0x03, -0x07,0x05,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x08,0x08,0x08,0x09,0x08,0x07,0x08,0x07,0x09,0x0a,0x08,0x0a,0x0b,0x08,0x0a,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x08,0x08,0x09,0x07,0x08,0x07,0x08,0x08,0x07,0x07,0x0a, -0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x09,0x0c,0x0c,0x0a,0x0b,0x0b,0x07,0x0a,0x0b,0x0a,0x08,0x0b,0x0a,0x09,0x09,0x08,0x08,0x0a,0x0a,0x09,0x08,0x09,0x08,0x07,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x09,0x0c,0x0c,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0b,0x0a,0x0b,0x09,0x09,0x08,0x0a,0x09,0x09,0x0b,0x0a, -0x09,0x0c,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x0a,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x06,0x07,0x07,0x08,0x08,0x0a,0x0b,0x09,0x09,0x08,0x0a,0x08,0x09,0x07,0x06,0x08,0x07,0x06,0x06,0x07,0x07,0x06,0x06,0x08,0x06,0x07,0x06,0x07,0x0a,0x07,0x0b,0x07,0x07,0x07,0x0a, -0x04,0x0a,0x09,0x09,0x09,0x07,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x08,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x0c,0x0c,0x0c,0x0c,0x06,0x0a,0x09,0x06,0x05, -0x06,0x07,0x07,0x06,0x0b,0x0b,0x0b,0x06,0x0d,0x06,0x0b,0x0b,0x0b,0x0b,0x07,0x06,0x06,0x0a,0x08,0x0a,0x09,0x07,0x06,0x05,0x0d,0x05,0x07,0x06,0x06,0x06,0x06,0x06,0x12,0x0b,0x0b,0x06,0x03,0x06,0x03,0x06,0x03,0x03,0x03,0x06,0x08,0x08,0x07,0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x0b,0x03,0x0c,0x0c,0x0c,0x08,0x08,0x0b,0x0b, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x09,0x0f,0x0f,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x08,0x06,0x07,0x06,0x05,0x05,0x09,0x07,0x09,0x06,0x0f,0x0c,0x08,0x07,0x0c,0x0a, -0x0b,0x0a,0x0d,0x0b,0x0c,0x0a,0x08,0x06,0x09,0x08,0x0c,0x0a,0x0a,0x08,0x0a,0x08,0x0b,0x09,0x0b,0x09,0x0e,0x0b,0x0a,0x08,0x0a,0x08,0x10,0x0c,0x0a,0x00,0x0d,0x0d,0x0d,0x06,0x00,0x00,0x08,0x07,0x09,0x07,0x07,0x06,0x0e,0x0c,0x0c,0x0b,0x09,0x08,0x09,0x08,0x07,0x05,0x0a,0x08,0x07,0x05,0x0b,0x09,0x09,0x07,0x0d,0x0b,0x07,0x07, -0x0a,0x0a,0x0b,0x06,0x03,0x06,0x09,0x06,0x0d,0x0d,0x03,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x05,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x09,0x09,0x04,0x03,0x04,0x03,0x09,0x07,0x0a,0x08,0x07,0x06,0x07,0x06,0x08,0x07,0x05,0x05,0x0f,0x0b,0x0f,0x0c,0x0d,0x0b,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x08,0x06,0x08, -0x06,0x08,0x06,0x08,0x06,0x07,0x04,0x06,0x03,0x0a,0x08,0x0b,0x09,0x11,0x0d,0x07,0x08,0x09,0x09,0x0b,0x0b,0x0a,0x08,0x0d,0x0a,0x07,0x05,0x07,0x06,0x08,0x06,0x0c,0x09,0x08,0x07,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x05,0x06,0x05,0x07,0x07,0x04,0x09,0x04,0x0c,0x09,0x05,0x08,0x08,0x06,0x0a,0x07,0x05,0x05,0x08,0x08,0x08,0x06, -0x03,0x0a,0x08,0x05,0x05,0x08,0x06,0x09,0x05,0x0a,0x08,0x08,0x06,0x09,0x08,0x08,0x06,0x0a,0x07,0x08,0x05,0x07,0x06,0x0a,0x06,0x07,0x0b,0x06,0x07,0x0c,0x03,0x0f,0x0c,0x0c,0x0f,0x0b,0x0c,0x0c,0x0b,0x0c,0x0c,0x07,0x06,0x08,0x09,0x0c,0x09,0x0c,0x03,0x06,0x08,0x0b,0x0d,0x09,0x0d,0x08,0x08,0x0a,0x09,0x0f,0x0c,0x07,0x0c,0x04, -0x0c,0x04,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0d,0x07,0x07,0x0d,0x0a,0x07,0x07,0x0a,0x09,0x04,0x04,0x09,0x08,0x08,0x08,0x08,0x0a,0x04,0x04,0x0b,0x0a,0x04,0x04,0x0b,0x05,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x14,0x07,0x05,0x07,0x07,0x0a,0x07,0x08,0x0b,0x09,0x0a,0x0a,0x0b,0x0b,0x08,0x06,0x0d,0x0a,0x0e,0x0b,0x09,0x08,0x04,0x04,0x08,0x08,0x05,0x08,0x07,0x08,0x06,0x0a,0x0a,0x05,0x08,0x06,0x03,0x05,0x07,0x07,0x03,0x03,0x02,0x03,0x05,0x05,0x05,0x06,0x13,0x1a,0x04,0x05,0x02,0x03,0x05,0x06,0x04,0x06,0x07,0x05,0x05, -0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x11,0x07,0x0a,0x0c,0x0c,0x08,0x06,0x07,0x09,0x0a,0x06,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x0a,0x08,0x08,0x07,0x0a,0x08,0x0b,0x06,0x07,0x08,0x04,0x08,0x04,0x05,0x03,0x0b,0x08,0x07,0x07,0x07,0x08,0x0c,0x0c,0x0c,0x0d,0x0d,0x07,0x07,0x04,0x07,0x06,0x08, -0x06,0x09,0x03,0x07,0x08,0x0b,0x0b,0x08,0x07,0x07,0x07,0x07,0x06,0x07,0x06,0x06,0x04,0x04,0x03,0x03,0x05,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x04,0x04,0x04,0x03,0x03,0x16,0x0d,0x0b,0x0e,0x04,0x04,0x04,0x05,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, -0x04,0x00,0x0c,0x04,0x04,0x0c,0x03,0x07,0x07,0x11,0x0d,0x0d,0x11,0x0c,0x07,0x07,0x0c,0x07,0x07,0x05,0x05,0x00,0x00,0x05,0x0a,0x08,0x09,0x08,0x10,0x0d,0x09,0x07,0x09,0x07,0x11,0x0d,0x0a,0x08,0x05,0x04,0x08,0x00,0x09,0x07,0x04,0x04,0x02,0x06,0x04,0x04,0x03,0x03,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x07,0x06, -0x08,0x07,0x07,0x0d,0x0b,0x0a,0x0a,0x0b,0x0c,0x08,0x09,0x08,0x05,0x0c,0x0f,0x06,0x0f,0x07,0x0b,0x0c,0x0c,0x0c,0x05,0x0a,0x0d,0x0a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x08,0x08,0x0b,0x07,0x07,0x0c,0x04,0x04,0x0c,0x04,0x04,0x0c,0x06,0x06,0x00,0x05,0x0b,0x04,0x04,0x0d, -0x07,0x07,0x0a,0x07,0x07,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x14,0x14,0x0b,0x00,0x00,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x08,0x08,0x08,0x0c,0x08,0x08,0x0a,0x0d,0x08,0x08,0x0e,0x08,0x08,0x0c,0x08,0x09,0x0a,0x08,0x0a, -0x0b,0x0c,0x08,0x0a,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0a,0x08,0x09,0x0a,0x08,0x08,0x07,0x0a,0x08,0x08,0x08,0x09,0x06,0x07,0x08,0x0a,0x0a,0x07,0x00,0x00,0x0f,0x1e,0x0a,0x00,0x01,0x04,0x04,0x06,0x09,0x08,0x0c,0x0c,0x03,0x05,0x05,0x06,0x0a,0x03,0x06,0x03,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03, -0x03,0x0a,0x0a,0x0a,0x07,0x0e,0x0a,0x09,0x09,0x0b,0x08,0x07,0x0a,0x0b,0x04,0x05,0x09,0x07,0x0d,0x0b,0x0b,0x08,0x0b,0x09,0x08,0x08,0x0a,0x09,0x0e,0x09,0x08,0x09,0x05,0x06,0x05,0x0a,0x06,0x04,0x08,0x09,0x07,0x09,0x08,0x05,0x09,0x08,0x04,0x04,0x07,0x04,0x0d,0x08,0x09,0x09,0x09,0x05,0x06,0x05,0x08,0x07,0x0b,0x07,0x07,0x07, -0x05,0x04,0x05,0x0a,0x0a,0x0a,0x09,0x08,0x0b,0x0b,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x08,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x06,0x06,0x08,0x08,0x07,0x06,0x07,0x08,0x06,0x0d,0x0d,0x0c,0x04,0x06,0x0a,0x0d,0x0b,0x0c,0x0a,0x0a,0x0a,0x08,0x09,0x08,0x09,0x0b,0x08,0x06, -0x06,0x0b,0x0c,0x09,0x07,0x04,0x04,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x08,0x0b,0x0a,0x0a,0x0b,0x0e,0x0e,0x08,0x0f,0x06,0x06,0x03,0x03,0x0a,0x09,0x07,0x08,0x03,0x08,0x05,0x05,0x08,0x08,0x06,0x03,0x03,0x06,0x12,0x0a,0x08,0x0a,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x04,0x06,0x05,0x05,0x05,0x03,0x04,0x03, -0x05,0x03,0x06,0x07,0x04,0x08,0x06,0x09,0x07,0x04,0x0b,0x08,0x08,0x07,0x08,0x09,0x0a,0x0a,0x05,0x06,0x06,0x0e,0x0e,0x0e,0x07,0x0a,0x09,0x04,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x06,0x03,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0b,0x08,0x08,0x08,0x08,0x07,0x04,0x07,0x05,0x07,0x05,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x09,0x05,0x09,0x05, -0x08,0x06,0x08,0x05,0x08,0x07,0x0a,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x07,0x0b,0x0b,0x09,0x09,0x07,0x09,0x07,0x0a,0x06,0x07,0x06,0x11,0x09,0x07,0x09,0x03,0x06,0x0c,0x05,0x09,0x05,0x05,0x09,0x05,0x0a,0x08,0x09,0x07,0x09,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0b,0x08,0x0b,0x08,0x04,0x04,0x04, -0x04,0x04,0x04,0x04,0x04,0x05,0x04,0x09,0x07,0x07,0x07,0x04,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x09,0x05,0x08,0x06,0x08,0x05,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0e,0x0b,0x08,0x07,0x04,0x0a,0x08,0x0d,0x0c,0x0b,0x09,0x03,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x08,0x07,0x03,0x06,0x08,0x09,0x0e,0x0e,0x0e,0x0d,0x06,0x06, -0x03,0x04,0x04,0x0a,0x09,0x0c,0x06,0x0c,0x0a,0x0c,0x04,0x0a,0x09,0x08,0x09,0x0b,0x04,0x09,0x09,0x0d,0x0b,0x08,0x0b,0x0b,0x08,0x08,0x08,0x08,0x09,0x0c,0x0b,0x04,0x08,0x09,0x07,0x09,0x04,0x08,0x08,0x08,0x07,0x09,0x09,0x04,0x08,0x07,0x09,0x08,0x07,0x09,0x09,0x07,0x08,0x08,0x0b,0x0c,0x04,0x08,0x09,0x08,0x0c,0x08,0x0b,0x07, -0x09,0x08,0x04,0x0f,0x0f,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x07,0x0a,0x08,0x0d,0x08,0x0b,0x0b,0x09,0x0a,0x0d,0x0b,0x0b,0x0b,0x08,0x09,0x08,0x09,0x0b,0x09,0x0b,0x0a,0x0e,0x0f,0x0b,0x0c,0x09,0x09,0x0f,0x09,0x08,0x09,0x08,0x06,0x08,0x08,0x0b,0x07,0x09,0x09,0x07,0x08,0x0b,0x09,0x09,0x09,0x09,0x07,0x06,0x07,0x0a,0x07,0x09, -0x08,0x0c,0x0c,0x09,0x0b,0x08,0x07,0x0c,0x08,0x08,0x09,0x06,0x07,0x06,0x04,0x0c,0x0c,0x09,0x07,0x07,0x09,0x07,0x06,0x0f,0x11,0x09,0x05,0x06,0x06,0x06,0x04,0x08,0x06,0x08,0x0b,0x09,0x0b,0x09,0x05,0x05,0x04,0x04,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x07,0x05,0x07,0x05,0x05,0x05,0x07,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a, -0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x08,0x0a, -0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x05,0x08,0x08,0x0b,0x09,0x04,0x05,0x04,0x04,0x08,0x06,0x0e,0x0c,0x09,0x08,0x09,0x07,0x0b,0x09,0x08,0x07,0x08,0x07,0x09,0x07,0x0a,0x08,0x0a,0x08,0x0b,0x08,0x0b,0x09,0x05,0x05,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x04,0x04,0x05, -0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x05,0x0a,0x09,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x04,0x04,0x04,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x07, -0x04,0x07,0x04,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x09,0x08,0x09,0x09,0x05,0x09,0x05,0x09,0x05,0x09,0x05,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x05,0x08,0x05,0x08,0x05,0x08,0x05,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a, -0x08,0x09,0x07,0x09,0x07,0x0e,0x0b,0x0e,0x0b,0x09,0x07,0x09,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x0b,0x07,0x08,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c, -0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x07,0x07,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09, -0x09,0x07,0x07,0x09,0x09,0x04,0x04,0x09,0x09,0x08,0x08,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x09, -0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x06,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x09,0x09,0x08,0x08,0x08,0x08,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d, -0x0c,0x0b,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x0b,0x0b,0x09,0x09,0x09,0x08,0x08,0x07,0x0a,0x09,0x0d,0x04,0x04,0x09,0x07,0x04,0x07,0x0d,0x0b,0x09,0x0b,0x0f,0x0c,0x09,0x09,0x09,0x08,0x06,0x08,0x04,0x05,0x08,0x05,0x08,0x0b,0x0b,0x09, -0x08,0x09,0x07,0x09,0x09,0x07,0x06,0x08,0x08,0x06,0x06,0x08,0x04,0x06,0x07,0x04,0x13,0x11,0x0f,0x0d,0x0b,0x08,0x10,0x0f,0x0c,0x0a,0x08,0x04,0x04,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x0a,0x08,0x0a,0x08,0x0d,0x0c,0x0a,0x09,0x0a,0x09,0x09,0x07,0x0b,0x09,0x0b,0x09,0x09,0x07,0x04,0x13,0x11,0x0f, -0x0a,0x09,0x0f,0x0a,0x0b,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x09,0x0b,0x09,0x09,0x05,0x09,0x05,0x0a,0x08,0x0a,0x08,0x08,0x06,0x0b,0x08,0x0b,0x09,0x09,0x09,0x07,0x0a,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x07,0x09,0x08,0x08,0x08,0x09,0x08,0x09,0x09,0x09,0x07,0x07,0x09,0x09, -0x08,0x09,0x06,0x06,0x08,0x08,0x04,0x09,0x09,0x08,0x07,0x07,0x08,0x08,0x08,0x04,0x04,0x05,0x04,0x06,0x04,0x09,0x0d,0x0d,0x0d,0x08,0x08,0x09,0x09,0x0a,0x0b,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x06,0x04,0x04,0x04,0x04,0x05,0x05,0x09,0x09,0x08,0x07,0x0b,0x07,0x06,0x07,0x08,0x07,0x07,0x05,0x05,0x05,0x07,0x09, -0x07,0x08,0x08,0x08,0x04,0x07,0x06,0x09,0x05,0x05,0x0e,0x0e,0x0f,0x09,0x07,0x0b,0x0c,0x09,0x09,0x07,0x07,0x08,0x09,0x08,0x0a,0x08,0x0a,0x0c,0x09,0x0b,0x09,0x09,0x07,0x07,0x07,0x09,0x08,0x09,0x07,0x0d,0x0d,0x09,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x0a,0x09,0x08,0x06,0x09,0x09,0x07,0x04,0x0b,0x07,0x07,0x0d,0x0a,0x0a,0x09, -0x0e,0x0b,0x0a,0x07,0x0d,0x0a,0x0b,0x08,0x0e,0x0b,0x08,0x07,0x0c,0x0b,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x14,0x11,0x0c,0x0a,0x11,0x0d,0x0d,0x0a,0x09,0x07,0x08,0x06,0x06,0x00,0x00,0x0f,0x0e,0x09,0x08,0x08,0x09,0x09,0x08,0x08,0x07,0x09,0x07,0x0b,0x09,0x0d,0x0a,0x0f,0x0d,0x0b,0x08,0x09,0x07,0x08,0x06,0x0d,0x0a,0x0a,0x09,0x0d, -0x0a,0x0d,0x0a,0x04,0x0d,0x0b,0x09,0x08,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0d,0x0c,0x08,0x08,0x0b,0x08,0x0b,0x08,0x0d,0x0b,0x08,0x07,0x08,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x0a,0x08,0x0c,0x0b,0x09,0x09,0x0d,0x0d,0x0c,0x0b,0x08,0x07,0x0e,0x0c,0x0f,0x0d,0x0b,0x08, -0x0a,0x09,0x09,0x08,0x08,0x08,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x09,0x05,0x05,0x02,0x03,0x03,0x03,0x04,0x06,0x04,0x03,0x06,0x03,0x03,0x03,0x05,0x05,0x03,0x03,0x09,0x09,0x09,0x09,0x05,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04, -0x02,0x04,0x04,0x03,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08, -0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08, -0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x09,0x05,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x08,0x09,0x07,0x0a,0x0c,0x07,0x07,0x08,0x08,0x06,0x06,0x04,0x04,0x07,0x06,0x0b,0x09,0x09,0x07,0x09,0x09,0x09,0x0e,0x08,0x09,0x09,0x07,0x07,0x07,0x06,0x08,0x09,0x0b,0x09,0x07,0x0b,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x09,0x08,0x05,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x03,0x03,0x05,0x04,0x08,0x07,0x07, -0x06,0x06,0x05,0x05,0x04,0x06,0x08,0x05,0x05,0x05,0x07,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x02,0x05,0x07,0x05,0x05,0x04,0x05,0x05,0x05,0x03,0x05,0x05,0x07,0x04,0x05,0x05,0x04,0x05,0x06,0x04,0x02,0x03,0x05,0x04,0x05,0x04,0x05,0x06,0x04,0x09,0x02,0x05,0x08,0x0d,0x09,0x08,0x08,0x0d,0x0a,0x0d,0x0b,0x08,0x09,0x08,0x07,0x11, -0x07,0x09,0x0d,0x0e,0x0e,0x09,0x0a,0x09,0x07,0x07,0x08,0x06,0x07,0x08,0x03,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x07,0x06,0x09,0x09,0x05,0x0d,0x08,0x09,0x05,0x05,0x07,0x05,0x07,0x09,0x07,0x09,0x0e,0x0a,0x05,0x04,0x09,0x08,0x09,0x09,0x09,0x05,0x09,0x07,0x04,0x0d,0x08,0x09,0x05,0x06,0x06,0x07,0x07,0x07,0x08,0x09,0x09, -0x08,0x07,0x07,0x0b,0x04,0x07,0x04,0x08,0x07,0x05,0x04,0x04,0x05,0x04,0x03,0x02,0x05,0x05,0x02,0x03,0x03,0x03,0x02,0x03,0x02,0x03,0x07,0x07,0x05,0x05,0x05,0x05,0x06,0x03,0x02,0x03,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x05,0x00,0x00,0x00,0x00,0x03,0x05,0x05,0x05,0x04,0x05,0x08,0x08,0x08,0x08,0x05,0x00,0x00,0x00, -0x00,0x07,0x05,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,0x06,0x06,0x05,0x06,0x05,0x06,0x06,0x06, -0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0e,0x0b,0x08,0x06,0x08,0x0a,0x08,0x0c,0x0b,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0f,0x06,0x04,0x08,0x09,0x06,0x08,0x08, -0x09,0x09,0x08,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x0a,0x08,0x08,0x08,0x05,0x09,0x05,0x0b,0x0a,0x08,0x05,0x0d,0x08,0x0d,0x04,0x05,0x09,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0d,0x04,0x09,0x04,0x08,0x06,0x04,0x04,0x08,0x04,0x0b,0x04,0x0e,0x08,0x0e,0x0e,0x09,0x09,0x09,0x08,0x08,0x06,0x06,0x12,0x12,0x14,0x14,0x0d, -0x0d,0x08,0x08,0x03,0x0f,0x0b,0x0d,0x0a,0x09,0x0a,0x08,0x08,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x0a,0x00,0x0a,0x0a,0x0a,0x05,0x08,0x08,0x0e,0x05,0x0e,0x05,0x09,0x0a,0x09,0x06,0x0e,0x08,0x0e,0x08,0x0b,0x0d,0x05,0x08,0x08,0x06,0x04,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0a,0x0a,0x0e,0x05,0x08, -0x06,0x0a,0x08,0x05,0x08,0x08,0x08,0x0e,0x05,0x0e,0x05,0x04,0x09,0x06,0x0f,0x08,0x08,0x0a,0x0a,0x0f,0x08,0x00,0x00,0x00,0x0a,0x00,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x08,0x0b,0x0d,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x08,0x06,0x06,0x06,0x12,0x0d,0x12,0x0d,0x12,0x0d,0x14,0x0f,0x14,0x0f,0x0d,0x08,0x09,0x09,0x09,0x0f,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0b,0x0b,0x10,0x0f,0x0e,0x08,0x0d,0x08,0x0d, -0x08,0x0d,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x0a,0x05,0x0a,0x05,0x08,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0e,0x0b,0x0d,0x05,0x08,0x0b,0x0d,0x0b,0x0d,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x06, -0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x0d,0x14,0x0f,0x08,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0e,0x0e,0x06,0x09,0x09,0x09,0x12,0x0c,0x08,0x17,0x10,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x06,0x06,0x0b,0x0a,0x0a,0x08,0x00,0x00, -0x00,0x05,0x05,0x05,0x05,0x13,0x17,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x0a,0x09,0x08,0x08,0x06,0x12,0x0d,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0e, -0x08,0x08,0x0e,0x08,0x08,0x0e,0x08,0x08,0x09,0x09,0x09,0x09,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x0a,0x05,0x05,0x06,0x06,0x12,0x0d,0x0a,0x09,0x09,0x00,0x08,0x08,0x08,0x06,0x09,0x0a,0x09,0x08,0x08,0x05,0x04,0x0b,0x09,0x09,0x05,0x08,0x07,0x07,0x07,0x07,0x04,0x08,0x06,0x09,0x07,0x09,0x07,0x08,0x07,0x0a,0x08,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x07,0x07,0x04,0x08,0x08,0x09,0x08,0x05,0x0b,0x09,0x0a,0x08,0x09,0x07,0x09,0x08,0x06,0x0a,0x06,0x06,0x06,0x07,0x09,0x09,0x08,0x0f,0x08,0x0f,0x05,0x04,0x03,0x08,0x03,0x02,0x00,0x02,0x03,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0e,0x06,0x0b, -0x09,0x0e,0x0b,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0d,0x07,0x0d,0x07,0x0d,0x0a,0x0a,0x0b,0x0a,0x0b,0x0d,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0b,0x09,0x10,0x0c,0x07,0x07,0x04,0x04,0x04,0x06,0x03,0x08,0x03,0x03,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x0a,0x09,0x07,0x07,0x0a,0x04,0x05,0x0a,0x0a,0x04,0x08,0x08,0x08,0x0a,0x0a,0x04,0x06,0x0a,0x09,0x09,0x09,0x08,0x09,0x0a,0x08,0x0c,0x0b,0x08,0x08,0x08,0x03,0x06,0x08,0x08,0x08,0x08,0x08,0x09,0x0a,0x07,0x0a,0x08,0x08,0x0a,0x08,0x0b,0x08,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a, -0x09,0x07,0x07,0x0a,0x05,0x05,0x0a,0x05,0x08,0x08,0x08,0x0a,0x06,0x0a,0x09,0x09,0x09,0x0a,0x08,0x0c,0x0b,0x04,0x09,0x08,0x09,0x0a,0x12,0x00,0x0a,0x08,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x06,0x04,0x00,0x0b,0x0a,0x0a,0x0b,0x08,0x0a,0x0b,0x0b,0x07,0x09,0x0b,0x0b,0x0a,0x0b,0x0c,0x0c,0x0a,0x08,0x08,0x0b,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x09,0x0a,0x0a,0x0a,0x0c,0x09,0x09,0x0a,0x0a,0x0c,0x07,0x09,0x09,0x0d,0x08,0x08,0x0c,0x0d,0x09,0x08,0x10,0x09,0x09,0x0b,0x08,0x08,0x0b,0x08,0x0b,0x0c,0x0d,0x08, -0x0c,0x08,0x0a,0x08,0x09,0x09,0x09,0x08,0x09,0x0c,0x08,0x09,0x0a,0x08,0x08,0x09,0x0e,0x08,0x08,0x09,0x09,0x06,0x05,0x08,0x08,0x08,0x08,0x08,0x0d,0x08,0x0d,0x07,0x08,0x0d,0x0a,0x08,0x0d,0x0b,0x0b,0x0d,0x09,0x08,0x0d,0x0d,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x09,0x08,0x09,0x0d,0x09,0x08,0x08,0x08,0x0d,0x0c,0x0a,0x0a, -0x0a,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x08,0x0c,0x0a,0x0a,0x09,0x0a,0x0a,0x0b,0x0b,0x09,0x0a,0x0a,0x0b,0x0a,0x0c,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0a,0x0b,0x0c,0x0a,0x0b,0x0b,0x01,0x02,0x02,0x03,0x02,0x04,0x05,0x0d,0x08,0x09,0x09,0x08,0x09,0x08,0x08,0x0a,0x09,0x08,0x05,0x0d,0x09,0x08,0x08,0x08,0x09,0x08,0x09,0x04,0x09, -0x08,0x08,0x06,0x0d,0x08,0x08,0x08,0x09,0x0c,0x08,0x09,0x06,0x0c,0x09,0x09,0x0a,0x0a,0x03,0x04,0x11,0x11,0x11,0x11,0x15,0x08,0x08,0x04,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x09,0x06,0x06,0x09,0x09,0x04,0x05,0x07,0x06,0x0b,0x0a,0x09,0x07,0x09,0x07,0x06,0x07,0x09,0x08,0x0c,0x08,0x07,0x07,0x0b,0x0c,0x06,0x09,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x0a,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x08,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x08,0x05,0x07,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c, -0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x0b,0x09,0x08,0x07,0x06,0x08,0x06,0x07,0x09,0x09,0x04,0x07,0x08,0x0b,0x0a,0x07,0x09,0x09,0x07,0x07,0x07,0x07,0x09,0x08,0x0a,0x0a,0x08,0x06,0x09,0x04,0x09,0x07,0x0a,0x04,0x07,0x06,0x09,0x06,0x08,0x06,0x04,0x04,0x05,0x0c,0x0c,0x09,0x07,0x07,0x09,0x08,0x07,0x07,0x06,0x09,0x06, -0x0b,0x07,0x0a,0x0a,0x07,0x09,0x0b,0x09,0x09,0x09,0x07,0x08,0x07,0x07,0x09,0x08,0x0a,0x08,0x0c,0x0c,0x09,0x0b,0x07,0x08,0x0d,0x07,0x06,0x09,0x09,0x09,0x0d,0x0d,0x0a,0x08,0x09,0x06,0x09,0x08,0x08,0x0b,0x08,0x08,0x0a,0x09,0x09,0x05,0x09,0x09,0x09,0x07,0x07,0x0d,0x0b,0x07,0x08,0x09,0x09,0x09,0x09,0x0b,0x0a,0x05,0x0e,0x09, -0x08,0x09,0x0a,0x0a,0x08,0x08,0x04,0x0b,0x0a,0x0a,0x07,0x0b,0x03,0x03,0x07,0x07,0x03,0x03,0x09,0x06,0x04,0x0b,0x0b,0x04,0x03,0x03,0x07,0x06,0x06,0x03,0x03,0x03,0x06,0x0a,0x07,0x05,0x09,0x0a,0x09,0x09,0x07,0x0b,0x08,0x09,0x05,0x07,0x08,0x06,0x03,0x03,0x06,0x08,0x05,0x0a,0x0a,0x0a,0x0e,0x0b,0x0e,0x04,0x00,0x00,0x00,0x00, -0x00,0x04,0x0b,0x0d,0x05,0x05,0x08,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x08,0x08,0x12,0x0d,0x12,0x0d,0x14,0x0f,0x14,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x08,0x08,0x0e,0x0e,0x08,0x08,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0f,0x0b,0x0d,0x08,0x09,0x09,0x0a,0x05,0x0a,0x0b,0x08, -0x08,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0e,0x05,0x0b,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x12,0x0d,0x12,0x0d,0x12,0x0d, -0x14,0x0f,0x14,0x0f,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0e,0x08,0x10,0x0f,0x0e,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x0a,0x0a,0x05,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x08,0x09,0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x00,0x12,0x0d,0x14,0x0f,0x0e,0x08,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x08,0x08,0x06,0x12,0x0d,0x0f,0x0f,0x0e,0x0e,0x0e,0x09,0x09,0x09,0x09,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x12,0x0d,0x09,0x0a,0x09,0x09,0x09,0x0a,0x09,0x09, -0x12,0x12,0x0d,0x0d,0x06,0x06,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x09,0x09,0x09,0x09,0x0e,0x05,0x0e,0x05,0x09,0x0a,0x09,0x09,0x12,0x12,0x0d,0x0d,0x12,0x12,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x04,0x05,0x04, -0x00,0x00,0x00,0x0d,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0d,0x0a,0x0a,0x0a,0x04,0x04,0x08,0x06,0x09,0x0a,0x09,0x08,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x09,0x09,0x09,0x0a, -0x09,0x08,0x0a,0x08,0x0a,0x0b,0x0a,0x0b,0x0c,0x0a,0x0b,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x09,0x09,0x0a,0x09,0x0a,0x09,0x09,0x09,0x08,0x08,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0b,0x0c,0x0b,0x0b,0x0e,0x0e,0x0b,0x0e,0x0e,0x0b,0x0d,0x0d,0x08,0x0c,0x0d,0x0b,0x09,0x0d,0x0b,0x0a,0x0b, -0x09,0x0a,0x0b,0x0c,0x0a,0x09,0x0b,0x09,0x08,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0a,0x0e,0x0e,0x0b,0x0c,0x0c,0x0b,0x0b,0x0b,0x0a,0x0d,0x0b,0x0c,0x0b,0x0b,0x09,0x0b,0x0a,0x0a,0x0d,0x0b,0x0b,0x0d,0x08,0x08,0x08,0x08,0x09,0x09,0x0a,0x0b,0x09,0x09,0x08,0x08,0x09,0x08,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x08,0x08,0x09,0x09,0x09, -0x09,0x07,0x08,0x08,0x09,0x09,0x0b,0x0d,0x0a,0x0a,0x09,0x0c,0x0a,0x0a,0x08,0x07,0x09,0x08,0x07,0x07,0x08,0x08,0x07,0x07,0x09,0x07,0x08,0x07,0x08,0x0c,0x08,0x0c,0x08,0x08,0x09,0x0b,0x05,0x0c,0x0a,0x0b,0x0a,0x08,0x0b,0x09,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07, -0x07,0x07,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x04,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x0e,0x0e,0x0e,0x0e,0x07,0x0b,0x0b,0x07,0x06,0x07,0x08,0x08,0x07,0x0d,0x0c,0x0d,0x07,0x0f,0x07,0x0d,0x0d,0x0d,0x0c,0x08,0x07,0x07,0x0c,0x09,0x0c,0x0a,0x08,0x07,0x06,0x0f,0x06,0x08,0x07, -0x07,0x07,0x07,0x07,0x14,0x0d,0x0d,0x06,0x04,0x07,0x04,0x07,0x04,0x04,0x04,0x07,0x09,0x09,0x08,0x06,0x06,0x03,0x03,0x03,0x06,0x03,0x06,0x0d,0x03,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x12,0x12,0x0a,0x12,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x07,0x09,0x07,0x08,0x06,0x05,0x05,0x0a,0x08,0x0b,0x06,0x11,0x0d,0x09,0x08,0x0e,0x0c,0x0d,0x0b,0x0f,0x0c,0x0e,0x0c,0x0a,0x07,0x0b,0x09,0x0e,0x0b,0x0b,0x09,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x11,0x0d,0x0b,0x09,0x0b,0x09,0x12,0x0d, -0x0c,0x00,0x0f,0x0f,0x0f,0x07,0x00,0x00,0x09,0x08,0x0a,0x08,0x08,0x06,0x10,0x0e,0x0e,0x0d,0x0b,0x09,0x0a,0x09,0x08,0x06,0x0b,0x09,0x08,0x06,0x0c,0x0a,0x0a,0x08,0x0f,0x0c,0x08,0x09,0x0b,0x0b,0x0c,0x07,0x03,0x07,0x0a,0x06,0x0f,0x0f,0x04,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x06,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08, -0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00, -0x00,0x07,0x07,0x0a,0x0b,0x04,0x03,0x04,0x03,0x0b,0x08,0x0b,0x09,0x08,0x07,0x08,0x07,0x09,0x09,0x06,0x06,0x11,0x0c,0x11,0x0d,0x0f,0x0d,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x07,0x04,0x0b,0x09,0x0d,0x0a,0x14,0x0f,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0b,0x09,0x0f,0x0c,0x08,0x06,0x08, -0x07,0x09,0x07,0x0e,0x0b,0x09,0x08,0x08,0x09,0x08,0x09,0x07,0x06,0x07,0x06,0x07,0x06,0x08,0x08,0x05,0x0a,0x05,0x0e,0x0a,0x05,0x09,0x09,0x07,0x0b,0x08,0x06,0x05,0x09,0x09,0x09,0x07,0x04,0x0b,0x09,0x06,0x05,0x09,0x07,0x0b,0x06,0x0c,0x09,0x09,0x07,0x0a,0x09,0x09,0x07,0x0b,0x08,0x09,0x05,0x08,0x06,0x0b,0x06,0x08,0x0d,0x07, -0x08,0x0d,0x04,0x11,0x0d,0x0d,0x12,0x0d,0x0e,0x0e,0x0d,0x0d,0x0e,0x08,0x07,0x09,0x0b,0x0d,0x0b,0x0e,0x04,0x07,0x09,0x0d,0x0f,0x0b,0x0f,0x09,0x09,0x0c,0x0b,0x11,0x0e,0x08,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0f,0x08,0x08,0x0f,0x0b,0x08,0x08,0x0b,0x0a,0x05,0x05,0x0a,0x09,0x09,0x09,0x09,0x0b,0x05, -0x05,0x0d,0x0b,0x05,0x05,0x0d,0x06,0x06,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x08,0x06,0x08,0x08,0x0b,0x09,0x09,0x0d,0x0a,0x0b,0x0b,0x0c,0x0c,0x09,0x07,0x0f,0x0c,0x10,0x0d,0x0a,0x09,0x05,0x05,0x09, -0x0a,0x06,0x09,0x08,0x09,0x07,0x0b,0x0c,0x06,0x09,0x06,0x03,0x06,0x08,0x08,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x07,0x16,0x1e,0x05,0x06,0x02,0x04,0x06,0x06,0x05,0x07,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x14,0x08,0x0b,0x0e,0x0d,0x0a,0x07,0x08,0x0b,0x0b,0x07,0x05,0x0a,0x08,0x0a, -0x08,0x0a,0x08,0x08,0x0b,0x09,0x09,0x08,0x0b,0x09,0x0c,0x07,0x08,0x0a,0x05,0x09,0x05,0x05,0x04,0x0d,0x09,0x08,0x08,0x08,0x09,0x0e,0x0e,0x0e,0x0f,0x0f,0x08,0x08,0x04,0x08,0x07,0x09,0x07,0x0a,0x04,0x08,0x09,0x0d,0x0d,0x09,0x08,0x09,0x08,0x08,0x07,0x08,0x07,0x07,0x05,0x05,0x04,0x03,0x05,0x09,0x0a,0x04,0x04,0x04,0x04,0x04, -0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x00,0x04,0x04,0x04,0x04,0x04,0x19,0x0f,0x0d,0x10,0x04,0x04,0x05,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x0e,0x05,0x05,0x0e,0x04,0x08,0x08,0x14,0x0f,0x0f,0x14,0x0e,0x08,0x08,0x0e,0x08,0x08,0x06,0x06,0x00,0x00,0x05,0x0b,0x09,0x0b,0x09, -0x13,0x10,0x0a,0x08,0x0b,0x08,0x14,0x0f,0x0b,0x09,0x06,0x05,0x09,0x00,0x0a,0x08,0x05,0x05,0x02,0x07,0x05,0x05,0x04,0x03,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x08,0x06,0x09,0x09,0x08,0x0e,0x0c,0x0c,0x0c,0x0c,0x0e,0x09,0x0a,0x09,0x06,0x0e,0x11,0x07,0x11,0x08,0x0d,0x0e,0x0e,0x0e,0x06,0x0b,0x0f,0x0b,0x0a,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,0x09,0x09,0x0d,0x08,0x08,0x0e,0x05,0x05,0x0e,0x05,0x05,0x0e,0x07,0x07,0x00,0x06,0x0d,0x05,0x05,0x0f,0x08,0x08,0x0b,0x08,0x08,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x17,0x17,0x0d,0x00,0x00,0x0d,0x0d, -0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x09,0x0a,0x0a,0x0d,0x0a,0x09,0x0c,0x0f,0x0a,0x09,0x10,0x0a,0x0a,0x0e,0x09,0x0a,0x0c,0x0a,0x0c,0x0d,0x0e,0x0a,0x0c,0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x0a,0x09,0x0c,0x09,0x0a,0x0c,0x09,0x09,0x09,0x0c,0x0a,0x0a,0x0a,0x0a,0x07,0x08,0x0a,0x0c, -0x0c,0x08,0x00,0x00,0x10,0x20,0x0a,0x00,0x02,0x04,0x05,0x06,0x09,0x09,0x0d,0x0d,0x04,0x05,0x05,0x07,0x0b,0x03,0x06,0x03,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x03,0x03,0x0b,0x0b,0x0b,0x07,0x0f,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x0b,0x0b,0x04,0x06,0x09,0x08,0x0e,0x0c,0x0c,0x09,0x0c,0x0a,0x09,0x08,0x0b,0x0a, -0x0f,0x09,0x09,0x09,0x05,0x06,0x05,0x0b,0x07,0x04,0x08,0x09,0x07,0x09,0x08,0x05,0x09,0x09,0x04,0x04,0x08,0x04,0x0e,0x09,0x09,0x09,0x09,0x06,0x07,0x05,0x09,0x08,0x0c,0x07,0x08,0x07,0x05,0x04,0x05,0x0b,0x0a,0x0a,0x0a,0x08,0x0c,0x0c,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x09,0x09,0x07,0x07,0x07,0x09,0x06,0x0e,0x0e,0x0c,0x05,0x07,0x0b,0x0e,0x0c,0x0d,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0a,0x0c,0x09,0x06,0x07,0x0c,0x0d,0x09,0x07,0x04,0x05,0x0b,0x0a,0x09,0x0b,0x0a,0x08,0x08,0x0c,0x0a,0x0a,0x0c,0x0f,0x0f,0x08,0x10,0x06,0x06,0x04,0x04,0x0b,0x09, -0x08,0x09,0x03,0x09,0x05,0x05,0x09,0x09,0x06,0x03,0x04,0x06,0x13,0x0a,0x08,0x0a,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x04,0x06,0x05,0x05,0x05,0x03,0x04,0x03,0x05,0x03,0x06,0x08,0x04,0x09,0x07,0x09,0x07,0x04,0x0b,0x09,0x09,0x08,0x09,0x09,0x0b,0x0b,0x06,0x06,0x06,0x0f,0x0f,0x0f,0x08,0x0b,0x09,0x04, -0x09,0x07,0x0a,0x07,0x0a,0x07,0x09,0x07,0x03,0x0a,0x08,0x0a,0x08,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x04,0x08,0x05,0x08,0x05,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x06,0x0a,0x06,0x09,0x07,0x08,0x05,0x08,0x07,0x0b,0x09,0x0b,0x09,0x09,0x07,0x09,0x07,0x08,0x0c,0x0c,0x0a,0x09,0x07,0x09,0x08,0x0b,0x07,0x08,0x06,0x12,0x0a, -0x08,0x0a,0x04,0x06,0x0d,0x05,0x0a,0x06,0x06,0x0a,0x06,0x0a,0x08,0x0a,0x07,0x0a,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x09,0x08,0x08,0x08,0x04,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x06,0x09,0x07,0x08,0x05,0x0b,0x09, -0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0f,0x0c,0x09,0x08,0x04,0x0a,0x08,0x0e,0x0d,0x0c,0x09,0x03,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x09,0x08,0x04,0x07,0x09,0x0a,0x0f,0x0f,0x0f,0x0e,0x06,0x06,0x03,0x04,0x04,0x0a,0x09,0x0c,0x06,0x0d,0x0b,0x0d,0x04,0x0a,0x09,0x08,0x09,0x0b,0x04,0x09,0x0a,0x0e,0x0c,0x08,0x0c,0x0b,0x09,0x08,0x08,0x09, -0x09,0x0c,0x0c,0x04,0x09,0x0a,0x07,0x09,0x04,0x09,0x09,0x08,0x07,0x09,0x09,0x04,0x08,0x08,0x09,0x08,0x07,0x09,0x09,0x07,0x09,0x09,0x0c,0x0d,0x04,0x09,0x09,0x09,0x0d,0x08,0x0b,0x08,0x0a,0x09,0x04,0x10,0x10,0x0c,0x09,0x09,0x0b,0x0a,0x09,0x09,0x08,0x0b,0x08,0x0e,0x09,0x0c,0x0c,0x09,0x0b,0x0e,0x0b,0x0c,0x0b,0x09,0x0a,0x08, -0x09,0x0c,0x09,0x0c,0x0b,0x0f,0x10,0x0b,0x0d,0x09,0x0a,0x10,0x09,0x08,0x09,0x08,0x06,0x09,0x08,0x0c,0x07,0x09,0x09,0x08,0x08,0x0b,0x09,0x09,0x09,0x09,0x07,0x07,0x08,0x0b,0x07,0x0a,0x09,0x0d,0x0d,0x09,0x0b,0x08,0x07,0x0d,0x08,0x08,0x09,0x06,0x07,0x07,0x04,0x0d,0x0d,0x09,0x08,0x08,0x09,0x08,0x06,0x10,0x12,0x0a,0x06,0x06, -0x06,0x06,0x04,0x09,0x07,0x09,0x0c,0x0a,0x0b,0x09,0x05,0x05,0x04,0x04,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x08,0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, -0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x08,0x09,0x08,0x09,0x08,0x08,0x05,0x08,0x08,0x0c,0x09,0x04,0x06,0x04,0x04,0x08, -0x07,0x0f,0x0c,0x0a,0x08,0x09,0x08,0x0c,0x0a,0x09,0x08,0x09,0x08,0x0a,0x08,0x0a,0x09,0x0b,0x09,0x0c,0x08,0x0c,0x09,0x05,0x05,0x05,0x05,0x07,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x05,0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x08,0x08, -0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x04,0x04,0x04,0x04,0x09,0x08,0x09,0x08,0x09,0x08,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x09,0x09,0x09, -0x09,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x08,0x05,0x08,0x05,0x08,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0f,0x0c,0x0f,0x0c,0x09,0x07,0x09,0x07,0x09,0x08,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x05,0x0c,0x08,0x08,0x04,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09, -0x09,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x07,0x07,0x09,0x09,0x04,0x04,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x09,0x09,0x09,0x04, -0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0a,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x09,0x09,0x09,0x09,0x0a,0x0a,0x07,0x0b, -0x0c,0x09,0x09,0x09,0x08,0x09,0x08,0x0b,0x0a,0x0e,0x05,0x04,0x09,0x08,0x04,0x08,0x0e,0x0c,0x09,0x0c,0x10,0x0d,0x0a,0x09,0x09,0x09,0x07,0x08,0x05,0x05,0x08,0x05,0x08,0x0c,0x0b,0x09,0x08,0x09,0x07,0x0a,0x0a,0x07,0x07,0x09,0x09,0x06,0x06,0x09,0x04,0x06,0x07,0x05,0x14,0x12,0x10,0x0e,0x0c,0x08,0x11,0x0f,0x0d,0x0a,0x08,0x04, -0x04,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x0a,0x08,0x0a,0x08,0x0e,0x0d,0x0b,0x09,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0c,0x09,0x0a,0x07,0x04,0x14,0x12,0x10,0x0b,0x09,0x10,0x0b,0x0c,0x09,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x09,0x0c,0x09,0x09,0x06,0x0a,0x06,0x0b,0x09, -0x0b,0x09,0x08,0x07,0x0b,0x09,0x0c,0x09,0x09,0x09,0x07,0x0a,0x08,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x09,0x08,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x07,0x07,0x09,0x09,0x08,0x0a,0x07,0x07,0x08,0x09,0x04,0x09,0x09,0x08,0x08,0x07,0x09,0x09,0x09,0x04,0x04,0x05,0x04,0x06,0x04,0x0a,0x0e,0x0e,0x0e,0x09,0x09,0x09, -0x09,0x0b,0x0c,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x07,0x07,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x0a,0x0a,0x09,0x08,0x0c,0x08,0x07,0x07,0x08,0x07,0x07,0x06,0x06,0x06,0x07,0x0a,0x08,0x09,0x08,0x09,0x04,0x08,0x06,0x09,0x06,0x06,0x0f,0x0f,0x10,0x0a,0x08,0x0b,0x0d,0x09,0x09,0x08,0x08,0x09,0x09,0x09,0x0b,0x09,0x0a,0x0d, -0x09,0x0b,0x09,0x09,0x07,0x08,0x07,0x0a,0x08,0x0a,0x08,0x0e,0x0e,0x0a,0x08,0x0a,0x09,0x0a,0x07,0x0a,0x08,0x0b,0x09,0x09,0x07,0x09,0x09,0x07,0x04,0x0c,0x07,0x07,0x0e,0x0b,0x0a,0x09,0x0f,0x0b,0x0b,0x08,0x0e,0x0b,0x0c,0x09,0x0f,0x0c,0x09,0x07,0x0d,0x0c,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x15,0x12,0x0d,0x0a,0x12,0x0e,0x0e,0x0b, -0x09,0x07,0x08,0x06,0x07,0x00,0x00,0x10,0x0f,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x07,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x10,0x0d,0x0c,0x09,0x0a,0x07,0x08,0x07,0x0e,0x0b,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x04,0x0e,0x0c,0x09,0x08,0x0b,0x09,0x0a,0x09,0x0a,0x08,0x0a,0x08,0x0e,0x0d,0x08,0x08,0x0c,0x08,0x0c,0x08,0x0e,0x0c,0x09,0x07, -0x08,0x07,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x09,0x09,0x0e,0x0e,0x0d,0x0c,0x09,0x08,0x0e,0x0d,0x10,0x0e,0x0b,0x08,0x0b,0x0a,0x09,0x09,0x09,0x08,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x09,0x05,0x05,0x03,0x03, -0x03,0x03,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x04,0x05,0x05,0x03,0x03,0x09,0x09,0x09,0x09,0x05,0x05,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x04,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x07,0x05,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09, -0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x00, -0x00,0x00,0x00,0x00,0x0a,0x05,0x0a,0x05,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x08,0x0b,0x0d,0x08,0x07,0x09,0x09,0x07,0x07,0x04,0x05,0x08,0x06,0x0b,0x09,0x09,0x08,0x0a,0x0a,0x0a,0x0f,0x09,0x0a,0x0a, -0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x09,0x08,0x0c,0x07,0x07,0x07,0x08,0x06,0x08,0x09,0x07,0x09,0x09,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x07,0x07,0x03,0x04,0x06,0x05,0x08,0x07,0x07,0x07,0x06,0x05,0x06,0x05,0x07,0x08,0x05,0x05,0x06,0x08,0x06,0x06,0x05,0x05,0x04,0x04,0x06,0x03,0x05,0x08,0x05,0x05,0x04,0x05,0x05,0x05,0x03, -0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x05,0x07,0x05,0x03,0x03,0x05,0x05,0x05,0x05,0x06,0x07,0x05,0x09,0x03,0x06,0x09,0x0e,0x0a,0x09,0x09,0x0e,0x0a,0x0e,0x0c,0x08,0x09,0x08,0x07,0x12,0x07,0x09,0x0e,0x0f,0x0f,0x0a,0x0a,0x0a,0x07,0x08,0x08,0x07,0x07,0x08,0x03,0x00,0x00,0x00,0x00,0x09,0x0a,0x0a,0x0a,0x08,0x06,0x09,0x09,0x05, -0x0e,0x09,0x09,0x06,0x05,0x07,0x05,0x07,0x09,0x07,0x09,0x0e,0x0a,0x05,0x04,0x09,0x09,0x0a,0x09,0x09,0x05,0x09,0x08,0x04,0x0e,0x09,0x09,0x06,0x07,0x07,0x08,0x07,0x07,0x08,0x09,0x09,0x08,0x07,0x07,0x0c,0x04,0x07,0x04,0x09,0x07,0x06,0x04,0x04,0x05,0x04,0x03,0x03,0x06,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x08,0x08, -0x05,0x05,0x06,0x05,0x06,0x04,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x04,0x05,0x00,0x00,0x00,0x00,0x03,0x05,0x05,0x05,0x04,0x05,0x09,0x09,0x09,0x09,0x05,0x00,0x00,0x00,0x00,0x07,0x05,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x04,0x04,0x04,0x04,0x09,0x09,0x09,0x09,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0a,0x0b,0x09,0x0c,0x0a, -0x0f,0x0c,0x09,0x06,0x08,0x0b,0x09,0x0d,0x0b,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x0d,0x0d,0x10,0x07,0x04,0x08,0x09,0x07,0x08,0x08,0x09,0x09,0x08,0x10,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x0a,0x08,0x08,0x08,0x05,0x09,0x05,0x0c,0x0b,0x08,0x05,0x0d,0x08,0x0d,0x04,0x05, -0x09,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0d,0x04,0x09,0x04,0x08,0x07,0x04,0x04,0x08,0x04,0x0c,0x04,0x0f,0x08,0x0f,0x0f,0x09,0x09,0x09,0x08,0x08,0x07,0x07,0x13,0x13,0x15,0x15,0x0d,0x0d,0x08,0x08,0x03,0x10,0x0c,0x0d,0x0b,0x09,0x0b,0x08,0x08,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x0a,0x00,0x0a,0x0a, -0x0a,0x05,0x08,0x08,0x0f,0x05,0x0f,0x05,0x09,0x0b,0x09,0x07,0x0f,0x08,0x0f,0x08,0x0c,0x0d,0x05,0x08,0x08,0x07,0x04,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0b,0x0a,0x0f,0x05,0x08,0x07,0x0b,0x08,0x05,0x08,0x08,0x08,0x0f,0x05,0x0f,0x05,0x04,0x09,0x06,0x10,0x08,0x08,0x0a,0x0a,0x10,0x08,0x00,0x00,0x00,0x0a,0x00,0x0a,0x0a, -0x0a,0x0a,0x0c,0x0a,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x08,0x08,0x0c,0x0d,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x13, -0x0d,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d,0x08,0x09,0x09,0x09,0x10,0x10,0x08,0x08,0x10,0x08,0x08,0x10,0x08,0x08,0x10,0x08,0x08,0x0c,0x0c,0x11,0x10,0x0f,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x0b,0x05,0x0b,0x05, -0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0f,0x0c,0x0d,0x05,0x08,0x0c,0x0d,0x0c,0x0d,0x00,0x00,0x00,0x00,0x00,0x12,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x0a,0x00,0x00,0x00,0x13,0x0d,0x15,0x10,0x08,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x09,0x08,0x0f,0x0f,0x06,0x09,0x09,0x0a,0x14,0x0d,0x09,0x18,0x11,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x07,0x07,0x0c,0x0b,0x0b,0x08,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x14,0x18,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x07,0x0f,0x05,0x0f,0x05,0x0f,0x05, -0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x0b,0x09,0x08,0x08,0x07,0x13,0x0d,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x10,0x08,0x08,0x10,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x09,0x09,0x09,0x09,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x0b,0x05,0x05,0x07,0x07,0x13,0x0d,0x0a,0x09, -0x09,0x00,0x08,0x08,0x08,0x06,0x09,0x0b,0x0a,0x08,0x08,0x06,0x04,0x0c,0x09,0x0a,0x06,0x09,0x08,0x08,0x07,0x08,0x04,0x08,0x07,0x0a,0x08,0x09,0x07,0x09,0x07,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x07,0x08,0x08,0x05,0x08,0x09,0x0a,0x08,0x05,0x0c,0x09,0x0a,0x09,0x0a,0x08,0x09,0x08,0x06,0x0b,0x06,0x07, -0x07,0x08,0x0a,0x0a,0x08,0x10,0x08,0x10,0x05,0x04,0x03,0x09,0x03,0x02,0x00,0x02,0x04,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x0f,0x07,0x0c,0x09,0x0f,0x0c,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0e,0x08,0x0e,0x08,0x0e,0x0a,0x0b,0x0b,0x0b,0x0c,0x0e,0x10,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0c,0x09,0x11,0x0d,0x08,0x08,0x05,0x05,0x05,0x06,0x03,0x09,0x04,0x04,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x0a,0x09,0x07,0x08,0x0b,0x04,0x05,0x0b,0x0b,0x04,0x09,0x09,0x09,0x0b,0x0b,0x04,0x06,0x0b, -0x0a,0x0a,0x0a,0x09,0x09,0x0b,0x09,0x0d,0x0c,0x08,0x08,0x08,0x04,0x06,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x08,0x0b,0x09,0x09,0x0b,0x09,0x0c,0x09,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x09,0x07,0x08,0x0b,0x05,0x06,0x0b,0x05,0x09,0x09,0x09,0x0b,0x06,0x0b,0x0a,0x0a,0x09,0x0b,0x09,0x0d,0x0c,0x04,0x09,0x09,0x0a,0x0a,0x13,0x00, -0x0a,0x09,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x0c,0x0a,0x0b,0x0b,0x09,0x0b,0x0c,0x0c,0x08,0x0a,0x0c,0x0c,0x0b,0x0c,0x0d,0x0c,0x0b,0x09,0x09,0x0c,0x0b,0x09,0x0b,0x0b, -0x0b,0x0b,0x0b,0x0c,0x09,0x0a,0x0b,0x0a,0x0c,0x0a,0x0a,0x0a,0x0b,0x0d,0x08,0x09,0x09,0x0e,0x09,0x09,0x0c,0x0e,0x0a,0x09,0x11,0x09,0x09,0x0c,0x09,0x09,0x0c,0x09,0x0c,0x0d,0x0e,0x09,0x0c,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09,0x0a,0x0f,0x09,0x09,0x09,0x09,0x07,0x05,0x09,0x09,0x09,0x09,0x09, -0x0e,0x09,0x0e,0x08,0x09,0x0e,0x0b,0x09,0x0e,0x0c,0x0c,0x0e,0x09,0x09,0x0e,0x0e,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x09,0x09,0x09,0x0e,0x0a,0x09,0x09,0x09,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0d,0x0b,0x0a,0x09,0x0d,0x0b,0x0b,0x09,0x0b,0x0b,0x0c,0x0c,0x09,0x0b,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0b,0x0a, -0x0b,0x0b,0x0c,0x0d,0x0b,0x0c,0x0c,0x02,0x02,0x02,0x03,0x02,0x04,0x06,0x0e,0x09,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x0a,0x0a,0x09,0x05,0x0d,0x09,0x09,0x09,0x09,0x0a,0x08,0x09,0x04,0x09,0x08,0x09,0x07,0x0e,0x09,0x09,0x09,0x09,0x0d,0x09,0x09,0x06,0x0d,0x09,0x09,0x0b,0x0b,0x03,0x05,0x12,0x12,0x12,0x12,0x17,0x09,0x09,0x04,0x09, -0x06,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x09,0x07,0x07,0x09,0x0a,0x04,0x05,0x08,0x07,0x0c,0x0a,0x0a, -0x08,0x0a,0x08,0x07,0x07,0x0a,0x08,0x0d,0x08,0x07,0x08,0x0b,0x0c,0x07,0x0a,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x04,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x08,0x0a,0x0a,0x04,0x04, -0x04,0x04,0x04,0x09,0x05,0x08,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x0b,0x0a,0x08,0x08,0x06,0x09,0x07,0x08,0x0a,0x0a,0x04,0x08,0x08,0x0c,0x0a,0x07,0x0a,0x0a,0x08, -0x07,0x07,0x07,0x0a,0x08,0x0b,0x0a,0x08,0x07,0x0a,0x04,0x0a,0x07,0x0a,0x04,0x07,0x07,0x09,0x06,0x08,0x07,0x04,0x04,0x05,0x0d,0x0d,0x0a,0x08,0x08,0x0a,0x08,0x08,0x08,0x06,0x09,0x07,0x0c,0x07,0x0a,0x0a,0x08,0x09,0x0c,0x0a,0x0a,0x0a,0x08,0x08,0x07,0x08,0x0a,0x08,0x0a,0x09,0x0d,0x0d,0x09,0x0b,0x08,0x08,0x0e,0x08,0x06,0x09, -0x09,0x0a,0x0e,0x0e,0x0b,0x08,0x09,0x07,0x09,0x09,0x09,0x0b,0x08,0x08,0x0b,0x09,0x09,0x06,0x0a,0x0a,0x09,0x08,0x08,0x0e,0x0c,0x08,0x09,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x0f,0x09,0x09,0x09,0x0a,0x0a,0x08,0x08,0x04,0x0c,0x0b,0x0b,0x08,0x0b,0x03,0x03,0x07,0x07,0x03,0x03,0x0a,0x06,0x04,0x0c,0x0b,0x05,0x03,0x03,0x07,0x06, -0x06,0x04,0x04,0x04,0x06,0x0b,0x08,0x05,0x0a,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0a,0x06,0x07,0x09,0x07,0x03,0x04,0x06,0x08,0x05,0x0b,0x0b,0x0b,0x0f,0x0c,0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x0d,0x05,0x05,0x08,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x08,0x08,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d, -0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x08,0x08,0x0f,0x0f,0x08,0x08,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x10,0x0c,0x0d,0x08,0x09,0x09,0x0b,0x05,0x0b,0x0c,0x08,0x08,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0f,0x05,0x0c,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x0f,0x05, -0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x08,0x08,0x0c,0x08,0x08,0x0f,0x08,0x11,0x10,0x0f,0x08,0x0d,0x08,0x0d, -0x08,0x0d,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x0b,0x0b,0x05,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x00,0x13,0x0d,0x15,0x10,0x0f,0x08,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05, -0x0f,0x05,0x0f,0x05,0x09,0x09,0x08,0x08,0x07,0x13,0x0d,0x10,0x10,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x13,0x0d,0x09,0x0b,0x09,0x09,0x09,0x0b,0x09,0x09,0x13,0x13,0x0d,0x0d,0x07,0x07,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x09,0x09, -0x09,0x09,0x0f,0x05,0x0f,0x05,0x09,0x0b,0x09,0x09,0x13,0x13,0x0d,0x0d,0x13,0x13,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x04,0x05,0x04,0x00,0x00,0x00,0x0d,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0d,0x09,0x0d,0x09, -0x0d,0x09,0x0d,0x0b,0x0b,0x0b,0x04,0x04,0x08,0x07,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x07,0x09,0x08,0x09,0x0a,0x0a,0x0b,0x09,0x09,0x0a,0x08,0x0b,0x0c,0x0a,0x0c,0x0d,0x0a,0x0c,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x07,0x09,0x0a,0x0a,0x0b, -0x09,0x0a,0x09,0x0a,0x0a,0x08,0x08,0x0c,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0b,0x0f,0x0f,0x0c,0x0e,0x0e,0x09,0x0c,0x0e,0x0c,0x0a,0x0e,0x0c,0x0b,0x0b,0x0a,0x0a,0x0c,0x0d,0x0b,0x0a,0x0b,0x09,0x09,0x0f,0x0f,0x0f,0x0d,0x0f,0x0f,0x0b,0x0f,0x0f,0x0b,0x0c,0x0d,0x0c,0x0c,0x0c,0x0a,0x0e,0x0c,0x0d, -0x0b,0x0b,0x09,0x0c,0x0b,0x0b,0x0e,0x0c,0x0c,0x0e,0x09,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x09,0x0a,0x0a,0x0a,0x07,0x09,0x09,0x09,0x0a,0x0c,0x0d,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x08,0x08,0x09,0x09,0x08,0x08,0x09,0x09,0x08,0x07,0x0a,0x07,0x09,0x08, -0x09,0x0d,0x09,0x0d,0x09,0x09,0x09,0x0c,0x05,0x0d,0x0b,0x0b,0x0b,0x09,0x0c,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x0a,0x04,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x0e, -0x0e,0x0e,0x0e,0x08,0x0c,0x0c,0x08,0x07,0x08,0x08,0x09,0x08,0x0e,0x0d,0x0e,0x07,0x10,0x08,0x0d,0x0d,0x0d,0x0d,0x09,0x08,0x08,0x0c,0x09,0x0c,0x0b,0x09,0x07,0x07,0x10,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x16,0x0d,0x0d,0x07,0x04,0x07,0x04,0x07,0x04,0x04,0x04,0x08,0x09,0x09,0x09,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x07,0x0e, -0x03,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x13,0x13,0x0b,0x13,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x09,0x08,0x09,0x07,0x06,0x06,0x0b,0x09, -0x0b,0x07,0x12,0x0e,0x09,0x09,0x0f,0x0d,0x0e,0x0c,0x10,0x0d,0x0f,0x0c,0x0a,0x08,0x0c,0x09,0x0f,0x0c,0x0c,0x0a,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x12,0x0d,0x0c,0x09,0x0c,0x09,0x13,0x0e,0x0d,0x00,0x10,0x10,0x10,0x08,0x00,0x00,0x09,0x08,0x0b,0x09,0x09,0x07,0x11,0x0e,0x0f,0x0e,0x0b,0x09,0x0b,0x09,0x08,0x07,0x0c,0x0a,0x08,0x07, -0x0d,0x0b,0x0b,0x09,0x10,0x0d,0x09,0x09,0x0c,0x0c,0x0d,0x07,0x03,0x07,0x0b,0x07,0x10,0x10,0x04,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x0b,0x0c,0x04,0x03,0x04,0x03,0x0b,0x09,0x0c,0x0a,0x09,0x08,0x09,0x08,0x09,0x09,0x07,0x07,0x12,0x0d,0x12,0x0e,0x10,0x0e,0x0e, -0x0b,0x0e,0x0b,0x0e,0x0b,0x0a,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x05,0x08,0x04,0x0c,0x09,0x0e,0x0b,0x15,0x10,0x09,0x09,0x0b,0x0b,0x0d,0x0e,0x0c,0x09,0x10,0x0d,0x09,0x06,0x09,0x08,0x0a,0x08,0x0f,0x0c,0x0a,0x08,0x09,0x09,0x09,0x09,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x08,0x05,0x0b,0x05,0x0f,0x0b,0x06,0x09,0x0a,0x07, -0x0c,0x09,0x06,0x06,0x09,0x09,0x09,0x08,0x04,0x0c,0x0a,0x06,0x06,0x0a,0x07,0x0b,0x06,0x0c,0x0a,0x0a,0x07,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0a,0x06,0x09,0x07,0x0c,0x07,0x08,0x0e,0x08,0x09,0x0e,0x04,0x12,0x0e,0x0e,0x13,0x0e,0x0f,0x0f,0x0e,0x0e,0x0f,0x08,0x08,0x0a,0x0b,0x0e,0x0b,0x0f,0x04,0x07,0x09,0x0e,0x10,0x0b,0x10,0x0a, -0x0a,0x0d,0x0b,0x12,0x0f,0x08,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x10,0x08,0x08,0x10,0x0c,0x08,0x08,0x0c,0x0b,0x05,0x05,0x0b,0x09,0x09,0x09,0x09,0x0c,0x05,0x05,0x0d,0x0c,0x05,0x05,0x0d,0x07,0x07,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x06,0x09,0x08,0x0c,0x09,0x09,0x0e,0x0b,0x0c,0x0c,0x0d,0x0d,0x09,0x08,0x10,0x0d,0x11,0x0e,0x0b,0x09,0x05,0x05,0x09,0x0a,0x07,0x0a,0x08,0x09,0x08,0x0c,0x0d,0x06,0x09,0x07,0x03,0x06,0x09,0x09,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x07,0x18,0x20,0x05,0x07,0x02, -0x04,0x06,0x07,0x05,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x15,0x09,0x0c,0x0f,0x0e,0x0a,0x07,0x09,0x0c,0x0c,0x08,0x05,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x09,0x0c,0x09,0x09,0x08,0x0c,0x0a,0x0d,0x07,0x08,0x0a,0x05,0x09,0x05,0x06,0x04,0x0e,0x09,0x09,0x08,0x08,0x09,0x0f,0x0f,0x0f, -0x10,0x10,0x09,0x08,0x05,0x08,0x07,0x0a,0x07,0x0b,0x04,0x09,0x0a,0x0e,0x0e,0x0a,0x09,0x09,0x09,0x08,0x07,0x08,0x07,0x08,0x05,0x05,0x04,0x04,0x06,0x09,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x05,0x05,0x05,0x04,0x04,0x1b,0x10,0x0e,0x11,0x05,0x05,0x05,0x06,0x04,0x04,0x05, -0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x0f,0x05,0x05,0x0f,0x04,0x08,0x08,0x15,0x10,0x10,0x15,0x0f,0x08,0x08,0x0f,0x08,0x08,0x07,0x07,0x00,0x00,0x06,0x0c,0x0a,0x0b,0x09,0x14,0x11,0x0b,0x09,0x0b,0x09,0x15,0x10,0x0c,0x09,0x06,0x05,0x0a,0x00,0x0b,0x09,0x05,0x05,0x03,0x08,0x05,0x05,0x04,0x03,0x07,0x06,0x06,0x06, -0x06,0x06,0x06,0x06,0x06,0x03,0x08,0x07,0x09,0x09,0x09,0x0f,0x0d,0x0d,0x0d,0x0d,0x0f,0x0a,0x0b,0x0a,0x06,0x0f,0x12,0x07,0x12,0x08,0x0d,0x0f,0x0f,0x0f,0x07,0x0c,0x10,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x09,0x09,0x0d,0x08,0x08,0x0f,0x05,0x05,0x0f,0x05,0x05,0x0f, -0x08,0x08,0x00,0x07,0x0d,0x05,0x05,0x10,0x08,0x08,0x0c,0x08,0x08,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x18,0x18,0x0e,0x00,0x00,0x0e,0x0e,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0a,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x10,0x0a,0x0a,0x11, -0x0a,0x0a,0x0f,0x0a,0x0b,0x0d,0x0a,0x0c,0x0e,0x0f,0x0a,0x0c,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0c,0x0a,0x0b,0x0d,0x0a,0x0a,0x09,0x0d,0x0a,0x0a,0x0a,0x0b,0x07,0x08,0x0a,0x0d,0x0c,0x09,0x00,0x00,0x11,0x22,0x0b,0x00,0x02,0x05,0x05,0x07,0x0a,0x09,0x0e,0x0e,0x04,0x05,0x05,0x07,0x0c,0x04,0x07,0x04,0x07,0x09,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x0c,0x0c,0x0c,0x08,0x10,0x0b,0x0a,0x0b,0x0c,0x09,0x08,0x0c,0x0c,0x05,0x06,0x0a,0x08,0x0f,0x0d,0x0d,0x0a,0x0d,0x0a,0x09,0x09,0x0c,0x0b,0x10,0x0a,0x09,0x0a,0x05,0x06,0x05,0x0c,0x07,0x05,0x09,0x0a,0x08,0x0a,0x09,0x05,0x0a,0x0a,0x04,0x04,0x08,0x04,0x0f,0x0a,0x0a,0x0a,0x0a,0x06, -0x07,0x06,0x0a,0x08,0x0c,0x08,0x08,0x08,0x05,0x04,0x05,0x0c,0x0b,0x0b,0x0b,0x09,0x0d,0x0d,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x09,0x09,0x08,0x07,0x08,0x09,0x07,0x0f,0x0f,0x0d,0x05,0x07,0x0c,0x0f,0x0d,0x0e,0x0c,0x0c, -0x0c,0x09,0x0a,0x09,0x0a,0x0d,0x09,0x07,0x07,0x0d,0x0e,0x0a,0x08,0x05,0x05,0x0c,0x0b,0x09,0x0c,0x0b,0x09,0x09,0x0c,0x0b,0x0b,0x0d,0x10,0x10,0x09,0x11,0x06,0x06,0x04,0x04,0x0c,0x0a,0x08,0x09,0x03,0x09,0x05,0x05,0x09,0x09,0x06,0x04,0x04,0x06,0x15,0x0b,0x09,0x0b,0x09,0x09,0x05,0x05,0x05,0x05,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c, -0x04,0x06,0x06,0x05,0x05,0x03,0x05,0x03,0x06,0x03,0x06,0x08,0x05,0x09,0x07,0x0a,0x08,0x04,0x0c,0x0a,0x09,0x08,0x0a,0x0a,0x0c,0x0c,0x06,0x06,0x06,0x10,0x0f,0x10,0x08,0x0c,0x0a,0x05,0x09,0x07,0x0b,0x08,0x0b,0x08,0x0a,0x07,0x04,0x0b,0x09,0x0b,0x09,0x0c,0x0b,0x0c,0x09,0x09,0x09,0x09,0x08,0x04,0x08,0x05,0x08,0x05,0x0d,0x0a, -0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x06,0x09,0x07,0x0c,0x0a,0x0c,0x0a,0x0a,0x08,0x0a,0x08,0x08,0x0d,0x0d,0x0a,0x0a,0x07,0x0a,0x08,0x0c,0x07,0x08,0x07,0x13,0x0b,0x08,0x0a,0x04,0x06,0x0e,0x06,0x0a,0x06,0x06,0x0a,0x06,0x0b,0x09,0x0b,0x08,0x0b,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0a,0x0c,0x0a,0x0c, -0x0a,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x0a,0x08,0x08,0x08,0x04,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x09,0x07,0x09,0x06,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x10,0x0c,0x09,0x08,0x04,0x0b,0x09,0x0f,0x0e,0x0d,0x0a,0x04,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x09,0x08,0x04,0x07, -0x09,0x0a,0x10,0x10,0x10,0x0f,0x07,0x07,0x04,0x05,0x05,0x0b,0x0a,0x0d,0x06,0x0e,0x0b,0x0e,0x05,0x0b,0x0a,0x09,0x0a,0x0c,0x05,0x0a,0x0b,0x0f,0x0d,0x09,0x0d,0x0c,0x0a,0x09,0x09,0x09,0x0a,0x0d,0x0d,0x05,0x09,0x0a,0x07,0x0a,0x05,0x09,0x09,0x09,0x08,0x0a,0x0a,0x05,0x09,0x08,0x0a,0x09,0x08,0x0a,0x0a,0x08,0x09,0x09,0x0d,0x0e, -0x05,0x09,0x0a,0x09,0x0e,0x09,0x0c,0x08,0x0b,0x09,0x05,0x11,0x11,0x0c,0x0a,0x0a,0x0c,0x0b,0x0a,0x0a,0x08,0x0c,0x09,0x0f,0x09,0x0d,0x0d,0x0a,0x0b,0x0f,0x0c,0x0d,0x0c,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0d,0x0b,0x10,0x11,0x0c,0x0d,0x0a,0x0a,0x11,0x0a,0x09,0x0a,0x09,0x07,0x09,0x09,0x0d,0x08,0x0a,0x0a,0x08,0x09,0x0c,0x0a,0x0a, -0x0a,0x0a,0x08,0x07,0x08,0x0c,0x08,0x0a,0x0a,0x0e,0x0e,0x0a,0x0c,0x09,0x08,0x0e,0x09,0x09,0x0a,0x07,0x08,0x07,0x04,0x0d,0x0e,0x0a,0x08,0x08,0x0a,0x08,0x07,0x11,0x13,0x0b,0x06,0x06,0x06,0x06,0x04,0x09,0x07,0x09,0x0d,0x0a,0x0c,0x0a,0x05,0x06,0x05,0x05,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x08,0x05,0x05,0x05,0x08, -0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x04,0x05,0x04,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d, -0x0a,0x0d,0x0a,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x06,0x09,0x09,0x0d,0x0a,0x05,0x06,0x04,0x04,0x09,0x07,0x0f,0x0d,0x0a,0x09,0x0a,0x08,0x0d,0x0a,0x09,0x08,0x09,0x08,0x0b,0x08,0x0b,0x0a,0x0b,0x0a,0x0c,0x09,0x0d,0x0a,0x05,0x05,0x05,0x05,0x07, -0x07,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x08,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x05,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x04,0x0a,0x08,0x0a, -0x08,0x0a,0x08,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0c, -0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x08,0x0b,0x08,0x10,0x0c,0x10,0x0c,0x0a,0x08,0x0a,0x08,0x09,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x06,0x0c,0x08,0x09,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x08,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, -0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x0a,0x0a,0x07,0x07,0x0a,0x0a,0x05,0x05,0x0a,0x0a,0x09,0x09,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10, -0x10,0x10,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0c,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x08,0x0c,0x0d,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0c,0x0b,0x0f,0x05,0x05,0x0a,0x08,0x04,0x08,0x0f,0x0d,0x0a,0x0d,0x10,0x0d,0x0a,0x0a,0x0a,0x09,0x07,0x09, -0x05,0x06,0x09,0x06,0x09,0x0d,0x0c,0x0a,0x09,0x0a,0x08,0x0a,0x0a,0x08,0x07,0x09,0x09,0x06,0x07,0x09,0x04,0x07,0x08,0x05,0x15,0x13,0x11,0x0f,0x0c,0x09,0x12,0x10,0x0e,0x0b,0x09,0x05,0x04,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x0b,0x09,0x0b,0x09,0x0f,0x0e,0x0c,0x0a,0x0c,0x0a,0x0a,0x08,0x0d,0x0a, -0x0d,0x0a,0x0a,0x08,0x04,0x15,0x13,0x11,0x0c,0x0a,0x11,0x0c,0x0d,0x0a,0x0b,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x05,0x04,0x05,0x04,0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x0a,0x06,0x0c,0x0a,0x0c,0x0a,0x09,0x07,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x08,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x09,0x08,0x0a,0x09,0x0a,0x0a,0x0a, -0x09,0x0a,0x0a,0x0a,0x08,0x08,0x0a,0x0a,0x09,0x0a,0x07,0x07,0x09,0x09,0x05,0x0a,0x0a,0x09,0x08,0x08,0x0a,0x0a,0x0a,0x04,0x05,0x05,0x05,0x06,0x04,0x0a,0x0f,0x0f,0x0f,0x09,0x09,0x0a,0x0a,0x0c,0x0c,0x0b,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x07,0x04,0x04,0x05,0x05,0x06,0x06,0x0a,0x0a,0x09,0x08,0x0c,0x08,0x07,0x08, -0x09,0x08,0x08,0x06,0x06,0x06,0x08,0x0b,0x08,0x09,0x09,0x0a,0x04,0x08,0x07,0x0a,0x06,0x06,0x10,0x10,0x11,0x0a,0x08,0x0c,0x0d,0x0a,0x0a,0x08,0x08,0x09,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0a,0x0c,0x0a,0x0a,0x08,0x08,0x08,0x0a,0x09,0x0a,0x08,0x0f,0x0f,0x0a,0x09,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0a,0x07,0x0a,0x0a,0x08, -0x04,0x0d,0x08,0x08,0x0f,0x0c,0x0b,0x0a,0x0f,0x0c,0x0b,0x08,0x0f,0x0c,0x0c,0x0a,0x10,0x0d,0x09,0x08,0x0d,0x0d,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x16,0x13,0x0e,0x0b,0x13,0x0f,0x0f,0x0c,0x0a,0x07,0x09,0x07,0x07,0x00,0x00,0x11,0x10,0x0a,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0a,0x08,0x0c,0x0a,0x0e,0x0b,0x11,0x0e,0x0c,0x09,0x0b, -0x08,0x09,0x07,0x0f,0x0c,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x05,0x0f,0x0d,0x0a,0x09,0x0c,0x0a,0x0b,0x0a,0x0b,0x09,0x0b,0x09,0x0f,0x0e,0x09,0x09,0x0c,0x09,0x0c,0x09,0x0f,0x0d,0x09,0x08,0x09,0x08,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0d,0x0c,0x0a,0x0a,0x0f,0x0f,0x0e,0x0c, -0x09,0x08,0x0f,0x0e,0x11,0x0e,0x0c,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x0a,0x06,0x06,0x03,0x04,0x04,0x04,0x05,0x07,0x05,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x06,0x05,0x05,0x06,0x05,0x05,0x05,0x05,0x05,0x06, -0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x03,0x04,0x05,0x04,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x06,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x0b,0x06,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x08,0x0b,0x0e,0x08,0x08,0x09,0x09,0x07,0x07,0x04,0x05,0x08,0x07,0x0c,0x0a,0x0a,0x08,0x0b,0x0b,0x0b,0x10,0x09,0x0a,0x0a,0x08,0x08,0x08,0x07,0x09,0x0a,0x0c,0x0a,0x08,0x0c,0x08,0x07,0x07,0x09,0x07,0x08,0x0a,0x08,0x0a,0x0a,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x07, -0x07,0x03,0x04,0x06,0x05,0x09,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x07,0x09,0x05,0x05,0x06,0x08,0x06,0x06,0x05,0x05,0x04,0x04,0x06,0x03,0x05,0x08,0x06,0x06,0x05,0x06,0x06,0x06,0x03,0x06,0x06,0x08,0x05,0x05,0x06,0x05,0x06,0x07,0x05,0x03,0x04,0x06,0x05,0x06,0x05,0x06,0x07,0x05,0x0a,0x03,0x06,0x09,0x0f,0x0b,0x09,0x09,0x0f, -0x0b,0x0f,0x0d,0x09,0x0a,0x09,0x08,0x13,0x08,0x0a,0x0f,0x10,0x10,0x0b,0x0b,0x0b,0x08,0x08,0x09,0x07,0x08,0x09,0x03,0x00,0x00,0x00,0x00,0x0a,0x0b,0x0b,0x0b,0x08,0x07,0x0a,0x0a,0x05,0x0f,0x0a,0x0a,0x06,0x06,0x08,0x06,0x08,0x0a,0x08,0x0a,0x0f,0x0b,0x05,0x05,0x0a,0x09,0x0a,0x0a,0x0a,0x05,0x0a,0x08,0x04,0x0f,0x0a,0x0a,0x06, -0x07,0x07,0x08,0x08,0x08,0x09,0x0a,0x0a,0x09,0x07,0x08,0x0c,0x04,0x08,0x04,0x0a,0x08,0x06,0x05,0x05,0x06,0x04,0x03,0x03,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x04,0x03,0x03,0x06,0x06,0x06,0x05,0x05,0x04,0x04,0x05,0x04,0x06,0x00,0x00,0x00,0x00,0x04,0x05,0x05,0x06,0x05,0x05, -0x09,0x09,0x09,0x09,0x06,0x00,0x00,0x00,0x00,0x08,0x05,0x05,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03, -0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0b,0x0c,0x0a,0x0d,0x0b,0x10,0x0d,0x09,0x06,0x09,0x0c,0x09,0x0e,0x0c,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e, -0x11,0x07,0x04,0x09,0x0a,0x07,0x09,0x09,0x0a,0x0a,0x09,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x0b,0x09,0x09,0x09,0x06,0x0a,0x06,0x0d,0x0b,0x09,0x06,0x0e,0x09,0x0e,0x04,0x06,0x0a,0x0a,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0e,0x04,0x0a,0x04,0x09,0x07,0x04,0x04,0x09,0x04,0x0d,0x04,0x10,0x09,0x10,0x10,0x0a,0x0a,0x0a,0x09, -0x09,0x07,0x07,0x14,0x14,0x17,0x17,0x0e,0x0e,0x09,0x09,0x03,0x11,0x0d,0x0e,0x0b,0x0a,0x0b,0x09,0x09,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x0b,0x00,0x0b,0x0b,0x0b,0x06,0x09,0x09,0x10,0x06,0x10,0x06,0x0a,0x0b,0x0a,0x07,0x10,0x09,0x10,0x09,0x0d,0x0e,0x06,0x09,0x09,0x07,0x04,0x09,0x0a,0x09,0x0a,0x09, -0x0a,0x0a,0x09,0x0b,0x0b,0x10,0x06,0x09,0x07,0x0b,0x09,0x06,0x09,0x09,0x09,0x10,0x06,0x10,0x06,0x04,0x0a,0x07,0x11,0x09,0x09,0x0b,0x0b,0x11,0x09,0x00,0x00,0x00,0x0b,0x00,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x09,0x09,0x0d,0x0e,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06, -0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x09,0x07,0x07,0x07,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x09,0x0a,0x0a,0x0a,0x11,0x11,0x09,0x09,0x11,0x09,0x09,0x11,0x09,0x09,0x11,0x09,0x09,0x0d, -0x0d,0x12,0x11,0x10,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x0b,0x06,0x0b,0x06,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x10,0x0d,0x0e,0x06,0x09,0x0d,0x0e,0x0d,0x0e,0x00,0x00,0x00,0x00,0x00,0x13,0x12, -0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x0e,0x17,0x11,0x09,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x10,0x10,0x06,0x0a,0x0a,0x0a,0x15,0x0e,0x09,0x1a,0x12,0x06,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09, -0x07,0x07,0x0d,0x0b,0x0b,0x09,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x15,0x1a,0x00,0x00,0x00,0x00,0x00,0x0a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x09,0x09,0x07,0x14,0x0e,0x09,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x09,0x0a,0x0a, -0x0a,0x11,0x09,0x09,0x11,0x09,0x09,0x10,0x09,0x09,0x10,0x09,0x09,0x10,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x0b,0x06,0x06,0x07,0x07,0x14,0x0e,0x0b,0x0a,0x0a,0x00,0x09,0x09,0x09,0x06,0x0a,0x0c,0x0b,0x09,0x09,0x06,0x04,0x0d,0x0a,0x0a,0x06,0x09,0x08,0x08,0x08,0x08,0x04,0x09,0x07,0x0b,0x08,0x0a, -0x08,0x09,0x07,0x0b,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x08,0x08,0x08,0x05,0x09,0x0a,0x0a,0x09,0x06,0x0d,0x0a,0x0b,0x09,0x0b,0x08,0x0a,0x09,0x07,0x0c,0x06,0x07,0x07,0x08,0x0a,0x0a,0x09,0x11,0x09,0x11,0x06,0x04,0x03,0x09,0x04,0x02,0x00,0x02,0x04,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x07,0x07,0x07,0x09,0x09,0x10,0x07,0x0d,0x0a,0x10,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x0f,0x08,0x0f,0x08,0x0f,0x0b,0x0c,0x0c,0x0c,0x0d,0x0f,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0d,0x0a,0x12,0x0e,0x08,0x08,0x05,0x05,0x05,0x06,0x04,0x0a,0x04,0x04,0x0e,0x0b,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x03,0x00,0x00,0x04,0x00,0x00,0x0b,0x0a,0x07,0x08,0x0c,0x05,0x06,0x0b,0x0c,0x05,0x0a,0x09,0x09,0x0c,0x0b,0x05,0x07,0x0b,0x0a,0x0a,0x0b,0x0a,0x0a,0x0b,0x0a,0x0d,0x0c,0x09,0x09,0x09,0x04,0x06,0x0a,0x0a,0x09,0x09,0x09,0x0a,0x0b,0x08,0x0c,0x09,0x09,0x0c,0x0a,0x0c, -0x09,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0a,0x07,0x08,0x0c,0x05,0x06,0x0c,0x05,0x0a,0x09,0x09,0x0b,0x07,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0d,0x0c,0x05,0x0a,0x09,0x0b,0x0b,0x14,0x00,0x0b,0x09,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x05,0x00,0x0d,0x0b,0x0b,0x0c,0x09,0x0b,0x0d,0x0d,0x08,0x0b,0x0d,0x0d,0x0b,0x0d,0x0e,0x0d,0x0b,0x09,0x0a,0x0d,0x0c,0x0a,0x0c,0x0c,0x0b,0x0c,0x0c,0x0d,0x0a,0x0b,0x0c,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0e,0x08,0x0a,0x0a,0x0f,0x09,0x09,0x0d,0x0f,0x0a,0x09,0x12,0x0a,0x0a,0x0d, -0x09,0x09,0x0d,0x0a,0x0d,0x0e,0x0f,0x09,0x0d,0x09,0x0b,0x09,0x0a,0x0a,0x0b,0x09,0x0a,0x0d,0x09,0x0b,0x0b,0x09,0x09,0x0a,0x10,0x09,0x09,0x0a,0x0a,0x07,0x06,0x09,0x09,0x09,0x09,0x09,0x0f,0x09,0x0f,0x08,0x09,0x0f,0x0b,0x09,0x0f,0x0d,0x0d,0x0f,0x0a,0x09,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x0a,0x09,0x0a,0x0f, -0x0a,0x09,0x09,0x09,0x0f,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0d,0x0c,0x0b,0x09,0x0d,0x0b,0x0c,0x0a,0x0b,0x0c,0x0d,0x0c,0x0a,0x0c,0x0b,0x0c,0x0b,0x0d,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0d,0x0b,0x0d,0x0c,0x02,0x02,0x03,0x03,0x03,0x05,0x06,0x0f,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x05,0x0e,0x0a, -0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x05,0x0a,0x09,0x0a,0x07,0x0f,0x09,0x0a,0x0a,0x0a,0x0e,0x0a,0x0a,0x07,0x0e,0x0a,0x0a,0x0c,0x0c,0x04,0x05,0x13,0x13,0x13,0x13,0x18,0x09,0x09,0x04,0x09,0x07,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x0a,0x09,0x09,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x08,0x09,0x0a,0x07,0x07,0x0a,0x0a,0x04,0x05,0x08,0x07,0x0d,0x0b,0x0a,0x08,0x0a,0x08,0x07,0x07,0x0a,0x09,0x0e,0x09,0x08,0x08,0x0c,0x0d,0x07,0x0b,0x08,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07, -0x07,0x04,0x04,0x04,0x04,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x09,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x0a,0x05,0x08,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x0c,0x0b,0x09,0x08,0x07,0x09,0x07,0x08,0x0a,0x0a,0x04,0x08,0x09,0x0d,0x0b,0x08,0x0a,0x0a,0x08,0x08,0x07,0x08,0x0b,0x09,0x0b,0x0b,0x09,0x07,0x0a,0x04,0x0a,0x08,0x0b,0x04,0x08,0x07,0x0a,0x07,0x09,0x07,0x04,0x04,0x05,0x0e,0x0e,0x0a,0x08, -0x08,0x0a,0x09,0x08,0x08,0x07,0x0a,0x07,0x0d,0x08,0x0b,0x0b,0x08,0x0a,0x0d,0x0a,0x0a,0x0a,0x08,0x09,0x07,0x08,0x0b,0x09,0x0b,0x09,0x0e,0x0e,0x0a,0x0c,0x08,0x09,0x0f,0x08,0x07,0x0a,0x0a,0x0b,0x0f,0x0f,0x0b,0x09,0x0a,0x07,0x0a,0x0a,0x0a,0x0c,0x09,0x09,0x0c,0x0a,0x0a,0x06,0x0b,0x0b,0x0a,0x08,0x08,0x0f,0x0d,0x08,0x09,0x0a, -0x0a,0x0b,0x0b,0x0c,0x0c,0x06,0x10,0x0a,0x09,0x0a,0x0b,0x0b,0x09,0x09,0x05,0x0d,0x0c,0x0c,0x08,0x0c,0x04,0x04,0x07,0x07,0x04,0x04,0x0a,0x07,0x05,0x0d,0x0c,0x05,0x04,0x04,0x08,0x06,0x06,0x04,0x04,0x04,0x06,0x0b,0x08,0x05,0x0a,0x0c,0x0a,0x0a,0x08,0x0d,0x0a,0x0a,0x06,0x07,0x09,0x07,0x04,0x04,0x07,0x09,0x06,0x0b,0x0b,0x0b, -0x10,0x0d,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x0d,0x0e,0x06,0x06,0x09,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x09,0x09,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x10,0x09,0x09,0x10,0x10,0x09,0x09,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x11,0x0d,0x0e, -0x09,0x0a,0x0a,0x0b,0x06,0x0b,0x0d,0x09,0x09,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x06,0x0d,0x09,0x09,0x04,0x09,0x09,0x09,0x09,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x09,0x0d,0x09,0x09,0x10,0x09,0x12,0x11,0x10,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x0b,0x0b,0x06,0x06,0x0b,0x06,0x0b, -0x06,0x0b,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x09,0x06,0x06,0x06,0x06,0x00,0x14,0x0e,0x17,0x11,0x10,0x09,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x09,0x09,0x07,0x14,0x0e,0x11,0x11,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x0a,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x14,0x0e, -0x0a,0x0b,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x14,0x14,0x0e,0x0e,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x10,0x06,0x10,0x06,0x0a,0x0b,0x0a,0x0a,0x14,0x14,0x0e,0x0e,0x14,0x14,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04, -0x04,0x04,0x00,0x00,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, -0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x0e,0x0b,0x0b,0x0b,0x04,0x04,0x09,0x07,0x0a,0x0b,0x0a,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x08,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x0b,0x09,0x0b,0x0d,0x0b,0x0d,0x0e,0x0b,0x0d,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x08,0x09,0x0a,0x0a,0x0b,0x0a,0x0b,0x0a,0x0a,0x0a,0x09,0x09,0x0d,0x0c,0x0c,0x0b,0x0c,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x0c,0x10,0x10,0x0c,0x0f,0x0e,0x09, -0x0d,0x0e,0x0d,0x0a,0x0e,0x0d,0x0c,0x0c,0x0a,0x0b,0x0d,0x0e,0x0c,0x0a,0x0c,0x0a,0x09,0x10,0x10,0x10,0x0e,0x10,0x10,0x0c,0x10,0x10,0x0c,0x0d,0x0d,0x0d,0x0c,0x0c,0x0b,0x0f,0x0d,0x0e,0x0c,0x0c,0x0a,0x0d,0x0c,0x0c,0x0e,0x0d,0x0c,0x0f,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0c,0x0c,0x0a,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x0a,0x0a,0x0a, -0x0a,0x0a,0x0a,0x09,0x09,0x0a,0x0b,0x0a,0x0a,0x08,0x0a,0x0a,0x0a,0x0a,0x0d,0x0e,0x0b,0x0b,0x0b,0x0d,0x0b,0x0c,0x09,0x08,0x0a,0x0a,0x08,0x08,0x09,0x09,0x08,0x08,0x0b,0x08,0x09,0x08,0x09,0x0d,0x0a,0x0e,0x09,0x0a,0x0a,0x0d,0x05,0x0d,0x0c,0x0c,0x0b,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05, -0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0f,0x0f,0x0f,0x0f,0x08,0x0d,0x0c,0x08,0x07,0x08,0x09,0x0a,0x08,0x0e,0x0e,0x0f,0x08,0x11,0x08,0x0e,0x0e,0x0e,0x0e,0x0a,0x08,0x08,0x0d,0x0a,0x0d, -0x0b,0x09,0x08,0x07,0x11,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x17,0x0e,0x0e,0x07,0x04,0x08,0x04,0x08,0x04,0x04,0x04,0x08,0x0a,0x0a,0x09,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x07,0x0f,0x04,0x0f,0x0f,0x0f,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x0b,0x14,0x14,0x0b,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x0a,0x08,0x09,0x07,0x06,0x06,0x0c,0x09,0x0c,0x07,0x13,0x0f,0x0a,0x09,0x10,0x0d,0x0e,0x0d,0x11,0x0e,0x10,0x0d,0x0b,0x08,0x0c,0x0a,0x10,0x0c,0x0d,0x0a,0x0d,0x0a,0x0f,0x0b,0x0f,0x0b, -0x13,0x0e,0x0d,0x0a,0x0d,0x0a,0x15,0x0f,0x0d,0x00,0x11,0x11,0x11,0x08,0x00,0x00,0x0a,0x09,0x0c,0x09,0x09,0x07,0x12,0x0f,0x10,0x0f,0x0c,0x0a,0x0c,0x0a,0x09,0x07,0x0d,0x0a,0x09,0x07,0x0e,0x0b,0x0b,0x0a,0x11,0x0e,0x09,0x0a,0x0c,0x0c,0x0e,0x08,0x03,0x08,0x0c,0x07,0x11,0x11,0x04,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x07,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, -0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, -0x0d,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x0c,0x0c,0x05,0x04,0x05,0x04,0x0c,0x0a,0x0d,0x0b,0x09,0x08,0x09,0x08,0x0a,0x0a,0x07,0x07,0x13,0x0e,0x14,0x0f,0x11,0x0e,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x0b,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x09,0x05,0x08,0x04,0x0d,0x0a,0x0f,0x0b,0x17,0x11,0x0a,0x0a,0x0c,0x0c,0x0e, -0x0f,0x0d,0x0a,0x11,0x0d,0x09,0x07,0x0a,0x08,0x0b,0x08,0x10,0x0c,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x08,0x07,0x08,0x07,0x08,0x06,0x09,0x09,0x05,0x0b,0x06,0x10,0x0b,0x06,0x0a,0x0a,0x08,0x0d,0x0a,0x06,0x06,0x0a,0x0a,0x0a,0x08,0x04,0x0d,0x0a,0x06,0x06,0x0b,0x08,0x0c,0x07,0x0d,0x0a,0x0b,0x08,0x0c,0x0a,0x0a,0x08,0x0d,0x0a,0x0a, -0x06,0x09,0x07,0x0d,0x07,0x09,0x0f,0x08,0x0a,0x0f,0x05,0x13,0x0f,0x0f,0x14,0x0f,0x10,0x10,0x0f,0x0f,0x10,0x09,0x08,0x0b,0x0c,0x0f,0x0c,0x10,0x04,0x08,0x0a,0x0f,0x12,0x0c,0x12,0x0b,0x0b,0x0e,0x0c,0x13,0x10,0x09,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x11,0x09,0x09,0x11,0x0d,0x09,0x09,0x0d,0x0b,0x06, -0x06,0x0b,0x0a,0x0a,0x0a,0x0a,0x0d,0x06,0x06,0x0e,0x0d,0x06,0x06,0x0e,0x07,0x07,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x09,0x07,0x0a,0x09,0x0d,0x0a,0x0a,0x0f,0x0b,0x0d,0x0d,0x0e,0x0e,0x0a,0x08,0x11, -0x0e,0x12,0x0f,0x0c,0x0a,0x05,0x05,0x0a,0x0b,0x07,0x0a,0x09,0x0a,0x08,0x0d,0x0e,0x07,0x0a,0x07,0x04,0x06,0x09,0x09,0x04,0x04,0x03,0x04,0x06,0x06,0x06,0x08,0x19,0x22,0x06,0x07,0x02,0x05,0x07,0x07,0x05,0x08,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x17,0x09,0x0d,0x10,0x0f,0x0b,0x08, -0x0a,0x0c,0x0c,0x08,0x05,0x0b,0x09,0x0c,0x09,0x0b,0x09,0x09,0x0d,0x0a,0x0a,0x09,0x0d,0x0a,0x0e,0x08,0x09,0x0b,0x05,0x0a,0x06,0x06,0x04,0x0f,0x0a,0x0a,0x09,0x09,0x0a,0x10,0x10,0x10,0x11,0x11,0x09,0x08,0x05,0x09,0x08,0x0a,0x08,0x0b,0x04,0x0a,0x0a,0x0f,0x0f,0x0a,0x09,0x0a,0x09,0x09,0x08,0x09,0x08,0x08,0x05,0x06,0x04,0x04, -0x06,0x0a,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x05,0x05,0x05,0x04,0x04,0x1d,0x11,0x0f,0x12,0x05,0x05,0x06,0x07,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x10,0x06,0x06,0x10,0x04,0x09,0x09,0x17,0x11,0x11,0x17,0x10,0x09,0x09,0x10,0x09,0x09,0x07, -0x07,0x00,0x00,0x06,0x0d,0x0a,0x0c,0x0a,0x15,0x12,0x0c,0x09,0x0c,0x09,0x17,0x11,0x0d,0x0a,0x07,0x05,0x0b,0x00,0x0c,0x09,0x06,0x05,0x03,0x08,0x06,0x06,0x04,0x03,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x09,0x07,0x0a,0x0a,0x09,0x10,0x0e,0x0e,0x0d,0x0e,0x10,0x0b,0x0c,0x0a,0x07,0x10,0x13,0x07,0x14,0x09,0x0e,0x10, -0x10,0x10,0x07,0x0d,0x11,0x0d,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x0a,0x0a,0x0a,0x0e,0x09,0x09,0x10,0x06,0x06,0x10,0x06,0x06,0x10,0x08,0x08,0x00,0x07,0x0e,0x06,0x06,0x11,0x09,0x09,0x0d,0x09,0x09,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, -0x05,0x1a,0x1a,0x0f,0x00,0x00,0x0f,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0f,0x0b,0x0b,0x0e,0x11,0x0b,0x0b,0x12,0x0b,0x0b,0x10,0x0b,0x0b,0x0d,0x0b,0x0d,0x0e,0x10,0x0b,0x0d,0x0b,0x0c,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0d,0x0a,0x0b,0x0d,0x0b,0x0b,0x0a,0x0d, -0x0b,0x0b,0x0b,0x0c,0x08,0x09,0x0b,0x0d,0x0d,0x09,0x00,0x00,0x13,0x26,0x0c,0x00,0x02,0x05,0x05,0x07,0x0b,0x0a,0x10,0x0f,0x04,0x06,0x06,0x08,0x0d,0x04,0x08,0x04,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x0d,0x0d,0x0d,0x09,0x12,0x0c,0x0b,0x0c,0x0d,0x0a,0x09,0x0d,0x0d,0x05,0x07,0x0b,0x09,0x11,0x0e, -0x0e,0x0b,0x0e,0x0b,0x0a,0x0a,0x0d,0x0c,0x12,0x0b,0x0b,0x0b,0x06,0x07,0x06,0x0d,0x08,0x05,0x0a,0x0b,0x09,0x0b,0x0a,0x06,0x0b,0x0b,0x05,0x05,0x09,0x05,0x10,0x0b,0x0b,0x0b,0x0b,0x07,0x08,0x06,0x0b,0x09,0x0e,0x09,0x09,0x09,0x06,0x05,0x06,0x0d,0x0c,0x0c,0x0c,0x0a,0x0e,0x0e,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a, -0x0a,0x0a,0x05,0x05,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x0a,0x0a,0x09,0x08,0x09,0x0a,0x08,0x11,0x11,0x0f,0x05,0x08,0x0d,0x10,0x0e,0x10,0x0d,0x0d,0x0d,0x0a,0x0b,0x0a,0x0c,0x0e,0x0a,0x07,0x08,0x0e,0x10,0x0b,0x09,0x05,0x05,0x0d,0x0c,0x0a,0x0d,0x0c,0x0a,0x0a,0x0e,0x0c,0x0c,0x0e,0x12,0x12, -0x0a,0x13,0x07,0x07,0x04,0x04,0x0d,0x0b,0x09,0x0b,0x03,0x0a,0x06,0x06,0x0b,0x0b,0x07,0x04,0x04,0x07,0x17,0x0c,0x0a,0x0c,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x05,0x07,0x06,0x06,0x06,0x04,0x05,0x04,0x06,0x04,0x07,0x09,0x05,0x0a,0x08,0x0b,0x09,0x05,0x0d,0x0b,0x0b,0x09,0x0b,0x0b,0x0d,0x0d,0x07,0x07, -0x07,0x12,0x11,0x12,0x09,0x0d,0x0b,0x05,0x0a,0x08,0x0c,0x09,0x0c,0x09,0x0b,0x08,0x04,0x0c,0x0a,0x0c,0x0a,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x09,0x05,0x09,0x06,0x09,0x06,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x07,0x0b,0x07,0x0a,0x08,0x0a,0x06,0x0a,0x08,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0b,0x09,0x09,0x0e,0x0e,0x0c,0x0b,0x08, -0x0b,0x09,0x0d,0x08,0x09,0x07,0x15,0x0c,0x09,0x0c,0x04,0x07,0x0f,0x06,0x0b,0x07,0x07,0x0b,0x07,0x0c,0x0a,0x0c,0x09,0x0c,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x05,0x0b,0x09,0x09,0x09,0x05,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b, -0x0b,0x07,0x0a,0x08,0x0a,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x12,0x0e,0x0b,0x09,0x05,0x0c,0x0a,0x10,0x10,0x0e,0x0b,0x04,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0b,0x09,0x04,0x08,0x0a,0x0b,0x12,0x12,0x12,0x11,0x07,0x07,0x04,0x05,0x05,0x0c,0x0b,0x0f,0x07,0x0f,0x0d,0x10,0x05,0x0c,0x0b,0x0a,0x0b,0x0d,0x05,0x0b,0x0c,0x11, -0x0e,0x0a,0x0e,0x0e,0x0b,0x0a,0x0a,0x0b,0x0b,0x0f,0x0e,0x05,0x0b,0x0c,0x08,0x0b,0x05,0x0b,0x0a,0x0a,0x08,0x0b,0x0b,0x05,0x0a,0x09,0x0b,0x0a,0x08,0x0b,0x0b,0x09,0x0b,0x0a,0x0e,0x0f,0x05,0x0b,0x0b,0x0b,0x0f,0x0a,0x0d,0x09,0x0c,0x0a,0x05,0x13,0x13,0x0e,0x0b,0x0b,0x0d,0x0c,0x0b,0x0b,0x09,0x0d,0x0a,0x10,0x0a,0x0e,0x0e,0x0b, -0x0d,0x11,0x0d,0x0e,0x0e,0x0b,0x0c,0x0a,0x0b,0x0e,0x0b,0x0e,0x0d,0x12,0x13,0x0d,0x0f,0x0b,0x0c,0x13,0x0b,0x0a,0x0b,0x0a,0x07,0x0a,0x0a,0x0e,0x08,0x0b,0x0b,0x09,0x0a,0x0d,0x0b,0x0b,0x0b,0x0b,0x09,0x08,0x09,0x0d,0x09,0x0b,0x0b,0x0f,0x10,0x0b,0x0d,0x0a,0x09,0x0f,0x0a,0x0a,0x0b,0x07,0x09,0x08,0x05,0x0f,0x0f,0x0b,0x09,0x09, -0x0b,0x09,0x07,0x13,0x15,0x0c,0x07,0x07,0x07,0x07,0x05,0x0a,0x08,0x0b,0x0e,0x0b,0x0d,0x0b,0x06,0x06,0x05,0x05,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x09,0x06,0x09,0x06,0x06,0x06,0x09,0x09,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x06,0x0a, -0x0a,0x0e,0x0b,0x05,0x07,0x05,0x05,0x0a,0x08,0x11,0x0f,0x0c,0x0a,0x0b,0x09,0x0e,0x0b,0x0b,0x09,0x0b,0x09,0x0c,0x09,0x0c,0x0b,0x0d,0x0b,0x0e,0x0a,0x0e,0x0b,0x06,0x06,0x06,0x06,0x08,0x08,0x09,0x09,0x09,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x09,0x0d,0x0b,0x0d,0x0b,0x0d, -0x0b,0x0d,0x0b,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x05,0x05,0x05,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x05,0x09,0x05,0x09,0x05,0x09,0x05,0x11,0x10,0x11,0x10,0x11,0x10,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e, -0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0c,0x09,0x0c,0x09,0x12,0x0e,0x12,0x0e,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b, -0x09,0x0b,0x06,0x0e,0x09,0x0a,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x09,0x09,0x0a, -0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x08,0x08,0x0b,0x0b,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, -0x0b,0x0f,0x0f,0x0d,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x0c,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x10,0x0e,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c, -0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x09,0x0d,0x0e,0x0b,0x0b,0x0b,0x0a,0x0a,0x09,0x0d,0x0c,0x11,0x05,0x05,0x0b,0x09,0x05,0x09,0x11,0x0e,0x0b,0x0e,0x12,0x0f,0x0b,0x0b,0x0b,0x0a,0x08,0x0a,0x06,0x06,0x0a,0x06,0x0a,0x0e,0x0e,0x0b,0x0a,0x0b,0x09,0x0c,0x0c,0x08,0x08,0x0a,0x0a,0x07,0x07,0x0a,0x05,0x07,0x09,0x05,0x18,0x16,0x13,0x10, -0x0e,0x0a,0x14,0x12,0x0f,0x0c,0x0a,0x05,0x05,0x0e,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0a,0x0c,0x0a,0x0c,0x0a,0x10,0x10,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0e,0x0b,0x0c,0x08,0x05,0x18,0x16,0x13,0x0d,0x0b,0x13,0x0d,0x0e,0x0b,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0b, -0x0e,0x0b,0x0b,0x07,0x0b,0x07,0x0d,0x0b,0x0d,0x0b,0x0a,0x08,0x0d,0x0b,0x0e,0x0b,0x0b,0x0b,0x09,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x09,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x09,0x09,0x0b,0x0b,0x0a,0x0c,0x08,0x08,0x0a,0x0a,0x05,0x0b,0x0b,0x0a,0x09,0x09,0x0b,0x0b,0x0b,0x05,0x05,0x06,0x05,0x07, -0x05,0x0b,0x10,0x10,0x10,0x0b,0x0b,0x0b,0x0b,0x0d,0x0e,0x0c,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x09,0x09,0x08,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x0b,0x0b,0x09,0x0e,0x09,0x08,0x09,0x0a,0x08,0x08,0x07,0x07,0x07,0x09,0x0c,0x09,0x0a,0x0a,0x0b,0x05,0x09,0x07,0x0b,0x07,0x07,0x11,0x12,0x13,0x0c,0x09,0x0e,0x0f,0x0b,0x0b,0x09, -0x09,0x0a,0x0b,0x0b,0x0d,0x0b,0x0c,0x0f,0x0b,0x0d,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x0a,0x0c,0x09,0x11,0x10,0x0b,0x0a,0x0c,0x0a,0x0c,0x09,0x0b,0x09,0x0d,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x05,0x0e,0x09,0x09,0x10,0x0d,0x0c,0x0b,0x11,0x0e,0x0d,0x09,0x11,0x0d,0x0e,0x0b,0x12,0x0e,0x0a,0x09,0x0f,0x0e,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b, -0x19,0x15,0x10,0x0c,0x15,0x11,0x10,0x0d,0x0b,0x08,0x0a,0x07,0x08,0x00,0x00,0x13,0x12,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0a,0x09,0x0b,0x09,0x0d,0x0b,0x10,0x0d,0x13,0x10,0x0e,0x0b,0x0c,0x09,0x0a,0x08,0x11,0x0d,0x0d,0x0b,0x10,0x0c,0x10,0x0c,0x05,0x10,0x0e,0x0b,0x0a,0x0d,0x0b,0x0c,0x0b,0x0c,0x0a,0x0c,0x0a,0x10,0x10,0x0a,0x0a, -0x0e,0x0a,0x0e,0x0a,0x10,0x0e,0x0a,0x08,0x0a,0x08,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0d,0x0b,0x0f,0x0d,0x0b,0x0b,0x10,0x10,0x0f,0x0e,0x0b,0x09,0x11,0x0f,0x13,0x10,0x0e,0x0a,0x0d,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x04,0x04,0x0b,0x06,0x06,0x03,0x04,0x04,0x04,0x05,0x08,0x05,0x04,0x07,0x04,0x04,0x04,0x06,0x06,0x04,0x04,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x05,0x06,0x06,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x05,0x05,0x04,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x08,0x06,0x05,0x05,0x0a,0x0a,0x0a,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x07,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a, -0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x0c,0x06,0x0b,0x0b,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x09,0x0d,0x10,0x09,0x09,0x0a,0x0b,0x08,0x08,0x05,0x06,0x09,0x07,0x0d,0x0b,0x0b, -0x09,0x0c,0x0c,0x0c,0x12,0x0a,0x0b,0x0b,0x09,0x09,0x09,0x08,0x0a,0x0b,0x0e,0x0b,0x09,0x0e,0x09,0x08,0x08,0x0a,0x07,0x09,0x0b,0x09,0x0b,0x0b,0x07,0x09,0x07,0x07,0x08,0x06,0x06,0x08,0x08,0x04,0x04,0x07,0x05,0x0a,0x08,0x08,0x08,0x07,0x06,0x07,0x06,0x08,0x0a,0x06,0x06,0x07,0x09,0x07,0x07,0x06,0x06,0x05,0x05,0x07,0x03,0x06, -0x09,0x06,0x07,0x05,0x07,0x07,0x07,0x04,0x06,0x06,0x09,0x05,0x06,0x06,0x06,0x07,0x08,0x06,0x03,0x04,0x06,0x05,0x06,0x06,0x07,0x08,0x06,0x0b,0x03,0x07,0x0a,0x11,0x0c,0x0a,0x0a,0x10,0x0c,0x10,0x0e,0x0a,0x0b,0x0a,0x09,0x15,0x09,0x0b,0x11,0x12,0x12,0x0c,0x0c,0x0c,0x09,0x09,0x0a,0x08,0x09,0x0a,0x04,0x00,0x00,0x00,0x00,0x0b, -0x0c,0x0c,0x0c,0x09,0x07,0x0b,0x0b,0x06,0x10,0x0b,0x0b,0x07,0x06,0x09,0x06,0x09,0x0b,0x09,0x0b,0x11,0x0c,0x06,0x05,0x0b,0x0a,0x0b,0x0b,0x0b,0x06,0x0b,0x09,0x05,0x10,0x0b,0x0b,0x07,0x08,0x08,0x09,0x09,0x09,0x0a,0x0b,0x0b,0x0a,0x08,0x08,0x0e,0x05,0x09,0x05,0x0b,0x08,0x07,0x05,0x05,0x07,0x05,0x03,0x03,0x07,0x06,0x03,0x03, -0x03,0x03,0x03,0x03,0x03,0x04,0x09,0x09,0x06,0x06,0x07,0x06,0x07,0x04,0x03,0x04,0x06,0x07,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x07,0x00,0x00,0x00,0x00,0x04,0x06,0x06,0x07,0x05,0x06,0x0a,0x0a,0x0a,0x0a,0x06,0x00,0x00,0x00,0x00,0x09,0x06,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, -0x06,0x06,0x0f,0x0c,0x0d,0x0b,0x0e,0x0c,0x12,0x0e,0x0a,0x07,0x0a,0x0d,0x0a,0x10,0x0d,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x13,0x08,0x05,0x0a,0x0b,0x08,0x0a,0x0a,0x0b,0x0b,0x0a,0x13,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0a,0x06,0x0b,0x06,0x0e, -0x0d,0x0a,0x06,0x10,0x0a,0x10,0x05,0x06,0x0b,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x10,0x05,0x0b,0x05,0x0a,0x08,0x05,0x05,0x0a,0x05,0x0e,0x05,0x11,0x0a,0x11,0x11,0x0b,0x0b,0x0b,0x0a,0x0a,0x08,0x08,0x16,0x16,0x19,0x19,0x10,0x10,0x0a,0x0a,0x03,0x13,0x0e,0x10,0x0d,0x0b,0x0d,0x0a,0x0a,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x0b,0x05,0x0c,0x00,0x0c,0x0c,0x0c,0x06,0x0a,0x0a,0x11,0x06,0x11,0x06,0x0b,0x0d,0x0b,0x08,0x11,0x0a,0x11,0x0a,0x0e,0x10,0x06,0x0a,0x0a,0x08,0x05,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0d,0x0c,0x11,0x06,0x0a,0x08,0x0d,0x0a,0x06,0x0a,0x0a,0x0a,0x11,0x06,0x11,0x06,0x05,0x0b,0x07,0x13,0x0a,0x0a,0x0c,0x0c,0x13, -0x0a,0x00,0x00,0x00,0x0c,0x00,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x0a,0x0a,0x0e,0x10,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, -0x08,0x08,0x08,0x0a,0x08,0x08,0x08,0x16,0x10,0x16,0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x0a,0x0b,0x0b,0x0b,0x13,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x0e,0x0e,0x15,0x13,0x11,0x0a,0x10,0x0a,0x10,0x0a,0x10,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x0d, -0x06,0x0d,0x06,0x0d,0x0d,0x06,0x0d,0x06,0x0a,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x0e,0x10,0x06,0x0a,0x0e,0x10,0x0e,0x10,0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x08,0x00,0x00,0x0b,0x00,0x00,0x00,0x16,0x10,0x19,0x13,0x0a,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x11,0x11,0x07,0x0b,0x0b,0x0b,0x17,0x10,0x0a,0x1d,0x15,0x06,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x08,0x08,0x0e,0x0d,0x0d,0x0a,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x18,0x1d,0x00,0x00,0x00,0x00,0x00,0x0b,0x0a,0x00,0x00,0x00,0x00,0x00,0x00, -0x11,0x08,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0a,0x0a,0x08,0x16,0x10,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x0d,0x0d, -0x06,0x06,0x08,0x08,0x16,0x10,0x0c,0x0b,0x0b,0x00,0x0a,0x0a,0x0a,0x07,0x0b,0x0d,0x0c,0x0a,0x0a,0x07,0x05,0x0e,0x0b,0x0b,0x07,0x0b,0x09,0x09,0x09,0x09,0x05,0x0a,0x08,0x0c,0x09,0x0b,0x09,0x0a,0x08,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x09,0x09,0x09,0x05,0x0a,0x0b,0x0b,0x0a,0x06,0x0e,0x0b,0x0c,0x0a, -0x0c,0x09,0x0b,0x0a,0x08,0x0d,0x07,0x08,0x08,0x09,0x0b,0x0b,0x0a,0x13,0x0a,0x13,0x06,0x05,0x03,0x0a,0x04,0x02,0x00,0x03,0x04,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x12,0x08,0x0e,0x0b,0x12,0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x10,0x09,0x10,0x09,0x10,0x0c, -0x0d,0x0d,0x0d,0x0f,0x10,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0e,0x0b,0x14,0x10,0x09,0x09,0x05,0x05,0x05,0x07,0x04,0x0b,0x04,0x04,0x10,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x0c,0x0b,0x08,0x09,0x0d,0x05,0x06,0x0d,0x0d,0x05, -0x0b,0x0a,0x0a,0x0d,0x0d,0x05,0x08,0x0d,0x0b,0x0c,0x0c,0x0b,0x0b,0x0d,0x0b,0x0f,0x0e,0x0a,0x0a,0x0a,0x04,0x07,0x0b,0x0b,0x0a,0x0a,0x0a,0x0b,0x0c,0x09,0x0d,0x0a,0x0a,0x0d,0x0b,0x0e,0x0a,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0b,0x08,0x09,0x0d,0x06,0x07,0x0d,0x06,0x0b,0x0a,0x0a,0x0d,0x08,0x0d,0x0c,0x0c,0x0b,0x0d,0x0b,0x0f, -0x0e,0x05,0x0b,0x0a,0x0c,0x0c,0x17,0x00,0x0c,0x0a,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x0e,0x0c,0x0d,0x0d,0x0a,0x0d,0x0e,0x0e,0x09,0x0c,0x0e,0x0e,0x0d,0x0e,0x0f,0x0f, -0x0d,0x0a,0x0b,0x0e,0x0d,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0b,0x0c,0x0d,0x0c,0x0f,0x0c,0x0c,0x0c,0x0d,0x10,0x09,0x0b,0x0b,0x11,0x0a,0x0a,0x0f,0x11,0x0c,0x0a,0x14,0x0b,0x0b,0x0e,0x0a,0x0a,0x0e,0x0b,0x0e,0x0f,0x11,0x0a,0x0f,0x0a,0x0c,0x0a,0x0c,0x0b,0x0c,0x0a,0x0b,0x0f,0x0a,0x0c,0x0d,0x0a,0x0a,0x0b,0x12,0x0a,0x0a,0x0b, -0x0b,0x08,0x06,0x0b,0x0b,0x0b,0x0a,0x0b,0x11,0x0b,0x11,0x09,0x0b,0x11,0x0d,0x0b,0x11,0x0e,0x0e,0x11,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x0b,0x0a,0x0b,0x0b,0x11,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0f,0x0d,0x0c,0x0a,0x0f,0x0d,0x0d,0x0b,0x0d,0x0d,0x0e,0x0e,0x0b,0x0d,0x0d, -0x0e,0x0d,0x0f,0x0d,0x0e,0x0e,0x0d,0x0c,0x0d,0x0d,0x0e,0x0f,0x0c,0x0e,0x0e,0x02,0x02,0x03,0x04,0x03,0x05,0x07,0x10,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0b,0x06,0x10,0x0b,0x0b,0x0b,0x0a,0x0b,0x0a,0x0b,0x05,0x0b,0x0a,0x0b,0x08,0x10,0x0a,0x0b,0x0b,0x0b,0x10,0x0b,0x0b,0x07,0x10,0x0b,0x0b,0x0d,0x0d,0x04,0x05,0x16, -0x15,0x15,0x16,0x1b,0x0a,0x0a,0x05,0x0a,0x07,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x0b, -0x0c,0x05,0x06,0x09,0x08,0x0e,0x0c,0x0c,0x09,0x0c,0x09,0x08,0x08,0x0b,0x0a,0x0f,0x0a,0x09,0x09,0x0d,0x0f,0x08,0x0c,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08, -0x08,0x0b,0x0b,0x0a,0x0c,0x0c,0x05,0x05,0x05,0x05,0x05,0x0b,0x06,0x09,0x08,0x08,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0d,0x0c,0x0a,0x09,0x07,0x0a,0x08,0x09,0x0c,0x0c,0x05, -0x09,0x0a,0x0e,0x0c,0x09,0x0c,0x0c,0x09,0x09,0x08,0x09,0x0c,0x0a,0x0c,0x0c,0x0a,0x08,0x0c,0x05,0x0c,0x09,0x0c,0x05,0x09,0x08,0x0b,0x08,0x0a,0x08,0x05,0x05,0x06,0x0f,0x10,0x0c,0x09,0x09,0x0c,0x0a,0x09,0x09,0x08,0x0b,0x08,0x0e,0x08,0x0c,0x0c,0x09,0x0b,0x0e,0x0c,0x0c,0x0c,0x09,0x0a,0x08,0x09,0x0c,0x0a,0x0c,0x0a,0x0f,0x10, -0x0b,0x0d,0x09,0x0a,0x10,0x09,0x08,0x0b,0x0b,0x0c,0x11,0x11,0x0d,0x0a,0x0b,0x08,0x0b,0x0b,0x0b,0x0d,0x0a,0x0a,0x0d,0x0b,0x0b,0x07,0x0c,0x0c,0x0b,0x09,0x09,0x11,0x0e,0x09,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x07,0x12,0x0b,0x0b,0x0b,0x0c,0x0c,0x0a,0x0a,0x05,0x0e,0x0d,0x0d,0x09,0x0d,0x04,0x04,0x08,0x08,0x04,0x04,0x0c,0x08, -0x05,0x0e,0x0d,0x05,0x04,0x04,0x09,0x07,0x07,0x04,0x04,0x04,0x07,0x0d,0x09,0x06,0x0c,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0b,0x07,0x08,0x0a,0x08,0x04,0x04,0x07,0x0a,0x06,0x0d,0x0d,0x0d,0x11,0x0e,0x11,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x0e,0x10,0x06,0x06,0x0a,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0a,0x0a,0x16, -0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x11,0x0a,0x0a,0x11,0x11,0x0a,0x0a,0x0e,0x10,0x06,0x06,0x0e,0x10,0x06,0x06,0x0e,0x10,0x06,0x06,0x13,0x0e,0x10,0x0a,0x0b,0x0b,0x0d,0x06,0x0d,0x0e,0x0a,0x0a,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x11,0x06,0x0e,0x0a, -0x0a,0x05,0x0a,0x0a,0x0a,0x0a,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x16,0x10,0x16,0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x11, -0x0a,0x15,0x13,0x11,0x0a,0x10,0x0a,0x10,0x0a,0x10,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x0d,0x0d,0x06,0x06,0x0d,0x06,0x0d,0x06,0x0d,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x0a,0x06,0x06,0x06,0x06,0x00,0x16,0x10,0x19,0x13,0x11,0x0a, -0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0a,0x0a,0x08,0x16,0x10,0x13,0x13,0x11,0x11,0x11,0x0b,0x0b,0x0b,0x0b,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x16,0x10,0x0b,0x0d,0x0b,0x0b,0x0b,0x0d,0x0b,0x0b,0x16,0x16,0x10,0x10,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x06,0x06,0x0e,0x10,0x06,0x06,0x0e,0x10, -0x06,0x06,0x0e,0x10,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x11,0x06,0x11,0x06,0x0b,0x0d,0x0b,0x0b,0x16,0x16,0x10,0x10,0x16,0x16,0x10,0x10,0x10,0x10,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x05,0x05,0x06,0x05,0x00,0x00,0x00,0x10,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0d,0x0d,0x0d, -0x0d,0x0d,0x0d,0x0b,0x10,0x0b,0x10,0x0b,0x10,0x0b,0x10,0x0d,0x0d,0x0d,0x05,0x05,0x0a,0x08,0x0b,0x0c,0x0b,0x0a,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0c,0x0a,0x0d,0x0e,0x0c,0x0e,0x10,0x0c,0x0f,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, -0x0b,0x0b,0x0a,0x09,0x0a,0x0c,0x0b,0x0d,0x0b,0x0c,0x0b,0x0b,0x0b,0x0a,0x0a,0x0e,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x0f,0x0e,0x0f,0x12,0x12,0x0d,0x12,0x12,0x0e,0x11,0x10,0x0b,0x0f,0x10,0x0e,0x0b,0x10,0x0e,0x0d,0x0d,0x0b,0x0c,0x0e,0x0f,0x0d,0x0c,0x0d,0x0b,0x0a,0x12,0x11,0x11,0x10,0x12,0x12,0x0d,0x12,0x12,0x0d,0x0f, -0x0f,0x0e,0x0e,0x0e,0x0c,0x11,0x0f,0x10,0x0e,0x0e,0x0b,0x0e,0x0d,0x0d,0x10,0x0e,0x0e,0x11,0x0a,0x0a,0x0b,0x0a,0x0c,0x0c,0x0d,0x0e,0x0b,0x0b,0x0b,0x0a,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0c,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x0c,0x0f,0x10,0x0c,0x0c,0x0c,0x0f,0x0c,0x0d,0x0a,0x09,0x0b,0x0b,0x09,0x09, -0x0a,0x0b,0x09,0x09,0x0c,0x09,0x0a,0x09,0x0a,0x0f,0x0b,0x10,0x0a,0x0b,0x0b,0x0e,0x06,0x0f,0x0d,0x0e,0x0d,0x0b,0x0e,0x0b,0x0f,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0c,0x05,0x05,0x05,0x06,0x06, -0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x11,0x11,0x11,0x11,0x09,0x0e,0x0e,0x09,0x08,0x09,0x0a,0x0b,0x09,0x10,0x10,0x10,0x08,0x13,0x09,0x10,0x10,0x10,0x0f,0x0b,0x09,0x09,0x0f,0x0b,0x0f,0x0d,0x0a,0x09,0x08,0x13,0x08,0x0a,0x09,0x09,0x09,0x09,0x09,0x1a,0x10,0x10,0x08,0x05,0x09,0x05,0x09,0x05,0x05,0x05,0x09,0x0b,0x0b,0x0a,0x07, -0x07,0x04,0x04,0x04,0x07,0x04,0x08,0x10,0x04,0x11,0x11,0x11,0x0b,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x0d,0x16,0x16,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x09, -0x0b,0x09,0x0a,0x08,0x07,0x07,0x0d,0x0a,0x0e,0x08,0x15,0x11,0x0b,0x0b,0x12,0x0f,0x10,0x0e,0x13,0x0f,0x12,0x0f,0x0c,0x09,0x0e,0x0b,0x12,0x0e,0x0e,0x0c,0x0e,0x0b,0x10,0x0d,0x11,0x0d,0x15,0x10,0x0e,0x0b,0x0e,0x0b,0x17,0x11,0x0f,0x00,0x13,0x13,0x13,0x09,0x00,0x00,0x0b,0x0a,0x0d,0x0b,0x0a,0x08,0x14,0x11,0x12,0x10,0x0e,0x0b, -0x0d,0x0b,0x0a,0x08,0x0e,0x0b,0x0a,0x08,0x10,0x0d,0x0d,0x0b,0x13,0x10,0x0a,0x0b,0x0e,0x0e,0x0f,0x09,0x04,0x09,0x0d,0x08,0x13,0x13,0x05,0x00,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x08,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x09,0x0d,0x0e,0x05,0x04,0x05,0x04,0x0d,0x0b,0x0e,0x0c,0x0b,0x09,0x0a,0x09,0x0b,0x0b,0x08, -0x08,0x15,0x10,0x16,0x11,0x13,0x10,0x11,0x0d,0x11,0x0d,0x11,0x0d,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x06,0x09,0x05,0x0e,0x0b,0x10,0x0d,0x19,0x13,0x0b,0x0b,0x0d,0x0d,0x0f,0x10,0x0e,0x0b,0x13,0x0f,0x0a,0x08,0x0b,0x09,0x0c,0x09,0x12,0x0e,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x09,0x08,0x09,0x07,0x09,0x07,0x0a,0x0a,0x06, -0x0d,0x06,0x12,0x0d,0x07,0x0b,0x0c,0x09,0x0e,0x0b,0x07,0x07,0x0b,0x0b,0x0b,0x09,0x05,0x0e,0x0b,0x07,0x07,0x0c,0x09,0x0d,0x07,0x0f,0x0b,0x0c,0x09,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0b,0x07,0x0a,0x08,0x0e,0x08,0x0a,0x10,0x09,0x0b,0x11,0x05,0x16,0x11,0x11,0x16,0x11,0x11,0x11,0x11,0x11,0x12,0x0a,0x09,0x0c,0x0d,0x11,0x0d,0x12, -0x05,0x09,0x0b,0x10,0x14,0x0d,0x14,0x0c,0x0c,0x0f,0x0d,0x16,0x12,0x0a,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x10,0x10,0x13,0x0a,0x0a,0x13,0x0e,0x0a,0x0a,0x0e,0x0d,0x06,0x06,0x0d,0x0b,0x0b,0x0b,0x0b,0x0e,0x06,0x06,0x10,0x0e,0x06,0x06,0x10,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0a,0x08,0x0b,0x0a,0x0e,0x0b,0x0b,0x11,0x0d,0x0e,0x0e,0x10,0x10,0x0b,0x09,0x13,0x0f,0x14,0x10,0x0d,0x0b,0x06,0x06,0x0b,0x0c,0x08,0x0b,0x0a,0x0b,0x09,0x0e,0x0f,0x08,0x0b,0x08,0x04,0x07,0x0a,0x0a,0x04,0x04,0x03,0x04,0x07, -0x07,0x07,0x09,0x1c,0x26,0x06,0x08,0x03,0x05,0x07,0x08,0x06,0x09,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x19,0x0a,0x0e,0x11,0x11,0x0c,0x09,0x0b,0x0e,0x0e,0x09,0x06,0x0d,0x0a,0x0d,0x0b,0x0d,0x0a,0x0a,0x0e,0x0b,0x0b,0x0a,0x0e,0x0c,0x10,0x09,0x0a,0x0c,0x06,0x0b,0x06,0x07,0x05,0x11, -0x0b,0x0b,0x0a,0x0a,0x0b,0x12,0x12,0x12,0x13,0x13,0x0a,0x09,0x05,0x0a,0x09,0x0c,0x09,0x0d,0x05,0x0b,0x0b,0x10,0x10,0x0c,0x0a,0x0b,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x06,0x06,0x05,0x04,0x07,0x0b,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x05,0x05,0x05,0x05,0x05,0x20,0x13,0x11, -0x14,0x05,0x05,0x06,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x11,0x06,0x06,0x11,0x05,0x0a,0x0a,0x19,0x13,0x13,0x19,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x08,0x08,0x00,0x00,0x07,0x0e,0x0b,0x0d,0x0b,0x18,0x14,0x0d,0x0a,0x0d,0x0a,0x19,0x13,0x0e,0x0b,0x07,0x06,0x0c,0x00,0x0d,0x0a,0x06,0x06,0x03,0x09, -0x06,0x07,0x05,0x04,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x0a,0x08,0x0b,0x0b,0x0a,0x12,0x0f,0x0f,0x0f,0x10,0x12,0x0c,0x0d,0x0b,0x07,0x12,0x15,0x08,0x16,0x0a,0x10,0x11,0x11,0x11,0x08,0x0e,0x13,0x0e,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0b,0x0b,0x0b,0x10,0x0a, -0x0a,0x11,0x06,0x06,0x11,0x06,0x06,0x11,0x09,0x09,0x00,0x08,0x10,0x06,0x06,0x13,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x1d,0x1d,0x11,0x00,0x00,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0c,0x0c,0x0c, -0x11,0x0c,0x0c,0x0f,0x13,0x0c,0x0c,0x14,0x0c,0x0c,0x12,0x0c,0x0d,0x0f,0x0c,0x0f,0x10,0x11,0x0c,0x0f,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0d,0x0c,0x0f,0x0b,0x0d,0x0f,0x0c,0x0c,0x0b,0x0f,0x0c,0x0c,0x0c,0x0d,0x08,0x0a,0x0c,0x0f,0x0f,0x0a,0x00,0x00,0x15,0x2a,0x0e,0x00,0x02,0x06,0x06,0x08,0x0c,0x0b,0x11,0x11,0x05,0x06,0x06,0x09, -0x0e,0x05,0x08,0x05,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x0e,0x0e,0x0e,0x09,0x14,0x0e,0x0c,0x0d,0x0f,0x0b,0x0a,0x0e,0x0f,0x06,0x08,0x0c,0x0a,0x13,0x10,0x10,0x0c,0x10,0x0d,0x0b,0x0b,0x0e,0x0d,0x14,0x0c,0x0c,0x0c,0x06,0x08,0x06,0x0e,0x09,0x06,0x0b,0x0c,0x0a,0x0c,0x0b,0x07,0x0c,0x0c,0x05,0x05, -0x0a,0x05,0x12,0x0c,0x0c,0x0c,0x0c,0x07,0x09,0x07,0x0c,0x0a,0x0f,0x0a,0x0a,0x0a,0x06,0x05,0x06,0x0e,0x0e,0x0e,0x0d,0x0b,0x10,0x10,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x0b,0x0b,0x09,0x09,0x0a,0x0b,0x08,0x13,0x13,0x10, -0x06,0x09,0x0e,0x12,0x10,0x11,0x0e,0x0e,0x0e,0x0b,0x0c,0x0b,0x0d,0x10,0x0b,0x08,0x09,0x10,0x11,0x0c,0x09,0x06,0x06,0x0e,0x0e,0x0b,0x0e,0x0e,0x0b,0x0b,0x0f,0x0e,0x0e,0x10,0x14,0x13,0x0b,0x15,0x08,0x08,0x05,0x05,0x0e,0x0c,0x0a,0x0c,0x04,0x0b,0x07,0x07,0x0c,0x0c,0x08,0x05,0x05,0x08,0x19,0x0e,0x0b,0x0e,0x0b,0x0b,0x06,0x06, -0x06,0x06,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x05,0x08,0x07,0x07,0x06,0x04,0x06,0x04,0x07,0x04,0x08,0x0a,0x06,0x0b,0x09,0x0c,0x0a,0x05,0x0f,0x0c,0x0c,0x0a,0x0c,0x0c,0x0e,0x0e,0x07,0x08,0x08,0x14,0x13,0x14,0x0a,0x0e,0x0c,0x06,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x0c,0x09,0x05,0x0e,0x0b,0x0e,0x0b,0x0f,0x0e,0x0f,0x0b,0x0b,0x0b,0x0b, -0x0a,0x05,0x0a,0x06,0x0a,0x07,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x07,0x0d,0x07,0x0b,0x09,0x0b,0x07,0x0b,0x09,0x0e,0x0c,0x0e,0x0c,0x0c,0x0a,0x0c,0x0a,0x0a,0x10,0x10,0x0d,0x0c,0x09,0x0c,0x0a,0x0f,0x09,0x0a,0x08,0x17,0x0d,0x0a,0x0d,0x05,0x08,0x11,0x07,0x0d,0x07,0x07,0x0d,0x07,0x0e,0x0b,0x0d,0x0a,0x0d,0x0a,0x0b,0x0b,0x0b, -0x0b,0x0b,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x08,0x05,0x0c,0x0a,0x0a,0x0a,0x05,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x07,0x0b,0x09,0x0b,0x07,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x14,0x0f,0x0c,0x0a,0x05,0x0e,0x0b,0x12,0x11,0x10,0x0c,0x05,0x14,0x0f, -0x14,0x0f,0x14,0x0f,0x0c,0x0a,0x05,0x09,0x0b,0x0d,0x13,0x13,0x14,0x13,0x08,0x08,0x05,0x06,0x06,0x0e,0x0c,0x10,0x08,0x11,0x0e,0x11,0x06,0x0e,0x0c,0x0b,0x0c,0x0f,0x06,0x0c,0x0d,0x13,0x10,0x0b,0x10,0x0f,0x0c,0x0b,0x0b,0x0c,0x0c,0x10,0x10,0x06,0x0c,0x0d,0x09,0x0c,0x06,0x0c,0x0c,0x0b,0x09,0x0c,0x0c,0x06,0x0b,0x0a,0x0c,0x0b, -0x09,0x0c,0x0c,0x0a,0x0c,0x0b,0x10,0x11,0x06,0x0c,0x0c,0x0c,0x11,0x0b,0x0f,0x0a,0x0d,0x0b,0x06,0x15,0x15,0x0f,0x0c,0x0c,0x0f,0x0e,0x0c,0x0c,0x0a,0x0f,0x0b,0x12,0x0b,0x10,0x10,0x0c,0x0e,0x13,0x0f,0x10,0x0f,0x0c,0x0d,0x0b,0x0c,0x0f,0x0c,0x10,0x0e,0x14,0x15,0x0f,0x10,0x0c,0x0d,0x15,0x0c,0x0b,0x0c,0x0b,0x08,0x0b,0x0b,0x10, -0x09,0x0c,0x0c,0x0a,0x0b,0x0f,0x0c,0x0c,0x0c,0x0c,0x0a,0x09,0x0a,0x0e,0x0a,0x0d,0x0c,0x11,0x11,0x0c,0x0f,0x0b,0x0a,0x11,0x0b,0x0b,0x0c,0x08,0x0a,0x09,0x05,0x11,0x11,0x0c,0x0a,0x0a,0x0c,0x0a,0x08,0x15,0x18,0x0d,0x07,0x08,0x08,0x08,0x05,0x0b,0x09,0x0c,0x10,0x0d,0x0f,0x0c,0x06,0x07,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x06,0x06, -0x06,0x0a,0x06,0x0a,0x06,0x06,0x06,0x0a,0x0a,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x06,0x05,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10, -0x0c,0x10,0x0c,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x0e,0x0c,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x07,0x0b,0x0b,0x10,0x0c,0x06,0x08,0x05,0x05,0x0b,0x09,0x13,0x10,0x0d,0x0b,0x0c,0x0a,0x10,0x0d,0x0c,0x0a,0x0c,0x0a,0x0d,0x0a,0x0e,0x0c,0x0e,0x0c,0x0f, -0x0b,0x10,0x0c,0x06,0x06,0x06,0x06,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x0b,0x0e,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0a,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x07,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f, -0x0c,0x06,0x05,0x06,0x05,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x13,0x12,0x13,0x12,0x13,0x12,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b, -0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0d,0x0a,0x0d,0x0a,0x14,0x0f,0x14,0x0f,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x07,0x0f,0x0a,0x0b,0x05,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x09, -0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x14,0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x0d,0x0d,0x09,0x09,0x0c,0x0c,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x0f,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0e,0x0e,0x0d,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x11,0x10,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0d,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0a,0x0f,0x10,0x0c,0x0c,0x0c,0x0b,0x0b,0x0a,0x0f,0x0d,0x12,0x06,0x06,0x0c,0x0a,0x05,0x0a,0x13,0x10,0x0c,0x10, -0x14,0x11,0x0d,0x0c,0x0c,0x0b,0x09,0x0b,0x06,0x07,0x0b,0x07,0x0b,0x10,0x0f,0x0c,0x0b,0x0c,0x0a,0x0d,0x0d,0x09,0x09,0x0b,0x0b,0x08,0x08,0x0b,0x05,0x08,0x0a,0x06,0x1a,0x18,0x16,0x12,0x0f,0x0b,0x17,0x14,0x11,0x0e,0x0b,0x06,0x05,0x10,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0b,0x0e,0x0b,0x0e,0x0b,0x12,0x11, -0x0e,0x0c,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x10,0x0c,0x0d,0x09,0x05,0x1a,0x18,0x16,0x0e,0x0c,0x15,0x0e,0x10,0x0c,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x06,0x05,0x10,0x0c,0x10,0x0c,0x0c,0x07,0x0d,0x07,0x0e,0x0c,0x0e,0x0c,0x0b,0x09,0x0f,0x0c,0x0f,0x0c,0x0c,0x0c,0x0a,0x0e,0x0b,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10, -0x0c,0x0c,0x0a,0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0b,0x0d,0x09,0x09,0x0b,0x0c,0x06,0x0c,0x0c,0x0b,0x0a,0x0a,0x0c,0x0c,0x0c,0x06,0x06,0x07,0x06,0x08,0x05,0x0d,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0d,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x08,0x05,0x05,0x06,0x06,0x07,0x07, -0x0d,0x0c,0x0c,0x0a,0x0f,0x0a,0x09,0x0a,0x0b,0x09,0x09,0x08,0x08,0x08,0x0a,0x0d,0x0a,0x0c,0x0b,0x0c,0x05,0x0a,0x08,0x0c,0x08,0x08,0x13,0x14,0x15,0x0d,0x0a,0x0f,0x11,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0c,0x0e,0x0c,0x0d,0x11,0x0c,0x0f,0x0c,0x0c,0x0a,0x0a,0x09,0x0d,0x0b,0x0d,0x0a,0x13,0x12,0x0d,0x0b,0x0d,0x0b,0x0d,0x0a,0x0d, -0x0a,0x0e,0x0c,0x0c,0x09,0x0c,0x0c,0x0a,0x05,0x10,0x0a,0x0a,0x12,0x0e,0x0e,0x0c,0x13,0x0f,0x0e,0x0a,0x12,0x0f,0x0f,0x0c,0x14,0x10,0x0b,0x09,0x10,0x10,0x10,0x0c,0x0f,0x0c,0x0f,0x0c,0x1c,0x17,0x11,0x0e,0x18,0x13,0x12,0x0e,0x0c,0x09,0x0b,0x08,0x09,0x00,0x00,0x15,0x14,0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0a,0x0c,0x0a,0x0f, -0x0c,0x12,0x0e,0x15,0x12,0x0f,0x0c,0x0d,0x0a,0x0b,0x09,0x12,0x0e,0x0e,0x0c,0x12,0x0d,0x12,0x0d,0x06,0x12,0x10,0x0c,0x0b,0x0f,0x0c,0x0e,0x0c,0x0e,0x0b,0x0e,0x0b,0x12,0x11,0x0b,0x0b,0x0f,0x0b,0x0f,0x0b,0x12,0x10,0x0b,0x09,0x0b,0x09,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0e,0x0c, -0x10,0x0f,0x0c,0x0c,0x12,0x12,0x11,0x0f,0x0c,0x0a,0x13,0x11,0x15,0x12,0x0f,0x0b,0x0e,0x0d,0x0c,0x0c,0x0c,0x0b,0x0c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x0c,0x07,0x07,0x03,0x04,0x04,0x04,0x06,0x08,0x06,0x05,0x08,0x05,0x05,0x05,0x07,0x07,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x07,0x06, -0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0x05,0x06,0x05,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x09,0x07,0x05,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b, -0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b, -0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x0d,0x07,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06, -0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0a,0x0e,0x11,0x0a,0x0a,0x0c,0x0c,0x09,0x09,0x05,0x06,0x0a,0x08,0x0f,0x0c,0x0c,0x0a,0x0d,0x0d,0x0d,0x14,0x0b,0x0c,0x0c,0x0a,0x0a,0x0a,0x09,0x0b,0x0c,0x0f,0x0c,0x0a,0x0f,0x0a,0x09,0x09,0x0b,0x08,0x0a,0x0c,0x0a,0x0c,0x0c, -0x08,0x0a,0x07,0x08,0x09,0x06,0x06,0x09,0x09,0x04,0x05,0x07,0x06,0x0b,0x09,0x09,0x09,0x08,0x07,0x07,0x06,0x09,0x0b,0x07,0x07,0x07,0x0a,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x03,0x06,0x0a,0x07,0x07,0x06,0x07,0x07,0x07,0x04,0x07,0x07,0x0a,0x06,0x07,0x07,0x06,0x07,0x09,0x06,0x03,0x04,0x07,0x06,0x07,0x06,0x07,0x09,0x06,0x0c, -0x03,0x07,0x0b,0x12,0x0d,0x0b,0x0b,0x12,0x0e,0x12,0x10,0x0b,0x0c,0x0b,0x09,0x18,0x0a,0x0c,0x13,0x14,0x14,0x0d,0x0e,0x0d,0x0a,0x0a,0x0b,0x09,0x0a,0x0b,0x04,0x00,0x00,0x00,0x00,0x0c,0x0d,0x0d,0x0d,0x0a,0x08,0x0c,0x0c,0x07,0x12,0x0c,0x0c,0x07,0x07,0x0a,0x07,0x0a,0x0c,0x0a,0x0c,0x13,0x0e,0x07,0x06,0x0c,0x0b,0x0c,0x0c,0x0c, -0x07,0x0c,0x0a,0x05,0x12,0x0c,0x0c,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0c,0x0c,0x0b,0x09,0x09,0x0f,0x05,0x0a,0x05,0x0c,0x09,0x07,0x06,0x06,0x07,0x06,0x04,0x03,0x07,0x07,0x03,0x04,0x04,0x04,0x03,0x04,0x03,0x05,0x0a,0x0a,0x07,0x07,0x07,0x07,0x08,0x05,0x03,0x04,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x06,0x05,0x07,0x00,0x00, -0x00,0x00,0x05,0x07,0x07,0x07,0x06,0x07,0x0b,0x0b,0x0b,0x0b,0x07,0x00,0x00,0x00,0x00,0x0a,0x07,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0b,0x08, -0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x04,0x08,0x08,0x07,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x08,0x07,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x10,0x0d,0x0f,0x0c,0x10,0x0d,0x14,0x10,0x0b,0x08,0x0b,0x0e,0x0b,0x11,0x0f,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x07,0x07,0x07, -0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x12,0x12,0x15,0x09,0x05,0x0b,0x0c,0x09,0x0b,0x0b,0x0c,0x0c,0x0b,0x15,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0e,0x0b,0x0b,0x0b,0x07,0x0c,0x07,0x10,0x0e,0x0b,0x07,0x12,0x0b,0x12,0x05,0x07,0x0c,0x0c,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x12,0x05,0x0c,0x05,0x0b,0x09,0x05,0x05,0x0b,0x05,0x10,0x05, -0x13,0x0b,0x13,0x13,0x0c,0x0c,0x0c,0x0b,0x0b,0x09,0x09,0x19,0x19,0x1c,0x1c,0x12,0x12,0x0b,0x0b,0x04,0x15,0x10,0x12,0x0e,0x0c,0x0e,0x0b,0x0b,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x0e,0x00,0x0e,0x0e,0x0e,0x07,0x0b,0x0b,0x13,0x07,0x13,0x07,0x0c,0x0e,0x0c,0x09,0x13,0x0b,0x13,0x0b,0x10,0x12,0x07,0x0b, -0x0b,0x09,0x05,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0b,0x0e,0x0e,0x13,0x07,0x0b,0x09,0x0e,0x0b,0x07,0x0b,0x0b,0x0b,0x13,0x07,0x13,0x07,0x05,0x0c,0x08,0x15,0x0b,0x0b,0x0e,0x0e,0x15,0x0b,0x00,0x00,0x00,0x0e,0x00,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x0b,0x0b,0x10,0x12,0x13,0x07, -0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x09,0x09,0x09,0x19,0x12,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x0b,0x0c,0x0c,0x0c,0x15,0x15,0x0b,0x0b,0x15,0x0b, -0x0b,0x15,0x0b,0x0b,0x15,0x0b,0x0b,0x10,0x10,0x17,0x15,0x13,0x0b,0x12,0x0b,0x12,0x0b,0x12,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0e,0x07,0x0e,0x07,0x0b,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x13,0x10,0x12,0x07,0x0b,0x10,0x12,0x10, -0x12,0x00,0x00,0x00,0x00,0x00,0x18,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x09,0x00,0x00,0x0d,0x00,0x00,0x00,0x19,0x12,0x1c,0x15,0x0b,0x0c,0x0c,0x0c,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x13,0x13,0x08,0x0c,0x0c,0x0c,0x1a,0x11,0x0b,0x20,0x17,0x07,0x0c,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x09,0x09,0x10,0x0e,0x0e,0x0b,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x09,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x0b,0x0b,0x09,0x19,0x12,0x0b,0x0c,0x0c, -0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x15,0x0b,0x0b,0x15,0x0b,0x0b,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0e,0x07,0x07,0x09,0x09,0x19,0x12,0x0e,0x0c,0x0c,0x00,0x0b,0x0b,0x0b,0x08,0x0c,0x0e,0x0d,0x0b,0x0b,0x08,0x05,0x10,0x0c,0x0d,0x07,0x0c,0x0a,0x0a, -0x0a,0x0a,0x05,0x0b,0x09,0x0d,0x0a,0x0c,0x0a,0x0b,0x09,0x0e,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x09,0x0a,0x0a,0x06,0x0b,0x0c,0x0d,0x0b,0x07,0x10,0x0c,0x0d,0x0b,0x0d,0x0a,0x0c,0x0b,0x08,0x0f,0x08,0x09,0x09,0x0a,0x0d,0x0d,0x0b,0x15,0x0b,0x15,0x07,0x05,0x04,0x0b,0x05,0x03,0x00,0x03,0x05,0x00,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x13,0x09,0x10,0x0c,0x14,0x0f,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x13,0x12,0x0a,0x12,0x0a,0x12,0x0e,0x0e,0x0f,0x0f,0x10,0x12,0x15,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x10,0x0c,0x16,0x11,0x0a,0x0a,0x06,0x06,0x06,0x08,0x05, -0x0c,0x05,0x05,0x12,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x00,0x05,0x00,0x00,0x0d,0x0c,0x09,0x0a,0x0e,0x06,0x07,0x0e,0x0e,0x06,0x0c,0x0b,0x0c,0x0f,0x0e,0x06,0x08,0x0e,0x0d,0x0d,0x0d,0x0c,0x0c,0x0e,0x0c,0x10,0x0f,0x0b,0x0b,0x0b,0x05,0x08,0x0c,0x0c,0x0c,0x0c,0x0b,0x0d, -0x0d,0x0a,0x0e,0x0b,0x0c,0x0f,0x0c,0x0f,0x0c,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0c,0x09,0x0a,0x0e,0x06,0x07,0x0e,0x06,0x0c,0x0b,0x0c,0x0e,0x08,0x0e,0x0d,0x0d,0x0c,0x0e,0x0c,0x10,0x0f,0x06,0x0c,0x0b,0x0d,0x0e,0x19,0x00,0x0d,0x0c,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x10,0x0d,0x0e,0x0f,0x0c,0x0e,0x10,0x10,0x0a,0x0d,0x10,0x0f,0x0e,0x10,0x11,0x10,0x0e,0x0c,0x0c,0x10,0x0f,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0c,0x0d,0x0e,0x0e,0x10,0x0d,0x0d,0x0d,0x0e,0x11,0x0a,0x0c,0x0c,0x12,0x0b,0x0b, -0x10,0x13,0x0d,0x0b,0x16,0x0c,0x0c,0x10,0x0b,0x0b,0x10,0x0c,0x10,0x11,0x12,0x0b,0x10,0x0b,0x0e,0x0b,0x0d,0x0c,0x0d,0x0b,0x0d,0x10,0x0b,0x0d,0x0e,0x0b,0x0b,0x0d,0x14,0x0b,0x0b,0x0c,0x0c,0x09,0x07,0x0c,0x0c,0x0c,0x0b,0x0c,0x13,0x0c,0x13,0x0a,0x0c,0x13,0x0e,0x0c,0x13,0x10,0x10,0x13,0x0c,0x0c,0x13,0x13,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x13,0x13,0x0c,0x0c,0x0c,0x13,0x0d,0x0b,0x0c,0x0c,0x13,0x10,0x0e,0x0f,0x0f,0x0e,0x0f,0x0d,0x0e,0x10,0x0f,0x0e,0x0b,0x11,0x0e,0x0e,0x0c,0x0e,0x0f,0x10,0x0f,0x0c,0x0f,0x0e,0x0f,0x0e,0x10,0x0f,0x0f,0x0f,0x0e,0x0d,0x0f,0x0e,0x0f,0x11,0x0e,0x10,0x0f,0x02,0x02,0x03,0x04,0x03,0x06,0x07,0x12,0x0c,0x0d,0x0d,0x0c,0x0d, -0x0c,0x0c,0x0e,0x0d,0x0c,0x06,0x12,0x0c,0x0c,0x0c,0x0b,0x0d,0x0b,0x0c,0x06,0x0c,0x0b,0x0c,0x09,0x12,0x0c,0x0c,0x0c,0x0c,0x11,0x0c,0x0c,0x08,0x11,0x0c,0x0c,0x0e,0x0e,0x05,0x06,0x18,0x18,0x18,0x18,0x1e,0x0b,0x0b,0x05,0x0b,0x08,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, -0x08,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0a,0x0b,0x0c,0x09,0x09,0x0c,0x0d,0x05,0x07,0x0a,0x09,0x10,0x0e,0x0d,0x0a,0x0d,0x0a,0x09,0x09,0x0c,0x0b,0x11,0x0b,0x0a,0x0a,0x0f,0x10,0x09,0x0d,0x0a,0x0c,0x0b,0x0b,0x0b, -0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x0d,0x0d,0x05,0x05,0x05,0x05,0x05,0x0c,0x07,0x0a,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0f,0x0d,0x0b,0x0a,0x08,0x0b,0x09,0x0a,0x0d,0x0d,0x05,0x0a,0x0b,0x10,0x0e,0x09,0x0d,0x0d,0x0a,0x0a,0x09,0x0a,0x0d,0x0b,0x0e,0x0d,0x0b,0x09,0x0d,0x05,0x0d,0x0a,0x0d,0x05,0x0a,0x09,0x0c,0x08,0x0b, -0x09,0x05,0x05,0x07,0x11,0x11,0x0d,0x0a,0x0a,0x0d,0x0b,0x0a,0x0a,0x08,0x0c,0x09,0x10,0x09,0x0e,0x0e,0x0a,0x0c,0x10,0x0d,0x0d,0x0d,0x0a,0x0b,0x09,0x0a,0x0d,0x0b,0x0d,0x0b,0x11,0x11,0x0c,0x0f,0x0a,0x0b,0x12,0x0a,0x08,0x0c,0x0c,0x0d,0x13,0x13,0x0e,0x0b,0x0c,0x09,0x0c,0x0c,0x0c,0x0f,0x0b,0x0b,0x0e,0x0c,0x0c,0x08,0x0d,0x0d, -0x0c,0x0a,0x0a,0x13,0x10,0x0a,0x0b,0x0d,0x0d,0x0d,0x0d,0x0f,0x0e,0x08,0x14,0x0c,0x0c,0x0c,0x0e,0x0e,0x0b,0x0b,0x06,0x10,0x0e,0x0e,0x0a,0x0f,0x05,0x05,0x09,0x09,0x05,0x05,0x0d,0x08,0x06,0x10,0x0f,0x06,0x05,0x05,0x09,0x08,0x08,0x05,0x05,0x05,0x08,0x0e,0x0a,0x06,0x0d,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x0d,0x07,0x09,0x0b,0x09, -0x05,0x05,0x08,0x0b,0x07,0x0e,0x0e,0x0e,0x13,0x10,0x13,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x10,0x12,0x07,0x07,0x0b,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0b,0x0b,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x0b,0x0b,0x13,0x13,0x0b,0x0b,0x10,0x12,0x07,0x07,0x10,0x12,0x07, -0x07,0x10,0x12,0x07,0x07,0x15,0x10,0x12,0x0b,0x0c,0x0c,0x0e,0x07,0x0e,0x10,0x0b,0x0b,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x13,0x07,0x10,0x0b,0x0b,0x05,0x0b,0x0b,0x0b,0x0b,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x19,0x12,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x12,0x12,0x15,0x15,0x15,0x15,0x15,0x15,0x10,0x0b,0x0b,0x10,0x0b,0x0b,0x13,0x0b,0x17,0x15,0x13,0x0b,0x12,0x0b,0x12,0x0b,0x12,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e, -0x07,0x0e,0x0e,0x07,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x0b,0x07,0x07,0x07,0x07,0x00,0x19,0x12,0x1c,0x15,0x13,0x0b,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0b,0x0b,0x09,0x19,0x12,0x15,0x15,0x13,0x13,0x13,0x0c,0x0c,0x0c,0x0c, -0x0e,0x07,0x0e,0x07,0x0e,0x07,0x19,0x12,0x0c,0x0e,0x0c,0x0c,0x0c,0x0e,0x0c,0x0c,0x19,0x19,0x12,0x12,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x10,0x12,0x07,0x07,0x10,0x12,0x07,0x07,0x10,0x12,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x13,0x07,0x13,0x07,0x0c,0x0e,0x0c,0x0c,0x19,0x19,0x12,0x12,0x19,0x19,0x12,0x12,0x12,0x12, -0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x05,0x05,0x07,0x05,0x00,0x00,0x00,0x12,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x05,0x05, -0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x12,0x0c,0x12,0x0c,0x12,0x0c,0x12,0x0e,0x0e,0x0e,0x05,0x05,0x0b,0x09,0x0c,0x0d,0x0c,0x0b,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0c,0x0b,0x0c,0x0d,0x0d,0x0e,0x0c,0x0c,0x0e,0x0b,0x0e,0x10,0x0d,0x10,0x11,0x0d,0x10,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0a,0x0b,0x0d,0x0d,0x0e,0x0c,0x0e,0x0c,0x0c,0x0d,0x0b,0x0b,0x10,0x0e,0x0f,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x10,0x10,0x10,0x13, -0x13,0x0f,0x13,0x13,0x0f,0x12,0x12,0x0c,0x10,0x12,0x10,0x0c,0x12,0x10,0x0f,0x0f,0x0d,0x0e,0x10,0x11,0x0f,0x0d,0x0f,0x0c,0x0b,0x13,0x13,0x13,0x11,0x13,0x13,0x0e,0x13,0x13,0x0f,0x10,0x10,0x10,0x0f,0x0f,0x0e,0x13,0x10,0x11,0x0f,0x0f,0x0c,0x10,0x0f,0x0f,0x12,0x10,0x0f,0x13,0x0b,0x0b,0x0c,0x0b,0x0d,0x0d,0x0f,0x0f,0x0c,0x0c, -0x0c,0x0b,0x0c,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0c,0x0d,0x0d,0x0d,0x0a,0x0c,0x0c,0x0c,0x0d,0x10,0x12,0x0e,0x0e,0x0d,0x10,0x0d,0x0e,0x0b,0x0a,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0a,0x0c,0x10,0x0c,0x11,0x0b,0x0c,0x0c,0x10,0x07,0x11,0x0e,0x0f,0x0e,0x0c,0x10,0x0d,0x10,0x0d,0x0d,0x0d, -0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x0a,0x09,0x0a,0x0a,0x0a,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x06,0x06,0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x13,0x13,0x13,0x13,0x0a,0x10,0x0f,0x0a,0x09,0x0a,0x0b,0x0c,0x0a,0x12,0x11,0x12,0x09,0x15,0x0a,0x12,0x12, -0x12,0x11,0x0c,0x0a,0x0a,0x10,0x0c,0x10,0x0e,0x0b,0x0a,0x09,0x15,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x1d,0x12,0x12,0x09,0x05,0x0a,0x05,0x0a,0x05,0x05,0x05,0x0a,0x0c,0x0c,0x0b,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x09,0x12,0x05,0x13,0x13,0x13,0x0c,0x0c,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x0e,0x19, -0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0a,0x0c,0x0a,0x0b,0x09,0x07,0x07,0x0e,0x0c,0x0f,0x09,0x18,0x13,0x0c,0x0c,0x13,0x11,0x12,0x10,0x15,0x11,0x13,0x10,0x0e,0x0a,0x0f,0x0c,0x13,0x0f, -0x10,0x0d,0x10,0x0d,0x12,0x0e,0x12,0x0e,0x17,0x12,0x10,0x0c,0x10,0x0c,0x19,0x13,0x11,0x00,0x15,0x15,0x15,0x0a,0x00,0x00,0x0c,0x0b,0x0f,0x0c,0x0b,0x09,0x17,0x13,0x14,0x12,0x0f,0x0c,0x0f,0x0c,0x0b,0x09,0x10,0x0d,0x0b,0x09,0x11,0x0e,0x0e,0x0c,0x15,0x11,0x0b,0x0c,0x0f,0x0f,0x11,0x09,0x04,0x0a,0x0e,0x09,0x15,0x15,0x05,0x00, -0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x08,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, -0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x0e,0x0f,0x06,0x04,0x06,0x04,0x0f,0x0c,0x10,0x0d,0x0c,0x0a,0x0b,0x0a,0x0c,0x0c,0x09,0x09,0x18,0x11,0x18,0x13,0x15,0x12,0x13,0x0e,0x13,0x0e,0x13,0x0e,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x07,0x0a,0x05,0x10,0x0c,0x12, -0x0e,0x1c,0x15,0x0c,0x0c,0x0e,0x0f,0x11,0x12,0x10,0x0c,0x15,0x10,0x0b,0x08,0x0c,0x0a,0x0d,0x0a,0x14,0x0f,0x0d,0x0b,0x0c,0x0c,0x0c,0x0c,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0b,0x0b,0x06,0x0e,0x07,0x14,0x0e,0x07,0x0c,0x0d,0x0a,0x10,0x0c,0x08,0x07,0x0c,0x0c,0x0c,0x0a,0x05,0x10,0x0d,0x08,0x07,0x0d,0x0a,0x0f,0x08,0x10,0x0d,0x0d, -0x0a,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x0d,0x07,0x0b,0x09,0x10,0x09,0x0b,0x12,0x0a,0x0c,0x13,0x06,0x18,0x13,0x13,0x19,0x13,0x13,0x13,0x12,0x13,0x13,0x0b,0x0a,0x0d,0x0f,0x13,0x0f,0x14,0x05,0x0a,0x0c,0x12,0x16,0x0f,0x16,0x0d,0x0d,0x11,0x0f,0x18,0x13,0x0b,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x12,0x12,0x12,0x12,0x15,0x0b, -0x0b,0x15,0x10,0x0b,0x0b,0x10,0x0e,0x07,0x07,0x0e,0x0c,0x0c,0x0c,0x0c,0x10,0x07,0x07,0x12,0x10,0x07,0x07,0x12,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x0b,0x08,0x0c,0x0b,0x10,0x0c,0x0c,0x12, -0x0e,0x10,0x10,0x11,0x11,0x0c,0x0a,0x15,0x11,0x16,0x12,0x0e,0x0c,0x07,0x07,0x0c,0x0e,0x09,0x0d,0x0b,0x0c,0x0a,0x10,0x11,0x08,0x0c,0x09,0x04,0x08,0x0b,0x0c,0x05,0x05,0x04,0x05,0x08,0x08,0x08,0x09,0x1f,0x2a,0x07,0x09,0x03,0x06,0x08,0x09,0x07,0x0a,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a, -0x0a,0x1c,0x0b,0x10,0x13,0x13,0x0e,0x0a,0x0c,0x0f,0x0f,0x0a,0x07,0x0e,0x0b,0x0e,0x0c,0x0e,0x0b,0x0b,0x10,0x0c,0x0c,0x0b,0x10,0x0d,0x11,0x0a,0x0b,0x0d,0x07,0x0c,0x07,0x07,0x05,0x12,0x0c,0x0c,0x0b,0x0b,0x0c,0x13,0x13,0x14,0x15,0x15,0x0c,0x0a,0x06,0x0b,0x0a,0x0d,0x0a,0x0e,0x05,0x0c,0x0d,0x12,0x12,0x0d,0x0b,0x0c,0x0b,0x0b, -0x0a,0x0b,0x0a,0x0a,0x06,0x07,0x05,0x05,0x08,0x0c,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x00,0x06,0x06,0x06,0x05,0x05,0x23,0x15,0x12,0x16,0x06,0x06,0x07,0x08,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x13,0x07,0x07,0x13,0x05,0x0b,0x0b,0x1c,0x15,0x15, -0x1c,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x09,0x09,0x00,0x00,0x08,0x10,0x0d,0x0f,0x0c,0x1a,0x16,0x0f,0x0b,0x0f,0x0c,0x1c,0x15,0x10,0x0c,0x08,0x07,0x0d,0x00,0x0e,0x0b,0x07,0x06,0x03,0x0a,0x07,0x07,0x05,0x04,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x0b,0x09,0x0c,0x0c,0x0c,0x14,0x11,0x11,0x11,0x11,0x14,0x0d,0x0e,0x0d, -0x08,0x14,0x18,0x09,0x18,0x0b,0x12,0x13,0x13,0x13,0x09,0x10,0x15,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x0c,0x0c,0x0c,0x12,0x0b,0x0b,0x13,0x07,0x07,0x13,0x07,0x07,0x13,0x0a,0x0a,0x00,0x09,0x12,0x07,0x07,0x15,0x0b,0x0b,0x10,0x0b,0x0b,0x0e,0x06,0x06,0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x20,0x20,0x12,0x00,0x00,0x12,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0d,0x0e,0x0e,0x13,0x0e,0x0d,0x11,0x14,0x0e,0x0d,0x16,0x0d,0x0d,0x14,0x0d,0x0e,0x11,0x0d,0x10,0x12,0x13,0x0d,0x10,0x0e,0x0f,0x0d,0x0f,0x0d,0x0e,0x0e,0x0d, -0x10,0x0d,0x0e,0x10,0x0d,0x0d,0x0c,0x10,0x0d,0x0e,0x0e,0x0f,0x09,0x0b,0x0d,0x10,0x10,0x0b,0x00,0x00,0x18,0x30,0x10,0x00,0x02,0x07,0x07,0x09,0x0e,0x0d,0x14,0x13,0x06,0x07,0x07,0x0a,0x10,0x05,0x0a,0x05,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x05,0x05,0x10,0x10,0x10,0x0b,0x17,0x0f,0x0e,0x0f,0x11,0x0c,0x0c, -0x10,0x11,0x06,0x09,0x0e,0x0b,0x16,0x12,0x12,0x0d,0x12,0x0e,0x0d,0x0d,0x10,0x0f,0x16,0x0e,0x0d,0x0e,0x07,0x09,0x07,0x10,0x0a,0x06,0x0c,0x0e,0x0b,0x0e,0x0d,0x08,0x0e,0x0e,0x06,0x06,0x0c,0x06,0x15,0x0e,0x0e,0x0e,0x0e,0x08,0x0a,0x08,0x0e,0x0c,0x11,0x0b,0x0c,0x0b,0x07,0x06,0x07,0x10,0x0f,0x0f,0x0f,0x0c,0x12,0x12,0x10,0x0c, -0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0b,0x0a,0x0b,0x0d,0x0a,0x15,0x15,0x13,0x07,0x0a,0x10,0x15,0x12,0x14,0x10,0x10,0x10,0x0d,0x0e,0x0d,0x0f,0x12,0x0d,0x09,0x0a,0x12,0x14,0x0e,0x0b,0x07,0x07,0x10,0x10,0x0d,0x10,0x0f, -0x0c,0x0c,0x12,0x0f,0x0f,0x12,0x16,0x16,0x0c,0x18,0x09,0x09,0x06,0x06,0x10,0x0e,0x0c,0x0d,0x04,0x0d,0x08,0x08,0x0d,0x0d,0x09,0x05,0x06,0x09,0x1d,0x0f,0x0c,0x0f,0x0c,0x0c,0x06,0x06,0x06,0x06,0x12,0x12,0x12,0x10,0x10,0x10,0x06,0x09,0x08,0x07,0x07,0x05,0x07,0x05,0x08,0x04,0x09,0x0b,0x07,0x0d,0x0a,0x0e,0x0b,0x06,0x11,0x0d, -0x0d,0x0c,0x0d,0x0e,0x10,0x10,0x08,0x09,0x09,0x16,0x16,0x17,0x0c,0x10,0x0e,0x06,0x0d,0x0a,0x0f,0x0b,0x0f,0x0b,0x0e,0x0a,0x05,0x0f,0x0c,0x0f,0x0c,0x11,0x10,0x11,0x0c,0x0d,0x0c,0x0d,0x0b,0x06,0x0b,0x07,0x0b,0x08,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0e,0x08,0x0d,0x0a,0x0d,0x08,0x0d,0x0b,0x10,0x0e,0x10,0x0e,0x0e,0x0b, -0x0e,0x0b,0x0b,0x12,0x12,0x0f,0x0e,0x0b,0x0e,0x0c,0x11,0x0a,0x0c,0x09,0x1b,0x0f,0x0c,0x0f,0x06,0x09,0x13,0x08,0x0f,0x09,0x09,0x0f,0x09,0x0f,0x0c,0x0f,0x0b,0x0f,0x0b,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x06,0x0e,0x0c,0x0c,0x0b,0x06, -0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0d,0x0a,0x0d,0x08,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x16,0x11,0x0d,0x0c,0x06,0x0f,0x0c,0x15,0x14,0x12,0x0e,0x05,0x16,0x11,0x16,0x11,0x16,0x11,0x0d,0x0c,0x06,0x0a,0x0d,0x0e,0x16,0x16,0x16,0x15,0x09,0x09,0x05,0x07,0x07,0x0f,0x0e,0x13,0x09,0x13,0x10,0x14,0x06,0x0f, -0x0e,0x0c,0x0e,0x11,0x06,0x0e,0x0f,0x16,0x12,0x0c,0x12,0x11,0x0d,0x0c,0x0d,0x0d,0x0e,0x13,0x12,0x06,0x0d,0x0f,0x0b,0x0e,0x06,0x0d,0x0d,0x0c,0x0b,0x0e,0x0e,0x06,0x0d,0x0c,0x0e,0x0d,0x0b,0x0e,0x0e,0x0b,0x0d,0x0d,0x12,0x13,0x06,0x0d,0x0e,0x0d,0x13,0x0c,0x11,0x0b,0x0f,0x0d,0x06,0x18,0x18,0x11,0x0e,0x0e,0x11,0x0f,0x0e,0x0e, -0x0b,0x11,0x0c,0x15,0x0d,0x12,0x12,0x0e,0x10,0x16,0x11,0x12,0x11,0x0d,0x0f,0x0d,0x0e,0x11,0x0e,0x12,0x10,0x17,0x18,0x11,0x13,0x0e,0x0f,0x18,0x0e,0x0c,0x0e,0x0d,0x09,0x0d,0x0d,0x12,0x0b,0x0e,0x0e,0x0c,0x0d,0x11,0x0e,0x0e,0x0e,0x0e,0x0b,0x0a,0x0c,0x10,0x0b,0x0e,0x0e,0x13,0x14,0x0e,0x11,0x0c,0x0b,0x14,0x0c,0x0d,0x0e,0x09, -0x0b,0x0a,0x06,0x13,0x13,0x0e,0x0c,0x0c,0x0e,0x0b,0x09,0x18,0x1b,0x0f,0x08,0x09,0x09,0x09,0x06,0x0d,0x0a,0x0d,0x12,0x0e,0x11,0x0e,0x07,0x08,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x0b,0x07,0x07,0x07,0x0b,0x0b,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f, -0x0c,0x0f,0x0c,0x0f,0x0c,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x06,0x06,0x06,0x06,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x10,0x0e,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0d, -0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x08,0x0c,0x0d,0x12,0x0e,0x06,0x09,0x06,0x06,0x0c,0x0a,0x16,0x13,0x0f,0x0d,0x0e,0x0c,0x12,0x0e,0x0d,0x0c,0x0d,0x0c,0x0f,0x0c,0x10,0x0e,0x10,0x0e,0x11,0x0d,0x12,0x0e,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x07,0x07,0x07,0x07,0x0c,0x0d,0x0f,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0f,0x0b,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x08,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x06,0x06,0x06,0x06,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x16,0x15,0x16,0x15,0x16,0x15,0x12,0x0e,0x12, -0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0d,0x0e,0x0d,0x0e,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0f,0x0c,0x0f,0x0c,0x16,0x11,0x16,0x11,0x0e,0x0b,0x0e, -0x0b,0x0d,0x0c,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x08,0x11,0x0c,0x0c,0x06,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x06,0x06,0x06,0x06,0x06, -0x06,0x06,0x06,0x09,0x09,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x17,0x17,0x17,0x17,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x14,0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0b,0x0b,0x0e,0x0e,0x06,0x06,0x0e,0x0e,0x0d,0x0d,0x13, -0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x11,0x0e,0x0e,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x0f,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x12,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0f,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0b,0x11,0x12,0x0e,0x0e,0x0e,0x0c,0x0d,0x0c,0x11,0x0f,0x15,0x07,0x07,0x0e,0x0c,0x06,0x0c,0x15,0x12,0x0e,0x12,0x17,0x13,0x0e,0x0e,0x0e,0x0d,0x0a,0x0c,0x07,0x08,0x0d,0x08,0x0d,0x12,0x11,0x0e,0x0c,0x0e,0x0b,0x0f,0x0f,0x0b,0x0a,0x0d,0x0d,0x09,0x09,0x0d, -0x06,0x09,0x0b,0x07,0x1e,0x1b,0x19,0x15,0x11,0x0c,0x1a,0x17,0x13,0x0f,0x0c,0x06,0x06,0x12,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0d,0x0f,0x0c,0x0f,0x0c,0x15,0x14,0x10,0x0e,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x12,0x0e,0x0f,0x0b,0x06,0x1e,0x1b,0x19,0x10,0x0e,0x18,0x11,0x12,0x0e,0x0f,0x0c,0x0f,0x0c,0x0c,0x0d, -0x0c,0x0d,0x06,0x06,0x06,0x06,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0e,0x08,0x10,0x0e,0x10,0x0e,0x0c,0x0a,0x11,0x0e,0x12,0x0e,0x0e,0x0e,0x0b,0x0f,0x0c,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0d,0x0c,0x0e,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0b,0x0b,0x0e,0x0e,0x0d,0x0f,0x0a,0x0a,0x0c,0x0d,0x07,0x0e,0x0e,0x0d,0x0c,0x0b, -0x0e,0x0e,0x0e,0x06,0x07,0x08,0x07,0x09,0x06,0x0e,0x15,0x15,0x15,0x0d,0x0d,0x0e,0x0e,0x11,0x11,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0a,0x06,0x06,0x07,0x07,0x08,0x08,0x0e,0x0e,0x0d,0x0c,0x11,0x0c,0x0a,0x0b,0x0c,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x0f,0x0c,0x0d,0x0d,0x0e,0x06,0x0c,0x09,0x0e,0x09,0x09,0x16,0x17, -0x17,0x0f,0x0b,0x11,0x13,0x0e,0x0e,0x0c,0x0c,0x0d,0x0e,0x0e,0x10,0x0e,0x0f,0x13,0x0e,0x11,0x0e,0x0e,0x0b,0x0c,0x0b,0x0e,0x0c,0x0f,0x0c,0x15,0x15,0x0f,0x0c,0x0f,0x0d,0x0f,0x0b,0x0e,0x0c,0x10,0x0e,0x0e,0x0a,0x0e,0x0e,0x0b,0x06,0x12,0x0b,0x0b,0x15,0x10,0x10,0x0e,0x16,0x11,0x10,0x0c,0x15,0x11,0x11,0x0e,0x16,0x12,0x0d,0x0b, -0x13,0x12,0x12,0x0e,0x11,0x0e,0x11,0x0e,0x1f,0x1b,0x14,0x10,0x1b,0x15,0x15,0x10,0x0e,0x0b,0x0c,0x09,0x0a,0x00,0x00,0x18,0x17,0x0e,0x0c,0x0d,0x0e,0x0e,0x0c,0x0d,0x0b,0x0e,0x0c,0x11,0x0e,0x14,0x10,0x18,0x14,0x11,0x0d,0x0f,0x0b,0x0d,0x0a,0x15,0x10,0x10,0x0e,0x14,0x0f,0x14,0x0f,0x06,0x15,0x12,0x0e,0x0c,0x11,0x0e,0x10,0x0e, -0x0f,0x0c,0x0f,0x0c,0x15,0x14,0x0c,0x0d,0x11,0x0d,0x11,0x0d,0x15,0x12,0x0d,0x0b,0x0d,0x0b,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0f,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x10,0x0e,0x13,0x11,0x0e,0x0e,0x14,0x15,0x13,0x11,0x0d,0x0b,0x16,0x13,0x18,0x14,0x11,0x0d,0x10,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x08,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x0e,0x08,0x08,0x04,0x05,0x05,0x05,0x07,0x0a,0x07,0x06,0x09,0x05,0x05,0x05,0x08,0x08,0x05,0x05,0x0e,0x0e,0x0e,0x0e,0x08,0x07,0x06,0x08,0x07,0x06,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x07,0x04,0x06,0x07,0x05,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08, -0x0a,0x08,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d, -0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d, -0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x0f,0x07,0x0f,0x08,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0e,0x0b,0x10,0x14,0x0c,0x0b,0x0d,0x0d,0x0a, -0x0a,0x06,0x07,0x0c,0x09,0x11,0x0e,0x0e,0x0b,0x0f,0x0f,0x0f,0x16,0x0d,0x0e,0x0e,0x0b,0x0b,0x0b,0x0a,0x0d,0x0e,0x11,0x0e,0x0c,0x11,0x0b,0x0a,0x0a,0x0d,0x09,0x0b,0x0e,0x0b,0x0e,0x0d,0x09,0x0c,0x08,0x09,0x0a,0x07,0x07,0x0a,0x0a,0x04,0x05,0x09,0x07,0x0d,0x0b,0x0b,0x0a,0x09,0x08,0x08,0x07,0x0a,0x0d,0x08,0x08,0x08,0x0c,0x08, -0x08,0x07,0x07,0x06,0x06,0x08,0x04,0x07,0x0c,0x08,0x08,0x06,0x08,0x08,0x08,0x05,0x08,0x08,0x0c,0x07,0x08,0x08,0x07,0x08,0x0a,0x07,0x04,0x05,0x08,0x07,0x08,0x07,0x08,0x0a,0x07,0x0e,0x04,0x08,0x0d,0x15,0x0f,0x0d,0x0d,0x15,0x10,0x15,0x12,0x0d,0x0e,0x0c,0x0b,0x1b,0x0b,0x0e,0x15,0x16,0x16,0x0f,0x0f,0x0f,0x0b,0x0b,0x0d,0x0a, -0x0b,0x0c,0x05,0x00,0x00,0x00,0x00,0x0e,0x0f,0x0f,0x0f,0x0b,0x09,0x0e,0x0e,0x08,0x15,0x0e,0x0e,0x08,0x08,0x0b,0x08,0x0b,0x0e,0x0b,0x0e,0x16,0x10,0x08,0x06,0x0e,0x0d,0x0e,0x0e,0x0e,0x08,0x0e,0x0c,0x06,0x15,0x0e,0x0e,0x08,0x0a,0x0a,0x0c,0x0b,0x0b,0x0c,0x0e,0x0e,0x0d,0x0b,0x0b,0x12,0x06,0x0b,0x06,0x0e,0x0b,0x08,0x06,0x06, -0x08,0x06,0x04,0x04,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x0c,0x0c,0x08,0x08,0x08,0x08,0x09,0x06,0x04,0x05,0x08,0x08,0x08,0x08,0x07,0x06,0x06,0x07,0x06,0x08,0x00,0x00,0x00,0x00,0x05,0x08,0x07,0x08,0x06,0x07,0x0d,0x0d,0x0d,0x0d,0x08,0x00,0x00,0x00,0x00,0x0b,0x07,0x06,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, -0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x04,0x09,0x09,0x08,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x09,0x08,0x09,0x09,0x08, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x13,0x0f,0x11,0x0e,0x12,0x0f,0x16,0x12,0x0d,0x09,0x0c,0x10,0x0d,0x14,0x11,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x18,0x0a,0x06,0x0c,0x0e,0x0a,0x0c,0x0c,0x0e,0x0e,0x0c,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c, -0x10,0x0c,0x0c,0x0c,0x08,0x0e,0x08,0x12,0x10,0x0c,0x08,0x14,0x0c,0x14,0x06,0x08,0x0e,0x0e,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x14,0x06,0x0e,0x06,0x0c,0x0a,0x06,0x06,0x0c,0x06,0x12,0x06,0x16,0x0c,0x16,0x16,0x0e,0x0e,0x0e,0x0c,0x0c,0x0a,0x0a,0x1c,0x1c,0x20,0x20,0x14,0x14,0x0c,0x0c,0x04,0x18,0x12,0x14,0x10,0x0e,0x10,0x0c,0x0c, -0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x10,0x00,0x10,0x10,0x10,0x08,0x0c,0x0c,0x16,0x08,0x16,0x08,0x0e,0x10,0x0e,0x0a,0x16,0x0c,0x16,0x0c,0x12,0x14,0x08,0x0c,0x0c,0x0a,0x06,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0e,0x0c,0x10,0x10,0x16,0x08,0x0c,0x0a,0x10,0x0c,0x08,0x0c,0x0c,0x0c,0x16,0x08,0x16,0x08,0x06, -0x0e,0x09,0x18,0x0c,0x0c,0x10,0x10,0x18,0x0c,0x00,0x00,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x12,0x10,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0c,0x0c,0x12,0x14,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x0e, -0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a,0x0a,0x1c,0x14,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x0c,0x0e,0x0e,0x0e,0x18,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x12,0x12,0x1a,0x18,0x16,0x0c,0x14,0x0c,0x14,0x0c,0x14,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16, -0x0c,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x08,0x10,0x08,0x0d,0x10,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x14,0x16,0x12,0x14,0x08,0x0c,0x12,0x14,0x12,0x14,0x00,0x00,0x00,0x00,0x00,0x1b,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0a,0x00,0x00,0x0e,0x00,0x00,0x00,0x1c,0x14,0x20,0x18,0x0c,0x0e, -0x0e,0x0e,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x16,0x16,0x09,0x0e,0x0e,0x0e,0x1d,0x14,0x0d,0x25,0x1a,0x08,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0a,0x0a,0x12,0x10,0x10,0x0c,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x1e,0x24,0x00,0x00,0x00,0x00,0x00, -0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0a,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x0c,0x0c,0x0a,0x1c,0x14,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e, -0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x08,0x08,0x0a,0x0a,0x1c,0x14,0x10,0x0e,0x0e,0x00,0x0c,0x0c,0x0c,0x09,0x0e,0x10,0x0f,0x0c,0x0d,0x09,0x06,0x12,0x0e,0x0e,0x08,0x0d,0x0c,0x0b,0x0b,0x0b,0x06,0x0c,0x0a,0x0f,0x0c,0x0e,0x0b,0x0d,0x0b,0x10,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x0b,0x0b,0x0b,0x07,0x0c, -0x0d,0x0e,0x0c,0x08,0x12,0x0e,0x0f,0x0d,0x0f,0x0c,0x0e,0x0c,0x0a,0x11,0x09,0x0a,0x0a,0x0c,0x0e,0x0e,0x0c,0x18,0x0c,0x18,0x08,0x06,0x04,0x0d,0x05,0x03,0x00,0x03,0x05,0x00,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x16,0x0a,0x12,0x0e,0x16,0x11,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x16,0x16,0x15,0x0b,0x15,0x0b,0x15,0x0f,0x10,0x11,0x11,0x12,0x15,0x18,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x10,0x10,0x10,0x10,0x12,0x0e,0x19,0x14,0x0b,0x0b,0x07,0x07,0x07,0x09,0x05,0x0e,0x06,0x06,0x14,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x05,0x00,0x00,0x05,0x00,0x00,0x0f,0x0e, -0x0b,0x0c,0x10,0x06,0x08,0x10,0x10,0x06,0x0d,0x0d,0x0d,0x11,0x10,0x06,0x0a,0x10,0x0f,0x0f,0x0f,0x0e,0x0e,0x10,0x0d,0x13,0x11,0x0d,0x0d,0x0d,0x06,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0c,0x10,0x0d,0x0d,0x11,0x0d,0x11,0x0d,0x13,0x13,0x13,0x13,0x0f,0x0f,0x0f,0x0e,0x0b,0x0c,0x10,0x07,0x09,0x10,0x07,0x0d,0x0d,0x0d,0x10, -0x0a,0x10,0x0f,0x0f,0x0e,0x10,0x0d,0x13,0x11,0x06,0x0e,0x0d,0x0f,0x10,0x1d,0x00,0x0f,0x0d,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x12,0x0f,0x10,0x11,0x0d,0x10,0x12,0x12, -0x0b,0x0f,0x12,0x12,0x10,0x12,0x13,0x13,0x10,0x0d,0x0d,0x12,0x11,0x0e,0x10,0x10,0x10,0x10,0x10,0x12,0x0e,0x0f,0x10,0x10,0x13,0x0f,0x0f,0x0f,0x10,0x14,0x0c,0x0e,0x0e,0x15,0x0d,0x0d,0x13,0x15,0x0f,0x0d,0x19,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0d,0x12,0x14,0x15,0x0d,0x13,0x0d,0x10,0x0d,0x0f,0x0e,0x0f,0x0d,0x0f,0x12,0x0d,0x0f, -0x10,0x0d,0x0d,0x0e,0x17,0x0d,0x0d,0x0e,0x0e,0x0a,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x0d,0x15,0x0c,0x0d,0x15,0x10,0x0d,0x15,0x12,0x12,0x15,0x0e,0x0d,0x15,0x15,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x0e,0x0d,0x0e,0x15,0x0e,0x0d,0x0d,0x0d,0x15,0x13,0x10,0x11,0x11,0x10,0x11,0x0f,0x10,0x13,0x11,0x10,0x0d,0x13,0x10,0x10, -0x0e,0x10,0x11,0x12,0x11,0x0e,0x11,0x10,0x11,0x10,0x13,0x11,0x11,0x11,0x10,0x0f,0x11,0x10,0x11,0x13,0x10,0x12,0x11,0x02,0x03,0x04,0x05,0x04,0x06,0x08,0x15,0x0e,0x0f,0x0e,0x0e,0x0f,0x0e,0x0e,0x10,0x0e,0x0e,0x07,0x14,0x0e,0x0e,0x0e,0x0d,0x0e,0x0c,0x0e,0x06,0x0e,0x0c,0x0e,0x0a,0x15,0x0d,0x0e,0x0e,0x0e,0x14,0x0e,0x0e,0x09, -0x14,0x0e,0x0e,0x10,0x10,0x05,0x07,0x1b,0x1b,0x1b,0x1b,0x22,0x0d,0x0d,0x06,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x0c,0x0c,0x0c,0x0e,0x0a,0x0a,0x0e,0x0f,0x06,0x08,0x0c,0x0a,0x12,0x10,0x0f,0x0c,0x0f,0x0c,0x0a,0x0b,0x0e,0x0c,0x13,0x0c,0x0b,0x0c,0x11,0x13,0x0a,0x0f,0x0c,0x0e,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0b,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0e,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0c,0x0f,0x0f,0x06,0x06,0x06,0x06,0x06,0x0e,0x08,0x0c,0x0a,0x0a,0x0a,0x0a,0x10,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x11,0x0f,0x0c, -0x0c,0x09,0x0d,0x0a,0x0c,0x0f,0x0f,0x06,0x0c,0x0c,0x12,0x10,0x0b,0x0f,0x0f,0x0c,0x0b,0x0b,0x0b,0x0f,0x0c,0x10,0x0f,0x0c,0x0a,0x0f,0x06,0x0f,0x0b,0x0f,0x06,0x0b,0x0a,0x0e,0x0a,0x0c,0x0a,0x06,0x06,0x08,0x14,0x14,0x0f,0x0c,0x0c,0x0f,0x0c,0x0c,0x0c,0x0a,0x0e,0x0a,0x12,0x0b,0x10,0x10,0x0c,0x0e,0x12,0x0f,0x0f,0x0f,0x0c,0x0c, -0x0b,0x0c,0x0f,0x0c,0x0f,0x0d,0x13,0x14,0x0e,0x11,0x0c,0x0c,0x15,0x0c,0x0a,0x0e,0x0e,0x0f,0x15,0x15,0x10,0x0c,0x0e,0x0a,0x0e,0x0d,0x0d,0x11,0x0d,0x0d,0x10,0x0e,0x0e,0x09,0x0f,0x0f,0x0e,0x0c,0x0c,0x16,0x12,0x0b,0x0d,0x0e,0x0e,0x0f,0x0f,0x11,0x10,0x09,0x16,0x0e,0x0d,0x0e,0x0f,0x0f,0x0c,0x0c,0x06,0x12,0x10,0x10,0x0b,0x11, -0x05,0x05,0x0a,0x0a,0x05,0x05,0x0f,0x0a,0x06,0x12,0x11,0x07,0x05,0x05,0x0b,0x09,0x09,0x06,0x06,0x06,0x09,0x10,0x0b,0x07,0x0f,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x0e,0x08,0x0b,0x0d,0x0a,0x05,0x06,0x09,0x0d,0x08,0x10,0x10,0x10,0x16,0x12,0x16,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x12,0x14,0x08,0x08,0x0c,0x08,0x16,0x08,0x16,0x08, -0x16,0x08,0x0e,0x0e,0x0e,0x0c,0x0c,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x14,0x14,0x14,0x14,0x14,0x16,0x16,0x0c,0x0c,0x16,0x16,0x0c,0x0c,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x18,0x12,0x14,0x0c,0x0e,0x0e,0x10,0x08,0x10,0x12,0x0c,0x0c,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x06,0x16,0x08,0x12,0x0c,0x0c,0x06,0x0c,0x0c,0x0c,0x0c,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1c,0x14,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x14,0x14,0x18,0x18,0x18,0x18,0x18, -0x18,0x12,0x0c,0x0c,0x12,0x0c,0x0c,0x16,0x0c,0x1a,0x18,0x16,0x0c,0x14,0x0c,0x14,0x0c,0x14,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x10,0x10,0x10,0x10,0x10,0x08,0x10,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x0c,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x0c,0x08,0x08,0x08, -0x08,0x00,0x1c,0x14,0x20,0x18,0x16,0x0c,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0c,0x0c,0x0a,0x1c,0x14,0x18,0x18,0x16,0x16,0x16,0x0e,0x0e,0x0e,0x0e,0x10,0x08,0x10,0x08,0x10,0x08,0x1c,0x14,0x0e,0x10,0x0e,0x0e,0x0e,0x10,0x0e,0x0e,0x1c,0x1c,0x14,0x14,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x08,0x08, -0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x16,0x08,0x16,0x08,0x0e,0x10,0x0e,0x0e,0x1c,0x1c,0x14,0x14,0x1c,0x1c,0x14,0x14,0x14,0x14,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x08,0x06,0x00,0x00,0x00,0x14,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, -0x0a,0x0a,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x12,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x14,0x10,0x10,0x10,0x06,0x06,0x0c,0x0a,0x0e,0x0f,0x0e,0x0d,0x0d,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0b,0x0d,0x0d,0x0e,0x0f,0x0f,0x10,0x0e,0x0e,0x10,0x0c,0x10,0x12,0x0f,0x12,0x14,0x0f,0x12,0x11, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0b,0x0d,0x0f,0x0e,0x10,0x0e,0x10,0x0e,0x0e,0x0e,0x0c,0x0c,0x12,0x10,0x11,0x10,0x10,0x0e,0x0e,0x0e,0x12,0x13,0x12,0x12,0x16,0x16,0x11,0x16,0x16,0x12,0x15,0x14,0x0d,0x12,0x14,0x12,0x0e,0x14,0x12,0x11,0x11,0x0f,0x0f,0x12,0x13,0x11,0x0f,0x11,0x0e,0x0d,0x16,0x16,0x16, -0x14,0x16,0x16,0x10,0x16,0x16,0x11,0x12,0x13,0x12,0x11,0x11,0x0f,0x15,0x12,0x14,0x11,0x11,0x0e,0x12,0x11,0x11,0x14,0x12,0x11,0x16,0x0d,0x0c,0x0d,0x0d,0x0f,0x0f,0x11,0x12,0x0e,0x0e,0x0e,0x0d,0x0e,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0d,0x0e,0x0f,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x0f,0x12,0x14,0x10,0x10,0x0f,0x12, -0x0f,0x10,0x0c,0x0b,0x0e,0x0e,0x0b,0x0c,0x0d,0x0d,0x0c,0x0b,0x0f,0x0b,0x0d,0x0c,0x0d,0x13,0x0e,0x14,0x0d,0x0e,0x0e,0x12,0x08,0x13,0x10,0x11,0x10,0x0d,0x12,0x0e,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06, -0x06,0x06,0x0f,0x06,0x06,0x06,0x07,0x07,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x16,0x16,0x16,0x16,0x0c,0x12,0x11,0x0c,0x0a,0x0c,0x0d,0x0d,0x0c,0x14,0x14,0x15,0x0b,0x18,0x0c,0x14,0x14,0x14,0x13,0x0e,0x0c,0x0c,0x13,0x0e,0x13,0x10,0x0d,0x0b,0x0a,0x18,0x0a,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x21,0x14,0x14,0x0a,0x06,0x0b,0x06,0x0b, -0x06,0x06,0x06,0x0c,0x0e,0x0e,0x0d,0x09,0x09,0x06,0x06,0x06,0x09,0x06,0x0a,0x15,0x05,0x16,0x16,0x16,0x0e,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x1c,0x1c,0x10,0x1c,0x1c,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0b,0x0e,0x0b,0x0d,0x0a,0x09,0x08,0x10,0x0d,0x11,0x0a,0x1b,0x15,0x0e,0x0d,0x16,0x13,0x14,0x12,0x18,0x14,0x16,0x13,0x0f,0x0b,0x11,0x0e,0x16,0x12,0x12,0x0f,0x12,0x0e,0x15,0x10,0x15,0x10,0x1a,0x14,0x12,0x0e,0x12,0x0e,0x1d,0x15,0x13,0x00,0x18,0x18,0x18,0x0b,0x00,0x00,0x0e,0x0c,0x11,0x0d, -0x0d,0x0a,0x1a,0x16,0x17,0x15,0x11,0x0e,0x11,0x0e,0x0d,0x0a,0x12,0x0e,0x0d,0x0a,0x14,0x10,0x10,0x0e,0x17,0x14,0x0d,0x0e,0x12,0x12,0x13,0x0b,0x05,0x0b,0x10,0x0a,0x18,0x18,0x06,0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x10,0x11,0x07,0x05,0x07,0x05,0x11,0x0e,0x12, -0x0f,0x0d,0x0b,0x0d,0x0c,0x0e,0x0e,0x0a,0x0a,0x1b,0x14,0x1c,0x15,0x18,0x14,0x16,0x10,0x16,0x10,0x16,0x10,0x0f,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0d,0x08,0x0b,0x06,0x12,0x0e,0x15,0x10,0x20,0x18,0x0d,0x0e,0x11,0x11,0x13,0x15,0x12,0x0e,0x17,0x13,0x0d,0x0a,0x0d,0x0c,0x0f,0x0c,0x16,0x11,0x0f,0x0d,0x0d,0x0e,0x0d,0x0e,0x0c, -0x0a,0x0b,0x09,0x0b,0x09,0x0c,0x0d,0x07,0x10,0x08,0x17,0x10,0x08,0x0e,0x0f,0x0b,0x12,0x0d,0x09,0x08,0x0e,0x0e,0x0e,0x0b,0x06,0x12,0x0e,0x09,0x08,0x0f,0x0b,0x11,0x09,0x13,0x0e,0x0f,0x0b,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x0e,0x08,0x0d,0x0a,0x12,0x0a,0x0d,0x15,0x0c,0x0d,0x16,0x06,0x1c,0x15,0x16,0x1c,0x15,0x16,0x16,0x15,0x15, -0x16,0x0c,0x0b,0x0f,0x11,0x16,0x11,0x17,0x06,0x0b,0x0e,0x15,0x19,0x11,0x19,0x0f,0x0f,0x13,0x11,0x1b,0x16,0x0c,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x14,0x14,0x18,0x0c,0x0c,0x18,0x12,0x0c,0x0c,0x12,0x10,0x08,0x08,0x10,0x0e,0x0e,0x0e,0x0e,0x12,0x08,0x08,0x14,0x12,0x08,0x08,0x14,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0c,0x0a,0x0e,0x0d,0x12,0x0e,0x0e,0x15,0x10,0x12,0x12,0x14,0x14,0x0e,0x0c,0x18,0x13,0x19,0x15,0x10,0x0e,0x08,0x08,0x0e,0x10,0x0a,0x0e,0x0c,0x0e,0x0c,0x12,0x13,0x0a,0x0e,0x0a,0x05, -0x09,0x0d,0x0d,0x05,0x05,0x04,0x05,0x09,0x09,0x09,0x0b,0x24,0x30,0x08,0x0a,0x03,0x06,0x09,0x0a,0x08,0x0c,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x20,0x0d,0x12,0x16,0x16,0x0f,0x0b,0x0e,0x11,0x12,0x0c,0x08,0x10,0x0c,0x10,0x0d,0x10,0x0d,0x0d,0x12,0x0e,0x0e,0x0d,0x12,0x0f,0x14,0x0b, -0x0d,0x0f,0x08,0x0e,0x08,0x08,0x06,0x15,0x0e,0x0e,0x0d,0x0d,0x0e,0x16,0x16,0x17,0x18,0x18,0x0d,0x0c,0x07,0x0c,0x0b,0x0f,0x0b,0x10,0x06,0x0e,0x0e,0x15,0x15,0x0f,0x0d,0x0e,0x0d,0x0d,0x0b,0x0d,0x0b,0x0c,0x07,0x08,0x06,0x05,0x09,0x0e,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x00, -0x07,0x07,0x07,0x06,0x06,0x28,0x18,0x15,0x19,0x07,0x07,0x08,0x0a,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x16,0x08,0x08,0x16,0x06,0x0c,0x0c,0x20,0x18,0x18,0x20,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x0a,0x0a,0x00,0x00,0x09,0x12,0x0e,0x11,0x0e,0x1e,0x19,0x11,0x0d,0x11,0x0d,0x20,0x18,0x12,0x0e,0x09,0x08, -0x0f,0x00,0x10,0x0d,0x08,0x07,0x04,0x0c,0x08,0x08,0x06,0x05,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x0d,0x0a,0x0e,0x0e,0x0d,0x17,0x13,0x13,0x13,0x14,0x17,0x0f,0x10,0x0e,0x09,0x16,0x1b,0x0b,0x1c,0x0c,0x14,0x16,0x16,0x16,0x0a,0x12,0x18,0x12,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x0d,0x00,0x0e,0x0e,0x0e,0x14,0x0c,0x0c,0x16,0x08,0x08,0x16,0x08,0x08,0x16,0x0c,0x0c,0x00,0x0a,0x14,0x08,0x08,0x18,0x0c,0x0c,0x12,0x0c,0x0c,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x24,0x24,0x15,0x00,0x00,0x15,0x15,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, -0x0a,0x0a,0x0a,0x0a,0x10,0x0f,0x0f,0x10,0x15,0x0f,0x0f,0x13,0x17,0x10,0x0f,0x1a,0x0f,0x0f,0x16,0x0f,0x10,0x13,0x0f,0x12,0x14,0x16,0x0f,0x12,0x10,0x11,0x0f,0x11,0x0f,0x10,0x10,0x0f,0x13,0x0e,0x10,0x13,0x0f,0x0f,0x0e,0x13,0x0f,0x10,0x10,0x11,0x0b,0x0d,0x0f,0x13,0x13,0x0d,0x00,0x00,0x1b,0x36,0x11,0x00,0x03,0x07,0x08,0x0b, -0x10,0x0f,0x16,0x16,0x06,0x08,0x08,0x0b,0x12,0x06,0x0b,0x06,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x06,0x06,0x12,0x12,0x12,0x0c,0x1a,0x11,0x0f,0x11,0x13,0x0e,0x0d,0x13,0x13,0x07,0x0a,0x10,0x0d,0x18,0x14,0x14,0x0f,0x14,0x10,0x0e,0x0e,0x13,0x11,0x19,0x10,0x0f,0x0f,0x08,0x0a,0x08,0x12,0x0b,0x07,0x0e,0x10, -0x0c,0x10,0x0e,0x08,0x10,0x0f,0x07,0x07,0x0d,0x07,0x17,0x0f,0x10,0x10,0x10,0x09,0x0b,0x09,0x0f,0x0d,0x14,0x0c,0x0d,0x0c,0x08,0x06,0x08,0x12,0x11,0x11,0x11,0x0e,0x14,0x14,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x0f,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0f,0x0f, -0x0c,0x0b,0x0c,0x0f,0x0b,0x18,0x18,0x15,0x08,0x0b,0x13,0x17,0x14,0x16,0x12,0x13,0x13,0x0f,0x10,0x0e,0x11,0x14,0x0f,0x0b,0x0c,0x14,0x16,0x10,0x0c,0x07,0x08,0x12,0x12,0x0f,0x13,0x11,0x0e,0x0e,0x14,0x11,0x11,0x14,0x19,0x19,0x0e,0x1b,0x0a,0x0a,0x06,0x06,0x12,0x10,0x0d,0x0f,0x05,0x0f,0x09,0x09,0x0f,0x0f,0x0a,0x06,0x06,0x0a, -0x21,0x11,0x0e,0x11,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x14,0x14,0x13,0x13,0x13,0x07,0x0a,0x09,0x08,0x08,0x05,0x08,0x06,0x09,0x05,0x0a,0x0d,0x07,0x0e,0x0b,0x0f,0x0c,0x06,0x13,0x0f,0x0f,0x0d,0x0f,0x10,0x12,0x12,0x09,0x0a,0x0a,0x19,0x18,0x1a,0x0d,0x13,0x10,0x07,0x0e,0x0b,0x11,0x0c,0x11,0x0c,0x10,0x0b,0x06,0x11,0x0e,0x11, -0x0e,0x13,0x12,0x13,0x0e,0x0e,0x0e,0x0e,0x0d,0x07,0x0d,0x08,0x0d,0x09,0x14,0x0f,0x14,0x0f,0x14,0x10,0x10,0x09,0x10,0x09,0x0e,0x0b,0x0e,0x09,0x0e,0x0c,0x13,0x0f,0x13,0x0f,0x0f,0x0c,0x0f,0x0c,0x0d,0x14,0x14,0x11,0x10,0x0c,0x10,0x0d,0x13,0x0b,0x0d,0x0b,0x1e,0x11,0x0d,0x10,0x06,0x0a,0x16,0x09,0x10,0x0a,0x0a,0x10,0x0a,0x11, -0x0e,0x11,0x0c,0x11,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x0f,0x13,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x07,0x10,0x0d,0x0d,0x0d,0x07,0x14,0x0f,0x14,0x0f,0x14,0x10,0x14,0x10,0x10,0x09,0x0e,0x0b,0x0e,0x09,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x19,0x14,0x0f,0x0d,0x07,0x11, -0x0e,0x17,0x16,0x14,0x10,0x06,0x19,0x14,0x19,0x14,0x19,0x14,0x0f,0x0d,0x06,0x0b,0x0f,0x10,0x19,0x19,0x19,0x18,0x0b,0x0b,0x06,0x07,0x07,0x11,0x0f,0x15,0x0a,0x16,0x12,0x16,0x07,0x11,0x0f,0x0e,0x0f,0x13,0x07,0x10,0x11,0x18,0x14,0x0e,0x14,0x13,0x0f,0x0e,0x0e,0x0f,0x10,0x15,0x14,0x07,0x0f,0x11,0x0c,0x10,0x07,0x0f,0x0f,0x0e, -0x0c,0x10,0x10,0x07,0x0e,0x0d,0x10,0x0e,0x0c,0x10,0x10,0x0c,0x0f,0x0f,0x14,0x16,0x07,0x0f,0x10,0x0f,0x16,0x0e,0x13,0x0d,0x11,0x0e,0x07,0x1a,0x1b,0x14,0x10,0x0f,0x13,0x11,0x0f,0x0f,0x0d,0x13,0x0e,0x17,0x0f,0x14,0x14,0x10,0x12,0x18,0x13,0x14,0x13,0x0f,0x11,0x0e,0x0f,0x14,0x10,0x14,0x12,0x1a,0x1a,0x13,0x15,0x10,0x11,0x1c, -0x10,0x0e,0x10,0x0e,0x0a,0x0f,0x0e,0x14,0x0c,0x10,0x10,0x0d,0x0e,0x13,0x10,0x10,0x10,0x10,0x0c,0x0b,0x0d,0x13,0x0c,0x10,0x0f,0x16,0x16,0x10,0x13,0x0e,0x0c,0x16,0x0e,0x0e,0x10,0x0a,0x0c,0x0b,0x07,0x15,0x16,0x0f,0x0d,0x0d,0x10,0x0d,0x0b,0x1b,0x1e,0x11,0x09,0x0a,0x0a,0x0a,0x07,0x0e,0x0b,0x0f,0x15,0x10,0x13,0x10,0x08,0x09, -0x07,0x07,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x08,0x0d,0x08,0x0d,0x08,0x08,0x08,0x0d,0x0d,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x10,0x14, -0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x13,0x0f,0x13,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x0f,0x0d,0x0f,0x0d,0x0f,0x0d,0x0e,0x09,0x0e,0x0e,0x14,0x10,0x07,0x0a,0x07,0x07,0x0e,0x0b,0x19,0x15,0x11,0x0e,0x10,0x0d,0x14,0x10,0x0f,0x0d,0x0f, -0x0d,0x11,0x0d,0x12,0x0f,0x12,0x0f,0x13,0x0e,0x14,0x10,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x08,0x08,0x08,0x08,0x0e,0x0e,0x11,0x0e,0x0f,0x10,0x0f,0x10,0x0f,0x10,0x11,0x0c,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x08,0x13,0x10,0x13, -0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x07,0x07,0x07,0x07,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x18,0x17,0x18,0x17,0x18,0x17,0x14,0x0f,0x14,0x0f,0x14,0x0f,0x14,0x0f,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x10,0x0f,0x10,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0e,0x0b,0x0e, -0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x11,0x0d,0x11,0x0d,0x19,0x14,0x19,0x14,0x10,0x0c,0x10,0x0c,0x0f,0x0d,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x09,0x14,0x0d,0x0e,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14, -0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x19,0x19,0x19,0x19,0x19,0x19,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x0f,0x0f, -0x0f,0x0f,0x0f,0x12,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x0c,0x0c,0x10,0x10,0x07,0x07,0x10,0x10,0x0f,0x0f,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x19, -0x19,0x19,0x19,0x19,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x15,0x15,0x13,0x10,0x10,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x10,0x10,0x10, -0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x11,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x17,0x16,0x14,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x11,0x0f,0x10,0x10,0x10,0x11,0x11,0x0d,0x13,0x14,0x0f,0x10,0x10,0x0e,0x0f,0x0d,0x13,0x11,0x18,0x08,0x08, -0x10,0x0d,0x07,0x0d,0x18,0x14,0x10,0x14,0x1a,0x15,0x10,0x10,0x10,0x0e,0x0b,0x0e,0x08,0x09,0x0e,0x09,0x0e,0x14,0x13,0x0f,0x0e,0x0f,0x0c,0x10,0x10,0x0c,0x0b,0x0f,0x0f,0x0a,0x0b,0x0f,0x06,0x0a,0x0c,0x08,0x21,0x1f,0x1c,0x17,0x13,0x0e,0x1d,0x1a,0x16,0x11,0x0e,0x07,0x07,0x14,0x10,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13, -0x0f,0x0e,0x11,0x0e,0x11,0x0e,0x17,0x16,0x13,0x10,0x13,0x10,0x10,0x0d,0x14,0x10,0x14,0x10,0x10,0x0c,0x07,0x21,0x1f,0x1c,0x13,0x10,0x1b,0x13,0x14,0x0f,0x11,0x0e,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x10,0x14,0x10,0x10,0x09,0x10,0x09,0x13,0x0f,0x13,0x0f,0x0e,0x0c,0x13,0x0f,0x14,0x10,0x0f,0x0f,0x0c,0x11, -0x0e,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x0d,0x10,0x0e,0x0f,0x0f,0x10,0x0e,0x10,0x10,0x10,0x0d,0x0d,0x10,0x10,0x0e,0x11,0x0b,0x0b,0x0e,0x0f,0x07,0x10,0x10,0x0e,0x0d,0x0c,0x0f,0x0f,0x0f,0x07,0x08,0x09,0x08,0x0a,0x07,0x10,0x17,0x17,0x17,0x0f,0x0f,0x10,0x10,0x13,0x13,0x11,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c, -0x0c,0x0b,0x07,0x07,0x08,0x08,0x09,0x09,0x10,0x10,0x0f,0x0d,0x14,0x0d,0x0b,0x0c,0x0e,0x0c,0x0c,0x0a,0x0a,0x0a,0x0d,0x11,0x0d,0x0f,0x0e,0x0f,0x07,0x0d,0x0a,0x10,0x0a,0x0a,0x19,0x1a,0x1a,0x11,0x0d,0x13,0x15,0x10,0x0f,0x0d,0x0d,0x0f,0x10,0x0f,0x12,0x0f,0x11,0x16,0x0f,0x13,0x10,0x10,0x0c,0x0d,0x0c,0x10,0x0e,0x11,0x0d,0x18, -0x17,0x10,0x0e,0x11,0x0e,0x10,0x0c,0x10,0x0d,0x12,0x10,0x0f,0x0b,0x0f,0x10,0x0c,0x07,0x14,0x0d,0x0d,0x17,0x12,0x11,0x10,0x19,0x13,0x12,0x0d,0x18,0x13,0x14,0x0f,0x19,0x14,0x0f,0x0c,0x15,0x15,0x14,0x10,0x13,0x10,0x13,0x10,0x23,0x1e,0x16,0x12,0x1e,0x18,0x17,0x12,0x10,0x0c,0x0e,0x0b,0x0b,0x00,0x00,0x1b,0x1a,0x10,0x0e,0x0f, -0x10,0x0f,0x0e,0x0f,0x0c,0x10,0x0d,0x13,0x10,0x17,0x12,0x1b,0x17,0x13,0x0f,0x11,0x0c,0x0e,0x0b,0x18,0x12,0x13,0x10,0x17,0x11,0x17,0x11,0x07,0x17,0x14,0x10,0x0e,0x13,0x10,0x12,0x0f,0x11,0x0e,0x11,0x0e,0x17,0x16,0x0e,0x0e,0x13,0x0e,0x13,0x0e,0x17,0x14,0x0f,0x0c,0x0e,0x0c,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x11,0x0c, -0x0f,0x0d,0x0f,0x0d,0x0f,0x0d,0x12,0x0f,0x15,0x13,0x0f,0x10,0x17,0x17,0x16,0x13,0x0f,0x0d,0x18,0x15,0x1b,0x17,0x13,0x0e,0x12,0x10,0x10,0x0f,0x0f,0x0e,0x10,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x10,0x09,0x09,0x04,0x06,0x06,0x06,0x08,0x0b,0x08,0x06,0x0a,0x06,0x06,0x06,0x09,0x09, -0x06,0x06,0x10,0x10,0x10,0x10,0x09,0x08,0x07,0x09,0x08,0x07,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x08,0x04,0x07,0x08,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0b,0x09,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f, -0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f, -0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x11,0x08,0x11,0x09,0x10,0x10,0x09,0x09, -0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x10,0x0d,0x12,0x16,0x0d,0x0c,0x0f,0x0f,0x0b,0x0b,0x07,0x08,0x0d,0x0b,0x13,0x10,0x10,0x0d,0x11,0x11,0x11,0x19,0x0e,0x10,0x10,0x0c,0x0c,0x0c,0x0b,0x0e,0x0f,0x13,0x0f,0x0d,0x14,0x0c,0x0b, -0x0b,0x0e,0x0a,0x0d,0x10,0x0c,0x10,0x0f,0x0a,0x0d,0x09,0x0a,0x0b,0x08,0x08,0x0b,0x0b,0x05,0x06,0x0a,0x08,0x0e,0x0c,0x0c,0x0c,0x0a,0x09,0x09,0x08,0x0b,0x0e,0x09,0x09,0x09,0x0d,0x09,0x09,0x08,0x08,0x07,0x07,0x09,0x04,0x08,0x0d,0x09,0x09,0x07,0x09,0x09,0x09,0x05,0x09,0x09,0x0d,0x08,0x09,0x09,0x08,0x09,0x0b,0x08,0x04,0x06, -0x09,0x08,0x09,0x08,0x09,0x0b,0x08,0x10,0x04,0x09,0x0f,0x18,0x11,0x0f,0x0f,0x17,0x11,0x17,0x14,0x0e,0x10,0x0e,0x0c,0x1e,0x0c,0x10,0x18,0x19,0x19,0x11,0x11,0x11,0x0c,0x0d,0x0e,0x0b,0x0c,0x0e,0x05,0x00,0x00,0x00,0x00,0x10,0x11,0x11,0x11,0x0d,0x0a,0x10,0x10,0x08,0x17,0x0f,0x10,0x09,0x09,0x0d,0x09,0x0c,0x10,0x0c,0x10,0x18, -0x11,0x09,0x07,0x10,0x0e,0x10,0x10,0x10,0x08,0x10,0x0d,0x07,0x17,0x0f,0x10,0x09,0x0b,0x0c,0x0d,0x0c,0x0c,0x0e,0x10,0x10,0x0e,0x0c,0x0c,0x14,0x07,0x0d,0x07,0x0f,0x0c,0x09,0x07,0x07,0x09,0x07,0x05,0x04,0x09,0x09,0x04,0x05,0x05,0x05,0x04,0x05,0x04,0x06,0x0d,0x0d,0x09,0x09,0x0a,0x09,0x0a,0x06,0x04,0x05,0x09,0x09,0x09,0x09, -0x08,0x07,0x07,0x08,0x07,0x09,0x00,0x00,0x00,0x00,0x06,0x09,0x08,0x09,0x07,0x08,0x0f,0x0f,0x0f,0x0f,0x09,0x00,0x00,0x00,0x00,0x0d,0x08,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x24,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x05,0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x0a,0x09,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x15,0x11,0x13,0x10,0x14,0x11,0x19,0x14,0x0f,0x0a,0x0e,0x12,0x0e,0x16,0x13,0x00,0x00,0x00, -0x00,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x17,0x17,0x1b,0x0b,0x07,0x0e,0x10,0x0b,0x0e,0x0e,0x10,0x10,0x0e,0x1b,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x11,0x0e,0x0e,0x0e,0x09,0x10,0x09,0x14,0x12,0x0e,0x09,0x17,0x0e,0x17,0x07,0x09,0x10,0x10,0x11,0x11,0x11,0x10,0x10,0x10,0x17,0x07,0x10,0x07, -0x0e,0x0b,0x07,0x07,0x0e,0x07,0x14,0x07,0x19,0x0e,0x19,0x19,0x10,0x10,0x10,0x0e,0x0e,0x0b,0x0b,0x20,0x20,0x24,0x24,0x17,0x17,0x0e,0x0e,0x05,0x1b,0x14,0x17,0x12,0x10,0x12,0x0e,0x0e,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07,0x11,0x00,0x11,0x11,0x11,0x09,0x0e,0x0e,0x19,0x09,0x19,0x09,0x10,0x12,0x10,0x0b, -0x19,0x0e,0x19,0x0e,0x14,0x17,0x09,0x0e,0x0e,0x0b,0x07,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x10,0x0e,0x12,0x11,0x19,0x09,0x0e,0x0b,0x12,0x0e,0x09,0x0e,0x0e,0x0e,0x19,0x09,0x19,0x09,0x07,0x10,0x0b,0x1b,0x0e,0x0e,0x11,0x11,0x1b,0x0e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x11,0x14,0x11,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07, -0x0b,0x0b,0x0e,0x0e,0x14,0x17,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0e,0x0b,0x0b,0x0b,0x20,0x17,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x0e,0x10, -0x10,0x10,0x1b,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x14,0x14,0x1d,0x1b,0x19,0x0e,0x17,0x0e,0x17,0x0e,0x17,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x12,0x09,0x12,0x09,0x0f,0x12,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x17, -0x19,0x14,0x17,0x09,0x0e,0x14,0x17,0x14,0x17,0x00,0x00,0x00,0x00,0x00,0x1e,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0b,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x17,0x24,0x1b,0x0e,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x19,0x19,0x0a,0x10,0x10,0x10,0x21,0x16, -0x0e,0x29,0x1d,0x09,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0b,0x0b,0x14,0x12,0x12,0x0e,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x22,0x29,0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x10,0x12,0x10, -0x0e,0x0e,0x0b,0x20,0x17,0x0e,0x10,0x10,0x10,0x0e,0x10,0x10,0x10,0x0e,0x10,0x10,0x10,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x10,0x10,0x10,0x10,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x12,0x09,0x09,0x0b,0x0b,0x20,0x17,0x11,0x10,0x10,0x00,0x0e,0x0e,0x0e,0x0a,0x0f,0x13,0x11,0x0e,0x0e,0x0a, -0x07,0x14,0x10,0x10,0x09,0x0f,0x0d,0x0d,0x0c,0x0d,0x07,0x0e,0x0b,0x11,0x0d,0x10,0x0c,0x0f,0x0c,0x12,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0x0d,0x0d,0x08,0x0e,0x0f,0x10,0x0e,0x09,0x14,0x10,0x11,0x0e,0x11,0x0d,0x0f,0x0e,0x0b,0x13,0x0a,0x0b,0x0b,0x0d,0x10,0x10,0x0e,0x1b,0x0e,0x1b,0x09,0x07,0x05,0x0f, -0x06,0x03,0x00,0x04,0x06,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x19,0x0b,0x14,0x10,0x19,0x14,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x19,0x17,0x0d,0x17,0x0d,0x17,0x11,0x12,0x13,0x13,0x15,0x17,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x12,0x14,0x10,0x1d, -0x16,0x0d,0x0d,0x08,0x08,0x08,0x0a,0x06,0x0f,0x06,0x06,0x17,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x05,0x00,0x00,0x06,0x00,0x00,0x11,0x0f,0x0c,0x0d,0x12,0x07,0x09,0x12,0x12,0x07,0x0f,0x0f,0x0f,0x13,0x12,0x07,0x0b,0x12,0x10,0x11,0x11,0x0f,0x10,0x12,0x0f,0x15,0x14,0x0e,0x0e,0x0e, -0x06,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x11,0x0d,0x12,0x0f,0x0f,0x13,0x0f,0x14,0x0f,0x15,0x15,0x15,0x15,0x11,0x11,0x11,0x0f,0x0c,0x0d,0x12,0x08,0x0a,0x12,0x08,0x0f,0x0f,0x0f,0x12,0x0b,0x12,0x11,0x11,0x10,0x12,0x0f,0x15,0x14,0x07,0x0f,0x0f,0x11,0x12,0x20,0x00,0x11,0x0f,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x00,0x14,0x11,0x12,0x13,0x0f,0x12,0x14,0x15,0x0d,0x11,0x14,0x14,0x12,0x14,0x16,0x15,0x12,0x0f,0x0f,0x14,0x13,0x0f,0x13,0x12,0x12,0x12,0x13,0x14,0x10,0x11,0x12,0x12,0x15,0x11,0x11,0x11, -0x12,0x16,0x0d,0x10,0x10,0x18,0x0f,0x0f,0x15,0x18,0x10,0x0f,0x1c,0x0f,0x0f,0x14,0x0f,0x0f,0x14,0x0f,0x14,0x16,0x18,0x0f,0x15,0x0f,0x12,0x0f,0x11,0x0f,0x11,0x0f,0x10,0x15,0x0f,0x11,0x12,0x0f,0x0f,0x10,0x1a,0x0f,0x0f,0x10,0x10,0x0b,0x09,0x0f,0x0f,0x0f,0x0e,0x0f,0x18,0x0f,0x18,0x0d,0x0f,0x18,0x12,0x0f,0x18,0x14,0x14,0x18, -0x10,0x0f,0x18,0x18,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x18,0x18,0x10,0x0f,0x0f,0x18,0x10,0x0f,0x0f,0x0f,0x18,0x15,0x13,0x13,0x13,0x13,0x13,0x11,0x13,0x15,0x13,0x12,0x0f,0x15,0x12,0x13,0x0f,0x12,0x13,0x14,0x13,0x10,0x13,0x12,0x14,0x12,0x15,0x13,0x13,0x14,0x12,0x11,0x13,0x12,0x13,0x15,0x12,0x14,0x14,0x03,0x03,0x04,0x05,0x04, -0x07,0x09,0x17,0x0f,0x11,0x10,0x0f,0x11,0x0f,0x0f,0x11,0x10,0x0f,0x08,0x17,0x10,0x0f,0x0f,0x0f,0x10,0x0e,0x10,0x07,0x10,0x0e,0x0f,0x0b,0x17,0x0f,0x0f,0x0f,0x10,0x16,0x0f,0x10,0x0b,0x16,0x10,0x10,0x13,0x12,0x06,0x08,0x1f,0x1e,0x1e,0x1f,0x26,0x0f,0x0f,0x07,0x0f,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f, -0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0d,0x0e,0x10,0x0c,0x0b,0x0f,0x11,0x07,0x08,0x0d,0x0b,0x14,0x11,0x11,0x0d,0x11,0x0d,0x0b,0x0c,0x10,0x0e,0x16,0x0e,0x0d,0x0d,0x13, -0x15,0x0b,0x11,0x0d,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0e,0x11,0x11,0x07,0x07,0x07,0x07,0x07,0x0f,0x08,0x0d,0x0b,0x0b,0x0b,0x0b,0x11,0x11, -0x11,0x12,0x11,0x11,0x11,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x13,0x11,0x0e,0x0d,0x0b,0x0e,0x0c,0x0d,0x11,0x11,0x07,0x0d,0x0e,0x14,0x11,0x0c,0x11,0x11,0x0d,0x0c,0x0c,0x0d,0x11,0x0e,0x12,0x11,0x0e,0x0c,0x11,0x07,0x11, -0x0d,0x11,0x07,0x0d,0x0c,0x0f,0x0b,0x0e,0x0b,0x07,0x07,0x08,0x16,0x16,0x10,0x0d,0x0d,0x10,0x0e,0x0d,0x0d,0x0b,0x10,0x0c,0x14,0x0c,0x11,0x11,0x0d,0x0f,0x14,0x11,0x11,0x11,0x0d,0x0e,0x0c,0x0d,0x11,0x0e,0x11,0x0f,0x16,0x16,0x0f,0x13,0x0d,0x0e,0x17,0x0d,0x0b,0x10,0x10,0x11,0x18,0x18,0x12,0x0e,0x0f,0x0b,0x0f,0x0f,0x0f,0x13, -0x0e,0x0e,0x13,0x10,0x10,0x0a,0x11,0x11,0x0f,0x0d,0x0d,0x18,0x14,0x0d,0x0e,0x10,0x10,0x11,0x11,0x13,0x13,0x0a,0x19,0x10,0x0f,0x0f,0x11,0x11,0x0e,0x0e,0x07,0x14,0x13,0x13,0x0d,0x13,0x06,0x06,0x0c,0x0c,0x06,0x06,0x11,0x0b,0x07,0x14,0x13,0x08,0x06,0x06,0x0c,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x12,0x0d,0x08,0x10,0x13,0x10,0x10, -0x0d,0x14,0x0f,0x10,0x09,0x0c,0x0e,0x0b,0x06,0x06,0x0b,0x0e,0x09,0x12,0x12,0x12,0x19,0x14,0x19,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x14,0x17,0x09,0x09,0x0e,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x0e,0x0e,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x19,0x19,0x0e,0x0e,0x19,0x19,0x0e, -0x0e,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x1b,0x14,0x17,0x0e,0x10,0x10,0x12,0x09,0x12,0x14,0x0e,0x0e,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x19,0x09,0x14,0x0e,0x0e,0x07,0x0e,0x0e,0x0e,0x0e,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09, -0x19,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x20,0x17,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x0e,0x0e,0x14,0x0e,0x0e,0x19,0x0e,0x1d,0x1b,0x19,0x0e,0x17,0x0e,0x17,0x0e,0x17,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19, -0x0e,0x19,0x0e,0x12,0x12,0x12,0x12,0x12,0x09,0x12,0x12,0x09,0x09,0x12,0x09,0x12,0x09,0x12,0x0e,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x0e,0x09,0x09,0x09,0x09,0x00,0x20,0x17,0x24,0x1b,0x19,0x0e,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x0e,0x0e,0x0b,0x20,0x17,0x1b, -0x1b,0x19,0x19,0x19,0x10,0x10,0x10,0x10,0x12,0x09,0x12,0x09,0x12,0x09,0x20,0x17,0x10,0x12,0x10,0x10,0x10,0x12,0x10,0x10,0x20,0x20,0x17,0x17,0x0b,0x0b,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x10,0x10,0x10,0x10,0x19,0x09,0x19,0x09,0x10,0x12,0x10,0x10,0x20,0x20, -0x17,0x17,0x20,0x20,0x17,0x17,0x17,0x17,0x0e,0x0e,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x07,0x07,0x09,0x07,0x00,0x00,0x00,0x17,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x19,0x19,0x19,0x19, -0x19,0x19,0x19,0x19,0x19,0x19,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x14,0x12,0x12,0x12,0x12,0x12,0x12,0x10,0x17,0x10,0x17,0x10,0x17,0x10,0x17,0x12,0x12,0x12,0x07,0x07,0x0e,0x0b,0x10,0x11, -0x0f,0x0f,0x0f,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0c,0x0f,0x0e,0x10,0x10,0x11,0x12,0x10,0x0f,0x12,0x0e,0x12,0x14,0x11,0x14,0x16,0x11,0x15,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0c,0x0f,0x10,0x10,0x12,0x0f,0x11,0x10,0x10,0x10,0x0e,0x0e,0x14,0x12,0x13,0x12,0x12, -0x10,0x10,0x10,0x14,0x15,0x14,0x15,0x19,0x19,0x13,0x19,0x19,0x14,0x18,0x17,0x0f,0x15,0x17,0x15,0x10,0x17,0x14,0x13,0x13,0x10,0x11,0x14,0x15,0x13,0x11,0x13,0x10,0x0e,0x19,0x19,0x19,0x16,0x19,0x19,0x12,0x19,0x19,0x13,0x15,0x15,0x14,0x14,0x14,0x11,0x18,0x15,0x16,0x13,0x13,0x10,0x14,0x13,0x13,0x17,0x14,0x14,0x18,0x0f,0x0e, -0x0f,0x0e,0x11,0x11,0x13,0x14,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x0f,0x0f,0x0f,0x0e,0x0e,0x10,0x11,0x10,0x10,0x0c,0x0f,0x0f,0x10,0x10,0x15,0x17,0x12,0x12,0x11,0x15,0x11,0x12,0x0e,0x0d,0x10,0x0f,0x0d,0x0d,0x0f,0x0f,0x0d,0x0d,0x11,0x0c,0x0f,0x0d,0x0f,0x15,0x0f,0x16,0x0e,0x0f,0x0f,0x14,0x08,0x15,0x13,0x13, -0x12,0x0f,0x14,0x10,0x15,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0d,0x0c,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x11,0x07,0x07,0x07,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x18,0x18,0x18,0x18,0x0d,0x14,0x14,0x0d,0x0b,0x0d,0x0e,0x0f,0x0d, -0x17,0x16,0x17,0x0c,0x1b,0x0d,0x17,0x17,0x17,0x16,0x0f,0x0d,0x0d,0x15,0x10,0x15,0x12,0x0e,0x0c,0x0b,0x1c,0x0b,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x25,0x17,0x17,0x0c,0x07,0x0c,0x06,0x0c,0x06,0x06,0x06,0x0d,0x10,0x10,0x0f,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x06,0x0b,0x17,0x06,0x18,0x18,0x18,0x10,0x10,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x20,0x20,0x12,0x20,0x20,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0d,0x10,0x0d,0x0e,0x0b,0x0a,0x09,0x13,0x0f,0x13,0x0c,0x1e,0x18,0x10,0x0f,0x19,0x15,0x17,0x14,0x1c,0x16, -0x19,0x15,0x11,0x0d,0x14,0x10,0x19,0x14,0x14,0x10,0x14,0x10,0x17,0x12,0x18,0x12,0x1e,0x17,0x14,0x10,0x14,0x10,0x21,0x18,0x15,0x00,0x1b,0x1b,0x1b,0x0d,0x00,0x00,0x10,0x0e,0x13,0x0f,0x0e,0x0b,0x1d,0x18,0x1a,0x17,0x13,0x10,0x13,0x10,0x0e,0x0b,0x14,0x10,0x0e,0x0b,0x16,0x12,0x12,0x0f,0x1a,0x16,0x0f,0x10,0x14,0x14,0x16,0x0c, -0x05,0x0c,0x12,0x0c,0x1b,0x1b,0x07,0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x0b,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, -0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x14, -0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0d,0x12,0x14,0x08,0x06,0x08,0x06,0x13,0x0f,0x14,0x11,0x0f,0x0d,0x0e,0x0d,0x10,0x0f,0x0b,0x0b,0x1e,0x16,0x1f,0x18,0x1b,0x17,0x18,0x12,0x18,0x12,0x18,0x12,0x11,0x0c,0x10,0x0d,0x10,0x0d,0x10, -0x0d,0x0f,0x08,0x0d,0x07,0x14,0x10,0x17,0x12,0x24,0x1b,0x0f,0x10,0x13,0x13,0x16,0x17,0x14,0x10,0x1a,0x15,0x0f,0x0b,0x0f,0x0d,0x11,0x0d,0x19,0x14,0x11,0x0e,0x0f,0x10,0x0f,0x10,0x0d,0x0b,0x0d,0x0a,0x0d,0x0a,0x0e,0x0e,0x08,0x12,0x09,0x1a,0x12,0x09,0x10,0x11,0x0c,0x14,0x0f,0x0a,0x09,0x10,0x10,0x10,0x0d,0x07,0x15,0x10,0x0a, -0x09,0x11,0x0c,0x13,0x0a,0x15,0x10,0x11,0x0c,0x13,0x10,0x10,0x0d,0x14,0x0f,0x10,0x09,0x0e,0x0b,0x14,0x0b,0x0e,0x17,0x0d,0x0f,0x18,0x07,0x1f,0x18,0x18,0x20,0x18,0x19,0x19,0x18,0x18,0x19,0x0e,0x0d,0x11,0x13,0x18,0x13,0x19,0x07,0x0c,0x10,0x17,0x1c,0x13,0x1c,0x11,0x11,0x15,0x13,0x1f,0x19,0x0e,0x19,0x09,0x19,0x09,0x10,0x10, -0x10,0x10,0x17,0x17,0x17,0x17,0x1b,0x0e,0x0e,0x1b,0x14,0x0e,0x0e,0x14,0x12,0x09,0x09,0x12,0x10,0x10,0x10,0x10,0x14,0x09,0x09,0x17,0x14,0x09,0x09,0x17,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a, -0x0e,0x0b,0x0f,0x0e,0x14,0x10,0x10,0x18,0x12,0x14,0x14,0x16,0x16,0x10,0x0d,0x1b,0x16,0x1c,0x17,0x13,0x10,0x08,0x08,0x10,0x11,0x0b,0x10,0x0e,0x10,0x0d,0x14,0x16,0x0b,0x10,0x0c,0x06,0x0a,0x0e,0x0f,0x06,0x06,0x05,0x06,0x0a,0x0a,0x0a,0x0c,0x28,0x36,0x09,0x0b,0x04,0x07,0x0a,0x0c,0x09,0x0d,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x24,0x0f,0x15,0x19,0x18,0x11,0x0c,0x0f,0x13,0x14,0x0d,0x08,0x12,0x0e,0x12,0x0f,0x12,0x0e,0x0f,0x14,0x10,0x10,0x0e,0x14,0x11,0x16,0x0c,0x0e,0x11,0x08,0x10,0x09,0x09,0x07,0x18,0x10,0x0f,0x0e,0x0e,0x10,0x19,0x19,0x19,0x1b,0x1b,0x0f,0x0d,0x08,0x0e,0x0c,0x10,0x0c,0x12,0x07,0x0f, -0x10,0x17,0x17,0x11,0x0f,0x10,0x0f,0x0e,0x0c,0x0e,0x0c,0x0d,0x08,0x09,0x07,0x06,0x0a,0x10,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x00,0x08,0x08,0x08,0x07,0x07,0x2d,0x1b,0x18,0x1c,0x08,0x08,0x09,0x0b,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x19,0x09, -0x09,0x19,0x07,0x0e,0x0e,0x24,0x1b,0x1b,0x24,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x0b,0x0b,0x00,0x00,0x0a,0x14,0x10,0x13,0x10,0x22,0x1c,0x13,0x0f,0x13,0x0f,0x24,0x1b,0x14,0x10,0x0a,0x09,0x11,0x00,0x12,0x0f,0x09,0x08,0x04,0x0d,0x09,0x09,0x07,0x05,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x0e,0x0c,0x10,0x0f,0x0f,0x1a, -0x16,0x16,0x15,0x16,0x19,0x11,0x13,0x10,0x0b,0x19,0x1e,0x0c,0x1f,0x0e,0x17,0x19,0x19,0x19,0x0b,0x14,0x1b,0x14,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x10,0x10,0x10,0x17,0x0e,0x0e,0x19,0x09,0x09,0x19,0x09,0x09,0x19,0x0d,0x0d,0x00,0x0b,0x17,0x09,0x09,0x1b,0x0e,0x0e,0x14,0x0e, -0x0e,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x29,0x29,0x18,0x00,0x00,0x18,0x18,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x11,0x11,0x12,0x18,0x11,0x11,0x16,0x1a,0x12,0x11,0x1d,0x11,0x11,0x19,0x11,0x12,0x15,0x11,0x15,0x17,0x19,0x11,0x15, -0x12,0x13,0x11,0x13,0x11,0x12,0x13,0x11,0x15,0x10,0x12,0x15,0x11,0x11,0x0f,0x15,0x11,0x12,0x12,0x13,0x0c,0x0e,0x11,0x15,0x15,0x0f,0x00,0x00,0x1d,0x3a,0x13,0x00,0x03,0x08,0x08,0x0b,0x11,0x10,0x18,0x17,0x07,0x09,0x09,0x0c,0x14,0x06,0x0c,0x06,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x06,0x14,0x14,0x14, -0x0d,0x1c,0x13,0x11,0x12,0x14,0x0f,0x0e,0x14,0x15,0x08,0x0a,0x11,0x0e,0x1a,0x16,0x16,0x10,0x16,0x11,0x0f,0x0f,0x14,0x12,0x1b,0x11,0x10,0x11,0x09,0x0b,0x09,0x14,0x0c,0x08,0x0f,0x11,0x0d,0x11,0x0f,0x09,0x11,0x10,0x07,0x07,0x0e,0x07,0x19,0x10,0x11,0x11,0x11,0x0a,0x0c,0x0a,0x10,0x0e,0x15,0x0d,0x0e,0x0d,0x09,0x07,0x09,0x14, -0x13,0x13,0x12,0x0f,0x16,0x16,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0f,0x0f,0x0f,0x0f,0x07,0x07,0x07,0x07,0x10,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x0b,0x0b,0x10,0x10,0x0d,0x0c,0x0d,0x10,0x0c,0x1a,0x1a,0x16,0x08,0x0c,0x14,0x19,0x16,0x18,0x14,0x14,0x14,0x10,0x11,0x10,0x12,0x16,0x10,0x0b,0x0c,0x16,0x18,0x11, -0x0d,0x08,0x08,0x14,0x13,0x10,0x14,0x13,0x0f,0x0f,0x15,0x13,0x13,0x16,0x1b,0x1b,0x0f,0x1d,0x0b,0x0b,0x07,0x07,0x14,0x11,0x0e,0x10,0x05,0x10,0x09,0x09,0x10,0x10,0x0b,0x06,0x07,0x0b,0x23,0x13,0x0f,0x13,0x0f,0x0f,0x08,0x08,0x08,0x08,0x16,0x16,0x16,0x14,0x14,0x14,0x07,0x0b,0x0a,0x09,0x09,0x06,0x08,0x06,0x09,0x05,0x0b,0x0e, -0x08,0x0f,0x0c,0x11,0x0d,0x07,0x14,0x10,0x10,0x0e,0x10,0x11,0x14,0x14,0x0a,0x0b,0x0b,0x1b,0x1a,0x1c,0x0e,0x14,0x11,0x08,0x0f,0x0c,0x12,0x0d,0x12,0x0d,0x11,0x0c,0x06,0x13,0x0f,0x13,0x0f,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0e,0x07,0x0e,0x09,0x0e,0x09,0x16,0x10,0x16,0x10,0x16,0x11,0x11,0x0a,0x11,0x0a,0x0f,0x0c,0x0f,0x0a, -0x0f,0x0d,0x14,0x10,0x14,0x10,0x11,0x0d,0x11,0x0d,0x0e,0x16,0x16,0x12,0x11,0x0d,0x11,0x0e,0x14,0x0c,0x0e,0x0b,0x20,0x12,0x0e,0x12,0x07,0x0b,0x17,0x09,0x12,0x0a,0x0a,0x12,0x0a,0x13,0x0f,0x12,0x0d,0x12,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x11,0x14,0x11,0x14,0x11,0x15,0x10,0x15,0x10,0x08,0x07,0x08,0x07,0x08,0x07,0x08, -0x07,0x0a,0x07,0x11,0x0e,0x0e,0x0e,0x07,0x16,0x10,0x16,0x10,0x16,0x11,0x16,0x11,0x11,0x0a,0x0f,0x0c,0x0f,0x0a,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x1b,0x15,0x10,0x0e,0x07,0x13,0x0f,0x19,0x18,0x16,0x11,0x06,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x10,0x0e,0x07,0x0c,0x10,0x11,0x1b,0x1b,0x1b,0x1a,0x0b,0x0b,0x06,0x08,0x08,0x13, -0x11,0x16,0x0b,0x17,0x13,0x18,0x08,0x13,0x11,0x0f,0x11,0x15,0x08,0x11,0x12,0x1a,0x16,0x0f,0x16,0x15,0x10,0x0f,0x0f,0x10,0x11,0x17,0x16,0x08,0x10,0x12,0x0d,0x11,0x08,0x10,0x10,0x0f,0x0d,0x11,0x11,0x08,0x0f,0x0e,0x11,0x0f,0x0d,0x11,0x11,0x0d,0x10,0x10,0x16,0x17,0x08,0x10,0x11,0x10,0x17,0x0f,0x14,0x0e,0x12,0x0f,0x08,0x1c, -0x1d,0x15,0x11,0x10,0x15,0x13,0x11,0x11,0x0e,0x14,0x0f,0x19,0x10,0x16,0x16,0x11,0x14,0x1a,0x15,0x16,0x15,0x10,0x12,0x0f,0x10,0x15,0x11,0x16,0x13,0x1c,0x1c,0x14,0x17,0x11,0x12,0x1e,0x11,0x0f,0x11,0x0f,0x0b,0x10,0x0f,0x16,0x0d,0x11,0x11,0x0e,0x0f,0x14,0x11,0x11,0x11,0x11,0x0d,0x0c,0x0e,0x14,0x0d,0x11,0x10,0x17,0x18,0x11, -0x15,0x0f,0x0d,0x18,0x0f,0x0f,0x11,0x0b,0x0d,0x0c,0x07,0x17,0x17,0x10,0x0e,0x0e,0x11,0x0e,0x0b,0x1d,0x21,0x12,0x0a,0x0b,0x0b,0x0b,0x07,0x0f,0x0c,0x10,0x16,0x11,0x15,0x11,0x09,0x0a,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x09,0x0e,0x09,0x0e,0x09,0x09,0x09,0x0e,0x0e,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13, -0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x08,0x07,0x08,0x07,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x14,0x10,0x14,0x10,0x15,0x11,0x15, -0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0f,0x0a,0x0f,0x0f,0x16,0x11,0x08,0x0a,0x07,0x07,0x0f,0x0c,0x1a,0x17,0x12,0x0f,0x11,0x0e,0x16,0x11,0x10,0x0e,0x10,0x0e,0x12,0x0e,0x13,0x10,0x13,0x10,0x15,0x0f,0x16,0x11,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x09,0x09,0x09,0x09,0x0f, -0x0f,0x13,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x0d,0x14,0x11,0x14,0x11,0x14,0x11,0x14,0x11,0x14,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x09,0x14,0x11,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x08,0x07,0x08,0x07,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x1a, -0x19,0x1a,0x19,0x1a,0x19,0x16,0x10,0x16,0x10,0x16,0x10,0x16,0x10,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x10,0x11,0x10,0x11,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0a,0x0f,0x0a,0x0f,0x0a,0x0f,0x0a,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x12,0x0e,0x12, -0x0e,0x1b,0x15,0x1b,0x15,0x11,0x0d,0x11,0x0d,0x10,0x0e,0x11,0x0d,0x11,0x0d,0x11,0x0d,0x10,0x0a,0x15,0x0e,0x0f,0x07,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x15,0x15,0x15,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x1c,0x1c,0x1c,0x1c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x13,0x18,0x18,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x12,0x12,0x0d,0x0d,0x11, -0x11,0x08,0x08,0x11,0x11,0x10,0x10,0x17,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x15,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x11,0x11,0x10,0x10,0x10,0x10,0x13,0x13,0x12,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x16,0x11,0x11, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x12,0x0e,0x14,0x16,0x11,0x11,0x11,0x0f,0x10,0x0e,0x14,0x12,0x19,0x08,0x08,0x11,0x0e,0x07,0x0e,0x1a,0x16,0x11,0x16,0x1c,0x17,0x11,0x11,0x11,0x0f,0x0c,0x0f,0x09,0x0a,0x0f,0x0a,0x0f,0x16,0x15,0x11,0x0f,0x11,0x0d,0x12, -0x12,0x0d,0x0c,0x10,0x10,0x0b,0x0b,0x10,0x07,0x0b,0x0d,0x08,0x24,0x21,0x1e,0x19,0x15,0x0f,0x1f,0x1c,0x17,0x13,0x0f,0x08,0x07,0x16,0x11,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x13,0x0f,0x13,0x0f,0x19,0x18,0x14,0x11,0x14,0x11,0x11,0x0e,0x16,0x11,0x16,0x11,0x12,0x0d,0x07,0x24,0x21,0x1e,0x14,0x11,0x1d,0x14, -0x16,0x10,0x13,0x0f,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x08,0x07,0x08,0x07,0x16,0x11,0x16,0x11,0x11,0x0a,0x11,0x0a,0x14,0x10,0x14,0x10,0x0f,0x0c,0x15,0x10,0x15,0x11,0x10,0x11,0x0d,0x13,0x0f,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x10,0x0e,0x11,0x0f,0x10,0x10,0x11,0x0f,0x11,0x11,0x11,0x0e,0x0e,0x11,0x11,0x0f,0x12,0x0c,0x0c, -0x0f,0x10,0x08,0x11,0x11,0x0f,0x0e,0x0d,0x10,0x10,0x10,0x08,0x08,0x09,0x08,0x0b,0x07,0x11,0x19,0x19,0x19,0x10,0x10,0x11,0x11,0x14,0x15,0x13,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0c,0x07,0x07,0x08,0x08,0x0a,0x0a,0x11,0x11,0x10,0x0e,0x15,0x0e,0x0c,0x0d,0x0f,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x12,0x0e,0x10,0x0f,0x10, -0x07,0x0e,0x0b,0x11,0x0b,0x0b,0x1b,0x1c,0x1c,0x12,0x0e,0x15,0x17,0x11,0x11,0x0e,0x0e,0x10,0x11,0x10,0x14,0x10,0x13,0x17,0x11,0x14,0x11,0x11,0x0d,0x0e,0x0d,0x11,0x0f,0x12,0x0e,0x1a,0x19,0x12,0x0f,0x12,0x0f,0x12,0x0d,0x11,0x0e,0x13,0x11,0x10,0x0c,0x11,0x11,0x0d,0x07,0x16,0x0e,0x0e,0x19,0x14,0x13,0x11,0x1a,0x15,0x13,0x0e, -0x19,0x14,0x15,0x10,0x1b,0x16,0x10,0x0d,0x17,0x16,0x16,0x11,0x15,0x11,0x15,0x11,0x26,0x20,0x18,0x13,0x21,0x1a,0x19,0x14,0x11,0x0d,0x0f,0x0b,0x0c,0x00,0x00,0x1d,0x1c,0x11,0x0f,0x10,0x11,0x10,0x0f,0x10,0x0d,0x11,0x0e,0x15,0x11,0x18,0x13,0x1d,0x18,0x15,0x10,0x12,0x0d,0x0f,0x0c,0x19,0x14,0x14,0x11,0x18,0x12,0x18,0x12,0x08, -0x19,0x16,0x11,0x0f,0x15,0x11,0x13,0x10,0x13,0x0f,0x13,0x0f,0x19,0x18,0x0f,0x0f,0x15,0x0f,0x15,0x0f,0x19,0x16,0x10,0x0d,0x0f,0x0d,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x12,0x0d,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x13,0x10,0x17,0x15,0x11,0x11,0x19,0x19,0x17,0x15,0x10,0x0e,0x1a,0x17,0x1d,0x19,0x15,0x0f,0x14,0x11,0x11,0x10, -0x10,0x0f,0x11,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x11,0x0a,0x0a,0x05,0x06,0x06,0x06,0x08,0x0c,0x08,0x07,0x0b,0x06,0x06,0x06,0x0a,0x0a,0x06,0x06,0x11,0x11,0x11,0x11,0x0a,0x08,0x08,0x0a,0x09,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x08,0x05,0x07,0x08,0x06, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0c,0x0a,0x07,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10, -0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10, -0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x13,0x09,0x12,0x0a,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x09,0x09,0x0a,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x11, -0x0e,0x13,0x18,0x0e,0x0d,0x10,0x10,0x0c,0x0c,0x07,0x09,0x0e,0x0b,0x14,0x11,0x11,0x0e,0x12,0x12,0x12,0x1b,0x10,0x11,0x11,0x0d,0x0d,0x0d,0x0c,0x0f,0x10,0x15,0x10,0x0e,0x15,0x0d,0x0c,0x0c,0x0f,0x0b,0x0e,0x11,0x0d,0x11,0x10,0x0a,0x0e,0x0a,0x0a,0x0c,0x09,0x09,0x0c,0x0c,0x05,0x07,0x0a,0x08,0x0f,0x0d,0x0d,0x0c,0x0b,0x0a,0x0a, -0x08,0x0c,0x0f,0x09,0x09,0x0a,0x0e,0x0a,0x0a,0x09,0x09,0x08,0x08,0x0a,0x05,0x09,0x0e,0x0a,0x0a,0x08,0x0a,0x0a,0x0a,0x06,0x0a,0x09,0x0e,0x08,0x09,0x0a,0x08,0x0a,0x0c,0x09,0x05,0x06,0x0a,0x08,0x0a,0x08,0x0a,0x0c,0x09,0x11,0x05,0x0a,0x10,0x19,0x12,0x10,0x10,0x19,0x13,0x19,0x16,0x0f,0x11,0x0f,0x0d,0x21,0x0d,0x11,0x1a,0x1b, -0x1b,0x12,0x13,0x12,0x0d,0x0e,0x0f,0x0c,0x0d,0x0f,0x06,0x00,0x00,0x00,0x00,0x11,0x12,0x12,0x12,0x0e,0x0b,0x11,0x11,0x09,0x19,0x10,0x11,0x0a,0x0a,0x0d,0x0a,0x0d,0x11,0x0d,0x11,0x1a,0x13,0x09,0x08,0x11,0x0f,0x11,0x11,0x11,0x09,0x11,0x0e,0x07,0x19,0x10,0x11,0x0a,0x0c,0x0d,0x0e,0x0d,0x0d,0x0f,0x11,0x11,0x0f,0x0d,0x0d,0x15, -0x07,0x0e,0x07,0x10,0x0d,0x0a,0x08,0x08,0x0a,0x08,0x05,0x05,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0b,0x07,0x05,0x06,0x0a,0x0a,0x0a,0x09,0x08,0x08,0x08,0x09,0x08,0x0a,0x00,0x00,0x00,0x00,0x06,0x09,0x09,0x0a,0x08,0x09,0x10,0x10,0x10,0x10,0x0a,0x00,0x00,0x00,0x00,0x0d,0x09,0x08, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x10,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x05,0x0b,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, -0x0b,0x09,0x09,0x0b,0x0a,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x17,0x12,0x15,0x11,0x16,0x12,0x1b,0x16,0x10,0x0b,0x0f,0x14,0x10,0x18,0x14,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18,0x1d,0x0c,0x07,0x0f,0x11,0x0c,0x0f,0x0f,0x11,0x11,0x0f,0x1d, -0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x13,0x0f,0x0f,0x0f,0x0a,0x11,0x0a,0x16,0x13,0x0f,0x0a,0x18,0x0f,0x18,0x07,0x0a,0x11,0x11,0x13,0x13,0x13,0x11,0x11,0x11,0x18,0x07,0x11,0x07,0x0f,0x0c,0x07,0x07,0x0f,0x07,0x16,0x07,0x1b,0x0f,0x1b,0x1b,0x11,0x11,0x11,0x0f,0x0f,0x0c,0x0c,0x22,0x22,0x27,0x27,0x18,0x18,0x0f,0x0f,0x05, -0x1d,0x16,0x18,0x13,0x11,0x13,0x0f,0x0f,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x07,0x13,0x00,0x13,0x13,0x13,0x0a,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x11,0x13,0x11,0x0c,0x1b,0x0f,0x1b,0x0f,0x16,0x18,0x0a,0x0f,0x0f,0x0c,0x07,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x11,0x0f,0x13,0x13,0x1b,0x0a,0x0f,0x0c,0x13,0x0f,0x0a, -0x0f,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x07,0x11,0x0b,0x1d,0x0f,0x0f,0x13,0x13,0x1d,0x0f,0x00,0x00,0x00,0x13,0x00,0x13,0x13,0x13,0x13,0x16,0x13,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0f,0x0f,0x16,0x18,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0f,0x0c,0x0c,0x0c,0x22,0x18,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d,0x18,0x0f,0x11,0x11,0x11,0x1d,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x16,0x16,0x1f,0x1d,0x1b,0x0f,0x18,0x0f,0x18,0x0f,0x18,0x0f,0x1b, -0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x13,0x0a,0x13,0x0a,0x10,0x13,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x18,0x1b,0x16,0x18,0x0a,0x0f,0x16,0x18,0x16,0x18,0x00,0x00,0x00,0x00,0x00,0x21,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x11,0x00, -0x00,0x00,0x22,0x18,0x27,0x1d,0x0f,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x1b,0x1b,0x0b,0x11,0x11,0x11,0x24,0x18,0x0f,0x2c,0x1f,0x0a,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0c,0x0c,0x16,0x13,0x13,0x0f,0x00,0x00,0x00,0x0a,0x0a,0x0a, -0x0a,0x24,0x2c,0x00,0x00,0x00,0x00,0x00,0x11,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x13,0x11,0x0f,0x0f,0x0c,0x22,0x18,0x0f,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1b,0x0f,0x0f,0x1b,0x0f, -0x0f,0x1b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x13,0x0a,0x0a,0x0c,0x0c,0x22,0x18,0x13,0x11,0x11,0x00,0x0f,0x0f,0x0f,0x0b,0x11,0x14,0x12,0x0f,0x0f,0x0a,0x07,0x16,0x11,0x11,0x0a,0x10,0x0e,0x0e,0x0d,0x0e,0x07,0x0f,0x0c,0x12,0x0e,0x11,0x0d,0x10,0x0d,0x14,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x15,0x0d,0x0e,0x0e,0x08,0x0f,0x10,0x11,0x0f,0x0a,0x16,0x11,0x13,0x10,0x12,0x0e,0x11,0x0f,0x0b,0x14,0x0b,0x0c,0x0c,0x0e,0x11,0x11,0x0f,0x1d,0x0f,0x1d,0x0a,0x07,0x05,0x10,0x06,0x04,0x00,0x04,0x06,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x1b,0x0c,0x16,0x11,0x1b,0x15,0x12, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x1b,0x19,0x0e,0x19,0x0e,0x19,0x13,0x14,0x14,0x14,0x16,0x19,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x14,0x15,0x11,0x1f,0x18,0x0e,0x0e,0x08,0x08,0x08,0x0b,0x06,0x10,0x07,0x07,0x18,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00, -0x06,0x00,0x00,0x06,0x00,0x00,0x12,0x11,0x0d,0x0e,0x14,0x08,0x0a,0x14,0x14,0x08,0x10,0x10,0x10,0x14,0x14,0x08,0x0c,0x14,0x12,0x12,0x12,0x10,0x11,0x13,0x10,0x17,0x15,0x0f,0x0f,0x0f,0x07,0x0b,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x0e,0x14,0x10,0x10,0x14,0x10,0x15,0x10,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x11,0x0d,0x0e,0x14, -0x09,0x0a,0x14,0x09,0x10,0x10,0x10,0x14,0x0c,0x14,0x12,0x12,0x11,0x13,0x10,0x17,0x15,0x08,0x11,0x10,0x12,0x13,0x23,0x00,0x12,0x10,0x13,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x08,0x00, -0x16,0x13,0x13,0x14,0x10,0x13,0x16,0x16,0x0e,0x12,0x16,0x15,0x13,0x16,0x18,0x17,0x13,0x10,0x10,0x16,0x14,0x11,0x14,0x14,0x13,0x14,0x14,0x15,0x11,0x12,0x14,0x13,0x16,0x12,0x12,0x13,0x13,0x18,0x0e,0x11,0x11,0x19,0x10,0x10,0x16,0x1a,0x12,0x10,0x1e,0x10,0x10,0x16,0x10,0x10,0x16,0x10,0x16,0x18,0x19,0x10,0x16,0x10,0x13,0x10, -0x12,0x10,0x12,0x10,0x12,0x16,0x10,0x12,0x13,0x10,0x10,0x11,0x1c,0x10,0x10,0x11,0x11,0x0c,0x0a,0x10,0x10,0x10,0x10,0x10,0x1a,0x10,0x1a,0x0e,0x10,0x1a,0x13,0x10,0x1a,0x16,0x16,0x1a,0x11,0x10,0x1a,0x1a,0x10,0x10,0x10,0x10,0x10,0x10,0x1a,0x1a,0x11,0x10,0x10,0x1a,0x11,0x10,0x10,0x10,0x1a,0x17,0x14,0x14,0x14,0x14,0x15,0x12, -0x14,0x17,0x14,0x13,0x10,0x17,0x14,0x14,0x11,0x13,0x14,0x16,0x15,0x11,0x14,0x13,0x15,0x13,0x16,0x14,0x15,0x15,0x14,0x12,0x14,0x14,0x15,0x17,0x13,0x16,0x15,0x03,0x03,0x04,0x06,0x04,0x08,0x0a,0x19,0x10,0x12,0x11,0x10,0x12,0x10,0x10,0x13,0x11,0x10,0x09,0x18,0x11,0x10,0x10,0x10,0x12,0x0f,0x11,0x08,0x11,0x0f,0x10,0x0c,0x19, -0x10,0x10,0x10,0x11,0x18,0x10,0x11,0x0b,0x18,0x11,0x11,0x14,0x14,0x06,0x08,0x21,0x21,0x21,0x21,0x29,0x10,0x10,0x07,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0e,0x0f,0x11,0x0c,0x0c,0x11,0x12,0x07,0x09,0x0e,0x0c,0x16,0x13,0x12,0x0e,0x12,0x0e,0x0c,0x0d,0x11,0x0f,0x17,0x0f,0x0e,0x0e,0x14,0x16,0x0c,0x12,0x0e,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x13,0x12,0x12,0x12,0x12,0x12,0x11, -0x11,0x11,0x11,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x11,0x11,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x0f,0x12,0x12,0x07,0x07,0x07,0x07,0x07,0x10,0x09,0x0e,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0f,0x14,0x12,0x0f,0x0e,0x0b,0x10,0x0c,0x0e,0x12,0x12,0x07,0x0e,0x0f,0x16,0x13,0x0d,0x12,0x12,0x0e,0x0d,0x0d,0x0e,0x12,0x0f,0x13,0x12,0x0f,0x0c,0x12,0x07,0x12,0x0e,0x12,0x07,0x0e,0x0c,0x11,0x0c,0x0f,0x0c,0x07,0x07,0x09,0x18,0x18,0x12,0x0e,0x0e,0x12,0x0f,0x0e,0x0e,0x0c,0x11,0x0c,0x15,0x0d,0x13,0x13, -0x0e,0x10,0x16,0x12,0x12,0x12,0x0e,0x0f,0x0d,0x0e,0x12,0x0f,0x12,0x10,0x17,0x18,0x10,0x14,0x0e,0x0f,0x19,0x0e,0x0c,0x11,0x11,0x12,0x1a,0x1a,0x13,0x0f,0x11,0x0c,0x11,0x10,0x10,0x14,0x0f,0x0f,0x14,0x11,0x11,0x0a,0x12,0x12,0x11,0x0e,0x0e,0x1a,0x16,0x0e,0x0f,0x11,0x11,0x12,0x12,0x15,0x14,0x0a,0x1b,0x11,0x10,0x11,0x13,0x13, -0x0f,0x0f,0x08,0x16,0x14,0x14,0x0e,0x14,0x06,0x06,0x0d,0x0d,0x06,0x06,0x12,0x0c,0x08,0x16,0x14,0x08,0x06,0x06,0x0d,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x14,0x0e,0x09,0x12,0x14,0x11,0x11,0x0e,0x16,0x10,0x11,0x0a,0x0d,0x0f,0x0c,0x06,0x07,0x0b,0x0f,0x0a,0x13,0x13,0x13,0x1b,0x16,0x1b,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x16,0x18, -0x0a,0x0a,0x0f,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x0f,0x0f,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x0f,0x0f,0x1b,0x1b,0x0f,0x0f,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x1d,0x16,0x18,0x0f,0x11,0x11,0x13,0x0a,0x13,0x16,0x0f,0x0f,0x0a,0x0a,0x0a, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1b,0x0a,0x16,0x0f,0x0f,0x07,0x0f,0x0f,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x22,0x18,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d, -0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x16,0x0f,0x0f,0x16,0x0f,0x0f,0x1b,0x0f,0x1f,0x1d,0x1b,0x0f,0x18,0x0f,0x18,0x0f,0x18,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x13,0x13,0x13,0x13,0x13,0x0a,0x13,0x13,0x0a,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0f,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, -0x0f,0x0f,0x0a,0x0a,0x0f,0x0a,0x0a,0x0a,0x0a,0x00,0x22,0x18,0x27,0x1d,0x1b,0x0f,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x0f,0x0f,0x0c,0x22,0x18,0x1d,0x1d,0x1b,0x1b,0x1b,0x11,0x11,0x11,0x11,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x22,0x18,0x11,0x13,0x11,0x11,0x11,0x13,0x11,0x11,0x22,0x22,0x18,0x18, -0x0c,0x0c,0x11,0x11,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x11,0x11,0x11,0x11,0x1b,0x0a,0x1b,0x0a,0x11,0x13,0x11,0x11,0x22,0x22,0x18,0x18,0x22,0x22,0x18,0x18,0x18,0x18,0x0f,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x07,0x07,0x0a,0x07,0x00,0x00,0x00,0x18, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x18,0x11,0x18,0x11,0x18,0x11,0x18,0x13,0x13,0x13,0x07,0x07,0x0f,0x0c,0x11,0x12,0x11,0x10,0x10,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0d,0x10,0x0f,0x11,0x12,0x12,0x13,0x11,0x10,0x13,0x0f, -0x13,0x16,0x13,0x16,0x18,0x12,0x16,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0d,0x10,0x12,0x11,0x13,0x11,0x13,0x11,0x11,0x11,0x0f,0x0f,0x16,0x14,0x14,0x14,0x14,0x11,0x11,0x11,0x15,0x16,0x16,0x16,0x1b,0x1b,0x14,0x1b,0x1b,0x15,0x19,0x19,0x10,0x16,0x19,0x16,0x11,0x19,0x15,0x14,0x14,0x12,0x13,0x16,0x17, -0x14,0x12,0x14,0x11,0x0f,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x14,0x1b,0x1b,0x15,0x16,0x17,0x16,0x15,0x15,0x13,0x1a,0x16,0x18,0x15,0x15,0x11,0x15,0x14,0x14,0x19,0x16,0x15,0x1a,0x10,0x0f,0x10,0x10,0x12,0x12,0x14,0x15,0x11,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x0f,0x0f,0x11,0x12,0x11,0x11,0x0d,0x10,0x10, -0x11,0x12,0x16,0x18,0x13,0x13,0x12,0x16,0x13,0x14,0x0f,0x0e,0x11,0x10,0x0e,0x0e,0x10,0x10,0x0e,0x0d,0x12,0x0d,0x10,0x0e,0x10,0x17,0x10,0x18,0x10,0x10,0x11,0x16,0x09,0x17,0x14,0x15,0x13,0x10,0x16,0x11,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x12,0x12,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0e,0x0d, -0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x12,0x08,0x08,0x08,0x09,0x09,0x08,0x08,0x08,0x09,0x08,0x08,0x08,0x1a,0x1a,0x1a,0x1a,0x0e,0x16,0x15,0x0e,0x0c,0x0e,0x0f,0x10,0x0e,0x18,0x18,0x19,0x0d,0x1d,0x0e,0x18,0x18,0x18,0x17,0x10,0x0e,0x0e,0x17,0x11,0x17,0x14,0x0f,0x0d,0x0c,0x1e,0x0c,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e, -0x28,0x18,0x18,0x0c,0x07,0x0d,0x07,0x0d,0x07,0x07,0x07,0x0e,0x11,0x11,0x10,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x0c,0x19,0x06,0x1a,0x1a,0x1a,0x11,0x11,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x22,0x22,0x13,0x22,0x22,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x0e,0x11,0x0e,0x0f,0x0c,0x0a,0x0a,0x14,0x10,0x15,0x0c,0x21,0x1a,0x11,0x10,0x1b,0x17,0x18,0x16,0x1e,0x18,0x1b,0x16,0x13,0x0e,0x15,0x11,0x1b,0x15,0x16,0x12,0x16,0x11,0x19,0x13,0x19,0x13,0x20,0x18,0x16,0x11,0x16,0x11,0x23,0x1a,0x17,0x00,0x1d,0x1d, -0x1d,0x0e,0x00,0x00,0x11,0x0f,0x14,0x10,0x0f,0x0c,0x1f,0x1a,0x1b,0x19,0x15,0x11,0x14,0x11,0x0f,0x0c,0x15,0x11,0x0f,0x0c,0x18,0x13,0x13,0x10,0x1c,0x18,0x10,0x11,0x15,0x15,0x17,0x0d,0x06,0x0d,0x14,0x0d,0x1d,0x1d,0x07,0x00,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0c,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, -0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0e,0x14, -0x15,0x08,0x06,0x08,0x06,0x15,0x10,0x16,0x12,0x10,0x0e,0x0f,0x0e,0x11,0x11,0x0c,0x0c,0x21,0x18,0x21,0x1a,0x1d,0x19,0x1a,0x13,0x1a,0x13,0x1a,0x13,0x12,0x0d,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x10,0x09,0x0e,0x07,0x16,0x11,0x19,0x14,0x27,0x1d,0x10,0x11,0x14,0x14,0x17,0x19,0x16,0x11,0x1c,0x17,0x10,0x0c,0x10,0x0e,0x12,0x0e,0x1b, -0x15,0x12,0x0f,0x10,0x11,0x10,0x11,0x0e,0x0c,0x0e,0x0b,0x0e,0x0b,0x0f,0x0f,0x09,0x14,0x0a,0x1c,0x13,0x0a,0x11,0x12,0x0d,0x16,0x10,0x0b,0x0a,0x11,0x11,0x11,0x0e,0x07,0x16,0x11,0x0b,0x0a,0x12,0x0d,0x15,0x0b,0x17,0x11,0x12,0x0d,0x14,0x11,0x11,0x0e,0x16,0x10,0x11,0x0a,0x0f,0x0c,0x16,0x0c,0x0f,0x19,0x0e,0x10,0x1a,0x08,0x21, -0x1a,0x1a,0x22,0x1a,0x1b,0x1b,0x19,0x1a,0x1b,0x0f,0x0e,0x12,0x14,0x1a,0x14,0x1b,0x07,0x0d,0x11,0x19,0x1e,0x14,0x1e,0x12,0x12,0x17,0x14,0x21,0x1b,0x0f,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x18,0x18,0x18,0x18,0x1d,0x0f,0x0f,0x1d,0x16,0x0f,0x0f,0x16,0x13,0x0a,0x0a,0x13,0x11,0x11,0x11,0x11,0x16,0x0a,0x0a,0x18,0x16,0x0a, -0x0a,0x18,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0f,0x0b,0x10,0x0f,0x16,0x11,0x11,0x19,0x13,0x16,0x16,0x18,0x18,0x11,0x0e,0x1d,0x17,0x1e,0x19,0x14,0x11,0x09,0x09,0x11,0x13,0x0c,0x11,0x0f, -0x11,0x0e,0x15,0x17,0x0c,0x11,0x0c,0x06,0x0b,0x0f,0x10,0x06,0x06,0x05,0x06,0x0b,0x0b,0x0b,0x0d,0x2b,0x3a,0x0a,0x0c,0x04,0x08,0x0b,0x0c,0x09,0x0e,0x0f,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x27,0x10,0x16,0x1b,0x1a,0x13,0x0d,0x10,0x15,0x15,0x0e,0x09,0x13,0x0f,0x14,0x10,0x13,0x0f,0x10, -0x16,0x11,0x11,0x0f,0x16,0x12,0x18,0x0d,0x0f,0x12,0x09,0x11,0x0a,0x0a,0x07,0x19,0x11,0x10,0x0f,0x0f,0x11,0x1b,0x1b,0x1b,0x1d,0x1d,0x10,0x0e,0x08,0x0f,0x0d,0x12,0x0d,0x13,0x07,0x10,0x11,0x19,0x19,0x12,0x10,0x11,0x10,0x0f,0x0d,0x0f,0x0d,0x0e,0x09,0x0a,0x07,0x06,0x0a,0x11,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x08,0x08,0x08,0x07,0x07,0x31,0x1d,0x19,0x1e,0x08,0x08,0x09,0x0b,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x1b,0x0a,0x0a,0x1b,0x08,0x0f,0x0f,0x27,0x1d,0x1d,0x27,0x1b,0x0f,0x0f,0x1b,0x0f,0x0f,0x0c,0x0c,0x00,0x00,0x0a,0x16,0x11,0x15,0x11,0x24,0x1e,0x14,0x10, -0x14,0x10,0x27,0x1d,0x16,0x11,0x0b,0x09,0x12,0x00,0x14,0x10,0x0a,0x09,0x05,0x0e,0x0a,0x0a,0x07,0x06,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x0f,0x0c,0x11,0x11,0x10,0x1c,0x17,0x17,0x17,0x18,0x1b,0x12,0x14,0x11,0x0b,0x1b,0x21,0x0d,0x21,0x0f,0x18,0x1b,0x1b,0x1b,0x0c,0x16,0x1d,0x16,0x13,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x11,0x11,0x11,0x18,0x0f,0x0f,0x1b,0x0a,0x0a,0x1b,0x0a,0x0a,0x1b,0x0e,0x0e,0x00,0x0c,0x18,0x0a,0x0a,0x1d,0x0f,0x0f,0x16,0x0f,0x0f,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x2c,0x2c,0x1a,0x00,0x00,0x1a,0x1a,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x12,0x13,0x13,0x1a,0x13,0x12,0x17,0x1c,0x13,0x12,0x1f,0x12,0x12,0x1b,0x12,0x14,0x17,0x13,0x16,0x19,0x1a,0x13,0x16,0x13,0x14,0x12,0x14,0x12,0x13,0x14,0x12,0x17,0x11,0x13,0x17,0x12,0x12,0x11,0x17,0x13,0x13,0x13,0x14,0x0d,0x0f,0x13,0x17,0x17,0x10,0x00,0x00, -0x20,0x40,0x15,0x00,0x03,0x09,0x09,0x0d,0x13,0x11,0x1a,0x1a,0x07,0x0a,0x0a,0x0d,0x16,0x07,0x0d,0x07,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x16,0x16,0x16,0x0e,0x1f,0x15,0x12,0x14,0x16,0x10,0x10,0x16,0x17,0x09,0x0b,0x13,0x0f,0x1d,0x18,0x18,0x12,0x18,0x13,0x11,0x11,0x16,0x14,0x1e,0x13,0x12,0x12, -0x0a,0x0c,0x0a,0x16,0x0d,0x09,0x10,0x13,0x0f,0x13,0x11,0x0a,0x13,0x12,0x08,0x08,0x10,0x08,0x1c,0x12,0x13,0x13,0x13,0x0b,0x0e,0x0b,0x12,0x0f,0x17,0x0f,0x0f,0x0e,0x0a,0x08,0x0a,0x16,0x15,0x15,0x14,0x10,0x18,0x18,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x11,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x12,0x13,0x13,0x13,0x13,0x13, -0x12,0x12,0x12,0x12,0x0c,0x0c,0x11,0x11,0x0e,0x0d,0x0f,0x11,0x0d,0x1c,0x1c,0x19,0x09,0x0d,0x16,0x1c,0x18,0x1a,0x16,0x16,0x16,0x11,0x12,0x11,0x14,0x18,0x11,0x0d,0x0e,0x18,0x1b,0x13,0x0e,0x09,0x09,0x16,0x15,0x11,0x16,0x15,0x10,0x10,0x17,0x15,0x15,0x18,0x1e,0x1e,0x10,0x20,0x0c,0x0c,0x07,0x07,0x16,0x13,0x0f,0x12,0x06,0x11, -0x0a,0x0a,0x12,0x12,0x0c,0x07,0x07,0x0c,0x27,0x15,0x10,0x15,0x10,0x10,0x09,0x09,0x09,0x09,0x18,0x18,0x18,0x16,0x16,0x16,0x08,0x0c,0x0b,0x0a,0x0a,0x06,0x09,0x07,0x0a,0x06,0x0c,0x0f,0x09,0x11,0x0e,0x12,0x0e,0x08,0x16,0x12,0x12,0x0f,0x12,0x13,0x16,0x16,0x0b,0x0c,0x0c,0x1e,0x1d,0x1e,0x10,0x16,0x13,0x09,0x11,0x0e,0x14,0x0f, -0x14,0x0f,0x13,0x0d,0x07,0x15,0x10,0x15,0x10,0x16,0x16,0x16,0x10,0x11,0x10,0x11,0x0f,0x08,0x0f,0x0a,0x0f,0x0a,0x18,0x12,0x18,0x12,0x18,0x13,0x13,0x0b,0x13,0x0b,0x11,0x0e,0x11,0x0b,0x11,0x0e,0x16,0x12,0x16,0x12,0x12,0x0e,0x12,0x0e,0x0f,0x18,0x18,0x14,0x13,0x0e,0x12,0x10,0x16,0x0d,0x0f,0x0d,0x24,0x14,0x10,0x13,0x07,0x0c, -0x1a,0x0a,0x13,0x0b,0x0b,0x13,0x0b,0x15,0x10,0x14,0x0f,0x14,0x0f,0x10,0x11,0x10,0x11,0x10,0x11,0x16,0x13,0x16,0x13,0x16,0x13,0x17,0x12,0x17,0x12,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x0b,0x08,0x13,0x10,0x10,0x0f,0x08,0x18,0x12,0x18,0x12,0x18,0x13,0x18,0x13,0x13,0x0b,0x11,0x0e,0x11,0x0b,0x16,0x12,0x16,0x12,0x16,0x12, -0x16,0x12,0x1e,0x17,0x12,0x0f,0x08,0x15,0x10,0x1c,0x1b,0x18,0x13,0x07,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x12,0x0f,0x07,0x0d,0x11,0x13,0x1e,0x1e,0x1e,0x1d,0x0c,0x0c,0x07,0x09,0x09,0x15,0x12,0x19,0x0c,0x1a,0x15,0x1a,0x09,0x15,0x12,0x10,0x12,0x17,0x09,0x13,0x14,0x1d,0x18,0x10,0x18,0x17,0x12,0x11,0x11,0x12,0x13,0x19,0x18,0x09, -0x12,0x14,0x0e,0x12,0x09,0x12,0x12,0x11,0x0e,0x12,0x13,0x09,0x11,0x10,0x12,0x11,0x0e,0x13,0x13,0x0f,0x12,0x11,0x18,0x1a,0x09,0x12,0x13,0x12,0x1a,0x10,0x16,0x0f,0x14,0x11,0x09,0x1f,0x1f,0x17,0x13,0x12,0x17,0x15,0x12,0x12,0x0f,0x16,0x10,0x1c,0x11,0x18,0x18,0x13,0x16,0x1d,0x17,0x18,0x17,0x12,0x14,0x11,0x12,0x17,0x13,0x18, -0x15,0x1e,0x1f,0x17,0x19,0x12,0x14,0x21,0x13,0x10,0x13,0x11,0x0c,0x12,0x11,0x18,0x0e,0x13,0x13,0x10,0x11,0x16,0x12,0x13,0x12,0x13,0x0f,0x0d,0x0f,0x16,0x0f,0x13,0x12,0x1a,0x1a,0x13,0x17,0x10,0x0f,0x1a,0x10,0x11,0x12,0x0c,0x0f,0x0e,0x08,0x19,0x1a,0x12,0x10,0x0f,0x12,0x0f,0x0d,0x20,0x24,0x14,0x0b,0x0c,0x0c,0x0c,0x08,0x11, -0x0e,0x12,0x18,0x13,0x17,0x13,0x0a,0x0b,0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0f,0x0a,0x0f,0x0a,0x0a,0x0a,0x0f,0x0f,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10, -0x11,0x09,0x08,0x09,0x08,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x16,0x12,0x16,0x12,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x12,0x0f,0x12,0x0f,0x12,0x0f,0x11,0x0b,0x10,0x11,0x18,0x13,0x09,0x0b,0x08,0x08,0x10,0x0d,0x1d,0x19,0x14, -0x11,0x13,0x10,0x18,0x13,0x12,0x0f,0x12,0x0f,0x14,0x10,0x15,0x12,0x15,0x12,0x17,0x11,0x18,0x13,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x15,0x10,0x12,0x13,0x12,0x13,0x12,0x13,0x14,0x0f,0x16,0x13,0x16,0x13,0x16,0x13,0x16,0x13,0x16,0x13,0x10,0x11,0x10,0x11,0x10,0x11,0x10, -0x11,0x10,0x11,0x10,0x0a,0x16,0x13,0x17,0x12,0x17,0x12,0x17,0x12,0x17,0x12,0x17,0x12,0x09,0x08,0x09,0x08,0x13,0x10,0x13,0x10,0x13,0x10,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x1d,0x1c,0x1d,0x1c,0x1d,0x1c,0x18,0x12,0x18,0x12,0x18,0x12,0x18,0x12,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x12,0x13,0x12,0x13,0x13,0x0b,0x13, -0x0b,0x13,0x0b,0x13,0x0b,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x14,0x0f,0x14,0x0f,0x1e,0x17,0x1e,0x17,0x13,0x0f,0x13,0x0f,0x12,0x0f,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0b,0x17,0x0f,0x10,0x08,0x14,0x14,0x14,0x14,0x14, -0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x10,0x10,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1f, -0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x14,0x14,0x0e,0x0e,0x12,0x12,0x09,0x09,0x13,0x13,0x12,0x12,0x1a,0x1a,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x17,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x09,0x0c,0x0c,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x13,0x13,0x12,0x12,0x12,0x12,0x15,0x15,0x14,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1a,0x18,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x14,0x12,0x13,0x12,0x13,0x14,0x14,0x0f,0x16,0x18,0x12,0x13,0x13, -0x10,0x11,0x10,0x16,0x14,0x1c,0x09,0x09,0x13,0x10,0x08,0x10,0x1d,0x18,0x12,0x18,0x1f,0x19,0x13,0x13,0x12,0x11,0x0e,0x11,0x09,0x0b,0x11,0x0b,0x11,0x18,0x17,0x12,0x11,0x12,0x0e,0x14,0x14,0x0e,0x0d,0x11,0x11,0x0c,0x0d,0x11,0x08,0x0c,0x0f,0x09,0x28,0x24,0x21,0x1b,0x17,0x10,0x22,0x1f,0x1a,0x15,0x10,0x09,0x08,0x18,0x13,0x16, -0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x11,0x15,0x10,0x15,0x10,0x1c,0x1b,0x16,0x13,0x16,0x13,0x13,0x10,0x18,0x13,0x18,0x13,0x14,0x0e,0x08,0x28,0x24,0x21,0x16,0x13,0x20,0x16,0x18,0x12,0x15,0x10,0x15,0x10,0x10,0x11,0x10,0x11,0x09,0x08,0x09,0x08,0x18,0x13,0x18,0x13,0x12,0x0b,0x13,0x0b,0x16,0x12,0x16,0x12,0x10,0x0e, -0x17,0x12,0x17,0x13,0x12,0x12,0x0e,0x15,0x10,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x12,0x0f,0x13,0x10,0x12,0x12,0x13,0x10,0x13,0x13,0x13,0x0f,0x0f,0x13,0x13,0x11,0x14,0x0d,0x0d,0x10,0x12,0x09,0x13,0x13,0x11,0x0f,0x0f,0x12,0x12,0x12,0x08,0x09,0x0a,0x09,0x0c,0x08,0x13,0x1c,0x1c,0x1c,0x12,0x12,0x13,0x13,0x16,0x17,0x14, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0d,0x08,0x08,0x09,0x09,0x0b,0x0b,0x13,0x13,0x12,0x0f,0x17,0x0f,0x0d,0x0e,0x10,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x14,0x0f,0x12,0x11,0x12,0x08,0x10,0x0c,0x13,0x0c,0x0c,0x1d,0x1e,0x1f,0x14,0x0f,0x17,0x19,0x13,0x12,0x10,0x10,0x12,0x13,0x12,0x16,0x12,0x14,0x1a,0x12,0x16,0x13,0x13, -0x0f,0x10,0x0e,0x13,0x10,0x14,0x10,0x1d,0x1c,0x13,0x10,0x14,0x11,0x14,0x0f,0x13,0x10,0x15,0x13,0x12,0x0d,0x12,0x13,0x0f,0x08,0x18,0x0f,0x0f,0x1c,0x16,0x15,0x13,0x1d,0x17,0x15,0x10,0x1c,0x16,0x17,0x12,0x1e,0x18,0x11,0x0e,0x19,0x18,0x18,0x13,0x17,0x13,0x17,0x13,0x2a,0x24,0x1a,0x15,0x24,0x1d,0x1c,0x16,0x13,0x0e,0x10,0x0d, -0x0d,0x00,0x00,0x20,0x1e,0x12,0x10,0x12,0x13,0x12,0x10,0x11,0x0f,0x13,0x10,0x17,0x13,0x1b,0x15,0x20,0x1b,0x17,0x12,0x14,0x0f,0x11,0x0d,0x1c,0x16,0x16,0x13,0x1b,0x14,0x1b,0x14,0x09,0x1c,0x18,0x13,0x10,0x17,0x12,0x15,0x12,0x15,0x10,0x15,0x10,0x1c,0x1b,0x10,0x11,0x17,0x11,0x17,0x11,0x1c,0x18,0x11,0x0e,0x11,0x0e,0x18,0x13, -0x18,0x13,0x18,0x13,0x18,0x13,0x14,0x0f,0x12,0x0f,0x12,0x0f,0x12,0x0f,0x15,0x12,0x19,0x17,0x12,0x13,0x1b,0x1c,0x1a,0x17,0x12,0x0f,0x1d,0x19,0x20,0x1b,0x17,0x11,0x16,0x13,0x13,0x12,0x12,0x10,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x13,0x0b,0x0b,0x05,0x07,0x07,0x07,0x09,0x0d, -0x09,0x07,0x0c,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x13,0x13,0x13,0x13,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x09,0x05,0x08,0x09,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0d,0x0b,0x08,0x08,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c, -0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11, -0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00, -0x15,0x0a,0x14,0x0b,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0a,0x0a,0x0b,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x13,0x0f,0x15,0x1b,0x0f,0x0f,0x12,0x12,0x0d,0x0d,0x08,0x0a,0x10,0x0d,0x16,0x13,0x13,0x0f,0x14,0x14,0x14,0x1e,0x11,0x13,0x13,0x0f,0x0f,0x0f,0x0d, -0x11,0x12,0x17,0x12,0x0f,0x17,0x0e,0x0d,0x0d,0x11,0x0c,0x0f,0x12,0x0f,0x13,0x12,0x0c,0x10,0x0b,0x0b,0x0d,0x0a,0x0a,0x0d,0x0e,0x06,0x07,0x0b,0x09,0x11,0x0e,0x0e,0x0e,0x0c,0x0b,0x0b,0x09,0x0d,0x11,0x0a,0x0a,0x0b,0x0f,0x0b,0x0b,0x0a,0x0a,0x08,0x08,0x0b,0x05,0x0a,0x10,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x06,0x0b,0x0a,0x10,0x09, -0x0a,0x0b,0x09,0x0b,0x0d,0x0a,0x05,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x0d,0x0a,0x13,0x05,0x0b,0x11,0x1c,0x14,0x11,0x11,0x1c,0x15,0x1b,0x18,0x11,0x13,0x10,0x0e,0x24,0x0f,0x13,0x1c,0x1e,0x1e,0x14,0x15,0x14,0x0f,0x0f,0x11,0x0e,0x0e,0x10,0x06,0x00,0x00,0x00,0x00,0x13,0x14,0x14,0x14,0x0f,0x0c,0x13,0x13,0x0a,0x1c,0x12,0x13,0x0b, -0x0b,0x0f,0x0b,0x0e,0x13,0x0f,0x12,0x1d,0x15,0x0a,0x09,0x13,0x11,0x13,0x13,0x13,0x0a,0x13,0x10,0x08,0x1c,0x12,0x13,0x0b,0x0e,0x0e,0x0f,0x0f,0x0e,0x10,0x13,0x13,0x11,0x0e,0x0e,0x18,0x08,0x0f,0x08,0x12,0x0e,0x0b,0x09,0x09,0x0b,0x08,0x06,0x05,0x0b,0x0b,0x05,0x06,0x06,0x06,0x05,0x06,0x05,0x07,0x10,0x10,0x0b,0x0b,0x0b,0x0b, -0x0c,0x07,0x05,0x06,0x0b,0x0b,0x0b,0x0a,0x09,0x08,0x08,0x09,0x08,0x0b,0x00,0x00,0x00,0x00,0x07,0x0a,0x0a,0x0b,0x09,0x0a,0x11,0x11,0x11,0x11,0x0b,0x00,0x00,0x00,0x00,0x0f,0x0a,0x09,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09, -0x12,0x12,0x12,0x12,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x06,0x0c,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0b,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x19,0x14,0x17,0x12,0x18,0x14,0x1e,0x18,0x11,0x0c, -0x10,0x16,0x11,0x1a,0x16,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x1b,0x1b,0x20,0x0d,0x08,0x10,0x13,0x0d,0x10,0x10,0x13,0x13,0x10,0x20,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x15,0x10,0x10,0x10,0x0b,0x13,0x0b,0x18,0x15,0x10,0x0b,0x1b,0x10,0x1b,0x08,0x0b,0x13,0x13,0x15,0x15, -0x15,0x13,0x13,0x13,0x1b,0x08,0x13,0x08,0x10,0x0d,0x08,0x08,0x10,0x08,0x18,0x08,0x1d,0x10,0x1d,0x1d,0x13,0x13,0x13,0x10,0x10,0x0d,0x0d,0x25,0x25,0x2b,0x2b,0x1b,0x1b,0x10,0x10,0x05,0x20,0x18,0x1b,0x15,0x13,0x15,0x10,0x10,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x08,0x15,0x00,0x15,0x15,0x15,0x0b,0x10,0x10, -0x1d,0x0b,0x1d,0x0b,0x13,0x15,0x13,0x0d,0x1d,0x10,0x1d,0x10,0x18,0x1b,0x0b,0x10,0x10,0x0d,0x08,0x10,0x13,0x10,0x13,0x10,0x13,0x13,0x10,0x15,0x15,0x1d,0x0b,0x10,0x0d,0x15,0x10,0x0b,0x10,0x10,0x10,0x1d,0x0b,0x1d,0x0b,0x08,0x13,0x0c,0x20,0x10,0x10,0x15,0x15,0x20,0x10,0x00,0x00,0x00,0x15,0x00,0x15,0x15,0x15,0x15,0x18,0x15, -0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x10,0x10,0x18,0x1b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x15,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x10,0x0d,0x0d,0x0d,0x25,0x1b,0x25,0x1b,0x25, -0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x10,0x13,0x13,0x13,0x20,0x20,0x10,0x10,0x20,0x10,0x10,0x20,0x10,0x10,0x20,0x10,0x10,0x18,0x18,0x23,0x20,0x1d,0x10,0x1b,0x10,0x1b,0x10,0x1b,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x15,0x0b,0x15,0x0b,0x11,0x15,0x13,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1b,0x1d,0x18,0x1b,0x0b,0x10,0x18,0x1b,0x18,0x1b,0x00,0x00,0x00,0x00,0x00,0x24,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0d,0x00,0x00,0x13,0x00,0x00,0x00,0x25,0x1b,0x2b,0x20,0x10,0x13,0x13,0x13,0x0d,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10, -0x1d,0x1d,0x0c,0x13,0x13,0x13,0x27,0x1b,0x11,0x31,0x23,0x0b,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x0d,0x0d,0x18,0x15,0x15,0x10,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x13,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0d,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b, -0x1d,0x0b,0x13,0x13,0x13,0x13,0x15,0x13,0x10,0x10,0x0d,0x25,0x1b,0x10,0x13,0x13,0x13,0x10,0x13,0x13,0x13,0x10,0x13,0x13,0x13,0x20,0x10,0x10,0x20,0x10,0x10,0x1d,0x10,0x10,0x1d,0x10,0x10,0x1d,0x10,0x10,0x13,0x13,0x13,0x13,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x15,0x0b,0x0b,0x0d,0x0d,0x25,0x1b,0x15,0x13,0x13,0x00,0x10,0x10, -0x10,0x0c,0x12,0x16,0x14,0x10,0x11,0x0b,0x08,0x18,0x13,0x13,0x0b,0x12,0x0f,0x0f,0x0f,0x0f,0x08,0x10,0x0d,0x14,0x10,0x13,0x0f,0x11,0x0e,0x16,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0e,0x0f,0x0f,0x09,0x10,0x12,0x13,0x10,0x0b,0x18,0x13,0x14,0x11,0x14,0x10,0x12,0x10,0x0d,0x16,0x0c,0x0d,0x0d,0x0f,0x13,0x13, -0x10,0x20,0x10,0x20,0x0b,0x08,0x05,0x11,0x07,0x04,0x00,0x04,0x07,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x1e,0x0e,0x18,0x13,0x1e,0x17,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x1e,0x1c,0x0f,0x1c,0x0f,0x1c,0x15,0x16,0x16,0x16,0x18,0x1c,0x20,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, -0x1c,0x16,0x16,0x16,0x16,0x18,0x13,0x22,0x1a,0x0f,0x0f,0x09,0x09,0x09,0x0c,0x07,0x12,0x07,0x07,0x1b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x14,0x12,0x0e,0x0f,0x16,0x09,0x0b,0x16,0x16,0x09,0x12,0x11,0x12,0x16,0x16,0x09,0x0d,0x16,0x13,0x14,0x14,0x12, -0x13,0x15,0x12,0x19,0x17,0x11,0x11,0x11,0x07,0x0c,0x12,0x12,0x12,0x12,0x11,0x13,0x14,0x0f,0x16,0x11,0x12,0x16,0x12,0x17,0x12,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x12,0x0e,0x0f,0x16,0x0a,0x0b,0x16,0x0a,0x12,0x11,0x12,0x16,0x0d,0x16,0x14,0x14,0x13,0x15,0x12,0x19,0x17,0x09,0x12,0x11,0x14,0x15,0x26,0x00,0x14,0x12,0x15,0x15, -0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x18,0x15,0x15,0x17,0x12,0x15,0x18,0x18,0x0f,0x14,0x18,0x18,0x15,0x18,0x1a,0x19,0x15,0x12,0x12,0x18,0x17,0x12,0x16,0x16,0x15,0x16,0x16,0x18, -0x12,0x14,0x16,0x15,0x19,0x14,0x14,0x15,0x15,0x1a,0x10,0x13,0x13,0x1c,0x11,0x11,0x19,0x1d,0x14,0x11,0x22,0x12,0x12,0x18,0x11,0x11,0x18,0x12,0x18,0x1a,0x1c,0x11,0x19,0x11,0x15,0x11,0x14,0x12,0x14,0x11,0x13,0x19,0x11,0x14,0x15,0x11,0x11,0x13,0x1f,0x11,0x11,0x13,0x13,0x0e,0x0b,0x12,0x12,0x12,0x11,0x12,0x1c,0x12,0x1c,0x10, -0x12,0x1c,0x15,0x12,0x1c,0x18,0x18,0x1c,0x12,0x12,0x1c,0x1c,0x12,0x12,0x12,0x12,0x12,0x12,0x1c,0x1c,0x13,0x12,0x12,0x1c,0x13,0x11,0x12,0x12,0x1c,0x19,0x16,0x16,0x16,0x16,0x17,0x14,0x16,0x19,0x16,0x15,0x11,0x19,0x16,0x16,0x12,0x15,0x16,0x18,0x17,0x13,0x16,0x15,0x17,0x15,0x19,0x16,0x17,0x17,0x16,0x14,0x16,0x16,0x17,0x19, -0x15,0x18,0x17,0x03,0x04,0x05,0x06,0x05,0x09,0x0b,0x1c,0x12,0x14,0x13,0x12,0x14,0x12,0x12,0x15,0x13,0x12,0x0a,0x1b,0x13,0x12,0x12,0x11,0x13,0x10,0x13,0x09,0x13,0x11,0x12,0x0d,0x1c,0x12,0x12,0x12,0x13,0x1b,0x12,0x13,0x0d,0x1b,0x13,0x13,0x16,0x16,0x07,0x09,0x24,0x24,0x24,0x24,0x2e,0x11,0x11,0x08,0x11,0x0c,0x11,0x11,0x12, -0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x12,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x13,0x0e,0x0d,0x12,0x14,0x08,0x0a,0x10,0x0d,0x18,0x15,0x14,0x10,0x14,0x10,0x0d, -0x0e,0x13,0x10,0x1a,0x10,0x0f,0x0f,0x16,0x19,0x0d,0x14,0x10,0x13,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x15,0x14,0x14,0x14,0x14,0x14,0x13,0x13,0x13,0x13,0x0f,0x10,0x10,0x10,0x10,0x10,0x12,0x13,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x10,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x12, -0x0a,0x10,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x14,0x14,0x14,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x16,0x14,0x10,0x10,0x0d,0x11,0x0e,0x0f,0x14,0x14,0x08,0x10,0x10,0x18,0x15,0x0e,0x14,0x14,0x10,0x0f,0x0e,0x0f,0x14, -0x10,0x15,0x14,0x10,0x0e,0x14,0x08,0x14,0x0f,0x14,0x08,0x0f,0x0e,0x12,0x0d,0x10,0x0d,0x08,0x08,0x0a,0x1a,0x1a,0x14,0x10,0x10,0x13,0x10,0x10,0x10,0x0d,0x13,0x0e,0x18,0x0e,0x15,0x15,0x10,0x12,0x18,0x14,0x14,0x14,0x10,0x10,0x0e,0x10,0x14,0x10,0x14,0x12,0x1a,0x1b,0x12,0x17,0x10,0x10,0x1c,0x10,0x0d,0x13,0x13,0x14,0x1c,0x1c, -0x15,0x10,0x12,0x0d,0x12,0x12,0x12,0x16,0x11,0x11,0x16,0x13,0x13,0x0b,0x14,0x14,0x12,0x10,0x10,0x1d,0x18,0x0f,0x11,0x13,0x13,0x14,0x14,0x17,0x16,0x0b,0x1e,0x13,0x12,0x12,0x15,0x15,0x10,0x10,0x09,0x18,0x16,0x16,0x0f,0x16,0x07,0x07,0x0e,0x0e,0x07,0x07,0x14,0x0d,0x09,0x18,0x17,0x09,0x07,0x07,0x0e,0x0c,0x0c,0x07,0x07,0x07, -0x0c,0x16,0x0f,0x0a,0x13,0x16,0x13,0x13,0x10,0x18,0x12,0x13,0x0b,0x0e,0x11,0x0e,0x07,0x07,0x0c,0x11,0x0b,0x15,0x15,0x15,0x1d,0x18,0x1d,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x1b,0x0b,0x0b,0x10,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x10,0x10,0x25,0x1b,0x25,0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1d,0x1d,0x10,0x10,0x1d,0x1d,0x10,0x10,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x20,0x18,0x1b,0x10,0x13,0x13,0x15,0x0b,0x15,0x18,0x10,0x10,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1d,0x0b,0x18,0x10,0x10,0x08,0x10,0x10,0x10,0x10,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b, -0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x25,0x1b,0x25,0x1b,0x25,0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x18,0x10,0x10,0x18,0x10,0x10,0x1d,0x10,0x23,0x20,0x1d,0x10,0x1b,0x10,0x1b,0x10,0x1b,0x10,0x1d, -0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x15,0x15,0x15,0x15,0x15,0x0b,0x15,0x15,0x0b,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x10,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x0b,0x10,0x0b,0x0b,0x0b,0x0b,0x00,0x25,0x1b,0x2b,0x20,0x1d,0x10,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b, -0x13,0x13,0x10,0x10,0x0d,0x25,0x1b,0x20,0x20,0x1d,0x1d,0x1d,0x13,0x13,0x13,0x13,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x25,0x1b,0x13,0x15,0x13,0x13,0x13,0x15,0x13,0x13,0x25,0x25,0x1b,0x1b,0x0d,0x0d,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x1d,0x0b, -0x1d,0x0b,0x13,0x15,0x13,0x13,0x25,0x25,0x1b,0x1b,0x25,0x25,0x1b,0x1b,0x1b,0x1b,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x08,0x08,0x0b,0x08,0x00,0x00,0x00,0x1b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x1b,0x13,0x1b,0x13,0x1b,0x13,0x1b,0x15, -0x15,0x15,0x08,0x08,0x10,0x0d,0x13,0x14,0x12,0x11,0x12,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x12,0x11,0x13,0x14,0x14,0x15,0x13,0x12,0x15,0x10,0x15,0x18,0x14,0x18,0x1b,0x14,0x18,0x16,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x0f,0x11,0x13,0x13,0x15,0x12,0x15,0x12,0x13, -0x13,0x10,0x10,0x18,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x18,0x19,0x18,0x18,0x1e,0x1e,0x16,0x1e,0x1e,0x17,0x1c,0x1b,0x12,0x19,0x1b,0x18,0x13,0x1b,0x18,0x16,0x16,0x13,0x15,0x18,0x19,0x16,0x14,0x17,0x13,0x11,0x1e,0x1d,0x1d,0x1a,0x1e,0x1e,0x16,0x1e,0x1e,0x17,0x19,0x19,0x18,0x17,0x17,0x15,0x1c,0x18,0x1a,0x17,0x17,0x13,0x18, -0x16,0x16,0x1b,0x18,0x17,0x1d,0x11,0x10,0x12,0x11,0x14,0x14,0x16,0x17,0x13,0x12,0x12,0x11,0x12,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x10,0x11,0x13,0x14,0x13,0x13,0x0f,0x12,0x12,0x13,0x13,0x18,0x1b,0x15,0x15,0x14,0x19,0x14,0x16,0x10,0x0f,0x13,0x12,0x0f,0x10,0x12,0x12,0x0f,0x0f,0x14,0x0f,0x11,0x10,0x12,0x19,0x12,0x1a, -0x11,0x12,0x12,0x18,0x0a,0x19,0x16,0x17,0x15,0x12,0x18,0x13,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0f,0x0e,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x14,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x1d,0x1d,0x1d,0x1d,0x10, -0x18,0x17,0x10,0x0d,0x10,0x11,0x12,0x10,0x1b,0x1a,0x1c,0x0e,0x20,0x10,0x1b,0x1b,0x1b,0x1a,0x12,0x10,0x10,0x19,0x13,0x19,0x16,0x11,0x0f,0x0d,0x21,0x0d,0x11,0x10,0x10,0x10,0x10,0x10,0x2c,0x1b,0x1b,0x0e,0x08,0x0f,0x08,0x0f,0x08,0x08,0x08,0x0f,0x13,0x13,0x11,0x0c,0x0c,0x07,0x07,0x07,0x0c,0x07,0x0d,0x1c,0x07,0x1d,0x1d,0x1d, -0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x15,0x25,0x25,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0f,0x13,0x0f,0x11,0x0e,0x0b,0x0b,0x16,0x12,0x17,0x0e,0x24,0x1d, -0x13,0x12,0x1d,0x19,0x1b,0x18,0x21,0x1a,0x1e,0x19,0x15,0x0f,0x17,0x13,0x1e,0x17,0x18,0x13,0x18,0x13,0x1c,0x15,0x1c,0x15,0x23,0x1b,0x18,0x13,0x18,0x13,0x27,0x1c,0x19,0x00,0x20,0x20,0x20,0x0f,0x00,0x00,0x13,0x10,0x16,0x12,0x11,0x0e,0x22,0x1d,0x1e,0x1c,0x17,0x13,0x16,0x13,0x11,0x0d,0x18,0x13,0x11,0x0d,0x1a,0x15,0x15,0x12, -0x1f,0x1a,0x11,0x12,0x17,0x17,0x1a,0x0e,0x06,0x0f,0x16,0x0e,0x20,0x20,0x08,0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0d,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13,0x13, -0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0f,0x16,0x17,0x09,0x07,0x09,0x07,0x17,0x12,0x18,0x14,0x12,0x0f,0x11,0x0f,0x13,0x12,0x0d,0x0d,0x24,0x1a,0x25,0x1c,0x20,0x1b,0x1d,0x15,0x1d,0x15,0x1d, -0x15,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x11,0x0a,0x0f,0x08,0x18,0x13,0x1b,0x16,0x2b,0x20,0x12,0x13,0x16,0x17,0x1a,0x1c,0x18,0x13,0x1f,0x19,0x11,0x0d,0x12,0x10,0x14,0x0f,0x1e,0x17,0x14,0x11,0x12,0x13,0x12,0x13,0x0f,0x0d,0x0f,0x0c,0x0f,0x0c,0x11,0x11,0x0a,0x16,0x0a,0x1f,0x15,0x0b,0x13,0x14,0x0f,0x18,0x12,0x0c,0x0b, -0x13,0x13,0x12,0x0f,0x08,0x18,0x13,0x0c,0x0b,0x14,0x0f,0x17,0x0c,0x19,0x13,0x14,0x0f,0x16,0x13,0x13,0x10,0x18,0x12,0x13,0x0b,0x11,0x0e,0x18,0x0e,0x11,0x1c,0x10,0x12,0x1d,0x09,0x25,0x1d,0x1d,0x26,0x1c,0x1d,0x1d,0x1c,0x1c,0x1e,0x11,0x0f,0x14,0x16,0x1d,0x16,0x1e,0x08,0x0f,0x13,0x1c,0x21,0x16,0x21,0x14,0x14,0x19,0x16,0x24, -0x1e,0x11,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x20,0x10,0x10,0x20,0x18,0x10,0x10,0x18,0x15,0x0b,0x0b,0x15,0x13,0x13,0x13,0x13,0x18,0x0b,0x0b,0x1b,0x18,0x0b,0x0b,0x1b,0x0d,0x0d,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x10,0x0d,0x12,0x11,0x18,0x13,0x13,0x1c,0x15,0x18,0x18,0x1b,0x1a,0x13,0x10,0x20,0x1a,0x21,0x1b,0x16,0x13,0x0a,0x0a,0x13,0x15,0x0d,0x13,0x11,0x13,0x0f,0x18,0x1a,0x0d,0x13,0x0e,0x07,0x0c,0x11,0x12,0x07,0x07,0x06,0x07,0x0c,0x0c,0x0c,0x0e,0x30,0x40,0x0b,0x0d,0x04,0x09,0x0c,0x0e,0x0a, -0x10,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x2b,0x11,0x18,0x1d,0x1d,0x15,0x0f,0x12,0x17,0x18,0x10,0x0a,0x15,0x11,0x16,0x12,0x15,0x11,0x11,0x18,0x13,0x13,0x11,0x18,0x14,0x1b,0x0f,0x11,0x14,0x0a,0x13,0x0b,0x0b,0x08,0x1c,0x13,0x12,0x11,0x11,0x13,0x1e,0x1e,0x1e,0x20,0x20,0x12,0x10, -0x09,0x10,0x0f,0x13,0x0f,0x15,0x08,0x12,0x13,0x1c,0x1c,0x14,0x11,0x12,0x11,0x11,0x0f,0x11,0x0f,0x0f,0x0a,0x0b,0x08,0x07,0x0c,0x13,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x00,0x09,0x09,0x09,0x08,0x08,0x36,0x20,0x1c,0x22,0x09,0x09,0x0a,0x0d,0x08,0x09,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x09,0x09,0x09,0x00,0x1d,0x0b,0x0b,0x1d,0x08,0x10,0x10,0x2b,0x20,0x20,0x2b,0x1d,0x10,0x10,0x1d,0x10,0x10,0x0d,0x0d,0x00,0x00,0x0b,0x18,0x13,0x17,0x12,0x28,0x21,0x16,0x12,0x16,0x12,0x2b,0x20,0x18,0x13,0x0c,0x0a,0x14,0x00,0x16,0x11,0x0b,0x0a,0x05,0x10,0x0b,0x0b,0x08,0x06,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x07,0x11,0x0e,0x13,0x12,0x12,0x1f,0x1a,0x1a,0x19,0x1a,0x1e,0x14,0x16,0x13,0x0d,0x1e,0x24,0x0e,0x25,0x10,0x1b,0x1d,0x1d,0x1d,0x0d,0x18,0x20,0x18,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x13,0x13,0x13,0x1b,0x10,0x10,0x1d,0x0b,0x0b,0x1d,0x0b,0x0b,0x1d,0x10,0x10,0x00,0x0d, -0x1b,0x0b,0x0b,0x20,0x10,0x10,0x18,0x10,0x10,0x15,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x30,0x30,0x1c,0x00,0x00,0x1c,0x1c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x14,0x15,0x15,0x1c,0x15,0x14,0x1a,0x1f,0x15,0x14,0x22,0x14,0x14,0x1e,0x14, -0x16,0x19,0x14,0x19,0x1b,0x1d,0x14,0x19,0x15,0x16,0x14,0x16,0x14,0x15,0x16,0x14,0x19,0x13,0x15,0x19,0x14,0x14,0x12,0x19,0x15,0x15,0x15,0x16,0x0e,0x11,0x15,0x19,0x19,0x11,0x00,0x00,0x21,0x42,0x15,0x00,0x03,0x09,0x09,0x0d,0x14,0x12,0x1b,0x1a,0x08,0x0a,0x0a,0x0e,0x17,0x07,0x0d,0x07,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x07,0x07,0x17,0x17,0x17,0x0f,0x20,0x15,0x13,0x14,0x17,0x11,0x10,0x17,0x17,0x09,0x0c,0x13,0x10,0x1e,0x19,0x19,0x12,0x19,0x14,0x12,0x11,0x17,0x15,0x1f,0x13,0x12,0x13,0x0a,0x0d,0x0a,0x17,0x0e,0x09,0x11,0x13,0x0f,0x13,0x11,0x0a,0x13,0x13,0x08,0x08,0x10,0x08,0x1c,0x13,0x13,0x13,0x13,0x0b,0x0e,0x0b,0x13,0x10, -0x18,0x0f,0x10,0x0f,0x0a,0x08,0x0a,0x17,0x15,0x15,0x14,0x11,0x19,0x19,0x17,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0c,0x0c,0x12,0x12,0x0f,0x0d,0x0f,0x12,0x0d,0x1d,0x1d,0x1a,0x09,0x0e,0x17,0x1c,0x19,0x1b,0x17,0x17,0x17,0x12,0x13,0x12, -0x14,0x19,0x12,0x0d,0x0e,0x19,0x1b,0x13,0x0f,0x09,0x09,0x17,0x15,0x12,0x17,0x15,0x11,0x11,0x18,0x15,0x15,0x19,0x1f,0x1f,0x11,0x21,0x0c,0x0c,0x08,0x08,0x17,0x13,0x10,0x12,0x06,0x12,0x0a,0x0a,0x12,0x12,0x0c,0x07,0x08,0x0c,0x28,0x15,0x11,0x15,0x11,0x11,0x09,0x09,0x09,0x09,0x19,0x19,0x19,0x17,0x17,0x17,0x08,0x0c,0x0b,0x0a, -0x0a,0x07,0x09,0x07,0x0b,0x06,0x0c,0x10,0x09,0x12,0x0e,0x13,0x0f,0x08,0x17,0x12,0x12,0x10,0x12,0x13,0x17,0x17,0x0c,0x0c,0x0c,0x1f,0x1e,0x1f,0x10,0x17,0x13,0x09,0x12,0x0e,0x14,0x0f,0x14,0x0f,0x13,0x0e,0x07,0x15,0x11,0x15,0x11,0x17,0x16,0x17,0x11,0x11,0x11,0x11,0x10,0x08,0x10,0x0a,0x10,0x0a,0x19,0x13,0x19,0x13,0x19,0x13, -0x14,0x0b,0x14,0x0b,0x12,0x0e,0x11,0x0b,0x11,0x0f,0x17,0x13,0x17,0x13,0x13,0x0f,0x13,0x0f,0x10,0x19,0x19,0x14,0x13,0x0e,0x13,0x10,0x17,0x0e,0x10,0x0d,0x25,0x15,0x10,0x14,0x08,0x0c,0x1b,0x0b,0x14,0x0c,0x0c,0x14,0x0c,0x15,0x11,0x14,0x0f,0x14,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17, -0x13,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x0c,0x08,0x13,0x10,0x10,0x10,0x08,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x14,0x0b,0x12,0x0e,0x11,0x0b,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x1f,0x18,0x12,0x10,0x08,0x15,0x11,0x1c,0x1b,0x19,0x13,0x07,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x12,0x10,0x08,0x0e,0x12,0x14,0x1e,0x1e, -0x1f,0x1d,0x0d,0x0d,0x07,0x09,0x09,0x15,0x13,0x1a,0x0c,0x1a,0x16,0x1b,0x09,0x15,0x13,0x11,0x13,0x17,0x09,0x13,0x15,0x1e,0x19,0x11,0x19,0x18,0x12,0x11,0x11,0x12,0x13,0x1a,0x19,0x09,0x12,0x14,0x0e,0x13,0x09,0x12,0x12,0x11,0x0f,0x13,0x13,0x09,0x11,0x10,0x13,0x11,0x0f,0x13,0x13,0x0f,0x12,0x12,0x19,0x1b,0x09,0x12,0x13,0x12, -0x1b,0x11,0x17,0x10,0x14,0x12,0x09,0x20,0x20,0x18,0x13,0x13,0x17,0x15,0x13,0x13,0x10,0x17,0x11,0x1d,0x12,0x19,0x19,0x13,0x16,0x1e,0x17,0x19,0x18,0x12,0x14,0x11,0x13,0x18,0x13,0x19,0x16,0x1f,0x20,0x17,0x1a,0x13,0x14,0x22,0x14,0x11,0x13,0x11,0x0d,0x12,0x11,0x19,0x0f,0x13,0x13,0x10,0x11,0x17,0x13,0x13,0x13,0x13,0x0f,0x0e, -0x10,0x17,0x0f,0x14,0x13,0x1a,0x1b,0x14,0x17,0x11,0x0f,0x1b,0x11,0x11,0x13,0x0d,0x0f,0x0e,0x08,0x1a,0x1b,0x13,0x10,0x10,0x13,0x0f,0x0d,0x21,0x25,0x15,0x0c,0x0c,0x0c,0x0c,0x08,0x12,0x0e,0x12,0x19,0x14,0x17,0x13,0x0a,0x0b,0x09,0x09,0x10,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x0a,0x10,0x0a,0x0a,0x0a,0x10,0x10,0x15,0x11,0x15, -0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x08,0x09,0x08,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x14,0x19,0x14,0x19,0x14,0x19,0x14,0x19, -0x14,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x12,0x10,0x12,0x10,0x12,0x10,0x11,0x0b,0x11,0x11,0x19,0x13,0x09,0x0c,0x08,0x08,0x11,0x0e,0x1e,0x1a,0x14,0x12,0x13,0x10,0x19,0x14,0x12,0x10,0x12,0x10,0x15,0x10,0x16,0x13,0x16,0x13,0x18,0x11,0x19,0x13,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x10,0x10,0x10, -0x10,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x11,0x11,0x15,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x0f,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x0a,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x09,0x08,0x09,0x08,0x13,0x10,0x13,0x10,0x13,0x10,0x10, -0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x1e,0x1c,0x1e,0x1c,0x1e,0x1c,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x12,0x13,0x12,0x13,0x14,0x0b,0x14,0x0b,0x14,0x0b,0x14,0x0b,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x17,0x13,0x17,0x13,0x17, -0x13,0x17,0x13,0x17,0x13,0x15,0x10,0x15,0x10,0x1f,0x18,0x1f,0x18,0x13,0x0f,0x13,0x0f,0x12,0x10,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0b,0x18,0x10,0x11,0x08,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13, -0x13,0x13,0x13,0x1a,0x1a,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x10,0x10,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20, -0x20,0x20,0x20,0x14,0x14,0x0e,0x0e,0x13,0x13,0x09,0x09,0x13,0x13,0x12,0x12,0x1b,0x1b,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20, -0x20,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x17,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x13,0x13,0x12,0x12,0x12,0x12,0x16,0x16,0x15,0x13,0x13,0x13,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1c,0x1b,0x19,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x14,0x13,0x13,0x13,0x13,0x14,0x14,0x0f,0x17,0x18,0x13,0x13,0x14,0x11,0x12,0x10,0x17,0x15,0x1d,0x0a,0x09,0x13,0x10,0x08,0x10,0x1d,0x19,0x13,0x19,0x20,0x1a,0x14,0x13,0x13,0x12,0x0e,0x11,0x0a,0x0b,0x11,0x0b, -0x11,0x19,0x18,0x13,0x11,0x13,0x0f,0x14,0x14,0x0f,0x0e,0x12,0x12,0x0d,0x0d,0x12,0x08,0x0d,0x0f,0x09,0x29,0x26,0x22,0x1c,0x18,0x11,0x23,0x20,0x1b,0x15,0x11,0x09,0x08,0x19,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x11,0x15,0x11,0x15,0x11,0x1c,0x1b,0x17,0x13,0x17,0x13,0x13,0x10,0x19,0x13,0x19,0x13,0x14,0x0f, -0x08,0x29,0x26,0x22,0x17,0x13,0x21,0x17,0x19,0x13,0x15,0x11,0x15,0x11,0x11,0x11,0x11,0x11,0x09,0x08,0x09,0x08,0x19,0x13,0x19,0x13,0x13,0x0b,0x14,0x0b,0x17,0x13,0x17,0x13,0x11,0x0e,0x17,0x13,0x18,0x13,0x13,0x13,0x0f,0x15,0x11,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x12,0x10,0x13,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13, -0x0f,0x0f,0x13,0x13,0x11,0x14,0x0e,0x0e,0x11,0x12,0x09,0x13,0x13,0x11,0x10,0x0f,0x13,0x13,0x13,0x09,0x09,0x0b,0x09,0x0c,0x08,0x14,0x1c,0x1c,0x1c,0x12,0x12,0x13,0x13,0x17,0x18,0x15,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0d,0x08,0x09,0x0a,0x09,0x0b,0x0b,0x14,0x14,0x12,0x10,0x18,0x10,0x0e,0x0f,0x11,0x0f,0x0f,0x0c, -0x0c,0x0c,0x0f,0x14,0x10,0x12,0x11,0x13,0x08,0x10,0x0d,0x13,0x0c,0x0c,0x1e,0x1f,0x20,0x14,0x10,0x18,0x1a,0x13,0x13,0x10,0x10,0x12,0x14,0x13,0x16,0x13,0x15,0x1a,0x13,0x17,0x13,0x13,0x0f,0x10,0x0f,0x14,0x11,0x14,0x10,0x1d,0x1c,0x14,0x11,0x15,0x12,0x14,0x0f,0x14,0x10,0x16,0x13,0x13,0x0d,0x13,0x13,0x0f,0x08,0x19,0x0f,0x0f, -0x1c,0x16,0x15,0x13,0x1e,0x18,0x16,0x10,0x1d,0x17,0x18,0x13,0x1f,0x19,0x12,0x0f,0x1a,0x19,0x19,0x13,0x18,0x13,0x18,0x13,0x2b,0x25,0x1b,0x15,0x25,0x1e,0x1c,0x16,0x13,0x0e,0x11,0x0d,0x0e,0x00,0x00,0x21,0x1f,0x13,0x11,0x13,0x13,0x13,0x11,0x12,0x0f,0x13,0x10,0x17,0x13,0x1c,0x16,0x21,0x1c,0x18,0x12,0x14,0x0f,0x11,0x0e,0x1d, -0x17,0x17,0x13,0x1c,0x15,0x1c,0x15,0x09,0x1d,0x19,0x13,0x11,0x17,0x13,0x16,0x13,0x15,0x11,0x15,0x11,0x1c,0x1b,0x11,0x11,0x18,0x11,0x18,0x11,0x1d,0x19,0x12,0x0f,0x11,0x0f,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x16,0x13,0x1a,0x17,0x13,0x13,0x1c,0x1c,0x1b,0x18,0x12,0x10,0x1e,0x1a, -0x21,0x1c,0x18,0x12,0x16,0x14,0x13,0x13,0x13,0x11,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x13,0x0b,0x0b,0x05,0x07,0x07,0x07,0x09,0x0d,0x09,0x08,0x0c,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x13,0x13,0x13,0x13,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b, -0x0a,0x0b,0x0b,0x0a,0x05,0x08,0x09,0x07,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x0b,0x08,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d, -0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x15,0x0a,0x15,0x0b,0x14,0x14,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x13,0x0f,0x16,0x1b,0x10,0x0f,0x12,0x12,0x0e,0x0e,0x08,0x0a,0x10,0x0d,0x17,0x13,0x13,0x10,0x14,0x14,0x14,0x1f,0x12,0x14,0x14,0x0f,0x0f,0x0f,0x0e,0x12,0x13,0x18,0x13,0x10,0x18,0x0f,0x0e,0x0e,0x11,0x0d,0x0f,0x13,0x0f,0x14,0x13,0x0c,0x10,0x0b,0x0c,0x0e,0x0a,0x0a,0x0e,0x0e,0x06,0x08,0x0c, -0x09,0x11,0x0e,0x0e,0x0e,0x0d,0x0b,0x0b,0x0a,0x0e,0x11,0x0a,0x0a,0x0b,0x10,0x0b,0x0b,0x0a,0x0a,0x09,0x09,0x0b,0x05,0x0a,0x10,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x07,0x0b,0x0b,0x10,0x09,0x0b,0x0b,0x0a,0x0b,0x0d,0x0a,0x05,0x07,0x0b,0x09,0x0b,0x0a,0x0b,0x0d,0x0a,0x13,0x05,0x0b,0x12,0x1d,0x15,0x12,0x12,0x1c,0x15,0x1c,0x19,0x11, -0x13,0x11,0x0f,0x25,0x0f,0x13,0x1d,0x1f,0x1f,0x15,0x15,0x14,0x0f,0x10,0x11,0x0e,0x0f,0x11,0x07,0x00,0x00,0x00,0x00,0x13,0x14,0x14,0x14,0x10,0x0d,0x13,0x13,0x0a,0x1c,0x13,0x13,0x0b,0x0b,0x0f,0x0b,0x0f,0x13,0x0f,0x13,0x1e,0x15,0x0b,0x09,0x13,0x12,0x14,0x13,0x13,0x0a,0x13,0x10,0x08,0x1c,0x13,0x13,0x0b,0x0e,0x0e,0x10,0x0f, -0x0f,0x11,0x13,0x13,0x11,0x0e,0x0f,0x18,0x08,0x0f,0x08,0x13,0x0f,0x0b,0x09,0x09,0x0b,0x09,0x06,0x05,0x0b,0x0b,0x05,0x06,0x06,0x06,0x05,0x06,0x05,0x07,0x10,0x10,0x0b,0x0b,0x0c,0x0b,0x0c,0x08,0x05,0x07,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0a,0x09,0x0b,0x00,0x00,0x00,0x00,0x07,0x0a,0x0a,0x0b,0x09,0x0a,0x12,0x12,0x12,0x12, -0x0b,0x00,0x00,0x00,0x00,0x0f,0x0a,0x09,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x06,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x1a,0x15,0x17,0x13,0x19,0x15,0x1f,0x19,0x12,0x0c,0x11,0x17,0x12,0x1b,0x17,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x1c,0x1c,0x21,0x0e,0x08,0x11, -0x13,0x0e,0x11,0x11,0x13,0x13,0x11,0x21,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x15,0x11,0x11,0x11,0x0b,0x13,0x0b,0x19,0x16,0x11,0x0b,0x1c,0x11,0x1c,0x08,0x0b,0x13,0x13,0x15,0x15,0x15,0x13,0x13,0x13,0x1c,0x08,0x13,0x08,0x11,0x0e,0x08,0x08,0x11,0x08,0x19,0x08,0x1e,0x11,0x1e,0x1e,0x13,0x13,0x13,0x11,0x11,0x0e,0x0e,0x27, -0x27,0x2c,0x2c,0x1c,0x1c,0x11,0x11,0x06,0x21,0x19,0x1c,0x16,0x13,0x16,0x11,0x11,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x08,0x15,0x00,0x15,0x15,0x15,0x0b,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x13,0x16,0x13,0x0e,0x1e,0x11,0x1e,0x11,0x19,0x1c,0x0b,0x11,0x11,0x0e,0x08,0x11,0x13,0x11,0x13,0x11,0x13,0x13,0x11,0x16, -0x15,0x1e,0x0b,0x11,0x0e,0x16,0x11,0x0b,0x11,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x08,0x13,0x0d,0x21,0x11,0x11,0x15,0x15,0x21,0x11,0x00,0x00,0x00,0x15,0x00,0x15,0x15,0x15,0x15,0x19,0x15,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0e,0x0e,0x11,0x11,0x19,0x1c,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13, -0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x11,0x0e,0x0e,0x0e,0x27,0x1c,0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x11,0x13,0x13,0x13,0x21,0x21,0x11,0x11,0x21,0x11,0x11,0x21,0x11,0x11,0x21,0x11,0x11,0x19,0x19,0x24,0x21,0x1e, -0x11,0x1c,0x11,0x1c,0x11,0x1c,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x16,0x0b,0x16,0x0b,0x12,0x16,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1c,0x1e,0x19,0x1c,0x0b,0x11,0x19,0x1c,0x19,0x1c,0x00,0x00,0x00,0x00,0x00,0x25,0x24,0x00,0x00,0x00,0x00, -0x00,0x00,0x08,0x0e,0x00,0x00,0x14,0x00,0x00,0x00,0x27,0x1c,0x2c,0x21,0x11,0x13,0x13,0x13,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x1e,0x1e,0x0c,0x13,0x13,0x14,0x28,0x1b,0x12,0x32,0x24,0x0b,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x0e,0x19,0x16, -0x16,0x11,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x29,0x32,0x00,0x00,0x00,0x00,0x00,0x13,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x0e,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x16,0x13,0x11,0x11,0x0e,0x27,0x1c,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x21,0x11,0x11, -0x21,0x11,0x11,0x1e,0x11,0x11,0x1e,0x11,0x11,0x1e,0x11,0x11,0x13,0x13,0x13,0x13,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x16,0x0b,0x0b,0x0e,0x0e,0x27,0x1c,0x15,0x13,0x13,0x00,0x11,0x11,0x11,0x0c,0x13,0x17,0x15,0x11,0x11,0x0c,0x08,0x19,0x13,0x14,0x0b,0x12,0x10,0x10,0x0f,0x10,0x08,0x11,0x0e,0x14,0x10,0x13,0x0f,0x12,0x0e,0x16, -0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0f,0x10,0x10,0x09,0x11,0x12,0x14,0x11,0x0b,0x19,0x13,0x15,0x12,0x14,0x10,0x13,0x11,0x0d,0x17,0x0c,0x0e,0x0e,0x10,0x14,0x14,0x11,0x21,0x11,0x21,0x0b,0x08,0x06,0x12,0x07,0x04,0x00,0x05,0x07,0x00,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11, -0x11,0x1f,0x0e,0x19,0x13,0x1f,0x18,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x1e,0x1c,0x10,0x1c,0x10,0x1c,0x15,0x17,0x17,0x17,0x19,0x1c,0x21,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x17,0x17,0x17,0x17,0x18,0x13,0x23,0x1b,0x10,0x10,0x09,0x09,0x09,0x0c,0x07,0x13,0x08,0x08,0x1c,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x15,0x13,0x0e,0x10,0x16,0x09,0x0b,0x16,0x16,0x09,0x12,0x12,0x12,0x17,0x16,0x09,0x0d,0x16,0x14,0x14,0x15,0x13,0x13,0x16,0x12,0x1a,0x18,0x11,0x11,0x11,0x08,0x0c,0x12,0x12,0x12,0x12,0x12,0x14,0x15,0x10,0x16,0x12,0x12,0x17,0x12,0x18,0x12,0x1a,0x1a,0x1a, -0x1a,0x15,0x15,0x15,0x13,0x0e,0x10,0x16,0x0a,0x0c,0x16,0x0a,0x12,0x12,0x12,0x16,0x0d,0x16,0x14,0x15,0x13,0x16,0x12,0x1a,0x18,0x09,0x13,0x12,0x15,0x16,0x28,0x00,0x15,0x12,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x19,0x15,0x16,0x17,0x12,0x16,0x19,0x19,0x10,0x15,0x19,0x18,0x16,0x19,0x1b,0x1a,0x16,0x12,0x12,0x19,0x17,0x13,0x17,0x16,0x16,0x16,0x17,0x18,0x13,0x15,0x16,0x16,0x1a,0x15,0x14,0x15,0x16,0x1b,0x10,0x13,0x13,0x1d,0x12,0x12,0x19,0x1d,0x14,0x12,0x23,0x13,0x13,0x19,0x12,0x12,0x19,0x13, -0x19,0x1b,0x1d,0x12,0x19,0x12,0x16,0x12,0x14,0x13,0x15,0x12,0x14,0x19,0x12,0x14,0x16,0x12,0x12,0x14,0x20,0x12,0x12,0x13,0x13,0x0e,0x0b,0x12,0x12,0x12,0x12,0x12,0x1d,0x12,0x1d,0x10,0x12,0x1d,0x16,0x12,0x1d,0x19,0x19,0x1d,0x13,0x12,0x1d,0x1d,0x12,0x12,0x12,0x12,0x12,0x12,0x1d,0x1d,0x13,0x12,0x13,0x1d,0x14,0x12,0x12,0x12, -0x1d,0x1a,0x17,0x17,0x17,0x17,0x17,0x15,0x17,0x1a,0x17,0x15,0x12,0x1a,0x16,0x17,0x13,0x16,0x17,0x19,0x18,0x13,0x17,0x16,0x18,0x16,0x1a,0x17,0x18,0x18,0x17,0x15,0x17,0x16,0x18,0x1a,0x16,0x19,0x18,0x03,0x04,0x05,0x06,0x05,0x09,0x0c,0x1c,0x13,0x14,0x14,0x13,0x14,0x13,0x13,0x15,0x14,0x13,0x0a,0x1c,0x13,0x13,0x13,0x12,0x14, -0x11,0x13,0x09,0x13,0x11,0x13,0x0e,0x1c,0x12,0x13,0x13,0x14,0x1b,0x13,0x13,0x0d,0x1b,0x13,0x13,0x17,0x16,0x07,0x09,0x25,0x25,0x25,0x25,0x2f,0x12,0x12,0x08,0x12,0x0d,0x12,0x12,0x13,0x12,0x12,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x13,0x12,0x12,0x11,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x10,0x11,0x13,0x0e,0x0e,0x13,0x14,0x08,0x0a,0x10,0x0e,0x19,0x15,0x14,0x10,0x14,0x10,0x0e,0x0f,0x14,0x11,0x1a,0x11,0x0f,0x10,0x17,0x1a,0x0e,0x15,0x10,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08, -0x08,0x15,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x11,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x11,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x13,0x0a,0x10,0x0e,0x0e,0x0e,0x0e,0x15,0x15,0x15,0x16,0x14,0x14,0x14,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x14,0x14,0x14,0x14, -0x14,0x14,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x11,0x17,0x15,0x11,0x10,0x0d,0x12,0x0e,0x10,0x14,0x14,0x08,0x10,0x11,0x19,0x15,0x0f,0x14,0x14,0x10,0x0f,0x0f,0x0f,0x15,0x11,0x16,0x15,0x11,0x0e,0x14,0x08,0x14,0x0f,0x15,0x08,0x0f,0x0e,0x13,0x0d,0x11,0x0e,0x08,0x08,0x0a,0x1b,0x1b,0x14,0x10,0x10,0x14,0x11,0x10, -0x10,0x0d,0x13,0x0e,0x18,0x0f,0x15,0x15,0x10,0x13,0x19,0x14,0x14,0x14,0x10,0x11,0x0f,0x10,0x15,0x11,0x15,0x12,0x1b,0x1b,0x13,0x17,0x10,0x11,0x1c,0x10,0x0d,0x13,0x13,0x15,0x1d,0x1d,0x16,0x11,0x13,0x0e,0x13,0x12,0x12,0x17,0x11,0x11,0x17,0x13,0x13,0x0c,0x14,0x14,0x13,0x10,0x10,0x1e,0x19,0x10,0x12,0x14,0x14,0x15,0x15,0x17, -0x17,0x0c,0x1f,0x13,0x12,0x13,0x15,0x15,0x11,0x11,0x09,0x19,0x17,0x17,0x10,0x17,0x07,0x07,0x0e,0x0e,0x07,0x07,0x14,0x0d,0x09,0x19,0x17,0x09,0x07,0x07,0x0f,0x0c,0x0c,0x08,0x08,0x08,0x0c,0x16,0x10,0x0a,0x14,0x17,0x13,0x13,0x10,0x19,0x13,0x14,0x0b,0x0f,0x12,0x0e,0x07,0x08,0x0d,0x11,0x0b,0x16,0x16,0x16,0x1e,0x19,0x1e,0x08, -0x00,0x00,0x00,0x00,0x00,0x08,0x19,0x1c,0x0b,0x0b,0x11,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x11,0x11,0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x11,0x11,0x1e,0x1e,0x11,0x11,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x21,0x19,0x1c,0x11,0x13,0x13,0x16, -0x0b,0x16,0x19,0x11,0x11,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1e,0x0b,0x19,0x11,0x11,0x08,0x11,0x11,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x27,0x1c, -0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x1c,0x1c,0x21,0x21,0x21,0x21,0x21,0x21,0x19,0x11,0x11,0x19,0x11,0x11,0x1e,0x11,0x24,0x21,0x1e,0x11,0x1c,0x11,0x1c,0x11,0x1c,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x16,0x16,0x16,0x16,0x16,0x0b,0x16,0x16,0x0b,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x11,0x13, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x0b,0x11,0x0b,0x0b,0x0b,0x0b,0x00,0x27,0x1c,0x2c,0x21,0x1e,0x11,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x11,0x11,0x0e,0x27,0x1c,0x21,0x21,0x1e,0x1e,0x1e,0x13,0x13,0x13,0x13,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x27,0x1c,0x13,0x16,0x13,0x13, -0x13,0x16,0x13,0x13,0x27,0x27,0x1c,0x1c,0x0e,0x0e,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x13,0x13,0x13,0x13,0x1e,0x0b,0x1e,0x0b,0x13,0x16,0x13,0x13,0x27,0x27,0x1c,0x1c,0x27,0x27,0x1c,0x1c,0x1c,0x1c,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, -0x08,0x08,0x0b,0x08,0x00,0x00,0x00,0x1c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0e,0x0e, -0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x1c,0x13,0x1c,0x13,0x1c,0x13,0x1c,0x16,0x16,0x16,0x08,0x08,0x11,0x0e,0x13,0x15,0x13,0x12,0x12,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x0f,0x12,0x11, -0x13,0x14,0x14,0x16,0x13,0x13,0x15,0x11,0x16,0x19,0x15,0x19,0x1b,0x15,0x19,0x17,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x0f,0x12,0x14,0x14,0x16,0x13,0x15,0x13,0x14,0x14,0x11,0x11,0x19,0x16,0x17,0x16,0x16,0x14,0x13,0x13,0x18,0x19,0x19,0x19,0x1e,0x1e,0x17,0x1e,0x1e,0x18,0x1d,0x1c,0x12,0x19,0x1c,0x19,0x14, -0x1c,0x18,0x17,0x17,0x14,0x15,0x19,0x1a,0x17,0x14,0x17,0x13,0x12,0x1e,0x1e,0x1e,0x1b,0x1e,0x1e,0x17,0x1e,0x1e,0x17,0x19,0x1a,0x19,0x18,0x18,0x15,0x1d,0x19,0x1b,0x18,0x18,0x13,0x18,0x17,0x17,0x1c,0x19,0x18,0x1e,0x12,0x11,0x12,0x12,0x14,0x15,0x17,0x18,0x13,0x13,0x13,0x12,0x13,0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x11, -0x11,0x13,0x14,0x14,0x14,0x0f,0x13,0x13,0x13,0x14,0x19,0x1c,0x16,0x16,0x15,0x19,0x15,0x17,0x11,0x10,0x13,0x13,0x10,0x10,0x12,0x12,0x10,0x0f,0x15,0x0f,0x12,0x10,0x12,0x1a,0x13,0x1b,0x12,0x13,0x13,0x19,0x0a,0x1a,0x17,0x18,0x16,0x13,0x19,0x14,0x1a,0x14,0x14,0x14,0x14,0x14,0x14,0x13,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09, -0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x15,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x1e,0x1e,0x1e,0x1e,0x10,0x18,0x18,0x10,0x0d,0x10,0x11,0x12,0x10,0x1c,0x1b,0x1c,0x0f,0x21,0x10,0x1c,0x1c,0x1c,0x1b,0x13,0x10,0x10,0x1a,0x13,0x1a,0x16,0x12,0x0f,0x0d, -0x22,0x0e,0x12,0x10,0x10,0x10,0x10,0x10,0x2d,0x1c,0x1c,0x0e,0x08,0x0f,0x08,0x0f,0x08,0x08,0x08,0x10,0x13,0x13,0x12,0x0c,0x0c,0x08,0x08,0x08,0x0c,0x08,0x0e,0x1c,0x07,0x1e,0x1e,0x1e,0x13,0x13,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x27,0x27,0x16,0x27,0x27,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0f,0x13,0x0f,0x12,0x0e,0x0c,0x0b,0x17,0x12,0x18,0x0e,0x25,0x1d,0x14,0x12,0x1e,0x1a,0x1c,0x19,0x22,0x1b,0x1f,0x1a,0x15,0x10,0x18,0x13,0x1f,0x18,0x19,0x14,0x19,0x14,0x1c,0x16,0x1d,0x16,0x24,0x1c,0x19,0x13, -0x19,0x13,0x28,0x1d,0x1a,0x00,0x21,0x21,0x21,0x10,0x00,0x00,0x13,0x11,0x17,0x12,0x12,0x0e,0x24,0x1e,0x1f,0x1c,0x18,0x13,0x17,0x13,0x11,0x0e,0x18,0x14,0x11,0x0e,0x1b,0x16,0x16,0x13,0x20,0x1b,0x12,0x13,0x18,0x18,0x1b,0x0f,0x07,0x0f,0x17,0x0e,0x21,0x21,0x08,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d, -0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x00, -0x00,0x00,0x00,0x00,0x00,0x0e,0x10,0x16,0x18,0x09,0x07,0x09,0x07,0x17,0x13,0x19,0x15,0x12,0x10,0x12,0x10,0x14,0x13,0x0e,0x0e,0x25,0x1b,0x26,0x1d,0x21,0x1c,0x1e,0x16,0x1e,0x16,0x1e,0x16,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x12,0x0a,0x10,0x08,0x19,0x13,0x1c,0x16,0x2c,0x21,0x12,0x13,0x17,0x17,0x1b,0x1c,0x19,0x13,0x20, -0x1a,0x12,0x0d,0x12,0x10,0x15,0x10,0x1f,0x18,0x14,0x11,0x12,0x13,0x12,0x13,0x10,0x0d,0x10,0x0d,0x10,0x0c,0x11,0x11,0x0a,0x16,0x0b,0x20,0x16,0x0b,0x13,0x14,0x0f,0x19,0x12,0x0d,0x0b,0x13,0x13,0x13,0x10,0x08,0x19,0x14,0x0c,0x0b,0x15,0x0f,0x17,0x0d,0x1a,0x14,0x14,0x0f,0x17,0x13,0x13,0x10,0x19,0x13,0x14,0x0b,0x12,0x0e,0x19, -0x0e,0x12,0x1c,0x10,0x12,0x1e,0x09,0x26,0x1d,0x1e,0x27,0x1d,0x1e,0x1e,0x1d,0x1d,0x1e,0x11,0x10,0x14,0x17,0x1e,0x17,0x1f,0x08,0x0f,0x13,0x1c,0x22,0x17,0x22,0x14,0x14,0x1a,0x17,0x26,0x1e,0x11,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x1c,0x1c,0x1c,0x1c,0x21,0x11,0x11,0x21,0x19,0x11,0x11,0x19,0x16,0x0b,0x0b,0x16,0x13,0x13, -0x13,0x13,0x19,0x0b,0x0b,0x1c,0x19,0x0b,0x0b,0x1c,0x0e,0x0e,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x11,0x0d,0x13,0x11,0x19,0x13,0x13,0x1d,0x16,0x19,0x19,0x1b,0x1b,0x13,0x10,0x21,0x1b,0x22,0x1c,0x17, -0x13,0x0a,0x0a,0x13,0x15,0x0d,0x14,0x11,0x13,0x10,0x18,0x1a,0x0d,0x13,0x0e,0x07,0x0c,0x12,0x12,0x07,0x07,0x06,0x07,0x0c,0x0c,0x0c,0x0f,0x31,0x42,0x0b,0x0e,0x04,0x09,0x0d,0x0e,0x0a,0x10,0x11,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x2c,0x12,0x19,0x1e,0x1e,0x15,0x0f,0x13,0x18,0x18,0x10, -0x0a,0x16,0x11,0x16,0x12,0x16,0x12,0x12,0x19,0x14,0x13,0x11,0x19,0x14,0x1b,0x0f,0x11,0x15,0x0a,0x13,0x0b,0x0b,0x08,0x1d,0x13,0x13,0x11,0x11,0x13,0x1f,0x1f,0x1f,0x21,0x21,0x12,0x10,0x09,0x11,0x0f,0x14,0x0f,0x16,0x08,0x13,0x14,0x1c,0x1c,0x14,0x12,0x13,0x12,0x11,0x0f,0x11,0x0f,0x10,0x0a,0x0b,0x08,0x07,0x0c,0x13,0x15,0x0a, -0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x0a,0x0a,0x0a,0x08,0x08,0x38,0x21,0x1d,0x23,0x0a,0x0a,0x0b,0x0d,0x08,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x1e,0x0b,0x0b,0x1e,0x09,0x11,0x11,0x2c,0x21,0x21,0x2c,0x1e,0x11,0x11,0x1e,0x11,0x11,0x0e,0x0e,0x00,0x00,0x0c, -0x19,0x14,0x17,0x13,0x29,0x22,0x17,0x12,0x17,0x12,0x2c,0x21,0x19,0x13,0x0d,0x0a,0x14,0x00,0x17,0x12,0x0b,0x0a,0x05,0x10,0x0b,0x0b,0x08,0x07,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x07,0x11,0x0e,0x13,0x13,0x12,0x20,0x1b,0x1b,0x1a,0x1b,0x1f,0x15,0x17,0x14,0x0d,0x1f,0x25,0x0f,0x26,0x11,0x1c,0x1e,0x1e,0x1e,0x0e,0x19, -0x21,0x19,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x13,0x13,0x13,0x1c,0x11,0x11,0x1e,0x0b,0x0b,0x1e,0x0b,0x0b,0x1e,0x10,0x10,0x00,0x0e,0x1c,0x0b,0x0b,0x21,0x11,0x11,0x19,0x11,0x11,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x32,0x32,0x1d, -0x00,0x00,0x1d,0x1d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x16,0x14,0x15,0x15,0x1d,0x15,0x15,0x1a,0x20,0x15,0x15,0x23,0x15,0x15,0x1f,0x15,0x16,0x1a,0x15,0x19,0x1c,0x1e,0x15,0x19,0x15,0x17,0x15,0x17,0x15,0x16,0x17,0x15,0x1a,0x14,0x16,0x1a,0x14,0x15,0x13,0x1a,0x15,0x15,0x15,0x17, -0x0f,0x11,0x15,0x1a,0x1a,0x12,0x00,0x00,0x25,0x4a,0x18,0x00,0x04,0x0a,0x0b,0x0f,0x16,0x14,0x1e,0x1e,0x09,0x0b,0x0b,0x0f,0x19,0x08,0x0f,0x08,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x08,0x08,0x19,0x19,0x19,0x11,0x23,0x18,0x15,0x17,0x1a,0x13,0x12,0x19,0x1a,0x0a,0x0d,0x15,0x11,0x21,0x1c,0x1c,0x15,0x1c,0x16, -0x14,0x13,0x19,0x17,0x23,0x16,0x14,0x15,0x0b,0x0e,0x0b,0x19,0x0f,0x0a,0x13,0x16,0x11,0x16,0x13,0x0c,0x16,0x15,0x09,0x09,0x12,0x09,0x20,0x15,0x16,0x16,0x16,0x0d,0x10,0x0d,0x15,0x12,0x1b,0x11,0x12,0x11,0x0b,0x09,0x0b,0x19,0x18,0x18,0x17,0x13,0x1c,0x1c,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x13,0x09,0x09, -0x09,0x09,0x15,0x16,0x16,0x16,0x16,0x16,0x15,0x15,0x15,0x15,0x0e,0x0e,0x14,0x14,0x11,0x0f,0x11,0x14,0x0f,0x21,0x21,0x1d,0x0a,0x0f,0x19,0x20,0x1c,0x1e,0x19,0x19,0x19,0x14,0x15,0x14,0x17,0x1c,0x14,0x0f,0x10,0x1c,0x1f,0x16,0x11,0x0a,0x0b,0x19,0x18,0x14,0x19,0x18,0x13,0x13,0x1b,0x18,0x18,0x1c,0x22,0x22,0x13,0x25,0x0e,0x0e, -0x08,0x08,0x19,0x16,0x12,0x14,0x06,0x14,0x0c,0x0c,0x15,0x15,0x0e,0x08,0x08,0x0e,0x2d,0x18,0x13,0x18,0x13,0x13,0x0a,0x0a,0x0a,0x0a,0x1c,0x1c,0x1c,0x19,0x19,0x19,0x09,0x0e,0x0c,0x0b,0x0b,0x07,0x0a,0x08,0x0c,0x07,0x0e,0x11,0x0a,0x14,0x10,0x15,0x11,0x09,0x1a,0x15,0x14,0x12,0x15,0x16,0x19,0x19,0x0d,0x0e,0x0e,0x22,0x22,0x23, -0x12,0x19,0x16,0x0a,0x14,0x10,0x17,0x11,0x17,0x11,0x16,0x0f,0x08,0x18,0x13,0x18,0x13,0x1a,0x19,0x1a,0x13,0x13,0x13,0x13,0x11,0x09,0x11,0x0b,0x11,0x0c,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x16,0x0d,0x16,0x0d,0x14,0x10,0x13,0x0d,0x13,0x10,0x19,0x15,0x19,0x15,0x15,0x11,0x15,0x11,0x11,0x1c,0x1c,0x17,0x16,0x10,0x15,0x12,0x1a,0x0f, -0x12,0x0f,0x29,0x17,0x12,0x16,0x08,0x0e,0x1e,0x0c,0x16,0x0d,0x0d,0x16,0x0d,0x18,0x13,0x17,0x11,0x17,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x16,0x19,0x16,0x19,0x16,0x1a,0x15,0x1a,0x15,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0d,0x09,0x15,0x12,0x12,0x11,0x09,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x1c,0x16,0x16,0x0d,0x14,0x10, -0x13,0x0d,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x23,0x1b,0x14,0x12,0x09,0x18,0x13,0x20,0x1f,0x1c,0x16,0x08,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x14,0x12,0x08,0x0f,0x14,0x16,0x22,0x22,0x22,0x21,0x0e,0x0e,0x08,0x0a,0x0a,0x18,0x15,0x1d,0x0e,0x1e,0x19,0x1f,0x0a,0x18,0x15,0x13,0x15,0x1a,0x0a,0x15,0x17,0x21,0x1c,0x13,0x1c,0x1a, -0x15,0x13,0x13,0x14,0x16,0x1d,0x1c,0x0a,0x14,0x17,0x10,0x15,0x0a,0x14,0x14,0x13,0x10,0x15,0x16,0x0a,0x13,0x12,0x15,0x13,0x10,0x16,0x16,0x11,0x14,0x14,0x1c,0x1e,0x0a,0x14,0x16,0x14,0x1e,0x13,0x1a,0x11,0x17,0x14,0x0a,0x24,0x24,0x1b,0x15,0x15,0x1a,0x18,0x15,0x15,0x11,0x1a,0x13,0x20,0x14,0x1c,0x1c,0x15,0x19,0x21,0x1a,0x1c, -0x1a,0x15,0x17,0x13,0x15,0x1b,0x16,0x1b,0x18,0x23,0x24,0x1a,0x1d,0x15,0x17,0x26,0x16,0x13,0x15,0x14,0x0e,0x14,0x13,0x1c,0x11,0x16,0x16,0x12,0x14,0x1a,0x15,0x16,0x15,0x16,0x11,0x0f,0x12,0x19,0x11,0x16,0x15,0x1e,0x1f,0x16,0x1a,0x13,0x11,0x1e,0x13,0x13,0x15,0x0e,0x11,0x10,0x09,0x1d,0x1e,0x15,0x12,0x12,0x15,0x11,0x0e,0x25, -0x2a,0x17,0x0d,0x0e,0x0e,0x0e,0x09,0x14,0x10,0x15,0x1c,0x16,0x1a,0x16,0x0b,0x0c,0x0a,0x0a,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x12,0x0b,0x12,0x0b,0x0b,0x0b,0x12,0x12,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, -0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0a,0x09,0x0a,0x09,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x19,0x15,0x19,0x15,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x14,0x12,0x14,0x12,0x14,0x12,0x13,0x0d,0x13,0x13,0x1c,0x16,0x0a, -0x0d,0x09,0x09,0x13,0x0f,0x22,0x1d,0x17,0x14,0x15,0x12,0x1b,0x16,0x14,0x12,0x14,0x12,0x17,0x12,0x18,0x15,0x18,0x15,0x1b,0x13,0x1c,0x16,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x12,0x12,0x12,0x12,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x13,0x13,0x18,0x13,0x15,0x16,0x15,0x16,0x15,0x16,0x17,0x11,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a, -0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x0c,0x19,0x16,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x0a,0x09,0x0a,0x09,0x15,0x12,0x15,0x12,0x15,0x12,0x11,0x09,0x11,0x09,0x11,0x09,0x11,0x09,0x21,0x20,0x21,0x20,0x21,0x20,0x1c,0x15,0x1c,0x15,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c, -0x16,0x15,0x16,0x15,0x16,0x16,0x0d,0x16,0x0d,0x16,0x0d,0x16,0x0d,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x17,0x12,0x17,0x12,0x23,0x1b,0x23,0x1b,0x16,0x11,0x16,0x11,0x14,0x12,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x0d,0x1b, -0x12,0x13,0x09,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x1a,0x1a,0x1a,0x1a,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x22,0x22,0x22,0x22,0x22,0x22,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x12,0x12,0x13,0x13,0x13,0x13,0x16, -0x16,0x16,0x16,0x16,0x16,0x1e,0x1e,0x23,0x23,0x23,0x23,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x19,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x23,0x23,0x23,0x23,0x23,0x23,0x17,0x17,0x10,0x10,0x15,0x15,0x0a,0x0a,0x16,0x16,0x14,0x14,0x1e,0x1e,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x22,0x22,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x23,0x23,0x23,0x23,0x23,0x23,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x16,0x16,0x16,0x16,0x16,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x1a, -0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0e,0x16,0x16,0x16,0x14,0x14,0x14,0x14,0x16,0x16,0x14,0x14,0x14,0x14,0x19,0x19,0x17,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x1f,0x1c,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x17,0x15,0x16,0x15,0x16, -0x17,0x17,0x11,0x1a,0x1b,0x15,0x16,0x16,0x13,0x14,0x12,0x1a,0x17,0x20,0x0b,0x0a,0x15,0x12,0x09,0x12,0x21,0x1c,0x15,0x1c,0x24,0x1d,0x16,0x16,0x15,0x14,0x10,0x13,0x0b,0x0d,0x13,0x0d,0x13,0x1c,0x1a,0x15,0x13,0x15,0x11,0x17,0x17,0x10,0x0f,0x14,0x14,0x0e,0x0f,0x14,0x09,0x0e,0x11,0x0b,0x2e,0x2a,0x26,0x20,0x1b,0x13,0x28,0x24, -0x1e,0x18,0x13,0x0a,0x09,0x1c,0x16,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x13,0x18,0x13,0x18,0x13,0x20,0x1f,0x19,0x16,0x19,0x16,0x15,0x12,0x1c,0x16,0x1c,0x16,0x17,0x10,0x09,0x2e,0x2a,0x26,0x19,0x16,0x25,0x19,0x1c,0x15,0x18,0x13,0x18,0x13,0x13,0x13,0x13,0x13,0x0a,0x09,0x0a,0x09,0x1c,0x16,0x1c,0x16,0x15,0x0d, -0x16,0x0d,0x19,0x15,0x19,0x15,0x13,0x10,0x1a,0x15,0x1b,0x16,0x15,0x15,0x11,0x18,0x13,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x14,0x12,0x16,0x13,0x15,0x15,0x16,0x13,0x16,0x16,0x16,0x11,0x11,0x16,0x16,0x13,0x17,0x0f,0x0f,0x13,0x14,0x0a,0x16,0x16,0x14,0x12,0x11,0x15,0x15,0x15,0x0a,0x0a,0x0c,0x0a,0x0e,0x09,0x16,0x20,0x20, -0x20,0x15,0x15,0x16,0x16,0x1a,0x1b,0x18,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x11,0x11,0x0f,0x09,0x0a,0x0b,0x0a,0x0d,0x0d,0x16,0x16,0x15,0x12,0x1b,0x12,0x0f,0x11,0x13,0x10,0x10,0x0e,0x0e,0x0e,0x11,0x17,0x12,0x14,0x14,0x15,0x09,0x12,0x0e,0x16,0x0e,0x0e,0x22,0x23,0x24,0x17,0x12,0x1b,0x1d,0x15,0x15,0x12,0x12,0x14,0x16,0x15, -0x19,0x15,0x18,0x1e,0x15,0x1a,0x16,0x16,0x11,0x12,0x11,0x16,0x13,0x17,0x12,0x21,0x20,0x16,0x13,0x18,0x14,0x17,0x11,0x16,0x12,0x19,0x16,0x15,0x0f,0x15,0x16,0x11,0x09,0x1c,0x11,0x11,0x20,0x19,0x18,0x15,0x22,0x1a,0x19,0x12,0x20,0x1a,0x1b,0x15,0x22,0x1c,0x14,0x11,0x1d,0x1c,0x1c,0x16,0x1b,0x15,0x1b,0x15,0x31,0x29,0x1f,0x18, -0x2a,0x21,0x20,0x19,0x16,0x10,0x13,0x0f,0x0f,0x00,0x00,0x24,0x23,0x15,0x13,0x15,0x16,0x15,0x13,0x14,0x11,0x15,0x12,0x1a,0x16,0x1f,0x19,0x25,0x1f,0x1b,0x15,0x17,0x11,0x13,0x0f,0x20,0x19,0x19,0x16,0x1f,0x17,0x1f,0x17,0x0a,0x20,0x1c,0x15,0x13,0x1a,0x15,0x18,0x15,0x18,0x13,0x18,0x13,0x20,0x1f,0x13,0x13,0x1b,0x13,0x1b,0x13, -0x20,0x1c,0x14,0x11,0x13,0x10,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x17,0x11,0x15,0x12,0x15,0x12,0x15,0x12,0x18,0x15,0x1d,0x1a,0x15,0x16,0x20,0x20,0x1e,0x1b,0x15,0x12,0x22,0x1d,0x25,0x1f,0x1a,0x14,0x19,0x16,0x16,0x15,0x15,0x13,0x16,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x16, -0x0c,0x0c,0x06,0x08,0x08,0x08,0x0a,0x0f,0x0a,0x08,0x0e,0x08,0x08,0x08,0x0c,0x0c,0x08,0x08,0x16,0x16,0x16,0x16,0x0c,0x0a,0x0a,0x0c,0x0b,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0b,0x06,0x09,0x0a,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x0c,0x09,0x0a,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14, -0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14, -0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14, -0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x18,0x0b,0x17,0x0d,0x16,0x16,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0c,0x0c,0x0c,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x16,0x11,0x18,0x1f,0x12,0x11,0x14,0x15,0x0f,0x0f,0x09,0x0b,0x12,0x0f,0x1a,0x16,0x16,0x12,0x17,0x17,0x17, -0x22,0x14,0x16,0x16,0x11,0x11,0x11,0x0f,0x14,0x15,0x1b,0x15,0x12,0x1b,0x11,0x0f,0x0f,0x14,0x0e,0x11,0x15,0x11,0x16,0x15,0x0d,0x12,0x0d,0x0d,0x0f,0x0b,0x0b,0x0f,0x10,0x07,0x08,0x0d,0x0a,0x13,0x10,0x10,0x10,0x0e,0x0d,0x0d,0x0b,0x0f,0x13,0x0c,0x0c,0x0d,0x12,0x0d,0x0d,0x0c,0x0c,0x0a,0x0a,0x0d,0x06,0x0b,0x12,0x0c,0x0d,0x0a, -0x0d,0x0d,0x0d,0x07,0x0c,0x0c,0x12,0x0a,0x0c,0x0c,0x0b,0x0d,0x0f,0x0b,0x06,0x08,0x0c,0x0a,0x0c,0x0b,0x0d,0x0f,0x0b,0x16,0x06,0x0d,0x14,0x20,0x17,0x14,0x14,0x20,0x18,0x20,0x1c,0x14,0x16,0x13,0x11,0x2a,0x11,0x16,0x21,0x23,0x23,0x17,0x18,0x17,0x11,0x11,0x13,0x10,0x11,0x13,0x07,0x00,0x00,0x00,0x00,0x16,0x17,0x17,0x17,0x11, -0x0e,0x16,0x16,0x0c,0x20,0x15,0x16,0x0d,0x0c,0x11,0x0d,0x11,0x16,0x11,0x15,0x21,0x18,0x0c,0x0a,0x16,0x14,0x16,0x16,0x16,0x0c,0x16,0x12,0x09,0x20,0x15,0x16,0x0d,0x10,0x10,0x12,0x11,0x11,0x13,0x16,0x16,0x13,0x10,0x11,0x1b,0x09,0x11,0x09,0x15,0x10,0x0d,0x0a,0x0a,0x0d,0x0a,0x07,0x06,0x0d,0x0c,0x06,0x07,0x06,0x06,0x06,0x07, -0x06,0x08,0x12,0x12,0x0c,0x0c,0x0d,0x0c,0x0e,0x09,0x06,0x07,0x0c,0x0d,0x0c,0x0c,0x0a,0x0a,0x0a,0x0b,0x0a,0x0d,0x00,0x00,0x00,0x00,0x08,0x0c,0x0c,0x0d,0x0a,0x0c,0x14,0x14,0x14,0x14,0x0c,0x00,0x00,0x00,0x00,0x11,0x0b,0x0a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x14,0x14,0x14,0x14, -0x14,0x14,0x14,0x14,0x0a,0x0a,0x0a,0x0a,0x14,0x14,0x14,0x14,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x06,0x0e,0x0e,0x0d,0x0e,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0e,0x0d,0x0e,0x0e,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x1d,0x17, -0x1a,0x15,0x1c,0x17,0x23,0x1c,0x14,0x0e,0x13,0x19,0x14,0x1e,0x1a,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x1f,0x1f,0x25,0x0f,0x09,0x13,0x16,0x0f,0x13,0x13,0x16,0x16,0x13,0x25,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x18,0x13,0x13,0x13,0x0c,0x16,0x0c,0x1c,0x19,0x13,0x0c,0x1f, -0x13,0x1f,0x09,0x0c,0x16,0x16,0x18,0x18,0x18,0x16,0x16,0x16,0x1f,0x09,0x16,0x09,0x13,0x0f,0x09,0x09,0x13,0x09,0x1c,0x09,0x22,0x13,0x22,0x22,0x16,0x16,0x16,0x13,0x13,0x0f,0x0f,0x2b,0x2b,0x31,0x31,0x1f,0x1f,0x13,0x13,0x06,0x25,0x1c,0x1f,0x19,0x16,0x19,0x13,0x13,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x09, -0x18,0x00,0x18,0x18,0x18,0x0c,0x13,0x13,0x22,0x0c,0x22,0x0c,0x16,0x19,0x16,0x0f,0x22,0x13,0x22,0x13,0x1c,0x1f,0x0c,0x13,0x13,0x0f,0x09,0x13,0x16,0x13,0x16,0x13,0x16,0x16,0x13,0x19,0x18,0x22,0x0c,0x13,0x0f,0x19,0x13,0x0c,0x13,0x13,0x13,0x22,0x0c,0x22,0x0c,0x09,0x16,0x0e,0x25,0x13,0x13,0x18,0x18,0x25,0x13,0x00,0x00,0x00, -0x18,0x00,0x18,0x18,0x18,0x18,0x1c,0x18,0x00,0x00,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x13,0x13,0x1c,0x1f,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x19,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0f,0x0f,0x0f,0x13, -0x0f,0x0f,0x0f,0x2b,0x1f,0x2b,0x1f,0x2b,0x1f,0x31,0x25,0x31,0x25,0x1f,0x13,0x16,0x16,0x16,0x25,0x25,0x13,0x13,0x25,0x13,0x13,0x25,0x13,0x13,0x25,0x13,0x13,0x1c,0x1c,0x28,0x25,0x22,0x13,0x1f,0x13,0x1f,0x13,0x1f,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19, -0x19,0x0c,0x19,0x0c,0x14,0x19,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1f,0x22,0x1c,0x1f,0x0c,0x13,0x1c,0x1f,0x1c,0x1f,0x00,0x00,0x00,0x00,0x00,0x2a,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0f,0x00,0x00,0x16,0x00,0x00,0x00,0x2b,0x1f,0x31,0x25,0x13,0x16,0x16,0x16,0x0f,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, -0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x22,0x22,0x0e,0x16,0x16,0x16,0x2d,0x1f,0x14,0x38,0x28,0x0c,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x13,0x0f,0x0f,0x1c,0x19,0x19,0x13,0x00,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x2e,0x38,0x00,0x00,0x00,0x00,0x00,0x16,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x0f,0x22,0x0c, -0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x19,0x16,0x13,0x13,0x0f,0x2b,0x1f,0x13,0x16,0x16,0x16,0x13,0x16,0x16,0x16,0x13,0x16,0x16,0x16,0x25,0x13,0x13,0x25,0x13,0x13,0x22,0x13,0x13,0x22,0x13,0x13,0x22,0x13,0x13,0x16,0x16,0x16,0x16,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x19,0x0c,0x0c,0x0f,0x0f, -0x2b,0x1f,0x18,0x16,0x16,0x00,0x13,0x13,0x13,0x0e,0x15,0x19,0x17,0x13,0x13,0x0d,0x09,0x1c,0x16,0x16,0x0d,0x14,0x12,0x12,0x11,0x12,0x09,0x13,0x0f,0x17,0x12,0x16,0x11,0x14,0x10,0x19,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x11,0x12,0x11,0x0b,0x13,0x15,0x16,0x13,0x0d,0x1b,0x16,0x18,0x14,0x17,0x12,0x15,0x13, -0x0f,0x1a,0x0e,0x0f,0x10,0x12,0x16,0x16,0x13,0x25,0x13,0x25,0x0c,0x09,0x06,0x14,0x08,0x05,0x00,0x05,0x08,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x22,0x10,0x1c,0x16,0x23,0x1b,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x20,0x11,0x20,0x11,0x20,0x18,0x19,0x1a,0x1a,0x1c, -0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x19,0x19,0x19,0x19,0x1b,0x15,0x27,0x1f,0x11,0x11,0x0b,0x0b,0x0b,0x0e,0x08,0x15,0x09,0x09,0x1f,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x07,0x00,0x00,0x08,0x00,0x00,0x18,0x15,0x10,0x12,0x19,0x0a,0x0c,0x19,0x19,0x0a,0x15,0x14,0x14,0x1a, -0x19,0x0a,0x0f,0x19,0x16,0x17,0x17,0x15,0x16,0x19,0x15,0x1d,0x1b,0x13,0x13,0x13,0x08,0x0e,0x15,0x15,0x14,0x14,0x14,0x16,0x18,0x12,0x19,0x14,0x14,0x1a,0x15,0x1b,0x14,0x1d,0x1d,0x1d,0x1d,0x18,0x18,0x18,0x15,0x10,0x12,0x19,0x0b,0x0d,0x19,0x0b,0x15,0x14,0x14,0x19,0x0f,0x19,0x17,0x17,0x16,0x19,0x15,0x1d,0x1b,0x0a,0x15,0x14, -0x17,0x18,0x2c,0x00,0x18,0x14,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0a,0x00,0x1c,0x18,0x19,0x1a,0x14,0x19,0x1c,0x1c,0x11,0x17,0x1c,0x1b,0x18,0x1c,0x1e,0x1d,0x19,0x14,0x15,0x1c, -0x1a,0x15,0x19,0x19,0x18,0x19,0x19,0x1b,0x15,0x18,0x19,0x18,0x1d,0x17,0x17,0x18,0x19,0x1e,0x12,0x16,0x16,0x20,0x14,0x14,0x1d,0x21,0x17,0x14,0x27,0x15,0x15,0x1c,0x14,0x14,0x1c,0x15,0x1c,0x1e,0x20,0x14,0x1d,0x14,0x18,0x14,0x17,0x15,0x17,0x14,0x16,0x1c,0x14,0x17,0x19,0x14,0x14,0x16,0x23,0x14,0x14,0x16,0x16,0x10,0x0c,0x15, -0x15,0x15,0x14,0x15,0x21,0x15,0x21,0x12,0x15,0x21,0x19,0x15,0x21,0x1c,0x1c,0x21,0x15,0x15,0x21,0x21,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x21,0x16,0x15,0x15,0x21,0x16,0x14,0x15,0x15,0x21,0x1d,0x19,0x1a,0x1a,0x19,0x1a,0x17,0x19,0x1d,0x1a,0x18,0x14,0x1d,0x19,0x19,0x15,0x19,0x1a,0x1c,0x1b,0x16,0x1a,0x19,0x1b,0x19,0x1d,0x1a, -0x1b,0x1b,0x19,0x18,0x1a,0x19,0x1b,0x1d,0x18,0x1c,0x1b,0x04,0x04,0x06,0x07,0x06,0x0a,0x0d,0x20,0x15,0x17,0x16,0x15,0x17,0x15,0x15,0x18,0x16,0x15,0x0b,0x1f,0x16,0x15,0x15,0x14,0x16,0x13,0x15,0x0a,0x16,0x13,0x15,0x0f,0x20,0x14,0x15,0x15,0x16,0x1f,0x15,0x16,0x0f,0x1f,0x16,0x16,0x19,0x19,0x08,0x0a,0x2a,0x29,0x29,0x2a,0x35, -0x14,0x14,0x09,0x14,0x0e,0x14,0x14,0x15,0x14,0x14,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x15,0x14,0x14,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x12,0x13,0x16,0x10,0x10,0x15,0x17,0x09,0x0c,0x12, -0x0f,0x1c,0x18,0x17,0x12,0x17,0x12,0x10,0x10,0x16,0x13,0x1e,0x13,0x11,0x12,0x1a,0x1d,0x0f,0x17,0x12,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x18,0x17,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16,0x11,0x13,0x13,0x13,0x13,0x13,0x15,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x13, -0x17,0x17,0x09,0x09,0x09,0x09,0x09,0x15,0x0c,0x12,0x0f,0x0f,0x0f,0x0f,0x18,0x18,0x18,0x18,0x17,0x17,0x17,0x12,0x12,0x12,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x1a,0x17,0x13,0x12,0x0e,0x14,0x10,0x12,0x17,0x17,0x09,0x12,0x13,0x1c,0x18, -0x11,0x17,0x17,0x12,0x11,0x10,0x11,0x17,0x13,0x18,0x17,0x13,0x10,0x17,0x09,0x17,0x11,0x17,0x09,0x11,0x10,0x15,0x0f,0x13,0x10,0x09,0x09,0x0c,0x1e,0x1e,0x17,0x12,0x12,0x17,0x13,0x12,0x12,0x0f,0x16,0x10,0x1b,0x10,0x18,0x18,0x12,0x15,0x1c,0x17,0x17,0x17,0x12,0x13,0x10,0x12,0x17,0x13,0x17,0x14,0x1e,0x1f,0x15,0x1a,0x12,0x13, -0x20,0x12,0x0f,0x15,0x16,0x17,0x21,0x21,0x18,0x13,0x15,0x10,0x15,0x15,0x15,0x1a,0x13,0x13,0x19,0x15,0x15,0x0d,0x17,0x17,0x15,0x12,0x12,0x21,0x1c,0x11,0x14,0x16,0x16,0x17,0x17,0x1a,0x19,0x0d,0x23,0x16,0x14,0x15,0x18,0x18,0x13,0x13,0x0a,0x1c,0x19,0x19,0x11,0x1a,0x08,0x08,0x10,0x10,0x08,0x08,0x17,0x0f,0x0a,0x1c,0x1a,0x0b, -0x08,0x08,0x11,0x0e,0x0e,0x08,0x08,0x08,0x0e,0x19,0x11,0x0b,0x16,0x19,0x16,0x15,0x12,0x1c,0x15,0x16,0x0d,0x10,0x14,0x10,0x08,0x08,0x0e,0x13,0x0d,0x19,0x19,0x19,0x22,0x1c,0x22,0x09,0x00,0x00,0x00,0x00,0x00,0x09,0x1c,0x1f,0x0c,0x0c,0x13,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x13,0x13,0x2b,0x1f,0x2b,0x1f,0x31, -0x25,0x31,0x25,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x22,0x22,0x13,0x13,0x22,0x22,0x13,0x13,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x25,0x1c,0x1f,0x13,0x16,0x16,0x19,0x0c,0x19,0x1c,0x13,0x13,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x22,0x0c,0x1c,0x13,0x13,0x09,0x13,0x13, -0x13,0x13,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x2b,0x1f,0x2b,0x1f,0x2b,0x1f,0x31,0x25,0x31,0x25,0x1f,0x1f,0x1f,0x25,0x25,0x25,0x25,0x25,0x25,0x1c,0x13,0x13,0x1c,0x13,0x13,0x22,0x13,0x28,0x25,0x22, -0x13,0x1f,0x13,0x1f,0x13,0x1f,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x19,0x19,0x19,0x19,0x19,0x0c,0x19,0x19,0x0c,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x13,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0c,0x0c,0x13,0x0c,0x0c,0x0c,0x0c,0x00,0x2b,0x1f,0x31,0x25,0x22,0x13,0x22,0x0c,0x22,0x0c, -0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x13,0x13,0x0f,0x2b,0x1f,0x25,0x25,0x22,0x22,0x22,0x16,0x16,0x16,0x16,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x2b,0x1f,0x16,0x19,0x16,0x16,0x16,0x19,0x16,0x16,0x2b,0x2b,0x1f,0x1f,0x0f,0x0f,0x16,0x16,0x16,0x16,0x0c,0x0c,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f, -0x0c,0x0c,0x16,0x16,0x16,0x16,0x22,0x0c,0x22,0x0c,0x16,0x19,0x16,0x16,0x2b,0x2b,0x1f,0x1f,0x2b,0x2b,0x1f,0x1f,0x1f,0x1f,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x09,0x09,0x0c,0x09,0x00,0x00,0x00,0x1f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, -0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x19,0x19,0x19,0x19,0x19,0x19,0x16, -0x1f,0x16,0x1f,0x16,0x1f,0x16,0x1f,0x19,0x19,0x19,0x09,0x09,0x13,0x0f,0x16,0x18,0x15,0x14,0x15,0x16,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x13,0x11,0x14,0x13,0x16,0x17,0x17,0x18,0x15,0x15,0x18,0x13,0x19,0x1c,0x18,0x1c,0x1f,0x18,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x14,0x11, -0x14,0x16,0x16,0x18,0x15,0x18,0x15,0x16,0x16,0x13,0x13,0x1c,0x19,0x1a,0x19,0x19,0x16,0x16,0x15,0x1b,0x1d,0x1c,0x1c,0x22,0x22,0x1a,0x22,0x22,0x1b,0x20,0x1f,0x15,0x1c,0x1f,0x1c,0x16,0x1f,0x1b,0x1a,0x1a,0x16,0x18,0x1c,0x1d,0x1a,0x17,0x1a,0x16,0x14,0x22,0x22,0x22,0x1e,0x22,0x22,0x19,0x22,0x22,0x1a,0x1c,0x1d,0x1c,0x1b,0x1b, -0x18,0x21,0x1c,0x1f,0x1a,0x1a,0x15,0x1b,0x1a,0x1a,0x20,0x1c,0x1b,0x21,0x14,0x13,0x15,0x14,0x17,0x17,0x1a,0x1b,0x15,0x15,0x15,0x14,0x15,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x14,0x16,0x17,0x16,0x16,0x11,0x15,0x15,0x16,0x16,0x1c,0x1f,0x18,0x18,0x17,0x1c,0x18,0x19,0x13,0x12,0x16,0x15,0x12,0x12,0x14,0x14,0x12,0x11, -0x17,0x11,0x14,0x12,0x14,0x1d,0x15,0x1f,0x14,0x15,0x15,0x1c,0x0c,0x1d,0x19,0x1b,0x18,0x15,0x1c,0x16,0x1d,0x16,0x16,0x16,0x16,0x16,0x16,0x15,0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x11,0x11,0x11,0x11,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x17,0x0a,0x0a,0x0a,0x0b,0x0b,0x0a,0x0a,0x0a,0x0b, -0x0a,0x0a,0x0a,0x21,0x21,0x21,0x21,0x12,0x1b,0x1b,0x12,0x0f,0x12,0x13,0x15,0x12,0x1f,0x1e,0x20,0x10,0x25,0x12,0x1f,0x1f,0x1f,0x1e,0x15,0x12,0x12,0x1d,0x16,0x1d,0x19,0x14,0x11,0x0f,0x26,0x0f,0x14,0x12,0x12,0x12,0x12,0x12,0x32,0x1f,0x1f,0x10,0x09,0x11,0x09,0x11,0x09,0x09,0x09,0x12,0x16,0x16,0x14,0x0e,0x0e,0x08,0x08,0x08, -0x0e,0x08,0x0f,0x20,0x08,0x21,0x21,0x21,0x16,0x16,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x2b,0x2b,0x19,0x2b,0x2b,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x11,0x16,0x11,0x14,0x10, -0x0d,0x0d,0x19,0x14,0x1b,0x10,0x2a,0x21,0x16,0x14,0x22,0x1d,0x1f,0x1c,0x26,0x1e,0x22,0x1d,0x18,0x12,0x1b,0x16,0x22,0x1b,0x1c,0x17,0x1b,0x16,0x20,0x19,0x20,0x19,0x29,0x1f,0x1c,0x16,0x1c,0x16,0x2d,0x21,0x1d,0x00,0x24,0x24,0x24,0x12,0x00,0x00,0x16,0x13,0x1a,0x15,0x14,0x10,0x28,0x21,0x23,0x20,0x1b,0x15,0x1a,0x16,0x13,0x0f, -0x1b,0x16,0x13,0x0f,0x1e,0x19,0x18,0x15,0x24,0x1e,0x14,0x15,0x1b,0x1b,0x1e,0x11,0x07,0x11,0x19,0x10,0x25,0x25,0x09,0x00,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x0f,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x14,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, -0x1c,0x1c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x21,0x21, -0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, -0x1c,0x1c,0x1c,0x1c,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x12,0x19,0x1b,0x0a,0x08,0x0a,0x08,0x1a,0x15,0x1b,0x17,0x14,0x11,0x14,0x12,0x16,0x15,0x10,0x10,0x2a,0x1e,0x2b, -0x21,0x25,0x1f,0x21,0x18,0x21,0x18,0x21,0x18,0x17,0x11,0x15,0x12,0x15,0x12,0x15,0x12,0x14,0x0c,0x11,0x09,0x1c,0x16,0x20,0x19,0x31,0x25,0x15,0x16,0x19,0x1a,0x1e,0x20,0x1c,0x16,0x24,0x1d,0x14,0x0f,0x15,0x12,0x17,0x12,0x23,0x1b,0x17,0x13,0x15,0x16,0x15,0x16,0x12,0x0f,0x12,0x0e,0x11,0x0e,0x13,0x13,0x0b,0x19,0x0c,0x23,0x19, -0x0d,0x16,0x17,0x11,0x1c,0x15,0x0e,0x0d,0x15,0x15,0x15,0x11,0x09,0x1c,0x16,0x0e,0x0d,0x17,0x11,0x1a,0x0e,0x1d,0x16,0x17,0x11,0x19,0x16,0x15,0x12,0x1c,0x15,0x16,0x0d,0x14,0x10,0x1c,0x10,0x14,0x20,0x12,0x15,0x21,0x0a,0x2a,0x21,0x21,0x2c,0x21,0x22,0x22,0x21,0x21,0x22,0x13,0x11,0x17,0x1a,0x21,0x1a,0x23,0x09,0x11,0x16,0x20, -0x26,0x1a,0x26,0x17,0x17,0x1d,0x1a,0x2a,0x22,0x13,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x1f,0x1f,0x1f,0x1f,0x25,0x13,0x13,0x25,0x1c,0x13,0x13,0x1c,0x19,0x0c,0x0c,0x19,0x16,0x16,0x16,0x16,0x1c,0x0c,0x0c,0x1f,0x1c,0x0c,0x0c,0x1f,0x0f,0x0f,0x13,0x13,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x13,0x0f,0x15,0x14,0x1c,0x16,0x15,0x20,0x19,0x1c,0x1c,0x1f,0x1e,0x15,0x12,0x25,0x1e,0x27,0x20,0x19,0x16,0x0c,0x0c,0x16,0x18,0x0f,0x16,0x13,0x15,0x12,0x1b,0x1e,0x0f,0x16,0x10,0x08,0x0e,0x14,0x14,0x08,0x08,0x07,0x08,0x0e,0x0e,0x0e,0x11,0x37, -0x4a,0x0d,0x0f,0x05,0x0a,0x0e,0x10,0x0c,0x12,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x31,0x14,0x1c,0x22,0x21,0x18,0x11,0x15,0x1b,0x1b,0x12,0x0c,0x18,0x13,0x19,0x15,0x18,0x14,0x14,0x1c,0x16,0x15,0x13,0x1c,0x17,0x1f,0x11,0x13,0x17,0x0c,0x16,0x0d,0x0d,0x09,0x20,0x16,0x15,0x13,0x13, -0x16,0x22,0x22,0x23,0x25,0x25,0x14,0x12,0x0a,0x13,0x11,0x17,0x11,0x19,0x09,0x15,0x16,0x20,0x20,0x17,0x14,0x15,0x14,0x13,0x11,0x13,0x11,0x12,0x0b,0x0c,0x09,0x08,0x0d,0x15,0x17,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x00,0x0b,0x0b,0x0b,0x09,0x09,0x3e,0x25,0x20,0x27,0x0b,0x0b,0x0c, -0x0f,0x09,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x22,0x0c,0x0c,0x22,0x0a,0x13,0x13,0x31,0x25,0x25,0x31,0x22,0x13,0x13,0x22,0x13,0x13,0x0f,0x0f,0x00,0x00,0x0d,0x1c,0x16,0x1a,0x15,0x2e,0x26,0x1a,0x14,0x1a,0x14,0x31,0x25,0x1c,0x16,0x0e,0x0c,0x17,0x00,0x19,0x14,0x0c,0x0b,0x06,0x12,0x0c,0x0d,0x09,0x07, -0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x08,0x13,0x10,0x16,0x15,0x14,0x24,0x1e,0x1e,0x1d,0x1e,0x23,0x17,0x19,0x16,0x0f,0x22,0x2a,0x10,0x2b,0x13,0x1f,0x22,0x22,0x22,0x0f,0x1c,0x25,0x1c,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x16,0x16,0x16,0x1f,0x13,0x13,0x22,0x0c,0x0c, -0x22,0x0c,0x0c,0x22,0x12,0x12,0x00,0x0f,0x1f,0x0c,0x0c,0x25,0x13,0x13,0x1c,0x13,0x13,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x38,0x38,0x21,0x00,0x00,0x21,0x21,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x19,0x17,0x18,0x18,0x21,0x18,0x17,0x1e, -0x24,0x18,0x17,0x28,0x17,0x17,0x23,0x17,0x19,0x1d,0x18,0x1c,0x1f,0x22,0x18,0x1c,0x18,0x1a,0x17,0x1a,0x17,0x18,0x19,0x17,0x1d,0x16,0x19,0x1d,0x17,0x17,0x15,0x1d,0x18,0x18,0x18,0x1a,0x11,0x14,0x18,0x1d,0x1d,0x14,0x00,0x00,0x2a,0x54,0x1b,0x00,0x04,0x0c,0x0c,0x10,0x19,0x17,0x22,0x22,0x0a,0x0d,0x0d,0x12,0x1d,0x09,0x11,0x09, -0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x09,0x09,0x1d,0x1d,0x1d,0x13,0x28,0x1b,0x18,0x1a,0x1d,0x15,0x15,0x1d,0x1e,0x0b,0x0f,0x18,0x14,0x26,0x1f,0x20,0x18,0x20,0x19,0x16,0x16,0x1d,0x1a,0x27,0x19,0x17,0x18,0x0d,0x10,0x0d,0x1d,0x11,0x0b,0x15,0x19,0x13,0x19,0x16,0x0d,0x19,0x18,0x0a,0x0a,0x15,0x0a,0x24,0x18, -0x19,0x19,0x19,0x0f,0x12,0x0e,0x18,0x14,0x1e,0x13,0x14,0x13,0x0d,0x0a,0x0d,0x1d,0x1b,0x1b,0x1a,0x15,0x1f,0x20,0x1d,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x16,0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x18,0x19,0x19,0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x10,0x10,0x17,0x17,0x13,0x11,0x13,0x17,0x11,0x25,0x25,0x20,0x0c,0x11,0x1d,0x24, -0x20,0x22,0x1d,0x1d,0x1d,0x17,0x18,0x16,0x1a,0x20,0x17,0x10,0x12,0x20,0x23,0x19,0x13,0x0c,0x0c,0x1d,0x1b,0x17,0x1d,0x1b,0x15,0x15,0x1f,0x1b,0x1b,0x20,0x27,0x27,0x15,0x2a,0x10,0x10,0x0a,0x0a,0x1d,0x19,0x14,0x17,0x07,0x17,0x0d,0x0d,0x17,0x17,0x10,0x09,0x0a,0x10,0x33,0x1b,0x15,0x1b,0x15,0x15,0x0b,0x0b,0x0b,0x0b,0x20,0x20, -0x20,0x1d,0x1d,0x1d,0x0a,0x10,0x0e,0x0d,0x0d,0x08,0x0c,0x09,0x0e,0x08,0x10,0x14,0x0c,0x16,0x12,0x18,0x13,0x0a,0x1d,0x17,0x17,0x14,0x18,0x19,0x1d,0x1d,0x0f,0x0f,0x0f,0x27,0x26,0x28,0x15,0x1d,0x19,0x0b,0x16,0x12,0x1a,0x13,0x1a,0x13,0x19,0x11,0x09,0x1b,0x15,0x1b,0x15,0x1d,0x1c,0x1d,0x15,0x16,0x15,0x16,0x14,0x0a,0x14,0x0d, -0x14,0x0d,0x1f,0x18,0x1f,0x18,0x20,0x19,0x19,0x0f,0x19,0x0f,0x16,0x12,0x16,0x0e,0x16,0x12,0x1d,0x18,0x1d,0x18,0x18,0x13,0x18,0x13,0x14,0x20,0x20,0x1a,0x19,0x12,0x18,0x14,0x1d,0x11,0x14,0x10,0x2f,0x1a,0x15,0x19,0x0a,0x10,0x22,0x0e,0x19,0x0f,0x0f,0x19,0x0f,0x1b,0x15,0x1a,0x13,0x1a,0x13,0x15,0x16,0x15,0x16,0x15,0x16,0x1d, -0x19,0x1d,0x19,0x1d,0x19,0x1e,0x18,0x1e,0x18,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0f,0x0a,0x18,0x15,0x15,0x14,0x0a,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x19,0x0f,0x16,0x12,0x16,0x0e,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x27,0x1e,0x17,0x14,0x0a,0x1b,0x15,0x24,0x23,0x20,0x19,0x09,0x27,0x1e,0x27,0x1e,0x27,0x1e, -0x17,0x14,0x0a,0x11,0x17,0x19,0x27,0x27,0x27,0x25,0x10,0x10,0x09,0x0b,0x0b,0x1b,0x18,0x21,0x10,0x22,0x1c,0x23,0x0b,0x1b,0x18,0x15,0x18,0x1e,0x0b,0x18,0x1a,0x26,0x1f,0x15,0x20,0x1e,0x18,0x16,0x16,0x17,0x19,0x21,0x20,0x0b,0x17,0x1a,0x12,0x18,0x0b,0x17,0x17,0x16,0x13,0x18,0x19,0x0b,0x16,0x15,0x18,0x16,0x13,0x19,0x19,0x13, -0x17,0x17,0x20,0x22,0x0b,0x17,0x19,0x17,0x22,0x15,0x1d,0x14,0x1a,0x16,0x0b,0x29,0x29,0x1e,0x18,0x18,0x1e,0x1b,0x18,0x18,0x14,0x1d,0x15,0x24,0x17,0x1f,0x1f,0x18,0x1c,0x26,0x1e,0x20,0x1e,0x18,0x1a,0x16,0x18,0x1f,0x19,0x1f,0x1c,0x28,0x29,0x1e,0x21,0x18,0x1a,0x2b,0x19,0x15,0x18,0x16,0x10,0x17,0x16,0x1f,0x13,0x18,0x18,0x15, -0x16,0x1d,0x18,0x19,0x18,0x19,0x13,0x11,0x14,0x1d,0x13,0x19,0x18,0x22,0x23,0x19,0x1e,0x15,0x13,0x22,0x15,0x16,0x18,0x10,0x13,0x12,0x0a,0x21,0x22,0x18,0x15,0x14,0x18,0x14,0x10,0x2a,0x2f,0x1a,0x0f,0x0f,0x0f,0x0f,0x0a,0x16,0x12,0x17,0x20,0x19,0x1e,0x19,0x0d,0x0e,0x0b,0x0b,0x14,0x14,0x14,0x14,0x0d,0x0d,0x0d,0x14,0x0d,0x14, -0x0d,0x0d,0x0d,0x14,0x14,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x0b,0x0a,0x0b,0x0a,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20, -0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x1d,0x18,0x1d,0x18,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x17,0x14,0x17,0x14,0x17,0x14,0x16,0x0e,0x15,0x16,0x1f,0x18,0x0b,0x0f,0x0a,0x0a,0x16,0x11,0x26,0x21,0x1a,0x16,0x18,0x15,0x1f,0x19,0x17,0x14,0x17,0x14,0x1a,0x15,0x1c,0x18,0x1c,0x18,0x1e,0x16,0x20,0x19,0x0d, -0x0d,0x0d,0x0d,0x11,0x11,0x14,0x14,0x14,0x14,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x15,0x16,0x1b,0x15,0x18,0x19,0x18,0x19,0x18,0x19,0x1a,0x13,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x0d,0x1d,0x19,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x0b,0x0a,0x0b, -0x0a,0x18,0x15,0x18,0x15,0x18,0x15,0x14,0x0a,0x14,0x0a,0x14,0x0a,0x14,0x0a,0x26,0x24,0x26,0x24,0x26,0x24,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x18,0x19,0x18,0x19,0x19,0x0f,0x19,0x0f,0x19,0x0f,0x19,0x0f,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x0e,0x16,0x0e,0x16, -0x0e,0x16,0x0e,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1a,0x14,0x1a,0x14,0x27,0x1e,0x27,0x1e,0x19,0x13,0x19,0x13,0x17,0x14,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x0e,0x1e,0x14,0x15,0x0a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x1e, -0x1e,0x1e,0x1e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x15,0x15,0x16,0x16,0x16,0x16,0x19,0x19,0x19,0x19,0x19,0x19,0x22,0x22,0x28,0x28,0x28,0x28,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x23,0x23,0x28,0x28,0x28,0x28,0x28,0x28,0x1a,0x1a,0x12,0x12,0x18,0x18,0x0b,0x0b,0x19,0x19,0x17,0x17,0x22,0x22,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x21,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x22,0x22,0x22,0x22,0x22,0x22,0x22, -0x22,0x23,0x23,0x28,0x28,0x28,0x28,0x28,0x28,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x21,0x21,0x1e,0x19,0x19,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x10,0x19,0x19,0x19,0x17,0x17,0x17,0x17,0x19,0x19,0x17,0x17,0x17,0x17,0x1c,0x1c, -0x1a,0x19,0x19,0x19,0x22,0x22,0x22,0x22,0x22,0x23,0x23,0x23,0x23,0x20,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x1a,0x18,0x19,0x18,0x19,0x1a,0x1a,0x14,0x1d,0x1f,0x18,0x19,0x19,0x15,0x17,0x15,0x1d,0x1a,0x25,0x0c,0x0c,0x18,0x15,0x0a,0x15,0x25,0x1f,0x18,0x20,0x29,0x21,0x19,0x19, -0x18,0x16,0x12,0x16,0x0c,0x0e,0x16,0x0e,0x16,0x20,0x1e,0x18,0x16,0x18,0x13,0x1a,0x1a,0x13,0x11,0x17,0x17,0x10,0x11,0x17,0x0a,0x10,0x13,0x0c,0x34,0x30,0x2b,0x24,0x1e,0x15,0x2d,0x29,0x22,0x1b,0x15,0x0b,0x0a,0x20,0x19,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x16,0x1b,0x15,0x1b,0x15,0x24,0x23,0x1d,0x19,0x1d,0x19, -0x18,0x15,0x20,0x19,0x20,0x19,0x1a,0x13,0x0a,0x34,0x30,0x2b,0x1d,0x19,0x2a,0x1d,0x1f,0x18,0x1b,0x15,0x1b,0x15,0x15,0x16,0x15,0x16,0x0b,0x0a,0x0b,0x0a,0x20,0x19,0x20,0x19,0x18,0x0f,0x19,0x0f,0x1d,0x18,0x1d,0x18,0x15,0x12,0x1e,0x18,0x1f,0x19,0x18,0x18,0x13,0x1b,0x15,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x17,0x14,0x19, -0x15,0x18,0x18,0x19,0x15,0x19,0x19,0x19,0x14,0x14,0x19,0x19,0x16,0x1a,0x11,0x11,0x15,0x17,0x0c,0x19,0x19,0x16,0x14,0x13,0x18,0x18,0x18,0x0b,0x0c,0x0d,0x0c,0x10,0x0a,0x19,0x24,0x24,0x24,0x17,0x17,0x19,0x19,0x1d,0x1e,0x1b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x13,0x13,0x11,0x0a,0x0b,0x0c,0x0c,0x0e,0x0e,0x19,0x19,0x17,0x14, -0x1e,0x14,0x12,0x13,0x16,0x13,0x13,0x0f,0x0f,0x0f,0x14,0x1a,0x14,0x17,0x16,0x18,0x0a,0x15,0x10,0x19,0x0f,0x0f,0x26,0x28,0x29,0x1a,0x14,0x1e,0x21,0x18,0x18,0x15,0x15,0x17,0x19,0x18,0x1c,0x18,0x1b,0x22,0x18,0x1d,0x19,0x18,0x13,0x15,0x13,0x19,0x15,0x1a,0x15,0x25,0x24,0x19,0x15,0x1b,0x16,0x1a,0x13,0x19,0x14,0x1c,0x19,0x18, -0x11,0x18,0x18,0x13,0x0a,0x20,0x14,0x14,0x24,0x1c,0x1b,0x18,0x26,0x1e,0x1c,0x15,0x25,0x1d,0x1f,0x18,0x27,0x1f,0x17,0x13,0x21,0x20,0x20,0x19,0x1e,0x18,0x1e,0x18,0x37,0x2f,0x23,0x1b,0x2f,0x26,0x24,0x1c,0x19,0x12,0x15,0x11,0x11,0x00,0x00,0x29,0x28,0x18,0x15,0x18,0x19,0x18,0x15,0x17,0x13,0x18,0x15,0x1e,0x18,0x23,0x1c,0x2a, -0x23,0x1e,0x17,0x1a,0x13,0x16,0x11,0x25,0x1d,0x1d,0x19,0x23,0x1b,0x23,0x1b,0x0b,0x24,0x1f,0x18,0x15,0x1e,0x18,0x1c,0x18,0x1b,0x15,0x1b,0x15,0x24,0x23,0x15,0x16,0x1e,0x16,0x1e,0x16,0x24,0x1f,0x17,0x13,0x16,0x13,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x1a,0x13,0x18,0x14,0x18,0x14,0x18,0x14,0x1c,0x18,0x21,0x1e,0x18,0x19, -0x24,0x24,0x22,0x1e,0x17,0x14,0x26,0x21,0x2a,0x24,0x1e,0x16,0x1c,0x19,0x19,0x18,0x18,0x15,0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x19,0x0e,0x0e,0x07,0x09,0x09,0x09,0x0c,0x11,0x0c,0x0a,0x10,0x09,0x09,0x09,0x0e,0x0e,0x09,0x09,0x19,0x19,0x19,0x19,0x0e,0x0c,0x0b,0x0e,0x0d,0x0b, -0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0e,0x0e,0x0c,0x07,0x0a,0x0c,0x09,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x11,0x0e,0x0a,0x0b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17, -0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1b,0x0e,0x19,0x19,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0e, -0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x19,0x14,0x1c,0x23,0x14,0x13,0x17,0x17,0x12,0x11,0x0a,0x0d,0x15,0x10,0x1d,0x18,0x19,0x14,0x1a,0x1a,0x1a,0x27,0x17,0x19,0x19,0x13,0x13,0x13,0x11,0x16,0x18,0x1e,0x18,0x14,0x1e,0x13,0x12,0x11,0x16,0x10,0x14,0x18,0x13,0x19,0x18,0x0f,0x14,0x0f,0x0f, -0x11,0x0d,0x0d,0x11,0x12,0x08,0x0a,0x0f,0x0c,0x16,0x12,0x12,0x12,0x10,0x0e,0x0e,0x0c,0x11,0x16,0x0d,0x0d,0x0f,0x14,0x0f,0x0f,0x0d,0x0d,0x0b,0x0b,0x0f,0x07,0x0d,0x15,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x08,0x0e,0x0e,0x15,0x0c,0x0d,0x0e,0x0c,0x0e,0x11,0x0d,0x07,0x09,0x0e,0x0c,0x0e,0x0c,0x0f,0x11,0x0d,0x18,0x07,0x0f,0x17,0x25, -0x1a,0x17,0x17,0x24,0x1b,0x24,0x1f,0x16,0x19,0x15,0x13,0x2f,0x13,0x19,0x25,0x27,0x27,0x1a,0x1b,0x1a,0x13,0x14,0x16,0x12,0x13,0x15,0x08,0x00,0x00,0x00,0x00,0x19,0x1a,0x1a,0x1a,0x14,0x10,0x19,0x19,0x0d,0x24,0x18,0x19,0x0f,0x0e,0x13,0x0e,0x13,0x19,0x13,0x18,0x26,0x1b,0x0d,0x0b,0x19,0x16,0x19,0x19,0x19,0x0d,0x19,0x15,0x0a, -0x24,0x18,0x19,0x0f,0x12,0x12,0x14,0x13,0x13,0x15,0x19,0x19,0x16,0x12,0x13,0x1f,0x0a,0x14,0x0a,0x18,0x13,0x0f,0x0b,0x0b,0x0e,0x0b,0x08,0x07,0x0f,0x0e,0x07,0x08,0x07,0x07,0x07,0x08,0x07,0x09,0x15,0x15,0x0e,0x0e,0x0f,0x0e,0x0f,0x0a,0x07,0x08,0x0e,0x0e,0x0e,0x0e,0x0c,0x0b,0x0b,0x0c,0x0b,0x0e,0x00,0x00,0x00,0x00,0x09,0x0d, -0x0d,0x0e,0x0b,0x0d,0x17,0x17,0x17,0x17,0x0e,0x00,0x00,0x00,0x00,0x13,0x0d,0x0b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0b,0x0b,0x0b,0x0b,0x17,0x17,0x17,0x17,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x17,0x0f,0x0f,0x0f,0x0f,0x0f, -0x0f,0x0d,0x0d,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x21,0x1b,0x1e,0x18,0x1f,0x1a,0x27,0x20,0x17,0x10,0x16,0x1d,0x16,0x22,0x1d,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x19,0x19,0x19,0x19, -0x19,0x19,0x23,0x23,0x2a,0x12,0x0b,0x15,0x19,0x12,0x15,0x15,0x19,0x19,0x15,0x2a,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x1b,0x15,0x15,0x15,0x0e,0x19,0x0e,0x20,0x1c,0x15,0x0e,0x23,0x15,0x23,0x0b,0x0e,0x19,0x19,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x23,0x0b,0x19,0x0b,0x15,0x12,0x0b,0x0b,0x15,0x0b,0x20,0x0b,0x27,0x15,0x27,0x27, -0x19,0x19,0x19,0x15,0x15,0x12,0x12,0x31,0x31,0x38,0x38,0x23,0x23,0x15,0x15,0x07,0x2a,0x20,0x23,0x1c,0x19,0x1c,0x15,0x15,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x1b,0x00,0x1b,0x1b,0x1b,0x0e,0x15,0x15,0x27,0x0e,0x27,0x0e,0x19,0x1c,0x19,0x12,0x27,0x15,0x27,0x15,0x20,0x23,0x0e,0x15,0x15,0x12,0x0b,0x15, -0x19,0x15,0x19,0x15,0x19,0x19,0x15,0x1c,0x1b,0x27,0x0e,0x15,0x12,0x1c,0x15,0x0e,0x15,0x15,0x15,0x27,0x0e,0x27,0x0e,0x0b,0x19,0x10,0x2a,0x15,0x15,0x1b,0x1b,0x2a,0x15,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1b,0x1b,0x1b,0x20,0x1b,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x15,0x15,0x20,0x23,0x27,0x0e,0x27,0x0e,0x27,0x0e, -0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x12,0x12,0x12,0x15,0x12,0x12,0x12,0x31,0x23,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x15,0x19,0x19,0x19,0x2a,0x2a,0x15,0x15,0x2a,0x15,0x15,0x2a,0x15,0x15, -0x2a,0x15,0x15,0x20,0x20,0x2e,0x2a,0x27,0x15,0x23,0x15,0x23,0x15,0x23,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x1c,0x0e,0x1c,0x0e,0x17,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x23,0x27,0x20,0x23,0x0e,0x15,0x20,0x23,0x20,0x23,0x00,0x00,0x00, -0x00,0x00,0x2f,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x12,0x00,0x00,0x19,0x00,0x00,0x00,0x31,0x23,0x38,0x2a,0x15,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x27,0x27,0x10,0x19,0x19,0x19,0x34,0x23,0x16,0x40,0x2e,0x0e,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x15,0x15,0x12,0x12,0x20,0x1c,0x1c,0x15,0x00,0x00,0x00,0x0e,0x0e,0x0e,0x0e,0x35,0x3f,0x00,0x00,0x00,0x00,0x00,0x19,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x12,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x1c,0x19,0x15,0x15,0x12,0x31,0x23,0x15,0x19,0x19,0x19,0x15,0x19,0x19, -0x19,0x15,0x19,0x19,0x19,0x2a,0x15,0x15,0x2a,0x15,0x15,0x27,0x15,0x15,0x27,0x15,0x15,0x27,0x15,0x15,0x19,0x19,0x19,0x19,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x1c,0x0e,0x0e,0x12,0x12,0x31,0x23,0x1b,0x19,0x19,0x00,0x15,0x15,0x15,0x10,0x18,0x1d,0x1a,0x15,0x16,0x0f,0x0a,0x20,0x19,0x19,0x0f,0x17,0x14,0x14,0x13,0x14,0x0a,0x16, -0x11,0x1a,0x14,0x19,0x13,0x17,0x12,0x1c,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x13,0x14,0x14,0x0c,0x16,0x18,0x19,0x15,0x0e,0x1f,0x19,0x1b,0x17,0x1a,0x15,0x18,0x16,0x11,0x1d,0x10,0x11,0x12,0x14,0x19,0x19,0x15,0x2a,0x15,0x2a,0x0e,0x0b,0x07,0x17,0x09,0x05,0x00,0x06,0x09,0x00,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x15,0x27,0x12,0x20,0x19,0x27,0x1e,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x27,0x24,0x14,0x24,0x14,0x24,0x1b,0x1d,0x1d,0x1d,0x20,0x24,0x2a,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1d,0x1f,0x18,0x2d,0x23,0x14,0x14,0x0c,0x0c,0x0c,0x10,0x09,0x18,0x0a,0x0a,0x23, -0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x08,0x00,0x00,0x09,0x00,0x00,0x1b,0x18,0x12,0x14,0x1c,0x0b,0x0e,0x1c,0x1d,0x0b,0x17,0x17,0x17,0x1d,0x1c,0x0b,0x11,0x1c,0x19,0x1a,0x1b,0x18,0x19,0x1c,0x17,0x21,0x1f,0x16,0x16,0x16,0x0a,0x10,0x17,0x17,0x17,0x17,0x17,0x19,0x1b,0x14,0x1c,0x17, -0x17,0x1d,0x17,0x1f,0x17,0x21,0x21,0x21,0x21,0x1b,0x1b,0x1b,0x18,0x12,0x14,0x1c,0x0d,0x0f,0x1d,0x0d,0x17,0x17,0x17,0x1c,0x11,0x1c,0x1a,0x1b,0x19,0x1c,0x17,0x21,0x1f,0x0b,0x18,0x17,0x1b,0x1b,0x32,0x00,0x1b,0x17,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x0b,0x00,0x20,0x1b,0x1c,0x1e,0x17,0x1c,0x1f,0x20,0x14,0x1a,0x1f,0x1f,0x1c,0x20,0x22,0x21,0x1c,0x17,0x18,0x20,0x1e,0x18,0x1d,0x1c,0x1c,0x1c,0x1d,0x1f,0x18,0x1b,0x1c,0x1b,0x21,0x1b,0x1a,0x1b,0x1c,0x22,0x15,0x19,0x19,0x25,0x17,0x17,0x20,0x25,0x1a,0x17, -0x2c,0x18,0x18,0x20,0x17,0x17,0x20,0x18,0x20,0x22,0x25,0x17,0x20,0x17,0x1b,0x17,0x1a,0x18,0x1b,0x17,0x19,0x20,0x17,0x1a,0x1c,0x17,0x17,0x19,0x28,0x17,0x17,0x19,0x19,0x12,0x0e,0x17,0x17,0x17,0x16,0x17,0x25,0x17,0x25,0x15,0x17,0x25,0x1c,0x17,0x25,0x1f,0x1f,0x25,0x18,0x17,0x25,0x25,0x17,0x17,0x17,0x17,0x17,0x17,0x25,0x25, -0x19,0x17,0x18,0x25,0x19,0x17,0x17,0x17,0x25,0x21,0x1d,0x1d,0x1d,0x1d,0x1e,0x1a,0x1d,0x21,0x1d,0x1b,0x17,0x21,0x1c,0x1d,0x18,0x1c,0x1d,0x1f,0x1e,0x19,0x1d,0x1c,0x1f,0x1c,0x21,0x1d,0x1e,0x1f,0x1d,0x1b,0x1d,0x1d,0x1e,0x21,0x1c,0x20,0x1e,0x04,0x05,0x06,0x08,0x06,0x0b,0x0f,0x24,0x18,0x1a,0x19,0x18,0x1a,0x18,0x18,0x1b,0x19, -0x18,0x0d,0x23,0x19,0x18,0x18,0x17,0x19,0x16,0x18,0x0b,0x19,0x16,0x18,0x11,0x24,0x17,0x18,0x18,0x19,0x23,0x18,0x19,0x11,0x23,0x19,0x19,0x1d,0x1d,0x09,0x0c,0x30,0x2f,0x2f,0x30,0x3c,0x17,0x17,0x0a,0x17,0x10,0x17,0x17,0x18,0x17,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x18, -0x17,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x15,0x15,0x15,0x19,0x12,0x12,0x18,0x1a,0x0b,0x0d,0x15,0x11,0x20,0x1b,0x1a,0x14,0x1a,0x15,0x12,0x12,0x19,0x15,0x22,0x15,0x14,0x14,0x1e,0x21,0x11,0x1a,0x14,0x19,0x16,0x15,0x15,0x15,0x15,0x15,0x15, -0x15,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x19,0x19,0x19,0x19,0x14,0x15,0x15,0x15,0x15,0x15,0x18,0x19,0x19,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x15,0x1a,0x1a,0x0b,0x0b,0x0b,0x0b,0x0b,0x18,0x0d,0x15,0x11,0x11,0x11,0x11,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x15,0x15,0x15,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x22,0x22,0x22,0x22,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x1e,0x1a,0x15,0x15,0x10,0x17,0x12,0x14,0x1a,0x1a,0x0b,0x15,0x15,0x20,0x1b,0x13,0x1a,0x1a,0x14,0x13,0x12,0x14,0x1a,0x15,0x1c,0x1b,0x15,0x12,0x1a,0x0b,0x1a,0x14,0x1b,0x0b,0x14,0x12,0x18,0x11,0x16,0x12,0x0b,0x0b,0x0d, -0x22,0x23,0x1a,0x15,0x15,0x1a,0x15,0x14,0x15,0x11,0x19,0x12,0x1f,0x13,0x1b,0x1b,0x15,0x18,0x20,0x1a,0x1a,0x1a,0x14,0x15,0x12,0x15,0x1a,0x15,0x1b,0x17,0x22,0x23,0x18,0x1e,0x15,0x16,0x24,0x15,0x11,0x18,0x18,0x1a,0x25,0x25,0x1c,0x15,0x18,0x12,0x18,0x18,0x18,0x1d,0x16,0x16,0x1d,0x18,0x18,0x0f,0x1a,0x1a,0x18,0x15,0x15,0x26, -0x1f,0x14,0x16,0x19,0x19,0x1a,0x1a,0x1e,0x1d,0x0f,0x27,0x19,0x17,0x18,0x1b,0x1b,0x15,0x15,0x0b,0x20,0x1d,0x1d,0x14,0x1d,0x09,0x09,0x12,0x12,0x09,0x09,0x1a,0x11,0x0b,0x20,0x1e,0x0c,0x09,0x09,0x13,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x1c,0x14,0x0d,0x19,0x1d,0x19,0x18,0x15,0x1f,0x18,0x19,0x0f,0x12,0x16,0x12,0x09,0x0a,0x10,0x16, -0x0e,0x1c,0x1c,0x1c,0x27,0x20,0x27,0x0b,0x00,0x00,0x00,0x00,0x00,0x0b,0x20,0x23,0x0e,0x0e,0x15,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x15,0x15,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x27,0x15,0x15,0x27,0x27,0x15,0x15,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e, -0x0e,0x2a,0x20,0x23,0x15,0x19,0x19,0x1c,0x0e,0x1c,0x20,0x15,0x15,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x27,0x0e,0x20,0x15,0x15,0x0b,0x15,0x15,0x15,0x15,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15, -0x15,0x15,0x15,0x15,0x15,0x15,0x31,0x23,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x23,0x23,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x20,0x15,0x15,0x20,0x15,0x15,0x27,0x15,0x2e,0x2a,0x27,0x15,0x23,0x15,0x23,0x15,0x23,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x1c,0x1c,0x1c,0x1c,0x1c,0x0e,0x1c,0x1c,0x0e, -0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x15,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x0e,0x0e,0x15,0x0e,0x0e,0x0e,0x0e,0x00,0x31,0x23,0x38,0x2a,0x27,0x15,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x15,0x15,0x12,0x31,0x23,0x2a,0x2a,0x27,0x27,0x27,0x19,0x19,0x19,0x19,0x1c,0x0e,0x1c,0x0e, -0x1c,0x0e,0x31,0x23,0x19,0x1c,0x19,0x19,0x19,0x1c,0x19,0x19,0x31,0x31,0x23,0x23,0x12,0x12,0x19,0x19,0x19,0x19,0x0e,0x0e,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x19,0x19,0x19,0x19,0x27,0x0e,0x27,0x0e,0x19,0x1c,0x19,0x19,0x31,0x31,0x23,0x23,0x31,0x31,0x23,0x23,0x23,0x23,0x15,0x15,0x0b,0x0b, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x0b,0x0b,0x0e,0x0b,0x00,0x00,0x00,0x23,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, -0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x20,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x19,0x23,0x19,0x23,0x19,0x23,0x19,0x23,0x1c,0x1c,0x1c,0x0b,0x0b,0x15,0x12,0x18,0x1b,0x18,0x17,0x17,0x19,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x16,0x13,0x17,0x16,0x19,0x1a,0x1a,0x1c,0x18,0x18,0x1b,0x16,0x1c,0x20,0x1b,0x1f,0x23,0x1b,0x20,0x1d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x16,0x13,0x17,0x19,0x19,0x1c,0x18,0x1b,0x18,0x19,0x19,0x15,0x15,0x20,0x1d,0x1d,0x1c,0x1d,0x19,0x18,0x18,0x1f,0x20,0x20,0x20,0x27,0x27,0x1d,0x27,0x27, -0x1f,0x25,0x24,0x17,0x20,0x24,0x20,0x19,0x24,0x1f,0x1d,0x1d,0x19,0x1b,0x1f,0x21,0x1d,0x1a,0x1e,0x18,0x16,0x27,0x27,0x27,0x23,0x27,0x27,0x1d,0x27,0x27,0x1e,0x20,0x21,0x1f,0x1e,0x1e,0x1b,0x25,0x20,0x23,0x1e,0x1e,0x18,0x1f,0x1d,0x1d,0x24,0x20,0x1e,0x26,0x17,0x15,0x17,0x17,0x1a,0x1a,0x1d,0x1f,0x18,0x18,0x18,0x17,0x18,0x17, -0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x15,0x16,0x19,0x1a,0x19,0x19,0x13,0x18,0x18,0x19,0x19,0x20,0x23,0x1b,0x1b,0x1a,0x20,0x1b,0x1d,0x16,0x14,0x19,0x18,0x14,0x15,0x17,0x17,0x14,0x14,0x1a,0x13,0x17,0x15,0x17,0x21,0x18,0x23,0x17,0x18,0x18,0x1f,0x0d,0x21,0x1d,0x1e,0x1c,0x18,0x20,0x19,0x21,0x19,0x19,0x19,0x19,0x19,0x19,0x18, -0x19,0x19,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x14,0x13,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x1a,0x0b,0x0b,0x0b,0x0d,0x0d,0x0b,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x26,0x26,0x26,0x26,0x15,0x1f,0x1e,0x15,0x11,0x15,0x16,0x17,0x15,0x23,0x23,0x24,0x13,0x2a,0x15,0x23,0x23,0x23,0x22,0x18,0x15, -0x15,0x21,0x19,0x21,0x1c,0x16,0x13,0x11,0x2b,0x11,0x16,0x15,0x15,0x15,0x15,0x15,0x39,0x23,0x23,0x12,0x0b,0x13,0x0a,0x13,0x0a,0x0a,0x0a,0x14,0x19,0x19,0x17,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x0a,0x11,0x24,0x09,0x26,0x26,0x26,0x19,0x19,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x31,0x31,0x1c,0x31,0x31,0x1c,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x14,0x18,0x14,0x16,0x12,0x0f,0x0f,0x1d,0x17,0x1e,0x12,0x2f,0x26,0x19,0x17,0x27,0x21,0x23,0x1f,0x2b,0x22,0x27,0x20,0x1b,0x14,0x1f,0x19,0x27,0x1f,0x20,0x1a,0x1f,0x19, -0x24,0x1c,0x25,0x1c,0x2e,0x23,0x20,0x19,0x20,0x19,0x33,0x25,0x21,0x00,0x29,0x29,0x29,0x14,0x00,0x00,0x18,0x15,0x1d,0x17,0x16,0x12,0x2d,0x26,0x28,0x24,0x1e,0x18,0x1d,0x19,0x16,0x11,0x1f,0x19,0x16,0x11,0x22,0x1c,0x1c,0x18,0x29,0x22,0x17,0x18,0x1f,0x1f,0x22,0x13,0x08,0x13,0x1d,0x12,0x2a,0x2a,0x0a,0x00,0x29,0x29,0x29,0x29, -0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x11,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x17,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, -0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x1c,0x1f,0x0c,0x09,0x0c,0x09,0x1e,0x18,0x1f,0x1a,0x17,0x14,0x16,0x14,0x19,0x18,0x12,0x12,0x2f,0x22,0x30,0x25,0x29,0x24,0x26,0x1c,0x26,0x1c,0x26,0x1c,0x1a,0x13,0x18,0x15,0x18,0x15,0x18,0x15,0x17,0x0d,0x14,0x0a,0x20,0x19,0x24,0x1c,0x38,0x2a,0x18, -0x19,0x1d,0x1e,0x22,0x24,0x20,0x19,0x29,0x21,0x17,0x11,0x17,0x15,0x1a,0x14,0x27,0x1e,0x1a,0x16,0x18,0x19,0x18,0x19,0x14,0x11,0x14,0x10,0x14,0x0f,0x16,0x16,0x0d,0x1c,0x0e,0x28,0x1c,0x0f,0x18,0x1a,0x13,0x20,0x17,0x10,0x0f,0x18,0x18,0x18,0x14,0x0a,0x20,0x19,0x10,0x0f,0x1a,0x13,0x1e,0x10,0x21,0x19,0x1a,0x13,0x1d,0x19,0x18, -0x15,0x1f,0x18,0x19,0x0f,0x16,0x12,0x20,0x12,0x16,0x24,0x15,0x18,0x26,0x0b,0x30,0x26,0x26,0x32,0x25,0x26,0x26,0x25,0x25,0x27,0x16,0x14,0x1a,0x1d,0x26,0x1d,0x28,0x0a,0x13,0x19,0x24,0x2b,0x1d,0x2b,0x1a,0x1a,0x21,0x1d,0x30,0x27,0x16,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x23,0x23,0x23,0x23,0x2a,0x15,0x15,0x2a,0x20,0x15, -0x15,0x20,0x1c,0x0e,0x0e,0x1c,0x19,0x19,0x19,0x19,0x20,0x0e,0x0e,0x23,0x20,0x0e,0x0e,0x23,0x12,0x12,0x15,0x15,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x16,0x11,0x18,0x16,0x1f,0x18,0x18,0x25,0x1c,0x1f,0x20,0x23, -0x22,0x18,0x15,0x2a,0x22,0x2c,0x24,0x1d,0x19,0x0d,0x0d,0x19,0x1b,0x11,0x19,0x16,0x18,0x14,0x1f,0x22,0x11,0x19,0x12,0x09,0x10,0x16,0x17,0x09,0x09,0x08,0x09,0x10,0x10,0x10,0x13,0x3f,0x54,0x0e,0x11,0x06,0x0b,0x10,0x12,0x0d,0x15,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x38,0x17,0x20, -0x27,0x26,0x1b,0x13,0x18,0x1e,0x1f,0x15,0x0d,0x1c,0x16,0x1d,0x17,0x1c,0x16,0x17,0x1f,0x19,0x18,0x16,0x1f,0x1a,0x23,0x13,0x16,0x1b,0x0d,0x19,0x0e,0x0f,0x0a,0x25,0x18,0x18,0x16,0x16,0x19,0x27,0x27,0x28,0x2a,0x2a,0x17,0x15,0x0c,0x15,0x13,0x1a,0x13,0x1c,0x0a,0x18,0x19,0x24,0x24,0x1a,0x17,0x18,0x17,0x16,0x13,0x16,0x13,0x14, -0x0d,0x0e,0x0a,0x09,0x0f,0x18,0x1b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x00,0x0c,0x0c,0x0c,0x0b,0x0b,0x47,0x2a,0x25,0x2c,0x0c,0x0c,0x0e,0x11,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x27,0x0e,0x0e,0x27,0x0b,0x15,0x15,0x38,0x2a,0x2a,0x38,0x27,0x15,0x15, -0x27,0x15,0x15,0x12,0x12,0x00,0x00,0x0f,0x1f,0x19,0x1e,0x18,0x35,0x2b,0x1d,0x17,0x1d,0x17,0x38,0x2a,0x20,0x19,0x10,0x0d,0x1a,0x00,0x1d,0x17,0x0e,0x0d,0x07,0x15,0x0e,0x0e,0x0b,0x08,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x09,0x16,0x12,0x19,0x18,0x17,0x28,0x22,0x22,0x21,0x22,0x28,0x1a,0x1d,0x19,0x11,0x27,0x2f,0x12, -0x31,0x15,0x23,0x27,0x27,0x27,0x12,0x20,0x2a,0x20,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x19,0x19,0x19,0x23,0x15,0x15,0x27,0x0e,0x0e,0x27,0x0e,0x0e,0x27,0x15,0x15,0x00,0x12,0x23,0x0e,0x0e,0x2a,0x15,0x15,0x20,0x15,0x15,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0c,0x0c,0x0c,0x3f,0x3f,0x25,0x00,0x00,0x25,0x25,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x1c,0x1a,0x1b,0x1b,0x25,0x1b,0x1a,0x22,0x29,0x1b,0x1a,0x2d,0x1b,0x1b,0x27,0x1a,0x1c,0x21,0x1b,0x20,0x24,0x26,0x1b,0x20,0x1b,0x1d,0x1a,0x1d,0x1a,0x1c,0x1d,0x1a,0x21,0x19,0x1c,0x21, -0x1a,0x1a,0x18,0x21,0x1b,0x1b,0x1b,0x1d,0x13,0x16,0x1b,0x21,0x21,0x17,0x00,0x00,0x2e,0x5c,0x1e,0x00,0x04,0x0d,0x0d,0x12,0x1b,0x19,0x26,0x25,0x0b,0x0e,0x0e,0x13,0x1f,0x0a,0x12,0x0a,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0a,0x0a,0x1f,0x1f,0x1f,0x15,0x2c,0x1e,0x1a,0x1c,0x20,0x17,0x16,0x20,0x21,0x0c,0x10, -0x1b,0x16,0x29,0x22,0x23,0x1a,0x23,0x1c,0x18,0x18,0x20,0x1d,0x2b,0x1b,0x19,0x1a,0x0e,0x11,0x0e,0x1f,0x13,0x0c,0x17,0x1b,0x15,0x1b,0x18,0x0e,0x1b,0x1a,0x0b,0x0b,0x17,0x0b,0x28,0x1a,0x1b,0x1b,0x1b,0x10,0x14,0x10,0x1a,0x16,0x21,0x15,0x16,0x15,0x0e,0x0b,0x0e,0x1f,0x1e,0x1e,0x1c,0x17,0x22,0x23,0x20,0x17,0x17,0x17,0x17,0x17, -0x17,0x15,0x18,0x18,0x18,0x18,0x0b,0x0b,0x0b,0x0b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x19,0x19,0x15,0x13,0x15,0x19,0x12,0x29,0x29,0x24,0x0d,0x13,0x20,0x28,0x23,0x26,0x1f,0x20,0x20,0x19,0x1b,0x19,0x1c,0x23,0x19,0x12,0x14,0x23,0x26,0x1b,0x15,0x0d,0x0d,0x1f,0x1e,0x19,0x20,0x1e,0x17,0x17,0x22,0x1e, -0x1e,0x23,0x2b,0x2b,0x17,0x2e,0x11,0x11,0x0b,0x0b,0x1f,0x1b,0x16,0x19,0x08,0x19,0x0f,0x0f,0x1a,0x1a,0x11,0x0a,0x0b,0x11,0x38,0x1e,0x17,0x1e,0x17,0x17,0x0c,0x0c,0x0c,0x0c,0x23,0x23,0x23,0x20,0x20,0x20,0x0b,0x11,0x10,0x0e,0x0e,0x09,0x0d,0x09,0x0f,0x09,0x11,0x16,0x0d,0x18,0x14,0x1a,0x15,0x0b,0x20,0x1a,0x19,0x16,0x1a,0x1b, -0x1f,0x1f,0x10,0x11,0x11,0x2b,0x2a,0x2c,0x16,0x20,0x1b,0x0c,0x18,0x14,0x1c,0x15,0x1c,0x15,0x1b,0x13,0x0a,0x1e,0x17,0x1e,0x17,0x20,0x1f,0x20,0x17,0x18,0x17,0x18,0x16,0x0b,0x16,0x0e,0x16,0x0e,0x22,0x1a,0x22,0x1a,0x23,0x1b,0x1c,0x10,0x1c,0x10,0x18,0x14,0x18,0x10,0x18,0x14,0x20,0x1a,0x20,0x1a,0x1a,0x15,0x1a,0x15,0x16,0x23, -0x23,0x1c,0x1b,0x14,0x1a,0x16,0x20,0x13,0x16,0x12,0x33,0x1d,0x17,0x1c,0x0b,0x11,0x25,0x0f,0x1c,0x10,0x10,0x1c,0x10,0x1e,0x17,0x1c,0x15,0x1c,0x15,0x17,0x18,0x17,0x18,0x17,0x18,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x21,0x1a,0x21,0x1a,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x10,0x0b,0x1b,0x17,0x17,0x16,0x0b,0x22,0x1a,0x22,0x1a, -0x23,0x1b,0x23,0x1b,0x1c,0x10,0x18,0x14,0x18,0x10,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x2b,0x21,0x19,0x16,0x0b,0x1e,0x17,0x28,0x26,0x23,0x1b,0x0a,0x2b,0x21,0x2b,0x21,0x2b,0x21,0x19,0x16,0x0b,0x13,0x19,0x1c,0x2a,0x2a,0x2b,0x29,0x12,0x12,0x0a,0x0d,0x0d,0x1e,0x1a,0x24,0x11,0x25,0x1f,0x26,0x0c,0x1e,0x1a,0x17,0x1a,0x21, -0x0c,0x1b,0x1d,0x29,0x22,0x17,0x23,0x21,0x1a,0x18,0x18,0x19,0x1b,0x24,0x23,0x0c,0x19,0x1c,0x14,0x1a,0x0c,0x19,0x19,0x18,0x14,0x1a,0x1b,0x0c,0x18,0x17,0x1b,0x18,0x14,0x1b,0x1b,0x15,0x19,0x19,0x23,0x25,0x0c,0x19,0x1b,0x19,0x25,0x17,0x20,0x16,0x1c,0x18,0x0c,0x2d,0x2d,0x21,0x1b,0x1a,0x21,0x1e,0x1a,0x1a,0x16,0x20,0x17,0x28, -0x19,0x22,0x22,0x1b,0x1f,0x29,0x21,0x23,0x21,0x1a,0x1c,0x18,0x1a,0x21,0x1b,0x22,0x1e,0x2c,0x2d,0x20,0x24,0x1b,0x1c,0x2f,0x1b,0x17,0x1b,0x18,0x12,0x19,0x18,0x22,0x15,0x1b,0x1b,0x17,0x18,0x20,0x1b,0x1b,0x1b,0x1b,0x15,0x13,0x16,0x20,0x15,0x1c,0x1a,0x25,0x26,0x1b,0x21,0x17,0x15,0x25,0x17,0x18,0x1b,0x12,0x15,0x14,0x0b,0x24, -0x25,0x1a,0x17,0x16,0x1b,0x16,0x12,0x2e,0x34,0x1d,0x10,0x11,0x11,0x11,0x0b,0x18,0x14,0x1a,0x23,0x1b,0x21,0x1b,0x0e,0x0f,0x0c,0x0c,0x16,0x16,0x16,0x16,0x0e,0x0e,0x0e,0x16,0x0e,0x16,0x0e,0x0e,0x0e,0x16,0x16,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e, -0x17,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x0c,0x0b,0x0c,0x0b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x20,0x1a,0x20,0x1a,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x19,0x16,0x19,0x16,0x19, -0x16,0x18,0x10,0x17,0x18,0x22,0x1b,0x0c,0x10,0x0b,0x0b,0x18,0x13,0x2a,0x24,0x1c,0x18,0x1b,0x17,0x22,0x1c,0x19,0x16,0x19,0x16,0x1d,0x17,0x1e,0x1a,0x1e,0x1a,0x21,0x18,0x23,0x1b,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x17,0x18,0x1e,0x17,0x1a,0x1b,0x1a,0x1b,0x1a,0x1b,0x1c,0x15,0x20, -0x1b,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x16,0x0e,0x20,0x1b,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x0c,0x0b,0x0c,0x0b,0x1b,0x17,0x1b,0x17,0x1b,0x17,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x29,0x28,0x29,0x28,0x29,0x28,0x22,0x1a,0x22,0x1a,0x22,0x1a,0x22, -0x1a,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x1a,0x1b,0x1a,0x1b,0x1c,0x10,0x1c,0x10,0x1c,0x10,0x1c,0x10,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x10,0x18,0x10,0x18,0x10,0x18,0x10,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x1d,0x16,0x1d,0x16,0x2b,0x21,0x2b,0x21,0x1b,0x15,0x1b,0x15,0x19,0x16,0x1a, -0x15,0x1a,0x15,0x1a,0x15,0x1a,0x10,0x21,0x16,0x17,0x0b,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x22,0x22,0x22,0x22,0x22,0x22,0x14,0x14,0x14,0x14,0x14,0x14,0x1a,0x1a,0x21,0x21,0x21,0x21,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11, -0x11,0x17,0x17,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x2c,0x2c,0x2c,0x2c,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1f,0x26,0x26,0x26,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x1c,0x1c,0x14,0x14,0x1a,0x1a,0x0c,0x0c,0x1b,0x1b,0x19,0x19,0x25,0x25,0x1c,0x1c,0x1c, -0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x21,0x1b,0x1b,0x1b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x19,0x1b,0x1b,0x19,0x19,0x19,0x19,0x1f,0x1f,0x1d,0x1b,0x1b,0x1b,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x27,0x26,0x23,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x1b,0x1c,0x1a,0x1b,0x1b,0x1b,0x1d,0x1d,0x15,0x20,0x22,0x1a,0x1b,0x1b,0x17,0x19,0x16,0x20,0x1d,0x28,0x0d,0x0d,0x1b,0x17,0x0b,0x17,0x29,0x22,0x1a,0x23,0x2d,0x24,0x1c,0x1b,0x1b,0x18,0x14,0x18,0x0e,0x10,0x18,0x10,0x18,0x23,0x21,0x1a,0x18,0x1a,0x15,0x1c,0x1c,0x14,0x13,0x19,0x19,0x11,0x12,0x19,0x0b,0x12,0x15,0x0d, -0x39,0x34,0x2f,0x27,0x21,0x17,0x31,0x2d,0x25,0x1e,0x17,0x0c,0x0b,0x23,0x1b,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x18,0x1e,0x17,0x1e,0x17,0x28,0x26,0x20,0x1b,0x20,0x1b,0x1b,0x17,0x23,0x1b,0x23,0x1b,0x1c,0x14,0x0b,0x39,0x34,0x2f,0x20,0x1b,0x2e,0x20,0x22,0x1a,0x1e,0x17,0x1e,0x17,0x17,0x18,0x17,0x18,0x0c,0x0b, -0x0c,0x0b,0x23,0x1b,0x23,0x1b,0x1a,0x10,0x1c,0x10,0x20,0x1a,0x20,0x1a,0x17,0x14,0x21,0x1a,0x22,0x1b,0x1a,0x1a,0x15,0x1e,0x17,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x19,0x16,0x1b,0x17,0x1a,0x1a,0x1b,0x17,0x1b,0x1b,0x1b,0x15,0x15,0x1b,0x1b,0x18,0x1c,0x13,0x13,0x17,0x19,0x0d,0x1b,0x1b,0x18,0x16,0x15,0x1a,0x1a,0x1a,0x0c, -0x0d,0x0f,0x0d,0x11,0x0b,0x1c,0x28,0x28,0x28,0x1a,0x1a,0x1b,0x1b,0x20,0x21,0x1d,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x15,0x15,0x12,0x0b,0x0c,0x0d,0x0d,0x10,0x10,0x1c,0x1b,0x1a,0x16,0x21,0x16,0x13,0x15,0x18,0x14,0x14,0x11,0x11,0x11,0x15,0x1c,0x16,0x19,0x18,0x1a,0x0b,0x17,0x12,0x1b,0x11,0x11,0x2a,0x2c,0x2d,0x1c,0x16,0x21, -0x24,0x1b,0x1a,0x17,0x17,0x19,0x1b,0x1a,0x1f,0x1a,0x1d,0x25,0x1a,0x20,0x1b,0x1b,0x15,0x17,0x15,0x1b,0x17,0x1c,0x17,0x29,0x28,0x1c,0x17,0x1d,0x19,0x1c,0x15,0x1b,0x16,0x1e,0x1b,0x1a,0x13,0x1a,0x1b,0x15,0x0b,0x23,0x15,0x15,0x28,0x1f,0x1e,0x1b,0x2a,0x21,0x1f,0x17,0x28,0x20,0x21,0x1a,0x2b,0x22,0x19,0x15,0x24,0x23,0x23,0x1b, -0x21,0x1b,0x21,0x1b,0x3c,0x33,0x26,0x1e,0x34,0x29,0x28,0x1f,0x1b,0x14,0x17,0x12,0x13,0x00,0x00,0x2d,0x2c,0x1b,0x17,0x1a,0x1b,0x1a,0x17,0x19,0x15,0x1b,0x17,0x21,0x1b,0x27,0x1f,0x2f,0x26,0x21,0x1a,0x1c,0x15,0x18,0x13,0x28,0x1f,0x20,0x1b,0x26,0x1d,0x26,0x1d,0x0c,0x28,0x22,0x1b,0x17,0x21,0x1b,0x1e,0x1a,0x1e,0x17,0x1e,0x17, -0x28,0x26,0x17,0x18,0x21,0x18,0x21,0x18,0x28,0x22,0x19,0x15,0x18,0x14,0x22,0x1b,0x22,0x1b,0x23,0x1b,0x23,0x1b,0x1c,0x15,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1e,0x1a,0x24,0x21,0x1a,0x1b,0x27,0x28,0x25,0x21,0x1a,0x16,0x2a,0x25,0x2e,0x27,0x21,0x18,0x1f,0x1c,0x1b,0x1a,0x1a,0x17,0x1b,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x1b,0x0f,0x0f,0x08,0x0a,0x0a,0x0a,0x0d,0x12,0x0d,0x0b,0x11,0x0a,0x0a,0x0a,0x0f,0x0f,0x0a,0x0a,0x1b,0x1b,0x1b,0x1b,0x0f,0x0d,0x0c,0x0f,0x0e,0x0c,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0d,0x07,0x0b,0x0d,0x0a,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x0f,0x13,0x0f,0x0b,0x0c, -0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19, -0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19, -0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x1e,0x0e,0x1d,0x10,0x1b,0x1b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0f,0x0f,0x10,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1b,0x16,0x1e,0x26,0x16,0x15,0x19,0x1a,0x13,0x13,0x0b,0x0e,0x17, -0x12,0x20,0x1b,0x1b,0x16,0x1c,0x1c,0x1c,0x2b,0x19,0x1b,0x1b,0x15,0x15,0x15,0x13,0x19,0x1a,0x21,0x1a,0x16,0x21,0x15,0x13,0x13,0x18,0x12,0x16,0x1b,0x15,0x1b,0x1a,0x11,0x16,0x10,0x10,0x13,0x0e,0x0e,0x13,0x14,0x08,0x0a,0x10,0x0d,0x18,0x14,0x14,0x14,0x12,0x10,0x10,0x0d,0x13,0x18,0x0e,0x0e,0x10,0x16,0x10,0x10,0x0e,0x0e,0x0c, -0x0c,0x10,0x08,0x0e,0x17,0x0f,0x10,0x0c,0x10,0x10,0x10,0x09,0x0f,0x0f,0x17,0x0d,0x0f,0x0f,0x0d,0x10,0x13,0x0e,0x08,0x0a,0x0f,0x0d,0x0f,0x0d,0x10,0x13,0x0e,0x1b,0x08,0x10,0x19,0x28,0x1d,0x19,0x19,0x28,0x1e,0x27,0x22,0x18,0x1b,0x17,0x15,0x34,0x15,0x1b,0x29,0x2b,0x2b,0x1d,0x1e,0x1c,0x15,0x16,0x18,0x14,0x15,0x18,0x09,0x00, -0x00,0x00,0x00,0x1b,0x1c,0x1c,0x1c,0x16,0x12,0x1b,0x1b,0x0e,0x28,0x1a,0x1b,0x10,0x0f,0x15,0x10,0x15,0x1b,0x15,0x1b,0x2a,0x1e,0x0f,0x0c,0x1b,0x19,0x1b,0x1b,0x1b,0x0e,0x1b,0x17,0x0b,0x28,0x1a,0x1b,0x10,0x14,0x14,0x16,0x15,0x15,0x17,0x1b,0x1b,0x18,0x14,0x15,0x22,0x0b,0x15,0x0b,0x1a,0x14,0x10,0x0c,0x0c,0x10,0x0c,0x08,0x08, -0x10,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0a,0x17,0x17,0x0f,0x0f,0x10,0x0f,0x11,0x0b,0x08,0x09,0x0f,0x10,0x0f,0x0f,0x0d,0x0c,0x0c,0x0e,0x0c,0x10,0x00,0x00,0x00,0x00,0x0a,0x0e,0x0e,0x10,0x0c,0x0e,0x19,0x19,0x19,0x19,0x0f,0x00,0x00,0x00,0x00,0x15,0x0e,0x0c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c, -0x0c,0x0c,0x0c,0x0c,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0c,0x0c,0x0c,0x0c,0x19,0x19,0x19,0x19,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x19,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x08,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x0e,0x0e,0x24,0x1d,0x21,0x1b,0x22,0x1d,0x2b,0x23,0x19,0x11,0x18,0x1f,0x19,0x26,0x20,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x2e,0x13,0x0c,0x17,0x1b,0x13,0x17,0x17,0x1b,0x1b,0x17,0x2e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x1e,0x17,0x17,0x17, -0x0f,0x1b,0x0f,0x23,0x1f,0x17,0x0f,0x26,0x17,0x26,0x0c,0x0f,0x1b,0x1b,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x26,0x0c,0x1b,0x0c,0x17,0x13,0x0c,0x0c,0x17,0x0c,0x23,0x0c,0x2a,0x17,0x2a,0x2a,0x1b,0x1b,0x1b,0x17,0x17,0x13,0x13,0x36,0x36,0x3d,0x3d,0x26,0x26,0x17,0x17,0x08,0x2e,0x23,0x26,0x1f,0x1b,0x1f,0x17,0x17,0x23,0x23,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1e,0x00,0x1e,0x1e,0x1e,0x0f,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x1b,0x1f,0x1b,0x13,0x2a,0x17,0x2a,0x17,0x23,0x26,0x0f,0x17,0x17,0x13,0x0c,0x17,0x1b,0x17,0x1b,0x17,0x1b,0x1b,0x17,0x1f,0x1e,0x2a,0x0f,0x17,0x13,0x1f,0x17,0x0f,0x17,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x0c,0x1b,0x12,0x2e,0x17, -0x17,0x1e,0x1e,0x2e,0x17,0x00,0x00,0x00,0x1e,0x00,0x1e,0x1e,0x1e,0x1e,0x23,0x1e,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x17,0x17,0x23,0x26,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1f,0x1b,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x13,0x13,0x13,0x17,0x13,0x13,0x13,0x36,0x26,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x17,0x1b,0x1b,0x1b,0x2e,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2e,0x17,0x17,0x23,0x23,0x32,0x2e,0x2a,0x17,0x26,0x17,0x26,0x17,0x26,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x1f,0x0f,0x1f, -0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x1f,0x0f,0x1f,0x0f,0x19,0x1f,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x26,0x2a,0x23,0x26,0x0f,0x17,0x23,0x26,0x23,0x26,0x00,0x00,0x00,0x00,0x00,0x34,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x13,0x00,0x00,0x1c,0x00,0x00,0x00,0x36,0x26,0x3d,0x2e,0x17,0x1b,0x1b,0x1b,0x13,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x2a,0x2a,0x11,0x1b,0x1b,0x1b,0x38,0x26,0x18,0x46,0x32,0x0f,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x17,0x13,0x13,0x23,0x1f,0x1f,0x17,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x3a,0x45,0x00,0x00,0x00,0x00,0x00,0x1b,0x17,0x00,0x00, -0x00,0x00,0x00,0x00,0x2a,0x13,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1f,0x1b,0x17,0x17,0x13,0x36,0x26,0x17,0x1b,0x1b,0x1b,0x17,0x1b,0x1b,0x1b,0x17,0x1b,0x1b,0x1b,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2a,0x17,0x17,0x2a,0x17,0x17,0x2a,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1f,0x0f,0x1f,0x0f, -0x1f,0x0f,0x1f,0x1f,0x0f,0x0f,0x13,0x13,0x36,0x26,0x1e,0x1b,0x1b,0x00,0x17,0x17,0x17,0x11,0x1a,0x20,0x1d,0x17,0x18,0x10,0x0b,0x23,0x1b,0x1c,0x10,0x19,0x16,0x16,0x15,0x16,0x0b,0x18,0x13,0x1c,0x16,0x1b,0x15,0x19,0x14,0x1f,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x15,0x16,0x16,0x0d,0x18,0x1a,0x1c,0x17,0x10, -0x22,0x1b,0x1d,0x19,0x1d,0x17,0x1a,0x18,0x12,0x20,0x11,0x13,0x13,0x16,0x1c,0x1c,0x17,0x2e,0x17,0x2e,0x0f,0x0c,0x08,0x19,0x0a,0x06,0x00,0x06,0x0a,0x00,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x2b,0x14,0x23,0x1b,0x2b,0x21,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x2a,0x28,0x16, -0x28,0x16,0x28,0x1e,0x1f,0x20,0x20,0x23,0x28,0x2e,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x1f,0x1f,0x1f,0x1f,0x22,0x1b,0x31,0x26,0x16,0x16,0x0d,0x0d,0x0d,0x11,0x0a,0x1a,0x0b,0x0b,0x26,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x09,0x00,0x00,0x0a,0x00,0x00,0x1d,0x1a,0x14,0x16,0x1f,0x0c, -0x10,0x1f,0x1f,0x0c,0x1a,0x19,0x19,0x20,0x1f,0x0c,0x12,0x1f,0x1c,0x1c,0x1d,0x1a,0x1b,0x1f,0x1a,0x24,0x21,0x18,0x18,0x18,0x0b,0x11,0x1a,0x1a,0x19,0x19,0x19,0x1c,0x1d,0x16,0x1f,0x19,0x19,0x20,0x1a,0x21,0x19,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1a,0x14,0x16,0x1f,0x0e,0x10,0x1f,0x0e,0x1a,0x19,0x19,0x1f,0x12,0x1f,0x1c,0x1d, -0x1b,0x1f,0x1a,0x24,0x21,0x0c,0x1a,0x19,0x1d,0x1e,0x37,0x00,0x1d,0x19,0x1e,0x1e,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x0c,0x00,0x23,0x1e,0x1f,0x20,0x19,0x1f,0x22,0x23,0x16,0x1d,0x22,0x22, -0x1e,0x23,0x25,0x24,0x1f,0x19,0x1a,0x23,0x20,0x1a,0x20,0x1f,0x1e,0x1f,0x20,0x22,0x1b,0x1d,0x1f,0x1e,0x24,0x1d,0x1c,0x1e,0x1f,0x26,0x17,0x1b,0x1b,0x28,0x19,0x19,0x23,0x29,0x1c,0x19,0x30,0x1a,0x1a,0x23,0x19,0x19,0x23,0x1a,0x23,0x25,0x28,0x19,0x24,0x19,0x1e,0x19,0x1c,0x1a,0x1d,0x19,0x1c,0x23,0x19,0x1d,0x1f,0x19,0x19,0x1b, -0x2c,0x19,0x19,0x1b,0x1b,0x14,0x0f,0x1a,0x1a,0x1a,0x19,0x1a,0x29,0x1a,0x29,0x17,0x1a,0x29,0x1f,0x1a,0x29,0x22,0x22,0x29,0x1b,0x1a,0x29,0x29,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x29,0x29,0x1b,0x1a,0x1a,0x29,0x1b,0x19,0x1a,0x1a,0x29,0x24,0x20,0x20,0x20,0x20,0x21,0x1d,0x20,0x24,0x20,0x1e,0x19,0x24,0x1f,0x20,0x1a,0x1f,0x20,0x22, -0x21,0x1b,0x20,0x1f,0x21,0x1f,0x24,0x20,0x21,0x21,0x1f,0x1d,0x20,0x1f,0x21,0x24,0x1e,0x23,0x21,0x05,0x05,0x07,0x09,0x07,0x0c,0x10,0x28,0x1a,0x1c,0x1b,0x1a,0x1c,0x1a,0x1a,0x1e,0x1c,0x1a,0x0e,0x26,0x1b,0x1a,0x1a,0x19,0x1c,0x18,0x1b,0x0c,0x1b,0x18,0x1a,0x13,0x28,0x19,0x1a,0x1a,0x1b,0x26,0x1a,0x1b,0x12,0x26,0x1b,0x1b,0x20, -0x1f,0x0a,0x0d,0x34,0x34,0x34,0x34,0x42,0x19,0x19,0x0b,0x19,0x12,0x19,0x19,0x1a,0x19,0x19,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x1a,0x19,0x19,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17, -0x1b,0x14,0x13,0x1a,0x1c,0x0c,0x0e,0x17,0x13,0x23,0x1e,0x1c,0x16,0x1c,0x17,0x13,0x14,0x1b,0x17,0x25,0x17,0x15,0x16,0x20,0x24,0x13,0x1d,0x16,0x1b,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x1e,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b,0x1b,0x1b,0x15,0x17,0x17,0x17,0x17,0x17,0x1a,0x1b,0x1b, -0x14,0x14,0x14,0x14,0x14,0x1a,0x1a,0x17,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1a,0x0e,0x17,0x13,0x13,0x13,0x13,0x1e,0x1e,0x1e,0x1e,0x1c,0x1c,0x1c,0x17,0x17,0x17,0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x25,0x25,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x20,0x1d,0x17,0x17,0x12,0x19,0x14, -0x16,0x1c,0x1c,0x0c,0x17,0x17,0x23,0x1e,0x15,0x1c,0x1c,0x16,0x15,0x14,0x15,0x1d,0x17,0x1e,0x1d,0x17,0x14,0x1c,0x0c,0x1c,0x15,0x1d,0x0c,0x15,0x14,0x1a,0x12,0x18,0x13,0x0c,0x0c,0x0e,0x25,0x26,0x1c,0x17,0x17,0x1c,0x17,0x16,0x17,0x12,0x1b,0x14,0x22,0x14,0x1e,0x1e,0x17,0x1a,0x23,0x1c,0x1c,0x1c,0x16,0x17,0x14,0x17,0x1d,0x17, -0x1d,0x19,0x25,0x26,0x1a,0x20,0x17,0x18,0x28,0x16,0x12,0x1b,0x1b,0x1d,0x29,0x29,0x1e,0x17,0x1a,0x13,0x1a,0x1a,0x1a,0x20,0x18,0x18,0x20,0x1b,0x1b,0x10,0x1c,0x1c,0x1a,0x16,0x16,0x29,0x22,0x16,0x18,0x1c,0x1c,0x1d,0x1d,0x21,0x20,0x10,0x2b,0x1b,0x19,0x1a,0x1e,0x1e,0x17,0x17,0x0c,0x23,0x20,0x20,0x16,0x20,0x0a,0x0a,0x14,0x14, -0x0a,0x0a,0x1c,0x12,0x0c,0x23,0x20,0x0d,0x0a,0x0a,0x15,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x1f,0x16,0x0e,0x1c,0x20,0x1b,0x1b,0x17,0x22,0x1a,0x1c,0x10,0x14,0x18,0x14,0x0a,0x0b,0x12,0x18,0x10,0x1f,0x1f,0x1f,0x2a,0x23,0x2a,0x0c,0x00,0x00,0x00,0x00,0x00,0x0c,0x23,0x26,0x0f,0x0f,0x17,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b, -0x1b,0x17,0x17,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x26,0x26,0x26,0x26,0x26,0x2a,0x2a,0x17,0x17,0x2a,0x2a,0x17,0x17,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x2e,0x23,0x26,0x17,0x1b,0x1b,0x1f,0x0f,0x1f,0x23,0x17,0x17,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c, -0x2a,0x0f,0x23,0x17,0x17,0x0c,0x17,0x17,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x36,0x26,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x26,0x26,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x23,0x17,0x17, -0x23,0x17,0x17,0x2a,0x17,0x32,0x2e,0x2a,0x17,0x26,0x17,0x26,0x17,0x26,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x1f,0x1f,0x0f,0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x17,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x17,0x0f,0x0f,0x0f,0x0f,0x00,0x36,0x26, -0x3d,0x2e,0x2a,0x17,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x17,0x17,0x13,0x36,0x26,0x2e,0x2e,0x2a,0x2a,0x2a,0x1b,0x1b,0x1b,0x1b,0x1f,0x0f,0x1f,0x0f,0x1f,0x0f,0x36,0x26,0x1b,0x1f,0x1b,0x1b,0x1b,0x1f,0x1b,0x1b,0x36,0x36,0x26,0x26,0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x0f,0x0f,0x0f,0x0f,0x23,0x26, -0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x1b,0x1b,0x1b,0x1b,0x2a,0x0f,0x2a,0x0f,0x1b,0x1f,0x1b,0x1b,0x36,0x36,0x26,0x26,0x36,0x36,0x26,0x26,0x26,0x26,0x17,0x17,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x0c,0x0c,0x0f,0x0c,0x00,0x00,0x00,0x26,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x23,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, -0x23,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1b,0x26,0x1b,0x26,0x1b,0x26,0x1b,0x26,0x1f,0x1f,0x1f,0x0c,0x0c,0x17,0x13,0x1b,0x1d,0x1a,0x19,0x1a,0x1b,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x18,0x15,0x19,0x18,0x1b,0x1c,0x1c,0x1e,0x1b,0x1a,0x1e,0x18,0x1f,0x23,0x1d,0x22,0x26,0x1d,0x23,0x20,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x18,0x15,0x19,0x1c,0x1c,0x1e,0x1a,0x1e,0x1a,0x1b,0x1c,0x17,0x17,0x23,0x1f,0x20,0x1f,0x1f,0x1b,0x1b,0x1b,0x22,0x23,0x23,0x23,0x2a,0x2a,0x20,0x2a,0x2a,0x22,0x28,0x27,0x1a,0x23,0x27,0x23,0x1b,0x27,0x22,0x20,0x20,0x1c,0x1e,0x22,0x25,0x20,0x1c,0x21,0x1b,0x19,0x2a,0x2a,0x2a,0x26,0x2a,0x2a,0x1f, -0x2a,0x2a,0x21,0x23,0x24,0x22,0x21,0x21,0x1e,0x29,0x23,0x26,0x21,0x21,0x1b,0x22,0x20,0x20,0x27,0x23,0x21,0x29,0x19,0x17,0x1a,0x19,0x1c,0x1d,0x20,0x22,0x1b,0x1a,0x1a,0x19,0x1a,0x19,0x19,0x1a,0x1a,0x1b,0x1a,0x1a,0x1a,0x17,0x18,0x1b,0x1d,0x1c,0x1c,0x15,0x1a,0x1a,0x1b,0x1c,0x23,0x27,0x1e,0x1e,0x1d,0x23,0x1d,0x1f,0x18,0x16, -0x1b,0x1a,0x16,0x17,0x19,0x19,0x16,0x15,0x1d,0x15,0x19,0x17,0x19,0x24,0x1a,0x26,0x19,0x1a,0x1a,0x22,0x0e,0x24,0x20,0x21,0x1e,0x1a,0x23,0x1c,0x24,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x1c,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x14,0x15,0x15,0x15,0x15,0x15,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1d,0x0c, -0x0c,0x0c,0x0e,0x0e,0x0c,0x0c,0x0c,0x0e,0x0c,0x0c,0x0c,0x2a,0x2a,0x2a,0x2a,0x16,0x22,0x21,0x16,0x13,0x16,0x18,0x1a,0x16,0x27,0x26,0x28,0x14,0x2e,0x16,0x26,0x26,0x27,0x25,0x1a,0x16,0x16,0x24,0x1b,0x24,0x1f,0x19,0x15,0x13,0x2f,0x13,0x19,0x16,0x16,0x16,0x16,0x16,0x3f,0x26,0x26,0x14,0x0c,0x15,0x0b,0x15,0x0b,0x0b,0x0b,0x16, -0x1b,0x1b,0x19,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x0b,0x13,0x28,0x0a,0x2a,0x2a,0x2a,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x36,0x36,0x1f,0x36,0x36,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x1b,0x16,0x1b,0x16,0x18,0x14,0x10,0x10,0x20,0x19,0x21,0x14,0x34,0x29,0x1b,0x19,0x2a,0x24,0x27,0x22,0x2f,0x25,0x2b,0x24,0x1e,0x16,0x21,0x1b,0x2b,0x22,0x23,0x1c,0x22,0x1c,0x28,0x1f,0x28,0x1f,0x33,0x27,0x23,0x1b,0x23,0x1b,0x38,0x29,0x24,0x00,0x2d,0x2d,0x2d,0x16,0x00,0x00,0x1b,0x17,0x20,0x1a,0x18,0x14,0x32,0x2a, -0x2b,0x28,0x21,0x1b,0x20,0x1b,0x18,0x13,0x22,0x1b,0x18,0x13,0x26,0x1f,0x1e,0x1a,0x2d,0x26,0x19,0x1a,0x22,0x22,0x25,0x15,0x09,0x15,0x1f,0x14,0x2e,0x2e,0x0b,0x00,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x19,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x16,0x1f,0x21,0x0d,0x0a,0x0d,0x0a,0x21,0x1a,0x22,0x1d,0x19,0x16,0x19, -0x16,0x1b,0x1a,0x13,0x13,0x34,0x26,0x35,0x29,0x2d,0x27,0x29,0x1e,0x29,0x1e,0x29,0x1e,0x1c,0x15,0x1b,0x17,0x1b,0x17,0x1b,0x17,0x19,0x0e,0x16,0x0b,0x23,0x1b,0x28,0x1f,0x3d,0x2e,0x1a,0x1b,0x20,0x20,0x25,0x28,0x23,0x1b,0x2d,0x24,0x19,0x12,0x1a,0x17,0x1d,0x16,0x2b,0x21,0x1c,0x18,0x1a,0x1b,0x1a,0x1b,0x16,0x12,0x16,0x12,0x16, -0x11,0x18,0x18,0x0e,0x1f,0x0f,0x2c,0x1e,0x10,0x1b,0x1c,0x15,0x23,0x1a,0x11,0x10,0x1b,0x1b,0x1b,0x16,0x0b,0x23,0x1c,0x11,0x10,0x1d,0x15,0x21,0x12,0x24,0x1c,0x1c,0x15,0x20,0x1b,0x1b,0x17,0x22,0x1a,0x1c,0x10,0x18,0x14,0x23,0x14,0x18,0x28,0x16,0x1a,0x29,0x0c,0x35,0x29,0x29,0x36,0x29,0x2a,0x2a,0x28,0x29,0x2a,0x18,0x16,0x1c, -0x20,0x29,0x20,0x2b,0x0b,0x15,0x1b,0x28,0x2f,0x20,0x2f,0x1c,0x1c,0x25,0x20,0x34,0x2a,0x18,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x2e,0x17,0x17,0x2e,0x23,0x17,0x17,0x23,0x1f,0x0f,0x0f,0x1f,0x1b,0x1b,0x1b,0x1b,0x23,0x0f,0x0f,0x26,0x23,0x0f,0x0f,0x26,0x13,0x13,0x17,0x17,0x18,0x18,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x18,0x12,0x1a,0x18,0x22,0x1b,0x1b,0x28,0x1f,0x22,0x23,0x26,0x26,0x1b,0x17,0x2e,0x25,0x30,0x27,0x20,0x1b,0x0e,0x0e,0x1b,0x1e,0x13,0x1c,0x18,0x1b,0x16,0x22,0x25,0x12,0x1b,0x14,0x0a,0x11,0x18,0x19,0x0a, -0x0a,0x08,0x0a,0x11,0x11,0x11,0x15,0x44,0x5c,0x10,0x13,0x06,0x0c,0x12,0x14,0x0f,0x17,0x18,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x16,0x16,0x16,0x16,0x3d,0x19,0x23,0x2a,0x29,0x1e,0x15,0x1a,0x21,0x22,0x16,0x0e,0x1e,0x18,0x1f,0x1a,0x1e,0x19,0x19,0x22,0x1b,0x1b,0x18,0x22,0x1c,0x26,0x15,0x18,0x1d,0x0e,0x1b, -0x10,0x10,0x0b,0x28,0x1b,0x1a,0x18,0x18,0x1b,0x2b,0x2b,0x2b,0x2e,0x2e,0x19,0x17,0x0d,0x17,0x15,0x1c,0x15,0x1f,0x0b,0x1a,0x1c,0x28,0x28,0x1c,0x19,0x1b,0x19,0x18,0x15,0x18,0x15,0x16,0x0e,0x10,0x0b,0x0a,0x11,0x1b,0x1d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x00,0x0d,0x0d,0x0d,0x0c, -0x0c,0x4d,0x2e,0x28,0x30,0x0d,0x0d,0x0f,0x12,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x00,0x2a,0x0f,0x0f,0x2a,0x0c,0x17,0x17,0x3d,0x2e,0x2e,0x3d,0x2a,0x17,0x17,0x2a,0x17,0x17,0x13,0x13,0x00,0x00,0x10,0x22,0x1c,0x21,0x1b,0x3a,0x30,0x20,0x19,0x20,0x19,0x3d,0x2e,0x23,0x1b,0x12,0x0f,0x1c,0x00,0x1f,0x19, -0x0f,0x0e,0x07,0x17,0x0f,0x10,0x0c,0x09,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0a,0x18,0x14,0x1b,0x1a,0x19,0x2c,0x25,0x25,0x24,0x26,0x2b,0x1d,0x20,0x1c,0x12,0x2b,0x34,0x14,0x35,0x17,0x26,0x2a,0x2a,0x2a,0x13,0x23,0x2e,0x23,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x1b, -0x1b,0x1b,0x26,0x17,0x17,0x2a,0x0f,0x0f,0x2a,0x0f,0x0f,0x2a,0x17,0x17,0x00,0x13,0x26,0x0f,0x0f,0x2e,0x17,0x17,0x23,0x17,0x17,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x45,0x45,0x28,0x00,0x00,0x28,0x28,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, -0x1f,0x1c,0x1e,0x1e,0x29,0x1e,0x1d,0x25,0x2d,0x1e,0x1d,0x31,0x1d,0x1d,0x2b,0x1d,0x1f,0x24,0x1d,0x23,0x27,0x2a,0x1d,0x23,0x1e,0x20,0x1d,0x20,0x1d,0x1e,0x20,0x1d,0x24,0x1c,0x1f,0x24,0x1c,0x1d,0x1a,0x24,0x1e,0x1e,0x1e,0x20,0x15,0x18,0x1e,0x24,0x24,0x19,0x00,0x00,0x32,0x64,0x20,0x00,0x05,0x0e,0x0e,0x14,0x1e,0x1b,0x29,0x28, -0x0c,0x0f,0x0f,0x15,0x22,0x0b,0x14,0x0b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x0b,0x0b,0x22,0x22,0x22,0x16,0x30,0x20,0x1d,0x1f,0x23,0x19,0x18,0x22,0x24,0x0d,0x12,0x1d,0x18,0x2d,0x25,0x26,0x1c,0x26,0x1e,0x1b,0x1a,0x22,0x1f,0x2f,0x1e,0x1c,0x1d,0x0f,0x13,0x0f,0x22,0x15,0x0d,0x19,0x1d,0x17,0x1d,0x1a,0x10, -0x1d,0x1c,0x0c,0x0c,0x19,0x0c,0x2b,0x1c,0x1d,0x1d,0x1d,0x11,0x15,0x11,0x1c,0x18,0x24,0x17,0x18,0x17,0x0f,0x0c,0x0f,0x22,0x20,0x20,0x1f,0x19,0x25,0x26,0x22,0x19,0x19,0x19,0x19,0x19,0x19,0x17,0x1a,0x1a,0x1a,0x1a,0x0c,0x0c,0x0c,0x0c,0x1c,0x1d,0x1d,0x1d,0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x13,0x13,0x1b,0x1b,0x16,0x14,0x17,0x1b, -0x14,0x2d,0x2d,0x27,0x0e,0x15,0x22,0x2b,0x26,0x29,0x22,0x22,0x22,0x1b,0x1d,0x1b,0x1f,0x26,0x1b,0x14,0x16,0x26,0x2a,0x1d,0x16,0x0e,0x0e,0x22,0x21,0x1b,0x22,0x20,0x19,0x19,0x25,0x20,0x20,0x26,0x2f,0x2e,0x19,0x32,0x13,0x13,0x0b,0x0b,0x22,0x1d,0x18,0x1c,0x09,0x1b,0x10,0x10,0x1c,0x1c,0x13,0x0b,0x0b,0x13,0x3d,0x20,0x19,0x20, -0x19,0x19,0x0d,0x0d,0x0d,0x0d,0x26,0x26,0x26,0x22,0x22,0x22,0x0c,0x13,0x11,0x10,0x0f,0x0a,0x0e,0x0a,0x10,0x09,0x13,0x18,0x0e,0x1b,0x15,0x1d,0x17,0x0c,0x23,0x1c,0x1c,0x18,0x1c,0x1d,0x22,0x22,0x12,0x12,0x12,0x2f,0x2d,0x30,0x18,0x22,0x1d,0x0d,0x1b,0x15,0x1f,0x17,0x1f,0x17,0x1d,0x15,0x0b,0x20,0x19,0x20,0x19,0x23,0x22,0x23, -0x19,0x1a,0x19,0x1a,0x18,0x0c,0x18,0x0f,0x18,0x10,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x1e,0x11,0x1e,0x11,0x1b,0x15,0x1a,0x11,0x1a,0x16,0x22,0x1c,0x22,0x1c,0x1d,0x17,0x1d,0x17,0x18,0x26,0x26,0x1f,0x1d,0x16,0x1d,0x18,0x23,0x15,0x18,0x14,0x38,0x1f,0x19,0x1e,0x0b,0x13,0x28,0x10,0x1e,0x12,0x12,0x1e,0x12,0x20,0x19,0x1f,0x17,0x1f, -0x17,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x22,0x1d,0x22,0x1d,0x22,0x1d,0x24,0x1c,0x24,0x1c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x12,0x0c,0x1d,0x19,0x19,0x18,0x0c,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x26,0x1d,0x1e,0x11,0x1b,0x15,0x1a,0x11,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x2f,0x24,0x1c,0x18,0x0c,0x20,0x19,0x2b,0x2a,0x26, -0x1d,0x0b,0x2f,0x24,0x2f,0x24,0x2f,0x24,0x1c,0x18,0x0b,0x15,0x1b,0x1e,0x2e,0x2e,0x2e,0x2d,0x13,0x13,0x0b,0x0e,0x0e,0x20,0x1d,0x27,0x13,0x28,0x21,0x29,0x0d,0x20,0x1d,0x19,0x1d,0x24,0x0d,0x1d,0x1f,0x2d,0x25,0x19,0x26,0x24,0x1c,0x1a,0x1a,0x1c,0x1e,0x27,0x26,0x0d,0x1c,0x1f,0x16,0x1d,0x0d,0x1c,0x1b,0x1a,0x16,0x1d,0x1d,0x0d, -0x1a,0x19,0x1d,0x1a,0x16,0x1d,0x1d,0x17,0x1c,0x1b,0x26,0x28,0x0d,0x1c,0x1d,0x1c,0x28,0x19,0x23,0x18,0x1f,0x1b,0x0d,0x31,0x31,0x24,0x1d,0x1c,0x23,0x20,0x1d,0x1d,0x18,0x23,0x19,0x2b,0x1b,0x25,0x25,0x1d,0x22,0x2d,0x24,0x26,0x24,0x1c,0x1f,0x1a,0x1c,0x24,0x1e,0x25,0x21,0x2f,0x31,0x23,0x27,0x1d,0x1f,0x33,0x1e,0x19,0x1d,0x1a, -0x13,0x1b,0x1a,0x25,0x16,0x1d,0x1d,0x19,0x1a,0x23,0x1d,0x1d,0x1d,0x1d,0x17,0x15,0x18,0x22,0x17,0x1e,0x1c,0x28,0x29,0x1e,0x23,0x19,0x17,0x29,0x19,0x1a,0x1d,0x13,0x17,0x15,0x0c,0x28,0x28,0x1c,0x19,0x18,0x1d,0x17,0x14,0x32,0x38,0x1f,0x12,0x12,0x12,0x12,0x0c,0x1b,0x15,0x1c,0x26,0x1e,0x23,0x1d,0x0f,0x11,0x0d,0x0d,0x18,0x18, -0x18,0x18,0x0f,0x0f,0x0f,0x18,0x0f,0x18,0x0f,0x0f,0x0f,0x18,0x18,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x0d,0x0c,0x0d,0x0c,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26, -0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x22,0x1c,0x22,0x1c,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x1c,0x18,0x1c,0x18,0x1c,0x18,0x1a,0x11,0x19,0x1a,0x25,0x1d,0x0d,0x12,0x0c,0x0c,0x1a,0x15,0x2e,0x27,0x1f,0x1b,0x1d,0x19,0x25,0x1e,0x1c,0x18,0x1c,0x18,0x1f,0x19,0x21, -0x1c,0x21,0x1c,0x24,0x1a,0x26,0x1d,0x0f,0x0f,0x0f,0x0f,0x15,0x15,0x18,0x18,0x18,0x18,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x19,0x1a,0x20,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1f,0x17,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x18,0x10,0x22,0x1d,0x24,0x1c,0x24,0x1c,0x24, -0x1c,0x24,0x1c,0x24,0x1c,0x0d,0x0c,0x0d,0x0c,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x18,0x0c,0x18,0x0c,0x18,0x0c,0x18,0x0c,0x2d,0x2b,0x2d,0x2b,0x2d,0x2b,0x25,0x1c,0x25,0x1c,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x1c,0x1d,0x1c,0x1d,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b, -0x15,0x1b,0x15,0x1a,0x11,0x1a,0x11,0x1a,0x11,0x1a,0x11,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x1f,0x18,0x1f,0x18,0x2f,0x24,0x2f,0x24,0x1e,0x17,0x1e,0x17,0x1c,0x18,0x1d,0x17,0x1d,0x17,0x1d,0x17,0x1c,0x11,0x24,0x18,0x19,0x0c,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x25,0x25,0x25,0x25,0x25,0x25,0x16, -0x16,0x16,0x16,0x16,0x16,0x1d,0x1d,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x13,0x13,0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x28,0x28,0x30,0x30,0x30,0x30,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x21, -0x29,0x29,0x29,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x30,0x30,0x30,0x30,0x30,0x30,0x1f,0x1f,0x16,0x16,0x1d,0x1d,0x0d,0x0d,0x1d,0x1d,0x1c,0x1c,0x28,0x28,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x25,0x25,0x25,0x25,0x25,0x25,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x2e,0x2e,0x2e,0x2e,0x2e, -0x2e,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x30,0x30,0x30,0x30,0x30,0x30,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x20,0x20,0x20,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x24,0x1d,0x1d,0x1d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x12,0x13,0x1d,0x1d,0x1d,0x1c,0x1c,0x1c,0x1c, -0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x21,0x21,0x1f,0x1d,0x1d,0x1d,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x2a,0x29,0x26,0x1d,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1f,0x1d,0x1d,0x1d,0x1d,0x1f,0x1f,0x17,0x23,0x25,0x1d,0x1d,0x1e,0x19,0x1b,0x18,0x23,0x1f,0x2c,0x0e,0x0e,0x1d,0x19,0x0c,0x19, -0x2d,0x25,0x1d,0x26,0x30,0x28,0x1e,0x1d,0x1d,0x1b,0x15,0x1a,0x0f,0x11,0x1a,0x11,0x1a,0x26,0x24,0x1c,0x1a,0x1d,0x17,0x1f,0x1f,0x16,0x14,0x1b,0x1b,0x13,0x14,0x1b,0x0c,0x13,0x17,0x0e,0x3e,0x39,0x33,0x2b,0x24,0x19,0x36,0x30,0x28,0x20,0x19,0x0d,0x0c,0x26,0x1d,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x1a,0x20,0x19, -0x20,0x19,0x2b,0x29,0x22,0x1d,0x22,0x1d,0x1d,0x19,0x26,0x1d,0x26,0x1d,0x1f,0x16,0x0c,0x3e,0x39,0x33,0x22,0x1d,0x32,0x22,0x25,0x1c,0x20,0x19,0x20,0x19,0x19,0x1a,0x19,0x1a,0x0d,0x0c,0x0d,0x0c,0x26,0x1d,0x26,0x1d,0x1d,0x11,0x1e,0x11,0x22,0x1c,0x22,0x1c,0x19,0x15,0x24,0x1c,0x25,0x1e,0x1c,0x1d,0x17,0x20,0x19,0x26,0x1d,0x26, -0x1d,0x26,0x1d,0x26,0x1d,0x1c,0x18,0x1d,0x19,0x1c,0x1c,0x1d,0x19,0x1d,0x1d,0x1d,0x17,0x17,0x1d,0x1d,0x1a,0x1f,0x15,0x15,0x19,0x1c,0x0e,0x1d,0x1d,0x1a,0x18,0x17,0x1c,0x1c,0x1c,0x0d,0x0e,0x10,0x0e,0x13,0x0c,0x1e,0x2b,0x2b,0x2b,0x1c,0x1c,0x1d,0x1d,0x23,0x24,0x20,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x14,0x0c,0x0d, -0x0e,0x0e,0x11,0x11,0x1e,0x1e,0x1c,0x18,0x24,0x18,0x15,0x17,0x1a,0x16,0x16,0x12,0x12,0x12,0x17,0x1f,0x18,0x1b,0x1a,0x1c,0x0c,0x19,0x13,0x1d,0x12,0x12,0x2e,0x2f,0x31,0x1f,0x18,0x24,0x28,0x1d,0x1c,0x19,0x19,0x1b,0x1e,0x1c,0x22,0x1c,0x20,0x28,0x1d,0x23,0x1d,0x1d,0x17,0x19,0x17,0x1e,0x19,0x1f,0x19,0x2d,0x2b,0x1e,0x19,0x20, -0x1b,0x1f,0x17,0x1e,0x18,0x21,0x1d,0x1c,0x14,0x1d,0x1d,0x17,0x0c,0x26,0x17,0x17,0x2b,0x22,0x20,0x1d,0x2d,0x24,0x21,0x19,0x2c,0x23,0x24,0x1c,0x2e,0x25,0x1b,0x16,0x27,0x26,0x26,0x1d,0x24,0x1d,0x24,0x1d,0x42,0x38,0x29,0x21,0x38,0x2d,0x2b,0x22,0x1d,0x16,0x19,0x14,0x15,0x00,0x00,0x31,0x2f,0x1d,0x19,0x1c,0x1d,0x1c,0x19,0x1b, -0x17,0x1d,0x19,0x24,0x1d,0x2a,0x21,0x33,0x2a,0x24,0x1c,0x1f,0x17,0x1a,0x15,0x2c,0x22,0x22,0x1d,0x2a,0x20,0x2a,0x20,0x0d,0x2b,0x25,0x1d,0x19,0x24,0x1d,0x21,0x1c,0x20,0x19,0x20,0x19,0x2b,0x2a,0x19,0x1a,0x24,0x1a,0x24,0x1a,0x2b,0x25,0x1b,0x16,0x1a,0x16,0x25,0x1d,0x25,0x1d,0x26,0x1d,0x26,0x1d,0x1f,0x17,0x1c,0x18,0x1c,0x18, -0x1c,0x18,0x21,0x1c,0x27,0x23,0x1c,0x1d,0x2b,0x2b,0x28,0x24,0x1c,0x18,0x2d,0x28,0x31,0x2a,0x24,0x1b,0x22,0x1e,0x1d,0x1c,0x1c,0x19,0x1d,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x1d,0x11,0x11,0x08,0x0b,0x0b,0x0b,0x0e,0x14,0x0e,0x0b,0x13,0x0b,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x1d,0x1d, -0x1d,0x1d,0x11,0x0e,0x0d,0x11,0x10,0x0d,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x11,0x0f,0x08,0x0c,0x0e,0x0b,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x15,0x11,0x0c,0x0d,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13, -0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b, -0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x20,0x0f,0x20,0x11,0x1e,0x1e,0x11,0x11,0x11,0x11,0x11,0x0d, -0x10,0x10,0x11,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x1d,0x17,0x21,0x29,0x18,0x17,0x1b,0x1c,0x15,0x15,0x0c,0x0f,0x19,0x14,0x23,0x1d,0x1d,0x18,0x1f,0x1f,0x1f,0x2e,0x1b,0x1e,0x1e,0x17,0x17,0x17,0x15,0x1b,0x1c,0x24,0x1c,0x18,0x24,0x17,0x15,0x15,0x1a,0x13,0x17, -0x1d,0x17,0x1e,0x1c,0x12,0x18,0x11,0x12,0x14,0x0f,0x0f,0x14,0x15,0x09,0x0b,0x12,0x0e,0x1a,0x16,0x16,0x15,0x13,0x11,0x11,0x0f,0x15,0x1a,0x10,0x10,0x11,0x18,0x11,0x11,0x10,0x10,0x0d,0x0d,0x11,0x08,0x0f,0x19,0x11,0x11,0x0e,0x11,0x11,0x11,0x0a,0x11,0x10,0x19,0x0e,0x10,0x11,0x0f,0x11,0x14,0x0f,0x08,0x0b,0x11,0x0e,0x11,0x0f, -0x11,0x14,0x0f,0x1d,0x08,0x11,0x1b,0x2c,0x1f,0x1b,0x1b,0x2b,0x20,0x2b,0x25,0x1a,0x1d,0x19,0x16,0x38,0x17,0x1d,0x2d,0x2f,0x2f,0x1f,0x20,0x1f,0x17,0x18,0x1a,0x15,0x17,0x1a,0x0a,0x00,0x00,0x00,0x00,0x1d,0x1f,0x1f,0x1f,0x18,0x13,0x1d,0x1d,0x10,0x2b,0x1c,0x1d,0x11,0x11,0x17,0x11,0x17,0x1d,0x17,0x1d,0x2d,0x20,0x10,0x0d,0x1d, -0x1b,0x1e,0x1d,0x1d,0x10,0x1d,0x19,0x0c,0x2b,0x1c,0x1d,0x11,0x15,0x16,0x18,0x17,0x17,0x19,0x1d,0x1d,0x1a,0x16,0x16,0x25,0x0c,0x17,0x0c,0x1c,0x16,0x11,0x0d,0x0d,0x11,0x0d,0x09,0x08,0x11,0x11,0x08,0x09,0x09,0x09,0x08,0x09,0x08,0x0b,0x19,0x19,0x11,0x11,0x12,0x11,0x12,0x0c,0x08,0x0a,0x11,0x11,0x10,0x10,0x0e,0x0d,0x0d,0x0f, -0x0d,0x11,0x00,0x00,0x00,0x00,0x0b,0x10,0x10,0x11,0x0d,0x10,0x1b,0x1b,0x1b,0x1b,0x11,0x00,0x00,0x00,0x00,0x17,0x10,0x0d,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0d,0x0d,0x0d,0x0d,0x1c,0x1c,0x1c,0x1c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, -0x42,0x42,0x1b,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x27,0x20,0x23,0x1d,0x25,0x1f,0x2f,0x26,0x1b,0x13,0x1a,0x22,0x1b,0x29,0x23,0x00,0x00,0x00,0x00,0x0d,0x0d,0x0d, -0x0d,0x11,0x11,0x11,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x2a,0x2a,0x32,0x15,0x0d,0x19,0x1d,0x15,0x19,0x19,0x1d,0x1d,0x19,0x32,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x19,0x20,0x19,0x19,0x19,0x11,0x1d,0x11,0x26,0x21,0x19,0x11,0x2a,0x19,0x2a,0x0d,0x11,0x1d,0x1d,0x20,0x20,0x20,0x1d,0x1d,0x1d,0x2a,0x0d,0x1d,0x0d,0x19,0x15,0x0d,0x0d, -0x19,0x0d,0x26,0x0d,0x2e,0x19,0x2e,0x2e,0x1d,0x1d,0x1d,0x19,0x19,0x15,0x15,0x3a,0x3a,0x43,0x43,0x2a,0x2a,0x19,0x19,0x08,0x32,0x26,0x2a,0x21,0x1d,0x21,0x19,0x19,0x26,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0d,0x20,0x00,0x20,0x20,0x20,0x11,0x19,0x19,0x2e,0x11,0x2e,0x11,0x1d,0x21,0x1d,0x15,0x2e,0x19,0x2e,0x19, -0x26,0x2a,0x11,0x19,0x19,0x15,0x0d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x1d,0x19,0x21,0x20,0x2e,0x11,0x19,0x15,0x21,0x19,0x11,0x19,0x19,0x19,0x2e,0x11,0x2e,0x11,0x0d,0x1d,0x13,0x32,0x19,0x19,0x20,0x20,0x32,0x19,0x00,0x00,0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x26,0x20,0x00,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x19,0x19, -0x26,0x2a,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x21,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15,0x19,0x15,0x15,0x15,0x3a,0x2a,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x19,0x1d,0x1d,0x1d,0x32,0x32, -0x19,0x19,0x32,0x19,0x19,0x32,0x19,0x19,0x32,0x19,0x19,0x26,0x26,0x36,0x32,0x2e,0x19,0x2a,0x19,0x2a,0x19,0x2a,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x21,0x11,0x21,0x11,0x1b,0x21,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x2a,0x2e,0x26,0x2a,0x11, -0x19,0x26,0x2a,0x26,0x2a,0x00,0x00,0x00,0x00,0x00,0x38,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x15,0x00,0x00,0x1e,0x00,0x00,0x00,0x3a,0x2a,0x43,0x32,0x19,0x1d,0x1d,0x1d,0x15,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x2e,0x2e,0x13,0x1d,0x1d,0x1e,0x3d,0x2a,0x1b,0x4c,0x36,0x11, -0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x19,0x15,0x15,0x26,0x21,0x21,0x19,0x00,0x00,0x00,0x11,0x11,0x11,0x11,0x3f,0x4b,0x00,0x00,0x00,0x00,0x00,0x1d,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x15,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x21,0x1d,0x19,0x19,0x15,0x3a, -0x2a,0x19,0x1d,0x1d,0x1d,0x19,0x1d,0x1d,0x1d,0x19,0x1d,0x1d,0x1d,0x32,0x19,0x19,0x32,0x19,0x19,0x2e,0x19,0x19,0x2e,0x19,0x19,0x2e,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x21,0x11,0x11,0x15,0x15,0x3a,0x2a,0x20,0x1d,0x1d,0x00,0x19,0x19,0x19,0x12,0x1d,0x22,0x1f,0x19,0x1a,0x12,0x0c,0x26,0x1d,0x1e, -0x11,0x1c,0x18,0x18,0x17,0x18,0x0c,0x1a,0x15,0x1f,0x18,0x1e,0x17,0x1b,0x16,0x22,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x17,0x18,0x18,0x0e,0x1a,0x1c,0x1e,0x19,0x11,0x25,0x1d,0x20,0x1b,0x1f,0x19,0x1c,0x1a,0x14,0x23,0x13,0x15,0x15,0x18,0x1e,0x1e,0x19,0x32,0x19,0x32,0x11,0x0d,0x08,0x1b,0x0b,0x06,0x00,0x07, -0x0b,0x00,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x19,0x19,0x2e,0x15,0x26,0x1d,0x2f,0x24,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x2e,0x2b,0x18,0x2b,0x18,0x2b,0x20,0x22,0x23,0x23,0x26,0x2b,0x32,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x22,0x22,0x22,0x22,0x25,0x1d,0x35,0x29,0x18,0x18,0x0e, -0x0e,0x0e,0x13,0x0b,0x1c,0x0c,0x0c,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x0a,0x00,0x00,0x0b,0x00,0x00,0x20,0x1d,0x16,0x18,0x22,0x0d,0x11,0x22,0x22,0x0d,0x1c,0x1b,0x1c,0x23,0x22,0x0d,0x14,0x22,0x1e,0x1f,0x20,0x1c,0x1d,0x21,0x1c,0x27,0x24,0x1a,0x1a,0x1a,0x0b,0x13,0x1c,0x1c, -0x1c,0x1c,0x1b,0x1e,0x20,0x18,0x22,0x1b,0x1c,0x23,0x1c,0x24,0x1c,0x27,0x27,0x27,0x27,0x20,0x20,0x20,0x1d,0x16,0x18,0x22,0x0f,0x12,0x22,0x0f,0x1c,0x1b,0x1c,0x22,0x14,0x22,0x1f,0x20,0x1d,0x21,0x1c,0x27,0x24,0x0d,0x1d,0x1b,0x20,0x21,0x3c,0x00,0x20,0x1c,0x21,0x21,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0d,0x00,0x26,0x20,0x21,0x23,0x1c,0x21,0x25,0x26,0x18,0x1f,0x25,0x25,0x21,0x26,0x29,0x27,0x21,0x1c,0x1c,0x26,0x23,0x1d,0x22,0x22,0x21,0x22,0x22,0x25,0x1d,0x20,0x22,0x21,0x27,0x20,0x1f,0x20,0x21,0x29,0x19,0x1d, -0x1d,0x2c,0x1b,0x1b,0x27,0x2d,0x1f,0x1b,0x34,0x1c,0x1c,0x26,0x1b,0x1b,0x26,0x1c,0x26,0x29,0x2c,0x1b,0x27,0x1b,0x21,0x1b,0x1f,0x1c,0x20,0x1b,0x1e,0x26,0x1b,0x1f,0x21,0x1b,0x1b,0x1e,0x30,0x1b,0x1b,0x1d,0x1d,0x15,0x11,0x1c,0x1c,0x1c,0x1b,0x1c,0x2c,0x1c,0x2c,0x19,0x1c,0x2c,0x21,0x1c,0x2c,0x25,0x25,0x2c,0x1d,0x1c,0x2c,0x2c, -0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x2c,0x2c,0x1d,0x1c,0x1c,0x2c,0x1e,0x1b,0x1c,0x1c,0x2c,0x27,0x22,0x23,0x23,0x22,0x23,0x1f,0x22,0x27,0x23,0x21,0x1b,0x28,0x22,0x22,0x1d,0x21,0x23,0x25,0x24,0x1d,0x23,0x21,0x24,0x21,0x27,0x23,0x24,0x24,0x22,0x20,0x23,0x22,0x24,0x28,0x21,0x26,0x24,0x05,0x06,0x08,0x0a,0x08,0x0e,0x12,0x2b,0x1c, -0x1f,0x1e,0x1c,0x1f,0x1c,0x1c,0x20,0x1e,0x1c,0x0f,0x2a,0x1d,0x1c,0x1c,0x1b,0x1e,0x1a,0x1d,0x0d,0x1d,0x1a,0x1c,0x15,0x2b,0x1b,0x1c,0x1c,0x1e,0x2a,0x1c,0x1d,0x14,0x2a,0x1d,0x1d,0x22,0x22,0x0b,0x0e,0x39,0x38,0x38,0x39,0x47,0x1b,0x1b,0x0c,0x1b,0x13,0x1b,0x1b,0x1c,0x1b,0x1b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1c,0x1b,0x1b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x19,0x1d,0x15,0x15,0x1d,0x1f,0x0d,0x10,0x19,0x15,0x26,0x20,0x1f,0x18,0x1f,0x19,0x15,0x16,0x1e,0x1a,0x28,0x19,0x17,0x18,0x23,0x27,0x15,0x1f,0x18, -0x1d,0x1a,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15,0x15,0x0d,0x0d,0x0d,0x0d,0x20,0x1f,0x1f,0x1f,0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x17,0x19,0x19,0x19,0x19,0x19,0x1d,0x1d,0x1d,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x19,0x1f,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x1c,0x10,0x19,0x15,0x15,0x15,0x15,0x20,0x20,0x20,0x21,0x1f,0x1f, -0x1f,0x19,0x19,0x19,0x15,0x15,0x15,0x15,0x16,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x28,0x28,0x28,0x28,0x17,0x17,0x17,0x18,0x18,0x18,0x19,0x23,0x1f,0x19,0x19,0x14,0x1b,0x15,0x18,0x1f,0x1f,0x0d,0x19,0x1a,0x26,0x20,0x16,0x1f,0x1f,0x18,0x17,0x16,0x17,0x1f,0x19,0x21,0x20,0x19,0x15,0x1f,0x0d,0x1f,0x17,0x20,0x0d,0x17, -0x15,0x1c,0x14,0x1a,0x15,0x0d,0x0d,0x10,0x29,0x29,0x1f,0x19,0x19,0x1e,0x19,0x18,0x19,0x14,0x1d,0x15,0x25,0x16,0x20,0x20,0x19,0x1c,0x26,0x1f,0x1f,0x1f,0x18,0x19,0x16,0x19,0x1f,0x19,0x20,0x1b,0x28,0x2a,0x1c,0x23,0x19,0x1a,0x2b,0x18,0x14,0x1d,0x1d,0x1f,0x2c,0x2c,0x21,0x19,0x1d,0x15,0x1d,0x1c,0x1c,0x23,0x1a,0x1a,0x22,0x1d, -0x1d,0x12,0x1f,0x1f,0x1d,0x18,0x18,0x2d,0x25,0x18,0x1b,0x1e,0x1e,0x1f,0x1f,0x24,0x22,0x12,0x2f,0x1e,0x1c,0x1d,0x20,0x20,0x19,0x19,0x0d,0x26,0x22,0x22,0x18,0x23,0x0b,0x0b,0x16,0x16,0x0b,0x0b,0x1f,0x14,0x0d,0x26,0x23,0x0e,0x0b,0x0b,0x16,0x13,0x13,0x0b,0x0b,0x0b,0x13,0x22,0x18,0x0f,0x1e,0x22,0x1d,0x1d,0x19,0x25,0x1c,0x1e, -0x11,0x16,0x1b,0x15,0x0b,0x0b,0x14,0x1a,0x11,0x21,0x21,0x21,0x2e,0x26,0x2e,0x0d,0x00,0x00,0x00,0x00,0x00,0x0d,0x26,0x2a,0x11,0x11,0x19,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x19,0x19,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2e,0x2e,0x19,0x19,0x2e,0x2e,0x19,0x19,0x26,0x2a,0x11, -0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x32,0x26,0x2a,0x19,0x1d,0x1d,0x21,0x11,0x21,0x26,0x19,0x19,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x2e,0x11,0x26,0x19,0x19,0x0d,0x19,0x19,0x19,0x19,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d, -0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x3a,0x2a,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x2a,0x2a,0x32,0x32,0x32,0x32,0x32,0x32,0x26,0x19,0x19,0x26,0x19,0x19,0x2e,0x19,0x36,0x32,0x2e,0x19,0x2a,0x19,0x2a,0x19,0x2a,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x21, -0x21,0x21,0x21,0x21,0x11,0x21,0x21,0x11,0x11,0x21,0x11,0x21,0x11,0x21,0x19,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x11,0x11,0x19,0x11,0x11,0x11,0x11,0x00,0x3a,0x2a,0x43,0x32,0x2e,0x19,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x19,0x19,0x15,0x3a,0x2a,0x32,0x32,0x2e,0x2e,0x2e, -0x1d,0x1d,0x1d,0x1d,0x21,0x11,0x21,0x11,0x21,0x11,0x3a,0x2a,0x1d,0x21,0x1d,0x1d,0x1d,0x21,0x1d,0x1d,0x3a,0x3a,0x2a,0x2a,0x15,0x15,0x1d,0x1d,0x1d,0x1d,0x11,0x11,0x11,0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x1d,0x1d,0x1d,0x1d,0x2e,0x11,0x2e,0x11,0x1d,0x21,0x1d,0x1d,0x3a,0x3a,0x2a,0x2a,0x3a,0x3a, -0x2a,0x2a,0x2a,0x2a,0x19,0x19,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x00,0x00,0x0d,0x0d,0x11,0x0d,0x00,0x00,0x00,0x2a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x15,0x15,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, -0x2e,0x2e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x26,0x21,0x21,0x21,0x21,0x21,0x21,0x1d,0x2a,0x1d,0x2a,0x1d,0x2a,0x1d,0x2a,0x21,0x21,0x21,0x0d,0x0d,0x19,0x15,0x1d,0x20,0x1d,0x1b,0x1c,0x1d, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x17,0x1b,0x1a,0x1d,0x1f,0x1f,0x21,0x1d,0x1c,0x21,0x1a,0x21,0x26,0x20,0x25,0x29,0x20,0x26,0x22,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x17,0x1b,0x1e,0x1e,0x21,0x1d,0x20,0x1d,0x1e,0x1e,0x1a,0x1a,0x26,0x22,0x23,0x22,0x22,0x1e,0x1d,0x1d,0x25, -0x27,0x26,0x26,0x2e,0x2e,0x23,0x2e,0x2e,0x25,0x2c,0x2a,0x1c,0x26,0x2a,0x26,0x1e,0x2b,0x25,0x23,0x23,0x1e,0x20,0x25,0x28,0x23,0x1f,0x23,0x1d,0x1b,0x2e,0x2e,0x2e,0x29,0x2e,0x2e,0x22,0x2e,0x2e,0x23,0x26,0x27,0x25,0x24,0x24,0x20,0x2c,0x26,0x29,0x24,0x24,0x1d,0x25,0x23,0x23,0x2b,0x26,0x24,0x2d,0x1b,0x19,0x1c,0x1b,0x1f,0x1f, -0x23,0x25,0x1d,0x1c,0x1c,0x1b,0x1c,0x1b,0x1b,0x1c,0x1c,0x1d,0x1c,0x1c,0x1c,0x19,0x1a,0x1e,0x1f,0x1e,0x1e,0x17,0x1c,0x1c,0x1d,0x1e,0x26,0x2a,0x21,0x21,0x1f,0x26,0x20,0x22,0x1a,0x18,0x1d,0x1c,0x18,0x19,0x1b,0x1c,0x18,0x17,0x1f,0x17,0x1b,0x19,0x1b,0x27,0x1c,0x29,0x1b,0x1c,0x1c,0x25,0x10,0x27,0x22,0x24,0x21,0x1c,0x26,0x1e, -0x27,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1d,0x1e,0x1e,0x1e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x16,0x17,0x16,0x17,0x17,0x17,0x0f,0x10,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x1f,0x0d,0x0d,0x0d,0x10,0x10,0x0d,0x0d,0x0d,0x0f,0x0d,0x0d,0x0d,0x2d,0x2d,0x2d,0x2d,0x18,0x25,0x24,0x18,0x14,0x18,0x1a,0x1c,0x18,0x2a,0x29,0x2b,0x16, -0x32,0x18,0x2a,0x2a,0x2a,0x28,0x1c,0x18,0x18,0x27,0x1d,0x27,0x22,0x1b,0x17,0x14,0x33,0x15,0x1b,0x18,0x18,0x18,0x18,0x18,0x44,0x2a,0x2a,0x15,0x0d,0x17,0x0c,0x17,0x0c,0x0c,0x0c,0x18,0x1d,0x1d,0x1b,0x13,0x13,0x0b,0x0b,0x0b,0x13,0x0b,0x15,0x2b,0x0b,0x2d,0x2d,0x2d,0x1d,0x1d,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, -0x3a,0x3a,0x21,0x3a,0x3a,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x17,0x1d,0x17,0x1b,0x15,0x12,0x11,0x22,0x1b,0x24,0x16,0x38,0x2d,0x1e,0x1c,0x2e,0x28,0x2a,0x25,0x33,0x29,0x2e,0x27,0x20,0x18, -0x24,0x1d,0x2e,0x25,0x26,0x1e,0x25,0x1e,0x2b,0x21,0x2c,0x21,0x37,0x2a,0x26,0x1d,0x26,0x1d,0x3d,0x2c,0x28,0x00,0x31,0x31,0x31,0x18,0x00,0x00,0x1d,0x19,0x23,0x1c,0x1b,0x15,0x36,0x2d,0x2f,0x2b,0x24,0x1d,0x23,0x1d,0x1a,0x15,0x25,0x1e,0x1a,0x15,0x29,0x21,0x21,0x1c,0x31,0x29,0x1b,0x1d,0x25,0x25,0x28,0x16,0x0a,0x17,0x22,0x16, -0x32,0x32,0x0c,0x00,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x14,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x1b,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, -0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, -0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x24,0x24,0x24,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x18,0x22,0x24,0x0e,0x0a,0x0e,0x0a,0x24,0x1c,0x25,0x1f,0x1c,0x18,0x1b,0x18,0x1e,0x1d,0x15,0x15,0x38,0x29,0x3a,0x2c,0x31,0x2a,0x2d,0x21,0x2d,0x21,0x2d,0x21,0x1f,0x17,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1b,0x10,0x18, -0x0c,0x26,0x1d,0x2b,0x22,0x43,0x32,0x1c,0x1d,0x22,0x23,0x28,0x2b,0x26,0x1d,0x31,0x27,0x1b,0x14,0x1c,0x19,0x1f,0x18,0x2f,0x24,0x1f,0x1a,0x1c,0x1d,0x1c,0x1d,0x18,0x14,0x18,0x13,0x18,0x12,0x1a,0x1a,0x0f,0x22,0x10,0x30,0x21,0x11,0x1d,0x1f,0x17,0x26,0x1c,0x13,0x11,0x1d,0x1d,0x1d,0x18,0x0c,0x26,0x1e,0x12,0x11,0x1f,0x17,0x24, -0x13,0x27,0x1e,0x1f,0x17,0x22,0x1d,0x1d,0x19,0x25,0x1c,0x1e,0x11,0x1b,0x15,0x26,0x15,0x1b,0x2b,0x18,0x1c,0x2d,0x0d,0x39,0x2d,0x2d,0x3b,0x2c,0x2e,0x2e,0x2c,0x2c,0x2e,0x1a,0x18,0x1f,0x23,0x2d,0x23,0x2f,0x0c,0x17,0x1d,0x2b,0x33,0x23,0x33,0x1f,0x1f,0x28,0x23,0x39,0x2e,0x1a,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x2a,0x2a, -0x2a,0x2a,0x32,0x19,0x19,0x32,0x26,0x19,0x19,0x26,0x21,0x11,0x11,0x21,0x1d,0x1d,0x1d,0x1d,0x26,0x11,0x11,0x2a,0x26,0x11,0x11,0x2a,0x15,0x15,0x19,0x19,0x1a,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x1a,0x14,0x1c,0x1a, -0x25,0x1d,0x1d,0x2c,0x21,0x25,0x26,0x2a,0x29,0x1d,0x19,0x32,0x28,0x34,0x2b,0x22,0x1d,0x10,0x10,0x1d,0x20,0x14,0x1e,0x1a,0x1d,0x18,0x25,0x28,0x14,0x1d,0x15,0x0b,0x13,0x1b,0x1c,0x0b,0x0b,0x09,0x0b,0x13,0x13,0x13,0x16,0x4a,0x64,0x11,0x15,0x07,0x0d,0x13,0x16,0x10,0x19,0x1a,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, -0x18,0x18,0x18,0x18,0x18,0x42,0x1b,0x26,0x2e,0x2d,0x20,0x17,0x1c,0x24,0x25,0x18,0x10,0x21,0x1a,0x22,0x1c,0x21,0x1b,0x1b,0x25,0x1e,0x1d,0x1a,0x25,0x1f,0x2a,0x17,0x1a,0x20,0x10,0x1d,0x11,0x11,0x0c,0x2c,0x1d,0x1c,0x1a,0x1a,0x1d,0x2e,0x2e,0x2f,0x32,0x32,0x1b,0x19,0x0e,0x19,0x17,0x1e,0x17,0x21,0x0c,0x1c,0x1e,0x2b,0x2b,0x1f, -0x1b,0x1d,0x1b,0x1a,0x17,0x1a,0x17,0x18,0x0f,0x11,0x0c,0x0b,0x12,0x1d,0x20,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x00,0x0e,0x0e,0x0e,0x0d,0x0d,0x54,0x32,0x2c,0x34,0x0e,0x0e,0x10,0x14,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x00,0x2e,0x11,0x11,0x2e,0x0d,0x19, -0x19,0x43,0x32,0x32,0x43,0x2e,0x19,0x19,0x2e,0x19,0x19,0x15,0x15,0x00,0x00,0x12,0x25,0x1e,0x24,0x1d,0x3f,0x34,0x23,0x1b,0x23,0x1b,0x43,0x32,0x26,0x1d,0x13,0x10,0x1f,0x00,0x22,0x1b,0x11,0x0f,0x08,0x19,0x11,0x11,0x0d,0x0a,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0b,0x1a,0x15,0x1e,0x1d,0x1b,0x30,0x28,0x28,0x27,0x29, -0x2f,0x1f,0x22,0x1e,0x14,0x2e,0x38,0x16,0x3a,0x19,0x2a,0x2e,0x2e,0x2e,0x15,0x26,0x32,0x26,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x1d,0x1d,0x1d,0x2a,0x19,0x19,0x2e,0x11,0x11,0x2e,0x11,0x11,0x2e,0x19,0x19,0x00,0x15,0x2a,0x11,0x11,0x32,0x19,0x19,0x26,0x19,0x19,0x21,0x0f,0x0f, -0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x4b,0x4b,0x2c,0x00,0x00,0x2c,0x2c,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x1f,0x20,0x20,0x2c,0x20,0x20,0x28,0x31,0x21,0x20,0x35,0x20,0x20,0x2f,0x20,0x22,0x28,0x20,0x26,0x2a,0x2e,0x20,0x26,0x20,0x23,0x1f,0x23, -0x1f,0x21,0x22,0x1f,0x27,0x1e,0x21,0x27,0x1f,0x1f,0x1c,0x27,0x20,0x20,0x20,0x23,0x16,0x1a,0x20,0x27,0x27,0x1b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x14,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x04,0x1c,0xd0,0x00,0x00,0x01,0x42,0x01,0x00,0x00,0x07,0x00,0x42,0x00,0x0d,0x00,0x7e,0x03,0x77, -0x03,0x7f,0x03,0x8a,0x03,0x8c,0x03,0xa1,0x05,0x2f,0x05,0x56,0x05,0x5f,0x05,0x87,0x05,0x8a,0x05,0x8f,0x05,0xc7,0x05,0xea,0x05,0xf4,0x06,0x1c,0x06,0xff,0x07,0x7f,0x07,0xc9,0x08,0xb4,0x08,0xbd,0x08,0xff,0x09,0x6f,0x09,0xef,0x09,0xf3,0x0a,0x6f,0x0a,0xef,0x0a,0xf1,0x0b,0x6f,0x0b,0xef,0x0b,0xf9,0x0c,0x6f,0x0c,0xef,0x0d,0x6f, -0x0e,0x3f,0x0e,0x59,0x0e,0xd9,0x0f,0x29,0x10,0x49,0x10,0xc5,0x10,0xc7,0x10,0xcd,0x10,0xff,0x17,0xdb,0x17,0xe9,0x18,0x19,0x19,0xda,0x1c,0xbf,0x1d,0xca,0x1f,0x15,0x1f,0x1d,0x1f,0x45,0x1f,0x4d,0x1f,0x57,0x1f,0x59,0x1f,0x5b,0x1f,0x5d,0x1f,0x7d,0x1f,0xb4,0x1f,0xc4,0x1f,0xd3,0x1f,0xdb,0x1f,0xef,0x1f,0xf4,0x1f,0xfe,0x20,0x22, -0x20,0x26,0x20,0x30,0x20,0x34,0x20,0x3a,0x20,0x3e,0x20,0x44,0x20,0x5f,0x20,0x71,0x20,0x8e,0x20,0x9c,0x20,0xbf,0x20,0xe3,0x20,0xf0,0x21,0x05,0x21,0x13,0x21,0x17,0x21,0x22,0x21,0x26,0x21,0x2e,0x21,0x33,0x21,0x4e,0x21,0x5f,0x21,0x6f,0x21,0x89,0x21,0x94,0x21,0x97,0x21,0x99,0x22,0x02,0x22,0x06,0x22,0x0f,0x22,0x12,0x22,0x15, -0x22,0x1a,0x22,0x1f,0x22,0x29,0x22,0x2b,0x22,0x34,0x22,0x36,0x22,0x48,0x22,0x61,0x22,0x65,0x22,0xf2,0x24,0xff,0x25,0xa1,0x25,0xac,0x25,0xb2,0x25,0xba,0x25,0xbc,0x25,0xc4,0x25,0xcc,0x25,0xcf,0x25,0xd9,0x25,0xe6,0x26,0x61,0x26,0x63,0x26,0x66,0x26,0x6f,0x27,0x7f,0x2c,0x7f,0x2d,0x25,0x2d,0x27,0x2d,0x2d,0x2d,0xff,0x2e,0x17, -0x2e,0x3b,0xa4,0xff,0xa6,0x29,0xa6,0x9f,0xa7,0xae,0xa7,0xb7,0xa7,0xff,0xab,0x65,0xfb,0x06,0xfb,0x17,0xfb,0x36,0xfb,0x3c,0xfb,0x3e,0xfb,0x41,0xfb,0x44,0xfb,0xc1,0xfb,0xff,0xfc,0x63,0xfc,0xf4,0xfd,0x3f,0xfd,0xf2,0xfd,0xf4,0xfd,0xfd,0xfe,0x23,0xfe,0x58,0xfe,0x74,0xfe,0xfc,0xfe,0xff,0xff,0xfd,0xff,0xff,0x00,0x00,0x00,0x0d, -0x00,0x20,0x00,0xa0,0x03,0x7a,0x03,0x84,0x03,0x8c,0x03,0x8e,0x03,0xa3,0x05,0x31,0x05,0x59,0x05,0x61,0x05,0x89,0x05,0x8d,0x05,0x91,0x05,0xd0,0x05,0xef,0x06,0x00,0x06,0x1e,0x07,0x50,0x07,0xc0,0x08,0xa0,0x08,0xb6,0x08,0xd4,0x09,0x66,0x09,0xe6,0x09,0xf2,0x0a,0x66,0x0a,0xe6,0x0a,0xf1,0x0b,0x66,0x0b,0xe6,0x0b,0xf9,0x0c,0x66, -0x0c,0xe6,0x0d,0x66,0x0e,0x3f,0x0e,0x50,0x0e,0xd0,0x0f,0x20,0x10,0x40,0x10,0xa0,0x10,0xc7,0x10,0xcd,0x10,0xd0,0x17,0xdb,0x17,0xe0,0x18,0x10,0x19,0xd0,0x1c,0x90,0x1d,0x00,0x1d,0xfe,0x1f,0x18,0x1f,0x20,0x1f,0x48,0x1f,0x50,0x1f,0x59,0x1f,0x5b,0x1f,0x5d,0x1f,0x5f,0x1f,0x80,0x1f,0xb6,0x1f,0xc6,0x1f,0xd6,0x1f,0xdd,0x1f,0xf2, -0x1f,0xf6,0x20,0x00,0x20,0x26,0x20,0x28,0x20,0x32,0x20,0x39,0x20,0x3c,0x20,0x44,0x20,0x5e,0x20,0x70,0x20,0x74,0x20,0x90,0x20,0xa0,0x20,0xe3,0x20,0xf0,0x21,0x05,0x21,0x13,0x21,0x16,0x21,0x22,0x21,0x26,0x21,0x2e,0x21,0x33,0x21,0x4d,0x21,0x50,0x21,0x6c,0x21,0x7a,0x21,0x90,0x21,0x97,0x21,0x99,0x22,0x02,0x22,0x06,0x22,0x0f, -0x22,0x11,0x22,0x15,0x22,0x19,0x22,0x1e,0x22,0x29,0x22,0x2b,0x22,0x34,0x22,0x36,0x22,0x48,0x22,0x60,0x22,0x64,0x22,0xf2,0x24,0xff,0x25,0xa0,0x25,0xaa,0x25,0xb2,0x25,0xba,0x25,0xbc,0x25,0xc4,0x25,0xca,0x25,0xcf,0x25,0xd8,0x25,0xe6,0x26,0x60,0x26,0x63,0x26,0x65,0x26,0x6f,0x27,0x76,0x2c,0x60,0x2d,0x00,0x2d,0x27,0x2d,0x2d, -0x2d,0xe0,0x2e,0x17,0x2e,0x32,0xa4,0xd0,0xa6,0x20,0xa6,0x40,0xa7,0x00,0xa7,0xb0,0xa7,0xf7,0xab,0x30,0xfb,0x00,0xfb,0x13,0xfb,0x1d,0xfb,0x38,0xfb,0x3e,0xfb,0x40,0xfb,0x43,0xfb,0x46,0xfb,0xd3,0xfc,0x5e,0xfc,0xf2,0xfd,0x3c,0xfd,0xf2,0xfd,0xf4,0xfd,0xfa,0xfe,0x20,0xfe,0x58,0xfe,0x70,0xfe,0x76,0xfe,0xff,0xff,0xfc,0xff,0xff, -0xff,0xf5,0xff,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x19,0x00,0x00,0x00,0x00,0x07,0x2a,0x07,0x28,0x07,0x27,0x07,0x26,0x00,0x00,0x00,0x00,0x05,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0c,0x00,0x00,0x0b,0x9f,0x00,0x00,0x06,0x70,0x05,0xfa,0x0a,0x5b,0x05,0x84,0x05,0x0e,0x09,0x5e,0x04,0x98,0x04,0x22,0x08,0x57, -0x03,0xac,0x03,0x36,0x02,0xc0,0xfa,0x4d,0x01,0xe0,0x01,0x6a,0x01,0x24,0x00,0x0e,0xfb,0x42,0xfe,0xfe,0xfe,0xf9,0x00,0x00,0xfc,0x76,0xf8,0x82,0xf8,0x5c,0xf6,0xa6,0xf8,0x1f,0x00,0x00,0x00,0x00,0xe4,0x77,0xe4,0x75,0xe4,0x73,0xe4,0x71,0xe4,0x70,0xe4,0x6f,0xe4,0x6e,0xe4,0x6d,0xe4,0x6b,0xe4,0x6a,0xe4,0x69,0xe4,0x67,0xe4,0x66, -0xe4,0x64,0xe4,0x63,0x00,0x00,0xe0,0x86,0x00,0x00,0x00,0x00,0xe0,0x85,0x00,0x00,0xe0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xaa,0xea,0x32,0xe0,0x39,0xe0,0x2c,0x00,0x00,0xdf,0x6b,0xdf,0x79,0xe0,0x69,0xf3,0x1f,0xe9,0x97,0x00,0x00,0xf1,0x80,0x00,0x00,0xe9,0x9c,0xef,0xeb,0xef,0xea,0xde,0x97,0xe9,0x2b, -0xde,0x8c,0x00,0x00,0xde,0xa7,0x00,0x00,0x00,0x00,0xe9,0x0a,0xde,0x71,0xe9,0x00,0xee,0xc4,0xde,0x60,0x00,0x00,0xde,0x31,0xe8,0x43,0xe3,0x83,0x00,0x00,0x00,0x00,0xe5,0x86,0xe5,0x7f,0xe5,0x7e,0xe5,0x77,0x00,0x00,0xdb,0x74,0xe5,0x65,0xdb,0x5e,0x00,0x00,0xe4,0xdd,0xe4,0xdc,0xeb,0x1a,0x00,0x00,0x00,0x00,0xdf,0x35,0xe2,0xa3, -0xe2,0x9e,0xe3,0x30,0xda,0x43,0xe5,0x3b,0x68,0xf2,0x6a,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x9e,0x00,0x00,0x10,0x6c,0x10,0x6b,0x10,0x6a,0x10,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xf8,0x00,0x00,0x0c,0x71,0x15,0xfb,0x00,0x00,0x09,0x1a,0x14,0xa7,0x15,0x83,0x00,0x00,0x0c,0x0c,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x3e,0x06,0xec,0x06,0xf6,0x00,0x00,0x07,0x00,0x07,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x36,0x0a,0x3a,0x00,0x00,0x0a,0xa4,0x0a,0xae,0x0a,0xe6,0x0c,0xa8,0x00,0x00,0x0d,0x04,0x00,0x00,0x0d,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0xac,0x0f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x50,0x00,0x00,0x11,0x92,0x11,0xa2,0x00,0x00,0x11,0xa4,0x00,0x00,0x11,0xa6,0x11,0xa8,0x11,0xaa,0x11,0xde,0x11,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x24,0x00,0x00,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x12,0x52,0x00,0x00,0x12,0x52,0x12,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x48,0x12,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x40,0x12,0x52,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x80,0x13,0x3e,0x14,0x9a,0x14,0xa8,0x14,0xb8,0x15,0x22,0x00,0x00,0x15,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x56,0x16,0x4c,0x16,0xa4,0x00,0x00,0x16,0xac,0x00,0x00,0x00,0x00,0x16,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xae,0x00,0x00, -0x17,0xb8,0x00,0x00,0x00,0xa3,0x00,0xa4,0x00,0x84,0x00,0x85,0x02,0x3f,0x00,0x97,0x00,0xe7,0x00,0x86,0x00,0x8f,0x00,0x8c,0x00,0x9d,0x00,0xaa,0x00,0xa5,0x00,0x8a,0x00,0x8b,0x01,0x01,0x00,0x83,0x00,0x94,0x08,0x96,0x08,0x97,0x00,0x8e,0x00,0x98,0x00,0x88,0x00,0xc3,0x00,0xdd,0x08,0x98,0x00,0x9e,0x00,0xab,0x00,0xf4,0x00,0xf3, -0x00,0xf5,0x00,0xa2,0x00,0xad,0x00,0xc9,0x00,0xc7,0x00,0xae,0x00,0x62,0x00,0x63,0x00,0x91,0x00,0x64,0x00,0xcb,0x00,0x65,0x00,0xc8,0x00,0xca,0x00,0xcf,0x00,0xcc,0x00,0xcd,0x00,0xce,0x00,0xe8,0x00,0x66,0x00,0xd2,0x00,0xd0,0x00,0xd1,0x00,0xaf,0x00,0x67,0x00,0xef,0x00,0x92,0x00,0xd5,0x00,0xd3,0x00,0xd4,0x00,0x68,0x00,0xea, -0x00,0xec,0x00,0x89,0x00,0x6a,0x00,0x69,0x00,0x6b,0x00,0x6d,0x00,0x6c,0x00,0x6e,0x00,0xa0,0x00,0x6f,0x00,0x71,0x00,0x70,0x00,0x72,0x00,0x73,0x00,0x75,0x00,0x74,0x00,0x76,0x00,0x77,0x00,0xe9,0x00,0x78,0x00,0x7a,0x00,0x79,0x00,0x7b,0x00,0x7d,0x00,0x7c,0x00,0xb8,0x00,0xa1,0x00,0x7f,0x00,0x7e,0x00,0x80,0x00,0x81,0x00,0xeb, -0x00,0xed,0x00,0xba,0x01,0x45,0x01,0x46,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x00,0xfc,0x00,0xfd,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x00,0xfe,0x00,0xff,0x01,0x07,0x01,0x08,0x01,0x09,0x01,0x00,0x01,0x4b,0x01,0x4c,0x01,0x4d,0x01,0x4e,0x01,0x4f,0x01,0x50,0x01,0x0a,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x01,0x51,0x01,0x52, -0x00,0xf7,0x00,0xf8,0x01,0x53,0x01,0x54,0x01,0x55,0x01,0x56,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x5a,0x01,0x5b,0x01,0x5c,0x01,0x5d,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x61,0x01,0x62,0x00,0xf9,0x00,0xd6,0x01,0x39,0x01,0x3a,0x01,0x63,0x01,0x64,0x01,0x65,0x01,0x66,0x01,0x67,0x01,0x0e,0x01,0x0f,0x01,0x68,0x01,0x69,0x01,0x10, -0x01,0x11,0x01,0x12,0x01,0x13,0x00,0xe1,0x00,0xe2,0x01,0x14,0x01,0x15,0x01,0x6a,0x01,0x6b,0x01,0x16,0x01,0x17,0x01,0x3b,0x01,0x6c,0x01,0x6d,0x01,0x6e,0x01,0x6f,0x01,0x70,0x01,0x71,0x01,0x18,0x01,0x19,0x00,0xb0,0x00,0xb1,0x01,0x1a,0x01,0x1b,0x01,0x72,0x01,0x73,0x01,0x1c,0x01,0x1d,0x01,0x1e,0x01,0x1f,0x01,0x74,0x01,0x75, -0x00,0xfa,0x00,0xfb,0x00,0xe3,0x00,0xe4,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0x79,0x01,0x7a,0x01,0x7b,0x01,0x7c,0x01,0x7d,0x01,0x24,0x01,0x25,0x01,0x26,0x01,0x27,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x00,0xbb,0x01,0x28,0x01,0x29,0x01,0x2a,0x01,0x2b,0x00,0xe5, -0x00,0xe6,0x01,0x84,0x04,0xb0,0x04,0xb1,0x04,0xb2,0x04,0xb3,0x04,0xb4,0x04,0xb5,0x04,0xb6,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xba,0x04,0xbb,0x04,0xbc,0x04,0xbd,0x04,0xbe,0x02,0xcd,0x04,0xbf,0x04,0xc0,0x00,0xa7,0x04,0xc1,0x04,0xc2,0x04,0xc3,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc7,0x04,0xc8,0x04,0xc9,0x04,0xca,0x04,0xcb, -0x04,0xcc,0x04,0xcd,0x02,0x40,0x02,0x41,0x04,0xce,0x04,0xcf,0x04,0xd0,0x04,0xd1,0x04,0xd2,0x04,0xd3,0x04,0xd4,0x04,0xd5,0x04,0xd6,0x04,0xd7,0x04,0xd8,0x04,0xd9,0x04,0xda,0x02,0x42,0x02,0x43,0x04,0xdb,0x04,0xdc,0x04,0xdd,0x04,0xde,0x04,0xdf,0x04,0xe0,0x04,0xe1,0x04,0xe2,0x04,0xe3,0x04,0xe4,0x04,0xe5,0x04,0xe6,0x04,0xe7, -0x04,0xe8,0x04,0xe9,0x04,0xea,0x04,0xeb,0x04,0xec,0x04,0xed,0x04,0xee,0x04,0xef,0x04,0xf0,0x04,0xf1,0x04,0xf2,0x04,0xf3,0x04,0xf4,0x04,0xf5,0x04,0xf6,0x04,0xf7,0x04,0xf8,0x04,0xf9,0x04,0xfa,0x04,0xfb,0x04,0xfc,0x04,0xfd,0x04,0xfe,0x04,0xff,0x05,0x00,0x05,0x01,0x05,0x02,0x05,0x03,0x05,0x04,0x05,0x05,0x05,0x06,0x05,0x07, -0x05,0x08,0x05,0x09,0x05,0x0a,0x05,0x0b,0x05,0x0c,0x05,0x0d,0x05,0x0e,0x05,0x0f,0x05,0x10,0x05,0x11,0x05,0x12,0x05,0x13,0x05,0x14,0x05,0x15,0x05,0x16,0x05,0x17,0x05,0x18,0x05,0x19,0x05,0x1a,0x05,0x1b,0x05,0x1c,0x05,0x1d,0x05,0x1e,0x05,0x1f,0x05,0x20,0x05,0x21,0x05,0x22,0x05,0x23,0x01,0x85,0x01,0x86,0x01,0x87,0x01,0x88, -0x01,0x89,0x01,0x8a,0x05,0x24,0x05,0x25,0x05,0x26,0x05,0x27,0x05,0x28,0x05,0x29,0x05,0x2a,0x05,0x2b,0x05,0x2c,0x05,0x2d,0x05,0x2e,0x05,0x2f,0x05,0x30,0x05,0x31,0x05,0x32,0x05,0x33,0x05,0x34,0x05,0x35,0x05,0x36,0x05,0x37,0x05,0x38,0x05,0x39,0x05,0x3a,0x05,0x3b,0x02,0x3d,0x02,0x3e,0x02,0xaf,0x02,0xb0,0x05,0x3c,0x05,0x3d, -0x05,0x3e,0x05,0x3f,0x05,0x40,0x07,0x3e,0x05,0x41,0x05,0x42,0x05,0x43,0x05,0x44,0x05,0x45,0x05,0x46,0x02,0xe1,0x02,0xe2,0x05,0x47,0x05,0x48,0x05,0x49,0x05,0x4a,0x05,0x4b,0x05,0x4c,0x05,0x4d,0x05,0x4e,0x05,0x4f,0x05,0x50,0x07,0x3f,0x07,0x40,0x07,0x41,0x06,0xac,0x07,0xe1,0x07,0xe2,0x07,0xe4,0x07,0xe5,0x07,0xe6,0x07,0xe7, -0x07,0xe8,0x07,0xe9,0x07,0xea,0x07,0xeb,0x0a,0xbf,0x0a,0xc0,0x0a,0xc1,0x0a,0xc2,0x0a,0xc3,0x0a,0xc4,0x0a,0xc5,0x0a,0xc6,0x0a,0xc7,0x0a,0xc8,0x0a,0xc9,0x0a,0xca,0x0a,0xcb,0x0a,0xcc,0x05,0x56,0x05,0x57,0x05,0x58,0x05,0x59,0x05,0x5a,0x05,0x5b,0x05,0x5c,0x05,0x5d,0x05,0x5e,0x02,0xce,0x05,0x5f,0x05,0x60,0x05,0x61,0x05,0x62, -0x05,0x63,0x05,0x64,0x05,0x65,0x05,0x66,0x05,0x67,0x05,0x68,0x05,0x69,0x05,0x6a,0x05,0x6b,0x05,0x6c,0x05,0x6d,0x05,0x6e,0x05,0x6f,0x05,0x70,0x05,0x71,0x05,0x72,0x05,0x73,0x05,0x74,0x05,0x75,0x05,0x76,0x05,0x77,0x05,0x78,0x05,0x79,0x05,0x7a,0x05,0x7b,0x05,0x7c,0x05,0x7d,0x05,0x7e,0x05,0x7f,0x05,0x80,0x05,0x81,0x05,0x82, -0x05,0x83,0x05,0x84,0x05,0x85,0x05,0x86,0x05,0x87,0x05,0x88,0x05,0x89,0x05,0x8a,0x05,0x8b,0x05,0x8c,0x05,0x8d,0x05,0x8e,0x05,0x8f,0x05,0x90,0x05,0x91,0x05,0x92,0x05,0x93,0x05,0x94,0x05,0x95,0x05,0x96,0x05,0x97,0x05,0x98,0x05,0x99,0x05,0x9a,0x05,0x9b,0x05,0x9c,0x05,0x9d,0x05,0x9e,0x05,0x9f,0x05,0xa0,0x05,0xa1,0x05,0xa2, -0x05,0xa3,0x05,0xa4,0x05,0xa5,0x05,0xa6,0x05,0xa7,0x05,0xa8,0x05,0xa9,0x05,0xaa,0x05,0xab,0x05,0xac,0x05,0xad,0x05,0xae,0x05,0xaf,0x05,0xb0,0x05,0xb1,0x05,0xb2,0x07,0x42,0x07,0x43,0x06,0x76,0x06,0x77,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x7c,0x06,0x7d,0x06,0x7e,0x06,0x7f,0x06,0x80,0x06,0x81,0x06,0x82,0x06,0x83, -0x06,0x84,0x06,0x85,0x06,0x86,0x06,0x87,0x06,0x88,0x06,0x89,0x06,0x8a,0x06,0x8b,0x00,0xd7,0x00,0xe0,0x06,0x8c,0x00,0xd9,0x06,0x8d,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x00,0xda,0x00,0xdb,0x00,0xdc,0x00,0xdf,0x00,0xd8,0x00,0xde, -0x06,0x9b,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa3,0x06,0xa4,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x07,0x44,0x07,0x45,0x07,0x46,0x07,0x47,0x07,0x48,0x07,0x49,0x07,0x4a,0x07,0x4b,0x07,0x4c,0x07,0x4d,0x07,0x4e,0x07,0x4f,0x07,0x50,0x07,0x51,0x07,0x52, -0x07,0x53,0x07,0x54,0x02,0x46,0x02,0x47,0x04,0x62,0x04,0x63,0x04,0x64,0x04,0x65,0x04,0x66,0x04,0x67,0x04,0x68,0x02,0x44,0x04,0x69,0x04,0x6a,0x04,0x6b,0x04,0x6c,0x04,0x6d,0x04,0x6e,0x04,0x6f,0x04,0x70,0x04,0x71,0x04,0x72,0x04,0x73,0x04,0x74,0x04,0x75,0x04,0x76,0x04,0x77,0x04,0x78,0x04,0x79,0x04,0x7a,0x04,0x7b,0x04,0x7c, -0x04,0x7d,0x04,0x7e,0x04,0x7f,0x04,0x80,0x04,0x81,0x02,0x45,0x04,0x82,0x04,0x83,0x04,0x84,0x04,0x85,0x04,0x86,0x04,0x87,0x04,0x88,0x04,0x89,0x04,0x8a,0x04,0x8b,0x04,0x8c,0x04,0x8d,0x04,0x8e,0x04,0x8f,0x04,0x90,0x04,0x91,0x04,0x92,0x04,0x93,0x04,0x94,0x04,0x95,0x04,0x96,0x04,0x97,0x04,0x98,0x04,0x99,0x04,0x9a,0x04,0x9b, -0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xa2,0x04,0xa3,0x04,0xa4,0x04,0xa5,0x04,0xa6,0x04,0xa7,0x04,0xa8,0x04,0xa9,0x04,0xaa,0x04,0xab,0x04,0xac,0x07,0x39,0x07,0x55,0x07,0x56,0x07,0x57,0x07,0x58,0x07,0x59,0x07,0x5a,0x07,0x5b,0x07,0x5c,0x07,0xec,0x07,0xed,0x07,0xee,0x07,0xef,0x07,0xf0,0x07,0x5d, -0x07,0x5e,0x07,0x5f,0x04,0xad,0x04,0xae,0x04,0xaf,0x06,0x66,0x06,0x67,0x06,0x68,0x06,0x69,0x06,0x6a,0x06,0x6b,0x06,0x6c,0x06,0x6d,0x06,0x6e,0x06,0x6f,0x06,0x70,0x06,0x71,0x06,0x72,0x13,0x46,0x13,0x47,0x13,0x48,0x13,0x49,0x06,0x73,0x06,0x74,0x13,0x4a,0x13,0x4b,0x06,0x75,0x0a,0xcd,0x0a,0xce,0x0a,0xcf,0x01,0x9e,0x14,0x19, -0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0x8b,0x01,0xa2,0x01,0xa3,0x01,0xa4,0x01,0xa6,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0x2c,0x00,0xa9,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0x2d,0x01,0xae,0x01,0xaf,0x01,0xb0,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4,0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0x2e,0x01,0xba, -0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x01,0xc3,0x01,0x2f,0x01,0xc4,0x01,0xc5,0x01,0x30,0x01,0x31,0x01,0xc6,0x01,0xc7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xcc,0x01,0xcd,0x01,0xce,0x01,0xcf,0x02,0x37,0x01,0xd0,0x01,0xd1,0x01,0x32,0x01,0x33,0x01,0xd2,0x01,0x34,0x01,0xd3, -0x01,0xd4,0x01,0xd5,0x01,0xd6,0x01,0xd7,0x01,0xd8,0x01,0xd9,0x01,0xda,0x13,0x4c,0x05,0xb3,0x05,0xb4,0x05,0xb5,0x05,0xb6,0x05,0xb7,0x05,0xb8,0x05,0xb9,0x05,0xba,0x05,0xbb,0x05,0xbc,0x05,0xbd,0x05,0xbe,0x05,0xbf,0x05,0xc0,0x05,0xc1,0x05,0xc2,0x05,0xc3,0x05,0xc4,0x05,0xc5,0x05,0xc6,0x05,0xc7,0x05,0xc8,0x05,0xc9,0x05,0xca, -0x05,0xcb,0x05,0xcc,0x05,0xcd,0x05,0xce,0x05,0xcf,0x05,0xd0,0x05,0xd1,0x05,0xd2,0x05,0xd3,0x05,0xd4,0x05,0xd5,0x05,0xd6,0x05,0xd7,0x05,0xd8,0x05,0xd9,0x07,0x60,0x07,0x61,0x08,0xc0,0x08,0xc1,0x08,0xc2,0x07,0xf1,0x07,0xf2,0x07,0xf3,0x07,0xf4,0x02,0xb1,0x01,0xdb,0x01,0xdc,0x01,0xdd,0x01,0xde,0x01,0xdf,0x02,0xb5,0x01,0xe0, -0x02,0xb6,0x01,0xe1,0x01,0xe2,0x01,0xe3,0x01,0xe4,0x02,0xb3,0x01,0xe5,0x01,0xe6,0x01,0xe7,0x01,0xe8,0x01,0xe9,0x01,0xea,0x01,0xeb,0x01,0xec,0x01,0xed,0x01,0xee,0x01,0xef,0x01,0xf0,0x01,0xf1,0x01,0xf2,0x01,0xf3,0x01,0xf4,0x01,0xf5,0x01,0xf6,0x01,0xf7,0x01,0xf8,0x01,0xf9,0x01,0xfa,0x01,0xfb,0x01,0xfc,0x01,0xfd,0x01,0xfe, -0x01,0xff,0x02,0x00,0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x04,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x09,0x02,0x0a,0x02,0x0b,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x10,0x02,0x11,0x02,0x12,0x02,0x13,0x02,0x14,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x1a,0x02,0x1b,0x02,0x1c,0x02,0x1d,0x02,0x1e, -0x02,0x1f,0x02,0x20,0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x24,0x02,0x25,0x02,0x26,0x02,0xb2,0x02,0x27,0x02,0x28,0x02,0x29,0x02,0x2a,0x02,0x2b,0x02,0xb7,0x02,0x2c,0x02,0xb8,0x02,0x2d,0x02,0x2e,0x02,0x2f,0x02,0x30,0x02,0xb4,0x02,0x31,0x02,0x32,0x05,0xda,0x05,0xdb,0x05,0xdc,0x05,0xdd,0x05,0xde,0x05,0xdf,0x05,0xe0,0x05,0xe1, -0x05,0xe2,0x05,0xe3,0x05,0xe4,0x05,0xe5,0x05,0xe6,0x05,0xe7,0x05,0xe8,0x05,0xe9,0x05,0xea,0x05,0xeb,0x05,0xec,0x05,0xed,0x05,0xee,0x05,0xef,0x05,0xf0,0x05,0xf1,0x05,0xf2,0x05,0xf3,0x05,0xf4,0x05,0xf5,0x05,0xf6,0x05,0xf7,0x05,0xf8,0x05,0xf9,0x05,0xfa,0x05,0xfb,0x05,0xfc,0x05,0xfd,0x05,0xfe,0x05,0xff,0x06,0x00,0x0b,0x1c, -0x06,0x01,0x06,0x02,0x08,0xb4,0x08,0xb5,0x06,0x03,0x06,0x04,0x06,0x05,0x06,0x06,0x02,0x33,0x02,0x34,0x02,0xb9,0x02,0xba,0x06,0x07,0x06,0x08,0x02,0xbb,0x02,0xbc,0x06,0x09,0x06,0x0a,0x02,0xbd,0x02,0xbe,0x02,0xbf,0x02,0xc0,0x06,0x0b,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x02,0xc1,0x02,0xc2,0x06,0x0f,0x06,0x10,0x06,0x11,0x06,0x12, -0x06,0x13,0x06,0x14,0x06,0x15,0x06,0x16,0x06,0x17,0x06,0x18,0x02,0xc3,0x02,0xc4,0x02,0xc5,0x02,0xc6,0x02,0xc7,0x02,0xc8,0x06,0x19,0x06,0x1a,0x06,0x1b,0x06,0x1c,0x02,0xc9,0x02,0xca,0x02,0xcb,0x02,0xcc,0x06,0x1d,0x06,0x1e,0x06,0x1f,0x06,0x20,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x25,0x08,0xb6,0x08,0xb7,0x06,0x26, -0x06,0x27,0x08,0xb8,0x08,0xb9,0x06,0x28,0x06,0x29,0x08,0xba,0x08,0xbb,0x0a,0xd0,0x06,0x2a,0x06,0x2b,0x06,0x2c,0x06,0x2d,0x06,0x2e,0x06,0x2f,0x06,0x30,0x06,0x31,0x06,0x32,0x06,0x33,0x06,0x34,0x06,0x35,0x06,0x36,0x06,0x37,0x06,0x38,0x06,0x39,0x06,0x3a,0x06,0x3b,0x06,0x3c,0x06,0x3d,0x06,0x3e,0x06,0x3f,0x06,0x40,0x06,0x41, -0x02,0xcf,0x02,0xd0,0x06,0x42,0x06,0x43,0x06,0x44,0x06,0x45,0x06,0x46,0x06,0x47,0x06,0x48,0x06,0x49,0x06,0x4a,0x06,0x4b,0x06,0x4c,0x06,0x4d,0x07,0xf5,0x07,0xf6,0x06,0x4e,0x06,0x4f,0x0a,0xd1,0x0a,0xd2,0x0a,0xd3,0x0a,0xd4,0x0a,0xd5,0x0a,0xd6,0x06,0x50,0x06,0x51,0x06,0x52,0x06,0x53,0x06,0x54,0x06,0x55,0x06,0x56,0x06,0x57, -0x06,0x58,0x06,0x59,0x06,0x5a,0x06,0x5b,0x06,0x5c,0x06,0x5d,0x06,0x5e,0x06,0x5f,0x0a,0xd7,0x0a,0xd8,0x0a,0xd9,0x0a,0xda,0x13,0x4d,0x13,0x4e,0x13,0x4f,0x13,0x50,0x13,0x51,0x13,0x52,0x0b,0x1d,0x0b,0x1e,0x0b,0x1f,0x0b,0x20,0x13,0x53,0x13,0x54,0x13,0x55,0x13,0x56,0x13,0x57,0x13,0x58,0x14,0x1a,0x14,0x1b,0x13,0x59,0x13,0x5a, -0x14,0x1c,0x14,0x1d,0x14,0x1e,0x14,0x1f,0x14,0x20,0x14,0x21,0x14,0x22,0x14,0x23,0x11,0x8a,0x11,0x8b,0x0f,0xc4,0x0b,0xbf,0x0b,0xc0,0x0b,0xc1,0x0b,0xc2,0x0b,0xc3,0x0b,0xc4,0x0b,0xc5,0x0b,0xc6,0x0b,0xc7,0x0b,0xc8,0x0b,0xc9,0x0b,0xca,0x0b,0xcb,0x0b,0xcc,0x0b,0xcd,0x0b,0xce,0x0b,0xcf,0x0b,0xd0,0x0b,0xd1,0x0b,0xd2,0x0b,0xd3, -0x0b,0xd4,0x0b,0xd5,0x0b,0xd6,0x0b,0xd7,0x0b,0xd8,0x0b,0xd9,0x0b,0xda,0x0b,0xdb,0x0b,0xdc,0x0b,0xdd,0x0b,0x53,0x0b,0x54,0x0b,0x55,0x0b,0x56,0x0b,0x57,0x0b,0x58,0x0b,0x59,0x0b,0x5a,0x0b,0x5b,0x0b,0x5c,0x0b,0xde,0x0b,0x5d,0x0b,0x5e,0x0b,0x5f,0x0b,0x60,0x0b,0x61,0x0b,0x62,0x0b,0x63,0x0b,0x64,0x0b,0x65,0x0b,0x66,0x0b,0x67, -0x0b,0xdf,0x0b,0xb9,0x14,0xdf,0x0b,0x83,0x0b,0x84,0x0b,0x85,0x0b,0x86,0x0b,0x87,0x0a,0x44,0x0a,0x45,0x0a,0x46,0x0a,0x47,0x13,0x45,0x14,0x03,0x0e,0x13,0x0e,0x14,0x0e,0x16,0x0e,0x17,0x0e,0x18,0x0a,0x6a,0x08,0xf8,0x0a,0x49,0x0a,0x48,0x0a,0x4a,0x0a,0x4b,0x0a,0x4c,0x0a,0x4d,0x0a,0x4e,0x0a,0x4f,0x0a,0x53,0x0e,0x1a,0x0e,0x1b, -0x0e,0x1c,0x0e,0x1d,0x0e,0x1e,0x09,0x05,0x13,0x92,0x0a,0x6b,0x09,0x06,0x0e,0x20,0x09,0x07,0x09,0x08,0x09,0x09,0x09,0x0a,0x09,0x0b,0x09,0x0c,0x09,0x0d,0x09,0x0e,0x09,0x0f,0x09,0x10,0x09,0x11,0x09,0x12,0x09,0x13,0x09,0x14,0x09,0x15,0x09,0x16,0x09,0x17,0x09,0x18,0x09,0x19,0x09,0x1a,0x09,0x1b,0x09,0x1c,0x09,0x1d,0x09,0x1e, -0x09,0x1f,0x09,0x20,0x0e,0x3f,0x0e,0x43,0x0e,0x47,0x0e,0x4b,0x0e,0x4f,0x09,0x21,0x09,0x22,0x09,0x23,0x09,0x24,0x09,0x25,0x09,0x26,0x09,0x27,0x09,0x28,0x09,0x29,0x09,0x2a,0x09,0x2b,0x09,0x2c,0x09,0x2d,0x09,0x2e,0x09,0x2f,0x09,0x30,0x09,0x31,0x09,0x32,0x09,0x33,0x09,0x37,0x09,0x7e,0x09,0x7f,0x0a,0x50,0x0a,0x51,0x0a,0x52, -0x0a,0x6c,0x0a,0x6d,0x0a,0x6e,0x0a,0x6f,0x0a,0x70,0x0a,0x71,0x09,0x77,0x08,0xd7,0x08,0xd8,0x08,0xd9,0x08,0xda,0x08,0xdb,0x08,0xdc,0x08,0xdd,0x08,0xde,0x08,0xdf,0x08,0xe0,0x09,0x6a,0x09,0x03,0x0e,0x6d,0x09,0x6b,0x09,0x3e,0x09,0x7c,0x09,0x73,0x09,0x80,0x09,0x82,0x09,0x84,0x0e,0x73,0x09,0x86,0x09,0x88,0x09,0x89,0x09,0x8a, -0x09,0x5b,0x09,0x8c,0x09,0x8e,0x09,0x90,0x09,0x92,0x09,0x40,0x09,0x94,0x09,0x96,0x09,0x98,0x09,0x9b,0x09,0x9e,0x09,0xa1,0x09,0xa4,0x09,0x42,0x09,0xa7,0x09,0x5d,0x09,0xaa,0x09,0xab,0x09,0xac,0x09,0xad,0x09,0xae,0x09,0xaf,0x09,0xb0,0x09,0xb1,0x09,0x5e,0x09,0xb2,0x09,0xb3,0x09,0xb4,0x09,0xb5,0x09,0xb6,0x09,0xb7,0x09,0x45, -0x09,0xb8,0x09,0xb9,0x09,0xbb,0x09,0xbd,0x09,0xbf,0x09,0xc1,0x09,0xc3,0x09,0xc4,0x09,0xc8,0x09,0xc9,0x09,0xcc,0x09,0x6c,0x09,0xcf,0x09,0xd2,0x09,0xd5,0x09,0xd6,0x09,0x46,0x09,0xd7,0x09,0xd9,0x09,0xdb,0x09,0xdd,0x09,0xdf,0x09,0x48,0x09,0xe1,0x09,0xe3,0x09,0xe5,0x09,0xe7,0x09,0xe9,0x09,0xeb,0x09,0xed,0x09,0xef,0x09,0xf1, -0x09,0xf3,0x09,0x5f,0x09,0xf5,0x09,0xf6,0x09,0xf8,0x08,0xf1,0x09,0xfa,0x09,0x4e,0x09,0x60,0x09,0x63,0x09,0x64,0x09,0xfd,0x09,0xfe,0x09,0xff,0x0a,0x00,0x0a,0x01,0x0a,0x02,0x0a,0x03,0x0a,0x04,0x09,0x4a,0x0a,0x05,0x0a,0x07,0x0a,0x0a,0x0a,0x0b,0x0a,0x0d,0x09,0x65,0x09,0x67,0x09,0x69,0x0b,0x19,0x09,0x74,0x0a,0x0f,0x0a,0x10, -0x09,0x75,0x0a,0x11,0x0a,0x12,0x0a,0x13,0x0a,0x14,0x0a,0x15,0x0a,0x16,0x0a,0x17,0x0a,0x18,0x0a,0x19,0x0a,0x1a,0x0a,0x1b,0x0a,0x1c,0x0a,0x1d,0x0a,0x1e,0x0a,0x1f,0x0a,0x20,0x0a,0x21,0x0a,0x22,0x0e,0xeb,0x0a,0x23,0x0a,0x54,0x0a,0x56,0x09,0x4f,0x09,0x50,0x09,0x51,0x09,0x52,0x09,0x53,0x09,0x54,0x09,0x55,0x09,0x56,0x09,0x57, -0x09,0x58,0x0a,0x24,0x0a,0x26,0x0a,0x28,0x0a,0x2c,0x0a,0x2d,0x0a,0x58,0x0a,0x72,0x0a,0x74,0x0a,0x76,0x0a,0x78,0x0a,0x7a,0x0a,0x7c,0x0a,0x7e,0x0a,0x80,0x0a,0x83,0x0a,0x86,0x0a,0x87,0x0a,0x88,0x0a,0x89,0x0a,0x8b,0x0a,0x8f,0x0a,0x93,0x0a,0x97,0x0a,0x9a,0x0a,0x9d,0x0a,0xa0,0x0a,0xa3,0x0a,0xa6,0x0a,0xa8,0x0a,0xaa,0x0a,0xac, -0x0a,0xae,0x0a,0xb0,0x0a,0xb4,0x0a,0xb5,0x0a,0xb6,0x0f,0x16,0x0f,0x1a,0x0f,0x1e,0x0f,0x22,0x0f,0x24,0x0f,0x28,0x0f,0x2a,0x0f,0x2c,0x0f,0x30,0x0f,0x34,0x0f,0x38,0x0f,0x3a,0x0f,0x3c,0x0f,0x3e,0x0f,0x40,0x0f,0x44,0x0f,0x48,0x0f,0x4c,0x13,0x02,0x14,0x04,0x13,0x04,0x13,0x08,0x13,0x0c,0x13,0x10,0x13,0x14,0x13,0x18,0x13,0x1c, -0x13,0x20,0x13,0x24,0x13,0x26,0x13,0x28,0x14,0x08,0x14,0x09,0x14,0x0b,0x14,0x0f,0x14,0x13,0x14,0x15,0x14,0x53,0x14,0x54,0x14,0x5d,0x14,0x5e,0x14,0x5f,0x14,0x60,0x14,0x61,0x14,0x62,0x14,0x63,0x14,0x64,0x14,0x65,0x14,0x66,0x14,0x67,0x14,0x68,0x14,0x69,0x14,0x6a,0x14,0x6b,0x14,0x6c,0x13,0x2a,0x13,0x2b,0x13,0x2c,0x13,0x2d, -0x13,0x2e,0x13,0x2f,0x13,0x30,0x13,0x31,0x13,0x32,0x13,0x33,0x13,0x34,0x13,0x35,0x13,0x36,0x13,0x37,0x13,0x38,0x13,0x39,0x13,0x3a,0x13,0x3b,0x13,0x3c,0x13,0x3d,0x13,0x3e,0x13,0x3f,0x13,0x40,0x13,0x41,0x13,0x42,0x13,0x43,0x13,0x44,0x14,0x17,0x0c,0x08,0x0c,0x09,0x0c,0x0a,0x0c,0x0b,0x0c,0x0c,0x0c,0x0d,0x0c,0x0e,0x0c,0x0f, -0x0c,0x10,0x0c,0x11,0x0c,0x12,0x0c,0x13,0x0c,0x14,0x0c,0x15,0x0c,0x16,0x0c,0x17,0x0c,0x18,0x0c,0x19,0x0c,0x1a,0x0c,0x1b,0x0c,0x1c,0x0c,0x1d,0x0c,0x1e,0x0c,0x1f,0x0c,0x20,0x0c,0x21,0x0c,0x22,0x0c,0x23,0x0c,0x24,0x0c,0x25,0x0c,0x26,0x0c,0x27,0x0c,0x28,0x0c,0x29,0x0c,0x2a,0x0c,0x2b,0x0c,0x2c,0x0c,0x2d,0x0c,0x2e,0x0c,0x2f, -0x0c,0x30,0x0c,0x31,0x0c,0x32,0x0c,0x33,0x0c,0x34,0x0f,0xc7,0x0f,0xc8,0x0f,0xc9,0x07,0x62,0x07,0x63,0x07,0x64,0x07,0x65,0x07,0x66,0x07,0x67,0x07,0x68,0x07,0x69,0x07,0x6a,0x07,0x6b,0x07,0x6c,0x07,0x6d,0x07,0x6e,0x07,0x6f,0x07,0x70,0x07,0x71,0x07,0x72,0x07,0x73,0x07,0x74,0x07,0x75,0x07,0x76,0x07,0x77,0x07,0x78,0x07,0x79, -0x07,0x7a,0x07,0x7b,0x07,0x7c,0x07,0x7d,0x07,0x7e,0x07,0x7f,0x07,0x80,0x07,0x81,0x07,0x82,0x07,0x83,0x07,0x84,0x07,0x85,0x07,0x86,0x07,0x87,0x07,0x88,0x07,0x89,0x07,0x8a,0x07,0x8b,0x07,0x8c,0x07,0x8d,0x07,0x8e,0x07,0x8f,0x07,0x90,0x07,0x91,0x07,0x92,0x07,0x93,0x07,0x94,0x07,0x95,0x07,0x96,0x07,0x97,0x07,0x98,0x07,0x99, -0x07,0x9a,0x07,0x9b,0x07,0x9c,0x07,0x9d,0x07,0x9e,0x07,0x9f,0x07,0xa0,0x07,0xa1,0x07,0xa2,0x07,0xa3,0x07,0xa4,0x07,0xa5,0x07,0xa6,0x07,0xa7,0x07,0xa8,0x07,0xa9,0x07,0xaa,0x07,0xab,0x07,0xac,0x07,0xad,0x07,0xae,0x07,0xaf,0x07,0xb0,0x07,0xb1,0x07,0xb2,0x07,0xb3,0x07,0xb4,0x07,0xb5,0x07,0xb6,0x07,0xb7,0x07,0xb8,0x07,0xb9, -0x07,0xba,0x07,0xbb,0x07,0xbc,0x07,0xbd,0x07,0xbe,0x07,0xbf,0x07,0xc0,0x07,0xc1,0x07,0xc2,0x07,0xc3,0x07,0xc4,0x07,0xc5,0x07,0xc6,0x07,0xc7,0x07,0xc8,0x07,0xc9,0x07,0xca,0x07,0xcb,0x07,0xcc,0x07,0xd1,0x07,0xf7,0x07,0xf8,0x07,0xf9,0x07,0xfa,0x07,0xfb,0x07,0xfc,0x07,0xfd,0x07,0xfe,0x07,0xff,0x08,0x00,0x08,0x01,0x08,0x02, -0x08,0x03,0x08,0x04,0x08,0x05,0x08,0x07,0x08,0x08,0x08,0x09,0x08,0x0a,0x08,0x0b,0x08,0x0c,0x08,0x0d,0x08,0x0e,0x08,0x0f,0x08,0x10,0x08,0x11,0x08,0x12,0x08,0x13,0x08,0x14,0x08,0x15,0x08,0x16,0x08,0x17,0x08,0x18,0x08,0x19,0x08,0x1a,0x08,0x1b,0x08,0x1c,0x08,0x1d,0x08,0x1e,0x08,0x1f,0x08,0x20,0x08,0x21,0x08,0x22,0x08,0x23, -0x08,0x24,0x08,0x25,0x08,0x26,0x08,0x27,0x08,0x28,0x08,0x29,0x08,0x2a,0x08,0x2b,0x08,0x2c,0x08,0x2d,0x08,0x2e,0x08,0x2f,0x08,0x30,0x08,0x31,0x08,0x32,0x08,0x33,0x08,0x34,0x08,0x35,0x08,0x36,0x08,0x37,0x08,0x38,0x08,0x39,0x08,0x3a,0x08,0x3b,0x08,0x3c,0x08,0x3d,0x08,0x3e,0x08,0x3f,0x08,0x40,0x08,0x41,0x08,0x42,0x08,0x43, -0x08,0x44,0x08,0x45,0x08,0x46,0x08,0x47,0x08,0x48,0x08,0x49,0x08,0x4a,0x08,0x4b,0x08,0x4c,0x08,0x4d,0x08,0x4e,0x08,0x4f,0x0a,0xdb,0x0a,0xdc,0x0a,0xdd,0x0a,0xde,0x0a,0xdf,0x0a,0xe0,0x0a,0xe1,0x0a,0xe2,0x0a,0xe3,0x02,0xe3,0x02,0xe4,0x02,0xe5,0x02,0xe6,0x02,0xe7,0x02,0xe8,0x02,0xe9,0x02,0xea,0x02,0xeb,0x02,0xec,0x02,0xed, -0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x02,0xf8,0x02,0xf9,0x02,0xfa,0x02,0xfb,0x02,0xfc,0x02,0xfd,0x02,0xfe,0x02,0xff,0x03,0x00,0x03,0x01,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,0x03,0x0a,0x03,0x0b,0x03,0x0c,0x03,0x0d, -0x03,0x0e,0x03,0x0f,0x03,0x10,0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x1a,0x03,0x1b,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x03,0x20,0x03,0x21,0x03,0x22,0x03,0x23,0x03,0x24,0x03,0x25,0x03,0x26,0x03,0x27,0x03,0x28,0x03,0x29,0x03,0x2a,0x03,0x2b,0x03,0x2c,0x03,0x2d, -0x03,0x2e,0x03,0x2f,0x03,0x30,0x03,0x31,0x03,0x32,0x03,0x33,0x03,0x34,0x03,0x35,0x03,0x36,0x03,0x37,0x03,0x38,0x03,0x39,0x03,0x3a,0x03,0x3b,0x03,0x3c,0x03,0x3d,0x03,0x3e,0x03,0x3f,0x03,0x40,0x03,0x41,0x03,0x42,0x03,0x43,0x03,0x44,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x49,0x03,0x4a,0x03,0x4b,0x03,0x4c,0x03,0x4d, -0x03,0x4e,0x03,0x4f,0x03,0x50,0x03,0x51,0x03,0x52,0x03,0x53,0x03,0x54,0x03,0x55,0x03,0x56,0x03,0x57,0x03,0x58,0x03,0x59,0x03,0x5a,0x03,0x5b,0x03,0x5c,0x03,0x5d,0x03,0x5e,0x03,0x5f,0x03,0x60,0x03,0x61,0x03,0x62,0x01,0x8c,0x01,0x8d,0x01,0x8e,0x01,0x8f,0x01,0x90,0x01,0x91,0x03,0x63,0x03,0x64,0x03,0x65,0x03,0x66,0x03,0x67, -0x03,0x68,0x03,0x69,0x03,0x6a,0x03,0x6b,0x03,0x6c,0x03,0x6d,0x03,0x6e,0x03,0x6f,0x03,0x70,0x03,0x71,0x03,0x72,0x03,0x73,0x03,0x74,0x03,0x75,0x03,0x76,0x03,0x77,0x03,0x78,0x13,0x5b,0x13,0x5c,0x0b,0x21,0x13,0x5d,0x02,0x57,0x02,0x58,0x02,0x59,0x02,0x5a,0x02,0x5b,0x02,0x5c,0x02,0x5d,0x02,0x5e,0x02,0x5f,0x02,0x60,0x02,0x61, -0x02,0x62,0x02,0x63,0x02,0x64,0x02,0x65,0x02,0x66,0x02,0x67,0x02,0x68,0x02,0x69,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6d,0x02,0x6e,0x02,0x6f,0x02,0x70,0x02,0x71,0x02,0x72,0x02,0x73,0x02,0x74,0x02,0x75,0x02,0x76,0x02,0x77,0x02,0x78,0x02,0x79,0x02,0x7a,0x02,0x7b,0x02,0x7c,0x02,0x7d,0x02,0x7e,0x02,0x7f,0x02,0x80,0x02,0x81, -0x02,0x82,0x02,0x83,0x02,0x84,0x02,0x85,0x02,0x86,0x02,0x87,0x02,0x88,0x02,0x89,0x02,0x8a,0x02,0x8b,0x02,0x8c,0x02,0x8d,0x02,0x8e,0x02,0x8f,0x02,0x90,0x02,0x91,0x02,0x92,0x02,0x93,0x02,0x94,0x02,0x95,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x99,0x02,0x9a,0x02,0x9b,0x02,0x9c,0x02,0x9d,0x02,0x9e,0x02,0x9f,0x02,0xa0,0x02,0xa1, -0x02,0xa2,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x02,0xa6,0x02,0xa7,0x02,0xa8,0x01,0x92,0x01,0x93,0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xac,0x02,0xad,0x02,0xae,0x13,0x5e,0x13,0x5f,0x13,0x60,0x13,0x61,0x13,0x62,0x13,0x63,0x03,0x79,0x03,0x7a,0x03,0x7b,0x03,0x7c,0x03,0x7d,0x03,0x7e,0x03,0x7f,0x03,0x80,0x03,0x81,0x03,0x82,0x03,0x83, -0x03,0x84,0x03,0x85,0x03,0x86,0x03,0x87,0x03,0x88,0x03,0x89,0x03,0x8a,0x03,0x8b,0x03,0x8c,0x03,0x8d,0x03,0x8e,0x0a,0xfe,0x0a,0xff,0x0b,0x00,0x0b,0x01,0x0b,0x02,0x0b,0x03,0x0b,0x04,0x0b,0x05,0x0b,0x06,0x11,0x86,0x0b,0x07,0x0b,0x08,0x08,0xc3,0x08,0xc4,0x08,0xc5,0x08,0xc6,0x00,0x10,0x11,0x99,0x08,0xbc,0x00,0xb2,0x00,0xb3, -0x02,0x35,0x11,0x87,0x01,0x35,0x00,0xb6,0x00,0xb7,0x00,0xc4,0x01,0x94,0x00,0xb4,0x00,0xb5,0x00,0xc5,0x08,0xbd,0x00,0x82,0x00,0xc2,0x00,0x87,0x0b,0x23,0x0b,0x24,0x0b,0x25,0x0b,0x26,0x0b,0x27,0x0b,0x28,0x0b,0x29,0x0b,0x09,0x00,0xc6,0x01,0x3c,0x01,0x3d,0x08,0xbe,0x01,0x36,0x11,0x85,0x01,0x95,0x08,0x50,0x0b,0x0a,0x08,0x99, -0x08,0x95,0x08,0x9a,0x08,0x9b,0x08,0x9c,0x08,0x9d,0x08,0x9e,0x08,0x9f,0x08,0xa0,0x08,0xa1,0x08,0xa2,0x08,0xa3,0x08,0xa4,0x01,0x37,0x08,0xa5,0x08,0xa6,0x08,0xa7,0x08,0xa8,0x08,0xa9,0x08,0xaa,0x08,0xab,0x08,0xac,0x08,0xad,0x08,0xae,0x08,0xaf,0x08,0xb0,0x08,0xb1,0x08,0xb2,0x08,0xb3,0x08,0x51,0x08,0x52,0x08,0x53,0x08,0x54, -0x08,0x55,0x14,0x2e,0x14,0x2f,0x14,0x30,0x14,0x31,0x14,0x32,0x14,0x33,0x14,0x34,0x14,0x35,0x07,0xd2,0x07,0xd3,0x07,0xd4,0x00,0xf6,0x01,0x96,0x07,0xd5,0x07,0xd6,0x01,0x38,0x07,0xd7,0x07,0xd8,0x07,0xd9,0x07,0xda,0x00,0xbd,0x07,0xdb,0x07,0xdc,0x07,0xdd,0x07,0xde,0x07,0xdf,0x08,0x56,0x08,0x57,0x08,0x58,0x08,0x59,0x11,0x80, -0x11,0x81,0x0c,0xb7,0x0c,0xb6,0x11,0xa3,0x14,0x2a,0x13,0x91,0x13,0x90,0x14,0x2c,0x14,0x2d,0x02,0x36,0x07,0xe0,0x12,0xe2,0x12,0xe3,0x12,0xe4,0x0b,0x2a,0x0b,0x2b,0x12,0xe5,0x12,0xe6,0x12,0xe7,0x12,0xe8,0x12,0xe9,0x12,0xea,0x01,0x98,0x01,0x99,0x01,0x9a,0x01,0x9b,0x12,0xeb,0x12,0xf0,0x12,0xf1,0x12,0xf2,0x12,0xf3,0x12,0xf4, -0x12,0xf5,0x12,0xf6,0x12,0xf7,0x12,0xf8,0x12,0xf9,0x0a,0xe6,0x12,0xfa,0x12,0xfb,0x12,0xfc,0x12,0xfd,0x12,0xfe,0x00,0x9a,0x00,0xee,0x01,0x02,0x00,0xa6,0x00,0x93,0x0b,0x32,0x00,0x90,0x08,0xbf,0x0b,0x36,0x01,0x40,0x01,0x41,0x01,0x42,0x0b,0x37,0x00,0xb9,0x0b,0x3c,0x0a,0x43,0x0b,0x3f,0x11,0x88,0x08,0x83,0x08,0x84,0x08,0x85, -0x08,0x86,0x08,0x87,0x08,0x88,0x08,0x89,0x08,0x8a,0x08,0x8b,0x13,0x8f,0x0a,0xe7,0x0a,0xe8,0x0a,0xe9,0x0a,0xea,0x0a,0xeb,0x0a,0xec,0x0a,0xed,0x0a,0xee,0x0a,0xef,0x0a,0xf0,0x0a,0xf1,0x0a,0xf2,0x0a,0xf3,0x0b,0x43,0x13,0x93,0x13,0x94,0x13,0x64,0x0b,0x44,0x0b,0x45,0x0b,0x46,0x0a,0xf4,0x0a,0xf5,0x0a,0xf6,0x0a,0xf7,0x13,0x65, -0x13,0x66,0x13,0x67,0x13,0x68,0x13,0x69,0x13,0x6a,0x13,0x6b,0x13,0x6c,0x11,0x30,0x11,0x31,0x11,0x32,0x11,0x33,0x11,0x34,0x11,0x35,0x11,0x36,0x11,0x37,0x11,0x38,0x11,0x39,0x11,0x3a,0x11,0x3b,0x11,0x3c,0x11,0x3d,0x11,0x3e,0x11,0x3f,0x11,0x40,0x11,0x41,0x11,0x42,0x11,0x43,0x11,0x44,0x11,0x45,0x11,0x46,0x11,0x47,0x11,0x48, -0x11,0x49,0x11,0x4a,0x11,0x4b,0x11,0x4c,0x11,0x4d,0x11,0x4e,0x11,0x4f,0x11,0x50,0x11,0x51,0x11,0x52,0x11,0x53,0x11,0x54,0x11,0x55,0x11,0x56,0x11,0x57,0x11,0x58,0x11,0x59,0x11,0x5a,0x11,0x5b,0x11,0x5c,0x11,0x5d,0x11,0x5e,0x11,0x5f,0x11,0x60,0x11,0x61,0x11,0x62,0x11,0x63,0x13,0x77,0x13,0x78,0x13,0x79,0x13,0x7a,0x13,0x7b, -0x13,0x7c,0x13,0x7d,0x13,0x7e,0x11,0x64,0x11,0x65,0x11,0x66,0x11,0x67,0x11,0x68,0x11,0x69,0x11,0x6a,0x11,0x6b,0x11,0x6c,0x11,0x6d,0x11,0x6e,0x11,0x6f,0x11,0x70,0x11,0x71,0x11,0x72,0x11,0x73,0x11,0x74,0x11,0x75,0x11,0x76,0x11,0x77,0x11,0x78,0x11,0x79,0x11,0x7a,0x11,0x7b,0x11,0x7c,0x11,0x7d,0x11,0x7e,0x11,0x7f,0x14,0x24, -0x14,0x25,0x14,0x26,0x14,0x27,0x14,0x28,0x14,0x29,0x14,0x36,0x13,0x7f,0x14,0x37,0x14,0x38,0x14,0x39,0x14,0x3a,0x14,0x3b,0x14,0x3c,0x14,0x3d,0x14,0x3e,0x13,0x80,0x13,0x81,0x13,0x82,0x13,0x83,0x13,0x84,0x13,0x85,0x13,0x86,0x13,0x87,0x13,0x88,0x13,0x89,0x13,0x8a,0x13,0x8b,0x13,0x8c,0x13,0x8d,0x13,0x8e,0x0a,0xf8,0x0a,0xf9, -0x0a,0xfa,0x0a,0xfb,0x0b,0x47,0x0b,0x48,0x0b,0x49,0x0b,0x4a,0x0b,0x4b,0x0a,0xfc,0x0a,0xfd,0x12,0x63,0x12,0x64,0x12,0x65,0x12,0x66,0x12,0x67,0x12,0x68,0x12,0x69,0x12,0x6a,0x12,0x6b,0x12,0x6c,0x12,0x6d,0x12,0x6e,0x12,0x6f,0x12,0x70,0x12,0x71,0x12,0x72,0x12,0x73,0x12,0x74,0x12,0x75,0x12,0x76,0x12,0x77,0x12,0x78,0x12,0x79, -0x12,0x7a,0x12,0x7b,0x12,0x7c,0x12,0x7d,0x12,0x7e,0x12,0x7f,0x12,0x80,0x12,0x81,0x12,0x82,0x12,0x83,0x12,0x84,0x12,0x85,0x12,0x86,0x12,0x87,0x12,0x88,0x12,0x89,0x12,0x8a,0x12,0x8b,0x12,0x8c,0x12,0x8d,0x12,0x8e,0x12,0x8f,0x12,0x90,0x12,0x91,0x12,0x92,0x12,0x93,0x12,0x94,0x12,0x95,0x12,0x96,0x12,0x97,0x12,0x98,0x12,0x99, -0x12,0x9a,0x12,0x9b,0x12,0x9c,0x12,0x9d,0x12,0x9e,0x12,0x9f,0x12,0xa0,0x12,0xa1,0x12,0xa2,0x12,0xa3,0x12,0xa4,0x12,0xa5,0x12,0xa6,0x12,0xa7,0x12,0xa8,0x12,0xa9,0x12,0xaa,0x12,0xab,0x12,0xac,0x12,0xad,0x12,0xae,0x12,0xaf,0x12,0xb0,0x12,0xb1,0x12,0xb2,0x12,0xb3,0x12,0xb4,0x12,0xb5,0x12,0xb6,0x12,0xb7,0x12,0xb8,0x12,0xb9, -0x12,0xba,0x12,0xbb,0x12,0xbc,0x12,0xbd,0x12,0xbe,0x12,0xbf,0x12,0xc0,0x12,0xc1,0x12,0xc2,0x12,0xc3,0x12,0xc4,0x12,0xc5,0x12,0xc6,0x12,0xc7,0x12,0xc8,0x0b,0x4c,0x0b,0x4d,0x0b,0x4e,0x0b,0x4f,0x0b,0x50,0x12,0xc9,0x12,0xca,0x14,0x3f,0x12,0xcb,0x12,0xcc,0x12,0xcd,0x12,0xce,0x13,0x95,0x13,0x96,0x13,0x97,0x13,0x98,0x13,0x99, -0x13,0x9a,0x13,0x9b,0x13,0x9c,0x13,0x9d,0x13,0x9e,0x13,0x9f,0x13,0xa0,0x12,0xcf,0x12,0xd0,0x12,0xd1,0x12,0xd2,0x12,0xd3,0x12,0xd4,0x12,0xd5,0x12,0xd6,0x12,0xd7,0x12,0xd8,0x12,0xd9,0x13,0xa1,0x13,0xa2,0x13,0xa3,0x14,0x40,0x13,0xa4,0x13,0xa5,0x14,0x41,0x14,0x42,0x14,0x43,0x14,0x44,0x14,0x45,0x14,0x46,0x13,0xa6,0x12,0xda, -0x12,0xdb,0x12,0xdc,0x12,0xdd,0x12,0xde,0x12,0xdf,0x12,0xe0,0x12,0xe1,0x13,0xa7,0x13,0xa8,0x13,0xa9,0x13,0xaa,0x13,0xab,0x13,0xac,0x13,0xad,0x13,0xae,0x13,0xaf,0x13,0xb0,0x13,0xb1,0x13,0xb2,0x13,0xb3,0x13,0xb4,0x13,0xb5,0x13,0xb6,0x13,0xb7,0x13,0xb8,0x13,0xb9,0x13,0xba,0x13,0xbb,0x13,0xbc,0x13,0xbd,0x13,0xbe,0x13,0xbf, -0x13,0xc0,0x13,0xc1,0x13,0xc2,0x13,0xc3,0x13,0xc4,0x13,0xc5,0x13,0xc6,0x13,0xc7,0x13,0xc8,0x13,0xc9,0x13,0xca,0x13,0xcb,0x13,0xcc,0x13,0xcd,0x13,0xce,0x13,0xcf,0x13,0xd0,0x13,0xd1,0x13,0xd2,0x13,0xd3,0x13,0xd4,0x13,0xd5,0x13,0xd6,0x14,0x47,0x14,0x48,0x14,0x49,0x14,0x4a,0x13,0xd7,0x13,0xd8,0x0d,0xbb,0x00,0xc0,0x00,0xc1, -0x0d,0xbc,0x0d,0xbd,0x14,0x4b,0x14,0x4c,0x0b,0xe0,0x0b,0xe1,0x0b,0x8c,0x0b,0x8d,0x0b,0x8e,0x0b,0x8f,0x0b,0x90,0x0b,0x91,0x0b,0x92,0x0b,0x93,0x0b,0x94,0x0b,0x95,0x0b,0x96,0x0b,0x97,0x0b,0x98,0x0b,0x99,0x0b,0x9a,0x0b,0x9b,0x0b,0x9c,0x0b,0x9d,0x0b,0x9e,0x0b,0x9f,0x0b,0xa0,0x0b,0xa1,0x0b,0xa2,0x0b,0xa3,0x0b,0xae,0x0b,0xaf, -0x0b,0xb0,0x0b,0xb1,0x0b,0xb2,0x0b,0xb3,0x0b,0xb4,0x0b,0xb5,0x0b,0xb6,0x0b,0xb7,0x09,0x80,0x09,0x81,0x09,0x8e,0x0e,0x7c,0x09,0x8f,0x0e,0x7d,0x09,0x40,0x0e,0x82,0x09,0x41,0x0e,0x83,0x09,0x96,0x0e,0x86,0x09,0x97,0x0e,0x87,0x09,0x8c,0x0e,0x7a,0x09,0x8d,0x0e,0x7b,0x09,0x94,0x0e,0x84,0x09,0x95,0x0e,0x85,0x09,0x5b,0x0e,0x78, -0x09,0x5c,0x0e,0x79,0x09,0x6c,0x0e,0xa8,0x09,0x6d,0x09,0x6e,0x09,0xd2,0x0e,0xaa,0x09,0xd3,0x09,0xd4,0x09,0xa1,0x09,0xa2,0x09,0xa3,0x0e,0x8b,0x09,0x9e,0x09,0x9f,0x09,0xa0,0x0e,0x8a,0x09,0x42,0x09,0x43,0x09,0x44,0x0e,0x8d,0x09,0xa7,0x09,0xa8,0x09,0xa9,0x0e,0x8e,0x09,0xae,0x0e,0x94,0x09,0xad,0x0e,0x93,0x09,0xaf,0x0e,0x95, -0x09,0x5d,0x0e,0x8f,0x09,0x45,0x0b,0x0e,0x09,0x5e,0x0b,0x0f,0x09,0x46,0x0e,0xb1,0x09,0x47,0x0e,0xb2,0x09,0x48,0x0e,0xbd,0x09,0x49,0x0e,0xbe,0x09,0xe7,0x0e,0xc5,0x09,0xe8,0x0e,0xc6,0x09,0xe3,0x0e,0xc1,0x09,0xe4,0x0e,0xc2,0x09,0x5f,0x0e,0xcf,0x09,0xf5,0x0e,0xd0,0x0e,0xd1,0x0e,0xd2,0x09,0x4e,0x09,0x4d,0x09,0x60,0x09,0x72, -0x09,0x61,0x09,0x62,0x08,0xf1,0x08,0xf2,0x0e,0xd7,0x0e,0xd8,0x09,0x65,0x09,0x66,0x09,0x67,0x09,0x68,0x13,0xd9,0x13,0xda,0x13,0xdb,0x13,0xdc,0x13,0xdd,0x13,0xde,0x13,0xdf,0x13,0xe0,0x13,0xe1,0x13,0xe2,0x13,0xe3,0x13,0xe4,0x13,0xe5,0x13,0xe6,0x13,0xe7,0x13,0xe8,0x09,0xdd,0x0e,0xb9,0x09,0xde,0x0e,0xba,0x0a,0x00,0x0e,0xdf, -0x09,0xff,0x0e,0xde,0x0a,0x01,0x0e,0xe0,0x09,0x89,0x0a,0x04,0x0e,0xe3,0x09,0xfe,0x0e,0xdd,0x0a,0x02,0x0e,0xe1,0x0a,0x0b,0x0a,0x0c,0x0e,0xe7,0x0e,0xe8,0x0e,0x5f,0x0e,0x60,0x10,0xfe,0x10,0xff,0x11,0x00,0x11,0x01,0x11,0x02,0x11,0x03,0x11,0x04,0x11,0x05,0x11,0x06,0x11,0x07,0x11,0x08,0x11,0x09,0x11,0x0a,0x11,0x0b,0x11,0x0c, -0x11,0x0d,0x11,0x0e,0x11,0x0f,0x09,0x4a,0x09,0x4b,0x09,0x4c,0x0e,0xe4,0x0a,0x68,0x0a,0x69,0x0a,0x65,0x0a,0x66,0x0a,0x67,0x13,0xe9,0x13,0xed,0x13,0xee,0x00,0x0b,0x00,0x0c,0x13,0xf0,0x13,0xf1,0x0a,0x64,0x13,0xf2,0x13,0xf8,0x13,0xf9,0x13,0xfa,0x13,0xfb,0x13,0xfc,0x13,0xfd,0x13,0xfe,0x13,0xff,0x14,0x00,0x14,0x01,0x09,0x07, -0x09,0x08,0x08,0xc9,0x09,0x09,0x08,0xc8,0x09,0x0a,0x0e,0x24,0x09,0x0b,0x08,0xca,0x09,0x0c,0x09,0x02,0x08,0xf9,0x0e,0x25,0x09,0x0d,0x08,0xc7,0x09,0x0e,0x0e,0x26,0x08,0xcb,0x0e,0x27,0x09,0x0f,0x08,0xf6,0x09,0x10,0x0e,0x28,0x08,0xcc,0x0e,0x29,0x09,0x11,0x0e,0x2a,0x08,0xcd,0x0e,0x2b,0x09,0x12,0x08,0xcf,0x08,0xce,0x0e,0x2c, -0x09,0x13,0x08,0xd1,0x08,0xd0,0x0e,0x2d,0x09,0x14,0x08,0xd3,0x08,0xd2,0x0e,0x2e,0x09,0x15,0x0e,0x2f,0x09,0x16,0x0e,0x30,0x09,0x17,0x0b,0x0c,0x09,0x18,0x0b,0x0d,0x09,0x19,0x0e,0x31,0x08,0xd4,0x0e,0x32,0x09,0x1a,0x0e,0x33,0x08,0xd5,0x0e,0x34,0x09,0x1b,0x0e,0x35,0x08,0xd6,0x0e,0x36,0x09,0x1c,0x0e,0x37,0x08,0xe1,0x0e,0x38, -0x09,0x1d,0x0e,0x39,0x0e,0x3a,0x0e,0x3b,0x09,0x1e,0x0e,0x3c,0x0e,0x3d,0x0e,0x3e,0x09,0x1f,0x08,0xe4,0x08,0xe2,0x08,0xe3,0x09,0x20,0x08,0xe7,0x08,0xe5,0x08,0xe6,0x09,0x22,0x0e,0x53,0x08,0xe8,0x08,0xe9,0x09,0x23,0x0e,0x54,0x08,0xeb,0x08,0xec,0x09,0x24,0x0e,0x55,0x08,0xed,0x0e,0x56,0x09,0x25,0x09,0x59,0x08,0xee,0x09,0x3f, -0x09,0x26,0x0e,0x57,0x08,0xef,0x0e,0x58,0x09,0x27,0x0e,0x59,0x08,0xf0,0x0e,0x5a,0x09,0x28,0x08,0xf3,0x0e,0x5b,0x0e,0x5d,0x09,0x29,0x0e,0x5e,0x09,0x2a,0x08,0xf7,0x09,0x2b,0x08,0xf5,0x08,0xf4,0x0e,0x61,0x09,0x01,0x09,0x04,0x08,0xff,0x09,0x00,0x09,0x34,0x09,0x35,0x08,0xfa,0x08,0xfb,0x0b,0xb8,0x0b,0x1b,0x40,0x55,0x85,0x64, -0x5b,0x5a,0x59,0x54,0x52,0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13, -0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x45,0x6a,0xb0,0x19,0x43,0x60,0xb0,0x0c,0x23,0x44,0x23,0x10,0x20,0xb0,0x0c,0x4e,0xf0,0x4d,0x2f,0xb0,0x00,0x12,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58, -0xb0,0x05,0x2b,0xb0,0x00,0x13,0x4b,0xb0,0x14,0x50,0x58,0xb1,0x00,0x40,0x38,0x59,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x4e,0xb0,0x03,0x25,0x10,0xf2,0x21,0xb0,0x00,0x12,0x4d,0x1b,0x20,0x45,0xb0,0x04,0x25,0xb0,0x04,0x25,0x23,0x4a,0x61,0x64,0xb0,0x28,0x52,0x58,0x21, -0x23,0x10,0xd6,0x1b,0xb0,0x03,0x25,0x10,0xf2,0x21,0xb0,0x00,0x12,0x59,0x59,0x2d,0x2c,0xb0,0x1a,0x43,0x58,0x21,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x49,0xb0,0x03,0x25,0xb0,0x03,0x25,0x4a,0x61,0x20,0x64,0xb0,0x10,0x50,0x58,0x21,0x21,0x21,0x1b,0xb0,0x03,0x25,0xb0,0x03,0x25,0x49,0xb0,0x00,0x50,0x58,0xb0,0x00,0x50,0x58, -0xb8,0xff,0xe2,0x38,0x21,0x1b,0xb0,0x00,0x38,0x21,0x59,0x1b,0xb0,0x00,0x52,0x58,0xb0,0x1e,0x38,0x21,0x1b,0xb0,0x00,0x38,0x21,0x59,0x59,0x59,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x2b,0xb0,0x00,0x13,0x4b,0xb0,0x14,0x50,0x58,0xb9,0x00,0x00,0xff,0xc0,0x38,0x59,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33, -0x2f,0x59,0x2d,0x2c,0x4e,0x01,0x8a,0x10,0xb1,0x0c,0x19,0x43,0x44,0xb0,0x00,0x14,0xb1,0x00,0x0c,0xe2,0xb0,0x00,0x15,0xb9,0x00,0x00,0xff,0xf0,0x38,0x00,0xb0,0x00,0x3c,0xb0,0x28,0x2b,0xb0,0x02,0x25,0x10,0xb0,0x00,0x3c,0x2d,0x2c,0x01,0x18,0xb0,0x00,0x2f,0xb0,0x01,0x14,0xf2,0xb0,0x01,0x13,0xb0,0x01,0x15,0x4d,0xb0,0x00,0x12, -0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x2b,0xb0,0x00,0x13,0xb9,0x00,0x00,0xff,0xe0,0x38,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x45,0x64,0x6a,0x23,0x45,0x64,0x69,0xb0,0x19,0x43,0x64,0x60,0x60,0xb0,0x0c,0x23,0x44,0x23,0x10,0x20,0xb0,0x0c,0xf0,0x2f,0xb0, -0x00,0x12,0x1b,0x21,0x21,0x20,0x8a,0x20,0x8a,0x52,0x58,0x11,0x33,0x1b,0x21,0x21,0x59,0x59,0x2d,0x2c,0x01,0x4b,0xb0,0xc8,0x51,0x58,0xb1,0x0b,0x0a,0x43,0x23,0x43,0x65,0x0a,0x59,0x2d,0x2c,0x00,0x4b,0xb0,0xc8,0x51,0x58,0x00,0xb1,0x0a,0x0b,0x43,0x23,0x43,0x0b,0x59,0x2d,0x2c,0x00,0xb0,0x0c,0x23,0x70,0xb1,0x01,0x0c,0x3e,0x01, -0xb0,0x0c,0x23,0x70,0xb1,0x02,0x0c,0x45,0x3a,0xb1,0x02,0x00,0x08,0x0d,0x2d,0x2c,0xb0,0x12,0x2b,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x6a,0xb0,0x40,0x8b,0x60,0xb0,0x02,0x25,0x23,0x44,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x13,0x2b,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x6a,0xb8,0xff,0xc0,0x8c,0x60,0xb0,0x02,0x25,0x23,0x44, -0x21,0x21,0x21,0x2d,0x2c,0xb0,0x00,0xb0,0x12,0x2b,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x00,0xb0,0x13,0x2b,0x21,0x21,0x21,0x2d,0x2c,0x01,0x4b,0xb0,0xc8,0x51,0x58,0xb0,0x06,0x43,0xb0,0x07,0x43,0x65,0x0a,0x59,0x2d,0x2c,0x20,0x69,0xb0,0x40,0x61,0xb0,0x00,0x8b,0x20,0xb1,0x2c,0xc0,0x8a,0x8c,0xb8,0x10,0x00,0x62,0x60,0x2b,0x0c,0x64, -0x23,0x64,0x61,0x5c,0x58,0xb0,0x03,0x61,0x59,0x2d,0x2c,0xb1,0x00,0x03,0x25,0x45,0x68,0x54,0xb0,0x1c,0x4b,0x50,0x5a,0x58,0xb0,0x03,0x25,0x45,0xb0,0x03,0x25,0x45,0x60,0x68,0x20,0xb0,0x04,0x25,0x23,0x44,0xb0,0x04,0x25,0x23,0x44,0x1b,0xb0,0x03,0x25,0x20,0x45,0x68,0x20,0x8a,0x23,0x44,0xb0,0x03,0x25,0x45,0x68,0x60,0xb0,0x03, -0x25,0x23,0x44,0x59,0x2d,0x2c,0xb0,0x03,0x25,0x20,0x45,0x68,0x20,0x8a,0x23,0x44,0xb0,0x03,0x25,0x45,0x64,0x68,0x65,0x60,0xb0,0x04,0x25,0xb0,0x01,0x60,0x23,0x44,0x2d,0x2c,0xb0,0x09,0x43,0x58,0x87,0x21,0xc0,0x1b,0xb0,0x12,0x43,0x58,0x87,0x45,0xb0,0x11,0x2b,0xb0,0x0d,0x23,0x44,0xb0,0x0d,0x7a,0xe4,0x1b,0x03,0x8a,0x45,0x18, -0x69,0x20,0xb0,0x0d,0x23,0x44,0x8a,0x8a,0x87,0x20,0xb0,0xa0,0x51,0x58,0xb0,0x11,0x2b,0xb0,0x0d,0x23,0x44,0xb0,0x0d,0x7a,0xe4,0x1b,0x21,0xb0,0x0d,0x7a,0xe4,0x59,0x59,0x59,0x18,0x2d,0x2c,0x20,0x8a,0x45,0x23,0x45,0x68,0x60,0x44,0x2d,0x2c,0x45,0x6a,0x42,0x2d,0x2c,0x01,0x18,0x2f,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0, -0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0x23,0x45,0x64,0x69,0xb0,0x40,0x8b,0x61,0x20,0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x19,0x43,0x60,0xb0,0x0c,0x23,0x44,0x21,0x8a,0x10,0xb0,0x0c,0xf6,0x21,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x01,0xb0,0x18,0x43,0x58,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45, -0x64,0x60,0x6a,0xb0,0x03,0x25,0x45,0x6a,0x61,0x20,0xb0,0x04,0x25,0x45,0x6a,0x20,0x8a,0x8b,0x65,0xb0,0x04,0x25,0x23,0x44,0x8c,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x1b,0x20,0x45,0x6a,0x44,0x20,0x45,0x6a,0x44,0x59,0x2d,0x2c,0x01,0x20,0x45,0xb0,0x00,0x55,0xb0,0x18,0x43,0x5a,0x58,0x45,0x68,0x23,0x45,0x69,0xb0,0x40,0x8b,0x61, -0x20,0xb0,0x80,0x62,0x6a,0x20,0x8a,0x23,0x61,0x20,0xb0,0x03,0x25,0x8b,0x65,0xb0,0x04,0x25,0x23,0x44,0x8c,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x1b,0x21,0x21,0xb0,0x19,0x2b,0x59,0x2d,0x2c,0x01,0x8a,0x8a,0x45,0x64,0x23,0x45,0x64,0x61,0x64,0x42,0x2d,0x2c,0xb0,0x04,0x25,0xb0,0x04,0x25,0xb0,0x19,0x2b,0xb0,0x18,0x43,0x58,0xb0, -0x04,0x25,0xb0,0x04,0x25,0xb0,0x03,0x25,0xb0,0x1b,0x2b,0x01,0xb0,0x02,0x25,0x43,0xb0,0x40,0x54,0xb0,0x02,0x25,0x43,0xb0,0x00,0x54,0x5a,0x58,0xb0,0x03,0x25,0x20,0x45,0xb0,0x40,0x61,0x44,0x59,0xb0,0x02,0x25,0x43,0xb0,0x00,0x54,0xb0,0x02,0x25,0x43,0xb0,0x40,0x54,0x5a,0x58,0xb0,0x04,0x25,0x20,0x45,0xb0,0x40,0x60,0x44,0x59, -0x59,0x21,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x03,0x25,0x20,0xb0,0x07,0x25,0x87,0x05,0x2e,0x23,0x20,0x8a,0xb0,0x04,0x25,0xb0,0x07,0x25,0xb0,0x14,0x2b,0x10,0x21,0xc4,0x21,0x2d,0x2c,0xc0,0x2d,0x2c,0x4b,0x52,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x58,0x3d,0xed,0x18,0x1b,0xed,0x59,0x2d,0x2c,0x4b,0x50,0x58, -0x45,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x01,0x18,0x4b,0x52,0x58,0x8a,0x2f,0xed,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0xb0,0x03,0x25,0x45,0x68,0xb0,0x03,0x25,0x45,0x68,0xb0,0x03,0x25,0x60,0x54,0x58,0x21,0x21,0x21,0x1b,0xb0,0x02,0x25,0x45,0x68,0x60,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x59, -0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x58,0x3d,0xcd,0x18,0x1b,0xcd,0x59,0x2d,0x2c,0x46,0x23,0x46,0x60,0x8a,0x8a,0x46,0x23,0x20,0x46,0x8a,0x60,0x8a,0x61,0xb8,0xff,0x80,0x62,0x23,0x20,0x10,0x23,0x8a,0xb1,0x0c,0x0c,0x8a,0x70,0x45,0x60,0x20,0xb0,0x00,0x50,0x58,0xb0,0x01,0x61,0xb8,0xff,0xba,0x8b,0x1b,0xb0,0x46, -0x8c,0x59,0xb0,0x10,0x60,0x68,0x01,0x3a,0x2d,0x2c,0x20,0x45,0xb0,0x03,0x25,0x46,0x52,0x4b,0xb0,0x13,0x51,0x5b,0x58,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25,0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x1b,0x21,0x11,0x59,0x2d,0x2c,0x20,0x45,0xb0,0x03,0x25,0x46,0x50,0x58,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25, -0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x1b,0x21,0x11,0x59,0x2d,0x2c,0x00,0x4b,0xb0,0xc8,0x51,0x58,0x00,0xb0,0x07,0x43,0xb0,0x06,0x43,0x0b,0x59,0x2d,0x2c,0x8a,0x10,0xec,0x2d,0x2c,0xb0,0x0c,0x43,0x58,0x21,0x1b,0x20,0x46,0xb0,0x00,0x52,0x58,0xb8,0xff,0xf0,0x38,0x1b,0xb0,0x10,0x38,0x59,0x59,0x2d,0x2c,0x20,0xb0,0x00,0x55,0x58, -0xb8,0x10,0x00,0x63,0xb0,0x03,0x25,0x45,0x64,0xb0,0x03,0x25,0x45,0x64,0x61,0xb0,0x00,0x53,0x58,0xb0,0x02,0x1b,0xb0,0x40,0x61,0xb0,0x03,0x59,0x25,0x45,0x69,0x53,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x1b,0x21,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x61,0x64,0xb0,0x28,0x51,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x59,0x2d,0x2c, -0x21,0x21,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x40,0x00,0x62,0x2d,0x2c,0x21,0xb0,0x80,0x51,0x58,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x20,0x00,0x62,0x1b,0xb2,0x00,0x40,0x2f,0x2b,0x59,0xb0,0x02,0x60,0x2d,0x2c,0x21,0xb0,0xc0,0x51,0x58,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x15,0x55,0x62,0x1b,0xb2,0x00,0x80,0x2f,0x2b,0x59,0xb0,0x02,0x60,0x2d, -0x2c,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x40,0x00,0x62,0x60,0x23,0x21,0x2d,0x2c,0x18,0x4b,0x53,0x58,0xb0,0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0x23,0x45,0x64,0x69,0xb0,0x40,0x8b,0x61,0x20,0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x0c,0x23,0x44,0x21,0x8a,0x10,0xb0,0x0c,0xf6,0x21,0x1b,0x21,0x8a,0x11,0x23, -0x12,0x20,0x39,0x2f,0x59,0x2d,0x2c,0xb0,0x02,0x25,0xb0,0x02,0x25,0x49,0x64,0xb0,0xc0,0x54,0x58,0xb8,0xff,0xf8,0x38,0xb0,0x08,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x13,0x43,0x58,0x03,0x1b,0x02,0x59,0x2d,0x2c,0xb0,0x13,0x43,0x58,0x02,0x1b,0x03,0x59,0x2d,0x2c,0xb0,0x0a,0x2b,0x23,0x10,0x20,0x3c,0xb0,0x17,0x2b,0x2d,0x2c, -0xb0,0x02,0x25,0xb8,0xff,0xf0,0x38,0xb0,0x28,0x2b,0x8a,0x10,0x23,0x20,0xd0,0x23,0xb0,0x10,0x2b,0xb0,0x05,0x43,0x58,0xc0,0x1b,0x3c,0x59,0x20,0x10,0x11,0xb0,0x00,0x12,0x01,0x2d,0x2c,0xb0,0x48,0x2b,0x2d,0x2c,0x01,0xb0,0x02,0x25,0x10,0xd0,0x23,0xc9,0x01,0xb0,0x01,0x13,0xb0,0x00,0x14,0x10,0xb0,0x01,0x3c,0xb0,0x01,0x16,0x2d, -0x2c,0x01,0xb0,0x00,0x13,0xb0,0x01,0xb0,0x03,0x25,0x49,0xb0,0x03,0x17,0x38,0xb0,0x01,0x13,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x18,0x4b,0x53,0x58,0xb0,0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0xb0,0x03,0x25,0xb0,0x03,0x25,0x49,0x64,0x68,0xb0,0x40,0x8b,0x61,0x20, -0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x0c,0x23,0x44,0x21,0xb0,0x04,0x25,0x10,0x23,0xb0,0x0c,0xf6,0x1b,0xb0,0x04,0x25,0xb0,0x04,0x25,0x11,0x12,0x23,0x20,0x39,0x2f,0x59,0xcc,0x21,0x21,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x25,0x46,0x23,0x45,0x64,0x61,0x1b,0x21,0xb0,0x04,0x25,0xb0, -0x04,0x25,0x4a,0x59,0xb0,0x0e,0x23,0x44,0x23,0x10,0xb0,0x0e,0xec,0x23,0x10,0xb0,0x0e,0xec,0x2d,0x2c,0xb0,0x1b,0x43,0x58,0x20,0xb0,0x01,0x60,0x45,0xb0,0x00,0x51,0x58,0x20,0xb0,0x01,0x60,0x20,0x45,0x20,0x68,0xb0,0x00,0x55,0x58,0xb0,0x20,0x60,0x44,0x21,0x1b,0x21,0x21,0x21,0x59,0x1b,0x20,0xb0,0x01,0x60,0x20,0x45,0x20,0x68, -0xb0,0x00,0x55,0x58,0xb8,0xff,0xe0,0x60,0x44,0xb0,0x1c,0x4b,0x50,0x58,0x20,0x45,0xb0,0x20,0x60,0x44,0x1b,0x21,0x59,0x1b,0x21,0x21,0x21,0x59,0x59,0x1b,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25,0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x2d,0x2c,0x46,0x23,0x46,0x60,0x8a,0x8a,0x46,0x23,0x20,0x46,0x8a, -0x60,0x8a,0x61,0xb8,0xff,0x80,0x62,0x23,0x20,0x10,0x23,0x8a,0xb1,0x0c,0x0c,0x8a,0x70,0x45,0x60,0x20,0xb0,0x00,0x50,0x58,0xb0,0x01,0x61,0xb8,0xff,0x80,0x8b,0x1b,0xb0,0x81,0x8c,0x59,0x68,0x3a,0x2d,0x2c,0xb0,0x40,0x2a,0x21,0x2d,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0x4b,0x53,0x23,0x4b,0x51,0x5a, -0x58,0x38,0x1b,0x21,0x21,0x59,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x49,0xb0,0x0e,0x23,0x44,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21, -0x21,0x59,0x2d,0x2c,0x4b,0x54,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x00,0x21,0x4b,0x54,0x58,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x46,0x2b,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43, -0x54,0x58,0xb0,0x47,0x2b,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x48,0x2b,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x49,0x2b,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0x00,0xb0,0x02,0x25,0x20,0x11,0x49,0xb0,0x00,0x51,0x58,0xb8,0xff,0xc0,0x38,0x1b,0x21,0x59,0x2d,0x2c,0x00, -0xb0,0x02,0x25,0x20,0x11,0x49,0xb0,0x00,0x53,0x58,0xb0,0x40,0x38,0x1b,0x21,0x59,0x2d,0x2c,0x4b,0x52,0x58,0x7d,0x1b,0x7a,0x59,0x2d,0x2c,0xb1,0x02,0x01,0x42,0xb1,0x23,0x01,0x88,0x51,0xb1,0x40,0x01,0x88,0x53,0x5a,0x58,0xb1,0x02,0x00,0x42,0xb9,0x10,0x00,0x00,0x20,0x88,0x54,0x58,0xb2,0x02,0x01,0x02,0x43,0x60,0x42,0x59,0xb1, -0x24,0x01,0x88,0x51,0x58,0xb9,0x20,0x00,0x00,0x40,0x88,0x54,0x58,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb1,0x24,0x01,0x88,0x54,0x58,0xb2,0x02,0x20,0x02,0x43,0x60,0x42,0x00,0x4b,0x01,0x4b,0x52,0x58,0xb2,0x02,0x08,0x02,0x43,0x60,0x42,0x59,0x1b,0xb9,0x40,0x00,0x00,0x80,0x88,0x54,0x58,0xb2,0x02,0x04,0x02,0x43,0x60,0x42,0x59, -0xb9,0x40,0x00,0x00,0x80,0x63,0xb8,0x01,0x00,0x88,0x54,0x58,0xb2,0x02,0x08,0x02,0x43,0x60,0x42,0x59,0xb9,0x40,0x00,0x01,0x00,0x63,0xb8,0x02,0x00,0x88,0x54,0x58,0xb2,0x02,0x10,0x02,0x43,0x60,0x42,0x59,0xb1,0x26,0x01,0x88,0x51,0x58,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x54,0x58,0xb2,0x02,0x40,0x02,0x43,0x60, -0x42,0x59,0xb9,0x40,0x00,0x04,0x00,0x63,0xb8,0x08,0x00,0x88,0x54,0x58,0xb2,0x02,0x80,0x02,0x43,0x60,0x42,0x59,0x59,0x59,0x59,0x59,0x59,0xb1,0x00,0x02,0x43,0x54,0x58,0x40,0x0a,0x05,0x40,0x08,0x40,0x09,0x40,0x0c,0x02,0x0d,0x02,0x1b,0xb1,0x01,0x02,0x43,0x54,0x58,0xb2,0x05,0x40,0x08,0xba,0x01,0x00,0x00,0x09,0x01,0x00,0xb3, -0x0c,0x01,0x0d,0x01,0x1b,0xb1,0x80,0x02,0x43,0x52,0x58,0xb2,0x05,0x40,0x08,0xb8,0x01,0x80,0xb1,0x09,0x40,0x1b,0xb2,0x05,0x40,0x08,0xba,0x01,0x80,0x00,0x09,0x01,0x40,0x59,0xb9,0x40,0x00,0x00,0x80,0x88,0x55,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x55,0x5a,0x58,0xb3,0x0c,0x00,0x0d,0x01,0x1b,0xb3,0x0c,0x00,0x0d, -0x01,0x59,0x59,0x59,0x42,0x42,0x42,0x42,0x42,0x2d,0x2c,0xb0,0x80,0xb0,0x02,0x43,0x50,0xb0,0x01,0xb0,0x02,0x43,0x54,0x5b,0xb0,0x10,0x4b,0x51,0x5a,0x58,0x21,0x23,0x10,0xb0,0x20,0x1a,0xc9,0x1b,0x8a,0x10,0xed,0x59,0x2d,0x2c,0xb0,0x59,0x2b,0x2d,0x2c,0x8a,0x10,0xe5,0x2d,0x2c,0x20,0x45,0x69,0x44,0x2d,0x2c,0xb1,0x25,0x01,0x88, -0x50,0x58,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x54,0x5c,0xb0,0x14,0x4b,0x52,0x5b,0x1b,0xb0,0x01,0x59,0x2d,0xb9,0x00,0x20,0x01,0x3e,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x3c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x34,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x32,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01, -0x2f,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x2e,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x2c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x0c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x04,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x03,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x01,0x40,0xfb,0x09,0x18,0x01,0x4a,0x20,0xff,0x09, -0x18,0x01,0x4a,0x20,0xfe,0x09,0x18,0x01,0x4a,0x20,0xfc,0x09,0x18,0x01,0x4a,0x20,0xf3,0x09,0x18,0x01,0x4a,0x20,0xf1,0x09,0x18,0x01,0x4a,0x20,0xf0,0x09,0x18,0x01,0x4a,0x20,0xef,0x09,0x18,0x01,0x4a,0x20,0xed,0x09,0x18,0x01,0x4a,0x20,0xea,0x09,0x18,0x01,0x4a,0x20,0xdc,0x09,0x18,0x01,0x4a,0x20,0xda,0x09,0x18,0x01,0x4a,0x20, -0xd8,0x09,0x18,0x01,0x4a,0x20,0xd3,0x09,0x18,0x01,0x4a,0x20,0xcd,0x09,0x18,0x01,0x4a,0x20,0xcc,0x09,0x18,0x01,0x4a,0x20,0xca,0x09,0x18,0x01,0x4a,0x20,0xc9,0x09,0x18,0x01,0x4a,0x20,0xc8,0x09,0x18,0x01,0x4a,0x20,0xc6,0x09,0x18,0x01,0x4a,0x20,0xc4,0x09,0x18,0x01,0x4a,0x20,0xc2,0x09,0x18,0x01,0x4a,0x20,0xc0,0x09,0x18,0x01, -0x4a,0x20,0xbd,0x09,0x18,0x01,0x4a,0x20,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb1,0x09,0x18,0x01,0x4a,0x20,0xaf,0x09,0x18,0x01,0x4a,0x20,0x8c,0x09,0x18,0x01,0x4a,0x20,0x8b,0x09,0x18,0x01,0x4a,0x20,0x8a,0x09,0x18,0x01,0x4a,0x20,0x89,0x09,0x18,0x01,0x4a,0x20,0x38,0x09,0x18,0x01,0x4a,0x20,0x37,0x09,0x18,0x01,0x4a,0x20,0x84,0x09, -0x18,0x01,0x4a,0x20,0x83,0x09,0x18,0x01,0x4a,0x20,0x7f,0x09,0x18,0x01,0x4a,0x20,0x7e,0x09,0x18,0x01,0x4a,0x20,0x7d,0x09,0x18,0x01,0x4a,0x20,0x62,0x09,0x18,0x01,0x4a,0x20,0x50,0x09,0x18,0x01,0x4a,0x20,0x48,0x09,0x18,0x01,0x4a,0x20,0x0e,0x09,0x18,0x01,0x4a,0x2f,0xbe,0x04,0xed,0x00,0x01,0x00,0x4f,0x04,0xec,0x00,0x01,0x00, -0x40,0x04,0xeb,0x40,0x61,0x09,0x0d,0x39,0xdf,0xe0,0x16,0x17,0x1c,0xd4,0xd5,0x16,0x17,0x1c,0x7b,0x7c,0x16,0x1b,0x7b,0x7c,0x19,0xd1,0xd2,0x16,0x17,0x1c,0x76,0x77,0x16,0x17,0x1c,0x6d,0x70,0x16,0x17,0x1c,0x6c,0x6f,0x16,0x17,0x1c,0x6b,0x6e,0x16,0x1b,0x6b,0x6e,0x7f,0x72,0x1a,0x74,0x75,0x14,0x15,0x1c,0x67,0x6a,0x14,0x15,0x1c, -0x66,0x69,0x14,0x15,0x1c,0x65,0x68,0x14,0x1b,0x65,0x68,0x85,0x71,0x1a,0x19,0x73,0x16,0x7a,0x43,0x19,0x21,0x79,0x43,0x19,0x21,0x3b,0x39,0x00,0x2b,0x3a,0x39,0x00,0x2b,0x39,0x95,0x48,0x1f,0x2f,0xbc,0x04,0xe6,0x00,0x2f,0x05,0x03,0x00,0x02,0x05,0x03,0xb3,0x13,0xff,0x1f,0xe0,0xbe,0x04,0xf7,0x00,0x01,0x00,0xe0,0x04,0xf7,0x00, -0x01,0x00,0x20,0x04,0xf0,0xb3,0x0d,0x11,0x39,0x40,0xb8,0x04,0xea,0xb2,0x0b,0x14,0x39,0xb9,0xff,0xc0,0x04,0xef,0xb3,0x1b,0x22,0x39,0x3f,0x41,0x0d,0x04,0xf4,0x00,0x01,0x00,0x8f,0x04,0xf3,0x00,0x01,0x00,0x30,0x04,0xf3,0x00,0x01,0x00,0x30,0x04,0xef,0x00,0x01,0x00,0x40,0x04,0xe8,0xb3,0x0b,0x10,0x39,0x30,0xbd,0x01,0x55,0x00, -0x01,0x00,0x80,0x01,0x55,0x00,0x01,0x01,0x54,0xb3,0x95,0x24,0x1f,0x3f,0xbf,0x01,0x42,0x00,0x01,0x00,0x0f,0x01,0x41,0x00,0xa0,0x01,0x41,0x00,0x02,0xff,0xe0,0xb4,0xf1,0x29,0x2b,0x39,0x40,0xb8,0x01,0x40,0xb3,0x3d,0x43,0x39,0x40,0xb8,0x01,0x40,0xb3,0x24,0x28,0x39,0x40,0xb8,0x01,0x3f,0xb3,0x2c,0x2f,0x39,0x40,0xb8,0x01,0x3f, -0xb3,0x17,0x1c,0x39,0x40,0xb8,0x01,0x3d,0x40,0x16,0x26,0x2b,0x39,0xe6,0xe7,0x03,0x2b,0x40,0xe7,0x2c,0x2e,0x39,0x40,0xe7,0x1b,0x1c,0x39,0x40,0x54,0x1f,0x1f,0x39,0xb8,0xff,0xc0,0x40,0x16,0xcb,0x23,0x23,0x39,0x40,0xd9,0x29,0x2a,0x39,0x53,0x52,0x02,0x2b,0x52,0xe2,0x02,0x2b,0x20,0xb0,0x0b,0x0d,0x39,0xb9,0x01,0x02,0x01,0x01, -0x40,0x1b,0x02,0x2b,0xfd,0xfc,0x0a,0x2b,0xfb,0xaf,0x05,0x2b,0xf2,0xe2,0x02,0x2b,0xc3,0xc5,0x02,0x2b,0x40,0xda,0x17,0x19,0x39,0xdb,0xe2,0x02,0x2b,0xb8,0xff,0xc0,0xb3,0xe2,0x30,0x31,0x39,0xb8,0xff,0xc0,0x40,0x11,0xe2,0x1d,0x1e,0x39,0x40,0xd6,0x17,0x17,0x39,0xeb,0xbe,0x02,0x2b,0xbe,0x9a,0x02,0x2b,0xb8,0x01,0x84,0xb2,0x99, -0x0a,0x2b,0xb8,0x01,0x81,0xb2,0x99,0x0a,0x2b,0xb8,0x01,0x80,0xb2,0x99,0x0a,0x2b,0xb8,0x01,0x7f,0x40,0x0f,0x99,0x0a,0x2b,0x9b,0x99,0x0a,0x2b,0x99,0x9a,0x02,0x2b,0x9a,0x95,0x05,0x2b,0xb8,0xff,0xe0,0xb7,0xee,0x14,0x16,0x39,0x92,0x91,0x03,0x2b,0xb8,0xff,0xe0,0x40,0x0c,0xf4,0x13,0x16,0x39,0xec,0x95,0x04,0x2b,0x91,0x95,0x24, -0x1f,0xb8,0xff,0xe0,0x40,0x0b,0x63,0x18,0x19,0x39,0x66,0x63,0x01,0x96,0x95,0x02,0x2b,0xb8,0xff,0xe0,0x40,0x0c,0x95,0x25,0x28,0x39,0x38,0x37,0x00,0x2b,0x37,0x84,0xff,0x1f,0xb8,0x01,0x01,0xb6,0x7d,0x02,0x2b,0xfc,0xdb,0x0a,0x2b,0xb9,0x01,0x3e,0x01,0x3c,0xb2,0x02,0x2b,0x40,0xb8,0x01,0x3c,0xb2,0x1f,0x24,0x39,0xb8,0x01,0x2f, -0xb2,0x7d,0x03,0x2b,0xb8,0x01,0x2e,0xb3,0x84,0x03,0x2b,0xd0,0xb8,0x01,0x2c,0xb5,0x01,0x40,0xd8,0x17,0x19,0x39,0xb8,0xff,0xc0,0x40,0x09,0xc4,0x22,0x25,0x39,0x40,0xc2,0x17,0x17,0x39,0xb8,0xff,0xc0,0xb3,0xc0,0x1a,0x1b,0x39,0xb8,0xff,0xc0,0xb7,0xc0,0x10,0x12,0x39,0xcd,0xcc,0x03,0x2b,0xb8,0xff,0xc0,0xb7,0xc9,0x23,0x23,0x39, -0xca,0xc8,0x03,0x2b,0xb8,0xff,0xc0,0x40,0x16,0xf0,0x0b,0x0d,0x39,0xea,0x7e,0x02,0x2b,0x30,0x62,0x0c,0x0c,0x06,0x43,0xb1,0xaf,0x02,0x2b,0xaf,0x7e,0x02,0x2b,0xb8,0xff,0xc0,0xb3,0xd3,0x0f,0x12,0x39,0xb8,0xff,0xc0,0xb3,0xbd,0x27,0x28,0x39,0xbc,0x01,0x86,0x00,0x89,0x01,0x00,0x00,0x2b,0x01,0x85,0xb2,0x8a,0x0a,0x2b,0xb8,0xff, -0xc0,0x40,0x1c,0x8c,0x1e,0x1e,0x39,0x89,0x8a,0x04,0x2b,0x8a,0x84,0x0a,0x2b,0x8b,0x84,0x03,0x2b,0x81,0x7f,0x01,0x2b,0x7d,0x7e,0x04,0x2b,0x7e,0x84,0x03,0x2b,0xb8,0xff,0xe0,0x40,0x41,0x62,0x18,0x19,0x39,0x62,0x84,0x01,0x2b,0x88,0x84,0x01,0x2b,0x87,0x84,0x01,0x2b,0x85,0x84,0x01,0x2b,0x83,0x84,0x04,0x2b,0xe9,0x84,0xf9,0x84, -0x02,0x69,0x84,0x01,0x27,0x84,0x01,0x1b,0x37,0x15,0x18,0x36,0x15,0x15,0x35,0x15,0x12,0x34,0x15,0x0f,0x33,0x15,0x0c,0x32,0x15,0x09,0x31,0x15,0x06,0x30,0x15,0x03,0x2f,0x15,0x00,0x2e,0x15,0x41,0x26,0x01,0x4a,0x01,0x4b,0x00,0x15,0x00,0x50,0x01,0x4c,0x00,0x01,0x00,0x70,0x01,0x4a,0x00,0x01,0x01,0x3a,0x01,0x3b,0x00,0x0f,0x01, -0x38,0x01,0x39,0x00,0x0e,0x01,0x36,0x01,0x37,0x00,0x0e,0x00,0x0b,0x01,0x38,0x00,0x3b,0x01,0x38,0x00,0x4b,0x01,0x38,0x00,0xcb,0x01,0x38,0x00,0x04,0x00,0x0b,0x01,0x36,0x00,0x3b,0x01,0x36,0x00,0x5b,0x01,0x36,0x00,0x03,0x00,0x10,0x01,0x3a,0x00,0x01,0x01,0x06,0xb2,0x03,0xff,0x1f,0x41,0x21,0x01,0x0a,0x01,0x0b,0x00,0x0f,0x01, -0x08,0x01,0x09,0x00,0x0e,0x01,0x06,0x01,0x07,0x00,0x0e,0x00,0x6b,0x01,0x08,0x00,0x01,0x00,0x0b,0x01,0x08,0x00,0x3b,0x01,0x08,0x00,0x4b,0x01,0x08,0x00,0xbb,0x01,0x08,0x00,0xeb,0x01,0x08,0x00,0xfb,0x01,0x08,0x00,0x06,0x00,0x0b,0x01,0x0a,0x00,0x5b,0x01,0x0a,0x00,0x8b,0x01,0x0a,0x00,0x03,0x01,0x06,0x40,0x22,0x03,0xff,0x1f, -0x26,0x27,0x0e,0x28,0x27,0x0f,0x35,0x36,0x0e,0x33,0x36,0x0f,0x2a,0x2b,0x0e,0x2c,0x2b,0x0f,0x22,0x23,0x0e,0x24,0x23,0x0f,0x1e,0x1f,0x0e,0x20,0x1f,0x0f,0x00,0xbf,0x01,0x31,0x00,0x10,0x01,0x31,0x00,0x20,0x01,0x31,0x00,0x03,0x00,0x00,0x01,0x30,0x40,0x80,0x01,0x70,0x2a,0xe0,0x2a,0x02,0x00,0x3c,0x01,0x10,0x24,0x40,0x24,0x70, -0x24,0xa0,0x24,0x04,0x0f,0x10,0x11,0x0c,0x09,0x0a,0x0b,0x0c,0x06,0x07,0x08,0x0c,0x03,0x04,0x05,0x0c,0x00,0x01,0x02,0x0c,0x26,0x06,0x1c,0x1f,0x06,0x03,0x18,0x1f,0x0f,0x03,0x3f,0x03,0xdf,0x03,0x03,0x9f,0x00,0xdf,0x00,0x02,0x0f,0x17,0x1f,0x17,0x2f,0x17,0x03,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x1b,0x01,0x1d,0x0d,0x18,0x07, -0x1a,0x0d,0x15,0x10,0x17,0x0d,0x12,0x04,0x14,0x0d,0x2f,0x1b,0x01,0x2c,0x3c,0x2a,0x3c,0x28,0x3c,0x26,0x3c,0x24,0x3c,0x22,0x3c,0x20,0x3c,0x1e,0x3c,0x1b,0x3c,0x18,0x3c,0x15,0x3c,0x12,0x3c,0x0f,0x3c,0x09,0x3c,0x06,0x3c,0x03,0x3c,0x00,0x3c,0x50,0x33,0x54,0x01,0xb0,0x12,0x4b,0x00,0x4b,0x54,0x42,0xb0,0x13,0x01,0x4b,0x00,0x4b, -0x53,0x42,0xb0,0x33,0x2b,0x4b,0xb8,0x03,0x20,0x52,0xb0,0x32,0x2b,0x4b,0xb0,0x09,0x50,0x5b,0x58,0xb1,0x01,0x01,0x8e,0x59,0xb0,0x33,0x2b,0xb0,0x02,0x88,0xb8,0x01,0x00,0x54,0xb0,0x04,0x88,0xb8,0x02,0x00,0x54,0xb0,0x12,0x43,0x5a,0x5b,0x58,0xb8,0x01,0x19,0xb1,0x01,0x01,0x8e,0x85,0x1b,0xb9,0x00,0x01,0x01,0x00,0xb0,0x4b,0x60, -0x85,0x8d,0x59,0x2b,0x2b,0x1d,0xb0,0x64,0x4b,0x53,0x58,0xb0,0x80,0x1d,0x59,0xb0,0x32,0x4b,0x53,0x58,0xb0,0x90,0x1d,0x59,0x00,0x4b,0xb0,0x32,0x51,0xb0,0x1b,0x23,0x42,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b, -0x2b,0x2b,0x73,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0xb1,0x28,0x26,0x45,0xb0,0x2a,0x45,0x61,0xb0,0x2c,0x45,0x60,0x44,0x2b,0x2b,0x2b,0x73,0x73,0x74,0xb8,0x01,0x06,0x45,0x69,0xb8,0x01,0x0a,0x45,0x69,0x61,0xb8,0x01,0x0a,0x23,0x44,0xb8,0x01,0x08,0x45,0x69,0xb8,0x01,0x0a,0x45,0x60,0xb8,0x01,0x08,0x23, -0x44,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x73,0xb8,0x01,0x3a,0x45,0x69,0xb8,0x01,0x38,0x45,0x69,0x60,0xb8,0x01,0x38,0x23,0x44,0xb8,0x01,0x3a,0x45,0x69,0xb8,0x01,0x36,0x45,0x69,0x60,0xb8,0x01,0x36,0x23,0x44,0x2b,0x2b,0x2b,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x01,0x73,0x74,0x75,0x2b,0x2b,0x2b,0x2b, -0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, -0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x2b,0x73,0x74,0x2b,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x73,0x74,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0xb0,0x18,0xb0,0x3f,0x4b,0x53,0x42,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0xb1, -0x09,0x32,0x2b,0x4b,0xb0,0x50,0x52,0x42,0x4b,0xb0,0x08,0x52,0x4b,0xb0,0x08,0x50,0x5b,0xb0,0x1a,0x23,0x42,0x4b,0xb0,0xc8,0x52,0x4b,0xb0,0x36,0x50,0x5b,0xb0,0x0c,0x23,0x42,0xb1,0x00,0x02,0x43,0x54,0xb1,0x02,0x02,0x43,0x54,0xb1,0x06,0x02,0x43,0x54,0x5b,0x5b,0x58,0x41,0x15,0x01,0x3e,0x00,0x64,0x01,0x3c,0x00,0x64,0x01,0x34, -0x00,0x64,0x01,0x32,0x00,0x64,0x01,0x2f,0x00,0x64,0x01,0x2e,0x00,0x64,0x01,0x2c,0x00,0x64,0x01,0x0c,0x00,0x64,0x01,0x04,0x00,0x64,0x01,0x03,0x00,0x64,0x01,0x01,0x40,0x4f,0x64,0xff,0x64,0xfe,0x64,0xfc,0x64,0xf3,0x64,0xf1,0x64,0xf0,0x64,0xef,0x64,0xed,0x64,0xea,0x64,0xdc,0x64,0xda,0x64,0xd8,0x64,0xd3,0x64,0xcd,0x64,0xcc, -0x64,0xca,0x64,0xc9,0x64,0xc8,0x64,0xc6,0x64,0xc4,0x64,0xc2,0x64,0xc0,0x64,0xbd,0x64,0xb4,0x64,0xb1,0x64,0xaf,0x64,0x8c,0x64,0x8b,0x64,0x8a,0x64,0x89,0x64,0x84,0x64,0x83,0x64,0x7f,0x64,0x7e,0x64,0x7d,0x64,0x62,0x64,0x50,0x64,0x48,0x64,0x0e,0x64,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, -0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x59,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, -0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x05,0xec,0x00,0x16,0x00,0x00,0x05,0x9a,0x00,0x18,0x00,0x00,0x05,0x9a,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0xff,0xe8, -0xff,0x89,0x00,0x00,0xff,0xe8,0xff,0x89,0x00,0x00,0xff,0xe8,0xfe,0x4e,0xfe,0x29,0xff,0xf5,0x00,0x00,0x05,0x9a,0x00,0x00,0xfe,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xcd,0xff,0xed,0x05,0xa1,0x00,0x0d,0x02,0x48,0xff,0xeb,0x03,0x59,0x00,0x0d,0x00,0x00,0xff,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0xff,0xed,0x04,0x33,0x00,0x12,0x00,0xa4,0x00,0xab,0x00,0x8b,0x00,0x81,0x00,0x77,0xfe,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x71,0x00,0x80, -0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0xa8,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0xa4,0x00,0x9b,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x8c,0x00,0x00, -0x00,0x00,0x00,0x8a,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x8a,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0xe0,0x00,0xa0,0x00,0xe4,0x01,0xbe, -0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x86,0x00,0x00,0x00,0xc5,0x00,0xc3,0x00,0x81,0x00,0x4a,0x00,0x5a,0x00,0x51,0x05,0xdb,0x05,0xdb,0x00,0x86,0x00,0x58,0x00,0x90,0x00,0x58,0x00,0x8a,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf, -0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x78,0x00,0x77,0x00,0x7a,0x00,0x61,0x00,0x7a,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x81,0x00,0x92,0x00,0x8b,0x00,0xa0,0x00,0x97,0x01,0xd3,0x00,0x4c,0x00,0x74,0x00,0x64, -0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x23,0x00,0xc9,0x00,0x6a,0x00,0x6d,0x00,0x4c,0x00,0x61,0x00,0x69,0x00,0xc8,0x00,0xa2,0x00,0x80,0x00,0x7e,0x00,0x6b,0x05,0x9a,0x00,0x11,0x02,0x24,0x00,0x11,0x03,0x00,0xff,0xef,0x00,0x81,0x00,0x67,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x63,0x00,0x96,0x00,0xc0,0xfe,0xbc,0xfe,0xf2,0x00,0x64,0x00,0x64, -0x00,0x76,0x00,0x7c,0x02,0xf6,0x00,0x0d,0x02,0x00,0x00,0x0d,0x04,0x96,0xff,0xf3,0x00,0x54,0x00,0x46,0x00,0x6a,0x00,0x6b,0x00,0x4c,0x07,0x69,0xfe,0x31,0x00,0xe4,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xcd,0x00,0x11,0x06,0xa0,0x00,0x00,0xff,0xed,0xfe,0x00,0x00,0xaa,0x00,0xb6,0x00,0x6c,0x00,0x00, -0x00,0xaa,0x00,0xb8,0x00,0x6c,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xfe,0x63,0xfd,0x6d, -0xfd,0x76,0xff,0x82,0xff,0x83,0x05,0xe9,0x05,0xe3,0x04,0xbe,0x04,0xec,0x03,0x64,0x04,0x19,0x00,0x6e,0x00,0x7f,0x00,0x8c,0x00,0x9b,0x00,0xa7,0x00,0x6e,0x00,0x7f,0x00,0x91,0x00,0xa0,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0xbc,0x00,0x94,0x00,0x94,0xff,0x85,0xff,0xae,0x00,0x52,0x00,0x29,0x06,0x14,0x00,0xae,0x00,0x46,0x00,0x46,0xfe,0x58, -0x05,0x60,0x00,0x8f,0x00,0x85,0x00,0x85,0x00,0x5c,0x00,0x54,0x00,0x46,0x00,0xa7,0x00,0x98,0x00,0x58,0x00,0xe1,0x00,0x9e,0x00,0x4b,0x00,0x69,0x00,0xb4,0xff,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x64,0x00,0xe1,0x00,0x5a,0x00,0x4b,0x00,0x00,0x05,0x4e,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0xbe,0x00,0x00,0x01,0x0a,0x00,0x00,0x02,0x3e,0x00,0x00,0x03,0x84,0x00,0x00,0x04,0xd2,0x00,0x00,0x06,0xca,0x00,0x00,0x06,0xf2,0x00,0x00,0x07,0x66,0x00,0x00,0x07,0xe2,0x00,0x00,0x08,0x8e,0x00,0x00,0x09,0x08,0x00,0x00,0x09,0x6a, -0x00,0x00,0x09,0xa2,0x00,0x00,0x09,0xea,0x00,0x00,0x0a,0x22,0x00,0x00,0x0a,0xa6,0x00,0x00,0x0a,0xf8,0x00,0x00,0x0b,0xb0,0x00,0x00,0x0c,0x9c,0x00,0x00,0x0d,0x28,0x00,0x00,0x0d,0xe8,0x00,0x00,0x0e,0xc4,0x00,0x00,0x0f,0x3a,0x00,0x00,0x10,0x66,0x00,0x00,0x11,0x42,0x00,0x00,0x11,0xca,0x00,0x00,0x12,0x6a,0x00,0x00,0x12,0xda, -0x00,0x00,0x13,0x36,0x00,0x00,0x13,0xa6,0x00,0x00,0x14,0x80,0x00,0x00,0x15,0xfc,0x00,0x00,0x17,0x10,0x00,0x00,0x18,0x52,0x00,0x00,0x19,0x3e,0x00,0x00,0x1a,0x18,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0x4c,0x00,0x00,0x1c,0x58,0x00,0x00,0x1d,0x00,0x00,0x00,0x1d,0x28,0x00,0x00,0x1d,0xc6,0x00,0x00,0x1e,0xa4,0x00,0x00,0x1f,0x4a, -0x00,0x00,0x20,0x64,0x00,0x00,0x21,0x58,0x00,0x00,0x22,0x42,0x00,0x00,0x23,0x18,0x00,0x00,0x23,0xd0,0x00,0x00,0x25,0x02,0x00,0x00,0x26,0x66,0x00,0x00,0x27,0x0a,0x00,0x00,0x27,0xbc,0x00,0x00,0x28,0xbe,0x00,0x00,0x2a,0x6c,0x00,0x00,0x2b,0x84,0x00,0x00,0x2c,0x28,0x00,0x00,0x2c,0xfe,0x00,0x00,0x2d,0x5c,0x00,0x00,0x2d,0x90, -0x00,0x00,0x2d,0xea,0x00,0x00,0x2e,0x3a,0x00,0x00,0x2e,0x64,0x00,0x00,0x2e,0x9c,0x00,0x00,0x2f,0xaa,0x00,0x00,0x30,0xa2,0x00,0x00,0x31,0x70,0x00,0x00,0x32,0x66,0x00,0x00,0x33,0x6e,0x00,0x00,0x34,0x38,0x00,0x00,0x35,0x74,0x00,0x00,0x36,0x46,0x00,0x00,0x36,0xce,0x00,0x00,0x37,0x8a,0x00,0x00,0x38,0x5a,0x00,0x00,0x38,0xac, -0x00,0x00,0x39,0xe8,0x00,0x00,0x3a,0xba,0x00,0x00,0x3b,0x98,0x00,0x00,0x3c,0x90,0x00,0x00,0x3d,0x82,0x00,0x00,0x3e,0x16,0x00,0x00,0x3f,0x38,0x00,0x00,0x3f,0xfa,0x00,0x00,0x40,0xd6,0x00,0x00,0x41,0x8a,0x00,0x00,0x42,0xc4,0x00,0x00,0x43,0xf8,0x00,0x00,0x44,0xe4,0x00,0x00,0x45,0xb8,0x00,0x00,0x46,0x6c,0x00,0x00,0x46,0x9a, -0x00,0x00,0x47,0x54,0x00,0x00,0x47,0xde,0x00,0x00,0x48,0x1a,0x00,0x00,0x49,0xee,0x00,0x00,0x4a,0x06,0x00,0x00,0x4a,0x34,0x00,0x00,0x4a,0x62,0x00,0x00,0x4a,0x98,0x00,0x00,0x4a,0xca,0x00,0x00,0x4a,0xf8,0x00,0x00,0x4b,0x26,0x00,0x00,0x4b,0x56,0x00,0x00,0x4b,0x88,0x00,0x00,0x4b,0xb8,0x00,0x00,0x4b,0xec,0x00,0x00,0x4c,0x04, -0x00,0x00,0x4c,0x32,0x00,0x00,0x4c,0x60,0x00,0x00,0x4c,0x90,0x00,0x00,0x4c,0xc2,0x00,0x00,0x4c,0xee,0x00,0x00,0x4d,0x1a,0x00,0x00,0x4d,0x4a,0x00,0x00,0x4d,0x7e,0x00,0x00,0x4d,0xae,0x00,0x00,0x4d,0xde,0x00,0x00,0x4e,0x0c,0x00,0x00,0x4e,0x3a,0x00,0x00,0x4e,0x6c,0x00,0x00,0x4e,0x9a,0x00,0x00,0x4e,0xca,0x00,0x00,0x4e,0xf8, -0x00,0x00,0x4f,0x26,0x00,0x00,0x4f,0x58,0x00,0x00,0x4f,0xc8,0x00,0x00,0x50,0x4e,0x00,0x00,0x51,0x30,0x00,0x00,0x51,0xec,0x00,0x00,0x53,0x48,0x00,0x00,0x53,0x8e,0x00,0x00,0x54,0x42,0x00,0x00,0x55,0x52,0x00,0x00,0x55,0x62,0x00,0x00,0x56,0x80,0x00,0x00,0x57,0xa2,0x00,0x00,0x58,0x6e,0x00,0x00,0x58,0xa0,0x00,0x00,0x59,0x16, -0x00,0x00,0x59,0xec,0x00,0x00,0x5a,0xee,0x00,0x00,0x5c,0x78,0x00,0x00,0x5d,0x82,0x00,0x00,0x5e,0x1e,0x00,0x00,0x5e,0xb4,0x00,0x00,0x5f,0x4c,0x00,0x00,0x60,0x4a,0x00,0x00,0x60,0xf2,0x00,0x00,0x61,0xd2,0x00,0x00,0x62,0x52,0x00,0x00,0x62,0xb4,0x00,0x00,0x63,0x3c,0x00,0x00,0x64,0x0a,0x00,0x00,0x64,0x82,0x00,0x00,0x65,0xb6, -0x00,0x00,0x67,0x24,0x00,0x00,0x68,0x74,0x00,0x00,0x69,0x4c,0x00,0x00,0x69,0x4c,0x00,0x00,0x69,0xc4,0x00,0x00,0x6a,0x10,0x00,0x00,0x6a,0x82,0x00,0x00,0x6b,0x68,0x00,0x00,0x6c,0x7e,0x00,0x00,0x6c,0xfc,0x00,0x00,0x6d,0x66,0x00,0x00,0x6d,0xd0,0x00,0x00,0x6e,0x90,0x00,0x00,0x6e,0xbe,0x00,0x00,0x6e,0xee,0x00,0x00,0x6f,0x1c, -0x00,0x00,0x70,0x4e,0x00,0x00,0x71,0xe0,0x00,0x00,0x72,0x0a,0x00,0x00,0x72,0x34,0x00,0x00,0x72,0x82,0x00,0x00,0x72,0xd0,0x00,0x00,0x73,0x06,0x00,0x00,0x73,0x38,0x00,0x00,0x73,0xda,0x00,0x00,0x74,0x3c,0x00,0x00,0x74,0x6c,0x00,0x00,0x74,0xa0,0x00,0x00,0x74,0xce,0x00,0x00,0x76,0x0e,0x00,0x00,0x76,0x50,0x00,0x00,0x76,0x92, -0x00,0x00,0x77,0xae,0x00,0x00,0x78,0xa0,0x00,0x00,0x79,0x54,0x00,0x00,0x79,0x96,0x00,0x00,0x79,0xde,0x00,0x00,0x7a,0x56,0x00,0x00,0x7c,0x38,0x00,0x00,0x7c,0x68,0x00,0x00,0x7c,0x98,0x00,0x00,0x7c,0xc8,0x00,0x00,0x7c,0xfa,0x00,0x00,0x7d,0x2a,0x00,0x00,0x7d,0x58,0x00,0x00,0x7d,0x86,0x00,0x00,0x7d,0xb8,0x00,0x00,0x7d,0xe6, -0x00,0x00,0x7e,0x14,0x00,0x00,0x7e,0x42,0x00,0x00,0x7e,0x70,0x00,0x00,0x7e,0x9e,0x00,0x00,0x7e,0xcc,0x00,0x00,0x7e,0xfc,0x00,0x00,0x7f,0x46,0x00,0x00,0x7f,0x86,0x00,0x00,0x80,0x16,0x00,0x00,0x80,0x42,0x00,0x00,0x80,0xa4,0x00,0x00,0x80,0xe2,0x00,0x00,0x81,0x7c,0x00,0x00,0x82,0x16,0x00,0x00,0x82,0x8e,0x00,0x00,0x82,0xe4, -0x00,0x00,0x83,0x26,0x00,0x00,0x84,0x22,0x00,0x00,0x84,0xb6,0x00,0x00,0x84,0xe4,0x00,0x00,0x85,0x10,0x00,0x00,0x85,0x3e,0x00,0x00,0x85,0x6a,0x00,0x00,0x85,0xb2,0x00,0x00,0x86,0xb4,0x00,0x00,0x88,0x30,0x00,0x00,0x88,0x5e,0x00,0x00,0x88,0x8c,0x00,0x00,0x89,0x50,0x00,0x00,0x8a,0x4a,0x00,0x00,0x8a,0x96,0x00,0x00,0x8a,0xf6, -0x00,0x00,0x8b,0x40,0x00,0x00,0x8b,0xd8,0x00,0x00,0x8c,0x94,0x00,0x00,0x8c,0xbe,0x00,0x00,0x8c,0xea,0x00,0x00,0x8d,0x16,0x00,0x00,0x8d,0xd4,0x00,0x00,0x8e,0x04,0x00,0x00,0x8e,0x32,0x00,0x00,0x8e,0x60,0x00,0x00,0x8e,0x78,0x00,0x00,0x8e,0x90,0x00,0x00,0x8e,0xbe,0x00,0x00,0x8e,0xec,0x00,0x00,0x8f,0x1a,0x00,0x00,0x8f,0x48, -0x00,0x00,0x90,0x80,0x00,0x00,0x90,0xac,0x00,0x00,0x90,0xbc,0x00,0x00,0x90,0xec,0x00,0x00,0x91,0x1c,0x00,0x00,0x91,0x34,0x00,0x00,0x91,0x4c,0x00,0x00,0x91,0x7a,0x00,0x00,0x91,0xa6,0x00,0x00,0x91,0xb6,0x00,0x00,0x91,0xce,0x00,0x00,0x91,0xe6,0x00,0x00,0x92,0x16,0x00,0x00,0x92,0x44,0x00,0x00,0x92,0x72,0x00,0x00,0x92,0xa2, -0x00,0x00,0x92,0xd0,0x00,0x00,0x92,0xfc,0x00,0x00,0x93,0x24,0x00,0x00,0x93,0x4a,0x00,0x00,0x93,0x78,0x00,0x00,0x93,0xa8,0x00,0x00,0x93,0xd8,0x00,0x00,0x94,0x06,0x00,0x00,0x94,0x3a,0x00,0x00,0x94,0x6c,0x00,0x00,0x94,0x8e,0x00,0x00,0x94,0xbc,0x00,0x00,0x94,0xde,0x00,0x00,0x95,0x0a,0x00,0x00,0x95,0x2c,0x00,0x00,0x95,0x4e, -0x00,0x00,0x95,0x74,0x00,0x00,0x95,0x8c,0x00,0x00,0x95,0xba,0x00,0x00,0x96,0x82,0x00,0x00,0x96,0xc0,0x00,0x00,0x96,0xf2,0x00,0x00,0x97,0x52,0x00,0x00,0x97,0x86,0x00,0x00,0x97,0xb6,0x00,0x00,0x97,0xe4,0x00,0x00,0x98,0x14,0x00,0x00,0x98,0x42,0x00,0x00,0x98,0xb0,0x00,0x00,0x99,0xd6,0x00,0x00,0x9b,0x46,0x00,0x00,0x9c,0xc6, -0x00,0x00,0x9e,0x22,0x00,0x00,0x9f,0x28,0x00,0x00,0x9f,0xf6,0x00,0x00,0xa0,0xb2,0x00,0x00,0xa2,0x28,0x00,0x00,0xa2,0x7c,0x00,0x00,0xa2,0x94,0x00,0x00,0xa2,0xfc,0x00,0x00,0xa4,0x9a,0x00,0x00,0xa4,0xc2,0x00,0x00,0xa5,0x12,0x00,0x00,0xa5,0x44,0x00,0x00,0xa5,0x7a,0x00,0x00,0xa5,0xe0,0x00,0x00,0xa6,0xd6,0x00,0x00,0xa7,0x86, -0x00,0x00,0xa7,0xea,0x00,0x00,0xa8,0x2c,0x00,0x00,0xa8,0x98,0x00,0x00,0xa8,0xf2,0x00,0x00,0xa9,0x86,0x00,0x00,0xa9,0xb4,0x00,0x00,0xa9,0xe2,0x00,0x00,0xaa,0x10,0x00,0x00,0xaa,0x40,0x00,0x00,0xaa,0x6e,0x00,0x00,0xaa,0x9c,0x00,0x00,0xaa,0xca,0x00,0x00,0xaa,0xf8,0x00,0x00,0xab,0x26,0x00,0x00,0xab,0x56,0x00,0x00,0xab,0x86, -0x00,0x00,0xab,0xb4,0x00,0x00,0xab,0xe2,0x00,0x00,0xac,0x10,0x00,0x00,0xac,0x3e,0x00,0x00,0xac,0x6c,0x00,0x00,0xac,0x92,0x00,0x00,0xad,0xd0,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x30,0x00,0x00,0xaf,0x18,0x00,0x00,0xb0,0x24,0x00,0x00,0xb0,0x52,0x00,0x00,0xb0,0x80,0x00,0x00,0xb0,0xae,0x00,0x00,0xb0,0xdc,0x00,0x00,0xb1,0x0a, -0x00,0x00,0xb1,0x38,0x00,0x00,0xb1,0x5c,0x00,0x00,0xb1,0x80,0x00,0x00,0xb1,0xae,0x00,0x00,0xb1,0xd0,0x00,0x00,0xb1,0xf6,0x00,0x00,0xb2,0x1c,0x00,0x00,0xb2,0xb8,0x00,0x00,0xb2,0xd0,0x00,0x00,0xb2,0xe8,0x00,0x00,0xb3,0x10,0x00,0x00,0xb3,0x36,0x00,0x00,0xb4,0x4a,0x00,0x00,0xb5,0x38,0x00,0x00,0xb5,0x66,0x00,0x00,0xb5,0x94, -0x00,0x00,0xb5,0xc2,0x00,0x00,0xb5,0xf0,0x00,0x00,0xb6,0x08,0x00,0x00,0xb6,0x2c,0x00,0x00,0xb6,0x4e,0x00,0x00,0xb6,0x6e,0x00,0x00,0xb7,0x4a,0x00,0x00,0xb8,0x38,0x00,0x00,0xb8,0x66,0x00,0x00,0xb8,0x94,0x00,0x00,0xb8,0xc2,0x00,0x00,0xb8,0xf2,0x00,0x00,0xb9,0x22,0x00,0x00,0xb9,0x52,0x00,0x00,0xb9,0x6a,0x00,0x00,0xb9,0x82, -0x00,0x00,0xb9,0xb0,0x00,0x00,0xb9,0xe0,0x00,0x00,0xba,0x0e,0x00,0x00,0xba,0x3c,0x00,0x00,0xba,0xa6,0x00,0x00,0xbc,0x2c,0x00,0x00,0xbc,0x82,0x00,0x00,0xbc,0xb0,0x00,0x00,0xbc,0xde,0x00,0x00,0xbd,0x0c,0x00,0x00,0xbd,0x3c,0x00,0x00,0xbd,0x7e,0x00,0x00,0xbd,0xae,0x00,0x00,0xbd,0xde,0x00,0x00,0xbe,0x10,0x00,0x00,0xbe,0x3e, -0x00,0x00,0xbe,0x72,0x00,0x00,0xbe,0xa6,0x00,0x00,0xbe,0xda,0x00,0x00,0xbf,0x0a,0x00,0x00,0xbf,0x42,0x00,0x00,0xbf,0x6e,0x00,0x00,0xc0,0x66,0x00,0x00,0xc1,0x16,0x00,0x00,0xc1,0x44,0x00,0x00,0xc1,0x72,0x00,0x00,0xc1,0xa0,0x00,0x00,0xc1,0xce,0x00,0x00,0xc2,0x02,0x00,0x00,0xc2,0x36,0x00,0x00,0xc2,0x46,0x00,0x00,0xc2,0x72, -0x00,0x00,0xc2,0xf8,0x00,0x00,0xc3,0x24,0x00,0x00,0xc3,0x54,0x00,0x00,0xc3,0x84,0x00,0x00,0xc3,0xa8,0x00,0x00,0xc3,0xd4,0x00,0x00,0xc4,0x04,0x00,0x00,0xc4,0x34,0x00,0x00,0xc4,0x6a,0x00,0x00,0xc4,0x7a,0x00,0x00,0xc4,0x8a,0x00,0x00,0xc4,0x9a,0x00,0x00,0xc4,0xaa,0x00,0x00,0xc4,0xba,0x00,0x00,0xc4,0xca,0x00,0x00,0xc4,0xda, -0x00,0x00,0xc5,0x6e,0x00,0x00,0xc5,0x7e,0x00,0x00,0xc5,0x8e,0x00,0x00,0xc6,0x18,0x00,0x00,0xc6,0x28,0x00,0x00,0xc6,0xbc,0x00,0x00,0xc6,0xcc,0x00,0x00,0xc7,0x62,0x00,0x00,0xc7,0x72,0x00,0x00,0xc7,0x82,0x00,0x00,0xc7,0x92,0x00,0x00,0xc8,0xb4,0x00,0x00,0xc8,0xc4,0x00,0x00,0xc8,0xf6,0x00,0x00,0xc9,0x2a,0x00,0x00,0xc9,0x58, -0x00,0x00,0xc9,0x86,0x00,0x00,0xc9,0xb4,0x00,0x00,0xc9,0xe2,0x00,0x00,0xca,0x1a,0x00,0x00,0xcb,0x52,0x00,0x00,0xcc,0x3e,0x00,0x00,0xcc,0xfc,0x00,0x00,0xcd,0xc0,0x00,0x00,0xce,0xea,0x00,0x00,0xcf,0x60,0x00,0x00,0xd0,0x4a,0x00,0x00,0xd0,0xe6,0x00,0x00,0xd1,0xde,0x00,0x00,0xd2,0x80,0x00,0x00,0xd3,0xbe,0x00,0x00,0xd3,0xce, -0x00,0x00,0xd4,0xac,0x00,0x00,0xd5,0x98,0x00,0x00,0xd6,0x96,0x00,0x00,0xd7,0x8e,0x00,0x00,0xd8,0xd4,0x00,0x00,0xda,0x1e,0x00,0x00,0xda,0x50,0x00,0x00,0xda,0x84,0x00,0x00,0xda,0xb4,0x00,0x00,0xda,0xe2,0x00,0x00,0xdb,0x10,0x00,0x00,0xdb,0x42,0x00,0x00,0xdc,0x4c,0x00,0x00,0xdc,0x7e,0x00,0x00,0xdd,0x70,0x00,0x00,0xdd,0x80, -0x00,0x00,0xdd,0xb2,0x00,0x00,0xde,0xe2,0x00,0x00,0xdf,0xf2,0x00,0x00,0xe0,0xf8,0x00,0x00,0xe1,0x2a,0x00,0x00,0xe1,0x58,0x00,0x00,0xe2,0x3a,0x00,0x00,0xe2,0x4a,0x00,0x00,0xe3,0x32,0x00,0x00,0xe3,0x42,0x00,0x00,0xe3,0x52,0x00,0x00,0xe4,0x70,0x00,0x00,0xe4,0x80,0x00,0x00,0xe5,0x9e,0x00,0x00,0xe6,0xdc,0x00,0x00,0xe7,0xc4, -0x00,0x00,0xe7,0xf2,0x00,0x00,0xe8,0x02,0x00,0x00,0xe8,0xbc,0x00,0x00,0xe8,0xcc,0x00,0x00,0xe8,0xdc,0x00,0x00,0xe8,0xec,0x00,0x00,0xe8,0xfc,0x00,0x00,0xe9,0x0c,0x00,0x00,0xe9,0x1c,0x00,0x00,0xe9,0x2c,0x00,0x00,0xe9,0xd4,0x00,0x00,0xeb,0x50,0x00,0x00,0xeb,0x60,0x00,0x00,0xec,0x44,0x00,0x00,0xed,0x02,0x00,0x00,0xed,0xd8, -0x00,0x00,0xef,0x12,0x00,0x00,0xef,0xf4,0x00,0x00,0xf0,0xf6,0x00,0x00,0xf1,0xc0,0x00,0x00,0xf2,0xd2,0x00,0x00,0xf4,0x1c,0x00,0x00,0xf5,0x22,0x00,0x00,0xf5,0x32,0x00,0x00,0xf6,0x46,0x00,0x00,0xf7,0x42,0x00,0x00,0xf7,0xaa,0x00,0x00,0xf8,0xac,0x00,0x00,0xf8,0xbc,0x00,0x00,0xf9,0xd6,0x00,0x00,0xfa,0xde,0x00,0x00,0xfb,0xa8, -0x00,0x00,0xfb,0xd4,0x00,0x00,0xfb,0xe4,0x00,0x00,0xfc,0xb2,0x00,0x00,0xfd,0xac,0x00,0x00,0xfe,0x44,0x00,0x00,0xfe,0x54,0x00,0x00,0xfe,0xd8,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xf8,0x00,0x00,0xff,0x66,0x00,0x00,0xff,0x76,0x00,0x01,0x00,0xd8,0x00,0x01,0x00,0xe8,0x00,0x01,0x01,0xac,0x00,0x01,0x02,0x4a,0x00,0x01,0x03,0x26, -0x00,0x01,0x04,0x54,0x00,0x01,0x05,0x16,0x00,0x01,0x06,0x12,0x00,0x01,0x06,0xc4,0x00,0x01,0x07,0xae,0x00,0x01,0x08,0xc8,0x00,0x01,0x09,0xc8,0x00,0x01,0x09,0xf8,0x00,0x01,0x0b,0x1c,0x00,0x01,0x0b,0x4a,0x00,0x01,0x0c,0x24,0x00,0x01,0x0c,0x34,0x00,0x01,0x0c,0x66,0x00,0x01,0x0d,0x98,0x00,0x01,0x0e,0xa4,0x00,0x01,0x0f,0xa6, -0x00,0x01,0x0f,0xd4,0x00,0x01,0x10,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x11,0x68,0x00,0x01,0x11,0xf0,0x00,0x01,0x12,0x00,0x00,0x01,0x13,0x64,0x00,0x01,0x14,0x6c,0x00,0x01,0x14,0xf8,0x00,0x01,0x15,0x9a,0x00,0x01,0x15,0xf4,0x00,0x01,0x17,0x08,0x00,0x01,0x17,0x18,0x00,0x01,0x17,0x2e,0x00,0x01,0x17,0x44,0x00,0x01,0x18,0x2a, -0x00,0x01,0x19,0x62,0x00,0x01,0x1a,0x6c,0x00,0x01,0x1b,0x42,0x00,0x01,0x1c,0x28,0x00,0x01,0x1c,0x8c,0x00,0x01,0x1c,0xce,0x00,0x01,0x1c,0xf6,0x00,0x01,0x1d,0x1e,0x00,0x01,0x1d,0x7c,0x00,0x01,0x1d,0xe2,0x00,0x01,0x1e,0x76,0x00,0x01,0x1f,0x08,0x00,0x01,0x1f,0x78,0x00,0x01,0x1f,0xe8,0x00,0x01,0x20,0xa2,0x00,0x01,0x21,0x50, -0x00,0x01,0x21,0xc6,0x00,0x01,0x22,0x68,0x00,0x01,0x22,0xde,0x00,0x01,0x23,0x56,0x00,0x01,0x24,0x1a,0x00,0x01,0x24,0xd4,0x00,0x01,0x25,0x82,0x00,0x01,0x25,0xa8,0x00,0x01,0x25,0xd0,0x00,0x01,0x26,0x00,0x00,0x01,0x26,0x2e,0x00,0x01,0x26,0x62,0x00,0x01,0x26,0x94,0x00,0x01,0x26,0xc8,0x00,0x01,0x26,0xf8,0x00,0x01,0x27,0x2c, -0x00,0x01,0x27,0x60,0x00,0x01,0x27,0x94,0x00,0x01,0x27,0xc4,0x00,0x01,0x28,0x04,0x00,0x01,0x28,0x42,0x00,0x01,0x28,0x76,0x00,0x01,0x28,0xa8,0x00,0x01,0x28,0xdc,0x00,0x01,0x29,0x0e,0x00,0x01,0x29,0x54,0x00,0x01,0x29,0x88,0x00,0x01,0x29,0xba,0x00,0x01,0x29,0xea,0x00,0x01,0x2a,0x28,0x00,0x01,0x2a,0x66,0x00,0x01,0x2a,0x8c, -0x00,0x01,0x2a,0xb2,0x00,0x01,0x2a,0xe0,0x00,0x01,0x2b,0x0e,0x00,0x01,0x2b,0x40,0x00,0x01,0x2b,0x6e,0x00,0x01,0x2b,0xa0,0x00,0x01,0x2b,0xd4,0x00,0x01,0x2c,0x06,0x00,0x01,0x2c,0x36,0x00,0x01,0x2c,0x68,0x00,0x01,0x2c,0x9a,0x00,0x01,0x2c,0xcc,0x00,0x01,0x2c,0xfc,0x00,0x01,0x2d,0x3c,0x00,0x01,0x2d,0x7a,0x00,0x01,0x2d,0xa8, -0x00,0x01,0x2d,0xd4,0x00,0x01,0x2d,0xf8,0x00,0x01,0x2e,0x1e,0x00,0x01,0x2e,0x46,0x00,0x01,0x2e,0x6c,0x00,0x01,0x2e,0x9c,0x00,0x01,0x2e,0xcc,0x00,0x01,0x2e,0xfe,0x00,0x01,0x2f,0x30,0x00,0x01,0x2f,0x62,0x00,0x01,0x2f,0x94,0x00,0x01,0x2f,0xc8,0x00,0x01,0x2f,0xfc,0x00,0x01,0x30,0x2e,0x00,0x01,0x30,0x60,0x00,0x01,0x30,0x9e, -0x00,0x01,0x30,0xde,0x00,0x01,0x31,0x0c,0x00,0x01,0x31,0x3c,0x00,0x01,0x31,0x6a,0x00,0x01,0x31,0x9a,0x00,0x01,0x31,0xc8,0x00,0x01,0x31,0xf8,0x00,0x01,0x32,0x26,0x00,0x01,0x32,0x54,0x00,0x01,0x32,0x7a,0x00,0x01,0x32,0xa0,0x00,0x01,0x32,0xc6,0x00,0x01,0x32,0xee,0x00,0x01,0x33,0x1c,0x00,0x01,0x33,0x4a,0x00,0x01,0x33,0x78, -0x00,0x01,0x33,0xa6,0x00,0x01,0x33,0xd4,0x00,0x01,0x34,0x02,0x00,0x01,0x34,0x32,0x00,0x01,0x34,0x62,0x00,0x01,0x34,0x90,0x00,0x01,0x34,0xbe,0x00,0x01,0x34,0xe4,0x00,0x01,0x35,0x0a,0x00,0x01,0x35,0x30,0x00,0x01,0x35,0x58,0x00,0x01,0x35,0x86,0x00,0x01,0x35,0xb4,0x00,0x01,0x35,0xe2,0x00,0x01,0x36,0x12,0x00,0x01,0x36,0x38, -0x00,0x01,0x36,0x5e,0x00,0x01,0x36,0x8e,0x00,0x01,0x36,0xbe,0x00,0x01,0x36,0xee,0x00,0x01,0x37,0x1e,0x00,0x01,0x37,0x2e,0x00,0x01,0x37,0x3e,0x00,0x01,0x37,0x4e,0x00,0x01,0x37,0x5e,0x00,0x01,0x37,0xee,0x00,0x01,0x38,0x82,0x00,0x01,0x39,0xaa,0x00,0x01,0x3a,0xb0,0x00,0x01,0x3b,0x86,0x00,0x01,0x3c,0x44,0x00,0x01,0x3d,0x44, -0x00,0x01,0x3e,0x0e,0x00,0x01,0x3f,0x00,0x00,0x01,0x3f,0xd6,0x00,0x01,0x3f,0xe6,0x00,0x01,0x40,0x8a,0x00,0x01,0x41,0x58,0x00,0x01,0x42,0x02,0x00,0x01,0x42,0xc8,0x00,0x01,0x43,0x84,0x00,0x01,0x44,0x72,0x00,0x01,0x45,0x4a,0x00,0x01,0x45,0xf6,0x00,0x01,0x46,0x06,0x00,0x01,0x46,0xe0,0x00,0x01,0x47,0x8e,0x00,0x01,0x48,0x60, -0x00,0x01,0x49,0x2a,0x00,0x01,0x49,0x80,0x00,0x01,0x49,0xce,0x00,0x01,0x4a,0x22,0x00,0x01,0x4a,0x6e,0x00,0x01,0x4b,0x0c,0x00,0x01,0x4b,0xa0,0x00,0x01,0x4c,0x3e,0x00,0x01,0x4c,0xc6,0x00,0x01,0x4d,0xa8,0x00,0x01,0x4e,0x62,0x00,0x01,0x4e,0xba,0x00,0x01,0x4f,0x12,0x00,0x01,0x4f,0x88,0x00,0x01,0x4f,0xf4,0x00,0x01,0x50,0x88, -0x00,0x01,0x51,0x12,0x00,0x01,0x51,0x2a,0x00,0x01,0x51,0x42,0x00,0x01,0x51,0x84,0x00,0x01,0x51,0xc6,0x00,0x01,0x51,0xf6,0x00,0x01,0x52,0x24,0x00,0x01,0x52,0x58,0x00,0x01,0x52,0x8c,0x00,0x01,0x52,0xc0,0x00,0x01,0x52,0xf2,0x00,0x01,0x53,0x1c,0x00,0x01,0x53,0x46,0x00,0x01,0x53,0x76,0x00,0x01,0x53,0xa6,0x00,0x01,0x53,0xda, -0x00,0x01,0x54,0x0c,0x00,0x01,0x54,0x40,0x00,0x01,0x54,0x72,0x00,0x01,0x54,0xa2,0x00,0x01,0x54,0xd0,0x00,0x01,0x55,0x00,0x00,0x01,0x55,0x2e,0x00,0x01,0x55,0x60,0x00,0x01,0x55,0x92,0x00,0x01,0x55,0xc4,0x00,0x01,0x55,0xf6,0x00,0x01,0x56,0x24,0x00,0x01,0x56,0x52,0x00,0x01,0x56,0x82,0x00,0x01,0x56,0xb0,0x00,0x01,0x56,0xe8, -0x00,0x01,0x57,0x1e,0x00,0x01,0x57,0x4e,0x00,0x01,0x57,0x7c,0x00,0x01,0x57,0xaa,0x00,0x01,0x57,0xd8,0x00,0x01,0x58,0x08,0x00,0x01,0x58,0x36,0x00,0x01,0x58,0x68,0x00,0x01,0x58,0x9c,0x00,0x01,0x58,0xce,0x00,0x01,0x59,0x00,0x00,0x01,0x59,0x16,0x00,0x01,0x59,0x2c,0x00,0x01,0x59,0x5a,0x00,0x01,0x59,0x88,0x00,0x01,0x59,0xae, -0x00,0x01,0x59,0xd4,0x00,0x01,0x5a,0x0a,0x00,0x01,0x5a,0x40,0x00,0x01,0x5a,0x70,0x00,0x01,0x5a,0x9e,0x00,0x01,0x5a,0xd2,0x00,0x01,0x5b,0x06,0x00,0x01,0x5b,0x3a,0x00,0x01,0x5b,0x6e,0x00,0x01,0x5b,0xa2,0x00,0x01,0x5b,0xd2,0x00,0x01,0x5c,0x20,0x00,0x01,0x5c,0x6a,0x00,0x01,0x5c,0x9c,0x00,0x01,0x5c,0xce,0x00,0x01,0x5c,0xfc, -0x00,0x01,0x5d,0x2a,0x00,0x01,0x5d,0x42,0x00,0x01,0x5d,0x70,0x00,0x01,0x5d,0x88,0x00,0x01,0x5d,0xb8,0x00,0x01,0x5d,0xd0,0x00,0x01,0x5d,0xf6,0x00,0x01,0x5e,0x26,0x00,0x01,0x5e,0x54,0x00,0x01,0x5e,0x7c,0x00,0x01,0x5e,0xa2,0x00,0x01,0x5e,0xda,0x00,0x01,0x5f,0x10,0x00,0x01,0x5f,0x3e,0x00,0x01,0x5f,0x6c,0x00,0x01,0x5f,0x9e, -0x00,0x01,0x5f,0xce,0x00,0x01,0x60,0x04,0x00,0x01,0x60,0x38,0x00,0x01,0x60,0x6a,0x00,0x01,0x60,0x9c,0x00,0x01,0x60,0xce,0x00,0x01,0x61,0x02,0x00,0x01,0x61,0x32,0x00,0x01,0x61,0x62,0x00,0x01,0x61,0x92,0x00,0x01,0x61,0xc2,0x00,0x01,0x61,0xe4,0x00,0x01,0x62,0x14,0x00,0x01,0x62,0x2c,0x00,0x01,0x62,0x42,0x00,0x01,0x62,0x6c, -0x00,0x01,0x62,0xac,0x00,0x01,0x62,0xd8,0x00,0x01,0x63,0x0e,0x00,0x01,0x63,0x30,0x00,0x01,0x63,0x52,0x00,0x01,0x63,0x6a,0x00,0x01,0x63,0x80,0x00,0x01,0x63,0xa4,0x00,0x01,0x63,0xc8,0x00,0x01,0x63,0xec,0x00,0x01,0x64,0x10,0x00,0x01,0x64,0x3a,0x00,0x01,0x64,0x64,0x00,0x01,0x64,0x92,0x00,0x01,0x64,0xc6,0x00,0x01,0x64,0xec, -0x00,0x01,0x65,0x10,0x00,0x01,0x65,0x46,0x00,0x01,0x65,0x7c,0x00,0x01,0x65,0xaa,0x00,0x01,0x65,0xd8,0x00,0x01,0x66,0x14,0x00,0x01,0x66,0x50,0x00,0x01,0x66,0x80,0x00,0x01,0x66,0xb0,0x00,0x01,0x66,0xe0,0x00,0x01,0x67,0x10,0x00,0x01,0x67,0x42,0x00,0x01,0x67,0x72,0x00,0x01,0x67,0xa8,0x00,0x01,0x67,0xe0,0x00,0x01,0x68,0x0e, -0x00,0x01,0x68,0x3c,0x00,0x01,0x68,0x62,0x00,0x01,0x68,0x8a,0x00,0x01,0x68,0xb8,0x00,0x01,0x68,0xe6,0x00,0x01,0x69,0x0c,0x00,0x01,0x69,0x32,0x00,0x01,0x69,0x60,0x00,0x01,0x69,0x8e,0x00,0x01,0x69,0xc0,0x00,0x01,0x69,0xf0,0x00,0x01,0x6a,0x20,0x00,0x01,0x6a,0x50,0x00,0x01,0x6a,0x7e,0x00,0x01,0x6a,0xaa,0x00,0x01,0x6a,0xd0, -0x00,0x01,0x6a,0xf6,0x00,0x01,0x6b,0x2c,0x00,0x01,0x6b,0x62,0x00,0x01,0x6b,0x98,0x00,0x01,0x6b,0xce,0x00,0x01,0x6c,0x00,0x00,0x01,0x6c,0x34,0x00,0x01,0x6c,0x62,0x00,0x01,0x6c,0x92,0x00,0x01,0x6c,0xbe,0x00,0x01,0x6c,0xec,0x00,0x01,0x6d,0x1e,0x00,0x01,0x6d,0x50,0x00,0x01,0x6d,0x80,0x00,0x01,0x6d,0xb2,0x00,0x01,0x6d,0xe4, -0x00,0x01,0x6e,0x16,0x00,0x01,0x6e,0x46,0x00,0x01,0x6e,0x76,0x00,0x01,0x6e,0xac,0x00,0x01,0x6e,0xe2,0x00,0x01,0x6f,0x18,0x00,0x01,0x6f,0x4e,0x00,0x01,0x6f,0x84,0x00,0x01,0x6f,0xba,0x00,0x01,0x6f,0xe6,0x00,0x01,0x70,0x12,0x00,0x01,0x70,0x42,0x00,0x01,0x70,0x74,0x00,0x01,0x70,0xa4,0x00,0x01,0x70,0xd4,0x00,0x01,0x71,0x06, -0x00,0x01,0x71,0x38,0x00,0x01,0x71,0x6e,0x00,0x01,0x71,0xa4,0x00,0x01,0x71,0xda,0x00,0x01,0x72,0x10,0x00,0x01,0x72,0x3c,0x00,0x01,0x72,0x6a,0x00,0x01,0x72,0x9c,0x00,0x01,0x72,0xce,0x00,0x01,0x72,0xfe,0x00,0x01,0x73,0x2e,0x00,0x01,0x73,0x60,0x00,0x01,0x73,0x92,0x00,0x01,0x73,0xc4,0x00,0x01,0x73,0xf6,0x00,0x01,0x74,0x2c, -0x00,0x01,0x74,0x62,0x00,0x01,0x74,0x98,0x00,0x01,0x74,0xce,0x00,0x01,0x75,0x04,0x00,0x01,0x75,0x3a,0x00,0x01,0x75,0x6a,0x00,0x01,0x75,0x9a,0x00,0x01,0x75,0xce,0x00,0x01,0x76,0x02,0x00,0x01,0x76,0x36,0x00,0x01,0x76,0x6a,0x00,0x01,0x76,0x9e,0x00,0x01,0x76,0xd2,0x00,0x01,0x76,0xf6,0x00,0x01,0x77,0x1a,0x00,0x01,0x77,0x40, -0x00,0x01,0x77,0x66,0x00,0x01,0x77,0x8c,0x00,0x01,0x77,0xb2,0x00,0x01,0x77,0xd8,0x00,0x01,0x77,0xfe,0x00,0x01,0x78,0x2a,0x00,0x01,0x78,0x58,0x00,0x01,0x78,0x8a,0x00,0x01,0x78,0xbc,0x00,0x01,0x78,0xec,0x00,0x01,0x79,0x1e,0x00,0x01,0x79,0x4e,0x00,0x01,0x79,0x7e,0x00,0x01,0x79,0xb4,0x00,0x01,0x79,0xea,0x00,0x01,0x7a,0x20, -0x00,0x01,0x7a,0x54,0x00,0x01,0x7a,0x82,0x00,0x01,0x7a,0xb0,0x00,0x01,0x7a,0xe2,0x00,0x01,0x7b,0x14,0x00,0x01,0x7b,0x46,0x00,0x01,0x7b,0x78,0x00,0x01,0x7b,0xaa,0x00,0x01,0x7b,0xdc,0x00,0x01,0x7c,0x0e,0x00,0x01,0x7c,0x44,0x00,0x01,0x7c,0x7a,0x00,0x01,0x7c,0xb0,0x00,0x01,0x7c,0xde,0x00,0x01,0x7d,0x0e,0x00,0x01,0x7d,0x42, -0x00,0x01,0x7d,0x76,0x00,0x01,0x7d,0xa8,0x00,0x01,0x7d,0xda,0x00,0x01,0x7e,0x0e,0x00,0x01,0x7e,0x42,0x00,0x01,0x7e,0x74,0x00,0x01,0x7e,0xa6,0x00,0x01,0x7e,0xdc,0x00,0x01,0x7f,0x12,0x00,0x01,0x7f,0x48,0x00,0x01,0x7f,0x7c,0x00,0x01,0x7f,0xb0,0x00,0x01,0x7f,0xe4,0x00,0x01,0x80,0x12,0x00,0x01,0x80,0x3e,0x00,0x01,0x80,0x6c, -0x00,0x01,0x80,0x98,0x00,0x01,0x80,0xc6,0x00,0x01,0x80,0xf2,0x00,0x01,0x81,0x22,0x00,0x01,0x81,0x52,0x00,0x01,0x81,0x80,0x00,0x01,0x81,0xac,0x00,0x01,0x81,0xda,0x00,0x01,0x82,0x08,0x00,0x01,0x82,0x38,0x00,0x01,0x82,0x66,0x00,0x01,0x82,0xa0,0x00,0x01,0x82,0xdc,0x00,0x01,0x83,0x1c,0x00,0x01,0x83,0x5c,0x00,0x01,0x83,0x9a, -0x00,0x01,0x83,0xda,0x00,0x01,0x84,0x1a,0x00,0x01,0x84,0x5a,0x00,0x01,0x84,0x9c,0x00,0x01,0x84,0xde,0x00,0x01,0x85,0x26,0x00,0x01,0x85,0x6e,0x00,0x01,0x85,0xb8,0x00,0x01,0x86,0x00,0x00,0x01,0x86,0x48,0x00,0x01,0x86,0x90,0x00,0x01,0x86,0xcc,0x00,0x01,0x87,0x0a,0x00,0x01,0x87,0x4c,0x00,0x01,0x87,0x8e,0x00,0x01,0x87,0xce, -0x00,0x01,0x88,0x0e,0x00,0x01,0x88,0x50,0x00,0x01,0x88,0x92,0x00,0x01,0x88,0xd8,0x00,0x01,0x89,0x1e,0x00,0x01,0x89,0x68,0x00,0x01,0x89,0xb2,0x00,0x01,0x89,0xfc,0x00,0x01,0x8a,0x46,0x00,0x01,0x8a,0x90,0x00,0x01,0x8a,0xda,0x00,0x01,0x8b,0x18,0x00,0x01,0x8b,0x58,0x00,0x01,0x8b,0x9c,0x00,0x01,0x8b,0xe0,0x00,0x01,0x8c,0x22, -0x00,0x01,0x8c,0x64,0x00,0x01,0x8c,0xa8,0x00,0x01,0x8c,0xec,0x00,0x01,0x8d,0x32,0x00,0x01,0x8d,0x78,0x00,0x01,0x8d,0xc2,0x00,0x01,0x8e,0x0c,0x00,0x01,0x8e,0x56,0x00,0x01,0x8e,0x9e,0x00,0x01,0x8e,0xe6,0x00,0x01,0x8f,0x2e,0x00,0x01,0x8f,0x5e,0x00,0x01,0x8f,0x8e,0x00,0x01,0x8f,0xca,0x00,0x01,0x8f,0xee,0x00,0x01,0x90,0x28, -0x00,0x01,0x90,0x56,0x00,0x01,0x90,0x92,0x00,0x01,0x90,0xc0,0x00,0x01,0x90,0xee,0x00,0x01,0x91,0x1e,0x00,0x01,0x91,0x4e,0x00,0x01,0x91,0x74,0x00,0x01,0x91,0xca,0x00,0x01,0x92,0x1c,0x00,0x01,0x92,0x78,0x00,0x01,0x92,0xc2,0x00,0x01,0x93,0x64,0x00,0x01,0x93,0xa4,0x00,0x01,0x93,0xcc,0x00,0x01,0x94,0x0a,0x00,0x01,0x94,0x36, -0x00,0x01,0x94,0x76,0x00,0x01,0x94,0xa8,0x00,0x01,0x94,0xda,0x00,0x01,0x95,0x0c,0x00,0x01,0x95,0x3e,0x00,0x01,0x95,0x64,0x00,0x01,0x95,0xd2,0x00,0x01,0x96,0x4a,0x00,0x01,0x96,0xec,0x00,0x01,0x97,0x1c,0x00,0x01,0x97,0x4c,0x00,0x01,0x97,0x84,0x00,0x01,0x97,0xbc,0x00,0x01,0x97,0xec,0x00,0x01,0x98,0x24,0x00,0x01,0x98,0x52, -0x00,0x01,0x98,0x80,0x00,0x01,0x98,0xb0,0x00,0x01,0x98,0xe0,0x00,0x01,0x99,0x54,0x00,0x01,0x99,0xca,0x00,0x01,0x9a,0x6c,0x00,0x01,0x9a,0x9c,0x00,0x01,0x9a,0xcc,0x00,0x01,0x9b,0x02,0x00,0x01,0x9b,0x38,0x00,0x01,0x9b,0x66,0x00,0x01,0x9b,0x94,0x00,0x01,0x9b,0xc2,0x00,0x01,0x9b,0xf8,0x00,0x01,0x9c,0x26,0x00,0x01,0x9c,0x54, -0x00,0x01,0x9c,0x86,0x00,0x01,0x9c,0xb8,0x00,0x01,0x9c,0xea,0x00,0x01,0x9d,0x70,0x00,0x01,0x9d,0xf8,0x00,0x01,0x9e,0x24,0x00,0x01,0x9e,0x64,0x00,0x01,0x9e,0x8a,0x00,0x01,0x9e,0xc8,0x00,0x01,0x9e,0xf6,0x00,0x01,0x9f,0x34,0x00,0x01,0x9f,0x64,0x00,0x01,0x9f,0x94,0x00,0x01,0x9f,0xc6,0x00,0x01,0x9f,0xf8,0x00,0x01,0xa0,0x1e, -0x00,0x01,0xa0,0x4c,0x00,0x01,0xa0,0xa6,0x00,0x01,0xa0,0xde,0x00,0x01,0xa1,0x3c,0x00,0x01,0xa1,0x64,0x00,0x01,0xa1,0x8c,0x00,0x01,0xa1,0xdc,0x00,0x01,0xa2,0x16,0x00,0x01,0xa2,0x7c,0x00,0x01,0xa2,0xf0,0x00,0x01,0xa3,0x46,0x00,0x01,0xa3,0x7c,0x00,0x01,0xa3,0xa4,0x00,0x01,0xa3,0xe4,0x00,0x01,0xa4,0x3c,0x00,0x01,0xa4,0xb2, -0x00,0x01,0xa4,0xfc,0x00,0x01,0xa5,0x56,0x00,0x01,0xa5,0xb2,0x00,0x01,0xa6,0x0c,0x00,0x01,0xa6,0x68,0x00,0x01,0xa6,0x9a,0x00,0x01,0xa6,0xce,0x00,0x01,0xa7,0x1a,0x00,0x01,0xa7,0x6a,0x00,0x01,0xa7,0x9e,0x00,0x01,0xa7,0xdc,0x00,0x01,0xa8,0x2e,0x00,0x01,0xa8,0x72,0x00,0x01,0xa8,0xb6,0x00,0x01,0xa9,0x16,0x00,0x01,0xa9,0x28, -0x00,0x01,0xa9,0x64,0x00,0x01,0xa9,0xa2,0x00,0x01,0xaa,0x08,0x00,0x01,0xaa,0x1a,0x00,0x01,0xaa,0x82,0x00,0x01,0xaa,0x94,0x00,0x01,0xaa,0xa6,0x00,0x01,0xaa,0xd6,0x00,0x01,0xab,0x1c,0x00,0x01,0xab,0x9e,0x00,0x01,0xab,0xdc,0x00,0x01,0xac,0x1a,0x00,0x01,0xac,0x74,0x00,0x01,0xac,0x86,0x00,0x01,0xac,0xe6,0x00,0x01,0xac,0xf8, -0x00,0x01,0xad,0x20,0x00,0x01,0xad,0x32,0x00,0x01,0xad,0x90,0x00,0x01,0xad,0xb8,0x00,0x01,0xad,0xca,0x00,0x01,0xae,0x14,0x00,0x01,0xae,0x5e,0x00,0x01,0xae,0xb2,0x00,0x01,0xae,0xfa,0x00,0x01,0xaf,0x44,0x00,0x01,0xaf,0xd2,0x00,0x01,0xb0,0x0e,0x00,0x01,0xb0,0x6e,0x00,0x01,0xb0,0xb0,0x00,0x01,0xb0,0xda,0x00,0x01,0xb1,0x06, -0x00,0x01,0xb1,0x18,0x00,0x01,0xb1,0x78,0x00,0x01,0xb2,0x00,0x00,0x01,0xb2,0x50,0x00,0x01,0xb2,0x90,0x00,0x01,0xb2,0xc8,0x00,0x01,0xb3,0x10,0x00,0x01,0xb3,0x40,0x00,0x01,0xb3,0xcc,0x00,0x01,0xb4,0x80,0x00,0x01,0xb5,0x20,0x00,0x01,0xb5,0x80,0x00,0x01,0xb5,0xb8,0x00,0x01,0xb6,0x20,0x00,0x01,0xb6,0x66,0x00,0x01,0xb6,0xaa, -0x00,0x01,0xb7,0x62,0x00,0x01,0xb8,0x2c,0x00,0x01,0xb8,0xa2,0x00,0x01,0xb9,0x3a,0x00,0x01,0xb9,0xb0,0x00,0x01,0xba,0x48,0x00,0x01,0xba,0xba,0x00,0x01,0xbb,0x6e,0x00,0x01,0xbc,0x1e,0x00,0x01,0xbc,0xb8,0x00,0x01,0xbd,0x46,0x00,0x01,0xbd,0xba,0x00,0x01,0xbe,0x50,0x00,0x01,0xbf,0x0c,0x00,0x01,0xbf,0x6e,0x00,0x01,0xc0,0x20, -0x00,0x01,0xc0,0x94,0x00,0x01,0xc1,0x76,0x00,0x01,0xc1,0xfa,0x00,0x01,0xc2,0xa4,0x00,0x01,0xc2,0xec,0x00,0x01,0xc3,0x54,0x00,0x01,0xc3,0xd4,0x00,0x01,0xc4,0x50,0x00,0x01,0xc4,0xb8,0x00,0x01,0xc5,0x8a,0x00,0x01,0xc6,0x2a,0x00,0x01,0xc6,0xb6,0x00,0x01,0xc7,0x30,0x00,0x01,0xc7,0xd8,0x00,0x01,0xc8,0x88,0x00,0x01,0xc9,0x2e, -0x00,0x01,0xc9,0xcc,0x00,0x01,0xca,0x7a,0x00,0x01,0xcb,0x16,0x00,0x01,0xcb,0xe8,0x00,0x01,0xcc,0xae,0x00,0x01,0xcd,0x1e,0x00,0x01,0xcd,0xbc,0x00,0x01,0xce,0x56,0x00,0x01,0xce,0xc0,0x00,0x01,0xcf,0x4a,0x00,0x01,0xcf,0xb8,0x00,0x01,0xd0,0x62,0x00,0x01,0xd0,0xe0,0x00,0x01,0xd1,0x5c,0x00,0x01,0xd1,0xf0,0x00,0x01,0xd2,0x92, -0x00,0x01,0xd3,0x32,0x00,0x01,0xd3,0xd0,0x00,0x01,0xd4,0x6c,0x00,0x01,0xd4,0xfe,0x00,0x01,0xd5,0xc2,0x00,0x01,0xd6,0x8a,0x00,0x01,0xd7,0x26,0x00,0x01,0xd7,0xbc,0x00,0x01,0xd8,0x5c,0x00,0x01,0xd8,0xd6,0x00,0x01,0xd9,0x00,0x00,0x01,0xd9,0x4e,0x00,0x01,0xd9,0xe4,0x00,0x01,0xd9,0xf4,0x00,0x01,0xda,0x2a,0x00,0x01,0xda,0x60, -0x00,0x01,0xda,0x96,0x00,0x01,0xda,0xbe,0x00,0x01,0xda,0xe8,0x00,0x01,0xdb,0x00,0x00,0x01,0xdb,0x28,0x00,0x01,0xdb,0x52,0x00,0x01,0xdb,0x7c,0x00,0x01,0xdb,0xac,0x00,0x01,0xdb,0xd8,0x00,0x01,0xdc,0x06,0x00,0x01,0xdc,0x34,0x00,0x01,0xdc,0x62,0x00,0x01,0xdc,0x90,0x00,0x01,0xdc,0xbe,0x00,0x01,0xdc,0xec,0x00,0x01,0xdd,0x22, -0x00,0x01,0xdd,0x56,0x00,0x01,0xdd,0x8c,0x00,0x01,0xdd,0xc0,0x00,0x01,0xdd,0xfa,0x00,0x01,0xde,0x2e,0x00,0x01,0xde,0x66,0x00,0x01,0xde,0x9a,0x00,0x01,0xdf,0x3a,0x00,0x01,0xdf,0x72,0x00,0x01,0xdf,0xa6,0x00,0x01,0xdf,0xd8,0x00,0x01,0xe0,0x08,0x00,0x01,0xe0,0x38,0x00,0x01,0xe0,0x66,0x00,0x01,0xe1,0x38,0x00,0x01,0xe2,0x3a, -0x00,0x01,0xe2,0x68,0x00,0x01,0xe2,0x96,0x00,0x01,0xe2,0xc6,0x00,0x01,0xe2,0xf6,0x00,0x01,0xe3,0xd0,0x00,0x01,0xe4,0x92,0x00,0x01,0xe4,0xc0,0x00,0x01,0xe4,0xee,0x00,0x01,0xe5,0x1e,0x00,0x01,0xe5,0x4c,0x00,0x01,0xe5,0x7a,0x00,0x01,0xe5,0xa2,0x00,0x01,0xe5,0xca,0x00,0x01,0xe5,0xf2,0x00,0x01,0xe6,0x20,0x00,0x01,0xe6,0x4e, -0x00,0x01,0xe6,0xe0,0x00,0x01,0xe7,0x62,0x00,0x01,0xe7,0x92,0x00,0x01,0xe7,0xc2,0x00,0x01,0xe7,0xf6,0x00,0x01,0xe8,0x2a,0x00,0x01,0xe8,0x58,0x00,0x01,0xe8,0x84,0x00,0x01,0xe8,0xb8,0x00,0x01,0xe8,0xec,0x00,0x01,0xe9,0x1c,0x00,0x01,0xe9,0x4a,0x00,0x01,0xe9,0x7e,0x00,0x01,0xe9,0xb2,0x00,0x01,0xe9,0xe0,0x00,0x01,0xea,0x0e, -0x00,0x01,0xea,0x42,0x00,0x01,0xea,0x76,0x00,0x01,0xea,0xa4,0x00,0x01,0xea,0xd0,0x00,0x01,0xea,0xf4,0x00,0x01,0xeb,0x28,0x00,0x01,0xeb,0x4a,0x00,0x01,0xeb,0x78,0x00,0x01,0xeb,0xac,0x00,0x01,0xeb,0xe0,0x00,0x01,0xec,0x0e,0x00,0x01,0xec,0x3a,0x00,0x01,0xed,0x02,0x00,0x01,0xed,0xc2,0x00,0x01,0xed,0xf0,0x00,0x01,0xee,0x20, -0x00,0x01,0xee,0x90,0x00,0x01,0xef,0x72,0x00,0x01,0xf0,0x48,0x00,0x01,0xf0,0xb8,0x00,0x01,0xf1,0x2c,0x00,0x01,0xf1,0x5a,0x00,0x01,0xf1,0x88,0x00,0x01,0xf1,0xbe,0x00,0x01,0xf1,0xf2,0x00,0x01,0xf2,0x24,0x00,0x01,0xf2,0x54,0x00,0x01,0xf2,0x82,0x00,0x01,0xf2,0xb0,0x00,0x01,0xf2,0xe2,0x00,0x01,0xf3,0x12,0x00,0x01,0xf3,0x40, -0x00,0x01,0xf3,0x6e,0x00,0x01,0xf3,0xfa,0x00,0x01,0xf4,0x5a,0x00,0x01,0xf4,0xf6,0x00,0x01,0xf5,0x88,0x00,0x01,0xf6,0x10,0x00,0x01,0xf6,0xbe,0x00,0x01,0xf7,0x62,0x00,0x01,0xf8,0x06,0x00,0x01,0xf8,0xb4,0x00,0x01,0xf9,0x20,0x00,0x01,0xf9,0xea,0x00,0x01,0xfa,0x98,0x00,0x01,0xfb,0x46,0x00,0x01,0xfb,0xe6,0x00,0x01,0xfc,0xda, -0x00,0x01,0xfd,0x82,0x00,0x01,0xfe,0x2c,0x00,0x01,0xff,0x1e,0x00,0x01,0xff,0xce,0x00,0x02,0x00,0x5c,0x00,0x02,0x01,0x30,0x00,0x02,0x01,0x40,0x00,0x02,0x01,0xd4,0x00,0x02,0x02,0x46,0x00,0x02,0x02,0xdc,0x00,0x02,0x03,0x42,0x00,0x02,0x03,0xca,0x00,0x02,0x04,0x76,0x00,0x02,0x05,0x16,0x00,0x02,0x05,0x5e,0x00,0x02,0x05,0xbc, -0x00,0x02,0x06,0x66,0x00,0x02,0x07,0x04,0x00,0x02,0x07,0x58,0x00,0x02,0x08,0x0e,0x00,0x02,0x08,0xb2,0x00,0x02,0x09,0x5a,0x00,0x02,0x0a,0x22,0x00,0x02,0x0a,0xa8,0x00,0x02,0x0b,0x2c,0x00,0x02,0x0b,0x98,0x00,0x02,0x0c,0x2a,0x00,0x02,0x0c,0xd6,0x00,0x02,0x0d,0x8a,0x00,0x02,0x0e,0x44,0x00,0x02,0x0e,0x98,0x00,0x02,0x0e,0xec, -0x00,0x02,0x0f,0x68,0x00,0x02,0x0f,0xc2,0x00,0x02,0x10,0x3e,0x00,0x02,0x10,0x8a,0x00,0x02,0x10,0xd6,0x00,0x02,0x11,0x66,0x00,0x02,0x12,0x04,0x00,0x02,0x12,0xda,0x00,0x02,0x13,0x4c,0x00,0x02,0x13,0xf6,0x00,0x02,0x14,0x5c,0x00,0x02,0x15,0x32,0x00,0x02,0x15,0xa6,0x00,0x02,0x16,0x1a,0x00,0x02,0x16,0xc4,0x00,0x02,0x17,0x56, -0x00,0x02,0x17,0xce,0x00,0x02,0x18,0x20,0x00,0x02,0x18,0xbe,0x00,0x02,0x19,0x36,0x00,0x02,0x19,0xa4,0x00,0x02,0x1a,0x28,0x00,0x02,0x1b,0x06,0x00,0x02,0x1b,0x9c,0x00,0x02,0x1c,0xbe,0x00,0x02,0x1d,0x38,0x00,0x02,0x1d,0xba,0x00,0x02,0x1e,0x3a,0x00,0x02,0x1e,0xb0,0x00,0x02,0x1f,0x6c,0x00,0x02,0x20,0x02,0x00,0x02,0x20,0xb2, -0x00,0x02,0x21,0x80,0x00,0x02,0x21,0xe4,0x00,0x02,0x22,0xca,0x00,0x02,0x23,0x2e,0x00,0x02,0x23,0x66,0x00,0x02,0x24,0x14,0x00,0x02,0x24,0xc4,0x00,0x02,0x25,0x72,0x00,0x02,0x26,0x3a,0x00,0x02,0x27,0x50,0x00,0x02,0x28,0xca,0x00,0x02,0x29,0xa0,0x00,0x02,0x2a,0x68,0x00,0x02,0x2b,0x74,0x00,0x02,0x2c,0x4c,0x00,0x02,0x2c,0xf4, -0x00,0x02,0x2d,0x56,0x00,0x02,0x2e,0x36,0x00,0x02,0x2e,0xac,0x00,0x02,0x2f,0x56,0x00,0x02,0x30,0x5e,0x00,0x02,0x31,0x02,0x00,0x02,0x31,0x32,0x00,0x02,0x31,0x66,0x00,0x02,0x32,0x1e,0x00,0x02,0x32,0xfe,0x00,0x02,0x34,0x18,0x00,0x02,0x34,0xb6,0x00,0x02,0x35,0x4e,0x00,0x02,0x36,0x10,0x00,0x02,0x36,0xc8,0x00,0x02,0x37,0x3e, -0x00,0x02,0x37,0xa0,0x00,0x02,0x38,0x02,0x00,0x02,0x38,0xd0,0x00,0x02,0x39,0xc4,0x00,0x02,0x3a,0xa8,0x00,0x02,0x3b,0xba,0x00,0x02,0x3c,0xc8,0x00,0x02,0x3d,0x58,0x00,0x02,0x3d,0xea,0x00,0x02,0x3e,0xb2,0x00,0x02,0x40,0x00,0x00,0x02,0x40,0xd4,0x00,0x02,0x41,0xb8,0x00,0x02,0x42,0xf4,0x00,0x02,0x43,0xd0,0x00,0x02,0x44,0xce, -0x00,0x02,0x45,0xd2,0x00,0x02,0x46,0x4c,0x00,0x02,0x46,0xd6,0x00,0x02,0x47,0xba,0x00,0x02,0x48,0x70,0x00,0x02,0x48,0x80,0x00,0x02,0x48,0x90,0x00,0x02,0x48,0xa0,0x00,0x02,0x49,0x1c,0x00,0x02,0x49,0x96,0x00,0x02,0x4a,0x52,0x00,0x02,0x4a,0xf6,0x00,0x02,0x4b,0x92,0x00,0x02,0x4c,0x2c,0x00,0x02,0x4c,0xfa,0x00,0x02,0x4d,0xc8, -0x00,0x02,0x4e,0x80,0x00,0x02,0x4f,0x38,0x00,0x02,0x50,0x42,0x00,0x02,0x51,0x58,0x00,0x02,0x52,0x78,0x00,0x02,0x53,0x64,0x00,0x02,0x54,0x86,0x00,0x02,0x55,0xb0,0x00,0x02,0x56,0xe0,0x00,0x02,0x58,0x0e,0x00,0x02,0x58,0xa4,0x00,0x02,0x59,0x40,0x00,0x02,0x5a,0x18,0x00,0x02,0x5a,0xee,0x00,0x02,0x5b,0x6c,0x00,0x02,0x5b,0xec, -0x00,0x02,0x5c,0x20,0x00,0x02,0x5c,0x54,0x00,0x02,0x5d,0x9c,0x00,0x02,0x5e,0xbc,0x00,0x02,0x5f,0xa4,0x00,0x02,0x60,0x72,0x00,0x02,0x61,0xbc,0x00,0x02,0x62,0xf2,0x00,0x02,0x63,0x14,0x00,0x02,0x63,0x44,0x00,0x02,0x63,0xca,0x00,0x02,0x64,0x42,0x00,0x02,0x65,0x62,0x00,0x02,0x65,0xb6,0x00,0x02,0x66,0x08,0x00,0x02,0x66,0x1a, -0x00,0x02,0x66,0x2c,0x00,0x02,0x68,0x1a,0x00,0x02,0x69,0x42,0x00,0x02,0x69,0xda,0x00,0x02,0x6a,0x6e,0x00,0x02,0x6b,0x40,0x00,0x02,0x6c,0x2e,0x00,0x02,0x6c,0xc4,0x00,0x02,0x6d,0x56,0x00,0x02,0x6e,0x58,0x00,0x02,0x6f,0x4a,0x00,0x02,0x6f,0xee,0x00,0x02,0x70,0x82,0x00,0x02,0x71,0x0c,0x00,0x02,0x71,0x8a,0x00,0x02,0x71,0xfc, -0x00,0x02,0x72,0x6e,0x00,0x02,0x73,0x12,0x00,0x02,0x73,0xb0,0x00,0x02,0x74,0xda,0x00,0x02,0x75,0xf8,0x00,0x02,0x76,0xc0,0x00,0x02,0x77,0x78,0x00,0x02,0x77,0xea,0x00,0x02,0x78,0x5c,0x00,0x02,0x78,0xe8,0x00,0x02,0x79,0x74,0x00,0x02,0x79,0xf6,0x00,0x02,0x7a,0x76,0x00,0x02,0x7b,0x4a,0x00,0x02,0x7c,0x1e,0x00,0x02,0x7c,0x34, -0x00,0x02,0x7c,0x4a,0x00,0x02,0x7c,0x5a,0x00,0x02,0x7c,0x88,0x00,0x02,0x7c,0xb6,0x00,0x02,0x7d,0x56,0x00,0x02,0x7d,0xf2,0x00,0x02,0x7e,0x84,0x00,0x02,0x7f,0x12,0x00,0x02,0x7f,0x8c,0x00,0x02,0x80,0x0a,0x00,0x02,0x80,0x2c,0x00,0x02,0x80,0x4e,0x00,0x02,0x80,0x82,0x00,0x02,0x80,0xb2,0x00,0x02,0x80,0xc2,0x00,0x02,0x80,0xd2, -0x00,0x02,0x81,0x00,0x00,0x02,0x81,0x2e,0x00,0x02,0x81,0xd0,0x00,0x02,0x81,0xe0,0x00,0x02,0x82,0x14,0x00,0x02,0x82,0x44,0x00,0x02,0x82,0x76,0x00,0x02,0x82,0xaa,0x00,0x02,0x82,0xde,0x00,0x02,0x83,0x10,0x00,0x02,0x83,0x9c,0x00,0x02,0x83,0xac,0x00,0x02,0x83,0xda,0x00,0x02,0x84,0x08,0x00,0x02,0x84,0x3a,0x00,0x02,0x84,0x6c, -0x00,0x02,0x84,0x9e,0x00,0x02,0x84,0xd0,0x00,0x02,0x85,0x02,0x00,0x02,0x85,0x34,0x00,0x02,0x85,0x68,0x00,0x02,0x85,0x9a,0x00,0x02,0x85,0xc8,0x00,0x02,0x85,0xf6,0x00,0x02,0x86,0x28,0x00,0x02,0x86,0x58,0x00,0x02,0x86,0x8a,0x00,0x02,0x86,0xbc,0x00,0x02,0x86,0xee,0x00,0x02,0x87,0x22,0x00,0x02,0x87,0x54,0x00,0x02,0x87,0x88, -0x00,0x02,0x87,0xee,0x00,0x02,0x87,0xfe,0x00,0x02,0x88,0xa6,0x00,0x02,0x89,0x5c,0x00,0x02,0x8a,0x18,0x00,0x02,0x8a,0xcc,0x00,0x02,0x8b,0x7a,0x00,0x02,0x8c,0x22,0x00,0x02,0x8c,0xba,0x00,0x02,0x8d,0x5a,0x00,0x02,0x8d,0xea,0x00,0x02,0x8e,0x7c,0x00,0x02,0x8f,0x20,0x00,0x02,0x8f,0xb8,0x00,0x02,0x90,0x38,0x00,0x02,0x90,0xb6, -0x00,0x02,0x91,0x46,0x00,0x02,0x92,0x10,0x00,0x02,0x92,0xb0,0x00,0x02,0x93,0x1e,0x00,0x02,0x93,0xa6,0x00,0x02,0x94,0x08,0x00,0x02,0x94,0xc8,0x00,0x02,0x95,0x7e,0x00,0x02,0x95,0xec,0x00,0x02,0x96,0x5c,0x00,0x02,0x96,0xc6,0x00,0x02,0x97,0x34,0x00,0x02,0x97,0xc8,0x00,0x02,0x98,0x34,0x00,0x02,0x98,0xdc,0x00,0x02,0x99,0x40, -0x00,0x02,0x99,0xb8,0x00,0x02,0x9a,0x48,0x00,0x02,0x9a,0xb0,0x00,0x02,0x9a,0xda,0x00,0x02,0x9b,0x16,0x00,0x02,0x9b,0x66,0x00,0x02,0x9b,0xd8,0x00,0x02,0x9c,0x74,0x00,0x02,0x9c,0xec,0x00,0x02,0x9d,0x4e,0x00,0x02,0x9d,0xb2,0x00,0x02,0x9e,0x36,0x00,0x02,0x9e,0xd0,0x00,0x02,0x9f,0x4c,0x00,0x02,0x9f,0xbe,0x00,0x02,0x9f,0xf4, -0x00,0x02,0xa0,0x48,0x00,0x02,0xa0,0x7c,0x00,0x02,0xa0,0x8c,0x00,0x02,0xa0,0xbe,0x00,0x02,0xa1,0x0a,0x00,0x02,0xa1,0x56,0x00,0x02,0xa1,0xca,0x00,0x02,0xa2,0x40,0x00,0x02,0xa2,0x9e,0x00,0x02,0xa2,0xfc,0x00,0x02,0xa3,0x46,0x00,0x02,0xa3,0x94,0x00,0x02,0xa3,0xc0,0x00,0x02,0xa3,0xd0,0x00,0x02,0xa3,0xe0,0x00,0x02,0xa4,0x10, -0x00,0x02,0xa4,0x3e,0x00,0x02,0xa4,0x50,0x00,0x02,0xa4,0x62,0x00,0x02,0xa4,0xaa,0x00,0x02,0xa4,0xda,0x00,0x02,0xa4,0xec,0x00,0x02,0xa4,0xfe,0x00,0x02,0xa5,0x42,0x00,0x02,0xa5,0x84,0x00,0x02,0xa5,0xd6,0x00,0x02,0xa6,0x02,0x00,0x02,0xa6,0x70,0x00,0x02,0xa6,0xee,0x00,0x02,0xa7,0x96,0x00,0x02,0xa7,0xc6,0x00,0x02,0xa8,0x7a, -0x00,0x02,0xa8,0xdc,0x00,0x02,0xa8,0xec,0x00,0x02,0xa9,0x24,0x00,0x02,0xa9,0x66,0x00,0x02,0xa9,0xa8,0x00,0x02,0xa9,0xea,0x00,0x02,0xaa,0x22,0x00,0x02,0xaa,0x52,0x00,0x02,0xaa,0x92,0x00,0x02,0xaa,0xd2,0x00,0x02,0xab,0x1c,0x00,0x02,0xab,0x7a,0x00,0x02,0xab,0xe4,0x00,0x02,0xac,0x3e,0x00,0x02,0xac,0xb6,0x00,0x02,0xad,0x3c, -0x00,0x02,0xad,0xac,0x00,0x02,0xae,0x0e,0x00,0x02,0xae,0x94,0x00,0x02,0xae,0xf4,0x00,0x02,0xaf,0x5e,0x00,0x02,0xaf,0xd2,0x00,0x02,0xb0,0x42,0x00,0x02,0xb0,0xa0,0x00,0x02,0xb1,0x46,0x00,0x02,0xb1,0xde,0x00,0x02,0xb2,0x4a,0x00,0x02,0xb2,0xd8,0x00,0x02,0xb3,0x32,0x00,0x02,0xb3,0xa0,0x00,0x02,0xb4,0x4a,0x00,0x02,0xb4,0xf0, -0x00,0x02,0xb5,0x86,0x00,0x02,0xb5,0xf6,0x00,0x02,0xb6,0x78,0x00,0x02,0xb6,0xdc,0x00,0x02,0xb7,0x88,0x00,0x02,0xb8,0x46,0x00,0x02,0xb8,0xf2,0x00,0x02,0xb9,0x84,0x00,0x02,0xb9,0xe2,0x00,0x02,0xba,0x4e,0x00,0x02,0xba,0xa4,0x00,0x02,0xbb,0x26,0x00,0x02,0xbb,0xa4,0x00,0x02,0xbc,0x2a,0x00,0x02,0xbc,0xb6,0x00,0x02,0xbd,0x10, -0x00,0x02,0xbd,0x7c,0x00,0x02,0xbd,0xec,0x00,0x02,0xbe,0x5a,0x00,0x02,0xbe,0xca,0x00,0x02,0xbf,0x4e,0x00,0x02,0xbf,0xde,0x00,0x02,0xc0,0x44,0x00,0x02,0xc0,0xbe,0x00,0x02,0xc1,0x3a,0x00,0x02,0xc1,0xb2,0x00,0x02,0xc2,0x58,0x00,0x02,0xc2,0xf0,0x00,0x02,0xc3,0x80,0x00,0x02,0xc3,0xde,0x00,0x02,0xc4,0x7c,0x00,0x02,0xc4,0xf8, -0x00,0x02,0xc5,0x8a,0x00,0x02,0xc6,0x2e,0x00,0x02,0xc6,0xd8,0x00,0x02,0xc7,0x70,0x00,0x02,0xc7,0xcc,0x00,0x02,0xc8,0x20,0x00,0x02,0xc8,0x88,0x00,0x02,0xc9,0x2e,0x00,0x02,0xc9,0xd8,0x00,0x02,0xca,0xa2,0x00,0x02,0xcb,0x48,0x00,0x02,0xcb,0xaa,0x00,0x02,0xcc,0x0a,0x00,0x02,0xcc,0x98,0x00,0x02,0xcd,0x1e,0x00,0x02,0xcd,0xac, -0x00,0x02,0xce,0x0c,0x00,0x02,0xce,0x70,0x00,0x02,0xce,0xda,0x00,0x02,0xcf,0x42,0x00,0x02,0xcf,0xaa,0x00,0x02,0xd0,0x22,0x00,0x02,0xd0,0xaa,0x00,0x02,0xd1,0x3e,0x00,0x02,0xd1,0xaa,0x00,0x02,0xd2,0x12,0x00,0x02,0xd2,0x76,0x00,0x02,0xd3,0x22,0x00,0x02,0xd3,0xe2,0x00,0x02,0xd4,0x90,0x00,0x02,0xd5,0x1e,0x00,0x02,0xd5,0x7c, -0x00,0x02,0xd5,0xe8,0x00,0x02,0xd6,0x58,0x00,0x02,0xd6,0xfc,0x00,0x02,0xd7,0xa2,0x00,0x02,0xd8,0x66,0x00,0x02,0xd9,0x08,0x00,0x02,0xd9,0x6c,0x00,0x02,0xd9,0xfc,0x00,0x02,0xda,0x6e,0x00,0x02,0xdb,0x06,0x00,0x02,0xdb,0x84,0x00,0x02,0xdb,0xfe,0x00,0x02,0xdc,0x6a,0x00,0x02,0xdc,0xf8,0x00,0x02,0xdd,0x54,0x00,0x02,0xdd,0xb2, -0x00,0x02,0xde,0x38,0x00,0x02,0xde,0xb4,0x00,0x02,0xdf,0x1c,0x00,0x02,0xdf,0x80,0x00,0x02,0xdf,0xd4,0x00,0x02,0xe0,0x42,0x00,0x02,0xe0,0xaa,0x00,0x02,0xe1,0x28,0x00,0x02,0xe1,0x9e,0x00,0x02,0xe2,0x18,0x00,0x02,0xe2,0x98,0x00,0x02,0xe2,0xf4,0x00,0x02,0xe3,0x5a,0x00,0x02,0xe3,0xbe,0x00,0x02,0xe4,0x5e,0x00,0x02,0xe5,0x00, -0x00,0x02,0xe5,0xbe,0x00,0x02,0xe6,0x6e,0x00,0x02,0xe6,0xca,0x00,0x02,0xe7,0x42,0x00,0x02,0xe7,0xa0,0x00,0x02,0xe8,0x2a,0x00,0x02,0xe8,0xc2,0x00,0x02,0xe9,0x50,0x00,0x02,0xe9,0xb6,0x00,0x02,0xea,0x14,0x00,0x02,0xea,0xa2,0x00,0x02,0xeb,0x14,0x00,0x02,0xeb,0xae,0x00,0x02,0xec,0x42,0x00,0x02,0xec,0xb2,0x00,0x02,0xed,0x22, -0x00,0x02,0xed,0x9a,0x00,0x02,0xed,0xf8,0x00,0x02,0xee,0x58,0x00,0x02,0xee,0xd2,0x00,0x02,0xef,0x2c,0x00,0x02,0xef,0x8c,0x00,0x02,0xef,0xe6,0x00,0x02,0xf0,0x42,0x00,0x02,0xf0,0xaa,0x00,0x02,0xf0,0xaa,0x00,0x02,0xf0,0xfa,0x00,0x02,0xf1,0x4e,0x00,0x02,0xf1,0xa0,0x00,0x02,0xf1,0xf0,0x00,0x02,0xf3,0xf0,0x00,0x02,0xf5,0x5c, -0x00,0x02,0xf7,0x10,0x00,0x02,0xf8,0xba,0x00,0x02,0xf9,0x3e,0x00,0x02,0xf9,0xde,0x00,0x02,0xfa,0x1a,0x00,0x02,0xfa,0x56,0x00,0x02,0xfa,0x8c,0x00,0x02,0xfa,0xc2,0x00,0x02,0xfb,0x3c,0x00,0x02,0xfb,0x4e,0x00,0x02,0xfb,0x60,0x00,0x02,0xfb,0x72,0x00,0x02,0xfb,0x84,0x00,0x02,0xfb,0x96,0x00,0x02,0xfb,0xd2,0x00,0x02,0xfc,0x0a, -0x00,0x02,0xfc,0x44,0x00,0x02,0xfc,0x7c,0x00,0x02,0xfc,0xd2,0x00,0x02,0xfd,0x1a,0x00,0x02,0xfd,0x92,0x00,0x02,0xfd,0xd0,0x00,0x02,0xfe,0x1a,0x00,0x02,0xfe,0x9a,0x00,0x02,0xff,0x72,0x00,0x02,0xff,0x84,0x00,0x02,0xff,0x96,0x00,0x03,0x00,0x08,0x00,0x03,0x00,0x54,0x00,0x03,0x00,0xa8,0x00,0x03,0x00,0xdc,0x00,0x03,0x01,0x10, -0x00,0x03,0x01,0x20,0x00,0x03,0x01,0x30,0x00,0x03,0x01,0xb0,0x00,0x03,0x02,0x5c,0x00,0x03,0x03,0x6e,0x00,0x03,0x04,0x24,0x00,0x03,0x04,0x34,0x00,0x03,0x04,0x90,0x00,0x03,0x05,0x1e,0x00,0x03,0x05,0x80,0x00,0x03,0x06,0x20,0x00,0x03,0x06,0x7c,0x00,0x03,0x06,0xc6,0x00,0x03,0x06,0xd6,0x00,0x03,0x07,0x50,0x00,0x03,0x07,0x60, -0x00,0x03,0x07,0x70,0x00,0x03,0x07,0x80,0x00,0x03,0x07,0xfa,0x00,0x03,0x08,0x6e,0x00,0x03,0x08,0xde,0x00,0x03,0x09,0xd6,0x00,0x03,0x0a,0xc6,0x00,0x03,0x0b,0x84,0x00,0x03,0x0b,0xd6,0x00,0x03,0x0c,0x28,0x00,0x03,0x0c,0x8e,0x00,0x03,0x0d,0x20,0x00,0x03,0x0d,0xac,0x00,0x03,0x0d,0xbc,0x00,0x03,0x0e,0x10,0x00,0x03,0x0e,0x76, -0x00,0x03,0x0f,0x3e,0x00,0x03,0x0f,0xda,0x00,0x03,0x0f,0xea,0x00,0x03,0x0f,0xfa,0x00,0x03,0x10,0x0a,0x00,0x03,0x10,0x94,0x00,0x03,0x11,0x44,0x00,0x03,0x11,0xd4,0x00,0x03,0x11,0xe4,0x00,0x03,0x12,0x30,0x00,0x03,0x12,0x40,0x00,0x03,0x12,0x50,0x00,0x03,0x12,0xe6,0x00,0x03,0x13,0x4e,0x00,0x03,0x13,0xe0,0x00,0x03,0x14,0xa2, -0x00,0x03,0x15,0x4c,0x00,0x03,0x16,0x12,0x00,0x03,0x16,0x7c,0x00,0x03,0x16,0xf0,0x00,0x03,0x17,0x62,0x00,0x03,0x18,0x00,0x00,0x03,0x18,0x7a,0x00,0x03,0x18,0xaa,0x00,0x03,0x18,0xfc,0x00,0x03,0x19,0x5e,0x00,0x03,0x19,0xa2,0x00,0x03,0x1a,0x28,0x00,0x03,0x1a,0x96,0x00,0x03,0x1b,0x04,0x00,0x03,0x1b,0x7e,0x00,0x03,0x1c,0x4c, -0x00,0x03,0x1c,0xbc,0x00,0x03,0x1d,0x50,0x00,0x03,0x1d,0xa2,0x00,0x03,0x1e,0x02,0x00,0x03,0x1e,0x7c,0x00,0x03,0x1f,0x36,0x00,0x03,0x1f,0xf0,0x00,0x03,0x20,0x84,0x00,0x03,0x21,0xb8,0x00,0x03,0x22,0x4c,0x00,0x03,0x22,0xe2,0x00,0x03,0x23,0x7c,0x00,0x03,0x24,0x12,0x00,0x03,0x24,0xc4,0x00,0x03,0x25,0x6e,0x00,0x03,0x26,0x24, -0x00,0x03,0x26,0x74,0x00,0x03,0x26,0xd6,0x00,0x03,0x27,0x86,0x00,0x03,0x28,0x14,0x00,0x03,0x28,0x8e,0x00,0x03,0x29,0x00,0x00,0x03,0x29,0x58,0x00,0x03,0x29,0xb0,0x00,0x03,0x2a,0x42,0x00,0x03,0x2a,0xc4,0x00,0x03,0x2b,0x34,0x00,0x03,0x2b,0x9e,0x00,0x03,0x2c,0x5c,0x00,0x03,0x2c,0xac,0x00,0x03,0x2d,0x4c,0x00,0x03,0x2e,0x1c, -0x00,0x03,0x2e,0x96,0x00,0x03,0x2f,0x46,0x00,0x03,0x30,0x04,0x00,0x03,0x30,0xa0,0x00,0x03,0x30,0xb2,0x00,0x03,0x30,0xc4,0x00,0x03,0x30,0xd6,0x00,0x03,0x30,0xe8,0x00,0x03,0x30,0xfa,0x00,0x03,0x31,0x0c,0x00,0x03,0x31,0x1e,0x00,0x03,0x31,0x30,0x00,0x03,0x31,0x42,0x00,0x03,0x31,0x8a,0x00,0x03,0x31,0xdc,0x00,0x03,0x32,0x5c, -0x00,0x03,0x32,0xb4,0x00,0x03,0x34,0x10,0x00,0x03,0x34,0xde,0x00,0x03,0x36,0x48,0x00,0x03,0x37,0x56,0x00,0x03,0x38,0x70,0x00,0x03,0x39,0xa2,0x00,0x03,0x3b,0x12,0x00,0x03,0x3d,0x2e,0x00,0x03,0x3d,0xe0,0x00,0x03,0x3e,0xd2,0x00,0x03,0x3f,0x6e,0x00,0x03,0x40,0x32,0x00,0x03,0x42,0x44,0x00,0x03,0x43,0x82,0x00,0x03,0x44,0x9e, -0x00,0x03,0x45,0xc8,0x00,0x03,0x46,0xb0,0x00,0x03,0x47,0x98,0x00,0x03,0x47,0xd0,0x00,0x03,0x47,0xe6,0x00,0x03,0x47,0xfc,0x00,0x03,0x48,0x14,0x00,0x03,0x48,0x2c,0x00,0x03,0x48,0x42,0x00,0x03,0x49,0x44,0x00,0x03,0x49,0xbe,0x00,0x03,0x4a,0x3a,0x00,0x03,0x4a,0x4a,0x00,0x03,0x4a,0x90,0x00,0x03,0x4b,0x58,0x00,0x03,0x4b,0x92, -0x00,0x03,0x4b,0xa4,0x00,0x03,0x4b,0xce,0x00,0x03,0x4c,0x4c,0x00,0x03,0x4c,0x7c,0x00,0x03,0x4c,0xac,0x00,0x03,0x4c,0xfe,0x00,0x03,0x4d,0x50,0x00,0x03,0x4d,0x7a,0x00,0x03,0x4d,0xa6,0x00,0x03,0x4d,0xca,0x00,0x03,0x4f,0x2c,0x00,0x03,0x50,0x20,0x00,0x03,0x50,0x4c,0x00,0x03,0x50,0x78,0x00,0x03,0x50,0xa4,0x00,0x03,0x50,0xba, -0x00,0x03,0x50,0xe8,0x00,0x03,0x51,0x16,0x00,0x03,0x51,0xcc,0x00,0x03,0x52,0x38,0x00,0x03,0x53,0x38,0x00,0x03,0x53,0x56,0x00,0x03,0x53,0x7e,0x00,0x03,0x53,0xae,0x00,0x03,0x53,0xde,0x00,0x03,0x54,0xb0,0x00,0x03,0x55,0x42,0x00,0x03,0x56,0x1c,0x00,0x03,0x56,0x34,0x00,0x03,0x56,0x58,0x00,0x03,0x56,0x7c,0x00,0x03,0x56,0xba, -0x00,0x03,0x56,0xde,0x00,0x03,0x57,0x02,0x00,0x03,0x57,0x26,0x00,0x03,0x57,0x4a,0x00,0x03,0x57,0x62,0x00,0x03,0x57,0x86,0x00,0x03,0x57,0xba,0x00,0x03,0x57,0xf8,0x00,0x03,0x58,0x2c,0x00,0x03,0x58,0x50,0x00,0x03,0x58,0x74,0x00,0x03,0x58,0x98,0x00,0x03,0x58,0xbc,0x00,0x03,0x58,0xe0,0x00,0x03,0x59,0x04,0x00,0x03,0x59,0x28, -0x00,0x03,0x59,0x4c,0x00,0x03,0x59,0x80,0x00,0x03,0x59,0xa4,0x00,0x03,0x59,0xc8,0x00,0x03,0x5a,0x4e,0x00,0x03,0x5a,0x72,0x00,0x03,0x5b,0x30,0x00,0x03,0x5b,0xca,0x00,0x03,0x5c,0x42,0x00,0x03,0x5d,0x0e,0x00,0x03,0x5d,0xec,0x00,0x03,0x5e,0x96,0x00,0x03,0x5f,0x0a,0x00,0x03,0x5f,0x92,0x00,0x03,0x5f,0xa2,0x00,0x03,0x60,0x0e, -0x00,0x03,0x60,0x94,0x00,0x03,0x60,0xe0,0x00,0x03,0x61,0x3a,0x00,0x03,0x61,0xba,0x00,0x03,0x62,0x74,0x00,0x03,0x62,0xbc,0x00,0x03,0x63,0x28,0x00,0x03,0x63,0x6a,0x00,0x03,0x64,0x3c,0x00,0x03,0x64,0xea,0x00,0x03,0x65,0x74,0x00,0x03,0x66,0x00,0x00,0x03,0x66,0x6c,0x00,0x03,0x67,0x10,0x00,0x03,0x67,0xe6,0x00,0x03,0x68,0xae, -0x00,0x03,0x69,0x20,0x00,0x03,0x69,0xc6,0x00,0x03,0x6a,0x72,0x00,0x03,0x6b,0x10,0x00,0x03,0x6b,0x6a,0x00,0x03,0x6b,0xe4,0x00,0x03,0x6c,0x30,0x00,0x03,0x6c,0x92,0x00,0x03,0x6d,0x26,0x00,0x03,0x6d,0xda,0x00,0x03,0x6e,0x74,0x00,0x03,0x6f,0x0a,0x00,0x03,0x6f,0x8e,0x00,0x03,0x70,0x12,0x00,0x03,0x70,0xd6,0x00,0x03,0x71,0x3c, -0x00,0x03,0x71,0x66,0x00,0x03,0x71,0x78,0x00,0x03,0x71,0x8a,0x00,0x03,0x71,0x9c,0x00,0x03,0x71,0xae,0x00,0x03,0x71,0xc0,0x00,0x03,0x72,0x78,0x00,0x03,0x73,0x84,0x00,0x03,0x74,0xd6,0x00,0x03,0x75,0x98,0x00,0x03,0x75,0xe6,0x00,0x03,0x76,0x26,0x00,0x03,0x76,0x64,0x00,0x03,0x76,0xa2,0x00,0x03,0x76,0xe0,0x00,0x03,0x77,0x42, -0x00,0x03,0x77,0x6a,0x00,0x03,0x77,0xb6,0x00,0x03,0x77,0xe8,0x00,0x03,0x78,0x1a,0x00,0x03,0x78,0x4c,0x00,0x03,0x78,0x7e,0x00,0x03,0x78,0xbc,0x00,0x03,0x78,0xfa,0x00,0x03,0x79,0x38,0x00,0x03,0x79,0x76,0x00,0x03,0x79,0xa8,0x00,0x03,0x79,0xda,0x00,0x03,0x7a,0x0c,0x00,0x03,0x7a,0x3e,0x00,0x03,0x7a,0x7c,0x00,0x03,0x7a,0xba, -0x00,0x03,0x7a,0xf8,0x00,0x03,0x7b,0x36,0x00,0x03,0x7b,0x68,0x00,0x03,0x7b,0x9a,0x00,0x03,0x7b,0xcc,0x00,0x03,0x7b,0xfe,0x00,0x03,0x7c,0x3c,0x00,0x03,0x7c,0x7a,0x00,0x03,0x7c,0xb8,0x00,0x03,0x7c,0xf6,0x00,0x03,0x7d,0x4a,0x00,0x03,0x7d,0x9e,0x00,0x03,0x7d,0xfc,0x00,0x03,0x7e,0x5a,0x00,0x03,0x7e,0xb0,0x00,0x03,0x7f,0x06, -0x00,0x03,0x7f,0x62,0x00,0x03,0x7f,0xbe,0x00,0x03,0x80,0x70,0x00,0x03,0x81,0x08,0x00,0x03,0x81,0xfa,0x00,0x03,0x83,0x00,0x00,0x03,0x83,0xe8,0x00,0x03,0x84,0xea,0x00,0x03,0x85,0xe4,0x00,0x03,0x86,0x8c,0x00,0x03,0x88,0x02,0x00,0x03,0x88,0xfc,0x00,0x03,0x89,0xec,0x00,0x03,0x8a,0x50,0x00,0x03,0x8b,0x26,0x00,0x03,0x8c,0x02, -0x00,0x03,0x8c,0x46,0x00,0x03,0x8c,0x7c,0x00,0x03,0x8c,0xc4,0x00,0x03,0x8d,0x0a,0x00,0x03,0x8d,0x50,0x00,0x03,0x8d,0xa6,0x00,0x03,0x8d,0xb8,0x00,0x03,0x8d,0xca,0x00,0x03,0x8d,0xdc,0x00,0x03,0x8d,0xee,0x00,0x03,0x8e,0x00,0x00,0x03,0x8e,0x12,0x00,0x03,0x8e,0x24,0x00,0x03,0x8e,0x36,0x00,0x03,0x8e,0x48,0x00,0x03,0x8e,0x5a, -0x00,0x03,0x8e,0x6c,0x00,0x03,0x8e,0x7e,0x00,0x03,0x8e,0x90,0x00,0x03,0x8e,0xa2,0x00,0x03,0x8e,0xb4,0x00,0x03,0x8e,0xd6,0x00,0x03,0x8e,0xf6,0x00,0x03,0x8f,0x16,0x00,0x03,0x8f,0x36,0x00,0x03,0x8f,0x58,0x00,0x03,0x8f,0x78,0x00,0x03,0x8f,0x9a,0x00,0x03,0x8f,0xba,0x00,0x03,0x8f,0xe0,0x00,0x03,0x90,0x02,0x00,0x03,0x90,0x22, -0x00,0x03,0x90,0x42,0x00,0x03,0x90,0x64,0x00,0x03,0x90,0x84,0x00,0x03,0x90,0xa4,0x00,0x03,0x91,0x94,0x00,0x03,0x92,0x46,0x00,0x03,0x92,0xfa,0x00,0x03,0x93,0x74,0x00,0x03,0x93,0xfc,0x00,0x03,0x94,0x82,0x00,0x03,0x95,0x1a,0x00,0x03,0x95,0x9e,0x00,0x03,0x95,0xc8,0x00,0x03,0x96,0x10,0x00,0x03,0x96,0x6a,0x00,0x03,0x96,0xe2, -0x00,0x03,0x97,0x52,0x00,0x03,0x98,0x02,0x00,0x03,0x98,0x82,0x00,0x03,0x98,0xae,0x00,0x03,0x99,0x2e,0x00,0x03,0x99,0x8e,0x00,0x03,0x99,0xf0,0x00,0x03,0x9a,0x40,0x00,0x03,0x9a,0x56,0x00,0x03,0x9a,0x6c,0x00,0x03,0x9a,0x82,0x00,0x03,0x9a,0x9a,0x00,0x03,0x9a,0xb2,0x00,0x03,0x9a,0xca,0x00,0x03,0x9a,0xe2,0x00,0x03,0x9a,0xfa, -0x00,0x03,0x9b,0x98,0x00,0x03,0x9c,0xa6,0x00,0x03,0x9c,0xbe,0x00,0x03,0x9c,0xd6,0x00,0x03,0x9d,0xe8,0x00,0x03,0x9e,0x00,0x00,0x03,0x9f,0x24,0x00,0x03,0x9f,0x78,0x00,0x03,0x9f,0xca,0x00,0x03,0xa0,0x2c,0x00,0x03,0xa1,0x2a,0x00,0x03,0xa1,0xf4,0x00,0x03,0xa2,0x9e,0x00,0x03,0xa3,0x06,0x00,0x03,0xa3,0x68,0x00,0x03,0xa3,0xd6, -0x00,0x03,0xa4,0xa6,0x00,0x03,0xa4,0xbe,0x00,0x03,0xa5,0x74,0x00,0x03,0xa6,0x5e,0x00,0x03,0xa7,0x8e,0x00,0x03,0xa7,0xa6,0x00,0x03,0xa7,0xbe,0x00,0x03,0xa7,0xd6,0x00,0x03,0xa7,0xee,0x00,0x03,0xa8,0x06,0x00,0x03,0xa8,0x16,0x00,0x03,0xa8,0x2e,0x00,0x03,0xa8,0x46,0x00,0x03,0xa8,0xde,0x00,0x03,0xa9,0x44,0x00,0x03,0xaa,0x10, -0x00,0x03,0xaa,0x28,0x00,0x03,0xaa,0x38,0x00,0x03,0xab,0x76,0x00,0x03,0xac,0x34,0x00,0x03,0xac,0x4c,0x00,0x03,0xac,0x64,0x00,0x03,0xac,0x7c,0x00,0x03,0xad,0x7e,0x00,0x03,0xad,0xdc,0x00,0x03,0xae,0x00,0x00,0x03,0xae,0x18,0x00,0x03,0xae,0x30,0x00,0x03,0xae,0x40,0x00,0x03,0xae,0x50,0x00,0x03,0xae,0x60,0x00,0x03,0xae,0x7e, -0x00,0x03,0xae,0x9c,0x00,0x03,0xae,0xc6,0x00,0x03,0xae,0xea,0x00,0x03,0xaf,0x28,0x00,0x03,0xaf,0x52,0x00,0x03,0xaf,0x6a,0x00,0x03,0xb0,0x52,0x00,0x03,0xb0,0xea,0x00,0x03,0xb1,0x00,0x00,0x03,0xb1,0x16,0x00,0x03,0xb1,0x3a,0x00,0x03,0xb1,0x50,0x00,0x03,0xb1,0x68,0x00,0x03,0xb1,0x96,0x00,0x03,0xb1,0xae,0x00,0x03,0xb1,0xc6, -0x00,0x03,0xb1,0xde,0x00,0x03,0xb1,0xf6,0x00,0x03,0xb2,0x0e,0x00,0x03,0xb2,0xdc,0x00,0x03,0xb2,0xf4,0x00,0x03,0xb3,0x6a,0x00,0x03,0xb3,0x82,0x00,0x03,0xb3,0xfa,0x00,0x03,0xb4,0x12,0x00,0x03,0xb5,0x5a,0x00,0x03,0xb5,0x72,0x00,0x03,0xb6,0xb4,0x00,0x03,0xb6,0xcc,0x00,0x03,0xb7,0xa2,0x00,0x03,0xb7,0xba,0x00,0x03,0xb8,0xaa, -0x00,0x03,0xb8,0xc2,0x00,0x03,0xb8,0xfc,0x00,0x03,0xb9,0x14,0x00,0x03,0xb9,0x2c,0x00,0x03,0xba,0x64,0x00,0x03,0xba,0xe4,0x00,0x03,0xbb,0xc6,0x00,0x03,0xbb,0xde,0x00,0x03,0xbc,0x92,0x00,0x03,0xbd,0x74,0x00,0x03,0xbe,0x48,0x00,0x03,0xbe,0x60,0x00,0x03,0xbe,0xa4,0x00,0x03,0xbf,0x76,0x00,0x03,0xbf,0xba,0x00,0x03,0xbf,0xe6, -0x00,0x03,0xc0,0xae,0x00,0x03,0xc0,0xd8,0x00,0x03,0xc1,0xba,0x00,0x03,0xc2,0x42,0x00,0x03,0xc2,0x60,0x00,0x03,0xc2,0x7e,0x00,0x03,0xc2,0x8e,0x00,0x03,0xc3,0x04,0x00,0x03,0xc3,0x14,0x00,0x03,0xc3,0x24,0x00,0x03,0xc3,0x34,0x00,0x03,0xc3,0xb6,0x00,0x03,0xc4,0x84,0x00,0x03,0xc5,0x7c,0x00,0x03,0xc6,0x18,0x00,0x03,0xc6,0x9a, -0x00,0x03,0xc6,0xb2,0x00,0x03,0xc6,0xca,0x00,0x03,0xc7,0xf2,0x00,0x03,0xc9,0x62,0x00,0x03,0xc9,0x7a,0x00,0x03,0xc9,0x92,0x00,0x03,0xca,0x66,0x00,0x03,0xca,0x76,0x00,0x03,0xca,0x8e,0x00,0x03,0xca,0xa4,0x00,0x03,0xca,0xb4,0x00,0x03,0xca,0xc4,0x00,0x03,0xca,0xdc,0x00,0x03,0xca,0xf4,0x00,0x03,0xcb,0x18,0x00,0x03,0xcb,0x28, -0x00,0x03,0xcb,0x38,0x00,0x03,0xcb,0x48,0x00,0x03,0xcb,0x58,0x00,0x03,0xcc,0x3e,0x00,0x03,0xcd,0x2e,0x00,0x03,0xcd,0xea,0x00,0x03,0xcd,0xfa,0x00,0x03,0xce,0x0a,0x00,0x03,0xce,0x1a,0x00,0x03,0xce,0xc6,0x00,0x03,0xce,0xd6,0x00,0x03,0xce,0xee,0x00,0x03,0xcf,0x06,0x00,0x03,0xcf,0x1e,0x00,0x03,0xcf,0x36,0x00,0x03,0xcf,0xcc, -0x00,0x03,0xcf,0xdc,0x00,0x03,0xcf,0xf2,0x00,0x03,0xd0,0xc6,0x00,0x03,0xd0,0xea,0x00,0x03,0xd1,0x02,0x00,0x03,0xd1,0x9e,0x00,0x03,0xd2,0x2a,0x00,0x03,0xd2,0x4e,0x00,0x03,0xd2,0x66,0x00,0x03,0xd2,0x94,0x00,0x03,0xd3,0x00,0x00,0x03,0xd3,0x48,0x00,0x03,0xd3,0x60,0x00,0x03,0xd3,0x78,0x00,0x03,0xd3,0x90,0x00,0x03,0xd3,0xa0, -0x00,0x03,0xd3,0xb0,0x00,0x03,0xd5,0xda,0x00,0x03,0xd6,0x5c,0x00,0x03,0xd6,0x8c,0x00,0x03,0xd8,0x0e,0x00,0x03,0xd8,0x7e,0x00,0x03,0xd8,0x8e,0x00,0x03,0xd9,0x40,0x00,0x03,0xd9,0x50,0x00,0x03,0xd9,0x60,0x00,0x03,0xd9,0x70,0x00,0x03,0xd9,0x80,0x00,0x03,0xda,0x94,0x00,0x03,0xda,0xa4,0x00,0x03,0xdb,0x20,0x00,0x03,0xdb,0xa2, -0x00,0x03,0xdb,0xb8,0x00,0x03,0xdb,0xce,0x00,0x03,0xdb,0xf2,0x00,0x03,0xdc,0x16,0x00,0x03,0xdc,0x2c,0x00,0x03,0xdc,0x42,0x00,0x03,0xdc,0x66,0x00,0x03,0xdc,0x92,0x00,0x03,0xdc,0xaa,0x00,0x03,0xdc,0xca,0x00,0x03,0xdc,0xe2,0x00,0x03,0xdc,0xfa,0x00,0x03,0xdd,0x12,0x00,0x03,0xdd,0x2a,0x00,0x03,0xdd,0x42,0x00,0x03,0xdd,0x5a, -0x00,0x03,0xdd,0x88,0x00,0x03,0xdd,0xb6,0x00,0x03,0xdd,0xce,0x00,0x03,0xdd,0xe6,0x00,0x03,0xdd,0xfe,0x00,0x03,0xde,0x16,0x00,0x03,0xde,0x2e,0x00,0x03,0xde,0x46,0x00,0x03,0xde,0x5e,0x00,0x03,0xde,0x76,0x00,0x03,0xde,0x9a,0x00,0x03,0xde,0xb2,0x00,0x03,0xde,0xca,0x00,0x03,0xde,0xe2,0x00,0x03,0xde,0xfa,0x00,0x03,0xdf,0x12, -0x00,0x03,0xdf,0x2a,0x00,0x03,0xdf,0x50,0x00,0x03,0xdf,0x76,0x00,0x03,0xdf,0x8e,0x00,0x03,0xdf,0xa6,0x00,0x03,0xdf,0xbe,0x00,0x03,0xdf,0xd6,0x00,0x03,0xe1,0x1a,0x00,0x03,0xe2,0x80,0x00,0x03,0xe2,0x98,0x00,0x03,0xe2,0xbe,0x00,0x03,0xe2,0xd6,0x00,0x03,0xe2,0xf6,0x00,0x03,0xe3,0x0e,0x00,0x03,0xe3,0x26,0x00,0x03,0xe3,0x3e, -0x00,0x03,0xe3,0x56,0x00,0x03,0xe3,0x6e,0x00,0x03,0xe3,0x86,0x00,0x03,0xe3,0x9e,0x00,0x03,0xe3,0xb6,0x00,0x03,0xe3,0xda,0x00,0x03,0xe3,0xf8,0x00,0x03,0xe4,0x10,0x00,0x03,0xe4,0x28,0x00,0x03,0xe4,0x48,0x00,0x03,0xe4,0x68,0x00,0x03,0xe4,0x80,0x00,0x03,0xe4,0x98,0x00,0x03,0xe4,0xb8,0x00,0x03,0xe4,0xd8,0x00,0x03,0xe4,0xf0, -0x00,0x03,0xe5,0x08,0x00,0x03,0xe5,0x20,0x00,0x03,0xe5,0x38,0x00,0x03,0xe5,0x50,0x00,0x03,0xe5,0x68,0x00,0x03,0xe5,0x80,0x00,0x03,0xe5,0x98,0x00,0x03,0xe5,0xb0,0x00,0x03,0xe6,0xca,0x00,0x03,0xe6,0xe2,0x00,0x03,0xe6,0xfa,0x00,0x03,0xe7,0x12,0x00,0x03,0xe7,0x32,0x00,0x03,0xe7,0x52,0x00,0x03,0xe7,0x72,0x00,0x03,0xe7,0x8a, -0x00,0x03,0xe7,0xa2,0x00,0x03,0xe7,0xba,0x00,0x03,0xe7,0xd2,0x00,0x03,0xe7,0xea,0x00,0x03,0xe8,0x02,0x00,0x03,0xe8,0x1a,0x00,0x03,0xe8,0x32,0x00,0x03,0xe9,0x24,0x00,0x03,0xea,0x2a,0x00,0x03,0xea,0x42,0x00,0x03,0xea,0x5a,0x00,0x03,0xea,0x72,0x00,0x03,0xea,0x8a,0x00,0x03,0xea,0xa2,0x00,0x03,0xea,0xba,0x00,0x03,0xea,0xd2, -0x00,0x03,0xea,0xea,0x00,0x03,0xeb,0x0a,0x00,0x03,0xeb,0x28,0x00,0x03,0xeb,0x56,0x00,0x03,0xeb,0x82,0x00,0x03,0xeb,0xa2,0x00,0x03,0xeb,0xc0,0x00,0x03,0xeb,0xe0,0x00,0x03,0xeb,0xfe,0x00,0x03,0xec,0x34,0x00,0x03,0xec,0x68,0x00,0x03,0xec,0x80,0x00,0x03,0xec,0x98,0x00,0x03,0xec,0xb0,0x00,0x03,0xec,0xc8,0x00,0x03,0xec,0xf0, -0x00,0x03,0xed,0x18,0x00,0x03,0xed,0xfe,0x00,0x03,0xee,0x16,0x00,0x03,0xee,0x38,0x00,0x03,0xee,0x58,0x00,0x03,0xee,0x70,0x00,0x03,0xee,0x92,0x00,0x03,0xee,0xb2,0x00,0x03,0xee,0xca,0x00,0x03,0xee,0xe2,0x00,0x03,0xee,0xfa,0x00,0x03,0xef,0x12,0x00,0x03,0xef,0x32,0x00,0x03,0xef,0x48,0x00,0x03,0xf0,0x5e,0x00,0x03,0xf0,0x82, -0x00,0x03,0xf0,0xa8,0x00,0x03,0xf0,0xc0,0x00,0x03,0xf0,0xe4,0x00,0x03,0xf0,0xfc,0x00,0x03,0xf1,0x14,0x00,0x03,0xf1,0xe8,0x00,0x03,0xf2,0xfc,0x00,0x03,0xf3,0x14,0x00,0x03,0xf3,0x2c,0x00,0x03,0xf3,0x4c,0x00,0x03,0xf3,0x64,0x00,0x03,0xf3,0x7e,0x00,0x03,0xf3,0xa0,0x00,0x03,0xf3,0xba,0x00,0x03,0xf3,0xd2,0x00,0x03,0xf5,0x4e, -0x00,0x03,0xf6,0x0e,0x00,0x03,0xf6,0xd0,0x00,0x03,0xf7,0x2c,0x00,0x03,0xf8,0x42,0x00,0x03,0xf9,0xc4,0x00,0x03,0xfb,0x5e,0x00,0x03,0xfb,0xd0,0x00,0x03,0xfc,0x46,0x00,0x03,0xfc,0xc8,0x00,0x03,0xfd,0x94,0x00,0x03,0xfe,0xae,0x00,0x03,0xff,0x2c,0x00,0x03,0xff,0xf8,0x00,0x04,0x00,0x0a,0x00,0x04,0x00,0x92,0x00,0x04,0x01,0x2c, -0x00,0x04,0x02,0x62,0x00,0x04,0x02,0xb4,0x00,0x04,0x02,0xfe,0x00,0x04,0x03,0xca,0x00,0x04,0x03,0xea,0x00,0x04,0x04,0x0a,0x00,0x04,0x04,0x2a,0x00,0x04,0x04,0x4a,0x00,0x04,0x04,0x6a,0x00,0x04,0x04,0x8a,0x00,0x04,0x04,0xaa,0x00,0x04,0x04,0xca,0x00,0x04,0x04,0xe2,0x00,0x04,0x04,0xfa,0x00,0x04,0x05,0x26,0x00,0x04,0x05,0x52, -0x00,0x04,0x05,0x70,0x00,0x04,0x05,0x8e,0x00,0x04,0x05,0xae,0x00,0x04,0x05,0xce,0x00,0x04,0x05,0xee,0x00,0x04,0x06,0x0e,0x00,0x04,0x06,0x2e,0x00,0x04,0x06,0x4e,0x00,0x04,0x06,0x7e,0x00,0x04,0x06,0xae,0x00,0x04,0x06,0xce,0x00,0x04,0x06,0xee,0x00,0x04,0x07,0xb0,0x00,0x04,0x08,0x12,0x00,0x04,0x08,0x2a,0x00,0x04,0x08,0x42, -0x00,0x04,0x08,0x6e,0x00,0x04,0x08,0x8c,0x00,0x04,0x08,0xaa,0x00,0x04,0x0b,0x1c,0x00,0x04,0x0b,0x66,0x00,0x04,0x0c,0x5e,0x00,0x04,0x0c,0xf4,0x00,0x04,0x0d,0xd6,0x00,0x04,0x0e,0x96,0x00,0x04,0x0e,0xda,0x00,0x04,0x10,0x3e,0x00,0x04,0x11,0x0a,0x00,0x04,0x11,0xda,0x00,0x04,0x12,0xa4,0x00,0x04,0x13,0xdc,0x00,0x04,0x14,0x86, -0x00,0x04,0x14,0xb6,0x00,0x04,0x15,0x7c,0x00,0x04,0x15,0xfe,0x00,0x04,0x16,0x28,0x00,0x04,0x16,0x4c,0x00,0x04,0x16,0x70,0x00,0x04,0x16,0x88,0x00,0x04,0x16,0xa0,0x00,0x04,0x16,0xb8,0x00,0x04,0x16,0xdc,0x00,0x04,0x17,0x00,0x00,0x04,0x17,0x24,0x00,0x04,0x18,0x08,0x00,0x04,0x18,0xa0,0x00,0x04,0x19,0x52,0x00,0x04,0x19,0x6a, -0x00,0x04,0x19,0x82,0x00,0x04,0x19,0xaa,0x00,0x04,0x19,0xc2,0x00,0x04,0x19,0xda,0x00,0x04,0x1b,0x8a,0x00,0x04,0x1c,0x82,0x00,0x04,0x1e,0x16,0x00,0x04,0x1f,0x10,0x00,0x04,0x20,0xae,0x00,0x04,0x21,0xbc,0x00,0x04,0x22,0xd0,0x00,0x04,0x23,0x76,0x00,0x04,0x23,0xa6,0x00,0x04,0x23,0xe0,0x00,0x04,0x24,0x1a,0x00,0x04,0x24,0x5c, -0x00,0x04,0x25,0x26,0x00,0x04,0x25,0x90,0x00,0x04,0x25,0xa8,0x00,0x04,0x25,0xc0,0x00,0x04,0x25,0xe0,0x00,0x04,0x26,0x00,0x00,0x04,0x26,0x18,0x00,0x04,0x26,0x30,0x00,0x04,0x26,0x50,0x00,0x04,0x26,0x70,0x00,0x04,0x26,0x90,0x00,0x04,0x26,0xb0,0x00,0x04,0x26,0xd4,0x00,0x04,0x26,0xf8,0x00,0x04,0x27,0x10,0x00,0x04,0x27,0x28, -0x00,0x04,0x27,0x40,0x00,0x04,0x27,0x58,0x00,0x04,0x27,0x70,0x00,0x04,0x28,0x98,0x00,0x04,0x29,0xfc,0x00,0x04,0x2a,0x14,0x00,0x04,0x2a,0x34,0x00,0x04,0x2a,0x58,0x00,0x04,0x2a,0x70,0x00,0x04,0x2a,0x88,0x00,0x04,0x2a,0xa0,0x00,0x04,0x2a,0xb8,0x00,0x04,0x2a,0xd0,0x00,0x04,0x2a,0xe8,0x00,0x04,0x2b,0x00,0x00,0x04,0x2b,0x18, -0x00,0x04,0x2b,0x30,0x00,0x04,0x2b,0x48,0x00,0x04,0x2b,0x60,0x00,0x04,0x2b,0x78,0x00,0x04,0x2b,0x90,0x00,0x04,0x2b,0xa8,0x00,0x04,0x2b,0xc0,0x00,0x04,0x2b,0xd8,0x00,0x04,0x2b,0xf0,0x00,0x04,0x2c,0x08,0x00,0x04,0x2c,0x20,0x00,0x04,0x2c,0x38,0x00,0x04,0x2c,0x50,0x00,0x04,0x2c,0x68,0x00,0x04,0x2c,0x80,0x00,0x04,0x2c,0x98, -0x00,0x04,0x2c,0xb0,0x00,0x04,0x2c,0xc8,0x00,0x04,0x2c,0xe0,0x00,0x04,0x2c,0xf8,0x00,0x04,0x2d,0x10,0x00,0x04,0x2d,0x28,0x00,0x04,0x2d,0x40,0x00,0x04,0x2d,0x58,0x00,0x04,0x2d,0x70,0x00,0x04,0x2d,0x88,0x00,0x04,0x2d,0xaa,0x00,0x04,0x2d,0xca,0x00,0x04,0x2d,0xea,0x00,0x04,0x2e,0x16,0x00,0x04,0x2e,0x42,0x00,0x04,0x2e,0x78, -0x00,0x04,0x2e,0x90,0x00,0x04,0x2e,0xa8,0x00,0x04,0x2e,0xbe,0x00,0x04,0x2e,0xd4,0x00,0x04,0x2e,0xec,0x00,0x04,0x2f,0x04,0x00,0x04,0x2f,0x1c,0x00,0x04,0x2f,0x34,0x00,0x04,0x2f,0x44,0x00,0x04,0x2f,0x64,0x00,0x04,0x2f,0x84,0x00,0x04,0x2f,0xc0,0x00,0x04,0x2f,0xfc,0x00,0x04,0x30,0x32,0x00,0x04,0x30,0x68,0x00,0x04,0x30,0xf6, -0x00,0x04,0x31,0xf0,0x00,0x04,0x32,0x88,0x00,0x04,0x32,0x98,0x00,0x04,0x32,0xce,0x00,0x04,0x32,0xf2,0x00,0x04,0x33,0xaa,0x00,0x04,0x34,0x86,0x00,0x04,0x35,0x44,0x00,0x04,0x35,0xf8,0x00,0x04,0x37,0x28,0x00,0x04,0x37,0xb4,0x00,0x04,0x38,0x7c,0x00,0x04,0x39,0x56,0x00,0x04,0x39,0x66,0x00,0x04,0x39,0x9c,0x00,0x04,0x39,0xd2, -0x00,0x04,0x39,0xe2,0x00,0x04,0x3a,0x06,0x00,0x04,0x3a,0x2a,0x00,0x04,0x3a,0x42,0x00,0x04,0x3a,0x5a,0x00,0x04,0x3b,0x5e,0x00,0x04,0x3c,0x10,0x00,0x04,0x3c,0x20,0x00,0x04,0x3c,0x30,0x00,0x04,0x3c,0x54,0x00,0x04,0x3c,0x78,0x00,0x04,0x3c,0x90,0x00,0x04,0x3c,0xa8,0x00,0x04,0x3c,0xcc,0x00,0x04,0x3c,0xf2,0x00,0x04,0x3d,0x12, -0x00,0x04,0x3d,0x32,0x00,0x04,0x3d,0x44,0x00,0x04,0x3d,0x78,0x00,0x04,0x3d,0xe2,0x00,0x04,0x3f,0x42,0x00,0x04,0x3f,0x9a,0x00,0x04,0x3f,0xaa,0x00,0x04,0x40,0x76,0x00,0x04,0x41,0x02,0x00,0x04,0x41,0x1a,0x00,0x04,0x41,0xc4,0x00,0x04,0x41,0xe8,0x00,0x04,0x42,0x0c,0x00,0x04,0x42,0x30,0x00,0x04,0x42,0x40,0x00,0x04,0x42,0x64, -0x00,0x04,0x42,0x7c,0x00,0x04,0x42,0x94,0x00,0x04,0x42,0xac,0x00,0x04,0x42,0xc4,0x00,0x04,0x43,0xb4,0x00,0x04,0x43,0xfc,0x00,0x04,0x44,0x44,0x00,0x04,0x44,0xe0,0x00,0x04,0x45,0x3e,0x00,0x04,0x45,0xba,0x00,0x04,0x46,0x1c,0x00,0x04,0x46,0x54,0x00,0x04,0x46,0xa6,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa, -0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x47,0x98,0x00,0x04,0x47,0xb0,0x00,0x04,0x47,0xc8,0x00,0x04,0x47,0xe0, -0x00,0x04,0x47,0xf8,0x00,0x04,0x48,0x10,0x00,0x04,0x48,0x28,0x00,0x04,0x48,0x4c,0x00,0x04,0x48,0x6a,0x00,0x04,0x48,0x82,0x00,0x04,0x48,0x9a,0x00,0x04,0x48,0xb2,0x00,0x04,0x48,0xca,0x00,0x04,0x48,0xda,0x00,0x04,0x48,0xea,0x00,0x04,0x49,0xb8,0x00,0x04,0x4a,0x20,0x00,0x04,0x4a,0x30,0x00,0x04,0x4a,0x40,0x00,0x04,0x4a,0x50, -0x00,0x04,0x4a,0x60,0x00,0x04,0x4b,0x4e,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x8a,0x00,0x04,0x4b,0xb4,0x00,0x04,0x4b,0xfe,0x00,0x04,0x4c,0x3c,0x00,0x04,0x4c,0x82,0x00,0x04,0x4c,0xc2, -0x00,0x04,0x4d,0x24,0x00,0x04,0x4d,0x34,0x00,0x04,0x4d,0x66,0x00,0x04,0x4d,0xd6,0x00,0x04,0x4e,0xac,0x00,0x04,0x4f,0x30,0x00,0x04,0x4f,0x58,0x00,0x04,0x4f,0x80,0x00,0x04,0x4f,0xa8,0x00,0x04,0x4f,0xd0,0x00,0x04,0x4f,0xf8,0x00,0x04,0x50,0x20,0x00,0x04,0x50,0xc0,0x00,0x04,0x51,0x2a,0x00,0x04,0x51,0xd8,0x00,0x04,0x52,0x74, -0x00,0x04,0x53,0x2a,0x00,0x04,0x53,0x9e,0x00,0x04,0x53,0xcc,0x00,0x04,0x54,0x80,0x00,0x04,0x54,0x90,0x00,0x04,0x55,0x78,0x00,0x04,0x56,0x5c,0x00,0x04,0x56,0x98,0x00,0x04,0x56,0xd4,0x00,0x04,0x57,0x32,0x00,0x04,0x57,0x8e,0x00,0x04,0x57,0xee,0x00,0x04,0x58,0x2a,0x00,0x04,0x58,0x3a,0x00,0x04,0x58,0x7c,0x00,0x04,0x58,0xb6, -0x00,0x04,0x58,0xc6,0x00,0x04,0x58,0xec,0x00,0x04,0x59,0x12,0x00,0x04,0x59,0x8c,0x00,0x04,0x5a,0x38,0x00,0x04,0x5a,0xca,0x00,0x04,0x5b,0x6c,0x00,0x04,0x5b,0xb4,0x00,0x04,0x5c,0x30,0x00,0x04,0x5c,0xe2,0x00,0x04,0x5d,0x0e,0x00,0x04,0x5d,0x4a,0x00,0x04,0x5d,0x8e,0x00,0x04,0x5e,0x34,0x00,0x04,0x5e,0x76,0x00,0x04,0x5e,0xa0, -0x00,0x04,0x5e,0xd0,0x00,0x04,0x5e,0xf8,0x00,0x04,0x5f,0x26,0x00,0x04,0x5f,0x6a,0x00,0x04,0x5f,0xae,0x00,0x04,0x60,0x30,0x00,0x04,0x60,0x74,0x00,0x04,0x60,0xba,0x00,0x04,0x61,0x84,0x00,0x04,0x62,0x2a,0x00,0x04,0x62,0xe0,0x00,0x04,0x63,0x52,0x00,0x04,0x63,0xe4,0x00,0x04,0x64,0x14,0x00,0x04,0x64,0xa4,0x00,0x04,0x65,0x1e, -0x00,0x04,0x65,0xd4,0x00,0x04,0x66,0x02,0x00,0x04,0x66,0x6c,0x00,0x04,0x67,0x16,0x00,0x04,0x67,0xd6,0x00,0x04,0x68,0x5c,0x00,0x04,0x69,0x3c,0x00,0x04,0x69,0x6e,0x00,0x04,0x69,0xf2,0x00,0x04,0x6a,0x9a,0x00,0x04,0x6b,0x26,0x00,0x04,0x6b,0xbc,0x00,0x04,0x6c,0x86,0x00,0x04,0x6d,0x3e,0x00,0x04,0x6d,0xda,0x00,0x04,0x6e,0xaa, -0x00,0x04,0x6f,0x12,0x00,0x04,0x70,0x04,0x00,0x04,0x70,0xce,0x00,0x04,0x70,0xe6,0x00,0x04,0x70,0xfe,0x00,0x04,0x71,0x16,0x00,0x04,0x71,0x44,0x00,0x04,0x71,0x90,0x00,0x04,0x71,0xa8,0x00,0x04,0x71,0xc0,0x00,0x04,0x71,0xd6,0x00,0x04,0x71,0xf4,0x00,0x04,0x72,0x5a,0x00,0x04,0x72,0xe0,0x00,0x04,0x72,0xf0,0x00,0x04,0x73,0x00, -0x00,0x04,0x73,0x10,0x00,0x04,0x73,0x20,0x00,0x04,0x73,0x30,0x00,0x04,0x73,0x40,0x00,0x04,0x73,0x50,0x00,0x04,0x73,0x60,0x00,0x04,0x73,0xa0,0x00,0x04,0x73,0xb8,0x00,0x04,0x73,0xd0,0x00,0x04,0x73,0xf0,0x00,0x04,0x74,0x10,0x00,0x04,0x74,0x28,0x00,0x04,0x74,0x40,0x00,0x04,0x74,0x58,0x00,0x04,0x74,0x70,0x00,0x04,0x74,0x88, -0x00,0x04,0x74,0xa0,0x00,0x04,0x74,0xb8,0x00,0x04,0x74,0xce,0x00,0x04,0x74,0xe4,0x00,0x04,0x74,0xfc,0x00,0x04,0x75,0x14,0x00,0x04,0x75,0x2c,0x00,0x04,0x75,0x44,0x00,0x04,0x75,0x5c,0x00,0x04,0x75,0x74,0x00,0x04,0x75,0x8c,0x00,0x04,0x75,0xa4,0x00,0x04,0x75,0xbc,0x00,0x04,0x75,0xd4,0x00,0x04,0x75,0xec,0x00,0x04,0x76,0x04, -0x00,0x04,0x76,0x1c,0x00,0x04,0x76,0x34,0x00,0x04,0x76,0x4c,0x00,0x04,0x76,0x64,0x00,0x04,0x76,0x7c,0x00,0x04,0x76,0x94,0x00,0x04,0x76,0xac,0x00,0x04,0x77,0x4e,0x00,0x04,0x79,0x8e,0x00,0x04,0x79,0xcc,0x00,0x04,0x79,0xf6,0x00,0x04,0x7a,0x06,0x00,0x04,0x7a,0x1e,0x00,0x04,0x7a,0x36,0x00,0x04,0x7a,0x4e,0x00,0x04,0x7a,0xc2, -0x00,0x04,0x7b,0x6c,0x00,0x04,0x7b,0xc2,0x00,0x04,0x7c,0x38,0x00,0x04,0x7c,0xc4,0x00,0x04,0x7d,0x04,0x00,0x04,0x7d,0x30,0x00,0x04,0x7d,0xea,0x00,0x04,0x7e,0x2a,0x00,0x04,0x7e,0x8a,0x00,0x04,0x7e,0xfc,0x00,0x04,0x7f,0x3c,0x00,0x04,0x7f,0x7c,0x00,0x04,0x7f,0xee,0x00,0x04,0x80,0xd4,0x00,0x04,0x81,0x50,0x00,0x04,0x81,0xb8, -0x00,0x04,0x82,0x30,0x00,0x04,0x82,0x64,0x00,0x04,0x82,0xc4,0x00,0x04,0x83,0x04,0x00,0x04,0x83,0x76,0x00,0x04,0x83,0xcc,0x00,0x04,0x84,0x0c,0x00,0x04,0x84,0x86,0x00,0x04,0x84,0x96,0x00,0x04,0x84,0xe6,0x00,0x04,0x85,0x18,0x00,0x04,0x85,0x58,0x00,0x04,0x86,0x14,0x00,0x04,0x86,0x78,0x00,0x04,0x86,0x88,0x00,0x04,0x87,0x06, -0x00,0x04,0x87,0x1e,0x00,0x04,0x87,0x66,0x00,0x04,0x88,0x4c,0x00,0x04,0x88,0xf0,0x00,0x04,0x89,0x9a,0x00,0x04,0x8a,0x92,0x00,0x04,0x8b,0x26,0x00,0x04,0x8b,0xe8,0x00,0x04,0x8c,0xa6,0x00,0x04,0x8d,0x6a,0x00,0x04,0x8d,0xa2,0x00,0x04,0x8e,0x72,0x00,0x04,0x8f,0x44,0x00,0x04,0x90,0x30,0x00,0x04,0x90,0xbc,0x00,0x04,0x92,0x1a, -0x00,0x04,0x92,0x9e,0x00,0x04,0x93,0x30,0x00,0x04,0x93,0xe4,0x00,0x04,0x94,0x76,0x00,0x04,0x95,0x16,0x00,0x04,0x96,0x70,0x00,0x04,0x97,0x68,0x00,0x04,0x97,0xe8,0x00,0x04,0x98,0x56,0x00,0x04,0x98,0xd0,0x00,0x04,0x99,0x92,0x00,0x04,0x9a,0x12,0x00,0x04,0x9a,0xfa,0x00,0x04,0x9b,0xd6,0x00,0x04,0x9c,0x8a,0x00,0x04,0x9d,0xc4, -0x00,0x04,0x9e,0x52,0x00,0x04,0x9f,0x02,0x00,0x04,0x9f,0x98,0x00,0x04,0xa0,0x2e,0x00,0x04,0xa0,0xe4,0x00,0x04,0xa1,0x66,0x00,0x04,0xa1,0xea,0x00,0x04,0xa2,0xe4,0x00,0x04,0xa3,0xc0,0x00,0x04,0xa4,0xbe,0x00,0x04,0xa6,0x06,0x00,0x04,0xa7,0xe6,0x00,0x04,0xa8,0xd0,0x00,0x04,0xaa,0x1e,0x00,0x04,0xab,0x34,0x00,0x04,0xac,0xb0, -0x00,0x04,0xad,0x90,0x00,0x04,0xae,0x9e,0x00,0x04,0xb1,0x10,0x00,0x04,0xb2,0x16,0x00,0x04,0xb3,0x1a,0x00,0x04,0xb4,0x7e,0x00,0x04,0xb5,0xc2,0x00,0x04,0xb6,0xd6,0x00,0x04,0xb8,0xb0,0x00,0x04,0xb9,0x70,0x00,0x04,0xbb,0x5c,0x00,0x04,0xbd,0x34,0x00,0x04,0xbf,0x22,0x00,0x04,0xc0,0x4c,0x00,0x04,0xc1,0xf0,0x00,0x04,0xc3,0x60, -0x00,0x04,0xc4,0xa0,0x00,0x04,0xc5,0x9a,0x00,0x04,0xc6,0xf4,0x00,0x04,0xc7,0xcc,0x00,0x04,0xc9,0x6e,0x00,0x04,0xcb,0x30,0x00,0x04,0xcc,0x28,0x00,0x04,0xce,0x26,0x00,0x04,0xcf,0x78,0x00,0x04,0xd1,0x0a,0x00,0x04,0xd2,0x8c,0x00,0x04,0xd3,0xa4,0x00,0x04,0xd5,0x42,0x00,0x04,0xd6,0x64,0x00,0x04,0xd7,0xf0,0x00,0x04,0xd9,0x3c, -0x00,0x04,0xda,0x58,0x00,0x04,0xdb,0xb2,0x00,0x04,0xdc,0xda,0x00,0x04,0xdd,0x7c,0x00,0x04,0xde,0x6a,0x00,0x04,0xdf,0x8c,0x00,0x04,0xe0,0xb2,0x00,0x04,0xe2,0x08,0x00,0x04,0xe3,0xbe,0x00,0x04,0xe4,0xbe,0x00,0x04,0xe6,0x0e,0x00,0x04,0xe7,0x6e,0x00,0x04,0xe9,0x48,0x00,0x04,0xe9,0xfc,0x00,0x04,0xeb,0x40,0x00,0x04,0xec,0xe8, -0x00,0x04,0xee,0x6c,0x00,0x04,0xef,0xaa,0x00,0x04,0xf1,0x0c,0x00,0x04,0xf2,0x3a,0x00,0x04,0xf3,0x6a,0x00,0x04,0xf4,0xe6,0x00,0x04,0xf5,0xe2,0x00,0x04,0xf7,0x42,0x00,0x04,0xf8,0xc6,0x00,0x04,0xfa,0xc8,0x00,0x04,0xfc,0x22,0x00,0x04,0xfd,0x16,0x00,0x04,0xfe,0x04,0x00,0x04,0xff,0x1c,0x00,0x05,0x00,0x54,0x00,0x05,0x01,0x9c, -0x00,0x05,0x03,0x02,0x00,0x05,0x04,0x58,0x00,0x05,0x05,0xf8,0x00,0x05,0x07,0x50,0x00,0x05,0x08,0x46,0x00,0x05,0x09,0xaa,0x00,0x05,0x0a,0xb2,0x00,0x05,0x0b,0x62,0x00,0x05,0x0c,0x98,0x00,0x05,0x0d,0x88,0x00,0x05,0x0f,0x2a,0x00,0x05,0x10,0x08,0x00,0x05,0x10,0xc4,0x00,0x05,0x11,0xa0,0x00,0x05,0x12,0x42,0x00,0x05,0x12,0xe8, -0x00,0x05,0x13,0xee,0x00,0x05,0x14,0x5e,0x00,0x05,0x14,0xe0,0x00,0x05,0x16,0x2a,0x00,0x05,0x16,0xfe,0x00,0x05,0x17,0xb0,0x00,0x05,0x18,0x04,0x00,0x05,0x18,0xc0,0x00,0x05,0x1a,0x34,0x00,0x05,0x1a,0xca,0x00,0x05,0x1b,0xa8,0x00,0x05,0x1d,0x26,0x00,0x05,0x1d,0xb8,0x00,0x05,0x1e,0x9a,0x00,0x05,0x1f,0x2e,0x00,0x05,0x20,0x76, -0x00,0x05,0x21,0x06,0x00,0x05,0x22,0x18,0x00,0x05,0x22,0xa6,0x00,0x05,0x23,0xae,0x00,0x05,0x24,0x5e,0x00,0x05,0x25,0xc4,0x00,0x05,0x26,0x6e,0x00,0x05,0x26,0xfe,0x00,0x05,0x27,0x96,0x00,0x05,0x28,0xf2,0x00,0x05,0x29,0x78,0x00,0x05,0x2a,0xd4,0x00,0x05,0x2b,0x7e,0x00,0x05,0x2c,0x88,0x00,0x05,0x2d,0xae,0x00,0x05,0x2e,0x98, -0x00,0x05,0x2f,0xba,0x00,0x05,0x30,0x3a,0x00,0x05,0x30,0x94,0x00,0x05,0x30,0xd4,0x00,0x05,0x31,0x44,0x00,0x05,0x31,0x90,0x00,0x05,0x32,0xae,0x00,0x05,0x32,0xfe,0x00,0x05,0x33,0xee,0x00,0x05,0x34,0x92,0x00,0x05,0x35,0x6a,0x00,0x05,0x36,0x0e,0x00,0x05,0x36,0xb8,0x00,0x05,0x37,0x80,0x00,0x05,0x37,0xd0,0x00,0x05,0x38,0x6e, -0x00,0x05,0x39,0x96,0x00,0x05,0x3a,0x5a,0x00,0x05,0x3a,0xe4,0x00,0x05,0x3b,0x1e,0x00,0x05,0x3b,0xf6,0x00,0x05,0x3d,0x38,0x00,0x05,0x3d,0xae,0x00,0x05,0x3e,0x82,0x00,0x05,0x3f,0xa2,0x00,0x05,0x40,0x3e,0x00,0x05,0x41,0x46,0x00,0x05,0x41,0xc8,0x00,0x05,0x42,0x08,0x00,0x05,0x42,0x88,0x00,0x05,0x43,0x7a,0x00,0x05,0x44,0x4e, -0x00,0x05,0x45,0x3a,0x00,0x05,0x45,0xf6,0x00,0x05,0x47,0x36,0x00,0x05,0x47,0xda,0x00,0x05,0x48,0xba,0x00,0x05,0x49,0x40,0x00,0x05,0x4a,0x02,0x00,0x05,0x4a,0x92,0x00,0x05,0x4b,0xaa,0x00,0x05,0x4b,0xe4,0x00,0x05,0x4c,0xaa,0x00,0x05,0x4d,0x7a,0x00,0x05,0x4e,0x54,0x00,0x05,0x4f,0x90,0x00,0x05,0x50,0x14,0x00,0x05,0x50,0x96, -0x00,0x05,0x50,0xf4,0x00,0x05,0x51,0xd8,0x00,0x05,0x52,0xde,0x00,0x05,0x53,0xca,0x00,0x05,0x54,0xbe,0x00,0x05,0x55,0xda,0x00,0x05,0x56,0xb6,0x00,0x05,0x57,0x24,0x00,0x05,0x57,0x34,0x00,0x05,0x57,0xac,0x00,0x05,0x58,0x04,0x00,0x05,0x58,0xa2,0x00,0x05,0x59,0x60,0x00,0x05,0x59,0xde,0x00,0x05,0x5a,0x80,0x00,0x05,0x5b,0x4c, -0x00,0x05,0x5b,0xb6,0x00,0x05,0x5c,0xce,0x00,0x05,0x5d,0x96,0x00,0x05,0x5d,0xa6,0x00,0x05,0x5d,0xfe,0x00,0x05,0x5e,0x0e,0x00,0x05,0x5e,0x1e,0x00,0x05,0x5e,0x2e,0x00,0x05,0x5e,0x3e,0x00,0x05,0x5e,0x4e,0x00,0x05,0x5e,0x5e,0x00,0x05,0x5e,0x6e,0x00,0x05,0x5e,0x7e,0x00,0x05,0x5e,0xfa,0x00,0x05,0x5f,0x58,0x00,0x05,0x60,0x02, -0x00,0x05,0x60,0xd0,0x00,0x05,0x61,0x4c,0x00,0x05,0x61,0xf6,0x00,0x05,0x62,0xc2,0x00,0x05,0x63,0x2e,0x00,0x05,0x64,0x46,0x00,0x05,0x65,0x10,0x00,0x05,0x65,0xe4,0x00,0x05,0x66,0x8e,0x00,0x05,0x67,0x82,0x00,0x05,0x68,0xcc,0x00,0x05,0x69,0x9e,0x00,0x05,0x6a,0x9e,0x00,0x05,0x6b,0xbc,0x00,0x05,0x6c,0xa0,0x00,0x05,0x6e,0x1c, -0x00,0x05,0x6f,0x50,0x00,0x05,0x6f,0xb4,0x00,0x05,0x6f,0xd0,0x00,0x05,0x6f,0xec,0x00,0x05,0x70,0x08,0x00,0x05,0x70,0x26,0x00,0x05,0x70,0x42,0x00,0x05,0x71,0x0c,0x00,0x05,0x71,0x28,0x00,0x05,0x71,0x48,0x00,0x05,0x72,0x18,0x00,0x05,0x72,0x90,0x00,0x05,0x73,0x46,0x00,0x05,0x73,0xba,0x00,0x05,0x74,0x2a,0x00,0x05,0x74,0x96, -0x00,0x05,0x74,0xec,0x00,0x05,0x75,0x82,0x00,0x05,0x75,0xd8,0x00,0x05,0x76,0x00,0x00,0x05,0x76,0x52,0x00,0x05,0x76,0xcc,0x00,0x05,0x77,0x02,0x00,0x05,0x77,0x94,0x00,0x05,0x78,0x02,0x00,0x05,0x78,0x88,0x00,0x05,0x78,0xfa,0x00,0x05,0x79,0x98,0x00,0x05,0x7a,0x36,0x00,0x05,0x7a,0xf6,0x00,0x05,0x7b,0x3a,0x00,0x05,0x7b,0x9c, -0x00,0x05,0x7b,0xee,0x00,0x05,0x7c,0x80,0x00,0x05,0x7c,0xf0,0x00,0x05,0x7d,0x50,0x00,0x05,0x7d,0xa6,0x00,0x05,0x7e,0x4c,0x00,0x05,0x7f,0x26,0x00,0x05,0x7f,0x92,0x00,0x05,0x80,0x5c,0x00,0x05,0x80,0xda,0x00,0x05,0x81,0x74,0x00,0x05,0x82,0x50,0x00,0x05,0x82,0x74,0x00,0x05,0x82,0x98,0x00,0x05,0x82,0xbc,0x00,0x05,0x82,0xe0, -0x00,0x05,0x83,0x04,0x00,0x05,0x83,0x28,0x00,0x05,0x83,0x40,0x00,0x05,0x83,0x62,0x00,0x05,0x83,0x86,0x00,0x05,0x83,0xa8,0x00,0x05,0x83,0xcc,0x00,0x05,0x83,0xee,0x00,0x05,0x84,0x10,0x00,0x05,0x84,0x32,0x00,0x05,0x84,0x58,0x00,0x05,0x84,0x7c,0x00,0x05,0x84,0xa0,0x00,0x05,0x84,0xc4,0x00,0x05,0x84,0xe8,0x00,0x05,0x85,0x0c, -0x00,0x05,0x85,0x32,0x00,0x05,0x85,0x56,0x00,0x05,0x85,0x7a,0x00,0x05,0x85,0x9e,0x00,0x05,0x85,0xc4,0x00,0x05,0x85,0xe8,0x00,0x05,0x86,0x0c,0x00,0x05,0x86,0x30,0x00,0x05,0x86,0x48,0x00,0x05,0x86,0x6c,0x00,0x05,0x86,0x90,0x00,0x05,0x86,0xb4,0x00,0x05,0x86,0xd8,0x00,0x05,0x86,0xe8,0x00,0x05,0x87,0x0c,0x00,0x05,0x87,0x30, -0x00,0x05,0x87,0x54,0x00,0x05,0x87,0x6c,0x00,0x05,0x87,0x8e,0x00,0x05,0x87,0xb2,0x00,0x05,0x87,0xca,0x00,0x05,0x87,0xee,0x00,0x05,0x88,0x12,0x00,0x05,0x88,0xa4,0x00,0x05,0x88,0xc6,0x00,0x05,0x88,0xe8,0x00,0x05,0x89,0x0a,0x00,0x05,0x89,0x20,0x00,0x05,0x89,0x42,0x00,0x05,0x89,0x5a,0x00,0x05,0x89,0x7c,0x00,0x05,0x89,0x94, -0x00,0x05,0x89,0xb6,0x00,0x05,0x89,0xcc,0x00,0x05,0x89,0xe4,0x00,0x05,0x89,0xfc,0x00,0x05,0x8a,0x20,0x00,0x05,0x8a,0x38,0x00,0x05,0x8a,0x5c,0x00,0x05,0x8b,0x04,0x00,0x05,0x8b,0x28,0x00,0x05,0x8b,0x4c,0x00,0x05,0x8b,0x72,0x00,0x05,0x8b,0x96,0x00,0x05,0x8b,0xae,0x00,0x05,0x8b,0xd2,0x00,0x05,0x8b,0xf6,0x00,0x05,0x8c,0x18, -0x00,0x05,0x8c,0x30,0x00,0x05,0x8c,0x52,0x00,0x05,0x8c,0x6a,0x00,0x05,0x8c,0x80,0x00,0x05,0x8c,0xa2,0x00,0x05,0x8d,0x1c,0x00,0x05,0x8d,0x40,0x00,0x05,0x8d,0x64,0x00,0x05,0x8d,0x88,0x00,0x05,0x8d,0xae,0x00,0x05,0x8d,0xd4,0x00,0x05,0x8d,0xec,0x00,0x05,0x8e,0x10,0x00,0x05,0x8e,0x34,0x00,0x05,0x8e,0x58,0x00,0x05,0x8e,0x7e, -0x00,0x05,0x8e,0xa0,0x00,0x05,0x8e,0xc4,0x00,0x05,0x8e,0xe6,0x00,0x05,0x8f,0x0a,0x00,0x05,0x8f,0x2e,0x00,0x05,0x8f,0x52,0x00,0x05,0x8f,0x9e,0x00,0x05,0x8f,0xc2,0x00,0x05,0x8f,0xe6,0x00,0x05,0x8f,0xf6,0x00,0x05,0x90,0x06,0x00,0x05,0x90,0x40,0x00,0x05,0x90,0xa6,0x00,0x05,0x90,0xb6,0x00,0x05,0x90,0xc6,0x00,0x05,0x90,0xd6, -0x00,0x05,0x91,0x7c,0x00,0x05,0x91,0x8c,0x00,0x05,0x91,0x9c,0x00,0x05,0x91,0xfa,0x00,0x05,0x92,0x0a,0x00,0x05,0x92,0x1a,0x00,0x05,0x92,0x82,0x00,0x05,0x92,0x92,0x00,0x05,0x92,0xd2,0x00,0x05,0x92,0xe2,0x00,0x05,0x93,0x4e,0x00,0x05,0x93,0x5e,0x00,0x05,0x93,0x6e,0x00,0x05,0x94,0x4e,0x00,0x05,0x94,0x5e,0x00,0x05,0x94,0xe8, -0x00,0x05,0x95,0x8e,0x00,0x05,0x95,0xb2,0x00,0x05,0x95,0xd6,0x00,0x05,0x95,0xfa,0x00,0x05,0x96,0x1c,0x00,0x05,0x96,0x40,0x00,0x05,0x96,0x64,0x00,0x05,0x96,0x88,0x00,0x05,0x96,0xae,0x00,0x05,0x96,0xd2,0x00,0x05,0x96,0xf6,0x00,0x05,0x97,0x8c,0x00,0x05,0x97,0xb0,0x00,0x05,0x98,0x36,0x00,0x05,0x98,0x46,0x00,0x05,0x98,0x56, -0x00,0x05,0x98,0x7c,0x00,0x05,0x98,0x8c,0x00,0x05,0x99,0x5c,0x00,0x05,0x9a,0x0a,0x00,0x05,0x9a,0x7e,0x00,0x05,0x9a,0xa2,0x00,0x05,0x9a,0xc6,0x00,0x05,0x9b,0x24,0x00,0x05,0x9b,0x34,0x00,0x05,0x9b,0xba,0x00,0x05,0x9b,0xca,0x00,0x05,0x9b,0xda,0x00,0x05,0x9c,0x78,0x00,0x05,0x9c,0x88,0x00,0x05,0x9d,0x0c,0x00,0x05,0x9d,0xc6, -0x00,0x05,0x9e,0x38,0x00,0x05,0x9e,0x5c,0x00,0x05,0x9e,0x6c,0x00,0x05,0x9e,0xf0,0x00,0x05,0x9f,0x00,0x00,0x05,0x9f,0x10,0x00,0x05,0x9f,0x20,0x00,0x05,0x9f,0x30,0x00,0x05,0x9f,0x40,0x00,0x05,0x9f,0x50,0x00,0x05,0x9f,0x60,0x00,0x05,0x9f,0xdc,0x00,0x05,0x9f,0xec,0x00,0x05,0x9f,0xfc,0x00,0x05,0xa0,0x56,0x00,0x05,0xa0,0xc8, -0x00,0x05,0xa1,0x26,0x00,0x05,0xa1,0x9a,0x00,0x05,0xa2,0x20,0x00,0x05,0xa2,0xae,0x00,0x05,0xa3,0x20,0x00,0x05,0xa3,0xa6,0x00,0x05,0xa4,0x66,0x00,0x05,0xa5,0x1a,0x00,0x05,0xa5,0x5e,0x00,0x05,0xa5,0xee,0x00,0x05,0xa6,0x78,0x00,0x05,0xa7,0x4c,0x00,0x05,0xa8,0x3e,0x00,0x05,0xa9,0x24,0x00,0x05,0xaa,0xb0,0x00,0x05,0xaa,0xd4, -0x00,0x05,0xaa,0xf8,0x00,0x05,0xab,0x0e,0x00,0x05,0xab,0x1e,0x00,0x05,0xab,0x2e,0x00,0x05,0xab,0x4e,0x00,0x05,0xab,0x5e,0x00,0x05,0xab,0x6e,0x00,0x05,0xab,0x8e,0x00,0x05,0xab,0x9e,0x00,0x05,0xab,0xae,0x00,0x05,0xab,0xcc,0x00,0x05,0xab,0xdc,0x00,0x05,0xab,0xec,0x00,0x05,0xac,0x0a,0x00,0x05,0xac,0x1a,0x00,0x05,0xac,0x2a, -0x00,0x05,0xac,0x48,0x00,0x05,0xac,0x58,0x00,0x05,0xac,0x68,0x00,0x05,0xac,0x78,0x00,0x05,0xac,0x88,0x00,0x05,0xac,0x98,0x00,0x05,0xac,0xb8,0x00,0x05,0xac,0xd6,0x00,0x05,0xac,0xe6,0x00,0x05,0xac,0xf6,0x00,0x05,0xad,0x14,0x00,0x05,0xad,0x32,0x00,0x05,0xad,0x42,0x00,0x05,0xad,0x52,0x00,0x05,0xad,0x62,0x00,0x05,0xad,0x84, -0x00,0x05,0xad,0x94,0x00,0x05,0xad,0xb4,0x00,0x05,0xad,0xc4,0x00,0x05,0xad,0xe2,0x00,0x05,0xad,0xf2,0x00,0x05,0xae,0x02,0x00,0x05,0xae,0x12,0x00,0x05,0xae,0x30,0x00,0x05,0xae,0x4e,0x00,0x05,0xae,0x6e,0x00,0x05,0xae,0x7e,0x00,0x05,0xae,0x8e,0x00,0x05,0xae,0xa6,0x00,0x05,0xae,0xbe,0x00,0x05,0xae,0xce,0x00,0x05,0xae,0xde, -0x00,0x05,0xae,0xf6,0x00,0x05,0xaf,0x0e,0x00,0x05,0xaf,0x9c,0x00,0x05,0xb0,0xde,0x00,0x05,0xb2,0x14,0x00,0x05,0xb2,0x84,0x00,0x05,0xb2,0xe0,0x00,0x05,0xb3,0x7c,0x00,0x05,0xb4,0x44,0x00,0x05,0xb4,0xf6,0x00,0x05,0xb5,0xa2,0x00,0x05,0xb6,0x02,0x00,0x05,0xb6,0x5c,0x00,0x05,0xb6,0xbc,0x00,0x05,0xb7,0x64,0x00,0x05,0xb7,0x92, -0x00,0x05,0xb7,0xc2,0x00,0x05,0xb7,0xf0,0x00,0x05,0xb8,0x20,0x00,0x05,0xb8,0x38,0x00,0x05,0xb8,0x6a,0x00,0x05,0xb8,0x82,0x00,0x05,0xb8,0x9a,0x00,0x05,0xb8,0xb2,0x00,0x05,0xb8,0xca,0x00,0x05,0xb8,0xe2,0x00,0x05,0xb8,0xf8,0x00,0x05,0xb9,0x28,0x00,0x05,0xb9,0x3e,0x00,0x05,0xb9,0x54,0x00,0x05,0xb9,0x64,0x00,0x05,0xb9,0xc2, -0x00,0x05,0xba,0x16,0x00,0x05,0xba,0x2c,0x00,0x05,0xba,0x42,0x00,0x05,0xbb,0x5c,0x00,0x05,0xbc,0x64,0x00,0x05,0xbd,0x4c,0x00,0x05,0xbe,0x84,0x00,0x05,0xbf,0x26,0x00,0x05,0xbf,0xe0,0x00,0x05,0xc0,0x0c,0x00,0x05,0xc0,0xc2,0x00,0x05,0xc1,0x3a,0x00,0x05,0xc1,0x60,0x00,0x05,0xc2,0x26,0x00,0x05,0xc2,0x4c,0x00,0x05,0xc2,0x64, -0x00,0x05,0xc2,0x7c,0x00,0x05,0xc2,0x94,0x00,0x05,0xc2,0xac,0x00,0x05,0xc2,0xc4,0x00,0x05,0xc2,0xe8,0x00,0x05,0xc3,0x0c,0x00,0x05,0xc3,0x24,0x00,0x05,0xc3,0x3c,0x00,0x05,0xc3,0x54,0x00,0x05,0xc3,0x6c,0x00,0x05,0xc3,0x84,0x00,0x05,0xc3,0x9c,0x00,0x05,0xc3,0xb4,0x00,0x05,0xc4,0x88,0x00,0x05,0xc4,0xa0,0x00,0x05,0xc5,0x36, -0x00,0x05,0xc5,0x4e,0x00,0x05,0xc6,0xbe,0x00,0x05,0xc7,0xf2,0x00,0x05,0xc8,0x0a,0x00,0x05,0xc8,0x22,0x00,0x05,0xc9,0xa0,0x00,0x05,0xca,0xec,0x00,0x05,0xcb,0x04,0x00,0x05,0xcb,0x1c,0x00,0x05,0xcc,0x1c,0x00,0x05,0xcd,0x00,0x00,0x05,0xce,0x08,0x00,0x05,0xce,0x20,0x00,0x05,0xce,0x38,0x00,0x05,0xce,0x50,0x00,0x05,0xce,0x68, -0x00,0x05,0xce,0x80,0x00,0x05,0xce,0x98,0x00,0x05,0xce,0xb0,0x00,0x05,0xce,0xc8,0x00,0x05,0xce,0xe0,0x00,0x05,0xce,0xf8,0x00,0x05,0xcf,0x10,0x00,0x05,0xcf,0x28,0x00,0x05,0xcf,0x4c,0x00,0x05,0xcf,0x6c,0x00,0x05,0xcf,0x8c,0x00,0x05,0xcf,0xa4,0x00,0x05,0xcf,0xbc,0x00,0x05,0xcf,0xdc,0x00,0x05,0xcf,0xfc,0x00,0x05,0xd0,0x14, -0x00,0x05,0xd0,0x2c,0x00,0x05,0xd0,0x4c,0x00,0x05,0xd0,0x6c,0x00,0x05,0xd0,0x84,0x00,0x05,0xd0,0x9c,0x00,0x05,0xd1,0xe0,0x00,0x05,0xd2,0x8e,0x00,0x05,0xd3,0x98,0x00,0x05,0xd4,0x7c,0x00,0x05,0xd4,0x94,0x00,0x05,0xd4,0xac,0x00,0x05,0xd5,0xf4,0x00,0x05,0xd7,0x38,0x00,0x05,0xd8,0x62,0x00,0x05,0xd9,0x5a,0x00,0x05,0xd9,0x6a, -0x00,0x05,0xd9,0x7a,0x00,0x05,0xd9,0x92,0x00,0x05,0xda,0x94,0x00,0x05,0xdb,0xa4,0x00,0x05,0xdd,0x8c,0x00,0x05,0xde,0x7e,0x00,0x05,0xdf,0xc0,0x00,0x05,0xe0,0x5a,0x00,0x05,0xe1,0x94,0x00,0x05,0xe2,0x3e,0x00,0x05,0xe3,0x32,0x00,0x05,0xe3,0xd8,0x00,0x05,0xe4,0x68,0x00,0x05,0xe4,0x78,0x00,0x05,0xe5,0x3a,0x00,0x05,0xe5,0x9e, -0x00,0x05,0xe6,0xb8,0x00,0x05,0xe6,0xc8,0x00,0x05,0xe6,0xd8,0x00,0x05,0xe6,0xea,0x00,0x05,0xe7,0x0e,0x00,0x05,0xe7,0x3e,0x00,0x05,0xe7,0x62,0x00,0x05,0xe7,0x8e,0x00,0x05,0xe7,0xa6,0x00,0x05,0xe7,0xbe,0x00,0x05,0xe7,0xd6,0x00,0x05,0xe7,0xee,0x00,0x05,0xe8,0x06,0x00,0x05,0xe8,0x1e,0x00,0x05,0xe8,0x3e,0x00,0x05,0xe8,0x5e, -0x00,0x05,0xe8,0x76,0x00,0x05,0xe8,0x8e,0x00,0x05,0xe8,0xa6,0x00,0x05,0xe8,0xbe,0x00,0x05,0xe8,0xd6,0x00,0x05,0xe8,0xee,0x00,0x05,0xe9,0x06,0x00,0x05,0xe9,0x1e,0x00,0x05,0xe9,0x42,0x00,0x05,0xe9,0x5a,0x00,0x05,0xe9,0x72,0x00,0x05,0xe9,0x8a,0x00,0x05,0xe9,0xa2,0x00,0x05,0xe9,0xba,0x00,0x05,0xe9,0xd2,0x00,0x05,0xe9,0xea, -0x00,0x05,0xea,0x02,0x00,0x05,0xea,0x1a,0x00,0x05,0xea,0x3a,0x00,0x05,0xea,0x52,0x00,0x05,0xea,0x6a,0x00,0x05,0xea,0x82,0x00,0x05,0xea,0x9a,0x00,0x05,0xea,0xb2,0x00,0x05,0xea,0xd2,0x00,0x05,0xea,0xf2,0x00,0x05,0xeb,0x0a,0x00,0x05,0xeb,0x22,0x00,0x05,0xeb,0x42,0x00,0x05,0xeb,0x62,0x00,0x05,0xeb,0x7a,0x00,0x05,0xeb,0x92, -0x00,0x05,0xeb,0xaa,0x00,0x05,0xeb,0xc2,0x00,0x05,0xeb,0xda,0x00,0x05,0xeb,0xf2,0x00,0x05,0xec,0x0a,0x00,0x05,0xed,0x52,0x00,0x05,0xed,0x6a,0x00,0x05,0xed,0x8a,0x00,0x05,0xed,0xa2,0x00,0x05,0xed,0xba,0x00,0x05,0xed,0xd2,0x00,0x05,0xed,0xea,0x00,0x05,0xee,0x02,0x00,0x05,0xee,0x1a,0x00,0x05,0xee,0x32,0x00,0x05,0xee,0x4a, -0x00,0x05,0xee,0x62,0x00,0x05,0xef,0x6a,0x00,0x05,0xef,0x7a,0x00,0x05,0xf0,0x94,0x00,0x05,0xf1,0xca,0x00,0x05,0xf1,0xe2,0x00,0x05,0xf1,0xfa,0x00,0x05,0xf2,0x12,0x00,0x05,0xf2,0x2a,0x00,0x05,0xf2,0x42,0x00,0x05,0xf2,0x5a,0x00,0x05,0xf2,0x72,0x00,0x05,0xf2,0x8a,0x00,0x05,0xf2,0xa2,0x00,0x05,0xf2,0xb8,0x00,0x05,0xf2,0xd8, -0x00,0x05,0xf2,0xf6,0x00,0x05,0xf3,0x24,0x00,0x05,0xf3,0x50,0x00,0x05,0xf3,0x70,0x00,0x05,0xf3,0x8e,0x00,0x05,0xf3,0xae,0x00,0x05,0xf3,0xcc,0x00,0x05,0xf4,0x02,0x00,0x05,0xf4,0x36,0x00,0x05,0xf4,0x4e,0x00,0x05,0xf4,0x66,0x00,0x05,0xf4,0x8e,0x00,0x05,0xf5,0x9a,0x00,0x05,0xf6,0xa4,0x00,0x05,0xf6,0xc4,0x00,0x05,0xf7,0x8c, -0x00,0x05,0xf7,0xa4,0x00,0x05,0xf7,0xbc,0x00,0x05,0xf7,0xd4,0x00,0x05,0xf9,0x26,0x00,0x05,0xf9,0x46,0x00,0x05,0xf9,0x5e,0x00,0x05,0xf9,0x76,0x00,0x05,0xf9,0x86,0x00,0x05,0xf9,0x96,0x00,0x05,0xf9,0xb6,0x00,0x05,0xf9,0xce,0x00,0x05,0xf9,0xe6,0x00,0x05,0xf9,0xfc,0x00,0x05,0xfb,0x1e,0x00,0x05,0xfb,0x42,0x00,0x05,0xfb,0x68, -0x00,0x05,0xfb,0x80,0x00,0x05,0xfb,0xa4,0x00,0x05,0xfb,0xbc,0x00,0x05,0xfb,0xd4,0x00,0x05,0xfb,0xec,0x00,0x05,0xfc,0x0c,0x00,0x05,0xfc,0x24,0x00,0x05,0xfc,0x3c,0x00,0x05,0xfc,0x54,0x00,0x05,0xfc,0x6c,0x00,0x05,0xfc,0x84,0x00,0x05,0xfc,0xde,0x00,0x05,0xfc,0xfe,0x00,0x05,0xfd,0x1e,0x00,0x05,0xfd,0x3e,0x00,0x05,0xfd,0x5e, -0x00,0x05,0xfd,0x76,0x00,0x05,0xfd,0x96,0x00,0x05,0xfd,0xb6,0x00,0x05,0xfd,0xd6,0x00,0x05,0xfd,0xee,0x00,0x05,0xfe,0x06,0x00,0x05,0xfe,0x26,0x00,0x05,0xfe,0x46,0x00,0x05,0xfe,0x66,0x00,0x05,0xfe,0x86,0x00,0x05,0xfe,0xaa,0x00,0x05,0xfe,0xce,0x00,0x05,0xfe,0xe6,0x00,0x05,0xfe,0xfe,0x00,0x05,0xff,0x16,0x00,0x05,0xff,0x2e, -0x00,0x05,0xff,0x4e,0x00,0x05,0xff,0x72,0x00,0x05,0xff,0x8a,0x00,0x05,0xff,0xa2,0x00,0x05,0xff,0xba,0x00,0x05,0xff,0xd2,0x00,0x05,0xff,0xea,0x00,0x06,0x00,0x02,0x00,0x06,0x00,0x1a,0x00,0x06,0x00,0x32,0x00,0x06,0x00,0x4a,0x00,0x06,0x00,0x62,0x00,0x06,0x00,0x7a,0x00,0x06,0x00,0x92,0x00,0x06,0x01,0xbe,0x00,0x06,0x01,0xde, -0x00,0x06,0x01,0xfe,0x00,0x06,0x02,0x2a,0x00,0x06,0x02,0x56,0x00,0x06,0x02,0x8c,0x00,0x06,0x02,0xa4,0x00,0x06,0x02,0xbc,0x00,0x06,0x04,0x04,0x00,0x06,0x05,0x88,0x00,0x06,0x05,0xa0,0x00,0x06,0x05,0xb8,0x00,0x06,0x07,0x4a,0x00,0x06,0x09,0x18,0x00,0x06,0x0a,0x9e,0x00,0x06,0x0c,0x5c,0x00,0x06,0x0c,0x8a,0x00,0x06,0x0c,0xb8, -0x00,0x06,0x0c,0xe6,0x00,0x06,0x0d,0x14,0x00,0x06,0x0d,0x42,0x00,0x06,0x0d,0x70,0x00,0x06,0x0d,0x88,0x00,0x06,0x0d,0xa0,0x00,0x06,0x0d,0xb8,0x00,0x06,0x0d,0xd0,0x00,0x06,0x0d,0xe8,0x00,0x06,0x0e,0x00,0x00,0x06,0x0e,0x18,0x00,0x06,0x0e,0x30,0x00,0x06,0x0e,0x54,0x00,0x06,0x0e,0x7c,0x00,0x06,0x0e,0xa8,0x00,0x06,0x0e,0xd4, -0x00,0x06,0x0e,0xf8,0x00,0x06,0x0f,0x20,0x00,0x06,0x0f,0x4c,0x00,0x06,0x0f,0x78,0x00,0x06,0x0f,0x9e,0x00,0x06,0x0f,0xc2,0x00,0x06,0x0f,0xe6,0x00,0x06,0x10,0x0a,0x00,0x06,0x10,0x24,0x00,0x06,0x10,0x3e,0x00,0x06,0x10,0x58,0x00,0x06,0x10,0x72,0x00,0x06,0x10,0x9a,0x00,0x06,0x10,0xbe,0x00,0x06,0x10,0xe6,0x00,0x06,0x11,0x0a, -0x00,0x06,0x12,0x42,0x00,0x06,0x13,0xbc,0x00,0x06,0x13,0xe0,0x00,0x06,0x14,0x04,0x00,0x06,0x14,0x28,0x00,0x06,0x14,0x4c,0x00,0x06,0x14,0x70,0x00,0x06,0x14,0x94,0x00,0x06,0x14,0xac,0x00,0x06,0x14,0xc4,0x00,0x06,0x14,0xdc,0x00,0x06,0x14,0xf4,0x00,0x06,0x15,0x0c,0x00,0x06,0x15,0x24,0x00,0x06,0x15,0x3c,0x00,0x06,0x15,0x54, -0x00,0x06,0x15,0x86,0x00,0x06,0x15,0xd2,0x00,0x06,0x16,0x1a,0x00,0x06,0x16,0x8a,0x00,0x06,0x16,0xf2,0x00,0x06,0x17,0x56,0x00,0x06,0x17,0xd0,0x00,0x06,0x18,0x8c,0x00,0x06,0x19,0x34,0x00,0x06,0x19,0x60,0x00,0x06,0x19,0xd0,0x00,0x06,0x1a,0x48,0x00,0x06,0x1a,0x74,0x00,0x06,0x1a,0xbc,0x00,0x06,0x1b,0x08,0x00,0x06,0x1b,0xde, -0x00,0x06,0x1c,0x78,0x00,0x06,0x1d,0x76,0x00,0x06,0x1d,0x98,0x00,0x06,0x1d,0xae,0x00,0x06,0x1d,0xc4,0x00,0x06,0x1d,0xee,0x00,0x06,0x1e,0x04,0x00,0x06,0x1e,0x28,0x00,0x06,0x1e,0x3e,0x00,0x06,0x1e,0x56,0x00,0x06,0x1e,0x7a,0x00,0x06,0x1e,0x9e,0x00,0x06,0x1f,0x82,0x00,0x06,0x20,0x96,0x00,0x06,0x20,0xae,0x00,0x06,0x20,0xc6, -0x00,0x06,0x20,0xe6,0x00,0x06,0x21,0x06,0x00,0x06,0x21,0x1e,0x00,0x06,0x21,0x36,0x00,0x06,0x21,0x56,0x00,0x06,0x21,0x76,0x00,0x06,0x21,0x96,0x00,0x06,0x21,0xb6,0x00,0x06,0x21,0xce,0x00,0x06,0x21,0xe6,0x00,0x06,0x21,0xfe,0x00,0x06,0x22,0x16,0x00,0x06,0x22,0x44,0x00,0x06,0x22,0x72,0x00,0x06,0x22,0x96,0x00,0x06,0x22,0xba, -0x00,0x06,0x22,0xd2,0x00,0x06,0x22,0xea,0x00,0x06,0x23,0xec,0x00,0x06,0x25,0x12,0x00,0x06,0x25,0x2a,0x00,0x06,0x25,0x42,0x00,0x06,0x25,0x5a,0x00,0x06,0x25,0x72,0x00,0x06,0x25,0x8a,0x00,0x06,0x25,0xa2,0x00,0x06,0x25,0xc2,0x00,0x06,0x25,0xe2,0x00,0x06,0x26,0x42,0x00,0x06,0x26,0xc8,0x00,0x06,0x26,0xde,0x00,0x06,0x26,0xf4, -0x00,0x06,0x27,0x0c,0x00,0x06,0x27,0x24,0x00,0x06,0x27,0x4c,0x00,0x06,0x27,0x74,0x00,0x06,0x27,0x8c,0x00,0x06,0x27,0xa4,0x00,0x06,0x27,0xbc,0x00,0x06,0x27,0xd4,0x00,0x06,0x28,0x68,0x00,0x06,0x28,0x80,0x00,0x06,0x28,0x98,0x00,0x06,0x28,0xb0,0x00,0x06,0x28,0xc8,0x00,0x06,0x28,0xe0,0x00,0x06,0x29,0x04,0x00,0x06,0x29,0x24, -0x00,0x06,0x29,0x3c,0x00,0x06,0x29,0x54,0x00,0x06,0x29,0x6c,0x00,0x06,0x29,0x84,0x00,0x06,0x29,0x9c,0x00,0x06,0x29,0xb4,0x00,0x06,0x29,0xe2,0x00,0x06,0x2a,0x06,0x00,0x06,0x2a,0x2a,0x00,0x06,0x2a,0x42,0x00,0x06,0x2a,0x5a,0x00,0x06,0x2b,0x30,0x00,0x06,0x2b,0x48,0x00,0x06,0x2b,0x60,0x00,0x06,0x2c,0x54,0x00,0x06,0x2c,0x6c, -0x00,0x06,0x2c,0x84,0x00,0x06,0x2c,0xac,0x00,0x06,0x2c,0xd4,0x00,0x06,0x2c,0xf8,0x00,0x06,0x2d,0xc4,0x00,0x06,0x2e,0x52,0x00,0x06,0x2e,0xe0,0x00,0x06,0x2e,0xf8,0x00,0x06,0x2f,0x10,0x00,0x06,0x2f,0x34,0x00,0x06,0x2f,0x58,0x00,0x06,0x2f,0x7c,0x00,0x06,0x2f,0xa0,0x00,0x06,0x2f,0xb0,0x00,0x06,0x2f,0xc8,0x00,0x06,0x2f,0xe0, -0x00,0x06,0x30,0x2c,0x00,0x06,0x30,0xa6,0x00,0x06,0x31,0x7a,0x00,0x06,0x31,0x92,0x00,0x06,0x32,0x5e,0x00,0x06,0x33,0xde,0x00,0x06,0x34,0xa2,0x00,0x06,0x35,0xf2,0x00,0x06,0x37,0x50,0x00,0x06,0x38,0x28,0x00,0x06,0x39,0x6a,0x00,0x06,0x39,0xde,0x00,0x06,0x3a,0x5a,0x00,0x06,0x3a,0xe2,0x00,0x06,0x3b,0x60,0x00,0x06,0x3b,0xd8, -0x00,0x06,0x3c,0x58,0x00,0x06,0x3c,0xc0,0x00,0x06,0x3d,0x30,0x00,0x06,0x3d,0x9e,0x00,0x06,0x3e,0x18,0x00,0x06,0x3e,0xae,0x00,0x06,0x3f,0x26,0x00,0x06,0x3f,0xec,0x00,0x06,0x40,0x96,0x00,0x06,0x41,0x80,0x00,0x06,0x42,0x66,0x00,0x06,0x43,0x28,0x00,0x06,0x44,0x24,0x00,0x06,0x44,0xf2,0x00,0x06,0x45,0x76,0x00,0x06,0x46,0x2e, -0x00,0x06,0x46,0xb2,0x00,0x06,0x47,0x5a,0x00,0x06,0x48,0x2a,0x00,0x06,0x48,0xd6,0x00,0x06,0x49,0xc6,0x00,0x06,0x4a,0xc0,0x00,0x06,0x4b,0xa6,0x00,0x06,0x4c,0x7a,0x00,0x06,0x4d,0xa0,0x00,0x06,0x4e,0xb8,0x00,0x06,0x4f,0x2e,0x00,0x06,0x4f,0xc4,0x00,0x06,0x50,0x7a,0x00,0x06,0x51,0x64,0x00,0x06,0x52,0x40,0x00,0x06,0x52,0xde, -0x00,0x06,0x53,0xc8,0x00,0x06,0x54,0x5a,0x00,0x06,0x54,0xe8,0x00,0x06,0x55,0xa4,0x00,0x06,0x56,0x1e,0x00,0x06,0x56,0xc2,0x00,0x06,0x57,0x8e,0x00,0x06,0x58,0x6a,0x00,0x06,0x59,0x28,0x00,0x06,0x59,0xda,0x00,0x06,0x5a,0xe6,0x00,0x06,0x5b,0xbe,0x00,0x06,0x5c,0x3e,0x00,0x06,0x5c,0xf6,0x00,0x06,0x5d,0x74,0x00,0x06,0x5e,0x1c, -0x00,0x06,0x5e,0xce,0x00,0x06,0x5f,0xb8,0x00,0x06,0x60,0x86,0x00,0x06,0x61,0xae,0x00,0x06,0x62,0x92,0x00,0x06,0x63,0x7e,0x00,0x06,0x63,0xb4,0x00,0x06,0x64,0x46,0x00,0x06,0x64,0xc2,0x00,0x06,0x65,0xa8,0x00,0x06,0x66,0xae,0x00,0x06,0x67,0x64,0x00,0x06,0x68,0x2c,0x00,0x06,0x69,0x40,0x00,0x06,0x6a,0x72,0x00,0x06,0x6b,0x30, -0x00,0x06,0x6c,0x6a,0x00,0x06,0x6d,0xd4,0x00,0x06,0x6e,0x64,0x00,0x06,0x6f,0x08,0x00,0x06,0x6f,0xd2,0x00,0x06,0x70,0x9c,0x00,0x06,0x71,0xa0,0x00,0x06,0x72,0xde,0x00,0x06,0x73,0x72,0x00,0x06,0x74,0x4c,0x00,0x06,0x74,0xfa,0x00,0x06,0x75,0x8e,0x00,0x06,0x76,0x1e,0x00,0x06,0x76,0xbc,0x00,0x06,0x77,0x76,0x00,0x06,0x78,0x9c, -0x00,0x06,0x79,0xc0,0x00,0x06,0x7b,0x2a,0x00,0x06,0x7c,0x0c,0x00,0x06,0x7c,0xc2,0x00,0x06,0x7d,0xb2,0x00,0x06,0x7e,0xb4,0x00,0x06,0x7f,0x2e,0x00,0x06,0x7f,0xd4,0x00,0x06,0x80,0x7c,0x00,0x06,0x81,0x5a,0x00,0x06,0x82,0x82,0x00,0x06,0x83,0xce,0x00,0x06,0x84,0xf2,0x00,0x06,0x85,0xd2,0x00,0x06,0x86,0xc0,0x00,0x06,0x88,0x22, -0x00,0x06,0x88,0x9e,0x00,0x06,0x89,0x9e,0x00,0x06,0x8a,0xdc,0x00,0x06,0x8b,0xf4,0x00,0x06,0x8d,0x42,0x00,0x06,0x8e,0xea,0x00,0x06,0x8f,0xe6,0x00,0x06,0x91,0x2a,0x00,0x06,0x92,0x82,0x00,0x06,0x93,0xc2,0x00,0x06,0x94,0x4c,0x00,0x06,0x95,0x4e,0x00,0x06,0x96,0x3c,0x00,0x06,0x97,0xc8,0x00,0x06,0x99,0x3c,0x00,0x06,0x9b,0x16, -0x00,0x06,0x9c,0xdc,0x00,0x06,0x9e,0x20,0x00,0x06,0xa0,0x10,0x00,0x06,0xa1,0x2e,0x00,0x06,0xa1,0xa8,0x00,0x06,0xa2,0x44,0x00,0x06,0xa2,0xee,0x00,0x06,0xa3,0xe6,0x00,0x06,0xa4,0x90,0x00,0x06,0xa5,0x24,0x00,0x06,0xa5,0xec,0x00,0x06,0xa6,0xb8,0x00,0x06,0xa7,0x38,0x00,0x06,0xa7,0xec,0x00,0x06,0xa8,0x66,0x00,0x06,0xa8,0xf2, -0x00,0x06,0xa9,0x54,0x00,0x06,0xaa,0x04,0x00,0x06,0xaa,0xb0,0x00,0x06,0xab,0xa2,0x00,0x06,0xac,0xba,0x00,0x06,0xad,0x8e,0x00,0x06,0xae,0x4a,0x00,0x06,0xaf,0x66,0x00,0x06,0xaf,0xe4,0x00,0x06,0xb0,0x40,0x00,0x06,0xb0,0xd8,0x00,0x06,0xb1,0x46,0x00,0x06,0xb1,0xac,0x00,0x06,0xb2,0x40,0x00,0x06,0xb2,0xd6,0x00,0x06,0xb3,0x2a, -0x00,0x06,0xb4,0x1e,0x00,0x06,0xb5,0x10,0x00,0x06,0xb5,0x92,0x00,0x06,0xb6,0x6e,0x00,0x06,0xb7,0xdc,0x00,0x06,0xb8,0xc8,0x00,0x06,0xb9,0xe6,0x00,0x06,0xbb,0x7e,0x00,0x06,0xbc,0x9e,0x00,0x06,0xbd,0xca,0x00,0x06,0xbe,0xf6,0x00,0x06,0xc0,0x34,0x00,0x06,0xc0,0xb8,0x00,0x06,0xc1,0x84,0x00,0x06,0xc2,0x8a,0x00,0x06,0xc3,0xbe, -0x00,0x06,0xc4,0x62,0x00,0x06,0xc5,0x48,0x00,0x06,0xc6,0x4a,0x00,0x06,0xc7,0x48,0x00,0x06,0xc8,0x20,0x00,0x06,0xc9,0x02,0x00,0x06,0xc9,0x7c,0x00,0x06,0xc9,0xec,0x00,0x06,0xca,0xb6,0x00,0x06,0xcb,0x68,0x00,0x06,0xcc,0x1e,0x00,0x06,0xcd,0x0a,0x00,0x06,0xcd,0xf0,0x00,0x06,0xce,0xe0,0x00,0x06,0xcf,0x48,0x00,0x06,0xd0,0x06, -0x00,0x06,0xd0,0xbc,0x00,0x06,0xd1,0xc8,0x00,0x06,0xd1,0xf2,0x00,0x06,0xd3,0x3c,0x00,0x06,0xd4,0x46,0x00,0x06,0xd4,0xea,0x00,0x06,0xd5,0x96,0x00,0x06,0xd6,0x70,0x00,0x06,0xd7,0x4a,0x00,0x06,0xd8,0x6a,0x00,0x06,0xd9,0xb0,0x00,0x06,0xda,0x42,0x00,0x06,0xda,0xec,0x00,0x06,0xdb,0xc6,0x00,0x06,0xdc,0xaa,0x00,0x06,0xdd,0x6e, -0x00,0x06,0xde,0x6e,0x00,0x06,0xdf,0x10,0x00,0x06,0xdf,0xa8,0x00,0x06,0xe0,0x40,0x00,0x06,0xe0,0xb6,0x00,0x06,0xe0,0xc6,0x00,0x06,0xe0,0xec,0x00,0x06,0xe1,0x1a,0x00,0x06,0xe1,0x4e,0x00,0x06,0xe1,0x5e,0x00,0x06,0xe1,0x8e,0x00,0x06,0xe1,0xbc,0x00,0x06,0xe1,0xf2,0x00,0x06,0xe2,0x28,0x00,0x06,0xe2,0x5e,0x00,0x06,0xe2,0x94, -0x00,0x06,0xe2,0xca,0x00,0x06,0xe3,0x00,0x00,0x06,0xe3,0x2e,0x00,0x06,0xe3,0x5c,0x00,0x06,0xe3,0x8a,0x00,0x06,0xe3,0xbc,0x00,0x06,0xe3,0xee,0x00,0x06,0xe4,0x20,0x00,0x06,0xe4,0x30,0x00,0x06,0xe4,0x54,0x00,0x06,0xe4,0x64,0x00,0x06,0xe4,0x92,0x00,0x06,0xe4,0xaa,0x00,0x06,0xe4,0xd8,0x00,0x06,0xe4,0xfc,0x00,0x06,0xe5,0x2c, -0x00,0x06,0xe5,0x5a,0x00,0x06,0xe5,0x88,0x00,0x06,0xe5,0xbe,0x00,0x06,0xe5,0xec,0x00,0x06,0xe6,0x1a,0x00,0x06,0xe6,0x48,0x00,0x06,0xe6,0x76,0x00,0x06,0xe6,0xa4,0x00,0x06,0xe6,0xd2,0x00,0x06,0xe8,0x96,0x00,0x06,0xea,0x76,0x00,0x06,0xec,0x72,0x00,0x06,0xee,0x4e,0x00,0x06,0xef,0x2e,0x00,0x06,0xf0,0x3c,0x00,0x06,0xf1,0xda, -0x00,0x06,0xf2,0x78,0x00,0x06,0xf3,0x62,0x00,0x06,0xf4,0x36,0x00,0x06,0xf4,0xaa,0x00,0x06,0xf5,0x16,0x00,0x06,0xf5,0xe0,0x00,0x06,0xf6,0xcc,0x00,0x06,0xf7,0xc0,0x00,0x06,0xf9,0x00,0x00,0x06,0xf9,0x86,0x00,0x06,0xfa,0xe8,0x00,0x06,0xfb,0xce,0x00,0x06,0xfd,0x0c,0x00,0x06,0xfe,0xa2,0x00,0x07,0x00,0x16,0x00,0x07,0x01,0x4c, -0x00,0x07,0x02,0x24,0x00,0x07,0x03,0x26,0x00,0x07,0x04,0x1a,0x00,0x07,0x05,0x08,0x00,0x07,0x06,0x42,0x00,0x07,0x07,0xa8,0x00,0x07,0x08,0xea,0x00,0x07,0x09,0xe4,0x00,0x07,0x0a,0x7e,0x00,0x07,0x0b,0x2c,0x00,0x07,0x0d,0x52,0x00,0x07,0x0e,0x90,0x00,0x07,0x0f,0xa8,0x00,0x07,0x10,0xa4,0x00,0x07,0x11,0x64,0x00,0x07,0x12,0x8a, -0x00,0x07,0x13,0x32,0x00,0x07,0x14,0x3a,0x00,0x07,0x15,0xcc,0x00,0x07,0x16,0xda,0x00,0x07,0x18,0x22,0x00,0x07,0x18,0x6a,0x00,0x07,0x18,0x98,0x00,0x07,0x18,0xee,0x00,0x07,0x19,0x1a,0x00,0x07,0x19,0x44,0x00,0x07,0x19,0x7c,0x00,0x07,0x19,0xde,0x00,0x07,0x1a,0x34,0x00,0x07,0x1a,0x5e,0x00,0x07,0x1a,0xa6,0x00,0x07,0x1a,0xee, -0x00,0x07,0x1b,0x1a,0x00,0x07,0x1b,0xcc,0x00,0x07,0x1c,0x78,0x00,0x07,0x1c,0xd8,0x00,0x07,0x1d,0x32,0x00,0x07,0x1d,0x92,0x00,0x07,0x1e,0x3a,0x00,0x07,0x1e,0x98,0x00,0x07,0x1f,0x42,0x00,0x07,0x20,0x52,0x00,0x07,0x20,0x64,0x00,0x07,0x23,0xe8,0x00,0x07,0x27,0x46,0x00,0x07,0x2a,0xd6,0x00,0x07,0x2b,0x02,0x00,0x07,0x2b,0x2e, -0x00,0x07,0x2b,0x5a,0x00,0x07,0x2b,0x86,0x00,0x07,0x2b,0xb2,0x00,0x07,0x2b,0xde,0x00,0x07,0x2c,0x16,0x00,0x07,0x2c,0x4e,0x00,0x07,0x2c,0x84,0x00,0x07,0x2c,0xba,0x00,0x07,0x2c,0xee,0x00,0x07,0x2d,0x22,0x00,0x07,0x2d,0x56,0x00,0x07,0x2d,0x8a,0x00,0x07,0x2d,0xbe,0x00,0x07,0x2d,0xea,0x00,0x07,0x2e,0x16,0x00,0x07,0x2e,0x42, -0x00,0x07,0x2e,0xe0,0x00,0x07,0x2f,0x62,0x00,0x07,0x2f,0x98,0x00,0x07,0x30,0x0a,0x00,0x07,0x30,0x80,0x00,0x07,0x31,0x16,0x00,0x07,0x31,0x70,0x00,0x07,0x31,0xc4,0x00,0x07,0x32,0x1e,0x00,0x07,0x32,0x72,0x00,0x07,0x32,0xd4,0x00,0x07,0x33,0x16,0x00,0x07,0x33,0x9e,0x00,0x07,0x33,0xfe,0x00,0x07,0x34,0x3e,0x00,0x07,0x34,0x9a, -0x00,0x07,0x34,0xf2,0x00,0x07,0x35,0x4a,0x00,0x07,0x35,0xa2,0x00,0x07,0x36,0x12,0x00,0x07,0x36,0xd0,0x00,0x07,0x37,0x4a,0x00,0x07,0x37,0xe0,0x00,0x07,0x38,0x5a,0x00,0x07,0x38,0xee,0x00,0x07,0x39,0x88,0x00,0x07,0x3a,0x10,0x00,0x07,0x3a,0x9c,0x00,0x07,0x3b,0x6a,0x00,0x07,0x3b,0xfc,0x00,0x07,0x3c,0xa2,0x00,0x07,0x3d,0x6a, -0x00,0x07,0x3e,0x1c,0x00,0x07,0x3e,0xc6,0x00,0x07,0x3f,0xac,0x00,0x07,0x40,0x8c,0x00,0x07,0x41,0x2c,0x00,0x07,0x41,0xbc,0x00,0x07,0x42,0x16,0x00,0x07,0x42,0x72,0x00,0x07,0x43,0x16,0x00,0x07,0x43,0xae,0x00,0x07,0x44,0xac,0x00,0x07,0x45,0x58,0x00,0x07,0x46,0x46,0x00,0x07,0x47,0x0a,0x00,0x07,0x47,0x96,0x00,0x07,0x48,0x1a, -0x00,0x07,0x48,0xb2,0x00,0x07,0x49,0x48,0x00,0x07,0x49,0xf6,0x00,0x07,0x4a,0xa0,0x00,0x07,0x4b,0x50,0x00,0x07,0x4b,0xe8,0x00,0x07,0x4c,0x8e,0x00,0x07,0x4d,0x66,0x00,0x07,0x4d,0xe4,0x00,0x07,0x4e,0x5a,0x00,0x07,0x4f,0x4e,0x00,0x07,0x50,0x40,0x00,0x07,0x50,0xea,0x00,0x07,0x51,0x94,0x00,0x07,0x52,0x22,0x00,0x07,0x52,0xb0, -0x00,0x07,0x53,0x0a,0x00,0x07,0x53,0x64,0x00,0x07,0x53,0xf4,0x00,0x07,0x54,0x80,0x00,0x07,0x54,0xfa,0x00,0x07,0x55,0x60,0x00,0x07,0x56,0x0e,0x00,0x07,0x56,0x9c,0x00,0x07,0x57,0x4e,0x00,0x07,0x57,0xee,0x00,0x07,0x58,0xca,0x00,0x07,0x59,0x94,0x00,0x07,0x5a,0xd0,0x00,0x07,0x5b,0xf8,0x00,0x07,0x5f,0x70,0x00,0x07,0x5f,0xbc, -0x00,0x07,0x61,0x1e,0x00,0x07,0x61,0x9c,0x00,0x07,0x62,0xf2,0x00,0x07,0x63,0xa8,0x00,0x07,0x63,0xee,0x00,0x07,0x64,0x54,0x00,0x07,0x64,0x9a,0x00,0x07,0x65,0x00,0x00,0x07,0x65,0x9a,0x00,0x07,0x66,0x2e,0x00,0x07,0x66,0xbe,0x00,0x07,0x67,0x50,0x00,0x07,0x68,0x5e,0x00,0x07,0x69,0x64,0x00,0x07,0x69,0xfe,0x00,0x07,0x6a,0x9e, -0x00,0x07,0x6b,0x7c,0x00,0x07,0x6c,0x60,0x00,0x07,0x6c,0xfa,0x00,0x07,0x6d,0x90,0x00,0x07,0x6d,0xf0,0x00,0x07,0x6e,0x50,0x00,0x07,0x6f,0x04,0x00,0x07,0x6f,0xb4,0x00,0x07,0x70,0x26,0x00,0x07,0x70,0x94,0x00,0x07,0x71,0x10,0x00,0x07,0x71,0x88,0x00,0x07,0x72,0x04,0x00,0x07,0x72,0x88,0x00,0x07,0x73,0x5a,0x00,0x07,0x74,0x24, -0x00,0x07,0x74,0xc4,0x00,0x07,0x76,0x6c,0x00,0x07,0x76,0xaa,0x00,0x07,0x76,0xec,0x00,0x07,0x77,0x6e,0x00,0x07,0x78,0x3c,0x00,0x07,0x78,0x3c,0x00,0x07,0x78,0x54,0x00,0x07,0x79,0x28,0x00,0x07,0x79,0xb4,0x00,0x07,0x7b,0x6e,0x00,0x07,0x7d,0x2a,0x00,0x07,0x7d,0x4e,0x00,0x07,0x7d,0x78,0x00,0x07,0x7e,0x02,0x00,0x07,0x7e,0x74, -0x00,0x07,0x7e,0xf6,0x00,0x07,0x7f,0xaa,0x00,0x07,0x80,0x04,0x00,0x07,0x80,0x8e,0x00,0x07,0x81,0x4c,0x00,0x07,0x81,0x92,0x00,0x07,0x82,0x84,0x00,0x07,0x83,0x42,0x00,0x07,0x83,0xba,0x00,0x07,0x83,0xca,0x00,0x07,0x85,0x86,0x00,0x07,0x87,0x42,0x00,0x07,0x89,0x66,0x00,0x07,0x8b,0x76,0x00,0x07,0x8d,0x72,0x00,0x07,0x8f,0x3e, -0x00,0x07,0x91,0x0c,0x00,0x07,0x92,0xda,0x00,0x07,0x94,0xf4,0x00,0x07,0x95,0xc6,0x00,0x07,0x96,0x1e,0x00,0x07,0x96,0x9a,0x00,0x07,0x97,0x08,0x00,0x07,0x97,0x92,0x00,0x07,0x98,0x28,0x00,0x07,0x98,0xa0,0x00,0x07,0x99,0x3a,0x00,0x07,0x99,0xbc,0x00,0x07,0x9a,0x10,0x00,0x07,0x9a,0x86,0x00,0x07,0x9a,0xea,0x00,0x07,0x9b,0x5c, -0x00,0x07,0x9b,0xe8,0x00,0x07,0x9c,0x5c,0x00,0x07,0x9d,0x06,0x00,0x07,0x9d,0xa6,0x00,0x07,0x9e,0x32,0x00,0x07,0x9e,0xc2,0x00,0x07,0x9f,0x78,0x00,0x07,0xa0,0x2a,0x00,0x07,0xa0,0x76,0x00,0x07,0xa0,0xd6,0x00,0x07,0xa1,0x3e,0x00,0x07,0xa1,0xc0,0x00,0x07,0xa2,0x4a,0x00,0x07,0xa2,0xa0,0x00,0x07,0xa3,0x22,0x00,0x07,0xa3,0x74, -0x00,0x07,0xa3,0xc6,0x00,0x07,0xa4,0x38,0x00,0x07,0xa4,0x8c,0x00,0x07,0xa4,0xf4,0x00,0x07,0xa5,0x6a,0x00,0x07,0xa5,0xec,0x00,0x07,0xa6,0x52,0x00,0x07,0xa6,0xba,0x00,0x07,0xa7,0x56,0x00,0x07,0xa7,0xda,0x00,0x07,0xa8,0x28,0x00,0x07,0xa8,0x88,0x00,0x07,0xa8,0xe4,0x00,0x07,0xa9,0x52,0x00,0x07,0xa9,0xc6,0x00,0x07,0xaa,0x58, -0x00,0x07,0xaa,0xd2,0x00,0x07,0xab,0x8a,0x00,0x07,0xac,0x18,0x00,0x07,0xac,0xb4,0x00,0x07,0xac,0xd4,0x00,0x07,0xad,0x2a,0x00,0x07,0xad,0x86,0x00,0x07,0xae,0x14,0x00,0x07,0xae,0xb8,0x00,0x07,0xaf,0x1c,0x00,0x07,0xaf,0x94,0x00,0x07,0xb0,0x46,0x00,0x07,0xb0,0xfe,0x00,0x07,0xb1,0x7a,0x00,0x07,0xb2,0x3c,0x00,0x07,0xb3,0x16, -0x00,0x07,0xb3,0x82,0x00,0x07,0xb3,0xe8,0x00,0x07,0xb4,0x6c,0x00,0x07,0xb4,0xe4,0x00,0x07,0xb5,0x82,0x00,0x07,0xb6,0x42,0x00,0x07,0xb6,0x9e,0x00,0x07,0xb7,0x24,0x00,0x07,0xb7,0x90,0x00,0x07,0xb7,0xec,0x00,0x07,0xb8,0x58,0x00,0x07,0xb8,0xc0,0x00,0x07,0xb9,0x36,0x00,0x07,0xb9,0xe2,0x00,0x07,0xba,0x94,0x00,0x07,0xbb,0x66, -0x00,0x07,0xbb,0xe4,0x00,0x07,0xbc,0x58,0x00,0x07,0xbc,0xf0,0x00,0x07,0xbd,0x82,0x00,0x07,0xbd,0xda,0x00,0x07,0xbe,0x4a,0x00,0x07,0xbe,0xb4,0x00,0x07,0xbf,0x42,0x00,0x07,0xbf,0xfe,0x00,0x07,0xc0,0xda,0x00,0x07,0xc1,0x94,0x00,0x07,0xc2,0x2c,0x00,0x07,0xc2,0xc2,0x00,0x07,0xc3,0xa0,0x00,0x07,0xc3,0xfc,0x00,0x07,0xc4,0x9e, -0x00,0x07,0xc5,0x6c,0x00,0x07,0xc6,0x12,0x00,0x07,0xc6,0xdc,0x00,0x07,0xc7,0xda,0x00,0x07,0xc8,0x72,0x00,0x07,0xc9,0x3c,0x00,0x07,0xca,0x16,0x00,0x07,0xca,0xdc,0x00,0x07,0xcb,0x46,0x00,0x07,0xcb,0xe6,0x00,0x07,0xcc,0x7a,0x00,0x07,0xcd,0x7e,0x00,0x07,0xce,0x68,0x00,0x07,0xcf,0x88,0x00,0x07,0xd0,0xa2,0x00,0x07,0xd1,0x60, -0x00,0x07,0xd2,0xaa,0x00,0x07,0xd3,0x64,0x00,0x07,0xd3,0xc0,0x00,0x07,0xd4,0x26,0x00,0x07,0xd4,0x98,0x00,0x07,0xd5,0x2c,0x00,0x07,0xd5,0xa2,0x00,0x07,0xd5,0xfc,0x00,0x07,0xd6,0x86,0x00,0x07,0xd7,0x0c,0x00,0x07,0xd7,0x5c,0x00,0x07,0xd7,0xd2,0x00,0x07,0xd8,0x2a,0x00,0x07,0xd8,0x82,0x00,0x07,0xd8,0xc0,0x00,0x07,0xd9,0x28, -0x00,0x07,0xd9,0x90,0x00,0x07,0xda,0x26,0x00,0x07,0xda,0xce,0x00,0x07,0xdb,0x60,0x00,0x07,0xdb,0xd4,0x00,0x07,0xdc,0x7e,0x00,0x07,0xdc,0xd8,0x00,0x07,0xdd,0x08,0x00,0x07,0xdd,0x6e,0x00,0x07,0xdd,0xb0,0x00,0x07,0xdd,0xe0,0x00,0x07,0xde,0x3e,0x00,0x07,0xde,0x9e,0x00,0x07,0xde,0xc8,0x00,0x07,0xdf,0x64,0x00,0x07,0xdf,0xfc, -0x00,0x07,0xe0,0x58,0x00,0x07,0xe0,0xde,0x00,0x07,0xe1,0xc6,0x00,0x07,0xe2,0x54,0x00,0x07,0xe3,0x04,0x00,0x07,0xe3,0xfa,0x00,0x07,0xe4,0xa4,0x00,0x07,0xe5,0x5a,0x00,0x07,0xe6,0x1a,0x00,0x07,0xe6,0xd4,0x00,0x07,0xe7,0x38,0x00,0x07,0xe7,0xc6,0x00,0x07,0xe8,0x7e,0x00,0x07,0xe9,0x66,0x00,0x07,0xe9,0xde,0x00,0x07,0xea,0x7a, -0x00,0x07,0xeb,0x32,0x00,0x07,0xeb,0xe6,0x00,0x07,0xec,0x7e,0x00,0x07,0xed,0x20,0x00,0x07,0xed,0x76,0x00,0x07,0xed,0xc0,0x00,0x07,0xee,0x3a,0x00,0x07,0xee,0xac,0x00,0x07,0xef,0x1c,0x00,0x07,0xef,0xae,0x00,0x07,0xf0,0x44,0x00,0x07,0xf0,0xd6,0x00,0x07,0xf1,0x14,0x00,0x07,0xf1,0x86,0x00,0x07,0xf1,0xf0,0x00,0x07,0xf2,0xa0, -0x00,0x07,0xf2,0xb8,0x00,0x07,0xf3,0x82,0x00,0x07,0xf4,0x1e,0x00,0x07,0xf4,0x66,0x00,0x07,0xf4,0xc8,0x00,0x07,0xf5,0x44,0x00,0x07,0xf5,0xc6,0x00,0x07,0xf6,0x78,0x00,0x07,0xf7,0x3c,0x00,0x07,0xf7,0x5c,0x00,0x07,0xf7,0x80,0x00,0x07,0xf7,0xa4,0x00,0x07,0xf7,0xb4,0x00,0x07,0xf7,0xce,0x00,0x07,0xf7,0xde,0x00,0x07,0xf7,0xf6, -0x00,0x07,0xf8,0x0e,0x00,0x07,0xf8,0x26,0x00,0x07,0xf8,0x3e,0x00,0x07,0xf8,0xe2,0x00,0x07,0xf9,0x6e,0x00,0x07,0xf9,0xc0,0x00,0x07,0xfa,0x14,0x00,0x07,0xfa,0x96,0x00,0x07,0xfb,0x18,0x00,0x07,0xfb,0xe0,0x00,0x07,0xfc,0xb4,0x00,0x07,0xfd,0x74,0x00,0x07,0xfe,0x36,0x00,0x07,0xfe,0xd4,0x00,0x07,0xff,0x68,0x00,0x08,0x00,0x3e, -0x00,0x08,0x01,0x08,0x00,0x08,0x01,0x5a,0x00,0x08,0x01,0xf4,0x00,0x08,0x02,0xd2,0x00,0x08,0x03,0xf6,0x00,0x08,0x04,0xd6,0x00,0x08,0x05,0xce,0x00,0x08,0x06,0x6e,0x00,0x08,0x07,0x4e,0x00,0x08,0x07,0xe8,0x00,0x08,0x08,0xaa,0x00,0x08,0x09,0x68,0x00,0x08,0x0a,0x42,0x00,0x08,0x0b,0x0c,0x00,0x08,0x0b,0xf8,0x00,0x08,0x0c,0xa2, -0x00,0x08,0x0d,0x40,0x00,0x08,0x0d,0xda,0x00,0x08,0x0e,0x66,0x00,0x08,0x0f,0x06,0x00,0x08,0x0f,0x92,0x00,0x08,0x10,0x54,0x00,0x08,0x11,0x0c,0x00,0x08,0x11,0x62,0x00,0x08,0x11,0xb4,0x00,0x08,0x12,0x0e,0x00,0x08,0x12,0x62,0x00,0x08,0x13,0x1e,0x00,0x08,0x13,0xc4,0x00,0x08,0x14,0xa6,0x00,0x08,0x15,0x72,0x00,0x08,0x16,0x6a, -0x00,0x08,0x17,0x3c,0x00,0x08,0x17,0xdc,0x00,0x08,0x18,0x98,0x00,0x08,0x19,0x38,0x00,0x08,0x19,0xe8,0x00,0x08,0x1a,0xac,0x00,0x08,0x1b,0x86,0x00,0x08,0x1c,0x62,0x00,0x08,0x1d,0x20,0x00,0x08,0x1e,0x26,0x00,0x08,0x1f,0x12,0x00,0x08,0x1f,0xa2,0x00,0x08,0x20,0x2e,0x00,0x08,0x20,0xda,0x00,0x08,0x21,0x82,0x00,0x08,0x22,0x12, -0x00,0x08,0x22,0xaa,0x00,0x08,0x23,0x94,0x00,0x08,0x24,0x74,0x00,0x08,0x25,0x4c,0x00,0x08,0x26,0x24,0x00,0x08,0x26,0xd4,0x00,0x08,0x27,0x92,0x00,0x08,0x28,0x2e,0x00,0x08,0x28,0xe8,0x00,0x08,0x29,0x40,0x00,0x08,0x29,0x94,0x00,0x08,0x2a,0x4a,0x00,0x08,0x2b,0x04,0x00,0x08,0x2b,0xb2,0x00,0x08,0x2c,0x60,0x00,0x08,0x2d,0x0e, -0x00,0x08,0x2d,0xba,0x00,0x08,0x2e,0x68,0x00,0x08,0x2f,0x2a,0x00,0x08,0x2f,0x8a,0x00,0x08,0x30,0x60,0x00,0x08,0x30,0xfc,0x00,0x08,0x31,0x86,0x00,0x08,0x32,0x52,0x00,0x08,0x33,0x20,0x00,0x08,0x33,0xfa,0x00,0x08,0x34,0x8e,0x00,0x08,0x35,0x2c,0x00,0x08,0x35,0xa0,0x00,0x08,0x36,0x10,0x00,0x08,0x36,0xe6,0x00,0x08,0x37,0xba, -0x00,0x08,0x38,0x80,0x00,0x08,0x38,0xba,0x00,0x08,0x38,0xea,0x00,0x08,0x39,0x7c,0x00,0x08,0x3a,0x06,0x00,0x08,0x3a,0x64,0x00,0x08,0x3a,0xc0,0x00,0x08,0x3b,0x56,0x00,0x08,0x3b,0xd0,0x00,0x08,0x3c,0x20,0x00,0x08,0x3c,0xfa,0x00,0x08,0x3d,0x8c,0x00,0x08,0x3e,0x08,0x00,0x08,0x3e,0xaa,0x00,0x08,0x3f,0x34,0x00,0x08,0x40,0x22, -0x00,0x08,0x41,0x1a,0x00,0x08,0x41,0xe2,0x00,0x08,0x42,0x96,0x00,0x08,0x43,0x7a,0x00,0x08,0x44,0x30,0x00,0x08,0x45,0x20,0x00,0x08,0x45,0xb8,0x00,0x08,0x46,0x96,0x00,0x08,0x47,0x70,0x00,0x08,0x47,0xf4,0x00,0x08,0x48,0x9c,0x00,0x08,0x49,0xa6,0x00,0x08,0x4a,0x40,0x00,0x08,0x4a,0x94,0x00,0x08,0x4b,0x02,0x00,0x08,0x4b,0x9c, -0x00,0x08,0x4b,0xce,0x00,0x08,0x4c,0xa8,0x00,0x08,0x4c,0xd2,0x00,0x08,0x4c,0xfe,0x00,0x08,0x4d,0x36,0x00,0x08,0x4d,0x60,0x00,0x08,0x4d,0x8a,0x00,0x08,0x4d,0xb4,0x00,0x08,0x4d,0xde,0x00,0x08,0x4e,0x0a,0x00,0x08,0x4e,0x36,0x00,0x08,0x4e,0x4e,0x00,0x08,0x4e,0x5e,0x00,0x08,0x4e,0x6e,0x00,0x08,0x4e,0x7e,0x00,0x08,0x4e,0x8e, -0x00,0x08,0x4e,0xa6,0x00,0x08,0x4e,0xc6,0x00,0x08,0x4e,0xd6,0x00,0x08,0x4e,0xe6,0x00,0x08,0x4e,0xf6,0x00,0x08,0x4f,0x06,0x00,0x08,0x4f,0xaa,0x00,0x08,0x50,0x6e,0x00,0x08,0x51,0xc8,0x00,0x08,0x52,0x4e,0x00,0x08,0x52,0xec,0x00,0x08,0x53,0x44,0x00,0x08,0x54,0x5c,0x00,0x08,0x56,0x3a,0x00,0x08,0x56,0x64,0x00,0x08,0x56,0x8e, -0x00,0x08,0x57,0x2e,0x00,0x08,0x57,0xa2,0x00,0x08,0x58,0x2c,0x00,0x08,0x58,0x8a,0x00,0x08,0x59,0x3e,0x00,0x08,0x5a,0x14,0x00,0x08,0x5a,0xaa,0x00,0x08,0x5b,0x62,0x00,0x08,0x5c,0x16,0x00,0x08,0x5c,0xd0,0x00,0x08,0x5d,0xa0,0x00,0x08,0x5e,0x6c,0x00,0x08,0x5f,0x6c,0x00,0x08,0x60,0x3a,0x00,0x08,0x61,0x24,0x00,0x08,0x62,0x40, -0x00,0x08,0x63,0x1e,0x00,0x08,0x63,0xe0,0x00,0x08,0x64,0xc0,0x00,0x08,0x65,0x9c,0x00,0x08,0x66,0x1e,0x00,0x08,0x66,0x8c,0x00,0x08,0x67,0x10,0x00,0x08,0x67,0xac,0x00,0x08,0x68,0x70,0x00,0x08,0x69,0x26,0x00,0x08,0x69,0xfc,0x00,0x08,0x6a,0xd6,0x00,0x08,0x6b,0xc0,0x00,0x08,0x6c,0x5e,0x00,0x08,0x6d,0x12,0x00,0x08,0x6e,0x22, -0x00,0x08,0x6e,0xd8,0x00,0x08,0x6f,0x42,0x00,0x08,0x6f,0xc2,0x00,0x08,0x70,0x9e,0x00,0x08,0x71,0x44,0x00,0x08,0x72,0x00,0x00,0x08,0x72,0xa8,0x00,0x08,0x73,0x58,0x00,0x08,0x74,0x4c,0x00,0x08,0x75,0x34,0x00,0x08,0x75,0x88,0x00,0x08,0x76,0x2c,0x00,0x08,0x76,0x80,0x00,0x08,0x77,0x1a,0x00,0x08,0x78,0x46,0x00,0x08,0x78,0xe0, -0x00,0x08,0x78,0xfa,0x00,0x08,0x79,0x20,0x00,0x08,0x79,0xa8,0x00,0x08,0x79,0xc2,0x00,0x08,0x79,0xe8,0x00,0x08,0x7a,0x70,0x00,0x08,0x7a,0x9e,0x00,0x08,0x7b,0xb2,0x00,0x08,0x7b,0xe0,0x00,0x08,0x7c,0x7a,0x00,0x08,0x7c,0xe2,0x00,0x08,0x7d,0x08,0x00,0x08,0x7d,0x2e,0x00,0x08,0x7d,0x52,0x00,0x08,0x7d,0x78,0x00,0x08,0x7d,0x9c, -0x00,0x08,0x7d,0xc2,0x00,0x08,0x7d,0xfe,0x00,0x08,0x7e,0x46,0x00,0x08,0x7e,0x78,0x00,0x08,0x7f,0x14,0x00,0x08,0x7f,0xfc,0x00,0x08,0x80,0x22,0x00,0x08,0x80,0x48,0x00,0x08,0x80,0x78,0x00,0x08,0x80,0xa6,0x00,0x08,0x80,0xb6,0x00,0x08,0x80,0xc6,0x00,0x08,0x81,0x14,0x00,0x08,0x81,0xa4,0x00,0x08,0x82,0x1e,0x00,0x08,0x82,0x7e, -0x00,0x08,0x83,0x0e,0x00,0x08,0x83,0x9e,0x00,0x08,0x84,0x46,0x00,0x08,0x84,0xa4,0x00,0x08,0x84,0xf2,0x00,0x08,0x85,0x7c,0x00,0x08,0x85,0xfe,0x00,0x08,0x86,0x6c,0x00,0x08,0x86,0xe0,0x00,0x08,0x87,0x28,0x00,0x08,0x87,0x6a,0x00,0x08,0x87,0xbc,0x00,0x08,0x88,0x06,0x00,0x08,0x88,0xa8,0x00,0x08,0x88,0xd4,0x00,0x08,0x89,0x12, -0x00,0x08,0x89,0x84,0x00,0x08,0x89,0xf6,0x00,0x08,0x8a,0x7e,0x00,0x08,0x8b,0x08,0x00,0x08,0x8b,0x90,0x00,0x08,0x8c,0x38,0x00,0x08,0x8c,0xa4,0x00,0x08,0x8d,0x54,0x00,0x08,0x8d,0x84,0x00,0x08,0x8d,0xd4,0x00,0x08,0x8e,0x04,0x00,0x08,0x8e,0xd0,0x00,0x08,0x8f,0x2e,0x00,0x08,0x8f,0x7a,0x00,0x08,0x8f,0xba,0x00,0x08,0x8f,0xd8, -0x00,0x08,0x90,0x28,0x00,0x08,0x90,0x56,0x00,0x08,0x90,0x86,0x00,0x08,0x90,0xc0,0x00,0x08,0x91,0x4a,0x00,0x08,0x91,0x66,0x00,0x08,0x91,0x82,0x00,0x08,0x91,0xe2,0x00,0x08,0x92,0x10,0x00,0x08,0x92,0x66,0x00,0x08,0x92,0xb4,0x00,0x08,0x92,0xfe,0x00,0x08,0x93,0x52,0x00,0x08,0x93,0x98,0x00,0x08,0x94,0x1e,0x00,0x08,0x94,0x94, -0x00,0x08,0x94,0xe0,0x00,0x08,0x95,0x2e,0x00,0x08,0x95,0x7c,0x00,0x08,0x95,0xca,0x00,0x08,0x96,0x18,0x00,0x08,0x96,0x66,0x00,0x08,0x96,0xb4,0x00,0x08,0x97,0x02,0x00,0x08,0x97,0x50,0x00,0x08,0x97,0x9e,0x00,0x08,0x97,0xc0,0x00,0x08,0x97,0xe6,0x00,0x08,0x98,0x0c,0x00,0x08,0x98,0x32,0x00,0x08,0x98,0x52,0x00,0x08,0x99,0x8c, -0x00,0x08,0x9a,0x5c,0x00,0x08,0x9b,0x26,0x00,0x08,0x9c,0xa0,0x00,0x08,0x9d,0x40,0x00,0x08,0x9d,0xa4,0x00,0x08,0x9d,0xbc,0x00,0x08,0x9d,0xd4,0x00,0x08,0x9e,0xa8,0x00,0x08,0x9f,0x86,0x00,0x08,0x9f,0xf0,0x00,0x08,0xa0,0x76,0x00,0x08,0xa1,0x46,0x00,0x08,0xa2,0x16,0x00,0x08,0xa2,0xd6,0x00,0x08,0xa3,0x98,0x00,0x08,0xa4,0x34, -0x00,0x08,0xa4,0xd0,0x00,0x08,0xa4,0xe0,0x00,0x08,0xa5,0xa4,0x00,0x08,0xa6,0x5c,0x00,0x08,0xa6,0xb8,0x00,0x08,0xa6,0xec,0x00,0x08,0xa7,0x0e,0x00,0x08,0xa7,0xec,0x00,0x08,0xa8,0xee,0x00,0x08,0xa9,0x9a,0x00,0x08,0xaa,0x4c,0x00,0x08,0xaa,0xfc,0x00,0x08,0xab,0x0c,0x00,0x08,0xac,0x2e,0x00,0x08,0xac,0xda,0x00,0x08,0xac,0xfa, -0x00,0x08,0xad,0x92,0x00,0x08,0xae,0x8a,0x00,0x08,0xaf,0x44,0x00,0x08,0xb0,0x2e,0x00,0x08,0xb0,0xd0,0x00,0x08,0xb1,0x98,0x00,0x08,0xb2,0x50,0x00,0x08,0xb3,0x2c,0x00,0x08,0xb4,0x50,0x00,0x08,0xb5,0x4c,0x00,0x08,0xb6,0x22,0x00,0x08,0xb7,0x38,0x00,0x08,0xb7,0x90,0x00,0x08,0xb8,0x46,0x00,0x08,0xb8,0x8c,0x00,0x08,0xb9,0x06, -0x00,0x08,0xb9,0xbe,0x00,0x08,0xba,0x9e,0x00,0x08,0xbb,0x02,0x00,0x08,0xbb,0xb0,0x00,0x08,0xbb,0xc0,0x00,0x08,0xbc,0x18,0x00,0x08,0xbc,0xa0,0x00,0x08,0xbd,0x70,0x00,0x08,0xbe,0x40,0x00,0x08,0xbe,0xc0,0x00,0x08,0xbe,0xd0,0x00,0x08,0xbf,0xb4,0x00,0x08,0xc0,0x46,0x00,0x08,0xc1,0x26,0x00,0x08,0xc1,0x9a,0x00,0x08,0xc2,0x7e, -0x00,0x08,0xc3,0x1a,0x00,0x08,0xc3,0x82,0x00,0x08,0xc3,0xfe,0x00,0x08,0xc4,0x74,0x00,0x08,0xc5,0x16,0x00,0x08,0xc5,0xc2,0x00,0x08,0xc6,0x46,0x00,0x08,0xc6,0xd8,0x00,0x08,0xc6,0xe8,0x00,0x08,0xc6,0xfa,0x00,0x08,0xc7,0x0c,0x00,0x08,0xc7,0x1e,0x00,0x08,0xc7,0x30,0x00,0x08,0xc7,0x42,0x00,0x08,0xc7,0x54,0x00,0x08,0xc7,0x66, -0x00,0x08,0xc7,0x78,0x00,0x08,0xc7,0x8a,0x00,0x08,0xc7,0x9c,0x00,0x08,0xc7,0xac,0x00,0x08,0xc7,0xbe,0x00,0x08,0xc7,0xd0,0x00,0x08,0xc7,0xe0,0x00,0x08,0xc7,0xf2,0x00,0x08,0xc8,0x04,0x00,0x08,0xc8,0x16,0x00,0x08,0xc8,0x2e,0x00,0x08,0xc8,0x46,0x00,0x08,0xc8,0x5e,0x00,0x08,0xc8,0x74,0x00,0x08,0xc8,0x8a,0x00,0x08,0xca,0x64, -0x00,0x08,0xd0,0x7e,0x00,0x08,0xd2,0xb4,0x00,0x08,0xd9,0xd8,0x00,0x08,0xd9,0xea,0x00,0x08,0xda,0x02,0x00,0x08,0xda,0x14,0x00,0x08,0xda,0x64,0x00,0x08,0xda,0x74,0x00,0x08,0xda,0x86,0x00,0x08,0xda,0x9e,0x00,0x08,0xda,0xb0,0x00,0x08,0xda,0xc8,0x00,0x08,0xda,0xd8,0x00,0x08,0xda,0xee,0x00,0x08,0xdb,0x00,0x00,0x08,0xdb,0x18, -0x00,0x08,0xdb,0x2a,0x00,0x08,0xdb,0x42,0x00,0x08,0xdb,0x76,0x00,0x08,0xdb,0xe0,0x00,0x08,0xdc,0x00,0x00,0x08,0xdc,0x20,0x00,0x08,0xdc,0x40,0x00,0x08,0xdc,0x60,0x00,0x08,0xdc,0x72,0x00,0x08,0xdc,0x8a,0x00,0x08,0xdc,0xa2,0x00,0x08,0xdc,0xba,0x00,0x08,0xdc,0xd2,0x00,0x08,0xdc,0xea,0x00,0x08,0xdd,0x02,0x00,0x08,0xdd,0x1a, -0x00,0x08,0xdd,0x32,0x00,0x08,0xdd,0x4a,0x00,0x08,0xdd,0x62,0x00,0x08,0xdd,0xf4,0x00,0x08,0xde,0x98,0x00,0x08,0xde,0xb8,0x00,0x08,0xde,0xd8,0x00,0x08,0xdf,0x32,0x00,0x08,0xdf,0x5a,0x00,0x08,0xdf,0x6a,0x00,0x08,0xdf,0x82,0x00,0x08,0xdf,0x9a,0x00,0x08,0xdf,0xfe,0x00,0x08,0xe0,0x68,0x00,0x08,0xe1,0x3a,0x00,0x08,0xe1,0xe8, -0x00,0x08,0xe2,0x86,0x00,0x08,0xe3,0x22,0x00,0x08,0xe3,0x3a,0x00,0x08,0xe3,0x52,0x00,0x08,0xe3,0x62,0x00,0x08,0xe3,0x72,0x00,0x08,0xe4,0x36,0x00,0x08,0xe4,0xe0,0x00,0x08,0xe4,0xf0,0x00,0x08,0xe5,0x00,0x00,0x08,0xe6,0x9c,0x00,0x08,0xe6,0xc6,0x00,0x08,0xe7,0x9c,0x00,0x08,0xe8,0x80,0x00,0x08,0xe8,0xd2,0x00,0x08,0xe8,0xe4, -0x00,0x08,0xe9,0x06,0x00,0x08,0xe9,0x18,0x00,0x08,0xe9,0x6c,0x00,0x08,0xe9,0x7e,0x00,0x08,0xea,0x14,0x00,0x08,0xea,0x26,0x00,0x08,0xea,0xde,0x00,0x08,0xeb,0x30,0x00,0x08,0xeb,0x96,0x00,0x08,0xeb,0xea,0x00,0x08,0xec,0x50,0x00,0x08,0xec,0xa2,0x00,0x08,0xed,0x08,0x00,0x08,0xed,0x5a,0x00,0x08,0xed,0xc0,0x00,0x08,0xed,0xd0, -0x00,0x08,0xee,0x14,0x00,0x08,0xee,0xbe,0x00,0x08,0xee,0xce,0x00,0x08,0xef,0x72,0x00,0x08,0xef,0x82,0x00,0x08,0xf0,0x60,0x00,0x08,0xf0,0x70,0x00,0x08,0xf0,0xe0,0x00,0x08,0xf1,0x84,0x00,0x08,0xf2,0x52,0x00,0x08,0xf3,0x0a,0x00,0x08,0xf3,0xa2,0x00,0x08,0xf4,0x72,0x00,0x08,0xf4,0xb6,0x00,0x08,0xf5,0x92,0x00,0x08,0xf6,0xe4, -0x00,0x08,0xf8,0x9a,0x00,0x08,0xf9,0xc2,0x00,0x08,0xfb,0x6a,0x00,0x08,0xfb,0x82,0x00,0x08,0xfb,0x9a,0x00,0x08,0xfb,0xba,0x00,0x08,0xfb,0xda,0x00,0x08,0xfb,0xf2,0x00,0x08,0xfc,0x0a,0x00,0x08,0xfc,0x2a,0x00,0x08,0xfc,0x3a,0x00,0x08,0xfc,0x4a,0x00,0x08,0xfc,0x5a,0x00,0x08,0xfd,0xb0,0x00,0x08,0xfe,0x98,0x00,0x08,0xff,0x4a, -0x00,0x09,0x00,0x2a,0x00,0x09,0x00,0xb8,0x00,0x09,0x00,0xca,0x00,0x09,0x02,0x4a,0x00,0x09,0x04,0x28,0x00,0x09,0x05,0xf4,0x00,0x09,0x07,0x6a,0x00,0x09,0x08,0x98,0x00,0x09,0x0a,0x78,0x00,0x09,0x0b,0x12,0x00,0x09,0x0b,0xd4,0x00,0x09,0x0c,0x8e,0x00,0x09,0x0c,0xa0,0x00,0x09,0x0c,0xbc,0x00,0x09,0x0c,0xd4,0x00,0x09,0x0c,0xec, -0x00,0x09,0x0d,0x04,0x00,0x09,0x0d,0x1c,0x00,0x09,0x0d,0x34,0x00,0x09,0x0d,0x54,0x00,0x09,0x0d,0x74,0x00,0x09,0x0d,0x94,0x00,0x09,0x0d,0xb4,0x00,0x09,0x0d,0xd4,0x00,0x09,0x0d,0xf4,0x00,0x09,0x0e,0x0c,0x00,0x09,0x0f,0x08,0x00,0x09,0x0f,0xe2,0x00,0x09,0x10,0x80,0x00,0x09,0x10,0x98,0x00,0x09,0x10,0xb8,0x00,0x09,0x10,0xd8, -0x00,0x09,0x10,0xf8,0x00,0x09,0x11,0x08,0x00,0x09,0x11,0x20,0x00,0x09,0x11,0x38,0x00,0x09,0x11,0x48,0x00,0x09,0x11,0x60,0x00,0x09,0x11,0x78,0x00,0x09,0x11,0x88,0x00,0x09,0x11,0xd2,0x00,0x09,0x12,0x0c,0x00,0x09,0x12,0x4e,0x00,0x09,0x13,0x00,0x00,0x09,0x13,0x92,0x00,0x09,0x14,0x14,0x00,0x09,0x14,0x5e,0x00,0x09,0x14,0xb0, -0x00,0x09,0x15,0x02,0x00,0x09,0x15,0x9a,0x00,0x09,0x16,0x2a,0x00,0x09,0x16,0xd4,0x00,0x09,0x17,0x66,0x00,0x09,0x17,0xea,0x00,0x09,0x18,0x2e,0x00,0x09,0x1a,0x76,0x00,0x09,0x1c,0x24,0x00,0x09,0x1c,0x68,0x00,0x09,0x1c,0x98,0x00,0x09,0x1c,0xc8,0x00,0x09,0x1c,0xd8,0x00,0x09,0x1c,0xe8,0x00,0x09,0x1d,0x32,0x00,0x09,0x1d,0x6e, -0x00,0x09,0x1d,0xb2,0x00,0x09,0x1e,0x72,0x00,0x09,0x1f,0x06,0x00,0x09,0x1f,0x86,0x00,0x09,0x1f,0xd4,0x00,0x09,0x20,0x2e,0x00,0x09,0x20,0x8a,0x00,0x09,0x21,0x32,0x00,0x09,0x21,0xd2,0x00,0x09,0x22,0x8a,0x00,0x09,0x23,0x1c,0x00,0x09,0x23,0xa4,0x00,0x09,0x23,0xee,0x00,0x09,0x24,0x06,0x00,0x09,0x24,0x26,0x00,0x09,0x24,0xbe, -0x00,0x09,0x25,0x8e,0x00,0x09,0x26,0x66,0x00,0x09,0x27,0x7e,0x00,0x09,0x28,0x24,0x00,0x09,0x28,0xf6,0x00,0x09,0x29,0xdc,0x00,0x09,0x2a,0xa8,0x00,0x09,0x2b,0x2a,0x00,0x09,0x2b,0xe8,0x00,0x09,0x2d,0x1c,0x00,0x09,0x2d,0xde,0x00,0x09,0x2e,0xbc,0x00,0x09,0x2f,0x8a,0x00,0x09,0x30,0x5a,0x00,0x09,0x31,0x46,0x00,0x09,0x32,0x6a, -0x00,0x09,0x32,0xf4,0x00,0x09,0x34,0x44,0x00,0x09,0x35,0x52,0x00,0x09,0x36,0x94,0x00,0x09,0x37,0x42,0x00,0x09,0x38,0x46,0x00,0x09,0x39,0x0a,0x00,0x09,0x3a,0x26,0x00,0x09,0x3a,0xf8,0x00,0x09,0x3b,0xcc,0x00,0x09,0x3c,0x52,0x00,0x09,0x3d,0x76,0x00,0x09,0x3e,0x9e,0x00,0x09,0x3f,0x20,0x00,0x09,0x40,0x62,0x00,0x09,0x41,0x64, -0x00,0x09,0x42,0x74,0x00,0x09,0x43,0x46,0x00,0x09,0x44,0x02,0x00,0x09,0x44,0xe6,0x00,0x09,0x45,0xdc,0x00,0x09,0x46,0xa4,0x00,0x09,0x47,0x60,0x00,0x09,0x48,0x26,0x00,0x09,0x48,0xfe,0x00,0x09,0x49,0x8e,0x00,0x09,0x49,0x8e,0x00,0x09,0x49,0x8e,0x00,0x09,0x4a,0x4a,0x00,0x09,0x4b,0x1e,0x00,0x09,0x4b,0xac,0x00,0x09,0x4b,0xfc, -0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0b,0x07,0x01,0x03,0x04,0x00,0x03,0x05,0x05,0x09,0x04,0x00,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x00,0x2f,0xcd,0x3f,0xcd,0x31,0x30,0x33,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0xa6,0x03,0xde,0xfc,0xb6,0x02,0xb6,0xfd,0x4a,0x05,0x76,0xfa,0x8a,0x94, -0x04,0x4e,0x00,0x02,0x00,0xb4,0xff,0xee,0x01,0x92,0x05,0x9a,0x00,0x03,0x00,0x0f,0x00,0x3f,0x40,0x20,0x03,0x03,0x02,0x0a,0x40,0x04,0x0a,0xb0,0x5b,0x04,0x13,0x01,0x02,0x00,0x7d,0x1f,0x03,0x2f,0x03,0x02,0x03,0x0d,0xaf,0x7f,0x07,0x01,0x10,0x07,0x20,0x07,0x02,0x07,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x07,0x2f,0x2b,0x72,0x5d, -0xe1,0xd4,0x72,0xe1,0x39,0x39,0x00,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x77,0x13,0x87,0x12,0x58,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x05,0x9a,0xfb,0xfa,0x04,0x06,0xfa,0x54,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x02, -0x00,0xa3,0x03,0xdb,0x02,0x80,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x14,0x0f,0x04,0x1f,0x04,0x2f,0x04,0xbf,0x04,0xcf,0x04,0x05,0x04,0x04,0x09,0x03,0x06,0x02,0x07,0x03,0x03,0x00,0x3f,0x33,0xcd,0x32,0x01,0x2f,0x12,0x39,0x2f,0x5d,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x34,0x91,0x01,0xdd,0x91,0x05, -0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x00,0x02,0x00,0x21,0x00,0x7b,0x04,0x8e,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0xbf,0x40,0x6b,0x0f,0x17,0x01,0x00,0x06,0x01,0x10,0x06,0x1b,0x02,0x03,0x06,0x07,0x1a,0x07,0x18,0x1c,0x1f,0x09,0x08,0x19,0x08,0x17,0x1d,0x1e,0x0a,0x0b,0x16,0x0b,0x14,0x11,0x10,0x0d,0x0c,0x15,0x0c, -0x09,0x0d,0x10,0x1f,0x04,0x06,0x03,0x06,0x03,0xe2,0x59,0x11,0x14,0x17,0x1d,0x04,0x02,0x1b,0x1b,0x02,0xe2,0x59,0x1b,0x06,0x1b,0x06,0x1a,0x0b,0x00,0x07,0x10,0x07,0x02,0x09,0x07,0x07,0x21,0x16,0x1a,0x03,0x04,0x00,0x00,0x19,0x1a,0x0e,0x07,0x0f,0x08,0x01,0x0c,0x03,0x08,0x08,0x21,0x0c,0x0c,0x16,0x42,0x12,0x0e,0x0e,0x15,0x16, -0x0b,0x60,0x0c,0x70,0x0c,0x02,0x0c,0x2f,0x5d,0x33,0xcd,0x32,0x33,0x2f,0xc6,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0xe1,0x32,0x32,0x2f,0xc6,0x00,0x3f,0xc4,0x12,0x39,0x2f,0x5e,0x5d,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x17,0x39,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0, -0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x01,0x5f,0x5e,0x5d,0x5d,0x01,0x07,0x21,0x03,0x21,0x07,0x21,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x21,0x37,0x21,0x13,0x21,0x37,0x21,0x13,0x33,0x03,0x33,0x13,0x33,0x03,0x07,0x23,0x03,0x33,0x04,0x8e,0x17,0xfe,0xfb,0x3f,0x01, -0x19,0x1b,0xfe,0xed,0x58,0x7e,0x56,0xfa,0x54,0x7d,0x54,0xfe,0xfa,0x14,0x01,0x09,0x3d,0xfe,0xeb,0x15,0x01,0x15,0x54,0x7e,0x54,0xfc,0x56,0x7b,0x54,0x91,0xfc,0x42,0xfe,0x04,0x08,0x6a,0xfe,0xd4,0x6a,0xfe,0x73,0x01,0x8d,0xfe,0x73,0x01,0x8d,0x6a,0x01,0x2c,0x6a,0x01,0x92,0xfe,0x6e,0x01,0x92,0xfe,0x6e,0x6a,0xfe,0xd4,0x00,0x03, -0x00,0xa2,0xff,0x2f,0x03,0xd1,0x06,0x50,0x00,0x1e,0x00,0x25,0x00,0x2a,0x00,0xc1,0x40,0x1b,0x09,0x26,0x01,0x06,0x1f,0x01,0x0a,0x1d,0x01,0x05,0x15,0x01,0x03,0x00,0x0e,0x01,0x0f,0x05,0x01,0x10,0x05,0x2a,0x20,0x0c,0x00,0x4d,0x25,0xb8,0xff,0xe0,0xb3,0x0c,0x00,0x4d,0x15,0xb8,0xff,0xd0,0x40,0x56,0x0c,0x00,0x4d,0x05,0x30,0x0c, -0x00,0x4d,0x1f,0x19,0x09,0x26,0x0a,0x03,0x13,0x16,0x16,0x20,0x18,0x13,0x18,0x9a,0x59,0x10,0x12,0x40,0x13,0x06,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x09,0x03,0x06,0x06,0x27,0x09,0x03,0x09,0x9a,0x59,0x00,0x02,0x03,0x18,0x09,0x10,0x13,0x19,0x1f,0x27,0x06,0x01,0x8c,0x02,0x02,0x1c,0x0d,0x16,0x40,0x0c,0x11,0x00,0x4c,0x16,0x16, -0x1c,0x89,0x7f,0x29,0x01,0x2f,0x29,0x01,0x29,0x05,0x23,0x89,0x20,0x0d,0x01,0x0d,0x2f,0x5d,0xe1,0xc4,0xd4,0x5d,0x5d,0xf1,0xc0,0x2f,0x2b,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x00,0x3f,0xcd,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x1a,0xcd,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x11,0x12,0x39,0x39,0x12, -0x39,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x25,0x15,0x23,0x35,0x22,0x27,0x35,0x16,0x16,0x33,0x11,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x01,0x11,0x06,0x06,0x15,0x14,0x16,0x13,0x11,0x36,0x35,0x34,0x02,0x68,0x68,0xd5, -0x85,0x3a,0xc9,0x57,0xdc,0x82,0xc6,0x98,0x68,0xc4,0x4b,0x66,0xa9,0xd0,0x99,0xbf,0xfe,0xee,0x54,0x62,0x50,0xce,0xc1,0x08,0xd9,0xd1,0x56,0xae,0x33,0x45,0x02,0x00,0x6a,0xb3,0x7a,0x91,0xd3,0x15,0xb4,0xb0,0x06,0x32,0xaa,0x50,0x06,0xfd,0xf0,0x63,0xb9,0x76,0x8e,0xc1,0x03,0x19,0x01,0xd2,0x11,0x73,0x52,0x56,0x6e,0xfe,0xe4,0xfe, -0x3c,0x2a,0xa6,0x8a,0x00,0x05,0x00,0x50,0xff,0xea,0x06,0x40,0x05,0xb0,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27,0x00,0x33,0x00,0xaf,0x40,0x32,0x19,0x18,0x03,0x22,0x28,0x52,0x59,0x22,0x0e,0x1c,0x1c,0x2e,0x52,0x59,0x1c,0x13,0x06,0x00,0x42,0x00,0x12,0x52,0x59,0x00,0x06,0x06,0x0c,0x52,0x59,0x06,0x04,0x3f,0x18,0x4f,0x18,0x02, -0x1a,0x18,0x1a,0x18,0x25,0x03,0x1f,0xbd,0x2b,0x0c,0x0d,0x06,0x4d,0x2b,0xb8,0xff,0xf9,0xb6,0x0b,0x06,0x4d,0x2b,0x31,0xbd,0x25,0xb8,0xff,0xe0,0x40,0x14,0x0d,0x06,0x4d,0x25,0x18,0x0c,0x06,0x4d,0x25,0x09,0x0b,0x06,0x4d,0x25,0x25,0x35,0x03,0x09,0xbd,0x15,0xb8,0xff,0xec,0x40,0x16,0x0d,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15, -0x0f,0xbd,0x03,0x1c,0x0d,0x06,0x4d,0x03,0x1c,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18, -0x10,0xe4,0x2b,0x00,0x18,0x3f,0x2f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x94,0x94, -0xb0,0xba,0x9e,0x99,0xa9,0xbd,0x8b,0x5f,0x6e,0x6c,0x5d,0x5e,0x6a,0x69,0x03,0x57,0xfc,0x68,0x8f,0x03,0x97,0x26,0x94,0xb0,0xbc,0x9c,0x98,0xaa,0xbd,0x8b,0x60,0x6d,0x6c,0x5d,0x5e,0x6a,0x69,0x02,0xcb,0xc3,0xa3,0xb2,0xcd,0xbe,0xac,0xac,0xcf,0x02,0x77,0x8d,0x7b,0x79,0x87,0x8c,0x7c,0x79,0x87,0x58,0xfa,0x5c,0x05,0xa4,0xfa,0x50, -0xc4,0xa2,0xb2,0xcf,0xc0,0xad,0xab,0xcf,0x02,0x76,0x8c,0x7c,0x77,0x87,0x8d,0x7b,0x7a,0x84,0x00,0x03,0x00,0x77,0xff,0xe9,0x06,0x3e,0x05,0xb2,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0xd7,0x40,0x1c,0x58,0x4f,0x01,0x5c,0x4c,0x01,0x03,0x59,0x4b,0x01,0x5d,0x4a,0x01,0x50,0x37,0x01,0x52,0x36,0x01,0x5b,0x0d,0x01,0x4a,0x40,0x0b,0x00, -0x4d,0x51,0xb8,0xff,0xe8,0x40,0x0c,0x0b,0x00,0x4d,0x1d,0x4d,0x01,0x02,0x1f,0x01,0x0b,0x04,0x10,0xb8,0xff,0xe0,0x40,0x5c,0x0b,0x00,0x4d,0x05,0x49,0x4e,0x12,0x04,0x0a,0x2f,0x38,0x29,0x24,0x65,0x2f,0x05,0x1c,0x44,0x1c,0x5d,0x96,0x59,0x1c,0x04,0x0a,0x44,0x95,0x59,0x0a,0x13,0x00,0x3d,0xec,0x59,0x00,0x13,0x3a,0x49,0x01,0x38, -0x05,0x33,0x0f,0x29,0x49,0x2c,0x53,0x12,0x4e,0x65,0x24,0x04,0x21,0x17,0x33,0xef,0x2c,0x21,0xef,0x58,0x60,0xef,0x17,0x17,0x58,0x2c,0x03,0x0f,0x70,0x40,0x01,0x40,0x40,0x69,0x53,0x08,0x0d,0x06,0x4d,0x53,0x08,0x0c,0x06,0x4d,0x53,0x08,0x0b,0x06,0x4d,0x53,0x83,0x0f,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x12,0x17,0x39, -0x2f,0xe1,0x2f,0xe1,0x2f,0xe1,0x11,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x2f,0x11,0x17,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x2b,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5f,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x27, -0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x17,0x36,0x12,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02, -0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x05,0xa5,0x39,0x57,0x4a,0x45,0x26,0x28,0x69,0x80,0x98,0x59,0x6c,0xb4,0x80,0x47,0xae,0x9f,0x1e,0x3c,0x2f,0x1d,0x39,0x64,0x88,0x4f,0x4e,0x81,0x5d,0x34,0x89,0x89,0x45,0x70,0x5f,0x52,0x28,0x51,0x52,0x09,0x08,0x9f,0x08,0x03,0x02,0x26,0x40,0x55,0x2f,0x23, -0x3a,0x3b,0x3f,0x28,0x1e,0x3e,0x21,0x24,0x4f,0xfc,0x93,0x4c,0x80,0x6c,0x58,0x24,0x3d,0x67,0x69,0x77,0x4e,0x3f,0x6a,0x4d,0x2c,0x32,0x57,0x74,0x01,0x3d,0x25,0x39,0x46,0x22,0x62,0x75,0x01,0x19,0x2d,0x3c,0x22,0x7e,0x7c,0x17,0x1f,0x39,0x52,0x34,0x2b,0x50,0x3e,0x25,0x36,0x69,0x9a,0x64,0x99,0xd9,0x45,0x16,0x3b,0x4b,0x5b,0x36, -0x4f,0x7a,0x54,0x2b,0x2b,0x50,0x70,0x45,0x78,0x9f,0x38,0x1b,0x4e,0x60,0x6e,0x3b,0x71,0x01,0x10,0x95,0x26,0x43,0x21,0x21,0x3b,0x29,0x5b,0xb8,0xad,0x9c,0x41,0x30,0x47,0x30,0x17,0x10,0x0c,0x98,0x0e,0x0e,0x8e,0x21,0x37,0x49,0x28,0x5f,0x87,0x62,0x46,0x1e,0x19,0x3d,0x53,0x6e,0x4a,0x44,0x68,0x45,0x23,0x03,0xfd,0x32,0x46,0x2e, -0x15,0x6a,0x5b,0x29,0x48,0x3e,0x30,0x11,0x2c,0x75,0x00,0x01,0x00,0xa3,0x03,0xdb,0x01,0x34,0x05,0x9a,0x00,0x03,0x00,0x0c,0xb3,0x03,0x02,0x03,0x03,0x00,0x3f,0xcd,0x01,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x01,0x34,0x91,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x00,0x01,0x00,0x8c,0xfe,0xba,0x02,0x56,0x05,0x9a,0x00,0x09,0x00,0x41, -0x40,0x2b,0x05,0x10,0x0b,0x01,0x4d,0x01,0x10,0x0b,0x01,0x4d,0x38,0x02,0x01,0x06,0x03,0x00,0x20,0x05,0xea,0x06,0x01,0xea,0x00,0x00,0x0b,0x08,0x08,0x0c,0x06,0x4d,0x08,0x10,0x0b,0x06,0x4d,0x08,0xea,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x2b, -0x2b,0x01,0x23,0x00,0x11,0x10,0x01,0x33,0x00,0x11,0x10,0x02,0x54,0x92,0xfe,0xca,0x01,0x36,0x94,0xfe,0xc6,0xfe,0xba,0x01,0x62,0x02,0x07,0x02,0x09,0x01,0x6e,0xfe,0x84,0xfe,0x07,0xfe,0x0b,0x00,0x00,0x01,0x00,0x16,0xfe,0xba,0x01,0xe2,0x05,0x9a,0x00,0x09,0x00,0x4a,0xb9,0x00,0x06,0xff,0xf0,0xb3,0x0b,0x01,0x4d,0x00,0xb8,0xff, -0xf0,0x40,0x0b,0x0b,0x01,0x4d,0x37,0x09,0x01,0x06,0x03,0x00,0x20,0x03,0xb8,0xff,0xf0,0xb5,0x0b,0x06,0x4d,0x03,0xea,0x08,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x08,0x08,0x0b,0x01,0x06,0xea,0x05,0x00,0xea,0x01,0x2f,0xe1,0xd6,0xe1,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x2b,0x2b,0x13,0x23, -0x00,0x11,0x10,0x01,0x33,0x00,0x11,0x10,0xaa,0x92,0x01,0x38,0xfe,0xc6,0x94,0x01,0x38,0xfe,0xba,0x01,0x76,0x01,0xf5,0x01,0xf9,0x01,0x7c,0xfe,0x92,0xfd,0xf7,0xfd,0xf9,0x00,0x00,0x01,0x00,0x4c,0x02,0xd9,0x03,0x0c,0x05,0x9a,0x00,0x0e,0x00,0x67,0x40,0x31,0x03,0x04,0x01,0x10,0x03,0x03,0x05,0x08,0x0a,0x0d,0x0e,0x00,0x04,0x08, -0x09,0x09,0x08,0x53,0x59,0x0f,0x09,0x01,0x10,0x03,0x09,0x0c,0x03,0x02,0x02,0x00,0x0e,0x0c,0x06,0x06,0x0b,0x08,0x0b,0x08,0x42,0x08,0x04,0x0a,0x0d,0x03,0x01,0x0d,0x0c,0x48,0x0b,0xb8,0xff,0xf8,0xb5,0x0d,0x06,0x4d,0x07,0x0a,0x0b,0x2f,0x33,0x33,0x2b,0xed,0x32,0x32,0x17,0x39,0xc4,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x10,0xe4, -0x39,0x2f,0x00,0x3f,0xc4,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x10,0xd4,0xc4,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x05,0x17,0x07,0x03,0x03,0x27,0x37,0x25,0x37,0x05,0x03,0x33,0x03,0x25,0x03,0x0c,0xfe,0xee,0xbe,0x6e,0x9c,0x9e,0x6e,0xbe,0xfe,0xec,0x2d,0x01,0x06,0x17,0x8a,0x17,0x01,0x07,0x04,0x50,0x38,0xf3,0x4c,0x01, -0x09,0xfe,0xf7,0x4c,0xf3,0x38,0x7d,0x63,0x01,0x30,0xfe,0xd0,0x63,0x00,0x00,0x01,0x00,0xe8,0x00,0x7f,0x04,0x94,0x04,0x2b,0x00,0x0b,0x00,0x49,0x40,0x21,0x03,0x0e,0x04,0x08,0x0e,0x07,0x40,0x0a,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x0f,0x07,0x01,0x0d,0x03,0x07,0x00,0x0e,0x01,0x04,0x05,0x42,0x05,0x0a,0x07,0x01,0xbd,0x04,0xb8, -0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0xe1,0x39,0x39,0xcd,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x94,0xfe,0x6c,0x85,0xfe,0x6d,0x01,0x93,0x85,0x01,0x94,0x02,0x12,0xfe, -0x6d,0x01,0x93,0x86,0x01,0x93,0xfe,0x6d,0x00,0x01,0x00,0x27,0xfe,0xf8,0x01,0x3c,0x00,0xe4,0x00,0x03,0x00,0x45,0x40,0x1d,0x39,0x03,0x01,0x39,0x00,0x01,0x02,0x40,0x03,0xb2,0x04,0x00,0x20,0x0c,0x06,0x4d,0x00,0x28,0x0b,0x06,0x4d,0x00,0x80,0x02,0x40,0x11,0x19,0x48,0x02,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xea, -0xb6,0x0b,0x06,0x4d,0x02,0x2f,0x05,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0x1a,0xcd,0x2b,0x2b,0x00,0x10,0xf6,0x1a,0xcd,0x31,0x30,0x01,0x5d,0x5d,0x25,0x03,0x23,0x13,0x01,0x3c,0xa0,0x75,0x75,0xe4,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x00,0x90,0x01,0xfa,0x02,0xb2,0x02,0x7b,0x00,0x03,0x00,0x1c,0x40,0x10,0x02,0x01,0x53,0x59,0x4f,0x02, -0x01,0x02,0x20,0x00,0x01,0x00,0x20,0x01,0x01,0x01,0x2f,0x5d,0x2f,0x5d,0x00,0x2f,0x5d,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0xb2,0xfd,0xde,0x02,0x22,0x01,0xfa,0x81,0x00,0x00,0x01,0x00,0x70,0xff,0xea,0x01,0x50,0x00,0xcb,0x00,0x0b,0x00,0x1c,0x40,0x11,0x00,0x06,0xb0,0x5b,0x00,0x13,0x09,0xaf,0x1f,0x03,0x2f,0x03,0x02,0x03, -0x2f,0x0d,0x01,0x5d,0x2f,0x71,0xe1,0x00,0x3f,0x2b,0x31,0x30,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x16,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x00,0x01,0xff,0xe4,0xff,0x12,0x03,0x2d,0x05,0x9a,0x00,0x03,0x00,0x19,0x40,0x0d,0x77,0x01,0x01,0x00,0x10,0x0b, -0x00,0x4d,0x01,0x00,0x03,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x2f,0x31,0x30,0x01,0x2b,0x5d,0x01,0x01,0x23,0x01,0x03,0x2d,0xfd,0x50,0x99,0x02,0xae,0x05,0x9a,0xf9,0x78,0x06,0x88,0x00,0x02,0x00,0x56,0xff,0xe7,0x03,0xfc,0x05,0xb2,0x00,0x10,0x00,0x18,0x00,0x29,0x40,0x15,0x00,0x89,0x11,0x11,0x1a,0x15,0x89,0x40,0x0a,0x0f,0x13,0x9a, -0x59,0x0f,0x07,0x05,0x17,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x20,0x03,0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x03,0xfc,0x41,0x7b,0xb3,0x72,0x6c,0xa9,0x74,0x3c,0x3f,0x7a, -0xb5,0x75,0x01,0xc3,0xa8,0xfe,0xdd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x02,0xd3,0xb4,0xfe,0xea,0xbf,0x63,0x5f,0xb6,0x01,0x09,0xab,0xbc,0x01,0x20,0xc3,0x63,0xfd,0x11,0x02,0x64,0xfd,0x91,0xfd,0xbb,0x00,0x01,0x00,0xe4,0x00,0x00,0x02,0xd4,0x05,0xba,0x00,0x0e,0x00,0x1d,0x40,0x0d,0x0d,0x07,0x00,0x8a,0x01,0x08,0x07,0x07,0x01,0x0d, -0x07,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0xc6,0x33,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0xd4,0xa4,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x3e,0x04,0xd7,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x03,0xe2, -0x05,0xb2,0x00,0x2a,0x00,0x3c,0x40,0x1e,0x1e,0x13,0x89,0x0a,0x21,0x00,0x00,0x2c,0x1d,0x89,0x40,0x21,0x00,0x1d,0x0e,0x20,0x1d,0x99,0x59,0x20,0x18,0x0a,0x0a,0x05,0x0e,0x05,0x9a,0x59,0x0e,0x07,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x32, -0x31,0x30,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x21,0x15,0x21,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x03,0x04,0x29,0x47,0x60,0x38,0x30,0x5c,0x57,0x51,0x23,0x45,0xab,0x7b,0x58,0x96,0x6e,0x3f,0x27,0x4f,0x78,0x51,0x65,0x83,0x4d,0x1f,0x02,0xca, -0xfc,0x8b,0x28,0x5c,0x95,0x6c,0x4e,0x69,0x40,0x1b,0x04,0x22,0x42,0x62,0x41,0x20,0x1a,0x2e,0x40,0x27,0xb0,0x43,0x47,0x33,0x62,0x90,0x5d,0x55,0x8a,0x7a,0x70,0x3a,0x48,0x66,0x59,0x59,0x3a,0x93,0x47,0x5c,0x8c,0x7e,0x7e,0x4f,0x38,0x66,0x66,0x69,0x00,0x01,0x00,0x7b,0xff,0xe7,0x03,0xb9,0x05,0xb2,0x00,0x29,0x00,0x72,0x40,0x41, -0x16,0x89,0x1a,0x13,0x24,0x03,0x08,0x22,0x22,0x08,0x00,0x89,0x40,0x0f,0x0f,0x2b,0x08,0x19,0x1a,0x01,0x0f,0x1a,0x01,0x0b,0x03,0x1a,0x1a,0x18,0x1d,0x18,0x9a,0x59,0x24,0x12,0x13,0x13,0x12,0x9a,0x59,0x13,0x13,0x0a,0x1d,0x07,0x36,0x08,0x01,0x00,0x08,0x10,0x08,0x20,0x08,0x03,0x09,0x03,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05, -0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x3f,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x10,0x21, -0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb9,0x49,0x85,0xba,0x70,0xcd,0x79,0x91,0xbb,0x4b,0x79,0x57,0x2f,0xfe,0x70,0x77,0x71,0x01,0x62,0xfe,0xf2,0x98,0x85,0x89,0xbd,0x5a,0x92,0x68,0x39,0xfe,0xe2,0x49,0x7c,0x5a,0x33,0x01,0x96,0x61,0x9f,0x71,0x3e,0x4e, -0xb0,0x72,0x26,0x48,0x66,0x40,0x01,0x19,0x8b,0x01,0x08,0xf4,0x66,0x9f,0x52,0x32,0x5a,0x7e,0x4c,0xfe,0xe5,0x51,0x04,0x08,0x37,0x58,0x77,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x0e,0x00,0x15,0x00,0x3e,0x40,0x1e,0x03,0x01,0x05,0x8a,0x06,0x40,0x10,0x0e,0x06,0x06,0x0f,0x17,0x08,0x04,0x08,0x0f,0x08,0x9a, -0x59,0x09,0x01,0x11,0x0e,0x0f,0x0f,0x06,0x0e,0x06,0x06,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x12,0x39,0x39,0x11,0x33,0x33,0x1a,0x10,0xfd,0x32,0xc6,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x52,0xb8,0xb8, -0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe,0x24,0x01,0xe9,0x4b,0x86,0x79,0x6e,0x05,0x9a,0xfc,0x4d,0x96,0xfe,0xaf,0x01,0x51,0x8e,0x6a,0xf1,0xf8,0xf7,0x71,0xfc,0x4d,0x02,0xbe,0x83,0xce,0xa8,0x88,0x00,0x00,0x01,0x00,0xa4,0xff,0xe7,0x03,0xc9,0x05,0x9a,0x00,0x23,0x00,0x52,0x40,0x2c,0x1c,0x8a,0x1a,0x17,0x17,0x08,0x00,0x89, -0x40,0x0f,0x0f,0x25,0x08,0x1f,0x12,0x9a,0x59,0x1f,0x1f,0x0a,0x18,0x18,0x1b,0x99,0x59,0x18,0x06,0x12,0x08,0x01,0x00,0x08,0x01,0x0b,0x03,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x01,0x18,0x2f,0x12,0x39,0x2f,0x1a, -0xed,0x11,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e,0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92,0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97, -0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x01,0xb6,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00,0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x46,0x40,0x24,0x12,0x0a,0x00,0x89,0x21,0x21, -0x36,0x2b,0x19,0x89,0x40,0x0a,0x1c,0x26,0x9a,0x59,0x1a,0x1c,0x1c,0x30,0x0f,0x12,0x12,0x14,0x0f,0x14,0x9a,0x59,0x0f,0x07,0x05,0x30,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x11,0x12,0x39,0x2f,0x39,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14, -0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8,0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e, -0x3b,0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d,0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37, -0x2f,0x54,0x75,0x00,0x00,0x01,0x00,0x62,0x00,0x00,0x03,0xf2,0x05,0x9a,0x00,0x12,0x00,0x2d,0xb9,0x00,0x07,0x01,0x86,0x40,0x12,0x40,0x0f,0x08,0x08,0x00,0x10,0x00,0x00,0x10,0x11,0x11,0x10,0x99,0x59,0x11,0x06,0x08,0x18,0x00,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x2f,0x12,0x39,0x2f,0x39,0x1a,0xed,0x31,0x30,0x01, -0x0e,0x03,0x02,0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02,0x37,0x21,0x35,0x21,0x03,0xf2,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x05,0x3b,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x00,0x03,0x00,0x5a,0xff,0xe9, -0x03,0xfc,0x05,0xb2,0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x5b,0x40,0x2f,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x40,0x00,0x15,0x05,0x33,0x3d,0x3d,0x33,0x9a,0x59,0x3d,0x3d,0x29,0x0d,0x1f,0x29,0x99,0x59,0x1f,0x19,0x0d,0x47,0x9a,0x59,0x0d,0x07,0x00,0x3f,0x2b, -0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02, -0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c, -0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31,0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35,0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f, -0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57,0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58,0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xff,0xe7,0x03,0xec,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x46,0x40,0x24,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36, -0x2b,0x89,0x40,0x17,0x12,0x30,0x99,0x59,0x0f,0x12,0x12,0x26,0x05,0x1c,0x26,0x9a,0x59,0x1c,0x07,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x39,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06, -0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec,0x4e,0x96,0xd8,0x8a,0x8e,0x6c,0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b, -0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x03,0x23,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a,0xb0,0x7f,0x46,0x57,0xa7,0xf4,0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49, -0x63,0x00,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x3c,0x40,0x16,0x06,0x00,0xb0,0x5b,0x06,0x10,0x0c,0x12,0xb0,0x5b,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b, -0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42, -0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x02,0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16,0x00,0x0b,0x00,0x0f,0x00,0x63,0x40,0x16,0x0f,0x0f,0x01,0x0f,0x0c,0x01,0x0c,0x05,0x06,0x00,0xb0,0x5b,0x06,0x10,0x0e,0x40,0x0f,0xb2,0x10,0x09,0xaf,0x03,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xec,0x40,0x11,0x0b, -0x06,0x4d,0x03,0x0c,0x20,0x0c,0x06,0x4d,0x0c,0x28,0x0b,0x06,0x4d,0x0c,0x80,0x0e,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x0e,0xb8,0xff,0xea,0xb6,0x0b,0x06,0x4d,0x0e,0x2f,0x11,0x01,0x5d,0x2f,0x2b,0x2b,0x1a,0xcd,0x2b,0x2b,0x2f,0x2b,0x2b,0xe1,0x00,0x10,0xf6,0x1a,0xcd,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x13,0x22,0x26, -0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x03,0x23,0x13,0xe2,0x2f,0x41,0x41,0x2f,0x2e,0x42,0x42,0x2c,0xa0,0x75,0x75,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfd,0xac,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x01,0x10,0x00,0x7f,0x04,0x6c,0x04,0x4c,0x00,0x07,0x00,0x43,0x40,0x0c,0x78,0x01,0x01,0x07,0x10,0x0b, -0x00,0x4d,0x02,0x01,0x00,0x00,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x00,0x4d,0x70,0x03,0x01,0x03,0x03,0x00,0x04,0x00,0xb8,0xff,0xe0,0xb5,0x0c,0x06,0x4d,0x00,0x05,0x01,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x01,0x2f,0x2b,0x33,0x2f,0x2b,0xc4,0x00,0x2f,0x33,0x2f,0x5d,0x2b,0x12,0x39,0x39,0x31,0x30,0x2b,0x5d,0x25,0x01,0x35,0x01,0x15, -0x01,0x15,0x01,0x04,0x6c,0xfc,0xa4,0x03,0x5c,0xfd,0x7e,0x02,0x82,0x7f,0x01,0xb0,0x3b,0x01,0xe2,0x96,0xfe,0x9c,0x04,0xfe,0xc6,0x00,0x00,0x02,0x00,0xe8,0x01,0x3e,0x04,0x94,0x03,0x6c,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x0f,0x06,0x05,0xbe,0x59,0x06,0x02,0x02,0x01,0xbe,0x59,0x02,0x01,0x00,0x05,0x04,0xb8,0xff,0xe0,0xb4,0x0c, -0x06,0x4d,0x04,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2f,0x2b,0x12,0x39,0x39,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0x02,0xe8,0x84,0xfd,0xd2,0x84,0x00,0x00,0x01,0x01,0x10,0x00,0x7f,0x04,0x6c,0x04,0x4c, -0x00,0x07,0x00,0x43,0x40,0x0c,0x78,0x00,0x01,0x02,0x10,0x0b,0x00,0x4d,0x07,0x00,0x01,0x01,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x00,0x4d,0x70,0x06,0x01,0x06,0x06,0x01,0x04,0x00,0xb8,0xff,0xe0,0xb5,0x0c,0x06,0x4d,0x00,0x05,0x02,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x02,0x2f,0x2b,0xc4,0x2f,0x2b,0x33,0x00,0x2f,0x33,0x2f,0x5d,0x2b, -0x12,0x39,0x39,0x31,0x30,0x2b,0x5d,0x01,0x01,0x35,0x01,0x35,0x01,0x35,0x01,0x04,0x6c,0xfc,0xa4,0x02,0x84,0xfd,0x7c,0x03,0x5c,0x02,0x2f,0xfe,0x50,0x95,0x01,0x38,0x06,0x01,0x64,0x96,0xfe,0x1e,0x00,0x02,0x00,0x83,0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x23,0x00,0x33,0x00,0x46,0x40,0x26,0x00,0x12,0x01,0x10,0x05,0x11,0x0f,0x14, -0x0f,0x95,0x59,0x14,0x04,0x00,0x2c,0x24,0x2c,0xb0,0x5b,0x24,0x13,0x20,0xef,0x03,0x30,0xaf,0x7f,0x28,0x01,0x28,0x28,0x11,0x19,0x84,0x0a,0x0a,0x35,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0xe1,0xd4,0xe1,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x26,0x26,0x35, -0x34,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x15,0x14,0x16,0x17,0x03,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x01,0x4f,0x09,0x0e,0x33,0x4c,0x5a,0x4c,0x33,0x25,0x40,0x54,0x2f,0xa9,0x7c,0x99,0xa4,0x4c,0x86,0x65,0x3a,0x34,0x4f,0x5c, -0x4f,0x34,0x16,0x0b,0x47,0x2c,0x22,0x21,0x21,0x21,0x2d,0x2d,0x21,0x21,0x21,0x22,0x01,0x8e,0x1a,0x53,0x29,0x40,0x67,0x5a,0x53,0x55,0x5d,0x38,0x30,0x4a,0x32,0x19,0x85,0xb0,0x60,0x28,0x4f,0x76,0x4e,0x4a,0x74,0x61,0x54,0x53,0x5a,0x36,0x2e,0x4b,0x1a,0xfe,0x60,0x20,0x20,0x2e,0x2f,0x1f,0x21,0x21,0x1f,0x2f,0x2e,0x20,0x20,0x00, -0x00,0x02,0x00,0xac,0xff,0x44,0x06,0xfc,0x05,0xae,0x00,0x32,0x00,0x3d,0x00,0xb9,0x40,0x10,0x0a,0x27,0x01,0x0a,0x32,0x01,0x03,0x00,0x1b,0x01,0x0f,0x19,0x01,0x10,0x05,0x1e,0xb8,0xff,0xc0,0x40,0x0f,0x0b,0x0c,0x00,0x4c,0x1c,0x40,0x0b,0x00,0x4d,0x18,0x40,0x0c,0x00,0x4d,0x16,0xb8,0xff,0xc0,0x40,0x4b,0x0c,0x00,0x4d,0x04,0x18, -0x0b,0x00,0x4d,0x0d,0x00,0x03,0x09,0x09,0x33,0x4c,0x59,0x09,0x0f,0x31,0x14,0x03,0x39,0x03,0x39,0x4c,0x59,0x0f,0x03,0x0f,0x03,0x25,0x2b,0x2b,0x1a,0x4c,0x59,0x2b,0x04,0x00,0x22,0x10,0x22,0x02,0x0d,0x03,0x22,0x20,0x25,0x20,0x4c,0x59,0x25,0x00,0x0d,0x0f,0x10,0x12,0x05,0x3c,0x3c,0x2e,0x36,0x48,0x06,0x22,0x06,0x22,0x06,0x28, -0x17,0x48,0x2e,0x1d,0x48,0x28,0x2f,0xe1,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x12,0x39,0x2f,0x17,0x33,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x10,0xc4,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b, -0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x00,0x5d,0x01,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x37,0x33,0x02,0x15,0x14,0x33,0x32,0x36,0x35,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x37,0x15,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x02,0x23,0x22,0x03,0x22,0x06,0x15, -0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x8c,0x05,0x49,0xd6,0x89,0xa7,0xe7,0xbc,0x48,0x71,0x10,0x04,0x02,0x08,0x7d,0x2f,0x77,0x6c,0x8f,0xfe,0xa4,0xfe,0xcc,0xfe,0xd7,0xfe,0x7c,0x01,0x71,0x01,0x39,0xf7,0xaf,0xad,0xfe,0xfd,0xfe,0x94,0xfe,0x43,0x01,0xd3,0x01,0x6b,0x01,0x54,0x01,0xbe,0xeb,0xa9,0xdb,0xb4,0x7c,0x99,0x67,0x56, -0x7c,0x91,0x01,0xa4,0xee,0xca,0xab,0xe2,0x01,0x2b,0x4a,0x38,0x1c,0x57,0xfd,0xd9,0x0a,0xcf,0xea,0xba,0x01,0x13,0x01,0x5c,0xfe,0x60,0xfe,0xc8,0xfe,0xcd,0xfe,0x87,0x52,0x7c,0x4a,0x01,0xb7,0x01,0x63,0x01,0x6e,0x01,0xe2,0xfe,0x6c,0xfe,0xbb,0xee,0xfe,0xcf,0x03,0x0e,0xec,0xaf,0x76,0x88,0xf7,0xcc,0xd6,0x00,0x00,0x02,0x00,0x16, -0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0xd0,0x40,0x2c,0x07,0x07,0x01,0x08,0x06,0x01,0x09,0x10,0x0c,0x00,0x4d,0x02,0x08,0x09,0x0a,0x0b,0x01,0x0b,0x0d,0x0e,0x0f,0x03,0x04,0x0c,0x03,0x04,0x01,0x0c,0x01,0x01,0x10,0x03,0x01,0x10,0x0c,0x00,0x4d,0x04,0x18,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0xb4,0x0b,0x0d, -0x01,0x4c,0x0c,0xb8,0xff,0xc0,0xb4,0x0b,0x0d,0x01,0x4c,0x0b,0xb8,0xff,0xc0,0x40,0x39,0x0b,0x0d,0x01,0x4c,0x0e,0x0d,0x09,0x0a,0x04,0x05,0x0b,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x40,0x12,0x16,0x48,0x0c,0x06,0x40,0x08,0x0f,0x02,0x03,0x0f,0x03,0x91,0x59,0x0f,0x0f,0x06,0x03,0x01,0x05,0x08,0x0f,0x0c,0x0b,0x03,0x02,0x0e,0x09,0x0d, -0x0a,0x0a,0x05,0x77,0x05,0x01,0x78,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x00,0x2f,0x2f,0x3f,0x39,0x2f,0x2b,0x00,0x10,0x18,0xc4,0x10,0xc4,0x1a,0x10,0xdd,0x2b,0x2b,0xc4,0x12,0x17,0x39,0x31,0x30, -0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x87,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x05,0xc0,0xc0,0x01,0x2b,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x9f,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x01, -0x92,0xfe,0x6e,0x05,0x9a,0xfc,0x8f,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x00,0x00,0x03,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0xdc,0x40,0x0c,0x09,0x0d,0x01,0x06,0x0b,0x01,0x03,0x04,0x01,0x10,0x03,0x04,0xb8,0xff,0xe8,0x40,0x2e,0x0b,0x00,0x4d,0x08,0x18,0x11,0x11,0x18,0x91,0x59,0x11, -0x11,0x19,0x01,0x00,0x19,0x91,0x59,0x00,0x12,0x01,0x10,0x91,0x59,0x01,0x03,0x09,0x19,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x7d,0x1d,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x1d,0xb8,0xff,0xf0,0x40,0x2f,0x0b,0x06,0x4d,0x1d,0x1d,0x05,0x06,0x0c, -0x06,0x4d,0x05,0x7d,0x7f,0x15,0x01,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x15,0x21,0x11,0x19,0x08,0x0d,0x06,0x4d,0x19,0x08,0x0c,0x06,0x4d,0x19,0x08,0x0b,0x06,0x4d,0x19,0x7e,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x00, -0x21,0x40,0x0b,0x00,0x4d,0x2b,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x2b,0x00,0x5f,0x5e,0x5d,0x5d,0x5d,0x33,0x11, -0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0xbc,0x01,0x98,0xba,0xda,0x84,0x74,0x91,0xae,0xfe,0xf8,0xc9,0xfa,0xac,0x8a,0x9e,0xfe,0xed,0xc1,0xe4,0x94,0xa3,0xfe,0xa6,0x05,0x9a,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9, -0x94,0xb8,0xe4,0x05,0x02,0xfe,0x31,0x85,0x79,0xd1,0xfd,0x9a,0xfd,0xfc,0x8c,0x7a,0xfe,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x00,0x15,0x00,0x99,0x40,0x0f,0x45,0x0a,0x01,0x49,0x00,0x01,0x4a,0x03,0x01,0x0f,0x17,0x01,0x0c,0x03,0x09,0xb8,0xff,0xc0,0x40,0x0c,0x0c,0x00,0x4d,0x03,0x18,0x0b,0x00,0x4d,0x0a,0x0b, -0x00,0x15,0xb8,0xff,0xc0,0x40,0x43,0x0b,0x00,0x4d,0x15,0x15,0x13,0x02,0x13,0x91,0x59,0x02,0x13,0x00,0x0b,0x01,0x0c,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x00,0x0b,0x30,0x0b,0x0d,0x01,0x4c,0x3f,0x0b,0x01,0x0b,0x0b,0x17,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05, -0x08,0x0c,0x06,0x4d,0x05,0x13,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x33,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x33,0x11,0x33,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x00,0x11,0x10, -0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x04,0x8c,0x9f,0xed,0xfe,0xce,0xfe,0x90,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0xd8,0x9e,0x3c,0x54,0x01,0x8a,0x01,0x40,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00,0x00,0x02, -0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x97,0x40,0x26,0x00,0x03,0x01,0x00,0x03,0x01,0x10,0x05,0x00,0x09,0x91,0x59,0x00,0x12,0x01,0x08,0x91,0x59,0x01,0x03,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7d,0x0d,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff, -0xf0,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xea,0x40,0x18,0x0b,0x06,0x4d,0x0d,0x0d,0x11,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7e,0x00,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0b, -0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0xbc,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0xd6, -0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x05,0x9a,0xfd,0x45,0xfe,0xb4,0xfe,0x6d,0x05,0x02,0xfb,0x96,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x00,0x0b,0x00,0x70,0x40,0x34,0x06,0x09,0x91,0x59,0x06,0x02,0x01,0x06,0x91,0x2b,0x30,0x06,0x0a,0x02,0x01,0x0a,0x91,0x59,0x01,0x12,0x02,0x05,0x91,0x59, -0x02,0x03,0x04,0x08,0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x7e,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f, -0x33,0x33,0x2f,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x03,0xb4,0xfd,0x08,0x02,0xd8,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0x05,0x9a,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0x94, -0x05,0x9a,0x00,0x09,0x00,0x67,0x40,0x2c,0x02,0x05,0x91,0x59,0x0f,0x02,0x01,0x0b,0x03,0x02,0x02,0x08,0x07,0x12,0x08,0x01,0x91,0x59,0x08,0x03,0x04,0x04,0x00,0x00,0x0b,0x02,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf6,0xb3, -0x0c,0x06,0x4d,0x07,0xb8,0xff,0xf6,0xb6,0x0b,0x06,0x4d,0x07,0x2f,0x0b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x94,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0xa8, -0x02,0xd8,0x05,0x02,0xfe,0x10,0x97,0xfd,0x85,0x05,0x9a,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xec,0x05,0xb2,0x00,0x19,0x00,0xae,0x40,0x09,0x00,0x0a,0x01,0x0f,0x04,0x01,0x10,0x05,0x09,0xb8,0xff,0xc0,0x40,0x3b,0x0c,0x00,0x4d,0x18,0x17,0x91,0x59,0x18,0x18,0x08,0x00,0x15,0x13,0x02,0x13,0x91,0x59,0x02,0x13,0x0f,0x0b,0x1f, -0x0b,0x02,0x0a,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x17,0x17,0x15,0x10,0x0b,0x0b,0x00,0x04,0x0d,0x06,0x4d,0x00,0x04,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x15,0xb8,0xff,0xee,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xee,0x40,0x22,0x0b,0x06,0x4d,0x15,0x15,0x1b,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c, -0x06,0x4d,0x10,0x7d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x33,0x12,0x39,0x18,0x2f,0x2b, -0x31,0x30,0x00,0x2b,0x5f,0x5e,0x5d,0x5d,0x25,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x21,0x35,0x21,0x04,0xec,0xd8,0xfe,0xf8,0xfe,0xcd,0xfe,0x85,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc6,0x01,0xe2,0x62, -0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xf0,0xfe,0xc9,0x43,0x01,0x92,0x98,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x00,0x0b,0x00,0x79,0x40,0x48,0x08,0x03,0x91,0x59,0x08,0x06,0x05,0x08,0x91,0x2b,0x30,0x01,0x12,0x05,0x12,0x0a,0x03,0x06,0x03,0x09,0x00,0x06,0x0d,0x06, -0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x0d,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05, -0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xa8,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00, -0x00,0x01,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x00,0x03,0x00,0x10,0xb6,0x00,0x7e,0x01,0x01,0x12,0x02,0x03,0x00,0x3f,0x3f,0x01,0x2f,0xe1,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x64,0xa8,0xa8,0x05,0x9a,0x00,0x01,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x00,0x0c,0x00,0x6d,0x40,0x17,0x00,0x09,0x01,0x00,0x01,0x01,0x0f,0x09, -0x01,0x10,0x05,0x06,0x06,0x08,0x03,0x08,0x91,0x59,0x03,0x13,0x0b,0x03,0x05,0xb8,0xff,0xf0,0x40,0x1c,0x0d,0x06,0x4d,0x05,0x05,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x0a,0x18,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x0a, -0x0a,0x0e,0x0d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x02,0x2b,0xd8,0xb5,0x54,0x36,0x36,0x56,0xe3,0xa8,0x02,0x02,0xff,0xfe,0xe5,0x18, -0xa6,0x27,0x01,0x81,0x03,0x9a,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x10,0x00,0x9c,0x40,0x1c,0x7d,0x0e,0x01,0x29,0x0e,0x39,0x0e,0x02,0x7e,0x01,0x01,0x2a,0x01,0x3a,0x01,0x02,0x10,0x18,0x0c,0x0d,0x01,0x4c,0x10,0x10,0x0b,0x01,0x4d,0x0e,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x18, -0x0b,0x0d,0x01,0x4c,0x0a,0x0e,0x10,0x01,0x05,0x05,0x08,0x07,0x12,0x08,0x03,0x0e,0x0f,0x0f,0x01,0x10,0x70,0x00,0x01,0x00,0xb8,0xff,0xe8,0x40,0x19,0x0d,0x06,0x4d,0x00,0x00,0x12,0x0a,0x05,0x06,0x0d,0x06,0x4d,0x05,0x06,0x0c,0x06,0x4d,0x05,0x06,0x0b,0x06,0x4d,0x05,0x7e,0x07,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff, -0xf8,0x40,0x09,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x11,0x33,0x2f,0x2b,0x5d,0x39,0x33,0x33,0x2f,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33, -0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x05,0x00,0x86,0x40,0x09,0x01,0x04,0x91,0x59,0x01,0x12,0x02,0x03,0x05,0xb8,0xff,0xf0, -0xb3,0x10,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x05,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x05,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x05,0xb8,0xff,0xc0,0x40,0x18,0x0a,0x1f,0x48,0x05,0x05,0x07,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c, -0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf2,0x40,0x09,0x0c,0x06,0x4d,0x01,0x05,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x03,0xa4, -0xfd,0x18,0xa8,0x02,0x40,0x05,0x9a,0xfa,0xfe,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x00,0x1b,0x00,0xba,0x40,0x15,0x7a,0x1a,0x01,0x75,0x13,0x01,0x26,0x13,0x36,0x13,0x02,0x72,0x16,0x01,0x16,0x18,0x0b,0x0d,0x01,0x4c,0x0d,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xe8,0x40,0x37,0x0b,0x0d,0x01, -0x4c,0x16,0x1a,0x01,0x05,0x09,0x0d,0x06,0x12,0x11,0x12,0x12,0x03,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x1a,0x08,0x0d,0x06,0x4d,0x1a,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x01,0x06,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb5,0x0b,0x06,0x4d,0x01,0x1d,0x13,0xb8,0xff, -0xf8,0x40,0x17,0x0d,0x06,0x4d,0x13,0x0d,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x7e,0x11,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x11,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x2b,0x12,0x39,0x2b,0x2b,0x2f,0x2b,0x5d,0x33,0x2b,0xe9,0x2b,0x2b, -0x2b,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x06,0x72,0xa7,0x0e,0x04,0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x15,0x16,0x04,0x08,0xa2,0xde, -0x01,0xb8,0x33,0x0f,0x06,0x2b,0x1a,0x01,0xc1,0xd2,0x03,0xc2,0x72,0xa5,0x61,0x2a,0xfb,0xb2,0x04,0x46,0x30,0x63,0x56,0xc3,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x73,0x39,0x76,0x3a,0x03,0xe4,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x00,0x13,0x00,0xad,0x40,0x0d,0x77,0x0c,0x01,0x72,0x0b,0x01,0x78,0x02,0x01,0x7d,0x01,0x01, -0x0b,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x00,0x4d,0x0f,0x08,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xf8,0x40,0x2f,0x0b,0x0d,0x01,0x4c,0x0e,0x12,0x01,0x05,0x04,0x09,0x0a,0x03,0x09,0x01,0x0f,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x11,0x01,0x11,0x18,0x0d,0x06,0x4d,0x11,0x11,0x08, -0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x11,0x15,0x0b,0x05,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x7e,0x09,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b, -0x39,0x32,0x12,0x39,0x2b,0x2b,0x2f,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x39,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x05,0x40,0xce,0xfd,0x1e,0x1c,0x12,0x06,0x08,0xa8,0xda,0x02,0xce, -0x2d,0x0d,0x04,0x0a,0xa8,0x04,0x77,0x2b,0x2f,0x2e,0x97,0xfb,0xf4,0x05,0x9a,0xfb,0x9b,0x46,0x1a,0x3e,0x95,0x03,0xf2,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x81,0x40,0x1e,0x00,0x12,0x91,0x59,0x00,0x13,0x06,0x0c,0x91,0x59,0x06,0x04,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d, -0x09,0x06,0x0b,0x06,0x4d,0x09,0x7d,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xea,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x15,0x30,0x15,0x02,0x15,0x15,0x19,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10, -0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10, -0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xfe,0xd4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x05,0x32,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01, -0x36,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x90,0x40,0x29,0x46,0x06,0x01,0x02,0x0f,0x01,0x0c,0x04,0x0c,0x00,0x91,0x59,0x0c,0x0c,0x03,0x02,0x12,0x03,0x0b,0x91,0x59,0x03,0x03,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7d,0x10,0xb8,0xff,0xe8, -0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x10,0x10,0x0b,0x06,0x4d,0x10,0x10,0x14,0x0c,0x01,0x06,0x0d,0x06,0x4d,0x01,0x06,0x0c,0x06,0x4d,0x01,0x06,0x0b,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x02,0x04,0x0b,0x06,0x4d,0x02,0x2f,0x2b, -0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x01,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0x01,0x8a,0xe6,0xfd,0xfe,0xe7,0xef,0xbd, -0xb0,0xae,0xb7,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0xe0,0xcc,0xcc,0xfe,0xfc,0x02,0xe4,0xfd,0xb4,0x9f,0x91,0x01,0x1c,0x00,0x02,0x00,0x5e,0xff,0x3f,0x06,0x25,0x05,0xb2,0x00,0x14,0x00,0x24,0x00,0x36,0x40,0x1a,0x13,0x10,0x04,0x11,0x0c,0x0c,0x21,0x19,0x04,0x13,0x10,0x00,0x08,0x08,0x15,0x91,0x59,0x08,0x04,0x00,0x1d,0x91, -0x59,0x12,0x00,0x13,0x00,0x3f,0xc6,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x33,0x2f,0x33,0x10,0xc6,0x12,0x39,0x39,0x31,0x30,0x05,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x07,0x01,0x21,0x25,0x06,0x03,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x11, -0x10,0x27,0x26,0x02,0xfe,0xfe,0xd0,0xb9,0xb7,0xbb,0xbc,0x01,0x41,0x01,0x28,0xb6,0xb6,0xba,0x2c,0x32,0x01,0x93,0xfe,0xcf,0xfe,0xf2,0x6a,0x72,0xe2,0x8d,0x8d,0x89,0x8a,0xdd,0xec,0x88,0x88,0x84,0x84,0x18,0xc9,0xc9,0x01,0x42,0x01,0x5b,0xcd,0xce,0xc8,0xc8,0xfe,0xbd,0xfe,0xa1,0xcc,0x31,0x23,0xfe,0xdf,0xca,0x21,0x05,0x32,0xa3, -0xa3,0xfe,0xf7,0xfe,0xf8,0xa3,0xa1,0x9a,0x9a,0x01,0x15,0x01,0x1d,0x9a,0x9b,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0xc0,0x05,0x9a,0x00,0x1c,0x00,0x27,0x00,0xbb,0x40,0x3a,0x45,0x0f,0x01,0x03,0x40,0x0e,0x01,0x0f,0x02,0x01,0x0c,0x05,0x17,0x1e,0x08,0x08,0x1e,0x91,0x59,0x08,0x08,0x0a,0x1d,0x0b,0x1d,0x91,0x59,0x0b,0x03,0x01, -0x0a,0x17,0x09,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x24,0x7d,0x11,0x79,0x02,0x01,0x7a,0x01,0x01,0x02,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x26,0x0b,0x0d,0x01,0x4c,0x01,0x1c,0x02,0x11,0x04,0x70,0x00,0x01,0x00,0x08,0x0d,0x06,0x4d,0x00,0x29,0x1e,0x09,0x06, -0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7e,0x0a,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x10,0xc6,0x2b,0x5d,0x17,0x32,0x2b,0x2b,0x5d,0x5d,0x2f,0xe1,0x2b,0x2b,0x2b, -0x12,0x39,0x00,0x2f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x5d,0x5f,0x5d,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x04,0xc0,0xc8,0xf0, -0x21,0x3e,0x41,0x4b,0x2f,0x8a,0xa8,0x01,0xac,0x5e,0x9f,0x75,0x42,0x2d,0x53,0x75,0x49,0x24,0x35,0x30,0x2f,0x1d,0xfd,0xb1,0xe4,0x3f,0x6b,0x4e,0x2c,0x95,0x8d,0x01,0x92,0x38,0x4f,0x32,0x17,0xfd,0x9e,0x05,0x9a,0x2f,0x60,0x8f,0x60,0x4b,0x7d,0x62,0x45,0x13,0x04,0x10,0x29,0x38,0x47,0x2f,0x03,0x53,0xfd,0xf8,0x26,0x47,0x67,0x40, -0x73,0x81,0x00,0x01,0x00,0x79,0xff,0xe8,0x03,0xde,0x05,0xb2,0x00,0x35,0x00,0xd2,0x40,0x15,0x4b,0x35,0x01,0x4a,0x2e,0x01,0x46,0x25,0x01,0x44,0x1a,0x01,0x46,0x15,0x01,0x34,0x18,0x0c,0x00,0x4d,0x2a,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x28,0xb8,0xff,0xf0,0xb3,0x0c,0x00,0x4d,0x19,0xb8,0xff,0xe8,0x40,0x56,0x0c,0x00,0x4d,0x11, -0x18,0x0c,0x00,0x4d,0x09,0x2c,0x13,0x22,0x04,0x18,0x31,0x1a,0x00,0x01,0x00,0x1b,0x01,0x0c,0x03,0x1b,0x18,0x40,0x18,0x1d,0x91,0x59,0x18,0x04,0x00,0x01,0x01,0x0b,0x03,0x01,0x31,0x31,0x06,0x91,0x59,0x31,0x13,0x1b,0x1b,0x2c,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0x08,0x0b,0x06,0x4d,0x22,0x7d,0x13,0x13,0x01, -0x2c,0x08,0x0d,0x06,0x4d,0x2c,0x08,0x0c,0x06,0x4d,0x2c,0x08,0x0b,0x06,0x4d,0x2c,0x7d,0x09,0xb8,0xff,0xf0,0x40,0x0f,0x0b,0x06,0x4d,0x20,0x09,0x01,0x09,0x09,0x37,0x01,0x08,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18, -0x10,0xc4,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x11,0x33,0x32,0x11,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x37,0x35,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e, -0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x79,0x22,0x5f,0x69,0x6a,0x2d,0x9b,0x99,0x33,0x5a,0x7b,0x47,0x4b,0x82,0x60,0x37,0x56,0x8c,0xb3,0x5d,0xd4,0x61,0x7f,0xc7,0x37,0x6e,0x56,0x36,0x29,0x50,0x73,0x4b,0x4d,0x8a,0x68,0x3d,0x53,0x8d,0xb8,0x66,0x22,0x64,0x68,0x5d,0x3a,0xc6,0x1e,0x30,0x21,0x12,0x73,0x6c, -0x3a,0x56,0x47,0x41,0x24,0x26,0x4e,0x5e,0x77,0x50,0x62,0x91,0x5e,0x2e,0x33,0xbd,0x58,0x17,0x34,0x52,0x3b,0x37,0x50,0x42,0x3e,0x25,0x26,0x54,0x66,0x7c,0x50,0x6a,0x93,0x5c,0x29,0x0b,0x15,0x1f,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x07,0x00,0x7e,0x40,0x0b,0x03,0x12,0x01,0x05,0x06,0x05,0x91,0x59,0x06,0x03, -0x05,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x28,0x0b,0x06,0x4d,0x00,0x05,0x00,0x0e,0x02,0x03,0x05,0x42,0xcf,0x05,0x01,0x05,0x05,0x08,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0x04,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x03,0x03, -0x09,0x08,0x09,0x40,0x0c,0x00,0x4d,0x09,0xb8,0xff,0xc0,0xb2,0x0b,0x00,0x4d,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xe2,0x18,0x2f,0x2e,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xa8,0xfe, -0x63,0x03,0xe3,0x05,0x02,0xfa,0xfe,0x05,0x02,0x98,0x00,0x01,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x05,0x9a,0x00,0x0d,0x00,0x7a,0x40,0x31,0x02,0x0a,0x12,0x0a,0x02,0x02,0x08,0x12,0x08,0x02,0x0b,0x04,0x02,0x09,0x91,0x59,0x02,0x13,0x0c,0x03,0x05,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00, -0x7e,0x7f,0x0b,0x01,0x0b,0x0c,0x0d,0x06,0x4d,0x0b,0x0b,0xb8,0xff,0xfa,0x40,0x17,0x0c,0x06,0x4d,0x0b,0x0f,0x07,0x06,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x7e,0x04,0xb8,0xff,0xfe,0x40,0x09,0x0d,0x06,0x4d,0x04,0x04,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2b,0x2f, -0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x3f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x00,0x01,0x00,0x12, -0x00,0x00,0x04,0xe6,0x05,0x9a,0x00,0x0b,0x00,0xc8,0x40,0x0a,0x7b,0x0b,0x01,0x74,0x04,0x01,0x78,0x02,0x01,0x0b,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x0b,0xb8,0xff,0xe0,0xb3,0x0d,0x01,0x4d,0x0b,0xb8,0xff,0xe0,0x40,0x22,0x0b,0x01,0x4d,0x04,0x30,0x0c,0x01,0x4d,0x04,0x20,0x0d,0x01,0x4d,0x04,0x20,0x0b,0x01,0x4d,0x39,0x0b,0x01, -0x36,0x04,0x01,0x74,0x07,0x01,0x07,0x28,0x0b,0x0d,0x01,0x4c,0x07,0xb8,0xff,0xf0,0x40,0x19,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x0b,0x07,0x02,0x03,0x03,0x02,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0x40,0x11,0x0b,0x06,0x4d,0x0b,0x28,0x00,0x01,0x00, -0x08,0x0c,0x0d,0x01,0x4c,0x00,0x00,0x0d,0x04,0xb8,0xff,0xf8,0x40,0x0f,0x0d,0x06,0x4d,0x04,0x04,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x03,0xb8,0xff,0xf8,0xb7,0x0c,0x0d,0x01,0x4c,0x27,0x03,0x01,0x03,0x2f,0x5d,0x2b,0x33,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x2b,0x5d,0x32,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2b, -0x2b,0x2b,0x2b,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0xe6,0xfd,0xed,0xb9,0xfd,0xf8,0xbb,0x01,0x8d,0x13,0x0a,0x04,0x08,0x19,0x01,0x95,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfb,0x8f,0x37,0x48,0x3c,0x45,0x04,0x6f,0x00,0x00,0x01, -0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x00,0x1b,0x01,0x41,0x40,0x20,0x7b,0x1b,0x01,0x79,0x1a,0x01,0x76,0x14,0x01,0x76,0x0d,0x01,0x73,0x0c,0x01,0x75,0x09,0x01,0x7b,0x02,0x01,0x1b,0x20,0x0c,0x00,0x4d,0x1a,0x20,0x0c,0x00,0x4d,0x14,0xb8,0xff,0xe8,0x40,0x09,0x0b,0x00,0x4d,0x13,0x18,0x0b,0x00,0x4d,0x0d,0xb8,0xff,0xe0,0xb3, -0x0c,0x00,0x4d,0x0c,0xb8,0xff,0xe0,0x40,0x0a,0x0c,0x00,0x4d,0x0a,0x08,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x00,0x4d,0x08,0x10,0x0b,0x00,0x4d,0x02,0x10,0x0b,0x00,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x1b,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x1b,0xb8,0xff,0xe0,0xb3, -0x0d,0x01,0x4d,0x1b,0xb8,0xff,0xe8,0x40,0x13,0x0b,0x01,0x4d,0x0c,0x30,0x0c,0x01,0x4d,0x0c,0x20,0x0d,0x01,0x4d,0x0c,0x18,0x0b,0x01,0x4d,0x05,0xb8,0xff,0xc8,0x40,0x22,0x0b,0x0d,0x01,0x4c,0x17,0x38,0x0b,0x0d,0x01,0x4c,0x0f,0x38,0x0b,0x0d,0x01,0x4c,0x17,0x40,0x0b,0x0c,0x00,0x4c,0x0f,0x40,0x0b,0x0c,0x00,0x4c,0x05,0x10,0x0d, -0x06,0x4d,0x17,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xf0,0x40,0x1d,0x0d,0x06,0x4d,0x00,0x01,0x05,0x0f,0x13,0x17,0x06,0x0a,0x0b,0x03,0x0a,0x14,0x13,0x06,0x01,0x02,0x17,0x09,0x0a,0x0f,0x17,0x20,0x0b,0x00,0x4d,0x0f,0xb8,0xff,0xe0,0xb3,0x0b,0x00,0x4d,0x17,0xb8,0xff,0xe0,0x40,0x14,0x0c,0x00,0x4d,0x0f,0x20,0x0c, -0x00,0x4d,0x0f,0x06,0x17,0x03,0x0b,0x00,0x00,0x1d,0x0b,0x2f,0x1d,0x01,0x5d,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, -0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x07,0x60,0xfe,0x6b,0xc5,0xfe,0xd9,0x13,0x04,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x13,0x05,0x05, -0x05,0x1a,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x04,0x17,0x01,0x25,0x05,0x9a,0xfa,0x66,0x04,0x18,0x43,0x4f,0x4a,0x46,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x35,0x5b,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x34,0x56,0x04,0x50,0x00,0x01,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x00,0x15,0x00,0xc0,0x40,0x19,0x7b,0x13,0x01,0x7a, -0x12,0x01,0x75,0x0d,0x01,0x74,0x0c,0x01,0x74,0x08,0x01,0x75,0x07,0x01,0x79,0x02,0x01,0x7b,0x01,0x01,0x13,0xb8,0xff,0xe0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0c,0x20,0x0b,0x0d,0x01,0x4c,0x08,0x20,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x13,0x08,0x0c,0x00,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09,0x0c, -0x00,0x4d,0x0a,0x10,0x0b,0x00,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x0f,0x0c,0x00,0x4d,0x01,0x08,0x0c,0x00,0x4d,0x0f,0x18,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x0f,0xb8,0xff,0xf0,0x40,0x1f,0x0d,0x06,0x4d,0x05,0x10,0x0d,0x06,0x4d,0x01,0x05,0x0f,0x13,0x04,0x09,0x0b,0x03,0x09,0x15,0x0a,0x0b,0x14,0x00, -0x10,0x0b,0x00,0x4d,0x00,0x00,0x17,0x0b,0x09,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d,0x09,0x2f,0x2b,0xc6,0x11,0x33,0x2f,0x2b,0xc6,0x11,0x39,0x39,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23, -0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x04,0x9a,0xcd,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xe0,0xfe,0x46,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe,0x3d,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0xd1,0x02,0xc9,0xfe,0x08,0x32,0x32,0x42,0x26, -0x01,0xf4,0xfd,0x39,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x0d,0x00,0x65,0x40,0x21,0x73,0x06,0x01,0x04,0x09,0x01,0x01,0x05,0x03,0x12,0x0d,0x03,0x05,0x03,0x09,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xfe, -0x40,0x16,0x0b,0x06,0x4d,0x03,0x03,0x05,0x0d,0x7d,0x00,0x00,0x0f,0x06,0x18,0x0b,0x0d,0x01,0x4c,0x06,0x05,0x20,0x0f,0x01,0x5d,0x2f,0x33,0x2b,0x11,0x33,0x2f,0xe9,0x11,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x39,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xcd,0x33,0x31,0x30,0x01,0x5d,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x16, -0x17,0x33,0x36,0x37,0x01,0x04,0x60,0xfe,0x27,0xa8,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x0a,0x1c,0x01,0x50,0x05,0x9a,0xfc,0x78,0xfd,0xee,0x02,0x0e,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x22,0x36,0x02,0x88,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x09,0x00,0xa6,0x40,0x0e,0x0c,0x06,0x01,0x04,0x01,0x01,0x10,0x01, -0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xe0,0x40,0x31,0x0b,0x0d,0x01,0x4c,0x35,0x00,0x45,0x00,0x02,0x03,0x00,0x13,0x00,0x23,0x00,0x03,0x3a,0x05,0x4a,0x05,0x02,0x0c,0x05,0x1c,0x05,0x2c,0x05,0x03,0x17,0x03,0x05,0x01,0x04,0x04,0x01,0x91,0x59,0x04,0x12,0x00,0x08,0x07,0x08,0x07,0x91,0x59,0x08,0x03,0x06,0xb8,0xff,0xf8,0x40, -0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, -0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x2b,0x2b,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xb8,0x03,0x34,0xfb,0xd1,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x26,0x98,0x2f,0x04,0xd3,0x98,0x00,0x00,0x01, -0x00,0xc8,0xfe,0xba,0x02,0x38,0x05,0x9a,0x00,0x07,0x00,0x39,0x40,0x11,0x02,0x05,0xd9,0x59,0x02,0x03,0x01,0x06,0xd9,0x59,0x01,0x20,0x04,0x00,0x06,0xea,0x01,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xe8,0x40,0x09,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0xdd,0xc4,0x00,0x3f,0x2b,0x00, -0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x23,0x11,0x33,0x02,0x38,0xfe,0x90,0x01,0x70,0xde,0xde,0xfe,0xba,0x06,0xe0,0x77,0xfa,0x0e,0x00,0x01,0xff,0xe6,0xff,0x10,0x03,0x1e,0x05,0x9a,0x00,0x03,0x00,0x19,0x40,0x0d,0x78,0x01,0x01,0x00,0x08,0x0b,0x00,0x4d,0x00,0x02,0x03,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x2f,0x31,0x30, -0x01,0x2b,0x5d,0x05,0x23,0x01,0x33,0x03,0x1e,0x97,0xfd,0x5f,0x9b,0xf0,0x06,0x8a,0x00,0x01,0x00,0x35,0xfe,0xba,0x01,0xa4,0x05,0x9a,0x00,0x07,0x00,0x35,0x40,0x1b,0x06,0x05,0xd9,0x59,0x06,0x03,0x01,0x02,0xd9,0x59,0x01,0x20,0x05,0x01,0x00,0xea,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xee,0xb3,0x0b, -0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xdd,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x01,0xa4,0xfe,0x91,0xdd,0xdd,0x01,0x6f,0xfe,0xba,0x77,0x05,0xf2,0x77,0x00,0x00,0x01,0x00,0xe6,0x02,0x70,0x04,0x96,0x05,0xb2,0x00,0x07,0x00,0x26,0x40,0x16,0x79,0x06,0x01,0x79,0x01,0x01, -0x07,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x05,0x03,0x07,0x04,0x2f,0x00,0x01,0x00,0x05,0x2f,0x2f,0x5d,0x00,0x3f,0x33,0x2f,0xc4,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x01,0x23,0x01,0x23,0x01,0x23,0x01,0x33,0x04,0x96,0x96,0xfe,0xb4,0x06,0xfe,0xcb,0x93,0x01,0xa6,0x41,0x02,0x70,0x02,0x6b,0xfd,0x95,0x03,0x42,0x00,0x01,0x00,0x00,0xfe,0xd7, -0x03,0x52,0xff,0x4e,0x00,0x03,0x00,0x0f,0xb6,0x01,0x02,0xd9,0x59,0x01,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0xfe,0xd7,0x77,0x00,0x01,0x00,0x52,0x04,0xc2,0x01,0xd7,0x06,0x0a,0x00,0x03,0x00,0x1c,0xb7,0x77,0x03,0x01,0x03,0x80,0x01,0x00,0x02,0xb8,0xff,0xc0,0xb3,0x0d, -0x10,0x48,0x02,0x2f,0x2b,0xcd,0x00,0x2f,0x1a,0xcd,0x31,0x30,0x01,0x5d,0x01,0x23,0x01,0x33,0x01,0xd7,0x7f,0xfe,0xfa,0xa8,0x04,0xc2,0x01,0x48,0x00,0x02,0x00,0x5a,0xff,0xe8,0x03,0x83,0x04,0x18,0x00,0x14,0x00,0x1f,0x00,0xaa,0x40,0x52,0x06,0x10,0x01,0x00,0x09,0x01,0x10,0x04,0x06,0x18,0x0b,0x0c,0x00,0x4c,0x0b,0x15,0x96,0x59, -0x0b,0x10,0x0d,0x06,0x4d,0x0b,0x0b,0x1c,0x12,0x01,0x15,0x03,0x1c,0x05,0x1c,0x95,0x59,0x05,0x16,0x0f,0x40,0x09,0x0c,0x48,0x0f,0x0f,0x0d,0x12,0x0d,0x95,0x59,0x12,0x10,0x20,0x0f,0x30,0x0f,0x02,0x0f,0x0b,0x1f,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0x02,0x0d,0x06,0x4d,0x01, -0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xee,0x40,0x17,0x0b,0x06,0x4d,0x01,0x01,0x21,0x0f,0x19,0x83,0x08,0x0c,0x0c,0x06,0x4d,0x08,0x04,0x0b,0x06,0x4d,0x2f,0x08,0x01,0x08,0x2f,0x5d,0x2b,0x2b,0xe9,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x33,0x2f,0x5d,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f, -0x2b,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x31,0x30,0x00,0x2b,0x5f,0x5e,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x03,0x83,0xa4,0x04,0x6b,0xd0,0x99,0xad,0x01,0x52, -0x01,0x33,0xd3,0xb9,0x95,0x97,0xc5,0x01,0x69,0xa4,0xf7,0x72,0x74,0x6b,0x59,0x7a,0x9f,0xa0,0xb8,0xa2,0x86,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xfe,0x82,0x94,0x22,0x10,0x51,0x67,0x4b,0x5f,0xab,0x83,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10, -0x06,0x03,0x15,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x07,0x1b,0x09,0x1b,0x95,0x59,0x09,0x10,0x04,0x00,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18, -0x18,0x1f,0x06,0x02,0x12,0x06,0x0d,0x06,0x4d,0x12,0x06,0x0c,0x06,0x4d,0x12,0x06,0x0b,0x06,0x4d,0x12,0x84,0x03,0xb8,0xff,0xf8,0x40,0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b, -0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x15,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9, -0xcb,0x6c,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0x94,0x05,0xec,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x00,0x15,0x00,0x85,0x40,0x5b,0x58,0x03,0x01,0x09,0x0f,0x19,0x0f,0x02,0x0b,0x00,0x15,0x01,0x0c,0x03, -0x15,0x15,0x13,0x02,0x13,0x95,0x59,0x02,0x16,0x0b,0x0b,0x0d,0x08,0x0d,0x95,0x59,0x08,0x10,0x00,0x20,0x0c,0x01,0x4d,0x00,0x00,0x0b,0x0c,0x0c,0x06,0x4d,0x0b,0x02,0x0b,0x06,0x4d,0x70,0x0b,0x01,0x0b,0x20,0x0c,0x01,0x4d,0x0b,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x83,0x05,0x14,0x0d, -0x06,0x4d,0x05,0x0c,0x0c,0x06,0x4d,0x05,0x23,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x2f,0x2b,0x5d,0x2b,0x2b,0x33,0x2f,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x5e,0x5d,0x01,0x5d,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17, -0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x60,0x76,0xa2,0xdb,0xfe,0xf3,0x01,0x22,0xf2,0x87,0x67,0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x86,0x76,0x2f,0x47,0x01,0x1d,0xe3,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0xb4,0xd0,0x59,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9b, -0x40,0x38,0x0f,0x06,0x01,0x10,0x06,0x1c,0x18,0x0b,0x0c,0x00,0x4c,0x02,0x1b,0x05,0x1b,0x95,0x59,0x05,0x16,0x01,0x15,0x0e,0x15,0x0b,0x15,0x95,0x59,0x0b,0x10,0x0f,0x00,0x11,0x0d,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06, -0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x18,0x06,0x0d,0x06,0x4d,0x18,0x06,0x0c,0x06,0x4d,0x18,0x06,0x0b,0x06,0x4d,0x18,0x83,0x08,0x10,0x0d,0x06,0x4d,0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b, -0xe9,0x2b,0x2b,0x2b,0x33,0x33,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1, -0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfb,0xe3,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xdd,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0xaf,0xb5,0x0f,0x07,0x01,0x10,0x06,0x06,0xb8,0xff,0xc0, -0x40,0x2d,0x0b,0x0e,0x48,0x06,0x06,0x01,0x04,0x19,0x01,0x95,0x59,0x19,0x19,0x04,0x0f,0x09,0x04,0x95,0x59,0x09,0x16,0x0f,0x16,0x95,0x59,0x0f,0x10,0x7f,0x07,0x01,0x07,0x16,0x0c,0x06,0x4d,0x07,0x20,0x0c,0x01,0x4d,0x07,0x07,0x00,0x83,0x13,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x13,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x13, -0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x13,0xb8,0xff,0xe8,0x40,0x28,0x0b,0x06,0x4d,0x13,0x13,0x1b,0x19,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x83,0x0c,0x10,0x0d,0x06,0x4d,0x0c,0x10,0x0c,0x06,0x4d,0x0c,0x1d,0x0b,0x06,0x4d,0x0c,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39, -0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x32,0x2f,0x2b,0x2b,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x03, -0xdd,0xfd,0x2d,0x04,0xb0,0x9a,0xad,0x91,0x87,0xde,0xd9,0xf8,0x01,0x0f,0xc9,0xc9,0xdc,0xa8,0x01,0x87,0x78,0x74,0xa2,0x13,0x01,0xd7,0xab,0xba,0x72,0x9a,0x62,0x01,0x17,0xfd,0xef,0x01,0x2d,0xfe,0xfc,0xe7,0x35,0x8e,0x9e,0xa6,0x86,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x14,0x00,0x8a,0xb9,0x00,0x10,0xff, -0xc0,0x40,0x3a,0x0b,0x00,0x4d,0x0a,0x15,0x00,0x00,0x02,0x08,0x0c,0x05,0x0d,0x0d,0x0c,0x95,0x59,0x0d,0x0f,0x12,0x02,0x95,0x59,0x12,0x01,0x07,0x07,0x00,0x0c,0x0c,0x06,0x4d,0x2f,0x00,0x01,0x00,0x0c,0x00,0x0c,0x05,0x0e,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8, -0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xe6,0x40,0x0a,0x0b,0x06,0x4d,0x0a,0x0a,0x16,0x15,0x2f,0x16,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x33,0x2f,0x2f,0x5d,0x2b,0x33,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x11,0x33,0x12,0x39, -0x18,0x2f,0x3f,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x02,0xa0,0x30,0x3d,0xac,0xf0,0xf0,0xa3,0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x10, -0x04,0x18,0x00,0x18,0x00,0x25,0x00,0xca,0x40,0x10,0x0a,0x04,0x01,0x03,0x0f,0x0e,0x01,0x10,0x06,0x24,0x18,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe0,0xb4,0x0b,0x0c,0x00,0x4c,0x05,0xb8,0xff,0xc0,0x40,0x3a,0x0b,0x0f,0x48,0x05,0x05,0x07,0x02,0x07,0x95,0x59,0x02,0x1c,0x0a,0x23,0x0d,0x23,0x95,0x59,0x0d,0x16,0x17,0x0f,0x15,0x1d, -0x13,0x1d,0x95,0x59,0x13,0x10,0x04,0x15,0x19,0x16,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x09,0x05,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf0,0x40,0x2b,0x0b,0x06,0x4d,0x09,0x09,0x27,0x04,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d, -0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x10,0x10,0x0d,0x06,0x4d,0x10,0x0e,0x0c,0x06,0x4d,0x10,0x1a,0x0b,0x06,0x4d,0x10,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x17,0x33,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f, -0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5f,0x5d,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xfd,0xe4,0xbe,0x8e,0xad,0x9d, -0x01,0x7a,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xa4,0xa4,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x52,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x11,0xe6,0x01,0x05,0x01,0x34,0xa6,0x8e,0xfd,0xcf,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x11, -0x00,0x96,0x40,0x28,0x02,0x10,0x01,0x02,0x10,0x01,0x10,0x04,0x01,0x15,0x09,0x15,0x0c,0x04,0x0f,0x04,0x95,0x59,0x0f,0x10,0x0a,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40, -0x1e,0x0b,0x06,0x4d,0x01,0x01,0x13,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b, -0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x05, -0xec,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x02,0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x00,0x0b,0x00,0x0f,0x00,0x4e,0x40,0x23,0x00,0x06,0x63,0x5b,0x00,0x0e,0x0f,0x0d,0x09,0x62,0x03,0x0d,0x0c,0x03,0x62,0xff,0x30,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x84,0x0d,0xb8,0xff,0xfe,0xb3,0x0c, -0x06,0x4d,0x0d,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x0d,0x0d,0x11,0x10,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x3f,0xc6,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0xfa,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x23,0xa4,0xa4,0x05, -0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xfa,0xfc,0x04,0x00,0x00,0x00,0x02,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x00,0x0c,0x00,0x18,0x00,0x6b,0x40,0x34,0x02,0x02,0x01,0x10,0x04,0x0d,0x13,0x63,0x5b,0x0d,0x0b,0x0f,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03,0x1c,0x16,0x62,0x10,0x0a,0x00,0x10,0x62,0xff,0x30,0x06,0x00, -0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0a,0x01,0x0a,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x0a,0x0a,0x1a,0x19,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0xc6,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f, -0x3f,0xc6,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0xa4,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x03,0xf0,0x01, -0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x0c,0x00,0x9b,0x40,0x10,0x7a,0x0c,0x01,0x77,0x0b,0x01,0x79,0x02,0x01,0x7d,0x0a,0x01,0x7e,0x01,0x01,0x0c,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x00,0x4d,0x01,0x10,0x0b,0x00,0x4d,0x00,0xb8,0xff,0xf0,0x40,0x22,0x0c,0x00,0x4d, -0x09,0x02,0x0a,0x05,0x01,0x15,0x05,0x15,0x0a,0x0f,0x06,0x00,0x0a,0x0b,0x0b,0x01,0x70,0x00,0x01,0x00,0x14,0x0b,0x06,0x4d,0x00,0x40,0x0b,0x01,0x4d,0x00,0x0c,0xb8,0xff,0xe8,0x40,0x1c,0x0d,0x06,0x4d,0x0c,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05, -0xb8,0xff,0xff,0xb6,0x0b,0x06,0x4d,0x05,0x2f,0x0e,0x01,0x5d,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x2b,0x2f,0x2b,0x2b,0x5d,0x33,0x33,0x2f,0x33,0x00,0x3f,0x3f,0x3f,0x3f,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01, -0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x05,0xec,0xfc,0x3f,0x01,0xd5,0xfe,0x12,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x00,0x03,0x00,0x3a,0x40,0x16,0x01,0x15,0x02,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01, -0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x01,0x01,0x05,0x04,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x4a,0xa4,0xa4,0x05,0xec,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0x54,0x04,0x18,0x00,0x1f,0x00,0xdd,0xb6,0x49,0x0c,0x01,0x49,0x04, -0x01,0x1e,0xb8,0xff,0xe8,0xb7,0x0b,0x00,0x4d,0x0f,0x21,0x01,0x03,0x1c,0xb8,0xff,0xd0,0x40,0x2c,0x0c,0x00,0x4d,0x02,0x16,0x01,0x0c,0x04,0x05,0x15,0x16,0x1b,0x04,0x0d,0x18,0x0d,0x95,0x59,0x1d,0x18,0x10,0x13,0x0f,0x0a,0x01,0x12,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8, -0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xec,0x40,0x1c,0x0b,0x06,0x4d,0x01,0x0e,0x0a,0x12,0x0a,0x42,0x14,0x11,0x06,0x0d,0x06,0x4d,0x11,0x06,0x0c,0x06,0x4d,0x11,0x06,0x0b,0x06,0x4d,0x11,0x84,0x12,0xb8,0xff,0xfa,0x40,0x31,0x0c,0x06,0x4d,0x12,0x0e,0x0b,0x06,0x4d,0x12,0x1b,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06, -0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x84,0x0a,0x0a,0x04,0x0d,0x06,0x4d,0x0a,0x40,0x0d,0x01,0x4d,0x0f,0x0a,0x01,0x0c,0x03,0x20,0x21,0x0a,0x84,0x30,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x39,0x18,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18, -0x2f,0x33,0x33,0x3f,0x3f,0x33,0x2b,0x11,0x00,0x17,0x33,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x2b,0x5d,0x5d,0x21,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x06,0x54,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9, -0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0x02,0x4c,0xaa,0x98,0xc0,0x86,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb5,0x91,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x96,0x40,0x28,0x02,0x11,0x01,0x02,0x10,0x01,0x10,0x04, -0x01,0x15,0x09,0x15,0x0a,0x0f,0x0c,0x04,0x0f,0x04,0x95,0x59,0x0f,0x10,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0c,0x08,0x06,0x0d,0x06, -0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x14,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33, -0x18,0x3f,0x3f,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0x00,0x02,0x00,0x60,0xff,0xe8, -0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x89,0x40,0x23,0x19,0x40,0x0b,0x02,0x4d,0x00,0x12,0x95,0x59,0x00,0x16,0x06,0x0c,0x95,0x59,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x20, -0x15,0x30,0x15,0x02,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f, -0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab, -0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10,0x06,0x03,0x1b,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x04,0x0f,0x06,0x1b,0x09,0x1b,0x95, -0x59,0x09,0x10,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18,0x18,0x1f,0x06,0x12,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06, -0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30, -0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x70,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x05,0xd7,0xb4,0xcc,0xfe, -0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x10,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x95,0x40,0x35,0x1c,0x18,0x0b,0x0c,0x00,0x4c,0x01,0x1b,0x03,0x1b,0x05,0x1b,0x95,0x59,0x05,0x16,0x0f,0x0f,0x0d,0x15,0x0b,0x15,0x95,0x59,0x0b,0x10,0x0d,0x11,0x0e,0x03, -0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x18,0x06,0x0d,0x06,0x4d,0x18,0x06,0x0c,0x06,0x4d,0x18,0x06,0x0b,0x06,0x4d,0x18,0x83,0x08,0x10,0x0d,0x06,0x4d, -0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x17,0x33,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x2b,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00, -0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x6b,0xf3,0xc1,0xe9,0x01,0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xa4,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0xfe,0x29,0x02,0x87,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfd,0xcd,0x95,0x7e,0xae,0xdb,0xc7,0xb1, -0xc9,0xc5,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x10,0x00,0x59,0xb9,0x00,0x0c,0xff,0xe8,0x40,0x27,0x0b,0x0c,0x00,0x4c,0x07,0x15,0x08,0x0f,0x00,0x00,0x0a,0x02,0x0e,0x10,0x70,0x00,0x01,0x00,0x00,0x12,0x0a,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x84,0x07,0xb8,0xff, -0xf3,0x40,0x0e,0x0d,0x06,0x4d,0x07,0x04,0x0c,0x06,0x4d,0x07,0x05,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x2f,0x5d,0x00,0x3f,0xcd,0x32,0x32,0x2f,0x3f,0x3f,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d, -0xa4,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfd,0xf6,0x04,0x00,0xd3,0x6c,0x79,0x0e,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x03,0x0f,0x04,0x18,0x00,0x2e,0x00,0xa1,0x40,0x19,0x07,0x26,0x01,0x03,0x16,0x01,0x03,0x09,0x0c,0x01,0x09,0x09,0x01,0x0f,0x00,0x01,0x10,0x04,0x2b,0x10,0x0b,0x0c,0x00,0x4c,0x12,0xb8, -0xff,0xf0,0x40,0x35,0x0b,0x0c,0x00,0x4c,0x0a,0x38,0x0b,0x0c,0x00,0x4c,0x05,0x28,0x0f,0x1e,0x04,0x14,0x2d,0x17,0x19,0x14,0x19,0x95,0x59,0x14,0x10,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x0b,0x03,0x01,0x03,0x2d,0x03,0x95,0x59,0x2d,0x16,0x17,0x17,0x28,0x1e,0x83,0x0f,0x0f,0x00,0x28,0x83,0x05,0xb8,0xff,0xe0,0x40,0x16,0x0b,0x06, -0x4d,0x20,0x05,0x30,0x05,0x02,0x05,0x05,0x30,0x00,0x10,0x0d,0x06,0x4d,0x00,0x1c,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x11,0x39,0x2f,0x5d,0x2b,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x17,0x39,0x2b,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d, -0x5d,0x5d,0x5f,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x68,0x86,0xa1,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x42,0x6e,0x8d,0x4b,0x85,0x69,0x71,0x93,0x2e, -0x4a,0x35,0x1d,0x1d,0x38,0x50,0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x92,0x50,0x9e,0x25,0xb0,0x63,0x90,0x29,0x39,0x2c,0x23,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x6f,0x4b,0x26,0x2e,0xa6,0x4a,0x15,0x26,0x35,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5a,0x3e,0x4c,0x70,0x4a,0x24,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81, -0x05,0x2f,0x00,0x14,0x00,0x7c,0x40,0x3b,0x03,0x18,0x0b,0x0c,0x00,0x4c,0x14,0x14,0x12,0x02,0x12,0x95,0x59,0x02,0x16,0x0a,0x0a,0x07,0x0e,0x06,0x0b,0x07,0x07,0x06,0x95,0x59,0x07,0x0f,0x00,0x00,0x0d,0x40,0x0b,0x00,0x4d,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d, -0x0f,0x84,0x04,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xee,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x32,0x2f,0x2f,0x2b,0x33,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x11,0x33,0x11,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x31, -0x30,0x2b,0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3e,0x2d,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x00,0x01,0x00,0x90,0xff,0xe8, -0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0xa1,0x40,0x36,0x49,0x06,0x01,0x49,0x06,0x01,0x03,0x0d,0x10,0x0b,0x0c,0x00,0x4c,0x0f,0x03,0x01,0x0c,0x06,0x01,0x15,0x03,0x0c,0x05,0x0c,0x95,0x59,0x05,0x16,0x10,0x0f,0x08,0x0f,0x01,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0f,0x01,0x0f, -0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0x40,0x2a,0x0b,0x06,0x4d,0x0f,0x0f,0x13,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0a,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x02,0x0b,0x06,0x4d,0x07,0x2f,0x13,0x01,0x5d, -0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x00,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66, -0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x0e,0x00,0x00,0x03,0xcb,0x04,0x00,0x00,0x0b,0x00,0x7b,0x40,0x0d,0x79,0x0b,0x01,0x79,0x02,0x01,0x77,0x01,0x01,0x76,0x04,0x01,0x0b,0xb8,0xff,0xe0,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x04,0x20,0x0b,0x0d, -0x01,0x4c,0x02,0xb8,0xff,0xf4,0x40,0x19,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x76,0x07,0x01,0x07,0x30,0x0b,0x0d,0x01,0x4c,0x0b,0x07,0x03,0x02,0x15,0x03,0x0f,0x0b,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x0b,0x00,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x0d,0x04,0x0c,0x0b,0x06,0x4d,0x04,0x03,0xb8,0xff,0xf0,0xb3,0x0c,0x00, -0x4d,0x03,0x2f,0x2b,0x33,0x2b,0x11,0x33,0x2f,0x2b,0x32,0x2b,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x5d,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x03,0xcb,0xfe,0x68,0xa1,0xfe,0x7c,0xb4,0x01,0x04,0x1d,0x07,0x04,0x0a,0x16,0x01,0x10,0x04,0x00,0xfc,0x00, -0x04,0x00,0xfd,0x18,0x52,0x3d,0x4d,0x3e,0x02,0xec,0x00,0x01,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x00,0x1b,0x00,0xd2,0x40,0x16,0x78,0x1b,0x01,0x77,0x14,0x01,0x76,0x0c,0x01,0x7b,0x0a,0x01,0x74,0x01,0x01,0x38,0x09,0x01,0x37,0x0c,0x01,0x1b,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x13,0xb8,0xff,0xfe,0xb3,0x0b,0x06,0x4d,0x0a, -0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x02,0xb8,0xff,0xfa,0x40,0x18,0x0b,0x06,0x4d,0x14,0x02,0x0b,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x08,0xb8,0xff,0xc0,0xb3,0x0b,0x00,0x4d,0x14,0xb8,0xff,0xf0,0x40,0x09,0x0b,0x00,0x4d,0x13,0x18,0x0b,0x00,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09, -0x0b,0x00,0x4d,0x09,0x10,0x0b,0x00,0x4d,0x1b,0xb8,0xff,0xe0,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x0c,0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xd0,0x40,0x23,0x0b,0x0d,0x01,0x4c,0x17,0x30,0x0b,0x0d,0x01,0x4c,0x0f,0x30,0x0b,0x0d,0x01,0x4c,0x02,0x06,0x0f,0x17,0x13,0x1b,0x00,0x07,0x0a,0x0b,0x0f,0x0a,0x00,0x00,0x1d,0x0b,0x2f,0x1d, -0x01,0x5d,0x2f,0x11,0x33,0x2f,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13, -0x16,0x17,0x33,0x36,0x37,0x13,0x05,0xb0,0xfe,0xcd,0xaa,0xd3,0x0c,0x04,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x0a,0x04,0x08,0x03,0x0f,0xec,0x96,0xd4,0x0a,0x05,0x08,0x02,0x0f,0xd0,0x04,0x00,0xfc,0x00,0x02,0xdd,0x2a,0x35,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc,0xfe,0x23,0x39,0x2c,0x32,0x03,0x00,0xfc,0xfc,0x25,0x37,0x27, -0x35,0x03,0x04,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x13,0x00,0xe0,0x40,0x13,0x7b,0x13,0x01,0x73,0x0e,0x01,0x79,0x0c,0x01,0x74,0x0a,0x01,0x7b,0x03,0x01,0x75,0x01,0x01,0x13,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0a,0x08,0x0b, -0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0x40,0x13,0x0c,0x06,0x4d,0x02,0x10,0x0c,0x06,0x4d,0x01,0x10,0x0c,0x06,0x4d,0x00,0x10,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d, -0x13,0xb8,0xff,0xf0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0e,0x10,0x0b,0x0d,0x01,0x4c,0x0a,0x10,0x0b,0x0d,0x01,0x4c,0x03,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x11,0x18,0x0b,0x01,0x4d,0x06,0xb8,0xff,0xe8,0x40,0x15,0x0b,0x01,0x4d,0x03,0x06,0x11,0x13,0x04,0x0b,0x0d,0x0f,0x0b,0x00,0x02,0x0d,0x0b,0x02,0x02,0x15,0x0b,0x15, -0xb8,0xff,0xc0,0xb2,0x0c,0x00,0x4d,0x2b,0x2f,0x11,0x33,0x2f,0x11,0x33,0x11,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x01,0x33, -0x13,0x16,0x17,0x33,0x01,0x03,0x92,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x13,0x1a,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x16,0x15,0x04,0x01,0x00,0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x09,0x45,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x27,0x29,0x01,0xae,0x00,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x03,0xd5, -0x04,0x00,0x00,0x14,0x00,0x9b,0x40,0x0a,0x0d,0x14,0x01,0x00,0x0d,0x01,0x06,0x02,0x01,0x14,0xb8,0xff,0xe0,0x40,0x2c,0x0b,0x0d,0x01,0x4c,0x0d,0x20,0x0b,0x0d,0x01,0x4c,0x02,0x20,0x0b,0x00,0x4d,0x02,0x10,0x01,0x10,0x04,0x00,0x0f,0x0c,0x0f,0x10,0x30,0x0b,0x0d,0x01,0x4c,0x10,0x01,0x0b,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03, -0x1c,0x06,0x0b,0xb8,0xff,0xf4,0x40,0x0e,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01,0x06,0x0b,0x03,0x0c,0x14,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x14,0x00,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x16,0x0d,0x0c,0x0b,0x06,0x4d,0x0d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x00,0x4d,0x0c,0x2f,0x2b,0x33,0x2b,0x11,0x33,0x2f,0x2b,0x32, -0x2b,0x12,0x17,0x39,0x2b,0x2b,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2f,0x33,0x33,0x2b,0x3f,0x3f,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x2b,0x2b,0x5d,0x5d,0x5d,0x01,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x03,0xd5,0xfe,0x29,0x7e,0xe4,0x40,0x2b,0x35,0x2c, -0x7c,0x3e,0x52,0xfe,0x70,0xb6,0x01,0x15,0x05,0x10,0x06,0x05,0x0f,0x01,0x23,0x04,0x00,0xfb,0x5c,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x0f,0x3f,0x18,0x34,0x03,0x16,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x00,0x09,0x00,0xa5,0x40,0x0e,0x0a,0x06,0x01,0x06,0x01,0x01,0x10,0x01,0x18,0x0b,0x0d,0x01, -0x4c,0x06,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x40,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x35,0x00,0x45,0x00,0x02,0x03,0x00,0x13,0x00,0x23,0x00,0x03, -0x3a,0x05,0x4a,0x05,0x02,0x0c,0x05,0x1c,0x05,0x2c,0x05,0x03,0x17,0x03,0x05,0x01,0x04,0x04,0x01,0x95,0x59,0x04,0x15,0x00,0x08,0x07,0x08,0x07,0x95,0x59,0x08,0x0f,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11, -0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x03,0x70,0xfd,0xa2,0x02,0x58,0xfc,0xb7,0x02,0x5e,0xfd,0xdb,0x03,0x16,0x03,0xd1,0xfc,0xbb,0x8c,0x33,0x03,0x41,0x8c,0x00,0x01,0x00,0x5c,0xfe,0xba,0x02,0x2b, -0x05,0x9a,0x00,0x18,0x00,0x5f,0x40,0x2c,0x11,0x05,0x06,0x06,0x05,0x52,0x59,0x06,0x0b,0x00,0x06,0x4c,0x14,0x30,0x0b,0x0c,0x53,0x59,0x0b,0x03,0x00,0x18,0x53,0x59,0x00,0x20,0x12,0x15,0x05,0x0c,0x18,0x18,0x15,0x05,0x0f,0x08,0x15,0xea,0x02,0x18,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xdc,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf7,0xb3, -0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0x2b,0xe1,0x39,0x39,0xce,0x10,0xc2,0x2f,0x32,0x11,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x24,0x11,0x11,0x34,0x27,0x35,0x36,0x35,0x11,0x10,0x25,0x15,0x06,0x15,0x11,0x14,0x07,0x15,0x16,0x15,0x11,0x14,0x16,0x17,0x02,0x2b, -0xfe,0xcd,0x9c,0x9c,0x01,0x33,0x9f,0x96,0x96,0x47,0x58,0xfe,0xba,0x04,0x01,0x32,0x01,0x2c,0xca,0x0a,0x74,0x0a,0xce,0x01,0x24,0x01,0x36,0x04,0x80,0x04,0xc2,0xfe,0xdb,0xd2,0x30,0x04,0x2d,0xd3,0xfe,0xdf,0x6f,0x5f,0x02,0x00,0x00,0x01,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x13,0x40,0x09,0x03,0x00,0x1c,0x00, -0xea,0x90,0x01,0x01,0x01,0x2f,0x5d,0xe1,0x00,0x3f,0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0xfe,0x1e,0x08,0x00,0x00,0x00,0x01,0x00,0x42,0xfe,0xba,0x02,0x10,0x05,0x9a,0x00,0x18,0x00,0x66,0x40,0x26,0x0c,0x00,0x18,0x18,0x00,0x52,0x59,0x18,0x13,0x05,0x18,0x4c,0x14,0x30,0x13,0x12,0x53,0x59,0x13,0x03,0x05,0x06, -0x53,0x59,0x05,0x20,0x0c,0x09,0x00,0x00,0x03,0x12,0x06,0x16,0x0f,0x03,0xea,0x09,0xb8,0xff,0xe0,0x40,0x0f,0x0d,0x06,0x4d,0x50,0x09,0x01,0x3f,0x09,0x01,0x09,0x20,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x5d,0x5d,0x2b,0xe1,0x39,0x39,0xc6,0x32,0x10,0xca,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00, -0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x06,0x15,0x11,0x10,0x05,0x35,0x36,0x36,0x35,0x11,0x34,0x37,0x35,0x26,0x35,0x11,0x34,0x27,0x35,0x04,0x11,0x11,0x14,0x17,0x02,0x10,0x9c,0xfe,0xce,0x57,0x49,0x95,0x95,0xa0,0x01,0x32,0x9c,0x01,0xf0,0x0a,0xca,0xfe,0xd4,0xfe,0xce,0x04,0x7e,0x02,0x60, -0x6e,0x01,0x21,0xd3,0x2d,0x04,0x30,0xd2,0x01,0x25,0xc2,0x04,0x80,0x04,0xfe,0xca,0xfe,0xdc,0xce,0x0a,0x00,0x01,0x00,0xd1,0x01,0xb8,0x04,0xaa,0x02,0xee,0x00,0x14,0x00,0x44,0xb9,0x00,0x01,0xff,0xe0,0x40,0x23,0x09,0x0c,0x48,0x0b,0x20,0x09,0x0c,0x48,0x09,0x03,0x03,0x11,0xbe,0x59,0x03,0x07,0x40,0x0d,0x07,0xbe,0x59,0x14,0x0d, -0x14,0xbd,0x00,0x09,0xbd,0x0a,0x15,0x16,0x0a,0x00,0xff,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xc4,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x31,0x30,0x01,0x2b,0x2b,0x01,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x04,0xaa,0x07,0x93,0x7e, -0x6d,0x9c,0x61,0x3e,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x02,0xee,0x94,0xa2,0x6d,0x43,0xb0,0x8f,0xa7,0x58,0x5a,0x62,0x50,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xe2,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe6,0x01,0x5b,0x00,0x22,0xb7,0x03,0x70,0x1f,0x01,0x02,0x7f,0x1f, -0x01,0xb8,0xff,0xf3,0x40,0x0a,0x1f,0x19,0x06,0x07,0x3e,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x5d,0x35,0x5d,0x35,0x00,0x03,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xcd,0x00,0x10,0x00,0x1b,0x00,0x23,0x01,0x5d,0x40,0x18,0x76,0x22,0x01,0x79,0x1d,0x01,0x74,0x0c,0x01,0x7b,0x0a,0x01,0x7b,0x07,0x01,0x77,0x06,0x01, -0x10,0x06,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x09,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x09,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x2c,0x0b,0x06,0x4d,0x1d,0x08,0x0c,0x00,0x4d,0x02,0x08,0x0c,0x00,0x4d,0x1d,0x1c,0x02,0x01,0x20,0x01,0x22,0x23,0x03,0x04,0x20,0x04, -0x73,0x04,0x01,0x7c,0x01,0x01,0x10,0x08,0x0b,0x0c,0x00,0x4c,0x04,0x18,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x20,0xb8,0xff,0xc0,0xb4,0x0b,0x0d,0x01,0x4c,0x1f,0xb8,0xff,0xc0,0x40,0x1e,0x0b,0x0d,0x01,0x4c,0x10,0x20,0x0b,0x0d,0x01,0x4c,0x06,0x20,0x0b,0x0d,0x01,0x4c,0x00,0x16,0x01,0x09,0x03,0x1d, -0x1e,0x1f,0x21,0x22,0x05,0x05,0x20,0x20,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x20,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x20,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x20,0x20,0x12,0x16,0x48,0x20,0x00,0x16,0x1c,0x02,0x91,0x59,0x1c,0x1c,0x16,0x00,0x0b,0x11,0xc5,0x59,0x0b,0x10,0x06,0x16,0x03,0x04,0x00,0x12,0x19,0xc4,0x0e,0x40, -0x09,0x0c,0x48,0x0e,0x14,0xc4,0x08,0xb8,0xff,0xc0,0x40,0x12,0x0c,0x00,0x4d,0x08,0x08,0x1c,0x23,0x06,0x10,0x04,0x05,0x77,0x05,0x01,0x79,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x25,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x39,0x2f,0x2b,0xe9, -0xd4,0x2b,0xe9,0x00,0x3f,0xc4,0x3f,0xcd,0x39,0xc4,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x2b,0x2b,0x2b,0x11,0x12,0x17,0x39,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x0e,0xc0,0x10,0x87,0x05,0xc0,0xc0,0x0e,0xc0,0x01,0x2b,0x2b,0x2b,0x2b,0x2b, -0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x11,0x65,0x78,0x5c,0x58,0x70,0x60,0x6e,0x32,0x40, -0x72,0x30,0x42,0x42,0xc9,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x62,0x34,0x70,0x59,0x6e,0x6d,0x54,0x70,0x36,0x01,0x15,0x3f,0x30,0x72,0x42,0x30,0x31,0x3e,0xfb,0xae,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x00,0xff,0xff,0x00,0x5e,0xfe,0x50,0x04,0x8c,0x05,0xb2,0x02,0x26,0x00,0x26,0x00,0x00,0x00,0x07, -0x00,0xdd,0x02,0x39,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x65,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x17,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x38,0x0e,0x0c,0x02,0x03,0x3e,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x0b,0x02,0x26, -0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0xb5,0x01,0x59,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x14,0x0b,0x12,0x25,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe0,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x66,0x01,0x59,0x00,0x1b,0x40,0x10,0x03,0x70, -0x27,0x01,0x02,0x00,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x5d,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x06,0xe4,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x1d,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x1d,0x17,0x05,0x0d,0x25,0x02,0x01,0x1a,0x05, -0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe9,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x12,0x22,0x20,0x10,0x00,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83, -0x06,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xcb,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x11,0x22,0x20,0x10,0x0b,0x25,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x0e,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x96,0x00,0x00,0x00,0x16, -0xb9,0x00,0x02,0xff,0xec,0x40,0x09,0x24,0x20,0x0f,0x14,0x25,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x87,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe2,0x40,0x0a,0x2f,0x29,0x0f,0x14,0x25,0x03,0x02,0x2c,0x11,0x26, -0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xb2,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xa8,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xeb,0x40,0x09,0x2a,0x20,0x0f,0x14,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83, -0x06,0x1c,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xe9,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe9,0x40,0x0a,0x23,0x29,0x0f,0x14,0x25,0x03,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x00,0xdd, -0x01,0x83,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x0f,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x27,0x1b,0x1d,0x0c,0x12,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48, -0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xfe,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x09,0x1d,0x1b,0x0c,0x12,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0e,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xb8,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf7,0x40, -0x09,0x1f,0x20,0x16,0x0f,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x87,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x88,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x29,0x23,0x0c,0x12,0x25,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, -0x35,0x00,0xff,0xff,0x00,0x58,0x00,0x00,0x01,0xdd,0x06,0x0a,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0x8e,0xd1,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x01,0x71,0x06,0x0a,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06, -0x00,0x43,0x9a,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x05,0x04,0x02,0x03,0x25,0x01,0x05,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xd3,0x00,0x00,0x02,0x07,0x06,0x0e,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0x77,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x08,0x04,0x02,0x03,0x25, -0x01,0x08,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc9,0x00,0x00,0x02,0x10,0x05,0x87,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x4c,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf4,0x40,0x0a,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff, -0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xb2,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xe8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1d,0x13,0x0a,0x12,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07, -0x00,0x8e,0x01,0x42,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe4,0x40,0x09,0x19,0x19,0x0c,0x06,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x14,0x19,0x19,0x03,0x09, -0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0e,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1d,0x1e,0x03,0x09,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8, -0x04,0x50,0x05,0x87,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xb2,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd8, -0x00,0xff,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x22,0x18,0x03,0x09,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x3c,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfb,0x40,0x09,0x14,0x12,0x09,0x11,0x25, -0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xea,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x17,0x14,0x12,0x08,0x10,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2, -0x06,0x0e,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xc6,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x16,0x12,0x08,0x11,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0x87,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xa0,0x00,0x00,0x00,0x17, -0x40,0x0d,0x02,0x01,0x07,0x21,0x1b,0x08,0x11,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x0b,0x00,0x36,0x40,0x1b,0x0b,0x01,0x09,0x06,0x40,0x04,0x00,0x08,0x10,0x08,0x02,0x0a,0x03,0x08,0x00,0x05,0x06,0x05,0x91,0x59,0x0b,0x06,0x06,0x03, -0x08,0x03,0x03,0x00,0x2f,0x3f,0x12,0x39,0x2f,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x1a,0xce,0xdd,0x32,0xce,0x31,0x30,0x01,0x25,0x03,0x23,0x03,0x05,0x35,0x05,0x03,0x33,0x03,0x25,0x02,0xd8,0xfe,0xfa,0x28,0x4c,0x28,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x01,0x2e,0x03,0x7d,0x1e,0xfd,0x4a,0x02,0xb6,0x1e, -0x96,0x14,0x01,0x9a,0xfe,0x66,0x14,0x00,0x00,0x02,0x00,0x6c,0x03,0x81,0x02,0x96,0x05,0xaa,0x00,0x0b,0x00,0x17,0x00,0x38,0x40,0x21,0x00,0x12,0xd8,0x59,0x00,0x0e,0x06,0x06,0x0c,0xd8,0x59,0x06,0x04,0x03,0x09,0x42,0x15,0xd8,0x09,0x0f,0xd8,0x03,0x0f,0x09,0x01,0x17,0x03,0x18,0x19,0x03,0x09,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d, -0x10,0xe1,0x10,0xe1,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x81,0x73,0xa2,0xa0,0x73,0x74,0xa3,0xa2,0x73,0x41,0x5c,0x5a,0x41,0x41,0x5e,0x5c,0x03,0x81,0xa3,0x74,0x73,0x9f,0xa0, -0x72,0x74,0xa3,0x01,0xb4,0x5c,0x41,0x43,0x5f,0x60,0x42,0x42,0x5b,0x00,0x00,0x02,0x00,0xb8,0xff,0xcf,0x03,0xb8,0x05,0x85,0x00,0x16,0x00,0x1d,0x00,0x7f,0x40,0x42,0x05,0x10,0x01,0x03,0x0f,0x00,0x01,0x10,0x05,0x16,0x16,0x17,0x14,0x02,0x14,0x9a,0x59,0x05,0x02,0x02,0x11,0x12,0x11,0x02,0x0c,0x03,0x11,0x11,0x18,0x13,0x0e,0x13, -0x99,0x59,0x0b,0x0e,0x02,0x0e,0x02,0x0c,0x04,0x1e,0x0c,0x0b,0x0e,0x14,0x17,0x04,0x02,0xdc,0x70,0x05,0x01,0x02,0x05,0x01,0x05,0x05,0x08,0x11,0x00,0x00,0x1f,0x1b,0x89,0x08,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x08,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x5d,0xe1,0x17,0x39,0x00,0x2f,0x10,0xc6,0x11,0x39,0x39, -0x2f,0x2f,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x11,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x02,0x35,0x34,0x12,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x05,0x11,0x06,0x06,0x15,0x14,0x16,0x03,0xb8,0x60,0x7d,0x7d, -0xc1,0xe5,0xe5,0xc1,0x7d,0x7b,0x62,0x65,0x78,0x7a,0x63,0xfe,0xa6,0x77,0x87,0x88,0xd1,0x3b,0x0a,0xbd,0xbf,0x16,0x01,0x16,0xcf,0xdb,0x01,0x27,0x25,0xd5,0xcb,0x02,0x31,0xac,0x47,0x07,0xfc,0xef,0x0c,0x4a,0x4b,0x02,0xf9,0x1f,0xcd,0x96,0x96,0xc6,0x00,0x01,0x00,0x6a,0x00,0x00,0x03,0xee,0x05,0xb2,0x00,0x1b,0x00,0x6a,0x40,0x39, -0x02,0x0e,0x01,0x03,0x00,0x12,0x01,0x10,0x05,0x17,0x14,0x05,0x08,0x08,0x05,0x9a,0x59,0x08,0x08,0x1b,0x0f,0x0c,0x40,0x0c,0x11,0x9a,0x59,0x0c,0x04,0x02,0x00,0x1b,0x00,0x1b,0x9a,0x59,0x00,0x12,0x15,0x15,0x18,0x7f,0x0e,0x01,0x0e,0x00,0x1a,0x02,0x06,0x14,0x08,0x18,0x8a,0x20,0x04,0x01,0x04,0x2f,0x5d,0xe1,0x39,0x39,0xc6,0xc6, -0x32,0x2f,0xc4,0x5d,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5f,0x5d,0x21,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21, -0x15,0x14,0x07,0x21,0x03,0xee,0xfc,0x7c,0xda,0xc5,0xc5,0xda,0xad,0x75,0x60,0x64,0x6f,0xe5,0x01,0x28,0xfe,0xd8,0xc1,0x02,0xc7,0x87,0x45,0xf4,0xbb,0x8d,0xfe,0xbc,0xf0,0x29,0x9b,0x39,0xfe,0xcd,0xec,0x8d,0x9c,0xf2,0x61,0x00,0x00,0x02,0x00,0x83,0xff,0xbe,0x03,0x27,0x05,0xd3,0x00,0x26,0x00,0x30,0x00,0xcf,0x40,0x1b,0x24,0x22, -0x01,0x23,0x1b,0x01,0x2c,0x0f,0x01,0x2b,0x07,0x01,0x2c,0x30,0x01,0x25,0x2b,0x01,0x25,0x26,0x01,0x11,0x20,0x0c,0x00,0x4d,0x23,0xb8,0xff,0xe0,0xb3,0x0c,0x00,0x4d,0x17,0xb8,0xff,0xf0,0x40,0x5d,0x0b,0x0c,0x00,0x4c,0x03,0x10,0x0b,0x0c,0x00,0x4c,0x2c,0x00,0x0a,0x27,0x14,0x05,0x19,0x00,0x08,0x01,0x0e,0x03,0x08,0x08,0x0a,0x05, -0x0a,0x9a,0x59,0x05,0x00,0x1c,0x10,0x1c,0x02,0x0f,0x03,0x1c,0x1c,0x1e,0x19,0x1e,0x9a,0x59,0x19,0x2c,0x00,0x02,0x29,0x27,0x14,0x2e,0x16,0x0d,0x7e,0x02,0x1c,0x40,0x0b,0x10,0x01,0x4c,0x02,0x40,0x0c,0x10,0x01,0x4c,0x1c,0x02,0x1c,0x02,0x2e,0x7e,0x25,0x40,0x0b,0x0c,0x01,0x4c,0x25,0x25,0x32,0x12,0x20,0x7e,0x16,0x08,0x16,0x08, -0x29,0x7e,0x12,0x2f,0xe1,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x39,0x39,0x2f,0x2f,0x2b,0x2b,0x10,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x2b,0x2b, -0x2b,0x2b,0x01,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x01,0x06,0x15,0x14,0x16,0x17,0x36,0x35,0x34,0x26,0x02,0x92,0x5a,0xc8, -0x9b,0x83,0x6c,0x82,0x78,0x54,0x5c,0x47,0x91,0xe9,0x93,0x6a,0xbb,0x99,0x82,0x59,0x65,0x7a,0xa8,0x51,0xa3,0xdf,0xfe,0x67,0x65,0x71,0x8d,0x58,0x69,0x01,0xa0,0x4a,0x70,0x84,0xa4,0x38,0x9e,0x4a,0x4f,0x3c,0x35,0x49,0x4d,0x7a,0xc3,0xa3,0x51,0x53,0x8c,0x7f,0xa4,0x2b,0x9e,0x3e,0x90,0x37,0x5a,0x4e,0x6b,0xba,0xaa,0x01,0x7f,0x33, -0x6c,0x48,0x6d,0x3f,0x44,0x68,0x48,0x65,0x00,0x01,0x00,0xa4,0x01,0x98,0x02,0x9c,0x03,0x90,0x00,0x0b,0x00,0x19,0x40,0x0c,0x00,0x0e,0x40,0x06,0x03,0x09,0x42,0x09,0x20,0x03,0x01,0x03,0x2f,0x5d,0xcd,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xa2,0x68,0x96,0x96, -0x68,0x68,0x92,0x92,0x01,0x98,0x92,0x68,0x67,0x97,0x96,0x68,0x68,0x92,0x00,0x01,0x00,0x54,0x00,0x00,0x03,0x42,0x05,0x9a,0x00,0x0f,0x00,0x7c,0x40,0x38,0x08,0x08,0x0f,0x02,0x04,0x00,0x0f,0x00,0xe2,0x59,0x0f,0x03,0x06,0x02,0x12,0x00,0x00,0x02,0x10,0x0d,0x06,0x4d,0x02,0x8c,0x03,0x18,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d, -0x03,0x26,0x0b,0x06,0x4d,0x2f,0x03,0x01,0x03,0x06,0x10,0x0d,0x06,0x4d,0x06,0x8c,0x08,0x03,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x08,0xb8,0xff,0xec,0xb4,0x0b,0x06,0x4d,0x08,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x0b,0x2f,0x2b,0x2b,0xdd,0x2b,0x2b,0x2b,0xe1,0x2b, -0xd4,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0xca,0x2f,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x42,0x80,0x6a,0x9e,0x6c,0x6c,0x8e,0x95,0x6b,0x01,0xee,0x05,0x33,0xfa,0xcd,0x05,0x33,0xfa,0xcd,0x03,0x87,0x98,0x73, -0x75,0x93,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x14,0x06,0x02,0x00,0x25,0x00,0xa2,0x40,0x09,0x0f,0x22,0x01,0x00,0x11,0x01,0x10,0x05,0x20,0xb8,0xff,0xe0,0xb4,0x0b,0x0c,0x00,0x4c,0x1a,0xb8,0xff,0xe8,0x40,0x32,0x0b,0x00,0x4d,0x1f,0x09,0x0a,0x0a,0x09,0x96,0x59,0x18,0x24,0x0a,0x95,0x14,0x30,0x18,0x10,0x95,0x59,0x18,0x01,0x01, -0x03,0x24,0x03,0x95,0x59,0x24,0x16,0x14,0x15,0x1f,0x1b,0x09,0x00,0x00,0x13,0x0d,0x83,0x1b,0x10,0x0c,0x06,0x4d,0x1b,0x1b,0x06,0x83,0x21,0xb8,0xff,0xe8,0x40,0x16,0x0c,0x06,0x4d,0x21,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x84,0x14,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x14,0x06, -0x0b,0x06,0x4d,0x14,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2f,0x2b,0xe1,0x39,0x2f,0x2b,0xe1,0x11,0x39,0x2f,0xc4,0x11,0x39,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x2b,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x35,0x36,0x36,0x35, -0x34,0x26,0x23,0x22,0x11,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x04,0x11,0x14,0x06,0x23,0x22,0x01,0xcd,0x4b,0x5f,0x6d,0x88,0xc8,0xb2,0x76,0x98,0x6e,0x61,0xe7,0xa4,0xdc,0xba,0xa6,0xc6,0x96,0x78,0x01,0x7a,0xde,0xb7,0x65,0x02,0xa0,0x30,0x93,0x7c,0x96,0xbb,0x14,0x82,0x14,0xa6,0x72,0x6c,0x77,0xfe, -0xcb,0xfb,0xbe,0x04,0x5a,0xc0,0xe8,0xbe,0x9c,0x7f,0xca,0x27,0x05,0x4b,0xfe,0xa1,0xb1,0xf0,0xff,0xff,0x00,0x90,0x01,0xfa,0x02,0xb2,0x02,0x7b,0x02,0x06,0x00,0x10,0x00,0x00,0x00,0x04,0x01,0x38,0x00,0xff,0x05,0xe7,0x05,0xae,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x32,0x00,0x79,0x40,0x40,0x09,0xc6,0x15,0x2a,0x18,0x50,0x19,0x1a, -0x19,0x27,0x24,0x50,0x2f,0x2c,0x1e,0x50,0x1f,0x15,0x19,0x2f,0x1f,0x1f,0x2f,0x19,0x15,0x04,0x34,0x0f,0xc6,0x40,0x03,0x28,0x2c,0x1d,0x2c,0x1d,0x51,0x59,0x2c,0x2c,0x20,0x1f,0x20,0x2b,0x52,0x59,0x20,0x20,0x0c,0x06,0x0c,0xc7,0x59,0x06,0x28,0x19,0x1f,0x1f,0x12,0x00,0x12,0xc7,0x59,0x00,0x00,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f, -0x33,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x33,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x25,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x00,0x15,0x14, -0x00,0x33,0x32,0x00,0x35,0x34,0x00,0x13,0x23,0x27,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x17,0x01,0x15,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x90,0xf9,0xfe,0xa1,0x01,0x5f,0xf9,0xf8,0x01,0x5f,0xfe,0xa1,0xf7,0xd2,0xfe,0xd7,0x01,0x29,0xd2,0xd1,0x01,0x27,0xfe,0xd9,0x51,0x8a,0x53,0x3f,0x49, -0x34,0x75,0xd7,0x85,0x91,0x66,0x5b,0x3f,0x3f,0xfe,0xcb,0x5e,0x9e,0x55,0x5c,0xff,0x01,0x5e,0xf9,0xf9,0x01,0x5f,0xfe,0xa1,0xf9,0xf9,0xfe,0xa2,0x04,0x51,0xfe,0xd8,0xd2,0xd1,0xfe,0xd8,0x01,0x28,0xd1,0xd2,0x01,0x28,0xfc,0x8f,0xb7,0x8a,0xfe,0xbf,0x02,0xfb,0x70,0x60,0x4e,0x6f,0x13,0x03,0x0e,0x7f,0x01,0xcd,0xf5,0x7b,0x47,0x33, -0x00,0x03,0x00,0xa2,0xff,0xdf,0x06,0x7d,0x05,0xbb,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x7b,0xb9,0x00,0x12,0xff,0xe8,0x40,0x46,0x0c,0x00,0x4d,0x0c,0x18,0x0c,0x00,0x4d,0x22,0x0f,0x2d,0x01,0x0f,0x03,0x2d,0x2d,0x15,0x28,0xca,0x1d,0x1d,0x15,0x0f,0xc9,0x03,0x15,0xc9,0x40,0x09,0xc6,0x03,0x1a,0x2b,0x53,0x59,0x0f,0x1a,0x1f,0x1a, -0x2f,0x1a,0x03,0x0f,0x03,0x1a,0x1a,0x25,0x12,0x20,0x25,0x53,0x59,0x20,0x20,0x0c,0x12,0x06,0x0c,0xcb,0x59,0x00,0x12,0xcb,0x59,0x06,0x00,0xc7,0x59,0x06,0x04,0x00,0x3f,0x2b,0x2b,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x01,0x18,0x2f,0xf0,0x1a,0xe9,0x10,0xe9,0x11,0x39,0x2f, -0xe1,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0xc6,0x00,0x2b,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x03,0x06,0x23,0x22,0x24,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x90,0xfe,0xc9,0xfe, -0x49,0x01,0xb7,0x01,0x37,0x01,0x36,0x01,0xb7,0xfe,0x49,0xfe,0xca,0xfe,0xee,0xfe,0x7c,0x01,0x84,0x01,0x12,0x01,0x12,0x01,0x83,0xfe,0x7d,0x03,0x69,0x8f,0xc0,0xfe,0xfc,0x01,0x0a,0xd5,0x79,0x60,0x56,0x8f,0x8d,0xb7,0xbb,0x90,0x84,0x5e,0x21,0x01,0xb7,0x01,0x37,0x01,0x37,0x01,0xb7,0xfe,0x49,0xfe,0xc9,0xfe,0xc9,0xfe,0x49,0x05, -0x84,0xfe,0x7c,0xfe,0xee,0xfe,0xee,0xfe,0x7d,0x01,0x83,0x01,0x12,0x01,0x12,0x01,0x84,0xfb,0xe6,0x45,0xfa,0xbc,0xda,0x01,0x04,0x35,0x96,0x48,0xb4,0x98,0x94,0xb2,0x4e,0x00,0x00,0x02,0x00,0x4c,0x03,0x04,0x05,0x74,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x79,0x40,0x49,0x0f,0x0c,0x01,0x10,0x04,0x0d,0x28,0x0b,0x0c,0x00,0x4c,0x0c, -0x28,0x0b,0x0c,0x00,0x4c,0x02,0x07,0x0c,0x03,0x16,0x01,0x05,0x09,0x03,0x13,0x11,0x15,0x16,0x15,0x54,0x59,0x0e,0x0a,0x16,0x03,0x0e,0x00,0x50,0x50,0x01,0x01,0x0f,0x01,0x01,0x0b,0x01,0x01,0x0b,0x08,0x50,0x0f,0x09,0x01,0x10,0x03,0x09,0x09,0x13,0x10,0x0e,0x12,0x50,0x13,0x13,0x15,0x42,0x15,0x20,0x13,0x01,0x13,0x2f,0x5d,0xc6, -0x2b,0x01,0x10,0xf1,0xe2,0x11,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0xe1,0x32,0x33,0x2f,0x5e,0x5d,0x5d,0xe1,0x33,0x00,0x3f,0x33,0x33,0x2b,0x11,0x00,0x33,0x18,0x2f,0x17,0x33,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x01,0x23,0x11,0x23,0x03,0x23,0x03,0x23,0x11,0x23,0x11,0x33,0x13,0x33,0x13,0x33,0x05,0x23,0x11,0x23,0x11, -0x23,0x35,0x21,0x05,0x74,0x6c,0x04,0xdb,0x3b,0xd6,0x04,0x66,0x7f,0xe1,0x04,0xe4,0x7e,0xfc,0xe6,0xd1,0x6f,0xce,0x02,0x0e,0x03,0x04,0x01,0xde,0xfe,0x22,0x01,0xde,0xfe,0x22,0x02,0x96,0xfe,0x10,0x01,0xf0,0x62,0xfd,0xcc,0x02,0x34,0x62,0x00,0x01,0x00,0x87,0x04,0xc2,0x02,0x0c,0x06,0x0a,0x00,0x03,0x00,0x13,0xb7,0x78,0x03,0x01, -0x03,0x02,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x5d,0x01,0x01,0x23,0x13,0x02,0x0c,0xfe,0xfa,0x7f,0xdf,0x06,0x0a,0xfe,0xb8,0x01,0x48,0x00,0x00,0x02,0x00,0x7d,0x04,0xc2,0x02,0xc4,0x05,0x87,0x00,0x0b,0x00,0x17,0x00,0x2a,0x40,0x16,0x06,0x00,0x12,0xc1,0x0c,0x09,0xc0,0x03,0x0f,0xc0,0x10,0x15,0x01,0x0f, -0x03,0x01,0x15,0x03,0x15,0x03,0x19,0x18,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x62,0x28,0x3a,0x38,0x28,0x2a,0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x39, -0x29,0x29,0x3c,0x3a,0x04,0xc2,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x3b,0x28,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x01,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xa4,0x00,0x13,0x00,0x89,0x40,0x3b,0x0e,0x11,0x12,0x01,0x02,0x0d,0x02,0x0b,0x08,0x07,0x04,0x03,0x0c,0x03,0x04,0x40,0x12,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x07,0x0b, -0x40,0x11,0x0e,0x08,0x0b,0x0b,0x08,0xbe,0x59,0x0c,0x40,0x0b,0x01,0x02,0x04,0x07,0x08,0x0b,0x0c,0x0e,0x11,0x12,0x0a,0x03,0x0d,0x03,0x0d,0x03,0x10,0x09,0x00,0x05,0x00,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x14,0x15,0x05,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x2b,0x11,0x12,0x39,0x39,0x39, -0x39,0x18,0x2f,0x2f,0x12,0x17,0x39,0x00,0x2f,0x1a,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xdd,0x31,0x30,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x01,0x21,0x03,0x23,0x13,0x23,0x35,0x21,0x13,0x21,0x35,0x21,0x13,0x33,0x03,0x21,0x15,0x21,0x03, -0x21,0x04,0x94,0xfd,0xda,0xa3,0x8d,0xa4,0xfa,0x01,0x3f,0x95,0xfe,0x2c,0x02,0x1a,0x9e,0x8d,0x9f,0x01,0x06,0xfe,0xb6,0x98,0x01,0xe2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x84,0x01,0x26,0x84,0x01,0x38,0xfe,0xc8,0x84,0xfe,0xda,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x06,0x83,0x05,0x9a,0x00,0x0f,0x00,0x13,0x00,0xb3,0x40,0x0e,0x13,0x03, -0x04,0x12,0x04,0x02,0x12,0x01,0x00,0x04,0x01,0x10,0x04,0x12,0xb8,0xff,0xf0,0x40,0x21,0x0c,0x00,0x4d,0x0c,0x08,0x00,0x00,0x15,0x01,0x12,0x06,0x06,0x05,0x11,0x09,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x01,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06, -0x4d,0x01,0xb8,0xff,0xd6,0x40,0x2b,0x0b,0x06,0x4d,0x01,0x01,0x15,0x04,0x05,0x13,0x03,0x91,0x59,0x13,0x13,0x07,0x00,0x0b,0x0c,0x91,0x59,0x0b,0x07,0x00,0x0b,0x91,0x2b,0x30,0x12,0x08,0x07,0x08,0x91,0x59,0x07,0x03,0x05,0x00,0x00,0x0f,0x91,0x59,0x00,0x12,0x00,0x3f,0x2b,0x00,0x10,0x18,0xc4,0x3f,0x2b,0x11,0x00,0x33,0x2b,0x00, -0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x01,0x18,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xc4,0xc4,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01, -0x11,0x23,0x01,0x06,0x83,0xfd,0x09,0xfe,0x02,0xc1,0xc3,0x02,0xbc,0x03,0x9c,0xfd,0xd1,0x02,0x07,0xfd,0xf9,0x02,0x50,0xfd,0x09,0x5f,0xfe,0xa6,0x01,0x92,0xfe,0x6e,0x05,0x9a,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x01,0x91,0x02,0xd9,0xfd,0x27,0x00,0x03,0x00,0x5e,0xff,0xcd,0x05,0xaa,0x05,0xd3,0x00,0x13,0x00,0x1b,0x00,0x23,0x01,0x03, -0x40,0x0a,0x57,0x09,0x01,0x57,0x0e,0x01,0x58,0x0d,0x01,0x1d,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d,0x0c,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x0a,0xb8,0xff,0xf0,0x40,0x21,0x0b,0x00,0x4d,0x14,0x1d,0x22,0x19,0x01,0x02,0x0b,0x0c,0x02,0x0c,0x02,0x05,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06, -0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x22,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x22,0xb8,0xff,0xea,0x40,0x0b,0x0b,0x06,0x4d,0x00,0x22,0x10,0x22,0x02,0x0b,0x03,0x22,0xb8,0xff,0xf8,0x40,0x4b,0x0b,0x06,0x4d,0x22,0x22,0x25,0x19,0x06,0x0d,0x06,0x4d,0x19,0x06,0x0c,0x06,0x4d, -0x19,0x06,0x0b,0x06,0x4d,0x19,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x0c,0x0b,0x08,0x02,0x01,0x12,0x40,0x14,0x1b,0x1c,0x1d,0x04,0x1f,0x16,0x00,0x03,0x0a,0x0d,0x04,0x12,0x08,0x08,0x16,0x91,0x59,0x08,0x04,0x12,0x1f,0x91,0x59,0x12,0x13,0x2f,0x25,0x01,0x5d,0x00,0x3f,0x2b,0x00, -0x18,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x11,0x12,0x17,0x39,0x1a,0x18,0x10,0xce,0x32,0x10,0xce,0x32,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x2b,0x01,0x5d, -0x5d,0x00,0x5d,0x25,0x07,0x27,0x37,0x26,0x11,0x10,0x00,0x21,0x32,0x17,0x37,0x17,0x07,0x16,0x11,0x10,0x00,0x21,0x20,0x01,0x26,0x23,0x22,0x00,0x11,0x14,0x17,0x01,0x01,0x16,0x33,0x32,0x00,0x11,0x10,0x01,0x44,0x98,0x4e,0x9e,0x9e,0x01,0x75,0x01,0x43,0xea,0xa8,0x87,0x4e,0x8b,0xb8,0xfe,0x8c,0xfe,0xc8,0xfe,0xf6,0x02,0x4e,0x7e, -0xba,0xe3,0xfe,0xe7,0x62,0x03,0x15,0xfd,0x2b,0x83,0xcb,0xec,0x01,0x10,0x83,0xb6,0x41,0xbf,0xc3,0x01,0x2c,0x01,0x57,0x01,0x9f,0x81,0xa2,0x3f,0xa6,0xc8,0xfe,0xb9,0xfe,0xa1,0xfe,0x68,0x04,0xcc,0x66,0xfe,0xb8,0xfe,0xf9,0xdf,0x96,0x03,0x14,0xfc,0x9e,0x89,0x01,0x35,0x01,0x14,0x01,0x04,0x00,0x03,0x00,0x52,0x00,0xcf,0x06,0x3a, -0x03,0xd9,0x00,0x13,0x00,0x1d,0x00,0x27,0x00,0x8e,0x40,0x15,0x57,0x25,0x01,0x57,0x21,0x01,0x58,0x1b,0x01,0x58,0x17,0x01,0x14,0x00,0x23,0x1e,0x0a,0x05,0x19,0xbd,0x0f,0xb8,0xff,0xe0,0x40,0x0c,0x0c,0x06,0x4d,0x00,0x0f,0x01,0x0f,0x0f,0x29,0x23,0xbd,0x05,0xb8,0xff,0xe0,0x40,0x11,0x0c,0x06,0x4d,0x0f,0x05,0x1f,0x05,0x02,0x0b, -0x03,0x05,0x00,0x40,0x0c,0x00,0x4d,0x0a,0xb8,0xff,0xe0,0x40,0x1a,0x0c,0x00,0x4d,0x1e,0x26,0x14,0x00,0x0c,0x16,0x12,0x02,0x26,0x02,0x26,0xeb,0x59,0x02,0x1c,0x0c,0x20,0x08,0x08,0x20,0xeb,0x59,0x08,0x00,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x11,0x39,0x39,0x12,0x39,0x2b,0x2b,0x01,0x18, -0x2f,0x5f,0x5e,0x5d,0x2b,0xe1,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x13,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x12,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x01,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32, -0x03,0x44,0xa8,0xd6,0xa5,0xcf,0xd8,0x9c,0xec,0x96,0xa4,0xd8,0xa6,0xd0,0xd8,0x9e,0xe2,0x5d,0x83,0xbc,0x6d,0x83,0x88,0x68,0xad,0xfe,0xef,0x84,0xbc,0x6e,0x83,0x87,0x6a,0xb0,0x01,0xe2,0xfe,0xed,0xd5,0xac,0xa2,0xe7,0xfe,0xef,0x01,0x11,0xd5,0xac,0xa1,0xe8,0x01,0x85,0xfe,0xfc,0x91,0x77,0x70,0x94,0xfe,0xfa,0x01,0x06,0x96,0x76, -0x6e,0x92,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xa4,0x00,0x0b,0x00,0x0f,0x00,0x5d,0x40,0x2e,0x03,0x0e,0x04,0x08,0x0e,0x07,0x40,0x0a,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x0f,0x07,0x1f,0x07,0xaf,0x07,0x03,0x0d,0x03,0x07,0x0f,0x0c,0x0f,0xbe,0x59,0x0c,0x12,0x0f,0x00,0x0e,0x0a,0x07,0x01,0xbd,0x04,0x04,0x05,0x42,0x0e, -0x05,0x04,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0xcd,0x32,0x2b,0x01,0x10,0xf1,0x39,0x39,0xe1,0x32,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x11,0x21,0x35,0x21,0x04, -0x94,0xfe,0x6c,0x83,0xfe,0x6b,0x01,0x95,0x83,0x01,0x94,0xfc,0x54,0x03,0xac,0x02,0x8c,0xfe,0x6c,0x01,0x94,0x84,0x01,0x94,0xfe,0x6c,0xfc,0xf0,0x85,0x00,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xcb,0x00,0x07,0x00,0x0b,0x00,0x5c,0x40,0x0b,0x08,0x01,0x01,0x07,0x10,0x0b,0x00,0x4d,0x02,0x01,0x00,0xb8,0xff,0xc0,0x40,0x15, -0x0c,0x00,0x4d,0x00,0x03,0x01,0x10,0x03,0x03,0x03,0x00,0x0a,0x09,0x0a,0xbe,0x59,0x09,0x12,0x03,0x07,0x08,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x08,0x05,0x01,0x09,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x09,0x40,0x0c,0x00,0x4d,0x09,0x2f,0x2b,0x2b,0xc4,0x32,0x2f,0x2b,0xc4,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x32,0x2f, -0x5f,0x5e,0x5d,0x2b,0x39,0x39,0x31,0x30,0x2b,0x5d,0x25,0x01,0x35,0x01,0x15,0x01,0x15,0x01,0x13,0x21,0x35,0x21,0x04,0x6c,0xfc,0xa4,0x03,0x5c,0xfd,0x7e,0x02,0x82,0x28,0xfc,0x54,0x03,0xac,0xfe,0x01,0xb2,0x3a,0x01,0xe1,0x96,0xfe,0x9e,0x04,0xfe,0xc7,0xfe,0x6a,0x85,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xcd,0x00,0x07, -0x00,0x0b,0x00,0x5c,0x40,0x10,0x08,0x00,0x01,0x02,0x10,0x0b,0x00,0x4d,0x07,0x00,0x00,0x06,0x01,0x10,0x03,0x01,0xb8,0xff,0xc0,0x40,0x10,0x0c,0x00,0x4d,0x06,0x06,0x01,0x0a,0x09,0x0a,0xbe,0x59,0x09,0x12,0x04,0x00,0x08,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x08,0x05,0x01,0x09,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x09,0x40, -0x0c,0x00,0x4d,0x09,0x2f,0x2b,0x2b,0xd4,0xc4,0x2f,0x2b,0xc4,0x32,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x32,0x2f,0x2b,0x5f,0x5e,0x5d,0x39,0x39,0x31,0x30,0x2b,0x5d,0x01,0x01,0x35,0x01,0x35,0x01,0x35,0x01,0x13,0x21,0x35,0x21,0x04,0x6c,0xfc,0xa4,0x02,0x84,0xfd,0x7c,0x03,0x5c,0x28,0xfc,0x54,0x03,0xac,0x02,0xb2,0xfe,0x4e,0x98, -0x01,0x35,0x06,0x01,0x65,0x95,0xfe,0x1f,0xfd,0x14,0x85,0x00,0x00,0x01,0x00,0x44,0x00,0x00,0x04,0x12,0x05,0x9a,0x00,0x1b,0x00,0x9d,0x40,0x4f,0x0f,0x1b,0x01,0x00,0x14,0x01,0x10,0x05,0x01,0x08,0x0b,0x00,0x4d,0x01,0x04,0x00,0x04,0x12,0x0f,0x13,0x0f,0x04,0x01,0x0f,0x17,0x12,0x12,0x0f,0x9a,0x59,0x08,0x05,0x0b,0x0e,0x0e,0x0b, -0x9a,0x59,0x04,0x01,0x0f,0x12,0x0e,0x12,0x0e,0x09,0x14,0x00,0x03,0x09,0x12,0x03,0x03,0x07,0x0e,0x09,0x0a,0x0c,0x42,0x10,0x0c,0x0c,0x0a,0x13,0x00,0x0e,0x09,0x0a,0x13,0x42,0x13,0x13,0x05,0x0e,0x17,0x03,0x09,0x7e,0x0a,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x20,0x0a,0x01,0x0a,0x2f,0x5d,0x2b,0xe1,0x17,0x39,0x33,0x2f,0x2b,0x01, -0x10,0xe0,0x11,0x12,0x39,0x18,0x2f,0xc4,0x2b,0x01,0x10,0xf2,0xc2,0x18,0x2f,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x00,0x33,0x12,0x39,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x01,0x2b,0x5f,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21, -0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x04,0x12,0xfe,0x9c,0x01,0x1d,0xfe,0xb2,0x01,0x4e,0xfe,0xb2,0xa4,0xfe,0xa8,0x01,0x58,0xfe,0xa8,0x01,0x23,0xfe,0xa0,0xc0,0xfa,0x1c,0x13,0x04,0x0d,0x24,0xfc,0x05,0x9a,0xfd,0x70,0x8b,0xcf,0x8b,0xfe,0xdb,0x01,0x25,0x8b,0xcf,0x8b, -0x02,0x90,0xfd,0xfe,0x3a,0x35,0x2a,0x4b,0x01,0xfc,0x00,0x01,0x00,0xa6,0xfe,0x74,0x04,0x18,0x04,0x00,0x00,0x18,0x00,0x5d,0x40,0x13,0x0f,0x08,0x01,0x10,0x05,0x03,0x14,0x00,0x89,0x01,0x01,0x17,0x8a,0x14,0x10,0x0d,0x06,0x4d,0x14,0xb8,0xff,0xfa,0xb7,0x0b,0x06,0x4d,0x14,0x0e,0x0a,0x8a,0x0b,0xb8,0xff,0xf8,0x40,0x16,0x0d,0x06, -0x4d,0x0b,0x0c,0x16,0x0f,0x0b,0x08,0x04,0x11,0x06,0x11,0x99,0x59,0x06,0x16,0x00,0x15,0x2f,0x1a,0x01,0x5d,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x3f,0xc4,0x01,0x2f,0x2b,0xe1,0x32,0x2f,0x2b,0x2b,0xe1,0x39,0x2f,0xe1,0x12,0x39,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x21,0x23,0x26,0x35,0x23,0x06,0x23,0x22,0x27,0x23,0x11, -0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x04,0x18,0xaa,0x17,0x05,0x54,0xc3,0xa7,0x47,0x04,0xa3,0xa3,0x8a,0x6f,0x79,0x97,0xa6,0x48,0x60,0xbf,0x7b,0xfe,0x10,0x05,0x8c,0xfd,0x8e,0x7f,0x96,0xac,0x91,0x02,0x4a,0xfd,0x09,0xbc,0x00,0x02,0x00,0x4e,0xff,0xe8,0x04,0x04,0x05,0xd1,0x00,0x16,0x00,0x21, -0x00,0x6e,0x40,0x0f,0x06,0x1a,0x01,0x0f,0x02,0x01,0x10,0x04,0x05,0x05,0x12,0x17,0x0b,0x8a,0x01,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x01,0x01,0x23,0x1c,0x89,0x12,0xb8,0xff,0xe8,0x40,0x20,0x0c,0x06,0x4d,0x12,0x17,0x01,0x19,0x15,0x19,0x9a,0x59,0x15,0x10,0x0f,0x05,0x01,0x0d,0x03,0x05,0x05,0x03,0x08,0x03,0x9a,0x59,0x08, -0x0f,0x1f,0x9a,0x59,0x0f,0x13,0x00,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x33,0x01,0x18,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x33,0x12,0x39,0x19,0x2f,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x01,0x33,0x12,0x21,0x22,0x07,0x37,0x36,0x33,0x32,0x12,0x11,0x14,0x02,0x00,0x23, -0x22,0x26,0x35,0x10,0x00,0x33,0x32,0x13,0x26,0x23,0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x03,0x5e,0x04,0x1a,0xfe,0xdc,0x7b,0x7b,0x27,0x77,0x81,0xc2,0xc1,0x82,0xfe,0xf2,0xb8,0xa6,0xc8,0x01,0x27,0xe3,0xb2,0x48,0x3a,0xac,0xa0,0xd6,0x71,0x61,0x97,0xd8,0x03,0x68,0x01,0xdc,0x50,0x9c,0x41,0xfe,0xf8,0xfe,0xdd,0xdd,0xfe,0x20, -0xfe,0xff,0xd5,0xb5,0x01,0x10,0x01,0x8e,0xfe,0xa4,0xd1,0xfe,0xc6,0xd2,0x7a,0x8d,0x01,0x3f,0x00,0x01,0x00,0x33,0xfe,0x2b,0x04,0xba,0x05,0x9a,0x00,0x0b,0x00,0x46,0x40,0x25,0x03,0x0a,0x01,0x04,0x09,0x01,0x03,0x08,0x01,0x10,0x03,0x06,0x00,0x00,0x0d,0x08,0x04,0x0a,0x02,0x04,0x06,0x07,0x06,0x07,0x91,0x59,0x06,0x03,0x02,0x00, -0x0b,0x00,0x0b,0x91,0x59,0x00,0x1b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x33,0xc6,0x32,0x12,0x39,0x2f,0xc4,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x01,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x04,0xba,0xfb,0x79,0x02,0xa4,0xfd,0x81,0x04,0x3a,0xfc,0xbc,0x02,0x52, -0xfd,0x8f,0x03,0x8b,0xfe,0x2b,0x4e,0x03,0x73,0x03,0x54,0x5a,0x9a,0xfc,0xf0,0xfc,0xd4,0x00,0x00,0x01,0x00,0xbc,0xfe,0x2b,0x05,0x52,0x05,0x9a,0x00,0x07,0x00,0x3b,0x40,0x0d,0x00,0x7e,0x01,0x18,0x0d,0x06,0x4d,0x01,0x01,0x09,0x04,0x7e,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf8,0x40,0x0d,0x0c,0x06,0x4d,0x05, -0x07,0x02,0x91,0x59,0x07,0x03,0x04,0x00,0x1b,0x00,0x3f,0xc4,0x3f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x05,0x52,0xa8,0xfc,0xba,0xa8,0x04,0x96,0xfe,0x2b,0x06,0xd5,0xf9,0x2b,0x07,0x6f,0x00,0x00,0x01,0x00,0xbe,0xfe,0x1a,0x03,0x94,0x06,0x02,0x00,0x15, -0x00,0x43,0x40,0x0a,0x00,0x0e,0x05,0x8a,0x0f,0x0f,0x0b,0x42,0x0b,0x0f,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xe0,0x40,0x13,0x0b,0x06,0x4d,0x0f,0x0f,0x17,0x16,0x13,0x02,0x9a,0x59,0x13,0x01,0x08,0x0d,0x9a,0x59,0x08,0x1c,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x2b,0x2b,0xc6,0x2b,0x01, -0x10,0xf1,0xe2,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x03,0x94,0x30,0x3f,0xaa,0xbb,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0xbb,0x8a,0x4c,0x2c,0x05,0x5c,0x1b,0xd9,0xfa,0xd6,0x9e,0xbc,0x13,0x93,0x1a,0xd9,0x05,0x27,0xa0,0xbc,0x12,0x00,0x02,0x00,0x52, -0x02,0xba,0x02,0xb0,0x05,0xb0,0x00,0x15,0x00,0x1f,0x00,0x6e,0x40,0x42,0x00,0x13,0x01,0x0f,0x06,0x01,0x10,0x05,0x0b,0x16,0x54,0x59,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x09,0x03,0x0b,0x0b,0x12,0x1c,0x00,0x24,0x02,0x1c,0x05,0x1c,0x54,0x59,0x05,0x25,0x0f,0x30,0x0d,0x11,0x48,0x0f,0x0f,0x0d,0x12,0x0d,0x52,0x59,0x12,0x04,0x0b, -0x02,0x1f,0xc2,0xc0,0x00,0x01,0xd0,0x00,0x01,0x00,0x21,0x0f,0x0f,0x19,0xc2,0x08,0x2f,0xe1,0x39,0x2f,0x10,0xde,0x5d,0x71,0xe1,0x32,0x32,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x01,0x23,0x35,0x23,0x06,0x23, -0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x07,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x02,0xb0,0x81,0x04,0x4f,0x98,0x6d,0x85,0xf8,0xe5,0x97,0x88,0x76,0x6f,0x9b,0x7e,0x8e,0x81,0xb4,0xa8,0x4d,0x40,0x52,0x7d,0x02,0xcd,0x64,0x77,0x77,0x5d,0xca,0x21,0x1f,0xa8,0x56,0x80,0x46,0x90, -0x82,0x6b,0x19,0x17,0x6f,0x33,0x40,0x7a,0x55,0x00,0x00,0x02,0x00,0x4e,0x02,0xb8,0x03,0x23,0x05,0xae,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x1a,0x00,0x12,0x52,0x59,0x00,0x25,0x06,0x0c,0x52,0x59,0x06,0x04,0x15,0xc8,0x90,0x09,0xb0,0x09,0xc0,0x09,0x03,0x09,0x19,0x0f,0xc8,0x03,0x2f,0xe1,0x10,0xde,0x71,0xe1,0x00,0x3f,0x2b,0x00, -0x18,0x3f,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xb4,0xa7,0xbf,0xcd,0xa9,0xa3,0xbc,0xc7,0xa0,0x6a,0x7d,0x77,0x6e,0x69,0x7b,0x79,0x02,0xb8,0xc9,0xac,0xb5,0xcc,0xc7,0xab,0xb2,0xd2,0x02,0x88,0x90,0x7f,0x7c,0x8c,0x8f,0x7b, -0x7e,0x8f,0x00,0x01,0x00,0x64,0x00,0x00,0x05,0xa9,0x05,0xb2,0x00,0x1b,0x00,0xc9,0x40,0x0c,0x59,0x19,0x01,0x59,0x11,0x01,0x10,0x10,0x0c,0x00,0x4d,0x1a,0xb8,0xff,0xf0,0x40,0x27,0x0c,0x00,0x4d,0x0c,0x08,0x0c,0x00,0x4d,0x02,0x08,0x0c,0x00,0x4d,0x1a,0x18,0x02,0x10,0x12,0x0c,0x02,0x0c,0x02,0x04,0x0a,0x1b,0x1b,0x18,0x08,0x0d, -0x06,0x4d,0x18,0x08,0x0c,0x06,0x4d,0x18,0x7d,0x04,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xdc,0x40,0x40,0x0b,0x06,0x4d,0x00,0x04,0x10,0x04,0x02,0x0b,0x03,0x04,0x04,0x1d,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x7d,0x0f,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08, -0x0c,0x06,0x4d,0x12,0x12,0x0b,0x06,0x4d,0x12,0x15,0x07,0x99,0x59,0x15,0x04,0x02,0x0c,0x0e,0x10,0x04,0x00,0x1b,0x00,0x1b,0x99,0x59,0x00,0x12,0x2f,0x1d,0x01,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x3f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0x2b,0xc4,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b, -0x2b,0xc1,0x2f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x00,0x2b,0x2b,0x01,0x2b,0x2b,0x00,0x5d,0x5d,0x21,0x21,0x35,0x24,0x11,0x34,0x00,0x23,0x22,0x00,0x15,0x10,0x01,0x15,0x21,0x35,0x05,0x24,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x05,0x25,0x05,0xa9,0xfd,0xf9,0x01,0x59,0xfe,0xea,0xdb,0xde,0xfe, -0xe6,0x01,0x5a,0xfd,0xf8,0x01,0x5c,0xfe,0xa4,0x01,0x72,0x01,0x2e,0x01,0x35,0x01,0x70,0xfe,0xa5,0x01,0x5b,0x93,0xff,0x01,0x7a,0xf5,0x01,0x1d,0xfe,0xe4,0xf5,0xfe,0x86,0xff,0x00,0x93,0x94,0x01,0xeb,0x01,0x93,0x01,0x39,0x01,0x68,0xfe,0x9b,0xfe,0xc5,0xfe,0x6e,0xed,0x01,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0x56,0x04,0x18, -0x00,0x23,0x00,0x2a,0x00,0x35,0x00,0xcd,0x40,0x21,0x56,0x19,0x01,0x51,0x12,0x01,0x59,0x07,0x01,0x58,0x1f,0x01,0x58,0x0a,0x01,0x0f,0x40,0x0b,0x00,0x4d,0x5f,0x07,0x01,0x07,0x07,0x00,0x83,0x24,0x08,0x0c,0x06,0x4d,0x24,0xb8,0xff,0xc0,0x40,0x59,0x0b,0x0c,0x00,0x4c,0x24,0x24,0x37,0x0b,0x14,0x1d,0x2a,0x04,0x01,0x84,0x2b,0x2b, -0x37,0x11,0x00,0x18,0x01,0x18,0x18,0x30,0x83,0x11,0x10,0x0c,0x06,0x4d,0x0f,0x11,0x01,0x0b,0x03,0x11,0x2c,0x14,0x00,0x24,0x24,0x00,0x95,0x59,0x24,0x24,0x04,0x18,0x40,0x09,0x0c,0x48,0x18,0x18,0x16,0x1b,0x16,0x20,0x1e,0x27,0x20,0x27,0x95,0x59,0x20,0x10,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x0c,0x03,0x06,0x06,0x01,0x0b,0x33, -0x0e,0x09,0x04,0x09,0x04,0x95,0x59,0x09,0x16,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x12,0x39,0x39,0x18,0x2f,0x33,0x2f,0x2b,0x11,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0xe1,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0xe1,0x17, -0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x32,0x2f,0x5d,0x30,0x31,0x00,0x2b,0x01,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x33,0x36,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07, -0x07,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x56,0xfd,0x2b,0x03,0xb0,0x99,0xb1,0x90,0x84,0xe2,0xfe,0xf2,0x71,0x04,0x91,0xf2,0x99,0xaf,0x01,0x7f,0x01,0x06,0xd7,0xaf,0x9b,0x94,0xc8,0xe8,0x44,0x04,0x74,0xf0,0xca,0xde,0xa8,0x02,0x85,0x77,0x74,0xa6,0x13,0xa4,0xcb,0x8b,0x89,0x6a,0x5a,0x77,0xa4,0x01,0xd7,0xab, -0xba,0x72,0x9a,0x62,0xe5,0xe5,0xa1,0x87,0x01,0x2c,0x18,0x10,0x01,0x2a,0x7a,0xa4,0x60,0xc8,0xc8,0xfe,0xfb,0xe8,0x37,0x90,0x9c,0xa4,0x88,0xc8,0x3f,0x0c,0x08,0x52,0x5f,0x49,0x59,0xa9,0x00,0x03,0x00,0x31,0xff,0xae,0x04,0x96,0x04,0x66,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0xd4,0xb6,0x58,0x1c,0x01,0x57,0x1b,0x01,0x1d,0xb8,0xff, -0xf0,0x40,0x2b,0x0b,0x0c,0x00,0x4c,0x1d,0x14,0x22,0x19,0x0b,0x08,0x12,0x01,0x04,0x03,0x0d,0x13,0x00,0x00,0x03,0x06,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x06,0x0b,0x06,0x4d,0x03,0x83,0x00,0x22,0x10,0x22,0x02,0x0b,0x03,0x22,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x22,0xb8,0xff, -0xde,0x40,0x47,0x0b,0x06,0x4d,0x22,0x22,0x25,0x19,0x07,0x0d,0x06,0x4d,0x19,0x0a,0x0c,0x06,0x4d,0x19,0x83,0x09,0x0a,0x0d,0x11,0x0d,0x06,0x4d,0x0d,0x0c,0x0c,0x06,0x4d,0x0d,0x19,0x0b,0x06,0x4d,0x0d,0x14,0x1b,0x1c,0x1d,0x04,0x1f,0x16,0x01,0x08,0x0b,0x12,0x04,0x10,0x0a,0x09,0x06,0x00,0x13,0x10,0x40,0x10,0x16,0x95,0x59,0x10, -0x10,0x06,0x1f,0x95,0x59,0x06,0x16,0x2f,0x25,0x01,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x32,0x10,0xce,0x32,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x01,0x2f,0x2b,0x2b,0x2b,0xce,0x32,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0xf1,0x2b,0x2b,0x2b,0xca,0x2f,0x32,0x11,0x12,0x17,0x39, -0x11,0x12,0x39,0x39,0x31,0x30,0x00,0x2b,0x5d,0x5d,0x01,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x10,0x00,0x33,0x32,0x17,0x37,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x96,0xa8,0x62,0xfe,0xea,0xe8,0xc0,0x7e,0x91,0x52,0x95,0x66,0x01,0x1c,0xf0,0xb8,0x7c, -0xa2,0xfe,0xf3,0x4f,0x88,0x9f,0xb7,0x32,0x02,0x41,0xfe,0x04,0x57,0x86,0xa3,0xab,0x04,0x18,0xb4,0x8a,0xd0,0xfc,0xfe,0xda,0x66,0xa0,0x4e,0xa4,0x89,0xcb,0x01,0x02,0x01,0x22,0x62,0xb0,0xfe,0xde,0x4a,0xd7,0xbd,0x84,0x5c,0x01,0xcc,0xfd,0xd8,0x4c,0xd0,0xbe,0x86,0x00,0x00,0x02,0x00,0x8f,0xfe,0x52,0x03,0x3d,0x04,0x16,0x00,0x23, -0x00,0x33,0x00,0x45,0x40,0x25,0x0f,0x12,0x01,0x10,0x05,0x11,0x0f,0x14,0x0f,0x95,0x59,0x14,0x00,0x2c,0x24,0x2c,0xb0,0x5b,0x24,0x10,0x20,0xef,0x03,0x30,0xaf,0x70,0x28,0x01,0x28,0x28,0x11,0x19,0x84,0x0a,0x0a,0x34,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0xe1,0xd4,0xe1,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2f,0x2b, -0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x16,0x16,0x15,0x14,0x0e,0x04,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x27,0x13,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x02,0x71,0x09,0x0e,0x33,0x4c,0x5a,0x4c,0x33,0x25,0x40, -0x54,0x2f,0xa9,0x7c,0x99,0xa4,0x4c,0x86,0x64,0x3b,0x34,0x4f,0x5c,0x4f,0x34,0x16,0x0b,0x47,0x2c,0x22,0x21,0x21,0x21,0x2d,0x2d,0x21,0x21,0x21,0x22,0x02,0x76,0x1a,0x53,0x29,0x40,0x67,0x5a,0x53,0x55,0x5d,0x38,0x30,0x4a,0x32,0x19,0x85,0xb0,0x60,0x28,0x4f,0x76,0x4e,0x4a,0x74,0x61,0x54,0x53,0x5a,0x36,0x2e,0x4b,0x1a,0x01,0xa0, -0x20,0x1f,0x2f,0x2e,0x20,0x21,0x21,0x20,0x2e,0x2f,0x1f,0x20,0x00,0x02,0x00,0xb4,0xfe,0x6a,0x01,0x92,0x04,0x16,0x00,0x0b,0x00,0x0f,0x00,0x3d,0x40,0x12,0x0d,0x0c,0x0e,0x0f,0xff,0x3a,0x0c,0x7d,0x0d,0x0d,0x09,0xaf,0x0f,0x03,0x01,0x10,0x03,0x03,0xb8,0xff,0xe8,0x40,0x0e,0x0d,0x06,0x4d,0x03,0x0e,0x00,0x40,0x06,0x00,0xb0,0x5b, -0x06,0x10,0x0c,0x00,0x2f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x01,0x2f,0x2b,0x5f,0x5e,0x5d,0xe1,0x39,0x2f,0xe1,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x13,0x33,0x01,0x23,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x2b,0xac,0x13,0x86,0x03,0x3a,0x40,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x40, -0xfb,0x30,0x04,0x06,0x00,0x01,0x00,0xe8,0x00,0xfe,0x04,0x94,0x03,0x31,0x00,0x05,0x00,0x2c,0xb2,0x01,0xbd,0x00,0xb8,0xff,0xc8,0xb4,0x0c,0x06,0x4d,0x00,0x03,0xb8,0xff,0xe0,0x40,0x0b,0x0c,0x06,0x4d,0x03,0x00,0x03,0x04,0x03,0xbe,0x59,0x04,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x01,0x2f,0x2b,0x2f,0x2b,0xe1,0x31,0x30,0x25,0x23, -0x11,0x21,0x35,0x21,0x04,0x94,0x84,0xfc,0xd8,0x03,0xac,0xfe,0x01,0xae,0x85,0x00,0x00,0x01,0x00,0x7b,0x00,0x00,0x04,0x5a,0x05,0xec,0x00,0x08,0x00,0x41,0x40,0x22,0x0a,0x03,0x01,0x0b,0x02,0x01,0x03,0x0f,0x01,0x01,0x10,0x05,0x01,0x02,0x00,0x03,0x03,0x04,0x08,0x00,0x04,0x07,0x01,0x05,0x04,0xd9,0x59,0x05,0x05,0x01,0x00,0x00, -0x01,0x12,0x00,0x3f,0x3f,0x11,0x39,0x2f,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x5d,0x01,0x01,0x23,0x01,0x23,0x35,0x21,0x01,0x01,0x04,0x5a,0xfe,0x7b,0x71,0xfe,0xc1,0xaa,0x01,0x08,0x01,0x13,0x01,0x4e,0x05,0xec,0xfa,0x14,0x02,0xee,0x78,0xfd,0x6b,0x05, -0x1b,0x00,0x00,0x01,0x00,0x5e,0xfe,0xea,0x03,0xb8,0x05,0x9a,0x00,0x1c,0x00,0x89,0x40,0x12,0x79,0x13,0x01,0x79,0x11,0x01,0x77,0x09,0x01,0x77,0x03,0x01,0x0a,0x30,0x0c,0x00,0x4d,0x04,0xb8,0xff,0xf0,0x40,0x3c,0x0c,0x00,0x4d,0x0f,0x06,0x01,0x09,0x06,0x06,0x04,0x08,0x05,0x04,0x03,0x09,0x13,0x16,0x17,0x09,0x04,0x12,0x00,0x14, -0x20,0x14,0x30,0x14,0x03,0x0a,0x03,0x14,0x14,0x12,0x12,0x0d,0x1c,0x0d,0x08,0x05,0x13,0x16,0x16,0x13,0x95,0x59,0x16,0x16,0x1d,0x1a,0x1a,0x02,0x95,0x59,0x1a,0x03,0x0b,0x10,0x95,0x59,0x0b,0x00,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x2f,0x12,0x39,0x11,0x33, -0x2f,0x5f,0x5e,0x5d,0x11,0x17,0x33,0x11,0x17,0x33,0x11,0x33,0x2f,0x5e,0x5d,0x31,0x30,0x2b,0x00,0x2b,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x26,0x23,0x22,0x07,0x07,0x33,0x15,0x23,0x03,0x02,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x13,0x23,0x35,0x33,0x37,0x36,0x36,0x33,0x32,0x17,0x03,0xb8,0x30,0x3c,0x92,0x18,0x1f,0xa6,0xbb,0x5a, -0x3a,0xfe,0xde,0x1f,0x3b,0x24,0x32,0x96,0x28,0x5b,0x67,0x7c,0x1c,0x11,0xaf,0x86,0x40,0x34,0x04,0xf2,0x1c,0xa0,0xd0,0x8a,0xfd,0x78,0xfe,0x5e,0x10,0x8f,0x15,0x01,0x24,0x02,0x7c,0x8a,0xdb,0x83,0x9e,0x13,0x00,0x02,0x00,0xd1,0x00,0xf0,0x04,0xaa,0x03,0xc0,0x00,0x14,0x00,0x29,0x00,0x97,0xb9,0x00,0x16,0xff,0xe0,0xb3,0x09,0x0c, -0x48,0x01,0xb8,0xff,0xe0,0x40,0x3a,0x09,0x0c,0x48,0x20,0x20,0x09,0x0c,0x48,0x0b,0x20,0x09,0x0c,0x48,0x1e,0x18,0x18,0x26,0xbe,0x59,0x18,0x1c,0x40,0x22,0x1c,0xbe,0x59,0x15,0x00,0x22,0x01,0x0c,0x03,0x22,0x0d,0x09,0x03,0x03,0x11,0xbe,0x59,0x03,0x07,0x40,0x0d,0x07,0xbe,0x59,0x14,0x00,0x0d,0xa0,0x0d,0xb0,0x0d,0x03,0x0c,0x03, -0x0d,0xb8,0xff,0xc0,0x40,0x14,0x0e,0x11,0x48,0x0d,0x29,0x15,0x14,0xbd,0x00,0x1f,0x1e,0x09,0xbd,0x0a,0x2a,0x2b,0x0a,0x00,0xff,0x3a,0x2b,0x01,0x10,0xe1,0x39,0x39,0x10,0xe1,0x39,0x39,0x00,0x18,0x2f,0x2b,0x5f,0x5e,0x5d,0xc4,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x10,0xd4,0x5f,0x5e,0x5d,0xc4,0x2b,0x00,0x1a, -0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x01,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x13,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x04,0xaa,0x07,0x93,0x7e,0x6d,0x9c, -0x61,0x3e,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x87,0x07,0x93,0x7e,0x6d,0x9c,0x5e,0x41,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x03,0xc0,0x92,0xa2,0x6c,0x44,0xb0,0x90,0xa4,0x58,0x5a,0x62,0x50,0xfe,0x65,0x93,0xa2,0x6c,0x42,0xae,0x8f,0xa6,0x58,0x5b,0x64,0x4f,0x00,0x02, -0x00,0x33,0x00,0x00,0x04,0xf8,0x05,0x9a,0x00,0x05,0x00,0x0d,0x00,0x3f,0x40,0x22,0x00,0x0d,0x01,0x00,0x0c,0x01,0x0f,0x07,0x01,0x0f,0x06,0x01,0x10,0x04,0x0d,0x06,0x02,0x05,0x05,0x0f,0x02,0x09,0x03,0x03,0x05,0x02,0x01,0x0d,0x01,0x0d,0x99,0x59,0x01,0x12,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x01,0x2f,0x12, -0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x01,0x33,0x01,0x27,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x04,0xf8,0xfb,0x3b,0x02,0x09,0xae,0x02,0x0e,0xd7,0xfe,0x97,0x21,0x05,0x04,0x06,0x22,0xfe,0xa0,0x4c,0x05,0x4e,0xfa,0xb2,0x4c,0x03,0xc8,0x58,0x36,0x30,0x5e,0xfc,0x38,0x00,0x02,0x00,0x5c, -0x00,0xc8,0x03,0xb4,0x03,0x70,0x00,0x05,0x00,0x0b,0x00,0x2b,0x40,0x15,0x06,0x0a,0x00,0x04,0x00,0x00,0x04,0xf0,0x05,0x02,0x08,0x80,0x0a,0x0a,0x06,0xf0,0x0b,0x0f,0x08,0x01,0x08,0x2f,0x5d,0x33,0xf1,0xc0,0x2f,0x1a,0x10,0xdc,0x32,0xf1,0xc2,0x2f,0x00,0x2f,0xc6,0x39,0x39,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x03,0x23,0x01, -0x01,0x33,0x01,0x03,0xb2,0xa8,0xfe,0xd5,0x01,0x2b,0xaa,0xfe,0xcd,0x54,0xa6,0xfe,0xd5,0x01,0x2b,0xa6,0xfe,0xd1,0xc8,0x01,0x50,0x01,0x58,0xfe,0xa8,0xfe,0xb0,0x01,0x50,0x01,0x58,0xfe,0xa8,0x00,0x00,0x02,0x00,0x5a,0x00,0xc8,0x03,0xb4,0x03,0x70,0x00,0x05,0x00,0x0b,0x00,0x2b,0x40,0x17,0x07,0x0b,0x02,0x04,0x03,0x00,0xf0,0x04, -0x02,0x80,0x09,0x06,0xf0,0x0a,0x50,0x08,0x70,0x08,0x02,0x2f,0x08,0x01,0x08,0x2f,0x5d,0x5d,0xc4,0xe1,0x32,0x1a,0xdc,0xc4,0xe1,0x32,0x00,0x2f,0xc4,0x39,0x39,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33,0x03,0x01,0x23,0x01,0x01,0x33,0x03,0xb4,0xfe,0xd3,0xa5,0x01,0x2e,0xfe,0xd2,0xa5,0x58,0xfe,0xd5,0xaa,0x01,0x34,0xfe,0xcc,0xaa, -0x02,0x1a,0xfe,0xae,0x01,0x52,0x01,0x56,0xfe,0xaa,0xfe,0xae,0x01,0x52,0x01,0x56,0x00,0x03,0x00,0x8c,0xff,0xee,0x05,0x52,0x00,0xcd,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x56,0xb2,0x03,0xaf,0x09,0xb8,0xff,0xfd,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfb,0x40,0x27,0x0b,0x06,0x4d,0x09,0x0e,0x15,0x0f,0x1b,0x42,0x21,0xaf,0x1b,0x1b, -0x24,0x15,0xaf,0x0f,0x0f,0x25,0x24,0x0c,0x12,0x18,0x1e,0x04,0x00,0x06,0x00,0x06,0xb0,0x5b,0x00,0x13,0x40,0x25,0x01,0x2f,0x25,0x01,0x5d,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x11,0x12,0x01,0x39,0x18,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x31,0x30,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32, -0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x04,0xe4,0x2e,0x3f,0x3f,0x2e,0x2d,0x41,0x41,0xfd,0xdd,0x2e,0x41,0x41,0x2e,0x2d,0x41,0x41,0xfd,0xdd,0x2e,0x3e,0x3e,0x2e,0x2d,0x41,0x40,0x12,0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40, -0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x66,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x1f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x23,0x11,0x10,0x06,0x07,0x3e,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x0b,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x2d,0x01,0x59,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x1a,0x10,0x06,0x07,0x25,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x0a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07, -0x00,0xd8,0x01,0xab,0x01,0x58,0x00,0x13,0x40,0x0b,0x02,0x0a,0x22,0x18,0x03,0x09,0x25,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x07,0x12,0x05,0xb2,0x00,0x18,0x00,0x23,0x00,0xb7,0x40,0x1d,0x06,0x18,0x0b,0x00,0x4d,0x14,0x11,0x00,0x00,0x25,0x13,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08, -0x0c,0x06,0x4d,0x17,0x08,0x0b,0x06,0x4d,0x17,0x7e,0x19,0xb8,0xff,0xd0,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0xff,0xd8,0x40,0x4f,0x0b,0x06,0x4d,0x00,0x19,0x01,0x0b,0x03,0x19,0x19,0x25,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x7d,0x08,0x10,0x0d,0x06, -0x4d,0x08,0x10,0x0c,0x06,0x4d,0x08,0x18,0x0b,0x06,0x4d,0x08,0x14,0x15,0x91,0x59,0x14,0x10,0x00,0x14,0x91,0x2b,0x30,0x0b,0x1c,0x91,0x59,0x0b,0x04,0x10,0x11,0x91,0x59,0x10,0x03,0x05,0x22,0x91,0x59,0x05,0x13,0x00,0x18,0x91,0x59,0x00,0x12,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00, -0x18,0x2f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xc4,0xc4,0x31,0x30,0x2b,0x21,0x21,0x22,0x07,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x25,0x11,0x26,0x23, -0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x07,0x12,0xfd,0x30,0x10,0x7a,0x62,0x54,0xfe,0xc8,0xfe,0x94,0x01,0x7b,0x01,0x45,0x5a,0x58,0x70,0x02,0x02,0xb0,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0xfd,0x08,0xa0,0x6c,0xe5,0xfe,0xe5,0x01,0x17,0xe3,0x74,0x0e,0x0a,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0x0a,0x0e,0x98,0xfe,0x23,0x97, -0xfe,0x0a,0x08,0x04,0x5e,0x1c,0xfe,0xb4,0xfe,0xfd,0xfe,0xfe,0xfe,0xb6,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x21,0x04,0x18,0x00,0x1c,0x00,0x23,0x00,0x2f,0x00,0xfb,0xb3,0x58,0x07,0x01,0x0b,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x02,0xb8,0xff,0xe8,0x40,0x0d,0x0c,0x00,0x4d,0x06,0x40,0x0f,0x12,0x48,0x06,0x06,0x1c,0x83,0x1d,0xb8, -0xff,0xc0,0xb3,0x0c,0x00,0x4d,0x1d,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x1d,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1d,0xb8,0xff,0xee,0x40,0x1b,0x0b,0x06,0x4d,0x1d,0x40,0x0c,0x00,0x4d,0x00,0x1d,0x01,0x0b,0x1d,0x1d,0x31,0x0b,0x17,0x23,0x03,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x2d,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x2d,0xb8, -0xff,0xc0,0x40,0x51,0x0c,0x00,0x4d,0x2d,0x2d,0x31,0x27,0x0a,0x0d,0x06,0x4d,0x27,0x0a,0x0c,0x06,0x4d,0x27,0x0a,0x0b,0x06,0x4d,0x27,0x83,0x11,0x10,0x0d,0x06,0x4d,0x11,0x0d,0x0c,0x06,0x4d,0x11,0x1f,0x0b,0x06,0x4d,0x11,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x0c,0x03,0x06,0x06,0x01,0x04,0x1d,0x00,0x95,0x59,0x1d,0x1d,0x04,0x17, -0x24,0x14,0x20,0x19,0x19,0x20,0x95,0x59,0x19,0x10,0x0b,0x2a,0x0e,0x09,0x04,0x09,0x04,0x95,0x59,0x09,0x16,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x32,0x12,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39, -0x2f,0x2b,0x2b,0xe1,0x2b,0x17,0x39,0x12,0x39,0x2f,0x5e,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0xf1,0xc0,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x23,0x06,0x21,0x22,0x00,0x35,0x10,0x00,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01, -0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x07,0x21,0xfd,0x2b,0x03,0xb1,0x9a,0xaf,0x90,0x88,0xdd,0xfe,0xf2,0x70,0x04,0x83,0xfe,0xe3,0xe5,0xfe,0xf3,0x01,0x1c,0xf0,0x01,0x26,0x6c,0x04,0x77,0x01,0x0a,0xc4,0xda,0xa8,0x02,0x86,0x74,0x78,0xa7,0x10,0xfe,0x10,0x9e,0xb8,0xb8,0x9c,0x9f,0xad,0xad,0x01,0xd7,0xab,0xba, -0x72,0x9a,0x62,0xed,0xed,0x01,0x1e,0xec,0x01,0x02,0x01,0x24,0xeb,0xeb,0xfe,0xf9,0xe2,0x33,0x8e,0x9e,0xab,0x81,0x01,0x2c,0xd9,0xbf,0xb4,0xd0,0xcd,0xbd,0xc2,0xd0,0x00,0x01,0x00,0x00,0x01,0xfa,0x04,0x00,0x02,0x7b,0x00,0x03,0x00,0x0f,0xb6,0x02,0x01,0xeb,0x59,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35, -0x21,0x04,0x00,0xfc,0x00,0x04,0x00,0x01,0xfa,0x81,0x00,0x01,0x00,0x00,0x01,0xfa,0x08,0x00,0x02,0x7b,0x00,0x03,0x00,0x0f,0xb6,0x02,0x01,0xeb,0x59,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x08,0x00,0xf8,0x00,0x08,0x00,0x01,0xfa,0x81,0x00,0x02,0x00,0x6a,0x03,0xf4,0x02,0x9c,0x05,0xb2,0x00,0x03, -0x00,0x07,0x00,0x23,0x40,0x13,0x03,0x02,0x06,0xb3,0x40,0x07,0x04,0x00,0xb4,0x02,0x04,0xb4,0x80,0x10,0x06,0x20,0x06,0x02,0x06,0x2f,0x5d,0x1a,0xe9,0xdc,0xe9,0x00,0x3f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x9c,0x6f,0x93,0x8d,0xbb,0x6c,0x96,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42, -0x01,0xbe,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x13,0x03,0x02,0x06,0xb3,0x40,0x07,0x04,0x00,0xb4,0x02,0x04,0xb4,0x80,0x10,0x06,0x20,0x06,0x02,0x06,0x2f,0x5d,0x1a,0xe9,0xdc,0xe9,0x00,0x3f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c, -0x76,0x6c,0x9a,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x01,0x00,0x6a,0x03,0xf4,0x01,0x6c,0x05,0xb2,0x00,0x03,0x00,0x18,0x40,0x0c,0x02,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0xaf,0x02,0x01,0x02,0x2f,0x5d,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x6c,0x6c,0x96,0x8c,0x05, -0xb2,0xfe,0x42,0x01,0xbe,0x00,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x14,0x40,0x09,0x02,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0x02,0x2f,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x70,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0x00,0x00,0x03,0x00,0xe8,0x00,0x70,0x04,0x94, -0x04,0x3a,0x00,0x0a,0x00,0x0e,0x00,0x19,0x00,0x4b,0x40,0x25,0x15,0x0f,0xd6,0x5b,0x15,0x15,0x0c,0x0d,0x0c,0xbe,0x59,0x0d,0x00,0x42,0x00,0x06,0xd6,0x5b,0x00,0x0f,0x0d,0x01,0x0d,0x03,0x0d,0x0b,0x0e,0x17,0x12,0x0c,0x42,0x0c,0x08,0x03,0x17,0xd3,0x12,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x12,0x2f,0x2b,0xe1,0x39,0x39,0xc6,0x2b, -0x01,0x10,0xe2,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0xc6,0x2b,0x2b,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x06,0x01,0x21,0x35,0x21,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x06,0x02,0xc4,0x2c,0x3c,0x3a,0x2e,0x67,0x3d,0x01,0xa6,0xfc,0x54,0x03,0xac,0xfe,0x2c,0x2c, -0x3e,0x3c,0x2e,0x65,0x3a,0x03,0x64,0x3d,0x2c,0x2d,0x40,0x6b,0x2f,0x3c,0xfe,0xae,0x86,0xfd,0xd8,0x3c,0x2b,0x2d,0x42,0x6d,0x2d,0x3c,0x00,0x02,0x00,0x6c,0x00,0x00,0x04,0x40,0x05,0x9a,0x00,0x05,0x00,0x09,0x00,0x28,0x40,0x11,0x03,0x08,0x06,0x00,0x00,0x01,0x05,0x03,0x01,0x12,0x08,0x06,0x03,0x00,0x00,0x0b,0x03,0x2f,0x12,0x39, -0x2f,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x3d,0x2f,0x18,0xc4,0xc4,0x3d,0xc4,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33,0x09,0x03,0x04,0x40,0xfe,0x3b,0x4c,0xfe,0x3d,0x01,0xc3,0x4c,0x01,0x3f,0xfe,0x9c,0xfe,0x9c,0x01,0x64,0x02,0xcd,0xfd,0x33,0x02,0xcb,0x02,0xcf,0xfd,0x33,0x02,0x3f,0xfd,0xc1,0xfd,0xbf,0xff,0xff,0x00,0x0e, -0xfe,0x1e,0x03,0xd5,0x05,0x87,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x00,0x8f,0x4f,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x24,0x1e,0x0c,0x00,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x8f, -0x00,0x95,0x01,0x5b,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0a,0x1d,0x17,0x05,0x00,0x25,0x02,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x01,0xfe,0xc8,0x00,0x00,0x02,0xb2,0x05,0x9a,0x00,0x03,0x00,0x0e,0xb5,0x00,0x03,0x02,0x12,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x01,0x23,0x01, -0x02,0xb2,0xfc,0xa6,0x90,0x03,0x5b,0x05,0x9a,0xfa,0x66,0x05,0x9a,0x00,0x00,0x01,0x00,0x66,0xff,0xe8,0x03,0xf6,0x05,0xb2,0x00,0x25,0x00,0xcb,0x40,0x0c,0x02,0x13,0x01,0x0b,0x00,0x01,0x02,0x22,0x01,0x10,0x04,0x0f,0xb8,0xff,0xe8,0x40,0x65,0x0b,0x00,0x4d,0x03,0x10,0x0b,0x0c,0x00,0x4c,0x13,0x14,0x00,0x25,0x21,0x1e,0x04,0x07, -0x07,0x04,0x9a,0x59,0x07,0x0e,0x40,0x1c,0x19,0x0b,0x0e,0x0e,0x0b,0x9a,0x59,0x0f,0x0e,0x5f,0x0e,0x7f,0x0e,0x8f,0x0e,0x04,0x0b,0x03,0x0e,0x0e,0x11,0x23,0x00,0x14,0x10,0x14,0x02,0x0c,0x04,0x14,0x14,0x16,0x11,0x16,0x9a,0x59,0x11,0x07,0x00,0x25,0x10,0x25,0x02,0x0c,0x04,0x25,0x25,0x23,0x02,0x23,0x9a,0x59,0x02,0x19,0x1f,0x1a, -0x14,0x00,0x00,0x27,0x19,0x1c,0x1e,0x21,0x04,0x1d,0x8a,0x09,0x0c,0x06,0x04,0x07,0x0b,0x0e,0x04,0x09,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x17,0x33,0xde,0xc4,0x10,0xe1,0x17,0x32,0x12,0x39,0x2f,0xd4,0xd6,0xc4,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e, -0x5d,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x11,0x33,0x11,0x33,0x30,0x31,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x03,0x23,0x35,0x33,0x26,0x35,0x34,0x37,0x23,0x35,0x33,0x36,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06, -0x07,0x21,0x15,0x21,0x06,0x17,0x21,0x15,0x21,0x12,0x21,0x32,0x37,0x03,0xf6,0x85,0x95,0xfe,0x55,0x52,0x79,0x6c,0x04,0x06,0x6e,0x83,0x33,0x01,0x1b,0xca,0x89,0x6c,0x72,0x8e,0x7d,0xc3,0x27,0x01,0xf1,0xfd,0xf9,0x08,0x07,0x02,0x08,0xfe,0x08,0x48,0x01,0x16,0x83,0x8d,0x32,0x4a,0x01,0xfa,0x8c,0x1f,0x2e,0x30,0x3c,0x8c,0xf0,0x01, -0x0f,0x38,0xa2,0x4e,0xc9,0xaa,0x8c,0x63,0x56,0x8c,0xfe,0x92,0x57,0x00,0x00,0x01,0x00,0x5c,0x00,0xc8,0x02,0x2f,0x03,0x70,0x00,0x05,0x00,0x1c,0x40,0x0e,0x00,0x04,0x00,0x00,0x04,0xf0,0x05,0x20,0x02,0x01,0x0f,0x02,0x01,0x02,0x2f,0x5d,0x5d,0x33,0xf1,0xc2,0x2f,0x00,0x2f,0xc6,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x02,0x2d, -0xa6,0xfe,0xd5,0x01,0x2b,0xa8,0xfe,0xcf,0xc8,0x01,0x50,0x01,0x58,0xfe,0xa8,0x00,0x00,0x01,0x00,0x5c,0x00,0xc8,0x02,0x2f,0x03,0x70,0x00,0x05,0x00,0x1c,0x40,0x0f,0x02,0x04,0x03,0x00,0xf0,0x04,0x50,0x02,0x70,0x02,0x02,0x0f,0x02,0x01,0x02,0x2f,0x5d,0x5d,0xc4,0xe1,0x32,0x00,0x2f,0xc6,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33, -0x02,0x2f,0xfe,0xd3,0xa6,0x01,0x30,0xfe,0xd0,0xa6,0x02,0x1a,0xfe,0xae,0x01,0x52,0x01,0x56,0x00,0x03,0x00,0x35,0x00,0x00,0x03,0xea,0x06,0x02,0x00,0x14,0x00,0x20,0x00,0x24,0x00,0xaf,0xb9,0x00,0x11,0xff,0xe8,0x40,0x3d,0x0b,0x00,0x4d,0x15,0x1b,0x63,0x59,0x15,0x23,0x12,0x02,0x95,0x59,0x12,0x01,0x05,0x08,0x23,0x03,0x0b,0x0e, -0x0e,0x0b,0x95,0x59,0x0e,0x0f,0x09,0x21,0x15,0x1e,0x62,0x18,0x21,0x08,0x0d,0x06,0x4d,0x21,0x08,0x0c,0x06,0x4d,0x21,0x08,0x0b,0x06,0x4d,0x21,0x84,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0xb8,0xff,0xf1,0x40,0x1e,0x0b,0x06,0x4d,0x22,0x22,0x26,0x0a,0x06,0x00,0x0c,0x0e,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08, -0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xf4,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0xc6,0xd4,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xd4,0xe1,0x00,0x3f,0xc4, -0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x00,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0x02,0xa0,0x30,0x3d,0xac,0xf0,0xf0,0xa3, -0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0xdd,0x2d,0x3e,0x3e,0x2d,0x2d,0x40,0x40,0x23,0xa4,0xa4,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0xec,0x3c,0x2e,0x2d,0x3e,0x3d,0x2e,0x2c,0x3e,0xfa,0xfc,0x04,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x03,0xcf,0x06,0x02,0x00,0x14,0x00,0x18,0x00,0xa4,0xb9,0x00, -0x11,0xff,0xe8,0x40,0x37,0x0b,0x00,0x4d,0x08,0x05,0x0b,0x0e,0x0e,0x0b,0x95,0x59,0x0e,0x0f,0x12,0x02,0x95,0x59,0x12,0x01,0x18,0x00,0x09,0x15,0x15,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x84,0x70,0x16,0x01,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0xb8,0xff,0xf1,0x40, -0x1e,0x0b,0x06,0x4d,0x16,0x16,0x1a,0x0a,0x06,0x00,0x0c,0x0e,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xf4,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39, -0x39,0xc6,0xd4,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x23,0x11,0x33,0x02,0xa0,0x30,0x3d,0xac, -0xf0,0xf0,0xa3,0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0x01,0x2f,0xa2,0xa2,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0xfa,0x10,0x05,0xec,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x15,0x00,0x5a,0x40,0x2e,0x15,0x10,0x14,0x13,0x12,0x02,0x0e,0x06,0x0b,0x40,0x09,0x08,0x07,0x03,0x00,0x0d, -0x10,0x0d,0x02,0x0a,0x03,0x0d,0x15,0x06,0x05,0x06,0x91,0x59,0x00,0x05,0x11,0x0a,0x0b,0x0a,0x91,0x59,0x10,0x0b,0x05,0x0b,0x05,0x0b,0x03,0x0d,0x03,0x03,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x2b,0x11,0x00,0x33,0x11,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x33,0x33,0x33,0x1a,0xce,0x32,0xdd, -0x32,0x32,0x32,0x32,0xce,0x32,0x31,0x30,0x01,0x25,0x13,0x23,0x13,0x05,0x35,0x05,0x37,0x27,0x05,0x35,0x05,0x03,0x33,0x03,0x25,0x15,0x25,0x07,0x17,0x25,0x02,0xd8,0xfe,0xd2,0x28,0x9c,0x28,0xfe,0xd2,0x01,0x06,0x3a,0x3a,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x01,0x2e,0xfe,0xfa,0x3a,0x3a,0x01,0x06,0x02,0x07,0x14,0xfe,0xca,0x01, -0x36,0x14,0x96,0x1e,0xc0,0xc0,0x1e,0x96,0x14,0x01,0x36,0xfe,0xca,0x14,0x96,0x1e,0xc0,0xc0,0x1e,0x00,0x00,0x01,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x00,0x0b,0x00,0x15,0x40,0x0b,0x06,0x00,0xb0,0x5b,0x06,0x09,0xaf,0x03,0x2f,0x0d,0x01,0x5d,0x2f,0xe1,0x00,0x2f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16, -0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x01,0xfe,0x42,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x42,0x00,0x00,0x01,0x00,0x58,0xff,0x1c,0x01,0x5a,0x00,0xd9,0x00,0x03,0x00,0x2c,0x40,0x1c,0x00,0x10,0x10,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x03,0x10,0x10,0x00,0x4d,0x03,0x10,0x0c,0x00,0x4d,0x02,0xb3,0x40,0x03,0x00,0xb4, -0x80,0x02,0x2f,0x1a,0xe9,0x00,0x2f,0x1a,0xed,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x25,0x03,0x23,0x13,0x01,0x5a,0x8d,0x75,0x6e,0xd9,0xfe,0x43,0x01,0xbd,0x00,0x02,0x00,0x58,0xff,0x1c,0x02,0x89,0x00,0xd9,0x00,0x03,0x00,0x07,0x00,0x4d,0x40,0x35,0x04,0x10,0x10,0x00,0x4d,0x04,0x10,0x0c,0x00,0x4d,0x07,0x10,0x10,0x00,0x4d,0x07, -0x10,0x0c,0x00,0x4d,0x00,0x10,0x10,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x03,0x10,0x10,0x00,0x4d,0x03,0x10,0x0c,0x00,0x4d,0x03,0x02,0x06,0xb3,0x40,0x07,0x00,0xb4,0x02,0x04,0xb4,0x80,0x06,0x2f,0x1a,0xe9,0xdc,0xe9,0x00,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x25,0x03,0x23,0x13,0x23, -0x03,0x23,0x13,0x02,0x89,0x8b,0x77,0x6d,0x9a,0x8d,0x75,0x6e,0xd9,0xfe,0x43,0x01,0xbd,0xfe,0x43,0x01,0xbd,0x00,0x00,0x07,0x00,0x50,0xff,0xea,0x09,0x5e,0x05,0xb0,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27,0x00,0x33,0x00,0x3f,0x00,0x4b,0x01,0x01,0x40,0x3c,0x18,0x03,0x1a,0x3a,0x40,0x52,0x59,0x3a,0x0e,0x34,0x34,0x46,0x52,0x59, -0x34,0x1c,0x22,0x28,0x52,0x59,0x22,0x0e,0x1c,0x1c,0x2e,0x52,0x59,0x1c,0x13,0x1b,0x03,0x06,0x00,0x42,0x00,0x12,0x52,0x59,0x00,0x06,0x06,0x0c,0x52,0x59,0x06,0x04,0x1a,0x18,0x1a,0x18,0x3d,0x03,0x37,0xbd,0x43,0x10,0x0d,0x06,0x4d,0x43,0xb8,0xff,0xf4,0x40,0x0a,0x0b,0x06,0x4d,0x43,0x49,0xc8,0x1f,0x3d,0x01,0x3d,0xb8,0xff,0xf4, -0xb3,0x0d,0x06,0x4d,0x3d,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x3d,0xb8,0xff,0xee,0x40,0x0e,0x0b,0x06,0x4d,0x3d,0x3d,0x03,0x1f,0xbd,0x2b,0x10,0x0d,0x06,0x4d,0x2b,0xb8,0xff,0xf4,0xb6,0x0b,0x06,0x4d,0x2b,0x31,0xc2,0x25,0xb8,0xff,0xe0,0x40,0x14,0x0d,0x06,0x4d,0x25,0x1c,0x0c,0x06,0x4d,0x25,0x07,0x0b,0x06,0x4d,0x25,0x25,0x4d, -0x03,0x09,0xbd,0x15,0xb8,0xff,0xec,0x40,0x16,0x0d,0x06,0x4d,0x15,0x0c,0x0b,0x06,0x4d,0x15,0x0f,0xc8,0x03,0x1c,0x0d,0x06,0x4d,0x03,0x1c,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x39,0x2f,0x2b, -0x2b,0x2b,0x5d,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x10,0x18,0xc4,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x18,0x2f,0x3f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06, -0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x94,0x94, -0xb0,0xba,0x9e,0x99,0xa9,0xbd,0x8b,0x5f,0x6e,0x6c,0x5d,0x5e,0x6a,0x69,0x03,0x59,0xfc,0x66,0x8f,0x03,0x99,0x03,0x42,0x94,0xb0,0xbd,0x9b,0x99,0xa9,0xbc,0x8c,0x60,0x6c,0x6b,0x5d,0x5f,0x6a,0x6a,0xfc,0x79,0x94,0xb0,0xbc,0x9c,0x98,0xaa,0xbd,0x8b,0x60,0x6d,0x6c,0x5d,0x5e,0x6a,0x69,0x02,0xcb,0xc3,0xa3,0xb2,0xcd,0xbe,0xac,0xac, -0xcf,0x02,0x77,0x8d,0x7b,0x79,0x87,0x8c,0x7c,0x79,0x87,0x58,0xfa,0x5c,0x05,0xa4,0xfa,0x50,0xc4,0xa2,0xb1,0xd0,0xbf,0xae,0xab,0xcf,0x02,0x76,0x8d,0x7b,0x78,0x86,0x8d,0x7b,0x79,0x85,0xfd,0x8a,0xc4,0xa2,0xb2,0xcf,0xc0,0xad,0xab,0xcf,0x02,0x76,0x8c,0x7c,0x77,0x87,0x8d,0x7b,0x7a,0x84,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12, -0x07,0x69,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x0f,0x01,0x5b,0x00,0x16,0xb9,0x00,0x02,0xff,0xf1,0x40,0x09,0x12,0x12,0x0c,0x0b,0x25,0x02,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x6b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xab,0x01,0x5d, -0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0e,0x0e,0x02,0x03,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x66,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x57,0x01,0x5c,0x00,0x16,0xb9,0x00,0x02,0xff,0xfa,0x40,0x09,0x11,0x13,0x06,0x07,0x25,0x02,0x12, -0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe3,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x8b,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x21,0x0f,0x02,0x03,0x3e,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00, -0x03,0xb4,0x07,0x66,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xe8,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe9,0x40,0x09,0x0f,0x0d,0x02,0x03,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x78,0x00,0x00,0x01,0xfd,0x07,0x66,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xf1, -0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,0x02,0x30,0x07,0x6b,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xa0,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x06,0x08,0x04,0x02,0x03,0x25,0x01,0x08,0x05,0x26,0x00, -0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x1b,0x00,0x00,0x01,0xa0, -0x07,0x66,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x43,0xff,0xc9,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x05,0x04,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xf8,0x01,0x5c,0x00,0x13, -0x40,0x0b,0x02,0x1e,0x19,0x1b,0x0c,0x06,0x3e,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x6a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x97,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x05,0x1a,0x1a,0x03,0x09,0x25,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b, -0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x99,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x2c,0x19,0x18,0x03,0x09,0x25,0x02,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x65,0x02,0x26,0x00,0x38,0x00,0x00, -0x01,0x07,0x00,0x8e,0x01,0xb4,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x2b,0x0f,0x11,0x05,0x0d,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x6b,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x4b,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x10,0x05,0x0d, -0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x66,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x67,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xd1,0x40,0x09,0x11,0x0f,0x05,0x0d,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0xa6, -0x00,0x00,0x01,0x4a,0x04,0x00,0x00,0x03,0x00,0x31,0x40,0x16,0x03,0x0f,0x00,0x15,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xfe,0xb6,0x0c,0x06,0x4d,0x01,0x01,0x05,0x04,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x21,0x23,0x11,0x33,0x01, -0x4a,0xa4,0xa4,0x04,0x00,0x00,0x00,0x01,0x00,0x5c,0x04,0xc2,0x02,0x90,0x06,0x0e,0x00,0x06,0x00,0x1c,0xb3,0x00,0x00,0x08,0x04,0xb8,0xff,0xc0,0xb6,0x10,0x00,0x4d,0x04,0x05,0x80,0x03,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x2b,0x12,0x39,0x2f,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x02,0x90,0x7a,0xa4,0xa5,0x71,0xd7,0x85,0x04, -0xc2,0xe6,0xe6,0x01,0x4c,0x00,0x00,0x01,0x00,0x23,0x04,0xb2,0x02,0xa4,0x05,0xb2,0x00,0x13,0x00,0x50,0x40,0x0f,0x0a,0x0c,0x01,0x03,0x00,0x02,0x01,0x10,0x05,0x0c,0x40,0x0c,0x00,0x4d,0x02,0xb8,0xff,0xc0,0x40,0x1b,0x0c,0x00,0x4d,0x13,0xc4,0x00,0x00,0x15,0x09,0xc4,0x40,0x0a,0x13,0x0d,0x0d,0x07,0xda,0x59,0x0d,0x11,0x40,0x03, -0x11,0xda,0x59,0x09,0x03,0x00,0x2f,0xc6,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x18,0x10,0xc6,0x01,0x2f,0x1a,0xe9,0x12,0x39,0x2f,0xe9,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x5f,0x5d,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a, -0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x00,0x00,0x01,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x05,0x2f,0x00,0x03,0x00,0x11,0xb6,0x00,0x01,0x01,0x02,0xe2,0x59,0x01,0x00,0x2f,0x2b,0x01,0x18,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x04, -0xc2,0x6d,0x00,0x01,0x00,0x25,0x04,0xc2,0x02,0x4a,0x05,0xbe,0x00,0x0c,0x00,0x2f,0x40,0x17,0x0c,0xc4,0x0f,0x00,0x01,0x0b,0x03,0x00,0x00,0x0e,0x07,0xc4,0x40,0x06,0x0c,0x06,0x03,0x80,0x03,0x09,0xdb,0x59,0x03,0x00,0x2f,0x2b,0x00,0x1a,0x18,0x10,0xdc,0xc4,0x01,0x2f,0x1a,0xe9,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0xe9,0x31,0x30,0x01, -0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x02,0x4a,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0c,0xa0,0x44,0x61,0x0a,0x05,0xbe,0x71,0x8b,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0x00,0x6c,0x04,0xc2,0x01,0x31,0x05,0x85,0x00,0x0b,0x00,0x12,0xb7,0x09,0xc0,0x03,0x00,0x06,0xc1,0x5b,0x00,0x00,0x2f,0x2b,0x01,0x18, -0x2f,0xe1,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xcf,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x04,0xc2,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x00,0x02,0x00,0x52,0x04,0x98,0x01,0xee,0x06,0x1c,0x00,0x0b,0x00,0x16,0x00,0x4f,0x40,0x31,0x04,0x0b,0x01,0x04,0x07,0x01,0x0b,0x05,0x01,0x0b,0x01,0x01, -0x10,0x14,0xc4,0x40,0x00,0x09,0x50,0x09,0xa0,0x09,0xb0,0x09,0x04,0x1c,0x03,0x09,0xc0,0x0f,0xc4,0x40,0x03,0x06,0x0c,0xc5,0x59,0x06,0x40,0x09,0x0d,0x48,0x06,0x00,0x00,0x11,0xc5,0x59,0x00,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x01,0x18,0x2f,0x1a,0xe9,0x1a,0xdc,0x5f,0x5e,0x5d,0x1a,0xe9,0x31,0x30,0x5e,0x5d,0x5d,0x5d, -0x5d,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x1c,0x57,0x73,0x76,0x5b,0x59,0x72,0x7a,0x58,0x30,0x40,0x70,0x32,0x42,0x42,0x04,0x98,0x69,0x55,0x5a,0x6c,0x6c,0x54,0x54,0x70,0x01,0x33,0x41,0x30,0x70,0x40,0x30,0x31,0x40,0x00,0x00,0x01,0x00,0x33, -0xfe,0x50,0x01,0x87,0x00,0x00,0x00,0x12,0x00,0x5d,0x40,0x0c,0x03,0x12,0x01,0x03,0x00,0x01,0x01,0x10,0x05,0x09,0xc2,0x00,0xb8,0xff,0xc0,0x40,0x0d,0x0b,0x0f,0x48,0x00,0x10,0x05,0x40,0x0d,0x02,0x07,0xc5,0x59,0x02,0xb8,0xff,0xc0,0x40,0x1a,0x09,0x0f,0x48,0x02,0x10,0x0f,0x0b,0x1f,0x0b,0x2f,0x0b,0x03,0x09,0x03,0x10,0x0b,0xc3, -0x59,0x10,0x40,0x0a,0x0e,0x48,0x10,0x0e,0x12,0x00,0x3f,0xc5,0x2b,0x2b,0x00,0x5f,0x5e,0x5d,0x18,0x10,0xc4,0x2b,0x2b,0x01,0x18,0x2f,0x1a,0xce,0xcd,0xd4,0x2b,0xe1,0x30,0x31,0x5f,0x5e,0x5d,0x5f,0x5d,0x01,0x14,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x33,0x15,0x32,0x16,0x01,0x87,0xfe,0xed,0x26,0x1b, -0x2b,0x1b,0x8d,0x81,0x0a,0x1f,0x6c,0x58,0x67,0xff,0x00,0xb0,0x02,0x5a,0x06,0x5a,0x4e,0x04,0xb6,0x68,0x50,0x00,0x00,0x02,0x00,0x40,0x04,0xc2,0x02,0x87,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x4d,0x40,0x30,0x00,0x0e,0x02,0x28,0x0d,0x06,0x4d,0x02,0x18,0x0c,0x06,0x4d,0x02,0x18,0x0b,0x06,0x4d,0x02,0x30,0x0a,0x06,0x4d,0x02,0x30, -0x09,0x06,0x4d,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x70,0x06,0x01,0x06,0x03,0x02,0x07,0x80,0x06,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0x5d,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0xe9,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x87,0xf5,0x61,0xd1, -0x72,0xf0,0x60,0xce,0x06,0x00,0xfe,0xc2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x01,0x00,0x3e,0xfe,0x70,0x01,0x52,0x00,0x00,0x00,0x0e,0x00,0x24,0x40,0x12,0x0f,0x0b,0x01,0x10,0x04,0x00,0x06,0x06,0x02,0xc2,0x0c,0x09,0x04,0xe2,0x59,0x09,0x0e,0x12,0x00,0x3f,0x2f,0x2b,0x01,0x18,0x2f,0xf1,0xc2,0x2f,0xc6,0x31,0x30,0x5f,0x5e,0x5d, -0x21,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x52,0x96,0x44,0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x9d,0x8d,0x52,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x7a,0x80,0x00,0x01,0x00,0x66,0x04,0xc2,0x02,0x98,0x06,0x0c,0x00,0x06,0x00,0x1c,0xb3,0x00,0x00,0x08,0x03,0xb8,0xff,0xc0,0xb6,0x10,0x00,0x4d,0x03,0x03, -0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x2b,0x11,0x39,0x2f,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x02,0x98,0xd6,0x84,0xd8,0x73,0xa4,0xa4,0x06,0x0c,0xfe,0xb6,0x01,0x4a,0xe5,0xe5,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x0d,0x00,0xc5,0x40,0x16,0x0f,0x0a,0x01,0x00,0x04,0x01,0x10,0x05,0x0b,0x02, -0x03,0x0a,0x03,0x08,0x05,0x04,0x09,0x04,0x0a,0x0a,0x0c,0x00,0xb8,0xff,0xf0,0xb3,0x10,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x00,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x00,0xb8,0xff,0xc0,0x40, -0x1b,0x0a,0x1f,0x48,0x00,0x00,0x0f,0x03,0x08,0x05,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x7e,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf2,0x40,0x19,0x0c,0x06,0x4d,0x01,0x06,0x0b,0x06,0x4d,0x01,0x04,0x03,0x0a,0x09,0x03,0x09,0x03,0x00,0x06,0x03,0x00,0x0d,0x91,0x59, -0x00,0x12,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x31,0x30,0x10,0x87,0x04,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x21,0x11,0x07,0x35,0x37,0x11, -0x33,0x11,0x25,0x15,0x05,0x11,0x21,0x03,0xa4,0xfd,0x18,0x9b,0x9b,0xa8,0x01,0x48,0xfe,0xb8,0x02,0x40,0x02,0x23,0x61,0x98,0x60,0x02,0xe0,0xfd,0x89,0xcb,0x9a,0xc8,0xfe,0x0c,0x00,0x01,0x00,0x16,0x00,0x00,0x02,0x12,0x05,0xec,0x00,0x0b,0x00,0x62,0x40,0x3c,0x0a,0x07,0x06,0x0b,0x06,0x04,0x01,0x05,0x00,0x00,0x00,0x02,0x05,0x0a, -0x07,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x84,0x70,0x03,0x01,0x03,0x08,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x06,0x05,0x00,0x0b,0x0b,0x05,0x02,0x09,0x00,0x02,0x15,0x40,0x0d,0x01,0x5d,0x00,0x3f,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b, -0x2b,0x2b,0x39,0x39,0xc6,0x10,0xc2,0x2f,0x31,0x30,0x87,0x04,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x02,0x12,0xae,0xa4,0xaa,0xaa,0xa4,0xae,0x03,0x2b,0x7b,0xfd,0x50,0x02,0x42,0x77,0x9d,0x77,0x03,0x0d,0xfd,0x62,0x7a,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a, -0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xa2,0x01,0x5e,0x00,0x14,0xb4,0x01,0x38,0x05,0x26,0x01,0xb8,0xff,0xf4,0xb4,0x39,0x36,0x13,0x2c,0x25,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0c,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x06,0x00,0xe0,0x12,0x00,0x00,0x14,0xb4,0x01,0x31,0x11, -0x26,0x01,0xb8,0xff,0xec,0xb4,0x32,0x2f,0x0f,0x16,0x25,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x67,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xec,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x05,0x0f,0x0f,0x08,0x09,0x25,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0c,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x06,0x00,0xe0,0x76,0x00,0x00,0x13,0x40,0x0b,0x01,0x0e,0x0f,0x0f,0x08,0x09,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x0f,0x01,0x00,0x04,0xca, -0x05,0x00,0x0e,0x40,0x03,0x04,0x07,0x42,0x07,0x04,0x1c,0x00,0x3f,0xcd,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x01,0x2f,0xe1,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x33,0x11,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0x94,0x94,0x02,0xcb,0x03,0x53,0xf8,0x00,0x03,0x54,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x0b,0x00,0x17, -0x00,0xaa,0x40,0x38,0x00,0x07,0x01,0x00,0x07,0x01,0x10,0x05,0x10,0x0d,0x01,0x04,0x04,0x01,0x91,0x59,0x04,0x05,0x00,0x04,0x91,0x2b,0x30,0x05,0x0c,0x91,0x59,0x05,0x03,0x00,0x11,0x91,0x59,0x00,0x12,0x0f,0x0f,0x00,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7d,0x15,0xb8,0xff,0xf0,0xb3, -0x0d,0x06,0x4d,0x15,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xea,0x40,0x1b,0x0b,0x06,0x4d,0x15,0x15,0x19,0x02,0x0d,0x04,0x11,0x06,0x0d,0x06,0x4d,0x11,0x06,0x0c,0x06,0x4d,0x11,0x06,0x0b,0x06,0x4d,0x11,0x7e,0x00,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1, -0x2b,0x2b,0x2b,0x39,0x39,0xce,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x21,0x15,0x21,0x11,0x33,0x20, -0x00,0x11,0x10,0x21,0xbc,0xa0,0xa0,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0x01,0x50,0xfe,0xb0,0xd6,0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x02,0x81,0x9b,0x02,0x7e,0xfd,0x45,0xfe,0xb2,0xfe,0x6f,0x05,0x02,0xfe,0x1a,0x9b,0xfe,0x17,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x00,0x02,0x00,0x60,0xff,0xea,0x04,0x18,0x05,0xf4,0x00,0x1a, -0x00,0x25,0x00,0xfa,0x40,0x17,0x00,0x0e,0x01,0x10,0x06,0x0b,0x0b,0x0a,0x06,0x06,0x07,0x05,0x0c,0x05,0x0e,0x0e,0x0f,0x03,0x03,0x02,0x04,0x0d,0x06,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x03,0xb8,0xff,0xc0,0xb3,0x0b,0x06,0x4d,0x03,0xb8,0xff,0xc0,0xb3,0x0a,0x06,0x4d,0x03,0xb8,0xff,0xc0,0x40,0x46,0x09,0x06,0x4d,0x05,0x04,0x30, -0x09,0x12,0x48,0x04,0x04,0x19,0x0d,0x0c,0x09,0x00,0x01,0x1b,0x19,0x1b,0x95,0x59,0x19,0x10,0x13,0x21,0x95,0x59,0x13,0x16,0x0e,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0d,0x06,0x4d,0x0d,0x0d,0x10,0x05,0x01,0x24,0x0f,0x08,0x01,0x08,0x08,0x16,0x10,0x04,0x0d,0x06,0x4d,0x10,0x04,0x0c,0x06,0x4d,0x10,0x04,0x0b,0x06,0x4d,0x10,0x83,0x24, -0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xe3,0x40,0x2a,0x0b,0x06,0x4d,0x24,0x24,0x27,0x1e,0x0a,0x0d,0x06,0x4d,0x1e,0x0a,0x0c,0x06,0x4d,0x1e,0x0a,0x0b,0x06,0x4d,0x1e,0x83,0x16,0x10,0x0d,0x06,0x4d,0x16,0x0c,0x0c,0x06,0x4d,0x16,0x15,0x0b,0x06,0x4d,0x16,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b, -0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x12,0x39,0xc6,0x11,0x39,0x2f,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0xc6,0x32,0x12,0x39,0x2f,0x2b,0x33,0x01,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x5f,0x5e,0x5d,0x01,0x37, -0x26,0x27,0x05,0x27,0x25,0x26,0x27,0x33,0x16,0x17,0x25,0x17,0x05,0x00,0x11,0x14,0x00,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x07,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x12,0x04,0x5a,0x6c,0xfe,0xd5,0x33,0x01,0x0e,0x76,0x92,0xdd,0x4b,0x61,0x01,0x21,0x37,0xfe,0xf8,0x01,0x47,0xfe,0xfe,0xde,0xde,0xfa,0x01, -0x04,0xdc,0x7b,0x75,0x94,0xaa,0xa6,0x94,0x8b,0xa3,0x03,0xc8,0x03,0xa2,0x68,0x97,0x62,0x83,0x69,0x60,0x34,0x54,0x90,0x5e,0x82,0xfe,0xcd,0xfe,0x2d,0xf0,0xfe,0xcc,0x01,0x18,0xf2,0xf3,0x01,0x2f,0x88,0xd9,0xbb,0xb5,0xd3,0xd8,0xb4,0x01,0x90,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x66,0x02,0x26,0x00,0x3c,0x00,0x00, -0x01,0x07,0x00,0x8e,0x01,0x33,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x30,0x0f,0x11,0x05,0x00,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0a,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xee,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x33,0x16,0x18,0x0c,0x00, -0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x7b,0x40,0x20,0x00,0x08,0x01,0x10,0x06,0x05,0x0d,0x91,0x59,0x00,0x05,0x10,0x05,0x02,0x0c,0x03,0x05,0x0c,0x0e,0x91,0x59,0x0c,0x05,0x0c,0x03,0x02,0x12,0x03,0x03,0x09,0x7d,0x12,0xb8,0xff, -0xf0,0x40,0x1a,0x0d,0x06,0x4d,0x12,0x12,0x16,0x05,0x0e,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x02,0x04,0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f, -0x2b,0xe9,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2b,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x01,0x11,0x23,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xa8,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xad,0xb8,0xfe,0xb0,0x01,0x3e,0xfe,0xc2, -0x05,0x9a,0xe2,0xdf,0xcd,0xcc,0xfe,0xfe,0x02,0xe3,0xfd,0xb4,0x9c,0x91,0x01,0x1f,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10,0x06,0x03,0x1b,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x04,0x00,0x06,0x1b,0x09,0x1b,0x95,0x59,0x09,0x10,0x0c,0x06,0x0d,0x06,0x4d, -0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18,0x18,0x1f,0x06,0x12,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40, -0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23, -0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x70,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x07,0xc3,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02, -0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x00,0x01,0x00,0xe8,0x02,0x12,0x04,0x94,0x02,0x98,0x00,0x03,0x00,0x30,0x40,0x0b,0x02,0x01,0xbe,0x59,0x0f,0x02,0x01,0x0d,0x03,0x02,0x00,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x04,0x05,0x01,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x2b,0x00, -0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0x02,0x12,0x86,0x00,0x00,0x01,0x01,0x0c,0x00,0xa4,0x04,0x6e,0x04,0x06,0x00,0x0b,0x00,0x1d,0xb6,0x0b,0x4f,0x05,0x01,0x05,0x02,0x08,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x08,0x19,0x2f,0x2b,0x18,0xc4,0x00,0x19,0x2f,0x5d,0x18,0xc4,0x31, -0x30,0x01,0x07,0x01,0x01,0x27,0x01,0x01,0x37,0x01,0x01,0x17,0x01,0x04,0x6e,0x5e,0xfe,0xac,0xfe,0xae,0x5e,0x01,0x54,0xfe,0xac,0x5e,0x01,0x52,0x01,0x54,0x5e,0xfe,0xac,0x01,0x02,0x5e,0x01,0x54,0xfe,0xac,0x5e,0x01,0x52,0x01,0x54,0x5e,0xfe,0xac,0x01,0x54,0x5e,0xfe,0xac,0x00,0x00,0x01,0x00,0x50,0x02,0x48,0x01,0xc2,0x05,0xb0, -0x00,0x0c,0x00,0x17,0x40,0x0a,0x0c,0xcc,0x04,0x00,0x0c,0x28,0x05,0x04,0x0b,0x27,0x00,0x3f,0xdd,0xcd,0x3f,0x01,0x2f,0xce,0xed,0x30,0x31,0x01,0x11,0x06,0x06,0x07,0x35,0x3e,0x03,0x37,0x33,0x11,0x01,0x40,0x39,0x78,0x3f,0x26,0x46,0x48,0x4c,0x2c,0x46,0x02,0x48,0x02,0xc2,0x2e,0x47,0x1b,0x87,0x0d,0x22,0x2b,0x35,0x20,0xfc,0x98, -0x00,0x01,0x00,0x68,0x02,0x48,0x02,0x92,0x05,0xae,0x00,0x1f,0x00,0x3c,0x40,0x24,0x1f,0x16,0xcc,0x09,0x09,0x21,0x1d,0xcc,0x0e,0x02,0x0f,0x0e,0x2b,0x1d,0x3b,0x1d,0x4b,0x1d,0x9b,0x1d,0xab,0x1d,0xbb,0x1d,0x06,0x1d,0x09,0x01,0x0c,0xe6,0x11,0x27,0x1f,0xe6,0x01,0x28,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x5d,0xcc,0x32,0x01, -0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x01,0x21,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x15,0x15,0x21,0x02,0x92,0xfd,0xd6,0x3b,0x59,0x68,0x59,0x3b,0x4b,0x3f,0x77,0x61,0x53,0x98,0x38,0x5e,0x44,0x26,0x39,0x56,0x64,0x56,0x39,0x01,0x93,0x02,0x48,0x52, -0x3d,0x61,0x54,0x4b,0x50,0x5a,0x38,0x3a,0x40,0x66,0x95,0x4c,0x22,0x3f,0x58,0x37,0x4a,0x73,0x5c,0x48,0x3d,0x37,0x1c,0x0b,0x00,0x01,0x00,0x81,0x02,0x33,0x02,0x8e,0x05,0xae,0x00,0x20,0x00,0x61,0x40,0x35,0x00,0x16,0x01,0x10,0x05,0x19,0x09,0x0a,0x0a,0x09,0xe6,0x59,0x0a,0x0a,0x03,0x14,0x0f,0x11,0x1f,0x11,0x02,0x0f,0x03,0x11, -0x0f,0x14,0x0f,0xe6,0x59,0x14,0x27,0x01,0x03,0x1f,0x03,0xe6,0x59,0x1f,0x29,0x19,0x0a,0x0d,0xcd,0x17,0x17,0x1c,0xcc,0x06,0x06,0x22,0x0a,0x11,0x00,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12, -0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x81,0x67,0x72,0x50,0x5c,0xdb,0x54,0x50,0xc5,0x90,0x5e,0x5c,0x57,0x7e,0x71,0x86,0x91,0xb1,0xaa,0x8e,0x89,0x02,0x68,0x8e, -0x4c,0x4b,0x40,0x8d,0x76,0x86,0x77,0x45,0x8b,0x33,0x77,0x60,0x97,0x36,0x04,0x2a,0xa0,0x75,0x94,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x06,0xd4,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x00,0xf1,0x04,0x42,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x11,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff, -0x00,0x50,0x00,0x00,0x06,0xaa,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x38,0x04,0x00,0xfd,0xb8,0x00,0x09,0xb3,0x03,0x02,0x14,0x2c,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x81,0x00,0x00,0x06,0xeb,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x06, -0x00,0x00,0x01,0x07,0x02,0x38,0x04,0x41,0xfd,0xb8,0x00,0x09,0xb3,0x03,0x02,0x28,0x2c,0x00,0x3f,0x35,0x35,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x03,0x94,0x05,0x9a,0x00,0x11,0x00,0x80,0x40,0x3e,0x10,0x01,0x04,0x07,0x07,0x04,0x91,0x59,0x07,0x07,0x0c,0x02,0x0c,0x0f,0x91,0x59,0x0c,0x09,0x02,0x0c,0x91,0x2b,0x30,0x09,0x0a,0x91, -0x59,0x09,0x03,0x02,0x12,0x0d,0x0d,0x09,0x09,0x13,0x03,0x00,0x00,0x07,0x0c,0x10,0x03,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x05,0x03,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf6,0x40,0x09,0x0c,0x06,0x4d,0x03,0x0a,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xce,0xf1, -0x2b,0x2b,0x2b,0x17,0x39,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x58,0xf4,0xa8,0xa0,0xa0,0x02,0xd8,0xfd,0xd0, -0x02,0x06,0xfd,0xfa,0xf4,0x01,0x16,0xfe,0xea,0x01,0x16,0x9c,0x03,0xe8,0x98,0xfe,0x10,0x97,0xc9,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x19,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xe2,0x01,0x5b,0x00,0x16,0xb9,0x00,0x01,0xff,0xda,0x40,0x09,0x1d,0x23,0x0d,0x08,0x25,0x01,0x1d,0x05,0x26,0x00,0x2b, -0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0xbe,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x1a,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x17,0x2c,0x26,0x20,0x17,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xad,0x00,0x00,0x01,0x72,0x06,0xe2,0x02,0x26,0x00,0x2c, -0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x41,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x0d,0x02,0x03,0x25,0x01,0x04,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xfe,0x50,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x76,0x00,0x00,0xff,0xff,0x00,0x68,0xfe,0x50,0x03,0x0f, -0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x03,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x66,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xd5,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x3e,0x17,0x19,0x10,0x0b,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0a,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x23,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x24,0x17,0x19,0x10,0x0a,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x68,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xe0, -0x01,0x86,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x36,0x1b,0x1b,0x10,0x0b,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0c,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc2,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0a,0x1b,0x1b,0x10,0x0b,0x25,0x01,0x18,0x11, -0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x98,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0xcb,0x40,0x55,0x0f,0x06,0x01,0x10,0x05,0x24,0x18,0x0c,0x00,0x4d,0x18,0x15,0x0f,0x12,0x12,0x0f,0x96,0x59,0x0f,0x12,0x1f,0x12,0x2f,0x12,0x03,0x09,0x03,0x12,0x12,0x0b,0x14,0x00,0x0d,0x1d,0x0b,0x1d,0x95,0x59, -0x0b,0x10,0x02,0x23,0x05,0x23,0x95,0x59,0x05,0x16,0x00,0x15,0x10,0x10,0x01,0x08,0x17,0x17,0x0f,0x12,0x15,0x18,0x19,0x05,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01, -0x01,0x27,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d,0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x08,0x10,0x0d,0x06,0x4d,0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0x17,0x39,0xca,0x2f,0x11,0x12,0x39, -0x2f,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x26, -0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd0,0x63,0x04,0xfe,0xb5,0x01,0x4b,0xa4,0x88,0x88,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x88,0xac,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x01,0x40,0x86,0xb4,0xb4,0x86,0xfd,0x1d,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6, -0x00,0x01,0x00,0x00,0x05,0x74,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x10,0xb7,0x02,0x01,0xd9,0x59,0x02,0x00,0x00,0x01,0x2f,0x2f,0x00,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0xff,0xff,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x02,0x06,0x00,0xc3,0x00,0x00,0xff,0xff,0x00,0x16, -0x00,0x00,0x05,0x12,0x07,0x1b,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x5a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xfb,0x40,0x09,0x13,0x19,0x06,0x07,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xda, -0x00,0xdb,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf2,0x40,0x09,0x26,0x20,0x10,0x14,0x25,0x02,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0xfe,0x70,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x07,0x00,0xdf,0x03,0x79,0x00,0x00,0xff,0xff,0x00,0x5a,0xfe,0x70,0x03,0x83,0x04,0x18,0x02,0x26, -0x00,0x44,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x00,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x07,0x68,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x2a,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x04,0x13,0x10,0x01,0x0d,0x25,0x02,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8, -0x05,0xb3,0x05,0xec,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x01,0x9c,0x03,0xb7,0x06,0x63,0x00,0x12,0x40,0x0a,0x02,0x21,0x00,0x02,0x82,0x20,0x20,0x10,0x10,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0xe8,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x70,0x03,0xb4,0x05,0x9a, -0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x0f,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x70,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xa1,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x68,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xb1,0x01,0x5c,0x00,0x16, -0xb9,0x00,0x01,0xff,0xf8,0x40,0x09,0x0f,0x0c,0x02,0x0b,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0c,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xb4,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1c,0x1b,0x16,0x0f,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35, -0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x07,0x66,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x4c,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x11,0x08,0x06,0x03,0x05,0x3e,0x01,0x08,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x8e,0x00,0x00,0x02,0x13,0x07,0xbb,0x02,0x26,0x00,0x4f, -0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0x07,0x01,0xb1,0x00,0x16,0xb9,0x00,0x01,0xff,0xd5,0x40,0x09,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x01,0x9c,0x01,0x8d,0x06,0x11,0x00,0x14,0xb3,0x01,0x09,0x03, -0x01,0xb8,0xff,0xe5,0xb4,0x06,0x06,0x05,0x05,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xc3,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xc7,0x06,0x5d,0x00,0x12,0x40,0x0a,0x01,0x07,0x00,0x01,0x58,0x06,0x06,0x03,0x03,0x25,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0xbc, -0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x11,0xfd,0xd8,0x00,0x0e,0xb9,0x00,0x01,0xff,0x9e,0xb4,0x0f,0x0f,0x05,0x05,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0x87,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x56,0xfd,0xd8,0x00,0x0b,0xb6,0x01, -0x78,0x07,0x07,0x00,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x66,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xe2,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x15,0x17,0x0b,0x12,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8, -0x06,0x0a,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x38,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xec,0x40,0x09,0x14,0x16,0x04,0x0f,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x68,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x7e,0x01,0x5c, -0x00,0x16,0xb9,0x00,0x01,0xff,0xe4,0x40,0x09,0x19,0x19,0x0b,0x12,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0c,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xda,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x08,0x18,0x18,0x0b,0x02,0x25,0x01,0x15,0x11,0x26,0x00, -0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x5e,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0xe1,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfc,0x40,0x0a,0x1a,0x1a,0x06,0x06,0x25,0x03,0x02,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8, -0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x3f,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x06,0x1a,0x1a,0x06,0x06,0x25,0x03,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x07,0x66,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0x8e, -0x01,0x5f,0x01,0x5c,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xbc,0x06,0x0a,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xa4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x20,0x13,0x12,0x09,0x09,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc, -0x00,0x00,0x04,0xc0,0x07,0x68,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xe3,0x01,0x5c,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x97,0x00,0x00,0x02,0xc9,0x06,0x0c,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x06,0x00,0xe0,0x31,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x13,0x12,0x08,0x10,0x25,0x01, -0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x65,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x29,0x01,0x5b,0x00,0x08,0xb3,0x01,0x38,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0a,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x00,0x8e, -0x00,0xbe,0x00,0x00,0x00,0x08,0xb3,0x01,0x31,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x29,0xfe,0x50,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xdd,0x01,0x75,0x00,0x00,0x00,0x0b,0xb6,0x01,0x16,0x16,0x0c,0x06,0x4d,0x16,0x11,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x50,0x02,0x9a,0x05,0x2f,0x02,0x26, -0x00,0x57,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x13,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x07,0x68,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0x9d,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x03,0x0a,0x09,0x04,0x01,0x3e,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x2b,0xff,0xea, -0x03,0xd3,0x05,0x72,0x00,0x14,0x00,0x18,0x00,0x71,0x40,0x31,0x18,0x80,0x17,0x07,0x14,0x14,0x12,0x95,0x02,0x16,0x0a,0x0a,0x0e,0x0b,0x06,0x95,0x40,0x07,0x0f,0x15,0x80,0x17,0x0c,0x00,0x00,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x84,0x04,0xb8,0xff,0xe6, -0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xf2,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xd6,0x1a,0xcd,0x00,0x3f,0x1a,0xed,0x33,0x32,0x33,0x2f,0x3f,0xed,0x32,0x2f,0x10,0xd4,0x1a,0xcd,0x31,0x30,0x25,0x06,0x23,0x20,0x11, -0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x01,0x03,0x23,0x13,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3e,0x2d,0x01,0x52,0xa6,0x7b,0x75,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x04,0xdc,0xfe,0xfc,0x01, -0x04,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0xa3,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x8e,0x01,0x87,0x00,0x24,0xb1,0x02,0x01,0xb8,0xff,0xef,0x40,0x13,0x11,0x17,0x05,0x0d,0x25,0x02,0x01,0x00,0x0e,0x10,0x0e,0x20,0x0e,0x30,0x0e,0x04,0x0e,0x05,0x26,0x00,0x2b,0x5d,0x35,0x35,0x01,0x2b,0x35,0x35, -0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x1c,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x18,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x15,0x1b,0x08,0x11,0x25,0x02,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x5c,0x02,0x26,0x00,0x38, -0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x93,0x01,0x5c,0x00,0x45,0x40,0x12,0x01,0x10,0x0c,0x0d,0x06,0x4d,0x10,0x16,0x0c,0x06,0x4d,0x10,0x12,0x0b,0x06,0x4d,0x02,0x10,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x10,0xb8,0xff,0xf4,0x40,0x0e,0x0b,0x06,0x4d,0x05,0x10,0x10,0x05,0x0d,0x25,0x02,0x01, -0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x2b,0x2b,0x2b,0x35,0x2b,0x2b,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x05,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfd,0x40,0x0a,0x14,0x14,0x08,0x11,0x25,0x02,0x01,0x18,0x11,0x26,0x00,0x2b, -0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x67,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x58,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfa,0x40,0x09,0x0b,0x0b,0x08,0x09,0x3e,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0a, -0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xc7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x05,0x0b,0x0b,0x05,0x09,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x06,0xe1,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x83,0x01,0x5c,0x00,0x16,0xb9,0x00, -0x01,0xff,0xed,0x40,0x09,0x0d,0x13,0x08,0x09,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x05,0x85,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x17,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x0d,0x13,0x08,0x09,0x25,0x01,0x0a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b, -0x35,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x05,0x00,0x4c,0x40,0x20,0x02,0x12,0x05,0x00,0x91,0x59,0x05,0x03,0x70,0x00,0x01,0x00,0x00,0x07,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf2,0x40,0x09,0x0c, -0x06,0x4d,0x03,0x04,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0xa4,0xfd,0xc1,0xa9,0x02,0xe8,0x04,0xfe,0xfb,0x02,0x05,0x9a,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x1b, -0x00,0xb0,0x40,0x18,0x1a,0x19,0x91,0x59,0x1a,0x06,0x00,0x1a,0x91,0x2b,0x30,0x06,0x0c,0x91,0x59,0x06,0x04,0x00,0x12,0x91,0x59,0x00,0x13,0x18,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xd0,0xb3,0x0b,0x06,0x4d,0x19,0xb8,0xff,0xe8,0x40,0x1b,0x0b,0x06,0x4d,0x0f,0x15,0x19,0x18,0xff,0x3a,0x09,0x06,0x0d,0x06,0x4d,0x09, -0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7d,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xee,0xb6,0x0c,0x06,0x4d,0x30,0x15,0x01,0x15,0xb8,0xff,0xe0,0x40,0x27,0x0b,0x06,0x4d,0x15,0x15,0x1d,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x03,0x10,0x0d,0x06,0x4d, -0x03,0x10,0x0c,0x06,0x4d,0x03,0x18,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22, -0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x13,0x21,0x35,0x21,0x02,0xfe,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x29,0x01,0x6b,0xfe,0x8d,0xfe,0xd2,0xe1,0xfe,0xe7,0x01,0x12,0xdd,0xec,0x01,0x0f,0xfe,0xf9,0x1f,0xfd,0xe7,0x02,0x19,0x18,0x01,0x8f,0x01,0x45,0x01,0x57,0x01,0x9f,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe, -0x68,0x05,0x32,0xfe,0xba,0xfe,0xf8,0xfe,0xf6,0xfe,0xbd,0x01,0x34,0x01,0x16,0x01,0x18,0x01,0x39,0xfd,0x64,0x9c,0x00,0x03,0x00,0x60,0xff,0xf1,0x05,0xa7,0x05,0xa7,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0xf6,0x40,0x1a,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x91,0x59,0x1f,0x03,0x00,0x17,0x00,0x17,0x91,0x59,0x0e,0x00,0x0e,0x00,0x01,0x0d, -0x04,0x01,0x13,0x24,0xb8,0xff,0xe8,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1b,0x7e,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0x40,0x25,0x0c,0x06,0x4d,0x12,0x20, -0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x7e,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe8,0x40,0x1d,0x0b,0x06,0x4d,0x07,0x07,0x28,0x0b,0x0e,0x17,0x1f,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01, -0x7e,0x02,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xfd,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf8,0x40,0x0c,0x0b,0x06,0x4d,0x02,0x02,0x29,0x28,0x20,0x29,0x40,0x29,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b, -0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x25,0x15,0x23,0x35,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23, -0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x52,0x9c,0x2b,0xf9,0xfe,0xce,0x01,0x31,0xfc,0x29,0x9c,0x2a,0xfc,0x01,0x2f,0xfe,0xcc,0xf5,0x2c,0x2c,0xb6,0xcf,0xd3,0xb4,0xc6,0x29,0xb3,0xd6,0xcf,0xb8,0xba,0xc9,0xc9,0x01,0x3c,0xfc,0xf6,0x01,0x2a,0x95,0x95,0xfe,0xd5,0xf5,0xfd,0xfe,0xc5,0x03,0xca,0xfc,0xcc,0xdc,0xc4,0xb9,0xdb,0xfc,0xcc, -0x03,0x34,0xda,0xbb,0xc4,0xdb,0x00,0x02,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x04,0x18,0x00,0x19,0x00,0x26,0x01,0x02,0x40,0x0b,0x0d,0x14,0x01,0x10,0x04,0x25,0x10,0x10,0x00,0x4d,0x15,0xb8,0xff,0xf0,0xb3,0x10,0x00,0x4d,0x14,0xb8,0xff,0xd0,0xb3,0x10,0x00,0x4d,0x0e,0xb8,0xff,0xf0,0x40,0x0e,0x10,0x00,0x4d,0x08,0x10,0x10,0x00,0x4d, -0x03,0x28,0x10,0x00,0x4d,0x25,0xb8,0xff,0xe8,0x40,0x36,0x0b,0x0c,0x00,0x4c,0x1f,0x18,0x0b,0x0c,0x00,0x4c,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x10,0x18,0x0b,0x0c,0x00,0x4c,0x05,0x11,0x14,0x1a,0x04,0x07,0x0d,0x13,0x12,0x0f,0x0d,0x1d,0x95,0x59,0x0d,0x10,0x02,0x17,0xec,0x59,0x02,0x15,0x07,0x23,0xec,0x59,0x07,0x16,0x75,0x11,0x01, -0x1a,0xb8,0xff,0xe8,0xb4,0x09,0x15,0x01,0x4c,0x1a,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0x40,0x3d,0x0b,0x06,0x4d,0x14,0x11,0x0a,0x1a,0x05,0x00,0x1a,0x11,0x12,0x20,0x14,0x05,0x0a,0x12,0x83,0x13,0x70,0x00,0x01,0x00,0x00,0x28,0x20,0x08,0x0d,0x06,0x4d,0x20,0x08,0x0c,0x06,0x4d,0x20,0x08,0x0b,0x06,0x4d,0x20, -0x83,0x0a,0x10,0x0d,0x06,0x4d,0x0a,0x10,0x0c,0x06,0x4d,0x0a,0x10,0x0b,0x06,0x4d,0x2f,0x0a,0x01,0x0a,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0xd4,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x11,0x39,0x39,0x2b,0x2b,0x2b,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00, -0x18,0x3f,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x5f,0x5e,0x5d,0x25,0x06,0x23,0x22,0x03,0x23,0x02,0x21,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x16,0x17,0x33,0x13,0x33,0x03,0x16,0x16,0x33,0x32,0x37,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x04, -0xc5,0x35,0x2a,0x9a,0x36,0x04,0x94,0xfe,0xf6,0xba,0xe0,0x01,0x02,0xdc,0x7e,0xc6,0x33,0x04,0x55,0xac,0xc1,0x22,0x4c,0x3c,0x17,0x11,0xfe,0xa4,0x26,0x9c,0x6e,0x8e,0xa9,0x8f,0x79,0x6a,0xad,0x3a,0x05,0x0d,0x01,0x25,0xfe,0xcb,0x01,0x1f,0xdb,0xfa,0x01,0x3c,0x96,0x88,0x01,0x06,0xfe,0x0a,0xdb,0x9d,0x05,0x01,0x71,0xbe,0xca,0xf2, -0xb2,0x9e,0xd6,0xb5,0xb0,0x00,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x53,0x05,0xfe,0x00,0x1c,0x00,0x27,0x00,0xdf,0x40,0x0c,0x0d,0x27,0x01,0x0d,0x1e,0x01,0x02,0x00,0x01,0x10,0x04,0x19,0xb8,0xff,0xc0,0x40,0x0a,0x0b,0x0c,0x00,0x4c,0x17,0x30,0x0b,0x00,0x4d,0x00,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe0,0x40, -0x35,0x0c,0x00,0x4d,0x09,0x1b,0x22,0x1d,0x16,0x10,0x01,0x03,0x1b,0x03,0x95,0x59,0x1b,0x01,0x10,0x22,0x95,0x59,0x10,0x16,0x1d,0x16,0x25,0x18,0x01,0x01,0x0d,0x06,0x83,0x18,0x18,0x13,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x25,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x25,0xb8,0xff, -0xf0,0xb3,0x0c,0x06,0x4d,0x25,0xb8,0xff,0xe0,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x25,0x30,0x25,0x02,0x25,0x25,0x29,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x83,0x13,0x10,0x0d,0x06,0x4d,0x13,0x10,0x0c,0x06,0x4d,0x13,0x10,0x0b,0x06,0x4d,0x13,0x2f,0x29,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1, -0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x11,0x12,0x39,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x12,0x39,0x39,0x11,0x12,0x39,0x2b,0x31,0x30,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x01,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e, -0x02,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x03,0x04,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xe7,0xa8,0xac,0x64,0x79,0x68,0x78,0xa2,0xba,0x61,0xfe,0xe6,0xef,0xdb,0xfe,0xed,0xd4,0xcb,0xee,0xd0,0xb6,0xa4,0xbd,0xfe,0x92,0xb5,0x96,0x9d,0xba,0x8f,0x05,0xbe,0xb7,0x65,0x45, -0x3a,0x2f,0x69,0x49,0x63,0x9a,0xbf,0x6f,0xe9,0xfe,0xef,0x01,0x0b,0xd7,0x9b,0x01,0x02,0x58,0x93,0xa3,0x80,0x8a,0xfd,0x75,0x94,0xfe,0xeb,0x9d,0xb9,0xc0,0xa1,0x75,0xbf,0x00,0x00,0x01,0x00,0x52,0xff,0xe7,0x03,0x3b,0x04,0x19,0x00,0x25,0x00,0x9b,0x40,0x09,0x00,0x11,0x01,0x0f,0x00,0x01,0x10,0x04,0x0d,0xb8,0xff,0xe8,0x40,0x58, -0x0b,0x0c,0x00,0x4c,0x08,0x1e,0x19,0x19,0x1e,0xec,0x59,0x19,0x0f,0x02,0x19,0xec,0x0c,0x30,0x12,0x14,0x0f,0x14,0x95,0x59,0x0f,0x10,0x00,0x25,0x01,0x0e,0x03,0x25,0x23,0x02,0x23,0x95,0x59,0x02,0x16,0x08,0x0c,0x1b,0x12,0x00,0x00,0x27,0x05,0x16,0x83,0x0c,0x20,0x08,0x0d,0x06,0x4d,0x20,0x08,0x0c,0x06,0x4d,0x20,0x08,0x0b,0x06, -0x4d,0x20,0x83,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x10,0x0b,0x06,0x4d,0x2f,0x05,0x3f,0x05,0x02,0x05,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0xc4,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x00,0x18,0x2f,0x2b, -0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x26,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x3b,0x82,0xc3,0xc3,0xe1,0x8b,0x72,0x56,0x80,0xd5,0xb2,0x8f,0x7f,0x85, -0x93,0xd7,0xa2,0x7d,0x49,0x2d,0x49,0x43,0xfe,0xd0,0x8d,0x80,0xa7,0x8f,0x16,0x2f,0xa5,0x89,0x5d,0x88,0x15,0x04,0x12,0x81,0x53,0x88,0x98,0x2d,0xa5,0x47,0x93,0x4b,0x5c,0x04,0x92,0x04,0xb2,0x4b,0x5b,0x49,0x00,0x02,0x00,0x61,0xff,0xe8,0x04,0x82,0x04,0x00,0x00,0x0c,0x00,0x17,0x00,0x7b,0x40,0x22,0x01,0x0e,0x0b,0x0e,0x96,0x59, -0x0b,0x0f,0x06,0x13,0x95,0x59,0x06,0x16,0x00,0x00,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x83,0x16,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x16,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x16,0x16,0x19,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x83, -0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09,0x10,0x0b,0x06,0x4d,0x09,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xca,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x01,0x21,0x16,0x15,0x14,0x02,0x23,0x22,0x00,0x35,0x10,0x21,0x21, -0x05,0x23,0x20,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x82,0xff,0x00,0x8e,0xfc,0xd4,0xdb,0xfe,0xfc,0x02,0x09,0x02,0x18,0xfe,0x6c,0x76,0xfe,0x92,0xa9,0x8d,0x89,0x9f,0x03,0x7c,0xb6,0xdd,0xe3,0xfe,0xe2,0x01,0x1f,0xef,0x02,0x0a,0x84,0xfe,0x73,0xac,0xcf,0xd1,0xaf,0xdc,0x00,0x01,0x00,0x22,0xff,0xf4,0x03,0xc5,0x04,0x00, -0x00,0x13,0x00,0x7a,0x40,0x43,0x53,0x10,0x01,0x00,0x0f,0x01,0x0b,0x03,0x0f,0x0d,0x00,0x13,0x00,0x96,0x59,0x13,0x0f,0x06,0x04,0x09,0x04,0xec,0x59,0x09,0x30,0x00,0x70,0x00,0x02,0x00,0x00,0x15,0x02,0x0f,0x0f,0x0b,0x14,0x06,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x0b,0x08, -0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x0b,0x0b,0x15,0x14,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x5d,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x10,0x18,0xd4,0xc6,0x5f,0x5e,0x5d,0x31,0x30,0x5d,0x01,0x21, -0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x23,0x22,0x07,0x35,0x36,0x33,0x21,0x03,0xc5,0xfe,0x79,0x74,0x36,0x36,0x42,0x48,0xf9,0x8d,0x72,0x7a,0x4c,0xa4,0x02,0xb3,0x03,0x7c,0xfd,0x96,0x8e,0x14,0x8e,0x16,0x01,0x20,0x02,0x68,0x58,0x94,0x48,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x38,0x04,0x18,0x00,0x1b,0x00,0x25, -0x00,0xfe,0x40,0x0f,0x06,0x17,0x01,0x09,0x15,0x01,0x09,0x0e,0x01,0x0d,0x0c,0x01,0x10,0x03,0x1f,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x15,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x10,0xb8,0xff,0xc0,0x40,0x2a,0x0b,0x0c,0x00,0x4c,0x16,0x23,0x95,0x59,0x16,0x10,0x0d,0x0f,0x13,0x05,0x02,0x1c,0x02,0x1c,0x95,0x59,0x02,0x16, -0x03,0x1c,0x19,0x08,0x0d,0x06,0x4d,0x19,0x08,0x0c,0x06,0x4d,0x19,0x08,0x0b,0x06,0x4d,0x20,0x83,0x19,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0xff,0xe0,0x40,0x56,0x0b,0x06,0x4d,0x19,0x0e,0x02,0x05,0x0a,0x42,0x02,0x0d,0x01,0x0d,0x0d,0x05,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c, -0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x0f,0x83,0x50,0x0a,0x60,0x0a,0x02,0x0f,0x0a,0x01,0x0a,0x10,0x0d,0x06,0x4d,0x0a,0x10,0x0c,0x06,0x4d,0x0a,0x18,0x0b,0x06,0x4d,0x0a,0x0a,0x26,0x1c,0x13,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x10,0x0b,0x06,0x4d,0x02,0x84,0x05,0x05,0x27,0x26,0x2f,0x27,0x3f,0x27,0x02,0x5d, -0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0x5d,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x3f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d, -0x05,0x06,0x27,0x11,0x23,0x11,0x06,0x27,0x22,0x00,0x35,0x10,0x37,0x33,0x06,0x11,0x14,0x16,0x33,0x33,0x11,0x10,0x21,0x32,0x12,0x15,0x14,0x00,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x03,0x36,0x04,0x1e,0x94,0x18,0x04,0xec,0xfe,0xe8,0xd2,0xc2,0xec,0xbf,0x9b,0x1e,0x01,0x12,0xbc,0xea,0xfe,0xe7,0xfe,0xf5,0x22,0x98, -0xc2,0x93,0x67,0x82,0x18,0x04,0x04,0xfe,0x36,0x01,0xca,0x04,0x04,0x01,0x20,0xf6,0x01,0x3b,0xc7,0xd8,0xfe,0xd2,0xb8,0xce,0x02,0x95,0x01,0x0f,0xfe,0xd7,0xfb,0xe9,0xfe,0xdd,0x8c,0xd3,0xb5,0xb4,0xdc,0x81,0x00,0x02,0x00,0x00,0xfd,0xfe,0x03,0x52,0xff,0x62,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x1a,0x03,0x02,0xd9,0x59,0x0f,0x03, -0x01,0x0c,0x03,0x03,0x07,0x40,0x07,0x06,0xd9,0x59,0x1f,0x07,0x2f,0x07,0x02,0x07,0x07,0x03,0x04,0x00,0x2f,0x32,0x2f,0x33,0x00,0x2f,0x5d,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x11,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x03,0x52,0xfc,0xae,0x03,0x52,0xfe,0xeb,0x77,0x77,0xed,0x77,0x77,0xff,0xff,0x00,0xb4, -0xff,0xee,0x03,0x23,0x05,0x9a,0x00,0x26,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x04,0x01,0x91,0x00,0x00,0x00,0x01,0x00,0x6e,0x02,0xcd,0x02,0xc2,0x05,0xb0,0x00,0x12,0x00,0x2b,0x40,0x16,0x00,0x0b,0x24,0x04,0x0f,0x07,0x0f,0x52,0x59,0x07,0x04,0x03,0x03,0x0b,0xc2,0x0c,0x0c,0x14,0x04,0x00,0xc2,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f, -0xe1,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0xc4,0x31,0x30,0x13,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0xee,0x80,0x80,0x04,0x43,0x8f,0x78,0x86,0x82,0x97,0x4a,0x71,0x02,0xcd,0x02,0xcf,0x73,0x87,0x94,0x84,0xfe,0x35,0x01,0xc3,0xb0,0x79,0x55,0x00,0x00,0x04,0x00,0xbc, -0xff,0xe8,0x08,0xa0,0x05,0x9a,0x00,0x09,0x00,0x10,0x00,0x25,0x00,0x45,0x00,0xd6,0x40,0x1e,0x2b,0x41,0x30,0x3b,0x04,0x33,0x44,0x36,0x38,0x33,0x38,0x95,0x59,0x33,0x1c,0x1d,0x40,0x1a,0x17,0x20,0x1d,0x1d,0x20,0x95,0x59,0x1d,0x1d,0x03,0x13,0x27,0xb8,0xff,0xc0,0x40,0x3e,0x0b,0x0e,0x48,0x27,0x29,0x44,0x29,0x95,0x59,0x44,0x16, -0x25,0x23,0x13,0x23,0x95,0x59,0x13,0x16,0x0b,0x00,0x91,0x59,0x0b,0x0b,0x03,0x02,0x03,0x0a,0x91,0x59,0x03,0x03,0x02,0x12,0x36,0x36,0x41,0x83,0x2b,0x2b,0x47,0x27,0x3b,0x83,0x30,0x30,0x47,0x16,0x25,0x1f,0x1f,0x1d,0x1a,0x21,0x84,0x18,0x16,0x16,0x47,0x02,0x0e,0xb8,0xff,0xf8,0x40,0x11,0x0c,0x06,0x4d,0x06,0x7d,0x0e,0x0e,0x47, -0x0b,0x01,0x08,0x0c,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0x2f,0x2b,0xe1,0x2b,0x32,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x12,0x39,0x2f,0xce,0xf1,0x39,0x39,0xc2,0x2f,0xc4,0x11,0x12,0x39,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x3f, -0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0xc4,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x20,0x11,0x14,0x04,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x35, -0x33,0x35,0x37,0x11,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x17,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x01,0x64,0xa8,0x01,0x38,0x01,0xce,0xfe,0xf8,0xeb,0x6b,0x5e,0x01,0x50,0xfe,0xc5,0x04,0x39,0x3a,0x5f,0x83, -0x75,0x9b,0x9b,0xa4,0xed,0xed,0x83,0x3b,0x2f,0x44,0x79,0x89,0xa2,0x40,0xf6,0x6c,0xb8,0x92,0x82,0x4e,0x60,0x72,0x48,0x58,0x6c,0x5e,0x8d,0x4b,0xb0,0x9a,0xa2,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0xfe,0x54,0xd2,0xfe,0x02,0xe4,0xfd,0xb4,0x01,0x30,0x01,0x1c,0xfb,0x08,0x20,0x8e,0x9e,0x01,0xd0,0x8a,0xfa,0x36,0xfe,0xd0,0x8a,0xfe,0x4d, -0xbf,0x22,0x71,0xb0,0x63,0x72,0x28,0x50,0x5c,0x3e,0x74,0x79,0x91,0x2e,0xa0,0x44,0x3f,0x32,0x39,0x2c,0x27,0x3f,0x70,0x4a,0x7d,0x8f,0xff,0xff,0x00,0xbc,0xff,0xe8,0x04,0x4e,0x05,0x9a,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x2d,0x02,0x23,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x02,0x32,0xb4,0x0a,0x10,0x02,0x03,0x25,0x01, -0x2b,0x35,0xff,0xff,0x00,0x90,0xfe,0x1e,0x03,0x6c,0x05,0xd9,0x00,0x26,0x00,0x4c,0x00,0x00,0x01,0x07,0x00,0x4d,0x02,0x06,0x00,0x00,0x00,0x36,0xb3,0x03,0x02,0x1a,0x1a,0xb8,0xff,0xee,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xfe,0x40,0x18,0x0c,0x06,0x4d,0x1a,0x0e,0x0b,0x06,0x4d,0x01,0x00,0x0d,0x0d,0x02,0x0c,0x06,0x4d,0x0d,0x02, -0x0b,0x06,0x4d,0x2f,0x2a,0x01,0x5d,0x2b,0x2b,0x11,0x35,0x35,0x2b,0x2b,0x2b,0x11,0x35,0x35,0xff,0xff,0xff,0xd7,0x00,0x00,0x04,0x4a,0x05,0xb2,0x00,0x26,0x00,0x51,0x52,0x00,0x01,0x07,0x00,0xb7,0xff,0x69,0x00,0x00,0x00,0x17,0xb2,0x00,0x00,0x00,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xef,0xb2,0x0b,0x06,0x4d,0x2b, -0x2b,0x11,0x35,0x00,0x00,0x01,0x00,0x82,0x03,0xdb,0x01,0x5e,0x05,0x9a,0x00,0x03,0x00,0x19,0xb9,0x00,0x01,0xff,0xe8,0x40,0x09,0x0e,0x12,0x48,0x01,0xb3,0x03,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0xed,0x31,0x30,0x01,0x2b,0x01,0x03,0x23,0x13,0x01,0x5e,0x68,0x74,0x56,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x02,0x00,0x8d,0x03,0xdb, -0x02,0x84,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x3b,0xb9,0x00,0x01,0xff,0xe8,0xb3,0x0e,0x12,0x48,0x05,0xb8,0xff,0xe8,0x40,0x17,0x0e,0x12,0x48,0x05,0x01,0xb3,0x40,0x04,0x00,0x03,0x00,0x0e,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x00,0x06,0x01,0x06,0x2f,0x5d,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0xe1,0x00,0x3f,0xc4,0x1a,0xfd,0xc4, -0x31,0x30,0x01,0x2b,0x2b,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x84,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x04,0x00,0x96,0xff,0xec,0x06,0x0e,0x05,0xae,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x2e,0x00,0x63,0x40,0x35,0x15,0x03,0x09,0x07,0x0c,0x07,0xe6,0x59,0x0c,0x24, -0x00,0x02,0x12,0x02,0xe6,0x59,0x12,0x27,0x17,0x15,0x1f,0x25,0xe7,0x59,0x1f,0x19,0x19,0x2a,0xe7,0x59,0x19,0x2d,0x28,0xcc,0x1c,0x1c,0x15,0x15,0x22,0xcc,0x2d,0x2d,0x30,0x0f,0x17,0x17,0x0f,0x09,0x14,0x14,0x05,0xcc,0x0f,0x2f,0xe1,0x33,0x2f,0xc6,0x11,0x33,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x32,0x2f,0xe1,0x00,0x3f,0x2b, -0x00,0x18,0x10,0xc4,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x30,0x31,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x17,0x25,0x01,0x23,0x01,0x03,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x02,0x03,0x22,0x06,0x15, -0x14,0x33,0x32,0x36,0x35,0x34,0x02,0xf7,0x4f,0x5a,0x76,0x8f,0x9a,0x56,0x76,0x1f,0x66,0x5c,0x80,0x8e,0xe4,0xb8,0x72,0x49,0x02,0xdf,0xfb,0x33,0x93,0x04,0xcc,0xd6,0x8d,0x95,0xe0,0xa9,0x83,0x98,0xdd,0x41,0x6c,0x94,0xa0,0x68,0x8f,0x04,0xf7,0x43,0xc3,0x7f,0xbc,0x4f,0x8d,0x35,0x9f,0x87,0xbf,0x01,0x00,0x32,0x1e,0xfa,0x66,0x05, -0x9a,0xfa,0x52,0xa4,0x84,0xb2,0x01,0x0a,0x9c,0x88,0xb5,0xfe,0xf5,0x02,0x76,0xd2,0x7d,0xb8,0xc6,0x86,0xbb,0x00,0x00,0x02,0x00,0x0e,0xff,0xe8,0x02,0x85,0x05,0xd3,0x00,0x17,0x00,0x20,0x00,0x4b,0x40,0x25,0x18,0x01,0x00,0x16,0x0a,0x05,0x00,0x20,0x17,0x17,0x05,0x13,0x05,0x1d,0xda,0x59,0x05,0x10,0x0e,0x13,0x0e,0xec,0x59,0x13, -0x13,0x10,0x1b,0x48,0x08,0x08,0x22,0x00,0x18,0x01,0x0a,0x83,0x16,0x2f,0xe1,0x39,0x39,0xcd,0x12,0x39,0x2f,0xe1,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x1a,0x19,0xcd,0x12,0x39,0x39,0x11,0x39,0x39,0x31,0x30,0x13,0x37,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x01,0x11,0x14,0x16,0x33, -0x32,0x37,0x15,0x06,0x23,0x22,0x35,0x35,0x07,0x13,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x0e,0xb2,0x7b,0x6f,0x64,0x77,0xfe,0xe3,0x1c,0x1e,0x30,0x96,0x70,0x71,0xc7,0x50,0xf8,0x6d,0x25,0x4c,0x1d,0x29,0x01,0xa6,0xec,0x01,0xc6,0xe2,0x99,0x87,0x68,0xc3,0xfe,0x79,0xfe,0x60,0x5a,0x29,0x6b,0xa2,0x58,0xf1,0xe1,0x62,0x02,0x2b, -0xbb,0x71,0x35,0x76,0x3e,0xb6,0x00,0x02,0x00,0x92,0x00,0x00,0x04,0x42,0x03,0xb0,0x00,0x03,0x00,0x07,0x00,0x3a,0x40,0x0d,0x07,0xf1,0x01,0x0e,0x06,0xf1,0x40,0x02,0x12,0x03,0x02,0x42,0x06,0xb8,0xff,0xe0,0x40,0x14,0x0c,0x06,0x4d,0x06,0xf1,0x02,0x05,0x20,0x0c,0x06,0x4d,0x05,0xf1,0x03,0x08,0x09,0x03,0x02,0xff,0x3a,0x2b,0x01, -0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x2b,0x00,0x18,0x3f,0x1a,0xed,0xfd,0xed,0x31,0x30,0x13,0x21,0x11,0x21,0x13,0x11,0x21,0x11,0x92,0x03,0xb0,0xfc,0x50,0x4b,0x03,0x19,0x03,0xb0,0xfc,0x50,0x03,0x64,0xfc,0xe8,0x03,0x18,0x00,0x01,0x00,0x83,0x01,0xbc,0x02,0x52,0x03,0x8c,0x00,0x03,0x00,0x25,0x40,0x16,0x02,0x0e,0x40,0x03,0x02,0x01, -0x42,0x0f,0x01,0x1f,0x01,0x2f,0x01,0x03,0x09,0x03,0x04,0x05,0x02,0x01,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x11,0x21,0x11,0x02,0x52,0xfe,0x31,0x03,0x8c,0xfe,0x30,0x01,0xd0,0x00,0x00,0x02,0x00,0x83,0x01,0xbc,0x02,0x52,0x03,0x8c,0x00,0x03,0x00,0x07,0x00,0x41,0x40,0x2a,0x06,0xf1, -0x02,0x0e,0x07,0xf1,0x40,0x01,0x03,0x02,0x42,0x02,0x20,0x0c,0x06,0x4d,0x06,0xf1,0x02,0x05,0x20,0x0c,0x06,0x4d,0x05,0xf1,0x03,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x09,0x03,0x08,0x09,0x03,0x02,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x2b,0x00,0x18,0x2f,0x1a,0xed,0xfd,0xed,0x31,0x30,0x13,0x21,0x11, -0x21,0x13,0x11,0x21,0x11,0x83,0x01,0xcf,0xfe,0x31,0x4c,0x01,0x37,0x03,0x8c,0xfe,0x30,0x01,0x84,0xfe,0xc8,0x01,0x38,0x00,0x00,0x01,0x00,0xb2,0x00,0x89,0x04,0x23,0x03,0xfa,0x00,0x0b,0x00,0x25,0x40,0x15,0x03,0x0e,0x40,0x09,0x06,0x00,0x42,0x20,0x00,0x01,0x0f,0x06,0x01,0x09,0x03,0x0c,0x0d,0x06,0x00,0xff,0x3a,0x2b,0x01,0x5f, -0x5e,0x5d,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x34,0x24,0x33,0x32,0x00,0x04,0x23,0xfe,0xff,0xb6,0xb8,0xfe,0xfe,0x01,0x06,0xb2,0xb7,0x01,0x02,0x02,0x42,0xb8,0xfe,0xff,0x01,0x01,0xb8,0xb9,0xff,0xfe,0xfc,0x00,0x00,0x02,0x00,0x70,0x01,0xaa,0x02,0x66,0x03,0xa0,0x00,0x0b,0x00,0x17, -0x00,0x46,0x40,0x2d,0x0f,0xf1,0x03,0x0e,0x15,0xf1,0x40,0x09,0x00,0x20,0x0c,0x06,0x4d,0x06,0x00,0x42,0x12,0xf1,0x00,0x0c,0x20,0x0c,0x06,0x4d,0x0c,0xf1,0x06,0x0f,0x06,0x1f,0x06,0x02,0x0b,0x03,0x00,0x40,0x09,0x0c,0x48,0x18,0x19,0x06,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x5f,0x5e,0x5d,0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x01,0x2b,0x00, -0x18,0x2f,0x1a,0xed,0xf4,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x66,0x92,0x69,0x67,0x94,0x92,0x69,0x67,0x94,0xfe,0x56,0x67,0x49,0x4a,0x64,0x66,0x4a,0x48,0x66,0x02,0xa6,0x6a,0x92,0x94,0x68,0x66,0x94,0x94,0x66,0x4a,0x66, -0x66,0x4a,0x49,0x65,0x67,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0x8c,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x56,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x00,0x12,0x13,0x06,0x07,0x25,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x2f,0x02,0x26, -0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xe6,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x22,0x23,0x10,0x14,0x25,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x6c,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x87,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x30, -0x1a,0x16,0x10,0x0a,0x25,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0e,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xb8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf9,0x40,0x09,0x1a,0x16,0x10,0x0a,0x25,0x01,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x06,0xe2,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x31,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x32,0x19,0x1f,0x10,0x0a,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x05,0x85,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07, -0x00,0xdb,0x01,0x84,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1d,0x19,0x1f,0x10,0x0a,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0x8b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfe,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x12,0x0d,0x0c,0x02,0x03,0x25,0x01, -0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x2f,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfa,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x16,0x1c,0x1d,0x19,0x13,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4, -0x07,0x1c,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xf3,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x02,0x03,0x3e,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xf5,0x00,0x00,0x00,0x16, -0xb9,0x00,0x02,0x01,0x1f,0x40,0x09,0x1a,0x1a,0x19,0x13,0x3e,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe2,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x57,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x0f,0x15,0x02,0x03,0x3e,0x01,0x0c,0x05,0x26, -0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x85,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x71,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x08,0x1a,0x1a,0x0f,0x0f,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x6c,0x02,0x26, -0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x95,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x1d,0x1e,0x1a,0x10,0x0a,0x3e,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0e,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xd1,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0d, -0x2a,0x26,0x20,0x17,0x3e,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x06,0xe2,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x4f,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x2f,0x1d,0x23,0x10,0x0a,0x3e,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0x85,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x70,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x26,0x26,0x13,0x13,0x3e,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0x85,0x04,0xec,0x05,0xb2,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x01,0x9c, -0x01,0x79,0x00,0x00,0x00,0x0b,0xb6,0x01,0x3f,0x1c,0x1a,0x05,0x19,0x25,0x01,0x2b,0x35,0x00,0x00,0x03,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0xc6,0x00,0x18,0x00,0x25,0x00,0x29,0x00,0xbc,0xb6,0x24,0x18,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe0,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x28,0x26,0x26,0x19,0x10,0x28,0x80,0x26,0x13,0x05,0xb8, -0xff,0xc0,0x40,0x31,0x0b,0x0f,0x48,0x05,0x05,0x07,0x95,0x02,0x1c,0x0a,0x23,0x95,0x0d,0x16,0x17,0x0f,0x15,0x1d,0x95,0x13,0x10,0x04,0x15,0x19,0x16,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x09,0x05,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf0, -0x40,0x2b,0x0b,0x06,0x4d,0x09,0x09,0x2b,0x04,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d,0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x10,0x10,0x0d,0x06,0x4d,0x10,0x0e,0x0c,0x06,0x4d,0x10,0x1a,0x0b,0x06,0x4d,0x10,0x2f,0x2b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b, -0x2b,0x17,0x33,0x2f,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x2f,0x2b,0x10,0xde,0x1a,0xcd,0x11,0x12,0x01,0x39,0x2f,0xcd,0x31,0x30,0x00,0x2b,0x2b,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06, -0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x13,0x33,0x03,0x04,0x10,0xfd,0xe4,0xc1,0x8b,0xae,0x9c,0x01,0x7a,0x04,0x74,0xec,0xbe,0xea,0xfb,0xda,0xd1,0x62,0x04,0xa4,0xa4,0xa4,0x7c,0x9a,0xaa,0xa6,0x87,0x8b,0xac,0xfe,0x6b,0xa6,0x7b,0x75,0x52,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x13,0xe4,0x01,0x05,0x01,0x34,0xa6,0x8e, -0xfd,0xcf,0x97,0x79,0xaf,0xde,0xc6,0xaa,0xce,0xc3,0x03,0x8d,0x01,0x04,0xfe,0xfc,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x07,0x6a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x5e,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x10,0x0c,0x06,0x0b,0x3e,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0xbb,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x00,0x01,0xad,0x00,0x16,0xb9,0x00,0x01,0xff,0xf3,0x40,0x09,0x17,0x18,0x04,0x0f,0x3e,0x01,0x16,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x92,0x05,0x9a,0x00,0x13,0x00,0x17,0x00,0xa0, -0x40,0x5d,0x06,0x09,0x0d,0x17,0x04,0x13,0x10,0x10,0x13,0x91,0x59,0x10,0x10,0x0f,0x16,0x16,0x02,0x91,0x59,0x16,0x0f,0x00,0x16,0x91,0x2b,0x30,0x0b,0x0f,0x03,0x04,0x00,0x12,0x0d,0x10,0x16,0x03,0x00,0x01,0x12,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01,0x12,0x0d,0x06,0x4d, -0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x19,0x09,0x0c,0x14,0x03,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7e,0x07,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b, -0x2b,0x2b,0xca,0x2f,0x11,0x12,0x17,0x39,0x00,0x3f,0xc4,0x3f,0xc4,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x21,0x15,0x21,0x35,0x04,0xf2,0xa8,0xfd,0x1a,0xa8,0xa0,0xa0, -0xa8,0x02,0xe6,0xa8,0xa0,0xa0,0xfc,0x72,0x02,0xe6,0x02,0x8e,0xfd,0x72,0x04,0x04,0x98,0xfe,0xfe,0xfe,0xfe,0x98,0xdf,0xdf,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x1a,0x00,0xbd,0x40,0x40,0x00,0x19,0x01,0x03,0x02,0x18,0x01,0x10,0x04,0x0d,0x0a,0x13,0x10,0x10,0x13,0x96,0x59,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03, -0x09,0x03,0x10,0x10,0x0f,0x17,0x15,0x04,0x17,0x04,0x95,0x59,0x17,0x10,0x0f,0x00,0x08,0x00,0x15,0x12,0x12,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d, -0x01,0x01,0x1c,0x0d,0x10,0x13,0x03,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x0b,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x1c,0x01,0x5d,0x2f,0x2b,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b, -0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0xc4,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8, -0xa4,0xee,0x78,0xa4,0xa4,0x88,0x88,0xa4,0x01,0x4c,0xfe,0xb4,0x04,0x78,0xd8,0xa8,0xb2,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0xa4,0xc2,0xd6,0xcb,0xff,0xff,0xff,0xd0,0x00,0x00,0x02,0x51,0x07,0x0c,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xad,0x01,0x5a,0x00,0x13,0x40,0x0b, -0x01,0x00,0x0e,0x04,0x02,0x03,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xad,0x00,0x00,0x02,0x2e,0x05,0xb2,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xd8,0x8a,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0e,0x04,0x02,0x03,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0x13,0x00,0x00,0x02,0x0f,0x06,0x8b,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xd5,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xef,0x00,0x00,0x01,0xeb,0x05,0x2f,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06, -0x00,0xd9,0xb1,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x23,0x07,0x1a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xda,0xff,0xd9,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01, -0x07,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdb,0x00,0x00,0x02,0x00,0x05,0xbe,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xda,0xb6,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0a,0x04,0x02,0x03,0x25,0x01,0x07,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x50,0xfe,0x70,0x01,0x64, -0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x06,0x00,0xdf,0x12,0x00,0x00,0x0b,0xb6,0x01,0x00,0x04,0x04,0x00,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x37,0xfe,0x70,0x01,0x66,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x06,0x00,0xdf,0xf9,0x00,0x00,0x0b,0xb6,0x02,0x00,0x1e,0x10,0x0e,0x0f,0x25,0x01,0x2b,0x35,0x00, -0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0xf2,0x07,0x6a,0x02,0x26,0x00,0x2d,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x62,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x13,0x0b,0x0c,0x3e,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x02,0x0f,0x06,0x0e,0x02,0x26,0x06,0xac,0x00,0x00,0x01,0x07, -0x00,0xd7,0xff,0x7f,0x00,0x00,0x00,0x08,0xb3,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x85,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xea,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x14,0x11,0x06,0x01,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0x85,0x03,0xf8,0x05,0xec, -0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0x87,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x10,0x0d,0x04,0x01,0x3e,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x0c,0x00,0x66,0x40,0x45,0x7a,0x0c,0x01,0x77,0x0b,0x01,0x79,0x02,0x01,0x7d,0x0a,0x01,0x7e,0x01,0x01,0x36,0x0c,0x01,0x2a,0x01, -0x01,0x36,0x00,0x01,0x05,0x15,0x06,0x0f,0x0a,0x0b,0x0b,0x01,0x70,0x00,0x01,0x00,0x14,0x0b,0x06,0x4d,0x00,0x0c,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0x2f,0x0e,0x01,0x5d,0x2f,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x5d,0x33,0x33,0x2f, -0x33,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x04,0x00,0xfe,0x2b,0x01,0xd5,0xfe,0x12,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x03,0xa4, -0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0x96,0x00,0x00,0xff,0xff,0x00,0x27,0xfe,0x85,0x01,0x4a,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x01,0x9c,0xff,0x4c,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x01,0x9c,0x01,0x6a,0x00,0x00, -0x00,0x0e,0xb9,0x00,0x01,0xff,0xea,0xb4,0x16,0x14,0x08,0x01,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x85,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xb9,0x00,0x00,0x00,0x0b,0xb6,0x01,0x10,0x16,0x13,0x08,0x01,0x3e,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x5a,0x05,0x40,0x05,0x9a, -0x00,0x1b,0x00,0xb8,0xb5,0x02,0x09,0x01,0x10,0x04,0x0c,0xb8,0xff,0xc0,0xb3,0x10,0x00,0x4d,0x0c,0xb8,0xff,0xe8,0x40,0x3d,0x0c,0x00,0x4d,0x02,0x20,0x10,0x00,0x4d,0x17,0x19,0x14,0x19,0x91,0x59,0x14,0x02,0x0c,0x1b,0x10,0x08,0x03,0x1b,0x07,0x12,0x16,0x16,0x12,0x1b,0x1b,0x0c,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d, -0x12,0x08,0x0b,0x06,0x4d,0x12,0x7e,0x7f,0x0f,0x01,0x0f,0x18,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x1a,0x0b,0x06,0x4d,0x0f,0x0f,0x1d,0x09,0x03,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0x40, -0x09,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x39,0x33,0x2f,0x10,0xc0,0x2f,0x00,0x3f,0xc4,0x3f,0xc4,0x12,0x39,0x39,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x26,0x27,0x23, -0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x01,0x90,0x16,0x18,0x06,0x08,0xa8,0xda,0x02,0xce,0x02,0x38,0x04,0x0a,0xa8,0xfe,0x93,0x4c,0x3d,0x4e,0x3f,0xbd,0x04,0x77,0x20,0x3a,0x35,0x90,0xfb,0xf4,0x05,0x9a,0xfb,0xd6,0x02,0x66,0x48,0x94,0x03,0xb6, -0xfa,0xa6,0xfe,0x1a,0x1f,0xa5,0x2c,0x01,0x0e,0x00,0x00,0x01,0x00,0xa6,0xfe,0x5a,0x03,0xf8,0x04,0x18,0x00,0x19,0x00,0x9c,0x40,0x2b,0x00,0x18,0x01,0x10,0x03,0x05,0x07,0x02,0x07,0x91,0x59,0x02,0x14,0x0c,0x17,0x0c,0x95,0x59,0x17,0x10,0x12,0x0f,0x11,0x15,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b, -0x06,0x4d,0x00,0x84,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x09,0x09,0x1b,0x13,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x84,0x11,0x02,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x11, -0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x11,0x2f,0x1b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc4,0x00,0x3f,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10, -0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xfe,0x9a,0x4c,0x3e,0x4e,0x40,0xbe,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x75,0xdb,0x01,0x5a,0x1a,0xfe,0x40,0x1f,0xa5,0x2c,0x01,0x0e,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xfe,0x5a,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa, -0x06,0x8b,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xce,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x06,0x1a,0x1b,0x03,0x09,0x3e,0x02,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x2f,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x26,0x00,0x00,0x00,0x13, -0x40,0x0b,0x02,0x0a,0x1a,0x1b,0x03,0x09,0x3e,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x1c,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xd7,0x01,0x5e,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x1b,0x0c,0x0c,0x3e,0x02,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b, -0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xbe,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x35,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x21,0x21,0x06,0x06,0x3e,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00, -0x00,0x07,0x01,0x9c,0x00,0xe4,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x85,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x06,0x01,0x9c,0x19,0x00,0x00,0x0b,0xb6,0x01,0x1f,0x14,0x14,0x06,0x06,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xd7, -0x00,0xb1,0x01,0x5c,0x00,0x08,0xb3,0x01,0x3a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0e,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x06,0x00,0xd7,0x37,0x00,0x00,0x08,0xb3,0x01,0x30,0x11,0x26,0x00,0x2b,0x35,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x0f,0x00,0xa3,0x40,0x1a,0x0b,0x08, -0x05,0x02,0x02,0x05,0x91,0x59,0x02,0x0f,0x06,0x02,0x91,0x2b,0x30,0x0c,0x00,0x0f,0x00,0x91,0x59,0x0f,0x03,0x06,0x12,0x0d,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x2f,0x0b,0x06,0x4d,0x04,0x0e,0x06,0x07,0x09,0x42,0x09,0x07,0x00,0x0e,0x06,0x07,0x0d,0x42,0x2f,0x0d,0x3f,0x0d,0xcf,0x0d,0x03,0x0d,0x0d,0x10, -0x0b,0x02,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x7e,0x07,0x04,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x11,0x40,0x0c,0x00,0x4d,0x11,0xb8,0xff,0xc0,0xb2,0x0b,0x00,0x4d,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x5d,0x2b,0x01, -0x10,0xe0,0x18,0x10,0xc6,0x2b,0x01,0x10,0xe2,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xf6,0xf6,0xa8,0xf9,0xf9,0xfe,0x63,0x03,0xe3,0x05,0x02,0xfe,0x1a, -0x9b,0xfd,0x7f,0x02,0x81,0x9b,0x01,0xe6,0x98,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81,0x05,0x2f,0x00,0x1e,0x00,0x93,0x40,0x45,0x0b,0x18,0x0b,0x0c,0x00,0x4c,0x1d,0x01,0x0d,0x10,0x10,0x0d,0x96,0x59,0x10,0x18,0x14,0x40,0x1c,0x19,0x11,0x14,0x14,0x11,0x95,0x59,0x14,0x0f,0x07,0x05,0x0a,0x05,0x95,0x59,0x0a,0x16,0x07,0x1e, -0x2f,0x1b,0x01,0x1b,0x1b,0x02,0x0e,0x12,0x10,0x14,0x19,0x1d,0x04,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x0c,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xee,0xb6,0x0b,0x06,0x4d,0x0c,0x0c,0x20,0x1f,0x11,0x12,0x39,0x2f,0x2b,0x2b, -0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0xdc,0xc6,0x10,0xc0,0x2f,0x5d,0xc6,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0xc6,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x23,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33, -0x35,0x36,0x37,0x37,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x77,0xf8,0x45,0x52,0x3c,0x2f,0x3a,0x5f,0xfe,0xf3,0xa3,0xa3,0xb0,0xb0,0x04,0x4e,0x52,0x01,0x02,0xfe,0xfe,0xf8,0x02,0x23,0xf0,0x67,0x58,0x22,0x8c,0x20,0x01,0x2c,0x01,0x0d,0x85,0xcc,0x8c,0xfa,0x02,0x19,0x1a,0xfe,0xd1,0x8c,0xcc,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5, -0x07,0x0e,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x5f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x03,0x18,0x0e,0x05,0x0d,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd6,0x00,0x00,0x00,0x13, -0x40,0x0b,0x01,0x00,0x1c,0x12,0x08,0x11,0x25,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x06,0x8b,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x81,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x0d,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b, -0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0x2f,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xf9,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x14,0x15,0x08,0x11,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x1a,0x02,0x26,0x00,0x38, -0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x84,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x14,0x0e,0x05,0x0d,0x25,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xbe,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xfd,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff, -0xfb,0x40,0x09,0x18,0x12,0x08,0x11,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xfe,0x70,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x10,0x00,0x00,0xff,0xff,0x00,0x90,0xfe,0x70,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x90, -0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x6a,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0xd7,0x02,0x5b,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x1e,0x13,0x14,0x25,0x01,0x20,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0e,0x02,0x26,0x00,0x5a,0x00,0x00, -0x01,0x07,0x00,0xd7,0x01,0x80,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfb,0x40,0x09,0x1e,0x1e,0x13,0x14,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x69,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xc5,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x00,0x13,0x14, -0x05,0x00,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0e,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x10,0x1a,0x1b,0x0c,0x00,0x25,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xa6, -0x00,0x00,0x02,0x62,0x06,0x02,0x00,0x0c,0x00,0x39,0x40,0x23,0x00,0x02,0x0a,0x02,0x95,0x59,0x0a,0x01,0x05,0x15,0x2f,0x00,0x01,0x00,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x84,0x06,0x06,0x0e,0x0d,0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0xc4,0x5d,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10, -0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x62,0x2e,0x3e,0xac,0xa4,0xbd,0x89,0x4a,0x2c,0x05,0x5c,0x1b,0xd9,0xfb,0x62,0x04,0xa6,0xa1,0xbb,0x12,0x00,0x00,0x04,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x52,0x00,0x10,0x00,0x1b,0x00,0x23,0x00,0x27,0x00,0xfe,0x40,0x39,0x78,0x27,0x01,0x76, -0x22,0x01,0x79,0x1d,0x01,0x74,0x0c,0x01,0x7b,0x0a,0x01,0x7b,0x07,0x01,0x77,0x06,0x01,0x02,0x08,0x0c,0x00,0x4d,0x1c,0x02,0x01,0x20,0x01,0x23,0x03,0x04,0x20,0x04,0x73,0x04,0x01,0x7c,0x01,0x01,0x20,0x30,0x0c,0x00,0x4d,0x00,0x16,0x01,0x90,0x27,0x01,0xa0,0x27,0x01,0x27,0xb8,0xff,0xc0,0xb3,0x1d,0x21,0x48,0x27,0xb8,0xff,0xc0, -0x40,0x39,0x16,0x19,0x48,0x27,0xa0,0x26,0xd0,0x26,0xe0,0x26,0x03,0x10,0x26,0x20,0x26,0x30,0x26,0x80,0x26,0x90,0x26,0x05,0x26,0x0b,0x02,0x91,0x1c,0x1c,0x16,0x00,0x11,0xc5,0x0b,0x10,0x06,0x40,0x16,0x03,0x04,0x00,0x12,0x24,0x80,0x26,0x26,0x14,0x19,0xc4,0x0e,0x40,0x09,0x0c,0x48,0x0e,0x14,0xc4,0x08,0xb8,0xff,0xc0,0xb5,0x0c, -0x00,0x4d,0x08,0x08,0x06,0xb8,0xff,0xf8,0x40,0x15,0x0c,0x00,0x4d,0x10,0x08,0x0c,0x00,0x4d,0x1c,0x23,0x06,0x10,0x04,0x05,0x77,0x05,0x01,0x79,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0c,0x0c,0x00,0x4d,0x00,0x18,0x0c,0x00,0x4d,0x00,0x00,0x29,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x2b,0x2b,0x39,0x2f,0x2b, -0xe9,0xd4,0x2b,0xe9,0x10,0xc0,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0x3f,0x1a,0xcd,0x39,0xd4,0xed,0x11,0x12,0x39,0x2f,0xed,0x10,0xd6,0x5d,0x72,0xcd,0x2b,0x2b,0x71,0x72,0x5d,0x2b,0x31,0x30,0x01,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x26, -0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x01,0x01,0x23,0x13,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x11,0x65,0x78,0x5c,0x58,0x70,0x60,0x6e,0x32,0x40,0x72,0x30,0x42,0x42,0xc9,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x02, -0x04,0xfe,0xfa,0x7f,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x62,0x34,0x70,0x59,0x6e,0x6d,0x54,0x70,0x36,0x01,0x15,0x3f,0x30,0x72,0x42,0x30,0x31,0x3e,0xfb,0xae,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x06,0x29,0xfe,0xb8,0x01,0x48,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x07,0x66,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xdc, -0x00,0xe9,0xff,0xc2,0x01,0x07,0x00,0x8e,0x01,0x0c,0x01,0x5c,0x00,0x33,0x40,0x25,0x04,0x0f,0x39,0x1f,0x39,0x3f,0x39,0x5f,0x39,0x90,0x39,0x05,0x20,0x39,0x5f,0x39,0x02,0x39,0x26,0x03,0x02,0x20,0x40,0x11,0x15,0x48,0x0f,0x20,0x01,0x10,0x20,0x4f,0x20,0xef,0x20,0x03,0x20,0x00,0x11,0x5d,0x71,0x2b,0x35,0x35,0x10,0xde,0x5d,0x5d, -0x34,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x07,0x66,0x02,0x26,0x00,0x91,0x00,0x00,0x01,0x07,0x00,0x8e,0x03,0x30,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x17,0x16,0x15,0x11,0x09,0x25,0x02,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x06,0x56,0x06,0x0a,0x02,0x26,0x00,0xa0,0x00,0x00, -0x01,0x07,0x00,0x8e,0x02,0x55,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x11,0x37,0x37,0x1e,0x1e,0x25,0x03,0x38,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xcd,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x92,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xfa,0x01,0x5c,0x00,0x13,0x40,0x0b,0x03,0x20,0x25,0x27,0x16,0x08, -0x25,0x03,0x26,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x31,0xff,0xae,0x04,0x96,0x06,0x0a,0x02,0x26,0x00,0xa1,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x58,0x00,0x00,0x00,0x16,0xb9,0x00,0x03,0xff,0xf9,0x40,0x09,0x25,0x25,0x16,0x10,0x3e,0x03,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x70, -0x01,0xfe,0x01,0x50,0x02,0xdf,0x00,0x0b,0x00,0x15,0x40,0x0b,0x06,0x00,0xb0,0x5b,0x06,0x09,0xaf,0x03,0x2f,0x0d,0x01,0x5d,0x2f,0xe1,0x00,0x2f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x01,0xfe,0x42,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x42,0x00,0xff,0xff, -0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x66,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x43,0x02,0xa0,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1f,0x1d,0x13,0x14,0x25,0x01,0x1d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0a,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07, -0x00,0x43,0x01,0xb5,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe7,0x40,0x09,0x1f,0x1d,0x13,0x14,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x66,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x96,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x5f,0x1d,0x01,0x00,0x1d, -0x1f,0x13,0x14,0x25,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0a,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x1d,0x1f,0x13,0x14,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x1a,0x00,0x00,0x07,0x60,0x06,0xe4,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x8f,0x02,0x1c,0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf1,0x40,0x0a,0x31,0x1f,0x13,0x14,0x25,0x02,0x01,0x28,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x05,0x87,0x02,0x26,0x00,0x5a, -0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x44,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xef,0x40,0x0a,0x31,0x1f,0x13,0x14,0x25,0x02,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x66,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xf6,0x01,0x5c,0x00,0x1a, -0xb3,0x01,0x00,0x11,0x01,0xb8,0xff,0xe6,0x40,0x09,0x11,0x0f,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x5d,0x35,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0a,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0x9e,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd6,0x40,0x09,0x18,0x16,0x0c,0x00,0x25, -0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x1c,0x40,0x10,0x00,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0x10,0x02,0x50,0x02,0x60,0x02,0x03,0x02,0x2f,0x5d,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x23,0x03,0x33,0x01,0x70,0x74,0x8e,0x94,0x03,0xf4,0x01, -0xbe,0x00,0x00,0x01,0x00,0x00,0x05,0x74,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x10,0xb7,0x02,0x01,0xd9,0x59,0x02,0x00,0x03,0x02,0x2f,0x2f,0x00,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0x00,0x01,0x00,0x6a,0x00,0x00,0x03,0xee,0x05,0xb2,0x00,0x23,0x00,0x92,0x40,0x57,0x01,0x02, -0x22,0x03,0x0b,0x0e,0x0e,0x0b,0x9a,0x59,0x00,0x0e,0x10,0x0e,0x20,0x0e,0x03,0x09,0x03,0x0e,0x12,0x40,0x21,0x1e,0x0f,0x12,0x12,0x0f,0x9a,0x59,0x0f,0x12,0x1f,0x12,0x02,0x09,0x03,0x12,0x12,0x16,0x06,0x19,0x1b,0x16,0x1b,0x9a,0x59,0x16,0x04,0x06,0x05,0x9a,0x59,0x06,0x12,0x00,0x1f,0x4f,0x18,0x01,0x18,0x06,0x06,0x25,0x0f,0x12, -0x1e,0x21,0x04,0x01,0x08,0x0c,0x06,0x4d,0x01,0x8a,0x04,0x08,0x0b,0x10,0x0c,0x0b,0x10,0x0c,0x06,0x4d,0x0b,0x2f,0x2b,0xdd,0xc4,0x10,0xc6,0x32,0xe1,0x2b,0x17,0x39,0x12,0x39,0x2f,0xd4,0x5d,0xd4,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a, -0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x01,0x21,0x15,0x14,0x07,0x21,0x15,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x21,0x03,0x10,0xfe,0xd8,0xc1,0x02,0xc7,0xfc,0x7c,0xda,0xc5,0xc5,0xc5,0xc5, -0xda,0xad,0x76,0x5f,0x63,0x70,0xe5,0x01,0x28,0xfe,0xd8,0x01,0x28,0x01,0xe8,0x09,0xf3,0x60,0x8c,0x87,0x47,0xf2,0x28,0x8c,0x88,0x8d,0x7d,0xbc,0xf0,0x29,0x9b,0x39,0xfe,0xcd,0x6b,0x8d,0x88,0x00,0x00,0x02,0x00,0x55,0xff,0xdd,0x04,0x78,0x04,0x48,0x00,0x12,0x00,0x19,0x00,0x53,0x40,0x2e,0x00,0x06,0x10,0x06,0x02,0x09,0x03,0x06, -0x06,0x00,0x04,0x13,0x00,0xc3,0x59,0x13,0x13,0x10,0x04,0x10,0x16,0xc3,0x59,0x10,0x0a,0x04,0xc3,0x59,0x0a,0x19,0x07,0x40,0x10,0x1e,0x48,0x07,0x07,0x00,0xaf,0x13,0x13,0x1b,0x19,0x01,0xaf,0x0d,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12, -0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x01,0x21,0x13,0x16,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x07,0x11,0x26,0x23,0x22,0x07,0x11,0x04,0x78,0xfc,0xc4,0x01,0x78,0xb0,0xff,0x8c,0x48,0x68,0xdb,0x8f,0xee,0xfe,0xdd,0x01,0x29,0xe4,0xd8,0x01,0x30,0xda,0x82,0xad,0xaf,0x76,0x02,0x12, -0xfe,0x8e,0x79,0xf5,0x2a,0x98,0x7d,0x01,0x43,0xf2,0xfe,0x01,0x38,0xfe,0xe4,0xd0,0x01,0x29,0x7b,0x7b,0xfe,0xd7,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xe2,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x35,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x30,0x2d,0x00,0x3f, -0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x07,0x2a,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x07,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x7d,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x44,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x8c,0xff,0xec,0x07,0x2c,0x05,0x9e,0x00,0x26,0x02,0x39, -0x11,0x00,0x00,0x27,0x00,0xbc,0x03,0x09,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x7f,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x48,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xa2,0xff,0xec,0x06,0xa5,0x05,0xa4,0x00,0x26,0x02,0x3a,0x55,0x00,0x00,0x27,0x00,0xbc,0x02,0x82,0x00,0x00,0x01,0x07,0x02,0x3b,0x03,0xf8,0xfd,0xb8, -0x00,0x0b,0xb4,0x04,0x03,0x02,0x2e,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0x00,0x01,0x00,0xdb,0xfe,0x85,0x01,0xfc,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0xfc,0xa6,0x7b,0x75,0x77,0xfe,0xfc,0x01, -0x04,0x00,0x00,0x01,0x00,0xdb,0xfe,0x85,0x01,0xfc,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0xfc,0xa6,0x7b,0x75,0x77,0xfe,0xfc,0x01,0x04,0x00,0xff,0xff,0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16, -0x02,0x06,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0xce,0x04,0x96,0x01,0xdb,0x06,0x01,0x00,0x03,0x00,0x0f,0xb5,0x01,0x00,0x01,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0xdb,0xaf,0x5e,0x66,0x06,0x01,0xfe,0x95,0x01,0x6b,0x00,0x03,0xff,0xda,0x04,0xa4,0x02,0x84,0x06,0x0f,0x00,0x03,0x00,0x0f, -0x00,0x1b,0x00,0x2a,0x40,0x14,0x0a,0x04,0x16,0xc1,0x40,0x10,0x03,0x01,0x0d,0xc0,0x07,0x07,0x00,0x13,0xc0,0x19,0x19,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x33,0x2f,0xe1,0x11,0x33,0x2f,0xe1,0x00,0x2f,0xcd,0xd4,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22, -0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xd6,0xaf,0x5d,0x65,0xf2,0x28,0x39,0x39,0x27,0x2a,0x3a,0x3a,0xfd,0xf2,0x28,0x3a,0x3a,0x28,0x29,0x3b,0x3a,0x06,0x0f,0xfe,0x95,0x01,0x6b,0xfe,0xb9,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12, -0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x01,0x9f,0xff,0x5f,0xff,0x99,0x00,0x12,0x40,0x0a,0x02,0x13,0x03,0x02,0x17,0x12,0x12,0x05,0x05,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc5,0x00,0x00,0x04,0x36,0x05,0x9a,0x00,0x27,0x00,0x28,0x00,0x82,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf7,0xff,0x99,0x00,0x14, -0xb3,0x01,0x0f,0x03,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x02,0x02,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc5,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf7,0xff,0x99,0x00,0x14,0xb3,0x01,0x0f,0x03,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x06,0x06,0x3e,0x01,0x2b, -0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc6,0x00,0x00,0x02,0x4a,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xe6,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf8,0xff,0x99,0x00,0x07,0xb2,0x01,0x07,0x03,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xd1,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x01,0x9f,0xff,0x03,0xff,0x99, -0x00,0x12,0x40,0x0a,0x02,0x1b,0x03,0x02,0x1a,0x18,0x18,0x03,0x03,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xb3,0x00,0x00,0x05,0x48,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe8,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xe5,0xff,0x99,0x00,0x14,0xb3,0x01,0x11,0x03,0x01,0xb8,0xff,0xc6,0xb4,0x0e,0x0e,0x05,0x05,0x3e,0x01,0x2b, -0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xd1,0x00,0x00,0x06,0x3b,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x92,0x00,0x00,0x01,0x07,0x01,0x9f,0xff,0x03,0xff,0x99,0x00,0x14,0xb3,0x01,0x1f,0x03,0x01,0xb8,0xff,0xe8,0xb4,0x1c,0x1c,0x12,0x12,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5c,0x06,0x0f,0x02,0x26, -0x01,0xc9,0x00,0x00,0x01,0x06,0x01,0xa0,0xd8,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0b,0x0e,0x0e,0x05,0x05,0x3e,0x03,0x02,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00, -0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06,0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x02,0x06,0x00,0x3d,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00, -0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x04,0xef,0x05,0x9a,0x00,0x0b,0x00,0x5f,0x40,0x18,0x77,0x09,0x01,0x71,0x08,0x01,0x76,0x07,0x01,0x79,0x02,0x01,0x7e,0x01,0x01,0x78,0x00,0x01,0x0a,0x08,0x0c,0x00, -0x4d,0x07,0xb8,0xff,0xf0,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x02,0x10,0x0b,0x0c,0x00,0x4c,0x0b,0xb8,0xff,0xf8,0x40,0x0e,0x0c,0x00,0x4d,0x0b,0x03,0x00,0x12,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe8,0xb7,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x0d,0x09,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x01,0x2b,0x2b,0x2b, -0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x04,0xef,0xbb,0xfe,0x6c,0x10,0x0c,0x04,0x0a,0x14,0xfe,0x6a,0xb4,0x02,0x0e,0xbe,0x04,0x7e,0x2f,0x47,0x3e,0x39,0xfb,0x83,0x05,0x9a,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff, -0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x00,0x31,0x00,0x00,0x00,0x03,0x00,0x3a,0x00,0x00,0x03,0xdb,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x52,0x40,0x32,0x06,0x05,0x91,0x59,0x06,0x02,0x09,0x06,0x91,0x2b,0x30,0x02,0x01,0xee,0x59,0x02,0x03,0x09,0x0a,0xee,0x59,0x09,0x12,0x0f,0x04,0x5f,0x04,0x02,0x0b,0x03, -0x09,0x08,0x05,0x04,0xff,0x3a,0x30,0x01,0x70,0x01,0x02,0x00,0x01,0x00,0x01,0x0a,0x08,0x08,0x0d,0x09,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x21,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0xc0, -0xfc,0x94,0x03,0x6c,0x8a,0xfd,0xa9,0x02,0x57,0xa5,0xfc,0x5f,0x03,0xa1,0x04,0xfa,0xa0,0xfc,0xee,0x99,0xfc,0xdf,0xa2,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xfc,0x05,0x9a,0x00,0x07,0x00,0x6f,0x40,0x3c,0x07,0x02,0x91,0x59,0x07,0x03,0x04,0x00, -0x12,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x09,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3, -0x0c,0x06,0x4d,0x05,0xb8,0xff,0xfe,0xb3,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x04,0xfc,0xaa,0xfd,0x13,0xa9,0x04,0x40,0x04,0xfe,0xfb,0x02,0x05,0x9a,0x00,0xff,0xff,0x00,0xbc, -0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x00,0x03,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x5e,0x40,0x0c,0x05,0x0a,0x01,0x04,0x08,0x01,0x0c,0x03,0x01,0x10,0x03,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x08,0xb8,0xff,0xe8,0x40,0x22,0x0c,0x00,0x4d,0x03,0x18,0x0c,0x00,0x4d,0x04,0x07,0x06, -0x06,0x07,0x91,0x59,0x06,0x03,0x02,0x00,0x0b,0x00,0x0b,0x91,0x59,0x00,0x12,0x07,0x00,0x00,0x0d,0x08,0x04,0x0a,0x02,0x2f,0x33,0xc6,0x32,0x12,0x39,0x2f,0xc4,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15, -0x21,0x01,0x01,0x21,0x03,0xf0,0xfc,0x3e,0x01,0xd1,0xfe,0x59,0x03,0x5a,0xfd,0x9b,0x01,0x7b,0xfe,0x5c,0x02,0xcc,0x4e,0x02,0x94,0x02,0x5e,0x5a,0x9b,0xfd,0xe9,0xfd,0xac,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c, -0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x88,0x00,0x00,0x05,0xae,0x05,0x9a,0x00,0x19,0x00,0xca,0xb9,0x00,0x16,0xff,0xc0,0xb3,0x0c,0x00,0x4d,0x03,0xb8,0xff,0xc0,0x40,0x1a,0x0c,0x00,0x4d,0x18,0x0e,0x0b,0x01,0x0b,0x01,0x91,0x59,0x0b,0x0b,0x0c,0x14,0x00,0x06, -0x03,0x0c,0x12,0x07,0x08,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x04,0x7e,0x07,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xf4,0x40,0x40,0x0b,0x06,0x4d,0x07,0x0e,0x0c,0x0d,0x12,0x42,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d, -0x15,0x7e,0x12,0x0d,0x0c,0x06,0x4d,0x12,0x08,0x0d,0x06,0x4d,0x12,0x0d,0x0b,0x06,0x4d,0x12,0x12,0x1a,0x18,0x01,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x0d,0xb8,0xff,0xfb,0x40,0x0a,0x0b,0x06,0x4d,0x0d,0x0d,0x1b,0x1a,0x4f,0x1b,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b, -0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x2b,0x01,0x11,0x33,0x20,0x11,0x11,0x33,0x11,0x14,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x00,0x35,0x11,0x33,0x11, -0x10,0x21,0x33,0x11,0x03,0x68,0x39,0x01,0x6a,0xa3,0xfe,0xe2,0xef,0x39,0x9b,0x39,0xf0,0xfe,0xe4,0xa2,0x01,0x6a,0x39,0x05,0x9a,0xfc,0x80,0x01,0x6e,0x02,0x12,0xfd,0xee,0xe3,0xfe,0xe1,0xfe,0x7a,0x01,0x86,0x01,0x1f,0xe3,0x02,0x12,0xfd,0xee,0xfe,0x92,0x03,0x80,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x05,0xa9,0x05,0xb2,0x02,0x06, -0x00,0x9f,0x00,0x00,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2, -0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x95,0x01,0x5b,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0a,0x1d,0x17,0x05,0x00,0x25,0x02,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x01,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x41, -0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0e,0x29,0x27,0x0a,0x13,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x01,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x01,0x9f,0x00,0xe6,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x77,0x28,0x26,0x0c,0x11,0x25,0x01,0x28,0x11,0x26,0x00, -0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x01,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x44,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x4b,0x17,0x15,0x07,0x02,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xff,0xf4,0x02,0x08,0x06,0x01,0x02,0x26, -0x01,0xc9,0x00,0x00,0x01,0x06,0x01,0x9f,0xe1,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe7,0x40,0x09,0x0e,0x0d,0x05,0x06,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0f,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x01,0xa0,0x01,0x07,0x00,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01, -0xb8,0xff,0xd8,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0x02,0x00,0xa7,0xfe,0x1f,0x04,0x15,0x05,0xfc,0x00,0x14,0x00,0x25,0x00,0xc7,0xb5,0x02,0x1c,0x01,0x10,0x04,0x0f,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x07,0xb8,0xff,0xe8,0x40,0x3e,0x0b, -0x00,0x4d,0x0d,0x15,0x16,0x16,0x15,0x96,0x59,0x16,0x16,0x06,0x13,0x06,0x1b,0x95,0x59,0x06,0x01,0x00,0x1f,0x21,0x13,0x21,0x95,0x59,0x13,0x16,0x01,0x1c,0x0c,0x15,0x15,0x01,0x09,0x08,0x0c,0x06,0x4d,0x19,0x84,0x09,0x09,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x83,0x24,0xb8,0xff,0xf0, -0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x24,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x24,0x24,0x27,0x1f,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x02,0xb8,0xff,0xfa,0x40,0x09,0x0c,0x06,0x4d,0x02,0x0a,0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b, -0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0xe1,0x2b,0x11,0x39,0x2f,0x39,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x25,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16, -0x16,0x15,0x14,0x06,0x23,0x22,0x13,0x35,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x11,0x16,0x33,0x32,0x36,0x35,0x10,0x01,0x49,0xa2,0xdc,0xb9,0xad,0xc7,0x99,0x7a,0xb5,0xc3,0xf2,0xc5,0x98,0x2b,0x7b,0x9f,0xd2,0x74,0x7c,0x8c,0x86,0x81,0x91,0x2e,0xfd,0xf1,0x06,0x3c,0xbf,0xe2,0xb5,0xa0,0x78,0xd1,0x27,0x04,0x1d,0xd7,0xa6,0xc1, -0xf1,0x02,0xfe,0x83,0x11,0xad,0x6d,0xdd,0x9a,0x8c,0xfc,0x80,0x57,0x95,0x86,0x01,0x2f,0x00,0x00,0x01,0x00,0x05,0xfe,0x1f,0x03,0xe6,0x04,0x00,0x00,0x18,0x00,0x95,0xb3,0x7c,0x00,0x01,0x0c,0xb8,0xff,0xc0,0x40,0x1c,0x0b,0x0c,0x00,0x4c,0x00,0x05,0x0b,0x03,0x03,0x11,0x08,0x0f,0x03,0x1c,0x11,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08, -0x0b,0x06,0x4d,0x14,0x83,0x0f,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xe8,0x40,0x20,0x0b,0x06,0x4d,0x0f,0x0f,0x1a,0x05,0x09,0x08,0x08,0x19,0x0b,0x00,0x03,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x84,0x05,0x18,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c, -0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x05,0x05,0x1a,0x19,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0xc6,0x12,0x39,0x12,0x39,0x2f,0xcd,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0xc6,0x00,0x3f,0x3f,0xc4,0x12,0x17,0x39,0x31,0x30,0x2b,0x5d,0x05,0x10,0x07,0x23,0x36,0x11,0x26,0x02,0x27,0x33,0x12, -0x13,0x33,0x36,0x12,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x02,0x06,0x07,0x02,0x37,0x04,0xaf,0x0f,0x28,0xec,0x7a,0xbc,0xf9,0x5e,0x04,0xa6,0x7d,0x0a,0xab,0x06,0x3c,0x7f,0x31,0x45,0xfe,0xc0,0x5c,0xa9,0x01,0x46,0xd7,0x02,0x59,0xc2,0xfe,0x44,0xfe,0x4b,0xf4,0x01,0x57,0xa4,0x3e,0x44,0x35,0x20,0x86,0xfe,0xfe,0xfd,0x47,0x00,0x01, -0x00,0x4c,0xfe,0xcb,0x03,0x7f,0x05,0xec,0x00,0x17,0x00,0x69,0x40,0x41,0x0f,0x10,0x01,0x0f,0x07,0x01,0x10,0x06,0x13,0x06,0x0f,0x0b,0x0e,0x0b,0x96,0x59,0x0e,0x00,0x00,0x0c,0x0c,0x08,0x0b,0x0e,0x0e,0x16,0x01,0x16,0xed,0x03,0x03,0x19,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x11,0x83,0x08, -0x18,0x0d,0x06,0x4d,0x08,0x20,0x0c,0x06,0x4d,0x08,0x18,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0xc6,0x10,0xc0,0x2f,0x32,0x12,0x39,0x2f,0x00,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x24,0x11,0x10,0x01, -0x35,0x21,0x35,0x21,0x15,0x00,0x11,0x14,0x05,0x16,0x16,0x15,0x14,0x03,0x39,0xb3,0x62,0x7d,0x8a,0xfe,0x6b,0x02,0x54,0xfe,0x4c,0x02,0x5b,0xfd,0xaf,0x01,0x20,0xd3,0x96,0xfe,0xcb,0x4f,0x4d,0x44,0x3f,0x12,0x32,0x01,0x95,0x01,0xb2,0x01,0xee,0x04,0x85,0x87,0xfd,0xfb,0xfe,0x66,0xfa,0x2f,0x23,0x8b,0x6f,0x64,0x00,0x01,0x00,0x82, -0xfe,0x6c,0x03,0xf8,0x04,0x18,0x00,0x14,0x00,0x7f,0x40,0x2a,0x02,0x13,0x01,0x02,0x13,0x01,0x10,0x04,0x10,0x04,0x12,0x04,0xec,0x59,0x12,0x10,0x0c,0x0f,0x08,0x15,0x00,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x83,0x7f,0x01,0x01,0x01,0xb8,0xff,0xfc,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff, -0xfa,0x40,0x22,0x0c,0x06,0x4d,0x01,0x01,0x16,0x0c,0x0f,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x09,0x04,0x0d,0x06,0x4d,0x09,0x2f,0x16,0x01,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x3f,0x3f,0x2b,0x11,0x00, -0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x27,0x33,0x16,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa6,0xec,0x7c,0xa1,0xa3,0x24,0xa8,0x1c,0x04,0x6f,0xe5,0x01,0x5a,0xfe,0x6c,0x03,0xd0,0x01,0x47,0xb1,0x87,0xfd,0xb5,0x02,0xb6,0xea,0x60,0x4a,0x63,0xc5,0xfe,0x5e, -0x00,0x03,0x00,0x61,0xff,0xe8,0x04,0x50,0x05,0xfe,0x00,0x0a,0x00,0x10,0x00,0x17,0x00,0xc7,0x40,0x10,0x09,0x16,0x01,0x06,0x14,0x01,0x03,0x00,0x0e,0x01,0x0f,0x0a,0x01,0x10,0x06,0x09,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x15,0xb8,0xff,0xe8,0x40,0x33,0x0b,0x0c,0x00,0x4c,0x0d,0x18,0x0c,0x00,0x4d,0x0b,0x11,0x96,0x59,0x0b,0x06, -0x00,0x0b,0x96,0x2b,0x30,0x06,0x0d,0x95,0x59,0x06,0x01,0x00,0x15,0x95,0x59,0x00,0x16,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x83,0x0b,0x11,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf0,0x40,0x30,0x0b,0x06,0x4d,0x20,0x11,0x30,0x11, -0x02,0x11,0x11,0x19,0x10,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x00, -0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x00,0x2b,0x2b,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x05,0x22,0x00,0x11,0x10,0x00,0x33,0x20,0x11,0x10,0x00,0x13,0x02,0x21,0x22,0x02,0x07,0x05,0x21,0x12,0x12,0x33,0x32,0x12,0x02,0x4e,0xe9,0xfe,0xfc,0x01,0x0f,0xfe,0x01,0xe2,0xfe,0xf3,0x63,0x12,0xfe, -0xc9,0x96,0xb4,0x0a,0x02,0x9e,0xfd,0x61,0x05,0xb2,0x9d,0x99,0xad,0x18,0x01,0x92,0x01,0x6c,0x01,0x7f,0x01,0x99,0xfd,0x01,0xfe,0x86,0xfe,0x63,0x03,0x5c,0x02,0x2e,0xfe,0xd1,0xff,0x84,0xfe,0xe1,0xfe,0xd3,0x01,0x31,0x00,0x01,0x00,0xa6,0xff,0xf4,0x02,0x08,0x04,0x00,0x00,0x0b,0x00,0x49,0x40,0x32,0x03,0x40,0x0b,0x0c,0x00,0x4c, -0x05,0x0f,0x0b,0x09,0x02,0x09,0xec,0x59,0x02,0x0b,0x0b,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x84,0x04,0x0c,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x31,0x30, -0x2b,0x25,0x06,0x23,0x22,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x08,0x3e,0x3b,0xe9,0xa3,0x65,0x2a,0x30,0x0a,0x16,0x01,0x15,0x02,0xf7,0xfd,0x0e,0x8a,0x12,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x13,0x04,0x0e,0x00,0x14,0x00,0xa1,0x40,0x15,0x09,0x03,0x01,0x0d,0x02,0x01,0x06,0x13,0x01,0x0d,0x01,0x01,0x10,0x04,0x03,0x18, -0x0b,0x0c,0x00,0x4c,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x15,0x0b,0x06,0x4d,0x14,0x02,0x11,0x03,0x03,0x00,0x06,0x0c,0x11,0xec,0x59,0x0c,0x06,0x0f,0x04,0x00,0x15,0x14,0xb8,0xff,0xe0,0x40,0x21,0x0b,0x0c,0x00,0x4c,0x14,0x02,0x02,0x00,0x0e,0x0e,0x70,0x00,0x01,0x00,0x08,0x04,0x08,0x0d,0x06,0x4d, -0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0xb8,0xff,0xfa,0x40,0x0e,0x0d,0x06,0x4d,0x05,0x06,0x0c,0x06,0x4d,0x05,0x06,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0x5d,0x33,0x2f,0x11,0x39,0x2f,0x33,0x2b,0x00,0x3f,0x33,0x3f,0xc4,0x2b,0x11,0x12,0x00,0x39,0x11,0x12,0x39,0x39, -0x31,0x30,0x01,0x2b,0x2b,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x21,0x23,0x01,0x07,0x11,0x23,0x11,0x33,0x11,0x01,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x04,0x13,0xcb,0xfe,0x8e,0x8d,0xa3,0xa3,0x01,0x13,0x75,0x71,0x2e,0x48,0x22,0x1e,0x32,0x42,0x90,0x73,0x01,0xf4,0x98,0xfe,0xa4,0x04,0x00,0xfe, -0x0e,0x01,0x38,0x85,0x43,0x07,0x91,0x08,0x9c,0x7d,0x00,0x01,0xff,0xfe,0x00,0x00,0x03,0xdf,0x05,0xee,0x00,0x10,0x00,0x5b,0x40,0x23,0x0b,0x02,0x01,0x07,0x10,0x01,0x08,0x05,0x01,0x06,0x03,0x01,0x03,0x0f,0x01,0x01,0x10,0x06,0x02,0x05,0x05,0x00,0x0d,0x0a,0x08,0x0d,0x08,0xec,0x59,0x0d,0x00,0x03,0x00,0x15,0x10,0xb8,0xff,0xe0, -0x40,0x0e,0x0c,0x00,0x4d,0x0a,0x02,0x05,0x0a,0x10,0x04,0x11,0x00,0x00,0x12,0x04,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5f,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x01,0x01,0x23,0x01,0x27,0x26,0x23,0x22,0x07,0x35,0x36, -0x33,0x32,0x16,0x17,0x03,0xdf,0xb1,0xfe,0xe9,0xfe,0x9c,0xb5,0x01,0xcf,0x43,0x35,0x67,0x36,0x44,0x40,0x42,0x70,0x8b,0x3e,0x03,0x3b,0xfc,0xc5,0x03,0xf8,0xc5,0x9b,0x13,0x9d,0x0c,0x7f,0xb2,0x00,0x00,0x01,0x00,0xa7,0xfe,0x1f,0x04,0x78,0x04,0x00,0x00,0x1d,0x00,0x9f,0x40,0x6e,0x0f,0x03,0x01,0x10,0x05,0x0e,0x18,0x0b,0x0c,0x00, -0x4c,0x01,0x18,0x0b,0x0c,0x00,0x4c,0x11,0x08,0x0f,0x04,0x00,0x0d,0x02,0x0d,0x95,0x59,0x02,0x16,0x1a,0x15,0x95,0x59,0x1a,0x16,0x07,0x1c,0x17,0x17,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x84,0x00,0x7f,0x10,0x01,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06, -0x4d,0x10,0x10,0x1f,0x07,0x0a,0x0a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0x04,0x0d,0x06,0x4d,0x07,0x40,0x1f,0x01,0x2f,0x1f,0x01,0x5d,0x5d,0x2f,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0x33,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x3f,0x3f, -0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0xc4,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x25,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x03,0x48,0x58,0xc7,0x9b,0x40,0x04,0xa3,0xa3,0x83,0x6c,0x74,0x86,0xa3,0x7a, -0x17,0x11,0x35,0x2a,0x55,0x60,0x16,0xae,0xc6,0x7c,0xfd,0xbb,0x05,0xe1,0xfd,0x90,0x7a,0x9a,0xb0,0x8c,0x02,0x48,0xfd,0x2f,0xa6,0x05,0x89,0x0d,0x58,0x5e,0x00,0x01,0x00,0x0c,0x00,0x00,0x03,0xc6,0x04,0x00,0x00,0x0c,0x00,0x6b,0x40,0x0a,0x74,0x03,0x01,0x79,0x01,0x01,0x76,0x00,0x01,0x03,0xb8,0xff,0xf8,0x40,0x0c,0x0c,0x00,0x4d, -0x03,0x09,0x0f,0x04,0x00,0x15,0x08,0x08,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x06,0x83,0x0b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x0b,0x0b,0x0e,0x03,0x08,0x0b,0x06,0x4d,0x03,0x02,0x2f,0x33,0x2b, -0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x3f,0x33,0x3f,0x33,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x33,0x01,0x00,0x11,0x34,0x27,0x33,0x16,0x15,0x10,0x02,0x48,0xa4,0xfe,0x68,0xb5,0x01,0x4f,0x01,0x10,0x22,0xb1,0x17,0x04,0x00,0xfc,0x9c,0x01,0x57,0x01,0x3b,0x7a,0x58,0x46,0x74,0xfe,0x86,0x00, -0x00,0x01,0x00,0x4d,0xfe,0xc4,0x03,0x76,0x05,0xed,0x00,0x2f,0x00,0xb3,0x40,0x28,0x0f,0x08,0x01,0x10,0x05,0x28,0x18,0x0b,0x0c,0x00,0x4c,0x0b,0x18,0x0b,0x0c,0x00,0x4c,0x0c,0x26,0x1f,0x1f,0x26,0x95,0x59,0x1f,0x1f,0x16,0x06,0x18,0x15,0x13,0x16,0x15,0x16,0x15,0x95,0x59,0x16,0x00,0x2b,0xb8,0xff,0xf0,0x40,0x1e,0x0f,0x16,0x48, -0x2b,0x06,0x15,0x00,0x0c,0x23,0x12,0x18,0x15,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x83,0x0f,0x0f,0x09,0x23,0x18,0x18,0x2e,0x01,0x2e,0x84,0x03,0xb8,0xff,0xf8,0x40,0x27,0x0c,0x06,0x4d,0x03,0x03,0x31,0x29,0x08,0x0d,0x06,0x4d,0x29,0x08,0x0c,0x06,0x4d,0x29,0x08,0x0b,0x06,0x4d,0x29,0x83,0x09,0x18,0x0d,0x06,0x4d,0x09,0x20,0x0c,0x06, -0x4d,0x09,0x20,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0xe1,0xc6,0x10,0xc0,0x2f,0xc6,0x12,0x39,0x2f,0xe1,0x2b,0xc6,0x12,0x39,0x12,0x39,0x00,0x2f,0x3f,0x33,0x2b,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x10,0xc4,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e, -0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x04,0x23,0x35,0x21,0x15,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x36,0x33,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x05,0x16,0x16,0x15,0x14,0x03,0x30,0xb3,0x61,0x5d,0xa2,0xc1,0xd1,0xa3,0x96,0x6b,0x73,0xc0,0xa4,0xfe, -0xc0,0x26,0x02,0x5e,0xc7,0xee,0x58,0x89,0x2d,0x17,0x32,0x31,0x1d,0x30,0x41,0xaa,0xe3,0x01,0x1c,0xc9,0x9b,0xfe,0xc4,0x4e,0x53,0x3b,0x49,0x14,0x19,0xd7,0xad,0x84,0xce,0x37,0x1d,0x83,0x59,0x70,0xb2,0x27,0x07,0x05,0x86,0x89,0x1f,0xa5,0x73,0x47,0x62,0x28,0x03,0x03,0x96,0x03,0xa1,0x87,0xdb,0x2d,0x20,0x8b,0x76,0x69,0xff,0xff, -0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00,0x00,0x02,0x00,0xa1,0xfe,0x74,0x04,0x50,0x04,0x18,0x00,0x0e,0x00,0x1a,0x00,0x83,0x40,0x27,0x0f,0x06,0x01,0x10,0x06,0x07,0x17,0x95,0x59,0x07,0x10,0x0f,0x00,0x12,0x0d,0x12,0x95,0x59,0x0d,0x16,0x02,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a, -0x08,0x0b,0x06,0x4d,0x0a,0x83,0x14,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x14,0xb8,0xff,0xe8,0x40,0x19,0x0b,0x06,0x4d,0x14,0x14,0x1c,0x0f,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xfc,0x40,0x0c,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x2f,0x1c,0x01,0x5d,0x2f, -0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23,0x11,0x34,0x12,0x33,0x32,0x00,0x15,0x10,0x02,0x23,0x22,0x03,0x16,0x16,0x33,0x20,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x48,0x04,0xa3, -0xe6,0xde,0xdf,0x01,0x0c,0xf7,0xdd,0xc1,0x77,0x27,0xa4,0x59,0x01,0x3e,0xb2,0x8c,0x8f,0x95,0x63,0xfe,0x11,0x03,0x9a,0xf7,0x01,0x13,0xfe,0xda,0xe1,0xfe,0xfb,0xfe,0xdc,0x01,0x1b,0x3e,0x51,0x01,0x94,0xaa,0xda,0xc6,0xba,0x00,0x00,0x01,0x00,0x57,0xfe,0xc4,0x03,0x81,0x04,0x19,0x00,0x1c,0x00,0x8f,0x40,0x14,0x0f,0x07,0x01,0x10, -0x04,0x13,0x30,0x0b,0x0c,0x00,0x4c,0x0f,0x11,0x0c,0x11,0x95,0x59,0x0c,0x10,0x18,0xb8,0xff,0xf0,0x40,0x0a,0x10,0x16,0x48,0x18,0x06,0x15,0x00,0x01,0x01,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x37,0x0c,0x06,0x4d,0x03,0xef,0x1b,0x10,0x0d,0x06,0x4d,0x1b,0x10,0x0c,0x06,0x4d,0x1b,0x0e,0x0e,0x1e,0x14, -0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x83,0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09,0x18,0x0b,0x06,0x4d,0x2f,0x09,0x01,0x09,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xd4,0x2b,0x2b,0xf1,0x2b,0x2b,0xc2,0x2f,0x00,0x2f,0x3f,0x33,0x2b,0x3f,0x2b,0x00,0x18, -0x10,0xc6,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x10,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x15,0x14,0x1e,0x02,0x05,0x16,0x15,0x14,0x03,0x3b,0xb5,0x62,0x7b,0x84,0xc2,0xd0,0x01,0x2f,0xec,0x7f,0x65,0x72,0x81,0x99,0xc9,0x2e,0x58,0x3b,0x01,0x19,0xa6,0xfe,0xc4,0x4c,0x58, -0x46,0x3f,0x11,0x19,0xe6,0xb2,0x01,0x18,0x01,0x52,0x34,0xa7,0x4f,0xfe,0xfa,0xc5,0x47,0x6c,0x45,0x12,0x4b,0x3e,0xb1,0x69,0x00,0x01,0x00,0x14,0xff,0xe6,0x04,0x0e,0x04,0x07,0x00,0x1c,0x00,0xa4,0xb7,0x0a,0x1a,0x01,0x05,0x09,0x01,0x10,0x09,0xb8,0xff,0xe0,0x40,0x2d,0x0b,0x0c,0x00,0x4c,0x13,0x0f,0x0f,0x03,0x01,0x16,0x03,0x03, -0x40,0x24,0x28,0x48,0x03,0x40,0x08,0x0f,0x19,0x0e,0xec,0x59,0x19,0x16,0x13,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x84,0x11,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x11,0x11,0x1e,0x05,0x0c,0x08,0x0d, -0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x1c,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x1c,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x1c,0x2f,0x1e,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x1a,0xcd,0x2b,0x5f, -0x5e,0x5d,0x3f,0x31,0x30,0x2b,0x01,0x5e,0x5d,0x5d,0x13,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x10,0x03,0x33,0x16,0x11,0x14,0x02,0x23,0x22,0x26,0x35,0xae,0x29,0x38,0x1a,0x1f,0x30,0x2f,0x7c,0x61,0x01,0x0d,0x7f,0x8d,0x93,0xb7,0x81,0xe8,0xc9,0xd0,0xdf,0x02,0xc7,0x5b,0x55,0x07, -0x8a,0x0d,0x94,0xa5,0xfe,0xff,0xfe,0xab,0xb1,0xa1,0x01,0x2b,0x01,0x0b,0xfa,0xfe,0xcb,0xe3,0xfe,0xf8,0xec,0xde,0x00,0x01,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x00,0x1d,0x00,0x8c,0xb9,0x00,0x13,0xff,0xe8,0x40,0x4e,0x0b,0x0c,0x00,0x4c,0x09,0x08,0x10,0x00,0x4d,0x03,0x18,0x0b,0x0c,0x00,0x4c,0x18,0x18,0x19,0x06,0x06,0x05, -0x07,0x17,0x07,0x15,0x15,0x14,0x09,0x09,0x0a,0x08,0x16,0x08,0x0d,0x16,0x01,0x02,0x07,0x01,0x10,0x04,0x0e,0x0c,0x11,0x0c,0xec,0x59,0x11,0x10,0x17,0x0f,0x1d,0x1b,0x02,0x1b,0xec,0x59,0x02,0x1c,0x08,0x1b,0x19,0x05,0x14,0x0a,0x05,0x0a,0x0e,0x16,0x17,0x17,0x00,0x00,0x1f,0x0e,0x07,0x0e,0x08,0x2f,0x33,0x33,0x2f,0x11,0x33,0x2f, -0x32,0x2f,0x33,0x11,0x39,0x39,0x11,0x33,0x11,0x33,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x2b,0x2b,0x2b,0x01,0x06,0x23,0x22,0x26,0x27,0x03,0x01,0x23,0x01,0x03,0x26,0x23,0x22,0x07,0x35, -0x36,0x33,0x32,0x16,0x17,0x13,0x01,0x33,0x01,0x13,0x16,0x33,0x32,0x37,0x04,0x46,0x2b,0x31,0x5a,0x82,0x4b,0x9f,0xfe,0xa1,0xb9,0x01,0xc6,0xae,0x42,0x48,0x30,0x28,0x22,0x49,0x56,0x6b,0x33,0x8c,0x01,0x11,0xb9,0xfe,0x89,0xec,0x44,0x48,0x25,0x29,0xfe,0x2a,0x09,0x86,0xac,0x01,0x6b,0xfd,0x6f,0x03,0x38,0x01,0x89,0x94,0x0e,0x9a, -0x0a,0x5c,0x78,0xfe,0xb6,0x02,0x06,0xfd,0x58,0xfd,0xf4,0x96,0x10,0x00,0x00,0x01,0x00,0x98,0xfe,0x1e,0x05,0x68,0x05,0x33,0x00,0x1b,0x00,0xec,0xb9,0x00,0x18,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x0f,0xb8,0xff,0xc0,0x40,0x15,0x0b,0x0c,0x00,0x4c,0x0d,0x1b,0x0f,0x14,0x12,0x07,0x04,0x15,0x04,0x15,0xec,0x59,0x04,0x16,0x05,0x1c, -0x1a,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1a,0x83,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf0,0x40,0x40,0x0b,0x06,0x4d,0x1b,0x0e,0x04,0x07,0x0c,0x42,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08, -0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x0c,0x1c,0x15,0x12,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x18,0x0b,0x06,0x4d,0x04,0xef,0x07,0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x07, -0xb8,0xff,0xfc,0x40,0x0d,0x0b,0x06,0x4d,0x07,0x07,0x1d,0x1c,0x40,0x1d,0x01,0x2f,0x1d,0x01,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39, -0x18,0x2f,0x3f,0x33,0x31,0x30,0x2b,0x2b,0x01,0x10,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x00,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x05,0x68,0xfe,0xe3,0xe9,0x18,0x94,0x18,0xeb,0xfe,0xe5,0xa6,0xc8,0x98,0x18,0x94,0x18,0x96,0xca,0xa6,0x02,0x2c,0xfe,0xf4,0xfe,0xc9,0xfe,0x35, -0x01,0xcb,0x01,0x36,0x01,0x0d,0x01,0xd4,0xfe,0x2c,0xc4,0xef,0x04,0xba,0xfb,0x46,0xee,0xc5,0x01,0xd4,0x00,0x01,0x00,0x77,0xff,0xe9,0x06,0x00,0x04,0x00,0x00,0x21,0x00,0xe3,0x40,0x2a,0x0b,0x21,0x01,0x04,0x1f,0x01,0x0b,0x04,0x01,0x04,0x02,0x01,0x0d,0x00,0x01,0x10,0x04,0x12,0x12,0x20,0x09,0x1b,0x0f,0x00,0x0e,0x03,0x20,0x15, -0x20,0x15,0xec,0x59,0x20,0x16,0x0d,0x1a,0x01,0x09,0x03,0x1a,0x1a,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x18,0x83,0x1d,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1d,0xb8,0xff,0xe8,0x40,0x4f,0x0b,0x06,0x4d,0x1d,0x0e,0x12,0x11,0x06,0x42,0x02,0x09, -0x01,0x09,0x09,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x83,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x18,0x0b,0x06,0x4d,0x06,0x06,0x22,0x00,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x84,0x11,0x06,0x0c,0x06,0x4d,0x11,0x11,0x23, -0x22,0x3f,0x23,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x5d,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x18,0x2f,0x5f,0x5e,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x18,0x3f,0xc4,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x31,0x30, -0x01,0x5d,0x5d,0x5d,0x5d,0x25,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x13,0x33,0x02,0x15,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x34,0x03,0x33,0x12,0x11,0x14,0x06,0x23,0x22,0x03,0x3d,0x04,0x67,0xca,0xbd,0xd4,0x7e,0xb7,0x8f,0x7a,0x6d,0xe6,0xa4,0xe5,0x6b,0x7b,0x8e,0xb6,0x7f,0xd5,0xbf,0xca,0xa8,0xbf, -0xff,0xe0,0x01,0x02,0x01,0x36,0xfe,0xc1,0xff,0x9f,0xaa,0x01,0x5a,0x01,0x1b,0xfe,0xe5,0xfe,0xa6,0xaa,0x9f,0xff,0x01,0x3f,0xfe,0xc9,0xfe,0xff,0xe1,0xfe,0xff,0xff,0xff,0xed,0xff,0xf4,0x02,0x34,0x05,0x77,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x70,0xff,0xf0,0x00,0x17,0x40,0x0d,0x02,0x01,0x19,0x1b,0x15,0x05, -0x06,0x3e,0x02,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x77,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x96,0xff,0xf0,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd8,0x40,0x0a,0x2c,0x26,0x00,0x16,0x25,0x02,0x01,0x29,0x11,0x26,0x00,0x2b,0x35,0x35, -0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x01,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x28,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf6,0x40,0x09,0x19,0x19,0x0c,0x0c,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x01,0x02,0x26, -0x01,0xd2,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x0f,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x05,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xe9,0x06,0x00,0x06,0x01,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x01,0x9f,0x02,0x02,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1b, -0x24,0x22,0x06,0x1d,0x25,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe3,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x8b,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x21,0x0f,0x02,0x03,0x3e,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, -0x35,0x00,0x00,0x01,0x00,0x29,0xff,0xee,0x05,0x1e,0x05,0x9a,0x00,0x1b,0x00,0xb6,0x40,0x2f,0x00,0x16,0x01,0x10,0x05,0x13,0x0a,0x91,0x59,0x13,0x13,0x10,0x0b,0x0d,0x11,0x10,0x11,0x91,0x59,0x10,0x03,0x01,0x03,0x1a,0x03,0x91,0x59,0x1a,0x13,0x0b,0x12,0x00,0x00,0x0b,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08,0x0c,0x06,0x4d,0x17,0x7d, -0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d,0x06,0x06,0x1d,0x13,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x7e,0x0c,0x11,0x11,0x1d,0x0e,0xb8,0xff,0xe8,0x40,0x0a,0x0d,0x06,0x4d,0x0e,0x0c,0x20,0x0d,0x06, -0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x0c,0x2f,0x2b,0x2b,0x2b,0xc6,0x2b,0x12,0x39,0x2f,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x2b, -0x31,0x30,0x00,0x5f,0x5e,0x5d,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x04,0x15,0x14,0x06,0x23,0x22,0x02,0xfe,0x42,0x5e,0x61,0x73,0xa9,0x98,0xf9,0xa8,0xfe,0x99,0x03,0xe3,0xfe,0x2c,0xfd,0xe2,0x01,0x07,0xc7,0xb5,0x5c,0x06,0x9a,0x21,0x8b,0x77,0x8b,0x9a, -0xfd,0x5a,0x05,0x02,0x98,0x98,0xfe,0x38,0xe6,0xd1,0xc0,0xd5,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x07,0x66,0x02,0x26,0x01,0x2c,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x50,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x15,0x08,0x06,0x01,0x05,0x3e,0x01,0x00,0x08,0x01,0x08,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0x00,0x01, -0x00,0x5e,0xff,0xe8,0x04,0x85,0x05,0xb2,0x00,0x18,0x00,0x97,0x40,0x5f,0x55,0x0a,0x01,0x59,0x00,0x01,0x5a,0x03,0x01,0x03,0x0f,0x03,0x01,0x0b,0x05,0x10,0x13,0x91,0x59,0x10,0x08,0x02,0x10,0x91,0x2b,0x30,0x00,0x0b,0x01,0x0c,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x00,0x18,0x01,0x0b,0x03,0x18,0x18,0x16,0x02,0x16, -0x91,0x59,0x02,0x13,0x11,0x11,0x13,0x00,0x0a,0x0a,0x1a,0x10,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x18,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x00,0x3f,0x2b, -0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x01,0x5f,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x15,0x21,0x16,0x00,0x33,0x32,0x37,0x04,0x85,0x9e,0xeb, -0xfe,0xd1,0xfe,0x91,0x01,0x85,0x01,0x35,0xd6,0x97,0xa3,0xcc,0xd7,0xfe,0xeb,0x18,0x02,0x7a,0xfd,0x84,0x10,0x01,0x11,0xd7,0xe0,0x9d,0x3c,0x54,0x01,0x8b,0x01,0x3f,0x01,0x5b,0x01,0xa5,0x3b,0xb3,0x56,0xfe,0xed,0xf1,0x97,0xef,0xfe,0xef,0x60,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x05,0xb2,0x02,0x06,0x00,0x36,0x00,0x00, -0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x02,0x00,0x10,0xff,0xe9,0x07,0x77,0x05,0x9a,0x00,0x19,0x00,0x21, -0x00,0xc0,0x40,0x49,0x0d,0x05,0x01,0x00,0x03,0x01,0x0b,0x17,0x01,0x0b,0x16,0x01,0x02,0x0d,0x01,0x10,0x04,0x12,0x14,0x0f,0x14,0x91,0x59,0x0f,0x13,0x00,0x1a,0x91,0x59,0x00,0x00,0x18,0x1b,0x18,0x0a,0x91,0x59,0x18,0x03,0x08,0x1b,0x91,0x59,0x08,0x12,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x18,0x18,0x08,0x11,0x04,0x08,0x0d,0x06,0x4d, -0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7d,0x1f,0xb8,0xff,0xf0,0x40,0x23,0x0d,0x06,0x4d,0x1f,0x10,0x0b,0x06,0x4d,0x1f,0x1f,0x23,0x00,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x7e,0x08,0x18,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x0c,0x0c,0x06,0x4d,0x08,0x18,0x0b, -0x06,0x4d,0x08,0x08,0x23,0x11,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x00, -0x5d,0x5d,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x02,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x11,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x04,0xa4,0x01,0x10,0xd7,0xec,0xf8,0xd9,0xfe,0x56,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0xeb, -0x96,0xa2,0xfe,0xc8,0x03,0x39,0xce,0xbf,0xc4,0xe8,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0xfd,0x08,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x7d,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0xb7,0x40,0x2f,0x0d,0x10,0x01,0x00,0x0e,0x01,0x10,0x04,0x13,0x0b,0x01,0x08, -0x08,0x01,0x91,0x59,0x08,0x08,0x14,0x06,0x0a,0x03,0x00,0x14,0x91,0x59,0x03,0x00,0x12,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x18,0xb8,0xff,0xe8,0x40,0x3e,0x0d,0x06,0x4d,0x18,0x10,0x0b,0x06,0x4d,0x18,0x18,0x1c,0x0b,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14, -0x08,0x0b,0x06,0x4d,0x14,0x7e,0x00,0x20,0x0d,0x06,0x4d,0x00,0x18,0x0b,0x06,0x4d,0x00,0x00,0x1c,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x7e,0x04,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39, -0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0xc4,0x2b,0x00,0x18,0x3f,0xc4,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32, -0x36,0x35,0x10,0x21,0x04,0x02,0xfd,0x62,0xa8,0xa8,0x02,0x9e,0xa8,0x01,0x10,0xd5,0xee,0xf9,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x02,0xa0,0xfd,0x60,0x05,0x9a,0xfd,0x9e,0x02,0x62,0xfd,0xa0,0xce,0xc0,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0x4a,0x05,0x9a,0x00,0x11,0x00,0xc6, -0x40,0x1c,0x02,0x10,0x01,0x02,0x10,0x01,0x10,0x04,0x0e,0x05,0x91,0x59,0x0e,0x0e,0x00,0x0b,0x08,0x0c,0x0b,0x0c,0x91,0x59,0x0b,0x03,0x06,0x00,0x12,0x0c,0xb8,0xff,0xf9,0xb3,0x0b,0x06,0x4d,0x09,0xb8,0xff,0xf9,0x40,0x15,0x0b,0x06,0x4d,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01, -0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x32,0x0b,0x06,0x4d,0x00,0x01,0x01,0x09,0x03,0x01,0x01,0x13,0x07,0x0c,0x0e,0x0e,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0x07,0x09,0x42,0x09,0x09,0x12,0x07,0x12,0x0d,0x06, -0x4d,0x07,0x0d,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x01,0x10,0xf1,0x2b,0x2b,0x2b,0x32,0xe0,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xc4,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x2b,0x31,0x30, -0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x21,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x20,0x11,0x05,0x4a,0xa8,0xfe,0xe3,0xfe,0xe9,0xa8,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x19,0x01,0xc3,0x01,0x85,0x01,0x27,0xfd,0x54,0x05,0x02,0x98,0x98,0xfe,0x3e,0xfe,0x45,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2, -0x07,0x66,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x8e,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x0f,0x12,0x12,0x09,0x0e,0x25,0x01,0x00,0x13,0x01,0x13,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x07,0x4f,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x07,0xcd,0x00,0x16, -0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0d,0x1c,0x16,0x0d,0x00,0x25,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x04,0xf2,0x05,0x9a,0x00,0x0b,0x00,0xb2,0xb9,0x00,0x02,0x01,0x30,0x40,0x1b,0x07,0x0b,0x03,0x04,0x00,0x00,0x09,0x91,0x59,0x00,0x12,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c, -0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0xb8,0x01,0x2c,0xb6,0x04,0x04,0x10,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x08,0x09,0x04,0xb8,0x01,0x2c,0x40,0x1e,0xff,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09, -0xb8,0xff,0xf8,0x40,0x1b,0x0b,0x06,0x4d,0x7f,0x09,0x01,0x09,0x09,0x0d,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x05,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b, -0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x3f,0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xfe,0x30,0x9a,0xfe,0x34,0xa8,0x02,0xe6,0xa8,0xfe,0x80,0x01,0x80,0x05,0x9a,0xfa,0xfe,0x05,0x02,0x00,0xff,0xff,0x00,0x16,0x00,0x00, -0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x9f,0x40,0x31,0x0d,0x0a,0x01,0x00,0x08,0x01,0x10,0x04,0x05,0x0d,0x91,0x59,0x05,0x05,0x0e,0x02,0x02,0x03,0x91,0x59,0x02,0x03,0x00,0x0e,0x91,0x59,0x00,0x12,0x03,0x03,0x0e,0x09,0x08,0x0d,0x06,0x4d, -0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x7d,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x1e,0x0c,0x06,0x4d,0x12,0x10,0x0b,0x06,0x4d,0x12,0x12,0x16,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00, -0xb8,0xff,0xf6,0x40,0x09,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x33,0x11,0x21,0x15,0x21,0x11,0x21, -0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x02,0xfe,0xfd,0xaa,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0x98,0xfe,0x38,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25, -0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x01,0x2c,0x00,0x00,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x05,0x9a,0x00,0x0d,0x00,0x13,0x00,0xcf,0xb7,0x0b,0x0f,0x91,0x59,0x0b,0x03,0x04,0x01,0xb8,0x01,0x30,0x40,0x22,0x0e,0x07,0x02,0x0c,0x02,0x0c,0x91,0x59,0x02,0x12,0x75,0x13,0x01,0x10,0x0a,0x0a, -0x0e,0x07,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x18,0x0b,0x06,0x4d,0x0d,0xba,0x01,0x2c,0x00,0x02,0xff,0xee,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xe0,0x40,0x17,0x0b,0x06,0x4d,0x02,0x02,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c, -0x7e,0x0e,0xb8,0xff,0xf0,0x40,0x21,0x0d,0x06,0x4d,0x0e,0x18,0x0c,0x06,0x4d,0x0e,0x20,0x0b,0x06,0x4d,0x0e,0x0e,0x15,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x06,0xb8,0x01,0x2c,0xb2,0x03,0x13,0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x07,0x2f, -0x2b,0x2b,0x33,0xd5,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0xc4,0x3f,0x2b,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21,0x11,0x33,0x21, -0x11,0x21,0x06,0x02,0x07,0x05,0x48,0x9b,0xfb,0xfd,0x9b,0x6f,0x90,0xc9,0x0d,0x02,0xa3,0xc1,0xfe,0x97,0xfe,0x94,0x10,0xbc,0x73,0xfe,0x7f,0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x07,0x02,0xbf,0x01,0x3c,0xfa,0xfe,0x04,0x6a,0xf7,0xfd,0x6a,0xdd,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06,0x00,0x28,0x00,0x00, -0x00,0x01,0xff,0xea,0x00,0x00,0x07,0x02,0x05,0x9a,0x00,0x1d,0x00,0xb1,0xb9,0x00,0x1d,0xff,0xf0,0x40,0x72,0x0c,0x06,0x4d,0x0e,0x10,0x0c,0x06,0x4d,0x5c,0x1b,0x01,0x1a,0x1b,0x01,0x53,0x10,0x01,0x15,0x10,0x01,0x53,0x0c,0x01,0x05,0x0c,0x15,0x0c,0x02,0x5c,0x01,0x01,0x03,0x0d,0x01,0x1d,0x01,0x02,0x10,0x1a,0x01,0x10,0x11,0x01, -0x0f,0x0b,0x1f,0x0b,0x02,0x0f,0x02,0x1f,0x02,0x02,0x0b,0x04,0x1b,0x10,0x16,0x03,0x0c,0x01,0x06,0x12,0x1d,0x00,0x06,0x0e,0x0d,0x07,0x1c,0x1c,0x00,0x20,0x0b,0x06,0x4d,0x00,0x0e,0x06,0x07,0x0d,0x42,0x0f,0x0d,0x0d,0x1e,0x16,0x15,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0x07, -0x1f,0x1e,0x2f,0x1f,0x3f,0x1f,0x02,0x5d,0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x11,0x33,0x2f,0xc6,0x2b,0x01,0x10,0xf0,0x2b,0xc2,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x2b,0x21, -0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x07,0x02,0xe1,0xfd,0xcf,0x18,0x0d,0x05,0x9f,0x04,0x0f,0x16,0xfd,0xcf,0xe3,0x02,0x91,0xfd,0x9b,0xce,0x02,0x1a,0x16,0x0f,0x04,0x9f,0x05,0x0d,0x18,0x02,0x1a,0xcd,0xfd,0x9b,0x02, -0x90,0x1c,0x16,0xfd,0x3e,0x02,0xc2,0x19,0x19,0xfd,0x70,0x02,0xe8,0x02,0xb2,0xfd,0x93,0x19,0x18,0x02,0x9e,0xfd,0x62,0x16,0x1b,0x02,0x6d,0xfd,0x4e,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x00,0x23,0x00,0xd7,0x40,0x13,0x09,0x20,0x01,0x06,0x1e,0x01,0x04,0x18,0x01,0x03,0x00,0x14,0x01,0x0f,0x00,0x01,0x10,0x05, -0x14,0xb8,0xff,0xc0,0x40,0x3c,0x0c,0x00,0x4d,0x00,0x40,0x0c,0x00,0x4d,0x1c,0x09,0x0a,0x0a,0x09,0x92,0x59,0x0a,0x0a,0x03,0x16,0x0f,0x13,0x1f,0x13,0x2f,0x13,0x03,0x09,0x03,0x13,0x11,0x16,0x11,0x92,0x59,0x16,0x04,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x09,0x03,0x01,0x03,0x22,0x03,0x92,0x59,0x22,0x13,0x1b,0x1f,0x09,0x09,0x06, -0x00,0x0e,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0e,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x0e,0x7d,0x19,0x19,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x7d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x0e,0x0b,0x06,0x4d,0x20,0x06,0x01,0x06,0x06,0x25,0x13,0x00, -0x3f,0x25,0x01,0x5d,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5f, -0x5d,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x60,0xa8,0xd5,0x9b,0xb7,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x9e,0xce,0xcc,0xea,0xfe,0xf0,0x94,0xae,0xfe,0xe8, -0xf3,0xf3,0x3c,0xb6,0x7b,0x96,0x7f,0x01,0x14,0x8b,0x8a,0x7e,0x6c,0x82,0x71,0xaa,0x58,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xc5,0xe9,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x00,0x13,0x00,0xa1,0x40,0x12,0x7a,0x12,0x01,0x79,0x11,0x01,0x75,0x08,0x01,0x75,0x07,0x01,0x12,0x08,0x0b,0x00,0x4d,0x08,0xb8,0xff, -0xf8,0x40,0x2c,0x0b,0x00,0x4d,0x0e,0x04,0x0b,0x13,0x03,0x09,0x00,0x12,0x12,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0x40,0x1a,0x0b,0x06,0x4d,0x01,0x01,0x15,0x08,0x0e,0x0c,0x08,0x0d,0x06, -0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x09,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x09,0x04,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x39,0x33,0x00,0x3f,0x32,0x3f,0x33, -0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x14,0x07,0x33,0x36,0x37,0x01,0x33,0x05,0x40,0xa8,0x0a,0x06,0x13,0x1b,0xfd,0x1e,0xd0,0xa8,0x08,0x04,0x16,0x22,0x02,0xd0,0xd8,0x04,0x0c,0x8c,0x39,0x31,0x29,0xfb,0x89,0x05,0x9a,0xfc,0x0e,0xa2,0x31,0x2c, -0x34,0x04,0x65,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x4e,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x07,0xcd,0x00,0xa8,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0a,0x1a,0x14,0x0a,0x13,0x25,0x01,0x17,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e, -0x00,0x00,0x00,0x01,0x00,0x10,0xff,0xe9,0x04,0xa4,0x05,0x9a,0x00,0x12,0x00,0x74,0x40,0x43,0x0d,0x10,0x01,0x0b,0x0f,0x01,0x02,0x06,0x01,0x10,0x04,0x07,0x18,0x0b,0x00,0x4d,0x12,0x02,0x91,0x59,0x12,0x03,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x13,0x00,0x12,0x03,0x11,0x11,0x0b,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d, -0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x04,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0xb6,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0b,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x33,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x31,0x30,0x00,0x2b,0x01,0x5f, -0x5e,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x02,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x04,0xa4,0xa8,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0x00,0xff,0xff,0x00,0xbc, -0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xfc,0x05,0x9a,0x02,0x06,0x01,0xb5,0x00,0x00,0xff,0xff,0x00,0xbc, -0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0xe7,0x04,0x96,0x05,0x9a,0x00,0x15,0x00,0x53,0x40,0x2e,0x0a,0x15,0x01,0x05, -0x0e,0x01,0x03,0x03,0x10,0x0c,0x00,0x4d,0x00,0x10,0x01,0x10,0x05,0x10,0x0c,0x04,0x0e,0x00,0x03,0x07,0x09,0x04,0x09,0x91,0x59,0x04,0x13,0x76,0x11,0x01,0x11,0x0c,0x14,0x06,0x14,0x00,0x00,0x16,0x06,0x06,0x0e,0x0d,0x2f,0x33,0x33,0x2f,0x11,0x33,0x2f,0x32,0x11,0x12,0x39,0x39,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x33, -0x12,0x39,0x39,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x5d,0x01,0x01,0x02,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0x96,0xfe,0x45,0x76,0xdc,0x82,0x6b,0x48,0x56,0x50,0x51,0x88,0x4f,0xfe,0x1a,0xbf,0x01,0x58,0x09,0x1c,0x02,0x03,0x26,0x01,0x3f,0x05,0x9a,0xfc, -0x17,0xfe,0xf6,0xc0,0x1f,0xaa,0x33,0x7d,0x9e,0x04,0x02,0xfd,0x02,0x13,0x4a,0x09,0x58,0x02,0xfa,0x00,0x00,0x03,0x00,0x5e,0x00,0x00,0x05,0x81,0x05,0xc2,0x00,0x15,0x00,0x1e,0x00,0x27,0x01,0x02,0xb9,0x00,0x13,0xff,0xe8,0x40,0x23,0x0c,0x00,0x4d,0x1f,0x03,0x00,0x17,0x00,0x17,0x91,0x59,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x91,0x59, -0x0e,0x00,0x0e,0x00,0x01,0x0d,0x03,0x01,0x12,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x24,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1b,0x7d,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x2a, -0x0c,0x06,0x4d,0x12,0x20,0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x08,0x0b,0x06,0x4d,0x24,0x7d,0x07,0x18,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe0,0x40,0x1d,0x0b,0x06,0x4d,0x07,0x07,0x28,0x0b,0x0e,0x16,0x20,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01, -0x08,0x0c,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01,0xef,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf5,0x40,0x0a,0x0b,0x06,0x4d,0x02,0x02,0x29,0x28,0x20,0x29,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1, -0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x25,0x15,0x23,0x35,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x03,0x11, -0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x3e,0x9c,0x1b,0xf0,0xfe,0xc7,0x01,0x38,0xf3,0x19,0x9c,0x18,0xf6,0x01,0x35,0xfe,0xc7,0xf0,0x1a,0x1a,0xab,0xce,0xce,0xad,0xb4,0x19,0xaa,0xd1,0xce,0xab,0xbc,0xbc,0xbc,0x01,0x47,0xef,0xe4,0x01,0x38,0xb4,0xb4,0xfe,0xcd,0xe9,0xec,0xfe,0xb6, -0x03,0xc5,0xfc,0xcf,0xe3,0xbd,0xb4,0xdd,0xfc,0xcf,0x03,0x31,0xe0,0xb1,0xbe,0xe2,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0xbc,0xfe,0x7f,0x05,0xb2,0x05,0x9a,0x00,0x0b,0x00,0xb4,0xb9,0x00,0x00,0x01,0x30,0x40,0x1c,0x05,0x09,0x03,0x07,0x02,0x0a,0x02,0x0a,0x91,0x59,0x02, -0x12,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x10,0x0b,0x06,0x4d,0x0b,0xba,0x01,0x2c,0x00,0x02,0xff,0xe4,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xec,0x40,0x17,0x0b,0x06,0x4d,0x02,0x02,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x7e, -0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xe0,0x40,0x1d,0x0c,0x06,0x4d,0x07,0x10,0x0b,0x06,0x4d,0x07,0x07,0x0d,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x03,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0xe1,0x2b, -0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0xb2,0x9b,0xfb,0xa5,0xa8,0x02,0xe6,0xa8,0xc0,0xfe,0x7f,0x01,0x81,0x05,0x9a,0xfa,0xfe, -0x05,0x02,0xfa,0xfe,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x10,0x00,0x85,0x40,0x34,0x0f,0x06,0x01,0x10,0x04,0x0e,0x02,0x0c,0x04,0x0c,0x91,0x59,0x04,0x04,0x00,0x09,0x10,0x03,0x00,0x12,0x02,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x7e,0x7f,0x0f,0x01,0x0f,0x20,0x0d, -0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x18,0x0b,0x06,0x4d,0x0f,0x0f,0x12,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x7e,0x08,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x08,0x0c,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b, -0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x32,0x12,0x39,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0xa8,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0x02,0x85,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02, -0x8c,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0xd9,0x05,0x9a,0x00,0x0b,0x00,0xa7,0x40,0x0e,0x07,0x03,0x0b,0x03,0x05,0x00,0x09,0x00,0x09,0x91,0x59,0x00,0x12,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x22,0x0b,0x06,0x4d,0x09,0x7e,0x00,0x12,0x0d,0x06,0x4d,0x00, -0x0e,0x08,0x01,0x05,0x42,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7e,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x28,0x0c,0x06,0x4d,0x01,0x01,0x0c,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x05,0x06,0x0d,0x06,0x4d, -0x10,0x05,0x01,0x05,0x05,0x0d,0x0c,0x2f,0x0d,0x4f,0x0d,0x02,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf1,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x33,0x33,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11, -0x21,0x11,0x33,0x06,0xd9,0xf9,0xe3,0xa8,0x02,0x13,0xa7,0x02,0x13,0xa8,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0x00,0x01,0x00,0xbc,0xfe,0x7f,0x07,0x9a,0x05,0x9a,0x00,0x0f,0x00,0xff,0xb9,0x00,0x01,0x01,0x30,0x40,0x1e,0x09,0x05,0x0d,0x03,0x0b,0x07,0x02,0x0e,0x02,0x0e,0x91,0x59,0x02,0x12,0x0f,0x08,0x0d,0x06,0x4d, -0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x10,0x0b,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb5,0x0b,0x06,0x4d,0x02,0x02,0x0b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d, -0x0b,0x7e,0x0e,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x0e,0xb8,0xff,0xf8,0x40,0x23,0x0c,0x06,0x4d,0x0e,0x06,0x0b,0x06,0x4d,0x0e,0x0e,0x0a,0x07,0x03,0x42,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x6f,0x03,0x01,0x03,0xb8,0xff,0xf0,0x40,0x18,0x0d,0x06,0x4d,0x03,0x03,0x10,0x0a,0x08, -0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x7e,0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf0,0x40,0x0f,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x4f,0x11,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b, -0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc1,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x07,0x9a,0x9b,0xf9,0xbd,0xa8,0x02,0x13,0xa8,0x02,0x12, -0xa8,0xc1,0xfe,0x7f,0x01,0x81,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x00,0x02,0x00,0x29,0x00,0x00,0x05,0x42,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x98,0x40,0x29,0x0d,0x0a,0x01,0x00,0x08,0x01,0x10,0x04,0x05,0x0d,0x91,0x59,0x05,0x05,0x0e,0x04,0x04,0x01,0x91,0x59,0x04,0x03,0x00,0x0e,0x91,0x59,0x00,0x12, -0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x7d,0x12,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x25,0x0c,0x06,0x4d,0x12,0x12,0x16,0x00,0x02,0x02,0x15,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x70,0x00,0x01,0x00,0x10,0x0d,0x06,0x4d,0x00,0xb8, -0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xe0,0xb3,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x11,0x21,0x35,0x21,0x11, -0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0xc6,0xfe,0x63,0x02,0x45,0x01,0x11,0xd5,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa3,0xfe,0xc8,0x05,0x00,0x9a,0xfd,0xa0,0xce,0xc0,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x00,0x03,0x00,0xbc,0x00,0x00,0x05,0x87,0x05,0x9a,0x00,0x03, -0x00,0x0e,0x00,0x16,0x00,0xb0,0x40,0x44,0x0d,0x0c,0x01,0x00,0x0a,0x01,0x10,0x04,0x07,0x0f,0x91,0x59,0x07,0x07,0x10,0x02,0x05,0x03,0x01,0x04,0x04,0x10,0x91,0x59,0x04,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x01,0x18,0x04,0x0b, -0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x7d,0x14,0xb8,0xff,0xe8,0x40,0x1e,0x0d,0x06,0x4d,0x00,0x14,0x10,0x14,0x02,0x14,0x14,0x18,0x07,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x7e,0x04,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x04,0xb8, -0xff,0xfd,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x21,0x32, -0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x05,0x87,0xa8,0xa8,0xfb,0x35,0xa8,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfd,0xa0,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a, -0x00,0x0a,0x00,0x12,0x00,0x87,0x40,0x29,0x0d,0x08,0x01,0x00,0x06,0x01,0x10,0x04,0x03,0x0b,0x91,0x59,0x03,0x03,0x0c,0x01,0x03,0x00,0x0c,0x91,0x59,0x00,0x12,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7d,0x10,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xf8,0x40,0x1e,0x0c,0x06, -0x4d,0x10,0x18,0x0b,0x06,0x4d,0x10,0x10,0x14,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00, -0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x33,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0xa8,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0xfd,0xa0,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00, -0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x90,0x05,0xb2,0x00,0x18,0x00,0xb9,0x40,0x14,0x02,0x0f,0x01,0x0d,0x00,0x01,0x02,0x16,0x01,0x02,0x12,0x01,0x10,0x04,0x16,0x10,0x0b,0x00,0x4d,0x0f,0xb8,0xff,0xc0,0x40,0x45,0x0c,0x00,0x4d,0x00,0x40,0x0c,0x00,0x4d,0x08,0x07,0x91,0x59,0x08,0x11,0x17,0x08,0x91,0x2b,0x30,0x00,0x0e,0x01,0x0c, -0x03,0x0e,0x0e,0x0c,0x11,0x0c,0x91,0x59,0x11,0x04,0x00,0x01,0x01,0x0b,0x03,0x01,0x01,0x03,0x17,0x03,0x91,0x59,0x17,0x13,0x07,0x07,0x00,0x09,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x7d,0x06,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff, -0xe8,0x40,0x0b,0x0b,0x06,0x4d,0x20,0x06,0x01,0x06,0x06,0x1a,0x0e,0x00,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x01, -0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x00,0x37,0x21,0x35,0x21,0x26,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x68,0x9d,0xe1,0xd6,0x01,0x11,0x10,0xfd,0x85,0x02,0x79,0x1a,0xfe,0xf1,0xd9,0xcb,0xa6,0x9a,0xd7,0x01,0x35,0x01,0x82,0xfe,0x8d,0xfe,0xd1,0xe7,0x3c,0xa3,0x60,0x01, -0x0f,0xf1,0x97,0xf5,0x01,0x0f,0x56,0xb0,0x3e,0xfe,0x61,0xfe,0xa5,0xfe,0xc1,0xfe,0x6f,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x07,0xc6,0x05,0xb2,0x00,0x12,0x00,0x1e,0x00,0xcf,0x40,0x2d,0x0a,0x13,0x91,0x59,0x0a,0x04,0x06,0x01,0x91,0x59,0x06,0x04,0x02,0x06,0x91,0x2b,0x30,0x04,0x03,0x10,0x19,0x91,0x59,0x10,0x13,0x02,0x12,0x0d, -0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x7d,0x1c,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x1c,0xb8,0xff,0xe7,0x40,0x19,0x0b,0x06,0x4d,0x1c,0x1c,0x20,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x7d,0x07,0x00,0xb8, -0xff,0xf0,0x40,0x26,0x0d,0x06,0x4d,0x00,0x04,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x20,0x00,0x01,0x00,0x00,0x20,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x03,0x03,0x0b,0x06,0x4d,0x03, -0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x12,0x00,0x21,0x20,0x00,0x11,0x10, -0x00,0x21,0x20,0x00,0x01,0x22,0x00,0x11,0x10,0x12,0x33,0x32,0x12,0x11,0x10,0x02,0x02,0xb2,0xfe,0xb2,0xa8,0xa8,0x01,0x54,0x1e,0x01,0x5e,0x01,0x18,0x01,0x21,0x01,0x59,0xfe,0x9e,0xfe,0xcf,0xfe,0xe2,0xfe,0xa5,0x02,0x8c,0xe3,0xfe,0xff,0xf4,0xdd,0xe6,0xfd,0xf3,0x02,0x9e,0xfd,0x62,0x05,0x9a,0xfd,0x9b,0x01,0x2c,0x01,0x51,0xfe, -0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x01,0x7c,0x03,0xb6,0xfe,0xc8,0xfe,0xef,0xfe,0xe5,0xfe,0xc9,0x01,0x32,0x01,0x17,0x01,0x20,0x01,0x32,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x03,0xfd,0x05,0x9a,0x00,0x14,0x00,0x1d,0x00,0xa6,0x40,0x6d,0x04,0x11,0x01,0x0b,0x0f,0x01,0x0d,0x0a,0x01,0x0f,0x09,0x01,0x02,0x07,0x01,0x10,0x04,0x06, -0x18,0x0b,0x00,0x4d,0x0c,0x02,0x15,0x15,0x02,0x91,0x59,0x15,0x15,0x13,0x00,0x13,0x17,0x91,0x59,0x13,0x03,0x07,0x00,0x12,0x07,0x08,0x0b,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x09,0x0c,0x09,0x01,0x08,0x1a,0x08,0x0c,0x06,0x4d,0x1a,0x08,0x0b,0x06,0x4d,0x1a,0x7d,0x10,0x10,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06, -0x4d,0x00,0x08,0x0b,0x06,0x4d,0x15,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x07,0x08,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x33,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x39,0x11,0x33,0x2b,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18, -0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x21,0x23,0x11,0x23,0x22,0x06,0x07,0x03,0x23,0x13,0x36,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0xfd,0xa8,0xd1,0x3c,0x5b,0x34,0xb4,0xc8,0xda,0x15,0x57,0x3a,0x8f,0x9f,0xff, -0xcf,0x01,0xa0,0xa8,0xe9,0x8e,0x9d,0xa0,0x87,0x02,0x62,0x41,0x71,0xfe,0x50,0x01,0xdf,0x2f,0x69,0x16,0x04,0x1f,0xc8,0x8e,0xb7,0xdd,0xfd,0x60,0x02,0x08,0x86,0x7a,0x7a,0x8e,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x04,0x18,0x02,0x06,0x00,0x44,0x00,0x00,0x00,0x02,0x00,0x77,0xff,0xe8,0x04,0x40,0x05,0xf8,0x00,0x19,0x00,0x27, -0x00,0x96,0x40,0x2c,0x1a,0x07,0x26,0x0a,0x26,0x95,0x59,0x0a,0x0a,0x20,0x00,0x00,0x01,0xec,0x59,0x00,0x01,0x10,0x20,0x95,0x59,0x10,0x16,0x00,0x00,0x1b,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x23,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x23,0xb8,0xff,0xe8,0x40,0x30,0x0b,0x06,0x4d, -0x20,0x23,0x30,0x23,0x02,0x23,0x23,0x29,0x07,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x83,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x2f,0x29,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b, -0x2b,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x01,0x15,0x06,0x07,0x0e,0x02,0x07,0x33,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x02,0x11,0x34,0x12,0x36,0x36,0x37,0x36,0x01,0x15,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0xbe,0x29, -0x5b,0xe1,0xb3,0x73,0x10,0x04,0x78,0xde,0xcb,0xf8,0xfe,0xfd,0xdb,0xec,0xff,0x5c,0xa3,0xc7,0xf2,0x60,0xfd,0x92,0x01,0x2e,0x56,0x75,0x4b,0x89,0xa9,0xad,0x93,0xce,0x05,0xf8,0x9a,0x1e,0x0f,0x22,0x3f,0xce,0xc6,0xae,0xfe,0xea,0xe4,0xeb,0xfe,0xe3,0x01,0x4f,0x01,0x37,0xf2,0x01,0x51,0xaa,0x40,0x2b,0x16,0xfc,0xbe,0x8e,0x50,0x9a, -0x76,0x3a,0xcd,0xa0,0xb0,0xcf,0x00,0x03,0x00,0xa6,0x00,0x00,0x03,0xd1,0x04,0x00,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0xa5,0xb9,0x00,0x03,0xff,0xe8,0x40,0x33,0x0b,0x0c,0x00,0x4c,0x07,0x14,0x0e,0x0e,0x14,0x95,0x59,0x0e,0x0e,0x01,0x15,0x01,0x0d,0x95,0x59,0x01,0x0f,0x00,0x15,0x95,0x59,0x00,0x15,0x07,0x15,0x11,0x84,0x05,0x05, -0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x20,0x18,0x30,0x18,0x02,0x18,0x18,0x1c,0x0e,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x84,0x00,0xb8,0xff,0xfc, -0x40,0x0e,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc0,0x2f,0xe1,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x33,0x11,0x21, -0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x11,0x21,0x32,0x35,0x34,0x23,0xa6,0x01,0xbe,0x97,0xaf,0xc4,0xeb,0xc1,0x8f,0xfe,0xc9,0xf6,0xc6,0xb2,0xfe,0xf6,0x01,0x1c,0xc7,0xdf,0x04,0x00,0x86,0x74,0xc7,0x2b,0x1e,0xcf,0x7d,0xaa,0x03,0x74,0xfe,0xe0,0x9a,0x86,0xfe,0x54,0xfe,0xc4, -0xa1,0x9b,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xdf,0x04,0x00,0x00,0x05,0x00,0x47,0x40,0x20,0x05,0x00,0x95,0x59,0x05,0x0f,0x02,0x15,0x70,0x00,0x01,0x00,0x00,0x07,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xf8,0xb6,0x0b,0x06, -0x4d,0x03,0x2f,0x07,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x5d,0x00,0x3f,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x02,0xdf,0xfe,0x6b,0xa4,0x02,0x39,0x03,0x74,0xfc,0x8c,0x04,0x00,0x00,0x02,0x00,0x12,0xfe,0x8b,0x04,0x23,0x04,0x00,0x00,0x0c,0x00,0x11,0x00,0xba,0x40,0x0d,0x00,0x11,0x01,0x10, -0x05,0x0a,0x0e,0x95,0x59,0x0a,0x0f,0x04,0x00,0xb8,0x01,0x31,0x40,0x1c,0x0d,0x07,0x02,0x0b,0x02,0x0b,0x95,0x59,0x02,0x15,0x0f,0x09,0x09,0x0d,0x07,0x0c,0x0c,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0xed,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf8,0x40,0x20,0x0b, -0x06,0x4d,0x02,0x02,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0d,0x12,0x0d,0x06,0x4d,0x0d,0x0d,0x13,0x07,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x06,0xb8,0x01,0x2c,0x40,0x0d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x03,0x11,0x11,0x07,0x30,0x13, -0x01,0x5d,0x2f,0x33,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0xc4,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x00,0x13,0x21,0x11, -0x33,0x21,0x11,0x23,0x02,0x03,0x04,0x23,0x8b,0xfd,0x06,0x8c,0x5b,0x01,0x06,0x04,0x02,0x14,0x98,0xfe,0xc4,0xe3,0x1b,0xce,0xfe,0x8b,0x01,0x75,0xfe,0x8b,0x02,0x00,0x01,0x7a,0x01,0xfb,0xfc,0x8b,0x02,0xea,0xfe,0x62,0xfe,0xb4,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x04,0x18,0x02,0x06,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x04, -0x00,0x00,0x05,0xf6,0x04,0x00,0x00,0x15,0x00,0xc5,0x40,0x21,0x0a,0x15,0x01,0x07,0x14,0x01,0x07,0x0b,0x01,0x0a,0x0a,0x01,0x09,0x07,0x01,0x09,0x02,0x01,0x0d,0x13,0x01,0x02,0x0c,0x01,0x01,0x08,0x01,0x0e,0x01,0x01,0x10,0x03,0x15,0xb8,0xff,0xf8,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x0a,0x08,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe8, -0x40,0x45,0x0c,0x00,0x4d,0x01,0x18,0x0c,0x00,0x4d,0x02,0x10,0x0c,0x00,0x4d,0x14,0x0b,0x10,0x0f,0x09,0x00,0x04,0x15,0x15,0x00,0x04,0x0a,0x05,0x09,0x14,0x14,0x00,0x18,0x0b,0x06,0x4d,0x00,0x0e,0x04,0x05,0x09,0x42,0x0b,0x09,0x08,0x0c,0x00,0x4d,0x09,0x09,0x16,0x10,0x0f,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04, -0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0xb8,0xff,0xfc,0x40,0x0a,0x0b,0x06,0x4d,0x05,0x40,0x17,0x01,0x2f,0x17,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0xc6,0x2b,0x01,0x10,0xf0,0x2b,0xc2,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x31,0x30,0x2b,0x01,0x2b,0x2b, -0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x05,0xf6,0xde,0xfe,0x36,0x04,0x9c,0x04,0xfe,0x35,0xdb,0x01,0xfc,0xfe,0x23,0xd1,0x01,0xb6,0x04,0x9c,0x04,0x01,0xb6,0xd3,0xfe,0x21,0x01, -0xfa,0xfe,0x06,0x01,0xfa,0xfe,0x06,0x02,0x10,0x01,0xf0,0xfe,0x21,0x01,0xdf,0xfe,0x21,0x01,0xdf,0xfe,0x10,0x00,0x00,0x01,0x00,0x50,0xff,0xe7,0x03,0x3b,0x04,0x19,0x00,0x21,0x00,0xa7,0x40,0x09,0x05,0x12,0x01,0x0c,0x00,0x01,0x10,0x03,0x15,0xb8,0xff,0xe0,0x40,0x3a,0x0b,0x0c,0x00,0x4c,0x19,0x08,0x09,0x09,0x08,0x95,0x59,0x09, -0x09,0x14,0x03,0x11,0x0f,0x14,0x0f,0x95,0x59,0x14,0x10,0x01,0x03,0x20,0x03,0x95,0x59,0x20,0x16,0x19,0x16,0x08,0x08,0x11,0x0c,0x84,0x16,0x16,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d,0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x84,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff, -0xf0,0x40,0x0d,0x0b,0x06,0x4d,0x20,0x05,0x30,0x05,0x02,0x05,0x05,0x23,0x11,0x00,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc0,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x2b, -0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x37,0x35,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x50,0x86,0xb3,0x01,0x0f,0xfe,0xd7,0x65,0x60,0x01,0x05,0x78,0x68,0x95,0x96,0xaa,0x8e,0x01,0x76, -0x6f,0x64,0x72,0x8a,0xe2,0xc6,0xd3,0x1d,0xa1,0x4b,0xac,0xaa,0x8b,0xa2,0x45,0x52,0x4b,0x99,0x3e,0xfe,0xed,0x59,0x81,0x15,0x05,0x09,0x88,0x68,0x8c,0xa6,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x0d,0x00,0x92,0x40,0x2d,0x7c,0x0c,0x01,0x79,0x0b,0x01,0x73,0x05,0x01,0x76,0x04,0x01,0x46,0x09,0x01,0x4a,0x02,0x01, -0x09,0x02,0x08,0x0d,0x0f,0x05,0x00,0x15,0x0c,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x00,0xef,0x01,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0x40,0x29,0x0b,0x06,0x4d,0x01,0x01,0x0f,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06, -0x4d,0x09,0x10,0x0b,0x06,0x4d,0x09,0xef,0x06,0x05,0x0d,0x06,0x4d,0x06,0x01,0x0b,0x06,0x4d,0x06,0x40,0x0f,0x01,0x2f,0x0f,0x01,0x5d,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x3f,0x33,0x39,0x39,0x5d,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23, -0x11,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x36,0x37,0x01,0x33,0x04,0x00,0x94,0x16,0x2d,0xfe,0x27,0xaa,0x96,0x0c,0x28,0x01,0xe6,0xaa,0x03,0x31,0x2b,0x4e,0xfd,0x48,0x04,0x00,0xfc,0xd9,0x1d,0x46,0x02,0xc4,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x05,0xf2,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x06,0x07,0xcd,0x00,0x00,0x00,0x13, -0x40,0x0b,0x01,0x0d,0x14,0x0e,0x07,0x0d,0x25,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x10,0xff,0xf2,0x03,0x91,0x04,0x00,0x00,0x0e,0x00,0x96,0x40,0x27,0x00,0x04,0x01,0x10,0x06,0x05,0x20,0x0b,0x0c,0x00,0x4c,0x0e, -0x02,0x95,0x59,0x0e,0x0f,0x09,0x0b,0x06,0x0b,0x95,0x59,0x06,0x00,0x15,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0xed,0x0d,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0x40,0x22,0x0b,0x06,0x4d,0x0d,0x0d,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d, -0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x08,0x0d,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x0a,0x0b,0x06,0x4d,0x01,0x01,0x10,0x08,0x3f,0x10,0x01,0x5d,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b, -0x31,0x30,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x03,0x91,0xa3,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0xf8,0x04,0x00,0x00,0x13,0x00,0xad, -0x40,0x0a,0x79,0x12,0x01,0x77,0x0e,0x01,0x75,0x0d,0x01,0x0d,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x00,0x4d,0x06,0x10,0x0b,0x0c,0x00,0x4c,0x05,0xb8,0xff,0xf0,0x40,0x2f,0x0b,0x0c,0x00,0x4c,0x10,0x40,0x0c,0x00,0x4d,0x02,0x09,0x10,0x03,0x0d,0x13,0x0f,0x0a,0x05,0x00,0x15,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00, -0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x01,0x01,0x15,0x0d,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x12,0x0c,0x06,0x4d,0x0a,0x12,0x0b,0x06,0x4d,0x0a,0xed,0x0b,0xb8,0xff,0xfe,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0x40,0x0c,0x0c,0x06,0x4d,0x0b,0x07,0x0b, -0x06,0x4d,0x0b,0x3f,0x15,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x32,0x3f,0x33,0x17,0x39,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01, -0x33,0x04,0xf8,0xa2,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49,0x01,0x06,0xda,0x03,0x4c,0x40,0x7c,0xfd,0x70,0x02,0x90,0x35,0x87,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x49,0x81,0xc6,0x02,0xa0,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x0b,0x00,0x6a,0x40,0x22,0x09,0x02,0x95,0x59, -0x09,0x09,0x07,0x0b,0x0f,0x04,0x00,0x15,0x09,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0xb8,0xff,0xfb,0x40,0x24,0x0b,0x06,0x4d,0x01,0x01,0x0d,0x08,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d, -0x05,0x40,0x0d,0x01,0x2f,0x0d,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xf8,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x01,0xd1,0xfe,0x2f,0x04,0x00, -0xfe,0x5c,0x01,0xa4,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x07,0x00,0x60,0x40,0x1e,0x07,0x02,0x95,0x59,0x07,0x0f,0x04,0x00,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01, -0x01,0x01,0xb8,0xff,0xfb,0x40,0x23,0x0b,0x06,0x4d,0x01,0x01,0x09,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0x05,0x0d,0x06,0x4d,0x05,0x40,0x09,0x01,0x2f,0x09,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x2b, -0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x03,0xf8,0xa4,0xfd,0xf6,0xa4,0x03,0x52,0x03,0x74,0xfc,0x8c,0x04,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x06,0x00,0x53,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x29, -0x04,0x00,0x00,0x07,0x00,0x47,0x40,0x2d,0x04,0x00,0x07,0x00,0x95,0x59,0x07,0x0f,0x02,0x15,0x00,0x0e,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0x03,0x05,0x42,0x1f,0x05,0x01,0x05,0x05,0x08,0x03,0x04,0x0d,0x06,0x4d,0x03,0x2f,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xf1,0x2b, -0x2b,0x2b,0xe2,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x29,0xfe,0xcd,0xa4,0xfe,0xcc,0x03,0x0b,0x03,0x74,0xfc,0x8c,0x03,0x74,0x8c,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x02,0x06,0x00,0x5c,0x00,0x00,0x00,0x03,0x00,0x60,0xfe,0x1e,0x05,0x1c,0x05,0xb2, -0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0xe4,0x40,0x19,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x95,0x59,0x0e,0x10,0x1f,0x03,0x00,0x17,0x00,0x17,0x95,0x59,0x00,0x16,0x0d,0x04,0x01,0x1c,0x24,0xb8,0xff,0xf0,0x40,0x1c,0x0b,0x0c,0x00,0x4c,0x1b,0x10,0x0b,0x0c,0x00,0x4c,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06, -0x4d,0x1b,0x83,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x12,0xb8,0xff,0xe8,0x40,0x43,0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x08,0x0b,0x06,0x4d,0x24,0x83,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x18,0x0b, -0x06,0x4d,0x07,0x07,0x28,0x0c,0x0d,0x16,0x20,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0xed,0x02,0xb8,0xff,0xfb,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xfd,0x40,0x0c,0x0b,0x06,0x4d,0x2f,0x02,0x01,0x02,0x2f,0x29,0x3f,0x29,0x02,0x5d,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39, -0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x05,0x11,0x23,0x11,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x00,0x15,0x14, -0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x08,0x94,0x20,0xe0,0xfe,0xec,0x01,0x17,0xe5,0x18,0x94,0x16,0xe7,0x01,0x17,0xfe,0xee,0xdf,0x23,0x16,0x9c,0xba,0xb7,0x9a,0xaf,0x18,0x9a,0xba,0xbb,0x9d,0x18,0xfe,0x36,0x01,0xca,0x01,0x22,0xea,0xf9,0x01,0x2b,0x01,0x9a, -0xfe,0x66,0xfe,0xd7,0xfb,0xea,0xfe,0xde,0x03,0xa6,0xfc,0xe4,0xd3,0xb5,0xbe,0xd6,0xfc,0xe4,0x03,0x1c,0xd7,0xbd,0xb3,0xd5,0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x02,0x06,0x00,0x5b,0x00,0x00,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x8f,0x04,0x00,0x00,0x0b,0x00,0x93,0xb9,0x00,0x01,0x01,0x31,0x40,0x17,0x05,0x09,0x0f, -0x07,0x02,0x0a,0x02,0x0a,0x95,0x59,0x02,0x15,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x10,0x0b,0x06,0x4d,0x0b,0xba,0x01,0x2c,0x00,0x02,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf0,0x40,0x38,0x0b,0x06,0x4d,0x02,0x02,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x08, -0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x07,0x0d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x03,0x08,0x0d,0x06,0x4d,0x03,0x04,0x0c,0x06,0x4d,0x03,0x40,0x0d,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x11, -0x12,0x00,0x39,0x18,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x04,0x8f,0x8d,0xfc,0xa4,0xa4,0x02,0x0a,0xa4,0x97,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x03,0xdf,0x04,0x00,0x00,0x0f,0x00,0x67,0x40,0x46,0x0d,0x02,0x0b,0x04, -0x0b,0xec,0x59,0x04,0x04,0x00,0x08,0x0f,0x0f,0x00,0x15,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x02,0x0f,0x84,0x7f,0x0e,0x01,0x0e,0x0e,0x11,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x07,0x05,0x0d,0x06,0x4d,0x07,0x05,0x0c,0x06,0x4d,0x07,0x2f, -0x11,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0xe1,0x33,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x32,0x12,0x39,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x03,0xdf,0xa3,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0x01,0x9c,0x62, -0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0x00,0x01,0x00,0xa6,0x00,0x00,0x05,0xc0,0x04,0x00,0x00,0x0b,0x00,0xad,0x40,0x1f,0x07,0x03,0x0b,0x0f,0x05,0x00,0x09,0x00,0x09,0x95,0x59,0x00,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x09,0x84,0x00,0xb8,0xff,0xf8,0x40,0x1b,0x0b,0x06, -0x4d,0x00,0x0e,0x08,0x01,0x05,0x42,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x22,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x01,0x0c,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d, -0x08,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xfc,0x40,0x0c,0x0b,0x06,0x4d,0x05,0x05,0x0d,0x0c,0x3f,0x0d,0x4f,0x0d,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf1,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18, -0x3f,0x33,0x33,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x05,0xc0,0xfa,0xe6,0xa4,0x01,0x98,0xa3,0x01,0x97,0xa4,0x04,0x00,0xfc,0x8c,0x03,0x74,0xfc,0x8c,0x03,0x74,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x06,0x5a,0x04,0x00,0x00,0x0f,0x00,0xf2,0xb9,0x00,0x01,0x01,0x31,0x40,0x1e,0x09,0x05,0x0d,0x0f,0x0b, -0x07,0x02,0x0e,0x02,0x0e,0x95,0x59,0x02,0x15,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x10,0x0b,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf0,0x40,0x1c,0x0b,0x06,0x4d,0x02,0x02,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06, -0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0e,0x07,0x0d,0x06,0x4d,0x0e,0xb8,0xff,0xf9,0x40,0x1b,0x0b,0x06,0x4d,0x0e,0x0e,0x0a,0x07,0x03,0x42,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x32,0x0c,0x06,0x4d,0x03,0x08, -0x0b,0x06,0x4d,0x03,0x03,0x10,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0e,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x3f,0x11,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1, -0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc1,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x06,0x5a,0x8f,0xfa,0xdb,0xa4,0x01,0x97,0xa4,0x01, -0x98,0xa4,0x99,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x04,0x64,0x04,0x00,0x00,0x0c,0x00,0x13,0x00,0x7e,0x40,0x26,0x05,0x0d,0x95,0x59,0x05,0x05,0x04,0x0e,0x04,0x01,0x95,0x59,0x04,0x0f,0x00,0x0e,0x95,0x59,0x00,0x15,0x09,0x08,0x0d,0x06,0x4d,0x09, -0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x83,0x11,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x06,0x4d,0x11,0x11,0x15,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x00,0x02,0x02,0x14,0x00,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x00,0x2f,0x2b, -0x12,0x39,0x2f,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x56,0xfe,0xc8,0x01,0xdc,0x01,0x14,0x9d,0xb9, -0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x03,0x74,0x8c,0xfe,0x77,0xa3,0x94,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x03,0x00,0xa6,0x00,0x00,0x05,0x06,0x04,0x00,0x00,0x03,0x00,0x0e,0x00,0x15,0x00,0xb0,0xb9,0x00,0x09,0xff,0xe8,0x40,0x2f,0x0b,0x00,0x4d,0x07,0x0f,0x95,0x59,0x07,0x07,0x10,0x02,0x05,0x0f,0x01,0x04,0x04,0x10, -0x95,0x59,0x04,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0x04,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0x40,0x1c,0x0b,0x06,0x4d,0x01,0x01,0x17,0x04,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x83,0x10,0x13,0x01,0x13,0x08,0x0d,0x06,0x4d,0x13,0xb8, -0xff,0xf8,0x40,0x19,0x0c,0x06,0x4d,0x13,0x13,0x17,0x07,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x84,0x04,0xb8,0xff,0xfc,0x40,0x09,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f, -0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x21,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x05,0x06,0xa2,0xa2,0xfb,0xa0,0xa4,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce, -0x04,0x00,0xfc,0x00,0x04,0x00,0xfe,0x77,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0xb4,0x04,0x00,0x00,0x0a,0x00,0x11,0x00,0x74,0x40,0x21,0x03,0x0b,0x95,0x59,0x03,0x03,0x0c,0x01,0x0f,0x00,0x0c,0x95,0x59,0x00,0x15,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b, -0x06,0x4d,0x07,0x83,0x0f,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf0,0x40,0x19,0x0d,0x06,0x4d,0x0f,0x0f,0x13,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x00,0x02,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b, -0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x33,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0xa4,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x04,0x00,0xfe,0x77,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe, -0xa2,0xb4,0xaa,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x04,0x18,0x00,0x18,0x00,0x99,0x40,0x09,0x00,0x16,0x01,0x00,0x12,0x01,0x10,0x05,0x05,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xf0,0x40,0x36,0x0c,0x06,0x4d,0x09,0x06,0x95,0x59,0x09,0x09,0x03,0x11,0x0e,0x0c,0x11,0x0c,0x95,0x59,0x11,0x10,0x00,0x01, -0x01,0x0c,0x03,0x01,0x03,0x17,0x03,0x95,0x59,0x17,0x16,0x07,0x07,0x00,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x83,0x09,0x06,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x0d,0x0c,0x06,0x4d,0x20,0x06,0x30,0x06,0x02,0x06,0x06,0x1a,0x0e,0x00,0x2f,0xc4,0x12,0x39,0x2f, -0x5d,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x01,0x2b,0x31,0x30,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x11, -0x14,0x00,0x23,0x22,0x5a,0x74,0x96,0x91,0xb3,0x08,0xfe,0x4c,0x01,0xb4,0x0c,0xb2,0x94,0x8f,0x69,0x6a,0x90,0xf4,0x01,0x06,0xfe,0xf3,0xe3,0x9d,0x2d,0x9b,0x56,0xb3,0x99,0x8c,0x98,0xac,0x4e,0xa2,0x36,0xfe,0xe3,0xfe,0xfd,0xf1,0xfe,0xe1,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0x1e,0x04,0x18,0x00,0x12,0x00,0x1a,0x00,0xb7,0x40,0x33, -0x00,0x0b,0x01,0x10,0x06,0x0a,0x13,0x95,0x59,0x0a,0x10,0x10,0x17,0x95,0x59,0x10,0x16,0x06,0x01,0x95,0x59,0x06,0x06,0x03,0x04,0x0f,0x03,0x15,0x07,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x19,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xe0,0x40,0x19, -0x0b,0x06,0x4d,0x19,0x19,0x1c,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x83,0x07,0x00,0xb8,0xff,0xe0,0x40,0x19,0x0b,0x06,0x4d,0x00,0x00,0x1c,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x03, -0x08,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x36,0x24,0x33, -0x32,0x12,0x11,0x14,0x00,0x23,0x22,0x02,0x01,0x20,0x11,0x10,0x21,0x20,0x11,0x10,0x02,0x6c,0xfe,0xde,0xa4,0xa4,0x01,0x24,0x1a,0x01,0x01,0xc9,0xdb,0xf1,0xfe,0xfe,0xe2,0xd5,0xef,0x01,0xce,0xfe,0xce,0x01,0x36,0x01,0x2f,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0xd2,0xea,0xfe,0xec,0xff,0x00,0xf9,0xfe,0xdd,0x01,0x01,0x02,0xa5, -0xfe,0x70,0xfe,0x74,0x01,0x8c,0x01,0x90,0x00,0x02,0x00,0x3e,0x00,0x00,0x03,0x62,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0xae,0x40,0x5a,0x02,0x06,0x01,0x10,0x04,0x0a,0x02,0x12,0x02,0x12,0x95,0x59,0x02,0x02,0x11,0x00,0x11,0x13,0x95,0x59,0x11,0x0f,0x06,0x00,0x15,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x06,0x08,0x0b, -0x06,0x4d,0x05,0x08,0x0a,0x08,0x01,0x07,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x83,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x0d,0x07,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x0c,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb6, -0x0b,0x06,0x4d,0x01,0x01,0x1a,0x07,0xb8,0xff,0xf0,0xb5,0x0c,0x06,0x4d,0x06,0x07,0x19,0x10,0xce,0x32,0x2b,0x11,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x39,0x11,0x33,0x2b,0x2b,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39, -0x31,0x30,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x23,0x22,0x07,0x03,0x23,0x13,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x15,0x14,0x33,0x03,0x62,0xa4,0x89,0x63,0x51,0x85,0xbe,0xac,0x3c,0x55,0x78,0x7e,0xc5,0xb2,0x01,0x66,0xa4,0xc2,0xcf,0xc9,0x01,0xa8,0xa0,0xfe,0xf8,0x01,0x3c,0x6e,0x23,0x10,0x90,0x6c, -0x88,0x9f,0xfe,0x31,0x01,0x43,0x9d,0xa6,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x87,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x00,0x8f,0x7f,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x29,0x23,0x0c,0x12,0x3e,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x01,0x00,0x27,0xfe,0x62,0x04,0x14, -0x05,0xec,0x00,0x21,0x00,0xbc,0x40,0x40,0x11,0x0e,0x17,0x14,0x14,0x17,0x96,0x59,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x09,0x03,0x14,0x14,0x13,0x1b,0x18,0x08,0x1b,0x08,0x95,0x59,0x1b,0x0f,0x13,0x00,0x01,0x03,0x20,0x03,0xec,0x59,0x20,0x0c,0x15,0x15,0x15,0x0c,0x00,0x00,0x0d,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d, -0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x83,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0x40,0x1d,0x0b,0x06,0x4d,0x06,0x06,0x23,0x11,0x14,0x17,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x0f,0x0d,0xb8,0xff,0xfc,0x40,0x0a,0x0b, -0x06,0x4d,0x0d,0x40,0x23,0x01,0x2f,0x23,0x01,0x5d,0x5d,0x2f,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x10,0xc0,0x2f,0x00,0x3f,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39, -0x31,0x30,0x01,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x21,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x20,0x11,0x10,0x02,0x23,0x22,0x01,0xd5,0x43,0x3a,0x92,0x8a,0xfe,0xfa,0x76,0xa2,0xa4,0x85,0x85,0xa4,0x01,0x4e,0xfe,0xb2,0x04,0x69,0xd3,0x01,0x84,0xdb,0xe9,0x3a,0xfe,0x7b, -0x9d,0x24,0x01,0x2b,0x01,0x64,0x01,0xef,0xbb,0x8a,0xfd,0xd3,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x8a,0xc2,0xfd,0x87,0xfe,0x5a,0xfe,0x83,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xdf,0x06,0x0a,0x02,0x26,0x02,0x0a,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0x94,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1b,0x08,0x06,0x04,0x05,0x3e,0x01, -0x08,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x60,0x04,0x18,0x00,0x18,0x00,0x86,0xb9,0x00,0x14,0xff,0xf0,0x40,0x52,0x0b,0x0c,0x00,0x4c,0x03,0x08,0x10,0x00,0x4d,0x11,0x12,0x95,0x59,0x11,0x11,0x16,0x08,0x00,0x0b,0x01,0x0d,0x03,0x0b,0x0d,0x08,0x0d,0x95,0x59,0x08,0x10,0x00,0x18,0x01, -0x0c,0x03,0x18,0x16,0x02,0x16,0x95,0x59,0x02,0x16,0x12,0x12,0x13,0x0b,0x00,0x30,0x00,0x01,0x00,0x1a,0x10,0x10,0x0c,0x06,0x4d,0x10,0x13,0x08,0x0d,0x06,0x4d,0x13,0x83,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x32,0x2b,0x11,0x33,0x5d,0x2f,0xc4,0x12,0x39, -0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x25,0x06,0x23,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x03,0x60,0x73,0x9f,0xe5,0xfe,0xf7,0x01,0x14, -0xf2,0x89,0x67,0x64,0x92,0x93,0xb6,0x0d,0x01,0xb4,0xfe,0x4a,0x08,0xb2,0x94,0x92,0x78,0x2d,0x45,0x01,0x1b,0xef,0x01,0x02,0x01,0x24,0x32,0xa2,0x4a,0xb0,0x94,0x8c,0x97,0xb5,0x5b,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x04,0x18,0x02,0x06,0x00,0x56,0x00,0x00,0xff,0xff,0xff,0xd3,0x00,0x00,0x02,0x1a,0x05,0x87,0x02,0x26, -0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x56,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x02,0x00,0x10,0xff,0xf2,0x05,0xfc,0x04,0x00,0x00,0x15,0x00,0x1c,0x00,0xd5,0x40,0x34,0x00,0x03,0x01,0x10,0x06,0x04,0x18,0x0b, -0x0c,0x00,0x4c,0x08,0x0a,0x05,0x0a,0x95,0x59,0x05,0x00,0x0e,0x16,0x95,0x59,0x0e,0x0e,0x0c,0x17,0x0c,0x02,0x95,0x59,0x0c,0x0f,0x00,0x17,0x95,0x59,0x00,0x15,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0xed,0x0c,0xb8,0xff,0xe8,0x40,0x19,0x0d,0x06,0x4d,0x0c,0x0c,0x00,0x07,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c, -0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x83,0x1a,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xfc,0x40,0x19,0x0c,0x06,0x4d,0x1a,0x1a,0x1e,0x0e,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08,0x0c,0x06,0x4d,0x17,0x08,0x0b,0x06,0x4d,0x17,0x84,0x00,0xb8,0xff,0xfc,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00, -0xb8,0xff,0xf4,0x40,0x0a,0x0b,0x06,0x4d,0x00,0x00,0x1e,0x07,0x4f,0x1e,0x01,0x5d,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x2b, -0x00,0x18,0x10,0xc6,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x02,0xee,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x01,0x15,0x9d,0xb9,0xbb,0x8d,0xfe,0xdd,0xf6,0xcd, -0xcf,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0xfe,0x77,0xa4,0x94,0x92,0xad,0x01,0xe9,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xa6,0x00,0x00,0x06,0x14,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0xb7,0x40,0x28,0x08,0x01,0x13,0x0b,0x0b,0x13,0x95,0x59,0x0b,0x0b,0x14,0x06,0x0a,0x0f,0x03,0x00,0x00,0x14,0x95,0x59,0x00,0x15, -0x0f,0x04,0x0d,0x06,0x4d,0x0f,0x04,0x0c,0x06,0x4d,0x0f,0x04,0x0b,0x06,0x4d,0x0f,0x83,0x17,0xb8,0xff,0xf0,0x40,0x1a,0x0d,0x06,0x4d,0x17,0x17,0x1b,0x0b,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x84,0x00,0xb8,0xff,0xf9,0x40,0x09,0x0d,0x06,0x4d,0x00,0x14,0x0c,0x06,0x4d,0x00,0xb8, -0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x00,0x00,0x1b,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x84,0x04,0xb8,0xff,0xf8,0x40,0x0c,0x0d,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x4f,0x1b,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b, -0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x06,0xfe,0x44,0xa4,0xa4,0x01, -0xbc,0xa4,0x01,0x14,0xa1,0xb5,0xb8,0x8f,0xfe,0xdd,0xf6,0xcc,0xce,0x01,0xdd,0xfe,0x23,0x04,0x00,0xfe,0x6a,0x01,0x96,0xfe,0x6a,0x9e,0x92,0x93,0xa7,0x01,0xdd,0xfe,0xaf,0xae,0xa3,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xfe,0x05,0xec,0x00,0x19,0x00,0xb4,0x40,0x3f,0x02,0x18,0x01,0x02,0x18,0x01,0x10,0x04,0x0d,0x0a,0x13,0x10, -0x10,0x13,0x96,0x59,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x09,0x03,0x10,0x10,0x0f,0x17,0x15,0x04,0x17,0x04,0x95,0x59,0x17,0x0f,0x0f,0x00,0x08,0x00,0x15,0x12,0x12,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c, -0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d,0x01,0x01,0x1b,0x0d,0x10,0x13,0x03,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x0b,0x09,0xb8,0xff,0xfc,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x1b,0x01,0x5d,0x2f,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b, -0xe1,0x2b,0x2b,0x2b,0x10,0xc0,0x2f,0x00,0x3f,0x33,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x20,0x11, -0x03,0xfe,0xa4,0xec,0x7b,0xa3,0xa4,0x85,0x85,0xa4,0x01,0x4e,0xfe,0xb2,0x04,0x77,0xd9,0x01,0x5a,0x02,0x33,0x01,0x41,0xba,0x95,0xfd,0xdb,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x8c,0xc2,0xfe,0x5e,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0a,0x02,0x26,0x01,0x67,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1f,0x00,0x00,0x00,0x13, -0x40,0x0b,0x01,0x00,0x0e,0x0e,0x07,0x0a,0x3e,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0xf2,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x07,0xcd,0xa0,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1b,0x15,0x0c,0x00,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, -0x00,0x01,0x00,0xa6,0xfe,0x8b,0x03,0xf8,0x04,0x00,0x00,0x0b,0x00,0x9c,0xb3,0x07,0x0b,0x0f,0x02,0xb8,0x01,0x31,0x40,0x18,0x04,0x00,0x00,0x09,0x95,0x59,0x00,0x15,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0xbb,0x01,0x2c,0x00,0x04,0x00,0x04,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x08,0x09,0x04, -0xb8,0x01,0x2c,0x40,0x17,0xff,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x09,0x01,0x09,0xb8,0xff,0xf8,0x40,0x23,0x0b,0x06,0x4d,0x09,0x09,0x0d,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0x40,0x0d, -0x01,0x2f,0x0d,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x33,0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xf8,0xfe,0x9e,0x8e,0xfe,0x9e,0xa4,0x02,0x0a, -0xa4,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x06,0xa2,0x00,0x07,0x00,0x75,0x40,0x19,0x05,0x00,0x91,0x59,0x06,0x05,0x03,0x02,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x05,0xb8,0x01,0x2c,0x40,0x09,0x70,0x00,0x01,0x00,0x08,0x0d, -0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x18,0x0b,0x06,0x4d,0x00,0x00,0x09,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x03,0x04,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33, -0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xcd,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x03,0xa4,0xfd,0xc0,0xa8,0x02,0x58,0x90,0x05,0x02,0xfa,0xfe,0x05,0x9a,0x01,0x08,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xe6,0x05,0x0e,0x00,0x07,0x00,0x62,0x40,0x19,0x05,0x00,0x95,0x59,0x06,0x05,0x0f,0x02, -0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x05,0xb8,0x01,0x2c,0x40,0x1d,0x70,0x00,0x01,0x00,0x18,0x0d,0x06,0x4d,0x00,0x00,0x09,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x03,0x12,0x0b,0x06,0x4d, -0x03,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xcd,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x02,0xe6,0xfe,0x64,0xa4,0x01,0xb0,0x90,0x03,0x74,0xfc,0x8c,0x04,0x00,0x01,0x0e,0xff,0xff,0x00,0x00,0x01,0xfa,0x08,0x00,0x02,0x7b,0x02,0x06,0x00,0xb3,0x00,0x00, -0x00,0x04,0x00,0xbc,0x00,0x00,0x08,0x9a,0x05,0xae,0x00,0x0b,0x00,0x14,0x00,0x26,0x00,0x2a,0x00,0xd8,0x40,0x52,0x06,0x20,0x01,0x0a,0x16,0x01,0x04,0x0b,0x01,0x03,0x07,0x01,0x03,0x0f,0x05,0x01,0x0f,0x01,0x01,0x10,0x04,0x29,0x28,0x96,0x59,0x29,0x00,0x00,0x11,0x96,0x59,0x00,0x00,0x06,0x06,0x0c,0x96,0x59,0x06,0x04,0x20,0x26, -0x03,0x1d,0x15,0x12,0x2a,0x29,0x2a,0x29,0x03,0x09,0x8b,0x13,0x13,0x2c,0x0f,0x8b,0x03,0x03,0x2c,0x1e,0x16,0x22,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x7e,0x24,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xf0,0x40,0x1f,0x0c,0x06,0x4d,0x24,0x0a,0x0b,0x06,0x4d,0x24,0x24,0x2c, -0x20,0x1a,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d,0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x7e,0x1e,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1e,0xb8,0xff,0xfc,0x40,0x09,0x0c,0x06,0x4d,0x1e,0x04,0x0b,0x06,0x4d,0x1e,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x33, -0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0x33,0x3f,0x33,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x10,0x33,0x32,0x11, -0x10,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x33,0x26,0x35,0x11,0x33,0x01,0x21,0x35,0x21,0x07,0x1c,0xaf,0xc3,0xcb,0xba,0xb0,0xbb,0xcb,0xa8,0x6c,0x79,0xe1,0xdd,0xfd,0x02,0xd1,0xfd,0x5f,0x20,0x0e,0x06,0x08,0xa8,0xdc,0x02,0xc6,0x04,0x08,0xa8,0x03,0x79,0xfd,0x4d,0x02,0xb3,0x02,0x5c,0xde,0xc4,0xd1, -0xdf,0xda,0xc8,0xc6,0xea,0x02,0xcb,0x99,0x8c,0xfe,0xe2,0x01,0x20,0x01,0x23,0xfa,0xd9,0x04,0x70,0x37,0x21,0x2e,0x94,0xfb,0xfa,0x05,0x9a,0xfb,0x43,0x31,0xa0,0x03,0xec,0xfb,0xa4,0x84,0x00,0x01,0x00,0x11,0xff,0xf4,0x04,0xaf,0x04,0x00,0x00,0x1a,0x00,0xb2,0x40,0x36,0x00,0x18,0x01,0x0d,0x0a,0x01,0x10,0x04,0x16,0x00,0x14,0x0d, -0x00,0x1a,0x00,0x95,0x59,0x1a,0x0f,0x06,0x04,0x09,0x04,0xec,0x59,0x09,0x10,0x15,0x00,0x00,0x02,0x06,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x7f,0x0b,0x01,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0x40,0x27,0x0b, -0x06,0x4d,0x0b,0x0b,0x1c,0x13,0x16,0x16,0x1b,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x13,0x17,0x0d,0x06,0x4d,0x13,0x12,0x0c,0x06,0x4d,0x13,0xb8,0xff,0xe8,0xb3,0x0b,0x06,0x4d,0x13,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b, -0x2b,0x5d,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x10,0xc2,0x2f,0x00,0x3f,0xc4,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x10,0xc4,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x21,0x11,0x14,0x07,0x23,0x36,0x35,0x11,0x06,0x07,0x35,0x36,0x33,0x21,0x04, -0xaf,0xde,0x65,0x22,0x36,0x3d,0x3d,0xe8,0xfe,0x7b,0x20,0xa7,0x24,0x7b,0x78,0x4b,0xaa,0x03,0xa9,0x03,0x7b,0xfd,0x95,0x8c,0x13,0x8c,0x17,0x01,0x15,0x02,0x72,0xfd,0x9d,0xc0,0x58,0x57,0xc1,0x02,0x63,0x03,0x56,0x96,0x48,0x00,0x00,0x02,0x00,0x2f,0x02,0x48,0x02,0xaa,0x05,0x9a,0x00,0x0c,0x00,0x11,0x00,0x4a,0x40,0x18,0x0c,0x0b, -0x0b,0x02,0xcc,0x0d,0x06,0x09,0x16,0x09,0x02,0x09,0x03,0x03,0x13,0x11,0x4f,0x06,0x7f,0x06,0x02,0x06,0x04,0x01,0xb8,0x01,0x56,0x40,0x0f,0x0c,0x06,0x0f,0x0d,0x1f,0x0d,0x02,0x0d,0x0d,0x02,0x0e,0x0a,0x27,0x02,0x28,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x01,0x2f,0x5d,0x33,0x12,0x39,0x2f,0x33,0x5d,0x33, -0xed,0x32,0x11,0x33,0x30,0x31,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x36,0x12,0x37,0x33,0x11,0x33,0x23,0x11,0x06,0x06,0x07,0x02,0xaa,0x6e,0x84,0xfe,0x77,0x69,0xba,0x4e,0x9c,0x6e,0xf2,0x3e,0x80,0x42,0x03,0x14,0xcc,0xcc,0x5c,0x79,0x01,0x13,0x9e,0xfd,0xe7,0x01,0x73,0x71,0xb3,0x4f,0x00,0x00,0x01,0x00,0x7b,0x02,0x33,0x02,0x8a, -0x05,0x9e,0x00,0x24,0x00,0x37,0x40,0x1e,0x04,0x1c,0x14,0x1c,0x02,0x12,0x1e,0xcc,0x08,0x08,0x26,0x14,0xcc,0x01,0x0f,0x0a,0xe6,0x19,0x19,0x10,0x01,0x03,0xe6,0x00,0x23,0x29,0x12,0xe6,0x10,0x27,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x5d,0x13,0x35,0x16, -0x33,0x32,0x3e,0x02,0x35,0x34,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x07,0x32,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x7e,0x71,0x57,0x2a,0x45,0x31,0x1a,0xcc,0x14,0x30,0x31,0x31,0x13,0x30,0x01,0xb7,0xfe,0xb5,0x19,0x07,0x15,0x17,0x16,0x06,0x40,0x74,0x56,0x33,0x36,0x5b,0x76,0x3f,0x7d,0x02,0x5e, -0x92,0x46,0x18,0x2a,0x3b,0x23,0x98,0x01,0x03,0x03,0x01,0x01,0xc4,0x7c,0xc8,0x01,0x01,0x01,0x22,0x43,0x65,0x43,0x48,0x6b,0x47,0x23,0x00,0x01,0x00,0x4d,0x02,0x48,0x02,0xa0,0x05,0xa4,0x00,0x0a,0x00,0x2a,0x40,0x15,0x03,0x06,0x0a,0xcc,0x00,0x06,0x00,0x06,0x00,0x0c,0x1f,0x05,0x01,0x05,0x0a,0x28,0x07,0x03,0xe6,0x05,0x27,0x00, -0x3f,0xed,0x32,0x3f,0x01,0x2f,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x30,0x31,0x13,0x36,0x12,0x37,0x21,0x35,0x21,0x15,0x06,0x02,0x07,0xb3,0x38,0x99,0x70,0xfe,0x59,0x02,0x53,0x79,0xaf,0x33,0x02,0x48,0xc6,0x01,0x75,0xab,0x76,0x35,0xb9,0xfe,0x6e,0xdc,0x00,0x03,0x00,0x41,0x02,0x34,0x02,0xad,0x05,0xae,0x00,0x23, -0x00,0x31,0x00,0x45,0x00,0x53,0x40,0x30,0x15,0x05,0x08,0x3c,0xcc,0x12,0x12,0x1a,0xcc,0x60,0x2a,0x01,0x2a,0x2a,0x47,0x00,0x32,0xcc,0x08,0x08,0x24,0xcc,0x00,0x40,0x0a,0x0f,0x48,0x00,0x15,0x05,0x2f,0xe6,0x0f,0x37,0x1f,0x37,0x02,0x37,0x37,0x0d,0x27,0xe6,0x1f,0x29,0x41,0xe6,0x0d,0x27,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f, -0x5d,0xed,0x39,0x39,0x01,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x30,0x31,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02, -0x23,0x22,0x06,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x41,0x14,0x27,0x39,0x25,0x34,0x3c,0x27,0x47,0x63,0x3c,0x3d,0x63,0x46,0x27,0x3b,0x35,0x23,0x39,0x28,0x15,0x2c,0x51,0x73,0x46,0x46,0x72,0x51,0x2d,0x90,0x58,0x4e,0x4e,0x5c,0x17,0x2c,0x3f,0x28,0x4a,0x5c,0x20,0x14,0x24,0x31,0x1d, -0x1d,0x32,0x25,0x15,0x14,0x25,0x32,0x1e,0x1f,0x32,0x22,0x13,0x03,0x32,0x21,0x41,0x3b,0x32,0x11,0x21,0x5d,0x38,0x31,0x55,0x3d,0x23,0x23,0x3e,0x54,0x31,0x39,0x5d,0x20,0x11,0x33,0x3b,0x41,0x20,0x3b,0x5e,0x42,0x23,0x23,0x42,0x5e,0x47,0x48,0x49,0x4b,0x46,0x20,0x38,0x29,0x17,0x51,0x01,0x3b,0x1a,0x2e,0x22,0x14,0x14,0x22,0x2e, -0x1a,0x1b,0x2c,0x20,0x12,0x13,0x20,0x2d,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x04,0x00,0x02,0x06,0x00,0xd6,0x00,0x00,0xff,0xff,0x00,0x79,0xfe,0x85,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x06,0x01,0x9c,0x7b,0x00,0xff,0xff,0x00,0x68,0xfe,0x85,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06, -0x01,0x9c,0x09,0x00,0x00,0x02,0x00,0x64,0x01,0x02,0x04,0x0e,0x04,0xaa,0x00,0x1b,0x00,0x27,0x00,0x68,0x40,0x3b,0x02,0x06,0x09,0x0d,0x10,0x14,0x17,0x1b,0x08,0x04,0x12,0x01,0x07,0x04,0x40,0x22,0x04,0xbe,0x59,0x22,0x0e,0x12,0x12,0x1c,0xbe,0x59,0x15,0x0f,0x12,0x16,0x00,0x00,0x19,0x0e,0x08,0x0b,0x40,0x02,0x06,0x09,0x0d,0x10, -0x14,0x17,0x1b,0x08,0x0b,0x19,0xbd,0x25,0x0b,0x25,0x42,0x25,0x25,0x29,0x1f,0xbd,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x11,0x17,0x39,0x1a,0x18,0x10,0xde,0xc4,0x10,0xca,0x2f,0xc4,0x00,0x2f,0xde,0xc4,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x1a,0x18,0x10,0xde,0xc4,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x27,0x06, -0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x17,0x37,0x17,0x07,0x16,0x15,0x14,0x07,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04,0x0e,0x5c,0x89,0x69,0x86,0x88,0x68,0x8a,0x5c,0x8a,0x4c,0x4c,0x8a,0x5c,0x8a,0x6e,0x82,0x81,0x6c,0x8b,0x5c,0x89,0x4e,0x4e,0xfe,0xb5,0x74, -0x9f,0xa1,0x72,0x71,0xa3,0xa6,0x01,0x62,0x60,0x8a,0x4c,0x4c,0x8a,0x60,0x86,0x71,0x7c,0x81,0x6c,0x88,0x60,0x89,0x4d,0x4d,0x89,0x60,0x88,0x70,0x7d,0x79,0x74,0x02,0x02,0xa2,0x71,0x71,0xa2,0xa2,0x71,0x71,0xa2,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x06,0x3e,0x00,0x19,0x00,0x25,0x00,0xb2,0xb9,0x00,0x0d,0xff,0xf0,0xb3, -0x0b,0x00,0x4d,0x0a,0xb8,0xff,0xf0,0x40,0x14,0x0b,0x00,0x4d,0x06,0xc0,0x02,0xf2,0x0d,0x1a,0x91,0x0f,0x0d,0x12,0x18,0x04,0x20,0x91,0x12,0x13,0x0d,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x06,0x06,0x04,0xc2,0x09,0x09,0x0d,0x00,0x15,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x23, -0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x23,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x23,0xb8,0xff,0xf4,0x40,0x2a,0x0b,0x06,0x4d,0x23,0x23,0x27,0x1d,0x06,0x0d,0x06,0x4d,0x1d,0x06,0x0c,0x06,0x4d,0x1d,0x06,0x0b,0x06,0x4d,0x1d,0x7d,0x15,0x10,0x0d,0x06,0x4d,0x15,0x10,0x0c,0x06,0x4d,0x15,0x10,0x0b,0x06,0x4d,0x15,0x2f,0x27,0x01,0x5d, -0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x32,0x2f,0xf1,0xc2,0x2f,0x2b,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0xed,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x2b,0x2b,0x01,0x16,0x33,0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x23,0x16,0x11,0x10,0x00,0x21,0x20, -0x00,0x11,0x10,0x00,0x21,0x32,0x07,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x04,0x8f,0x30,0x20,0xd6,0x15,0x88,0x12,0x8c,0x7a,0x22,0x98,0xfe,0x8c,0xfe,0xc8,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0xd8,0xe4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x05,0x43,0x09,0x82,0x48,0x3a,0x36,0x50,0x6c, -0x86,0xc2,0xfe,0xdb,0xfe,0xa1,0xfe,0x68,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0x98,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0xa9,0x04,0xfc,0x00,0x18,0x00,0x24,0x00,0x95,0x40,0x2b,0x00,0x80,0x14,0xf2,0x05,0x19,0x95,0x07,0x05,0x0a,0x10,0x10, -0x1f,0x95,0x0a,0x16,0x00,0x00,0x17,0xc2,0x03,0x03,0x10,0x05,0x0d,0x07,0x06,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x83,0x22,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xf7,0xb6,0x0c,0x06,0x4d,0x30,0x22,0x01,0x22,0xb8,0xff,0xe4,0x40,0x27,0x0b,0x06,0x4d,0x22,0x22,0x26,0x1c,0x0a,0x0d, -0x06,0x4d,0x1c,0x0a,0x0c,0x06,0x4d,0x1c,0x0a,0x0b,0x06,0x4d,0x1c,0x83,0x0d,0x10,0x0d,0x06,0x4d,0x0d,0x0e,0x0c,0x06,0x4d,0x0d,0x19,0x0b,0x06,0x4d,0x0d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39, -0xed,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x33,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04,0x10,0x86,0x13,0xdb,0x82,0xfe,0xeb,0xe9,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0x30,0x56,0x3d,0x6d,0x3b, -0x4f,0xfe,0x3a,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x04,0xfc,0x38,0x50,0xc0,0x28,0x8d,0xfb,0xf5,0xfe,0xd9,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0x0e,0x0a,0x47,0x32,0x49,0xfe,0xcc,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x06,0x96,0x00,0x17,0x00,0x86,0x40,0x33,0x25,0x0a,0x35,0x0a, -0x02,0x25,0x08,0x35,0x08,0x02,0x12,0x80,0x17,0xda,0x0c,0x0c,0x05,0x03,0x09,0x91,0x02,0x13,0x12,0x12,0x10,0xc2,0x15,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x0b,0x18,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xd8,0x40,0x18,0x0c,0x06,0x4d,0x0b,0x0b,0x19,0x07,0x08,0x0d,0x06,0x4d,0x07, -0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7e,0x04,0xb8,0xff,0xfc,0x40,0x0c,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x30,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x33,0x10,0xfd,0x1a,0xcc,0x31,0x30,0x5d,0x5d, -0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0x93,0x3c,0x4f,0x15,0x88,0x12,0xfb,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x47,0x31,0x4a,0x3a,0x38,0x50, -0xd2,0x1f,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0xc7,0x04,0xfc,0x00,0x1b,0x00,0x92,0x40,0x32,0x06,0x40,0x10,0x00,0x4d,0x0d,0x10,0x0b,0x0c,0x00,0x4c,0x17,0x80,0x1b,0xf2,0x10,0x08,0x0f,0x02,0x0c,0x95,0x05,0x16,0x00,0x15,0x16,0x16,0x14,0xc2,0x19,0x19,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d, -0x00,0x84,0x02,0x0f,0xb8,0xff,0xe0,0x40,0x32,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x7f,0x0f,0x01,0x0f,0x0f,0x1d,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x09,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x2f,0x1d,0x01,0x5d,0x2f,0x2b,0x2b,0xe1, -0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xd4,0xfd,0x1a,0xcd,0x31,0x30,0x2b,0x2b,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x03,0xe2, -0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x7a,0x3b,0x4f,0x14,0x86,0x13,0xe5,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x47,0x32,0x49,0x3a,0x38,0x50,0xc6,0x24,0x00,0x00,0x01,0x00,0xab,0x04,0xc2,0x01,0xc4,0x06,0x27,0x00,0x11,0x00,0x2b,0x40,0x16,0x0f,0xe2,0x40,0x02,0xc0,0x0b,0x40,0x08, -0x09,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xd5,0x1a,0xcd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0xab,0x25,0x2b,0x58,0x71,0x4d,0x39,0x6c,0x70,0x5e,0x11,0x28,0x06, -0x23,0x04,0x54,0x47,0x3d,0x54,0x07,0x32,0x73,0x4c,0x3f,0x08,0x00,0x01,0x00,0xf2,0xfe,0xc6,0x01,0xb8,0xff,0x89,0x00,0x0b,0x00,0x15,0x40,0x09,0x00,0xc1,0x06,0x09,0xc0,0x03,0x03,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x55,0x29,0x3a,0x3c, -0x27,0x29,0x3a,0x3a,0xfe,0xc6,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x01,0x00,0x66,0x04,0xc2,0x01,0xc2,0x05,0xb8,0x00,0x03,0x00,0x0e,0xb4,0x03,0x01,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0xc2,0x7e,0xde,0xa8,0x04,0xc2,0xf6,0x00,0x01,0x00,0x64,0x04,0xc2,0x01,0xc0,0x05,0xb8, -0x00,0x03,0x00,0x0e,0xb4,0x01,0x03,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x64,0xb4,0xa8,0xdc,0x04,0xc2,0xf6,0xf6,0x00,0x02,0x00,0x42,0x04,0xc2,0x03,0x90,0x06,0x50,0x00,0x03,0x00,0x0a,0x00,0x2e,0xb1,0x01,0x00,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x00,0x00,0x0a,0x04,0x02,0x80,0x00, -0x00,0x80,0x04,0x90,0x04,0xa0,0x04,0x03,0x04,0xc0,0x08,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x39,0x2f,0x2b,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x07,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x34,0xb4,0xa8,0xdd,0x3d,0x79,0xa4,0xa6,0x71,0xd8,0x84,0x05,0x5a,0xf6,0xf6,0x98,0x94,0x94,0xfa,0x00,0x00,0x02,0x00,0x42, -0x04,0xc2,0x03,0x90,0x06,0x50,0x00,0x03,0x00,0x0a,0x00,0x36,0xb1,0x03,0x00,0xb8,0xff,0xc0,0x40,0x1b,0x09,0x0c,0x48,0x00,0x00,0x06,0x80,0x07,0x80,0x07,0x90,0x07,0xa0,0x07,0x03,0x07,0xc0,0x04,0x40,0x0f,0x13,0x48,0x04,0x04,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0x1a,0xcc,0x5d,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0xcd, -0x31,0x30,0x01,0x23,0x27,0x33,0x13,0x37,0x33,0x17,0x23,0x27,0x07,0x01,0x9e,0x7e,0xde,0xa8,0x73,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x05,0x5a,0xf6,0xfe,0x72,0xfa,0xfa,0x94,0x94,0x00,0x02,0x00,0x6c,0x04,0xc2,0x03,0x68,0x06,0xbe,0x00,0x11,0x00,0x18,0x00,0x45,0x40,0x26,0x0f,0xe2,0x40,0x02,0xc0,0x0b,0x40,0x08,0x09,0x09,0x17,0x16, -0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x40,0x11,0x11,0x0b,0x0b,0x80,0x12,0x90,0x12,0xa0,0x12,0x03,0x12,0xc0,0x16,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0xc6,0xc6,0x1a,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xcd,0x39,0x2f,0xd5,0x1a,0xcd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07, -0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x50,0x24,0x2c,0x59,0x6f,0x4b,0x39,0x6d,0x71,0x5f,0x11,0x28,0x4e,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x06,0xba,0x04,0x53,0x48,0x3c,0x54,0x07,0x32,0x73,0x4b,0x40,0x08,0xfe,0x72,0x94,0x94,0xfa,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4, -0x00,0x12,0x00,0x19,0x00,0x41,0x40,0x23,0x12,0x07,0xda,0x0c,0x10,0xda,0x40,0x03,0x09,0x40,0x0d,0x10,0x48,0x09,0x19,0x80,0x13,0x13,0x00,0x17,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x1b,0x1a,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x10,0xc6,0x10,0xc4,0x00,0x2f,0x1a,0xdd,0xd6,0x2b,0xd6, -0x1a,0xfd,0xdc,0xed,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x3b,0x79,0xa4,0xa6,0x70,0xd7,0x85,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7, -0x26,0x26,0x61,0xfd,0xde,0x94,0x94,0xfa,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x34,0x40,0x19,0x02,0x80,0x00,0x04,0x0a,0x0d,0xd9,0x40,0x07,0x02,0x80,0x00,0x00,0x0b,0x0f,0xf3,0x04,0x0b,0xf3,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x11,0x39,0x2f,0x1a, -0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0xc4,0xd4,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x37,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xd7,0xb5,0xa7,0xdd,0xf4,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x05,0xaa,0xf6,0xf6,0x14,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0x38,0x04,0xc2,0x02,0x5c, -0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x36,0x40,0x1a,0x03,0x80,0x01,0x0a,0x04,0x07,0xd9,0x40,0x0d,0x02,0x80,0x00,0x00,0x05,0x09,0xf3,0x0a,0x05,0xf3,0x04,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0xc4,0xd4,0x1a,0xcd,0x31,0x30,0x01,0x23, -0x27,0x33,0x07,0x33,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x01,0xaa,0x7f,0xdd,0xa8,0xbe,0x66,0x10,0x9e,0xa2,0x0a,0x64,0x04,0x96,0x74,0x70,0x9c,0x05,0xaa,0xf6,0xe2,0x86,0x86,0x72,0x8a,0x8c,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x07,0x0a,0x00,0x11,0x00,0x1d,0x00,0x5e,0x40,0x37,0x0f,0xe2,0x40,0x00,0x02,0x10, -0x02,0x20,0x02,0x03,0x02,0xc0,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x0b,0x08,0x09,0x09,0x1b,0x12,0x18,0x1b,0xd9,0x40,0x15,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x0b,0x18,0x1d,0xf3,0x12,0x19,0xf3,0x18,0x18,0x12,0x1f,0x1e,0x11,0x12,0x39,0x39,0x10,0xe1,0x10,0xe1,0x11,0x39,0x2f,0xc6,0xcd,0x1a,0xdc, -0x5d,0x71,0xe1,0x00,0x2f,0x1a,0xfd,0xd4,0xc4,0x12,0x39,0x2f,0xd5,0xcd,0x5d,0x1a,0xdc,0x5d,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xcd,0x25,0x2a,0x5b,0x6f,0x50,0x36,0x6c,0x70,0x5e,0x11,0x28, -0x01,0x7d,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x07,0x06,0x04,0x54,0x48,0x3c,0x54,0x07,0x31,0x72,0x4c,0x40,0x08,0xde,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x1e,0x00,0x50,0x40,0x2c,0x12,0x07,0xda,0x0c,0x10,0xda,0x03,0x0a,0x40,0x0d,0x11,0x48, -0x0a,0x1e,0x19,0x1c,0xd9,0x16,0x1e,0xf3,0x13,0x13,0x00,0x12,0x1a,0xf3,0x19,0x19,0x09,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x20,0x1f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xfd,0xdc,0xc4,0xd6,0x2b,0xd4,0xfd,0xdc,0xed,0xc6, -0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x34,0x0a,0x9d,0x6f,0x76,0x94,0x05,0x65,0x0a,0xa2,0x9c,0x12,0x06,0xe4,0x65, -0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfe,0xda,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x01,0x00,0xab,0x04,0xc2,0x01,0xc4,0x06,0x27,0x00,0x11,0x00,0x3d,0xb3,0x0f,0xe2,0x40,0x02,0xb8,0xff,0xc0,0xb5,0x09,0x0c,0x48,0x02,0xc0,0x0b,0xb8,0xff,0xe8,0x40,0x14,0x09,0x0c,0x48,0x0b,0x40,0x08,0x09,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05, -0x01,0x05,0x80,0x08,0x11,0x0b,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xd5,0x1a,0xcd,0x2b,0x1a,0xdc,0x2b,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0xab,0x25,0x2b,0x58,0x71,0x4d,0x39,0x6c,0x70,0x5e,0x11,0x28,0x06,0x23,0x04,0x54,0x47,0x3d,0x54, -0x07,0x32,0x73,0x4c,0x3f,0x08,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x19,0x00,0x50,0xb3,0x00,0x07,0xda,0x0c,0xb8,0xff,0xc0,0x40,0x09,0x09,0x0c,0x48,0x0c,0x10,0xda,0x40,0x03,0x09,0xb8,0xff,0xc0,0x40,0x1a,0x09,0x0c,0x48,0x09,0x19,0x80,0x17,0x13,0x13,0x00,0x17,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f, -0x00,0x01,0x0a,0x00,0x0a,0x00,0x1b,0x1a,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x10,0xc6,0x10,0xc4,0x00,0x2f,0xc4,0x1a,0xdd,0xd6,0x2b,0xd6,0x1a,0xfd,0xdc,0x2b,0xed,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x23,0x27,0x07,0x23,0x37,0x33, -0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x3b,0x79,0xa4,0xa6,0x70,0xd7,0x85,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfd,0xde,0x94,0x94,0xfa,0x00,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x3b,0xb3,0x02,0x00,0x04,0x0a,0xb8,0xff,0xc0, -0x40,0x18,0x09,0x0c,0x48,0x0a,0x0d,0xd9,0x40,0x07,0x02,0x80,0x00,0x00,0x0b,0x0f,0xf3,0x04,0x0b,0xf3,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x11,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0x2b,0xc4,0xd4,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x37,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16, -0x33,0x32,0x37,0xd7,0xb5,0xa7,0xdd,0xf4,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x05,0xaa,0xf6,0xf6,0x14,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x02,0x00,0x38,0x04,0xc2,0x02,0x5c,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x3d,0xb3,0x03,0x01,0x0a,0x04,0xb8,0xff,0xc0,0x40,0x19,0x09,0x0c,0x48,0x04,0x07,0xd9,0x40,0x0d, -0x02,0x80,0x00,0x00,0x05,0x09,0xf3,0x0a,0x05,0xf3,0x04,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0x2b,0xc4,0xd4,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x07,0x33,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x01,0xaa,0x7f,0xdd,0xa8, -0xbe,0x66,0x10,0x9e,0xa2,0x0a,0x64,0x04,0x96,0x74,0x70,0x9c,0x05,0xaa,0xf6,0xe2,0x86,0x86,0x72,0x8a,0x8c,0x00,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x07,0x0a,0x00,0x11,0x00,0x1d,0x00,0x68,0x40,0x0d,0x0f,0xe2,0x10,0x02,0x20,0x02,0x30,0x02,0xf0,0x02,0x04,0x02,0x0b,0xb8,0xff,0xd8,0x40,0x0a,0x0d,0x10,0x48,0x0b,0x08,0x09, -0x09,0x1b,0x12,0x18,0xb8,0xff,0xc0,0x40,0x21,0x09,0x0c,0x48,0x18,0x1b,0xd9,0x40,0x15,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x0b,0x18,0x1d,0xf3,0x12,0x19,0xf3,0x18,0x18,0x12,0x1f,0x1e,0x11,0x12,0x39,0x39,0x10,0xe1,0x10,0xe1,0x11,0x39,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0x1a,0xfd, -0xd4,0x2b,0xc4,0x12,0x39,0x2f,0xd5,0xcd,0x2b,0xd4,0x5d,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xcd,0x25,0x2a,0x5b,0x6f,0x50,0x36,0x6c,0x70,0x5e,0x11,0x28,0x01,0x7d,0x0a,0x9d,0x70,0x75,0x94,0x05, -0x64,0x0b,0xa1,0x9d,0x12,0x07,0x06,0x04,0x54,0x48,0x3c,0x54,0x07,0x31,0x72,0x4c,0x40,0x08,0xde,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x1e,0x00,0x5c,0xb3,0x12,0x07,0xda,0x0c,0xb8,0xff,0xc0,0xb7,0x09,0x0c,0x48,0x0c,0x10,0xda,0x03,0x0a,0xb8,0xff,0xc0,0x40,0x23, -0x09,0x0c,0x48,0x0a,0x1e,0x19,0x1c,0xd9,0x16,0x1e,0xf3,0x13,0x13,0x00,0x12,0x1a,0xf3,0x19,0x19,0x09,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x20,0x1f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xfd,0xdc,0xc4,0xd6,0x2b,0xd4,0xfd, -0xdc,0x2b,0xed,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x34,0x0a,0x9d,0x6f,0x76,0x94,0x05,0x65,0x0a,0xa2,0x9c, -0x12,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfe,0xda,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x02,0x00,0x6c,0x04,0xc2,0x03,0x68,0x06,0xbe,0x00,0x11,0x00,0x18,0x00,0x5e,0x40,0x0c,0x0f,0xe2,0x0f,0x02,0x01,0x02,0x40,0x0d,0x10,0x48,0x02,0x0b,0xb8,0xff,0xe8,0xb6,0x09,0x0c,0x48,0x0b,0x40,0x08,0x09,0xb8,0xff,0xc0, -0x40,0x21,0x09,0x0c,0x48,0x09,0x09,0x17,0x16,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x40,0x11,0x11,0x0b,0x0b,0x80,0x12,0x90,0x12,0xa0,0x12,0x03,0x12,0xc0,0x16,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0xc6,0xc6,0x1a,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xcd,0x39,0x2f,0x2b,0xd5,0x1a,0xcd,0x2b,0xdc,0x2b,0x5d,0xed, -0x31,0x30,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x50,0x24,0x2c,0x59,0x6f,0x4b,0x39,0x6d,0x71,0x5f,0x11,0x28,0x4e,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x06,0xba,0x04,0x53,0x48,0x3c,0x54,0x07,0x32,0x73,0x4b,0x40,0x08,0xfe,0x72,0x94,0x94, -0xfa,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x0b,0xb6,0x02,0x18,0x13,0x19,0x06,0x07,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x04,0x18,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00, -0x00,0x0e,0xb9,0x00,0x02,0xff,0xf7,0xb4,0x23,0x29,0x0f,0x00,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x85,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x7c,0x01,0x5e,0x00,0x16,0xb9,0x00,0x02,0xff,0xf2,0x40,0x09,0x1a,0x19,0x0b,0x0b,0x3e,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x27,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x44,0x00,0xf4,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0b,0x31,0x25,0x10,0x14,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xad,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07, -0x02,0x48,0x01,0x2e,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf4,0x40,0x0a,0x16,0x16,0x06,0x07,0x25,0x03,0x02,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0x52,0x06,0x50,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x48,0x00,0xc2,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02, -0x00,0x28,0x24,0x10,0x14,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xad,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x49,0x00,0x13,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf7,0x40,0x0a,0x15,0x16,0x06,0x07,0x25,0x03,0x02,0x1a,0x05,0x26, -0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xe8,0xff,0xe8,0x03,0x83,0x06,0x50,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x49,0xa6,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x25,0x26,0x0d,0x12,0x25,0x03,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12, -0x08,0x1c,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x56,0x01,0x07,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9,0x40,0x0a,0x27,0x28,0x06,0x07,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0xe9,0x06,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4a, -0x00,0x81,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf3,0x40,0x0a,0x37,0x38,0x0d,0x12,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x3f,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x51,0x00,0xa3,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9, -0x40,0x0a,0x28,0x29,0x06,0x07,0x25,0x03,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xe4,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x4b,0x2f,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x05,0x38,0x39,0x0d,0x12,0x25,0x03,0x02,0x37,0x11,0x26,0x00,0x2b,0x35,0x35,0x01, -0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x07,0x6b,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0xd7,0x01,0x11,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x1e,0x40,0x0c,0x02,0x14,0x05,0x26,0x03,0x17,0x1a,0x20,0x05,0x00,0x3e,0x02,0xb8,0xff,0xf4,0xb4,0x14,0x10,0x06,0x07,0x3e,0x2b,0x35,0x2b, -0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x06,0x0e,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0x97,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x24,0x11,0x26,0x03,0x29,0x2a,0x30,0x08,0x14,0x3e,0x02,0x1f,0x24,0x20,0x08,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b, -0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xfb,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x52,0x01,0x59,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x1a,0x14,0x06,0x07,0x25,0x03,0x02,0x17,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xa0, -0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4c,0x00,0xe5,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x06,0x27,0x2d,0x0d,0x12,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xfc,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x53,0x01,0x43,0x01,0x5c, -0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfa,0x40,0x0a,0x14,0x1a,0x06,0x07,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xa0,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4d,0x00,0xe5,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x1f,0x27,0x2d,0x0d,0x12,0x25, -0x03,0x02,0x2d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x65,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x54,0x01,0x64,0x01,0x5b,0x00,0x2c,0xb1,0x03,0x02,0xb8,0xff,0xfb,0x40,0x1a,0x1a,0x19,0x06,0x07,0x25,0x03,0x6f,0x25,0x8f,0x25,0x02,0x02,0x20,0x25,0x30,0x25, -0x50,0x25,0x60,0x25,0x80,0x25,0x05,0x25,0x05,0x26,0x00,0x2b,0x71,0x35,0x71,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x07,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4e,0x00,0xe5,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfc,0x40,0x0a,0x2a,0x29,0x0d,0x12,0x25,0x03,0x02,0x35,0x11,0x26, -0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x3f,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x55,0x00,0xad,0x01,0x5b,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x1a,0x10,0x06,0x07,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8, -0x03,0x83,0x06,0xe4,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x4f,0x35,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x36,0x3c,0x0d,0x12,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x07,0x1a,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0xda,0x01,0x5e, -0x01,0x5c,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x13,0x05,0x26,0x03,0x17,0x20,0x26,0x05,0x00,0x3e,0x02,0x02,0x16,0x10,0x06,0x07,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xda,0x00,0xdc,0x00,0x00, -0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x23,0x11,0x26,0x03,0x29,0x30,0x36,0x08,0x14,0x3e,0x02,0x25,0x26,0x20,0x08,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xf3,0x00,0x00,0x00,0x0b, -0xb6,0x01,0x10,0x0f,0x15,0x02,0x0b,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xf2,0x00,0x00,0x00,0x0b,0xb6,0x02,0x27,0x1d,0x23,0x19,0x13,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x83,0x02,0x26,0x00,0x28, -0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x0d,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0c,0x1d,0x11,0x02,0x0b,0x3e,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x27,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x19,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x30,0x2b,0x1f, -0x19,0x13,0x3e,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x0e,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xdc,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x07,0x16,0x0c,0x02,0x0b,0x3e,0x01,0x00,0x16,0x01,0x16,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00, -0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xb2,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xc8,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0d,0x24,0x1a,0x0c,0x12,0x25,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x6f,0x07,0xab,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07, -0x02,0x48,0x00,0xdf,0x01,0x5b,0x00,0x17,0x40,0x0d,0x02,0x01,0x13,0x14,0x10,0x02,0x03,0x25,0x02,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x5a,0x06,0x50,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x48,0x00,0xca,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf0, -0x40,0x0a,0x23,0x24,0x16,0x0f,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xb4,0x07,0xad,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x49,0xff,0xcc,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x19,0x10,0x13,0x02,0x03,0x25,0x02,0x01,0x16,0x05,0x26,0x00,0x2b,0x35, -0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0c,0xff,0xe8,0x03,0xdd,0x06,0x50,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x02,0x49,0xca,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x1f,0x20,0x16,0x0f,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x20,0x08,0x1a, -0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x56,0x00,0xb8,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x15,0x22,0x1e,0x02,0x03,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x32,0x06,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x4a,0x00,0xca,0x00,0x00, -0x00,0x17,0x40,0x0d,0x03,0x02,0x19,0x31,0x32,0x16,0x0f,0x25,0x03,0x02,0x30,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x08,0x40,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x51,0x00,0x4e,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x0f,0x23,0x1f,0x02,0x03,0x25,0x02,0x01, -0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0xe4,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x02,0x4b,0x47,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x10,0x31,0x2d,0x19,0x13,0x25,0x03,0x02,0x31,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc, -0xfe,0xc6,0x03,0xb4,0x07,0x6b,0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xbf,0x01,0x5d,0x01,0x07,0x02,0x45,0x00,0xea,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x10,0x05,0x26,0x02,0x07,0x16,0x1c,0x01,0x00,0x3e,0x01,0xb8,0xff,0xfd,0xb4,0x10,0x0c,0x01,0x00,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x60, -0xfe,0xc6,0x03,0xdd,0x06,0x0e,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xb4,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xef,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x1e,0x11,0x26,0x03,0x26,0x24,0x2a,0x0c,0x12,0x3e,0x02,0x0c,0x1e,0x1a,0x0c,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x9a,0x00,0x00, -0x01,0xb3,0x07,0x83,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x02,0x50,0xff,0xef,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0d,0x02,0x03,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x88,0x00,0x00,0x01,0xa1,0x06,0x27,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x02,0x44,0xdd,0x00,0x00,0x13, -0x40,0x0b,0x01,0x00,0x0e,0x0d,0x02,0x03,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xb2,0xfe,0xc6,0x01,0x78,0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x06,0x02,0x45,0xc0,0x00,0x00,0x0b,0xb6,0x01,0x05,0x07,0x0d,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x01,0x66, -0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x06,0x02,0x45,0xa3,0x00,0x00,0x0e,0xb9,0x00,0x02,0xff,0xfd,0xb4,0x13,0x19,0x03,0x09,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x05,0xaa,0x05,0xb2,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xa8,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0xff,0xf9,0xb4,0x1b,0x21, -0x03,0x09,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x50,0x04,0x18,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x06,0x00,0x00,0x00,0x0b,0xb6,0x02,0x03,0x1b,0x21,0x03,0x09,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x83,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x50, -0x01,0xf6,0x01,0x5c,0x00,0x16,0xb9,0x00,0x02,0xff,0xee,0x40,0x09,0x22,0x21,0x0c,0x06,0x3e,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x27,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x43,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe7,0x40,0x09,0x22,0x21,0x0c, -0x06,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xad,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x48,0x01,0xb3,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1e,0x1e,0x0c,0x0c,0x25,0x03,0x02,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff, -0x00,0x60,0xff,0xe8,0x04,0x98,0x06,0x50,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x48,0x01,0x08,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x1e,0x1e,0x0c,0x0c,0x25,0x03,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xad,0x02,0x26,0x00,0x32,0x00,0x00, -0x01,0x07,0x02,0x49,0x00,0x94,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x21,0x21,0x0c,0x06,0x25,0x03,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x30,0xff,0xe8,0x04,0x50,0x06,0x50,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0x49,0xee,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd, -0x40,0x0a,0x21,0x21,0x06,0x06,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x1a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x56,0x01,0x78,0x01,0x5c,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xed,0x40,0x0a,0x2f,0x30,0x0c,0x06,0x25,0x03,0x02,0x2e,0x05,0x26, -0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xbe,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x4a,0x00,0xe5,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x2c,0x2c,0x06,0x06,0x25,0x03,0x02,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e, -0xff,0xe8,0x05,0xaa,0x08,0x40,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x51,0x01,0x29,0x01,0x5c,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x2d,0x2d,0x0c,0x06,0x25,0x03,0x02,0x2f,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xe4,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06, -0x02,0x4b,0x70,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf5,0x40,0x0a,0x30,0x31,0x0c,0x06,0x25,0x03,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x05,0xaa,0x07,0x6b,0x02,0x26,0x00,0x32,0x00,0x00,0x00,0x27,0x00,0xd7,0x01,0xa4,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0xb0,0x00,0x00, -0x00,0x1b,0x40,0x12,0x02,0x1c,0x05,0x26,0x03,0x01,0x22,0x28,0x03,0x09,0x3e,0x02,0x16,0x1c,0x18,0x03,0x09,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x50,0x06,0x0e,0x02,0x26,0x00,0x52,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xf7,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xfe,0x00,0x00,0x00,0x1e, -0xb4,0x02,0x1c,0x11,0x26,0x03,0xb8,0xff,0xfb,0x40,0x0c,0x22,0x28,0x03,0x09,0x3e,0x02,0x15,0x1c,0x18,0x03,0x09,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x07,0x67,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x0e,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x00,0x27,0x27,0x18,0x18, -0x25,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x0a,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x61,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x26,0x26,0x10,0x10,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e, -0xff,0xe8,0x06,0x3a,0x07,0x67,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xc8,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x0a,0x27,0x27,0x18,0x18,0x25,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x0a,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x02, -0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xfc,0x40,0x09,0x26,0x26,0x19,0x19,0x25,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x07,0x83,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x02,0x50,0x02,0x0c,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x00,0x30,0x2f,0x18,0x18,0x25,0x02,0x2f,0x05, -0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x27,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x45,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe9,0x40,0x09,0x2f,0x2e,0x19,0x10,0x25,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a, -0x07,0x0e,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0xb0,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x0f,0x30,0x26,0x15,0x0f,0x25,0x02,0x30,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x05,0xb2,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xf8,0x00,0x00,0x00,0x13, -0x40,0x0b,0x02,0x03,0x2f,0x25,0x0d,0x07,0x3e,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x06,0x3a,0x06,0x3e,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xac,0x00,0x00,0x00,0x0b,0xb6,0x02,0x03,0x2c,0x2c,0x12,0x12,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6, -0x04,0xa9,0x04,0xfc,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x02,0x00,0x00,0x00,0x0b,0xb6,0x02,0x05,0x2b,0x2b,0x0a,0x0a,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xfe,0xc6,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x66,0x00,0x00,0x00,0x0b,0xb6,0x01,0x07,0x14,0x14,0x02, -0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xd1,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xfb,0xb4,0x18,0x18,0x0c,0x0c,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x83,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07, -0x02,0x50,0x01,0x97,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1f,0x13,0x05,0x0d,0x3e,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x27,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x22,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x20,0x23,0x17,0x08,0x11,0x3e,0x01, -0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x67,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xb8,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x19,0x19,0x06,0x0c,0x3e,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7, -0x06,0x0a,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x38,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x06,0x1d,0x1d,0x09,0x10,0x3e,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x67,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x7a,0x01,0x5d,0x00,0x13, -0x40,0x0b,0x01,0x13,0x19,0x19,0x06,0x0c,0x3e,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x06,0x0a,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x23,0x1d,0x1c,0x09,0x10,0x3e,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b, -0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x83,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x9d,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe6,0x40,0x09,0x22,0x21,0x06,0x0c,0x3e,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x06,0x27,0x02,0x26,0x02,0x43, -0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x27,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x26,0x25,0x09,0x10,0x3e,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x0e,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x66,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0a, -0x22,0x18,0x06,0x0c,0x3e,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x05,0xb2,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xdd,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x07,0x26,0x1c,0x08,0x1b,0x3e,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0xaa,0xfe,0xc6,0x05,0xd0,0x06,0x96,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x66,0x00,0x00,0x00,0x0b,0xb6,0x01,0x07,0x1e,0x1e,0x02,0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x04,0xc7,0x04,0xfc,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe5,0x00,0x00,0x00,0x0b,0xb6,0x01, -0x00,0x1f,0x25,0x0a,0x01,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0xfe,0xc6,0x04,0x60,0x05,0x9a,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xdf,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x11,0x17,0x03,0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x02,0x26,0x00,0x5c,0x00,0x00, -0x01,0x07,0x02,0x45,0x01,0xc2,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xec,0xb4,0x15,0x1b,0x14,0x14,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x83,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x1a,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x18,0x1f,0x13,0x05,0x00,0x3e,0x01,0x18,0x05,0x26,0x00, -0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x27,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x02,0x44,0x00,0xc9,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x26,0x1a,0x0c,0x00,0x3e,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x0e,0x02,0x26, -0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xde,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x08,0x18,0x0e,0x05,0x00,0x3e,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0xb2,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x8b,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff, -0xfd,0x40,0x09,0x1f,0x15,0x0c,0x00,0x3e,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x29,0xfe,0x85,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0x93,0x00,0x00,0x00,0x0b,0xb6,0x01,0x1d,0x0b,0x0b,0x03,0x03,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x85,0x02,0x81, -0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x06,0x01,0x9c,0x2a,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xe7,0xb4,0x17,0x15,0x04,0x00,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x67,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x0e, -0x0c,0x02,0x0b,0x3e,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xe5,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xd9,0x40,0x09,0x1c,0x1a,0x19,0x13,0x3e,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff, -0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x67,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xda,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x16,0x14,0x0b,0x01,0x3e,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x06,0x0a,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07, -0x00,0x43,0x00,0xde,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb4,0x40,0x09,0x11,0x0f,0x07,0x0d,0x3e,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff, -0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4c,0x00,0x00,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4d,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0xf6,0x05,0x9a,0x00,0x0d,0x00,0x5b,0x40,0x2c,0x05,0x08,0x91,0x02,0x0b,0x0b,0x07,0x01,0x91,0x0c,0x03,0x07,0x09,0x08,0x04,0x00,0x04,0x00, -0x0f,0x02,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x7e,0x0b,0x08,0x08,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x08,0xb8,0xff,0xe0,0xb3,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x00,0x2f,0x3f,0xed,0x12, -0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x03,0xf6,0xfd,0xc0,0x01,0x5a,0xfe,0xa6,0xa8,0xe5,0xe5,0x02,0xe8,0x05,0x02,0xfe,0x36,0x9a,0xfd,0x62,0x02,0x9e,0x9a,0x02,0x62,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x29,0x04,0x00,0x00,0x0d,0x00,0x5e,0x40,0x27,0x05,0x08, -0x96,0x02,0x0b,0x0b,0x07,0x01,0x95,0x0c,0x0f,0x07,0x09,0x07,0x04,0x00,0x04,0x00,0x0f,0x02,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x0b,0x07,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b, -0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xc6,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x03,0x29,0xfe,0x6b,0x01,0x02,0xfe,0xfe,0xa4,0xd2,0xd2,0x02,0x39,0x03,0x74,0xfe,0xe2,0x85,0xfe,0x2f,0x01,0xd1,0x85,0x01, -0xaa,0x00,0x00,0x01,0xff,0xea,0xfe,0x80,0x07,0x0a,0x05,0x9a,0x00,0x21,0x00,0xae,0x40,0x13,0x13,0x0d,0x1c,0x04,0x04,0x10,0x1f,0x10,0x0e,0x12,0x20,0x91,0x03,0x40,0x1d,0x17,0x12,0x03,0x01,0xb8,0x01,0x30,0xb3,0x09,0x03,0x0e,0x02,0xb8,0x01,0x2c,0x40,0x09,0x21,0x1d,0x1e,0x1e,0x08,0x20,0x03,0x02,0x21,0xb8,0xff,0xf8,0x40,0x26, -0x0c,0x06,0x4d,0x21,0x0e,0x08,0x12,0x11,0x11,0x09,0x0e,0x0f,0x0f,0x09,0x42,0x0f,0x1f,0x18,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x17,0x10,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf4,0x40,0x11,0x0c,0x06,0x4d,0x09,0x13,0x0b,0x06,0x4d,0x09,0x09,0x23,0x22,0x2f, -0x23,0x3f,0x23,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x33,0x10,0xe0,0x2b,0x11,0x33,0x33,0x11,0x39,0x2f,0x33,0x10,0xe1,0x00,0x2f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x1a,0x10,0xed,0x11,0x12,0x39,0x39,0x11,0x17,0x33,0x31,0x30,0x01,0x23, -0x11,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x07,0x0a,0x99,0x50,0xfd,0xcf,0x18,0x0d,0x05,0x9f,0x04,0x0f,0x16,0xfd,0xcf,0xe3,0x02,0x91,0xfd,0x9b,0xce,0x02,0x1a,0x17,0x0e,0x04,0x9f,0x05,0x0d,0x18,0x02,0x1a, -0xcd,0xfd,0x9b,0x02,0x0d,0x8b,0xfe,0x80,0x01,0x80,0x02,0x90,0x1c,0x16,0xfd,0x3e,0x02,0xc2,0x19,0x19,0xfd,0x70,0x02,0xe8,0x02,0xb2,0xfd,0x93,0x1b,0x16,0x02,0x9e,0xfd,0x62,0x16,0x1b,0x02,0x6d,0xfd,0x4e,0xfd,0xae,0x00,0x01,0x00,0x04,0xfe,0x8b,0x06,0x00,0x04,0x00,0x00,0x19,0x00,0xa4,0xb9,0x00,0x01,0x01,0x31,0x40,0x15,0x04, -0x09,0x0f,0x14,0x04,0x0c,0x17,0x0c,0x07,0x15,0x0e,0x11,0x0f,0x18,0x96,0x03,0x40,0x0a,0x03,0x07,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0x01,0x2c,0x40,0x2c,0x02,0x15,0x16,0x16,0x06,0x18,0x03,0x02,0x02,0x19,0x0e,0x06,0x0e,0x0d,0x0d,0x07,0x0a,0x0b,0x0b,0x07,0x42,0x0b,0x17,0x12,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08, -0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x11,0x0c,0x07,0xb8,0xff,0xf0,0x40,0x11,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x0c,0x0b,0x06,0x4d,0x07,0x07,0x1a,0x1b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x33,0x10,0xe0,0x32,0x2f, -0x33,0x33,0x11,0x39,0x2f,0x33,0x10,0xe1,0x2b,0x00,0x2f,0x33,0x33,0x1a,0x10,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x33,0x06,0x00,0x8c,0x5c,0xfe,0x36,0x04,0x9c,0x04,0xfe, -0x35,0xdb,0x01,0xfc,0xfe,0x23,0xd1,0x01,0xb6,0x04,0x9c,0x04,0x01,0xb6,0xd3,0xfe,0x21,0x01,0x81,0x87,0xfe,0x8b,0x01,0x75,0x01,0xfa,0xfe,0x06,0x01,0xfa,0xfe,0x06,0x02,0x10,0x01,0xf0,0xfe,0x21,0x01,0xdf,0xfe,0x21,0x01,0xdf,0xfe,0x10,0xfe,0x71,0x00,0x01,0x00,0xbc,0xfe,0x80,0x04,0xa8,0x05,0x9a,0x00,0x14,0x00,0x87,0xb9,0x00, -0x01,0x01,0x30,0x40,0x1c,0x0f,0x04,0x12,0x12,0x08,0x10,0x0b,0x03,0x13,0x91,0x02,0x02,0x08,0x10,0x11,0x11,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0xb8,0x01,0x2c,0xb2,0x13,0x03,0x02,0xb8,0xff,0xf8,0x40,0x1a,0x0d,0x06,0x4d,0x02,0x02,0x16,0x12,0x0b,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08, -0x08,0x0b,0x06,0x4d,0x08,0x7e,0x09,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x11,0x33,0x2f,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x33,0x00,0x2f,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11, -0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x04,0xa8,0x9a,0x50,0xfd,0xd0,0x1b,0x0b,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x0c,0x8c,0xfe,0x80,0x01,0x80,0x02,0x90,0x20,0x12,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b, -0x02,0x71,0xfd,0x4e,0xfd,0xae,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x00,0x04,0x00,0x00,0x10,0x00,0x7b,0xb9,0x00,0x01,0x01,0x31,0x40,0x1d,0x0f,0x96,0x03,0x0b,0x04,0x0e,0x0e,0x06,0x0c,0x09,0x0f,0x11,0x03,0x06,0x0c,0x0d,0x0d,0x06,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0xb8,0x01,0x2c,0x40,0x19,0x0f,0x03,0x02, -0x02,0x12,0x0e,0x09,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0xb8,0xff,0xf8,0x40,0x0e,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x11,0x39,0x2f,0x33,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x33,0x00, -0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x33,0x04,0x00,0x8c,0x64,0xfe,0x3e,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd9,0xfe,0x23,0x01,0x7f,0x89,0xfe,0x8b,0x01,0x75,0x01,0xea,0xfe,0x16,0x04,0x00,0xfe,0x2d,0x01,0xd3, -0xfe,0x10,0xfe,0x71,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x18,0x00,0xaa,0x40,0x51,0x00,0x03,0x10,0x03,0x20,0x03,0x03,0x03,0x03,0x02,0x0a,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x14,0x14,0x0d,0x15,0x12,0x11,0x0f,0x16,0x0f,0x11,0x16,0x0f,0x06,0x05,0x02,0x01,0x08,0x01,0x06,0x08,0x01,0x0f,0x08,0x18,0x18,0x0a, -0x16,0x0d,0x03,0x01,0x0a,0x15,0x02,0x12,0x0f,0x05,0x01,0x05,0x05,0x00,0x16,0x17,0x17,0x01,0x19,0x00,0x29,0x00,0x02,0x0f,0x00,0x01,0x00,0x00,0x1a,0x08,0x0d,0x0f,0x18,0x04,0x0a,0x7e,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x2f,0x2b,0x2b,0x2b,0xe1, -0x17,0x32,0x11,0x39,0x2f,0x5d,0x5d,0x33,0x39,0x2f,0x33,0x11,0x39,0x2f,0x5d,0x33,0xcd,0x32,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x11,0x12,0x01,0x39,0x10,0x87,0x04,0xc0,0xc0,0xc0,0x11,0x12,0x01,0x39,0x10,0x87,0x04,0xc0,0xc0,0xc0,0x11,0x00,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x31,0x30,0x21,0x23,0x01,0x11, -0x23,0x11,0x27,0x26,0x35,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x37,0x11,0x33,0x15,0x01,0x33,0x01,0x04,0xa2,0xea,0xfe,0x58,0x4c,0x36,0x26,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x36,0x4c,0x01,0x96,0xd1,0xfd,0x99,0x01,0xf4,0xfe,0xf2,0x01,0x68,0x42,0x2f,0x03,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x3f,0x01,0x52,0xf8,0x01, -0xd8,0xfd,0x50,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf4,0x04,0x00,0x00,0x14,0x00,0x81,0x40,0x4c,0x1f,0x04,0x01,0x50,0x04,0x60,0x04,0x02,0x04,0x04,0x02,0x08,0x5f,0x0f,0x6f,0x0f,0x02,0x0f,0x0f,0x0b,0x11,0x0e,0x0d,0x12,0x0d,0x05,0x02,0x01,0x06,0x01,0x0d,0x06,0x14,0x14,0x08,0x12,0x0b,0x0f,0x01,0x08,0x11,0x02,0x0e,0x05, -0x05,0x00,0x12,0x38,0x13,0x48,0x13,0x02,0x13,0x13,0x01,0x0f,0x00,0xaf,0x00,0x02,0x39,0x00,0x49,0x00,0x02,0x00,0x00,0x16,0x06,0x0b,0x0d,0x14,0x04,0x08,0x84,0x09,0x2f,0xe1,0x17,0x32,0x11,0x39,0x2f,0x5d,0x5d,0x33,0x39,0x2f,0x5d,0x33,0x11,0x39,0x2f,0x33,0xcd,0x32,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x10,0x87, -0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x11,0x00,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x5d,0x31,0x30,0x21,0x23,0x01,0x15,0x23,0x11,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x37,0x35,0x33,0x15,0x01,0x33,0x01,0x03,0xf4,0xe4,0xfe,0xe6,0x4c,0x5c,0x04,0xa4,0xa4,0x04,0x5c,0x4c,0x01,0x06,0xd9,0xfe,0x23,0x01,0x33,0xc1,0x01,0x13,0x65, -0xfe,0x16,0x04,0x00,0xfe,0x2d,0x65,0xed,0x9b,0x01,0x1c,0xfe,0x10,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x05,0xb2,0x05,0x9a,0x00,0x0f,0x00,0xb7,0x40,0x0b,0x05,0x91,0x40,0x0a,0x09,0x06,0x0a,0x91,0x2b,0x30,0x01,0xb8,0x01,0x30,0x40,0x13,0x0e,0x91,0x03,0x0c,0x09,0x03,0x03,0x06,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d, -0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0x40,0x19,0x0c,0x06,0x4d,0x02,0x02,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x0b,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xe0,0x40,0x1e,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d, -0x03,0x03,0x11,0x09,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf7,0xb3,0x0c,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x7d,0x2f,0x2b,0x2b,0xe1, -0x2b,0x2b,0x00,0x18,0x2f,0x33,0x3f,0x33,0x10,0xed,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0xb2,0x9b,0xcd,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0xc0,0xfe,0x80,0x01,0x80,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xfe,0x00, -0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x90,0x04,0x00,0x00,0x0f,0x00,0x9c,0xb9,0x00,0x01,0x01,0x31,0x40,0x13,0x0e,0x95,0x03,0x05,0x95,0x40,0x0a,0x09,0x06,0x0a,0x95,0x2b,0x30,0x0c,0x09,0x0f,0x03,0x06,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xf8,0x40, -0x40,0x0d,0x06,0x4d,0x02,0x02,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x0b,0x03,0x03,0x0d,0x06,0x4d,0x03,0x03,0x0b,0x06,0x4d,0x03,0x03,0x11,0x0a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0x08,0x0d,0x06,0x4d,0x07,0x40,0x11, -0x01,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x2f,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x00,0x2f,0x33,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x10,0xed,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x04,0x90,0x8e,0xae,0xfd,0xf6, -0xa4,0xa4,0x02,0x0a,0xa4,0x98,0xfe,0x8b,0x01,0x75,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfc,0x8c,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x0e,0xfe,0x29,0x03,0xd5,0x04,0x00,0x00,0x0c,0x00,0x68,0x40,0x0c,0x03,0x1b,0x04,0x42,0x01,0x01,0x0d,0x0c,0x06,0x0f, -0x0c,0x00,0xb8,0xff,0xf8,0x40,0x24,0x0c,0x06,0x4d,0x00,0x0e,0x01,0x06,0x05,0x04,0x05,0x42,0x05,0x08,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x04,0x07,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf4,0x40,0x0a,0x0c,0x06,0x4d,0x04,0x04,0x0e,0x0d,0x4f,0x0e,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b, -0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0x11,0x01,0x33,0x10,0xe1,0x2b,0x32,0x00,0x18,0x3f,0x33,0x12,0x39,0x7d,0x2f,0x18,0xe5,0x3f,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x17,0x33,0x36,0x37,0x01,0x03,0xd5,0xfe,0x69,0xa4,0xfe,0x74,0xb6,0x01,0x0d,0x1d,0x02,0x0a,0x16,0x01,0x1b,0x04,0x00,0xfc,0x06,0xfe,0x23,0x01, -0xdf,0x03,0xf8,0xfd,0x04,0x64,0x22,0x46,0x02,0xf8,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x14,0x00,0x7d,0x40,0x16,0x11,0x0d,0x07,0x04,0x97,0x40,0x0a,0x01,0x01,0x06,0x14,0x0d,0x03,0x06,0x11,0x10,0x05,0x06,0x03,0x03,0x14,0x00,0xb8,0xff,0xd8,0x40,0x23,0x0b,0x06,0x4d,0x00,0x0e,0x05,0x08,0x08,0x06,0x0d,0x0c, -0x06,0x0c,0x42,0x0c,0x01,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x7e,0x0b,0x06,0xb8,0xff,0xf8,0x40,0x0a,0x0b,0x06,0x4d,0x06,0x06,0x16,0x15,0x20,0x16,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x10,0xe0,0x2b,0x32, -0x39,0x2f,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0x33,0x1a,0xed,0x32,0x12,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0x60,0xfe,0x27,0x01,0x52,0xfe,0xae,0xa8,0xfe,0xb7,0x01,0x49,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x0a, -0x1c,0x01,0x50,0x05,0x9a,0xfc,0x72,0x85,0xfe,0x79,0x01,0x87,0x85,0x02,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x22,0x36,0x02,0x88,0x00,0x01,0x00,0x0e,0xfe,0x29,0x03,0xd5,0x04,0x00,0x00,0x12,0x00,0x60,0x40,0x35,0x04,0x1b,0x02,0x05,0x96,0x08,0x40,0x0c,0x0c,0x08,0x10,0x0a,0x0f,0x12,0x08,0x00,0x00,0x10,0x11,0x0e,0x02,0x07,0x07,0x05, -0x0a,0x09,0x09,0x05,0x42,0x09,0x0d,0x0c,0x12,0x02,0x08,0x0d,0x06,0x4d,0x02,0x84,0x08,0x05,0x07,0x0d,0x06,0x4d,0x05,0x05,0x14,0x13,0x4f,0x14,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x32,0x39,0x39,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x10,0xe0,0x32,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x1a, -0x10,0xed,0x32,0x3f,0x31,0x30,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x01,0x33,0x01,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x03,0x92,0xfe,0xac,0xa4,0xfe,0xb4,0x01,0x4c,0xfe,0x74,0xb6,0x01,0x0d,0x1d,0x02,0x0a,0x16,0x01,0x1b,0xaa,0xfe,0x69,0x85,0xfe,0xae,0x01,0x52,0x85,0x04,0x00,0xfd,0x04,0x64,0x22,0x46,0x02,0xf8,0xfc, -0x00,0x00,0x00,0x01,0x00,0x1a,0xfe,0x80,0x04,0xc6,0x05,0x9a,0x00,0x19,0x00,0x5f,0xb9,0x00,0x01,0x01,0x30,0x40,0x20,0x06,0x11,0x17,0x03,0x0c,0x0c,0x0a,0x15,0x0e,0x03,0x18,0x91,0x03,0x1a,0x03,0x0a,0x06,0x0c,0x11,0x17,0x04,0x0d,0x15,0x16,0x0e,0x0d,0x16,0x0d,0x16,0x0d,0x0b,0x19,0xb8,0x01,0x2c,0x40,0x0d,0x18,0x03,0x03,0x02, -0x10,0x0d,0x06,0x4d,0x02,0x02,0x1b,0x0a,0x0b,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x33,0x11,0x33,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x12,0x17,0x39,0x00,0x2f,0x33,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16, -0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x04,0xc6,0x98,0x61,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xe0,0xfe,0x46,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe,0x3d,0x01,0x6b,0x8a,0xfe,0x80,0x01,0x80,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0xd1,0x02,0xc9,0xfe,0x08,0x32,0x32,0x42, -0x26,0x01,0xf4,0xfd,0x39,0xfd,0xc3,0x00,0x00,0x01,0x00,0x1a,0xfe,0x8b,0x03,0xb4,0x04,0x00,0x00,0x17,0x00,0x5f,0xb9,0x00,0x01,0x01,0x31,0x40,0x20,0x06,0x11,0x15,0x03,0x0c,0x0c,0x0a,0x13,0x0e,0x0f,0x16,0x96,0x02,0x18,0x02,0x0a,0x06,0x0c,0x11,0x15,0x04,0x0d,0x13,0x14,0x0e,0x0d,0x14,0x0d,0x14,0x0d,0x0b,0x17,0xb8,0x01,0x2c, -0x40,0x0d,0x16,0x03,0x03,0x02,0x08,0x0d,0x06,0x4d,0x02,0x02,0x19,0x0a,0x0b,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x33,0x11,0x33,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x12,0x17,0x39,0x00,0x2f,0x33,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03, -0x23,0x01,0x01,0x33,0x13,0x16,0x17,0x33,0x01,0x33,0x01,0x13,0x33,0x03,0xb4,0x8b,0x5c,0xc9,0x15,0x18,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x15,0x16,0x04,0x01,0x00,0xb5,0xfe,0xa8,0xfb,0x7f,0xfe,0x8b,0x01,0x75,0x01,0x4c,0x23,0x2b,0x09,0x45,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x26,0x2a,0x01,0xae,0xfd, -0xfa,0xfe,0x87,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x17,0x00,0xa0,0x40,0x40,0x11,0x11,0x0c,0x0f,0x06,0x06,0x01,0x04,0x02,0x15,0x07,0x91,0x0f,0x15,0x15,0x13,0x16,0x0f,0x0f,0x01,0x16,0x0c,0x03,0x01,0x05,0x06,0x12,0x11,0x40,0x0c,0x15,0x11,0x7f,0x2b,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06, -0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x15,0x01,0x1e,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x18,0x0b,0x06,0x4d,0x01,0x01,0x19,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x0b,0x0c,0x0b,0x06,0x4d,0x0b,0x2f, -0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x1a,0x18,0x10,0xcd,0x33,0x32,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x10,0xed,0x11,0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x11,0x23,0x11,0x06,0x26,0x35,0x11,0x33,0x11, -0x14,0x33,0x33,0x11,0x33,0x11,0x36,0x37,0x11,0x33,0x04,0x81,0xa8,0xa7,0x88,0x4c,0xce,0xea,0xa8,0xf6,0x1a,0x4c,0x86,0xa9,0xa8,0x02,0x85,0x58,0x17,0xfe,0xae,0x01,0x4a,0x0f,0xc3,0xbd,0x02,0x1b,0xfd,0xed,0xe7,0x01,0x6a,0xfe,0x9e,0x14,0x52,0x02,0x8c,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x03,0xdf,0x04,0x00,0x00,0x16,0x00,0x8e, -0x40,0x5b,0x10,0x10,0x0b,0x0e,0x06,0x06,0x01,0x04,0x02,0x07,0x14,0x14,0x12,0x15,0x0e,0x95,0x07,0x07,0x01,0x15,0x0b,0x0f,0x01,0x05,0x06,0x11,0x10,0x40,0x0b,0x14,0x10,0x85,0x2b,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x14,0x01,0x01,0x18,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08, -0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0a,0x05,0x0d,0x06,0x4d,0x0a,0x05,0x0c,0x06,0x4d,0x0a,0x04,0x0b,0x06,0x4d,0x0a,0x2f,0x18,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x33,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x1a,0x18,0x10,0xcd,0x33,0x32,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x39, -0x39,0x2f,0x12,0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x15,0x23,0x35,0x04,0x11,0x11,0x33,0x11,0x14,0x33,0x33,0x11,0x33,0x11,0x36,0x37,0x11,0x33,0x03,0xdf,0xa3,0x76,0x66,0x4c,0xfe,0x84,0xa4,0xc2,0x16,0x4c,0x6e,0x6e,0xa3,0x01,0x9c,0x40,0x16,0xd4,0xca,0x1c,0x01,0x86,0x01,0x5a,0xfe, -0xae,0xe1,0x01,0x25,0xfe,0xe5,0x14,0x38,0x01,0xdd,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x10,0x00,0x73,0x40,0x27,0x0b,0x06,0x04,0x91,0x0d,0x0d,0x07,0x0a,0x03,0x01,0x07,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01,0x1e,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d, -0x01,0xb8,0xff,0xfc,0x40,0x19,0x0b,0x06,0x4d,0x01,0x01,0x12,0x0b,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7e,0x08,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x08,0x0c,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00, -0x2f,0x33,0x3f,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x16,0x15,0x04,0x81,0xa8,0xf5,0xb4,0xe2,0xa8,0xa8,0xe4,0xc6,0xba,0xcf,0x02,0x12,0xe8,0x6e,0xfd,0x74,0x05,0x9a,0xfd,0x7a,0x7a,0xc2,0xb2,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec, -0x02,0x06,0x00,0x4b,0x00,0x00,0x00,0x02,0x00,0x56,0xff,0xe8,0x05,0x66,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x77,0x40,0x29,0x12,0x91,0x01,0x20,0x01,0x50,0x01,0x02,0x01,0x09,0x16,0x2f,0x06,0x01,0x06,0x06,0x04,0x91,0x09,0x04,0x16,0x91,0x0f,0x13,0x06,0x06,0x00,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x7d,0x01, -0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x06,0x4d,0x12,0x12,0x1a,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x7d,0x00,0x10,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x00,0x3f,0xed, -0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x5d,0x2f,0xed,0x31,0x30,0x13,0x21,0x26,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x25,0x21,0x16,0x12,0x33,0x32,0x00,0x56,0x04,0x5e,0x11,0xfe,0xe5,0xda,0xd8,0x9c,0x9e,0xe2,0x01,0x3f,0x01,0x6d,0xfe,0x94,0xfe,0xd3,0xfe,0xd1,0xfe,0xb8,0x04,0x5e,0xfc, -0x56,0x04,0xf2,0xcf,0xcf,0x01,0x02,0x03,0x1a,0xed,0x01,0x13,0x60,0xa4,0x54,0xfe,0x76,0xfe,0xa5,0xfe,0xbe,0xfe,0x5d,0x01,0x9f,0xfc,0xeb,0xfe,0xe7,0x01,0x18,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0x56,0x40,0x23,0x06,0x40,0x0b,0x0e,0x48,0x06,0x06,0x04,0x13,0x95,0x01,0x01,0x17,0x04, -0x95,0x09,0x10,0x17,0x95,0x0f,0x16,0x80,0x06,0x90,0x06,0x02,0x06,0x06,0x0c,0x00,0x13,0x14,0x0c,0x83,0x01,0xb8,0xff,0xf8,0x40,0x0e,0x0d,0x06,0x4d,0x01,0x01,0x1b,0x14,0x83,0x00,0x10,0x0d,0x06,0x4d,0x00,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x12,0x39,0x11,0x12,0x39,0x2f,0x5d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed, -0x12,0x39,0x2f,0x2b,0x31,0x30,0x13,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x02,0x35,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x52,0x02,0xd3,0x04,0xb0,0x9a,0xae,0x90,0x86,0xdf,0xd9,0xf8,0xfe,0xf1,0xc8,0xcb,0xdb,0x02,0xd1,0xfd,0xd7,0x02,0x84,0x7a,0x74,0xa3,0x02,0x29,0xab,0xba,0x72,0x9a, -0x62,0xfe,0xea,0xfe,0xf2,0xfe,0xd6,0x01,0x06,0xe5,0x35,0x8d,0x9f,0xa6,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x12,0x00,0x19,0x00,0x63,0x40,0x18,0x14,0x91,0x40,0x12,0x06,0x00,0x12,0x91,0x2b,0x30,0x0f,0x91,0x06,0x04,0x17,0x91,0x00,0x13,0x09,0x7d,0x12,0x0c,0x14,0x13,0xb8,0xff,0xf0,0xb3,0x0d,0x06, -0x4d,0x13,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x13,0xb8,0xff,0xe0,0x40,0x18,0x0b,0x06,0x4d,0x13,0x13,0x1b,0x14,0x7d,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d,0x03,0x18,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x12,0x39,0x39,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a, -0xed,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x00,0x23,0x22,0x00,0x07,0x05,0x21,0x16,0x00,0x33,0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xc0,0x12,0xfe,0xfd,0xd7,0xd0,0xfe,0xee,0x16,0x03,0xe4,0xfc,0x1c,0x15,0x01,0x0c,0xcb,0xdc,0x01, -0x09,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x03,0x30,0xf5,0x01,0x0d,0xfe,0xe8,0xea,0x9b,0xea,0xfe,0xec,0x01,0x0b,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x6b,0x40,0x18,0x13,0x95,0x40,0x11,0x06,0x00,0x11,0x95,0x2b,0x30,0x0e,0x95, -0x06,0x10,0x16,0x95,0x00,0x16,0x11,0x0c,0x13,0x09,0x83,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0xb6,0x0c,0x06,0x4d,0x30,0x12,0x01,0x12,0xb8,0xff,0xde,0x40,0x1b,0x0b,0x06,0x4d,0x12,0x12,0x19,0x13,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d, -0x2f,0x2b,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x20,0x02,0x52,0xe4,0xfe,0xf2,0x01,0x1a,0xf0,0xe5,0x01,0x01, -0xfe,0xeb,0x67,0x29,0xfe,0xe5,0x88,0xb1,0x17,0x02,0x98,0xfd,0x64,0x0a,0xb7,0x93,0x01,0x33,0x18,0x01,0x20,0xec,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x74,0x01,0x32,0xa0,0x92,0x8b,0xa3,0xbc,0x00,0x00,0x02,0x00,0x3e,0x06,0x1e,0x02,0x3a,0x07,0xcf,0x00,0x03,0x00,0x07,0x00,0x2d,0xb2,0x02,0x80,0x01,0xb8,0xff, -0xc0,0x40,0x12,0x09,0x0c,0x48,0x01,0x06,0xe2,0x05,0x02,0x62,0x00,0x01,0x00,0x00,0x05,0x04,0x04,0x09,0x05,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0x21,0x35,0x21,0x01,0xaa,0x7f,0xdd,0xa8,0x01,0x44,0xfe,0x04,0x01,0xfc,0x06,0xd9,0xf6,0xfe,0x4f,0x6e, -0x00,0x02,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x06,0x72,0x00,0x03,0x00,0x07,0x00,0x24,0x40,0x11,0x02,0x80,0x01,0x06,0xe2,0x05,0x02,0x62,0x00,0x01,0x00,0x00,0x05,0x04,0x04,0x09,0x05,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xde,0x1a,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0x21,0x35,0x21,0x01,0xaa,0x7f,0xdd, -0xa8,0x01,0x44,0xfe,0x04,0x01,0xfc,0x05,0x7d,0xf5,0xfe,0x50,0x6d,0x00,0x00,0x02,0x00,0x3e,0x06,0x1e,0x02,0x3a,0x07,0xcf,0x00,0x03,0x00,0x07,0x00,0x2d,0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x12,0x09,0x0c,0x48,0x00,0x05,0xe2,0x04,0x02,0x6d,0x00,0x01,0x00,0x00,0x04,0x07,0x07,0x09,0x04,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f, -0x5d,0xcd,0x00,0x2f,0xfd,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x05,0x35,0x21,0x15,0xcd,0xb4,0xa8,0xdd,0xfe,0xf2,0x01,0xfc,0x06,0xd9,0xf6,0xf6,0xbb,0x6e,0x6e,0x00,0x02,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x06,0x72,0x00,0x03,0x00,0x07,0x00,0x24,0x40,0x11,0x01,0x80,0x00,0x05,0xe2,0x04,0x02,0x6d,0x00,0x01,0x00,0x00, -0x04,0x07,0x07,0x09,0x04,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xde,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x05,0x35,0x21,0x15,0xcd,0xb4,0xa8,0xdd,0xfe,0xf2,0x01,0xfc,0x05,0x7d,0xf5,0xf5,0xbb,0x6d,0x6d,0x00,0x00,0x03,0x00,0x7d,0x06,0x1e,0x02,0xc4,0x07,0xd1,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x44, -0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x20,0x09,0x0c,0x48,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x02,0x01,0x0f,0x03,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1c,0x1d,0x19,0x07,0x2b,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x5f,0x5e,0x5d,0x00,0x2f,0x33,0xed,0x32,0x39,0x2f,0x2b, -0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x50,0xb4,0xa8,0xdd,0x93,0x28,0x3a,0x38,0x28,0x2a,0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x3b,0x27,0x29,0x3c,0x3a,0x06,0xdb,0xf6,0xf6,0xbd,0x39,0x2a,0x2a,0x39,0x3a, -0x29,0x29,0x3a,0x3b,0x28,0x2a,0x39,0x3a,0x29,0x29,0x3a,0x00,0x00,0x03,0x00,0x7d,0x04,0xc2,0x02,0xc4,0x06,0x74,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x3b,0x40,0x1f,0x01,0x80,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x02,0x01,0x0f,0x03,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1c,0x1d,0x19,0x07,0x2b,0x3a,0x2b, -0x01,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x5f,0x5e,0x5d,0x00,0x2f,0x33,0xed,0x32,0x39,0x2f,0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x50,0xb4,0xa8,0xdd,0x93,0x28,0x3a,0x38,0x28,0x2a, -0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x39,0x29,0x29,0x3c,0x3a,0x05,0x7f,0xf5,0xf5,0xbd,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x3b,0x28,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x02,0x00,0xa9,0x06,0x0c,0x03,0x2a,0x08,0x08,0x00,0x03,0x00,0x16,0x00,0x54,0xb9,0x00,0x01,0xff,0xc0,0x40,0x0f,0x09,0x0d,0x48,0x01,0x80,0x03,0x40,0x10,0x15, -0x48,0x03,0x16,0x10,0xda,0x0b,0xb8,0xff,0xc0,0x40,0x1e,0x09,0x0c,0x48,0x0b,0x14,0xda,0x07,0x0d,0x02,0x20,0x0a,0x0d,0x48,0x02,0x5f,0x00,0x6f,0x00,0x02,0x00,0x00,0x0e,0x04,0xc4,0x16,0x16,0x18,0x0d,0xc4,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xcd,0x2b,0x00,0x2f,0xd6,0xed,0xdc,0x2b,0xfd,0xc6,0xd6,0x2b,0x1a, -0xcd,0x2b,0x31,0x30,0x01,0x37,0x33,0x07,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x62,0xb4,0xa8,0xdc,0x01,0x48,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x07,0x12,0xf6,0xf6,0x1a,0x65,0x75,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0x00,0x02, -0x00,0xa9,0x04,0xb2,0x03,0x2a,0x06,0xae,0x00,0x03,0x00,0x16,0x00,0x3e,0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x1d,0x09,0x0c,0x48,0x00,0x16,0x10,0xda,0x0b,0x14,0xda,0x07,0x0d,0x02,0x5f,0x00,0x6f,0x00,0x02,0x00,0x00,0x0e,0x04,0xc4,0x16,0x16,0x18,0x0d,0xc4,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xcd,0x00, -0x2f,0xd6,0xed,0xdc,0xfd,0xc6,0xde,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x62,0xb4,0xa8,0xdc,0x01,0x48,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x05,0xb8,0xf6,0xf6,0x1a,0x65,0x75,0x25, -0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x03,0x00,0xa9,0x06,0x0c,0x03,0x2a,0x08,0x02,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x66,0x40,0x10,0x06,0x12,0xc1,0x00,0x00,0x0c,0x10,0x0c,0x02,0x0c,0x03,0x0c,0x2a,0x24,0xda,0x1f,0xb8,0xff,0xc0,0x40,0x10,0x09,0x0c,0x48,0x1f,0x28,0xda,0x40,0x1b,0x21,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x03,0xb8, -0xff,0xc0,0xb3,0x0a,0x0d,0x48,0x15,0xb8,0xff,0xc0,0x40,0x11,0x0a,0x0d,0x48,0x18,0x22,0x03,0x15,0x2b,0x3a,0x18,0xc4,0x2a,0x2a,0x2c,0x21,0xc4,0x22,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x2b,0x2b,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xd6,0x1a,0xed,0xdc,0x2b,0xfd,0xc6,0xd6,0x5f,0x5e,0x5d,0x32,0xed,0x32,0x31,0x30,0x01,0x22, -0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xab,0x29,0x3a,0x39,0x28,0x29,0x3c,0x3a,0xfe,0x56,0x28,0x3c,0x3a,0x28,0x2a,0x3a,0x38,0x01,0xd6,0x5d,0x55,0x43, -0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x07,0x3e,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x46,0x65,0x75,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0x00,0x00,0x03,0x00,0xa9,0x04,0xb2,0x03,0x2a,0x06,0xa8,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x3f,0x40,0x22,0x06,0x12,0xc1,0x00, -0x0c,0x2a,0x24,0xda,0x1f,0x28,0xda,0x40,0x1b,0x21,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x22,0x03,0x15,0x2b,0x3a,0x18,0xc4,0x2a,0x2a,0x2c,0x21,0xc4,0x22,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xd6,0x1a,0xed,0xdc,0xfd,0xc6,0xde,0x32,0xed,0x32,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xab,0x29,0x3a,0x39,0x28,0x29,0x3c,0x3a,0xfe,0x56,0x28,0x3c,0x3a,0x28,0x2a,0x3a,0x38,0x01,0xd6,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e, -0xb6,0x3f,0x52,0x51,0x33,0x54,0x05,0xe4,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x46,0x65,0x75,0x25,0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x02,0x00,0x14,0x06,0x1e,0x02,0x12,0x07,0x6a,0x00,0x0b,0x00,0x0f,0x00,0x1f,0x40,0x0e,0x06,0xc1,0x40,0x00,0x00,0x0e,0x80,0x0c,0x03,0xc0,0x09,0x09, -0x0e,0x0c,0x2f,0xcd,0x39,0x2f,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x37,0x33,0x07,0x76,0x28,0x3a,0x39,0x29,0x28,0x3a,0x3a,0x17,0xb5,0xa8,0xde,0x06,0xa8,0x38,0x2a,0x29,0x37,0x37,0x29,0x28,0x3a,0x8a,0xf6,0xf6,0x00,0x02,0x00,0x14,0x04,0xc2, -0x02,0x12,0x06,0x0e,0x00,0x0b,0x00,0x0f,0x00,0x1f,0x40,0x0e,0x06,0xc1,0x40,0x00,0x00,0x0e,0x80,0x0c,0x03,0xc0,0x09,0x09,0x0e,0x0c,0x2f,0xcd,0x39,0x2f,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x37,0x33,0x07,0x76,0x28,0x3a,0x39,0x29,0x28,0x3a, -0x3a,0x17,0xb5,0xa8,0xde,0x05,0x4c,0x38,0x2a,0x29,0x37,0x37,0x29,0x29,0x39,0x8a,0xf6,0xf6,0x00,0x02,0x00,0x1e,0x06,0x1e,0x02,0x51,0x07,0xd7,0x00,0x0b,0x00,0x12,0x00,0x33,0xb3,0x06,0xc1,0x40,0x00,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x00,0x00,0x0f,0x80,0x0e,0x03,0xc0,0x09,0x0c,0x0f,0x09,0xc0,0x2b,0x30,0x0c,0x0c,0x14, -0x0f,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x07,0x23,0x27,0x33,0x17,0x37,0x01,0x34,0x28,0x3a,0x39,0x29,0x29,0x39,0x39,0xf4,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x07,0x14,0x39,0x2a,0x28,0x38,0x37,0x29, -0x29,0x3a,0x04,0xfa,0xfa,0x93,0x93,0x00,0x00,0x02,0x00,0x1e,0x04,0xc2,0x02,0x51,0x06,0x7b,0x00,0x0b,0x00,0x12,0x00,0x2a,0x40,0x15,0x06,0xc1,0x40,0x00,0x00,0x0f,0x80,0x0e,0x03,0xc0,0x09,0x0c,0x0f,0x09,0xc0,0x2b,0x30,0x0c,0x0c,0x14,0x0f,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed, -0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x07,0x23,0x27,0x33,0x17,0x37,0x01,0x34,0x28,0x3a,0x39,0x29,0x29,0x39,0x39,0xf4,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x05,0xb8,0x39,0x29,0x29,0x38,0x37,0x2a,0x28,0x3a,0x04,0xfa,0xfa,0x93,0x93,0x00,0x03,0x00,0x14,0x06,0x1e,0x02,0x5b,0x07,0x9e,0x00,0x0b, -0x00,0x17,0x00,0x1b,0x00,0x39,0xb4,0x06,0x12,0xc1,0x00,0x0c,0xb8,0xff,0xc0,0x40,0x18,0x09,0x0c,0x48,0x0c,0x1a,0xe2,0x40,0x19,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x19,0x03,0x15,0x2b,0x3a,0x18,0x18,0x1d,0x19,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xfd,0xde,0x2b,0x32,0xed,0x32,0x31,0x30,0x01, -0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x21,0x35,0x21,0x01,0xf9,0x29,0x3a,0x39,0x28,0x29,0x3b,0x39,0xfe,0x56,0x2b,0x39,0x39,0x29,0x29,0x3b,0x39,0x01,0x99,0xfe,0x04,0x01,0xfc,0x06,0xd9,0x38,0x2b,0x2a,0x38,0x3a,0x28,0x2a,0x39,0x39,0x2a,0x29, -0x39,0x3a,0x28,0x2a,0x39,0xbb,0x6e,0x00,0x00,0x03,0x00,0x14,0x04,0xc2,0x02,0x5b,0x06,0x42,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x30,0x40,0x19,0x06,0x12,0xc1,0x00,0x0c,0x1a,0xe2,0x40,0x19,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x19,0x03,0x15,0x2b,0x3a,0x18,0x18,0x1d,0x19,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00, -0x18,0x2f,0x1a,0xfd,0xde,0x32,0xed,0x32,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x21,0x35,0x21,0x01,0xf9,0x29,0x3a,0x39,0x28,0x29,0x3b,0x39,0xfe,0x56,0x2a,0x3a,0x3a,0x28,0x29,0x3b,0x39,0x01,0x99,0xfe,0x04,0x01,0xfc,0x05,0x7d, -0x38,0x2a,0x2a,0x39,0x3a,0x29,0x29,0x39,0x38,0x2a,0x2a,0x39,0x3a,0x29,0x29,0x39,0xbb,0x6d,0xff,0xff,0x00,0xbc,0xfe,0x50,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x8a,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x7d, -0x00,0x00,0xff,0xff,0x00,0x16,0xfe,0x04,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x75,0xf9,0x6c,0x00,0x27,0x40,0x1a,0x03,0x02,0x00,0x13,0x19,0x06,0x07,0x25,0x03,0x02,0x16,0x40,0x09,0x0d,0x36,0x16,0x40,0x0a,0x0b,0x36,0x20,0x16,0x01,0x16,0x14,0x26,0x00,0x2b,0x5d,0x2b,0x2b,0x35,0x35,0x01, -0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x05,0x03,0x83,0x04,0x18,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xe9,0xf9,0x6d,0x00,0x27,0x40,0x1a,0x03,0x02,0x1b,0x23,0x29,0x08,0x00,0x25,0x03,0x02,0x26,0x40,0x09,0x0d,0x36,0x26,0x40,0x0a,0x0b,0x36,0x20,0x26,0x01,0x26,0x17,0x26,0x00,0x2b,0x5d,0x2b,0x2b,0x35, -0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x06,0xe2,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x47,0x01,0x5d,0x00,0x16,0xb9,0x00,0x03,0xff,0xc3,0x40,0x09,0x23,0x29,0x01,0x05,0x25,0x03,0x20,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec, -0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8b,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0xad,0x21,0x21,0x05,0x05,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0x2f,0x05,0x9a,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe1,0x00,0x00,0x00,0x1a,0xb9,0x00, -0x03,0xff,0xc1,0x40,0x0c,0x23,0x29,0x00,0x0c,0x25,0x03,0x20,0x26,0x01,0x26,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x1a,0x00,0x00,0x00,0x1a,0xb9,0x00,0x02,0xff,0xf2,0x40,0x0c,0x21,0x27,0x03,0x0c,0x25,0x02,0x20, -0x24,0x01,0x24,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1e,0x04,0x2f,0x05,0x9a,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5c,0x00,0x1a,0xb9,0x00,0x03,0xff,0xe3,0x40,0x0c,0x21,0x20,0x00,0x0c,0x25,0x03,0x20,0x22,0x01,0x22,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0xa6,0xff,0x1e,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x3f,0xfa,0x5c,0x00,0x17,0x40,0x0e,0x02,0x00,0x1f,0x1e,0x03,0x0c,0x25,0x02,0x20,0x20,0x01,0x20,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0x50,0x04,0x8c,0x07,0x67,0x02,0x26,0x00,0x26, -0x00,0x00,0x00,0x27,0x00,0xdd,0x02,0x39,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xf5,0x01,0x5d,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0x62,0x06,0x0a,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x27,0x00,0xdd,0x01,0x83,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x2f,0x00,0x00,0x00,0x08,0xb3,0x02, -0x2a,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x06,0xe2,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xd2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xa3,0x40,0x09,0x13,0x19,0x01,0x04,0x25,0x02,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec, -0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x64,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0x29,0x40,0x09,0x27,0x27,0x0f,0x0f,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x54,0x00,0x00,0x00,0x1a, -0xb9,0x00,0x02,0xff,0xac,0x40,0x0c,0x13,0x19,0x00,0x04,0x25,0x02,0x20,0x16,0x01,0x16,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x02,0x00,0x00,0x00,0x17,0x40,0x0e,0x02,0x1f,0x21,0x27,0x08,0x00,0x25,0x02,0x20,0x24, -0x01,0x24,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1e,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x46,0xfa,0x5c,0x00,0x1a,0xb9,0x00,0x02,0xff,0x85,0x40,0x0c,0x11,0x10,0x00,0x04,0x25,0x02,0x20,0x12,0x01,0x12,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0x60,0xff,0x1e,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5c,0x00,0x17,0x40,0x0e,0x02,0x20,0x1f,0x1e,0x08,0x00,0x25,0x02,0x20,0x20,0x01,0x20,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27, -0x00,0x00,0x01,0x07,0x01,0x9d,0x01,0x4a,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xb8,0x40,0x09,0x12,0x10,0x00,0x04,0x25,0x02,0x13,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x85,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x01,0x9d,0x00,0xdd,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x4b, -0x21,0x1e,0x08,0x00,0x25,0x02,0x21,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3d,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x3f,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x02,0xff,0xb8,0x40,0x09,0x14,0x10,0x00,0x04,0x25,0x02,0x15,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0x60,0xfe,0x3e,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe0,0xf9,0x7c,0x00,0x13,0x40,0x0b,0x02,0x1e,0x22,0x1e,0x08,0x00,0x25,0x02,0x23,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0xcf,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07, -0x02,0xd1,0x00,0xec,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x11,0x10,0x02,0x03,0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x72,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0xd2,0x00,0xe4,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x20, -0x21,0x0c,0x12,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0xcf,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0xd3,0x00,0xfd,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x11,0x13,0x02,0x0b,0x25,0x02,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x35,0x01, -0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x72,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0xd4,0x00,0xe4,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1f,0x21,0x0c,0x12,0x25,0x03,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3c,0x03,0xb4,0x05,0x9a, -0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xd9,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x17,0x10,0x0c,0x01,0x00,0x25,0x01,0x11,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x3d,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xda,0xf9,0x7b,0x00,0x13,0x40,0x0b, -0x02,0x32,0x1e,0x1a,0x0c,0x00,0x25,0x02,0x1f,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x9a,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd1,0xf9,0xe8,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x16,0x0c,0x01,0x00,0x25,0x01,0x1f,0x14,0x26,0x00,0x2b,0x35,0x01, -0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x99,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xe1,0xf9,0xe7,0x00,0x13,0x40,0x0b,0x02,0x26,0x24,0x1a,0x0c,0x00,0x25,0x02,0x2d,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x50,0x03,0xb4,0x07,0x1c,0x02,0x26,0x00,0x28,0x00,0x00, -0x00,0x27,0x00,0xdd,0x01,0x8a,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xec,0x01,0x5e,0x00,0x16,0xb9,0x00,0x02,0xff,0xfb,0x40,0x09,0x25,0x1f,0x02,0x03,0x25,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x27,0x00,0xdd,0x01,0x7d,0x00,0x00, -0x01,0x07,0x00,0xda,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x06,0x33,0x2d,0x0c,0x12,0x25,0x03,0x30,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0x94,0x06,0xe2,0x02,0x26,0x00,0x29,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x4a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x0d, -0x13,0x08,0x09,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0xe2,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x03,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x1e,0x0a,0x09,0x25,0x01,0x15,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e, -0xff,0xe8,0x04,0xec,0x06,0x8c,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xda,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x80,0x1b,0x1a,0x05,0x0a,0x25,0x01,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0x2f,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x17, -0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x1b,0x27,0x26,0x10,0x18,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x06,0xe2,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x01,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf8,0x40,0x09,0x0f,0x15,0x06,0x0b,0x25,0x01,0x0c, -0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0xae,0x15,0x15,0x0b,0x0b,0x25,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xf2,0x05,0x9a, -0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x8f,0x00,0x00,0x00,0x17,0x40,0x0e,0x01,0x0d,0x0f,0x15,0x05,0x00,0x25,0x01,0x20,0x12,0x01,0x12,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe7,0x00,0x00, -0x00,0x1a,0xb9,0x00,0x01,0xff,0xed,0x40,0x0c,0x15,0x1b,0x09,0x00,0x25,0x01,0x20,0x18,0x01,0x18,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x06,0xe4,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x38,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x1b,0x15,0x06,0x0b,0x25, -0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0xe4,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe3,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x16,0x21,0x21,0x0b,0x0b,0x25,0x02,0x01,0x1e,0x02,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, -0xff,0xff,0x00,0xa0,0xfe,0x50,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x00,0x06,0x00,0xdd,0x6d,0x00,0xff,0xff,0x00,0x8c,0xfe,0x50,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x00,0x06,0x00,0xdd,0x59,0x00,0xff,0xff,0x00,0xbc,0xfe,0x8c,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xda, -0x01,0xa6,0xf9,0xca,0x00,0x13,0x40,0x0b,0x01,0x06,0x12,0x0c,0x05,0x00,0x25,0x01,0x12,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0x8c,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x27,0xf9,0xca,0x00,0x13,0x40,0x0b,0x01,0x0f,0x18,0x12,0x09,0x00,0x25,0x01,0x18,0x17, -0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xcf,0xfe,0x9c,0x02,0x50,0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xac,0xf9,0xea,0x00,0x0b,0xb6,0x01,0x00,0x0e,0x04,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xb9,0xfe,0x9c,0x02,0x3a,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x07, -0x00,0xd8,0xff,0x96,0xf9,0xea,0x00,0x0b,0xb6,0x02,0x00,0x1a,0x10,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x07,0xd1,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x02,0xd5,0xff,0x75,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x05,0x17,0x11,0x02,0x03,0x25,0x03,0x02,0x01,0x14,0x05,0x26,0x00, -0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0xff,0xd4,0x00,0x00,0x02,0x1b,0x06,0x74,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x02,0xd6,0xff,0x57,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x00,0x17,0x11,0x02,0x03,0x25,0x03,0x02,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00, -0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x07,0x65,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x62,0x01,0x5b,0x00,0x16,0xb9,0x00,0x01,0xff,0x8f,0x40,0x09,0x13,0x12,0x08,0x0f,0x25,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x67,0x02,0x26,0x00,0x4e,0x00,0x00, -0x01,0x07,0x00,0x8e,0x00,0xe2,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x1f,0x0f,0x0f,0x07,0x07,0x25,0x01,0x0f,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x29,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xcf,0x40,0x0c,0x14, -0x1a,0x07,0x00,0x25,0x01,0x20,0x17,0x01,0x17,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc8,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xce,0x40,0x0c,0x10,0x16,0x05,0x00,0x25,0x01,0x20,0x13,0x01,0x13,0x17,0x26,0x00, -0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1c,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x4f,0xfa,0x5a,0x00,0x1a,0xb9,0x00,0x01,0xff,0xdc,0x40,0x0c,0x13,0x14,0x07,0x00,0x25,0x01,0x20,0x13,0x01,0x13,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c, -0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x00,0xfa,0x5a,0x00,0x1a,0xb9,0x00,0x01,0xff,0xed,0x40,0x0c,0x0f,0x10,0x05,0x00,0x25,0x01,0x20,0x0f,0x01,0x0f,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07, -0x02,0x45,0x00,0xcd,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xf2,0x40,0x0c,0x09,0x0f,0x01,0x00,0x25,0x01,0x20,0x0c,0x01,0x0c,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x95,0xfe,0xc6,0x01,0x5b,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x06,0x02,0x45,0xa3,0x00,0x00,0x17,0x40,0x0e,0x01,0x00,0x07,0x0d, -0x01,0x00,0x25,0x01,0x20,0x0a,0x01,0x0a,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xa4,0x06,0x8c,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x27,0x00,0xd9,0x00,0xcf,0x01,0x5d,0x01,0x07,0x02,0x45,0x00,0xcd,0x00,0x00,0x00,0x2c,0xb9,0x00,0x02,0xff,0xf2,0xb5,0x0d,0x13,0x01,0x00,0x25,0x01, -0xb8,0xff,0xdb,0x40,0x10,0x07,0x06,0x02,0x00,0x25,0x02,0x20,0x10,0x01,0x10,0x14,0x26,0x01,0x07,0x05,0x26,0x00,0x2b,0x35,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x2b,0x35,0xff,0xff,0xff,0xfa,0xfe,0xc6,0x01,0xf6,0x06,0x8c,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x27,0x00,0xd9,0xff,0xbc,0x01,0x5d,0x01,0x06,0x02,0x45,0xa2,0x00,0x00,0x29, -0xb9,0x00,0x02,0xff,0xff,0x40,0x17,0x0b,0x11,0x01,0x00,0x3e,0x01,0x00,0x05,0x04,0x01,0x00,0x3e,0x02,0x20,0x0e,0x01,0x0e,0x17,0x26,0x01,0x05,0x02,0x26,0x00,0x2b,0x35,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1c,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfe, -0xfa,0x5a,0x00,0x17,0x40,0x0e,0x01,0x0a,0x08,0x09,0x01,0x00,0x25,0x01,0x20,0x08,0x01,0x08,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfc,0xff,0x1c,0x01,0xf8,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xbe,0xfa,0x5a,0x00,0x17,0x40,0x0e,0x01,0x00,0x06,0x07,0x01,0x00,0x25,0x01, -0x20,0x06,0x01,0x06,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3d,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xbb,0xf9,0x7b,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x06,0x01,0x00,0x25,0x01,0x0b,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdf, -0xfe,0x3e,0x02,0x13,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0x83,0xf9,0x7c,0x00,0x13,0x40,0x0b,0x01,0x00,0x08,0x04,0x01,0x00,0x25,0x01,0x09,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x07,0x67,0x02,0x26,0x00,0x30,0x00,0x00,0x00,0x07,0x00,0x8e,0x02,0x48, -0x01,0x5d,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x06,0x0a,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x32,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x22,0x20,0x13,0x1f,0x25,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x06,0xe2,0x02,0x26,0x00,0x30,0x00,0x00, -0x00,0x07,0x00,0xdb,0x02,0x78,0x01,0x5d,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x05,0x85,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0xac,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x23,0x29,0x13,0x1f,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x06,0x72, -0x05,0x9a,0x02,0x26,0x00,0x30,0x00,0x00,0x00,0x07,0x02,0x45,0x01,0xf2,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x06,0x54,0x04,0x18,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x02,0x45,0x02,0x27,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x23,0x29,0x12,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0xe3, -0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x27,0x01,0x5e,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x17,0x1d,0x0a,0x13,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0x85,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8a,0x00,0x00,0x00,0x13, -0x40,0x0b,0x01,0x09,0x16,0x1c,0x0a,0x12,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xa0,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xf7,0xb4,0x17,0x1d,0x09,0x00,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6, -0xfe,0xc6,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x04,0x00,0x00,0x00,0x0b,0xb6,0x01,0x0a,0x16,0x1c,0x0a,0x12,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1c,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xbf,0xfa,0x5a,0x00,0x1e,0xb9,0x00,0x01,0xff, -0xfd,0xb6,0x16,0x17,0x0a,0x13,0x25,0x01,0x16,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x16,0x14,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x21,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x0e,0x15,0x16,0x0a,0x12,0x25,0x01,0x15,0xb8, -0xff,0xc0,0xb5,0x09,0x0b,0x36,0x15,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x3c,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x91,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x09,0x18,0x14,0x0a,0x13,0x25,0x01,0x19,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0xa6,0xfe,0x3c,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe2,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x09,0x17,0x13,0x0a,0x12,0x25,0x01,0x18,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x08,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd7, -0x01,0x1e,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x26,0x1c,0x03,0x09,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xae,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0xd8,0x6d,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x26,0x1c,0x03,0x09,0x25, -0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x02,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd9,0x01,0x1b,0x00,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x00,0x3a,0x30,0x03,0x09,0x25,0x04,0x03,0x02,0x3a,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b, -0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xa8,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0xda,0x73,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x04,0x3a,0x30,0x03,0x09,0x25,0x04,0x03,0x02,0x3a,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa, -0x07,0xcf,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd1,0x01,0xca,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1d,0x1c,0x03,0x09,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x72,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0xd2,0x01,0x1c, -0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1d,0x1f,0x03,0x09,0x25,0x03,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xcf,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd3,0x01,0xca,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1c,0x1f,0x03,0x09,0x25, -0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x72,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0xd4,0x01,0x13,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf7,0x40,0x0a,0x1d,0x1f,0x03,0x09,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, -0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x07,0x67,0x02,0x26,0x00,0x33,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xb9,0x40,0x09,0x15,0x13,0x03,0x07,0x25,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x06,0x0a,0x02,0x26,0x00,0x53, -0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1b,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe7,0x40,0x09,0x20,0x1e,0x04,0x0c,0x25,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x06,0xe2,0x02,0x26,0x00,0x33,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x5c,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff, -0xb8,0x40,0x09,0x16,0x1c,0x03,0x07,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0x85,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x9f,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf0,0x40,0x09,0x21,0x27,0x04,0x0c,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01, -0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x06,0xe2,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x87,0x01,0x5d,0x00,0x08,0xb3,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xbc,0x05,0x85,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xb6,0x00,0x00,0x00,0x16,0xb9,0x00, -0x01,0xff,0xd3,0x40,0x09,0x14,0x1a,0x08,0x10,0x25,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x07,0x02,0x45,0x01,0x33,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x06,0x02,0x45, -0x5a,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xc0,0x06,0x8c,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x27,0x00,0xd9,0x01,0x23,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x33,0x00,0x00,0x00,0x08,0xb3,0x02,0x29,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x02,0xbc,0x05,0x2f,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x26,0x00,0xd9, -0x6c,0x00,0x01,0x06,0x02,0x45,0x5a,0x00,0x00,0x22,0xb9,0x00,0x02,0xff,0xfe,0xb5,0x18,0x1e,0x08,0x10,0x3e,0x01,0xb8,0xff,0xf7,0x40,0x09,0x12,0x11,0x08,0x10,0x3e,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1b,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xd9, -0x01,0x5c,0xfa,0x59,0x00,0x11,0xb1,0x02,0x2a,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x2a,0x14,0x26,0x00,0x2b,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xff,0x1d,0x02,0xc7,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x8d,0xfa,0x5b,0x00,0x1c,0x40,0x09,0x01,0x18,0x13,0x14,0x08,0x10,0x25,0x01,0x13,0xb8,0xff,0xc0, -0xb5,0x09,0x0b,0x36,0x13,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x06,0xe2,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x83,0x01,0x5d,0x00,0x08,0xb3,0x01,0x36,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x05,0x85,0x02,0x26,0x00,0x56,0x00,0x00, -0x01,0x07,0x00,0xdb,0x01,0x05,0x00,0x00,0x00,0x08,0xb3,0x01,0x2f,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x79,0xfe,0xc6,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x07,0x02,0x45,0x00,0xd3,0x00,0x00,0xff,0xff,0x00,0x68,0xfe,0xc6,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06,0x02,0x45,0x72,0x00, -0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x02,0xdb,0x01,0x5a,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x42,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0e,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x02,0xdc,0x00,0xdb,0x00,0x00,0x00,0x0a,0xb4,0x02, -0x01,0x3e,0x11,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0xd7,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x02,0xdd,0x01,0x16,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x44,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x7b,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x02,0xde, -0x00,0x8c,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x3d,0x11,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x79,0xfe,0xc6,0x03,0xde,0x06,0xe2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x27,0x00,0xdb,0x01,0x93,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x0b,0x00,0x00,0x00,0x08,0xb3,0x01,0x36,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xfe,0xc6, -0x03,0x0f,0x05,0x85,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x27,0x02,0x45,0x00,0x82,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xff,0x00,0x00,0x00,0x08,0xb3,0x01,0x3b,0x14,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x06,0xe2,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x4d,0x01,0x5d,0x00,0x13,0x40,0x0b, -0x01,0x00,0x0b,0x11,0x06,0x07,0x25,0x01,0x08,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x55,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x5e,0x00,0xd0,0x00,0x19,0xb9,0x00,0x01,0xff,0xd6,0xb6,0x18,0x1e,0x07,0x14,0x25,0x01,0x15,0xb9,0x01,0x2d,0x00,0x0a,0x00,0x10, -0xfe,0x34,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x29,0xfe,0xc6,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc4,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0b,0x11,0x06,0x07,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0xc6,0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x06,0x02,0x45, -0x13,0x00,0x00,0x0b,0xb6,0x01,0x12,0x18,0x1e,0x07,0x14,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x29,0xff,0x1c,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xe0,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x00,0x0a,0x0b,0x06,0x07,0x25,0x01,0x0a,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0a,0x14,0x26,0x00, -0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x2b,0xff,0x1b,0x02,0x95,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x5b,0xfa,0x59,0x00,0x1c,0x40,0x09,0x01,0x41,0x17,0x18,0x07,0x14,0x25,0x01,0x17,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x17,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x29, -0xfe,0x3d,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xa7,0xf9,0x7b,0x00,0x13,0x40,0x0b,0x01,0x03,0x0c,0x08,0x06,0x07,0x25,0x01,0x0d,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x3e,0x02,0x86,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xf6, -0xf9,0x7c,0x00,0x13,0x40,0x0b,0x01,0x16,0x19,0x15,0x07,0x14,0x25,0x01,0x1a,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xfe,0xc3,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x17,0xfa,0x01,0x00,0x22,0xb1,0x02,0x01,0xb8,0xff,0xf8,0xb7,0x1d,0x17,0x05,0x0d,0x25,0x02,0x01, -0x20,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x20,0x14,0x26,0x00,0x2b,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x90,0xfe,0xc4,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x7f,0xfa,0x02,0x00,0x22,0xb1,0x02,0x01,0xb8,0xff,0xe6,0xb7,0x21,0x1b,0x08,0x11,0x25,0x02,0x01,0x24,0xb8,0xff,0xc0, -0xb5,0x09,0x0b,0x36,0x24,0x17,0x26,0x00,0x2b,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xaa,0xfe,0x9e,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x4c,0xf9,0xec,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x18,0x0e,0x05,0x0d,0x25,0x01,0x21,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0x90,0xfe,0x9e,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd3,0xf9,0xec,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x1c,0x12,0x08,0x11,0x25,0x01,0x25,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xfe,0x3d,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00, -0x01,0x07,0x00,0xd7,0x01,0x42,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x01,0xff,0xf9,0x40,0x09,0x12,0x0e,0x05,0x0d,0x25,0x01,0x13,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xfe,0x3d,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xbb,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x01,0xff,0xf8,0x40, -0x09,0x16,0x12,0x08,0x11,0x25,0x01,0x17,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x08,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x02,0xd7,0x00,0xdc,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x06,0x1c,0x12,0x05,0x0d,0x25,0x02,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, -0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xae,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x02,0xd8,0x59,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x09,0x20,0x16,0x08,0x11,0x25,0x02,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x9e,0x02,0x26,0x00,0x38, -0x00,0x00,0x01,0x07,0x02,0xdf,0x01,0x8c,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x04,0x1d,0x17,0x05,0x0d,0x25,0x03,0x02,0x01,0x27,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x42,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0xe0,0x00,0xff,0x00,0x00, -0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xfd,0x40,0x0b,0x21,0x1b,0x08,0x11,0x25,0x03,0x02,0x01,0x2b,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6,0x07,0x0f,0x02,0x26,0x00,0x39,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x1d,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x04,0x16,0x0c, -0x03,0x00,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xcb,0x05,0xb2,0x02,0x26,0x00,0x59,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x16,0x0c,0x03,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12, -0xfe,0xc6,0x04,0xe6,0x05,0x9a,0x02,0x26,0x00,0x39,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x29,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0f,0x15,0x03,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0xc6,0x03,0xcb,0x04,0x00,0x02,0x26,0x00,0x59,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0x92,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff, -0xfb,0xb4,0x0f,0x15,0x03,0x00,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x06,0xe2,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0xfd,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0e,0x1f,0x25,0x0b,0x00,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0, -0x05,0x85,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x24,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0e,0x1f,0x25,0x0b,0x00,0x25,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0xfe,0xc6,0x07,0x60,0x05,0x9a,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x02,0x45,0x02,0x75,0x00,0x00,0x00,0x0b, -0xb6,0x01,0x0d,0x1f,0x25,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0xfe,0xc6,0x05,0xb0,0x04,0x00,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x95,0x00,0x00,0x00,0x0b,0xb6,0x01,0x06,0x1f,0x25,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x06,0xe2,0x02,0x26,0x00,0x3b, -0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x93,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x07,0x19,0x1f,0x09,0x00,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x05,0x85,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x0e,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x06,0x17,0x1d, -0x0b,0x00,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x06,0xe4,0x02,0x26,0x00,0x3b,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xcd,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x13,0x25,0x1f,0x09,0x00,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, -0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x05,0x87,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x06,0x00,0x8f,0x43,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x0d,0x23,0x1d,0x0b,0x00,0x25,0x02,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2,0x02,0x26,0x00,0x3c,0x00,0x00, -0x01,0x07,0x00,0xdb,0x01,0x67,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x11,0x17,0x05,0x00,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x85,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x1f,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40, -0x09,0x18,0x1e,0x0c,0x00,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x6b,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xdb,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0f,0x0e,0x0a,0x05,0x09,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0e,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x06,0x00,0xd7,0x6f,0x00,0x00,0x13,0x40,0x0b,0x01,0x1d,0x0e,0x0a,0x05,0x09,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xfe,0xc6,0x04,0x64,0x05,0x9a,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xfd, -0x00,0x00,0x00,0x0b,0xb6,0x01,0x10,0x0d,0x13,0x05,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xfe,0xc6,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0x87,0x00,0x00,0x00,0x0b,0xb6,0x01,0x14,0x0d,0x13,0x05,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xff,0x1c,0x04,0x64,0x05,0x9a, -0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x0c,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x06,0x0c,0x0d,0x05,0x09,0x25,0x01,0x0c,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0c,0x14,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0xff,0x1b,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xd9, -0x00,0x9c,0xfa,0x59,0x00,0x1c,0x40,0x09,0x01,0x10,0x0c,0x0d,0x05,0x09,0x25,0x01,0x0c,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0c,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x09, -0x14,0x15,0x0a,0x11,0x25,0x01,0x14,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x14,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x57,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0xb8,0x00,0xd0,0x00,0x1b,0x40,0x0b,0x02,0x01,0x00,0x24,0x1e,0x07,0x14,0x25,0x02,0x01,0x15,0xb9, -0x01,0x2d,0x00,0x0a,0x00,0x10,0xfe,0x34,0x34,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x1c,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0xcc,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x08,0x1f,0x25,0x0b,0x00,0x25,0x02,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, -0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x1c,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xcb,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a,0x18,0x1e,0x0c,0x00,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x1f,0x02,0x26, -0x00,0x44,0x00,0x00,0x01,0x07,0x06,0x84,0x00,0xc9,0xff,0xf0,0x00,0x13,0x40,0x0b,0x02,0x30,0x26,0x29,0x08,0x14,0x25,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x4e,0x00,0x00,0x02,0x62,0x06,0xe2,0x02,0x26,0x01,0x84,0x00,0x00,0x01,0x07,0x00,0xdb,0xff,0xe2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff, -0x2c,0x40,0x09,0x10,0x16,0x07,0x0c,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x29,0x29,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x2d,0x33,0x0a,0x13,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x61,0xe8,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xb3,0x40,0x09,0x2b,0x31,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x36, -0x0c,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xde,0x40,0x0a,0x2d,0x34,0x0a,0x13,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x43,0xf2,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xc3,0x40,0x0a,0x2a,0x34, -0x0a,0x13,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x37,0x37,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x2d,0x34,0x0a,0x13,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, -0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x44,0x27,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9,0x40,0x0a,0x2a,0x34,0x0a,0x13,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f, -0x00,0x00,0x01,0x06,0x04,0x38,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xd1,0x40,0x0a,0x2d,0x27,0x0a,0x13,0x25,0x03,0x02,0x33,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x45,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8, -0xff,0xd1,0x40,0x0a,0x2d,0x27,0x0a,0x13,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x27,0xfe,0x3f,0xff,0x7d,0x00,0x16,0xb4,0x02,0x19,0x04,0x19,0x02,0xb8,0xfe,0x04,0xb4,0x11,0x1c,0x05,0x00,0x25,0x01, -0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x61,0xfe,0x44,0xff,0x7d,0x00,0x16,0xb4,0x02,0x17,0x04,0x17,0x02,0xb8,0xfe,0x08,0xb4,0x14,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0x9e, -0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfe,0xd7,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07, -0x04,0x43,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x15,0x04,0x15,0x03,0x02,0xb8,0xfe,0xe5,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03, -0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfe,0xe7,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x86,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x15,0x04,0x15,0x03,0x02,0xb8,0xff,0x00,0xb4, -0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xff,0x05,0xb4,0x10,0x10,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00, -0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfd,0x88,0xb4,0x16,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe7, -0x03,0x3b,0x06,0x23,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x27,0xb2,0x00,0x00,0x13,0x40,0x0b,0x01,0x4d,0x2c,0x32,0x0c,0x11,0x25,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x23,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x61,0x82,0x00,0x00,0x13,0x40,0x0b, -0x01,0x11,0x2a,0x30,0x0c,0x11,0x25,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x36,0x8b,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x21,0x2c,0x33,0x0c,0x11,0x25,0x02,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, -0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x04,0x43,0xff,0x71,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x06,0x29,0x33,0x0c,0x11,0x25,0x02,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26, -0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x37,0xc4,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x5a,0x2c,0x33,0x0c,0x11,0x25,0x02,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x44,0xa8,0x00,0x00,0x17,0x40,0x0d,0x02,0x01, -0x3e,0x29,0x33,0x0c,0x11,0x25,0x02,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x04,0x35,0x05,0xa0,0x00,0x27,0x00,0x28,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xff,0x6b,0xb4,0x18,0x18,0x02,0x02,0x25,0x01, -0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x04,0x35,0x05,0xa0,0x00,0x27,0x00,0x28,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x13,0x04,0x13,0x01,0xb8,0xfd,0x7b,0xb4,0x10,0x0c,0x02,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0x5a, -0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xff,0x76,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00, -0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a, -0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0xf5,0xb4,0x0d,0x19,0x02,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff, -0xa0,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x27,0x1f,0x00,0x00,0x13,0x40,0x0b,0x01,0x3b,0x16,0x21,0x0c,0x14,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82, -0xfe,0x6c,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x61,0xdc,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x19,0x15,0x0c,0x14,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x36,0xdd,0x00, -0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf8,0x40,0x0a,0x16,0x22,0x0c,0x14,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x43,0xca,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe5,0x40,0x0a,0x18,0x22,0x0c,0x14, -0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x37,0x29,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x44,0x16,0x22,0x0c,0x14,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff, -0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x44,0x08,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x24,0x18,0x22,0x0c,0x14,0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06, -0x04,0x38,0xdf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a,0x1b,0x15,0x0c,0x14,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x45,0xdf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a, -0x1b,0x15,0x0c,0x14,0x25,0x02,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xff,0x6b,0xb4,0x18,0x18,0x06,0x06,0x25,0x01,0x2b,0x35, -0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x13,0x04,0x13,0x01,0xb8,0xff,0x6e,0xb4,0x0c,0x0c,0x06,0x06,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0x9e, -0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xff,0x76,0xb4,0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07, -0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a,0xb6,0x02, -0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x56,0xb4,0x0d,0x19,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0xa0,0xb4, -0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0xb2,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x64,0xb4,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00, -0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0xb2,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x64,0xb4,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x94,0xff,0xf4, -0x02,0x08,0x06,0x23,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x27,0xfe,0xb0,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb2,0x40,0x09,0x0d,0x18,0x05,0x0b,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x6e,0xff,0xf4,0x02,0x08,0x06,0x23,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x61,0xfe,0x8c, -0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x8d,0x40,0x09,0x10,0x0c,0x05,0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xdd,0xff,0xf4,0x02,0x08,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x93,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x94,0x40,0x0a,0x0d,0x19,0x05,0x0b, -0x25,0x02,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xb3,0xff,0xf4,0x02,0x08,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x6f,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x70,0x40,0x0a,0x0f,0x19,0x05,0x0b,0x25,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, -0x35,0x35,0xff,0xff,0x00,0x1b,0xff,0xf4,0x02,0x47,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0xd9,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xda,0x40,0x0a,0x0d,0x19,0x05,0x0b,0x25,0x02,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xea,0xff,0xf4,0x02,0x2d,0x06,0x06, -0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0xb2,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xb4,0x40,0x0a,0x0f,0x19,0x05,0x0b,0x25,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xc0,0xff,0xf4,0x02,0x0a,0x06,0x83,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8d, -0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8e,0x40,0x0a,0x12,0x0c,0x05,0x0b,0x25,0x02,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xc0,0xff,0xf4,0x02,0x0a,0x06,0x83,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8d,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8e,0x40,0x0a, -0x12,0x0c,0x05,0x0b,0x25,0x02,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x02,0x4a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x00,0xe6,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x07,0xb2,0x01,0x0d,0x03,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x02,0x48,0x05,0xa0, -0x00,0x27,0x00,0x2c,0x00,0xe4,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x07,0xb2,0x01,0x0b,0x04,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x3a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x01,0xd6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x73,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00, -0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0x3a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x01,0xd6,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0x00,0x00,0x03,0x6e,0x05,0xa0,0x00,0x27,0x00,0x2c,0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7a,0xff,0x9a, -0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbf,0x00,0x00,0x03,0x77,0x05,0xa0,0x00,0x27,0x00,0x2c,0x02,0x13,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xb2,0x00,0x27,0x00,0x2c, -0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8a,0xff,0x2f,0x00,0x09,0xb3,0x02,0x01,0x0d,0x04,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xb2,0x00,0x27,0x00,0x2c,0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8a,0xff,0x2f,0x00,0x09,0xb3,0x02,0x01,0x0d,0x04,0x00,0x3f,0x35,0x35,0x00,0xff,0xff, -0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x23,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x27,0x0a,0x00,0x00,0x13,0x40,0x0b,0x02,0x0b,0x19,0x24,0x03,0x09,0x25,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x23,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x61,0xd4,0x00, -0x00,0x16,0xb9,0x00,0x02,0xff,0xd4,0x40,0x09,0x1c,0x18,0x03,0x09,0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x36,0xe9,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe9,0x40,0x0a,0x19,0x25,0x03,0x09,0x25,0x03,0x02,0x18, -0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x43,0xb9,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xb9,0x40,0x0a,0x1b,0x25,0x03,0x09,0x25,0x03,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60, -0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x37,0x21,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x21,0x19,0x25,0x03,0x09,0x25,0x03,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x44, -0xfc,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x1b,0x25,0x03,0x09,0x25,0x03,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x02,0x21,0x04,0x21,0x02,0xb8,0xfc, -0xc8,0xb4,0x19,0x24,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x02,0x1f,0x04,0x1f,0x02,0xb8,0xfc,0xca,0xb4,0x1c,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff, -0xff,0xbc,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x21,0x04,0x21,0x03,0x02,0xb8,0xff,0xe2,0xb4,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27, -0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x1d,0x04,0x1d,0x03,0x02,0xb8,0xff,0xf0,0xb4,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x37, -0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x21,0x04,0x21,0x03,0x02,0xb8,0xfc,0x36,0xb4,0x19,0x25,0x03,0x09,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x86,0xff,0x98,0x00,0x18,0x40,0x0d,0x03,0x02, -0x1d,0x04,0x1d,0x03,0x02,0x0b,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x23,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x27,0xed,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xed,0x40,0x09,0x23,0x29,0x00,0x16,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01, -0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x23,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x61,0x90,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x84,0x40,0x09,0x21,0x27,0x00,0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00, -0x01,0x06,0x04,0x36,0xae,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xa9,0x40,0x0a,0x23,0x2a,0x00,0x16,0x25,0x02,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x43,0xa5,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9f, -0x40,0x0a,0x20,0x2a,0x00,0x16,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x37,0xee,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe9,0x40,0x0a,0x23,0x2a,0x00,0x16,0x25,0x02,0x01,0x1d,0x11,0x26,0x00,0x2b, -0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x44,0xcf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xca,0x40,0x0a,0x20,0x2a,0x00,0x16,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e, -0x06,0x83,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x38,0xb0,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xaa,0x40,0x0a,0x23,0x1d,0x00,0x16,0x25,0x02,0x01,0x29,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x83,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x45,0xaa,0x00, -0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xa4,0x40,0x0a,0x23,0x1d,0x00,0x16,0x25,0x02,0x01,0x2c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0x48,0x05,0xa0,0x00,0x27,0x00,0x3c,0x00,0xe8,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xfd, -0x13,0xb4,0x12,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x06,0x7d,0x05,0x9e,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x13,0x04,0x13,0x02,0x01,0xb8,0xff,0xb9,0xb4,0x1b,0x1b,0x05,0x05,0x25,0x01,0x2b,0x35,0x35,0x00, -0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x06,0x7d,0x05,0x9e,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x13,0x04,0x13,0x02,0x01,0xb8,0xff,0xd3,0xb4,0x1b,0x1b,0x05,0x05,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00, -0x06,0x7d,0x05,0xb2,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x17,0x04,0x17,0x02,0x01,0xb8,0xfc,0x8b,0xb4,0x14,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01, -0x01,0x07,0x04,0x27,0x00,0xf7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1a,0x28,0x2e,0x06,0x1d,0x25,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x61,0x00,0xca,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe1,0x40,0x09,0x26, -0x2c,0x06,0x1d,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x36,0x00,0xcc,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xea,0x40,0x0a,0x28,0x2f,0x06,0x1d,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, -0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x43,0x00,0xb3,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd0,0x40,0x0a,0x25,0x2f,0x06,0x1d,0x25,0x02,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06, -0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x37,0x01,0x27,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x45,0x28,0x2f,0x06,0x1d,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x44,0x00,0xf9,0x00,0x00, -0x00,0x17,0x40,0x0d,0x02,0x01,0x17,0x25,0x2f,0x06,0x1d,0x25,0x02,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x38,0x00,0xd5,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf2,0x40,0x0a,0x28,0x22,0x06,0x1d, -0x25,0x02,0x01,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x45,0x00,0xd5,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf2,0x40,0x0a,0x28,0x22,0x06,0x1d,0x25,0x02,0x01,0x31,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, -0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x93,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x25,0x04,0x25,0x01,0xb8,0xff,0xb1,0xb4,0x28,0x28,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x06,0x3c,0x05,0xb2,0x00,0x27, -0x00,0x9f,0x00,0x93,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x23,0x04,0x23,0x01,0xb8,0xff,0xb4,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98, -0x00,0x1a,0xb6,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0xb8,0xff,0xd7,0xb4,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x21,0x04,0x21,0x02,0x01, -0xb8,0xff,0xe7,0xb4,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0xb8,0xff,0xe8,0xb4,0x29,0x29,0x12,0x12,0x25,0x01, -0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x18,0x40,0x0d,0x02,0x01,0x21,0x04,0x21,0x02,0x01,0x00,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc, -0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x18,0x40,0x0d,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d, -0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x18,0x40,0x0d,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x55,0xbe,0x00,0x00,0x16,0xb9,0x00,0x02,0xff, -0x8f,0x40,0x09,0x29,0x27,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x60,0x35,0x00,0x00,0x13,0x40,0x0b,0x02,0x06,0x29,0x27,0x0a,0x13,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x00,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x04,0x55,0xff,0x6c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x28,0x26,0x0c,0x11,0x25,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x00,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x60, -0xda,0x00,0x00,0x13,0x40,0x0b,0x01,0x6f,0x28,0x26,0x0c,0x11,0x25,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x00,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x55,0xbe,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd9,0x40,0x09,0x17,0x15,0x0c,0x14,0x25,0x01,0x16,0x11,0x26, -0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x00,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x60,0x40,0x00,0x00,0x13,0x40,0x0b,0x01,0x5b,0x17,0x15,0x0c,0x14,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x34,0xff,0xf4,0x02,0x08,0x06,0x00,0x02,0x26,0x01,0xc9, -0x00,0x00,0x01,0x07,0x04,0x55,0xfe,0x63,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x64,0x40,0x09,0x0e,0x0c,0x05,0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0xf4,0x02,0x08,0x06,0x00,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0xdd,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff, -0xde,0x40,0x09,0x0e,0x0c,0x05,0x0b,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x55,0xd2,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xd2,0x40,0x09,0x1a,0x18,0x03,0x09,0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, -0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x60,0x24,0x00,0x00,0x13,0x40,0x0b,0x02,0x24,0x1a,0x18,0x03,0x09,0x25,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x00,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x55, -0x8c,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x86,0x40,0x09,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x00,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x60,0x02,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1f, -0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x55,0x00,0xaf,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xcc,0x40,0x09,0x24,0x22,0x06,0x1d,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00, -0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x60,0x01,0x1f,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x3c,0x24,0x22,0x06,0x1d,0x25,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x27,0x29,0x00,0x01,0x06,0x04,0x28, -0x5c,0x00,0x00,0x1b,0x40,0x12,0x02,0x27,0x11,0x26,0x03,0x25,0x3c,0x36,0x0a,0x00,0x3e,0x02,0x00,0x2d,0x33,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x61,0xe9,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c, -0x02,0x28,0x11,0x26,0x03,0x25,0x3b,0x35,0x0a,0x00,0x3e,0x02,0xb8,0xff,0xb4,0xb4,0x2b,0x31,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x36,0x0c,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x27,0x11, -0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xde,0xb4,0x2d,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x43,0xf4,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x28,0x11, -0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xc5,0xb4,0x2a,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x37,0x38,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1f,0x40,0x14,0x03,0x02,0x27,0x11, -0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0x0a,0x2d,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x44,0x26,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x28,0x11,0x26,0x04, -0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xf8,0xb4,0x2a,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x38,0x00,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x33,0x11,0x26,0x04, -0x25,0x45,0x3f,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xd1,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x45,0x00,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x36,0x11,0x26,0x04, -0x25,0x45,0x3f,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xd1,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x04,0x29,0xfe,0x40,0xff,0x7d,0x01,0x07,0x04,0x28,0x00,0xa4,0x00,0x00,0x00,0x1f,0x40,0x0c,0x02,0x19, -0x04,0x19,0x03,0x07,0x25,0x26,0x05,0x00,0x3e,0x02,0xb8,0xfe,0xd3,0xb4,0x1c,0x1c,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x04,0x61,0xfe,0x46,0xff,0x7d,0x01,0x07,0x04,0x28,0x00,0xa4,0x00,0x00,0x00,0x1f,0x40,0x0c, -0x02,0x17,0x04,0x17,0x03,0x07,0x24,0x25,0x05,0x00,0x3e,0x02,0xb8,0xfe,0xcc,0xb4,0x1a,0x1a,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x73,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x75,0x00,0x00, -0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x13,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xd8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xc1,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7d,0xff,0x97, -0x01,0x07,0x04,0x28,0x01,0x84,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x15,0x04,0x15,0x04,0x22,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xe8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00, -0x00,0x27,0x04,0x37,0xfe,0x7b,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x50,0x00,0x00,0x00,0x25,0xb5,0x03,0x02,0x19,0x04,0x19,0x04,0xb8,0xff,0xee,0xb6,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xe8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbf,0xfe,0x40,0x05,0xd7, -0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x87,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x69,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x15,0x04,0x15,0x04,0x07,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x01,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00, -0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x8a,0xff,0x2f,0x01,0x07,0x04,0x28,0x01,0x64,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x02,0x2e,0x2f,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x06,0xb4,0x10,0x10,0x06,0x06,0x3e,0x2b,0x35,0x35, -0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x05,0xd7,0x05,0xb1,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x2e,0x01,0x07,0x04,0x28,0x01,0x68,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x06,0x2e,0x2f,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x05,0xb4, -0x10,0x10,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x27,0x1f,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x15,0x11,0x26,0x02,0x01,0x2b,0x2b,0x08,0x08,0x3e,0x01,0x2e,0x1b, -0x21,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x61,0xdd,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x16,0x11,0x26,0x02,0x01,0x2a,0x2a,0x08,0x08,0x3e,0x01,0xb8,0xff,0xe0,0xb4,0x19,0x1f, -0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x36,0xde,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x15,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff,0xe8,0xb4,0x1b,0x22, -0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x43,0xca,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x16,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff,0xd3,0xb4, -0x18,0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x37,0x27,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x15,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0x31,0x1b, -0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x44,0x08,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x16,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0x12,0x18, -0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x38,0xe0,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x21,0x11,0x26,0x03,0x01,0x34,0x34,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff, -0xe9,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x45,0xdf,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x24,0x11,0x26,0x03,0x01,0x34,0x34,0x08,0x08,0x3e,0x02,0x01, -0xb8,0xff,0xe8,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0xff,0xbc,0xfe,0x40,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x00,0x27,0x04,0x27,0xfd,0xd8,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x5d,0x00,0x00,0x00,0x21,0xb4,0x01,0x15,0x04,0x15,0x02,0xb8,0xff,0xfc,0xb5, -0x21,0x22,0x05,0x00,0x3e,0x01,0xb8,0xff,0x6a,0xb4,0x18,0x18,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x00,0x27,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x5f,0x00,0x00,0x00,0x21,0xb4,0x01,0x13,0x04, -0x13,0x02,0xb8,0xff,0xfe,0xb5,0x20,0x21,0x05,0x00,0x3e,0x01,0xb8,0xff,0x61,0xb4,0x16,0x16,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x97,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa5,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x72,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x84,0x00,0x00, -0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x77,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x06,0x96,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa4,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7a, -0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x83,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x11,0x04,0x11,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x97,0x05,0x9f,0x00,0x27,0x00,0x2b, -0x01,0xa5,0x00,0x00,0x00,0x27,0x04,0x37,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x75,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xf0,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x87,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe, -0xfe,0x40,0x06,0x96,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa4,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x86,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x83,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x11,0x04,0x11,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa1,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35, -0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x98,0x05,0xb3,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0x85,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x2a,0x2b,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa4,0xb4, -0x0c,0x0c,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x98,0x05,0xb3,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0x85,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x2a, -0x2b,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa4,0xb4,0x0c,0x0c,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x29,0x00,0xf7,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x22, -0x11,0x26,0x02,0x0b,0x37,0x38,0x06,0x1d,0x3e,0x01,0x1a,0x28,0x2e,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x61,0x00,0xca,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x23,0x11,0x26, -0x02,0x0b,0x36,0x37,0x06,0x1d,0x3e,0x01,0xb8,0xff,0xe1,0xb4,0x26,0x2c,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x36,0x00,0xcc,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x22,0x11, -0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xea,0xb4,0x28,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x43,0x00,0xb3,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e, -0x02,0x01,0x23,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xd0,0xb4,0x25,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x37,0x01,0x27,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00, -0x00,0x1f,0x40,0x14,0x02,0x01,0x22,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0x45,0x28,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x44,0x00,0xfa,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f, -0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x23,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0x18,0x25,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x38,0x00,0xd5,0x00,0x00,0x01,0x07,0x04,0x28, -0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x2e,0x11,0x26,0x03,0x0b,0x40,0x41,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xf2,0xb4,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x45,0x00,0xd5,0x00,0x00, -0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x31,0x11,0x26,0x03,0x0b,0x40,0x41,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xf2,0xb4,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x93,0x00,0x00,0x00,0x27, -0x04,0x27,0xfd,0xd8,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x9f,0x00,0x00,0x00,0x21,0xb4,0x01,0x25,0x04,0x25,0x02,0xb8,0xff,0xfd,0xb5,0x31,0x32,0x0e,0x00,0x3e,0x01,0xb8,0xff,0xb0,0xb4,0x28,0x28,0x12,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f, -0x00,0x93,0x00,0x00,0x00,0x27,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x9f,0x00,0x00,0x00,0x21,0xb4,0x01,0x23,0x04,0x23,0x02,0xb8,0xff,0xfd,0xb5,0x30,0x31,0x0e,0x00,0x3e,0x01,0xb8,0xff,0xa7,0xb4,0x26,0x26,0x12,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x45, -0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9c,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x72,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa8,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0xb8,0xff,0xd8,0xb4,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35, -0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x07,0x44,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9b,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa7,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x21,0x04,0x21,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0xb8,0xff,0xe7,0xb4,0x29,0x29,0x12,0x12, -0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x45,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9c,0x00,0x00,0x00,0x27,0x04,0x37,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa8,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e, -0x02,0x01,0xb8,0xff,0xe8,0xb4,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x07,0x44,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9b,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x86,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa7,0x00,0x00,0x00,0x23,0xb5,0x02,0x01,0x21,0x04,0x21, -0x03,0xb8,0xff,0xfd,0x40,0x0d,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0x02,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x46,0x05,0xb3,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0xa9,0x00,0x00, -0x00,0x23,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0x40,0x0d,0x3a,0x3b,0x0e,0x00,0x3e,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x46,0x05,0xb3,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x30, -0x01,0x07,0x04,0x28,0x02,0xa9,0x00,0x00,0x00,0x23,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0x40,0x0d,0x3a,0x3b,0x0e,0x00,0x3e,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0xbe,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07, -0x04,0x66,0x02,0x6a,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe3,0x40,0x09,0x2d,0x27,0x0a,0x13,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0x2f,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x68,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe1,0x40,0x09,0x28, -0x27,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x55,0xbd,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c,0x02,0x28,0x11,0x26,0x03,0x25,0x31,0x2b,0x0a,0x00,0x3e,0x02,0xb8,0xff,0x8e,0xb4,0x29,0x27, -0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x04,0x18,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x28,0x5b,0x00,0x00,0x0b,0xb6,0x02,0x24,0x2d,0x27,0x0a,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26, -0x04,0x60,0x35,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1b,0x40,0x12,0x02,0x29,0x11,0x26,0x03,0x25,0x31,0x2b,0x0a,0x00,0x3e,0x02,0x06,0x29,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0x94,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x2a,0x0a,0x00,0x00,0x16, -0xb9,0x00,0x02,0xff,0xdb,0x40,0x09,0x2d,0x27,0x0a,0x13,0x25,0x02,0x2d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x05,0x94,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x2a,0x0a,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c,0x02,0x2d,0x11,0x26,0x03,0x25,0x39,0x33,0x0a,0x00, -0x3e,0x02,0xb8,0xff,0xdb,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x0a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x66,0x02,0x94,0x01,0x4c,0x00,0x13,0x40,0x0b,0x02,0x00,0x16,0x10,0x05,0x00,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, -0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0x79,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x96,0x01,0x4a,0x00,0x13,0x40,0x0b,0x02,0x00,0x12,0x13,0x05,0x00,0x25,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfb,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07, -0x04,0x55,0xfe,0x2a,0xff,0x99,0x00,0x16,0xb4,0x02,0x12,0x03,0x12,0x02,0xb8,0xfd,0xee,0xb4,0x12,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0x5c,0xff,0x99,0x00,0x16,0xb4,0x02,0x13,0x03,0x13,0x02,0xb8,0xfe, -0x20,0xb4,0x12,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x28,0x00,0xa3,0x00,0x00,0x00,0x0b,0xb6,0x02,0x67,0x16,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x00,0x01,0x01,0xe4,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0e, -0x00,0x1f,0xb5,0x03,0x03,0x00,0x09,0xfa,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xc4,0x39,0x2f,0x31,0x30,0x01,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x0a,0x26,0x68,0x10,0x30,0x3e,0x3a,0x2c,0x35,0x46,0x73,0x04,0x7b,0x3f,0x38, -0x68,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x57,0xa8,0x00,0x01,0x01,0xba,0xfe,0x40,0x02,0xf6,0xff,0x89,0x00,0x0c,0x00,0x23,0x40,0x13,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26, -0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x02,0xf6,0x3c,0x56,0x4b,0x5f,0x7b,0x44,0x29,0x29,0xfe,0x90,0x50,0x53,0x46,0xb0,0xba,0x43,0x2a,0x00,0x00,0x01,0x01,0xe4,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0xfa,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03, -0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x01,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x0a,0x26,0x68,0x10,0x30,0x3e,0x3a,0x2c,0x35,0x46,0x73,0x04,0x7b,0x3f,0x38,0x68,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x57,0xa8,0x00,0x01,0x01,0x40,0x04,0xa6,0x03,0x70, -0x05,0x94,0x00,0x0b,0x00,0x1c,0x40,0x0d,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x33,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x03,0x70,0x6a,0x18,0x96,0x96,0x18,0x6a,0x0a,0x9a,0x74,0x74,0x9a,0x04,0xa6,0x8b,0x8b,0x6a, -0x84,0x85,0x00,0x03,0x01,0x33,0x04,0x7f,0x03,0x7d,0x06,0x5a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x35,0x40,0x1b,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x12,0x0c,0x1e,0xc1,0x18,0x0f,0xc0,0x15,0x15,0x00,0x21,0xc0,0x1b,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x10,0xd6,0xe1,0x10,0xc2,0x2f,0xe1,0x00,0x2f,0xfd,0x39, -0x39,0xde,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x1a,0x9e,0x6d,0x6c,0xa0,0x4c,0x28,0x38,0x39,0x27,0x2a, -0x3b,0x3b,0xfe,0x56,0x29,0x3a,0x3a,0x29,0x29,0x3b,0x3b,0x05,0x8e,0x6c,0x6c,0x5f,0x6d,0x6e,0xfe,0x93,0x38,0x2b,0x29,0x39,0x3a,0x28,0x2a,0x39,0x38,0x2b,0x28,0x3a,0x3a,0x28,0x2a,0x39,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x06,0x00,0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x55,0xbe,0x00,0x01,0x07,0x04,0x28,0xff,0x14, -0x00,0x00,0x00,0x20,0xb4,0x01,0x15,0x11,0x26,0x02,0xb8,0xff,0xff,0xb5,0x20,0x20,0x08,0x08,0x3e,0x01,0xb8,0xff,0xc6,0xb4,0x17,0x15,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x04,0x18,0x02,0x26,0x01,0xc7,0x01,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x0e,0xb9,0x00, -0x01,0xff,0x2e,0xb4,0x1b,0x15,0x0c,0x14,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x06,0x00,0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x60,0x40,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x1e,0xb4,0x01,0x16,0x11,0x26,0x02,0xb8,0xff,0xff,0x40,0x0c,0x20,0x20,0x08,0x08,0x3e,0x01,0x48,0x17,0x15, -0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x6c,0x03,0xf9,0x05,0x94,0x02,0x26,0x01,0xc7,0x01,0x00,0x01,0x06,0x04,0x2a,0xf5,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1b,0x15,0x0c,0x14,0x25,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x05,0x94, -0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x2a,0xf5,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x20,0xb4,0x01,0x15,0x11,0x26,0x02,0xb8,0xff,0xff,0xb5,0x28,0x28,0x08,0x08,0x3e,0x01,0xb8,0xff,0xfd,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x04,0x37,0x05,0x9a, -0x00,0x27,0x00,0x28,0x00,0x83,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xfd,0x78,0xb4,0x0e,0x0c,0x02,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc4,0x00,0x00,0x04,0x36,0x05,0x9a,0x00,0x27,0x00,0x28,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf3, -0xff,0x99,0x00,0x16,0xb4,0x01,0x0f,0x03,0x0f,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x02,0x02,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xff,0x7c,0xb4, -0x0c,0x0c,0x06,0x06,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc4,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf3,0xff,0x99,0x00,0x16,0xb4,0x01,0x0f,0x03,0x0f,0x01,0xb8,0xfc,0xf2,0xb4,0x0e,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff, -0x00,0xbc,0xfe,0x40,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x04,0x28,0x00,0xdd,0x00,0x00,0x00,0x0b,0xb6,0x01,0x5e,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x00,0x00,0x02,0x01,0x4a,0x04,0x92,0x03,0x66,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x30,0x40,0x0e,0x03,0x03,0x09,0x0e,0x00,0x0f,0x09,0xfa,0x0d,0x80, -0x0f,0x0f,0x0b,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03,0x0b,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x10,0xc2,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x27,0x36,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x05,0x23,0x03,0x33,0x01,0x68,0x1e,0x5d,0x17,0x31,0x41,0x36,0x2c,0x77,0x01, -0x41,0x5e,0xae,0xa6,0x04,0x92,0x3d,0x28,0x4f,0x36,0x2c,0x28,0x36,0x7a,0xa8,0x4e,0x01,0x6a,0x00,0x02,0x01,0x42,0x04,0x92,0x03,0x6e,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x37,0x40,0x13,0x10,0x18,0x09,0x0e,0x48,0x03,0x03,0x09,0x0f,0x00,0x10,0x09,0xfa,0x0d,0x80,0x0f,0x0f,0x0b,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03, -0x0b,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x10,0xc2,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x2b,0x01,0x27,0x36,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x01,0x03,0x23,0x13,0x01,0x60,0x1e,0x5d,0x17,0x32,0x40,0x36,0x2c,0x76,0x01,0x52,0xb0,0x5e,0x66,0x04,0x92,0x3d,0x28,0x4f,0x36,0x2c, -0x28,0x36,0x7a,0xa8,0x01,0x1c,0xfe,0x96,0x01,0x6a,0x00,0x02,0x01,0x33,0x04,0x77,0x03,0x7d,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x53,0x40,0x0d,0x0d,0x18,0x09,0x12,0x48,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x0f,0xb8,0x01,0x02,0x40,0x0d,0x0f,0x13,0x1f,0x13,0x02,0x13,0x40,0x13,0x18,0x48,0x13,0x0c,0x0d,0xb8,0xff,0xc0,0xb5,0x09, -0x12,0x48,0x0d,0x0f,0x16,0xb8,0x01,0x01,0x40,0x09,0x11,0x11,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x2f,0xd4,0x2b,0x5d,0xed,0xd6,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x2b,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x27,0x36,0x37,0x22,0x35,0x34, -0x33,0x32,0x16,0x15,0x14,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x19,0xa0,0x6c,0x6c,0xa0,0xfe,0xb4,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x05,0xb6,0x6d,0x6d,0x5f,0x6e,0x6e,0xfe,0x62,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0xff,0xff,0xff,0xec,0xff,0xf4,0x02,0x10,0x05,0xbe,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x66, -0x00,0xfe,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa7,0x40,0x09,0x12,0x0c,0x05,0x0b,0x25,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfa,0xff,0xf4,0x02,0x08,0x05,0x2f,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x64,0x00,0xf8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa1,0x40,0x09,0x0e,0x0f,0x05, -0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5e,0x06,0x0e,0x00,0x26,0x01,0xc9,0x01,0x00,0x01,0x07,0x04,0x53,0xfe,0xb0,0x00,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xb0,0x40,0x0b,0x1f,0x19,0x05,0x0b,0x25,0x03,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01, -0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5e,0x06,0x0e,0x00,0x26,0x01,0xc9,0x01,0x00,0x01,0x07,0x04,0x54,0xfe,0xb0,0x00,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xb0,0x40,0x0b,0x1f,0x19,0x05,0x0b,0x25,0x03,0x02,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xdf, -0xff,0xf4,0x02,0x0f,0x05,0x94,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x2a,0xfe,0x9f,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa0,0x40,0x09,0x12,0x0c,0x05,0x0b,0x25,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xd5,0xff,0xf4,0x02,0x1f,0x06,0x5a,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x2b, -0xfe,0xa2,0x00,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xa3,0x40,0x0b,0x12,0x21,0x05,0x0b,0x25,0x03,0x02,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x22,0x07,0x0a,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x66,0x01,0x10,0x01,0x4c,0x00,0x13,0x40,0x0b, -0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01,0x07,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x02,0x0e,0x06,0x79,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x64,0x01,0x10,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, -0xff,0xff,0xff,0xae,0x00,0x00,0x02,0x2c,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xc8,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdd,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0x5d,0xb7,0x06,0x04,0x02,0x03,0x25,0x01,0x07,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc6,0x00,0x00,0x02,0x4a,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xe6, -0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf5,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0x57,0xb7,0x06,0x04,0x02,0x03,0x25,0x01,0x07,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0x00,0x02,0x01,0x44,0x04,0x92,0x03,0x6c,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x35,0x40,0x1d,0x0b,0x0b,0x05,0x0e,0x01,0x0f,0x05,0xfa,0x0d,0x80,0x0f,0x40,0x09,0x0e, -0x48,0x0f,0x0f,0x08,0x00,0x40,0x09,0x12,0x48,0x00,0x00,0x0b,0x08,0xaf,0x03,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x10,0xc2,0x2f,0x2b,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x07,0x26,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x16,0x05,0x23,0x03,0x33,0x02,0x1e,0x20,0xba,0x76,0x2c,0x36,0x40,0x32,0x18, -0x01,0xaa,0x5c,0xb0,0xa8,0x04,0xcf,0x3d,0x50,0xaa,0x7a,0x35,0x29,0x2c,0x36,0x4f,0x61,0x01,0x6a,0x00,0x00,0x02,0x01,0x38,0x04,0x92,0x03,0x7b,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x35,0x40,0x1d,0x0b,0x0b,0x05,0x0f,0x01,0x10,0x05,0xfa,0x0d,0x80,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x0f,0x08,0x00,0x40,0x09,0x12,0x48,0x00,0x00,0x0b, -0x08,0xaf,0x03,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x10,0xc2,0x2f,0x5d,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x07,0x26,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x16,0x01,0x03,0x23,0x13,0x02,0x12,0x1e,0xbc,0x76,0x2c,0x36,0x40,0x32,0x17,0x01,0xc6,0xb0,0x5f,0x67,0x04,0xcf,0x3d,0x52,0xa8,0x7a,0x36, -0x28,0x2c,0x36,0x4f,0x01,0x09,0xfe,0x96,0x01,0x6a,0x00,0x02,0x01,0x33,0x04,0x77,0x03,0x7d,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x52,0x40,0x0d,0x0e,0x18,0x09,0x12,0x48,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x0c,0xb8,0x01,0x02,0x40,0x15,0x0f,0x14,0x1f,0x14,0x02,0x14,0x40,0x13,0x18,0x48,0x14,0x0f,0x0e,0x40,0x09,0x12,0x48,0x0e, -0x0e,0x0c,0x16,0xb8,0x01,0x01,0x40,0x09,0x11,0x11,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x2f,0xf1,0x39,0xc0,0x2f,0x2b,0x00,0x2f,0xd4,0x2b,0x5d,0xed,0xd6,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x2b,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x16,0x17,0x07,0x26,0x35,0x34,0x36, -0x33,0x32,0x15,0x14,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x19,0xa0,0x6c,0x6c,0xa0,0xfe,0xf8,0x06,0x54,0x14,0xb0,0x3e,0x30,0x5a,0x05,0xb6,0x6d,0x6d,0x5f,0x6e,0x6e,0xfe,0xe7,0x3a,0x16,0x35,0x25,0x91,0x30,0x41,0x52,0x50,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0xbe,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x04,0x66, -0x02,0x08,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xaa,0x40,0x09,0x23,0x1d,0x00,0x16,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x2f,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x0e,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb0,0x40,0x09,0x1e,0x1d,0x00, -0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0e,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x53,0xc3,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xbd,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35, -0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0e,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x54,0xd6,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xd0,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0xa1,0xfe,0x74,0x04,0x50, -0x06,0x23,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x06,0x04,0x29,0x14,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf4,0x40,0x09,0x1c,0x27,0x04,0x0a,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa1,0xfe,0x74,0x04,0x50,0x06,0x23,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x06,0x04,0x61,0xd4,0x00,0x00,0x16,0xb9,0x00, -0x02,0xff,0xb3,0x40,0x09,0x1f,0x1b,0x04,0x0a,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x94,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x2a,0xba,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb4,0x40,0x09,0x23,0x1d,0x00,0x16,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01, -0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x5a,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x2b,0xa9,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xa4,0x40,0x0b,0x38,0x32,0x00,0x16,0x25,0x03,0x02,0x01,0x35,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60, -0x07,0x0a,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x04,0x66,0x02,0x37,0x01,0x4c,0x00,0x13,0x40,0x0b,0x01,0x00,0x14,0x0e,0x05,0x00,0x25,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0x81,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x38,0x01,0x52,0x00,0x13, -0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x96,0x00,0x00,0x05,0x49,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe9,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xc5,0xff,0x99,0x00,0x16,0xb4,0x01,0x10,0x03,0x10,0x01,0xb8,0xfc,0xfb,0xb4,0x10,0x0e,0x05,0x00,0x25,0x01, -0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xb2,0x00,0x00,0x05,0x49,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe9,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xe1,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xfd,0x17,0xb4,0x10,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x04,0xb0, -0x05,0xa0,0x00,0x27,0x00,0x33,0x00,0x87,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x02,0x1a,0x04,0x1a,0x02,0xb8,0xfd,0x3b,0xb4,0x17,0x13,0x03,0x07,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0x03,0x01,0x02,0x04,0x96,0x03,0xae,0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x2c,0x40,0x15,0x0a,0x04, -0x16,0xc1,0x40,0x10,0x10,0x02,0x80,0x01,0x0d,0xc0,0x07,0x00,0x40,0x13,0xc0,0x19,0x00,0x80,0x02,0x2f,0x1a,0xcd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x03,0x33,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32, -0x16,0x15,0x14,0x06,0x02,0xc0,0x5e,0xb0,0xa8,0xf0,0x28,0x38,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x04,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00,0x03,0x01,0x02,0x04,0x96,0x03,0xae,0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b, -0x00,0x2c,0x40,0x15,0x0a,0x04,0x16,0xc1,0x40,0x10,0x10,0x03,0x80,0x02,0x13,0xc0,0x19,0x02,0x40,0x0d,0xc0,0x07,0x00,0x80,0x02,0x2f,0x1a,0xdd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22, -0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x00,0xb0,0x5e,0x66,0xf2,0x28,0x38,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x06,0x00,0xfe,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00,0x01,0x01,0xd1,0x04,0x96,0x02,0xdf, -0x06,0x00,0x00,0x03,0x00,0x11,0xb6,0x01,0x40,0x02,0x01,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x3f,0x1a,0xcd,0x31,0x30,0x01,0x23,0x03,0x33,0x02,0xdf,0x5e,0xb0,0xa8,0x04,0x96,0x01,0x6a,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x55,0x00,0xb0,0x00,0x00,0x01,0x07,0x04,0x28, -0x01,0x4f,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x23,0x11,0x26,0x02,0x0b,0x2c,0x2d,0x06,0x1d,0x3e,0x01,0xb8,0xff,0xcd,0xb4,0x24,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x04,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x0b,0xb6,0x01, -0x0b,0x28,0x29,0x06,0x1d,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x60,0x01,0x1f,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x24,0x11,0x26,0x02,0x0b,0x2c,0x2d,0x06,0x1d,0x3e,0x01,0x3c,0x24,0x22,0x06,0x1d,0x3e, -0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xe9,0x06,0x00,0x05,0x94,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0xeb,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x08,0x28,0x22,0x06,0x1d,0x25,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x05,0x94, -0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x2a,0x00,0xeb,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x28,0x11,0x26,0x02,0x0b,0x34,0x35,0x06,0x1d,0x3e,0x01,0x08,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0xff,0xac,0xff,0xe8,0x06,0x11,0x05,0xb2,0x00,0x26, -0x00,0x32,0x67,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x02,0x1a,0x03,0x1a,0x02,0xb8,0xfc,0xc8,0xb4,0x1a,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xd1,0xff,0xe8,0x06,0x11,0x05,0xb2,0x00,0x26,0x00,0x32,0x67,0x00,0x01,0x07,0x04,0x60,0xfe,0x00,0xff,0x99,0x00,0x16,0xb4,0x02, -0x1b,0x03,0x1b,0x02,0xb8,0xfc,0xed,0xb4,0x1a,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x06,0x53,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0xaa,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x1e,0x03,0x1e,0x01,0xb8,0xff,0xac,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01, -0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xd1,0x00,0x00,0x06,0x3d,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x94,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0x00,0xff,0x99,0x00,0x16,0xb4,0x01,0x1f,0x03,0x1f,0x01,0xb8,0xff,0xe7,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x64,0xfe,0x40,0x05,0xa9, -0x05,0xb2,0x02,0x26,0x00,0x9f,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x0e,0x00,0x00,0x00,0x0b,0xb6,0x01,0x5e,0x22,0x1c,0x12,0x18,0x25,0x01,0x2b,0x35,0x00,0x00,0x01,0x01,0xd1,0x04,0x96,0x02,0xdf,0x06,0x00,0x00,0x03,0x00,0x11,0xb6,0x02,0x40,0x03,0x01,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x3f,0x1a,0xcd,0x31,0x30,0x01,0x03,0x23, -0x13,0x02,0xdf,0xb0,0x5e,0x67,0x06,0x00,0xfe,0x96,0x01,0x6a,0x00,0x01,0x01,0xe2,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0d,0x00,0x25,0x40,0x15,0x00,0x18,0x09,0x0d,0x48,0x0c,0x0c,0x01,0x07,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x0c,0x0a,0xaf,0x04,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xc4,0x39,0x2f,0x31,0x30,0x2b,0x01, -0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x02,0xcf,0x29,0x53,0x71,0x45,0x35,0x2c,0x3a,0x6c,0x10,0x04,0xba,0x3f,0x28,0xa7,0x58,0x39,0x48,0x3a,0x2b,0x5d,0x07,0x68,0x00,0x00,0x01,0xfe,0xe8,0x04,0xc2,0x01,0x1a,0x06,0x0e,0x00,0x06,0x00,0x15,0xb7,0x00,0xc0,0x04,0x02,0x00,0x05,0x80,0x04,0x00,0x2f,0x1a, -0xcd,0x39,0x39,0x01,0x2f,0x1a,0xcc,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x01,0x1a,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x04,0xc2,0xe6,0xe6,0x01,0x4c,0x00,0x01,0xfe,0xc0,0x04,0xb2,0x01,0x42,0x05,0xb2,0x00,0x13,0x00,0x1e,0x40,0x0e,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x13,0x07,0xda,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6,0xfd, -0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54,0x4a,0x36,0x53,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6a,0x82,0x34,0x2c,0x74,0x00,0x00,0x01,0xff,0x02, -0x04,0xc2,0x00,0xfe,0x05,0x2f,0x00,0x03,0x00,0x0e,0xb4,0x00,0x01,0x02,0xe2,0x01,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x35,0x21,0xfe,0xfe,0x04,0x01,0xfc,0x04,0xc2,0x6d,0x00,0x01,0xfe,0x58,0x05,0x74,0x01,0xaa,0x05,0xec,0x00,0x03,0x00,0x0d,0xb4,0x02,0xda,0x01,0x00,0x01,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01, -0x21,0x35,0x21,0x01,0xaa,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0x01,0xfe,0xee,0x04,0xc2,0x01,0x12,0x05,0xbe,0x00,0x0c,0x00,0x1d,0x40,0x0d,0x0c,0xc4,0x00,0xc0,0x07,0xc4,0x06,0x0c,0x06,0x80,0x09,0xdb,0x03,0x00,0x2f,0xed,0x1a,0xdc,0xc4,0x01,0x2f,0xe1,0x1a,0xdc,0xe1,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16, -0x33,0x32,0x36,0x37,0x01,0x12,0x0a,0x9c,0x70,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x05,0xbe,0x70,0x8c,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0xff,0x9e,0x04,0xc2,0x00,0x62,0x05,0x85,0x00,0x0b,0x00,0x0f,0xb5,0x09,0xc0,0x03,0x06,0xc1,0x00,0x00,0x2f,0xed,0x01,0x2f,0xe1,0x31,0x30,0x11,0x22,0x26,0x35,0x34,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x04,0xc2,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x05,0x87,0x00,0x0b,0x00,0x17,0x00,0x1a,0x40,0x0c,0x06,0x00,0x12,0xc1,0x0c,0x09,0xc0,0x03,0x0f,0xc0,0x03,0x15,0x2f,0xc6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30, -0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x28,0x3a,0x38,0x28,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x04,0xc2,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x00,0x02,0xff,0x33, -0x04,0x98,0x00,0xcf,0x06,0x1c,0x00,0x0b,0x00,0x16,0x00,0x2a,0x40,0x18,0x14,0xc4,0x30,0x09,0x80,0x09,0xd0,0x09,0xe0,0x09,0x04,0x09,0xc0,0x0f,0xc4,0x03,0x0c,0xc5,0x40,0x06,0xc0,0x11,0xc5,0x00,0x00,0x2f,0xed,0x1a,0xdc,0x1a,0xed,0x01,0x2f,0xe1,0x1a,0xdc,0x71,0xe1,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x59,0x72,0x76,0x5b,0x59,0x72,0x7a,0x57,0x31,0x3f,0x70,0x31,0x41,0x41,0x04,0x98,0x6b,0x53,0x58,0x6e,0x6c,0x54,0x54,0x70,0x01,0x33,0x41,0x30,0x70,0x40,0x30,0x31,0x40,0x00,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x2b, -0x40,0x14,0x00,0x0e,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x06,0x03,0x02,0x07,0x80,0x06,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0xe9,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x01,0x25,0xf6,0x60,0xd1,0x73,0xef,0x61,0xcf,0x06,0x00,0xfe,0xc2, -0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x01,0xfe,0xe8,0x04,0xc2,0x01,0x18,0x06,0x0c,0x00,0x06,0x00,0x11,0xb5,0x00,0xc0,0x03,0x03,0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x1a,0xcc,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x01,0x18,0xd4,0x86,0xd6,0x72,0xa4,0xa4,0x06,0x0c,0xfe,0xb6,0x01,0x4a,0xe5,0xe5,0x00,0x01,0xff,0xcb, -0x04,0x96,0x00,0x35,0x06,0x00,0x00,0x03,0x00,0x0e,0xb5,0x01,0x02,0x01,0x00,0xfc,0x01,0x2f,0xe1,0x00,0x3f,0xcd,0x31,0x30,0x13,0x23,0x11,0x33,0x35,0x6a,0x6a,0x04,0x96,0x01,0x6a,0x00,0x00,0x02,0xff,0x58,0x04,0x96,0x00,0xa8,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0c,0x02,0x01,0x05,0x06,0x01,0x00,0xfc,0x01,0x01,0x04, -0xfc,0x05,0x2f,0xf1,0xca,0x2f,0xe1,0x00,0x3f,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x23,0x11,0x33,0xa8,0x6a,0x6a,0xe6,0x6a,0x6a,0x04,0x96,0x01,0x6a,0xfe,0x96,0x01,0x6a,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x17,0x00,0x0e,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80, -0x06,0x04,0x42,0x60,0x04,0x01,0x04,0x06,0x07,0x04,0x03,0x80,0x00,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0xcd,0x5d,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0xe1,0x31,0x30,0x01,0x23,0x03,0x33,0x03,0x23,0x03,0x33,0x01,0x25,0x61,0xef,0x81,0x23,0x60,0xf6,0x85,0x04,0xc2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x02,0xfe,0xee, -0x04,0xc2,0x01,0x12,0x06,0x68,0x00,0x0b,0x00,0x18,0x00,0x26,0x40,0x13,0x06,0xc1,0x00,0x0c,0x12,0x15,0xdb,0x0f,0x0c,0xfc,0x18,0x18,0x09,0x12,0xfc,0x13,0x09,0xc0,0x03,0x2f,0xe1,0xde,0xe1,0x10,0xca,0x2f,0xe1,0x00,0x2f,0xfd,0xd4,0x32,0xd4,0xed,0x31,0x30,0x11,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x06, -0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0xe9,0x0a,0x9c,0x70,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x05,0xa6,0x39,0x29,0x2a,0x36,0x37,0x29,0x28,0x3a,0x18,0x70,0x8c,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0xfe,0xee,0x04,0xc2,0x01,0x12,0x05,0xbe,0x00,0x0c,0x00,0x18, -0x40,0x0b,0x0a,0xdb,0x04,0x00,0x07,0x00,0xfc,0x01,0x06,0xfc,0x07,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x33,0xd4,0xed,0x31,0x30,0x01,0x23,0x26,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x12,0x66,0x09,0x61,0x44,0xa0,0x0c,0x64,0x04,0x95,0x75,0x71,0x9b,0x04,0xc2,0x48,0x54,0x9c,0x72,0x8a,0x8a,0x00,0x00,0x01,0xff,0x8c, -0x04,0x7b,0x00,0x77,0x06,0x23,0x00,0x0d,0x00,0x27,0xb9,0x00,0x00,0xff,0xe8,0x40,0x13,0x09,0x0d,0x48,0x07,0xfb,0x02,0x0d,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x02,0x04,0xaf,0x0a,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xd4,0xed,0x31,0x30,0x2b,0x13,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x77, -0x69,0x10,0x6e,0x3a,0x2c,0x35,0x45,0x71,0x53,0x05,0xe4,0x38,0x68,0x08,0x5d,0x2a,0x3a,0x47,0x3a,0x58,0xa7,0x28,0x00,0x01,0xff,0x8c,0x03,0xf8,0x00,0x77,0x05,0xa0,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x03,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39, -0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x4e,0x26,0x68,0x10,0x30,0x3c,0x38,0x2c,0x35,0x46,0x72,0x03,0xf8,0x40,0x36,0x69,0x01,0x39,0x2b,0x2a,0x3a,0x48,0x3a,0x57,0xa7,0x00,0x00,0x01,0xff,0x8c,0x03,0xf8,0x00,0x77,0x05,0xa0,0x00,0x0e,0x00,0x24, -0x40,0x15,0x00,0x18,0x09,0x0d,0x48,0x01,0x0d,0xfb,0x07,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x0d,0x0a,0xaf,0x04,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x13,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x77,0x27,0x54,0x70,0x45,0x35,0x2c,0x38,0x3c,0x30,0x10,0x04,0x38, -0x40,0x29,0xa6,0x57,0x3b,0x47,0x3a,0x2a,0x2b,0x39,0x01,0x69,0x00,0x01,0x00,0x2f,0x03,0xf8,0x01,0x1a,0x05,0xa0,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x03,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x13, -0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x56,0x27,0x69,0x10,0x30,0x3c,0x38,0x2c,0x35,0x45,0x70,0x03,0xf8,0x40,0x36,0x69,0x01,0x39,0x2b,0x2a,0x3a,0x47,0x3b,0x57,0xa6,0x00,0x00,0x01,0xff,0x3e,0xfe,0x42,0x00,0xc2,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x00,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03, -0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x13,0x23,0x01,0x33,0xc2,0x7e,0xfe,0xfa,0xa8,0xfe,0x42,0x01,0x47,0x00,0x01,0xff,0x3e,0xfe,0x42,0x00,0xc2,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x17, -0x01,0x23,0x13,0xc2,0xfe,0xfa,0x7e,0xde,0x77,0xfe,0xb9,0x01,0x47,0x00,0x00,0x01,0xff,0x48,0xfe,0x58,0x00,0xb8,0xff,0xc2,0x00,0x07,0x00,0x2a,0x40,0x17,0x01,0x0e,0x02,0xfd,0x05,0x40,0x05,0x06,0x42,0x05,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x05,0x02,0x04,0x2f,0xdd,0x32,0xe1,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a, -0x18,0x10,0xfd,0xed,0x31,0x30,0x13,0x23,0x35,0x21,0x35,0x21,0x35,0x33,0xb8,0x6a,0xfe,0xfa,0x01,0x06,0x6a,0xfe,0x58,0x7f,0x6d,0x7e,0x00,0x01,0xff,0x48,0xfe,0x58,0x00,0xb8,0xff,0xc2,0x00,0x07,0x00,0x2c,0x40,0x18,0x02,0x0e,0x01,0xfd,0x06,0x40,0x06,0x05,0x42,0x06,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x03,0xfc,0x01,0x01, -0x06,0x07,0x2f,0xcd,0x32,0x10,0xe1,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a,0x18,0x10,0xfd,0xed,0x31,0x30,0x13,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0xb8,0xfe,0xfa,0x6a,0x6a,0x01,0x06,0xfe,0xd7,0x7f,0x01,0x6a,0x7e,0x00,0x00,0x01,0xff,0x16,0x04,0x96,0x00,0xea,0x06,0x68,0x00,0x05,0x00,0x14,0x40,0x09,0x00,0x03,0xfd,0x04,0x01,0x00, -0xfc,0x02,0x03,0x2f,0xdd,0xe1,0x00,0x3f,0xed,0xc4,0x31,0x30,0x13,0x23,0x11,0x21,0x35,0x21,0xea,0x6a,0xfe,0x96,0x01,0xd4,0x04,0x96,0x01,0x6a,0x68,0x00,0x00,0x01,0xff,0x52,0x04,0x96,0x00,0xae,0x06,0x0e,0x00,0x0b,0x00,0x12,0xb7,0x05,0x01,0xda,0x00,0x08,0xc2,0x03,0x00,0x2f,0xd4,0xe1,0x00,0x2f,0xed,0xc4,0x31,0x30,0x03,0x37, -0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0xae,0x02,0xd5,0x15,0x88,0x12,0x8e,0x78,0x04,0x96,0x74,0x82,0x48,0x3a,0x37,0x50,0x6c,0x85,0x00,0x01,0xff,0xa6,0xfe,0x5c,0x00,0x5a,0xff,0xc8,0x00,0x0b,0x00,0x28,0x40,0x16,0x0b,0xcb,0x40,0x00,0xc0,0x07,0xcb,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x06,0x80,0x09, -0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x5d,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x15,0x14,0x33,0x5a,0x4d,0x67,0x66,0x4e,0x5e,0x5e,0xfe,0x5c,0x69,0x4d,0x4d,0x69,0x5e,0x58,0x5a,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x07,0x00,0x22,0x40,0x10,0x05,0x00, -0xfd,0x02,0x40,0x03,0x06,0x0e,0x05,0xfc,0x02,0x02,0x01,0x42,0x02,0x01,0x2f,0xcd,0x2b,0x01,0x10,0xf1,0xe1,0x00,0x18,0x2f,0x1a,0xdd,0xed,0x33,0x31,0x30,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xb4,0x7f,0x6d,0x7e,0xfe,0x56,0x6a,0x01,0x06,0xfe,0xfa,0x6a,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x07,0x00,0x22, -0x40,0x10,0x04,0x02,0x06,0xfd,0x40,0x07,0x01,0x0e,0x02,0xfc,0x05,0x05,0x06,0x42,0x05,0x06,0x2f,0xcd,0x2b,0x01,0x10,0xf1,0xe1,0x00,0x18,0x2f,0x1a,0xfd,0x32,0xc6,0x31,0x30,0x17,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0xb6,0x7e,0x6d,0x7f,0x3a,0x6a,0xfe,0xfa,0x01,0x06,0x6a,0x00,0x00,0x01,0xff,0x4c,0xfe,0x5e,0x00,0xb6,0xff,0xc6, -0x00,0x0b,0x00,0x38,0x40,0x1f,0x03,0x0e,0x0a,0x01,0x04,0xfd,0x07,0x0e,0x40,0x0f,0x08,0x1f,0x08,0x2f,0x08,0x03,0x09,0x03,0x08,0x00,0x0e,0x01,0x04,0x05,0x42,0x05,0x0a,0x07,0x01,0xfc,0x04,0x2f,0xe1,0x39,0x39,0xcd,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xfd,0xfd,0x39,0x39,0xed,0x31,0x30,0x13,0x23,0x15,0x23, -0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0xb6,0x7e,0x6d,0x7f,0x7f,0x6d,0x7e,0xfe,0xdd,0x7f,0x7f,0x6b,0x7e,0x7e,0xff,0xff,0xff,0x03,0xff,0x53,0x00,0xff,0xff,0xbf,0x00,0x07,0x06,0x9a,0xfe,0xc5,0xfd,0x5f,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x12,0xb7,0x08,0x91,0x03,0x0a,0x00,0x7e,0x0a,0x06,0x2f, -0xd6,0xe1,0x00,0x2f,0xd4,0xed,0x31,0x30,0x37,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0xe6,0xb3,0x9f,0x42,0x38,0x33,0x3f,0xb2,0x35,0xbd,0xe2,0x14,0xa0,0x1d,0x01,0x08,0x00,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x15,0x40,0x09,0x03,0x91,0x08,0x00,0x05,0x05,0x01,0x7e,0x00,0x2f,0xf1,0xc2, -0x2f,0x00,0x2f,0xd4,0xed,0x31,0x30,0x27,0x33,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0xe6,0xa8,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0x35,0xfe,0xf8,0x1d,0xa0,0x14,0xe2,0x00,0x02,0xfe,0xdd,0xfe,0xc4,0x01,0x25,0xff,0x89,0x00,0x0b,0x00,0x17,0x00,0x1a,0x40,0x0c,0x06,0x00,0x0c,0xc1,0x12,0x09,0xc0,0x03,0x0f,0xc0,0x03,0x15, -0x2f,0xc6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x28,0x3a,0x38,0x28,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0xfe,0xc4,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39, -0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0xff,0xff,0xff,0x35,0xfe,0x7e,0x00,0xd1,0x00,0x02,0x00,0x07,0x00,0xdc,0xfe,0xe3,0xf9,0xe6,0x00,0x01,0xff,0x9c,0xfe,0x62,0x00,0x64,0xff,0x89,0x00,0x0b,0x00,0x3b,0xb5,0x01,0x18,0x09,0x12,0x48,0x00,0xb8,0xff,0xc0,0xb4,0x13,0x16,0x48,0x00,0x03,0xb8,0x01,0x02,0x40,0x09,0x0f,0x07,0x1f, -0x07,0x2f,0x07,0x03,0x07,0x01,0xb8,0xff,0xc0,0xb5,0x09,0x12,0x48,0x01,0x03,0x0a,0xb9,0x01,0x01,0x00,0x05,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x2f,0x5d,0xfd,0xc4,0x2b,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x4a,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0xfe,0x62,0x36,0x16,0x3a,0x50,0x51,0x41,0x30, -0x91,0x00,0xff,0xff,0xff,0x56,0xfe,0x50,0x00,0xaa,0x00,0x00,0x00,0x07,0x00,0xdd,0xff,0x23,0x00,0x00,0xff,0xff,0xff,0x5d,0xfe,0x70,0x00,0x71,0x00,0x00,0x00,0x07,0x00,0xdf,0xff,0x1f,0x00,0x00,0x00,0x01,0xff,0xcb,0xfe,0x1e,0x00,0x35,0xff,0x89,0x00,0x03,0x00,0x16,0x40,0x0c,0x01,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x00, -0xfc,0x01,0x2f,0xe1,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x13,0x23,0x11,0x33,0x35,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0x00,0x00,0x01,0xfe,0x9c,0xfe,0x5c,0x01,0x64,0xff,0x89,0x00,0x07,0x00,0x22,0x40,0x13,0x00,0x05,0x80,0x03,0xfd,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x01,0x04,0xfc,0x05,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x5d, -0xed,0x1a,0xcd,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x23,0x11,0x21,0x01,0x64,0x68,0xfe,0x08,0x68,0x02,0xc8,0xfe,0x5c,0xc5,0xc5,0x01,0x2d,0x00,0x01,0xfe,0xb1,0xfe,0xbc,0x01,0x4f,0xff,0x89,0x00,0x14,0x00,0x44,0x40,0x26,0x00,0x05,0x10,0x03,0x0a,0x12,0x03,0x0d,0xc5,0x40,0x07,0x80,0x0f,0x0a,0x1f,0x0a,0x2f,0x0a,0x03,0x09, -0x03,0x0a,0x14,0xff,0x00,0x0e,0x10,0x0b,0xff,0x0a,0x0a,0x0f,0x42,0x0a,0x80,0x10,0xfe,0x0f,0x2f,0xe1,0x1a,0xcc,0x2b,0x01,0x10,0xe1,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xdc,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x33,0x14,0x33,0x32,0x35,0x33,0x14, -0x33,0x32,0x35,0x01,0x4f,0x6a,0x57,0x5a,0x34,0x35,0x5b,0x57,0x68,0x61,0x5f,0x69,0x4c,0x6a,0x5e,0x77,0x59,0x74,0x44,0x44,0x72,0x5b,0x75,0x75,0x75,0x75,0x00,0x01,0xfe,0xe8,0xfe,0x40,0x01,0x18,0xff,0x89,0x00,0x06,0x00,0x1a,0x40,0x0d,0x00,0xc0,0x03,0x02,0x80,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x2f,0x5d,0x1a,0xcd, -0x01,0x2f,0x1a,0xcc,0x31,0x30,0x05,0x03,0x23,0x03,0x33,0x17,0x37,0x01,0x18,0xd4,0x86,0xd6,0x72,0xa4,0xa4,0x77,0xfe,0xb7,0x01,0x49,0xe5,0xe5,0x00,0x01,0xfe,0xe8,0xfe,0x3e,0x01,0x1a,0xff,0x89,0x00,0x06,0x00,0x1a,0x40,0x0d,0x00,0xc0,0x04,0x04,0x80,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f, -0x1a,0xcc,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x01,0x1a,0x78,0xa4,0xa6,0x70,0xd6,0x86,0xfe,0x3e,0xe5,0xe5,0x01,0x4b,0x00,0x00,0x01,0xfe,0xee,0xfe,0x8e,0x01,0x12,0xff,0x89,0x00,0x0c,0x00,0x29,0x40,0x16,0x0c,0xc4,0x00,0xc0,0x07,0xc4,0x06,0x0c,0x06,0x09,0xdb,0x40,0x03,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06, -0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x10,0xc4,0x01,0x2f,0xe1,0x1a,0xdc,0xe1,0x31,0x30,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x01,0x12,0x0a,0x9b,0x71,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x77,0x72,0x89,0x89,0x72,0x9b,0x54,0x47,0xff,0xff,0xfe,0xe9,0xff,0x13,0x01,0x19,0x00,0x01,0x00,0x07, -0x04,0x2a,0xfd,0xa9,0xfa,0x6d,0x00,0x01,0xfe,0xc0,0xfe,0x9e,0x01,0x42,0xff,0x9e,0x00,0x13,0x00,0x22,0x40,0x11,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x09,0x11,0xda,0x03,0x07,0xda,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xd4,0xfd,0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15, -0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54,0x4a,0x36,0x53,0x62,0x69,0x85,0x34,0x2a,0x70,0x69,0x82,0x33,0x2d,0x75,0xff,0xff,0xff,0x05,0xff,0x51,0x01,0x01,0xff,0xbe,0x00,0x07,0x00,0xd9,0xfe,0xc7,0xfa,0x8f,0x00,0x01,0xfe,0x57,0xfe,0xd7,0x01,0xa9, -0xff,0x4e,0x00,0x03,0x00,0x0d,0xb4,0x01,0xda,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x01,0xa9,0xfc,0xae,0x03,0x52,0xfe,0xd7,0x77,0xff,0xff,0xfe,0x57,0xfd,0xfe,0x01,0xa9,0xff,0x62,0x00,0x07,0x01,0x35,0xfe,0x57,0x00,0x00,0x00,0x01,0xfe,0xc0,0x01,0x9e,0x01,0x42,0x02,0x9e,0x00,0x13,0x00,0x1e, -0x40,0x0e,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x13,0x07,0xda,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6,0xfd,0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54, -0x4a,0x36,0x53,0x02,0x9e,0x69,0x85,0x34,0x2a,0x70,0x69,0x82,0x33,0x2d,0x75,0x00,0x00,0x01,0xff,0x02,0x01,0xe6,0x00,0xfe,0x02,0x52,0x00,0x03,0x00,0x0e,0xb4,0x00,0x01,0x02,0xe2,0x01,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x35,0x21,0xfe,0xfe,0x04,0x01,0xfc,0x01,0xe6,0x6c,0xff,0xff,0xfe,0x58,0xff,0xc5,0x01,0xaa, -0x00,0x3d,0x00,0x07,0x01,0x95,0xfe,0x58,0xfa,0x51,0x00,0x01,0xfe,0x66,0x00,0x77,0x01,0x9c,0x03,0xc2,0x00,0x03,0x00,0x2a,0xb6,0x03,0x02,0x01,0x00,0x03,0x00,0x01,0xb8,0x01,0x00,0x40,0x0a,0x02,0x03,0x14,0x02,0x03,0x01,0x02,0x00,0x00,0x02,0x2f,0xcd,0x00,0x2f,0x2f,0xc1,0x87,0x05,0x2b,0x10,0x00,0xc1,0x87,0x05,0x7d,0x10,0xc4, -0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x9c,0xfd,0x50,0x86,0x02,0xae,0x03,0xc2,0xfc,0xb5,0x03,0x4b,0x00,0x00,0x01,0xfe,0x70,0xff,0x12,0x01,0x92,0x05,0x9a,0x00,0x03,0x00,0x2b,0xb6,0x03,0x02,0x01,0x00,0x03,0x00,0x01,0xb8,0x01,0x00,0x40,0x0b,0x02,0x03,0x14,0x02,0x03,0x01,0x02,0x00,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0x2f,0xc1, -0x87,0x05,0x2b,0x10,0x00,0xc1,0x87,0x05,0x7d,0x10,0xc4,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x92,0xfd,0x50,0x72,0x02,0xae,0x05,0x9a,0xf9,0x78,0x06,0x88,0x00,0x01,0xff,0xa6,0xfe,0x5c,0x00,0x5a,0xff,0xc8,0x00,0x0b,0x00,0x2a,0x40,0x17,0x01,0xcb,0x40,0x00,0xc0,0x05,0xcb,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x06, -0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x5d,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0x5a,0x5e,0x5e,0x4f,0x65,0x67,0xfe,0x5c,0x5c,0x5a,0x58,0x5e,0x67,0x4f,0x4d,0x69,0x00,0x01,0xfe,0x9c,0xfe,0x5c,0x01,0x64,0xff,0x89,0x00,0x07,0x00,0x24, -0x40,0x14,0x04,0xfd,0x40,0x01,0x80,0x06,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x07,0xfc,0x06,0x03,0xfc,0x02,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x5d,0x33,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x21,0x35,0x33,0x01,0x64,0xfd,0x38,0x68,0x01,0xf8,0x68,0xfe,0x5c,0x01,0x2d,0xc5,0xc5,0x00,0x02,0xff,0x44,0xfe,0x10, -0x00,0xbc,0xff,0x89,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x14,0x01,0xc4,0x2f,0x07,0x01,0x07,0x06,0xc4,0x02,0x40,0x09,0x0d,0x48,0x02,0x03,0xc4,0x05,0x06,0xc4,0x02,0x2f,0xe1,0xdd,0xe1,0x00,0x2f,0x2b,0xed,0xdd,0x5d,0xed,0x31,0x30,0x13,0x21,0x11,0x21,0x03,0x35,0x23,0x15,0xbc,0xfe,0x88,0x01,0x78,0x5a,0xc4,0xfe,0x10,0x01,0x79, -0xfe,0xe1,0xc5,0xc5,0x00,0x01,0xfe,0xa5,0xfe,0xa8,0x01,0x5b,0xff,0x89,0x00,0x16,0x00,0x45,0x40,0x25,0x00,0x0d,0x0d,0x12,0x07,0x80,0x14,0x03,0x0a,0xc5,0x40,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x09,0x03,0x10,0x01,0xff,0x00,0x0e,0x06,0x0c,0xff,0x0d,0x0d,0x07,0x42,0x0d,0x80,0x06,0xfe,0x07,0x2f,0xe1,0x1a,0xce,0x2b,0x01,0x10, -0xe1,0x10,0xf2,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xed,0x39,0x39,0x1a,0xcc,0x39,0x39,0x7c,0x2f,0x33,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x01,0x5b,0x62,0x11,0x4f,0x32,0x40,0x4e,0x41,0x32,0x4e,0x11,0x62,0x0b,0x6e,0x48,0x70,0x2a, -0x28,0x72,0x46,0x70,0xfe,0xee,0x43,0x55,0x34,0x35,0x54,0x43,0x43,0x58,0x64,0x64,0x5a,0x00,0x00,0x01,0xff,0x30,0x04,0xc2,0x00,0xd2,0x06,0x65,0x00,0x0b,0x00,0x09,0xb1,0x07,0x04,0x19,0x2f,0x00,0x2f,0x31,0x30,0x13,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0xd2,0x85,0x85,0x4c,0x86,0x85,0x4b,0x85,0x85,0x4c,0x86, -0x85,0x06,0x1a,0x86,0x84,0x4e,0x86,0x86,0x4c,0x85,0x85,0x4d,0x85,0x85,0x00,0x01,0xff,0x9e,0x05,0x08,0x00,0x62,0x07,0x1c,0x00,0x11,0x00,0x27,0x40,0x13,0x0a,0xc5,0x40,0x09,0xc0,0x01,0xc5,0x40,0x00,0x09,0x03,0xc4,0x10,0x00,0x80,0x0c,0xc4,0x07,0x00,0x2f,0xd4,0xe1,0x1a,0x10,0xdd,0xe1,0xc4,0x00,0x2f,0x1a,0xed,0x1a,0xdc,0x1a, -0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x27,0x26,0x35,0x34,0x33,0x15,0x22,0x15,0x14,0x17,0x16,0x15,0x14,0x62,0x6e,0x35,0x35,0xc0,0x6a,0x35,0x35,0x05,0x08,0x5e,0x42,0x1c,0x42,0x41,0x36,0x9f,0x5e,0x41,0x1b,0x40,0x40,0x3a,0xa0,0x00,0x00,0x02,0xfe,0x57,0x05,0x74,0x01,0xa9,0x07,0x04,0x00,0x03,0x00,0x07,0x00,0x19,0x40,0x0b, -0x02,0xda,0x01,0x06,0xda,0x05,0x07,0x06,0x01,0x00,0x01,0x2f,0x2f,0x12,0x39,0x39,0x00,0x2f,0xfd,0xd6,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x01,0xa9,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x06,0x8e,0x76,0xfe,0x70,0x78,0x00,0x00,0x01,0xfe,0x70,0x04,0xc2,0xff,0xf6,0x06,0x0a,0x00,0x03,0x00,0x0e,0xb4,0x03, -0x80,0x01,0x02,0x00,0x2f,0xcd,0x00,0x2f,0x1a,0xcd,0x31,0x30,0x03,0x23,0x01,0x33,0x0a,0x7f,0xfe,0xf9,0xa8,0x04,0xc2,0x01,0x48,0x00,0x00,0x01,0x00,0x0a,0x04,0xc2,0x01,0x90,0x06,0x0a,0x00,0x03,0x00,0x0e,0xb4,0x03,0x02,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x01,0x23,0x13,0x01,0x90,0xfe,0xf9,0x7f,0xe0, -0x06,0x0a,0xfe,0xb8,0x01,0x48,0xff,0xff,0xfe,0xc0,0x04,0xb2,0x01,0x41,0x05,0xb2,0x00,0x07,0x00,0xd8,0xfe,0x9d,0x00,0x00,0x00,0x01,0xff,0x9c,0x04,0xc2,0x00,0x64,0x05,0xea,0x00,0x0b,0x00,0x33,0xb5,0x01,0x18,0x09,0x12,0x48,0x00,0xb8,0xff,0xc0,0xb4,0x13,0x16,0x48,0x00,0x03,0xb8,0x01,0x02,0xb2,0x07,0x00,0x01,0xb8,0xff,0xc0, -0xb5,0x09,0x12,0x48,0x01,0x03,0x0a,0xb9,0x01,0x01,0x00,0x05,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x3f,0xfd,0xc4,0x2b,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x4a,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x04,0xc2,0x36,0x16,0x3a,0x50,0x52,0x42,0x2f,0x91,0x00,0x00,0x03,0xfe,0xaa,0x04,0x96,0x01,0x56, -0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x2c,0x40,0x15,0x0a,0x04,0x16,0xc1,0x40,0x10,0x10,0x03,0x80,0x02,0x13,0xc0,0x19,0x02,0x40,0x0d,0xc0,0x07,0x00,0x80,0x02,0x2f,0x1a,0xdd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x13,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36, -0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xa8,0xb0,0x5e,0x66,0xf2,0x29,0x37,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x06,0x00,0xfe,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00, -0x00,0x01,0xff,0x64,0xfe,0x40,0x00,0x9c,0xff,0x89,0x00,0x0c,0x00,0x23,0x40,0x13,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x13,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x9c,0x3b, -0x55,0x4b,0x5d,0x78,0x46,0x27,0x29,0xfe,0x90,0x50,0x52,0x47,0xb0,0xba,0x43,0x2a,0x00,0x01,0xfe,0x9c,0x04,0xc2,0x01,0x64,0x05,0xf0,0x00,0x07,0x00,0x1b,0x40,0x0d,0x00,0x05,0x80,0x03,0xfd,0x06,0x00,0x00,0xfc,0x01,0x04,0xfc,0x05,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xed,0x1a,0xcd,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x23,0x11, -0x21,0x01,0x64,0x68,0xfe,0x08,0x68,0x02,0xc8,0x04,0xc2,0xc5,0xc5,0x01,0x2e,0x00,0x00,0x02,0xfe,0x2a,0xfd,0xfe,0x01,0xd6,0xff,0xaa,0x00,0x03,0x00,0x07,0x00,0x10,0xb6,0x06,0x05,0x02,0x50,0x01,0x01,0x01,0x00,0x2f,0x5d,0xcd,0x2f,0xcd,0x31,0x30,0x05,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x01,0xd6,0xfc,0x54,0x03,0xac,0xfc,0x54, -0x03,0xac,0xda,0x84,0xfe,0x54,0x84,0x00,0x00,0x02,0xff,0x58,0xfe,0x1e,0x00,0xa8,0xff,0x89,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x12,0x02,0x01,0x05,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x01,0x01,0x04,0xfc,0x05,0x2f,0xf1,0xca,0x2f,0xe1,0x00,0x2f,0x5d,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x23,0x11, -0x33,0xa8,0x6a,0x6a,0xe6,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0xfe,0x95,0x01,0x6b,0x00,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x05,0x00,0x12,0xb7,0x01,0x04,0xfd,0x05,0x01,0xfc,0x02,0x05,0x2f,0xd4,0xe1,0x00,0x2f,0xfd,0xc4,0x31,0x30,0x17,0x11,0x23,0x11,0x23,0x35,0xb6,0x6c,0xfe,0x3a,0xfe,0x90,0x01,0x06,0x6a,0x00, -0x00,0x01,0xfe,0xc0,0x04,0xc4,0x01,0x40,0x06,0x74,0x00,0x19,0x00,0x3c,0x40,0x1d,0x05,0xc4,0x06,0x12,0xc4,0x13,0x0e,0x0b,0x09,0x10,0x18,0x01,0x03,0x16,0x0d,0x00,0x0c,0x19,0x06,0x0c,0x13,0x06,0x10,0xda,0x16,0x03,0xda,0x09,0x13,0x00,0x2f,0xd4,0xfd,0xdc,0xed,0xc4,0x10,0xc6,0x10,0xc6,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x11, -0x12,0x39,0x39,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x13,0x07,0x16,0x33,0x32,0x35,0x33,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x37,0xa6,0x58,0x1e,0x1e,0x54,0x62,0x5f,0x53,0x3c,0x44,0x5a,0x5a,0x56,0x1e,0x1c,0x58,0x5e,0x60,0x56,0x3a,0x40,0x5c,0x06,0x3a,0x88,0x0a,0x74,0x68, -0x85,0x21,0x8c,0x3a,0x84,0x0c,0x72,0x6e,0x7e,0x23,0x8f,0x00,0x00,0x03,0xfe,0xc0,0x04,0xc4,0x01,0x40,0x07,0x62,0x00,0x0b,0x00,0x1f,0x00,0x2b,0x00,0x35,0x40,0x1b,0x09,0x03,0x29,0xc0,0x23,0x23,0x16,0x1f,0xc4,0x0c,0x15,0xc4,0x16,0x06,0xc1,0x00,0x0c,0x13,0xda,0x19,0x1d,0xda,0x0f,0x16,0x26,0xc1,0x20,0x00,0x2f,0xfd,0xd6,0xd4, -0xfd,0xdc,0xed,0xd4,0xd6,0xed,0x01,0x2f,0xe1,0xd4,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x39,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01, -0x28,0x3b,0x3c,0x27,0x29,0x3a,0x3a,0x01,0x18,0x5f,0x53,0x46,0x5c,0x4c,0x2a,0x58,0x5e,0x60,0x56,0x42,0x54,0x49,0x35,0x54,0xdf,0x29,0x3a,0x3c,0x27,0x29,0x3a,0x3a,0x06,0xa0,0x39,0x29,0x2a,0x36,0x37,0x29,0x29,0x39,0x0a,0x69,0x85,0x33,0x2b,0x70,0x6c,0x7f,0x33,0x2d,0x75,0xfe,0x2e,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00, -0x00,0x02,0xfe,0xc0,0x04,0xb2,0x01,0x40,0x06,0xa0,0x00,0x12,0x00,0x25,0x00,0x34,0x40,0x1a,0x25,0x13,0x12,0xc4,0x00,0x1c,0x1d,0x09,0xc4,0x0a,0x00,0x07,0xda,0x0c,0x10,0xda,0x09,0x03,0x13,0x1a,0xda,0x1f,0x23,0xda,0x1d,0x16,0x00,0x2f,0xc4,0xfd,0xdc,0xed,0xd4,0xd6,0xc6,0xfd,0xdc,0xed,0xc4,0x01,0x2f,0xe1,0x39,0x39,0xd4,0xe1, -0x39,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x40,0x5c,0x56,0x42,0x57,0x57,0x28,0x58,0x5e,0xb6,0x3e,0x52,0x52,0x32,0x54,0x62,0x5c,0x56,0x42,0x57,0x57, -0x28,0x58,0x5e,0xb6,0x3e,0x52,0x52,0x32,0x54,0x06,0xa0,0x64,0x76,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0xfe,0xfe,0x64,0x76,0x25,0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x00,0x01,0xfe,0xa8,0xfe,0x6e,0x01,0x58,0xff,0xb6,0x00,0x09,0x00,0x35,0x40,0x1c,0x07,0x05,0x02,0x00,0x0e,0x09,0xfd,0x03,0x40,0x03,0x02,0x42,0x03,0x0f,0x02,0x1f, -0x02,0x2f,0x02,0x03,0x02,0x04,0x03,0x09,0x08,0x06,0x09,0x01,0x2f,0xcd,0x2f,0xcd,0x11,0x39,0x39,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a,0x18,0x10,0xfd,0xed,0x11,0x39,0x39,0x31,0x30,0x03,0x27,0x37,0x15,0x21,0x35,0x17,0x07,0x35,0x21,0xa8,0xb0,0xb0,0x01,0x50,0xb0,0xb0,0xfe,0xb0,0xfe,0x6e,0xa4,0xa4,0x6e,0x6e,0xa4,0xa4,0x6f,0x00, -0x00,0x01,0xff,0x5c,0xfe,0x5c,0x00,0xa4,0xff,0xdb,0x00,0x06,0x00,0x18,0x40,0x0a,0x00,0x04,0x02,0x03,0x04,0x04,0x05,0xfc,0x01,0x02,0x2f,0xdd,0xf1,0xc1,0x2f,0x00,0x2f,0xdd,0x32,0xc6,0x31,0x30,0x03,0x35,0x23,0x37,0x17,0x23,0x15,0x35,0x6f,0xa4,0xa4,0x6f,0xfe,0x5c,0xcf,0xb0,0xb0,0xcf,0x00,0x01,0xfd,0x0e,0x05,0xc2,0x02,0xf2, -0x07,0x00,0x00,0x15,0x00,0x1d,0x40,0x0e,0x00,0x07,0xda,0x0e,0x12,0xda,0x03,0x0b,0x15,0xda,0x00,0x0a,0xda,0x0b,0x2f,0xe1,0x2f,0xe1,0x00,0x2f,0xd4,0xfd,0xd4,0xed,0xc4,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x25,0x24,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x05,0x04,0x33,0x32,0x36,0x35,0x02,0xf2,0x02,0xb6,0x86,0x92,0xfe, -0xde,0xfe,0xde,0x90,0x58,0x71,0x77,0x02,0xb4,0x88,0x95,0x01,0x23,0x01,0x22,0x8c,0x57,0x72,0x07,0x00,0x86,0xb2,0x5b,0x5a,0x6b,0x50,0x88,0xb0,0x5b,0x5b,0x6c,0x50,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x07,0x40,0x00,0x09,0x00,0x16,0x40,0x09,0x03,0xda,0x08,0x00,0x06,0x01,0x00,0x05,0x06,0x2f,0x33,0x2f,0x32,0x00,0x2f,0xc4, -0xd4,0xed,0x31,0x30,0x01,0x23,0x02,0x21,0x20,0x03,0x23,0x12,0x21,0x20,0x03,0x1a,0xa2,0xba,0xfe,0x41,0xfe,0x43,0xba,0xa2,0xf0,0x02,0x2a,0x02,0x2a,0x05,0xc2,0x01,0x02,0xfe,0xfe,0x01,0x7e,0x00,0x00,0x01,0xfd,0xaf,0xfe,0x6e,0x02,0x51,0xff,0xb6,0x00,0x06,0x00,0x22,0x40,0x12,0x04,0x05,0xfd,0x01,0x40,0x0f,0x02,0x1f,0x02,0x2f, -0x02,0x03,0x02,0x01,0x05,0x80,0x03,0x00,0x2f,0x2f,0x1a,0xcd,0x32,0x00,0x2f,0x5d,0x1a,0xdd,0xfd,0xcd,0x31,0x30,0x05,0x21,0x35,0x17,0x07,0x35,0x21,0xfd,0xaf,0x03,0xf2,0xb0,0xb0,0xfc,0x0e,0xb8,0x6e,0xa4,0xa4,0x6f,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4c,0x40,0x2b,0x0d,0x0a,0x04,0x95, -0x40,0x07,0x08,0x11,0x07,0x95,0x09,0x30,0x03,0x15,0x01,0x1d,0x95,0x17,0x16,0x0e,0x23,0x95,0x11,0x10,0x08,0x00,0x0b,0x0b,0x0a,0x14,0x83,0x20,0x20,0x27,0x02,0x0d,0x0a,0x07,0x04,0x19,0x84,0x05,0x03,0x2f,0xc6,0xe9,0x17,0x39,0x12,0x39,0x2f,0xe9,0x11,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x2b,0x00,0x18,0x2f, -0x1a,0xed,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x85,0x85,0xa2,0xf8,0xf8,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80, -0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x04,0xb4,0x8c,0xac,0xac,0x8c,0xfe,0x98,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49,0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x03,0xff,0xac,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x1b,0x00,0x23,0x00,0x2b,0x00,0x48,0x40,0x26,0x08,0x08,0x00,0x0d,0x14,0x24,0x91,0x1d,0x1d,0x0d, -0x25,0x91,0x00,0x12,0x1c,0x01,0x91,0x0d,0x03,0x14,0x25,0x18,0x7d,0x29,0x29,0x11,0x7d,0x21,0x21,0x2d,0x00,0x05,0x7e,0x0a,0x1d,0x25,0x7e,0x00,0x2f,0xe9,0x32,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xe9,0x39,0x2f,0xe9,0x11,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x11,0x23,0x22, -0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x01,0x0e,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x96,0xba,0xda,0x84,0x74,0x91,0xae,0xfe,0xf8,0xc9,0xfa,0xac,0x8a, -0x9d,0xfe,0xee,0xc1,0xe4,0x94,0xa3,0xfe,0xa6,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0xe4,0x05,0x02,0xfe,0x31,0x85,0x79,0xd1,0xfd,0x9a,0xfd,0xfc,0x8c,0x7a,0xfe,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x2e,0x40,0x18,0x0d,0x91, -0x05,0x05,0x01,0x0e,0x91,0x00,0x12,0x04,0x91,0x01,0x03,0x02,0x02,0x09,0x7d,0x12,0x12,0x16,0x05,0x0e,0x7e,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc, -0x02,0xfe,0xfd,0xaa,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0x98,0xfe,0x38,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x12,0x00,0x1f,0x00,0x36,0x40,0x1d,0x08,0x00,0x0b,0x17,0x95,0x11,0x16,0x03,0x15,0x1d,0x95,0x0b, -0x10,0x07,0x95,0x04,0x00,0x05,0x05,0x0e,0x83,0x1a,0x1a,0x21,0x14,0x01,0x08,0x84,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33, -0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x03,0x25,0xfd,0x7d,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80,0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x05,0xec,0x8c,0xfd,0xec,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49,0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x02,0x00,0x33,0x00,0x00, -0x04,0x38,0x05,0xb2,0x00,0x0d,0x00,0x15,0x00,0x2b,0x40,0x16,0x0e,0x91,0x06,0x06,0x05,0x0f,0x91,0x00,0x12,0x03,0x05,0x04,0x0a,0x7d,0x13,0x13,0x17,0x02,0x06,0x0f,0x7e,0x00,0x2f,0xe1,0x32,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xcd,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x27,0x35,0x25,0x33,0x11,0x21,0x32,0x16,0x15, -0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x89,0x01,0x1b,0x16,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa0,0xfe,0xcb,0x04,0x81,0x77,0x16,0xa4,0xfd,0x86,0xcd,0xbf,0xc6,0xe6,0x02,0xa4,0xfd,0xf2,0x8e,0x7e,0x01,0x02,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x13,0x00,0x20,0x00,0x33, -0x40,0x1b,0x09,0x01,0x0c,0x18,0x95,0x12,0x16,0x03,0x15,0x1e,0x95,0x0c,0x10,0x06,0x08,0x00,0x0f,0x83,0x1b,0x1b,0x22,0x14,0x01,0x09,0x84,0x05,0x03,0x2f,0xc6,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xcd,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x27,0x35,0x25,0x33,0x11,0x33,0x36,0x33, -0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x85,0x01,0x10,0x17,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80,0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x04,0xc2,0x73,0x17,0xa0,0xfd,0x60,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49, -0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x01,0x00,0x6a,0xff,0xe8,0x04,0x98,0x05,0xb2,0x00,0x15,0x00,0x22,0x40,0x11,0x01,0x03,0x91,0x14,0x13,0x0b,0x09,0x91,0x0e,0x04,0x11,0x7d,0x06,0x06,0x17,0x0b,0x00,0x2f,0x32,0x11,0x39,0x2f,0xe9,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x00,0x11,0x10, -0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x6a,0x9a,0xba,0xf6,0x01,0x34,0xfe,0xe1,0xea,0xd8,0x9d,0x9f,0xed,0x01,0x31,0x01,0x71,0xfe,0x64,0xfe,0xc0,0xcc,0x23,0xb2,0x56,0x01,0x4b,0x01,0x13,0x01,0x07,0x01,0x36,0x60,0xa4,0x54,0xfe,0x76,0xfe,0xc0,0xfe,0xa8,0xfe,0x58,0x00,0x01,0x00,0x5e,0xff,0xe8, -0x05,0x42,0x06,0x83,0x00,0x21,0x00,0x43,0x40,0x24,0x20,0x11,0x01,0x11,0x0f,0x91,0x14,0x13,0x21,0x92,0x00,0x02,0x92,0x1f,0x1a,0x1c,0x1a,0x07,0x09,0x91,0x1a,0x04,0x19,0x06,0x17,0x00,0x1c,0x7f,0x04,0x06,0x12,0x12,0x23,0x0c,0x7d,0x17,0x2f,0xe1,0x12,0x39,0x2f,0xd6,0xd6,0xe1,0xc6,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x11,0x39, -0x10,0xd4,0xfd,0xd6,0xed,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x05,0x42,0x2a,0x24,0x71,0x0f,0x09,0xa5,0xb7,0xf1,0xfe,0xd2,0x01,0x1f,0xe9,0xd8,0x9e,0x9f,0xed, -0xfe,0xce,0xfe,0x90,0x01,0x9c,0x01,0x3e,0x5c,0x5e,0x03,0x85,0x68,0x30,0x30,0x05,0xe4,0x14,0x9e,0x3c,0x58,0x06,0x5a,0xfe,0xb5,0xfe,0xed,0xfe,0xfa,0xfe,0xc9,0x60,0xa3,0x54,0x01,0x8a,0x01,0x40,0x01,0x57,0x01,0xa9,0x18,0x5f,0x8a,0x13,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x0e,0x04,0xd5,0x00,0x21,0x00,0x48,0x40,0x1d,0x30,0x11, -0x01,0x11,0x11,0x0f,0x95,0x14,0x16,0x21,0x96,0x00,0x02,0x96,0x1f,0x1a,0x1c,0x1a,0x40,0x07,0x01,0x07,0x07,0x09,0x95,0x1a,0x10,0x00,0x1c,0xb8,0x01,0x03,0xb7,0x04,0x06,0x11,0x11,0x23,0x0c,0x83,0x17,0x2f,0xe1,0x12,0x39,0x2f,0xd6,0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x12,0x39,0x10,0xd4,0xfd,0xd6,0xed,0x3f,0xed,0x32, -0x2f,0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x04,0x0e,0x23,0x20,0x65,0x08,0x06,0x93,0x7d,0x95,0xbb,0xbd,0x9f,0x86,0x76,0x76,0xa2,0xdd,0xfe,0xf5,0x01,0x1a,0xe0,0x4b,0x41,0x02, -0x77,0x59,0x28,0x2e,0x04,0x42,0x12,0x8e,0x54,0x2e,0x04,0x4e,0xdf,0xb9,0xb4,0xd0,0x59,0x9c,0x47,0x01,0x1f,0xe5,0xef,0x01,0x3d,0x14,0x57,0x7a,0x13,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x0b,0x00,0x17,0x00,0x43,0x40,0x0a,0x10,0x0d,0x01,0x91,0x40,0x04,0x05,0x00,0x04,0x91,0xb8,0x01,0x00,0x40,0x17,0x30, -0x11,0x91,0x00,0x12,0x0c,0x91,0x05,0x03,0x0f,0x0f,0x11,0x08,0x7d,0x15,0x15,0x19,0x0d,0x04,0x11,0x7e,0x02,0x00,0x2f,0xc6,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x21, -0x15,0x21,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0xbc,0xa0,0xa0,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0x01,0x50,0xfe,0xb0,0xd6,0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x02,0x81,0x9b,0x02,0x7e,0xfd,0x45,0xfe,0xb2,0xfe,0x6f,0x05,0x02,0xfe,0x1a,0x9b,0xfe,0x17,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x02,0xff,0xac,0x00,0x00,0x05,0x90, -0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x2e,0x40,0x18,0x08,0x08,0x0d,0x15,0x91,0x00,0x12,0x14,0x01,0x91,0x0d,0x03,0x05,0x7e,0x0a,0x00,0x10,0x7d,0x19,0x19,0x1d,0x15,0x7e,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xd4,0xe1,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x21,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26, -0x35,0x34,0x36,0x33,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0x01,0x0e,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x8a,0x02,0xf6,0xfe,0x5b,0xfe,0x9e,0xd3,0xd6,0x01,0x1a,0x01,0x39,0xfd,0xb7,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xfd,0x45,0xfe,0xb4,0xfe,0x6d,0x05,0x02,0xfb,0x96, -0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x02,0x00,0x5c,0x00,0x00,0x03,0xd7,0x05,0x9a,0x00,0x0c,0x00,0x13,0x00,0x2c,0x40,0x17,0x0e,0x91,0x08,0x08,0x0c,0x0d,0x91,0x00,0x12,0x09,0x91,0x0c,0x03,0x00,0x7e,0x08,0x0d,0x0d,0x15,0x0a,0x11,0x7d,0x04,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed, -0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x24,0x33,0x33,0x11,0x21,0x35,0x21,0x03,0x11,0x23,0x20,0x11,0x10,0x21,0x03,0xd7,0xfe,0x5c,0xe5,0xf2,0x01,0x0a,0xe0,0xe9,0xfd,0xaa,0x02,0xfe,0xa8,0xe7,0xfe,0xc6,0x01,0x36,0xce,0xc2,0xc2,0xe6,0x01,0xc8,0x9a,0xfa,0xfa,0x02,0x0e,0xfe,0xf4,0xfe,0xfe,0x00,0x00,0x02,0x00,0x60,0xff,0xe8, -0x04,0x0e,0x05,0xec,0x00,0x12,0x00,0x1f,0x00,0x34,0x40,0x1c,0x0e,0x02,0x0b,0x1d,0x95,0x05,0x16,0x00,0x15,0x17,0x95,0x0b,0x10,0x0f,0x95,0x12,0x00,0x00,0x84,0x13,0x02,0x0e,0x0e,0x21,0x1a,0x83,0x10,0x08,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x21,0x23, -0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x0e,0xa2,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xfd,0x7e,0x03,0x24,0xa2,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01, -0x32,0xa6,0x01,0xee,0x8c,0xfb,0xe3,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x5c,0x04,0x18,0x00,0x1a,0x00,0x26,0x00,0x44,0x40,0x25,0x00,0x0d,0x1b,0x03,0x06,0x16,0x10,0x09,0x01,0x09,0x0b,0x95,0x06,0x1c,0x21,0x95,0x16,0x10,0x1b,0x00,0x24,0x0d,0x83,0x03,0x03,0x13,0x08,0x08,0x13,0x19, -0x83,0x1e,0x1e,0x28,0x24,0x83,0x13,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x11,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xfd,0xc6,0x5d,0x11,0x12,0x17,0x39,0x31,0x30,0x25,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x10,0x05, -0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xdd,0x7b,0x56,0xd9,0xac,0xad,0x90,0x96,0xab,0xd9,0x58,0xc8,0xd3,0xb3,0x01,0x22,0xe4,0xdf,0x01,0x17,0xfe,0x00,0xc6,0x92,0xba,0x9c,0x9a,0xbc,0x81,0x48,0x53,0x7e,0x50,0x71,0x98,0x4c,0xac,0x6c,0x7f,0x34,0x5d,0x77,0x7e,0xf7,0x92,0xcf,0x01,0x11,0xfe,0xfc,0xc4,0xfe, -0xd9,0x8f,0x6f,0xca,0x73,0x96,0xb2,0xb3,0x95,0x6e,0xbe,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x03,0x52,0x05,0x9a,0x00,0x0b,0x00,0x32,0x40,0x1b,0x04,0x91,0x40,0x07,0x0b,0x00,0x07,0x91,0x2b,0x30,0x03,0x91,0x00,0x12,0x08,0x91,0x0b,0x03,0x00,0x7e,0x07,0x03,0x03,0x0d,0x05,0x09,0x01,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00, -0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x52,0xfd,0x08,0x02,0x50,0xfd,0xfa,0x02,0x06,0xfd,0xd1,0x02,0xd7,0x98,0x01,0xe9,0x97,0x01,0xea,0x98,0x00,0x00,0x01,0x00,0x70,0xff,0xe8,0x03,0xf4,0x05,0xb2,0x00,0x23,0x00,0x49,0x40,0x28,0x08,0x1b, -0x91,0x40,0x1a,0x0e,0x02,0x1a,0x91,0x09,0x30,0x20,0x23,0x01,0x23,0x21,0x91,0x02,0x13,0x11,0x13,0x91,0x0e,0x04,0x08,0x05,0x1b,0x1b,0x1e,0x10,0x00,0x00,0x25,0x05,0x16,0x7d,0x0b,0x1e,0x7d,0x05,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f, -0x1a,0xed,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x37,0x35,0x24,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0xf4,0xa6,0xcf,0xf5,0xfe,0xe6,0xa2,0x90,0xff,0x00,0x01,0x11,0xd9,0xb2,0x91,0x99,0xaf,0x8d,0xaa,0xcb,0xab,0x69, -0x6b,0xfe,0x5d,0xbf,0xa5,0xc8,0xa7,0x35,0x4d,0xdd,0xb8,0x85,0xc4,0x26,0x06,0x50,0xed,0xa7,0xdc,0x46,0xaa,0x58,0x7e,0x6b,0x70,0x92,0x97,0xfe,0xf1,0x7d,0x8d,0x5c,0x00,0x01,0xff,0x9a,0xfe,0x96,0x03,0x94,0x05,0x9a,0x00,0x11,0x00,0x33,0x40,0x1b,0x05,0x91,0x40,0x02,0x10,0x12,0x02,0x91,0x09,0x30,0x0b,0x0d,0x91,0x08,0x01,0x91, -0x10,0x03,0x03,0x11,0x11,0x13,0x02,0x06,0x7e,0x0b,0x0f,0x2f,0xc6,0xe1,0x32,0x12,0x39,0x2f,0xc4,0x00,0x3f,0xed,0x2f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x21,0x03,0x94,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0xfe,0xae,0x41,0x37,0x32, -0x3e,0xb2,0x02,0xd8,0x05,0x02,0xfe,0x10,0x97,0xfd,0xba,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x05,0x65,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x85,0x06,0x83,0x00,0x25,0x00,0x63,0x40,0x37,0x12,0x91,0x40,0x15,0x1e,0x0f,0x15,0x91,0x08,0x30,0x16,0x11,0x0f,0x91,0x18,0x13,0x00,0x20,0x07,0x1e,0x02,0x92,0x23,0x1e,0x1f,0x07,0x2f,0x07, -0x02,0x07,0x09,0x91,0x1e,0x04,0x1d,0x06,0x1b,0x00,0x20,0x7f,0x04,0x06,0x06,0x16,0x13,0x13,0x0c,0x16,0x7e,0x11,0x11,0x27,0x0c,0x7d,0x1b,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x10,0xc0,0x2f,0xd6,0xe1,0xc6,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x5d,0x10,0xd4,0xfd,0x11,0x12,0x39,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18, -0x2f,0x1a,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x21,0x35,0x21,0x11,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x05,0x85,0x29,0x24,0x72,0x0f,0x08,0xbf,0xd2,0xf6,0xfe,0xc8,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc6,0x01,0xe4, -0xd8,0xfe,0xf6,0xfe,0xcd,0xfe,0x85,0x01,0xa5,0x01,0x43,0x79,0x76,0x03,0x86,0x67,0x30,0x30,0x05,0xe4,0x14,0xa8,0x48,0x54,0x06,0x6c,0xfe,0xb6,0xfe,0xf6,0xfe,0xf0,0xfe,0xc9,0x43,0x01,0x92,0x98,0xfd,0x76,0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x22,0x64,0x8f,0x13,0x00,0x00,0x02,0x00,0x12,0xfe,0x1e,0x04,0xe6,0x05,0x9a, -0x00,0x17,0x00,0x1f,0x00,0x16,0x40,0x0a,0x1c,0x91,0x07,0x1c,0x00,0x0f,0x03,0x00,0x21,0x0f,0x2f,0x10,0xc6,0x00,0x3f,0x33,0x3f,0xed,0x31,0x30,0x01,0x01,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x01,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x04,0xe6,0xfd,0xfe, -0x06,0x72,0x89,0x63,0x60,0x82,0x29,0x4d,0x08,0xfe,0x06,0xbb,0x01,0x8d,0x15,0x08,0x04,0x0d,0x14,0x01,0x95,0xfe,0x43,0x43,0x43,0x44,0x05,0x9a,0xfa,0xc8,0x0c,0xe4,0x6e,0x61,0x85,0x82,0x64,0x3d,0x75,0x9a,0x10,0x05,0x3a,0xfb,0xbc,0x3a,0x36,0x39,0x37,0x04,0x44,0xfa,0x3f,0x8d,0x44,0x58,0x58,0x44,0x00,0x01,0x00,0xa6,0xff,0xe8, -0x06,0x87,0x05,0xec,0x00,0x20,0x00,0x45,0x40,0x27,0x04,0x01,0x07,0x0c,0x95,0x17,0x16,0x01,0x15,0x11,0x0f,0x1d,0x95,0x40,0x07,0x10,0x02,0x00,0x0a,0x84,0x19,0x00,0x0f,0x19,0x84,0x09,0x30,0x12,0x83,0x11,0x14,0x84,0x0f,0x0f,0x22,0x04,0x00,0x84,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0x2b,0x01,0x10,0xe1,0x00,0x18, -0x3f,0x3f,0x1a,0xed,0x3f,0x3f,0x3f,0xed,0x11,0x12,0x39,0x31,0x30,0x21,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x15,0x10,0x33,0x32,0x36,0x35,0x10,0x03,0x33,0x12,0x11,0x14,0x02,0x23,0x20,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x4a,0xa4,0xa4,0x04,0x62,0xcb,0x01,0x50,0xf7,0x84,0x9e,0x90,0xb2,0x81,0xfe,0xcb,0xfe, -0x69,0x69,0x7c,0x6c,0x8c,0x05,0xec,0xfd,0x72,0xba,0xfe,0x5f,0xaa,0xfe,0xaa,0xc2,0xa4,0x01,0x19,0x01,0x0a,0xfe,0xf6,0xfe,0xee,0xe5,0xfe,0xe9,0x01,0xda,0x8a,0xaa,0x98,0xb5,0x91,0x00,0x00,0x01,0x00,0xb8,0xff,0xee,0x02,0x25,0x05,0x9a,0x00,0x0b,0x00,0x1b,0x40,0x0d,0x0b,0x09,0x91,0x02,0x16,0x05,0x03,0x00,0x00,0x0d,0x06,0x7e, -0x05,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x25,0x06,0x23,0x22,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x25,0x3c,0x3b,0xf6,0xa8,0x68,0x30,0x2d,0x04,0x16,0x01,0x22,0x04,0x8a,0xfb,0x7a,0x8f,0x15,0x00,0x01,0x00,0x29,0x00,0x00,0x02,0x10,0x05,0x9a,0x00,0x0b,0x00,0x3b,0x40,0x20,0x0a,0x01,0x04,0x91, -0x40,0x07,0x08,0x03,0x07,0x91,0x14,0x30,0x03,0x12,0x08,0x03,0x0b,0x0a,0x06,0x07,0x40,0x0a,0x07,0x02,0x7e,0x03,0x0c,0x0d,0x03,0x7e,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x1a,0x18,0x10,0xcd,0x10,0xcd,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11, -0x33,0x02,0x10,0xa0,0xa8,0x9f,0x9f,0xa8,0xa0,0x02,0x8e,0xfd,0x72,0x02,0x8e,0x97,0x02,0x75,0xfd,0x8b,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0xb2,0x00,0x17,0x00,0x2e,0x40,0x18,0x0a,0x17,0x05,0x03,0x08,0x01,0x07,0x12,0x08,0x03,0x12,0x14,0x91,0x0f,0x04,0x17,0x06,0x12,0x00,0x19,0x09,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x10, -0xd6,0xc6,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0x33,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x01,0x3c,0x8d,0x94,0x5c,0x38,0x37,0x38,0x3e,0x50,0x76,0xfe,0xc4, -0x02,0x90,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x01,0xa4,0xbc,0x5a,0x1a,0x9c,0x1e,0x99,0xfe,0x65,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x15,0x00,0x31,0x40,0x1a,0x01,0x03,0x11,0x15,0x04,0x14,0x05,0x15,0x14,0x0f,0x0c,0x0e,0x95,0x09,0x01,0x15,0x04,0x14,0x00,0x17,0x0c,0x10,0x10,0x04,0x84,0x05,0x2f,0xe1, -0x32,0x10,0xc6,0x10,0xd6,0xc6,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xb3,0x8b,0x47,0x2f,0x37,0x35,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe, -0x14,0x04,0xb2,0x99,0xb7,0x12,0x94,0x1b,0xcf,0xfd,0x83,0x01,0xd5,0xfe,0x12,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x01,0xdb,0x05,0xec,0x00,0x0b,0x00,0x3b,0x40,0x20,0x0a,0x01,0x04,0x95,0x40,0x07,0x08,0x03,0x07,0x95,0x14,0x30,0x03,0x15,0x08,0x00,0x0b,0x0a,0x06,0x07,0x40,0x0a,0x07,0x02,0x84,0x03,0x0c,0x0d,0x03,0x84,0x08,0x30, -0x2b,0x01,0x10,0xe1,0x39,0x39,0x1a,0x18,0x10,0xcd,0x10,0xcd,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x01,0xdb,0x91,0xa4,0x92,0x92,0xa4,0x91,0x02,0xc4,0xfd,0x3c,0x02,0xc4,0x8c,0x02,0x9c,0xfd,0x64,0x00,0x01,0xff,0xfe,0x00,0x00,0x03,0xdf, -0x05,0xee,0x00,0x16,0x00,0x7c,0x40,0x44,0x16,0x12,0x00,0x06,0x05,0x02,0x07,0x15,0x07,0x13,0x12,0x00,0x09,0x05,0x02,0x08,0x14,0x08,0x16,0x13,0x12,0x00,0x12,0x09,0x06,0x05,0x02,0x05,0x06,0x08,0x09,0x13,0x15,0x16,0x06,0x07,0x14,0x10,0x07,0x07,0x05,0x05,0x02,0x0b,0x00,0x04,0x15,0x0d,0x0b,0x95,0x10,0x00,0x14,0x07,0x08,0x15, -0x00,0x08,0x0d,0x0d,0x02,0x05,0x12,0x03,0x04,0x00,0x18,0x04,0x2f,0x10,0xc6,0x11,0x17,0x39,0x39,0x2f,0xc6,0x10,0xc6,0x11,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x33,0x12,0x39,0x39,0x11,0x33,0x2f,0x10,0xc4,0x11,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0, -0x31,0x30,0x21,0x23,0x01,0x01,0x23,0x01,0x27,0x05,0x27,0x25,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x37,0x17,0x05,0x03,0xdf,0xb0,0xfe,0xe7,0xfe,0x9c,0xb4,0x01,0xcf,0x1b,0xfe,0xf2,0x3a,0x01,0x1f,0x35,0x66,0x3e,0x3c,0x3c,0x46,0x68,0x80,0x36,0xf4,0x3a,0xff,0x00,0x03,0x3c,0xfc,0xc4,0x03,0xf8,0x4c,0x84,0x71,0x8b, -0x9c,0x12,0x99,0x0f,0x69,0x85,0x77,0x71,0x7d,0x00,0x00,0x01,0x00,0xb8,0xff,0xe8,0x06,0x66,0x05,0x9a,0x00,0x1e,0x00,0x45,0x40,0x27,0x02,0x07,0x15,0x1e,0x04,0x0c,0x19,0x05,0x11,0x91,0x40,0x09,0x13,0x00,0x12,0x0c,0x03,0x01,0x1e,0x7e,0x1d,0x0e,0x15,0x0c,0x15,0x42,0x0d,0x7e,0x0c,0x07,0x16,0x7e,0x15,0x1f,0x20,0x15,0x7e,0x08, -0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x33,0x00,0x18,0x3f,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x66,0xa4,0x04, -0x6c,0xd1,0xd7,0x48,0x72,0xe4,0xfe,0xac,0xa8,0x67,0x7d,0x67,0x91,0xa8,0xe2,0x6c,0x8c,0xa8,0xa2,0xba,0xd4,0xd4,0x01,0xc4,0x03,0xee,0xfc,0x26,0xa5,0x9c,0xbf,0x86,0x03,0xd6,0xfc,0x12,0xfe,0xd3,0xb5,0x90,0x03,0xd6,0x00,0x01,0xff,0x9a,0xfe,0x96,0x05,0x42,0x05,0x9a,0x00,0x1b,0x00,0x30,0x40,0x19,0x0d,0x0f,0x91,0x0a,0x04,0x16, -0x1b,0x03,0x13,0x01,0x12,0x13,0x03,0x13,0x01,0x07,0x1b,0x7e,0x1a,0x1a,0x1d,0x0d,0x07,0x7e,0x12,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x16,0x17,0x33, -0x26,0x35,0x11,0x33,0x05,0x42,0xd0,0xfd,0x1e,0x1c,0x12,0x06,0x08,0xfe,0xae,0x41,0x37,0x32,0x3e,0xb2,0xda,0x02,0xce,0x2d,0x0d,0x04,0x0a,0xaa,0x04,0x77,0x2b,0x2f,0x2e,0x97,0xfc,0x29,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x05,0x65,0xfb,0x9b,0x46,0x1a,0x3e,0x95,0x03,0xf2,0x00,0x00,0x01,0x00,0x83,0xfe,0x6c,0x03,0xf8,0x04,0x18, -0x00,0x15,0x00,0x34,0x40,0x1b,0x0f,0x09,0x12,0x01,0x09,0x15,0x0c,0x0f,0x04,0x95,0x12,0x10,0x00,0x83,0x01,0x01,0x17,0x09,0x10,0x0d,0x08,0x84,0x09,0x0d,0x83,0x0c,0x09,0x2f,0xd6,0xe1,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x2f,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15, -0x11,0x23,0x11,0x34,0x27,0x33,0x16,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa6,0xec,0x7d,0x9f,0xa4,0x23,0xa8,0x1b,0x04,0x70,0xe4,0xa7,0xb3,0xfe,0x6c,0x03,0xd0,0x01,0x47,0xb1,0x86,0xfd,0xb4,0x02,0xb6,0xef,0x5b,0x47,0x67,0xc6,0xd6,0xcb,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x12,0x00,0x19, -0x00,0x38,0xb7,0x14,0x91,0x40,0x12,0x06,0x00,0x12,0x91,0xb8,0x01,0x00,0x40,0x14,0x30,0x17,0x91,0x00,0x13,0x0f,0x91,0x06,0x04,0x12,0x0c,0x14,0x09,0x7d,0x13,0x13,0x1b,0x14,0x7d,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00, -0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x00,0x23,0x22,0x00,0x07,0x05,0x21,0x16,0x00,0x33,0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xc2,0x13,0xfe,0xfd,0xd8,0xd0,0xfe,0xee,0x16,0x03,0xe6,0xfc,0x1a,0x15,0x01,0x0c,0xcb,0xdc,0x01,0x0b,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01, -0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x03,0x30,0xf6,0x01,0x0c,0xfe,0xe8,0xea,0x9b,0xea,0xfe,0xec,0x01,0x0b,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x07,0x04,0x05,0xb2,0x00,0x15,0x00,0x20,0x00,0x3e,0x40,0x22,0x16,0x07,0x1f,0x91,0x09,0x13,0x00,0x12,0x02,0x06,0x17,0x03,0x19,0x04,0x91,0x13,0x15,0x19,0x91,0x0f,0x04,0x07, -0x7e,0x16,0x16,0x0c,0x01,0x7e,0x00,0x00,0x22,0x1c,0x7d,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x33,0xd4,0xed,0x11,0x17,0x39,0x3f,0x3f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x11,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x11,0x26,0x23, -0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x07,0x04,0xa8,0x76,0x82,0x36,0x4f,0xf9,0xe8,0xfe,0xce,0xfe,0x92,0x01,0x83,0x01,0x37,0x70,0xbe,0xbe,0x6c,0xd8,0xbc,0xfd,0x34,0xca,0x5e,0xe4,0xfe,0xe2,0x01,0x17,0xe5,0xa0,0x04,0xf4,0x19,0x09,0xfb,0x7e,0x7a,0x01,0x90,0x01,0x44,0x01,0x4c,0x01,0xaa,0x22,0x22,0x44,0xfb,0x0a,0x04,0x3e,0x20, -0xfe,0xba,0xfe,0xf7,0xfe,0xf6,0xfe,0xbe,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0xac,0x04,0x18,0x00,0x15,0x00,0x20,0x00,0x3e,0x40,0x22,0x16,0x07,0x1f,0x95,0x09,0x16,0x00,0x15,0x02,0x06,0x17,0x03,0x19,0x04,0x95,0x13,0x15,0x19,0x95,0x0f,0x10,0x07,0x84,0x16,0x16,0x0c,0x00,0x84,0x01,0x01,0x22,0x1c,0x83,0x0c,0x2f,0xe1,0x12,0x39, -0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x33,0xd4,0xed,0x11,0x17,0x39,0x3f,0x3f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x11,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x05,0xac,0xa4,0x64,0x5c,0x3e,0x3d,0xaf,0xb8, -0xec,0xfe,0xe6,0x01,0x28,0xec,0x54,0x98,0x98,0x54,0xb2,0xae,0xfd,0x81,0x7f,0x46,0x9e,0xc2,0xc5,0xa7,0x6e,0x03,0x62,0x18,0x08,0xfc,0xec,0x56,0x01,0x1b,0xf3,0xfa,0x01,0x28,0x21,0x22,0x43,0xfc,0x80,0x02,0xd8,0x1e,0xd7,0xbd,0xb8,0xd0,0x00,0x02,0xff,0xac,0x00,0x00,0x04,0x7b,0x05,0x9a,0x00,0x16,0x00,0x1d,0x00,0x3c,0x40,0x1f, -0x09,0x09,0x0f,0x02,0x00,0x91,0x18,0x18,0x0f,0x02,0x12,0x17,0x03,0x91,0x0f,0x03,0x13,0x7d,0x1b,0x1b,0x1f,0x02,0x09,0x09,0x07,0x7e,0x0c,0x18,0x01,0x7e,0x02,0x2f,0xe1,0x32,0xd4,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22, -0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0x01,0xb6,0xa8,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x88,0xe6,0xfd,0xfe,0xe6,0xef,0xbc,0xb0,0x01,0x65,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xe1,0xcb, -0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x01,0x30,0x01,0x1c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x3c,0x40,0x20,0x0f,0x01,0x18,0x12,0x03,0x1b,0x1e,0x95,0x18,0x16,0x24,0x95,0x12,0x10,0x0a,0x0c,0x95,0x07,0x01,0x0a,0x0a,0x02,0x15,0x83,0x21,0x21,0x28,0x1b,0x0e,0x02,0x84,0x03,0x2f,0xe1, -0x32,0x32,0x12,0x39,0x2f,0xe1,0x10,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x3f,0x11,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01, -0x4e,0x04,0xa4,0xb2,0x8c,0x47,0x2f,0x37,0x35,0xa4,0x04,0x76,0xec,0xc5,0xdf,0xfa,0xd9,0xc9,0x6e,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x06,0x89,0x98,0xb8,0x12,0x94,0x1b,0xcf,0xfe,0xa4,0xcc,0xfe,0xef,0xe9,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7e,0xb2,0xe3,0xcc,0xab,0xc2,0xc6,0x00,0x02,0x00,0xbc,0xff,0x68, -0x04,0x62,0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x40,0x40,0x22,0x11,0x05,0x91,0x40,0x15,0x0a,0x07,0x15,0x91,0x08,0x30,0x00,0x07,0x12,0x14,0x91,0x0a,0x08,0x03,0x10,0x15,0x01,0x00,0x00,0x0e,0x7d,0x19,0x19,0x1d,0x15,0x0a,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x12,0x39,0x00,0x3f,0xdd,0xed,0x3f, -0x2f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x05,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x15,0x21,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x04,0x62,0xc8,0xc5,0x5d,0xa1,0x73,0xa8,0xa8,0x01,0x04,0xcd,0xe7,0xfe,0xc1,0x57,0x47,0xfd,0xe9,0xde,0x89,0xa1,0xfe,0xde,0x98,0x01, -0xb6,0xce,0xfe,0x14,0x05,0x9a,0x98,0xcd,0xb0,0xfe,0xe0,0x4d,0x04,0x36,0x92,0x03,0x1e,0xfe,0x19,0x80,0x74,0xf3,0x00,0x01,0x00,0x62,0xff,0xe8,0x03,0xc7,0x05,0xb2,0x00,0x35,0x00,0x3e,0x40,0x23,0x0a,0x2d,0x14,0x23,0x04,0x05,0x30,0x1b,0x01,0x1b,0x19,0x91,0x1e,0x04,0x20,0x35,0x01,0x35,0x30,0x91,0x05,0x13,0x23,0xb1,0x14,0x1b, -0x14,0x1b,0x0a,0x35,0x35,0x37,0x2d,0xb1,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x00,0x3f,0xed,0xc4,0x5d,0x3f,0xed,0xcd,0x5d,0x12,0x17,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e, -0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x03,0xc7,0x1c,0x5d,0x68,0x63,0x23,0x66,0xb8,0x8d,0x53,0x3d,0x68,0x8a,0x4d,0x4b,0x73,0x50,0x29,0x36,0x56,0x6d,0x38,0xc7,0x7f,0x62,0xd3,0x5d,0xb3,0x8c,0x56,0x37,0x60,0x82,0x4b,0x47,0x7b,0x5a,0x33,0x99,0x9b,0x2d,0x6a,0x69,0x5f,0x22,0x3a,0x13,0x1f,0x15,0x0b,0x29, -0x5c,0x93,0x6a,0x50,0x7c,0x66,0x54,0x26,0x25,0x3e,0x42,0x50,0x37,0x3b,0x52,0x34,0x17,0x58,0xbd,0x33,0x2e,0x5e,0x91,0x62,0x50,0x77,0x5e,0x4e,0x26,0x24,0x41,0x47,0x56,0x3a,0x6c,0x73,0x12,0x21,0x30,0x1e,0x00,0x01,0x00,0x56,0xff,0xe8,0x02,0xfd,0x04,0x18,0x00,0x2e,0x00,0x43,0xb7,0x0b,0x20,0x07,0x2a,0x04,0x02,0x1b,0x2e,0xb8, -0xff,0xc0,0x40,0x1b,0x0b,0x0e,0x48,0x2e,0x2e,0x2c,0x95,0x02,0x16,0x18,0x18,0x16,0x95,0x1b,0x10,0x11,0x83,0x20,0x20,0x18,0x00,0x00,0x30,0x18,0x2a,0x83,0x07,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x2f,0x2b,0x11,0x12,0x17,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35, -0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x33,0x32,0x37,0x02,0xfd,0x74,0x9e,0x4f,0x93,0x70,0x43,0x29,0x4c,0x6d,0x43,0x33,0x50,0x38,0x1d,0x1d,0x35,0x4a,0x2e,0x93,0x71,0x69,0x85,0x4b,0x8d,0x6e,0x42,0x23,0x45,0x67,0x44,0x31, -0x55,0x3f,0x25,0xd8,0xa2,0x85,0x25,0x3d,0x24,0x4a,0x70,0x4c,0x3e,0x5a,0x45,0x37,0x1a,0x14,0x22,0x2a,0x36,0x28,0x20,0x35,0x26,0x15,0x4a,0xa6,0x2e,0x26,0x4b,0x6f,0x48,0x3b,0x58,0x45,0x37,0x1b,0x13,0x23,0x2c,0x39,0x29,0x90,0x63,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x03,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x38,0x40,0x1b,0x03,0x09, -0x09,0x05,0x02,0x0a,0x91,0x01,0x12,0x04,0x08,0x91,0x05,0x03,0x08,0x04,0x0a,0x03,0x09,0x09,0x02,0x07,0x00,0x00,0x0d,0x04,0x02,0x2f,0xc6,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x33,0x32,0x11,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x12,0x39,0x19,0x2f,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21, -0x03,0xf0,0xfc,0x3d,0x01,0xd3,0xfe,0x58,0x03,0x5a,0xfd,0x9c,0x01,0x78,0xfe,0x5f,0x02,0xcb,0x4e,0x02,0x96,0x02,0x5c,0x5a,0x9a,0xfd,0xe8,0xfd,0xac,0x00,0x00,0x02,0xff,0x83,0xfe,0x1e,0x02,0x87,0x06,0x02,0x00,0x15,0x00,0x20,0x00,0x39,0x40,0x1f,0x15,0x13,0x95,0x02,0x1c,0x1f,0x95,0x40,0x07,0xc0,0x19,0x95,0x40,0x0d,0x01,0x15, -0x04,0x16,0x04,0x1c,0x84,0x0a,0x11,0x84,0x04,0x21,0x22,0x04,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xd4,0xe1,0x11,0x33,0x10,0xc4,0x00,0x3f,0x1a,0xed,0x1a,0xdc,0x1a,0xed,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x37,0x01,0x35,0x34, -0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x87,0x39,0x5c,0xfe,0xfc,0x39,0x43,0x65,0x8a,0x90,0x6c,0x80,0x91,0x91,0x38,0x2e,0xfe,0x67,0x71,0x2a,0x39,0x3e,0x31,0x35,0xfe,0x3e,0x20,0x01,0x34,0x04,0xe6,0x1c,0x87,0x67,0x68,0x90,0xab,0x95,0xfa,0xac,0xc4,0x21,0x05,0xf7,0x0d,0xa8,0x3c,0x2b,0x2c,0x3c,0x00,0x00,0x01,0x00,0x2b, -0xfe,0x96,0x02,0x81,0x05,0x2f,0x00,0x1e,0x00,0x3e,0x40,0x22,0x06,0x08,0x95,0x03,0x1e,0x1c,0x95,0x0b,0x16,0x18,0x15,0x0e,0x95,0x14,0x11,0x0f,0x0b,0x40,0x13,0x16,0x48,0x0b,0x84,0x1e,0x17,0x17,0x18,0x06,0x15,0x11,0x18,0x84,0x0f,0x0e,0x2f,0xcd,0xe1,0x39,0x39,0xc4,0x10,0xc1,0x2f,0xd4,0xe1,0x2b,0x00,0x3f,0xcd,0xed,0x39,0x39, -0x3f,0xfd,0xc6,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x36,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x99,0x7e,0x3c,0x34,0x34,0x3c,0x7e,0xfe,0xf3,0xb0,0xb0,0x4d,0x57,0x01,0x02,0xfe,0xfe,0x45,0x52,0x3c,0x2f,0x44,0x87, -0x9f,0x18,0x92,0x1f,0x9f,0x28,0x01,0x2c,0x02,0x60,0x8c,0xfa,0x18,0x1d,0xfe,0xd1,0x8c,0xfd,0xbd,0x67,0x58,0x22,0x00,0x01,0xff,0xcd,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x11,0x00,0x2d,0x40,0x18,0x03,0x12,0x0a,0x04,0x01,0x91,0x40,0x11,0x03,0x08,0x7e,0x0d,0x0d,0x02,0x00,0x02,0x7e,0x03,0x12,0x13,0x03,0x7e,0x08,0x30,0x2b,0x01, -0x10,0xe1,0x18,0xc4,0x10,0xc0,0x2f,0xe1,0x00,0x3f,0x1a,0xed,0x32,0xc4,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x04,0x0c,0xfe,0x62,0xa8,0x9b,0x5a,0x65,0x15,0x9d,0x17,0xc2,0xa2,0x02,0xdb,0x05,0x02,0xfa,0xfe,0x05,0x02,0x5c,0x4e,0x37,0x33,0x38,0x42,0x85,0xad, -0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x02,0x00,0x1d,0x00,0x32,0x40,0x1a,0x1d,0x1b,0x95,0x02,0x16,0x0f,0x11,0x95,0x0c,0x01,0x17,0x14,0x05,0x95,0x08,0x0f,0x1d,0x0f,0x16,0x16,0x14,0x08,0x17,0x84,0x06,0x05,0x2f,0xcd,0xf1,0x39,0x39,0xc1,0x2f,0xc4,0xc4,0x00,0x3f,0xed,0x39,0x39,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30, -0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0x98,0x83,0x4a,0x41,0x3d,0x40,0x85,0x01,0x02,0xfe,0xfe,0x45,0x52,0x3c,0x2f,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xc0,0x93,0xaf,0x1c, -0x92,0x23,0xbf,0xb8,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x01,0x00,0x27,0xfe,0x96,0x04,0x0c,0x05,0x9a,0x00,0x0f,0x00,0x32,0x40,0x1a,0x06,0x04,0x91,0x09,0x01,0x0c,0x91,0x40,0x0e,0x03,0x06,0x06,0x02,0x00,0x0b,0x0d,0x0d,0x02,0x7e,0x0b,0x10,0x11,0x0b,0x7e,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc0,0x18,0x2f,0x10,0xc4,0x11,0x39,0x2f, -0x00,0x3f,0x1a,0xed,0x32,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x21,0x11,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xaa,0x46,0x34,0x3a,0x4e,0xfe,0xbc,0xfe,0x61,0x03,0xe5,0x05,0x02,0xfb,0x33,0xfe,0xf8,0x17,0x94,0x1a,0x01,0x95,0x04,0xd7,0x98,0x00,0x00,0x01,0x00,0x62,0xff,0xe8,0x05,0xa8, -0x05,0x9a,0x00,0x1b,0x00,0x42,0x40,0x24,0x09,0x91,0x17,0x13,0x04,0x0e,0x10,0x11,0x04,0x01,0x91,0x02,0x03,0x12,0x7d,0x0e,0x0e,0x0c,0x06,0x00,0x7e,0x04,0x04,0x0c,0x06,0x11,0x11,0x14,0x7d,0x0c,0x0c,0x1d,0x01,0x06,0x7d,0x1a,0x2f,0xe1,0x33,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00, -0x3f,0xed,0x17,0x39,0x3f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x15,0x04,0x11,0x14,0x00,0x33,0x32,0x00,0x35,0x10,0x01,0x35,0x21,0x15,0x21,0x04,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x01,0xbe,0xfe,0xa4,0x02,0x06,0xfe,0xa8,0x01,0x15,0xdd,0xe0,0x01,0x18,0xfe,0xa6,0x02,0x06,0xfe,0xa6,0x01,0x5c,0xfe,0x8e,0xfe,0xd0,0xfe,0xcd, -0xfe,0x8f,0x05,0x06,0x94,0x94,0xfe,0xfe,0x86,0xf7,0xfe,0xe6,0x01,0x1c,0xf5,0x01,0x78,0x01,0x00,0x94,0x94,0xec,0xfe,0x6f,0xfe,0xca,0xfe,0x95,0x01,0x66,0x01,0x39,0x01,0x93,0x00,0x01,0x00,0xb8,0xff,0xe8,0x05,0x54,0x05,0xb2,0x00,0x16,0x00,0x2a,0x40,0x16,0x04,0x91,0x14,0x13,0x00,0x03,0x0b,0x09,0x91,0x0e,0x04,0x0b,0x0b,0x01, -0x11,0x7d,0x07,0x07,0x18,0x01,0x7e,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xed,0x31,0x30,0x13,0x33,0x11,0x10,0x21,0x32,0x00,0x11,0x10,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x20,0x11,0xb8,0xa8,0x01,0x58,0xd9,0x01,0x17,0xfe,0xf8,0x48,0x40,0x4d,0x57,0xba,0xde, -0xfe,0x81,0xfe,0xdb,0xfe,0x08,0x05,0x9a,0xfc,0xac,0xfe,0x39,0x01,0x91,0x01,0x25,0x01,0xe5,0x1c,0x9a,0x1a,0xfe,0xad,0xfe,0xe3,0xfe,0x99,0xfe,0x0d,0x02,0x56,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x04,0xd6,0x05,0xb2,0x00,0x15,0x00,0x2b,0x40,0x16,0x00,0x15,0x14,0x03,0x14,0x0c,0x11,0x7e,0x14,0x03,0x14,0x11,0x03,0x13,0x15,0x03, -0x13,0x12,0x0e,0x91,0x09,0x03,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc6,0x12,0x39,0x10,0xcd,0x32,0x31,0x30,0x13,0x01,0x16,0x17,0x33,0x37,0x13,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x01,0x11,0x23,0x11,0x01,0xc1,0x01,0x50,0x1b,0x0c,0x02,0x23,0xc7,0x46,0x8e,0x6b,0x39,0x3a,0x2f,0x3a,0x5a,0x54, -0xfe,0xd1,0xa8,0xfe,0x27,0x05,0x9a,0xfd,0x78,0x33,0x25,0x58,0x01,0x9a,0x91,0x75,0x18,0x9c,0x1c,0xaa,0xfd,0x9e,0xfd,0xf2,0x02,0x12,0x03,0x88,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x04,0x60,0x04,0x18,0x00,0x1c,0x00,0x2f,0x40,0x19,0x14,0x05,0x0f,0x0a,0x0c,0x95,0x07,0x1c,0x10,0x0f,0x00,0x02,0x95,0x1a,0x10,0x0a,0x05,0x0a,0x0f,0x14, -0x04,0x10,0x00,0x1e,0x10,0x2f,0x10,0xc6,0x11,0x17,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xfd,0xc6,0x2f,0x33,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x12,0x33,0x32,0x17,0x04,0x60,0x2c,0x2c,0x66,0x42,0xfe,0x9e,0x7d,0xe5, -0x42,0x29,0x33,0x2e,0x7c,0x3e,0x52,0xfe,0x70,0xb6,0x01,0x15,0x0a,0x0b,0x06,0x05,0x0f,0xc0,0x6d,0xd1,0x29,0x31,0x03,0x79,0x13,0xa8,0xfc,0x78,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x1c,0x32,0x1a,0x34,0x02,0x06,0x01,0x26,0x10,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x11,0x00,0x5a,0x40,0x2e, -0x02,0x02,0x01,0x04,0x01,0x05,0x00,0x05,0x0b,0x0b,0x0a,0x0d,0x0a,0x09,0x0e,0x09,0x04,0x01,0x0a,0x91,0x40,0x0d,0x10,0x08,0x0d,0x91,0x14,0x30,0x09,0x05,0x91,0x08,0x12,0x00,0x0e,0x91,0x10,0x03,0x06,0x0e,0x00,0x00,0x13,0x05,0x0f,0x09,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x33,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2b,0x00,0x18, -0x2f,0x1a,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x10,0x87,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x31,0x30,0x01,0x01,0x33,0x15,0x21,0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x01,0x21,0x35,0x21,0x04,0x64,0xfe,0x71,0xfc,0xfe,0x9d,0xfe,0xae,0x03,0x34,0xfb,0xd1,0x01,0x99,0xe3,0x01,0x4a,0x01,0x41,0xfd,0x00, -0x04,0x02,0x05,0x72,0xfd,0xb3,0x97,0xfe,0x0a,0x98,0x2f,0x02,0x5f,0x97,0x01,0xdd,0x98,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x00,0x11,0x00,0x5a,0x40,0x2e,0x02,0x02,0x01,0x04,0x01,0x05,0x00,0x05,0x0b,0x0b,0x0a,0x0d,0x0a,0x09,0x0e,0x09,0x04,0x01,0x0a,0x95,0x40,0x0d,0x10,0x08,0x0d,0x95,0x14,0x30,0x09,0x05, -0x95,0x08,0x15,0x00,0x0e,0x95,0x10,0x0f,0x06,0x0e,0x00,0x00,0x13,0x05,0x0f,0x09,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x33,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x10,0x87,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x31,0x30,0x01,0x01,0x33,0x15,0x21,0x03, -0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0x70,0xfe,0xec,0xbc,0xfe,0xe0,0xe6,0x02,0x58,0xfc,0xb7,0x01,0x27,0xa8,0x01,0x0c,0xd3,0xfd,0xdb,0x03,0x16,0x03,0xd1,0xfe,0x83,0x8c,0xfe,0xc4,0x8c,0x33,0x01,0x95,0x8c,0x01,0x20,0x8c,0x00,0x00,0x01,0x00,0x0a,0xfe,0x1e,0x04,0x83,0x05,0x9a,0x00,0x18,0x00,0x44, -0x40,0x24,0x0b,0x0a,0x91,0x40,0x11,0x0e,0x17,0x11,0x91,0x09,0x30,0x01,0x03,0x91,0x17,0x1c,0x10,0x0c,0x91,0x0e,0x03,0x11,0x0b,0x0b,0x06,0x00,0x0c,0x10,0x10,0x14,0x7d,0x06,0x06,0x1a,0x0d,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a, -0xed,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x24,0x35,0x34,0x24,0x21,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x04,0x00,0x15,0x10,0x00,0x21,0x22,0x0a,0xe0,0xde,0xe9,0x01,0x22,0xfe,0xd1,0xfe,0xf6,0x5c,0x01,0xf5,0xfc,0xf4,0x04,0x02,0xfe,0x02,0x01,0x11,0x01,0x47,0xfe,0x6f,0xfe,0xd4,0xe8,0xfe,0x89,0xb5,0x88,0xef,0xbf,0xcc, -0xe2,0x4c,0x02,0xa4,0x98,0x4c,0xfd,0x52,0x17,0xfe,0xd0,0xef,0xff,0x00,0xfe,0xb4,0x00,0x01,0x00,0x5e,0xfe,0x1e,0x04,0xd7,0x05,0x9a,0x00,0x18,0x00,0x40,0x40,0x22,0x0e,0x0f,0x91,0x40,0x08,0x0a,0x02,0x08,0x91,0x09,0x30,0x18,0x16,0x91,0x02,0x1c,0x09,0x0d,0x91,0x0a,0x03,0x08,0x0e,0x0e,0x13,0x0c,0x18,0x18,0x1a,0x0d,0x09,0x13, -0x7d,0x05,0x2f,0xe1,0xc4,0x32,0x12,0x39,0x2f,0xc6,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x20,0x00,0x11,0x34,0x00,0x25,0x01,0x35,0x21,0x15,0x21,0x01,0x15,0x23,0x20,0x04,0x15,0x14,0x04,0x33,0x32,0x37,0x04,0xd7,0xd5,0xfc,0xfe,0xd5,0xfe,0x83,0x01, -0x4e,0x01,0x0a,0xfe,0x02,0x04,0x02,0xfc,0xf6,0x01,0xf4,0x5c,0xfe,0xf8,0xfe,0xce,0x01,0x22,0xe8,0xf0,0xcf,0xfe,0x89,0x6b,0x01,0x3e,0x01,0x02,0xeb,0x01,0x40,0x17,0x02,0xae,0x4c,0x98,0xfd,0x5c,0x4c,0xe5,0xc9,0xbf,0xef,0x7d,0x00,0x01,0x00,0x1e,0xfe,0x21,0x03,0xaa,0x04,0x00,0x00,0x18,0x00,0x3e,0x40,0x21,0x0e,0x0f,0x96,0x40, -0x08,0x0a,0x02,0x08,0x96,0x09,0x30,0x18,0x16,0x95,0x02,0x1c,0x09,0x0d,0x95,0x0a,0x0f,0x08,0x0e,0x0e,0x13,0x0c,0x18,0x1a,0x0d,0x09,0x13,0x83,0x05,0x2f,0xe1,0xc4,0x32,0x10,0xd6,0xc6,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36, -0x37,0x01,0x35,0x21,0x15,0x21,0x01,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0xaa,0x9a,0xca,0xf4,0xfe,0xcc,0xf7,0xcf,0xfe,0x76,0x03,0x2d,0xfd,0xc5,0x01,0x7a,0x54,0xc8,0xe4,0xda,0xaa,0xc4,0x9c,0xfe,0x72,0x51,0xf9,0xcc,0xb0,0xfb,0x1d,0x02,0x1f,0x33,0x8c,0xfd,0xec,0x33,0xab,0x96,0x8d,0xb3,0x62,0x00,0x00,0x01, -0x00,0x0a,0xfe,0x1e,0x03,0x08,0x04,0x00,0x00,0x22,0x00,0x58,0x40,0x30,0x19,0x0b,0x06,0x1f,0x04,0x03,0x10,0x0f,0x96,0x40,0x16,0x13,0x03,0x16,0x96,0x08,0x30,0x00,0x21,0x95,0x03,0x1c,0x15,0x11,0x95,0x13,0x0f,0x16,0x11,0x15,0x10,0x10,0x0b,0x06,0x15,0x15,0x19,0x00,0x00,0x19,0x84,0x0b,0x0b,0x24,0x12,0x1f,0x83,0x06,0x2f,0xe1, -0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x12,0x17,0x39,0x31,0x30,0x05,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x06, -0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x02,0x9e,0x89,0xb9,0xa0,0xb2,0x01,0x38,0xa4,0x7e,0x9e,0x8e,0x52,0x01,0x1a,0xfe,0x0a,0x02,0xd8,0xfe,0xda,0x9e,0xae,0xa6,0xc4,0x93,0x59,0xb8,0xaa,0xfc,0x9e,0x48,0x7d,0x6f,0xc5,0x66,0x36,0x6d,0x59,0x5a,0x67,0x3d,0x01,0x45,0x8c,0x46,0xfe,0xae,0x12,0xa2,0x81,0x7e,0xaf,0x44,0x32,0x45,0x35, -0x6c,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0xc2,0x05,0xb2,0x00,0x1b,0x00,0x6e,0x40,0x38,0x1a,0x01,0x02,0x18,0x02,0x0a,0x07,0x06,0x0d,0x06,0x01,0x1a,0x07,0x99,0x0a,0x0a,0x02,0x10,0x18,0x0d,0x15,0x06,0x02,0x99,0x05,0x18,0x12,0x10,0x9a,0x15,0x07,0x08,0x08,0x12,0x07,0x1a,0x01,0x18,0x02,0x0a,0x07,0x0d,0x06,0x00,0x00,0x18, -0x04,0x04,0x18,0x8a,0x0d,0x0d,0x1d,0x12,0x02,0x06,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x10,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x32,0x12,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x01,0x21, -0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x33,0x03,0xc2,0xfe,0xde,0xfe,0x85,0x02,0x9b,0xfc,0xa0,0x01,0x7f,0xfd,0x01,0x84,0x69,0x52,0x90,0x81,0xbe,0xb2,0xa2,0xe5,0xc0,0xdb,0x9f,0x9f,0x02,0x2b,0xfe,0x69,0x94,0x92,0x01,0x99,0x93,0x77,0x9d, -0x55,0x78,0x88,0xa4,0xac,0x83,0xcf,0xb0,0xaf,0xc6,0x00,0x01,0x00,0x74,0xff,0xe8,0x03,0xc8,0x05,0x9a,0x00,0x1d,0x00,0x42,0x40,0x24,0x0d,0x14,0x09,0x9a,0x40,0x16,0x10,0x1c,0x16,0x9a,0x08,0x30,0x01,0x03,0x95,0x1c,0x16,0x13,0x0e,0x99,0x10,0x06,0x11,0x11,0x19,0x89,0x06,0x06,0x1f,0x0e,0x13,0x14,0x03,0x0d,0x0f,0x00,0x2f,0xc6, -0xc4,0x17,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x23,0x13,0x23,0x35,0x21,0x15,0x21,0x03,0x36,0x33,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0xa4,0x93,0x98,0x99,0xb9,0xbe,0xb1,0x32, -0x4d,0x5f,0x07,0x45,0x9e,0x03,0x13,0xfe,0x25,0x33,0x41,0x2c,0xe7,0xfb,0xfe,0xf1,0xec,0xbd,0x23,0xae,0x5f,0xad,0x8d,0x8e,0x9d,0x05,0x07,0x02,0x3b,0x94,0x94,0xfe,0x5c,0x04,0xe6,0xca,0xd0,0xfe,0x00,0x01,0x00,0x48,0xff,0xe8,0x02,0xcd,0x04,0x00,0x00,0x1b,0x00,0x42,0x40,0x24,0x0b,0x12,0x09,0x95,0x40,0x14,0x0e,0x1a,0x14,0x95, -0x08,0x30,0x01,0x03,0x95,0x1a,0x16,0x11,0x0c,0x95,0x0e,0x0f,0x10,0x10,0x17,0x83,0x06,0x06,0x1d,0x0c,0x11,0x12,0x03,0x0b,0x0d,0x00,0x2f,0xc6,0xc4,0x17,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23, -0x22,0x07,0x13,0x23,0x35,0x21,0x15,0x21,0x07,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x5a,0x72,0x7a,0x64,0x7b,0x83,0x73,0x17,0xa6,0x3e,0x68,0x02,0x5c,0xfe,0xa2,0x28,0x32,0x14,0x9d,0xcc,0xd5,0xb2,0x9e,0x18,0xa6,0x4c,0x6c,0x57,0x54,0x65,0x08,0x01,0x8e,0x8c,0x8c,0xfd,0x02,0xa7,0x94,0x97,0xbf,0x00,0x00,0x01,0x00,0x1e, -0xff,0xe8,0x02,0xe4,0x05,0x2f,0x00,0x20,0x00,0x41,0x40,0x21,0x1c,0x05,0x1f,0x0f,0x01,0x03,0x95,0x1f,0x16,0x11,0x15,0x12,0x0c,0x95,0x0f,0x0f,0x14,0x14,0x15,0x1c,0x83,0x05,0x05,0x22,0x12,0x0f,0x15,0x84,0x0c,0x01,0x01,0x0d,0x0c,0x2f,0xcd,0x39,0x2f,0x10,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x39, -0x39,0xcd,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x35,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x70,0x76,0x95,0xc3,0x38,0x7d,0x92,0x5b,0x7e,0x7e,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x66,0x89,0x6f,0xc9, -0xad,0x96,0x25,0xb0,0x63,0x90,0x2e,0x4b,0x3f,0x4c,0x9b,0x6d,0x66,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0x62,0x4b,0x5e,0x31,0x44,0x8c,0x5e,0x7f,0xa3,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x16,0x04,0x18,0x00,0x0c,0x00,0x15,0x00,0x2c,0x40,0x17,0x02,0x1b,0x05,0x07,0x0e,0x95,0x00,0x03,0x0f,0x14,0x95,0x07,0x10,0x0a,0x83,0x11,0x11,0x17, -0x0e,0x05,0x01,0x84,0x02,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x12,0x39,0x3f,0x31,0x30,0x05,0x11,0x23,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x00,0x01,0x11,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x01,0x4a,0xa4,0xa4,0xac,0xc2,0x97,0xc7,0xfe,0x84,0xfe,0xb0,0xf2,0x01,0x32,0x70,0x5c,0x9e, -0x2d,0xfe,0x56,0x05,0xd7,0x81,0x99,0xc4,0x92,0xdf,0xfe,0x72,0x02,0x80,0xfd,0x9b,0x61,0x01,0x34,0xad,0x5d,0x7a,0x00,0x01,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x0f,0xb6,0x03,0xfa,0x00,0x1c,0x00,0xca,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0xfe,0x1e,0x08,0x00,0x00, -0x00,0x02,0x00,0xac,0xfe,0x1e,0x02,0x66,0x06,0x1e,0x00,0x03,0x00,0x07,0x00,0x25,0x40,0x12,0x02,0x01,0x06,0x05,0x1c,0x06,0xfa,0x00,0xca,0x01,0x01,0x09,0x04,0xca,0x00,0x05,0x01,0x05,0x2f,0x5d,0xe1,0x12,0x39,0x7c,0x2f,0xe1,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0x02,0x66,0x93, -0x93,0xfe,0xda,0x94,0x94,0xfe,0x1e,0x08,0x00,0xf8,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x33,0xfe,0x1e,0x03,0x72,0x06,0x1e,0x00,0x13,0x00,0x4f,0x40,0x2c,0x12,0x01,0x04,0x95,0x07,0x11,0x0e,0x0b,0x95,0x08,0x40,0x0c,0x03,0x08,0x07,0x08,0x3a,0x03,0x1c,0x0c,0xfa,0x10,0x09,0x00,0x05,0x08,0x0b,0x0e,0x11,0x04,0x02,0x00,0x03,0x05, -0x05,0x02,0xca,0x03,0x14,0x15,0x03,0xca,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc0,0x18,0x2f,0x10,0xc4,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x39,0x39,0x10,0xed,0x39,0x39,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x03, -0x72,0xfe,0xaa,0x93,0xfe,0xaa,0x01,0x56,0xfe,0xaa,0x01,0x56,0x93,0x01,0x56,0xfe,0xaa,0x01,0x56,0x01,0x46,0xfc,0xd8,0x03,0x28,0x8b,0x01,0x17,0x8a,0x02,0xac,0xfd,0x54,0x8a,0xfe,0xe9,0xff,0xff,0x00,0xb4,0xff,0xee,0x01,0x92,0x05,0x9a,0x02,0x06,0x00,0x04,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x09,0xbc,0x07,0x62,0x00,0x26, -0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x3d,0x05,0x58,0x00,0x00,0x01,0x07,0x00,0xe0,0x06,0x43,0x01,0x56,0x00,0x13,0x40,0x0b,0x03,0x05,0x1f,0x1f,0x18,0x19,0x25,0x03,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x08,0xef,0x06,0x0c,0x00,0x26,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x5d,0x05,0x7f, -0x00,0x00,0x01,0x07,0x00,0xe0,0x05,0xf5,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x0e,0x1f,0x1f,0x18,0x19,0x25,0x03,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x08,0x05,0x06,0x0c,0x00,0x26,0x00,0x47,0x00,0x00,0x00,0x27,0x00,0x5d,0x04,0x95,0x00,0x00,0x01,0x07,0x00,0xe0,0x05,0x0c,0x00,0x00, -0x00,0x13,0x40,0x0b,0x03,0x0e,0x2d,0x2d,0x26,0x27,0x25,0x03,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0xe8,0x06,0x29,0x05,0x9a,0x00,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x2d,0x03,0xfe,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x02,0xed,0xb4,0x0c,0x12,0x02,0x05,0x25,0x01,0x2b,0x35,0xff,0xff, -0x00,0xbc,0xfe,0x1e,0x05,0x39,0x05,0xd9,0x00,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x4d,0x03,0xd3,0x00,0x00,0x00,0x10,0xb1,0x02,0x01,0xb8,0x01,0xf3,0xb4,0x18,0x0f,0x02,0x05,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xa6,0xfe,0x1e,0x03,0x77,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x4d,0x02,0x11,0x00,0x00, -0xff,0xff,0x00,0xbc,0xff,0xe8,0x07,0xe4,0x05,0x9a,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x2d,0x05,0xb9,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x03,0xda,0xb4,0x1a,0x20,0x0a,0x13,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x1e,0x07,0x34,0x05,0xd9,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x4d,0x05,0xce,0x00,0x00, -0x00,0x10,0xb1,0x02,0x01,0xb8,0x03,0x20,0xb4,0x26,0x1d,0x0a,0x13,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xa6,0xfe,0x1e,0x05,0xed,0x05,0xd9,0x00,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x4d,0x04,0x87,0x00,0x00,0x00,0x10,0xb1,0x02,0x01,0xb8,0x02,0x88,0xb4,0x25,0x1c,0x0a,0x12,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16, -0x00,0x00,0x05,0x12,0x07,0x62,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x12,0x01,0x56,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x13,0x10,0x05,0x00,0x25,0x02,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x0c,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x00,0xe0, -0x7f,0x00,0x00,0x13,0x40,0x0b,0x02,0x18,0x23,0x20,0x08,0x14,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf7,0x00,0x00,0x02,0x29,0x07,0x62,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x91,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x04,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00, -0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdf,0x00,0x00,0x02,0x11,0x06,0x0c,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x79,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x04,0x02,0x03,0x25,0x01,0x06,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x62,0x02,0x26, -0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x85,0x01,0x56,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x18,0x03,0x09,0x25,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0c,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xd9,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00, -0x1b,0x18,0x03,0x09,0x25,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x62,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x41,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x11,0x0e,0x05,0x0d,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, -0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0c,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0a,0x15,0x12,0x08,0x11,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x51, -0x00,0x69,0x01,0x60,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x00,0x21,0x1b,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x3a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x60,0xe9,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x07, -0x25,0x1f,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x42,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x54,0x00,0x80,0x01,0x60,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x0a,0x21,0x0e,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05, -0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xe2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x05,0x54,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x10,0x25,0x12,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00, -0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x5a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x53,0x00,0x80,0x01,0x60,0x00,0x1f,0x40,0x12,0x03,0x02,0x01,0x00,0x24,0x1e,0x05,0x0d,0x25,0x03,0x02,0x01,0x30,0x21,0x01,0x21,0x05,0x26,0x00,0x2b,0x71,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8, -0x03,0xe2,0x06,0xfa,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x61,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x07,0x28,0x22,0x08,0x11,0x25,0x03,0x02,0x01,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x42,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07, -0x06,0x62,0x00,0x6d,0x01,0x60,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0b,0x10,0x1b,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xe2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x62,0xee,0x00,0x00,0x1b,0x40,0x0f, -0x03,0x02,0x01,0x00,0x14,0x1f,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0x48,0x40,0x21,0x06,0x40,0x0b,0x0e,0x48,0x06,0x06,0x04,0x13,0x95,0x40,0x01,0x09,0x0f,0x01,0x95,0x08,0x30,0x17,0x95, -0x0f,0x16,0x04,0x95,0x09,0x10,0x0c,0x83,0x01,0x13,0x13,0x1b,0x06,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x06,0x14,0x83,0x00,0x2f,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0xc5,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x2b,0x31,0x30,0x13,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14, -0x00,0x23,0x22,0x02,0x35,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x52,0x02,0xd3,0x05,0xae,0x9b,0xad,0x90,0x86,0xde,0xd9,0xf8,0xfe,0xf1,0xc8,0xcb,0xdb,0x02,0xd1,0xfd,0xd7,0x02,0x86,0x78,0x74,0xa2,0x02,0x29,0xab,0xba,0x72,0x9a,0x62,0xfe,0xe9,0xfd,0xf1,0xfe,0xd5,0x01,0x06,0xe5,0x35,0x8f,0x9d,0xa6,0xff,0xff,0x00,0x16,0x00,0x00, -0x05,0x12,0x07,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x05,0x51,0x00,0x33,0x01,0x60,0x00,0x1e,0xb2,0x04,0x03,0x02,0xb8,0xff,0xf6,0x40,0x0b,0x23,0x1d,0x05,0x00,0x25,0x04,0x03,0x02,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x3a,0x00,0x26,0x00,0x44, -0xf8,0x00,0x01,0x06,0x06,0x60,0xa3,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x14,0x33,0x2d,0x08,0x14,0x25,0x04,0x03,0x02,0x30,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x05,0x52,0x00,0x90,0x01,0x65,0x00,0x17, -0x40,0x0d,0x03,0x02,0x00,0x12,0x13,0x05,0x00,0x25,0x03,0x02,0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x35,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x06,0x63,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x20,0x22,0x23,0x08,0x14,0x25,0x03,0x02,0x24,0x11,0x26,0x00, -0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x06,0x8c,0x02,0x26,0x00,0x91,0x00,0x00,0x01,0x07,0x00,0xd9,0x03,0x5a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0x01,0x50,0x40,0x09,0x16,0x17,0x05,0x0f,0x25,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x06,0x4e, -0x05,0x2f,0x00,0x26,0x00,0xa0,0xf8,0x00,0x01,0x07,0x00,0xd9,0x02,0x1a,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x06,0x38,0x39,0x11,0x23,0x25,0x03,0x37,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x7d,0x05,0xb2,0x00,0x21,0x00,0x61,0x40,0x37,0x01,0x20,0x18,0x92,0x0f,0x1b,0x1f,0x1b,0x2f,0x1b, -0x03,0x1b,0x1b,0x17,0x1c,0x91,0x1e,0x1e,0x0a,0x02,0x17,0x15,0x91,0x04,0x13,0x1f,0x0d,0x2f,0x0d,0x02,0x0d,0x0f,0x91,0x0a,0x04,0x00,0x00,0x1f,0x1a,0x1d,0x1d,0x1c,0x12,0x0d,0x0d,0x01,0x18,0x1f,0x7e,0x1c,0x1c,0x23,0x12,0x7d,0x07,0x2f,0xe9,0x12,0x39,0x2f,0xf9,0x39,0x39,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xc6,0x10,0xc0,0x2f,0x00, -0x3f,0xfd,0xc6,0x5d,0x3f,0xed,0x32,0x32,0x11,0x39,0x2f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x15,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x05,0x7d,0x91,0xd8,0xfe,0xf8,0xfe,0xcd,0xfe, -0x85,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc8,0x01,0x38,0xfe,0xc6,0x01,0xe2,0x91,0x01,0x31,0xcf,0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xf0,0xfe,0xc9,0x43,0x6f,0x8b,0x98,0x98,0xfe,0xd0,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0xb6, -0x04,0x18,0x00,0x22,0x00,0x2f,0x00,0x77,0x40,0x12,0x22,0x00,0x0f,0x0b,0x01,0x17,0x03,0x0b,0x95,0x40,0x0c,0x13,0x08,0x0c,0x95,0x08,0x30,0x06,0xb8,0xff,0xc0,0x40,0x2d,0x0b,0x0f,0x48,0x06,0x06,0x08,0x95,0x03,0x1c,0x1c,0x10,0x19,0x2d,0x95,0x13,0x1e,0x0f,0x27,0x95,0x19,0x10,0x21,0x01,0x1f,0x0d,0x0a,0x0f,0x06,0x22,0x22,0x1f, -0x0c,0x0c,0x16,0x1f,0x84,0x23,0x1d,0x0f,0x0f,0x31,0x2a,0x83,0x06,0x16,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x12,0x39,0x2f,0x10,0xc2,0x2f,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x12,0x39,0x39,0x3f,0xed,0x32,0x2f,0x2b,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x5f,0x5e,0x5d,0x39,0x39,0x31,0x30,0x05, -0x23,0x02,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x21,0x35,0x21,0x36,0x35,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x14,0x07,0x33,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xb6,0xdb,0x77,0xfe,0x90,0xbe,0x8e,0xad,0x9d,0xda,0x5d,0xfe,0xb4,0x01,0x83,0x0c, -0x04,0x75,0xeb,0xbd,0xeb,0x01,0x00,0xd5,0xcf,0x64,0x04,0xa4,0x0c,0xb2,0xfe,0xb6,0xa5,0x7b,0x97,0xad,0xa7,0x86,0x8a,0xad,0xd1,0xfe,0xef,0x48,0xa4,0x60,0x85,0x8b,0x3d,0x45,0x99,0xc5,0x01,0x0c,0xd8,0xf5,0x01,0x2f,0xa6,0x8e,0xfc,0x52,0x50,0x48,0x02,0x3e,0x6e,0x7a,0xae,0xd6,0xba,0x9d,0xc5,0xc2,0xff,0xff,0x00,0x5e,0xff,0xe8, -0x04,0xec,0x07,0x62,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x5c,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x36,0x1d,0x1a,0x05,0x19,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0c,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc2,0x00,0x00, -0x00,0x13,0x40,0x0b,0x02,0x09,0x29,0x26,0x10,0x18,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x07,0x62,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xdd,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xad,0x40,0x09,0x14,0x11,0x08,0x00,0x25,0x01,0x13,0x05,0x26, -0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x62,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0x81,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xb1,0x40,0x09,0x10,0x0d,0x06,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x02,0x00,0x5e,0xfe,0x70,0x05,0xaa,0x05,0xb2, -0x00,0x19,0x00,0x25,0x00,0x50,0xb1,0x06,0x04,0xb8,0x01,0x05,0x40,0x0b,0x09,0x20,0x91,0x0e,0x00,0x13,0x1a,0x91,0x14,0x04,0x0e,0xb8,0x01,0x04,0xb5,0x00,0x00,0x02,0x06,0x06,0x02,0xb8,0x01,0x04,0x40,0x0f,0x0c,0x0c,0x19,0x0f,0x19,0x0f,0x11,0x17,0x7d,0x23,0x23,0x27,0x1d,0x7d,0x11,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39, -0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc2,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x33,0xed,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x48,0x80,0x44, -0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x83,0xfe,0xe5,0xfe,0xac,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0xb9,0xfe,0xa7,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x14,0x7e,0x4d,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x6f,0x75,0x11,0x01,0x8d,0x01,0x34,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xba,0xfe,0x6b,0x05,0x16, -0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x02,0x00,0x60,0xfe,0x70,0x04,0x50,0x04,0x18,0x00,0x19,0x00,0x25,0x00,0x4c,0xb1,0x06,0x04,0xb8,0x01,0x05,0x40,0x0b,0x09,0x20,0x95,0x00,0x0e,0x16,0x1a,0x95,0x14,0x10,0x0e,0xb8,0x01,0x04,0xb3,0x00,0x06,0x06,0x02,0xb8,0x01,0x04,0x40,0x0f, -0x0c,0x0c,0x19,0x0f,0x19,0x0f,0x11,0x17,0x83,0x23,0x23,0x27,0x1d,0x83,0x11,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0xd6,0xe1,0x00,0x3f,0xed,0x3f,0x33,0xed,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x02,0x35,0x10,0x00, -0x33,0x32,0x00,0x15,0x14,0x02,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xa2,0x81,0x43,0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x83,0xd0,0xf5,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xe6,0xfe,0xf4,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x14,0x80,0x4b,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x6f,0x75,0x0e,0x01,0x1c,0xe0,0x01,0x02, -0x01,0x22,0xfe,0xe6,0xfa,0xde,0xfe,0xdf,0x03,0x89,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0xff,0xff,0x00,0x5e,0xfe,0x70,0x05,0xaa,0x06,0x8c,0x02,0x26,0x05,0x14,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xd2,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x0a,0x28,0x29,0x11,0x17,0x25,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, -0xff,0xff,0x00,0x60,0xfe,0x70,0x04,0x50,0x05,0x2f,0x02,0x26,0x05,0x15,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x26,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x28,0x29,0x11,0x17,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0a,0xfe,0x1e,0x04,0x83,0x07,0x62,0x02,0x26,0x04,0xe1,0x00,0x00,0x01,0x07, -0x00,0xe0,0x00,0x8b,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xc4,0x40,0x09,0x1c,0x19,0x01,0x14,0x25,0x01,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xdd,0xfe,0x21,0x03,0x68,0x06,0x0c,0x00,0x26,0x05,0x97,0x00,0x00,0x01,0x06,0x00,0xe0,0xf8,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd5,0x40,0x09,0x1c,0x19,0x01, -0x14,0x25,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x02,0x10,0x06,0x0c,0x02,0x26,0x06,0xac,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x78,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0xb5,0x10,0x0d,0x06,0x0c,0x25,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00, -0x09,0xbc,0x05,0x9a,0x00,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0x3d,0x05,0x58,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04,0x9d,0xb4,0x15,0x19,0x01,0x04,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x08,0xf0,0x05,0x9a,0x00,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0x5d,0x05,0x80,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04, -0x4b,0xb4,0x15,0x19,0x01,0x04,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x08,0x06,0x05,0xec,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0x5d,0x04,0x96,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04,0x26,0xb4,0x23,0x27,0x08,0x10,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x68,0x02,0x26,0x00,0x2a, -0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x27,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0xcb,0x1c,0x1a,0x05,0x19,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0a,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x56,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x67,0x28,0x26, -0x10,0x18,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xff,0xe8,0x07,0x79,0x05,0x9a,0x00,0x17,0x00,0x43,0x40,0x25,0x08,0x91,0x40,0x0d,0x0b,0x0a,0x0d,0x91,0x2b,0x30,0x13,0x91,0x03,0x13,0x0a,0x12,0x17,0x0f,0x10,0x0b,0x03,0x0e,0x0d,0x09,0x10,0x7e,0x07,0x07,0x0a,0x17,0x7e,0x16,0x16,0x19, -0x09,0x7e,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x07,0x79,0xe8,0xcd,0xc9,0xda,0xfd,0x43,0xa8, -0xa8,0x02,0xbd,0xa7,0x01,0x05,0x01,0x04,0xa8,0x01,0xac,0xd6,0xee,0xe5,0xd3,0xee,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfc,0x14,0xfe,0xd1,0x01,0x29,0x02,0x58,0x00,0x02,0x00,0xbc,0xfe,0x29,0x05,0x27,0x05,0xb2,0x00,0x0c,0x00,0x15,0x00,0x2e,0x40,0x18,0x05,0x00,0x07,0x02,0x1b,0x0e,0x91,0x00,0x03,0x03,0x14,0x91,0x07,0x04, -0x0a,0x7d,0x11,0x11,0x17,0x0e,0x05,0x01,0x7e,0x02,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x3f,0x11,0x12,0x39,0x31,0x30,0x05,0x11,0x23,0x11,0x33,0x15,0x36,0x21,0x32,0x12,0x15,0x10,0x00,0x01,0x11,0x24,0x00,0x11,0x34,0x26,0x23,0x22,0x01,0x64,0xa8,0xa8,0xeb,0x01,0x1d,0xc2,0xf9,0xfe,0x03,0xfe, -0x3a,0x01,0x61,0x01,0xb2,0xa3,0x88,0xea,0x3a,0xfe,0x63,0x07,0x71,0xe2,0xfa,0xfe,0xf2,0xc7,0xfe,0xbf,0xfd,0xdb,0x03,0x7f,0xfc,0x78,0x91,0x01,0xc9,0x01,0x03,0x8e,0xbd,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x68,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x7d,0x01,0x5e,0x00,0x16,0xb9,0x00,0x01,0xff, -0x93,0x40,0x09,0x16,0x14,0x0a,0x13,0x25,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0a,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xcb,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x90,0x40,0x09,0x15,0x13,0x0a,0x12,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01, -0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x5e,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x1d,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8a,0x40,0x0a,0x16,0x10,0x05,0x00,0x25,0x03,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x00, -0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x07,0x04,0x6e,0x01,0xa1,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xbc,0x40,0x0a,0x26,0x20,0x08,0x14,0x25,0x03,0x02,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xf0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0x00, -0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x00,0x17,0x10,0x05,0x00,0x25,0x02,0x17,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x05,0xbc,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x04,0x2a,0xae,0x28,0x00,0x13,0x40,0x0b,0x02,0x20,0x26,0x20,0x08,0x14,0x25,0x02,0x26,0x11,0x26,0x00,0x2b,0x35, -0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x9e,0x00,0x00,0x03,0xb4,0x07,0x5e,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc1,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8a,0x40,0x0a,0x12,0x0c,0x02,0x0b,0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd, -0x06,0x00,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xbf,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xa2,0x40,0x0a,0x20,0x1a,0x0c,0x12,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x18,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x2a, -0xff,0xd3,0x01,0x84,0x00,0x16,0xb9,0x00,0x01,0xff,0xf3,0x40,0x09,0x12,0x0c,0x02,0x0b,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbc,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x04,0x2a,0xc0,0x28,0x00,0x16,0xb9,0x00,0x02,0xff,0xfa,0x40,0x09,0x20,0x1a,0x0c,0x12,0x25, -0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0x86,0x00,0x00,0x01,0xce,0x07,0x5e,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0xa9,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x0a,0x04,0x02,0x03,0x25,0x02,0x01,0x09,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff, -0xff,0x6e,0x00,0x00,0x01,0xb6,0x06,0x00,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0x91,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x0a,0x04,0x02,0x03,0x25,0x02,0x01,0x09,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xf8,0x00,0x00,0x02,0x28,0x07,0x18,0x02,0x26,0x00,0x2c, -0x00,0x00,0x01,0x07,0x04,0x2a,0xfe,0xb8,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xe6,0x00,0x00,0x02,0x0a,0x05,0xbe,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x04,0x70,0x00,0xf8,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x0b,0x04, -0x02,0x03,0x25,0x01,0x0b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x5e,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x91,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8e,0x40,0x0a,0x1e,0x18,0x03,0x09,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, -0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xe3,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8c,0x40,0x0a,0x1e,0x18,0x03,0x09,0x25,0x03,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x18, -0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0xac,0x01,0x84,0x00,0x13,0x40,0x0b,0x02,0x00,0x1e,0x18,0x03,0x09,0x25,0x02,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xbc,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x2a,0x00,0x28,0x00,0x13,0x40,0x0b,0x02,0x00, -0x1e,0x18,0x03,0x09,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa0,0x00,0x00,0x04,0xc0,0x07,0x5e,0x00,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc3,0x01,0x5e,0x00,0x0a,0xb4,0x03,0x02,0x2d,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x04,0x00,0x00,0x02,0xbc,0x06,0x00,0x02,0x26, -0x00,0x55,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0x27,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x77,0x40,0x0a,0x17,0x11,0x08,0x10,0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x07,0x18,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x04,0x2a,0xff,0xfe,0x01,0x84, -0x00,0x08,0xb3,0x02,0x2e,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x9a,0x00,0x00,0x02,0xca,0x05,0xbc,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x04,0x2a,0xff,0x5a,0x00,0x28,0x00,0x13,0x40,0x0b,0x01,0x00,0x17,0x11,0x08,0x10,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5, -0x07,0x5e,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x54,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x96,0x40,0x0a,0x14,0x0e,0x05,0x0d,0x25,0x02,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x04,0x6e, -0x01,0xd1,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x99,0x40,0x0a,0x18,0x12,0x08,0x11,0x25,0x02,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x18,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0x68,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x14,0x0e, -0x05,0x0d,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xbc,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x04,0x2a,0xeb,0x28,0x00,0x13,0x40,0x0b,0x01,0x0a,0x18,0x12,0x08,0x11,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x10,0xfe,0x21, -0x03,0xcb,0x05,0xb2,0x00,0x24,0x00,0x53,0x40,0x2d,0x1d,0x0c,0x0f,0x09,0x01,0x1f,0x03,0x09,0x0b,0x91,0x40,0x0c,0x17,0x23,0x0c,0x91,0x08,0x30,0x01,0x03,0x91,0x23,0x1b,0x14,0x12,0x91,0x17,0x04,0x1d,0x1a,0x0b,0x0b,0x06,0x01,0x0f,0x7d,0x1a,0x1a,0x20,0x7d,0x06,0x06,0x26,0x14,0x01,0x2f,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1, -0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xfd,0xc6,0x5f,0x5e,0x5d,0x12,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x20,0x00,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x37,0x24,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x04,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x10,0x00,0x21,0x22, -0x10,0x4c,0x66,0x01,0x00,0x01,0x58,0xe4,0xb7,0x5a,0x73,0x71,0x01,0xae,0xc2,0xa7,0xac,0xa2,0x9a,0xbe,0xf6,0x01,0x15,0xfe,0xd7,0xad,0xca,0xfe,0x47,0xfe,0xb4,0x67,0xfe,0x2f,0x9c,0x13,0x01,0x11,0xcf,0xa0,0xca,0x20,0x97,0x19,0x5f,0x01,0x09,0x83,0x9d,0x5a,0xa4,0x4e,0xec,0xc2,0xfe,0xe7,0x72,0x09,0x29,0xf9,0xb0,0xfe,0xf8,0xfe, -0x8b,0x00,0x00,0x01,0x00,0x1e,0xfe,0x21,0x03,0x3e,0x04,0x18,0x00,0x25,0x00,0x51,0x40,0x2d,0x1e,0x0c,0x09,0x40,0x1f,0x22,0x48,0x09,0x0b,0x95,0x40,0x0c,0x18,0x24,0x0c,0x95,0x08,0x30,0x01,0x03,0x95,0x24,0x1c,0x15,0x13,0x95,0x18,0x10,0x1e,0x1b,0x0b,0x0b,0x06,0x01,0x10,0x84,0x1b,0x1b,0x21,0x83,0x06,0x06,0x27,0x01,0x15,0x2f, -0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xfd,0xc6,0x2b,0x12,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x24,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15, -0x16,0x16,0x15,0x14,0x00,0x21,0x22,0x2f,0x42,0x55,0xcb,0x01,0x05,0xa4,0x8c,0x58,0x5e,0x60,0x9e,0xb0,0x93,0x89,0x96,0x8e,0x86,0xb0,0xc7,0xe7,0xe8,0x84,0xa0,0xfe,0xa4,0xfe,0xeb,0x61,0xfe,0x2d,0x91,0x12,0xc8,0x9e,0x7d,0x9a,0x1d,0x8c,0x12,0x1e,0x92,0x62,0x62,0x70,0x52,0x97,0x45,0xbd,0x97,0xc7,0x6d,0x07,0x1e,0xc7,0x8c,0xd9, -0xfe,0xe2,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x07,0x62,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x58,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x0c,0x06,0x0b,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x62,0x02,0x26,0x00,0x4b,0x00,0x00, -0x01,0x07,0x00,0xe0,0x00,0x81,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xb1,0x40,0x09,0x15,0x12,0x0a,0x11,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0xbc,0xfe,0x29,0x05,0x27,0x05,0xb2,0x00,0x12,0x00,0x2a,0x40,0x16,0x0c,0x09,0x0f,0x01,0x1b,0x09,0x12,0x0a,0x03,0x04,0x91,0x0f,0x04,0x00,0x7e,0x01, -0x01,0x14,0x0c,0x08,0x7e,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x11,0x10,0x21,0x22,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x12,0x21,0x32,0x12,0x11,0x05,0x27,0xa8,0xfe,0x9f,0xc0,0xfa,0xa8,0xa8,0x06,0x9e,0x01,0x3e,0xe9,0xf8,0xfe,0x29,0x05,0x0c,0x01,0xe5, -0xfe,0xe6,0xd5,0xfc,0xd5,0x05,0x9a,0xfe,0xfa,0x01,0x1e,0xfe,0xcd,0xfe,0xe3,0x00,0x00,0x02,0x00,0x3e,0xff,0xe8,0x04,0x81,0x05,0x9a,0x00,0x1e,0x00,0x2a,0x00,0x62,0x40,0x36,0x14,0x00,0x1f,0x91,0x40,0x0a,0x04,0x1a,0x0a,0x91,0x08,0x30,0x25,0x91,0x1a,0x13,0x10,0x04,0x03,0x14,0x00,0x12,0x02,0x10,0x7d,0x0f,0x0f,0x0d,0x7e,0x12, -0x12,0x17,0x28,0x04,0x7d,0x8f,0x05,0x01,0x05,0x05,0x07,0x7e,0x02,0x02,0x22,0x1d,0x17,0x7d,0x28,0x28,0x2c,0x22,0x7d,0x1d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x5d,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0xe1,0x11,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39, -0x31,0x30,0x01,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x56,0xcd,0x37,0xac,0x3b,0xa4,0x89,0x8a,0xa6,0x3e,0xae,0x37,0xd1,0x86,0x97,0xfe,0xc8,0xef, -0xf2,0xfe,0xd6,0x02,0x20,0x9e,0xd2,0xd8,0x98,0x9f,0xd4,0xda,0x03,0x60,0x6a,0xde,0x78,0x7a,0x70,0x7a,0x74,0x96,0x96,0x74,0x76,0x74,0x7c,0x76,0xce,0x7a,0x34,0xd6,0x8b,0xd7,0xfe,0xf4,0x01,0x01,0xd9,0x01,0x1e,0x2a,0xaf,0x95,0x95,0xb2,0xb1,0x96,0x95,0xaf,0x00,0x02,0x00,0x48,0xff,0xe8,0x04,0x42,0x05,0xec,0x00,0x1e,0x00,0x2a, -0x00,0x54,0x40,0x2f,0x15,0x00,0x1f,0x95,0x40,0x0b,0x05,0x1a,0x0b,0x95,0x08,0x30,0x25,0x95,0x1a,0x16,0x11,0x05,0x00,0x11,0x84,0x10,0x10,0x01,0x10,0x10,0x0e,0x84,0x13,0x13,0x17,0x83,0x28,0x28,0x2c,0x1d,0x05,0x84,0x06,0x06,0x08,0x84,0x03,0x03,0x22,0x83,0x1d,0x2f,0xe1,0x39,0x2f,0xf1,0xc2,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1, -0x39,0x2f,0xf1,0xc2,0x2f,0x71,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x04,0x11,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34, -0x26,0x01,0x52,0x5f,0x6e,0x2b,0xa0,0x27,0x98,0x85,0x85,0x95,0x26,0x9f,0x2b,0xcc,0x01,0x0a,0xfe,0xd7,0xdb,0xdf,0xfe,0xe9,0x01,0xfe,0x92,0xc4,0xc8,0x8c,0x91,0xc5,0xc8,0x03,0x74,0x30,0xc6,0x7c,0x80,0x86,0x78,0x84,0x8e,0xae,0xaf,0x8d,0x84,0x78,0x86,0x80,0xf5,0x7d,0x7e,0xfe,0xdb,0xd7,0xfe,0xee,0x01,0x0b,0xda,0x01,0x26,0x36, -0xbd,0x9d,0x9c,0xc1,0xc0,0x9d,0x99,0xc1,0x00,0x01,0x00,0x21,0xff,0x0c,0x04,0x7b,0x05,0x9a,0x00,0x11,0x00,0x30,0x40,0x18,0x01,0x07,0x0d,0x91,0x06,0x12,0x0c,0x08,0x91,0x0a,0x03,0x08,0x0c,0x10,0x01,0x01,0x03,0x7e,0x10,0x10,0x13,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc4,0x32,0x00,0x3f,0xed,0x39, -0x3f,0xed,0x39,0x2f,0x31,0x30,0x05,0x23,0x36,0x35,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x04,0x5a,0xa4,0x27,0x91,0xfc,0xd5,0x03,0x41,0xfd,0x02,0x04,0x00,0xfc,0xb8,0x02,0x3c,0x01,0x23,0xf4,0x46,0x3c,0x72,0x2f,0x04,0xd3,0x98,0x28,0xfb,0x26,0xfc,0x47,0x00,0x01,0x00,0x21,0xff,0x1e,0x03,0x9e, -0x04,0x00,0x00,0x11,0x00,0x33,0x40,0x1b,0x01,0x07,0x0d,0x95,0x06,0x15,0x0c,0x08,0x95,0x0a,0x0f,0x08,0x0c,0x10,0x01,0xa0,0x03,0xb0,0x03,0x02,0x03,0x10,0x10,0x13,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xdd,0x5d,0xc6,0x10,0xc4,0x32,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2f,0x31,0x30,0x05,0x23,0x36,0x35,0x34,0x23,0x21, -0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x03,0x7f,0x95,0x22,0x85,0xfd,0x9a,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x01,0x80,0x01,0x0c,0xe2,0x40,0x38,0x6a,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0xe8,0x41,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xea,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xdb, -0x01,0xc7,0x01,0x65,0x00,0x13,0x40,0x0b,0x02,0x00,0x13,0x19,0x05,0x00,0x25,0x02,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x05,0x85,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x07,0x00,0xdb,0x01,0x38,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x20,0x23,0x29,0x08,0x14,0x25,0x02,0x20,0x11, -0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xa3,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x05,0x51,0x00,0xb0,0x01,0x69,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x03,0x2b,0x25,0x03,0x09,0x25,0x04,0x03,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff, -0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x3a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x60,0x00,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x00,0x2b,0x25,0x03,0x09,0x25,0x04,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xb7,0x02,0x26,0x00,0x32, -0x00,0x00,0x01,0x07,0x05,0x55,0x00,0xaa,0x01,0x62,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x22,0x18,0x03,0x09,0x25,0x03,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x55,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x64,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02, -0x0b,0x22,0x18,0x03,0x09,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xea,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x36,0x01,0x65,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x21,0x03,0x09,0x25,0x02,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b, -0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x85,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8a,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x21,0x03,0x09,0x25,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x9a,0x02,0x26,0x00,0x32,0x00,0x00, -0x01,0x07,0x05,0x52,0x00,0xfe,0x01,0x65,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1a,0x1b,0x03,0x09,0x25,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x35,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x63,0x52,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1a, -0x1b,0x03,0x09,0x25,0x03,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0x8c,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfb,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, -0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x2f,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xb4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x17,0x18,0x0c,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x03,0x01,0x33,0x04,0xc2,0x03,0x7b,0x06,0x3a,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x32, -0xb2,0x02,0xe2,0x01,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x01,0x04,0x0a,0x16,0xc1,0x10,0x00,0x01,0x00,0x01,0x13,0x0d,0xc0,0x07,0x13,0xc0,0x07,0x19,0x2f,0xc6,0xe1,0x10,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xfd,0x39,0x39,0xde,0x2b,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x56,0xfe,0x04,0x01,0xfc,0x3e,0x28,0x3a,0x39,0x27,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x05,0xcd,0x6d,0xfe,0x88,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x02,0x01,0x08,0x04,0xc2, -0x03,0x04,0x06,0x35,0x00,0x03,0x00,0x0f,0x00,0x25,0xb2,0x02,0xe2,0x01,0xb8,0xff,0xc0,0x40,0x0e,0x09,0x0c,0x48,0x01,0x0a,0xc1,0x04,0x01,0x01,0x0d,0x00,0x0d,0xc0,0x07,0x2f,0xe1,0xc4,0x10,0xc0,0x2f,0x00,0x2f,0xfd,0xde,0x2b,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03, -0x04,0xfe,0x04,0x01,0xfc,0xfe,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x05,0xc8,0x6d,0xfe,0x8d,0x39,0x2a,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x64,0x06,0xfa,0x00,0x06,0x00,0x12,0x00,0x1e,0x00,0x37,0xb4,0x05,0x00,0x03,0x80,0x01,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x01,0x07,0x0d,0x19,0xc1,0x13, -0x00,0x03,0x00,0x03,0x16,0x10,0xc0,0x0a,0x16,0xc0,0x0a,0x1c,0x2f,0xc6,0xe1,0x10,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xfd,0x39,0x39,0xd6,0x2b,0x1a,0xcd,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x03,0x5a,0xd5,0x85,0xd7,0x73,0xa4,0xa4,0x1e,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xfa,0xfe,0xb6,0x01,0x4a,0xe6,0xe6,0xfd,0xc8,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x77,0x06,0xe2, -0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x35,0xb2,0x00,0x80,0x01,0xb8,0xff,0xc0,0x40,0x16,0x09,0x0c,0x48,0x01,0x04,0x0a,0x16,0xc1,0x40,0x10,0x00,0x80,0x02,0x02,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x07,0x19,0x2f,0xc6,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0x39,0x39,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x01,0x23, -0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x77,0xfe,0xf9,0x7e,0xdf,0x31,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xe2,0xfe,0xb8,0x01,0x48,0xfd,0xe0,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a, -0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x02,0x01,0x23,0x04,0xb2,0x03,0xa4,0x06,0x55,0x00,0x13,0x00,0x17,0x00,0x3c,0x40,0x17,0x14,0x15,0x14,0x15,0x0a,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x17,0xe2,0x14,0x40,0x0d,0x12,0x48,0x14,0x13,0x07,0xda,0x0d,0xb8,0xff,0xc0,0xb7,0x09,0x0c,0x48,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6, -0xfd,0xdc,0x2b,0xed,0xd6,0xd6,0x2b,0xed,0x01,0x2f,0xe1,0xd4,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x37,0x21,0x35,0x21,0x03,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x1a,0xfe,0x04, -0x01,0xfc,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x36,0x6d,0x00,0x02,0x00,0x90,0xff,0xe8,0x03,0xb8,0x04,0x18,0x00,0x15,0x00,0x20,0x00,0x46,0xb9,0x00,0x04,0xff,0xc0,0x40,0x23,0x09,0x0c,0x48,0x04,0x04,0x02,0x0d,0x10,0x16,0x96,0x00,0x00,0x1d,0x02,0x95,0x08,0x16,0x0b,0x0f,0x1d,0x95,0x10,0x10,0x04,0x04, -0x13,0x83,0x1a,0x1a,0x22,0x16,0x0c,0x00,0x84,0x0b,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x12,0x39,0x11,0x33,0x2f,0x2b,0x31,0x30,0x01,0x10,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x25,0x37,0x36,0x36, -0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x31,0xd5,0xba,0x94,0x37,0xcb,0x5a,0xfe,0x98,0xa3,0x05,0x6a,0xd0,0x99,0xad,0xfe,0xae,0xfe,0xcb,0xfa,0x6e,0x77,0x6a,0x5a,0x7c,0x9f,0x01,0x77,0xfe,0xfb,0x7e,0xa8,0x27,0x39,0x01,0x7e,0x02,0x9a,0xa0,0xb8,0xa2,0x86,0xfe,0xe1,0x2f,0x58,0x22,0x0f,0x51,0x68,0x4c,0x5e,0xad,0x81,0x00,0x02, -0x00,0x60,0xff,0xe8,0x04,0x10,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x49,0x40,0x18,0x02,0x1b,0x95,0x05,0x16,0x01,0x15,0x0e,0x15,0x95,0x0b,0x10,0x0f,0x0f,0x11,0x0d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0x40,0x13,0x0c,0x06,0x4d,0x01,0x01,0x1f,0x18,0x08,0x0c,0x06,0x4d,0x18,0x83,0x08,0x0e,0x0c,0x06,0x4d,0x08, -0x2f,0x2b,0xe9,0x2b,0x12,0x39,0x2f,0x2b,0xe9,0x2b,0x33,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5, -0xd3,0x60,0x04,0xa4,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfd,0xcf,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x49,0x40,0x16,0x03,0x15,0x01,0x15,0x95,0x0f,0x16,0x07,0x1b,0x95,0x09,0x10, -0x04,0x0f,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xec,0x40,0x15,0x0c,0x06,0x4d,0x18,0x18,0x1f,0x06,0x02,0x12,0x06,0x0c,0x06,0x4d,0x12,0x84,0x03,0x02,0x0c,0x06,0x4d,0x03,0x2f,0x2b,0xe9,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0xe9,0x2b,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x31,0x30,0x25,0x23,0x15,0x23,0x11, -0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0x6c,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0x94,0x04,0x00,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f, -0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x56,0x06,0x02,0x00,0x1a,0x00,0x27,0x00,0x38,0x40,0x1e,0x10,0x01,0x13,0x1f,0x95,0x19,0x16,0x03,0x15,0x25,0x95,0x13,0x10,0x0a,0x0c,0x95,0x07,0x01,0x0a,0x0a,0x16,0x83,0x22,0x22,0x29,0x10,0x02,0x1c,0x83,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f, -0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x50,0x04,0xa6,0xfd,0xdc,0x8a,0x7e,0x84,0x88, -0x87,0xa8,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xca,0x6d,0xa5,0x7f,0x95,0xab,0x9f,0x88,0x8f,0xae,0x94,0x94,0x03,0xdd,0x01,0x14,0x01,0x11,0x37,0x98,0x44,0xa5,0xf3,0x93,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe5,0xca,0xaa,0xc3,0xc7,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x04,0x18,0x00,0x15, -0x00,0x26,0x40,0x14,0x30,0x01,0x01,0x01,0x03,0x95,0x14,0x16,0x0b,0x09,0x95,0x0e,0x10,0x11,0x83,0x06,0x06,0x17,0x0b,0x00,0x2f,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x5c,0x78, -0x84,0x99,0xc1,0xbd,0x9f,0x83,0x79,0x78,0x9e,0xdb,0x01,0x0f,0xfe,0xe7,0xed,0x8c,0x21,0xa5,0x54,0xdc,0xb8,0xb4,0xd4,0x54,0x9b,0x43,0xfe,0xe3,0xe5,0xfe,0xfe,0xd0,0x00,0x02,0x00,0x60,0xff,0x70,0x03,0xa0,0x04,0x18,0x00,0x1d,0x00,0x26,0x00,0x57,0x40,0x1e,0x14,0x12,0x20,0x0f,0x05,0x00,0x1c,0x0a,0x03,0x16,0x96,0x25,0x20,0x96, -0x1c,0x16,0x0d,0x0f,0x95,0x0a,0x10,0x1e,0x14,0x23,0x12,0x00,0x05,0x19,0x07,0x02,0xb8,0x01,0x03,0x40,0x0c,0x03,0x07,0x0d,0x0d,0x19,0x84,0x23,0x23,0x28,0x12,0x83,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xd4,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xd6,0xed,0x2f,0x11,0x12,0x39, -0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x25,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x01,0x68,0x1c,0x06,0x8c,0x0d,0x31,0x98,0x01,0x22,0xf2,0x87,0x67,0x72,0x82,0x9d,0xc9,0x46, -0x8a,0xbc,0x76,0x96,0xbc,0x9a,0x7c,0x24,0x4c,0x60,0x55,0x63,0x7e,0x88,0x18,0x50,0x58,0x86,0x70,0x90,0xf2,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0x9c,0x64,0xb4,0x79,0x5c,0x66,0x87,0xb4,0x30,0x37,0x2e,0x56,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x21,0x05,0xec,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x19,0x17,0x95,0x02, -0x1c,0x12,0x06,0x0f,0x24,0x95,0x09,0x16,0x1e,0x95,0x0f,0x10,0x14,0x00,0x19,0x19,0x15,0x84,0x1a,0x12,0x06,0x06,0x28,0x21,0x83,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x10, -0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x41,0x42,0x92,0xa0,0x04,0x72,0xee,0xc2,0xe6,0x01,0x04,0xd6,0xcc,0x62,0x04,0xa4,0xa0,0x3c,0x35,0xfe,0x4b,0xa2,0x80,0x99,0xa9,0xa4,0x89,0x8a,0xad,0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x48,0xcc, -0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xf9,0x86,0xc8,0x1a,0x03,0x13,0x87,0x7f,0xb1,0xe0,0xc2,0xac,0xce,0xcb,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x21,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x13,0x07,0x10,0x24,0x95,0x0a,0x16,0x05,0x15,0x1e,0x95,0x10,0x10,0x00,0x02,0x95,0x17,0x01,0x00,0x00,0x05,0x84, -0x1a,0x13,0x06,0x06,0x28,0x21,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22, -0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xa4,0x04,0x72,0xee,0xc2,0xe6,0x01,0x04,0xd6,0xcc,0x62,0x04,0xb4,0x8a,0x48,0x2f,0xfe,0x4b,0xa2,0x80,0x99,0xa9,0xa4,0x89,0x8a,0xad,0x05,0x5c,0x1b,0xcf,0xfb,0x58,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x01,0x42,0x99,0xb7,0x12,0xfb,0xe7,0x87,0x7f,0xb1, -0xe0,0xc2,0xac,0xce,0xcb,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x18,0x00,0x4b,0xb9,0x00,0x01,0xff,0xc0,0x40,0x1f,0x0b,0x0e,0x48,0x01,0x01,0x03,0x07,0x95,0x40,0x18,0x0b,0x11,0x18,0x95,0x08,0x30,0x03,0x95,0x11,0x16,0x15,0x95,0x0b,0x10,0x0e,0x83,0x13,0x06,0x06,0x1a,0x01,0xb8,0xff,0xc0,0xb6, -0x0e,0x12,0x48,0x01,0x18,0x83,0x07,0x2f,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x34,0x12,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x01,0x02,0x23,0x22,0x06,0x07,0x9a,0x9a,0xb4,0x97,0xa7,0x03, -0xfd,0x29,0xeb,0xcd,0xcd,0xf8,0xfe,0xfb,0xd8,0xc2,0x01,0xf3,0x28,0xfb,0x7a,0x8a,0x02,0x42,0xa2,0x72,0xbd,0xa8,0x56,0xe0,0x01,0x0b,0xfe,0xe3,0xfb,0xf7,0xfe,0xdf,0x02,0x7a,0x01,0x2c,0xa1,0x8b,0x00,0x02,0x00,0x50,0xff,0xe8,0x05,0x16,0x04,0x18,0x00,0x1d,0x00,0x26,0x00,0x77,0x40,0x14,0x05,0x05,0x06,0x1e,0x1e,0x26,0x1f,0x04, -0x1f,0x17,0x17,0x16,0x0e,0x0e,0x0f,0x0d,0x18,0x0d,0x1d,0x02,0xb8,0x01,0x04,0x40,0x2c,0x1b,0x1e,0x05,0x1f,0x04,0x18,0x04,0x0d,0x18,0x1f,0x04,0x15,0x22,0x95,0x0a,0x16,0x12,0x40,0x09,0x0e,0x48,0x12,0x10,0x95,0x15,0x10,0x1e,0x0e,0x25,0x17,0x05,0x07,0x12,0x00,0x00,0x07,0x83,0x25,0x25,0x28,0x12,0x1f,0x83,0x0d,0x2f,0xe1,0xc6, -0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xed,0x12,0x17,0x39,0x2f,0x11,0x12,0x39,0x39,0xd6,0xed,0xc6,0x31,0x30,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x06,0x23,0x22,0x27,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x26,0x27,0x01,0x26,0x23,0x22,0x07, -0x35,0x36,0x33,0x32,0x17,0x37,0x17,0x16,0x33,0x32,0x37,0x05,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x05,0x16,0x38,0x34,0x88,0x3c,0x3e,0x23,0xfe,0xf5,0xcc,0xbe,0xd9,0x0d,0x02,0x85,0x5b,0xa9,0xa4,0x99,0x9e,0xbe,0xf0,0x86,0xc3,0x21,0x22,0x4c,0x30,0x2e,0xfd,0xfc,0xfd,0xe8,0x0a,0x8b,0x6b,0x8f,0x9c,0x02,0x98,0x1f,0x8d,0x22, -0x61,0x7f,0xf4,0xfe,0xd8,0xee,0xdc,0x01,0x60,0x7c,0x72,0x9a,0x62,0xb8,0x68,0x68,0x6a,0x22,0x84,0xfe,0xda,0x6c,0x90,0xd4,0xb8,0x56,0x00,0x01,0x00,0x60,0xff,0xe8,0x02,0xf4,0x04,0x18,0x00,0x22,0x00,0x45,0x40,0x25,0x07,0x1a,0x95,0x40,0x19,0x0d,0x02,0x19,0x95,0x0c,0x30,0x22,0x20,0x95,0x02,0x16,0x10,0x12,0x95,0x0d,0x10,0x07, -0x05,0x1a,0x1a,0x1d,0x10,0x00,0x00,0x24,0x05,0x15,0x83,0x0a,0x1d,0x83,0x05,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23, -0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x02,0xf4,0x72,0x98,0xba,0xd0,0xde,0xbb,0xc9,0xa4,0x82,0x67,0x6d,0x7c,0x5a,0x6d,0x8c,0x78,0x50,0x52,0xfe,0xdd,0x80,0x72,0x86,0x74,0x1a,0x32,0xa1,0x87,0xcf,0x37,0x04,0x40,0xa8,0x7d,0x99,0x2e,0x9a,0x3e,0x51,0x43,0x4c,0x58,0x8e,0xac,0x4e,0x5c, -0x3e,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x02,0xee,0x04,0x18,0x00,0x21,0x00,0x4d,0x40,0x2a,0x1b,0x09,0x95,0x40,0x0a,0x15,0x20,0x0a,0x95,0x0c,0x30,0x70,0x01,0x01,0x01,0x03,0x95,0x20,0x16,0x12,0x10,0x95,0x15,0x10,0x1b,0x1d,0x09,0x0e,0x83,0x18,0x18,0x1d,0x09,0x09,0x00,0x1d,0x83,0x06,0x06,0x23,0x12,0x00,0x2f,0xc4,0x12,0x39, -0x2f,0xe1,0x12,0x39,0x2f,0x10,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x5a, -0x72,0x8e,0x6f,0x7d,0xfe,0xdf,0x54,0x50,0x79,0x8b,0xc9,0x76,0x72,0x73,0x81,0xa2,0xc1,0xb9,0xdc,0xdb,0xbb,0x8c,0x1a,0x9a,0x42,0x5f,0x4b,0xac,0x8e,0x59,0x4b,0x94,0x3c,0x98,0x2e,0x97,0x7b,0xa5,0x45,0x04,0x33,0xcb,0x88,0xaa,0x00,0x01,0x00,0x5a,0xff,0xe8,0x04,0x35,0x04,0x18,0x00,0x2c,0x00,0x72,0x40,0x3d,0x04,0x05,0x27,0x08, -0x2c,0x02,0x96,0x2a,0x26,0x19,0x27,0x27,0x24,0x08,0x08,0x18,0x95,0x40,0x19,0x24,0x0d,0x19,0x95,0x0c,0x30,0x70,0x10,0x01,0x10,0x12,0x95,0x0d,0x16,0x21,0x1f,0x95,0x24,0x10,0x27,0x04,0x26,0x00,0x00,0x0a,0x08,0x0a,0x18,0x18,0x15,0x0f,0x1d,0x84,0x26,0x26,0x0a,0x83,0x15,0x15,0x2e,0x21,0x0f,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0, -0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x10,0xc2,0x2f,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x11,0x12,0x39,0x2f,0x12,0x39,0xd6,0xed,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x07,0x06,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32, -0x36,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x37,0x17,0x16,0x33,0x32,0x37,0x04,0x35,0x39,0x2f,0x7a,0x3d,0x54,0x54,0x5c,0xdc,0xdb,0xbb,0x8c,0x72,0x72,0x8e,0x6f,0x7d,0xfe,0xdf,0x54,0x52,0x73,0x8f,0xc9,0x76,0x72,0x73,0x81,0x01,0x1d,0x3d,0x86,0x20,0x27,0x4e,0x2a,0x2e,0x02, -0x98,0x1f,0x79,0x56,0x56,0x2a,0x04,0x34,0xca,0x88,0xaa,0x32,0x9a,0x42,0x5f,0x4b,0xac,0x8e,0x5d,0x49,0x92,0x3c,0x98,0x2e,0xdc,0x8c,0x5e,0x74,0x22,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x0c,0x04,0x18,0x00,0x10,0x00,0x23,0x00,0x44,0x40,0x25,0x01,0x11,0x95,0x40,0x12,0x0c,0x06,0x12,0x95,0x0c,0x30,0x1e,0x95,0x06,0x16,0x18, -0x95,0x0c,0x10,0x01,0x03,0x11,0x11,0x21,0x1b,0x15,0x84,0x0f,0x0f,0x03,0x83,0x21,0x21,0x25,0x1b,0x83,0x09,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32, -0x16,0x15,0x14,0x05,0x35,0x33,0x32,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x3a,0xd2,0xe8,0xc2,0xee,0xfe,0xec,0x01,0x26,0xee,0xa8,0xd2,0xfe,0x24,0x44,0xf4,0x7a,0x62,0xa4,0xc2,0xc2,0xa0,0x74,0x86,0xfe,0xf6,0x02,0x1c,0x04,0x30,0xca,0x87,0xaf,0x01,0x1a,0xf0,0xfc,0x01,0x2a,0x9b,0x7b, -0xa2,0x98,0x8e,0xa0,0x43,0x55,0xd5,0xbf,0xb6,0xd2,0x60,0x4a,0xac,0x00,0x00,0x01,0xff,0x81,0xfe,0x1e,0x02,0x1c,0x04,0x00,0x00,0x14,0x00,0x4b,0x40,0x29,0x13,0x01,0x0d,0x95,0x40,0x10,0x11,0x05,0x10,0x95,0x08,0x30,0x08,0x0a,0x95,0x40,0x05,0x1c,0x11,0x0f,0x08,0x0c,0x13,0x10,0x0c,0x00,0x0e,0x02,0x0e,0x0c,0x42,0x0e,0x02,0x84, -0x0c,0x15,0x16,0x0c,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xc6,0x2b,0x01,0x10,0xe2,0x12,0x39,0x39,0x18,0x10,0xc6,0x00,0x3f,0x3f,0x1a,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x02,0x1c,0xae,0xc3, -0xad,0x48,0x35,0x3d,0x42,0xcb,0xaf,0xaf,0xa3,0xae,0x01,0xdb,0xfe,0x04,0xd6,0xeb,0x1a,0x99,0x27,0x01,0x31,0x02,0x00,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x21,0x06,0x02,0x00,0x21,0x00,0x2e,0x00,0x4a,0xb9,0x00,0x0a,0xff,0xc0,0x40,0x26,0x0b,0x0f,0x48,0x0a,0x0a,0x0c,0x95,0x07,0x1c,0x1b,0x0f,0x18,0x2c, -0x95,0x12,0x16,0x26,0x95,0x18,0x10,0x00,0x02,0x95,0x1f,0x01,0x00,0x00,0x05,0x84,0x22,0x1b,0x0f,0x0f,0x30,0x0a,0x29,0x83,0x15,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x32,0x2f,0x2b,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x10,0x21,0x22,0x27, -0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xfd,0xe4,0xbe,0x8e,0xad,0x9d,0x01,0x7a,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xb4,0x8a,0x48,0x2f, -0xfe,0x4b,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x05,0x5c,0x1b,0xcf,0xfb,0xaa,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x11,0xe6,0x01,0x05,0x01,0x34,0xa6,0x01,0x40,0x99,0xb7,0x12,0xfb,0xdf,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x04,0x18,0x02,0x06,0x00,0x4a,0x00,0x00, -0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xcd,0x04,0x18,0x00,0x19,0x00,0x41,0x40,0x23,0x17,0x95,0x40,0x18,0x08,0x02,0x18,0x95,0x08,0x30,0x15,0x00,0x13,0x95,0x02,0x16,0x0b,0x0d,0x95,0x08,0x10,0x17,0x17,0x15,0x10,0x0b,0x0b,0x00,0x84,0x15,0x15,0x1b,0x10,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x00, -0x3f,0xfd,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x03,0xcd,0xaf,0xb8,0xec,0xfe,0xe6,0x01,0x38,0xf6,0x9a,0x82,0x82,0xa3,0xa9,0xd4,0xc5,0xa7,0x6e,0x4b,0xdf,0x01,0x7f, -0x3e,0x56,0x01,0x18,0xf0,0xf1,0x01,0x37,0x30,0x9c,0x42,0xe0,0xb4,0xb8,0xd0,0x26,0x01,0x04,0x8b,0x00,0x00,0x02,0x00,0x0e,0xfe,0x52,0x03,0xc6,0x04,0x00,0x00,0x11,0x00,0x19,0x00,0x16,0x40,0x0a,0x16,0x95,0x07,0x00,0x0f,0x0e,0x0f,0x00,0x1b,0x0e,0x2f,0x10,0xc6,0x00,0x3f,0x3f,0x2f,0xed,0x31,0x30,0x01,0x01,0x17,0x16,0x15,0x14, -0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x01,0x33,0x09,0x02,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x03,0xc6,0xfe,0x78,0x22,0x5e,0x7c,0x63,0x5f,0x78,0x62,0x22,0xfe,0x82,0xb2,0x01,0x26,0x01,0x2e,0xfe,0xd0,0x40,0x40,0x41,0x04,0x00,0xfc,0xa0,0x44,0xbc,0x68,0x63,0x83,0x83,0x63,0x5a,0xca,0x44,0x03,0x60,0xfd,0x42,0x02,0xbe,0xfc, -0x10,0x8b,0x49,0x63,0x63,0x40,0x00,0x02,0x00,0x0a,0xff,0xe8,0x03,0x9e,0x04,0x18,0x00,0x1b,0x00,0x23,0x00,0x2a,0x40,0x17,0x20,0x95,0x09,0x16,0x00,0x12,0x19,0x02,0x10,0x95,0x15,0x10,0x0c,0x1e,0x22,0x06,0x0e,0x04,0x06,0x12,0x00,0x25,0x12,0x2f,0x10,0xc6,0x11,0x17,0x39,0x00,0x3f,0xfd,0x39,0x39,0xd6,0xc4,0x3f,0xed,0x31,0x30, -0x01,0x26,0x23,0x22,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x17,0x01,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x03,0x9e,0x46,0x33,0x75,0x7d,0x95,0x85,0x74,0x6f,0x7e,0x92,0x82,0x73,0x3f,0x36,0x40,0x4a,0x9e,0xa3,0xa5,0x9e,0x48,0x3e,0xfe,0x37,0x58,0x58, -0x58,0x03,0x60,0x2e,0xbf,0xef,0xca,0x88,0xa6,0xa4,0x86,0xd2,0xeb,0xbf,0x2c,0x96,0x20,0xce,0xce,0x20,0xfe,0x60,0xa3,0x97,0xac,0xac,0x92,0x00,0x00,0x01,0x00,0x90,0xfe,0x29,0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0x27,0x40,0x14,0x00,0x1b,0x11,0x02,0x08,0x0c,0x95,0x05,0x16,0x08,0x0f,0x11,0x84,0x02,0x10,0x10,0x13,0x09,0x84,0x08, -0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x78,0xda,0xfe,0xa8,0xa3,0xeb,0x7a,0xa6,0xa4,0xfe,0x29,0x02,0x81,0xc2,0x01,0xa1,0x02,0x77,0xfd,0xb2,0xfe,0xc0,0xbb,0x8f,0x02, -0x44,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x1b,0x00,0x32,0x40,0x1a,0x16,0x00,0x19,0x09,0x15,0x04,0x95,0x19,0x10,0x10,0x12,0x95,0x0d,0x01,0x10,0x10,0x16,0x00,0x84,0x01,0x01,0x1d,0x16,0x08,0x84,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x12,0x39,0x39, -0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xfc,0xdb,0x8a,0x7e,0x84,0x88,0x87,0xa8,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x03,0xdd,0x01,0x14,0x01,0x11, -0x37,0x98,0x44,0xa5,0xf3,0x89,0xc2,0xfe,0x5f,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x03,0xf8,0x06,0x02,0x00,0x24,0x00,0x40,0x40,0x22,0x06,0x08,0x95,0x03,0x1c,0x1f,0x22,0x12,0x15,0x0d,0x95,0x22,0x10,0x19,0x1b,0x95,0x16,0x01,0x19,0x19,0x1f,0x00,0x06,0x06,0x11,0x00,0x84,0x0a,0x0a,0x26,0x1f,0x11,0x84,0x12,0x2f,0xe1,0x32,0x12, -0x39,0x2f,0xe1,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xbf, -0xad,0x4c,0x36,0x3e,0x44,0xc8,0xee,0x78,0xa4,0xa4,0xfc,0xdb,0x8a,0x7e,0x84,0x88,0x87,0xa8,0x04,0x76,0xda,0x01,0x5a,0x04,0xe6,0xf8,0x1a,0x99,0x27,0x01,0x3e,0x02,0x66,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x03,0xdd,0x01,0x14,0x01,0x11,0x37,0x98,0x44,0xa5,0xf3,0x89,0xc2,0xfe,0x5f,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x0e,0x05,0xd9, -0x00,0x0b,0x00,0x17,0x00,0x52,0x40,0x2f,0x16,0x0d,0x10,0x95,0x40,0x13,0x14,0x0f,0x13,0x95,0x0c,0x30,0x0f,0x15,0x06,0x63,0x40,0x00,0x14,0x0f,0x09,0x62,0x03,0x0f,0x0e,0x03,0x62,0xff,0x30,0x0c,0x0e,0x0e,0x0f,0x11,0x42,0x11,0x16,0x13,0x0e,0x84,0x0f,0x18,0x19,0x0f,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x2b, -0x01,0x10,0xe2,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0xd6,0x1a,0xed,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x01,0x10,0x2c,0x40,0x40,0x2c,0x2e,0x3d,0x3d,0xd0,0xb0,0xa4,0xb0,0xb0,0xa4,0xb0, -0x05,0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xfc,0xd7,0xfe,0x25,0x01,0xdb,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x00,0x01,0x00,0x94,0xff,0xea,0x02,0x2f,0x04,0x00,0x00,0x0b,0x00,0x19,0x40,0x0c,0x0b,0x09,0x95,0x02,0x16,0x05,0x0f,0x0b,0x0b,0x06,0x84,0x05,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x25,0x06,0x23, -0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x2f,0x39,0x5c,0xfe,0xfa,0xa4,0x90,0x3c,0x2b,0x08,0x1e,0x01,0x28,0x02,0xee,0xfd,0x2f,0xbb,0x20,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x02,0x44,0x04,0x00,0x00,0x0b,0x00,0x33,0x40,0x1b,0x0a,0x02,0x95,0x01,0x15,0x09,0x05,0x95,0x06,0x0f,0x08,0x05,0x02,0x0b,0x0b,0x0a,0x02,0x40, -0x0a,0x84,0x03,0x0c,0x0d,0x03,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x1a,0x18,0xcd,0x10,0xc1,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x02,0x44,0xfe,0x08,0xaa,0xaa,0x01,0xf8,0xaa,0xaa,0x8c,0x02,0xe8,0x8c,0x8c,0xfd,0x18,0x00,0x01,0xff,0xec, -0x00,0x00,0x02,0x52,0x05,0xec,0x00,0x17,0x00,0x5c,0x40,0x33,0x13,0x10,0x15,0x0e,0x07,0x04,0x09,0x15,0x95,0x02,0x0c,0x91,0x0b,0x09,0x00,0x91,0x17,0x09,0x95,0x40,0x0e,0x11,0x06,0x0e,0x95,0x08,0x30,0x06,0x15,0x11,0x00,0x00,0x00,0x01,0x0e,0x03,0x00,0x00,0x05,0x0b,0x12,0x11,0x05,0x84,0x06,0x18,0x19,0x06,0x84,0x08,0x30,0x2b, -0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x10,0xc2,0x2f,0x5f,0x5e,0x5d,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0xd4,0xed,0x10,0xd6,0xed,0xd4,0xed,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x16,0x33,0x32,0x37,0x02,0x52, -0x44,0x58,0x23,0x29,0xa4,0x2e,0x17,0x4d,0x48,0x46,0x55,0x1d,0x22,0xa4,0x2e,0x24,0x4e,0x48,0x02,0xd9,0x39,0x0a,0xfd,0x56,0x02,0xd9,0x0d,0x46,0x95,0x3b,0x08,0x02,0x84,0xfd,0x4c,0x0d,0x45,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x02,0xee,0x05,0xec,0x00,0x11,0x00,0x19,0x00,0x4a,0x40,0x29,0x0d,0x12,0x15,0x96,0x40,0x0b,0x12,0x80, -0x12,0x04,0x01,0x95,0x40,0x10,0x0e,0x03,0x10,0x95,0x08,0x30,0x03,0x15,0x0e,0x00,0x00,0x00,0x0d,0x10,0x12,0x03,0x02,0x84,0x0f,0x03,0x01,0x03,0x03,0x1b,0x17,0x84,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xf1,0x17,0x39,0xc2,0x2f,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x1a,0x10,0xdc,0x1a,0xed,0x12,0x39,0x31,0x30, -0x01,0x21,0x11,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x21,0x21,0x26,0x26,0x23,0x22,0x15,0x14,0x33,0x02,0xee,0xff,0x00,0xa4,0x42,0x88,0x94,0x75,0x59,0x56,0x3a,0xa4,0x01,0x00,0xfe,0x5c,0x04,0x49,0x32,0x4c,0x8b,0x02,0x87,0xfd,0x79,0x02,0x87,0x74,0x67,0x55,0x78,0x3b,0x01,0xf8,0xfd,0x26,0x44, -0x5c,0x4a,0x56,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x02,0x5a,0x05,0xec,0x00,0x0c,0x00,0x24,0x40,0x13,0x0c,0x0a,0x95,0x40,0x02,0x1c,0x06,0x00,0x0c,0x0c,0x08,0x84,0x05,0x0d,0x0e,0x05,0x84,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc2,0x18,0x2f,0x00,0x3f,0x3f,0x1a,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14, -0x33,0x32,0x37,0x02,0x5a,0x40,0x43,0x93,0x9e,0xa4,0xa0,0x3c,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x06,0x80,0xf9,0x86,0xc8,0x1a,0x00,0x01,0x00,0xa6,0xfe,0x21,0x04,0xb2,0x05,0xec,0x00,0x1c,0x00,0x57,0x40,0x30,0x0b,0x0a,0x96,0x40,0x15,0x12,0x1b,0x15,0x96,0x08,0x30,0x10,0x01,0x01,0x01,0x03,0x95,0x1b,0x1c,0x0f,0x15,0x14,0x0c,0x95, -0x12,0x0f,0x10,0x00,0x15,0x0b,0x0b,0x06,0x01,0x01,0x0e,0x0f,0x0c,0x14,0x14,0x18,0x83,0x06,0x06,0x1e,0x12,0x0e,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x11,0x39,0x2f,0x33,0x00,0x3f,0x3f,0xed,0x39,0x3f,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x16, -0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x01,0x27,0xa5,0xb1,0xae,0xdf,0xdf,0xcd,0x52,0x01,0x80,0xfd,0xbe,0xa4,0xa4,0x03,0x2d,0xfe,0x77,0xd8,0xec,0xfe,0xbc,0xf7,0xb6,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x96,0xa5,0x33,0x02,0x14,0xfc,0x8c, -0x05,0xec,0xfe,0x14,0x33,0xfd,0xe1,0x1a,0xeb,0xb3,0xcc,0xfe,0xf7,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8,0x06,0x54,0x04,0x00,0x00,0x1f,0x00,0x45,0x40,0x25,0x02,0x08,0x0d,0x1a,0x05,0x12,0x95,0x40,0x0a,0x10,0x00,0x1e,0x16,0x0d,0x0f,0x1f,0x84,0x01,0x1e,0x0e,0x16,0x0d,0x16,0x42,0x0e,0x84,0x0d,0x08,0x17,0x84,0x16,0x20,0x21,0x16, -0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x32,0xe1,0x00,0x18,0x3f,0x33,0x33,0x2f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11, -0x33,0x06,0x54,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x54,0x04,0x00,0x00,0x1f,0x00,0x46, -0x40,0x26,0x02,0x08,0x0d,0x1a,0x05,0x12,0x95,0x40,0x0a,0x10,0x00,0x1b,0x1e,0x16,0x0d,0x0f,0x1f,0x84,0x01,0x1e,0x0e,0x16,0x0d,0x16,0x42,0x0e,0x84,0x0d,0x08,0x17,0x84,0x16,0x20,0x21,0x16,0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x32,0xe1,0x00,0x18,0x3f,0x33,0x33,0x3f,0x3f,0x1a,0xed,0x39, -0x39,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x54,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xfe,0x29,0x02, -0x79,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x06,0x54,0x04,0x18,0x00,0x28,0x00,0x50,0x40,0x2d,0x26,0x28,0x95,0x23,0x1c,0x05,0x15,0x16,0x1b,0x04,0x0d,0x95,0x40,0x1d,0x18,0x10,0x13,0x0f,0x0a,0x12,0x26,0x26, -0x09,0x20,0x84,0x01,0x0e,0x0a,0x12,0x0a,0x42,0x14,0x11,0x84,0x12,0x1b,0x09,0x84,0x0a,0x29,0x2a,0x0a,0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x32,0x2b,0x01,0x10,0xf2,0xe1,0x12,0x39,0x18,0x2f,0x00,0x2f,0x33,0x3f,0x3f,0x33,0x1a,0xed,0x17,0x32,0x3f,0xfd,0xc6,0x31,0x30,0x00,0x11,0x11,0x34,0x26,0x23,0x22,0x06, -0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x05,0xb0,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0xbf,0xad,0x4c,0x36,0x3e,0x44,0xfe,0xaa,0x01, -0x3e,0x02,0x64,0xaa,0x98,0xc0,0x86,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb5,0x91,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0xfd,0x85,0xe6,0xf8,0x1a,0x99,0x27,0x00,0x00,0x01,0xff,0x96,0xfe,0x1e,0x03,0xf8,0x04,0x18,0x00,0x1a,0x00,0x35,0x40,0x1c,0x15,0x00,0x18,0x0e,0x10,0x95,0x0b,0x1c,0x00,0x15,0x13,0x0f,0x04,0x95, -0x18,0x10,0x00,0x84,0x01,0x01,0x1c,0x12,0x15,0x08,0x0e,0x08,0x84,0x12,0x2f,0xe1,0xc6,0x11,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11, -0x03,0xf8,0xa4,0xec,0x7b,0xa3,0xb3,0x8b,0x48,0x2e,0x36,0x36,0xa4,0xa4,0x04,0x74,0xde,0x01,0x58,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0x24,0x99,0xb5,0x13,0x93,0x1a,0xcd,0x04,0x89,0xaa,0xc2,0xfe,0x5a,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x05,0x08,0x04,0x18,0x00,0x1a,0x00,0x31,0x40,0x1a,0x1a,0x18,0x95,0x02,0x1c,0x10,0x13,0x0d, -0x15,0x0e,0x0f,0x08,0x95,0x13,0x10,0x1a,0x1a,0x16,0x84,0x05,0x05,0x1c,0x10,0x0c,0x84,0x0d,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11,0x11,0x14,0x33, -0x32,0x37,0x05,0x08,0x40,0x43,0x93,0x9e,0xec,0x7b,0xa3,0xa4,0xa4,0x04,0x74,0xde,0x01,0x58,0xa0,0x3c,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x02,0xdc,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xfe,0x5a,0xfd,0x00,0xc8,0x1a,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x0a,0x04,0x00,0x00,0x13,0x00,0x26,0x40,0x14,0x01,0x04,0x0f,0x13, -0x04,0x0b,0x09,0x15,0x0b,0x0f,0x01,0x13,0x84,0x12,0x12,0x15,0x0b,0x08,0x84,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x04,0x0a,0x9c,0xfe,0x06,0x24,0x0c,0x04,0x04,0x9e,0xa4,0x01, -0xf2,0x20,0x10,0x04,0x06,0xa0,0x02,0xd1,0x33,0x18,0x35,0x4d,0xfd,0x66,0x04,0x00,0xfd,0x40,0x2d,0x21,0x33,0x3f,0x02,0x9c,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x33,0x40,0x1c,0x13,0x95,0x40,0x11,0x06,0x00,0x11,0x95,0x1b,0x30,0x16,0x95,0x00,0x16,0x0e,0x95,0x06,0x10,0x09,0x83, -0x0c,0x12,0x12,0x19,0x11,0x13,0x83,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x20,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01, -0xfe,0xeb,0x69,0x1e,0xfe,0xd8,0x8d,0xb1,0x12,0x02,0x98,0xfd,0x66,0x0a,0xb4,0x94,0x01,0x34,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x68,0x01,0x3e,0xa6,0x98,0x8c,0x9e,0xb4,0x00,0x00,0x02,0x00,0x60,0xff,0xea,0x05,0x60,0x04,0x16,0x00,0x13,0x00,0x1e,0x00,0x47,0x40,0x28,0x10,0x95,0x40,0x0f, -0x0b,0x00,0x0f,0x95,0x1b,0x30,0x1d,0x96,0x02,0x16,0x13,0x95,0x00,0x15,0x0c,0x95,0x0b,0x0f,0x17,0x96,0x08,0x10,0x0e,0x12,0x84,0x14,0x14,0x05,0x0c,0x10,0x00,0x00,0x20,0x1a,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xe1,0x32,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31, -0x30,0x21,0x21,0x07,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x21,0x11,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x05,0x60,0xfd,0xd3,0xd7,0xeb,0xfe,0xef,0x01,0x1a,0xee,0x31,0x9a,0x02,0x15,0xfe,0x76,0x01,0x6f,0xfe,0x91,0x01,0xa2,0xfd,0xbc,0x60,0x52,0x9f,0xc1,0xba,0xa2,0x46, -0x16,0x01,0x21,0xeb,0xf3,0x01,0x2d,0x16,0x8c,0xfe,0xd6,0x8c,0xfe,0xce,0x02,0xed,0x19,0xe1,0xb3,0xb4,0xdc,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x64,0x04,0x18,0x00,0x11,0x00,0x22,0x00,0x43,0x40,0x25,0x01,0x03,0x12,0x12,0x1b,0x16,0x0f,0x20,0x95,0x03,0x16,0x1b,0x95,0x40,0x09,0x10,0x18,0x84,0x0c,0x0e,0x13,0x12,0x06,0x42, -0x00,0x13,0x84,0x12,0x23,0x24,0x12,0x84,0x08,0x30,0x1e,0x84,0x06,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x39,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x39,0x39,0x11,0x39,0x2f,0x12,0x39,0x31,0x30,0x25,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x06,0x23,0x22,0x26,0x03,0x33,0x15,0x10,0x33, -0x32,0x11,0x34,0x26,0x23,0x22,0x00,0x15,0x10,0x33,0x32,0x11,0x02,0xdf,0x06,0x57,0xcc,0x9e,0xb8,0x01,0x65,0x01,0x2d,0x01,0x1c,0x01,0x56,0xc8,0xb0,0x6a,0x7b,0x75,0x9f,0xb9,0xd6,0xfa,0xe0,0xde,0xfe,0xfc,0xcf,0xbf,0xb2,0xca,0xeb,0xd5,0x01,0x17,0x01,0x59,0xfe,0xb6,0xfe,0xf0,0xe1,0xf5,0x5c,0x01,0xc2,0x5a,0xfe,0xc6,0x01,0x44, -0xdf,0xf9,0xfe,0xfe,0xd8,0xfe,0xbe,0x01,0x3a,0x00,0x00,0x03,0x00,0x60,0xfe,0x29,0x04,0xba,0x05,0xec,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x48,0x40,0x2a,0x02,0x1b,0x13,0x00,0x19,0x95,0x03,0x16,0x12,0x0c,0x1a,0x95,0x40,0x09,0x10,0x0a,0x00,0x16,0x83,0x0f,0x0e,0x00,0x06,0x03,0x42,0x09,0x0c,0x13,0x19,0x04,0x00,0x84,0x03,0x20, -0x21,0x03,0x84,0x08,0x30,0x1d,0x83,0x06,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x17,0x39,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x3f,0xed,0x39,0x39,0x3f,0x31,0x30,0x05,0x11,0x23,0x11,0x26,0x02,0x35,0x34,0x00,0x37,0x11,0x33,0x11,0x16,0x12,0x15,0x14,0x00,0x03,0x11,0x36,0x36,0x35,0x34,0x26,0x01,0x11,0x06, -0x06,0x15,0x14,0x16,0x02,0xdf,0xa3,0xdd,0xff,0x01,0x04,0xd8,0xa3,0xdf,0xfc,0xfe,0xfe,0xd9,0x93,0xa0,0xa0,0xfe,0xca,0x91,0xa3,0xa3,0x18,0xfe,0x41,0x01,0xbf,0x11,0x01,0x22,0xdf,0xe7,0x01,0x20,0x17,0x01,0xd4,0xfe,0x2c,0x10,0xfe,0xe1,0xe5,0xe3,0xfe,0xdc,0x03,0x91,0xfc,0xe4,0x12,0xd0,0xac,0xab,0xd1,0xfc,0xf6,0x03,0x1c,0x12, -0xd2,0xac,0xa6,0xd3,0x00,0x01,0x00,0x0c,0xff,0xee,0x02,0x23,0x04,0x00,0x00,0x0f,0x00,0x20,0x40,0x10,0x08,0x0a,0x95,0x05,0x16,0x00,0x15,0x0e,0x0f,0x02,0x0f,0x84,0x0e,0x0e,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35, -0x11,0x33,0x02,0x23,0xa4,0x04,0x53,0xba,0x40,0x22,0x2c,0x51,0x69,0x8d,0xa4,0xc8,0xda,0x0e,0xaa,0x21,0xc8,0xa9,0x02,0x0a,0x00,0x01,0x00,0x0c,0xff,0xee,0x02,0x23,0x05,0xec,0x00,0x0f,0x00,0x20,0x40,0x10,0x08,0x0a,0x95,0x05,0x16,0x00,0x15,0x0e,0x00,0x02,0x0f,0x84,0x0e,0x0e,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f, -0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x23,0xa4,0x04,0x53,0xba,0x40,0x22,0x2c,0x51,0x69,0x8d,0xa4,0xc8,0xda,0x0e,0xaa,0x21,0xc8,0xa9,0x03,0xf6,0x00,0x01,0x00,0x0c,0xfe,0x1e,0x03,0x33,0x04,0x00,0x00,0x18,0x00,0x2f,0x40,0x18,0x18,0x16,0x95,0x02, -0x1c,0x07,0x09,0x12,0x0c,0x0e,0x95,0x09,0x16,0x12,0x0f,0x18,0x18,0x06,0x13,0x84,0x12,0x12,0x1a,0x0c,0x2f,0x12,0x39,0x2f,0xf1,0x33,0xc2,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33, -0x32,0x37,0x03,0x33,0x40,0x43,0x92,0x9f,0x04,0x52,0xbb,0x40,0x22,0x2c,0x51,0x68,0x8e,0xa4,0x9f,0x3d,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x58,0xd6,0x0e,0xaa,0x21,0xc7,0xaa,0x02,0x0a,0xfb,0x72,0xc8,0x1a,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x0f,0x00,0x23,0x40,0x11,0x07,0x1b,0x08,0x0f,0x00,0x00,0x0a,0x02, -0x0d,0x10,0x00,0x00,0x11,0x0a,0x06,0x84,0x07,0x2f,0xe9,0x32,0x11,0x39,0x2f,0x00,0x3f,0xcd,0x32,0x32,0x2f,0x3f,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0xa4,0xa4,0x04,0x4a,0xc2,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfc,0x1f,0x05,0xd7,0xd3, -0xe5,0x0e,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x02,0xbc,0x04,0x12,0x00,0x19,0x00,0x2c,0x40,0x16,0x14,0x1a,0x17,0x0a,0x08,0x95,0x0d,0x1c,0x11,0x0f,0x00,0x02,0x17,0x10,0x0a,0x00,0x00,0x1b,0x13,0x06,0x84,0x10,0x2f,0xe1,0x32,0x11,0x39,0x2f,0xc6,0x00,0x3f,0xdd,0xc6,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x31,0x30,0x01,0x26,0x23,0x22, -0x06,0x15,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0xa0,0x3c,0x34,0x40,0x43,0x93,0x9e,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfd,0x68,0xc8,0x1a,0x8a,0x1c,0xaf,0x9f,0x04,0x94,0xd3,0x6c,0x79,0x0e,0x00,0x00,0x01, -0x00,0x90,0x00,0x00,0x02,0xa2,0x04,0x18,0x00,0x0c,0x00,0x1b,0x40,0x0d,0x06,0x15,0x00,0x02,0x95,0x0a,0x10,0x00,0x00,0x0e,0x05,0x84,0x06,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x11,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0xa2,0x46,0x54,0xd7,0xa1,0xce,0xaa,0x56,0x44,0x03,0x68, -0x26,0xfe,0xed,0xfd,0x85,0x02,0x7b,0xbd,0xe0,0x1e,0x00,0x01,0x00,0x0c,0xfe,0x29,0x02,0x1e,0x04,0x18,0x00,0x0c,0x00,0x1b,0x40,0x0d,0x00,0x1b,0x06,0x04,0x95,0x09,0x10,0x00,0x84,0x01,0x01,0x0e,0x06,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x23,0x11,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15, -0x02,0x1e,0xa1,0xd7,0x4c,0x4e,0x50,0x54,0xb0,0xbe,0xfe,0x29,0x04,0x4e,0x01,0x17,0x28,0x92,0x20,0xd2,0xc5,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x83,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x3e,0x40,0x20,0x0f,0x05,0x95,0x13,0x13,0x07,0x08,0x01,0x15,0x07,0x15,0x12,0x95,0x08,0x0f,0x03,0x10,0x10,0x0f,0x06,0x01,0x00,0x00,0x0c, -0x84,0x16,0x16,0x1a,0x13,0x06,0x84,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x83,0xb8, -0x75,0x3e,0x78,0x56,0xa4,0x01,0x52,0xa5,0xb7,0xea,0x53,0x39,0xfe,0x54,0x9a,0xcc,0xc4,0x01,0x14,0x92,0xfe,0x5a,0x04,0x00,0x98,0x84,0xda,0x31,0x04,0x21,0x7c,0x02,0x3c,0xfe,0xbd,0xa8,0x9b,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x83,0x04,0x00,0x00,0x12,0x00,0x1a,0x00,0x43,0x40,0x24,0x04,0x13,0x95,0x40,0x0d,0x0b,0x0a,0x0d, -0x95,0x08,0x30,0x14,0x95,0x0a,0x15,0x00,0x0f,0x0b,0x0f,0x10,0x02,0x03,0x02,0x0d,0x12,0x00,0x00,0x06,0x84,0x17,0x17,0x1c,0x0d,0x14,0x84,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x03,0x06,0x07,0x15,0x16,0x15, -0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x33,0x32,0x36,0x37,0x13,0x01,0x11,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x83,0x8d,0x33,0x55,0xe6,0xc7,0xae,0xfe,0xc7,0xa4,0x56,0x41,0x53,0x22,0x79,0xfe,0x7b,0x95,0xd1,0x6e,0x5e,0x04,0x00,0xfe,0xcb,0x71,0x29,0x04,0x2b,0xd7,0x88,0xa3,0x04,0x00,0xfe,0x5a,0x41,0x51,0x01,0x14,0xfd,0xcf,0xfe, -0xbd,0x9d,0x4f,0x57,0x00,0x01,0x00,0x68,0xfe,0xb6,0x02,0xdb,0x04,0x18,0x00,0x2b,0x00,0x5d,0x40,0x0e,0x05,0x03,0x00,0x08,0x01,0x08,0x10,0x16,0x21,0x27,0x04,0x2a,0x19,0x0c,0xb8,0xff,0xc0,0x40,0x13,0x0b,0x0e,0x48,0x0c,0x0c,0x0e,0x95,0x2a,0x16,0x1c,0x1c,0x1e,0x95,0x19,0x10,0x05,0x05,0x27,0x00,0xb8,0x01,0x03,0x40,0x0d,0x0c, -0x1c,0x1c,0x27,0x83,0x10,0x10,0x2d,0x0c,0x21,0x83,0x16,0x0c,0x2f,0xd6,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x2f,0x2b,0x11,0x12,0x17,0x39,0x2f,0x5d,0xdd,0xc6,0x31,0x30,0x17,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x16,0x33,0x32,0x35, -0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0xee,0x95,0x3b,0x3c,0x41,0x49,0x7b,0x8d,0x82,0x88,0xc3,0x56,0x7d,0x93,0x65,0xca,0x9f,0x7a,0x61,0x66,0x82,0x52,0x62,0x45,0x7e,0x94,0x72,0xc2,0xa9,0x41,0x02,0x27,0xaa,0x23,0x7b,0x1f,0x8f, -0x83,0x01,0x0d,0x63,0x90,0x3c,0x4e,0x36,0x41,0x89,0x64,0x80,0xa8,0x2e,0xa6,0x4a,0x50,0x40,0x3e,0x4b,0x35,0x40,0x8c,0x62,0x82,0xa8,0x00,0x01,0xff,0x92,0xfe,0x1e,0x02,0x68,0x06,0x02,0x00,0x15,0x00,0x2d,0x40,0x18,0x0b,0x0d,0x95,0x08,0x1c,0x00,0x02,0x95,0x40,0x13,0x01,0x00,0x00,0x05,0x0a,0x05,0x84,0x0f,0x16,0x17,0x0f,0x84, -0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xc4,0x10,0xc2,0x2f,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x68,0x32,0x3c,0xaa,0xb9,0x8f,0x4c,0x2a,0x32,0x3c,0xac,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfa, -0xe7,0xa2,0xbf,0x13,0x93,0x1a,0xdf,0x05,0x17,0xa4,0xbe,0x12,0x00,0x01,0xff,0x9e,0xfe,0x1e,0x02,0x72,0x06,0x02,0x00,0x1d,0x00,0x53,0x40,0x2d,0x08,0x05,0x14,0x95,0x40,0x17,0x1b,0x0c,0x17,0x95,0x08,0x30,0x0f,0x11,0x95,0x0c,0x1c,0x00,0x02,0x95,0x40,0x1b,0x01,0x15,0x15,0x13,0x0f,0x06,0x06,0x09,0x00,0x00,0x09,0x0f,0x17,0x05, -0x09,0x84,0x13,0x1e,0x1f,0x13,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x10,0xc0,0x2f,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x33,0x15,0x23,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32, -0x35,0x11,0x23,0x35,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x72,0x32,0x3a,0xac,0xb0,0xb0,0xb7,0x8f,0x4b,0x2b,0x32,0x3a,0xac,0xb0,0xb0,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfd,0xce,0x8b,0xfd,0xa4,0xa4,0xbd,0x13,0x93,0x1a,0xdf,0x02,0x52,0x8b,0x02,0x3a,0xa2,0xc0,0x12,0x00,0x01,0xff,0xa6,0xfe,0x1e,0x02,0x48,0x04,0x18, -0x00,0x14,0x00,0x22,0x40,0x11,0x14,0x12,0x95,0x02,0x1c,0x09,0x07,0x95,0x0c,0x10,0x14,0x14,0x10,0x09,0x10,0x84,0x04,0x2f,0xe1,0xc6,0x10,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x37,0x02,0x48,0x3a,0x5c,0xfe, -0xfa,0x9a,0x3a,0x32,0x40,0x3d,0x90,0x9d,0x92,0x38,0x2e,0xfe,0x3c,0x1e,0x01,0x28,0x03,0x82,0xc5,0x19,0x8c,0x18,0xae,0x9c,0xfc,0x95,0xbb,0x22,0x00,0x02,0xff,0x44,0xfe,0x1e,0x02,0x8e,0x06,0x02,0x00,0x1b,0x00,0x23,0x00,0x68,0xb7,0x15,0x05,0x07,0x13,0x1c,0x0a,0x1e,0x07,0xb8,0xff,0xc0,0x40,0x30,0x13,0x16,0x48,0x07,0x08,0x08, -0x22,0x1e,0x96,0x0f,0x13,0x1f,0x13,0x02,0x09,0x03,0x13,0x22,0x96,0x0d,0x1c,0x00,0x02,0x95,0x40,0x19,0x01,0x1c,0x15,0x0a,0x05,0x10,0x07,0x00,0x00,0x05,0x20,0x84,0x10,0x05,0x84,0x15,0x24,0x25,0x15,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xd4,0xe1,0x10,0xc2,0x2f,0xc6,0x11,0x12,0x39,0x11,0x33,0x00,0x3f,0x1a,0xfd,0xc6,0x3f, -0xed,0x2f,0x5f,0x5e,0x5d,0xed,0x11,0x39,0x2f,0xcd,0x2b,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x16,0x17,0x15,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x02,0x8e,0x32,0x3e,0xaa,0x7a,0x74,0x7a, -0x80,0x10,0xa3,0x82,0x69,0x86,0xb4,0x91,0x27,0x21,0xb8,0x8d,0x4c,0x2c,0xfe,0x43,0x23,0x25,0xae,0x63,0x8e,0x05,0x5c,0x1b,0xdf,0xfb,0x2a,0x2c,0x54,0xa6,0x68,0x34,0x81,0x99,0x79,0x5d,0x6d,0x91,0x04,0x04,0xb2,0xa2,0xc0,0x12,0xf9,0x78,0x06,0x70,0x5a,0x00,0x00,0x01,0x00,0x38,0xfe,0xd1,0x02,0x8e,0x04,0x16,0x00,0x14,0x00,0x30, -0x40,0x18,0x03,0x04,0x07,0x04,0x13,0x95,0x01,0x15,0x0d,0x0b,0x95,0x10,0x10,0x14,0x14,0x04,0x01,0x13,0x84,0x07,0x07,0x16,0x06,0x0d,0x2f,0x33,0x12,0x39,0x2f,0xf1,0x39,0x39,0xc1,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x31,0x30,0x21,0x23,0x15,0x07,0x11,0x21,0x35,0x21,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36, -0x33,0x20,0x11,0x11,0x33,0x02,0x8e,0xb1,0xa1,0xfe,0xfc,0x01,0x04,0x48,0x52,0x3e,0x2c,0x39,0x60,0x01,0x0c,0xb1,0xfa,0x35,0x01,0x2f,0x8c,0x02,0x41,0x67,0x58,0x22,0x8c,0x20,0xfe,0xd4,0xfd,0xa2,0x00,0x01,0x00,0x2b,0xfe,0x1e,0x02,0x81,0x05,0x2f,0x00,0x14,0x00,0x2e,0x40,0x17,0x14,0x12,0x95,0x02,0x1c,0x0a,0x0e,0x0b,0x06,0x95, -0x07,0x0f,0x00,0x00,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x84,0x04,0x2f,0xe9,0x33,0x32,0x33,0x32,0x2f,0x2f,0x33,0x2f,0x00,0x3f,0xed,0x33,0x32,0xc4,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4, -0x01,0x02,0xfe,0xfe,0x46,0x51,0x3b,0x30,0xfe,0x40,0x22,0x01,0x2e,0x04,0x28,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfb,0xf4,0x67,0x57,0x23,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0xa4,0x04,0x00,0x00,0x15,0x00,0x1d,0x00,0x4c,0x40,0x2b,0x01,0x10,0x14,0x18,0x04,0x0a,0x95,0x40,0x0d,0x0e,0x07,0x0d,0x95,0x08,0x30,0x13,0x04,0x0e,0x1b,0x95, -0x07,0x16,0x02,0x15,0x0e,0x0f,0x00,0x01,0x01,0x04,0x17,0x03,0x13,0x84,0x12,0x12,0x1f,0x0c,0x18,0x0a,0x0f,0x84,0x0e,0x2f,0xe1,0x39,0x39,0xc6,0x12,0x39,0x2f,0xe1,0x17,0x39,0x10,0xcd,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x17,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11, -0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0x35,0x21,0x15,0x10,0x33,0x32,0x36,0x04,0xa4,0x98,0xa4,0x04,0x66,0xd5,0xfe,0x8f,0x97,0x97,0xa4,0x02,0x0c,0xa4,0x98,0xfe,0xc4,0xfd,0xf4,0xfa,0x78,0x9a,0x01,0xdb,0xfe,0x25,0xa2,0xba,0x01,0xb4,0x3f,0x8b,0x01,0x9a,0xfe,0x66,0x01,0x9a,0xfe,0x66,0xb4,0x29,0x25, -0xfe,0xbc,0xb0,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x62,0x04,0x00,0x00,0x1b,0x00,0x38,0x40,0x1e,0x09,0x95,0x17,0x16,0x04,0x0e,0x11,0x03,0x10,0x0f,0x01,0x95,0x02,0x0f,0x12,0x0e,0x11,0x14,0x84,0x0c,0x0c,0x1d,0x1a,0x00,0x04,0x04,0x01,0x06,0x84,0x1a,0x2f,0xf1,0x33,0xc2,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x32,0xc6,0x32, -0x00,0x3f,0xed,0x3f,0x17,0x32,0x3f,0xed,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x06,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x27,0x35,0x21,0x15,0x23,0x16,0x11,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x01,0x1c,0xbc,0x01,0x7f,0xdb,0xbd,0xa1,0xa6,0xb6,0xda,0x01,0x7e,0xb8,0xb8,0xfe,0xec,0xf2,0xed,0xfe,0xf1,0x03,0x74,0x8c,0x8e,0x64, -0xfe,0xe6,0xaf,0xd3,0xcc,0xb6,0x01,0x1a,0x64,0x8e,0x8c,0x89,0xfe,0xfb,0xe3,0xfe,0xe5,0x01,0x16,0xe1,0x01,0x07,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0x16,0x04,0x18,0x00,0x17,0x00,0x2a,0x40,0x16,0x04,0x95,0x15,0x16,0x00,0x0f,0x0c,0x0a,0x95,0x0f,0x10,0x0c,0x0c,0x01,0x12,0x83,0x07,0x07,0x19,0x01,0x84,0x00,0x2f,0xe1,0x12,0x39, -0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xed,0x31,0x30,0x13,0x33,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x20,0x11,0x90,0xa3,0x01,0x0b,0x93,0x9f,0x60,0x56,0x3b,0x35,0x3e,0x4f,0x96,0xa9,0xff,0x00,0xe3,0xfe,0x5d,0x04,0x00,0xfd,0xb4,0xfe,0xbe,0xdb, -0xc1,0xba,0xc8,0x1c,0x8a,0x1a,0xfe,0xe7,0xeb,0xfd,0xfe,0xd1,0x01,0xbe,0x00,0x01,0x00,0x0c,0x00,0x00,0x03,0xc8,0x04,0x00,0x00,0x0b,0x00,0x1d,0x40,0x0d,0x00,0x05,0x0a,0x09,0x15,0x0a,0x0f,0x01,0x00,0x00,0x0d,0x08,0x09,0x2f,0x33,0x11,0x33,0x2f,0x32,0x00,0x3f,0x3f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06, -0x07,0x01,0x23,0x01,0x33,0x03,0xc8,0xb4,0xfe,0xfc,0x1c,0x06,0x04,0x09,0x1b,0xfe,0xf2,0xac,0x01,0x96,0xa4,0x02,0xe8,0x51,0x3e,0x43,0x48,0xfd,0x14,0x04,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x00,0x1b,0x00,0x3c,0x40,0x20,0x00,0x04,0x09,0x0c,0x16,0x1a,0x06,0x12,0x11,0x15,0x12,0x0f,0x1b,0x1a,0x04,0x09, -0x08,0x16,0x13,0x12,0x0c,0x16,0x04,0x0c,0x03,0x11,0x01,0x00,0x00,0x1d,0x10,0x11,0x2f,0x33,0x11,0x33,0x2f,0x32,0x12,0x17,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16, -0x17,0x33,0x36,0x37,0x13,0x33,0x05,0xb0,0xac,0xd3,0x0b,0x03,0x09,0x02,0x10,0xec,0x95,0xd5,0x0a,0x04,0x08,0x02,0x0e,0xd2,0xa2,0x01,0x36,0xa8,0xd2,0x0c,0x05,0x04,0x03,0x12,0xe5,0xa4,0x03,0x02,0x28,0x34,0x2c,0x32,0xfd,0x00,0x03,0x04,0x24,0x38,0x27,0x35,0xfc,0xfc,0x04,0x00,0xfd,0x23,0x2b,0x34,0x24,0x39,0x02,0xdf,0x00,0x01, -0x00,0x0c,0x00,0x00,0x03,0xd1,0x05,0xec,0x00,0x14,0x00,0x2c,0x40,0x17,0x00,0x15,0x09,0x15,0x04,0x0a,0x14,0x0f,0x0f,0x0f,0x11,0x95,0x0c,0x00,0x0f,0x0a,0x0f,0x14,0x03,0x09,0x00,0x16,0x09,0x2f,0x10,0xc6,0x11,0x17,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x33,0x33,0x3f,0x3f,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07, -0x01,0x23,0x01,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x03,0xd1,0xb5,0xfe,0xea,0x02,0x10,0x06,0x06,0x11,0xfe,0xdf,0xaa,0x01,0xdc,0x7e,0xe4,0x3d,0x2b,0x34,0x2a,0x7f,0x3f,0x54,0x03,0x14,0x07,0x47,0x18,0x34,0xfc,0xea,0x04,0xae,0x01,0x3e,0x0d,0x93,0x12,0x98,0xc8,0x00,0x01,0x00,0x0a,0x00,0x00,0x03,0x4c,0x04,0x00, -0x00,0x0d,0x00,0x30,0x40,0x1a,0x00,0x01,0x04,0x09,0x04,0x05,0x03,0x15,0x05,0x0f,0x09,0x01,0x00,0x04,0x40,0x05,0x05,0x01,0x84,0x04,0x0e,0x0f,0x04,0x84,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc1,0x18,0x2f,0x1a,0x10,0xcd,0x12,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x13,0x16,0x17,0x33,0x36, -0x37,0x13,0x03,0x4c,0xfe,0xb0,0xa4,0xfe,0xb2,0xb0,0xb8,0x29,0x11,0x04,0x18,0x20,0xbc,0x04,0x00,0xfd,0x77,0xfe,0x89,0x01,0x77,0x02,0x89,0xfe,0x7f,0x57,0x2e,0x46,0x3f,0x01,0x81,0x00,0x00,0x01,0x00,0x21,0xfe,0xfa,0x03,0xfe,0x04,0x00,0x00,0x16,0x00,0x36,0x40,0x0f,0x16,0x14,0x02,0x09,0x0f,0x95,0x08,0x15,0x0e,0x0a,0x95,0x0c, -0x0f,0x16,0x05,0xb8,0x01,0x03,0x40,0x09,0x12,0x0a,0x0e,0x10,0x10,0x18,0x0b,0x0f,0x09,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xc6,0x32,0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2f,0xdd,0xc6,0x31,0x30,0x05,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x06,0x15,0x14,0x33,0x32,0x37,0x03, -0xfe,0x34,0x41,0x58,0x6b,0x09,0xfd,0x52,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x02,0x58,0x22,0x5a,0x2c,0x30,0xee,0x18,0x6f,0x51,0x22,0x24,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0x78,0x3d,0x69,0x1b,0x00,0x00,0x02,0x00,0x21,0xff,0x81,0x04,0x25,0x04,0x00,0x00,0x17,0x00,0x1e,0x00,0x7d,0x40,0x32,0x07,0x28,0x09,0x0d,0x48,0x04, -0x1e,0x14,0x1e,0x02,0x34,0x0d,0x44,0x0d,0x02,0x06,0x0d,0x16,0x0d,0x26,0x0d,0x03,0x1d,0x96,0x40,0x11,0x0d,0x80,0x02,0x00,0x18,0x00,0x07,0x0d,0x95,0x06,0x15,0x0c,0x08,0x95,0x0a,0x0f,0x18,0x00,0x1b,0x02,0x0e,0x05,0x14,0x02,0xb8,0x01,0x03,0x40,0x0b,0x0f,0x03,0x01,0x03,0x03,0x14,0x0d,0x08,0x0c,0x0c,0x14,0xb8,0x01,0x03,0xb5, -0x1b,0x1b,0x20,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x39,0x39,0x10,0xce,0x1a,0x10,0xdc,0x1a,0xed,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x00,0x2b,0x21,0x06,0x07,0x23,0x36,0x37,0x21,0x35,0x01,0x21,0x35, -0x21,0x15,0x01,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x35,0x34,0x23,0x22,0x02,0x06,0x0f,0x03,0x8e,0x04,0x0d,0xfe,0xaa,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x90,0x3d,0xca,0x78,0x76,0x8e,0xac,0x9c,0xaa,0xac,0xb7,0x78,0x9a,0x46,0x39,0x48,0x37,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0x8f,0x9f,0x78, -0x5c,0x6a,0x7c,0x8c,0x5a,0x54,0x00,0x01,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x00,0x18,0x00,0x44,0x40,0x24,0x0b,0x0a,0x96,0x40,0x11,0x0e,0x17,0x11,0x91,0x09,0x30,0x01,0x03,0x95,0x17,0x1c,0x10,0x0c,0x95,0x0e,0x0f,0x11,0x0b,0x0b,0x06,0x00,0x0c,0x10,0x10,0x14,0x83,0x06,0x06,0x1a,0x0d,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1, -0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x23,0xa5,0xb1,0xae,0xdf,0xde,0xce,0x52,0x01,0x80,0xfd,0xbe,0x03,0x2d,0xfe, -0x77,0xda,0xea,0xfe,0xbc,0xf7,0xb6,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x95,0xa6,0x33,0x02,0x14,0x8c,0x33,0xfd,0xe1,0x1a,0xea,0xb4,0xcc,0xfe,0xf7,0x00,0x02,0xff,0xea,0xfe,0x21,0x03,0x8c,0x04,0x00,0x00,0x20,0x00,0x29,0x00,0xa0,0xb5,0x19,0x20,0x0b,0x01,0x4d,0x14,0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x01,0x4d,0x02,0x00,0x23,0x1e,0x0c, -0x0a,0x20,0xb8,0xff,0xc0,0x40,0x47,0x12,0x16,0x48,0x20,0x00,0x04,0x23,0x95,0x0f,0x0a,0x1f,0x0a,0x02,0x09,0x03,0x0a,0x0a,0x04,0x13,0x12,0x96,0x40,0x19,0x40,0x09,0x0c,0x48,0x19,0x16,0x04,0x19,0x96,0x09,0x30,0x28,0x95,0x04,0x1c,0x18,0x14,0x95,0x16,0x0f,0x19,0x13,0x13,0x0e,0x07,0x14,0x18,0x18,0x1c,0x21,0x0c,0x0e,0x26,0x1e, -0x02,0x1c,0x07,0x20,0x20,0x1c,0x83,0x0e,0x0e,0x2b,0x15,0x26,0x84,0x07,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x2b,0x1a,0xed,0x39,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0xed,0x10,0xd4,0xcd, -0x2b,0x11,0x39,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x2b,0x2b,0x01,0x26,0x27,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x07,0x16,0x17,0x25,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x03,0x8c,0x55,0x64,0xa6,0xfe,0xfe,0x94,0xad,0xb0, -0x8b,0xb3,0xc8,0x20,0xe1,0xcb,0x52,0x01,0x80,0xfd,0xbe,0x03,0x2d,0xfe,0x77,0xd6,0xee,0x43,0x3e,0x29,0xfe,0xc2,0xa8,0x81,0x4d,0x59,0xb4,0xab,0xfe,0x21,0x4f,0x46,0x95,0x7c,0x67,0x64,0x82,0x76,0x3e,0x46,0x92,0xa3,0x33,0x02,0x14,0x8c,0x33,0xfd,0xe1,0x1a,0xe7,0xb1,0x75,0x6b,0x2e,0x21,0x39,0x5c,0x32,0x28,0x5e,0x00,0x00,0x01, -0x00,0x1c,0x00,0x00,0x02,0xe8,0x06,0x02,0x00,0x19,0x00,0x2a,0x40,0x15,0x13,0x08,0x10,0x01,0x15,0x0d,0x0b,0x95,0x10,0x01,0x00,0x84,0x01,0x01,0x0d,0x13,0x83,0x08,0x08,0x1b,0x0d,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x36,0x36,0x35,0x34, -0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x01,0x89,0xa3,0x4c,0x6e,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x50,0x3f,0x01,0xee,0x87,0xa2,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x83,0x6f,0x00,0x01,0x00,0x04,0x00,0x00,0x02,0xcf, -0x06,0x02,0x00,0x19,0x00,0x2e,0x40,0x18,0x14,0x05,0x17,0x0d,0x15,0x4f,0x00,0x01,0x00,0x02,0x95,0x17,0x01,0x0c,0x84,0x0d,0x0d,0x14,0x00,0x00,0x1b,0x05,0x83,0x14,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15, -0x11,0x23,0x11,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x02,0xcf,0x87,0x94,0x7a,0x90,0x32,0x72,0x70,0x48,0xa4,0x39,0x5c,0x7a,0x4f,0xf0,0xc0,0x94,0x87,0x05,0x29,0x4e,0x78,0x59,0x38,0x72,0x75,0x73,0xa2,0x84,0xfe,0x12,0x01,0xee,0x5f,0x82,0x5c,0x79,0x9f,0x5f,0x95,0xcb,0x3e,0x00,0x00,0x01,0x00,0x00,0xff,0xea, -0x02,0xcb,0x05,0xec,0x00,0x19,0x00,0x30,0x40,0x19,0x15,0x06,0x18,0x0d,0x40,0x01,0x01,0x01,0x03,0x95,0x18,0x16,0x0d,0x00,0x0e,0x84,0x0d,0x0d,0x01,0x15,0x83,0x06,0x06,0x1b,0x01,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x5d,0x11,0x12,0x39,0x39,0x31,0x30,0x35,0x35,0x16,0x33,0x32,0x36,0x35,0x34, -0x26,0x27,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x86,0x94,0x7a,0x91,0x3c,0x68,0x6f,0x4a,0xa4,0x3e,0x58,0x7a,0x4f,0xef,0xc2,0x93,0x27,0x9b,0x4e,0x76,0x5c,0x45,0x6e,0x6b,0x73,0xa0,0x87,0x01,0xee,0xfe,0x12,0x5e,0x88,0x58,0x77,0xa0,0x5f,0x97,0xc9,0x00,0x00,0x01,0x00,0x60,0xfe,0x21, -0x03,0x60,0x04,0x18,0x00,0x13,0x00,0x2e,0x40,0x1b,0x10,0x13,0x20,0x13,0x30,0x13,0x03,0x13,0x11,0x95,0x02,0x1c,0x3f,0x0b,0x01,0x0b,0x0d,0x95,0x08,0x10,0x0b,0x13,0x13,0x15,0x0f,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x01,0x06,0x23,0x22,0x02,0x11,0x10,0x00,0x33,0x32, -0x17,0x15,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x03,0x60,0x84,0x9c,0xe8,0xf8,0x01,0x07,0xf7,0x87,0x7b,0x7e,0x84,0xfe,0xac,0x01,0x4a,0x8c,0x80,0xfe,0x77,0x56,0x01,0x7b,0x01,0x6c,0x01,0x7f,0x01,0x91,0x41,0xa4,0x5b,0xfd,0x86,0xfd,0x96,0x66,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x92,0x06,0x02,0x00,0x0b,0x00,0x15,0x00,0x21, -0x00,0x3f,0x40,0x24,0x16,0x63,0x40,0x1c,0x06,0x00,0x1c,0x63,0x14,0x30,0x11,0x95,0x00,0x16,0x0c,0x95,0x40,0x06,0x01,0x1f,0x62,0x19,0x0f,0x14,0x19,0x62,0x08,0x30,0x09,0x83,0x14,0x14,0x23,0x0f,0x83,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31, -0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x03,0x22,0x02,0x11,0x10,0x21,0x32,0x12,0x11,0x10,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x74,0xfe,0xfe,0xfe,0xee,0x01,0x1b,0x01,0x04,0x01,0x02,0x01,0x11,0xfe,0xe6,0xff,0xb4,0xbd,0x01,0x71,0xb4,0xbd,0xfe,0x8f,0x2f,0x40,0x40,0x2f, -0x2e,0x43,0x43,0x18,0x01,0x8c,0x01,0x76,0x01,0x7c,0x01,0x9c,0xfe,0x76,0xfe,0x86,0xfe,0x83,0xfe,0x67,0x05,0x8f,0xfe,0xb3,0xfe,0xc8,0xfd,0x80,0x01,0x4c,0x01,0x38,0x02,0x81,0xfd,0x0e,0x42,0x2f,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x00,0x03,0x00,0xa6,0x00,0x00,0x03,0x7f,0x04,0x00,0x00,0x0d,0x00,0x14,0x00,0x1b,0x00,0x40,0x40,0x23, -0x08,0x15,0x95,0x40,0x0f,0x01,0x00,0x0f,0x95,0x09,0x30,0x16,0x95,0x00,0x15,0x0e,0x95,0x01,0x0f,0x08,0x0a,0x0f,0x12,0x83,0x05,0x05,0x0a,0x83,0x19,0x19,0x1d,0x0f,0x16,0x84,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x33,0x11, -0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0x01,0x56,0xa4,0xb0,0xac,0xdb,0xca,0xaf,0xbc,0xa2,0xbe,0xb8,0xa8,0xba,0xd3,0xe3,0x04,0x00,0x85,0x79,0xac,0x35,0x05,0x27,0xca,0x89,0xa2,0x03,0x74,0xfe,0xe2,0x94,0x8a,0xfe,0x57,0xfe,0xc1, -0x9d,0xa2,0x00,0x02,0x00,0x5c,0xff,0xe8,0x04,0x02,0x04,0x18,0x00,0x10,0x00,0x24,0x00,0x42,0x40,0x24,0x00,0x12,0x95,0x40,0x11,0x06,0x0c,0x11,0x95,0x0c,0x30,0x18,0x95,0x0c,0x16,0x1e,0x95,0x06,0x10,0x00,0x0f,0x12,0x12,0x15,0x09,0x83,0x1b,0x1b,0x26,0x0f,0x21,0x83,0x03,0x15,0x83,0x0f,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f, -0xe1,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x26,0x35,0x34,0x25,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x01,0x2f,0xbd,0xd9,0xb5,0xee,0x01, -0x14,0xfe,0xe1,0xf3,0xc0,0xd4,0x02,0x10,0x56,0xfe,0xee,0x81,0x71,0xa6,0xbe,0xbf,0xa3,0x68,0x78,0x88,0x78,0x02,0x14,0x04,0x3d,0xa9,0x7e,0x9c,0xfe,0xe6,0xf4,0xf5,0xfe,0xd3,0x9e,0x8a,0xce,0x78,0x8e,0xaa,0x4f,0x5d,0xd2,0xc0,0xb9,0xd1,0x54,0x44,0x48,0x58,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x54,0x04,0xe2,0x00,0x27,0x00,0x57, -0x40,0x1c,0x12,0x95,0x40,0x15,0x1e,0x18,0x15,0x95,0x08,0x30,0x16,0x11,0x0f,0x95,0x18,0x16,0x07,0x09,0x00,0x02,0x96,0x25,0x09,0x95,0x1e,0x10,0x00,0x22,0xb8,0x01,0x03,0x40,0x10,0x04,0x06,0x13,0x13,0x11,0x0c,0x06,0x06,0x16,0x84,0x11,0x11,0x29,0x0c,0x83,0x1b,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x10, -0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x2f,0xfd,0xc6,0x10,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x04, -0x54,0x30,0x2a,0x5e,0x16,0x06,0x9c,0x8f,0xa8,0xd1,0xc5,0xa7,0x6e,0x4b,0xdf,0x01,0x7f,0xaf,0xb8,0xec,0xfe,0xe6,0x01,0x34,0xf5,0x51,0x49,0x05,0x70,0x56,0x3c,0x34,0x04,0x52,0x1a,0x76,0x42,0x68,0x06,0x48,0xe1,0xb3,0xb8,0xd0,0x26,0x01,0x04,0x8b,0xfe,0x17,0x56,0x01,0x18,0xf0,0xef,0x01,0x39,0x16,0x22,0x03,0x4c,0x6f,0x1a,0x00, -0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xe2,0x04,0x00,0x00,0x0b,0x00,0x35,0x40,0x1c,0x03,0x95,0x40,0x08,0x06,0x05,0x08,0x95,0x0c,0x30,0x0b,0x00,0x06,0x05,0x15,0x06,0x0f,0x09,0x08,0x04,0x00,0x84,0x01,0x01,0x0d,0x04,0x84,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a, -0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xe2,0xa4,0xfe,0x0c,0xa4,0xa4,0x01,0xf4,0xa4,0x01,0xc6,0xfe,0x3a,0x04,0x00,0xfe,0x52,0x01,0xae,0x00,0x00,0x03,0xff,0x18,0xfe,0x1e,0x02,0x38,0x05,0xd9,0x00,0x0b,0x00,0x1d,0x00,0x25,0x00,0x70,0xb7,0x1e,0x0e,0x0c,0x20,0x1b,0x18,0x16,0x1d,0xb8, -0xff,0xc0,0x40,0x36,0x13,0x16,0x48,0x1d,0x0c,0x0c,0x10,0x20,0x96,0x0f,0x16,0x1f,0x16,0x02,0x09,0x03,0x16,0x24,0x96,0x10,0x1c,0x06,0x63,0x40,0x00,0x19,0x0f,0x09,0x62,0x03,0x18,0x1b,0x03,0x62,0xff,0x30,0x0c,0x0c,0x1b,0x0e,0x1b,0x22,0x84,0x13,0x1e,0x1b,0x84,0x18,0x26,0x27,0x18,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x33,0x18, -0xd4,0xe1,0x12,0x39,0x10,0xc1,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0xd6,0x1a,0xed,0x3f,0xed,0x2f,0x5f,0x5e,0x5d,0xed,0x12,0x39,0x2f,0xcd,0x2b,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x26,0x27,0x02,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11, -0x33,0x11,0x16,0x17,0x25,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0xfa,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x01,0x11,0x7c,0x7e,0x2d,0xfe,0xf7,0x68,0x88,0xb5,0x91,0x27,0x21,0xa4,0x7a,0x74,0xfe,0x6e,0x24,0x24,0xae,0x62,0x8f,0x05,0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xf9,0x98,0x68,0x34,0xfe,0xe6,0x78,0x5e,0x6d,0x91,0x04, -0x04,0x12,0xfb,0xc2,0x2c,0x54,0x26,0x06,0x70,0x5a,0x00,0x01,0x00,0x04,0xfe,0x14,0x03,0x56,0x04,0x00,0x00,0x0c,0x00,0x2a,0x40,0x16,0x00,0x1c,0x02,0x06,0x0a,0x03,0x07,0x05,0x15,0x0c,0x0f,0x07,0x0f,0x0c,0x84,0x06,0x02,0x0a,0x0a,0x0e,0x05,0x07,0x2f,0xc6,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x3f, -0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x03,0x56,0xa4,0x04,0xfe,0x52,0xd7,0x01,0xdb,0xfe,0x00,0xe6,0x01,0xc4,0x04,0xa4,0xfe,0x14,0x03,0xc1,0xfe,0x2b,0x01,0xee,0x02,0x12,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xf8,0x04,0x00,0x00,0x05,0x00,0x19,0x40,0x0c,0x04,0x95, -0x01,0x15,0x02,0x0f,0x00,0x00,0x07,0x04,0x84,0x01,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x02,0xf8,0xfd,0xae,0xa4,0x01,0xae,0x04,0x00,0xfc,0x8c,0x00,0x02,0x00,0x60,0xfe,0x29,0x05,0x21,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x05,0x1b,0x13,0x07,0x10,0x24,0x95,0x0a, -0x16,0x1e,0x95,0x10,0x10,0x00,0x02,0x95,0x17,0x01,0x00,0x00,0x05,0x84,0x1a,0x13,0x07,0x07,0x28,0x21,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32, -0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xa4,0x04,0x6e,0xee,0xc2,0xea,0xff,0xd6,0xd3,0x60,0x04,0xb4,0x8a,0x48,0x2f,0xfe,0x4b,0xa7,0x7b,0x98,0xaa,0xa7,0x84,0x8b,0xae,0x05,0x5c,0x1b,0xcf,0xf9,0x81,0x02,0x85,0xc6,0x01,0x12,0xee,0x01, -0x00,0x01,0x30,0xa6,0x01,0x40,0x99,0xb7,0x12,0xfb,0xdb,0x9b,0x7b,0xad,0xde,0xc4,0xb3,0xc7,0xc2,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x02,0xe8,0x06,0x02,0x00,0x1f,0x00,0x50,0x40,0x2a,0x03,0x00,0x06,0x95,0x40,0x09,0x17,0x05,0x09,0x95,0x08,0x30,0x1a,0x0f,0x17,0x05,0x15,0x14,0x12,0x95,0x17,0x01,0x02,0x02,0x1a,0x04,0x07,0x07, -0x14,0x09,0x00,0x04,0x84,0x05,0x05,0x14,0x1a,0x83,0x0f,0x0f,0x21,0x14,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x34,0x36,0x37,0x36, -0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x89,0xc5,0xc5,0xa3,0xae,0xae,0x51,0x69,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x4e,0x41,0x02,0x04,0x8b,0xfe,0x87,0x01,0x79,0x8b,0x7a,0x9d,0x68,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f, -0x7b,0x4b,0x7d,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x02,0xcf,0x06,0x02,0x00,0x1f,0x00,0x4e,0x40,0x2a,0x0e,0x0b,0x11,0x95,0x40,0x14,0x1d,0x10,0x14,0x95,0x08,0x30,0x10,0x15,0x4f,0x00,0x01,0x00,0x02,0x95,0x1d,0x01,0x13,0x13,0x10,0x1a,0x0c,0x0c,0x00,0x14,0x0b,0x10,0x84,0x0f,0x0f,0x05,0x00,0x00,0x21,0x05,0x83,0x1a,0x2f,0xe1, -0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17, -0x02,0xcf,0x87,0x94,0x7a,0x90,0x32,0x72,0x6b,0x4d,0xb0,0xb0,0xa4,0xc6,0xc6,0x41,0x54,0x7a,0x4f,0xf0,0xc0,0x94,0x87,0x05,0x29,0x4e,0x78,0x59,0x38,0x72,0x75,0x6e,0x9d,0x78,0x8b,0xfe,0x87,0x01,0x79,0x8b,0x54,0x80,0x53,0x79,0x9f,0x5f,0x95,0xcb,0x3e,0x00,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x27,0x05,0xec,0x00,0x15,0x00,0x22, -0x00,0x25,0x00,0x4a,0x40,0x29,0x11,0x05,0x0e,0x20,0x95,0x08,0x16,0x25,0x01,0x95,0x04,0x15,0x00,0x23,0x95,0x14,0x0f,0x1a,0x95,0x0e,0x10,0x12,0x00,0x11,0x14,0x16,0x03,0x01,0x25,0x84,0x04,0x04,0x0b,0x23,0x00,0x03,0x03,0x27,0x1d,0x83,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0xc6,0x32,0x12,0x39,0x2f,0xe1,0x32,0x17,0x39,0x00,0x3f,0x3f, -0xed,0x3f,0xed,0x39,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x21,0x11,0x07,0x27,0xfd,0x9f,0x02,0x58,0xfc,0x4e,0x04,0x72,0xee,0xc2, -0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x17,0xfc,0x45,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0x02,0xc9,0xfd,0xdb,0x03,0xd1,0xfc,0xbb,0x8c,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0xfd,0xd7,0x87,0x7f,0xb1,0xdf,0xc3,0xac,0xce,0xcb,0x02,0x37,0xfd,0x0f,0x00,0x00,0x02,0x00,0x60,0xfe,0x21, -0x07,0x77,0x05,0xec,0x00,0x29,0x00,0x36,0x00,0x72,0x40,0x40,0x0b,0x0a,0x96,0x40,0x22,0x1f,0x28,0x22,0x96,0x08,0x30,0x01,0x03,0x95,0x28,0x1c,0x1c,0x10,0x19,0x34,0x95,0x13,0x16,0x0e,0x15,0x21,0x0c,0x95,0x1f,0x0f,0x2e,0x95,0x19,0x10,0x1d,0x00,0x22,0x0b,0x0b,0x06,0x01,0x0c,0x21,0x21,0x25,0x01,0x01,0x1c,0x1f,0x2a,0x03,0x0e, -0x84,0x0f,0x0f,0x16,0x25,0x83,0x06,0x06,0x38,0x31,0x83,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x17,0x39,0x39,0x2f,0x10,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x39,0x3f,0x3f,0xed,0x12,0x39,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x16,0x33, -0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xee,0xa4,0xb2,0xae,0xdf,0xdf,0xcd,0x52,0x01,0x7f,0xfd,0xbe, -0xa4,0x04,0x72,0xee,0xc2,0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x2e,0xfe,0x76,0xd7,0xec,0xfe,0xbd,0xf6,0xb6,0xfe,0xe4,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x95,0xa6,0x33,0x02,0x14,0xfc,0x8c,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0x33,0xfd,0xe1,0x1a, -0xe9,0xb5,0xcc,0xfe,0xf7,0x03,0xb6,0x87,0x7f,0xb1,0xdf,0xc3,0xac,0xce,0xcb,0x00,0x00,0x04,0x00,0x60,0xff,0x81,0x07,0xdb,0x05,0xec,0x00,0x22,0x00,0x2f,0x00,0x32,0x00,0x39,0x00,0xcb,0xb9,0x00,0x30,0xff,0xd8,0x40,0x4e,0x0b,0x10,0x01,0x4c,0x19,0x18,0x0b,0x10,0x01,0x4c,0x04,0x39,0x14,0x39,0x24,0x39,0x03,0x34,0x19,0x44,0x19, -0x02,0x06,0x19,0x16,0x19,0x26,0x19,0x03,0x09,0x13,0x07,0x10,0x2d,0x95,0x0a,0x16,0x02,0x00,0x00,0x32,0x33,0x03,0x06,0x19,0x38,0x96,0x40,0x1c,0x80,0x19,0x95,0x06,0x15,0x18,0x30,0x95,0x16,0x0f,0x27,0x95,0x40,0x10,0x10,0x14,0x00,0x30,0x18,0x18,0x1f,0x33,0x00,0x36,0x02,0x1a,0x05,0x1f,0x02,0xb8,0x01,0x03,0x40,0x0b,0x03,0x0f, -0x03,0x1f,0x03,0x02,0x0a,0x03,0x32,0x1f,0x03,0xb8,0x01,0x03,0x40,0x11,0x08,0x30,0x19,0x13,0x16,0x23,0x03,0x32,0x84,0x06,0x06,0x1f,0x0d,0x30,0x18,0x18,0x1f,0xb8,0x01,0x03,0xb5,0x36,0x36,0x3b,0x2a,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x32,0x2b,0x01,0x5f,0x5e,0x5d,0x10, -0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0xc0,0x18,0x2f,0x32,0x00,0x3f,0x3f,0x1a,0xed,0x3f,0xed,0x39,0x3f,0xfd,0x1a,0xdc,0x1a,0xed,0x11,0x12,0x17,0x39,0x10,0xce,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x5e,0x5d,0x5d,0x5d,0x2b,0x2b,0x21,0x06,0x07,0x23,0x36,0x37,0x21,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33, -0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x15,0x01,0x33,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x21,0x11,0x25,0x33,0x32,0x35,0x34,0x23,0x22,0x05,0xba,0x0c,0x04,0x90,0x04,0x0f,0xfe,0x3f,0x04,0x72,0xee,0xc2,0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x17, -0xfd,0x9f,0x92,0x86,0xf9,0x76,0x8e,0xac,0x9b,0xfc,0xd8,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0x02,0xc9,0xfd,0xdb,0x01,0xd8,0xae,0xb4,0x75,0x9d,0x39,0x46,0x3b,0x44,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0x2f,0xfc,0xbb,0x01,0x2e,0x78,0x5c,0x6b,0x7b,0x01,0xd7,0x87,0x7f,0xb1,0xdf,0xc3,0xac, -0xce,0xcb,0x02,0x37,0xfd,0x0f,0x09,0x5a,0x54,0x00,0x00,0x02,0x00,0x2b,0xff,0xe8,0x04,0x94,0x05,0x2f,0x00,0x1d,0x00,0x2c,0x00,0x53,0x40,0x2d,0x11,0x17,0x25,0x2b,0x04,0x09,0x23,0x95,0x1a,0x16,0x05,0x06,0x1f,0x06,0x00,0x95,0x03,0x0f,0x0c,0x0e,0x95,0x09,0x10,0x1e,0x07,0x0c,0x11,0x83,0x2b,0x2b,0x17,0x1f,0x0c,0x0c,0x17,0x83, -0x25,0x25,0x2e,0x02,0x1f,0x00,0x06,0x84,0x03,0x2f,0xe1,0x39,0x39,0xcd,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14, -0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x23,0x11,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0xdb,0xb0,0xb0,0xa4,0x01,0x73,0x46,0x54,0x7c,0x60,0x64,0x85,0x52,0x60,0x47,0x7a,0x94,0x72,0xf1,0xef,0xfb,0xde,0x01,0x6d,0xc9,0x9f,0x9e,0x01,0x30,0x59,0x79,0x8a,0x6b,0x03,0x74,0x8c,0xfa,0x35, -0xfe,0xd1,0x18,0x2e,0xa6,0x4a,0x4f,0x3f,0x3e,0x4b,0x33,0x40,0x8c,0x62,0x84,0xaa,0xcd,0xd7,0x01,0xe8,0xfe,0x24,0x9d,0x89,0xa0,0x39,0x4b,0x30,0x38,0x8b,0x69,0x48,0x00,0x02,0x00,0x2b,0xfe,0x1e,0x04,0x3e,0x06,0x02,0x00,0x22,0x00,0x2a,0x00,0x49,0x40,0x27,0x0b,0x0d,0x95,0x08,0x1c,0x23,0x29,0x95,0x12,0x16,0x1a,0x1b,0x25,0x1b, -0x15,0x95,0x18,0x0f,0x00,0x02,0x95,0x20,0x01,0x00,0x00,0x04,0x84,0x0b,0x24,0x10,0x1c,0x1c,0x2c,0x25,0x15,0x1b,0x84,0x17,0x18,0x2f,0xcd,0xe1,0x39,0x39,0x12,0x39,0x2f,0x33,0x33,0xc4,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14, -0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x04,0x3e,0x32,0x3d,0xaa,0xb9,0x8f,0x4b,0x2c,0x32,0x3d,0xac,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xb8,0x8d,0x4c,0x2c,0xfe,0x43,0xfe, -0xfe,0x46,0x51,0x3e,0x05,0x5c,0x1b,0xdf,0xfa,0xe7,0xa3,0xbe,0x13,0x93,0x1a,0xdf,0x81,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0xa0,0xa2,0xc0,0x12,0xfa,0xa6,0x02,0xde,0xfd,0xbf,0x67,0x58,0x00,0x00,0x02,0x00,0x2b,0xff,0xe8,0x05,0xaa,0x05,0x2f,0x00,0x2b,0x00,0x34,0x00,0x77,0x40,0x41,0x22,0x13,0x24,0x13,0x00,0x2a, -0x18,0x33,0x96,0x0f,0x24,0x1f,0x24,0x02,0x24,0x24,0x18,0x2e,0x96,0x2a,0x16,0x11,0x95,0x02,0x16,0x0a,0x0b,0x0e,0x0b,0x05,0x95,0x08,0x0f,0x1b,0x1d,0x95,0x18,0x10,0x0c,0x2c,0x22,0x31,0x20,0x13,0x00,0x27,0x20,0x83,0x15,0x15,0x27,0x0e,0x1b,0x1b,0x27,0x84,0x31,0x31,0x36,0x0e,0x05,0x0b,0x84,0x07,0x08,0x2f,0xcd,0xe1,0x39,0x39, -0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0xc4,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14, -0x33,0x32,0x37,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x03,0x18,0xa0,0x8a,0xfe,0xed,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x93,0x4a,0x66,0x58,0x01,0x22,0xf3,0x87,0x66,0x72,0x81,0x9e,0xc9,0x38,0xd2, -0x86,0x75,0x93,0xbd,0x9b,0xba,0x02,0x54,0x70,0x54,0x66,0x78,0x60,0x52,0x6a,0x01,0x3d,0x02,0x4f,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xc1,0xc3,0x42,0x84,0xb0,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0x81,0x61,0x96,0x7a,0x5b,0x67,0x86,0xc6,0x42,0x3a,0x2b,0x56,0x00,0x00,0x01,0x00,0x35,0xfe,0x1e,0x05,0xc8,0x06,0x02,0x00,0x2e, -0x00,0x58,0x40,0x30,0x06,0x08,0x95,0x03,0x1c,0x28,0x2b,0x12,0x15,0x16,0x15,0x0d,0x95,0x2b,0x10,0x26,0x14,0x17,0x95,0x1a,0x0f,0x21,0x23,0x95,0x1e,0x01,0x06,0x06,0x0a,0x21,0x21,0x28,0x11,0x84,0x12,0x12,0x1a,0x00,0x84,0x0a,0x0a,0x30,0x17,0x14,0x26,0x84,0x19,0x1a,0x2f,0xcd,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f, -0xe1,0x32,0x39,0x2f,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15, -0x15,0x21,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x05,0xc8,0xbe,0xae,0x4c,0x35,0x3d,0x44,0xc9,0xed,0x7c,0xa2,0xa3,0xf0,0xa3,0xaf,0xaf,0xbf,0x97,0x4f,0x33,0x3a,0x40,0xbb,0x01,0x93,0x04,0x74,0xdc,0xa8,0xb2,0x04,0xe7,0xf7,0x1a,0x99,0x27,0x01,0x3e,0x02,0x60,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x03,0x74,0xfc,0x8c,0x03,0x74,0x8c,0x92, -0xa8,0xc8,0x16,0x94,0x1f,0xee,0x89,0xaa,0xc2,0xd8,0xce,0x00,0x00,0x01,0x00,0x98,0xff,0xe8,0x04,0x50,0x05,0xfc,0x00,0x24,0x00,0x3c,0x40,0x21,0x07,0x0d,0x18,0x1e,0x04,0x10,0x05,0x95,0x21,0x16,0x13,0x15,0x95,0x10,0x10,0x00,0x01,0x18,0x83,0x0d,0x0d,0x1e,0x00,0x13,0x13,0x1e,0x83,0x07,0x07,0x26,0x01,0x84,0x00,0x2f,0xe1,0x12, -0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x33,0x11,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x98,0xa4,0x9f,0xa0,0x01, -0x2d,0x58,0x79,0x8c,0x69,0xc8,0x9e,0x7c,0x61,0x65,0x84,0x52,0x61,0x47,0x7a,0x97,0x6f,0xf1,0xef,0xfb,0xdd,0x05,0xfc,0xfb,0x9c,0x9d,0x89,0xa0,0x39,0x4b,0x30,0x39,0x89,0x6a,0x81,0xa5,0x2e,0xa6,0x4a,0x4f,0x3f,0x3e,0x4b,0x33,0x41,0x8b,0x62,0x86,0xa8,0xcc,0xd8,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x60,0x05,0xec,0x00,0x08, -0x00,0x0b,0x00,0x2b,0x40,0x16,0x0b,0x01,0x95,0x04,0x15,0x00,0x09,0x95,0x07,0x0f,0x05,0x00,0x09,0x00,0x03,0x03,0x0d,0x01,0x07,0x0b,0x84,0x04,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xc6,0x32,0x00,0x3f,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x07,0x21,0x11,0x04,0x60,0xfd,0xa0,0x02, -0x58,0xfc,0x4e,0xa4,0x03,0x16,0xf2,0xfd,0xdc,0x03,0xd1,0xfc,0xbb,0x8c,0x05,0xec,0xfe,0x14,0x8c,0xfd,0x0f,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x03,0xc2,0x05,0x9a,0x00,0x1b,0x00,0x37,0x00,0x22,0x40,0x10,0x27,0x0e,0x40,0x26,0x12,0x0a,0x0b,0x42,0x0a,0x0b,0x03,0x00,0x1c,0x39,0x0b,0x27,0x2f,0x33,0x10,0xc6,0x32,0x00,0x3f,0xcd, -0x2b,0x00,0x18,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x13,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13, -0x03,0xc2,0xb6,0x93,0x6b,0x09,0x05,0x04,0x03,0x0f,0x73,0x91,0xb5,0x8b,0x6b,0x09,0x03,0x05,0x02,0x10,0x76,0x8c,0x6c,0x08,0x04,0x04,0x01,0x10,0x67,0x82,0xb6,0x93,0x6b,0x09,0x05,0x04,0x03,0x0f,0x73,0x91,0xb5,0x8b,0x6b,0x09,0x03,0x05,0x02,0x10,0x76,0x8c,0x6c,0x08,0x04,0x04,0x01,0x10,0x67,0x05,0x9a,0xfd,0x78,0x01,0x90,0x21, -0x3b,0x24,0x36,0xfe,0x6e,0x02,0x88,0xfe,0x5a,0x24,0x34,0x21,0x39,0x01,0xa4,0xfe,0x5a,0x20,0x38,0x16,0x42,0x01,0xa6,0xfc,0xed,0xfd,0x79,0x01,0x90,0x21,0x3b,0x24,0x36,0xfe,0x6e,0x02,0x87,0xfe,0x5b,0x24,0x35,0x21,0x3a,0x01,0xa3,0xfe,0x5b,0x20,0x39,0x17,0x42,0x01,0xa5,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x03,0x7f,0x05,0x9a, -0x00,0x07,0x00,0x0f,0x00,0x37,0x40,0x1c,0x0b,0x96,0x0e,0x08,0x0d,0x12,0x00,0x05,0x03,0x96,0x06,0x03,0x01,0x00,0x08,0x09,0x05,0x04,0x0c,0x0d,0x08,0x7f,0x09,0x09,0x11,0x0c,0x7f,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0xcd,0x32,0x3f,0x33,0xdd,0xed,0x31,0x30,0x01,0x23,0x11, -0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x03,0x7f,0x89,0xfe,0x06,0x88,0x03,0x0b,0x89,0xfe,0x06,0x88,0x03,0x0b,0x03,0xa2,0x01,0x74,0xfe,0x8c,0x01,0xf8,0xfa,0x66,0x01,0x74,0xfe,0x8c,0x01,0xf8,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x14,0x05,0xfc,0x00,0x13,0x00,0x23,0x00,0x3d,0x40,0x20,0x01,0x00, -0x14,0x96,0x15,0x15,0x1f,0x1a,0x95,0x0e,0x01,0x1f,0xec,0x07,0x16,0x01,0x14,0x11,0x83,0x18,0x14,0x18,0x14,0x1d,0x04,0x83,0x22,0x22,0x25,0x1d,0x84,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x15,0x16,0x16,0x15,0x14,0x06, -0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x35,0x36,0x36,0x35,0x34,0x23,0x22,0x11,0x11,0x10,0x21,0x32,0x36,0x35,0x10,0x02,0x9e,0xb4,0xc2,0xf7,0xcd,0xcd,0xdd,0xda,0xbc,0xa6,0xc6,0x95,0xfe,0xdf,0x78,0x98,0xd1,0xe7,0x01,0x10,0x83,0x8f,0x03,0x38,0x05,0x1d,0xd8,0xa6,0xc3,0xed,0xfb,0xea,0x02,0x8d, -0xbe,0xe4,0xb9,0x9b,0x7e,0xcc,0x78,0x82,0x14,0xa5,0x73,0xdc,0xfe,0xda,0xfd,0x87,0xfe,0xa6,0x90,0x87,0x01,0x30,0x00,0x02,0x00,0x14,0xff,0xe8,0x04,0xc4,0x06,0x02,0x00,0x2a,0x00,0x32,0x00,0x6b,0x40,0x3b,0x02,0x20,0x00,0x28,0x2b,0x00,0xec,0x2a,0x2b,0xec,0x20,0x20,0x1d,0x10,0x0e,0x95,0x13,0x10,0x2d,0x95,0x26,0x01,0x1d,0xec, -0x05,0x16,0x30,0x84,0x23,0x40,0x0b,0x0e,0x48,0x23,0x23,0x2b,0x0c,0x2a,0x2a,0x28,0x02,0x28,0x08,0x20,0x2b,0x1a,0x84,0x08,0x16,0x84,0x0c,0x0c,0x10,0x28,0x84,0x2b,0x2b,0x34,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x11,0x12,0x39,0x10,0xca,0x2f,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x00,0x3f,0xed,0x3f, -0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x06,0x07,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x13,0x26,0x00,0x35,0x34,0x36,0x33,0x20,0x13,0x36,0x37,0x05,0x02,0x23,0x22, -0x06,0x15,0x14,0x16,0x04,0xc4,0x42,0x59,0x0b,0xfe,0xed,0xea,0xbe,0xdc,0x16,0x15,0x58,0x26,0x20,0x32,0x31,0x65,0x7a,0x15,0x16,0x89,0x75,0x9e,0xb5,0x09,0xeb,0xfe,0xda,0xad,0x87,0x01,0x70,0x13,0x4d,0x4c,0xfe,0xc3,0x0e,0xd3,0x3f,0x4f,0xc7,0x02,0xe6,0x19,0x0f,0xfe,0xa6,0xfe,0x84,0xdc,0xc1,0x55,0x81,0x81,0x3a,0x78,0x11,0x89, -0x12,0x8a,0x6b,0x3f,0x81,0x81,0x50,0x84,0x97,0x01,0x29,0x01,0x12,0x08,0x01,0x18,0xd0,0x97,0xc9,0xfd,0x4a,0x0c,0x1f,0x35,0x02,0x35,0x71,0x5a,0x98,0xc9,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xb8,0x05,0xb2,0x00,0x16,0x00,0x4f,0x40,0x27,0x12,0x0d,0x14,0x03,0x05,0x02,0x08,0x05,0x0d,0x0d,0x0a,0x07,0x00,0x02,0x91,0x14,0x04,0x0a, -0x03,0x07,0x00,0x12,0x00,0x03,0x03,0x18,0x05,0x0a,0x09,0x09,0x17,0x0e,0x0d,0x05,0x7e,0x08,0x08,0x18,0x17,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x11,0x33,0x33,0x2f,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x33,0x11,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x07, -0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x36,0x33,0x32,0x17,0x04,0xb8,0x2c,0x2c,0x52,0x60,0xfe,0xd9,0xa8,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x08,0x1a,0xc7,0x4b,0x8c,0x5e,0x36,0x2c,0x05,0x06,0x14,0xbe,0xfd,0xb2,0xfd,0xf2,0x02,0x0e,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x1c,0x3c,0x01,0x8e,0x96, -0x7c,0x14,0xff,0xff,0xff,0xb1,0x00,0x00,0x05,0xa0,0x05,0xb2,0x00,0x27,0x05,0xb5,0x00,0xe8,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xe3,0xff,0x99,0x00,0x14,0xb3,0x01,0x17,0x03,0x01,0xb8,0xff,0xc4,0xb4,0x17,0x17,0x09,0x09,0x25,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xb8,0x06,0xf7,0x02,0x26,0x05,0xb5, -0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x96,0x01,0x70,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd1,0x40,0x0a,0x26,0x20,0x09,0x16,0x25,0x02,0x01,0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x03,0x00,0x60,0xfe,0x29,0x04,0xba,0x05,0xec,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x45,0x40,0x25,0x0a,0x00,0x12,0x1a,0x95,0x0c, -0x09,0x10,0x02,0x1b,0x13,0x19,0x95,0x40,0x00,0x03,0x16,0x0f,0x83,0x16,0x0e,0x00,0x1d,0x03,0x42,0x13,0x0c,0x00,0x84,0x19,0x09,0x03,0x03,0x21,0x1d,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x32,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x31,0x30,0x05,0x11,0x23, -0x11,0x26,0x02,0x35,0x34,0x00,0x37,0x11,0x33,0x11,0x16,0x12,0x15,0x14,0x00,0x03,0x11,0x36,0x36,0x35,0x34,0x26,0x01,0x11,0x06,0x06,0x15,0x14,0x16,0x02,0xdf,0xa3,0xdd,0xff,0x01,0x04,0xd8,0xa3,0xdf,0xfc,0xfe,0xfe,0xd9,0x93,0xa0,0xa0,0xfe,0xca,0x91,0xa3,0xa3,0x18,0xfe,0x41,0x01,0xbf,0x11,0x01,0x22,0xdf,0xe7,0x01,0x20,0x17, -0x01,0xd4,0xfe,0x2c,0x10,0xfe,0xe1,0xe5,0xe3,0xfe,0xdc,0x03,0x91,0xfc,0xe4,0x12,0xd0,0xac,0xab,0xd1,0xfc,0xf6,0x03,0x1c,0x12,0xd2,0xac,0xa6,0xd3,0x00,0x00,0x02,0x00,0x00,0xff,0xea,0x06,0x2d,0x04,0x00,0x00,0x16,0x00,0x28,0x00,0x69,0x40,0x38,0x08,0x0b,0x20,0x20,0x0b,0x0f,0x12,0x01,0x09,0x04,0x12,0x18,0x01,0x10,0x95,0x15, -0x0f,0x24,0x1d,0xec,0x06,0x0b,0x16,0x17,0x83,0x01,0x01,0x03,0x18,0x83,0x10,0x0e,0x40,0x00,0x00,0x03,0x83,0x27,0x0e,0x22,0x1a,0x1f,0x42,0x09,0x08,0x22,0x84,0x1f,0x1f,0x2a,0x1a,0x83,0x0e,0x0e,0x2a,0x12,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x39,0x2b,0x01,0x10,0xf2,0xe1,0x32,0x18,0x2f,0x1a,0x10,0xdd,0xe1,0x10, -0xc9,0x2f,0xe1,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x32,0x32,0x32,0x5f,0x5e,0x5d,0x11,0x39,0x2f,0x11,0x39,0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x22,0x07,0x35,0x36,0x33,0x21,0x05,0x21,0x06,0x15,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x15,0x10,0x33,0x32,0x36,0x35,0x34, -0x06,0x2d,0xb6,0x83,0xd5,0xbf,0xcf,0x64,0x04,0x67,0xce,0xb9,0xd1,0x84,0x7e,0x76,0x6a,0x96,0x05,0x2d,0xfe,0xa0,0xfc,0xd1,0x88,0x7b,0x6d,0xe8,0xa1,0xe5,0x6c,0x7c,0x03,0x74,0xdc,0xda,0xda,0xfa,0xbe,0xbe,0xfb,0xd9,0xd5,0xe1,0x58,0x9c,0x48,0x8c,0xe6,0xd6,0x96,0xa9,0x01,0x5a,0xfc,0xfc,0xfe,0xa6,0xaa,0x95,0xd6,0x00,0x00,0x01, -0x00,0x00,0xfe,0x96,0x04,0x90,0x04,0x18,0x00,0x33,0x00,0x83,0x40,0x28,0x06,0x08,0x95,0x40,0x03,0x34,0x80,0x11,0x29,0x27,0x15,0x29,0x15,0x17,0x2b,0x1f,0x1d,0x95,0x22,0x10,0x2b,0x0f,0x33,0x31,0x95,0x40,0x0c,0x16,0x17,0x29,0x11,0x2b,0x0f,0x27,0x15,0x25,0x17,0x06,0x06,0x0b,0xb8,0x01,0x2e,0x40,0x1a,0x33,0x2b,0x83,0x2c,0x2c, -0x00,0x2e,0x84,0x0f,0x0e,0x33,0x17,0x83,0x18,0x18,0x1a,0x1f,0x1f,0x25,0x42,0x25,0x84,0x1a,0x1a,0x35,0x1f,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0xe1,0x2f,0xf0,0xe1,0x11,0x39,0x2f,0xe1,0x10,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x1a,0xed,0x32,0x3f,0x3f,0xed,0x32,0x11, -0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x1a,0x10,0xdc,0x1a,0xed,0x32,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x35,0x26,0x26,0x35,0x34,0x37,0x06,0x07,0x06,0x07,0x06,0x07,0x23,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x00,0x37,0x36,0x37,0x33,0x02,0x15,0x14,0x16, -0x33,0x32,0x37,0x04,0x90,0x98,0x7d,0x3f,0x34,0x34,0x3b,0x39,0x46,0x77,0x85,0x14,0x06,0xf1,0x94,0x56,0x14,0x27,0xac,0xb0,0x56,0x50,0x2a,0x26,0x32,0x3e,0x8a,0x9c,0x15,0x01,0x8d,0x54,0x14,0x28,0xac,0xb0,0x57,0x4f,0x2a,0x26,0x44,0x87,0x9f,0x18,0x92,0x1f,0x57,0x48,0x2a,0x10,0xdb,0xb0,0x69,0x6a,0x06,0xdb,0x87,0x62,0x35,0x59, -0x01,0x72,0xf4,0x89,0x9f,0x15,0x89,0x16,0xde,0xbf,0x69,0x6a,0x01,0x65,0x65,0x35,0x59,0xfe,0x8e,0xf4,0x8c,0x9c,0x0f,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x05,0x48,0x05,0xb2,0x00,0x0e,0x00,0x1a,0x00,0x3c,0x40,0x1f,0x15,0x91,0x00,0x03,0x03,0x02,0x0f,0x91,0x40,0x09,0x04,0x02,0x0c,0x7d,0x18,0x0e,0x01,0x12,0x02,0x42,0x12,0x7d, -0x06,0x06,0x1b,0x01,0x7e,0x02,0x02,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x3f,0x1a,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x26,0x00,0x35,0x34,0x00,0x21,0x20,0x00,0x15,0x14,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03, -0x23,0xa8,0xfc,0xfe,0xd7,0x01,0x63,0x01,0x18,0x01,0x1e,0x01,0x59,0xfe,0xd2,0xfe,0xb5,0xd2,0xf7,0xf8,0xd1,0xd2,0xf7,0xf7,0x01,0x64,0xfe,0x9c,0x01,0x64,0x17,0x01,0x29,0xdf,0xf1,0x01,0x3e,0xfe,0xcf,0xf1,0xde,0xfe,0xcc,0x03,0x9c,0xde,0xb3,0xb1,0xe0,0xde,0xb3,0xb1,0xe0,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x50,0x04,0x18, -0x00,0x0e,0x00,0x1a,0x00,0x3a,0x40,0x1f,0x0f,0x95,0x09,0x10,0x02,0x1b,0x15,0x96,0x40,0x00,0x03,0x16,0x0c,0x83,0x18,0x0e,0x00,0x12,0x03,0x42,0x00,0x84,0x03,0x03,0x1c,0x12,0x83,0x06,0x06,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x3f,0x3f,0xed,0x31,0x30, -0x05,0x11,0x23,0x11,0x26,0x02,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x02,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xaa,0xa4,0xc5,0xe1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xe2,0xfe,0xf0,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x14,0xfe,0x3d,0x01,0xc3,0x18,0x01,0x18,0xd8,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa, -0xdc,0xfe,0xe0,0x03,0x86,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x00,0x02,0x00,0x5e,0xfe,0xae,0x04,0xa8,0x06,0x60,0x00,0x20,0x00,0x21,0x00,0x4d,0xb9,0x00,0x0d,0xff,0xd8,0x40,0x0f,0x13,0x1d,0x48,0x01,0x22,0x80,0x11,0x16,0x1c,0x0b,0x07,0x22,0x21,0x04,0x1c,0xb8,0xff,0xf0,0x40,0x15,0x10,0x16,0x48,0x1c,0x06,0x13,0x1f, -0x7e,0x01,0x03,0x03,0x08,0x13,0x7e,0x10,0x0e,0x0e,0x23,0x1a,0x7d,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0x33,0x2b,0x3f,0x12,0x39,0x39,0x12,0x39,0xc4,0x1a,0x10,0xce,0x31,0x30,0x2b,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x24,0x11,0x10,0x00,0x37,0x24,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14, -0x06,0x07,0x06,0x06,0x02,0x15,0x10,0x05,0x16,0x16,0x15,0x14,0x13,0x04,0x44,0xb4,0x4f,0x88,0xa3,0xfd,0xaa,0x01,0x15,0xfb,0x01,0x28,0x62,0x08,0x97,0x0d,0x84,0xca,0xca,0xdf,0x8f,0x01,0xcf,0xef,0xbb,0x21,0xfe,0xae,0x54,0x4c,0x3a,0x45,0x1b,0x62,0x02,0x68,0x01,0x13,0x01,0x79,0x47,0x3e,0x37,0x2f,0x1b,0x1c,0x24,0x28,0x5d,0x6c, -0x2f,0x2d,0x6e,0xfe,0xfa,0xbf,0xfe,0x23,0x57,0x2d,0x80,0x77,0x5a,0x06,0xa8,0x00,0x00,0x02,0x00,0x60,0xfe,0xc4,0x03,0xa4,0x04,0xc6,0x00,0x1e,0x00,0x1f,0x00,0x4f,0xb9,0x00,0x17,0xff,0xd8,0x40,0x1f,0x13,0x1d,0x48,0x1b,0x01,0x10,0x10,0x16,0x48,0x01,0x15,0x15,0x20,0x1f,0x10,0x0c,0x20,0x80,0x06,0xec,0x11,0x15,0x0b,0x0c,0x0c, -0x09,0x84,0x0e,0x0e,0x13,0x1d,0xb8,0x01,0x2e,0xb6,0x1a,0x18,0x18,0x21,0x04,0x83,0x13,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x11,0x33,0x00,0x3f,0xed,0x1a,0x10,0xce,0x3f,0x12,0x39,0x11,0x33,0x2b,0xc4,0x31,0x30,0x2b,0x01,0x0e,0x02,0x15,0x14,0x05,0x16,0x16,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x27, -0x24,0x11,0x10,0x25,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x37,0x03,0x10,0xb1,0xe2,0x75,0x01,0x25,0xc4,0xa3,0x50,0xb4,0x62,0x73,0x8d,0xfe,0x6e,0x01,0x52,0xd4,0x7a,0x0a,0x98,0x0c,0x0a,0x03,0xbe,0x36,0x5f,0xc8,0x94,0xfd,0x3a,0x28,0x7d,0x76,0x5f,0x58,0x50,0x54,0x3f,0x40,0x19,0x48,0x01,0x70,0x01,0x9e,0x8e,0x41,0x38, -0x33,0x1c,0x1a,0x24,0x25,0x85,0x20,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa8,0x05,0x9a,0x00,0x11,0x00,0x38,0x40,0x0d,0x01,0x06,0x91,0x0d,0x0d,0x08,0x0c,0x91,0x09,0x03,0x08,0x01,0x10,0xb8,0x01,0x2c,0x40,0x0d,0xaf,0x03,0x01,0x03,0x03,0x08,0x0b,0x0b,0x13,0x0d,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f, -0x5d,0xe1,0xc6,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x23,0x36,0x35,0x34,0x23,0x21,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x21,0x32,0x15,0x14,0x03,0x70,0x8c,0x08,0x69,0xfe,0xe1,0xa8,0x02,0xec,0xfd,0xbc,0x01,0x25,0xf6,0x02,0x0e,0x1e,0x28,0x5a,0xfd,0x52,0x05,0x9a,0x98,0xfe,0x40,0xce,0x34,0x00,0x00,0x01, -0x00,0x90,0xfe,0x29,0x03,0x54,0x04,0x18,0x00,0x0e,0x00,0x2a,0x40,0x15,0x07,0x95,0x04,0x04,0x0f,0x01,0x95,0x0d,0x10,0x09,0x1b,0x05,0x05,0x00,0x00,0x10,0x04,0x04,0x07,0x84,0x0a,0x2f,0xe1,0x32,0x11,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x23,0x20,0x11,0x15,0x21,0x15,0x21,0x11,0x23, -0x11,0x34,0x12,0x33,0x33,0x03,0x54,0xee,0xfe,0xcd,0x01,0xf8,0xfe,0x08,0xa3,0xf4,0xe4,0xec,0x03,0x8e,0xfe,0xb0,0x4c,0x8c,0xfc,0xc3,0x04,0x02,0xea,0x01,0x03,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x04,0x7d,0x05,0x9a,0x00,0x07,0x00,0x36,0x40,0x1b,0x04,0x91,0x40,0x07,0x05,0x02,0x07,0x91,0x2b,0x30,0x05,0x03,0x02,0x03,0x00,0x02, -0x07,0x06,0x04,0x02,0x00,0x06,0x04,0x00,0x00,0x09,0x04,0x2f,0x12,0x39,0x2f,0x10,0xcd,0x10,0xcd,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x01,0x23,0x13,0x21,0x01,0x33,0x03,0x04,0x7d,0xfe,0xdb,0xb4,0xf2,0xfc,0xb2,0x01,0x1c,0xb4,0xe9,0x03,0x25,0xfc,0xdb,0x02,0x8e,0x03,0x0c, -0xfd,0x8b,0x00,0x01,0x00,0x33,0xfe,0x1e,0x03,0xd1,0x06,0x02,0x00,0x23,0x00,0x5e,0x40,0x32,0x12,0x95,0x40,0x23,0x1d,0x0b,0x23,0x95,0x2b,0x30,0x1a,0x18,0x95,0x1d,0x01,0x08,0x06,0x95,0x40,0x0b,0x1c,0x11,0x00,0x0e,0x08,0x08,0x00,0x03,0x84,0x0e,0x0e,0x00,0x1a,0x1a,0x15,0x12,0x12,0x20,0x42,0x23,0x12,0x20,0x84,0x15,0x15,0x00, -0x00,0x25,0x12,0x24,0x10,0xce,0x11,0x39,0x2f,0x39,0x2f,0xe1,0x11,0x39,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x10,0xf1,0xe1,0x11,0x39,0x2f,0x11,0x12,0x39,0x00,0x3f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x03,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x37, -0x21,0x13,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x03,0x07,0x03,0xd1,0x5d,0x7a,0x41,0x39,0x2b,0x21,0x2c,0x38,0x74,0x92,0x81,0x21,0xfd,0x3b,0x5d,0x7a,0x41,0x39,0x2a,0x22,0x2c,0x38,0x74,0x92,0x81,0x21,0x02,0x56,0xfe,0xfc,0xfe,0xab,0x91,0x56,0x6c,0x14,0x89,0x17,0xb3,0x87,0xaa,0x01,0x6c,0x5d, -0x01,0x04,0x01,0x55,0x90,0x5a,0x69,0x15,0x8a,0x16,0xb2,0x88,0xaa,0xfe,0x94,0x5c,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x85,0x05,0xb2,0x00,0x18,0x00,0x94,0x40,0x5c,0x5d,0x05,0x6d,0x05,0x7d,0x05,0x03,0x05,0x08,0x0a,0x0d,0x0e,0x04,0x0e,0x2c,0x04,0x5c,0x04,0x02,0x04,0x0e,0x01,0x5b,0x08,0x01,0x06,0x05,0x08,0x03,0x07,0x29,0x0d, -0x01,0x29,0x0a,0x79,0x0a,0x89,0x0a,0x03,0x0b,0x0a,0x0d,0x03,0x0c,0x0a,0x07,0x01,0x05,0x0c,0x01,0x5f,0x0c,0x01,0x07,0x0c,0x07,0x0c,0x0f,0x01,0x11,0x0f,0x91,0x14,0x04,0x06,0x07,0x07,0x0b,0x0f,0x0c,0x01,0x0c,0x0c,0x3a,0x0e,0x01,0x0e,0x05,0x08,0x0a,0x0d,0x04,0x06,0x11,0x01,0x17,0x7d,0x03,0x03,0x1a,0x11,0x2f,0x12,0x39,0x2f, -0xe1,0x33,0x12,0x17,0x39,0x5d,0x39,0x2f,0x5d,0x33,0x33,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x17,0x33,0x5d,0x5d,0x11,0x17,0x33,0x5d,0x11,0x39,0x39,0x5d,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x00,0x5d,0x21,0x23,0x12,0x11,0x34,0x27,0x01,0x27,0x01,0x26,0x27,0x01,0x27,0x01, -0x26,0x23,0x22,0x07,0x35,0x36,0x21,0x20,0x00,0x11,0x10,0x03,0xfc,0xba,0x97,0x0e,0xfe,0x4d,0x54,0x01,0xe4,0x20,0x32,0xfd,0xfa,0x56,0x02,0x00,0x7c,0xb1,0xff,0xce,0xd2,0x01,0x03,0x01,0x3c,0x01,0x74,0x01,0x01,0x01,0x4d,0x58,0x5a,0xfe,0xae,0x6c,0x01,0x7c,0x60,0x4e,0xfe,0x6c,0x6c,0x01,0x92,0x6c,0xda,0xc2,0xb0,0xfe,0x1a,0xfe, -0x94,0xfe,0xc4,0x00,0x00,0x01,0xff,0x7b,0xfe,0x29,0x03,0x77,0x06,0x02,0x00,0x14,0x00,0x8d,0x40,0x5a,0x05,0x08,0x0a,0x0d,0x0e,0x04,0x0e,0x06,0x08,0x05,0x03,0x07,0x66,0x0d,0x01,0x0a,0x0d,0x01,0x0a,0x0a,0x01,0x0b,0x0d,0x0a,0x03,0x0c,0x16,0x07,0x76,0x07,0x02,0x07,0x76,0x0c,0x01,0x1d,0x0c,0x01,0x0c,0x0b,0x0e,0x7b,0x0e,0x02, -0x0c,0x04,0x2c,0x04,0x5c,0x04,0x6c,0x04,0xcc,0x04,0xdc,0x04,0x06,0x0e,0x0c,0x07,0x04,0x04,0x01,0x1b,0x0f,0xee,0x10,0x01,0x06,0x07,0x07,0x0b,0x0c,0x0c,0x04,0x0e,0x01,0x05,0x08,0x0a,0x0d,0x04,0x0f,0x13,0x84,0x03,0x03,0x16,0x15,0x0f,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x33,0x39,0x39,0x39,0x2f,0x33,0x33,0x2f,0x33, -0x00,0x3f,0xed,0x3f,0x17,0x39,0x5d,0x5d,0x2f,0x5d,0x5d,0x2f,0x5d,0x11,0x17,0x33,0x5d,0x5d,0x5d,0x11,0x17,0x33,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x01,0x23,0x12,0x11,0x34,0x27,0x05,0x27,0x25,0x26,0x27,0x05,0x27,0x25,0x02,0x25,0x35,0x04,0x00,0x11,0x10,0x02,0xa4,0xbc,0xed,0x08,0xfe,0x2f,0x31,0x01,0xe7,0x1e,0x3e, -0xfe,0x1a,0x30,0x01,0xd0,0xfa,0xfe,0x65,0x01,0xc2,0x02,0x3a,0xfe,0x29,0x01,0x4b,0x01,0x8a,0x4f,0x41,0xaa,0x82,0xb2,0x7c,0x7a,0xb2,0x81,0xac,0x01,0x88,0x4b,0xa6,0x58,0xfd,0x27,0xfe,0x2f,0xfe,0x94,0x00,0x00,0x01,0x00,0xb8,0xfe,0x1e,0x06,0x66,0x05,0x9a,0x00,0x2f,0x00,0x85,0x40,0x4b,0x3a,0x23,0x01,0x0c,0x91,0x00,0x07,0x10, -0x07,0x02,0x09,0x03,0x07,0x03,0x0a,0x91,0x09,0x10,0x91,0x09,0x03,0x1c,0x0d,0x18,0x01,0x0d,0x04,0x18,0x14,0x1e,0x2a,0x22,0x91,0x40,0x16,0x1a,0x13,0x2e,0x26,0x1e,0x03,0x03,0x10,0x10,0x40,0x09,0x14,0x48,0x10,0x02,0x13,0x0a,0x18,0x27,0x26,0x0a,0x0a,0x1d,0x2f,0x7e,0x13,0x2e,0x0e,0x27,0x1e,0x26,0x42,0x27,0x7e,0x26,0x26,0x31, -0x1e,0x7e,0x1d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x11,0x39,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x39,0x2b,0x11,0x33,0x00,0x3f,0x33,0x33,0x3f,0x33,0x1a,0xed,0x32,0x12,0x39,0x39,0x5f,0x5e,0x5d,0x3f,0x33,0xed,0x10,0xed,0x10,0xdc,0x5f,0x5e,0x5d,0xed,0x31,0x30,0x01,0x5d,0x01,0x10,0x00,0x21,0x22, -0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x66,0xfe,0xc1,0xfe,0xa4,0x47,0x7a,0x7a,0x30,0x68,0x56,0x56,0x70,0x38,0x72,0x71,0x50,0xf7,0xe5,0x0f, -0x06,0x6d,0xca,0xd7,0x48,0x72,0xe4,0xfe,0xac,0xa8,0x67,0x7d,0x67,0x91,0xa8,0xe2,0x6c,0x8c,0xa8,0x01,0x29,0xfe,0x62,0xfe,0x93,0x0c,0x0b,0x17,0x96,0x19,0x0b,0x0c,0xe8,0xfc,0xb2,0xd4,0xd4,0x01,0xc4,0x03,0xee,0xfc,0x26,0xa5,0x9c,0xbf,0x86,0x03,0xd6,0xfc,0x12,0xfe,0xd3,0xb5,0x90,0x03,0xd6,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1c, -0x06,0x54,0x04,0x00,0x00,0x30,0x00,0x7d,0x40,0x49,0x0c,0x95,0x04,0x07,0x14,0x07,0x02,0x07,0x03,0x0a,0x95,0x09,0x10,0x95,0x09,0x42,0x03,0x1c,0x19,0x13,0x1b,0x2f,0x27,0x1f,0x0f,0x2b,0x23,0x95,0x40,0x16,0x1b,0x16,0x03,0x10,0x2d,0x10,0x01,0x02,0x0f,0x10,0x1f,0x10,0x02,0x09,0x03,0x10,0x40,0x0c,0x15,0x48,0x10,0x13,0x0a,0x0a, -0x1e,0x30,0x84,0x13,0x2f,0x0e,0x28,0x1f,0x27,0x42,0x19,0x28,0x84,0x27,0x27,0x32,0x1f,0x84,0x1e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x11,0x39,0x18,0x2f,0x12,0x39,0x2b,0x5f,0x5e,0x5d,0x5f,0x5d,0x11,0x33,0x00,0x3f,0x33,0x1a,0xed,0x32,0x3f,0x33,0x33,0x12,0x39,0x39,0x3f,0xe6,0xed,0x10,0xed,0x10, -0xdc,0x5d,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x22,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x13,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x54,0xfe,0xc9,0xfe,0xa5,0x46,0x6f,0x6f,0x34, -0x70,0x4a,0x56,0x6c,0x33,0x6c,0x6b,0x51,0xef,0xe8,0x0c,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0x01,0x5c,0xfe,0x3d,0xfe,0x85,0x0c,0x0b,0x19,0x8e,0x16,0x0b,0x0b,0xf5,0x01,0x03,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd, -0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0x2f,0x05,0xb2,0x00,0x18,0x00,0x42,0x40,0x23,0x0b,0x09,0x1b,0x09,0x02,0x02,0x16,0x16,0x14,0x91,0x04,0x04,0x17,0x01,0x0d,0x0f,0x91,0x0a,0x04,0x17,0x03,0x01,0x0d,0x0d,0x16,0x11,0x00,0x7e,0x16,0x01,0x01,0x1a,0x11,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f, -0x33,0xe1,0x11,0x12,0x39,0x2f,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x31,0x30,0x01,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x14,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x2f,0xa8,0xbc,0xc3,0xd5,0xff,0x00,0xb4,0x98,0x40,0x3f,0x3d,0x3a,0xac, -0xa9,0x94,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x06,0xd8,0xcf,0xfd,0x18,0x96,0x1a,0xfe,0xce,0x98,0xb4,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0x33,0xfe,0x29,0x03,0x85,0x04,0x18,0x00,0x18,0x00,0x42,0x40,0x26,0x0a,0x08,0x1a,0x08,0x02,0x0a,0x06,0x1a,0x06,0x02,0x01,0x1b,0x03,0x05,0x17,0x0c,0x0e,0x95,0x09,0x10,0x17,0x0f,0x13,0x95, -0x05,0x16,0x0c,0x0c,0x10,0x18,0x84,0x01,0x17,0x17,0x1a,0x10,0x84,0x07,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x01,0x23,0x11,0x23,0x06,0x23,0x20,0x11,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11, -0x33,0x03,0x85,0xa3,0x05,0x71,0xd4,0xfe,0x9b,0x01,0x48,0x3a,0x35,0x34,0x35,0xaa,0x71,0x7c,0x7a,0xa4,0xa3,0xfe,0x29,0x02,0x73,0xb4,0x02,0x18,0x02,0x18,0x14,0x8d,0x17,0xfe,0x7a,0xd4,0xc2,0xbc,0x8e,0x02,0x44,0x00,0x00,0x01,0x00,0x00,0xfe,0x1e,0x04,0xb8,0x05,0x9a,0x00,0x22,0x00,0x5e,0x40,0x37,0x2b,0x10,0x3b,0x10,0x02,0x44, -0x01,0x01,0x0b,0x91,0x00,0x06,0x10,0x06,0x02,0x06,0x02,0x09,0x91,0x08,0x0f,0x91,0x08,0x02,0x1c,0x1d,0x18,0x18,0x16,0x91,0x1f,0x1f,0x19,0x1c,0x03,0x19,0x02,0x0f,0x0f,0x40,0x09,0x12,0x48,0x0f,0x09,0x22,0x7e,0x13,0x13,0x24,0x1d,0x18,0x7e,0x1a,0x09,0x2f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2b,0x11,0x33,0x00,0x2f, -0x3f,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x3f,0x33,0xed,0x10,0xed,0x10,0xdc,0x5d,0xed,0x31,0x30,0x01,0x5d,0x5d,0x25,0x10,0x21,0x22,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x12,0x15,0x04,0xb8,0xfd,0x71,0x45,0x77,0x77, -0x38,0x68,0x56,0x56,0x70,0x36,0x73,0x72,0x50,0xf7,0xe8,0xaa,0x97,0xbf,0xac,0xa8,0xa8,0xb9,0xcd,0xd3,0xfb,0xec,0xfd,0x32,0x0c,0x0b,0x17,0x96,0x19,0x0b,0x0c,0x01,0x13,0x01,0x21,0xc8,0xb0,0xcf,0x71,0xfd,0x40,0x05,0x9a,0xfd,0xb6,0x78,0xfe,0xec,0xe5,0x00,0x00,0x02,0xff,0xec,0xff,0xe8,0x03,0xe8,0x04,0x18,0x00,0x26,0x00,0x2f, -0x00,0xc5,0x40,0x59,0x1c,0x1d,0x16,0x1b,0x0d,0x0e,0x1a,0x0e,0x27,0x0c,0x28,0x18,0x17,0x1d,0x16,0x2f,0x19,0x2f,0x1c,0x17,0x1d,0x16,0x1d,0x27,0x0d,0x0c,0x28,0x0c,0x1d,0x21,0x15,0x0c,0x08,0x29,0x0e,0x0f,0x95,0x2e,0x2f,0x2e,0x25,0xec,0x04,0x00,0x04,0x10,0x04,0x02,0x2e,0x04,0x2e,0x04,0x08,0x28,0x29,0x95,0x16,0x19,0x1a,0x03, -0x15,0x10,0x08,0xec,0x21,0x16,0x00,0x1d,0x16,0x1e,0x12,0x28,0x0c,0x0b,0x2c,0x0d,0x0e,0x1b,0x1c,0x04,0x1a,0x12,0x17,0x18,0x27,0x2f,0x04,0x2c,0x1a,0xb8,0x01,0x2e,0xb3,0x19,0x19,0x0b,0x2c,0xb8,0x01,0x2e,0x40,0x0b,0x12,0x12,0x01,0x1e,0x84,0x0b,0x0b,0x31,0x00,0x84,0x01,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12, -0x39,0x2f,0xe1,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0xed,0x3f,0x17,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x04,0xc0,0x08,0xc0,0x10,0x87, -0xc0,0x04,0xc0,0x08,0xc0,0x31,0x30,0x33,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x37,0x33,0x06,0x07,0x16,0x15,0x14,0x02,0x23,0x22,0x27,0x26,0x23,0x22,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x8c,0xa0,0x13,0x85,0x68,0x65,0x6f,0x62,0x38, -0x5e,0x8c,0x38,0xa6,0xbe,0x78,0xa2,0xb9,0x96,0xa6,0x8b,0x1d,0x15,0x9b,0x27,0x42,0x76,0xec,0xa6,0x82,0x70,0x56,0x22,0x48,0x02,0x14,0x62,0x7d,0x52,0x5e,0x87,0x8c,0x8f,0xa4,0x64,0x58,0xdc,0x9d,0x78,0x63,0xa8,0x83,0x68,0x71,0x99,0x6c,0x32,0x3a,0x6f,0x61,0x98,0xc0,0xd6,0xfe,0xce,0x6a,0x52,0x02,0x91,0x59,0x43,0x35,0x68,0x00, -0x00,0x01,0x00,0x48,0xff,0xe8,0x04,0xae,0x05,0xb2,0x00,0x29,0x00,0x52,0x40,0x2e,0x03,0x28,0x13,0x28,0x02,0x0c,0x1c,0x06,0x23,0x04,0x03,0x29,0x29,0x19,0x26,0x13,0x13,0x03,0x0f,0x91,0x19,0x04,0x26,0x91,0x03,0x13,0x13,0x11,0x7e,0x16,0x1c,0x7d,0x0c,0x16,0x0c,0x16,0x0c,0x06,0x00,0x7e,0x29,0x29,0x2b,0x23,0x7d,0x06,0x2f,0xe1, -0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x32,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x11,0x17,0x39,0x31,0x30,0x5d,0x01,0x06,0x00,0x21,0x22,0x24,0x35,0x34,0x36,0x36,0x25,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x32,0x00,0x15,0x14,0x06,0x06, -0x07,0x05,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x04,0xae,0x17,0xfe,0xb7,0xfe,0xf4,0xe9,0xfe,0xef,0x68,0xb4,0x01,0x4e,0xda,0xd0,0x78,0x9c,0x14,0xa4,0x16,0xa7,0x93,0xbf,0x01,0x41,0x3a,0x72,0x33,0xfe,0x73,0xd8,0xb4,0xa0,0xc0,0xf2,0x0c,0x02,0x0a,0xfe,0xfe,0xdc,0xfd,0xbb,0x78,0xaf,0x5c,0x4d,0x30,0x68,0x6a,0xa8,0x6c,0x25, -0x2f,0x30,0x32,0x69,0x8d,0xff,0x00,0xaa,0x46,0x6c,0x4d,0x0c,0x61,0x46,0xb4,0x80,0xa3,0xd3,0xb8,0x00,0x00,0x01,0x00,0x3e,0xff,0xe8,0x03,0x90,0x04,0x18,0x00,0x27,0x00,0x6e,0x40,0x29,0x05,0x09,0x15,0x09,0x02,0x0b,0x09,0x24,0x1f,0x1e,0x03,0x20,0x27,0x30,0x27,0x02,0x27,0x27,0x19,0x24,0x13,0x40,0x09,0x0c,0x48,0x13,0x13,0x03, -0x0f,0x95,0x19,0x10,0x24,0x95,0x03,0x16,0x1c,0x84,0x0c,0x13,0x11,0xb8,0x01,0x2e,0x40,0x0d,0x10,0x16,0x20,0x16,0x30,0x16,0x03,0x16,0x0c,0x16,0x0c,0x06,0x00,0xb8,0x01,0x2e,0xb5,0x27,0x27,0x29,0x21,0x84,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x32,0x10,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39, -0x2f,0x2b,0x11,0x12,0x39,0x2f,0x5d,0x11,0x39,0x39,0x11,0x39,0x39,0x5d,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x04,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x90,0x0a,0xf6,0xd2,0xad,0xd3,0x4a, -0x85,0xe1,0x97,0xa2,0x51,0x5d,0x21,0x98,0x1e,0x7c,0x6b,0x9d,0x01,0x05,0x6b,0xfe,0xa0,0x7c,0x7c,0x68,0x8c,0xa8,0x04,0x01,0xa0,0xd0,0xe8,0xb0,0x89,0x56,0x7e,0x47,0x34,0x23,0x44,0x41,0x78,0x46,0x29,0x31,0x31,0x37,0x53,0x6d,0xca,0x75,0x52,0x76,0x47,0x58,0x4b,0x50,0x65,0x9f,0x8f,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x04,0xb0, -0x05,0xb2,0x00,0x1c,0x00,0x1f,0x00,0xce,0x40,0x7a,0x1d,0x1e,0x8d,0x1e,0xbd,0x1e,0x03,0x74,0x0f,0xe4,0x0f,0x02,0x1e,0x1b,0x1f,0x19,0x0f,0x02,0x10,0x1c,0x0e,0x1c,0x1e,0x1f,0x19,0x04,0x03,0x02,0x10,0x1d,0x05,0x1d,0x0f,0x03,0x02,0x10,0x02,0x1e,0x1b,0x1a,0x1f,0x19,0x1f,0x10,0x42,0x0e,0x72,0x0e,0x82,0x0e,0x02,0x16,0x0e,0x46, -0x0e,0x56,0x0e,0x03,0x0e,0x1c,0x0c,0x19,0x42,0x05,0x76,0x05,0x01,0x05,0x04,0x1a,0x03,0x1b,0x1e,0x1d,0x07,0x1f,0x17,0x09,0x15,0x03,0x07,0x91,0x12,0x0c,0x04,0x1c,0x02,0x76,0x02,0x01,0x0f,0x02,0x1f,0x02,0x02,0x02,0x1f,0x91,0x01,0x10,0x19,0x19,0x1f,0x1f,0x02,0x15,0x0e,0x05,0x05,0x1d,0x1d,0x1c,0x09,0x15,0x09,0x15,0x09,0x02, -0x1c,0x1c,0x21,0x02,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x12,0x39,0x11,0x33,0x11,0x12,0x39,0x12,0x39,0x11,0x33,0x00,0x2f,0xed,0x39,0x5d,0x5d,0x11,0x33,0x3f,0x33,0xed,0x17,0x32,0x11,0x17,0x39,0x5d,0x10,0xe4,0x11,0x12,0x39,0x5d,0x5d,0x10,0xe6,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0x0e,0xc0, -0x10,0x87,0x08,0xc0,0x05,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x3d,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x21,0x21,0x35,0x01,0x27,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x07,0x01,0x27,0x01,0x01,0x04,0xb0,0xfb,0x64,0x01,0xf4,0x37,0x3b,0x46,0x2d, -0x2c,0x2c,0x2b,0x37,0x5a,0x8a,0x51,0x52,0x8b,0x59,0x36,0x2c,0x2c,0x2c,0x2c,0x4a,0x3c,0x36,0x01,0xf6,0xee,0xfe,0x9e,0xfe,0x9e,0x31,0x03,0xc1,0x6a,0x72,0x4c,0x14,0x98,0x14,0x76,0x9c,0x9e,0x74,0x14,0x98,0x14,0x49,0x75,0x66,0xfc,0x3b,0x67,0x02,0xb4,0xfd,0x4c,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x03,0xcd,0x04,0x18,0x00,0x1a, -0x00,0x1d,0x00,0x76,0x40,0x47,0x03,0x0e,0x33,0x0e,0x43,0x0e,0xd3,0x0e,0x04,0x0e,0x0b,0x19,0x03,0xcb,0x1c,0xdb,0x1c,0x02,0x8f,0x1c,0x01,0x14,0x1c,0x01,0x1c,0x03,0x1d,0x08,0x14,0x16,0x03,0x06,0x95,0x11,0x0b,0x10,0x1a,0x02,0x0b,0x02,0x2b,0x02,0x02,0x02,0x1d,0x95,0x01,0x19,0x03,0x1a,0x1d,0x14,0x02,0x1b,0x1a,0x08,0x0f,0x14, -0x01,0x00,0x08,0x01,0x14,0x08,0x14,0x08,0x02,0x1a,0x1a,0x1f,0x02,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x12,0x39,0x11,0x12,0x39,0x12,0x39,0x39,0x00,0x2f,0xed,0x39,0x5d,0x11,0x33,0x3f,0x33,0xed,0x17,0x32,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x11,0x33,0x12,0x39,0x5d,0x31,0x30,0x21,0x21,0x35,0x01,0x27,0x26, -0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x01,0x27,0x03,0x03,0x03,0xcd,0xfc,0x47,0x01,0x88,0x25,0x3b,0x40,0x21,0x21,0x20,0x2c,0x50,0x66,0x34,0x35,0x67,0x4f,0x2b,0x21,0x21,0x20,0x46,0x3c,0x22,0x01,0x8b,0xe3,0xfc,0xfc,0x23,0x02,0xba,0x44,0x6d,0x0f,0x8b,0x0e,0x48, -0x5e,0x5f,0x47,0x0e,0x8b,0x0f,0x6d,0x3f,0xfd,0x41,0x69,0x01,0xc6,0xfe,0x3a,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0xee,0x06,0x04,0x00,0x1e,0x00,0x2a,0x00,0x74,0x40,0x34,0x33,0x18,0x43,0x18,0x53,0x18,0x03,0x0c,0x09,0x1c,0x09,0x2c,0x09,0x03,0x99,0x05,0x01,0x0b,0x13,0x1f,0x91,0x0d,0x0d,0x19,0x25,0x03,0x91,0x0f,0x1d,0x1f, -0x1d,0x2f,0x1d,0x03,0x1d,0x19,0x01,0x91,0x00,0x07,0x91,0x00,0x42,0x19,0x01,0x25,0x91,0x13,0x13,0x1b,0x05,0x05,0xb8,0xff,0xc0,0x40,0x0e,0x0c,0x12,0x48,0x01,0x05,0x01,0x0a,0x10,0x7d,0x28,0x28,0x2c,0x0a,0x22,0xb9,0x01,0x2f,0x00,0x16,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2b,0x11,0x33,0x00,0x3f,0xed,0x3f, -0xe6,0xed,0x10,0xed,0x10,0xdc,0x5d,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x15,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x06,0x03,0x33,0x36,0x21,0x32,0x00,0x15,0x14,0x00,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04, -0xc2,0x50,0x68,0x33,0x6a,0x6b,0x4a,0xc2,0xc7,0x15,0x09,0xa3,0x01,0x07,0xf6,0x01,0x2b,0xfe,0xb9,0xff,0xfe,0xe6,0xfe,0xd0,0x01,0x23,0x01,0x3d,0x44,0x6e,0x6d,0x35,0x60,0xfe,0x3e,0xb4,0xe2,0xd7,0xb9,0xb7,0xdd,0xd7,0x06,0x04,0x96,0x18,0x0a,0x0a,0xe7,0xfe,0xef,0xc8,0xfe,0xce,0xf0,0xf2,0xfe,0xc2,0x01,0x58,0x01,0x45,0x01,0xda, -0x01,0xa3,0x0a,0x0a,0xfd,0xb4,0xd8,0xa5,0xbe,0xe8,0xe0,0xb1,0xb2,0xe0,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x00,0x1e,0x00,0x2c,0x00,0x75,0x40,0x2f,0x6b,0x1e,0x7b,0x1e,0x02,0x0c,0x09,0x1c,0x09,0x2c,0x09,0x8c,0x09,0x04,0x0b,0x1f,0x1f,0x2a,0x95,0x0d,0x0d,0x19,0x24,0x03,0x95,0x1d,0x40,0x09,0x0e,0x48,0x1d,0x19, -0x01,0x95,0x00,0x42,0x07,0x95,0x19,0x01,0x24,0x95,0x13,0x16,0x1b,0x05,0x05,0xb8,0xff,0xc0,0x40,0x18,0x0f,0x24,0x48,0x0a,0x05,0x21,0x6f,0x01,0x7f,0x01,0x8f,0x01,0x03,0x01,0x01,0x16,0x10,0x83,0x27,0x27,0x2e,0x21,0x83,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0x12,0x39,0x39,0x2b,0x11,0x33,0x00,0x3f,0xed,0x3f, -0xed,0xf6,0xed,0x10,0xdc,0x2b,0xed,0x11,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x31,0x30,0x5d,0x5d,0x01,0x15,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x02,0x03,0x33,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x01,0x06,0x15,0x14,0x12,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06, -0x03,0xdb,0x38,0x4f,0x18,0x39,0x3a,0x2f,0xac,0xc6,0x1a,0x04,0x81,0xe1,0xdc,0x01,0x00,0xfe,0xe8,0xea,0xed,0xfe,0xff,0x01,0x21,0x01,0x21,0x20,0x45,0x45,0x1e,0x44,0xfd,0x5e,0x04,0xb1,0x9f,0xa0,0xb0,0xb3,0xa3,0x63,0xb3,0x06,0x06,0x8b,0x11,0x04,0x04,0xfe,0xfc,0xfe,0xfc,0xae,0xfe,0xe4,0xf8,0xf4,0xfe,0xd8,0x01,0x57,0x01,0x40, -0x01,0xc1,0x01,0xc2,0x04,0x04,0xfc,0xcc,0x41,0x35,0xd8,0xfe,0xfa,0xcf,0xbd,0xc3,0xcd,0x71,0x00,0x01,0x00,0x0a,0x00,0x00,0x04,0x7b,0x05,0x9a,0x00,0x13,0x00,0x36,0x40,0x17,0x09,0x01,0x04,0x91,0x12,0x0f,0x0f,0x03,0x10,0x03,0x03,0x12,0x01,0x7e,0x0f,0x04,0x04,0x0c,0x00,0x00,0x15,0x09,0x07,0xb9,0x01,0x2e,0x00,0x0c,0x2f,0xe1, -0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0x33,0xe1,0x32,0x00,0x2f,0x3f,0x12,0x39,0x2f,0x33,0xfd,0x32,0xc6,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x21,0x33,0x11,0x33,0x11,0x21,0x04,0x7b,0xfe,0x33,0xa8,0xff,0x00,0x68,0x08,0x8e,0x0e,0x01,0x00,0xfc,0xa8,0x01,0xcd,0x04,0x00,0xfc,0x00,0x04, -0x00,0x5a,0x28,0x1e,0x32,0x34,0xd2,0x01,0x02,0xfe,0xfe,0x00,0x00,0x01,0x00,0x00,0xfe,0x96,0x03,0x4e,0x05,0x2f,0x00,0x18,0x00,0x3a,0x40,0x1d,0x05,0xec,0x40,0x04,0x19,0x80,0x0e,0x09,0x16,0x01,0x09,0x95,0x17,0x14,0x0f,0x05,0x17,0x01,0x84,0x14,0x09,0x09,0x11,0x00,0x1a,0x0e,0x0c,0xed,0x11,0x2f,0xe1,0x32,0x10,0xc6,0x11,0x39, -0x2f,0x33,0xe1,0x32,0xc6,0x00,0x3f,0x33,0xed,0x32,0xcd,0x10,0xc6,0x1a,0x10,0xde,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x10,0x05,0x35,0x36,0x36,0x35,0x11,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x33,0x33,0x35,0x37,0x11,0x21,0x03,0x4e,0xfe,0xc0,0xfe,0xa0,0x68,0x54,0x7a,0x60,0x06,0x8c,0x0a,0xf0,0x7a,0xa4,0x01,0x40,0x03, -0x74,0xfc,0xd6,0xfe,0x90,0x44,0x9f,0x16,0x7e,0x7f,0x03,0x2c,0x53,0x21,0x1e,0x30,0x2e,0xc0,0xfa,0x35,0xfe,0xd1,0x00,0x01,0x00,0x00,0xff,0xe8,0x04,0x90,0x04,0x18,0x00,0x29,0x00,0x65,0x40,0x35,0x1d,0x0b,0x07,0x1f,0x1f,0x0b,0x0e,0x21,0x0f,0x15,0x13,0x95,0x18,0x10,0x29,0x27,0x95,0x40,0x02,0x16,0x0e,0x1f,0x07,0x21,0x05,0x1d, -0x0b,0x1b,0x0d,0x21,0x83,0x22,0x22,0x29,0x24,0x84,0x05,0x0e,0x29,0x15,0x1b,0x42,0x0d,0x83,0x0e,0x0e,0x15,0x1b,0x84,0x10,0x10,0x2b,0x15,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x18,0x2f,0xf0,0xe1,0x11,0x39,0x2f,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x3f, -0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x06,0x07,0x06,0x07,0x23,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x00,0x37,0x36,0x37,0x33,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x04,0x90,0x33,0x3f,0x88,0x9c,0x14,0x06,0xf1,0x94,0x56,0x14,0x27, -0xac,0xb0,0x56,0x50,0x2a,0x26,0x32,0x3e,0x8a,0x9c,0x15,0x01,0x8d,0x54,0x14,0x28,0xac,0xb0,0x57,0x4f,0x2a,0x26,0x02,0x16,0xde,0xbf,0x69,0x6a,0x06,0xdb,0x87,0x62,0x35,0x59,0x01,0x72,0xf4,0x89,0x9f,0x15,0x89,0x16,0xde,0xbf,0x69,0x6a,0x01,0x65,0x65,0x35,0x59,0xfe,0x8e,0xf4,0x8c,0x9c,0x15,0x00,0x00,0x02,0x00,0xa2,0xfe,0x1e, -0x04,0x50,0x04,0x18,0x00,0x19,0x00,0x25,0x00,0x39,0x40,0x20,0x05,0x03,0x15,0x03,0x02,0x22,0x95,0x12,0x10,0x00,0x1a,0x1a,0x1d,0x95,0x18,0x16,0x07,0x95,0x08,0x1c,0x07,0x07,0x0f,0x15,0x83,0x1f,0x1f,0x27,0x01,0x25,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x3f,0xed, -0x31,0x30,0x5d,0x25,0x23,0x1e,0x02,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x24,0x02,0x11,0x11,0x34,0x12,0x33,0x32,0x00,0x15,0x10,0x02,0x23,0x22,0x03,0x16,0x16,0x33,0x20,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x48,0x04,0x09,0x76,0xd1,0xc7,0x78,0x43,0x40,0x7f,0xf2,0xfe,0xee,0xb1,0xf4,0xe1,0xd9,0x01,0x00,0xf8,0xdd,0xc1,0x76, -0x26,0xa5,0x59,0x01,0x3e,0xa7,0x8f,0x90,0x9c,0x62,0x92,0xc0,0x56,0x04,0x02,0x08,0x8e,0x08,0x02,0x04,0x66,0x01,0x24,0x01,0x54,0x01,0x04,0xf4,0x01,0x16,0xfe,0xde,0xe6,0xfe,0xfc,0xfe,0xdc,0x01,0x1a,0x3d,0x53,0x01,0x96,0xb0,0xd6,0xcf,0xb3,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00, -0xff,0xff,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4d,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x02,0xcf,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x5c,0x04,0x00,0x00,0x12,0x00,0x39,0x40,0x1e,0x0e,0x95,0x40,0x0d,0x08,0x00,0x0d,0x95,0x2b,0x30,0x09,0x95,0x08,0x0f,0x12,0x95, -0x00,0x0c,0x08,0x0d,0x08,0x0d,0x08,0x0f,0x00,0x00,0x14,0x0f,0x83,0x04,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x00,0x2f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x15,0x23,0x20,0x03,0x21,0x15,0x21,0x12,0x21,0x33,0x03,0x5c,0xe3,0xf9,0xfe,0xe0, -0x01,0x2d,0xff,0xc6,0xc9,0xfe,0xb6,0x33,0x02,0x1f,0xfd,0xdb,0x1b,0x01,0x68,0xd3,0x01,0x09,0xe3,0xf3,0x01,0x21,0x8c,0xfe,0xe0,0x8c,0xfe,0xc4,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x5c,0x04,0x00,0x00,0x12,0x00,0x37,0x40,0x1d,0x05,0x95,0x40,0x06,0x0b,0x00,0x06,0x95,0x2b,0x30,0x0a,0x95,0x0b,0x0f,0x01,0x95,0x00,0x0f,0x83,0x04, -0x0a,0x05,0x0a,0x05,0x07,0x04,0x04,0x14,0x00,0x2f,0x11,0x39,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x00,0x2f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x33,0x35,0x33,0x20,0x13,0x21,0x35,0x21,0x02,0x21,0x23,0x35,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x60,0xd3,0x01,0x5d,0x24,0xfd,0xde,0x02,0x22,0x2a,0xfe,0xa9, -0xc9,0xda,0xf8,0x01,0x20,0xfe,0xd4,0xff,0x8c,0x01,0x3c,0x8c,0x01,0x20,0x8c,0xfe,0xf7,0xe3,0xf4,0xfe,0xe0,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x06,0xca,0x05,0x9a,0x00,0x33,0x00,0x2b,0x40,0x15,0x32,0x10,0x15,0x25,0x7e,0x24,0x16,0x7e,0x15,0x15,0x07,0x24,0x24,0x35,0x08,0x7e,0x07,0x07,0x03,0x00,0x12,0x00,0x3f,0x3f,0x01,0x2f, -0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x21,0x2e,0x05,0x27,0x33,0x1e,0x05,0x17,0x13,0x2e,0x03,0x27,0x33,0x1e,0x05,0x17,0x3e,0x05,0x37,0x33,0x0e,0x05,0x07,0x23,0x2e,0x03,0x27,0x03,0x01,0xe2,0x4d,0x75,0x5a,0x40,0x32,0x25,0x11,0xa8,0x10,0x26,0x2e,0x38,0x46,0x57,0x35,0xe0,0x15,0x21,0x1c, -0x18,0x0c,0xa8,0x10,0x26,0x2e,0x38,0x46,0x57,0x35,0x35,0x57,0x46,0x38,0x2e,0x25,0x11,0xa8,0x11,0x25,0x32,0x40,0x5a,0x75,0x4d,0xa4,0x2b,0x4a,0x40,0x37,0x17,0xd5,0x95,0xf8,0xdd,0xd0,0xdc,0xf3,0x91,0x8a,0xe5,0xc7,0xb5,0xb5,0xbd,0x6d,0x02,0x3c,0x48,0x94,0x9f,0xb0,0x63,0x8a,0xe5,0xc7,0xb5,0xb5,0xbd,0x6d,0x6d,0xbd,0xb5,0xb5, -0xc7,0xe5,0x8a,0x92,0xf2,0xdc,0xd0,0xde,0xf7,0x95,0x53,0x95,0x89,0x7f,0x3c,0xfd,0xd4,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x05,0x5e,0x04,0x00,0x00,0x14,0x00,0x4c,0x40,0x25,0x0d,0x03,0x02,0x0f,0x14,0x08,0x03,0x0d,0x02,0x0f,0x0f,0x02,0x0c,0x13,0x03,0x04,0x02,0x01,0x13,0x05,0x04,0x0c,0x13,0x0c,0x00,0x08,0x10,0x0f,0x0f,0x14, -0x08,0x14,0x00,0x00,0x16,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x2f,0x17,0x33,0x3f,0x12,0x39,0x39,0x33,0x33,0x87,0x05,0xc0,0xc0,0x31,0x30,0x01,0x01,0x23,0x03,0x03,0x23,0x02,0x02,0x27,0x33,0x16,0x12,0x13,0x13,0x26,0x27,0x33,0x16,0x12,0x17, -0x01,0x05,0x5e,0xfe,0xaa,0xa6,0xb8,0xb6,0x94,0xb5,0x72,0x1b,0xa8,0x1a,0x58,0x7c,0xaa,0x47,0x1b,0xac,0x20,0x77,0x75,0x01,0x08,0x04,0x00,0xfc,0x00,0x01,0xaa,0xfe,0x56,0x01,0x9b,0x01,0x76,0xef,0xcf,0xfe,0xce,0xfe,0xce,0x01,0x87,0xcb,0xe1,0xe2,0xfe,0xad,0xfe,0x03,0x33,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0xc6,0x05,0x9a, -0x00,0x12,0x00,0x1a,0x00,0x45,0x40,0x23,0x0a,0x01,0x91,0x07,0x04,0x04,0x05,0x13,0x91,0x0b,0x0b,0x05,0x03,0x14,0x91,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x7d,0x18,0x18,0x1c,0x0b,0x07,0x14,0x7e,0x04,0x00,0x00,0x1c,0x1b,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f, -0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x4c,0xfe,0xdd,0x01,0x23,0xa8,0x01,0x5a,0xfe,0xa6,0x01,0x10,0xd4,0xee,0xf8,0xd8,0xfe,0xfe,0xeb,0x96,0xa1,0xfe,0xc9,0x04,0x74, -0x9a,0x8c,0x8c,0x9a,0xfe,0xc6,0xcd,0xc1,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0x4e,0x05,0xec,0x00,0x12,0x00,0x19,0x00,0x47,0x40,0x24,0x0a,0x01,0x96,0x07,0x04,0x04,0x06,0x0b,0x95,0x13,0x13,0x00,0x06,0x00,0x14,0x95,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x83,0x17,0x17,0x1b,0x0b, -0x07,0x14,0x84,0x04,0x00,0x00,0x1b,0x1a,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x11,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32, -0x35,0x34,0x23,0x01,0x40,0xfe,0xe9,0x01,0x17,0xa4,0x01,0x38,0xfe,0xc8,0x01,0x12,0x9d,0xbb,0xbb,0x8d,0xfe,0xde,0xf5,0xcd,0xcf,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0xc5,0xa3,0x94,0x93,0xad,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x00,0x01,0x00,0xbc,0xff,0xe8,0x06,0xd9,0x05,0xb2,0x00,0x1f,0x00,0x5e,0x40,0x34,0x1a,0x17,0x06,0x91, -0x40,0x0b,0x0a,0x08,0x0b,0x91,0x2b,0x30,0x30,0x12,0x01,0x12,0x12,0x14,0x91,0x0f,0x04,0x0a,0x03,0x20,0x1f,0x01,0x1f,0x1f,0x1d,0x91,0x02,0x13,0x08,0x19,0x19,0x17,0x12,0x1a,0x7d,0x0c,0x12,0x05,0x05,0x08,0x12,0x00,0x00,0x21,0x0b,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0xe1,0x11,0x39,0x39, -0x2f,0x00,0x2f,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0x3f,0xed,0x32,0x2f,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x03,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x15,0x21,0x16,0x00,0x33,0x32,0x37,0x06,0xd9,0x9f,0xea,0xfe,0xde,0xfe,0x95, -0x0f,0xfe,0xb0,0xa8,0xa8,0x01,0x52,0x1d,0x01,0x7e,0x01,0x1b,0xd6,0x97,0xa3,0xcc,0xd7,0xfe,0xeb,0x18,0x02,0x79,0xfd,0x85,0x10,0x01,0x11,0xd7,0xe0,0x9d,0x3c,0x54,0x01,0x69,0x01,0x2e,0xfd,0x81,0x05,0x9a,0xfd,0x7c,0x01,0x34,0x01,0x68,0x3b,0xb3,0x56,0xfe,0xed,0xf1,0x97,0xef,0xfe,0xed,0x60,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8, -0x05,0x66,0x04,0x18,0x00,0x1f,0x00,0x68,0x40,0x3a,0x17,0x1a,0x06,0x95,0x40,0x0b,0x0a,0x08,0x0b,0x95,0x2b,0x30,0x0a,0x0f,0x40,0x12,0x50,0x12,0x02,0x12,0x12,0x14,0x95,0x0f,0x10,0x30,0x1f,0x01,0x1f,0x1f,0x1d,0x95,0x02,0x16,0x08,0x17,0x12,0x1a,0x83,0x05,0x0c,0x12,0x05,0x18,0x12,0x18,0x12,0x00,0x05,0x05,0x08,0x00,0x00,0x21, -0x0b,0x06,0x84,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xe1,0x11,0x39,0x00,0x2f,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x32,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x27,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x36,0x24,0x33, -0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x05,0x66,0x72,0xa0,0xd6,0xfe,0xf9,0x0f,0xfe,0xe2,0xa4,0xa4,0x01,0x20,0x18,0x01,0x0e,0xdc,0x89,0x67,0x64,0x92,0x93,0xb6,0x0d,0x01,0xb4,0xfe,0x4a,0x08,0xb2,0x94,0x92,0x78,0x2d,0x45,0xfb,0xdb,0xfe,0x42,0x04,0x00,0xfe,0x4a,0xdb,0xf3,0x32,0xa2, -0x4a,0xb0,0x94,0x8c,0x97,0xb5,0x5b,0x00,0x00,0x02,0x00,0x16,0x00,0x00,0x05,0x3c,0x05,0x9a,0x00,0x0b,0x00,0x14,0x00,0x66,0x40,0x37,0x0d,0x0c,0x02,0x0a,0x01,0x0a,0x0d,0x01,0x0a,0x13,0x12,0x07,0x08,0x0b,0x08,0x12,0x0b,0x08,0x02,0x03,0x06,0x07,0x0c,0x10,0x13,0x14,0x08,0x0b,0x0a,0x03,0x05,0x01,0x08,0x0a,0x0b,0x0f,0x10,0x14, -0x05,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0x7e,0x05,0x05,0x16,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x00,0x18,0x2f,0x33,0x33,0x3f,0x33,0x17,0x39,0x11,0x12,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23, -0x03,0x07,0x11,0x23,0x11,0x27,0x01,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x17,0x05,0x3c,0xbb,0xfc,0x8f,0xa8,0x83,0xff,0x00,0xb5,0x02,0x3e,0xb6,0x3e,0x7d,0x12,0x0b,0x04,0x0a,0x17,0x7d,0x9c,0x02,0x8e,0xb7,0xfe,0x29,0x01,0xd3,0xb6,0xfd,0x77,0x05,0x9a,0xfd,0x91,0x01,0x45,0x2f,0x51,0x47,0x3b,0xfe,0xc3,0xd7, -0x00,0x02,0x00,0x0c,0x00,0x00,0x03,0xf2,0x04,0x00,0x00,0x0b,0x00,0x14,0x00,0x68,0x40,0x37,0x0d,0x0c,0x02,0x0a,0x01,0x0a,0x0d,0x01,0x0a,0x13,0x12,0x07,0x08,0x0b,0x08,0x12,0x0b,0x02,0x03,0x06,0x07,0x0c,0x13,0x06,0x14,0x14,0x08,0x0b,0x0a,0x0f,0x05,0x01,0x08,0x0a,0x0b,0x0f,0x10,0x14,0x05,0x05,0x01,0x00,0x0e,0x04,0x08,0x09, -0x09,0x05,0x42,0x04,0x8b,0x05,0x05,0x16,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x00,0x18,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x2f,0x17,0x33,0x11,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27, -0x03,0x23,0x01,0x33,0x13,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x17,0x03,0xf2,0xb0,0x98,0x60,0x96,0x64,0x9c,0xa8,0x01,0xac,0xa2,0x18,0x4d,0x1b,0x08,0x04,0x0b,0x16,0x51,0x7a,0x01,0x8c,0x76,0xfe,0xea,0x01,0x16,0x78,0xfe,0x72,0x04,0x00,0xfe,0x1a,0xd2,0x4a,0x45,0x55,0x36,0xcd,0x8d,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x06,0xe6, -0x05,0x9a,0x00,0x13,0x00,0x1c,0x00,0xa1,0x40,0x59,0x15,0x14,0x02,0x12,0x01,0x12,0x15,0x01,0x12,0x1b,0x1a,0x07,0x08,0x13,0x08,0x1a,0x13,0x08,0x11,0x0a,0x09,0x12,0x09,0x02,0x03,0x06,0x07,0x14,0x1b,0x1c,0x07,0x0c,0x12,0x0a,0x91,0x40,0x11,0x0f,0x0c,0x11,0x91,0x2b,0x30,0x12,0x13,0x17,0x18,0x04,0x0f,0x03,0x01,0x05,0x08,0x09, -0x04,0x0c,0x13,0x17,0x12,0x18,0x17,0x18,0x1c,0x03,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0x7e,0x05,0x05,0x1e,0x0f,0x09,0x01,0x09,0x09,0x1e,0x10,0x0c,0x7e,0x0d,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x5d,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x00,0x18,0x2f,0x17, -0x33,0x3f,0x17,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27,0x01,0x23,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x13,0x03,0x26, -0x27,0x23,0x06,0x07,0x03,0x17,0x06,0xe6,0xbb,0xfc,0x8f,0xa8,0x84,0xff,0x00,0xb4,0x01,0x0d,0xfe,0x97,0xa8,0xa8,0x01,0xa4,0xf6,0xb6,0x3e,0x7e,0x10,0x0c,0x04,0x0a,0x17,0x7d,0x9c,0x02,0x8e,0xb7,0xfe,0x29,0x01,0xd3,0xb6,0xfd,0x77,0x02,0x9e,0xfd,0x62,0x05,0x9a,0xfd,0x9b,0x02,0x65,0xfd,0x91,0x01,0x45,0x2a,0x56,0x47,0x3b,0xfe, -0xc3,0xd7,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0x7b,0x04,0x00,0x00,0x13,0x00,0x1c,0x00,0xb0,0x40,0x50,0x11,0x0a,0x09,0x12,0x15,0x14,0x02,0x12,0x01,0x12,0x15,0x01,0x12,0x1b,0x1a,0x07,0x08,0x13,0x08,0x1a,0x13,0x08,0x02,0x03,0x06,0x07,0x14,0x1b,0x06,0x00,0x1c,0x01,0x13,0x03,0x1c,0x1c,0x0c,0x0f,0x0a,0x96,0x40,0x11,0x0f,0x0c, -0x11,0x96,0x2b,0x30,0x12,0x13,0x17,0x18,0x04,0x0f,0x0f,0x01,0x05,0x08,0x09,0x04,0x0c,0x13,0x17,0x12,0x18,0x17,0x18,0x1c,0x03,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0xb8,0x01,0x2e,0x40,0x11,0x05,0x05,0x1e,0x2f,0x09,0x3f,0x09,0x4f,0x09,0x03,0x09,0x09,0x1e,0x10,0x0c,0x84,0x0d,0x2f,0xe1,0x32,0x11,0x39,0x2f, -0x5d,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x00,0x18,0x2f,0x17,0x33,0x3f,0x17,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x17,0x33,0x11,0x12,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x87,0xc0,0xc0, -0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27,0x03,0x23,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x13,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x17,0x05,0x7b,0xb0,0x98,0x60,0x95,0x65,0x9b,0xa8,0xc2,0xfe,0xf2,0xa4,0xa4,0x01,0x46,0xb2,0xa2,0x18,0x4e,0x1b,0x07,0x05,0x0b,0x16,0x52,0x7c,0x01,0x8c,0x76,0xfe,0xea,0x01, -0x16,0x78,0xfe,0x72,0x01,0xd5,0xfe,0x2b,0x04,0x00,0xfe,0x58,0x01,0xa8,0xfe,0x1a,0xd2,0x49,0x46,0x55,0x36,0xcd,0x8d,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x05,0xaa,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0xb3,0x40,0x30,0x10,0x03,0x0f,0x03,0x1a,0x19,0x06,0x13,0x06,0x1a,0x19,0x13,0x06,0x16,0x15,0x14,0x03,0x14,0x16,0x15,0x03,0x14, -0x0d,0x0e,0x06,0x0d,0x18,0x10,0x03,0x17,0x17,0x0e,0x03,0x06,0x06,0x09,0x13,0x14,0x91,0x40,0x0f,0x0e,0x03,0x05,0x01,0x09,0x13,0x0f,0xb8,0xff,0xd8,0x40,0x14,0x0b,0x01,0x4d,0x0f,0x0f,0x00,0x03,0x14,0x00,0x0e,0x10,0x0e,0x02,0x09,0x03,0x0e,0x0e,0x06,0x0a,0x00,0xb8,0x01,0x2f,0xb6,0x01,0x0e,0x03,0x09,0x06,0x42,0x09,0xb8,0x01, -0x2f,0x40,0x0b,0x0a,0x0a,0x1b,0x18,0x17,0x03,0x7e,0x06,0x06,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x2b,0x33,0x00,0x2f,0x33,0x33,0x3f,0x33,0x1a,0xed,0x32,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x17,0x33,0x87, -0x05,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x06,0x02,0x03,0x23,0x12,0x12,0x37,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x01,0x16,0x17,0x33,0x36,0x37,0x05,0xaa,0xc0,0x32,0xfe,0x8a,0xa8,0xcb,0xcb,0x1a, -0xc1,0x33,0xfd,0xe9,0xfe,0x62,0x04,0xa0,0xfe,0x52,0xea,0xf7,0xfe,0xb0,0xfd,0x9f,0x01,0x07,0x0d,0x16,0x02,0x10,0x16,0x02,0x0a,0x66,0xfd,0x90,0x02,0x72,0x39,0xfe,0xd3,0xfe,0xf4,0x01,0x50,0x01,0x67,0x45,0x02,0x9e,0xfd,0x60,0x48,0xfe,0x9a,0x03,0xb6,0xfe,0x52,0x22,0x36,0x35,0x23,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x04,0x66, -0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x87,0x40,0x26,0x0f,0x0e,0x03,0x0e,0x0c,0x0d,0x06,0x0d,0x0f,0x42,0x0c,0x0c,0x08,0x16,0x16,0x0d,0x03,0x42,0x06,0x06,0x08,0x13,0x95,0x40,0x0e,0x0d,0x0f,0x05,0x01,0x08,0x12,0x13,0x0d,0x0e,0x0e,0x00,0x03,0x0d,0xb8,0xff,0xc0,0x40,0x16,0x0b,0x0f,0x48,0x0d,0x0d,0x06,0x09,0x00,0x83,0x01,0x0e, -0x03,0x08,0x06,0x42,0x08,0x83,0x09,0x09,0x19,0x16,0x03,0xb8,0x01,0x2e,0xb6,0x10,0x06,0x01,0x06,0x06,0x1a,0x19,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x2b,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x2f,0x33,0x33,0x3f,0x32,0x1a,0xed,0x12,0x39,0x2f,0xe5,0x12, -0x39,0x11,0x12,0x39,0x10,0xe5,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x04,0x03,0x23,0x36,0x12,0x37,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x13,0x16,0x17,0x36,0x37,0x04,0x66,0xae,0x21,0xfe,0xfd,0x9c,0xfe,0xf8,0x23,0xaf,0x29,0xb9,0xae,0xfe,0xc2,0x03,0xb5,0xfe,0xb8,0xab,0xb7,0xfe,0xd7, -0xfe,0x6f,0xb5,0x04,0x0a,0x04,0x0c,0x01,0x64,0x4e,0xfe,0x4e,0x01,0xb4,0x4b,0xfe,0x97,0xf6,0x01,0x01,0x34,0x01,0xd5,0xfe,0x29,0x36,0xff,0x00,0x02,0x86,0xfe,0xdd,0x06,0x18,0x0a,0x14,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x48,0x05,0x9a,0x00,0x18,0x00,0x1f,0x00,0xa9,0x40,0x3f,0x0c,0x0a,0x13,0x0a,0x16,0x03,0x15,0x03,0x13,0x14, -0x06,0x14,0x16,0x42,0x1c,0x1c,0x13,0x03,0x42,0x06,0x06,0x05,0x0c,0x91,0x40,0x13,0x11,0x0e,0x13,0x91,0x2b,0x30,0x1a,0x91,0x14,0x40,0x15,0x14,0x11,0x03,0x01,0x05,0x0a,0x03,0x0e,0x19,0x15,0x15,0x00,0x03,0x1a,0x00,0x14,0x10,0x14,0x02,0x0b,0x03,0x14,0x14,0x06,0x0a,0x00,0xb8,0x01,0x2f,0xb6,0x01,0x0e,0x03,0x09,0x06,0x42,0x09, -0xb8,0x01,0x2f,0x40,0x13,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0a,0x0e,0x1d,0x1c,0x03,0x7e,0x06,0x06,0x21,0x12,0x0e,0x7e,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x5d,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x17,0x33,0x3f,0x33,0x33, -0x1a,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0xe5,0x12,0x39,0x10,0xe5,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x06,0x02,0x03,0x23,0x12,0x25,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x01,0x17,0x33,0x36,0x37,0x07,0x48,0xc1, -0x2f,0xfe,0x87,0xa7,0xcb,0xcb,0x1b,0xc1,0x54,0x01,0x34,0xfe,0x16,0xa8,0xa8,0x02,0x54,0xfe,0x8a,0x04,0xa0,0xfe,0x51,0xea,0xf8,0xfe,0xaf,0xfd,0xa0,0x01,0x06,0x24,0x02,0x10,0x16,0x02,0x09,0x67,0xfd,0x90,0x02,0x72,0x39,0xfe,0xd3,0xfe,0xf4,0x02,0x0e,0x92,0xfd,0x60,0x05,0x9a,0xfd,0xa2,0x02,0x5e,0xfd,0x60,0x48,0xfe,0x9c,0x03, -0xb4,0xfe,0x52,0x58,0x35,0x23,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0xdf,0x04,0x00,0x00,0x17,0x00,0x1d,0x00,0xb8,0x40,0x4c,0x0b,0x09,0x12,0x09,0x15,0x03,0x14,0x03,0x12,0x13,0x06,0x15,0x05,0x1c,0x1c,0x13,0x03,0x42,0x06,0x06,0x05,0x0b,0x96,0x40,0x12,0x10,0x0d,0x12,0x96,0x2b,0x30,0x19,0x95,0x13,0x40,0x14,0x13,0x10,0x0f,0x01, -0x05,0x09,0x03,0x0d,0x18,0x14,0x14,0x00,0x03,0x19,0x00,0x13,0x10,0x13,0x20,0x13,0x60,0x13,0x04,0x0d,0x03,0x13,0x13,0x06,0x09,0x00,0x83,0x01,0x0e,0x03,0x08,0x06,0x42,0x08,0x83,0x09,0xb8,0xff,0xc8,0x40,0x0e,0x0b,0x0c,0x01,0x4c,0x09,0x40,0x09,0x0c,0x48,0x09,0x09,0x0d,0x1c,0x03,0xb8,0x01,0x2e,0x40,0x0c,0x0f,0x06,0x1f,0x06, -0x02,0x06,0x06,0x1f,0x11,0x0d,0x84,0x0e,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x17,0x33,0x3f,0x33,0x33,0x1a,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0xe5,0x12,0x39, -0x11,0x12,0x39,0x87,0x05,0xc0,0x10,0x87,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x04,0x03,0x23,0x12,0x37,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x01,0x21,0x01,0x16,0x16,0x01,0x21,0x13,0x16,0x17,0x37,0x05,0xdf,0xae,0x23,0xfe,0xfe,0x9c,0xfe,0xf7,0x21,0xae,0x3e,0xe2,0xfe,0x92,0xa4,0xa4,0x01,0xbc,0xfe, -0xe4,0x03,0xb4,0xfe,0xb8,0xab,0xb6,0xfe,0xd9,0xfe,0x6e,0xb4,0x07,0x07,0x11,0x01,0x66,0x4c,0xfe,0x4e,0x01,0xb4,0x4d,0xfe,0x99,0x01,0x72,0x67,0xfe,0x27,0x04,0x00,0xfe,0x58,0x01,0xa8,0xfe,0x29,0x36,0xff,0x02,0x85,0xfe,0xdd,0x0b,0x13,0x1e,0x00,0x00,0x01,0x00,0x31,0xfe,0x66,0x03,0xe2,0x06,0xcb,0x00,0x43,0x00,0x75,0x40,0x41, -0x32,0x7d,0x13,0x00,0x7d,0x01,0x2e,0x17,0x2c,0x7d,0x1b,0x13,0x01,0x1b,0x17,0x20,0x20,0x17,0x1b,0x01,0x13,0x05,0x45,0x3b,0x7e,0x09,0x03,0x9a,0x42,0x42,0x35,0x3e,0x0c,0x9a,0x39,0x39,0x35,0x2f,0x2e,0x16,0x9a,0x17,0x17,0x29,0x10,0x9a,0x35,0x27,0x26,0x0f,0x24,0x1f,0x24,0x02,0x24,0x20,0x1e,0x99,0x23,0x29,0x03,0x3e,0x9a,0x01, -0x07,0x00,0x2f,0x33,0xed,0x3f,0x33,0xed,0x32,0xc4,0x5d,0x39,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x23,0x34,0x23,0x22,0x07,0x06,0x23,0x20,0x11,0x34,0x36,0x33, -0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x37,0x03,0x33,0x17,0x37,0x33,0x03,0x36,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0xd3,0xb7,0x4d,0x2c,0x6f,0x70,0x45,0xfe, -0xb2,0xa6,0xa0,0x17,0x4b,0x4b,0x18,0x72,0x81,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x82,0xa2,0xb9,0x73,0xa4,0xa4,0x77,0xbd,0x58,0xea,0xfe,0xf0,0x94,0xae,0xdb,0xbd,0x18,0x58,0x58,0x18,0x93,0x56,0x4c,0x2b,0x7b,0x7b,0x4a,0xef,0xfe,0x66,0x4c,0x26,0x26,0x01,0x23,0x80,0x91,0x06,0x06,0x89,0x75,0x01,0x14,0x8b,0x8a, -0x7e,0x6c,0x82,0x71,0xaa,0x48,0x0d,0x01,0x1c,0xe5,0xe5,0xfe,0xdd,0x0a,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xb4,0xe2,0x06,0x06,0x89,0x3f,0x50,0x25,0x25,0x00,0x01,0x00,0x21,0xfe,0x66,0x03,0x3c,0x05,0x35,0x00,0x42,0x00,0x79,0xb3,0x31,0x84,0x13,0x00,0xb8,0x01,0x2e,0x40,0x13,0x01,0x2d,0x17,0x2a,0x84,0x1a,0x13,0x01, -0x1a,0x17,0x1f,0x1f,0x17,0x1a,0x01,0x13,0x05,0x44,0x3a,0xb8,0x01,0x2e,0x40,0x27,0x0a,0x03,0x96,0x41,0x41,0x34,0x3d,0x2e,0x2d,0x16,0x95,0x17,0x17,0x28,0x0d,0x96,0x38,0x38,0x28,0x11,0x96,0x34,0x15,0x1f,0x1d,0x95,0x0f,0x23,0x1f,0x23,0x02,0x23,0x22,0x28,0x0f,0x3d,0x95,0x01,0x07,0x00,0x2f,0x33,0xed,0x3f,0x33,0xc4,0x5d,0xed, -0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x23,0x34,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x34,0x21,0x23,0x35,0x33, -0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x37,0x03,0x33,0x17,0x37,0x33,0x03,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0x1e,0x95,0x3d,0x2e,0x55,0x55,0x38,0x82,0x99,0x9b,0x82,0x13,0x3b,0x3a,0x13,0xbf,0xfe,0xd6,0x64,0x60,0x01, -0x04,0x77,0x67,0x96,0x96,0x81,0x71,0xb6,0x73,0xa4,0xa4,0x77,0xb9,0xf9,0x71,0x61,0x70,0x8c,0xb0,0xa4,0x14,0x45,0x45,0x12,0x86,0x4b,0x41,0x2c,0x55,0x55,0x44,0xc6,0xfe,0x66,0x50,0x28,0x28,0x99,0x82,0x71,0x9a,0x07,0x08,0xa1,0xaa,0x8a,0xa4,0x45,0x53,0x4c,0x99,0x2e,0x0b,0x01,0x17,0xe5,0xef,0xfe,0xd9,0x29,0xdf,0x5b,0x80,0x15, -0x04,0x09,0x87,0x6a,0x89,0x97,0x07,0x07,0x85,0x42,0x51,0x25,0x25,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x05,0xc0,0x05,0x9a,0x00,0x19,0x00,0x3d,0x40,0x1e,0x14,0x11,0x91,0x04,0x07,0x07,0x06,0x18,0x12,0x0c,0x03,0x06,0x00,0x7e,0x17,0x17,0x1b,0x06,0x0c,0x0b,0x0b,0x1a,0x14,0x05,0x7e,0x11,0x06,0x06,0x1b,0x1a,0x11,0x12,0x39,0x2f, -0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x14,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x20,0x03,0x03,0x33,0x13,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x20,0x11,0x11,0x33,0x05,0xc0,0xfe,0xe1,0xf1,0x39,0x9c,0x54,0xfe,0xd9,0x54,0xa6,0xa4, -0xa0,0x1d,0x6b,0x6e,0x3b,0x9c,0x39,0x01,0x68,0xa8,0x03,0x87,0xdf,0xfe,0xdd,0xfe,0x7b,0x01,0x85,0x01,0x5f,0x02,0xb6,0xfd,0x5e,0x79,0x65,0x03,0x80,0xfc,0x80,0x01,0x6d,0x02,0x13,0x00,0x00,0x01,0x00,0x66,0xfe,0x1e,0x05,0x7b,0x05,0x33,0x00,0x1b,0x00,0x40,0x40,0x19,0x06,0x1c,0x13,0x13,0x1a,0x0d,0x0f,0x15,0x12,0x95,0x04,0x07, -0x16,0x00,0x84,0x19,0x19,0x1d,0x06,0x0d,0x0c,0x0c,0x1c,0x14,0x05,0xb8,0x01,0x2e,0xb4,0x13,0x06,0x06,0x1d,0x1c,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x33,0x2f,0x3f,0x31,0x30,0x01,0x10,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x26,0x27,0x03,0x33, -0x13,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x05,0x7b,0xfe,0xe4,0xe8,0x19,0x93,0x15,0xac,0xd4,0x3c,0x94,0xa6,0x94,0x2a,0x81,0x6f,0x11,0x93,0x19,0x96,0xca,0xa4,0x02,0x2d,0xfe,0xf4,0xfe,0xc9,0xfe,0x34,0x01,0xcc,0xca,0xf6,0x02,0x56,0xfd,0xaa,0xa9,0x88,0x04,0xba,0xfb,0x46,0xef,0xc3,0x01,0xd5,0x00, -0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x19,0x00,0x27,0x00,0x48,0x40,0x25,0x12,0x18,0x91,0x40,0x22,0x1c,0x0e,0x25,0x0f,0x14,0x42,0x0c,0x1a,0x14,0x91,0x20,0x20,0x00,0x0f,0x91,0x06,0x04,0x25,0x91,0x00,0x13,0x22,0x1a,0x12,0x09,0x7d,0x0c,0x0c,0x29,0x12,0x7d,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12, -0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x7c,0x2f,0x18,0xed,0x33,0x32,0x2b,0x00,0x18,0x10,0xf6,0x32,0x1a,0xed,0x32,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x24,0x23,0x22,0x00,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x17,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x05,0x16,0x00,0x33, -0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xbe,0x1a,0xfe,0xff,0xcf,0xd6,0xfe,0xea,0x0e,0xfc,0x46,0x3c,0x88,0x88,0x24,0x3d,0xfb,0xf0,0x52,0x3a,0x84,0x84,0x2e,0x2a,0xfe,0xf6,0x1a,0x01,0x09,0xc7,0xe4,0x01,0x0e,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd, -0xfe,0xa1,0xfe,0x68,0x03,0x52,0xe7,0xf9,0xfe,0xd8,0xf4,0x52,0x3a,0x3b,0x39,0x5a,0x3a,0x3a,0x56,0xe0,0xfe,0xf9,0x01,0x21,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x25,0x00,0x57,0x40,0x30,0x0b,0x25,0x1b,0x25,0x02,0x00,0x0f,0x10,0x0f,0x02,0x0c,0x03,0x11,0x17,0x95,0x40,0x21,0x1b,0x0e,0x24, -0x0e,0x13,0x42,0x0c,0x13,0x95,0x19,0x1f,0x1f,0x00,0x0e,0x95,0x06,0x10,0x24,0x95,0x00,0x16,0x09,0x83,0x0c,0x19,0x19,0x27,0x11,0x21,0x83,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x7c,0x2f,0x33,0x18,0xed,0x32,0x2b,0x00,0x18,0x10,0xf6,0x32,0x1a,0xed,0x32,0x31,0x30,0x01,0x5f,0x5e,0x5d, -0x5d,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x17,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x16,0x16,0x33,0x20,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0x69,0x22,0xfe,0xdc,0x8b,0xb5,0x12,0x8e,0x35,0x30,0x6c,0x6b, -0x1e,0x22,0x8e,0x84,0x34,0x30,0x68,0x68,0x26,0x1e,0x9c,0x12,0xb4,0x8c,0x01,0x26,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x64,0x01,0x42,0xaa,0x9a,0x31,0x34,0x35,0x5a,0x33,0x35,0x34,0x38,0x9a,0xaa,0x00,0x01,0x00,0x12,0x00,0x00,0x05,0xb8,0x05,0xb2,0x00,0x13,0x00,0x31,0x40,0x17,0x01,0x03, -0x91,0x12,0x04,0x09,0x03,0x0c,0x07,0x07,0x06,0x0c,0x0c,0x08,0x10,0x05,0x00,0x7e,0x01,0x01,0x15,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x39,0x19,0x2f,0x33,0x33,0x00,0x18,0x2f,0x33,0x3f,0x3f,0xfd,0xce,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x36,0x33, -0x32,0x05,0xb8,0x9a,0x0c,0x47,0x41,0x2a,0xfe,0x77,0xbd,0xfd,0xf8,0xbb,0x01,0x8d,0x13,0x0a,0x04,0x07,0x1a,0x01,0x3b,0x3f,0xbb,0xd1,0x04,0xc0,0x63,0x7d,0xfb,0x5a,0x05,0x9a,0xfb,0x8f,0x37,0x48,0x32,0x4f,0x03,0xc7,0xc0,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x04,0x9a,0x04,0x18,0x00,0x13,0x00,0x34,0x40,0x11,0x01,0x03,0x95,0x12, -0x10,0x09,0x0f,0x0c,0x07,0x07,0x06,0x0d,0x0d,0x08,0x10,0x05,0x00,0xb8,0x01,0x2e,0xb4,0x01,0x01,0x15,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x39,0x19,0x2f,0x33,0x33,0x00,0x18,0x2f,0x33,0x3f,0x3f,0xfd,0xce,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36, -0x33,0x32,0x04,0x9a,0x96,0x08,0x42,0x37,0x31,0xfe,0xe8,0xa8,0xfe,0x7c,0xb4,0x01,0x04,0x1d,0x07,0x04,0x08,0x18,0xbf,0x47,0xaa,0xc6,0x03,0x3c,0x54,0x88,0xfc,0xf8,0x04,0x00,0xfd,0x18,0x52,0x3d,0x45,0x46,0x02,0x32,0xd2,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x05,0xb8,0x07,0x5c,0x02,0x26,0x05,0xee,0x00,0x00,0x01,0x07,0x04,0x6e, -0x02,0x2f,0x01,0x5c,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x4b,0x40,0x0a,0x1a,0x14,0x08,0x00,0x25,0x02,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x0e,0x00,0x00,0x04,0x9a,0x06,0x00,0x02,0x26,0x05,0xef,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc1,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x6e, -0x40,0x0a,0x1a,0x14,0x08,0x00,0x25,0x02,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x04,0x00,0x5e,0xfe,0x66,0x0a,0x7f,0x05,0xdb,0x00,0x0d,0x00,0x1b,0x00,0x30,0x00,0x31,0x00,0x8f,0x40,0x33,0x0e,0x91,0x08,0x0e,0x00,0x0f,0x91,0x07,0x0e,0x01,0x16,0x91,0x00,0x15,0x91,0x40,0x01,0x01,0x07,0x32,0x31,0x24, -0x42,0x31,0x04,0x23,0x29,0x24,0x16,0x1d,0x1f,0x95,0x2f,0x10,0x26,0x0f,0x29,0x24,0x22,0x23,0x23,0x21,0x25,0x2e,0x20,0x06,0x20,0x01,0x20,0x26,0x1c,0xb8,0x01,0x2e,0x40,0x17,0x1d,0x1d,0x26,0x25,0x25,0x33,0x19,0x16,0x01,0x08,0x0f,0x01,0x0f,0x01,0x04,0x0b,0x7d,0x19,0x19,0x33,0x12,0x7d,0x04,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x11, -0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x2f,0xe1,0x12,0x39,0x5d,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x39,0x00,0x3f,0x3f,0xfd,0xce,0x3f,0x33,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x1a,0xed,0xdd,0xe6,0x10,0xf4,0xed,0x10,0xf4,0xe6,0x31,0x30,0x05,0x35,0x20,0x00,0x11,0x10,0x00,0x21,0x15, -0x20,0x00,0x11,0x10,0x00,0x01,0x35,0x22,0x00,0x11,0x10,0x00,0x33,0x15,0x32,0x00,0x11,0x10,0x00,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x13,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x33,0x32,0x13,0x02,0xfe,0xfe,0xd0,0xfe,0x90,0x01,0x7f,0x01,0x33,0x01,0x37,0x01,0x63,0xfe,0x8e,0xfe,0xd8,0xe7,0xfe,0xe5,0x01,0x12, -0xde,0xec,0x01,0x10,0xfe,0xfe,0x06,0x81,0x95,0x0a,0x40,0x3c,0x2d,0xfe,0x75,0xac,0x8f,0xfe,0x79,0xb4,0x01,0x04,0x1c,0x07,0x05,0x06,0x1a,0xaa,0x40,0xb2,0xc6,0x1b,0x42,0x52,0x01,0x93,0x01,0x43,0x01,0x52,0x01,0xa3,0x52,0xfe,0x76,0xfe,0xb7,0xfe,0xa2,0xfe,0x66,0x05,0x34,0x52,0xfe,0xb3,0xfe,0xfd,0xfe,0xf7,0xfe,0xbd,0x52,0x01, -0x34,0x01,0x16,0x01,0x1a,0x01,0x38,0xfe,0x4a,0x54,0x88,0xfb,0x5e,0x01,0x82,0x04,0x18,0xfd,0x18,0x51,0x3e,0x36,0x55,0x02,0x32,0xd2,0x01,0x9a,0x00,0x03,0x00,0x58,0xfe,0x66,0x08,0xec,0x04,0x38,0x00,0x0d,0x00,0x1a,0x00,0x2f,0x00,0x83,0x40,0x2b,0x0e,0x95,0x08,0x0e,0x00,0x0f,0x95,0x07,0x0e,0x01,0x16,0x95,0x00,0x15,0x95,0x40, -0x01,0x2e,0x23,0x42,0x22,0x29,0x23,0x16,0x1c,0x1e,0x95,0x2e,0x10,0x25,0x0f,0x29,0x23,0x2c,0x21,0x22,0x22,0x24,0x2c,0x20,0x20,0x25,0x1b,0xb8,0x01,0x2e,0x40,0x17,0x1c,0x1c,0x25,0x24,0x24,0x31,0x19,0x15,0x00,0x0e,0x07,0x00,0x07,0x00,0x04,0x0b,0x83,0x19,0x19,0x31,0x12,0x83,0x04,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39, -0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x2f,0xe1,0x12,0x39,0x11,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x39,0x00,0x3f,0x3f,0xfd,0xce,0x3f,0x33,0x2f,0x2b,0x00,0x7d,0x2f,0x1a,0x18,0xed,0xdd,0xed,0x10,0xf4,0xed,0x10,0xf4,0xed,0x31,0x30,0x05,0x35,0x22,0x00,0x35,0x34,0x00,0x33,0x15,0x32,0x00,0x15,0x14,0x00,0x03, -0x35,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x32,0x36,0x35,0x10,0x05,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x13,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x33,0x32,0x02,0x4e,0xe7,0xfe,0xf1,0x01,0x1a,0xea,0xeb,0x01,0x01,0xfe,0xeb,0xd7,0xa2,0xba,0xb3,0x9b,0xa1,0xb1,0x05,0x4c,0x96,0x08,0x42,0x3b,0x2d,0xfe,0x74,0xac,0x90, -0xfe,0x78,0xb5,0x01,0x04,0x1c,0x07,0x04,0x07,0x19,0xaa,0x40,0xb2,0xc6,0x38,0x3e,0x01,0x20,0xec,0xfa,0x01,0x2c,0x3e,0xfe,0xe6,0xfa,0xf6,0xfe,0xd8,0x03,0xa6,0x3e,0xd3,0xc1,0xb8,0xce,0x3e,0xd0,0xbb,0x01,0x8f,0x32,0x54,0x88,0xfb,0x5e,0x01,0x82,0x04,0x18,0xfd,0x18,0x51,0x3e,0x36,0x55,0x02,0x32,0xd2,0x00,0x00,0x02,0x00,0x5e, -0xff,0xb4,0x06,0x3e,0x05,0xec,0x00,0x13,0x00,0x26,0x00,0x5b,0x40,0x31,0x20,0x1e,0x16,0x18,0x0c,0x0a,0x02,0x04,0x14,0x18,0x91,0x0e,0x42,0x0a,0x04,0x22,0x1e,0x91,0x40,0x00,0x04,0x13,0x11,0x7d,0x25,0x0e,0x0e,0x1b,0x04,0x42,0x22,0x18,0x14,0x0a,0x00,0x00,0x0a,0x14,0x18,0x22,0x05,0x0e,0x1e,0x04,0x04,0x28,0x1b,0x7d,0x07,0x2f, -0xe1,0x12,0x39,0x2f,0x33,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x32,0x3f,0xe5,0xed,0x32,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x05,0x06,0x23,0x22,0x27,0x24,0x00,0x11,0x10,0x00,0x25,0x36,0x33,0x32,0x17,0x04,0x00,0x11,0x10,0x00,0x01,0x06,0x23,0x22,0x27, -0x06,0x00,0x15,0x14,0x12,0x17,0x36,0x33,0x32,0x17,0x36,0x12,0x35,0x10,0x03,0xb0,0x26,0x42,0x42,0x27,0xfe,0xd0,0xfe,0xaf,0x01,0x53,0x01,0x39,0x25,0x49,0x48,0x24,0x01,0x2c,0x01,0x4e,0xfe,0xad,0xfe,0xd1,0x26,0x3e,0x3e,0x26,0xe5,0xfe,0xff,0xf5,0xdc,0x27,0x42,0x42,0x26,0xe5,0xf9,0x14,0x38,0x38,0x1b,0x01,0x7e,0x01,0x37,0x01, -0x46,0x01,0x8b,0x1f,0x40,0x3e,0x1b,0xfe,0x82,0xfe,0xca,0xfe,0xb3,0xfe,0x76,0x05,0x0c,0x30,0x30,0x18,0xfe,0xc9,0xfa,0xf9,0xfe,0xcf,0x1c,0x37,0x37,0x1b,0x01,0x2a,0xfe,0x02,0x16,0x00,0x00,0x02,0x00,0x60,0xff,0xb0,0x04,0xd3,0x04,0x4e,0x00,0x11,0x00,0x21,0x00,0x59,0x40,0x31,0x0b,0x09,0x14,0x12,0x42,0x16,0x95,0x0d,0x09,0x10, -0x02,0x04,0x1c,0x1e,0x1a,0x95,0x40,0x00,0x42,0x04,0x16,0x0f,0x83,0x20,0x0e,0x0d,0x18,0x04,0x42,0x1e,0x1a,0x16,0x12,0x09,0x00,0x00,0x09,0x12,0x16,0x1a,0x1e,0x06,0x0d,0x04,0x04,0x23,0x18,0x83,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0xe5,0x1a,0xfd, -0x32,0xcd,0x10,0xcd,0x3f,0x33,0xfd,0xf5,0xcd,0x10,0xcd,0x31,0x30,0x05,0x06,0x23,0x22,0x27,0x26,0x02,0x35,0x10,0x25,0x36,0x33,0x32,0x17,0x04,0x11,0x14,0x02,0x03,0x06,0x23,0x22,0x27,0x04,0x11,0x10,0x05,0x36,0x33,0x32,0x17,0x24,0x11,0x10,0x03,0x0a,0x26,0x48,0x46,0x27,0xe3,0xec,0x01,0xdc,0x26,0x46,0x46,0x26,0x01,0xbf,0xf0, -0xd1,0x26,0x44,0x46,0x26,0xfe,0xcc,0x01,0x29,0x27,0x44,0x44,0x26,0x01,0x25,0x10,0x40,0x3e,0x19,0x01,0x0f,0xde,0x01,0xe8,0x36,0x3c,0x3c,0x32,0xfe,0x24,0xde,0xfe,0xe9,0x03,0x74,0x37,0x3b,0x2f,0xfe,0xa2,0xfe,0xb2,0x31,0x37,0x37,0x2f,0x01,0x54,0x01,0x4e,0x00,0x03,0x00,0x5e,0xff,0xe8,0x08,0xaa,0x08,0x05,0x00,0x29,0x00,0x41, -0x00,0x4d,0x00,0x5e,0x40,0x31,0x36,0x37,0x37,0x4c,0x47,0x2a,0x2a,0x47,0x20,0x0a,0x05,0x25,0x7d,0x1a,0x47,0x1a,0x47,0x1a,0x4f,0x10,0x7d,0x05,0x1d,0x91,0x22,0x04,0x42,0x42,0x08,0x49,0x49,0x2c,0x31,0x96,0x3c,0x3c,0x2a,0x96,0x37,0x2c,0x2c,0x0d,0x91,0x08,0x04,0x13,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0x33,0x2f,0x33,0xed, -0x32,0x2f,0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0x3f,0xed,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x39,0x11,0x33,0x2f,0x11,0x33,0x33,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23, -0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x13,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x01,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x04,0x85,0xc2,0xcb,0xfe,0xd3,0xfe,0x93,0x01,0x66,0x01,0x32,0x9e,0x6e,0x6a,0xa4,0xdf,0xfe,0xf9,0x01, -0x0e,0xf0,0xdd,0x9a,0x9a,0xdf,0xf0,0x01,0x0e,0xfe,0xfa,0xe0,0xa4,0x6a,0x6e,0x9e,0x01,0x31,0x01,0x67,0xfe,0x93,0xfe,0xd3,0xc8,0xc9,0x29,0x4a,0x85,0x78,0x6b,0x30,0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x40,0x76,0x77,0x79,0x43,0xfe,0x59,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x3e,0x56,0x01,0x8e,0x01,0x4c,0x01,0x4c,0x01, -0xa4,0x2b,0xb2,0x45,0xfe,0xba,0xfe,0xf2,0xfe,0xeb,0xfe,0xce,0x60,0x60,0x01,0x31,0x01,0x16,0x01,0x0d,0x01,0x47,0x45,0xb2,0x2b,0xfe,0x5e,0xfe,0xb4,0xfe,0xb4,0xfe,0x70,0x07,0xa3,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0xfe,0x54,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0x00,0x03,0x00,0x60, -0xff,0xe8,0x06,0xc6,0x06,0x9d,0x00,0x29,0x00,0x41,0x00,0x4d,0x00,0x5d,0x40,0x31,0x36,0x37,0x37,0x4c,0x47,0x2a,0x2a,0x47,0x0b,0x1f,0x05,0x25,0x83,0x1a,0x47,0x1a,0x47,0x1a,0x4f,0x10,0x83,0x05,0x42,0x42,0x08,0x49,0x49,0x2c,0x31,0x96,0x3c,0x3c,0x41,0x96,0x36,0x2c,0x00,0x1d,0xec,0x22,0x10,0x0d,0xec,0x08,0x10,0x13,0x95,0x02, -0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x32,0x2f,0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x39,0x11,0x33,0x2f,0x11,0x33,0x33,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32, -0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x13,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x01,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x03,0x96,0x96,0xac,0xe8,0xfe,0xf4,0x01,0x08,0xde,0x84, -0x63,0x69,0x82,0x93,0xa7,0xbb,0xad,0xa2,0x82,0x81,0xa1,0xad,0xbb,0xa6,0x92,0x83,0x69,0x63,0x85,0xde,0x01,0x06,0xfe,0xf5,0xe8,0xa9,0xf1,0x29,0x4a,0x85,0x78,0x6b,0x30,0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x40,0x76,0x77,0x79,0x43,0xfe,0x59,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x42,0x5a,0x01,0x25,0xed,0xf0,0x01,0x2e, -0x30,0xaa,0x49,0xd2,0xb9,0xb3,0xd5,0x63,0x63,0xd2,0xb6,0xb9,0xd2,0x49,0xaa,0x30,0xfe,0xd1,0xef,0xec,0xfe,0xda,0x06,0x3b,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0xfe,0x54,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x06,0xca,0x06,0xdb,0x02,0x26,0x05,0xda, -0x00,0x00,0x01,0x07,0x06,0x65,0x02,0x1f,0x01,0x0a,0x00,0x08,0xb3,0x01,0x3e,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x1e,0x00,0x00,0x05,0x5e,0x05,0x7f,0x02,0x26,0x05,0xdb,0x00,0x00,0x01,0x07,0x06,0x65,0x01,0x53,0xff,0xae,0x00,0x16,0xb9,0x00,0x01,0xff,0xea,0x40,0x09,0x20,0x15,0x08,0x00,0x25,0x01,0x1f,0x11,0x26,0x00,0x2b, -0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x5e,0xfe,0x66,0x04,0x8c,0x05,0xb2,0x00,0x15,0x00,0x31,0x40,0x1a,0x30,0x00,0x01,0x00,0x00,0x02,0x91,0x13,0x04,0x0c,0x0a,0x08,0x91,0x0d,0x13,0x0a,0x7e,0x0d,0x0d,0x10,0x00,0x00,0x17,0x05,0x7d,0x10,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x2f,0x3f,0xed,0x32,0x2f, -0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x23,0x11,0x24,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x04,0x8c,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0x20,0x2e,0xa8,0xfe,0xe8,0xfe,0xba,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x04,0xc4,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x04,0xfd,0xe3,0x01,0x82, -0x16,0x01,0x85,0x01,0x2f,0x01,0x58,0x01,0xa8,0x3b,0x00,0x01,0x00,0x60,0xfe,0x66,0x03,0x62,0x04,0x18,0x00,0x15,0x00,0x2d,0x40,0x17,0x00,0x00,0x02,0x95,0x13,0x10,0x0c,0x0a,0x08,0x96,0x0d,0x16,0x0a,0x84,0x0d,0x0d,0x10,0x00,0x00,0x17,0x05,0x83,0x10,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x2f,0x3f, -0xed,0x32,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x11,0x26,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x03,0x62,0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x1e,0x28,0xa2,0xc0,0xe8,0x01,0x22,0xf2,0x87,0x67,0x03,0x3e,0x50,0xe1,0xb7,0xb4,0xd0,0x09,0xfd,0xeb,0x01,0x88,0x15,0x01,0x17,0xce,0xfd,0x01,0x33, -0x32,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x03,0xd5,0x05,0x9a,0x00,0x13,0x00,0xc8,0x40,0x6b,0x09,0x08,0x11,0x06,0x07,0x12,0x05,0x0a,0x05,0x0c,0x08,0x11,0x03,0x07,0x12,0x04,0x0b,0x04,0x0d,0x08,0x11,0x02,0x01,0x0e,0x01,0x13,0x07,0x12,0x10,0x08,0x11,0x00,0x0f,0x0f,0x0e,0x0e,0x00,0x04,0x0a,0x42,0x05,0x04,0x04,0x03,0x13,0x06, -0x03,0x02,0x07,0x12,0x07,0x02,0x03,0x06,0x13,0x04,0x12,0x07,0x10,0x0d,0x0c,0x09,0x08,0x11,0x08,0x09,0x0c,0x0d,0x10,0x04,0x11,0x08,0x00,0x01,0x0f,0x0a,0x0b,0x05,0x40,0x04,0x05,0x0e,0x0f,0x05,0x0f,0x05,0x08,0x12,0x11,0x03,0x07,0x08,0x11,0x12,0x07,0x0b,0x0a,0x0e,0x08,0x12,0x00,0x42,0x00,0x12,0x12,0x15,0x08,0x2f,0x12,0x39, -0x2f,0xce,0x2b,0x01,0x10,0xe2,0x32,0x33,0x11,0x33,0x00,0x18,0x2f,0x33,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x1a,0x10,0xcd,0x32,0x10,0xcd,0x32,0x11,0x12,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x33,0x2b,0x01,0x10,0xe1,0x32, -0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x07,0x25,0x03,0x05,0x07,0x25,0x03,0x23,0x13,0x25,0x37,0x05,0x13,0x25,0x37,0x05,0x13,0x33,0x03,0x03,0xd5,0x37,0xfe,0xe5,0x99,0x01,0x16,0x38,0xfe,0xec,0xac,0x91,0xc3,0xfe,0xf3,0x37,0x01,0x0a,0x9a, -0xfe,0xfa,0x38,0x01,0x04,0xa1,0x93,0xba,0x03,0x6a,0x7a,0x7e,0xfe,0x9c,0x7c,0x7c,0x7c,0xfe,0x72,0x01,0xc4,0x78,0x7c,0x76,0x01,0x62,0x74,0x7e,0x75,0x01,0x79,0xfe,0x50,0x00,0x00,0x01,0x00,0x52,0x04,0xc2,0x02,0xd7,0x05,0xcb,0x00,0x11,0x00,0x18,0x40,0x0a,0x0b,0x08,0xe2,0x00,0x02,0x09,0x0e,0x00,0x0e,0x05,0x2f,0xcd,0xcd,0x10, -0xcd,0x00,0x2f,0xdd,0xfd,0xcc,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x0a,0x0a,0x52,0x26,0x36,0x36,0x26,0x01,0x73,0x0b,0x4f,0x26,0x36,0x36,0x26,0x05,0x12,0x50,0x36,0x26,0x27,0x36,0x50,0x36,0x27,0x26,0x36,0x00,0x01,0x00,0x5e,0x04,0xc2,0x03,0x0a,0x05,0xbe, -0x00,0x0f,0x00,0x1c,0x40,0x0d,0x0e,0x4c,0x03,0x09,0x99,0x00,0x08,0x00,0xc2,0x01,0x01,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x33,0xed,0xdc,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x06,0x23,0x23,0x35,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0x0a,0x7a,0x32,0x64,0x32,0x61,0x61,0x42,0x66,0x50,0x3d,0x6a,0x69,0x4c,0x97, -0x04,0xc2,0x88,0x44,0x44,0x9a,0x31,0x31,0xff,0xff,0xff,0x90,0x04,0x7b,0x00,0x7d,0x06,0x23,0x00,0x07,0x04,0x61,0xfd,0xae,0x00,0x00,0xff,0xff,0xff,0x86,0x04,0x7b,0x00,0x71,0x06,0x23,0x00,0x07,0x04,0x29,0xfd,0xa2,0x00,0x00,0x00,0x08,0x00,0x21,0xfe,0xcf,0x07,0xbc,0x05,0x5a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b, -0x00,0x47,0x00,0x53,0x00,0x5f,0x00,0xd5,0x40,0x74,0x0d,0x11,0x19,0x03,0x1d,0x0f,0x1b,0xc3,0x15,0x21,0x21,0x09,0x39,0x3d,0x41,0x49,0x03,0x4d,0x3f,0x4b,0xc3,0x45,0x51,0x51,0x39,0x5d,0x55,0x59,0x57,0xc3,0x40,0x5d,0x0e,0x30,0x39,0x05,0x42,0x09,0xc3,0x03,0x01,0x05,0x2d,0x39,0xc3,0x27,0x33,0x40,0x24,0x2a,0x35,0x03,0x30,0x3c, -0x0c,0xc4,0x3d,0x0d,0x0d,0x80,0x41,0x11,0xc4,0x42,0x12,0x0e,0x2a,0x30,0x18,0x42,0x48,0x18,0xc4,0x49,0x19,0x4d,0x1d,0xc4,0x4e,0x1e,0x1e,0x06,0x36,0x24,0xc4,0x25,0x25,0x80,0x29,0xc4,0x2a,0x0e,0x06,0x30,0x00,0x42,0x54,0x00,0xc4,0x55,0x01,0x59,0x05,0xc4,0x5a,0x06,0x06,0x61,0x36,0x30,0xc4,0x31,0x80,0x35,0xc4,0x36,0x2f,0xe1, -0x1a,0xdc,0xe1,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0xdc,0x32,0xe1,0x32,0x2b,0x01,0x10,0xf2,0xe1,0x1a,0xc8,0x18,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0xdc,0x32,0xe1,0x32,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x32,0x1a,0xc8,0x18,0x2f,0x32,0xe1,0x32,0x00,0x2f,0x17,0x33,0x1a,0xdc,0x32,0xed,0x32,0x2f,0x33,0xde,0xed,0x2b,0x00, -0x18,0x10,0xf6,0x1a,0xfd,0xce,0x32,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0xce,0x17,0x32,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0xce,0x17,0x32,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32, -0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x04,0xa2,0x50, -0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x02,0x8f,0x50,0x08,0x67,0x62,0x0e,0x52,0x08,0x6b,0x4f,0x52,0x6a,0xfa,0xfd,0x50,0x08,0x67,0x63,0x0d,0x52,0x08,0x6b,0x4f,0x52,0x6a,0x05,0x98,0x50,0x08,0x66,0x64,0x0c,0x52,0x07,0x6b,0x50,0x52,0x69,0xf9,0xe9,0x50,0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x05,0x8f, -0x50,0x08,0x67,0x62,0x0e,0x52,0x08,0x6b,0x4f,0x52,0x6a,0xfa,0xfd,0x50,0x08,0x67,0x63,0x0d,0x52,0x08,0x6b,0x4f,0x52,0x6a,0x02,0x7e,0x50,0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x04,0xa4,0x6a,0x6a,0x53,0x63,0x63,0xfe,0xaf,0x6a,0x6a,0x52,0x64,0x63,0x53,0x6a,0x6a,0x52,0x64,0x63,0xfd,0xc3,0x6b,0x6b,0x52,0x64,0x62, -0x54,0x6b,0x6b,0x53,0x63,0x62,0xfd,0xc1,0x6b,0x6b,0x52,0x64,0x63,0x53,0x6b,0x6b,0x52,0x64,0x63,0xfe,0xab,0x6b,0x6b,0x53,0x63,0x63,0x00,0x08,0x00,0x35,0xfe,0x66,0x07,0x68,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x95,0x40,0x4d,0x4f,0x15,0x5f,0x15,0x02,0x15,0x17,0x19, -0x1b,0x17,0x1b,0x17,0x1f,0x12,0x0b,0x09,0x40,0x07,0x50,0x07,0x02,0x07,0x05,0x09,0x05,0x09,0x05,0x0c,0x02,0x1e,0x2f,0x1f,0x01,0x1f,0x0c,0x03,0x02,0x12,0x10,0x0e,0x0c,0x14,0x16,0x08,0x0a,0x06,0x04,0x1a,0x18,0x1e,0x1c,0x00,0x02,0x16,0x0a,0x16,0x0a,0x11,0x02,0x18,0x04,0x18,0x04,0x1c,0x02,0x1c,0x02,0x0c,0x10,0x11,0x11,0x21, -0x0d,0x0c,0x0c,0x21,0x20,0x11,0x12,0x39,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x00,0x2f,0xcd,0xd6,0xdd,0xd6,0xcd,0x10,0xd6,0x5d,0xcd,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x5d,0x10,0xcd,0x11, -0x12,0x39,0x39,0x2f,0x2f,0xcd,0x10,0xcd,0x5d,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x07,0x03,0x37,0x05,0x05,0x27,0x25,0x01,0x25,0x35,0x05,0x05,0x25,0x35,0x05,0x01,0x07,0x03,0x37,0x05,0x05,0x27,0x25,0x05,0x03,0x23,0x13,0x04,0x4c,0x5c,0x7c,0x76,0xfe,0x6a,0x58,0xa6,0x46,0x05,0x16,0xfe,0xc7,0x58,0x01,0x4d,0xfb,0x28,0xfe,0x9f, -0x01,0x61,0x05,0xd2,0xfe,0xa0,0x01,0x60,0xfe,0xe0,0x46,0xb8,0x58,0xfc,0xdb,0xfe,0xb2,0x43,0x01,0x39,0x02,0x04,0x75,0x62,0x5c,0x05,0x9a,0xfe,0xa0,0x01,0x60,0xfe,0x10,0x58,0x01,0x4e,0x44,0xb1,0xb8,0x58,0xa6,0xfd,0x2d,0x74,0x63,0x5c,0x9e,0x5c,0x7b,0x74,0xfd,0x7a,0x44,0x01,0x3a,0x58,0x81,0xa6,0x46,0xb8,0xbf,0xfe,0xa0,0x01, -0x60,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0x45,0x40,0x23,0x0a,0x01,0x91,0x07,0x04,0x04,0x05,0x13,0x91,0x0b,0x0b,0x05,0x03,0x14,0x91,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x7d,0x18,0x18,0x1c,0x0b,0x07,0x14,0x7e,0x04,0x00,0x00,0x1c,0x1b,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x12, -0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x93,0x93,0xa8,0xa2,0xa2,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe, -0xec,0x95,0xa2,0xfe,0xc9,0x04,0x74,0x9a,0x8c,0x8c,0x9a,0xfe,0xc6,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x03,0xb4,0x05,0xec,0x00,0x12,0x00,0x19,0x00,0x47,0x40,0x24,0x0a,0x01,0x96,0x07,0x04,0x04,0x06,0x0b,0x95,0x13,0x13,0x00,0x06,0x00,0x14,0x95,0x00,0x02,0x00,0x09, -0x09,0x14,0x0f,0x83,0x17,0x17,0x1b,0x0b,0x07,0x14,0x84,0x04,0x00,0x00,0x1b,0x1a,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x11,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x32,0x16, -0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0x79,0x79,0xa4,0x81,0x81,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x04,0xd1,0x85,0x96,0x96,0x85,0xfd,0xa6,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x75,0x40,0x3f, -0x16,0x00,0x15,0x01,0x15,0x13,0x03,0x14,0x02,0x14,0x03,0x00,0x06,0x09,0x16,0x13,0x10,0x0f,0x01,0x02,0x06,0x14,0x0f,0x15,0x1f,0x15,0x2f,0x15,0x03,0x15,0x15,0x0f,0x06,0x91,0x10,0x10,0x08,0x0f,0x91,0x09,0x03,0x08,0x02,0x01,0x01,0x0d,0x07,0x15,0x00,0x14,0x01,0x14,0x14,0x10,0x0d,0x7d,0x18,0x18,0x1c,0x10,0x07,0x7e,0x08,0x2f, -0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0x10,0xc6,0x32,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x01,0x17,0x07,0x27,0x06,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16, -0x15,0x14,0x01,0x11,0x33,0x32,0x37,0x27,0x37,0x17,0x36,0x35,0x10,0x21,0x03,0x81,0x75,0x73,0x7d,0x67,0x7e,0xbd,0xa8,0x01,0x8a,0xe6,0xfd,0xfd,0x3b,0xb0,0x52,0x46,0x66,0x72,0x6f,0x52,0xfe,0xb0,0x02,0x89,0xb0,0x4d,0xba,0x28,0xfd,0xe2,0x05,0x9a,0xe0,0xcc,0xe3,0x01,0xf7,0xfd,0xb4,0x15,0x97,0x4e,0xa4,0x4e,0x8c,0x01,0x1c,0x00, -0x00,0x02,0x00,0xa6,0xfe,0x23,0x04,0x54,0x04,0x18,0x00,0x14,0x00,0x25,0x00,0x7c,0x40,0x44,0x18,0x00,0x17,0x01,0x17,0x15,0x03,0x16,0x02,0x16,0x03,0x00,0x05,0x10,0x18,0x15,0x24,0x1d,0x09,0x1c,0x01,0x02,0x05,0x16,0x17,0x40,0x09,0x0c,0x48,0x17,0x17,0x1d,0x24,0x95,0x05,0x16,0x0e,0x1d,0x95,0x10,0x10,0x0c,0x0f,0x02,0xdf,0x01, -0x01,0x01,0x01,0x13,0x09,0x17,0x00,0x16,0x01,0x16,0x16,0x21,0x13,0x83,0x1a,0x1a,0x27,0x21,0x0c,0x09,0x84,0x0a,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0x5d,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0x2b,0x33,0x10,0xc6,0x32,0x3f,0x11,0x12,0x39,0x39,0x11,0x12,0x39, -0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x25,0x17,0x07,0x27,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x05,0x27,0x37,0x17,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x03,0xae,0x70,0x72,0x72,0x52,0x67,0xd7,0x5c,0x04,0xa4,0xa4,0x04,0x74, -0xee,0xc0,0xe4,0xfe,0x92,0x78,0x74,0x72,0x5a,0xa2,0x85,0x8d,0xb0,0xa6,0x80,0x42,0x56,0xa8,0x4e,0xaa,0x22,0xac,0xfd,0x8f,0x05,0xdd,0xb4,0xcc,0xfe,0xf2,0xe3,0xfe,0xc9,0x69,0xb1,0x4d,0xaa,0x71,0xd0,0xa9,0xc9,0xc9,0x98,0x8f,0x7f,0xad,0x00,0x01,0x00,0xbc,0xfe,0x66,0x04,0x33,0x05,0x9a,0x00,0x19,0x00,0x40,0x40,0x24,0x18,0x91, -0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0b,0x0a,0x91,0x11,0x11,0x0b,0x10,0x91,0x0d,0x03,0x0b,0x0f,0x0f,0x0c,0x15,0x7d,0x06,0x06,0x1b,0x11,0x0b,0x7e,0x01,0x42,0x0c,0x2f,0xe2,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x10,0xde,0x32,0x5d,0xed,0x31,0x30,0x13,0x35,0x16,0x33, -0x32,0x36,0x35,0x34,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x20,0x00,0x11,0x14,0x00,0x21,0x22,0xbe,0xa4,0x9a,0xbd,0xca,0xfe,0xdb,0x46,0xa8,0x02,0xd0,0xfd,0xd8,0x4a,0x01,0x27,0x01,0x5e,0xfe,0xd9,0xfe,0xf4,0xae,0xfe,0xb2,0xb8,0x6c,0xdf,0xcb,0xd5,0x01,0x25,0xfd,0x5e,0x05,0x9a,0x9a,0xfe,0x3a,0xfe,0x97,0xfe, -0xdd,0xfd,0xfe,0xb5,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xaa,0x04,0x00,0x00,0x19,0x00,0x3f,0x40,0x23,0x18,0x95,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0b,0x0a,0x95,0x11,0x11,0x0b,0x10,0x95,0x0d,0x0f,0x0b,0x0e,0x0e,0x0c,0x15,0x83,0x06,0x06,0x1b,0x11,0x0b,0x84,0x01,0x0c,0x2f,0x33,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11, -0x39,0x2f,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x10,0xde,0x32,0x5d,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0xa6,0x75,0x8b,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0x02,0x76,0xfe,0x2e,0x42,0xf7,0x01,0x27,0xfe,0xe9,0xef,0x99, -0xfe,0xa0,0xa0,0x4e,0xbb,0xa9,0xb9,0xd7,0xfe,0x1a,0x04,0x00,0x8c,0xff,0x00,0xfe,0xdd,0xf9,0xd7,0xfe,0xe5,0x00,0x00,0x01,0x00,0x60,0xfe,0xae,0x03,0xe2,0x05,0xb2,0x00,0x31,0x00,0x79,0x40,0x46,0x08,0x0a,0xe2,0x40,0x05,0x32,0x80,0x00,0x0e,0x26,0x2c,0x2b,0x18,0x92,0x1b,0x1b,0x26,0x00,0x11,0x10,0x11,0x20,0x11,0x03,0x11,0x13, -0x92,0x0e,0x13,0x0f,0x23,0x1f,0x23,0x2f,0x23,0x03,0x23,0x21,0x92,0x26,0x04,0x08,0x02,0xc2,0x0c,0x00,0xc2,0x0e,0x0e,0x2f,0x10,0x2b,0x19,0x29,0x7d,0x1e,0x23,0x1e,0x19,0x19,0x1e,0x23,0x03,0x10,0x2f,0x7d,0x16,0x16,0x33,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1, -0xd6,0xe1,0xc6,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x5d,0x12,0x39,0x2f,0xed,0x39,0x39,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x05,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22, -0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x06,0x02,0x4c,0x35,0x5a,0x4c,0x47,0x38,0x32,0x30,0x44,0x2d,0xf1,0x84,0xa8,0xd5,0x9b,0xb7,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x9e,0xce,0xcc,0xea,0xfe,0xf0,0x94,0xae,0xd8,0x10,0x56,0x40,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x3e,0x50,0x54,0xb6, -0x7b,0x96,0x7f,0x01,0x14,0x8b,0x8a,0x7e,0x6c,0x82,0x71,0xaa,0x58,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xab,0xe1,0x00,0x01,0x00,0x58,0xfe,0xae,0x03,0x44,0x04,0x18,0x00,0x2e,0x00,0x70,0x40,0x3d,0x08,0x0a,0xe2,0x40,0x05,0x2f,0x80,0x00,0x0e,0x24,0x29,0x28,0x17,0x95,0x40,0x1a,0x24,0x0e,0x1a,0x95,0x2b,0x30,0x11,0x13, -0x95,0x0e,0x16,0x21,0x1f,0x95,0x24,0x10,0x08,0x02,0xc2,0x0c,0x00,0xc2,0x0e,0x0e,0x2c,0x11,0x29,0x18,0x26,0x84,0x1c,0x21,0x1c,0x18,0x18,0x1c,0x21,0x03,0x11,0x2c,0x84,0x15,0x15,0x30,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0xc6,0x00,0x3f,0xfd,0xc6, -0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x05,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x35,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15, -0x16,0x16,0x15,0x14,0x06,0x02,0x00,0x33,0x5a,0x4b,0x48,0x38,0x32,0x30,0x44,0x2d,0xc9,0x66,0x86,0xb4,0x01,0x0e,0xfe,0xd7,0x65,0x60,0x01,0x05,0x77,0x68,0x96,0x96,0xaa,0x8e,0x01,0x76,0xd2,0x70,0x8c,0xac,0x12,0x53,0x41,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x3e,0x50,0x04,0x30,0xa2,0x4c,0xac,0xaa,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d, -0xfe,0xee,0xbe,0x32,0x04,0x09,0x87,0x6a,0x77,0xa0,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x18,0x00,0x52,0x40,0x2a,0x08,0x11,0x96,0x0b,0x0e,0x0e,0x0d,0x13,0x04,0x18,0x04,0x18,0x01,0x18,0x06,0x16,0x0d,0x03,0x01,0x06,0x10,0x10,0x16,0x11,0x16,0x17,0x17,0x06,0x01,0x00,0x00,0x1a,0x19,0x09,0x0e,0x11,0x18,0x03, -0x06,0x7e,0x0b,0x07,0x2f,0x33,0xe1,0x17,0x32,0xc6,0x11,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x5d,0x11,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x37, -0x01,0x33,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x25,0x0d,0xfd,0x3e,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x4d,0x40,0x27,0x0f,0x06, -0x96,0x0c,0x09,0x09,0x0b,0x00,0x11,0x02,0x14,0x14,0x04,0x12,0x0f,0x01,0x04,0x0e,0x0e,0x12,0x0f,0x07,0x05,0x12,0x13,0x13,0x04,0x01,0x00,0x00,0x16,0x0c,0x0f,0x14,0x03,0x04,0x84,0x09,0x05,0x2f,0x33,0xe1,0x17,0x32,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x10,0xc6,0x11,0x12,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x11,0x39,0x11,0x33, -0x33,0x3f,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5, -0xfe,0x12,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0xac,0x05,0x9a,0x00,0x12,0x00,0x42,0x40,0x20,0x0d,0x04,0x12,0x12,0x06,0x08,0x91,0x10,0x0b,0x03,0x01,0x06,0x10,0x11,0x11,0x06,0x01,0x00,0x00,0x14,0x07,0x09,0x09,0x13,0x12,0x0b,0x06,0x7e,0x07,0x07,0x14,0x13,0x11,0x12,0x39,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f, -0x33,0x12,0x39,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x05,0xac,0xea,0xfd,0xd6,0x1b,0x0b,0x04,0xa8,0xfe,0x63,0x02,0x45,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x20,0x12,0xfd,0x3e, -0x05,0x00,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0xa4,0x04,0x00,0x00,0x0e,0x00,0x42,0x40,0x20,0x0b,0x02,0x0e,0x0e,0x04,0x06,0x95,0x0c,0x09,0x0f,0x01,0x04,0x0c,0x0d,0x0d,0x04,0x01,0x00,0x00,0x10,0x05,0x07,0x07,0x0f,0x0e,0x09,0x04,0x84,0x05,0x05,0x10,0x0f,0x11,0x12,0x39,0x2f, -0xe1,0x32,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x01,0x33,0x01,0x04,0xa4,0xe4,0xfe,0x3e,0x04,0xa4,0xfe,0xc8,0x01,0xdc,0x04,0x01,0xae,0xd9,0xfe,0x23,0x01,0xea,0xfe,0x16, -0x03,0x74,0x8c,0xfe,0x2d,0x01,0xd3,0xfe,0x10,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0x90,0x05,0x9a,0x00,0x0d,0x00,0x3b,0x40,0x1f,0x05,0x91,0x40,0x0a,0x09,0x06,0x0a,0x91,0x2b,0x30,0x01,0x91,0x0c,0x0c,0x09,0x03,0x03,0x06,0x00,0x00,0x0f,0x02,0x7e,0x0b,0x03,0x03,0x0f,0x0a,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33, -0xe1,0x11,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x21,0x06,0x90,0xfe,0x62,0xa8,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0x02,0x46,0x05,0x00,0xfb,0x00,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00,0x01,0x00,0xa6, -0x00,0x00,0x05,0x2f,0x04,0x00,0x00,0x0d,0x00,0x3b,0x40,0x1f,0x05,0x95,0x40,0x0a,0x09,0x06,0x0a,0x95,0x2b,0x30,0x01,0x95,0x0c,0x0c,0x09,0x0f,0x03,0x06,0x00,0x00,0x0f,0x02,0x84,0x0b,0x03,0x03,0x0f,0x0a,0x05,0x84,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x11,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x10,0xed,0x2b,0x00,0x18, -0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x21,0x05,0x2f,0xfe,0xc9,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0x01,0xdb,0x03,0x74,0xfc,0x8c,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0x00,0x01,0x00,0xbc,0xfe,0x66,0x07,0xbe,0x05,0x9a,0x00,0x1b,0x00,0x45,0x40,0x27,0x0a,0x91, -0x13,0x13,0x0c,0x0e,0x91,0x11,0x03,0x1a,0x91,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0c,0x0c,0x0f,0x13,0x0b,0x7e,0x01,0x42,0x0c,0x0c,0x10,0x17,0x7d,0x06,0x06,0x1d,0x0f,0x7e,0x10,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe2,0xe1,0x32,0x00,0x2f,0x33,0x10,0xde,0x32,0x5d,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31, -0x30,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x00,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x20,0x00,0x11,0x14,0x00,0x21,0x22,0x04,0x4c,0xa4,0x99,0xbc,0xcd,0xff,0x00,0xda,0x46,0xa8,0xfd,0x1a,0xa8,0x04,0x36,0x4a,0x01,0x26,0x01,0x5c,0xfe,0xd6,0xfe,0xfa,0xae,0xfe,0xb2,0xae,0x6c,0xe7,0xcd,0xd3,0x01,0x29, -0xfd,0x5c,0x05,0x04,0xfa,0xfc,0x05,0x9a,0xfd,0x9e,0xfe,0x99,0xfe,0xdd,0xff,0xfe,0xb7,0x00,0x00,0x01,0x00,0xa6,0xfe,0x66,0x06,0x56,0x04,0x00,0x00,0x1b,0x00,0x44,0x40,0x26,0x0a,0x95,0x14,0x14,0x0c,0x0d,0x95,0x12,0x0f,0x1a,0x95,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0c,0x0c,0x0f,0x13,0x0b,0x84,0x01,0x0c,0x0c,0x10, -0x17,0x83,0x06,0x06,0x1d,0x0f,0x84,0x10,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x32,0x00,0x2f,0x33,0x10,0xde,0x32,0x5d,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22, -0x03,0x54,0x72,0x8e,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0xfd,0xf6,0xa4,0x03,0x52,0x42,0xf7,0x01,0x25,0xfe,0xeb,0xef,0x99,0xfe,0xa0,0xa4,0x4c,0xb6,0xa8,0xb9,0xd7,0xfe,0x1a,0x03,0x74,0xfc,0x8c,0x04,0x00,0xfe,0x74,0xfe,0xdb,0xf7,0xd5,0xfe,0xe3,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xb6,0x05,0xb2,0x00,0x3b,0x00,0x4f,0x00,0x4a, -0x40,0x29,0x46,0x7d,0x21,0x1c,0x3a,0x2e,0x03,0x21,0x2b,0x7d,0x3c,0x21,0x0c,0x3c,0x3c,0x0c,0x21,0x03,0x51,0x15,0x7d,0x05,0x31,0x91,0x37,0x13,0x4b,0x1a,0x41,0x91,0x26,0x26,0x1a,0x10,0x91,0x0a,0x04,0x1a,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f, -0x2f,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x06, -0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x02,0xff,0x8e,0xf6,0xb5,0x68,0x57,0xa9,0xf8,0xa0,0x24,0x23,0x0e,0x26,0x13,0x73,0xb5,0x7e,0x42,0x44,0x80,0xb6,0x72,0x41,0x3a,0x38,0x57,0x3b,0x1f,0x33,0x5e,0x89,0x55,0x5c,0x8a,0x5c,0x2f,0x76,0x62,0x18,0x32,0x1b,0x31,0x66,0x26,0x50,0x7a,0x42,0x74, -0x35,0x78,0x01,0x33,0x18,0x2f,0x47,0x30,0x31,0x49,0x30,0x18,0x1c,0x35,0x4d,0x31,0x33,0x44,0x29,0x11,0x18,0x5f,0xb7,0x01,0x0f,0xaf,0xaa,0x01,0x17,0xc7,0x6e,0x08,0x99,0x04,0x05,0x53,0x9a,0xdb,0x87,0x81,0xd8,0x9c,0x58,0x0e,0x38,0x8b,0x9c,0xa6,0x52,0x86,0xd2,0x91,0x4c,0x4c,0x91,0xd2,0x86,0xc6,0xfe,0xd4,0x62,0x07,0x07,0x18, -0x16,0x9b,0x28,0x1e,0x1b,0x3d,0x02,0xfb,0x5a,0x97,0x6f,0x3e,0x3c,0x6d,0x9a,0x5f,0x4f,0x96,0x87,0x71,0x29,0x2c,0x76,0x89,0x95,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x55,0x04,0x1a,0x00,0x38,0x00,0x48,0x00,0x54,0x40,0x31,0x1b,0x36,0x1e,0x28,0xef,0x39,0x43,0x84,0x1e,0x4f,0x39,0x01,0x39,0x0c,0x1e,0x1e,0x0c,0x39,0x03,0x4a, -0x14,0x83,0x40,0x05,0x50,0x05,0x60,0x05,0x03,0x05,0x2e,0x95,0x34,0x16,0x46,0x19,0x3e,0x95,0x23,0x23,0x19,0x0f,0x95,0x0a,0x0f,0x19,0x95,0x00,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22, -0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x27,0x06,0x06,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02, -0x53,0x6a,0xb6,0x86,0x4d,0x43,0x7e,0xb4,0x71,0x1d,0x1a,0x19,0x1e,0x48,0x76,0x53,0x2d,0x2a,0x52,0x77,0x4d,0x1e,0x1c,0x44,0x4d,0x22,0x45,0x69,0x47,0x48,0x69,0x45,0x21,0x4d,0x42,0x0e,0x1d,0x10,0x23,0x4b,0x1c,0x39,0x5c,0x61,0x56,0x2a,0x5c,0x01,0x02,0x10,0x20,0x2c,0x1d,0x21,0x2f,0x1e,0x0e,0x44,0x3f,0x3d,0x35,0x18,0x44,0x85, -0xc4,0x7f,0x7a,0xca,0x91,0x51,0x08,0x8d,0x09,0x3d,0x6b,0x92,0x54,0x57,0x91,0x6a,0x3b,0x03,0x4a,0xd5,0x86,0x44,0x84,0x69,0x41,0x3e,0x67,0x85,0x47,0x86,0xd4,0x4a,0x02,0x03,0x11,0x10,0x88,0x23,0x28,0x14,0x15,0x02,0x25,0x38,0x5b,0x41,0x24,0x28,0x44,0x5a,0x32,0x7e,0xb0,0x31,0x31,0xaf,0x00,0x01,0x00,0x5e,0xfe,0xae,0x04,0x8c, -0x05,0xb2,0x00,0x23,0x00,0x52,0x40,0x2c,0x0a,0x0c,0xe2,0x40,0x07,0x10,0x80,0x02,0x10,0x16,0x30,0x19,0x01,0x19,0x19,0x1b,0x91,0x16,0x04,0x20,0x23,0x01,0x23,0x23,0x21,0x91,0x10,0x13,0x0a,0x0a,0x10,0x0e,0xc2,0x02,0x04,0x04,0x13,0x18,0x00,0x00,0x25,0x1e,0x7d,0x13,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0xf1,0x32, -0xc2,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x25,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x24,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x04,0x8c,0x72,0xae, -0x34,0x5a,0x4c,0x47,0x38,0x31,0x31,0x44,0x2d,0xfe,0xd1,0xfe,0x99,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0xd8,0x9e,0x3c,0x3c,0x12,0x54,0x40,0x4e,0x5e,0x16,0x6d,0x19,0x42,0x3e,0x50,0x04,0x01,0x89,0x01,0x3d,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00, -0x00,0x01,0x00,0x60,0xfe,0xae,0x03,0x62,0x04,0x18,0x00,0x23,0x00,0x4c,0x40,0x28,0x15,0x17,0xe2,0x40,0x12,0x24,0x80,0x0d,0x1b,0x21,0x00,0x00,0x02,0x95,0x21,0x10,0x30,0x0a,0x01,0x0a,0x0a,0x08,0x95,0x1b,0x16,0x15,0x15,0x1b,0x19,0xc2,0x0d,0x0f,0x0f,0x0a,0x1e,0x0b,0x00,0x05,0x83,0x1e,0x2f,0xe1,0x2f,0x33,0x11,0x12,0x39,0x2f, -0x33,0xf1,0x32,0xc2,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x26,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x03,0x62, -0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x86,0x76,0x58,0x72,0x32,0x59,0x4c,0x47,0x38,0x31,0x31,0x44,0x2e,0xc8,0xf4,0x01,0x22,0xf2,0x87,0x67,0x03,0x3e,0x50,0xe1,0xb7,0xb4,0xd0,0x59,0x9c,0x35,0x0e,0x54,0x3e,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x40,0x50,0x0e,0x01,0x19,0xd7,0xfd,0x01,0x33,0x32,0x00,0x00,0x01,0x00,0x29,0xfe,0x80,0x04,0x0c, -0x05,0x9a,0x00,0x0b,0x00,0x42,0xb9,0x00,0x05,0x01,0x30,0x40,0x14,0x01,0x08,0x91,0x0a,0x03,0x02,0x91,0x40,0x07,0x00,0x0e,0x02,0x09,0x07,0x42,0x09,0x09,0x07,0x0c,0x03,0xb8,0x01,0x2c,0xb7,0x06,0x06,0x02,0x7e,0x07,0x07,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f, -0x1a,0xed,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xc1,0x9b,0xce,0xfe,0x63,0x03,0xe3,0x05,0x02,0xfb,0x96,0xfd,0xe8,0x01,0x80,0x05,0x02,0x98,0x00,0x01,0x00,0x1e,0xfe,0x8a,0x03,0x29,0x04,0x00,0x00,0x0b,0x00,0x42,0xb9,0x00,0x05,0x01,0x31,0x40,0x14,0x01, -0x08,0x95,0x0a,0x0f,0x02,0x95,0x40,0x07,0x00,0x0e,0x02,0x09,0x07,0x42,0x09,0x09,0x07,0x0c,0x03,0xb8,0x01,0x2c,0xb7,0x06,0x06,0x02,0x84,0x07,0x07,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23, -0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x29,0xfe,0xcd,0x98,0x8e,0xae,0xfe,0xcc,0x03,0x0b,0x03,0x74,0xfd,0x18,0xfd,0xfe,0x01,0x76,0x03,0x74,0x8c,0x00,0x01,0x00,0x29,0xfe,0x80,0x06,0xbc,0x05,0x9a,0x00,0x0f,0x00,0x50,0xb6,0x09,0x04,0x91,0x0c,0x07,0x03,0x01,0xb8,0x01,0x30,0x40,0x10,0x0e,0x0a,0x91,0x40,0x03,0x05,0x0e,0x03,0x0a, -0x08,0x42,0x08,0x08,0x0b,0x0a,0x0f,0xb8,0x01,0x2c,0x40,0x0d,0x02,0x02,0x0e,0x7e,0x0b,0x0b,0x11,0x0a,0x7e,0x03,0x03,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f,0x3f,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x21, -0x35,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x06,0xbc,0x9b,0xfb,0xa5,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x02,0xe6,0xa8,0xc0,0xfe,0x80,0x01,0x80,0x05,0x02,0x98,0x98,0xfb,0x96,0x05,0x02,0xfa,0xfe,0x00,0x00,0x01,0x00,0x1e,0xfe,0x8b,0x05,0x3c,0x04,0x00,0x00,0x0f,0x00,0x50,0xb9,0x00,0x01,0x01,0x31,0x40,0x16,0x09,0x04,0x95, -0x0c,0x06,0x0f,0x0e,0x0a,0x95,0x40,0x03,0x05,0x0e,0x03,0x0a,0x08,0x42,0x08,0x08,0x0b,0x0a,0x0f,0xb8,0x01,0x2c,0x40,0x0d,0x02,0x02,0x0e,0x84,0x0b,0x0b,0x11,0x0a,0x84,0x03,0x03,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f, -0x33,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0x3c,0x8e,0xfc,0xa4,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x02,0x0a,0xa4,0x98,0xfe,0x8b,0x01,0x75,0x03,0x74,0x8c,0x8c,0xfd,0x18,0x03,0x74,0xfc,0x8c,0x00,0x00,0x01,0x00,0xa6,0xfe,0x80,0x05,0x42,0x05,0x9a,0x00,0x14, -0x00,0x3d,0x40,0x0b,0x10,0x04,0x0e,0x91,0x06,0x06,0x03,0x11,0x0b,0x03,0x01,0xb8,0x01,0x30,0xb3,0x13,0x91,0x03,0x14,0xb8,0x01,0x2c,0x40,0x0b,0x02,0x02,0x12,0x7e,0x04,0x11,0x11,0x16,0x0b,0x7e,0x0a,0x2f,0xe1,0x11,0x39,0x2f,0x33,0xe1,0x32,0x2f,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x01, -0x23,0x11,0x23,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x05,0x42,0x9c,0xcd,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0xc1,0xfe,0x80,0x01,0x80,0x02,0x85,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0xfa,0xfe,0x00,0x00,0x01,0x00,0x98,0xfe,0x8b,0x04,0x77,0x04,0x00, -0x00,0x13,0x00,0x3d,0x40,0x0b,0x0f,0x04,0x0d,0xec,0x06,0x06,0x03,0x10,0x0a,0x0f,0x01,0xb8,0x01,0x31,0xb3,0x12,0x95,0x03,0x13,0xb8,0x01,0x2c,0x40,0x0b,0x02,0x02,0x11,0x84,0x04,0x0f,0x0f,0x15,0x0a,0x84,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x32,0x2f,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31, -0x30,0x01,0x23,0x11,0x23,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x04,0x77,0x8d,0xae,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0x98,0xfe,0x8b,0x01,0x75,0x01,0x9c,0x62,0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xfc,0x8c,0x00,0x02,0x00,0x29,0xff,0xe8,0x06,0x58,0x05,0xb2, -0x00,0x1c,0x00,0x23,0x00,0x56,0x40,0x19,0x13,0x0c,0x18,0x01,0x91,0x40,0x23,0x1b,0x09,0x23,0x91,0x2b,0x30,0x20,0x91,0x1b,0x04,0x06,0x04,0x91,0x40,0x09,0x13,0x13,0x15,0xb8,0x01,0x2c,0x40,0x13,0x10,0x0c,0x80,0x06,0x06,0x0c,0x00,0x7d,0x1d,0x1d,0x25,0x0c,0x23,0x42,0x01,0x7d,0x18,0x42,0x0c,0x2f,0xe1,0xf1,0xe1,0x11,0x12,0x39, -0x2f,0xe1,0x11,0x39,0x2f,0x1a,0x10,0xdd,0xe1,0x32,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0xc4,0x31,0x30,0x01,0x21,0x16,0x00,0x33,0x20,0x37,0x15,0x06,0x21,0x20,0x00,0x03,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x33,0x12,0x00,0x21,0x20,0x03,0x26,0x02,0x23,0x22,0x00,0x07, -0x06,0x58,0xfb,0xa2,0x10,0x01,0x1c,0xda,0x01,0x09,0xc2,0xc5,0xfe,0xe4,0xfe,0xda,0xfe,0x95,0x0f,0x1d,0x7c,0x88,0x27,0x8f,0x29,0x84,0x12,0x1d,0x01,0x6f,0x01,0x16,0x02,0x6a,0xb4,0x08,0xe7,0xc9,0xd0,0xfe,0xf6,0x16,0x02,0x7f,0xeb,0xfe,0xeb,0xa4,0xaa,0x91,0x01,0x6a,0x01,0x2d,0x8b,0x7d,0x5e,0x4a,0x47,0x52,0x80,0x01,0x30,0x01, -0x6c,0xfd,0x64,0xed,0x01,0x17,0xfe,0xe4,0xe8,0x00,0x00,0x02,0x00,0x29,0xff,0xe8,0x04,0xc4,0x04,0x18,0x00,0x1e,0x00,0x25,0x00,0x5f,0x40,0x0e,0x13,0x0c,0x0c,0x01,0x95,0x18,0x25,0x25,0x04,0x22,0x95,0x1b,0x10,0x06,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0e,0x48,0x06,0x06,0x04,0x95,0x09,0x16,0x18,0x00,0x0c,0x25,0x1f,0x01,0x06,0x06, -0x00,0x0c,0x13,0x15,0xb8,0x01,0x2c,0x40,0x0a,0x10,0x0c,0x00,0x83,0x1f,0x1f,0x27,0x01,0x83,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xdd,0xe1,0x32,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0xed,0x32,0x2f,0x2b,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xc4,0x31,0x30,0x01,0x21,0x16,0x16,0x33,0x32,0x37, -0x15,0x06,0x23,0x22,0x02,0x27,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x33,0x36,0x24,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x04,0xc4,0xfd,0x2e,0x04,0xaf,0x9b,0xac,0x91,0x87,0xde,0xd0,0xf7,0x09,0x1b,0x77,0x8d,0x27,0x89,0x29,0x8a,0x14,0x1c,0x01,0x04,0xb0,0xca,0xdc,0xa8,0x01,0x85,0x7a,0x74, -0xa2,0x12,0x01,0xd7,0xab,0xba,0x72,0x9a,0x62,0x01,0x04,0xeb,0x85,0x6f,0x55,0x4a,0x47,0x4a,0x77,0xc8,0xee,0xfe,0xfc,0xe7,0x35,0x8d,0x9f,0xa6,0x86,0x00,0xff,0xff,0x00,0x29,0xfe,0x80,0x06,0x58,0x05,0xb2,0x02,0x26,0x06,0x1d,0x00,0x00,0x00,0x06,0x0b,0x51,0x00,0x00,0xff,0xff,0x00,0x29,0xfe,0x8a,0x04,0xc4,0x04,0x18,0x02,0x26, -0x06,0x1e,0x00,0x00,0x00,0x06,0x0b,0x52,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0xff,0xea,0x00,0x00,0x07,0x02,0x07,0x1a,0x02,0x26,0x01,0xed,0x00,0x00,0x01,0x07,0x00,0xda,0x02,0x3f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x24,0x1e,0x0d,0x00,0x25,0x01,0x21,0x05, -0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x05,0xf6,0x05,0xbe,0x02,0x26,0x02,0x0d,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xc7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x1c,0x16,0x09,0x00,0x25,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbe,0xfe,0x66,0x04,0x4c,0x05,0x9a, -0x00,0x19,0x00,0x42,0x40,0x24,0x01,0x15,0x18,0x91,0x13,0x13,0x15,0x19,0x17,0x03,0x07,0x91,0x04,0x0a,0x14,0x0a,0x24,0x0a,0x03,0x0a,0x0c,0x15,0x19,0x00,0x00,0x04,0x7d,0x0f,0x0f,0x1b,0x01,0x18,0x14,0x7e,0x0a,0x15,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x00,0x2f,0xde,0x32,0x5d,0xed,0x3f,0x33,0x12,0x39, -0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x01,0x16,0x00,0x11,0x14,0x00,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x00,0x23,0x23,0x11,0x23,0x11,0x33,0x11,0x01,0x04,0x4c,0xfd,0xce,0xfa,0x01,0x1d,0xfe,0xd6,0xfe,0xf9,0xae,0x94,0xa4,0x9a,0xbc,0xcd,0xfe,0xff,0xda,0x46,0xa6,0xa6,0x02,0x17,0x05,0x9a,0xfd,0x97,0x21,0xfe,0xa1, -0xfe,0xfd,0xff,0xfe,0xb7,0x4c,0xae,0x6c,0xea,0xca,0xd6,0x01,0x26,0xfd,0x5c,0x05,0x9a,0xfd,0xa0,0x02,0x60,0x00,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xae,0x04,0x00,0x00,0x1a,0x00,0x42,0x40,0x24,0x01,0x14,0x19,0x95,0x13,0x13,0x14,0x1a,0x17,0x0f,0x07,0xec,0x04,0x0a,0x14,0x0a,0x24,0x0a,0x03,0x0a,0x0c,0x14,0x1a,0x00,0x00,0x04, -0x83,0x0f,0x0f,0x1c,0x17,0x01,0x14,0x84,0x0a,0x15,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x00,0x2f,0xde,0x32,0x5d,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x01,0x16,0x12,0x15,0x14,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x11,0x33, -0x01,0x03,0xae,0xfe,0x4c,0xc8,0xe6,0xfe,0xea,0xee,0x99,0x65,0x72,0x8e,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0xa4,0x02,0x01,0x87,0x04,0x00,0xfe,0x6c,0x20,0xfe,0xe5,0xd9,0xd6,0xfe,0xe4,0x3a,0xa4,0x4c,0xb6,0xa8,0xb9,0xd7,0xfe,0x1a,0x04,0x00,0xfe,0x74,0x01,0x8c,0x00,0x01,0x00,0xbc,0xfe,0x66,0x04,0xf2,0x05,0x9a,0x00,0x18,0x00,0x40, -0x40,0x22,0x0a,0x7e,0x18,0x07,0x18,0x11,0x18,0x11,0x18,0x1a,0x06,0x02,0x7e,0x03,0x11,0x13,0x92,0x0e,0x08,0x03,0x01,0x91,0x06,0x40,0x04,0x03,0x06,0x91,0x2b,0x30,0x04,0x03,0x03,0x12,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x3f,0x2f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xe1,0x31,0x30, -0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x07,0x06,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x36,0x35,0x04,0x4a,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x95,0x94,0xfe,0xf8,0xae,0x94,0xa4,0x9a,0x5e,0x95,0x33,0x67,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfb,0x14,0xff,0xa4,0xa5,0x4c,0xae,0x6c, -0x3a,0x3b,0x74,0xcb,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xf8,0x04,0x00,0x00,0x19,0x00,0x3a,0x40,0x1f,0x0a,0x84,0x07,0x12,0x03,0x19,0x19,0x1b,0x06,0x02,0x84,0x03,0x14,0x95,0x0f,0x08,0x0f,0x01,0x95,0x06,0x40,0x04,0x03,0x06,0x95,0x2b,0x30,0x04,0x0f,0x03,0x15,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x3f,0x2f,0xed,0x01, -0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x33,0xe1,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x03,0x54,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x46,0x46,0x8b,0xef,0x9a,0x64,0x75,0x8b,0x54,0x83,0x5a,0x2f,0x01,0xd1,0xfe,0x2f,0x04,0x00, -0xfe,0x5c,0x01,0xa4,0xfc,0x69,0x72,0xbc,0x47,0x8e,0x3a,0xa0,0x4e,0x31,0x5c,0x85,0x54,0x00,0x00,0x01,0x00,0xa6,0xfe,0x80,0x04,0x81,0x05,0x9a,0x00,0x14,0x00,0x38,0xb9,0x00,0x02,0x01,0x30,0x40,0x0f,0x10,0x91,0x08,0x08,0x01,0x13,0x0d,0x03,0x05,0x91,0x01,0x00,0x7e,0x12,0x01,0xb8,0x01,0x2c,0xb7,0x04,0x12,0x06,0x06,0x16,0x0e, -0x7e,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xd6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x3f,0x31,0x30,0x21,0x23,0x11,0x23,0x11,0x33,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0xd7,0x9c,0xcb,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0xfe,0x80,0x02,0x18,0x01, -0xed,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0x00,0x01,0x00,0x98,0xfe,0x8a,0x03,0xdf,0x04,0x00,0x00,0x13,0x00,0x3d,0x40,0x0b,0x11,0x06,0x0f,0xec,0x08,0x08,0x01,0x12,0x0c,0x0f,0x02,0xb8,0x01,0x31,0xb3,0x05,0x95,0x01,0x01,0xb8,0x01,0x2c,0x40,0x0b,0x04,0x00,0x84,0x06,0x06,0x11,0x11,0x15,0x0c,0x84,0x0b,0x2f, -0xe1,0x12,0x39,0x2f,0x33,0x10,0xe1,0xd6,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x23,0x11,0x33,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x03,0xdf,0xb0,0x8b,0x98,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0xfe,0x8a,0x02,0x02,0x01,0x10,0x62, -0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x19,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x55,0x01,0x5b,0x00,0x08,0xb3,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xda, -0x00,0xc6,0x00,0x00,0x00,0x08,0xb3,0x02,0x23,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xe2,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe6,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf2,0x40,0x0a,0x1f,0x19,0x05,0x00,0x25,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, -0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x87,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x14,0x2f,0x29,0x08,0x14,0x25,0x03,0x02,0x2c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x05,0x9a,0x02,0x06,0x00,0x91, -0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x06,0x56,0x04,0x18,0x02,0x06,0x00,0xa0,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x1b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x13,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x12,0x12,0x0c,0x02,0x0b,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, -0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x20,0x1a,0x0c,0x12,0x25,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x56,0xff,0xe8,0x05,0x66,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x3f,0x40,0x23, -0x12,0x91,0x40,0x01,0x09,0x0f,0x01,0x91,0x2b,0x30,0x2f,0x06,0x01,0x06,0x06,0x04,0x91,0x09,0x04,0x16,0x91,0x0f,0x13,0x06,0x06,0x00,0x0c,0x7d,0x01,0x12,0x12,0x1a,0x13,0x7d,0x00,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x13,0x21,0x26, -0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x25,0x21,0x16,0x12,0x33,0x32,0x00,0x56,0x04,0x5e,0x11,0xfe,0xe5,0xda,0xd8,0x9c,0x9e,0xe2,0x01,0x3f,0x01,0x6d,0xfe,0x94,0xfe,0xd3,0xfe,0xd1,0xfe,0xb8,0x04,0x5e,0xfc,0x56,0x04,0xf2,0xcf,0xcf,0x01,0x02,0x03,0x1a,0xed,0x01,0x13,0x60,0xa4,0x54,0xfe, -0x76,0xfe,0xa5,0xfe,0xbe,0xfe,0x5d,0x01,0x9f,0xfc,0xeb,0xfe,0xe7,0x01,0x18,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x02,0x06,0x05,0x07,0x00,0x00,0xff,0xff,0x00,0x56,0xff,0xe8,0x05,0x66,0x06,0xe4,0x02,0x26,0x06,0x32,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x2a,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xec, -0x40,0x0a,0x28,0x22,0x00,0x0c,0x25,0x03,0x02,0x25,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0xcf,0x05,0x87,0x02,0x26,0x05,0x07,0x00,0x00,0x01,0x06,0x00,0x8f,0x7a,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x29,0x23,0x12,0x0c,0x25,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01, -0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xea,0x00,0x00,0x07,0x02,0x06,0xe4,0x02,0x26,0x01,0xed,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0xd6,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x2d,0x27,0x0d,0x00,0x25,0x02,0x01,0x2a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x05,0xf6,0x05,0x87, -0x02,0x26,0x02,0x0d,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x54,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0a,0x25,0x1f,0x09,0x00,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xe2,0x06,0xe4,0x02,0x26,0x01,0xee,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x61, -0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe0,0x40,0x0a,0x33,0x2d,0x01,0x1f,0x25,0x02,0x01,0x30,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0xe7,0x03,0x3b,0x05,0x87,0x02,0x26,0x02,0x0e,0x00,0x00,0x01,0x06,0x00,0x8f,0x11,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf6,0x40,0x0a,0x31,0x2b, -0x12,0x16,0x25,0x02,0x01,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x01,0x00,0x52,0xff,0xe8,0x03,0xd3,0x05,0x9a,0x00,0x16,0x00,0x3f,0x40,0x20,0x0f,0x96,0x09,0x09,0x15,0x0b,0x91,0x0c,0x03,0x01,0x03,0x91,0x15,0x13,0x0a,0x0f,0x0e,0x09,0x09,0x06,0x01,0x0e,0x0b,0x0e,0x0b,0x01,0x12,0x7d,0x06,0x06,0x18,0x01, -0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x01,0x21,0x35,0x21,0x15,0x01,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0x52,0xa8,0xd5,0x9f,0xb3,0xfe,0xa1,0x91,0x01,0x8f,0xfd,0xaa, -0x03,0x56,0xfe,0x7a,0xc0,0xd9,0xfe,0xee,0xf9,0xf2,0x3c,0xb6,0x7b,0xa4,0x83,0x01,0x1e,0x02,0x46,0x98,0x28,0xfd,0xc8,0xdc,0xb6,0xca,0xf6,0x00,0xff,0xff,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x02,0x06,0x05,0x97,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0x8c,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0xd9, -0x01,0xd6,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x14,0x16,0x17,0x0a,0x13,0x25,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x05,0x2f,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1e,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x07,0x10,0x11,0x07,0x0d,0x25,0x01,0x0f,0x11, -0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0xe4,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x6f,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x11,0x23,0x1d,0x0a,0x13,0x25,0x02,0x01,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00, -0x04,0x00,0x05,0x87,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xce,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x1b,0x1d,0x17,0x07,0x0d,0x25,0x02,0x01,0x1a,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe4,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8f, -0x01,0x67,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x87,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x27,0x21,0x03, -0x09,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe4,0x02,0x26,0x02,0xcf,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x67,0x01,0x5d,0x00,0x17,0x40,0x0d,0x04,0x03,0x03,0x29,0x23,0x03,0x09,0x25,0x04,0x03,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, -0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x87,0x02,0x26,0x02,0xd0,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x04,0x03,0x00,0x27,0x21,0x03,0x09,0x25,0x04,0x03,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x04,0x90,0x06,0xe4,0x02,0x26, -0x02,0x04,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x76,0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x28,0x22,0x0f,0x14,0x25,0x02,0x01,0x25,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x05,0x87,0x02,0x26,0x02,0x24,0x00,0x00,0x01,0x06,0x00,0x8f,0xf0,0x00,0x00,0x1a, -0xb1,0x02,0x01,0xb8,0xff,0xb6,0x40,0x0a,0x28,0x22,0x01,0x14,0x25,0x02,0x01,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x06,0x8c,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x32,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x05,0x17,0x16,0x0d,0x00,0x25,0x01,0x17,0x05, -0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x2f,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x17,0x18,0x0c,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x06,0xe4, -0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xca,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x25,0x1f,0x0d,0x00,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x87,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x00,0x8f,0x50,0x00,0x00,0x17, -0x40,0x0d,0x02,0x01,0x00,0x24,0x1e,0x0c,0x00,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x07,0x5c,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x52,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x4c,0x1c,0x16,0x0d,0x00,0x25,0x02,0x01,0x1c,0x05, -0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x00,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xde,0x00,0xf0,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x62,0x1b,0x15,0x0c,0x00,0x25,0x02,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6, -0x00,0x00,0x04,0x81,0x06,0xe4,0x02,0x26,0x01,0xfe,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xf6,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x03,0x20,0x1a,0x08,0x10,0x25,0x02,0x01,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x98,0x00,0x00,0x03,0xdf,0x05,0x87,0x02,0x26,0x02,0x1e,0x00,0x00,0x01,0x07, -0x00,0x8f,0x00,0x92,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0a,0x1f,0x19,0x07,0x0f,0x25,0x02,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x87,0x06,0xe3,0x02,0x26,0x02,0x02,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x87,0x01,0x5c,0x00,0x17,0x40,0x0d,0x04,0x03, -0x06,0x26,0x20,0x05,0x03,0x25,0x04,0x03,0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x05,0x06,0x05,0x87,0x02,0x26,0x02,0x22,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x33,0x00,0x00,0x00,0x1a,0xb1,0x04,0x03,0xb8,0xff,0xfd,0x40,0x0a,0x25,0x1f,0x05,0x03,0x25,0x04,0x03,0x22,0x11,0x26, -0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x02,0x00,0x56,0x00,0x00,0x03,0xd1,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x24,0x40,0x12,0x0c,0x91,0x08,0x08,0x09,0x03,0x0b,0x91,0x00,0x00,0x7e,0x08,0x0b,0x0b,0x14,0x0f,0x7d,0x04,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0xed,0x3f,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x22,0x26, -0x35,0x34,0x36,0x33,0x21,0x11,0x33,0x03,0x11,0x23,0x20,0x11,0x14,0x16,0x33,0x03,0xd1,0xfe,0x56,0xd8,0xf9,0xee,0xd4,0x01,0x11,0xa8,0xa8,0xeb,0xfe,0xc8,0xa3,0x95,0xe6,0xc6,0xc1,0xcd,0x02,0x60,0xfa,0xfe,0x02,0x0a,0xff,0x00,0x7d,0x8d,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x02,0x06,0x00,0x47,0x00,0x00,0x00,0x02, -0x00,0x64,0xff,0xe8,0x06,0x58,0x05,0x9a,0x00,0x19,0x00,0x22,0x00,0x3a,0x40,0x1e,0x06,0x08,0x1b,0x91,0x18,0x0f,0x0f,0x11,0x03,0x15,0x20,0x91,0x03,0x08,0x13,0x06,0x12,0x7e,0x0f,0x1a,0x1a,0x0b,0x00,0x7e,0x17,0x17,0x24,0x1e,0x7d,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x39,0x00,0x3f,0x33,0xed,0x32,0x3f, -0x39,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x11,0x23,0x20,0x11,0x10,0x21,0x32,0x36,0x06,0x58,0xd1,0xbf,0x69,0xad,0x2b,0x73,0xed,0xd2,0xf1,0xf2,0xd1,0x01,0x11,0xa7,0x7f,0x6d,0xe5,0xa8,0xfc, -0xe0,0xec,0xfe,0xc8,0x01,0x2a,0x63,0x97,0x01,0x92,0xc8,0xe2,0x63,0x5d,0xc0,0xeb,0xcb,0xc2,0xda,0x02,0x60,0xfb,0xf6,0x79,0x98,0x01,0x1f,0x01,0x9c,0xfe,0x38,0x01,0x30,0xfe,0xf2,0xfe,0xeb,0x82,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x70,0x05,0xec,0x00,0x1a,0x00,0x27,0x00,0x3f,0x40,0x21,0x19,0x19,0x0d,0x25,0x11,0x00,0x0f,0x1f, -0x95,0x0d,0x10,0x16,0x05,0x25,0x95,0x03,0x07,0x16,0x05,0x13,0x84,0x11,0x1b,0x1b,0x0a,0x1a,0x83,0x19,0x19,0x29,0x22,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x39,0x00,0x3f,0x33,0xed,0x32,0x32,0x3f,0xed,0x32,0x3f,0x11,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x22,0x02,0x35, -0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x70,0xca,0xb6,0xf4,0x4e,0x7c,0xfe,0xf1,0xd9,0xea,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x7e,0x64,0xd6,0xa8,0xfc,0xfc,0xa4,0x7e,0x96,0xac,0xa6,0x8a,0x89,0xab,0x01,0x83,0xbf, -0xdc,0xe3,0xe3,0x01,0x14,0xec,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfb,0x95,0x75,0x9a,0x01,0x1a,0xa1,0x5e,0x97,0x7c,0xac,0xdc,0xc2,0xb2,0xcc,0xc6,0x00,0x01,0x00,0x29,0xff,0xe8,0x05,0xf6,0x05,0xb2,0x00,0x24,0x00,0x4b,0x40,0x27,0x1c,0x1b,0x08,0x91,0x0b,0x0b,0x03,0x23,0x23,0x20,0x13,0x11,0x91,0x16,0x04,0x20,0x91,0x03,0x13,0x1c, -0x09,0x19,0x7d,0x0e,0x09,0x0e,0x09,0x13,0x1e,0x7d,0x06,0x06,0x13,0x24,0x7e,0x23,0x23,0x26,0x13,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x02,0x21,0x23,0x35, -0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x04,0x13,0x12,0x33,0x32,0x11,0x11,0x33,0x05,0xf6,0xd2,0xbe,0xb9,0xdd,0x05,0x09,0xfe,0x94,0x96,0x8a,0x9f,0xaf,0x92,0x7f,0xb3,0xab,0x9e,0xcf,0xcc,0xea,0xfe,0xf0,0x01,0x32,0x0f,0x0c,0xdf,0xe6,0xa8,0x01,0x92,0xc9,0xe1,0xeb,0xb9,0x01, -0x14,0x8b,0x8c,0x7c,0x6d,0x81,0x71,0xaa,0x58,0xc3,0x9d,0xfe,0xe9,0x49,0x04,0x26,0xfe,0xce,0xfe,0xe9,0x01,0x1f,0x01,0x9c,0x00,0x01,0x00,0x1e,0xff,0xe8,0x05,0x56,0x04,0x18,0x00,0x22,0x00,0x4b,0x40,0x27,0x22,0x22,0x03,0x1a,0x19,0x09,0x95,0x0a,0x0a,0x1e,0x12,0x10,0x95,0x15,0x10,0x1e,0x95,0x03,0x16,0x1a,0x09,0x17,0x84,0x0d, -0x09,0x0d,0x09,0x12,0x1c,0x84,0x05,0x05,0x12,0x22,0x83,0x21,0x21,0x24,0x12,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x20,0x03,0x26,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34, -0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15,0x16,0x17,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0x56,0xcc,0xb5,0xfe,0xb7,0x3a,0x0e,0x7c,0x9f,0x65,0x61,0x01,0x04,0x77,0x68,0x96,0x96,0xaa,0x8e,0x01,0x77,0xd3,0xda,0x20,0x20,0xbf,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0x01,0x4b,0x52,0x43,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d, -0xfe,0xee,0xbd,0x33,0x04,0x12,0xc2,0xcc,0x01,0x1a,0xa1,0x00,0x00,0x01,0x00,0x29,0xfe,0x80,0x04,0x3a,0x05,0xb2,0x00,0x1f,0x00,0x4e,0x40,0x0d,0x1a,0x19,0x07,0x91,0x08,0x08,0x03,0x11,0x0f,0x91,0x14,0x04,0x01,0xb8,0x01,0x30,0x40,0x0e,0x1e,0x91,0x03,0x1a,0x07,0x17,0x7d,0x0c,0x07,0x0c,0x07,0x03,0x11,0x1f,0xb8,0x01,0x2c,0xb7, -0x02,0x02,0x1e,0x7e,0x03,0x03,0x21,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x2f,0xed,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15, -0x10,0x05,0x15,0x16,0x16,0x15,0x15,0x33,0x04,0x3a,0x9c,0xcd,0xfe,0x85,0x96,0x8a,0x9f,0xaf,0x92,0x7f,0xb3,0xab,0x9e,0xcf,0xcc,0xea,0xfe,0xf0,0x93,0xaa,0xc1,0xfe,0x80,0x01,0x80,0x01,0x8c,0x01,0x14,0x8b,0x8c,0x7c,0x6d,0x81,0x71,0xaa,0x58,0xc3,0x9d,0xfe,0xe9,0x49,0x04,0x11,0xbb,0x8e,0xfc,0x00,0x00,0x01,0x00,0x1e,0xfe,0x8b, -0x03,0x8e,0x04,0x18,0x00,0x1d,0x00,0x4e,0x40,0x0d,0x18,0x17,0x07,0x95,0x08,0x08,0x03,0x10,0x0e,0x95,0x13,0x10,0x01,0xb8,0x01,0x31,0x40,0x0e,0x1c,0x95,0x03,0x18,0x07,0x15,0x84,0x0b,0x07,0x0b,0x07,0x03,0x10,0x1d,0xb8,0x01,0x2c,0xb7,0x02,0x02,0x1c,0x84,0x03,0x03,0x1f,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12, -0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x2f,0xed,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15,0x16,0x16,0x15,0x15,0x33,0x03,0x8e,0x8e,0xae,0xfe,0xd7,0x65,0x61,0x01,0x04,0x77,0x68, -0x96,0x96,0xaa,0x8e,0x01,0x77,0xd3,0x71,0x8b,0x98,0xfe,0x8b,0x01,0x75,0x01,0x1c,0xac,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d,0xfe,0xee,0xbd,0x33,0x04,0x09,0x87,0x6a,0x8c,0x00,0x00,0x01,0x00,0x18,0xff,0xe8,0x06,0xc2,0x05,0x9a,0x00,0x1c,0x00,0x3c,0x40,0x20,0x1c,0x1c,0x18,0x07,0x91,0x14,0x03,0x18,0x91,0x03,0x13,0x0e,0x10,0x91, -0x0b,0x13,0x15,0x7e,0x06,0x06,0x1a,0x09,0x7e,0x12,0x00,0x7e,0x1a,0x12,0x1a,0x12,0x1e,0x0e,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11, -0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x06,0xc2,0xd2,0xbd,0xba,0xdb,0xfe,0x2d,0xfe,0x97,0x28,0x22,0x1c,0x20,0xd7,0x03,0x1b,0x7e,0x71,0xe5,0xa8,0x01,0x9a,0xcb,0xe7,0xf2,0xb8,0x03,0x70,0xfd,0x36,0xfd,0xb6,0x0a,0x96,0x0b,0x01,0xae,0x03,0x69,0xfc,0x08,0x81,0xa2,0x01,0x21,0x01,0x9a,0x00,0x00,0x01,0x00,0x14,0xff,0xe8, -0x05,0xee,0x04,0x00,0x00,0x1c,0x00,0x46,0x40,0x1a,0x1c,0x1c,0x18,0x07,0x95,0x14,0x0f,0x0e,0x10,0x95,0x0b,0x0b,0x1d,0x18,0x95,0x03,0x16,0x15,0x84,0x06,0x06,0x12,0x1c,0x83,0x1b,0x09,0xb8,0x01,0x2e,0xb6,0x12,0x1b,0x12,0x1b,0x12,0x1e,0x0e,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed, -0x12,0x39,0x7c,0x2f,0x18,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0xee,0xcc,0xb6,0xb1,0xd3,0xfe,0xa4,0xfe,0xc6,0x25,0x19,0x15,0x25,0xa4,0x02,0x9a,0x77,0x67,0xdc,0xa8, -0x01,0x83,0xbd,0xde,0xdd,0xb6,0x01,0xf9,0xfe,0x2a,0xfe,0x54,0x08,0x8b,0x0a,0x01,0x17,0x02,0x6e,0xfd,0x85,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x01,0x00,0xbc,0xff,0xe8,0x07,0x6e,0x05,0x9a,0x00,0x18,0x00,0x41,0x40,0x23,0x17,0x17,0x08,0x91,0x40,0x0d,0x0c,0x09,0x0d,0x91,0x2b,0x30,0x0f,0x0c,0x03,0x14,0x91,0x03,0x13,0x09,0x10,0x7e, -0x0e,0x07,0x07,0x0a,0x00,0x7e,0x16,0x16,0x1a,0x0d,0x08,0x7e,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0x3f,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11, -0x11,0x33,0x07,0x6e,0xd3,0xbc,0xba,0xdb,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x7e,0x72,0xe4,0xa8,0x01,0x9a,0xcd,0xe5,0xf2,0xb8,0xfc,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfc,0x08,0x81,0xa2,0x01,0x21,0x01,0x9a,0x00,0x01,0x00,0xa6,0xff,0xe8,0x06,0x5a,0x04,0x00,0x00,0x18,0x00,0x44,0x40,0x24,0x17,0x17,0x03,0x08,0x95,0x40, -0x0d,0x0c,0x09,0x0d,0x95,0x2b,0x30,0x0f,0x0c,0x0f,0x14,0x95,0x03,0x16,0x09,0x11,0x84,0x0e,0x07,0x07,0x0a,0x00,0x83,0x16,0x16,0x1a,0x0d,0x08,0x84,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0x3f,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x7c,0x2f,0x31,0x30,0x01,0x14,0x06,0x23, -0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x06,0x5a,0xcc,0xb5,0xb1,0xd4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x78,0x67,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0xdc,0xb7,0x56,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfd,0x85,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x01,0x00,0x5e, -0xff,0xe8,0x05,0x62,0x05,0xb2,0x00,0x1a,0x00,0x3e,0x40,0x22,0x18,0x91,0x19,0x19,0x09,0x14,0x1f,0x0c,0x2f,0x0c,0x02,0x0c,0x0c,0x0e,0x91,0x09,0x04,0x14,0x91,0x03,0x13,0x18,0x0c,0x18,0x0c,0x06,0x00,0x7e,0x17,0x17,0x1c,0x11,0x7d,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f, -0x5d,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x12,0x37,0x21,0x35,0x21,0x05,0x62,0xfe,0xb5,0xfe,0xdd,0xfe,0xc9,0xfe,0xa1,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x07,0xe5,0xcc,0xf2,0x04,0xfe,0x46, -0x02,0x60,0x02,0x8e,0xfe,0xd0,0xfe,0x8a,0x01,0x8a,0x01,0x48,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xef,0xfe,0xca,0x01,0x07,0xd8,0x98,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xf4,0x04,0x18,0x00,0x1a,0x00,0x40,0x40,0x24,0x18,0x95,0x19,0x19,0x09,0x14,0x3f,0x0c,0x4f,0x0c,0x5f,0x0c,0x03,0x0c,0x0c,0x0e, -0x95,0x09,0x10,0x14,0x95,0x03,0x16,0x19,0x0c,0x19,0x0c,0x11,0x1a,0x83,0x17,0x17,0x1c,0x11,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15, -0x14,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x03,0xf4,0xe4,0xcc,0xd9,0xfe,0xf5,0x01,0x22,0xf2,0x9c,0x6b,0x77,0x96,0x9d,0xc9,0xb0,0x8e,0x7b,0x89,0x02,0xfe,0x98,0x02,0x10,0x01,0xd3,0xe3,0xfe,0xf8,0x01,0x1b,0xe5,0xfd,0x01,0x33,0x3f,0xa8,0x5d,0xe1,0xb7,0xaf,0xd5,0xa3,0x89,0x8b,0x00,0x00,0x01,0x00,0x29,0xff,0xe8,0x04,0xec, -0x05,0x9a,0x00,0x14,0x00,0x3a,0x40,0x1e,0x13,0x13,0x10,0x0c,0x07,0x91,0x09,0x03,0x10,0x91,0x40,0x03,0x13,0x0b,0x0e,0x0d,0x08,0x06,0x42,0x0d,0x7e,0x06,0x06,0x08,0x00,0x7e,0x12,0x12,0x16,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe2,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x31,0x30, -0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x04,0xec,0xd3,0xbd,0xba,0xdc,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x7f,0x71,0xe6,0xa8,0x01,0x9a,0xca,0xe8,0xf1,0xb9,0x03,0x70,0x98,0x98,0xfc,0xa0,0x80,0xa3,0x01,0x21,0x01,0x9a,0x00,0x00,0x01,0x00,0x1e,0xff,0xe8,0x04,0x58, -0x04,0x00,0x00,0x14,0x00,0x3a,0x40,0x1e,0x13,0x13,0x10,0x0c,0x07,0x95,0x09,0x0f,0x10,0x95,0x40,0x03,0x16,0x0b,0x0e,0x0d,0x08,0x06,0x42,0x0d,0x84,0x06,0x06,0x08,0x00,0x83,0x12,0x12,0x16,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe2,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x31,0x30, -0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x04,0x58,0xcc,0xb5,0xb2,0xd3,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x78,0x67,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0xdd,0xb6,0x01,0xf9,0x8c,0x8c,0xfe,0x11,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x03,0x01,0x33,0x04,0xc2,0x03,0x7b,0x06,0x3a, -0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x36,0x40,0x1c,0x01,0xe2,0x40,0x02,0x80,0x0a,0x16,0xc1,0x40,0x04,0x10,0x01,0x00,0x01,0x00,0x13,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1d,0x1c,0x07,0x19,0x2b,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x11,0x39,0x39,0x18,0x2f,0x2f,0x00,0x2f,0x33,0x1a,0xfd,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x21, -0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x56,0xfe,0x04,0x01,0xfc,0x3e,0x28,0x3a,0x39,0x27,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x05,0xcd,0x6d,0xfe,0x88,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a, -0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x64,0x06,0xfa,0x00,0x06,0x00,0x12,0x00,0x1e,0x00,0x66,0x40,0x3d,0x06,0x70,0x03,0x01,0x03,0x80,0x09,0x05,0x19,0x05,0x02,0x09,0x05,0x02,0x40,0x09,0x10,0x48,0x02,0x02,0x0d,0x19,0xc1,0x40,0x07,0x13,0x00,0xe0,0x03,0x01,0x03,0x03,0x00,0x05,0x05,0x1c,0x10,0xc0, -0x0a,0x16,0xc0,0x1c,0x00,0x1c,0x01,0x0f,0x0f,0x0a,0x1f,0x0a,0x2f,0x0a,0x03,0x10,0x03,0x20,0x1f,0x0a,0x1c,0x2b,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x5e,0x5d,0x10,0xe1,0x10,0xe1,0x12,0x39,0x3d,0x2f,0x33,0x33,0x18,0x2f,0x5d,0x2f,0x00,0x2f,0x33,0x1a,0xed,0x32,0x32,0x2f,0x2b,0x33,0x5e,0x5d,0x1a,0xcd,0x5d,0x32,0x31,0x30,0x01,0x03, -0x23,0x03,0x33,0x17,0x37,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x5a,0xd5,0x85,0xd7,0x73,0xa4,0xa4,0x1e,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xfa,0xfe,0xb6,0x01,0x4a,0xe6,0xe6,0xfd,0xc8, -0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x77,0x06,0xe2,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x44,0xb2,0x03,0x80,0x00,0xb8,0xff,0xc0,0x40,0x20,0x09,0x0c,0x48,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19, -0x0f,0x07,0x01,0x10,0x03,0x1d,0x1c,0x07,0x19,0x2b,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x00,0x2f,0x33,0xed,0x32,0x32,0x2f,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x23,0x01,0x33,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x02,0xa2,0x7f,0xfe,0xf9,0xa6,0x01,0x50,0x29,0x39,0x3b,0x29,0x2a,0x39,0x3c,0xfe,0x57,0x2a,0x39,0x3b,0x2a,0x27,0x39,0x3a,0x05,0x9a,0x01,0x48,0xfd,0xe0,0x3a,0x29,0x29,0x39,0x39,0x29,0x2a,0x39,0x3a,0x29,0x29,0x39,0x38,0x2a,0x2b,0x38,0x00,0x02,0x01,0x08,0x04,0xc2,0x03,0x04,0x06,0x35,0x00,0x03,0x00,0x0f,0x00,0x32, -0x40,0x1a,0x01,0xe2,0x40,0x02,0x80,0x0a,0xc1,0x40,0x04,0x00,0x0e,0x0d,0x01,0x07,0x42,0x01,0x01,0x07,0xc0,0x0d,0x11,0x10,0x0d,0xc0,0x2b,0x30,0x2b,0x01,0x10,0xe1,0x32,0x18,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xfd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x03,0x04,0xfe,0x04,0x01,0xfc,0xfe,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x05,0xc8,0x6d,0xfe,0x8d,0x39,0x2a,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x00,0x02,0x01,0x23,0x04,0xb2,0x03,0xa4,0x06,0x55,0x00,0x13,0x00,0x17,0x00,0x3c,0x40,0x20,0x15,0xe2,0x40,0x16,0x80,0x13,0x0d,0xda,0x07,0x11,0xda,0x03,0x09,0x17,0x16,0x17, -0x16,0x0a,0x00,0xc4,0x0f,0x13,0x01,0x13,0x13,0x19,0x09,0xc4,0x20,0x0a,0x01,0x0a,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x5d,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xd6,0xed,0xdc,0xfd,0xc6,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x37,0x21, -0x35,0x21,0x03,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x1a,0xfe,0x04,0x01,0xfc,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x36,0x6d,0x00,0x01,0xff,0x8c,0x05,0x0e,0x03,0x1e,0x05,0xd1,0x00,0x0b,0x00,0x32,0x40,0x19,0x0b,0xdb,0x04,0x08,0x40,0x05,0x01,0x09,0x03,0x03, -0x00,0x0e,0x05,0x0b,0x06,0x42,0x08,0x40,0x0b,0x0c,0x0d,0x06,0x05,0x2b,0x3a,0x2b,0x01,0x18,0x2f,0x1a,0xcd,0x2b,0x01,0x10,0xf0,0xc1,0x18,0x2f,0x00,0x2f,0x33,0x33,0x1a,0xdd,0x32,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x03,0x1e,0x5a,0x22,0x30,0xdc,0x30,0x22,0x30,0xdc,0x30,0x22,0x5a,0x05, -0xd1,0xc3,0x64,0x64,0x64,0x64,0xc3,0x00,0x00,0x02,0xff,0x27,0x04,0x89,0x00,0xbc,0x06,0xa2,0x00,0x14,0x00,0x1e,0x00,0x65,0x40,0x0d,0x02,0x09,0x12,0x09,0x22,0x09,0x03,0x03,0x05,0x0f,0x0f,0x0d,0x0b,0xba,0x01,0x3d,0x00,0x16,0xff,0xf0,0xb6,0x0c,0x0f,0x48,0x16,0x16,0x01,0x0d,0x41,0x0a,0x01,0x3d,0x00,0x12,0x01,0x39,0x00,0x1c, -0x01,0x3d,0x00,0x40,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0xb3,0x0f,0x0f,0x08,0x14,0xb8,0x01,0x3c,0xb4,0x16,0x01,0x0b,0x80,0x1a,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0x1a,0xdc,0x32,0x32,0xe1,0x11,0x39,0x2f,0x00,0x3f,0x3f,0x1a,0xed,0x3f,0xed,0x11,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0x11,0x39,0x31,0x30,0x5d,0x13,0x23,0x35, -0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x07,0x35,0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x36,0xbc,0x52,0x02,0x35,0x68,0x4d,0x57,0xaa,0x99,0x6a,0x5d,0x49,0x41,0x6d,0xb4,0x52,0x7c,0x43,0x30,0x62,0x3e,0x4f,0x04,0x96,0x50,0x5d,0x52,0x43,0x8f,0x17,0x17,0x81,0x3e,0x54,0x30,0xbe, -0x7e,0x34,0x13,0x0a,0x2b,0x2d,0x56,0x57,0x00,0x02,0xff,0x21,0x04,0x89,0x00,0xdf,0x06,0xa2,0x00,0x11,0x00,0x17,0x00,0x68,0x40,0x14,0x02,0x01,0x12,0x01,0x22,0x01,0x03,0x0f,0x01,0x1f,0x01,0x2f,0x01,0x03,0x09,0x03,0x05,0x05,0x03,0x01,0xb8,0x01,0x3d,0xb4,0x40,0x17,0x0e,0x08,0x17,0xb8,0x01,0x3d,0xb2,0x2b,0x30,0x14,0xbe,0x01, -0x3d,0x00,0x0e,0x01,0x39,0x00,0x03,0x01,0x3d,0x00,0x08,0x01,0x3b,0xb3,0x05,0x05,0x0b,0x11,0xb8,0x01,0x3c,0xb7,0x60,0x12,0xc0,0x12,0x02,0x12,0x17,0x01,0xb9,0x01,0x3c,0x00,0x0b,0x2f,0xe1,0x32,0xdd,0x71,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x5d, -0x13,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x06,0x07,0xdf,0xfe,0x98,0x04,0xa1,0x57,0x49,0x42,0x70,0x6c,0x7d,0x87,0x64,0x64,0x6f,0x53,0x02,0x7e,0x3a,0x52,0x09,0x05,0x81,0xb2,0x39,0x4e,0x31,0x8c,0x7f,0x78,0x96,0x81,0x75,0x1a,0x96,0x52,0x44,0x00,0x00,0x02, -0xff,0xcb,0x04,0x96,0x00,0x35,0x07,0x83,0x00,0x07,0x00,0x0b,0x00,0x41,0xb9,0x00,0x00,0x01,0x3f,0x40,0x09,0x40,0x04,0x80,0x00,0x0a,0x01,0x0c,0x03,0x0a,0xbc,0x01,0x38,0x00,0x09,0x01,0x3a,0x00,0x0b,0x01,0x3c,0xb3,0x0a,0x02,0x06,0x0a,0xb8,0x01,0x3c,0xb2,0x2b,0x30,0x02,0xb8,0x01,0x3e,0xb1,0x06,0x0d,0x10,0xd4,0xe1,0x2b,0x01, -0x10,0xe1,0x00,0x18,0x3f,0x3f,0x5f,0x5e,0x5d,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x11,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x03,0x23,0x11,0x33,0x35,0x35,0x35,0x0e,0x52,0x52,0x07,0x18,0x36,0x35,0x35,0x36,0xfd,0x7e,0x02,0x00,0x00,0x00,0x02,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa2,0x00,0x0b,0x00,0x15,0x00,0x29,0x41,0x0e,0x00,0x0c, -0x01,0x3d,0x00,0x06,0x01,0x39,0x00,0x12,0x01,0x3d,0x00,0x00,0x01,0x3b,0x00,0x09,0x01,0x3c,0x00,0x14,0x00,0x0f,0x01,0x3c,0x00,0x03,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x02,0x72,0x88,0x8e,0x78, -0x72,0x80,0x89,0x6f,0x4f,0x5d,0x5c,0x50,0xa4,0x04,0x89,0x90,0x77,0x7f,0x93,0x8e,0x7c,0x7b,0x94,0x01,0xd3,0x6a,0x5e,0x5a,0x6b,0xc7,0xc6,0x00,0x00,0x01,0xff,0x2b,0x04,0x89,0x00,0xd5,0x06,0x96,0x00,0x11,0x00,0x31,0xb1,0x10,0x09,0xb8,0x01,0x38,0xb2,0x0f,0x02,0x0c,0xbe,0x01,0x3d,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00, -0x11,0x01,0x3c,0xb2,0x01,0x10,0x09,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0xd4,0x32,0xe1,0x00,0x3f,0x3f,0xed,0x32,0x32,0x3f,0x33,0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0xd5,0x52,0x02,0x33,0x6a,0xb9,0x52,0x7d,0x3c,0x4d,0x52,0x04,0x96,0x52,0x5f,0xdb,0x01,0x32,0xfe, -0xda,0xa1,0x57,0x48,0x01,0x28,0x00,0x01,0xff,0x2b,0x04,0x89,0x00,0xac,0x06,0xa2,0x00,0x15,0x00,0x2a,0xb1,0x00,0x02,0xbf,0x01,0x3d,0x00,0x13,0x01,0x39,0x00,0x0a,0x00,0x08,0x01,0x3d,0x00,0x0d,0x01,0x3b,0xb2,0x00,0x0a,0x05,0xb9,0x01,0x3c,0x00,0x10,0x2f,0xe1,0xc4,0x32,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x13,0x26, -0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0xac,0x38,0x41,0x4f,0x65,0x5f,0x4f,0x43,0x3c,0x3d,0x51,0x6d,0x86,0x91,0x79,0x45,0x32,0x06,0x35,0x27,0x6f,0x5b,0x5a,0x69,0x2d,0x4e,0x25,0x8f,0x71,0x7e,0x9b,0x19,0x00,0x02,0xff,0x14,0x04,0x89,0x00,0xec,0x07,0x8c,0x00,0x10, -0x00,0x1c,0x00,0x3e,0xb9,0x00,0x0f,0x01,0x36,0xb3,0x0d,0x03,0x05,0x15,0x41,0x0b,0x01,0x3d,0x00,0x0b,0x01,0x39,0x00,0x1a,0x01,0x3d,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00,0x10,0x01,0x3c,0xb3,0x12,0x01,0x0f,0x17,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0xd4,0x32,0x32,0xe1,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f, -0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x36,0xec,0x52,0x02,0x3a,0x76,0x60,0x74,0x80,0x6a,0x6a,0x30,0x02,0x52,0x52,0x53,0x3f,0xa0,0x54,0x44,0x45,0x55,0x04,0x96,0x58,0x65,0x8b,0x75,0x80,0x99,0x52,0x01,0x3c,0xfd, -0xf1,0x4b,0x3f,0x55,0xce,0x59,0x66,0x64,0x00,0x01,0xff,0x2b,0x04,0x96,0x00,0xd5,0x07,0x8c,0x00,0x11,0x00,0x32,0xb9,0x00,0x0b,0x01,0x36,0xb2,0x0d,0x08,0x04,0xbf,0x01,0x3d,0x00,0x0f,0x01,0x39,0x00,0x01,0x00,0x08,0x01,0x3a,0x00,0x00,0x01,0x3c,0xb2,0x01,0x0b,0x08,0xb9,0x01,0x3c,0x00,0x09,0x2f,0xe1,0x32,0xd4,0xe1,0x00,0x3f, -0x33,0x3f,0xed,0x12,0x39,0x3f,0x31,0x30,0x13,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0xd5,0x52,0x77,0x3d,0x52,0x52,0x52,0x02,0x3b,0x6d,0xae,0x04,0x96,0x01,0x26,0xa0,0x5c,0x48,0xfe,0xde,0x02,0xf6,0xfe,0xb6,0x60,0xd1,0x00,0x01,0xfe,0x96,0x04,0x96,0x01,0x6c,0x06,0xa2,0x00,0x1d, -0x00,0x51,0xb4,0x04,0x15,0x19,0x03,0x0c,0xb8,0x01,0x3d,0xb2,0x40,0x1b,0x17,0xba,0x01,0x39,0x00,0x13,0x01,0x38,0xb2,0x08,0x00,0x10,0xba,0x01,0x3a,0x00,0x00,0x01,0x3c,0xb7,0x01,0x0e,0x08,0x10,0x09,0x42,0x19,0x08,0xb8,0x01,0x3c,0xb4,0x09,0x09,0x1e,0x13,0x10,0xb9,0x01,0x3c,0x00,0x11,0x2f,0xe1,0x32,0x11,0x39,0x2f,0xe1,0x39, -0x2b,0x01,0x10,0xf2,0xe1,0x00,0x18,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x1a,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x01,0x6c,0x52,0x72,0x35,0x4a,0x52,0x75,0x35,0x45,0x52,0x52,0x02,0x36,0x67, -0x71,0x20,0x3a,0x70,0xaa,0x04,0x96,0x01,0x26,0xa0,0x5e,0x44,0xfe,0xdc,0x01,0x30,0x96,0x59,0x49,0xfe,0xdc,0x02,0x00,0x50,0x5c,0x6a,0x6a,0xd1,0x00,0x01,0xff,0x9c,0x04,0x96,0x00,0xa8,0x06,0xa0,0x00,0x0f,0x00,0x2d,0xb3,0x0a,0x07,0x00,0x02,0xbe,0x01,0x40,0x00,0x0d,0x01,0x39,0x00,0x08,0x01,0x38,0x00,0x07,0x01,0x3a,0xb3,0x00, -0x00,0x09,0x06,0xb9,0x01,0x3c,0x00,0x07,0x2f,0xf1,0x32,0xc2,0x2f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x12,0x39,0x31,0x30,0x13,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0xa8,0x16,0x2a,0x35,0x45,0x52,0x52,0x02,0x24,0x63,0x1d,0x14,0x06,0x44,0x10,0x64,0x54,0xfe,0xfa,0x02,0x00,0x69,0x73,0x08,0x00, -0x00,0x01,0xff,0x6a,0x04,0x8c,0x00,0x96,0x07,0x2d,0x00,0x13,0x00,0x3a,0xb2,0x0a,0x0e,0x05,0x41,0x09,0x01,0x3d,0x00,0x0b,0x00,0x08,0x01,0x38,0x00,0x13,0x00,0x11,0x01,0x3d,0x00,0x02,0x01,0x3b,0xb6,0x13,0x0d,0x0d,0x0e,0x06,0x0b,0x0e,0xb8,0x01,0x3c,0xb1,0x08,0x05,0x2f,0x33,0xe1,0x32,0xcd,0x10,0xc1,0x2f,0x32,0x00,0x3f,0xed, -0x32,0x3f,0x33,0xed,0x32,0xcd,0x31,0x30,0x13,0x06,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x96,0x1e,0x2e,0x88,0x58,0x58,0x52,0x82,0x82,0x4c,0x1f,0x17,0x04,0x9c,0x10,0x95,0x01,0x2f,0x46,0x7c,0x1b,0x97,0x46,0xfe,0xdf,0x5e,0x11,0x00,0x00,0x01,0xff,0x10,0x04,0x96,0x00,0xf0, -0x06,0x96,0x00,0x0b,0x00,0x5b,0x40,0x0e,0x07,0x40,0x0e,0x11,0x48,0x07,0x18,0x09,0x0d,0x48,0x07,0x02,0x0b,0x04,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x40,0x25,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x0b,0x00,0x0e,0x07,0x0f,0x04,0x1f,0x04,0x2f,0x04,0x03,0x09,0x05,0x04,0x03,0x03,0x07,0x42,0x03,0x01,0x18,0x09,0x0d,0x48,0x00,0x01, -0x02,0x03,0x04,0x07,0x19,0x2f,0x17,0x33,0x2b,0x18,0x2f,0x2b,0x11,0x01,0x33,0x5f,0x5e,0x5d,0x10,0xe0,0x32,0x5d,0x00,0x18,0x3f,0x3f,0x33,0x12,0x39,0x2b,0x2b,0x31,0x30,0x13,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0xf0,0xcd,0x50,0xc3,0x5a,0x84,0x0c,0x04,0x02,0x05,0x0b,0x8a,0x06,0x96,0xfe,0x00,0x02,0x00,0xfe, -0x8d,0x21,0x27,0x26,0x20,0x01,0x75,0x00,0x00,0x01,0xff,0x23,0x04,0x96,0x00,0xdd,0x06,0x96,0x00,0x14,0x00,0x1c,0xbb,0x00,0x0e,0x01,0x38,0x00,0x0a,0x01,0x3a,0x40,0x09,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x0b,0x2f,0xc4,0x5d,0x00,0x3f,0x3f,0x31,0x30,0x13,0x03,0x17,0x23,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x23,0x37,0x03, -0x33,0x17,0x16,0x17,0x33,0x37,0x37,0xdd,0xac,0xaa,0x60,0x65,0x0f,0x07,0x02,0x07,0x0f,0x67,0x5e,0xae,0xa8,0x60,0x63,0x08,0x0e,0x02,0x16,0x69,0x06,0x96,0xfe,0xfe,0xfe,0xa6,0x19,0x0d,0x0e,0x18,0xa6,0xfc,0x01,0x04,0xae,0x0e,0x1c,0x2a,0xae,0x00,0x00,0x01,0x00,0x72,0x03,0xc6,0x01,0x62,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb4,0x02, -0x03,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x62,0x7c,0x74,0x54,0x05,0x9a,0xfe,0x2c,0x01,0xd4,0x00,0x01,0x00,0x72,0xfd,0xfe,0x01,0x62,0xff,0xc6,0x00,0x03,0x00,0x20,0xb9,0x00,0x03,0xff,0xc0,0x40,0x0e,0x0e,0x11,0x48,0x03,0x03,0x04,0x1f,0x02,0x2f,0x02,0x02,0x02,0x00,0x02,0x2f,0xcd,0x00, -0x2f,0x5d,0x12,0x39,0x2f,0x2b,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0x62,0x54,0x9c,0x7e,0x3a,0xfe,0x38,0x01,0xc8,0x00,0x01,0x01,0xba,0xfe,0x40,0x02,0xf6,0xff,0x89,0x00,0x0c,0x00,0x21,0x40,0x11,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x06,0x40,0x09,0x0d,0x48,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x2b,0x1a,0xdc, -0x1a,0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x02,0xf6,0x3c,0x56,0x4b,0x5f,0x7b,0x44,0x29,0x29,0xfe,0x90,0x50,0x53,0x46,0xb0,0xba,0x43,0x2a,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x50,0x05,0xc4,0x00,0x11,0x00,0x36,0xbc,0x00,0x0a,0x01,0x07,0x00,0x09,0x00,0x01,0x01,0x0a,0xb2, -0x0a,0x0c,0x04,0xbc,0x01,0x0d,0x00,0x0f,0x01,0x09,0x00,0x00,0x01,0x0c,0xb4,0x01,0x01,0x13,0x0c,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xe9,0x00,0x3f,0xed,0x32,0x32,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d, -0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x50,0x05,0xc4,0x00,0x1a,0x00,0x4d,0xb1,0x09,0x01,0xbd,0x01,0x0a,0x00,0x15,0x00,0x04,0x01,0x0d,0x00,0x18,0xff,0xc0,0xb3,0x09,0x0d,0x48,0x18,0xb8,0x01,0x09,0xb2,0x10, -0x10,0x12,0xba,0x01,0x0d,0x00,0x0d,0x01,0x07,0xb3,0x10,0x10,0x08,0x00,0xb8,0x01,0x0c,0xb4,0x01,0x01,0x1c,0x15,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xe9,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x2b,0xed,0x32,0x3f,0x33,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x36, -0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x39,0x45,0x80,0x96,0x87,0x3d,0x3c,0x3a,0x3d,0x9f,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x0a,0x88,0x98,0x18,0x68,0x1c,0xb2,0x46,0x67,0xe7,0x00,0x02,0xff,0xbe,0x01,0x98,0x00,0xf6,0x05,0xc4,0x00,0x07, -0x00,0x13,0x00,0x38,0xb2,0x0d,0x0d,0x0f,0xb8,0x01,0x0d,0xb5,0x0a,0x12,0x04,0x00,0x40,0x12,0xb8,0x01,0x08,0x40,0x0b,0x02,0x06,0x0c,0x11,0x08,0x02,0x06,0xff,0x3a,0x0c,0x08,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xe9,0x33,0x2b,0x01,0x18,0x2f,0x2f,0x2f,0x00,0x3f,0x1a,0xde,0xcd,0x10,0xd4,0xed,0x32,0x2f,0x31,0x30,0x13,0x22,0x35,0x34, -0x33,0x32,0x15,0x14,0x03,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0xa6,0x4e,0x50,0x4e,0x0e,0xda,0x2b,0x25,0x22,0x24,0x64,0x80,0x05,0x2d,0x4c,0x4b,0x4b,0x4c,0xfd,0x79,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x02,0x24,0x00,0x01,0x00,0x66,0x02,0x9a,0x01,0xa8,0x04,0xc8,0x00,0x0e,0x00,0x2d,0xbb,0x00,0x06,0x01,0x0a,0x00, -0x07,0x01,0x08,0xb5,0x0e,0xda,0x00,0x09,0x00,0x02,0xbe,0x01,0x0e,0x00,0x0c,0x01,0x09,0x00,0x09,0x00,0x05,0x01,0x0c,0x00,0x06,0x2f,0xe9,0x32,0x00,0x3f,0xed,0x32,0x32,0x2f,0xed,0x3f,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x01,0xa8,0x1e,0x26,0x7e,0x80,0x80,0x02,0x28,0x69, -0x1b,0x14,0x04,0x46,0x12,0xb4,0xfe,0xf6,0x02,0x24,0x6c,0x76,0x08,0x00,0x00,0x01,0x00,0x0a,0x02,0x90,0x01,0x4c,0x04,0xbe,0x00,0x0e,0x00,0x31,0xb5,0x08,0x02,0x08,0x0a,0x52,0x05,0xbc,0x01,0x0b,0x00,0x01,0x01,0x0a,0x00,0x0d,0x01,0x08,0xb3,0x07,0x07,0x0c,0x00,0xb8,0x01,0x0c,0xb3,0x01,0x01,0x10,0x0f,0x11,0x12,0x39,0x2f,0xe9, -0x33,0x33,0x2f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x2f,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x01,0x4c,0x7f,0x02,0x29,0x68,0x1c,0x14,0x1e,0x26,0x7f,0x7f,0x02,0x9a,0x6c,0x76,0x08,0x7a,0x12,0xb4,0x01,0x0a,0x00,0x01,0x00,0x0a,0x01,0x94,0x01,0xcf,0x04,0xbe,0x00,0x16,0x00,0x3e, -0xb2,0x16,0x16,0x14,0xb8,0x01,0x0d,0xb7,0x02,0x08,0x0b,0x05,0x0b,0x0d,0x52,0x08,0xba,0x01,0x0b,0x00,0x10,0x01,0x08,0xb5,0x00,0x0a,0x00,0x0a,0x0f,0x12,0xb8,0x01,0x0c,0xb3,0x04,0x04,0x18,0x17,0x11,0x12,0x39,0x2f,0xe9,0x33,0x33,0x32,0x2f,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x32,0x2f,0x10,0xd4,0xed,0x32,0x2f,0x31,0x30,0x01,0x06, -0x23,0x22,0x35,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0xcf,0x23,0x40,0x9f,0x02,0x29,0x68,0x1c,0x14,0x1e,0x26,0x7f,0x7f,0x4a,0x1e,0x1b,0x01,0xa6,0x12,0xbe,0xb4,0x76,0x08,0x7a,0x12,0xb4,0x01,0x0a,0xfd,0x9e,0x5e,0x10,0x00,0x02,0x00,0x66,0x02,0x9a,0x02,0x29,0x04,0xbe, -0x00,0x10,0x00,0x17,0x00,0x4d,0xb1,0x03,0x11,0xb8,0x01,0x0d,0xb3,0x0c,0x0c,0x0a,0x12,0xbd,0x01,0x0d,0x00,0x09,0x01,0x0a,0x00,0x00,0x00,0x0a,0x01,0x08,0x40,0x09,0x01,0x0f,0x0f,0x12,0x10,0xc2,0x00,0x00,0x06,0xb8,0x01,0x0c,0xb5,0x15,0x15,0x19,0x04,0x0c,0x12,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x32,0x12,0x39,0x2f,0xe9, -0x32,0x2f,0xe9,0x11,0x39,0x11,0x33,0x00,0x3f,0x33,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x07,0x06,0x07,0x15,0x16,0x15,0x14,0x23,0x23,0x11,0x33,0x15,0x33,0x32,0x37,0x37,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0x29,0x47,0x1a,0x36,0x7c,0xdf,0xc9,0x80,0x2a,0x3e,0x1c,0x3c,0xc0,0x43,0x67,0x61,0x04,0xbe,0xa2,0x3c, -0x15,0x03,0x14,0x6e,0xac,0x02,0x24,0xd0,0x43,0x8d,0xfe,0xce,0x90,0x48,0x48,0x00,0x00,0x01,0x00,0x14,0x02,0x9a,0x03,0x18,0x04,0xbe,0x00,0x1b,0x00,0x17,0xbb,0x00,0x0a,0x01,0x0a,0x00,0x0b,0x01,0x08,0xb3,0x00,0x00,0x1d,0x0b,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x34,0x27,0x23,0x06,0x07,0x03,0x23, -0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x03,0x18,0x8c,0x9c,0x4a,0x0c,0x04,0x04,0x09,0x51,0x9c,0x88,0x8a,0x48,0x03,0x05,0x04,0x02,0x0a,0x58,0x92,0x50,0x03,0x05,0x04,0x02,0x08,0x4a,0x04,0xbe,0xfd,0xdc,0x01,0x41,0x01,0x45,0x19,0x2b,0xfe,0xbd,0x02,0x24,0xfe,0x9e,0x10,0x36,0x20, -0x28,0x01,0x60,0xfe,0x9e,0x0b,0x3b,0x20,0x26,0x01,0x62,0x00,0x00,0x01,0x00,0x0a,0x01,0x94,0x02,0x2f,0x04,0xbe,0x00,0x14,0x00,0x25,0xb2,0x06,0x06,0x08,0xb8,0x01,0x0d,0xb6,0x11,0x14,0x0b,0x01,0x04,0x03,0x0c,0xb8,0x01,0x08,0xb3,0x00,0x00,0x16,0x0c,0x2f,0x11,0x33,0x2f,0x00,0x3f,0xd4,0x17,0x39,0xed,0x32,0x2f,0x31,0x30,0x01, -0x03,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x02,0x2f,0xeb,0x48,0xa2,0x22,0x26,0x1e,0x20,0x57,0x24,0x14,0xd5,0x8a,0x78,0x0a,0x06,0x05,0x09,0x09,0x79,0x04,0xbe,0xfd,0x94,0xbe,0x0c,0x6c,0x0e,0x60,0x38,0x02,0x28,0xfe,0xa0,0x1e,0x34,0x37,0x1b,0x01,0x60,0x00,0x00,0x01, -0x00,0x82,0x03,0xdb,0x01,0x5e,0x05,0x9a,0x00,0x03,0x00,0x18,0xb7,0x02,0x03,0x03,0x03,0xbd,0x00,0x00,0x01,0xb9,0x01,0x34,0x00,0x02,0x2f,0xe9,0x32,0x2f,0xe9,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x5e,0x68,0x74,0x56,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x00,0x02,0x00,0x8d,0x03,0xdb,0x02,0x84,0x05,0x9a,0x00,0x03, -0x00,0x07,0x00,0x28,0x40,0x12,0x06,0x03,0x02,0x07,0x04,0x03,0x00,0x00,0x01,0x02,0x02,0x09,0x06,0x07,0x04,0x04,0x05,0x06,0x2f,0xcd,0x32,0x2f,0xcd,0x11,0x12,0x39,0x2f,0xcd,0x32,0x2f,0xcd,0x00,0x3f,0xc4,0x33,0x32,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x84,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe, -0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x00,0x01,0x00,0x6a,0x03,0xf4,0x01,0x6c,0x05,0xb2,0x00,0x03,0x00,0x16,0x40,0x09,0x02,0x03,0x04,0x03,0x00,0x00,0x01,0x01,0x02,0x2f,0x33,0x11,0x33,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x6c,0x6c,0x96,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0x00,0xff,0xff,0x00,0x6e, -0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x06,0x00,0xb7,0x00,0x00,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x16,0x40,0x09,0x01,0x02,0x04,0x01,0x00,0x00,0x03,0x03,0x02,0x2f,0x33,0x11,0x33,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x23,0x03,0x33,0x01,0x70,0x74,0x8e,0x94,0x03,0xf4,0x01,0xbe,0x00,0x00,0x01, -0x00,0xfb,0x04,0xc2,0x01,0xaf,0x06,0x2f,0x00,0x0b,0x00,0x22,0x40,0x10,0x05,0xcb,0x40,0x06,0xc0,0x01,0xcb,0x40,0x00,0x00,0x06,0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x35,0x32,0x35,0x34,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0xfb,0x5e,0x5e,0x4e,0x66,0x66, -0x04,0xc2,0x5c,0x5b,0x58,0x5e,0x68,0x4e,0x4e,0x69,0x00,0x01,0x00,0xfb,0x04,0xc2,0x01,0xaf,0x06,0x2f,0x00,0x0b,0x00,0x20,0x40,0x0f,0x07,0xcb,0x40,0x06,0xc0,0x0b,0xcb,0x40,0x00,0x00,0x06,0x80,0x09,0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x15, -0x22,0x15,0x14,0x33,0x01,0xaf,0x4e,0x66,0x65,0x4f,0x5e,0x5e,0x04,0xc2,0x69,0x4e,0x4d,0x69,0x5e,0x58,0x5b,0x00,0x00,0x01,0x00,0x14,0x02,0x9a,0x01,0xb0,0x05,0xc4,0x00,0x15,0x00,0x2f,0xb1,0x0b,0x09,0xbe,0x01,0x0d,0x00,0x0e,0x01,0x07,0x00,0x01,0x01,0x0a,0x00,0x00,0x01,0x0c,0xb3,0x01,0x01,0x0b,0x11,0xb8,0x01,0x0c,0xb3,0x07, -0x07,0x17,0x0b,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xed,0x32,0x31,0x30,0x13,0x23,0x11,0x34,0x36,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0xfc,0x7f,0x24,0x41,0x4d,0x87,0x4a,0x4a,0x4a,0x5a,0x73,0x85,0x6a,0x4a,0x02,0x9a,0x01,0x08,0x40,0x59,0x3c,0x49,0x36, -0x64,0x2b,0x73,0x22,0x6e,0x58,0x62,0x60,0x44,0x56,0x00,0x01,0x00,0x0a,0x02,0x9a,0x01,0xa6,0x05,0xc4,0x00,0x15,0x00,0x2f,0xb1,0x00,0x02,0xbe,0x01,0x0d,0x00,0x13,0x01,0x07,0x00,0x0b,0x01,0x0a,0x00,0x09,0x01,0x0c,0xb6,0x0c,0x0c,0x10,0x00,0x00,0x17,0x04,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x2f,0xe1, -0x00,0x3f,0x3f,0xed,0x32,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0xa6,0x48,0x52,0x80,0x4f,0x3a,0x29,0x80,0x50,0x64,0x8b,0x73,0x52,0x4c,0x05,0x2f,0x2b,0x5e,0x33,0x50,0x3a,0x58,0x45,0xfe,0xf8,0x01,0x06,0x4c,0x50,0x64,0x5a,0x58,0x72,0x22, -0x00,0x01,0x00,0x72,0x00,0xe4,0x04,0x3c,0x04,0xc2,0x00,0x06,0x00,0x32,0x40,0x16,0x04,0x03,0x0e,0x05,0x20,0x06,0x00,0x05,0x00,0x42,0x00,0x00,0x02,0x01,0x05,0x05,0x01,0x04,0x00,0x00,0x08,0x07,0x11,0x12,0x39,0x2f,0x33,0xcd,0x39,0x00,0x19,0x2f,0x33,0x33,0x33,0x18,0x2f,0x2b,0x11,0x00,0x33,0x1a,0x19,0x10,0xed,0x32,0x31,0x30, -0x25,0x01,0x35,0x01,0x17,0x01,0x01,0x04,0x3c,0xfc,0x36,0x03,0xc8,0x01,0xfc,0xff,0x03,0x00,0xe4,0x01,0x9b,0xa8,0x01,0x9b,0xb2,0xfe,0xc3,0xfe,0xc3,0x00,0x00,0x01,0x00,0x70,0x00,0xe4,0x04,0x3c,0x04,0xc2,0x00,0x06,0x00,0x32,0x40,0x17,0x04,0x05,0x0e,0x03,0x20,0x02,0x01,0x03,0x01,0x42,0x01,0x00,0x01,0x06,0x03,0x03,0x03,0x00, -0x04,0x01,0x01,0x08,0x07,0x11,0x12,0x39,0x2f,0x33,0xcd,0x39,0x00,0x19,0x2f,0x17,0x33,0x18,0x2f,0x2b,0x11,0x00,0x33,0x1a,0x19,0x10,0xed,0x32,0x31,0x30,0x01,0x01,0x35,0x01,0x01,0x35,0x01,0x04,0x3a,0xfc,0x36,0x03,0x02,0xfc,0xfe,0x03,0xcc,0x02,0x7f,0xfe,0x65,0xb2,0x01,0x3d,0x01,0x3d,0xb2,0xfe,0x65,0x00,0x00,0x01,0x00,0x66, -0x00,0xee,0x04,0x46,0x04,0xb8,0x00,0x06,0x00,0x23,0x40,0x0f,0x02,0x05,0x01,0x03,0x06,0x05,0x02,0x02,0x04,0x01,0x00,0x00,0x08,0x03,0x04,0x2f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x33,0x33,0x00,0x2f,0x33,0xcd,0x32,0x31,0x30,0x25,0x23,0x01,0x01,0x23,0x01,0x33,0x04,0x46,0xb2,0xfe,0xc2,0xfe,0xc2,0xb2,0x01,0x9c,0xa8,0xee, -0x03,0x02,0xfc,0xfe,0x03,0xca,0x00,0x01,0x00,0x66,0x00,0xee,0x04,0x46,0x04,0xb8,0x00,0x06,0x00,0x23,0x40,0x0f,0x06,0x04,0x05,0x02,0x02,0x01,0x05,0x05,0x03,0x06,0x00,0x00,0x08,0x04,0x03,0x2f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x33,0x33,0x00,0x2f,0x33,0xcd,0x32,0x31,0x30,0x01,0x01,0x23,0x01,0x33,0x01,0x01,0x04,0x46, -0xfe,0x64,0xa8,0xfe,0x64,0xb2,0x01,0x3e,0x01,0x3e,0x04,0xb8,0xfc,0x36,0x03,0xca,0xfc,0xfe,0x03,0x02,0x00,0x01,0x01,0x20,0x04,0x96,0x01,0x8a,0x06,0x00,0x00,0x03,0x00,0x11,0xb3,0x01,0x02,0x01,0x00,0xb9,0x01,0x32,0x00,0x01,0x2f,0xe1,0x00,0x3f,0xcd,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x8a,0x6a,0x6a,0x04,0x96,0x01,0x6a,0x00, -0xff,0xff,0x00,0x87,0x04,0xc2,0x02,0x0c,0x06,0x0a,0x02,0x06,0x00,0x8e,0x00,0x00,0xff,0xff,0x00,0x52,0x04,0xc2,0x01,0xd7,0x06,0x0a,0x02,0x06,0x00,0x43,0x00,0x00,0x00,0x01,0x01,0x20,0xfe,0x1e,0x01,0x8a,0xff,0x89,0x00,0x03,0x00,0x15,0xb5,0x02,0x02,0x04,0x01,0x1c,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x00,0x3f,0x12,0x39, -0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x8a,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0x00,0x00,0x01,0x00,0x3e,0xff,0x1c,0x02,0x3a,0xff,0x89,0x00,0x03,0x00,0x13,0xb7,0x01,0xe2,0x02,0x04,0x03,0x03,0x05,0x02,0x2f,0x12,0x39,0x2f,0x00,0x10,0xde,0xed,0x31,0x30,0x05,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0xe4,0x6d,0x00,0xff,0xff, -0x00,0x52,0xfe,0x43,0x01,0xd7,0xff,0x8b,0x00,0x07,0x00,0x43,0x00,0x00,0xf9,0x81,0xff,0xff,0x00,0x87,0xfe,0x42,0x02,0x0c,0xff,0x8a,0x00,0x07,0x00,0x8e,0x00,0x00,0xf9,0x80,0x00,0x02,0x00,0xb6,0x00,0x00,0x01,0x83,0x04,0x25,0x00,0x03,0x00,0x07,0x00,0x1f,0x40,0x11,0x02,0x63,0x03,0x06,0x63,0x05,0x00,0x42,0x04,0x40,0x13,0x19, -0x48,0x04,0x62,0x03,0x05,0x2f,0x33,0xf1,0x2b,0xe2,0x00,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x13,0x23,0x37,0x33,0x01,0x83,0x5a,0x19,0x5a,0xcc,0xcc,0x5a,0x18,0x04,0x25,0xcd,0xcd,0xfb,0xdb,0xcd,0x00,0x00,0x01,0x00,0xb6,0x01,0xc8,0x01,0x83,0x02,0x96,0x00,0x03,0x00,0x15,0x40,0x0b,0x03,0x63,0x02,0x00,0x40,0x13, -0x19,0x48,0x00,0x62,0x03,0x2f,0xe1,0x2b,0x00,0x2f,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x01,0x83,0x58,0x1b,0x5a,0x02,0x96,0xce,0xce,0xff,0xff,0x00,0xfb,0x01,0x75,0x01,0xaf,0x02,0xe2,0x00,0x07,0x06,0x84,0x00,0x00,0xfc,0xb3,0xff,0xff,0x00,0xfb,0x01,0x75,0x01,0xaf,0x02,0xe2,0x00,0x07,0x06,0x85,0x00,0x00,0xfc,0xb3,0x00,0x01, -0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xe6,0x00,0x07,0x00,0x22,0xb3,0x03,0xc0,0x05,0x02,0xb8,0x01,0x33,0xb5,0x00,0x06,0x06,0x05,0x01,0x05,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0xcd,0x10,0xc9,0x2f,0x00,0x2f,0xed,0x32,0x1a,0xcc,0x31,0x30,0x13,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xa0,0x7e,0x6e,0x7e,0x01,0x74,0x6b,0x01,0x07,0xfe, -0xf9,0x6b,0x00,0x01,0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xe6,0x00,0x07,0x00,0x1f,0x40,0x0e,0x01,0x06,0xe2,0x40,0x07,0xc0,0x04,0x01,0x01,0x02,0x06,0x02,0x50,0x05,0x2f,0xe1,0xcd,0x10,0xc1,0x2f,0x00,0x2f,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x02,0x0a,0x7e,0x6e,0x7e,0x02,0xe6,0x6b,0xfe, -0xf9,0x01,0x07,0x6b,0x00,0x01,0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xdd,0x00,0x0b,0x00,0x29,0x40,0x13,0x08,0x80,0x01,0x04,0xfd,0x40,0x0a,0x07,0x03,0x00,0x04,0x05,0x05,0x80,0x0a,0x01,0xfc,0x07,0x04,0x2f,0x33,0xf1,0x32,0x1a,0xc8,0x2f,0x10,0xcc,0x00,0x2f,0xde,0x32,0x1a,0xfd,0x32,0x1a,0xce,0x31,0x30,0x01,0x23,0x15,0x23,0x35, -0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x02,0x0a,0x7e,0x6e,0x7e,0x7e,0x6e,0x7e,0x01,0xf4,0x80,0x80,0x6a,0x7f,0x7f,0x00,0x01,0x00,0x3e,0x01,0xf4,0x02,0x3a,0x02,0x60,0x00,0x03,0x00,0x11,0xb6,0x02,0xe2,0x01,0x00,0x00,0x05,0x01,0x2f,0x12,0x39,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x01, -0xf4,0x6c,0x00,0x01,0x00,0x79,0x02,0x79,0x02,0x31,0x03,0xc8,0x00,0x0c,0x00,0x3d,0xb7,0x0c,0x0c,0x09,0x01,0x01,0x0b,0x06,0x04,0xb8,0x01,0x35,0x40,0x09,0x09,0x01,0x06,0x40,0x0b,0x0e,0x48,0x06,0x00,0xb8,0xff,0xc0,0x40,0x09,0x09,0x0d,0x48,0x00,0x00,0x01,0x06,0x03,0x0b,0x19,0x2f,0x17,0x33,0x18,0x2f,0x2b,0x2f,0x2b,0x19,0x2f, -0x00,0x18,0x2f,0xed,0x32,0xcd,0x32,0x2f,0x11,0x39,0x2f,0x31,0x30,0x13,0x37,0x17,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x07,0x79,0xcb,0x20,0x27,0x4e,0x29,0x2f,0x39,0x30,0x7a,0x3c,0x54,0x02,0xf0,0xd8,0x5e,0x74,0x22,0x80,0x1f,0x79,0x56,0x00,0x01,0x00,0x48,0x03,0xa4,0x02,0x68,0x05,0xc4,0x00,0x0b,0x00,0x4a,0x40,0x16, -0x00,0x01,0x04,0x03,0x03,0x06,0x09,0x0a,0x03,0x07,0x02,0x03,0x07,0x08,0x0b,0x05,0xe4,0x05,0xf4,0x05,0x02,0x05,0xb8,0xff,0xe0,0x40,0x15,0x2c,0x30,0x48,0x05,0x00,0x09,0x0a,0x03,0x01,0x04,0x06,0x07,0x03,0x03,0x01,0x02,0x03,0x05,0x0b,0x05,0x08,0x19,0x2f,0x17,0x33,0x11,0x17,0x33,0x11,0x17,0x33,0x00,0x2f,0x2b,0x5d,0x17,0x33, -0x11,0x17,0x33,0x11,0x17,0x33,0x31,0x30,0x01,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x02,0x68,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0x03,0xf8,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0x00,0x02,0x00,0x0a,0x01,0xb8,0x02,0x4c,0x04,0xbe,0x00,0x11,0x00,0x19,0x00,0x4f,0x40,0x12, -0x01,0x0d,0x10,0x12,0x04,0x11,0x0f,0x07,0x16,0x01,0x0d,0x10,0x12,0x04,0x04,0x0a,0x11,0x00,0xb8,0xff,0xc0,0x40,0x10,0x09,0x0c,0x48,0x00,0x00,0x04,0x0f,0x0e,0x40,0x09,0x0c,0x48,0x0e,0x0e,0x0a,0x04,0xbc,0x01,0x34,0x00,0x18,0x00,0x0a,0x01,0x34,0x00,0x14,0x2f,0xe1,0xde,0xe1,0x10,0xc2,0x2f,0x2b,0x32,0x10,0xc2,0x2f,0x2b,0x32, -0x11,0x12,0x17,0x39,0x00,0x2f,0xcd,0xc4,0x32,0x17,0x39,0x31,0x30,0x01,0x03,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x03,0x33,0x13,0x13,0x03,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x02,0x4c,0xdc,0x19,0x3b,0x5c,0x43,0x45,0x52,0x3d,0x19,0xda,0x8a,0x95,0x99,0x99,0x29,0x29,0x29,0x04,0xbe,0xfe,0x50,0x28,0x5e, -0x3c,0x3a,0x5a,0x52,0x3e,0x37,0x67,0x28,0x01,0xb0,0xfe,0xb9,0x01,0x47,0xfd,0xf6,0x44,0x22,0x34,0x34,0x22,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x00,0xe6,0x05,0xc4,0x00,0x03,0x00,0x16,0xbe,0x00,0x02,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x00,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x13,0x23,0x11,0x33,0xe6,0x80, -0x80,0x02,0x9a,0x03,0x2a,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xbc,0x04,0xcf,0x00,0x1d,0x00,0x5d,0x40,0x17,0x25,0x17,0x01,0x17,0x15,0x03,0x0b,0x09,0x1b,0x09,0x2b,0x09,0x03,0x0b,0x07,0x1b,0x07,0x02,0x09,0x07,0x1c,0x10,0x12,0xbf,0x01,0x0d,0x00,0x0d,0x01,0x09,0x00,0x01,0x00,0x03,0x01,0x0d,0x00,0x1c,0x01,0x0b,0xb3,0x10, -0x10,0x0a,0x19,0xb8,0x01,0x0c,0xb4,0x05,0x05,0x1f,0x01,0x14,0xb8,0x01,0x0c,0xb2,0x0a,0x0a,0x01,0x2f,0x33,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x39,0x5d,0x5d,0x12,0x39,0x39,0x5d,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32, -0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x3e,0x48,0x55,0x63,0x27,0x4a,0x8f,0x79,0x5d,0x47,0x43,0x42,0x4a,0x56,0x60,0x69,0x37,0x7f,0x66,0x4f,0x02,0xac,0x70,0x30,0x39,0x1b,0x21,0x1e,0x38,0x6c,0x4a,0x62,0x1d,0x6e,0x28,0x3d,0x31,0x27,0x2a,0x4e,0x30,0x46,0x60,0x00,0x01,0x00,0x14,0x02,0x9a, -0x02,0x2d,0x04,0xbe,0x00,0x13,0x00,0x17,0xbb,0x00,0x0e,0x01,0x08,0x00,0x0a,0x01,0x0a,0xb3,0x02,0x02,0x15,0x0b,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x13,0x23,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x23,0x13,0x03,0x33,0x1f,0x02,0x33,0x37,0x02,0x2d,0xb9,0xb7,0x8f,0x62,0x02,0x15,0x05,0x08,0x0e,0x64,0x90,0xbd, -0xae,0x8f,0x5e,0x01,0x14,0x04,0x7d,0x04,0xbe,0xfe,0xf0,0xfe,0xec,0xa4,0x02,0x2a,0x12,0x18,0xa6,0x01,0x0e,0x01,0x16,0xae,0x02,0x28,0xd8,0x00,0xff,0xff,0x00,0x0a,0x02,0x9a,0x01,0xa6,0x05,0xc4,0x02,0x06,0x06,0x87,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x05,0x00,0x1a,0x40,0x0b,0x01,0x03,0x04,0x04, -0x03,0x03,0x00,0x01,0x01,0x07,0x06,0x11,0x12,0x39,0x2f,0xcd,0x33,0x2f,0x00,0x3f,0xcd,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0xe4,0x05,0x1e,0x9c,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x03,0x04,0x06,0x04,0x03,0x03,0x05,0x00,0x01,0x01,0x09, -0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x3f,0x2f,0xcd,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x03,0xd5,0x9d,0x01,0x48,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x06,0x04,0x03,0x04,0x03,0x03,0x05,0x00,0x01, -0x01,0x09,0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x2f,0xcd,0x3f,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x02,0x90,0x9b,0x02,0x8f,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x06,0x04,0x03,0x04,0x03,0x03,0x05, -0x00,0x01,0x01,0x09,0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x2f,0xcd,0x3f,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x01,0x48,0x9c,0x03,0xd6,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x05,0x00,0x1a,0x40,0x0b,0x01,0x02,0x05,0x04,0x02,0x02, -0x05,0x04,0x04,0x07,0x06,0x11,0x12,0x39,0x2f,0xcd,0x33,0x2f,0x00,0x3f,0x2f,0xcd,0x31,0x30,0x21,0x21,0x35,0x21,0x11,0x33,0x02,0x79,0xfe,0x1d,0x01,0x48,0x9c,0x9c,0x05,0x1e,0x00,0x01,0x00,0x62,0x00,0x00,0x02,0x48,0x03,0x70,0x00,0x05,0x00,0x10,0xb5,0x02,0x04,0x01,0x05,0x04,0x01,0x2f,0xcd,0x2f,0x00,0x2f,0xcd,0x2f,0x31,0x30, -0x21,0x21,0x11,0x33,0x03,0x21,0x02,0x48,0xfe,0x1a,0x5e,0x02,0x01,0x8a,0x03,0x70,0xfc,0xee,0x00,0x01,0x00,0x62,0x00,0x00,0x02,0x48,0x03,0x70,0x00,0x07,0x00,0x19,0x40,0x0a,0x03,0x04,0x01,0x06,0x00,0x00,0x09,0x06,0x02,0x03,0x2f,0xcd,0x32,0x11,0x39,0x2f,0x00,0x2f,0xcd,0x2f,0x2f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x03, -0x21,0x02,0x48,0xfe,0x78,0x5e,0x5e,0x02,0x01,0x8a,0x01,0x89,0xfe,0x77,0x03,0x70,0xfe,0x78,0x00,0x01,0x00,0x3c,0xfe,0x40,0x02,0x6e,0xff,0x89,0x00,0x06,0x00,0x1c,0x40,0x0e,0x00,0x00,0x08,0x03,0x02,0x80,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f,0x12,0x39,0x2f,0x31,0x30,0x05,0x03,0x23,0x03, -0x33,0x17,0x37,0x02,0x6e,0xd6,0x84,0xd8,0x73,0xa4,0xa4,0x77,0xfe,0xb7,0x01,0x49,0xe5,0xe5,0x00,0x02,0x00,0x00,0x04,0x5c,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x13,0x05,0xd9,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x06,0x06,0x01,0xd9,0x02,0x00,0x04,0x01,0x00,0x05,0x2f,0xc4,0x33,0x32,0x00,0x3f,0xed,0x33,0x2f, -0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0xfe,0x70,0x77,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x0a,0x02,0x03,0x06,0x07,0x04,0x03,0xea,0x00,0x00,0x01,0xb8,0x01,0x34,0x40,0x09,0x02,0x02,0x09, -0x06,0x07,0xea,0x04,0x04,0x05,0xb9,0x01,0x34,0x00,0x06,0x2f,0xe9,0x32,0x2f,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x32,0x2f,0xe9,0x00,0x3f,0xcd,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c,0x76,0x6c,0x9a,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x01,0xff,0x3a,0xfe,0x1e, -0x01,0x4a,0x04,0x00,0x00,0x0c,0x00,0x3a,0x40,0x19,0x0b,0x0f,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03,0x1c,0x06,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x84,0x0a,0xb8,0xff,0xfe,0xb6,0x0c,0x06,0x4d,0x0a,0x0a,0x0e,0x0d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0xc6,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f, -0x31,0x30,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0xa4,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x03,0xf0,0x00,0x01,0x00,0x0a,0x00,0x00,0x02,0x0e,0x04,0x00,0x00,0x0b,0x00,0x2d,0x40,0x17,0x01,0x0a,0x04,0x95,0x40,0x07,0x08,0x03,0x07,0x95,0x30,0x30, -0x08,0x0f,0x03,0x00,0x00,0x09,0x08,0x02,0x84,0x05,0x03,0x2f,0xc6,0xf1,0x39,0x39,0xc2,0x2f,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x02,0x0e,0xb0,0xa4,0xb0,0xb0,0xa4,0xb0,0x01,0xdb,0xfe,0x25,0x01,0xdb,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x01, -0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4a,0x40,0x2e,0x74,0x06,0x84,0x06,0x02,0x36,0x06,0x46,0x06,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x34,0x07,0x44,0x07,0x54,0x07,0x74,0x07,0x84,0x07,0x94,0x07,0x06,0x07,0x02,0x04,0x06,0x08,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12, -0x39,0x2f,0x10,0xd4,0xcd,0x12,0x39,0x5d,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x03,0xd6,0x01,0x48,0x9c,0xfe,0xd6,0x01,0x2a,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba, -0x00,0x09,0x00,0x5a,0x40,0x39,0x24,0x03,0x01,0x16,0x03,0x01,0x94,0x06,0xa4,0x06,0x02,0x72,0x06,0x01,0x43,0x06,0x01,0x14,0x06,0x24,0x06,0x34,0x06,0x03,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x03,0x06,0x08,0x90,0x07,0xa0,0x07,0x02,0x84,0x07,0x01,0x70,0x07,0x01,0x07,0x02,0x02,0x01,0x08,0x01,0x00, -0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xd4,0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x02,0x8f,0x02,0x8f,0x9c,0xfe,0x07,0x01,0xf9,0x00,0x01,0x00,0x96, -0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x29,0x04,0x06,0x14,0x06,0x94,0x06,0xa4,0x06,0x04,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x03,0x06,0x09,0xa1,0x07,0x01,0x70,0x07,0x80,0x07,0x90,0x07,0x03,0x07,0x02,0x02,0x01,0x09,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x10,0xd4, -0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x01,0x47,0x03,0xd7,0x9c,0xfd,0x37,0x02,0xc9,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x38,0x40,0x20,0xa6,0x05,0x01,0x02, -0x05,0x03,0x01,0x06,0x08,0x0a,0x00,0x03,0x10,0x03,0x02,0x03,0x02,0x05,0x07,0xa0,0x06,0x01,0x91,0x06,0x01,0x70,0x06,0x80,0x06,0x02,0x06,0x01,0x00,0x2f,0x33,0x5d,0x5d,0x5d,0x2f,0xd4,0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8, -0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x05,0x1e,0x9c,0xfc,0x4a,0x03,0xb6,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x56,0x40,0x33,0xb7,0x06,0x01,0x03,0x06,0x04,0xb6,0x07,0x01,0x99,0x07,0x01,0x07,0x02,0x08,0x0a,0x05,0x04,0xb7,0x04,0x01,0xa8,0x04,0x01,0x04,0x05,0x08,0x93,0x06,0x01,0x86,0x06,0x01,0x77, -0x06,0x01,0x06,0x03,0x03,0x01,0xc6,0x02,0x01,0x48,0x02,0x58,0x02,0x02,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x5d,0x5d,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x5d,0x5d,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8, -0xfe,0x66,0x53,0x01,0x47,0x01,0x48,0x9c,0x05,0x0a,0xfe,0xcc,0x01,0x85,0x5f,0xfe,0xcc,0x01,0x34,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x18,0xaa,0x03,0x01,0x56,0x06,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12, -0x39,0x2f,0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x84,0x53,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0xb8,0x01,0x48,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07, -0x00,0x42,0x40,0x26,0x02,0x05,0x07,0x09,0x04,0x03,0xb6,0x03,0x01,0x03,0x04,0x06,0xc8,0x05,0x01,0x93,0x05,0x01,0x74,0x05,0x01,0x65,0x05,0x01,0x46,0x05,0x56,0x05,0x02,0x37,0x05,0x01,0x05,0x02,0x02,0x01,0x06,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde, -0xdd,0xc4,0x31,0x30,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x1e,0x53,0x02,0x8f,0x9c,0x02,0x8f,0x02,0xcc,0x5f,0xfd,0x8f,0x02,0x71,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x23,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0xb6,0x03,0x01,0x9b,0x03,0x01,0xa7,0x06,0x01, -0x56,0x06,0x01,0x03,0x06,0x02,0xb6,0x04,0x01,0x04,0x05,0x08,0x07,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x66,0x53, -0x01,0x9a,0xf5,0x9c,0x01,0x47,0x02,0x8f,0x01,0x85,0x5f,0xfe,0x7e,0xfe,0x0f,0x03,0x73,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x42,0x40,0x25,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0xb6,0x02,0x01,0x96,0x05,0x01,0x67,0x05,0x77,0x05,0x02,0x55,0x05,0x01,0x02,0x05,0x01,0xb6,0x03,0x01,0x03, -0x04,0x07,0x90,0x06,0x01,0x06,0x01,0x00,0x2f,0x33,0x5d,0x2f,0xc4,0x32,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x66,0x53,0x01,0xae,0xe1,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0x6a,0xfd,0x5e, -0x04,0x38,0x00,0x01,0x00,0x43,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0xb6,0x03,0x01,0x03,0x04,0x06,0x84,0x05,0x94,0x05,0x02,0x56,0x05,0x66,0x05,0x02,0x05,0x02,0x02,0x06,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x5d,0x33, -0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x65,0x53,0x01,0x48,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0xcc,0x01,0x34,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76,0x40,0x4a,0x68,0x07,0x01,0x88,0x04,0x01,0x83,0x03,0x01,0x77,0x03,0x01,0x58,0x03,0x68,0x03, -0x02,0x04,0x03,0x34,0x03,0x44,0x03,0x03,0x77,0x06,0x01,0x03,0x03,0x06,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0xc7,0x04,0x01,0x26,0x04,0x01,0x04,0x05,0x07,0x93,0x06,0xa3,0x06,0x02,0x02,0x83,0x06,0x01,0x74,0x06,0x01,0x27,0x06,0x01,0x06,0x03,0x03,0x01,0x7b,0x02,0x01,0x48,0x02,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0x33,0x5d,0x5d, -0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5f,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x47,0x01,0x48,0x9c,0x04,0xc4,0xfd,0xcb,0x02,0xe4, -0x47,0xfd,0xcb,0x02,0x35,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x40,0x86,0x03,0xc6,0x03,0xd6,0x03,0xe6,0x03,0x04,0x58,0x03,0x68,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x04,0x03,0x01,0x85,0x06,0x95,0x06,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0xb6,0x04,0x01,0x79,0x04,0x01, -0x04,0x05,0x08,0xa2,0x06,0x01,0x74,0x06,0x94,0x06,0x02,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37, -0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x61,0x01,0x2e,0x9c,0x03,0xd6,0xfe,0xb9,0x02,0xe4,0x47,0xfd,0xa0,0x01,0x40,0x01,0x20,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3e,0x40,0x22,0x9c,0x03,0x01,0x79,0x03,0x89,0x03,0x02,0xa6,0x06,0x01,0x57,0x06,0x67,0x06,0x02,0x03,0x06, -0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x7d,0x01,0x12, -0x9c,0x02,0x8f,0x02,0xe4,0x47,0xfd,0x71,0x02,0x8f,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x37,0xa3,0x06,0x01,0x02,0x9a,0x02,0xaa,0x02,0x02,0x7b,0x02,0x8b,0x02,0x02,0x68,0x02,0x01,0x5b,0x02,0x01,0x4a,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x91,0x06,0x01,0x85,0x06,0x01, -0x76,0x06,0x01,0x03,0x06,0x02,0x04,0x05,0x08,0x37,0x07,0x01,0x07,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x5d,0x10,0xc4,0x32,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03, -0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x97,0xf8,0x9c,0x01,0x47,0x01,0x48,0x02,0xe4,0x47,0xfd,0x40,0xf9,0x03,0xb9,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x34,0x40,0x1d,0x01,0x04,0x06,0x08,0x03,0x02,0x02,0x03,0x05,0x93,0x04,0xa3,0x04,0x02,0x02,0x80,0x04,0x01,0x73,0x04,0x01,0x64,0x04,0x01, -0x56,0x04,0x01,0x04,0x00,0x00,0x2f,0x32,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x0a,0x67,0x02,0x8f,0x9c,0x05,0x73,0x47,0xfb,0x5b,0x04,0xa5,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x45, -0x40,0x29,0x88,0x03,0x98,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0xd0,0x03,0x02,0x03,0x26,0x03,0x01,0x03,0x04,0x06,0x90,0x05,0xa0,0x05,0x02,0x72,0x05,0x82,0x05,0x02,0x63,0x05,0x01,0x05,0x02,0x02,0x01,0x06,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd, -0xc4,0x31,0x30,0x00,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x67,0x01,0x48,0x9c,0x02,0x8f,0x02,0xe4,0x47,0xfd,0xd5,0x02,0x2b,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x7a,0x40,0x4d,0x29,0x07,0x01,0x89,0x04,0xa9,0x04,0x02,0x75,0x03,0x85,0x03,0x02,0x68,0x03,0x01, -0x45,0x03,0x01,0x36,0x03,0x01,0x2a,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x78,0x04,0x98,0x04,0x02,0x04,0x05,0x07,0xa3,0x06,0x01,0x02,0x90,0x06,0x01,0x81,0x06,0x01,0x74,0x06,0x01,0x06,0x03,0x03,0x01,0x7b,0x02,0x01,0x1c,0x02,0x01,0x0b,0x02,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f, -0x33,0x5d,0x5d,0x5d,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5f,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x47,0x01,0x48,0x9c,0x04,0x6a, -0xfc,0xdd,0x04,0x3c,0x37,0xfc,0xdd,0x03,0x23,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x75,0x40,0x49,0xa4,0x07,0x01,0x95,0x07,0x01,0x89,0x04,0x99,0x04,0xa9,0x04,0x03,0x78,0x04,0x01,0x85,0x02,0x01,0x76,0x02,0x01,0x84,0x03,0x01,0x35,0x03,0x45,0x03,0x75,0x03,0x03,0x03,0x06,0x03,0x16,0x03,0x02, -0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x94,0x06,0xa4,0x06,0x02,0x83,0x06,0x01,0x02,0x70,0x06,0x01,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x5f,0x5d,0x5d,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39, -0x5d,0x5f,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x51,0x01,0x3e,0x9c,0x03,0xd6,0xfd,0x71,0x04,0x3c,0x37,0xfc,0xc5,0x02,0x89,0xb2,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x64,0x40,0x3b, -0x36,0x03,0x46,0x03,0x02,0x17,0x03,0x01,0x04,0x03,0x01,0x91,0x06,0xa1,0x06,0x02,0xa9,0x04,0x01,0x9b,0x04,0x01,0x89,0x04,0x01,0x79,0x02,0x01,0x6c,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x72,0x06,0x82,0x06,0x02,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39, -0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x71,0x01,0x1e,0x9c,0x02,0x8f,0xfe,0xb8,0x04,0x3c,0x37, -0xfc,0x82,0x01,0x0d,0x02,0x71,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x25,0xa6,0x06,0x01,0x94,0x06,0x01,0x76,0x06,0x86,0x06,0x02,0xad,0x03,0x01,0x99,0x03,0x01,0x88,0x03,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f, -0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x96,0xf9,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfc,0x29,0x03,0xd7,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba, -0x00,0x08,0x00,0x55,0x40,0x35,0x74,0x06,0x01,0x56,0x06,0x01,0xa5,0x05,0x01,0x57,0x05,0x01,0xaa,0x03,0x01,0x99,0x03,0x01,0x8a,0x03,0x01,0xab,0x02,0x01,0x9c,0x02,0x01,0x8a,0x02,0x01,0x68,0x02,0x78,0x02,0x02,0x39,0x02,0x49,0x02,0x02,0x01,0x06,0x08,0x0a,0x04,0x03,0x03,0x04,0x02,0x05,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39, -0x39,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0xb4,0xdb,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfb,0xde,0xde,0x05,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a, -0x05,0xba,0x00,0x07,0x00,0x3b,0x40,0x20,0xa2,0x05,0x01,0x95,0x05,0x01,0x82,0x05,0x01,0x77,0x05,0x01,0xa9,0x03,0x01,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x03,0x04,0x06,0x05,0x02,0x02,0x06,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d, -0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x67,0x01,0x48,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfc,0xc9,0x03,0x37,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x7c,0x40,0x50,0x89,0x06,0x01,0x76,0x06,0x01,0xca,0x03,0x01,0x97,0x03,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x35,0x03, -0x45,0x03,0x02,0x28,0x03,0x01,0x15,0x03,0x01,0x07,0x03,0x01,0x47,0x06,0x01,0x9b,0x04,0xab,0x04,0x02,0x89,0x04,0x01,0x7a,0x04,0x01,0x10,0x04,0x01,0x48,0x02,0x01,0x03,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x04,0x05,0x02,0x07,0xa3,0x06,0x01,0x02,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32, -0x5d,0x5f,0x5d,0x2f,0x33,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x76,0x01,0x4d,0x01,0x48,0x9c,0x04,0x10,0xfb,0xf0, -0x05,0x8c,0x2e,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8c,0x40,0x59,0x8a,0x06,0x01,0x76,0x06,0x01,0xa8,0x04,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x58,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x28,0x03,0x01,0x15,0x03,0x01,0x03,0x07,0x03,0x01,0xa3,0x06,0x01,0x02,0x90,0x06,0x01, -0x82,0x06,0x01,0xaa,0x04,0x01,0x03,0x79,0x04,0x89,0x04,0x99,0x04,0x03,0x14,0x04,0x01,0x9a,0x02,0xaa,0x02,0x02,0x22,0x02,0x01,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x09,0x07,0x02,0x02,0x01,0x09,0x70,0x06,0x01,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32,0x5d,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f, -0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x79,0x01,0x55,0x01,0x3d,0x9c,0x03,0xd6,0xfc,0x2a,0x05,0x8c,0x2e, -0xfb,0xc9,0x03,0xb7,0x80,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x7a,0x40,0x4b,0x76,0x06,0x01,0x07,0x06,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x03,0x06,0x03,0x16,0x03,0x02,0xa7,0x07,0x01,0x93,0x06,0xa3,0x06,0x02,0x02,0x82,0x06,0x01,0xab,0x04,0x01,0x9a,0x04,0x01,0x03, -0x02,0x04,0x01,0x02,0x7b,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x07,0x02,0x02,0x00,0x08,0x70,0x06,0x01,0x54,0x06,0x01,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x5d,0x5d,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5f,0x5d,0x5f, -0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x76,0x01,0x69,0x01,0x2c,0x9c,0x02,0x8f,0xfd,0x71,0x05,0x8c,0x2e,0xfb,0x90,0x02,0x6d,0x02,0x03,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x60, -0x40,0x39,0xa6,0x06,0x01,0x94,0x06,0x01,0x97,0x05,0x01,0x36,0x03,0x46,0x03,0x02,0x17,0x03,0x01,0x06,0x03,0x01,0x90,0x06,0xa0,0x06,0x02,0x82,0x06,0x01,0x71,0x06,0x01,0xab,0x04,0x01,0x89,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x07,0x02,0x02,0x00,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f, -0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x79,0x01,0x81,0x01,0x11,0x9c,0x01,0x47,0xfe,0xb9,0x05,0x8c,0x2e,0xfb,0x43, -0x01,0x04,0x03,0xb9,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0x94,0x04,0x01,0x76,0x04,0x86,0x04,0x02,0xa6,0x03,0x01,0x97,0x03,0x01,0xa9,0x01,0x01,0x01,0x04,0x02,0x06,0x07,0x09,0x03,0x02,0x02,0x03,0x06,0x05,0x00,0x00,0x2f,0xcd,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39, -0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x3d,0x79,0x01,0xa1,0xf1,0x9c,0x05,0x8c,0x2e,0xfa,0xe2,0x05,0x1e,0x00,0x01,0x00,0x1a,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x46,0x40,0x29,0x78,0x01,0x01,0x03,0x07,0x01,0x01,0xa4,0x04,0x01,0x83,0x04,0x93,0x04, -0x02,0x02,0xab,0x02,0x01,0x89,0x02,0x99,0x02,0x02,0x04,0x02,0x01,0x01,0x04,0x06,0x08,0x03,0x00,0x02,0x01,0x02,0x02,0x03,0x05,0x04,0x00,0x00,0x2f,0x32,0x2f,0xc4,0x32,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c, -0xfe,0x3c,0x74,0x01,0x50,0x9c,0x05,0x8c,0x2e,0xfb,0xdc,0x04,0x24,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x2c,0x40,0x15,0xab,0x06,0x01,0x58,0x06,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde, -0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb5,0x51,0x01,0x7e,0x02,0x01,0x05,0x1e,0xfe,0xb8,0x6b,0x01,0x79,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4f,0x40,0x2d,0x93,0x07,0x01,0x47,0x07,0x57,0x07,0x02,0xa6,0x05,0x01,0x9b, -0x03,0x01,0x89,0x03,0x01,0x78,0x03,0x01,0xb6,0x02,0xc6,0x02,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x04,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb0,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x03,0xd6,0x01,0x34,0xfe,0xcc,0x6b,0x01,0x79,0xfe,0xcc,0x01,0x34,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4b,0x40,0x28,0xbb,0x07,0xcb,0x07,0x02,0x76,0x07,0x01,0x67,0x07, -0x01,0xa6,0x05,0x01,0x9b,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21, -0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa5,0xfe,0xc0,0x48,0x01,0x9b,0x01,0x48,0x9c,0x02,0x8f,0x02,0x6a,0xfe,0xdd,0x6b,0x01,0x79,0xfd,0xc1,0x02,0x3f,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x54,0x40,0x2e,0x28,0x06,0x01,0x19,0x06,0x01,0x0b,0x06,0x01,0xcf,0x07,0x01, -0xbb,0x07,0x01,0xa6,0x05,0x01,0xa9,0x03,0x01,0x9b,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d, -0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x8e,0xfe,0xda,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x01,0x47,0x03,0x95,0xfe,0xfa,0x6b,0x01,0x79,0xfc,0xd3,0x03,0x2d,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x39,0x88,0x05,0x01,0x29,0x05,0x01, -0x0b,0x05,0x01,0x79,0x02,0x89,0x02,0x02,0x38,0x02,0x48,0x02,0x68,0x02,0x03,0xed,0x06,0x01,0xdb,0x06,0x01,0xcf,0x06,0x01,0xa6,0x04,0x01,0xad,0x02,0x01,0x9b,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x07,0x04,0x03,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33, -0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x05,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x81,0xfe,0xe7,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x04,0xce,0xf8,0x6b,0x01,0x79,0xfb,0xe6,0x04,0x1a,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba, -0x00,0x06,0x00,0x35,0x40,0x1c,0xa6,0x04,0x01,0x9b,0x02,0x01,0x8a,0x02,0x01,0x69,0x02,0x01,0x58,0x02,0x01,0x05,0x02,0x06,0x08,0x03,0x04,0x04,0x03,0x03,0x01,0x02,0x06,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33, -0x02,0x7a,0x9c,0xfe,0xaf,0x4b,0x01,0x9c,0x9c,0x05,0x14,0xfe,0xc2,0x6b,0x01,0x79,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x42,0x40,0x25,0x59,0x07,0x99,0x07,0x02,0x9a,0x06,0x01,0x88,0x06,0x01,0x79,0x06,0x01,0x38,0x06,0x48,0x06,0x02,0x18,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x04,0x05,0x03, -0x03,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x05,0x00,0xfe,0xd6,0x9c,0x01,0x48,0x00,0x01,0x00,0x96, -0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x24,0x38,0x03,0x48,0x03,0x02,0x92,0x07,0xa2,0x07,0x02,0x65,0x07,0x75,0x07,0x02,0x88,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x05,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x10,0xde,0xdd, -0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x02,0x8f,0x01,0x47,0x9c,0xfe,0xd7,0x02,0x71,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x23,0x97,0x06,0xa7,0x06, -0x02,0xa3,0x07,0x01,0x82,0x07,0x92,0x07,0x02,0x73,0x07,0x01,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x05,0x03,0x02,0x03,0x02,0x03,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01, -0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x01,0x47,0x02,0x8f,0x9c,0xfe,0x07,0x03,0x41,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x46,0x40,0x28,0x94,0x05,0xa4,0x05,0x02,0x76,0x05,0x01,0x38,0x01,0x48,0x01,0x02,0x03,0xa4,0x06,0x01,0x93,0x06,0x01,0x02,0x70, -0x06,0x80,0x06,0x02,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5f,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1, -0xee,0x9c,0x03,0xd6,0x9c,0xfd,0x38,0x04,0x10,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x55,0x40,0x31,0x84,0x06,0x94,0x06,0x02,0x47,0x06,0x01,0x47,0x05,0x01,0x08,0x05,0x01,0x89,0x04,0xa9,0x04,0x02,0x9b,0x02,0x01,0x7a,0x02,0x01,0x69,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x06, -0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x2e, -0x01,0x61,0x9c,0x04,0xc4,0xfd,0xcb,0x01,0x9c,0x6f,0xfe,0xc0,0x02,0x60,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x36,0xba,0x07,0x01,0xb8,0x06,0x01,0x84,0x06,0x94,0x06,0xa4,0x06,0x03,0xa2,0x05,0x01,0x93,0x05,0x01,0x86,0x05,0x01,0x47,0x05,0x01,0x08,0x05,0x01,0x59,0x02,0x01,0x06,0x03,0x04, -0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x02,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4,0x32,0x11,0x33,0x01,0x2f,0x32,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01, -0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x51,0x01,0x4a,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0x01,0x9c,0x5e,0xfe,0xb6,0x01,0x47,0x01,0x34,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x37,0x40,0x1b,0xa3,0x05,0x01,0x86,0x05,0x01,0x08,0x05,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04, -0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x83,0x51,0x01,0x4a,0x01,0x48,0x9c,0x02,0x8f,0x01,0x9c,0x62,0xfe, -0x9e,0x02,0x8f,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x51,0x40,0x31,0x72,0x05,0x92,0x05,0x02,0x64,0x05,0x01,0x56,0x05,0x01,0x44,0x05,0x01,0x35,0x05,0x01,0x27,0x05,0x01,0x64,0x04,0x74,0x04,0x02,0x46,0x04,0x01,0x88,0x03,0xa8,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x03,0x05,0x02,0x04,0x03,0x02, -0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x1d,0x54,0x02,0x8f,0x9c,0x01,0x47,0x02,0xe4,0x65,0xfd,0x71,0x03,0xb9,0x00,0x00,0x01, -0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4d,0x40,0x2c,0x54,0x06,0x94,0x06,0xa4,0x06,0x03,0x08,0x04,0x01,0xa9,0x02,0x01,0x9a,0x02,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0x05,0x02,0x04,0x03,0x84,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x02,0x03,0x02,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39, -0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x4b,0x01,0xb7,0xe1,0x9c,0x02,0x8f,0x01,0x9c,0x64,0xfe,0x4e,0xfe,0x55,0x04,0x88,0x00,0x00,0x01,0x00,0x42,0x00,0x00, -0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x4f,0x40,0x30,0x94,0x05,0x01,0x75,0x05,0x01,0x46,0x05,0x56,0x05,0x66,0x05,0x03,0x56,0x04,0x76,0x04,0x02,0x47,0x04,0x01,0x08,0x04,0x01,0x88,0x03,0xa8,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f, -0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x48,0x01,0x54,0x9c,0x02,0x8f,0x01,0x9c,0x5d,0xfe,0xad,0x02,0x85,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76, -0x40,0x4a,0x86,0x06,0x01,0x77,0x06,0x01,0xc9,0x05,0x01,0x75,0x03,0x85,0x03,0xc5,0x03,0x03,0x68,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x28,0x03,0x01,0xa2,0x06,0x01,0x94,0x06,0x01,0xdb,0x05,0xfb,0x05,0x02,0xcc,0x05,0x01,0xc0,0x02,0x01,0x9c,0x02,0x01,0x8b,0x02,0x01,0x78,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04, -0x06,0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03, -0xc1,0x9c,0xfe,0xb9,0xfe,0x51,0x5d,0x01,0x48,0x01,0x51,0x9c,0x04,0x6a,0xfc,0xdd,0x03,0x47,0x3e,0xfd,0x77,0x03,0x77,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3d,0x85,0x06,0x01,0x76,0x06,0x01,0x85,0x03,0x01,0x74,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x29,0x03,0x01,0xa0,0x06,0x01,0x94, -0x06,0x01,0xcb,0x05,0xdb,0x05,0x02,0x8e,0x02,0x01,0x7a,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x07,0x02,0x05,0x04,0x03,0x02,0x04,0x04,0x02,0x03,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00, -0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x51,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0x03,0x47,0x3e,0xfd,0x71,0x02,0x8f,0xee,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5e,0x40,0x37, -0x76,0x06,0x01,0x76,0x03,0x01,0x37,0x03,0x47,0x03,0x02,0xa4,0x06,0x01,0x93,0x06,0x01,0x84,0x06,0x01,0xcb,0x05,0xdb,0x05,0x02,0xa6,0x05,0x01,0x6c,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x07,0x02,0x05,0x04,0x03,0x02,0x04,0x04,0x02,0x03,0x03,0x08,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11, -0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x6b,0x01,0x2e,0x9c,0x02,0x8f,0xfe,0xb8,0x03,0x47,0x3e,0xfd,0x46,0x01,0x41,0x02,0x67, -0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2f,0x40,0x15,0xa6,0x05,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x21,0x23,0x11, -0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x87,0x01,0x12,0x9c,0x01,0x47,0x03,0x4a,0x3b,0xfd,0x17,0x03,0xd7,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x71,0x40,0x46,0xa0,0x06,0x01,0x93,0x06,0x01,0x74,0x06,0x01,0x65,0x06,0x01,0x56,0x06,0x01,0xa1,0x05,0x01, -0x90,0x05,0x01,0x85,0x05,0x01,0x44,0x05,0x01,0x36,0x05,0x01,0xdb,0x04,0x01,0xc9,0x04,0x01,0x96,0x04,0xa6,0x04,0x02,0x77,0x04,0x01,0x94,0x02,0x01,0x88,0x02,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33, -0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0xa1,0xf8,0x9c,0x01,0x47,0x03,0x47,0x3e,0xfc,0xe6,0xf8,0x05,0x00,0x00,0x01,0x00,0x2f, -0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x54,0x40,0x32,0xfa,0x04,0x01,0xd9,0x04,0xe9,0x04,0x02,0x77,0x04,0x01,0xa2,0x05,0x01,0x91,0x05,0x01,0x80,0x05,0x01,0xcb,0x04,0x01,0xa7,0x04,0x01,0x94,0x04,0x01,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0xd0,0x03,0x02,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f, -0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x5d,0x01,0x52,0x9c,0x01,0x47,0x03,0x47,0x42,0xfd,0x77,0x03,0x73,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1, -0x05,0xba,0x00,0x08,0x00,0x62,0x40,0x3c,0x85,0x06,0x01,0x75,0x03,0x85,0x03,0x02,0x58,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x94,0x06,0xa4,0x06,0x02,0x76,0x06,0x86,0x06,0x02,0x9b,0x02,0x01,0x8c,0x02,0x01,0x02,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x01,0x02, -0x08,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x51,0x6a,0x01,0x3a,0x01,0x52,0x9c,0x04,0x10, -0xfb,0xf0,0x05,0x10,0x2a,0xfc,0x49,0x04,0x37,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x72,0x40,0x47,0x85,0x06,0x01,0x76,0x06,0x01,0xd8,0x05,0x01,0x75,0x03,0x85,0x03,0x02,0x58,0x03,0x01,0x34,0x03,0x44,0x03,0x02,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0xa0,0x06,0x01,0x92,0x06,0x01,0x70,0x06, -0x80,0x06,0x02,0xb9,0x05,0x01,0x7f,0x02,0x8f,0x02,0x02,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d, -0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x44,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x05,0x10,0x24,0xfc,0x3a,0x03,0xcc,0x80,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x78,0x40,0x4c,0xa7,0x06, -0x01,0x76,0x06,0x01,0xb8,0x05,0x01,0x8a,0x03,0x01,0x45,0x03,0x75,0x03,0x02,0x36,0x03,0x01,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0xa1,0x06,0x01,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x54,0x06,0x64,0x06,0x02,0x9e,0x02,0xae,0x02,0x02,0x8f,0x02,0x01,0x7d,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05, -0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1, -0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x5a,0x01,0x32,0x9c,0x02,0x8f,0xfd,0x71,0x05,0x10,0x2d,0xfc,0x19,0x02,0x6b,0x01,0xf9,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3e,0x57,0x06,0x01,0x76,0x05,0x01,0x79,0x03,0x89,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x07,0x03,0x17,0x03,0x02,0x92,0x06,0xa2, -0x06,0x02,0x84,0x06,0x01,0x75,0x06,0x01,0x9a,0x04,0xaa,0x04,0x02,0x8a,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30, -0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x7b,0x01,0x11,0x9c,0x01,0x47,0xfe,0xb9,0x05,0x10,0x2d,0xfb,0xc4,0x01,0x00,0x03,0xb9,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x34,0x40,0x1c, -0x86,0x04,0xa6,0x04,0x02,0x77,0x04,0x01,0x98,0x01,0xa8,0x01,0x02,0x01,0x04,0x02,0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x05,0x00,0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x52, -0x6a,0x01,0x9d,0xef,0x9c,0x05,0x10,0x2a,0xfb,0x62,0x05,0x1e,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x2e,0x40,0x18,0x01,0x04,0x06,0x08,0x03,0x04,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0xa3,0x04,0x01,0x02,0x80,0x04,0x90,0x04,0x02,0x04,0x00,0x00,0x2f,0x32,0x5d,0x5f,0x5d,0x2f,0x39,0x2f,0x33,0x01,0x2f, -0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x6a,0x01,0x45,0x9c,0x05,0x10,0x27,0xfc,0x23,0x04,0x60,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x3e,0x40,0x24,0x8b,0x06,0x9b,0x06,0xab,0x06,0x03,0x59,0x06,0x69,0x06,0x02,0xa5,0x04,0x01,0x86, -0x04,0x01,0x76,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb2,0x6a,0x01,0x5e,0x02,0x3d, -0x05,0x1e,0xfd,0x71,0x50,0x02,0xdb,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x74,0x40,0x47,0xc9,0x06,0x01,0x46,0x06,0x01,0x37,0x06,0x01,0xa6,0x04,0x01,0x95,0x04,0x01,0xc9,0x07,0x01,0x94,0x07,0x01,0x47,0x07,0x57,0x07,0x02,0xc6,0x03,0x01,0xb7,0x03,0x01,0xac,0x03,0x01,0x8b,0x03,0x9b,0x03,0x02, -0x7d,0x03,0x01,0x59,0x03,0x69,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x95,0x6a,0x01,0xb8,0x01,0x47,0x9c,0x03,0xd6,0x01,0x23,0xfd,0x99,0x4d,0x02,0xdb,0xfe,0xcc,0x01,0x34,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x78,0x40,0x4c,0xf9,0x06, -0x01,0x76,0x06,0x86,0x06,0xc6,0x06,0x03,0x45,0x06,0x01,0x34,0x06,0x01,0x2a,0x06,0x01,0xc7,0x03,0x01,0x74,0x07,0x94,0x07,0x02,0x66,0x07,0x01,0x45,0x07,0x01,0xa6,0x05,0x01,0x87,0x05,0x01,0x66,0x05,0x01,0x57,0x05,0x01,0x9f,0x03,0xaf,0x03,0x02,0x8b,0x03,0x01,0x7d,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03, -0x06,0x08,0x05,0x04,0x07,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1, -0x9c,0xfe,0xb8,0xfe,0xb3,0x6a,0x01,0xb7,0x01,0x48,0x9c,0x02,0x8f,0x02,0x35,0xfd,0xcb,0x50,0x02,0xdb,0xfd,0xcb,0x02,0x35,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x98,0x40,0x63,0xf5,0x06,0x01,0xc6,0x06,0x01,0x84,0x06,0x01,0x75,0x06,0x01,0x59,0x06,0x01,0x36,0x06,0x46,0x06,0x02,0x2a,0x06,0x01,0xf5, -0x03,0x01,0xc7,0x03,0x01,0x85,0x03,0x01,0x76,0x03,0x01,0xa6,0x07,0x01,0x90,0x07,0x01,0x74,0x07,0x84,0x07,0x02,0x6c,0x07,0x01,0x57,0x07,0x01,0x2b,0x07,0x01,0x94,0x05,0x01,0x66,0x05,0x86,0x05,0x02,0x54,0x05,0x01,0xad,0x03,0x01,0x7b,0x03,0x9b,0x03,0x02,0x69,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06, -0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23, -0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa2,0xfe,0xc9,0x6a,0x01,0xb7,0x01,0x48,0x9c,0x01,0x47,0x03,0x57,0xfd,0xf9,0x48,0x02,0xdb,0xfc,0xdd,0x03,0x23,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76,0x40,0x4b,0xc5,0x05,0x01,0x8b,0x05,0x01,0x7a,0x05,0x01,0x68,0x05,0x01,0x5a,0x05, -0x01,0x36,0x05,0x46,0x05,0x02,0x2a,0x05,0x01,0xc6,0x02,0x01,0x8b,0x02,0x01,0x7a,0x02,0x01,0x59,0x02,0x01,0xc9,0x06,0x01,0x90,0x06,0x01,0x84,0x04,0x94,0x04,0x02,0x9f,0x02,0xaf,0x02,0x02,0x8b,0x02,0x01,0x7e,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x07,0x04,0x03,0x03,0x07,0x06,0x00,0x00,0x2f,0x32, -0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x96,0xfe,0xd5,0x6a,0x01,0xb8,0x01,0x47,0x9c,0x04,0x81,0xfe,0x19, -0x45,0x02,0xdb,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x3d,0x40,0x23,0x87,0x04,0x97,0x04,0x02,0xac,0x02,0x01,0x02,0x8f,0x02,0x9f,0x02,0x02,0x6d,0x02,0x7d,0x02,0x02,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x03,0x01,0x02,0x06,0x01,0x00,0x2f,0x2f,0x33,0x12, -0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb2,0x6a,0x01,0xb8,0x9c,0x04,0xba,0xfd,0xd7,0x4e,0x02,0xdb,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x18,0x69,0x06,0x79,0x06,0x02,0x06, -0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb8,0x54,0x01,0x7e,0x01,0x65, -0x9c,0x03,0xd6,0xfe,0xbc,0x67,0x01,0x79,0x01,0x48,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5b,0x40,0x35,0xc9,0x07,0x01,0x65,0x07,0x75,0x07,0x02,0x47,0x07,0x01,0xb9,0x06,0x01,0x87,0x06,0x01,0x75,0x06,0x01,0x66,0x06,0x01,0xb9,0x05,0x01,0xa9,0x03,0x01,0x9b,0x02,0x01,0x06,0x03,0x05,0x02,0x07,0x09, -0x0b,0x04,0x05,0x05,0x04,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0xc6,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c, -0xfe,0xb8,0xfe,0xb9,0x54,0x01,0x9b,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfe,0xc9,0x5a,0x01,0x8d,0xfe,0xb9,0x02,0x7b,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x53,0x40,0x2f,0xcc,0x07,0x01,0x02,0xbc,0x07,0x01,0xbb,0x06,0x01,0x96,0x06,0x01,0x89,0x03,0x01,0x58,0x03,0x68,0x03,0x78,0x03,0x03,0x03, -0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01, -0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa5,0xfe,0xcc,0x54,0x01,0x9b,0x01,0x48,0x9c,0x01,0x47,0x02,0x8f,0xfe,0xc9,0x5a,0x01,0x9e,0xfd,0x9c,0x03,0x87,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x38,0x54,0x05,0x01,0x27,0x05,0x01,0x19,0x05,0x01,0xeb,0x06,0x01,0xdf,0x06,0x01,0xcd,0x06,0x01, -0xa2,0x06,0x01,0x64,0x06,0x74,0x06,0x94,0x06,0x03,0x1f,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x8f,0xfe,0xe2,0x54,0x01,0x9c,0x01,0x47,0x9c,0x03,0xd6,0xfe,0xc9,0x5a,0x01,0xd2,0xfc,0x85,0x04,0x6a,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x38,0x40,0x1e,0xf6,0x04,0x01,0xc7, -0x04,0x01,0x87,0x03,0xa7,0x03,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x54, -0x01,0x9c,0x9c,0x03,0xd6,0xfe,0xd2,0x51,0x01,0x83,0x01,0x3e,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3a,0x40,0x1f,0x96,0x03,0xa6,0x03,0x02,0xa9,0x02,0x01,0x8b,0x02,0x9b,0x02,0x02,0x7c,0x02,0x01,0x02,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x04,0x06,0x03,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39, -0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x47,0x01,0x48,0x9c,0x04,0x88,0xfe,0x07,0x9c,0x02,0x8f,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3d,0x40,0x20, -0x46,0x07,0x01,0x37,0x07,0x01,0x09,0x07,0x01,0x8b,0x02,0x01,0x09,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21, -0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0x9c,0x01,0x65,0x01,0x2a,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3b,0x40,0x1f,0xa6,0x07,0x01,0x95,0x07,0x01,0x46,0x07,0x01,0x34,0x07,0x01,0x78,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b, -0x04,0x05,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0x01,0x48,0x9c,0xfe,0xd6, -0x03,0xb9,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3e,0x40,0x23,0x74,0x05,0x01,0x89,0x02,0x99,0x02,0xa9,0x02,0x03,0x78,0x02,0x01,0x94,0x06,0xa4,0x06,0x02,0x53,0x06,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde, -0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x02,0x8f,0x9c,0xfe,0x07,0x04,0x88,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x49,0x40,0x28,0xa2,0x06,0x01,0x94,0x06,0x01, -0x46,0x06,0x01,0x92,0x05,0xa2,0x05,0x02,0x74,0x05,0x01,0x65,0x05,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x06,0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x1d,0x01,0x72,0x9c,0x04,0x74,0xfc,0xd3,0x01,0x9c,0x70,0xfe,0xd2,0x03,0x95,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x57,0x40,0x33,0xa0,0x06,0x01,0x92,0x06,0x01,0x44,0x06,0x74,0x06,0x84,0x06,0x03,0x92, -0x05,0xa2,0x05,0x02,0x76,0x05,0x01,0x65,0x05,0x01,0x37,0x05,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x07,0x02,0x03,0x04,0x02,0x02,0x04,0x03,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x2e,0x01,0x61,0x9c,0x03,0xd6,0xfd,0x71,0x01,0x9c,0x70,0xfe,0xd3,0x02,0xba,0xda,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x61,0x40,0x3b,0xa2,0x06,0x01,0x93,0x06,0x01, -0x87,0x06,0x01,0x64,0x06,0x74,0x06,0x02,0x46,0x06,0x01,0xa1,0x05,0x01,0x92,0x05,0x01,0x36,0x05,0x46,0x05,0x66,0x05,0x76,0x05,0x04,0xb7,0x02,0xd7,0x02,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x02,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4, -0x32,0x11,0x33,0x01,0x2f,0x32,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x51,0x01,0x3e,0x9c,0x02,0x8f,0xfe,0xb8,0x01,0x9c,0x70,0xfe,0xaa,0x01,0x42,0x02,0x7b,0x00,0x00,0x01, -0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3e,0x40,0x20,0xa2,0x05,0x01,0x94,0x05,0x01,0x96,0x05,0x01,0x67,0x05,0x77,0x05,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12, -0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x83,0x54,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0x01,0x9c,0x61,0xfe,0x9f,0x03,0xd7,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x42,0x40,0x28,0x98,0x01,0xa8,0x01,0x02,0x36, -0x04,0x46,0x04,0x56,0x04,0x03,0x27,0x04,0x01,0x46,0x03,0x01,0x37,0x03,0x01,0x68,0x02,0x78,0x02,0x88,0x02,0x03,0x01,0x04,0x06,0x08,0x03,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x37,0x01,0x11, -0x33,0x03,0xc1,0x9c,0xfd,0x1d,0x54,0x02,0x8f,0x9c,0x02,0xe3,0x66,0xfd,0x71,0x05,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x3b,0x40,0x21,0x85,0x05,0x01,0x48,0x03,0x58,0x03,0x68,0x03,0x98,0x03,0xa8,0x03,0x05,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02, -0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x54,0x01,0x48,0x9c,0x01,0x47,0x01,0x9c,0x52,0xfe,0xb8,0x03,0xcd,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba, -0x00,0x08,0x00,0x7c,0x40,0x4f,0x8a,0x06,0x01,0x29,0x06,0x79,0x06,0x02,0xf9,0x03,0x01,0xc5,0x03,0x01,0x7b,0x03,0x8b,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x29,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x93,0x06,0xa3,0x06,0x02,0x02,0x81,0x06,0x01,0x70,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x87,0x05,0x01,0x03,0x9b,0x02,0x01,0x20, -0x02,0x01,0x02,0x03,0x06,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x00,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x48,0x70,0x01,0x2c,0x01,0x63,0x9c,0x04,0x10,0xfb,0xf0,0x03,0x6e,0x49,0xfd,0x93,0x04,0x70,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8e,0x40,0x5c,0xc5,0x06,0x01,0x89,0x06,0x01,0x56,0x06,0x76,0x06,0x02,0x29,0x06,0x01, -0xf9,0x03,0x01,0xc5,0x03,0x01,0x8b,0x03,0x01,0x36,0x03,0x46,0x03,0x76,0x03,0x03,0x29,0x03,0x01,0x17,0x03,0x01,0x03,0x07,0x03,0x01,0x77,0x07,0x01,0xa4,0x06,0x01,0x92,0x06,0x01,0x02,0x70,0x06,0x80,0x06,0x02,0x64,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0x86,0x05,0x01,0x8a,0x04,0x01,0x03,0x23,0x02,0x01,0x02,0x06,0x03,0x04, -0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x02,0x04,0x02,0x00,0x09,0x03,0x00,0x00,0x2f,0xc4,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23, -0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x48,0x70,0x01,0x32,0x01,0x5d,0x9c,0x03,0xd6,0xfc,0x2a,0x03,0x6e,0x4c,0xfd,0x9c,0x03,0xee,0x76,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x7c,0x40,0x4f,0x76,0x06,0x86,0x06,0x02,0xf9,0x03,0x01,0x85,0x03,0xc5,0x03,0x02,0x74, -0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x07,0x03,0x17,0x03,0x02,0xa1,0x06,0x01,0x80,0x06,0x90,0x06,0x02,0x74,0x06,0x01,0x55,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0xae,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x7b,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03, -0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x49,0x70,0x01,0x47, -0x01,0x48,0x9c,0x02,0x8f,0xfd,0x71,0x03,0x6e,0x52,0xfd,0x59,0x02,0xad,0x01,0xf4,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5c,0x40,0x36,0x57,0x06,0x01,0x07,0x03,0x17,0x03,0x37,0x03,0x47,0x03,0x04,0xa2,0x06,0x01,0x80,0x06,0x90,0x06,0x02,0x72,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0x89,0x02,0x01, -0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37, -0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x49,0x70,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0xfe,0xb9,0x03,0x6e,0x49,0xfd,0x2e,0x01,0x3a,0x03,0x9b,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0xa5,0x03,0x01,0x84,0x03,0x94,0x03,0x02,0x59,0x01,0x79,0x01,0xa9,0x01,0x03,0x01,0x04,0x02, -0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x05,0x00,0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x49,0x70,0x01,0x91,0xfe,0x9c,0x03,0x6e,0x49,0xfc,0xe5,0x05,0x1e,0x00,0x01,0x00,0x26, -0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x46,0x40,0x2c,0x84,0x03,0x94,0x03,0xa4,0x03,0x03,0x80,0x04,0x90,0x04,0xa0,0x04,0x03,0x72,0x04,0x01,0x64,0x04,0x01,0x46,0x04,0x01,0x64,0x03,0x74,0x03,0x84,0x03,0x03,0x01,0x04,0x06,0x08,0x00,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01, -0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x48,0x70,0x01,0x48,0x9c,0x03,0x6e,0x4f,0xfd,0x57,0x04,0xa6,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x48,0x40,0x2b,0x9d,0x06,0xad,0x06,0x02,0x8b,0x06,0x01, -0x79,0x06,0x01,0x94,0x04,0xa4,0x04,0x02,0x86,0x04,0x01,0x75,0x04,0x01,0x57,0x04,0x01,0x67,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x00,0x02,0x07,0x00,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23, -0x11,0x23,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xef,0xfe,0x60,0x73,0x01,0xba,0x01,0xe4,0x05,0x1e,0xfc,0x29,0x48,0x04,0x2b,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x72,0x40,0x48,0x36,0x06,0x01,0x07,0x06,0x17,0x06,0x02,0x96,0x03,0xa6,0x03,0x02,0x90,0x07,0x01,0x55,0x07,0x01,0x36,0x07,0x01,0xa4,0x05, -0x01,0x92,0x05,0x01,0x74,0x05,0x84,0x05,0x02,0x8f,0x03,0x9f,0x03,0xaf,0x03,0x03,0x7d,0x03,0x01,0x4b,0x03,0x5b,0x03,0x6b,0x03,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f, -0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x25,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xef,0xfe,0x82,0x73,0x01,0xba,0x01,0x48,0x9c,0x03,0xd6,0xe3,0xfc,0x8e,0x41,0x04,0x32,0xfe,0xea,0x01,0x16,0x00,0x00,0x01,0x00,0x23, -0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x74,0x40,0x4a,0x79,0x06,0x89,0x06,0x02,0x44,0x06,0x01,0x33,0x06,0x01,0x07,0x06,0x17,0x06,0x02,0x79,0x03,0x89,0x03,0x02,0x45,0x03,0x01,0x36,0x03,0x01,0x74,0x07,0xa4,0x07,0x02,0x45,0x07,0x55,0x07,0x65,0x07,0x03,0x94,0x05,0xa4,0x05,0x02,0x9f,0x03,0xaf,0x03,0x02,0x89,0x03,0x01, -0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23, -0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcb,0xfe,0xa6,0x73,0x01,0xba,0x01,0x48,0x9c,0x02,0x8f,0x02,0x02,0xfc,0xb6,0x3b,0x04,0x38,0xfd,0xe9,0x02,0x17,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x92,0x40,0x5f,0xf9,0x06,0x01,0xca,0x06,0x01,0x75,0x06,0x85,0x06,0x02,0x36,0x06,0x46, -0x06,0x02,0x07,0x06,0x17,0x06,0x02,0x76,0x03,0x86,0x03,0x02,0x90,0x07,0x01,0x72,0x07,0x82,0x07,0x02,0x2d,0x07,0x01,0x13,0x07,0x01,0x03,0x06,0x07,0x01,0xa7,0x05,0x01,0x95,0x05,0x01,0x86,0x05,0x01,0x77,0x05,0x01,0xac,0x03,0x01,0x02,0x8f,0x03,0x9f,0x03,0x02,0x6d,0x03,0x7d,0x03,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04, -0x05,0x5b,0x03,0x01,0x03,0x06,0x09,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x73,0x01,0xba,0x01,0x48,0x9c,0x01,0x47,0x03,0x05,0xfc,0xfb,0x3e,0x04,0x35,0xfc,0xdd,0x03,0x23,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x72,0x40,0x4b,0x07,0x05,0x01,0xf9,0x05,0x01,0x35,0x05,0x45,0x05, -0x75,0x05,0x85,0x05,0xc5,0x05,0x05,0x28,0x05,0x01,0x07,0x05,0x17,0x05,0x02,0x76,0x02,0x86,0x02,0x02,0x84,0x06,0x01,0x92,0x04,0xa2,0x04,0x02,0x84,0x04,0x01,0x76,0x04,0x01,0xae,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x5d,0x02,0x7d,0x02,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x08,0x04,0x03,0x03,0x08,0x06, -0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xae,0xfe,0xc3,0x73,0x01,0xbb,0x01,0x47,0x9c,0x04,0x37,0xfd,0x10, -0x3e,0x04,0x35,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x3e,0x40,0x22,0x67,0x03,0x01,0xa3,0x04,0x01,0xae,0x02,0x01,0x03,0x8b,0x02,0x9b,0x02,0x02,0x7c,0x02,0x01,0x02,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x03,0x02,0x06,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f, -0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x73,0x01,0xbb,0x9c,0x04,0x74,0xfc,0xd3,0x38,0x04,0x3b,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x61,0x40,0x3a,0x92,0x06,0x01,0x76, -0x06,0x86,0x06,0x02,0x67,0x06,0x01,0xa2,0x05,0x01,0x93,0x05,0x01,0x86,0x05,0x01,0x74,0x05,0x01,0xaf,0x03,0x01,0x99,0x03,0x01,0x8b,0x03,0x01,0x78,0x03,0x01,0x5b,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x05,0x04,0x06,0x03,0x04,0x03,0x04,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33, -0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x67,0x01,0xae,0x01,0x48,0x9c,0x04,0xf6,0xfe,0xe0,0xfd,0x71,0x51,0x02,0xbd,0x01,0x65,0x00,0x00,0x01,0x00,0x2f, -0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x26,0xaf,0x06,0x01,0x9b,0x06,0x01,0x7a,0x06,0x8a,0x06,0x02,0x95,0x04,0x01,0x57,0x03,0x67,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33, -0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xee,0xfe,0x83,0x67,0x01,0xae,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0x4e,0x02,0xdd,0x01,0x48,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3d,0x49,0x06, -0x01,0x38,0x06,0x01,0x07,0x06,0x01,0xa0,0x07,0x01,0x91,0x07,0x01,0x74,0x07,0x01,0x65,0x07,0x01,0x94,0x06,0xa4,0x06,0x02,0x99,0x03,0xa9,0x03,0x02,0x8a,0x03,0x01,0x78,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x07,0x02,0x06,0x03,0x04,0x02,0x03,0x03,0x02,0x04,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39, -0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd2,0xfe,0x9f,0x67,0x01,0xae,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfd,0x71,0x41, -0x03,0x19,0xfe,0xa8,0x02,0x71,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4b,0x40,0x2a,0x84,0x07,0xa4,0x07,0x02,0x76,0x07,0x01,0xa1,0x06,0x01,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00, -0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x67,0x01,0xae,0x01,0x48,0x9c,0x01,0x47,0x02,0x8f,0xfd,0x71,0x32,0x03,0x67,0xfd, -0x5d,0x03,0x7d,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4b,0x40,0x2a,0xa6,0x06,0x01,0x74,0x06,0x84,0x06,0x02,0x93,0x05,0xa3,0x05,0x02,0x02,0x70,0x05,0x80,0x05,0x02,0x64,0x05,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f, -0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa3,0xfe,0xce,0x67,0x01,0xaf,0x01,0x47,0x9c,0x03,0xd6,0xfd,0x71,0x41,0x03,0x9a,0xfc,0x4c,0x04,0x4c,0x00,0x01, -0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x45,0x40,0x28,0x94,0x04,0xa4,0x04,0x02,0x86,0x04,0x01,0x9f,0x02,0xaf,0x02,0x02,0x8d,0x02,0x01,0x6a,0x02,0x7a,0x02,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11, -0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x35,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x67,0x01,0xaf,0x9c,0x03,0xd6,0xfd,0x71,0x44,0x03,0x7d,0xb2,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5f,0x40,0x39,0x92,0x06,0xa2,0x06,0x02,0x84, -0x06,0x01,0x67,0x06,0x77,0x06,0x02,0x46,0x06,0x01,0x37,0x06,0x01,0xa6,0x05,0x01,0x94,0x05,0x01,0x58,0x03,0x01,0xaf,0x02,0x01,0x9d,0x02,0x01,0x8b,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x05,0x04,0x06,0x03,0x04,0x03,0x04,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01, -0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xff,0xfe,0x70,0x4b,0x01,0x7d,0x01,0x5d,0x9c,0x04,0x88,0xfe,0x07,0xfe,0xb8,0x73,0x01,0x40,0x02,0xc0,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1, -0x05,0xba,0x00,0x07,0x00,0x33,0x40,0x19,0xb9,0x05,0x01,0x65,0x05,0x01,0x56,0x05,0x01,0x02,0x05,0x07,0x09,0x03,0x04,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11, -0x33,0x03,0xc1,0x9c,0xfd,0x71,0x4b,0x02,0xda,0x9c,0x03,0xd6,0xfd,0x71,0x6d,0x02,0xdc,0x01,0x2a,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x30,0x40,0x16,0x88,0x06,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f, -0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x4b,0x01,0x7e,0x01,0x5c,0x9c,0x02,0x8f,0xfe,0xb8,0x67,0x01,0x7d,0x02,0x8f,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x53, -0x40,0x2f,0x84,0x07,0x01,0x56,0x07,0x01,0x47,0x07,0x01,0x84,0x06,0x01,0x77,0x06,0x01,0xb9,0x05,0x01,0x99,0x03,0xa9,0x03,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01, -0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x4b,0x01,0x92,0x01,0x48,0x9c,0x01,0x47,0x01,0x48,0xfe,0xb8,0x63,0x01,0x95,0xfe,0xb8,0x03,0xc3,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1, -0x05,0xba,0x00,0x08,0x00,0x4d,0x40,0x2b,0xa2,0x06,0x01,0x94,0x06,0x01,0x85,0x06,0x01,0x57,0x06,0x01,0xa2,0x05,0x01,0x74,0x05,0x94,0x05,0x02,0xa4,0x04,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01, -0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9f,0xfe,0xd2,0x4b,0x01,0x93,0x01,0x47,0x9c,0x02,0x8f,0xfe,0xb8,0x70,0x01,0xa3,0xfd,0x9c,0x04,0xc4,0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07, -0x00,0x3f,0x40,0x23,0xe9,0x05,0x01,0xbb,0x05,0xcb,0x05,0x02,0xb9,0x04,0xe9,0x04,0x02,0x79,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d, -0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x4b,0x01,0x93,0x9c,0x02,0x8f,0xfe,0xb8,0x5a,0x01,0x94,0x02,0x85,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3a,0x40,0x1f,0x38,0x07,0x01,0x9b,0x06,0xab,0x06,0x02,0x9f,0x02,0x01,0x8b,0x02,0x01,0x7c,0x02,0x01,0x06,0x03,0x04, -0x07,0x02,0x08,0x0a,0x04,0x06,0x03,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x47,0x01,0x48,0x9c,0x04,0x10,0xfd,0x37,0x9c,0x03,0xd7,0x00, -0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x28,0x40,0x11,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x06,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x35,0x33, -0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x01,0x51,0x01,0x3e,0x9c,0x03,0xd6,0xfd,0x71,0x9c,0x03,0x39,0x9e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x41,0x40,0x23,0x65,0x07,0x01,0x37,0x07,0x01,0x18,0x07,0x01,0x7a,0x02,0x01,0x48,0x02,0x01,0x19,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x05,0x07, -0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x02,0x8f,0xfe,0xb8,0x9c,0x01,0x66, -0x02,0x71,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3e,0x40,0x23,0x38,0x02,0x48,0x02,0x88,0x02,0x03,0xa2,0x06,0x01,0x93,0x06,0x01,0x65,0x06,0x75,0x06,0x02,0x56,0x06,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde, -0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0x9c,0xfe,0xd7,0x05,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4e,0x40,0x2d,0x68,0x06,0x78,0x06,0x02,0x46, -0x05,0x01,0x28,0x03,0xc8,0x03,0x02,0xa2,0x06,0x01,0x94,0x06,0x01,0x99,0x04,0xa9,0x04,0x02,0xab,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x00,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d, -0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x11,0x01,0x7e,0x9c,0x04,0x10,0xfb,0xf0,0x01,0x9b,0x66,0xfe,0xfc,0x04,0xbd,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x23,0x46,0x05,0x01,0x28,0x03,0xc8,0x03,0x02, -0x99,0x04,0xa9,0x04,0x02,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37, -0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x1d,0x01,0x72,0x9c,0x03,0xd6,0xfc,0x2a,0x01,0x9b,0x66,0xfe,0xe7,0x04,0x5c,0x76,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x48,0x40,0x25,0x47,0x05,0x01,0x28,0x03,0x01,0x93,0x06,0x01,0xa9,0x04,0x01,0x98,0x04,0x01,0x06,0x03,0x04, -0x02,0x07,0x09,0x0b,0x05,0x04,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1, -0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x34,0x01,0x5b,0x9c,0x02,0x8f,0xfd,0x71,0x01,0x9b,0x66,0xfe,0xca,0x02,0xc4,0x02,0x2b,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4d,0x40,0x2a,0xb9,0x07,0x01,0xb8,0x06,0x01,0x77,0x06,0x01,0x46,0x05,0x01,0x99,0x04,0xa9,0x04,0x02,0x8c,0x02,0x01,0x06,0x03,0x04,0x02, -0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c, -0xfe,0xb8,0xfe,0x65,0x54,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0xfe,0xb9,0x01,0x9b,0x66,0xfe,0xb9,0x01,0x47,0x03,0xb9,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x32,0x40,0x18,0xa7,0x04,0x01,0xab,0x02,0x01,0x9a,0x02,0x01,0x01,0x04,0x02,0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x04,0x00, -0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0xfd,0xff,0xfe,0x82,0x54,0x01,0x48,0x01,0x47,0x9c,0x01,0xa4,0x5d,0xfe,0x9b,0x05,0x1e,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06, -0x00,0x41,0x40,0x27,0x84,0x04,0x01,0x65,0x04,0x01,0xa9,0x02,0x01,0x78,0x02,0x98,0x02,0x02,0x59,0x02,0x01,0x28,0x02,0x38,0x02,0x48,0x02,0x03,0x01,0x04,0x06,0x08,0x03,0x00,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x54,0x01,0x48,0x9c,0x01,0x9b,0x66,0xfe,0xb9,0x05,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x3c,0x40,0x24,0xab,0x06,0x01,0x89,0x06,0x99,0x06,0x02,0x58,0x06,0x78,0x06,0x02,0x96,0x04,0xa6,0x04,0x02,0x77,0x04,0x87,0x04, -0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x02,0x07,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x23,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xf1,0xfe,0x62,0x7c,0x01,0xc3,0x01,0xe4,0x05,0x1e,0xfa,0xe2,0x2e,0x05,0x8c,0x00,0x01, -0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x6e,0x40,0x45,0x36,0x06,0x46,0x06,0x02,0x07,0x06,0x17,0x06,0x02,0xa6,0x03,0x01,0x57,0x03,0x01,0x91,0x07,0x01,0x55,0x07,0x01,0x36,0x07,0x46,0x07,0x02,0xa4,0x05,0x01,0x95,0x05,0x01,0x74,0x05,0x84,0x05,0x02,0xaf,0x03,0x01,0x8d,0x03,0x9d,0x03,0x02,0x7b,0x03,0x01,0x06, -0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x25,0x01,0x27, -0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xf1,0xfe,0x80,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x03,0xd6,0xf1,0xfb,0x39,0x2e,0x05,0x8c,0xfe,0xe0,0x01,0x20,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x70,0x40,0x48,0x79,0x06,0x89,0x06,0xc9,0x06,0x03,0x36,0x06,0x46,0x06,0x02,0x07,0x06,0x17,0x06,0x02,0x78, -0x03,0x01,0x41,0x07,0x01,0x32,0x07,0x01,0xa2,0x05,0x01,0x84,0x05,0x94,0x05,0x02,0x76,0x05,0x01,0x9f,0x03,0xaf,0x03,0x02,0x5d,0x03,0x6d,0x03,0x7d,0x03,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x8d,0x03,0x01,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10, -0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd8,0xfe,0x99,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x02,0x8f,0x01,0xed,0xfb,0x84,0x2e,0x05,0x8c,0xfd,0xdf,0x02,0x21, -0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8c,0x40,0x5b,0xf9,0x06,0x01,0xca,0x06,0x01,0x89,0x06,0x01,0x75,0x06,0x01,0x16,0x06,0x36,0x06,0x46,0x06,0x03,0x05,0x06,0x01,0x89,0x03,0x01,0x75,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0xa4,0x07,0x01,0x72,0x07,0x01,0x2b,0x07,0x01,0x14,0x07,0x01,0x07,0x07,0x01, -0x03,0xa5,0x05,0x01,0x86,0x05,0x96,0x05,0x02,0xac,0x03,0x01,0x02,0x8f,0x03,0x9f,0x03,0x02,0x5d,0x03,0x7d,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39, -0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xc7,0xfe,0xaa,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x01,0x47,0x02,0xf8,0xfb,0xc1,0x2e,0x05,0x8c,0xfc,0xd3,0x03,0x2d,0x00,0x01, -0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x80,0x40,0x53,0xf9,0x05,0x01,0x8a,0x05,0xca,0x05,0x02,0x35,0x05,0x45,0x05,0x75,0x05,0x03,0x28,0x05,0x01,0x16,0x05,0x01,0x07,0x05,0x01,0xc9,0x02,0x01,0x88,0x02,0x01,0x76,0x02,0x01,0x94,0x06,0x01,0x47,0x06,0x01,0x15,0x06,0x01,0x03,0xa5,0x04,0x01,0x96,0x04,0x01,0x85, -0x04,0x01,0x9b,0x02,0xab,0x02,0x02,0x8c,0x02,0x01,0x02,0x7f,0x02,0x01,0x5b,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d, -0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x04,0x10,0xfb,0xf0,0x2e,0x05,0x8c,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x36,0x40,0x1f,0x77,0x03, -0x01,0x84,0x04,0x94,0x04,0xa4,0x04,0x03,0x8f,0x02,0x9f,0x02,0xaf,0x02,0x03,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x02,0x06,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x7c,0x01, -0xc4,0x9c,0x04,0x24,0xfb,0xdc,0x2e,0x05,0x8c,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x49,0x40,0x2a,0xa5,0x06,0x01,0x86,0x06,0x96,0x06,0x02,0x57,0x06,0x01,0x6b,0x03,0x7b,0x03,0xab,0x03,0x03,0x59,0x03,0x01,0xab,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x06,0x03,0x03,0x00,0x02, -0x08,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xdb,0xfe,0x4c,0x72,0x01,0xb9,0x01,0x48,0x9c,0x04,0xf6,0xfe,0xe0,0xfc,0x2a,0x32,0x03,0xf5,0x01, -0x93,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x30,0x40,0x18,0x89,0x06,0x99,0x06,0xa9,0x06,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d, -0x21,0x23,0x11,0x23,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xf9,0xfe,0x6a,0x72,0x01,0xb9,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x04,0x40,0x01,0x48,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x57,0x40,0x33,0xb8,0x07,0x01,0x64,0x07,0x74,0x07,0x02,0xa0,0x06,0x01,0x74,0x06,0x84,0x06,0x94, -0x06,0x03,0x66,0x06,0x01,0xa2,0x05,0x01,0x84,0x05,0x94,0x05,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xe2,0xfe,0x8f,0x72,0x01,0xb9,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfc,0x2a,0x32,0x04,0x99,0xfe,0x88,0x02,0x67,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3c,0x79,0x06,0x01,0x46,0x06,0x01, -0x15,0x06,0x35,0x06,0x02,0x03,0x07,0x06,0x01,0xa4,0x07,0x01,0x93,0x06,0xa3,0x06,0x02,0x02,0x80,0x06,0x01,0x74,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x87,0x05,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f, -0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd9,0xfe,0x98,0x72,0x01,0xc3,0x01,0x3e,0x9c,0x01,0x47,0x02,0x8f,0xfc,0x2a,0x32,0x04,0xf8,0xfd,0x45, -0x03,0x4b,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x37,0x46,0x05,0x01,0x34,0x05,0x01,0x15,0x05,0x01,0x03,0xa6,0x06,0x01,0xa2,0x05,0x01,0x93,0x05,0x01,0x02,0x80,0x05,0x01,0x74,0x05,0x01,0xa4,0x04,0x01,0x92,0x04,0x01,0x74,0x04,0x84,0x04,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04, -0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe,0xa5,0x72,0x01, -0xcd,0x01,0x34,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x05,0x1c,0xfc,0x20,0x04,0x4c,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x3e,0x40,0x24,0x67,0x03,0x77,0x03,0x02,0x84,0x04,0x94,0x04,0xa4,0x04,0x03,0x8f,0x02,0x9f,0x02,0xaf,0x02,0x03,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00, -0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x35,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x72,0x01,0xba,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x05,0x26,0x62,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba, -0x00,0x06,0x00,0x39,0x40,0x21,0xa2,0x04,0x01,0x95,0x04,0x01,0xad,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x7b,0x02,0x01,0x59,0x02,0x69,0x02,0x02,0x05,0x02,0x06,0x08,0x03,0x04,0x02,0x06,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11, -0x01,0x27,0x01,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x67,0x02,0xf6,0x9c,0x04,0xa5,0xfb,0x5b,0x4f,0x05,0x6b,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x38,0x96,0x06,0x01,0x87,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x76,0x05,0x86,0x05,0x02,0xad,0x03,0x01,0x8b,0x03,0x9b,0x03,0x02,0x59,0x03,0x69,0x03, -0x79,0x03,0x03,0x89,0x02,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21, -0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x67,0x01,0xae,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0xfd,0x71,0x4f,0x02,0xab,0x01,0xaa,0x01,0x16,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x26,0xab,0x06,0x01,0x9e,0x06,0x01,0x8b,0x06,0x01,0x58,0x06,0x01,0xa5,0x04, -0x01,0x75,0x03,0x01,0x67,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x03,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1, -0x9c,0xfe,0xee,0xfe,0x83,0x67,0x01,0xa4,0x01,0x52,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x02,0xdc,0x02,0x8f,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x67,0x40,0x3d,0x83,0x07,0x01,0x03,0x67,0x07,0x01,0x56,0x07,0x01,0xa3,0x06,0x01,0x02,0x90,0x06,0x01,0x74,0x06,0x84,0x06,0x02,0x56,0x06,0x01,0xa6,0x05,0x01, -0x94,0x05,0x01,0x76,0x05,0x86,0x05,0x02,0x68,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xf0,0xfe,0x81,0x67,0x01,0xd1,0x01,0x25,0x9c,0x01,0x47,0x01,0x48,0xfd,0x71,0x4f,0x03,0x1f,0xfe,0x9d,0x03,0xaf,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x64,0x40,0x3d,0x36,0x05, -0x46,0x05,0x02,0x27,0x02,0x01,0x54,0x06,0x84,0x06,0x02,0x15,0x06,0x01,0x07,0x06,0x01,0x03,0xa3,0x05,0x01,0x02,0x80,0x05,0x90,0x05,0x02,0x72,0x05,0x01,0x24,0x05,0x01,0x84,0x04,0x94,0x04,0x02,0xa9,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32, -0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe,0xa5,0x67,0x01,0xc5,0x01,0x31,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x03,0x54,0xfd,0x85,0x04, -0x92,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x48,0x40,0x29,0xa6,0x03,0x01,0xa3,0x05,0x01,0x02,0x80,0x05,0x90,0x05,0x02,0x74,0x05,0x01,0x66,0x05,0x01,0x9b,0x02,0x01,0x8a,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f, -0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x67,0x01,0xaf,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x03,0x54,0x02,0x17,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x41, -0x40,0x23,0xa2,0x06,0x01,0x96,0x06,0x01,0x57,0x06,0x67,0x06,0x02,0x9a,0x03,0x01,0x88,0x03,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x06,0x03,0x03,0x00,0x02,0x08,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d, -0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xe1,0xfe,0x52,0x48,0x01,0x95,0x01,0x42,0x9c,0x04,0x38,0xfd,0x0f,0xfe,0xb9,0x7b,0x01,0x32,0x04,0x0d,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x47,0x40,0x26,0xa2,0x06,0x01,0x94,0x06,0x01,0x99,0x03,0xa9,0x03,0x02,0x58,0x03,0x68, -0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x35, -0x33,0x03,0xc1,0x9c,0xf5,0xfe,0x66,0x48,0x01,0x8f,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0xfe,0xb9,0x7b,0x01,0x2e,0x03,0x73,0x9e,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x35,0x40,0x1c,0x46,0x05,0x66,0x05,0x02,0xa6,0x04,0x01,0x97,0x04,0x01,0x6b,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x04,0x05,0x02, -0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x48,0x02,0xd7,0x9c,0x02,0x8f,0xfd,0x71,0x7b,0x02,0xce,0x02,0x71,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1, -0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x19,0xa9,0x06,0x01,0x96,0x03,0xa6,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x03,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21, -0x11,0x33,0x03,0xc1,0x9c,0xfe,0xe0,0xfe,0x91,0x48,0x01,0x99,0x01,0x3e,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x68,0x03,0xd7,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4b,0x40,0x2b,0x74,0x06,0x01,0x53,0x06,0x01,0x36,0x06,0x01,0xbb,0x05,0x01,0x74,0x05,0x01,0x87,0x04,0x97,0x04,0xa7,0x04,0x03,0x69,0x02, -0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe, -0xa5,0x48,0x01,0xa7,0x01,0x30,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x7c,0xfe,0xcd,0x04,0xf6,0x00,0x01,0x00,0x4e,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x31,0x40,0x19,0xb9,0x05,0x01,0x97,0x04,0xa7,0x04,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f, -0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x48,0x01,0x90,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x86,0x03,0xb9,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x36,0x40,0x1d,0xa9,0x06,0x01,0x76, -0x03,0x86,0x03,0x02,0xad,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x05,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01, -0x47,0x01,0x48,0x9c,0x03,0xb6,0xfc,0x4a,0x9c,0x05,0x1e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2d,0x40,0x15,0x9b,0x02,0xab,0x02,0x02,0x06,0x03,0x04,0x07,0x02,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x05,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4, -0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xfe,0xfe,0x73,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x9c,0x04,0xd0,0x4e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2f,0x40,0x16,0xaf,0x02,0x01,0x99,0x02,0x01,0x06,0x03,0x04,0x02, -0x07,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x5b,0x01,0x34,0x9c,0x02,0x8f,0xfd,0x71,0x9c,0x03,0x61,0x01, -0xbd,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3b,0x40,0x1f,0x46,0x07,0x01,0x37,0x07,0x01,0x0b,0x07,0x01,0x8b,0x02,0x01,0x09,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4, -0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0xfe,0xb9,0x9c,0x01,0x65,0x03,0xb9,0x00,0x01,0xff,0x54,0x05,0xc2,0x02,0x6c,0x07,0x40,0x00,0x05,0x00,0x2c,0xb1,0x03,0x00,0xb8,0x01,0x35,0x40,0x16, -0x05,0x04,0x01,0x02,0x01,0x12,0x01,0x22,0x01,0x52,0x01,0x04,0x01,0x02,0x18,0x1a,0x1e,0x48,0x00,0x03,0x84,0x02,0x2f,0xe1,0xc6,0x2b,0x39,0x5d,0x11,0x33,0x00,0x2f,0xed,0xc4,0x31,0x30,0x01,0x20,0x03,0x23,0x12,0x21,0x02,0x6c,0xfe,0x44,0xba,0xa2,0xf0,0x02,0x28,0x06,0xc4,0xfe,0xfe,0x01,0x7e,0x00,0x00,0x01,0xff,0x54,0x05,0xc2, -0x02,0x6c,0x07,0x40,0x00,0x05,0x00,0x33,0xb2,0x00,0x80,0x03,0xb8,0x01,0x35,0x40,0x0f,0x04,0x05,0x02,0x0d,0x02,0x1d,0x02,0x2d,0x02,0x5d,0x02,0x04,0x02,0x03,0x01,0xb8,0xff,0xe8,0xb6,0x1a,0x1e,0x48,0x00,0x84,0x01,0x03,0x2f,0xd6,0xe1,0x2b,0x12,0x39,0x5d,0x11,0x33,0x00,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x23,0x02,0x21,0x35, -0x20,0x02,0x6c,0xa1,0xba,0xfe,0x43,0x02,0x28,0x05,0xc2,0x01,0x02,0x7c,0x00,0x01,0xfd,0xa7,0x05,0xc2,0x00,0xc0,0x06,0xfa,0x00,0x0b,0x00,0x22,0xb2,0x06,0x80,0x02,0xbb,0x01,0x35,0x00,0x09,0x00,0x00,0x01,0x35,0xb2,0x0b,0x0b,0x06,0xb9,0x01,0x34,0x00,0x05,0x2f,0xe1,0xc4,0x00,0x2f,0xed,0xd5,0xed,0x1a,0xcd,0x31,0x30,0x13,0x24, -0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x05,0xc0,0xfe,0xb3,0x8d,0x58,0x70,0x77,0x01,0xb4,0x88,0x93,0x01,0x49,0x06,0x16,0x67,0x6b,0x50,0x88,0xb0,0x66,0x00,0x00,0x01,0xff,0x68,0x05,0xc8,0x02,0x32,0x07,0x00,0x00,0x0b,0x00,0x22,0xb2,0x05,0x80,0x02,0xbe,0x01,0x35,0x00,0x09,0x00,0x0b,0x01,0x35,0x00,0x00,0x00,0x06,0x01, -0x34,0xb1,0x05,0x0b,0x2f,0xd4,0xe1,0x00,0x2f,0xfd,0xd5,0xed,0x1a,0xcc,0x31,0x30,0x03,0x04,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x27,0x98,0x01,0x00,0x8a,0x58,0x72,0x76,0x02,0xb6,0x86,0x8e,0xfe,0x06,0x94,0x50,0x6c,0x50,0x86,0xb2,0x4f,0x00,0x03,0x00,0x60,0xfe,0x1e,0x06,0x1c,0x05,0xec,0x00,0x22,0x00,0x2f,0x00,0x37, -0x01,0x5d,0x40,0x2c,0x30,0x31,0x18,0x00,0x22,0x06,0x01,0x37,0x01,0x19,0x31,0x18,0x05,0x22,0x06,0x04,0x1a,0x04,0x30,0x19,0x31,0x18,0x31,0x05,0x00,0x22,0x06,0x22,0x0b,0x01,0x01,0xbb,0x01,0xcb,0x01,0xdb,0x01,0xfb,0x01,0x04,0x37,0x01,0x36,0x04,0xb8,0xff,0xe8,0x40,0x33,0x09,0x13,0x48,0x1a,0x04,0x03,0x1b,0x0a,0x18,0x01,0xea, -0x18,0xfa,0x18,0x02,0x03,0x18,0x18,0x09,0x13,0x48,0x31,0x18,0x32,0x15,0x0d,0x06,0x01,0xed,0x06,0xfd,0x06,0x02,0x02,0x06,0x18,0x09,0x14,0x48,0x22,0x06,0x21,0x08,0x1b,0x96,0x36,0x36,0x38,0x32,0x95,0x21,0xb8,0xff,0xc0,0x40,0x4f,0x17,0x1c,0x48,0x21,0x21,0x38,0x03,0x1c,0x15,0x00,0x13,0x08,0x0b,0x27,0x95,0x11,0x10,0x2d,0x95, -0x0b,0x16,0xb5,0x37,0x01,0x0b,0x37,0x01,0xfb,0x37,0x01,0x37,0x20,0x09,0x16,0x48,0x37,0x01,0x34,0x02,0x5b,0x1a,0x01,0x1a,0x40,0x09,0x1d,0x48,0x1a,0x04,0x1e,0x03,0xa0,0x31,0x01,0x0b,0x31,0x01,0xeb,0x31,0xfb,0x31,0x02,0x44,0x31,0x01,0x31,0x18,0x34,0x16,0xa0,0x22,0x01,0xc3,0x22,0x01,0x22,0x1e,0x23,0x02,0xba,0x01,0x2c,0x00, -0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x23,0x34,0xb8,0x01,0x2c,0x40,0x14,0xa0,0x1e,0xd0,0x1e,0x02,0x1e,0x1e,0x16,0x84,0x15,0x06,0x07,0x15,0x03,0x23,0x23,0x39,0x2a,0x83,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0x17,0x33,0x10,0xf1,0xc0,0x2f,0x5d,0xe1,0x11,0x39,0x2f,0x2b,0x2b,0xe1,0x11, -0x12,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x71,0x5d,0x71,0x5d,0x11,0x12,0x39,0x39,0x2b,0x71,0x11,0x12,0x39,0x39,0x2b,0x5d,0x71,0x5d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x2b,0x5f,0x5d,0x71,0x11,0x12,0x39,0x39,0x2b,0x5f,0x5d,0x71,0x11,0x12,0x39, -0x39,0x2b,0x11,0x39,0x39,0x5d,0x71,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x04,0x38,0x0f,0x02,0x91,0x07,0x27,0x58,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x13,0x67,0x97,0x6f,0x8c,0xa2,0x80,0x70,0xfe,0xe2,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0x01,0x02,0x3c, -0x50,0x92,0x70,0x6a,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x9a,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfa,0x28,0x4e,0x41,0x7b,0x75,0x5c,0x5f,0x7e,0x03,0x7d,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0xfd,0xd2,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x03,0x56,0x05,0xec,0x00,0x15,0x00,0x1d,0x01,0x0f, -0x40,0x37,0x16,0x17,0x0b,0x00,0x15,0x06,0x01,0x1d,0x01,0x0c,0x17,0x0b,0x05,0x15,0x06,0x04,0x0d,0x04,0x16,0x0c,0x17,0x0b,0x17,0x05,0x00,0x15,0x06,0x15,0xbb,0x01,0xcb,0x01,0xdb,0x01,0x03,0x1d,0x01,0x1c,0x0d,0x0b,0x01,0xed,0x0b,0xfd,0x0b,0x02,0x0a,0x0b,0x01,0x0b,0x18,0x0e,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x1b,0x09,0x13, -0x48,0x0d,0x06,0x01,0xed,0x06,0xfd,0x06,0x02,0x04,0x06,0x0b,0x0d,0x04,0x03,0x0e,0x96,0x1c,0x1c,0x1e,0x17,0x18,0x95,0x15,0x14,0xb8,0xff,0xc0,0x40,0x34,0x17,0x1c,0x48,0x14,0x14,0x1e,0x03,0x08,0x00,0x03,0x1c,0xa0,0x17,0x01,0x15,0x17,0x01,0x17,0x0b,0x1a,0x0a,0xa0,0x15,0x01,0xc3,0x15,0x01,0x15,0x06,0x11,0x07,0xb5,0x1d,0x01, -0x1d,0x20,0x09,0x16,0x48,0x1d,0x01,0x1a,0x02,0x0d,0x40,0x09,0x1d,0x48,0x0d,0x04,0x11,0x02,0xba,0x01,0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x07,0x1a,0xb8,0x01,0x2c,0x40,0x0a,0xa0,0x11,0xd0,0x11,0x02,0x11,0x11,0x0a,0x84,0x07,0x2f,0xf1,0xc0,0x2f,0x5d,0xe1,0x12,0x39, -0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x00,0x3f,0x3f,0x11,0x12,0x39,0x2f,0x2b,0x33,0xed,0x32,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x5d,0x71,0x2b,0x2b,0x5d,0x5d,0x71,0x12,0x39,0x39,0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0, -0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x01,0x70,0x0e,0x02,0x91,0x07,0x28,0x58,0xa4,0x12,0x67,0x97,0x72,0x8a,0xa4,0x7f,0x6f,0x1c,0x3b, -0x50,0x91,0x6e,0x6b,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x05,0xd8,0xfa,0x28,0x4e,0x41,0x7b,0x76,0x5b,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x06,0x04,0x04,0x18,0x00,0x24,0x00,0x2c,0x01,0x33,0x40,0x4c,0x25,0x26,0x1a,0x00,0x24,0x06,0x01,0x2c,0x01,0x1b,0x26,0x1a,0x05,0x24,0x06,0x04,0x1c,0x04, -0x25,0x1b,0x26,0x1a,0x26,0x05,0x00,0x24,0x06,0x24,0xb9,0x01,0xc9,0x01,0xd9,0x01,0x03,0x2c,0x01,0x03,0x2b,0x26,0x27,0x1a,0x0e,0x06,0x01,0xae,0x06,0xee,0x06,0xfe,0x06,0x03,0x02,0x24,0x06,0x23,0x0a,0x0d,0x1a,0x01,0xed,0x1a,0xfd,0x1a,0x02,0x0a,0x1a,0x5a,0x1a,0x02,0x1a,0x18,0x10,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x10,0x09, -0x13,0x48,0x04,0x1a,0x1c,0x03,0x03,0x1d,0x96,0x2b,0x2b,0x2d,0x27,0x95,0x23,0xb8,0xff,0xc0,0x40,0x39,0x17,0x1c,0x48,0x23,0x23,0x2d,0x03,0x1c,0x13,0x0a,0x95,0x15,0x10,0x11,0x0f,0x0e,0xa0,0x26,0x01,0x15,0x26,0x01,0x26,0x1a,0x29,0x18,0xa0,0x24,0x01,0xc3,0x24,0x01,0x24,0x06,0x20,0x08,0xb5,0x2c,0x01,0x2c,0x20,0x09,0x16,0x48, -0x2c,0x01,0x29,0x02,0x1c,0x40,0x09,0x1d,0x48,0x1c,0x04,0x20,0x02,0xba,0x01,0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x08,0x29,0xb8,0x01,0x2c,0x40,0x10,0xa0,0x20,0xd0,0x20,0x02,0x20,0x20,0x18,0x84,0x08,0x08,0x2e,0x11,0x0e,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1, -0xc0,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x2b,0x2b,0x5d,0x5d,0x71,0x11,0x12,0x39,0x39,0x5f,0x5d,0x71,0x11, -0x12,0x39,0x11,0x12,0x39,0x39,0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x04,0x1e,0x0e,0x02,0x91,0x07,0x28,0x58,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x12,0x67,0x97,0x70,0x8c,0xa4,0x7e,0x70,0x1c,0x3b,0x51,0x90,0x6e,0x6b,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x02,0x34,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2, -0xd9,0xcd,0xfd,0xa2,0x4e,0x41,0x7b,0x75,0x5c,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0x2b,0xfe,0x1e,0x03,0x8c,0x05,0x2f,0x00,0x1d,0x00,0x25,0x01,0x39,0x40,0x48,0x1e,0x13,0x1f,0x00,0x06,0x1d,0x01,0x25,0x01,0x14,0x13,0x1f,0x05,0x06,0x1d,0x04,0x15,0x04,0x1e,0x14,0x13,0x1f,0x13,0x05,0x00,0x06,0x1d,0x06,0xb9,0x01, -0xc9,0x01,0xd9,0x01,0x03,0x25,0x01,0x03,0x24,0x0e,0x06,0x01,0xee,0x06,0xfe,0x06,0x02,0x02,0x1d,0x06,0x1c,0x08,0x1f,0x20,0x13,0x0d,0x13,0x01,0xed,0x13,0xfd,0x13,0x02,0x0a,0x13,0x01,0x13,0x18,0x0e,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x10,0x09,0x13,0x48,0x04,0x13,0x15,0x03,0x03,0x16,0x96,0x24,0x24,0x26,0x20,0x95,0x1c,0xb8, -0xff,0xc0,0x40,0x3a,0x17,0x1c,0x48,0x1c,0x1c,0x26,0x03,0x1c,0x0d,0x0e,0x11,0x08,0x95,0x0e,0x0b,0x0f,0xb5,0x25,0x01,0x25,0x20,0x09,0x16,0x48,0x25,0x01,0x22,0x02,0x15,0x40,0x09,0x1d,0x48,0x15,0x04,0x19,0x03,0xa0,0x1f,0x01,0x15,0x1f,0x01,0x1f,0x13,0x22,0x12,0xa0,0x1d,0x01,0xc3,0x1d,0x01,0x1d,0x06,0x19,0x07,0x02,0xba,0x01, -0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x07,0x22,0xb8,0x01,0x2c,0x40,0x13,0xa0,0x19,0xd0,0x19,0x02,0x19,0x19,0x12,0x0f,0x0f,0x27,0x0e,0x0a,0x0b,0x0e,0x12,0x84,0x0b,0x07,0x2f,0x33,0xe1,0x32,0x10,0xcd,0x11,0x12,0x39,0x2f,0x10,0xc0,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x2b, -0x2b,0xe1,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x00,0x3f,0x33,0xed,0x32,0x10,0xcd,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x2b,0x2b,0x5d,0x5d,0x71,0x11,0x12,0x39,0x11,0x12,0x39,0x39,0x5f,0x5d,0x71,0x11,0x12,0x39,0x39, -0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x01, -0xa6,0x0e,0x02,0x92,0x08,0x27,0x58,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x13,0x66,0x98,0x6f,0x8d,0xa4,0x80,0x6f,0x1c,0x3b,0x50,0x92,0x6e,0x6c,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x03,0x60,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfc,0xa0,0x4e,0x41,0x7b,0x75,0x5c,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x01,0xff,0xdb,0xfe,0x23, -0x04,0x16,0x04,0x18,0x00,0x19,0x00,0x31,0x40,0x1a,0x18,0x0f,0x0c,0x0a,0x95,0x0f,0x10,0x01,0x1c,0x03,0x14,0x95,0x05,0x16,0x19,0x84,0x01,0x18,0x18,0x1b,0x11,0x84,0x08,0x08,0x1b,0x0c,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x20, -0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x04,0x16,0xa4,0x04,0x76,0xda,0xfe,0xa6,0x80,0x38,0x31,0x46,0x43,0x01,0x04,0xea,0x7a,0xa6,0xa4,0xfe,0x23,0x02,0x87,0xc2,0x01,0xa1,0x01,0x54,0xb1,0x1e,0x8c,0x1c,0xfe,0xd0,0xfe,0xca,0xfe,0xc0,0xbb,0x8f,0x02,0x44,0x00,0x00,0x01, -0xff,0xdb,0xfe,0x1e,0x05,0x27,0x04,0x18,0x00,0x22,0x00,0x38,0x40,0x1e,0x22,0x20,0x95,0x02,0x1c,0x1c,0x0f,0x10,0x0e,0x95,0x13,0x10,0x07,0x18,0x95,0x09,0x16,0x22,0x1d,0x84,0x05,0x1c,0x1c,0x24,0x15,0x84,0x0c,0x0c,0x24,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0xc4,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x3f, -0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x05,0x27,0x40,0x43,0x92,0xa0,0x04,0x76,0xda,0xfe,0xa6,0x80,0x38,0x31,0x46,0x43,0x01,0x04,0xea,0x7a,0xa6,0xa4,0xa0,0x3c,0x35, -0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x3e,0xc2,0x01,0xa1,0x01,0x54,0xb1,0x1e,0x8c,0x1c,0xfe,0xd0,0xfe,0xca,0xfe,0xc0,0xbb,0x8f,0x02,0x44,0xfb,0x72,0xc8,0x1a,0x00,0x01,0x00,0x85,0xfe,0xa0,0x02,0x22,0xff,0xb8,0x00,0x06,0x00,0x19,0x40,0x0d,0x05,0x80,0x30,0x06,0x40,0x06,0x50,0x06,0x03,0x06,0x03,0xc0,0x06,0x2f,0x1a,0xcc,0x00,0x2f, -0x5d,0x1a,0xcd,0x31,0x30,0x17,0x17,0x37,0x33,0x03,0x23,0x03,0xf0,0x64,0x64,0x6a,0xb4,0x34,0xb5,0x48,0xaa,0xaa,0xfe,0xe8,0x01,0x18,0x00,0x01,0x00,0x85,0xfe,0xa0,0x02,0x22,0xff,0xb8,0x00,0x06,0x00,0x19,0x40,0x0d,0x01,0x80,0x30,0x02,0x40,0x02,0x50,0x02,0x03,0x02,0x04,0xc0,0x01,0x2f,0x1a,0xcc,0x00,0x2f,0x5d,0x1a,0xcd,0x31, -0x30,0x13,0x23,0x13,0x33,0x13,0x23,0x27,0xf0,0x6b,0xb5,0x34,0xb4,0x6a,0x64,0xfe,0xa0,0x01,0x18,0xfe,0xe8,0xaa,0x00,0x01,0x00,0xc8,0xfe,0x5e,0x01,0xe0,0xff,0xfb,0x00,0x06,0x00,0x12,0xb7,0x30,0x01,0x01,0x01,0x04,0x05,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xce,0x5d,0x31,0x30,0x01,0x15,0x25,0x35,0x25,0x15,0x07,0x01,0xe0,0xfe, -0xe8,0x01,0x18,0xaa,0xfe,0xc8,0x6a,0xb4,0x34,0xb5,0x6b,0x64,0x00,0x01,0x00,0xc8,0xfe,0x5e,0x01,0xe0,0xff,0xfb,0x00,0x06,0x00,0x12,0xb7,0x30,0x06,0x01,0x06,0x03,0x05,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xce,0x5d,0x31,0x30,0x13,0x37,0x27,0x35,0x05,0x15,0x05,0xc8,0xaa,0xaa,0x01,0x18,0xfe,0xe8,0xfe,0xc8,0x64,0x64,0x6b,0xb5, -0x34,0xb4,0x00,0x02,0x00,0x87,0xfe,0x2d,0x02,0x23,0xff,0xb2,0x00,0x0b,0x00,0x16,0x00,0x2f,0x40,0x1c,0x11,0xc5,0x40,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x8f,0x00,0x04,0x00,0x80,0x0c,0xc5,0x40,0x4f,0x06,0x01,0x06,0x09,0xc4,0x14,0x80,0x0f,0xc4,0x03,0x2f,0xe1,0x1a,0xdc,0xe1,0x00,0x2f,0x5d,0x1a,0xfd,0x1a,0xdc,0x5d,0x1a,0xed,0x31, -0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x52,0x59,0x72,0x76,0x5b,0x59,0x72,0x7b,0x56,0x31,0x3f,0x70,0x31,0x41,0x41,0xfe,0x2d,0x6b,0x54,0x57,0x6f,0x6c,0x54,0x54,0x71,0x01,0x33,0x40,0x30,0x71,0x41,0x30,0x30,0x40,0x00,0xff,0xff,0x00,0x52, -0x01,0x74,0x01,0xd7,0x02,0xbc,0x02,0x07,0x00,0x43,0x00,0x00,0xfc,0xb2,0xff,0xff,0x00,0x28,0x01,0x7f,0x02,0x70,0x02,0xbd,0x00,0x07,0x04,0x6e,0x01,0x4b,0xfc,0xbd,0xff,0xff,0x00,0x28,0x01,0x7f,0x02,0x6f,0x02,0xbd,0x00,0x07,0x00,0xde,0xff,0xe8,0xfc,0xbd,0xff,0xff,0x00,0x23,0x01,0x9e,0x02,0xa4,0x02,0x9e,0x00,0x07,0x00,0xd8, -0x00,0x00,0xfc,0xec,0xff,0xff,0x00,0xad,0x01,0x8e,0x01,0x8d,0x05,0xba,0x00,0x07,0x00,0x1d,0x00,0x3d,0x01,0xa4,0x00,0x01,0x00,0x98,0x04,0x42,0x02,0x12,0x05,0xba,0x00,0x05,0x00,0x1b,0xb1,0x02,0x01,0xb8,0x01,0x33,0xb4,0x04,0x04,0x00,0x00,0x02,0xb9,0x01,0x32,0x00,0x03,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xcd,0x31,0x30,0x01, -0x21,0x11,0x23,0x11,0x21,0x02,0x12,0xfe,0xf0,0x6a,0x01,0x7a,0x05,0x52,0xfe,0xf0,0x01,0x78,0x00,0x01,0x00,0x98,0x04,0x42,0x02,0x12,0x05,0xba,0x00,0x05,0x00,0x19,0xb1,0x04,0x05,0xb8,0x01,0x33,0xb2,0x02,0x04,0x02,0xb8,0x01,0x32,0xb1,0x05,0x00,0x2f,0xdd,0xe1,0x00,0x3f,0xfd,0xcd,0x31,0x30,0x13,0x35,0x21,0x11,0x23,0x11,0x98, -0x01,0x7a,0x6a,0x05,0x52,0x68,0xfe,0x88,0x01,0x10,0x00,0x01,0x00,0x98,0x00,0x00,0x02,0x12,0x01,0x79,0x00,0x05,0x00,0x1a,0xb1,0x04,0x05,0xb8,0x01,0x33,0xb3,0x02,0x00,0x00,0x05,0xb9,0x01,0x32,0x00,0x02,0x2f,0xf1,0xc1,0x2f,0x00,0x2f,0xfd,0xcd,0x31,0x30,0x25,0x15,0x21,0x11,0x33,0x11,0x02,0x12,0xfe,0x86,0x6a,0x68,0x68,0x01, -0x79,0xfe,0xef,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x02,0x12,0x01,0x79,0x00,0x05,0x00,0x18,0xb1,0x02,0x00,0xbb,0x01,0x33,0x00,0x05,0x00,0x03,0x01,0x32,0xb1,0x01,0x05,0x2f,0xdd,0xe1,0x00,0x2f,0xfd,0xc6,0x31,0x30,0x37,0x21,0x11,0x33,0x11,0x21,0x98,0x01,0x10,0x6a,0xfe,0x86,0x68,0x01,0x11,0xfe,0x87,0x00,0x00,0x01,0xff,0xf0, -0xfe,0x5c,0x02,0xba,0xff,0x89,0x00,0x07,0x00,0x31,0xb9,0x00,0x04,0x01,0x33,0x40,0x0d,0x40,0x01,0x80,0x06,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x07,0xb8,0x01,0x32,0xb3,0x06,0x06,0x09,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x5d,0x33,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15, -0x21,0x35,0x33,0x02,0xba,0xfd,0x36,0x69,0x01,0xf8,0x69,0xfe,0x5c,0x01,0x2d,0xc5,0xc5,0x00,0x00,0x01,0xff,0xf2,0xfe,0x5c,0x02,0xba,0xff,0x89,0x00,0x05,0x00,0x27,0xb9,0x00,0x04,0x01,0x33,0x40,0x0e,0x40,0x01,0x80,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x05,0x07,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x10,0xc6,0x00,0x2f, -0x5d,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x21,0x02,0xba,0xfd,0x38,0x68,0x02,0x60,0xfe,0x5c,0x01,0x2d,0xc5,0x00,0x00,0x01,0x00,0x3a,0xfe,0x5c,0x02,0x6e,0x00,0xa0,0x00,0x09,0x00,0x4b,0x40,0x2f,0x4f,0x02,0xcf,0x02,0x02,0x02,0x01,0x40,0x07,0xc0,0x07,0x02,0x07,0x01,0xdb,0x08,0x01,0x08,0x08,0x20,0x09,0x0c, -0x48,0x08,0x05,0x02,0x42,0x4f,0x07,0x01,0x07,0x40,0x16,0x19,0x48,0x07,0x07,0x05,0x0f,0x09,0x1f,0x09,0x02,0x09,0x09,0x0b,0x05,0x2f,0x12,0x39,0x2f,0x5d,0x12,0x39,0x2f,0x2b,0x5d,0xe0,0x12,0x39,0x2b,0x11,0x33,0x00,0x2f,0xed,0xcd,0x5d,0x10,0xcd,0x5d,0x31,0x30,0x05,0x21,0x17,0x23,0x03,0x35,0x13,0x33,0x07,0x21,0x02,0x6e,0xfe, -0x4a,0xa8,0x5e,0xc8,0xc6,0x5e,0xa6,0x01,0xb6,0xb0,0xf4,0x01,0x1b,0x0e,0x01,0x1b,0xf4,0x00,0x00,0x01,0xff,0x74,0x04,0xba,0x00,0x8c,0x06,0x58,0x00,0x06,0x00,0x1a,0x40,0x0b,0x02,0x00,0x06,0xc0,0x03,0x03,0x02,0x00,0x05,0x80,0x06,0x2f,0x1a,0xcd,0x00,0x3f,0x33,0x2f,0x1a,0xce,0x39,0x39,0x31,0x30,0x03,0x37,0x27,0x35,0x05,0x15, -0x05,0x8c,0xaa,0xaa,0x01,0x18,0xfe,0xe8,0x05,0x25,0x65,0x64,0x6a,0xb5,0x33,0xb6,0x00,0x01,0xff,0xa6,0x04,0x98,0x00,0x5a,0x06,0x04,0x00,0x0b,0x00,0x20,0x40,0x0f,0x07,0xcb,0x40,0x06,0xc0,0x0b,0xcb,0x40,0x00,0x00,0x06,0x80,0x09,0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x22, -0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x15,0x14,0x33,0x5a,0x4d,0x67,0x66,0x4e,0x5e,0x5e,0x04,0x98,0x68,0x4e,0x4c,0x6a,0x5e,0x58,0x5a,0x00,0x02,0xfe,0xee,0x04,0xc2,0x01,0x12,0x06,0x68,0x00,0x0c,0x00,0x18,0x00,0x2f,0x40,0x18,0x0a,0xdb,0x04,0x01,0x06,0x06,0x0d,0xc1,0x40,0x13,0x00,0xc4,0x01,0x0e,0x10,0x06,0x16,0x42,0x06,0xc4, -0x07,0x10,0xc0,0x16,0x2f,0xe1,0xd6,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x00,0x18,0x2f,0x1a,0xed,0x32,0x2f,0x33,0xde,0xed,0x31,0x30,0x01,0x23,0x26,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x01,0x12,0x66,0x09,0x61,0x44,0xa0,0x0c,0x64,0x04,0x95,0x75,0x71,0x9b, -0xfe,0xf8,0x29,0x39,0x39,0x29,0x28,0x3a,0x38,0x05,0x6c,0x48,0x54,0x9c,0x72,0x8a,0x8a,0x59,0x39,0x29,0x29,0x38,0x38,0x29,0x28,0x3a,0x00,0x01,0xff,0x30,0xfd,0xfe,0x00,0xd2,0xff,0xa1,0x00,0x0b,0x00,0xa5,0x40,0x17,0x01,0x42,0x05,0x03,0x02,0x03,0x06,0x09,0x0b,0x00,0x03,0x08,0x56,0x06,0x01,0xd4,0x06,0xe4,0x06,0xf4,0x06,0x03, -0x06,0xb8,0xff,0xe0,0x40,0x42,0x09,0x0c,0x48,0x59,0x08,0x01,0xdb,0x08,0xeb,0x08,0xfb,0x08,0x03,0x08,0x20,0x09,0x0c,0x48,0x08,0x06,0x04,0x0a,0x04,0x0f,0x07,0x1f,0x07,0x2f,0x07,0xcf,0x07,0x04,0x07,0x0a,0x42,0x02,0x00,0x0b,0x03,0x03,0x06,0x08,0x09,0x03,0x05,0x29,0x03,0x59,0x03,0x02,0x03,0x20,0x15,0x1a,0x48,0x03,0x20,0x09, -0x0c,0x48,0x26,0x05,0x56,0x05,0x02,0x05,0xb8,0xff,0xe0,0xb3,0x15,0x1a,0x48,0x05,0xb8,0xff,0xe0,0x40,0x09,0x09,0x0c,0x48,0x05,0x03,0x07,0x01,0x04,0x04,0xb8,0xff,0xe0,0xb3,0x17,0x1b,0x48,0x04,0x19,0x2f,0x2b,0x17,0x33,0x2b,0x2b,0x71,0x2b,0x2b,0x71,0x11,0x17,0x33,0x11,0x17,0x33,0xe1,0x00,0x2f,0x5d,0x17,0x33,0x2b,0x5d,0x71, -0x2b,0x5d,0x71,0x11,0x17,0x33,0x11,0x17,0x33,0x18,0xe5,0x31,0x30,0x17,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0xd2,0x85,0x85,0x4c,0x86,0x85,0x4b,0x85,0x85,0x4c,0x86,0x85,0xaa,0x86,0x84,0x4e,0x86,0x86,0x4c,0x85,0x85,0x4d,0x85,0x85,0x00,0xff,0xff,0xff,0x74,0xfe,0x5e,0x00,0x8c,0xff,0xfb,0x00,0x07,0x07,0x46, -0xfe,0xac,0x00,0x00,0xff,0xff,0xff,0x74,0xfe,0x5e,0x00,0x8c,0xff,0xfb,0x00,0x07,0x07,0x47,0xfe,0xac,0x00,0x00,0x00,0x02,0xfe,0xa1,0xfe,0x5e,0x01,0x5f,0xff,0xfb,0x00,0x06,0x00,0x0d,0x00,0x35,0x40,0x1e,0x07,0x09,0x80,0x0f,0x0b,0x1f,0x0b,0x2f,0x0b,0x03,0x0b,0x0e,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x03,0x0d,0xc0, -0x0a,0x0a,0x02,0x06,0x80,0x05,0x2f,0x1a,0xcd,0x32,0x33,0x2f,0x1a,0xcc,0x00,0x2f,0xce,0x5d,0x1a,0x10,0xde,0x5d,0x1a,0xcd,0x32,0x31,0x30,0x01,0x37,0x27,0x35,0x05,0x15,0x05,0x25,0x27,0x07,0x23,0x13,0x33,0x13,0xfe,0xa1,0xaa,0xaa,0x01,0x19,0xfe,0xe7,0x02,0x53,0x64,0x64,0x6a,0xb5,0x33,0xb5,0xfe,0xc8,0x64,0x64,0x6b,0xb5,0x34, -0xb4,0x2e,0xa9,0xa9,0x01,0x18,0xfe,0xe8,0x00,0x01,0xff,0xa6,0x04,0x98,0x00,0x5a,0x06,0x04,0x00,0x0b,0x00,0x22,0x40,0x10,0x05,0xcb,0x40,0x06,0xc0,0x01,0xcb,0x40,0x00,0x00,0x06,0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x23,0x35,0x32, -0x16,0x15,0x14,0x06,0x5a,0x5e,0x5e,0x4d,0x67,0x67,0x04,0x98,0x5c,0x5a,0x58,0x5e,0x69,0x4d,0x4e,0x68,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x07,0x40,0x00,0x09,0x00,0x23,0x40,0x11,0x09,0x05,0x07,0xda,0x40,0x02,0x00,0x84,0x09,0x0e,0x0a,0x05,0x0a,0x42,0x05,0x84,0x04,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x1a, -0xed,0xc4,0x32,0x31,0x30,0x01,0x02,0x21,0x20,0x03,0x33,0x12,0x21,0x20,0x13,0x03,0x1a,0xf0,0xfd,0xd6,0xfd,0xd6,0xf0,0xa2,0xba,0x01,0xbd,0x01,0xbf,0xba,0x07,0x40,0xfe,0x82,0x01,0x7e,0xfe,0xfe,0x01,0x02,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x06,0x58,0x00,0x03,0x00,0x19,0x40,0x0b,0x02,0x91,0x40,0x01,0x00,0x0e,0x04,0x04, -0x01,0x42,0x01,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1a,0xf9,0xcc,0x06,0x34,0x05,0xc2,0x96,0x00,0x01,0xfc,0xe6,0xfe,0x70,0x03,0x1a,0xff,0x04,0x00,0x03,0x00,0x19,0x40,0x0b,0x01,0x91,0x40,0x02,0x03,0x0e,0x04,0x02,0x04,0x42,0x02,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a, -0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1a,0xf9,0xcc,0x06,0x34,0xfe,0x70,0x94,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0xec,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x06,0x00,0xed,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x03,0xb6,0x04,0x00,0x00,0x07,0x00,0x0f,0x00,0x3c, -0x40,0x1e,0x0a,0x07,0x01,0x02,0x08,0x0c,0x01,0x0c,0x0f,0x03,0x04,0x0c,0x04,0x08,0x95,0x02,0x02,0x01,0x07,0x0f,0x04,0x01,0x15,0x0f,0x08,0x05,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0x12,0x39,0x2f,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x5d,0x21,0x23,0x03,0x21, -0x03,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x03,0xb6,0xb4,0x58,0xfe,0x66,0x56,0xb0,0x01,0x75,0xc3,0x3b,0x87,0x02,0x12,0x07,0x05,0x10,0x88,0x01,0x02,0xfe,0xfe,0x04,0x00,0xfd,0x8e,0x01,0x8c,0x06,0x4e,0x1a,0x3a,0xfe,0x74,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0xe4,0x04,0x00,0x00,0x0f,0x00,0x13,0x00,0x5e, -0x40,0x31,0x13,0x03,0x04,0x12,0x04,0x0c,0x95,0x40,0x0b,0x07,0x00,0x0b,0x95,0x1a,0x30,0x10,0x95,0x02,0x02,0x00,0x11,0x08,0x95,0x07,0x0f,0x04,0x0f,0x95,0x00,0x12,0x06,0x06,0x01,0x14,0x08,0x0c,0x00,0x00,0x15,0x10,0x0a,0x0e,0x84,0x01,0x01,0x15,0x14,0x04,0x05,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x11,0x33,0x2f,0xc4, -0xc4,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0xed,0xc4,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x11,0x23,0x03,0x04,0xe4,0xfd,0xb6,0xfe,0xa2,0x82,0xba,0x02,0x23,0x02,0xaa,0xfe,0x6f, -0x01,0x74,0xfe,0x8c,0x01,0xa8,0xfd,0xb6,0x1d,0xfa,0x01,0x02,0xfe,0xfe,0x04,0x00,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0,0x01,0x02,0x01,0xe6,0xfe,0x1a,0x00,0x03,0x00,0x52,0xff,0xe8,0x06,0x50,0x04,0x18,0x00,0x23,0x00,0x2e,0x00,0x35,0x00,0x71,0x40,0x1d,0x16,0x40,0x0b,0x0e,0x48,0x16,0x16,0x14,0x24,0x00,0x11,0x95,0x2f,0x2f,0x0c,0x14, -0x95,0x19,0x10,0x2b,0x95,0x1e,0x10,0x09,0x33,0x95,0x0c,0x16,0x04,0xb8,0xff,0xd0,0x40,0x1a,0x09,0x0c,0x48,0x04,0x02,0x95,0x07,0x16,0x05,0x05,0x21,0x83,0x28,0x28,0x37,0x00,0x09,0x1c,0x2f,0x04,0x24,0x83,0x11,0x11,0x37,0x17,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x17,0x30,0x83,0x0f,0x2f,0xe1,0xc4,0x2b,0x12,0x39,0x2f,0xe1,0x17, -0x39,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x39,0x2f,0x2b,0x31,0x30,0x01,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x02,0x35,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x33,0x32,0x16, -0x15,0x10,0x05,0x25,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x07,0x21,0x16,0x16,0x33,0x32,0x36,0x03,0xcb,0xd7,0xb1,0x9b,0x94,0xc8,0xee,0x42,0x04,0x73,0xf1,0xca,0xde,0x02,0xd3,0x03,0xb0,0x99,0xaf,0x90,0x84,0xe2,0x01,0x0a,0x77,0x04,0x8d,0xf6,0x99,0xaf,0xfe,0x81,0xfe,0xfa,0xcd,0x85,0x8d,0x6a,0x5a,0x78,0xa3,0xa6, -0xfd,0xd5,0x02,0x85,0x77,0x74,0xa6,0x01,0x9c,0xfe,0xd6,0x7a,0xa4,0x60,0xc6,0xc6,0x01,0x05,0xe8,0x54,0xab,0xba,0x72,0x9a,0x62,0xe0,0xe0,0xa1,0x87,0xfe,0xd2,0x16,0x7d,0x0a,0x06,0x52,0x61,0x49,0x59,0xab,0x85,0xc0,0x90,0x9c,0xa4,0x00,0x00,0x03,0x00,0x3e,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x48, -0x40,0x27,0x01,0x12,0x15,0x1c,0x04,0x08,0x95,0x0b,0x0b,0x1d,0x14,0x95,0x0c,0x0f,0x1d,0x95,0x07,0x15,0x12,0x01,0x19,0x83,0x10,0x10,0x03,0x20,0x00,0x00,0x03,0x83,0x20,0x20,0x25,0x15,0x0b,0x1d,0x84,0x09,0x07,0x2f,0xce,0xe1,0x39,0x39,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed, -0x12,0x39,0x2f,0xed,0x17,0x39,0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x33,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x92,0x7e,0x6b,0xc4,0xab,0xfe,0x96,0x68,0x68,0x01,0x5e,0x99,0xb5,0x60,0xa0,0xfd,0xb6,0xac,0x54, -0x64,0xb8,0xac,0xba,0xd7,0x7b,0x64,0x01,0xcb,0x37,0x78,0x7f,0x9d,0x01,0xcb,0x8b,0x01,0xaa,0x8a,0x70,0x75,0x3b,0x01,0x1e,0xfe,0xe2,0x51,0x47,0x86,0xfe,0x57,0xfe,0xc1,0x99,0x4c,0x5a,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x06,0x04,0x00,0x00,0x07, -0x00,0x0e,0x00,0x1f,0x40,0x10,0x08,0x95,0x01,0x0f,0x09,0x95,0x00,0x15,0x04,0x83,0x0c,0x0c,0x10,0x09,0x84,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x33,0x11,0x21,0x20,0x11,0x14,0x00,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0xa6,0x01,0x40,0x02,0x20,0xfe,0xd5,0xfc,0x97,0x8f,0x01,0x89,0xfe,0x7b, -0x04,0x00,0xfe,0x0a,0xeb,0xfe,0xe1,0x03,0x74,0xfd,0x18,0x01,0x7a,0x01,0x6e,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x04,0x10,0x04,0x00,0x00,0x0b,0x00,0x16,0x00,0x3f,0x40,0x22,0x10,0x0d,0x01,0x95,0x40,0x04,0x05,0x00,0x04,0x95,0x1a,0x30,0x0c,0x95,0x05,0x0f,0x11,0x95,0x00,0x15,0x0f,0x0f,0x11,0x08,0x83,0x14,0x14,0x18,0x0d,0x04, -0x11,0x84,0x02,0x00,0x2f,0xc6,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x14,0x00,0x23,0x03,0x11,0x33,0x15,0x23,0x11,0x33,0x20,0x11,0x10,0x21,0xb0,0x74,0x74,0x01,0x40,0x02,0x20,0xfe,0xd6,0xfc, -0x98,0xec,0xec,0x90,0x01,0x88,0xfe,0x7c,0x01,0xba,0x8c,0x01,0xba,0xfe,0x0a,0xea,0xfe,0xe0,0x03,0x74,0xfe,0xd2,0x8c,0xfe,0xd2,0x01,0x7a,0x01,0x6e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xf0,0x04,0x00,0x00,0x0b,0x00,0x32,0x40,0x1b,0x08,0x95,0x40,0x07,0x03,0x00,0x07,0x95,0x1a,0x30,0x04,0x95,0x03,0x0f,0x0b,0x95,0x00,0x15, -0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0x84,0x01,0x2f,0xe1,0x39,0x11,0x33,0x2f,0xc4,0xc4,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x02,0xf0,0xfd,0xb6,0x02,0x33,0xfe,0x6f,0x01,0x74,0xfe,0x8c,0x01,0xa8,0x04,0x00,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0, -0x00,0x01,0x00,0x5a,0xff,0xe8,0x02,0xec,0x04,0x18,0x00,0x22,0x00,0x3e,0x40,0x20,0x01,0x12,0x95,0x13,0x13,0x1e,0x0b,0x1b,0x19,0x95,0x1e,0x10,0x09,0x0b,0x95,0x06,0x16,0x00,0x21,0x12,0x0e,0x83,0x03,0x03,0x21,0x83,0x16,0x16,0x24,0x12,0x08,0x1b,0x2f,0xc6,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xfd, -0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x10,0xbb,0xca,0xa3,0x82,0x68,0x6e,0x7c,0x5a,0x6d,0x8c,0x78,0x50,0x52,0x01,0x21, -0x7e,0x72,0x86,0x74,0x72,0x98,0xb9,0xcf,0x01,0xea,0x04,0x40,0xa8,0x7d,0x99,0x2e,0x9a,0x3e,0x51,0x43,0x4b,0x59,0x8e,0xac,0x4d,0x5d,0x3e,0x96,0x32,0xa0,0x88,0xd0,0x00,0x02,0x00,0x8e,0xfe,0x27,0x01,0x64,0x04,0x00,0x00,0x03,0x00,0x0f,0x00,0x23,0x40,0x12,0x0a,0x63,0x04,0x1b,0x00,0x15,0x03,0x0f,0x0d,0x62,0x07,0x07,0x00,0x84, -0x01,0x01,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x33,0x2f,0xe1,0x00,0x3f,0x3f,0x3f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x48,0xa2,0xa2,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x04,0x00,0xfa,0x27,0x3d,0x2e,0x2e,0x3c,0x3e,0x2c,0x2e,0x3d,0x00,0x00,0x01,0x00,0x14, -0xff,0xec,0x01,0xd3,0x04,0x00,0x00,0x0b,0x00,0x1b,0x40,0x0d,0x0b,0x0f,0x05,0x07,0x95,0x02,0x16,0x09,0x84,0x00,0x00,0x0d,0x04,0x2f,0x11,0x33,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0xd3,0xfe,0xb9,0x40,0x38,0x32,0x3d,0xac,0xa4,0x01,0x72,0xfe,0x7a,0x14, -0x94,0x1d,0x01,0x00,0x02,0x89,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x0d,0x00,0x45,0x40,0x23,0x0b,0x02,0x03,0x0a,0x03,0x08,0x05,0x04,0x09,0x0a,0x09,0x04,0x03,0x09,0x03,0x09,0x03,0x01,0x06,0x0f,0x0c,0x95,0x01,0x15,0x0a,0x0a, -0x00,0x00,0x0f,0x08,0x05,0x0c,0x84,0x03,0x01,0x2f,0xce,0xe1,0x39,0x39,0x11,0x33,0x2f,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x21,0x21,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x21,0x03,0x04,0xfd,0xa2,0x64,0x64,0xa2,0xf0,0xf0, -0x01,0xbc,0x01,0x74,0x38,0x8a,0x3a,0x02,0x00,0xfe,0x5c,0x88,0x8e,0x87,0xfe,0xbd,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0xf8,0x04,0x00,0x02,0x06,0x02,0x13,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00,0x02,0x06,0x02,0x0f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00, -0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x00,0x15,0x00,0x34,0x40,0x1f,0x40,0x0b,0x50,0x0b,0x02,0x0b,0x0b,0x09,0x95,0x0e,0x10,0x4f,0x01,0x5f,0x01,0x6f,0x01,0x03,0x01,0x01,0x03,0x95,0x14,0x16,0x11,0x83,0x06,0x06,0x17,0x0b,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d, -0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x5a,0x6c,0x86,0xa6,0xd2,0xcd,0x9f,0x8e,0x70,0x7c,0x9a,0xe6,0x01,0x16,0xfe,0xcd,0xeb,0x84,0x18,0x9a,0x40,0xda,0xb8,0xb3,0xd7,0x46,0x95,0x3b,0xfe,0xde,0xea,0xef,0xfe,0xcb,0x00,0x02,0x00,0x60,0x00,0x08, -0x04,0x92,0x03,0xf8,0x00,0x0b,0x00,0x17,0x00,0x1f,0x40,0x10,0x0c,0xf4,0x06,0x0f,0x12,0xf4,0x00,0x15,0x09,0xed,0x15,0x15,0x19,0x0f,0xed,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x25,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34, -0x26,0x02,0x79,0xf2,0xfe,0xd9,0x01,0x28,0xf1,0xf2,0x01,0x27,0xfe,0xd7,0xf2,0xb9,0xd2,0xd2,0xbd,0xb7,0xd4,0xd2,0x08,0x01,0x15,0xe5,0xe7,0x01,0x0f,0xfe,0xeb,0xe5,0xe5,0xfe,0xef,0x03,0x48,0xb6,0x9a,0xa2,0xae,0xb5,0x9b,0xa1,0xaf,0x00,0x00,0x01,0x00,0x60,0x00,0xb6,0x04,0x92,0x03,0xf8,0x00,0x15,0x00,0x29,0x40,0x14,0x0b,0x00, -0x00,0x17,0x06,0xf4,0x11,0x0f,0x01,0x14,0xed,0x03,0x03,0x17,0x0e,0x0b,0x0b,0x09,0xed,0x0e,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0xc6,0x00,0x3f,0xed,0x12,0x39,0x2f,0xc4,0x31,0x30,0x25,0x23,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x04,0x50,0x92,0x48,0xd8, -0xb5,0xb3,0xda,0x47,0x91,0x42,0x01,0x2f,0xec,0xec,0x01,0x2b,0xb6,0x7a,0xab,0xab,0xcc,0xd0,0xa7,0xa5,0x80,0x8e,0x9b,0xf0,0x01,0x29,0xfe,0xdf,0xe9,0xae,0x00,0x03,0x00,0x4c,0xff,0xe8,0x04,0xa6,0x04,0x18,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x7d,0x40,0x47,0x15,0x15,0x16,0x14,0x14,0x1b,0x13,0x13,0x12,0x0c,0x0c,0x0d,0x0b,0x00, -0x0b,0x1d,0x1d,0x1e,0x1c,0x1c,0x23,0x09,0x09,0x08,0x02,0x02,0x03,0x0a,0x01,0x0a,0x00,0x01,0x04,0x0a,0x0b,0x14,0x15,0x1c,0x1d,0x04,0x22,0x1a,0x02,0x09,0x0c,0x13,0x04,0x04,0x1a,0xf4,0x0e,0x0f,0x22,0xf4,0x04,0x15,0x01,0x00,0x00,0x11,0x0b,0x0a,0x07,0x11,0xed,0x17,0x17,0x25,0x1f,0xed,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10, -0xc6,0x32,0x10,0xc2,0x2f,0x32,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0xc6,0x32,0x10,0xc6,0x32,0x31,0x30,0x10,0x87,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x25,0x07,0x27,0x06,0x23,0x22,0x00,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x00,0x15,0x14, -0x07,0x01,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x01,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x04,0xa6,0x48,0x8b,0x8b,0xcf,0xf2,0xfe,0xd9,0x71,0x85,0x48,0x8a,0x8c,0xcf,0xf2,0x01,0x27,0x71,0xfd,0x77,0x02,0x18,0x56,0xd2,0xbd,0x82,0x01,0x65,0xfd,0xe8,0x56,0xd2,0xbd,0x81,0x33,0x4b,0x84,0x64,0x01,0x15,0xe5,0xc8,0x82,0x81,0x4b,0x84, -0x64,0xfe,0xeb,0xe5,0xc8,0x82,0x02,0x6d,0xfd,0xfb,0x5a,0x8a,0xa1,0xaf,0xfd,0x8f,0x02,0x05,0x5a,0x8a,0xa2,0xae,0x00,0x03,0x00,0x52,0xff,0xe8,0x07,0x10,0x04,0x18,0x00,0x1c,0x00,0x28,0x00,0x2f,0x00,0x58,0x40,0x29,0x0d,0x40,0x0b,0x0e,0x48,0x0d,0x0d,0x0b,0x08,0x95,0x29,0x29,0x0b,0x03,0x10,0x0b,0x1d,0x95,0x15,0x10,0x2d,0x03, -0x23,0x95,0x1b,0x16,0x18,0x83,0x26,0x26,0x31,0x00,0x12,0x29,0x03,0x20,0x83,0x08,0x08,0x31,0x0d,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x0d,0x2a,0x83,0x06,0x2f,0xe1,0xc4,0x2b,0x12,0x39,0x2f,0xe1,0x17,0x39,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x39,0x39,0x3f,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30, -0x25,0x23,0x06,0x21,0x22,0x02,0x35,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x00,0x15,0x10,0x00,0x23,0x20,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x21,0x16,0x16,0x33,0x32,0x36,0x03,0x72,0x04,0x76,0xfe,0xf6,0xc2,0xda,0x02,0xd3,0x03,0xb0,0x9b,0xad,0x90,0x88, -0xda,0x01,0x10,0x71,0x04,0x83,0x01,0x1a,0xe5,0x01,0x0d,0xfe,0xe6,0xf0,0xfe,0xd9,0x01,0x35,0xa0,0xa9,0xab,0x9c,0x9f,0xb9,0xb9,0xfd,0x72,0xfd,0xd7,0x02,0x84,0x74,0x78,0xa6,0xd3,0xeb,0x01,0x05,0xe4,0x58,0xab,0xba,0x72,0x9a,0x62,0xed,0xed,0xfe,0xe4,0xee,0xfe,0xfc,0xfe,0xde,0x03,0xa6,0xcf,0xbb,0xc2,0xd0,0xd9,0xbf,0xb5,0xcf, -0xfe,0x10,0x8e,0x9e,0xa9,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xea,0x04,0x00,0x00,0x1f,0x00,0x2b,0x00,0x3f,0x40,0x21,0x14,0x00,0x20,0x95,0x0a,0x0a,0x26,0x05,0x10,0x0f,0x26,0x95,0x1a,0x16,0x14,0x00,0x02,0x0d,0x84,0x12,0x12,0x17,0x83,0x29,0x29,0x2d,0x1d,0x07,0x84,0x02,0x23,0x83,0x1d,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39, -0x2f,0xf1,0xc0,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34, -0x26,0x01,0x40,0xa6,0x1c,0xa0,0x1c,0x7e,0x6d,0x6d,0x7e,0x1c,0xa2,0x1a,0xa8,0x68,0x7a,0xfe,0xcb,0xd1,0xf0,0x78,0x01,0x4d,0x82,0x9b,0xa0,0x7d,0x81,0x9c,0x9f,0x02,0x7f,0x4b,0xa4,0x46,0x4c,0x45,0x40,0x56,0x6b,0x6b,0x56,0x40,0x45,0x46,0x4c,0x9e,0x51,0x26,0x9f,0x66,0xa2,0xca,0xc1,0xa3,0x65,0xa5,0x27,0x78,0x67,0x66,0x78,0x7a, -0x68,0x63,0x78,0x00,0x00,0x01,0x00,0x60,0x02,0x00,0x04,0x62,0x04,0x18,0x00,0x0d,0x00,0x1d,0x40,0x0e,0x07,0x00,0x04,0x95,0x0b,0x10,0x00,0x83,0x01,0x01,0x0f,0x07,0x83,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0xc4,0x32,0x31,0x30,0x01,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x00,0x33,0x32,0x00,0x04,0x62,0xa8, -0xb9,0xa1,0x9f,0xb9,0xa8,0x01,0x1f,0xe9,0xe7,0x01,0x13,0x02,0x00,0xbc,0xd2,0xd8,0xb6,0xee,0x01,0x2a,0xfe,0xde,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x62,0x02,0x00,0x00,0x0d,0x00,0x1d,0x40,0x0e,0x0d,0x06,0x0a,0x95,0x03,0x16,0x00,0x83,0x0d,0x0d,0x0f,0x07,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0xd4,0xc4,0x31, -0x30,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x04,0x62,0xfe,0xe1,0xe9,0xe6,0xfe,0xec,0xa8,0xb9,0xa1,0x9f,0xb9,0x02,0x00,0xef,0xfe,0xd7,0x01,0x22,0xf6,0xbc,0xd2,0xd8,0xb6,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x52,0x04,0x00,0x00,0x0a,0x00,0x11,0x00,0x27,0x40,0x14,0x0c,0x95,0x00,0x00,0x01,0x0b, -0x95,0x03,0x0f,0x01,0x15,0x07,0x83,0x0f,0x0f,0x13,0x0c,0x01,0x84,0x02,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x48,0xa2,0x01,0x33,0xb4,0xc5,0xd4,0xb8,0x7e,0x7e,0xe6,0xd9,0x01,0x70, -0xfe,0x90,0x04,0x00,0xa1,0x99,0x98,0xbe,0x02,0x04,0xfe,0x88,0xc2,0xb6,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0xfc,0x04,0x00,0x00,0x12,0x00,0x1a,0x00,0x3b,0x40,0x1e,0x0b,0x02,0x95,0x13,0x13,0x00,0x14,0x95,0x12,0x0f,0x07,0x00,0x15,0x06,0x09,0x0b,0x09,0x08,0x13,0x00,0x84,0x01,0x01,0x1c,0x17,0x84,0x0e,0x0e,0x07,0x08,0x2f,0x33, -0x33,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xc4,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x23,0x11,0x23,0x22,0x06,0x07,0x03,0x23,0x13,0x36,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x15,0x14,0x16,0x33,0x02,0xfc,0xa2,0x58,0x42,0x51,0x23,0x79,0xb5,0x8e,0x34,0x53, -0xe5,0xc6,0xae,0x01,0x3a,0xa2,0x98,0xd0,0x6e,0x5e,0x01,0xa6,0x3f,0x53,0xfe,0xec,0x01,0x35,0x71,0x29,0x04,0x2b,0xd7,0x87,0xa4,0xfe,0x31,0x01,0x43,0x9d,0x4f,0x57,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0xfc,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x3b,0x40,0x1e,0x06,0x13,0x95,0x0f,0x0f,0x12,0x0b,0x11,0x0f,0x12,0x95,0x00,0x15,0x0c, -0x09,0x09,0x06,0x0a,0x0f,0x00,0x84,0x12,0x12,0x1a,0x16,0x84,0x04,0x04,0x0b,0x0a,0x2f,0x33,0x33,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x37,0x35,0x26,0x27,0x03,0x33,0x13,0x16,0x33,0x33,0x11,0x33,0x03,0x11,0x23, -0x22,0x15,0x14,0x33,0x02,0xfc,0xfe,0xae,0xa5,0xb7,0xea,0x53,0x39,0x8e,0xb9,0x75,0x3e,0x78,0x58,0xa2,0xa2,0x9c,0xcc,0xc4,0x98,0x84,0xda,0x31,0x04,0x21,0x7c,0x01,0x38,0xfe,0xec,0x92,0x01,0xa6,0xfc,0x8c,0x01,0x43,0xa8,0x9b,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0x29,0x04,0x00,0x02,0x06,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0x90, -0xff,0xe8,0x03,0xb6,0x04,0x00,0x00,0x0d,0x00,0x1e,0x40,0x0f,0x06,0x0d,0x0f,0x09,0x95,0x02,0x16,0x0d,0x84,0x0c,0x0c,0x0f,0x06,0x84,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x33,0x31,0x30,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x11,0x11,0x33,0x03,0xb6,0xfe,0x64,0xfe,0x76,0xa1,0xf2,0xf1,0xa2, -0x01,0xa6,0xfe,0x42,0x01,0xb2,0x02,0x66,0xfd,0xa2,0xfe,0xd0,0x01,0x2a,0x02,0x64,0x00,0x01,0x00,0x66,0x00,0x5a,0x04,0x38,0x03,0xac,0x00,0x12,0x00,0x2a,0x40,0x14,0x00,0xf4,0x01,0x01,0x13,0x0d,0x08,0xf4,0x09,0x0c,0x04,0x0b,0x0b,0x0f,0xed,0x04,0x04,0x14,0x08,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x33,0x00,0x2f, -0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x37,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x23,0x66,0x02,0x0c,0x01,0x3a,0xad,0x88,0xfd,0xef,0x03,0xb8,0x80,0x9a,0xef,0xd5,0x5a,0xa4,0xf2,0x74,0xa6,0xa2,0xa2,0x04,0x6b,0xc2,0xb0,0xcf,0x00,0x03,0x00,0x3e,0x00,0x5a,0x05,0x6c,0x03,0xac, -0x00,0x12,0x00,0x1e,0x00,0x2a,0x00,0x49,0x40,0x25,0x19,0x63,0x13,0x1f,0x63,0x25,0x13,0x25,0x13,0x09,0x00,0xf4,0x01,0x01,0x13,0x0d,0x08,0xf4,0x09,0x0c,0x04,0x0b,0x0b,0x0f,0xed,0x04,0x04,0x2c,0x08,0x00,0x00,0x2c,0x1c,0x16,0x28,0x62,0x22,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x33,0x00, -0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0xed,0x10,0xed,0x31,0x30,0x25,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x9c,0x02,0x0c, -0x01,0x3a,0xae,0x88,0xfd,0xf0,0x03,0xb8,0x81,0x99,0xed,0xd5,0xfc,0xf6,0x2a,0x38,0x38,0x2a,0x29,0x39,0x38,0x2a,0x2a,0x38,0x38,0x2a,0x29,0x39,0x38,0x5a,0xa4,0xf2,0x73,0xa7,0xa2,0xa2,0x04,0x6b,0xc2,0xb1,0xce,0x02,0x12,0x3b,0x28,0x29,0x3b,0x3b,0x29,0x29,0x3a,0xfe,0x80,0x38,0x28,0x29,0x3b,0x39,0x29,0x28,0x3a,0x00,0x00,0x01, -0x00,0x66,0xff,0x2d,0x04,0x38,0x04,0xd7,0x00,0x1f,0x00,0x3e,0x40,0x1f,0x01,0xf4,0x40,0x00,0x0e,0x09,0x0a,0x12,0x42,0x15,0x11,0xf4,0x12,0x1b,0x09,0xf4,0x0a,0x14,0x14,0x1b,0x15,0x18,0x0d,0x1d,0xed,0x05,0x05,0x21,0x11,0x09,0x00,0x2f,0x32,0x32,0x11,0x39,0x2f,0xf1,0x39,0x39,0x33,0x33,0xc0,0x2f,0x00,0x2f,0xed,0x39,0xd6,0xed, -0x32,0x2b,0x00,0x18,0x10,0xf6,0x1a,0xed,0x31,0x30,0x17,0x35,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x10,0x21,0x66,0x02,0x04,0xab,0x97,0xbc,0x8a,0xfe,0x00,0x02,0x19,0x01,0x2d,0xb4,0x92,0xfe,0x00,0x03,0xb8,0x8c,0xa6,0x76, -0x60,0xd6,0xfe,0x47,0xd3,0xa2,0x6a,0x75,0x6f,0x93,0xa2,0xe6,0x70,0x8d,0xa2,0xa2,0x04,0x5b,0xbc,0x6f,0xab,0x27,0x61,0xd4,0xfe,0x89,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xcb,0x04,0x00,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x02,0x06,0x00,0x5a,0x00,0x00,0xff,0xff,0x00,0x21,0x00,0x00, -0x03,0x70,0x04,0x00,0x02,0x06,0x00,0x5d,0x00,0x00,0x00,0x01,0x00,0x50,0xff,0xe8,0x02,0xf8,0x04,0x00,0x00,0x17,0x00,0x3d,0x40,0x1f,0x0a,0x08,0x52,0x10,0x10,0x03,0x0f,0x0c,0x95,0x0d,0x0f,0x01,0x03,0x95,0x16,0x16,0x10,0x0a,0x0a,0x06,0x0c,0x0b,0x0f,0x0f,0x13,0x84,0x06,0x06,0x19,0x0c,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0, -0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x50,0x6a,0x92,0x7a,0x8e,0xfe,0xdd,0x3d,0x01,0x06,0xfe,0x56,0x02,0x8b,0xfe,0xed,0x8e,0xa2,0xf0, -0xc6,0x89,0x18,0x96,0x3c,0x66,0x59,0xc1,0x3d,0x01,0x45,0x8c,0x46,0xfe,0xac,0x13,0xa4,0x7c,0x92,0xb9,0x00,0x01,0x00,0x50,0xff,0xe8,0x02,0xfa,0x04,0x18,0x00,0x25,0x00,0x42,0x40,0x22,0x14,0x13,0x07,0x01,0x00,0x0c,0x1f,0x1c,0x1a,0x95,0x1f,0x10,0x09,0x07,0x95,0x0c,0x16,0x00,0x83,0x14,0x14,0x18,0x0f,0x09,0x09,0x22,0x83,0x18, -0x18,0x27,0x1c,0x05,0x83,0x0f,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x10,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x01,0x15,0x06,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x37,0x35,0x36,0x37,0x36,0x35,0x34,0x23,0x22, -0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x01,0xf8,0x2e,0x56,0x7e,0xe5,0x9b,0x76,0x7c,0xa5,0xb3,0xc8,0x9e,0x3a,0x2a,0x2e,0x55,0x7f,0xe6,0x9a,0x76,0x7c,0xa5,0xb3,0xc8,0x9e,0x3a,0x02,0x0a,0x54,0x1e,0x28,0x3a,0x4a,0x7a,0x4c,0x97,0x3f,0x8c,0x72,0x90,0x4a,0x1c,0x1a,0x54,0x1e,0x28,0x3a,0x4a,0x7a,0x4c,0x97,0x3f,0x8c, -0x72,0x90,0x4a,0x1c,0x00,0x01,0x00,0x14,0xff,0xe8,0x04,0x25,0x04,0x18,0x00,0x1b,0x00,0x3b,0x40,0x1e,0x12,0x10,0x09,0x1b,0x0b,0x06,0x19,0x95,0x02,0x16,0x04,0x0d,0x17,0x03,0x0f,0x1b,0x0e,0x15,0x0f,0x40,0x0f,0x09,0x42,0x09,0x09,0x1c,0x0f,0x0f,0x1d,0x1c,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x1a,0x18,0x10,0xdd,0xe2, -0x12,0x17,0x39,0x00,0x3f,0xfd,0x39,0x39,0xd6,0xc4,0x3f,0x31,0x30,0x25,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x04,0x25,0x61,0x82,0x99,0x8d,0x8c,0x94,0x81,0x67,0x6e,0x74,0x60,0x62,0xe9,0xb6,0x9c,0x9b,0xae,0xe7,0x63,0x64,0x71, -0x6a,0x38,0x50,0x7a,0x7a,0x4d,0xa8,0x6b,0x54,0xe7,0xf5,0xa4,0xd2,0xcb,0xa5,0xfc,0xe6,0x54,0x67,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xdf,0x04,0x00,0x02,0x06,0x02,0x0a,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x03,0xb6,0x04,0x00,0x00,0x0b,0x00,0x17,0x40,0x0a,0x04,0x0b,0x0f,0x00,0x09,0x15,0x00,0x00,0x0d,0x09,0x2f,0x11, -0x33,0x2f,0x00,0x3f,0xc4,0x3f,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x03,0xb6,0xb2,0xfe,0xf2,0x02,0x12,0x05,0x05,0x10,0xfe,0xf2,0xb0,0x01,0x79,0xc1,0x03,0x14,0x06,0x4e,0x1b,0x39,0xfc,0xec,0x04,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x02,0x16,0x00,0x00, -0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0x52,0x04,0x00,0x02,0x06,0x07,0x7a,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x04,0x5a,0x04,0x00,0x00,0x13,0x00,0x4c,0x40,0x29,0x0c,0x05,0x0f,0x96,0x40,0x02,0x02,0x03,0x0e,0x09,0x13,0x0f,0x03,0x15,0x11,0x84,0x00,0x0e,0x03,0x0a,0x84,0x07,0x04,0x07,0x42,0x07,0x07,0x14,0x0f,0x0c,0x03,0x84, -0x4f,0x04,0x5f,0x04,0x02,0x04,0x04,0x15,0x14,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x39,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x10,0x05,0x11,0x23,0x11,0x24,0x11,0x11,0x33,0x11,0x14,0x05,0x11,0x33,0x11,0x24,0x35,0x11,0x33,0x04,0x5a, -0xfe,0x54,0xa2,0xfe,0x54,0xa2,0x01,0x0a,0xa2,0x01,0x0a,0xa2,0x02,0x92,0xfe,0xa0,0x18,0xfe,0xe6,0x01,0x1a,0x12,0x01,0x60,0x01,0x74,0xfe,0x92,0xee,0x08,0x02,0x64,0xfd,0x9c,0x0c,0xea,0x01,0x6e,0x00,0x01,0x00,0x0a,0xff,0xf4,0x03,0xd7,0x04,0x00,0x00,0x10,0x00,0x2a,0x40,0x15,0x02,0x95,0x10,0x0f,0x09,0x0b,0x95,0x06,0x01,0x00, -0x15,0x03,0x0f,0x0f,0x09,0x00,0x84,0x01,0x01,0x12,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x00,0x3f,0x10,0xd4,0xfd,0xc6,0x3f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x11,0x21,0x03,0xd7,0xa2,0xfe,0x67,0x0d,0x94,0xa1,0x26,0x2a,0x20,0x1e,0x41,0x48,0x2b,0x02,0xdb, -0x03,0x74,0xfd,0xb0,0xfe,0xd0,0x0c,0x8c,0x0d,0x7e,0x01,0x90,0x01,0x73,0x00,0x02,0x00,0x0a,0x02,0x9a,0x02,0xd7,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x4e,0x40,0x10,0x02,0x08,0x09,0x0a,0x0b,0x0c,0x01,0x0c,0x0d,0x0e,0x0f,0x03,0x04,0x0c,0x04,0x03,0xb8,0x01,0x0e,0xb2,0x0f,0x0f,0x06,0xbc,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x05, -0x01,0x0a,0xb6,0x0f,0x08,0x05,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x00,0x3f,0x3f,0x3f,0x39,0x2f,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x05,0xc0,0x0e,0xc0,0xc0,0x05,0xc0,0xc0,0x01,0x23,0x27,0x21,0x07,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x02,0xd7,0x8f,0x44, -0xfe,0xd5,0x3f,0x90,0x01,0x1d,0x97,0x24,0x63,0x03,0x0a,0x04,0x05,0x09,0x64,0x02,0x9a,0xbe,0xbe,0x03,0x00,0xfe,0x2e,0x01,0x22,0x0a,0x31,0x22,0x19,0xfe,0xde,0x00,0x00,0x02,0xff,0xf6,0x02,0x9a,0x03,0x9e,0x05,0x9a,0x00,0x0f,0x00,0x13,0x00,0x76,0xb5,0x13,0x03,0x04,0x12,0x04,0x0d,0xb8,0x01,0x0e,0xb4,0x40,0x0a,0x06,0x01,0x0a, -0xb8,0x01,0x0e,0xb2,0xff,0x30,0x03,0xb8,0x01,0x0e,0xb3,0x13,0x13,0x06,0x0e,0xb8,0x01,0x0e,0xb2,0x01,0x01,0x05,0xbe,0x01,0x0a,0x00,0x09,0x01,0x0e,0x00,0x12,0x01,0x0e,0x00,0x06,0x01,0x06,0x40,0x09,0x03,0x04,0x12,0x13,0x04,0x05,0x10,0x0a,0x0e,0xb8,0x01,0x0c,0x40,0x09,0x01,0x01,0x05,0x08,0x0c,0x00,0x00,0x15,0x05,0x2f,0x12, -0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x17,0x39,0x00,0x3f,0xed,0xed,0x3f,0x33,0x10,0xed,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x01,0x21,0x35,0x21,0x07,0x23,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x25,0x11,0x23,0x03,0x03,0x9e,0xfe,0x50,0xff,0x00, -0x60,0x98,0x01,0xa2,0x01,0xf6,0xfe,0xe2,0x01,0x09,0xfe,0xf7,0x01,0x2e,0xfe,0x50,0x0f,0xb8,0x02,0x9a,0xbe,0xbe,0x03,0x00,0x71,0xd9,0x6c,0xda,0xbe,0x01,0x63,0xfe,0x9d,0x00,0x00,0x03,0x00,0x7b,0x02,0x9a,0x02,0x89,0x05,0x9a,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0x57,0xb1,0x07,0x14,0xb8,0x01,0x0e,0xb4,0x40,0x0e,0x01,0x00,0x0e, -0xb8,0x01,0x0e,0xb2,0x32,0x30,0x15,0xbe,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x0d,0x01,0x0e,0x00,0x01,0x01,0x06,0xb3,0x06,0x09,0x0e,0x11,0xb8,0x01,0x0c,0xb2,0x04,0x04,0x09,0xb8,0x01,0x0c,0xb4,0x18,0x18,0x1c,0x0e,0x15,0xb9,0x01,0x0c,0x00,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xed, -0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x13,0x11,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x7b,0xe7,0x01,0x06,0x89,0xaa,0x99,0x84,0x6e,0x5a,0x8a,0x8c,0x58,0x6e,0x96,0xa0,0x02,0x9a,0x03,0x00,0xbf,0x7d,0x29,0x02,0x19,0x9f, -0x68,0x79,0x02,0x8f,0xc9,0x66,0x63,0xfe,0xc7,0xe6,0x71,0x75,0x00,0x03,0x00,0x23,0x02,0x9a,0x02,0xb2,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x20,0x00,0x64,0xb5,0x01,0x11,0x14,0x1a,0x04,0x08,0xb8,0x01,0x0e,0xb4,0x40,0x0b,0x0c,0x07,0x0b,0xb8,0x01,0x0e,0xb2,0x32,0x30,0x1b,0xbe,0x01,0x0e,0x00,0x07,0x01,0x0a,0x00,0x13,0x01,0x0e, -0x00,0x0c,0x01,0x06,0xb4,0x11,0x01,0x03,0x14,0x17,0xb8,0x01,0x0c,0xb5,0x0f,0x0f,0x03,0x00,0x00,0x03,0xb8,0x01,0x0c,0xb7,0x1e,0x1e,0x22,0x14,0x0b,0x1b,0x09,0x07,0x2f,0xc6,0xc1,0x39,0x39,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x17,0x39, -0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x20,0x15,0x14,0x07,0x33,0x25,0x15,0x33,0x32,0x35,0x34,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0xb2,0x6a,0x56,0x97,0x86,0xf1,0x6d,0x6d,0xe7,0x01,0x06,0x48,0x7d,0xfe,0x60,0x5a,0x8a,0x8c,0x58,0x6f,0x95,0x9f,0x03,0xf0,0x28,0x58,0x62,0x74, -0x01,0x56,0x70,0x01,0x3a,0xbf,0x53,0x28,0xc9,0xc9,0x66,0x63,0xfe,0xc7,0xe6,0x6d,0x79,0x00,0x00,0x02,0x00,0x7b,0x02,0x9a,0x03,0x08,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x2d,0x41,0x0a,0x00,0x09,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x0e,0x00,0x01,0x01,0x06,0x00,0x04,0x01,0x0c,0xb3,0x0d,0x0d,0x11,0x09,0xb9,0x01,0x0c, -0x00,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x11,0x33,0x20,0x11,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x7b,0xf1,0x01,0x9c,0xe2,0xc0,0x68,0x64,0x89,0x96,0xfe,0xe7,0x02,0x9a,0x03,0x00,0xfe,0x87,0xb1,0xd6,0x02,0x8f,0xfd,0xe1,0x90,0x84,0x01,0x0b,0x00,0x00,0x01,0x00,0x7b, -0x02,0x9a,0x02,0x2b,0x05,0x9a,0x00,0x0b,0x00,0x43,0xb9,0x00,0x09,0x01,0x0e,0xb4,0x40,0x06,0x02,0x01,0x06,0xb8,0x01,0x0e,0xb2,0xff,0x30,0x0a,0xbe,0x01,0x0e,0x00,0x01,0x01,0x0a,0x00,0x05,0x01,0x0e,0x00,0x02,0x01,0x06,0xb6,0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xc4,0xc4, -0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2b,0xfe,0x50,0x01,0x9f,0xfe,0xe4,0x01,0x08,0xfe,0xf8,0x01,0x2d,0x02,0x9a,0x03,0x00,0x71,0xd7,0x70,0xd8,0x00,0x00,0x01,0x00,0x48,0x02,0x9a,0x01,0xf8,0x05,0x9a,0x00,0x0b,0x00,0x43,0xb9,0x00, -0x04,0x01,0x0e,0xb4,0x40,0x07,0x0b,0x00,0x07,0xb8,0x01,0x0e,0xb2,0xff,0x30,0x03,0x41,0x09,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x0e,0x00,0x0b,0x01,0x06,0x00,0x00,0x01,0x0c,0xb6,0x07,0x03,0x03,0x0d,0x09,0x05,0x01,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31, -0x30,0x01,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0xf8,0xfe,0x50,0x01,0x2c,0xfe,0xf8,0x01,0x08,0xfe,0xe4,0x01,0xa0,0x02,0x9a,0x70,0xd8,0x70,0xd7,0x71,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0xcb,0x05,0xaa,0x00,0x19,0x00,0x50,0xb9,0x00,0x17,0x01,0x0e,0xb5,0x18,0x18,0x08,0x15,0x00,0x13,0xba,0x01,0x0e,0x00, -0x02,0x01,0x0b,0xb4,0xaf,0x0b,0x01,0x0b,0x0d,0xba,0x01,0x0e,0x00,0x08,0x01,0x07,0xb6,0x17,0x17,0x16,0x10,0x0b,0x0b,0x19,0xb8,0x01,0x0c,0xb3,0x16,0x16,0x1b,0x10,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xed,0x32,0x32,0x11,0x39,0x2f,0xed,0x31,0x30, -0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x35,0x23,0x35,0x21,0x02,0xcb,0x75,0x96,0xb2,0xd0,0xe7,0xb8,0x77,0x5e,0x62,0x75,0x7a,0x9d,0x8d,0x77,0x49,0x37,0x9c,0x01,0x1f,0x02,0xcb,0x42,0xd0,0xb5,0xb7,0xe5,0x27,0x81,0x38,0xa2,0x82,0x85,0x97,0x1c,0xb2,0x72, -0x00,0x01,0x00,0x7b,0x02,0x9a,0x02,0xea,0x05,0x9a,0x00,0x0b,0x00,0x49,0xb9,0x00,0x03,0x01,0x0e,0xb4,0x40,0x08,0x06,0x05,0x08,0xb8,0x01,0x0e,0xb5,0x32,0x30,0x0b,0x00,0x06,0x05,0xba,0x01,0x0a,0x00,0x06,0x01,0x06,0xb3,0x09,0x08,0x04,0x00,0xbb,0x01,0x0c,0x00,0x01,0x00,0x04,0x01,0x0c,0xb4,0x05,0x01,0x01,0x0d,0x05,0x2f,0x12, -0x39,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x02,0xea,0x84,0xfe,0x98,0x83,0x83,0x01,0x68,0x84,0x02,0x9a,0x01,0x4e,0xfe,0xb2,0x03,0x00,0xfe,0xbe,0x01,0x42,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a, -0x00,0xfe,0x05,0x9a,0x00,0x03,0x00,0x16,0xbe,0x00,0x01,0x01,0x0a,0x00,0x02,0x01,0x06,0x00,0x00,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x13,0x23,0x11,0x33,0xfe,0x83,0x83,0x02,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x0a,0x02,0x87,0x01,0x5e,0x05,0x9a,0x00,0x0c,0x00,0x23,0xb1,0x06,0x08,0xbe,0x01,0x0e,0x00,0x03, -0x01,0x0b,0x00,0x0b,0x01,0x06,0x00,0x0c,0x01,0x0c,0xb3,0x0b,0x0b,0x0e,0x06,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x01,0x5e,0x82,0x74,0x35,0x29,0x2a,0x2c,0x7b,0x83,0x03,0xaa,0x8a,0x99,0x15,0x78,0x1c,0xb6,0x01,0xec,0x00,0x01,0x00,0x7b, -0x02,0x9a,0x02,0xc0,0x05,0x9a,0x00,0x10,0x00,0x21,0xbb,0x00,0x07,0x01,0x0a,0x00,0x08,0x01,0x06,0xb5,0x0f,0x00,0x12,0x10,0x0a,0x05,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xe1,0x32,0x32,0x10,0xd6,0xc6,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x03,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x13,0x33,0x01,0x02,0xc0,0xa8,0xe9, -0x1f,0x0e,0x04,0x83,0x83,0x04,0x10,0x1d,0xe1,0x9c,0xfe,0xd7,0x02,0x9a,0x01,0x31,0x28,0x1d,0xfe,0x8a,0x03,0x00,0xfe,0x99,0x19,0x26,0x01,0x28,0xfe,0x8d,0x00,0x01,0x00,0x7b,0x02,0x9a,0x02,0x25,0x05,0x9a,0x00,0x05,0x00,0x22,0xbd,0x00,0x04,0x01,0x0e,0x00,0x01,0x01,0x0a,0x00,0x02,0x01,0x06,0xb3,0x00,0x00,0x07,0x04,0xb9,0x01, -0x0c,0x00,0x01,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x21,0x02,0x25,0xfe,0x56,0x83,0x01,0x27,0x02,0x9a,0x03,0x00,0xfd,0x70,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0xb6,0x05,0x9a,0x00,0x1b,0x00,0x27,0xbe,0x00,0x11,0x01,0x0a,0x00,0x13,0x01,0x06,0x00,0x1a,0x00,0x00,0x01,0x0c,0xb4, -0x01,0x01,0x1d,0x13,0x10,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x03,0xb6,0x83,0x07,0x05,0x07,0x10,0xd6,0x62,0xd8,0x0a,0x0e,0x04, -0x04,0x7b,0xbd,0xc6,0x14,0x08,0x04,0x11,0x0f,0xc2,0xb6,0x02,0x9a,0x01,0xe9,0x3b,0x58,0x20,0x36,0xfd,0xda,0x02,0x20,0x18,0x46,0x40,0x6a,0xfe,0x2c,0x03,0x00,0xfe,0x08,0x32,0x2c,0x3e,0x24,0x01,0xf4,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0x06,0x05,0x9a,0x00,0x11,0x00,0x29,0xbb,0x00,0x08,0x01,0x0a,0x00,0x0a,0x01,0x06,0xb3, -0x0a,0x01,0x07,0x11,0xb8,0x01,0x0c,0xb3,0x10,0x10,0x13,0x07,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x01,0x26,0x27,0x23,0x17,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x27,0x11,0x33,0x03,0x06,0x8d,0xfe,0xb2,0x15,0x1c,0x04,0x02,0x7d,0x93,0x01,0x48,0x15,0x1c, -0x05,0x03,0x7d,0x02,0x9a,0x01,0xfc,0x1f,0x3d,0x6f,0xfe,0x17,0x03,0x00,0xfe,0x0e,0x1f,0x3d,0x6e,0x01,0xe0,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0x06,0x05,0x9a,0x00,0x11,0x00,0x29,0xbb,0x00,0x07,0x01,0x0a,0x00,0x09,0x01,0x06,0xb3,0x10,0x07,0x0a,0x00,0xb8,0x01,0x0c,0xb3,0x01,0x01,0x13,0x0a,0xb9,0x01,0x0c,0x00,0x08,0x2f, -0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x07,0x33,0x36,0x37,0x01,0x33,0x03,0x06,0x7d,0x03,0x05,0x0d,0x24,0xfe,0xb2,0x8d,0x7d,0x02,0x04,0x0e,0x23,0x01,0x47,0x94,0x02,0x9a,0x01,0xe9,0x6f,0x1e,0x3e,0xfe,0x04,0x03,0x00,0xfe,0x20,0x6e,0x1e, -0x3e,0x01,0xf2,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x03,0x2b,0x05,0xaa,0x00,0x0b,0x00,0x17,0x00,0x2d,0x41,0x0a,0x00,0x12,0x01,0x0e,0x00,0x00,0x01,0x0b,0x00,0x0c,0x01,0x0e,0x00,0x06,0x01,0x07,0x00,0x09,0x01,0x0c,0xb3,0x15,0x15,0x19,0x0f,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31, -0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xae,0xa6,0xca,0xd3,0xa9,0xa7,0xca,0xd2,0xa3,0x6c,0x86,0x82,0x6c,0x6c,0x86,0x82,0x02,0x89,0xd9,0xb0,0xb7,0xe1,0xd8,0xb1,0xb5,0xe3,0x02,0xb1,0x9e,0x84,0x83,0x9b,0x9d,0x83,0x83,0x9d,0x00,0x02, -0x00,0x3e,0x02,0x89,0x02,0xcf,0x05,0x9a,0x00,0x1b,0x00,0x27,0x00,0x5c,0xb2,0x12,0x00,0x1c,0xb8,0x01,0x0e,0xb3,0x09,0x09,0x04,0x22,0xbf,0x01,0x0e,0x00,0x17,0x01,0x0b,0x00,0x0e,0x00,0x04,0x01,0x06,0x00,0x0b,0x01,0x0c,0xb6,0x10,0x10,0x14,0x1a,0x05,0x05,0x07,0xb8,0x01,0x0c,0xb5,0x02,0x02,0x12,0x00,0x1a,0x14,0xb8,0x01,0x0c, -0xb3,0x25,0x25,0x29,0x1f,0xb9,0x01,0x0c,0x00,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x13,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x15,0x14, -0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0xdd,0x75,0x19,0x7d,0x16,0x9d,0x9e,0x15,0x80,0x16,0x73,0x9e,0xba,0x92,0x92,0xb3,0x01,0x47,0x58,0x6d,0x6e,0x57,0x58,0x6f,0x73,0x04,0x7f,0x35,0x75,0x35,0x3c,0x2e,0x37,0x83,0x83,0x3b,0x2a,0x38,0x39,0x70,0x3a,0x3f,0xa2,0x7a,0x9b,0x96, -0x79,0xa0,0x0a,0x59,0x4b,0x4a,0x5a,0x58,0x4c,0x48,0x5c,0x00,0x00,0x02,0x00,0x7b,0x02,0x9a,0x02,0x83,0x05,0x9a,0x00,0x09,0x00,0x10,0x00,0x35,0xb9,0x00,0x00,0x01,0x0e,0xb3,0x0b,0x0b,0x03,0x02,0xbe,0x01,0x0a,0x00,0x0a,0x01,0x0e,0x00,0x03,0x01,0x06,0x00,0x06,0x01,0x0c,0xb4,0x0e,0x0e,0x12,0x0b,0x01,0xb9,0x01,0x0c,0x00,0x02, -0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x11,0x23,0x11,0x33,0x20,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0xfe,0x83,0xef,0x01,0x19,0xa1,0x86,0x5e,0x54,0xaa,0xa4,0x03,0xa6,0xfe,0xf4,0x03,0x00,0xf2,0x71,0x91,0x01,0x83,0xfe,0xed,0x8e,0x85,0x00,0x02,0x00,0x7b, -0x02,0x9a,0x02,0xa4,0x05,0x9a,0x00,0x11,0x00,0x18,0x00,0x42,0xb1,0x0f,0x05,0xb8,0x01,0x0e,0xb4,0x13,0x13,0x08,0x00,0x07,0xbc,0x01,0x0a,0x00,0x12,0x01,0x0e,0x00,0x08,0x01,0x06,0xb4,0x0f,0x13,0x00,0x00,0x0c,0xb8,0x01,0x0c,0xb4,0x16,0x16,0x1a,0x13,0x06,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f, -0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x23,0x27,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x17,0x01,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0xa4,0x96,0x5c,0x2a,0x4a,0x40,0x83,0x01,0x00,0x7f,0x89,0xae,0x37,0x29,0xfe,0xc9,0x68,0x94,0x90,0x02,0x9a,0xd2,0x61,0xfe, -0xcd,0x03,0x00,0x73,0x65,0xa8,0x22,0x02,0x16,0x59,0x01,0xa2,0xeb,0x78,0x73,0x00,0x00,0x01,0x00,0x0a,0x02,0x9a,0x02,0x48,0x05,0x9a,0x00,0x07,0x00,0x2d,0xbe,0x00,0x03,0x01,0x0a,0x00,0x01,0x00,0x04,0x01,0x0e,0x00,0x06,0x01,0x06,0xb4,0x00,0x03,0x05,0x05,0x02,0xb8,0x01,0x0c,0xb3,0x03,0x03,0x09,0x08,0x11,0x12,0x39,0x2f,0xf1, -0xc0,0x2f,0x10,0xc4,0x00,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x02,0x48,0xde,0x82,0xde,0x02,0x3e,0x05,0x29,0xfd,0x71,0x02,0x8f,0x71,0x00,0x00,0x01,0x00,0x74,0x02,0x89,0x02,0xdb,0x05,0x9a,0x00,0x0d,0x00,0x2b,0x41,0x09,0x00,0x09,0x01,0x0e,0x00,0x02,0x01,0x0b,0x00,0x0d,0x00,0x05,0x01,0x06, -0x00,0x0d,0x01,0x0c,0xb3,0x0c,0x0c,0x0f,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x31,0x30,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x02,0xdb,0xfe,0xc5,0xfe,0xd4,0x84,0xb0,0xb0,0x83,0x03,0xd3,0xfe,0xb6,0x01,0x3f,0x01,0xd2,0xfe,0x35,0xd5,0xd5,0x01, -0xcb,0x00,0x00,0x01,0x00,0x10,0x02,0x9a,0x04,0x25,0x05,0x9a,0x00,0x1b,0x00,0x15,0xbb,0x00,0x0a,0x01,0x0a,0x00,0x0b,0x01,0x06,0xb2,0x00,0x1d,0x0b,0x2f,0x10,0xc6,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37, -0x13,0x04,0x25,0xc7,0x9e,0x8f,0x0a,0x02,0x04,0x05,0x0a,0x95,0x9e,0xcf,0x92,0x85,0x09,0x03,0x07,0x02,0x0e,0x9c,0x88,0x8e,0x0a,0x04,0x06,0x02,0x0c,0x82,0x05,0x9a,0xfd,0x00,0x02,0x0e,0x25,0x2d,0x2c,0x24,0xfd,0xf0,0x03,0x00,0xfd,0xdf,0x26,0x2a,0x1f,0x31,0x02,0x21,0xfd,0xda,0x26,0x25,0x19,0x35,0x02,0x23,0x00,0x02,0x00,0x3e, -0x02,0x89,0x02,0x1e,0x04,0xcf,0x00,0x14,0x00,0x1d,0x00,0x61,0x40,0x0c,0x02,0x05,0x16,0x0f,0x30,0x11,0x17,0x48,0x0f,0x0f,0x0d,0x16,0xb8,0x01,0x0d,0xb4,0x40,0x0b,0x12,0x05,0x0b,0xb8,0x01,0x0d,0xb2,0x30,0x30,0x1b,0x41,0x0b,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x0d,0x01,0x0d,0x00,0x12,0x01,0x09,0x00,0x00, -0x01,0x0c,0xb6,0x16,0x0b,0x01,0x01,0x1f,0x0f,0x19,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x2b,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33, -0x32,0x15,0x07,0x35,0x07,0x06,0x15,0x14,0x33,0x32,0x36,0x02,0x1e,0x7e,0x02,0x38,0x76,0x53,0x5f,0xc2,0xa0,0x6f,0x64,0x59,0x56,0x76,0xde,0x7e,0x79,0x6d,0x5e,0x3c,0x4c,0x02,0x9a,0x50,0x61,0x59,0x4b,0x9b,0x1c,0x16,0x72,0x3f,0x71,0x31,0xd7,0x81,0x2f,0x10,0x0e,0x4e,0x50,0x4e,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x48,0x04,0xcf, -0x00,0x14,0x00,0x1d,0x00,0x61,0xb9,0x00,0x04,0xff,0xd0,0xb6,0x11,0x17,0x48,0x04,0x04,0x02,0x00,0xb8,0x01,0x0d,0x40,0x0c,0x15,0x5f,0x15,0x01,0x15,0x40,0x18,0x1b,0x48,0x15,0x0f,0x02,0x41,0x09,0x01,0x0d,0x00,0x07,0x01,0x0b,0x00,0x0a,0x01,0x08,0x00,0x1a,0x01,0x0d,0x00,0x0f,0x01,0x09,0xb2,0x04,0x04,0x12,0xb8,0x01,0x0c,0xb5, -0x18,0x18,0x1f,0x15,0x00,0x0b,0xb9,0x01,0x0c,0x00,0x0a,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x11,0x39,0x2b,0x71,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30,0x13,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x35,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x37,0x36,0x35, -0x34,0x23,0x22,0x06,0x15,0xe6,0x6e,0x64,0x58,0x54,0x76,0xe0,0x80,0x02,0x37,0x77,0x52,0x60,0xc3,0x9f,0x78,0x6d,0x5f,0x3a,0x4c,0x03,0x5e,0x72,0x3f,0x71,0x31,0xd7,0x01,0x5e,0x50,0x61,0x5c,0x48,0x9b,0x1c,0x3e,0x10,0x0f,0x4d,0x50,0x4e,0x3e,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x60,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x41, -0xb3,0x0e,0x02,0x0b,0x19,0x41,0x0d,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x10,0x01,0x08,0x00,0x15,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x00,0x01,0x0c,0xb5,0x11,0x0e,0x01,0x01,0x1d,0x17,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31, -0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0x7e,0x03,0x42,0x76,0x68,0x81,0x8e,0x6e,0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x90,0x8e,0x42,0x52,0x02,0x9a,0x50,0x61,0x97,0x80,0x84,0xab,0x54,0x43,0xfe,0xda,0x2e,0x46, -0x5c,0xc2,0xb6,0x5e,0x00,0x03,0x00,0x48,0x02,0x89,0x03,0xa2,0x04,0xcf,0x00,0x22,0x00,0x2b,0x00,0x30,0x00,0xa9,0x40,0x09,0x1a,0x0a,0x0c,0x18,0x15,0x15,0x13,0x10,0x04,0xb8,0xff,0xd0,0xb6,0x11,0x17,0x48,0x04,0x04,0x02,0x00,0xb8,0x01,0x0d,0x40,0x0d,0x23,0x5f,0x23,0x01,0x23,0x40,0x18,0x1b,0x48,0x23,0x1d,0x02,0x10,0xb8,0x01, -0x0d,0x40,0x0c,0x03,0x2d,0x13,0x2d,0x23,0x2d,0x03,0x2d,0x2d,0x13,0x0c,0x02,0xb8,0x01,0x0d,0xb2,0x07,0x07,0x2f,0xbc,0x01,0x0d,0x00,0x0c,0x01,0x0b,0x00,0x28,0x01,0x0d,0xb3,0x1d,0x1d,0x13,0x18,0xb8,0x01,0x09,0xb5,0x00,0x09,0x1a,0x2c,0x04,0x23,0xb8,0x01,0x0c,0xb6,0x11,0x11,0x20,0x10,0x04,0x04,0x20,0xb8,0x01,0x0c,0xb4,0x26, -0x26,0x32,0x15,0x2d,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x00,0x3f,0xcd,0x33,0x10,0xed,0x3f,0xed,0x33,0x10,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x2b,0x71,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x39,0x31,0x30,0x01, -0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x37,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x07,0x23,0x16,0x33,0x32,0x02,0x40,0x6e,0x64,0x58,0x54,0x76,0x7e,0x32,0x04,0x48,0x6a,0x72,0x80,0x01,0x78, -0x08,0x9c,0x5c,0x4e,0x4a,0x73,0x97,0x44,0x04,0x43,0x8a,0x58,0x6f,0xc3,0x9f,0x78,0x6d,0x5f,0x3a,0x4c,0x80,0xfe,0x02,0x7a,0x78,0x03,0x5e,0x72,0x3f,0x71,0x31,0x50,0x50,0x93,0x7a,0x43,0x8f,0x35,0x6f,0x2d,0x6b,0x6b,0x5e,0x46,0x9b,0x1c,0x3e,0x10,0x0f,0x4d,0x50,0x4e,0x3e,0x6b,0x8b,0x00,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x89, -0x05,0xc4,0x00,0x10,0x00,0x1b,0x00,0x41,0xb3,0x06,0x01,0x09,0x15,0x41,0x0d,0x01,0x0d,0x00,0x0f,0x01,0x0b,0x00,0x03,0x01,0x0a,0x00,0x19,0x01,0x0d,0x00,0x09,0x01,0x09,0x00,0x04,0x01,0x06,0x00,0x0c,0x01,0x0c,0xb5,0x17,0x17,0x1d,0x12,0x06,0x02,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f, -0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x23,0x15,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x80,0x02,0x42,0x76,0x68,0x81,0x8f,0x6c,0x72,0x36,0x51,0x40,0x91,0x8d,0x43,0x52,0x02,0xdd,0x43,0x03,0x2a,0xfe,0xaa,0x61, -0x97,0x80,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x60,0x05,0xc4,0x00,0x10,0x00,0x1b,0x00,0x41,0xb3,0x0e,0x02,0x0b,0x19,0x41,0x0d,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x15,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x10,0x01,0x06,0x00,0x10,0x01,0x0c,0xb5,0x12,0x02, -0x0f,0x0f,0x1d,0x17,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0x7e,0x03,0x42,0x76,0x68, -0x81,0x8e,0x6e,0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x92,0x8e,0x42,0x54,0x02,0x9a,0x50,0x61,0x97,0x80,0x84,0xab,0x54,0x01,0x49,0xfd,0xd4,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x35,0x04,0xcf,0x00,0x11,0x00,0x16,0x00,0x4e,0xb3,0x05,0x05,0x03,0x01,0xb8,0x01,0x0d,0x40,0x0b,0x0c,0x16,0x1c,0x16, -0x2c,0x16,0x03,0x16,0x16,0x0e,0x03,0xbe,0x01,0x0d,0x00,0x08,0x01,0x0b,0x00,0x14,0x01,0x0d,0x00,0x0e,0x01,0x09,0xb2,0x05,0x05,0x00,0xb8,0x01,0x0c,0xb4,0x12,0x12,0x18,0x16,0x01,0xb9,0x01,0x0c,0x00,0x0b,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30, -0x01,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x07,0x02,0x35,0xfe,0x87,0x0a,0x9a,0x5c,0x4e,0x48,0x78,0x7e,0x8e,0x92,0x72,0x71,0x82,0x7b,0x02,0x78,0x78,0x0c,0x03,0x7f,0x8f,0x35,0x6f,0x2d,0x97,0x88,0x81,0xa6,0x91,0x7c,0x20,0x8a,0x8a,0x00,0x00,0x02,0x00,0x48, -0x02,0x87,0x02,0x40,0x04,0xd1,0x00,0x11,0x00,0x16,0x00,0x4c,0xb3,0x05,0x05,0x03,0x00,0xb8,0x01,0x0d,0x40,0x0b,0x03,0x13,0x13,0x13,0x23,0x13,0x03,0x13,0x13,0x03,0x15,0x41,0x09,0x01,0x0d,0x00,0x0e,0x01,0x0b,0x00,0x03,0x01,0x0d,0x00,0x08,0x01,0x09,0x00,0x0b,0x01,0x0c,0xb5,0x01,0x12,0x12,0x18,0x05,0x13,0xb9,0x01,0x0c,0x00, -0x00,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30,0x13,0x21,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x05,0x23,0x16,0x33,0x32,0x48,0x01,0x78,0x09,0x9b,0x5c,0x4e,0x4a,0x77,0x7c,0x91,0x94,0x70,0x72,0x82,0x01,0x78, -0xfe,0x02,0x7a,0x74,0x03,0xd9,0x91,0x35,0x6f,0x2d,0x99,0x88,0x81,0xa8,0x94,0x7b,0x1f,0x8d,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xdb,0x04,0xcf,0x00,0x1e,0x00,0x5b,0xb1,0x06,0x17,0xb8,0x01,0x0d,0xb4,0x40,0x16,0x0c,0x02,0x16,0xb8,0x01,0x0d,0xb3,0x30,0x30,0x1e,0x1c,0xbf,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0f,0x00,0x11,0x01, -0x0d,0x00,0x0c,0x01,0x09,0x40,0x0b,0x06,0x04,0x17,0x17,0x1a,0x0f,0x00,0x00,0x20,0x04,0x13,0xbc,0x01,0x0c,0x00,0x09,0x00,0x1a,0x01,0x0c,0x00,0x04,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x35, -0x34,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x15,0x14,0x33,0x32,0x37,0x01,0xdb,0x49,0x58,0xfc,0x7a,0x66,0x80,0x6e,0x4d,0x40,0x3e,0x49,0x71,0x8b,0x32,0x34,0x9e,0x88,0x55,0x3e,0x02,0xa4,0x1b,0xa4,0x6f,0x1c,0x04,0x20,0x59,0x48,0x52,0x17,0x68,0x1c,0x41,0x47,0x63, -0x4c,0x49,0x1c,0x00,0x00,0x01,0x00,0x42,0x02,0x89,0x01,0xdf,0x04,0xcf,0x00,0x1e,0x00,0x54,0xb1,0x01,0x11,0xb8,0x01,0x0d,0xb5,0x10,0x10,0x16,0x06,0x09,0x0b,0xbf,0x01,0x0d,0x00,0x06,0x01,0x0b,0x00,0x18,0x00,0x16,0x01,0x0d,0x00,0x1b,0x01,0x09,0xb6,0x01,0x1d,0x11,0x11,0x14,0x18,0x0d,0xb8,0x01,0x0c,0xb2,0x03,0x03,0x1d,0xb8, -0x01,0x0c,0xb4,0x14,0x14,0x20,0x09,0x18,0x2f,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35, -0x36,0x33,0x32,0x15,0x14,0x01,0x64,0x67,0x81,0x6d,0x4d,0x40,0x3e,0x49,0x71,0x8c,0x30,0x32,0x9e,0x87,0x55,0x3e,0x49,0x59,0xfb,0x03,0xa0,0x04,0x1f,0x5a,0x49,0x51,0x17,0x68,0x1c,0x41,0x47,0x63,0x4c,0x49,0x1c,0x64,0x1b,0xa4,0x6f,0x00,0x00,0x02,0x00,0x3e,0x01,0x94,0x02,0x60,0x04,0xcf,0x00,0x18,0x00,0x23,0x00,0x4e,0xb3,0x05, -0x05,0x0d,0x07,0xb8,0x01,0x0d,0xb5,0x02,0x02,0x15,0x0a,0x13,0x21,0x41,0x0b,0x01,0x0d,0x00,0x0d,0x01,0x0b,0x00,0x18,0x01,0x08,0x00,0x1d,0x01,0x0d,0x00,0x13,0x01,0x09,0x00,0x18,0x01,0x0c,0xb5,0x16,0x0a,0x19,0x19,0x25,0x1f,0xb8,0x01,0x0c,0xb1,0x05,0x10,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f, -0xed,0x12,0x39,0x39,0xc4,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x01,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0xfe,0xbe,0x62,0x4a,0x58,0x59,0xbf,0x03,0x42,0x76,0x68,0x81,0x8e,0x6e, -0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x90,0x8e,0x42,0x52,0x02,0xbc,0xfe,0xd8,0x22,0x79,0x31,0xbc,0x30,0x61,0x97,0x80,0x84,0xab,0x54,0x43,0xfe,0xda,0x2e,0x46,0x5c,0xc2,0xb6,0x5e,0x00,0x00,0x02,0x00,0x58,0x01,0x94,0x00,0xf6,0x04,0xbe,0x00,0x03,0x00,0x0b,0x00,0x22,0xb4,0x01,0x08,0x40,0x04,0x02,0xb8,0x01,0x08,0xb6,0x01,0x00, -0x06,0x0a,0xff,0x3a,0x00,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x2b,0x00,0x18,0x3f,0xd4,0x1a,0xdd,0xce,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0xe8,0x82,0x82,0x42,0x4e,0x50,0x4e,0x02,0x9a,0x02,0x24,0xfc,0xd6,0x4b,0x4c,0x4c,0x4b,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x56,0x05,0xc4,0x00,0x0c, -0x00,0x2e,0xb5,0x03,0x08,0x0c,0x03,0x05,0x00,0xbc,0x01,0x0a,0x00,0x0b,0x01,0x08,0x00,0x06,0x01,0x07,0xb5,0x0b,0x00,0x0e,0x0c,0x08,0x03,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x32,0x32,0x10,0xd6,0xc6,0x00,0x3f,0x3f,0x3f,0x33,0x17,0x39,0x31,0x30,0x01,0x23,0x03,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x37,0x33,0x03,0x02,0x56,0xa0, -0xce,0x02,0x80,0x80,0x02,0xc2,0x9c,0xde,0x02,0x9a,0x01,0x0e,0xfe,0xf2,0x03,0x2a,0xfd,0xfc,0xfe,0xfe,0xfc,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x03,0x9a,0x04,0xcf,0x00,0x1d,0x00,0x59,0xb6,0x01,0x09,0x14,0x19,0x04,0x17,0x11,0xba,0x01,0x0a,0x00,0x12,0x01,0x08,0xb2,0x1b,0x04,0x0c,0xbb,0x01,0x0d,0x00,0x40,0x00,0x17,0x01,0x09, -0xb3,0x19,0x08,0x14,0x00,0xb8,0x01,0x0c,0xb7,0x01,0x0e,0x09,0x11,0x09,0x42,0x14,0x10,0xbb,0x01,0x0c,0x00,0x11,0x00,0x08,0x01,0x0c,0xb3,0x09,0x09,0x1f,0x1e,0x11,0x12,0x39,0x2f,0xe1,0x2f,0xe1,0x32,0x2b,0x01,0x10,0xf0,0xe1,0x11,0x12,0x39,0x00,0x18,0x3f,0x1a,0xed,0x39,0x39,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x23,0x11, -0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x03,0x9a,0x80,0x68,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x02,0x9a,0x01,0x3b,0x8f,0x54,0x3f,0xfe,0xc9,0x01,0x3f,0x8b,0x52,0x45,0xfe,0xcd,0x02, -0x24,0x52,0x63,0x6f,0x6f,0xe3,0x00,0x01,0x00,0x66,0x01,0x98,0x02,0x50,0x04,0xcf,0x00,0x19,0x00,0x40,0xb1,0x05,0x07,0x41,0x0a,0x01,0x0d,0x00,0x02,0x00,0x11,0x01,0x0a,0x00,0x12,0x01,0x08,0x00,0x0c,0x01,0x0d,0x00,0x17,0x01,0x09,0xb3,0x05,0x05,0x10,0x00,0xb8,0x01,0x0c,0xb4,0x09,0x09,0x1b,0x14,0x10,0xb9,0x01,0x0c,0x00,0x11, -0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xd4,0xfd,0xc6,0x31,0x30,0x01,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0xd9,0x2b,0x25,0x22,0x23,0x65,0x6d,0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02, -0xa6,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xcf,0x00,0x0b,0x00,0x17,0x00,0x2d,0x41,0x0a,0x00,0x12,0x01,0x0d,0x00,0x00,0x01,0x0b,0x00,0x0c,0x01,0x0d,0x00,0x06,0x01,0x09,0x00,0x09,0x01,0x0c,0xb3,0x15,0x15,0x19,0x0f,0xb9, -0x01,0x0c,0x00,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x58,0x80,0x9a,0xa2,0x84,0x80,0x9b,0xa3,0x7e,0x49,0x57,0x58,0x48,0x49,0x57,0x57,0x02,0x89,0x9e,0x7f,0x87,0xa2, -0x9f,0x7e,0x88,0xa1,0x01,0xdb,0x62,0x56,0x56,0x62,0x62,0x56,0x58,0x60,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xec,0x04,0xcf,0x00,0x15,0x00,0x2e,0xb1,0x01,0x03,0x41,0x0a,0x01,0x0d,0x00,0x14,0x01,0x0b,0x00,0x0b,0x00,0x09,0x01,0x0d,0x00,0x0e,0x01,0x09,0x00,0x11,0x01,0x0c,0xb4,0x06,0x06,0x17,0x0b,0x00,0x2f,0x32,0x11,0x39,0x2f, -0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x3e,0x35,0x45,0x52,0x60,0x5a,0x50,0x49,0x39,0x45,0x56,0x7c,0x97,0xa4,0x88,0x50,0x02,0xa2,0x78,0x26,0x62,0x56,0x56,0x62,0x28,0x70,0x23,0x9f,0x80,0x8b,0x9c,0x00, -0x00,0x01,0x00,0x3e,0x03,0xac,0x02,0x7f,0x04,0xcf,0x00,0x0d,0x00,0x26,0xb2,0x01,0x07,0x04,0xbc,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x00,0x01,0x0c,0xb3,0x01,0x01,0x0f,0x07,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x32,0x31,0x30,0x01,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33, -0x32,0x16,0x02,0x7f,0x81,0x57,0x49,0x49,0x57,0x80,0xa5,0x81,0x82,0x99,0x03,0xac,0x58,0x60,0x62,0x56,0x84,0x9f,0xa1,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0x7f,0x03,0xac,0x00,0x0d,0x00,0x26,0xb2,0x00,0x06,0x0a,0xbc,0x01,0x0d,0x00,0x03,0x01,0x0b,0x00,0x00,0x01,0x0c,0xb3,0x0d,0x0d,0x0f,0x07,0xb9,0x01,0x0c,0x00,0x06,0x2f, -0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc4,0x32,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x02,0x7f,0xa5,0x82,0x80,0x9a,0x80,0x58,0x48,0x49,0x57,0x03,0xac,0x84,0x9f,0xa0,0x83,0x56,0x62,0x62,0x56,0x00,0x00,0x02,0x00,0x66,0x01,0xa4,0x02,0x89,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x3e, -0xb4,0x03,0x06,0x00,0x09,0x15,0x41,0x0b,0x01,0x0d,0x00,0x0f,0x01,0x0b,0x00,0x04,0x01,0x08,0x00,0x19,0x01,0x0d,0x00,0x09,0x01,0x09,0x00,0x0c,0x01,0x0c,0xb5,0x17,0x17,0x1d,0x11,0x01,0x05,0xb9,0x01,0x0c,0x00,0x04,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0xc4,0x31,0x30,0x13,0x23, -0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x80,0x02,0x42,0x76,0x68,0x81,0x8f,0x6c,0x72,0x36,0x51,0x40,0x91,0x8d,0x43,0x52,0x02,0xdd,0xfe,0xc7,0x03,0x1a,0x50,0x61,0x97,0x80,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6, -0x60,0x00,0x00,0x01,0x00,0x0a,0x02,0x8e,0x01,0x68,0x05,0x62,0x00,0x13,0x00,0x45,0xb1,0x13,0x11,0xba,0x01,0x0d,0x00,0x02,0x01,0x0b,0xb4,0x0a,0x0b,0x0e,0x0b,0x05,0xba,0x01,0x0d,0x00,0x08,0x01,0x08,0xb7,0x0d,0x13,0x13,0x15,0x05,0x0e,0x05,0x0b,0xb8,0x01,0x0c,0x40,0x09,0x07,0x10,0x08,0x20,0x08,0x30,0x08,0x03,0x08,0x2f,0x5d, -0xcd,0xe1,0x39,0x39,0x11,0x12,0x39,0x2f,0xc4,0x00,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x15,0x14,0x33,0x32,0x37,0x01,0x68,0x22,0x40,0xa0,0x5c,0x5c,0x80,0x82,0x82,0x49,0x1e,0x1b,0x02,0xa0,0x12,0xbe,0x01,0x08,0x6a,0x80,0x24,0xa4, -0x6a,0xfe,0x5e,0x10,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x46,0x04,0xbe,0x00,0x11,0x00,0x36,0xb3,0x11,0x02,0x08,0x0c,0x41,0x0a,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x08,0x00,0x02,0x00,0x11,0x01,0x0c,0xb3,0x10,0x10,0x13,0x09,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xc4,0x00,0x3f, -0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x46,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x80,0x02,0x9a,0x56,0x67,0xe7,0x01,0x4e,0xfe,0xce,0x98,0x53,0x40,0x01,0x37,0x00,0x01,0x00,0x3e,0x02,0xb8,0x02,0x72,0x04,0xa2,0x00,0x12, -0x00,0x2e,0x40,0x15,0x00,0x0e,0x40,0x01,0x09,0x0d,0x08,0x09,0x08,0x42,0x08,0x09,0x0c,0x00,0x09,0x0a,0x0f,0x04,0x04,0x14,0x09,0x2f,0x12,0x39,0x2f,0xdd,0xc4,0x12,0x39,0x39,0x00,0x2f,0xcd,0x2b,0x00,0x18,0x10,0xc4,0x10,0xd6,0x1a,0xed,0x31,0x30,0x13,0x35,0x21,0x32,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15, -0x14,0x06,0x23,0x3e,0x01,0x32,0x98,0x54,0x40,0xfe,0xca,0x02,0x24,0x4c,0x5c,0x7c,0x6a,0x02,0xb8,0x80,0x6c,0x38,0x47,0x7f,0x7f,0x02,0x3f,0x69,0x58,0x69,0x00,0x01,0x00,0x60,0x02,0x89,0x03,0x94,0x04,0xbe,0x00,0x1d,0x00,0x67,0x40,0x09,0x02,0x07,0x14,0x1d,0x04,0x0c,0x18,0x05,0x10,0xbf,0x01,0x0d,0x00,0x40,0x00,0x09,0x01,0x0b, -0x00,0x00,0x01,0x0a,0x00,0x0c,0x01,0x08,0xb4,0x07,0x14,0x02,0x02,0x1d,0xb8,0x01,0x0c,0xb6,0x1c,0x0e,0x14,0x0c,0x14,0x42,0x0d,0xb8,0x01,0x0c,0xb6,0x00,0x0c,0x01,0x0b,0x03,0x0c,0x15,0xb8,0x01,0x0c,0xb3,0x14,0x1e,0x1f,0x14,0xb8,0x01,0x0c,0xb1,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0x2f,0x5f,0x5e,0x5d,0xe1,0x2b,0x01,0x10,0xf0, -0xe1,0xc1,0x18,0x2f,0x12,0x39,0x00,0x3f,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0x94,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x7f,0x69,0x31,0x41, -0x80,0x68,0x32,0x40,0x80,0x02,0x9a,0x52,0x63,0x6f,0x6f,0xe3,0x01,0x52,0xfe,0xc5,0x8f,0x54,0x3f,0x01,0x37,0xfe,0xc1,0x8b,0x52,0x46,0x01,0x32,0x00,0x01,0x00,0x0a,0x02,0x9a,0x02,0x35,0x04,0xbe,0x00,0x0b,0x00,0x1b,0xb3,0x07,0x00,0x03,0x02,0xba,0x01,0x0a,0x00,0x03,0x01,0x08,0xb2,0x00,0x0d,0x03,0x2f,0x10,0xc6,0x00,0x3f,0x3f, -0x12,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x02,0x35,0xc9,0x9b,0xc7,0x8a,0x78,0x0f,0x03,0x05,0x04,0x11,0x78,0x04,0xbe,0xfd,0xdc,0x02,0x24,0xfe,0x8e,0x2f,0x25,0x22,0x32,0x01,0x72,0x00,0x01,0x00,0x14,0x02,0x89,0x02,0x79,0x04,0xcf,0x00,0x1b,0x00,0x4a,0x40,0x0b,0x17,0x0d,0x0b,0x04, -0x06,0x12,0x1b,0x09,0x19,0x02,0x0b,0xbd,0x01,0x0d,0x00,0x40,0x00,0x06,0x01,0x0b,0x00,0x12,0x01,0x09,0x40,0x10,0x04,0x0d,0x17,0x03,0x0f,0x1b,0x0e,0x15,0x15,0x1d,0x0f,0x08,0x0f,0x42,0x08,0x0f,0x2f,0x2f,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0xe2,0x12,0x17,0x39,0x00,0x3f,0x3f,0x1a,0xfd,0x39,0x39,0xd6,0xc4,0x11,0x12,0x39,0x12, -0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x02,0x79,0x3c,0x49,0x60,0x4e,0x4f,0x5b,0x46,0x42,0x43,0x3f,0x36,0x28,0x77,0x6e,0x5d,0x5c,0x6c,0x78,0x2a,0x36,0x41,0x40,0x02,0xb4,0x2b,0x3b,0x3b,0x2b,0x79,0x39, -0x20,0x6b,0x85,0x57,0x74,0x71,0x56,0x84,0x6e,0x22,0x37,0x00,0x00,0x02,0x00,0x60,0x01,0xa4,0x02,0x74,0x05,0xc4,0x00,0x12,0x00,0x25,0x00,0x63,0xb3,0x02,0x11,0x0c,0x13,0xb8,0x01,0x0d,0xb4,0x40,0x14,0x06,0x11,0x14,0xb8,0x01,0x0d,0xb3,0x1e,0x30,0x1d,0x1f,0xbe,0x01,0x0d,0x00,0x11,0x01,0x0b,0x00,0x1a,0x01,0x0d,0x00,0x06,0x01, -0x07,0xb6,0x0c,0x0e,0x13,0x13,0x22,0x1d,0x18,0xb8,0x01,0x0c,0xb2,0x09,0x09,0x0e,0xb8,0x01,0x0c,0xb4,0x22,0x22,0x27,0x1d,0x01,0xb9,0x01,0x0c,0x00,0x02,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x10,0xc4,0x31,0x30,0x13, -0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x15,0x11,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0xdf,0x7f,0x8c,0x74,0x70,0x86,0x7f,0x9d,0x93,0x79,0x4a,0x09,0x1d,0x42,0x51,0x79,0x7f,0x3b,0x46,0x42,0x52,0x60,0x50,0x02,0xa6,0xfe,0xfe, -0x03,0x14,0x7a,0x92,0x7c,0x5c,0x81,0x2f,0x04,0x2e,0x93,0x67,0x87,0x01,0x77,0x62,0x46,0x3a,0x7c,0xa2,0xfe,0x5a,0x22,0x46,0x3a,0x40,0x4c,0x00,0x00,0x01,0xff,0xec,0x01,0xa4,0x02,0x23,0x04,0xbe,0x00,0x13,0x00,0x36,0xb4,0x03,0x0a,0x05,0x07,0x00,0xbb,0x01,0x0a,0x00,0x10,0x00,0x07,0x01,0x08,0xb6,0x0a,0x00,0x05,0x07,0x07,0x00, -0x0d,0xbc,0x01,0x0c,0x00,0x12,0x00,0x00,0x01,0x0c,0x00,0x05,0x2f,0xe1,0xd4,0xe1,0x10,0xc1,0x2f,0x11,0x12,0x39,0x00,0x3f,0x33,0x3f,0x11,0x39,0x39,0xcd,0x31,0x30,0x01,0x14,0x07,0x23,0x36,0x35,0x02,0x03,0x33,0x16,0x17,0x33,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x01,0x50,0x02,0x88,0x0b,0x48,0x9d,0x91,0x75,0x39,0x04,0x75, -0x06,0x80,0x05,0x02,0x83,0xb3,0x2c,0x6e,0x94,0x01,0x06,0x01,0x12,0xda,0xc8,0xa5,0xb1,0x2a,0x22,0x20,0x21,0xe8,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x7f,0x05,0xc4,0x00,0x17,0x00,0x21,0x00,0x4c,0x40,0x09,0x00,0x02,0x0d,0x10,0x18,0x1f,0x06,0x05,0x1d,0xbf,0x01,0x0d,0x00,0x13,0x01,0x0b,0x00,0x08,0x00,0x0a,0x01,0x0d,0x00,0x05, -0x01,0x07,0xb3,0x08,0x08,0x10,0x0c,0xb8,0x01,0x0c,0xb2,0x02,0x16,0x10,0xb8,0x01,0x0c,0xb3,0x1f,0x1f,0x23,0x1a,0xb9,0x01,0x0c,0x00,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xd4,0xe1,0x10,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14, -0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0xee,0x4a,0x72,0x63,0x5f,0x60,0x5e,0x5b,0x5a,0x8f,0xcb,0xa2,0x83,0x81,0x9b,0x01,0x08,0x88,0x56,0x4a,0xa0,0x48,0x04,0xa0,0x37,0x4e,0x45,0x5a,0x2a,0x75,0x39,0x3b,0x25,0x58,0x7c,0x9c,0x72,0x93,0x8f,0x6f,0xa0,0x3b,0x54,0x80, -0x48,0x52,0x9a,0x36,0x5d,0x00,0x00,0x02,0x00,0x3e,0x01,0xa4,0x03,0x06,0x04,0xcf,0x00,0x15,0x00,0x1d,0x00,0x61,0xb3,0x02,0x1c,0x00,0x0d,0x41,0x0a,0x01,0x0d,0x00,0x03,0x01,0x0b,0x00,0x09,0x01,0x08,0x00,0x19,0x01,0x0d,0x00,0x40,0x00,0x10,0x01,0x09,0xb4,0x09,0x09,0x0d,0x0b,0x16,0xb8,0x01,0x0c,0xb6,0x13,0x0e,0x01,0x06,0x02, -0x42,0x0b,0xb8,0x01,0x0c,0xb3,0x06,0x1c,0x0d,0x01,0xb8,0x01,0x0c,0xb3,0x02,0x1e,0x1f,0x02,0xb8,0x01,0x0c,0xb1,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x11,0x12,0x39,0x18,0x2f,0x00,0x3f,0x1a,0xed,0x3f,0x3f,0xed,0x39,0x39,0xcd,0x31,0x30,0x01,0x15,0x23,0x35,0x26,0x26,0x35,0x34,0x37, -0x33,0x06,0x15,0x14,0x17,0x11,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x34,0x26,0x23,0x22,0x15,0x11,0x36,0x01,0xe2,0x80,0x8a,0x9a,0x56,0x86,0x5e,0xa6,0xba,0x68,0x82,0x9e,0x1f,0x3e,0x2f,0x38,0xa5,0x02,0x89,0xe5,0xe5,0x05,0x9c,0x86,0x8a,0x84,0x78,0x90,0xbc,0x06,0x01,0x24,0xb7,0x9b,0x82,0x84,0x9e,0x01,0x1e,0x54,0x62,0x48, -0xfe,0xd8,0x08,0x00,0x00,0x01,0xff,0xf6,0x01,0x94,0x02,0x62,0x04,0xcf,0x00,0x1c,0x00,0x3c,0x40,0x0b,0x06,0x09,0x14,0x17,0x04,0x08,0x16,0x0e,0x0c,0x1c,0x1a,0xb8,0x01,0x0d,0xb3,0x02,0x08,0x11,0x16,0xbc,0x01,0x08,0x00,0x0c,0x01,0x0d,0x00,0x11,0x01,0x09,0xb4,0x16,0x00,0x1e,0x0e,0x08,0x2f,0xc6,0x10,0xd4,0xc4,0x00,0x3f,0xed, -0x3f,0x10,0xd4,0xd4,0xfd,0xc6,0x10,0xc6,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x27,0x27,0x03,0x23,0x13,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x17,0x37,0x33,0x03,0x17,0x16,0x33,0x32,0x37,0x02,0x62,0x20,0x21,0x41,0x4c,0x28,0x47,0xa0,0x8f,0xf0,0x4e,0x29,0x2b,0x13,0x1b,0x1c,0x28,0x6a,0x34,0x3d, -0x7d,0x8c,0xca,0x67,0x2f,0x2e,0x17,0x13,0x01,0x9e,0x0a,0x44,0x5b,0xa8,0xfe,0xc9,0x01,0xb4,0xb0,0x5c,0x0a,0x6c,0x09,0x7b,0x92,0xfc,0xfe,0x8e,0xe6,0x68,0x08,0x00,0xff,0xff,0x00,0x58,0xff,0x42,0x00,0xf6,0x02,0x6c,0x00,0x07,0x07,0xce,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x66,0xff,0x42,0x01,0xa8,0x01,0x70,0x00,0x07,0x06,0x79, -0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x5c,0xff,0x31,0x02,0x46,0x01,0x66,0x00,0x07,0x07,0xba,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x0a,0xff,0x42,0x02,0x35,0x01,0x66,0x00,0x07,0x07,0xbd,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x60,0xfe,0x4c,0x02,0x74,0x02,0x6c,0x00,0x07,0x07,0xbf,0x00,0x00,0xfc,0xa8,0xff,0xff,0xff,0xec,0xfe,0x4c, -0x02,0x23,0x01,0x66,0x00,0x07,0x07,0xc0,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x66,0xfe,0x4c,0x02,0x89,0x01,0x77,0x00,0x07,0x07,0xcf,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x3e,0xfe,0x4c,0x03,0x06,0x01,0x77,0x00,0x07,0x07,0xc2,0x00,0x00,0xfc,0xa8,0xff,0xff,0xff,0xf6,0xfe,0x3c,0x02,0x62,0x01,0x77,0x00,0x07,0x07,0xc3,0x00,0x00, -0xfc,0xa8,0x00,0x01,0x00,0xfc,0x04,0xc2,0x03,0xc4,0x05,0xf2,0x00,0x0c,0x00,0x16,0x40,0x09,0x00,0x07,0x09,0xf2,0x03,0x00,0x0c,0x07,0x06,0x2f,0xcd,0xd4,0xcd,0x00,0x2f,0xfd,0xd6,0xc4,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x03,0xc4,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68, -0x0c,0x05,0xf2,0x8d,0xa3,0xa3,0x8d,0xbc,0x63,0x59,0x00,0x02,0x00,0x58,0x02,0x9a,0x00,0xf6,0x05,0xc4,0x00,0x07,0x00,0x0b,0x00,0x25,0xb3,0x04,0x00,0x40,0x0a,0xba,0x01,0x08,0x00,0x09,0x01,0x0a,0xb6,0x09,0x08,0x02,0x06,0xff,0x3a,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe1,0x2b,0x00,0x18,0x3f,0x3f,0x1a,0xde,0xcd,0x31,0x30,0x13, -0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x03,0x23,0x11,0x33,0xa6,0x4e,0x50,0x4e,0x0e,0x82,0x82,0x05,0x2d,0x4c,0x4b,0x4b,0x4c,0xfd,0x6d,0x02,0x24,0x00,0x02,0x00,0x66,0x01,0xa4,0x02,0x89,0x04,0xcf,0x00,0x0e,0x00,0x19,0x00,0x31,0xb1,0x02,0x13,0x41,0x09,0x01,0x0d,0x00,0x0d,0x01,0x0b,0x00,0x17,0x01,0x0d,0x00,0x07,0x01,0x09,0x00, -0x0a,0x01,0x0c,0xb4,0x15,0x15,0x1b,0x0f,0x02,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0xc6,0x31,0x30,0x13,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x9a,0x7d,0x7a,0x92,0x8f,0x6c, -0x72,0x36,0x51,0x40,0x91,0x91,0x40,0x51,0x02,0xdd,0xfe,0xc7,0x02,0x00,0x8b,0xa0,0x9a,0x7d,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x33,0x40,0x1c,0x9d,0x02,0x01,0x5b,0x02,0x6b,0x02,0x7b,0x02,0x03,0x49,0x02,0x01,0x38,0x02,0x01,0x05,0x02,0x06,0x08, -0x03,0x04,0x04,0x03,0x03,0x02,0x06,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x54,0x02,0xe3,0x9c,0x05,0x00,0xfd,0x8f,0x6a,0x02,0xc1,0x00,0x02,0x00,0x8f,0xff,0xe7,0x06,0xb2,0x04,0x19,0x00,0x20, -0x00,0x27,0x00,0xe1,0x40,0x34,0x69,0x23,0x79,0x23,0x02,0xe6,0x1e,0xf6,0x1e,0x02,0x55,0x14,0x65,0x14,0x02,0xaa,0x0f,0x01,0xcf,0x26,0xdf,0x26,0x02,0x9b,0x26,0xfb,0x26,0x02,0x24,0x26,0x34,0x26,0x02,0x05,0x17,0x01,0x7e,0x0f,0x8e,0x0f,0x9e,0x0f,0x03,0x09,0x0f,0x19,0x0f,0x02,0x5b,0x0a,0x01,0x02,0xb8,0xff,0xe8,0x40,0x0e,0x13, -0x16,0x48,0x24,0x02,0x34,0x02,0x44,0x02,0x03,0xe2,0x1b,0x01,0x1b,0xb8,0xff,0xe0,0xb3,0x19,0x1c,0x48,0x1b,0xb8,0xff,0xe0,0x40,0x51,0x0b,0x0e,0x48,0xcb,0x0b,0x01,0x5b,0x0b,0x01,0x1b,0x0b,0x1d,0x0e,0x27,0x95,0xe0,0x01,0xf0,0x01,0x02,0x01,0x01,0x09,0x24,0x95,0x1d,0x10,0x19,0x11,0x0f,0x07,0xec,0x00,0x06,0x10,0x06,0x02,0x06, -0x04,0x95,0x09,0x16,0x15,0x95,0x0e,0x16,0x27,0x01,0x0b,0x03,0x1a,0x84,0x5f,0x19,0x7f,0x19,0x02,0x20,0x19,0xa0,0x19,0x02,0x19,0x19,0x11,0x06,0x40,0x0f,0x12,0x48,0x06,0x21,0x83,0x00,0x29,0x12,0x84,0x00,0x11,0x01,0x11,0x2f,0x5d,0xe1,0x10,0xde,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0x5d,0x5d,0xe1,0x17,0x39,0x00,0x3f,0xed,0x3f,0xfd, -0xd6,0x5d,0xed,0x3f,0xc4,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x39,0x5d,0x5d,0x2b,0x2b,0x5d,0x31,0x30,0x5d,0x2b,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33, -0x15,0x36,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0xb2,0xfd,0x2f,0x05,0xae,0x99,0xac,0x91,0x8a,0xc7,0xfe,0xd9,0x71,0x2a,0xba,0x8d,0xfe,0x7f,0xa4,0xfe,0x7c,0x90,0xa4,0x7d,0xbb,0xc2,0xd7,0xa8,0x02,0x86,0x78,0x71,0xa3,0x15,0x01,0xd7,0xae,0xb6,0x70,0x99,0x63,0xea,0x66,0x84,0x01,0xb5,0x02,0x64,0xfd,0xb6, -0xfe,0xbd,0xb3,0x94,0x02,0x46,0x7b,0x94,0xfe,0xf8,0xe4,0x35,0x91,0x9a,0xa0,0x8b,0x00,0x01,0x00,0x74,0x00,0x00,0x04,0x8b,0x05,0xb4,0x00,0x27,0x00,0x57,0x40,0x2e,0x1d,0x91,0x02,0x02,0x1e,0x00,0x25,0x92,0x40,0x22,0x1e,0x00,0x22,0x92,0x28,0x30,0x21,0x92,0x1e,0x1e,0x0c,0x27,0x92,0x00,0x10,0x13,0x92,0x0c,0x04,0x0f,0x0f,0x1d, -0x22,0x26,0x7e,0x01,0x01,0x07,0x24,0x20,0x00,0x00,0x29,0x18,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xf1,0x32,0x33,0xc0,0x2f,0x31,0x00,0x3f,0xfd,0xc6,0x2f,0xed,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x11,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32, -0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x04,0x8b,0xfd,0xb6,0x6b,0xab,0x77,0x40,0x49,0x8a,0xc5,0x7c,0x44,0x7d,0x34,0x39,0x80,0x42,0x55,0x86,0x5b,0x30,0x24,0x49,0x6e,0x4a,0x02,0x33,0xfe,0x6f,0x01,0x74,0xfe,0x8c,0x01,0xa8,0x01,0x7e,0x03,0x54, -0x8d,0xb9,0x69,0x7a,0xce,0x95,0x53,0x19,0x19,0xac,0x28,0x26,0x3f,0x6d,0x93,0x53,0x4c,0x81,0x63,0x3f,0x0b,0x01,0xe8,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0,0x00,0x00,0x03,0x00,0x76,0xff,0xb5,0x04,0x18,0x06,0x3d,0x00,0x2e,0x00,0x36,0x00,0x40,0x00,0x97,0x40,0x1d,0x23,0x1e,0x1b,0x1d,0x20,0x22,0x25,0x04,0x1b,0x0e,0x31,0x3b,0x3e,0x04, -0x3f,0x15,0x01,0x15,0x10,0x92,0x1b,0x13,0x04,0x07,0x0a,0x2d,0x04,0x01,0x0b,0xb8,0xff,0xc0,0x40,0x3c,0x0c,0x0f,0x48,0x0b,0x37,0x0d,0x32,0x3a,0x3f,0x04,0x37,0x05,0x2e,0x37,0x92,0x01,0x32,0x3a,0x3f,0x0d,0x04,0x0b,0x31,0x3b,0x3e,0x0e,0x04,0x16,0x2f,0x2d,0x01,0x04,0x07,0x04,0x0b,0x25,0x22,0x20,0x1d,0x04,0x16,0x28,0x05,0x06, -0x1e,0x03,0x1f,0x00,0x23,0x2e,0x03,0x24,0x28,0x0b,0x16,0x16,0x42,0x2f,0x7d,0x28,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x10,0xd4,0x17,0x32,0xc4,0x17,0x32,0x11,0x12,0x17,0x39,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x12,0x17,0x39,0x31,0x00,0x2f,0xed,0xcd,0x32,0x11,0x17,0x33,0x10,0xc4,0x2b,0x11,0x17,0x33,0x3f,0xfd,0xc6,0x5d,0x17,0x33, -0x11,0x17,0x33,0x10,0xce,0x32,0x30,0x01,0x07,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x07,0x23,0x13,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x37,0x01,0x14,0x17,0x01,0x0e,0x03,0x01,0x22,0x06,0x07,0x01,0x16,0x16, -0x17,0x01,0x26,0x03,0x36,0x2b,0x1a,0x2f,0x16,0x2b,0x73,0x31,0x10,0x20,0x11,0x3c,0x30,0xfe,0xa3,0x42,0x52,0x2f,0x4e,0x49,0x48,0x27,0x26,0x4a,0x50,0x57,0x34,0x5a,0x50,0x17,0x71,0x23,0x2a,0x27,0x33,0x71,0x4d,0x4c,0x54,0x52,0x91,0xc7,0x76,0x2d,0xfe,0x63,0x34,0x01,0x0b,0x48,0x76,0x54,0x2d,0x01,0xdf,0x0a,0x12,0x09,0xfe,0xc4, -0x11,0x25,0x14,0x01,0x52,0x1c,0x06,0x3d,0x8b,0x02,0x02,0x8f,0xa2,0x04,0x0a,0x05,0xa5,0x1b,0x10,0xfb,0x82,0x1c,0x0a,0x14,0x1e,0x14,0x96,0x11,0x1a,0x12,0x09,0x18,0x4b,0x74,0x18,0x1e,0xaa,0x01,0x00,0x5e,0x01,0x00,0x9f,0x9a,0x01,0x03,0xc5,0x7f,0x15,0x95,0xfc,0x7f,0xa6,0x80,0x03,0x71,0x1d,0x6d,0x98,0xbd,0x01,0xfe,0x01,0x01, -0xfb,0xf0,0x16,0x25,0x11,0x04,0x5b,0x03,0x00,0x01,0x00,0x76,0xff,0xe8,0x04,0x18,0x05,0xb2,0x00,0x3e,0x00,0x5e,0x40,0x16,0x38,0x37,0x3b,0x00,0x02,0x95,0x3b,0x35,0x35,0x1f,0x15,0x34,0x07,0x3f,0x0f,0x01,0x0f,0x0a,0x92,0x15,0x13,0x25,0xb8,0xff,0xc0,0x40,0x0c,0x0c,0x0f,0x48,0x25,0x2a,0x92,0x1f,0x04,0x38,0x00,0x37,0x07,0xb8, -0x01,0x2e,0x40,0x0b,0x34,0x34,0x1a,0x00,0x25,0x10,0x10,0x40,0x2f,0x7d,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0x12,0x39,0x2f,0xe1,0x32,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xfd,0xc6,0x5d,0x33,0x33,0x11,0x12,0x39,0x2f,0xd4,0xfd,0xc6,0x11,0x33,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x16,0x32,0x33,0x32, -0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x04,0x18,0x27,0x48,0x5f,0x3f,0x3f,0x05,0x0c,0x06,0x2f,0x4e,0x49,0x48,0x27,0x26,0x4a,0x50,0x57,0x34,0x83, -0xdc,0x9f,0x59,0x65,0xb1,0xf0,0x8b,0x2c,0x47,0x40,0x3d,0x21,0x27,0x42,0x40,0x43,0x27,0x69,0xaf,0x80,0x47,0x27,0x48,0x66,0x3f,0x92,0x04,0x20,0x80,0x50,0x1d,0x2b,0x10,0x03,0x1c,0x1e,0x59,0x58,0x9a,0xfe,0x86,0x01,0x0a,0x14,0x1e,0x14,0x96,0x11,0x1a,0x12,0x09,0x66,0xba,0x01,0x08,0xa2,0xac,0x01,0x1b,0xca,0x6f,0x05,0x0a,0x10, -0x0b,0xa5,0x12,0x19,0x10,0x08,0x5b,0xa3,0xe3,0x89,0x63,0xae,0x8c,0x68,0x1e,0x03,0x18,0xbd,0x61,0x6c,0x07,0x06,0x00,0x01,0x00,0xa6,0xff,0x12,0x06,0x54,0x05,0x0c,0x00,0x2e,0x00,0x8c,0x40,0x48,0x10,0x13,0x16,0x03,0x12,0x26,0x2e,0x01,0x15,0x12,0x06,0x20,0x2d,0x2b,0x0f,0x0c,0x95,0x01,0x24,0x23,0x19,0x95,0x01,0x26,0x10,0x21, -0x0f,0x2d,0x16,0x15,0x2e,0x15,0x2d,0x16,0x2e,0x15,0x13,0x10,0x0f,0x01,0x14,0x00,0x01,0x0f,0x10,0x13,0x04,0x14,0x2e,0x00,0x00,0x06,0x14,0x15,0x20,0x2b,0x2b,0x17,0x11,0x84,0x12,0x12,0x20,0x06,0x84,0x05,0x05,0x30,0x23,0x1f,0x84,0x20,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xf1,0x33,0xc1,0x2f,0x10,0xc6,0x32,0x10, -0xc0,0x2f,0x32,0x12,0x00,0x17,0x39,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x31,0x00,0x3f,0x3f,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x33,0x33,0x2f,0x33,0x33,0xc6,0x10,0xcd,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x33,0x20,0x11,0x11,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x03, -0x11,0x23,0x35,0x03,0x23,0x01,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x37,0x13,0x05,0x85,0x87,0x04,0x01,0x52,0xa4,0x11,0x32,0x5a,0x48,0x07,0x0d,0x07,0xe1,0xa4,0xf5,0x99,0x01,0x8e,0xe9,0x3f,0x5e,0x3d,0x1e,0xa4,0xa4,0x04,0x6e,0xd0,0x32,0x5d,0x4d,0x38,0x0e,0x3e, -0x5f,0x9f,0x05,0x0c,0xf4,0xfe,0x5f,0xfd,0x89,0x02,0x4c,0x46,0x76,0x56,0x30,0x01,0x01,0xfe,0x69,0xfe,0x0b,0xcc,0xfe,0x46,0x02,0xd0,0x7e,0x01,0x2e,0x39,0x5c,0x75,0x3c,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1e,0x38,0x4e,0x30,0x73,0x34,0x01,0x21,0x00,0x00,0x05,0x00,0x23,0x00,0x00,0x05,0x0a,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0x23, -0x00,0x29,0x00,0x31,0x00,0x98,0x40,0x5a,0x24,0x25,0x2a,0x2b,0x04,0x15,0x02,0x0f,0x13,0x29,0x03,0x0c,0x1c,0x20,0x03,0x17,0x92,0x18,0x0b,0x1f,0x23,0x03,0x04,0x08,0x2e,0x03,0x1b,0x92,0x2f,0x00,0x01,0x90,0x00,0xa0,0x00,0xc0,0x00,0xd0,0x00,0x04,0x00,0x00,0x02,0x11,0x15,0x06,0x02,0x03,0x12,0x21,0x22,0x2f,0x04,0x2a,0x11,0x29, -0x1c,0x1f,0x04,0x04,0x03,0x24,0x1b,0x17,0x15,0x19,0x01,0x15,0x0c,0x08,0x0a,0x0e,0x25,0x1e,0x13,0x20,0x2a,0x03,0x14,0x03,0x15,0x11,0x06,0x7f,0x10,0x10,0x33,0x14,0x7f,0x15,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x11,0x33,0x11,0x17,0x33,0x32,0x32,0xc6,0x32,0x33,0x33,0x11,0x33,0x33,0x10,0xc6,0x32,0x11,0x12,0x17,0x39,0x11,0x12, -0x17,0x39,0x31,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x2f,0x5d,0x5d,0xfd,0x17,0x33,0x17,0x32,0xd6,0xed,0x17,0x33,0x17,0x32,0x11,0x12,0x17,0x39,0x31,0x30,0x13,0x33,0x11,0x33,0x13,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x01,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x05,0x33,0x35,0x21,0x05,0x21, -0x27,0x23,0x01,0x33,0x26,0x35,0x35,0x23,0x01,0x23,0x16,0x15,0x15,0x33,0x27,0x26,0x23,0x99,0xcb,0xf1,0x01,0x5f,0x97,0x9c,0x9c,0x9c,0x9c,0xc2,0xfe,0xfb,0xfe,0xac,0x97,0x99,0x99,0x99,0x02,0xde,0xd6,0xfe,0xe7,0xfe,0x95,0x01,0x0f,0x44,0xcb,0x02,0x88,0x03,0x07,0x92,0xfe,0x0c,0x05,0x07,0x85,0x60,0x1b,0x03,0xae,0x01,0xec,0xfe, -0x14,0x01,0xec,0xfe,0x14,0x8d,0x88,0x8c,0xfd,0xf3,0x02,0x0d,0xfd,0xf3,0x02,0x0d,0x8c,0x88,0x88,0x88,0x88,0x88,0xfd,0xbc,0x31,0xa0,0x5f,0x02,0xbb,0x2e,0x94,0x58,0xc2,0x37,0x00,0x03,0x00,0xbc,0xff,0xe8,0x06,0x77,0x05,0x9a,0x00,0x16,0x00,0x21,0x00,0x54,0x00,0x84,0x40,0x12,0x2c,0x47,0x51,0x36,0x60,0x3a,0x70,0x3a,0x02,0x3a, -0x3d,0x95,0x36,0x36,0x36,0x07,0x08,0x22,0xb8,0xff,0xc0,0x40,0x33,0x09,0x0e,0x48,0x22,0x25,0x95,0x51,0x16,0x14,0x13,0x18,0x91,0x05,0x05,0x08,0x01,0x07,0x17,0x91,0x08,0x03,0x22,0x31,0x3a,0x4c,0x42,0x7e,0x31,0x31,0x27,0x1e,0x13,0x13,0x0e,0x01,0x00,0x00,0x0e,0x7d,0x1e,0x1e,0x07,0x27,0x7e,0x4c,0x4c,0x56,0x18,0x06,0x7e,0x07, -0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x10,0xc1,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x10,0xc4,0x10,0xc6,0x31,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0xed,0x39,0x39,0x3f,0xfd,0xc6,0x2b,0x11,0x12,0x39,0x2f,0x2f,0xfd,0xc6,0x5d,0x11,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23, -0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26, -0x27,0x04,0x04,0xc8,0xb1,0x4e,0x8d,0x4c,0xa8,0x01,0x60,0x5e,0x9e,0x72,0x40,0x29,0x4e,0x72,0x4a,0x51,0x42,0xfe,0x3a,0x92,0x3f,0x6b,0x4e,0x2c,0x8f,0x8d,0x02,0x21,0x3e,0x81,0x44,0xb0,0x1d,0x31,0x40,0x23,0x49,0x61,0x3b,0x18,0x2e,0x57,0x7d,0x4f,0x39,0x73,0x2d,0x33,0x6e,0x3d,0x24,0x3d,0x2b,0x19,0x17,0x2b,0x3c,0x24,0x42,0x64, -0x42,0x22,0x23,0x51,0x84,0x61,0x45,0x84,0x36,0x01,0xb0,0xb2,0xfd,0x9e,0x05,0x9a,0x2f,0x60,0x8f,0x60,0x4b,0x82,0x67,0x48,0x10,0x04,0x1e,0x8c,0x03,0x20,0xfd,0xf8,0x26,0x47,0x67,0x40,0x73,0x81,0xfb,0xcc,0x2a,0x31,0x6e,0x1f,0x2c,0x1f,0x18,0x0c,0x18,0x35,0x41,0x4d,0x2f,0x35,0x5c,0x46,0x28,0x14,0x12,0xa3,0x1f,0x20,0x0f,0x1c, -0x28,0x19,0x21,0x2a,0x1d,0x16,0x0c,0x16,0x2f,0x3e,0x50,0x37,0x31,0x5e,0x4a,0x2d,0x1d,0x1b,0x00,0x07,0x00,0x14,0x00,0x00,0x05,0xe0,0x05,0x9a,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x33,0x00,0x3b,0x00,0x43,0x01,0x3f,0x40,0xb7,0x1a,0x1d,0x1e,0x01,0x02,0x19,0x02,0x17,0x26,0x25,0x3a,0x39,0x18,0x39,0x3b,0x24,0x27,0x16, -0x15,0x34,0x15,0x04,0x29,0x2a,0x41,0x42,0x03,0x42,0x40,0x2b,0x28,0x05,0x06,0x3f,0x06,0x13,0x22,0x21,0x32,0x31,0x14,0x31,0x12,0x23,0x20,0x33,0x2c,0x11,0x2c,0x0f,0x0c,0x0b,0x08,0x07,0x10,0x07,0x2e,0x2f,0x36,0x37,0x04,0x07,0x10,0x01,0x05,0x33,0x3b,0x04,0x1e,0x20,0x24,0x28,0x04,0x09,0x92,0x0a,0x1d,0x23,0x27,0x2b,0x04,0x12, -0x16,0x1a,0x40,0x41,0x05,0x0d,0x92,0x0e,0x0e,0x10,0x03,0x07,0x18,0x14,0x10,0x03,0x04,0x2a,0x41,0x03,0x3c,0x03,0x3b,0x24,0x27,0x16,0x04,0x15,0x37,0x3a,0x25,0x26,0x17,0x04,0x18,0x36,0x01,0x1e,0x1d,0x1a,0x04,0x19,0x02,0x05,0x28,0x2b,0x40,0x04,0x3d,0x06,0x32,0x21,0x22,0x13,0x04,0x14,0x2f,0x12,0x23,0x20,0x33,0x04,0x11,0x2e, -0x08,0x0c,0x0f,0x03,0x10,0x07,0x15,0x14,0x06,0x1c,0x00,0x02,0x0d,0x09,0x07,0x11,0x10,0x07,0x18,0x19,0x03,0x36,0x37,0x19,0x04,0x02,0x02,0x45,0x07,0x11,0x10,0x06,0x2e,0x2f,0x10,0x04,0x07,0x2f,0x17,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x17,0x33,0x2f,0x33,0x11,0x33,0x33,0x10,0xc6,0x32,0x10,0xc6,0x32,0x10,0xcd,0x32,0x11,0x12, -0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x31,0x00,0x3f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0xfd,0x17,0x33,0x17,0x32,0xd6,0xed,0x17,0x33,0x17,0x32,0x11,0x12,0x17,0x39,0x30,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x10, -0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x01,0x21,0x03,0x23,0x03,0x23,0x03,0x23,0x03,0x21,0x35,0x33,0x27,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13, -0x33,0x13,0x21,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x21,0x33,0x37,0x23,0x05,0x33,0x37,0x23,0x05,0x33,0x27,0x23,0x03,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x05,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x03,0x23,0x06,0x07,0x07,0x33,0x27,0x26,0x05,0xe0,0xfe,0xf3,0x63,0xa2,0x63,0xe7,0x63,0xa1,0x67,0xfe,0xfb,0xe9,0x1a,0xcf,0xb3, -0x5f,0x8f,0x5a,0x01,0x0d,0x5e,0x84,0x59,0x01,0x01,0x57,0x8d,0x5c,0xbe,0xd9,0x19,0xf1,0xfb,0xa5,0xa5,0x1a,0xd8,0x02,0x60,0x9e,0x18,0xcf,0xfe,0xed,0xb2,0x19,0x80,0xf7,0x0d,0x03,0x04,0x03,0x11,0x25,0x71,0x02,0x6d,0x0b,0x05,0x02,0x03,0x0f,0x23,0x6c,0xea,0x03,0x04,0x0d,0x14,0x4a,0x13,0x0d,0x02,0x10,0xfd,0xf0,0x02,0x10,0xfd, -0xf0,0x02,0x10,0x8c,0x88,0x8d,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x8d,0x88,0x88,0x88,0x88,0x88,0x88,0xfe,0x2a,0x45,0x4b,0x35,0x5b,0xc2,0xca,0x39,0x4d,0x34,0x56,0xc6,0x02,0x9a,0x4a,0x46,0x69,0x67,0x43,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x03,0xd3,0x04,0x00,0x00,0x0f,0x00,0x1f,0x00,0x4a,0x40,0x23, -0x19,0x01,0xbe,0x0e,0x0e,0x1f,0x0f,0x1e,0xbe,0x06,0x11,0x0f,0x00,0xcd,0x0f,0x0f,0x10,0x18,0xc2,0x19,0x19,0x10,0x06,0xc2,0x2f,0x07,0x3f,0x07,0x02,0x07,0x07,0x21,0x1f,0xcd,0x10,0xb8,0xff,0xc0,0xb3,0x0b,0x10,0x48,0x10,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x5d,0xe1,0x11,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x31,0x00,0x3f,0x33,0xfd, -0xc6,0x2f,0x33,0x10,0xfd,0xc6,0x31,0x30,0x01,0x11,0x21,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x21,0x11,0x03,0x11,0x21,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x21,0x11,0x01,0xe0,0x01,0x07,0x31,0x3a,0x81,0x1a,0x38,0x57,0x3d,0xfe,0x75,0xfe,0x01,0x8b,0x3d,0x57,0x38,0x1a,0x81,0x3a,0x31,0xfe,0xf9,0x03, -0x05,0xfd,0x7f,0x40,0x3b,0x03,0x01,0xfc,0xe4,0x2d,0x52,0x3f,0x26,0x03,0x05,0xfc,0xfb,0x04,0x00,0x25,0x3f,0x53,0x2d,0xfd,0xdf,0x02,0x07,0x3a,0x40,0xfc,0x84,0x00,0x00,0x03,0x00,0x60,0xfe,0xd7,0x04,0x98,0x05,0xec,0x00,0x1c,0x00,0x31,0x00,0x35,0x00,0x5b,0x40,0x33,0x33,0x96,0x34,0x05,0x01,0x02,0x2d,0x95,0x05,0x16,0x11,0x23, -0x95,0x0f,0x10,0x1c,0x19,0x14,0x96,0x0f,0x15,0x1f,0x15,0x2f,0x15,0x03,0x15,0x17,0x00,0x11,0x03,0x0a,0x35,0x00,0x34,0x14,0x0a,0x1b,0x19,0x12,0x16,0x1d,0x03,0x01,0x84,0x00,0x00,0x37,0x28,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x17,0x32,0x33,0xc6,0x10,0xc4,0xc4,0x10,0xc6,0x12,0x39,0x39,0x31,0x00,0x3f,0xd6,0x5d,0xed,0x33, -0x32,0x3f,0xed,0x33,0x3f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x13,0x21,0x35,0x21,0x04,0x10,0xa4, -0x04,0x72,0xee,0x6c,0xa0,0x69,0x33,0x3b,0x75,0xb0,0x75,0xd0,0x63,0x04,0xfe,0xb5,0x01,0x4b,0xa4,0x88,0x88,0xa4,0x2c,0x4d,0x6a,0x3f,0x56,0x7a,0x4e,0x24,0x23,0x4a,0x73,0x50,0x47,0x73,0x51,0x2b,0x7b,0xfc,0xae,0x03,0x52,0xae,0xc6,0x52,0x8b,0xba,0x69,0x71,0xcc,0x99,0x5a,0xa6,0x01,0x40,0x86,0xb4,0xb4,0x86,0xfd,0x1d,0x97,0x3e, -0x6c,0x50,0x2e,0x43,0x72,0x96,0x53,0x4c,0x8b,0x69,0x3e,0x39,0x60,0x7e,0xfd,0x4e,0x77,0x00,0x00,0x01,0x00,0x2a,0x00,0x00,0x03,0xfd,0x05,0x9a,0x00,0x19,0x00,0x44,0x40,0x22,0x19,0x06,0x16,0x10,0x0a,0x92,0x0b,0x0b,0x0d,0x01,0x08,0x14,0x0d,0x03,0x05,0x10,0x16,0x19,0x04,0x17,0x08,0x01,0x00,0x14,0x17,0x15,0x15,0x1b,0x0a,0x0f, -0x0c,0x07,0x7e,0x08,0x2f,0xe1,0x33,0x32,0xc6,0x12,0x39,0x2f,0xc6,0x33,0xc6,0x32,0x11,0x12,0x17,0x39,0x31,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x2f,0xed,0x33,0x33,0x32,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x03,0xfd, -0xdb,0xfe,0x6c,0x10,0x0e,0x08,0x04,0xa8,0x92,0x92,0xa8,0x04,0x08,0x16,0x08,0x01,0x96,0xc2,0xfe,0x36,0x01,0x70,0xfe,0x97,0x02,0x54,0x1a,0x1b,0x0e,0xfd,0x69,0x02,0x9e,0x8d,0x02,0x6f,0xfd,0x8f,0x0e,0x22,0x0c,0x02,0x35,0xfd,0x91,0x8d,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0x6c,0x05,0x9a,0x00,0x17,0x00,0x73,0x40,0x3b,0x08,0x05, -0x09,0x04,0x0b,0x02,0x0a,0x03,0x0c,0x01,0x0d,0x00,0x16,0x0f,0x17,0x0e,0x0d,0x0a,0x09,0x04,0x50,0x03,0x01,0x03,0x00,0x0d,0x00,0x6f,0x17,0x7f,0x17,0x02,0x17,0x17,0x12,0x07,0x15,0x11,0x91,0x12,0x03,0x0a,0x0e,0x11,0x07,0x03,0x17,0x16,0x02,0x06,0x0f,0x0b,0x07,0x14,0x14,0x19,0x06,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f,0x11,0x33, -0x33,0x11,0x33,0x33,0xc6,0x32,0x10,0xd4,0xc6,0x32,0x31,0x00,0x3f,0xed,0x32,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0xcd,0x10,0xd6,0x5d,0xcd,0xdd,0xcd,0x10,0xcd,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x07,0x15,0x37,0x15,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11, -0x21,0x35,0x21,0x15,0x21,0x11,0x37,0x03,0x08,0xea,0xea,0xea,0xa8,0xef,0xef,0xef,0xef,0xfe,0xb3,0x03,0x43,0xfe,0xb2,0xea,0x03,0xb5,0x85,0xcc,0x85,0x8e,0x85,0xfe,0x2a,0x01,0x76,0x87,0x8e,0x87,0xcc,0x87,0x8e,0x87,0x01,0xa4,0x98,0x98,0xfe,0xbc,0x85,0x00,0x00,0x05,0x00,0x2c,0xfe,0x9e,0x08,0xe2,0x06,0x77,0x00,0x3a,0x00,0x53, -0x00,0x6a,0x00,0x7e,0x00,0x8e,0x00,0x84,0x40,0x4c,0x1e,0x3e,0x8c,0x0c,0x04,0x0f,0x19,0x29,0x32,0x24,0x36,0x4f,0xe2,0x2f,0x7a,0xe7,0x59,0x70,0x69,0x70,0x52,0x63,0x7f,0xdb,0x0f,0x19,0x1f,0x19,0x02,0x19,0x89,0x43,0xe2,0x07,0x63,0x07,0x89,0xdb,0x0f,0x0c,0x1e,0x24,0x2f,0x36,0x3e,0x4f,0x8c,0x08,0x00,0x14,0x32,0x33,0x33,0x00, -0x29,0x2a,0x14,0x54,0x68,0x69,0x6b,0x04,0x6a,0x00,0xb1,0x4a,0x4a,0x14,0x75,0xea,0x5e,0x5e,0x90,0x84,0xf3,0x14,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0xc4,0x17,0x32,0x10,0xc4,0x32,0x10,0xc0,0x2f,0x32,0x11,0x12,0x17,0x39,0x31,0x00,0x2f,0xed,0x33,0x33,0x10,0xed,0x10,0xd4,0x5d,0xed,0x10,0xed,0xc6,0x10,0xd4,0xed, -0x2f,0xed,0x33,0x32,0xcd,0xc4,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x12,0x37,0x36,0x36,0x37,0x0e,0x03,0x07,0x27,0x3e,0x03,0x37,0x36,0x36,0x37,0x17,0x06,0x06,0x07,0x1e,0x03,0x05,0x06,0x02,0x07,0x1e,0x03, -0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x03,0x23,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x06,0x84,0x23,0x4d,0x78, -0xaa,0xdf,0x8c,0x3b,0x66,0x58,0x4c,0x22,0x42,0x94,0x55,0x2e,0x4a,0x34,0x1d,0x23,0x3a,0x4b,0x28,0x26,0x44,0x3d,0x3a,0x1c,0x36,0x58,0x26,0x25,0x5e,0x3c,0x5a,0x9b,0x8a,0x7d,0x3d,0x34,0x45,0x9f,0xb2,0xc2,0x68,0x43,0xa1,0x61,0x37,0x47,0x6c,0x2c,0x8a,0xcf,0x8a,0x45,0xfc,0xcf,0x32,0x74,0x46,0x1e,0x3f,0x48,0x50,0x2e,0x69,0xa8, -0x82,0x5e,0x3d,0x1d,0x3b,0x72,0xa9,0x6d,0x1b,0x31,0x2d,0x2e,0x02,0xf0,0x0f,0x2e,0x51,0x80,0x62,0x3d,0x66,0x4a,0x2a,0x2c,0x55,0x7b,0x4f,0x21,0x3f,0x36,0x2b,0x0d,0x8a,0xa3,0x01,0x64,0x12,0x25,0x39,0x27,0x2c,0x44,0x2f,0x18,0x14,0x25,0x35,0x21,0x35,0x49,0x2d,0x14,0xf9,0xfc,0x15,0x27,0x1e,0x12,0x12,0x1c,0x25,0x12,0x39,0x63, -0x2c,0x32,0x5c,0x03,0x3c,0x59,0xc0,0xb8,0xa4,0x7d,0x49,0x14,0x22,0x2d,0x18,0x3f,0x3c,0x1c,0x33,0x47,0x2b,0x30,0x4a,0x31,0x1a,0x10,0x1c,0x25,0x15,0x5f,0x01,0x0d,0xab,0xa9,0xf9,0x5d,0x0a,0x35,0x49,0x58,0x2d,0x50,0x38,0x69,0x51,0x34,0x03,0x48,0x66,0x26,0x42,0x1f,0x49,0x30,0x0f,0x5f,0x9b,0xd4,0xb1,0xc4,0xfe,0xe4,0x60,0x15, -0x24,0x1b,0x10,0x3f,0x6b,0x8e,0x9c,0xa1,0x4a,0x77,0xbb,0x85,0x4e,0x0a,0x2e,0x71,0x88,0xa3,0xfd,0xba,0x36,0x74,0x60,0x3f,0x25,0x47,0x68,0x43,0x48,0x7f,0x5f,0x36,0x10,0x1f,0x2c,0x1b,0xfe,0x29,0x02,0x7c,0x20,0x3e,0x30,0x1d,0x26,0x3f,0x51,0x2b,0x28,0x43,0x30,0x1a,0x31,0x47,0x52,0x15,0x0e,0x19,0x24,0x16,0x19,0x26,0x1a,0x0e, -0x36,0x35,0x27,0x36,0x00,0x02,0x00,0x30,0xfe,0x52,0x03,0x6a,0x05,0xe2,0x00,0x3c,0x00,0x4e,0x00,0x5d,0x40,0x32,0x01,0x02,0x07,0x1b,0x35,0x3b,0x4a,0x07,0x00,0x11,0x2b,0x25,0x3a,0x00,0x42,0xcb,0x11,0x00,0x4a,0x07,0x3d,0x02,0x35,0x1b,0x16,0x02,0x3a,0x00,0x47,0x48,0x0c,0x0c,0x3d,0x00,0x28,0x28,0x30,0x3d,0xc4,0x16,0x30,0xc0, -0x20,0x20,0x50,0x01,0x3b,0x3c,0x03,0x00,0x2f,0x17,0x32,0x11,0x39,0x2f,0xe1,0xd4,0xe1,0x10,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x10,0xc6,0x32,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x00,0x3f,0xed,0x2f,0xd6,0xd4,0xcd,0x11,0x12,0x17,0x39,0x31,0x30,0x33,0x13,0x13,0x36,0x37,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33, -0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x26,0x36,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x06,0x06,0x07,0x06,0x07,0x03,0x07,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x3e,0x03,0x30,0xfe,0x4c,0x11,0x13,0x11,0x28,0x16,0x26,0x4a,0x3a,0x23,0x20,0x3b,0x54, -0x34,0x30,0x47,0x2f,0x17,0x10,0x1d,0x26,0x16,0x2f,0x62,0x50,0x32,0x3e,0x6e,0x96,0x57,0x0b,0x0b,0x01,0x08,0x0c,0x25,0x51,0x43,0x2c,0x17,0x29,0x35,0x1e,0x23,0x47,0x1c,0x21,0x1e,0x64,0x62,0x01,0xcd,0x0e,0x19,0x22,0x14,0x11,0x21,0x19,0x0f,0x41,0x32,0x0e,0x19,0x12,0x0b,0x02,0x23,0xfe,0xe4,0x37,0x40,0x37,0x90,0x51,0x4b,0x8e, -0x8b,0x8a,0x47,0x3f,0x67,0x49,0x28,0x23,0x40,0x5b,0x38,0x22,0x69,0x85,0x99,0x52,0x54,0xad,0xbc,0xce,0x74,0x50,0x96,0x74,0x46,0x0c,0x09,0x06,0x10,0x03,0x09,0x3b,0x5a,0x78,0x47,0x56,0x9f,0x92,0x88,0x40,0x7d,0xe7,0x5b,0x6a,0x5d,0x01,0x50,0xf6,0x04,0xe1,0x30,0x41,0x28,0x11,0x13,0x29,0x41,0x2f,0x67,0xbf,0x60,0x3b,0x71,0x66, -0x56,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x04,0x8e,0x05,0x9a,0x00,0x1f,0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x81,0x40,0x4a,0x2c,0x12,0x24,0x0f,0x1c,0x92,0x1d,0x40,0x09,0x0d,0x48,0x1d,0x1d,0x03,0x18,0x23,0x0a,0x2f,0x07,0x00,0x92,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x01,0x01,0x03,0x2d,0x91,0x18,0x18,0x03,0x19,0x2e,0x91,0x03, -0x03,0x07,0x0a,0x0f,0x12,0x04,0x0c,0x22,0x25,0x2b,0x30,0x04,0x20,0x24,0x2d,0x2f,0x03,0x19,0x00,0x1c,0x1a,0x1e,0x02,0x1a,0x10,0x09,0x20,0x7d,0x0c,0x0c,0x35,0x19,0x7e,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x33,0x33,0x10,0xc6,0x32,0x11,0x17,0x33,0x11,0x17,0x33,0x11,0x17,0x33,0x31,0x00,0x3f,0xed,0x2f,0x12,0x39, -0x2f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x33,0x33,0x32,0x32,0x11,0x12,0x39,0x2f,0x2b,0xed,0x33,0x33,0x32,0x32,0x31,0x30,0x13,0x35,0x33,0x11,0x21,0x32,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x23,0x0e,0x03,0x23,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x05,0x34,0x27,0x21,0x15,0x21,0x36,0x36,0x01,0x32,0x36, -0x37,0x21,0x15,0x11,0x15,0x21,0x26,0x26,0x23,0x26,0x96,0x01,0x7c,0xa1,0xdb,0x2e,0xac,0x90,0x03,0x03,0x02,0x92,0xb7,0x1b,0x59,0x73,0x8d,0x50,0xaf,0xa8,0x96,0x96,0x02,0x95,0x03,0xfe,0x16,0x01,0xe8,0x02,0x03,0xfe,0xb9,0x67,0x87,0x26,0xfe,0x46,0x01,0xbe,0x23,0x7f,0x64,0x03,0xfd,0x8d,0x01,0x10,0x8b,0x85,0x8d,0x1b,0x1c,0x15, -0x28,0x14,0x8c,0x42,0x69,0x49,0x27,0xfe,0x32,0x02,0xe9,0x8c,0x88,0x3f,0x21,0x1e,0x88,0x11,0x24,0xfe,0xbc,0x45,0x3e,0x83,0x02,0x9c,0x78,0x39,0x3f,0x00,0x00,0x04,0x00,0xa2,0xff,0xdf,0x06,0x7d,0x05,0xbb,0x00,0x1b,0x00,0x33,0x00,0x42,0x00,0x4f,0x00,0x52,0x40,0x2d,0x34,0x4c,0x0f,0x44,0x1f,0x44,0x02,0x44,0x44,0x37,0x36,0x36, -0x28,0x43,0x4c,0x37,0x37,0x1c,0x28,0xcb,0x00,0xc7,0x1c,0xcb,0x0e,0x04,0x3d,0xbd,0x4a,0x4a,0x2d,0x44,0x35,0xc2,0x36,0x36,0x07,0x2d,0xc9,0x15,0x15,0x51,0x21,0xc9,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x31,0x00,0x3f,0xed,0xf4,0xed,0x11,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x2f, -0x5d,0xed,0x31,0x30,0x05,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x03,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x03,0x90,0x67,0xbf, -0xa7,0x89,0x62,0x36,0x36,0x62,0x8a,0xa6,0xbf,0x67,0x67,0xbe,0xa7,0x89,0x62,0x36,0x36,0x62,0x89,0xa6,0xbf,0x67,0x88,0xf1,0xb4,0x69,0x30,0x56,0x79,0x94,0xa8,0x5b,0x88,0xf1,0xb4,0x68,0x30,0x56,0x79,0x93,0xa9,0xdd,0x83,0x01,0x1d,0x53,0x84,0x5b,0x30,0x29,0x59,0x8c,0x64,0x8a,0x81,0x48,0x5f,0x37,0x16,0x1a,0x3a,0x5a,0x41,0x21, -0x36,0x62,0x89,0xa7,0xbf,0x67,0x67,0xbf,0xa7,0x89,0x62,0x36,0x36,0x62,0x8a,0xa7,0xbf,0x66,0x66,0xbf,0xa7,0x8a,0x62,0x36,0x05,0x84,0x69,0xb4,0xf1,0x88,0x5b,0xa9,0x93,0x78,0x57,0x2f,0x68,0xb4,0xf1,0x88,0x5b,0xa8,0x93,0x79,0x57,0x30,0xfc,0xdb,0xfe,0xba,0x03,0xba,0x28,0x4d,0x71,0x4a,0x3a,0x74,0x5d,0x39,0x02,0x01,0xfe,0x71, -0x23,0x3a,0x49,0x25,0x2d,0x49,0x33,0x1b,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x1a,0x05,0xec,0x00,0x1d,0x00,0x2b,0x00,0x39,0x00,0x41,0x40,0x24,0x11,0x00,0x36,0x95,0x16,0x10,0x22,0x95,0x0d,0x10,0x30,0x95,0x1c,0x16,0x28,0x95,0x07,0x16,0x03,0x12,0x2d,0x02,0x84,0x11,0x1e,0x03,0x03,0x0a,0x19,0x83,0x33,0x33,0x3b,0x25,0x83,0x0a, -0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x31,0x30,0x25,0x23,0x15,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06, -0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x04,0x14,0x04,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0xfe,0xf0,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0x55,0x51,0xa9,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f, -0x57,0x53,0x94,0x94,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x01,0xd8,0xa6,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0x63,0x5e,0x01,0x0d,0x9e,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0x64,0x5e,0x00,0x00,0x03,0x00,0x60,0xfe,0x29,0x07,0x1a,0x04,0x18,0x00,0x1d,0x00,0x2b,0x00,0x39, -0x00,0x42,0x40,0x25,0x11,0x0f,0x36,0x95,0x16,0x10,0x22,0x95,0x0d,0x10,0x30,0x95,0x1c,0x16,0x28,0x95,0x07,0x16,0x03,0x1b,0x12,0x2d,0x02,0x84,0x11,0x1e,0x03,0x03,0x0a,0x19,0x83,0x33,0x33,0x3b,0x25,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f, -0xed,0x3f,0x31,0x30,0x25,0x23,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x04,0x14, -0x04,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0xfe,0xf0,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0x55,0x51,0xa9,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0x57,0x53,0x94,0xfd,0x95,0x02,0x85,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff, -0xfe,0xcb,0x01,0xd8,0xa6,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0x63,0x5e,0x01,0x0d,0x9e,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0x64,0x5e,0x00,0x01,0x00,0x16,0xff,0x6a,0x04,0xf0,0x06,0x30,0x00,0x03,0x00,0x18,0x40,0x0c,0x00,0x02,0xa0,0x03,0x01,0x0f,0x03,0x3f,0x03,0x02,0x03,0x02,0x00,0x2f,0x2f,0x5d,0x5d,0x01,0x2f,0xcd,0x31,0x30,0x01,0x01, -0x23,0x01,0x04,0xf0,0xfb,0xca,0xa4,0x04,0x36,0x06,0x30,0xf9,0x3a,0x06,0xc6,0x00,0xff,0xff,0x00,0x16,0xff,0x6a,0x05,0x12,0x06,0x30,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x06,0x07,0xe3,0x00,0x00,0xff,0xff,0x00,0x16,0xff,0x6a,0x04,0xf0,0x06,0x30,0x02,0x26,0x00,0x26,0x00,0x00,0x00,0x06,0x07,0xe3,0x00,0x00,0xff,0xff,0x00,0x21, -0xff,0x37,0x04,0x0b,0x04,0xd1,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x00,0xbc,0x01,0x59,0xff,0x37,0xff,0xff,0x00,0x12,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x07,0x00,0xd9,0xff,0xd4,0xfd,0xf5,0xff,0xff,0xff,0xef,0xff,0x6a,0x04,0xc9,0x06,0x30,0x02,0x26,0x00,0x37,0x00,0x00,0x00,0x06,0x07,0xe3, -0xd9,0x00,0x00,0x01,0x00,0x68,0xfe,0x92,0x03,0x0f,0x04,0x18,0x00,0x3c,0x00,0x57,0x40,0x31,0x3c,0x3a,0x95,0x02,0x0d,0x30,0x17,0x26,0x04,0x1c,0x36,0x1f,0x21,0x95,0x1c,0x10,0x08,0x36,0x20,0x09,0x30,0x09,0x40,0x09,0x03,0x09,0x0b,0x95,0x36,0x16,0x3c,0x3c,0x36,0x09,0x1f,0x1f,0x30,0x26,0x83,0x17,0x17,0x09,0x30,0x83,0x0d,0x0d, -0x3e,0x06,0x09,0x2f,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x11,0x39,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x11,0x39,0x3f,0xfd,0xc6,0x11,0x12,0x17,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33, -0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x07,0x06,0x07,0x16,0x17,0x16,0x33,0x32,0x37,0x02,0xc7,0x3a,0x5c,0x8c,0x46,0x3d,0x92,0x15,0x13,0x86,0xa1,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x42,0x6e,0x8d,0x4b,0x85,0x69,0x71,0x93,0x2e,0x4a,0x35,0x1d,0x1d,0x38,0x50, -0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x49,0x40,0x44,0x27,0x16,0x30,0x3c,0x48,0x47,0xfe,0xb7,0x25,0xa4,0x90,0x4b,0x09,0x0b,0xb0,0x63,0x90,0x29,0x39,0x2c,0x23,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x6f,0x4b,0x26,0x2e,0xa6,0x4a,0x15,0x26,0x35,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5a,0x3e,0x4c,0x70,0x4a,0x12,0x0f,0x03, -0x24,0x35,0x71,0x28,0x00,0x01,0x00,0x21,0xfe,0x92,0x03,0x70,0x04,0x00,0x00,0x13,0x00,0x30,0x40,0x19,0x13,0x11,0x95,0x02,0x0c,0x08,0x95,0x0a,0x0f,0x07,0x0d,0x96,0x06,0x13,0x09,0x08,0x09,0x0d,0x13,0x04,0x07,0x0c,0x0c,0x15,0x07,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x2f,0xed,0x39,0x3f,0xed,0x39,0x2f,0xfd,0xc6, -0x31,0x30,0x01,0x06,0x23,0x22,0x00,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x17,0x16,0x33,0x32,0x37,0x03,0x6a,0x3a,0x5c,0x96,0xfe,0xcf,0xb2,0x3a,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0x97,0x85,0x81,0x88,0x46,0x48,0x47,0xfe,0xb7,0x25,0x01,0x6e,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xad,0x2b,0x97,0x9e,0x28,0x00,0x00,0x01, -0x00,0x30,0x00,0x00,0x03,0xf6,0x06,0x02,0x00,0x19,0x00,0x29,0x40,0x14,0x13,0x08,0x10,0x01,0x0d,0x0b,0x95,0x10,0x01,0x00,0x84,0x01,0x01,0x0d,0x13,0x83,0x08,0x08,0x1b,0x0d,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x00,0x3f,0xfd,0xc6,0x2f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26, -0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x04,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x02,0x47,0xa3,0x5d,0x88,0x82,0x45,0xc1,0xe1,0xd8,0xa6,0xa1,0xde,0x01,0x29,0x01,0x1e,0x61,0x9e,0x63,0x4d,0x01,0xee,0x87,0xa2,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x83,0x6f,0x00,0xff,0xff,0x00,0x6c,0x04,0xc2, -0x01,0x31,0x05,0x85,0x02,0x06,0x00,0xdb,0x00,0x00,0x00,0x01,0xff,0x2b,0xfe,0x52,0x00,0xd4,0xff,0xe6,0x00,0x0e,0x00,0x0c,0xb3,0x05,0x0b,0x0c,0x0b,0x2f,0xcd,0x00,0x2f,0xc4,0x31,0x30,0x17,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x27,0x33,0x07,0x37,0xd4,0x9e,0x6b,0x4f,0x53,0x52,0x4f,0x6a,0x9d,0x1f,0x94,0x0f,0x61, -0x0e,0x94,0xd7,0x23,0x7b,0x39,0x8c,0x8c,0x39,0x7b,0x23,0x5b,0x40,0xa2,0xa2,0x40,0x00,0x03,0xfe,0xbd,0xfe,0x5c,0x01,0x43,0xff,0xc8,0x00,0x1a,0x00,0x26,0x00,0x32,0x00,0x34,0x40,0x1d,0x0e,0x06,0xc3,0x40,0x27,0x0f,0x1b,0x1f,0x1b,0x2f,0x1b,0x03,0x1b,0x80,0x2d,0x21,0xc3,0x13,0x00,0x30,0xf1,0x11,0x2a,0x1e,0xf1,0x03,0x24,0xf1, -0x2a,0x2f,0xfd,0xd4,0xed,0x10,0xd4,0xed,0x00,0x2f,0x33,0xed,0x32,0x1a,0xdc,0x5d,0x32,0x1a,0xed,0x32,0x31,0x30,0x17,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x32,0x17,0x16,0x17,0x36,0x37,0x36,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x23,0x32,0x36, -0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x8f,0x4b,0x69,0x69,0x4b,0x4b,0x35,0x08,0x07,0x07,0x09,0x34,0x4b,0x4b,0x69,0x69,0x96,0x34,0x09,0x07,0x07,0x08,0x35,0x4b,0x2c,0x3f,0x3f,0x2c,0x2c,0x3e,0x3e,0xf2,0x2c,0x3f,0x3f,0x2c,0x2c,0x3e,0x3e,0x38,0x6b,0x4b,0x4b,0x6b,0x36,0x08,0x0a,0x0a,0x08,0x36,0x6b,0x4b,0x4b,0x6b,0x35, -0x09,0x09,0x09,0x09,0x35,0xfe,0xdd,0x40,0x2d,0x2c,0x40,0x40,0x2c,0x2d,0x40,0x40,0x2d,0x2c,0x40,0x40,0x2c,0x2d,0x40,0x00,0x00,0x01,0xff,0x60,0x04,0xba,0x00,0xa0,0x06,0x70,0x00,0x07,0x00,0x16,0x40,0x09,0x05,0x06,0xdb,0x40,0x01,0x03,0x07,0x80,0x03,0x2f,0x1a,0xcd,0x00,0x2f,0xc6,0x1a,0xfd,0xcd,0x31,0x30,0x13,0x23,0x37,0x23, -0x13,0x33,0x07,0x33,0x5a,0x64,0x2d,0xc3,0x46,0x64,0x2d,0xc3,0x04,0xba,0xac,0x01,0x0a,0xac,0xff,0xff,0xfc,0xe6,0xfe,0x52,0x03,0x1a,0xff,0xd0,0x02,0x07,0x07,0x5d,0x00,0x00,0xf8,0x90,0xff,0xff,0x00,0x21,0xfe,0x74,0x04,0x50,0x04,0x18,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xe3,0xfa,0x31,0x00,0x0f,0x40,0x09, -0x02,0x10,0x1c,0x20,0x1c,0x40,0x1c,0x03,0x1c,0x00,0x11,0x5d,0x35,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x00,0x15,0x00,0x2c,0x40,0x17,0x0b,0x0a,0x08,0x91,0x0d,0x04,0x15,0x20,0x00,0x01,0x00,0x02,0x91,0x13,0x13,0x10,0x7d,0x05,0x05,0x17,0x0a,0x0a,0x00,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6, -0x5d,0x32,0x3f,0xfd,0xc6,0x32,0x31,0x30,0x37,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x27,0x68,0x9e,0xd8,0xe9,0x01,0x1f,0xfe,0xcd,0xf7,0xba,0x9a,0x86,0xcc,0x01,0x3e,0x01,0x9e,0xfe,0x90,0xfe,0xce,0xed,0x9f,0xdf,0x60,0x01,0x37,0x01,0x06,0x01,0x14,0x01,0x4a,0x56, -0xb3,0x3b,0xfe,0x58,0xfe,0xa8,0xfe,0xc0,0xfe,0x76,0x54,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x34,0xfd,0xb0,0x00,0x15,0x40,0x0e,0x01,0x1f,0x1c,0x01,0x0f,0x1c,0x5f,0x1c,0xcf,0x1c,0xff,0x1c,0x04,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0x68, -0xff,0xe8,0x04,0x96,0x05,0xb2,0x02,0x26,0x07,0xf2,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x23,0xfd,0xb0,0x00,0x15,0x40,0x0e,0x01,0x1f,0x1c,0x01,0x0f,0x1c,0x5f,0x1c,0xcf,0x1c,0xff,0x1c,0x04,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x03,0xa4,0x05,0x9a,0x00,0x09,0x00,0x26,0x40,0x13,0x01,0xee,0x08,0x03, -0x02,0x91,0x06,0x05,0x00,0x00,0x0b,0x07,0x03,0x7f,0x06,0x06,0x02,0x7e,0x07,0x2f,0xf1,0xc1,0x2f,0xed,0x11,0x12,0x39,0x2f,0x00,0x2f,0x2f,0xed,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x03,0xa4,0xfd,0xc1,0x99,0x99,0xa9,0x02,0xe8,0x04,0xfe,0xfb,0x98,0xfd,0xea,0x01,0x80,0x05,0x9a,0x00,0x00,0x01, -0x00,0xa6,0xfe,0x8b,0x02,0xdf,0x04,0x00,0x00,0x09,0x00,0x26,0x40,0x13,0x01,0x95,0x08,0x0f,0x02,0x96,0x06,0x05,0x00,0x00,0x0b,0x07,0x03,0xed,0x06,0x06,0x02,0x84,0x07,0x2f,0xf1,0xc1,0x2f,0xed,0x11,0x12,0x39,0x2f,0x00,0x2f,0x2f,0xed,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x02,0xdf,0xfe,0x6b, -0x8c,0x8c,0xa4,0x02,0x39,0x03,0x74,0xfd,0x0d,0xfe,0x0a,0x01,0x75,0x04,0x00,0x00,0xff,0xff,0xff,0xbb,0xff,0xe8,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x06,0x00,0xd8,0x98,0xc5,0x00,0x11,0x40,0x0b,0x02,0x10,0x2b,0x20,0x2b,0x70,0x2b,0xaf,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8, -0x04,0xff,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd8,0x02,0x5b,0xff,0xc5,0x00,0x11,0x40,0x0b,0x02,0x10,0x2b,0x20,0x2b,0x70,0x2b,0xaf,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xf8,0x00,0x00,0x02,0xa0,0x06,0x02,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xd5,0xfc,0xb7,0x00,0x0a, -0xb4,0x01,0x10,0x22,0x01,0x22,0x00,0x11,0x5d,0x35,0x00,0x03,0xff,0xc0,0x00,0x00,0x07,0x34,0x04,0x18,0x00,0x2c,0x00,0x36,0x00,0x3f,0x00,0xa3,0x40,0x2b,0x15,0x3e,0x0c,0x09,0x11,0x07,0x04,0x09,0x2c,0x28,0x02,0x96,0x23,0x28,0x35,0x37,0x2d,0x09,0x96,0x28,0x3e,0x3e,0x0b,0x02,0x19,0x01,0x0c,0x04,0x1e,0x31,0x19,0x03,0x3a,0x95, -0x20,0x1b,0x10,0x16,0x0f,0x06,0x01,0x0b,0x27,0xb8,0x01,0x03,0x40,0x0f,0x40,0x28,0x28,0x22,0x2d,0x00,0x84,0x01,0x0e,0x06,0x06,0x0b,0x42,0x14,0x10,0xb8,0x01,0x03,0x40,0x1b,0x40,0x11,0x16,0x17,0x3e,0x03,0x0a,0x84,0x0b,0x37,0x1e,0x35,0x03,0x05,0x84,0x06,0x0f,0x06,0x01,0x0c,0x03,0x40,0x41,0x06,0x84,0x30,0x30,0x2b,0x01,0x5f, -0x5e,0x5d,0x10,0xe1,0x17,0x39,0x18,0x2f,0xe1,0x17,0x39,0xd6,0x1a,0xed,0x33,0x2b,0x01,0x18,0x10,0xf4,0xf1,0x39,0x39,0xc0,0x2f,0x1a,0xed,0x00,0x2f,0x33,0x33,0x3f,0x3f,0x33,0xed,0x17,0x32,0x5f,0x5e,0x5d,0x12,0x39,0x2f,0xc4,0xed,0xd4,0x39,0x39,0x11,0x39,0xfd,0x11,0x39,0x11,0x39,0x39,0xc4,0x11,0x39,0x11,0x39,0x31,0x30,0x21, -0x23,0x11,0x26,0x25,0x11,0x23,0x11,0x24,0x27,0x11,0x23,0x11,0x06,0x07,0x06,0x15,0x23,0x36,0x37,0x36,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x15,0x36,0x37,0x36,0x35,0x33,0x06,0x07,0x06,0x07,0x27,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x04,0x25,0x35,0x10,0x23,0x22,0x07,0x06,0x07,0x16,0x06, -0x54,0xa4,0xb3,0xfe,0xd2,0xa4,0xfe,0xd1,0xb2,0xa4,0x21,0x16,0x38,0x77,0x02,0x5a,0x35,0x55,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0x1c,0x14,0x39,0x77,0x02,0x5b,0x34,0x4f,0xa4,0x69,0x7c,0x69,0x93,0x01,0x32,0xfe,0x2a,0xe9,0x6c,0x46,0x35,0x0d,0xb4,0x01,0x5a,0x05,0x42,0xfe,0x5f,0x01,0xc6,0x42,0x06,0xfd,0xf2, -0x01,0xfb,0x0d,0x15,0x35,0x50,0x88,0x58,0x34,0x15,0x01,0x83,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0x8a,0x0c,0x13,0x36,0x50,0x86,0x59,0x33,0x16,0x6c,0x76,0xaa,0x98,0xc0,0x86,0x2a,0x43,0x68,0x1d,0x01,0x2e,0x5b,0x44,0x64,0x07,0x00,0x02,0xff,0xc0,0x00,0x00,0x04,0xdc,0x04,0x18,0x00,0x25,0x00,0x30,0x00,0x5f,0x40,0x1a,0x0e,0x06, -0x02,0x13,0x25,0x96,0x1c,0x21,0x2f,0x28,0x09,0x96,0x21,0x12,0x12,0x08,0x16,0x2b,0x95,0x18,0x10,0x13,0x0f,0x01,0x08,0x20,0xb8,0x01,0x03,0x40,0x0b,0x21,0x21,0x1c,0x28,0x00,0x84,0x01,0x01,0x32,0x08,0x0d,0xb8,0x01,0x03,0xb7,0x0e,0x13,0x14,0x2f,0x03,0x07,0x84,0x08,0x2f,0xe1,0x17,0x39,0xd6,0xed,0x11,0x12,0x39,0x2f,0xf1,0x39, -0x39,0xc0,0x2f,0xed,0x00,0x2f,0x33,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xc4,0xed,0xd4,0x39,0x11,0x39,0xfd,0x11,0x39,0x39,0xc4,0x31,0x30,0x21,0x23,0x11,0x26,0x27,0x26,0x27,0x11,0x23,0x11,0x06,0x07,0x06,0x15,0x23,0x36,0x37,0x36,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x15,0x36,0x37,0x36,0x35,0x33,0x06,0x07,0x06, -0x07,0x25,0x16,0x17,0x35,0x10,0x23,0x22,0x07,0x06,0x07,0x16,0x03,0xf8,0xa4,0x6c,0x9a,0x9a,0x6a,0xa4,0x27,0x1a,0x2e,0x77,0x02,0x50,0x3b,0x59,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x25,0x19,0x2f,0x77,0x02,0x51,0x3b,0x56,0xfe,0x59,0x9a,0x69,0xee,0x7b,0x51,0x3f,0x0e,0x6c,0x01,0x63,0x14,0x3d,0x3d,0x14,0xfd,0xfb,0x02,0x04,0x0d,0x1e, -0x35,0x50,0x88,0x58,0x41,0x11,0x01,0x7a,0xaa,0xc2,0xd9,0xcd,0x91,0x0e,0x1d,0x36,0x50,0x86,0x59,0x41,0x12,0xd1,0x3d,0x14,0x68,0x01,0x46,0x5d,0x49,0x67,0x14,0x00,0xff,0xff,0xff,0xbb,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x98,0xf9,0xf2,0x00,0x11,0x40,0x0b,0x02,0x20,0x2b,0x5f, -0x2b,0x70,0x2b,0xe0,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xbb,0x00,0x00,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x98,0xfc,0xc8,0x00,0x11,0x40,0x0b,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0xaf,0x1e,0x04,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xa5,0x00,0x00,0x02,0xa2, -0x04,0x18,0x02,0x26,0x05,0x83,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x82,0xfc,0xc8,0x00,0x11,0x40,0x0b,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0xaf,0x1e,0x04,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x27,0xff,0xe8,0x03,0xac,0x04,0x18,0x00,0x26,0x00,0x56,0x28,0x00,0x00,0x06,0x08,0x5f,0x00,0x00,0xff,0xff,0xff,0xef,0xff,0xea, -0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xcc,0xfc,0xc8,0x00,0x13,0x40,0x0d,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0x8f,0x1e,0xaf,0x1e,0x05,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x5f,0xfc,0xc8, -0x00,0x13,0x40,0x0d,0x01,0x10,0x17,0x20,0x17,0x70,0x17,0x8f,0x17,0xaf,0x17,0x05,0x17,0x00,0x11,0x5d,0x35,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x04,0x56,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x44,0x40,0x26,0x0a,0x23,0x95,0x0d,0x0d,0x02,0x1d,0x05,0x40,0x0b,0x0f,0x48,0x05,0x07,0x95,0x02,0x10,0x16,0x1d,0x95,0x18,0x13,0x1c,0x05, -0x05,0x09,0x10,0x83,0x20,0x20,0x27,0x09,0x84,0x19,0x84,0x17,0x84,0x18,0x2f,0xe1,0xe1,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xc4,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x11,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x13,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x20,0x11,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27, -0x23,0x15,0x23,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xa6,0x02,0x1c,0xbe,0x8e,0xad,0x9d,0xfe,0x86,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xa4,0xa4,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x01,0xe4,0x02,0x34,0x48,0xa4,0x60,0xfe,0x6e,0x70,0xc4,0xfe,0xef,0xe6,0xfe,0xfb,0xfe,0xcc,0xa6, -0x8e,0x02,0x31,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0x00,0x00,0x01,0x00,0x7a,0x01,0xf6,0x03,0x37,0x05,0x9a,0x00,0x0b,0x00,0x3b,0x40,0x23,0x03,0x54,0x3f,0x08,0x4f,0x08,0x5f,0x08,0x8f,0x08,0x9f,0x08,0xaf,0x08,0x06,0x08,0x08,0x06,0x01,0x05,0x05,0x0c,0x0a,0x06,0x03,0x00,0x50,0x09,0x01,0x01,0x0d,0x08,0x04,0x50,0x05,0x2f, -0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0x37,0x6d,0xfe,0x1d,0x6d,0x6d,0x01,0xe3,0x6d,0x01,0xf6,0x01,0xa9,0xfe,0x57,0x03,0xa4,0xfe,0x67,0x01,0x99,0x00,0x00,0x02,0x00,0x60,0xfe,0x21,0x04,0x3f, -0x04,0x00,0x00,0x26,0x00,0x3c,0x00,0x54,0x40,0x30,0x38,0x0e,0x00,0x07,0x00,0x24,0x10,0x24,0x40,0x24,0x50,0x24,0x04,0x24,0x24,0x07,0x2c,0x95,0x1a,0x1b,0x09,0x06,0x95,0x07,0x0f,0x0e,0x84,0x05,0x08,0x38,0x24,0x31,0x00,0x08,0x07,0x07,0x08,0x00,0x03,0x1f,0x15,0x83,0x31,0x31,0x3e,0x27,0x83,0x1f,0x2f,0xe1,0x12,0x39,0x2f,0xe1, -0x11,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x12,0x39,0xe1,0x00,0x3f,0xed,0x39,0x3f,0xed,0x11,0x39,0x2f,0x5d,0x12,0x39,0x39,0x33,0x31,0x30,0x01,0x34,0x3e,0x02,0x37,0x21,0x35,0x21,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x03,0x14,0x1e,0x02,0x33,0x32, -0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x27,0x0e,0x03,0x01,0xd9,0x1d,0x33,0x45,0x29,0xfe,0x40,0x03,0x2d,0x58,0x90,0x66,0x37,0x42,0x64,0x74,0x64,0x42,0x4f,0x8b,0xbf,0x70,0x5b,0xaa,0x83,0x4e,0x37,0x6a,0x9a,0x63,0x14,0x11,0xd1,0x31,0x54,0x70,0x3f,0x48,0x7f,0x5e,0x36,0x15,0x3a,0x67,0x51,0x21,0x19,0x6e,0x84,0x46,0x16,0x02, -0x73,0x28,0x4d,0x43,0x37,0x12,0x8c,0x47,0x28,0x4f,0x4f,0x53,0x2d,0x32,0x4e,0x4c,0x53,0x6e,0x94,0x66,0x72,0xab,0x74,0x3a,0x37,0x6e,0xa5,0x6e,0x59,0x9b,0x85,0x70,0x2e,0x21,0x41,0xfd,0x87,0x4c,0x71,0x4b,0x25,0x27,0x4e,0x77,0x50,0x34,0x50,0x50,0x5c,0x3f,0x1a,0x17,0x36,0x6e,0x6e,0x6b,0xff,0xff,0x00,0x16,0xff,0xea,0x06,0xae, -0x05,0xec,0x00,0x26,0x00,0x57,0x00,0x00,0x00,0x27,0x00,0x4b,0x02,0xb6,0x00,0x00,0x00,0x06,0x08,0x06,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x00,0x05,0x18,0x05,0x9a,0x00,0x03,0x00,0x09,0xb2,0x03,0x03,0x02,0x00,0x2f,0x3f,0x31,0x30,0x01,0x01,0x23,0x01,0x05,0x18,0xfb,0xa2,0xa4,0x04,0x5e,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xff,0xff, -0x00,0x4a,0x00,0x00,0x02,0x46,0x04,0x00,0x02,0x26,0x05,0x6f,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x0c,0xfd,0x17,0x00,0x15,0x40,0x0e,0x01,0x0c,0x2f,0x0c,0x4f,0x0c,0x02,0xaf,0x0c,0xcf,0x0c,0xff,0x0c,0x03,0x00,0x5d,0x71,0x11,0x35,0x00,0xff,0xff,0xff,0xfb,0xff,0xf4,0x02,0x08,0x04,0x00,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07, -0x00,0xd9,0xff,0xbd,0xfd,0x17,0x00,0x15,0x40,0x0e,0x01,0x2f,0x0e,0x4f,0x0e,0x02,0xaf,0x0e,0xcf,0x0e,0xff,0x0e,0x03,0x0e,0x00,0x11,0x5d,0x71,0x35,0x00,0x00,0x03,0x00,0x22,0xfe,0x29,0x04,0xd5,0x04,0x18,0x00,0x19,0x00,0x23,0x00,0x2c,0x00,0x4b,0x40,0x29,0x14,0x21,0x05,0xe2,0x11,0x2a,0x06,0x06,0x1c,0x0a,0x26,0x95,0x0d,0x10, -0x08,0x0f,0x00,0x1c,0x95,0x18,0x16,0x03,0x1b,0x13,0x13,0x11,0x14,0x83,0x2b,0x20,0x20,0x2e,0x07,0x0a,0x2a,0x21,0x04,0x02,0x84,0x05,0x03,0x2f,0xc6,0xe1,0x17,0x39,0x12,0x39,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x23,0x11,0x23,0x11, -0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x16,0x17,0x33,0x15,0x23,0x06,0x07,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x15,0x14,0x01,0x26,0x23,0x22,0x07,0x06,0x07,0x21,0x26,0x01,0x4e,0x04,0xa4,0x84,0x84,0xa4,0x04,0x79,0xe9,0xc6,0x6f,0x65,0x09,0x82,0x84,0x0f,0x6b,0x7d,0xd9,0xc7,0x1e,0x53,0x7f, -0x95,0x54,0x45,0x0d,0xfd,0xa1,0x02,0x13,0x4f,0x87,0x8f,0x57,0x51,0x06,0x02,0x61,0x08,0x94,0xfd,0x95,0x03,0xaf,0x6d,0x01,0xbb,0xb4,0xcc,0x8a,0x7d,0xcc,0x6d,0xd1,0x85,0x9a,0xe2,0x58,0x72,0x5c,0x98,0x36,0x7f,0x02,0x0a,0x61,0x64,0x5d,0x88,0x91,0x00,0x02,0x00,0x22,0xff,0xe8,0x04,0x24,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0x3b, -0x40,0x1e,0x01,0x17,0x08,0xe2,0x11,0x0d,0x09,0x09,0x0f,0x0b,0x0f,0x13,0x95,0x04,0x16,0x12,0x12,0x01,0x16,0x10,0x84,0x0f,0x0f,0x1b,0x09,0x17,0x07,0x0c,0x84,0x0b,0x2f,0xe1,0x39,0x39,0xc6,0x12,0x39,0x2f,0xf1,0x39,0x39,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x33,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x01,0x23,0x15,0x10,0x21, -0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x01,0x32,0x11,0x35,0x21,0x15,0x10,0x04,0x24,0x6e,0xfe,0x64,0xfe,0x76,0x6e,0x6e,0xa1,0x01,0xe3,0xa2,0x6e,0xfd,0xff,0xf1,0xfe,0x1d,0x01,0xd8,0x32,0xfe,0x42,0x01,0xb2,0x3e,0x6d,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xfe,0x2d,0x01,0x2a,0x3c,0x36,0xfe, -0xd0,0x00,0x00,0x02,0x00,0x14,0xff,0xe8,0x04,0xae,0x04,0x00,0x00,0x1e,0x00,0x27,0x00,0x5e,0x40,0x31,0x12,0x26,0x1a,0xe2,0x0f,0x06,0x1d,0x1d,0x21,0x04,0x09,0x0d,0x03,0x01,0x95,0x0a,0x02,0x0f,0x21,0x95,0x16,0x16,0x0d,0x12,0x09,0x00,0x1a,0x04,0x09,0x04,0x12,0x1a,0x11,0x11,0x0c,0x0f,0x12,0x84,0x07,0x25,0x25,0x29,0x06,0x26, -0x84,0x01,0x1d,0x07,0x1a,0x2f,0xcd,0x33,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0x32,0x32,0xc1,0x2f,0x11,0x12,0x39,0x39,0x2f,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0xed,0x17,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x06,0x07,0x21,0x26,0x27,0x35,0x21,0x15,0x23,0x16,0x17, -0x33,0x15,0x23,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x23,0x35,0x33,0x36,0x13,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x16,0x01,0x1c,0xbc,0x01,0x7f,0xba,0x1c,0x02,0xb0,0x1c,0xb9,0x01,0x7e,0xb8,0x95,0x1c,0x53,0x4c,0x04,0x86,0x8a,0xf2,0xed,0x88,0x85,0x02,0x4c,0x54,0x1e,0xdc,0x5f,0xa1,0xa6,0x5b,0x54,0x06,0xfd,0x47,0x07,0x03, -0x74,0x8c,0x8e,0x55,0xd8,0xd8,0x55,0x8e,0x8c,0x6f,0xc0,0x6d,0xda,0x89,0x8d,0x8b,0x89,0xdc,0x6d,0xbe,0xfd,0xd8,0x69,0x66,0x5e,0xa2,0x9c,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x00,0x07,0x08,0x5b,0x03,0x05,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x96,0x04,0xa9,0x05,0xec,0x02,0x26, -0x00,0x47,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0xd2,0x00,0x00,0x00,0x09,0xb3,0x02,0x2a,0x2a,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x35,0xfe,0x96,0x02,0xa0,0x06,0x02,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x49,0x00,0x00,0x00,0x09,0xb3,0x01,0x21,0x21,0x09,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60, -0xfe,0x1e,0x05,0xfc,0x04,0x18,0x02,0x26,0x00,0x4a,0x00,0x00,0x00,0x27,0x08,0x5d,0x05,0x25,0x00,0x00,0x01,0x07,0x08,0x60,0x03,0xc2,0xfb,0x74,0x00,0x1b,0x40,0x0c,0x02,0x32,0x32,0x33,0x02,0x26,0x26,0x36,0x03,0x35,0x35,0x18,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96, -0x03,0xf9,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0x22,0x00,0x00,0x00,0x09,0xb3,0x01,0x0d,0x0d,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5c,0xfe,0x96,0x01,0xe3,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x0c,0x00,0x00,0x00,0x09,0xb3,0x01,0x10,0x10,0x00,0x10,0x3c,0x12, -0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x06,0xed,0x04,0x18,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x08,0x5d,0x06,0x16,0x00,0x00,0x00,0x09,0xb3,0x01,0x2c,0x2c,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x04,0x91,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0xba,0x00,0x00,0x00,0x09, -0xb3,0x01,0x1f,0x1f,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x08,0x5b,0x03,0x05,0x00,0x00,0xff,0xff,0x00,0x5c,0xfe,0x96,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x0c,0x00,0x00,0x00,0x09,0xb3,0x01,0x1d,0x1d, -0x06,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x68,0xfe,0x96,0x03,0xad,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x27,0x08,0x5d,0x02,0xd6,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0x73,0xfb,0x27,0x00,0x11,0xb7,0x02,0x3d,0x42,0x2d,0x01,0x30,0x30,0x3f,0x10,0x3c,0x12,0x34,0x00,0x10,0xf4,0x34,0x00,0xff,0xff,0xff,0x92,0xfe,0x1e, -0x03,0x4b,0x06,0x02,0x00,0x26,0x05,0x88,0x00,0x00,0x00,0x27,0x08,0x5d,0x02,0x74,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0x11,0xfb,0x74,0x00,0x1b,0x40,0x0c,0x01,0x22,0x22,0x24,0x01,0x17,0x17,0x26,0x02,0x25,0x25,0x04,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x0e,0xfe,0x96,0x04,0x06, -0x04,0x00,0x02,0x26,0x00,0x59,0x00,0x00,0x00,0x27,0x08,0x5d,0x03,0x2f,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0xcc,0xfb,0x3f,0x00,0x12,0xb7,0x02,0x1a,0x1a,0x02,0x01,0x0c,0x0c,0x1c,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0xff,0xff,0x00,0x1a,0xfe,0x96,0x03,0x92,0x04,0x00,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x07,0x08,0x5d, -0x02,0xbb,0x00,0x00,0x00,0x09,0xb3,0x01,0x14,0x14,0x02,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x21,0xfe,0x96,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x08,0x5d,0x02,0x93,0x00,0x00,0x00,0x09,0xb3,0x01,0x0a,0x0a,0x03,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5a,0xfe,0x96,0x04,0x71,0x04,0x18,0x02,0x26, -0x00,0x44,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0xc1,0x00,0x00,0x00,0x09,0xb3,0x02,0x20,0x20,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60,0xfe,0x96,0x04,0xfe,0x04,0x18,0x02,0x26,0x05,0x57,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x4e,0x00,0x00,0x00,0x09,0xb3,0x02,0x1e,0x1e,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60, -0xfe,0x96,0x05,0x21,0x06,0x02,0x02,0x26,0x05,0x5d,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x4e,0x00,0x00,0x00,0x09,0xb3,0x02,0x27,0x27,0x05,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60,0xfe,0xb4,0x04,0x84,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0xd4,0x00,0x1e,0x00,0x09,0xb3,0x02,0x1a,0x1a,0x06,0x10, -0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x52,0xfe,0x96,0x04,0x29,0x04,0x19,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0x79,0x00,0x00,0x00,0x09,0xb3,0x01,0x26,0x26,0x25,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x50,0xfe,0x96,0x03,0x3b,0x04,0x19,0x02,0x26,0x02,0x0e,0x00,0x00,0x01,0x07,0x08,0x5e,0x01,0x27,0x00,0x00, -0x00,0x09,0xb3,0x01,0x2d,0x2d,0x01,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x05,0xe0,0x04,0x18,0x00,0x26,0x02,0xce,0x00,0x00,0x00,0x27,0x08,0x5e,0x05,0x30,0x01,0xf4,0x01,0x07,0x08,0x60,0x02,0x70,0xfc,0xdd,0x00,0x12,0xb7,0x02,0x1a,0x1a,0x00,0x03,0x29,0x29,0x00,0x00,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34, -0xff,0xff,0x00,0x90,0xfe,0x96,0x02,0xd1,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x07,0x08,0x5e,0x02,0x21,0x00,0x00,0x00,0x09,0xb3,0x02,0x1c,0x1c,0x0f,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5a,0xfe,0x96,0x03,0x5a,0x04,0x18,0x02,0x26,0x05,0x5a,0x00,0x00,0x01,0x07,0x08,0x5e,0x01,0x33,0x00,0x00,0x00,0x09,0xb3,0x01, -0x21,0x21,0x01,0x10,0x3c,0x12,0x34,0x00,0x00,0x01,0xff,0x92,0xfe,0x1d,0x02,0x68,0x06,0x02,0x00,0x1f,0x00,0x28,0x40,0x15,0x17,0x95,0x09,0x0c,0x95,0x11,0x1c,0x02,0x95,0x1d,0x00,0x00,0x00,0x05,0x84,0x19,0x0e,0x09,0x83,0x15,0x19,0x2f,0xd6,0xe1,0xc4,0x10,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2f,0xed,0x31,0x30,0x01,0x26, -0x23,0x22,0x15,0x11,0x14,0x07,0x06,0x07,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x68,0x32,0x3c,0xaa,0x5d,0x4c,0x7d,0x7f,0x3b,0x35,0x34,0x3d,0x7d,0x99,0x32,0x3c,0xac,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfc,0x71,0xa2,0x60,0x4d,0x0e,0x67,0x9d, -0x1e,0x92,0x17,0xa0,0x8b,0x01,0x06,0x1a,0xdf,0x03,0x8d,0xa4,0xbe,0x12,0xff,0xff,0x00,0x90,0xfe,0x96,0x04,0xd0,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x20,0x00,0x00,0x00,0x09,0xb3,0x01,0x13,0x13,0x00,0x10,0x3c,0x12,0x34,0x00,0x00,0x01,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x00,0x23,0x00,0x53, -0x40,0x2f,0x09,0x96,0x11,0x11,0x0e,0x10,0x01,0x01,0x01,0x17,0x95,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x10,0x0d,0x95,0x0e,0x0f,0x1d,0xec,0x21,0x1c,0x11,0x0c,0x0b,0x10,0x0b,0x10,0x0b,0x16,0x0e,0x14,0x83,0x06,0x06,0x25,0x0e,0x1f,0x19,0x83,0x01,0x2f,0xed,0xc4,0x2f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12, -0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x39,0x2f,0x5d,0xed,0xc6,0x5d,0x12,0x39,0x2f,0xed,0x31,0x30,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x23,0xa5,0xb1,0xae,0xdf,0xde,0xce,0x52,0x01, -0x63,0xfd,0xdb,0x03,0x2d,0xfe,0x95,0xbc,0xea,0xfe,0xbc,0xf7,0x5f,0x58,0x7e,0x3c,0x34,0x34,0x3c,0x7f,0x98,0xb7,0x01,0x01,0x68,0x84,0x72,0x81,0x74,0x33,0x01,0x74,0x8c,0x33,0xfe,0x81,0x1a,0xb8,0xa0,0xae,0xd7,0x17,0x25,0x9d,0x1f,0x93,0x17,0x9f,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x88,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x48, -0xb3,0x0e,0x02,0x05,0x13,0x41,0x0d,0x01,0x0d,0x00,0x0b,0x01,0x0b,0x00,0x10,0x01,0x0a,0x00,0x00,0x01,0x08,0x00,0x17,0x01,0x0d,0x00,0x05,0x01,0x09,0x00,0x08,0x01,0x0c,0x40,0x09,0x11,0x0e,0x01,0x15,0x15,0x1d,0x0f,0x02,0x1b,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0x11,0x33,0x33,0xed,0x00,0x3f,0xed,0x3f, -0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x15,0x23,0x36,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0x15,0x15,0x66,0x7e,0x03,0x35,0x70,0x6e,0x8e,0x81,0x68,0x76,0x42,0x03,0x7e,0x7e,0x52,0x42,0x8e,0x90,0x40,0x52,0x04,0xbe,0x43,0x54,0xab,0x84,0x80,0x97, -0x61,0x50,0xb4,0x5e,0xb6,0xc2,0x5c,0x46,0x2e,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xec,0x04,0xd1,0x00,0x15,0x00,0x32,0xb1,0x0b,0x0d,0xba,0x01,0x0d,0x00,0x08,0x01,0x09,0xb6,0xc0,0x15,0xd0,0x15,0x02,0x15,0x13,0xba,0x01,0x0d,0x00,0x02,0x01,0x0b,0xb3,0x0b,0x15,0x17,0x10,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x10,0xc6,0x32, -0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x01,0xec,0x42,0x5b,0x7b,0x96,0xa2,0x87,0x4b,0x3a,0x3a,0x42,0x50,0x60,0x5b,0x51,0x44,0x3c,0x02,0xb2,0x29,0x9b,0x7c,0x8a,0xa7,0x24,0x6c,0x2c,0x6c,0x58,0x56,0x66, -0x31,0x00,0x00,0x02,0x00,0x3d,0x02,0x48,0x02,0x10,0x04,0xd1,0x00,0x1d,0x00,0x26,0x00,0x5b,0xb5,0x05,0x00,0x0a,0x1c,0x0d,0x0f,0xba,0x01,0x0d,0x00,0x0a,0x01,0x09,0x40,0x0d,0x25,0xbf,0x16,0x01,0x00,0x16,0x10,0x16,0x20,0x16,0x03,0x16,0x20,0xbb,0x01,0x0d,0x00,0x03,0x00,0x1c,0x01,0x0b,0x40,0x0f,0x03,0x05,0x00,0x03,0x03,0x19, -0x07,0x1e,0x14,0x12,0x23,0x19,0x0d,0x28,0x12,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xed,0x10,0xd4,0xd4,0xcd,0x11,0x39,0x39,0x11,0x12,0x17,0x39,0x2f,0x00,0x3f,0xc4,0xfd,0xd4,0x5d,0x5d,0xcd,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x13,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15, -0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0xdb,0x10,0x03,0x59,0x07,0x1c,0x55,0xa2,0x88,0x4b,0x3a,0x39,0x40,0x4f,0x64,0x21,0x4d,0x58,0x3d,0x4d,0x6d,0x54,0x45,0x0d,0x2d,0x24,0x1e,0x2f,0x3c,0x36,0x02,0x9e,0x27,0x2f,0x49,0x3d,0x4e,0x84,0x8a,0xa7,0x24,0x6c,0x2c,0x6d, -0x59,0x4c,0x2a,0x4d,0x42,0x32,0x42,0x3f,0x71,0x13,0x0f,0x12,0x20,0x00,0x00,0x02,0x00,0x3e,0x02,0x8a,0x02,0x7f,0x05,0xd4,0x00,0x1c,0x00,0x27,0x00,0x62,0x40,0x10,0x16,0x14,0x17,0x02,0x1c,0x01,0x06,0x15,0x00,0x15,0x00,0x15,0x1a,0x06,0x09,0x1d,0xbe,0x01,0x0d,0x00,0x0f,0x01,0x09,0x00,0x23,0x01,0x0d,0x00,0x09,0x01,0x0b,0x40, -0x10,0x01,0x1c,0x01,0x02,0x03,0x06,0x16,0x17,0x14,0x11,0x03,0x26,0x19,0x19,0x0c,0x06,0xb8,0x01,0x0c,0xb3,0x26,0x26,0x29,0x20,0xb9,0x01,0x0c,0x00,0x0c,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xc6,0x12,0x17,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0xc4,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x31,0x30, -0x01,0x17,0x07,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x26,0x27,0x07,0x27,0x37,0x26,0x27,0x33,0x16,0x17,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x02,0x38,0x21,0x8a,0x22,0x22,0x6c,0x9d,0x86,0x86,0x98,0x9d,0x86,0x32,0x2c,0x02,0x28,0x2e,0xb6,0x1e,0x95,0x43,0x4f,0xa4, -0x2a,0x2b,0x30,0x4d,0x58,0x56,0x4d,0x49,0x54,0x05,0xd4,0x47,0x37,0x26,0x2f,0x94,0xb8,0x83,0xa8,0x99,0x83,0x85,0xa5,0x16,0x02,0x40,0x32,0x48,0x49,0x3b,0x38,0x2e,0x17,0x26,0xfe,0xd1,0x64,0x57,0x53,0x62,0x64,0x53,0xb9,0x00,0x00,0x01,0x00,0x42,0x02,0x89,0x01,0xdf,0x04,0xcf,0x00,0x1e,0x00,0x55,0xb1,0x1d,0x0d,0xb8,0x01,0x0d, -0x40,0x09,0x0e,0x0e,0x18,0x08,0xb0,0x15,0x01,0x15,0x13,0xbf,0x01,0x0d,0x00,0x18,0x01,0x09,0x00,0x06,0x00,0x08,0x01,0x0d,0x00,0x03,0x01,0x0b,0xb2,0x16,0x0e,0x1b,0xb8,0x01,0x0c,0xb6,0x11,0x0e,0x16,0x11,0x03,0x06,0x01,0xb8,0x01,0x0c,0xb3,0x0a,0x0a,0x20,0x06,0x2f,0x12,0x39,0x2f,0xed,0x12,0x17,0x39,0x2f,0xed,0x2f,0x2f,0x00, -0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x71,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x00,0x15,0x14,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x01,0xdf,0xfb,0x59,0x49,0x3e,0x55,0x87,0x9e,0x32,0x30,0x8c,0x71,0x49,0x3e,0x40,0x4d,0x6d, -0x81,0x67,0x03,0x9c,0x6f,0xa4,0x1b,0x64,0x1c,0x49,0x4c,0x63,0x47,0x41,0x1c,0x68,0x17,0x51,0x49,0x5a,0x1f,0x04,0x00,0x01,0x00,0x0a,0x02,0x9a,0x01,0x83,0x05,0xd3,0x00,0x14,0x00,0x33,0xb9,0x00,0x02,0x01,0x0d,0xb2,0x12,0x08,0x0c,0xbd,0x01,0x0d,0x00,0x05,0x00,0x0d,0x01,0x08,0x00,0x0a,0x01,0x0a,0x40,0x09,0x06,0x06,0x00,0x05, -0x09,0xcd,0x0e,0x0c,0x0a,0x2f,0xc6,0x33,0xfd,0x32,0xc4,0x39,0x2f,0x00,0x3f,0x3f,0x33,0xed,0x32,0xd4,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x83,0x1b,0x22,0x60,0x82,0x82,0x80,0x5c,0x5c,0x79,0x62,0x2a,0x18,0x05,0x59,0x0f,0x61,0x49,0x6a, -0xfe,0x46,0x01,0xba,0x6a,0x4d,0x62,0x66,0x0a,0x00,0x00,0x01,0xff,0xdd,0x01,0x94,0x01,0x56,0x04,0xbe,0x00,0x14,0x00,0x48,0x40,0x0b,0x0e,0x0c,0x0a,0xcd,0x09,0x06,0x06,0x00,0x05,0x09,0x09,0xba,0x01,0x08,0x00,0x02,0x01,0x0d,0x40,0x13,0x0f,0x12,0x1f,0x12,0x02,0x2f,0x12,0x3f,0x12,0x9f,0x12,0xaf,0x12,0xbf,0x12,0x05,0x12,0x0b, -0x08,0xbb,0x01,0x0d,0x00,0x0e,0x00,0x05,0x01,0x0a,0x00,0x3f,0x33,0xed,0x32,0xd4,0x5d,0x71,0xed,0x3f,0x01,0x2f,0x33,0xc4,0x39,0x2f,0x10,0xfd,0xc6,0x33,0x31,0x30,0x03,0x16,0x33,0x32,0x35,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x1b,0x22,0x60,0x82,0x82,0x80,0x5c,0x5c,0x79,0x62, -0x2a,0x18,0x02,0x0e,0x0f,0x61,0x58,0x6a,0x01,0x9c,0xfe,0x64,0x6a,0x5c,0x62,0x66,0x0a,0x00,0xff,0xff,0x00,0x3e,0x01,0x94,0x02,0x60,0x04,0xcf,0x02,0x06,0x07,0xaf,0x00,0x00,0x00,0x01,0x00,0x5c,0x01,0xa4,0x02,0x46,0x04,0xbe,0x00,0x11,0x00,0x30,0x41,0x0a,0x00,0x0c,0x01,0x0d,0x00,0x01,0x00,0x05,0x01,0x0b,0x00,0x10,0x00,0x08, -0x01,0x08,0x00,0x11,0x01,0x0c,0xb4,0x01,0x10,0x10,0x13,0x09,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x33,0x3f,0xc6,0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x46,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x80,0x01,0xa4, -0x01,0x4c,0x67,0xe7,0x01,0x4e,0xfe,0xce,0x98,0x53,0x40,0x01,0x37,0x00,0x00,0x02,0x00,0x0f,0x02,0x9a,0x01,0x3f,0x05,0xc4,0x00,0x0b,0x00,0x13,0x00,0x48,0x40,0x19,0x01,0x05,0x0a,0x1f,0x06,0x01,0x06,0x40,0x0c,0x10,0x48,0x06,0x06,0x08,0x03,0x0c,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x10,0x08,0xba,0x01,0x08,0x00,0x03,0x01,0x0a, -0xb3,0x0b,0x12,0x0a,0x02,0xb8,0x01,0x0c,0xb3,0x0e,0x06,0x07,0x03,0x2f,0xc4,0xc4,0xc4,0xfd,0x32,0xc4,0xc4,0x00,0x3f,0x3f,0xd4,0x5d,0xcd,0x11,0x12,0x39,0x2f,0x2b,0x71,0x33,0xcd,0x32,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x03,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x01,0x3f,0x57,0x82,0x57,0x57, -0x82,0x57,0x99,0x4e,0x50,0x4e,0x03,0x91,0xf7,0xf7,0x56,0xd7,0xd7,0x01,0x46,0x4c,0x4b,0x4b,0x4c,0x00,0x00,0x01,0x00,0x66,0x02,0x8b,0x01,0x72,0x04,0xbe,0x00,0x0b,0x00,0x1f,0x41,0x0a,0x00,0x05,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0b,0x00,0x06,0x01,0x0c,0x00,0x05,0x2f,0xfd,0xc6,0x00,0x3f,0xed,0x3f,0x31, -0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x72,0x25,0x3c,0xab,0x82,0x50,0x22,0x18,0x02,0x9b,0x10,0xb5,0x01,0x7e,0xfe,0x8a,0x52,0x12,0x00,0x01,0x00,0x11,0x02,0x9a,0x01,0x51,0x04,0xbe,0x00,0x0b,0x00,0x2e,0xb1,0x0b,0x07,0xbf,0x01,0x0d,0x00,0x08,0x01,0x08,0x00,0x01,0x00,0x04,0x01,0x0d,0x00,0x03, -0x01,0x0a,0xb2,0x0a,0x01,0x00,0xb8,0x01,0x0c,0xb2,0x07,0x04,0x05,0x2f,0xcd,0x32,0xfd,0xcd,0x32,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x13,0x33,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0xf2,0x5f,0xfe,0xc0,0x5f,0x5f,0x01,0x40,0x5f,0x02,0xf0,0x56,0x56,0x01,0x78,0x56,0x56,0x00,0x00,0x01,0x00,0x11,0x02,0x9a, -0x01,0x51,0x04,0xbe,0x00,0x13,0x00,0x44,0x40,0x09,0x01,0x09,0xcb,0x12,0x0a,0x0a,0x06,0x11,0x0d,0xbf,0x01,0x0d,0x00,0x0e,0x01,0x08,0x00,0x02,0x00,0x06,0x01,0x0d,0x00,0x05,0x01,0x0a,0xb4,0x00,0x0f,0x03,0x12,0x02,0xb8,0x01,0x0c,0xb4,0x0e,0x0a,0x06,0x0b,0x07,0x2f,0x33,0xcd,0x32,0x32,0xfd,0x32,0xcd,0x32,0x32,0x00,0x3f,0xed, -0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x01,0x49,0x57,0x5f,0xfe,0xc0,0x5f,0x57,0x57,0x5f,0x01,0x40,0x5f,0x57,0x03,0x91,0xa1,0x56,0x56,0xa1,0x56,0x81,0x56,0x56,0x81,0x00,0x00,0x03,0xff,0x87,0x01,0x94, -0x01,0x6d,0x05,0xc4,0x00,0x11,0x00,0x19,0x00,0x21,0x00,0x51,0x40,0x1f,0x02,0x00,0x14,0x0f,0x0c,0x00,0x0a,0x18,0x00,0x18,0x40,0x04,0x50,0x04,0x02,0x2f,0x04,0x3f,0x04,0x02,0x04,0x1a,0x0f,0x1e,0x1f,0x1e,0x2f,0x1e,0x03,0x1e,0x0d,0xb8,0x01,0x0a,0xb3,0x11,0x20,0x02,0x0e,0xb8,0x01,0x0c,0xb5,0x1c,0x0d,0x16,0x07,0x12,0x0d,0x2f, -0x33,0xd4,0xcd,0x10,0xc4,0xfd,0x32,0xc4,0xc6,0x00,0x3f,0xd4,0x5d,0xcd,0x2f,0x5d,0x5d,0xcd,0xc4,0x10,0xd4,0x11,0x39,0x39,0xcd,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x16,0x17,0x25,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x13,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x01, -0x6d,0x45,0x47,0x23,0xb1,0x3a,0x4c,0x65,0x52,0x15,0x13,0x82,0x44,0x41,0xfe,0xf9,0x14,0x14,0x58,0x32,0x4b,0x43,0x4e,0x50,0x4e,0x01,0xcf,0x39,0x1c,0x90,0x42,0x33,0x3b,0x4f,0x02,0x02,0x2d,0xfd,0xbb,0x18,0x2e,0x0b,0x03,0x33,0x27,0x03,0x46,0x4c,0x4b,0x4b,0x4c,0x00,0x00,0x01,0x00,0x66,0x01,0x98,0x01,0x72,0x05,0xc4,0x00,0x0b, -0x00,0x1b,0xbb,0x00,0x05,0x01,0x07,0x00,0x09,0x01,0x0d,0xb2,0x02,0x0b,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xfd,0xc6,0x00,0x2f,0xed,0x3f,0x31,0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x72,0x25,0x3c,0xab,0x82,0x50,0x22,0x18,0x01,0xa8,0x10,0xb5,0x03,0x77,0xfc,0x91,0x52,0x12,0x00,0x01,0x00,0x31, -0x01,0xcb,0x01,0x3d,0x05,0xc4,0x00,0x0e,0x00,0x38,0xbb,0x00,0x00,0x01,0x07,0x00,0x0b,0x01,0x0d,0xb3,0x50,0x06,0x01,0x06,0xb8,0xff,0xc0,0xb5,0x09,0x0c,0x48,0x06,0x02,0x0e,0xbf,0x01,0x0a,0x00,0x09,0x00,0x03,0x01,0x0c,0x00,0x0d,0x00,0x01,0x01,0x0c,0x00,0x00,0x2f,0xfd,0xd5,0xfd,0xc4,0x00,0x3f,0xd5,0xd4,0x2b,0x71,0xed,0x3f, -0x31,0x30,0x13,0x33,0x11,0x33,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x23,0x66,0x80,0x57,0x64,0x63,0x25,0x20,0x1d,0x23,0x59,0x0a,0x6e,0x05,0xc4,0xfc,0xf3,0x6f,0x7d,0x0b,0x61,0x10,0x73,0x00,0x00,0x01,0x00,0x66,0x02,0x96,0x01,0xb4,0x04,0xc4,0x00,0x05,0x00,0x20,0xbb,0x00,0x02,0x01,0x06,0x00,0x04,0x01,0x0d,0xb5, -0x01,0xff,0x00,0x00,0x07,0x04,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xed,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x13,0x33,0x01,0xb3,0xfe,0xb3,0x7f,0x01,0xce,0x02,0x96,0x02,0x2e,0xfe,0x3c,0x00,0x00,0x01,0x00,0x66,0x01,0x98,0x03,0x9a,0x04,0xcf,0x00,0x25,0x00,0x65,0xb9,0x00,0x24,0x01,0x0d,0x40,0x09,0x1f, -0x1d,0x00,0x08,0x13,0x18,0x05,0x16,0x10,0xba,0x01,0x0a,0x00,0x11,0x01,0x08,0xb2,0x1a,0x03,0x0b,0xba,0x01,0x0d,0x00,0x16,0x01,0x09,0xb3,0x18,0x07,0x13,0x1d,0xb8,0x01,0x0c,0x40,0x0a,0x40,0x22,0x00,0x0e,0x08,0x10,0x08,0x42,0x13,0x0f,0xbb,0x01,0x0c,0x00,0x10,0x00,0x07,0x01,0x0c,0xb3,0x08,0x08,0x27,0x26,0x11,0x12,0x39,0x2f, -0xed,0x2f,0xed,0x32,0x2b,0x01,0x18,0x10,0xf4,0xc6,0x1a,0xed,0x11,0x12,0x39,0x00,0x3f,0xed,0x39,0x39,0x3f,0x3f,0x12,0x17,0x39,0xd4,0xed,0x31,0x30,0x01,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x11,0x02,0x23,0x22,0x27,0x35, -0x16,0x33,0x32,0x03,0x1a,0x68,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x01,0xd9,0x2b,0x25,0x22,0x23,0x65,0x02,0x9a,0x01,0x3b,0x8f,0x54,0x3f,0xfe,0xc9,0x01,0x3f,0x8b,0x52,0x45,0xfe,0xcd,0x02,0x24,0x52,0x63,0x6f,0x6f,0xe3,0xfe,0xba,0xfe,0xf2,0x10,0x68,0x14,0x00,0x00,0x01,0x00,0x60, -0x01,0xa4,0x03,0x94,0x04,0xbe,0x00,0x1d,0x00,0x56,0xb4,0x07,0x18,0x02,0x03,0x10,0xb8,0x01,0x0d,0xb2,0x05,0x01,0x09,0xb8,0x01,0x0b,0xb2,0x1c,0x14,0x0c,0xb8,0x01,0x08,0xb3,0x07,0x01,0x14,0x1d,0xb8,0x01,0x0c,0x40,0x09,0x40,0x01,0x1c,0x0e,0x14,0x0c,0x14,0x42,0x0d,0xbb,0x01,0x0c,0x00,0x0c,0x00,0x15,0x01,0x0c,0xb3,0x14,0x14, -0x1f,0x1e,0x11,0x12,0x39,0x2f,0xed,0x2f,0xed,0x2b,0x01,0x18,0x10,0xf4,0x32,0x1a,0xed,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0xc6,0x33,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0x94, -0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x7f,0x69,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x01,0xa4,0x01,0x48,0x63,0x6f,0x6f,0xe3,0x01,0x52,0xfe,0xc5,0x8f,0x54,0x3f,0x01,0x37,0xfe,0xc1,0x8b,0x52,0x46,0x01,0x32,0x00,0x01,0xff,0xbc,0x01,0x98,0x02,0x50,0x04,0xcf,0x00,0x19,0x00,0x3e,0xb1,0x0c,0x16,0xbe,0x01,0x0d,0x00,0x0f, -0x01,0x09,0x00,0x0a,0x01,0x08,0x00,0x07,0x01,0x0d,0xb3,0x02,0x00,0x09,0x13,0xba,0x01,0x0a,0x00,0x12,0x01,0x0c,0xb4,0x13,0x13,0x1b,0x0b,0x00,0xb8,0x01,0x0c,0xb1,0x05,0x09,0x2f,0xc6,0xed,0x32,0x12,0x39,0x2f,0xed,0x00,0x3f,0x33,0x33,0xd4,0xed,0x3f,0x3f,0xed,0x32,0x31,0x30,0x13,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35, -0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0xe6,0xda,0x2b,0x25,0x22,0x23,0x65,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x02,0xa6,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x02,0x24,0x56,0x67,0xe7,0xfe,0xb2,0x01,0x33,0x97,0x54,0x3f,0x00,0x01,0x00,0x66,0x01,0x98,0x02,0xfa,0x04,0xcf,0x00,0x19, -0x00,0x3f,0xb1,0x14,0x0c,0xbe,0x01,0x0d,0x00,0x17,0x01,0x09,0x00,0x12,0x01,0x08,0x00,0x02,0x01,0x0d,0xb3,0x07,0x00,0x09,0x11,0xbb,0x01,0x0a,0x00,0x04,0x00,0x00,0x01,0x0c,0xb4,0x09,0x09,0x1b,0x13,0x10,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xc6,0x00,0x3f,0x33,0x33,0xd4,0xed,0x3f,0x3f,0xed,0x32,0x31, -0x30,0x01,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x65,0x23,0x22,0x25,0x2b,0xd9,0x6d,0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x9e,0x14,0x68,0x10,0x01,0x0e,0x01,0x27,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7, -0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x6a,0x04,0xbe,0x00,0x13,0x00,0x26,0xbd,0x00,0x0a,0x01,0x08,0x00,0x09,0x01,0x0a,0x00,0x00,0x01,0x0c,0xb5,0x01,0x11,0x11,0x15,0x0b,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33, -0x13,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x02,0x6a,0x7f,0xea,0x14,0x07,0x02,0x02,0x80,0x84,0xe5,0x12,0x09,0x02,0x04,0x82,0x02,0x9a,0x01,0x4d,0x1c,0x0d,0x1d,0x2a,0xfe,0xd1,0x02,0x24,0xfe,0xbc,0x18,0x12,0x1c,0x22,0x01,0x30,0x00,0x03,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xcf,0x00,0x0b,0x00,0x14,0x00,0x1d,0x00,0x3f,0xb9,0x00, -0x13,0x01,0x0d,0xb3,0x19,0x19,0x0e,0x15,0xbe,0x01,0x0d,0x00,0x06,0x01,0x09,0x00,0x0e,0x01,0x0d,0x00,0x00,0x01,0x0b,0xb3,0x1a,0x19,0x13,0x09,0xb8,0x01,0x0c,0xb3,0x12,0x12,0x1f,0x13,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x26, -0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x16,0x13,0x22,0x07,0x06,0x07,0x21,0x26,0x27,0x26,0x01,0x58,0x80,0x9a,0xa2,0x84,0x80,0x9b,0xa3,0xf2,0x2c,0x48,0x49,0x2b,0x21,0x08,0xfe,0xc5,0x08,0x96,0x49,0x2c,0x1d,0x0a,0x01,0x38,0x0a,0x1e,0x2b,0x02,0x89,0x9e,0x7f,0x87,0xa2,0x9f,0x7e, -0x88,0xa1,0x97,0x2c,0x2c,0x21,0x40,0x40,0x01,0x23,0x2c,0x1e,0x36,0x37,0x1e,0x2b,0x00,0x03,0x00,0x3e,0x01,0xa4,0x02,0xb1,0x05,0xc4,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x54,0xb1,0x1c,0x26,0xb8,0x01,0x0d,0xb2,0x0c,0x0a,0x09,0xbb,0x01,0x09,0x00,0x1d,0x00,0x25,0x01,0x0d,0xb5,0x14,0x40,0x00,0x01,0x00,0x01,0xb8,0x01,0x0b,0xb2, -0x0c,0x1d,0x15,0xb8,0x01,0x0c,0xb5,0x09,0x25,0x00,0x00,0x05,0x10,0xb8,0x01,0x0c,0xb3,0x18,0x18,0x29,0x21,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x00,0x3f,0xcd,0x5d,0x33,0xed,0x32,0x3f,0xcd,0x33,0xed,0x32,0x31,0x30,0x01,0x35,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37, -0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x13,0x36,0x35,0x34,0x27,0x26,0x27,0x11,0x36,0x01,0x06,0x15,0x14,0x17,0x16,0x17,0x11,0x06,0x01,0x36,0x6e,0x3d,0x4d,0x51,0x3d,0x6a,0x82,0x6e,0x3d,0x4e,0x52,0x3e,0x69,0x4c,0x2c,0x2c,0x1b,0x31,0x31,0xff,0x00,0x2b,0x2c,0x1b,0x31,0x31,0x01,0xa4,0xe8,0x0d,0x3f,0x4f, -0x7f,0x87,0x51,0x3d,0x0f,0xfa,0xf8,0x0d,0x40,0x4f,0x7e,0x88,0x51,0x3d,0x0f,0xe9,0x01,0x81,0x31,0x56,0x58,0x30,0x1e,0x0b,0xfe,0x9d,0x0c,0x01,0x2d,0x31,0x56,0x56,0x31,0x1f,0x0c,0x01,0x63,0x0b,0x00,0x01,0x00,0x42,0x01,0xe2,0x01,0xa1,0x04,0xd1,0x00,0x2b,0x00,0x4f,0xb1,0x03,0x08,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x12,0x48,0x08, -0x10,0x27,0x16,0x21,0x04,0x19,0x0e,0xbe,0x01,0x0d,0x00,0x2a,0x01,0x0b,0x00,0x1e,0x01,0x0d,0x00,0x19,0x01,0x09,0xb7,0x1b,0x21,0xcd,0x16,0x1b,0x16,0x0c,0x27,0xb8,0x01,0x0c,0xb5,0x10,0x10,0x2d,0x05,0x01,0x0c,0x2f,0xcd,0xc4,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0xed,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0xd4,0x2b, -0xcd,0x31,0x30,0x13,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x97,0x4a,0x21,0x21,0x24,0x29,0x45,0x4f,0x3f,0x41,0x60,0x2b,0x3c,0x47,0x31,0x71,0x5a, -0x44,0x36,0x31,0x3e,0x31,0x27,0x24,0x3d,0x48,0x37,0x6c,0x5f,0x24,0x02,0x92,0x12,0x53,0x13,0x4d,0x11,0x4e,0x47,0xa7,0x36,0x3b,0x20,0x29,0x1d,0x24,0x4c,0x37,0x45,0x5c,0x19,0x6f,0x29,0x23,0x18,0x21,0x27,0x1d,0x23,0x4e,0x36,0x47,0x5b,0x00,0x01,0xff,0xc9,0x01,0x94,0x01,0x83,0x05,0xd3,0x00,0x15,0x00,0x2d,0xbc,0x00,0x02,0x01, -0x0d,0x00,0x13,0x00,0x0d,0x01,0x0d,0x40,0x0d,0x40,0x08,0x50,0x08,0x02,0x2f,0x08,0x3f,0x08,0x02,0x08,0x01,0x05,0xb8,0x01,0x0c,0xb1,0x0b,0x0f,0x2f,0xc6,0xfd,0xc6,0x00,0x2f,0x5d,0x5d,0xed,0x2f,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x01, -0x83,0x1b,0x22,0x60,0x79,0x62,0x2a,0x18,0x1b,0x22,0x60,0x79,0x62,0x2a,0x18,0x05,0x59,0x0f,0x61,0xfd,0x55,0x62,0x66,0x0a,0x70,0x0f,0x61,0x02,0xab,0x62,0x66,0x0a,0x00,0x01,0x00,0x0a,0x01,0xe2,0x01,0x68,0x05,0x62,0x00,0x1d,0x00,0x53,0xb1,0x08,0x03,0xb8,0xff,0xc0,0xb6,0x0c,0x11,0x48,0x03,0x0c,0x1d,0x1b,0xbb,0x01,0x0d,0x00, -0x00,0x00,0x0c,0x01,0x0b,0xb4,0x14,0x15,0x18,0x15,0x0f,0xba,0x01,0x0d,0x00,0x12,0x01,0x08,0x40,0x0a,0x06,0x0a,0x17,0x1d,0x1d,0x1f,0x0f,0x18,0x0f,0x15,0xb8,0x01,0x0c,0xb1,0x11,0x12,0x2f,0xcd,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xc4,0xcd,0xc4,0x00,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0x33,0xfd,0xc6,0x10,0xd4,0x2b,0xcd,0x31, -0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x15,0x14,0x33,0x32,0x37,0x01,0x68,0x4f,0x45,0x29,0x24,0x21,0x21,0x4a,0x0d,0xa0,0x5c,0x5c,0x80,0x82,0x82,0x49,0x1e,0x1b,0x02,0x77,0x47,0x4e,0x11,0x4d,0x13,0x53,0x0e,0xbe,0x01,0x08,0x6a,0x80, -0x24,0xa4,0x6a,0xfe,0x5e,0x10,0x00,0x02,0x00,0x05,0x02,0x89,0x02,0x9d,0x04,0xbe,0x00,0x15,0x00,0x1d,0x00,0x59,0xb4,0x1b,0x1a,0x01,0x03,0x0a,0xb8,0x01,0x0d,0x40,0x09,0x14,0x10,0x5f,0x0d,0x01,0x0d,0x0d,0x12,0x0e,0xbf,0x01,0x08,0x00,0x04,0x00,0x16,0x01,0x0d,0x00,0x07,0x01,0x0b,0x00,0x03,0x01,0x0a,0xb5,0x15,0x1a,0x03,0x01, -0x03,0x13,0xb8,0x01,0x0c,0xb5,0x12,0x12,0x1f,0x1c,0x0a,0x0f,0xb8,0x01,0x0c,0xb1,0x0c,0x0e,0x2f,0xc6,0xed,0x39,0x39,0x12,0x39,0x2f,0xfd,0x17,0x39,0xc6,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x33,0x39,0x2f,0x71,0x33,0x33,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x35,0x23,0x35,0x33,0x35,0x33,0x15, -0x33,0x35,0x33,0x15,0x33,0x05,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x02,0x9d,0x57,0x80,0x02,0x3b,0x79,0xb4,0x57,0x57,0x7f,0xeb,0x80,0x57,0xfe,0xab,0x39,0x45,0xeb,0x03,0x91,0xf7,0x56,0x67,0xe7,0x21,0x56,0xd7,0xd7,0xd7,0xd7,0xf3,0x53,0x40,0x0a,0x05,0x98,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xbe,0x00,0x1b,0x00,0x4f, -0xb4,0x04,0x0e,0x12,0x03,0x01,0xbf,0x01,0x0d,0x00,0x0f,0x00,0x02,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x17,0x01,0x0b,0x40,0x0c,0x12,0x14,0x0f,0x00,0x1a,0x03,0x0f,0x03,0x0c,0x06,0x10,0x14,0xb8,0x01,0x0c,0xb3,0x0c,0x0c,0x1d,0x06,0xb8,0x01,0x0c,0xb1,0x02,0x1a,0x2f,0xc4,0xed,0x12,0x39,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f, -0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0xed,0x17,0x32,0x31,0x30,0x13,0x23,0x35,0x33,0x15,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0xad,0x6f,0xfa,0x7a,0x56,0x4b,0x4c,0x53,0x7a,0xfb,0x6e,0x6e,0x9b,0x89,0x84,0x99,0x04,0x54,0x6a,0x5b,0x31, -0x83,0x5f,0x5c,0x59,0x62,0x83,0x31,0x5b,0x6a,0x41,0x74,0x7c,0x9a,0x97,0x7b,0x75,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x46,0x04,0xbe,0x00,0x0d,0x00,0x29,0xb1,0x0c,0x05,0xbe,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0d,0x01,0x0c,0xb3,0x0c,0x0c,0x0f,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x12,0x39,0x2f,0xed, -0x00,0x3f,0xed,0x3f,0x33,0x31,0x30,0x01,0x14,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x02,0x46,0xfb,0xef,0x7f,0x76,0x75,0x80,0x03,0x79,0xf0,0xea,0x01,0x4b,0xfe,0xcf,0x99,0x95,0x01,0x35,0x00,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x55,0x04,0xcf,0x00,0x17,0x00,0x33,0x41,0x0c,0x00,0x0a,0x01,0x0d,0x00,0x0f, -0x00,0x00,0x01,0x08,0x00,0x04,0x01,0x0d,0x00,0x15,0x01,0x0b,0x00,0x0d,0x00,0x12,0x01,0x0c,0xb3,0x07,0x07,0x19,0x01,0xb9,0x01,0x0c,0x00,0x00,0x2f,0xed,0x12,0x39,0x2f,0xed,0xc4,0x00,0x3f,0xed,0x3f,0xd4,0xed,0x31,0x30,0x13,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x23,0x22,0x35,0x5c,0x7f,0x73,0x4d,0x39,0x1e,0x24,0x21,0x1e,0x23,0x2c,0x5e,0x55,0x86,0x89,0xea,0x04,0xbe,0xfe,0xc6,0x90,0x6b,0x56,0x63,0x4c,0x0f,0x6c,0x0e,0x99,0x7e,0x8a,0xa5,0xf3,0x00,0x01,0x00,0x0b,0x02,0x9a,0x02,0x36,0x04,0xbe,0x00,0x0b,0x00,0x17,0xbb,0x00,0x00,0x01,0x0a,0x00,0x01,0x01,0x08,0xb3,0x03,0x03,0x0d,0x00, -0x2f,0x11,0x39,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x13,0x13,0x33,0x13,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x0b,0xc9,0x9b,0xc7,0x8a,0x78,0x0f,0x03,0x05,0x04,0x11,0x78,0x02,0x9a,0x02,0x24,0xfd,0xdc,0x01,0x72,0x2f,0x25,0x22,0x32,0xfe,0x8e,0x00,0x00,0x01,0x00,0x1a,0x02,0x9a,0x01,0xf5,0x04,0xbe,0x00,0x09,0x00,0x34,0xb1,0x05, -0x01,0xbf,0x01,0x0d,0x00,0x04,0x01,0x0a,0x00,0x00,0x00,0x06,0x01,0x0d,0x00,0x09,0x01,0x08,0x40,0x0c,0x02,0x07,0x06,0x07,0x02,0x01,0x04,0x05,0x00,0x00,0x0b,0x05,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x01,0xf5,0xfe,0xe8, -0x01,0x14,0xfe,0x29,0x01,0x18,0xf8,0x01,0xbb,0x04,0x86,0xfe,0x7e,0x6a,0x3a,0x01,0x80,0x6a,0x00,0x01,0x00,0x1a,0x01,0xe2,0x02,0x5a,0x04,0xbe,0x00,0x16,0x00,0x47,0xb1,0x04,0x09,0xb8,0xff,0xc0,0xb5,0x0c,0x10,0x48,0x09,0x10,0x16,0xbf,0x01,0x0d,0x00,0x0f,0x01,0x0a,0x00,0x15,0x00,0x11,0x01,0x0d,0x00,0x14,0x01,0x08,0x40,0x0f, -0x06,0x0c,0x02,0x00,0x12,0x11,0x12,0x00,0x16,0x04,0x10,0x15,0x15,0x18,0x10,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0xd6,0xcd,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0xd4,0x2b,0xcd,0x31,0x30,0x01,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x21,0x35,0x01,0x23,0x35,0x21,0x15,0x01,0x01,0xf1, -0x23,0x4a,0x21,0x21,0x24,0x29,0x45,0x4f,0x04,0xfe,0x9d,0x01,0x18,0xf8,0x01,0xbb,0xfe,0xe8,0x03,0x04,0x41,0x43,0x53,0x13,0x4d,0x11,0x4e,0x47,0x11,0x12,0x3a,0x01,0x80,0x6a,0x38,0xfe,0x7e,0x00,0x00,0x02,0x00,0x1a,0x02,0x55,0x02,0x82,0x04,0xbe,0x00,0x17,0x00,0x1e,0x00,0x52,0xb6,0x1d,0x11,0x07,0x00,0x18,0x03,0x0d,0x41,0x09, -0x01,0x0d,0x00,0x03,0x00,0x06,0x01,0x0a,0x00,0x0c,0x00,0x08,0x01,0x0d,0x00,0x0b,0x01,0x08,0x40,0x15,0x18,0x00,0x1b,0x02,0x0e,0x05,0x14,0x03,0x09,0x1b,0x14,0x08,0x09,0x0d,0x03,0x04,0x07,0x0c,0x0c,0x20,0x07,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0xd4,0xcd,0x2f,0x2f,0x12,0x39,0x39,0xcd,0x11,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f, -0xce,0xfd,0x17,0x39,0xd4,0xcd,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x23,0x35,0x01,0x23,0x35,0x21,0x15,0x01,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x36,0x35,0x34,0x23,0x22,0x01,0x4b,0x11,0x07,0x59,0x0b,0x0d,0xd8,0x01,0x18,0xf8,0x01,0xbb,0xfe,0xe8,0x3d,0x2b,0x72,0x44,0x45,0x42,0x60,0x58,0x48,0x54, -0x51,0x2e,0x41,0x02,0x9a,0x26,0x1f,0x27,0x1e,0x3a,0x01,0x80,0x6a,0x38,0xfe,0x7e,0x4e,0x57,0x42,0x32,0x43,0x58,0x6a,0x02,0x2a,0x23,0x00,0x01,0xff,0xfb,0x01,0x94,0x01,0xf7,0x04,0xbe,0x00,0x18,0x00,0x4c,0xb1,0x0b,0x09,0xb8,0x01,0x0d,0xb6,0x11,0x11,0x03,0x10,0x0d,0xe2,0x0e,0xbb,0x01,0x08,0x00,0x01,0x00,0x03,0x01,0x0d,0x40, -0x0d,0x17,0x11,0x0c,0x0f,0x0b,0x0b,0x0e,0x0f,0x0e,0x0f,0x0e,0x01,0x14,0xb8,0x01,0x0c,0xb3,0x06,0x06,0x1a,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x2f,0xfd,0xc6,0x3f,0xed,0x39,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35, -0x37,0x21,0x35,0x21,0x15,0x03,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x05,0x5a,0x5a,0x5e,0x68,0x6c,0x65,0x28,0xa7,0xfe,0xec,0x01,0xc7,0xb3,0x55,0x7f,0xb2,0x8d,0x66,0x01,0xc0,0x76,0x38,0x4d,0x46,0x4a,0x44,0x3a,0xfb,0x6a,0x3a,0xfe,0xf7,0x0c,0x79,0x62,0x70,0x90,0x00,0x00,0x03,0x00,0x3e,0x02,0x89,0x02,0x7f,0x05,0xd3,0x00,0x0a, -0x00,0x10,0x00,0x17,0x00,0x3f,0xb9,0x00,0x12,0x01,0x0d,0xb3,0x10,0x10,0x15,0x0d,0xbe,0x01,0x0d,0x00,0x06,0x01,0x07,0x00,0x15,0x01,0x0d,0x00,0x00,0x01,0x0b,0xb3,0x0b,0x10,0x12,0x08,0xb8,0x01,0x0c,0xb3,0x11,0x11,0x19,0x12,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12, -0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x13,0x02,0x23,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x01,0x58,0x85,0x95,0x9c,0x91,0x01,0x14,0x99,0x14,0x08,0x91,0x46,0x54,0x05,0x01,0x39,0xfe,0xc5,0x03,0x52,0x4a,0x48,0x51,0x02,0x89,0xd9,0xc5,0xcf,0xdd,0xfe,0x61,0xcc,0xdf,0x01, -0xdd,0x01,0x02,0x8c,0x76,0x63,0x85,0x8a,0x8c,0x00,0x00,0x03,0xff,0x3e,0x04,0xba,0x00,0xc2,0x05,0xd3,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x27,0x40,0x11,0x00,0x07,0x40,0x0d,0x80,0x02,0x19,0x13,0x01,0x03,0x01,0x03,0x16,0x0a,0x04,0x10,0x16,0x2f,0xcd,0xd4,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xcd,0xc4,0x1a,0xdc,0x1a,0xcd, -0xc4,0x31,0x30,0x03,0x05,0x07,0x25,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x6a,0x01,0x02,0x2e,0xfe,0xfe,0x01,0x5a,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0xfe,0xf2,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x05,0xd3,0xe7,0x32,0xe7,0x09,0x19, -0x22,0x22,0x19,0x19,0x22,0x22,0xbc,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x00,0x03,0xff,0x3e,0x04,0xba,0x00,0xc2,0x05,0xd3,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x27,0x40,0x11,0x0d,0x40,0x03,0x07,0x80,0x01,0x13,0x19,0x00,0x02,0x00,0x02,0x04,0x10,0x16,0x0a,0x04,0x2f,0xcd,0xd4,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xcd,0xc4, -0x1a,0xdc,0xc4,0x1a,0xcd,0x31,0x30,0x13,0x05,0x27,0x25,0x05,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x05,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x98,0xfe,0xfe,0x2e,0x01,0x02,0xfe,0xd4,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x01,0x0e,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x05,0xa1,0xe7, -0x32,0xe7,0x3b,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x8a,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x00,0x01,0xff,0x9c,0xfe,0x51,0x00,0x5b,0xff,0xc9,0x00,0x36,0x00,0x2c,0x40,0x15,0x30,0x1c,0x00,0x33,0x03,0x21,0x16,0x26,0x11,0x2b,0x0c,0x0c,0x11,0x16,0x1b,0x04,0x00,0x30,0x06,0x36,0x00,0x2f,0xcd,0xd4,0xcd,0x12,0x17,0x39,0x2f,0xcd, -0x2f,0xcd,0x2f,0xcd,0x00,0x2f,0xcd,0xcd,0xc4,0x39,0x31,0x30,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x07,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x64,0x13,0x39,0x24, -0x24,0x2b,0x0e,0x13,0x15,0x18,0x12,0x17,0x12,0x12,0x15,0x12,0x0f,0x17,0x1b,0x0b,0x01,0x1b,0x35,0x28,0x19,0x12,0x15,0x12,0x12,0x15,0x11,0x18,0x1d,0x18,0x11,0x0f,0x0f,0x18,0x04,0x87,0x2a,0x26,0x26,0x14,0x14,0x1d,0x0b,0x0c,0x13,0x08,0x07,0x0c,0x0f,0x17,0x11,0x10,0x15,0x12,0x10,0x0b,0x0b,0x0f,0x0c,0x08,0x04,0x0d,0x04,0x0c, -0x15,0x10,0x0f,0x14,0x11,0x0f,0x0b,0x0a,0x11,0x12,0x15,0x0e,0x0f,0x17,0x14,0x13,0x0c,0x0a,0x0d,0x10,0x0b,0x00,0x00,0x01,0xfe,0xdd,0x04,0xd2,0x01,0x29,0x05,0xbc,0x00,0x19,0x00,0x19,0x40,0x0a,0x0d,0x40,0x0c,0x0c,0x19,0x80,0x05,0x14,0x0d,0x19,0x2f,0xc4,0x00,0x2f,0xcd,0x1a,0xcd,0x39,0x2f,0x1a,0xcd,0x31,0x30,0x03,0x14,0x1e, -0x02,0x33,0x32,0x3e,0x04,0x33,0x17,0x22,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0xbe,0x0c,0x18,0x22,0x16,0x14,0x3a,0x43,0x48,0x44,0x3d,0x16,0x1b,0x19,0x40,0x47,0x4b,0x48,0x43,0x1b,0x29,0x45,0x31,0x1c,0x05,0x7b,0x10,0x29,0x26,0x1a,0x1b,0x28,0x2e,0x28,0x1b,0x29,0x1c,0x29,0x31,0x29,0x1c,0x36,0x4b,0x50,0x19,0xff,0xff,0x00,0x70, -0xfe,0x3c,0x01,0x50,0x05,0xd1,0x02,0x27,0x00,0x11,0x00,0x00,0x00,0x8d,0x00,0x27,0x00,0x11,0x00,0x00,0xfe,0x52,0x00,0x27,0x00,0x11,0x00,0x00,0x02,0xca,0x00,0x07,0x00,0x11,0x00,0x00,0x05,0x06,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x1e,0x01,0x24,0x02,0x07,0x07,0xa5,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x35, -0x01,0x24,0x02,0x07,0x07,0xab,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x7f,0x01,0x24,0x02,0x07,0x07,0xb4,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x12,0xfe,0xef,0x02,0x11,0x01,0x13,0x02,0x07,0x08,0x61,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x48,0xfe,0xdc,0x02,0x40,0x01,0x26,0x02,0x07,0x07,0xac,0x00,0x00,0xfc,0x55, -0x00,0x03,0x00,0x54,0xff,0x2f,0x03,0xf2,0x06,0x50,0x00,0x1c,0x00,0x27,0x00,0x2e,0x00,0x1f,0xb7,0x17,0x39,0x2d,0x28,0x22,0x2e,0x39,0x1c,0xb8,0x01,0x4d,0xb3,0x23,0x16,0x39,0x0f,0xb8,0x01,0x06,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0xed,0x31,0x30,0x05,0x23,0x37,0x2e,0x03,0x35,0x34,0x12,0x36,0x36,0x37,0x37,0x33,0x07,0x16, -0x16,0x17,0x15,0x26,0x26,0x27,0x03,0x21,0x11,0x06,0x23,0x23,0x01,0x14,0x1e,0x02,0x17,0x13,0x0e,0x03,0x01,0x32,0x36,0x37,0x11,0x23,0x03,0x02,0x39,0x6d,0x13,0x64,0x95,0x62,0x30,0x43,0x83,0xc1,0x7f,0x11,0x6d,0x11,0x51,0x8e,0x39,0x3d,0x94,0x53,0x2e,0x01,0x65,0xb9,0xe1,0x0c,0xfe,0xb0,0x1b,0x39,0x5b,0x41,0x62,0x56,0x7f,0x54, -0x29,0x01,0x67,0x43,0x7d,0x31,0xd4,0x28,0xd1,0xe2,0x15,0x6e,0xae,0xe9,0x8f,0xa5,0x01,0x07,0xbb,0x69,0x08,0xbe,0xbe,0x05,0x25,0x20,0xb0,0x2f,0x35,0x07,0xfd,0xe9,0xfd,0x94,0x7a,0x02,0xc0,0x70,0xb7,0x8a,0x5c,0x15,0x04,0x5e,0x0b,0x59,0x95,0xc9,0xfd,0x53,0x21,0x22,0x01,0x88,0xfe,0x35,0x00,0x03,0x00,0x0c,0x00,0x00,0x04,0x44, -0x05,0x9a,0x00,0x17,0x00,0x1b,0x00,0x23,0x00,0x91,0x40,0x4d,0x06,0x03,0x02,0x17,0x16,0x07,0x16,0x23,0x22,0x21,0x1a,0x19,0x09,0x08,0x1c,0x08,0x1d,0x1e,0x1f,0x20,0x1b,0x18,0x0a,0x0b,0x1c,0x0b,0x14,0x11,0x10,0x0d,0x0c,0x15,0x0c,0x02,0x1b,0x11,0x92,0x17,0x20,0x14,0x06,0x0a,0x0d,0x92,0x03,0x18,0x00,0x10,0x10,0x10,0x80,0x10, -0x03,0x10,0x10,0x14,0x1c,0x03,0x15,0x03,0x08,0x0c,0x01,0x05,0x13,0x0e,0x0e,0x15,0x16,0x1d,0x05,0x05,0x0c,0x07,0x07,0x25,0x0c,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x33,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x17,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0, -0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x0e,0xc0,0xc0,0x05,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x01,0x15,0x23,0x17,0x33,0x15,0x23,0x13,0x23,0x03,0x21,0x03,0x23,0x13,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x13,0x01,0x21,0x27,0x21,0x13,0x23,0x06,0x07,0x03,0x33,0x03,0x26,0x04, -0x2c,0xcd,0x39,0x94,0x68,0x80,0xba,0x76,0xfe,0x25,0x72,0xbb,0x7f,0x67,0x93,0x39,0xcc,0xf8,0xb5,0xad,0xb5,0xfe,0x2e,0x01,0x8a,0x34,0xfe,0xdd,0x92,0x03,0x08,0x0b,0x53,0xd1,0x55,0x09,0x03,0x5f,0x8d,0xb3,0x8d,0xfe,0x6e,0x01,0x92,0xfe,0x6e,0x01,0x92,0x8d,0xb3,0x8d,0x02,0x3b,0xfd,0xc5,0xfe,0xc0,0xb3,0x02,0x10,0x3d,0x23,0xfe, -0xdd,0x01,0x23,0x1e,0x00,0x01,0x00,0x69,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x00,0x47,0x00,0x89,0xb1,0x01,0x2f,0xb8,0x01,0x05,0xb6,0x46,0x2f,0x30,0x01,0x30,0x09,0x26,0xb8,0x01,0x05,0x40,0x44,0x06,0xd0,0x27,0xe0,0x27,0x02,0x27,0x21,0x0e,0x35,0x44,0x27,0x30,0x06,0x3f,0x1c,0x3d,0x3c,0x3a,0x91,0x3f,0x04,0x17,0x00,0x16,0x10,0x16, -0x20,0x16,0x03,0x16,0x11,0x91,0x1c,0x13,0x3c,0x09,0x06,0x01,0x46,0x04,0x44,0x0e,0x25,0x28,0x2e,0x31,0x3c,0x05,0x35,0x21,0x16,0x16,0x44,0x08,0x00,0x00,0x44,0x7d,0x35,0x35,0x49,0x48,0x30,0x27,0x0e,0x7d,0x21,0x2f,0xe1,0xc4,0x32,0x11,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39, -0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x32,0x3f,0xfd,0xc6,0x32,0x11,0x12,0x17,0x39,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x07,0x06,0x07,0x06,0x07,0x21,0x15,0x21,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x36,0x37,0x23,0x35,0x33, -0x36,0x37,0x36,0x37,0x36,0x37,0x21,0x35,0x21,0x36,0x37,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x03,0xe2,0x6f,0x04,0x30,0x41,0x34,0x3a,0x01,0x52,0xfd,0xe2,0x24,0x1d,0x2d,0x33,0x99,0x9b,0x2d,0x6a,0x69,0x5f,0x22,0x1c,0x5d,0x68,0x64,0x22,0x66,0xb8,0x8d,0x53,0x1e,0x12,0x1a, -0x54,0xc7,0x16,0x17,0x45,0x4d,0x2e,0x28,0xfe,0x24,0x02,0x80,0x19,0x0f,0x15,0x36,0x56,0x6e,0x37,0xc7,0x7f,0x61,0xd4,0x5d,0xb3,0x8c,0x56,0x1a,0x26,0x03,0x41,0x04,0x2f,0x27,0x1f,0x1f,0x6b,0x16,0x17,0x23,0x56,0x3a,0x6c,0x73,0x12,0x21,0x30,0x1e,0xc6,0x13,0x1f,0x15,0x0b,0x29,0x5c,0x93,0x6a,0x50,0x3e,0x25,0x21,0x6b,0x0f,0x0e, -0x2a,0x26,0x17,0x14,0x6b,0x19,0x1e,0x28,0x37,0x3b,0x52,0x34,0x17,0x58,0xbd,0x33,0x2e,0x5e,0x91,0x62,0x4d,0x3a,0x00,0x02,0x00,0x56,0xff,0x2f,0x03,0xe6,0x06,0x50,0x00,0x18,0x00,0x21,0x00,0x4f,0x40,0x2d,0x13,0x20,0x15,0x91,0x0d,0x9f,0x0f,0xaf,0x0f,0x02,0x0f,0x10,0x04,0x20,0x18,0x01,0x18,0x1f,0x16,0x91,0x05,0x60,0x03,0x70, -0x03,0x02,0x03,0x02,0x13,0x10,0x16,0x03,0x8c,0x0d,0x1f,0x04,0x04,0x09,0x13,0x00,0x00,0x23,0x1b,0x7e,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x00,0x3f,0xcd,0x5d,0x33,0xfd,0x32,0xc6,0x5d,0x3f,0xcd,0x5d,0x33,0xfd,0x32,0xc6,0x31,0x30,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x27,0x26,0x11,0x10, -0x37,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x01,0x06,0x11,0x10,0x17,0x16,0x17,0x11,0x06,0x03,0xe6,0x73,0xa7,0x68,0xe6,0x8d,0x9b,0xaf,0x8e,0xd1,0x68,0xad,0x6d,0x7d,0x9d,0xa4,0x76,0xfd,0x97,0x7f,0x77,0x5f,0x90,0x8a,0x3c,0x48,0x0a,0xbb,0xbb,0x11,0xb2,0xc5,0x01,0x40,0x01,0x58,0xd4,0xad,0x1f,0xa6, -0x9e,0x01,0x3a,0xb3,0x55,0x01,0xfb,0x65,0x07,0x59,0x03,0x96,0xa5,0xfe,0xec,0xfe,0xfa,0x9c,0x7c,0x19,0x04,0x89,0x1f,0x00,0x00,0x02,0x00,0x42,0x00,0xc8,0x02,0x68,0x03,0x49,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x11,0x01,0x00,0x03,0x10,0x03,0x02,0x03,0x03,0x08,0x05,0x07,0x03,0x07,0x07,0x09,0x02,0x06,0x2f,0x33,0x12,0x39,0x2f, -0x33,0x00,0x2f,0xcd,0x12,0x39,0x2f,0x5d,0xcd,0x31,0x30,0x01,0x05,0x35,0x25,0x35,0x05,0x35,0x25,0x02,0x68,0xfd,0xda,0x02,0x26,0xfd,0xda,0x02,0x26,0x01,0x9a,0xd2,0x83,0xd2,0xa9,0xd2,0x83,0xd2,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0xc1,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed, -0x00,0x2f,0x2f,0xed,0x31,0x30,0x37,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0xc1,0xfe,0xfd,0x89,0x9f,0x17,0x93,0x1f,0x9d,0x01,0x03,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0x8f,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed, -0x00,0x2f,0x2f,0xed,0x31,0x30,0x37,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0x8f,0xd1,0x89,0x9f,0x17,0x93,0x1f,0x9d,0xd1,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0x35,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed,0x00,0x2f, -0x2f,0xed,0x31,0x30,0x37,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0x35,0x77,0x89,0x9f,0x17,0x93,0x1f,0x9d,0x77,0x00,0x01,0xff,0x29,0xfe,0x96,0x00,0xb0,0x00,0x35,0x00,0x0c,0x00,0x12,0xb7,0x03,0x95,0x08,0x00,0x05,0x00,0x84,0x0c,0x2f,0xfd,0xc6,0x00,0x2f,0x2f,0xed, -0x31,0x30,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x3e,0x7e,0x3c,0x34,0x34,0x3c,0x7f,0x98,0x35,0x77,0x9d,0x1f,0x93,0x17,0x9f,0x89,0x77,0x00,0x01,0x00,0x27,0x01,0x83,0x03,0xac,0x02,0x83,0x00,0x11,0x00,0x27,0x40,0x0c,0x09,0x0f,0x96,0x03,0x06,0x96,0x11,0x2f,0x0c,0x01,0x0c,0x00,0xbc,0x01,0x03,0x00, -0x11,0x00,0x08,0x01,0x03,0x00,0x09,0x2f,0xed,0x2f,0xed,0x00,0x2f,0x5d,0xc6,0xfd,0xdc,0xed,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x24,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x04,0x33,0x32,0x35,0x03,0xac,0x60,0x7a,0x47,0xfe,0xc2,0x48,0x80,0x5e,0x60,0x7e,0x5f,0x01,0x34,0x36,0x7c,0x02,0x83,0x69,0x85,0x5f,0x71,0x6b,0x81, -0x60,0x74,0x00,0x01,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x05,0x4d,0x00,0x03,0x00,0x0d,0xb4,0x02,0x95,0x01,0x03,0x02,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x04,0xc2,0x8b,0x00,0x01,0x00,0x12,0x02,0x9a,0x02,0x11,0x04,0xbe,0x00,0x0d,0x00,0x13,0xbb,0x00,0x07,0x01,0x0a,0x00,0x09,0x01, -0x08,0xb1,0x02,0x07,0x2f,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x13,0x23,0x27,0x23,0x07,0x23,0x13,0x03,0x33,0x17,0x33,0x37,0x02,0x11,0xbc,0xb8,0x91,0x6a,0x02,0x6e,0x90,0xbe,0xb6,0x92,0x67,0x02,0x6f,0x04,0xbe,0xfe,0xeb,0xfe,0xf1,0xb2,0xb2,0x01,0x0c,0x01,0x18,0xbd,0xbd,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32, -0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x36,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x38,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00, -0x01,0x07,0x04,0x37,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x39,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x43,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x38, -0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x44,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x39,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff, -0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x36,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x41,0x01,0x0f,0x41,0x10,0x41,0x02,0x41,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a, -0xff,0xe8,0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x37,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8, -0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x43,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5, -0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x44,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xf9,0xff,0xf4,0x02,0x15,0x07,0x32, -0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0xaf,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x02,0xff,0xf4,0x02,0x32,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00, -0x01,0x07,0x04,0x37,0xfe,0xc4,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0xff,0xfc,0xff,0xf4,0x02,0x24,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0xb8,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e, -0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0xff,0xe5,0xff,0xf4,0x02,0x28,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0xad,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff, -0xff,0xee,0xff,0xf4,0x02,0x1a,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x36,0xfe,0xb4,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee, -0xff,0xf4,0x02,0x2d,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x37,0xfe,0xbf,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee,0xff,0xf4, -0x02,0x20,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x43,0xfe,0xb4,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee,0xff,0xf4,0x02,0x3a, -0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x44,0xfe,0xbf,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32, -0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x36,0xff,0xcc,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00, -0x01,0x07,0x04,0x37,0xff,0xd9,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x43,0xff,0xcd,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f, -0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x44,0xff,0xd0,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff, -0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x36,0xff,0xc7,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14, -0xff,0xe6,0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x37,0xff,0xd0,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6, -0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x43,0xff,0xc5,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e, -0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x44,0xff,0xd0,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40, -0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x64,0x00,0xf6,0x00,0xd2,0x01,0x07,0x02,0x46,0xff,0xc1,0x01,0x88,0x00,0x29,0x40,0x1a,0x04,0x0f,0x2b,0x3f,0x2b,0x8f,0x2b,0x03,0x2b,0x40,0x0d,0x15,0x36,0x2b,0x03,0x24,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x05,0x00,0x10,0xda,0x5d, -0x34,0x34,0x10,0xda,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x64,0x00,0xf6,0x00,0xd2,0x01,0x07,0x02,0x47,0xff,0xf3,0x01,0x88,0x00,0x29,0x40,0x1a,0x04,0x0f,0x2b,0x3f,0x2b,0x8f,0x2b,0x03,0x2b,0x40, -0x0d,0x15,0x36,0x2b,0x03,0x24,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x05,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x66,0x00,0xf6,0x00,0xaa,0x01,0x07, -0x02,0x46,0xff,0x8f,0x01,0x88,0x00,0x33,0x40,0x22,0x04,0x4f,0x32,0x8f,0x32,0x02,0x32,0x40,0x0c,0x15,0x36,0x32,0x03,0x7f,0x27,0x8f,0x27,0x02,0x27,0x40,0x0d,0x11,0x36,0x27,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x06,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3, -0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x66,0x00,0xf6,0x00,0xaa,0x01,0x07,0x02,0x47,0x00,0x19,0x01,0x88,0x00,0x33,0x40,0x22,0x04,0x4f,0x32,0x8f,0x32,0x02,0x32,0x40,0x0c,0x15,0x36,0x32,0x03,0x7f,0x27,0x8f,0x27,0x02,0x27,0x40,0x0d,0x11,0x36,0x27, -0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x06,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0xd2,0x01,0x07,0x02,0x46,0x00,0xef, -0x01,0x88,0x00,0x2b,0x40,0x1b,0x04,0x4f,0x3c,0x8f,0x3c,0x02,0x3c,0x40,0x0c,0x15,0x36,0x3c,0x03,0x00,0x35,0x01,0x35,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00, -0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0xd2,0x01,0x07,0x02,0x47,0x01,0x20,0x01,0x88,0x00,0x2b,0x40,0x1b,0x04,0x4f,0x3c,0x8f,0x3c,0x02,0x3c,0x40,0x0c,0x15,0x36,0x3c,0x03,0x00,0x35,0x01,0x35,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x5d, -0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x66,0x02,0x1b,0x00,0xaa,0x01,0x07,0x02,0x46,0x00,0xd1,0x01,0x88,0x00,0x31,0x40,0x20,0x04,0x8f,0x45,0x01,0x45,0x40,0x0c,0x15,0x36,0x45,0x03,0x7f,0x38,0x8f, -0x38,0x02,0x38,0x40,0x0e,0x11,0x36,0x38,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x66,0x02,0x1b, -0x00,0xaa,0x01,0x07,0x02,0x47,0x01,0x48,0x01,0x88,0x00,0x31,0x40,0x20,0x04,0x8f,0x45,0x01,0x45,0x40,0x0c,0x15,0x36,0x45,0x03,0x7f,0x38,0x8f,0x38,0x02,0x38,0x40,0x0e,0x11,0x36,0x38,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0x00,0x03, -0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x16,0x00,0x1e,0x00,0x39,0xbc,0x00,0x0f,0x01,0x43,0x00,0x19,0x00,0x1d,0x01,0x43,0xb5,0x14,0x19,0x14,0x06,0x00,0x17,0xb8,0x01,0x44,0xb2,0x11,0x07,0x1b,0xb8,0x01,0x44,0xb2,0x0c,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xe6,0x01,0x2f, -0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x32,0x12,0x11,0x10,0x21,0x22,0x02,0x11,0x10,0x12,0x13,0x32,0x11,0x10,0x23,0x22,0x11,0x10,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x04,0x8e,0xe4,0xfe,0xfe,0x3e,0xeb, -0xf9,0xef,0xec,0xe7,0xed,0xf1,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xff,0x00,0x01,0x7f,0x01,0x6c,0x02,0xdf,0xfe,0x7a,0xfe,0x84,0xfe,0xa6,0xfe,0x92,0x05,0x0d,0xfd,0xcd,0xfd,0xe2,0x02,0x14,0x02,0x3d,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x1a,0x00,0x32, -0xb9,0x00,0x1a,0x01,0x43,0x40,0x11,0x13,0x19,0x19,0x00,0x06,0x00,0x1a,0x18,0x04,0x18,0x01,0x18,0x12,0x13,0x0c,0x07,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xde,0xce,0x33,0x5d,0x3f,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0xe6,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x23, -0x0e,0x03,0x07,0x15,0x3e,0x03,0x37,0x11,0x33,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x05,0x15,0x7a,0x26,0x68,0x75,0x79,0x36,0x30,0x65,0x5b,0x49,0x13,0xe0,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x04,0xd2,0x21,0x45,0x3f,0x33,0x0f,0xce, -0x0c,0x2a,0x30,0x31,0x13,0xfb,0x51,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x32,0x00,0x4e,0xb1,0x23,0x11,0xb8,0x01,0x43,0xb2,0x31,0x10,0x1b,0xb8,0x01,0x43,0x40,0x0c,0x27,0x31,0x27,0x31,0x27,0x00,0x08,0x00,0x12,0x27,0x20,0x10,0xb8,0x01,0x44,0xb3,0x31,0x18,0x23,0x25,0xb8,0x01,0x44,0xb3,0x22, -0x20,0x07,0x0c,0xba,0x01,0x42,0x00,0x04,0x01,0x41,0x00,0x3f,0x3f,0x3f,0x33,0xe6,0x32,0x3f,0xe6,0x12,0x39,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe6,0x32,0x10,0xe6,0x33,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x05,0x21,0x35,0x34,0x3e,0x06,0x35,0x34,0x2e,0x02, -0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x15,0x14,0x0e,0x06,0x15,0x15,0x21,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x06,0x52,0xfd,0x88,0x36,0x58,0x70,0x75,0x70,0x58,0x36,0x41,0x71,0x96,0x54,0xde,0xa9,0xb0,0xc0,0xce,0x38,0x5b,0x74,0x7a,0x74, -0x5b,0x38,0x03,0x74,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0x22,0x16,0x27,0x4a,0x4d,0x52,0x5f,0x6e,0x85,0x9f,0x60,0x5d,0x8c,0x5d,0x2f,0x83,0xde,0xa4,0xda,0x4b,0x7b,0x6b,0x61,0x61,0x66,0x76,0x8c,0x55,0x6b,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31, -0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x2d,0x00,0x73,0xb2,0x15,0x25,0x17,0xb8,0x01,0x43,0x40,0x09,0x21,0x1d,0x25,0x25,0x1d,0x21,0x03,0x0c,0x11,0xb8,0x01,0x43,0x40,0x09,0x28,0x0c,0x28,0x0c,0x06,0x00,0x15,0x1a,0x25,0xb8,0x01,0x44,0x40,0x0d,0x24,0x24,0x2b,0x80,0x1d,0x01,0x2b,0x1d,0x3b,0x1d,0x02,0x1d,0x1f,0xb8,0x01,0x44,0x40, -0x09,0x1a,0x07,0x24,0x2d,0x34,0x2d,0x02,0x2d,0x2b,0xb8,0x01,0x44,0xb2,0x0e,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0xc6,0x5d,0x3f,0xe6,0xc6,0x5d,0x5d,0x12,0x39,0x2f,0xe6,0x11,0x39,0x01,0x2f,0xc4,0x39,0x39,0x2f,0x2f,0xe6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0xe6,0x11,0x39,0x31,0x30,0x13,0x10,0x00, -0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x05,0x16,0x33,0x32,0x24,0x35,0x34,0x26,0x27,0x35,0x24,0x11,0x34,0x26,0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x15,0x14,0x21,0x23,0x15,0x33,0x20,0x15,0x14,0x06,0x23,0x22,0x27,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x03,0x0b,0x79,0xcc, -0xe3,0x01,0x15,0xb7,0x9b,0x01,0x20,0xd9,0xb5,0xbc,0x8a,0x86,0x97,0xd2,0xfe,0xda,0x71,0x77,0x01,0x53,0x92,0x7b,0xb9,0x93,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xb3,0x4d,0xed,0xc1,0x8c,0xbb,0x0f,0x04,0x51,0x01,0x1b,0x96,0xc0,0x52,0xd2,0x67,0xda,0xd7,0xbd,0xe9,0x6a,0x90,0x74,0x00, -0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x1c,0x00,0x27,0x00,0x4f,0xb3,0x10,0x11,0x11,0x1a,0xb8,0x01,0x43,0x40,0x0e,0x27,0x13,0x19,0x1d,0x17,0x19,0x17,0x19,0x17,0x00,0x08,0x00,0x1b,0x18,0xb8,0x01,0x44,0x40,0x0b,0x16,0x11,0x1d,0x1d,0x12,0x1a,0x18,0x22,0x12,0x07,0x0c,0xba,0x01,0x42,0x00,0x04,0x01, -0x41,0x00,0x3f,0x3f,0x3f,0x33,0x3f,0x12,0x39,0x2f,0x33,0x33,0xe6,0x32,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0xe6,0x32,0x11,0x33,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x01,0x23,0x11,0x21,0x02,0x00,0x07,0x15,0x21,0x11,0x33,0x11,0x33,0x25,0x3e, -0x03,0x37,0x33,0x06,0x06,0x15,0x11,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x06,0x68,0xae,0xfe,0xfe,0xa4,0xfe,0xda,0x82,0x02,0x70,0xde,0xae,0xfc,0xde,0x35,0x6f,0x69,0x61,0x28,0x04,0x02,0x02,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe, -0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0x01,0x4c,0x03,0x66,0xfe,0xe0,0xfe,0x4e,0xa4,0xa7,0xfe,0x83,0x01,0x7d,0xb7,0x3b,0x95,0xa4,0xa8,0x4e,0x2a,0x49,0x21,0xfe,0x2a,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x34,0x00,0x50,0xb1,0x23,0x17,0xb8,0x01,0x43,0xb2,0x2d, -0x34,0x21,0xb8,0x01,0x43,0x40,0x09,0x26,0x2d,0x26,0x2d,0x26,0x00,0x08,0x00,0x28,0xb8,0x01,0x44,0xb3,0x1c,0x1c,0x12,0x23,0xb8,0x01,0x44,0xb2,0x25,0x06,0x32,0xb8,0x01,0x44,0xb2,0x12,0x19,0x0c,0xba,0x01,0x42,0x00,0x04,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xe6,0x12,0x39,0x2f,0xe6,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f, -0x10,0xe6,0x33,0x10,0xe6,0x32,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x05,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x22,0x06,0x06,0x07,0x13,0x21,0x35,0x21,0x03,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5, -0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x03,0x22,0x62,0xc7,0x6d,0xba,0x87,0x4d,0x4c,0x83,0xb0,0x63,0x07,0x1b,0x1f,0x1c,0x09,0x1b,0x01,0xec,0xfd,0x5e,0x3c,0xa5,0x3c,0x4a,0x7f,0x5d,0x35,0x2c,0x4c,0x65,0x39,0x97,0x94,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe, -0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0xc5,0x3b,0x3f,0x77,0xab,0x6d,0x6f,0xa3,0x6a,0x34,0x01,0x02,0x01,0x01,0x72,0xc6,0xfc,0xff,0x0c,0x22,0x40,0x5d,0x3b,0x3e,0x62,0x44,0x23,0x5f,0x00,0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x22,0x00,0x2e,0x00,0x5a,0xb5,0x0c,0x2c,0x0c, -0x2c,0x1d,0x17,0xbb,0x01,0x43,0x00,0x26,0x00,0x1d,0x01,0x43,0xb5,0x11,0x26,0x11,0x06,0x00,0x23,0xb8,0x01,0x44,0x40,0x0b,0x1a,0x1a,0x0e,0x29,0x22,0x20,0x09,0x12,0x48,0x22,0x20,0xb8,0x01,0x44,0xb2,0x0e,0x07,0x29,0xb8,0x01,0x44,0xb2,0x14,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xf6,0xcd, -0x2b,0x11,0x12,0x39,0x2f,0xe6,0x01,0x2f,0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x11,0x39,0x39,0x2f,0x2f,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x26,0x23,0x20,0x00,0x11,0x10,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x23,0x34,0x12,0x33,0x32,0x17,0x01,0x32,0x16,0x15,0x14,0x06,0x23, -0x22,0x26,0x35,0x34,0x36,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x05,0xf2,0x58,0x96,0xfe,0xf8,0xfe,0xbe,0xf6,0xd8,0xc4,0xfe,0xde,0xbc,0xad,0x61,0x03,0xc5,0xa4,0x7b,0x6f,0xfe,0x99,0x68,0x73,0x78,0x61,0x66,0x7c,0x7c,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b, -0xfd,0x49,0x02,0xb7,0x04,0xa1,0x29,0xfe,0x3e,0xfe,0x87,0xfe,0xc9,0xfe,0xa8,0x01,0x0b,0xd3,0xca,0xf1,0x8f,0xe0,0x01,0x23,0x39,0xfe,0x08,0x91,0x81,0x75,0x99,0xb0,0x7c,0x63,0x91,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x1a,0x00,0x3a,0xb2,0x0f,0x0c,0x15,0xb8,0x01,0x43,0x40,0x0e,0x14,0x0c,0x14, -0x0d,0x0d,0x14,0x0c,0x03,0x00,0x06,0x00,0x15,0x18,0x0f,0xb8,0x01,0x44,0xb2,0x0d,0x06,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe6,0x11,0x33,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x21,0x15,0x21,0x06,0x0a, -0x02,0x07,0x33,0x36,0x1a,0x02,0x37,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x06,0x78,0xfc,0x64,0x02,0x91,0x66,0x9c,0x75,0x55,0x1f,0xec,0x11,0x4e,0x80,0xb4,0x77,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x04,0xb2,0xc6,0xad,0xfe,0xbc,0xfe, -0xce,0xfe,0xdc,0x8d,0x94,0x01,0x38,0x01,0x4c,0x01,0x60,0xbc,0x00,0x04,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x25,0x00,0x39,0x00,0x4d,0x00,0x59,0x00,0x71,0xb3,0x21,0x0f,0x1e,0x44,0xb8,0x01,0x43,0xb2,0x14,0x14,0x0a,0xbb,0x01,0x43,0x00,0x30,0x00,0x3a,0x01,0x43,0xb2,0x1e,0x1e,0x26,0xb8,0x01,0x43,0x40,0x0b,0x00,0x30, -0x00,0x30,0x00,0x4e,0x54,0x4e,0x21,0x0f,0x2b,0xb8,0x01,0x44,0x40,0x09,0x60,0x49,0x70,0x49,0x02,0x49,0x49,0x51,0x57,0xbc,0x01,0x42,0x00,0x51,0x01,0x41,0x00,0x3f,0x01,0x44,0xb2,0x19,0x07,0x35,0xb8,0x01,0x44,0xb1,0x05,0x19,0x00,0x3f,0xe6,0x3f,0xe6,0x3f,0x3f,0x12,0x39,0x2f,0x5d,0xe6,0x39,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39, -0x2f,0x2f,0x10,0xe6,0x33,0x2f,0xe6,0x10,0xe6,0x32,0x2f,0xe6,0x12,0x39,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x0e,0x03,0x17,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x13,0x34, -0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x76,0x47,0x7d,0xac,0x66,0x67,0xac,0x7c,0x44,0x1d,0x38,0x4f,0x32,0x24,0x3a,0x29,0x17,0x3e,0x6e,0x97,0x58,0x57,0x95,0x6f,0x3f,0x52,0x4d,0x32,0x51,0x39,0x1f,0xe8,0x24,0x40,0x57,0x34,0x37, -0x59,0x3f,0x22,0x23,0x40,0x59,0x35,0x37,0x59,0x3e,0x21,0x2d,0x1c,0x33,0x48,0x2b,0x29,0x46,0x34,0x1d,0x1e,0x34,0x46,0x28,0x28,0x46,0x35,0x1f,0xfc,0x29,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x01,0x97,0x5f,0xa0,0x76,0x42,0x42,0x76,0xa0,0x5f,0x34,0x6c,0x65,0x55,0x1d,0x1b,0x43,0x4e, -0x55,0x2c,0x4f,0x89,0x65,0x3a,0x39,0x65,0x89,0x50,0x5a,0x9e,0x35,0x1d,0x56,0x64,0x6c,0x26,0x35,0x5e,0x46,0x29,0x2b,0x48,0x5d,0x32,0x38,0x5e,0x43,0x26,0x25,0x43,0x5e,0x02,0xc3,0x28,0x47,0x35,0x1e,0x1d,0x33,0x48,0x2a,0x29,0x4a,0x3a,0x22,0x22,0x39,0x4b,0xfe,0xc7,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49, -0x02,0xb7,0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x22,0x00,0x2e,0x00,0x5c,0xb5,0x0c,0x2c,0x0c,0x2c,0x1d,0x26,0xbb,0x01,0x43,0x00,0x17,0x00,0x11,0x01,0x43,0xb5,0x1d,0x1d,0x17,0x06,0x00,0x23,0xb8,0x01,0x44,0xb4,0x1a,0x1a,0x0e,0x29,0x22,0xb8,0xff,0xe0,0xb4,0x09,0x12,0x48,0x22,0x20,0xb8,0x01,0x44, -0xb2,0x0e,0x19,0x29,0xb8,0x01,0x44,0xb2,0x14,0x07,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xf6,0xcd,0x2b,0x11,0x12,0x39,0x2f,0xe6,0x01,0x2f,0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x05,0x16,0x33,0x20, -0x00,0x11,0x10,0x02,0x23,0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x33,0x14,0x02,0x23,0x22,0x27,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x03,0x33,0x58,0x96,0x01,0x08,0x01,0x42,0xf6,0xd8,0xc4,0xfe,0xde,0xbc,0xad,0x61, -0x03,0xc5,0xa4,0x7b,0x6f,0x01,0x67,0x68,0x73,0x78,0x61,0x66,0x7c,0x7c,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xd7,0x29,0x01,0xc2,0x01,0x79,0x01,0x37,0x01,0x58,0xfe,0xf5,0xd3,0xca,0xf1,0x8f,0xe0,0xfe,0xdd,0x39,0x01,0xf8,0x91,0x81,0x75,0x99,0xb0,0x7c,0x63,0x91,0x00,0x05,0x00,0xbc, -0xff,0x2f,0x03,0xea,0x06,0x50,0x00,0x17,0x00,0x1e,0x00,0x22,0x00,0x26,0x00,0x2d,0x00,0x5d,0x40,0x34,0x1c,0x0d,0x1f,0x91,0x2c,0x24,0x24,0x20,0x2b,0x23,0x91,0x05,0x80,0x03,0x01,0x03,0x01,0x03,0x1d,0x20,0x91,0x14,0x16,0x00,0x09,0x7d,0x29,0x1d,0x1c,0x0c,0x2c,0x05,0x05,0x15,0x8c,0x21,0x25,0x02,0x03,0x16,0x29,0x16,0x00,0x10, -0x7d,0x1a,0x1a,0x2f,0x24,0x20,0x7e,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x17,0x33,0xed,0x17,0x32,0x2f,0xe1,0x00,0x2f,0xc6,0x33,0xed,0x32,0x3f,0xc6,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x39,0x32,0x31,0x30,0x33,0x11,0x21,0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15, -0x14,0x07,0x06,0x07,0x15,0x23,0x35,0x37,0x36,0x35,0x34,0x27,0x11,0x36,0x01,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x13,0x36,0x35,0x34,0x27,0x11,0x36,0xbc,0x01,0x3a,0x68,0x93,0x5b,0x66,0x84,0x74,0x8a,0xa6,0x7a,0x6e,0xa4,0x68,0xfd,0x47,0xdc,0x5c,0xfe,0xaa,0x92,0x92,0x92,0xc6,0x46,0xa4,0x37,0x05,0x9a,0xb6,0xb7,0x09,0x51,0x5b, -0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0x72,0x68,0x09,0xd2,0xd1,0xde,0x46,0x7a,0xd8,0x20,0xfe,0x05,0x0b,0x01,0xf6,0xfd,0xfc,0x02,0x04,0x02,0x66,0xfe,0x31,0x01,0xcf,0xfe,0x73,0x43,0x79,0xab,0x1f,0xfe,0x45,0x10,0x00,0x00,0x02,0x00,0x48,0x02,0x34,0x02,0xa5,0x05,0xae,0x00,0x0a,0x00,0x12,0x00,0x1f,0x40,0x10,0x0b,0xe6, -0x06,0x27,0x0f,0xe6,0x00,0x29,0x08,0xcc,0x11,0x11,0x14,0x0d,0xcc,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x11,0x10,0x33,0x32,0x11,0x10,0x01,0x6d,0x8b,0x9a,0xa1,0x99,0x01,0x23,0xa3,0x87,0xa9,0xa6,0xa4,0x02,0x34,0xdb,0xd1,0xe5, -0xe9,0xfe,0x47,0xdb,0xe6,0x03,0x03,0xfe,0xaf,0xfe,0xc6,0x01,0x40,0x01,0x4b,0x00,0x00,0x02,0x00,0x49,0x02,0x34,0x02,0xa6,0x05,0xae,0x00,0x26,0x00,0x36,0x00,0x3c,0x40,0x23,0x04,0x10,0x14,0x10,0x02,0x27,0xe6,0x04,0x10,0x14,0x10,0x02,0x10,0x10,0x31,0x06,0xe6,0x24,0x27,0x31,0xe6,0x1a,0x29,0x01,0x01,0x1f,0x15,0xcc,0x34,0x34, -0x38,0x2c,0x0c,0xcc,0x1f,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x5d,0x31,0x30,0x01,0x15,0x2e,0x03,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x03,0x22,0x0e, -0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x63,0x0e,0x28,0x2b,0x2c,0x12,0x39,0x55,0x21,0x1f,0x2d,0x04,0x1d,0x6e,0x4e,0x3c,0x5f,0x42,0x23,0x2d,0x4f,0x6b,0x3d,0x3f,0x72,0x56,0x32,0x38,0x65,0x8c,0x54,0x2b,0x52,0xc1,0x22,0x3c,0x2c,0x1a,0x15,0x29,0x3a,0x25,0x4b,0x55,0x4d,0x05,0x8b,0x81,0x09,0x10,0x0c,0x07, -0x24,0x24,0x22,0x7f,0x61,0x32,0x41,0x27,0x47,0x63,0x3d,0x3d,0x68,0x4d,0x2b,0x31,0x63,0x99,0x67,0x75,0xb5,0x7c,0x40,0x12,0xfe,0x59,0x15,0x28,0x38,0x24,0x22,0x41,0x32,0x1e,0x5b,0x49,0x4e,0x5a,0x00,0x02,0x00,0x49,0x02,0x33,0x02,0xa6,0x05,0xae,0x00,0x27,0x00,0x39,0x00,0x3c,0x40,0x23,0x0b,0x0b,0x1b,0x0b,0x02,0x30,0xe6,0x0b, -0x0b,0x1b,0x0b,0x02,0x0b,0x0b,0x1f,0x28,0xe6,0x15,0x27,0x00,0xe6,0x1f,0x29,0x23,0x23,0x10,0x1a,0xcc,0x35,0x06,0x06,0x3b,0x2d,0xcc,0x10,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x5d,0x31,0x30,0x01,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34, -0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x1e,0x03,0x13,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x34,0x42,0x5e,0x3c,0x1b,0x04,0x0d,0x2b,0x37,0x42,0x24,0x3c,0x61,0x46,0x26,0x2a,0x4d,0x6c,0x41,0x40,0x72,0x55,0x32,0x30,0x5d,0x8a,0x5b,0x30,0x61,0x26,0x13, -0x2e,0x30,0x30,0x52,0x21,0x39,0x2a,0x18,0x52,0x45,0x20,0x3d,0x2f,0x1d,0x19,0x2c,0x3c,0x02,0xaa,0x33,0x5c,0x7e,0x4b,0x1c,0x2f,0x21,0x13,0x26,0x47,0x63,0x3c,0x3f,0x6a,0x4c,0x2a,0x33,0x65,0x96,0x64,0x69,0xb4,0x82,0x4a,0x17,0x16,0x7f,0x0b,0x13,0x0f,0x08,0x02,0x8e,0x17,0x2b,0x3f,0x28,0x4c,0x56,0x16,0x26,0x33,0x1d,0x2a,0x47, -0x32,0x1c,0x00,0x01,0x00,0x5d,0x02,0xcb,0x02,0x91,0x04,0xff,0x00,0x0b,0x00,0x1b,0x40,0x10,0x04,0x7f,0x07,0x9f,0x07,0x02,0x3f,0x07,0xdf,0x07,0xff,0x07,0x03,0x07,0x02,0x03,0x2f,0xcd,0x00,0x2f,0x5d,0x71,0xcd,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x02,0x91,0xe8,0x64,0xe8,0xe8,0x64,0xe8,0x03, -0xb3,0xe8,0xe8,0x64,0xe8,0xe8,0x00,0x01,0x00,0x5d,0x03,0xb3,0x02,0x91,0x04,0x17,0x00,0x03,0x00,0x1b,0x40,0x10,0x02,0x7f,0x01,0x9f,0x01,0x02,0x3f,0x01,0xdf,0x01,0xff,0x01,0x03,0x01,0x02,0x03,0x2f,0xcd,0x00,0x2f,0x5d,0x71,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x5d,0x02,0x34,0xfd,0xcc,0x04,0x17,0x64,0x00,0x00,0x02,0x00,0x5d, -0x03,0x22,0x02,0x91,0x04,0xa8,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x11,0x03,0x40,0x00,0x80,0x07,0x0f,0x04,0x2f,0x04,0x3f,0x04,0x03,0x04,0x06,0x07,0x02,0x03,0x2f,0xcd,0x33,0x32,0x00,0x2f,0x5d,0xcd,0x1a,0xde,0x1a,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x5d,0x02,0x34,0xfd,0xcc,0x02,0x34,0xfd,0xcc,0x03,0x86, -0x64,0x01,0x86,0x64,0x00,0x01,0x00,0xcc,0x01,0xce,0x02,0x06,0x05,0xee,0x00,0x09,0x00,0x1a,0x40,0x0d,0xdf,0x05,0x01,0x40,0x05,0x01,0x05,0x01,0x06,0x00,0x08,0xcd,0x03,0x2f,0xed,0xd4,0xc6,0x00,0x2f,0x2f,0x5d,0x5d,0x31,0x30,0x01,0x23,0x26,0x11,0x10,0x37,0x33,0x06,0x11,0x10,0x02,0x05,0x7f,0xba,0xba,0x80,0xbc,0x01,0xce,0xd4, -0x01,0x38,0x01,0x38,0xdc,0xe4,0xfe,0xd1,0xfe,0xd3,0x00,0x01,0x00,0x64,0x01,0xce,0x01,0x9e,0x05,0xee,0x00,0x09,0x00,0x1a,0x40,0x0d,0xdf,0x03,0x01,0x40,0x03,0x01,0x03,0x09,0x09,0x03,0x06,0xcd,0x01,0x2f,0xfd,0xd4,0xc6,0x00,0x2f,0x2f,0x5d,0x5d,0x31,0x30,0x00,0x11,0x10,0x27,0x33,0x16,0x11,0x10,0x07,0x23,0x01,0x20,0xbc,0x80, -0xba,0xba,0x7f,0x02,0xae,0x01,0x2d,0x01,0x2f,0xe4,0xdc,0xfe,0xc8,0xfe,0xc8,0xd4,0x00,0x02,0x00,0x5b,0x02,0xcd,0x01,0x05,0x06,0xeb,0x00,0x0b,0x00,0x0f,0x00,0x1c,0x40,0x0d,0x0d,0x24,0x00,0x40,0x06,0x80,0x0e,0x03,0x09,0x0c,0xc2,0x03,0x0d,0x2f,0xc4,0xfd,0xc4,0x00,0x3f,0x1a,0xdc,0x1a,0xcd,0x3f,0x31,0x30,0x13,0x22,0x26,0x35, -0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0xaf,0x25,0x2f,0x2f,0x25,0x26,0x30,0x30,0x19,0x80,0x80,0x06,0x54,0x2b,0x21,0x1f,0x2c,0x2c,0x1f,0x20,0x2c,0xfc,0x79,0x02,0xcf,0x00,0xff,0xff,0x00,0x68,0x03,0x74,0x02,0x92,0x06,0xda,0x02,0x07,0x00,0xf1,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x81,0x03,0x5f,0x02,0x8e, -0x06,0xda,0x02,0x07,0x00,0xf2,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x50,0x03,0x74,0x01,0xc2,0x06,0xdc,0x02,0x07,0x00,0xf0,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x48,0x03,0x60,0x02,0xa5,0x06,0xda,0x02,0x07,0x08,0x8d,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x2f,0x03,0x74,0x02,0xaa,0x06,0xc6,0x02,0x07,0x02,0x38,0x00,0x00,0x01,0x2c, -0xff,0xff,0x00,0x7b,0x03,0x5f,0x02,0x8a,0x06,0xca,0x02,0x07,0x02,0x39,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x49,0x03,0x60,0x02,0xa6,0x06,0xda,0x02,0x07,0x08,0x8e,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x4d,0x03,0x74,0x02,0xa0,0x06,0xd0,0x02,0x07,0x02,0x3a,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x41,0x03,0x60,0x02,0xad,0x06,0xda, -0x02,0x07,0x02,0x3b,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x49,0x03,0x5f,0x02,0xa6,0x06,0xda,0x02,0x07,0x08,0x8f,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x5d,0x03,0xf7,0x02,0x91,0x06,0x2b,0x02,0x07,0x08,0x90,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x5d,0x04,0xdf,0x02,0x91,0x05,0x43,0x02,0x07,0x08,0x91,0x00,0x00,0x01,0x2c,0xff,0xff, -0x00,0x5d,0x04,0x4e,0x02,0x91,0x05,0xd4,0x02,0x07,0x08,0x92,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0xcc,0x02,0xfa,0x02,0x06,0x07,0x1a,0x02,0x07,0x08,0x93,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x64,0x02,0xfa,0x01,0x9e,0x07,0x1a,0x02,0x07,0x08,0x94,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x48,0xfe,0xfa,0x02,0xa5,0x02,0x74,0x03,0x07, -0x08,0x8d,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0x0e,0x01,0xc2,0x02,0x76,0x03,0x07,0x00,0xf0,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0x0e,0x02,0x92,0x02,0x74, -0x03,0x07,0x00,0xf1,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x81,0xfe,0xf9,0x02,0x8e,0x02,0x74,0x03,0x07,0x00,0xf2,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x2f,0xff,0x0e,0x02,0xaa,0x02,0x60, -0x03,0x07,0x02,0x38,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7b,0xfe,0xf9,0x02,0x8a,0x02,0x64,0x03,0x07,0x02,0x39,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0xfe,0xfa,0x02,0xa6, -0x02,0x74,0x03,0x07,0x08,0x8e,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x4d,0xff,0x0e,0x02,0xa0,0x02,0x6a,0x03,0x07,0x02,0x3a,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x41,0xfe,0xfa, -0x02,0xad,0x02,0x74,0x03,0x07,0x02,0x3b,0x00,0x00,0xfc,0xc6,0x00,0x11,0x40,0x09,0x02,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x49,0xfe,0xf9,0x02,0xa6,0x02,0x74,0x03,0x07,0x08,0x8f,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d, -0x35,0x35,0xff,0xff,0x00,0x5d,0xff,0x91,0x02,0x91,0x01,0xc5,0x03,0x07,0x08,0x90,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x5d,0x00,0x79,0x02,0x91,0x00,0xdd,0x03,0x07,0x08,0x91,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11, -0x5d,0x35,0xff,0xff,0x00,0x5d,0xff,0xe8,0x02,0x91,0x01,0x6e,0x03,0x07,0x08,0x92,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xcc,0xfe,0x94,0x02,0x06,0x02,0xb4,0x03,0x07,0x08,0x93,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00, -0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x64,0xfe,0x94,0x01,0x9e,0x02,0xb4,0x03,0x07,0x08,0x94,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0xbc,0xfe,0x7e,0x06,0x12,0x07,0x4e,0x00,0x17,0x00,0x24,0x00,0x77,0x40,0x16,0x24,0xc4,0x18,0x1e,0xc4,0x1f,0x1f,0x00,0x0c,0x0f, -0x04,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7e,0x0e,0xb8,0xff,0xfe,0x40,0x17,0x0b,0x06,0x4d,0x0e,0x04,0x03,0x40,0x01,0x01,0x00,0x04,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x16,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xdc,0x40,0x11,0x0b,0x06,0x4d,0x05,0x24,0x1e,0x80,0x21,0xda,0x1b,0x17, -0x03,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xd6,0xed,0x1a,0xcc,0x32,0x01,0x2f,0x2b,0x2b,0x33,0xf1,0x2b,0x2b,0xc1,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x31,0x30,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x14,0x07,0x33,0x36, -0x37,0x01,0x33,0x03,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x05,0x40,0xd2,0xb8,0xc1,0xab,0xac,0x0a,0x06,0x13,0x1b,0xfd,0x1e,0xd0,0xa8,0x08,0x04,0x16,0x22,0x02,0xd0,0xd8,0xd4,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68,0x0c,0x96,0xfd,0xe8,0x01,0x82,0x04,0x0c,0x8c,0x39,0x31,0x29,0xfb,0x89, -0x05,0x9a,0xfc,0x0e,0xa2,0x31,0x2c,0x34,0x04,0x65,0x01,0xb4,0x8d,0xa3,0xa3,0x8d,0xbc,0x63,0x59,0x00,0x00,0x02,0x00,0xa6,0xfe,0x8b,0x04,0xda,0x05,0xf2,0x00,0x11,0x00,0x1e,0x00,0x49,0x40,0x0a,0x1e,0xc4,0x12,0x18,0xc4,0x19,0x19,0x01,0x05,0x08,0xb8,0x01,0x2e,0xb6,0x07,0x00,0x11,0x0f,0x0f,0x40,0x0e,0xb8,0x01,0x2e,0x40,0x0f, -0x0c,0x01,0x11,0x1e,0x18,0x80,0x1b,0xda,0x15,0x0d,0x0f,0x0e,0xec,0x01,0x15,0x00,0x3f,0xed,0x3f,0xd6,0xed,0x1a,0xcc,0x32,0x2f,0x01,0x2f,0x33,0xf1,0x1a,0xc9,0x2f,0xcd,0x39,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x36,0x37,0x01,0x33,0x11,0x33,0x03,0x23,0x13, -0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x04,0x19,0xad,0x16,0x2d,0xfe,0x27,0xaa,0x96,0x0c,0x28,0x01,0xe6,0xaa,0xda,0xb0,0xb4,0x4e,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68,0x0c,0x03,0x31,0x2b,0x4e,0xfd,0x48,0x04,0x00,0xfc,0xd9,0x1d,0x46,0x02,0xc4,0xfc,0x96,0xfd,0xf5,0x07,0x67,0x8d,0xa3, -0xa3,0x8d,0xbc,0x63,0x59,0x00,0x00,0x01,0x00,0x10,0xfe,0x7e,0x05,0x76,0x05,0x9a,0x00,0x16,0x00,0x62,0x40,0x19,0x0b,0x18,0x0b,0x00,0x4d,0x04,0x03,0x01,0x01,0x00,0x08,0x0b,0x0d,0x06,0x4c,0x00,0x7e,0x07,0x15,0x05,0x28,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xda,0x40,0x1a,0x0b,0x06,0x4d,0x20, -0x05,0x01,0x05,0x15,0x05,0x15,0x18,0x0f,0x06,0x91,0x16,0x03,0x0f,0x11,0x91,0x0c,0x13,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xfd,0xc6,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x2b,0x2b,0x11,0x33,0xf1,0x2b,0xc1,0x2f,0xcd,0x39,0x31,0x30,0x00,0x2b,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x21,0x02,0x02, -0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x04,0xa4,0xd2,0xb8,0xc1,0xab,0xac,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0x96,0xfd,0xe8,0x01,0x82,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0x00,0x01,0x00,0x10,0xfe,0x8b, -0x04,0x6c,0x04,0x00,0x00,0x12,0x00,0x36,0x40,0x1c,0x07,0xed,0x11,0x04,0x03,0x01,0x01,0x00,0x84,0x11,0x0d,0x05,0x05,0x14,0x0d,0x06,0x95,0x12,0x0f,0x0f,0x95,0x0a,0x15,0x00,0xec,0x05,0x15,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0xf1,0xc1,0x2f,0xcd,0x39,0x10,0xed,0x31,0x30,0x25,0x33, -0x03,0x23,0x13,0x23,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x03,0x91,0xdb,0xb0,0xb4,0xa3,0xbd,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x96,0xfd,0xf5,0x01,0x75,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0x00,0x01,0x00,0xbc,0xfe,0x7e,0x05,0xc4,0x05,0x9a,0x00,0x0f, -0x00,0x4c,0x40,0x17,0x02,0x06,0x91,0x40,0x0b,0x0a,0x07,0x0b,0x91,0x2b,0x30,0x0d,0x0a,0x03,0x0f,0x91,0x04,0x40,0x04,0x07,0x03,0x00,0x01,0xb8,0x01,0x2c,0x40,0x0e,0x02,0x80,0x00,0x00,0x0f,0x7e,0x0c,0x05,0x05,0x11,0x0b,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0xc1,0x2f,0x1a,0xdd,0xe1,0x12,0x39,0x00,0x2f,0x33, -0x1a,0x10,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x2f,0x31,0x30,0x25,0x03,0x23,0x13,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x05,0xc4,0xb8,0xc1,0xab,0xac,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x96,0xfd,0xe8,0x01,0x82,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xfc,0x00,0x01,0x00,0xa6, -0xfe,0x8b,0x04,0xd3,0x04,0x00,0x00,0x0f,0x00,0x4a,0x40,0x14,0x06,0x95,0x40,0x0b,0x0a,0x07,0x0b,0x95,0x2b,0x30,0x0d,0x0a,0x0f,0x02,0x0f,0xec,0x04,0x04,0x07,0x01,0xb8,0x01,0x2c,0x40,0x10,0x02,0x03,0x00,0x00,0x03,0x03,0x0f,0x84,0x0c,0x05,0x05,0x11,0x0b,0x06,0x84,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x32,0x2f,0x33, -0x2f,0x10,0xdd,0xe1,0x00,0x2f,0x33,0x10,0xed,0x2f,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x25,0x03,0x23,0x13,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0xd3,0xb0,0xb4,0xa3,0xbe,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x96,0xfd,0xf5,0x01,0x75,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4, -0xfc,0x96,0x00,0x01,0x00,0xbc,0xfe,0x7e,0x07,0x44,0x05,0x9a,0x00,0x1f,0x00,0x2b,0x40,0x15,0x04,0x03,0x01,0x01,0x00,0x7e,0x1e,0x05,0x05,0x21,0x17,0x14,0x7e,0x15,0x1f,0x03,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0xc1,0x2f,0xcd,0x39,0x31,0x30,0x25,0x33,0x03,0x23,0x13, -0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x06,0x72,0xd2,0xb8,0xc1,0xab,0xab,0x0e,0x04,0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x15,0x16,0x04,0x08,0xa2,0xde,0x01,0xb8,0x33,0x0f,0x06,0x2b,0x1a,0x01,0xc1,0xd2,0x96,0xfd,0xe8,0x01,0x82, -0x03,0xc2,0x72,0xa5,0x61,0x2a,0xfb,0xb2,0x04,0x46,0x30,0x63,0x56,0xc3,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x73,0x39,0x76,0x3a,0x03,0xe4,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x05,0xd3,0x04,0x00,0x00,0x17,0x00,0x29,0x40,0x14,0x04,0x03,0x01,0x16,0x00,0x84,0x05,0x05,0x19,0x11,0x0e,0xed,0x0f,0x17,0x0f,0x00,0xec,0x05,0x15,0x03,0x00,0x2f, -0x3f,0xed,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xe1,0x33,0xdd,0xcd,0x39,0x31,0x30,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01,0x33,0x04,0xf8,0xdb,0xb0,0xb4,0xa3,0xbc,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49, -0x01,0x06,0xda,0x96,0xfd,0xf5,0x01,0x75,0x03,0x4c,0x40,0x7c,0xfd,0x70,0x02,0x90,0x35,0x87,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x49,0x81,0xc6,0x02,0xa0,0x00,0x00,0x01,0x00,0x5a,0x01,0xfa,0x03,0xf6,0x02,0x7b,0x00,0x03,0x00,0x0e,0xb4,0x03,0x02,0x01,0xeb,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0xf6, -0xfc,0x64,0x03,0x9c,0x01,0xfa,0x81,0x00,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x1c,0x40,0x0e,0x05,0xb4,0x07,0x01,0xb4,0x03,0x06,0xb3,0x07,0x04,0x02,0xb3,0x03,0x04,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x13,0x23,0x03,0x21,0x13,0x23,0x03,0x01,0x04,0x6c,0x76, -0x8c,0x01,0xc3,0x6f,0x76,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x03,0x00,0x8d,0x03,0xdb,0x03,0x9d,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x20,0x40,0x0e,0x08,0x0a,0x04,0x06,0x00,0x02,0x0a,0x06,0x02,0xb3,0x0b,0x07,0x03,0x03,0x00,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x2f,0xcd,0x2f,0xcd, -0x31,0x30,0x01,0x03,0x23,0x13,0x21,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x01,0x69,0x69,0x73,0x55,0x02,0xbb,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x03,0x00,0xe8,0x00,0x69,0x04,0x94,0x04,0x3a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x43,0x40,0x1b,0x02,0x01, -0xbe,0x59,0x0a,0x02,0x0e,0x59,0x0a,0x09,0xbe,0x59,0x06,0x05,0xbe,0x59,0x0a,0x06,0x42,0x06,0x4f,0x0a,0x01,0x0a,0x03,0x0b,0x04,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x04,0x02,0x0a,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x33,0x33,0x2f,0x2b,0x33,0x33,0x00,0x2f,0x5d,0xc6,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x25, -0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0x69,0x84,0x02,0xc9,0x84,0xfd,0xd9,0x84,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x03,0xdf,0x05,0xb2,0x00,0x15,0x00,0x1f,0x40,0x0f,0x0b,0x15,0x15,0x17,0x10,0x7d,0x05,0x0d,0x91,0x08,0x04,0x13,0x91,0x02, -0x13,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe1,0x11,0x39,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x37,0x03,0xdf,0x85,0xc7,0xff,0x00,0xfe,0xcb,0x01,0x5b,0x01,0x0b,0xab,0x70,0x7c,0x96,0xc7,0xf8,0xe7,0xbc,0xaf,0x7f,0x3c,0x54,0x01,0x8a,0x01, -0x40,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0xd2,0x05,0x9a,0x00,0x25,0x00,0x32,0x40,0x1a,0x0b,0x7e,0x09,0x0c,0x0c,0x27,0x00,0x23,0x7e,0x24,0x04,0x1e,0x10,0x03,0x25,0x18,0x18,0x24,0x25,0x03,0x24,0x12,0x0c,0x12,0x09,0x03,0x00,0x3f,0x3f,0x3f, -0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x31,0x30,0x01,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x11,0x23,0x11,0x34,0x36,0x37,0x23,0x0e,0x03,0x07,0x01,0x23,0x01,0x2e,0x03,0x27,0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x01,0x95,0x01,0x74,0x19,0x21,0x08,0x06,0x0a,0x1d,0x1a,0x01, -0x64,0xdc,0xa7,0x07,0x07,0x04,0x07,0x18,0x1b,0x16,0x05,0xfe,0x8f,0x52,0xfe,0x90,0x04,0x19,0x1a,0x17,0x05,0x04,0x04,0x04,0xa2,0x05,0x9a,0xfd,0x56,0x2d,0x4e,0x1d,0x1e,0x50,0x2e,0x02,0xa6,0xfa,0x66,0x03,0xc2,0x39,0x91,0x53,0x18,0x3b,0x37,0x2c,0x0b,0xfd,0x58,0x02,0xa6,0x0c,0x2d,0x37,0x3a,0x19,0x2b,0x92,0x62,0xfc,0x40,0x05, -0x9a,0x00,0x00,0x01,0x00,0xa6,0xfe,0x2a,0x04,0xf8,0x04,0x00,0x00,0x13,0x00,0x32,0x40,0x1a,0x13,0x84,0x12,0x02,0x02,0x15,0x0d,0x09,0xed,0x0c,0x12,0x0f,0x10,0x09,0x02,0x03,0x0c,0x06,0x06,0x01,0x0c,0x0f,0x0b,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xe1, -0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01,0x33,0x04,0xf8,0xa2,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49,0x01,0x06,0xda,0x03,0x4c,0x2c,0x54,0xfe,0x42,0x01,0xbe,0x24,0x5c,0xfa,0xde,0x05,0xd6,0xfe,0x33,0x32,0x59,0x89,0x01, -0xcf,0x00,0x00,0x01,0xff,0xdc,0xfe,0x68,0x00,0x24,0x06,0xd6,0x00,0x03,0x00,0x11,0xb3,0x03,0x02,0x1b,0x01,0xb9,0x04,0xf1,0x00,0x02,0x2f,0xed,0x00,0x3f,0x2f,0x31,0x30,0x13,0x11,0x23,0x11,0x24,0x48,0x06,0xd6,0xf7,0x92,0x08,0x6e,0x00,0x00,0x01,0xff,0x25,0xfe,0x68,0x00,0xdb,0x06,0xd6,0x00,0x0e,0x00,0x44,0x40,0x0c,0x07,0x06, -0x03,0x04,0x01,0x09,0x0a,0x0d,0x0c,0x08,0x0b,0x00,0xb8,0x04,0xf1,0x40,0x13,0x05,0x01,0x0a,0x09,0x07,0x0c,0x0d,0x08,0x0b,0x05,0x02,0x0e,0x05,0x04,0x03,0x06,0x07,0x01,0x1b,0x00,0x3f,0x2f,0x33,0xdc,0x32,0x17,0x39,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0xfd,0x32,0x39,0xde,0x32,0xc4,0x32,0x10,0xde,0x32,0xc4,0x32,0x31,0x30, -0x13,0x23,0x11,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x24,0x48,0x86,0x31,0xab,0xab,0x31,0xaa,0xaa,0x31,0xab,0xab,0x31,0x86,0xfe,0x68,0x07,0x43,0x88,0x31,0xa9,0xa8,0x31,0xab,0xab,0x31,0xa8,0xa9,0x31,0x88,0x00,0x00,0x01,0xff,0xdc,0xfe,0x68,0x01,0xaf,0x06,0xd6,0x00,0x0a,0x00,0x30,0xb7,0x0a,0x09,0x03, -0x08,0x00,0x01,0x02,0x07,0xb8,0x04,0xf1,0xb4,0x04,0x02,0x01,0x00,0x04,0xb8,0x04,0xf1,0xb4,0x08,0x09,0x0a,0x05,0x1b,0x00,0x3f,0x2f,0x33,0xdd,0xfd,0x39,0xcc,0x32,0x01,0x2f,0xed,0xde,0x32,0xcd,0x39,0x39,0xc4,0x32,0x31,0x30,0x01,0x07,0x27,0x37,0x21,0x11,0x23,0x11,0x21,0x27,0x37,0x01,0xaf,0xd9,0x31,0x89,0xfe,0xf6,0x48,0x01, -0x52,0x89,0x31,0x05,0xff,0xd6,0x31,0x82,0xf8,0x8c,0x07,0xbb,0x82,0x31,0x00,0x01,0xfe,0x51,0xfe,0x68,0x00,0x24,0x06,0xd6,0x00,0x0a,0x00,0x32,0xb7,0x03,0x09,0x06,0x05,0x04,0x07,0x08,0x0a,0xb8,0x04,0xf1,0xb5,0x02,0x06,0x09,0x04,0x05,0x02,0xb8,0x04,0xf1,0xb4,0x09,0x08,0x07,0x00,0x1b,0x00,0x3f,0x2f,0x33,0xdd,0xfd,0xcc,0x32, -0x12,0x39,0x01,0x2f,0xed,0xdc,0x32,0xc4,0x32,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x21,0x17,0x07,0x27,0x37,0x17,0x07,0x21,0x24,0x48,0xfe,0xf6,0x89,0x31,0xd9,0xd9,0x31,0x89,0x01,0x52,0xfe,0x68,0x07,0x74,0x82,0x31,0xd6,0xd7,0x31,0x82,0x00,0x00,0x01,0x00,0xab,0xff,0xf2,0x02,0x01,0x05,0xec,0x00,0x0e,0x00,0x1b,0xb1,0x0e, -0x09,0xb8,0x05,0x0a,0xb2,0x06,0x07,0x0e,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x01,0x2f,0xed,0xc4,0x31,0x30,0x05,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x02,0x01,0x14,0x66,0x7f,0x45,0x18,0x9c,0x0a,0x26,0x4a,0x40,0x0e,0x3e,0x66,0x82,0x45,0x04,0x8f,0xfb,0xac,0x42,0x60,0x3f,0x1e,0x00, -0xff,0xff,0x00,0x49,0xff,0xf2,0x02,0x01,0x07,0xe9,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x00,0xff,0xff,0xff,0xa2,0xff,0xf2,0x02,0x65,0x07,0x30,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x37,0x00,0x00,0xff,0xff,0x00,0x49,0xfd,0xfe,0x02,0x01,0x05,0xec,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x7f, -0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f, -0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xa3,0xff,0xa7,0x00,0x01,0xff,0xba,0xff,0xf2, -0x04,0x7c,0x03,0x0f,0x00,0x28,0x00,0x2c,0x40,0x0a,0x0c,0x21,0x2a,0x15,0x21,0x0c,0x20,0x03,0x00,0x12,0xb8,0x04,0xff,0xb4,0x2f,0x19,0x01,0x19,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x12,0x17,0x39,0x01,0x2f,0x12,0x39,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37, -0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x0e,0x05,0x23,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x2b,0x73,0x92,0xb1,0xd0,0xf1,0x88,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39, -0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x0a,0x42,0x59,0x62,0x53,0x36,0x00,0x00,0x01,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x00,0x40,0x00,0x5c,0xb9,0x00,0x03,0x05,0x0b,0x40,0x0c,0x0f,0x00,0x0f,0x1c,0x0f,0x35,0x35,0x0f,0x1c,0x03,0x09,0x14,0xb8,0x05,0x0a,0xb3,0x25,0x09,0x03, -0x0f,0xb8,0x04,0xfb,0xb5,0x40,0x39,0x2d,0x2d,0x20,0x32,0xbb,0x04,0xff,0x00,0x39,0x00,0x19,0x04,0xfc,0xb6,0x1f,0x20,0x2f,0x20,0x02,0x20,0x08,0xba,0x04,0xfb,0x00,0x09,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xe4,0x32,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed, -0x31,0x30,0x01,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x04,0x0c,0x22,0x40,0x1e,0x05,0x26,0x46,0x69,0x47,0x18,0x63, -0x8f,0x5f,0x31,0x05,0x8d,0xc0,0x75,0x32,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x02,0x01,0x09,0x12,0x09,0x60,0x7e,0x49,0x1d,0xa7,0x3f,0x75,0xa6,0x67,0x33,0x6e,0x77,0x80, -0x45,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff, -0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xda,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0x00,0x01,0xff,0xba,0xff,0xf2,0x05,0xf4,0x03,0x0f,0x00,0x42,0x00,0x60,0xb1,0x18,0x00,0xbb,0x05,0x0a,0x00,0x40,0x00,0x0d,0x05,0x0a,0x40,0x09,0x0a,0x21,0x33,0x40,0x0a,0x40,0x0a,0x44,0x36,0xb8,0x05,0x0a,0xb6,0x33, -0x41,0x2f,0x35,0x01,0x35,0x26,0xba,0x05,0x03,0x00,0x1d,0x05,0x03,0xb7,0x3b,0x2e,0x2e,0x2d,0x2d,0x21,0x18,0x05,0xba,0x04,0xfb,0x00,0x12,0x05,0x03,0xb3,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0x3f,0xed,0x39,0x39,0x32,0x11,0x33,0x11,0x33,0x3f,0x3f,0x2f,0x5d,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10, -0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0xf3,0x0b,0x27, -0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x39,0x5d,0x77,0x3f,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x21,0x64,0x77,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe, -0x37,0x6c,0x85,0x4a,0x19,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0x0b,0xc9,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57, -0x00,0x02,0xff,0xba,0xff,0xea,0x07,0x4b,0x03,0x3c,0x00,0x39,0x00,0x4b,0x00,0x52,0xb9,0x00,0x2a,0x05,0x0a,0x40,0x0d,0x3f,0x49,0x1e,0x1e,0x15,0x3f,0x3f,0x4d,0x16,0x15,0x00,0x15,0x31,0xba,0x05,0x03,0x00,0x44,0x04,0xfb,0x40,0x0f,0x2f,0x25,0x01,0x25,0x2f,0x15,0x01,0x15,0x49,0x49,0x3a,0x3a,0x1e,0x1e,0x0c,0xba,0x04,0xfb,0x00, -0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x33,0x11,0x33,0x2f,0x2f,0x5d,0x2f,0x5d,0xed,0x3f,0x12,0x39,0x01,0x2f,0xcd,0x12,0x39,0x2f,0x12,0x39,0x10,0xcd,0x10,0xed,0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32, -0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x26,0x26,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x01,0x98,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x27,0x42,0x30,0x1c,0x0f,0x0d,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4, -0x65,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb3,0xff,0x00,0xaf,0x69,0x1b,0x23,0x2e,0x14,0x03,0x61,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x6d,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x18,0x27,0x33,0x1b,0x30,0x6e,0x3d,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95, -0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55,0x2f,0x16,0x05,0x01,0x06,0x0d,0x0c,0x0f,0x31,0x23,0x26,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0x00,0x01,0x00,0xb9,0x01,0xac,0x02,0x89,0x03,0x7c,0x00,0x13,0x00,0x13,0xb6,0x0f,0x05,0x05,0x15,0x14,0x00,0x0a,0x00,0x2f,0xcd,0x11,0x12,0x01, -0x39,0x2f,0xcd,0x31,0x30,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xa3,0x29,0x52,0x45,0x2a,0x2b,0x44,0x52,0x29,0x29,0x51,0x43,0x29,0x29,0x43,0x51,0x01,0xac,0x29,0x43,0x51,0x29,0x28,0x53,0x44,0x2b,0x2a,0x45,0x52,0x29,0x29,0x51,0x43,0x29,0x00,0x01,0x00,0x2b,0x00,0x00,0x01,0x56, -0x05,0x9a,0x00,0x0f,0x00,0x19,0xbc,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x08,0x04,0xe6,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x3f,0x01,0x2f,0xed,0x31,0x30,0x13,0x1e,0x05,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x17,0x26,0x1f,0x18,0x0f,0x08,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0x62,0xad,0xa2,0x9f,0xaa,0xb9,0x6c, -0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x01,0x00,0x2b,0x00,0x00,0x03,0x50,0x05,0x9a,0x00,0x0f,0x00,0x28,0xb5,0x03,0x0a,0x01,0x01,0x11,0x09,0xbd,0x05,0x0a,0x00,0x0a,0x00,0x09,0x04,0xe6,0x00,0x02,0x04,0xfb,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x31,0x30, -0x13,0x21,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x2b,0x03,0x25,0xfd,0xa1,0x19,0x26,0x19,0x0d,0x9c,0x11,0x23,0x36,0x05,0x9a,0xa7,0x71,0xca,0xd0,0xe4,0x89,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x00,0x01,0x00,0x2b,0x00,0x00,0x04,0x1a,0x05,0x9a,0x00,0x38,0x00,0x5c,0xb3,0x1c,0x0d,0x32,0x1f,0xbb, -0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x40,0x0d,0x0b,0x27,0x0b,0x1a,0x0b,0x1a,0x0b,0x3a,0x32,0x03,0x2b,0x2b,0x31,0xbb,0x05,0x0a,0x00,0x32,0x00,0x31,0x04,0xe6,0xb4,0x2b,0x2b,0x29,0x29,0x24,0xb8,0x04,0xfc,0xb7,0x06,0x15,0x1c,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x32,0x2f,0x33,0xed,0x32,0x2f,0x32,0x2f,0x3f,0x01, -0x2f,0xed,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x27,0x1e, -0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x15,0x24,0x0f,0x15,0x26,0x11,0x2a,0x3b,0x26,0x11,0x24,0x9d,0x24,0x1f,0x1d,0x34,0x17,0x2a,0x3b,0x26,0x11,0x24,0x9d,0x24,0x26,0x4a,0x6c,0x46,0x2d,0x67,0x3c,0x47,0x63,0x29,0x2b,0x0b,0x10,0x0b,0x06,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0x5b,0xa1,0x4c,0x05,0x04,0x1c,0x30, -0x3f,0x24,0x54,0x4e,0x59,0x56,0x51,0x40,0x09,0x08,0x1c,0x30,0x3f,0x24,0x54,0x4e,0x59,0x56,0x3e,0x6b,0x4f,0x2d,0x18,0x1c,0x33,0x09,0x43,0x88,0x91,0x9f,0x5a,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x00,0x01,0x00,0x62,0xff,0xea,0x02,0xf5,0x05,0xb8,0x00,0x31,0x00,0x3f,0xb9,0x00,0x2c,0x05,0x0a,0xb2,0x21,0x21, -0x07,0xb8,0x05,0x0a,0xb7,0x17,0x17,0x33,0x32,0x31,0x1c,0x12,0x27,0xb8,0x05,0x02,0xb7,0x2f,0x26,0x01,0x26,0x0f,0x10,0x10,0x0c,0xba,0x04,0xfb,0x00,0x12,0x05,0x03,0x00,0x3f,0xed,0x33,0x11,0x33,0x2f,0x5d,0xed,0x12,0x39,0x39,0x11,0x12,0x01,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x0e,0x05,0x15,0x14,0x1e,0x02,0x33,0x32, -0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x02,0x67,0x54,0x76,0x50,0x2e,0x18,0x07,0x2b,0x47,0x58,0x2d,0x4b,0x79,0x3a,0x7e,0x8e,0x47,0x8b,0x70,0x45,0x1b,0x42,0x6f,0x54,0x50,0x6b,0x3f,0x1a,0x2c,0x6d,0xb6,0x8a,0x73,0x87,0x45, -0x14,0x1f,0x52,0x90,0x72,0x03,0x13,0x4e,0x7f,0x67,0x50,0x3b,0x29,0x0c,0x2a,0x35,0x1d,0x0a,0x13,0x0f,0xa5,0x2c,0x1d,0x40,0x65,0x47,0x29,0x69,0x7e,0x93,0x53,0x25,0x44,0x45,0x49,0x2a,0x36,0x71,0x6f,0x69,0x2f,0xb0,0x24,0x46,0x3f,0x33,0x10,0x18,0x29,0x35,0x48,0x38,0x00,0x02,0x00,0x4f,0x00,0x9c,0x03,0xa9,0x04,0xd2,0x00,0x15, -0x00,0x29,0x00,0x31,0xb9,0x00,0x1b,0x05,0x0a,0xb3,0x0f,0x0f,0x2a,0x05,0xbb,0x05,0x0a,0x00,0x25,0x00,0x0a,0x04,0xfb,0xb4,0x2f,0x20,0x01,0x20,0x16,0xb8,0x04,0xff,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e, -0x02,0x35,0x34,0x3e,0x04,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0xf4,0x47,0x9b,0x80,0x53,0x3d,0x72,0xa4,0x67,0x65,0x9b,0x6a,0x36,0x27,0x41,0x56,0x5e,0x5f,0x28,0x28,0x5c,0x4e,0x34,0x2a,0x48,0x5f,0x36,0x4a,0x6a,0x45,0x20,0x3b,0x56,0x62,0x04,0xd2,0x55,0xa5,0xf2,0x9c,0x60,0x9f, -0x71,0x3e,0x38,0x66,0x90,0x59,0x69,0xb7,0x99,0x78,0x52,0x2c,0xa2,0x4a,0x85,0xbb,0x70,0x41,0x5c,0x3a,0x1a,0x22,0x3e,0x58,0x37,0x77,0xbd,0x83,0x45,0x00,0x00,0x01,0xff,0xef,0x00,0x00,0x03,0x92,0x05,0x9a,0x00,0x15,0x00,0x22,0xb1,0x15,0x0e,0xb8,0x05,0x0a,0xb2,0x00,0x09,0x0a,0xb8,0x04,0xfb,0xb4,0x2f,0x0d,0x01,0x0d,0x00,0xb8, -0x04,0xe6,0x00,0x3f,0x2f,0x5d,0xed,0x01,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x2e,0x07,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x02,0xee,0x18,0x25,0x1c,0x15,0x0e,0x0b,0x07,0x06,0x03,0x03,0xfd,0x9b,0x02,0xfc,0x06,0x04,0x08,0x0d,0x14,0x21,0x31,0x22,0x66,0xa6,0x8e,0x7c,0x79,0x7b,0x8d,0xa4,0x65,0x53,0xa7,0xc6,0x8c,0xd7, -0xb7,0xa6,0xb5,0xd5,0x8a,0x00,0x00,0x01,0xff,0xf4,0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x11,0x00,0x14,0xb1,0x04,0x0b,0xb8,0x04,0xe6,0xb4,0x07,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x3f,0x39,0x31,0x30,0x13,0x12,0x12,0x13,0x33,0x12,0x12,0x13,0x33,0x02,0x02,0x03,0x23,0x26,0x0a,0x02,0x27,0x93,0x65,0xae,0x4e,0x06,0x51,0xad, -0x64,0x9e,0x80,0xd8,0x61,0x94,0x33,0x69,0x6d,0x73,0x3d,0x05,0x9a,0xfe,0xf0,0xfd,0xc1,0xfe,0xcb,0x01,0x36,0x02,0x3f,0x01,0x0f,0xfe,0x9f,0xfd,0x39,0xfe,0x8e,0xc2,0x01,0x71,0x01,0x64,0x01,0x59,0xaa,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x04,0x4f,0x05,0x9a,0x00,0x11,0x00,0x21,0x40,0x0d,0x11,0x00,0x00,0x13,0x07,0x08,0x04,0x2f, -0x0d,0x01,0x0d,0x07,0x00,0xb8,0x04,0xe6,0x00,0x3f,0x32,0x2f,0x5d,0x39,0x01,0x2f,0x33,0x12,0x39,0x11,0x33,0x31,0x30,0x21,0x02,0x02,0x03,0x23,0x02,0x02,0x03,0x23,0x36,0x1a,0x02,0x37,0x33,0x12,0x12,0x13,0x03,0xb0,0x65,0xae,0x4e,0x06,0x51,0xad,0x64,0x9e,0x40,0x75,0x6d,0x66,0x31,0x94,0x66,0xd8,0x7b,0x01,0x10,0x02,0x3f,0x01, -0x35,0xfe,0xca,0xfd,0xc1,0xfe,0xf1,0xb1,0x01,0x61,0x01,0x65,0x01,0x6a,0xb9,0xfe,0x7d,0xfd,0x3c,0xfe,0xad,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x03,0xdb,0x05,0xa8,0x00,0x1e,0x00,0x33,0x00,0x3a,0xb9,0x00,0x1a,0x05,0x0a,0xb4,0x06,0x1f,0x1f,0x35,0x2c,0xb8,0x05,0x0a,0xb2,0x0d,0x06,0x08,0xb8,0x04,0xfb,0xb4,0x2f,0x31,0x01,0x31, -0x27,0xb8,0x04,0xfb,0xb4,0x2f,0x12,0x01,0x12,0x00,0xb8,0x04,0xe6,0x00,0x3f,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x23,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x01,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e, -0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x03,0xdb,0x9f,0x29,0x36,0x24,0x15,0x08,0x7e,0x78,0x50,0x8d,0x69,0x3e,0x33,0x60,0x8c,0x5a,0x58,0x8d,0x3c,0x20,0x26,0x16,0x0c,0x06,0x07,0x14,0x26,0x3e,0xfe,0xe5,0x04,0x08,0x0a,0x0e,0x0a,0x23,0x6f,0x45,0x2c,0x4b,0x37,0x20,0x28,0x46,0x61,0x39,0x30,0x67,0x61,0xbd,0xb1,0xa3,0x48,0x3b, -0x34,0x61,0x8e,0x5a,0x50,0x9a,0x78,0x4a,0x51,0x5e,0x33,0x63,0x6d,0x7b,0x49,0x52,0xb5,0xcb,0xe2,0x02,0xd4,0x2a,0x42,0x38,0x32,0x1a,0x58,0x61,0x26,0x40,0x58,0x31,0x37,0x56,0x3c,0x1f,0x17,0x00,0xff,0xff,0xff,0xba,0xff,0xea,0x07,0x4b,0x04,0xb2,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x01, -0xff,0xba,0xff,0xf2,0x04,0x3c,0x03,0x8a,0x00,0x2c,0x00,0x36,0xb9,0x00,0x24,0x05,0x0a,0xb5,0x13,0x13,0x2e,0x2d,0x1c,0x1f,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x18,0x01,0x18,0x00,0x2c,0x2c,0x29,0x29,0x0c,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0xed, -0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x37,0x04,0x3c,0x78,0xd5,0xc9,0xc5,0x67,0xfa,0x23,0x23,0x23,0x23,0x01,0x71,0x01,0x3e,0x4e,0x2c,0x0f,0x45,0x82,0xbc,0x77,0x28, -0x59,0x30,0x2e,0x63,0x36,0x3f,0x76,0x5c,0x37,0x16,0x36,0x5c,0x47,0x80,0xf9,0x8c,0xab,0x37,0x47,0x2a,0x11,0x34,0x20,0x20,0x33,0x06,0x33,0x63,0x5c,0x51,0x21,0x4f,0x8e,0x6b,0x3f,0x08,0x09,0xaa,0x08,0x0b,0x14,0x35,0x5a,0x45,0x21,0x4c,0x53,0x59,0x2e,0x19,0x54,0x42,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0xad,0x03,0x5e,0x00,0x29, -0x00,0x38,0x00,0x47,0xb3,0x28,0x13,0x23,0x31,0xb8,0x05,0x0a,0xb3,0x16,0x16,0x39,0x23,0xb8,0x05,0x0a,0xb7,0x2a,0x05,0x13,0x28,0x34,0x04,0x01,0x2d,0xb8,0x04,0xff,0xb7,0x2f,0x1c,0x01,0x1c,0x10,0x0f,0x0f,0x00,0xbb,0x04,0xfb,0x00,0x08,0x00,0x01,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x01, -0x2f,0xed,0x11,0x33,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x15,0x23,0x22,0x26,0x27,0x06,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x36,0x37,0x26,0x26,0x27,0x35,0x3e,0x03,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x16,0x16,0x17,0x3e,0x03,0x04,0xad,0x3e,0x87, -0xef,0x6d,0x67,0xfe,0xf0,0xae,0x67,0x23,0x23,0x23,0x23,0x71,0x80,0xc7,0x4f,0x6a,0xad,0x45,0x2d,0x72,0x7e,0x85,0x3f,0x27,0x54,0x50,0x47,0x36,0x20,0x19,0x35,0x52,0x39,0xb8,0x7c,0x79,0x67,0x4c,0x9e,0x49,0x45,0xa7,0x69,0x34,0x49,0x2d,0x14,0x99,0xa7,0x4a,0x45,0x40,0x4f,0x34,0x20,0x20,0x33,0x2a,0x23,0x58,0xd0,0x70,0xad,0x07, -0x12,0x0f,0x0b,0x05,0x10,0x1c,0x2d,0x41,0x2c,0x26,0x65,0x70,0x74,0x36,0x55,0x01,0xcb,0x33,0x2a,0x0f,0x08,0x0b,0x6a,0xb1,0x48,0x29,0x58,0x51,0x42,0x00,0x00,0x02,0x00,0x65,0xfd,0xff,0x04,0xad,0x03,0x95,0x00,0x3c,0x00,0x4a,0x00,0x63,0xb3,0x3a,0x23,0x1e,0x35,0xbb,0x05,0x0a,0x00,0x3d,0x00,0x44,0x05,0x0a,0xb2,0x28,0x28,0x0d, -0xb8,0x05,0x0a,0x40,0x0e,0x1e,0x3d,0x1e,0x3d,0x1e,0x4c,0x4b,0x08,0x3a,0x23,0x46,0x04,0x02,0x40,0xb8,0x04,0xff,0xb5,0x2f,0x2e,0x01,0x2e,0x15,0x12,0xb8,0x04,0xfc,0xb7,0x16,0x1f,0x19,0x2f,0x19,0x02,0x19,0x00,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0xed,0x12,0x17,0x39,0x11,0x12, -0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x27,0x35,0x3e,0x03,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x16,0x16, -0x03,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x16,0x17,0x3e,0x03,0x04,0x98,0x15,0x3e,0x56,0xa3,0x98,0x8d,0x40,0x4d,0x68,0x40,0x1b,0x2e,0x63,0x9e,0x71,0x61,0xc7,0x64,0x6d,0xbf,0x64,0x98,0xd7,0x89,0x40,0x1c,0x48,0x7e,0x62,0x20,0x46,0x44,0x3e,0x16,0x2d,0x72,0x7f,0x85,0x3f,0x27,0x54,0x4f,0x48,0x35,0x20,0x1b,0x48,0x80,0x66,0x70, -0xf2,0xb6,0x78,0x67,0x4c,0x9f,0x49,0x71,0x87,0x55,0x6e,0x40,0x18,0x99,0xa7,0x26,0x45,0x61,0x3b,0x20,0x46,0x4a,0x4f,0x28,0x40,0x72,0x55,0x32,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5b,0x36,0x69,0x69,0x67,0x33,0x22,0x58,0x5e,0x5d,0x26,0xa5,0x07,0x12,0x0f,0x0b,0x06,0x0f,0x1b,0x2c,0x3e,0x2a,0x23,0x5f,0x6b,0x6f,0x31,0x52, -0x59,0x02,0x07,0x2f,0x29,0x0f,0x08,0x0d,0xb0,0x81,0x26,0x4d,0x44,0x36,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x02,0xff,0xff, -0x00,0x65,0xfd,0xff,0x04,0xad,0x05,0x01,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x51,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07, -0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07, -0x0f,0x51,0x00,0xd5,0x04,0x74,0x00,0x01,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x00,0x21,0x00,0x33,0xb9,0x00,0x1a,0x05,0x0a,0x40,0x12,0x0c,0x0c,0x23,0x22,0x11,0x12,0x0c,0x1a,0x15,0x12,0x04,0x00,0x14,0x2f,0x13,0x01,0x13,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0x12,0x17,0x39,0x11,0x33,0x11, -0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x23,0x23,0x23,0x01,0x28,0x61,0x80,0x4c,0x1e,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0x8b,0xe1,0x9e,0x56,0x0b,0x23,0x42,0x6d,0xa0,0x6f,0x0e,0x34, -0x20,0x20,0x33,0x16,0x2a,0x3f,0x29,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x42,0x8a,0x97,0xa6,0x5d,0x1e,0x4a,0x4d,0x49,0x39,0x22,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x01,0xf2,0x05,0xec,0x00,0x16,0x00,0x20,0xb9,0x00,0x08,0x05,0x0a,0xb4,0x05,0x05,0x18,0x17,0x00,0xbb,0x04,0xfb,0x00,0x0f,0x05,0x03,0x00,0x06, -0x00,0x2f,0x3f,0xed,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x0f,0x2a,0x48,0x39,0x04,0x99,0xfb,0x60,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34, -0x20,0x20,0x33,0x00,0x00,0x02,0xff,0xba,0xff,0xf2,0x03,0xf4,0x02,0xaf,0x00,0x23,0x00,0x33,0x00,0x39,0xb9,0x00,0x16,0x05,0x0a,0x40,0x0a,0x2a,0x2a,0x35,0x34,0x20,0x24,0x0c,0x03,0x11,0x1b,0xba,0x05,0x03,0x00,0x2f,0x04,0xfb,0xb5,0x2f,0x11,0x01,0x11,0x27,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d, -0xed,0x3f,0x12,0x17,0x39,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57, -0x3b,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x35,0x9a,0x5e,0x01,0x6e,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3f,0x2d,0x0e,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1a,0x2f,0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f, -0x50,0x43,0x01,0x13,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x53,0xff,0xf2,0x05,0x32,0x04,0x53,0x02,0x06,0x0e,0x5c,0x00,0x00,0x00,0x03,0x00,0x67,0xfd,0xff,0x05,0x58, -0x03,0x56,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x61,0xb1,0x3f,0x40,0xb8,0x05,0x0a,0xb7,0x00,0x0b,0x0b,0x00,0x00,0x50,0x24,0x17,0xb8,0x05,0x0a,0xb4,0x35,0x4a,0x4a,0x35,0x45,0xb8,0x04,0xfb,0xb6,0x1f,0x29,0x2f,0x29,0x02,0x29,0x3a,0xb8,0x04,0xfb,0x40,0x0c,0x2f,0x12,0x01,0x12,0x3f,0x30,0x30,0x1e,0x1e,0x1d,0x1d,0x0b,0xb8,0x04, -0xfb,0xb2,0x40,0x20,0x00,0xb8,0x05,0x03,0x00,0x3f,0x32,0x32,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x27,0x1e,0x03,0x33,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x17, -0x21,0x15,0x21,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x01,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x02,0x01,0x53,0x7d,0x5b,0x3c,0x13,0x20,0x2c,0x5a,0x65,0x73,0x45,0x15,0x41,0x4e,0x55,0x52,0x49,0x1c,0x2e,0x53,0x3f,0x25,0x17, -0x27,0x34,0x1c,0x02,0x01,0x45,0xfe,0xc0,0x01,0x48,0x40,0x28,0x48,0x64,0x3d,0x26,0x55,0x56,0x50,0x3f,0x29,0x01,0x21,0x30,0x52,0x3a,0x21,0x11,0x1e,0x27,0x15,0x1a,0x48,0x48,0x3c,0x0e,0x0b,0x04,0x2e,0x45,0x52,0x29,0x21,0x2d,0x1c,0x0d,0x20,0x3d,0x58,0x38,0x0e,0x03,0x04,0x06,0x03,0xa9,0x05,0x07,0x04,0x02,0x85,0xcf,0x9c,0x6c, -0x43,0x1e,0x45,0x6e,0x88,0x43,0x35,0x5b,0x4e,0x41,0x19,0x07,0xa7,0x06,0x2d,0x78,0x3e,0x34,0x60,0x4a,0x2c,0x14,0x2e,0x4b,0x6f,0x96,0x01,0x08,0x33,0x53,0x69,0x36,0x28,0x55,0x46,0x2c,0x47,0x87,0xc7,0x7f,0xa7,0x58,0x7d,0x50,0x26,0x16,0x22,0x2c,0x16,0x24,0x4b,0x3c,0x26,0x00,0x00,0x02,0x00,0xa1,0xff,0xf2,0x04,0x02,0x03,0xd7, -0x00,0x1b,0x00,0x29,0x00,0x3f,0xb9,0x00,0x1c,0x05,0x0a,0xb4,0x16,0x16,0x2a,0x24,0x01,0xbb,0x05,0x0a,0x00,0x00,0x00,0x11,0x04,0xfb,0xb4,0x2f,0x21,0x01,0x21,0x07,0xbc,0x04,0xfb,0x00,0x08,0x05,0x03,0x00,0x25,0x04,0xfc,0xb4,0x1b,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xdd,0xed,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x33,0x11, -0x33,0x2f,0xed,0x31,0x30,0x01,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x02,0xac,0x9c,0x0f,0x29,0x48,0x3a,0x16,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65, -0xfe,0x8b,0x24,0x3a,0x4f,0x2a,0x27,0x55,0x22,0x4c,0x88,0x66,0x3b,0x03,0xd7,0xfd,0xb5,0x3e,0x5c,0x3c,0x1d,0xa7,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0xfe,0x66,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x03,0x0f,0x02,0x26, -0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x06,0xae,0x02,0x13,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x05,0x64,0x02,0x26,0x08,0xf3,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x29,0x04,0xb4,0x00,0x01,0x00,0x9a, -0xff,0x02,0x06,0xae,0x02,0x13,0x00,0x44,0x00,0x4c,0xb9,0x00,0x36,0x05,0x0a,0xb2,0x0f,0x0f,0x14,0xb8,0x05,0x0a,0xb3,0x31,0x31,0x46,0x27,0xbb,0x05,0x0a,0x00,0x20,0x00,0x0c,0x04,0xff,0xb4,0x2f,0x3b,0x01,0x3b,0x1b,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x2c,0x01,0x2c,0x2f,0x24,0x01,0x24,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00, -0x3f,0xed,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e, -0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x06,0xae,0x16,0x43,0x67,0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e, -0x21,0x2a,0x3b,0x52,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0x00,0x01, -0x00,0x6f,0xff,0xea,0x01,0x76,0x01,0xe7,0x00,0x12,0x00,0x1c,0xb1,0x09,0x0e,0xb8,0x05,0x0c,0xb5,0x05,0x05,0x14,0x13,0x08,0x00,0xb8,0x05,0x03,0x00,0x3f,0xcd,0x11,0x12,0x01,0x39,0x2f,0xed,0x39,0x31,0x30,0x17,0x22,0x2e,0x02,0x35,0x34,0x37,0x13,0x33,0x03,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0xf1,0x1b,0x2f,0x23,0x15,0x0a,0x6a, -0x75,0x4b,0x64,0x02,0x03,0x15,0x24,0x30,0x16,0x15,0x24,0x2f,0x1b,0x15,0x1e,0x01,0x47,0xfe,0xe3,0x23,0x0e,0x18,0x0b,0x23,0x35,0x23,0x11,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x14,0x05,0x3e,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35, -0xff,0xff,0x00,0x52,0xff,0xea,0x03,0xf3,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x07,0x0f,0x8c,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x07,0x0f,0x8d,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00, -0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x49,0xff,0xea,0x03,0xf3,0x07,0x78,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff, -0x00,0x49,0xff,0xea,0x04,0xad,0x07,0x78,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff,0xff,0xa2,0xff,0xea,0x03,0xf3,0x06,0xbf,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x02,0x2f,0x2d, -0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x82,0xff,0x02,0x06,0xae,0x04,0x21,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x39,0xfc,0x38,0x00,0x0a,0xb4,0x01,0x2f,0x5b,0x01,0x5b,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x00,0xfe,0xea,0x01,0x77,0x00,0xe4,0x00,0x0f,0x00,0x0a,0xb2,0x02,0x0d,0x07,0x00,0x2f,0x2f,0xcd, -0x30,0x31,0x15,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x36,0x2c,0x4a,0x41,0x2f,0x8c,0x2d,0x94,0x79,0x37,0x33,0x7b,0x0e,0x48,0x47,0x5e,0x80,0x79,0x6e,0x82,0x91,0x15,0xff,0xff,0xff,0xa2,0xff,0xea,0x04,0xad,0x06,0xbf,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00, -0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x02,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x6f,0xff,0xea,0x01,0x76,0x04,0x00,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x08,0xf8,0x00,0x00,0x02,0x19,0x00,0x02,0x00,0xab,0xff,0xee,0x03,0x57,0x05,0xb3,0x00,0x29,0x00,0x3d,0x00,0x3e,0xb5,0x00,0x2f,0x24,0x39,0x39, -0x24,0xb8,0x05,0x0a,0xb3,0x05,0x05,0x3f,0x1d,0xbd,0x05,0x0a,0x00,0x0c,0x00,0x34,0x04,0xfe,0x00,0x2a,0x05,0x03,0xb2,0x14,0x15,0x18,0xb8,0x04,0xfc,0xb3,0x2f,0x11,0x01,0x11,0x00,0x2f,0x5d,0xfd,0xc2,0x32,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x10,0xc4,0x39,0x31,0x30,0x01,0x3e,0x03,0x35,0x34,0x2e,0x04,0x35, -0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x03,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xf5,0x04,0x08,0x06,0x04,0x34,0x4e,0x5c,0x4e,0x34,0x3e,0x6c,0x91,0x53,0x48,0x91,0x45,0x3d,0x97,0x46,0x34,0x58,0x41,0x24, -0x33,0x4c,0x58,0x4c,0x33,0x04,0x06,0x09,0x04,0x5a,0x15,0x28,0x1f,0x13,0x12,0x1f,0x28,0x16,0x16,0x28,0x1f,0x12,0x13,0x1f,0x28,0x01,0x8e,0x0c,0x22,0x26,0x25,0x0f,0x3c,0x5b,0x4e,0x4a,0x58,0x6f,0x4b,0x51,0x81,0x5a,0x30,0x23,0x2a,0xac,0x39,0x34,0x1b,0x32,0x48,0x2e,0x38,0x5b,0x53,0x51,0x5c,0x6c,0x44,0x13,0x2a,0x27,0x23,0x0c, -0xfe,0x60,0x11,0x1d,0x28,0x18,0x17,0x29,0x1e,0x11,0x11,0x1e,0x29,0x17,0x18,0x28,0x1d,0x11,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0xe5,0x02,0xb4,0x00,0x1e,0x00,0x3a,0xb5,0x0c,0x00,0x0c,0x00,0x20,0x08,0xb8,0x05,0x0a,0xb3,0x16,0x1e,0x1e,0x03,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x1b,0x01,0x1b,0x10,0x10,0x0f,0x0f,0x0b,0xba,0x04,0xfb, -0x00,0x0d,0x04,0xe6,0x00,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x2f,0x5d,0xed,0x33,0x2f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x27,0x33,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x02,0xac,0x1d,0x43,0x20,0x30,0x53,0x3d,0x24,0x7b,0x79, -0xa9,0xfd,0x92,0x1d,0xa9,0x01,0x19,0x22,0x15,0x09,0x37,0x66,0x8f,0x58,0x1c,0x41,0x20,0x01,0xff,0x05,0x07,0x13,0x2a,0x42,0x30,0x5b,0x5e,0xa3,0x99,0x06,0x19,0x38,0x3b,0x39,0x19,0x45,0x72,0x52,0x2e,0x05,0x05,0x00,0xff,0xff,0xff,0xa2,0x00,0x00,0x02,0x65,0x07,0x30,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x37,0x00,0x00, -0xff,0xff,0x00,0x49,0x00,0x00,0x01,0xa2,0x07,0xe9,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x3e,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xe4,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4d,0x01,0x4d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0xfd,0xfe, -0x01,0xa2,0x05,0xec,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x7f,0x00,0x00,0xff,0xff,0x00,0x82,0xff,0x55,0x05,0x91,0x04,0xcc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0x39,0xfc,0xe3,0x00,0x01,0x00,0xab,0x00,0x00,0x01,0x47,0x05,0xec,0x00,0x03,0x00,0x15,0xbd,0x00,0x01,0x05,0x0a,0x00,0x00,0x00,0x02,0x04, -0xe6,0x00,0x01,0x00,0x2f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x13,0x33,0x11,0x23,0xab,0x9c,0x9c,0x05,0xec,0xfa,0x14,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x05,0x5d,0x02,0x26,0x09,0x28,0x00,0x00,0x00,0x07, -0x0f,0x51,0x01,0x01,0x04,0xad,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0x04,0x02,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54, -0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xc8,0xff,0xcf,0x00,0x01,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x40,0x40,0x0a,0x1d,0x00,0x31,0x03,0x16,0x0d,0x0d,0x33,0x26,0x05,0xb8,0x05,0x0a,0xb6,0x16,0x00,0x1d,0x31,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xff,0xb6,0x0e,0x1f, -0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33, -0x32,0x1e,0x04,0x17,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26, -0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0x00,0x01,0x00,0x52,0xff,0xea,0x03,0x4a,0x03,0xba,0x00,0x19, -0x00,0x24,0xb9,0x00,0x11,0x05,0x0a,0xb4,0x08,0x08,0x1b,0x1a,0x03,0xba,0x04,0xfb,0x00,0x16,0x05,0x03,0xb3,0x2f,0x0e,0x01,0x0e,0x00,0x2f,0x5d,0x3f,0xed,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x12,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x52,0x61,0xa6, -0x39,0x4f,0x6c,0x42,0x1d,0x3b,0x60,0x7b,0x40,0xb9,0x9f,0x9c,0x48,0x7a,0xa0,0x57,0x3a,0x9a,0x4b,0xa9,0x0b,0x0b,0x15,0x2c,0x44,0x2f,0x49,0x9c,0x9f,0xa1,0x4e,0xb1,0xfe,0xbf,0x91,0x63,0x80,0x4c,0x1e,0x0c,0x0a,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x05,0x5d,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab, -0x04,0xad,0x00,0x01,0x00,0x00,0xfd,0xff,0x02,0x9e,0x02,0x5e,0x00,0x1a,0x00,0x26,0xb9,0x00,0x12,0x05,0x0a,0xb2,0x07,0x00,0x02,0xb8,0x04,0xfb,0x40,0x0b,0x1a,0x1f,0x17,0x2f,0x17,0x02,0x17,0x2f,0x0d,0x01,0x0d,0x00,0x2f,0x5d,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x11,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02, -0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1a,0x28,0x1c,0x0f,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0xfe,0xd1,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x41,0x8e,0x8f,0x8b,0x3e,0x8a,0xd4,0x90,0x4a,0x16,0x17,0x00,0xff,0xff,0x00,0x00,0xfd,0xff, -0x02,0x9e,0x04,0x07,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x03,0x0f,0x00,0x4d,0x00,0x74,0xb9,0x00,0x1b,0x05,0x0a,0xb2,0x18,0x26,0x0e,0xb8,0x05,0x0a,0xb3,0x0b,0x2f,0x2f,0x03,0xb8,0x05,0x0a,0x40,0x0a,0x4a,0x18,0x0b,0x4a,0x4a,0x0b,0x18,0x03,0x4f,0x40, -0xb8,0x05,0x0a,0xb5,0x39,0x2f,0x3d,0x01,0x3d,0x45,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x34,0x2f,0x34,0x02,0x34,0x26,0x2f,0x13,0x06,0xbc,0x04,0xfb,0x00,0x2b,0x05,0x03,0x00,0x20,0x05,0x03,0x40,0x09,0x19,0x20,0x0d,0x01,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xd4,0x5d,0xc6,0x3f,0x3f,0xed,0x32,0x39,0x39,0x2f,0x5d,0xed,0x2f,0x5d, -0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x07,0x0e,0x03,0x23, -0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x04,0x80,0x08,0x0c,0x05,0x06,0x58,0x5e,0x22,0x3f,0x30,0x1d,0x9c,0x0b,0x27,0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x38,0x5d,0x78,0x3f,0x2c,0x4f,0x42,0x34,0x12,0x04,0x19,0x3f,0x44,0x46,0x1f,0x42,0x52,0x19,0x05,0x03, -0x3d,0x80,0xcc,0x91,0x8a,0xb9,0x70,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x10,0x02,0x01,0x3f,0x70,0x38,0x42,0x3f,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x37,0x6c,0x85,0x4a,0x19,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x26,0x20,0x01, -0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xbb,0x78,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x46,0x03,0x57,0x00,0x02,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x03,0x3c,0x00,0x42,0x00,0x56, -0x00,0x57,0xb3,0x54,0x09,0x13,0x3c,0xbe,0x05,0x0a,0x00,0x48,0x00,0x1a,0x05,0x0a,0x00,0x13,0x00,0x4d,0x04,0xfb,0x40,0x0d,0x2f,0x37,0x01,0x37,0x2f,0x28,0x01,0x28,0x2f,0x17,0x01,0x17,0x1f,0xb8,0x04,0xfb,0x40,0x0c,0x1f,0x0e,0x2f,0x0e,0x02,0x0e,0x54,0x54,0x43,0x43,0x09,0x30,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed, -0x39,0x32,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x26,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e, -0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x27,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x07,0x93,0xa1,0xe7,0x9d,0x5e,0x18,0x1f,0x28,0x12,0x05,0x03,0x3d,0x81,0xcd,0x94,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x17,0x9a,0x0b, -0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4,0x65,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9b,0x3b,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x85,0x75,0x65,0x52,0x3f,0x15,0x5c,0xee,0x16,0x01,0x03,0x08,0x07,0x09,0x1d,0x15,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39, -0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xc5,0x6e,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55,0x2f,0x16,0x05,0xa9,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x2a,0x49,0x63,0x71,0x7a,0x3c,0x02,0x01,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x04,0xb2,0x02,0x26, -0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0xca,0x04,0x02,0x00,0x02,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x00,0x20,0x00,0x34,0x00,0x3a,0xb9,0x00,0x0d,0x05,0x0a,0xb2,0x26,0x32,0x01,0xb8,0x05,0x0a,0xb5,0x00,0x32,0x32,0x21,0x21,0x1d,0xb8,0x04,0xfb,0xb3,0x03,0x1a,0x01,0x14,0xba,0x05,0x03,0x00,0x2b,0x04,0xfb,0xb1,0x08, -0x01,0x00,0x2f,0x2f,0xed,0x3f,0x12,0x39,0x39,0xed,0x32,0x11,0x33,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x33,0x11,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16, -0x01,0x55,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x5a,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x02,0x52,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x05,0xec,0xfc,0x1d,0x01,0x43,0x7a,0x5d,0x36,0x4f,0x88,0xb5,0x66, -0x5d,0x80,0x55,0x2f,0x16,0x05,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a,0x66,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0xff,0xff,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x02,0x26,0x09,0x1d,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0x00,0x01,0x00,0x65,0xfd,0xff, -0x04,0x2d,0x04,0x2a,0x00,0x37,0x00,0x52,0xb4,0x29,0x00,0x16,0x39,0x31,0xb8,0x05,0x0a,0xb2,0x20,0x20,0x05,0xb8,0x05,0x0a,0xb4,0x16,0x28,0x29,0x29,0x2c,0xb8,0x04,0xfb,0x40,0x0d,0x25,0x00,0x34,0x1b,0x37,0x37,0x11,0x2f,0x25,0x01,0x25,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed, -0x32,0x2f,0x5d,0x12,0x39,0x2f,0x39,0x39,0x33,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22, -0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x37,0x03,0x5c,0xaf,0xe8,0x8b,0x39,0x2e,0x63,0x9e,0x71,0x61,0xc7,0x64,0x6d,0xbf,0x64,0x98,0xd7,0x89,0x40,0x14,0x31,0x53,0x3f,0x26,0x37,0x23,0x11,0x3d,0x72,0xa6,0x69,0x23,0x4f,0x2a,0x27,0x56,0x2a,0x36,0x65,0x4d,0x2f,0x37,0x33,0x51,0xd1,0x89,0x01,0x9a,0x2e,0x66,0x72,0x7d,0x45,0x40, -0x72,0x55,0x32,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5b,0x31,0x64,0x65,0x64,0x30,0x24,0x51,0x55,0x56,0x29,0x4f,0x92,0x70,0x42,0x08,0x09,0xaa,0x08,0x0b,0x16,0x38,0x5d,0x46,0x4c,0x7f,0x2b,0x2d,0x52,0x24,0x00,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0x8f,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xe4, -0x04,0xdf,0x00,0x01,0xff,0xba,0xff,0xf2,0x01,0x56,0x00,0x99,0x00,0x08,0x00,0x13,0xb2,0x08,0x04,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x01,0x2f,0xcd,0x31,0x30,0x05,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x01,0x56,0xfe,0xaa,0x23,0x23,0x23,0x23,0x01,0x56,0x0e,0x34,0x20,0x20,0x33,0x00,0xff,0xff,0x00,0xab, -0xff,0xea,0x07,0x4b,0x05,0x24,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x50,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x04,0x79,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xd4,0x03,0xc9,0x00,0x02,0x00,0xab,0xff,0xea,0x05,0xf4,0x05,0xec,0x00,0x25,0x00,0x46,0x00,0x71,0xbf,0x00,0x13,0x05, -0x0a,0x00,0x10,0x00,0x41,0x05,0x0b,0x00,0x28,0x00,0x39,0x05,0x0b,0x40,0x10,0x30,0x36,0x10,0x28,0x26,0x30,0x22,0x10,0x28,0x30,0x30,0x28,0x10,0x03,0x48,0x03,0xbe,0x05,0x0a,0x00,0x22,0x00,0x26,0x04,0xfd,0x00,0x46,0x00,0x36,0x04,0xfd,0x40,0x0a,0x28,0x41,0x30,0x39,0x04,0x1a,0x35,0x35,0x11,0x0b,0xba,0x04,0xfb,0x00,0x1a,0x05, -0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x12,0x17,0x39,0xed,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e, -0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x35,0x34,0x26,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4e,0x7b,0xb1,0x7d,0x6d,0xa2,0x6c,0x36,0x9c,0x2d,0x52,0x71,0x88,0x9a,0x51,0x76,0xc2,0x9b, -0x78,0x2c,0x3f,0x30,0x12,0x0b,0x01,0xe4,0xc5,0x1f,0x15,0x10,0x21,0x1b,0x11,0x2e,0x4f,0x69,0x3b,0x5e,0x54,0x21,0x17,0x0f,0x20,0x1a,0x10,0x25,0x4c,0x74,0x4f,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x0a,0x29,0x53,0x48,0x04,0x8b,0xfb,0x6e,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x06,0x16,0x2c,0x26,0x37,0x98,0x58, -0x3d,0x70,0x33,0x57,0x0b,0x47,0x12,0x16,0x0b,0x08,0x14,0x1b,0x27,0x1b,0x26,0x3e,0x2f,0x1f,0x08,0x5d,0x0c,0x2d,0x21,0x14,0x18,0x0b,0x08,0x12,0x1a,0x23,0x19,0x1f,0x3e,0x33,0x23,0x04,0x00,0x01,0x00,0x9b,0xfe,0xac,0x04,0x9e,0x05,0xec,0x00,0x1d,0x00,0x25,0xbf,0x00,0x03,0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00, -0x08,0x04,0xfb,0xb5,0x15,0x0f,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x38,0x81, -0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0x28,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x00,0x02,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x00,0x26,0x00,0x38,0x00,0x41,0xb2,0x17,0x1b,0x05,0xbb,0x05,0x0a,0x00,0x2c,0x00,0x12,0x05, -0x0a,0x40,0x0a,0x1b,0x2f,0x17,0x01,0x17,0x20,0x34,0x34,0x00,0x27,0xbd,0x04,0xfb,0x00,0x0f,0x00,0x0a,0x05,0x03,0x00,0x31,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x2f,0x5d,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e, -0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x02,0xac,0x4c,0x79,0x55,0x2e,0x23,0x47,0x69,0x45,0x31,0x66,0x61,0x59,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45, -0x49,0x44,0x3b,0x2e,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x02,0xb9,0x53,0x7d,0x91,0x3e,0x3b,0x6c,0x52,0x30,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x43,0x23,0x0b,0xfd,0xdf,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4, -0xad,0x05,0x0f,0x0d,0x09,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x03,0x5c,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x02,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x00,0x17,0x00,0x29,0x00,0x36,0xb9,0x00,0x06,0x05,0x0a,0xb6,0x20,0x20,0x10,0x2b,0x00,0x00,0x18,0xb8,0x05,0x0a,0xb4,0x10, -0x15,0x25,0x01,0x1d,0xba,0x04,0xfb,0x00,0x0b,0x05,0x03,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x37,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x03,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34, -0x2e,0x02,0x27,0x0e,0x03,0x01,0x3f,0x60,0x76,0xa7,0x6a,0x31,0x30,0x5a,0x83,0x53,0x51,0x7c,0x54,0x2b,0x2a,0x43,0x56,0x2c,0x15,0x2d,0x13,0x1d,0x32,0x42,0x25,0x66,0x5c,0x12,0x2b,0x46,0x34,0x29,0x47,0x34,0x1d,0x03,0x4f,0x7f,0x4e,0x9f,0xa5,0xaa,0x59,0x4b,0x7b,0x59,0x30,0x2b,0x50,0x70,0x45,0x53,0x96,0x7f,0x65,0x23,0x11,0x22, -0xfd,0xfb,0x2d,0x3e,0x28,0x12,0x58,0x4b,0x2e,0x5a,0x5c,0x5f,0x33,0x1d,0x52,0x60,0x6d,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x00,0x22,0x00,0x36,0x00,0x47,0xb2,0x23,0x23,0x1a,0xb8,0x05,0x0a,0xb3,0x08,0x08,0x38,0x2f,0xb8,0x05,0x0a,0xb2,0x0f,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x22,0x1f,0x1f,0x2f,0x1f,0x02,0x1f, -0x2a,0xb8,0x04,0xfb,0xb5,0x2f,0x14,0x01,0x14,0x08,0x34,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16, -0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x6c,0xad,0x52,0x64,0x7b,0x45,0x1a,0x02,0x53,0x59,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x34,0x72,0xb6,0x82,0x5b,0xac,0x64,0x02,0xa9,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c, -0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xfe,0xf9,0x2c,0x23,0x42,0x68,0x82,0x41,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xed,0x84,0x74,0xd3,0xa2,0x60,0x26,0x2e,0x02,0x66,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0x01,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0x15,0x00,0x35, -0x00,0x42,0xb2,0x09,0x05,0x2f,0xbb,0x05,0x0a,0x00,0x16,0x00,0x28,0x05,0x0a,0xb6,0x1d,0x16,0x1d,0x16,0x1d,0x37,0x0c,0xb8,0x05,0x0a,0xb2,0x05,0x28,0x23,0xbe,0x04,0xff,0x00,0x22,0x00,0x00,0x04,0xfb,0x00,0x11,0x04,0xe6,0x00,0x09,0x00,0x2f,0x3f,0xed,0x2f,0xed,0x2f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed, -0x11,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b, -0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58,0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f, -0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x00,0xff,0xff,0x00,0x9a,0xfd,0xfb,0x05,0x91,0x04,0x15,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x01,0xfe,0x00,0x00,0x02,0x00,0x05,0x06,0x7c,0x02,0x01,0x07,0x8d,0x00,0x03,0x00,0x07,0x00,0x1d,0xb4,0x05,0x01,0x04,0x00,0x02,0xbc,0x04,0xfd,0x00,0x01,0x00,0x06,0x04,0xfd,0x00, -0x05,0x00,0x2f,0xfd,0xde,0xed,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0xd4,0x58,0x01,0x11,0x58,0x00,0x02,0xff,0x33,0x06,0x55,0x01,0xca,0x08,0x0e,0x00,0x23,0x00,0x31,0x00,0x3b,0xb2,0x20,0x13,0x1d,0xb8,0x05,0x0d,0xb5,0x24,0x23,0x23,0x24, -0x11,0x2c,0xb8,0x05,0x0d,0xb4,0x13,0x0b,0x08,0x05,0x18,0xb8,0x04,0xfd,0xb3,0x27,0x20,0x2f,0x0e,0xb9,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0x32,0x39,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37, -0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x2f,0x21,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34,0x10,0x0f,0x01,0x36,0x1f,0x31,0x3f,0x21,0x1f,0x3b,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04, -0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x06,0x55,0x22,0x22,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x45,0x45,0x26,0x3b,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x02,0x00,0x05,0xfe,0x60,0x02,0x01,0xff,0x71, -0x00,0x03,0x00,0x07,0x00,0x1d,0xb4,0x05,0x01,0x04,0x00,0x02,0xbc,0x04,0xfd,0x00,0x01,0x00,0x06,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0xde,0xed,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0xfe,0xb8,0x58,0x01,0x11,0x58,0x00,0x01,0x00,0x05,0x06,0x7c, -0x02,0x01,0x06,0xd4,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x02,0xb9,0x04,0xfd,0x00,0x01,0x00,0x2f,0xed,0x01,0x10,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x06,0xd4,0x58,0x00,0x00,0x02,0xff,0xbf,0x06,0x55,0x01,0xca,0x08,0x0e,0x00,0x22,0x00,0x30,0x00,0x35,0xb2,0x1f,0x12,0x1c,0xb8,0x05,0x0d,0xb5,0x23,0x22, -0x22,0x23,0x10,0x2b,0xbb,0x05,0x0d,0x00,0x12,0x00,0x17,0x04,0xfd,0xb3,0x26,0x1f,0x2e,0x0c,0xb9,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e, -0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x2d,0x23,0x18,0x30,0x15,0x39,0x67,0x30,0x12,0x32,0x5c,0x38,0x01,0x0b,0x06,0x01,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f, -0x23,0x1a,0x30,0x3c,0x06,0x55,0x22,0x22,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x01,0x00,0x05,0xff,0x19,0x02,0x01,0xff,0x71,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x02, -0xb9,0x04,0xfd,0x00,0x01,0x00,0x2f,0xed,0x01,0x10,0xcd,0x31,0x30,0x17,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x8f,0x58,0x00,0x01,0xff,0xd4,0x06,0x76,0x02,0x33,0x07,0xa0,0x00,0x33,0x00,0x53,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x30,0x33,0x33,0x30,0x0a,0x21,0x25,0x25,0x2a,0xb8,0x05,0x0d,0xb4,0x21,0x24,0x24,0x21, -0x1b,0xb8,0x05,0x0b,0x40,0x0b,0x12,0x15,0x15,0x12,0x16,0x25,0x25,0x33,0x0a,0x0d,0x06,0xb8,0x04,0xfd,0xb1,0x1e,0x2d,0x00,0x2f,0x33,0xed,0x32,0x39,0xce,0x32,0x11,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23, -0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x0e,0x02,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x06,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x03, -0x02,0x02,0x26,0x2d,0x2c,0x23,0x02,0x61,0x01,0x01,0x22,0x2d,0x2f,0x25,0x04,0x02,0x07,0xa0,0x14,0x25,0x0e,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x1a,0x2c,0x0e,0x17,0x1d,0x13,0x0c,0x05,0x33,0x3f,0x3e,0x3b,0x14,0x2e,0x0f,0x07,0x15,0x16,0x16,0x08,0x3d,0x3d,0x3e,0x37,0x17,0x30,0x0e,0x00,0x02,0x00,0x45,0x06,0x76, -0x01,0xc1,0x07,0xe9,0x00,0x13,0x00,0x1f,0x00,0x26,0x41,0x0c,0x00,0x05,0x05,0x0d,0x00,0x17,0x00,0x1d,0x05,0x0d,0x00,0x0f,0x00,0x00,0x04,0xfd,0x00,0x1a,0x00,0x14,0x04,0xfd,0x00,0x0a,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02, -0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x03,0x29,0x45,0x33,0x1d,0x1d,0x33,0x45,0x29,0x2a,0x46,0x32,0x1c,0x1c,0x33,0x45,0x2a,0x30,0x34,0x34,0x30,0x2f,0x35,0x35,0x07,0xe9,0x1d,0x32,0x44,0x27,0x27,0x44,0x31,0x1d,0x1d,0x31,0x44,0x27,0x27,0x44,0x32,0x1d,0xfe,0xe4,0x36,0x2c,0x2b,0x38,0x38,0x2b,0x2c, -0x36,0x00,0xff,0xff,0x00,0x52,0xfd,0xfe,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7f,0x72,0x00,0xff,0xff,0x00,0x52,0xfd,0xfe,0x04,0xad,0x05,0xec,0x02,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7f,0x72,0x00,0xff,0xff, -0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xa2,0x06,0x62,0x02,0x65,0x07,0x30,0x00,0x1b,0x00,0x20,0x40,0x0d,0x00,0x0e,0x0e,0x0d,0x0d,0x05,0x00,0x1b,0x1b,0x13,0x0a,0x18,0x05,0x00,0x2f,0xcd,0xd4,0xcd,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x23, -0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x65,0x1a,0x31,0x2d,0x29,0x12,0x33,0x5c,0x56,0x54,0x2d,0x22,0x31,0x19,0x3e,0x1a,0x31,0x2d,0x29,0x12,0x33,0x5c,0x56,0x54,0x2c,0x23,0x31,0x19,0x06,0xb6,0x1b,0x21,0x12,0x06,0x1e,0x24,0x1e,0x16,0x16,0x46,0x1b,0x21,0x12,0x06,0x1e, -0x24,0x1e,0x15,0x17,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x03,0x0f,0x00,0x1f, -0x00,0x26,0xb1,0x0b,0x00,0xb8,0x05,0x0a,0xb7,0x1d,0x2f,0x1f,0x01,0x1f,0x0b,0x17,0x05,0xbb,0x04,0xfb,0x00,0x10,0x00,0x06,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x39,0x2f,0x5d,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e, -0x02,0x35,0x11,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x00,0x02,0xff,0xba,0xff,0xf2,0x03,0x49,0x03,0x62, -0x00,0x24,0x00,0x38,0x00,0x31,0xb9,0x00,0x12,0x05,0x0a,0xb3,0x25,0x25,0x3a,0x31,0xb8,0x05,0x0a,0xb2,0x05,0x36,0x20,0xbc,0x04,0xfb,0x00,0x19,0x05,0x03,0x00,0x2c,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32, -0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81,0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8, -0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42, -0x4a,0x2a,0x18,0x4d,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0x02,0x03,0x62,0x00,0x2f,0x00,0x43,0x00,0x3e,0xb1,0x15,0x12,0xb8,0x05,0x0a,0xb4,0x30,0x30,0x05,0x19,0x3c,0xb8,0x05,0x0a,0xb5,0x05,0x1f,0x0a,0x41,0x2b,0x18,0xbd,0x04,0xfb,0x00,0x24,0x00,0x19,0x05,0x03,0x00,0x37,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed, -0x3f,0x33,0xed,0x32,0x32,0x12,0x39,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22, -0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19, -0x43,0x74,0x5b,0x21,0x19,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x00,0x01,0x00,0xab, -0xff,0xea,0x06,0x9f,0x03,0x0f,0x00,0x25,0x00,0x2c,0xb9,0x00,0x13,0x05,0x0a,0xb3,0x10,0x10,0x27,0x03,0xbd,0x05,0x0a,0x00,0x22,0x00,0x0b,0x04,0xfb,0x00,0x1a,0x05,0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xc6,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33, -0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x62,0x09,0x11,0x1e,0x30,0x1d,0x5c,0x91,0xd2,0x93,0x80,0xc0,0x7f,0x3f,0x9c,0x33,0x5d,0x81,0x9a,0xaf,0x5d,0x86,0xde,0xb3,0x87,0x30,0x3f,0x30,0x12,0x0b,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05, -0x0a,0x29,0x53,0x48,0x01,0xae,0xfe,0x4b,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x03,0x15,0x2d,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x00,0x1f,0x00,0x26,0xb1,0x0b,0x00,0xb8,0x05,0x0a,0xb6,0x1d,0x1e,0x18,0x17,0x17,0x0b,0x05,0xbb,0x04,0xfb,0x00,0x10,0x00,0x06,0x05,0x03,0x00,0x3f,0x33, -0xed,0x39,0x32,0x11,0x33,0x2f,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x61,0x74,0x1d,0x04,0x1b,0x43,0x48,0x49,0x22,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43, -0x38,0x25,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x04,0x99,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f, -0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x74,0xb9,0x00,0x3b,0x05,0x0a,0xb2,0x3a,0x3a,0x39,0xb8,0x05,0x0a,0xb3,0x38,0x1d,0x38,0x32,0xb8,0x05,0x0a,0xb7,0x33,0x38,0x33,0x38,0x33,0x3f,0x26,0x05,0xbb,0x05,0x0a,0x00,0x16, -0x00,0x3a,0x05,0x02,0xb2,0x3d,0x36,0x32,0xb8,0x05,0x02,0x40,0x0d,0x38,0x2f,0x35,0x3f,0x35,0x02,0x35,0x31,0x1d,0x00,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0x32,0xd6,0xed,0x01,0x2f, -0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x05,0x23, -0x35,0x33,0x03,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0x6a,0xb5,0xb5,0x01,0x42,0xb5,0xb5,0xa1,0xb5,0xb5,0x02,0x01, -0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x64,0xb3,0xb3,0xb3,0xfe,0x3f,0xb3,0x00,0x00,0x05,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x03,0x00,0x07, -0x00,0x0b,0x00,0x3d,0x00,0x4b,0x00,0x97,0xb1,0x19,0x3e,0xbb,0x05,0x0b,0x00,0x49,0x00,0x09,0x05,0x0a,0xb2,0x08,0x08,0x04,0xbb,0x05,0x0a,0x00,0x05,0x00,0x00,0x05,0x0a,0x40,0x0b,0x01,0x49,0x05,0x01,0x01,0x05,0x49,0x03,0x4d,0x32,0x11,0xbd,0x05,0x0a,0x00,0x22,0x00,0x41,0x04,0xfb,0x00,0x43,0x05,0x03,0xb6,0x3e,0x0c,0x29,0x3d, -0x04,0x1d,0x2f,0xb8,0x04,0xff,0xb2,0x36,0x19,0x16,0xb8,0x04,0xfc,0x40,0x0c,0x1a,0x1f,0x1d,0x2f,0x1d,0x02,0x1d,0x07,0x06,0x06,0x02,0x08,0xb8,0x05,0x02,0xb7,0x0f,0x0b,0x1f,0x0b,0x02,0x0b,0x04,0x00,0xb8,0x05,0x02,0xb5,0x2f,0x02,0x3f,0x02,0x02,0x02,0x00,0x2f,0x5d,0xfd,0x32,0xde,0x5d,0xed,0x11,0x33,0x11,0x33,0x2f,0x5d,0x33, -0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x13,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35, -0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x13,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x02,0x78,0xb5,0xb5,0x01,0x2e,0xb5,0xb5,0x97,0xb5,0xb5,0xfd,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19, -0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x2b,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x02,0xb3,0xb3,0xb3,0xfe,0x49,0xb3,0x02,0x50,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38, -0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfe,0x9a,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x00,0xfd,0xff, -0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0x02,0x00,0x36,0x00,0x33,0xb2,0x1e,0x23,0x03,0xbb,0x05,0x0a,0x00,0x33,0x00,0x23,0x05,0x0a,0x40,0x09,0x15,0x1a,0x1e,0x1b,0x03,0x00,0x00,0x1c,0x0b,0xbb,0x04,0xfb,0x00,0x2b,0x05,0x03,0x00, -0x1c,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37, -0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4f,0x7b,0xb1,0x7c,0x4e,0x7e,0x67,0x51,0x20,0x25,0x32,0x1c,0x0c,0x57,0xa3,0xe8,0x91,0x03,0x4b,0xfd,0x66,0x8b,0xe1,0x9e,0x56,0x0f,0x31,0x5d,0x4f,0x57,0xef,0xa5,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x01,0x06,0x0a,0x09, -0x0a,0x1d,0x26,0x2c,0x1a,0x4d,0x8b,0x86,0x85,0x47,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x42,0x8b,0x96,0xa6,0x5e,0x1f,0x56,0x59,0x50,0x19,0x1b,0x0e,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x02,0x06,0x08,0xed,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0x38, -0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0x15,0x02,0x06,0x09,0x2a,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x02,0x13,0x02,0x06, -0x08,0xf7,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x06,0x19,0x02,0x26,0x08,0xf3,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x3e,0xfe,0x30,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x06,0x12,0x02,0x26, -0x09,0x28,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x16,0xfe,0x29,0x00,0x0a,0xb4,0x02,0x2f,0x40,0x01,0x40,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb9,0x01,0xac,0x02,0x89,0x03,0x7c,0x02,0x06,0x08,0xd7,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x01,0x56,0x05,0x9a,0x02,0x06,0x08,0xd8,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x03,0x50, -0x05,0x9a,0x02,0x06,0x08,0xd9,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x04,0x1a,0x05,0x9a,0x02,0x06,0x08,0xda,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x03,0x70,0x05,0xb7,0x00,0x36,0x00,0x4a,0xb5,0x1d,0x0b,0x38,0x29,0x02,0x2f,0xb8,0x05,0x0a,0x40,0x09,0x30,0x1e,0x1d,0x1d,0x13,0x02,0x03,0x07,0x2f,0xbb,0x04,0xe6,0x00,0x29, -0x00,0x23,0x04,0xfb,0xb4,0x2f,0x18,0x01,0x18,0x0e,0xb8,0x04,0xfb,0xb7,0x2f,0x07,0x01,0x07,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x39,0x3f,0x12,0x17,0x39,0x11,0x33,0x01,0x2f,0xed,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x13,0x17,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02, -0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x07,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x30,0x05,0x0e,0x3f,0x5f,0x7d,0x4b,0x20,0x49,0x24,0x23,0x45,0x23,0x43,0x77,0x5a,0x34,0x29,0x41,0x51,0x29,0x32,0x62,0x5b,0x50,0x1f,0x14,0x49,0x5c,0x6b,0x36,0x1e,0x3e,0x39, -0x32,0x13,0x04,0x07,0x0c,0x07,0x04,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0xd2,0x2f,0x56,0x42,0x28,0x08,0x09,0xa6,0x08,0x08,0x1b,0x30,0x43,0x28,0x23,0x33,0x21,0x0f,0x14,0x20,0x28,0x14,0xaa,0x11,0x26,0x21,0x15,0x08,0x10,0x19,0x11,0x03,0x38,0x71,0x7a,0x84,0x4a,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x00,0x02, -0x00,0x72,0xff,0xe9,0x04,0x28,0x05,0x9a,0x00,0x1e,0x00,0x3f,0x00,0x46,0xbf,0x00,0x17,0x05,0x0a,0x00,0x2a,0x00,0x20,0x05,0x0a,0x00,0x1f,0x00,0x38,0x05,0x0a,0xb3,0x09,0x3d,0x3d,0x25,0xb8,0x04,0xfb,0xb7,0x1c,0x00,0x1c,0x20,0x20,0x10,0x04,0x1c,0xba,0x05,0x03,0x00,0x31,0x04,0xff,0xb3,0x2f,0x10,0x01,0x10,0x00,0x2f,0x5d,0xed, -0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x10,0xed,0x32,0x2f,0x01,0x2f,0xed,0xd4,0xed,0xd6,0xed,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x03,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x15,0x14,0x1e,0x02, -0x33,0x32,0x36,0x02,0x51,0x08,0x2a,0x66,0x3d,0x31,0x5f,0x4b,0x2f,0x2c,0x4b,0x62,0x6b,0x6e,0x31,0x30,0x6b,0x68,0x5e,0x48,0x2a,0x32,0x4f,0x64,0x31,0x3b,0x61,0x6c,0x86,0x0f,0x1f,0x2e,0x1f,0x1a,0x2f,0x23,0x15,0x1e,0x32,0x42,0x48,0x4a,0x21,0x21,0x48,0x46,0x3e,0x30,0x1c,0x14,0x23,0x2f,0x1c,0x36,0x41,0x7d,0x51,0x43,0x2c,0x70, -0xbe,0x92,0x8e,0xfd,0xd6,0xac,0x78,0x40,0x3e,0x75,0xa6,0xd1,0xf7,0x8a,0x98,0xc7,0x76,0x30,0x43,0x01,0x39,0x2d,0x4b,0x37,0x1e,0x1a,0x46,0x7a,0x60,0x72,0xd1,0xb3,0x92,0x67,0x38,0x39,0x68,0x91,0xb1,0xcd,0x6e,0x5c,0x7c,0x4c,0x20,0x6a,0x00,0x01,0x00,0x2f,0xff,0xf5,0x03,0x65,0x05,0xa4,0x00,0x28,0x00,0x3d,0xb5,0x00,0x16,0x07, -0x03,0x2a,0x1e,0xbb,0x05,0x0a,0x00,0x0d,0x00,0x08,0x04,0xfc,0x40,0x09,0x2f,0x23,0x01,0x23,0x00,0x28,0x28,0x03,0x19,0xb8,0x04,0xfb,0xb5,0x2f,0x12,0x01,0x12,0x04,0x03,0xb8,0x04,0xe6,0x00,0x3f,0x33,0x2f,0x5d,0xed,0x12,0x39,0x11,0x33,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x00,0x03,0x27,0x36,0x12, -0x37,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x36,0x36,0x37,0x03,0x65,0xe1,0xfe,0x7d,0xac,0x26,0x5e,0xec,0x84,0x01,0x49,0x74,0x51,0x2b,0x3b,0x6e,0x9e,0x62,0x1d,0x47,0x23,0x20,0x4d,0x21,0x37,0x5f,0x46,0x28,0x21,0x3a,0x51,0x2f,0x45,0x4d, -0x26,0x4a,0x27,0x03,0x0a,0x6e,0xfe,0x77,0xfe,0xe2,0xc2,0x9e,0x01,0x17,0x6b,0x04,0x0c,0x3b,0x5a,0x76,0x46,0x53,0x86,0x5f,0x34,0x05,0x05,0xab,0x05,0x07,0x17,0x31,0x4f,0x39,0x34,0x4e,0x35,0x1a,0x1b,0x17,0x2a,0x14,0xff,0xff,0xff,0xf4,0x00,0x00,0x03,0xfa,0x05,0x9a,0x02,0x06,0x08,0xde,0x00,0x00,0xff,0xff,0x00,0x49,0x00,0x00, -0x04,0x4f,0x05,0x9a,0x02,0x06,0x08,0xdf,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x03,0xdb,0x05,0xa8,0x02,0x06,0x08,0xe0,0x00,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x00,0x28,0x00,0x36,0xb1,0x1b,0x10,0xb8,0x05,0x0a,0xb3,0x0d,0x0d,0x17,0x03,0xb8,0x05,0x0a,0xb2,0x25,0x17,0x08,0xb8,0x04,0xfb,0xb2,0x20,0x1b, -0x15,0xba,0x04,0xfb,0x00,0x16,0x05,0x03,0xb1,0x0f,0x00,0x00,0x2f,0x2f,0x3f,0xed,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36, -0x37,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x0c,0x27,0x4a,0x3d,0x13,0x49,0x59,0x1c,0x04,0x11,0x4c,0x7f,0xb7,0x7c,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0xb0,0x43,0x61,0x40,0x1f,0xa7,0x28,0x26,0x5f,0x95,0x69,0x37,0x45,0x7f, -0xb7,0x72,0x3f,0x83,0x4b,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xb9,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x57,0x02,0xad,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x06,0x32,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07, -0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc6,0x05,0xb9,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x01,0xc1, -0x00,0x20,0x00,0x34,0xb9,0x00,0x02,0x05,0x0a,0xb3,0x1d,0x1d,0x22,0x13,0xb8,0x05,0x0a,0x40,0x0a,0x0c,0x2f,0x20,0x01,0x20,0x2f,0x10,0x01,0x10,0x18,0xb8,0x04,0xfb,0xb5,0x1f,0x07,0x2f,0x07,0x02,0x07,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x0e,0x02,0x23,0x22, -0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x04,0x84,0x22,0x37,0x83,0xd6,0x9e,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0x01,0xc1,0xb9,0xa1,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f, -0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x02,0x06,0x09,0x28,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0x0a,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x06,0x0f,0x5a,0x00,0x00,0x00,0x01,0xff,0xba,0xfd,0xfa,0x04,0x02,0x02,0x01,0x00,0x32,0x00,0x48, -0xb9,0x00,0x1e,0x05,0x0b,0x40,0x0a,0x13,0x09,0x09,0x13,0x13,0x24,0x19,0x28,0x28,0x0e,0xb8,0x05,0x0a,0xb5,0x03,0x24,0x19,0x28,0x18,0x00,0xbb,0x04,0xfb,0x00,0x19,0x00,0x2b,0x05,0x03,0xb7,0x2f,0x1f,0x01,0x1f,0x2f,0x09,0x01,0x09,0x00,0x2f,0x5d,0x2f,0x5d,0x3f,0x33,0xed,0x32,0x39,0x01,0x2f,0x2f,0x33,0xed,0x33,0x2f,0x11,0x12, -0x39,0x2f,0x33,0x2f,0x10,0xed,0x31,0x30,0x37,0x32,0x36,0x37,0x3e,0x03,0x37,0x33,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x33,0x15,0x22,0x0e,0x02,0x15,0x15,0x2e,0x03,0x35,0x34,0x36,0x37,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x9b,0x30,0x3d,0x0e,0x09,0x10,0x1c,0x2e,0x27,0x97,0x2f,0x42,0x28,0x12,0x21, -0x33,0x3e,0x1e,0x07,0x42,0x73,0xa2,0x68,0x57,0x81,0x54,0x2a,0x7c,0xa9,0x68,0x2d,0x07,0x06,0x04,0x1a,0x40,0x2d,0x74,0x23,0x23,0x23,0x23,0x99,0x0a,0x0e,0x09,0x26,0x4b,0x7a,0x5c,0x67,0xa8,0x8b,0x71,0x2e,0x45,0x59,0x38,0x1e,0x09,0x60,0xa9,0x7d,0x48,0xa7,0x3f,0x76,0xa9,0x6a,0x30,0x18,0x47,0x60,0x7b,0x4d,0x20,0x43,0x25,0x02, -0x0c,0x0d,0x34,0x20,0x20,0x33,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x06,0x12,0x02,0x26,0x09,0x28,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x16,0xfe,0x29,0x00,0x0a,0xb4,0x02,0x2f,0x40,0x01,0x40,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x05,0x5d,0x02,0x26,0x09,0x28,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x01, -0x04,0xad,0x00,0x01,0x00,0x72,0xff,0xea,0x06,0xe5,0x03,0x5b,0x00,0x2b,0x00,0x1f,0xb9,0x00,0x0a,0x05,0x0a,0xb6,0x21,0x00,0x2f,0x2b,0x01,0x2b,0x0f,0xba,0x04,0xfb,0x00,0x1a,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xcd,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e, -0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x37,0x03,0x4b,0x3a,0x72,0x69,0x60,0x28,0x24,0x3b,0x2a,0x17,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x27,0x43,0x5c,0x35,0x2e,0x62,0x63,0x60,0x2c,0x02,0xd3,0x30,0x4e,0x3f,0x34,0x16,0x14,0x25,0x25,0x28, -0x18,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x37,0x5a,0x4c,0x43,0x20,0x1c,0x38,0x3c,0x43,0x27,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb, -0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x33,0x02,0xac,0x0d,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93, -0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27,0x08,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0xff,0xff,0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x3e,0x02,0x26,0x09,0x65,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xab, -0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x3d,0x02,0x26,0x09,0x66,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0x00,0x01,0x00,0x2d,0x00,0x00,0x01,0xab,0x00,0xbc,0x00,0x03,0x00,0x13,0xb2,0x03,0x02,0x02,0xba,0x04,0xfb,0x00,0x00,0x04,0xe6,0x00, -0x3f,0xed,0x01,0x2f,0xcd,0x31,0x30,0x21,0x21,0x27,0x21,0x01,0xab,0xfe,0xaa,0x28,0x01,0x7e,0xbc,0x00,0x00,0x03,0x00,0x7c,0x00,0x00,0x04,0x18,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x34,0xbc,0x00,0x05,0x05,0x0c,0x00,0x04,0x00,0x01,0x05,0x0c,0xb5,0x00,0x2f,0x09,0x01,0x09,0x08,0xba,0x04,0xe6,0x00,0x06,0x04,0xfe,0xb4, -0x2f,0x05,0x01,0x05,0x02,0xb9,0x04,0xfe,0x00,0x01,0x00,0x2f,0xed,0x2f,0x5d,0xed,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x05,0x01,0x33,0x01,0xc0,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0xfd,0x86,0x03,0x0d,0x8f,0xfc,0xf3,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0x5b,0x05,0x58,0xfa,0xa8,0x00, -0x00,0x01,0x00,0x42,0x01,0xae,0x02,0xd9,0x04,0x25,0x00,0x0e,0x00,0x0c,0xb4,0x20,0x03,0x01,0x03,0x0c,0x00,0x2f,0xc4,0x5d,0x31,0x30,0x01,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x27,0x33,0x07,0x37,0x02,0xd9,0xf6,0xa6,0x7b,0x81,0x81,0x7b,0xa6,0xf5,0x2f,0xe7,0x16,0x97,0x16,0xe7,0x02,0xfe,0x37,0xbf,0x5a,0xdb,0xdb, -0x5a,0xbf,0x37,0x8f,0x64,0xfc,0xfc,0x64,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x4b,0x06,0x3c,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x53,0x04,0xd7,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02, -0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0xff,0xf2,0x07,0x4a,0x08,0x36,0x00,0x3a,0x00,0x48,0x00,0x4c, -0x00,0x7a,0x00,0xdd,0xb9,0x00,0x0d,0x05,0x0a,0xb3,0x0a,0x66,0x66,0x69,0xb8,0x05,0x0d,0xb6,0x63,0x65,0x65,0x63,0x5a,0x5a,0x5d,0xb8,0x05,0x0d,0x40,0x09,0x4a,0x4b,0x4b,0x56,0x56,0x4a,0x59,0x59,0x49,0xb8,0x05,0x0b,0xb4,0x16,0x70,0x4a,0x4a,0x00,0xb8,0x05,0x0a,0xb3,0x38,0x4d,0x4d,0x50,0xb8,0x05,0x0b,0xb5,0x78,0x7a,0x7a,0x78, -0x43,0x2d,0xb8,0x05,0x0a,0x40,0x0e,0x2c,0x0a,0x63,0x38,0x78,0x2c,0x2c,0x78,0x38,0x63,0x0a,0x05,0x7c,0x3b,0xbb,0x05,0x0a,0x00,0x26,0x00,0x21,0x04,0xfb,0xb6,0x2f,0x40,0x01,0x40,0x16,0x33,0x05,0xbb,0x04,0xfb,0x00,0x19,0x00,0x12,0x05,0x03,0x40,0x0b,0x70,0x60,0x6c,0x30,0x4c,0x01,0x4c,0x49,0x5a,0x53,0x60,0xb8,0x04,0xfd,0xb3, -0x73,0x6c,0x0b,0x44,0xb8,0x04,0xfc,0x40,0x0a,0x2b,0x2f,0x2c,0x01,0x2c,0x3a,0x20,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xd6,0xd4,0x5d,0xdd,0xed,0x10,0xd4,0x32,0xfd,0x32,0xd6,0xde,0xcd,0x5d,0x11,0x12,0x39,0x3f,0x33,0xed,0x32,0x39,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x2f, -0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x2f,0x39,0x39,0xed,0x33,0x2f,0x11,0x33,0x2f,0x33,0x2f,0x10,0xe4,0x32,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22, -0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x23,0x11,0x33,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x34,0x27,0x33,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x15, -0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x05,0x49,0x0c,0x26,0x46,0x39,0x25,0x42,0x31,0x1c,0x9c,0x3c,0x61,0x7b,0x3e,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1d,0x40,0x36,0x24,0x9c, -0xfb,0xee,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x04,0x03,0x74,0x74,0xfe,0xf5,0x03,0x01,0x26,0x2d,0x2c,0x23,0x01,0x5f,0x01,0x22,0x2d,0x2f,0x25,0x03,0x5f,0x01,0x01,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x03,0x01,0x8c,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfb,0xce, -0x65,0x86,0x4f,0x20,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xf4,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x04,0xd3,0x01,0x56,0xfe,0x57,0x1c,0x18,0x09,0x33,0x3f,0x3e,0x3b,0x0d, -0x1c,0x0d,0x0e,0x1c,0x0b,0x3d,0x3d,0x3e,0x37,0x1f,0x1b,0x0c,0x18,0x08,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x21,0x18,0x00,0x01,0x00,0x57,0xff,0xaf,0x04,0x02,0x01,0xbb,0x00,0x1e,0x00,0x2a,0xbc,0x00,0x0d,0x05,0x0a,0x00,0x12,0x00,0x08,0x04,0xfb,0x40,0x09,0x2f,0x17,0x01,0x17,0x2f,0x0e,0x01,0x0e,0x1e,0xba,0x04, -0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x33,0x04,0x02,0x0c,0x42,0x6c,0x60,0x56,0x55,0x58,0x32,0x2a,0x4d,0x3b,0x23,0x83,0x03,0x01,0x42,0x69,0x80,0x3f,0x3f,0x6b, -0x60,0x58,0x56,0x58,0x31,0x0e,0x2b,0x40,0x4c,0x40,0x2b,0x23,0x4e,0x7c,0x58,0x20,0x16,0x1e,0x05,0x7e,0xb2,0x70,0x33,0x2b,0x40,0x4c,0x40,0x2b,0x00,0x01,0x00,0xc4,0x06,0x7c,0x01,0x42,0x08,0x04,0x00,0x03,0x00,0x15,0xbd,0x00,0x00,0x05,0x0b,0x00,0x01,0x00,0x00,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x01, -0x23,0x11,0x33,0x01,0x42,0x7e,0x7e,0x06,0x7c,0x01,0x88,0x00,0x00,0x02,0xff,0x17,0x06,0x1d,0x02,0xee,0x08,0xde,0x00,0x53,0x00,0x65,0x00,0x6f,0xb5,0x09,0x26,0x61,0x03,0x47,0x1a,0xb8,0x05,0x0d,0xb2,0x59,0x2d,0x00,0xbb,0x05,0x0d,0x00,0x51,0x00,0x38,0x05,0x0d,0xb2,0x47,0x53,0x15,0xb8,0x05,0x01,0x40,0x11,0x5c,0x54,0x26,0x2d, -0x54,0x1f,0x61,0x61,0x54,0x4c,0x4c,0x54,0x10,0x10,0x0a,0x03,0x54,0xb8,0x05,0x01,0x40,0x09,0x1f,0x35,0x35,0x30,0x30,0x29,0x29,0x1f,0x3b,0xb9,0x05,0x01,0x00,0x42,0x00,0x2f,0xfd,0xce,0x32,0x2f,0x32,0x2f,0x32,0x2f,0x10,0xfd,0x32,0xcc,0x33,0x2f,0x11,0x33,0x2f,0x11,0x33,0x2f,0x11,0x12,0x39,0x39,0x10,0xde,0xfd,0xc6,0x01,0x2f, -0xed,0x2f,0xed,0x39,0x2f,0xed,0x11,0x17,0x39,0x31,0x30,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22,0x06,0x15, -0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x01,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x61,0x0e,0x1a,0x1a,0x15,0x05,0x05,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13, -0x20,0x46,0x71,0x51,0x48,0x61,0x15,0x0a,0x14,0x06,0x01,0x12,0x31,0x1a,0x1f,0x28,0x0a,0x01,0x11,0x2c,0x16,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x40,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35,0x3b,0x16,0x1d,0x10,0x0e,0x0c,0x58,0x01,0x9b,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c, -0x1d,0x1b,0x07,0x7e,0x2a,0x27,0x1c,0x1a,0x0b,0x2a,0x12,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x03,0x08,0x04,0x14,0x0b,0x18,0x13,0x17,0x14,0x19,0x12,0x01,0x0f,0x12,0x19,0x10,0x09,0x06,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x08,0x17,0x15,0x01,0x76, -0xfe,0x4d,0x02,0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x00,0x01,0x00,0x10,0x06,0x71,0x01,0xbb,0x08,0xde,0x00,0x14,0x00,0x27,0xb9,0x00,0x0c,0x05,0x0d,0xb5,0x09,0x06,0x06,0x00,0x00,0x03,0xb8,0x05,0x01,0xb5,0x11,0x14,0x14,0x11,0x0b,0x05,0x00,0x2f,0xc4,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x01,0x2f, -0xed,0x31,0x30,0x13,0x16,0x16,0x33,0x03,0x33,0x13,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x10,0x2e,0x51,0x27,0x99,0x5d,0x98,0x28,0x28,0x59,0x23,0x3d,0x53,0x30,0x2d,0x5e,0x30,0x06,0xe2,0x06,0x04,0x01,0xca,0xfe,0x37,0x02,0x1c,0x2a,0x01,0xbd,0xfe,0x22,0x34,0x3a,0x1b,0x06,0x04,0x06,0x00,0xff,0xff, -0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xc2,0xfd,0xfe,0x01,0xa2,0xff,0x6b,0x00,0x28,0x00,0x3e,0xbc,0x00,0x1b,0x05,0x0d,0x00,0x0d,0x00,0x26,0x04,0xfd,0xb5,0x04,0x04,0x1f,0x14,0x14,0x12,0xb8,0x04,0xfd,0x40,0x0a,0x00,0x18,0x10,0x18,0x02,0x18,0x1f,0x09,0x09,0x1f,0xb8,0x04,0xfd, -0xb3,0x1f,0x20,0x01,0x20,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x10,0xde,0x5d,0xed,0x32,0x2f,0x11,0x39,0x2f,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x07, -0x3e,0x19,0x28,0x11,0x11,0x1d,0x1f,0x24,0x19,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x0d,0x1d,0x10,0x2d,0x3e,0x46,0x48,0x46,0xc7,0x31,0x40,0x2b,0x1e,0x0f,0x1f,0x2e,0xfe,0x06,0x56,0x15,0x10,0x0c,0x0f,0x0c,0x01,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x65,0x03,0x04,0x26,0x25,0x30,0x2d,0x61,0x0f,0x11,0x0f,0x28, -0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00, -0x00,0x02,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x02,0xb7,0x00,0x30,0x00,0x44,0x00,0x5b,0xb2,0x31,0x31,0x14,0xbb,0x05,0x0a,0x00,0x00,0x00,0x3d,0x05,0x0a,0xb6,0x07,0x00,0x07,0x00,0x07,0x46,0x25,0xb8,0x05,0x0a,0xb3,0x1e,0x1e,0x13,0x2a,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x19,0x2f,0x19,0x02,0x19,0x22,0x22,0x02,0x38,0xb8,0x04,0xfb,0xb5, -0x2f,0x0c,0x01,0x0c,0x00,0x42,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x33,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23, -0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0xad,0x50,0x5c,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x1b,0x28,0x1b,0x0e,0x4a,0x98,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c, -0x2b,0x64,0xa5,0x7a,0x67,0x93,0x64,0x3b,0x21,0x0b,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x17,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x2a,0x68,0x75,0x7f,0x40,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x1d,0x32, -0x46,0x51,0x5b,0xd0,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0x06,0x7c,0x01,0xa2,0x07,0xe9,0x00,0x18,0x00,0x2f,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb6,0x11,0x0e,0x09,0x0a,0x18,0x18,0x16, -0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e, -0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x07,0x7e,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0x01,0x00,0x49,0xfd,0xfe,0x01,0xa2,0xff,0x6b,0x00,0x18,0x00,0x34,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb3,0x11,0x18,0x18,0x16,0xb8,0x04,0xfd,0x40,0x0a,0x00,0x03, -0x10,0x03,0x02,0x03,0x09,0x0d,0x0d,0x09,0xb8,0x04,0xfd,0xb3,0x1f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x10,0xde,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x73,0x0d,0x1d,0x10,0x2d, -0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xff,0x00,0x03,0x04,0x26,0x27,0x5b,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0xff,0xff,0xff,0x97,0x00,0x00,0x01,0xf0,0x07,0xe8,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x00,0xff,0xff,0xff,0x97,0xff,0xf2,0x02,0x01, -0x07,0xe8,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x00,0xff,0xff,0xff,0xc2,0x00,0x00,0x01,0xa2,0x07,0xe9,0x02,0x26,0x09,0x0d,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x7e,0x00,0x0a,0xb4,0x01,0x20,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xff,0xf2,0x02,0x01,0x07,0xe9,0x02,0x26,0x08,0xc7, -0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x7e,0x00,0x0a,0xb4,0x01,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xfd,0xfe,0x01,0xa2,0x05,0xec,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x77,0x00,0x00,0xff,0xff,0xff,0xc2,0xfd,0xfe,0x02,0x01,0x05,0xec,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x77, -0x00,0x00,0xff,0xff,0x00,0xab,0x00,0x00,0x02,0xf8,0x05,0xec,0x00,0x26,0x09,0x0d,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0x00,0x0a,0xb4,0x01,0x20,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xf2,0x03,0x57,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x09,0x21,0x02,0x01,0x00,0x00,0x01,0x07, -0x09,0x7e,0x01,0x56,0xfe,0x00,0x00,0x0a,0xb4,0x02,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0xa3,0x05,0x3e,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x09,0x7e,0x02,0x01,0xfd,0x55,0xff,0xff,0xff,0xe7,0xfd,0xff,0x03,0xa3,0x05,0x63,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01, -0xfd,0x55,0x00,0x07,0x09,0x30,0x00,0x28,0xfd,0x55,0xff,0xff,0x00,0x9a,0xff,0x55,0x06,0x4f,0x05,0xe9,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x09,0x7e,0x04,0xad,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xfa,0x05,0x3e,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x09,0x7e,0x05,0x58,0xfd,0x55,0xff,0xff,0x00,0xab,0xff,0xea, -0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad, -0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xee,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x5b,0x02,0xad,0x00,0xef,0x01,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0x00,0x0c,0xb5,0x02,0x01,0x20, -0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x01,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0x00,0x0c,0xb5,0x02,0x01,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca, -0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0x04,0x02,0xff,0xff, -0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07, -0x0f,0x56,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0x8f,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfd,0xa6,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0x8f,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfd,0xa6,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x16, -0x02,0x26,0x08,0xd0,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfd,0x2d,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0xf2,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0xf2,0x02,0x26,0x08,0xd1, -0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x79,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xc8,0xff,0xb1,0xff,0xff,0x00,0x7e,0xfd,0xff, -0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x96,0xff,0x75,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x02,0x26,0x09,0x13,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0xc8, -0xff,0x26,0x00,0x0c,0xb5,0x02,0x01,0x20,0x34,0x01,0x34,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0x91,0xff,0x14,0x00,0x0c,0xb5,0x02,0x01,0x20,0x43,0x01,0x43,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f, -0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0xf2,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0xf2,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x2a,0xff,0xff, -0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x79,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x03,0xb1,0x00,0x05,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x84,0xb1,0x3e,0x36,0xb8,0x05,0x0a,0xb4,0x37,0x3f,0x37,0x3a,0x32,0xb8,0x05,0x0a,0x40,0x0e,0x33,0x3b,0x33, -0x1d,0x00,0x0d,0x03,0x37,0x33,0x37,0x33,0x43,0x26,0x05,0xb8,0x05,0x0a,0xb2,0x16,0x3e,0x3a,0xb8,0x04,0xfb,0x40,0x09,0x40,0x0f,0x3d,0x1f,0x3d,0x02,0x3d,0x36,0x32,0xb8,0x04,0xfb,0x40,0x0d,0x38,0x2f,0x35,0x3f,0x35,0x02,0x35,0x31,0x1d,0x00,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11, -0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0x32,0xde,0x5d,0x32,0xed,0x32,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06, -0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64, -0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0x7e,0xb5,0xb5,0x01,0x1a,0xb5,0xb5,0xfe,0xe6,0xb5,0xb5,0x01,0x1a,0xb5,0xb5,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a, -0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x78,0xb3,0xb3,0xb3,0xfe,0x35,0xb3,0xb3,0xb3,0x00,0x04,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x42,0x00,0x46,0x00,0x4a,0x00,0x4e,0x00,0x90,0xb2,0x03,0x43,0x00,0xb8,0x05,0x0a,0xb4,0x01,0x44,0x01,0x4b,0x47,0xb8,0x05,0x0a,0x40,0x0e, -0x48,0x4c,0x48,0x23,0x38,0x13,0x03,0x01,0x48,0x01,0x48,0x50,0x2c,0x0b,0xbd,0x05,0x0a,0x00,0x1c,0x00,0x3c,0x04,0xfb,0x00,0x3e,0x05,0x03,0xb6,0x06,0x38,0x23,0x37,0x04,0x17,0x29,0xb8,0x04,0xff,0xb2,0x30,0x13,0x10,0xb8,0x04,0xfc,0x40,0x09,0x14,0x1f,0x17,0x2f,0x17,0x02,0x17,0x47,0x43,0xb8,0x04,0xfb,0x40,0x09,0x49,0x0f,0x46, -0x1f,0x46,0x02,0x46,0x4b,0x00,0xb8,0x04,0xfb,0xb4,0x4d,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0x33,0xfd,0x32,0xde,0x5d,0x32,0xed,0x32,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x39,0x31,0x30,0x25,0x23, -0x35,0x33,0x26,0x26,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x07,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x27,0x11,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x35,0x23,0x35, -0x33,0x03,0xa6,0xb5,0xa9,0x1d,0x2a,0x0f,0x9d,0xd5,0x81,0x37,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x20,0x4b,0x24,0xc1,0x99,0x19,0x2f,0x84,0xc0,0x3f,0xb5,0xb5,0xfe,0xf0, -0xb5,0xb5,0xb5,0xb5,0x34,0xb3,0x31,0x70,0x3e,0x35,0x72,0x7b,0x86,0x48,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x15,0x9f,0xb4,0xa7,0x7a,0x66,0xfe,0x4a,0xb3,0xb3,0xb3,0x65,0xb3, -0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfe,0xf4,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x01,0x07,0x0f,0x5b,0x00,0xab,0x00,0xf5,0x00,0x0c,0xb5,0x02,0x01,0x20,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0x35,0xff,0xff, -0x00,0x52,0xfe,0xa6,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xfe,0xa6,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0xab,0xfe,0xab,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x05,0x5d, -0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xa6,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0x04,0xad,0xff,0xff, -0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc2,0x04,0xaf,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07, -0x0a,0x6d,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x31,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x90,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x4f,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xf2,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xe1,0x04,0x31,0x02,0x5e, -0x00,0x26,0x09,0x17,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x09,0xf7,0x65,0x00,0x0a,0xb4,0x01,0x2f,0x1d,0x01,0x1d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x4f,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf2,0xfe,0x00,0x00,0x06,0x0f,0x50,0xce,0x05,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e, -0x04,0x07,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x04,0x07,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0x50,0x03,0x57, -0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x05,0xf4,0x04,0x07,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x08,0xa0,0x03,0x0f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x50,0xfd,0xce, -0xff,0xff,0xff,0xba,0xfd,0xc9,0x05,0xf4,0x03,0x0f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xa4,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x54,0x05,0x50,0xfd,0xce,0x00,0x07,0x0f,0x53,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xfd,0xc9,0x05,0xf4, -0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xa4,0xfd,0xce,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x03,0x3c,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x51,0x06,0x3c,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x07,0x4b,0x03,0x3c,0x02,0x26,0x08,0xd6,0x00,0x00, -0x00,0x07,0x0f,0x51,0x03,0x86,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x05,0xca,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x07,0x4b,0x05,0xca,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x1e,0x04,0x02,0xff,0xff,0x00,0x19,0xff,0xea,0x05,0xf5, -0x05,0xec,0x02,0x26,0x09,0x1d,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xa7,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xe4,0x04,0xdf,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x06,0x42,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x7a, -0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x02,0x00,0x02,0x00,0xab,0xff,0xea,0x07,0x4b,0x03,0x62,0x00,0x36,0x00,0x4a,0x00,0x4c, -0xbc,0x00,0x23,0x05,0x0a,0x00,0x37,0x00,0x43,0x05,0x0a,0xb6,0x16,0x37,0x16,0x37,0x16,0x4c,0x03,0xb8,0x05,0x0a,0xb4,0x33,0x48,0x10,0x10,0x0d,0xb8,0x04,0xfb,0xb4,0x2a,0x00,0x00,0x1b,0x2a,0xba,0x05,0x03,0x00,0x3e,0x04,0xfb,0xb3,0x2f,0x1b,0x01,0x1b,0x00,0x2f,0x5d,0xed,0x3f,0x12,0x39,0x2f,0x10,0xed,0x32,0x2f,0x32,0x01,0x2f, -0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14, -0x1e,0x02,0x17,0x36,0x36,0x01,0x62,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x3a,0x64,0x89,0x9d,0xac,0x55,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x05,0xe6,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2c, -0x1a,0x18,0x42,0x73,0x5a,0x21,0x1d,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x60,0x84,0x57,0x30,0x17,0x05,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0xf2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26, -0x3c,0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x18,0x4d,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6, -0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x05,0x24,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x27,0x0f,0x50,0x04,0xd7,0x04,0x74,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c, -0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x0e,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x0e,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8, -0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x10,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x0e,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x0e,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea, -0x07,0x4b,0x06,0x3c,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x56,0x04,0xd7,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xd5, -0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x04,0x79,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xd4,0x03,0xc9,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x05,0x91,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xd4,0x03,0xc9,0x00,0x01,0x00,0x19,0xff,0xea,0x08,0x3d,0x04,0x19,0x00,0x3f,0x00,0x41, -0xb9,0x00,0x2e,0x05,0x0a,0xb6,0x0f,0x0c,0x0c,0x0f,0x0f,0x41,0x23,0xbf,0x05,0x0a,0x00,0x18,0x00,0x07,0x04,0xfb,0x00,0x38,0x05,0x03,0x00,0x12,0x04,0xfb,0xb4,0x2f,0x29,0x01,0x29,0x1e,0xb8,0x04,0xfb,0xb3,0x2f,0x1d,0x01,0x1d,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f,0x10,0xed,0x31, -0x30,0x37,0x1e,0x05,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x27,0x19,0x25,0x83,0xaa,0xc8,0xd8,0xdd,0x69,0xa5,0xf9,0xc5,0x9e,0x4b,0x03, -0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x18,0x4a,0x89,0x71,0x03,0xba,0x46,0x76,0x54,0x2f,0x0d,0x1d,0x2e,0x20,0x3a,0xb4,0xed,0xfe,0xdc,0xaa,0x46,0xb1,0xc0,0xc2,0xae,0x8f,0x2d,0xa9,0x05,0x07,0x06,0x03,0x02,0x01,0x02,0x04,0x08,0x06,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40, -0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2d,0x12,0x15,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x1c,0x41,0x40,0x3b,0x16,0x05,0x09,0x06,0x04,0x01,0x02,0x03,0x06,0x07,0x05,0x00,0x00,0x01,0xff,0xba,0xff,0xea,0x07,0x92,0x04,0x19,0x00,0x44,0x00,0x48,0xb9,0x00,0x29,0x05,0x0a,0xb3,0x1e,0x1e,0x45,0x34,0xb8,0x05,0x0a,0xb4, -0x15,0x12,0x12,0x15,0x3e,0xba,0x05,0x03,0x00,0x18,0x04,0xfb,0xb4,0x2f,0x2f,0x01,0x2f,0x24,0xb8,0x04,0xfb,0xb5,0x2f,0x23,0x01,0x23,0x0d,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0x33,0x2f,0x10,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x17,0x23,0x22,0x26,0x35,0x34, -0x36,0x33,0x33,0x32,0x16,0x16,0x04,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x32,0x32,0x23,0x23,0x23,0x23,0x3b,0x1e,0xa2,0xef,0x01,0x2e, -0xab,0x9d,0xf6,0xc3,0x99,0x40,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f,0x0d,0x1d,0x2e,0x20,0x34,0xb6,0xec,0xfe,0xe9,0x96,0x50,0xb3,0xb2,0xa8,0x8b,0x66,0x0e,0x34,0x20,0x20,0x33,0x03,0x03,0x02,0x03,0x05,0x07,0x05,0x0b, -0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x1c,0x41,0x40,0x3b,0x16,0x05,0x08,0x07,0x04,0x01,0x02,0x02,0x02,0x01,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x5b,0x04,0xa6, -0x05,0xb0,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x06,0xb3,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed, -0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x07,0xcb,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xcb,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9, -0x05,0xf4,0x05,0xec,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x74,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x5b,0x04,0xa6, -0x05,0xb0,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x27,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xc3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00, -0x01,0x07,0x0f,0x51,0x03,0x90,0x07,0x13,0x00,0x0c,0xb5,0x02,0x03,0x20,0x3e,0x01,0x3e,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xc3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x51,0x00,0x39,0x07,0x13,0x00,0x0c,0xb5,0x02,0x03,0x20,0x28,0x01,0x28,0x00,0x11,0x5d, -0x35,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab, -0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x52,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff, -0x00,0xab,0xff,0xea,0x06,0xa2,0x08,0xbd,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x57,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x45,0x01,0x20,0x45,0x01,0x45,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x08,0xbd,0x02,0x26, -0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x00,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x30,0x01,0x20,0x30,0x01,0x30,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x70,0x08,0x0e,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0a,0x6d,0x03,0x48,0x00,0x32, -0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x08,0x0e,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0x00,0x32,0xff,0xff,0x00,0x9b,0xfe,0xac,0x04,0xa5,0x07,0x67,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x48,0x06,0xb7,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x07,0x67,0x02,0x26,0x08,0xee,0x00,0x00, -0x00,0x07,0x0f,0x50,0x00,0x9c,0x06,0xb7,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x46,0x08,0x7f,0x02,0x26,0x09,0x25,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x48,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x28,0x01,0x28,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x08,0x7f,0x02,0x26,0x08,0xee,0x00,0x00, -0x01,0x07,0x0f,0x53,0x00,0x9c,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0x04,0x00,0x9b,0xfd,0xc4,0x04,0x9e,0x05,0xec,0x00,0x1d,0x00,0x21,0x00,0x25,0x00,0x29,0x00,0x65,0xbc,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x27,0x05,0x0c,0xb2,0x26,0x26,0x22,0xbb,0x05,0x0c,0x00,0x23, -0x00,0x1e,0x05,0x0c,0x40,0x0a,0x1f,0x0d,0x23,0x1f,0x1f,0x23,0x0d,0x03,0x2b,0x03,0xbb,0x05,0x0a,0x00,0x1a,0x00,0x26,0x04,0xfb,0xb2,0x29,0x22,0x1e,0xb8,0x04,0xfb,0xb5,0x24,0x20,0x21,0x01,0x21,0x08,0xba,0x04,0xfb,0x00,0x15,0x05,0x03,0xb1,0x0e,0x00,0x00,0x2f,0x2f,0x3f,0xed,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0xed,0x01,0x2f,0xed, -0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67, -0x93,0x5d,0x2b,0x9c,0x38,0x81,0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0x9d,0xc9,0xc9,0x01,0x56,0xc9,0xc9,0xab,0xc9,0xc9,0x02,0xec,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x03,0x7e,0xfc,0x6e,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0xfb,0xf0,0xbd,0xbd,0xbd,0xfe,0x2b,0xbd,0x00,0xff,0xff, -0xff,0xba,0xfd,0xc9,0x02,0x48,0x05,0xec,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x4a,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xfb,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00,0x01,0x56,0x00,0x27,0x0f,0x50,0x01,0x9f,0x04,0x02,0x00,0x07,0x0f,0x50,0x01,0x9f,0xfe,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x01,0xf9, -0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x05,0x0e,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x9f,0x02,0xac,0xff,0xff,0x00,0x9b,0xfe,0x55,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00, -0x01,0x56,0x00,0x27,0x0f,0x5b,0x01,0x9f,0x00,0x56,0x00,0x07,0x0f,0x50,0x01,0x9f,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0x05,0x01,0xf9,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x04,0x74,0x02,0x26,0x09,0x5f, -0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x00,0x26,0x09,0x42,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff, -0x05,0x58,0x04,0xda,0x02,0x26,0x09,0x43,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0x56,0xfd,0xce,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x02,0x26,0x09,0x29, -0x00,0x00,0x00,0x06,0x0f,0x5b,0x66,0x60,0x00,0x02,0x00,0x00,0xfd,0xfe,0x03,0x4b,0x03,0x1c,0x00,0x2a,0x00,0x3f,0x00,0x62,0xb2,0x08,0x20,0x35,0xb8,0x05,0x0a,0xb2,0x09,0x16,0x20,0xb8,0x05,0x0a,0xb7,0x0e,0x3d,0x3d,0x0e,0x0e,0x3a,0x11,0x08,0xb8,0x04,0xfd,0xb3,0x0b,0x0b,0x03,0x11,0xb8,0x04,0xfb,0x40,0x09,0x3d,0x2f,0x3a,0x3f, -0x3a,0x02,0x3a,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x2a,0x1f,0x27,0x2f,0x27,0x02,0x27,0x30,0xb8,0x04,0xfb,0xb3,0x2f,0x1b,0x01,0x1b,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0x33,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e, -0x02,0x37,0x21,0x35,0x21,0x36,0x36,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x67,0xab,0x45,0x3e,0x60,0x48,0x33,0x11,0xfe,0x2a,0x01,0xf4,0x08,0x07,0x01,0x2f,0x58, -0x29,0x42,0x7b,0x5e,0x39,0x30,0x55,0x75,0x45,0x42,0x7f,0x63,0x3d,0x13,0x2c,0x49,0x6e,0x96,0x62,0x58,0xad,0x58,0x02,0x98,0x0f,0x2a,0x32,0x35,0x1a,0x1c,0x37,0x2c,0x1b,0x20,0x3a,0x4e,0x2f,0x1b,0x4b,0x2a,0x02,0x09,0xfe,0xfa,0x2b,0x25,0x1b,0x31,0x43,0x28,0x6d,0x2b,0x58,0x2d,0x16,0x11,0x29,0x4f,0x72,0x48,0x41,0x8e,0x77,0x4d, -0x4f,0x9e,0xee,0x9f,0x51,0xa2,0x96,0x83,0x61,0x37,0x2c,0x2a,0x03,0x34,0x33,0x55,0x3d,0x22,0x26,0x3d,0x4a,0x24,0x26,0x3c,0x29,0x16,0x0c,0x14,0x1d,0x33,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x31,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x0a,0x6d,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x38,0x01,0x38,0x00,0x11, -0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x63,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x09,0x30,0x00,0xe4,0xfd,0x55,0x00,0x0c,0xb5,0x03,0x02,0x2f,0x38,0x01,0x38,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x59,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x09,0x73,0x00,0xe5,0xfd,0x55, -0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x31,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x38,0x01,0x38,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x04,0x79,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x00, -0xfd,0xff,0x03,0x49,0x05,0x91,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x03,0xc9,0x00,0x01,0x00,0x32,0xff,0x55,0x06,0x3d,0x04,0x15,0x00,0x37,0x00,0x3a,0xb2,0x0b,0x05,0x31,0xbb,0x05,0x0a,0x00,0x18,0x00,0x2a,0x05,0x0a,0x40,0x09,0x1f,0x25,0x18,0x1f,0x18,0x1f,0x39,0x08,0x0e,0xbd,0x05,0x0a,0x00,0x05,0x00, -0x00,0x04,0xfb,0x00,0x13,0x04,0xe6,0x00,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e, -0x04,0x15,0x14,0x0e,0x04,0x03,0x48,0x91,0xc4,0x78,0x34,0x0e,0x0e,0xfe,0xcf,0x01,0xeb,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xab,0x4c,0x81,0xad,0x60,0x38,0x72,0x39,0x39,0x72,0x61,0x58,0xaf,0x55, -0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x00,0x00,0x01,0x00,0x1e,0xff,0x02,0x07,0x58,0x02,0x13,0x00,0x44,0x00,0x5a,0xb3,0x26,0x14,0x20,0x38,0xb8,0x05,0x0a,0xb2,0x0f, -0x0f,0x14,0xb8,0x05,0x0a,0xb3,0x33,0x33,0x46,0x29,0xb8,0x05,0x0a,0x40,0x09,0x20,0x23,0x23,0x20,0x26,0x3d,0x23,0x23,0x0c,0xb8,0x04,0xff,0xb4,0x2f,0x3d,0x01,0x3d,0x1b,0xb8,0x04,0xfb,0xb4,0x2f,0x2e,0x01,0x2e,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f, -0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e, -0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x07,0x58,0x16,0x43,0x67,0x4f,0x3b,0x2e,0x25,0x12,0x17,0x29,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x97,0xcc,0x7d,0x35,0x04,0x04,0xfe,0xd0,0x01,0xe3,0x0e,0x12,0x23,0x5d,0xa0,0x7d,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x19,0x2c,0x40, -0x66,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x4b,0x81,0xad,0x63,0x1f,0x49,0x23,0x39,0x72,0x5f,0x49,0x79,0x3f,0x4d,0x7d,0x5a,0x31,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x27,0x60,0x54,0x39,0xff,0xff,0x00,0x9a, -0xff,0x55,0x05,0x91,0x05,0xdc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0x2c,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfc,0x50,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x6d, -0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x04,0x79,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x9a,0xfd,0xc9,0x05,0x91,0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x00,0x07,0x0f,0x52,0x02,0x01,0xfd,0xce,0xff,0xff, -0x00,0x9a,0xfd,0xc4,0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0xc8,0xfd,0xc9,0x00,0x08,0xb3,0x02,0x4a,0x14,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc9,0x05,0x91,0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x00,0x07,0x0f,0x54,0x02,0x01,0xfd,0xce,0xff,0xff,0x00,0x9a,0xfd,0xc4, -0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xc8,0xfd,0xc9,0x00,0x04,0xff,0xa8,0x06,0x1d,0x02,0x5f,0x08,0xde,0x00,0x46,0x00,0x56,0x00,0x5a,0x00,0x5e,0x00,0x7a,0xb9,0x00,0x5c,0x05,0x0d,0xb2,0x5b,0x5b,0x0e,0xb8,0x05,0x0d,0xb5,0x47,0x29,0x29,0x47,0x18,0x3f,0xbe,0x05,0x0d,0x00,0x3c,0x00,0x23, -0x05,0x0d,0x00,0x32,0x00,0x57,0x05,0x0d,0xb2,0x58,0x58,0x51,0xb8,0x05,0x0d,0xb6,0x03,0x5d,0x5a,0x5b,0x57,0x3e,0x08,0xb8,0x05,0x01,0x40,0x0a,0x4c,0x43,0x18,0x13,0x54,0x46,0x46,0x37,0x37,0x43,0xb8,0x05,0x01,0xb4,0x13,0x1b,0x1b,0x13,0x26,0xb9,0x05,0x01,0x00,0x2d,0x00,0x2f,0xfd,0xce,0x32,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f, -0x32,0x11,0x39,0x10,0xd4,0xfd,0xcc,0xde,0x32,0xcd,0x32,0x01,0x2f,0xed,0x39,0x2f,0xed,0x2f,0xed,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22, -0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x32,0x17,0x37,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x01,0x98,0x32,0x23,0x14,0x25,0x32, -0x1e,0x1e,0x2f,0x19,0x11,0x1c,0x38,0x55,0x65,0x2e,0x17,0x27,0x30,0x0b,0x01,0x11,0x2c,0x16,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x40,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35,0x3b,0x16,0x1d,0x10,0x0e,0x0c,0x58,0x10,0x1a,0x1a,0x21,0x2d,0x14,0x6e,0x0a,0x11,0x16,0x0c,0x09,0x11,0x0d,0x09,0x25,0x36,0x09, -0x09,0x58,0x57,0x57,0x8f,0x57,0x57,0x07,0x2f,0x15,0x3a,0x1f,0x1b,0x36,0x2b,0x1c,0x1f,0x25,0x1a,0x46,0x2a,0x3b,0x3f,0x1e,0x05,0x17,0x15,0x19,0x12,0x01,0x0f,0x12,0x19,0x10,0x09,0x06,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x08,0x17,0x15,0x01,0x76,0xfe,0xa0,0x2f,0x22,0x01,0x40,0x10,0x24,0x1f,0x15,0x0c, -0x12,0x17,0x0c,0x14,0x29,0x18,0x06,0x1b,0x01,0x06,0x56,0x56,0x56,0x00,0x00,0x02,0xff,0xb7,0x06,0x71,0x02,0x28,0x08,0x06,0x00,0x1f,0x00,0x2f,0x00,0x35,0xb9,0x00,0x12,0x05,0x0d,0xb6,0x26,0x1a,0x20,0x08,0x03,0x17,0x0d,0xb8,0x05,0x01,0xb2,0x2b,0x13,0x23,0xbb,0x05,0x01,0x00,0x17,0x00,0x03,0x05,0x01,0xb3,0x1f,0x1f,0x1d,0x17, -0x00,0x2f,0x33,0x33,0x2f,0xed,0x10,0xfd,0x32,0xd6,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x31,0x30,0x03,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x49,0x0e,0x1c,0x0b, -0x26,0x30,0x21,0x16,0x0d,0x0a,0x1f,0x30,0x45,0x32,0x37,0x50,0x33,0x18,0x19,0x32,0x4a,0x31,0x3f,0x67,0x24,0x20,0x57,0x31,0x16,0x16,0xfa,0x18,0x53,0x31,0x36,0x3e,0x0f,0x1f,0x2f,0x20,0x1d,0x2e,0x24,0x1a,0x06,0xdc,0x02,0x02,0x11,0x21,0x30,0x1e,0x19,0x3d,0x35,0x23,0x2c,0x43,0x4e,0x21,0x23,0x41,0x34,0x1f,0x32,0x23,0x30,0x25, -0x03,0x9e,0x1d,0x1e,0x26,0x26,0x12,0x2c,0x26,0x19,0x16,0x26,0x34,0x00,0x00,0x02,0x00,0x37,0x06,0x1e,0x01,0x9b,0x08,0x4e,0x00,0x2b,0x00,0x2f,0x00,0x39,0xb1,0x19,0x2c,0xb8,0x05,0x0d,0xb2,0x2d,0x20,0x05,0xb8,0x05,0x0e,0xb4,0x13,0x2b,0x18,0x0e,0x24,0xb8,0x04,0xfd,0xb2,0x1e,0x00,0x2f,0xbc,0x04,0xfd,0x00,0x2c,0x00,0x08,0x05, -0x01,0x00,0x0e,0x00,0x2f,0xfd,0xde,0xfd,0xd6,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x03,0x23,0x35,0x33,0x01,0x86, -0x49,0x62,0x3c,0x19,0x3b,0x46,0x46,0x4e,0x29,0x48,0x23,0x38,0x4f,0x32,0x17,0x14,0x37,0x5f,0x4b,0x12,0x1d,0x1e,0x25,0x1b,0x35,0x23,0x14,0x2d,0x1a,0x1c,0x2b,0x24,0x20,0x24,0x2a,0x1d,0x50,0x57,0x57,0x07,0x93,0x12,0x29,0x2d,0x31,0x1a,0x29,0x38,0x1a,0x61,0x0e,0x0c,0x1e,0x33,0x42,0x23,0x1f,0x42,0x3f,0x39,0x17,0x03,0x06,0x0e, -0x0c,0x08,0x0d,0x5f,0x06,0x07,0x0a,0x0f,0x13,0x10,0x0b,0x01,0xfe,0xc7,0x56,0x00,0x00,0x03,0x00,0x1d,0x06,0x70,0x01,0xec,0x08,0x17,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x2d,0xbf,0x00,0x09,0x05,0x0a,0x00,0x08,0x00,0x00,0x05,0x0a,0x00,0x01,0x00,0x0b,0x04,0xff,0xb5,0x20,0x08,0x01,0x08,0x06,0x03,0xb8,0x04,0xff,0xb1,0x04,0x00, -0x00,0x2f,0x32,0xfd,0x32,0xde,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0xbf,0xa2,0xa2,0x01,0x2d,0xa1,0xa1,0x96,0xa2,0xa2,0x06,0x70,0x9e,0x9e,0x9e,0x6b,0x9e,0x00,0x01,0xff,0x2b,0x06,0x1f,0x02,0xae,0x08,0x2f,0x00,0x43,0x00,0x60,0xb4,0x28,0x28,0x00,0x00,0x03, -0xb8,0x05,0x0d,0xb2,0x40,0x21,0x0b,0xb8,0x05,0x0d,0xb6,0x08,0x40,0x08,0x40,0x08,0x18,0x38,0xbb,0x05,0x0d,0x00,0x32,0x00,0x18,0x05,0x0d,0x40,0x0b,0x15,0x21,0x28,0x10,0x1d,0x17,0x0a,0x0a,0x00,0x05,0x10,0xb8,0x05,0x01,0xb3,0x24,0x1d,0x35,0x3b,0xb9,0x04,0xfd,0x00,0x2d,0x00,0x2f,0xfd,0xc6,0xd4,0x32,0xfd,0x32,0xc4,0x32,0x11, -0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x2f,0x32,0x2f,0x31,0x30,0x13,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23, -0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0xe0,0x03,0x05,0x02,0x03,0x3f,0x1d,0x26,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x59,0x1b,0x2b,0x38,0x1d,0x29,0x3e,0x11,0x01,0x14,0x3a,0x1a,0x1a,0x21,0x0a,0x02,0x02,0x19,0x37,0x56,0x3e,0x3f,0x54,0x32, -0x15,0x0d,0x56,0x05,0x05,0x3b,0x44,0x28,0x38,0x23,0x10,0x07,0x07,0x07,0xbc,0x1a,0x2c,0x17,0x34,0x1e,0x2d,0x6d,0x50,0x1b,0x28,0x19,0x0c,0x06,0x11,0x1e,0x17,0xb8,0xd2,0x2d,0x3a,0x21,0x0c,0x17,0x1d,0x1e,0x16,0x0f,0x0e,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x33,0x3b,0x1b,0x29,0x16,0x41,0x35,0x12,0x28,0x41,0x2f,0x21,0x43, -0x2f,0x00,0x00,0x04,0x00,0x2d,0xfe,0xd2,0x08,0xcf,0x06,0x97,0x00,0x20,0x00,0x48,0x00,0x5c,0x00,0x70,0x00,0x31,0x40,0x16,0x18,0x6c,0x6c,0x15,0x3d,0x62,0x62,0x38,0x42,0x1b,0x15,0x08,0x4e,0x4e,0x0d,0x29,0x58,0x58,0x2e,0x24,0x03,0x0d,0x00,0x2f,0x33,0xcd,0x32,0x32,0x2f,0xcd,0x11,0x33,0x2f,0xcd,0x2f,0x33,0xcd,0x32,0x32,0x2f, -0xcd,0x11,0x33,0x2f,0xcd,0x30,0x31,0x25,0x06,0x04,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x24,0x27,0x24,0x11,0x10,0x25,0x36,0x25,0x36,0x36,0x33,0x32,0x16,0x17,0x04,0x17,0x04,0x11,0x10,0x05,0x16,0x04,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x36,0x24,0x37,0x36,0x12,0x35,0x10,0x25,0x26,0x25,0x0e,0x03,0x23,0x22,0x2e,0x02, -0x27,0x06,0x04,0x07,0x04,0x11,0x10,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0xa1,0x7c,0xfe,0xcc,0xbe,0x08,0x22,0x2f,0x3a,0x20,0x20,0x3a,0x2f,0x22,0x08,0xfe,0x82,0xf7,0xfe,0xd5,0x01,0x2e,0xf1,0x01, -0x83,0x12,0x60,0x3f,0x3e,0x5f,0x13,0x01,0x7a,0xf9,0x01,0x2c,0xf8,0xe8,0x6d,0x01,0x09,0xa1,0x09,0x22,0x2e,0x39,0x20,0x1f,0x3a,0x2e,0x22,0x09,0xa4,0x01,0x0a,0x6a,0x86,0x81,0xfe,0xfd,0xce,0xfe,0xb4,0x07,0x21,0x30,0x3b,0x21,0x21,0x3a,0x30,0x22,0x07,0x9f,0xfe,0xf9,0x6a,0xfe,0xef,0x03,0x5b,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21, -0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x41,0x61,0x72,0x13,0x1e,0x32,0x24,0x15,0x15,0x24,0x32,0x1d,0x24,0xc1,0xed,0x01,0x7c,0x01,0x96,0xf1,0xc1,0x27,0x38,0x48,0x47,0x37,0x21,0xc4,0xec,0xfe,0x83,0xfe,0x65,0xa5,0x55,0x63,0x11,0x1c,0x31, -0x23,0x14,0x14,0x23,0x31,0x1c,0x11,0x5e,0x50,0x66,0x01,0x16,0xb7,0x01,0x72,0xc9,0x9f,0x23,0x1f,0x34,0x26,0x15,0x15,0x25,0x33,0x1e,0x11,0x65,0x53,0xd4,0xfe,0xa6,0xfe,0xa6,0xfe,0x2f,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x06,0x38,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21, -0x13,0x13,0x21,0x2d,0x00,0x0a,0x01,0x46,0xfe,0xa4,0x07,0x66,0x06,0xc8,0x00,0x17,0x00,0x2b,0x00,0x34,0x00,0x3d,0x00,0x45,0x00,0x52,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x0c,0xb3,0x3d,0x12,0x31,0x06,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x34,0x3e,0x02,0x37,0x01,0x01,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x01, -0x2e,0x03,0x25,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x01,0x32,0x16,0x17,0x13,0x27,0x07,0x13,0x36,0x01,0x03,0x06,0x06,0x23,0x22,0x27,0x03,0x17,0x13,0x16,0x16,0x17,0x25,0x26,0x26,0x27,0x01,0x14,0x16,0x17,0x25,0x26,0x26,0x35,0x34,0x37,0x25,0x06,0x06,0x05,0x14,0x06,0x07,0x05,0x36,0x35, -0x34,0x26,0x27,0x05,0x16,0x01,0x26,0x26,0x27,0x05,0x16,0x16,0x17,0x01,0x06,0x06,0x07,0x13,0x36,0x36,0x37,0x01,0x36,0x36,0x37,0x03,0x06,0x06,0x07,0x01,0x46,0x42,0x78,0xa7,0x65,0x01,0x4a,0x01,0x4a,0x65,0xa7,0x78,0x42,0x43,0x78,0xa7,0x64,0xfe,0xb6,0xfe,0xb4,0x64,0xa6,0x78,0x42,0x01,0xf5,0x2c,0x4d,0x67,0x3b,0x3b,0x67,0x4d, -0x2c,0x2c,0x4d,0x67,0x3b,0x3b,0x67,0x4d,0x2c,0x01,0x1b,0x20,0x3e,0x1d,0x72,0xed,0xee,0x73,0x3c,0x01,0x2c,0x73,0x1d,0x3d,0x20,0x41,0x3a,0x72,0xed,0xb3,0x38,0x58,0x1d,0x01,0x06,0x33,0xa7,0x6c,0xfc,0x3a,0x14,0x14,0x01,0x05,0x09,0x0a,0x14,0xfe,0xfa,0x14,0x14,0x04,0x32,0x0b,0x09,0x01,0x05,0x29,0x14,0x14,0xfe,0xfa,0x14,0xfd, -0xc0,0x38,0x58,0x1d,0xfe,0xfb,0x33,0xa7,0x6c,0x02,0x80,0x1d,0x58,0x38,0x6c,0x6c,0xa7,0x33,0xfc,0x3a,0x1d,0x58,0x38,0x6c,0x6b,0xa8,0x33,0x02,0xb6,0x76,0xda,0xb8,0x91,0x2f,0x01,0x4a,0xfe,0xb5,0x2f,0x91,0xb8,0xd9,0x76,0x76,0xd9,0xb8,0x92,0x2e,0xfe,0xb5,0x01,0x4c,0x2e,0x91,0xb8,0xd9,0x76,0x3b,0x67,0x4d,0x2c,0x2c,0x4d,0x67, -0x3b,0x3b,0x67,0x4d,0x2c,0x2c,0x4d,0x67,0x01,0x51,0x0b,0x09,0x01,0x16,0xee,0xee,0xfe,0xea,0x14,0xfb,0xe5,0x01,0x16,0x09,0x0a,0x14,0xfe,0xe9,0xed,0x04,0xdc,0x1d,0x58,0x38,0x6d,0x6c,0xa7,0x33,0xfd,0x9a,0x3d,0x74,0x36,0x6c,0x1d,0x3e,0x20,0x3f,0x3c,0x6c,0x36,0x74,0x3d,0x20,0x3e,0x1d,0x6c,0x6d,0x7a,0x3d,0x74,0x36,0x6d,0x3a, -0xfe,0x5f,0x1d,0x58,0x38,0x6c,0x6c,0xa7,0x33,0x01,0xb2,0x38,0x58,0x1d,0xfe,0xfc,0x33,0xa6,0x6c,0x01,0xd3,0x38,0x58,0x1d,0x01,0x05,0x33,0xa7,0x6b,0x00,0x00,0x02,0x00,0x63,0x06,0x8f,0x01,0xa4,0x07,0xd0,0x00,0x0b,0x00,0x17,0x00,0x26,0x41,0x0c,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x00,0x05,0x00, -0x00,0x12,0x00,0x0c,0x05,0x00,0x00,0x06,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x05,0x41,0x5e,0x5e,0x41,0x45,0x5d,0x5d,0x45,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0x07,0xd0,0x5d, -0x45,0x41,0x5e,0x5e,0x41,0x45,0x5d,0xf6,0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0x02,0x00,0x63,0x06,0x7b,0x01,0xa4,0x08,0x1c,0x00,0x0b,0x00,0x19,0x00,0x24,0xbf,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x00,0x05,0x00,0xb2,0x12,0x0c,0x06,0xb8,0x01,0x4c,0x00,0x3f,0xdd,0xd6,0xed,0x01,0x2f,0xed, -0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x01,0x02,0x4b,0x57,0x53,0x4f,0x4c,0x53,0x54,0x4e,0x30,0x21,0x22,0x2f,0x30,0x24,0x08,0x14,0x20,0x08,0x1c,0x67,0x69,0x66,0x6b,0x69,0x67,0x6a,0x67,0xfe,0xaa,0x3b,0x49,0x4b,0x3c, -0x3b,0x4b,0x25,0x33,0x1f,0x0e,0x00,0x01,0x00,0x23,0x06,0x71,0x01,0xe3,0x07,0xb8,0x00,0x20,0x00,0x1d,0xb4,0x0b,0x12,0x1b,0x04,0x16,0xbc,0x04,0xfd,0x00,0x10,0x00,0x07,0x05,0x01,0x00,0x00,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xc4,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x36,0x37,0x35,0x2e,0x03,0x23, -0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x07,0x0e,0x03,0x5f,0x0d,0x15,0x0d,0x0d,0x0e,0x1c,0x0d,0x54,0x90,0x39,0x12,0x1f,0x22,0x29,0x1d,0x32,0x24,0x13,0x2e,0x18,0x2b,0x3c,0x36,0x3b,0x2a,0x12,0x15,0x43,0x5c,0x76,0x06,0x71,0x01,0x02,0x67,0x02,0x02,0x34,0x23,0x03,0x06,0x0e,0x0c,0x08,0x0d,0x5f,0x06,0x07,0x16,0x1a, -0x17,0x01,0x73,0x09,0x2e,0x30,0x25,0x00,0x00,0x02,0x00,0x16,0x06,0x1f,0x02,0x28,0x08,0x5e,0x00,0x20,0x00,0x30,0x00,0x40,0xb3,0x06,0x2c,0x03,0x10,0xb8,0x05,0x0d,0xb3,0x24,0x20,0x20,0x1d,0xb8,0x05,0x0d,0x40,0x0a,0x03,0x00,0x00,0x03,0x1a,0x06,0x2c,0x03,0x15,0x0b,0xbb,0x05,0x01,0x00,0x29,0x00,0x21,0x05,0x01,0xb1,0x15,0x20, -0x00,0x2f,0xd6,0xfd,0xd6,0xed,0x11,0x17,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x13,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e, -0x03,0x1e,0x04,0x04,0x31,0x2b,0x12,0x41,0x48,0x44,0x15,0x33,0x4a,0x2f,0x16,0x16,0x2a,0x3f,0x29,0x1a,0x35,0x31,0x2e,0x13,0x2b,0x24,0x04,0x05,0xfa,0x27,0x34,0x0d,0x1b,0x2b,0x1e,0x35,0x50,0x14,0x16,0x2c,0x2b,0x2b,0x06,0x1f,0x1a,0x31,0x14,0x44,0x61,0x17,0x65,0x74,0x3b,0x10,0x2c,0x44,0x4f,0x23,0x24,0x40,0x30,0x1d,0x0b,0x0c, -0x0b,0x3a,0x34,0x14,0x32,0x1a,0x01,0x12,0x1e,0x2b,0x13,0x2d,0x26,0x19,0x56,0x58,0x01,0x09,0x09,0x07,0x00,0x01,0xff,0x2b,0xfd,0xf5,0x02,0xae,0x00,0x05,0x00,0x43,0x00,0x66,0xb9,0x00,0x18,0x05,0x0d,0xb2,0x15,0x21,0x0b,0xb8,0x05,0x0d,0xb5,0x08,0x28,0x28,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x0a,0x40,0x15,0x08,0x40,0x40,0x08, -0x15,0x03,0x17,0x38,0xb8,0x05,0x0d,0xb4,0x32,0x17,0x38,0x32,0x2d,0xb8,0x04,0xfd,0xb4,0x3b,0x21,0x28,0x24,0x1d,0xb8,0x04,0xfd,0xb6,0x05,0x10,0x16,0x09,0x09,0x35,0x00,0x00,0x2f,0x32,0x32,0x11,0x33,0xd4,0x32,0xed,0x32,0x39,0x39,0xd4,0xed,0x2f,0x2f,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x32, -0x2f,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x17,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e, -0x02,0x35,0x34,0x26,0x27,0xe0,0x03,0x05,0x02,0x03,0x3f,0x1d,0x26,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x59,0x1b,0x2b,0x38,0x1d,0x29,0x3e,0x11,0x01,0x14,0x3a,0x1a,0x1a,0x21,0x0a,0x02,0x02,0x19,0x37,0x56,0x3e,0x3f,0x54,0x32,0x15,0x0d,0x56,0x05,0x05,0x3b,0x44,0x28,0x38,0x23,0x10,0x07,0x07,0x6e,0x1a,0x2c,0x17,0x34, -0x1e,0x2d,0x6d,0x50,0x1b,0x28,0x19,0x0c,0x06,0x11,0x1e,0x17,0xb8,0xd2,0x2d,0x3a,0x21,0x0c,0x17,0x1d,0x1e,0x16,0x0f,0x0e,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x33,0x3b,0x1b,0x29,0x16,0x41,0x35,0x12,0x28,0x41,0x2f,0x21,0x43,0x2f,0x00,0x01,0xff,0xc9,0x06,0x71,0x02,0x3c,0x07,0x26,0x00,0x1b,0x00,0x28,0x40,0x0a,0x00,0x0e, -0x0e,0x0d,0x0d,0x05,0x00,0x1b,0x1b,0x13,0xbc,0x05,0x01,0x00,0x0a,0x00,0x18,0x05,0x01,0x00,0x05,0x00,0x2f,0xed,0xdc,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x3c,0x18,0x2e,0x2a,0x26, -0x10,0x30,0x4b,0x45,0x46,0x29,0x20,0x2d,0x17,0x3a,0x18,0x2d,0x2a,0x26,0x11,0x30,0x4c,0x45,0x44,0x29,0x21,0x2d,0x17,0x06,0xbf,0x19,0x1f,0x10,0x06,0x19,0x1d,0x19,0x15,0x14,0x41,0x19,0x1f,0x10,0x06,0x19,0x1d,0x19,0x13,0x16,0x00,0x02,0x00,0x4d,0x06,0x1f,0x01,0xb8,0x08,0x29,0x00,0x22,0x00,0x32,0x00,0x39,0xb1,0x13,0x2d,0xb8, -0x05,0x0d,0xb4,0x0f,0x0f,0x33,0x23,0x1a,0xb8,0x05,0x0d,0xb2,0x08,0x03,0x14,0xb8,0x05,0x01,0xb2,0x28,0x08,0x30,0xbc,0x04,0xfd,0x00,0x0a,0x00,0x03,0x04,0xfd,0x00,0x1f,0x00,0x2f,0xfd,0xde,0xfd,0x39,0xde,0xed,0x01,0x2f,0x2f,0xed,0x33,0x11,0x33,0x2f,0xed,0x32,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22, -0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x4d,0x2c,0x45,0x21,0x29,0x32,0x1b,0x0a,0x01,0x21,0x28,0x1e,0x36,0x29,0x18,0x16,0x27,0x36,0x20,0x22,0x34,0x1a,0x1a,0x19,0x17,0x31,0x4f,0x38,0x26,0x49, -0x2d,0x01,0x13,0x0c,0x15,0x1b,0x0f,0x0b,0x16,0x11,0x0b,0x2f,0x1c,0x10,0x1f,0x06,0x9c,0x11,0x0c,0x14,0x1f,0x28,0x14,0x0c,0x12,0x23,0x35,0x23,0x1e,0x42,0x36,0x24,0x25,0x25,0x26,0x69,0x3b,0x30,0x59,0x44,0x29,0x0e,0x11,0x01,0x0d,0x0d,0x2b,0x28,0x1d,0x0e,0x16,0x1c,0x0d,0x1d,0x1f,0x04,0xff,0xff,0x00,0x21,0x06,0x70,0x03,0x36, -0x08,0x35,0x00,0x07,0x0a,0x1e,0x00,0x9f,0x00,0x00,0x00,0x01,0xff,0x82,0x06,0x70,0x02,0x97,0x08,0x35,0x00,0x23,0x00,0x1b,0xb9,0x00,0x08,0x05,0x0d,0xb4,0x1b,0x00,0x23,0x23,0x0b,0xb9,0x05,0x01,0x00,0x16,0x00,0x2f,0xed,0x32,0x2f,0x33,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02, -0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x36,0x36,0x37,0x01,0x02,0x20,0x38,0x33,0x31,0x19,0x2d,0x23,0x81,0x8b,0x38,0x77,0x72,0x66,0x27,0x34,0x7a,0x78,0x6c,0x27,0x63,0x86,0x51,0x22,0x13,0x23,0x2f,0x1b,0x2a,0x68,0x31,0x07,0xe3,0x1a,0x28,0x20,0x1b,0x0d,0x17,0x19,0x12,0x25,0x1b,0x04,0x06,0x08,0x05, -0x65,0x06,0x09,0x07,0x03,0x15,0x29,0x3a,0x25,0x1e,0x2e,0x27,0x21,0x11,0x19,0x40,0x2a,0x00,0x00,0x02,0x00,0x32,0x06,0x71,0x01,0xd4,0x08,0x8c,0x00,0x1e,0x00,0x22,0x00,0x31,0xbc,0x00,0x1f,0x05,0x0b,0x00,0x20,0x00,0x03,0x05,0x0d,0xb3,0x1b,0x11,0x11,0x13,0xb8,0x05,0x0d,0xb5,0x0d,0x22,0x1f,0x1e,0x11,0x16,0xb9,0x05,0x01,0x00, -0x08,0x00,0x2f,0xfd,0xc6,0xd6,0xd6,0xcd,0x01,0x2f,0xed,0x32,0x2f,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x01,0xc7,0x07,0x06,0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06, -0x05,0x58,0x09,0x31,0x3b,0x23,0x31,0x20,0x0e,0x07,0x06,0x31,0x73,0x73,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x35,0x2a,0x0f,0x22,0x37,0x27,0x1a,0x3d,0x26,0x38,0x71,0x00,0x00,0x04,0x00,0x64,0xff,0xe0,0x04,0x68,0x06,0xb4,0x00,0x17,0x00,0x2e,0x00,0x45,0x00,0x5b,0x00,0x14, -0xb7,0x3a,0x23,0x0b,0x52,0x45,0x18,0x17,0x46,0x00,0x2f,0xcd,0xde,0xcd,0x2f,0x33,0xce,0x32,0x30,0x31,0x01,0x26,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x07,0x11,0x21,0x37,0x11,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x06,0x06, -0x07,0x11,0x27,0x11,0x36,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x17,0x11,0x07,0x21,0x11,0x36,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x01,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x01,0x18,0x41,0x2b,0x23,0x25,0x13,0x24,0x33,0x21,0x01,0x77,0x01,0x75,0x40,0x4d,0x22, -0x23,0x15,0x37,0x23,0xfd,0x64,0xbe,0x34,0x40,0x14,0x16,0x16,0x2a,0x26,0xf4,0xf2,0x24,0x2e,0x17,0x15,0x17,0x44,0x2d,0x44,0x39,0x4c,0x11,0x0e,0x10,0x21,0x19,0xc6,0xc6,0x1c,0x1e,0x0f,0x0e,0x0e,0x4a,0x3f,0x9a,0x01,0xcc,0x33,0x3f,0x0e,0x1a,0x1a,0x3c,0x33,0xfe,0xd5,0xfe,0xd3,0x33,0x3a,0x1c,0x1a,0x1e,0x60,0x02,0xa2,0x29,0x42, -0x35,0x7c,0x42,0x32,0x56,0x4d,0x45,0x21,0x01,0x79,0xfe,0x8b,0x41,0x9f,0x60,0x41,0x7b,0x35,0x20,0x37,0x15,0xfd,0x3e,0xbe,0x02,0x6c,0x15,0x2f,0x19,0x1c,0x4e,0x2d,0x3c,0x5b,0x26,0xf5,0xf2,0x24,0x5e,0x40,0x2d,0x4c,0x1b,0x1d,0x2f,0x14,0xfd,0x96,0x44,0x02,0x52,0x1a,0x2d,0x16,0x12,0x37,0x22,0x30,0x45,0x19,0xc6,0xc8,0x1d,0x41, -0x2c,0x21,0x39,0x12,0x13,0x33,0x14,0xfd,0xaa,0x9a,0x02,0x95,0x1e,0x35,0x17,0x28,0x5e,0x32,0x49,0x7f,0x33,0x01,0x2b,0xfe,0xd2,0x34,0x76,0x4d,0x33,0x60,0x27,0x2e,0x3d,0x00,0x00,0x02,0x00,0x10,0xfd,0xda,0x01,0xf7,0xff,0xc1,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x14,0x00,0x07,0x07,0x05,0x05,0x06,0x01,0x04,0x03,0x02,0x02,0x01, -0x2f,0x03,0x01,0x03,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0x2f,0x5d,0x12,0x39,0x3d,0x2f,0x12,0x39,0x12,0x39,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x13,0x37,0x17,0x07,0x35,0x37,0x27,0x07,0x10,0xf4,0xf3,0xf4,0x8a,0x89,0x8a,0xfe,0xcd,0xf4,0xf4,0xf3,0x6a,0x89,0x89,0x89,0x00,0x02,0x00,0x10,0x06,0x35,0x01,0xf7,0x08,0x1c,0x00,0x03, -0x00,0x07,0x00,0x22,0x40,0x0e,0x00,0x07,0x07,0x05,0x05,0x06,0x01,0x04,0x03,0x02,0x02,0x01,0x03,0x01,0x00,0x2f,0x2f,0x12,0x39,0x3d,0x2f,0x12,0x39,0x12,0x39,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x13,0x37,0x17,0x07,0x35,0x37,0x27,0x07,0x10,0xf4,0xf3,0xf4,0x8a,0x89,0x8a,0x07,0x28,0xf4,0xf4,0xf3,0x6a,0x89,0x89,0x89,0x00,0x02, -0x00,0x16,0xfd,0xf5,0x02,0x28,0x00,0x34,0x00,0x20,0x00,0x30,0x00,0x40,0xb9,0x00,0x10,0x05,0x0d,0xb5,0x24,0x20,0x20,0x06,0x06,0x1d,0xb8,0x05,0x0d,0x40,0x09,0x03,0x00,0x00,0x03,0x1a,0x2c,0x0b,0x20,0x15,0xbb,0x04,0xfd,0x00,0x21,0x00,0x29,0x04,0xfd,0xb3,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xfd,0xd6,0xed,0x32,0x11,0x39,0x39, -0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x2f,0xed,0x31,0x30,0x13,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x13,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x1e,0x04,0x04,0x31,0x2b,0x12,0x41,0x48,0x44, -0x15,0x33,0x4a,0x2f,0x16,0x16,0x2a,0x3f,0x29,0x1a,0x35,0x31,0x2e,0x13,0x2b,0x24,0x04,0x05,0xfa,0x27,0x34,0x0d,0x1b,0x2b,0x1e,0x35,0x50,0x14,0x16,0x2c,0x2b,0x2b,0xfd,0xf5,0x1a,0x31,0x14,0x44,0x61,0x17,0x65,0x74,0x3b,0x10,0x2c,0x44,0x4f,0x23,0x24,0x40,0x30,0x1d,0x0b,0x0c,0x0b,0x3a,0x34,0x14,0x32,0x1a,0x01,0x12,0x1e,0x2b, -0x13,0x2d,0x26,0x19,0x56,0x58,0x01,0x09,0x09,0x07,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x53,0x05,0x46,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xa4, -0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x04,0xb2,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x27,0x0f,0x50,0x06,0x3c,0xfe,0xab,0x00,0x07,0x0f,0x50,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x07,0x4b,0x04,0xb2,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x27,0x0f,0x50,0x03,0x1e, -0x04,0x02,0x00,0x07,0x0f,0x50,0x03,0x90,0xfe,0xab,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0x8f,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0xe4,0x04,0xdf,0x00,0x07,0x0f,0x50,0x01,0x8f,0xff,0xb1,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x05,0x2a,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x56, -0x04,0x7a,0x00,0x07,0x0f,0x50,0x01,0x56,0xff,0x57,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x1d,0x04,0x34,0x00,0x07,0x0f,0x50,0x01,0x1d,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x56, -0x04,0x02,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x5a,0xfd,0xff,0x02,0xe5,0x02,0xb4,0x02,0x26,0x09,0x07,0x00,0x00,0x00,0x07,0x0f,0x5d,0x00,0xab,0x00,0x00,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x5d,0x01,0x99,0x00,0x00,0xff,0xff,0xff,0xc2,0xff,0xea, -0x03,0xf3,0x07,0x77,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x02,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xff,0xea,0x04,0xad,0x07,0x77,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x07, -0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x02,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x34,0xfd,0xfe,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff,0x00,0x34,0xfd,0xfe,0x04,0xad,0x05,0xec,0x00,0x27,0x0f,0x8d,0x02,0xac, -0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff,0x00,0x3a,0xff,0xea,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x3a,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00, -0x00,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xc5,0x08,0x0e,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x9d,0x00,0x32,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xc5,0x08,0x0e,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27, -0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x9d,0x00,0x32,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0xfa,0x07,0x67,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x9d,0x06,0xb7,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x07,0x67,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27, -0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x9d,0x06,0xb7,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x9b,0x08,0x7f,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x01,0x07,0x0f,0x53,0x02,0x9d,0x06,0xb7,0x00,0x0e,0xb6,0x04,0x03,0x02,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff, -0x00,0x52,0xff,0xea,0x04,0xad,0x08,0x7f,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x01,0x07,0x0f,0x53,0x02,0x9d,0x06,0xb7,0x00,0x0e,0xb6,0x04,0x03,0x02,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x9b,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27, -0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x9d,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x9d,0xfd,0xce,0x00,0x01,0x00,0x65,0x00,0x00,0x03,0xf8,0x05,0xa8,0x00,0x2b,0x00,0x40,0xb4,0x04,0x03,0x15, -0x2d,0x1d,0xb8,0x05,0x0a,0xb2,0x0e,0x0e,0x14,0xb8,0x05,0x0a,0xb6,0x15,0x27,0x22,0x04,0x04,0x14,0x09,0xb8,0x04,0xfb,0xb7,0x22,0x00,0x00,0x2f,0x22,0x01,0x22,0x14,0xb8,0x04,0xe6,0x00,0x3f,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x02,0x07, -0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x16,0x12,0x15,0x11,0x23,0x11,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x03,0xf8,0x48,0x6d,0x23,0x9a,0x11,0x38,0x4a,0x5b,0x33,0x1d,0x25,0x14,0x07,0x18,0x1e,0x18,0x9c,0x0d,0x12,0x17,0x12,0x0d,0x21,0x41,0x5f,0x3f,0x46,0x75,0x5c,0x3f, -0x0f,0x05,0x1a,0x43,0x26,0x05,0x9a,0x6f,0xfe,0xfe,0x95,0x4a,0x83,0x62,0x39,0x11,0x1b,0x23,0x11,0x1d,0x72,0xbe,0xfe,0xec,0xc0,0xfe,0x85,0x01,0x73,0x88,0xd5,0xa4,0x7a,0x5c,0x44,0x1c,0x39,0x5d,0x43,0x25,0x3c,0x5d,0x6e,0x33,0x56,0x94,0x42,0x00,0x00,0x01,0x00,0x52,0x00,0x00,0x03,0x81,0x05,0x9a,0x00,0x12,0x00,0x20,0xb9,0x00, -0x08,0x05,0x0a,0xb2,0x07,0x00,0x0f,0xba,0x04,0xfb,0x00,0x11,0x04,0xe6,0xb3,0x2f,0x08,0x01,0x08,0x00,0x2f,0x5d,0x3f,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x37,0x3e,0x04,0x12,0x37,0x33,0x06,0x02,0x0e,0x03,0x07,0x21,0x15,0x21,0x52,0x31,0x53,0x45,0x36,0x27,0x19,0x05,0x9c,0x07,0x19,0x23,0x2d,0x37,0x41,0x25,0x02,0x5c,0xfc,0xd1, -0x42,0x5c,0xb1,0xba,0xcd,0xf3,0x01,0x20,0xb1,0xb4,0xfe,0xe2,0xe8,0xba,0xa2,0x92,0x4b,0xa7,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xcb,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xcb,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90, -0x06,0x03,0x00,0x01,0x00,0x00,0x01,0x87,0x02,0xfe,0x01,0xd9,0x00,0x03,0x00,0x10,0xb9,0x00,0x00,0x04,0xfd,0xb3,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0xfe,0xfd,0x02,0x02,0xfe,0x01,0x87,0x52,0x00,0xff,0xff,0xff,0x97,0xff,0xea,0x03,0xf3,0x07,0x77,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00, -0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x8f,0xff,0xff,0xff,0x97,0xff,0xea,0x04,0xad,0x07,0x77,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x8f,0x00,0x10,0x00,0x66,0x00,0x5a,0x04,0x5b,0x04,0x4e,0x00,0x07,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x2f, -0x00,0x37,0x00,0x3f,0x00,0x47,0x00,0x4f,0x00,0x57,0x00,0x5f,0x00,0x67,0x00,0x6f,0x00,0x77,0x00,0x7f,0x01,0x23,0xb9,0x00,0x18,0x05,0x0b,0xb2,0x1c,0x30,0x10,0xb8,0x05,0x0b,0xb4,0x34,0x14,0x14,0x40,0x00,0xb8,0x05,0x0b,0xb4,0x04,0x44,0x04,0x48,0x08,0xb8,0x05,0x0b,0xb4,0x0c,0x4c,0x0c,0x60,0x20,0xb8,0x05,0x0b,0xb4,0x24,0x64, -0x24,0x70,0x28,0xb8,0x05,0x0b,0xb4,0x2c,0x74,0x2c,0x78,0x38,0xb8,0x05,0x0b,0xb4,0x3c,0x7c,0x3c,0x68,0x50,0xb8,0x05,0x0b,0x40,0x14,0x54,0x6c,0x54,0x1c,0x04,0x0c,0x24,0x2c,0x3c,0x54,0x54,0x3c,0x2c,0x24,0x0c,0x04,0x1c,0x07,0x81,0x58,0xb8,0x05,0x0b,0xb2,0x5c,0x2a,0x0a,0xb8,0x04,0xfd,0xb4,0x0e,0x2e,0x0e,0x3a,0x02,0xb8,0x04, -0xfd,0xb4,0x06,0x3e,0x06,0x52,0x12,0xb8,0x04,0xfd,0xb4,0x16,0x56,0x16,0x5a,0x1a,0xb8,0x04,0xfd,0xb4,0x1e,0x5e,0x1e,0x6a,0x32,0xb8,0x04,0xfd,0xb4,0x36,0x6e,0x36,0x7a,0x42,0xb8,0x04,0xfd,0xb4,0x46,0x7e,0x46,0x72,0x4a,0xb8,0x04,0xfd,0x40,0x14,0x4e,0x76,0x4e,0x0e,0x06,0x16,0x1e,0x36,0x46,0x4e,0x4e,0x46,0x36,0x1e,0x16,0x06, -0x0e,0x07,0x26,0x62,0xbb,0x04,0xfd,0x00,0x66,0x00,0x22,0x04,0xfd,0xb3,0x3f,0x26,0x01,0x26,0x00,0x2f,0x5d,0xed,0x2f,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32, -0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x32,0x2f,0x33,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x14,0x23,0x22,0x35,0x34,0x33, -0x32,0x27,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x13,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x07,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33, -0x32,0x07,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x07,0x16,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x25,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x13,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x27,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x03,0xd4,0x30,0x34,0x34,0x30,0x94, -0x30,0x34,0x34,0x30,0xf7,0x33,0x31,0x33,0x31,0x24,0x30,0x34,0x34,0x30,0xfe,0x37,0x32,0x32,0x32,0x32,0xad,0x33,0x31,0x31,0x33,0x02,0x52,0x33,0x31,0x31,0x33,0xfd,0x1a,0x32,0x32,0x32,0x32,0x02,0x83,0x30,0x34,0x34,0x30,0x94,0x30,0x34,0x34,0x30,0xfd,0xae,0x30,0x34,0x32,0x32,0x24,0x01,0x31,0x34,0x34,0x31,0x01,0xc7,0x32,0x32, -0x32,0x32,0xfe,0x5c,0x32,0x32,0x32,0x32,0xf7,0x33,0x31,0x31,0x33,0x94,0x32,0x32,0x32,0x32,0x03,0x96,0x32,0x32,0x32,0x30,0x31,0x31,0x33,0xfe,0xd7,0x33,0x33,0x31,0xdf,0x32,0x32,0x32,0x01,0x97,0x33,0x33,0x31,0x56,0x31,0x31,0x33,0xfd,0x7b,0x31,0x31,0x33,0x01,0xbd,0x32,0x2f,0x35,0xfd,0x48,0x31,0x31,0x33,0x95,0x30,0x30,0x34, -0x02,0x20,0x33,0x33,0x31,0xdf,0x32,0x32,0x32,0xfe,0x07,0x33,0x33,0x31,0xe8,0x31,0x31,0x33,0xfe,0xd9,0x34,0x30,0x34,0x2e,0x31,0x31,0x33,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x09,0x63,0x01,0xef,0x00,0x0f,0x00,0x10,0xb2,0x0e,0x0b,0x07,0xb9,0x04,0xfb,0x00,0x00,0x00,0x2f,0xfd,0xcd,0x33,0x30,0x31,0x05,0x21,0x22,0x26,0x27,0x27, -0x37,0x21,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x33,0x09,0x63,0xf8,0x84,0x55,0xb2,0x51,0x1c,0x05,0x07,0x66,0x20,0x23,0x9d,0x25,0x1e,0xe8,0x0e,0x0e,0x0f,0x85,0x05,0x5a,0xa8,0x54,0x5a,0xa3,0x59,0x00,0x01,0x00,0x73,0xff,0xf1,0x08,0x39,0x01,0x60,0x00,0x4d,0x00,0x22,0xb1,0x2e,0x3d,0xb8,0x04,0xfb,0xb5,0x1d,0x00,0x10,0x18,0x06, -0x22,0xb8,0x04,0xfb,0xb2,0x45,0x33,0x29,0x00,0x2f,0x33,0x33,0xfd,0x32,0x32,0xdc,0x32,0x32,0xed,0x32,0x30,0x31,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x1e,0x03,0x33,0x21,0x17,0x07,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23, -0x22,0x2e,0x02,0x27,0x2e,0x03,0x23,0x22,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x24,0x0a,0x0b,0x23,0x1b,0x16,0x2a,0x28,0x25,0x11,0x14,0x2e,0x34,0x3c,0x21,0x20,0x31,0x27,0x1f,0x0e,0x1e,0x30,0x22,0x12,0x29,0x2e,0x32,0x1a,0x36,0x74,0x87,0x9f,0x62,0x01,0x7a,0x05,0x1c,0x51,0xb2,0x55,0x35,0x60,0x8d, -0x71,0x60,0x33,0x20,0x3c,0x38,0x33,0x18,0x21,0x33,0x29,0x20,0x0f,0x12,0x1c,0x1a,0x1b,0x12,0x1d,0x34,0x1d,0x16,0x32,0x3d,0x4c,0x30,0x33,0x48,0x2d,0x15,0x13,0x0f,0x01,0x48,0x1e,0x3b,0x16,0x26,0x20,0x10,0x1b,0x21,0x11,0x13,0x28,0x20,0x15,0x15,0x20,0x29,0x13,0x2a,0x32,0x10,0x26,0x3e,0x2f,0x1d,0x39,0x2c,0x1b,0x05,0x85,0x0f, -0x0e,0x17,0x25,0x31,0x1b,0x2a,0x35,0x1d,0x0b,0x0f,0x1a,0x22,0x13,0x17,0x25,0x19,0x0e,0x28,0x1c,0x15,0x2d,0x25,0x18,0x1b,0x30,0x43,0x28,0x2a,0x52,0x25,0x00,0x02,0x00,0x49,0xff,0xf2,0x05,0xd0,0x02,0x6c,0x00,0x1c,0x00,0x2e,0x00,0x16,0xb9,0x00,0x15,0x04,0xfb,0xb2,0x22,0x2c,0x1c,0xb9,0x04,0xfb,0x00,0x0b,0x00,0x2f,0xfd,0x32, -0xdc,0xed,0x30,0x31,0x25,0x17,0x07,0x06,0x06,0x23,0x23,0x2a,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x17,0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x05,0xcc,0x04,0x1c,0x51,0xb2,0x55,0x36,0x1c,0x5e,0x7b,0x95,0x52,0x82,0xc1,0x7f,0x3f,0x32,0x5a,0x7c,0x4a,0x3e,0x68,0x55, -0x43,0x33,0x23,0x0b,0x9f,0x0b,0x2b,0x3f,0x53,0x34,0x20,0x43,0x38,0x24,0x20,0x42,0x66,0x47,0x30,0x52,0x99,0x06,0x84,0x0f,0x0e,0x05,0x2a,0x59,0x53,0x55,0x97,0x71,0x42,0x2d,0x4a,0x60,0x68,0x68,0x2c,0x36,0x6a,0x55,0x35,0x17,0x31,0x4c,0x35,0x24,0x28,0x13,0x03,0x01,0x00,0x02,0x00,0x73,0xff,0xed,0x0b,0xbf,0x02,0x6c,0x00,0x32, -0x00,0x46,0x00,0x1c,0xb9,0x00,0x18,0x04,0xfb,0xb4,0x3d,0x42,0x11,0x09,0x00,0xb8,0x04,0xfb,0xb1,0x22,0x2c,0x00,0x2f,0x33,0xfd,0xcc,0x33,0x33,0xdc,0xed,0x30,0x31,0x25,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x26,0x27, -0x23,0x06,0x06,0x23,0x21,0x22,0x26,0x27,0x27,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x07,0xab,0x2d,0x23,0x02,0x04,0x07,0x04,0x8a,0x0b,0x0e,0x04,0x03,0x0a,0x13,0x20,0x19,0x0f,0x2d,0x3d,0x4c,0x5b,0x6b,0x3d,0x45,0x65,0x43,0x20,0x36,0x78,0xc0,0x8a,0x7c,0xa4,0x24,0x11,0x21, -0x0b,0x02,0x1e,0x53,0x2d,0xfa,0x41,0x55,0xb2,0x51,0x1c,0x05,0x09,0xab,0x4e,0x65,0x3c,0x17,0x18,0x29,0x37,0x1f,0x35,0x59,0x46,0x33,0x0f,0x0d,0x30,0x32,0x2d,0x99,0x2f,0x2d,0x0a,0x1d,0x21,0x22,0x0f,0x2a,0x4e,0x14,0x0d,0x18,0x13,0x0d,0x02,0x2c,0x68,0x67,0x60,0x4a,0x2c,0x3a,0x64,0x87,0x4d,0x63,0x6d,0x33,0x0a,0x05,0x0e,0x06, -0x22,0x13,0x2a,0x1f,0x0e,0x0f,0x85,0x05,0x03,0x04,0x16,0x2f,0x2c,0x31,0x45,0x2d,0x15,0x36,0x55,0x6b,0x36,0x01,0x00,0x02,0x00,0x49,0xff,0xf0,0x08,0x3d,0x02,0x6c,0x00,0x1e,0x00,0x30,0x00,0x36,0xb4,0x1e,0x1f,0x1f,0x32,0x29,0xbb,0x05,0x0a,0x00,0x12,0x00,0x24,0x04,0xfb,0x40,0x0b,0x2f,0x17,0x01,0x17,0x2e,0x2e,0x1f,0x1f,0x1e, -0x1e,0x00,0xb9,0x04,0xfb,0x00,0x07,0x00,0x2f,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x10,0xcd,0x30,0x31,0x25,0x32,0x36,0x37,0x07,0x06,0x06,0x23,0x21,0x22,0x06,0x22,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x17,0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e, -0x02,0x33,0x32,0x36,0x06,0xfe,0x51,0x9c,0x52,0x21,0x23,0x80,0x55,0xfd,0x63,0x5c,0x8c,0x80,0x82,0x53,0x82,0xc1,0x7f,0x3f,0x32,0x5a,0x7c,0x4a,0x3e,0x68,0x55,0x43,0x33,0x23,0x0b,0x9f,0x0b,0x2a,0x40,0x54,0x33,0x20,0x43,0x38,0x24,0x20,0x42,0x66,0x47,0x30,0x53,0x99,0x08,0x0a,0xa9,0x05,0x0b,0x01,0x01,0x07,0x2a,0x5a,0x52,0x55, -0x97,0x71,0x42,0x2d,0x4a,0x60,0x68,0x68,0x2c,0x36,0x6a,0x55,0x35,0x17,0x31,0x4c,0x35,0x24,0x28,0x13,0x03,0x01,0x00,0x01,0x00,0x46,0xfe,0xaa,0x02,0x1e,0x02,0x01,0x00,0x09,0x00,0x18,0x40,0x0a,0x00,0x06,0x06,0x0b,0x0a,0x09,0x2f,0x05,0x01,0x05,0x00,0x2f,0x5d,0xcd,0x11,0x12,0x01,0x39,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x07, -0x23,0x36,0x12,0x37,0x02,0x1e,0x2c,0x5a,0x56,0x51,0x23,0x88,0x46,0x9f,0x4f,0x02,0x01,0x5a,0xce,0xdb,0xe4,0x70,0xfb,0x01,0xb4,0xa8,0x00,0x02,0x00,0x32,0xfd,0xfe,0x04,0x2e,0x04,0x0c,0x00,0x45,0x00,0x58,0x00,0x6d,0xb2,0x45,0x26,0x13,0xb8,0x05,0x0a,0xb4,0x4b,0x4b,0x5a,0x2e,0x26,0xb8,0x05,0x0a,0xb3,0x09,0x05,0x05,0x3f,0xb8, -0x05,0x0a,0xb7,0x2e,0x1b,0x23,0x55,0x09,0x04,0x18,0x0e,0xbc,0x04,0xfc,0x00,0x50,0x04,0xe6,0x00,0x00,0x04,0xfb,0xb5,0x42,0x2b,0x45,0x45,0x18,0x3a,0xb8,0x04,0xfb,0xb2,0x33,0x20,0x46,0xb8,0x04,0xfc,0x40,0x09,0x18,0x1f,0x1f,0x1f,0x18,0x2f,0x18,0x02,0x18,0x00,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x12,0x39,0x2f,0x39, -0x39,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x39,0x2f,0x39,0xed,0x11,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x16,0x17,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34, -0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x37,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x15,0x16,0x16,0x03,0x5c,0xad,0xe9,0x8c,0x3b,0x08,0x07,0x05,0x3a,0x76,0x78,0x78,0x3d,0x4f,0x77,0x50,0x28,0x40,0x78,0xae,0x6e,0x6f,0xad,0x3f,0x03,0x10,0x1e, -0x10,0x8c,0x1d,0x3b,0x1d,0x21,0x21,0x14,0x32,0x52,0x3f,0x4c,0x45,0x3d,0x72,0xa6,0x69,0x23,0x4f,0x2a,0x27,0x55,0x2b,0x36,0x65,0x4d,0x2f,0x37,0x33,0x51,0xd0,0x8a,0xfb,0x4b,0x72,0x4e,0x27,0x14,0x2c,0x45,0x30,0x2a,0x5c,0x62,0x6a,0x37,0x2d,0x86,0x01,0x9f,0x2e,0x68,0x73,0x7c,0x42,0x1d,0x33,0x1a,0x51,0x70,0x46,0x1f,0x2e,0x4f, -0x68,0x39,0x49,0x87,0x69,0x3f,0x40,0x36,0x01,0x1b,0x39,0x20,0x3d,0x6b,0x30,0x36,0x78,0x40,0x2e,0x65,0x66,0x65,0x30,0x45,0xa3,0x4f,0x4c,0x8c,0x6a,0x40,0x08,0x09,0xaa,0x08,0x0b,0x15,0x34,0x57,0x43,0x48,0x71,0x28,0x2d,0x52,0x24,0xfc,0x55,0x26,0x3d,0x4d,0x26,0x1b,0x33,0x28,0x18,0x17,0x39,0x63,0x4c,0x02,0x2d,0x36,0x00,0x02, -0xff,0xc9,0x06,0x37,0x02,0x29,0x07,0xeb,0x00,0x24,0x00,0x36,0x00,0x2e,0xbc,0x00,0x11,0x05,0x0d,0x00,0x2a,0x00,0x0c,0x05,0x01,0x40,0x09,0x2d,0x25,0x32,0x32,0x25,0x07,0x07,0x01,0x25,0xb8,0x05,0x01,0xb1,0x1f,0x16,0x00,0x2f,0xc6,0xfd,0xc4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd6,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x33,0x16,0x16, -0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x16,0x32,0x32,0x17,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13,0x20,0x46,0x71, -0x51,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x01,0x44,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c,0x1d,0x1b,0x07,0x56,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x04,0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x58,0x02, -0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x01,0xff,0xe9,0x06,0x37,0x01,0xee,0x07,0xeb,0x00,0x2e,0x00,0x4a,0xb1,0x24,0x06,0xb8,0x05,0x0d,0xb4,0x00,0x27,0x27,0x09,0x1e,0xb8,0x05,0x0d,0x40,0x0b,0x18,0x1a,0x1a,0x18,0x09,0x24,0x09,0x0a,0x2e,0x2e,0x2c,0xb8,0x05,0x01,0xb5,0x03,0x09,0x23,0x23,0x1b,0x09,0xb8,0x05, -0x01,0xb1,0x14,0x0a,0x00,0x2f,0xc6,0xfd,0xc4,0x33,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x11,0x12,0x39,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x39,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x17, -0x1e,0x03,0x33,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0xbe,0x0e,0x1d,0x11,0x2e,0x40,0x92,0x48,0xcd,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x0a,0x51,0x06,0x09,0x02,0x02,0x08,0x12,0x20,0x1b,0x1d,0x12,0x17,0x1d,0x34,0x49,0x2c,0x20,0x22,0x07,0x7e,0x03,0x04,0x26,0x2c,0x5b,0x64,0x01,0x04, -0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x27,0x18,0x2f,0x0b,0x0a,0x11,0x0c,0x06,0x1b,0x3b,0x1e,0x23,0x3b,0x2b,0x17,0x06,0x00,0x02,0x00,0x03,0x06,0x1f,0x02,0x20,0x08,0x00,0x00,0x1d,0x00,0x36,0x00,0x2c,0xbf,0x00,0x2e,0x05,0x0d,0x00,0x25,0x00,0x11,0x04,0xfd,0x00,0x18,0x00,0x20,0x04,0xfd,0x40,0x0a,0x33,0x1e,0x00, -0x0c,0x14,0x1d,0x05,0x05,0x28,0x05,0x00,0x2f,0x2f,0x12,0x17,0x39,0x2f,0xfd,0xd4,0xed,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x23,0x3e,0x03,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x03,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22, -0x26,0x27,0x01,0x4a,0x49,0x5a,0x34,0x18,0x07,0x51,0x06,0x17,0x32,0x57,0x47,0x14,0x1c,0x1e,0x25,0x1c,0x18,0x2d,0x11,0x14,0x2e,0x17,0x2b,0x39,0x32,0x37,0x2b,0x65,0x38,0x26,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x0c,0x11,0x0c,0x06,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0x07,0x2f,0x12,0x29,0x2f,0x36,0x1e,0x1e,0x40,0x3f,0x3a,0x18, -0x03,0x07,0x0e,0x0c,0x07,0x06,0x07,0x5f,0x06,0x07,0x15,0x1b,0x17,0x01,0xfe,0xee,0x11,0x17,0x29,0x37,0x21,0x3e,0x75,0x36,0x1d,0x3d,0x3e,0x3a,0x19,0x3c,0x5c,0x3e,0x20,0x09,0x0a,0x00,0x00,0x04,0xff,0x88,0x06,0x1f,0x02,0xb1,0x08,0xbb,0x00,0x24,0x00,0x36,0x00,0x4d,0x00,0x51,0x00,0x52,0xb2,0x41,0x45,0x4e,0xbb,0x05,0x0d,0x00, -0x4f,0x00,0x45,0x05,0x0d,0xb2,0x3e,0x37,0x11,0xb8,0x05,0x0d,0xb3,0x2a,0x51,0x4e,0x0c,0xb8,0x05,0x01,0x40,0x09,0x2d,0x25,0x32,0x32,0x25,0x07,0x07,0x01,0x25,0xb8,0x05,0x01,0xb3,0x1f,0x16,0x41,0x39,0xb9,0x04,0xfd,0x00,0x4a,0x00,0x2f,0xfd,0xce,0xd4,0xce,0xfd,0xc4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd6,0xfd,0xd6,0xcd,0x01,0x2f, -0xed,0x39,0x2f,0xed,0x2f,0xed,0x12,0x39,0x31,0x30,0x03,0x33,0x16,0x16,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x16,0x32,0x32,0x17,0x16,0x33,0x32,0x3e,0x02, -0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0x23,0x35,0x33,0x58,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0c,0x2d,0x40,0x53,0x33,0x27,0x38,0x26,0x12,0x1e,0x42,0x69,0x4b,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x01,0x3c,0x2a,0x37,0x20,0x0d,0x30,0x22,0x1d,0x2f,0x26,0x1c, -0x08,0x07,0x1a,0x1b,0x18,0xa0,0x36,0x28,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x17,0x18,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0x98,0x57,0x57,0x07,0x92,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x04,0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x58,0x02,0x0e,0x1b,0x1a, -0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x83,0x11,0x17,0x28,0x38,0x20,0x3f,0x74,0x37,0x39,0x7f,0x34,0x3c,0x5b,0x3e,0x20,0x09,0x0a,0x02,0x33,0x56,0x00,0x01,0xff,0xc4,0x06,0x71,0x02,0x22,0x07,0xb0,0x00,0x2a,0x00,0x31,0xb9,0x00,0x01,0x05,0x0d,0xb2,0x29,0x0c,0x1e,0xb8,0x05,0x0d,0xb5,0x1d,0x1e,0x18,0x15,0x15,0x24,0xb8,0x05,0x01, -0xb5,0x06,0x14,0x14,0x11,0x06,0x00,0x00,0x2f,0x2f,0x33,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x02, -0x22,0x1b,0x2b,0x38,0x1d,0x26,0x33,0x20,0x10,0x03,0x04,0x0b,0x22,0x35,0x4d,0x34,0x10,0x21,0x13,0x0c,0x17,0x2a,0x13,0x3f,0x4f,0x2d,0x10,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x07,0xb0,0xa7,0x2d,0x3b,0x23,0x0d,0x11,0x1f,0x2b,0x1a,0x19,0x2b,0x1f,0x12,0x02,0x02,0x66,0x02,0x02,0x15,0x29,0x3a,0x25,0x35,0x1b,0x28,0x19, -0x0c,0x06,0x11,0x1e,0x17,0x8d,0x00,0x01,0x00,0xc4,0xfd,0xf6,0x01,0x42,0xff,0x7e,0x00,0x03,0x00,0x15,0xbd,0x00,0x00,0x05,0x0b,0x00,0x01,0x00,0x00,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x42,0x7e,0x7e,0xfd,0xf6,0x01,0x88,0x00,0x00,0x02,0xff,0xbf,0x06,0x73,0x01,0xca,0x08,0x2c, -0x00,0x23,0x00,0x2f,0x00,0x35,0xb2,0x03,0x10,0x06,0xb8,0x05,0x0d,0xb5,0x24,0x00,0x00,0x24,0x14,0x2a,0xb8,0x05,0x0d,0xb3,0x10,0x03,0x23,0x1e,0xbc,0x04,0xfd,0x00,0x17,0x00,0x2d,0x04,0xfd,0x00,0x0b,0x00,0x2f,0xfd,0xd4,0xed,0x32,0x39,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x06,0x06,0x07,0x16, -0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x27,0x26,0x22,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x13,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x71,0x09,0x14,0x0b,0x39,0x48,0x1d,0x31,0x3e,0x21,0x26,0x3e,0x2c,0x18,0x17,0x1a,0x01,0x06,0x07,0x01,0x38,0x5c, -0x32,0x12,0x30,0x66,0x3c,0x14,0x30,0x17,0x23,0x2d,0x39,0x3c,0x34,0x1d,0x1c,0x29,0x29,0x21,0x36,0x07,0xef,0x08,0x10,0x0b,0x1a,0x59,0x42,0x2a,0x3d,0x29,0x14,0x19,0x2b,0x3b,0x21,0x20,0x46,0x21,0x02,0x01,0x0f,0x0d,0x53,0x0e,0x0e,0x03,0x05,0x22,0x22,0xfe,0xec,0x2a,0x3a,0x10,0x1a,0x3d,0x1c,0x21,0x2d,0x23,0x00,0x01,0x00,0x32, -0x06,0x71,0x01,0xd4,0x07,0xe3,0x00,0x1c,0x00,0x29,0xb2,0x11,0x11,0x13,0xb8,0x05,0x0d,0xb3,0x0d,0x0d,0x1d,0x03,0xb8,0x05,0x0d,0xb3,0x19,0x1c,0x11,0x16,0xb9,0x05,0x01,0x00,0x08,0x00,0x2f,0xfd,0xc6,0xc6,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34, -0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0xc7,0x07,0x06,0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06,0x05,0x58,0x09,0x30,0x3c,0x46,0x3c,0x07,0x06,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x36,0x29,0x40,0x4f,0x1a,0x3d,0x26,0x00,0xff,0xff, -0xff,0xc6,0x06,0x7c,0x02,0x2c,0x08,0xde,0x01,0x07,0x0f,0x57,0x00,0x00,0x06,0x7c,0x00,0x15,0x40,0x0c,0x01,0x00,0x20,0x00,0x01,0x20,0x00,0x01,0x20,0x00,0x01,0x00,0x00,0x11,0x5d,0x5d,0x5d,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x05,0x02,0x26,0x09,0x15,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xfe,0x29, -0x00,0x0a,0xb4,0x01,0x2f,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x05,0x02,0x26,0x0e,0x2f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x1d,0xfe,0x29,0x00,0x0a,0xb4,0x01,0x2f,0x2b,0x01,0x2b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc2,0x04,0xaf,0x02,0x26,0x09,0x17,0x00,0x00, -0x00,0x07,0x0a,0x6e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xaf,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x53,0xff,0xf2,0x05,0x32,0x06,0x40,0x02,0x26,0x0e,0x5c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0x01,0xfe,0x64,0xff,0xff,0x00,0x67,0xfd,0xff,0x05,0x58, -0x05,0xaa,0x02,0x26,0x08,0xf2,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x73,0xfd,0xce,0x00,0x0a,0xb4,0x03,0x2f,0x56,0x01,0x56,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x87,0x06,0x40,0x02,0x26,0x0e,0x5b,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x56,0xfe,0x64,0x00,0x0a,0xb4,0x03,0x2f,0x57,0x01,0x57,0x00,0x11,0x5d,0x35, -0xff,0xff,0xff,0xba,0xfd,0xff,0x04,0x02,0x05,0xaa,0x02,0x26,0x0e,0x5d,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x1d,0xfd,0xce,0x00,0x0a,0xb4,0x03,0x2f,0x4d,0x01,0x4d,0x00,0x11,0x5d,0x35,0x00,0x06,0xfe,0x93,0xfe,0x64,0x01,0x6d,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x1f,0x00,0x29,0x00,0x32,0x00,0x57,0xbc,0x00,0x20,0x05, -0x0a,0x00,0x25,0x00,0x2f,0x05,0x0a,0xb2,0x2a,0x2a,0x16,0xbb,0x05,0x0a,0x00,0x1a,0x00,0x12,0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x31,0x10,0xb8,0x04,0xfc,0xb5,0x2c,0x12,0x0b,0x23,0x18,0x02,0xb8,0x04,0xfc,0xb6,0x27,0x1d,0x14,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0x33,0x33,0x33,0xed,0x32,0x32,0xd4,0x32, -0x32,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0xed,0x39,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x14,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x16,0x17,0x14,0x23, -0x22,0x26,0x35,0x34,0x33,0x32,0x01,0x6d,0x41,0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xbb,0x43,0x44,0x28,0x1c,0x1c,0x27,0xb6,0x28,0x1b,0x42,0x42,0x1c,0x27,0x5a,0x41,0x1c,0x28,0x44,0x41,0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x44,0x41,0x41,0x1c,0x28,0x28,0x1c,0x1b,0x26,0x41, -0x44,0x28,0xd4,0x44,0x28,0x1c,0x41,0x00,0x00,0x04,0xfe,0xa9,0xfe,0x64,0x01,0x54,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x19,0x00,0x47,0xbc,0x00,0x16,0x05,0x0c,0x00,0x17,0x00,0x12,0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x12,0x0b,0xbb,0x04,0xfc,0x00,0x10,0x00,0x02,0x04,0xfc,0xb4,0x07,0x15,0x07, -0x07,0x16,0xb8,0x04,0xfd,0xb4,0x14,0x2f,0x19,0x01,0x19,0x00,0x2f,0x5d,0x33,0xed,0x33,0x11,0x33,0x10,0xfd,0xd6,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x21,0x35,0x21,0x01,0x54,0x41, -0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xbb,0xfe,0xf4,0x01,0x0c,0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x52,0x52,0x00,0x04,0xfe,0x91,0xfe,0x64,0x01,0x71,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x1d,0x00,0x59,0xb9,0x00,0x18,0x05,0x0d,0xb4,0x19,0x19,0x1e,0x1b,0x12,0xb8, -0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x1a,0x16,0xb8,0x04,0xfd,0xb2,0x1d,0x15,0x02,0xb8,0x04,0xfc,0xb2,0x07,0x07,0x18,0xb8,0x04,0xfe,0xb6,0x14,0x2f,0x1d,0x01,0x1d,0x12,0x0b,0xb8,0x04,0xfc,0xb3,0x2f,0x10,0x01,0x10,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x5d,0x33,0xe4,0x33,0x10,0xed,0x33,0x10,0xed,0x32,0x01, -0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x01,0x71,0x41,0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xba,0x73,0x5c,0x73,0x01,0x42, -0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x54,0x85,0x85,0x54,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x08,0x0e,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0x00,0x32,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x07,0x67,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c, -0x06,0xb7,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x08,0x7f,0x02,0x26,0x09,0x3f,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x9c,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x2a,0x01,0x2a,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x05,0xec,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x4a, -0xfd,0xce,0xff,0xff,0x00,0xa1,0xff,0xf2,0x09,0x4b,0x08,0x36,0x00,0x26,0x09,0x71,0x00,0x00,0x00,0x07,0x09,0x0d,0x08,0x04,0x00,0x00,0x00,0x05,0x00,0x9b,0xfd,0xff,0x0b,0x15,0x05,0xec,0x00,0x1d,0x00,0x37,0x00,0x52,0x00,0x56,0x00,0x5a,0x00,0xb2,0xb2,0x44,0x1a,0x4a,0xb8,0x05,0x0a,0xb2,0x3f,0x38,0x24,0xba,0x05,0x0a,0x00,0x58, -0x05,0x0a,0xb6,0x21,0x57,0x57,0x21,0x54,0x54,0x53,0x41,0x09,0x05,0x0a,0x00,0x33,0x05,0x0a,0x00,0x30,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x03,0x05,0x0a,0x40,0x17,0x1a,0x3f,0x21,0x30,0x0d,0x1a,0x1a,0x0d,0x30,0x21,0x3f,0x05,0x5c,0x5b,0x5a,0x5a,0x08,0x55,0x55,0x08,0x08,0x59,0x56,0xb8,0x04,0xfb,0x40,0x0b,0x58,0x53,0x53,0x54, -0x54,0x15,0x15,0x57,0x57,0x38,0x3a,0xb8,0x04,0xfb,0x40,0x0b,0x52,0x1f,0x4f,0x2f,0x4f,0x02,0x4f,0x44,0x33,0x32,0x1e,0xba,0x04,0xfb,0x00,0x29,0x05,0x03,0xb2,0x23,0x0e,0x00,0x00,0x2f,0x2f,0x2f,0x3f,0xed,0x2f,0x2f,0x2f,0x2f,0x5d,0x33,0xed,0x32,0x32,0x2f,0x32,0x2f,0x33,0x2f,0x32,0x2f,0x33,0xed,0x32,0x32,0x2f,0x33,0x2f,0x11, -0x33,0x2f,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0xe4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xe4,0xed,0x39,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x32,0x36,0x35, -0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x4e,0x0b,0x0b,0x24,0x4e,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x38,0x81,0xd4,0x9d, -0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x06,0x96,0x5d,0x5b,0x9c,0x37,0x5f,0x7e,0x47,0x44,0x65,0x48,0x2d,0x1a,0x0a,0x9c,0x09,0x23,0x45,0x01,0x67,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1a,0x28,0x1c,0x0f,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0xfe,0x48,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84, -0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0x28,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0xfe,0xeb,0x68,0x70,0x01,0xa6,0xfe,0x53,0x6b,0x90,0x58,0x25,0x21,0x39,0x4c,0x57,0x5e,0x2e,0x04,0x79,0xfb,0xc2,0x40,0x69,0x4b,0x29,0xfe,0x40,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x41,0x8e,0x8f,0x8b,0x3e, -0x8a,0xd4,0x90,0x4a,0x16,0x17,0x79,0xb5,0xb5,0xb5,0x00,0x02,0xff,0xd4,0x05,0x20,0x02,0x33,0x06,0xf2,0x00,0x2f,0x00,0x33,0x00,0x62,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb7,0x12,0x15,0x15,0x12,0x0a, -0x29,0x06,0x31,0xb8,0x04,0xfd,0xb6,0x32,0x15,0x23,0x23,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0xdc,0x32,0x11,0x33,0xde,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15, -0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x25,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11, -0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xbc, -0x58,0x00,0x00,0x03,0xff,0xd4,0x05,0x20,0x02,0x33,0x07,0xfd,0x00,0x2f,0x00,0x53,0x00,0x61,0x00,0x85,0xb9,0x00,0x54,0x05,0x0d,0xb3,0x4d,0x00,0x00,0x03,0xb8,0x05,0x0d,0xb4,0x2c,0x2f,0x2f,0x2c,0x43,0xb8,0x05,0x0d,0x40,0x09,0x0a,0x41,0x1f,0x5c,0x5c,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19, -0xb8,0x05,0x0b,0xb4,0x12,0x15,0x15,0x12,0x48,0xb8,0x04,0xfd,0xb3,0x57,0x50,0x5f,0x3d,0xb8,0x04,0xfd,0x40,0x0a,0x36,0x33,0x33,0x36,0x15,0x00,0x23,0x0a,0x0d,0x06,0xb8,0x04,0xfd,0xb1,0x1c,0x29,0x00,0x2f,0x33,0xed,0x32,0x39,0xde,0x32,0x32,0xce,0x32,0x2f,0x10,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f, -0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x12,0x39,0x39,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14, -0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14, -0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x5a,0x17,0x28,0x11,0x18,0x2f,0x14,0x3c,0x65,0x31,0x12,0x33,0x5a,0x39,0x01,0x0b,0x06,0x01,0x34,0x1e,0x31,0x3e,0x21,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f, -0x18,0x0f,0x23,0x1a,0x30,0x3a,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x1d,0x11,0x22,0x11,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x40,0x40,0x24,0x39,0x27,0x14,0x14, -0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x1a,0x10,0x1a,0x3a,0x1a,0x0e,0x36,0x00,0x00,0x02,0xff,0xd4,0x05,0x28,0x02,0x33,0x06,0xfc,0x00,0x2f,0x00,0x33,0x00,0x63,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f, -0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0d,0x12,0x15,0x15,0x12,0x0a,0x29,0x06,0x15,0x22,0x22,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb2,0x0d,0x06,0x31,0xb9,0x04,0xfd,0x00,0x32,0x00,0x2f,0xfd,0xd6,0x32,0xfd,0x32,0xcc,0x32,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39, -0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x02,0x2f,0x02,0x02, -0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x06,0xfc,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12, -0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xfe,0x84,0x58,0x00,0x00,0x03,0xff,0x6c,0x05,0x20,0x02,0x33,0x07,0xfd,0x00,0x2f,0x00,0x54,0x00,0x62,0x00,0x8b,0xb2,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb7,0x12,0x15,0x15,0x12,0x12,0x63,0x3b,0x55,0xb8,0x05,0x0d,0xb4,0x4e,0x3b,0x00,0x00,0x03,0xb8,0x05,0x0d,0xb4,0x2c, -0x2f,0x2f,0x2c,0x44,0xb8,0x05,0x0d,0x40,0x09,0x0a,0x42,0x1f,0x5d,0x5d,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0x40,0x0a,0x1f,0x22,0x22,0x1f,0x3c,0x60,0x39,0x03,0x36,0x49,0xbb,0x04,0xfd,0x00,0x58,0x00,0x3f,0x04,0xfd,0xb6,0x36,0x16,0x00,0x22,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd4,0x32, -0x32,0xd6,0xfd,0xd4,0xed,0x11,0x17,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x12,0x39,0x39,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34, -0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37, -0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x5a,0x17,0x28,0x11,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34, -0x10,0x0f,0x01,0x36,0x1e,0x31,0x3f,0x20,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a,0x2f,0x3b,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14, -0x2c,0x0d,0x1d,0x11,0x22,0x11,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x42,0x41,0x24,0x38,0x27,0x14,0x14,0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x19,0x11,0x1b,0x38,0x1b,0x0e,0x35,0x00,0x00,0x03,0xff,0xd4,0x05,0x28,0x02,0x33,0x07,0xab,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6b, -0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0d,0x12,0x15,0x15,0x12,0x0a,0x29,0x06,0x15,0x23,0x23,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb2,0x0d,0x06,0x31,0xbc,0x04,0xfd,0x00,0x32,0x00,0x35,0x04,0xfd,0x00, -0x36,0x00,0x2f,0xfd,0xd6,0xfd,0xd6,0x32,0xfd,0x32,0xcc,0x32,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37, -0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01, -0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x07,0xab,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xfe,0x84,0x58,0x57,0x58,0x00,0x00,0x04,0x00,0x35, -0xfd,0xf6,0x03,0xf2,0x05,0x28,0x00,0x27,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x58,0xbc,0x00,0x14,0x05,0x0a,0x00,0x28,0x00,0x3e,0x05,0x0b,0xb2,0x3f,0x3f,0x3a,0xbb,0x05,0x0c,0x00,0x3b,0x00,0x32,0x05,0x0a,0x40,0x0b,0x05,0x28,0x3b,0x05,0x05,0x3b,0x28,0x03,0x43,0x42,0x3a,0xb8,0x04,0xfb,0xb4,0x3d,0x3f,0x40,0x37,0x24,0xbd,0x04, -0xfb,0x00,0x1b,0x05,0x03,0x00,0x2d,0x04,0xfb,0x00,0x0c,0x00,0x2f,0xed,0x3f,0xed,0x32,0xd6,0xcd,0x2f,0xed,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x04,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x27,0x16, -0x16,0x33,0x32,0x36,0x37,0x25,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x03,0x23,0x11,0x33,0x02,0x4e,0x49,0x60,0x38,0x16,0x15,0x28,0x3a,0x47,0x54,0x2f,0x45,0x75,0x38,0x14,0x26,0x1d,0x11,0x3c,0x64,0x82,0x8e,0x8f,0x3e,0x39,0x52,0x41,0x36,0x1e,0x20,0x51,0x9e,0x47,0x49,0x77, -0x21,0x01,0x09,0x22,0x38,0x4a,0x27,0x1d,0x37,0x2b,0x1b,0x18,0x42,0x73,0x5a,0x21,0x1d,0xab,0xc9,0xc9,0x23,0x7e,0x7e,0x9e,0x1d,0x45,0x4c,0x52,0x2b,0x2e,0x60,0x5b,0x50,0x3d,0x23,0x51,0x58,0x20,0x4a,0x54,0x5d,0x32,0x5e,0x82,0x56,0x30,0x17,0x05,0x02,0x04,0x06,0x04,0xa7,0x0a,0x08,0x07,0x04,0xc6,0x33,0x78,0x66,0x44,0x26,0x3c, -0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x17,0x52,0x03,0x36,0xbd,0xf8,0xce,0x01,0x88,0x00,0x03,0x00,0x65,0xff,0xea,0x03,0x9d,0x03,0x6c,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3a,0xb9,0x00,0x21,0x05,0x0c,0xb4,0x13,0x1b,0x1b,0x24,0x15,0xbb,0x05,0x0c,0x00,0x0f,0x00,0x09,0x05,0x0c,0xb2,0x03,0x1e,0x12,0xbe,0x04,0xfe,0x00,0x18,0x00, -0x0c,0x05,0x03,0x00,0x00,0x04,0xfe,0x00,0x06,0x00,0x2f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0xd4,0xed,0x11,0x33,0x2f,0xc4,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x02,0x00,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0xfd,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0xfd,0x79,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x02,0x8e,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfd,0x5c,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0xff,0xe7,0x06,0x7c,0x02,0x1f,0x06,0xe8, -0x00,0x03,0x00,0x15,0xb2,0x01,0x00,0x02,0xb8,0x04,0xfd,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xcd,0x31,0x30,0x03,0x21,0x15,0x21,0x19,0x02,0x38,0xfd,0xc8,0x06,0xe8,0x6c,0x00,0x00,0x01,0xff,0xdf,0x06,0x7c,0x02,0x28,0x07,0xdc,0x00,0x06,0x00,0x15,0xb7,0x03,0x01,0x05,0x01,0x04,0x02,0x03,0x00,0x00,0x2f,0x32, -0xcd,0x32,0x01,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x03,0x33,0x17,0x37,0x33,0x03,0xcb,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x06,0x7c,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x01,0xff,0xdf,0x06,0x7c,0x02,0x28,0x07,0xdc,0x00,0x06,0x00,0x15,0xb7,0x03,0x01,0x05,0x01,0x03,0x00,0x04,0x02,0x00,0x2f,0x33,0xcd,0x32,0x01,0x2f,0x2f,0x12, -0x39,0x31,0x30,0x01,0x13,0x23,0x27,0x07,0x23,0x13,0x01,0x3c,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x07,0xdc,0xfe,0xa0,0xff,0xff,0x01,0x60,0x00,0x01,0x00,0x97,0xfe,0x92,0x01,0x6e,0xff,0x69,0x00,0x0b,0x00,0x15,0xbd,0x00,0x06,0x05,0x0c,0x00,0x00,0x00,0x09,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x13,0x34,0x36, -0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x97,0x3d,0x2f,0x2f,0x3c,0x3c,0x2f,0x2f,0x3d,0xfe,0xfe,0x2f,0x3c,0x3c,0x2f,0x2f,0x3d,0x3d,0x00,0x00,0x02,0x00,0x3d,0x06,0x55,0x02,0x48,0x08,0x0e,0x00,0x23,0x00,0x2f,0x00,0x39,0xb4,0x14,0x2a,0x03,0x06,0x10,0xb8,0x05,0x0d,0xb3,0x2a,0x00,0x00,0x24,0xbb,0x05,0x0d,0x00,0x06,0x00, -0x0b,0x04,0xfd,0xb3,0x2d,0x03,0x27,0x17,0xb8,0x04,0xfd,0xb3,0x20,0x1e,0x01,0x1e,0x00,0x2f,0x5d,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0xed,0x32,0x2f,0x2f,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x13,0x36,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x17,0x16,0x32,0x33,0x32,0x36,0x37,0x17,0x06, -0x06,0x23,0x22,0x26,0x27,0x06,0x07,0x03,0x14,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x96,0x09,0x14,0x0b,0x39,0x48,0x1d,0x31,0x3e,0x21,0x26,0x3e,0x2c,0x18,0x17,0x1a,0x01,0x06,0x07,0x01,0x38,0x5c,0x32,0x12,0x30,0x66,0x3c,0x14,0x30,0x17,0x23,0x2d,0x39,0x3c,0x34,0x1d,0x1c,0x29,0x29,0x21,0x36,0x06,0x92,0x08,0x10, -0x0b,0x1a,0x59,0x42,0x2a,0x3d,0x29,0x14,0x19,0x2b,0x3b,0x21,0x20,0x46,0x21,0x02,0x01,0x0f,0x0d,0x53,0x0e,0x0e,0x03,0x05,0x22,0x22,0x01,0x14,0x2a,0x3a,0x10,0x1a,0x3d,0x1c,0x21,0x2d,0x23,0x00,0x00,0x03,0x00,0x05,0x06,0x67,0x02,0x01,0x08,0x31,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x34,0xb9,0x00,0x08,0x05,0x0a,0xb3,0x00,0x09, -0x01,0x04,0xb8,0x05,0x0a,0x40,0x0f,0x05,0x02,0x01,0x03,0x00,0x01,0x00,0x04,0x0b,0x08,0x07,0x20,0x04,0x01,0x04,0x00,0x2f,0x5d,0xdd,0xd4,0xcd,0x11,0x39,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x32,0x2f,0x33,0xed,0x31,0x30,0x13,0x01,0x15,0x01,0x25,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xa1, -0xa1,0xfe,0xa5,0xa1,0xa1,0x06,0xd3,0x01,0x5e,0x6c,0xfe,0xa2,0x01,0x9d,0x8f,0x9d,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x55,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x22,0x03,0x0f,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x55,0x00,0x83,0xfe,0xab, -0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab, -0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00, -0x00,0x27,0x0f,0x53,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x83,0xfd,0xce,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00, -0x00,0x27,0x0f,0x51,0x02,0xad,0xfe,0xab,0x00,0x07,0x0f,0x50,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x81,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x83,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0x13,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00, -0x01,0x07,0x0a,0x6e,0x02,0xad,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x2a,0x01,0x2a,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0x13,0x02,0xab,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0x83,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f, -0x05,0x5a,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0xad,0xfd,0x7e,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0xfd,0x7e,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x2a, -0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xda,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x03,0xb1,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39, -0x00,0x3d,0x00,0x75,0xb9,0x00,0x3a,0x05,0x0a,0xb2,0x3b,0x3b,0x33,0xb8,0x05,0x0a,0xb3,0x32,0x1d,0x32,0x37,0xb8,0x05,0x0a,0xb7,0x36,0x32,0x36,0x32,0x36,0x3f,0x26,0x05,0xbb,0x05,0x0a,0x00,0x16,0x00,0x3c,0x04,0xfb,0xb5,0x2f,0x3b,0x01,0x3b,0x38,0x34,0xbb,0x04,0xfb,0x00,0x36,0x00,0x33,0x04,0xe6,0xb5,0x00,0x1d,0x31,0x03,0x11, -0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0x33,0xed,0x32,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14, -0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x13,0x33,0x15,0x23,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7, -0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xf7,0xb5,0xb5,0xfe,0xbe,0xb5,0xb5,0xa1,0xb5,0xb5,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a, -0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x44,0xb3,0xb3,0xb3,0x01,0xc1,0xb3,0x00,0x05,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x0d,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x8b,0xb1,0x2b,0x40,0xbb,0x05,0x0a,0x00,0x1b,0x00,0x00,0x05,0x0b,0xb4,0x0b,0x41,0x41,0x0b,0x49, -0xb8,0x05,0x0a,0xb2,0x48,0x48,0x45,0xb8,0x05,0x0a,0xb7,0x44,0x0b,0x44,0x0b,0x44,0x4d,0x34,0x13,0xbb,0x05,0x0a,0x00,0x24,0x00,0x4a,0x04,0xfb,0xb5,0x2f,0x49,0x01,0x49,0x46,0x42,0xbb,0x04,0xfb,0x00,0x44,0x00,0x41,0x04,0xe6,0xb5,0x0e,0x2b,0x3f,0x03,0x1f,0x31,0xb8,0x04,0xff,0xb2,0x38,0x1b,0x18,0xb8,0x04,0xfc,0xb7,0x1c,0x1f, -0x1f,0x2f,0x1f,0x02,0x1f,0x03,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0x33,0xed,0x32,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x11,0x33,0x2f,0x10,0xed,0x39,0xe6,0x32,0x31,0x30,0x01,0x16,0x16,0x33,0x33,0x15,0x23, -0x22,0x2e,0x02,0x27,0x36,0x36,0x27,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x13,0x33,0x15,0x23,0x04,0x57,0x06,0x74,0x68,0x1f, -0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x2b,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xf7,0xb5,0xb5,0xfe,0xbe,0xb5,0xb5,0xa1,0xb5,0xb5,0x01, -0x56,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0xb3,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x44,0xb3,0xb3,0xb3,0x01,0xc1,0xb3,0xff,0xff,0xff,0xba, -0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0x13,0x03,0x4a,0x03,0xba,0x02,0x26, -0x09,0x15,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x4e,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x5c,0x00,0xc0,0xfc,0xfa,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00, -0x00,0x07,0x0f,0x56,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0xa3,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad, -0x05,0x20,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x02, -0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xbb,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x06,0x38,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00, -0x00,0x07,0x0f,0x54,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0x04,0x02,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xbb,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad, -0x06,0x38,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x02, -0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x51,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00, -0x00,0x07,0x0f,0x51,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x10,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0e,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02, -0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0e,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0xb3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x90,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03, -0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xcb,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xcb,0x02,0x26,0x08,0xed,0x00,0x00, -0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xcb,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b, -0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x04,0x79,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9, -0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0xf4,0x04,0x79,0x02,0x26,0x08,0xef,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0xf4,0x02,0xaf,0x02,0x26,0x08,0xef,0x00,0x00, -0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xfb,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00,0x01,0x56,0x00,0x27,0x0f,0x50,0x01,0x9f,0x04,0x02,0x00,0x07,0x0f,0x51,0x01,0x9f,0xfe,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a, -0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x06,0x64,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x07,0x0f,0x57,0x01,0x9f,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x07,0xba,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c, -0x04,0x02,0x01,0x07,0x0f,0x57,0x00,0x72,0x05,0x58,0x00,0x0a,0xb4,0x01,0x20,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x05,0x63,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x01,0x07,0x0a,0x6d,0x01,0x9f,0xfd,0x87,0x00,0x0a,0xb4,0x01,0x20,0x22,0x01,0x22,0x00,0x11, -0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x06,0xb9,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0a,0x6d,0x00,0x9c,0xfe,0xdd,0x00,0x13,0x40,0x0a,0x02,0x2f,0x1c,0x01,0x1c,0x01,0x20,0x19,0x01,0x19,0x00,0x11,0x5d,0x35,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x51, -0x05,0xec,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0xc3,0x00,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0xc3,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xa5,0x05,0xec,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x06,0x0f,0x5c,0x17,0x00,0xff,0xff, -0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x06,0x0f,0x5c,0x17,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x04,0xbc,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x09,0x7e, -0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x52,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06, -0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xa6,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0x18,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x5c, -0x02,0x18,0x00,0x00,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x00,0x00,0x0a,0x00,0x15,0x40,0x09,0x03,0x91,0x08,0x00,0x05,0x05,0x01,0x7e,0x00,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0xd4,0xed,0x31,0x30,0x23,0x33,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0xe6,0xa8,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0xd3,0x1d,0xa0,0x14,0xc5, -0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x12,0xb7,0x08,0x91,0x03,0x0a,0x00,0x7e,0x0a,0x06,0x2f,0xd6,0xe1,0x00,0x2f,0xd4,0xed,0x31,0x30,0x37,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0xe6,0xb3,0x9f,0x42,0x38,0x33,0x3f,0xb2,0x35,0xbd,0xe2,0x14,0xa0,0x1d,0x01,0x08,0x00,0x00,0x01,0x01,0x9f, -0xfe,0x80,0x02,0x60,0x00,0x98,0x00,0x05,0x00,0x18,0xb9,0x00,0x01,0x01,0x2c,0xb5,0x04,0x00,0x91,0x05,0x22,0x03,0xb8,0x01,0x30,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0x9f,0xc1,0x9b,0x26,0x98,0xfd,0xe8,0x01,0x80,0x00,0x01,0x01,0xb3,0xfe,0x8a,0x02,0x4d,0x00,0x8b,0x00,0x05,0x00,0x18, -0xb9,0x00,0x01,0x01,0x2c,0xb5,0x04,0x00,0x95,0x05,0x22,0x03,0xb8,0x01,0x31,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0xb3,0x9a,0x8f,0x0b,0x8b,0xfd,0xff,0x01,0x76,0x00,0x01,0x00,0x14,0x00,0x8b,0x02,0xe8,0x05,0x30,0x00,0x1d,0x00,0x30,0x40,0x17,0x17,0xb1,0x0c,0x00,0xb1,0x05,0x0c,0x05, -0x0c,0x05,0x04,0x01,0x01,0x1f,0x11,0x04,0x0f,0xbe,0x14,0x00,0x04,0xbe,0x03,0x00,0x2f,0xed,0x32,0x2f,0xed,0x01,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x15,0x21,0x35,0x33,0x34,0x37,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x07,0x06,0x07,0x06,0x01,0x89,0x01,0x2f,0xfd,0x5c,0xd2,0x26,0x26,0x6e,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x50,0x20,0x1f,0x01,0x20,0x95,0x95,0x84,0x50,0x51,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x42,0x40,0x00,0x00,0x03,0x00,0x1c,0x00,0x00,0x04,0x2f,0x05,0x9a, -0x00,0x13,0x00,0x1f,0x00,0x27,0x00,0x84,0x40,0x0b,0x0c,0x19,0x10,0x06,0x0b,0x0d,0x06,0x4c,0x10,0x7d,0x1d,0xb8,0xff,0xf0,0x40,0x42,0x0b,0x0d,0x06,0x4c,0x1d,0x1d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x7d,0x25,0x08,0x0b,0x0c,0x06,0x4c,0x7f,0x25,0x01,0x25,0x25,0x29,0x00,0x29,0x40,0x0b,0x00,0x4d,0x21,0x17,0x17,0x15,0x19,0x7e,0x00, -0x04,0x00,0x02,0x02,0x00,0x0c,0x14,0x91,0x21,0x18,0x01,0x91,0x04,0x15,0x04,0x21,0x04,0x21,0x04,0x19,0x20,0x91,0x05,0x03,0x19,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x39,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x2f,0x32,0x2b,0x11,0x12,0x39,0x2f,0x5d, -0x2b,0xe9,0x2b,0x39,0x2f,0x2b,0xe9,0x2b,0x11,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x15,0x33,0x15,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0xbc,0xa0,0xa0,0x01,0x98,0xba,0xda,0x84,0x74,0x91,0xae,0xfe, -0xf8,0xc9,0xfa,0xfc,0xfc,0xe4,0x94,0xa3,0xfe,0xa6,0xc1,0xac,0x8a,0x9e,0xfe,0xed,0x01,0x4f,0x98,0x03,0xb3,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0xe4,0x02,0x9c,0xb5,0x98,0xb7,0x8c,0x7a,0xfe,0x02,0x66,0xfe,0x31,0x85,0x79,0xd1,0x00,0x00,0x02,0x00,0x1e,0xff,0xe8,0x05,0x61,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x41, -0x40,0x21,0x12,0x10,0x10,0x0e,0x7e,0x16,0x0d,0x0d,0x1b,0x17,0x0a,0x7e,0x09,0x07,0x07,0x05,0x09,0x0d,0x03,0x17,0x12,0x06,0x91,0x0f,0x0b,0x07,0x07,0x09,0x03,0x13,0x91,0x02,0x12,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x3f,0x01,0x2f,0x33,0x33,0x2f,0x10,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x32,0x31, -0x30,0x01,0x10,0x21,0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x01,0x20,0x11,0x35,0x21,0x15,0x10,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0x8c,0x8c,0xa8,0x02,0xdb,0xa8,0x8c,0x8c,0xfd,0xf1,0x01,0x67,0xfd,0x25,0x02,0x44,0xfd,0xa4,0x02,0x45,0x57,0x98,0x02,0x7e,0xfd,0x82,0x02,0x7e,0xfd,0x82,0x98, -0xfd,0xfb,0x01,0xaa,0x5b,0x4c,0xfe,0x47,0xff,0xff,0x00,0x18,0x00,0x00,0x04,0xef,0x05,0x9a,0x00,0x06,0x01,0xb0,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x70,0x03,0xb4,0x05,0xf8,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x1b,0x00,0x5e,0x00,0x1b,0x40,0x14,0x20,0x0e,0x30,0x0e,0x02,0x20,0x0d,0x30,0x0d,0x02,0x0f,0x0f, -0x1f,0x0f,0x02,0x0f,0x0c,0x1f,0x0c,0x02,0x00,0x5d,0x5d,0x5d,0x5d,0x00,0xff,0xff,0x00,0x60,0xfe,0xb5,0x03,0xdd,0x05,0x3d,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x3a,0xff,0xa3,0x00,0x0a,0xb4,0x02,0x4f,0x1c,0x01,0x1c,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x14,0xff,0xe8,0x02,0xbd,0x05,0x9a,0x00,0x14,0x00,0x75, -0x40,0x0d,0x79,0x09,0x01,0x76,0x09,0x01,0x76,0x01,0x01,0x13,0x13,0x11,0x05,0xb8,0xff,0xf0,0x40,0x18,0x0d,0x06,0x4d,0x05,0x05,0x00,0x08,0x0b,0x0d,0x06,0x4c,0x00,0x7e,0x0a,0x0e,0x0a,0x0c,0x0c,0x0a,0x18,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0x40,0x15,0x0b,0x06,0x4d,0x0a,0x0a,0x16,0x15, -0x14,0x0c,0x91,0x11,0x0d,0x0d,0x0f,0x03,0x06,0x06,0x08,0x91,0x03,0x13,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x2f,0x11,0x33,0x10,0xe9,0x2b,0x32,0x2f,0x2b,0x32,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11, -0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x02,0x2b,0xd8,0xb5,0x54,0x36,0x36,0x56,0xe3,0xd8,0xd8,0xa8,0x92,0x92,0x02,0x02,0xff,0xfe,0xe5,0x18,0xa6,0x27,0x01,0x81,0x81,0x98,0x02,0x81,0xfd,0x7f,0x98,0x00,0x00,0x02,0xff,0x3a,0xfe,0x1e,0x01,0xd4,0x05,0xd9,0x00,0x14,0x00,0x20,0x00,0x7a,0x40,0x28,0x1e,0x62,0x18,0x0a, -0x00,0x18,0x62,0xff,0x30,0x06,0x0a,0x12,0x12,0x11,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x0a,0x0e,0x0a,0x0c,0x0c,0x7f,0x0a,0x01,0x0a,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfe,0x40,0x19,0x0b,0x06,0x4d,0x0a,0x0a,0x22,0x21,0x1b,0x63,0x15,0x0f,0x14,0x0c,0x95,0x11, -0x0d,0x0d,0x0f,0x0f,0x06,0x06,0x08,0x95,0x03,0x1c,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x10,0xde,0xed,0x11,0x12,0x01,0x39,0x2f,0x2b,0x2b,0x5d,0x33,0x2f,0x11,0x33,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x10,0xc6,0x2b,0x01,0x10,0xe1,0x31,0x30,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11, -0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0x8a,0x8a,0xa4,0x8a,0x8a,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x01,0x9d,0x87,0x01,0xcc,0xfe,0x34,0x87,0x03,0x57,0x3c,0x2e, -0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0x00,0x02,0x00,0x5e,0xfe,0x96,0x06,0x3d,0x05,0xb2,0x00,0x1b,0x00,0x29,0x00,0x30,0x40,0x19,0x05,0x05,0x01,0x7e,0x25,0x1a,0x0b,0x0b,0x2b,0x1f,0x7d,0x13,0x1b,0x03,0x1c,0x91,0x16,0x04,0x22,0x91,0x10,0x13,0x03,0x91,0x08,0x00,0x2f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33, -0x33,0xed,0x32,0x2f,0x31,0x30,0x01,0x11,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x07,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x17,0x16,0x17,0x35,0x05,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x11,0x35,0x02,0x27,0x26,0x05,0x19,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0x0c,0x0d,0xa2,0xfe,0xf1,0xfe,0xf6, -0xfe,0xc1,0x01,0x45,0x01,0x19,0x01,0x02,0x9e,0x0b,0x0a,0xfe,0x54,0xc3,0xf4,0xed,0xbf,0xcc,0xeb,0x03,0x6f,0x72,0x05,0x9a,0xfa,0x9b,0xfe,0xf8,0x1d,0xa0,0x14,0xe2,0xbd,0xa0,0x11,0x10,0xcc,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xc8,0x0e,0x0f,0xcd,0x80,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x0e,0x01, -0x12,0x97,0x9b,0x00,0x00,0x02,0x00,0x60,0xfe,0x96,0x05,0x34,0x04,0x18,0x00,0x1d,0x00,0x2e,0x00,0x2c,0x40,0x17,0x27,0x83,0x12,0x02,0x02,0x1c,0x84,0x1e,0x1a,0x0a,0x1a,0x0f,0x23,0x95,0x16,0x10,0x2b,0x95,0x0e,0x16,0x00,0xec,0x05,0x00,0x2f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x2f,0xed,0x31,0x30, -0x05,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x26,0x26,0x35,0x35,0x23,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x10,0x03,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0xc2,0x3e,0x34,0x39,0x41,0x9f,0x5a,0x2d,0x28,0x04,0x72,0xee,0xc1,0x74,0x73,0x80, -0x80,0xd5,0xd3,0x60,0x04,0xa4,0xa4,0x52,0x53,0x7d,0x96,0x56,0x56,0x52,0x53,0x8b,0x89,0x55,0x56,0xd3,0x1d,0xa0,0x14,0x71,0x39,0x96,0x5f,0x79,0xc6,0x89,0x89,0xee,0xfd,0x9a,0x99,0xa6,0x8e,0xfc,0x35,0xfe,0xf8,0x02,0xa2,0x97,0x7d,0x55,0x56,0x6e,0x6e,0xc2,0xb1,0x67,0x66,0x63,0x64,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x04,0xc0, -0x05,0x9a,0x00,0x20,0x00,0x2b,0x00,0xb0,0x40,0x32,0x75,0x13,0x01,0x76,0x12,0x01,0x39,0x02,0x01,0x0e,0x1b,0x22,0x91,0x0b,0x08,0x08,0x0a,0x21,0x91,0x0f,0x03,0x01,0x0a,0x1b,0x09,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x28,0x7d,0x15,0x79,0x02,0x01,0x7a,0x01,0x01,0x02,0xb8,0xff,0xe8,0xb4, -0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x28,0x0b,0x0d,0x01,0x4c,0x01,0x1c,0x02,0x15,0x04,0x70,0x00,0x01,0x00,0x08,0x0d,0x06,0x4d,0x00,0x2d,0x22,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x0e,0x0d,0x09,0x7e,0x0a,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0c,0x06, -0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x33,0x33,0x2b,0x2b,0x2b,0x32,0x10,0xc6,0x2b,0x5d,0x17,0x32,0x2b,0x2b,0x5d,0x5d,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x00,0x2f,0x33,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x39,0x32,0x31,0x30,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11, -0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x04,0xc0,0xc8,0xf0,0x21,0x3e,0x41,0x4b,0x2f,0x8a,0xa8,0xa0,0xa0,0x01,0xac,0x5e,0x9f,0x75,0x42,0x2d,0x53,0x75,0x49,0x24,0x35,0x30,0x2f,0x1d,0xfd,0xb1,0xe4,0x3f,0x6b,0x4e,0x2c, -0x95,0x8d,0x01,0x92,0x38,0x4f,0x32,0x17,0xfd,0x9e,0x02,0x62,0x98,0x02,0xa0,0x2f,0x60,0x8f,0x60,0x4b,0x7d,0x62,0x45,0x13,0x04,0x10,0x29,0x38,0x47,0x2f,0x03,0x53,0xfd,0xf8,0x26,0x47,0x67,0x40,0x73,0x81,0x00,0x01,0x00,0x1c,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x18,0x00,0x3f,0x40,0x1f,0x00,0x00,0x1a,0x11,0x06,0x0a,0x84,0x0b, -0x0f,0x0b,0x0d,0x0d,0x0b,0x09,0x0c,0xec,0x06,0x0f,0x0f,0x0b,0x16,0x12,0x00,0x00,0x02,0x16,0x10,0x10,0x0f,0x0b,0x15,0x00,0x3f,0x3f,0x3f,0xcd,0x32,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x15,0x21,0x11, -0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0x01,0x16,0xfe,0xea,0xa4,0x8a,0x8a,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0x23,0x98,0xfe,0xb1,0x01,0x4f,0x98,0x02,0x19,0xd3,0x6c,0x79,0x0e,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x11, -0x00,0x19,0x00,0x68,0x40,0x34,0x18,0x10,0x14,0x11,0x11,0x00,0x0f,0x19,0x0e,0x14,0x14,0x07,0x04,0x01,0x00,0x06,0x7e,0x0c,0x09,0x07,0x07,0x0d,0x00,0x02,0x02,0x00,0x00,0x1b,0x0e,0x0d,0x0b,0x0b,0x0d,0x19,0x04,0x0a,0x91,0x0f,0x01,0x0b,0x0b,0x11,0x11,0x14,0x05,0x08,0x03,0x07,0x0d,0x03,0x07,0x12,0x00,0x3f,0x3f,0x12,0x17,0x39, -0x33,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x11,0x33,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x03,0x33,0x15,0x23,0x03,0x11,0x23,0x11,0x03,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13,0x01,0x16, -0x17,0x33,0x36,0x37,0x37,0x21,0x04,0x60,0x8b,0x7a,0xc9,0xff,0xa8,0xfa,0xc9,0x7c,0x86,0xbf,0x83,0x01,0xd0,0x8a,0xfe,0x64,0x06,0x1d,0x03,0x0a,0x1c,0x78,0xfe,0xc9,0x05,0x9a,0xfe,0xf7,0x98,0xfe,0x19,0xfd,0xee,0x02,0x0e,0x01,0xeb,0x98,0x01,0x09,0xfe,0xf7,0x01,0x09,0xfd,0x78,0x0c,0x4c,0x22,0x36,0xe7,0x00,0x00,0x02,0x00,0x0e, -0xfe,0x1e,0x03,0xd5,0x04,0x00,0x00,0x18,0x00,0x20,0x00,0x66,0x40,0x35,0x1f,0x17,0x18,0x18,0x00,0x20,0x16,0x1b,0x15,0x01,0x04,0x05,0x1b,0x0f,0x10,0x13,0x07,0x00,0x0a,0x0a,0x14,0x00,0x02,0x02,0x00,0x00,0x22,0x15,0x14,0x12,0x12,0x14,0x20,0x04,0x11,0x96,0x16,0x01,0x12,0x12,0x21,0x18,0x14,0x0f,0x1b,0x05,0x0f,0x0a,0x0a,0x0c, -0x95,0x07,0x1c,0x00,0x3f,0xed,0x32,0x2f,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x11,0x33,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x39,0x39,0x31,0x30,0x01,0x03,0x33,0x15,0x23,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32, -0x37,0x37,0x03,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x21,0x03,0xd5,0x8b,0x79,0xae,0xfe,0xe9,0x7e,0xe4,0x40,0x2b,0x35,0x2c,0x7c,0x3e,0x52,0xd3,0xae,0x79,0x88,0xb6,0x7a,0x01,0x6c,0x81,0xfe,0xae,0x05,0x10,0x06,0x05,0x0f,0x71,0xfe,0xf4,0x04,0x00,0xfe,0xa3,0x86,0xfd,0x3f,0xfe,0xc2,0x0d, -0x93,0x12,0x94,0xc2,0x02,0x1b,0x86,0x01,0x5d,0xfe,0xa3,0x01,0x5d,0xfc,0xec,0x0f,0x3f,0x18,0x34,0x01,0x33,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x06,0x07,0x72,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x78,0xfc,0xe6,0x00,0x1b, -0x40,0x14,0x01,0x0f,0x1c,0x1f,0x1c,0x02,0x3f,0x1c,0x6f,0x1c,0x70,0x1c,0x8f,0x1c,0xcf,0x1c,0xdf,0x1c,0x06,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x26,0x07,0x72,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xb5,0xfc,0xe6,0x00,0x1b,0x40,0x14,0x01,0x0f,0x1c,0x1f,0x1c,0x02,0x3f,0x1c, -0x6f,0x1c,0x70,0x1c,0x8f,0x1c,0xcf,0x1c,0xdf,0x1c,0x06,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x02,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,0x00,0x29,0xfe,0x96,0x03,0xf6,0x05,0x9a,0x02,0x26,0x02,0xb9,0x00,0x00,0x01,0x07,0x08,0x5c,0x01,0x78,0x00,0x00,0x00,0x09,0xb3,0x01,0x1a,0x1a, -0x06,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x1e,0xfe,0x96,0x03,0x29,0x04,0x00,0x02,0x26,0x02,0xba,0x00,0x00,0x01,0x07,0x08,0x5c,0x01,0x56,0x00,0x00,0x00,0x09,0xb3,0x01,0x1a,0x1a,0x06,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x1a,0xfe,0x96,0x04,0xda,0x05,0x9a,0x00,0x26,0x00,0x3b,0x00,0x00,0x00,0x07,0x08,0x5c,0x04,0x03, -0x00,0x00,0xff,0xff,0x00,0x1a,0xfe,0x96,0x03,0xc6,0x04,0x00,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x07,0x08,0x5c,0x02,0xef,0x00,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x00,0x1b,0x00,0x9b,0xb9,0x00,0x16,0xff,0xe0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0f,0x20,0x0b,0x0d,0x01,0x4c,0x08,0x20,0x0b,0x0d,0x01,0x4c,0x01, -0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x16,0x08,0x0c,0x00,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x00,0x4d,0x0a,0x10,0x0b,0x00,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x00,0x4d,0x01,0x08,0x0c,0x00,0x4d,0x0a,0x18,0x0d,0x1b,0x04,0x0e,0x19,0x19,0x17,0x00,0x10,0x0b,0x00,0x4d,0x00,0x00,0x1d,0x0b,0x0b,0x0e,0x09,0xb8, -0xff,0xf0,0x40,0x16,0x0b,0x00,0x4d,0x09,0x1b,0x04,0x0b,0x91,0x18,0x12,0x2f,0x0c,0x01,0x0c,0x0c,0x08,0x16,0x0f,0x03,0x01,0x08,0x12,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0xc6,0x33,0x2f,0x11,0x33,0x2f,0x2b,0xc6,0x33,0x2f,0x11,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, -0x2b,0x2b,0x2b,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x21,0x35,0x21,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x04,0x9a,0xcd,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xb2,0xfe,0x66,0x01,0x94,0xfe,0x7a,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe, -0x71,0x01,0x8b,0xfe,0x6d,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0x8d,0x98,0x02,0x75,0xfe,0x08,0x32,0x32,0x42,0x26,0x01,0xf4,0xfd,0x8b,0x98,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x19,0x00,0x4e,0x40,0x2f,0x0d,0x0a,0x18,0x01,0x04,0x02,0x09,0x02,0x00,0x17,0x09,0x0c,0x0b,0x0e,0x13,0x0d,0x19,0x96, -0x0a,0x06,0x0f,0x00,0x1f,0x00,0x4f,0x00,0x5f,0x00,0x04,0x2f,0x00,0x3f,0x00,0x6f,0x00,0x7f,0x00,0x04,0x00,0x00,0x03,0x0f,0x16,0x15,0x08,0x03,0x0f,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x71,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x13,0x21,0x01,0x33,0x13,0x16, -0x17,0x33,0x01,0x33,0x01,0x21,0x15,0x21,0x01,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x21,0x28,0x01,0x21,0xfe,0xe0,0xbf,0xc6,0x16,0x15,0x04,0x01,0x00,0xb5,0xfe,0xd4,0x01,0x1e,0xfe,0xe3,0x01,0x25,0xbf,0xc9,0x13,0x1a,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x31,0xfe,0xdd,0x02,0x3d,0x01,0xc3,0xfe,0xa2,0x27,0x29,0x01,0xae, -0xfe,0x3d,0x86,0xfe,0x49,0x01,0x4c,0x1f,0x2f,0x09,0x45,0xfe,0xb4,0x01,0xb7,0x00,0xff,0xff,0x00,0x70,0xff,0xe8,0x03,0xf4,0x05,0xb2,0x02,0x06,0x04,0xbf,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x04,0x19,0x02,0x06,0x01,0x31,0x00,0x00,0xff,0xff,0x00,0x10,0xfe,0x96,0x04,0xa4,0x05,0x9a,0x02,0x26,0x01,0xf2,0x00,0x00, -0x01,0x07,0x04,0x80,0x03,0xbe,0x00,0x00,0x00,0x09,0xb3,0x01,0x1d,0x1d,0x01,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x10,0xfe,0x96,0x03,0x92,0x04,0x00,0x02,0x26,0x02,0x12,0x00,0x00,0x01,0x07,0x04,0x80,0x02,0xac,0x00,0x00,0x00,0x09,0xb3,0x01,0x19,0x19,0x01,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x3e,0x04,0xc2,0x03,0x75, -0x06,0x0a,0x00,0x26,0x00,0xd9,0x00,0x00,0x00,0x07,0x00,0x8e,0x01,0x69,0x00,0x00,0xff,0xff,0x00,0x3f,0x04,0xc2,0x03,0x75,0x06,0x0a,0x00,0x27,0x00,0xd9,0x01,0x3b,0x00,0x00,0x00,0x06,0x00,0x43,0xed,0x00,0xff,0xff,0x00,0x3e,0x03,0xe8,0x03,0x68,0x05,0x30,0x00,0x26,0x00,0xd9,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x91,0xff,0x26, -0x00,0x0a,0xb3,0x01,0x06,0x06,0x02,0x00,0x10,0x3c,0x11,0x35,0xff,0xff,0x00,0x3f,0x03,0xe8,0x03,0x68,0x05,0x30,0x00,0x27,0x00,0xd9,0x01,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xb8,0xff,0x26,0x00,0x0a,0xb3,0x01,0x07,0x07,0x02,0x00,0x10,0x3c,0x11,0x35,0xff,0xff,0x00,0x3f,0x04,0x83,0x03,0xd0,0x05,0xcb,0x00,0x26,0x00,0x43, -0xed,0xc1,0x00,0x27,0x00,0x8e,0x00,0xbd,0xff,0xc1,0x00,0x07,0x00,0x43,0x01,0xf9,0xff,0xc1,0xff,0xff,0x00,0x3f,0x04,0x83,0x03,0xd0,0x05,0xcb,0x00,0x26,0x00,0x8e,0xb8,0xc1,0x00,0x27,0x00,0x43,0x00,0xf3,0xff,0xc1,0x00,0x07,0x00,0x8e,0x01,0xc4,0xff,0xc1,0xff,0xff,0x00,0x66,0xfd,0xfe,0x01,0xa8,0x00,0x2c,0x00,0x07,0x06,0x79, -0x00,0x00,0xfb,0x64,0x00,0x01,0x00,0x77,0x04,0x09,0x02,0x30,0x06,0x83,0x00,0x06,0x00,0x0d,0xb3,0x00,0x01,0x03,0x00,0x00,0x2f,0xce,0x01,0x2f,0xcd,0x31,0x30,0x01,0x25,0x35,0x25,0x15,0x05,0x05,0x02,0x30,0xfe,0x47,0x01,0xb9,0xfe,0xb6,0x01,0x4a,0x04,0x09,0xdd,0xc0,0xdd,0x7c,0xc1,0xc1,0x00,0x02,0x00,0xdb,0xfe,0x05,0x04,0x57, -0x00,0x1b,0x00,0x06,0x00,0x0d,0x00,0x2c,0x40,0x17,0x07,0x0a,0x05,0x40,0x06,0x80,0x0a,0x01,0x0a,0x80,0x30,0x09,0x40,0x09,0x02,0x09,0x09,0x03,0xc0,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x1a,0xce,0x33,0x2f,0x5d,0x1a,0xcd,0x5d,0x01,0x2f,0x1a,0xcd,0x2f,0xcc,0x31,0x30,0x13,0x37,0x27,0x35,0x05,0x15,0x05,0x01,0x03,0x23,0x03,0x33, -0x17,0x37,0xdb,0xc8,0xc8,0x01,0x37,0xfe,0xc9,0x03,0x7c,0xab,0xc0,0xab,0x7c,0x8f,0x8f,0xfe,0x81,0x8f,0x8f,0x7c,0xab,0xc0,0xab,0x01,0x94,0xfe,0xc9,0x01,0x37,0xc8,0xc8,0x00,0x00,0x04,0x00,0x35,0xff,0xf5,0x05,0xae,0x05,0x9a,0x00,0x07,0x00,0x0a,0x00,0x40,0x00,0x44,0x00,0x8e,0x40,0x0f,0x08,0x02,0x01,0x09,0x01,0x0a,0x03,0x04, -0x09,0x04,0x2c,0x13,0x3b,0x25,0x27,0xb8,0x01,0x0e,0x40,0x0c,0x0f,0x22,0x3f,0x22,0x5f,0x22,0x6f,0x22,0x04,0x22,0x0b,0x10,0xb8,0x01,0x0e,0xb3,0x3b,0x02,0x08,0x03,0xb8,0x01,0x0e,0xb7,0x0a,0x0a,0x06,0x05,0x43,0x44,0x09,0x06,0xbc,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x05,0x01,0x0a,0xb3,0x41,0x43,0x0b,0x2c,0xb8,0x01,0x0c,0xb2, -0x1d,0x25,0x36,0xb8,0x01,0x0c,0x40,0x09,0x13,0x13,0x46,0x0a,0x08,0x05,0x00,0x00,0x05,0x2f,0x33,0x2f,0x12,0x39,0x39,0x11,0x33,0x2f,0xed,0x32,0xd4,0xed,0x33,0x2f,0x2f,0x00,0x3f,0x3f,0x3f,0x33,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x33,0x32,0x2f,0xed,0x32,0x2f,0x5d,0xed,0x32,0x12,0x39,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0, -0x10,0x87,0xc0,0xc0,0x01,0x23,0x27,0x21,0x07,0x23,0x01,0x33,0x13,0x03,0x03,0x01,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x01,0x01,0x23,0x01,0x02,0xd3,0x83, -0x49,0xfe,0xf7,0x46,0x83,0x01,0x17,0x6f,0x23,0x5d,0x5a,0x02,0xbe,0x17,0x36,0x37,0x34,0x15,0x3b,0x46,0x17,0x29,0x37,0x20,0x26,0x42,0x32,0x1c,0x2d,0x49,0x5d,0x30,0x6a,0x3e,0x59,0x57,0x18,0x2e,0x24,0x16,0x13,0x24,0x34,0x20,0x24,0x46,0x37,0x21,0x29,0x46,0x5e,0x35,0x1a,0x38,0x35,0x2f,0x11,0x01,0x4d,0xfc,0xa6,0x90,0x03,0x5b, -0x02,0xc0,0xc2,0xc2,0x02,0xd9,0xfe,0x59,0x01,0x01,0xfe,0xff,0xfc,0xc8,0x14,0x1f,0x16,0x0c,0x2d,0x2b,0x17,0x23,0x1f,0x1d,0x10,0x14,0x27,0x32,0x3f,0x2b,0x35,0x4c,0x32,0x18,0x20,0x8b,0x3b,0x09,0x14,0x20,0x17,0x15,0x21,0x1d,0x1c,0x10,0x13,0x2b,0x35,0x40,0x29,0x38,0x4f,0x33,0x17,0x07,0x0d,0x12,0x0b,0x05,0x74,0xfa,0x66,0x05, -0x9a,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x03,0x0c,0x04,0x01,0x00,0x09,0x00,0x2d,0x40,0x16,0x07,0x84,0x06,0x02,0x06,0x03,0x06,0x03,0x06,0x0b,0x00,0x02,0x95,0x05,0x05,0x06,0x01,0x95,0x08,0x15,0x06,0x0f,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x37,0x21,0x11, -0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x48,0x02,0x21,0xfe,0x34,0x01,0xcc,0xa3,0xfd,0x3c,0x8a,0x01,0x5d,0x8c,0x01,0x8e,0xfb,0xff,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x06,0x07,0x72,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x15,0x00,0x86,0xb9,0x00,0x15,0xff,0xf0,0xb3,0x10,0x06, -0x4d,0x15,0xb8,0xff,0xf0,0xb4,0x0b,0x0d,0x06,0x4c,0x15,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x15,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x15,0xb8,0xff,0xc0,0x40,0x32,0x0a,0x1f,0x48,0x15,0x15,0x17,0x01,0x0e,0x11,0x11,0x10,0x0c,0x14,0x7e,0x01,0x07,0x03,0x03,0x09,0x05,0x01,0x13,0x02,0x91,0x05,0x10,0x05,0x0f,0x06,0x91,0x09,0x0c, -0x09,0x2f,0x09,0x6f,0x09,0x7f,0x09,0x03,0x05,0x09,0x05,0x09,0x0a,0x03,0x14,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x32,0x32,0x2f,0x33,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x21,0x21, -0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x21,0x03,0xa4,0xfd,0x18,0xa0,0xa0,0xa0,0xa0,0xa8,0x01,0x2e,0xfe,0xd2,0x01,0x2e,0xfe,0xd2,0x02,0x40,0x01,0xda,0x98,0x9e,0x98,0x01,0xf2,0xfe,0x0e,0x98,0x9e,0x98,0xfe,0xbe,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x36,0x05,0xec, -0x00,0x13,0x00,0x51,0x40,0x2d,0x08,0x03,0x03,0x01,0x0e,0x12,0x12,0x00,0x84,0x09,0x05,0x01,0x0f,0x07,0x96,0x08,0x0c,0x08,0x13,0x03,0x96,0x04,0x10,0x04,0x0f,0x08,0x1f,0x08,0x3f,0x08,0x03,0x6f,0x04,0x8f,0x04,0x02,0x08,0x04,0x08,0x04,0x01,0x0a,0x00,0x01,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10, -0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x21,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x01,0x77,0xa4,0xbf,0xbf,0xbf,0xbf,0xa4,0xbf,0xbf,0xbf,0xbf,0x01,0xe1,0x86,0x92,0x86,0x02,0x6d,0xfd,0x93,0x86,0x92, -0x86,0x00,0xff,0xff,0x00,0x27,0x00,0x00,0x03,0xf9,0x05,0x9a,0x00,0x26,0x00,0x2f,0x55,0x00,0x00,0x07,0x00,0xd8,0x00,0x04,0xfd,0x66,0x00,0x02,0x00,0x1c,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x51,0x40,0x29,0x12,0x12,0x14,0x0b,0x7d,0x18,0x18,0x1c,0x02,0x10,0x14,0x14,0x00,0x01,0x7e,0x02,0x06,0x02,0x04,0x04, -0x02,0x00,0x91,0x14,0x13,0x03,0x91,0x06,0x10,0x06,0x14,0x06,0x14,0x06,0x02,0x0f,0x91,0x07,0x03,0x02,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x23, -0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x15,0x21,0x15,0x21,0x15,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xa0,0xa0,0x01,0x8a,0xe6,0xfd,0xfe,0xe7,0xef,0xbd,0x01,0x24,0xfe,0xdc,0xb0,0xae,0xb7,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x03,0x8a,0x98,0x01,0x78,0xe0,0xcc,0xcc,0xfe,0xfc,0x02,0xe4,0xe0,0x98,0xd4,0x9f, -0x91,0x01,0x1c,0x00,0xff,0xff,0x00,0xbc,0xfe,0x96,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x0a,0xbb,0x01,0xa2,0x00,0x00,0x00,0x09,0xb3,0x02,0x29,0x29,0x09,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xb5,0x03,0x95,0x05,0x3d,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x03,0xff,0xa3, -0x00,0x0a,0xb4,0x02,0x4f,0x1f,0x01,0x1f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xb5,0xff,0x12,0x02,0xd7,0x05,0x9a,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x04,0x96,0x01,0x45,0x00,0x00,0x00,0x0a,0xb4,0x01,0x4f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xbc,0xfe,0x80,0x05,0xb2,0x05,0x9a,0x02,0x06,0x02,0xc1,0x00,0x00, -0xff,0xff,0x00,0xa6,0xfe,0x8a,0x04,0x92,0x05,0xec,0x00,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x0a,0xbe,0x02,0x45,0x00,0x00,0x00,0x09,0xb3,0x01,0x12,0x12,0x00,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x80,0x04,0xdd,0x05,0x9a,0x00,0x26,0x00,0x2e,0x00,0x00,0x00,0x07,0x0a,0xbd,0x02,0x7d,0x00,0x00,0xff,0xff,0x00,0xa6, -0xfe,0x8a,0x04,0x0c,0x05,0xec,0x00,0x26,0x00,0x4e,0x00,0x00,0x00,0x07,0x0a,0xbe,0x01,0xbf,0x00,0x00,0xff,0xff,0x00,0x21,0xfe,0x80,0x04,0xb6,0x05,0x9a,0x00,0x26,0x00,0x3d,0x00,0x00,0x00,0x07,0x0a,0xbd,0x02,0x56,0x00,0x00,0xff,0xff,0x00,0x21,0xfe,0x8b,0x03,0xbd,0x04,0x00,0x00,0x26,0x00,0x5d,0x00,0x00,0x00,0x07,0x0a,0xbe, -0x01,0x70,0x00,0x01,0x00,0x02,0x00,0x4b,0x00,0x00,0x04,0x3a,0x04,0x23,0x00,0x21,0x00,0x2d,0x00,0x5c,0x40,0x2e,0x0a,0xef,0x1c,0x1f,0x1b,0x00,0x1b,0x0f,0x2b,0x28,0x1a,0x13,0x13,0x19,0x22,0x22,0x00,0x18,0x19,0x19,0x2f,0x28,0xef,0x00,0x1e,0x1e,0x00,0x1f,0x2b,0x1e,0x25,0x1e,0x1c,0x0f,0x05,0x1d,0x1d,0x13,0x1b,0x15,0x18,0x0f, -0x25,0x95,0x05,0x10,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x13,0x16,0x16, -0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x23,0x01,0x07,0x27,0x37,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x95,0x26,0x41,0x53,0x2d,0x2c,0x52,0x3e,0x25,0x1d,0x37,0x50,0x32,0x9f,0x14,0x18,0x07,0x04,0x05,0x10,0x0b,0x01,0x10,0xad,0xfe,0x68,0x9a,0xfe,0xf9,0x7a,0x3c,0x7b,0x15,0x1c,0x01,0x31,0x26, -0x24,0x1e,0x31,0x0f,0x10,0x3f,0x3b,0x03,0x3f,0x3c,0x56,0x37,0x1b,0x1a,0x33,0x4d,0x32,0x31,0x4f,0x43,0x3a,0x1d,0xfe,0xd2,0x26,0x42,0x1e,0x26,0x46,0x1f,0x02,0xec,0xfc,0x00,0x01,0xf6,0x41,0x7a,0x3e,0x31,0x68,0x43,0x24,0x2f,0x2f,0x35,0x24,0x3f,0x23,0x23,0x46,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x07, -0x00,0x22,0x40,0x10,0x07,0x03,0x7e,0x04,0x01,0x01,0x04,0x02,0x91,0x07,0x07,0x04,0x05,0x03,0x04,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0xfa,0xfd,0x6a,0xa8,0xa8,0x03,0x25,0x97,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x00,0x00,0x01,0x00,0xa6, -0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x07,0x00,0x22,0x40,0x10,0x07,0x03,0x84,0x04,0x00,0x00,0x04,0x02,0x95,0x07,0x07,0x04,0x05,0x0f,0x04,0x15,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0x04,0xfe,0x46,0xa4,0xa4,0x02,0x5c,0x8b,0xfe,0x2f,0x04, -0x00,0xfe,0x5c,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x38,0x04,0x18,0x00,0x15,0x00,0x1f,0x00,0x35,0xb9,0x00,0x1f,0x01,0x2e,0x40,0x18,0x0e,0x07,0x0e,0x07,0x04,0x13,0x83,0x1a,0x1a,0x21,0x09,0x83,0x04,0x1d,0x95,0x10,0x10,0x07,0x0f,0x16,0x0d,0x95,0x01,0x16,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f, -0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x00,0x35,0x10,0x37,0x33,0x06,0x11,0x14,0x16,0x33,0x33,0x11,0x10,0x21,0x32,0x12,0x15,0x14,0x00,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x03,0x36,0xd2,0xec,0xfe,0xe8,0xd2,0xc2,0xec,0xbf,0x9b,0x1e,0x01,0x12,0xbc,0xea,0xfe,0xe7,0xfe,0xf5,0x22,0x98,0xc2, -0x93,0x67,0x82,0x18,0x01,0x20,0xf6,0x01,0x3b,0xc7,0xd8,0xfe,0xd2,0xb8,0xce,0x02,0x95,0x01,0x0f,0xfe,0xd7,0xfb,0xe9,0xfe,0xdd,0x8c,0xd3,0xb5,0xb4,0xdc,0x81,0x00,0x00,0x02,0x00,0xaf,0x03,0xf9,0x02,0x48,0x05,0xf5,0x00,0x03,0x00,0x0f,0x00,0x22,0xb3,0x0d,0xc0,0x07,0x01,0xb8,0x01,0x32,0x40,0x09,0x02,0x0a,0xc1,0x04,0x04,0x02, -0x03,0x03,0x02,0x00,0x2f,0x33,0x2f,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x48,0x6d,0xc9,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x05,0xf5,0xfe,0x04,0x01,0xfc,0xfe,0xa0,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x00,0x00,0x02, -0x00,0xaf,0x03,0xfd,0x02,0xa0,0x05,0xee,0x00,0x13,0x00,0x17,0x00,0x28,0x40,0x14,0x14,0x14,0x16,0x16,0x0c,0xc0,0x02,0x07,0xc1,0x0f,0x11,0x1f,0x11,0x02,0x11,0x11,0x15,0x17,0x17,0x15,0x00,0x2f,0x33,0x2f,0x11,0x33,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x33,0x2f,0x33,0x2f,0x31,0x30,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02, -0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x01,0x27,0x01,0xcc,0x1d,0x0f,0x19,0x24,0x15,0x15,0x24,0x1b,0x10,0x11,0x1b,0x25,0x13,0x12,0x24,0x01,0xc6,0xfe,0x99,0x4d,0x01,0x67,0x05,0x47,0x1d,0x29,0x13,0x24,0x1a,0x10,0x11,0x1c,0x23,0x13,0x14,0x23,0x1a,0x10,0x0f,0x2c,0xfe,0x98,0x4d,0x01,0x68,0x00,0x00,0x02,0x00,0xaf,0x04,0x2b, -0x02,0xab,0x05,0xc4,0x00,0x03,0x00,0x0f,0x00,0x27,0x40,0x14,0x0a,0xc0,0x04,0x04,0x01,0x00,0x00,0x01,0x07,0xc1,0x0d,0x40,0x09,0x0e,0x48,0x0d,0x0d,0x02,0xe7,0x01,0x00,0x2f,0xed,0x33,0x2f,0x2b,0xed,0x01,0x2f,0x33,0x2f,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x25,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22, -0x26,0x02,0xab,0xfe,0x04,0x01,0xfc,0xfe,0xa0,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x04,0x2b,0x6d,0xc9,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x00,0x01,0x00,0x75,0x04,0xfe,0x03,0x69,0x06,0x58,0x00,0x05,0x00,0x18,0x40,0x0a,0x04,0xea,0x01,0x01,0x02,0x05,0x05,0x03,0xbe,0x02,0x00,0x2f,0xed,0x33,0x2f,0x01,0x2f,0x33,0x2f,0xed, -0x31,0x30,0x01,0x11,0x21,0x35,0x21,0x35,0x03,0x69,0xfd,0x0c,0x02,0x5f,0x06,0x58,0xfe,0xa6,0x95,0xc5,0x00,0x01,0x00,0x75,0x04,0x7c,0x04,0x54,0x06,0x58,0x00,0x09,0x00,0x25,0x40,0x11,0x09,0xea,0x00,0x00,0x04,0x07,0x07,0x03,0xea,0x04,0x08,0x02,0xbe,0x05,0x05,0x00,0x04,0x00,0x2f,0x33,0x33,0x2f,0xed,0x32,0x01,0x2f,0xed,0x33, -0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x02,0x23,0xfe,0xe7,0x95,0x03,0xdf,0xfe,0x64,0x04,0x7d,0x01,0x46,0xfe,0xb9,0x01,0xdc,0x95,0xfe,0xba,0x00,0x00,0x01,0x00,0x75,0x04,0x7c,0x04,0x54,0x06,0x58,0x00,0x09,0x00,0x27,0x40,0x12,0x00,0xea,0x09,0x09,0x05,0x02,0x02,0x06,0xea,0x05, -0x01,0x07,0xbe,0x04,0x09,0x05,0x05,0x04,0x00,0x2f,0x33,0x2f,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x33,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x11,0x02,0xb8,0x01,0x9c,0xfc,0x21,0x95,0x01,0x19,0x06,0x57,0xfe,0xba,0x95,0x01,0xdc,0xfe,0xb9,0x01,0x46,0x00,0x00,0x01,0x00,0x00,0xfd,0xff, -0x03,0x57,0x02,0x5e,0x00,0x23,0x00,0x34,0xb1,0x05,0x1f,0xb8,0x05,0x0a,0x40,0x09,0x16,0x1f,0x05,0x02,0x2f,0x1b,0x01,0x1b,0x11,0xb8,0x04,0xfb,0xb6,0x1f,0x0b,0x2f,0x0b,0x02,0x0b,0x00,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x31,0x30,0x25,0x15,0x23,0x22, -0x26,0x27,0x07,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x03,0x57,0x16,0x3f,0x4a,0x19,0x05,0x44,0x78,0xa5,0x61,0x33,0x6c,0x39,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1d,0x2c,0x0e,0x06,0x1c,0x30,0x49,0x99,0xa7,0x24,0x21,0x01, -0x8c,0xd5,0x8e,0x48,0x16,0x17,0xa5,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x4b,0xa0,0x51,0x23,0x34,0x22,0x10,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0x07,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00, -0x00,0x07,0x0f,0x53,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0xb9,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xaf,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57, -0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x90,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xf2,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xe1,0x04,0x31,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x09,0xf7,0x65, -0x00,0x0a,0xb4,0x01,0x2f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf2,0xfe,0x00,0x00,0x06,0x0f,0x50,0xce,0x05,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0x07,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9a, -0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xbc,0x02,0x26,0x0b,0x0c, -0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x02,0x06,0x09,0x28,0x00,0x00,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x03,0xd7,0x02,0x06,0x08,0xf3,0x00,0x00,0x00,0x03,0x00,0x79,0xfe,0x1e,0x06,0xf3,0x06,0x02,0x00,0x13,0x00,0x37,0x00,0x3b,0x00,0x1f,0x40,0x0e,0x28,0x23, -0x37,0x0a,0x00,0x23,0x00,0x23,0x00,0x38,0x3a,0x00,0x38,0x1b,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xd6,0xcd,0x11,0x33,0x31,0x30,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x13,0x26,0x26,0x35,0x34,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x1e,0x02,0x15, -0x14,0x0e,0x04,0x15,0x14,0x16,0x17,0x13,0x09,0x02,0x03,0x91,0x16,0x26,0x1c,0x10,0x11,0x1d,0x25,0x15,0x16,0x26,0x1d,0x10,0x12,0x1d,0x26,0x5b,0x08,0x13,0x2b,0x40,0x4b,0x40,0x2b,0x34,0x57,0x72,0x3e,0x87,0x7c,0x67,0x89,0x24,0x40,0x30,0x1c,0x2a,0x3e,0x49,0x3e,0x2a,0x0c,0x0b,0x78,0xfc,0xc3,0x03,0x3d,0x03,0x3d,0x89,0x12,0x1d, -0x25,0x14,0x15,0x26,0x1d,0x11,0x12,0x1d,0x26,0x14,0x16,0x26,0x1c,0x10,0x01,0x63,0x15,0x3d,0x25,0x2d,0x49,0x45,0x44,0x4f,0x5f,0x3d,0x40,0x60,0x40,0x21,0x54,0x9e,0x6d,0x12,0x24,0x35,0x22,0x2e,0x4d,0x46,0x43,0x4a,0x54,0x34,0x22,0x43,0x15,0xfd,0x44,0x03,0xf2,0x03,0xf2,0xfc,0x0e,0x00,0x00,0x01,0x00,0x3f,0x04,0xc1,0x03,0x26, -0x05,0xba,0x00,0x17,0x00,0x1e,0x40,0x0e,0x0c,0x00,0x0d,0x07,0x96,0x12,0x12,0x17,0x96,0x0c,0x0f,0x02,0x01,0x02,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x01,0x2f,0xc4,0xcd,0x31,0x30,0x01,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x03,0x26,0x29,0x3f,0x88,0x81,0x71,0x29, -0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x38,0x7e,0x7f,0x7d,0x37,0x05,0x40,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0x00,0xff,0xff,0x00,0x5e,0xff,0x3f,0x06,0x25,0x05,0xb2,0x02,0x06,0x00,0x34,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x29,0x04,0x10,0x04,0x18,0x02,0x06,0x00,0x54,0x00,0x00, -0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x02,0x06,0x00,0x3a,0x00,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x02,0x06,0x00,0x5a,0x00,0x00,0x00,0x01,0x00,0xb0,0xff,0xe8,0x04,0x9d,0x05,0xb1,0x00,0x36,0x00,0x57,0x40,0x2e,0x29,0x7d,0x16,0x2f,0x7d,0x0b,0x2c,0x11,0x16,0x01,0x11,0x16,0x0b,0x0b,0x16,0x11, -0x01,0x04,0x38,0x1d,0x7e,0x1e,0x2c,0x10,0x11,0x11,0x10,0x92,0x59,0x11,0x11,0x06,0x24,0x34,0x06,0x91,0x59,0x34,0x13,0x24,0x19,0x91,0x59,0x24,0x04,0x1e,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10, -0xe1,0x10,0xe1,0x31,0x30,0x25,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x04,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x01,0xf6,0x17,0x3a,0x3e,0x40,0x1d,0x3c,0x62,0x46,0x27,0x37,0x71, -0xab,0x74,0x4c,0x7a,0x56,0x2f,0x84,0x77,0x8e,0x90,0xa8,0x4f,0x83,0xa8,0x59,0x5e,0x99,0x6d,0x3b,0x9c,0x98,0x01,0xaf,0x43,0x74,0x9e,0x5c,0x56,0x72,0x0d,0xad,0x0c,0x15,0x11,0x09,0x21,0x40,0x61,0x40,0x41,0x6e,0x54,0x34,0x07,0x7a,0x09,0x2b,0x45,0x61,0x3f,0x66,0x63,0x8d,0x9d,0xfc,0x0f,0x04,0x09,0x79,0xa2,0x63,0x2a,0x2f,0x57, -0x78,0x4a,0x86,0xae,0x29,0x05,0x47,0xfe,0xb3,0x5b,0x93,0x66,0x37,0x16,0xff,0xff,0xfc,0x8c,0x04,0xa7,0xff,0x4c,0x07,0x68,0x00,0x07,0x00,0x0d,0xfc,0x40,0x01,0xce,0xff,0xff,0x00,0x4a,0xff,0xec,0x06,0xd9,0x05,0xb0,0x00,0x26,0x00,0xf0,0xfa,0x00,0x00,0x27,0x00,0xbc,0x03,0x03,0x00,0x00,0x01,0x07,0x00,0xf2,0x04,0x4b,0xfd,0xb9, -0x00,0x07,0xb2,0x02,0x30,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x8d,0xff,0xec,0x06,0xd7,0x05,0xae,0x00,0x26,0x00,0xf1,0x25,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x00,0xf2,0x04,0x49,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x43,0x2d,0x00,0x3f,0x35,0x00,0x00,0x01,0x00,0x96,0x01,0x08,0x06,0x00,0x03,0xa4,0x00,0x09, -0x00,0x1b,0x40,0x0c,0x09,0x08,0x01,0x07,0x03,0x04,0x02,0x05,0x04,0x00,0xbe,0x09,0x00,0x2f,0xed,0x01,0x2f,0x2f,0xcd,0x11,0x17,0x39,0x2f,0x31,0x30,0x01,0x21,0x17,0x15,0x01,0x35,0x01,0x15,0x07,0x21,0x06,0x00,0xfb,0x5a,0x7b,0xfe,0xc1,0x01,0x3f,0x7d,0x04,0xa8,0x02,0x12,0x76,0x94,0x01,0x4c,0x04,0x01,0x4c,0x94,0x78,0x00,0x01, -0x00,0x96,0xff,0xf4,0x03,0x31,0x05,0x5e,0x00,0x09,0x00,0x10,0xb6,0x08,0x01,0x07,0x03,0x03,0x04,0x00,0x00,0x2f,0x2f,0xcd,0x17,0x39,0x31,0x30,0x05,0x11,0x07,0x23,0x01,0x33,0x01,0x23,0x27,0x11,0x01,0xa0,0x77,0x93,0x01,0x4b,0x04,0x01,0x4c,0x93,0x79,0x0c,0x04,0xa4,0x79,0x01,0x3f,0xfe,0xc1,0x7b,0xfb,0x5a,0x00,0x01,0x00,0xe7, -0x01,0x08,0x06,0x52,0x03,0xa4,0x00,0x09,0x00,0x17,0x40,0x0a,0x01,0x02,0x08,0x03,0x07,0x05,0x00,0x09,0xbe,0x00,0x00,0x2f,0xed,0x01,0x2f,0x2f,0xcd,0x17,0x39,0x31,0x30,0x13,0x21,0x27,0x35,0x01,0x15,0x01,0x35,0x37,0x21,0xe7,0x04,0xa6,0x7b,0x01,0x40,0xfe,0xc0,0x79,0xfb,0x5c,0x02,0x98,0x78,0x94,0xfe,0xb4,0x04,0xfe,0xb4,0x94, -0x76,0x00,0x00,0x01,0x00,0x96,0xff,0xf6,0x03,0x31,0x05,0x60,0x00,0x09,0x00,0x10,0xb6,0x09,0x01,0x02,0x08,0x03,0x06,0x05,0x00,0x2f,0xcd,0x17,0x39,0x2f,0x31,0x30,0x01,0x11,0x37,0x33,0x01,0x23,0x01,0x33,0x17,0x11,0x02,0x25,0x79,0x93,0xfe,0xb4,0x04,0xfe,0xb5,0x93,0x77,0x05,0x60,0xfb,0x58,0x7d,0xfe,0xc1,0x01,0x3f,0x7b,0x04, -0xa6,0x00,0x00,0x01,0x00,0x96,0x01,0x08,0x06,0x50,0x03,0xa4,0x00,0x0f,0x00,0x1f,0x40,0x0f,0x01,0x0a,0x0b,0x03,0x00,0x0e,0x09,0x02,0x08,0x03,0x03,0x06,0x02,0xbe,0x09,0x00,0x2f,0xed,0x01,0x2f,0xcd,0x17,0x39,0x2f,0xcd,0x17,0x39,0x31,0x30,0x01,0x37,0x21,0x17,0x15,0x01,0x35,0x01,0x15,0x07,0x21,0x27,0x35,0x01,0x15,0x01,0x05, -0x10,0x79,0xfb,0xd1,0x7b,0xfe,0xc1,0x01,0x3f,0x7d,0x04,0x33,0x7b,0x01,0x40,0xfe,0xc0,0x01,0x9c,0x76,0x76,0x94,0x01,0x4c,0x04,0x01,0x4c,0x94,0x78,0x78,0x94,0xfe,0xb4,0x04,0xfe,0xb4,0xff,0xff,0x00,0x33,0x00,0x00,0x04,0xf8,0x05,0x9a,0x02,0x06,0x00,0xa9,0x00,0x00,0x00,0x01,0x00,0xe6,0x00,0x00,0x04,0x92,0x03,0xac,0x00,0x05, -0x00,0x13,0xb7,0x02,0xbd,0x05,0x03,0x02,0xbe,0x05,0x00,0x00,0x2f,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x31,0x30,0x13,0x33,0x11,0x21,0x15,0x21,0xe6,0x84,0x03,0x28,0xfc,0x54,0x03,0xac,0xfc,0xd7,0x83,0x00,0x01,0x00,0xe6,0x00,0x6a,0x04,0xb7,0x04,0x4f,0x00,0x19,0x00,0x1e,0x40,0x0d,0x13,0x14,0x14,0x1b,0x06,0x07,0x00,0x0d,0x14,0x10, -0x07,0x01,0x07,0x00,0x2f,0x5d,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x02,0xc8,0x48,0x7f,0x5f,0x38,0x84,0x55,0x8a,0xb0,0x5a,0x5d,0xb0,0x88,0x53,0x84,0x3c,0x64,0x83,0x03,0xd1,0x31,0x65,0x9a, -0x69,0xfe,0x32,0x01,0xcf,0x8a,0xc9,0x83,0x40,0x40,0x83,0xc9,0x8a,0xfe,0x31,0x01,0xce,0x66,0x99,0x67,0x33,0x00,0x00,0x03,0x00,0xe6,0x00,0x70,0x04,0xac,0x04,0x3a,0x00,0x13,0x00,0x27,0x00,0x3b,0x00,0x2e,0x40,0x17,0x37,0xaf,0x2d,0x23,0xaf,0x19,0x2d,0x19,0x2d,0x19,0x3d,0x0f,0xaf,0x05,0x28,0xb0,0x32,0x10,0x1e,0x0a,0xb0,0x14, -0x00,0x00,0x2f,0x32,0xed,0x32,0x3f,0xed,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x31,0x30,0x25,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32, -0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x55,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x02,0xcf,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0xfe,0x76,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x70,0x12,0x1e,0x29,0x17,0x17,0x29, -0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x02,0xe9,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x01,0x00,0xe6,0x00,0x6a,0x05,0x38,0x04,0x3b,0x00,0x1b,0x00,0x2e,0x40,0x16,0x15,0x0f,0x1a,0x13, -0x16,0xea,0x08,0x05,0x0f,0xbe,0x0e,0x0e,0x07,0x1a,0xbe,0x1b,0x1b,0x16,0x06,0xbe,0x13,0x07,0x00,0x2f,0x33,0xed,0x32,0x32,0x2f,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0xed,0x32,0x2f,0x33,0x33,0x31,0x30,0x25,0x22,0x2e,0x02,0x27,0x23,0x35,0x33,0x3e,0x03,0x33,0x21,0x15,0x21,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x21, -0x15,0x03,0xa8,0x6a,0xb3,0x87,0x53,0x0a,0xc1,0xc1,0x0c,0x5b,0x8a,0xb0,0x60,0x01,0x90,0xfe,0x80,0xad,0xc1,0x11,0x02,0xff,0xfd,0x01,0x11,0xcb,0xc1,0x01,0x62,0x6a,0x37,0x6b,0x9f,0x69,0x84,0x68,0x9d,0x69,0x35,0x84,0x8d,0x92,0x84,0x93,0x93,0x84,0x00,0x01,0x00,0xa5,0x00,0x00,0x06,0x3f,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb3,0x03, -0x02,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x11,0x21,0xa5,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfa,0x66,0x00,0x01,0x00,0xa5,0x00,0x00,0x07,0x5b,0x04,0xac,0x00,0x03,0x00,0x0d,0xb3,0x03,0x02,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x11,0x21,0xa5,0x06,0xb6,0xf9,0x4a,0x04,0xac,0xfb,0x54, -0x00,0x01,0x00,0x50,0x00,0x00,0x06,0x94,0x05,0x9a,0x00,0x02,0x00,0x0d,0xb3,0x01,0x02,0x00,0x02,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x01,0x21,0x03,0x72,0x03,0x22,0xf9,0xbc,0x05,0x9a,0xfa,0x66,0x00,0x01,0x00,0xa5,0x01,0x61,0x06,0x3f,0x04,0x39,0x00,0x02,0x00,0x0d,0xb3,0x01,0x00,0x02,0x01,0x00,0x2f,0x2f,0x01,0x2f, -0x2f,0x31,0x30,0x01,0x01,0x11,0x06,0x3f,0xfa,0x66,0x02,0xcd,0xfe,0x94,0x02,0xd8,0x00,0x01,0x00,0x50,0x00,0x00,0x06,0x94,0x05,0x9a,0x00,0x02,0x00,0x0d,0xb3,0x01,0x00,0x02,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x01,0x50,0x06,0x44,0xfc,0xde,0x05,0x9a,0xfa,0x66,0x00,0x00,0x01,0x00,0xa5,0x01,0x61,0x06,0x3f, -0x04,0x39,0x00,0x02,0x00,0x0d,0xb3,0x01,0x02,0x01,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x11,0x01,0x06,0x3f,0xfa,0x66,0x04,0x39,0xfd,0x28,0x01,0x6c,0x00,0x02,0x00,0x8c,0xff,0xe7,0x06,0x58,0x05,0xb2,0x00,0x1b,0x00,0x33,0x00,0x15,0xb7,0x0e,0x28,0x1c,0x00,0x21,0x15,0x2f,0x07,0x00,0x2f,0xcd,0x2f,0xcd,0x01,0x2f, -0xcd,0x2f,0xcd,0x31,0x30,0x13,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x04,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x8c,0x35,0x60,0x87,0xa5,0xbe,0x66,0x66,0xbe,0xa5,0x88,0x61,0x35,0x35,0x61,0x88,0xa5,0xbe,0x66,0x67,0xbd,0xa5,0x87,0x60,0x35,0x7c,0x61, -0xa7,0xe1,0x80,0x55,0x9f,0x89,0x71,0x51,0x2c,0x2c,0x51,0x71,0x89,0x9f,0x55,0x80,0xe1,0xa7,0x61,0x02,0xcc,0x66,0xbe,0xa5,0x87,0x61,0x35,0x35,0x61,0x87,0xa5,0xbe,0x66,0x67,0xbd,0xa5,0x87,0x60,0x35,0x35,0x60,0x87,0xa5,0xbe,0x66,0x80,0xe1,0xa7,0x61,0x2c,0x50,0x70,0x8a,0x9e,0x55,0x55,0x9f,0x89,0x71,0x50,0x2c,0x61,0xa8,0xe1, -0x00,0x02,0x02,0x0d,0x00,0x00,0x04,0xd7,0x05,0x9a,0x00,0x03,0x00,0x17,0x00,0x1a,0x40,0x0a,0x0e,0x02,0x04,0x03,0x13,0x09,0x13,0x09,0x03,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xcd,0xdd,0xcd,0x31,0x30,0x01,0x21,0x11,0x21,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x02,0x0d, -0x02,0xca,0xfd,0x36,0x64,0x28,0x46,0x5d,0x36,0x35,0x5d,0x46,0x29,0x29,0x46,0x5d,0x35,0x36,0x5d,0x46,0x28,0x05,0x9a,0xfa,0x66,0x02,0xcd,0x35,0x5e,0x46,0x28,0x28,0x46,0x5e,0x35,0x35,0x5e,0x46,0x28,0x28,0x46,0x5e,0x00,0x03,0x00,0xa5,0x00,0x00,0x06,0x3f,0x05,0x9a,0x00,0x03,0x00,0x1d,0x00,0x31,0x00,0x1f,0x40,0x0d,0x1e,0x04, -0x03,0x28,0x12,0x02,0x2d,0x0b,0x03,0x22,0x23,0x17,0x00,0x00,0x2f,0xdd,0xce,0x3f,0xdd,0xce,0x01,0x2f,0xdd,0xce,0x2f,0xdd,0xce,0x31,0x30,0x13,0x21,0x11,0x21,0x13,0x14,0x1e,0x04,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x17,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0xa5, -0x05,0x9a,0xfa,0x66,0x64,0x2c,0x50,0x70,0x89,0x9d,0x55,0x55,0x9f,0x89,0x71,0x51,0x2c,0x61,0xa8,0xe2,0x80,0x55,0x9d,0x89,0x70,0x50,0x2c,0x67,0x51,0x8b,0xba,0x6a,0x6b,0xbc,0x8c,0x51,0x51,0x8c,0xbc,0x6b,0x6a,0xba,0x8b,0x51,0x05,0x9a,0xfa,0x66,0x02,0xcb,0x55,0x9d,0x89,0x70,0x50,0x2c,0x2c,0x50,0x70,0x89,0x9d,0x55,0x80,0xe2, -0xa8,0x61,0x2c,0x51,0x71,0x89,0x9f,0x55,0x6b,0xbc,0x8c,0x51,0x51,0x8c,0xbc,0x6b,0x6a,0xbb,0x8b,0x50,0x50,0x8b,0xbb,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x05,0x1c,0x05,0xb2,0x00,0x2b,0x00,0x1e,0x40,0x0d,0x0f,0x1c,0x1c,0x07,0x24,0x07,0x0c,0x1f,0x1f,0x16,0x22,0x00,0x26,0x00,0x3f,0x3f,0x39,0x2f,0x33,0x01,0x2f,0x2f,0x12,0x39, -0x2f,0xcd,0x31,0x30,0x01,0x1e,0x05,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x1e,0x03,0x17,0x15,0x21,0x35,0x3e,0x03,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x02,0xc1,0x2c,0x7b,0x86,0x84,0x69,0x41,0x34,0x55,0x6d,0x39,0x37,0x63,0x27,0x04,0x15,0x26,0x36,0x25,0xfd,0xee,0x25,0x36,0x26,0x15,0x04,0x27,0x63, -0x37,0x39,0x6d,0x55,0x34,0x41,0x69,0x84,0x86,0x7b,0x2c,0x05,0xb2,0x34,0x6b,0x76,0x82,0x93,0xa6,0x5f,0x52,0x7e,0x55,0x2c,0x1c,0x20,0x22,0x4c,0x4c,0x4a,0x1f,0x4b,0x4b,0x1f,0x4a,0x4c,0x4c,0x22,0x20,0x1c,0x2c,0x55,0x7e,0x52,0x5f,0xa6,0x93,0x82,0x76,0x6c,0x33,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x05,0x1c,0x05,0x9a,0x00,0x38, -0x00,0x1c,0x40,0x0b,0x32,0x06,0x06,0x10,0x28,0x10,0x2d,0x0b,0x0b,0x1c,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x31,0x30,0x21,0x35,0x3e,0x03,0x35,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02, -0x23,0x22,0x2e,0x02,0x27,0x14,0x1e,0x02,0x17,0x15,0x01,0xb4,0x1c,0x36,0x2a,0x1a,0x13,0x25,0x2a,0x31,0x1f,0x41,0x73,0x55,0x31,0x2d,0x53,0x73,0x45,0x10,0x2d,0x52,0x72,0x46,0x46,0x72,0x52,0x2d,0x10,0x45,0x73,0x53,0x2d,0x31,0x55,0x73,0x41,0x1f,0x31,0x2a,0x25,0x13,0x19,0x2a,0x36,0x1d,0x4b,0x17,0x46,0x5c,0x72,0x44,0x0d,0x14, -0x0f,0x08,0x2c,0x51,0x74,0x48,0x41,0x71,0x55,0x32,0x01,0x34,0x37,0x40,0x73,0x55,0x32,0x32,0x55,0x73,0x40,0x37,0x34,0x01,0x32,0x55,0x71,0x41,0x48,0x74,0x51,0x2c,0x08,0x0f,0x14,0x0d,0x44,0x72,0x5c,0x46,0x17,0x4b,0x00,0x01,0x00,0x5e,0x00,0x78,0x05,0x1c,0x05,0x23,0x00,0x23,0x00,0x0d,0xb3,0x05,0x14,0x19,0x0c,0x00,0x2f,0x2f, -0x01,0x2f,0x2f,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x07,0x23,0x2e,0x05,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x3e,0x03,0x03,0xea,0x3b,0x6f,0x55,0x33,0x40,0x68,0x83,0x86,0x7d,0x2d,0x09,0x2d,0x7c,0x86,0x83,0x68,0x40,0x33,0x55,0x6f,0x3b,0x39,0x5b,0x49,0x37,0x14,0x09,0x14,0x38,0x49,0x5b,0x05,0x23, -0x2b,0x57,0x84,0x5a,0x64,0xad,0x98,0x85,0x79,0x6f,0x35,0x35,0x6f,0x79,0x85,0x98,0xad,0x64,0x5a,0x84,0x57,0x2b,0x1e,0x33,0x41,0x22,0x22,0x41,0x33,0x1e,0x00,0x01,0x00,0xcd,0x00,0x00,0x04,0xae,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb3,0x02,0x00,0x03,0x01,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x09,0x02,0xcd,0x01,0xf0,0x01, -0xf1,0xfe,0x0f,0x02,0xcc,0x02,0xce,0xfd,0x32,0xfd,0x34,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x2c,0x05,0xb2,0x00,0x16,0x00,0x2d,0x00,0x2d,0x40,0x17,0x13,0x12,0x7e,0x10,0x28,0x28,0x2f,0x1c,0x7d,0x05,0x13,0x10,0x03,0x17,0x91,0x0f,0x0a,0x04,0x21,0x91,0x14,0x00,0x13,0x00,0x3f,0x32,0xed,0x3f,0x33,0xed,0x3f,0x2f,0x01,0x2f, -0xe1,0x12,0x39,0x2f,0x33,0xe1,0x33,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x11,0x23,0x35,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x11,0x34,0x2e,0x02,0x02,0xb9,0x86,0xde,0x9f,0x58,0x5c,0xaa,0xef,0x94,0x4e,0x80,0x66,0x4d,0x1c,0xa8, -0xa8,0x40,0xe1,0x80,0x6c,0xad,0x7a,0x42,0x42,0x79,0xa9,0x66,0x33,0x67,0x5f,0x53,0x3d,0x23,0x3b,0x6e,0x99,0x18,0x6a,0xbf,0x01,0x0b,0xa0,0xac,0x01,0x18,0xc6,0x6c,0x21,0x39,0x4b,0x2a,0xb7,0xfa,0x66,0xd6,0x6d,0x81,0x05,0x32,0x56,0x9c,0xd9,0x84,0x84,0xd9,0x9a,0x55,0x13,0x2c,0x48,0x6a,0x90,0x5d,0x01,0x0d,0x6c,0xa2,0x6c,0x36, -0xff,0xff,0x00,0x0e,0x00,0x00,0x04,0x9a,0x04,0x18,0x02,0x06,0x05,0xef,0x00,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x08,0x74,0x05,0xb2,0x00,0x2c,0x00,0x54,0x40,0x2b,0x25,0x24,0x1c,0x2c,0x01,0x00,0x19,0x15,0x14,0x06,0x0a,0x09,0x10,0x24,0x2c,0x19,0x06,0x10,0x10,0x06,0x19,0x2c,0x24,0x05,0x2e,0x0c,0x0b,0x27,0x92,0x40,0x25,0x80, -0x21,0x04,0x14,0x05,0x0b,0x03,0x18,0x0f,0x01,0x0a,0x12,0x00,0x3f,0x33,0x33,0x33,0x3f,0x33,0x33,0x3f,0x1a,0xcc,0x1a,0xed,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01, -0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x3e,0x03,0x33,0x32,0x16,0x17,0x23,0x26,0x23,0x22,0x0e,0x02,0x07,0x05,0xcb,0xc5,0xfe,0xd9,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x14,0x04,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x05,0x16,0xe1, -0x12,0x32,0x45,0x5c,0x3c,0x69,0x79,0x0b,0x9a,0x0c,0x47,0x16,0x23,0x1b,0x17,0x0b,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x35,0x55,0x03,0x54,0x46,0x68,0x44,0x22,0x79,0x79,0x63,0x16,0x29,0x3d,0x27,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x06,0x97, -0x04,0x18,0x00,0x2c,0x00,0x54,0x40,0x2b,0x0a,0x09,0x11,0x15,0x14,0x06,0x01,0x00,0x19,0x1d,0x2c,0x26,0x25,0x11,0x06,0x19,0x2c,0x25,0x25,0x2c,0x19,0x06,0x11,0x05,0x2e,0x0c,0x0b,0x29,0x95,0x40,0x26,0x80,0x22,0x10,0x14,0x05,0x0b,0x0f,0x18,0x10,0x01,0x0a,0x15,0x00,0x3f,0x33,0x33,0x33,0x3f,0x33,0x33,0x3f,0x1a,0xcc,0x1a,0xed, -0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x03,0x26,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x3e,0x03,0x33,0x32,0x16,0x17,0x23,0x26, -0x26,0x23,0x22,0x06,0x07,0x04,0x7d,0xaa,0xd3,0x06,0x08,0x02,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x05,0x07,0x02,0x08,0x03,0x0f,0xec,0x96,0xd4,0x0b,0x04,0x08,0x01,0x09,0x07,0x9a,0x0d,0x26,0x38,0x4e,0x35,0x5b,0x6b,0x0b,0x96,0x04,0x23,0x1c,0x21,0x2a,0x14,0x02,0xdd,0x15,0x30,0x1a,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc, -0xfe,0x11,0x2e,0x1d,0x2d,0x31,0x03,0x00,0xfc,0xfc,0x26,0x36,0x14,0x2e,0x1a,0x02,0x46,0x32,0x4f,0x38,0x1d,0x6d,0x6f,0x2a,0x2a,0x3f,0x46,0x00,0x00,0x01,0x00,0x96,0x03,0x82,0x03,0x31,0x05,0xd3,0x00,0x09,0x00,0x0d,0xb3,0x09,0x00,0x00,0x04,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x01,0x11,0x07,0x23,0x01,0x33,0x01,0x23,0x27, -0x11,0x01,0xa0,0x77,0x93,0x01,0x4b,0x04,0x01,0x4c,0x93,0x79,0x03,0x82,0x01,0x8b,0x79,0x01,0x3f,0xfe,0xc1,0x7b,0xfe,0x73,0x00,0x01,0x00,0x96,0x03,0x82,0x03,0x31,0x05,0xd3,0x00,0x09,0x00,0x0d,0xb3,0x00,0x09,0x04,0x09,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x01,0x11,0x37,0x33,0x01,0x23,0x01,0x33,0x17,0x11,0x02,0x25,0x79, -0x93,0xfe,0xb4,0x04,0xfe,0xb5,0x93,0x77,0x05,0xd3,0xfe,0x73,0x7b,0xfe,0xc1,0x01,0x3f,0x79,0x01,0x8b,0x00,0x02,0x00,0xb4,0x03,0x83,0x01,0x92,0x06,0x89,0x00,0x03,0x00,0x0f,0x00,0x20,0x40,0x0f,0x00,0x03,0x03,0x0d,0x07,0x02,0x50,0x0a,0x01,0x0a,0x00,0x04,0x01,0x04,0x03,0x00,0x2f,0xd4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33, -0x2f,0xcd,0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x77,0x13,0x87,0x12,0x58,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x06,0x89,0xfe,0x2d,0x01,0xd3,0xfc,0xfa,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x00,0x02,0x00,0xb4,0x03,0x83,0x01,0x92,0x06,0x89,0x00,0x03,0x00,0x0f, -0x00,0x20,0x40,0x0f,0x03,0x00,0x00,0x07,0x0d,0x02,0x5f,0x0a,0x01,0x0a,0x00,0x03,0x01,0x03,0x04,0x00,0x2f,0xc4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x31,0x30,0x13,0x13,0x33,0x13,0x03,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0xcb,0x12,0x87,0x13,0x54,0x2d,0x42,0x42,0x2d,0x2e,0x41,0x41,0x03,0x83, -0x01,0xd3,0xfe,0x2d,0x03,0x06,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x02,0x00,0xb4,0x01,0xd5,0x01,0x92,0x04,0xdb,0x00,0x03,0x00,0x0f,0x00,0x23,0x40,0x0f,0x03,0x00,0x00,0x07,0x0d,0x01,0x5f,0x0a,0x01,0x0a,0x00,0x00,0x01,0x00,0x04,0xb8,0x01,0x3a,0x00,0x3f,0xc4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x31, -0x30,0x13,0x13,0x33,0x13,0x03,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0xcb,0x12,0x87,0x13,0x54,0x2d,0x42,0x42,0x2d,0x2e,0x41,0x41,0x01,0xd5,0x01,0xd3,0xfe,0x2d,0x03,0x06,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x00,0x01,0x00,0x63,0xfe,0x3e,0x02,0x95,0xff,0x89,0x00,0x06,0x00,0x18,0x40,0x0c,0x00,0x04, -0x04,0x80,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f,0xc4,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x02,0x95,0x78,0xa4,0xa6,0x70,0xd6,0x86,0xfe,0x3e,0xe5,0xe5,0x01,0x4b,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x02,0x06,0x00,0x1d,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x3e, -0x03,0x9a,0x03,0x6c,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0b,0x00,0x01,0x04,0x05,0x04,0x05,0xbe,0x06,0x01,0xbe,0x02,0x00,0x2f,0xed,0xd6,0xed,0x01,0x2f,0x2f,0x11,0x39,0x39,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x9a,0xfd,0x4e,0x02,0xb2,0xfd,0x4e,0x02,0xb2,0x02,0xe8,0x84,0xfd,0xd2,0x84,0x00,0x01,0x00,0x94, -0x02,0xc3,0x01,0x43,0x05,0x9a,0x00,0x03,0x00,0x1c,0x40,0x0e,0x00,0x7d,0x03,0x04,0x0d,0x06,0x4d,0x03,0x03,0x05,0x04,0x01,0x00,0x03,0x00,0x3f,0xcd,0x11,0x12,0x01,0x39,0x2f,0x2b,0xe1,0x31,0x30,0x01,0x03,0x23,0x03,0x01,0x43,0x1e,0x73,0x1e,0x05,0x9a,0xfd,0x29,0x02,0xd7,0x00,0xff,0xff,0x00,0xa3,0x03,0xdb,0x01,0x34,0x05,0x9a, -0x02,0x06,0x00,0x0a,0x00,0x00,0x00,0x01,0x03,0x9b,0xfe,0x80,0x04,0x36,0x00,0x00,0x00,0x03,0x00,0x0d,0xb3,0x01,0x00,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x21,0x33,0x11,0x23,0x03,0x9b,0x9b,0x9b,0xfe,0x80,0x00,0x00,0x01,0x02,0xd6,0xfe,0x8a,0x03,0x64,0x00,0x00,0x00,0x03,0x00,0x0d,0xb3,0x01,0x00,0x03,0x00,0x00, -0x2f,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x21,0x33,0x11,0x23,0x02,0xd6,0x8e,0x8e,0xfe,0x8a,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x00,0xb9,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x2f,0xb9,0x00,0x00,0x01,0x51,0xb2,0x06,0x06,0x0c,0xb8,0x01,0x51,0xb3,0x12,0x12,0x19,0x03,0xbb,0x01,0x55,0x00,0x09,0x00,0x0f,0x01,0x55,0xb2,0x15,0x15,0x19, -0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x01,0x33,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x35,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0x5a,0x2a,0x31,0x2f,0x2c, -0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x05,0x00,0x00,0xfd,0xff,0x02,0xdd,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b,0x00,0x00,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26, -0x35,0x34,0x36,0x33,0x32,0x16,0x35,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x14,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x10,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x33,0x29,0x2a,0x33,0x31, -0x2a,0x2a,0x34,0xfe,0x67,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0xe2, -0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x37,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0xb8,0x01,0x51,0xb7,0x06,0x1b,0x1a,0x18,0x1b,0x1b,0x09,0x0f,0xbb,0x01,0x55,0x00,0x15,0x00,0x03,0x01,0x55,0xb2,0x09,0x09,0x1d,0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xcd,0x01,0x2f,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30, -0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x25,0x21,0x35,0x21,0x02,0xdd,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xce,0xfe,0x50,0x01,0xb0,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce, -0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb1,0x66,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0xe1,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x1f,0x00,0x40,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0xb8,0x01,0x51,0x40,0x0c,0x06,0x1f,0x19,0x1e,0x1c,0x1c,0x1a,0x19,0x1f,0x1f,0x09,0x0f,0xbb,0x01,0x55,0x00,0x15,0x00,0x03,0x01,0x55,0xb2, -0x09,0x09,0x21,0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xdd,0xcd,0x33,0x01,0x2f,0xcd,0xdd,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30,0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x25,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x02,0xdd,0x33,0x29, -0x2a,0x33,0x31,0x2a,0x2a,0x34,0x04,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xcf,0xa5,0x66,0xa5,0x01,0xb0,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb1,0xdf,0xdf,0x66,0x00,0x00,0x01,0x00,0x00,0xff,0x04,0x00,0xb9,0xff,0xbb,0x00,0x0b,0x00,0x1d,0xb9,0x00,0x00,0x01,0x51,0xb3, -0x06,0x06,0x0d,0x03,0xb8,0x01,0x55,0xb2,0x09,0x09,0x0d,0x11,0x00,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xed,0x30,0x31,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x02,0x00,0x00,0xff,0x04,0x01,0xd6,0xff,0xbb,0x00,0x0b, -0x00,0x17,0x00,0x2f,0xbc,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x0c,0x01,0x51,0xb3,0x12,0x12,0x19,0x03,0xb8,0x01,0x55,0xb2,0x09,0x09,0x0f,0xb8,0x01,0x55,0xb2,0x15,0x15,0x19,0x11,0x00,0x33,0x2f,0xed,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde,0xed,0x30,0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05, -0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0xd6,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xe3,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x01,0xd6,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23, -0x00,0x45,0xb9,0x00,0x00,0x01,0x51,0xb3,0x06,0x06,0x1e,0x0c,0xbb,0x01,0x51,0x00,0x12,0x00,0x18,0x01,0x51,0xb3,0x1e,0x1e,0x25,0x03,0xbe,0x01,0x55,0x00,0x09,0x00,0x1b,0x01,0x55,0x00,0x21,0x00,0x0f,0x01,0x55,0xb4,0x15,0x15,0x21,0x21,0x25,0x11,0x00,0x33,0x2f,0x33,0x2f,0xed,0x10,0xfd,0xde,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde, -0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x37,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x48,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x8e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xe3, -0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0x5a,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0x00,0x00,0xff,0x38,0x01,0xb0,0xff,0x9e,0x00,0x03,0x00,0x11,0xb5,0x00,0x02,0x00,0x02,0x02,0x05,0x11,0x00,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x30, -0x31,0x05,0x21,0x35,0x21,0x01,0xb0,0xfe,0x50,0x01,0xb0,0xc8,0x66,0x00,0x00,0x01,0x00,0x00,0xfe,0x59,0x01,0xb0,0xff,0x9e,0x00,0x07,0x00,0x1a,0x40,0x0a,0x07,0x01,0x06,0x04,0x02,0x01,0x04,0x06,0x06,0x09,0x11,0x00,0x33,0x2f,0xdd,0x32,0xcd,0x01,0x2f,0xcd,0xdd,0xcd,0x30,0x31,0x05,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x01,0xb0, -0xa5,0x66,0xa5,0x01,0xb0,0xc8,0xdf,0xdf,0x66,0x00,0x00,0x01,0xff,0xa4,0x05,0x4e,0x00,0x5d,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5d,0x33,0x29,0x2a,0x33, -0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0x77,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3d,0xbf,0x00,0x18,0x01,0x51,0x00,0x1e,0x00,0x0c,0x01,0x51,0x00,0x12,0x00,0x00,0x01,0x51,0xb3,0x06,0x06,0x25,0x1b,0xbe,0x01,0x55,0x00,0x21,0x00,0x0f,0x01,0x55,0x00, -0x15,0x00,0x03,0x01,0x55,0xb2,0x09,0x09,0x25,0x11,0x00,0x33,0x2f,0xed,0xdc,0xed,0xdc,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde,0xfd,0xde,0xed,0x30,0x31,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32, -0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xdf,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xdf,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xaf,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb0,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xff,0xa5,0x02,0x18,0x00,0x5e,0x02,0xcf,0x00,0x0b, -0x00,0x15,0xbd,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x00,0x2f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x02,0x73,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0xcd,0xfe,0x09,0x00,0x33,0xff,0xb1, -0x00,0x03,0x00,0x11,0xb5,0x03,0x02,0x00,0x03,0x03,0x05,0x11,0x00,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x13,0x23,0x11,0x33,0x33,0x66,0x66,0xfe,0x09,0x01,0xa8,0x00,0x01,0x00,0x4b,0x04,0x38,0x02,0xe8,0x04,0xcd,0x00,0x03,0x00,0x14,0xb5,0x03,0x05,0x02,0x04,0x01,0x03,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x11,0x01,0x33,0x11,0x33, -0x30,0x31,0x01,0x21,0x37,0x21,0x02,0xd0,0xfd,0x7b,0x18,0x02,0x85,0x04,0x38,0x95,0x00,0x01,0xfe,0xd2,0x05,0x6b,0x01,0x31,0x05,0xd5,0x00,0x03,0x00,0x0d,0xb3,0x03,0x01,0x03,0x01,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x01,0x21,0x35,0x21,0x01,0x31,0xfd,0xa1,0x02,0x5f,0x05,0x6b,0x6a,0x00,0x01,0x00,0x94,0xff,0x9d,0x01,0x09, -0x05,0x30,0x00,0x03,0x00,0x15,0xbd,0x00,0x03,0x01,0x50,0x00,0x02,0x00,0x03,0x01,0x4b,0x00,0x00,0x00,0x2f,0x3f,0x01,0x2f,0xed,0x30,0x31,0x05,0x23,0x11,0x33,0x01,0x09,0x75,0x75,0x63,0x05,0x93,0x00,0x01,0x02,0x00,0x05,0x4e,0x02,0xb9,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00, -0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x02,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xfd,0x3c,0x05,0x4e,0xfd,0xf5,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00, -0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xfd,0xf5,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x36,0x40,0x12, -0x00,0xb0,0x06,0x10,0x12,0xb0,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0xff,0x9c,0x05,0x77,0x00,0x67,0x06,0x40,0x00,0x0b,0x00,0x17,0xbe,0x00, -0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x67,0x38,0x2d,0x2e,0x38,0x36,0x2e,0x2e,0x39,0x05,0xdb,0x2e,0x36,0x34,0x30,0x2e,0x37,0x34,0x00,0x00,0x01,0xff,0x9c,0xfe,0x8d,0x00,0x67,0xff,0x56,0x00,0x0b, -0x00,0x19,0xbc,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x03,0x01,0x57,0xb2,0x09,0x09,0x0d,0x11,0x00,0x33,0x2f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x67,0x38,0x2d,0x2e,0x38,0x36,0x2e,0x2e,0x39,0xfe,0xf1,0x2e,0x36,0x34,0x30,0x2e,0x37,0x34,0x00,0x00,0x01,0x00,0xa5,0x00,0x00, -0x04,0x9a,0x04,0xd4,0x00,0x28,0x00,0x51,0x40,0x0b,0x1e,0x28,0x17,0x00,0x15,0x08,0x16,0x01,0x01,0x00,0x23,0xb8,0x01,0x50,0xb7,0x20,0x20,0x0f,0x2a,0x17,0x16,0x16,0x0e,0xb8,0x01,0x50,0x40,0x0a,0x0f,0x15,0x08,0x1e,0x28,0x04,0x16,0x17,0x17,0x21,0xbb,0x01,0x4a,0x00,0x0f,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0x2f,0x33, -0x17,0x39,0x01,0x2f,0xed,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0xed,0xc4,0x32,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x2e,0x05,0x27,0x0e,0x03,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x37,0x03,0x37,0x1e,0x03,0x17,0x16,0x17,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x07,0x04,0x9a,0xc5,0x2f,0x51,0x4b,0x4a,0x54, -0x61,0x3c,0x28,0x32,0x1c,0x09,0xa9,0x17,0x34,0x52,0x3c,0xdb,0x8e,0x2d,0x5a,0x54,0x4e,0x22,0x4f,0x46,0xae,0xaa,0x21,0x41,0x61,0x41,0x45,0x75,0x6e,0x6c,0x77,0x88,0x53,0x27,0x4c,0x51,0x5d,0x38,0xfe,0x73,0x01,0x98,0x4c,0x77,0x68,0x5f,0x33,0x01,0x38,0x47,0x3c,0x79,0x74,0x6d,0x30,0x70,0x66,0x63,0xd5,0x01,0x5d,0xfe,0xc1,0x52, -0x85,0x6d,0x5a,0x29,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0x3c,0x04,0xde,0x00,0x24,0x00,0x38,0xb2,0x07,0x07,0x00,0xb8,0x01,0x50,0xb7,0x06,0x12,0x12,0x26,0x09,0x19,0x19,0x16,0x41,0x09,0x01,0x54,0x00,0x1a,0x00,0x1f,0x01,0x4b,0x00,0x06,0x00,0x0a,0x01,0x54,0x00,0x09,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f, -0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x07,0x21,0x07,0x21,0x37,0x21,0x32,0x3e,0x04,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xee,0x17,0x28,0x38,0x20,0x34,0x01,0x19,0x16,0xfc,0x2e,0x18,0x01,0xa6,0x44,0x62,0x44,0x29,0x17,0x07,0xc0,0xb0,0x69, -0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7,0x8f,0x4f,0x02,0x66,0x54,0x7b,0x5d,0x47,0x1f,0x32,0xa2,0xa2,0x33,0x52,0x65,0x64,0x59,0x1b,0x86,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x01,0x00,0x31,0x00,0x00,0x03,0x17,0x04,0xcd,0x00,0x25,0x00,0x43,0xb3,0x17,0x02,0x02,0x00,0xb8,0x01,0x50, -0xb6,0x01,0x01,0x0b,0x27,0x1e,0x1e,0x0a,0xbb,0x01,0x50,0x00,0x0b,0x00,0x02,0x01,0x56,0xb3,0x17,0x17,0x00,0x1e,0xbd,0x01,0x54,0x00,0x1f,0x01,0x4a,0x00,0x0b,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x33,0x11,0x33,0x31,0x30,0x21,0x23,0x03,0x06,0x06, -0x07,0x0e,0x03,0x07,0x23,0x36,0x37,0x3e,0x03,0x37,0x3e,0x03,0x37,0x03,0x2e,0x03,0x23,0x23,0x37,0x33,0x32,0x1e,0x02,0x17,0x03,0x17,0xa1,0x28,0x4d,0x7b,0x28,0x19,0x29,0x20,0x18,0x0a,0xa9,0x13,0x19,0x0b,0x18,0x1c,0x1f,0x10,0x24,0x54,0x61,0x6b,0x3a,0x1b,0x06,0x2a,0x44,0x5b,0x38,0xc5,0x16,0xaa,0x62,0x99,0x6d,0x3f,0x07,0x01, -0xe0,0x14,0x4e,0x2f,0x1d,0x4f,0x59,0x5e,0x2c,0x4d,0x47,0x1e,0x41,0x3f,0x38,0x15,0x2f,0x45,0x35,0x29,0x13,0x01,0x0e,0x36,0x4c,0x31,0x17,0x91,0x24,0x51,0x84,0x60,0x00,0x01,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x00,0x14,0x00,0x2d,0xb1,0x04,0x14,0xb8,0x01,0x50,0x40,0x09,0x00,0x0c,0x00,0x0c,0x16,0x0a,0x0e,0x04,0x0a,0xbc, -0x01,0x54,0x00,0x0b,0x01,0x4a,0x00,0x00,0x01,0x4d,0x00,0x3f,0x3f,0xed,0x32,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x31,0x30,0x21,0x11,0x34,0x36,0x37,0x22,0x0e,0x02,0x23,0x21,0x37,0x21,0x07,0x23,0x22,0x0e,0x02,0x15,0x11,0x02,0x2e,0x42,0x39,0x0c,0x26,0x27,0x23,0x0a,0xfd,0xfd,0x18,0x03,0x73,0x19,0x37,0x28,0x33, -0x1e,0x0b,0x03,0x32,0x5b,0x81,0x30,0x02,0x02,0x02,0x95,0x95,0x29,0x3e,0x46,0x1e,0xfc,0x93,0x00,0x02,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x00,0x17,0x00,0x1b,0x00,0x38,0xb9,0x00,0x00,0x01,0x50,0xb3,0x01,0x01,0x1d,0x18,0xb8,0x01,0x50,0xb5,0x19,0x0c,0x0c,0x19,0x0c,0x07,0xb8,0x01,0x54,0xb2,0x1b,0x0d,0x12,0xbb,0x01,0x4b, -0x00,0x19,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0xc4,0xed,0x32,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x01,0x23,0x11,0x37,0x04,0xc0,0xab,0x34,0x61,0x8d,0x59,0x3a,0x86,0x83,0x75,0x2a,0x13,0x30,0x73, -0x7f,0x88,0x46,0x6e,0xbc,0x8c,0x4f,0xfc,0xae,0xa9,0xa9,0x02,0xea,0x65,0x88,0x52,0x22,0x0c,0x13,0x17,0x0a,0xa5,0x09,0x10,0x0d,0x08,0x36,0x77,0xba,0x84,0xfd,0x0d,0x02,0xc9,0x51,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x17,0xbe,0x00,0x00,0x01,0x50,0x00,0x01,0x00,0x00,0x01,0x4d,0x00,0x02,0x01, -0x4a,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x04,0xcd,0x00,0x00,0x01,0x00,0x31,0x00,0x00,0x02,0x5f,0x04,0xcd,0x00,0x20,0x00,0x2a,0xb4,0x18,0x0c,0x00,0x00,0x06,0xb8,0x01,0x50,0xb4,0x1e,0x0d,0x13,0x00,0x1e,0xbc,0x01,0x54,0x00,0x1f,0x01,0x4a,0x00,0x0c,0x01,0x4d,0x00,0x3f,0x3f,0xed, -0x32,0x01,0x2f,0x33,0xc6,0xed,0x32,0x2f,0x32,0x32,0x31,0x30,0x01,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x13,0x23,0x03,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x22,0x0e,0x02,0x23,0x23,0x37,0x21,0x02,0x5f,0x31,0x31,0x49,0x31,0x18,0x06,0x07,0x09,0x03,0x6f,0xb1,0x6f,0x02,0x07,0x06,0x04,0x09,0x1e,0x3b,0x31,0x18,0x3b,0x39, -0x33,0x10,0x53,0x13,0x02,0x1b,0x04,0x38,0x1d,0x35,0x4a,0x2c,0x12,0x35,0x39,0x36,0x13,0xfd,0x59,0x02,0xb4,0x0e,0x29,0x31,0x34,0x17,0x1a,0x3c,0x3a,0x34,0x12,0x02,0x01,0x02,0x95,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x04,0xba,0x04,0xde,0x00,0x17,0x00,0x30,0xb9,0x00,0x00,0x01,0x50,0xb3,0x01,0x01,0x19,0x0b,0xb8,0x01,0x50,0xb2, -0x0c,0x0a,0x07,0xbe,0x01,0x54,0x00,0x0d,0x00,0x12,0x01,0x4b,0x00,0x0c,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x04,0xba,0xab,0x34,0x60,0x8a,0x57,0x53,0xa4,0x3c, -0xa9,0x30,0x7f,0x86,0x83,0x35,0x7f,0xc4,0x86,0x46,0x02,0xf8,0x63,0x82,0x4d,0x1e,0x14,0x0c,0xfb,0xd8,0x04,0xad,0x0a,0x12,0x0d,0x08,0x36,0x77,0xba,0x84,0x00,0x01,0x00,0xa0,0xff,0xed,0x05,0x01,0x04,0xdd,0x00,0x29,0x00,0x3e,0xb9,0x00,0x00,0x01,0x50,0xb6,0x17,0x20,0x17,0x20,0x17,0x2b,0x0d,0xb8,0x01,0x50,0xb2,0x0a,0x20,0x1d, -0x41,0x0a,0x01,0x54,0x00,0x21,0x00,0x24,0x01,0x4b,0x00,0x0b,0x01,0x4a,0x00,0x12,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x34, -0x2e,0x02,0x23,0x22,0x06,0x07,0x37,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x05,0x01,0x52,0x98,0xd8,0x86,0x7c,0xc7,0x8c,0x4a,0xaa,0x22,0x54,0x90,0x6d,0x67,0x99,0x66,0x33,0x26,0x47,0x63,0x3d,0x35,0x5e,0x30,0x15,0x2c,0x5d,0x41,0x52,0x95,0x72,0x43,0x02,0x56,0x87,0xe3,0xa3,0x5c,0x52,0x9d,0xe6,0x94,0x02,0x77,0xfd,0x96,0x54,0xaa, -0x8a,0x56,0x49,0x7d,0xa5,0x5c,0x8f,0x4c,0x84,0x62,0x39,0x07,0x09,0x94,0x08,0x0b,0x47,0x86,0xc0,0x79,0x00,0x01,0x00,0xbe,0x02,0x27,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x14,0xb9,0x00,0x00,0x01,0x50,0xb2,0x01,0x00,0x02,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x01,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x02,0x27, -0x02,0xa6,0x00,0x01,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x00,0x13,0x00,0x27,0xb9,0x00,0x00,0x01,0x50,0xb5,0x01,0x01,0x15,0x08,0x08,0x05,0xbd,0x01,0x54,0x00,0x09,0x00,0x0e,0x01,0x4b,0x00,0x00,0x01,0x4f,0x00,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x07, -0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xcd,0xab,0xc0,0xb0,0x69,0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7,0x8f,0x4f,0xfe,0x00,0x04,0xea,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x00,0x01,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x00,0x25,0x00,0x35,0xb9,0x00,0x00,0x01,0x50,0xb6, -0x11,0x11,0x27,0x08,0x1b,0x1b,0x16,0x41,0x0a,0x01,0x54,0x00,0x1c,0x00,0x21,0x01,0x4b,0x00,0x09,0x00,0x0c,0x01,0x54,0x00,0x08,0x00,0x03,0x01,0x4e,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0x33,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x22,0x2e,0x02,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34, -0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x03,0xeb,0xfe,0xcb,0xfe,0xc4,0x28,0x53,0x4b,0x3d,0x12,0x15,0x2f,0x81,0x46,0x77,0xae,0x72,0x37,0x33,0x6e,0xab,0x78,0x1b,0x4d,0x53,0x51,0x20,0x14,0x1d,0x4a,0x4f,0x51,0x24,0x91,0xe2,0x9a,0x51,0x02,0x5f,0xfe,0xc7,0xfe,0xc7,0x07,0x0b,0x0d,0x07,0x8d,0x0a, -0x12,0x38,0x75,0xb4,0x7d,0x76,0xb5,0x7b,0x40,0x04,0x07,0x0b,0x06,0x8f,0x08,0x0d,0x09,0x05,0x4b,0x9d,0xf1,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x00,0x2b,0x00,0x39,0xb9,0x00,0x00,0x01,0x50,0xb6,0x1d,0x0e,0x1d,0x0e,0x1d,0x2d,0x26,0x41,0x0c,0x01,0x50,0x00,0x23,0x00,0x23,0x01,0x54,0x00,0x26,0x01,0x4a,0x00, -0x24,0x01,0x4c,0x00,0x0f,0x01,0x54,0x00,0x0e,0x01,0x4d,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x03,0x0e,0x03,0x07,0x0e,0x03,0x07,0x37,0x32,0x3e,0x02,0x37,0x3e,0x03,0x37,0x13,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x21,0x11,0x33,0x11,0x21,0x32,0x1e,0x02, -0x03,0xeb,0x05,0x02,0x1c,0x06,0x1a,0x2d,0x41,0x2d,0x2f,0x7e,0x85,0x7e,0x2f,0x32,0x1a,0x48,0x4f,0x4f,0x1f,0x25,0x38,0x27,0x18,0x05,0x1b,0x01,0x05,0x22,0x3f,0x5a,0x37,0xfe,0x0a,0xa9,0x01,0x6e,0x56,0x8c,0x63,0x36,0x03,0x95,0x1c,0x3e,0x13,0xfe,0xe1,0x3b,0x76,0x6c,0x60,0x25,0x27,0x29,0x13,0x03,0x01,0x8e,0x03,0x0b,0x15,0x12, -0x15,0x42,0x53,0x5f,0x31,0x01,0x1a,0x0a,0x38,0x19,0x30,0x4a,0x32,0x1a,0x02,0x68,0xfe,0x2d,0x2f,0x54,0x72,0x00,0x00,0x02,0x00,0xbe,0x00,0x00,0x04,0xe2,0x04,0xde,0x00,0x0b,0x00,0x16,0x00,0x36,0xb9,0x00,0x00,0x01,0x50,0xb3,0x0c,0x0c,0x18,0x16,0xb8,0x01,0x50,0xb2,0x02,0x15,0x12,0x41,0x09,0x01,0x54,0x00,0x03,0x00,0x06,0x01, -0x4b,0x00,0x00,0x00,0x16,0x01,0x54,0x00,0x02,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x07,0x21,0x11,0x36,0x24,0x33,0x32,0x1e,0x02,0x15,0x03,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x04,0xe2,0x31,0xfc,0x0d,0x80,0x01,0x00,0x86,0x82,0xca,0x8a,0x48,0xab,0x37, -0x69,0x96,0x60,0x6a,0x9c,0x34,0xa9,0xa9,0x04,0xac,0x17,0x1b,0x42,0x7e,0xb6,0x75,0xfd,0xaf,0x02,0x53,0x5b,0x80,0x52,0x26,0x14,0x0b,0xfc,0x79,0x00,0x01,0x00,0xa4,0xff,0xed,0x04,0xe8,0x04,0xe5,0x00,0x33,0x00,0x4b,0xb9,0x00,0x00,0x01,0x50,0x40,0x09,0x11,0x08,0x11,0x08,0x35,0x28,0x27,0x2b,0x22,0xb8,0x01,0x50,0xb2,0x23,0x21, -0x19,0x41,0x0d,0x01,0x54,0x00,0x2b,0x00,0x2e,0x01,0x4a,0x00,0x27,0x00,0x28,0x01,0x4b,0x00,0x23,0x01,0x4d,0x00,0x0c,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x32,0xc6,0x32,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x16,0x16, -0x33,0x32,0x3e,0x02,0x35,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x07,0x06,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x04,0xe8,0x31,0x60,0x8e,0x5c,0x35,0x62,0x26,0x2c,0x21,0x40,0x28,0x38,0x51,0x35,0x1a,0x0e,0x21,0x38,0x52,0x71,0x4a,0x2c,0x5f,0x57,0x4a,0x17,0x09,0x0f, -0xa9,0x0a,0x17,0x94,0x16,0x1a,0x02,0x4a,0xba,0x75,0x7e,0xc1,0x83,0x43,0x01,0xb9,0x6f,0xab,0x75,0x3d,0x13,0x11,0x85,0x08,0x09,0x2a,0x4c,0x69,0x40,0xf8,0x30,0x64,0x5f,0x54,0x3e,0x25,0x15,0x29,0x3d,0x29,0x11,0x27,0x14,0xfc,0xaa,0x03,0xf5,0x2e,0x55,0x2d,0x40,0x20,0x54,0x3f,0x50,0x5c,0x52,0x94,0xcc,0x7a,0x00,0x01,0x00,0xbe, -0xfd,0xff,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x17,0xbe,0x00,0x00,0x01,0x50,0x00,0x01,0x00,0x00,0x01,0x4f,0x00,0x02,0x01,0x4a,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0xfd,0xff,0x06,0xce,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x02,0x87,0x04,0xde,0x00,0x19,0x00,0x33,0xb9,0x00,0x00,0x01, -0x50,0x40,0x09,0x03,0x03,0x01,0x1b,0x0e,0x0e,0x01,0x0e,0x09,0xbf,0x01,0x54,0x00,0x0f,0x00,0x12,0x01,0x4b,0x00,0x02,0x01,0x54,0x00,0x01,0x01,0x4d,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x37,0x21,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x36,0x36,0x33, -0x32,0x1e,0x04,0x15,0x02,0x87,0xfd,0xe0,0x13,0x01,0x62,0x0d,0x2b,0x52,0x44,0x0f,0x24,0x24,0x1f,0x08,0x18,0x1c,0x56,0x25,0x45,0x65,0x49,0x2f,0x1b,0x0b,0xa2,0x02,0x7b,0x41,0x6d,0x50,0x2c,0x02,0x03,0x04,0x02,0x94,0x06,0x08,0x22,0x3e,0x54,0x64,0x71,0x3a,0x00,0x02,0x00,0x96,0xff,0xed,0x04,0xf7,0x04,0xde,0x00,0x14,0x00,0x27, -0x00,0x32,0xb9,0x00,0x00,0x01,0x50,0xb3,0x15,0x15,0x29,0x1e,0xb8,0x01,0x50,0xb2,0x0a,0x1d,0x1a,0xbf,0x01,0x54,0x00,0x0b,0x00,0x10,0x01,0x4b,0x00,0x23,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x3e,0x03, -0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x04,0xf7,0x4f,0x96,0xd9,0x8a,0x89,0xca,0x85,0x41,0x3c,0x87,0x8f,0x92,0x45,0x8c,0xd5,0x8f,0x48,0xab,0x2f,0x63,0x9a,0x6b,0x63,0xc4,0x4f,0x22,0x55,0x90,0x6d,0x6f,0x9c,0x61,0x2d,0x02,0x56,0x82,0xe1,0xa7,0x5f,0x5b,0xa4,0xe3, -0x87,0x02,0x59,0x09,0x11,0x0d,0x08,0x61,0xac,0xee,0x8d,0x68,0xb5,0x85,0x4d,0x10,0x0b,0xfe,0x39,0x54,0xaa,0x8a,0x56,0x55,0x86,0xa5,0x00,0x01,0x00,0x59,0xff,0x94,0x04,0x2b,0x04,0xcd,0x00,0x17,0x00,0x3a,0xb2,0x10,0x0d,0x00,0xb8,0x01,0x50,0xb5,0x0d,0x0e,0x15,0x15,0x19,0x0f,0xb8,0x01,0x51,0xb7,0x0e,0x08,0x08,0x0e,0x0d,0x10, -0x16,0x0e,0xbb,0x01,0x4a,0x00,0x08,0x01,0x54,0x00,0x07,0x00,0x2f,0xed,0x3f,0x33,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x04,0x07,0x27,0x3e,0x03,0x37,0x01,0x33,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x2b,0x4d,0x86,0xb4,0xcd,0xdb,0x6b,0x2f,0x31,0x68,0x65,0x5f, -0x28,0xfe,0x72,0xb6,0x01,0x70,0x38,0x5e,0x46,0x27,0xa9,0x02,0x64,0x91,0xd3,0x95,0x61,0x3f,0x27,0x10,0xa5,0x05,0x0d,0x13,0x17,0x0d,0x04,0x4b,0xfb,0xe8,0x1b,0x46,0x5f,0x7c,0x50,0x02,0x8c,0x00,0x00,0x01,0x00,0x6c,0xfd,0xff,0x04,0x39,0x04,0xde,0x00,0x1b,0x00,0x3d,0xb9,0x00,0x00,0x01,0x50,0xb6,0x01,0x0e,0x01,0x0e,0x01,0x1d, -0x0d,0xbb,0x01,0x50,0x00,0x10,0x00,0x10,0x01,0x54,0xb4,0x0d,0x0d,0x1c,0x0c,0x07,0xbc,0x01,0x54,0x00,0x11,0x00,0x16,0x01,0x4b,0x00,0x00,0x00,0x2f,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x11,0x21,0x07,0x21, -0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x04,0x39,0xab,0x30,0x6a,0xaa,0x7a,0x16,0x34,0x33,0x2e,0x11,0x01,0x18,0x19,0xfe,0x59,0x24,0x57,0x5e,0x5f,0x2c,0xa5,0xeb,0x94,0x45,0xfd,0xff,0x04,0x73,0x81,0xb3,0x70,0x32,0x04,0x06,0x08,0x04,0xfe,0x65,0x96,0x02,0xaa,0x0b,0x12,0x0e,0x08,0x47,0x98,0xec,0xa5,0x00,0x00,0x01,0x00,0x96, -0xff,0xed,0x04,0x9c,0x04,0xde,0x00,0x27,0x00,0x51,0xb9,0x00,0x00,0x01,0x50,0xb6,0x13,0x1b,0x13,0x1b,0x13,0x29,0x1a,0xb8,0x01,0x50,0xb4,0x1d,0x0a,0x0a,0x1d,0x1d,0xb8,0x01,0x54,0xb4,0x1a,0x1a,0x0e,0x19,0x16,0x41,0x0a,0x01,0x54,0x00,0x1e,0x00,0x23,0x01,0x4b,0x00,0x0b,0x00,0x0e,0x01,0x54,0x00,0x0a,0x00,0x05,0x01,0x4e,0x00, -0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0x32,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x02,0x23,0x22,0x06,0x07,0x11,0x21,0x07,0x21,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x04,0x9c,0x54, -0x9c,0xde,0x8a,0x2d,0x70,0x74,0x70,0x2d,0x1c,0x4b,0xbc,0x7d,0x6a,0xa4,0x71,0x3a,0xca,0xd4,0x5c,0x94,0x26,0x01,0x4c,0x1c,0xfe,0x2b,0x2c,0x71,0x75,0x70,0x2c,0x8f,0xdf,0x9a,0x50,0x02,0x59,0xa0,0xea,0x98,0x4a,0x06,0x0c,0x14,0x0e,0x96,0x14,0x1c,0x32,0x6d,0xaf,0x7e,0xf2,0x01,0x03,0x11,0x0b,0xfe,0x7f,0x96,0x02,0x8b,0x0f,0x17, -0x10,0x08,0x50,0xa1,0xf2,0x00,0x00,0x01,0x00,0x1e,0xfd,0xff,0x04,0x03,0x04,0xe5,0x00,0x22,0x00,0x44,0xb3,0x17,0x09,0x06,0x0a,0xb8,0x01,0x50,0xb4,0x0b,0x0b,0x12,0x20,0x00,0xb8,0x01,0x50,0x40,0x0e,0x1f,0x1c,0x1c,0x24,0x13,0x12,0x12,0x13,0x13,0x17,0x06,0x0a,0x1f,0x20,0xba,0x01,0x4b,0x00,0x0a,0x01,0x4f,0x00,0x3f,0x3f,0x33, -0x12,0x39,0x39,0x33,0x2f,0x33,0x01,0x2f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x32,0x32,0x32,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x07,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x01,0x37,0x01,0x16,0x16,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x04,0x03,0x1e,0x44,0x70,0x52,0x61,0x05,0x02, -0xa9,0x0a,0x17,0x27,0x1e,0xfe,0xa8,0xab,0x01,0x36,0x1d,0x32,0x0c,0x4a,0x63,0x3b,0x19,0x1d,0x14,0xa3,0x17,0x1f,0x03,0xd4,0x59,0x96,0x7a,0x61,0x24,0x2b,0x26,0x50,0x20,0xfc,0xda,0x03,0x23,0x3a,0x62,0x5a,0x54,0x2d,0x02,0x05,0x40,0xfe,0x1f,0x2d,0x6b,0x2d,0x20,0x4e,0x60,0x72,0x44,0x4c,0x72,0x29,0x42,0x32,0x8e,0x00,0x00,0x01, -0x00,0x4b,0x00,0x00,0x04,0x25,0x04,0xd4,0x00,0x14,0x00,0x4e,0xb3,0x05,0x0d,0x0c,0x06,0xb8,0x01,0x51,0xb3,0x0a,0x0a,0x08,0x00,0xb8,0x01,0x50,0x40,0x10,0x12,0x12,0x08,0x16,0x0c,0x0b,0x0b,0x08,0x05,0x0d,0x06,0x0c,0x13,0x13,0x0b,0x0c,0xbd,0x01,0x4a,0x00,0x06,0x00,0x09,0x01,0x54,0x00,0x08,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f, -0x33,0x33,0x2f,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x13,0x07,0x21,0x37,0x21,0x01,0x37,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x25,0x28,0x48,0x64,0x3c,0xdc,0x2c,0xfc,0x86,0x2d,0x02,0xb3,0xfd,0x39,0x9a,0x01,0xc9,0x23,0x41, -0x32,0x1e,0xaa,0x03,0xd4,0x60,0x94,0x77,0x62,0x2f,0xfe,0xca,0xa2,0xa2,0x03,0xee,0x44,0xfd,0x74,0x15,0x42,0x5c,0x76,0x47,0x01,0x15,0x00,0x02,0x00,0x42,0xfd,0xff,0x04,0xd2,0x04,0xde,0x00,0x29,0x00,0x2d,0x00,0x46,0xb9,0x00,0x00,0x01,0x50,0xb6,0x15,0x09,0x15,0x09,0x15,0x2f,0x2a,0xb8,0x01,0x50,0xb2,0x1f,0x2b,0x2a,0xb8,0x01, -0x4f,0xb4,0x2c,0x2c,0x0a,0x1f,0x1a,0xbf,0x01,0x54,0x00,0x20,0x00,0x25,0x01,0x4b,0x00,0x0a,0x01,0x54,0x00,0x09,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x3f,0x01,0x2f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x07,0x0e,0x03,0x07,0x37,0x3e,0x03,0x37,0x37,0x3e,0x03,0x35, -0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x01,0x23,0x11,0x33,0x04,0xd2,0x02,0x02,0x08,0x10,0x60,0x9f,0xdf,0x90,0x15,0x5e,0x99,0x72,0x47,0x0c,0x0d,0x01,0x01,0x01,0x01,0x2a,0x58,0x88,0x5f,0x5b,0xa4,0x9b,0x97,0x4e,0x20,0x2d,0x7f,0x9a,0xad,0x5a,0x91,0xcf,0x85,0x3e,0xfc,0x9c,0xa9,0xa9,0x03, -0x4a,0x10,0x35,0x11,0x68,0xb7,0xf7,0x9a,0x4c,0x0b,0xa1,0x0b,0x35,0x69,0xaa,0x80,0x8a,0x09,0x1a,0x1b,0x1a,0x09,0x44,0x61,0x3e,0x1d,0x0a,0x11,0x18,0x0e,0xa6,0x06,0x10,0x0d,0x0a,0x32,0x65,0x97,0xfa,0x4f,0x04,0xe2,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x00,0x13,0x00,0x27,0xb9,0x00,0x00,0x01,0x50,0xb5,0x01,0x01, -0x15,0x08,0x08,0x05,0xbd,0x01,0x54,0x00,0x09,0x00,0x0e,0x01,0x4b,0x00,0x00,0x01,0x4d,0x00,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xcd,0xab,0xc0,0xb0,0x69,0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7, -0x8f,0x4f,0x02,0xea,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x05,0xd8,0x04,0xcd,0x00,0x31,0x00,0x56,0xbc,0x00,0x00,0x01,0x50,0x00,0x31,0x00,0x1b,0x01,0x50,0x40,0x0d,0x1a,0x31,0x1a,0x31,0x1a,0x33,0x0c,0x26,0x25,0x25,0x0e,0x0e,0x0d,0xb8,0x01,0x51,0xb2,0x0b,0x0c, -0x25,0xb8,0x01,0x54,0xb3,0x0e,0x0e,0x00,0x26,0xba,0x01,0x54,0x00,0x0b,0x01,0x4d,0xb2,0x1a,0x0c,0x00,0xb8,0x01,0x4a,0x00,0x3f,0x32,0x32,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x07,0x06,0x06,0x07,0x0e,0x03,0x23,0x21, -0x03,0x33,0x13,0x3e,0x05,0x37,0x36,0x36,0x37,0x36,0x37,0x33,0x06,0x07,0x06,0x06,0x07,0x0e,0x03,0x07,0x17,0x21,0x32,0x3e,0x02,0x37,0x36,0x36,0x37,0x36,0x37,0x05,0xd8,0x06,0x0a,0x08,0x1a,0x14,0x13,0x4f,0x7e,0xaf,0x73,0xfd,0x97,0xb9,0xb3,0x6b,0x3b,0x5f,0x4a,0x38,0x2a,0x1d,0x09,0x05,0x0a,0x05,0x05,0x05,0xb0,0x04,0x05,0x05, -0x0a,0x06,0x0e,0x3e,0x76,0xb9,0x89,0x18,0x01,0xd6,0x3c,0x6b,0x58,0x40,0x10,0x16,0x1c,0x08,0x0a,0x05,0x04,0xcd,0x33,0x54,0x48,0xe8,0xab,0xa8,0xeb,0x94,0x44,0x04,0xcd,0xfd,0x0e,0x12,0x24,0x31,0x44,0x61,0x85,0x5a,0x2e,0x5d,0x26,0x2d,0x29,0x24,0x2c,0x26,0x62,0x39,0x8a,0xc9,0x93,0x66,0x27,0xa7,0x27,0x64,0xad,0x85,0xa6,0xea, -0x4c,0x59,0x39,0x00,0x00,0x01,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x00,0x2d,0x00,0x47,0xb2,0x22,0x22,0x0b,0xb8,0x01,0x50,0xb3,0x1e,0x1e,0x15,0x00,0xb8,0x01,0x50,0x40,0x09,0x01,0x01,0x2f,0x15,0x22,0x0a,0x0a,0x1f,0x07,0x41,0x09,0x01,0x54,0x00,0x23,0x00,0x28,0x01,0x4b,0x00,0x1a,0x01,0x54,0x00,0x12,0x01,0x4e,0x00,0x01, -0x00,0x2f,0x3f,0xed,0x3f,0x33,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x06,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x05, -0x23,0xab,0x39,0x71,0xaa,0x71,0x33,0x6f,0x39,0x04,0x12,0x24,0x42,0x64,0x48,0x1d,0x3e,0x21,0x13,0x14,0x20,0x0f,0x2e,0x3e,0x27,0x11,0x2c,0x4c,0x1e,0x13,0x37,0x81,0x8f,0x9a,0x4f,0x7c,0xd5,0x9d,0x5a,0x02,0xea,0x61,0x86,0x54,0x26,0x08,0x06,0xfd,0x73,0x3d,0x72,0x64,0x54,0x3b,0x21,0x04,0x05,0x91,0x04,0x01,0x1f,0x44,0x69,0x49, -0x02,0x90,0x07,0x0f,0x06,0xa5,0x09,0x10,0x0d,0x08,0x36,0x77,0xba,0x84,0xff,0xff,0x00,0xbe,0x00,0x00,0x03,0x70,0x04,0xcd,0x00,0x26,0x0b,0x6d,0x00,0x00,0x00,0x07,0x0b,0x6d,0x02,0x09,0x00,0x00,0xff,0xff,0x00,0xbe,0x00,0x00,0x03,0x70,0x04,0xcd,0x00,0x27,0x0b,0x6d,0x02,0x09,0x00,0x00,0x00,0x06,0x0b,0x71,0x00,0x00,0xff,0xff, -0x00,0xbe,0x02,0x27,0x03,0x70,0x04,0xcd,0x00,0x26,0x0b,0x71,0x00,0x00,0x00,0x07,0x0b,0x71,0x02,0x09,0x00,0x00,0x00,0x01,0x00,0x6e,0x03,0x0e,0x01,0x70,0x04,0xcc,0x00,0x03,0x00,0x11,0xb5,0x03,0x00,0x01,0x02,0x00,0x02,0x00,0x2f,0xcd,0x01,0x2f,0x33,0xcd,0x32,0x30,0x31,0x01,0x03,0x23,0x13,0x01,0x70,0x8c,0x76,0x6f,0x04,0xcc, -0xfe,0x42,0x01,0xbe,0x00,0x02,0x00,0x6e,0x03,0x0e,0x02,0xa0,0x04,0xcc,0x00,0x03,0x00,0x07,0x00,0x20,0x40,0x0d,0x03,0x00,0x01,0x02,0x07,0x04,0x05,0x06,0x00,0x02,0x02,0x04,0x06,0x00,0x2f,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0x33,0xdd,0x32,0xd6,0x32,0xcd,0x32,0x30,0x31,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c,0x76, -0x6c,0x9a,0x8c,0x76,0x6f,0x04,0xcc,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x53,0x01,0x48,0x02,0xfb,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x5b,0x00,0xce,0x02,0xfb, -0xff,0xff,0xff,0x51,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x06,0x0b,0x5c,0xad,0x00,0xff,0xff,0xff,0x51,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x26,0x0b,0x5c,0xad,0x00,0x00,0x07,0x0b,0x5e,0x01,0xc6,0x00,0x00,0x00,0x03,0x00,0xbe,0x01,0x58,0x03,0x95,0x04,0xcd,0x00,0x03, -0x00,0x07,0x00,0x0b,0x00,0x30,0xb1,0x03,0x0b,0xb8,0x01,0x50,0xb3,0x0a,0x0a,0x0d,0x07,0xb8,0x01,0x50,0xb2,0x02,0x06,0x0a,0xb8,0x01,0x4b,0xb4,0x00,0x02,0x09,0x04,0x06,0xb8,0x01,0x4b,0x00,0x3f,0xdd,0x32,0xde,0xcd,0x3f,0x01,0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x01,0x21,0x35,0x21,0x25,0x23,0x11,0x33,0x01,0x23, -0x11,0x33,0x03,0x95,0xfd,0x29,0x02,0xd7,0xfd,0xd2,0xa9,0xa9,0x02,0x2e,0xa9,0xa9,0x01,0x58,0x6a,0x65,0x02,0xa6,0xfd,0x5a,0x02,0xa6,0x00,0x01,0x00,0x59,0x00,0x00,0x04,0x2b,0x04,0xcd,0x00,0x16,0x00,0x3a,0xb2,0x0f,0x0c,0x16,0xb8,0x01,0x50,0xb5,0x0c,0x0d,0x15,0x15,0x18,0x0e,0xb8,0x01,0x51,0xb7,0x0d,0x08,0x08,0x0d,0x0c,0x0f, -0x16,0x0e,0xbb,0x01,0x4a,0x00,0x08,0x01,0x54,0x00,0x07,0x00,0x2f,0xed,0x3f,0x33,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x03,0x23,0x23,0x27,0x33,0x32,0x32,0x37,0x01,0x33,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x2b,0x4d,0x86,0xb4,0xaf,0x9a,0xca,0x2f,0xcd,0x33, -0x53,0x2b,0xfe,0x79,0xb6,0x01,0x70,0x38,0x5e,0x46,0x27,0xa9,0x02,0x80,0x91,0xd3,0x95,0x61,0x26,0xa2,0x08,0x04,0x23,0xfc,0x04,0x1b,0x46,0x5f,0x7c,0x50,0x02,0x70,0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x06,0x0b,0x68,0x00,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x02,0x06,0x0b,0x6b,0x00,0x00, -0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x02,0x06,0x0b,0x6c,0x00,0x00,0xff,0xff,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x02,0x06,0x0b,0x73,0x00,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x06,0x0b,0x74,0x00,0x00,0xff,0xff,0x00,0xbe,0x00,0x00,0x04,0xe2,0x04,0xde,0x02,0x06,0x0b,0x75,0x00,0x00, -0xff,0xff,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x02,0x06,0x0b,0x80,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x02,0x06,0x0b,0x82,0x00,0x00,0x00,0x01,0x00,0x5f,0x02,0x12,0x04,0x0b,0x04,0x2b,0x00,0x07,0x00,0x19,0xb1,0x07,0x05,0xb8,0x01,0x50,0xb5,0x02,0x04,0x06,0x00,0x02,0x04,0x00,0x2f,0xde,0xcd,0x33, -0x01,0x2f,0xce,0xfd,0xce,0x30,0x31,0x01,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x0b,0xfc,0x54,0x01,0x93,0x85,0x01,0x94,0x02,0x12,0x86,0x01,0x93,0xfe,0x6d,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xde,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x63,0x03,0x25,0x00,0x00,0xff,0xff,0x00,0x61,0x00,0x00,0x05,0xd8, -0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x64,0x03,0x25,0x00,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xde,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x27,0x0b,0x63,0x03,0x25,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0x61,0x00,0x00,0x05,0xd8,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00, -0x00,0x27,0x0b,0x64,0x03,0x25,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0xa5,0xff,0x38,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5a,0x01,0xae,0x00,0x00,0xff,0xff,0x00,0xa5,0xfe,0x59,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5b,0x01,0xae,0x00,0x00, -0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0x3a,0xfe,0x43,0xff,0xff,0x00,0x50,0x00,0x00,0x04,0x3c,0x04,0xde,0x02,0x26,0x0b,0x69,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xd3,0x00,0x00,0xff,0xff,0x00,0x31,0x00,0x00,0x03,0x17,0x04,0xcd,0x02,0x26,0x0b,0x6a,0x00,0x00, -0x00,0x07,0x0b,0x5e,0x01,0x10,0x00,0x8c,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x02,0x26,0x0b,0x6b,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x36,0x00,0x00,0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x02,0x26,0x0b,0x6c,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xb8,0x00,0x00,0xff,0xff,0xff,0xfb,0x00,0x00,0x01,0xad, -0x04,0xcd,0x00,0x26,0x0b,0x6d,0x46,0x00,0x00,0x06,0x0b,0x5e,0x56,0x00,0xff,0xff,0xff,0xfa,0x00,0x00,0x02,0x87,0x04,0xcd,0x00,0x26,0x0b,0x6e,0x28,0x00,0x00,0x06,0x0b,0x5e,0x55,0x00,0xff,0xff,0x00,0xa0,0xff,0xed,0x05,0x01,0x04,0xdd,0x02,0x26,0x0b,0x70,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xc7,0x00,0x00,0xff,0xff,0xff,0xfb, -0x02,0x27,0x01,0xad,0x04,0xcd,0x00,0x26,0x0b,0x71,0x46,0x00,0x00,0x07,0x0b,0x5e,0x00,0x56,0x01,0x0e,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xa4,0x00,0x00,0xff,0xff,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x02,0x26,0x0b,0x73,0x00,0x00,0x00,0x07,0x0b,0x5e, -0x01,0xa4,0x00,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xc6,0x00,0x00,0xff,0xff,0x00,0xa4,0xff,0xed,0x04,0xe8,0x04,0xe5,0x02,0x26,0x0b,0x76,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xd2,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x87,0x04,0xde,0x02,0x26, -0x0b,0x78,0x00,0x00,0x00,0x07,0x0b,0x5e,0x00,0xfa,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0xed,0x04,0xf7,0x04,0xde,0x02,0x26,0x0b,0x79,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xb2,0x00,0x00,0xff,0xff,0x00,0x6c,0xfd,0xff,0x04,0x39,0x04,0xde,0x02,0x26,0x0b,0x7b,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xd5,0xff,0xd9,0xff,0xff,0x00,0x96, -0xff,0xed,0x04,0x9c,0x04,0xde,0x02,0x26,0x0b,0x7c,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0x2f,0xff,0xf7,0xff,0xff,0x00,0x4b,0x00,0x00,0x04,0x25,0x04,0xd4,0x02,0x26,0x0b,0x7e,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x68,0xff,0x16,0xff,0xff,0x00,0x42,0xfd,0xff,0x04,0xd2,0x04,0xde,0x02,0x26,0x0b,0x7f,0x00,0x00,0x00,0x07,0x0b,0x5e, -0x02,0xad,0x00,0x00,0xff,0xff,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x80,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xb3,0x00,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xd8,0x04,0xcd,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x02,0x26, -0x0b,0x82,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0x20,0x00,0x00,0xff,0xff,0x00,0xb5,0x00,0x00,0x01,0x6e,0x06,0x05,0x02,0x26,0x0b,0x6d,0x00,0x00,0x00,0x07,0x0b,0x5c,0x01,0x11,0x00,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x04,0x3c,0x05,0xd5,0x02,0x26,0x0b,0x69,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xea,0x00,0x00,0xff,0xff,0x00,0x4e, -0xff,0xed,0x03,0xeb,0x05,0xd5,0x02,0x26,0x0b,0x73,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xc7,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0xed,0x04,0x9c,0x05,0xd5,0x02,0x26,0x0b,0x7c,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0x44,0x00,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x04,0xba,0x06,0xa0,0x00,0x1b,0x00,0x40,0xb6,0x17,0x06,0x12,0x0c,0x0b, -0x0b,0x01,0xb8,0x01,0x50,0xb3,0x1a,0x1a,0x1d,0x12,0xb8,0x01,0x50,0xb7,0x0f,0x06,0x17,0x0b,0x12,0x12,0x0f,0x1b,0xbc,0x01,0x4a,0x00,0x10,0x01,0x4c,0x00,0x0b,0x01,0x4d,0x00,0x3f,0x3f,0x3f,0x33,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x33,0x12,0x39,0x39,0x31,0x30,0x01,0x11,0x14,0x0e,0x02,0x07, -0x1e,0x03,0x17,0x23,0x02,0x00,0x25,0x11,0x33,0x11,0x16,0x16,0x17,0x16,0x17,0x36,0x36,0x35,0x11,0x04,0x89,0x28,0x4a,0x68,0x41,0x24,0x52,0x57,0x57,0x28,0xcb,0xc4,0xfe,0x36,0xfe,0xf8,0xaa,0x6f,0xc2,0x48,0x54,0x47,0x5c,0x6c,0x04,0xcd,0xfe,0xc1,0x52,0x83,0x6c,0x58,0x29,0x2b,0x6e,0x79,0x7e,0x3c,0x01,0x23,0x02,0x19,0xf6,0x02, -0x6e,0xfd,0xde,0x6f,0xd2,0x51,0x5f,0x55,0x35,0x99,0x6a,0x01,0x5d,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x09,0x9a,0x06,0xe8,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x18,0x00,0x1c,0x00,0x21,0x00,0x2c,0x00,0x31,0x00,0x35,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4e,0x00,0x55,0x00,0x5c,0x00,0x64,0x00,0xee,0x40,0x10,0x05,0x32,0x06,0x33, -0x0a,0x19,0x46,0x1a,0x47,0x4b,0x2d,0x61,0x4a,0xce,0x3c,0x36,0xb8,0x01,0x50,0xb2,0x5d,0x53,0x5a,0x41,0x0a,0x01,0x52,0x00,0x25,0x00,0x29,0x01,0x52,0x00,0x4f,0x00,0x22,0x01,0x50,0x00,0x56,0x00,0x0d,0x01,0x50,0x40,0x28,0x16,0x02,0x1e,0x3c,0x5d,0x25,0x4f,0x56,0x16,0x1e,0x1e,0x16,0x56,0x4f,0x25,0x5d,0x3c,0x07,0x0a,0x42,0xce, -0x43,0x2f,0x4b,0x09,0x00,0x1d,0xce,0x0a,0x0b,0x44,0x30,0x0a,0x43,0x48,0x20,0x4c,0x0f,0x25,0x39,0xb8,0x01,0x56,0xb4,0x63,0x14,0x5a,0x63,0x59,0xb8,0x01,0x56,0xb2,0x53,0x52,0x5f,0xb8,0x01,0x56,0x40,0x19,0x3f,0x26,0x17,0x3f,0x01,0x2f,0x4c,0x63,0x53,0x3f,0x2f,0x2f,0x3f,0x53,0x63,0x4c,0x05,0x30,0x34,0x48,0x1e,0x33,0x47,0x03, -0x4b,0xb8,0x01,0x4d,0xb6,0x06,0x1a,0x03,0x07,0x1b,0x03,0x30,0x00,0x2f,0x17,0x33,0xc4,0x32,0x3f,0x17,0x33,0xc4,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x10,0xc6,0x32,0x10,0xc6,0x32,0x01,0x2f,0xe4,0x32,0x32,0x2f,0x33,0x33, -0xe4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x10,0xe4,0x32,0x32,0x10,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0x31,0x30,0x01,0x23,0x01,0x35,0x21,0x05,0x21,0x35,0x21,0x01,0x23,0x11,0x33,0x01,0x10,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x35,0x11, -0x33,0x01,0x21,0x35,0x21,0x01,0x21,0x35,0x01,0x33,0x01,0x14,0x21,0x21,0x11,0x21,0x20,0x15,0x14,0x07,0x16,0x01,0x01,0x23,0x11,0x21,0x01,0x21,0x35,0x21,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x23,0x11,0x33,0x01,0x21,0x35,0x21,0x05,0x21,0x11,0x33,0x01,0x01,0x34,0x23,0x23,0x15,0x33,0x32,0x17,0x34, -0x23,0x23,0x11,0x33,0x32,0x01,0x10,0x23,0x22,0x11,0x10,0x33,0x32,0x09,0x9a,0x78,0xfe,0xf3,0x01,0x85,0xfd,0x4e,0xfe,0x7d,0x01,0x83,0x02,0xb2,0x78,0x78,0xfe,0xc0,0xfd,0x67,0x3d,0x55,0x20,0x2f,0x71,0x8c,0xfb,0xda,0xfe,0x7e,0x01,0x82,0x05,0x66,0xfe,0x7b,0x01,0x0d,0x78,0xfd,0x12,0xfe,0xb7,0xfe,0xe0,0x01,0x1b,0x01,0x2a,0x6a, -0x8e,0xfa,0xd9,0xfe,0xf3,0x78,0x01,0x85,0x05,0x63,0xfe,0x7d,0x01,0x83,0xfd,0x19,0xc5,0xb8,0xb8,0xc0,0xc0,0xb8,0xb8,0xc5,0xfc,0x77,0x78,0x78,0x03,0xbc,0xfe,0x7e,0x01,0x82,0xfd,0x51,0xfe,0x7b,0x78,0x01,0x0d,0x04,0x79,0xc5,0x6c,0x7a,0xb7,0x22,0xcc,0x87,0x96,0xbd,0xfd,0x54,0xf0,0xec,0xec,0xf0,0x05,0x65,0x01,0x09,0x7a,0x7a, -0x7a,0xfb,0xca,0x01,0x82,0xfe,0xa8,0xfe,0xe1,0x36,0x5e,0x1e,0xa4,0x02,0x45,0x01,0x52,0x7a,0xf9,0x18,0x78,0x01,0x0d,0x01,0x41,0xfa,0x03,0x50,0xe0,0x6f,0x3d,0x36,0x03,0x14,0xfe,0xf7,0x01,0x83,0xf9,0x18,0x78,0x02,0xfa,0xd1,0xe4,0xe4,0xd1,0xd1,0xe7,0xe7,0xfe,0x6f,0x01,0x82,0xfb,0xcc,0x78,0x78,0x01,0x85,0xfe,0xf3,0x03,0xb8, -0x75,0xe6,0xf9,0x82,0xfe,0xf7,0x01,0x33,0x01,0x43,0xfe,0xbd,0xfe,0xc1,0x00,0x01,0x00,0x00,0xfe,0x09,0x01,0xb0,0xff,0x9e,0x00,0x07,0x00,0x1a,0x40,0x0a,0x07,0x01,0x06,0x04,0x02,0x01,0x04,0x06,0x06,0x09,0x11,0x00,0x33,0x2f,0xdd,0x32,0xcd,0x01,0x2f,0xcd,0xdd,0xcd,0x30,0x31,0x05,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x01,0xb0, -0xa5,0x66,0xa5,0x01,0xb0,0xc8,0xfe,0xd1,0x01,0x2f,0x66,0x00,0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x01,0x07,0x0b,0x5e,0x02,0x2a,0xfe,0x6f,0x00,0x0f,0xb1,0x01,0x2c,0xb8,0xff,0xc0,0xb3,0x10,0x10,0x36,0x2c,0x00,0x11,0x2b,0x35,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0, -0x02,0x06,0x0b,0x74,0x00,0x00,0xff,0xff,0x00,0x59,0xff,0x04,0x04,0xba,0x06,0xa0,0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x58,0x02,0x3f,0x00,0x00,0xff,0xff,0x00,0x59,0xfd,0xff,0x04,0xba,0x06,0xa0,0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x59,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x59,0xfd,0xff,0x05,0x40,0x06,0xa0, -0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x54,0x02,0x63,0x00,0x00,0x00,0x01,0xff,0x43,0xfe,0x09,0x00,0xbe,0xff,0xb1,0x00,0x18,0x00,0x2a,0x40,0x12,0x02,0x18,0x12,0x11,0x08,0x0b,0x11,0x13,0x05,0x40,0x10,0x10,0x01,0x0a,0xc0,0x11,0x11,0x1a,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x32,0x39,0x2f,0x1a,0xcd,0x33,0x01,0x2f,0xdc,0xcd, -0x10,0xdd,0xdc,0xcd,0x30,0x31,0x13,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x1e,0x03,0x15,0xbe,0x66,0x27,0x30,0x31,0x27,0x66,0x0e,0x20,0x35,0x27,0x66,0x28,0x35,0x20,0x0e,0xfe,0x09,0x76,0x35,0x2f,0x2f,0x35,0x76,0x77,0x26,0x40,0x31,0x20,0x06,0x74,0x74,0x06,0x20,0x31,0x40, -0x26,0x00,0x00,0x03,0xff,0x15,0x05,0x4e,0x00,0xeb,0x07,0x0a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3f,0xb9,0x00,0x06,0x01,0x51,0xb3,0x00,0x00,0x0c,0x1e,0xbe,0x01,0x51,0x00,0x18,0x00,0x12,0x01,0x51,0x00,0x0c,0x00,0x1b,0x01,0x55,0xb3,0x21,0x21,0x15,0x03,0xbd,0x01,0x55,0x00,0x09,0x00,0x0f,0x01,0x55,0x00,0x15,0x05,0x10,0x00, -0x3f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xde,0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x03,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x07,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x5d,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34, -0x8e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x1d,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x06,0xaf,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xff,0x73,0x05,0x4e,0x00,0x8e,0x07,0x0a,0x00,0x0b,0x00,0x24,0x40,0x0f,0x04,0x02,0x00,0x40, -0x0a,0x08,0x06,0x07,0x03,0x09,0x01,0x04,0x0b,0xc0,0x05,0xb8,0x05,0x10,0x00,0x3f,0x1a,0xcc,0x17,0x39,0x01,0x2f,0x33,0x33,0x1a,0xcc,0x32,0x32,0x30,0x31,0x13,0x07,0x17,0x07,0x17,0x07,0x23,0x37,0x27,0x37,0x27,0x37,0x8e,0xa1,0xa1,0xa1,0xa1,0xa1,0x7a,0xa1,0xa1,0xa1,0xa1,0xa1,0x07,0x0a,0x59,0x59,0x58,0x59,0x59,0x59,0x59,0x58, -0x59,0x59,0x00,0x02,0xff,0xa1,0x05,0x4e,0x00,0x5f,0x07,0x0a,0x00,0x0b,0x00,0x17,0x00,0x2a,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0x41,0x09,0x01,0x51,0x00,0x06,0x00,0x15,0x01,0x55,0x00,0x0f,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xfd,0xde,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23, -0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x27,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5f,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0xff,0x49,0x05,0x4e,0x00,0xb8, -0x07,0x0a,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x32,0xb9,0x00,0x04,0x01,0x51,0xb2,0x0a,0x0a,0x10,0xb8,0x01,0x51,0xb4,0x16,0x03,0x02,0x03,0x19,0xbe,0x01,0x55,0x00,0x13,0x00,0x0d,0x01,0x55,0x00,0x00,0x00,0x07,0x05,0x10,0x00,0x3f,0x33,0xfd,0xde,0xed,0x32,0x01,0x2f,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30,0x31,0x03,0x23,0x11,0x33, -0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x27,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x51,0x66,0x66,0x01,0x09,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x58,0x01,0xa8,0xfe,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c, -0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0x45,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x08,0x05,0x00,0x08,0x09,0x03,0x03,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xcd,0xcc,0x30,0x31,0x07,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x15,0x22,0x26,0xbb,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0xa0,0x25,0x2c,0x31,0x23, -0x96,0x64,0x64,0xa7,0x00,0x01,0xff,0x61,0x05,0x4e,0x00,0x9f,0x06,0xdf,0x00,0x03,0x00,0x10,0xb3,0x00,0x02,0x03,0x01,0xb8,0x05,0x10,0x00,0x3f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x13,0x07,0x27,0x37,0x9f,0x9f,0x9f,0x9f,0x06,0x17,0xc9,0xc9,0xc8,0x00,0x00,0x01,0xfe,0xab,0x05,0x4e,0x01,0x56,0x06,0xa3,0x00,0x31,0x00,0x2d,0x40,0x12, -0x00,0x19,0x0f,0x24,0x21,0x28,0x0b,0x08,0x0f,0x08,0x21,0x2d,0x25,0x05,0x14,0x1e,0x0c,0x2d,0xb8,0x05,0x10,0x00,0x3f,0x33,0xcd,0xdd,0xcd,0x33,0x12,0x39,0x39,0x01,0x2f,0xcd,0x33,0xdc,0xcd,0x33,0x12,0x39,0x39,0x30,0x31,0x03,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02, -0x17,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x1b,0x1c,0x28,0x21,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2c,0x17,0x1b,0x28,0x20,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2b,0x05, -0xdf,0x26,0x31,0x1b,0x0b,0x32,0x2d,0x29,0x31,0x0d,0x48,0x14,0x56,0x45,0x24,0x3d,0x2c,0x19,0x15,0x26,0x36,0x1f,0x26,0x31,0x1b,0x0b,0x32,0x2c,0x29,0x32,0x0d,0x47,0x14,0x56,0x45,0x23,0x3e,0x2c,0x19,0x15,0x26,0x37,0x00,0x01,0xfe,0x26,0x05,0x57,0xff,0x9c,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x05,0x00,0x09,0x08,0x09,0x02,0xb8, -0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xdc,0xcd,0x30,0x31,0x03,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0x64,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0x05,0xaa,0x26,0x2d,0x32,0x24,0x91,0x67,0x64,0xab,0x00,0x01,0x00,0x64,0xfe,0x09,0x01,0xc4,0xff,0xb1,0x00,0x05,0x00,0x40,0x40,0x22,0xb4,0x02,0x01,0x03,0x01,0x00, -0x44,0x04,0x54,0x04,0x02,0xcb,0x04,0x01,0x04,0x80,0xcb,0x05,0x01,0x85,0x05,0x01,0x05,0x02,0x02,0x07,0x02,0x05,0x05,0x01,0xc0,0x03,0x03,0x07,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x39,0x3d,0x2f,0x33,0x11,0x01,0x33,0x18,0x2f,0x33,0x5d,0x5d,0x1a,0xcd,0x5d,0x71,0x32,0x39,0x39,0x5d,0x30,0x31,0x01,0x23,0x27,0x37,0x33,0x07,0x01,0xc4, -0x8d,0xd3,0xd3,0x8d,0xd2,0xfe,0x09,0xd4,0xd4,0xd4,0x00,0x02,0xff,0x42,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x17,0x00,0x27,0xb3,0x04,0x00,0x07,0x0c,0xb8,0x01,0x51,0xb5,0x12,0x04,0x03,0x0a,0x0a,0x0f,0xb8,0x01,0x55,0xb2,0x15,0x15,0x19,0x11,0x00,0x33,0x2f,0xed,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xfd,0xde,0xcd,0xce,0x30, -0x31,0x17,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x07,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0xc0,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa0,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x3a,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0x45, -0x05,0x57,0x00,0xbb,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x07,0x03,0x00,0x04,0x03,0x09,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcc,0xcd,0x30,0x31,0x03,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x01,0x00,0x64, -0x05,0x57,0x01,0xda,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x07,0x03,0x00,0x04,0x03,0x09,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcc,0xcd,0x30,0x31,0x13,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x64,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x02,0xfe,0xe1, -0x05,0x57,0x01,0x1f,0x07,0x09,0x00,0x0b,0x00,0x17,0x00,0x25,0x40,0x0e,0x13,0x10,0x0c,0x0c,0x03,0x07,0x00,0x10,0x0f,0x0f,0x04,0x03,0x15,0x09,0xb8,0x05,0x10,0x00,0x3f,0x33,0xdc,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0xcc,0x32,0x2f,0xcc,0xcd,0x30,0x31,0x01,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x25,0x34,0x36, -0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0xfe,0xe1,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0x01,0x20,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x25,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x04,0xfe,0x06,0x05,0x35,0x01,0xfa,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x2b,0x00,0x37, -0x00,0x44,0x40,0x1f,0x29,0x32,0x1e,0x2c,0x24,0x2b,0x1e,0x02,0x16,0x00,0x0d,0x10,0x07,0x29,0x2a,0x35,0x2a,0x27,0x27,0x04,0x02,0x01,0x13,0x04,0x2f,0x21,0x21,0x19,0x0a,0x01,0x04,0x00,0x2f,0xce,0xdc,0xcd,0x33,0x2f,0xcd,0x10,0xcd,0x11,0x39,0x11,0x33,0x2f,0xce,0xcd,0x11,0x39,0x01,0x2f,0xcd,0xdc,0xce,0xcd,0x32,0xde,0xce,0xdc, -0xcd,0x10,0xcd,0x32,0x30,0x31,0x03,0x07,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x28,0x3e, -0x6d,0x29,0x3f,0x4f,0x70,0x71,0x4e,0x54,0x6f,0x1c,0xfe,0xeb,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x02,0x3d,0x1c,0x6f,0x54,0x4e,0x71,0x70,0x4f,0x3f,0x29,0x6d,0x3e,0x01,0x81,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0x73,0x3e,0x6e,0x1e,0x6f,0x53,0x50,0x73,0x70,0x53,0x3e,0x28,0x66,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44, -0x95,0x28,0x3e,0x53,0x70,0x73,0x50,0x53,0x6f,0x1e,0x6e,0x3e,0xd4,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44,0x00,0x02,0xff,0x17,0x05,0x35,0x00,0xe9,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x24,0x40,0x0f,0x0d,0x16,0x02,0x10,0x08,0x0f,0x02,0x0d,0x0e,0x19,0x0e,0x0b,0x13,0x05,0x0b,0x00,0x2f,0xdc,0xcd,0x10,0xce,0xcd,0x11,0x39,0x01,0x2f, -0xce,0xdc,0xcd,0x10,0xcd,0x32,0x30,0x31,0x03,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x7d,0x1c,0x6f,0x54,0x4e,0x71,0x70,0x4f,0x3f,0x29,0x6d,0x3e,0x01,0x81,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0xe1,0x28,0x3e,0x53,0x70, -0x73,0x50,0x53,0x6f,0x1e,0x6e,0x3e,0xd4,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44,0x00,0x00,0x01,0xff,0x5b,0x05,0x58,0x00,0xa6,0x07,0x00,0x00,0x11,0x00,0x2f,0x40,0x15,0x06,0x0a,0x09,0x11,0x40,0x00,0xc0,0x09,0x04,0x40,0x0d,0x40,0x09,0x10,0x48,0x0d,0x0d,0x11,0x09,0xc0,0x07,0xb8,0x05,0x10,0x00,0x3f,0x1a,0xcd,0x32,0x39,0x2f,0x2b, -0x1a,0xcd,0x01,0x2f,0x1a,0xdc,0x1a,0xcd,0x10,0xcd,0x32,0x30,0x31,0x13,0x15,0x14,0x06,0x23,0x22,0x27,0x15,0x23,0x11,0x33,0x15,0x16,0x33,0x32,0x36,0x35,0x35,0xa6,0x57,0x57,0x22,0x17,0x64,0x64,0x0f,0x1c,0x30,0x26,0x07,0x00,0x76,0x58,0x65,0x0a,0x7f,0x01,0xa8,0xcf,0x0b,0x2c,0x39,0x75,0x00,0x01,0xff,0x43,0xfe,0x09,0x00,0xbe, -0xff,0xb1,0x00,0x18,0x00,0x30,0x40,0x17,0x09,0x0a,0x10,0x13,0x01,0x00,0x13,0x10,0x13,0x40,0x05,0x40,0x09,0x10,0x48,0x05,0x05,0x12,0xc0,0x09,0x01,0x01,0x1a,0x11,0x00,0x33,0x2f,0x33,0x1a,0xcc,0x39,0x2f,0x2b,0x1a,0xcd,0x32,0x01,0x2f,0xdd,0xcd,0x10,0xdd,0xdd,0xcd,0x30,0x31,0x07,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35, -0x33,0x15,0x14,0x0e,0x02,0x07,0x15,0x23,0x35,0x2e,0x03,0x35,0xbd,0x66,0x27,0x30,0x31,0x27,0x66,0x0e,0x20,0x35,0x27,0x66,0x28,0x35,0x20,0x0e,0x4f,0x76,0x35,0x2f,0x2f,0x35,0x76,0x77,0x26,0x40,0x31,0x20,0x06,0x74,0x74,0x06,0x20,0x31,0x40,0x26,0x00,0x01,0xff,0x6a,0xfe,0x09,0x00,0x96,0xff,0xb1,0x00,0x05,0x00,0x15,0xb7,0x05, -0x02,0x04,0x02,0x01,0x05,0x05,0x07,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xce,0xcd,0x30,0x31,0x13,0x21,0x35,0x33,0x11,0x33,0x96,0xfe,0xd4,0xc6,0x66,0xfe,0x09,0x66,0x01,0x42,0x00,0x00,0x01,0xff,0x4b,0xfe,0x09,0x00,0xab,0xff,0xb1,0x00,0x05,0x00,0x40,0x40,0x22,0xb4,0x02,0x01,0x03,0x01,0x00,0x44,0x04,0x54,0x04,0x02,0xcb, -0x04,0x01,0x04,0x80,0xcb,0x05,0x01,0x85,0x05,0x01,0x05,0x02,0x02,0x07,0x02,0x05,0x05,0x01,0xc0,0x03,0x03,0x07,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x39,0x3d,0x2f,0x33,0x11,0x01,0x33,0x18,0x2f,0x33,0x5d,0x5d,0x1a,0xcd,0x5d,0x71,0x32,0x39,0x39,0x5d,0x30,0x31,0x13,0x23,0x27,0x37,0x33,0x07,0xab,0x8d,0xd3,0xd3,0x8d,0xd2,0xfe,0x09, -0xd4,0xd4,0xd4,0x00,0x00,0x01,0xff,0x45,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x04,0x00,0x07,0x04,0x03,0x0a,0x0a,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xcd,0xce,0x30,0x31,0x17,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0xa0,0xba,0xa7,0x64,0x64, -0x96,0x23,0x31,0x2c,0x00,0x02,0xfe,0xe1,0xfd,0xff,0x01,0x1f,0xff,0xb1,0x00,0x0b,0x00,0x17,0x00,0x26,0x40,0x10,0x00,0x07,0x04,0x04,0x0c,0x10,0x13,0x10,0x0f,0x0f,0x04,0x03,0x16,0x0a,0x0a,0x19,0x11,0x00,0x33,0x2f,0x33,0xdc,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0xce,0xcd,0x32,0x10,0xde,0xcd,0x30,0x31,0x05,0x14,0x06,0x23,0x35,0x32, -0x36,0x35,0x34,0x27,0x33,0x16,0x05,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x01,0x1f,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0xfe,0xe0,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0xa0,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x25,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x00,0x01,0xff,0x68,0xfd,0xff,0x00,0x99,0xff,0xbb, -0x00,0x09,0x00,0x2a,0x40,0x11,0x04,0x09,0x00,0x08,0x80,0x05,0x03,0x09,0x07,0x04,0x04,0x03,0x02,0x08,0x07,0x07,0x0b,0x11,0x00,0x33,0x2f,0x33,0xcc,0x32,0x39,0x19,0x2f,0x12,0x39,0x01,0x18,0x2f,0x33,0x1a,0xcc,0x32,0x39,0x39,0x30,0x31,0x13,0x07,0x07,0x35,0x37,0x27,0x37,0x37,0x15,0x07,0x99,0x4d,0xe4,0xa8,0xa8,0x4d,0xe4,0xaa, -0xfe,0x67,0x41,0x27,0x5c,0x1b,0xdd,0x41,0x27,0x59,0x1e,0x00,0x00,0x01,0xff,0x45,0x05,0x4d,0x00,0xbb,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x08,0x00,0x05,0x08,0x09,0x02,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcd,0xce,0x30,0x31,0x13,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0xbb,0x06,0x64,0x04,0x8b,0x85, -0xbf,0xb7,0x05,0xa0,0x26,0x2d,0x32,0x24,0x9b,0x67,0x64,0xab,0x00,0x02,0xff,0x17,0x05,0x35,0x00,0xe9,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x22,0x40,0x0e,0x02,0x16,0x00,0x0d,0x10,0x07,0x02,0x01,0x13,0x04,0x19,0x0a,0x01,0x04,0x00,0x2f,0xce,0xdc,0xcd,0x10,0xcd,0x11,0x39,0x01,0x2f,0xcd,0xdc,0xce,0xcd,0x32,0x30,0x31,0x13,0x07, -0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xe9,0x3e,0x6d,0x29,0x3f,0x4f,0x70,0x71,0x4e,0x54,0x6f,0x1c,0xfe,0xeb,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0x73,0x3e,0x6e,0x1e,0x6f,0x53,0x50,0x73,0x70,0x53,0x3e,0x28,0x66,0x2f,0x44, -0x44,0x2f,0x2f,0x44,0x44,0x00,0xff,0xff,0xff,0x43,0xfe,0x09,0x00,0xbe,0xff,0xb1,0x02,0x06,0x0b,0xd0,0x00,0x00,0x00,0x01,0xff,0x4b,0x05,0x4d,0x00,0xb5,0x07,0x09,0x00,0x05,0x00,0x31,0x40,0x17,0x00,0x04,0x80,0x84,0x05,0x94,0x05,0x02,0x05,0x34,0x03,0x01,0x03,0x34,0x01,0x01,0x01,0x02,0x05,0x05,0x03,0xc0,0x00,0xb8,0x05,0x10, -0x00,0x3f,0x1a,0xcc,0x39,0x3d,0x2f,0x01,0x18,0x2f,0x33,0x71,0x33,0x71,0x33,0x5d,0x1a,0xcd,0x32,0x30,0x31,0x13,0x23,0x27,0x37,0x33,0x07,0xb5,0x8d,0xdd,0xdd,0x8d,0xdc,0x05,0x4d,0xde,0xde,0xde,0x00,0x01,0xff,0x6a,0x05,0x58,0x00,0x96,0x07,0x00,0x00,0x05,0x00,0x14,0xb5,0x05,0x02,0x04,0x05,0x02,0x00,0xb8,0x05,0x10,0x00,0x3f, -0xcd,0xcd,0x01,0x2f,0xce,0xcd,0x30,0x31,0x13,0x21,0x35,0x33,0x11,0x33,0x96,0xfe,0xd4,0xc6,0x66,0x05,0x58,0x66,0x01,0x42,0x00,0x01,0x00,0x64,0xfd,0xff,0x01,0xda,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x08,0x05,0x00,0x08,0x09,0x02,0x02,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xdd,0xce,0x30,0x31,0x17,0x34,0x37,0x33,0x06, -0x15,0x14,0x16,0x33,0x15,0x22,0x26,0x64,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0xa0,0x25,0x2c,0x31,0x23,0x96,0x64,0x64,0xa7,0x00,0x01,0xfd,0x87,0x05,0x4e,0x00,0x32,0x06,0xa3,0x00,0x31,0x00,0x2d,0x40,0x12,0x00,0x19,0x0f,0x24,0x21,0x28,0x0b,0x08,0x0f,0x08,0x21,0x2d,0x25,0x05,0x14,0x1e,0x0c,0x2d,0xb8,0x05,0x10,0x00,0x3f,0x33, -0xcd,0xdd,0xcd,0x33,0x12,0x39,0x39,0x01,0x2f,0xcd,0x33,0xdc,0xcd,0x33,0x12,0x39,0x39,0x30,0x31,0x01,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0xfe,0xc1,0x1c, -0x28,0x21,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2c,0x17,0x1b,0x28,0x20,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2b,0x05,0xdf,0x26,0x31,0x1b,0x0b,0x32,0x2d,0x29,0x31,0x0d,0x48,0x14,0x56,0x45,0x24,0x3d,0x2c,0x19,0x15,0x26,0x36,0x1f,0x26, -0x31,0x1b,0x0b,0x32,0x2c,0x29,0x32,0x0d,0x47,0x14,0x56,0x45,0x23,0x3e,0x2c,0x19,0x15,0x26,0x37,0x00,0x00,0x02,0xff,0x29,0x05,0x4e,0x00,0xd8,0x06,0xfd,0x00,0x0b,0x00,0x17,0x00,0x18,0xb7,0x12,0x06,0x0c,0x00,0x15,0x03,0x0f,0x09,0xb8,0x05,0x10,0x00,0x3f,0xcd,0xdc,0xcd,0x01,0x2f,0xcd,0xdc,0xcd,0x30,0x31,0x03,0x34,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xd7,0x78,0x5f,0x5f,0x79,0x79,0x5f,0x5f,0x78,0x60,0x43,0x34,0x35,0x43,0x43,0x35,0x34,0x43,0x06,0x25,0x55,0x83,0x83,0x55,0x55,0x82,0x82,0x55,0x2f,0x48,0x48,0x2f,0x2f,0x49,0x49,0x00,0xff,0xff,0xff,0xa4,0x05,0x4e,0x00,0x5d, -0x06,0x05,0x02,0x06,0x0b,0x5c,0x00,0x00,0x00,0x01,0x00,0xab,0x00,0x00,0x02,0xcb,0x04,0xde,0x00,0x19,0x00,0x2c,0xb5,0x0b,0x0b,0x18,0x18,0x1b,0x15,0x41,0x0a,0x01,0x50,0x00,0x00,0x00,0x16,0x01,0x54,0x00,0x18,0x01,0x4d,0x00,0x10,0x01,0x54,0x00,0x07,0x01,0x4a,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f, -0x31,0x30,0x13,0x34,0x3e,0x04,0x33,0x32,0x16,0x17,0x17,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x11,0x21,0x17,0x21,0xab,0x0b,0x1b,0x2f,0x49,0x65,0x45,0x25,0x56,0x1c,0x18,0x08,0x1f,0x24,0x24,0x0f,0x44,0x52,0x2b,0x0d,0x01,0x62,0x13,0xfd,0xe0,0x03,0x1b,0x3a,0x71,0x64,0x54,0x3e,0x22,0x08,0x06,0x94,0x02,0x04,0x03,0x02,0x2c,0x50, -0x6d,0x41,0xfd,0x85,0xa2,0x00,0xff,0xff,0x00,0xb6,0x00,0xfc,0x01,0x6f,0x04,0xcd,0x02,0x26,0x0b,0x71,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x11,0xfe,0xe4,0x00,0x01,0xfe,0xb2,0x05,0x67,0x01,0x4f,0x06,0x78,0x00,0x0d,0x00,0x15,0xb7,0x00,0x01,0x08,0x07,0x00,0x08,0x0b,0x04,0x00,0x2f,0xcd,0xcc,0x32,0x01,0x2f,0x33,0xcc,0x32,0x30, -0x31,0x13,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0xc8,0x87,0x17,0xaa,0x8d,0x8e,0xa9,0x18,0x87,0x10,0x60,0x51,0x5e,0x60,0x06,0x78,0x84,0x8d,0x8a,0x87,0x49,0x54,0x51,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0x9a,0x00,0x19,0x00,0x8c,0x40,0x5f,0x59,0x17,0x01,0x48,0x17,0x01,0x56,0x13,0x01,0x79, -0x06,0x01,0x6a,0x06,0x01,0x0b,0x06,0x1b,0x06,0x02,0x9a,0x05,0x01,0x68,0x05,0x01,0x2a,0x05,0x01,0x96,0x03,0x01,0x24,0x03,0x01,0x05,0x03,0x15,0x03,0x02,0x66,0x02,0x76,0x02,0x02,0x0d,0x0d,0x00,0x7d,0x10,0x19,0x20,0x19,0x30,0x19,0x03,0x19,0x19,0x1b,0x0f,0x11,0x7d,0x08,0x0b,0x0b,0x8a,0x0a,0x01,0x69,0x0a,0x79,0x0a,0x02,0x4b, -0x0a,0x01,0x0a,0x0f,0x08,0x1f,0x08,0x02,0x08,0x00,0x00,0x15,0x0a,0x0f,0x91,0x0d,0x03,0x15,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xc4,0x12,0x39,0x2f,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x33,0x2f,0x10,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x01,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x10,0x13,0x23,0x35,0x21,0x15,0x21,0x04,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x05,0xaa,0xac,0xb6,0xfe,0xb6,0xfe,0xc6,0xb6,0xb0,0xf1,0xf1,0x05,0x4c,0xfc,0x89,0xfe,0xdb,0x7a,0x87,0xef,0xfc,0x86,0x7a,0x02,0xc8,0xfe,0xb4,0xc4,0xd0,0xc8,0xc1,0x01,0x3b,0x01,0x55,0x01,0x01, -0x98,0x98,0xef,0xfe,0xa8,0xf4,0x9c,0xac,0xaa,0x9b,0x01,0x04,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0xf0,0x05,0x9a,0x00,0x16,0x00,0x5a,0x40,0x39,0x46,0x0e,0x01,0x37,0x0e,0x01,0x78,0x05,0x01,0x5b,0x05,0x01,0x16,0x15,0x7e,0x12,0x02,0x02,0x18,0x0a,0x0c,0x7e,0x68,0x09,0x78,0x09,0x02,0x09,0x0f,0x07,0x2f,0x07,0x3f,0x07,0x4f,0x07, -0x04,0x07,0x40,0x10,0x13,0x48,0x07,0x02,0x04,0x91,0x12,0x10,0x10,0x15,0x0a,0x13,0x03,0x15,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x5d,0xed,0x32,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x33,0x06, -0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x04,0xf0,0xfe,0x97,0xbc,0xc3,0xd7,0xfe,0x5b,0xb0,0x63,0x52,0x55,0x96,0xb2,0xbd,0xa8,0xc1,0x02,0x7b,0x73,0x01,0x08,0xd8,0xfe,0xb4,0xce,0xe0,0x97,0x59,0x5c,0x70,0x02,0x8a,0xfa,0xfe,0x00,0x00,0x01,0x00,0x64,0xff,0x35,0x05,0x23,0x05,0xb2,0x00,0x17,0x00,0x5b,0x40,0x37, -0x82,0x14,0x01,0x8a,0x12,0x01,0x76,0x08,0x01,0x67,0x08,0x01,0x65,0x07,0x01,0x7a,0x05,0x01,0x69,0x05,0x01,0x16,0x7e,0x04,0x17,0x7e,0x02,0x04,0x02,0x04,0x02,0x19,0x0c,0x0a,0x7e,0x0d,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x0c,0x0d,0x0d,0x16,0x06,0x91,0x13,0x04,0x16,0x91,0x01,0x03,0x12,0x00,0x3f,0xce,0xed,0x3f,0xed,0x11,0x39,0x2f, -0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x23,0x35,0x21,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x11,0x21,0x05,0x23,0x9c,0xfe,0x89,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71, -0xd5,0x01,0xa8,0x01,0x6b,0xcb,0xcb,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xfc,0xb2,0x00,0x02,0x00,0x5a,0xff,0xe8,0x05,0x4c,0x05,0x9a,0x00,0x16,0x00,0x26,0x00,0x7c,0x40,0x53,0x29,0x25,0x79,0x25,0x02,0x26,0x21,0x76,0x21,0x02,0x26,0x1d,0x76,0x1d,0x02,0x29,0x19,0x79,0x19,0x02, -0x8a,0x0b,0x01,0x8a,0x0a,0x01,0x89,0x06,0x01,0x86,0x02,0x01,0x12,0x7e,0x0c,0x11,0x11,0x00,0x7d,0x17,0x50,0x0c,0x01,0x10,0x17,0x20,0x17,0x50,0x17,0x60,0x17,0x04,0x0c,0x17,0x0c,0x17,0x28,0x1f,0x7d,0x08,0x0e,0x0e,0x0f,0x08,0x1f,0x08,0x2f,0x08,0x03,0x08,0x1b,0x91,0x0c,0x13,0x12,0x0d,0x91,0x0f,0x03,0x23,0x91,0x04,0x13,0x00, -0x3f,0xed,0x3f,0xfd,0xc4,0xdd,0x32,0xed,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x34,0x37,0x36,0x37,0x35,0x21,0x35,0x21,0x15,0x21,0x15,0x16,0x17,0x16,0x07,0x34,0x27, -0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x4c,0xbe,0xb3,0xfe,0xfa,0xfe,0xfc,0xb7,0xc0,0xa0,0x99,0xec,0xfd,0xdb,0x04,0xf2,0xfd,0xdb,0xe9,0x9b,0xa1,0xb0,0x87,0x82,0xc0,0xbf,0x82,0x88,0x87,0x82,0xc0,0xbf,0x82,0x88,0x02,0x28,0xfe,0xfa,0xa2,0x98,0xa0,0xa9,0x01,0x04,0xee,0xa0,0x99,0x16,0x90,0x98, -0x98,0x90,0x19,0xa0,0xa5,0xe5,0xc3,0x79,0x73,0x74,0x7a,0xc1,0xc3,0x79,0x73,0x74,0x79,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x03,0xb8,0x05,0xb2,0x00,0x13,0x00,0x51,0x40,0x34,0x96,0x12,0x01,0x72,0x12,0x82,0x12,0x02,0x8a,0x10,0x01,0x79,0x10,0x01,0x7a,0x0f,0x01,0x56,0x06,0x66,0x06,0x02,0x59,0x03,0x69,0x03,0x02,0x00,0x7e,0x02, -0x02,0x15,0x0a,0x08,0x7e,0x0b,0x0f,0x0d,0x1f,0x0d,0x02,0x0d,0x0a,0x0b,0x0b,0x01,0x04,0x91,0x11,0x04,0x01,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34, -0x37,0x36,0x33,0x20,0x11,0x03,0xb8,0xa8,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0x00,0x01,0x00,0x64,0x00,0x00,0x05,0x23,0x05,0xb2,0x00,0x19,0x00,0x6f,0x40,0x44,0xa7,0x16,0x01,0x84,0x16,0x01,0x71,0x16,0x01,0x06, -0x16,0x01,0x7a,0x14,0x8a,0x14,0x02,0x7a,0x13,0x01,0x66,0x0a,0x01,0x6a,0x07,0x01,0x03,0x18,0x7e,0x06,0x19,0x7e,0x01,0x00,0x06,0x01,0x06,0x01,0x06,0x01,0x1b,0x0e,0x0c,0x7e,0x0f,0x0f,0x11,0x1f,0x11,0x02,0x11,0x0e,0x0f,0x19,0x91,0x01,0x03,0x0f,0x03,0x0f,0x03,0x05,0x08,0x91,0x15,0x04,0x05,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39, -0x39,0x2f,0x2f,0x10,0xce,0xed,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x23,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x15,0x21,0x05,0x23,0x9c, -0xcf,0xa8,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0x01,0x6b,0x01,0xc2,0xcb,0xfd,0x73,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xc1,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x9a,0x05,0x9a,0x00,0x12,0x00,0x22,0x00,0x51,0x40,0x18,0x4a,0x21,0x5a,0x21,0x02,0x45, -0x1d,0x55,0x1d,0x02,0x45,0x19,0x55,0x19,0x02,0x5a,0x15,0x01,0x49,0x15,0x01,0x00,0x7e,0x13,0xb8,0xff,0xc0,0x40,0x19,0x09,0x0c,0x48,0x13,0x13,0x24,0x1b,0x7e,0x0d,0x7e,0x0a,0x08,0x17,0x91,0x0d,0x0f,0x10,0x09,0x91,0x0c,0x03,0x1f,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x01,0x2f,0xce,0xed,0xed,0x12,0x39,0x2f, -0x2b,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x21,0x35,0x21,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x9a,0x85,0x8b,0xee,0xe7,0x87,0x84,0xfe,0x88,0x02,0x20,0x88,0xda,0xee,0x80,0x78,0xa8,0x4a,0x55, -0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0x03,0x0e,0x98,0xfe,0x07,0x77,0x95,0x8d,0xf8,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a,0x73,0x74,0x66,0x00,0x02,0x00,0x5e,0x00,0x00,0x05,0xe7,0x05,0x9a,0x00,0x0e,0x00,0x17,0x00,0x6b,0x40,0x45,0x06,0x15,0x86,0x15,0x02,0x9b,0x0a,0x01, -0x89,0x0a,0x01,0x7c,0x0a,0x01,0x6e,0x0a,0x01,0x0a,0x48,0x0e,0x49,0x29,0x0a,0x01,0x1a,0x0a,0x01,0x59,0x07,0x69,0x07,0x02,0x0d,0x03,0x7e,0x0f,0x0e,0x7e,0x02,0x00,0x0f,0x01,0x0f,0x02,0x0f,0x02,0x19,0x13,0x7d,0x0f,0x09,0x1f,0x09,0x02,0x09,0x0e,0x91,0x01,0x03,0x03,0x04,0x10,0x91,0x0c,0x03,0x0f,0x91,0x04,0x12,0x00,0x3f,0xed, -0x3f,0xed,0x11,0x39,0x2f,0xce,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x21,0x20,0x27,0x26,0x11,0x10,0x21,0x21,0x11,0x21,0x01,0x11,0x23,0x20,0x11,0x10,0x17,0x16,0x21,0x05,0xe7,0x9c,0xcf,0xfe,0xe8,0xfe, -0xa8,0xd4,0xda,0x02,0xf6,0x01,0x28,0x01,0x6b,0xfd,0xed,0x7c,0xfd,0xb6,0x9f,0x9c,0x01,0x19,0x01,0xc2,0xcb,0xfd,0x73,0xc2,0xc8,0x01,0x55,0x02,0xbb,0xfd,0x8b,0xfd,0x73,0x04,0x6a,0xfd,0xd9,0xfe,0xe9,0x98,0x94,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x00,0x05,0x00,0x1a,0x40,0x0c,0x05,0x7e,0x02,0x02,0x07,0x03, -0x02,0x91,0x05,0x03,0x01,0x12,0x00,0x3f,0x3f,0xed,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x03,0x08,0xa8,0xfd,0xc0,0x02,0xe8,0x05,0x02,0x98,0x00,0x02,0x00,0x8c,0x00,0x00,0x04,0x7c,0x05,0x9a,0x00,0x11,0x00,0x21,0x00,0x6a,0x40,0x45,0x35,0x0f,0x01,0x35,0x0e,0x01,0x3a,0x06,0x01,0x3a,0x05,0x01, -0x45,0x0f,0x01,0x46,0x0e,0x01,0x4a,0x06,0x01,0x49,0x05,0x01,0x12,0x7e,0x11,0x7e,0x10,0x02,0x01,0x02,0x02,0x23,0x1a,0x7e,0x0b,0x7e,0x08,0x16,0x91,0x64,0x0b,0x01,0x35,0x0b,0x45,0x0b,0x55,0x0b,0x03,0x0b,0x0d,0x0a,0x03,0x1e,0x91,0x49,0x02,0x59,0x02,0x02,0x3a,0x02,0x01,0x02,0x04,0x01,0x12,0x00,0x3f,0xde,0x32,0x5d,0x5d,0xed, -0x3f,0xde,0x32,0x5d,0x5d,0xed,0x01,0x2f,0xed,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x36,0x33,0x32,0x17,0x16,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x7c, -0xa8,0x88,0xda,0xed,0x81,0x78,0xa8,0x88,0xda,0xed,0x81,0x78,0xa8,0x4c,0x55,0xa9,0xa6,0x5c,0x54,0x4c,0x55,0xa9,0xa6,0x5c,0x54,0x01,0x30,0x77,0x96,0x8c,0xf2,0x02,0xcd,0xfe,0xd0,0x77,0x96,0x8c,0xf2,0xaf,0x67,0x74,0x75,0x6a,0xab,0xaf,0x67,0x74,0x75,0x6a,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x9a,0x05,0x9a,0x00,0x13,0x00,0x23, -0x00,0x61,0x40,0x3f,0x43,0x12,0x53,0x12,0x02,0x4a,0x06,0x01,0x49,0x05,0x59,0x05,0x02,0x5b,0x02,0x01,0x4a,0x02,0x01,0x00,0x7e,0x10,0x14,0x20,0x14,0x30,0x14,0x03,0x14,0x14,0x07,0x25,0x0c,0x7e,0x0a,0x1c,0x7e,0x0e,0x7e,0x0f,0x07,0x01,0x07,0x18,0x91,0x55,0x0e,0x01,0x46,0x0e,0x01,0x0e,0x10,0x10,0x0a,0x08,0x91,0x0d,0x03,0x20, -0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xce,0x3f,0x33,0x5d,0x5d,0xed,0x01,0x2f,0x5d,0xed,0xed,0xde,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x00,0x35,0x11,0x23,0x15,0x23,0x11,0x21,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15, -0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x9a,0x85,0x8b,0xee,0xe2,0xfe,0xf0,0xdc,0x9c,0x02,0x20,0x88,0xda,0xee,0x80,0x78,0xa8,0x4a,0x55,0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x01,0x20,0xec,0x03,0x0e,0xcb,0x01,0x63,0xfe,0x07,0x77,0x95,0x8d,0xf8,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a, -0x73,0x74,0x66,0x00,0x00,0x02,0x00,0x5c,0xff,0xe8,0x05,0xb0,0x05,0x9a,0x00,0x17,0x00,0x21,0x00,0x7c,0x40,0x53,0x5b,0x0f,0x01,0x3a,0x0f,0x4a,0x0f,0x02,0x3a,0x0e,0x4a,0x0e,0x5a,0x0e,0x03,0x5a,0x0a,0x01,0x49,0x0a,0x01,0x3a,0x0a,0x01,0x49,0x09,0x01,0x36,0x07,0x46,0x07,0x56,0x07,0x03,0x35,0x06,0x45,0x06,0x55,0x06,0x03,0x17, -0x7e,0x01,0x03,0x16,0x7e,0x11,0x00,0x19,0x10,0x19,0x02,0x19,0x19,0x23,0x1c,0x7e,0x0c,0x13,0x13,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x11,0x16,0x91,0x03,0x01,0x19,0x19,0x1e,0x12,0x91,0x15,0x03,0x1e,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xcc,0xc4,0xfd,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d, -0xc4,0xfd,0xc4,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x01,0x11,0x21,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x05,0xb0,0x9c,0xc8,0x83,0x87,0xe8,0xef,0x8a,0x85,0x78,0x7e,0xef,0x01, -0x63,0xfc,0xf4,0x03,0xb4,0x01,0x64,0xfd,0xf4,0xfe,0xaf,0xfe,0xb1,0x01,0x4a,0xa7,0x5b,0x54,0x02,0x9d,0xcb,0xfe,0x8c,0xea,0x8f,0x93,0x93,0x8f,0xf0,0xf0,0x87,0x8f,0x01,0x02,0x98,0xfe,0x66,0xfd,0xf8,0x01,0x70,0xfe,0x8c,0xfe,0x7e,0x72,0x69,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xa4,0x05,0x9a,0x00,0x19,0x00,0x3d,0x40,0x20, -0x95,0x17,0x01,0x94,0x0b,0x01,0x0f,0x0f,0x00,0x7e,0x02,0x02,0x08,0x1b,0x13,0x06,0x7e,0x08,0x13,0x15,0x91,0x06,0x04,0x04,0x08,0x10,0x91,0x0e,0x03,0x01,0x08,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x34,0x23, -0x22,0x07,0x11,0x23,0x11,0x34,0x37,0x36,0x33,0x21,0x15,0x21,0x22,0x15,0x11,0x36,0x33,0x32,0x17,0x16,0x15,0x04,0xa4,0xa8,0xf5,0xb4,0xe2,0xa8,0x6c,0x67,0xb8,0x02,0x14,0xfd,0xfe,0xf5,0xe4,0xc6,0xb7,0x67,0x6b,0x02,0x12,0xe8,0x6e,0xfd,0x74,0x04,0x28,0xb5,0x60,0x5d,0x98,0xe8,0xfe,0xfa,0x7a,0x5e,0x61,0xb5,0x00,0x02,0x00,0x5e, -0xfe,0xea,0x05,0xaa,0x05,0xb2,0x00,0x1f,0x00,0x2f,0x00,0xc8,0x40,0x8d,0x59,0x2e,0x01,0x99,0x2d,0x01,0x6a,0x2d,0x01,0x54,0x2b,0x64,0x2b,0x02,0x56,0x2a,0x86,0x2a,0x02,0x86,0x26,0x01,0x67,0x26,0x01,0x56,0x26,0x01,0x64,0x25,0x01,0x56,0x25,0x01,0x6a,0x23,0x01,0x59,0x22,0x01,0x86,0x16,0x01,0x75,0x16,0x01,0x76,0x12,0x01,0x27, -0x12,0x01,0x13,0x12,0x01,0x04,0x12,0x01,0x24,0x11,0x94,0x11,0x02,0x07,0x11,0x01,0x29,0x0f,0x99,0x0f,0x02,0x79,0x0e,0x01,0x0a,0x0e,0x1a,0x0e,0x02,0x79,0x0a,0x01,0x1b,0x0a,0x01,0x0a,0x0a,0x01,0x2a,0x09,0x9a,0x09,0x02,0x09,0x09,0x01,0x19,0x7e,0x06,0x1f,0x1f,0x14,0x7d,0x20,0x40,0x06,0x01,0x10,0x20,0x20,0x20,0x30,0x20,0x03, -0x06,0x20,0x06,0x20,0x31,0x28,0x7d,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x24,0x91,0x10,0x04,0x1f,0x1d,0x91,0x00,0x02,0x2c,0x91,0x06,0x08,0x13,0x00,0x3f,0x33,0xed,0xdc,0x32,0xed,0x32,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x03,0x10,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16, -0x33,0x32,0x37,0x36,0x05,0xaa,0x34,0x3c,0x88,0x5e,0x61,0x02,0x6e,0x85,0xfe,0xc8,0xb8,0xb0,0xb1,0xbb,0x01,0x4c,0x01,0x35,0xb4,0xab,0xba,0x23,0x43,0x39,0x32,0x45,0x3c,0x34,0xb0,0x73,0x81,0xfc,0xf2,0x8b,0x7f,0x7b,0x88,0xed,0xfc,0x86,0x7a,0xff,0x17,0x51,0x54,0x7e,0x25,0xd1,0xc7,0x01,0x3c,0x01,0x51,0xcd,0xd8,0xd2,0xc7,0xfe, -0xc6,0xfe,0xa1,0xcc,0x22,0x48,0x37,0x4a,0x2c,0x28,0x1f,0x03,0x34,0x01,0x05,0x9d,0xb0,0xb3,0xa3,0xf9,0xf5,0xa3,0xb4,0xaa,0x9b,0x00,0x00,0x01,0x00,0x32,0xff,0xe8,0x05,0xd5,0x05,0x9a,0x00,0x0f,0x00,0x45,0x40,0x2a,0x35,0x0c,0x01,0x26,0x0c,0x01,0x96,0x0a,0x01,0x33,0x0a,0x01,0x25,0x0a,0x01,0x59,0x03,0x01,0x4b,0x03,0x01,0x4a, -0x01,0x01,0x0f,0x7e,0x0d,0x0d,0x11,0x09,0x7e,0x07,0x05,0x0e,0x05,0x91,0x08,0x03,0x0b,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0xc4,0x01,0x2f,0xcd,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x21,0x35,0x21,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x05,0xd5,0xfd, -0xdf,0xfd,0xf6,0xfe,0x88,0x02,0x20,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0x98,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x05,0x43,0x05,0x9a,0x00,0x16,0x00,0x48,0x40,0x29,0x47,0x10,0x01,0x36,0x10,0x01,0x58,0x06,0x01,0x5a,0x05,0x01,0x14,0x00,0x7e,0x02,0x02,0x18, -0x0c,0x0e,0x7e,0x0a,0x09,0x0f,0x07,0x01,0x07,0x14,0x12,0x91,0x02,0x04,0x04,0x01,0x09,0x91,0x15,0x0c,0x03,0x01,0x12,0x00,0x3f,0x3f,0xc4,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x5d,0x33,0xce,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x21,0x35, -0x21,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x05,0x43,0xa8,0xbc,0xc3,0xd7,0xfe,0x23,0xfe,0xc8,0x02,0x20,0x63,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x08,0xd8,0x94,0x86,0x98,0xce,0xe0,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0x64,0xff,0xe8,0x05,0x23,0x05,0x9a,0x00,0x19,0x00,0x61,0x40,0x3c, -0x69,0x14,0x79,0x14,0x02,0x66,0x11,0x76,0x11,0x02,0x8a,0x07,0x01,0x96,0x05,0x01,0x80,0x05,0x01,0x05,0x05,0x01,0x19,0x7e,0x01,0x18,0x03,0x7e,0x00,0x15,0x01,0x15,0x15,0x1b,0x0d,0x0f,0x7e,0x0c,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0d,0x0c,0x19,0x91,0x01,0x03,0x0c,0x03,0x0c,0x03,0x16,0x03,0x13,0x91,0x06,0x13,0x00,0x3f,0xed,0x3f, -0x39,0x39,0x2f,0x2f,0x10,0xce,0xed,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0x5d,0xfd,0xc4,0xde,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x15,0x10,0x21,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x11,0x11,0x33,0x11,0x21,0x05,0x23,0x9c,0xcf,0xfe,0x58,0xd5, -0x71,0x66,0x34,0x96,0x22,0x36,0x44,0x8a,0x01,0x00,0xa8,0x01,0x6b,0x01,0xc2,0xcb,0xd9,0xfe,0x34,0x8a,0x7c,0xc9,0x8e,0x6a,0x46,0x4e,0x64,0x83,0x56,0x6c,0x01,0x48,0x03,0xe0,0xfd,0x8b,0x00,0x01,0x00,0xb0,0xff,0xe8,0x04,0x04,0x05,0x9a,0x00,0x13,0x00,0x4b,0x40,0x2f,0x59,0x0d,0x69,0x0d,0x02,0x66,0x0a,0x01,0x57,0x0a,0x01,0x99, -0x05,0x01,0x8a,0x05,0x01,0x7b,0x05,0x01,0x75,0x02,0x01,0x12,0x00,0x7e,0x11,0x10,0x0f,0x20,0x0f,0x02,0x0f,0x0f,0x15,0x09,0x7e,0x06,0x11,0x12,0x12,0x08,0x03,0x0b,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07, -0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x32,0x37,0x36,0x35,0x34,0x27,0x37,0x16,0x04,0x04,0x65,0x72,0xd5,0xfe,0x58,0xa8,0x01,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x01,0xb7,0xc9,0x7c,0x8a,0x01,0xcc,0x03,0xe6,0xfc,0x20,0xfe,0xb8,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a, -0x00,0x0e,0x00,0x15,0x00,0x53,0x40,0x34,0x38,0x15,0x48,0x15,0x02,0x56,0x09,0x01,0x57,0x06,0x01,0x77,0x05,0x87,0x05,0x02,0x65,0x05,0x01,0x53,0x05,0x01,0x0e,0x0e,0x07,0x7d,0x10,0x0f,0x20,0x0f,0x02,0x0f,0x0f,0x01,0x17,0x13,0x0c,0x7e,0x01,0x0c,0x91,0x14,0x14,0x0d,0x12,0x91,0x02,0x03,0x0d,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f, -0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x23,0x11,0x21,0x03,0x10,0x21,0x23,0x11,0x33,0x20,0x04,0x29,0xfc,0x93,0x01,0x8a,0xdc,0x7e,0x89,0x99,0x8f,0xe0,0xbd,0x02,0xc5,0xb0,0xfe, -0xb0,0xc5,0xb0,0x01,0x65,0x05,0x9a,0x66,0x70,0xd6,0xdb,0x7f,0x76,0xfe,0x7a,0x03,0x4e,0x01,0x1c,0xfd,0xb4,0x00,0x00,0x02,0x00,0x5e,0xfe,0xea,0x05,0xaa,0x05,0xb2,0x00,0x1d,0x00,0x2d,0x00,0xc8,0x40,0x8d,0x6a,0x2c,0x01,0x59,0x2c,0x01,0x69,0x2b,0x99,0x2b,0x02,0x64,0x29,0x01,0x87,0x28,0x01,0x55,0x28,0x01,0x87,0x24,0x01,0x55, -0x24,0x01,0x63,0x23,0x01,0x56,0x23,0x01,0x6b,0x21,0x01,0x59,0x20,0x01,0x07,0x1c,0x01,0x75,0x18,0x01,0x16,0x18,0x01,0x05,0x18,0x01,0x24,0x17,0x94,0x17,0x02,0x15,0x17,0x01,0x07,0x17,0x01,0x99,0x15,0x01,0x2a,0x15,0x01,0x18,0x15,0x01,0x19,0x14,0x79,0x14,0x02,0x0a,0x14,0x01,0x1a,0x10,0x7a,0x10,0x02,0x0b,0x10,0x01,0x99,0x0f, -0x01,0x2c,0x0f,0x01,0x1a,0x0f,0x01,0x09,0x0f,0x01,0x47,0x1c,0x01,0x1c,0x00,0x7e,0x0c,0x05,0x0a,0x0a,0x1a,0x7d,0x10,0x1e,0x20,0x1e,0x30,0x1e,0x03,0x1e,0x1e,0x2f,0x26,0x7d,0x0f,0x12,0x1f,0x12,0x02,0x12,0x22,0x91,0x16,0x04,0x05,0x91,0x06,0x2a,0x91,0x1c,0x0c,0x0e,0x13,0x00,0x3f,0x33,0x33,0xed,0xde,0xed,0x3f,0xed,0x01,0x2f, -0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x33,0x2f,0xcc,0x33,0xed,0x32,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x14,0x06,0x07,0x06,0x23,0x35,0x16,0x37,0x36,0x35,0x34,0x27,0x06,0x21,0x20,0x27,0x26, -0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x16,0x03,0x10,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0xaa,0x86,0x6b,0x25,0x4d,0x22,0x27,0x82,0x41,0xb4,0xfe,0xe1,0xfe,0xc8,0xb8,0xb0,0xb1,0xbb,0x01,0x4c,0x01,0x35,0xb4,0xab,0x7b,0x7b,0xb0,0x73,0x81,0xfc,0xf2,0x8b,0x7f,0x7b,0x88, -0xed,0xfc,0x86,0x7a,0x1c,0x64,0xa2,0x21,0x0b,0x87,0x03,0x0c,0x28,0x74,0x52,0x2c,0xac,0xd1,0xc7,0x01,0x3c,0x01,0x51,0xcd,0xd8,0xd2,0xc7,0xfe,0xc6,0xfe,0xe3,0xbc,0x55,0x02,0x17,0x01,0x05,0x9d,0xb0,0xb3,0xa3,0xf9,0xf5,0xa3,0xb4,0xaa,0x9b,0x00,0x00,0x03,0x00,0x5a,0x00,0x00,0x05,0x4c,0x05,0xb2,0x00,0x12,0x00,0x1b,0x00,0x24, -0x00,0x79,0x40,0x51,0x56,0x24,0x01,0x65,0x23,0x75,0x23,0x02,0x65,0x1f,0x75,0x1f,0x02,0x7b,0x1a,0x01,0x6a,0x1a,0x01,0x59,0x16,0x01,0x6a,0x15,0x7a,0x15,0x02,0x97,0x11,0x01,0x85,0x11,0x01,0x89,0x0d,0x01,0x98,0x09,0x01,0x8b,0x09,0x01,0x86,0x02,0x01,0x13,0x7d,0x10,0x00,0x20,0x00,0x02,0x00,0x04,0x18,0x7e,0x07,0x21,0x7d,0x1f, -0x0b,0x2f,0x0b,0x02,0x0b,0x1c,0x07,0x18,0x1c,0x91,0x07,0x04,0x04,0x06,0x17,0x1d,0x91,0x0f,0x04,0x06,0x12,0x00,0x3f,0x3f,0xed,0x32,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xdd,0x5d,0xed,0x10,0xfd,0xc4,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x07, -0x11,0x23,0x11,0x26,0x27,0x26,0x35,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x03,0x34,0x27,0x26,0x27,0x11,0x36,0x37,0x36,0x05,0x11,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x05,0x4c,0xa1,0x9b,0xe9,0xa8,0xec,0x99,0xa0,0xc0,0xb7,0x01,0x04,0x01,0x06,0xb3,0xbe,0xb0,0x6c,0x67,0xa2,0xa3,0x66,0x6c,0xfd,0xe3,0xa3,0x66,0x6c,0x6c,0x67,0x03, -0x72,0xec,0xa5,0xa0,0x19,0xfe,0xd8,0x01,0x28,0x16,0x99,0xa0,0xee,0x01,0x04,0xa9,0xa0,0x98,0xa2,0xfe,0xf3,0xab,0x75,0x6e,0x1a,0xfc,0xaf,0x19,0x6f,0x75,0xfc,0x03,0x51,0x19,0x6f,0x75,0xac,0xaa,0x75,0x6f,0x00,0x01,0x00,0x32,0x00,0x00,0x04,0x62,0x05,0x9a,0x00,0x0f,0x00,0x46,0x40,0x2b,0x00,0x7e,0x20,0x02,0xa0,0x02,0xb0,0x02, -0xc0,0x02,0x04,0x02,0x03,0x0e,0x7e,0x06,0x07,0x7e,0x2f,0x09,0xaf,0x09,0xbf,0x09,0xcf,0x09,0x04,0x09,0x0b,0x06,0x0e,0x09,0x0b,0x91,0x06,0x01,0x03,0x03,0x05,0x0d,0x03,0x05,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xce,0xc4,0xfd,0xce,0xc4,0x01,0x2f,0xc4,0xdc,0x5d,0xed,0x10,0xfd,0xc4,0xdd,0x5d,0xed,0x31,0x30,0x01,0x23,0x35,0x21, -0x11,0x23,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x33,0x11,0x21,0x04,0x62,0x9c,0xfe,0xd8,0xa8,0xfe,0x3c,0x9c,0x01,0x28,0xa8,0x01,0xc4,0x02,0x9d,0xcb,0xfc,0x98,0x03,0x68,0x01,0x63,0xcb,0x01,0x9a,0xfe,0x66,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0xb2,0x00,0x0d,0x00,0x38,0x40,0x21,0x45,0x0c,0x01,0x44,0x0a,0x01,0x3a,0x05, -0x01,0x29,0x05,0x01,0x3a,0x03,0x01,0x29,0x03,0x01,0x00,0x7e,0x02,0x02,0x0f,0x06,0x7e,0x08,0x04,0x91,0x0b,0x04,0x01,0x07,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x04,0xd5,0xa8,0xfe, -0x93,0xfe,0x92,0xa8,0x02,0x17,0x02,0x14,0x03,0x71,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x12,0x00,0x3a,0x40,0x20,0x36,0x0c,0x01,0x68,0x06,0x01,0x4a,0x06,0x5a,0x06,0x02,0x10,0x00,0x7e,0x02,0x02,0x14,0x09,0x7e,0x07,0x02,0x04,0x91,0x10,0x0e,0x0e, -0x00,0x09,0x11,0x03,0x00,0x12,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x11,0x33,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0xa2,0xa8,0xbc,0xc3,0xd7,0xfe,0xa8,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02, -0x7b,0x73,0x01,0x08,0xd8,0x01,0xb2,0xfe,0x52,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x81,0x05,0x9a,0x00,0x21,0x00,0x5c,0x40,0x38,0x86,0x1c,0x01,0x36,0x0f,0x01,0x36,0x0b,0x96,0x0b,0x02,0x27,0x0b,0x01,0x49,0x06,0x59,0x06,0x02,0x49,0x02,0x59,0x02,0x02,0x4a,0x01,0x01,0x21,0x7e,0x12,0x1f,0x1f, -0x18,0x23,0x09,0x7e,0x08,0x08,0x1a,0x7e,0x18,0x1f,0x1d,0x91,0x12,0x09,0x14,0x14,0x0d,0x1a,0x20,0x03,0x0d,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xce,0x33,0xed,0x32,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xc4,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22, -0x27,0x26,0x35,0x33,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0x85,0x88,0xdf,0xdb,0x8d,0x87,0xa8,0x57,0x61,0x8f,0x90,0x5e,0x56,0xe4,0xc6,0xb7,0x67,0x6b,0xa8,0xf5,0xb4,0xe2,0xa8,0x01,0xb4,0xce,0x7e,0x80,0x8a,0x85,0xc0,0x76,0x63,0x6c, -0x6a,0x61,0x7d,0x01,0x12,0x7a,0x5e,0x61,0xb5,0x01,0xd4,0xfe,0x34,0xe8,0x6e,0x02,0x46,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xc5,0x05,0x9a,0x00,0x12,0x00,0x40,0x40,0x24,0x66,0x11,0x76,0x11,0x02,0x59,0x04,0x01,0x4a,0x04,0x01,0x39,0x04,0x01,0x00,0x7e,0x02,0x02,0x0a,0x14,0x0d,0x08,0x7e,0x0a,0x08,0x06,0x91,0x0d,0x0f,0x0f, -0x0a,0x0c,0x03,0x01,0x0a,0x12,0x00,0x3f,0xc4,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x12,0x15,0x04,0xc5,0xa8,0x52,0x55,0x96,0xb2,0xbd,0xa8,0xa8,0xbc,0xc3,0xd7, -0xfe,0x01,0xae,0x97,0x59,0x5c,0x70,0xfd,0x76,0x05,0x9a,0xfd,0x85,0x73,0xfe,0xf8,0xd8,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x00,0x05,0xb2,0x00,0x1f,0x00,0x83,0x40,0x57,0x66,0x18,0x01,0x06,0x17,0x16,0x17,0x56,0x17,0x66,0x17,0x04,0x56,0x13,0x66,0x13,0x02,0x66,0x12,0x01,0x08,0x0b,0x18,0x0b,0x02,0x29,0x05,0x01,0x77,0x0a, -0x01,0x99,0x07,0x01,0x79,0x06,0x01,0x0f,0x0f,0x1f,0x7e,0x02,0x10,0x1d,0x01,0x1d,0x1d,0x21,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x1e,0x1e,0x19,0x0f,0x11,0x91,0x96,0x0e,0x01,0x87,0x0e,0x01,0x76,0x0e,0x01,0x0e,0x0c,0x04,0x1d,0x19,0x91,0x69,0x02,0x79,0x02,0x02,0x02,0x04,0x13,0x00,0x12,0x00,0x3f,0x3f,0x33,0x5d,0xed,0x32, -0x3f,0x33,0x5d,0x5d,0x5d,0xed,0x32,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36, -0x37,0x11,0x33,0x05,0x00,0xa8,0xa7,0xb9,0xfe,0xc6,0xb4,0xac,0xbf,0xc5,0x01,0x46,0xe0,0x9f,0xae,0xe4,0xf8,0x8d,0x82,0x7b,0x86,0xfe,0x66,0x5f,0x56,0x30,0xa8,0x40,0x58,0xcd,0xc3,0x01,0x42,0x01,0x4e,0xd2,0xd8,0x4c,0xba,0x6e,0xaf,0xa2,0xfe,0xfd,0xfe,0xf8,0x99,0xa6,0x28,0x23,0x34,0x01,0x56,0x00,0x00,0x02,0x00,0x5c,0xff,0xe8, -0x05,0xb0,0x05,0x9a,0x00,0x15,0x00,0x1f,0x00,0x73,0x40,0x4c,0x39,0x1e,0x01,0x39,0x1d,0x01,0x36,0x1b,0x01,0x35,0x19,0x01,0x4b,0x0f,0x5b,0x0f,0x02,0x49,0x0e,0x59,0x0e,0x02,0x59,0x0a,0x01,0x4a,0x0a,0x01,0x5a,0x09,0x01,0x56,0x07,0x01,0x55,0x06,0x01,0x44,0x06,0x01,0x15,0x7e,0x01,0x03,0x14,0x7e,0x11,0x00,0x17,0x10,0x17,0x02, -0x17,0x17,0x21,0x1a,0x7e,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x14,0x11,0x91,0x17,0x01,0x03,0x03,0x12,0x03,0x1c,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0x39,0x2f,0xce,0xc4,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0xfd,0xc4,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35, -0x23,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x11,0x33,0x11,0x21,0x01,0x11,0x21,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x05,0xb0,0x9c,0xc8,0x83,0x87,0xe8,0xef,0x8a,0x85,0x78,0x7e,0xef,0x01,0x63,0xa8,0x01,0x64,0xfd,0xf4,0xfe,0xaf,0xfe,0xb1,0x01,0x4a,0xa7,0x5b,0x54,0x02,0x9d,0xcb,0xfe,0x8c,0xea, -0x8f,0x93,0x93,0x8f,0xf0,0xf0,0x87,0x8f,0x01,0x9a,0xfe,0x66,0xfd,0xf8,0x01,0x70,0xfe,0x8c,0xfe,0x7e,0x72,0x69,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x5f,0x40,0x3c,0x67,0x19,0x77,0x19,0x02,0x68,0x14,0x78,0x14,0x02,0x85,0x12,0x95,0x12,0x02,0x86,0x11,0x96,0x11,0x02,0x89,0x02,0x99,0x02, -0x02,0x9a,0x01,0x01,0x89,0x01,0x01,0x00,0x7d,0x13,0x13,0x0d,0x1b,0x07,0x7e,0x09,0x17,0x0b,0x06,0x7e,0x0d,0x08,0x0a,0x91,0x07,0x18,0x91,0x05,0x05,0x0d,0x16,0x91,0x0e,0x03,0x0d,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0xde,0xfd,0xcd,0x01,0x2f,0xfd,0xc4,0xc4,0xdc,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x21,0x15,0x21,0x11,0x23,0x35,0x23,0x11,0x23,0x11,0x21,0x32,0x17,0x16,0x07,0x34,0x21,0x23,0x11,0x33,0x20,0x04,0x38,0x81,0x78,0xcb,0xfe,0xf0,0x01,0x6b,0x9c,0xcf,0xa8,0x01,0xaa,0xd5,0x79,0x84,0xb1,0xfe,0xc9,0xec,0xec,0x01,0x37,0x04,0x2f,0xb2,0x60,0x59,0x99,0xfe,0x9d,0xcb, -0xfe,0x6d,0x05,0x9a,0x56,0x5e,0xb7,0xd3,0xfe,0x5a,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xb5,0x05,0xb2,0x00,0x31,0x00,0xa6,0x40,0x68,0x66,0x31,0x76,0x31,0x02,0x76,0x29,0x01,0x7a,0x27,0x01,0x95,0x20,0x01,0x66,0x20,0x86,0x20,0x02,0x9a,0x1c,0x01,0x8b,0x1c,0x01,0x6c,0x1c,0x01,0x89,0x1a,0x01,0x7c,0x12,0x01,0x56,0x0f,0x01,0x89, -0x07,0x01,0x7a,0x07,0x01,0x69,0x07,0x01,0x66,0x02,0x01,0x66,0x01,0x01,0x23,0x21,0x7d,0x24,0x26,0x26,0x13,0x2e,0x2a,0x00,0x7d,0x17,0x1b,0x20,0x13,0x50,0x13,0x02,0x13,0x13,0x33,0x2a,0x7d,0x1b,0x0b,0x0d,0x7d,0x0a,0x08,0x08,0x1b,0x23,0x23,0x2e,0x28,0x2e,0x1d,0x11,0x0a,0x0a,0x17,0x11,0x17,0x04,0x28,0x91,0x1d,0x04,0x11,0x91, -0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0xed,0x11,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14, -0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x11,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x10,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x21,0x20,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x04,0xb5,0xab,0x8c,0xec,0xe8,0x93,0xb3,0x0f,0xb4,0x12,0x81,0x62,0x9c,0x01,0x71, -0x7a,0x49,0xa5,0xf5,0x70,0xaf,0x01,0xfa,0xcb,0x84,0xa1,0x0a,0xae,0x08,0xfe,0xbe,0xfe,0xb8,0x80,0x48,0xaa,0xee,0x73,0xa9,0x01,0x85,0xdd,0x6a,0x56,0x57,0x6b,0xd9,0x43,0x40,0x43,0x42,0x8e,0x42,0x32,0x01,0x06,0x85,0x44,0x28,0x1f,0x2e,0x43,0x68,0xcc,0x01,0x78,0x4e,0x5f,0xbd,0x25,0x4b,0x45,0x2b,0xd2,0xe0,0x85,0x42,0x26,0x1e, -0x2b,0x48,0x6b,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xc5,0x05,0x9a,0x00,0x14,0x00,0x46,0x40,0x2a,0x39,0x10,0x01,0x66,0x02,0x76,0x02,0x02,0x45,0x02,0x55,0x02,0x02,0x47,0x01,0x57,0x01,0x02,0x07,0x07,0x14,0x7e,0x12,0x12,0x09,0x16,0x0c,0x05,0x7e,0x09,0x0e,0x91,0x03,0x03,0x06,0x13,0x0b,0x03,0x06,0x91,0x09,0x12,0x00,0x3f, -0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x04,0xc5,0xfe,0xd7,0xc3,0xbc,0x02,0xf2,0xfc,0x66,0xa8,0xbd,0xb2,0x96,0x55,0x52,0xa8,0x03,0xe8, -0xd8,0xfe,0xf8,0x73,0xfe,0x1d,0x98,0x05,0x9a,0xfd,0x76,0x70,0x5c,0x59,0x97,0x01,0xae,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x05,0x1d,0x05,0x9a,0x00,0x0a,0x00,0x0d,0x00,0x6b,0x40,0x41,0x0d,0x0b,0x04,0x0c,0x00,0x0a,0x09,0x03,0x0c,0x00,0x05,0x0b,0x04,0x01,0x06,0x02,0x09,0x03,0x01,0x06,0x0b,0x03,0x09,0x03,0x7e,0x04,0x0b,0x14, -0x04,0x04,0x0b,0x09,0x09,0x0c,0x01,0x06,0x01,0x7e,0x00,0x0c,0x14,0x00,0x0c,0x00,0x00,0x04,0x0f,0x07,0x06,0x06,0x0b,0x04,0x01,0x04,0x0c,0x06,0x0b,0x91,0x09,0x03,0x01,0x00,0x03,0x04,0x12,0x00,0x3f,0xc4,0xdc,0xc4,0x3f,0xfd,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0xcd,0x11,0x12,0x39,0x2f,0x87,0x2b,0x87,0x7d,0xc4,0x01,0x33,0x18, -0x2f,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x0f,0x0f,0x0f,0x0f,0x31,0x30,0x25,0x23,0x01,0x01,0x23,0x01,0x01,0x21,0x35,0x21,0x01,0x13,0x21,0x13,0x05,0x1d,0xce,0xfe,0xa3,0xfe,0x0e,0xce,0x02,0x59,0xfe,0xad,0xfe,0xfa,0x04,0xeb,0xfe,0x3c,0x86,0xfe,0x27,0xec,0xcc,0x01,0xdb,0xfd,0x59,0x03,0x33,0x01,0xcf,0x98,0xfd,0x99,0x01,0xcf,0xfe, -0xbd,0x00,0x00,0x01,0x00,0x32,0xff,0xe8,0x05,0xd5,0x05,0x9a,0x00,0x11,0x00,0x55,0x40,0x35,0x29,0x0e,0x39,0x0e,0x49,0x0e,0x03,0x96,0x0c,0x01,0x44,0x0c,0x01,0x35,0x0c,0x01,0x26,0x0c,0x01,0x59,0x03,0x01,0x11,0x7e,0x10,0x0f,0x01,0x0f,0x0f,0x04,0x13,0x09,0x7e,0x07,0x0b,0x7e,0x0f,0x04,0x01,0x04,0x11,0x11,0x0a,0x0d,0x07,0x05, -0x91,0x0a,0x03,0x0d,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xce,0x11,0x12,0x39,0x2f,0x01,0x2f,0x5d,0xed,0xde,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x23,0x15,0x23,0x11,0x21,0x11,0x10,0x21,0x20,0x11,0x35,0x33,0x05,0xd5,0xfd,0xdf,0xfd,0xf6,0xdc,0x9c,0x02, -0x20,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0xcb,0x01,0x63,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x7f,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xf0,0x05,0x9a,0x00,0x11,0x00,0x55,0x40,0x34,0x97,0x0f,0xa7,0x0f,0x02,0x86,0x0f,0x01,0x7a,0x02,0x01,0x00,0x10,0x7e,0x01,0x01,0x09,0x13,0x0c,0x07,0x7e,0x09,0x75,0x0c, -0x01,0x56,0x0c,0x66,0x0c,0x02,0x44,0x0c,0x01,0x23,0x0c,0x33,0x0c,0x02,0x0c,0x0e,0x91,0x03,0x10,0x91,0x01,0x03,0x03,0x08,0x0b,0x03,0x08,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xde,0xed,0x10,0xed,0x32,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x21,0x10,0x23,0x22, -0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x20,0x13,0x33,0x04,0xf0,0xfe,0x95,0xf0,0x94,0x4c,0x44,0xa8,0xa8,0x6f,0xb5,0x01,0x49,0x41,0xd1,0x02,0x44,0x01,0x4a,0x78,0x6b,0xb1,0xfe,0x06,0x05,0x9a,0xfe,0x07,0x77,0xfe,0xc4,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0x9a,0x00,0x15,0x00,0x64,0x40,0x42,0x27,0x15, -0x01,0x86,0x14,0x01,0x37,0x14,0x01,0x25,0x14,0x01,0x6b,0x0d,0x7b,0x0d,0x02,0x59,0x0d,0x01,0x99,0x09,0x01,0x1b,0x09,0x5b,0x09,0x02,0x08,0x09,0x01,0x65,0x02,0x75,0x02,0x02,0x00,0x7d,0x00,0x0b,0x10,0x0b,0x02,0x0b,0x0b,0x17,0x12,0x7e,0x0f,0x06,0x06,0x0f,0x0f,0x91,0x13,0x10,0x03,0x06,0x08,0x91,0x9a,0x05,0x01,0x05,0x03,0x13, -0x00,0x3f,0x33,0x5d,0xed,0x32,0x3f,0xdc,0xed,0x01,0x2f,0x32,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x00,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x00,0x11,0x34,0x00,0x23,0x21,0x11,0x33,0x15,0x33,0x20,0x00,0x04,0x8c,0xfe,0x75,0xfe,0xaf,0xcc,0x86,0x9a,0xba, -0x01,0x0a,0x01,0x20,0xfe,0xf1,0xf9,0xfe,0xf4,0x9c,0x86,0x01,0x3c,0x01,0x66,0x02,0xa7,0xfe,0xba,0xfe,0x87,0x3b,0xb3,0x56,0x01,0x1d,0x01,0x00,0xec,0x01,0x00,0x01,0x11,0x79,0xfe,0xb4,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0x2f,0x05,0x9a,0x00,0x14,0x00,0x3f,0x40,0x24,0x36,0x0e,0x46,0x0e,0x02,0x5b,0x05,0x01,0x12,0x00,0x7e,0x02, -0x02,0x16,0x0a,0x0c,0x7e,0x09,0x07,0x40,0x09,0x0d,0x48,0x07,0x02,0x04,0x91,0x12,0x10,0x10,0x01,0x0a,0x13,0x03,0x01,0x12,0x00,0x3f,0x3f,0xce,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2b,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x17, -0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x2f,0xa8,0xbc,0xc3,0xd7,0xfe,0x33,0xb0,0x3b,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x08,0xd8,0x72,0x88,0x92,0x64,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x01,0x00,0x96,0x00,0x00,0x04,0xc4,0x05,0x9a,0x00,0x10,0x00,0x41,0x40,0x26,0x96,0x0b,0x01,0x87,0x0b,0x01,0x49,0x06,0x01,0x3a, -0x06,0x01,0x3a,0x01,0x4a,0x01,0x02,0x09,0x7e,0x07,0x04,0x0f,0x7e,0x00,0x02,0x7e,0x04,0x05,0x02,0x91,0x0c,0x0c,0x04,0x0f,0x09,0x03,0x04,0x12,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x32,0x01,0x2f,0xfd,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x05,0x11,0x23,0x11,0x24,0x11,0x11,0x33,0x11, -0x10,0x21,0x20,0x11,0x11,0x33,0x04,0xc4,0xfe,0x3d,0xa8,0xfe,0x3d,0xa8,0x01,0x6f,0x01,0x6f,0xa8,0x04,0x48,0xfd,0xd4,0x2c,0xfe,0x10,0x01,0xf0,0x2e,0x02,0x13,0x01,0x69,0xfe,0xa2,0xfe,0x47,0x01,0xaa,0x01,0x6d,0x00,0x00,0x03,0x00,0x52,0xff,0xe8,0x06,0x3a,0x05,0x9a,0x00,0x17,0x00,0x22,0x00,0x2e,0x00,0x6b,0x40,0x40,0x89,0x2d, -0x01,0x85,0x27,0x01,0x77,0x27,0x01,0x95,0x17,0x01,0x9a,0x11,0x01,0x94,0x0a,0x01,0x94,0x01,0x01,0x1e,0x07,0x03,0x7e,0x24,0x14,0x06,0x06,0x00,0x7d,0x18,0x14,0x18,0x14,0x18,0x30,0x29,0x7e,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x07,0x24,0x91,0x04,0x1e,0x91,0x02,0x14,0x04,0x04,0x2b,0x1d,0x91,0x15,0x03,0x2b,0x91,0x0b,0x13,0x00,0x3f, -0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xde,0xed,0x10,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0x10,0xc4,0xfd,0xc4,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x21,0x15,0x21,0x15,0x21,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x33,0x11,0x21,0x20,0x03, -0x34,0x27,0x26,0x23,0x23,0x11,0x33,0x32,0x37,0x36,0x01,0x35,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x06,0x3a,0xfe,0x3c,0xfe,0xf0,0x02,0x23,0xfd,0xdd,0xcd,0xb6,0xb5,0x6b,0x71,0x81,0x74,0xb1,0xc6,0x01,0xaa,0x01,0xd2,0xb1,0x5b,0x45,0x97,0xec,0xec,0xa4,0x45,0x4e,0xfd,0x35,0xc6,0x65,0x45,0x4c,0xe1,0x69,0x3a,0x38, -0x04,0x61,0xfe,0xc7,0x82,0x98,0xa8,0xb5,0xc9,0x57,0x5c,0xa8,0xab,0x60,0x58,0x02,0xf4,0xfe,0xc7,0x60,0x25,0x1c,0xfe,0xbe,0x21,0x24,0xfd,0x61,0xa8,0x32,0x39,0x60,0xc4,0x41,0x3e,0x00,0x00,0x01,0x00,0x60,0xff,0xea,0x03,0x98,0x04,0x00,0x00,0x2d,0x00,0x58,0x40,0x36,0x99,0x16,0x01,0x88,0x16,0x01,0x95,0x29,0x01,0x76,0x29,0x86, -0x29,0x02,0x27,0x29,0x37,0x29,0x02,0x29,0x00,0x24,0x84,0x23,0x00,0x84,0x19,0x6a,0x1e,0x01,0x1e,0x19,0x10,0x19,0x90,0x19,0x02,0x23,0x19,0x23,0x19,0x2f,0x0f,0x84,0x0a,0x0d,0x0c,0x0c,0x24,0x0f,0x14,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x5d,0x10,0xed,0x10, -0xed,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x1e,0x03,0x03,0x98,0x44,0x72,0x96,0x51,0x51,0x95,0x72,0x43,0x28,0x9c,0x1e,0x27,0x43,0x59,0x32,0x32,0x5a, -0x43,0x28,0x16,0x28,0x39,0x23,0x36,0x41,0x26,0x0f,0x03,0xa4,0x01,0x0e,0x20,0x35,0x28,0x2c,0x47,0x31,0x1b,0x01,0x4a,0x57,0x84,0x58,0x2d,0x2d,0x58,0x84,0x57,0x5f,0x50,0x37,0x38,0x44,0x36,0x4f,0x34,0x19,0x19,0x34,0x4f,0x36,0x2f,0x49,0x42,0x3f,0x25,0x38,0x57,0x59,0x69,0x4b,0x37,0x54,0x48,0x45,0x28,0x2c,0x52,0x57,0x63,0x00, -0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xec,0x00,0x16,0x00,0x26,0x00,0x84,0x40,0x59,0x96,0x21,0x01,0x96,0x1d,0x01,0x53,0x15,0x01,0x44,0x15,0x01,0x53,0x14,0x01,0x42,0x14,0x01,0x09,0x0a,0x01,0x5a,0x06,0x01,0x4b,0x06,0x01,0x59,0x05,0x01,0x56,0x03,0x01,0x56,0x02,0x01,0x45,0x02,0x01,0x17,0x83,0x40,0x00,0x50,0x00,0x02, -0x00,0x12,0x84,0x0c,0x10,0x84,0x0e,0x0c,0x1f,0x83,0x0f,0x08,0x3f,0x08,0x02,0x08,0x4f,0x0c,0x01,0x0c,0x0e,0x95,0x11,0x11,0x0f,0x1b,0x95,0x0c,0x00,0x13,0x10,0x13,0x20,0x13,0x03,0x13,0x10,0x0f,0x00,0x23,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x5d,0x33,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x5d,0xdd,0x5d,0xed,0x10,0xde,0xed, -0x10,0xfd,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x10,0x37,0x36,0x37,0x35,0x21,0x11,0x33,0x15,0x21,0x11,0x16,0x17,0x16,0x03,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x50,0x85,0x8b,0xee, -0xe7,0x87,0x84,0x8d,0x71,0xb2,0xfe,0xb8,0xa4,0x01,0x48,0xb1,0x6b,0x80,0xa8,0x4a,0x55,0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0x01,0x02,0x91,0x74,0x17,0xc9,0x01,0x11,0x79,0xfe,0xa1,0x14,0x75,0x8c,0xfe,0xff,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a,0x73,0x74,0x66,0x00,0x02, -0x00,0x60,0xfe,0x1e,0x04,0x50,0x04,0x18,0x00,0x32,0x00,0x42,0x00,0x8d,0x40,0x5b,0x49,0x42,0x59,0x42,0x02,0x59,0x3e,0x01,0x4a,0x3e,0x01,0x55,0x3b,0x01,0x46,0x3b,0x01,0x6a,0x23,0x01,0x76,0x1a,0x01,0x65,0x1a,0x01,0x07,0x1a,0x17,0x1a,0x02,0x48,0x0e,0x58,0x0e,0x02,0x19,0x0e,0x29,0x0e,0x39,0x0e,0x03,0x19,0x16,0x83,0x2e,0x2b, -0x2e,0x1c,0x83,0x40,0x30,0x40,0x01,0x2e,0x40,0x2e,0x40,0x26,0x44,0x08,0x05,0x83,0x09,0x0c,0x0c,0x38,0x83,0x0f,0x26,0x1f,0x26,0x02,0x26,0x08,0x09,0x33,0x95,0x19,0x2b,0x2b,0x00,0x3d,0x95,0x21,0x1c,0x00,0x95,0x11,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xed,0x32, -0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02, -0x33,0x36,0x36,0x35,0x34,0x2e,0x02,0x13,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xc6,0x2a,0x46,0x32,0x1c,0x06,0x0e,0xa6,0x10,0x06,0x35,0x5f,0x83,0x4f,0x4f,0x82,0x5e,0x34,0x17,0x0e,0xa5,0xa7,0x46,0x83,0xbd,0x78,0x74,0xb9,0x81,0x44,0x46,0x85,0xc2,0x7c,0x0e,0x10,0x1d,0x33,0x47,0x6e,0x57,0x81, -0x54,0x2a,0x2b,0x56,0x80,0x55,0x9f,0xab,0xab,0x03,0x8e,0x1f,0x35,0x45,0x27,0x1b,0x2f,0x39,0x1d,0x46,0x3a,0x20,0x4a,0x7a,0x57,0x2f,0x2f,0x58,0x7d,0x4e,0x43,0x60,0x22,0x28,0xfa,0xc3,0x76,0xbd,0x84,0x47,0x44,0x80,0xb7,0x73,0x7c,0xc1,0x84,0x45,0x27,0x4e,0x35,0x33,0x4f,0x35,0x1b,0xfd,0xfa,0x35,0x62,0x8a,0x55,0x53,0x86,0x5e, -0x33,0xb0,0xbe,0xc0,0xb2,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x06,0xa0,0x04,0x18,0x00,0x3e,0x00,0x52,0x01,0x00,0x40,0xa8,0x97,0x11,0x01,0x95,0x10,0x01,0x57,0x50,0x01,0x55,0x4b,0x01,0x58,0x42,0x01,0x65,0x3d,0x01,0x65,0x3c,0x01,0x55,0x37,0x01,0x56,0x34,0x01,0x47,0x34,0x01,0x36,0x34,0x01,0x46,0x33,0x56,0x33,0x02,0x37,0x33, -0x01,0x39,0x2d,0x49,0x2d,0x59,0x2d,0x03,0x29,0x11,0x01,0x28,0x10,0x01,0x69,0x07,0x01,0x69,0x03,0x01,0x68,0x02,0x01,0x49,0x83,0x0a,0x38,0x9a,0x0c,0x01,0x89,0x0c,0x01,0x68,0x0c,0x78,0x0c,0x02,0x0c,0x0a,0x9d,0x2c,0x01,0x8f,0x2c,0x01,0x2c,0x31,0x92,0x1a,0x01,0x70,0x1a,0x01,0x1a,0x13,0x9d,0x20,0x01,0x7a,0x20,0x8a,0x20,0x02, -0x20,0x1f,0x1f,0x00,0x83,0x3f,0x0a,0x3f,0x0a,0x3f,0x54,0x13,0x83,0x31,0x29,0x29,0x31,0x4e,0x95,0x05,0x05,0x2c,0x44,0x95,0x3a,0x0c,0x0e,0x95,0x56,0x38,0x01,0x25,0x38,0x01,0x14,0x38,0x01,0x05,0x38,0x01,0x38,0x36,0x36,0x3a,0x10,0x26,0x1a,0x01,0x1a,0x20,0x2c,0x95,0x25,0x17,0x29,0x01,0x29,0x95,0x28,0x28,0x25,0x1f,0x20,0x1c, -0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x5d,0x10,0xed,0x11,0x39,0x5d,0x3f,0x33,0x2f,0x33,0x5d,0x5d,0x5d,0x5d,0xed,0x32,0x10,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0x33,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x11,0x33,0x5d,0x5d,0x5d,0x33,0x10,0xed,0x31, -0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x17,0x1e,0x03,0x17,0x07,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33, -0x32,0x17,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x06,0xa0,0x3c,0x74,0xa7,0x6b,0x6b,0xad,0x7b,0x43,0x46,0x6a,0x74,0x4d,0x7a,0x54,0x2d,0x2c,0x52,0x73,0x90,0xa7,0x5c,0x5d,0x96,0x7b,0x66,0x2d,0x68,0x64,0xc7,0xd4,0xe5,0x82,0x6c,0xc8,0x4b,0x4e,0xca,0x6b,0x54, -0x83,0x5c,0x30,0x45,0x81,0xbb,0x75,0xb7,0x83,0x7a,0xb4,0x6b,0xa7,0x74,0x3c,0xa8,0x21,0x45,0x6a,0x4a,0x4a,0x71,0x4c,0x27,0x27,0x4c,0x71,0x4a,0x4a,0x6a,0x45,0x21,0x02,0x2e,0x6a,0xb3,0x82,0x49,0x4a,0x83,0xb3,0x6a,0x9e,0x74,0x4c,0x41,0x70,0x94,0x53,0x61,0x98,0x78,0x5d,0x4c,0x3e,0x1d,0x1d,0x38,0x39,0x39,0x1f,0x7d,0x3f,0x5e, -0x3f,0x20,0x3f,0x3f,0xa8,0x31,0x31,0x2e,0x77,0x91,0xaa,0x62,0x7b,0xcd,0x95,0x53,0x64,0x64,0x4a,0x83,0xb4,0x69,0x46,0x80,0x61,0x39,0x39,0x60,0x7f,0x46,0x47,0x7f,0x61,0x39,0x38,0x60,0x7f,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x2d,0x00,0x6b,0x40,0x45,0x07,0x2b,0x17,0x2b,0x02,0x96,0x20,0x01,0x76,0x1f, -0x86,0x1f,0x96,0x1f,0x03,0x9c,0x1c,0x01,0x79,0x1c,0x89,0x1c,0x02,0x6a,0x16,0x01,0x59,0x16,0x01,0x75,0x12,0x01,0x57,0x12,0x67,0x12,0x02,0x77,0x11,0x01,0x2d,0x84,0x19,0x19,0x0a,0x2f,0x22,0x84,0x23,0x23,0x0d,0x0f,0x84,0x0c,0x0a,0x0d,0x0c,0x22,0x0c,0x22,0x14,0x1d,0x95,0x28,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed, -0x11,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e, -0x02,0x33,0x32,0x1e,0x02,0x15,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x74,0x55,0x30,0x80,0x71,0x32,0x53,0x3c,0x22,0xa6,0x3e,0x6b,0x8f,0x51,0x50,0x92,0x70,0x43,0x22,0x69,0xa6,0x74,0x3d,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4d,0x6d,0x45, -0x02,0xc2,0x79,0x83,0x19,0x34,0x51,0x37,0x55,0x83,0x5a,0x2e,0x2b,0x57,0x85,0x59,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x43,0x00,0x9b,0x40,0x61,0x87,0x3d,0x01,0x76,0x3d,0x01,0x76,0x2d,0x86,0x2d,0x96,0x2d,0x03,0x79,0x29,0x89,0x29,0x99,0x29,0x03,0x5b,0x1c,0x01,0x6a,0x16,0x01,0x59,0x16,0x01,0x56,0x12,0x66, -0x12,0x02,0x75,0x11,0x01,0x3f,0x3e,0x1f,0x3b,0x83,0x26,0x26,0x19,0x1f,0x1f,0x0f,0x00,0x83,0x19,0x19,0x0a,0x45,0x30,0x84,0x31,0x40,0x12,0x18,0x48,0x31,0x31,0x0d,0x0f,0x84,0x0c,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0d,0x0c,0x3f,0x3e,0x1e,0x31,0x31,0x2b,0x20,0x95,0x1e,0x0c,0x1e,0x0c,0x1e,0x14,0x2b,0x95,0x36,0x10,0x14,0x95,0x05, -0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x2b,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x11,0x33,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e, -0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b, -0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x1f,0x3c,0x58,0x39,0x32,0x56,0x40,0x25,0xa6,0x41,0x6f,0x92,0x51,0x55,0x93,0x6d,0x3f,0x98,0x8d,0x49,0x82,0x62,0x39,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54, -0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x34,0x57,0x3d,0x22,0x1b,0x35,0x50,0x35,0x5a,0x84,0x57,0x2b,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x00,0x03,0x00,0x3c,0xff,0xe8,0x05,0xcc,0x06,0x02,0x00,0x1a,0x00,0x2a,0x00,0x36,0x00,0x6e,0x40,0x44,0x48,0x36,0x58,0x36,0x02,0x46,0x33,0x56,0x33,0x02,0x47,0x2f,0x57,0x2f, -0x02,0x65,0x19,0x01,0x66,0x02,0x01,0x00,0x83,0x10,0x2b,0x30,0x2b,0x02,0x2b,0x2b,0x08,0x38,0x0f,0x84,0x23,0x31,0x83,0x08,0x1b,0x1b,0x15,0x84,0x0f,0x08,0x01,0x08,0x09,0x0b,0x95,0x27,0x2d,0x95,0x17,0x15,0x17,0x27,0x17,0x27,0x17,0x35,0x1f,0x95,0x12,0x01,0x35,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f, -0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x10,0xed,0xdc,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x21,0x22,0x27,0x26,0x35,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x11,0x36,0x33,0x32,0x17,0x16,0x01,0x34,0x27,0x26,0x23,0x22,0x07, -0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x01,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x05,0xcc,0x6c,0x76,0xfe,0xf8,0xe5,0x80,0x79,0x31,0x64,0x91,0x52,0x50,0x9f,0x94,0x01,0x3d,0x88,0xc6,0xea,0x7a,0x6e,0xfc,0x38,0x24,0x28,0x44,0x44,0x28,0x24,0x24,0x28,0x43,0x43,0x29,0x25,0x03,0x20,0xfe,0xca,0xa8,0x53, -0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xf0,0x81,0x97,0x8f,0x88,0xe1,0x01,0xd3,0x2c,0x57,0x54,0x91,0x94,0xab,0xfe,0xc9,0xfe,0x9a,0x77,0x8d,0x80,0x01,0xf6,0x47,0x32,0x39,0x39,0x32,0x47,0x45,0x33,0x38,0x38,0x33,0xfd,0x6a,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0xc1,0x04,0x18,0x00,0x2a, -0x00,0x3e,0x00,0xca,0x40,0x8b,0x39,0x3c,0x01,0x36,0x38,0x01,0x37,0x32,0x01,0x38,0x2e,0x01,0x47,0x28,0x57,0x28,0x02,0x57,0x23,0x01,0x45,0x23,0x01,0x57,0x22,0x01,0x5a,0x1e,0x01,0x49,0x1e,0x01,0x48,0x1d,0x58,0x1d,0x02,0x58,0x19,0x01,0x49,0x19,0x01,0x4a,0x18,0x5a,0x18,0x02,0x45,0x14,0x55,0x14,0x02,0x47,0x13,0x57,0x13,0x02, -0x46,0x0f,0x01,0x39,0x0a,0x99,0x0a,0x02,0x2a,0x0a,0x01,0x99,0x09,0x01,0x68,0x05,0x98,0x05,0x02,0x94,0x03,0x01,0x76,0x02,0x86,0x02,0x02,0x03,0x04,0x04,0x07,0x19,0x23,0x01,0x23,0x37,0x0f,0x01,0x0f,0x11,0x83,0x2b,0x00,0x83,0x07,0x10,0x07,0x01,0x2b,0x07,0x2b,0x07,0x40,0x35,0x83,0x1b,0x30,0x95,0x20,0x20,0x0f,0x0c,0x95,0x24, -0x23,0x34,0x23,0x02,0x15,0x23,0x01,0x23,0x26,0x10,0x04,0x03,0x03,0x3a,0x95,0x16,0x16,0x00,0x3f,0xed,0x33,0x2f,0x33,0x3f,0x33,0x5d,0x5d,0xed,0x32,0x33,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x32,0x5d,0x32,0x5d,0x11,0x39,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x05,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02, -0x33,0x32,0x3e,0x02,0x06,0xc1,0x7f,0x76,0x75,0x5d,0x65,0x2c,0x56,0x7e,0x52,0x3f,0x64,0x2d,0x4f,0x43,0x81,0xbc,0x79,0x74,0xb7,0x7f,0x43,0x44,0x83,0xc1,0x7d,0x5e,0x94,0x3c,0x43,0x98,0x5d,0x76,0xbb,0x81,0x44,0xfc,0xdd,0x23,0x4d,0x7c,0x59,0x58,0x7f,0x53,0x27,0x29,0x54,0x7e,0x56,0x59,0x7c,0x4d,0x23,0x01,0xe8,0xa5,0xfe,0x5d, -0x73,0x47,0xcc,0x88,0x4d,0x93,0x72,0x46,0x22,0x23,0x80,0xc5,0x77,0xc6,0x8f,0x50,0x4e,0x8b,0xc1,0x72,0x7b,0xca,0x90,0x4f,0x2e,0x30,0x30,0x2e,0x57,0x97,0xcd,0x5f,0x54,0x92,0x6c,0x3e,0x40,0x6d,0x93,0x54,0x52,0x8f,0x6a,0x3d,0x3d,0x6a,0x91,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x81,0x04,0x18,0x00,0x19,0x00,0x89,0x40,0x5a, -0x45,0x18,0x01,0x4a,0x14,0x01,0x96,0x0b,0x01,0x99,0x07,0x01,0x28,0x07,0x38,0x07,0x02,0x99,0x10,0x01,0x88,0x10,0x01,0x79,0x10,0x01,0x10,0x12,0x0f,0x96,0x02,0x01,0x87,0x02,0x01,0x76,0x02,0x01,0x02,0x03,0x00,0x67,0x0f,0x01,0x01,0x0f,0x01,0x68,0x03,0x01,0x0e,0x03,0x01,0x0f,0x03,0x0f,0x03,0x0d,0x00,0x83,0x20,0x05,0x30,0x05, -0xa0,0x05,0x03,0x05,0x05,0x1b,0x0d,0x83,0x0f,0x12,0x1f,0x12,0xaf,0x12,0x03,0x12,0x09,0x95,0x16,0x10,0x03,0x02,0x02,0x0f,0x10,0x16,0x00,0x3f,0x33,0x33,0x2f,0x33,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x5d,0x5d,0x5d, -0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x27,0x36,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x10,0x17,0x07,0x26,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x04,0x81,0xeb,0x75,0xb8,0x5e,0x65,0xa8,0xa8,0x63,0x5b,0xb8,0x75,0xeb,0x8b,0x90,0xf7,0xf7,0x8e,0x8a,0x01,0xe8,0xfe,0xb8,0xb8,0x73,0x8d,0x01,0x0e,0xab,0x72, -0x7b,0x7b,0x71,0xac,0xfe,0xf2,0x8d,0x73,0xb8,0x01,0x48,0xfa,0x98,0x9e,0x9e,0x98,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x39,0x00,0x72,0x40,0x44,0x86,0x33,0x01,0x77,0x33,0x01,0x79,0x29,0x89,0x29,0x99,0x29,0x03,0x6b,0x16,0x01,0x59,0x16,0x01,0x74,0x12,0x01,0x67,0x12,0x01,0x56,0x12,0x01,0x34,0x35,0x31,0x1f, -0x1f,0x0f,0x00,0x83,0x19,0x19,0x0a,0x3b,0x31,0x83,0x2b,0x26,0x0d,0x0f,0x84,0x0c,0x0a,0x35,0x34,0x20,0x95,0x0d,0x0c,0x1e,0x0c,0x1e,0x0c,0x14,0x2b,0x95,0x2c,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x39,0x39,0x01,0x2f,0x33,0xed,0x32,0x2f,0xce,0xed,0x11,0x12,0x39,0x2f,0xed, -0x12,0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x35,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03, -0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x1f,0x3c,0x58,0x39,0x55,0x93,0x6d,0x3f,0x98,0x8d,0x49,0x82,0x62,0x39,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26, -0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x34,0x57,0x3d,0x22,0x8b,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x08,0x06,0x04,0x18,0x00,0x5f,0x01,0x72,0x40,0xf7,0x77,0x5e,0x01,0x86,0x5d,0x01,0x75,0x5d,0x01,0x89,0x58,0x01,0x77,0x53,0x01,0x89,0x50,0x01, -0x78,0x50,0x01,0x99,0x4f,0x01,0x97,0x4b,0x01,0x86,0x4b,0x01,0x99,0x47,0x01,0x88,0x47,0x01,0x79,0x47,0x01,0x78,0x41,0x01,0x66,0x2d,0x01,0x5a,0x29,0x6a,0x29,0x02,0x66,0x1f,0x01,0x64,0x1e,0x01,0x56,0x1e,0x01,0x5a,0x1a,0x6a,0x1a,0x02,0x6a,0x19,0x01,0x97,0x11,0x01,0x56,0x0f,0x66,0x0f,0x02,0x69,0x0b,0x01,0x99,0x07,0x01,0x88, -0x07,0x01,0x69,0x07,0x01,0x44,0x59,0x01,0x45,0x53,0x01,0x45,0x50,0x01,0x45,0x4c,0x01,0x47,0x4b,0x01,0x46,0x10,0x01,0x47,0x0f,0x01,0x4e,0x23,0x84,0x24,0x56,0x15,0x94,0x05,0x01,0x85,0x05,0x01,0x76,0x05,0x01,0x05,0x06,0x06,0x08,0x14,0x84,0x15,0x7f,0x3f,0x8f,0x3f,0x9f,0x3f,0x03,0x5c,0x3f,0x01,0x4b,0x3f,0x01,0x3a,0x3f,0x01, -0x2d,0x3f,0x01,0x3f,0x44,0x9b,0x38,0x01,0x8a,0x38,0x01,0x7b,0x38,0x01,0x6c,0x38,0x01,0x5a,0x38,0x01,0x38,0x93,0x35,0x01,0x85,0x35,0x01,0x62,0x35,0x01,0x35,0x37,0x37,0x30,0x00,0x83,0x08,0x24,0x15,0x08,0x08,0x15,0x24,0x03,0x61,0x30,0x83,0x44,0x3d,0x3d,0x44,0x0d,0x95,0x5b,0x5b,0x51,0x2b,0x95,0x49,0x49,0x70,0x4e,0x01,0x44, -0x4e,0x01,0x70,0x56,0x01,0x44,0x56,0x01,0x4e,0x56,0x23,0x51,0x14,0x14,0x23,0x23,0x05,0x1c,0x95,0x51,0x10,0x35,0x38,0x3f,0x95,0x3a,0x3d,0x95,0x3c,0x3c,0x3a,0x37,0x38,0x1c,0x06,0x05,0x16,0x00,0x3f,0x33,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x3f,0xed,0x11,0x39,0x2f,0x33,0x2f,0x11,0x12,0x39,0x39,0x5d,0x5d,0x5d, -0x5d,0x33,0x2f,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x12,0x39,0x2f,0x39,0x5d,0x5d,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x11,0x39,0x10,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x07,0x27,0x36,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15, -0x14,0x1e,0x02,0x17,0x04,0x17,0x07,0x24,0x21,0x22,0x07,0x35,0x36,0x33,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x08,0x06,0x1c,0x3a,0x59,0x3c,0x75,0xb8,0x1f,0x36,0x4a,0x2b,0x2b,0x42,0x30,0x20,0x14,0x08,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x29, -0x3f,0x2e,0x1e,0x13,0x08,0xa4,0x08,0x14,0x21,0x30,0x41,0x2b,0x2b,0x4a,0x36,0x1f,0x56,0x9f,0xde,0x89,0x01,0x91,0xb6,0x68,0xfe,0x6f,0xfd,0xf9,0xd7,0x94,0x9b,0xd4,0x54,0x7e,0x53,0x2a,0x29,0x59,0x8d,0x63,0x2f,0x5a,0x4f,0x3f,0x15,0x2a,0x99,0x5d,0x2e,0x59,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x5a,0x2f,0x55,0x89,0x60,0x34,0x02,0x26, -0x4e,0xa3,0x99,0x85,0x2f,0x73,0x8d,0x01,0x3e,0x5a,0x87,0x5a,0x2d,0x2b,0x46,0x59,0x5d,0x59,0x22,0x22,0x58,0x5d,0x5a,0x46,0x2b,0x2d,0x48,0x5b,0x5d,0x56,0x1f,0x1f,0x56,0x5d,0x5b,0x48,0x2d,0x2d,0x5a,0x87,0x5a,0x91,0xd1,0x98,0x6c,0x2b,0x80,0x7a,0x7d,0xfc,0x7e,0xa8,0x62,0x2d,0x8c,0xaa,0xbe,0x5f,0x5b,0xb2,0x8d,0x58,0x1b,0x33, -0x4a,0x2f,0x5f,0x68,0x1b,0x33,0x4a,0x2f,0x2f,0x4a,0x33,0x1b,0x3e,0x7d,0xbb,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x25,0x00,0x33,0x00,0x72,0x40,0x4a,0x59,0x31,0x01,0x56,0x2e,0x01,0x59,0x29,0x01,0x99,0x1e,0x01,0x99,0x1d,0x01,0x76,0x18,0x01,0x67,0x17,0x01,0x6a,0x14,0x7a,0x14,0x02,0x69,0x0d,0x01,0x69, -0x0c,0x01,0x26,0x25,0x83,0x30,0x11,0x40,0x11,0x02,0x11,0x11,0x0a,0x35,0x1a,0x84,0x1b,0x1b,0x2d,0x83,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x2b,0x95,0x4f,0x1b,0x01,0x1b,0x11,0x0f,0x0f,0x2f,0x15,0x95,0x20,0x01,0x2f,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xce,0x5d,0xed,0x01,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11, -0x12,0x39,0x2f,0x5d,0xed,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x03,0x34,0x2e,0x02,0x23,0x20,0x11,0x10,0x21,0x32,0x3e,0x02,0x04,0x28, -0x3f,0x7a,0xb2,0x73,0x75,0xb7,0x7d,0x41,0x3b,0x75,0xae,0x74,0xc5,0x89,0x8d,0x87,0x31,0x56,0x41,0x25,0xa6,0x41,0x6f,0x91,0x50,0x66,0xa5,0x74,0x3f,0xa8,0x26,0x4e,0x7a,0x54,0xfe,0xca,0x01,0x36,0x52,0x79,0x50,0x27,0x01,0xe0,0x70,0xb9,0x85,0x4a,0x4c,0x8a,0xbf,0x73,0x71,0xb6,0x80,0x45,0x77,0xec,0x8a,0x9d,0x1e,0x3b,0x58,0x39, -0x55,0x89,0x61,0x35,0x3d,0x74,0xa6,0x69,0xfd,0xa4,0x50,0x86,0x60,0x36,0xfe,0x98,0xfe,0x88,0x3a,0x65,0x87,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x1f,0x00,0x2b,0x00,0x7f,0x40,0x2c,0x59,0x2b,0x01,0x56,0x29,0x01,0x47,0x29,0x01,0x56,0x28,0x01,0x55,0x24,0x01,0x5a,0x21,0x01,0x66,0x1e,0x76,0x1e,0x02,0x2b, -0x0a,0x3b,0x0a,0x4b,0x0a,0x03,0x0c,0x0a,0x1c,0x0a,0x02,0x69,0x05,0x01,0x10,0x11,0x11,0x00,0x83,0x20,0xb8,0xff,0xc0,0x40,0x24,0x0a,0x0d,0x48,0x20,0x20,0x2d,0x26,0x83,0x1a,0x84,0x0f,0x08,0x1f,0x08,0x02,0x08,0x22,0x95,0x1a,0x1c,0x1c,0x2a,0x11,0x13,0x95,0x10,0x0e,0x0e,0x16,0x95,0x0b,0x01,0x2a,0x95,0x04,0x16,0x00,0x3f,0xed, -0x3f,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x39,0x2f,0x33,0xed,0x01,0x2f,0x5d,0xed,0xed,0x12,0x39,0x2f,0x2b,0xed,0x32,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x10,0x21,0x32,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x23,0x22,0x06,0x15,0x11, -0x36,0x33,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x04,0x28,0x7b,0x84,0xeb,0xe5,0x80,0x79,0x01,0x5a,0x40,0xeb,0x35,0x52,0x72,0x4a,0x83,0x88,0x44,0xf5,0x2d,0x64,0x4b,0x88,0xc6,0xea,0x7a,0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xe6,0x8c,0x96,0x8f,0x88,0xe1, -0x02,0xd0,0x01,0x52,0x46,0x46,0x71,0x5f,0x46,0x55,0x64,0xfe,0xa6,0x77,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x05,0xae,0x04,0x18,0x00,0x3e,0x00,0xb8,0x40,0x11,0x86,0x3c,0x96,0x3c,0x02,0x77,0x38,0x01,0x66,0x38,0x01,0x47,0x38,0x57,0x38,0x02,0x32,0xb8,0xff,0xf8,0x40,0x65, -0x0d,0x10,0x48,0x96,0x2e,0x01,0x87,0x2e,0x01,0x99,0x27,0x01,0x75,0x24,0x01,0x66,0x24,0x01,0x85,0x23,0x01,0x69,0x20,0x79,0x20,0x02,0x6a,0x0b,0x7a,0x0b,0x02,0x84,0x08,0x01,0x66,0x07,0x76,0x07,0x02,0x99,0x04,0x01,0x88,0x04,0x01,0x26,0x25,0x25,0x16,0x2b,0x83,0x22,0x16,0x35,0x16,0x05,0x06,0x06,0x15,0x00,0x83,0x09,0x15,0x84, -0x16,0x0e,0x95,0x3a,0x3a,0x71,0x35,0x01,0x62,0x35,0x01,0x40,0x35,0x50,0x35,0x02,0x35,0x30,0x16,0x16,0x26,0x1d,0x95,0x30,0x10,0x94,0x06,0x01,0x06,0x05,0x05,0x94,0x25,0x01,0x25,0x26,0x16,0x00,0x3f,0x33,0x5d,0x33,0x2f,0x33,0x5d,0x3f,0xed,0x11,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0x32,0x2f,0xed,0x01,0x2f,0xfd,0xde,0xed,0x12, -0x39,0x2f,0x33,0x11,0x39,0x10,0xde,0xed,0x12,0x39,0x2f,0x33,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x2e,0x03, -0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x05,0xae,0x1f,0x3e,0x5c,0x3c,0x75,0x5d,0x65,0x22,0x3a,0x4d,0x2b,0x2d,0x43,0x30,0x20,0x12,0x07,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x65,0x5d,0x75,0x3c,0x5c,0x3e,0x1f,0x37,0x64,0x8c,0x55,0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f, -0x59,0x2e,0x55,0x8c,0x64,0x37,0x02,0x26,0x4e,0xa3,0x99,0x85,0x2f,0x73,0x47,0xe4,0xa0,0x5a,0x87,0x5a,0x2d,0x2a,0x45,0x59,0x5d,0x59,0x24,0x26,0x5b,0x5d,0x57,0x44,0x29,0x2d,0x5a,0x87,0x5a,0xa0,0xe4,0x47,0x73,0x2f,0x85,0x99,0xa3,0x4e,0x7c,0xbb,0x7d,0x3e,0x1e,0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x00,0x00,0x01, -0x00,0x60,0xff,0xe8,0x03,0xf1,0x06,0x02,0x00,0x3f,0x00,0x99,0x40,0x5b,0x86,0x38,0x01,0x96,0x31,0x01,0x79,0x28,0x01,0x6a,0x16,0x01,0x59,0x16,0x01,0x56,0x12,0x66,0x12,0x02,0x7a,0x08,0x8a,0x08,0x02,0x7a,0x07,0x8a,0x07,0x02,0x46,0x3e,0x01,0x47,0x33,0x01,0x3a,0x3b,0x1f,0x31,0x2d,0x35,0x84,0x29,0x2d,0x26,0x26,0x19,0x2e,0x2d, -0x2d,0x1f,0x1f,0x0f,0x00,0x83,0x19,0x19,0x41,0x0d,0x0f,0x84,0x0c,0x0a,0x3b,0x3a,0x1e,0x18,0x31,0x01,0x09,0x31,0x01,0x29,0x31,0x2e,0x20,0x95,0x0d,0x0c,0x1e,0x0c,0x1e,0x0c,0x2d,0x2e,0x01,0x14,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x11,0x39,0x39,0x5d,0x5d,0x11,0x39,0x39,0x01,0x2f,0x33, -0xed,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0xed,0x11,0x39,0x11,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23, -0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x27,0x37,0x1e,0x05,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x79,0x49,0x20,0x38,0x59,0x70,0x70,0x65,0x21,0x5e,0x23,0x70,0x7f,0x81,0x68, -0x41,0x1e,0x3f,0x64,0x46,0x49,0x82,0x62,0x39,0x01,0xbc,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1d,0x34,0x47,0x2a,0x37,0x46,0x31,0x24,0x2b,0x3b,0x2f,0x56,0x2c,0x3b,0x31,0x31,0x43,0x5f,0x47,0x2c,0x54,0x47,0x35,0x0c,0x04,0x0b,0x43, -0x66,0x85,0x00,0x01,0x00,0x3f,0xfe,0x1e,0x03,0xf1,0x04,0x00,0x00,0x2d,0x00,0x8e,0x40,0x52,0x65,0x13,0x01,0x56,0x13,0x01,0x76,0x0f,0x01,0x57,0x0f,0x67,0x0f,0x02,0x2c,0x2d,0x84,0x16,0x18,0x1a,0x28,0x25,0x27,0x27,0x20,0x1a,0x84,0x25,0x25,0x0d,0x16,0x16,0x08,0x2f,0x20,0x84,0x1f,0x1f,0x0b,0x0d,0x84,0x0a,0x08,0x28,0x95,0x18, -0x27,0x18,0x1f,0x20,0x0b,0x0a,0x0a,0x11,0x1d,0x95,0x22,0x89,0x16,0x99,0x16,0x02,0x16,0x2d,0x00,0x18,0x10,0x18,0x02,0x18,0x20,0x22,0x22,0x20,0x18,0x03,0x2d,0x0f,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x12,0x39,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x11,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0x33, -0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x37,0x16, -0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x32,0x37,0x36,0x37,0x33,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x57,0x5d,0x5f,0xab,0x3f,0x8e,0x9b,0xf9,0x21,0x89,0x17,0x7a,0x4c,0x40,0x6f,0x37,0xac,0x62,0x73,0x73,0x50,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c, -0x51,0x8a,0x03,0x3b,0x39,0x08,0x4a,0x65,0x75,0x93,0x01,0x1d,0x26,0xb9,0x47,0x47,0x6b,0x3c,0x82,0x1f,0x24,0x6a,0x00,0x01,0x00,0x60,0xff,0xe8,0x05,0xae,0x06,0x02,0x00,0x52,0x00,0xfc,0x40,0xa7,0x96,0x4c,0x01,0x94,0x47,0x01,0x99,0x2f,0x01,0x66,0x4c,0x76,0x4c,0x02,0x84,0x4b,0x01,0x8c,0x48,0x01,0x8a,0x47,0x01,0x69,0x47,0x79, -0x47,0x02,0x4a,0x42,0x5a,0x42,0x6a,0x42,0x03,0x4a,0x39,0x5a,0x39,0x6a,0x39,0x03,0x7b,0x33,0x01,0x6a,0x33,0x01,0x85,0x2f,0x01,0x66,0x2f,0x76,0x2f,0x02,0x89,0x2c,0x01,0x86,0x25,0x96,0x25,0x02,0x77,0x21,0x01,0x25,0x04,0x01,0x55,0x03,0x01,0x46,0x03,0x01,0x34,0x03,0x01,0x26,0x03,0x01,0x9b,0x4e,0x01,0x4e,0x4d,0x4d,0x3e,0x94, -0x17,0x01,0x17,0x11,0x4a,0x07,0x0d,0x00,0x83,0x4a,0x3e,0x94,0x2d,0x01,0x2d,0x2e,0x2e,0x3d,0x31,0x0c,0x0d,0x0d,0x28,0x83,0x31,0x1e,0x3d,0x84,0x3e,0x70,0x1e,0x01,0x1e,0x23,0x3e,0x3e,0x4e,0x2e,0x2d,0x2d,0x4d,0x4e,0x16,0x36,0x95,0x23,0x45,0x95,0x17,0x19,0x19,0x9d,0x11,0x01,0x7a,0x11,0x8a,0x11,0x02,0x96,0x07,0x01,0x09,0x07, -0x19,0x07,0x29,0x07,0x03,0x11,0x07,0x0c,0x23,0x10,0x0d,0x0c,0x01,0x00,0x3f,0x33,0x3f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x33,0x2f,0x33,0xed,0x10,0xed,0x3f,0x33,0x33,0x2f,0x33,0x11,0x39,0x2f,0x12,0x39,0x5d,0x01,0x2f,0xfd,0x39,0xde,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x5d,0x10,0xde,0xed,0x11,0x39,0x12,0x39,0x39, -0x5d,0x11,0x39,0x2f,0x33,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x13,0x34,0x3e,0x02,0x37,0x3e,0x05,0x37,0x17,0x0e,0x05,0x07,0x06,0x06,0x07,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07, -0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x2e,0x03,0x60,0x30,0x64,0x99,0x69,0x3f,0x85,0x81,0x7a,0x67,0x50,0x18,0x76,0x17,0x5d,0x7a,0x8b,0x8b,0x80,0x31,0x3c,0x4a,0x13,0x18,0x18,0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x59,0x2e,0x55,0x8c, -0x64,0x37,0x1f,0x3e,0x5c,0x3c,0x75,0x5d,0x65,0x22,0x3a,0x4d,0x2b,0x2d,0x43,0x30,0x20,0x12,0x07,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x65,0x5d,0x75,0x3c,0x5c,0x3e,0x1f,0x02,0x26,0x84,0xe2,0xb8,0x8c,0x2d,0x1b,0x2a,0x24,0x23,0x28,0x30,0x21,0x53,0x25,0x3c,0x33,0x2c,0x29,0x28,0x16,0x1b,0x3f,0x19,0x03,0x1e, -0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x7c,0x4e,0xa3,0x99,0x85,0x2f,0x73,0x47,0xe4,0xa0,0x5a,0x87,0x5a,0x2d,0x2a,0x45,0x59,0x5d,0x59,0x24,0x26,0x5b,0x5d,0x57,0x44,0x29,0x2d,0x5a,0x87,0x5a,0xa0,0xe4,0x47,0x73,0x2f,0x85,0x99,0xa3,0x00,0x01,0x00,0x9a,0xff,0xe6,0x04,0x1d,0x05,0xec,0x00,0x19,0x00,0x6b,0x40,0x26, -0x99,0x13,0x01,0x68,0x13,0x78,0x13,0x02,0x69,0x0e,0x01,0x65,0x0c,0x01,0x56,0x0c,0x01,0x79,0x06,0x01,0x89,0x05,0x01,0x96,0x03,0x01,0x76,0x02,0x01,0x14,0x15,0x17,0x84,0x12,0x00,0x84,0x0f,0x12,0xb8,0xff,0xc0,0x40,0x1c,0x0a,0x0d,0x48,0x10,0x0f,0x20,0x0f,0x02,0x12,0x0f,0x12,0x0f,0x1b,0x0b,0x84,0x90,0x08,0x01,0x08,0x15,0x14, -0x10,0x0a,0x00,0x0d,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x10,0xed,0x10,0xfd,0xce,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x34,0x26,0x35,0x34,0x37,0x17,0x06, -0x15,0x14,0x16,0x04,0x1d,0x6a,0x76,0xe0,0xe5,0x74,0x6a,0xa2,0x01,0x21,0x01,0x1b,0x78,0xbf,0x4d,0x5e,0x6f,0x01,0xb3,0xd5,0x78,0x80,0x7b,0x77,0xd8,0x04,0x3c,0xfb,0xe1,0xfe,0xab,0x01,0x34,0x71,0xfb,0x3c,0x87,0x3d,0x87,0x23,0x34,0x1a,0xf7,0x00,0x00,0x02,0x00,0x5e,0xfe,0x1e,0x05,0xaa,0x05,0x31,0x00,0x36,0x00,0x42,0x01,0x23, -0x40,0xc8,0x09,0x13,0x01,0x06,0x10,0x01,0x57,0x35,0x01,0x77,0x2f,0x87,0x2f,0x02,0x77,0x2b,0x87,0x2b,0x02,0x88,0x27,0x01,0x7c,0x15,0x8c,0x15,0x02,0x6a,0x15,0x01,0x66,0x13,0x01,0x65,0x10,0x01,0x56,0x10,0x01,0x47,0x10,0x01,0x65,0x0f,0x85,0x0f,0x95,0x0f,0x03,0x69,0x0d,0x01,0x57,0x0a,0x01,0x79,0x06,0x01,0x79,0x02,0x01,0x1e, -0xa1,0x1f,0xb1,0x1f,0xc1,0x1f,0x03,0x50,0x1f,0x01,0x1f,0x1f,0x18,0x00,0x83,0x14,0x14,0x29,0x44,0x56,0x33,0x01,0x16,0x33,0x18,0x31,0x84,0x5a,0x27,0x01,0x27,0x41,0x25,0x37,0x3f,0x84,0x29,0x18,0x84,0x25,0x25,0x29,0x08,0x83,0x0f,0x0e,0x01,0x0e,0x0b,0x0c,0x29,0x7b,0x0c,0x8b,0x0c,0x9b,0x0c,0x03,0x49,0x0c,0x01,0x0c,0x85,0x41, -0x01,0x74,0x41,0x01,0x48,0x33,0x68,0x33,0x02,0x39,0x33,0x01,0x78,0x27,0x01,0x6a,0x27,0x01,0x58,0x27,0x01,0x3a,0x27,0x4a,0x27,0x02,0x06,0x27,0x16,0x27,0x26,0x27,0x03,0x27,0x33,0x41,0x03,0x3b,0x9c,0x16,0x01,0x8b,0x16,0x01,0x7c,0x16,0x01,0x6a,0x16,0x01,0x38,0x16,0x48,0x16,0x58,0x16,0x03,0x16,0x0b,0x0b,0x1c,0x2d,0x95,0x3b, -0x3b,0x1f,0x21,0x95,0x1e,0x1c,0x12,0x95,0x04,0x1c,0x00,0x3f,0xed,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x12,0x39,0x2f,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x33,0x5d,0x5d,0x01,0x2f,0xce,0x32,0xdc,0x5d,0xed,0x11,0x33,0x2f,0xed,0x10,0xfd,0xde,0x11,0x39,0x39,0x5d,0xed,0x11, -0x39,0x39,0x5d,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x5d,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x25,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x34,0x12,0x37,0x17,0x06,0x11,0x14,0x17,0x16,0x33,0x20,0x11,0x10,0x25,0x06,0x15,0x14,0x17,0x16,0x33, -0x32,0x37,0x17,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x36,0x05,0xaa,0xae,0xb5,0xfe,0xb2,0xfe,0xc5,0xb3,0xad,0xbb,0xb1,0x3b,0xf7,0x78,0x83,0xf0,0x02,0x01,0xfe,0x72,0x60,0x20,0x1d,0x25,0x39, -0x22,0x7a,0x52,0x83,0x62,0x4a,0x52,0x82,0x82,0x53,0x49,0x63,0x5e,0x4a,0x4f,0x87,0xd3,0x78,0x80,0xfe,0x22,0x1f,0x1b,0x23,0x25,0x1d,0x20,0x60,0x5f,0xd9,0xfe,0xb9,0xb7,0xbd,0xc1,0xbb,0x01,0x3a,0xeb,0x01,0x56,0x53,0x96,0x90,0xfe,0xa1,0xf3,0x96,0xa5,0x02,0x0d,0x01,0x67,0xf7,0x5b,0x45,0x28,0x19,0x17,0x2c,0x50,0x6d,0x39,0x40, -0x66,0x79,0x79,0x6e,0x72,0x6d,0x42,0x3a,0x3c,0x40,0x5b,0x62,0x7c,0x7b,0xaa,0xb5,0x02,0xb8,0x21,0x14,0x11,0x14,0x17,0x23,0x46,0x42,0x59,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x06,0x22,0x04,0x18,0x00,0x5a,0x00,0xe8,0x40,0x99,0x17,0x57,0x01,0x7a,0x53,0x01,0x69,0x53,0x01,0x7b,0x52,0x01,0x6a,0x52,0x01,0x48,0x50,0x58,0x50,0x02, -0x96,0x4e,0x01,0x65,0x4e,0x75,0x4e,0x02,0x97,0x4d,0x01,0x86,0x4d,0x01,0x65,0x4d,0x75,0x4d,0x02,0x69,0x49,0x01,0x98,0x3c,0x01,0x89,0x3c,0x01,0x57,0x35,0x01,0x46,0x35,0x01,0x37,0x35,0x01,0x48,0x2c,0x58,0x2c,0x02,0x49,0x2b,0x01,0x8a,0x1d,0x9a,0x1d,0x02,0x48,0x17,0x01,0x5a,0x16,0x01,0x49,0x16,0x01,0x65,0x12,0x75,0x12,0x02, -0x47,0x12,0x57,0x12,0x02,0x5a,0x84,0x19,0x19,0x27,0x5c,0x3d,0x20,0x3e,0x40,0x3e,0x50,0x3e,0x03,0x3e,0x3e,0x48,0x33,0x27,0x43,0x84,0x3b,0x50,0x26,0x84,0x27,0x0d,0x0f,0x84,0x0c,0x0a,0x0a,0x27,0x1f,0x95,0x55,0x55,0x4b,0x3e,0x3d,0x3d,0x4b,0x36,0x95,0x45,0x2e,0x0d,0x0c,0x50,0x26,0x4b,0x0c,0x26,0x0c,0x26,0x14,0x2e,0x95,0x4b, -0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xdc,0xed,0x11,0x33,0x2f,0x33,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xdc,0xed,0x11,0x39,0x39,0x32,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x2e,0x02, -0x35,0x34,0x37,0x17,0x0e,0x03,0x15,0x14,0x33,0x36,0x36,0x37,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x06,0x22,0x4d,0x85,0xb4,0x66,0x59,0xa0,0x79,0x47,0x29,0x99,0x1c,0x2c,0x4c,0x64,0x39,0x43,0x77,0x59,0x33,0x17,0x2c,0x3d,0x27,0x24,0x38,0x2b,0x1e,0x12,0x09,0xa4,0x0a,0x13,0x1d,0x26,0x30,0x1c, -0x1d,0x2b,0x22,0x1e,0x11,0x21,0x73,0x63,0x32,0x50,0x38,0x1d,0x7f,0x69,0x12,0x20,0x1a,0x0f,0x4d,0x2e,0x45,0x1f,0x1f,0x84,0x58,0x2e,0x4c,0x3e,0x32,0x13,0x15,0x36,0x43,0x52,0x30,0x55,0x7e,0x52,0x29,0x0e,0x73,0xaf,0x76,0x3c,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4f,0x76,0x4e,0x02,0x40,0x5f, -0x89,0x59,0x2a,0x2d,0x48,0x5b,0x5d,0x56,0x1f,0x1f,0x56,0x5d,0x5b,0x48,0x2d,0x1a,0x35,0x4e,0x34,0x68,0x69,0x22,0x3c,0x54,0x32,0x88,0x6c,0x59,0x0b,0x20,0x28,0x30,0x1a,0x54,0x01,0x56,0x67,0x68,0x78,0x1f,0x39,0x4f,0x2f,0x2f,0x4f,0x39,0x1f,0x38,0x77,0xbb,0x84,0x00,0x00,0x02,0x00,0x40,0xfe,0x1e,0x06,0x9c,0x04,0x18,0x00,0x55, -0x00,0x69,0x00,0xd9,0x40,0x52,0x5a,0x67,0x01,0x39,0x67,0x49,0x67,0x02,0x36,0x63,0x46,0x63,0x56,0x63,0x03,0x56,0x5d,0x01,0x35,0x5d,0x45,0x5d,0x02,0x39,0x59,0x49,0x59,0x59,0x59,0x03,0x56,0x54,0x01,0x86,0x4f,0x96,0x4f,0x02,0x75,0x4f,0x01,0x95,0x4b,0x01,0x96,0x4a,0x01,0x7b,0x29,0x8b,0x29,0x02,0x69,0x28,0x01,0x58,0x28,0x01, -0x5a,0x16,0x01,0x86,0x11,0x01,0x9a,0x08,0x01,0x0d,0x0f,0x84,0x0a,0x0c,0x0a,0x50,0x51,0x4d,0x1f,0x5a,0x43,0x01,0x43,0x30,0xb8,0xff,0xf0,0x40,0x38,0x0f,0x12,0x48,0x30,0x32,0x83,0x56,0x4d,0x83,0x26,0x00,0x83,0x19,0x0a,0x56,0x26,0x19,0x19,0x26,0x56,0x0a,0x04,0x6b,0x60,0x83,0x3c,0x5b,0x95,0x41,0x41,0x48,0x0d,0x0c,0x65,0x95, -0x37,0x51,0x50,0x20,0x95,0x1e,0x37,0x1e,0x37,0x1e,0x14,0x30,0x2b,0x95,0x43,0x48,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x39,0x10,0xed,0xce,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xfd,0x32,0x2b,0x32, -0x5d,0xce,0x11,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e, -0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x06,0x9c,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c, -0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x2b,0x4a,0x63,0x38,0x2b,0x47,0x3c,0x35,0x1a,0x46,0x43,0x7b,0xad,0x6b,0x6b,0xad,0x7b,0x43,0x43,0x7b,0xad,0x6b,0xb4,0x7a,0x20,0x53,0x5e,0x64,0x30,0x58,0x9d,0x77,0x46,0x98,0x8d,0x49,0x82,0x62,0x39,0xfc,0xa8,0x27,0x4c,0x71,0x4a,0x4a, -0x71,0x4c,0x27,0x27,0x4c,0x71,0x4a,0x4a,0x71,0x4c,0x27,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x36,0x57,0x3c,0x21,0x0a,0x13,0x1c,0x12,0x74,0x9e,0x6a,0xb3,0x83,0x4a,0x49,0x82,0xb3,0x6a,0x69,0xb4,0x83,0x4a, -0x64,0x17,0x25,0x1a,0x0e,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x01,0xef,0x46,0x7f,0x60,0x39,0x39,0x61,0x80,0x46,0x47,0x7f,0x60,0x38,0x39,0x61,0x7f,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x05,0xec,0x00,0x29,0x00,0xad,0x40,0x70,0x76,0x1b,0x01,0x79,0x18,0x01,0x59,0x13,0x69,0x13,0x02,0x75,0x0f,0x01, -0x57,0x0f,0x67,0x0f,0x02,0x09,0x25,0x01,0x95,0x1f,0x01,0x88,0x1b,0x01,0x28,0x29,0x84,0x74,0x26,0x01,0x26,0x00,0x27,0x70,0x27,0x02,0x27,0x24,0x20,0x16,0x01,0x16,0x16,0x08,0x2b,0x1d,0x84,0x1e,0x1e,0x0b,0x0d,0x84,0x0a,0x30,0x08,0x01,0x0f,0x08,0x1f,0x08,0x02,0x08,0x8b,0x25,0x9b,0x25,0x02,0x7f,0x25,0x01,0x49,0x25,0x59,0x25, -0x02,0x27,0x25,0x28,0x8f,0x26,0x9f,0x26,0x02,0x26,0x22,0x0b,0x0a,0x1d,0x0a,0x1d,0x11,0x19,0x95,0x95,0x24,0x01,0x83,0x24,0x01,0x24,0x22,0x22,0x28,0x00,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x5d,0x5d,0xed,0x11,0x39,0x39,0x2f,0x2f,0x33,0x10,0xce,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x01,0x2f,0x5d,0x5d,0x33, -0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xc4,0xcc,0x5d,0x32,0x5d,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x37,0x36,0x33, -0x32,0x17,0x11,0x07,0x27,0x01,0x33,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x57,0x5d,0x88,0x77,0x66,0x43,0x49,0xa6,0x7d,0x73,0xa8,0x97,0x68,0x81,0x6f,0x01,0x10,0x84,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x51,0x8a,0x01,0xfa,0x79,0x83,0x34,0x39, -0x68,0xa8,0x61,0x57,0x3e,0x01,0xd8,0x82,0x70,0x01,0x14,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x05,0xce,0x04,0x18,0x00,0x49,0x00,0xdb,0x40,0x91,0x67,0x3f,0x77,0x3f,0x02,0x49,0x3b,0x59,0x3b,0x02,0x3a,0x3b,0x01,0x6a,0x3a,0x01,0x66,0x31,0x01,0x46,0x30,0x56,0x30,0x66,0x30,0x03,0x35,0x30,0x01,0x69,0x2c,0x79,0x2c,0x02,0x86,0x1e, -0x96,0x1e,0x02,0x79,0x1a,0x01,0x99,0x19,0x01,0x7a,0x19,0x8a,0x19,0x02,0x76,0x15,0x86,0x15,0x96,0x15,0x03,0x75,0x14,0x01,0x89,0x10,0x99,0x10,0x02,0x47,0x42,0x8e,0x08,0x9e,0x08,0x02,0x7b,0x08,0x01,0x59,0x08,0x01,0x3a,0x08,0x4a,0x08,0x02,0x08,0x00,0x06,0x06,0x0d,0x83,0x42,0x36,0x26,0x27,0x27,0x21,0x83,0x29,0x8d,0x01,0x9d, -0x01,0x02,0x01,0x00,0x00,0x29,0x17,0x35,0x84,0x36,0x17,0x35,0x12,0x27,0x26,0x35,0x26,0x35,0x26,0x08,0x3d,0x95,0x12,0x2e,0x95,0x1c,0x1c,0x12,0x10,0x27,0x47,0x01,0x47,0x01,0x08,0x95,0x03,0x06,0xf4,0x05,0x05,0x03,0x00,0x01,0x1c,0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x5d,0x3f,0x33,0x2f,0xed,0x10,0xed,0x11, -0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0xfd,0x39,0xce,0x32,0x2f,0x33,0x5d,0x10,0xed,0x33,0x2f,0x39,0x10,0xde,0xed,0x32,0x2f,0x11,0x39,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x07,0x24,0x21,0x22,0x07,0x35,0x36,0x33,0x2e,0x03, -0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x27,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x16,0x04,0x05,0x42,0x68,0xfe,0x9c,0xfe,0x55,0xd7,0x94,0x9b,0xd4,0x54,0x7e,0x53,0x2a,0x37,0x64,0x8c,0x55, -0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x59,0x2e,0x55,0x8c,0x64,0x37,0x08,0x0f,0x16,0x0e,0x98,0x2b,0x22,0x3a,0x4d,0x2b,0x2c,0x41,0x30,0x20,0x13,0x09,0xa4,0x01,0x08,0x13,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x48,0x88,0xc7,0x7f,0xab,0x01,0x00,0xfe,0x9b,0x7d,0xfc,0x7e,0xa8,0x62,0x2d,0x8c,0xaa,0xbe,0x5f,0x7c,0xbb,0x7d, -0x3e,0x1e,0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x7c,0x28,0x59,0x57,0x4e,0x1e,0x37,0x80,0x8d,0x5a,0x87,0x5a,0x2d,0x33,0x52,0x69,0x6c,0x67,0x27,0x27,0x67,0x6c,0x69,0x52,0x33,0x2d,0x5a,0x88,0x5a,0x89,0xcc,0x9a,0x72,0x2f,0x3f,0x7c,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x3b,0x00,0xcb,0x40,0x77, -0x66,0x32,0x01,0x86,0x31,0x01,0x74,0x31,0x01,0x65,0x31,0x01,0x56,0x31,0x01,0x9a,0x22,0x01,0x98,0x21,0x01,0x55,0x17,0x65,0x17,0x02,0x47,0x16,0x01,0x67,0x11,0x01,0x56,0x11,0x01,0x7a,0x08,0x01,0x79,0x07,0x01,0x3b,0x84,0x1a,0x39,0x39,0x0a,0x3d,0x5c,0x2a,0x6c,0x2a,0x7c,0x2a,0x03,0x3b,0x2a,0x4b,0x2a,0x02,0x2d,0x2a,0x01,0x2a, -0x2f,0x84,0x7c,0x29,0x01,0x6b,0x29,0x01,0x5c,0x29,0x01,0x3d,0x29,0x4d,0x29,0x02,0x2e,0x29,0x01,0x29,0x60,0x24,0x01,0x24,0x24,0x0d,0x0f,0x84,0x0c,0x0a,0x2a,0x29,0x29,0x3a,0x34,0x95,0x6a,0x1a,0x01,0x59,0x1a,0x01,0x3a,0x1a,0x4a,0x1a,0x02,0x2b,0x1a,0x01,0x1a,0x1f,0x0d,0x0c,0x1f,0xb8,0xff,0xc0,0x40,0x0d,0x0b,0x10,0x48,0x1f, -0x0c,0x1f,0x0c,0x3a,0x0f,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x33,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x33,0x2f,0x33,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0xed,0x32,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x37,0x17,0x06,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x03,0xf1,0x4a,0x81, -0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x74,0x55,0x30,0x17,0x3f,0x4b,0x53,0x2a,0x57,0x91,0x68,0x39,0x0f,0x0a,0x0b,0x0f,0x99,0x0b,0x08,0x08,0x0b,0x28,0x42,0x56,0x2f,0x3e,0x65,0x48,0x27,0xa4,0x22,0x69,0xa6,0x74,0x3d,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4d, -0x6d,0x45,0x02,0x41,0x1a,0x2f,0x24,0x15,0x36,0x67,0x96,0x5f,0x33,0x59,0x22,0x28,0x22,0x37,0x1a,0x1e,0x1a,0x43,0x26,0x46,0x66,0x42,0x20,0x3b,0x63,0x80,0x45,0x85,0x00,0x02,0x00,0x32,0xff,0xe8,0x04,0xdb,0x06,0x02,0x00,0x2b,0x00,0x37,0x00,0x9d,0x40,0x65,0x48,0x36,0x58,0x36,0x02,0x39,0x36,0x01,0x37,0x33,0x47,0x33,0x57,0x33, -0x03,0x38,0x2e,0x48,0x2e,0x58,0x2e,0x03,0x88,0x10,0x01,0x69,0x0a,0x01,0x66,0x03,0x01,0x86,0x28,0x96,0x28,0x02,0x86,0x26,0x96,0x26,0x02,0x99,0x10,0x01,0x08,0x83,0x32,0x32,0x16,0x20,0x22,0x84,0x1f,0x1f,0x1d,0x01,0x1d,0x16,0x27,0x16,0x15,0x2c,0x83,0x2b,0x84,0x10,0x0e,0x01,0x0e,0x15,0x84,0x16,0x1a,0x95,0x25,0x25,0x83,0x27, -0x93,0x27,0x02,0x27,0x29,0x1f,0x20,0x20,0x16,0x30,0x95,0x0e,0x0c,0x0c,0x34,0x11,0x95,0x29,0x01,0x34,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x2f,0x33,0x11,0x39,0x5d,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xdc,0x5d,0xfd,0xed,0x11,0x12,0x39,0x10,0xde,0x5d,0x32,0xed,0x32,0x11,0x33,0x2f,0xed,0x31, -0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x35,0x10,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x20,0x11,0x03,0x34,0x27,0x26,0x23,0x20,0x11, -0x10,0x21,0x32,0x37,0x36,0x04,0xdb,0x79,0x80,0xe5,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xac,0x67,0x30,0x24,0xa4,0x24,0x30,0x67,0x47,0x4c,0x1e,0xa6,0x20,0xad,0x8e,0xb9,0x53,0x53,0xbb,0x01,0x54,0xa8,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa3,0x55,0x4a,0x01,0xe0,0xe1,0x88,0x8f,0x96,0x8c,0xe6,0xdf,0x80,0x8d,0x77,0xce,0x01, -0x45,0x64,0x49,0x69,0x69,0x49,0x64,0x65,0x51,0x3a,0x53,0x1d,0x52,0x4e,0x95,0xb5,0xbd,0xbd,0xfe,0x22,0xfd,0xc2,0xa1,0x5e,0x6d,0xfe,0x98,0xfe,0x88,0x73,0x63,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x03,0xf8,0x06,0x02,0x00,0x23,0x00,0x2c,0x00,0x72,0x40,0x44,0x85,0x21,0xa5,0x21,0x02,0x87,0x17,0x01,0x88,0x06,0x98,0x06,0x02,0x7b, -0x08,0x01,0x80,0x04,0x90,0x04,0x02,0x76,0x04,0x01,0x04,0x00,0x05,0x05,0x1e,0x00,0x83,0x07,0x07,0x10,0x2e,0x19,0x84,0x24,0x2b,0x0e,0x1e,0x84,0x10,0x2b,0x95,0x1d,0x1d,0x37,0x1e,0x01,0x26,0x1e,0x01,0x1e,0x0a,0x95,0x20,0x20,0x0f,0x26,0x95,0x15,0x01,0x05,0x04,0x04,0x0f,0x15,0x00,0x3f,0x33,0x2f,0x33,0x3f,0xed,0x11,0x39,0x2f, -0xed,0x33,0x5d,0x5d,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0xc4,0xdc,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x07,0x27,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07, -0x15,0x36,0x33,0x32,0x17,0x16,0x01,0x34,0x23,0x22,0x07,0x06,0x15,0x15,0x36,0x03,0xf8,0x3d,0x3e,0x6b,0x75,0xb7,0x7a,0x74,0x81,0x51,0x4a,0xa4,0x37,0x48,0xb5,0x6b,0x41,0x46,0x7b,0x64,0xa3,0x72,0xe2,0x9c,0x61,0x5d,0xfe,0x32,0x50,0x43,0x28,0x25,0xe0,0x01,0xe3,0x8e,0x89,0x8c,0x58,0x73,0x9f,0xe1,0x88,0x9f,0x70,0x66,0x88,0xfe, -0x5c,0x04,0x83,0xb0,0x59,0x76,0x34,0x38,0x66,0x96,0x69,0x55,0x2b,0xd3,0xae,0x7a,0x77,0x02,0x91,0x4b,0x33,0x2f,0x45,0x8d,0x3c,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x04,0x8b,0x04,0x18,0x00,0x2d,0x00,0xcc,0x40,0x89,0x87,0x2d,0x01,0x65,0x2d,0x01,0x76,0x2c,0x01,0x86,0x29,0x96,0x29,0x02,0x64,0x29,0x74,0x29,0x02,0x46,0x26,0x96, -0x26,0x02,0x96,0x24,0x01,0x9a,0x20,0x01,0x8d,0x1f,0x01,0x39,0x1f,0x01,0x5d,0x17,0x01,0x48,0x16,0x01,0x69,0x13,0x01,0x48,0x13,0x01,0x84,0x10,0x01,0x75,0x0f,0x01,0x07,0x0f,0x17,0x0f,0x67,0x0f,0x03,0x9a,0x06,0x01,0x29,0x06,0x01,0x54,0x02,0x01,0x9a,0x0a,0x01,0x8b,0x0a,0x01,0x7e,0x0a,0x01,0x0a,0x08,0x0b,0x21,0x94,0x22,0x01, -0x22,0x21,0x2a,0x2b,0x19,0x28,0x83,0x1d,0x00,0x83,0x15,0x2f,0x21,0x3f,0x21,0x02,0x21,0x19,0x1d,0x15,0x15,0x1d,0x19,0x21,0x04,0x2f,0x0d,0x83,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2b,0x2a,0x18,0x95,0x1a,0x1a,0x22,0x0b,0x0a,0x0a,0x21,0x22,0x10,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x2f,0x33,0x11,0x39,0x2f,0xed,0x39, -0x39,0x01,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x5d,0x10,0xce,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x13,0x17, -0x02,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x05,0x15,0x16,0x16,0x04,0x8b,0x8e,0x85,0xcf,0xfe,0xdf,0x9b,0x8d,0xb0,0x88,0x8a,0x74,0x6d,0xb1,0x89,0x5a,0x60,0xcb,0xb0,0x1d,0x17,0x01,0x4f,0xa2,0x8b,0x4c,0x77,0x3d,0x79, -0x65,0x45,0x4a,0xfe,0xef,0x92,0xb1,0x22,0xd2,0x7b,0x73,0xcc,0xba,0x01,0x35,0x01,0xa5,0x01,0x9a,0x3a,0xfe,0x88,0xfe,0x71,0xfe,0xf4,0x96,0x8d,0x4c,0x51,0x8a,0x8b,0x98,0x8b,0xd9,0x8b,0x2c,0x26,0x85,0x60,0x6d,0x22,0x1c,0x4e,0x52,0x65,0xf3,0x36,0x04,0x0e,0xba,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x16, -0x00,0x22,0x00,0x68,0x40,0x26,0x59,0x21,0x01,0x56,0x1e,0x01,0x55,0x1c,0x01,0x59,0x19,0x01,0x78,0x0b,0x01,0x69,0x0b,0x01,0x66,0x03,0x01,0x94,0x12,0x01,0x76,0x12,0x86,0x12,0x02,0x12,0x00,0x11,0x0e,0x17,0x83,0x00,0x84,0x0e,0xb8,0xff,0xc0,0x40,0x1a,0x0a,0x0d,0x48,0x0e,0x0e,0x24,0x1d,0x83,0x0f,0x08,0x1f,0x08,0x02,0x08,0x11, -0x12,0x01,0x1b,0x95,0x0e,0x0c,0x0f,0x1f,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x33,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x2b,0xfd,0xed,0x10,0xce,0x11,0x39,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x35,0x10,0x27,0x37,0x16, -0x17,0x16,0x15,0x03,0x34,0x27,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x04,0x28,0x79,0x80,0xe5,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xb8,0x75,0x71,0x3f,0x3b,0xa8,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa3,0x55,0x4a,0x01,0xf4,0xf5,0x88,0x8f,0x96,0x8c,0xfa,0xf3,0x80,0x8d,0x77,0x4c,0x01,0x29,0x8d,0x73,0x58,0xa3,0x97, -0x98,0xfe,0x22,0xb5,0x5e,0x6d,0xfe,0x84,0xfe,0x74,0x73,0x63,0x00,0x02,0x00,0x32,0xfe,0x1e,0x04,0xdb,0x06,0x02,0x00,0x25,0x00,0x28,0x01,0x1e,0x40,0x21,0x98,0x22,0x01,0x96,0x20,0x01,0x86,0x0a,0x01,0x99,0x07,0x01,0x21,0x0d,0x0c,0x19,0x1a,0x18,0x1a,0x06,0x27,0x01,0x27,0x15,0x14,0x28,0x14,0x51,0x18,0x61,0x18,0x02,0x18,0xb8, -0xff,0xc8,0x40,0x90,0x33,0x36,0x48,0x00,0x18,0x10,0x18,0x20,0x18,0x03,0xf1,0x18,0x01,0x58,0x18,0x01,0x29,0x18,0x01,0x18,0x14,0x28,0x14,0x84,0x1a,0x18,0x14,0x1a,0x1a,0x18,0x0c,0x84,0x0d,0x0d,0x26,0x0f,0x1a,0x01,0x1a,0x1a,0x28,0x03,0x05,0x84,0x00,0x31,0x17,0x41,0x17,0x51,0x17,0x71,0x17,0x81,0x17,0x05,0x77,0x17,0x01,0x56, -0x17,0x01,0x47,0x17,0x01,0x25,0x17,0x01,0x16,0x17,0x01,0x3e,0x26,0x4e,0x26,0x02,0x38,0x26,0x01,0x0b,0x26,0x01,0x17,0x26,0x28,0x26,0x84,0x16,0x17,0x14,0x16,0x16,0x17,0x02,0x0e,0x00,0x01,0x00,0x00,0x80,0x16,0x01,0x16,0x16,0x58,0x28,0x01,0x26,0x28,0x01,0x28,0x28,0x1b,0x21,0x0d,0x08,0x95,0x23,0x23,0x1f,0x03,0x02,0x02,0x0d, -0x26,0x27,0x95,0x1a,0x16,0x15,0x14,0x15,0x0d,0x15,0x0d,0x15,0x18,0x11,0x95,0x1f,0x01,0x17,0x18,0x1b,0x00,0x3f,0xc4,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4,0x33,0xfd,0xc4,0x11,0x33,0x2f,0x33,0x11,0x33,0x2f,0xed,0x12,0x39,0x3f,0x01,0x3d,0x2f,0x5d,0x5d,0xc9,0x18,0x2f,0x5d,0x32,0x2f,0x5d,0x33,0x87,0x10,0x2b, -0x87,0x7d,0xc4,0x01,0x5d,0x5d,0x72,0x5d,0x5d,0x5d,0x5d,0x5d,0x72,0x18,0x10,0xed,0x32,0x10,0xc9,0x2f,0x5d,0x12,0x39,0x2f,0xed,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x01,0x5d,0x5d,0x71,0x72,0x2b,0x72,0x10,0x87,0xc4,0xc4,0x01,0x5d,0x10,0x87,0x0e,0xc4,0x11,0x12,0x01,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x27,0x36,0x35, -0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x11,0x14,0x17,0x21,0x01,0x23,0x01,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x01,0x21,0x01,0x04,0xdb,0x20,0xa6,0x1e,0x4c,0x47,0x67,0x30,0x24,0xa4,0x24,0x30,0x67,0xac,0x1c,0x03,0xa7,0xfe,0x25,0xa2,0xfe,0x67,0x55,0x4d,0x57,0xb0,0xbb,0x53, -0x53,0xb9,0x8e,0xad,0xfe,0xf4,0xfd,0x4c,0x01,0x56,0x04,0xb8,0x4e,0x52,0x1d,0x53,0x3a,0x51,0x65,0x64,0x49,0x69,0x69,0x49,0x64,0xfe,0xc5,0x6c,0x5d,0xfa,0xaa,0x04,0x7f,0xef,0xa2,0xd3,0x78,0x89,0xbd,0xbd,0xb5,0xfd,0x9a,0xfb,0xe8,0x00,0x00,0x02,0x00,0x50,0xfe,0x1e,0x04,0x00,0x05,0xec,0x00,0x41,0x00,0x4c,0x00,0xe4,0x40,0x8d, -0x76,0x3f,0x01,0x75,0x3e,0x01,0x86,0x3d,0x01,0x73,0x3d,0x01,0x99,0x18,0x01,0x76,0x13,0x01,0x76,0x0f,0x01,0x67,0x0f,0x01,0x88,0x01,0x01,0x37,0x36,0x39,0x2f,0x36,0x36,0x34,0x31,0x32,0x2f,0x84,0x28,0x1c,0x42,0x00,0x84,0x15,0x42,0x15,0x42,0x15,0x22,0x4e,0x2d,0x84,0x2a,0x2a,0x22,0x0b,0x0d,0x84,0x0a,0x08,0x08,0x48,0x84,0x22, -0x43,0x42,0x45,0x4b,0xb9,0x32,0x01,0xa8,0x32,0x01,0x32,0x31,0x31,0x66,0x2f,0x01,0x37,0x2f,0x47,0x2f,0x57,0x2f,0x03,0x26,0x2f,0x01,0x69,0x39,0x01,0x38,0x39,0x48,0x39,0x58,0x39,0x03,0x29,0x39,0x01,0x1c,0x39,0x34,0x2f,0x28,0x05,0x1e,0x26,0x95,0x45,0x4b,0xb6,0x36,0x01,0xa7,0x36,0x01,0x36,0x37,0x37,0x0b,0x0a,0x0a,0x11,0x1e, -0x95,0x4b,0x4b,0x11,0x29,0x95,0x2e,0x2c,0x00,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xde,0xed,0x11,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0x32,0x2f,0x33,0x5d,0x5d,0x10,0xde,0xed,0x11,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x5d,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x2f, -0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xc4,0xfd,0xcd,0x39,0x39,0x32,0x2f,0x10,0xc4,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x26,0x27,0x26,0x35,0x06, -0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x36,0x37,0x17,0x06,0x07,0x16,0x17,0x07,0x26,0x27,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x01,0x35,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x04,0x00,0x9d,0x86,0xb6,0xb3,0x88,0x9c,0x28,0x9c,0x1e,0x68,0x58,0x71,0x74,0x56,0x69, -0x25,0x06,0xb5,0x19,0x28,0x5d,0x5d,0x71,0x43,0x3f,0x3f,0x44,0x70,0x5b,0x5f,0xfe,0x7c,0xa4,0x01,0x84,0x55,0x40,0x81,0x4b,0x56,0x56,0x4b,0x81,0x40,0x55,0x23,0x13,0x42,0x67,0x19,0x2b,0xfe,0x39,0x64,0x56,0x25,0x3d,0x3d,0x25,0x56,0x8c,0xa5,0x5f,0x52,0x57,0x64,0xa5,0x5e,0x51,0x37,0x37,0x45,0x65,0x3b,0x32,0x2d,0x36,0x65,0x51, -0x34,0x09,0xbb,0x2c,0x45,0x66,0x29,0x4b,0x46,0x6d,0x6d,0x47,0x4b,0x2a,0x01,0xa1,0x01,0x11,0x79,0xfd,0x61,0x59,0x69,0x60,0x74,0x5d,0x5d,0x74,0x5f,0x69,0x59,0x6d,0x41,0x34,0x1c,0x41,0x66,0x27,0x46,0x02,0x5f,0x43,0x40,0x3f,0x22,0x22,0x40,0x00,0x00,0x02,0x00,0xae,0xff,0xe8,0x04,0x76,0x05,0xec,0x00,0x11,0x00,0x1d,0x00,0x92, -0x40,0x62,0x5a,0x1d,0x01,0x49,0x1d,0x01,0x45,0x1b,0x55,0x1b,0x02,0x46,0x1a,0x56,0x1a,0x02,0x46,0x16,0x56,0x16,0x02,0x49,0x13,0x59,0x13,0x02,0x69,0x05,0x01,0x37,0x1d,0x01,0x37,0x1a,0x01,0x38,0x16,0x01,0x85,0x0e,0x01,0x74,0x0e,0x01,0x07,0x0e,0x17,0x0e,0x02,0x0e,0x0c,0x0b,0x2e,0x0d,0x01,0x1f,0x0d,0x01,0x0d,0x0d,0x00,0x83, -0x10,0x12,0x20,0x12,0x30,0x12,0x03,0x12,0x12,0x1f,0x0b,0x84,0x18,0x83,0x08,0x0c,0x2e,0x0d,0x01,0x0d,0x0d,0x0a,0x14,0x95,0x66,0x0b,0x01,0x0b,0x0e,0x0f,0x0a,0x00,0x1c,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0x01,0x2f,0xed,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x5d,0x5d,0x12,0x39, -0x39,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x01,0x33,0x01,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x04,0x76,0x7b,0x84,0xeb,0xe5,0x80,0x79,0xa8,0x01,0xd8,0xd7,0xfe,0xa0,0xea,0x79, -0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xe6,0x8c,0x96,0x8f,0x88,0xe1,0x04,0x0c,0xfd,0x7a,0x01,0x9e,0xfe,0xd8,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x00,0x01,0x00,0x21,0xfe,0x1e,0x05,0xf5,0x04,0x18,0x00,0x43,0x01,0x30,0x40,0xb7,0x75,0x3a,0x01,0x67,0x29,0x01,0x56,0x29, -0x01,0x45,0x29,0x01,0x26,0x29,0x01,0x36,0x17,0x01,0x6a,0x0e,0x01,0x42,0x41,0x41,0x00,0x84,0x3f,0x3b,0x30,0x31,0x31,0x2c,0x3a,0x3b,0x28,0x38,0x08,0x39,0x38,0x08,0x38,0x2a,0x2b,0x17,0x29,0x3b,0x28,0x2b,0x17,0x18,0x06,0x19,0x2b,0x17,0x07,0x06,0x19,0x38,0x08,0xa5,0x2b,0x01,0x2b,0x08,0x38,0x08,0x84,0x17,0x2b,0x14,0x17,0x17, -0x2b,0x2b,0x2c,0x84,0x38,0x37,0x37,0x28,0x06,0x19,0x06,0x84,0x3b,0x28,0x14,0x3b,0x28,0x3b,0x3b,0x17,0x45,0x20,0x1f,0x22,0x84,0x1d,0x1f,0x1f,0x1d,0x19,0x19,0x17,0x10,0x0f,0x08,0x17,0x0a,0x84,0x00,0x15,0x01,0x15,0x15,0x17,0x38,0x2e,0x31,0x33,0x30,0x30,0x2e,0x95,0x33,0x33,0x26,0xc5,0x1f,0x01,0x1f,0x20,0x20,0x19,0x1b,0x95, -0x28,0x26,0x10,0xba,0x41,0x01,0xa9,0x41,0x01,0x41,0x42,0x42,0x3b,0x3d,0x95,0x04,0xd2,0x17,0x01,0x24,0x17,0x44,0x17,0x54,0x17,0x03,0x09,0x17,0x01,0x17,0x76,0x10,0x86,0x10,0x02,0x10,0x12,0x95,0x6c,0x0f,0x01,0x0f,0x0d,0x0d,0x06,0x04,0x1c,0x00,0x3f,0x33,0x33,0x2f,0x33,0x5d,0xed,0x32,0x5d,0x32,0x5d,0x5d,0x5d,0x10,0xed,0x32, -0x32,0x2f,0x33,0x5d,0x5d,0x3f,0x33,0xed,0x32,0x32,0x2f,0x33,0x5d,0x11,0x33,0x2f,0xed,0x32,0x2f,0x12,0x39,0x11,0x33,0x01,0x2f,0x33,0x2f,0x5d,0xed,0x11,0x39,0xcc,0x32,0x11,0x33,0x2f,0xce,0x32,0x2f,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x87,0x2b,0x87,0x7d,0xc4,0x01,0x33,0x18,0x2f,0x33,0xed,0x32,0x87,0x04,0x10,0x2b,0x87, -0x7d,0xc4,0x00,0x5d,0x0f,0x0f,0x0f,0x87,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x0f,0x11,0x01,0x33,0x18,0x2f,0x33,0x10,0xde,0xed,0x33,0x2f,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x01,0x01, -0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x01,0x01,0x36,0x35,0x34,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x01,0x01,0x16,0x33,0x32,0x35,0x34,0x27,0x37,0x16,0x05,0xf5,0x40,0x3c,0x5b,0x90,0x52,0xfe,0xcf,0xfe,0xa4,0x33,0x8e,0x69,0x77,0x53,0x43,0x3c,0x4b,0x24,0x36,0x83, -0x01,0xef,0xfe,0xc3,0x36,0x2f,0x2b,0x5a,0x7f,0x74,0x40,0x3c,0x5b,0x8b,0x52,0x01,0x3b,0x01,0xd3,0x59,0x38,0x3d,0x87,0x58,0xac,0x64,0x62,0x3a,0x37,0x86,0xfe,0x26,0x01,0x35,0x37,0x30,0x2b,0x5a,0x7f,0x74,0xfe,0xf1,0x62,0x3a,0x37,0x86,0x01,0xf3,0xfe,0xfd,0x38,0x6c,0x5d,0x75,0x47,0x8a,0x47,0x34,0x24,0x6b,0x50,0x01,0x70,0x02, -0x06,0x58,0x38,0x3d,0x87,0x58,0xac,0x64,0x62,0x3a,0x37,0x86,0xfd,0xff,0x01,0x5c,0x42,0x25,0x2b,0x5a,0x7f,0x74,0x40,0x3c,0x5b,0x7e,0x64,0xfe,0x9f,0xfe,0x08,0x59,0x38,0x3d,0x87,0x58,0xac,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xf3,0x06,0x02,0x00,0x3d,0x00,0xa2,0x40,0x5f,0x94,0x32,0x01,0x87,0x2e,0x01,0x98,0x15,0x01,0x86, -0x12,0x01,0x77,0x12,0x01,0x77,0x0f,0x87,0x0f,0x02,0x99,0x01,0x01,0x36,0x20,0x33,0x84,0x24,0x24,0x13,0x3a,0x19,0x38,0x84,0x1d,0x1d,0x13,0x20,0x20,0x19,0x19,0x0d,0x00,0x84,0x13,0x13,0x08,0x3f,0x2d,0x2c,0x2c,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x01,0x08,0x36,0x20,0x95,0x22,0x3a,0x19,0x0b,0x0a,0x0a,0x17,0x95,0x19,0x8b,0x2c,0x01, -0x18,0x31,0x01,0x9a,0x28,0x01,0x28,0x31,0x2c,0x03,0x2d,0x22,0x19,0x22,0x19,0x2d,0x01,0x11,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x33,0x11,0x39,0x10,0xed,0x39,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f, -0x11,0x33,0x2f,0xed,0x11,0x39,0x11,0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x35,0x34,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x26, -0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17,0x04,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x03,0xf3,0x8f,0x80,0xd5,0xae,0x79,0x88,0x29,0x99,0x1c,0x55,0x4a,0x6c,0x01,0x3f,0x3d,0x40,0x60,0x60,0x60,0x64,0x79,0xdd,0x60,0x60,0xdd,0x55,0x17,0x79,0xa1,0x2f,0x6a,0x3d,0x6d,0x41,0x5f,0x23,0x9d,0x01,0x32,0x6d,0x5c,0xc9, -0xc9,0x58,0x3a,0x37,0x01,0x2b,0xa2,0x55,0x4c,0x57,0x62,0xa7,0x5c,0x53,0x37,0x33,0x49,0x66,0x3a,0x32,0xc9,0x43,0x2f,0x30,0x8b,0x48,0x40,0x82,0x8b,0x84,0x44,0x1e,0x08,0x14,0x1b,0x10,0x24,0x54,0x60,0x48,0x1c,0x0b,0x18,0x2f,0xc9,0x4a,0x6e,0x13,0x2a,0xa1,0xa0,0x2a,0x13,0x4b,0x47,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x95, -0x06,0x02,0x00,0x3d,0x00,0x45,0x00,0xc6,0x40,0x7a,0x76,0x41,0x01,0x57,0x41,0x67,0x41,0x02,0x65,0x30,0x01,0x99,0x2b,0x01,0x98,0x2a,0x01,0x99,0x29,0x01,0x99,0x28,0x01,0x99,0x17,0x01,0x9b,0x14,0x01,0x89,0x14,0x01,0x94,0x12,0x01,0x55,0x12,0x85,0x12,0x02,0x37,0x11,0x01,0x86,0x0d,0x01,0x89,0x07,0x01,0x6b,0x03,0x01,0x36,0x22, -0x33,0x84,0x26,0x26,0x15,0x3a,0x1b,0x00,0x22,0x22,0x2f,0x1b,0x01,0x1b,0x1b,0x42,0x38,0x84,0x1f,0x1f,0x15,0x2d,0x2c,0x3e,0x84,0x0b,0x0b,0x42,0x00,0x84,0x15,0x15,0x47,0x0f,0x42,0x83,0x06,0x3a,0x19,0x95,0x1b,0x42,0x95,0x0f,0x36,0x23,0x95,0x21,0x1b,0x0f,0x21,0x21,0x0f,0x1b,0x03,0x13,0x40,0x95,0x08,0x2c,0x2d,0x2d,0x08,0x01, -0x13,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x33,0x10,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x10,0xed,0x39,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0xce,0x32,0x11,0x33,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0x2f,0x11,0x12,0x39,0x11,0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x03,0x26,0x11,0x10,0x21,0x32,0x16,0x15,0x14,0x07,0x06,0x07,0x14,0x17,0x12,0x33,0x20,0x35,0x34,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17, -0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x23,0x22,0x11,0x36,0x37,0x36,0x04,0x95,0xfe,0x5f,0xfe,0xb4,0xb4,0x94,0x01,0x4e,0x67,0x7c,0x7d,0x7a,0x8f,0x67,0x87,0xf0,0x01,0x09,0x3d,0x40,0x60,0x60,0x60,0x64,0x79,0xdd,0x60,0x60,0xdd,0x3d,0x40,0x41,0x51,0x21,0x81,0x1a,0x5b,0x88,0x0c,0x49,0x6d,0x5c, -0xc9,0xc9,0x58,0x3a,0x37,0xfd,0x5a,0x41,0xa3,0x65,0x45,0x3a,0x01,0x2b,0xfe,0xbd,0x01,0x30,0xfa,0x01,0x59,0x02,0x97,0x74,0x68,0xa0,0xa0,0x9b,0x26,0xd8,0xcc,0xfe,0xf1,0xc9,0x43,0x2f,0x30,0x8b,0x48,0x40,0x82,0x8b,0x84,0x36,0x29,0x27,0x28,0x39,0x50,0x4a,0x41,0x3c,0x59,0x0b,0x42,0x5c,0x4a,0x6e,0x13,0x2a,0xa1,0xa0,0x2a,0x13, -0x4b,0x47,0x03,0xa4,0x55,0xfe,0x40,0x1b,0x83,0x6f,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x1d,0x04,0x18,0x00,0x19,0x00,0x27,0x01,0x04,0x40,0xb7,0x48,0x20,0x58,0x20,0x02,0x48,0x1c,0x58,0x1c,0x02,0x08,0x17,0x01,0x77,0x13,0x01,0x65,0x13,0x01,0x77,0x0f,0x01,0x65,0x0f,0x01,0x08,0x0b,0x01,0x25,0x1a,0x22,0x17,0x04,0x0b,0x03,0x0d, -0x19,0x19,0x15,0x83,0x1a,0x1a,0x29,0x22,0x83,0x0d,0x09,0x09,0x0d,0x1e,0x95,0x11,0x10,0x16,0x25,0x01,0x07,0x25,0x01,0xe7,0x25,0xf7,0x25,0x02,0xc5,0x25,0x01,0x97,0x25,0x01,0x73,0x25,0x83,0x25,0x02,0x64,0x25,0x01,0x47,0x25,0x57,0x25,0x02,0x25,0x09,0xda,0x0b,0x01,0x99,0x0b,0x01,0x0b,0x95,0x06,0x19,0xda,0x17,0x01,0x99,0x17, -0x01,0x17,0x95,0x19,0x00,0x01,0x08,0x00,0x01,0xe9,0x00,0xf9,0x00,0x02,0x9b,0x00,0x01,0x00,0x02,0x02,0x19,0x08,0x01,0x08,0x08,0x01,0xe9,0x08,0xf9,0x08,0x02,0x9b,0x08,0x01,0x08,0x0b,0x04,0x01,0xeb,0x04,0xfb,0x04,0x02,0x04,0x20,0x21,0x24,0x48,0x7c,0x04,0x01,0x5d,0x04,0x6d,0x04,0x02,0x4b,0x04,0x01,0x1a,0x04,0x2a,0x04,0x3a, -0x04,0x03,0x09,0x04,0x01,0xfa,0x04,0x01,0xdb,0x04,0xeb,0x04,0x02,0x9d,0x04,0x01,0x04,0x06,0x16,0x00,0x3f,0x33,0x5d,0x5d,0x5d,0x71,0x71,0x71,0x71,0x71,0x2b,0x71,0x72,0x33,0x5d,0x5d,0x71,0x71,0x33,0x2f,0x33,0x5d,0x5d,0x71,0x71,0xed,0x5d,0x5d,0x32,0x10,0xed,0x5d,0x5d,0x32,0x32,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x71,0x3f, -0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x11,0x17,0x39,0x11,0x12,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x37,0x26,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x10,0x07,0x16,0x37,0x01,0x34,0x27,0x26,0x23,0x22,0x07,0x06, -0x15,0x14,0x16,0x17,0x36,0x36,0x05,0x1d,0x92,0xec,0x84,0x73,0x73,0x85,0xec,0x92,0x8e,0xfb,0xe8,0x8a,0x7d,0xcc,0xcc,0x7e,0x8c,0xe8,0xfb,0x8e,0xfe,0xb7,0x59,0x4e,0x87,0x86,0x4e,0x57,0xa3,0x8a,0x8a,0xa2,0x1b,0x33,0x1e,0x1e,0x33,0x9c,0x47,0x02,0xa6,0x01,0x2a,0xe8,0x7d,0x71,0x71,0x7d,0xe8,0xfe,0xd6,0xa6,0x02,0x47,0x01,0x8b, -0xaa,0x56,0x4c,0x4c,0x56,0xaa,0x88,0xe0,0x39,0x39,0xe0,0x00,0x00,0x01,0x00,0x5e,0xfe,0x1e,0x03,0xf1,0x04,0x00,0x00,0x28,0x00,0x9a,0x40,0x5d,0x55,0x27,0x01,0x99,0x16,0x01,0x3a,0x16,0x4a,0x16,0x02,0x76,0x0f,0x01,0x57,0x0f,0x67,0x0f,0x02,0x66,0x02,0x01,0x54,0x02,0x01,0x77,0x25,0x01,0x99,0x1a,0x01,0x8a,0x1a,0x01,0x59,0x1a, -0x69,0x1a,0x02,0x25,0x1a,0x24,0x19,0x19,0x0d,0x15,0x24,0x24,0x00,0x83,0x15,0x15,0x08,0x2a,0x1f,0x1e,0x1e,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x01,0x08,0x1a,0x1c,0x24,0x23,0x23,0x1f,0x19,0x25,0x95,0x0b,0x0a,0x18,0x0a,0x18,0x0a,0x11,0x1c,0x95,0x21,0x21,0x1e,0x95,0x1f,0x0f,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x33,0x2f, -0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x39,0x11,0x33,0x2f,0x33,0x12,0x39,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17, -0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x10,0x21,0x23,0x35,0x01,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x25,0x15,0x01,0x16,0x17,0x16,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x86,0x57,0x5b,0xfe,0x54,0x52,0x01,0x65,0x77,0x77,0xab,0xb9,0x2b,0x93,0xcb,0xcc,0x01,0x03,0xfe,0x77,0xd2, -0x74,0x7e,0x1d,0xd2,0x7d,0x76,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x54,0x57,0x8c,0x01,0x4e,0x33,0x01,0xea,0x18,0x42,0x8c,0x42,0x42,0x33,0xfd,0xe1,0x19,0x6e,0x77,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x06,0x02,0x00,0x43,0x00,0xe0,0x40,0x8f,0x56,0x43,0x66,0x43,0x02,0x85,0x3d,0x01,0x57,0x3d,0x67,0x3d, -0x02,0x76,0x36,0x86,0x36,0x02,0x79,0x32,0x89,0x32,0x02,0x89,0x22,0x01,0x48,0x17,0x01,0x59,0x13,0x69,0x13,0x02,0x76,0x0f,0x86,0x0f,0x02,0x67,0x0f,0x01,0x56,0x0f,0x01,0x2d,0x2b,0x84,0x2e,0x30,0x30,0x15,0x85,0x3a,0x95,0x3a,0x02,0x3a,0x38,0x3e,0x83,0x9b,0x1f,0x01,0x79,0x1f,0x01,0x08,0x1f,0x01,0x1f,0x23,0x1d,0x1d,0x15,0x54, -0x40,0x01,0x41,0x40,0x00,0x19,0x19,0x0d,0x00,0x83,0x20,0x15,0x01,0x15,0x15,0x08,0x45,0x38,0x83,0x23,0x23,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2e,0x2d,0x40,0x41,0x1a,0x0b,0x0a,0x0a,0x11,0x18,0x95,0x1a,0x18,0x1f,0x01,0x3a,0x1f,0x1a,0x0f,0x2d,0x1f,0x2d,0x02,0x2d,0x1a,0x2d,0x1a,0x11,0x34,0x95,0x27,0x01,0x11, -0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x11,0x39,0x39,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x5d,0x11,0x33,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11, -0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x27,0x24,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07, -0x27,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x14,0x05,0x15,0x16,0x16,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x55,0x5b,0xcb,0xb0,0x1d,0x17,0x01,0x4f,0xa7,0xfe,0xf2,0x2a,0xa7,0x89,0x79,0xaf,0xae,0x79,0x88,0x27,0x9d,0x1e,0x54,0x4a,0x6b,0x6c,0x4a, -0x55,0xa8,0x9c,0x9c,0xa8,0xfe,0xef,0x92,0xb1,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x50,0x8b,0x8b,0x98,0x8b,0xd9,0x5d,0x3f,0x66,0x1a,0x6a,0xc6,0xa8,0x61,0x57,0x57,0x62,0xa7,0x60,0x4f,0x37,0x37,0x45,0x67,0x39,0x32,0x32,0x39,0x67,0x98,0x4b,0x38,0x38,0x4d,0x9e,0xf3,0x36,0x04,0x0e, -0xba,0x00,0x00,0x03,0x00,0x52,0xff,0xe8,0x04,0x92,0x06,0x02,0x00,0x21,0x00,0x2c,0x00,0x38,0x00,0x81,0x40,0x50,0x99,0x37,0x01,0x8a,0x37,0x01,0x85,0x31,0x01,0x8a,0x25,0x01,0x79,0x25,0x01,0x96,0x19,0x01,0x9a,0x16,0x01,0x7a,0x12,0x8a,0x12,0x02,0x9a,0x0b,0x01,0x7b,0x0b,0x01,0x7b,0x0a,0x01,0x1e,0x21,0x1c,0x01,0x1f,0x84,0x2e, -0x22,0x0e,0x0e,0x09,0x3a,0x28,0x83,0x14,0x14,0x33,0x83,0x09,0x40,0x09,0x0c,0x48,0x09,0x1c,0x22,0x95,0x0f,0x1f,0x0e,0x2e,0x01,0x95,0x20,0x0e,0x0e,0x35,0x26,0x95,0x18,0x01,0x35,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x10,0xdd,0xc4,0xfd,0xc4,0x01,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x11,0x12,0x39, -0x2f,0xc4,0xc4,0xfd,0xc4,0xc4,0xde,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x33,0x35,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x21,0x15,0x21,0x01,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17, -0x16,0x33,0x13,0x35,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x04,0x92,0xfe,0xd4,0xcd,0xb6,0xb5,0x6b,0x71,0x81,0x74,0xb1,0xc6,0xc6,0xb1,0x74,0x81,0x71,0x6b,0xb5,0xb6,0xcd,0x01,0x2c,0xfe,0xd4,0x01,0x2c,0xfe,0x2c,0x72,0x69,0xe1,0x4c,0x45,0x65,0xc6,0xc6,0x65,0x45,0x4c,0xe1,0x69,0x3a,0x38,0x02,0x0e,0xa8,0xb5,0xc9, -0x57,0x5c,0xa8,0xab,0x60,0x58,0x9e,0x58,0x60,0xab,0xa8,0x5c,0x57,0xc9,0xb5,0xa8,0x98,0x9e,0x01,0x36,0xa8,0x68,0x7f,0xc4,0x60,0x39,0x32,0xfd,0x8a,0xa8,0x32,0x39,0x60,0xc4,0x41,0x3e,0x00,0x03,0x00,0x60,0xfe,0x1e,0x07,0x48,0x06,0x02,0x00,0x31,0x00,0x3d,0x00,0x49,0x00,0xb9,0x40,0x79,0x46,0x45,0x01,0x46,0x43,0x01,0x49,0x3d, -0x01,0x49,0x33,0x01,0x55,0x45,0x01,0x59,0x43,0x01,0x55,0x3d,0x01,0x5a,0x33,0x01,0x44,0x83,0x0f,0x19,0x1f,0x19,0x3f,0x19,0x03,0x19,0x12,0x32,0x83,0x00,0x00,0x10,0x00,0x30,0x00,0x03,0x00,0x06,0x38,0x38,0x2c,0x0b,0x06,0x84,0x12,0x3e,0x3e,0x24,0x1f,0x12,0x24,0x22,0x95,0x25,0x27,0x01,0x34,0x95,0x44,0x2c,0x54,0x2c,0x02,0x2c, -0x2e,0x2e,0x42,0x95,0x44,0x1f,0x54,0x1f,0x02,0x1f,0x1d,0x0f,0x3c,0x95,0x79,0x06,0x01,0x6a,0x06,0x01,0x4b,0x06,0x5b,0x06,0x02,0x06,0x04,0x04,0x46,0x95,0x69,0x13,0x79,0x13,0x02,0x4b,0x13,0x5b,0x13,0x02,0x13,0x15,0x16,0x0b,0x09,0x95,0x0c,0x0e,0x1c,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x5d,0x5d,0xed,0x33,0x2f,0x33,0x5d,0x5d, -0x5d,0xed,0x3f,0x33,0x5d,0xed,0x33,0x2f,0x33,0x5d,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xcc,0x33,0x2f,0x10,0xfd,0xce,0xc4,0x33,0x2f,0x10,0xdc,0x5d,0xed,0x10,0xdc,0x5d,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27, -0x26,0x35,0x35,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x01,0x34,0x27,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x07,0x48,0x7b,0x84,0xeb,0xbc,0x7a, -0xac,0x3d,0x30,0x2c,0x4b,0x93,0x5d,0x5a,0x7a,0xbc,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xac,0x3d,0x30,0x2c,0x4b,0x93,0x5d,0x5a,0x88,0xc6,0xea,0x7a,0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0xfc,0xe0,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa1,0x56,0x4b,0x01,0xf0,0xe6,0x8c,0x96,0x63,0xc9,0xd9,0x1b,0x94, -0x12,0x65,0x62,0x95,0xd1,0x63,0x96,0x8c,0xe6,0xdf,0x80,0x8d,0x77,0x01,0x39,0xd9,0x1b,0x94,0x12,0x65,0x62,0x95,0xfe,0xbf,0x77,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x01,0x74,0xa1,0x5e,0x6d,0xfe,0x98,0xfe,0x88,0x71,0x62,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x2f,0x00,0xc2,0x40,0x83, -0x79,0x29,0x01,0x68,0x29,0x01,0x59,0x29,0x01,0x56,0x25,0x66,0x25,0x02,0x25,0x1f,0x01,0x77,0x1e,0x01,0x35,0x1e,0x01,0x85,0x1b,0x95,0x1b,0x02,0x8a,0x17,0x9a,0x17,0x02,0x75,0x12,0x01,0x67,0x12,0x01,0x7a,0x0f,0x01,0x2a,0x0a,0x01,0x69,0x09,0x01,0x06,0x02,0x16,0x02,0x02,0x2e,0x00,0x84,0x2d,0x2b,0x2b,0x0e,0x34,0x20,0x54,0x20, -0x64,0x20,0x84,0x20,0x04,0x20,0x23,0x1d,0x83,0x8b,0x0b,0x9b,0x0b,0x02,0x6d,0x0b,0x01,0x4a,0x0b,0x5a,0x0b,0x02,0x2f,0x0b,0x01,0x0b,0x08,0x20,0x0e,0x30,0x0e,0x02,0x0e,0x0e,0x31,0x23,0x83,0x08,0x14,0x84,0x15,0x15,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2d,0x2e,0x2e,0x27,0x20,0x20,0x04,0x15,0x15,0x0b,0x10,0x95,0x0b,0x19,0x10,0x27, -0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x39,0xed,0x11,0x39,0x2f,0x11,0x39,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x21,0x22,0x07,0x06,0x15,0x23,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x37,0x16,0x03,0xf1,0x88,0x7d,0xaa,0xcf,0x85,0x8e,0xbc,0xae,0xae,0xbc,0xfe,0xfb,0x68,0x44, -0x4b,0xa6,0x7f,0x73,0xab,0xba,0x77,0x7c,0xbc,0xae,0xae,0xbc,0x5b,0x55,0x88,0x68,0x4e,0x55,0x1c,0x9a,0x28,0x6e,0xa9,0x6a,0x61,0x73,0x7b,0xd2,0xcd,0x76,0x4d,0x4e,0x58,0x85,0xf4,0x34,0x39,0x68,0xa8,0x61,0x57,0x60,0x63,0xa7,0xe0,0x72,0x4b,0x4b,0x57,0xa0,0x8b,0x50,0x4c,0x3c,0x42,0x68,0x49,0x33,0x37,0x51,0x00,0x01,0x00,0x5f, -0xfe,0x1e,0x03,0xf0,0x04,0x18,0x00,0x3b,0x00,0x76,0x40,0x49,0x56,0x2a,0x66,0x2a,0x76,0x2a,0x03,0x55,0x24,0x65,0x24,0x02,0x47,0x24,0x01,0x99,0x1a,0x01,0x9a,0x19,0x01,0x76,0x0a,0x86,0x0a,0x02,0x2f,0x31,0x84,0x2c,0x12,0x17,0x84,0x11,0x0c,0x0c,0x2e,0x2c,0x2c,0x3d,0x02,0x21,0x84,0x3b,0x6b,0x21,0x01,0x3a,0x21,0x4a,0x21,0x5a, -0x21,0x03,0x21,0x07,0x95,0x2e,0x2f,0x1c,0x2f,0x1c,0x2f,0x01,0x27,0x95,0x36,0x1c,0x11,0x12,0x12,0x01,0x0f,0x00,0x3f,0x33,0x2f,0x33,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x33,0x5d,0x5d,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x13,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x5f,0xa4,0x27,0x48,0x65,0x3e,0x2e,0x57,0x42,0x28,0x0c,0x07, -0x09,0x0a,0x99,0x0e,0x0b,0x0a,0x10,0x39,0x68,0x91,0x57,0x2a,0x53,0x4b,0x40,0x16,0x30,0x55,0x73,0x44,0x32,0x60,0x4b,0x2e,0x1c,0x99,0x29,0x49,0x79,0x9b,0x52,0x66,0xb1,0x81,0x4a,0x04,0x00,0x85,0x45,0x80,0x63,0x3b,0x20,0x42,0x66,0x46,0x26,0x43,0x1a,0x1e,0x1a,0x37,0x22,0x28,0x22,0x59,0x33,0x5f,0x96,0x67,0x36,0x15,0x24,0x2f, -0x1a,0xfd,0xbf,0x45,0x6d,0x4d,0x28,0x20,0x3c,0x55,0x35,0x4a,0x32,0x37,0x54,0x5b,0x56,0x8a,0x60,0x34,0x3d,0x74,0xa6,0x69,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x50,0x04,0x18,0x00,0x36,0x00,0x46,0x00,0x93,0x40,0x60,0x45,0x46,0x55,0x46,0x02,0x55,0x42,0x01,0x46,0x42,0x01,0x5a,0x3f,0x01,0x49,0x3f,0x01,0x59,0x39,0x01,0x4a,0x39, -0x01,0x64,0x27,0x01,0x69,0x23,0x01,0x79,0x1e,0x01,0x6a,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x02,0x16,0x12,0x26,0x12,0x46,0x12,0x56,0x12,0x04,0x2f,0x32,0x84,0x1a,0x1d,0x1a,0x0b,0x10,0x83,0x0a,0x05,0x05,0x2a,0x83,0x3c,0x30,0x3c,0x01,0x1a,0x3c,0x1a,0x3c,0x48,0x44,0x83,0x0f,0x20,0x1f,0x20,0x02,0x20,0x0a,0x0b,0x37,0x95,0x1d,0x2f, -0x2f,0x00,0x41,0x95,0x25,0x10,0x00,0x95,0x15,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x32,0x3e,0x02,0x35, -0x34,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x06,0x06,0x15,0x14,0x1e,0x02,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xea,0x2a,0x46,0x32,0x1c,0x06, -0x04,0x04,0x06,0xa6,0x06,0x05,0x04,0x07,0x35,0x5f,0x83,0x4f,0x4f,0x82,0x5e,0x34,0x17,0x0e,0xa5,0xa7,0x46,0x83,0xbd,0x78,0x74,0xb9,0x81,0x44,0x46,0x86,0xc1,0x7c,0x0e,0x10,0x1d,0x33,0x47,0x6e,0x57,0x81,0x54,0x2a,0x2b,0x56,0x80,0x55,0x9f,0xab,0xab,0xfe,0xa8,0x1f,0x35,0x45,0x27,0x1a,0x30,0x12,0x15,0x12,0x1d,0x16,0x1a,0x16, -0x3a,0x20,0x4a,0x7a,0x57,0x2f,0x2f,0x58,0x7d,0x4e,0x43,0x60,0x22,0x28,0xfa,0xc3,0x76,0xbd,0x84,0x47,0x44,0x80,0xb7,0x73,0x7c,0xc1,0x84,0x45,0x27,0x4e,0x35,0x33,0x4f,0x35,0x1b,0x02,0x06,0x35,0x62,0x8a,0x55,0x53,0x86,0x5e,0x33,0xb0,0xbe,0xc0,0xb2,0x00,0x00,0x01,0x00,0x40,0xfe,0x1e,0x04,0x96,0x04,0x18,0x00,0x33,0x00,0x93, -0x40,0x60,0x35,0x27,0x45,0x27,0x55,0x27,0x95,0x27,0x04,0x3a,0x23,0x4a,0x23,0x5a,0x23,0x03,0x65,0x16,0x01,0x94,0x2f,0x01,0x86,0x2f,0x01,0x64,0x2f,0x74,0x2f,0x02,0x2f,0x2a,0x8f,0x0c,0x9f,0x0c,0x02,0x3b,0x0c,0x4b,0x0c,0x5b,0x0c,0x03,0x18,0x0c,0x01,0x0c,0x0f,0x8b,0x01,0x9b,0x01,0x02,0x19,0x01,0x39,0x01,0x02,0x01,0x00,0x00, -0x1c,0x19,0x83,0x1d,0x20,0x20,0x35,0x2a,0x83,0x0f,0x09,0x09,0x0f,0x1d,0x1c,0x1c,0x0c,0x25,0x95,0x14,0x10,0x2f,0x01,0x0c,0x95,0x06,0x09,0x95,0x08,0x08,0x06,0x00,0x01,0x1c,0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x3f,0xed,0x11,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x32, -0x2f,0x33,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x07,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x26,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0x96, -0x68,0x4f,0x98,0x9c,0xa4,0x5c,0xd7,0x94,0x4e,0xc0,0x6b,0xa8,0xb1,0x49,0x89,0xc5,0x7d,0x6f,0xb1,0x7b,0x42,0x0a,0x13,0x9d,0x0c,0x06,0x2b,0x52,0x77,0x4d,0x57,0x84,0x58,0x2d,0x43,0x84,0xc4,0x81,0x3a,0x65,0x5c,0x59,0xfe,0x9b,0x7d,0x3f,0x5e,0x3f,0x20,0x7e,0xa8,0x31,0x31,0x5e,0x01,0x30,0xca,0x7c,0xc7,0x8c,0x4b,0x4a,0x8a,0xc2, -0x78,0x28,0x4c,0x61,0x37,0x42,0x3a,0x23,0x56,0x8f,0x66,0x38,0x3b,0x68,0x90,0x54,0x81,0xb9,0x8e,0x71,0x39,0x1a,0x39,0x3e,0x44,0x00,0x00,0x03,0x00,0x70,0xff,0xea,0x02,0xf4,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x32,0x40,0x1a,0x0c,0xaf,0x12,0x12,0x1e,0x25,0x00,0xaf,0x06,0x06,0x18,0xaf,0x1e,0x15,0xb0,0x0f,0x0f,0x03, -0x21,0xb0,0x1b,0x16,0x03,0xb0,0x09,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33, -0x32,0x16,0x01,0x50,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x01,0xa4,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0xfe,0x5c,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x03,0xa8,0x2f,0x41,0x42,0x2e,0x2e,0x40,0x3f,0xfe,0x28,0x2f,0x41,0x42,0x2e,0x2e,0x40,0x3f,0xfe,0x2c,0x2f,0x41,0x42,0x2e,0x2e,0x43,0x42,0x00,0x00,0x02,0x00,0x32, -0x02,0x58,0x02,0x76,0x06,0x02,0x00,0x20,0x00,0x2e,0x00,0x67,0x40,0x3f,0xd7,0x2a,0x01,0x0a,0x1c,0x01,0xea,0x1c,0xfa,0x1c,0x02,0x0a,0x06,0x01,0xeb,0x06,0xfb,0x06,0x02,0x0b,0x05,0x01,0x05,0x02,0x01,0xe5,0x02,0xf5,0x02,0x02,0x10,0x11,0x11,0x00,0x00,0x21,0x10,0x21,0x02,0x21,0x1b,0x29,0x29,0x09,0x1b,0x1b,0x1d,0x25,0x2b,0x04, -0x00,0x25,0x01,0x25,0x16,0x0b,0x11,0x13,0x10,0x0e,0x0e,0x0b,0x01,0x00,0x3f,0x33,0x2f,0x33,0xcd,0x32,0x10,0xdd,0xdc,0x5d,0xdc,0xcd,0x10,0xcd,0x32,0x01,0x2f,0xcd,0x33,0x2f,0x10,0xdc,0x5d,0xcd,0x32,0x2f,0x33,0x31,0x30,0x5d,0x71,0x71,0x5d,0x71,0x5d,0x71,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x34,0x33,0x32, -0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x15,0x15,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x02,0x76,0x4a,0x4f,0x8d,0x89,0x4d,0x48,0xcf,0x26,0x8d,0x20,0x31,0x45,0x2c,0x4f,0x51,0x29,0x93,0x1b,0x35,0x13,0x0d,0x52,0x63,0x8d,0x48,0x42,0x78,0x1d, -0x24,0x65,0x64,0x29,0x21,0xae,0x63,0x26,0x1d,0x03,0x90,0x8a,0x54,0x5a,0x56,0x52,0x87,0x01,0xb0,0xcb,0x2a,0x2a,0x58,0x39,0x2a,0x1f,0x17,0x39,0xbc,0x48,0x55,0x4d,0x89,0x65,0x2a,0x35,0x38,0x2d,0x62,0xcb,0x3b,0x2e,0x00,0x01,0x00,0x28,0xff,0x40,0x04,0x25,0x04,0x18,0x00,0x32,0x00,0x8c,0x40,0x4f,0x96,0x23,0x01,0x1b,0x1c,0x1c, -0x19,0x84,0x1e,0x03,0x00,0x84,0x04,0x07,0x07,0x1e,0x1e,0x28,0x34,0x2c,0x2b,0x2b,0x2a,0x2e,0x0c,0x0d,0x0e,0x2d,0x2d,0x0e,0x0e,0x84,0x28,0x2a,0x14,0x28,0x2a,0xa8,0x2a,0xb8,0x2a,0x02,0x19,0x2a,0x29,0x2a,0x02,0x0a,0x2a,0x01,0x2a,0x1f,0x28,0x01,0x28,0x0c,0x03,0x09,0x95,0x2e,0x31,0x10,0x2a,0x95,0x2d,0x0f,0x16,0x95,0x20,0x25, -0x1c,0x1b,0x1b,0x0e,0x11,0x95,0x28,0x25,0x16,0x00,0x3f,0x33,0xed,0x32,0x33,0x2f,0x33,0x10,0xdc,0xed,0x3f,0xed,0x3f,0x33,0xfd,0xcc,0x33,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x33,0x2f, -0x39,0x31,0x30,0x5d,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x0d,0xa8,0x13,0x03,0x33,0x0d, -0x13,0xfe,0x54,0x7c,0x02,0x33,0x0d,0x13,0x01,0x2b,0x4a,0x30,0x40,0x50,0x72,0x7d,0x52,0x33,0x0d,0x13,0xfe,0xd4,0x4e,0x26,0x9f,0x08,0x8d,0xc7,0x1d,0x01,0x6e,0x18,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x73,0xfd,0xb6,0x09,0x1b,0x35,0x05,0x4d,0x13,0x53,0x41,0x6a,0x99,0x5b,0x57,0x2f,0x31, -0x05,0x51,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0x68,0x6b,0x15,0x00,0x01,0x00,0x28,0xfe,0x1f,0x04,0x4e,0x04,0x00,0x00,0x30,0x00,0x95,0x40,0x54,0x9b,0x17,0x01,0x89,0x17,0x01,0x78,0x17,0x01,0x2f,0x30,0x02,0x00,0x00,0x84,0x30,0x1c,0x14,0x30,0x30,0x1c,0x30,0x1c,0x06,0x84,0x19,0x19,0x1c,0x1c,0x22,0x32,0x27,0x29,0x29,0x84,0x22, -0x24,0x14,0x22,0x22,0x24,0x26,0x25,0x25,0x24,0xa8,0x24,0xb8,0x24,0x02,0x24,0x22,0x10,0x12,0x84,0x0f,0x0d,0x0d,0x1f,0x22,0x01,0x22,0x00,0x30,0x24,0x95,0x27,0x0f,0x2f,0x29,0x2c,0x95,0x10,0x15,0x0f,0x22,0x1c,0x02,0x1f,0x16,0x15,0x95,0x0a,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x33,0xce,0x11,0x39,0xed,0x32,0x32,0x3f,0xed,0xd4, -0xc4,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x17, -0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4e,0xb8,0x02,0x9c,0xb3,0x84,0xbc,0x93,0xd5,0x47,0x90,0x30,0x84,0x5a,0x65,0x56,0x75,0x9b,0xfe,0x7f,0x48,0x2c,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03, -0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x95,0x0a,0x0c,0x32,0xba,0x43,0xa7,0x50,0x3a,0x85,0x5f,0x52,0x4e,0x37,0x33,0x27,0x2c,0x3d,0x21,0x2d,0x55,0x2d,0xa9,0x4a,0x70,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0x00,0x01,0x00,0x28,0xfe,0x1f,0x04,0x30,0x04,0x18,0x00,0x33,0x00,0xbd, -0x40,0x74,0x78,0x15,0x01,0x9a,0x11,0x01,0x89,0x11,0x01,0x30,0x2d,0x2d,0x84,0x1a,0x17,0x14,0x1a,0x1a,0x17,0xd9,0x1a,0x01,0x78,0x1a,0x01,0x1a,0x17,0x00,0x84,0x13,0x13,0x50,0x17,0x60,0x17,0x02,0x17,0x17,0x22,0x35,0x25,0x24,0x24,0x23,0x20,0x27,0x26,0x21,0x26,0x21,0x21,0x84,0x22,0x23,0x14,0x22,0x22,0x23,0xf7,0x23,0x01,0x88, -0x23,0xa8,0x23,0xc8,0x23,0x03,0x79,0x23,0x01,0x47,0x23,0x57,0x23,0x02,0x23,0x22,0x0a,0x0c,0x84,0x09,0x07,0x07,0x1f,0x22,0x01,0x22,0x40,0x0c,0x10,0x48,0x22,0x20,0x1a,0x1d,0x95,0x2d,0x27,0x2a,0x10,0x23,0x95,0x26,0x0f,0x0a,0x09,0x30,0x21,0x17,0x22,0x15,0x0f,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x33,0xc4,0x33,0xce,0x32,0x3f, -0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x05,0x14,0x07, -0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x16,0x04,0x30,0xb3,0x84,0xbc,0x93,0xd5,0x47,0x90,0x30,0x84,0x5a,0x65,0x56,0x75, -0x9b,0x09,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x87,0x02,0x9c,0xb0,0xa7,0x50,0x3a,0x85,0x5f,0x52,0x4e,0x37,0x33,0x27,0x2c,0x3d,0x21,0x2d,0x55,0x2c,0xa9,0x4b,0x1d,0x2c,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0xb4,0x26, -0x26,0xfd,0x7d,0x0a,0x0c,0x32,0xba,0x00,0x00,0x02,0x00,0x30,0xff,0xe7,0x04,0xa7,0x06,0x04,0x00,0x39,0x00,0x48,0x00,0xe4,0x40,0x9a,0x84,0x44,0x01,0x75,0x44,0x01,0x66,0x40,0x01,0x45,0x40,0x55,0x40,0x02,0x85,0x3f,0x01,0x8b,0x3d,0x01,0x7c,0x3d,0x01,0x48,0x3d,0x68,0x3d,0x02,0x79,0x3c,0x89,0x3c,0x02,0x48,0x36,0x58,0x36,0x68, -0x36,0x03,0x79,0x1e,0x89,0x1e,0x02,0x99,0x1d,0x01,0x99,0x1a,0x01,0x76,0x17,0x86,0x17,0x02,0x27,0x17,0x01,0x94,0x11,0x01,0x85,0x11,0x01,0x11,0x15,0x0c,0x0f,0x84,0x22,0x97,0x25,0x01,0x25,0x22,0x15,0x83,0x3a,0x03,0x00,0x84,0x04,0x07,0x07,0x89,0x3e,0x01,0x58,0x3e,0x78,0x3e,0x02,0x20,0x3e,0x3a,0x4f,0x22,0x5f,0x22,0x6f,0x22, -0x03,0x22,0x3a,0x22,0x3a,0x1c,0x4a,0x2e,0x31,0x84,0x2d,0x00,0x2a,0x10,0x2a,0x02,0x2a,0x2a,0x42,0x83,0x0f,0x1c,0x1f,0x1c,0x5f,0x1c,0x6f,0x1c,0x04,0x1c,0x25,0x0c,0x28,0x04,0x09,0x95,0x38,0x01,0x3e,0x95,0x20,0x20,0x45,0x28,0x95,0x33,0x2d,0x00,0x45,0x95,0x19,0x16,0x00,0x3f,0xed,0x3f,0xdc,0xed,0x11,0x39,0x2f,0xed,0x3f,0xfd, -0xce,0x12,0x39,0x39,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x5d,0x33,0xed,0x32,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x32,0x2f,0x33,0xed,0x32,0x10,0xed,0x11,0x33,0x5d,0x10,0xed,0x32,0x11,0x39,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x07, -0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x0f,0x02,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x10,0x07,0x06,0x21,0x22,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x37,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x37,0x33,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x33,0x32,0x01,0x34,0x27,0x26,0x27,0x06,0x07,0x06,0x15,0x14,0x16, -0x33,0x32,0x37,0x36,0x04,0xa7,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xaa,0x28,0x02,0x53,0x7c,0x1d,0x53,0x9e,0xa6,0xfe,0xf7,0xbd,0xde,0x90,0x93,0xfd,0x1d,0x09,0x15,0x9b,0x44,0x30,0x9f,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0x01,0xf7,0x44,0x30,0x9f,0xfe,0xc9,0x36,0x20,0x53,0xfe,0x84,0x6d,0x89,0x74,0xb9,0x77,0x6b,0x05, -0x50,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x35,0xc3,0x0a,0x0c,0x3c,0x42,0x63,0x25,0x66,0x95,0xfe,0xf7,0xb5,0xc0,0xc9,0xad,0xf8,0xb0,0xb4,0x2e,0x2f,0x38,0x19,0x30,0x71,0x30,0x15,0xb4,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x9c,0x15,0xfc,0x5c,0x5e,0x48,0x2b,0x41,0x1b,0xa8,0x8b,0xbf,0x6d,0x85,0xa3,0x91,0x00,0x00,0x01, -0x00,0x28,0xfe,0x25,0x04,0x25,0x04,0x18,0x00,0x21,0x00,0x90,0x40,0x57,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0xb8,0x10,0xc8,0x10,0x02,0x10,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x18,0x23,0x1b,0x1a,0x1a,0x19,0x16,0x1d,0x1c,0x17,0x1c,0x17,0x17,0x84,0x18,0x19,0x14,0x18,0x19,0xf7,0x19,0x01,0x88,0x19,0xa8,0x19,0xc8, -0x19,0x03,0x79,0x19,0x01,0x57,0x19,0x01,0x19,0x1f,0x18,0x01,0x18,0x40,0x0c,0x10,0x48,0x18,0x16,0x10,0x13,0x95,0x1d,0x01,0x20,0x10,0x19,0x95,0x1c,0x0f,0x17,0x0d,0x04,0x18,0x15,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0xc4,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10, -0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25, -0x08,0x87,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x88,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x7e,0x5a,0x45,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x40,0x63,0x02,0xa4,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x00,0x01, -0x00,0x28,0xfe,0x25,0x06,0xc0,0x04,0x18,0x00,0x30,0x00,0xb5,0x40,0x69,0x25,0x24,0x24,0x23,0x20,0x27,0x26,0x21,0x26,0x21,0x21,0x84,0x22,0x23,0x14,0x22,0x23,0xc8,0x23,0x01,0x86,0x23,0x01,0x57,0x23,0x77,0x23,0x02,0x23,0x5f,0x22,0x8f,0x22,0xbf,0x22,0x03,0x22,0x17,0x2c,0x0e,0x0c,0x0c,0x84,0x1a,0x17,0x14,0x1a,0x1a,0x17,0xa8, -0x1a,0xc8,0x1a,0x02,0x1a,0x17,0x12,0x84,0x13,0x13,0x17,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0xb8,0x06,0x01,0x06,0x04,0x17,0x0c,0x06,0x09,0x95,0x2c,0x01,0x2f,0x2f,0x20,0x1a,0x1d,0x95,0x27,0x2a,0x10,0x23,0x95,0x26,0x0f,0x03,0x04,0x21,0x17,0x0e,0x22,0x15,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x33,0xc4,0xd4,0xc4,0x3f, -0xed,0x3f,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x32,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x33,0x18,0x10,0xdc,0x5d,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x31, -0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x06,0xc0,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0d,0x13,0xfe,0x56,0x86,0x13, -0x01,0x14,0xa4,0x14,0x01,0x14,0x88,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x84,0x17,0x01,0x8c,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfd,0x81,0x5a,0x45,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x40,0x63,0x02,0xa4,0x0f,0x0e,0x35, -0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x86,0x71,0x15,0x00,0x00,0x02,0xff,0x3f,0xff,0xe7,0x04,0x25,0x06,0x04,0x00,0x2d,0x00,0x3f,0x00,0xa4,0x40,0x5e,0x87,0x04,0x01,0x76,0x04,0x01,0x64,0x04,0x01,0x53,0x04,0x01,0x03,0x01,0x01,0x84,0x3f,0x3d,0x14,0x3f,0x3f,0x3d,0x08,0x3f,0x18,0x3f,0x02,0x3f,0x3d,0x3d,0x0b,0x41, -0x1b,0x1d,0x84,0x18,0x34,0x33,0x29,0x28,0x27,0x35,0x27,0x35,0x35,0x84,0x0b,0x0e,0x14,0x0b,0x0b,0x0e,0x1a,0x18,0x18,0x0e,0x39,0x0e,0x01,0x2a,0x0e,0x01,0x0e,0x1f,0x0b,0x01,0x0b,0x3f,0x33,0x30,0x95,0x29,0x01,0x2c,0x10,0x0e,0x11,0x95,0x27,0x24,0x01,0x16,0x95,0x1f,0x1b,0x00,0x3d,0x35,0x38,0x95,0x0b,0x03,0x08,0x16,0x00,0x3f, -0x33,0x33,0xed,0x32,0x32,0x3f,0xde,0xed,0x3f,0x33,0xed,0x32,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x01,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d, -0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37, -0x13,0x36,0x04,0x25,0x08,0x6c,0x1f,0xae,0xfe,0x8a,0x53,0x21,0x9f,0x08,0xec,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x51,0x01,0x75,0x4a,0x2a,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfe,0x03,0x94, -0x2c,0x5f,0x15,0xb4,0x27,0x25,0x04,0x4a,0x10,0x0d,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x27,0x25,0xfe,0x8b,0x6a,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x02,0x00,0x5b,0xff,0xa7,0x06,0xc3,0x04,0x58,0x00,0x3a,0x00,0x4c,0x00,0xf0,0x40,0x85, -0x88,0x2c,0x98,0x2c,0x02,0x87,0x1c,0x01,0x76,0x1b,0x86,0x1b,0x96,0x1b,0x03,0x97,0x07,0x01,0x1d,0x1c,0x1c,0x18,0x16,0x36,0x01,0x07,0x36,0x01,0x36,0x16,0x49,0x4a,0x4b,0x4c,0x18,0x16,0x16,0x84,0x4c,0x20,0x14,0x4c,0x4c,0x20,0x4c,0x20,0x40,0x41,0x42,0x31,0x31,0x42,0x42,0x84,0x26,0x29,0x14,0x26,0x26,0x29,0x2e,0x2d,0x2d,0x29, -0x29,0x5f,0x26,0x01,0x26,0x20,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x50,0x0d,0x01,0x0d,0x20,0x4c,0x40,0x29,0x3d,0x95,0x34,0x16,0x10,0x13,0x95,0x36,0x01,0x39,0x39,0x34,0x2d,0x2e,0x2e,0x31,0x34,0x10,0x49,0x42,0x45,0x95,0x23,0x0d,0x08,0x04,0x09,0x09,0x96,0x1c,0x01,0x1c,0x1d,0x1d,0x23,0x26, -0x26,0x20,0x18,0x23,0x16,0x00,0x3f,0x33,0x33,0x33,0x2f,0x11,0x33,0x2f,0x33,0x5d,0x33,0x2f,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x3f,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x10,0xcc,0x5d,0x32,0x11, -0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0xc4,0x05,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35, -0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x05,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xc3,0x08,0x81,0x04, -0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0xfe,0x53,0x80,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x84,0x17,0x01,0x8f,0x4b,0x29,0x9f,0xfc,0xbb,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03, -0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e,0x0f,0x35,0x05,0x73,0xfd,0x9f,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x22,0x39,0x62,0x15,0xb4,0x27,0x25,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x85,0x70,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f, -0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x01,0x00,0x28,0x00,0x00,0x03,0xa4,0x04,0x00,0x00,0x1f,0x00,0x52,0x40,0x2f,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0xd8,0x06,0x01,0x06,0x00,0x04,0x01,0x04,0x04,0x21,0x15,0x17,0x84,0x14,0x13,0x12,0x10,0x0e,0x95,0x0f,0x19,0x1f,0x19,0x02,0x19,0x06,0x09,0x95,0x01,0x1e, -0x12,0x95,0x15,0x0f,0x03,0x04,0x15,0x00,0x3f,0xc4,0x3f,0xed,0xde,0x32,0xed,0x32,0xdc,0x5d,0xed,0x01,0x2f,0x33,0xce,0x32,0xed,0x32,0x12,0x39,0x2f,0x5d,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x23,0x37,0x21,0x06,0x15, -0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x03,0xa4,0x08,0x8a,0xa3,0x8e,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x02,0xc7,0x1d,0x01,0x6e,0x1f,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x02,0xec,0x25,0x27,0xfd,0x60,0x02,0xc3,0x0f,0x0e,0x2b,0x05,0x34,0x15,0x96,0x12,0x10,0x8b,0x78,0x15,0x28,0x05,0x31,0x15,0x00,0x00,0x02,0x00,0x59, -0xfe,0x25,0x04,0x25,0x05,0xec,0x00,0x27,0x00,0x37,0x00,0x95,0x40,0x4e,0x36,0x35,0x0f,0x0e,0x0d,0x04,0x01,0x01,0x84,0x37,0x0d,0x14,0x37,0x37,0x0d,0x37,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x15,0x39,0x2e,0x2d,0x23,0x22,0x21,0x2f,0x21,0x2f,0x2f,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x84,0x1c,0x1c,0x18,0x87,0x18,0x01,0x18, -0x1f,0x15,0x01,0x15,0x37,0x2d,0x2a,0x95,0x23,0x21,0x18,0x01,0x26,0x10,0x1c,0x00,0x35,0x2f,0x32,0x95,0x15,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0xed,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e, -0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13, -0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x04,0x25,0x09,0x99,0x13,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x03,0xfe,0x89,0x4a,0x2a,0x9f,0x09,0x99,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x54,0x7c, -0x03,0x33,0x0d,0x13,0x01,0xac,0x7c,0x03,0x03,0x64,0x22,0x2a,0xfd,0x3b,0x58,0x59,0x09,0x1d,0xfe,0xa9,0x01,0x50,0x16,0x0e,0x35,0x85,0x14,0x6b,0x15,0xb4,0x22,0x2a,0x02,0xc5,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0xc0,0x35,0x05,0x73,0xfd,0xaf,0x0e,0x0f,0x35,0x05,0x73,0x02,0x51,0x0e,0x00, -0x00,0x02,0x00,0x31,0xff,0xa7,0x06,0xbe,0x04,0x58,0x00,0x30,0x00,0x42,0x00,0xd9,0x40,0x7c,0x79,0x22,0x01,0x87,0x07,0x01,0x76,0x07,0x01,0x24,0x23,0x23,0x1f,0x27,0x1b,0x1c,0x1c,0x84,0x1d,0x1f,0x14,0x1d,0x1f,0x7a,0x1f,0x8a,0x1f,0x9a,0x1f,0x03,0x1f,0x1d,0x12,0x07,0x2c,0x17,0x2c,0x02,0x2c,0x36,0x38,0x38,0x84,0x12,0x15,0x14, -0x12,0x12,0x15,0x15,0x12,0x09,0x08,0x08,0x04,0x41,0x40,0x3f,0x0c,0x42,0x0c,0x97,0x04,0x01,0x04,0x01,0x01,0x84,0x42,0x0c,0x14,0x42,0x42,0x0c,0x42,0x0c,0x12,0x42,0x36,0x33,0x95,0x2c,0x01,0x2f,0x2f,0x2a,0x9a,0x23,0x01,0x8b,0x23,0x01,0x23,0x24,0x24,0x1b,0x15,0x18,0x95,0x27,0x1f,0x2a,0x10,0x1c,0x1d,0x15,0x3f,0x38,0x3b,0x95, -0x0f,0x85,0x08,0x95,0x08,0x02,0x08,0x09,0x09,0x12,0x0c,0x04,0x0f,0x16,0x00,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x5d,0x10,0xed,0x32,0x32,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x10,0x87,0xc4,0x0e, -0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x5d,0x18,0x10,0xdc,0x32,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35, -0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xbe,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x80,0x02,0x33, -0x0d,0x13,0xfe,0x57,0xa6,0xab,0xb5,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x83,0x18,0x01,0x8a,0x4b,0x29,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21,0x3a,0x62,0x15,0xb4,0x27,0x25,0x02,0x54, -0x09,0x14,0x35,0x05,0x72,0xfc,0xea,0x03,0x4b,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x83,0x6e,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x00,0x02,0x00,0x30,0xff,0xe7,0x05,0x4c,0x06,0x04,0x00,0x30,0x00,0x3d,0x00,0xcc,0x40,0x7d,0x56,0x3c,0x01,0x95,0x38,0x01, -0x87,0x38,0x01,0x89,0x35,0x01,0x95,0x0e,0x01,0x46,0x0e,0x56,0x0e,0x02,0x8a,0x07,0x01,0x21,0x23,0x84,0x20,0x1e,0x1e,0x14,0x00,0x01,0x01,0x2d,0x31,0x12,0x13,0x14,0x3d,0x14,0x2e,0x2f,0x05,0x06,0x2d,0x06,0x2d,0x2d,0x84,0x14,0x3d,0x14,0x14,0x14,0x3d,0x14,0x3d,0x3d,0x3f,0x37,0x83,0x0c,0x1c,0x95,0x0f,0x25,0x1f,0x25,0x02,0x25, -0x14,0x17,0x95,0x2d,0x2a,0x01,0x20,0x00,0x05,0x31,0x33,0x54,0x00,0x64,0x00,0x02,0x45,0x00,0x01,0x16,0x00,0x26,0x00,0x36,0x00,0x03,0x07,0x00,0x01,0x66,0x2f,0x01,0x12,0x2f,0x00,0x03,0x10,0x01,0x01,0x33,0x95,0x20,0x10,0x01,0x10,0x10,0x47,0x3d,0x01,0x3d,0x39,0x95,0x06,0x0a,0x16,0x00,0x3f,0x33,0xed,0x32,0x5d,0x3f,0x5d,0xed, -0x32,0x2f,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x39,0x3f,0x3f,0x33,0xed,0x32,0xdc,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x01,0x07,0x26,0x27,0x26,0x27,0x03,0x06,0x07,0x06,0x23,0x20,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x16,0x05,0x26,0x23,0x20,0x07,0x06,0x15,0x14,0x33,0x32,0x37, -0x36,0x37,0x05,0x4c,0x25,0x1c,0x20,0x4d,0x51,0x7e,0x21,0xc3,0x98,0xa8,0xfe,0x85,0xee,0xf7,0x01,0x75,0x27,0x1b,0x3c,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x3b,0x83,0xfe,0xc0,0x1f,0x1a,0xfe,0xe3,0xc8,0xbb,0xee,0x59,0x73,0x8d,0x10,0x03,0x9b,0xa2,0x15,0x12,0x2d,0x1b, -0xfd,0xb3,0x9c,0x55,0x43,0x01,0x7a,0x01,0x1f,0xc9,0xd0,0x02,0x01,0x1a,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x27,0x25,0xfe,0xee,0x23,0x4f,0x03,0xaf,0xa4,0xcc,0xfb,0x2d,0x36,0x4c,0x00,0x01,0x00,0x31,0x00,0x00,0x04,0x8d,0x06,0x04,0x00,0x33,0x00,0x9e,0x40,0x59,0x03,0x00,0x84,0x06, -0x18,0x15,0x15,0x84,0x24,0x21,0x14,0x24,0x24,0x21,0x04,0x06,0x06,0x24,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x00,0x21,0x01,0x21,0x21,0x2c,0x35,0x2a,0x0f,0x0e,0x2b,0x0e,0x2b,0x2b,0x84,0x2c,0x2d,0x14,0x2c,0x2d,0x08,0x2d,0x01,0x2d,0x2c,0x2f,0x03,0x01,0x03,0x03,0x12,0x19,0x0e,0x01,0x0e,0x09,0x95,0x77,0x2d,0x01,0x26,0x2d,0x01,0x19, -0x2d,0x01,0x2d,0x32,0x01,0x21,0x27,0x18,0x12,0x1d,0x2b,0x2c,0x15,0x2a,0x24,0x27,0x95,0x15,0x0f,0x12,0x10,0x00,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xc4,0xc4,0x11,0x39,0x11,0x39,0x3f,0x33,0x5d,0x5d,0x5d,0xed,0x32,0x5d,0x11,0x39,0x2f,0x5d,0x01,0x2f,0x33,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x12,0x01,0x39,0x18, -0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x07,0x03,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x07,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23, -0x22,0x07,0x05,0x03,0x23,0x01,0x36,0x37,0x25,0x36,0x33,0x32,0x04,0x8d,0x08,0x0e,0xa8,0x14,0x03,0x33,0x0d,0x13,0xfe,0x89,0x37,0x0a,0x3e,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x27,0x13,0x03,0x12,0xa4,0x12,0x03,0x14,0x28,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0x01,0x06,0x1f,0xae,0x01,0x76,0x53,0x21,0x9f,0x05,0x50,0x27,0x25,0x41, -0x64,0x0f,0x0e,0x35,0x05,0x63,0x0f,0x32,0xfe,0xc9,0x6a,0x15,0xb4,0x2a,0x22,0xa7,0x51,0x44,0x30,0x3d,0xfe,0x91,0x01,0x6f,0x3d,0x2d,0x34,0x65,0xc9,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x04,0xd0,0x94,0x2c,0x5f,0x15,0x00,0x01,0x00,0x5b,0xff,0xa7,0x06,0xea,0x04,0x58,0x00,0x35,0x00,0xba,0x40,0x67,0x96,0x05,0x01,0x07,0x87,0x06, -0x01,0x06,0x06,0x96,0x02,0x01,0x87,0x02,0x01,0x02,0x00,0x00,0x84,0x35,0x34,0x14,0x35,0x35,0x34,0x35,0x0a,0x50,0x34,0x01,0x34,0x2a,0x2c,0x2e,0x2e,0x84,0x2a,0x2b,0x14,0x2a,0x2a,0x2b,0x2b,0x2a,0x21,0x24,0x24,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x1c,0x1c,0x18,0x99,0x18,0x01,0x08,0x18,0x01,0x18,0x5f,0x15,0x01,0x15,0x0f, -0x2a,0x00,0x35,0x2b,0x1c,0x1d,0x1d,0x2c,0x21,0x18,0x2b,0x0f,0x34,0x2e,0x31,0x95,0x0d,0x2a,0x24,0x27,0x95,0x15,0x0f,0x12,0x12,0x0d,0x06,0x07,0x07,0x0a,0x02,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x3f,0x33,0x33,0xc4,0x33,0x2f,0x33,0x10,0xd4,0xc4,0x01,0x2f, -0x33,0xcc,0x5d,0x32,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xcc,0x5d,0x32,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x5d,0x32,0x18,0x2f,0x5d,0x33,0x31,0x30,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23, -0x22,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x06,0xea,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x82,0x4b,0x29,0x84,0x17,0xfe,0x71,0x4b,0x29,0x9f,0x08,0x81,0x04, -0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0xa7,0xac,0x03,0x33,0x0d,0x13,0x01,0xa9,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x85,0x70,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73, -0x03,0x16,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x00,0x01,0x00,0x28,0xff,0xa7,0x05,0xa2,0x04,0x18,0x00,0x36,0x00,0x8e,0x40,0x4e,0x86,0x05,0x01,0x07,0x06,0x06,0x02,0x00,0x00,0x84,0x36,0x35,0x14,0x36,0x36,0x35,0x36,0x0a,0x35,0x35,0x10,0x38,0x20,0x22,0x84,0x1d,0xa7,0x2c,0x01,0x2c,0x2f,0x2f,0x84,0x10,0x13,0x14, -0x10,0x10,0x13,0x1f,0x1d,0x1d,0x13,0xd8,0x13,0x01,0x13,0x10,0x00,0x36,0x0f,0x1b,0x95,0x24,0x13,0x16,0x95,0x2c,0x29,0x10,0x1f,0x0f,0x35,0x2f,0x32,0x95,0x0d,0x94,0x06,0x01,0x06,0x07,0x07,0x10,0x0a,0x02,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x5d,0x10,0xed,0x32,0x32,0x3f,0x3f,0x33,0xed,0x32,0xdc,0xed,0x3f,0xc4, -0x01,0x2f,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22, -0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x05,0xa2,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x86,0x4a,0x30,0x9f,0x08,0x81,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51, -0x23,0x96,0x08,0x81,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x26,0x26,0x02,0x5e,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x26,0x26,0xfd,0xa2,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x01,0x00,0x28,0xfe,0x25, -0x05,0xa2,0x04,0x18,0x00,0x39,0x00,0x88,0x40,0x48,0x0c,0x0d,0x38,0x39,0x02,0x00,0x00,0x84,0x39,0x0b,0x14,0x39,0x39,0x0b,0x39,0x0b,0x06,0x84,0x07,0x07,0x0b,0x0b,0x13,0x3b,0x23,0x25,0x84,0x20,0x2f,0x32,0x32,0x84,0x13,0x16,0x14,0x13,0x13,0x16,0x22,0x20,0x20,0x16,0x16,0x13,0x00,0x39,0x0f,0x1e,0x95,0x27,0x16,0x19,0x95,0x2c, -0x2f,0x2c,0x22,0x22,0x2c,0x10,0x38,0x32,0x35,0x95,0x13,0x0d,0x0b,0x02,0x10,0x16,0x07,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0xdc,0xed,0x3f,0xc4,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x2f, -0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14, -0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x05,0xa2,0xc3,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x05,0xfe,0x85,0x4a,0x30,0x9f,0x08,0x81,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x81,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0x53,0x52,0x5f,0x09,0x1d,0xfe, -0xa9,0x01,0x4e,0x18,0x0e,0x61,0x59,0x14,0x6b,0x15,0xb4,0x26,0x26,0x02,0x5e,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x26,0x26,0xfd,0xa2,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x01,0x00,0x59,0xff,0xa7,0x06,0xbc,0x05,0xec,0x00,0x3b,0x00,0xc6,0x40,0x6e,0x96,0x07,0x01,0x31,0x84,0x30, -0x30,0x19,0x2a,0x2b,0x2c,0x18,0x2c,0x16,0x37,0x36,0x35,0x17,0x35,0x17,0x17,0x84,0x18,0x2c,0x14,0x18,0x18,0x2c,0x57,0x2c,0x01,0x2c,0x18,0x22,0x24,0x24,0x84,0x1f,0x21,0x14,0x1f,0x21,0x38,0x21,0x01,0x09,0x21,0x01,0x21,0x6f,0x1f,0x01,0x1f,0x18,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x28,0x10,0x01, -0x10,0x20,0x0d,0x50,0x0d,0x02,0x0d,0x18,0x16,0x10,0x13,0x95,0x37,0x35,0x2c,0x01,0x3a,0x10,0x31,0x30,0x00,0x22,0x21,0x0f,0x2a,0x24,0x27,0x95,0x1f,0x19,0x1c,0x16,0x0d,0x08,0x04,0x09,0x09,0x17,0x18,0x15,0x00,0x3f,0xc4,0x33,0x2f,0x33,0x33,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xc4,0x3f,0xc4,0x3f,0x33,0x33,0x33,0x33,0xed, -0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x10,0xdc,0x5d,0x32,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x01,0x33,0x18,0x2f,0xed,0x31,0x30,0x5d,0x01,0x14, -0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x06,0xbc,0x08,0x81,0x04,0x15, -0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0xfe,0x54,0xa8,0xa6,0x16,0xfe,0x8e,0x4a,0x2a,0x9f,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0e,0x12,0x01,0xa7,0x98,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e, -0x0f,0x35,0x05,0x73,0xfc,0xeb,0x65,0x69,0x15,0xb4,0x26,0x26,0x03,0x19,0xfc,0xc4,0x0f,0x0e,0x35,0x05,0x72,0x02,0xc3,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x00,0x01,0x00,0x59,0xff,0xa7,0x04,0x4c,0x05,0xec,0x00,0x26,0x00,0x7d,0x40,0x45,0x07,0x06,0x06,0x02,0x00,0x00,0x84,0x26,0x25,0x14, -0x26,0x26,0x25,0x18,0x26,0x01,0x26,0x0a,0x25,0x25,0x10,0x28,0x1c,0x1f,0x1f,0x84,0x10,0x13,0x14,0x10,0x10,0x13,0x18,0x84,0x17,0x17,0x13,0x08,0x13,0x28,0x13,0x38,0x13,0x03,0x13,0x1f,0x10,0x01,0x10,0x1c,0x13,0x00,0x26,0x0f,0x17,0x00,0x25,0x1f,0x22,0x95,0x0d,0x06,0x02,0x07,0x07,0x10,0x0a,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33, -0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x3f,0x3f,0xc4,0x33,0x33,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0xed,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22, -0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4c,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x86,0x4a,0x30,0x9f,0x08,0x97,0x14,0x01,0x14,0xa4,0x14,0x01,0x14,0x9c,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f, -0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x26,0x26,0x02,0xc5,0x5e,0x53,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x5b,0x5f,0xfd,0x18,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x00,0x02,0x00,0x42,0xfe,0x1f,0x04,0x25,0x04,0x58,0x00,0x27,0x00,0x39,0x00,0xab,0x40,0x64,0x86,0x0e,0x01,0x75,0x0e,0x01,0x88,0x04,0x01,0x03,0x01,0x01, -0x84,0x39,0x37,0x14,0x39,0x39,0x37,0x18,0x39,0x01,0x09,0x39,0x01,0x39,0x37,0x12,0x13,0x13,0x37,0x37,0x18,0x3b,0x23,0x0a,0x2d,0x2f,0x2f,0x84,0x18,0x1b,0x14,0x18,0x18,0x1b,0x20,0x1f,0x1f,0x1b,0x09,0x1b,0x01,0x1b,0x1f,0x18,0x3f,0x18,0x02,0x18,0x39,0x2d,0x2a,0x95,0x26,0x1f,0x1b,0x20,0x20,0x23,0x01,0x26,0x10,0x5a,0x13,0x6a, -0x13,0x9a,0x13,0x03,0x13,0x15,0x12,0x12,0x10,0x95,0x15,0x1c,0x37,0x2f,0x32,0x95,0x18,0x0a,0x79,0x03,0x01,0x03,0x08,0x16,0x00,0x3f,0x33,0x5d,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f,0x33,0x33,0x33,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d, -0x10,0xc4,0x01,0x33,0x32,0x11,0x12,0x39,0x18,0x2f,0x33,0x2f,0x33,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16, -0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x04,0x25,0x08,0x6c,0x1f,0xae,0xfe,0x8a,0x53,0x21,0x08,0x0b,0x02,0x5a,0x53,0xb6,0xcd,0xb2,0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x9f,0xa7,0x33,0x0d,0x13, -0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfe,0x03,0x94,0x2c,0x5f,0x15,0x01,0x18,0x08,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x85,0x9a,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x25,0x3f,0x6b,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20, -0x0f,0x00,0x00,0x01,0x00,0x5b,0xfe,0x25,0x06,0xea,0x05,0xec,0x00,0x42,0x00,0xb9,0x40,0x64,0x31,0x33,0x33,0x84,0x2f,0x30,0x14,0x2f,0x2f,0x30,0x30,0x2f,0x26,0x29,0x29,0x84,0x1a,0x1d,0x14,0x1a,0x1a,0x1d,0x22,0x21,0x21,0x1d,0x1d,0x5f,0x1a,0x8f,0x1a,0x02,0x1a,0x2f,0x40,0x84,0x3f,0x3f,0x0e,0x0f,0x39,0x3a,0x3b,0x04,0x01,0x01, -0x84,0x3b,0x0d,0x14,0x3b,0x3b,0x0d,0x68,0x3b,0x01,0x3b,0x0d,0x08,0x84,0x09,0x09,0x60,0x0d,0x01,0x0d,0x14,0x2f,0x3f,0x00,0x26,0x21,0x1d,0x22,0x22,0x3b,0x31,0x01,0x30,0x0f,0x39,0x33,0x36,0x95,0x12,0x2f,0x29,0x2c,0x95,0x1a,0x14,0x17,0x17,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x33, -0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x3f,0x33,0xc4,0x33,0x33,0x2f,0x33,0x33,0x33,0x3f,0x01,0x2f,0x33,0xcc,0x5d,0x32,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x01,0x33,0x18,0x2f,0xed,0x10,0xcc,0x5d,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33, -0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x33,0x03,0x06,0x15,0x14,0x33, -0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x06,0xea,0x13,0xb2,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x05,0xfe,0x83,0x4a,0x2a,0x84,0x17,0xfe,0x71,0x4b,0x29,0x9f,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0xa7,0xac,0x03,0x33,0x0d,0x13,0x01,0xa9,0x96,0x14,0x01,0x14, -0xa4,0x14,0x01,0x04,0x66,0x5f,0x5b,0xfc,0xa7,0x52,0x5f,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x19,0x0e,0x61,0x59,0x14,0x6b,0x15,0x85,0x70,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x72,0x02,0xc3,0x5e,0x53,0x14, -0x12,0x01,0x69,0xfe,0x97,0x12,0x00,0x03,0x00,0x5b,0xfe,0x25,0x06,0xbe,0x04,0x58,0x00,0x32,0x00,0x3e,0x00,0x50,0x01,0x06,0x40,0x94,0x25,0x2e,0x01,0x06,0x2e,0x16,0x2e,0x02,0x2e,0x38,0x18,0x4d,0x4e,0x4f,0x50,0x17,0x50,0x0d,0x38,0x0e,0x38,0x0e,0x0e,0x84,0x17,0x50,0x14,0x17,0x17,0x50,0x50,0x17,0x16,0x29,0x26,0x29,0x02,0x07, -0x29,0x01,0x29,0x44,0x46,0x46,0x84,0x1e,0x21,0x14,0x1e,0x1e,0x21,0x26,0x25,0x25,0x21,0x21,0x1e,0x17,0x12,0x84,0x13,0x13,0x17,0x09,0x08,0x08,0x04,0x3b,0x3c,0x3d,0x3e,0x04,0x01,0x01,0x84,0x3e,0x0c,0x14,0x3e,0x3e,0x0c,0x3e,0x20,0x0c,0x50,0x0c,0x02,0x0c,0x17,0x50,0x44,0x41,0x95,0x2c,0x3e,0x38,0x35,0x95,0x2e,0x01,0x31,0x31, -0x2c,0x25,0x21,0x26,0x26,0x29,0x2c,0x10,0x4d,0x46,0x39,0x49,0x95,0x1b,0x7b,0x3b,0x01,0x3b,0xa9,0x0c,0x01,0x9a,0x0c,0x01,0x7b,0x0c,0x8b,0x0c,0x02,0x0c,0x96,0x08,0x01,0x08,0x04,0x09,0x09,0x1e,0x18,0x17,0x0e,0x0d,0x1b,0x16,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x33,0x5d,0x33,0x5d,0x5d,0x5d,0x33, -0x5d,0x10,0xed,0x32,0x32,0x32,0x3f,0x33,0x33,0x2f,0x33,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x01,0x2f,0xcd,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0xc4,0x05,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x2f,0xed,0x10,0xcc,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4, -0x01,0x32,0x5d,0x5d,0x11,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0x10,0x87,0x0e,0xc4,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36, -0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x25,0x36,0x37,0x13,0x36,0x25,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xbe,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfd,0xf4,0x03,0x01,0x0c,0xa4, -0x0c,0x01,0x17,0xfe,0x81,0x50,0x24,0x9f,0x08,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x85,0x16,0x01,0x8a,0x4e,0x26,0x9f,0xa7,0x33,0x0e,0x12,0xfe,0x58,0x8c,0x01,0xd5,0x36,0x0b,0x6e,0x03,0xfd,0x67,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfd, -0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21,0x3a,0x77,0x29,0x1c,0x09,0x1d,0xfe,0xa9,0x01,0x39,0x1a,0x21,0x5d,0x6b,0x65,0x15,0xb4,0x27,0x25,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x7f,0x6a,0x15,0xc0,0x35,0x05,0x73,0xfd,0x58,0x6d,0x0d,0x34,0x02,0x20,0x0f,0x0e,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f, -0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x01,0x00,0x71,0xfe,0x25,0x04,0x75,0x05,0xec,0x00,0x39,0x00,0xb1,0x40,0x63,0x30,0x84,0x2f,0x2f,0x2b,0x21,0x1e,0x84,0x22,0x2f,0x25,0x01,0x25,0x25,0x2b,0x03,0x00,0x84,0x04,0x7f,0x07,0x01,0x07,0x07,0x34,0x2a,0x19,0x18,0x17,0x2b,0x17,0x0d,0x0c,0x35,0x34,0x0e,0x34,0x0e,0x0e,0x84, -0x17,0x2b,0x14,0x17,0x17,0x2b,0x89,0x2b,0x01,0xf8,0x2b,0x01,0x99,0x2b,0x01,0x85,0x2b,0x01,0x66,0x2b,0x01,0x08,0x2b,0x01,0x2b,0x17,0x12,0x84,0x13,0x13,0x17,0x2a,0x35,0x38,0x27,0x95,0x0c,0x19,0x09,0x1c,0x1c,0x03,0x09,0x95,0x38,0x34,0x2b,0x38,0x22,0x22,0x38,0x10,0x2f,0x00,0x0e,0x17,0x15,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x3f, -0x3f,0x33,0x2f,0x11,0x33,0x33,0x10,0xfd,0xcc,0x32,0x2f,0x12,0x39,0x39,0xed,0x11,0x39,0x39,0x01,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x5d,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0x33,0xed, -0x32,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x37,0x33,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x37,0x36,0x33, -0x32,0x04,0x75,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xad,0x9f,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x13,0x92,0x9b,0x44,0x30,0x9f,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xd0,0x15,0x01,0x14,0xa4,0x14,0x01,0x0a,0x78,0x44,0x30,0x9f,0x03,0x64,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x36,0xfd,0x01,0x52,0x5f,0x09,0x1d,0xfe,0xa9, -0x01,0x4d,0x19,0x0e,0x5d,0x5d,0x02,0xc9,0x30,0x15,0xb4,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x41,0x67,0x4e,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x44,0x44,0x25,0x15,0x00,0x01,0x00,0x28,0xff,0xa7,0x04,0x25,0x04,0x18,0x00,0x21,0x00,0x84,0x40,0x4a,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10, -0x0d,0x0d,0x18,0x23,0x1b,0x1a,0x1a,0x19,0x16,0x1d,0x1c,0x17,0x1c,0x17,0x17,0x84,0x18,0x19,0x14,0x18,0x19,0x88,0x19,0x01,0x79,0x19,0x01,0x18,0x19,0x01,0x19,0x1f,0x18,0x3f,0x18,0x02,0x18,0x16,0x10,0x13,0x95,0x1d,0x01,0x20,0x10,0x19,0x95,0x1c,0x0f,0x0d,0x96,0x08,0x01,0x08,0x04,0x09,0x09,0x17,0x18,0x15,0x00,0x3f,0xc4,0x33, -0x2f,0x33,0x33,0x5d,0x33,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26, -0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x0a,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46, -0x85,0x5c,0x28,0x4d,0x0c,0x31,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x00,0x00,0x01,0x00,0x28,0xfe,0x25,0x04,0x4e,0x04,0x00,0x00,0x21,0x00,0x7e,0x40,0x45,0x20,0x0d,0x0c,0x0b,0x00,0x02,0x02,0x84,0x0b,0x21,0x14,0x0b,0x0b,0x21,0xa8,0x21,0x01,0x21,0x0b,0x06,0x84,0x07,0x07,0x0b,0x0b,0x13, -0x23,0x18,0x1a,0x1a,0x84,0x13,0x15,0x14,0x13,0x13,0x15,0x17,0x16,0x16,0x15,0xa9,0x15,0xb9,0x15,0x02,0x15,0x1f,0x13,0x01,0x13,0x00,0x21,0x15,0x95,0x18,0x0f,0x20,0x1a,0x1d,0x95,0x13,0x0d,0x0b,0x02,0x10,0x16,0x07,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33, -0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33, -0x32,0x37,0x25,0x13,0x04,0x4e,0xc5,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x10,0x06,0xfe,0x84,0x48,0x2c,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x53,0x51,0x60,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x19,0x0e,0x73,0x47,0x19,0x70,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e,0x0f,0x35, -0x05,0x73,0x03,0x16,0x00,0x01,0x00,0x5b,0xfe,0x1f,0x04,0x4e,0x04,0x00,0x00,0x2c,0x00,0x8e,0x40,0x52,0x75,0x12,0x85,0x12,0x02,0x85,0x11,0x01,0x76,0x11,0x01,0x98,0x0c,0x01,0x95,0x08,0x01,0x95,0x07,0x01,0x2b,0x1a,0x02,0x00,0x00,0x84,0x2c,0x1a,0x14,0x2c,0x2c,0x1a,0x2c,0x1a,0x06,0x84,0x17,0x17,0x1a,0x1a,0x20,0x2e,0x23,0x25, -0x25,0x84,0x20,0x22,0x14,0x20,0x20,0x22,0x22,0x20,0x0f,0x84,0x0e,0x0e,0x1f,0x20,0x01,0x20,0x00,0x2c,0x23,0x22,0x0f,0x2b,0x25,0x28,0x95,0x0e,0x0f,0x20,0x1a,0x02,0x1d,0x16,0x13,0x95,0x0a,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x33,0xce,0x32,0xed,0x32,0x32,0x3f,0xc4,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x87,0x10, -0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x05,0x06,0x23,0x22,0x35, -0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4e,0xb8,0x02,0x1a,0x9f,0x77,0xb5,0x9a,0x6f,0x61,0x12,0x9d,0x08,0x41,0x4c,0x67,0x5d,0x4a,0x61,0x19,0xfe,0x7f,0x48,0x2c,0x9f,0x08,0xa8,0xa8,0xae,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x95,0x0a,0x0c,0x32,0xb0,0x43,0xae,0x51,0x3c,0x60,0x54, -0x6c,0x19,0x39,0x36,0x40,0x23,0x2f,0x5b,0x2d,0x9f,0x4a,0x70,0x15,0xb4,0x26,0x26,0x03,0x19,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0x00,0x00,0x01,0x00,0x2f,0xfe,0x25,0x04,0x25,0x05,0xec,0x00,0x33,0x00,0x97,0x40,0x52,0x96,0x07,0x01,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x0d,0x0d,0x21, -0x35,0x29,0x84,0x28,0x28,0x24,0x17,0x16,0x2f,0x2e,0x2d,0x18,0x2d,0x18,0x18,0x84,0x21,0x24,0x14,0x21,0x21,0x24,0xe6,0x24,0x01,0xd7,0x24,0x01,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x1f,0x21,0x3f,0x21,0x02,0x21,0x16,0x10,0x13,0x95,0x2f,0x2d,0x24,0x01,0x32,0x10,0x28,0x00,0x0d,0x08,0x04,0x09,0x09,0x18,0x21,0x15,0x1d,0x1b,0x00,0x3f, -0x3f,0x33,0x33,0x2f,0x33,0x33,0x33,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30, -0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07, -0x86,0x03,0x33,0x0d,0x13,0xfe,0x54,0x97,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x14,0xb8,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e,0x0f,0x35,0x05,0x73,0xfd,0x3e,0x62,0x4f,0x09,0x1d,0xfe,0xa9,0x01,0x4b,0x18, -0x11,0x5d,0x5d,0x03,0x59,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x00,0x01,0x00,0x42,0xfe,0x1f,0x04,0x25,0x04,0x58,0x00,0x34,0x00,0xa5,0x40,0x5f,0x9a,0x23,0x01,0x76,0x1b,0x86,0x1b,0x02,0x95,0x07,0x01,0x77,0x07,0x87,0x07,0x02,0x1f,0x20,0x20,0x50,0x20,0x60,0x20,0x03,0x20,0x20,0x09,0x08, -0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x0d,0x0d,0x25,0x36,0x2d,0x2c,0x2c,0x28,0x30,0x16,0x18,0x18,0x84,0x25,0x28,0x14,0x25,0x28,0x28,0x1f,0x25,0x01,0x25,0x2c,0x28,0x2d,0x2d,0x16,0x10,0x13,0x95,0x30,0x01,0x33,0x10,0x9a,0x20,0x01,0x20,0x22,0x1f,0x1f,0x1d,0x95,0x22,0x1c,0x08,0x09,0x09,0x25,0x18,0x0d, -0x04,0x0a,0x15,0x00,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x01,0x2f,0x5d,0x33,0x87,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x11,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x32,0x2f,0x5d, -0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81, -0x04,0x15,0x63,0x53,0x90,0x3f,0x0a,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0x7a,0x23,0x5a,0x53,0xb6,0xcd,0xb2,0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x83,0x05,0x15,0x63,0x53,0x90,0x37,0x06,0x01,0x7f,0x4b,0x29,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x0c,0x31,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72, -0xfd,0xba,0xa7,0x61,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x85,0x9a,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x23,0x41,0x6b,0x15,0x00,0x00,0x02,0x00,0x59,0xff,0xe7,0x06,0xbc,0x05,0xec,0x00,0x2a,0x00,0x36,0x00,0xb6,0x40,0x64,0x20,0x84,0x1f,0x1f,0x1b,0x1a,0x2b,0x36,0x0f,0x0e,0x1b,0x0e,0x0c,0x26,0x25,0x24,0x0d,0x24, -0x0d,0x0d,0x84,0x0e,0x1b,0x14,0x0e,0x0e,0x1b,0x88,0x1b,0x01,0x79,0x1b,0x01,0x1b,0x0e,0x2d,0x30,0x30,0x84,0x15,0x18,0x14,0x15,0x18,0x78,0x18,0x01,0x69,0x18,0x01,0x08,0x18,0x01,0x18,0x15,0x0e,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0x06,0x04,0x0e,0x2d,0x2b,0x95,0x24,0x1b,0x18,0x1a,0x1a,0x0c,0x06,0x09,0x95,0x26, -0x01,0x29,0x10,0x1f,0x00,0x36,0x30,0x33,0x95,0x15,0x0f,0x12,0x16,0x03,0x04,0x0d,0x0e,0x15,0x00,0x3f,0xc4,0xd4,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x33,0xed,0x32,0x01,0x2f,0xcc,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xdc,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d, -0x10,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x10,0x87,0xc4,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x31,0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x37,0x25,0x36,0x35,0x34, -0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x05,0x05,0x06,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x06,0xbc,0x08,0xa5,0xa7,0xaa,0x03,0x33,0x0d,0x13,0xfe,0x54,0xa8,0xa6,0x16,0xfe,0x8e,0x4a,0x2a,0x9f,0x08,0x69,0x20,0xad,0x02,0x0b,0x03,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f, -0xfc,0xd0,0xfe,0x23,0x37,0x0a,0x6b,0x03,0x33,0x0e,0x12,0x01,0xa7,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfc,0xeb,0x65,0x69,0x15,0xb4,0x27,0x25,0x01,0xeb,0x94,0x2c,0x86,0x23,0x22,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x87,0x7e,0x0e,0x33,0xfd,0xf2,0x0f,0x0e,0x35,0x05, -0x72,0x00,0x00,0x01,0x00,0x3f,0xfe,0x25,0x06,0xc0,0x04,0x58,0x00,0x35,0x00,0xae,0x40,0x61,0x29,0x28,0x28,0x24,0x15,0x2c,0x01,0x06,0x2c,0x01,0x2c,0x16,0x18,0x18,0x84,0x21,0x24,0x14,0x21,0x21,0x24,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x5f,0x21,0x01,0x21,0x0e,0x06,0x31,0x16,0x31,0x02,0x31,0x0d,0x0c,0x0c,0x84,0x10,0x0e,0x14,0x10, -0x10,0x0e,0x10,0x0e,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0x06,0x50,0x04,0x80,0x04,0x02,0x04,0x0e,0x0c,0x06,0x09,0x95,0x31,0x01,0x34,0x34,0x2f,0x28,0x24,0x29,0x29,0x16,0x10,0x13,0x95,0x2c,0x2f,0x10,0x1d,0x1b,0x03,0x04,0x21,0x18,0x0d,0x0e,0x15,0x00,0x3f,0xc4,0x33,0x33,0xd4,0xc4,0x3f,0x3f,0x33,0xed,0x32,0x32, -0x33,0x2f,0x33,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x33,0x5d,0x18,0x10,0xcc,0x5d,0x32,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x5d,0x5d,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x01,0x14, -0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x06,0xc0,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0d,0x13,0xfe,0x56, -0xa5,0xa3,0xa7,0x03,0x33,0x0d,0x13,0xfe,0x57,0x87,0x18,0x01,0x14,0xa4,0x14,0x01,0x14,0x93,0x05,0x15,0x63,0x53,0x90,0x37,0x06,0x01,0x7f,0x4b,0x29,0x84,0x17,0x01,0x8c,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfc,0xeb,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x72,0xfd,0x80,0x72,0x2d,0x37,0x14, -0xfe,0x79,0x01,0x87,0x14,0x34,0x45,0x5e,0x02,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x23,0x41,0x6b,0x15,0x86,0x71,0x15,0x00,0x01,0x00,0x21,0xfe,0x1f,0x04,0x80,0x04,0x18,0x00,0x44,0x00,0xd9,0x40,0x84,0x97,0x44,0x01,0x7a,0x2c,0x01,0x69,0x2c,0x01,0x9a,0x28,0x01,0x96,0x24,0x01,0x77,0x24,0x87,0x24,0x02,0x46,0x17,0x56,0x17, -0x02,0x85,0x13,0x01,0x36,0x28,0x01,0x01,0x00,0x00,0x42,0x84,0x04,0x3d,0x84,0x09,0x09,0x04,0x04,0x15,0x83,0x2a,0x2a,0x33,0x46,0x36,0x35,0x35,0x34,0x0f,0x0e,0x38,0x37,0x32,0x67,0x32,0x77,0x32,0x02,0x37,0x32,0x32,0x84,0x33,0x34,0x14,0x33,0x33,0x34,0x47,0x34,0x77,0x34,0x97,0x34,0x03,0x34,0x33,0x20,0x22,0x84,0x1f,0x1d,0x1d, -0x4f,0x33,0x5f,0x33,0x02,0x33,0x20,0x1f,0x0f,0x11,0x32,0x33,0x33,0x26,0x2e,0x95,0x00,0x01,0x09,0x01,0x19,0x01,0x29,0x01,0x03,0x11,0x01,0x11,0x01,0x26,0x0e,0x0b,0x95,0x38,0x3b,0x10,0x34,0x95,0x37,0x0f,0x26,0x95,0x19,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0xed,0x11,0x39, -0x2f,0xc4,0x12,0x39,0xce,0x32,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x87,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x33,0x2f,0x33,0x2f,0xed,0x10,0xed,0x32,0x2f,0x33,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01, -0x07,0x27,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x36,0x33,0x32,0x17,0x16,0x15,0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x07, -0x06,0x15,0x14,0x17,0x04,0x80,0x53,0x90,0x3f,0x0a,0x13,0x03,0x33,0x0d,0x13,0xfe,0x57,0x5e,0x81,0xca,0xcd,0x74,0x62,0xb8,0x9a,0xf1,0xc7,0x78,0x6f,0x3b,0x90,0x24,0x4b,0x52,0x87,0x8e,0x6b,0x87,0x40,0x4e,0x8c,0x64,0x5f,0x70,0x2d,0xab,0xa8,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x11,0x04,0x15,0x02,0x47,0x85, -0x5c,0x28,0x4d,0x06,0x37,0x6b,0x10,0x0d,0x35,0x05,0x72,0xfe,0x3f,0x4a,0x7b,0x69,0x8f,0xfe,0xf2,0x8a,0x75,0x50,0x4b,0x71,0x53,0x52,0x37,0x38,0x27,0x3c,0x29,0x2c,0x52,0x69,0xc4,0x56,0x43,0x54,0x2a,0x31,0x56,0x03,0x11,0x8b,0x67,0x6a,0x15,0xb4,0x28,0x24,0x49,0x11,0x0b,0x17,0x0f,0x00,0x00,0x01,0x00,0x42,0xfe,0x1f,0x04,0x2e, -0x04,0x58,0x00,0x30,0x00,0xbb,0x40,0x6b,0x18,0x25,0x01,0x99,0x2c,0x01,0x88,0x2c,0x01,0x9a,0x0f,0x01,0x77,0x0a,0x87,0x0a,0x02,0x2e,0x2d,0x2d,0x29,0x0e,0x0f,0x0f,0x04,0x01,0x01,0x84,0x29,0x26,0x14,0x29,0x29,0x26,0x18,0x29,0x01,0x09,0x29,0x01,0x29,0x26,0x26,0x14,0x32,0x1c,0x1b,0x1b,0x17,0x21,0x22,0x23,0x24,0x06,0x20,0x20, -0x06,0x06,0x84,0x14,0x17,0x14,0x14,0x17,0x17,0x1f,0x14,0x01,0x14,0x2d,0x2e,0x2e,0x1b,0x1c,0x1c,0x29,0x20,0x17,0x01,0x1d,0x0f,0x7a,0x0f,0x01,0x5b,0x0f,0x6b,0x0f,0x02,0x0f,0x11,0x0e,0x0e,0x0c,0x95,0x11,0x1c,0x26,0x24,0x95,0x14,0x79,0x04,0x01,0x04,0x06,0x16,0x00,0x3f,0x33,0x5d,0x33,0xed,0x32,0x3f,0xed,0x32,0x2f,0x12,0x39, -0x5d,0x5d,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0x0e,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01, -0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x07,0x25,0x36,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x04,0x2e,0x06,0x73,0x1f,0xae,0xfd,0xfe,0x01,0x5a,0x53,0xb6,0xcd,0xb2, -0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x84,0x03,0x15,0x63,0x53,0x90,0x3f,0x07,0x85,0x0c,0x07,0x01,0xdb,0x37,0x0a,0x70,0x03,0x15,0x63,0x53,0x90,0x3f,0x03,0x87,0x20,0x1d,0xfd,0xdc,0x95,0x2b,0x7f,0x12,0x0d,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x86,0x99,0x02,0x64,0x10,0x0c,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1c,0x21,0xfd,0x86, -0x38,0x2d,0x7a,0x0e,0x33,0x02,0x25,0x0f,0x0d,0x17,0x0f,0x46,0x85,0x5c,0x28,0x00,0x00,0x02,0xff,0x8a,0xfe,0x25,0x04,0x5a,0x04,0xb5,0x00,0x15,0x00,0x18,0x00,0x95,0x40,0x5d,0x27,0x01,0x01,0x06,0x05,0x18,0x16,0x08,0x17,0x02,0x09,0x16,0x08,0x0a,0x03,0x04,0x00,0x05,0x0a,0x03,0x01,0x00,0x05,0x17,0x02,0x16,0x05,0x00,0x05,0x84, -0x08,0x16,0x14,0x08,0x08,0x16,0x17,0x03,0x0a,0x03,0x84,0x02,0x17,0x14,0x02,0x02,0x17,0x00,0x00,0x0f,0x02,0x4f,0x02,0x6f,0x02,0x7f,0x02,0xbf,0x02,0x05,0x02,0x02,0x08,0x1a,0x10,0x12,0x84,0x0f,0x0d,0x0d,0x0a,0x0a,0x07,0x0f,0x08,0x01,0x08,0x00,0x15,0x17,0x0a,0x16,0x95,0x10,0x15,0x0f,0x07,0x1b,0x08,0x05,0x03,0x02,0x15,0x00, -0x3f,0xc4,0x33,0x33,0x3f,0x3f,0xce,0xfd,0xc4,0xc4,0x12,0x39,0x01,0x2f,0x5d,0x33,0x33,0x2f,0x33,0x2f,0x33,0xed,0x32,0x11,0x12,0x39,0x2f,0x5d,0x33,0x2f,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x87,0x18,0x10,0x2b,0x87,0x7d,0xc4,0x0f,0x0f,0x0f,0x0f,0x11,0x01,0x33,0x31,0x30,0x5d,0x01,0x01,0x13,0x23,0x03,0x00,0x03,0x23,0x12,0x01,0x03, -0x23,0x22,0x37,0x36,0x37,0x33,0x06,0x15,0x14,0x33,0x21,0x05,0x21,0x17,0x04,0x5a,0xfe,0x68,0xe6,0xb5,0xa5,0xfe,0x8d,0x8e,0xc3,0xc9,0x01,0xb5,0xaa,0x86,0x96,0x06,0x02,0x1d,0xa7,0x1f,0x29,0x03,0x42,0xfe,0xf5,0xfe,0xc4,0x6b,0x03,0xd1,0xfe,0x24,0xfe,0x0b,0x01,0x67,0xfe,0x2f,0xfe,0x8f,0x01,0xcd,0x02,0x0d,0x01,0x75,0x94,0x2f, -0x7e,0x78,0x15,0x28,0x8c,0xea,0x00,0x01,0x00,0x31,0xff,0xa7,0x06,0xe6,0x04,0x58,0x00,0x37,0x00,0xb7,0x40,0x65,0x89,0x20,0x01,0x97,0x05,0x01,0x22,0x70,0x21,0x01,0x21,0x21,0x1d,0x25,0x19,0x1a,0x1a,0x84,0x1b,0x1d,0x14,0x1b,0x1d,0x89,0x1d,0x01,0x1d,0x1b,0x10,0x2b,0x2e,0x2e,0x84,0x10,0x13,0x14,0x10,0x10,0x13,0x13,0x10,0x07, -0x06,0x06,0x02,0x36,0x35,0x0a,0x02,0x00,0x00,0x84,0x37,0x0a,0x14,0x37,0x37,0x0a,0x37,0x20,0x0a,0x01,0x0a,0x10,0x00,0x37,0x0f,0x21,0x1d,0x22,0x22,0x19,0x13,0x16,0x95,0x2b,0x25,0x28,0x10,0x1a,0x1b,0x15,0x29,0x35,0x01,0x35,0x2e,0x31,0x95,0x0d,0x06,0x02,0x07,0x07,0x10,0x28,0x0a,0x01,0x0a,0x0d,0x16,0x00,0x3f,0x33,0x5d,0x33, -0x33,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x5d,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x3f,0xc4,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xdc,0x32,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x01, -0x32,0x11,0x33,0x18,0x2f,0x5d,0x33,0x31,0x30,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25, -0x36,0x37,0x13,0x06,0xe6,0xb1,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x7f,0x03,0x33,0x0e,0x13,0xfe,0x58,0xa6,0xab,0xb5,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7d,0x4b,0x2a,0x9f,0x0a,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x94,0x04,0x00,0xfc,0xb4,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21, -0x3a,0x62,0x15,0xb4,0x26,0x26,0x02,0x54,0x0e,0x0f,0x35,0x05,0x72,0xfc,0xea,0x03,0x4b,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x1e,0x30,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0xe5,0x00,0x01,0x00,0x2f,0xfe,0x25,0x04,0xbe,0x05,0xec,0x00,0x2d,0x00,0x77,0x40,0x40,0x00,0x01,0x37,0x29,0x97,0x29, -0x02,0x29,0x2b,0x84,0x06,0x04,0x04,0x15,0x2f,0x1d,0x84,0x1c,0x1c,0x18,0x22,0x23,0x0a,0x0b,0x0c,0x21,0x21,0x0c,0x0c,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x69,0x18,0x01,0x18,0x15,0x10,0x84,0x11,0x11,0x15,0x02,0x95,0x2d,0x0a,0x07,0x95,0x23,0x21,0x18,0x26,0x10,0x1c,0x00,0x0c,0x15,0x15,0x11,0x1b,0x00,0x3f,0x3f,0x33,0x3f,0x3f, -0x33,0x33,0x33,0xed,0x32,0xdc,0xed,0x01,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0x5d,0xcc,0x32,0x31,0x30,0x01,0x07,0x23,0x22,0x27,0x27,0x26,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13, -0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x17,0x16,0x17,0x17,0x16,0x33,0x04,0xbe,0x1d,0xd3,0x60,0x22,0x38,0x0d,0x2a,0x10,0x10,0xfe,0xc5,0x9a,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x14,0xb8,0x13,0x01,0x14,0xa4,0x14,0x01,0x0f,0x03,0x01,0x04,0x42,0x32,0x4c, -0x27,0x19,0x17,0x32,0x08,0x19,0x02,0x7f,0x8b,0x87,0xde,0x34,0x05,0x63,0xfd,0x2e,0x62,0x4f,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x18,0x0f,0x5d,0x5d,0x03,0x59,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x3e,0x64,0x14,0x53,0x15,0x36,0x23,0x5a,0xc7,0x1f,0x00,0x01,0x00,0x35,0xff,0xe7,0x03,0xfe,0x04,0x00,0x00,0x1b,0x00,0x58, -0x40,0x35,0x89,0x0b,0x01,0x95,0x08,0x01,0x28,0x05,0x01,0x95,0x02,0x01,0x37,0x02,0x01,0x24,0x02,0x01,0x00,0x83,0x20,0x0d,0x01,0x0d,0x0d,0x1d,0x15,0x17,0x84,0x12,0x07,0x06,0x06,0x14,0x12,0x0f,0x95,0x1a,0x15,0x0f,0x08,0x06,0x18,0x06,0x02,0x06,0x04,0x07,0x07,0x09,0x95,0x04,0x16,0x00,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f, -0xde,0xed,0x01,0x2f,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x06,0x21,0x22,0x27,0x37,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x23,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x21,0x20,0x03,0xfe,0x9c,0xa5,0xfe,0xe9,0xe9,0x88,0x65,0x81,0x9a,0xbf, -0x77,0x6b,0xbb,0xfe,0xc8,0x90,0x0e,0xa3,0x0a,0x29,0x01,0x2c,0x01,0x2f,0x02,0x41,0xfe,0xfe,0xa7,0xb1,0x8b,0x7f,0x7e,0x91,0x84,0xb5,0xde,0x94,0x1e,0x33,0x25,0x0c,0x28,0x00,0x00,0x01,0x00,0x46,0xfe,0x29,0x04,0x3c,0x05,0xec,0x00,0x33,0x00,0x94,0x40,0x4e,0x9a,0x1b,0x01,0x31,0x84,0x30,0x30,0x2c,0x2b,0x2a,0x0f,0x0e,0x0d,0x04, -0x01,0x01,0x84,0x2c,0x0d,0x14,0x2c,0x2c,0x0d,0x2c,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x15,0x35,0x21,0x24,0x24,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x1c,0x1c,0x18,0x08,0x18,0x01,0x18,0x1f,0x15,0x01,0x15,0x30,0x00,0x1c,0x1d,0x1d,0x2c,0x21,0x18,0x01,0x1e,0x0f,0x2a,0x24,0x27,0x95,0x15,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b, -0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x3f,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f, -0xed,0x31,0x30,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x04,0x3c,0x14,0xb8,0x13,0x01,0x10,0xa4, -0x10,0x01,0x14,0x03,0xfe,0x89,0x4a,0x2a,0x9f,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xac,0x97,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x04,0x66,0x5d,0x5d,0xfc,0xa7,0x58,0x59,0x11,0x15,0xfe,0xad,0x01,0x53,0x15,0x08,0x35,0x85,0x14,0x6b,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85, -0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73,0x02,0xc2,0x62,0x4f,0x08,0x1e,0x01,0x69,0xfe,0x97,0x1e,0x00,0x00,0x01,0x00,0x28,0xfe,0x25,0x04,0x4e,0x04,0x00,0x00,0x27,0x00,0x6f,0x40,0x3c,0x02,0x00,0x00,0x84,0x27,0x25,0x14,0x27,0x27,0x25,0x27,0x25,0x0f,0x1c,0x1e,0x1e,0x84,0x17,0x19,0x14,0x17,0x17,0x19,0x1b, -0x1a,0x1a,0x19,0x19,0x17,0x0f,0x0b,0x84,0x0c,0x0c,0x06,0x08,0x84,0x11,0x0f,0x00,0x27,0x19,0x95,0x1c,0x0f,0x67,0x25,0x01,0x25,0x1e,0x21,0x95,0x17,0x11,0x06,0x02,0x14,0x16,0x0c,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x5d,0x3f,0xed,0xd4,0xc4,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x10,0xcc,0x32,0x11,0x33, -0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xcd,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x03,0x06,0x07,0x06,0x07,0x07,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x04,0x4e,0x99, -0x14,0x42,0x27,0x50,0x7e,0x06,0x01,0x14,0xa4,0x14,0x01,0x01,0x53,0x4b,0x29,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03,0x33,0x0f,0x11,0x01,0x7b,0x37,0x0a,0x96,0x04,0x00,0xfd,0x26,0x5d,0x31,0x1c,0x16,0x23,0x28,0x24,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x0d,0x12,0x17,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e, -0x0f,0x35,0x05,0x6e,0x10,0x31,0x02,0xda,0x00,0x02,0x00,0x59,0xff,0xe7,0x07,0x24,0x06,0x04,0x00,0x35,0x00,0x43,0x00,0xcc,0x40,0x71,0x43,0x36,0x2e,0x2f,0x30,0x42,0x30,0x0e,0x0f,0x20,0x21,0x22,0x0d,0x86,0x22,0x01,0x65,0x22,0x01,0x0d,0x22,0x22,0x84,0x42,0x30,0x14,0x42,0x42,0x30,0x3a,0x30,0x01,0x08,0x30,0x18,0x30,0x02,0x30, -0x42,0x38,0x3b,0x3b,0x84,0x29,0x2c,0x14,0x29,0x2c,0x78,0x2c,0x01,0x6a,0x2c,0x01,0x08,0x2c,0x01,0x2c,0x29,0x42,0x03,0x00,0x84,0x07,0x17,0x15,0x15,0x84,0x1a,0x18,0x14,0x1a,0x1a,0x18,0x04,0x07,0x07,0x1a,0x1a,0x18,0x42,0x0d,0x09,0x95,0x30,0x34,0x01,0x42,0x3b,0x3e,0x95,0x29,0x22,0x26,0x16,0x17,0x18,0x15,0x38,0x36,0x95,0x2c, -0x2e,0x2e,0x20,0x1a,0x1d,0x95,0x15,0x0f,0x03,0x12,0x10,0x00,0x3f,0xce,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0xed,0x32,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xcc,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x10,0xdc,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d, -0x10,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x5d,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x07,0x03,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x23,0x13,0x36,0x35, -0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x37,0x25,0x37,0x36,0x37,0x25,0x36,0x33,0x32,0x01,0x05,0x06,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x07,0x24,0x08,0x0e,0xa8,0x14,0x03,0x33,0x0d,0x13,0xfe,0x89,0x37,0x0a,0x40,0x01,0x77,0x4a,0x2a,0x9f,0x08,0xa5,0xa7,0xaa, -0x03,0x33,0x0d,0x13,0xfe,0x54,0x6c,0x20,0xae,0xfe,0x90,0x55,0x1f,0x9f,0x08,0x69,0x20,0xad,0x02,0x12,0x25,0x1e,0xaf,0x01,0x76,0x53,0x21,0x9f,0xfc,0x68,0xfe,0x23,0x37,0x0a,0x6b,0x03,0x33,0x0f,0x13,0x01,0x6f,0x35,0x0b,0x05,0x50,0x27,0x25,0x41,0x64,0x0f,0x0e,0x35,0x05,0x63,0x0e,0x33,0xfe,0xc8,0x6b,0x15,0xb4,0x26,0x26,0xfc, -0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfe,0x02,0x95,0x2b,0x5b,0x15,0xb4,0x27,0x25,0x01,0xeb,0x94,0x2c,0x86,0xb8,0x93,0x2d,0x5f,0x15,0xfd,0x8d,0x7e,0x0e,0x33,0xfd,0xf2,0x0f,0x0e,0x35,0x05,0x5f,0x0e,0x33,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x06,0x3a,0x05,0x9a,0x00,0x25,0x00,0x70,0x40,0x4b,0x98,0x21,0x01,0x98,0x20,0x01, -0x3a,0x20,0x01,0x29,0x20,0x01,0x94,0x1c,0x01,0x86,0x1c,0x01,0x25,0x1c,0x35,0x1c,0x02,0x87,0x1b,0x97,0x1b,0x02,0x48,0x14,0x01,0x49,0x13,0x01,0x45,0x0e,0x01,0x57,0x0e,0x01,0x07,0x7e,0x00,0x08,0x01,0x08,0x03,0x0c,0x25,0x7e,0x10,0x23,0x20,0x23,0x30,0x23,0x03,0x23,0x23,0x27,0x18,0x7e,0x16,0x24,0x18,0x03,0x1e,0x91,0x11,0x13, -0x03,0x91,0x0c,0x08,0x12,0x00,0x3f,0xde,0xed,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0xfd,0x32,0x32,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x06,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14, -0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x05,0x25,0x03,0x04,0x83,0x99,0x99,0x47,0x5a,0x1a,0x66,0x8e,0xb1,0x65,0x83,0xd0,0x91,0x4e,0xa8,0x3b,0x6c,0x98,0x5d,0x5a,0x93,0x69,0x39,0xa8,0x02,0x44,0x23,0x40,0x1f,0x03,0x9f,0x9d,0x83,0x83,0x53,0x5c,0x01,0x53,0x7c,0x53,0x29,0x49,0x91,0xda,0x91,0x03,0x6d,0xfc,0x9e,0x6e,0xa6, -0x6e,0x37,0x35,0x6b,0x9f,0x6b,0x03,0x71,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x07,0x05,0xb2,0x00,0x11,0x00,0x7a,0x40,0x51,0x37,0x10,0x01,0xa8,0x10,0xb8,0x10,0x02,0x56,0x10,0x01,0x45,0x10,0x01,0x58,0x0e,0x01,0x4a,0x0e,0x01,0x26,0x05,0x01,0x97,0x05,0xa7,0x05,0x02,0x34,0x05,0x01,0x26,0x05,0x01,0x99,0x03,0x01,0x3a,0x03,0x01, -0xc0,0x08,0x01,0x08,0x00,0x7e,0x9f,0x01,0x01,0x01,0x01,0x13,0x07,0x0a,0x7e,0x8f,0x0c,0x01,0x0c,0x01,0x01,0x0f,0x08,0x91,0xaf,0x0a,0x01,0x9f,0x0a,0xdf,0x0a,0x02,0x0a,0x0a,0x0b,0x04,0x91,0x0f,0x04,0x0b,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x32,0x12,0x39,0x2f,0x5d,0xfd, -0xc6,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x04,0xd5,0xa8,0xfe,0x93,0xfe,0x92,0x03,0xb5,0xfc,0x4b,0xa8,0x02,0x17,0x02,0x14,0x03,0x2a,0x47,0x01,0xaa,0xfe,0x47,0xfe,0xa8,0x98,0xfe,0x8e,0x03,0x6d, -0x02,0x45,0xfd,0xa4,0x00,0x02,0x00,0x5e,0x00,0x00,0x05,0x70,0x05,0xb2,0x00,0x10,0x00,0x19,0x00,0x76,0x40,0x4f,0x26,0x16,0x01,0xa7,0x14,0x01,0x26,0x14,0x01,0x3a,0x12,0x4a,0x12,0x02,0x28,0x12,0x01,0xa8,0x11,0x01,0xa8,0x0d,0x01,0x55,0x0d,0x01,0x3a,0x0a,0x4a,0x0a,0x5a,0x0a,0x03,0x3b,0x06,0x4b,0x06,0x5b,0x06,0x03,0x00,0x00, -0x1b,0x0f,0x01,0x7d,0x18,0x04,0x04,0x1b,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x0f,0x18,0x91,0x01,0xaf,0x04,0x01,0x9f,0x04,0xdf,0x04,0x02,0x04,0x04,0x03,0x13,0x91,0x0b,0x04,0x03,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0x33,0xed,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x39,0x2f,0x31,0x30, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x23,0x11,0x21,0x20,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x11,0x21,0x00,0x26,0x23,0x20,0x03,0x12,0x21,0x21,0x11,0x05,0x70,0xfe,0xfc,0xa8,0xfe,0x9d,0xfe,0xfd,0xff,0x00,0x01,0x19,0x01,0x03,0xe8,0x01,0x0a,0x01,0x04,0xfe,0x54,0xaf,0xa7,0xfe,0xa2,0x0a,0x0a, -0x01,0x63,0x01,0x51,0x01,0x72,0xfe,0x8e,0x01,0x72,0x01,0x2a,0xf0,0x01,0x04,0x01,0x22,0xfe,0xde,0xfe,0xfe,0x78,0x02,0x43,0xdb,0xfe,0x6a,0xfe,0x78,0x01,0x84,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x05,0x94,0x05,0xb2,0x00,0x11,0x00,0x62,0x40,0x3e,0x96,0x0e,0x01,0x35,0x0e,0x01,0x26,0x0e,0x01,0x29,0x0c,0x01,0x98,0x0c,0x01,0x3a, -0x0c,0x01,0x29,0x0c,0x01,0x49,0x03,0x01,0x46,0x03,0x56,0x03,0x02,0xa7,0x01,0x01,0x49,0x01,0x59,0x01,0x02,0x07,0x05,0x08,0x7e,0x0a,0x0a,0x13,0x10,0x7e,0x11,0x11,0x11,0x0d,0x0a,0x06,0x91,0x08,0x08,0x02,0x0a,0x12,0x0d,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f, -0xfd,0x32,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x13,0x10,0x21,0x20,0x11,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x15,0x23,0x78,0x02,0x14,0x02,0x17,0xf1,0xf1,0xa8,0xfe,0x92,0xfe,0x93,0xa8,0x03,0x56,0x02,0x5c,0xfd,0xbb,0xfe,0x9d,0x98,0xfe,0x8e,0x03,0x62,0x01,0xb9,0xfe,0x56, -0x47,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0x07,0x05,0x9a,0x00,0x11,0x00,0x64,0x40,0x3e,0x99,0x0e,0x01,0x3a,0x0e,0x01,0x26,0x0c,0x01,0xa7,0x0c,0x01,0x95,0x0c,0x01,0x34,0x0c,0x01,0x26,0x0c,0x01,0x4a,0x03,0x01,0xa8,0x01,0x01,0x45,0x01,0x01,0x09,0x09,0x13,0x11,0x7e,0x9f,0x10,0x01,0x10,0x10,0x13,0x07,0x0a,0x7e,0x8f,0x04, -0x01,0x04,0x10,0x10,0x02,0x0a,0x91,0x08,0x08,0x02,0x05,0x03,0x0d,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x21,0x15,0x21,0x11, -0x10,0x21,0x20,0x11,0x35,0x33,0x04,0xd5,0xfd,0xec,0xfd,0xe9,0xa8,0x03,0xb5,0xfc,0x4b,0x01,0x6e,0x01,0x6d,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfe,0x8e,0x98,0xfe,0xa8,0xfe,0x47,0x01,0xaa,0x47,0x00,0x01,0x00,0x64,0xff,0x38,0x05,0x44,0x05,0xb2,0x00,0x29,0x00,0x8e,0x40,0x5c,0x55,0x1c,0x01,0x27,0x19,0x01,0x84,0x18, -0x01,0x8c,0x14,0x01,0x99,0x13,0x01,0x24,0x0d,0x01,0x15,0x0d,0x01,0x69,0x09,0x79,0x09,0x02,0x1b,0x09,0x01,0x68,0x08,0x78,0x08,0x02,0x6a,0x04,0x7a,0x04,0x02,0x38,0x04,0x48,0x04,0x02,0x91,0x1d,0x01,0x83,0x1d,0x01,0x54,0x1d,0x01,0x1d,0x00,0x1b,0x7d,0x04,0x02,0x06,0x06,0x23,0x7d,0x24,0x24,0x02,0x2b,0x10,0x7d,0x11,0x11,0x00, -0x7e,0x0f,0x02,0x01,0x02,0x11,0x11,0x04,0x0b,0x91,0x16,0x04,0x1d,0x04,0x91,0x00,0x24,0x02,0x00,0x12,0x00,0x3f,0xdd,0xc4,0x10,0xfd,0xc4,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x33,0x2f,0x12,0x39,0xed,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x21,0x15,0x23,0x11,0x21,0x24,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x01,0x0e,0xaa,0x01,0x99,0x02,0x6f,0x36,0x69,0x9b,0x66,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd8,0x83,0x88,0xdc,0x99,0x53, -0xfe,0x29,0xc5,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xc8,0x01,0x60,0xe6,0x01,0xbb,0x62,0xaf,0x84,0x4d,0x3e,0x6f,0x9b,0x5d,0x81,0xd3,0x96,0x52,0x5b,0xa3,0xe4,0x88,0xfe,0x3d,0xed,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0x00,0x00,0x01,0x00,0xbc,0xff,0x38,0x04,0x83,0x05,0x9a,0x00,0x13,0x00,0x2d,0x40,0x17,0x12,0x12, -0x06,0x7e,0x07,0x07,0x0d,0x15,0x10,0x13,0x7e,0x0d,0x12,0x91,0x10,0x10,0x0f,0x03,0x07,0x00,0x91,0x0d,0x12,0x00,0x3f,0xed,0xce,0x3f,0x3f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x25,0x21,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x01,0x64,0x01,0xb3,0x55, -0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xfd,0xca,0xa8,0x03,0x1f,0xfc,0xe1,0x98,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0x05,0x9a,0xfe,0x8e,0x98,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x07,0x05,0xb2,0x00,0x0f,0x00,0x44,0x40,0x29,0xa8,0x0e,0x01,0x45,0x0e,0x01,0x4a,0x0c,0x01,0x25,0x05,0x35,0x05,0x02,0x2a,0x03,0x3a,0x03, -0x02,0x08,0x08,0x11,0x0f,0x7e,0x01,0x01,0x11,0x07,0x7e,0x0b,0x01,0x01,0x0a,0x04,0x91,0x0d,0x04,0x07,0x91,0x0a,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x21,0x15,0x21,0x11,0x10,0x21,0x20,0x11, -0x04,0xd5,0xa8,0xfe,0x93,0xfe,0x92,0x03,0xb5,0xfb,0xa3,0x02,0x17,0x02,0x14,0x03,0x2a,0x47,0x01,0xaa,0xfe,0x47,0xfd,0x36,0x98,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x00,0x02,0x00,0xaa,0xff,0xe8,0x06,0x2b,0x05,0xb2,0x00,0x2c,0x00,0x3d,0x00,0xa0,0x40,0x6c,0x6a,0x3b,0x01,0x67,0x37,0x01,0x64,0x31,0x01,0x56,0x31,0x01,0x79,0x29, -0x01,0x78,0x28,0x01,0x99,0x24,0x01,0x88,0x24,0x01,0x7a,0x24,0x01,0x8a,0x23,0x9a,0x23,0x02,0x7b,0x23,0x01,0x86,0x1f,0x96,0x1f,0x02,0x75,0x1f,0x01,0x76,0x1e,0x01,0x46,0x14,0x01,0x49,0x10,0x01,0x97,0x08,0x01,0x86,0x07,0x96,0x07,0x02,0x25,0x07,0x35,0x07,0x02,0x16,0x07,0x01,0x98,0x03,0x01,0x2a,0x03,0x3a,0x03,0x02,0x1b,0x1a, -0x18,0x7e,0x2c,0x2e,0x2e,0x0c,0x3f,0x34,0x7e,0x26,0x0a,0x7e,0x0c,0x1b,0x2e,0x91,0x2c,0x18,0x18,0x39,0x05,0x91,0x12,0x04,0x39,0x91,0x21,0x21,0x0c,0x12,0x00,0x3f,0x33,0x2f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x01,0x2f,0xfd,0xde,0xed,0x11,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x21,0x15,0x21,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x35,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02, -0x17,0x32,0x3e,0x02,0x04,0x7d,0x3a,0x6b,0x95,0x5b,0x5c,0x95,0x6b,0x3a,0xa8,0x4f,0x95,0xd5,0x86,0x85,0xd4,0x94,0x4f,0x01,0x06,0xfe,0xfa,0x35,0x63,0x90,0x5b,0x53,0x89,0x62,0x35,0x3c,0x6d,0x97,0x5c,0xb2,0xb2,0x36,0x58,0x3d,0x21,0x18,0x31,0x49,0x31,0x34,0x52,0x38,0x1d,0x03,0x71,0x6a,0xa0,0x6b,0x35,0x37,0x6e,0xa6,0x6e,0xfc, -0x9e,0x03,0x6d,0x91,0xda,0x91,0x49,0x4b,0x97,0xe3,0x97,0x38,0x98,0xee,0x65,0xa0,0x6f,0x3c,0x3b,0x6a,0x92,0x56,0x5e,0x9d,0x70,0x3e,0xfe,0x7a,0xee,0x2a,0x49,0x64,0x3a,0x33,0x58,0x41,0x27,0x03,0x29,0x4b,0x67,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x70,0x05,0x9a,0x00,0x10,0x00,0x19,0x00,0x6e,0x40,0x48,0x3a,0x18,0x4a,0x18, -0x9a,0x18,0x03,0x28,0x18,0x01,0x96,0x16,0x01,0x34,0x16,0x44,0x16,0x02,0x26,0x16,0x01,0x96,0x14,0x01,0x34,0x14,0x44,0x14,0x02,0x26,0x14,0x01,0x59,0x09,0x01,0x55,0x04,0x01,0x00,0x00,0x1b,0x0f,0x01,0x7e,0x0c,0x9f,0x11,0x01,0x11,0x11,0x1b,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x12,0x01,0x91,0x0f,0x0c,0x0c,0x05,0x0d,0x03, -0x17,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0x33,0xed,0x32,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x14,0x00,0x23,0x20,0x00,0x11,0x34,0x00,0x21,0x21,0x11,0x33,0x11,0x21,0x01,0x11,0x21,0x20,0x03,0x12,0x21, -0x32,0x36,0x05,0x70,0xfe,0xfc,0xfe,0xf6,0xe8,0xfe,0xfd,0xfe,0xe7,0x01,0x00,0x01,0x03,0x01,0x63,0xa8,0x01,0x04,0xfe,0x54,0xfe,0xaf,0xfe,0x9d,0x0a,0x0a,0x01,0x5e,0xa7,0xaf,0x03,0x90,0xfe,0x78,0xfe,0xfe,0xde,0x01,0x22,0x01,0x04,0xf0,0x01,0x2a,0x01,0x72,0xfe,0x8e,0xfd,0xe4,0x01,0x84,0xfe,0x78,0xfe,0x6a,0xdb,0x00,0x00,0x01, -0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x1b,0x00,0x5e,0x40,0x3c,0x9c,0x0a,0x01,0x8a,0x0a,0x01,0x89,0x09,0x99,0x09,0x02,0x98,0x05,0x01,0x39,0x05,0x01,0x89,0x04,0x01,0x4b,0x04,0x01,0x39,0x04,0x01,0x2b,0x04,0x01,0x18,0x04,0x01,0x1b,0x7e,0x01,0x01,0x0e,0x1d,0x11,0x0c,0x7e,0x0e,0x36,0x11,0x01,0x15,0x11,0x25,0x11,0x02, -0x11,0x07,0x91,0x16,0x16,0x10,0x03,0x01,0x0d,0x12,0x00,0x3f,0xce,0x3f,0x39,0x2f,0xed,0x33,0x5d,0x5d,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02, -0x15,0x04,0xd5,0xa8,0x2b,0x57,0x86,0x5b,0x5c,0x8c,0x5f,0x31,0xa8,0xa8,0x1d,0x4b,0x5e,0x71,0x42,0x85,0xc5,0x81,0x3f,0x01,0x3c,0xe7,0x6a,0xaa,0x75,0x3f,0x41,0x79,0xaf,0x6e,0xfd,0xec,0x05,0x9a,0xfe,0x45,0x21,0x3c,0x2c,0x1a,0x55,0xa2,0xec,0x97,0x00,0x01,0x00,0xbc,0xff,0x38,0x04,0x08,0x05,0x9a,0x00,0x0f,0x00,0x1f,0x40,0x0f, -0x09,0x7e,0x0a,0x0a,0x11,0x03,0x7e,0x00,0x02,0x03,0x0a,0x03,0x91,0x00,0x12,0x00,0x3f,0xed,0xce,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0xbc,0xa8,0x01,0x6a,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0x05,0x9a,0xfa,0xfe,0x37,0x60,0x80,0x49, -0x2b,0x49,0x36,0x1e,0x00,0x01,0x00,0xbc,0xff,0xe8,0x05,0xc3,0x05,0x9a,0x00,0x1f,0x00,0x5a,0x40,0x38,0x94,0x1e,0x01,0x6a,0x15,0x7a,0x15,0x8a,0x15,0x03,0x59,0x15,0x01,0x84,0x11,0x01,0x65,0x11,0x75,0x11,0x02,0x56,0x11,0x01,0x9a,0x02,0x01,0x0d,0x7e,0x05,0x1a,0x7e,0x18,0x05,0x18,0x05,0x18,0x09,0x21,0x0c,0x07,0x7e,0x09,0x19, -0x06,0x91,0x0d,0x0f,0x0b,0x03,0x13,0x91,0x00,0x00,0x08,0x12,0x00,0x3f,0x33,0x2f,0xed,0x3f,0x3f,0xed,0xc4,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x35,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e, -0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x04,0x23,0x5d,0x99,0x6c,0x3b,0xfe,0xde,0xa8,0xa8,0x01,0xc5,0x27,0x43,0x5b,0x35,0x35,0x5d,0x44,0x27,0xa3,0x3b,0x6d,0x9a,0x18,0x36,0x6d,0xa4,0x6d,0x01,0xcc,0xfc,0x98,0x05,0x9a,0xfe,0x66,0xfd,0xb6,0x51,0x7a,0x51,0x28,0x28,0x51,0x7a,0x51,0x02,0x4a,0xfd,0x9c,0x6d,0xa4,0x6d,0x36,0x00, -0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x04,0x05,0xb2,0x00,0x1a,0x00,0x25,0x00,0xf0,0x40,0x33,0x76,0x21,0x01,0x79,0x25,0x01,0x26,0x22,0x76,0x22,0x02,0x3a,0x1f,0x01,0x86,0x1d,0x01,0x39,0x1d,0x01,0x45,0x17,0x55,0x17,0x02,0x05,0x17,0x15,0x17,0x25,0x17,0x03,0x98,0x04,0x01,0x38,0x02,0x88,0x02,0x02,0x89,0x1c,0x01,0x96,0x16,0xa6, -0x16,0xe6,0x16,0x03,0x15,0xb8,0xff,0xe0,0xb3,0x2e,0x31,0x48,0x15,0xb8,0xff,0xc0,0x40,0x6e,0x25,0x28,0x48,0x0c,0x15,0x0a,0x11,0x18,0x7d,0x6b,0x05,0x7b,0x05,0x8b,0x05,0x03,0x08,0x05,0x18,0x05,0x02,0x6b,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x29,0x1e,0x03,0x1e,0x05,0x07,0x10,0x1b,0x20,0x1b,0x30,0x1b,0x03,0x1b,0x1b,0x03,0x27,0x0a, -0x7e,0x07,0x20,0x7d,0x0f,0x03,0x1f,0x03,0x02,0x03,0x1e,0x18,0x1a,0x1f,0x48,0x09,0x1e,0x01,0xe9,0x1e,0xf9,0x1e,0x02,0x1e,0x05,0x07,0x91,0x06,0x15,0x16,0x15,0x26,0x15,0x03,0xb9,0x15,0x01,0x15,0xb9,0x0c,0x01,0x0c,0xb0,0x0a,0xc0,0x0a,0xd0,0x0a,0x03,0x0a,0x0a,0x08,0x11,0x13,0x91,0x10,0x0e,0x04,0x08,0x03,0x23,0x91,0x00,0x13, -0x00,0x3f,0xed,0x3f,0x3f,0x33,0xed,0x32,0x10,0xcd,0x2f,0x5d,0x32,0x5d,0x32,0x71,0x72,0xed,0x32,0x32,0x5d,0x71,0x2b,0x01,0x2f,0x5d,0xed,0xd4,0xed,0x11,0x12,0x39,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0xfd,0xc4,0x12,0x39,0x39,0x2b,0x2b,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x05,0x20,0x00,0x11,0x10,0x37,0x26,0x27,0x11,0x33,0x15,0x16,0x17,0x36,0x21,0x32,0x17,0x15,0x26,0x23,0x26,0x07,0x16,0x00,0x11,0x10,0x00,0x13,0x10,0x24,0x27,0x06,0x11,0x14,0x16,0x33,0x36,0x36,0x02,0xc0,0xfe,0xf4,0xfe,0xaa,0xd4,0x63,0x71,0x9c,0x79,0x6c,0xed,0x01,0x42,0x86,0x70,0x7f,0x8a,0xad,0x84,0xe7,0x01,0x53,0xfe,0xbb, -0x95,0xfe,0x8e,0xe8,0xec,0xf7,0xb8,0xbd,0xda,0x18,0x01,0x4a,0x01,0x24,0x01,0x45,0xec,0x06,0x01,0x01,0x0c,0x79,0x01,0x0b,0x9d,0x10,0xb0,0x28,0x02,0x30,0x27,0xfe,0xd2,0xfe,0xde,0xfe,0xce,0xfe,0xa5,0x02,0x83,0x01,0x0c,0xef,0x0e,0xcb,0xfe,0xb9,0xea,0xf9,0x01,0xff,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x17, -0x00,0x49,0x40,0x2d,0x4b,0x16,0x01,0x95,0x08,0x01,0x84,0x08,0x01,0x34,0x03,0x01,0x25,0x03,0x01,0x0c,0x7e,0x0a,0x0f,0x0f,0x19,0x01,0x7e,0x17,0x8e,0x0f,0x01,0x49,0x0f,0x01,0x2a,0x0f,0x3a,0x0f,0x02,0x0f,0x05,0x91,0x14,0x0e,0x12,0x0b,0x0f,0x01,0x03,0x00,0x3f,0x3f,0x3f,0xde,0xed,0x33,0x5d,0x5d,0x5d,0x01,0x2f,0xed,0x12,0x39, -0x2f,0xc4,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x11,0x23,0x11,0x0e,0x03,0x23,0x20,0x02,0x11,0xaa,0xa8,0xab,0xb7,0x51,0x8b,0x64,0x39,0xa8,0xa8,0x1b,0x50,0x63,0x71,0x3b,0xfe,0xf6,0xff,0x05,0x9a,0xfd,0xa1,0xd6,0xd4,0x34,0x6c,0xa6,0x73,0xb6,0xfc,0x00,0x01, -0x7f,0x1c,0x30,0x24,0x15,0x01,0x2e,0x01,0x2e,0x00,0x00,0x01,0x00,0x21,0xff,0x68,0x04,0x50,0x06,0x02,0x00,0x0d,0x00,0xa1,0x40,0x5e,0xa6,0x08,0xb6,0x08,0x02,0xa9,0x04,0x01,0xb8,0x04,0x01,0x08,0x07,0x08,0x09,0x07,0x7e,0x06,0x05,0x14,0x06,0x06,0x05,0x06,0x05,0x0b,0x04,0x03,0x04,0x7e,0x0a,0x0b,0x14,0x0a,0x04,0x05,0x0a,0x0b, -0x08,0x09,0x04,0x05,0x08,0x05,0x04,0x7e,0x09,0x08,0x14,0x09,0x08,0x04,0x09,0x09,0x0a,0x61,0x05,0x01,0xc1,0x05,0xd1,0x05,0xe1,0x05,0x03,0x05,0x0a,0x05,0x0a,0x03,0x0d,0x7e,0x00,0x00,0x0f,0x03,0x86,0x0a,0x01,0x48,0x05,0x01,0x07,0x05,0x09,0x0a,0x04,0x06,0x0b,0x91,0x03,0x00,0x02,0x12,0x00,0x3f,0xce,0x33,0xed,0x2f,0x17,0x39, -0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x11,0x33,0x10,0xc1,0x87,0x04,0x2b,0x10,0x01,0xc1,0x87,0x04,0x7d,0x10,0xc4,0x87,0x08,0x18,0x10,0x2b,0x87,0x05,0x7d,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x08,0x7d,0x10,0xc4,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x05,0x35,0x21,0x35,0x01,0x25,0x13, -0x17,0x07,0x05,0x15,0x01,0x21,0x11,0x03,0xa8,0xfc,0x79,0x02,0xb3,0xfe,0x8c,0x8c,0x95,0x46,0x01,0x6b,0xfd,0x76,0x03,0x34,0x98,0x98,0x2f,0x04,0x03,0xc2,0x01,0x0e,0x4e,0x86,0xba,0x1d,0xfc,0x41,0xfe,0xd0,0x00,0x02,0x00,0x5e,0xff,0xc6,0x05,0x38,0x05,0xb2,0x00,0x35,0x00,0x45,0x00,0xba,0x40,0x7a,0x39,0x34,0x49,0x34,0x59,0x34, -0x03,0x84,0x1f,0x01,0x9b,0x1a,0x01,0x86,0x14,0x01,0x7a,0x10,0x01,0x28,0x10,0x01,0x69,0x0f,0x79,0x0f,0x02,0x56,0x09,0x01,0x37,0x09,0x47,0x09,0x02,0x9d,0x2b,0x01,0x7c,0x2b,0x8c,0x2b,0x02,0x2b,0x2a,0x2a,0x91,0x25,0x01,0x64,0x25,0x74,0x25,0x84,0x25,0x03,0x30,0x25,0x36,0x22,0x7e,0x9e,0x3c,0x01,0x8d,0x3c,0x01,0x7e,0x3c,0x01, -0x6b,0x3c,0x01,0x3c,0x0a,0x36,0x10,0x0d,0x20,0x0d,0x02,0x0d,0x0d,0x47,0x36,0x7e,0x00,0x17,0x7e,0x18,0x18,0x0f,0x00,0x1f,0x00,0x02,0x00,0x3c,0x25,0x39,0x41,0x18,0x18,0x12,0x30,0x0a,0x33,0x05,0x91,0x41,0x39,0x91,0x33,0x2a,0x2b,0x2b,0x33,0x13,0x12,0x91,0x1d,0x04,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x33,0x10,0xfd,0xde,0xed,0x11, -0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x39,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x39,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x35,0x34,0x2e,0x02, -0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x1e,0x03,0x17,0x07,0x2e,0x03,0x27,0x06,0x04,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x36,0x36,0x37,0x2e,0x03,0x23,0x22,0x0e,0x02,0x5e,0x05,0x31,0x5f,0x8e,0x61,0x3f,0x7c,0x78,0x73,0x35,0x41,0x48,0x34,0x67,0x9c,0x69,0x63,0x98,0x67,0x36,0xb0, -0x54,0x99,0xd7,0x84,0x89,0xdb,0x9a,0x52,0x5d,0x53,0x14,0x40,0x45,0x42,0x17,0x73,0x18,0x42,0x46,0x43,0x18,0x74,0xfe,0xff,0x91,0xa9,0xb3,0xa6,0x5b,0x5b,0x6d,0xb5,0x51,0x23,0x4e,0x57,0x5d,0x30,0x38,0x50,0x34,0x18,0xf8,0x3f,0x67,0x49,0x29,0x18,0x2a,0x38,0x1f,0x4f,0xcb,0x8a,0x63,0xb8,0x8f,0x56,0x3f,0x70,0x9d,0x5d,0x81,0xd4, -0x97,0x54,0x63,0xae,0xed,0x8a,0xa7,0xfe,0xfc,0x64,0x0f,0x37,0x3e,0x3c,0x13,0x82,0x16,0x3f,0x41,0x3a,0x12,0x57,0x69,0x92,0x7c,0x29,0x3d,0x01,0x41,0x33,0x12,0x23,0x1c,0x12,0x12,0x1f,0x29,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x05,0x94,0x05,0xb2,0x00,0x0f,0x00,0x56,0x40,0x38,0x96,0x0c,0x01,0x24,0x0c,0x34,0x0c,0x02,0x98,0x0a, -0x01,0x2a,0x0a,0x3a,0x0a,0x02,0xa8,0x03,0x01,0x57,0x03,0x01,0x45,0x03,0x01,0xa7,0x01,0x01,0x49,0x01,0x59,0x01,0x02,0x06,0x05,0x7e,0xc0,0x09,0x01,0x09,0x09,0x11,0x0e,0x7e,0x0f,0x0e,0x0e,0x02,0x05,0x91,0x08,0x12,0x0b,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xcd,0x31, -0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x10,0x21,0x20,0x11,0x11,0x33,0x15,0x21,0x11,0x10,0x21,0x20,0x11,0x15,0x23,0x78,0x02,0x14,0x02,0x17,0xf1,0xfe,0x67,0xfe,0x92,0xfe,0x93,0xa8,0x03,0x56,0x02,0x5c,0xfd,0xbb,0xfd,0x2b,0x98,0x03,0x62,0x01,0xb9,0xfe,0x56,0x97,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x05,0x3a, -0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x7d,0x40,0x51,0x78,0x17,0x01,0x36,0x12,0x01,0x07,0x12,0x17,0x12,0x02,0x44,0x11,0x84,0x11,0x94,0x11,0x03,0x29,0x03,0x39,0x03,0x02,0x19,0x10,0x14,0x4a,0x04,0x7a,0x04,0x8a,0x04,0x9a,0x04,0x04,0x04,0x09,0x01,0x0d,0x0d,0x00,0x7e,0x15,0x15,0x1d,0x14,0x7e,0x01,0x06,0x06,0x01,0x19,0x20,0x24, -0x2a,0x48,0x19,0x20,0x17,0x1e,0x48,0x19,0x04,0x06,0x91,0x10,0x09,0xd0,0x07,0x01,0x07,0x07,0x01,0x0d,0x91,0x0c,0x03,0x14,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2b,0x2b,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x12,0x39,0x39,0x5d,0x12,0x39,0x39,0x31,0x30, -0x71,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x10,0x37,0x26,0x23,0x35,0x20,0x17,0x36,0x21,0x33,0x15,0x23,0x22,0x07,0x04,0x00,0x11,0x01,0x21,0x11,0x10,0x24,0x27,0x06,0x11,0x05,0x3a,0xfb,0x82,0xca,0x59,0xcb,0x01,0x47,0x76,0xf7,0x01,0x56,0xce,0xe1,0xd4,0xa9,0x01,0x07,0x01,0x57,0xfc,0x2a,0x03,0x2e,0xfe,0xa6,0xfd,0xd7,0x02,0x10, -0x01,0x45,0xe7,0x07,0x9b,0x0f,0xcb,0x98,0x53,0x2c,0xfe,0xde,0xfe,0xce,0xfe,0x69,0x01,0x8d,0x01,0x0f,0xe4,0x18,0xd3,0xfe,0xbf,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x05,0x9a,0x00,0x0f,0x00,0x57,0x40,0x39,0x29,0x0e,0x39,0x0e,0x02,0x96,0x0c,0x01,0x25,0x0c,0x35,0x0c,0x02,0x4a,0x07,0x5a,0x07,0xda,0x07,0x03,0xc8,0x05, -0x01,0xa9,0x05,0x01,0x46,0x05,0x01,0xb7,0x0c,0x01,0x02,0x03,0x7e,0x30,0x0f,0x01,0x0f,0x0f,0x11,0x0a,0x7e,0xb0,0x08,0x01,0x08,0x09,0x03,0x0d,0x91,0x06,0x13,0x03,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01, -0x21,0x15,0x23,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x04,0x2d,0x01,0xa3,0xfb,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0x05,0x9a,0x98,0xfd,0x42,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x4d,0x05,0xb2,0x00,0x3f,0x00,0x9b,0x40,0x63,0x49,0x3e, -0x01,0x33,0x10,0x10,0x13,0x48,0x6a,0x33,0x01,0x57,0x2d,0x01,0x67,0x29,0x77,0x29,0x02,0x56,0x29,0x01,0x46,0x24,0x56,0x24,0x02,0x84,0x20,0x01,0x87,0x1f,0x01,0xaa,0x1a,0x01,0x98,0x1a,0x01,0x7a,0x1a,0x8a,0x1a,0x02,0x63,0x14,0x01,0x79,0x10,0x01,0x6b,0x10,0x01,0x79,0x0f,0x01,0x25,0x06,0x22,0x7e,0x0d,0x0d,0x2b,0x7e,0x00,0x00, -0x18,0x41,0x36,0x7e,0x35,0x35,0x18,0x06,0x06,0x17,0x7e,0x18,0x26,0x25,0x06,0x18,0x18,0x12,0x08,0x91,0x06,0x36,0x06,0x36,0x12,0x3b,0x91,0x30,0x13,0x12,0x91,0x1d,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x01,0x2f,0xed,0x33,0x2f,0x11,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed, -0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x01,0x34,0x2e,0x02,0x23,0x21,0x35,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22, -0x2e,0x02,0x27,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xa5,0x3b,0x70,0xa3,0x69,0xfe,0xac,0x01,0x4e,0x5e,0x93,0x60,0x30,0x26,0x45,0x60,0x3a,0x34,0x61,0x4a,0x2c,0xa6,0x4b,0x79,0x9c,0x51,0x51,0x9a,0x79,0x49,0x9a,0x90,0x48,0x84,0x62,0x38,0x55,0x8f,0xba,0x64,0x5c,0xb0,0x8a,0x55,0x02,0xa6,0x30,0x57,0x7c,0x4b,0x41,0x7a, -0x5f,0x39,0x01,0x87,0x46,0x69,0x47,0x23,0x8b,0x21,0x42,0x63,0x42,0x3d,0x5c,0x3d,0x1e,0x1b,0x36,0x50,0x34,0x58,0x84,0x58,0x2c,0x2d,0x57,0x7f,0x53,0x8e,0xb6,0x28,0x04,0x05,0x34,0x5a,0x7b,0x48,0x67,0xa0,0x6e,0x39,0x27,0x54,0x86,0x60,0x34,0x50,0x37,0x1c,0x24,0x47,0x67,0x00,0x00,0x01,0xff,0xf6,0xff,0xe8,0x05,0x1c,0x05,0x9a, -0x00,0x0f,0x00,0x54,0x40,0x38,0x29,0x0c,0x39,0x0c,0x49,0x0c,0x99,0x0c,0x04,0x97,0x0a,0x01,0x25,0x0a,0x35,0x0a,0x45,0x0a,0x03,0x46,0x03,0x56,0x03,0x02,0xd7,0x03,0x01,0x58,0x03,0x01,0x56,0x01,0x01,0x0f,0x7e,0x10,0x0e,0x01,0x0e,0x0e,0x11,0x08,0x7e,0x06,0x04,0x0e,0x0e,0x02,0x05,0x91,0x07,0x03,0x0b,0x91,0x02,0x13,0x00,0x3f, -0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xce,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x23,0x35,0x21,0x11,0x10,0x21,0x20,0x11,0x35,0x33,0x05,0x1c,0xfd,0xec,0xfd,0xe9,0xfb,0x01,0xa3,0x01,0x6e,0x01,0x6d,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0x98,0xfc, -0x9e,0xfe,0x47,0x01,0xaa,0xab,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xf6,0x05,0xba,0x00,0x23,0x00,0xa4,0x40,0x69,0x97,0x22,0x01,0x98,0x1e,0x01,0x99,0x19,0x01,0x38,0x19,0x48,0x19,0x02,0x9b,0x18,0x01,0x94,0x14,0x01,0x85,0x09,0x01,0x76,0x09,0x01,0x27,0x09,0x01,0x87,0x08,0x01,0x84,0x02,0x01,0x55,0x02,0x01,0x47,0x02,0x01,0x01, -0x20,0x21,0x23,0x21,0x00,0x21,0x7e,0x22,0x23,0x14,0x22,0x22,0x23,0x00,0x9f,0x20,0x01,0x8c,0x20,0x01,0x71,0x01,0x01,0x64,0x01,0x01,0x20,0x01,0x21,0x23,0x23,0x11,0x7e,0x10,0x10,0x20,0x10,0x02,0x10,0x10,0x1b,0x25,0x22,0x21,0x21,0x06,0x7e,0x0f,0x1b,0x1f,0x1b,0x02,0x1b,0x00,0x11,0x00,0x11,0x22,0x04,0x0b,0x91,0x16,0x13,0x00, -0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x33,0x87,0x04,0x10,0x2b,0x87,0x7d,0xc4,0x10,0xc4,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x25,0x0e,0x03,0x15,0x14,0x1e,0x02, -0x33,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x25,0x37,0x01,0x04,0xb8,0xfe,0x92,0x88,0xd4,0x93,0x4d,0x37,0x6a,0x9b,0x64,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd7,0x84,0x86,0xdb,0x9b,0x54,0x43,0x7e,0xb6,0x73,0xfe,0x8b,0x27,0x03,0xe5,0x04,0x14,0x66,0x15,0x6b,0x99,0xbd,0x69,0x61, -0xa3,0x76,0x42,0x3f,0x70,0x9d,0x5d,0x7d,0xd3,0x9a,0x56,0x4f,0x96,0xd7,0x88,0x6c,0xcf,0xae,0x84,0x22,0x6c,0x93,0xfe,0xed,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x25,0x05,0xb2,0x00,0x19,0x00,0x3f,0x40,0x28,0x3b,0x12,0x4b,0x12,0x02,0x86,0x0a,0x96,0x0a,0x02,0x95,0x09,0x01,0x86,0x09,0x01,0x25,0x09,0x01,0x99,0x05,0x01,0x2a,0x05, -0x01,0x19,0x7e,0x01,0x01,0x1b,0x0c,0x7e,0x0e,0x07,0x91,0x14,0x04,0x01,0x0d,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x05,0x25,0xa8,0x39,0x69, -0x93,0x5a,0x5d,0x98,0x6c,0x3b,0xa8,0x4e,0x91,0xd0,0x83,0x88,0xd9,0x97,0x51,0x03,0x71,0x6a,0xa0,0x6b,0x35,0x37,0x6e,0xa6,0x6e,0xfc,0x9e,0x03,0x6d,0x91,0xda,0x91,0x49,0x4b,0x97,0xe3,0x97,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x04,0xf6,0x05,0xb2,0x00,0x23,0x00,0x9a,0x40,0x63,0x46,0x1e,0x56,0x1e,0x96,0x1e,0x03,0x93,0x19,0x01, -0x45,0x18,0x01,0x9c,0x14,0x01,0x38,0x14,0x01,0x86,0x0d,0x01,0x89,0x09,0x01,0x3a,0x09,0x01,0x01,0x20,0x21,0x23,0x21,0x00,0x21,0x7e,0x22,0x23,0x14,0x22,0x22,0x23,0x99,0x22,0x01,0x22,0x21,0x21,0x81,0x20,0x91,0x20,0x02,0x34,0x20,0x74,0x20,0x02,0x20,0x23,0x1b,0x7e,0x6d,0x01,0x01,0x01,0x23,0x10,0x06,0x20,0x06,0x30,0x06,0x03, -0x06,0x06,0x11,0x25,0x00,0x23,0x23,0x10,0x7e,0x0f,0x11,0x1f,0x11,0x02,0x11,0x00,0x10,0x00,0x10,0x22,0x12,0x0b,0x91,0x16,0x04,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0x12,0x39,0x5d,0xed,0x11,0x39,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x87,0x04,0x10,0x2b,0x87,0x7d,0xc4, -0x10,0xc4,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x05,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x05,0x07,0x01,0x9c,0x01,0x6e,0x88,0xd4,0x93,0x4d,0x37,0x6a,0x9b,0x64,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd7,0x84,0x86, -0xdb,0x9b,0x54,0x43,0x7e,0xb6,0x73,0x01,0x75,0x27,0xfc,0x1b,0x01,0xa6,0x66,0x15,0x65,0x91,0xb8,0x69,0x61,0x9f,0x71,0x3e,0x3f,0x70,0x9d,0x5d,0x7d,0xd3,0x9a,0x56,0x4b,0x91,0xd3,0x88,0x6c,0xc9,0xa7,0x7e,0x22,0x6c,0x93,0x01,0x13,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0x89,0x05,0xb2,0x00,0x1c,0x00,0x58,0x40,0x38,0x7a,0x19, -0x01,0x68,0x19,0x01,0x1a,0x19,0x01,0x96,0x11,0x01,0x85,0x11,0x01,0x27,0x11,0x01,0x25,0x10,0x01,0x2a,0x0c,0x01,0x8b,0x0b,0x9b,0x0b,0x02,0x29,0x0b,0x01,0x16,0x03,0x01,0x13,0x7e,0x15,0x00,0x06,0x7e,0x08,0x1b,0x7e,0x00,0x08,0x08,0x01,0x00,0x15,0x12,0x1b,0x01,0x91,0x0e,0x04,0x00,0x3f,0xed,0x32,0x3f,0xce,0x11,0x39,0x2f,0x01, -0x2f,0xed,0xde,0xed,0x10,0xde,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x11,0x0e,0x03,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x11,0x02,0xaf,0x52,0x8e,0x69,0x3c,0xa8,0x5b,0xa8,0xed,0x92,0x92,0xee,0xa9,0x5c,0xa8,0x3c,0x6a,0x90,0x54, -0x01,0x59,0x03,0xbc,0x0b,0x47,0x74,0x9f,0x62,0x74,0x7f,0x91,0xe0,0x99,0x4f,0x52,0x9e,0xe9,0x97,0xfc,0xbe,0x03,0x5d,0x5f,0x9a,0x71,0x45,0x0a,0xfc,0x43,0x00,0x02,0x00,0x64,0xff,0x38,0x05,0x44,0x05,0xb2,0x00,0x28,0x00,0x3a,0x00,0xb7,0x40,0x79,0x95,0x37,0x01,0x47,0x37,0x01,0x93,0x36,0x01,0x94,0x33,0x01,0x55,0x32,0x95,0x32, -0x02,0x45,0x2d,0x01,0x36,0x2d,0x01,0x2b,0x2b,0x8b,0x2b,0x02,0x68,0x2a,0x78,0x2a,0x02,0x94,0x27,0x01,0x94,0x24,0x01,0x36,0x24,0x01,0x89,0x1e,0x01,0x8a,0x1d,0x01,0x8a,0x1b,0x01,0x5a,0x19,0x01,0x80,0x28,0x90,0x28,0x02,0x61,0x28,0x71,0x28,0x02,0x50,0x28,0x01,0x04,0x28,0x01,0x28,0x0c,0x39,0x7e,0x16,0x4f,0x10,0x01,0x3b,0x10, -0x01,0x29,0x10,0x01,0x10,0x0e,0x16,0x05,0x7e,0x06,0x06,0x26,0x7e,0x29,0x16,0x29,0x16,0x29,0x20,0x3c,0x0c,0x7e,0x0e,0x0e,0x2f,0x7e,0x20,0x39,0x10,0x2c,0x91,0x23,0x04,0x28,0x10,0x91,0x0c,0x06,0x0e,0x0c,0x12,0x00,0x3f,0xdd,0xc4,0x10,0xfd,0xc4,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f, -0x10,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x5d,0x5d,0x5d,0x10,0xed,0x11,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x21,0x15,0x23,0x11,0x21,0x36,0x37,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35, -0x34,0x00,0x33,0x20,0x00,0x11,0x10,0x05,0x01,0x34,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x36,0x04,0x0a,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xfd,0x29,0xaa,0x01,0x93,0x50,0x2f,0x35,0x41,0x1d,0x14,0x2c,0x45,0x30,0x43,0x88,0x6e,0x45,0x01,0x18,0xea,0x01,0x08,0x01,0x34,0xfe,0x26,0x01,0x2a,0xcf, -0xbd,0xa4,0xae,0x2d,0x4d,0x64,0x37,0x3d,0x63,0x44,0x25,0xc0,0x98,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0xc8,0x01,0x60,0x1d,0x1b,0x1e,0x3b,0x38,0x17,0x20,0x34,0x2c,0x27,0x13,0x1a,0x48,0x66,0x8a,0x5c,0xc0,0x01,0x12,0xfe,0xb3,0xfe,0xe3,0xfe,0x42,0xf2,0x02,0xa1,0xd6,0x01,0x0c,0xc3,0x78,0x33,0x5b,0x4e,0x3d,0x15,0x18,0x39, -0x47,0x56,0x33,0xae,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0xc6,0x05,0xb2,0x00,0x11,0x00,0x6a,0x40,0x46,0xd9,0x0a,0xf9,0x0a,0x02,0xa8,0x0a,0x01,0x46,0x0a,0x01,0x09,0x08,0x01,0x59,0x08,0x01,0x4a,0x08,0x01,0x97,0x03,0x01,0x25,0x03,0x35,0x03,0x02,0xb7,0x01,0x01,0x29,0x01,0x39,0x01,0x02,0x70,0x0e,0x01,0x0e,0x0c,0x0f,0x7e,0x30, -0x11,0x70,0x11,0x02,0x11,0x11,0x13,0x04,0x7e,0xb0,0x06,0x01,0x06,0x0d,0x91,0x0f,0x0f,0x06,0x02,0x91,0x09,0x03,0x11,0x11,0x06,0x12,0x00,0x3f,0x33,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xfd,0x32,0xcd,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20, -0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x15,0x33,0x15,0x23,0x11,0x23,0x04,0x2d,0xfe,0x99,0xfe,0x8c,0xa8,0x02,0x0a,0x02,0x21,0xf1,0xf1,0xa8,0x03,0x71,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x3d,0x98,0xfd,0x7f,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0x25,0x05,0x9a,0x00,0x19,0x00,0x3f,0x40,0x28,0x99,0x14, -0x01,0x2a,0x14,0x01,0x95,0x10,0x01,0x86,0x10,0x01,0x25,0x10,0x01,0x87,0x0f,0x97,0x0f,0x02,0x3b,0x07,0x4b,0x07,0x02,0x19,0x7e,0x17,0x17,0x1b,0x0c,0x7e,0x0a,0x18,0x0c,0x03,0x12,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23, -0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x05,0x25,0x51,0x97,0xd9,0x88,0x83,0xd0,0x91,0x4e,0xa8,0x3b,0x6c,0x98,0x5d,0x5a,0x93,0x69,0x39,0xa8,0x02,0x44,0x97,0xe3,0x97,0x4b,0x49,0x91,0xda,0x91,0x03,0x6d,0xfc,0x9e,0x6e,0xa6,0x6e,0x37,0x35,0x6b,0x9f,0x6b,0x03,0x71,0x00,0x00,0x01, -0x00,0x5e,0x00,0x00,0x05,0x7a,0x05,0x9a,0x00,0x11,0x00,0x57,0x40,0x36,0x9e,0x10,0x01,0x4b,0x10,0x01,0x93,0x06,0x01,0x84,0x06,0x01,0x35,0x03,0x01,0x26,0x03,0x01,0x0a,0x08,0x7e,0x0c,0x06,0x06,0x13,0x01,0x7e,0x11,0x0b,0x4a,0x0d,0x5a,0x0d,0x02,0x3b,0x0d,0x01,0x2d,0x0d,0x01,0x1b,0x0d,0x01,0x0d,0x04,0x91,0x0f,0x09,0x91,0x0c, -0x12,0x01,0x07,0x03,0x00,0x3f,0xce,0x3f,0xed,0xde,0xed,0x33,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xc4,0xfd,0xce,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0x06,0x23,0x20,0x11,0x5e,0xa8,0x01,0x6d,0x01,0x6e,0xa8,0xf1,0xfe,0x67,0x84, -0xeb,0xfd,0xec,0x04,0x5e,0xfe,0xf1,0xfe,0x56,0x01,0xb9,0x02,0x3c,0xfa,0xfe,0x98,0x01,0x93,0x85,0x02,0x5c,0x00,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xb5,0x05,0xb2,0x00,0x3a,0x00,0xba,0x40,0x7a,0x75,0x2e,0x01,0x56,0x2e,0x66,0x2e,0x02,0x5b,0x2a,0x01,0x86,0x24,0x96,0x24,0x02,0x75,0x24,0x01,0x66,0x24,0x01,0x75,0x23,0x01,0x67, -0x23,0x01,0x89,0x1e,0x99,0x1e,0x02,0x89,0x1a,0x01,0x4a,0x1a,0x01,0x7a,0x15,0x01,0x69,0x14,0x01,0x5a,0x11,0x01,0x33,0x0e,0x01,0x88,0x08,0x01,0x08,0x10,0x0d,0x10,0x48,0x49,0x07,0x01,0x73,0x03,0x01,0x65,0x03,0x01,0x65,0x02,0x75,0x02,0x02,0x26,0x7e,0x27,0x27,0x12,0x36,0x31,0x00,0x7e,0x17,0x1c,0x60,0x12,0x01,0x12,0x12,0x3c, -0x31,0x7e,0x1c,0x0b,0x7e,0x0a,0x0a,0x60,0x1c,0x01,0x1c,0x27,0x27,0x36,0x2c,0x36,0x10,0x21,0x0b,0x0b,0x17,0x10,0x17,0x05,0x2c,0x91,0x21,0x04,0x10,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39, -0xed,0x11,0x39,0x11,0x33,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x33,0x20,0x11,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e, -0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0xb5,0x5a,0x97,0xc6,0x6c,0x67,0xc8,0x9e,0x61,0xb1,0x45,0x6e,0x88,0x44,0x01,0x71,0x33,0x59,0x7a,0x48,0x6d,0xbf,0x8e,0x53,0x3f,0x7a,0xb1,0x72,0x5a,0xae,0x89,0x55,0xb0,0x29,0x4f,0x75,0x4b,0x48,0x6f,0x4c,0x27,0x38,0x62,0x81,0x48,0x6c,0xb9,0x87,0x4c,0x01,0x85, -0x75,0x9e,0x60,0x2a,0x2f,0x67,0xa3,0x74,0x4e,0x6a,0x41,0x1d,0x01,0x06,0x49,0x5e,0x3a,0x22,0x0d,0x14,0x3b,0x60,0x8e,0x68,0x55,0x8b,0x63,0x35,0x2b,0x5f,0x99,0x6f,0x38,0x5c,0x42,0x24,0x20,0x3b,0x52,0x33,0x43,0x5b,0x3c,0x25,0x0c,0x13,0x37,0x5f,0x92,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x25,0x05,0xb2,0x00,0x0d,0x00,0x4f, -0x40,0x33,0x46,0x0c,0x01,0x33,0x0c,0x01,0x4b,0x0a,0x01,0x3d,0x0a,0x01,0x94,0x05,0x01,0x85,0x05,0x01,0x26,0x05,0x01,0x17,0x05,0x01,0x89,0x03,0x99,0x03,0x02,0x18,0x03,0x28,0x03,0x02,0x0d,0x7e,0x01,0x01,0x0f,0x06,0x7e,0x08,0x00,0x00,0x07,0x04,0x91,0x0b,0x04,0x07,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0xed,0x12, -0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x05,0x25,0xa8,0xfe,0x6b,0xfe,0x6a,0xa8,0x02,0x3f,0x02,0x3c,0x02,0xc6,0xab,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x02,0x00,0x90,0xff,0xe8,0x04,0xdf, -0x05,0xb2,0x00,0x2f,0x00,0x43,0x00,0x9f,0x40,0x67,0x59,0x2d,0x01,0x48,0x29,0x01,0x26,0x24,0x01,0x79,0x1e,0x01,0x68,0x1e,0x01,0x59,0x1e,0x01,0x5a,0x1d,0x01,0x76,0x18,0x01,0x67,0x18,0x01,0x56,0x18,0x01,0x66,0x14,0x76,0x14,0x02,0x64,0x0c,0x74,0x0c,0x84,0x0c,0x03,0x66,0x0b,0x76,0x0b,0x02,0x6a,0x07,0x01,0x7b,0x06,0x8b,0x06, -0x02,0x6c,0x06,0x01,0x01,0x10,0x04,0x0e,0x7e,0x30,0x30,0x16,0x7e,0x50,0x2b,0x01,0x2b,0x2b,0x04,0x45,0x21,0x7e,0x20,0x20,0x3a,0x7e,0x04,0x2f,0x2f,0x04,0x11,0x10,0x2e,0x3f,0x3f,0x01,0x91,0x21,0x2e,0x2e,0x35,0x26,0x91,0x1b,0x13,0x35,0x91,0x09,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xce,0xed,0x32,0x2f,0x11,0x39,0x39, -0x01,0x2f,0x33,0x2f,0x10,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e, -0x02,0x27,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x21,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0xcc,0xbf,0x43,0x45,0x51,0x83,0xa6,0x56,0x55,0xa4,0x82,0x50,0xfe,0xf0,0x49,0x7b,0x5a,0x33,0x5d,0x99,0xc7,0x6a,0x6c,0xc6,0x98,0x5c,0x02,0xa8,0x35,0x64,0x8e,0x5a,0x48,0x89, -0x6c,0x41,0xd1,0xdc,0xfe,0x42,0x03,0x2a,0x30,0x50,0x6a,0x39,0x3f,0x6d,0x4f,0x2d,0x2a,0x4d,0x6c,0x42,0x42,0x6c,0x4e,0x2a,0x03,0x29,0x32,0x93,0x64,0x5b,0x85,0x56,0x2a,0x28,0x57,0x87,0x5a,0xfe,0xed,0x51,0x04,0x05,0x31,0x57,0x7b,0x4e,0x6d,0xa1,0x6a,0x34,0x34,0x6a,0xa1,0x6d,0x43,0x6c,0x4b,0x28,0x20,0x43,0x68,0x48,0x8c,0x8d, -0x01,0x95,0x3a,0x5b,0x3e,0x21,0x23,0x3f,0x5b,0x37,0x40,0x61,0x41,0x22,0x01,0x03,0x23,0x41,0x5f,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0xb2,0x05,0x9a,0x00,0x1a,0x00,0x57,0x40,0x34,0x9a,0x08,0x01,0x79,0x08,0x89,0x08,0x02,0x98,0x07,0x01,0x9a,0x03,0x01,0x3d,0x03,0x4d,0x03,0x02,0x2b,0x03,0x01,0x00,0x19,0x7e,0x01,0x01,0x0c, -0x1c,0x0f,0x0a,0x7e,0x0c,0x1a,0x91,0x01,0x26,0x0f,0x01,0x0f,0x14,0x91,0x05,0x01,0x05,0x01,0x05,0x0b,0x0e,0x03,0x0b,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x5d,0x10,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x35,0x34,0x26,0x23,0x22, -0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x33,0x05,0xb2,0xfe,0x7b,0xb7,0xb6,0x57,0x88,0x5e,0x31,0xa8,0xa8,0x21,0x49,0x58,0x6b,0x42,0x78,0xbb,0x84,0x4d,0x0b,0xe2,0x01,0xe6,0x47,0xd5,0xe9,0x41,0x79,0xaf,0x6e,0xfd,0xec,0x05,0x9a,0xfe,0x45,0x21,0x3c,0x2c,0x1a,0x44,0x84,0xc0,0x7c,0x00,0x03, -0x00,0x5e,0x00,0x00,0x05,0xf8,0x05,0x9a,0x00,0x14,0x00,0x1d,0x00,0x26,0x00,0x87,0x40,0x5a,0x29,0x22,0x01,0x29,0x1e,0x01,0x26,0x19,0x01,0x26,0x15,0x01,0x68,0x12,0x78,0x12,0x02,0x68,0x0e,0x78,0x0e,0x02,0x67,0x07,0x77,0x07,0x02,0x67,0x04,0x77,0x04,0x02,0x17,0x7d,0x0f,0x10,0x01,0x10,0x10,0x0b,0x20,0x7d,0x90,0x06,0x01,0x00, -0x06,0xc0,0x06,0x02,0x06,0x06,0x25,0x02,0x09,0x7e,0x1b,0x14,0x10,0x0b,0xc0,0x0b,0xd0,0x0b,0xf0,0x0b,0x04,0x0b,0x0b,0x27,0x28,0x1b,0x25,0x91,0x0c,0x09,0x40,0x12,0x16,0x48,0x09,0x0b,0x12,0x24,0x1c,0x91,0x02,0x14,0x00,0x03,0x00,0x3f,0xdd,0x32,0xed,0x32,0x3f,0xdd,0x2b,0x32,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x5d,0x33,0x33, -0xed,0x32,0x32,0x32,0x2f,0x5d,0x71,0xed,0x11,0x33,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x33,0x15,0x04,0x17,0x16,0x15,0x14,0x00,0x21,0x15,0x23,0x35,0x20,0x27,0x26,0x35,0x34,0x37,0x36,0x25,0x01,0x06,0x15,0x14,0x17,0x16,0x33,0x11,0x06,0x01,0x36,0x35,0x34,0x27,0x26,0x27,0x11,0x32,0x02,0xd7, -0xa8,0x01,0x0d,0xb6,0xb6,0xfe,0x94,0xfe,0xf3,0xa8,0xfe,0xf2,0xb5,0xb6,0xb6,0xb5,0x01,0x0e,0xfe,0xab,0x74,0x74,0x73,0xe2,0xe2,0x02,0xdf,0x74,0x74,0x74,0xe1,0xe1,0x05,0x9a,0x8c,0x01,0xa3,0xa3,0xfb,0xfd,0xfe,0xb9,0x88,0x88,0xa3,0xa4,0xfd,0xfb,0xa3,0xa3,0x01,0xfe,0xe6,0x7f,0xab,0xa9,0x80,0x7f,0x03,0x52,0x01,0xfd,0x2e,0x80, -0xa9,0xab,0x7f,0x7f,0x01,0xfc,0xae,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x04,0xe1,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0xbe,0x40,0x87,0x39,0x20,0x49,0x20,0x59,0x20,0x99,0x20,0x04,0xe4,0x1e,0x01,0xa6,0x1e,0xb6,0x1e,0x02,0x94,0x1e,0x01,0x36,0x1e,0x46,0x1e,0x56,0x1e,0x03,0xe7,0x1a,0x01,0xa6,0x1a,0x01,0x94,0x1a,0x01,0x35,0x1a, -0x45,0x1a,0x55,0x1a,0x03,0x99,0x18,0x01,0x3a,0x18,0x4a,0x18,0x5a,0x18,0x03,0x06,0x10,0x01,0x5b,0x0c,0x01,0x49,0x0c,0x01,0xe8,0x0c,0x01,0xaa,0x0c,0xba,0x0c,0x02,0x56,0x0a,0x01,0xe7,0x0a,0x01,0x14,0x01,0x7e,0x1c,0x7d,0x04,0x07,0x04,0x15,0x15,0x0e,0x7e,0x16,0x10,0x16,0x01,0x00,0x16,0x10,0x16,0x20,0x16,0x03,0x04,0x16,0x04, -0x16,0x23,0x06,0x19,0x91,0x0b,0x26,0x1f,0x91,0x59,0x13,0x69,0x13,0x02,0x13,0x0f,0x11,0x01,0xbf,0x11,0xcf,0x11,0xdf,0x11,0x03,0x11,0x07,0x15,0x91,0x04,0x01,0x03,0x12,0x00,0x3f,0xdd,0x32,0xfd,0x32,0xde,0x5d,0x71,0x32,0x5d,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x10,0xed,0x32,0x2f,0x11,0x33,0x10,0xed, -0xed,0x32,0x31,0x30,0x5d,0x71,0x5d,0x5d,0x71,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x21,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x02,0x23,0x22,0x27,0x15,0x21,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xe1,0xfc,0xb8,0xa8,0xdd,0xdd,0x01, -0x0b,0xe7,0xee,0x01,0x10,0xf8,0xee,0xda,0x88,0x03,0x48,0xa8,0x9f,0xab,0xa6,0xb0,0xac,0xaa,0xab,0x9f,0x98,0x98,0x98,0x98,0x02,0x8a,0xdf,0x01,0x19,0xfe,0xdf,0xe7,0xe8,0xfe,0xe8,0x77,0xf1,0x02,0x80,0xa8,0xd0,0xd3,0xa1,0xa6,0xda,0xd3,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x82,0x40,0x61, -0x1a,0x17,0x01,0xc8,0x13,0x01,0x0a,0x13,0x1a,0x13,0x02,0xc6,0x11,0x01,0x05,0x11,0x15,0x11,0x02,0x85,0x0d,0xc5,0x0d,0x02,0x04,0x0d,0x14,0x0d,0x02,0xc9,0x0b,0x01,0x56,0x0b,0x66,0x0b,0x96,0x0b,0x03,0xd7,0x07,0x01,0x55,0x07,0x65,0x07,0x95,0x07,0x03,0xc6,0x05,0x01,0x59,0x05,0x69,0x05,0x99,0x05,0x03,0xc6,0x01,0x01,0x5a,0x01, -0x6a,0x01,0x9a,0x01,0x03,0x09,0x7d,0x00,0x15,0x10,0x15,0x30,0x15,0x03,0x15,0x15,0x19,0x0f,0x7d,0x0f,0x03,0x1f,0x03,0x02,0x03,0x0c,0x91,0x06,0x04,0x12,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xfe,0xd4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70, -0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x05,0x32,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x03,0x00,0x86,0xff,0xe8,0x05,0x45,0x05,0x9a,0x00,0x1f,0x00,0x2a,0x00,0x35,0x00,0x82,0x40,0x54,0x3a,0x28,0x4a,0x28,0x02,0x29,0x28,0x01,0x7c,0x23,0x01,0x69,0x23,0x01,0x4a,0x23,0x01,0x39,0x23,0x01, -0x95,0x1d,0x01,0x99,0x14,0x01,0x45,0x0e,0x95,0x0e,0x02,0x24,0x0e,0x34,0x0e,0x02,0x05,0x0e,0x15,0x0e,0x02,0x96,0x0d,0x01,0x55,0x03,0x01,0x57,0x02,0x01,0x16,0x7e,0x2b,0x11,0x00,0x7e,0x20,0x25,0x1b,0x7e,0x11,0x0a,0x7e,0x0b,0x30,0x11,0x0b,0x0b,0x26,0x11,0x11,0x25,0x05,0x31,0x91,0x1b,0x30,0x1a,0x03,0x10,0x26,0x91,0x05,0x13, -0x00,0x3f,0xed,0x32,0x3f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0xc4,0xde,0xed,0x10,0xfd,0xc4,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x17,0x11,0x2e,0x03,0x35,0x34,0x36, -0x33,0x33,0x11,0x1e,0x03,0x07,0x34,0x2e,0x02,0x27,0x11,0x3e,0x03,0x01,0x14,0x1e,0x02,0x17,0x11,0x22,0x0e,0x02,0x05,0x45,0x59,0x9f,0xdb,0x82,0x88,0xe3,0xa4,0x5b,0xb1,0x36,0x61,0x84,0x4e,0x6d,0x9c,0x63,0x2f,0xd0,0xcb,0xa8,0x80,0xbf,0x7f,0x3f,0xb0,0x29,0x53,0x7d,0x54,0x4b,0x7b,0x57,0x30,0xfd,0x20,0x29,0x43,0x54,0x2b,0x40, -0x5a,0x38,0x19,0x01,0xe9,0x86,0xc2,0x7d,0x3c,0x44,0x86,0xc6,0x81,0x4d,0x82,0x63,0x3d,0x06,0x02,0xde,0x1a,0x3e,0x4b,0x5a,0x35,0x7a,0x8c,0xfe,0x3f,0x1e,0x61,0x7f,0x9b,0x57,0x3f,0x64,0x50,0x40,0x1b,0xfd,0x4f,0x09,0x33,0x57,0x7c,0x02,0xff,0x21,0x30,0x23,0x1a,0x0a,0x01,0x04,0x10,0x1c,0x28,0x00,0x00,0x01,0x00,0x00,0x04,0x90, -0x00,0xca,0x06,0x1c,0x00,0x0d,0x00,0x50,0x40,0x15,0x0c,0x18,0x22,0x25,0x48,0x0c,0x18,0x09,0x13,0x48,0x08,0x18,0x22,0x25,0x48,0x08,0x18,0x09,0x13,0x48,0x05,0xb8,0xff,0xe8,0xb3,0x1d,0x21,0x48,0x01,0xb8,0xff,0xf0,0x40,0x17,0x1d,0x21,0x48,0x00,0x06,0x03,0xc4,0x10,0x0a,0x20,0x0a,0x30,0x0a,0x03,0x0a,0x00,0xc5,0x40,0x0d,0xc0, -0x06,0xc5,0x07,0x00,0x2f,0xed,0x1a,0xde,0x1a,0xed,0x01,0x2f,0x5d,0xfd,0xce,0x32,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x13,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0xca,0x30,0x40,0x40,0x30,0x54,0x76,0x76,0x54,0x05,0xcb,0x41,0x34,0x34,0x41,0x51,0x6c,0x5a,0x5a,0x6c,0x00,0x01,0x00,0x00,0x04,0x8a, -0x00,0xe1,0x06,0x03,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x01,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x11,0x35,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x5e,0x14,0x34,0x3e, -0x3a,0x30,0x35,0x42,0x71,0x04,0x8a,0x49,0x05,0x62,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x60,0x93,0x00,0x00,0x01,0x00,0x00,0x04,0xc2,0x01,0x35,0x06,0x0a,0x00,0x03,0x00,0x22,0x40,0x11,0x78,0x03,0x88,0x03,0x98,0x03,0x03,0x03,0x40,0x00,0x80,0x01,0x40,0x02,0x03,0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x1a,0xcd,0x1a,0xdd,0x1a, -0xcd,0x31,0x30,0x5d,0x01,0x03,0x23,0x13,0x01,0x35,0xb6,0x7f,0x8f,0x06,0x0a,0xfe,0xb8,0x01,0x48,0x00,0x00,0x01,0x00,0x00,0x04,0x3e,0x01,0x92,0x06,0x03,0x00,0x1d,0x00,0x13,0xb6,0x03,0x1b,0x1b,0x0d,0x13,0x00,0x0f,0x00,0x2f,0xcc,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15, -0x14,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x35,0x34,0x27,0x01,0x86,0x04,0x08,0x1a,0x2d,0x3c,0x22,0x1a,0x2c,0x21,0x12,0x08,0x71,0x04,0x07,0x59,0x48,0x18,0x2d,0x23,0x15,0x08,0x06,0x03,0x0f,0x30,0x13,0x23,0x38,0x2e,0x25,0x10,0x0c,0x19,0x1d,0x24,0x16,0x17,0x22,0x0f,0x2f,0x14,0x45,0x5b,0x1d,0x0a,0x19,0x1f,0x25, -0x16,0x17,0x22,0x00,0x00,0x01,0x00,0x00,0x04,0xc2,0x01,0x35,0x06,0x0a,0x00,0x03,0x00,0x31,0xb7,0x77,0x03,0x87,0x03,0x97,0x03,0x03,0x03,0xb8,0xff,0xf8,0x40,0x12,0x18,0x1c,0x48,0x01,0x40,0x00,0x80,0x03,0x40,0x50,0x02,0x60,0x02,0x02,0x02,0x03,0x80,0x01,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x5d,0x1a,0xcd,0x1a,0xdd,0x1a,0xcd,0x31, -0x30,0x2b,0x5d,0x01,0x23,0x03,0x33,0x01,0x35,0x7f,0xb6,0xa8,0x04,0xc2,0x01,0x48,0x00,0x01,0x00,0x00,0x04,0x76,0x02,0x29,0x06,0x1c,0x00,0x2d,0x00,0xa0,0xb5,0x2a,0x08,0x11,0x14,0x48,0x26,0xb8,0xff,0xf8,0x40,0x4f,0x11,0x14,0x48,0x2a,0x1c,0x01,0x1c,0x10,0x11,0x14,0x48,0x06,0x12,0x16,0x12,0x02,0x19,0x07,0x11,0x01,0x2a,0x09, -0x0d,0x01,0x08,0x0c,0x01,0x39,0x0c,0x10,0x19,0x1f,0x48,0x07,0x03,0x17,0x03,0x27,0x03,0x03,0x3e,0x00,0x7f,0x2d,0x8f,0x2d,0x02,0x2d,0x2d,0x16,0x0a,0x9f,0x23,0xaf,0x23,0x02,0x23,0x40,0x09,0x0c,0x48,0x23,0x16,0x10,0x17,0x20,0x17,0x30,0x17,0x03,0x17,0x00,0x00,0x0f,0xc0,0x05,0x01,0x05,0x28,0xb8,0xff,0xc0,0x40,0x12,0x15,0x1a, -0x48,0x28,0x17,0xaf,0x0f,0xbf,0x0f,0xcf,0x0f,0x03,0x0f,0xc0,0x1e,0x01,0x1e,0x17,0xb8,0x01,0x3a,0x00,0x3f,0xdc,0x71,0xcd,0x71,0x10,0xd4,0x2b,0xcd,0x71,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xcd,0xdc,0x2b,0x71,0xcd,0x11,0x39,0x2f,0x71,0xcd,0x31,0x30,0x5e,0x5d,0x2b,0x5e,0x5d,0x5d,0x5e,0x5d,0x5e,0x5d,0x2b,0x5d,0x2b,0x2b,0x01,0x14, -0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x3e,0x04,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x01,0x37,0x07,0x10,0x1b,0x14,0x15,0x1f,0x14,0x09,0x16,0x24,0x30,0x19,0x32,0x4b,0x35,0x23,0x13,0x08,0x5b,0x09,0x1a,0x2e,0x4a,0x69,0x47,0x2e,0x51,0x3c,0x23,0x18, -0x2d,0x40,0x27,0x2a,0x3c,0x28,0x13,0x05,0x4f,0x0e,0x1e,0x19,0x10,0x0e,0x18,0x1f,0x10,0x1a,0x2b,0x1e,0x11,0x20,0x36,0x45,0x4a,0x49,0x1f,0x20,0x57,0x5e,0x5c,0x48,0x2d,0x1e,0x36,0x4a,0x2c,0x23,0x3f,0x2e,0x1b,0x1b,0x2f,0x3d,0x21,0x00,0x00,0x01,0x00,0x00,0x04,0xb7,0x02,0xce,0x06,0x1c,0x00,0x06,0x00,0x2a,0x40,0x16,0xa5,0x01, -0xb5,0x01,0xc5,0x01,0x03,0x96,0x01,0x01,0x01,0x06,0x04,0x00,0x00,0x02,0x04,0x00,0x06,0x05,0x01,0x04,0x00,0x2f,0xdd,0x32,0xcd,0x32,0x01,0x2f,0xcd,0x39,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x01,0x07,0x21,0x15,0x21,0x35,0x01,0x01,0x60,0xc9,0x02,0x37,0xfd,0x32,0x01,0x11,0x05,0xd1,0xd5,0x45,0x45,0x01,0x20,0x00,0x00,0x01, -0x00,0x90,0xff,0xe8,0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x91,0x40,0x63,0x9c,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x29,0x1e,0x03,0x57,0x1c,0x01,0x98,0x1b,0x01,0xc8,0x1a,0x01,0x9c,0x1a,0x01,0x07,0x0e,0x17,0x0e,0x02,0xf7,0x0e,0x01,0x36,0x0e,0x01,0x66,0x0c,0xe6,0x0c,0xf6,0x0c,0x03,0x55,0x0c,0x01,0x27,0x0c,0x37,0x0c,0x02,0x66,0x0c, -0x76,0x0c,0x86,0x0c,0x03,0x36,0x06,0x01,0x56,0x04,0x01,0x66,0x04,0x76,0x04,0x86,0x04,0x03,0x01,0x84,0x1f,0x08,0x15,0x15,0x12,0x84,0x10,0x1b,0x0a,0x84,0x08,0x08,0x20,0x21,0x16,0x0d,0x0d,0x1b,0x05,0x95,0x18,0x1d,0x16,0x14,0x0f,0x11,0x09,0x00,0x0f,0x00,0x3f,0x32,0x32,0x3f,0x3f,0x33,0xed,0x32,0x32,0x11,0x33,0x11,0x12,0x01, -0x39,0x2f,0xed,0x33,0xdc,0xed,0x33,0x2f,0x10,0xdc,0xed,0x31,0x30,0x5d,0x71,0x5d,0x5d,0x71,0x71,0x71,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x90,0xa4,0x69, -0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0xfc,0x00,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0x2a,0x04,0x18,0x00,0x16,0x00,0x5a,0x40,0x3a,0x75,0x15, -0x01,0x05,0x14,0x15,0x14,0x25,0x14,0x75,0x14,0x85,0x14,0x95,0x14,0x06,0xe8,0x06,0xf8,0x06,0x02,0xc7,0x06,0xd7,0x06,0x02,0x69,0x03,0x01,0x09,0x09,0x18,0x16,0x84,0x01,0x01,0x18,0x0f,0x0b,0x07,0x84,0x0d,0x10,0x04,0x95,0x13,0x01,0x01,0x13,0x10,0x0e,0x0f,0x0d,0x1b,0x09,0x95,0x0b,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x39,0x2f, -0x10,0xed,0x32,0x01,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0x02,0xe0,0xfd,0x20,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x01,0x30, -0x01,0x18,0x01,0x46,0xb9,0x8d,0xfe,0x50,0x98,0xfe,0x29,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0xf2,0x04,0x18,0x00,0x14,0x00,0x21,0x00,0x72,0x40,0x4d,0xc9,0x21,0xd9,0x21,0x02,0x26,0x20,0x36,0x20,0x02,0xc9,0x1e,0xd9,0x1e,0x02,0x64,0x1e,0x01,0x45,0x1e,0x55,0x1e,0x02,0x44,0x1a,0x54,0x1a,0x02, -0x68,0x0d,0x01,0xa7,0x0c,0x01,0xca,0x09,0xda,0x09,0x02,0x02,0x00,0x13,0x84,0x16,0x12,0x20,0x04,0x01,0x04,0x04,0x23,0x1c,0x83,0x0f,0x0b,0x1f,0x0b,0x02,0x0b,0x12,0x0f,0x10,0x19,0x95,0x0e,0x10,0x05,0x1f,0x95,0x08,0x16,0x04,0x1b,0x00,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0x5d,0xed, -0x12,0x39,0x2f,0x5d,0x33,0x33,0xfd,0xce,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x15,0x23,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xf2,0xe2,0xa4,0x04,0x6b,0xf3,0xc1,0xe9,0x01, -0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xa4,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0x98,0x98,0xfe,0x29,0x02,0x87,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfc,0x98,0x01,0x35,0x95,0x7e,0xae,0xdb,0xc7,0xb1,0xc9,0xc5,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0xc3,0x04,0x18,0x00,0x16,0x00,0x5d,0x40,0x0b,0x28,0x11,0x01,0x76,0x11,0x86, -0x11,0x96,0x11,0x03,0x10,0xb8,0xff,0xe0,0x40,0x2f,0x10,0x14,0x48,0x05,0x10,0x15,0x10,0x25,0x10,0x03,0x86,0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x68,0x03,0x01,0x14,0x00,0x12,0x84,0x01,0x01,0x18,0x0b,0x07,0x84,0x09,0x14,0x95,0x16,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x09,0x15,0x01,0x1b,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32, -0x3f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0x32,0xce,0x31,0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x15,0x23,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xcb,0xcb,0xfe,0x29,0x04,0x1f,0x01, -0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0xfe,0x26,0x98,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x2a,0x05,0xec,0x00,0x16,0x00,0x60,0x40,0x3e,0x7a,0x11,0x8a,0x11,0x02,0x10,0x18,0x10,0x14,0x48,0x09,0x10,0x19,0x10,0x29,0x10,0x03,0xc9,0x06,0xd9,0x06,0x02,0x06,0x10,0x1f,0x22,0x48,0x36,0x06,0x01,0x65,0x03,0x01,0x00, -0x00,0x18,0x09,0x84,0x0b,0x07,0x07,0x18,0x15,0x01,0x84,0x12,0x08,0x08,0x0f,0x00,0x95,0x15,0x0f,0x13,0x00,0x0c,0x04,0x95,0x0f,0x16,0x0b,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x2b,0x5d,0x5d,0x2b,0x5d,0x01,0x21,0x11,0x10, -0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x21,0x04,0x2a,0xfd,0x20,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xa4,0x02,0xe0,0x03,0x68,0xfe,0x50,0xfe,0xba,0xb9,0x8d,0x01,0x18,0xfd,0x30,0xaa,0xc2,0xd9,0xcd,0x04,0x5e,0xfe,0x14,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0xec, -0x04,0x18,0x00,0x12,0x00,0x1f,0x00,0x67,0x40,0x46,0xc9,0x1f,0xd9,0x1f,0x02,0x26,0x1e,0x36,0x1e,0x02,0xc9,0x1c,0xd9,0x1c,0x02,0x45,0x1c,0x55,0x1c,0x02,0x44,0x18,0x54,0x18,0x02,0xa7,0x07,0x01,0xca,0x04,0xda,0x04,0x02,0x10,0x0e,0x84,0x14,0x0d,0x00,0x12,0x10,0x12,0x20,0x12,0x03,0x12,0x12,0x21,0x1a,0x83,0x1f,0x06,0x01,0x06, -0x10,0x95,0x12,0x1b,0x0d,0x0f,0x0c,0x17,0x95,0x09,0x10,0x00,0x1d,0x95,0x03,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0x33,0x33,0xfd,0xce,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x33, -0x15,0x21,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x6c,0x04,0x6b,0xf3,0xc1,0xe9,0x01,0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xdc,0xfe,0x80,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0xb0,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfa,0xc1,0x98,0x03,0xa4,0x95,0x7e,0xae,0xdb,0xc7,0xb1,0xc9,0xc5,0x00, -0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x2a,0x05,0xec,0x00,0x09,0x00,0x26,0x40,0x13,0x09,0x06,0x09,0x06,0x0b,0x04,0x07,0x84,0x01,0x06,0x95,0x04,0x0f,0x02,0x00,0x09,0x95,0x01,0x15,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x03,0xf8, -0xfc,0xae,0xa4,0x02,0xe0,0xfd,0x20,0x02,0xae,0x05,0xec,0xfe,0x14,0x98,0xfd,0x30,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0x2a,0x04,0x18,0x00,0x14,0x00,0x5c,0x40,0x0b,0x28,0x13,0x01,0x76,0x13,0x86,0x13,0x96,0x13,0x03,0x12,0xb8,0xff,0xe0,0x40,0x2f,0x10,0x14,0x48,0x05,0x12,0x15,0x12,0x25,0x12,0x03,0x86,0x06,0x96,0x06,0x02,0xe8, -0x05,0x01,0x28,0x03,0x01,0x69,0x03,0x01,0x09,0x14,0x84,0x01,0x01,0x16,0x0d,0x07,0x84,0x0b,0x0e,0x04,0x95,0x11,0x10,0x0c,0x0f,0x09,0x95,0x0b,0x1b,0x01,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x5d,0x71,0x5d,0x71,0x5d,0x2b,0x5d,0x71,0x21,0x23,0x11,0x10,0x23,0x22, -0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0x02,0xe0,0xfc,0x7c,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfc,0x79,0x98,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x02,0x00,0xa6,0xfe,0x29,0x05,0x2b,0x04,0x18,0x00,0x0c,0x00,0x38,0x00,0x8c,0x40,0x5b, -0x98,0x35,0x01,0x97,0x23,0x01,0x66,0x23,0x76,0x23,0x86,0x23,0x03,0x65,0x22,0x01,0x89,0x1e,0x01,0x96,0x15,0x01,0x87,0x15,0x01,0x5a,0x10,0x01,0x49,0x10,0x01,0x9a,0x0a,0x01,0x89,0x0a,0x01,0x78,0x0a,0x01,0x69,0x0a,0x01,0x97,0x07,0x01,0x66,0x03,0x76,0x03,0x86,0x03,0x03,0x28,0x27,0x25,0x84,0x0d,0x01,0x01,0x19,0x3a,0x05,0x84, -0x33,0x1b,0x17,0x84,0x19,0x01,0x28,0x95,0x25,0x0d,0x0d,0x12,0x08,0x95,0x2e,0x16,0x1c,0x1d,0x1d,0x12,0x95,0x20,0x10,0x1a,0x0f,0x18,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x33,0x11,0x33,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x01,0x2f,0xfd,0xc4,0xde,0xed,0x11,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x03,0xe9,0x80,0x58,0x67, -0x4f,0x47,0x2e,0x41,0x28,0x12,0x03,0x2e,0x4e,0x69,0x3e,0x57,0x8b,0x62,0x35,0xa4,0xa4,0x04,0x40,0xd4,0x8a,0x5a,0x99,0x71,0x40,0x01,0x9a,0x9a,0x2c,0x56,0x80,0x54,0x45,0x74,0x54,0x2f,0x36,0x60,0x85,0x4f,0x01,0x5c,0x9e,0x6a,0x61,0x54,0x61,0x27,0x40,0x51,0x01,0x60,0x3a,0x5d,0x42,0x23,0x41,0x6b,0x88,0x47,0xfc,0x16,0x05,0xd7, -0xb4,0x60,0x6c,0x38,0x67,0x90,0x57,0x98,0x9e,0x52,0x88,0x63,0x37,0x32,0x58,0x77,0x46,0x52,0x84,0x5c,0x31,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0xca,0x05,0xec,0x00,0x16,0x00,0x23,0x00,0x55,0x40,0x36,0x68,0x0f,0x01,0x4a,0x0f,0x5a,0x0f,0x02,0x48,0x0e,0x58,0x0e,0x02,0x68,0x09,0x01,0x5a,0x09,0x01,0x4d,0x09,0x01,0x66,0x05, -0x01,0x55,0x05,0x01,0x43,0x05,0x01,0x01,0x00,0x15,0x84,0x12,0x17,0x17,0x25,0x1b,0x83,0x0c,0x01,0x17,0x95,0x12,0x15,0x0f,0x14,0x00,0x1e,0x95,0x07,0x16,0x00,0x3f,0xed,0x3f,0x3f,0xc4,0xfd,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11,0x14,0x0e, -0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x33,0x11,0x33,0x05,0x21,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x04,0xca,0xce,0x39,0x6f,0xa3,0x6b,0x7b,0xb8,0x79,0x3c,0x40,0x7b,0xb4,0x74,0x01,0x13,0xa8,0xce,0xfe,0x8a,0xfe,0xff,0xa7,0xa1,0x05,0x05,0xa1,0x8e,0x48,0x6b,0x45,0x22,0x03,0x76,0xfe,0x8d, -0x69,0xc3,0x96,0x59,0x52,0x92,0xc8,0x75,0x70,0xba,0x84,0x49,0x01,0xec,0xfe,0x14,0x8a,0xba,0xb9,0xc8,0xc9,0x46,0x72,0x92,0x4b,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0xf8,0x05,0xec,0x00,0x11,0x00,0x4e,0xb3,0x37,0x10,0x01,0x10,0xb8,0xff,0xd0,0x40,0x2c,0x11,0x14,0x48,0x71,0x10,0x01,0x06,0x10,0x16,0x10,0x26,0x10,0x03,0x86, -0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x68,0x03,0x01,0x11,0x84,0x01,0x01,0x13,0x0b,0x07,0x84,0x09,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x00,0x08,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x71,0x71,0x5d,0x5d,0x2b,0x71,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23, -0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0xc3,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0x76,0x04,0x00,0x00,0x05,0x00,0x1a,0x40,0x0c,0x01,0x01,0x07,0x05,0x84,0x03,0x04,0x0f,0x01,0x95,0x03,0x1b, -0x00,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x11,0x33,0x2f,0x31,0x30,0x01,0x21,0x15,0x21,0x11,0x33,0x01,0x4a,0x01,0x2c,0xfe,0x30,0xa4,0xfe,0xc1,0x98,0x05,0xd7,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x0b,0x05,0xec,0x00,0x35,0x00,0x49,0x40,0x29,0x95,0x2c,0x01,0x87,0x2c,0x01,0x28,0x84,0x0d,0x35,0x84,0x01,0x33,0x0d,0x33,0x0d,0x33,0x1a, -0x37,0x1c,0x18,0x84,0x1a,0x34,0x0f,0x1e,0x13,0x95,0x23,0x10,0x1c,0x00,0x19,0x1b,0x2e,0x95,0x03,0x08,0x16,0x00,0x15,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x3f,0xed,0x33,0x3f,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc4,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x21,0x23,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35, -0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x06,0x0b,0xa4,0x04,0x1a,0x38,0x44,0x51,0x32,0x61,0x80,0x4b,0x1f,0x0d,0x26,0x43,0x37,0x42,0x63,0x42,0x21,0xa4,0xa4,0x04,0x1e,0x41,0x4c,0x5b,0x36,0x54,0x6d, -0x3f,0x18,0x0d,0x2d,0x54,0x47,0x3e,0x5a,0x3b,0x1d,0xa4,0xa2,0x2f,0x45,0x2f,0x17,0x43,0x7c,0xb0,0x6d,0x62,0x50,0x84,0x5f,0x35,0x43,0x6b,0x84,0x40,0xfc,0x0d,0x07,0xc3,0xfd,0x6a,0x30,0x49,0x31,0x18,0x41,0x77,0xa9,0x68,0x71,0x51,0x86,0x60,0x35,0x43,0x69,0x80,0x3c,0x02,0x26,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0xb0,0x06,0x02, -0x00,0x15,0x00,0x25,0x00,0xc7,0x40,0x64,0x96,0x1a,0x01,0x96,0x16,0x01,0x48,0x0a,0x58,0x0a,0x02,0x49,0x06,0x59,0x06,0x02,0x5a,0x05,0x01,0x49,0x05,0x01,0x56,0x03,0x01,0x45,0x03,0x01,0x56,0x02,0x01,0x47,0x02,0x01,0x79,0x0c,0x99,0x0c,0x02,0x4c,0x0c,0x5c,0x0c,0x02,0x38,0x0c,0x01,0x0c,0x23,0x0d,0x20,0xb5,0x11,0xc5,0x11,0x02, -0x87,0x11,0x01,0x62,0x11,0x01,0x47,0x11,0x57,0x11,0x02,0x46,0x14,0x56,0x14,0x02,0x11,0x14,0x10,0x12,0x12,0x00,0x83,0x10,0x20,0x20,0x20,0x30,0x20,0x03,0x20,0x20,0x08,0x27,0xe9,0x0f,0x01,0x0f,0x10,0x0d,0x12,0x48,0x0f,0x10,0xb8,0xff,0xc0,0x40,0x21,0x0e,0x12,0x48,0x10,0x36,0x0e,0x01,0x0e,0x0d,0x0d,0x18,0x83,0x20,0x08,0x01, -0x08,0x14,0x23,0x95,0x0f,0x10,0x0d,0x03,0x0e,0x0c,0x11,0x0f,0x0e,0x00,0x1c,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0xc5,0x12,0x17,0x39,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x5d,0xcd,0x2b,0x32,0x2b,0x5d,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d, -0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x01,0x37,0x17,0x07,0x01,0x21,0x15,0x23,0x16,0x25,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x26,0x27,0x27,0x23,0x22,0x04,0x50,0x85,0x8b,0xee,0xe7,0x87,0x84,0x89,0x78,0xce,0xfe,0x55, -0x97,0x88,0x43,0x01,0xda,0x01,0x76,0xd9,0x78,0xfd,0x14,0x5b,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x01,0x8c,0x2c,0x5b,0xd6,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0xfb,0x88,0x78,0x0f,0x01,0x21,0xe3,0x5a,0x65,0xfe,0xbd,0x8a,0x96,0x2c,0x69,0xa9,0xab,0x6a,0x73,0x74,0x66,0xb2,0xe6,0x73,0x1f,0x00,0x01,0x00,0x90,0xfe,0x29,0x03,0xe2, -0x05,0xec,0x00,0x11,0x00,0x37,0x40,0x21,0x76,0x0b,0x01,0x67,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x84,0x03,0x01,0x0f,0x09,0x84,0x07,0x11,0x0f,0x09,0x00,0x0c,0x95,0x02,0x05,0x16,0x00,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x2f,0xc4,0x33,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11, -0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xfe,0x29,0x02,0x79,0xba,0x01,0xb4,0x04,0x50,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x11,0x00,0x98,0x40,0x2c,0x75,0x10, -0x01,0x92,0x10,0x01,0x82,0x10,0x01,0x6a,0x03,0x01,0x75,0x10,0x01,0x01,0x15,0x09,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b, -0x06,0x4d,0x01,0x01,0x13,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b, -0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x05,0xec,0xfd,0x6a,0xc2, -0xfe,0x5f,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xb2,0x05,0xc6,0x00,0x14,0x00,0x2f,0x00,0x93,0x40,0x5d,0x99,0x27,0x01,0x46,0x24,0x01,0x37,0x1d,0x01,0x9a,0x12,0x01,0x85,0x08,0x01,0x78,0x15,0x88,0x15,0x02,0x75,0x07,0x01,0x66,0x07,0x01,0x84,0x1a,0x01,0x00,0x1a,0x05,0x91,0x19,0x01,0x19,0x2f,0x2f,0x2a,0x0f,0x99,0x17,0x01,0x17, -0x90,0x18,0x01,0x18,0x16,0x15,0x15,0x05,0x83,0x0f,0x2a,0x01,0x2a,0x21,0x1f,0x84,0x0f,0x0f,0x01,0x0f,0x6c,0x00,0x7c,0x00,0x02,0x4a,0x00,0x5a,0x00,0x02,0x00,0x2f,0x19,0x15,0x18,0x04,0x16,0x1a,0x1a,0x16,0x0a,0x95,0x23,0x25,0x16,0x20,0x15,0x16,0x00,0x00,0x3f,0x3f,0x3f,0x33,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0x33,0x5d,0x5d, -0x01,0x2f,0x5d,0xed,0xc4,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xcd,0x5d,0x32,0x5d,0x11,0x12,0x39,0x2f,0xcd,0x5d,0x11,0x39,0x39,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x34,0x2e,0x02,0x01,0x37,0x17,0x07,0x05,0x07,0x1e,0x03,0x15,0x11,0x23, -0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0xf0,0x48,0x5c,0x35,0x14,0x25,0x41,0x56,0x32,0x47,0x6b,0x47,0x24,0x2c,0x4d,0x69,0xfe,0x4e,0x6e,0x8f,0x37,0x01,0x89,0x71,0x49,0x7f,0x5d,0x35,0xa4,0x04,0x62,0xc6,0x54,0x8d,0x67,0x3a,0x29,0x5b,0x91,0x67,0x03,0x73,0x44,0x80,0x78,0x73,0x36,0x47,0x6a,0x47,0x24, -0x33,0x5a,0x78,0x45,0x28,0x56,0x79,0x5a,0x45,0x01,0x9e,0xd6,0x3c,0x63,0xda,0x75,0x29,0x5a,0x72,0x8e,0x5b,0xfe,0x06,0xa2,0xba,0x32,0x64,0x95,0x63,0x5a,0xaa,0xaa,0xad,0x5d,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0xd4,0x04,0x18,0x00,0x14,0x00,0x58,0x40,0x0b,0x28,0x10,0x01,0x76,0x10,0x86,0x10,0x96,0x10,0x03,0x0f,0xb8,0xff,0xe0, -0x40,0x2c,0x10,0x14,0x48,0x05,0x0f,0x15,0x0f,0x25,0x0f,0x03,0x86,0x05,0x96,0x05,0x02,0x28,0x02,0x01,0x68,0x02,0x01,0x14,0x12,0x84,0x01,0x01,0x16,0x0a,0x06,0x84,0x09,0x0c,0x03,0x95,0x0e,0x10,0x0a,0x0f,0x08,0x15,0x12,0x95,0x00,0x1b,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xcd,0x31, -0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x01,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x15,0x03,0x54,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xdc,0xfe,0x29,0x04,0x1f,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0xfc,0x4f,0x98,0x00,0x00,0x02, -0x00,0x60,0xff,0xe8,0x03,0x89,0x06,0x02,0x00,0x20,0x00,0x31,0x00,0x79,0x40,0x4c,0x49,0x2d,0x59,0x2d,0x02,0x76,0x24,0x86,0x24,0x96,0x24,0x03,0x67,0x24,0x01,0x75,0x12,0x01,0x66,0x12,0x01,0x86,0x0d,0x01,0x77,0x0d,0x01,0x49,0x03,0x59,0x03,0x99,0x03,0x03,0x2f,0x10,0x21,0x1f,0x01,0x1c,0x09,0x09,0x13,0x84,0x15,0x2b,0x2b,0x33, -0x21,0x84,0x1c,0x00,0x00,0x0f,0x1c,0x01,0x1c,0x26,0x95,0x17,0x19,0x16,0x14,0x15,0x09,0x0b,0x95,0x08,0x06,0x01,0x1f,0x2f,0x95,0x10,0x01,0x10,0x00,0x3f,0xc4,0xfd,0xc4,0x3f,0x33,0xed,0x32,0x3f,0x3f,0x33,0xed,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xc4,0xed,0x32,0x2f,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x07,0x33,0x20,0x11,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x10,0x21,0x23,0x06,0x06,0x60,0x5a,0x21,0x77,0xa0,0xc0,0x6b,0x43,0x29,0x34,0x3e,0x50, -0x8a,0x71,0x55,0x19,0x5e,0x01,0xcd,0xa4,0x04,0x6a,0xd1,0x99,0xad,0x17,0x1d,0x34,0xa8,0x1c,0x33,0x48,0x2d,0x3f,0x68,0x4a,0x28,0xfe,0xc9,0x78,0x1b,0x13,0x04,0x18,0x62,0xb1,0x87,0x50,0x0a,0x8d,0x0d,0x3c,0x63,0x7e,0x43,0xfe,0x1e,0xfd,0xca,0xa0,0xb8,0xde,0xe0,0x8d,0xf3,0x68,0xfe,0x24,0x53,0x78,0x4f,0x26,0x30,0x52,0x6e,0x3e, -0x85,0x01,0x69,0x61,0xec,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0xaf,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x28,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x13,0x84,0x03,0x01,0x0f,0x0f,0x15,0x09,0x84,0x07,0x12,0x95,0x10,0x00,0x09,0x0f,0x0c,0x95,0x02,0x05,0x16,0x00,0x15,0x00,0x3f, -0x3f,0x33,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xc4,0x32,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x15,0x23,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x01,0x71,0xcd,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd, -0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0x98,0x00,0x01,0xff,0x70,0xfe,0x29,0x01,0x80,0x04,0x00,0x00,0x0a,0x00,0x16,0x40,0x0a,0x0a,0x84,0x05,0x09,0x09,0x0f,0x06,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xce,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x11,0x11,0x33,0x01,0x80,0xcb,0xb5,0x90,0x8c,0xe0,0xa4,0x09, -0xe8,0xf8,0x98,0x01,0x3b,0x04,0x04,0x00,0x00,0x01,0xff,0xf6,0xff,0xe8,0x04,0x0b,0x05,0xec,0x00,0x13,0x00,0x3e,0x40,0x25,0x9a,0x10,0x01,0x8b,0x10,0x01,0x29,0x10,0x01,0x76,0x03,0x01,0x67,0x03,0x01,0x13,0x01,0x84,0x11,0x0d,0x0b,0x09,0x84,0x07,0x0c,0x04,0x95,0x0f,0x16,0x0a,0x15,0x09,0x0f,0x12,0x95,0x01,0x00,0x00,0x3f,0xed, -0x3f,0x3f,0x3f,0xed,0x33,0x01,0x2f,0xed,0xc4,0x32,0x2f,0xed,0xce,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x03,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x23,0x0a,0x01,0x66,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xc3,0x05,0xec,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e, -0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0x00,0x01,0x00,0x60,0xfe,0x29,0x03,0xc6,0x04,0x18,0x00,0x2f,0x00,0x71,0x40,0x49,0x66,0x2d,0x76,0x2d,0x02,0x79,0x2b,0x01,0x48,0x22,0x58,0x22,0x02,0x9a,0x03,0x01,0x89,0x03,0x01,0x99,0x02,0x01,0x88,0x02,0x01,0x93,0x0f,0x01,0x64,0x0f,0x74,0x0f,0x84,0x0f,0x03,0x0f,0x13,0x1a,0x1a,0x0a, -0x84,0x9c,0x25,0x01,0x8b,0x25,0x01,0x6c,0x25,0x01,0x25,0x20,0x29,0x29,0x31,0x13,0x84,0x20,0x2f,0x84,0x00,0x00,0x20,0x19,0x95,0x1b,0x1b,0x00,0x00,0x2c,0x95,0x05,0x10,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0xed,0x32,0x2f,0x11,0x39,0x5d,0x5d,0x31,0x30, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x60,0x44,0x76,0x9e,0x5b,0x5b,0x9e,0x76,0x44,0x3d,0x63,0x80,0x84,0x80,0x63,0x3d,0x1a,0x33,0x49,0x30,0x01,0xfe,0xfd, -0xf1,0x51,0x7f,0x58,0x2f,0x3d,0x63,0x80,0x84,0x80,0x63,0x3d,0x8c,0x85,0x85,0x8c,0x02,0x89,0x5c,0x94,0x67,0x38,0x38,0x67,0x94,0x5c,0x5c,0x8e,0x6e,0x57,0x4b,0x46,0x4d,0x5b,0x3b,0x24,0x3d,0x2e,0x1a,0x94,0x30,0x57,0x77,0x48,0x4e,0x77,0x5d,0x4d,0x48,0x4a,0x5c,0x72,0x4b,0x7e,0x86,0x86,0x7e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00, -0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x98,0x40,0x2c,0x75,0x11,0x01,0x92,0x10,0x01,0x82,0x10,0x01,0x6a,0x03,0x01,0x75,0x10,0x01,0x01,0x15,0x09,0x15,0x0a,0x0f,0x0c,0x04,0x95,0x0f,0x10,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff, -0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x14,0x01,0x5d,0x2f,0x2b,0x2b, -0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x32,0x3f,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2, -0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0x00,0x01,0x00,0x60,0xfe,0x29,0x02,0xec,0x04,0x1c,0x00,0x29,0x00,0x6a,0x40,0x41,0xb7,0x29,0x01,0xa6,0x29,0x01,0x88,0x25,0x01,0x9a,0x1f,0x01,0x89,0x1f,0x01,0x99,0x1e,0x01,0x8a,0x1e,0x01,0x65,0x0a,0x01,0x47,0x09,0x01,0x67,0x08,0x01,0x67,0x01,0x01,0x27, -0x28,0x28,0x29,0x95,0x29,0x01,0x29,0x11,0x11,0x03,0x84,0x26,0x23,0x23,0x2b,0x0e,0x84,0x16,0x23,0x03,0x11,0x29,0x28,0x95,0x26,0x27,0x10,0x11,0x95,0x12,0x1b,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x32,0x5d,0x11,0x33,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x07,0x06,0x06,0x15,0x14,0x33,0x21,0x15,0x21,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x37,0x36,0x36,0x35,0x34,0x27,0x01,0x25,0x17,0x07,0x02,0x64,0x11,0x13,0x34,0x3b,0x31,0x46,0x3a,0x38,0x22,0x0b,0x12,0x4e,0x01,0xad,0xfe,0x53,0x73,0x6c,0x06, -0x0d,0x15,0x0f,0x1b,0x4c,0x56,0x58,0x27,0x14,0x10,0x0c,0xfe,0x9c,0x01,0x07,0x5f,0x8d,0x01,0xa4,0x19,0x37,0x23,0x29,0x61,0x3b,0x30,0x48,0x41,0x41,0x29,0x0e,0x2b,0x0e,0x45,0x94,0x68,0x70,0x0c,0x24,0x28,0x29,0x13,0x22,0x54,0x59,0x58,0x27,0x13,0x26,0x10,0x19,0x12,0x02,0x08,0xbd,0x84,0x66,0x00,0x00,0x01,0x00,0x90,0xfe,0x29, -0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x5b,0x40,0x38,0x9c,0x1e,0x01,0x85,0x0c,0x01,0x66,0x0c,0x76,0x0c,0x02,0x86,0x03,0x01,0x77,0x03,0x01,0x66,0x03,0x01,0x02,0x84,0x1f,0x08,0x16,0x14,0x12,0x84,0x10,0x1b,0x0b,0x84,0x08,0x05,0x95,0x1d,0x9d,0x1b,0x01,0x48,0x1b,0x58,0x1b,0x02,0x1b,0x15,0x0d,0x95,0x18,0x16,0x13,0x1b,0x11,0x01, -0x0a,0x0f,0x00,0x3f,0xc4,0xc4,0x3f,0x3f,0xed,0x33,0x33,0x5d,0x5d,0xd4,0xed,0x01,0x2f,0xed,0x33,0xdc,0xed,0xc4,0x33,0x10,0xdc,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x26,0x27,0x06, -0x23,0x20,0x11,0x90,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0xfa,0x29,0x02,0x79,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x04,0x04,0x18, -0x00,0x2d,0x00,0x44,0x00,0x86,0x40,0x57,0x66,0x40,0x01,0x67,0x3e,0x01,0x94,0x39,0x01,0x76,0x39,0x86,0x39,0x02,0x69,0x36,0x01,0x5a,0x29,0x01,0x49,0x29,0x01,0x67,0x17,0x01,0x93,0x16,0x01,0x86,0x16,0x01,0x75,0x16,0x01,0x66,0x16,0x01,0x95,0x15,0x01,0x85,0x14,0x01,0x77,0x0f,0x01,0x75,0x0e,0x01,0x89,0x02,0x99,0x02,0x02,0x1f, -0x1f,0x11,0x84,0x33,0x2e,0x42,0x84,0x00,0x00,0x07,0x33,0x33,0x26,0x46,0x3b,0x84,0x07,0x07,0x1b,0x84,0x26,0x2e,0x38,0x1f,0x95,0x21,0x1b,0x38,0x95,0x0c,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x3e,0x03,0x17,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x04,0x15,0x14,0x06, -0x01,0x5c,0x22,0x32,0x3c,0x32,0x22,0x43,0x78,0xa6,0x64,0x64,0xa8,0x78,0x43,0x4d,0x7d,0xa0,0xa6,0xa0,0x3e,0x10,0x15,0x2f,0x33,0x02,0xb1,0xfd,0x4f,0x39,0x5a,0x3f,0x21,0x28,0x23,0x3c,0x46,0x25,0x0a,0x6e,0x43,0x90,0x78,0x4d,0x2a,0x4d,0x6b,0x41,0x96,0x8f,0x1e,0x2e,0x34,0x2e,0x1e,0x0b,0x01,0x01,0x29,0x45,0x40,0x40,0x48,0x55, -0x35,0x58,0x81,0x55,0x29,0x39,0x65,0x8d,0x54,0x54,0x9b,0x8f,0x87,0x7f,0x7a,0x3b,0x0f,0x2d,0x0e,0x23,0x36,0x94,0x23,0x40,0x5b,0x38,0x2d,0x51,0x20,0x35,0x54,0x4b,0x48,0x43,0x3a,0x70,0x77,0x84,0x4e,0x3b,0x60,0x44,0x25,0x68,0x6a,0x23,0x41,0x3e,0x3d,0x41,0x45,0x27,0x2a,0x44,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x87,0x04,0x18, -0x00,0x17,0x00,0x55,0x40,0x31,0x86,0x10,0x96,0x10,0x02,0x75,0x10,0x01,0x6a,0x03,0x01,0x59,0x03,0x01,0x06,0x14,0x01,0x14,0x00,0x15,0x15,0x12,0x84,0x02,0x00,0x00,0x07,0x02,0x02,0x09,0x19,0x0d,0x0b,0x07,0x84,0x09,0x00,0x14,0x95,0x09,0x17,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x00,0x3f,0x3f,0xed,0x33,0x3f,0xc4,0xed,0x39, -0x01,0x2f,0xfd,0xc4,0x33,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x25,0x24,0x11,0x10,0x25,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x21,0x15,0x21,0x02,0x5b,0x01,0x17,0xfe,0xfe,0x85,0xa1,0xa4,0xa4,0x04,0x74,0xe6,0x9e,0xd0, -0xc0,0x01,0x31,0xfd,0xd4,0x47,0x95,0x01,0x63,0x01,0x3e,0x11,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xea,0xf0,0xf7,0xbb,0x8c,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0xa5,0x40,0x3c,0x79,0x06,0x01,0x9b,0x06,0x01,0x8b,0x06,0x01,0x66,0x0b,0x01,0x56,0x0b,0x01,0x79,0x06,0x01,0x0d,0x10,0x0b,0x0c, -0x00,0x4c,0x38,0x03,0x01,0x01,0x15,0x03,0x0c,0x95,0x05,0x16,0x10,0x0f,0x08,0x0f,0x01,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0f,0x01,0x0f,0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0x40,0x2a,0x0b,0x06,0x4d,0x0f,0x0f, -0x13,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0a,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x02,0x0b,0x06,0x4d,0x07,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0xed,0x32, -0x3f,0x5d,0x31,0x30,0x2b,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x90,0xfe,0x29, -0x04,0xbe,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x28,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x00,0x12,0x84,0x03,0x01,0x0f,0x0f,0x15,0x09,0x84,0x07,0x11,0x00,0x09,0x0f,0x0c,0x95,0x02,0x05,0x16,0x13,0x95,0x01,0x1b,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f, -0xc4,0x33,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x33,0x04,0xbe,0xfe,0x80,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xdc,0xfe,0x29,0x02,0x79,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xf8,0xd5, -0x00,0x01,0x00,0x8f,0xff,0xe8,0x06,0x17,0x04,0x18,0x00,0x26,0x00,0x53,0x40,0x33,0x94,0x24,0x01,0x85,0x16,0x01,0x66,0x16,0x76,0x16,0x02,0x9c,0x11,0x01,0x79,0x03,0x89,0x03,0x02,0x68,0x03,0x01,0x14,0x84,0x12,0x1c,0x1e,0x09,0x84,0x1c,0x00,0x84,0x02,0x0b,0x1c,0x20,0x04,0x95,0x23,0x10,0x14,0x1d,0x0f,0x17,0x95,0x0d,0x10,0x16, -0x01,0x0a,0x15,0x00,0x3f,0xc4,0x3f,0x33,0xed,0x3f,0xc4,0x3f,0xed,0x33,0x01,0x2f,0xc4,0xdc,0xed,0x10,0xfd,0xc4,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x33, -0x36,0x36,0x33,0x32,0x16,0x15,0x06,0x17,0xa4,0xd0,0x39,0x5e,0x42,0x25,0xa4,0x04,0x33,0x8b,0x60,0xfe,0xb0,0xa3,0xda,0x36,0x5a,0x41,0x24,0xa4,0x04,0x3a,0x9c,0x5c,0x96,0xa6,0x02,0x48,0x01,0x46,0x33,0x56,0x71,0x3e,0xfd,0xaa,0xa2,0x5e,0x5c,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x34,0x58,0x74,0x40,0x02,0x4e,0xaa,0x61,0x61, -0xd8,0xce,0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x53,0x40,0x0b,0x28,0x11,0x01,0x76,0x11,0x86,0x11,0x96,0x11,0x03,0x10,0xb8,0xff,0xe0,0x40,0x29,0x10,0x14,0x48,0x05,0x10,0x15,0x10,0x25,0x10,0x03,0x86,0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x69,0x03,0x01,0x12,0x84,0x01,0x01,0x14,0x0b,0x07,0x84,0x09, -0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x09,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74, -0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfb,0xe1,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x10,0x04,0x18,0x00,0x28,0x00,0x3d,0x00,0x70,0x40,0x47,0x55,0x31,0x01,0x46,0x31,0x01,0x45,0x2b,0x01,0x5a,0x21,0x01,0x7a,0x1b,0x01,0x69,0x1b,0x01,0x38,0x12,0x01,0x74,0x0e,0x01,0x9a,0x08,0x01,0x89, -0x08,0x01,0x8a,0x07,0x01,0x54,0x02,0x01,0x45,0x02,0x01,0x27,0x15,0x00,0x84,0x38,0x38,0x1e,0x3f,0x0b,0x83,0x0a,0x0a,0x2e,0x83,0x1e,0x28,0x0f,0x29,0x95,0x25,0x23,0x10,0x33,0x95,0x17,0x0b,0x19,0x16,0x10,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0xce,0x33,0xed,0x3f,0x33,0xed,0x3f,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f, -0xed,0xc4,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x10,0x00,0x23,0x22,0x2e,0x04,0x35,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x35,0x33,0x05,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02, -0x35,0x35,0x34,0x2e,0x02,0x04,0x10,0xfe,0xf7,0xf5,0x20,0x59,0x60,0x5f,0x4b,0x2f,0xa8,0x35,0x4f,0x5d,0x27,0x51,0x81,0x5a,0x30,0x04,0x75,0xeb,0x6a,0x9f,0x6a,0x35,0x38,0x73,0xb1,0x79,0xcf,0x64,0x04,0xa4,0xfe,0x3c,0x58,0x7b,0x4e,0x23,0x24,0x4a,0x71,0x4e,0x48,0x73,0x51,0x2b,0x2c,0x4e,0x69,0x52,0xfe,0xe6,0xfe,0xe6,0x0d,0x20, -0x35,0x52,0x70,0x4a,0x3f,0x57,0x35,0x17,0x32,0x65,0x96,0x65,0x70,0xc4,0x50,0x89,0xb7,0x67,0x74,0xcf,0x9b,0x5b,0xa6,0x8e,0x72,0x44,0x74,0x98,0x54,0x4a,0x88,0x68,0x3e,0x38,0x5f,0x7f,0x47,0x97,0x3c,0x6b,0x51,0x30,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0x02,0x04,0x00,0x00,0x05,0x00,0x1a,0x40,0x0c,0x01,0x01,0x07,0x00,0x84,0x03, -0x05,0x0f,0x00,0x95,0x03,0x15,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x25,0x21,0x15,0x21,0x11,0x33,0x01,0x4a,0x01,0xb8,0xfd,0xa4,0xa4,0x98,0x98,0x04,0x00,0x00,0x00,0x01,0x00,0x8f,0xfe,0x29,0x06,0x17,0x05,0xec,0x00,0x26,0x00,0x55,0x40,0x35,0x94,0x24,0x01,0x85,0x16,0x01,0x66,0x16,0x76,0x16,0x02,0x9c, -0x11,0x01,0x79,0x03,0x89,0x03,0x02,0x68,0x03,0x01,0x14,0x84,0x12,0x1c,0x1e,0x09,0x84,0x1c,0x00,0x84,0x02,0x0b,0x1c,0x20,0x04,0x95,0x23,0x10,0x1d,0x00,0x14,0x0f,0x17,0x95,0x0d,0x10,0x16,0x0a,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x3f,0xed,0x33,0x01,0x2f,0xc4,0xdc,0xed,0x10,0xfd,0xc4,0x10,0xdc,0xed,0x31, -0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x23,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x06,0x17,0xa4,0xd0,0x39,0x5e,0x42,0x25,0xa4,0x04,0x33,0x8b,0x60,0xfe,0xb0,0xa3,0xda,0x36,0x5a,0x41, -0x24,0xa4,0x04,0x3a,0x9c,0x5c,0x96,0xa6,0x02,0x48,0x01,0x46,0x33,0x56,0x71,0x3e,0xfb,0xd3,0x02,0x79,0x5e,0x5c,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x34,0x58,0x74,0x40,0x04,0x3a,0xfd,0x6a,0x61,0x61,0xd8,0xce,0x00,0x02,0x00,0x00,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x62,0x40,0x3b,0x4a,0x21,0x5a,0x21, -0x02,0x43,0x1f,0x53,0x1f,0x02,0x66,0x09,0x76,0x09,0x02,0x12,0x12,0x0a,0x83,0x20,0x20,0x17,0x27,0x05,0x03,0x1a,0x14,0x0f,0x11,0x84,0x01,0x00,0x17,0x11,0x01,0x95,0x17,0x00,0x14,0x10,0x14,0x20,0x14,0x03,0x14,0x16,0x1b,0x1d,0x95,0x0f,0x0d,0x16,0x23,0x95,0x04,0x07,0x10,0x02,0x0f,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x33,0xed,0x3f, -0xdd,0x5d,0xc4,0xfd,0xc4,0x01,0x2f,0xcd,0xc4,0xfd,0x32,0xc4,0xc4,0xc4,0x32,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x15,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x35,0x23,0x01,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23, -0x22,0x06,0xa6,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x6c,0x04,0x03,0x0a,0xfc,0xf6,0xa4,0xa6,0x01,0x4a,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0xa7,0x04,0xa7,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0xac,0xfe,0xc5,0x98,0x98,0x98,0x03,0x70,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0x60,0xff,0xe8, -0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x85,0x40,0x1f,0x19,0x40,0x0b,0x02,0x4d,0x12,0x95,0x00,0x16,0x0c,0x95,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x0b,0x0c,0x06,0x4d,0x20,0x15,0x30,0x15,0x90, -0x15,0x03,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d, -0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x18,0x01,0x1f,0xed, -0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x03,0x00,0x60,0xfe,0x29,0x05,0x1f,0x05,0xec,0x00,0x0a,0x00,0x2f,0x00,0x38,0x00,0x93,0x40,0x5e,0x45,0x2d,0x01,0x46,0x2c,0x01,0x95,0x27,0x01,0x76,0x27,0x01,0x99,0x1c,0x01,0x96,0x16,0x01,0x34,0x16,0x01,0x25,0x16,0x01, -0x14,0x16,0x01,0x05,0x16,0x01,0x96,0x15,0x01,0x49,0x10,0x01,0x4c,0x0f,0x01,0x5b,0x08,0x01,0x3a,0x08,0x01,0x29,0x08,0x01,0x39,0x03,0x49,0x03,0x69,0x03,0x03,0x1e,0x83,0x30,0x19,0x2a,0x83,0x00,0x2f,0x05,0x25,0x84,0x19,0x12,0x83,0x13,0x35,0x0d,0x19,0x13,0x13,0x06,0x19,0x19,0x05,0x0d,0x36,0x95,0x25,0x35,0x24,0x00,0x18,0x06, -0x95,0x2f,0x0d,0x13,0x0b,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0xc4,0xc4,0xde,0xed,0x10,0xfd,0xc4,0xc4,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x02,0x27,0x11,0x3e, -0x03,0x01,0x23,0x11,0x2e,0x03,0x35,0x33,0x14,0x1e,0x02,0x17,0x11,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x14,0x1e,0x02,0x17,0x11,0x22,0x06,0x04,0x6f,0x29,0x53,0x7d,0x54,0x4c,0x7b,0x57,0x2f,0xfe,0xb3,0xa8,0x71,0xc5,0x91,0x53,0xb1,0x38,0x62,0x84,0x4b,0x6d,0x9c,0x63,0x2f,0x37, -0x69,0x99,0x62,0xa8,0x80,0xbf,0x7f,0x3f,0x4e,0x89,0xba,0x6c,0xfe,0x6d,0x29,0x43,0x54,0x2b,0x7c,0x6f,0x01,0xe9,0x3f,0x64,0x50,0x40,0x1b,0xfd,0x4f,0x0b,0x32,0x55,0x7c,0xfc,0x95,0x01,0xc2,0x07,0x49,0x84,0xbd,0x7d,0x50,0x83,0x60,0x3a,0x08,0x02,0xde,0x1e,0x47,0x56,0x67,0x3c,0x46,0x6f,0x4e,0x29,0xfd,0xea,0x1e,0x61,0x7c,0x9b, -0x57,0x7e,0xb7,0x7b,0x42,0x0a,0x04,0xd7,0x30,0x3b,0x2e,0x22,0x0d,0x01,0x56,0x4f,0x00,0x01,0x00,0x90,0xff,0xe8,0x05,0x5e,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x27,0x76,0x0b,0x01,0x67,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x84,0x03,0x01,0x0f,0x13,0x0f,0x13,0x15,0x09,0x84,0x07,0x11,0x0f,0x09,0x00,0x0c,0x95, -0x02,0x05,0x16,0x12,0x95,0x01,0x15,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xc4,0x33,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x21,0x05,0x5e,0xfd,0xe0,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78, -0x9b,0xa4,0x01,0x7c,0xa2,0xba,0x01,0xb4,0x04,0x50,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x98,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x36,0x40,0x12,0x00,0xb0,0x06,0x10,0x12,0xb0,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f, -0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f, -0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0x00,0x2a,0x00,0x00,0x02,0x19,0x00,0xc8,0x00,0x09,0x00,0x35,0x40,0x1f,0x07,0x08,0x08,0x0b,0x73,0x03,0x83,0x03,0x02,0x55,0x03,0x65,0x03,0x02,0x46,0x03,0x01,0x27,0x03,0x37,0x03,0x02,0x03,0x02,0x02,0x03, -0x07,0x05,0x08,0x00,0x15,0x00,0x3f,0x32,0xdd,0x32,0xce,0x32,0x01,0x2f,0x33,0x71,0x71,0x71,0x71,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x22,0x27,0x37,0x16,0x33,0x32,0x37,0x17,0x06,0x01,0x19,0xa6,0x49,0x59,0x27,0x70,0x66,0x7b,0x1e,0x84,0x86,0x42,0x59,0x20,0x63,0x2c,0x00,0x01,0x00,0x90,0xff,0xe8,0x08,0x69,0x05,0xec,0x00,0x23, -0x00,0x79,0x40,0x4b,0x9b,0x20,0x01,0x85,0x13,0x01,0x76,0x13,0x01,0x67,0x13,0x01,0x85,0x0b,0x01,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x9b,0x06,0x01,0x03,0x01,0x23,0x84,0x0f,0x12,0x84,0x21,0x1d,0x1b,0x19,0x84,0x17,0x80,0x0f,0x01,0x4f,0x21,0x01,0x0f,0x21,0x17,0x17,0x21,0x0f,0x03,0x25,0x09,0x84,0x07,0x23,0x95,0x10,0x00, -0x18,0x09,0x0f,0x1c,0x14,0x95,0x1f,0x0c,0x95,0x02,0x05,0x16,0x1a,0x00,0x15,0x00,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0xed,0x33,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0xc4,0x32,0x10,0xed,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06, -0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x21,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7c,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xfe,0xcb,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd, -0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x08,0x9b,0x05,0xec,0x00,0x28,0x00,0x8c,0x40,0x58,0x85,0x20,0x01,0x66,0x20,0x76,0x20,0x02,0x57,0x20,0x01,0x9b,0x1b,0x01,0x9a,0x10,0x01,0x85,0x03,0x01,0x66,0x03,0x76,0x03, -0x02,0x18,0x16,0x15,0x84,0x24,0x27,0x01,0x84,0x12,0x0d,0x0b,0x07,0x28,0x28,0x09,0x84,0x07,0x20,0x24,0x80,0x24,0x02,0x3f,0x12,0x01,0x10,0x07,0x70,0x07,0x02,0x24,0x12,0x07,0x07,0x12,0x24,0x03,0x2a,0x1e,0x84,0x1c,0x08,0x00,0x95,0x1e,0x27,0x0f,0x14,0x95,0x25,0x00,0x0c,0x04,0x95,0x0f,0x21,0x95,0x17,0x1a,0x16,0x0b,0x15,0x0f, -0x00,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0xed,0x33,0x3f,0xed,0x3f,0xc4,0xfd,0xce,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xc4,0x32,0x10,0xfd,0xc4,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23, -0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x21,0x08,0x9b,0xfd,0x20,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x02,0xe0,0x03,0x68,0xfe,0x50,0xfe,0xba,0xb9, -0x8d,0x01,0x18,0xfd,0x30,0xaa,0xc2,0xd9,0xcd,0x03,0xc6,0xfa,0xac,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfe,0x14,0x00,0x00,0x01,0x00,0x90,0xfe,0x29,0x08,0x69,0x05,0xec,0x00,0x23,0x00,0x81,0x40,0x52,0x92,0x22,0x01,0x85,0x17,0x01,0x66,0x17,0x76,0x17,0x02,0x57,0x17,0x01,0x9b,0x12,0x01,0x8a, -0x03,0x01,0x79,0x03,0x01,0x68,0x03,0x01,0x0f,0x0d,0x0b,0x84,0x1b,0x1f,0x1d,0x07,0x84,0x09,0x23,0x84,0x02,0x20,0x1b,0x80,0x1b,0x02,0x7f,0x09,0x01,0x10,0x02,0x01,0x1b,0x09,0x02,0x02,0x09,0x1b,0x03,0x25,0x15,0x84,0x13,0x1e,0x04,0x95,0x21,0x10,0x0a,0x95,0x1c,0x00,0x15,0x0f,0x18,0x95,0x0e,0x11,0x16,0x01,0x0c,0x15,0x08,0x1b, -0x00,0x3f,0x3f,0xc4,0x3f,0x33,0xed,0x3f,0x3f,0xed,0x3f,0xed,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x33,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20, -0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x33,0x36,0x33,0x20,0x11,0x08,0x69,0xa4,0xee,0x78,0xa4,0xa4,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0x2b,0xfa,0xac,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe, -0xbc,0xb1,0x8f,0x04,0x3a,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x01,0x00,0x90,0xfe,0x29,0x08,0x69,0x05,0xec,0x00,0x25,0x00,0x81,0x40,0x51,0x85,0x21,0x01,0x66,0x21,0x76,0x21,0x02,0x57,0x21,0x01,0x9c,0x1c,0x01,0x9b,0x10,0x01,0x75,0x03,0x85,0x03,0x02,0x66,0x03,0x01,0x16,0x14,0x84,0x19,0x17,0x25,0x02,0x84,0x11,0x0d,0x0b,0x09,0x84, -0x07,0x80,0x25,0x01,0x4f,0x11,0x01,0xc0,0x07,0x01,0x25,0x11,0x07,0x07,0x11,0x25,0x03,0x27,0x1f,0x84,0x1d,0x08,0x1f,0x0f,0x15,0x95,0x17,0x1b,0x22,0x95,0x18,0x1b,0x0c,0x04,0x95,0x0f,0x16,0x0a,0x15,0x12,0x95,0x00,0x00,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x33,0xd4,0x32,0xed,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f, -0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0xc4,0x33,0x10,0xed,0x10,0xc4,0x33,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x03, -0x3e,0x02,0x7c,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xfe,0xcb,0xa5,0xfe,0xb7,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x05,0xec,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0xf9,0x6d,0x98,0x02,0x79,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x00,0x00,0x01, -0x00,0x90,0xfe,0x29,0x0a,0xc2,0x05,0xec,0x00,0x31,0x00,0x90,0x40,0x59,0x85,0x2b,0x01,0x76,0x2b,0x01,0x67,0x2b,0x01,0x83,0x1d,0x01,0x66,0x1d,0x76,0x1d,0x02,0x57,0x1d,0x01,0x9b,0x18,0x01,0x9a,0x09,0x01,0x88,0x09,0x01,0x9b,0x06,0x01,0x15,0x13,0x11,0x84,0x21,0x25,0x23,0x0d,0x84,0x0f,0x29,0x84,0x07,0x03,0x01,0x31,0x84,0x2f, -0x21,0x0f,0x07,0x2f,0x2f,0x07,0x0f,0x21,0x04,0x33,0x1b,0x84,0x19,0x24,0x0a,0x95,0x27,0x10,0x10,0x95,0x22,0x00,0x30,0x1b,0x0f,0x2c,0x95,0x02,0x05,0x1e,0x95,0x14,0x17,0x16,0x01,0x12,0x15,0x0e,0x1b,0x00,0x3f,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0x32,0xed,0x3f,0xc4,0x3f,0xed,0x3f,0xed,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f, -0x2f,0x2f,0x10,0xed,0xc4,0x32,0x10,0xed,0x10,0xfd,0xc4,0x33,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21, -0x11,0x33,0x36,0x33,0x20,0x11,0x15,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x0a,0xc2,0xa4,0x04,0x66,0xc7,0xfe,0xab,0xc1,0x78,0xa4,0xa4,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x04,0x76,0xda,0x01,0x2c,0xdf,0x69,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0xb2,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0x2b,0xfa,0xac, -0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfd,0x6a,0xc2,0xfe,0x5f,0xc1,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x83,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x2b,0x00,0x5a,0x40,0x30,0x0f,0x09,0x1c,0x1b,0x11,0x0e,0x7e,0x01,0x2a,0x14,0x01,0x08,0x09,0x1b,0x01,0x01,0x1b,0x09,0x03,0x2d,0x24,0x00, -0x08,0x14,0x23,0x92,0x24,0x11,0x2b,0x92,0x0e,0x00,0x00,0x00,0x24,0x10,0x24,0x02,0x24,0x24,0x08,0x1c,0x12,0x0b,0x07,0x92,0x08,0x03,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x5d,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xed,0x32,0x11,0x33,0x11,0x33, -0x31,0x30,0x13,0x21,0x2e,0x03,0x23,0x23,0x35,0x21,0x15,0x21,0x16,0x16,0x17,0x21,0x15,0x21,0x06,0x06,0x07,0x15,0x1e,0x03,0x17,0x13,0x23,0x03,0x2e,0x03,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x37,0x21,0x83,0x01,0xe5,0x08,0x25,0x43,0x63,0x44,0xce,0x03,0x87,0xfe,0xb8,0x1d,0x25,0x06,0x01,0x00,0xfe,0xfb,0x15,0x9b,0x77,0x22,0x38, -0x34,0x33,0x1d,0xff,0xbe,0xe4,0x21,0x3b,0x43,0x51,0x36,0x70,0xcd,0x33,0x5c,0x49,0x33,0x0b,0xfe,0x1d,0x04,0x53,0x2a,0x45,0x31,0x1b,0x8c,0x8c,0x25,0x5d,0x39,0x8c,0x78,0xa9,0x20,0x04,0x10,0x2a,0x37,0x48,0x2e,0xfe,0x65,0x01,0x7e,0x37,0x54,0x38,0x1c,0x89,0x21,0x3b,0x53,0x32,0x00,0x02,0x00,0x37,0x00,0x00,0x04,0x1a,0x05,0x9a, -0x00,0x07,0x00,0x0b,0x00,0x3b,0x40,0x1f,0x0b,0x00,0x02,0x7e,0x08,0x05,0x00,0x0d,0x05,0x0c,0x03,0x03,0x0d,0x0c,0x01,0x05,0x91,0x00,0x06,0x10,0x06,0x02,0x06,0x06,0x03,0x08,0x91,0x09,0x03,0x03,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0xed,0x11,0x33,0x31, -0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x25,0x35,0x21,0x15,0x04,0x1a,0xfe,0x62,0xa8,0xfe,0x63,0x03,0xe3,0xfc,0x1d,0x03,0xe3,0x03,0xdc,0xfc,0x24,0x03,0xdc,0x98,0x8e,0x98,0x98,0xff,0xff,0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4c,0x00,0x00,0x00,0x02,0x00,0x5c,0xff,0xe7,0x03,0xf4,0x04,0x19,0x00,0x0d, -0x00,0x18,0x00,0x22,0xbc,0x00,0x00,0x01,0x86,0x00,0x0e,0x00,0x13,0x01,0x86,0x40,0x09,0x08,0x10,0x9a,0x0b,0x10,0x16,0x9a,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf4, -0x3d,0x77,0xaf,0x72,0xd9,0xea,0xf4,0xeb,0xe0,0xd9,0xac,0xfe,0xe9,0x8f,0x9c,0x91,0x90,0x8c,0x95,0x02,0x04,0x83,0xc9,0x8a,0x47,0x01,0x06,0xff,0x01,0x14,0x01,0x19,0xfe,0xf0,0xfe,0xf5,0x01,0x93,0xcb,0xd0,0xbf,0xc8,0xcd,0x00,0x00,0x01,0x00,0x79,0x00,0x00,0x02,0x71,0x04,0x1e,0x00,0x0e,0x00,0x24,0xbc,0x00,0x00,0x01,0x86,0x00, -0x01,0x00,0x08,0x01,0x81,0x40,0x09,0x02,0x0d,0x07,0x07,0x01,0x0d,0x10,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0x71,0xac,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x46,0x03,0x3b,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f, -0x33,0x3f,0x45,0x21,0x00,0x01,0x00,0x99,0x00,0x00,0x03,0xd3,0x04,0x1b,0x00,0x26,0x00,0x34,0xb9,0x00,0x1b,0x01,0x86,0xb5,0x12,0x0a,0x0a,0x00,0x25,0x24,0xb8,0x01,0x86,0xb6,0x00,0x03,0x0a,0x12,0x03,0x24,0x0d,0xb8,0x01,0x7f,0xb5,0x16,0x10,0x24,0x99,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x2f,0x12, -0x39,0x2f,0x39,0xed,0x31,0x30,0x33,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x06,0x15,0x21,0x15,0x99,0x32,0x53,0x69,0x6e,0x69,0x53,0x32,0x7a,0x67,0x27,0x55,0x57,0x54,0x25,0x48,0xb5,0x67,0x5b,0x8a,0x5e,0x30,0x33,0x52,0x6a,0x6f,0x6a,0x52,0x33,0x02,0x93, -0x58,0x48,0x6d,0x56,0x44,0x3b,0x3a,0x40,0x4e,0x33,0x55,0x5d,0x12,0x20,0x2c,0x1a,0x9d,0x36,0x31,0x2b,0x4f,0x70,0x45,0x40,0x67,0x55,0x46,0x3e,0x39,0x3b,0x3f,0x26,0x93,0x00,0x00,0x01,0x00,0x7b,0xfe,0x50,0x03,0xb8,0x04,0x1b,0x00,0x2a,0x00,0x43,0x40,0x1b,0x16,0x89,0x1b,0x13,0x25,0x03,0x08,0x23,0x23,0x08,0x00,0x89,0x0f,0x0f, -0x2c,0x08,0x25,0x12,0x9a,0x08,0x05,0x1b,0x1e,0x13,0x13,0x05,0x18,0xb8,0x01,0x7f,0xb4,0x1e,0x10,0x0a,0x9a,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02, -0x35,0x10,0x21,0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb8,0x4a,0x85,0xb9,0x6f,0xcb,0x7b,0x91,0xbb,0x4a,0x7a,0x56,0x2f,0xfe,0x71,0x77,0x71,0x01,0x62,0xfe,0xf2,0x4b,0x90,0x42,0x88,0xbe,0x5b,0x92,0x68,0x38,0xfe,0xe1,0x4b,0x7c,0x59,0x32,0x02,0x60, -0x9f,0x71,0x3e,0x4e,0xb0,0x73,0x27,0x48,0x66,0x40,0x01,0x18,0x8b,0x01,0x09,0xf3,0x33,0x33,0xa0,0x52,0x32,0x5b,0x7e,0x4b,0xfe,0xe6,0x53,0x04,0x07,0x37,0x59,0x78,0x00,0x02,0x00,0x32,0xfe,0x68,0x04,0x2e,0x04,0x02,0x00,0x0e,0x00,0x15,0x00,0x31,0xb2,0x10,0x0e,0x05,0xb8,0x01,0x85,0x40,0x12,0x0f,0x09,0x06,0x06,0x17,0x09,0x11, -0x07,0x0e,0x10,0x09,0x01,0x10,0x9a,0x04,0x07,0x18,0x06,0x00,0x2f,0x3f,0x33,0xed,0x32,0x32,0x3f,0x12,0x39,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x76,0xb8,0xb8,0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe, -0x24,0x01,0xe9,0x46,0x83,0x7b,0x72,0x04,0x02,0xfc,0x83,0x85,0xfe,0x68,0x01,0x98,0x7d,0x64,0xe3,0xea,0xe9,0x6b,0xfc,0x83,0x02,0x89,0x75,0xbc,0x9b,0x82,0x00,0x01,0x00,0xa4,0xfe,0x4d,0x03,0xc9,0x04,0x00,0x00,0x23,0x00,0x35,0xb9,0x00,0x1c,0x01,0x85,0xb3,0x17,0x17,0x08,0x00,0xb8,0x01,0x86,0xb2,0x0f,0x08,0x12,0xb8,0x01,0x7f, -0xb7,0x1f,0x1f,0x0a,0x1b,0x99,0x18,0x0f,0x0a,0xb9,0x01,0x7f,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e, -0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92,0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97,0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x1c,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00, -0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x36,0xb3,0x12,0x2b,0x19,0x00,0xbb,0x01,0x86,0x00,0x21,0x00,0x19,0x01,0x86,0x40,0x0c,0x0a,0x26,0x9a,0x19,0x1c,0x1c,0x30,0x14,0x9a,0x0f,0x06,0x30,0xb8,0x01,0x7f,0xb1,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x2f, -0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8, -0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e,0x3b,0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d, -0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37,0x2f,0x54,0x75,0x00,0x00,0x01,0x00,0x45,0xfe,0x66,0x03,0xd5,0x04,0x00,0x00,0x12,0x00,0x22,0xb9,0x00,0x07,0x01,0x86,0x40,0x0c,0x0f,0x08,0x08,0x00,0x10,0x00,0x00,0x10,0x99,0x11,0x0f,0x08,0x00,0x2f,0x3f,0xed,0x39,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x0e,0x03,0x02, -0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02,0x37,0x21,0x35,0x21,0x03,0xd5,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x03,0xa1,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x03,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2, -0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x47,0x40,0x25,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x00,0x05,0x15,0x33,0x9a,0x3d,0x3d,0x0d,0x29,0x99,0x1f,0x18,0x47,0x9a,0x0d,0x06,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f, -0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02, -0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c,0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31, -0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35,0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f,0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57, -0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58,0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xfe,0x4e,0x03,0xec,0x04,0x19,0x00,0x20,0x00,0x34,0x00,0x33,0x40,0x16,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36,0x2b,0x89,0x17,0x30,0x99,0x0f,0x12,0x12,0x05,0x26,0x9a,0x1c,0x10,0x0a,0xb9,0x01,0x7f,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed, -0x11,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec, -0x4e,0x96,0xd8,0x8a,0x8e,0x6c,0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b,0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x01,0x8a,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a, -0xb0,0x7f,0x46,0x57,0xa7,0xf4,0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49,0x63,0xff,0xff,0x00,0x5c,0xff,0xe7,0x03,0xf4,0x04,0x19,0x02,0x06,0x0c,0xb9,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x02,0xe0,0x04,0x1e,0x00,0x0e,0x00,0x24,0xbc,0x00,0x00,0x01,0x86,0x00,0x01,0x00,0x08,0x01,0x81,0x40, -0x09,0x02,0x0d,0x07,0x07,0x01,0x0d,0x10,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0xe0,0xac,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x46,0x03,0x3b,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0xff,0xff, -0x00,0x99,0x00,0x00,0x03,0xd3,0x04,0x1b,0x02,0x06,0x0c,0xbb,0x00,0x00,0xff,0xff,0x00,0x7b,0xfe,0x50,0x03,0xb8,0x04,0x1b,0x02,0x06,0x0c,0xbc,0x00,0x00,0xff,0xff,0x00,0x32,0xfe,0x68,0x04,0x2e,0x04,0x02,0x00,0x06,0x0c,0xbd,0x00,0x00,0xff,0xff,0x00,0xa4,0xfe,0x4d,0x03,0xc9,0x04,0x00,0x02,0x06,0x0c,0xbe,0x00,0x00,0xff,0xff, -0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x02,0x06,0x0c,0xbf,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x66,0x03,0xf0,0x04,0x00,0x00,0x06,0x0c,0xc0,0x1b,0x00,0xff,0xff,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2,0x02,0x06,0x0c,0xc1,0x00,0x00,0xff,0xff,0x00,0x5e,0xfe,0x4e,0x03,0xec,0x04,0x19,0x02,0x06,0x0c,0xc2,0x00,0x00,0x00,0x02, -0x00,0x56,0xff,0xe7,0x03,0xfc,0x05,0xb2,0x00,0x10,0x00,0x18,0x00,0x20,0x40,0x10,0x00,0x89,0x11,0x11,0x1a,0x15,0x89,0x0a,0x13,0x9a,0x0f,0x07,0x17,0x9a,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x20,0x03, -0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x03,0xfc,0x41,0x7b,0xb3,0x72,0x6c,0xa9,0x74,0x3c,0x3f,0x7a,0xb5,0x75,0x01,0xc3,0xa8,0xfe,0xdd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x02,0xd3,0xb4,0xfe,0xea,0xbf,0x63,0x5f,0xb6,0x01,0x09,0xab,0xbc,0x01,0x20,0xc3,0x63,0xfd,0x11,0x02,0x64,0xfd,0x91,0xfd,0xbb,0x00,0x00,0x01,0x00,0x53,0x00,0x00, -0x02,0x43,0x05,0xba,0x00,0x0e,0x00,0x28,0x40,0x13,0x0e,0x8a,0x00,0x06,0x00,0x06,0x00,0x0f,0x10,0x07,0x99,0x01,0x0c,0x06,0x06,0x0c,0x07,0x00,0x18,0x00,0x3f,0x3f,0x39,0x2f,0x12,0x39,0xed,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x21,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x11,0x01,0x9f,0x13,0x49,0x5b, -0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x3e,0x04,0xd7,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0xfa,0x46,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x03,0xe2,0x05,0xb2,0x00,0x2a,0x00,0x2e,0x40,0x17,0x1e,0x13,0x89,0x0a,0x21,0x00,0x00,0x2c,0x1d,0x89,0x21,0x00,0x0e,0x1d,0x99,0x20,0x18,0x0a,0x0a,0x05,0x9a,0x0e,0x07,0x00, -0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x32,0x31,0x30,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x21,0x15,0x21,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x03,0x04,0x29,0x47,0x60,0x38,0x30,0x5c,0x57,0x51, -0x23,0x45,0xab,0x7b,0x58,0x96,0x6e,0x3f,0x27,0x4f,0x78,0x51,0x65,0x83,0x4d,0x1f,0x02,0xca,0xfc,0x8b,0x28,0x5c,0x95,0x6c,0x4e,0x69,0x40,0x1b,0x04,0x22,0x42,0x62,0x41,0x20,0x1a,0x2e,0x40,0x27,0xb0,0x43,0x47,0x33,0x62,0x90,0x5d,0x55,0x8a,0x7a,0x70,0x3a,0x48,0x66,0x59,0x59,0x3a,0x93,0x47,0x5c,0x8c,0x7e,0x7e,0x4f,0x38,0x66, -0x66,0x69,0x00,0x01,0x00,0x7b,0xff,0xe7,0x03,0xb9,0x05,0xb2,0x00,0x29,0x00,0x55,0x40,0x32,0x16,0x89,0x1a,0x13,0x24,0x03,0x08,0x22,0x22,0x08,0x00,0x89,0x0f,0x0f,0x2b,0x08,0x39,0x1a,0x01,0x2f,0x1a,0x01,0x1a,0x1a,0x18,0x9a,0x1d,0x24,0x12,0x9a,0x13,0x13,0x1d,0x07,0x36,0x08,0x01,0x00,0x08,0x10,0x08,0x20,0x08,0x03,0x08,0x08, -0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x3f,0x39,0x2f,0xed,0x39,0x10,0xed,0x32,0x2f,0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36, -0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb9,0x49,0x85,0xba,0x70,0xcd,0x79,0x91,0xbb,0x4b,0x79,0x57,0x2f,0xfe,0x70,0x77,0x71,0x01,0x62,0xfe,0xf2,0x98,0x85,0x89,0xbd,0x5a,0x92,0x68,0x39,0xfe,0xe2,0x49,0x7c,0x5a,0x33,0x01,0x96,0x61,0x9f,0x71,0x3e,0x4e,0xb0,0x72,0x26,0x48,0x66,0x40,0x01,0x19,0x8b,0x01,0x08, -0xf4,0x66,0x9f,0x52,0x32,0x5a,0x7e,0x4c,0xfe,0xe5,0x51,0x04,0x08,0x37,0x58,0x77,0x00,0x02,0x00,0x32,0x00,0x00,0x04,0x56,0x05,0x9a,0x00,0x0e,0x00,0x15,0x00,0x2e,0x40,0x16,0x10,0x0e,0x04,0x8a,0x07,0x07,0x17,0x0f,0x09,0x04,0x08,0x99,0x09,0x01,0x0f,0x0f,0x06,0x11,0x0e,0x06,0x06,0x18,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x33, -0x33,0xed,0x32,0x01,0x2f,0x33,0x12,0x39,0x2f,0xed,0x33,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x76,0xe0,0xe0,0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe,0x24,0x01,0xe9,0x4b,0x86,0x79,0x6e,0x05,0x9a,0xfc,0x4d,0x96,0xfe,0xaf,0x01,0x51,0x8e,0x6a,0xf1, -0xf8,0xf7,0x71,0xfc,0x4d,0x02,0xbe,0x83,0xce,0xa8,0x88,0x00,0x00,0x01,0x00,0xa4,0xff,0xe7,0x03,0xc9,0x05,0x9a,0x00,0x23,0x00,0x3d,0x40,0x21,0x1c,0x8a,0x1a,0x17,0x17,0x08,0x00,0x89,0x0f,0x0f,0x25,0x08,0x12,0x9a,0x1f,0x1f,0x0a,0x1b,0x99,0x18,0x06,0x32,0x08,0x01,0x20,0x08,0x01,0x08,0x08,0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed, -0x32,0x2f,0x5d,0x5d,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e,0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92, -0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97,0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x01,0xb6,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2, -0x00,0x20,0x00,0x34,0x00,0x37,0x40,0x1c,0x12,0x0a,0x00,0x89,0x21,0x21,0x36,0x2b,0x19,0x89,0x0a,0x26,0x9a,0x1a,0x1c,0x1c,0x30,0x0f,0x12,0x12,0x14,0x9a,0x0f,0x07,0x30,0x9a,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14,0x0e, -0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8,0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e,0x3b, -0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d,0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37,0x2f, -0x54,0x75,0x00,0x01,0x00,0x45,0x00,0x00,0x03,0xd5,0x05,0x9a,0x00,0x12,0x00,0x24,0x40,0x11,0x07,0x89,0x0f,0x00,0x08,0x00,0x08,0x00,0x14,0x10,0x00,0x10,0x99,0x11,0x06,0x08,0x18,0x00,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x01,0x0e,0x03,0x02,0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02, -0x37,0x21,0x35,0x21,0x03,0xd5,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x05,0x3b,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x03,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2,0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x47, -0x40,0x25,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x00,0x15,0x05,0x33,0x9a,0x3d,0x3d,0x0d,0x29,0x99,0x1f,0x19,0x47,0x9a,0x0d,0x07,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39, -0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02, -0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c,0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31,0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35, -0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f,0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57,0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58, -0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xff,0xe7,0x03,0xec,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x35,0x40,0x1b,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36,0x2b,0x89,0x17,0x30,0x99,0x0f,0x12,0x12,0x05,0x26,0x9a,0x1c,0x07,0x08,0x08,0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x2f,0x39,0xed,0x01, -0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec,0x4e,0x96,0xd8,0x8a,0x8e,0x6c, -0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b,0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x03,0x23,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a,0xb0,0x7f,0x46,0x57,0xa7,0xf4, -0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49,0x63,0x00,0x02,0x00,0x56,0xff,0xe8,0x03,0xfc,0x05,0xb2,0x00,0x0a,0x00,0x12,0x00,0x88,0x40,0x1a,0x0f,0x9a,0x00,0x19,0x0b,0x9a,0x06,0x07,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x89,0x11,0xb8,0xff,0xf0,0xb3, -0x0d,0x06,0x4d,0x11,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x30,0x11,0x01,0x11,0xb8,0xff,0xe0,0x40,0x1d,0x0b,0x06,0x4d,0x20,0x11,0x40,0x11,0x02,0x11,0x11,0x14,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x89,0x03,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d, -0x03,0xb8,0xff,0xe0,0xb6,0x0b,0x06,0x4d,0x2f,0x03,0x01,0x03,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x05,0x22,0x02,0x11,0x10,0x12,0x33,0x20,0x11,0x10,0x02,0x03,0x20,0x11,0x10,0x21,0x20,0x11,0x10,0x02,0x1a,0xd5,0xef,0xf9, -0xeb,0x01,0xc2,0xfe,0xcd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x18,0x01,0x6e,0x01,0x5a,0x01,0x7c,0x01,0x86,0xfd,0x21,0xfe,0x94,0xfe,0x81,0x05,0x3f,0xfd,0x91,0xfd,0xba,0x02,0x50,0x02,0x65,0x00,0x01,0x00,0xa8,0x00,0x00,0x03,0xdb,0x05,0xba,0x00,0x09,0x00,0x7e,0xb5,0x26,0x06,0x36,0x06,0x02,0x06,0xb8,0xff,0xf8,0x40,0x2d,0x0d,0x06, -0x4d,0x04,0x08,0x0d,0x06,0x4d,0x06,0x04,0x07,0x05,0x08,0x02,0x99,0x01,0x18,0x05,0x07,0x07,0x01,0x05,0x01,0x00,0x01,0x00,0x01,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x8a,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xd0,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xd6,0xb3,0x0b, -0x06,0x4d,0x03,0xb8,0xff,0xf0,0xb6,0x0b,0x01,0x4d,0x03,0x03,0x0b,0x0a,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x33,0x2f,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x33,0x3f,0xed,0x32,0x2f,0x12,0x39,0x39,0x2b,0x2b,0x31,0x30,0x5d,0x21,0x21,0x35,0x21,0x11,0x05,0x35,0x25,0x11,0x21,0x03,0xdb,0xfc,0xd5,0x01,0x44, -0xfe,0xb4,0x01,0xf0,0x01,0x43,0x90,0x04,0x5a,0x63,0x9c,0x97,0xfa,0xd6,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0xcd,0x05,0xb2,0x00,0x17,0x00,0xa3,0xb3,0x78,0x08,0x01,0x15,0xb8,0xff,0xe8,0x40,0x36,0x0c,0x00,0x4d,0x11,0x06,0x0e,0x02,0x15,0x99,0x01,0x18,0x0b,0x0b,0x09,0x9a,0x0e,0x07,0x0b,0x00,0x10,0x0c,0x06,0x4d,0x00,0x18,0x0b, -0x0d,0x01,0x4c,0x00,0x00,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x11,0x8a,0x20,0x06,0x30,0x06,0x02,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x19,0x0b,0xb8,0xff,0xf8,0x40,0x0c,0x0d,0x06,0x4d,0x0b, -0x16,0x20,0x0b,0x0c,0x01,0x4c,0x16,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x33,0x2b,0x33,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x2b,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x12,0x39,0x39,0x31,0x30,0x01,0x2b,0x5d,0x21, -0x21,0x35,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x07,0x01,0x15,0x21,0x03,0xc0,0xfc,0xa0,0x01,0xa2,0xa0,0x89,0x8e,0x83,0xc0,0xb0,0xa8,0xdf,0xc0,0xdc,0x98,0xc5,0xfe,0xb5,0x02,0x9b,0x92,0x01,0xa3,0xa0,0xd5,0x79,0x7c,0x88,0xa4,0xac,0x83,0xd0,0xaf,0x8a,0xfe,0xf9,0xc3,0xfe,0xb9, -0x04,0x00,0x00,0x01,0x00,0x83,0xff,0xe8,0x03,0xc0,0x05,0xb2,0x00,0x21,0x00,0xe5,0x40,0x3a,0x76,0x1c,0x01,0x74,0x16,0x01,0x7a,0x00,0x01,0x12,0x11,0x00,0x01,0x19,0x09,0x9a,0x0a,0x0a,0x14,0x34,0x01,0x01,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x01,0x01,0x03,0x9a,0x20,0x19,0x3b,0x11,0x01,0x2f,0x11,0x01,0x11,0x11,0x0f,0x9a,0x14, -0x07,0x19,0x09,0x10,0x0c,0x06,0x4d,0x09,0x70,0x11,0x01,0x11,0xb8,0xff,0xf0,0x40,0x3f,0x0d,0x06,0x4d,0x11,0x17,0x06,0x0c,0x06,0x4d,0x17,0x06,0x0b,0x06,0x4d,0x17,0x89,0x0d,0x10,0x0d,0x06,0x4d,0x0d,0x10,0x0c,0x06,0x4d,0x0d,0x14,0x0b,0x06,0x4d,0x0d,0x09,0x11,0x0d,0x03,0x00,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d, -0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x89,0x7f,0x06,0x01,0x06,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x23,0x00,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0x11, -0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x12,0x17,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2f,0x2b,0x5d,0x2f,0x2b,0x39,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x11,0x39,0x2f,0xed,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35, -0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x83,0x93,0xb9,0x96,0xb3,0xfe,0x71,0x77,0x71,0x01,0x63,0xfe,0xf1,0x97,0x86,0x8a,0xbc,0xb5,0xd9,0xfe,0xe0,0x9b,0xb7,0xfe,0xeb,0xe3,0xcc,0x35,0xb1,0x74,0x96,0x7f,0x01,0x19,0x8b,0x01,0x08,0xf4,0x67,0xa0,0x52, -0xc0,0x96,0xfe,0xe5,0x51,0x04,0x0f,0xbb,0x8c,0xc1,0xed,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x8a,0x40,0x16,0x39,0x07,0x79,0x07,0x02,0x76,0x06,0x01,0x09,0x00,0x00,0x02,0x06,0x0b,0x0d,0x06,0x4c,0x02,0x8a,0x0b,0x07,0x03,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xd6,0xb4, -0x0b,0x0c,0x06,0x4c,0x03,0xb8,0xff,0xe0,0xb3,0x0d,0x01,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0b,0x0c,0x01,0x4c,0x03,0x03,0x14,0x12,0x05,0xb8,0xff,0xf8,0x40,0x15,0x0c,0x0d,0x06,0x4c,0x2f,0x05,0x3f,0x05,0x4f,0x05,0x03,0x05,0x01,0x05,0x9a,0x09,0x06,0x12,0x12,0x03,0x0f,0xb8,0xff,0xf0,0xb7,0x0c,0x00,0x4d,0x0f,0x07,0x06,0x03, -0x18,0x00,0x3f,0x3f,0x33,0x2b,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0x5d,0x2b,0x32,0x11,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x33,0x33,0xe9,0x2b,0x32,0x2f,0x32,0x31,0x30,0x00,0x5d,0x01,0x5d,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x01,0x33,0x11,0x33,0x21,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x04,0x0a,0xb8,0xa2,0xfd,0x5e,0x02, -0x7e,0xc6,0xb8,0xfe,0xa6,0x04,0x04,0x0e,0x29,0xfe,0x47,0x01,0x7d,0xfe,0x83,0x01,0x7d,0x6b,0x03,0xb2,0xfc,0x68,0x02,0x6c,0x42,0x52,0x24,0x4a,0xfd,0x6e,0x00,0x01,0x00,0xa4,0xff,0xe8,0x03,0xc8,0x05,0x9a,0x00,0x19,0x00,0xb1,0x40,0x32,0x7a,0x00,0x01,0x00,0x01,0x0b,0x09,0x9a,0x12,0x12,0x0c,0x20,0x01,0x30,0x01,0x02,0x01,0x01, -0x03,0x9a,0x18,0x19,0x0f,0x99,0x0c,0x06,0x0e,0x00,0x0e,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x89,0x7f,0x06,0x01,0x06,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x1b,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xe0,0x40,0x14, -0x0c,0x06,0x4d,0x00,0x10,0x06,0x0c,0x06,0x4d,0x10,0x0e,0x0b,0x06,0x4d,0x10,0x8b,0x70,0x0b,0x01,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0b,0x20,0x0d,0x01,0x4d,0x0b,0x2f,0x2b,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x33,0x2b,0x2b,0x12,0x39, -0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x39,0x2f,0xed,0x32,0x11,0x33,0x31,0x30,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x21,0x15,0x21,0x11,0x36,0x33,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0xa4,0x93,0x98,0x98,0xba,0xbe,0xb1,0x3c,0xa5, -0x02,0xb6,0xfd,0xe5,0x42,0x38,0xe6,0xfc,0xfe,0xf1,0xec,0xc7,0x23,0xae,0x5f,0xac,0x8e,0x8d,0x9e,0x0c,0x02,0xcf,0x94,0xfe,0x5c,0x04,0xe7,0xc9,0xd0,0xfe,0x00,0x02,0x00,0x6e,0xff,0xe8,0x03,0xfe,0x05,0xb2,0x00,0x16,0x00,0x22,0x00,0xae,0x40,0x3b,0x7a,0x14,0x01,0x76,0x0a,0x01,0x29,0x14,0x39,0x14,0x02,0x06,0x0f,0x15,0x17,0x9a, -0x09,0x09,0x15,0x1d,0x9a,0x0f,0x19,0x01,0x01,0x03,0x9a,0x15,0x07,0x01,0x40,0x0c,0x00,0x4d,0x01,0x01,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x89,0x20,0x20,0x30,0x20,0x02,0x20,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x20,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x20,0xb8,0xff,0xe4,0x40,0x19, -0x0b,0x06,0x4d,0x20,0x20,0x24,0x1a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x89,0x12,0xb8,0xff,0xd4,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xd6,0xb3,0x0c,0x06,0x4d,0x12,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x12,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b, -0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x01,0x15,0x26,0x23,0x22,0x02,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x02,0x11,0x10,0x00,0x21,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03, -0xa6,0x6f,0x7b,0xbf,0xe5,0x04,0x64,0xe4,0xbc,0xde,0xfe,0xc4,0xd8,0xf6,0x01,0x42,0x01,0x08,0x96,0xfe,0xf2,0x7f,0x9e,0x9d,0x82,0x7c,0x98,0x92,0x05,0x89,0x9b,0x39,0xfe,0xac,0xfe,0xe3,0xcb,0xf1,0xca,0xd3,0xfe,0xf5,0x01,0x58,0x01,0x37,0x01,0x79,0x01,0xc2,0xfd,0x44,0xac,0x75,0x93,0xd0,0xb5,0x8b,0x98,0xac,0x00,0x01,0x00,0x56, -0x00,0x00,0x03,0xf2,0x05,0x9a,0x00,0x06,0x00,0xbc,0x40,0x0b,0x73,0x01,0x01,0x02,0x18,0x00,0x04,0x99,0x05,0x06,0x03,0xb8,0xff,0xd8,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x01,0x28,0x0b,0x0d,0x01,0x4c,0x03,0xb8,0xff,0xf4,0x40,0x09,0x0d,0x06,0x4d,0x01,0x0c,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x01,0x10,0x0c, -0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x14,0x0b,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0x03,0x00,0x02,0x02,0x04,0x20,0x00,0x30,0x00,0x02,0x00,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf0,0x40,0x0d,0x0b,0x06,0x4d,0x00,0x20,0x0b,0x0c,0x01,0x4c,0x00,0x00,0x08,0x04,0xb8,0xff, -0xe0,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xe0,0x40,0x0e,0x0b,0x06,0x4d,0x04,0x40,0x0b,0x01,0x4d,0x04,0x40,0x0b,0x00,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x5d,0x12,0x39,0x2f,0x12,0x39,0x39,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xed, -0x39,0x3f,0x31,0x30,0x01,0x5d,0x01,0x01,0x23,0x01,0x21,0x35,0x21,0x03,0xf2,0xfd,0xc8,0xaa,0x02,0x19,0xfd,0x2d,0x03,0x9c,0x05,0x66,0xfa,0x9a,0x05,0x06,0x94,0x00,0x00,0x03,0x00,0x64,0xff,0xe8,0x03,0xee,0x05,0xb2,0x00,0x15,0x00,0x1f,0x00,0x29,0x00,0xfa,0x40,0x26,0x7b,0x13,0x01,0x7b,0x0f,0x01,0x74,0x08,0x01,0x74,0x04,0x01, -0x76,0x07,0x01,0x29,0x08,0x0b,0x00,0x4d,0x35,0x1f,0x01,0x36,0x0a,0x01,0x36,0x1d,0x01,0x76,0x1e,0x01,0x20,0x08,0x0d,0x06,0x4d,0x1e,0xb8,0xff,0xf8,0x40,0x38,0x0d,0x06,0x4d,0x20,0x00,0x0b,0x03,0x1e,0x1e,0x06,0x25,0x9a,0x11,0x19,0x19,0x9a,0x06,0x07,0x00,0x0b,0x1e,0x20,0x04,0x03,0x16,0x89,0x09,0x18,0x0d,0x01,0x4d,0x09,0x09, -0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x89,0x20,0x28,0x30,0x28,0x02,0x28,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x28,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x28,0xb8,0xff,0xe8,0x40,0x0a,0x0b,0x06,0x4d,0x28,0x28,0x2b,0x14,0x1c,0x89,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff, -0xf8,0x40,0x17,0x0b,0x06,0x4d,0x03,0x03,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0x08,0x0b,0x06,0x4d,0x22,0x89,0x14,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x14,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x14,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x14,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0x2b,0xe9,0x11, -0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0xe9,0x12,0x17,0x39,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x17,0x33,0x2b,0x2b,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x2b,0x01,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x35,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x05,0x15,0x04,0x11,0x14,0x04,0x23,0x22,0x26, -0x35,0x10,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x07,0x04,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x9a,0xfe,0xfe,0xec,0xba,0xa8,0xd8,0xfe,0xf6,0x01,0x3a,0xff,0x00,0xe4,0xb8,0xee,0x02,0xb2,0x7c,0x6b,0x64,0x8b,0xe9,0xed,0xf8,0xfe,0xee,0x9f,0x82,0x7c,0x9d,0x02,0xf0,0x04,0x78,0xe4,0x9b,0xc7,0xba,0x92,0xee, -0x84,0x04,0x70,0xfe,0xec,0xb2,0xd2,0xd0,0xa6,0x01,0x14,0x01,0xe0,0x63,0x72,0x77,0x5c,0xbb,0x5f,0x62,0xfa,0x6d,0xcf,0x6b,0x89,0x87,0x67,0xd8,0x00,0x02,0x00,0x5e,0xff,0xe8,0x03,0xec,0x05,0xb2,0x00,0x17,0x00,0x23,0x00,0xc1,0x40,0x29,0x79,0x14,0x01,0x74,0x15,0x01,0x76,0x04,0x01,0x2d,0x04,0x3d,0x04,0x02,0x29,0x14,0x39,0x14, -0x02,0x08,0x10,0x0a,0x9a,0x1e,0x1e,0x10,0x70,0x01,0x01,0x01,0x01,0x03,0x9a,0x16,0x19,0x18,0x9a,0x10,0x07,0x21,0x00,0xb8,0xff,0xea,0x40,0x17,0x0c,0x06,0x4d,0x00,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x21,0x13,0x89,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb3,0x0c, -0x06,0x4d,0x06,0xb8,0xff,0xe8,0x40,0x1e,0x0b,0x06,0x4d,0x20,0x06,0x30,0x06,0x02,0x06,0x06,0x25,0x00,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x89,0x0d,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x0d,0x2f,0x2b, -0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x33,0x2b,0x2b,0x2b,0x2f,0x2b,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x37,0x35,0x16,0x33,0x32,0x12,0x11,0x06,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x00,0x33,0x32,0x12, -0x11,0x10,0x00,0x21,0x22,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0xac,0x78,0x86,0xc3,0xd9,0x02,0x02,0x5c,0xe4,0xb8,0xec,0x01,0x03,0xca,0xd4,0xed,0xfe,0xcc,0xfe,0xee,0x90,0x01,0x06,0x77,0x9f,0x9c,0x85,0x74,0xa1,0xa0,0x18,0x9e,0x44,0x01,0x3a,0x01,0x21,0x01,0x01,0xb9,0xfa,0xc5,0xd2,0x01,0x0d,0xfe,0xb1, -0xfe,0xc0,0xfe,0x73,0xfe,0x52,0x05,0x3f,0xb3,0x8a,0x97,0xad,0x9e,0x72,0xa3,0xce,0x00,0x02,0x00,0x48,0xff,0xec,0x02,0xa5,0x03,0x66,0x00,0x0a,0x00,0x12,0x00,0x20,0x40,0x10,0x08,0xcc,0x11,0x11,0x14,0x0d,0xcc,0x03,0x0b,0xe7,0x06,0x2b,0x0f,0xe7,0x00,0x2d,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30, -0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x11,0x10,0x33,0x32,0x11,0x10,0x01,0x6d,0x8b,0x9a,0xa1,0x99,0x01,0x23,0xa3,0x87,0xa9,0xa6,0xa4,0x14,0xdb,0xd1,0xe5,0xe9,0xfe,0x47,0xdb,0xe6,0x03,0x03,0xfe,0xaf,0xfe,0xc6,0x01,0x40,0x01,0x4b,0x00,0xff,0xff,0x00,0x50,0x00,0x01,0x01,0xc2,0x03,0x69,0x01,0x07, -0x00,0xf0,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x00,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x68,0x00,0x01,0x02,0x92,0x03,0x67,0x03,0x07,0x00,0xf1,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x01,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x02,0x8e,0x03,0x67,0x03,0x07,0x00,0xf2,0x00,0x00,0xfd,0xb9,0x00,0x07, -0xb2,0x00,0x1f,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x2f,0x00,0x01,0x02,0xaa,0x03,0x53,0x01,0x07,0x02,0x38,0x00,0x00,0xfd,0xb9,0x00,0x09,0xb3,0x01,0x00,0x03,0x2c,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x7b,0xff,0xec,0x02,0x8a,0x03,0x57,0x03,0x07,0x02,0x39,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x23,0x2d,0x00,0x3f, -0x35,0x00,0x00,0x02,0x00,0x49,0xff,0xec,0x02,0xa6,0x03,0x66,0x00,0x26,0x00,0x36,0x00,0x2f,0x40,0x18,0x01,0x15,0xcd,0x34,0x34,0x38,0x2c,0x0c,0xcc,0x1f,0x27,0xe7,0x0c,0x10,0x10,0x31,0x06,0xe6,0x24,0x2b,0x31,0xe6,0x1a,0x2d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x32,0x31, -0x30,0x01,0x15,0x2e,0x03,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x63,0x0e,0x28,0x2b,0x2c,0x12,0x39,0x55,0x21,0x1f,0x2d,0x04,0x1d,0x6e,0x4e, -0x3c,0x5f,0x42,0x23,0x2d,0x4f,0x6b,0x3d,0x3f,0x72,0x56,0x32,0x38,0x65,0x8c,0x54,0x2b,0x52,0xc1,0x22,0x3c,0x2c,0x1a,0x15,0x29,0x3a,0x25,0x4b,0x55,0x4d,0x03,0x43,0x81,0x09,0x10,0x0c,0x07,0x24,0x24,0x22,0x7f,0x61,0x32,0x41,0x27,0x47,0x63,0x3d,0x3d,0x68,0x4d,0x2b,0x31,0x63,0x98,0x68,0x75,0xb5,0x7c,0x40,0x12,0xfe,0x59,0x15, -0x28,0x38,0x24,0x22,0x41,0x32,0x1e,0x5b,0x49,0x4e,0x5a,0x00,0xff,0xff,0x00,0x4d,0x00,0x01,0x02,0xa0,0x03,0x5d,0x03,0x07,0x02,0x3a,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x00,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x41,0xff,0xed,0x02,0xad,0x03,0x67,0x03,0x07,0x02,0x3b,0x00,0x00,0xfd,0xb9,0x00,0x0b,0xb4,0x02,0x01,0x00, -0x1f,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0x00,0x02,0x00,0x49,0xff,0xeb,0x02,0xa6,0x03,0x66,0x00,0x27,0x00,0x39,0x00,0x31,0x40,0x19,0x2d,0xcc,0x23,0x10,0x35,0x1a,0xcd,0x06,0x05,0x05,0x10,0x3b,0x30,0xe7,0x0b,0x0b,0x28,0x00,0xe6,0x1f,0x2d,0x28,0xe6,0x15,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x12,0x01,0x39, -0x2f,0x10,0xed,0x33,0x2f,0x33,0xed,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x1e,0x03,0x13,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x34,0x42,0x5e,0x3c,0x1b,0x04,0x0d,0x2b, -0x37,0x42,0x24,0x3c,0x61,0x46,0x26,0x2a,0x4d,0x6c,0x41,0x40,0x71,0x56,0x32,0x30,0x5d,0x8a,0x5b,0x30,0x61,0x26,0x13,0x2e,0x30,0x30,0x52,0x21,0x39,0x2a,0x18,0x52,0x45,0x20,0x3d,0x2f,0x1d,0x19,0x2c,0x3c,0x62,0x33,0x5c,0x7e,0x4b,0x1c,0x2f,0x21,0x13,0x26,0x47,0x63,0x3c,0x3f,0x6a,0x4c,0x2a,0x33,0x65,0x96,0x64,0x69,0xb4,0x82, -0x4a,0x17,0x16,0x7f,0x0b,0x13,0x0f,0x08,0x02,0x8e,0x17,0x2c,0x3e,0x28,0x4c,0x56,0x16,0x26,0x33,0x1d,0x2a,0x47,0x32,0x1c,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x00,0x07,0x00,0x15,0x00,0x27,0x40,0x12,0x15,0x08,0x15,0x08,0x00,0x05,0x00,0x03,0x39,0x15,0x15,0x05,0x0f,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f, -0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x13,0x03,0x2e,0x03,0x27,0x23,0x0e,0x03,0x07,0x03,0x04,0x04,0xb3,0x71,0xfe,0x3d,0x6a,0xb3,0x01,0xae,0xa4,0x5e,0x98,0x02,0x07,0x08,0x07,0x01,0x03,0x02,0x06,0x07,0x07,0x03,0x92,0x01,0x1a,0xfe,0xe6,0x04,0x33, -0xfd,0x73,0x01,0x9a,0x05,0x17,0x1d,0x1c,0x0b,0x0c,0x1d,0x1d,0x18,0x07,0xfe,0x6b,0x00,0x03,0x00,0xb0,0x00,0x00,0x03,0xa1,0x04,0x33,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x3c,0x40,0x21,0x10,0x24,0x0d,0x38,0x16,0x16,0x06,0x00,0x38,0x1f,0x1b,0x24,0x37,0x06,0x10,0x23,0x3a,0x2f,0x1b,0x3f,0x1b,0x02,0x1b,0x1b,0x06,0x1a,0x3a,0x07, -0x35,0x24,0x3a,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x03,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x23,0x11,0x33, -0x32,0x36,0x03,0xa1,0x3b,0x67,0x8e,0x52,0xfe,0x91,0x01,0x67,0x4c,0x7c,0x57,0x2f,0x6c,0x61,0x3d,0x63,0x44,0x25,0xe7,0x71,0x72,0x83,0x71,0x73,0x82,0x3c,0x8f,0x90,0x83,0xa0,0x7b,0x87,0x01,0x35,0x45,0x72,0x51,0x2d,0x04,0x33,0x23,0x41,0x5b,0x37,0x5b,0x86,0x1e,0x03,0x06,0x2a,0x44,0x5b,0x01,0xb9,0x4e,0x3a,0xfe,0xc3,0x5a,0xfe, -0x6c,0x60,0x55,0xfe,0x9b,0x54,0x00,0x01,0x00,0x58,0xff,0xed,0x03,0xbb,0x04,0x45,0x00,0x1d,0x00,0x1b,0x40,0x0d,0x16,0x38,0x07,0x0f,0x00,0x11,0x39,0x0c,0x36,0x1b,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x33,0x2f,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22, -0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x03,0xbb,0x83,0xc5,0x7d,0xc8,0x8c,0x4a,0x54,0x9b,0xd8,0x84,0xa9,0x6f,0x7a,0x96,0x63,0x9e,0x6d,0x3a,0x36,0x66,0x94,0x5e,0xad,0x7d,0x2c,0x3f,0x4d,0x8c,0xc6,0x79,0x80,0xd4,0x98,0x54,0x2c,0x9e,0x40,0x3d,0x70,0x9e,0x62,0x5d,0x96,0x6a,0x39,0x48,0x00,0x00,0x02,0x00,0xb0,0x00,0x00, -0x04,0x54,0x04,0x33,0x00,0x0a,0x00,0x17,0x00,0x1c,0x40,0x0e,0x00,0x38,0x0b,0x12,0x37,0x06,0x11,0x39,0x07,0x35,0x12,0x39,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x20,0x00,0x03,0x34,0x2e,0x02,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x04,0x54,0x5d,0xa9,0xef, -0x92,0xfe,0xe3,0x01,0x2b,0x01,0x3c,0x01,0x3d,0xab,0x3c,0x76,0xae,0x72,0x83,0x7a,0x6e,0xb0,0x7b,0x42,0x02,0x27,0x7d,0xcb,0x90,0x4f,0x04,0x33,0xfe,0xfb,0xfe,0xf6,0x67,0x92,0x5c,0x2a,0xfc,0xed,0x30,0x64,0x98,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x27,0x04,0x33,0x00,0x0b,0x00,0x3c,0x40,0x22,0x06,0x0a,0x37,0x01,0x08,0x04, -0x08,0x04,0x00,0x01,0x00,0x09,0x39,0x0f,0x06,0x01,0x2f,0x06,0x3f,0x06,0xff,0x06,0x03,0x06,0x06,0x01,0x05,0x39,0x02,0x35,0x0a,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0xed,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21, -0x03,0x27,0xfd,0x89,0x02,0x5b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0x01,0xd3,0x04,0x33,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x0b,0x04,0x33,0x00,0x09,0x00,0x29,0x40,0x14,0x02,0x06,0x37,0x07,0x04,0x04,0x00,0x07,0x00,0x05,0x39,0x02,0x02,0x07,0x01,0x39,0x08,0x35,0x07,0x33,0x00,0x3f,0x3f,0xed,0x12,0x39, -0x2f,0xed,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x0b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0xa4,0x02,0x5b,0x03,0xa8,0xfe,0xb1,0x8a,0xfe,0x31,0x04,0x33,0x00,0x00,0x01,0x00,0x58,0xff,0xed,0x04,0x20,0x04,0x45,0x00,0x22,0x00,0x2f,0x40,0x18,0x20,0x20,0x07,0x1e, -0x0f,0x00,0x37,0x1e,0x16,0x38,0x07,0x20,0x39,0x21,0x21,0x02,0x11,0x39,0x0c,0x36,0x1b,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02, -0x33,0x32,0x36,0x37,0x11,0x21,0x35,0x21,0x04,0x20,0xb3,0xdc,0x7f,0xd2,0x96,0x52,0x5c,0xa4,0xe3,0x87,0xc0,0x86,0x8e,0xbd,0x60,0xa3,0x75,0x42,0x39,0x6b,0x98,0x60,0x42,0x6d,0x30,0xfe,0xfe,0x01,0xa4,0x4a,0x5d,0x4f,0x8e,0xc8,0x79,0x7b,0xd1,0x98,0x56,0x39,0xa4,0x53,0x3f,0x71,0x9b,0x5b,0x5e,0x99,0x6c,0x3a,0x16,0x16,0x01,0x0b, -0x8b,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x00,0x0b,0x00,0x27,0x40,0x13,0x08,0x04,0x37,0x05,0x09,0x00,0x37,0x01,0x03,0x39,0x08,0x08,0x05,0x0a,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11, -0x21,0x11,0x33,0x04,0x39,0xa5,0xfd,0xc0,0xa4,0xa4,0x02,0x40,0xa5,0x01,0xf3,0xfe,0x0d,0x04,0x33,0xfe,0x4b,0x01,0xb5,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x01,0x54,0x04,0x33,0x00,0x03,0x00,0x10,0xb6,0x00,0x37,0x01,0x02,0x35,0x01,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x54,0xa4,0xa4,0x04,0x33, -0x00,0x01,0x00,0x11,0xff,0xed,0x01,0xe5,0x04,0x33,0x00,0x11,0x00,0x16,0x40,0x0a,0x00,0x37,0x0f,0x07,0x10,0x35,0x0a,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0xe5,0x33,0x5d,0x83,0x4f,0x46,0x2c,0x2c,0x48,0x2f,0x46, -0x2f,0x18,0xa4,0x01,0x81,0x65,0x98,0x65,0x32,0x13,0x9a,0x1d,0x1b,0x3d,0x63,0x48,0x02,0xb3,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x00,0x12,0x00,0x33,0x40,0x18,0x10,0x11,0x11,0x00,0x12,0x0b,0x07,0x37,0x08,0x01,0x00,0x00,0x14,0x12,0x06,0x0b,0x0b,0x08,0x10,0x09,0x35,0x01,0x08,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12, -0x39,0x11,0x33,0x33,0x11,0x01,0x33,0x2f,0x33,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x03,0xec,0xcc,0xfe,0x60,0x09,0x19,0x06,0x04,0xa4,0xa4,0x04,0x05,0x19,0x0a,0x01,0x91,0xb8,0xfe,0x33,0x01,0xdd,0x0b,0x20,0x0a,0xfd, -0xee,0x04,0x33,0xfe,0x07,0x08,0x1e,0x0b,0x01,0xc8,0xfd,0xfc,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x00,0x05,0x00,0x16,0x40,0x0a,0x04,0x37,0x01,0x00,0x02,0x35,0x04,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x2f,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x03,0x2e,0xfd,0x82,0xa4,0x01,0xda,0x04,0x33,0xfc, -0x58,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x05,0x62,0x04,0x33,0x00,0x21,0x00,0x20,0x40,0x0f,0x17,0x10,0x14,0x37,0x15,0x20,0x06,0x05,0x00,0x37,0x01,0x16,0x35,0x15,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x33,0x33,0x33,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x26,0x26,0x27, -0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x05,0x62,0x9e,0x02,0x06,0x04,0x0a,0x14,0x11,0xfe,0x9d,0x58,0xfe,0x98,0x12,0x15,0x09,0x03,0x03,0x03,0x99,0xda,0x01,0x45,0x15,0x1b,0x06,0x06,0x0b,0x1e,0x11,0x01,0x46,0xd7,0x02,0xbe,0x2b,0x61,0x3e,0x24,0x3a,0x26,0xfc,0xfc,0x03,0x04, -0x26,0x38,0x26,0x20,0x62,0x49,0xfd,0x43,0x04,0x33,0xfd,0x3e,0x2a,0x4a,0x17,0x1d,0x4d,0x24,0x02,0xbf,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x00,0x18,0x00,0x1a,0x40,0x0c,0x01,0x00,0x37,0x16,0x0c,0x09,0x37,0x0a,0x0b,0x35,0x01,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x32,0x2f,0xed,0x33,0x31,0x30,0x21,0x23,0x01,0x26, -0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x1e,0x03,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x04,0x7a,0xae,0xfd,0xcc,0x1f,0x29,0x08,0x05,0x06,0x99,0xb9,0x02,0x35,0x12,0x19,0x11,0x09,0x03,0x03,0x04,0x04,0x99,0x02,0xf7,0x2a,0x41,0x13,0x23,0x71,0xfd,0x1f,0x04,0x33,0xfd,0x04,0x19,0x23,0x18,0x10,0x05,0x17,0x4e,0x39,0x02, -0xc7,0x00,0x00,0x02,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x00,0x13,0x00,0x23,0x00,0x1c,0x40,0x0e,0x00,0x38,0x14,0x1c,0x38,0x0a,0x17,0x39,0x0f,0x36,0x21,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34, -0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0x95,0x52,0x91,0xc9,0x77,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x02,0x27,0x86,0xd4,0x93,0x4d,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c, -0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x24,0x40,0x12,0x00,0x38,0x0f,0x14,0x07,0x37,0x08,0x06,0x3a,0x14,0x14,0x08,0x13,0x3a,0x09,0x35,0x08,0x33,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02, -0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x03,0x92,0x3f,0x73,0xa3,0x63,0x86,0xa4,0x01,0x4b,0x61,0x98,0x68,0x36,0xab,0x86,0x87,0x86,0x76,0x89,0x94,0x02,0xee,0x4d,0x82,0x5e,0x34,0xfe,0x73,0x04,0x33,0x2c,0x54,0x79,0x52,0x6b,0x5a,0xfe,0x65,0x69,0x00,0x02,0x00,0x58,0xff,0x65, -0x04,0xc5,0x04,0x45,0x00,0x18,0x00,0x28,0x00,0x24,0x40,0x12,0x00,0x38,0x19,0x21,0x38,0x0f,0x08,0x05,0x0a,0x1c,0x39,0x14,0x36,0x26,0x39,0x0a,0x34,0x07,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x06,0x07,0x05,0x23,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02, -0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0x95,0x52,0x49,0x22,0x28,0x01,0x15,0xf8,0xb2,0x4f,0x5a,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x02,0x27,0x86,0xd4,0x4a,0x22,0x1b,0xe1,0x9e, -0x16,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0xdf,0x04,0x33,0x00,0x19,0x00,0x24,0x00,0x2e,0x40,0x17,0x16,0x09,0x00,0x11,0x38,0x1a,0x1f,0x09,0x37,0x0a,0x16,0x08,0x3a,0x1f,0x1f,0x0a,0x1e,0x3a,0x0b,0x35,0x01,0x0a, -0x33,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0xfd,0xc6,0x12,0x39,0x31,0x30,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x03,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x03,0xdf,0xc0,0xbe,0x13,0x24,0x29,0x2f,0x1d,0x61, -0xa4,0x01,0x6d,0x56,0x8a,0x61,0x34,0x26,0x46,0x62,0x3c,0x3c,0x3f,0x1c,0x77,0x76,0xa6,0xa0,0x37,0x59,0x40,0x23,0x01,0x47,0x20,0x2b,0x19,0x0a,0xfe,0x4b,0x04,0x33,0x27,0x4a,0x69,0x43,0x3a,0x63,0x4c,0x35,0x0d,0x03,0x1a,0x65,0x01,0xa1,0x57,0x4c,0xfe,0x8e,0x1e,0x37,0x4c,0x00,0x00,0x01,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45, -0x00,0x37,0x00,0x26,0x40,0x13,0x2e,0x37,0x0a,0x1f,0x27,0x00,0x37,0x15,0x15,0x2d,0x05,0x29,0x39,0x24,0x36,0x10,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xc4,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e, -0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x03,0x08,0x38,0x67,0x94,0x5d,0x20,0x4e,0x4c,0x41,0x12,0x1a,0x46,0x4d,0x4f,0x24,0x39,0x53,0x36,0x19,0x14,0x35,0x5d,0x4a,0x47,0x66,0x42,0x1f,0x39,0x66,0x8d,0x53,0xa0,0x4a,0x5f,0x93,0x32,0x4f,0x38,0x1d,0x0e,0x2f,0x56, -0x48,0x4f,0x6f,0x46,0x20,0x01,0x1b,0x44,0x70,0x4f,0x2b,0x0b,0x11,0x16,0x0c,0xac,0x15,0x24,0x1a,0x0e,0x16,0x28,0x38,0x22,0x1f,0x32,0x30,0x36,0x25,0x23,0x46,0x4c,0x58,0x35,0x40,0x68,0x49,0x28,0x26,0xa5,0x42,0x15,0x26,0x33,0x1e,0x1d,0x2f,0x31,0x36,0x22,0x26,0x47,0x4c,0x54,0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33, -0x00,0x07,0x00,0x1e,0x40,0x0e,0x02,0x37,0x03,0x03,0x00,0x05,0x00,0x01,0x05,0x39,0x06,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x6c,0xfe,0xa9,0xa4,0xfe,0xa8,0x03,0x53,0x03,0xa8,0xfc,0x58,0x03,0xa8,0x8b,0x00,0x01,0x00,0x9c,0xff,0xed, -0x04,0x26,0x04,0x33,0x00,0x15,0x00,0x1b,0x40,0x0d,0x00,0x37,0x13,0x09,0x37,0x06,0x14,0x07,0x35,0x0e,0x39,0x03,0x34,0x00,0x3f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x04,0x26,0xed,0xe2,0xd9,0xe2,0xa5,0x22,0x48, -0x6f,0x4d,0x4a,0x6b,0x45,0x20,0xa5,0x01,0xb3,0xe3,0xe3,0xdb,0xda,0x02,0x91,0xfd,0x80,0x51,0x77,0x4e,0x25,0x24,0x4d,0x76,0x51,0x02,0x83,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x15,0x04,0x33,0x00,0x0f,0x00,0x0f,0xb5,0x03,0x00,0x03,0x35,0x02,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x01,0x23,0x01,0x33,0x01,0x1e, -0x03,0x17,0x33,0x36,0x36,0x37,0x01,0x04,0x15,0xfe,0x43,0xa3,0xfe,0x4b,0xb9,0x01,0x0c,0x10,0x17,0x0f,0x0a,0x02,0x03,0x04,0x20,0x22,0x01,0x12,0x04,0x33,0xfb,0xcd,0x04,0x33,0xfd,0x40,0x2a,0x40,0x32,0x24,0x0e,0x17,0x61,0x57,0x02,0xbf,0x00,0x01,0x00,0x05,0x00,0x00,0x06,0x64,0x04,0x33,0x00,0x26,0x00,0x0f,0xb5,0x1a,0x0a,0x1a, -0x35,0x19,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x23,0x03,0x2e,0x03,0x27,0x0e,0x03,0x07,0x03,0x23,0x01,0x33,0x13,0x1e,0x03,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0x81,0xdf,0x1d,0x1a,0x04,0x03,0x05,0x1c,0x20,0xd4,0xb1,0xfe,0x8c,0xa3,0xdf,0x07,0x10,0x10,0x0f, -0x04,0x06,0x10,0x11,0x10,0x07,0xda,0xa3,0xfe,0x8c,0xb0,0xd7,0x10,0x16,0x0e,0x09,0x02,0x03,0x04,0x1a,0x1d,0xde,0x04,0x33,0xfd,0x5e,0x5a,0x71,0x17,0x1c,0x71,0x62,0x02,0x95,0xfb,0xcd,0x02,0xa4,0x15,0x37,0x3e,0x3e,0x1c,0x1f,0x43,0x40,0x39,0x14,0xfd,0x67,0x04,0x33,0xfd,0x6b,0x31,0x4d,0x3a,0x29,0x0e,0x17,0x71,0x5a,0x02,0xa2, -0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x00,0x19,0x00,0x0f,0xb5,0x0b,0x00,0x0d,0x35,0x0b,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x03,0xe4,0xc3,0xfe,0xfa,0x06,0x0e,0x08,0x03, -0x04,0x0e,0x0b,0xfe,0xc3,0x01,0x7c,0xfe,0xa2,0xc5,0xe6,0x0d,0x15,0x09,0x03,0x0d,0x17,0x0a,0xe3,0xb8,0xfe,0x9a,0x01,0x8e,0x0a,0x1a,0x12,0x09,0x1b,0x12,0xfe,0x72,0x02,0x28,0x02,0x0b,0xfe,0x91,0x14,0x25,0x12,0x19,0x27,0x0e,0x01,0x6c,0xfd,0xdf,0x00,0x01,0x00,0x14,0x00,0x00,0x03,0xa7,0x04,0x33,0x00,0x0f,0x00,0x1d,0x40,0x0d, -0x0a,0x02,0x37,0x03,0x03,0x06,0x05,0x0f,0x00,0x05,0x35,0x03,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x32,0x2f,0x33,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0xa7,0xfe,0x83,0xa3,0xfe,0x8d,0xb4,0xf3,0x06,0x0f,0x08,0x02,0x05,0x10,0x0b,0xff,0x04,0x33,0xfd,0x5a, -0xfe,0x73,0x01,0x8a,0x02,0xa9,0xfe,0x25,0x0c,0x21,0x15,0x0d,0x21,0x14,0x01,0xdb,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0xb3,0x04,0x33,0x00,0x09,0x00,0x26,0x40,0x12,0x07,0x07,0x00,0x01,0x04,0x06,0x03,0x00,0x00,0x07,0x39,0x08,0x35,0x05,0x01,0x39,0x04,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x01,0x2f,0x33,0x33,0x2f,0x33,0x12, -0x39,0x2f,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x03,0xb3,0xfd,0x73,0x02,0x7c,0xfc,0x87,0x02,0x8b,0xfd,0xad,0x03,0x52,0x04,0x02,0xfc,0x89,0x8b,0x37,0x03,0x71,0x8b,0x00,0x00,0x02,0xff,0xf8,0x00,0x00,0x05,0x56,0x04,0x33,0x00,0x0f,0x00,0x13,0x00,0x59,0x40,0x33,0x0a,0x0e,0x37,0x01,0x11,0x01,0x10,0x01, -0x0c,0x08,0x08,0x0c,0x01,0x10,0x04,0x00,0x05,0x00,0x09,0x13,0x39,0x06,0x03,0x39,0x10,0x0d,0x39,0x0a,0x0f,0x0a,0x01,0x2f,0x0a,0x3f,0x0a,0xff,0x0a,0x03,0x10,0x0a,0x10,0x0a,0x01,0x06,0x35,0x05,0x33,0x0e,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x01,0x2f, -0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x21,0x11,0x23,0x05,0x56,0xfd,0x89,0xfe,0x6f,0x9b,0xbb,0x02,0x46,0x02,0xfc,0xfe,0x49,0x01,0x95,0xfe,0x6b,0x01,0xd3,0xfc,0x3c,0x01,0x4d,0x49,0x01,0x28,0xfe,0xd8, -0x04,0x33,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x01,0x28,0x01,0xf6,0x00,0x02,0x00,0x58,0xff,0xed,0x05,0xe8,0x04,0x45,0x00,0x1e,0x00,0x2e,0x00,0x51,0x40,0x2f,0x19,0x1d,0x37,0x1f,0x1b,0x1f,0x1b,0x00,0x28,0x38,0x0b,0x17,0x00,0x18,0x20,0x39,0x15,0x1c,0x39,0x0f,0x19,0x01,0x2f,0x19,0x3f,0x19,0xff,0x19,0x03,0x19,0x19,0x01,0x15,0x35, -0x23,0x39,0x10,0x36,0x2d,0x39,0x06,0x34,0x1d,0x1f,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x5d,0x71,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x31,0x30,0x21,0x21,0x22,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x23,0x21, -0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x25,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x05,0xe8,0xfd,0xab,0x06,0x3a,0x50,0x57,0x23,0x80,0xcf,0x93,0x4f,0x52,0x99,0xd8,0x86,0x25,0x58,0x49,0x2f,0x03,0x02,0x3b,0xfe,0x47,0x01,0x97,0xfe,0x69,0x01,0xd3,0xfd,0x89,0x40,0x6a,0x2b,0x5b,0x96,0x6c,0x3c,0x3b, -0x6b,0x95,0x59,0x5a,0x06,0x07,0x06,0x4f,0x8f,0xc8,0x7a,0x82,0xd2,0x94,0x50,0x06,0x06,0x06,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x06,0x03,0x14,0x0b,0x0b,0x3f,0x70,0x9a,0x5a,0x5b,0x98,0x6e,0x3e,0x00,0x00,0x01,0x00,0x38,0x00,0x00,0x03,0x2e,0x04,0x33,0x00,0x0d,0x00,0x34,0x40,0x19,0x08,0x0c,0x37,0x01,0x0a,0x0a,0x00,0x05,0x03,0x01, -0x00,0x02,0x08,0x09,0x03,0x09,0x03,0x09,0x01,0x06,0x35,0x0c,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x25,0x15,0x05,0x11,0x21,0x03,0x2e,0xfd,0x82,0x78,0x78,0xa4,0x01,0x01,0xfe, -0xff,0x01,0xda,0x01,0x95,0x44,0x8a,0x43,0x02,0x15,0xfe,0x48,0x8f,0x8b,0x8d,0xfe,0x99,0x00,0x00,0x03,0x00,0x41,0xff,0xda,0x04,0xa9,0x04,0x65,0x00,0x1b,0x00,0x26,0x00,0x32,0x00,0x28,0x40,0x14,0x1f,0x30,0x2c,0x00,0x38,0x1c,0x2c,0x38,0x0e,0x2f,0x1e,0x22,0x27,0x39,0x13,0x36,0x22,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x11, -0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x17,0x07,0x16,0x16,0x07,0x34,0x27,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x01,0x26,0x26,0x04,0xa9,0x4d,0x90,0xce, -0x82,0x6f,0xb6,0x45,0x83,0x4e,0x86,0x36,0x39,0x4d,0x92,0xd4,0x86,0x61,0xa4,0x42,0x7b,0x4f,0x7a,0x3f,0x42,0xab,0x44,0xfd,0xc4,0x30,0x80,0x4e,0x5c,0x8f,0x63,0x34,0xfe,0x88,0x57,0x8f,0x66,0x37,0x1d,0x1b,0x02,0x34,0x2d,0x74,0x02,0x27,0x82,0xd2,0x95,0x51,0x3c,0x39,0x88,0x49,0x8c,0x45,0xb0,0x69,0x81,0xd1,0x95,0x51,0x32,0x2f, -0x81,0x4b,0x7f,0x47,0xbd,0x80,0xa8,0x68,0xfd,0xac,0x2d,0x2f,0x38,0x6a,0x9b,0x02,0x07,0x3c,0x6e,0x9b,0x5e,0x46,0x78,0x31,0x02,0x4e,0x21,0x23,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x00,0x10,0x00,0x19,0x00,0x2e,0x40,0x17,0x00,0x38,0x11,0x16,0x0b,0x07,0x37,0x08,0x06,0x3a,0x16,0x15,0x3a,0x0b,0x16,0x0b,0x16,0x0b, -0x08,0x09,0x35,0x08,0x33,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x32,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x03,0x92,0x3f,0x73,0xa3,0x63,0x86,0xa4,0xa4,0xa7,0x61,0x98,0x68,0x36, -0xab,0x86,0x87,0x86,0x76,0x89,0x94,0x02,0x2c,0x4d,0x82,0x5e,0x34,0xcb,0x04,0x33,0xc2,0x2c,0x54,0x79,0x52,0x6b,0x5a,0xfe,0x65,0x69,0x00,0x02,0x00,0x2d,0x00,0x00,0x04,0x54,0x04,0x33,0x00,0x0e,0x00,0x1f,0x00,0x35,0x40,0x1b,0x18,0x18,0x06,0x00,0x38,0x0f,0x16,0x1a,0x37,0x0a,0x08,0x06,0x19,0x08,0x39,0x16,0x09,0x09,0x06,0x15, -0x39,0x0b,0x35,0x1a,0x39,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x00,0x03,0x34,0x2e,0x02,0x23,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x32,0x3e,0x02,0x04,0x54,0x5d,0xa9, -0xef,0x92,0xfe,0xe3,0x83,0x83,0x01,0x2b,0x01,0x3c,0x01,0x3d,0xab,0x3c,0x76,0xae,0x72,0x83,0xfb,0xfb,0x7a,0x6e,0xb0,0x7b,0x42,0x02,0x27,0x7d,0xcb,0x90,0x4f,0x01,0xe1,0x89,0x01,0xc9,0xfe,0xfb,0xfe,0xf6,0x67,0x92,0x5c,0x2a,0xfe,0xc7,0x89,0xfe,0xaf,0x30,0x64,0x98,0x00,0x01,0x00,0xa6,0xff,0xee,0x03,0xe8,0x04,0x45,0x00,0x39, -0x00,0x3f,0x40,0x21,0x27,0x38,0x14,0x30,0x38,0x09,0x01,0x0f,0x1c,0x14,0x09,0x14,0x09,0x3b,0x1b,0x37,0x1c,0x2a,0x0e,0x3b,0x0f,0x0f,0x22,0x04,0x39,0x35,0x34,0x17,0x39,0x22,0x36,0x1c,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31, -0x30,0x25,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x01,0x9a,0x26,0x73,0x43,0x28,0x48,0x36,0x1f,0x2a,0x57,0x84,0x5a,0x39,0x5c, -0x41,0x23,0x5a,0x58,0x65,0x74,0xa4,0x42,0x6c,0x8c,0x4a,0x4e,0x7f,0x5a,0x31,0x68,0x77,0x56,0x7b,0x4f,0x25,0x31,0x5e,0x88,0x56,0x2c,0x43,0x35,0x2a,0x0a,0x97,0x12,0x1a,0x13,0x2a,0x42,0x30,0x2f,0x4f,0x3b,0x25,0x05,0x71,0x06,0x1c,0x2f,0x41,0x2a,0x45,0x43,0x71,0x7d,0xfd,0x32,0x02,0xe3,0x68,0x88,0x51,0x21,0x24,0x43,0x61,0x3c, -0x5a,0x80,0x1e,0x04,0x0d,0x31,0x48,0x62,0x3f,0x45,0x70,0x4f,0x2c,0x05,0x07,0x0a,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0x96,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26, -0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x0e,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x2c,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x8c,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00, -0x00,0x00,0x04,0x04,0x05,0xd0,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x9f,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0xa5,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x17,0x01,0x17,0x00, -0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x67,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xdf,0xff,0x4b,0x00,0x09,0xb3,0x03,0x02,0x27,0x35,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x58,0xfe,0x56,0x03,0xbb,0x04,0x45,0x02,0x26,0x0c,0xed,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x97,0x00,0x06, -0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x43,0x79,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xec,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d, -0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x2c,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0xd7,0x6c,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xa5,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x8f,0x53,0x1e,0x00,0x0c, -0xb5,0x02,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xfc,0x00,0x00,0x01,0x81,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0x43,0xaa,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x87,0x00,0x00,0x02,0x0c,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06, -0x00,0x8e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe9,0x00,0x00,0x02,0x1d,0x06,0x2c,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd7,0x8d,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3, -0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a,0x05,0xd0,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x32,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58, -0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x68,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24, -0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x2c,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x00,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xd0,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x13,0x00,0x1e, -0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xa5,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xd6,0x00,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x28,0x02,0x26,0x0c,0xff, -0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x07,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x28,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x62,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed, -0x04,0x26,0x06,0x2c,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xeb,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xa5,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xc1,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00, -0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x4d,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xc6,0x00,0x1e, -0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0xdc,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfe,0x70,0x04,0x04,0x04,0x33,0x02,0x26,0x0c,0xeb,0x00,0x00, -0x00,0x07,0x00,0xdf,0x02,0xab,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x28,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x71,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x2a,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0xe0, -0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x05,0xa3,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xba,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x54,0x06,0x2a,0x02,0x26, -0x0c,0xee,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x2d,0x00,0x00,0x04,0x54,0x04,0x33,0x02,0x06,0x0d,0x0a,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0x4d,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x9c,0x00,0x1e, -0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xdc,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xac,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xa3,0x02,0x26,0x0c,0xef,0x00,0x00, -0x01,0x07,0x00,0xdb,0x01,0x15,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x70,0x03,0x27,0x04,0x33,0x02,0x26,0x0c,0xef,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xbe,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x2a,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0xe0, -0x66,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x05,0xdc,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x52,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xfe,0x85,0x04,0x20,0x04,0x45,0x02,0x26,0x0c,0xf1, -0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xf8,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x05,0xa3,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xb0,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x06,0x2c,0x02,0x26,0x0c,0xf2,0x00,0x00,0x01,0x07, -0x00,0xd7,0x00,0xfe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0c,0x01,0x0c,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0x2d,0x00,0x00,0x04,0xbc,0x04,0x33,0x00,0x13,0x00,0x17,0x00,0x4a,0x40,0x0e,0x17,0x0c,0x04,0x37,0x05,0x14,0x0d,0x00,0x37,0x01,0x03,0x39,0x17,0x17,0xb8,0xff,0xc0,0x40,0x16,0x09,0x0c,0x48,0x16,0x13,0x06,0x39,0x09,0x10, -0x0c,0x09,0x17,0x09,0x17,0x09,0x05,0x0e,0x0a,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x2b,0x10,0xed,0x01,0x2f,0xed,0x33,0x33,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23, -0x07,0x35,0x21,0x15,0x04,0x39,0xa5,0xfd,0xc0,0xa4,0x83,0x83,0xa4,0x02,0x40,0xa5,0x83,0x83,0xa5,0xfd,0xc0,0x01,0xf3,0xfe,0x0d,0x03,0x2b,0x89,0x7f,0x7f,0x7f,0x7f,0x89,0xad,0xad,0xad,0xff,0xff,0xff,0xc3,0x00,0x00,0x02,0x44,0x05,0xd0,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd8,0xa0,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05, -0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x04,0x00,0x00,0x02,0x00,0x05,0x4d,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd9,0xc6,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x16,0x05,0xdc,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xda,0xcc,0x1e,0x00,0x0a, -0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x3f,0xfe,0x70,0x01,0x54,0x04,0x33,0x02,0x26,0x0c,0xf3,0x00,0x00,0x00,0x06,0x00,0xdf,0x01,0x00,0xff,0xff,0x00,0xa0,0x00,0x00,0x01,0x65,0x05,0xa3,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xdb,0x34,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11, -0x5d,0x35,0xff,0xff,0x00,0xb0,0xff,0xed,0x03,0xe9,0x04,0x33,0x00,0x26,0x0c,0xf3,0x00,0x00,0x00,0x07,0x0c,0xf4,0x02,0x04,0x00,0x00,0xff,0xff,0x00,0x11,0xff,0xed,0x02,0xac,0x06,0x2c,0x02,0x26,0x0c,0xf4,0x00,0x00,0x01,0x06,0x00,0xd7,0x1c,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0, -0xfe,0x85,0x03,0xec,0x04,0x33,0x02,0x26,0x0c,0xf5,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xa8,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x06,0x28,0x02,0x26,0x0c,0xf6,0x00,0x00,0x01,0x06,0x00,0x8e,0x52,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x06,0x01,0x06,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x03,0x2e,0x04,0x33, -0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x06,0x01,0x9c,0x6b,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x07,0x01,0x9c,0x01,0x13,0x04,0xaa,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x07,0x00,0xdb,0x01,0x8a,0xfd,0x56,0xff,0xff,0x00,0xb0, -0x00,0x00,0x04,0x7a,0x06,0x28,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x9e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x04,0x7a,0x04,0x33,0x02,0x26,0x0c,0xf8,0x00,0x00,0x00,0x07,0x01,0x9c,0x01,0x0c,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a, -0x06,0x2a,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x16,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0xb0,0xfe,0x59,0x04,0x88,0x04,0x33,0x00,0x26,0x00,0x32,0x40,0x18,0x26,0x37,0x25,0x0f,0x25,0x08,0x08,0x25,0x1a,0x17,0x37,0x18,0x20,0x13,0x17,0x25,0x19,0x35,0x0f,0x00, -0x17,0x0a,0x39,0x05,0x00,0x2f,0xed,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x01,0x26,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x1e,0x03,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x04, -0x88,0x33,0x5e,0x83,0x4f,0x46,0x2c,0x2c,0x48,0x2f,0x46,0x2f,0x18,0xfd,0xbc,0x20,0x28,0x08,0x05,0x06,0xa0,0xc0,0x02,0x35,0x12,0x19,0x11,0x09,0x03,0x03,0x04,0x04,0xa0,0x13,0x65,0x98,0x65,0x32,0x13,0x9a,0x1d,0x1b,0x42,0x6e,0x52,0x02,0xf1,0x29,0x42,0x13,0x23,0x71,0xfd,0x1f,0x04,0x33,0xfd,0x21,0x19,0x23,0x18,0x10,0x05,0x17, -0x4e,0x39,0x02,0xaa,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0x4d,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x3a,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xdc,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x3f,0x00,0x1e, -0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x1e,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x7d,0x00,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xdf,0x06,0x28,0x02,0x26,0x0c,0xfc, -0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x03,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x03,0xdf,0x04,0x33,0x02,0x26,0x0c,0xfc,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xa0,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xdf,0x06,0x2a,0x02,0x26,0x0c,0xfc,0x00,0x00,0x01,0x07, -0x00,0xe0,0x00,0x83,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x28,0x02,0x26,0x0c,0xfd,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x2c, -0x02,0x26,0x0c,0xfd,0x00,0x00,0x01,0x06,0x00,0xd7,0x4e,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xfe,0x50,0x03,0x08,0x04,0x45,0x02,0x26,0x0c,0xfd,0x00,0x00,0x00,0x07,0x00,0xdd,0x00,0xdc,0x00,0x00,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x2a,0x02,0x26,0x0c,0xfd,0x00,0x00, -0x01,0x06,0x00,0xe0,0x4f,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x19,0xfe,0x50,0x03,0x6c,0x04,0x33,0x02,0x26,0x0c,0xfe,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x15,0x00,0x00,0xff,0xff,0x00,0x19,0xfe,0x85,0x03,0x6c,0x04,0x33,0x02,0x26,0x0c,0xfe,0x00,0x00,0x00,0x06,0x01,0x9c,0x2d,0x00, -0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x06,0x2a,0x02,0x26,0x0c,0xfe,0x00,0x00,0x01,0x06,0x00,0xe0,0x43,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x08,0x01,0x08,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x00,0x0f,0x00,0x3d,0x40,0x1f,0x02,0x06,0x37,0x07,0x0b,0x07,0x0a,0x07,0x03,0x03,0x07,0x0a,0x03,0x00, -0x0d,0x00,0x01,0x0d,0x39,0x0e,0x05,0x09,0x39,0x02,0x0a,0x0a,0x07,0x0e,0x35,0x07,0x33,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x6c,0xfe, -0xa9,0x01,0x0e,0xfe,0xf2,0xa4,0xfe,0xf1,0x01,0x0f,0xfe,0xa8,0x03,0x53,0x03,0xa8,0xfe,0xb6,0x89,0xfe,0x2b,0x01,0xd5,0x89,0x01,0x4a,0x8b,0x00,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xd0,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xfe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35, -0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0x4d,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x25,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xdc,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x2a,0x00,0x1e,0x00,0x0a,0xb4,0x01, -0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x3a,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x41,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x1e,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07, -0x00,0xde,0x01,0x51,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xfe,0x70,0x04,0x26,0x04,0x33,0x02,0x26,0x0c,0xff,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xaa,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x2c,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0xd7, -0x01,0xbe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x28,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xa6,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x28,0x02,0x26, -0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x5e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x05,0xa5,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x94,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0x35,0xff,0xff, -0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x2c,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0xd7,0x67,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x05,0xa5,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0x8f,0x3d,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x10,0x01,0x10,0x00, -0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0x43,0x71,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x06,0x28,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x21,0x00,0x1e,0x00,0x0a, -0xb4,0x01,0x0f,0x0b,0x01,0x0b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x05,0xa3,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x3d,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x06,0x2a,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07, -0x00,0xe0,0x00,0x8d,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0a,0x01,0x0a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0xe3,0x02,0x26,0x0c,0xeb,0x00,0x00,0x00,0x27,0x00,0xdc,0x00,0xdf,0xff,0x4b,0x01,0x07,0x00,0x8e,0x01,0x14,0x00,0xd9,0x00,0x2a,0x40,0x1b,0x04,0xe0,0x2f,0x01,0x90,0x2f,0x01,0x90,0x2f,0x01, -0x80,0x2f,0x01,0x70,0x2f,0x01,0x70,0x2f,0x01,0x60,0x2f,0x01,0x2f,0x03,0x02,0x27,0x35,0x00,0x3f,0x35,0x35,0x11,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x35,0xff,0xff,0xff,0xf8,0x00,0x00,0x05,0x56,0x06,0x28,0x02,0x26,0x0d,0x05,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x7b,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x16,0x01,0x16,0x00,0x11, -0x5d,0x35,0xff,0xff,0x00,0x41,0xff,0xda,0x04,0xa9,0x06,0x28,0x02,0x26,0x0d,0x08,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x69,0x00,0x1e,0x00,0x0a,0xb4,0x03,0x0f,0x35,0x01,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x02,0x06,0x0c,0xeb,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xa1,0x04,0x33, -0x02,0x06,0x0c,0xec,0x00,0x00,0x00,0x01,0x00,0x9c,0x00,0x00,0x03,0x06,0x04,0x33,0x00,0x05,0x00,0x18,0x40,0x0b,0x00,0x07,0x02,0x37,0x03,0x01,0x39,0x04,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x11,0x33,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0x06,0xfe,0x3a,0xa4,0x02,0x6a,0x03,0xa6,0xfc,0x5a,0x04,0x33,0x00, -0x00,0x02,0x00,0x2a,0x00,0x00,0x04,0x20,0x04,0x33,0x00,0x05,0x00,0x0e,0x00,0x23,0x40,0x10,0x0e,0x02,0x06,0x05,0x02,0x05,0x0f,0x10,0x09,0x01,0x03,0x35,0x0e,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x12,0x39,0x11,0x12,0x01,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x33,0x01,0x27,0x01,0x26,0x27,0x23,0x06,0x06, -0x07,0x01,0x04,0x20,0xfc,0x0a,0x01,0xa7,0xa4,0x01,0xab,0xcb,0xfe,0xed,0x1c,0x04,0x03,0x03,0x10,0x0e,0xfe,0xf3,0x39,0x03,0xfa,0xfc,0x06,0x51,0x02,0x9a,0x44,0x26,0x12,0x35,0x23,0xfd,0x66,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x04,0x33,0x02,0x06,0x0c,0xef,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x04,0x33, -0x02,0x06,0x0d,0x04,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x02,0x06,0x0c,0xf2,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x00,0x03,0x00,0x17,0x00,0x27,0x00,0x2f,0x40,0x18,0x02,0x01,0x20,0x04,0x38,0x18,0x18,0x29,0x20,0x38,0x0e,0x00,0x39,0x01,0x01,0x25,0x1b,0x39,0x13,0x36,0x25,0x39, -0x09,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x35,0x21,0x15,0x25,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xac,0x01,0x95,0x01,0x54,0x52, -0x91,0xc9,0x77,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x01,0xdd,0x8b,0x8b,0x4a,0x86,0xd4,0x93,0x4d,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0xff,0xff,0x00,0xb0, -0x00,0x00,0x01,0x54,0x04,0x33,0x02,0x06,0x0c,0xf3,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x02,0x06,0x0c,0xf5,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x15,0x04,0x33,0x00,0x0d,0x00,0x22,0x40,0x0f,0x04,0x03,0x0d,0x00,0x03,0x00,0x0f,0x0e,0x04,0x08,0x01,0x0d,0x33,0x01,0x35,0x00,0x3f,0x3f,0x12,0x39, -0x39,0x11,0x12,0x01,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x31,0x01,0x33,0x01,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x01,0xbd,0xa3,0x01,0xb5,0xb9,0xfe,0xf4,0x20,0x1e,0x04,0x03,0x04,0x20,0x22,0xfe,0xee,0x04,0x33,0xfb,0xcd,0x02,0xc0,0x53,0x5f,0x1c,0x17,0x61,0x57,0xfd,0x41,0x00,0xff,0xff,0x00,0xb0,0x00,0x00, -0x05,0x62,0x04,0x33,0x02,0x06,0x0c,0xf7,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x02,0x06,0x0c,0xf8,0x00,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x03,0x4c,0x04,0x33,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x30,0x40,0x19,0x02,0x03,0x06,0x07,0x04,0x0b,0x0a,0x0b,0x0a,0x0b,0x0c,0x0d,0x05,0x39,0x06,0x06,0x02,0x0a, -0x39,0x09,0x33,0x01,0x39,0x02,0x35,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x21,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0x36,0xfd,0x29,0x02,0xd7,0x73,0xfe,0x0f,0x01,0xf1,0x89,0xfc,0xfd,0x03,0x03,0x03,0xa3,0x90,0xfd,0xa7,0x8c,0xfd,0x9a, -0x91,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x02,0x06,0x0c,0xf9,0x00,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x37,0x04,0x33,0x00,0x07,0x00,0x1b,0x40,0x0d,0x04,0x37,0x05,0x00,0x37,0x01,0x03,0x39,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x11, -0x23,0x11,0x21,0x04,0x37,0xa5,0xfd,0xc2,0xa4,0x03,0x87,0x03,0xa6,0xfc,0x5a,0x04,0x33,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x02,0x06,0x0c,0xfa,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x03,0x63,0x04,0x33,0x00,0x0b,0x00,0x34,0x40,0x1a,0x08,0x04,0x03,0x07,0x09,0x0b,0x04,0x09,0x0b,0x0b,0x09,0x04,0x03,0x0d, -0x0a,0x02,0x04,0x08,0x39,0x05,0x35,0x02,0x0a,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x32,0x11,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x03,0x63,0xfc,0xcd,0x01,0x82,0xfe,0xa1,0x02,0xdc,0xfe,0x0d,0x01,0x27,0xfe,0xb0, -0x02,0x50,0x44,0x01,0xe5,0x01,0xbd,0x4d,0x8c,0xfe,0x87,0xfe,0x59,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x02,0x06,0x0c,0xfe,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x04,0x33,0x02,0x06,0x0d,0x03,0x00,0x00,0x00,0x03,0x00,0x50,0xff,0xf5,0x04,0xb1,0x04,0x3d,0x00,0x1d,0x00,0x2a,0x00,0x37,0x00,0x46, -0x40,0x23,0x1f,0x12,0x01,0x37,0x37,0x0f,0x02,0x02,0x09,0x18,0x37,0x25,0x32,0x37,0x09,0x1f,0x37,0x3a,0x04,0x00,0x04,0x1e,0x2c,0x3a,0x0f,0x12,0x0f,0x04,0x0f,0x04,0x0f,0x02,0x10,0x36,0x02,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33, -0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x15,0x23,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x02,0xcd,0x99,0x18,0x66,0xaa,0x79,0x43,0x43,0x7a, -0xaa,0x67,0x16,0x99,0x17,0x69,0xaa,0x78,0x42,0x44,0x79,0xa9,0x65,0x19,0x17,0x46,0x70,0x4e,0x29,0x2a,0x4f,0x70,0x46,0xae,0x14,0x45,0x71,0x4f,0x2b,0x29,0x4e,0x70,0x47,0x8b,0x96,0x96,0x3e,0x71,0x9c,0x5f,0x5d,0x97,0x6a,0x3a,0x70,0x70,0x3b,0x6b,0x97,0x5b,0x5f,0x9c,0x71,0x3e,0x02,0xc4,0xfd,0xc1,0x27,0x4b,0x6c,0x46,0x41,0x69, -0x49,0x28,0xfd,0xc1,0x02,0x3f,0x27,0x49,0x6a,0x42,0x46,0x6c,0x4a,0x27,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x02,0x06,0x0d,0x02,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x04,0xc3,0x04,0x33,0x00,0x1b,0x00,0x34,0x40,0x1a,0x0d,0x00,0x37,0x0e,0x1b,0x1b,0x06,0x15,0x37,0x14,0x07,0x37,0x06,0x01,0x19,0x39,0x0c,0x10, -0x10,0x0e,0x1b,0x06,0x14,0x35,0x0e,0x33,0x00,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x02,0xec,0x19,0x97, -0x88,0x9f,0xe1,0xdd,0x19,0x99,0x19,0xd7,0xe6,0x9e,0x88,0x97,0x19,0x04,0x33,0xfd,0x60,0x8a,0x89,0x01,0x8d,0xfe,0x73,0xc6,0xd4,0xfe,0xf4,0x01,0x0c,0xd1,0xc9,0x01,0x8d,0xfe,0x73,0x89,0x8a,0x02,0xa0,0x00,0x00,0x01,0x00,0x58,0x00,0x00,0x04,0xb8,0x04,0x45,0x00,0x2b,0x00,0x2a,0xbc,0x00,0x0f,0x01,0x50,0x00,0x1b,0x00,0x25,0x01, -0x50,0x40,0x0d,0x05,0x0a,0x39,0x20,0x36,0x2a,0x12,0x03,0x15,0x39,0x01,0x14,0x33,0x00,0x3f,0x33,0xed,0x32,0x32,0x32,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x15,0x21,0x35,0x21,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15, -0x14,0x0e,0x02,0x07,0x21,0x04,0xb8,0xfe,0x51,0x80,0x86,0x36,0x64,0x90,0x5a,0x5c,0x92,0x66,0x37,0x87,0x81,0xfe,0x50,0x01,0x0d,0x48,0x67,0x40,0x1e,0x51,0x93,0xcd,0x7d,0x7f,0xd0,0x93,0x50,0x1e,0x41,0x65,0x48,0x01,0x0c,0x8a,0x5d,0xd4,0x89,0x59,0x8c,0x62,0x33,0x33,0x62,0x8c,0x58,0x89,0xd5,0x5d,0x8a,0x8b,0x2c,0x62,0x6f,0x81, -0x4c,0x75,0xb8,0x80,0x43,0x42,0x7f,0xb9,0x76,0x4b,0x81,0x70,0x61,0x2d,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1c,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef, -0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe8,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x06,0x28,0x02,0x26,0x0c,0xf2,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x6f,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0c,0x01,0x0c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x87,0x00,0x00, -0x02,0x0c,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0x8e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x65,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35, -0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xf5,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0x00,0x00,0x04,0xb8,0x06,0x28,0x02,0x26,0x0d,0x80,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x6d,0x00,0x1e,0x00,0x0a,0xb4,0x01, -0x0f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x05,0xa5,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06, -0x00,0x8f,0x3d,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0x8a,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x8f,0x45,0x03,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0x35,0x00,0x01,0x00,0x22,0xff,0xf2,0x04,0x3f,0x04,0x33, -0x00,0x1d,0x00,0x3e,0x40,0x20,0x13,0x0b,0x37,0x0c,0x19,0x37,0x06,0x01,0x11,0x06,0x0c,0x06,0x0c,0x06,0x1f,0x0e,0x0a,0x39,0x13,0x13,0x0f,0x03,0x3a,0x1c,0x34,0x12,0x0e,0x39,0x0f,0x35,0x0c,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x32, -0x31,0x30,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x02,0x7c,0x32,0x49,0x4a,0x58,0x7e,0x72,0xba,0xa3,0xfe,0xd6,0x03,0x3a,0xfe,0x93,0xca,0x59,0x90,0x66,0x37,0xa4,0x97,0x4c,0x04,0x8c,0x19,0x5f,0x52,0x60,0x68,0xfe,0x10, -0x03,0xa9,0x8a,0x8a,0xfe,0xce,0x2c,0x56,0x7c,0x51,0x94,0xa2,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x1a,0x06,0x28,0x00,0x26,0x0d,0x6b,0x14,0x00,0x01,0x07,0x00,0x8e,0x00,0xd6,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x06,0x01,0x06,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x58,0xff,0xee,0x03,0xca,0x04,0x45,0x00,0x1c,0x00,0x2e,0x40,0x17, -0x0f,0x16,0x07,0x1c,0x1c,0x1e,0x14,0x17,0x38,0x07,0x17,0x39,0x14,0x14,0x1a,0x11,0x39,0x0c,0x36,0x1a,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21, -0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x03,0xca,0x83,0xc3,0x7d,0xcd,0x92,0x50,0x56,0x9a,0xd4,0x7f,0xb0,0x7f,0x86,0xaa,0xb1,0xcf,0x15,0x01,0xf7,0xfe,0x08,0x0e,0xc8,0xb4,0xb9,0x83,0x2d,0x3f,0x48,0x89,0xc7,0x7f,0x8a,0xd6,0x93,0x4d,0x2c,0x9e,0x40,0xa9,0xb6,0x89,0xa5,0xb7,0x48,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45, -0x02,0x06,0x0c,0xfd,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x01,0x54,0x04,0x33,0x02,0x06,0x0c,0xf3,0x00,0x00,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x11, -0xff,0xed,0x01,0xe5,0x04,0x33,0x02,0x06,0x0c,0xf4,0x00,0x00,0x00,0x02,0x00,0x0d,0xff,0xef,0x06,0x32,0x04,0x33,0x00,0x26,0x00,0x2f,0x00,0x44,0xb6,0x02,0x19,0x1b,0x28,0x37,0x00,0x21,0xb8,0x01,0x50,0x40,0x1b,0x2c,0x19,0x00,0x2c,0x2c,0x00,0x19,0x03,0x31,0x0f,0x27,0x39,0x1b,0x1b,0x28,0x02,0x39,0x19,0x35,0x11,0x39,0x0c,0x34, -0x28,0x39,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x11,0x33,0x31,0x30,0x21,0x11,0x21,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x12,0x37,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23, -0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x37,0xfe,0xe5,0x0e,0x1a,0x16,0x14,0x08,0x0f,0x26,0x45,0x6f,0x5a,0x42,0x30,0x2b,0x33,0x2c,0x38,0x27,0x1e,0x12,0x19,0x34,0x1d,0x02,0x4a,0xe2,0x58,0x8b,0x60,0x33,0x36,0x65,0x8f,0x58,0xd6,0xc4,0x70,0x7a,0x74,0x76,0x03,0xa9,0x66,0xa5,0x87,0x6a,0x2a,0x4e,0x92,0x70,0x44,0x0f, -0x8f,0x16,0x28,0x51,0x7a,0x52,0x70,0x01,0x39,0xce,0xfe,0x44,0x2b,0x50,0x73,0x48,0x4a,0x77,0x53,0x2d,0x01,0xed,0xfe,0x9d,0x52,0x5d,0x60,0x54,0x00,0x02,0x00,0xb0,0x00,0x00,0x06,0x46,0x04,0x33,0x00,0x08,0x00,0x1f,0x00,0x49,0xb6,0x1f,0x01,0x37,0x14,0x1c,0x14,0x0e,0xb8,0x01,0x50,0x40,0x1c,0x05,0x14,0x05,0x14,0x05,0x21,0x1b, -0x17,0x37,0x18,0x16,0x39,0x1b,0x00,0x39,0x1f,0x1b,0x1f,0x1b,0x1f,0x1d,0x19,0x35,0x01,0x39,0x17,0x14,0x33,0x00,0x3f,0x33,0xed,0x3f,0x33,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x32, -0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x03,0xf3,0xbf,0x70,0x7a,0x6f,0x76,0x1e,0x58,0x8a,0x5e,0x31,0x36,0x65,0x8f,0x58,0xfe,0x8c,0xfe,0x03,0xa3,0xa3,0x01,0xfd,0xa3,0x01,0xed,0xfe,0x9d,0x52,0x5d,0x60,0x54,0x8a,0x2b,0x50,0x73,0x48,0x4a,0x77,0x53,0x2d,0x01,0xec,0xfe, -0x14,0x04,0x33,0xfe,0x43,0x01,0xbd,0xfe,0x44,0x00,0x00,0x01,0x00,0x22,0x00,0x00,0x04,0x64,0x04,0x33,0x00,0x12,0x00,0x34,0x40,0x1a,0x0f,0x07,0x37,0x08,0x00,0x37,0x01,0x08,0x01,0x08,0x01,0x14,0x0a,0x06,0x39,0x0f,0x0f,0x08,0x0e,0x0a,0x39,0x0b,0x35,0x01,0x08,0x33,0x00,0x3f,0x33,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f, -0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x20,0x11,0x04,0x64,0xa4,0x6f,0x65,0xfc,0xa3,0xfe,0xd5,0x03,0x3a,0xfe,0x94,0xfd,0x01,0x77,0x01,0x24,0x66,0x5f,0xfe,0x17,0x03,0xa9,0x8a,0x8a,0xfe,0xc7,0xfe,0xb4,0x00,0xff,0xff, -0x00,0xb0,0x00,0x00,0x03,0xec,0x06,0x28,0x02,0x26,0x0c,0xf5,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x42,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x36,0xff,0xed,0x03,0xf4,0x05,0xdc,0x02,0x26,0x0d,0xab,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xea,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1c, -0x01,0x1c,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0xb0,0xfe,0xe0,0x04,0x2f,0x04,0x33,0x00,0x0b,0x00,0x2e,0x40,0x17,0x01,0x37,0x04,0x00,0x37,0x09,0x04,0x09,0x04,0x09,0x0d,0x08,0x37,0x05,0x0a,0x06,0x35,0x08,0x39,0x01,0x05,0x33,0x03,0x00,0x2f,0x3f,0x33,0xed,0x3f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed, -0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0x2f,0xfe,0x8b,0x98,0xfe,0x8e,0xa3,0x02,0x38,0xa4,0xfe,0xe0,0x01,0x20,0x04,0x33,0xfc,0x57,0x03,0xa9,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x02,0x06,0x0c,0xeb,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x9c,0x04,0x33,0x00,0x10, -0x00,0x1b,0x00,0x2f,0x40,0x18,0x03,0x12,0x0b,0x38,0x16,0x16,0x1d,0x05,0x12,0x37,0x00,0x11,0x39,0x05,0x05,0x12,0x04,0x39,0x01,0x35,0x12,0x39,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x33,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e, -0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0xb0,0x02,0x7c,0xfe,0x27,0xca,0x58,0x8e,0x64,0x35,0x38,0x67,0x92,0x59,0xbf,0xac,0x7d,0x75,0x1b,0x3b,0x5c,0x40,0x04,0x33,0x8a,0xfe,0xce,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xed,0xfe,0x9d,0x50,0x5f,0x30,0x45,0x2b,0x14,0x00,0xff,0xff,0x00,0xb0,0x00,0x00, -0x03,0xa1,0x04,0x33,0x02,0x06,0x0c,0xec,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x1a,0x04,0x33,0x00,0x06,0x0d,0x6b,0x14,0x00,0x00,0x02,0x00,0x12,0xfe,0xdf,0x04,0x6c,0x04,0x33,0x00,0x0f,0x00,0x18,0x00,0x44,0x40,0x23,0x0f,0x37,0x02,0x0e,0x37,0x10,0x12,0x37,0x0c,0x18,0x07,0x0c,0x07,0x10,0x06,0x02,0x10,0x02,0x10,0x1a, -0x03,0x37,0x06,0x12,0x39,0x0c,0x35,0x01,0x04,0x0e,0x07,0x18,0x39,0x03,0x33,0x00,0x3f,0xed,0x32,0x32,0x2f,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x36,0x37,0x12,0x37,0x21,0x11,0x33,0x21,0x11, -0x21,0x06,0x06,0x07,0x06,0x06,0x07,0x04,0x6c,0x98,0xfc,0xd7,0x99,0x5d,0x3c,0x64,0x2a,0x55,0x0a,0x02,0x34,0xa0,0xfe,0xbd,0xfe,0xfd,0x07,0x2d,0x27,0x27,0x56,0x30,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0xab,0x61,0xdf,0x81,0x01,0x02,0xe6,0xfc,0x57,0x03,0x1f,0x58,0xcb,0x75,0x76,0xc2,0x4f,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27, -0x04,0x33,0x02,0x06,0x0c,0xef,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0xe7,0x04,0x33,0x00,0x1d,0x00,0x17,0x40,0x0a,0x06,0x37,0x07,0x07,0x1f,0x1e,0x15,0x35,0x07,0x33,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16, -0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x05,0xe7,0xc9,0xfe,0x47,0x15,0x0a,0x04,0x9c,0x04,0x0b,0x13,0xfe,0x46,0xca,0x01,0xff,0xfe,0x25,0xb9,0x01,0xa7,0x13,0x0b,0x04,0x9c,0x04,0x0a,0x15,0x01,0xa6,0xb8,0xfe,0x26,0x01,0xec,0x14,0x11,0xfd,0xef,0x02,0x11,0x10,0x15,0xfe,0x14,0x02,0x2e,0x02,0x05,0xfe,0x2f,0x15, -0x10,0x01,0xf6,0xfe,0x0a,0x10,0x15,0x01,0xd1,0xfd,0xfb,0x00,0x00,0x01,0x00,0x50,0xff,0xee,0x03,0x3d,0x04,0x45,0x00,0x2f,0x00,0x39,0x40,0x1e,0x10,0x38,0x17,0x0c,0x23,0x03,0x00,0x20,0x20,0x00,0x29,0x38,0x08,0x08,0x31,0x00,0x24,0x0b,0x3a,0x0c,0x0c,0x1b,0x03,0x3b,0x2e,0x34,0x15,0x3b,0x1b,0x36,0x00,0x3f,0xed,0x3f,0xed,0x11, -0x39,0x2f,0xed,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x50,0x88,0xa9, -0x3d,0x65,0x46,0x27,0xfe,0xd9,0x76,0x6c,0x7e,0x89,0x1e,0x38,0x50,0x33,0x8e,0x89,0x42,0x96,0x56,0x54,0x88,0x60,0x34,0x75,0x71,0x3d,0x64,0x47,0x27,0x3d,0x72,0xa2,0x65,0xca,0x2d,0x96,0x5c,0x1b,0x33,0x48,0x2d,0xc2,0x80,0x60,0x58,0x25,0x3e,0x2c,0x18,0x55,0x8d,0x22,0x20,0x26,0x46,0x61,0x3b,0x69,0x83,0x1c,0x03,0x06,0x2b,0x44, -0x59,0x34,0x4a,0x77,0x54,0x2d,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x00,0x18,0x00,0x1e,0x40,0x0e,0x0e,0x37,0x0c,0x0f,0x0f,0x1a,0x17,0x01,0x37,0x00,0x17,0x33,0x01,0x35,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x13,0x33,0x11,0x14,0x06,0x07,0x33,0x3e,0x03,0x37,0x01,0x33,0x11,0x23, -0x11,0x34,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0xb0,0x99,0x04,0x04,0x03,0x03,0x09,0x11,0x19,0x12,0x02,0x35,0xb9,0x99,0x06,0x05,0x08,0x29,0x1f,0xfd,0xcc,0xae,0x04,0x33,0xfd,0x39,0x39,0x4e,0x17,0x05,0x10,0x18,0x23,0x19,0x02,0xfc,0xfb,0xcd,0x02,0xe1,0x71,0x23,0x13,0x41,0x2a,0xfd,0x09,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a, -0x05,0xdc,0x02,0x26,0x0d,0xa0,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x65,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1c,0x01,0x1c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x02,0x06,0x0c,0xf5,0x00,0x00,0x00,0x01,0x00,0x0d,0xff,0xef,0x03,0xda,0x04,0x33,0x00,0x1b,0x00,0x2b,0x40,0x16,0x03,0x37,0x1a,0x00, -0x37,0x01,0x1a,0x01,0x1a,0x01,0x1d,0x10,0x03,0x39,0x1a,0x35,0x12,0x39,0x0d,0x34,0x01,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x12,0x37,0x21,0x03,0xda,0xa3,0xfe, -0xe5,0x0e,0x1a,0x16,0x14,0x08,0x0f,0x26,0x45,0x6f,0x5a,0x42,0x30,0x2b,0x33,0x2c,0x38,0x27,0x1e,0x12,0x19,0x34,0x1d,0x02,0x4a,0x03,0xa9,0x66,0xa5,0x87,0x6a,0x2a,0x4e,0x92,0x70,0x44,0x0f,0x8f,0x16,0x28,0x51,0x7a,0x52,0x70,0x01,0x39,0xce,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x05,0x62,0x04,0x33,0x02,0x06,0x0c,0xf7,0x00,0x00, -0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x02,0x06,0x0c,0xf2,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x02,0x06,0x0c,0xf9,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x37,0x04,0x33,0x02,0x06,0x0d,0x78,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x02,0x06,0x0c,0xfa,0x00,0x00, -0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x04,0x45,0x02,0x06,0x0c,0xed,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x02,0x06,0x0c,0xfe,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0xed,0x03,0xf4,0x04,0x33,0x00,0x18,0x00,0x23,0x40,0x10,0x18,0x00,0x00,0x1a,0x12,0x11,0x10,0x16,0x06,0x18,0x11,0x35,0x0b,0x39,0x06,0x34, -0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x01,0x01,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x01,0x03,0xf4,0xfe,0x91,0x2c,0x56,0x61,0x72,0x48,0x57,0x3d,0x45,0x4c,0x1f,0x3a,0x39,0x3b,0x21,0xfe,0x63,0xb6,0x01,0x18,0x08,0x11, -0x06,0x01,0x01,0x23,0x04,0x33,0xfd,0x12,0x5a,0x82,0x54,0x28,0x17,0x98,0x26,0x0e,0x29,0x49,0x3c,0x03,0x01,0xfd,0xdc,0x0e,0x26,0x12,0x02,0x6a,0xff,0xff,0x00,0x50,0xff,0xf5,0x04,0xb1,0x04,0x3d,0x02,0x06,0x0d,0x7d,0x00,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x02,0x06,0x0d,0x02,0x00,0x00,0x00,0x01,0x00,0xb0, -0xfe,0xdf,0x04,0xce,0x04,0x33,0x00,0x0b,0x00,0x2a,0x40,0x15,0x02,0x37,0x0b,0x0b,0x09,0x37,0x08,0x08,0x0d,0x05,0x37,0x04,0x08,0x04,0x35,0x0a,0x06,0x39,0x03,0x33,0x01,0x00,0x2f,0x3f,0xed,0x32,0x3f,0x33,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33, -0x04,0xce,0x99,0xfc,0x7b,0xa3,0x02,0x38,0xa4,0x9f,0xfe,0xdf,0x01,0x21,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xb0,0x04,0x33,0x00,0x15,0x00,0x2b,0x40,0x15,0x15,0x37,0x02,0x14,0x14,0x17,0x0c,0x37,0x0b,0x10,0x39,0x02,0x0b,0x05,0x05,0x01,0x14,0x0b,0x35,0x01,0x33,0x00,0x3f,0x3f,0x33,0x12, -0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x23,0x11,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x03,0xb0,0xa3,0x56,0xa7,0x60,0x47,0x72,0x4f,0x2b,0xa3,0x54,0x60,0x4b,0x99,0x55,0xa3,0x01,0xd8,0x28,0x33,0x26,0x4b,0x6f,0x49,0x01,0x8d,0xfe, -0x90,0x64,0x5b,0x28,0x26,0x01,0xe1,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x05,0xc3,0x04,0x33,0x00,0x0b,0x00,0x2e,0x40,0x17,0x07,0x37,0x06,0x0b,0x37,0x0a,0x06,0x0a,0x06,0x0a,0x0d,0x03,0x37,0x02,0x0a,0x06,0x02,0x35,0x08,0x04,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0x33,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed, -0x10,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x05,0xc3,0xfa,0xed,0xa3,0x01,0x95,0xa3,0x01,0x95,0xa3,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x03,0xa9,0x00,0x00,0x01,0x00,0xb0,0xfe,0xdf,0x06,0x61,0x04,0x33,0x00,0x0f,0x00,0x39,0x40,0x1d,0x05,0x37,0x04,0x0e,0x37,0x0b,0x0b,0x09,0x37,0x08, -0x04,0x08,0x04,0x08,0x11,0x01,0x37,0x00,0x0a,0x06,0x02,0x39,0x0f,0x33,0x0d,0x08,0x04,0x00,0x35,0x00,0x3f,0x32,0x32,0x2f,0x3f,0xed,0x32,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x2f,0xed,0x10,0xed,0x31,0x30,0x13,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x21,0xb0,0xa3,0x01, -0x95,0xa3,0x01,0x95,0xa3,0x9e,0x99,0xfa,0xe8,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x03,0xa9,0xfc,0x57,0xfe,0x55,0x01,0x21,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x04,0x3b,0x04,0x33,0x00,0x10,0x00,0x19,0x00,0x33,0x40,0x1a,0x05,0x12,0x37,0x00,0x0b,0x38,0x16,0x00,0x16,0x00,0x16,0x1b,0x02,0x11,0x3a,0x05,0x05,0x12,0x02,0x39, -0x03,0x35,0x12,0x3a,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x4d,0xfe,0xd5,0x01,0xce,0xca,0x58,0x8f,0x64,0x36, -0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x03,0xa9,0x8a,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0x00,0x00,0x03,0x00,0xb0,0x00,0x00,0x04,0xf1,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x1b,0x00,0x35,0x40,0x1b,0x09,0x38,0x14,0x18,0x37,0x19,0x14,0x19,0x14,0x19,0x1d,0x03, -0x10,0x37,0x00,0x0f,0x3a,0x03,0x03,0x1a,0x01,0x35,0x10,0x3a,0x19,0x00,0x33,0x00,0x3f,0x32,0xed,0x3f,0x33,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x23,0x11, -0x33,0xb0,0xa3,0xca,0x58,0x8f,0x64,0x36,0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x02,0xf2,0xa4,0xa4,0x04,0x33,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0xfe,0x0f,0x04,0x33,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x9e,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x26,0x40,0x13, -0x09,0x38,0x14,0x14,0x19,0x03,0x10,0x37,0x00,0x0f,0x3a,0x03,0x03,0x01,0x35,0x10,0x3a,0x00,0x33,0x00,0x3f,0xed,0x3f,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0xb0,0xa3,0xca,0x58,0x8f,0x64, -0x36,0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x04,0x33,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0x00,0x00,0x01,0x00,0x54,0xff,0xee,0x03,0xc6,0x04,0x45,0x00,0x1c,0x00,0x2e,0x40,0x17,0x15,0x38,0x08,0x06,0x00,0x05,0x05,0x1e,0x0d,0x00,0x06,0x39,0x07,0x07,0x10,0x02, -0x39,0x1a,0x34,0x0b,0x39,0x10,0x36,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0xed,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x54,0x82,0xba,0xb4,0xc8,0x0e,0xfe,0x08,0x01, -0xf7,0x15,0xcf,0xb1,0xaa,0x86,0x7f,0xb0,0x86,0xd7,0x96,0x50,0x50,0x92,0xcd,0x7d,0xc4,0x82,0xbf,0x48,0xb7,0xa5,0x89,0xb6,0xa9,0x40,0x9e,0x2c,0x4d,0x94,0xd6,0x89,0x7f,0xc7,0x89,0x48,0x3f,0x00,0x00,0x02,0x00,0xb0,0xff,0xed,0x06,0x88,0x04,0x45,0x00,0x1a,0x00,0x2a,0x00,0x43,0xb9,0x00,0x23,0x01,0x50,0x40,0x20,0x0a,0x11,0x0a, -0x00,0x38,0x1b,0x0a,0x1b,0x0a,0x1b,0x2c,0x10,0x0c,0x37,0x0d,0x0b,0x3a,0x10,0x10,0x28,0x1e,0x39,0x16,0x36,0x0e,0x35,0x0d,0x33,0x28,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e, -0x02,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x06,0x88,0x52,0x91,0xc9,0x77,0x74,0xc1,0x8d,0x52,0x05,0xf9,0xa3,0xa3,0xfe,0x0e,0x57,0x8c,0xc0,0x78,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57, -0xb8,0xc0,0x02,0x27,0x86,0xd4,0x93,0x4d,0x4b,0x87,0xbd,0x72,0xfe,0x12,0x04,0x33,0xfe,0x3d,0x68,0xac,0x7c,0x45,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x00,0x02,0x00,0x12,0x00,0x00,0x03,0x39,0x04,0x33,0x00,0x1c,0x00,0x27,0x00,0x3d,0xb9,0x00,0x22,0x01,0x50,0x40,0x1b,0x16,0x1d,0x00, -0x37,0x01,0x10,0x01,0x16,0x01,0x16,0x01,0x29,0x09,0x0a,0x10,0x03,0x3a,0x27,0x27,0x09,0x1e,0x3a,0x1c,0x35,0x01,0x09,0x33,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x33,0x10,0xed,0x31,0x30,0x21,0x23,0x11,0x23,0x22,0x0e,0x02,0x07,0x03,0x23,0x13,0x3e,0x03, -0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x03,0x39,0xa4,0x9c,0x16,0x26,0x24,0x24,0x14,0x97,0xb8,0xb7,0x08,0x1b,0x23,0x2b,0x18,0x3b,0x5d,0x40,0x22,0x39,0x66,0x8f,0x56,0x01,0x5d,0xa3,0xb0,0x6d,0x77,0x20,0x3b,0x52,0x33,0x01,0xb5,0x08,0x1b,0x32,0x2a,0xfe,0xca,0x01, -0x63,0x10,0x26,0x24,0x1e,0x09,0x03,0x0c,0x32,0x49,0x5d,0x36,0x46,0x71,0x50,0x2b,0xfe,0x08,0x01,0x72,0x5e,0x58,0x2c,0x45,0x31,0x1a,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x1a,0x04,0xf9,0x00,0x07,0x00,0x1f,0x40,0x0f,0x00,0x37,0x05,0x05,0x09,0x02,0x37,0x03,0x06,0x01,0x39,0x04,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0xce,0x01,0x2f, -0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x33,0x03,0x1a,0xfe,0x39,0xa3,0x01,0xda,0x90,0x03,0xa9,0xfc,0x57,0x04,0x33,0xc6,0x00,0x01,0x00,0x35,0x00,0x00,0x03,0xff,0x06,0x04,0x00,0x1d,0x00,0x37,0x40,0x1c,0x1c,0x04,0x84,0x09,0x05,0x05,0x01,0x07,0x13,0x00,0x84,0x01,0x13,0x13,0x08,0x16,0x95,0x0f, -0x01,0x03,0x07,0x95,0x1c,0x08,0x0f,0x01,0x05,0x15,0x00,0x3f,0x33,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x21,0x03, -0xff,0xa4,0xfe,0x2c,0xa4,0xae,0xae,0x40,0x81,0xc2,0x81,0x48,0x7e,0x23,0x2e,0x7f,0x49,0x53,0x7f,0x56,0x2b,0x02,0x78,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xb3,0x8a,0x54,0x09,0x09,0x94,0x0e,0x0d,0x37,0x61,0x85,0x4f,0x0d,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x04,0x01,0x06,0x04,0x00,0x1d,0x00,0x33,0x40,0x1a,0x0b,0x0f, -0x84,0x14,0x10,0x0d,0x10,0x0d,0x01,0x12,0x00,0x84,0x01,0x05,0x95,0x1a,0x01,0x0e,0x12,0x95,0x0b,0x13,0x0f,0x01,0x10,0x15,0x00,0x3f,0x33,0x3f,0x33,0xed,0x32,0x3f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11, -0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x04,0x01,0xa2,0x17,0x56,0x2c,0x53,0x79,0x4e,0x25,0xf1,0xf1,0xa4,0xae,0xae,0x3a,0x79,0xbc,0x81,0x3e,0x96,0x5a,0x05,0x6e,0x04,0x07,0x37,0x61,0x85,0x4f,0x0d,0x8b,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xb3,0x8a,0x54,0x0b,0x0d,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x05,0x19, -0x06,0x02,0x00,0x2c,0x00,0x59,0x40,0x2f,0x11,0x28,0x84,0x29,0x00,0x29,0x20,0x24,0x84,0x12,0x0a,0x25,0x29,0x25,0x22,0x22,0x25,0x29,0x03,0x1a,0x2b,0x1a,0x27,0x23,0x2b,0x95,0x2c,0x0a,0x1b,0x0a,0x1b,0x06,0x20,0x11,0x2c,0x0f,0x25,0x29,0x15,0x1d,0x95,0x18,0x01,0x0d,0x95,0x06,0x00,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x3f,0x33, -0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x13,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x15, -0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0xe3,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e,0x53,0x30,0x6d,0x71,0x01,0xd5,0x30,0x57,0x78,0x47,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0xf0,0xa4,0xfe,0x2b,0xa4,0xae,0x04,0x00,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0xa6,0x4e,0x80,0x5b,0x33,0x12,0x94,0x1b, -0xd9,0x9e,0x8b,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x00,0x01,0x00,0x35,0x00,0x00,0x06,0x78,0x06,0x04,0x00,0x33,0x00,0x62,0x40,0x36,0x1e,0x08,0x84,0x09,0x0d,0x09,0x32,0x04,0x84,0x1f,0x17,0x05,0x09,0x05,0x09,0x05,0x01,0x0b,0x29,0x00,0x84,0x01,0x2c,0x95,0x25,0x01,0xb0,0x29,0xc0,0x29,0xe0,0x29,0x03,0x17,0x29,0x17, -0x29,0x0c,0x1a,0x95,0x13,0x00,0x07,0x03,0x0b,0x95,0x32,0x1e,0x0c,0x0f,0x05,0x01,0x09,0x15,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x3f,0xed,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21, -0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x21,0x06,0x78,0xa4,0xfe,0x2c,0xa4,0xfe,0x2b,0xa4,0xae,0xae,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e, -0x53,0x30,0x6d,0x71,0x01,0xd5,0x40,0x81,0xc2,0x81,0x48,0x7e,0x23,0x2e,0x7f,0x49,0x53,0x7f,0x56,0x2b,0x02,0x78,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0x15,0x5e,0xb3,0x8a,0x54,0x09,0x09,0x94,0x0e,0x0d,0x37,0x61,0x85,0x4f,0x0d,0x00,0x00,0x01, -0x00,0x35,0x00,0x00,0x06,0x78,0x06,0x04,0x00,0x33,0x00,0x58,0x40,0x2f,0x29,0x13,0x84,0x14,0x18,0x14,0x0b,0x0f,0x84,0x2a,0x22,0x10,0x14,0x10,0x0d,0x0d,0x10,0x14,0x03,0x01,0x16,0x00,0x84,0x01,0x05,0x95,0x30,0x01,0x22,0x22,0x17,0x25,0x95,0x1e,0x00,0x12,0x0e,0x16,0x95,0x29,0x0b,0x17,0x0f,0x10,0x01,0x14,0x15,0x00,0x3f,0x33, -0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x2f,0x3f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02, -0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x06,0x78,0xa2,0x17,0x56,0x2c,0x53,0x79,0x4e,0x25,0xf1,0xf1,0xa4,0xfe,0x2d,0xa4,0xae,0xae,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e,0x53,0x30,0x6d,0x71,0x01,0xd3,0x3a,0x79,0xbc,0x81,0x3e,0x96,0x5a,0x05,0x6e,0x04,0x07, -0x37,0x61,0x85,0x4f,0x0d,0x8b,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0x15,0x5e,0xb3,0x8a,0x54,0x0b,0x0d,0x00,0x00,0x03,0x00,0x57,0xff,0xef,0x05,0x31,0x04,0x45,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0x6d,0x40,0x3e,0x38,0x05,0x0f,0x33,0x37,0x2c,0x29,0x49, -0x2c,0x53,0x24,0x4e,0x12,0x03,0x17,0x21,0x37,0x58,0x60,0x37,0x17,0x40,0x2c,0x58,0x17,0x17,0x58,0x2c,0x40,0x04,0x69,0x53,0x37,0x0f,0x12,0x4e,0x49,0x05,0x04,0x00,0x5d,0x3b,0x1c,0x2f,0x2f,0x44,0x65,0x24,0x29,0x38,0x04,0x3d,0x1c,0x36,0x44,0x39,0x0a,0x34,0x3d,0x39,0x00,0x34,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x17,0x39,0x12, -0x39,0x2f,0x10,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07, -0x1e,0x03,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x13,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x04,0xb2,0x2f,0x4a,0x41,0x3b,0x1f,0x23,0x56,0x6a, -0x7e,0x4b,0x5c,0x97,0x6c,0x3c,0x8b,0x85,0x19,0x30,0x26,0x17,0x30,0x53,0x71,0x41,0x40,0x6c,0x4d,0x2b,0x65,0x65,0x34,0x56,0x4a,0x3f,0x1e,0x33,0x35,0x08,0x07,0xa1,0x08,0x06,0x14,0x2a,0x40,0x2c,0x1d,0x2d,0x2d,0x33,0x21,0x18,0x34,0x1b,0x1e,0x41,0xfd,0x20,0x3a,0x63,0x52,0x44,0x1c,0x2a,0x4f,0x56,0x63,0x3d,0x2d,0x4e,0x39,0x20, -0x26,0x42,0x59,0xde,0x19,0x28,0x31,0x18,0x44,0x51,0x01,0x14,0x21,0x2a,0x17,0x5a,0x50,0x11,0x12,0x23,0x33,0x20,0x1b,0x31,0x26,0x16,0x2a,0x51,0x76,0x4b,0x73,0xa1,0x34,0x10,0x2b,0x36,0x43,0x28,0x3c,0x5b,0x3f,0x20,0x20,0x3c,0x54,0x34,0x5a,0x77,0x2a,0x14,0x3b,0x48,0x53,0x2b,0x55,0xcb,0x70,0x1d,0x32,0x19,0x19,0x2c,0x1e,0x40, -0x86,0x83,0x7e,0x37,0x20,0x2b,0x1a,0x0b,0x0c,0x09,0x85,0x0e,0x0b,0x8b,0x10,0x1d,0x27,0x18,0x3e,0x63,0x4d,0x3a,0x16,0x11,0x29,0x39,0x4a,0x32,0x2f,0x46,0x2e,0x18,0x02,0xd7,0x1f,0x2e,0x1e,0x0e,0x45,0x3b,0x1a,0x2f,0x28,0x20,0x0b,0x1c,0x4e,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x2c,0x02,0x26,0x0c,0xed,0x00,0x00, -0x01,0x07,0x00,0xd7,0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x06,0x2c,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x1e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xfe,0x85,0x03,0x08, -0x04,0x45,0x02,0x26,0x0c,0xfd,0x00,0x00,0x00,0x06,0x01,0x9c,0x25,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0xff,0xff,0x00,0x52,0x00,0x00,0x03,0xbf,0x05,0x9a,0x01,0x0f,0x00,0x33,0x04,0x7b,0x05,0x9a, -0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x03,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0x27,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x27,0x00,0x00,0x04,0x0a,0x05,0x9a,0x01,0x47,0x00,0x37,0xff,0xfe,0x05,0x9a, -0x40,0x00,0xc0,0x00,0x00,0x07,0xb2,0x00,0x07,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x05,0xb2,0x02,0x06,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x00,0x03,0xe8,0x05,0x9a,0x01,0x0f,0x00,0x2e,0x04,0xa4,0x05,0x9a, -0xc0,0x00,0x00,0x07,0xb2,0x00,0x08,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x01,0x0f,0x00,0x26,0x04,0xf4,0x05,0x9a,0xc0,0x00, -0x00,0x07,0xb2,0x00,0x08,0x13,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x02,0x06,0x00,0x3d,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0x94,0x05,0x9a,0x02,0x06,0x00,0x29,0x00,0x00,0xff,0xff,0x00,0x54,0x00,0x00,0x03,0x2c,0x05,0x9a,0x01,0x0f,0x00,0x29,0x03,0xe8,0x05,0x9a,0xc0,0x00,0x00,0x07, -0xb2,0x00,0x08,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x00,0x31,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde, -0x05,0xb2,0x02,0x06,0x00,0x36,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x05,0x9a,0x02,0x06,0x00,0x35,0x00,0x00,0xff,0xff,0x00,0x09,0x00,0x00,0x04,0x0d,0x05,0x9a,0x01,0x0f,0x00,0x35,0x04,0xc9,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x0b,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6, -0x05,0x9a,0x01,0x0f,0x00,0x39,0x04,0xf8,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6,0x05,0x9a,0x02,0x06,0x00,0x39,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0x91,0xff,0xe8,0x05,0x1f,0x05,0xb2, -0x01,0x0f,0x00,0x2a,0x05,0x7d,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x08,0x13,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x02,0xc7,0x05,0xb2,0x01,0x0f,0x00,0x2d,0x02,0xdb,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x0b,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x02,0x06,0x00,0x3a, -0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x03,0xda,0x05,0x9a,0x01,0x0f,0x00,0x25,0x04,0x96,0x05,0x9a,0xc0,0x00,0x00,0x0b,0xb4,0x02,0x01,0x00,0x01,0x12,0x00,0x3f, -0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0x17,0x00,0x00,0x05,0x13,0x05,0x9a,0x01,0x0f,0x00,0x24,0x05,0x29,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x06,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06, -0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x58,0x00,0x00,0x03,0x50,0x05,0x9a,0x01,0x0f,0x00,0x28,0x04,0x0c,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32, -0x00,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x05,0x9a,0x02,0x06,0x00,0x38,0x00,0x00,0xff,0xff,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0xb2,0x01,0x0f,0x00,0x38,0x05,0x7f,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x05,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x01,0x0f,0x00,0x2f,0x03,0xc4, -0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x5e,0x00,0x00,0x04,0xe0,0x05,0x9a,0x01,0x0f,0x00,0x27,0x05,0x9c,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x01,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x00,0xcb,0x02,0x06,0x00,0x11,0x00,0x00,0xff,0xff, -0x00,0x27,0xfe,0xf8,0x01,0x3c,0x00,0xe4,0x02,0x06,0x00,0x0f,0x00,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x03,0x0c,0x00,0xcb,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x00,0x11,0x01,0xbc,0x00,0x00,0xff,0xff,0x00,0x70,0xfe,0xf8,0x02,0xf8,0x00,0xe4,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x00,0x0f,0x01,0xbc,0x00,0x00,0xff,0xff, -0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16,0x02,0x06,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x02,0x06,0x00,0x1d,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0xea,0x04,0x83,0x02,0x7b,0x00,0x26,0x00,0x10,0x00,0x00,0x00,0x07,0x00,0x11,0x03,0x33,0x00,0x00,0xff,0xff,0x00,0x90,0x01,0xc8,0x02,0xb2,0x03,0xf4, -0x02,0x27,0x00,0x10,0x00,0x00,0x01,0x79,0x00,0x06,0x00,0x10,0x00,0xce,0x00,0x01,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x61,0x40,0x40,0x02,0x0a,0x92,0x0b,0x03,0x03,0x07,0x92,0x40,0x06,0x01,0x04,0x0e,0x03,0x07,0x08,0x42,0x0a,0x07,0x40,0x03,0x06,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x06,0x0b,0x06, -0x4d,0x03,0x7e,0x08,0x08,0x04,0x0d,0x06,0x4d,0x08,0x02,0x0c,0x06,0x4d,0x08,0x02,0x0b,0x06,0x4d,0x08,0x40,0x0d,0x01,0x4d,0x0c,0x0d,0x08,0x7e,0xff,0x30,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x1a,0x18,0xcd,0x32,0x2b,0x01,0x10,0xe1,0x32,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x01,0x15,0x23, -0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x01,0xf0,0x8c,0x8c,0xfe,0x40,0x8c,0x8c,0x05,0x9a,0x90,0xfb,0x86,0x90,0x90,0x04,0x7a,0x90,0x00,0x00,0x02,0x00,0x5e,0xfe,0x7c,0x05,0xcc,0x05,0xb2,0x00,0x28,0x00,0x38,0x00,0x96,0x40,0x29,0x78,0x12,0x01,0x14,0x00,0x29,0x91,0x0b,0x04,0x31,0x91,0x00,0x19,0xee,0x24,0x1e,0x1e,0x75, -0x14,0x01,0x14,0x00,0x07,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x35,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x35,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x35,0xb8,0xff,0xea,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x35,0x30,0x35,0x02,0x35,0x35,0x3a,0x2d,0x06,0x0d,0x06,0x4d,0x2d,0x06,0x0c,0x06, -0x4d,0x2d,0x06,0x0b,0x06,0x4d,0x2d,0x7d,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x10,0x0b,0x06,0x4d,0x07,0x2f,0x3a,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x5d,0xc2,0x2f,0x00,0x2f,0xed,0x2f,0xed,0x3f,0xed,0x12,0x39,0x31,0x30, -0x01,0x5d,0x05,0x22,0x2e,0x02,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x03,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x10,0x27,0x26,0x02,0xf4,0x40,0x84,0x7c,0x71,0x2e,0xb7,0xba,0xbc,0x01,0x46,0x01, -0x24,0xb6,0xb6,0x3d,0x7c,0xbc,0x80,0x34,0x5b,0x5b,0x62,0x3b,0x10,0x26,0x27,0x24,0x0f,0x10,0x28,0x29,0x28,0x11,0x60,0x99,0x85,0x7c,0x2e,0xe2,0x8d,0x8d,0x89,0x8a,0xdd,0xec,0x88,0x88,0x84,0x84,0x18,0x19,0x33,0x4b,0x32,0xc8,0x01,0x43,0x01,0x5b,0xcd,0xce,0xc8,0xc8,0xfe,0xbd,0x88,0xf1,0xc2,0x87,0x1d,0x38,0x56,0x3b,0x1e,0x03, -0x07,0x09,0x06,0xa2,0x05,0x07,0x05,0x03,0x39,0x63,0x84,0x05,0x7e,0xa3,0xa3,0xfe,0xf7,0xfe,0xf8,0xa3,0xa1,0x9a,0x9a,0x01,0x15,0x01,0x1d,0x9a,0x9b,0x00,0x00,0x03,0x00,0x77,0xff,0xe7,0x05,0x91,0x05,0xb2,0x00,0x29,0x00,0x37,0x00,0x46,0x00,0x69,0x40,0x3c,0x02,0x38,0x3b,0x0b,0x04,0x12,0x04,0x24,0x27,0x1f,0x1c,0x36,0x24,0x05, -0x12,0x01,0x45,0x95,0x04,0x13,0x2f,0x96,0x12,0x04,0x27,0x02,0x25,0x09,0x1f,0x38,0x24,0x40,0x0b,0x36,0x3b,0x1c,0x04,0x17,0x0d,0x25,0xef,0x24,0x17,0x84,0x2a,0x34,0x84,0x0d,0x0d,0x2a,0x24,0x03,0x09,0x01,0x00,0x00,0x48,0x40,0x83,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x17,0x39,0x2f,0xe1,0x2f,0xe1,0x2f,0xe1,0x11,0x12,0x17, -0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2f,0x11,0x17,0x39,0x2f,0x11,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x27,0x06,0x21,0x22,0x2e,0x02,0x35,0x34,0x25,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x17,0x3e,0x03,0x37,0x33,0x02,0x07,0x16,0x16,0x01,0x34,0x2e, -0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x17,0x36,0x13,0x26,0x26,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x05,0x91,0xe5,0x9a,0xc2,0xfe,0xed,0x67,0xa7,0x77,0x41,0x01,0x47,0x9b,0x38,0x65,0x8a,0x52,0x4d,0x7e,0x5a,0x31,0x21,0x4c,0x7c,0x5b,0x67,0xbb,0x55,0x17,0x29,0x20,0x12,0x01,0x97,0x01,0xab,0x14,0x87,0xfe,0x34,0x1c,0x30, -0x41,0x25,0x32,0x50,0x39,0x1e,0x8d,0xfe,0x62,0x46,0xcc,0x87,0x45,0x60,0x3c,0x1b,0x2c,0x4d,0x68,0x3d,0xdc,0x9e,0xb7,0x39,0x66,0x8e,0x56,0xfd,0xa7,0xc7,0x8b,0x49,0x7c,0x5a,0x33,0x2d,0x50,0x6e,0x40,0x42,0x6b,0x5f,0x56,0x2d,0x6d,0xbe,0x54,0x21,0x5c,0x67,0x6a,0x2f,0xfe,0xf2,0xd8,0x14,0x87,0x04,0x04,0x27,0x43,0x30,0x1c,0x1e, -0x37,0x4c,0x2e,0x6d,0x9d,0x7a,0xfd,0x30,0x48,0xd3,0x8f,0x23,0x45,0x4b,0x54,0x32,0x3a,0x5e,0x42,0x24,0x00,0x02,0x00,0xb4,0xff,0xee,0x01,0x91,0x05,0x9a,0x00,0x03,0x00,0x17,0x00,0x1e,0x40,0x0f,0x03,0x03,0x02,0x13,0xb0,0x09,0x13,0x01,0x02,0x00,0x7d,0x03,0x04,0xaf,0x0e,0x2f,0xe1,0xd4,0xe1,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f, -0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x01,0x77,0x14,0x72,0x14,0xb4,0x11,0x1e,0x28,0x17,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x16,0x28,0x1e,0x12,0x05,0x9a,0xfb,0xf9,0x04,0x07,0xfa,0xc2,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x17,0x28,0x1e,0x12, -0x12,0x1e,0x29,0x00,0x00,0x01,0x00,0x5c,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x14,0x00,0x17,0x40,0x0a,0x14,0x0c,0xb2,0x15,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31,0x30,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x5c,0x37,0x4c, -0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x5e,0xfe,0xed,0x01,0x52,0x04,0x17,0x00,0x13,0x00,0x28,0x00,0x22,0x40,0x11,0x05,0xb0,0x0f,0x10,0x28,0x20,0xb2,0x29,0x00,0xaf,0x0a,0x17,0x23,0x14, -0x23,0xaf,0x1d,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x10,0xf4,0xc4,0x3f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0x52,0x12,0x1e,0x29,0x18,0x17,0x28,0x1e,0x11, -0x11,0x1e,0x28,0x17,0x16,0x29,0x20,0x12,0xf4,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x03,0xa8,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x28,0x1e,0x12,0x11,0x1e,0x29,0xfb,0x69,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x02,0x00,0x83, -0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x32,0x40,0x0b,0x19,0x17,0x95,0x1c,0x04,0x09,0x30,0xb0,0x26,0x13,0x08,0xb8,0x01,0x03,0x40,0x0c,0x09,0x21,0xaf,0x2b,0x2b,0x19,0x00,0x84,0x12,0x12,0x36,0x19,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x14, -0x07,0x0e,0x03,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x31,0xcf,0x31,0x44,0x2a,0x12,0x70,0x0f,0x25,0x3d,0x2d,0x57,0x59,0x21,0x3d,0x55,0x34,0xa9,0x7c,0x99,0xa5, -0x53,0x88,0x60,0x35,0xfe,0xc1,0x11,0x1e,0x28,0x18,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x17,0x28,0x1e,0x12,0x04,0x5a,0xce,0xaf,0x2a,0x41,0x39,0x3a,0x22,0x4a,0x4e,0x31,0x52,0x4a,0x48,0x29,0x4e,0x8f,0x50,0x31,0x51,0x39,0x20,0x85,0xb0,0x60,0x32,0x5a,0x7f,0xfb,0xb5,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x17,0x28,0x1e, -0x12,0x12,0x1e,0x28,0x00,0x02,0x00,0x6f,0x03,0xd0,0x02,0x9c,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x32,0x40,0x18,0x21,0x0c,0x29,0x14,0x04,0x18,0x1e,0x24,0x03,0x09,0x0f,0x15,0x15,0x1e,0xaf,0x24,0x24,0x2b,0x11,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00, -0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x05,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x01,0x6b, -0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0x03,0xd0,0x02,0x95,0x05,0xb2, -0x00,0x14,0x00,0x29,0x00,0x2c,0x40,0x15,0x14,0x29,0x0c,0x21,0x04,0x03,0x0f,0x09,0x18,0x24,0x1e,0x00,0x0f,0xaf,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0xc6,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32, -0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18, -0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x6f,0x03,0xd0,0x01,0x61,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x0c,0x14,0x04,0x03,0x09,0x0f,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2, -0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44, -0x1e,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x15,0x40,0x09,0x14,0x0c,0x04,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x74,0x37,0x4c,0x14,0x1a,0x28,0x1a, -0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x62,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x16,0x00,0x17,0x40,0x0a,0x16,0x0e,0xb2,0x17,0x05,0x11,0x00,0x11,0xaf,0x0b,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31, -0x30,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x62,0x1b,0x31,0x24,0x15,0x19,0x1d,0x28,0x1a,0x2f,0x30,0x3b,0x45,0x20,0x35,0x46,0x27,0xde,0x16,0x31,0x31,0x2f,0x15,0x19,0x13,0x0d,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68, -0xfe,0xed,0x02,0x95,0x00,0xcf,0x00,0x14,0x00,0x29,0x00,0x2a,0x40,0x14,0x14,0x0c,0x29,0x21,0xb2,0x2a,0x18,0x24,0x1e,0x03,0x0f,0xaf,0x09,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x2f,0xe1,0x39,0x11,0x12,0x39,0x00,0x10,0xf4,0xc4,0x33,0x32,0x31,0x30,0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35, -0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d, -0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0xff,0xff,0x00,0x60,0xff,0xe8,0x05,0x76,0x05,0xf6,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x0e,0x10,0x03,0x70,0x06,0x63,0x00,0x14,0x40,0x0b, -0x02,0x27,0x9d,0x27,0x27,0x10,0x10,0x25,0x02,0x2a,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0xa4,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x0e,0x10,0x01,0x54,0x06,0x11,0x00,0x16,0xb1,0x01,0x15,0xb8,0xff,0xb6,0xb7,0x15,0x15,0x05,0x05,0x25,0x01,0x12,0x04,0x00,0x3f,0x35,0x01,0x2b, -0x11,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0x8b,0x05,0xf6,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x0e,0x10,0x00,0x85,0x06,0x63,0x00,0x14,0x40,0x0b,0x01,0x0d,0x78,0x0d,0x0d,0x03,0x03,0x25,0x01,0x10,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0xff,0xe4,0x00,0x00,0x04,0x4a,0x05,0xb2,0x00,0x26,0x00,0x51,0x52,0x00, -0x01,0x07,0x0d,0xfc,0xff,0x70,0x00,0x00,0x00,0x16,0xb1,0x01,0x1f,0xb8,0xff,0x62,0xb7,0x1f,0x1f,0x0a,0x0a,0x25,0x01,0x1f,0x04,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0x5e,0xfe,0x05,0x04,0xec,0x05,0xb2,0x02,0x26,0x00,0x2a,0x00,0x00,0x00,0x07,0x0e,0x10,0x01,0x65,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10, -0x06,0x3c,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x0f,0x0e,0x10,0x03,0xe5,0x04,0x41,0xc0,0x00,0x00,0x15,0x40,0x0c,0x02,0x32,0x11,0x26,0x02,0x35,0x0b,0x35,0x2f,0x10,0x18,0x25,0x01,0x2b,0x11,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xd6, -0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0x87,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x00,0x07,0x0e,0x10,0x01,0x45,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51, -0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xc5,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xf9,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x06,0x0e,0x10,0xed,0x00,0xff,0xff,0x00,0x2b,0xff,0xea,0x03,0x7f, -0x05,0xf6,0x00,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x0e,0x10,0x01,0x79,0x06,0x63,0x00,0x16,0xb1,0x01,0x1e,0xb8,0x01,0x37,0xb7,0x1e,0x1e,0x0a,0x0a,0x25,0x01,0x21,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0x79,0xfe,0x05,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x06,0x0e,0x10,0x7f,0x00,0xff,0xff, -0x00,0x68,0xfe,0x05,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06,0x0e,0x10,0x14,0x00,0xff,0xff,0x00,0x5e,0xfe,0xed,0x01,0x52,0x04,0x17,0x02,0x06,0x0d,0xf7,0x00,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x00,0x08,0x04,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x2f, -0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x36,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a, -0x5f,0x2d,0x00,0x01,0x01,0x3d,0xfe,0x05,0x02,0x06,0xff,0x93,0x00,0x12,0x00,0x12,0xb6,0x12,0x0c,0x03,0x0f,0x00,0x0f,0x09,0x2f,0xc1,0xc4,0x12,0x39,0x00,0x2f,0xc4,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x50,0x31,0x21,0x12,0x17,0x24,0x18,0x2b,0x2e,0x33, -0x3d,0x45,0x46,0xfe,0x3a,0x28,0x41,0x17,0x16,0x12,0x0b,0x10,0x22,0x1e,0x22,0x34,0x48,0x45,0x4e,0x7c,0x37,0x00,0xff,0xff,0x00,0x29,0xfe,0x05,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x00,0x06,0x0e,0x10,0x7a,0x00,0xff,0xff,0x00,0x2b,0xfe,0x05,0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x00,0x06,0x0e,0x10, -0xe5,0x00,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x3d,0x00,0x60,0x40,0x25,0x3b,0x36,0x14,0x0f,0x36,0x0f,0x36,0x0f,0x3f,0x25,0x31,0x28,0x11,0x38,0x38,0x2d,0x1f,0x19,0x0d,0x33,0x0d,0x00,0x01,0x01,0x02,0x0a,0x2d,0x0d,0x26,0x0a,0x0a,0x26,0x0d,0x2d,0x04,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08, -0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xcd,0x32,0x11,0x33,0x11,0x33,0x10,0xcd,0x32,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x10,0xcd,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x03,0x16,0x33, -0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01,0xce,0x01,0x61,0x93,0x17, -0x12,0x4e,0x11,0x64,0x12,0x15,0x28,0x3a,0x26,0x17,0x32,0x1c,0x11,0x36,0x16,0x14,0x10,0x01,0x06,0x07,0x64,0x08,0x10,0x1a,0x12,0x67,0x0a,0x10,0x07,0x12,0x0e,0x23,0x23,0x11,0x63,0x10,0x06,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x02,0x1c,0x05,0x50,0x29,0x24,0x2f,0x2f,0x24,0x40,0x31,0x1c,0x0d, -0x10,0x0f,0x0d,0x03,0x01,0x32,0x6b,0x4a,0x7a,0x77,0x47,0x78,0x74,0x7a,0x49,0x2a,0x4a,0x24,0x05,0x2c,0x25,0x25,0x27,0x26,0x2e,0x12,0x24,0x00,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x3a,0x00,0x57,0xb3,0x09,0x10,0x10,0x35,0xb8,0x05,0x0d,0xb6,0x2a,0x20,0x20,0x2a,0x30,0x2f,0x1b,0xb8,0x04,0xfd,0x40, -0x11,0x15,0x00,0x01,0x01,0x02,0x0a,0x25,0x0b,0x2f,0x03,0x08,0x15,0x0a,0x15,0x0a,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08,0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x10,0xcd,0x32,0x11,0x33,0x10,0xed,0x10,0xcd,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f, -0x39,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x03,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01, -0xce,0x01,0x61,0xbf,0x38,0x3f,0x20,0x07,0x12,0x1e,0x25,0x12,0x24,0x33,0x1e,0x41,0x42,0x23,0x45,0x36,0x22,0x09,0x1b,0x2f,0x26,0x24,0x2d,0x19,0x0a,0x15,0x36,0x5d,0x48,0x33,0x3b,0x1e,0x08,0x11,0x26,0x3f,0x2e,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x01,0xa7,0x34,0x4a,0x32,0x1c,0x06,0x0d,0x0f, -0x08,0x03,0x07,0x08,0x67,0x14,0x0d,0x1c,0x2f,0x22,0x0f,0x2c,0x36,0x3f,0x23,0x10,0x21,0x21,0x21,0x11,0x19,0x33,0x31,0x2f,0x16,0x6c,0x0c,0x16,0x14,0x11,0x06,0x0a,0x14,0x18,0x20,0x17,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x30,0x00,0x4f,0xb1,0x09,0x1d,0xbb,0x05,0x0b,0x00,0x1e,0x00,0x14,0x04,0xfd, -0x40,0x14,0x27,0x0b,0x0b,0x27,0x00,0x01,0x01,0x02,0x0a,0x2c,0x08,0x0f,0x1d,0x0a,0x0a,0x1d,0x0f,0x03,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08,0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xcd,0x32,0x11,0x33,0x2f,0x33,0x2f,0x10,0xed,0x01,0x2f,0xed, -0x39,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x13,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01,0xce,0x01,0x61,0x23, -0x22,0x34,0x10,0x76,0x07,0x16,0x1c,0x24,0x14,0x13,0x11,0x0a,0x0b,0x0a,0x64,0x0c,0x0f,0x0c,0x4a,0x34,0x21,0x39,0x2e,0x22,0x0a,0x02,0x0d,0x1a,0x11,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x02,0xb5,0x35,0x8b,0x47,0x1b,0x37,0x2b,0x1c,0x17,0x12,0x0f,0x2b,0x4f,0x78,0x5b,0x7a,0x77,0x5e,0x82,0x5a, -0x39,0x15,0x36,0x3e,0x16,0x25,0x31,0x19,0x25,0x3b,0x1f,0x00,0x00,0x02,0x00,0x1e,0xfe,0xa9,0x06,0xd2,0x03,0x61,0x00,0x3b,0x00,0x4d,0x00,0x5d,0xb4,0x38,0x25,0x16,0x10,0x06,0xb8,0x05,0x0a,0xb4,0x25,0x49,0x49,0x25,0x41,0xb8,0x05,0x0a,0xb7,0x2d,0x25,0x2d,0x25,0x2d,0x4f,0x13,0x19,0xb8,0x05,0x0a,0xb3,0x10,0x25,0x05,0x28,0xb8, -0x04,0xfb,0xb5,0x38,0x2f,0x46,0x01,0x46,0x3c,0xb8,0x04,0xfb,0xb4,0x2f,0x32,0x01,0x32,0x1e,0xb9,0x04,0xfb,0x00,0x0b,0x00,0x2f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x2f,0x10,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x01,0x0e,0x03,0x07,0x15,0x14,0x0e, -0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x25,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x2e,0x03,0x06,0xd2,0x0f,0x2c,0x39,0x43,0x25, -0x49,0x99,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x09,0x08,0xfe,0xc7,0x01,0xeb,0x13,0x13,0x2b,0x64,0xa5,0x7a,0x62,0x8f,0x64,0x3e,0x24,0x0e,0x02,0x2d,0x57,0x28,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x23,0x30,0x0c,0x33,0x5a,0x23,0xfd,0xf3,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x25,0x4d,0x27,0x07,0x27,0x36,0x43, -0x01,0x7c,0x0d,0x20,0x23,0x25,0x11,0x04,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x31,0x6b,0x3a,0x3a,0x72,0x61,0x64,0xa8,0x48,0x5f,0x84,0x54,0x26,0x1a,0x30,0x42,0x50,0x5b,0x30,0x0e,0x0f,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x38,0x91,0x52,0x1c,0x3b,0x1a,0xa6,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0e,0x0d, -0x3a,0x7a,0x63,0x40,0x00,0x04,0x00,0x7c,0x00,0x00,0x05,0x61,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x5e,0xb4,0x0d,0x0e,0x0e,0x00,0x09,0xbb,0x05,0x0c,0x00,0x08,0x00,0x05,0x05,0x0c,0x40,0x0c,0x04,0x0c,0x0f,0x0f,0x04,0x00,0x08,0x04,0x08,0x04,0x11,0x01,0xb8,0x05,0x0c,0xb5,0x00,0x2f,0x0d,0x01,0x0d,0x0c,0xbb, -0x04,0xe6,0x00,0x0a,0x00,0x06,0x04,0xfe,0xb5,0x08,0x2f,0x05,0x01,0x05,0x02,0xb9,0x04,0xfe,0x00,0x01,0x00,0x2f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x39,0x11,0x33,0x31,0x30,0x13,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x25,0x33, -0x15,0x23,0x05,0x01,0x33,0x01,0xc0,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0xfc,0x12,0x03,0x0d,0x8f,0xfc,0xf3,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0xf7,0xf7,0x5b,0x05,0x58,0xfa,0xa8,0x00,0x00,0x05,0x00,0x7c,0x00,0x00,0x06,0xd5,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x6d,0xb4,0x01,0x02,0x02, -0x04,0x11,0xbe,0x05,0x0c,0x00,0x10,0x00,0x0d,0x05,0x0c,0x00,0x0c,0x00,0x09,0x05,0x0c,0x40,0x0f,0x08,0x00,0x03,0x03,0x08,0x04,0x10,0x0c,0x08,0x08,0x0c,0x10,0x03,0x15,0x05,0xb8,0x05,0x0c,0xb3,0x04,0x12,0x0e,0x0a,0xb8,0x04,0xfe,0xb6,0x10,0x0c,0x2f,0x09,0x01,0x09,0x06,0xb8,0x04,0xfe,0xb5,0x05,0x2f,0x01,0x01,0x01,0x00,0xb8, -0x04,0xe6,0x00,0x3f,0x2f,0x5d,0x2f,0xed,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x11,0x33,0x31,0x30,0x33,0x01,0x33,0x01,0x03,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x7c,0x03,0x0d, -0x8f,0xfc,0xf3,0x4b,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0x05,0x58,0xfa,0xa8,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0xf7,0xf7,0xf7,0xf7,0x00,0x01,0x00,0x76,0xfe,0xf8,0x01,0x8b,0x00,0xe4,0x00,0x03,0x00,0x10,0xb7,0x2f,0x01,0x01,0x01,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x5d,0x31,0x30,0x25,0x13, -0x23,0x03,0x01,0x16,0x75,0x75,0xa0,0xe4,0xfe,0x14,0x01,0xec,0x00,0x02,0xff,0xc8,0x06,0x1d,0x02,0x29,0x08,0xde,0x00,0x2b,0x00,0x2f,0x00,0x2c,0xbc,0x00,0x2f,0x05,0x0d,0x00,0x2c,0x00,0x13,0x05,0x0d,0x40,0x09,0x16,0x26,0x09,0x2d,0x14,0x0e,0x1e,0x2c,0x29,0xb9,0x05,0x01,0x00,0x04,0x00,0x2f,0xfd,0xce,0xde,0xcd,0x2f,0x2f,0x01, -0x2f,0xcd,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x11,0x33,0x11,0x02,0x29,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35, -0x3b,0x16,0x1d,0x10,0x0d,0x0d,0x58,0x10,0x1d,0x26,0x15,0x06,0x0c,0x06,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x7f,0x58,0x06,0x8f,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x07,0x17,0x16,0x01,0x76,0xfe,0x7e,0x26,0x34,0x21,0x11,0x03,0x01,0x01,0x01,0x0f,0x12,0x19,0x10,0x09,0x48,0x02,0x0d, -0xfd,0xf3,0x00,0x02,0x00,0x43,0x06,0x1f,0x01,0x6c,0x08,0xbb,0x00,0x16,0x00,0x1a,0x00,0x23,0xb2,0x17,0x17,0x0e,0xbb,0x05,0x0d,0x00,0x07,0x00,0x19,0x04,0xfd,0xb2,0x18,0x0a,0x02,0xb9,0x04,0xfd,0x00,0x13,0x00,0x2f,0xfd,0xd6,0xd6,0xed,0x01,0x2f,0xed,0x33,0x2f,0x31,0x30,0x13,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33, -0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x13,0x23,0x35,0x33,0x43,0x36,0x28,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x17,0x18,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0xda,0x57,0x57,0x06,0x90,0x11,0x17,0x28,0x38,0x20,0x3f,0x74,0x37,0x39,0x7f,0x34,0x3c,0x5b,0x3e,0x20,0x09,0x0a,0x02,0x33,0x56,0x00,0x01,0x00,0x37,0x06,0x7c, -0x01,0xcf,0x06,0xca,0x00,0x03,0x00,0x0c,0xba,0x00,0x02,0x05,0x00,0x00,0x01,0x00,0x2f,0xed,0x31,0x30,0x13,0x21,0x15,0x21,0x37,0x01,0x98,0xfe,0x68,0x06,0xca,0x4e,0x00,0x02,0x00,0x0d,0x06,0x5c,0x01,0xb5,0x07,0xe2,0x00,0x23,0x00,0x2f,0x00,0x36,0xb2,0x16,0x09,0x13,0xb8,0x05,0x0e,0xb4,0x24,0x19,0x19,0x24,0x2a,0xb8,0x05,0x0e, -0x40,0x0c,0x09,0x16,0x19,0x19,0x20,0x0e,0x27,0x2d,0x03,0x03,0x20,0x1a,0x00,0x2f,0x2e,0xc9,0x2f,0x32,0xd4,0xcd,0x11,0x33,0x2f,0x39,0x01,0x2f,0xed,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x32,0x37,0x35,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26, -0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x1e,0x21,0x41,0x26,0x01,0x09,0x06,0x2d,0x1b,0x2b,0x38,0x1d,0x1c,0x34,0x28,0x19,0x3f,0x33,0x05,0x19,0x06,0x2f,0x14,0x23,0x10,0x15,0x2b,0x11,0x28,0x48,0x23,0x01,0x5d,0x2d,0x1b,0x1d,0x30,0x1f,0x17,0x2a,0x35,0x06,0xea,0x08, -0x08,0x01,0x02,0x3c,0x3b,0x22,0x35,0x24,0x13,0x12,0x24,0x36,0x24,0x3b,0x4f,0x17,0x05,0x16,0x05,0x35,0x0f,0x1f,0x0f,0x05,0x03,0x08,0x07,0xb0,0x23,0x22,0x22,0x20,0x1a,0x36,0x19,0x0e,0x32,0x00,0x00,0x01,0x00,0x37,0xff,0x23,0x01,0xcf,0xff,0x71,0x00,0x03,0x00,0x0c,0xba,0x00,0x02,0x05,0x00,0x00,0x01,0x00,0x2f,0xed,0x31,0x30, -0x17,0x21,0x15,0x21,0x37,0x01,0x98,0xfe,0x68,0x8f,0x4e,0x00,0xff,0xff,0x00,0x70,0xfe,0xf8,0x01,0x8b,0x03,0x11,0x02,0x26,0x0e,0x19,0x00,0x00,0x00,0x07,0x00,0x11,0x00,0x00,0x02,0x46,0xff,0xff,0x00,0x9a,0xfe,0x63,0x05,0x91,0x04,0x15,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x64,0xff,0xff,0x00,0x9a, -0xfe,0x0e,0x06,0xae,0x02,0x13,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x0f,0xff,0xff,0xff,0xba,0xff,0x05,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x5b,0x00,0x1a,0x01,0x06,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x5b, -0x00,0x1a,0x01,0x06,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x3e,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xe4,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0x3e,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55, -0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab, -0xff,0xea,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x53, -0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0x00,0x01,0xff,0xba,0xff,0xf2,0x04,0xad,0x03,0x0f,0x00,0x35, -0x00,0x41,0xb1,0x0d,0x24,0xb8,0x05,0x0b,0xb4,0x30,0x30,0x37,0x15,0x2a,0xb8,0x05,0x03,0x40,0x09,0x30,0x24,0x24,0x21,0x0c,0x20,0x04,0x00,0x12,0xb8,0x04,0xff,0xb5,0x2f,0x19,0x01,0x19,0x29,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d,0xed,0x12,0x17,0x39,0x11,0x33,0x3f,0x01,0x2f,0x12,0x39,0x2f,0xed, -0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33, -0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x14,0x35,0x5e,0x4a,0x14,0x62,0x7d,0x4a,0x1e,0x02,0x48,0xab,0xc8,0xe3,0x80,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2b,0x3b,0x25,0x10,0xa7, -0x29,0x46,0x5d,0x35,0x2b,0x5b,0x4b,0x30,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0x00,0x01,0x00,0x52,0xff,0xea,0x04,0x02,0x03,0xba,0x00,0x24,0x00,0x29,0xb1,0x1b,0x0f,0xb8,0x05,0x0a,0xb5,0x06,0x1c,0x21,0x14,0x14,0x03,0xbd,0x04,0xfb,0x00,0x0b, -0x00,0x21,0x05,0x03,0x00,0x15,0x05,0x03,0x00,0x3f,0x3f,0xc4,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x12,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x52,0x61,0xa6,0x39,0x92,0x7f,0x1c,0x31,0x40,0x24, -0xa6,0x38,0x4d,0x1d,0x07,0x18,0x2d,0x46,0x36,0x16,0x21,0x3f,0x38,0x2d,0x0f,0x05,0x1a,0x51,0x64,0x75,0x3e,0x3a,0x9a,0x4b,0xa9,0x0b,0x0b,0x47,0x4e,0x2e,0x92,0xb0,0xc3,0x5f,0xa7,0xfe,0xe3,0x80,0x20,0x4d,0x43,0x2d,0xa7,0x10,0x23,0x39,0x29,0x2d,0x3c,0x25,0x0f,0x0c,0x0a,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x05,0x5d, -0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x1d,0x04,0xad,0x00,0x01,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x03,0x0f,0x00,0x58,0x00,0x83,0xb1,0x13,0x08,0xb8,0x05,0x0a,0xb2,0x05,0x1e,0x54,0xb8,0x05,0x0a,0xb3,0x51,0x27,0x27,0x49,0xb8,0x05,0x0a,0x40,0x0a,0x42,0x05,0x51,0x42,0x42,0x51,0x05,0x03,0x5a,0x38,0xb8,0x05,0x0a, -0x40,0x0e,0x31,0x2f,0x53,0x01,0x53,0x2f,0x46,0x01,0x46,0x2f,0x35,0x01,0x35,0x3d,0xb8,0x04,0xfb,0xb6,0x1f,0x2c,0x2f,0x2c,0x02,0x2c,0x4c,0xba,0x04,0xfb,0x00,0x23,0x05,0x03,0xb6,0x26,0x12,0x1d,0x03,0x06,0x0d,0x00,0xba,0x04,0xfb,0x00,0x18,0x05,0x03,0xb3,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x3f,0xed,0x32,0x12,0x17,0x39,0x3f, -0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x10,0xed,0x39,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x07, -0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x07,0x57,0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c, -0x4f,0x42,0x34,0x12,0x04,0x19,0x3f,0x44,0x46,0x1f,0x42,0x52,0x19,0x05,0x03,0x3d,0x80,0xcc,0x91,0x8a,0xb9,0x70,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x10,0x9b,0x08,0x0c,0x05,0x06,0x58,0x5e,0x22,0x3f,0x30,0x1d,0x9c,0x0b,0x27,0x48,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x8f,0x43,0x62, -0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x26,0x20,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xbb,0x78,0x3f,0x70,0x38,0x42,0x3f,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x00,0x00,0x01, -0xff,0xba,0xff,0xf2,0x06,0xae,0x03,0x0f,0x00,0x4d,0x00,0x68,0xb5,0x27,0x39,0x1e,0x46,0x13,0x08,0xbe,0x05,0x0a,0x00,0x05,0x00,0x49,0x05,0x0a,0x00,0x46,0x00,0x3c,0x05,0x0a,0x40,0x17,0x39,0x48,0x2f,0x3a,0x01,0x3a,0x26,0x1d,0x06,0x13,0x18,0x12,0x12,0x06,0x18,0x41,0x34,0x34,0x33,0x33,0x0d,0x0d,0x00,0xb8,0x04,0xfb,0xb3,0x2c, -0x23,0x0e,0x18,0xb8,0x05,0x03,0xb3,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x3f,0x33,0x33,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x39,0x2f,0x5d,0x33,0x01,0x2f,0xed,0xd4,0xed,0xd4,0xed,0x39,0x12,0x39,0x11,0x39,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33, -0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x04,0xab,0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e, -0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x21,0x64,0x77,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x8f,0x43,0x62, -0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0x0b,0xc9,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31, -0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0x00,0x02,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x03,0x3c,0x00,0x4b,0x00,0x5f,0x00,0x7b,0xbf,0x00,0x26,0x05,0x0a,0x00,0x1f,0x00,0x5d,0x05,0x0a,0x00,0x2b,0x00, -0x37,0x05,0x0a,0x40,0x0a,0x51,0x2b,0x51,0x1f,0x51,0x1f,0x51,0x0e,0x3d,0x15,0xb8,0x05,0x0a,0x40,0x0a,0x0e,0x5d,0x5d,0x4c,0x4c,0x3c,0x3c,0x42,0x04,0x2b,0xbd,0x04,0xfb,0x00,0x3d,0x00,0x47,0x05,0x03,0x00,0x56,0x04,0xfb,0x40,0x0d,0x2f,0x32,0x01,0x32,0x2f,0x23,0x01,0x23,0x2f,0x12,0x01,0x12,0x1a,0xb8,0x04,0xfb,0xb5,0x1f,0x09, -0x2f,0x09,0x02,0x09,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x39,0x39,0x32,0x2f,0x33,0x11,0x33,0x2f,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x26,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15, -0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0xf8,0x1f,0x28,0x12,0x05,0x03,0x3d,0x81, -0xcd,0x94,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x17,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4,0x65,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x46,0x38,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54,0xa1,0xe7,0x9d,0x5e,0x02,0x99,0x6b, -0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x85,0x75,0x65,0x52,0x3f,0x15,0x5c,0xee,0x03,0x09,0x1d,0x15,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xc5,0x6e,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x49,0x7d,0xa4,0x5b, -0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x01,0x03,0x08,0x9d,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x2a,0x49,0x63,0x71,0x7a,0x3c,0x02,0x01,0x00,0x00,0x02,0xff,0xba,0xff,0xea,0x08,0x04,0x03,0x3c,0x00,0x42,0x00,0x54,0x00,0x64,0xbc,0x00,0x52,0x05,0x0a,0x00,0x27,0x00,0x33,0x05,0x0a,0xb7,0x48,0x27,0x48,0x27, -0x48,0x1b,0x39,0x22,0xbd,0x05,0x0a,0x00,0x1b,0x00,0x39,0x05,0x03,0x00,0x4d,0x04,0xfb,0x40,0x13,0x2f,0x2e,0x01,0x2e,0x2f,0x1e,0x01,0x1e,0x52,0x52,0x43,0x43,0x38,0x38,0x27,0x27,0x3e,0x09,0x15,0xbc,0x04,0xfb,0x00,0x0e,0x05,0x03,0x00,0x00,0x05,0x03,0x00,0x3f,0x3f,0xed,0x39,0x39,0x32,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x2f, -0x5d,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x24,0x26,0x26,0x27,0x26,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03, -0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x27,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x04,0xe7,0xb3,0xff,0x00,0xaf,0x69,0x1b,0x23,0x2e,0x14,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x27,0x42,0x30,0x1c,0x0f,0x0d,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c, -0x67,0x81,0x9a,0xb4,0x65,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x3e,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x16,0x01,0x06,0x0d,0x0c,0x0f,0x31,0x23,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x18,0x27,0x33,0x1b,0x30,0x6e,0x3d,0x3f, -0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x49,0x7d,0xa4,0x5b,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0xa9,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x04,0xb2,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x50, -0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x08,0x04,0x04,0xb2,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x02,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x29,0x00,0x3d,0x00,0x4c,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x2f,0x2f,0x0b,0x3b,0x24,0xb8,0x05,0x0a,0x40,0x11,0x21,0x0b,0x25,0x1b, -0x15,0x23,0x15,0x15,0x0b,0x3b,0x3b,0x2a,0x2a,0x1e,0x1e,0x10,0x0a,0xbd,0x04,0xfb,0x00,0x0b,0x05,0x03,0x00,0x34,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x11,0x33,0x2f,0x11,0x33,0x2f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33, -0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54, -0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e, -0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x00,0x02,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x00,0x24,0x00,0x38,0x00,0x43,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x2a,0x2a,0x3a,0x36,0x1f,0xb8,0x05,0x0a,0x40,0x09,0x1c,0x20,0x0c,0x1e, -0x36,0x36,0x25,0x25,0x18,0xb8,0x04,0xff,0xb3,0x11,0x0c,0x0c,0x11,0xbb,0x05,0x03,0x00,0x2f,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x3f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x2f,0x12,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35, -0x34,0x36,0x33,0x21,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x79,0xae,0x70,0x36,0x2d,0x51,0x71,0x88,0x9a,0x52,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2, -0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x83,0x75,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x03,0x58,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x54,0x2e,0x16,0x04,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2c,0x4e,0x68,0x77,0x81,0x3f,0x02,0x01, -0x00,0x02,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x00,0x2d,0x00,0x41,0x00,0x50,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x33,0x33,0x0b,0x3f,0x28,0xb8,0x05,0x0a,0xb6,0x25,0x0b,0x29,0x15,0x27,0x1a,0x15,0xb8,0x05,0x03,0x40,0x0a,0x3f,0x3f,0x2e,0x2e,0x22,0x22,0x21,0x21,0x10,0x0a,0xbd,0x04,0xff,0x00,0x0b,0x05,0x03,0x00,0x38,0x04,0xfb, -0x00,0x00,0x00,0x2f,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x3f,0x33,0x2f,0x12,0x39,0x01,0x2f,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x36,0x37, -0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x6f,0x89,0x9d,0x54,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4, -0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3c,0x43,0x30,0x35,0x1a,0x05,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25, -0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0xff,0xff,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x39,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x02,0x26,0x0e,0x3a,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x06,0xae, -0x05,0xec,0x02,0x26,0x0e,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0xb3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0xb3,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x90,0x06,0x03, -0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00, -0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02, -0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0xdc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0x01,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0x2c,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x01,0xfc,0x50, -0x00,0x0a,0xb4,0x01,0x2f,0x4b,0x01,0x4b,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x6e,0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x6e, -0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0xf9,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x8f,0x04,0x49,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x03,0xb9,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xdc,0x03,0x09,0xff,0xff,0xff,0xba, -0xfe,0xa6,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9a, -0xff,0x55,0x05,0x91,0x06,0x11,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x8f,0x04,0x49,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0xd1,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xdc,0x03,0x09,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51, -0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04,0x05,0x24,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x50, -0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x04,0x79,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xd4,0x03,0xc9,0x00,0x02,0x00,0xab,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x2e,0x00,0x4f,0x00,0x66,0xb1,0x1e,0x13,0xbe,0x05,0x0a,0x00,0x10,0x00,0x4a,0x05,0x0b,0x00,0x31,0x00,0x42,0x05,0x0b,0x40,0x0a, -0x39,0x10,0x31,0x39,0x39,0x31,0x10,0x03,0x51,0x03,0xbe,0x05,0x0a,0x00,0x2b,0x00,0x3e,0x04,0xfd,0x00,0x3f,0x00,0x2f,0x04,0xfd,0xb5,0x4f,0x1e,0x23,0x18,0x18,0x0b,0xbc,0x04,0xfb,0x00,0x23,0x05,0x03,0x00,0x19,0x05,0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x3f,0x3f,0xed,0x32,0x2f,0x11,0x39,0x2f,0xfd,0xd4,0xed, -0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x35,0x34,0x26,0x27, -0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4e,0x7b,0xb1,0x7d,0x6d,0xa2,0x6c,0x36,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x64,0x75,0x20,0x04,0x26,0x6f,0x87,0x9b,0x53,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x01,0xe4,0xc5,0x1f, -0x15,0x10,0x21,0x1b,0x11,0x2e,0x4f,0x69,0x3b,0x5e,0x54,0x21,0x17,0x0f,0x20,0x1a,0x10,0x25,0x4c,0x74,0x4f,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x0a,0x29,0x53,0x48,0x04,0x8b,0xfb,0xac,0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x34,0x1a,0x05,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0x57,0x0b, -0x47,0x12,0x16,0x0b,0x08,0x14,0x1b,0x27,0x1b,0x26,0x3e,0x2f,0x1f,0x08,0x5d,0x0c,0x2d,0x21,0x14,0x18,0x0b,0x08,0x12,0x1a,0x23,0x19,0x1f,0x3e,0x33,0x23,0x04,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x00,0x2c,0x00,0x2e,0x40,0x11,0x11,0x15,0x12,0x03,0x00,0x14,0x2f,0x13,0x01,0x13,0x27,0x27,0x26,0x26,0x21,0x21, -0x06,0xbb,0x04,0xfb,0x00,0x22,0x00,0x00,0x05,0x03,0x00,0x3f,0x32,0xed,0x32,0x11,0x33,0x2f,0x33,0x2f,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x17,0x1e,0x05,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23, -0x23,0x23,0x23,0x01,0x28,0x61,0x80,0x4c,0x1e,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0xad,0xdd,0x85,0x40,0x10,0x03,0x0b,0x14,0x21,0x34,0x49,0x32,0x16,0x59,0x8d,0x2c,0x05,0x17,0x47,0x68,0x8d,0x5d,0x0e,0x34,0x20,0x20,0x33,0x16,0x2a,0x3f,0x29,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x52,0x92,0x8b,0x8a,0x4a, -0x0f,0x2b,0x30,0x2e,0x26,0x17,0xa7,0x4a,0x55,0x22,0x3a,0x2b,0x18,0x00,0x00,0x02,0x00,0x39,0xfd,0xff,0x04,0xad,0x02,0xb9,0x00,0x2f,0x00,0x41,0x00,0x54,0xb9,0x00,0x3d,0x01,0x52,0xb5,0x1f,0x1f,0x16,0x1a,0x06,0x2b,0xbb,0x05,0x0a,0x00,0x35,0x00,0x11,0x05,0x0a,0xb4,0x1a,0x0e,0x05,0x09,0x3a,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x26, -0x01,0x26,0x2f,0x16,0x01,0x16,0x09,0xb8,0x05,0x03,0xb3,0x1f,0x30,0x30,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x3f,0x2f,0x5d,0x2f,0x5d,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x39,0x11,0x39,0x39,0x10,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x23, -0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x04,0xad,0x16,0x51,0x68,0x21,0x04,0x26,0x6c,0x4f,0x31,0x65,0x60,0x57,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42, -0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x15,0x44,0x6e,0x53,0x34,0x0b,0x06,0x0f,0x26,0x45,0xfe,0x55,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x99,0xa7,0x3a,0x36,0x36,0x3b,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x42,0x24, -0x0b,0x41,0x67,0x80,0x3f,0x26,0x43,0x33,0x1d,0x01,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0e,0x0e,0x09,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0xad,0x02,0xaf,0x00,0x30,0x00,0x40,0x00,0x32,0xb2,0x31,0x08,0x3c,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x24,0x01,0x24,0x34,0x30,0x30,0x0d,0x05,0x17,0xb8,0x04,0xfb,0xb4,0x10, -0x08,0x08,0x00,0x10,0xb8,0x05,0x03,0x00,0x3f,0x33,0x33,0x2f,0x10,0xed,0x39,0x39,0x32,0x2f,0x33,0x2f,0x5d,0xed,0x12,0x39,0x31,0x30,0x05,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x04,0x17,0x1e,0x03,0x33, -0x25,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x04,0xad,0x16,0x5b,0x6f,0x1e,0x05,0x2d,0x87,0x61,0x34,0x61,0x57,0x4b,0x1e,0x35,0x99,0x5f,0x13,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57,0x3a,0x23,0x0b,0x0d,0x21,0x2b,0x38,0x48,0x5c,0x39,0x4f,0x72,0x50,0x33,0x1c,0x0c,0x02,0x04,0x0d,0x25,0x46,0x3d,0xfc,0xd4, -0x2b,0x8e,0x56,0x5e,0x69,0x1a,0x35,0x52,0x37,0x30,0x4f,0x3e,0x2f,0x0e,0x40,0x41,0x39,0x48,0x18,0x28,0x35,0x1e,0x50,0x43,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1b,0x1f,0x49,0x48,0x42,0x34,0x1e,0x2e,0x48,0x56,0x51,0x40,0x0e,0x21,0x3e,0x30,0x1d,0x6d,0x35,0x36,0x44,0x45,0x21,0x51,0x45,0x2f,0x26,0x45,0x5f,0xff,0xff,0x00,0x9b, -0xfd,0xff,0x05,0x58,0x03,0x5c,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x03,0xff,0xba,0xff,0xf2,0x04,0x87,0x04,0x53,0x00,0x2d,0x00,0x3f,0x00,0x50,0x00,0x63,0xb3,0x12, -0x1f,0x17,0x24,0xb8,0x05,0x0a,0xb2,0x4b,0x46,0x43,0xb8,0x05,0x0b,0xb6,0x31,0x4b,0x31,0x4b,0x31,0x52,0x3b,0xbf,0x05,0x0a,0x00,0x17,0x00,0x49,0x04,0xfc,0x00,0x29,0x05,0x03,0x00,0x36,0x04,0xfc,0x40,0x10,0x1c,0x00,0x46,0x40,0x1c,0x04,0x05,0x1e,0x2f,0x1f,0x01,0x1f,0x2e,0x0f,0x0f,0x0c,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00, -0x3f,0xed,0x32,0x11,0x33,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x33,0x32,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x27,0x35,0x16,0x04,0x16,0x16, -0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x36,0x35,0x34,0x2e,0x02,0x27,0x02,0x3b,0x26,0x61,0x6c,0x73,0x37,0x9e,0x23,0x23,0x23,0x23,0x3a,0x72,0x3a,0x84,0x38,0x01,0x4a,0x60,0x38,0x15,0x25,0x43,0x5c, -0x38,0x01,0x53,0xca,0x01,0x32,0xcd,0x68,0x17,0x2f,0x46,0x2e,0x1e,0x5a,0x6b,0x76,0x51,0x33,0x21,0x1c,0x2b,0x34,0x18,0x1c,0x3a,0x2f,0x1e,0x11,0x31,0x58,0x01,0x0a,0x09,0x08,0x2a,0x2d,0x43,0x9a,0x4b,0x1d,0x29,0x45,0x5b,0x31,0x4c,0x1d,0x23,0x14,0x06,0x34,0x20,0x20,0x33,0x02,0x03,0x04,0x1e,0x44,0x4d,0x55,0x2f,0x37,0x79,0x6c, -0x52,0x11,0x06,0x36,0xc7,0x71,0xf6,0xe7,0xc7,0x42,0x2f,0x5f,0x4c,0x30,0x09,0x15,0x22,0xbd,0x3f,0x7e,0x37,0x2d,0x50,0x3d,0x23,0x29,0x41,0x4f,0x26,0x19,0x36,0x3c,0x42,0x01,0x40,0x20,0x3c,0x21,0x4e,0x92,0x36,0x1a,0x20,0x06,0x2c,0x36,0x2b,0x5d,0x60,0x60,0x2e,0x00,0x00,0x03,0x00,0x53,0xff,0xf2,0x05,0x32,0x04,0x53,0x00,0x2a, -0x00,0x3c,0x00,0x4d,0x00,0x63,0xb3,0x0f,0x1c,0x14,0x21,0xb8,0x05,0x0a,0xb2,0x48,0x43,0x40,0xb8,0x05,0x0b,0xb6,0x2e,0x48,0x2e,0x48,0x2e,0x4f,0x38,0xbf,0x05,0x0a,0x00,0x14,0x00,0x46,0x04,0xfc,0x00,0x26,0x05,0x03,0x00,0x33,0x04,0xfc,0x40,0x10,0x19,0x00,0x43,0x3d,0x19,0x04,0x05,0x1b,0x2f,0x1c,0x01,0x1c,0x2b,0x0e,0x0e,0x0c, -0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x32,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x27, -0x35,0x16,0x04,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x36,0x35,0x34,0x2e,0x02,0x27,0x02,0xe6,0x23,0x59,0x63,0x69,0x33,0x55,0x80,0x23,0x20,0x52,0x9c,0x51,0x80,0x3b,0x01,0x4a,0x60,0x38, -0x15,0x25,0x43,0x5c,0x38,0x01,0x53,0xca,0x01,0x32,0xcd,0x68,0x17,0x2f,0x46,0x2e,0x1e,0x5a,0x6b,0x76,0x51,0x33,0x21,0x1c,0x2b,0x34,0x18,0x1c,0x3a,0x2f,0x1e,0x11,0x31,0x58,0x01,0x0a,0x09,0x08,0x2a,0x2d,0x43,0x9a,0x4b,0x1d,0x29,0x45,0x5b,0x31,0x4c,0x1d,0x23,0x14,0x06,0x0b,0x05,0xa7,0x0a,0x08,0x03,0x04,0x1e,0x44,0x4d,0x55, -0x2f,0x37,0x79,0x6c,0x52,0x11,0x06,0x36,0xc7,0x71,0xf6,0xe7,0xc7,0x42,0x2f,0x5f,0x4c,0x30,0x09,0x15,0x22,0xbd,0x3f,0x7e,0x37,0x2d,0x50,0x3d,0x23,0x29,0x41,0x4f,0x26,0x19,0x36,0x3c,0x42,0x01,0x40,0x20,0x3c,0x21,0x4e,0x92,0x36,0x1a,0x20,0x06,0x2c,0x36,0x2b,0x5d,0x60,0x60,0x2e,0x00,0x00,0x03,0xff,0xba,0xfd,0xff,0x04,0x02, -0x03,0x56,0x00,0x2c,0x00,0x3c,0x00,0x4c,0x00,0x59,0xb1,0x19,0x0c,0xb8,0x05,0x0a,0xb5,0x32,0x47,0x47,0x32,0x3c,0x3d,0xb8,0x05,0x0a,0x40,0x09,0x12,0x00,0x25,0x2d,0x13,0x13,0x12,0x12,0x00,0xb8,0x04,0xfb,0xb3,0x3d,0x16,0x14,0x25,0xba,0x05,0x03,0x00,0x42,0x04,0xfb,0xb6,0x1f,0x1e,0x2f,0x1e,0x02,0x1e,0x37,0xb8,0x04,0xfb,0xb3, -0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0x33,0x33,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x17,0x21,0x15,0x21,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x27,0x23, -0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0xb4,0x15,0x41,0x4e,0x55,0x51,0x49,0x1b,0x2f,0x54,0x3f,0x25,0x16,0x27,0x34,0x1d,0x02,0x01,0x45,0xfe,0xc0,0x01,0x48,0x40,0x27,0x49,0x66,0x3f,0x24,0x54,0x55,0x50,0x3f, -0x29,0x04,0xab,0x23,0x23,0x23,0x23,0x01,0xd0,0x30,0x52,0x3a,0x21,0x11,0x1e,0x27,0x16,0x1a,0x47,0x47,0x3d,0x0e,0x0b,0x04,0x2e,0x45,0x52,0x27,0x22,0x2e,0x1c,0x0d,0x20,0x3d,0x58,0x38,0x99,0x85,0xcf,0x9c,0x6c,0x43,0x1e,0x45,0x6d,0x87,0x43,0x35,0x5d,0x4e,0x41,0x19,0x07,0xa7,0x06,0x2d,0x79,0x3f,0x33,0x5f,0x49,0x2d,0x14,0x2e, -0x4b,0x6f,0x96,0x61,0x34,0x20,0x20,0x33,0x33,0x53,0x69,0x36,0x28,0x55,0x45,0x2d,0x47,0x88,0xc6,0x7f,0xa7,0x58,0x7d,0x50,0x26,0x16,0x22,0x2c,0x16,0x24,0x4b,0x3c,0x26,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x00,0x27,0x00,0x38,0x00,0x55,0xb2,0x1f,0x1f,0x1c,0xb8,0x05,0x0a,0xb4,0x36,0x0b,0x0b,0x36,0x32,0xb8, -0x05,0x0a,0xb2,0x11,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x27,0x1f,0x24,0x2f,0x24,0x02,0x24,0x2d,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x16,0x01,0x16,0x36,0x35,0x35,0x1d,0x1d,0x1c,0xbb,0x04,0xfb,0x00,0x1e,0x00,0x0b,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0x33, -0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x37,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x6c,0xad,0x52,0x45,0x66,0x48,0x2c,0x0c, -0x05,0x0b,0x04,0x75,0x5c,0x92,0x66,0x36,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x35,0x07,0xbc,0xbd,0x08,0x3e,0x74,0xab,0x75,0x5b,0xac,0x64,0x02,0x8d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1b,0x7c,0x87,0x65,0x04,0x0e,0xfe,0xf9,0x2c,0x23,0x21,0x39,0x4c,0x2c,0x13,0x3d,0x26,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54, -0x56,0x48,0xbf,0x6d,0xa7,0x66,0xb5,0x88,0x50,0x26,0x2e,0x02,0xe1,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf2,0x03,0x0f,0x02,0x06,0x0e,0x6f,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x03,0x0f,0x02,0x06,0x09,0x3b,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6, -0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x03,0xff,0xd4,0x05,0x20,0x02,0x33,0x07,0xa1,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x60,0xb2,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb5,0x12,0x15,0x15,0x12,0x12,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26, -0xb8,0x05,0x0d,0xb5,0x1f,0x22,0x22,0x1f,0x00,0x31,0xbb,0x04,0xfd,0x00,0x32,0x00,0x35,0x04,0xfd,0xb4,0x36,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0xd6,0xfd,0xd6,0xed,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x10,0xed, -0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63, -0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37, -0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x01,0x6b,0x58,0x57,0x58,0x00,0x03,0xff,0xd8,0x06,0x60,0x02,0x2c,0x08,0x21,0x00,0x1e,0x00,0x35,0x00,0x41,0x00,0x4c,0xb4,0x14,0x39,0x04,0x32,0x11,0xbe,0x05,0x0d,0x00,0x39,0x00,0x22,0x05,0x0d,0x00,0x32,0x00,0x3f,0x05,0x0d,0xb4,0x07,0x36,0x1b,0x1e, -0x0c,0xb8,0x04,0xfd,0x40,0x0a,0x3c,0x00,0x1f,0x35,0x04,0x14,0x27,0x2d,0x2d,0x00,0xb9,0x05,0x00,0x00,0x1e,0x00,0x2f,0xed,0x32,0x2f,0xdd,0x39,0x39,0xc0,0x32,0x10,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x2f,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x13,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e, -0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x07,0x13,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x88,0x2d,0x58,0x2e,0x01,0x2e,0x2b,0x1a,0x2d,0x3c,0x22,0x24,0x3d,0x2c,0x19, -0x2a,0x23,0x0e,0x18,0x0b,0x21,0x1b,0x2e,0x15,0x3e,0x84,0x3f,0x0b,0x30,0x3a,0x05,0x06,0x0d,0x06,0x1e,0x2b,0x31,0x22,0x17,0x28,0x1d,0x11,0x54,0x4c,0x01,0x17,0x22,0x27,0x2e,0x23,0x23,0x2f,0x31,0x06,0xb0,0x04,0x0e,0x13,0x05,0x1f,0x4e,0x2d,0x24,0x3b,0x2b,0x18,0x18,0x2b,0x39,0x21,0x33,0x4c,0x21,0x08,0x09,0x05,0x4a,0x0a,0x15, -0x0b,0x21,0x1d,0x05,0x01,0x86,0x17,0x41,0x2a,0x0e,0x14,0x02,0x02,0x28,0x21,0x26,0x2c,0x17,0x27,0x35,0x1e,0x4d,0x74,0x24,0xfe,0xe1,0x18,0x3a,0x21,0x22,0x29,0x27,0x20,0x26,0x3a,0x00,0x00,0x04,0xff,0xd4,0x05,0x20,0x02,0x33,0x08,0x29,0x00,0x2f,0x00,0x4e,0x00,0x65,0x00,0x71,0x00,0xaa,0x40,0x0a,0x44,0x2c,0x34,0x03,0x12,0x52, -0x52,0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0b,0x12,0x62,0x62,0x12,0x15,0x15,0x12,0x12,0x41,0x41,0x03,0xb8,0x05,0x0d,0x40,0x0d,0x2c,0x69,0x69,0x2c,0x2f,0x2f,0x2c,0x0a,0x26,0x1f,0x6f,0x6f,0x37,0xb8,0x05,0x0d,0xb3,0x26,0x23,0x23,0x26,0xb8,0x05,0x0d,0x40,0x09,0x1f,0x22,0x22,0x1f,0x00,0x4b,0x66,0x4e,0x3c,0xb8,0x04,0xfd,0x40, -0x0a,0x6c,0x30,0x4f,0x65,0x34,0x44,0x57,0x5d,0x5d,0x30,0xb8,0x05,0x00,0xb6,0x4e,0x2f,0x16,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0x32,0x32,0xde,0xed,0x32,0x2f,0xcd,0x39,0x39,0xc0,0x32,0x10,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x10,0xe4,0x33, -0x2f,0x11,0x12,0x39,0x2f,0x33,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x11,0x33,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x11,0x12,0x39,0x11,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36, -0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x25,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x07,0x13,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02, -0x35,0x34,0x36,0x37,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0xb9,0x2d,0x58,0x2e,0x01,0x2e,0x28,0x1c,0x2d,0x3a,0x1f, -0x1f,0x3b,0x2e,0x1c,0x28,0x23,0x0e,0x18,0x0b,0x21,0x1b,0x2e,0x15,0x3e,0x84,0x3f,0x0b,0x30,0x3a,0x05,0x06,0x0d,0x06,0x1e,0x2b,0x31,0x22,0x17,0x28,0x1d,0x11,0x54,0x4c,0x01,0x17,0x22,0x25,0x32,0x1e,0x1d,0x31,0x2e,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30, -0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x8e,0x04,0x0e,0x13,0x05,0x1d,0x49,0x2b,0x27,0x3a,0x27,0x13,0x13,0x25,0x38,0x25,0x30,0x48,0x20,0x08,0x09,0x05,0x4a,0x0a,0x15,0x0b,0x21,0x1b,0x05,0x01,0x78,0x15,0x3d,0x26,0x0e,0x12,0x02,0x02,0x28,0x21,0x26,0x2c,0x16,0x26,0x33,0x1d,0x4b,0x70, -0x23,0xfe,0xed,0x16,0x35,0x1f,0x23,0x23,0x23,0x21,0x23,0x33,0x00,0x02,0xff,0xd4,0x05,0x20,0x02,0x33,0x08,0x04,0x00,0x2f,0x00,0x33,0x00,0x5e,0xb4,0x0a,0x31,0x23,0x23,0x30,0xbb,0x05,0x0b,0x00,0x31,0x00,0x26,0x05,0x0d,0xb5,0x22,0x22,0x31,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb5,0x12,0x15,0x15,0x12,0x12,0x03,0xb8,0x05,0x0d,0x40, -0x0d,0x2c,0x2f,0x2f,0x2c,0x00,0x33,0x30,0x2f,0x16,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0x32,0x32,0xd6,0xcd,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0xed,0x10,0xed,0x32,0x2f,0x11,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06, -0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x23,0x11,0x33,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02, -0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x92,0x74,0x74,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x64,0x01,0x6a,0x00,0x00,0x03, -0xff,0x6c,0x05,0x26,0x02,0x03,0x08,0x58,0x00,0x18,0x00,0x3d,0x00,0x4b,0x00,0x69,0xb2,0x3a,0x11,0x37,0xb8,0x05,0x0d,0xb5,0x3e,0x09,0x09,0x3e,0x0e,0x11,0xb8,0x05,0x0d,0xb3,0x2b,0x06,0x06,0x46,0xb8,0x05,0x0d,0xb7,0x2d,0x0e,0x09,0x0a,0x25,0x22,0x1f,0x32,0xb8,0x04,0xfd,0xb3,0x41,0x3a,0x49,0x28,0xb8,0x04,0xfd,0xb4,0x1f,0x16, -0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0x32,0x39,0xd4,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x2f,0x39,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15, -0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36, -0x36,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x02,0x17,0x28,0x11,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34,0x10,0x0f,0x01,0x36,0x1e,0x31,0x3f,0x20,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a, -0x2f,0x3b,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x2b,0x11,0x22,0x11,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x42,0x41,0x24,0x38,0x27,0x14,0x14,0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x19,0x11,0x1b,0x38,0x1b,0x0e,0x35,0x00, -0x00,0x02,0x00,0x05,0x05,0x26,0x02,0x01,0x07,0x3b,0x00,0x18,0x00,0x1c,0x00,0x3f,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb7,0x11,0x11,0x1d,0x1a,0x0e,0x09,0x0a,0x1a,0xb8,0x04,0xfd,0xb4,0x1b,0x16,0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f, -0x10,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x25,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21, -0xfe,0x92,0x01,0xfc,0xfe,0x04,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xb8,0x58,0x00,0x03,0xff,0xf8,0x05,0x26,0x02,0x03,0x08,0x58,0x00,0x18,0x00,0x3c,0x00,0x4a,0x00,0x65,0xb3,0x39,0x18,0x11,0x36,0xb8,0x05,0x0d,0xb5,0x3d,0x09,0x09,0x3d,0x0e,0x11,0xb8,0x05,0x0d,0xb3,0x2a, -0x06,0x06,0x45,0xb8,0x05,0x0d,0xb4,0x2c,0x0e,0x09,0x0a,0x31,0xb8,0x04,0xfd,0xb3,0x40,0x39,0x48,0x26,0xb8,0x04,0xfd,0xb4,0x1f,0x16,0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0x32,0x39,0xd4,0xed,0x11,0x12,0x39,0x01, -0x2f,0xed,0x39,0x2f,0x39,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02, -0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x02,0x17,0x28,0x11,0x18,0x2f,0x14,0x3c,0x65,0x31,0x12,0x33,0x5a,0x39,0x01,0x0b,0x06,0x01,0x34, -0x1e,0x31,0x3e,0x21,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a,0x30,0x3a,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x2b,0x11,0x22,0x11,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x40,0x40,0x24,0x39,0x27,0x14,0x14,0x27,0x3a, -0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x1a,0x10,0x1a,0x3a,0x1a,0x0e,0x36,0x00,0x00,0x03,0x00,0x05,0x05,0x26,0x02,0x01,0x07,0xea,0x00,0x18,0x00,0x1c,0x00,0x20,0x00,0x41,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb4,0x11,0x0e,0x09,0x0a,0x1a,0xbb,0x04,0xfd,0x00,0x1b,0x00,0x1e,0x04,0xfd,0xb4,0x1f,0x16,0x18,0x18, -0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01, -0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x01,0x67,0x58,0x57,0x58,0x00,0x00,0x03, -0x00,0x49,0x05,0x26,0x01,0xbd,0x08,0x42,0x00,0x17,0x00,0x2b,0x00,0x37,0x00,0x55,0xbc,0x00,0x1d,0x05,0x0d,0x00,0x2f,0x00,0x06,0x05,0x0d,0xb3,0x0e,0x10,0x10,0x35,0xb8,0x05,0x0d,0xb5,0x0b,0x27,0x0e,0x09,0x0a,0x18,0xbb,0x04,0xfd,0x00,0x32,0x00,0x2c,0x04,0xfd,0xb4,0x22,0x15,0x17,0x17,0x15,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c, -0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0xed,0x39,0x2f,0x39,0xed,0x2f,0xed,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x03,0x32,0x1e,0x02, -0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x2d,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x70,0x28,0x45,0x31,0x1c,0x1c,0x31,0x45,0x28,0x2a,0x45,0x30,0x1b,0x1b,0x31,0x44,0x2a,0x30,0x30,0x30, -0x30,0x30,0x30,0x30,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x33,0x3a,0x21,0x37,0x28,0x16,0x06,0x01,0xbf,0x1c,0x31,0x42,0x26,0x26,0x42,0x30,0x1c,0x1c,0x30,0x42,0x26,0x26,0x42,0x31,0x1c,0xfe,0xee,0x33,0x2a,0x29,0x35,0x35,0x29,0x2a,0x33,0x00,0x00,0x03,0x00,0x05,0xfe,0x00,0x02,0x01,0x00,0xc1,0x00,0x18,0x00,0x1c, -0x00,0x20,0x00,0x3d,0xb1,0x0e,0x06,0xbe,0x05,0x0d,0x00,0x11,0x00,0x1b,0x04,0xfd,0x00,0x1a,0x00,0x1f,0x04,0xfd,0xb2,0x1e,0x0e,0x0a,0xb8,0x04,0xfd,0xb4,0x09,0x0c,0x0c,0x09,0x03,0xb8,0x04,0xfd,0xb3,0x16,0x18,0x18,0x16,0x00,0x2f,0x33,0x2f,0x10,0xfd,0xc6,0x32,0x2f,0x10,0xfd,0x39,0xd6,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x39,0x31, -0x30,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04, -0x56,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xfd,0x9d,0x58,0x01,0x07,0x58,0x00,0x00,0x02,0x00,0x05,0xfe,0xaf,0x02,0x01,0x00,0xc1,0x00,0x18,0x00,0x1c,0x00,0x35,0xb1,0x0e,0x06,0xbb,0x05,0x0d,0x00,0x11,0x00,0x1b,0x04,0xfd,0xb2,0x1a,0x0e,0x0a,0xb8,0x04,0xfd,0xb4,0x09,0x0c,0x0c,0x09, -0x03,0xb8,0x04,0xfd,0xb3,0x16,0x18,0x18,0x16,0x00,0x2f,0x33,0x2f,0x10,0xfd,0xc6,0x32,0x2f,0x10,0xfd,0x39,0xd6,0xed,0x01,0x2f,0xed,0x39,0x31,0x30,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e, -0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x56,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xfe,0x4c,0x58,0xff,0xff,0x00,0x4f,0xfe,0xf8,0x01,0x64,0x00,0xe4,0x00,0x06,0x00,0x0f,0x28,0x00,0x00,0x01,0x00,0xab,0xff,0xea,0x07,0x59, -0x03,0x0f,0x00,0x2e,0x00,0x3c,0xb1,0x0c,0x01,0xb8,0x05,0x0a,0xb3,0x2d,0x2d,0x30,0x20,0xb8,0x05,0x0a,0x40,0x0a,0x19,0x2f,0x2e,0x01,0x2e,0x2f,0x1d,0x01,0x1d,0x11,0xb8,0x05,0x03,0xb2,0x0c,0x28,0x06,0xba,0x04,0xfb,0x00,0x07,0x05,0x03,0x00,0x3f,0xed,0x32,0x39,0x3f,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39, -0x31,0x30,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x06,0x9f,0x0c,0x27,0x49,0x3e,0x16,0x61,0x70,0x20,0x04,0x2c,0x80,0x9d,0xb4,0x60,0x88,0xe1,0xb5,0x88,0x30,0x40, -0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1d,0x5c,0x92,0xd1,0x93,0x80,0xc0,0x7f,0x3f,0x03,0x0f,0xfe,0x89,0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x35,0x19,0x05,0x04,0x15,0x2c,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0x00,0x01,0xff,0xba,0xff,0xf2, -0x01,0xf2,0x03,0x0f,0x00,0x16,0x00,0x1e,0xbe,0x00,0x08,0x05,0x0a,0x00,0x05,0x00,0x00,0x04,0xfb,0x00,0x0f,0x05,0x03,0xb3,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c, -0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0x00,0x00,0x02,0x00,0x9b,0xfd,0xff,0x06,0x03,0x02,0xb7,0x00,0x30,0x00,0x41,0x00,0x65,0xb2,0x13,0x13,0x10,0xb8,0x05,0x0a,0xb4,0x3f,0x30,0x30,0x3f,0x3b,0xb8,0x05,0x0a,0xb6,0x05, -0x3f,0x05,0x3f,0x05,0x43,0x24,0xb8,0x05,0x0a,0xb5,0x1d,0x2f,0x21,0x01,0x21,0x29,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x18,0x2f,0x18,0x02,0x18,0x3f,0x3e,0x3e,0x10,0xbd,0x04,0xfb,0x00,0x00,0x00,0x12,0x05,0x03,0x00,0x36,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d, -0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x03,0x2e,0x03,0x23,0x22, -0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x04,0x36,0x5c,0x91,0x66,0x36,0x30,0x55,0x73,0x44,0x48,0x78,0x36,0x2d,0x34,0x07,0xbc,0xbb,0x0b,0x54,0x99,0xe0,0x97,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x60,0x8d,0x63,0x3e,0x24,0x10,0x03,0x1d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1a,0x7c,0x86, -0x65,0x04,0x0e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x48,0xc0,0x6d,0xa7,0x7f,0xbc,0x7b,0x3d,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x19,0x2d,0x3e,0x49,0x52,0x2b,0x01,0x42,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49, -0x03,0x62,0x02,0x06,0x09,0x3c,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x03,0x62,0x02,0x06,0x09,0x3d,0x00,0x00,0xff,0xff,0x00,0x49,0x04,0x7c,0x01,0xa2,0x05,0xe9,0x00,0x07,0x09,0x7e,0x00,0x00,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x3e,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x01, -0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe7,0xfd,0xff,0x04,0x02,0x05,0x63,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01,0xfd,0x55,0x01,0x07,0x09,0x30,0x00,0x28,0xfd,0x55,0x00,0x0e,0xb6,0x04,0x03,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff, -0xff,0xba,0xff,0xf2,0x03,0xa3,0x05,0x3e,0x00,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x01,0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x3e,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01,0xfd,0x55,0x01,0x07,0x09,0x21,0x02,0xac, -0x00,0x00,0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xb9,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x57,0x02,0xad,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x06,0x32,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff, -0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07, -0x0f,0x52,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xee,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x5b,0x02,0xad,0x00,0xef,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff, -0xff,0xba,0xff,0x05,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca, -0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff, -0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07, -0x0f,0x56,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x16,0x02,0x26,0x0e,0x2d,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfd,0x2d,0x00,0x0a,0xb4,0x01,0x2f,0x4c,0x01,0x4c,0x00,0x11, -0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x79,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0xfe,0xab,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d, -0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x79,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9, -0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xf4,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x5b,0x00,0xab, -0x00,0xf5,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x27,0x0f,0x57,0x01,0x1d,0x04,0xad,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea, -0x04,0x02,0x05,0x5d,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x1d, -0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x04,0x07,0x02,0x26,0x0e,0x31, -0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0x50,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x06,0xae,0x04,0x07,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0x5a,0x03,0x0f,0x02,0x26,0x0e,0x31, -0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x50,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x06,0xae,0x03,0x0f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xa4,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x54,0x05,0x50,0xfd,0xce,0x00,0x07,0x0f,0x53,0x05,0x46, -0x03,0x57,0xff,0xff,0xff,0xba,0xfd,0xc9,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xa4,0xfd,0xce,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x03,0x3c,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x51,0x06,0x3c,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6, -0x08,0x04,0x03,0x3c,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x86,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x05,0xca,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x08,0x04,0x05,0xca,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x1e, -0x04,0x02,0xff,0xff,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x39,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x02,0x26,0x0e,0x3a,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x3b, -0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0x00,0x02,0x00,0xab,0xff,0xea,0x08,0x04,0x03,0x62,0x00,0x41,0x00,0x55,0x00,0x5c,0xb1,0x10,0x0d,0xbb,0x05,0x0a,0x00,0x42,0x00,0x4e,0x05,0x0a,0xb6,0x00,0x42,0x00,0x42,0x00,0x57,0x2f,0xb8,0x05,0x0a,0xb5,0x28,0x2f,0x2c,0x01,0x2c,0x1f,0xb8,0x05,0x03,0x40,0x09,0x53,0x1a,0x05, -0x14,0x3c,0x3c,0x39,0x39,0x13,0xbc,0x04,0xfb,0x00,0x14,0x05,0x03,0x00,0x49,0x04,0xfb,0xb3,0x2f,0x05,0x01,0x05,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x11,0x33,0x2f,0x11,0x12,0x39,0x39,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03, -0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x04,0xb0,0x30,0x55,0x74,0x44, -0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5b,0x27,0x33,0x77,0x82,0x8a,0x45,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x01,0xfe,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b, -0x1b,0x19,0x41,0x73,0x5a,0x23,0x1b,0x01,0xd1,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x63,0x27,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x18,0x1a,0x0d,0x03,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x35, -0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x1f,0x3e,0x43,0x4a,0x2b,0x18,0x4d,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x08,0x04,0x05,0x24,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x27,0x0f,0x50,0x04,0xd7, -0x04,0x74,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04,0x06,0x3c,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x53,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0xab,0xfd,0xc9,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x10,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea, -0x08,0x04,0x06,0x3c,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x56,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x04,0x79,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xd4,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5, -0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x05,0x91,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xd4,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c, -0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0x00,0x01,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x00,0x43,0x00,0x49,0xb4,0x13,0x05,0x05,0x1b,0x37,0xb8,0x05,0x0a,0x40,0x0c,0x30,0x1b,0x2f,0x34,0x01, -0x34,0x0a,0x0e,0x0b,0x03,0x0c,0x28,0xb8,0x05,0x03,0xb5,0x3f,0x20,0x20,0x1f,0x1f,0x1a,0xba,0x04,0xfb,0x00,0x1b,0x05,0x03,0xb4,0x0d,0x2f,0x0c,0x01,0x0c,0x00,0x2f,0x5d,0x33,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x33,0x3f,0x12,0x17,0x39,0x2f,0x5d,0x01,0x2f,0x2f,0xed,0x12,0x39,0x10,0xcd,0x31,0x30,0x25,0x3e,0x03,0x35,0x34,0x2e,0x02, -0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x17,0x1e,0x05,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x05,0x4b,0x25,0x32,0x1c,0x0c,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0xad,0xdd,0x85,0x40, -0x10,0x03,0x0b,0x14,0x21,0x34,0x49,0x32,0x16,0x59,0x8d,0x2c,0x05,0x22,0x53,0x44,0x27,0x5d,0x74,0x90,0x5a,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1a,0x4f,0x7b,0xb1,0x7c,0x4f,0x80,0x66,0x4f,0xad,0x0a,0x1d,0x26,0x2d,0x1a,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x52,0x92,0x8b, -0x8a,0x4a,0x0f,0x2b,0x30,0x2e,0x26,0x17,0xa7,0x4a,0x55,0x2d,0x3d,0x15,0x0c,0x10,0x09,0x03,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x02,0x05,0x0a,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x06,0x0e,0x56,0x00,0x00,0x00,0x01,0x00,0x19,0xff,0xea, -0x08,0xaf,0x04,0x19,0x00,0x48,0x00,0x52,0xb9,0x00,0x25,0x05,0x0a,0xb2,0x1a,0x3b,0x30,0xb8,0x05,0x0a,0xb4,0x11,0x0e,0x0e,0x11,0x14,0xb8,0x04,0xfb,0xb7,0x2b,0x2b,0x1f,0x3b,0x41,0x35,0x35,0x07,0x41,0x09,0x04,0xfb,0x00,0x41,0x05,0x03,0x00,0x32,0x04,0xfb,0x00,0x36,0x05,0x03,0x00,0x20,0x04,0xfb,0xb3,0x2f,0x1f,0x01,0x1f,0x00, -0x2f,0x5d,0xed,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x11,0x39,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x37,0x1e,0x05,0x33,0x32,0x3e,0x04,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14, -0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x06,0x04,0x21,0x22,0x2e,0x04,0x27,0x19,0x25,0x83,0xaa,0xc7,0xd4,0xd8,0x65,0x72,0xbb,0x9d,0x83,0x72,0x68,0x33,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f, -0x0b,0x20,0x3e,0x1f,0x07,0x39,0x4b,0x1a,0x04,0x0c,0x21,0x14,0x76,0xfe,0x25,0xfe,0xa9,0x47,0xb1,0xc0,0xc2,0xae,0x8f,0x2d,0xa9,0x05,0x07,0x06,0x03,0x02,0x01,0x01,0x02,0x02,0x05,0x06,0x04,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66, -0x38,0x23,0x2c,0x05,0x03,0xa7,0x2c,0x29,0x16,0x21,0x0e,0x0a,0x0e,0x01,0x02,0x03,0x06,0x07,0x05,0x00,0x00,0x01,0xff,0xba,0xff,0xea,0x08,0x04,0x04,0x19,0x00,0x4d,0x00,0x61,0xb1,0x3f,0x34,0xb8,0x05,0x0a,0x40,0x09,0x15,0x12,0x12,0x24,0x15,0x15,0x1e,0x3a,0x29,0xbb,0x05,0x0a,0x00,0x1e,0x00,0x18,0x04,0xfb,0xb3,0x2f,0x2f,0x23, -0x47,0xbc,0x05,0x03,0x00,0x3a,0x05,0x03,0x00,0x24,0x04,0xfb,0x40,0x0c,0x2f,0x23,0x01,0x23,0x3f,0x00,0x39,0x36,0x36,0x0d,0x0d,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x33,0x11,0x39,0x2f,0x5d,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0x39,0x33,0x2f,0x10,0xed, -0x39,0x31,0x30,0x17,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x16,0x04,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07, -0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x32,0x32,0x23,0x23,0x23,0x23,0x3b,0x1e,0xa2,0xef,0x01,0x2e,0xab,0x9d,0xf6,0xc3,0x99,0x40,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f,0x0b,0x20,0x3e,0x1f,0x07,0x39,0x4c,0x19,0x04,0x0b, -0x22,0x14,0x34,0xb6,0xec,0xfe,0xe9,0x96,0x50,0xb3,0xb2,0xa8,0x8b,0x66,0x0e,0x34,0x20,0x20,0x33,0x03,0x03,0x02,0x03,0x05,0x07,0x05,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x23,0x2c,0x05,0x03,0xa7,0x2d,0x28,0x15,0x22,0x0e, -0x05,0x08,0x07,0x04,0x01,0x02,0x02,0x02,0x01,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x5b,0x04,0xa6,0x05,0xb0,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0xff,0xff,0x00,0xab,0xff,0xea, -0x06,0xae,0x06,0xb3,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xae,0x07,0xcb,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73, -0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xcb,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x74,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56, -0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59, -0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x5b,0x04,0xa6,0x05,0xb0,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x27,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xc3, -0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x51,0x03,0x90,0x07,0x13,0x00,0x0c,0xb5,0x03,0x02,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xc3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x51,0x00,0x39, -0x07,0x13,0x00,0x0c,0xb5,0x03,0x02,0x20,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00, -0x00,0x26,0x0f,0x59,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x52,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x27, -0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x08,0xbd,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x57,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x4f,0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x5d,0x35,0x35, -0x35,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x08,0xbd,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x00,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x3c,0x01,0x20,0x3c,0x01,0x3c,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x70,0x08,0x0e, -0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0a,0x6d,0x03,0x48,0x00,0x32,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x07,0x67,0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x48,0x06,0xb7,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x08,0x7f,0x02,0x26,0x09,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x48,0x06,0xb7,0x00,0x0e, -0xb6,0x01,0x03,0x02,0x20,0x34,0x01,0x34,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0x04,0x00,0x9b,0xfd,0xc4,0x05,0x58,0x05,0xec,0x00,0x28,0x00,0x2c,0x00,0x30,0x00,0x34,0x00,0x72,0xb1,0x0e,0x01,0xbb,0x05,0x0a,0x00,0x27,0x00,0x2a,0x05,0x0c,0xb2,0x29,0x29,0x2d,0xbb,0x05,0x0c,0x00,0x2e,0x00,0x31,0x05,0x0c,0x40,0x0a,0x32,0x27,0x2e, -0x32,0x32,0x2e,0x27,0x03,0x36,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x29,0x04,0xfb,0xb2,0x2c,0x31,0x2d,0xb8,0x04,0xfb,0x40,0x0c,0x33,0x2f,0x30,0x01,0x30,0x1a,0x0d,0x00,0x11,0x11,0x22,0x06,0xbb,0x04,0xfb,0x00,0x07,0x05,0x03,0x00,0x00,0x00,0x2f,0x3f,0xed,0x32,0x33,0x2f,0x12,0x39,0x2f,0x2f,0x5d,0x33,0xfd,0x32,0xd6,0xed,0x01, -0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x01,0x23,0x35,0x33,0x37,0x23,0x35,0x33, -0x05,0x23,0x35,0x33,0x04,0x9e,0x0c,0x27,0x49,0x3e,0x1a,0x23,0x4c,0x48,0x3e,0x14,0x03,0x41,0xda,0xa3,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x24,0x4e,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xfc,0xc9,0xc9,0xab,0xc9,0xc9,0xfe,0xaa,0xc9,0xc9,0x05,0xec,0xfb,0xb0,0x43,0x61,0x40,0x1f,0xa7,0x10,0x27,0x44,0x35,0x56,0x5a,0x45, -0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x2e,0x67,0xa7,0x79,0x03,0x9c,0xf7,0xd8,0xbd,0x5b,0xbd,0xbd,0xbd,0x00,0x03,0x00,0x9b,0xfd,0xf6,0x05,0x58,0x04,0xb6,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6e,0xb1,0x11,0x03,0xb8,0x05,0x0a,0xb2,0x2c,0x34,0x30,0xb8,0x05,0x0c,0x40,0x09,0x31,0x35,0x31,0x2c,0x31, -0x2c,0x31,0x39,0x22,0xbb,0x05,0x0a,0x00,0x1b,0x00,0x34,0x04,0xfb,0xb4,0x2f,0x37,0x01,0x37,0x30,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x33,0x01,0x33,0x2f,0x2f,0x01,0x2f,0x16,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x27,0x01,0x27,0x2f,0x1f,0x01,0x1f,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0x2f,0x5d,0xed, -0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35, -0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x3a,0x34,0x14,0x04,0x1b,0x56,0x79,0x9e,0x63,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0xc9,0xc9,0x03,0x17,0x5d,0xac,0x51,0x21,0x47,0x62,0x3e, -0x1c,0xa7,0x09,0x16,0x28,0x1e,0x3d,0x60,0x42,0x23,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0x40,0xbd,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50, -0x00,0x83,0xfe,0xab,0x00,0x01,0x00,0x9b,0xfd,0xff,0x05,0x58,0x01,0xc1,0x00,0x2a,0x00,0x4a,0xb2,0x0b,0x00,0x0c,0xb8,0x05,0x0a,0xb5,0x2a,0x27,0x27,0x2c,0x1a,0x1d,0xb8,0x05,0x0a,0x40,0x0b,0x19,0x16,0x2f,0x2a,0x01,0x2a,0x2f,0x1a,0x01,0x1a,0x22,0xb8,0x04,0xfb,0xb7,0x1f,0x11,0x2f,0x11,0x02,0x11,0x0c,0x06,0xba,0x04,0xfb,0x00, -0x07,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34, -0x26,0x27,0x04,0x84,0x08,0x09,0x06,0x09,0x55,0x5f,0x16,0x3f,0x4a,0x17,0x05,0x03,0x3c,0x82,0xcf,0x95,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0x01,0xc1,0x2d,0x54,0x2a,0x3f,0x3e,0xa7,0x26,0x20,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39, -0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x05,0x0e,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x06,0x32,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff,0xff,0xba, -0xff,0xf2,0x02,0xac,0x06,0x32,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0x00,0x03,0x00,0x9b,0xfe,0x55,0x05,0x58,0x04,0xb6,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x7e,0xb1,0x11,0x03,0xb8,0x05,0x0a,0xb2,0x39,0x14,0x17,0xb8,0x05,0x0e,0xb2,0x44,0x23,0x21,0xb8,0x05,0x0e,0xb5,0x4a,0x44,0x4a,0x44,0x4a, -0x3d,0xb8,0x05,0x0c,0xb6,0x3e,0x39,0x3e,0x39,0x3e,0x4e,0x2f,0xbb,0x05,0x0a,0x00,0x28,0x00,0x40,0x01,0x57,0xb5,0x3d,0x2f,0x3c,0x01,0x3c,0x1c,0xb8,0x05,0x00,0xb3,0x41,0x14,0x23,0x47,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x34,0x01,0x34,0x2f,0x2c,0x01,0x2c,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d, -0x2f,0x5d,0xfd,0x39,0x39,0xd6,0xed,0x2f,0x5d,0xd6,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x39,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e, -0x02,0x35,0x34,0x37,0x2e,0x03,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x39,0x35,0x14,0x04,0x2b,0xa3,0x80,0x14,0x17,0x1a,0x2b,0x3a, -0x20,0x23,0x3b,0x2b,0x19,0x21,0x6e,0x95,0x5b,0x27,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0x63,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0x03,0x17,0x5e,0xab,0x51,0x21,0x47,0x62,0x3e,0x1c,0xa7,0x09,0x16,0x28,0x1e,0x60,0x7d,0x18,0x15,0x38,0x21,0x20,0x3a,0x2c,0x19,0x19,0x2c,0x39, -0x21,0x3b,0x2a,0x0b,0x4d,0x7e,0xab,0x68,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0xea,0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07, -0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x04,0x74,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x87,0x04,0x53, -0x02,0x06,0x0e,0x5b,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xff,0x04,0x02,0x03,0x56,0x02,0x06,0x0e,0x5d,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0x56,0xfd,0xce,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x57,0xff,0xaf,0x04,0x02,0x04,0x11, -0x02,0x26,0x09,0x72,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfc,0x28,0xff,0xff,0x00,0x57,0xff,0xaf,0x04,0x02,0x03,0x5c,0x02,0x26,0x09,0x72,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0x02,0xac,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x06,0x0f,0x5b,0x66,0x60,0x00,0x02,0x00,0x00, -0xfd,0xfe,0x04,0x02,0x03,0x1c,0x00,0x2c,0x00,0x41,0x00,0x6a,0xb2,0x12,0x2b,0x37,0xb8,0x05,0x0a,0xb2,0x13,0x20,0x2b,0xb8,0x05,0x0a,0xb4,0x18,0x3f,0x3f,0x18,0x12,0xb8,0x04,0xfd,0xb6,0x2f,0x15,0x01,0x15,0x15,0x0d,0x1b,0xb8,0x04,0xfb,0xb6,0x2f,0x3c,0x3f,0x3c,0x02,0x3c,0x32,0xb8,0x04,0xfb,0xb5,0x2f,0x25,0x01,0x25,0x0a,0x0d, -0xb8,0x04,0xfb,0x40,0x09,0x09,0x1f,0x06,0x2f,0x06,0x02,0x06,0x18,0x2b,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x5d,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x05,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x35,0x16, -0x16,0x33,0x32,0x3e,0x02,0x37,0x21,0x35,0x21,0x36,0x36,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x33,0x25,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x04,0x02,0xc3,0x0d,0x3f,0x72,0xab,0x79,0x58,0xad,0x58,0x67,0xab,0x45,0x3e,0x60,0x48,0x33, -0x11,0xfe,0x2a,0x01,0xf4,0x08,0x07,0x01,0x30,0x56,0x2a,0x42,0x7b,0x5e,0x39,0x30,0x55,0x75,0x45,0x42,0x7f,0x63,0x3d,0xb7,0xfe,0x96,0x0f,0x2a,0x32,0x35,0x1a,0x1c,0x37,0x2c,0x1b,0x20,0x3a,0x4e,0x2f,0x1b,0x4b,0x2a,0x02,0x09,0x0e,0x62,0xb5,0x8a,0x53,0x2c,0x2a,0xa6,0x2b,0x25,0x1b,0x31,0x43,0x28,0x6d,0x2b,0x58,0x2d,0x16,0x11, -0x29,0x4f,0x72,0x48,0x41,0x8e,0x77,0x4d,0x4f,0x9e,0xee,0x9f,0x09,0xef,0x33,0x55,0x3d,0x22,0x26,0x3d,0x4a,0x24,0x26,0x3c,0x29,0x16,0x0c,0x14,0x1d,0x33,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x31,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x0a,0x6d,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11, -0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x63,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x30,0x00,0xe4,0xfd,0x55,0x00,0x0c,0xb5,0x03,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x59,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x09,0x73,0x00,0xe5,0xfd,0x55, -0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x31,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x04,0x79,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x00, -0xfd,0xff,0x04,0x02,0x05,0x91,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x03,0xc9,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x6d, -0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x04,0x79,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x03,0xc9,0xff,0xff,0xff,0xba,0xfd,0xc9,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba, -0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54, -0x00,0x83,0xfd,0xce,0x00,0x01,0x00,0x81,0x06,0xa6,0x01,0x86,0x07,0xab,0x00,0x13,0x00,0x19,0xbc,0x00,0x0a,0x05,0x0c,0x00,0x00,0x00,0x05,0x04,0xfe,0xb3,0x2f,0x0f,0x01,0x0f,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x81,0x13,0x23,0x2f,0x1d, -0x1c,0x31,0x22,0x14,0x14,0x22,0x31,0x1c,0x1d,0x2f,0x23,0x13,0x07,0x28,0x1c,0x31,0x22,0x14,0x14,0x22,0x31,0x1c,0x1d,0x2f,0x23,0x13,0x13,0x23,0x2f,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x53,0x05,0x50,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff, -0xff,0xba,0xfe,0xa6,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x04,0xb2,0x00,0x26,0x0e,0x35,0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0xca,0x04,0x02,0x00,0x07,0x0f,0x50,0x06,0x3c,0xfe,0xab,0xff,0xff, -0xff,0xba,0xfe,0xa6,0x08,0x04,0x04,0xb2,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x27,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x07,0x0f,0x50,0x03,0x90,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x55,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x0f, -0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x55,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x21,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xca, -0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07, -0x0f,0x53,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x83,0xfd,0xce,0x00,0x07, -0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xad,0xfe,0xab,0x00,0x07,0x0f,0x50,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x83,0xfe,0xab,0x00,0x07, -0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0x13,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0xad,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x35,0x01,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0x13,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0x83, -0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0x5a,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0xad,0xfd,0x7e,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0xfd,0x7e,0xff,0xff, -0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x27, -0x0f,0x57,0x01,0x1d,0x04,0xad,0x00,0x07,0x0f,0x52,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x52,0xfe,0x13,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x2b,0x01,0x2b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c, -0x00,0x00,0x00,0x07,0x0f,0x5c,0x00,0xc0,0xfc,0xfa,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0f,0x56,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0xab,0xfe,0xa6, -0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x51,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x10,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0xb3,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x90, -0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xcb,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0x00,0x39,0xfd,0xff,0x04,0xad,0x04,0x79,0x02,0x26,0x0e,0x57, -0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x79,0x02,0x26,0x0e,0x58,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0x00,0x39,0xfd,0xff,0x04,0xad,0x02,0xb9,0x02,0x26,0x0e,0x57,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6, -0x04,0xad,0x02,0xaf,0x02,0x26,0x0e,0x58,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0x00,0x04,0x00,0x9b,0xfd,0xf6,0x05,0x58,0x04,0xb6,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x82,0xb1,0x11,0x03,0xbb,0x05,0x0a,0x00,0x2c,0x00,0x31,0x05,0x0c,0xb2,0x30,0x30,0x38,0xbe,0x05,0x0c,0x00,0x39,0x00,0x34,0x05,0x0c,0x00, -0x35,0x00,0x22,0x05,0x0a,0x40,0x0e,0x1b,0x2c,0x39,0x35,0x1b,0x1b,0x35,0x39,0x2c,0x04,0x3d,0x3c,0x38,0x34,0xb8,0x04,0xfb,0xb5,0x3a,0x2f,0x37,0x01,0x37,0x33,0xb8,0x01,0x57,0xb5,0x30,0x2f,0x2f,0x01,0x2f,0x16,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x27,0x01,0x27,0x2f,0x1f,0x01,0x1f,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00, -0x3f,0xed,0x39,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xd6,0xed,0x2f,0x5d,0x33,0xed,0x32,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34, -0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x3a,0x34,0x14,0x04,0x1b,0x56,0x79,0x9e,0x63,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94, -0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0xab,0xc9,0xc9,0x01,0x56,0xc9,0xc9,0x03,0x17,0x5d,0xac,0x51,0x21,0x47,0x62,0x3e,0x1c,0xa7,0x09,0x16,0x28,0x1e,0x3d,0x60,0x42,0x23,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0x40,0xbd,0xbd,0xbd,0x00,0xff,0xff, -0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x06,0x64,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x07,0x0f,0x57,0x01,0x9f,0x04,0x02,0xff,0xff, -0xff,0xba,0xff,0xf2,0x02,0xac,0x07,0xba,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0f,0x57,0x00,0x72,0x05,0x58,0x00,0x0a,0xb4,0x01,0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x05,0x63,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f, -0x02,0xac,0x01,0x07,0x0a,0x6d,0x01,0x9f,0xfd,0x87,0x00,0x0a,0xb4,0x01,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x06,0xb9,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0a,0x6d,0x00,0x9c,0xfe,0xdd,0x00,0x14,0x40,0x0a,0x02,0x2f,0x25,0x01,0x25,0x01, -0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0f,0x52,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xa4,0x03,0x57,0x00,0x03,0x00,0x7e, -0xfd,0xfe,0x04,0x2d,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x6a,0xb4,0x24,0x02,0x1b,0x1b,0x34,0xb8,0x05,0x0e,0xb2,0x44,0x4c,0x2b,0xb8,0x05,0x0d,0xb7,0x28,0x44,0x28,0x44,0x28,0x4e,0x10,0x21,0xbb,0x05,0x0a,0x00,0x02,0x00,0x39,0x04,0xfd,0xb6,0x3f,0x28,0x28,0x25,0x25,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x0f,0x2a,0x2f,0x2f, -0x01,0x2f,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0xc6,0xfd,0xc6,0x32,0x2f,0x32,0x2f,0x10,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x2f,0x11,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35, -0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x2b,0xad,0x53,0xa8,0xfe, -0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x07,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0xfd,0xfe, -0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x1e,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f, -0x33,0x43,0x24,0x00,0x00,0x04,0x00,0x7e,0xfd,0xfe,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x5a,0x00,0x7e,0xb2,0x1b,0x1b,0x34,0xb8,0x05,0x0e,0xb5,0x44,0x58,0x58,0x44,0x4c,0x2b,0xb8,0x05,0x0d,0x40,0x0b,0x28,0x44,0x28,0x44,0x28,0x5c,0x24,0x02,0x4d,0x10,0x21,0xbf,0x05,0x0a,0x00,0x02,0x00,0x50,0x04,0xfb,0x00, -0x52,0x05,0x03,0x00,0x39,0x04,0xfd,0xb6,0x3f,0x28,0x28,0x25,0x25,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x10,0x2a,0x2f,0x2f,0x01,0x2f,0x1b,0x07,0x1c,0x4d,0x04,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0xc6,0xfd,0xc6,0x32,0x2f,0x32,0x2f,0x10,0xed,0x3f,0xed,0x01,0x2f, -0xed,0x39,0x2f,0x12,0x39,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33, -0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5, -0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x06,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x01,0xba,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35, -0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x1e,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x02,0x43,0x68,0x55, -0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x00,0xff,0xff,0xff,0xba,0xfe,0x03,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0xfe,0x03,0xff,0xff,0xff,0xba,0xfe,0x03,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0xfe,0x03,0x00,0x05,0x00,0x7e,0xfd,0xfa,0x04,0x2d, -0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x50,0x00,0x54,0x00,0x9d,0xb9,0x00,0x52,0x05,0x0a,0xb7,0x51,0x51,0x44,0x24,0x02,0x1b,0x1b,0x34,0xbb,0x05,0x0e,0x00,0x44,0x00,0x2b,0x05,0x0d,0xb4,0x2c,0x4c,0x28,0x28,0x4d,0xb8,0x05,0x0a,0xb7,0x4e,0x44,0x4e,0x44,0x4e,0x56,0x10,0x21,0xb8,0x05,0x0a,0xb4,0x02,0x2c,0x2a,0x52,0x4d, -0xb8,0x05,0x02,0xb2,0x53,0x50,0x39,0xb8,0x04,0xfd,0x40,0x0a,0x3f,0x28,0x28,0x25,0x25,0x2f,0x3f,0x01,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x10,0x2f,0x2f,0x3f,0x2f,0x02,0x2f,0x2f,0x2a,0x01,0x2a,0x1c,0x07,0x1b,0x03,0x00,0x0d,0xb8,0x04,0xff,0xb4,0x14,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x2f,0x5d, -0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xfd,0xd6,0x32,0xed,0x32,0x11,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x2f,0x11,0x39,0x11,0x39,0x2f,0xed,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04, -0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63, -0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x07,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x21,0xb9,0xb9,0x01,0x42,0xb9,0xb9, -0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x82,0x02,0x03,0x02,0x01,0x93,0xf7,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38, -0x1f,0x33,0x43,0x24,0xfe,0x83,0xb5,0xb5,0xb5,0x00,0x00,0x06,0x00,0x7e,0xfd,0xfa,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x5a,0x00,0x5e,0x00,0x62,0x00,0xb1,0xb2,0x24,0x02,0x4d,0xb8,0x05,0x0b,0xb3,0x58,0x58,0x44,0x60,0xb8,0x05,0x0a,0xb3,0x34,0x5f,0x5f,0x34,0xbb,0x05,0x0e,0x00,0x44,0x00,0x2b,0x05,0x0d,0xb4, -0x2c,0x4c,0x28,0x28,0x5b,0xb8,0x05,0x0a,0xb7,0x5c,0x44,0x5c,0x44,0x5c,0x64,0x10,0x21,0xb8,0x05,0x0a,0xb2,0x02,0x5f,0x5b,0xb8,0x04,0xfb,0x40,0x0a,0x61,0x2f,0x5e,0x01,0x5e,0x51,0x50,0x50,0x2f,0x39,0xb8,0x04,0xfd,0x40,0x0a,0x3f,0x28,0x28,0x25,0x25,0x2f,0x3f,0x01,0x3f,0x47,0xb8,0x04,0xfd,0xb3,0x2c,0x52,0x2a,0x2f,0xba,0x04, -0xfb,0x00,0x52,0x05,0x03,0xb6,0x4d,0x1c,0x07,0x1b,0x04,0x00,0x0d,0xb8,0x04,0xff,0xb4,0x14,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0xed,0x12,0x17,0x39,0x3f,0xf4,0xc6,0x12,0x39,0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed, -0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x2f,0x10,0xe4,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02, -0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54, -0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x33,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x01,0xe7,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0xfe,0x86,0xb9,0xb9, -0x01,0x42,0xb9,0xb9,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x82,0x02,0x03,0x02,0x01,0x93,0xf7,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e, -0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x01,0xdf,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0xfc,0xac,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfd,0xfa,0x04,0x68,0x02,0xdb,0x00,0x42,0x00,0x50,0x00,0x54,0x00,0x58,0x00,0x92,0xb1,0x0d,0x30,0xb8,0x05,0x0e,0xb2,0x48,0x48,0x55,0xb8,0x05,0x0a,0xb2,0x56,0x50,0x27,0xb8,0x05,0x0d, -0xb2,0x3f,0x3f,0x51,0xb8,0x05,0x0a,0x40,0x09,0x52,0x56,0x52,0x56,0x52,0x5a,0x15,0x55,0x51,0xb8,0x04,0xfb,0x40,0x09,0x57,0x54,0x43,0x3e,0x3e,0x43,0x3b,0x3b,0x35,0xb8,0x04,0xfd,0xb4,0x2f,0x43,0x01,0x43,0x4b,0xb8,0x04,0xfd,0x40,0x0b,0x27,0x2f,0x2b,0x01,0x2b,0x20,0x0c,0x21,0x03,0x00,0x12,0xb8,0x04,0xff,0xb7,0x2f,0x19,0x01, -0x19,0x26,0x3f,0x3f,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x39,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0xd6,0x5d,0xed,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd4,0x32,0xed,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x32,0x10,0xed,0x39,0x2f,0xed,0x39,0x31,0x30,0x15,0x22, -0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x0e,0x03,0x07,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x16,0x16,0x17,0x35,0x06,0x06,0x23,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e, -0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xda,0xc7,0xb9,0x5a,0x3a,0x59,0x60,0x76,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x79,0x66,0x5c,0x65,0x76,0x4e,0x20,0x2c,0x75,0x95,0xb4,0x6a,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x0d,0x17,0x3e, -0x2a,0x51,0xb4,0x64,0x02,0x46,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x21,0xaf,0xaf,0x01,0x38,0xaf,0xaf,0x0e,0x34,0x20,0x20,0x33,0x31,0x4f,0x64,0x32,0x05,0x18,0x30,0x25,0x18,0x14,0x10,0x9d,0x12,0x17,0x1b,0x28,0x2f,0x29,0x1c,0x01,0xbb,0x09,0x41,0x57,0x5f,0x27,0x7a,0x01,0x3d,0x42,0x22,0x39,0x4b,0x29,0x3a, -0x40,0x1e,0x05,0x01,0x03,0x04,0x03,0x62,0x02,0x03,0x02,0xe6,0x17,0x1c,0xb5,0x02,0x0c,0x18,0x17,0x33,0x30,0x1b,0x2c,0x3a,0x1f,0xfe,0xbd,0xab,0xab,0xab,0x00,0x04,0xff,0xba,0xfd,0xfa,0x04,0xad,0x02,0xdb,0x00,0x4f,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0xa7,0xb1,0x0d,0x3d,0xb8,0x05,0x0e,0xb6,0x55,0x55,0x62,0x63,0x30,0x30,0x24, -0xba,0x05,0x0b,0x00,0x62,0x05,0x0a,0xb2,0x63,0x5d,0x34,0xb8,0x05,0x0d,0xb2,0x4c,0x4c,0x5e,0xb8,0x05,0x0a,0x40,0x09,0x5f,0x63,0x5f,0x63,0x5f,0x67,0x66,0x62,0x5e,0xb8,0x04,0xfb,0xb2,0x64,0x61,0x42,0xb8,0x04,0xfd,0x40,0x0a,0x50,0x4b,0x4b,0x48,0x48,0x2f,0x50,0x01,0x50,0x58,0xb8,0x04,0xfd,0xb5,0x34,0x2f,0x38,0x01,0x38,0x2a, -0xb8,0x05,0x03,0xb7,0x30,0x24,0x21,0x0c,0x20,0x05,0x00,0x12,0xb8,0x04,0xff,0x40,0x09,0x2f,0x19,0x01,0x19,0x33,0x4c,0x4c,0x29,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x39,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x3f,0x2f,0x5d,0x33,0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xfd,0xd6,0x32,0xed,0x32,0x11, -0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x32,0x10,0xfd,0xe4,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02, -0x27,0x06,0x06,0x07,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x16,0x16,0x17,0x35,0x06,0x06,0x23,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xda,0xc7,0xb9,0x5a,0x3a,0x59,0x60,0x76,0x57, -0x4e,0x7e,0x33,0x37,0x84,0x4e,0x4f,0x7a,0x66,0x5c,0x64,0x77,0x4e,0x20,0x1d,0x46,0x2a,0x03,0x14,0x35,0x5c,0x4a,0x14,0x62,0x7c,0x49,0x1e,0x04,0x48,0xad,0x67,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x0d,0x17,0x3e,0x2a,0x51,0xb4,0x64,0x02,0x46,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23, -0x3f,0x35,0x2a,0x0f,0x21,0xaf,0xaf,0x01,0x38,0xaf,0xaf,0x0e,0x34,0x20,0x20,0x33,0x31,0x4f,0x64,0x32,0x05,0x18,0x2f,0x26,0x18,0x14,0x10,0x9d,0x12,0x17,0x1b,0x28,0x2f,0x29,0x1c,0x01,0xbb,0x06,0x22,0x17,0x27,0x36,0x23,0x10,0xa7,0x29,0x45,0x59,0x31,0x2a,0x5a,0x25,0x7a,0x01,0x3c,0x43,0x22,0x39,0x4b,0x29,0x3a,0x40,0x1e,0x05, -0x01,0x03,0x04,0x03,0x62,0x02,0x03,0x02,0xe5,0x17,0x1b,0xb5,0x02,0x0c,0x18,0x17,0x33,0x30,0x1b,0x2c,0x3a,0x1f,0xfe,0xbd,0xab,0xab,0xab,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x07,0x0d,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x51,0x05,0x46,0x03,0x57,0x01,0x07,0x0f,0x57,0x05,0x46,0x04,0xab,0x00,0x0c,0xb5,0x02, -0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x07,0x0d,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x51,0x05,0x46,0x03,0x57,0x01,0x07,0x0f,0x57,0x05,0x46,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x5b,0x01,0x5b,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4, -0x07,0x0d,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xa4,0x03,0x57,0x01,0x07,0x0f,0x57,0x02,0xa4,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x45,0x01,0x45,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x07,0x0d,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xa4,0x03,0x57,0x01,0x07, -0x0f,0x57,0x02,0xa4,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc6,0x07,0x0d,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x9a,0x03,0x57,0x01,0x07,0x0f,0x57,0x00,0x9a,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x1d,0x01,0x1d,0x00,0x11,0x5d, -0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x07,0x0d,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x9a,0x03,0x57,0x01,0x07,0x0f,0x57,0x00,0x9a,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x06,0x8c,0x02,0x26,0x09,0x13,0x00,0x00, -0x00,0x07,0x0f,0x57,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x06,0x8c,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x06,0x13,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad, -0x06,0x13,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x17,0x00,0x00,0x01,0xf2,0x07,0x6e,0x00,0x27,0x09,0x0d,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5e,0x00,0x00,0xff,0xff,0x00,0x17,0xff,0xf2,0x02,0xac,0x07,0x6e,0x00,0x27,0x08,0xc7,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5e,0x00,0x00, -0xff,0xff,0x00,0x16,0x00,0x00,0x01,0xfa,0x07,0x6e,0x00,0x27,0x09,0x0d,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5f,0x00,0x00,0xff,0xff,0x00,0x16,0xff,0xf2,0x02,0xac,0x07,0x6e,0x00,0x27,0x08,0xc7,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5f,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0x8a,0x02,0x26,0x09,0x2a,0x00,0x00, -0x01,0x07,0x0f,0x5e,0x00,0xab,0xfe,0x1c,0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0xdf,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x45,0x01,0x2f,0x45,0x01,0x45,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0xff,0xba, -0xfe,0xa6,0x02,0x4c,0x05,0xf6,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5e,0x00,0xd5,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x1f,0x01,0x1f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xf6,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab, -0x01,0x07,0x0f,0x5e,0x00,0xd5,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x28,0x01,0x28,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0x8a,0x02,0x26,0x09,0x2a,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfe,0x1c,0x00,0x0a,0xb4,0x01,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae, -0x04,0xdf,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x68,0x01,0x2f,0x68,0x01,0x68,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x96,0x05,0xf6,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5f,0x00,0x9c,0xfe,0x88, -0x00,0x0a,0xb4,0x03,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xf6,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5f,0x00,0x9c,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x05,0x91, -0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x01,0x07,0x0f,0x60,0x02,0x01,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xc8,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x43,0x01,0x43,0x00,0x11, -0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x02,0x75,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x0f,0x60,0x00,0x9c,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x33,0x01,0x33,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x0f,0x60,0x00,0x9c,0xf8,0x34,0x00,0x0a, -0xb4,0x01,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x17,0xfd,0xff,0x03,0xf4,0x04,0xc3,0x00,0x27,0x09,0x29,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5e,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x17,0xfd,0xff,0x04,0xad,0x04,0xc3,0x00,0x27,0x0e,0x5e,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5e,0x00,0x00,0xfd,0x55,0xff,0xff, -0x00,0x16,0xfd,0xff,0x03,0xf4,0x04,0xc3,0x00,0x27,0x09,0x29,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5f,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x16,0xfd,0xff,0x04,0xad,0x04,0xc3,0x00,0x27,0x0e,0x5e,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5f,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x6e,0x02,0x26,0x09,0x65, -0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfe,0x00,0x00,0x0e,0xb7,0x01,0x2f,0x2c,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x09,0x66,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff, -0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x6e,0x02,0x26,0x09,0x65,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfe,0x00,0x00,0x0e,0xb7,0x01,0x2f,0x2c,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x09,0x66,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a, -0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0x7e,0xfd,0xfe,0x04,0x2c,0x03,0x54,0x00,0x24,0x00,0x4a,0x00,0x65,0xb9,0x00,0x3e,0x05,0x0b,0xb5,0x31,0x31,0x38,0x24,0x02,0x37,0xb8,0x05,0x0d,0xb4,0x38,0x38,0x4c,0x10,0x21,0xb8,0x05,0x0a,0x40,0x09,0x02,0x2f,0x37,0x01,0x37,0x47,0x25,0x28,0x2e,0xb8,0x04,0xfd, -0x40,0x13,0x41,0x4a,0x4a,0x41,0x41,0x2f,0x25,0x01,0x25,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0x33,0x2f,0x33,0x2f,0x10,0xfd,0xc4,0x11,0x39,0x2f,0x5d,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x11,0x39,0x11,0x39,0x2f,0xed,0x31,0x30,0x01, -0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01, -0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x01,0xd3,0x1e,0x2e,0x0f,0x69,0x06,0x14,0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0xfd, -0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x02,0xd6,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35, -0x1c,0x00,0x00,0x03,0x00,0x7e,0xfd,0xfe,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x32,0x00,0x58,0x00,0x81,0xb5,0x24,0x55,0x33,0x03,0x02,0x25,0xbb,0x05,0x0b,0x00,0x30,0x00,0x4c,0x05,0x0b,0xb2,0x3f,0x3f,0x45,0xb8,0x05,0x0d,0xb7,0x46,0x30,0x46,0x30,0x46,0x5a,0x10,0x21,0xb8,0x05,0x0a,0x40,0x09,0x02,0x2f,0x45,0x01,0x45,0x55,0x33, -0x36,0x3c,0xb8,0x04,0xfd,0x40,0x0a,0x4f,0x58,0x58,0x4f,0x4f,0x2f,0x33,0x01,0x33,0x28,0xba,0x04,0xfb,0x00,0x2a,0x05,0x03,0x40,0x0a,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x3f,0xed,0x2f,0x5d,0x33,0x2f,0x33,0x2f,0x10,0xfd,0xc4,0x11,0x39,0x2f,0x5d, -0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x11,0x17,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36, -0x36,0x07,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8, -0x58,0x5d,0x58,0x02,0x89,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x96,0x1e,0x2e,0x0f,0x69,0x06,0x14,0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d, -0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x03,0x58,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x7a,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35,0x1c,0x00,0xff,0xff,0xff,0xba, -0xfd,0x78,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0x56,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0x56,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x52,0x01,0x52, -0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x50,0x02,0x26,0x09,0x19,0x00,0x00,0x01,0x07,0x0f,0x60,0x05,0x49,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x6a,0x01,0x6a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x50,0x02,0x26,0x0e,0x31,0x00,0x00,0x01,0x07,0x0f,0x60,0x05,0x49,0xfd,0xdd, -0x00,0x0a,0xb4,0x01,0x2f,0x75,0x01,0x75,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x50,0x02,0x26,0x08,0xd4,0x00,0x00,0x01,0x07,0x0f,0x60,0x02,0x9d,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x5f,0x01,0x5f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x50,0x02,0x26,0x0e,0x32,0x00,0x00, -0x01,0x07,0x0f,0x60,0x02,0x9d,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x6a,0x01,0x6a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x04,0xb8,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0a,0x6e,0x05,0x46,0xfc,0xdc,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x04,0xb8,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0a,0x6e, -0x05,0x46,0xfc,0xdc,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x04,0xb8,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0xa4,0xfc,0xdc,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x04,0xb8,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0xa4,0xfc,0xdc,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x06,0xb3,0x02,0x26, -0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x73,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xae,0x06,0xb3,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba, -0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0x00,0x01,0x00,0xa4,0xff,0xfb,0x01,0x5d,0x00,0xb0,0x00,0x03,0x00,0x19,0xbc,0x00,0x00,0x05,0x0a,0x00,0x01,0x00,0x02,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x35,0x33,0x01, -0x5d,0xb9,0xb9,0x05,0xb5,0x00,0x00,0x02,0x00,0x03,0xff,0xfb,0x01,0xfe,0x00,0xb0,0x00,0x03,0x00,0x07,0x00,0x29,0xb9,0x00,0x00,0x05,0x0a,0xb3,0x01,0x01,0x08,0x04,0xb8,0x05,0x0a,0xb2,0x05,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x17, -0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x00,0x02,0x00,0xa4,0xff,0xfb,0x01,0x5d,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x25,0xb1,0x04,0x00,0xb8,0x05,0x0a,0xb2,0x05,0x01,0x07,0xbb,0x05,0x02,0x00,0x04,0x00,0x02,0x05,0x02,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xfd,0xd6,0xed, -0x01,0x2f,0x33,0xed,0x32,0x31,0x30,0x05,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x5d,0xb9,0xb9,0xb9,0xb9,0x05,0xb5,0x63,0xb5,0x00,0x00,0x03,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x41,0xbf,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x00,0x05,0x0a,0xb3,0x01,0x01, -0x0c,0x08,0xb8,0x05,0x02,0xb6,0x0b,0x0b,0x00,0x07,0x06,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xed,0xd4,0xed,0xd6,0xed,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9, -0xa1,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x03,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x37,0xbf,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x00,0x05,0x0a,0xb2,0x01,0x04,0x00,0xb8,0x05,0x02,0xb3,0x06,0x03,0x03,0x0a,0xb8,0x05,0x02,0xb3,0x2f,0x08,0x01, -0x08,0x00,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0xd6,0xed,0xd4,0xed,0x31,0x30,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x01,0x13,0xb5,0xb5,0xb5,0xfe,0x33,0xb5,0x00,0x00,0x03,0xff,0x62,0xff,0xfb,0x02,0x9f,0x00,0xb0,0x00,0x03,0x00,0x07, -0x00,0x0b,0x00,0x35,0xbf,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x00,0x05,0x0a,0xb5,0x01,0x01,0x0c,0x0a,0x06,0x02,0xb8,0x05,0x02,0xb5,0x09,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x32,0xed,0x32,0x32,0x11,0x01,0x33,0x2f,0xed,0xd4,0xed,0xd4,0xed,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35, -0x33,0x05,0x23,0x35,0x33,0x1b,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x3f,0xb1,0x08,0x00,0xb8,0x05,0x0a,0xb5,0x09,0x01,0x01,0x10,0x0c,0x04,0xb8,0x05,0x0a,0xb3,0x0d,0x05,0x0d,0x08,0xb8, -0x05,0x02,0xb4,0x0e,0x0b,0x0b,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x33,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9, -0xfe,0xbe,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x63,0xb5,0xb5,0xb5,0x00,0x02,0xff,0xc6,0x00,0x00,0x02,0x2c,0x02,0x62,0x00,0x19,0x00,0x27,0x00,0x44,0xb2,0x27,0x27,0x06,0xb8,0x05,0x0d,0xb3,0x03,0x03,0x28,0x0f,0xb8,0x05,0x0e,0xb4,0x1f,0x06,0x14,0x05,0x0a,0xb8,0x05,0x01,0xb7,0x22,0x00,0x27,0x1a,0x1a,0x03,0x03, -0x00,0xb8,0x05,0x01,0xb4,0x2f,0x14,0x01,0x14,0x02,0x00,0x3f,0x5d,0xed,0x32,0x2f,0x33,0x11,0x33,0x10,0xd4,0xfd,0xc6,0x12,0x39,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x32,0x2f,0x31,0x30,0x27,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35, -0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x3a,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x72,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04, -0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x00,0x02,0xff,0x97,0x06,0x7d,0x01,0xf0,0x07,0xe8,0x00,0x1b,0x00,0x29,0x00,0x2b,0xbf,0x00,0x0e,0x05,0x0d,0x00,0x21,0x00,0x09,0x04,0xfd,0x00,0x24,0x00,0x1c,0x04,0xfd,0xb3,0x13,0x27,0x13,0x03,0xb8,0x04,0xfd,0xb1,0x18,0x13,0x00,0x2f,0xdc,0xed,0x11,0x39,0x10,0xfd, -0xd6,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x69,0x2f,0x4d,0x27,0x0c,0x15,0x0b,0x24,0x77,0x4d,0x27,0x3c,0x29,0x16,0x21,0x39,0x4b,0x2a,0x20, -0x3e,0x3a,0x38,0x19,0x16,0x39,0x23,0x01,0x57,0x1c,0x2b,0x1e,0x10,0x2c,0x1f,0x27,0x4e,0x20,0x1a,0x37,0x06,0xcd,0x20,0x21,0x02,0x03,0x70,0x6f,0x1b,0x2d,0x3a,0x20,0x29,0x49,0x37,0x20,0x10,0x14,0x10,0x13,0x1b,0x56,0x13,0x1e,0x25,0x13,0x22,0x27,0x46,0x53,0x0a,0x0f,0x00,0x01,0x00,0x00,0x04,0x82,0x03,0x4b,0x07,0x38,0x00,0x03, -0x00,0x11,0xb6,0x03,0x01,0x00,0x2f,0x02,0x01,0x02,0x00,0x2f,0x5d,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x11,0x35,0x01,0x15,0x03,0x4b,0x04,0x82,0x94,0x02,0x22,0x94,0x00,0x00,0x01,0x00,0x89,0xfe,0x0a,0x01,0x93,0xff,0xfa,0x00,0x1c,0x00,0x17,0xb9,0x00,0x03,0x05,0x0b,0xb2,0x17,0x1c,0x12,0xb9,0x04,0xfe,0x00,0x08,0x00,0x2f,0xfd,0xc4, -0x01,0x2f,0xed,0x31,0x30,0x05,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0x5d,0x36,0x3a,0x06,0x0c,0x19,0x0e,0x1b,0x29,0x1b,0x0e,0x0f,0x1d,0x2c,0x1d,0x27,0x39,0x24,0x11,0x14,0x2a,0x44,0x30,0x46,0x17,0x57,0x33,0x17,0x16,0x03,0x05,0x14,0x20, -0x29,0x16,0x16,0x2b,0x21,0x15,0x22,0x3a,0x4c,0x2b,0x2c,0x54,0x49,0x3e,0x16,0x00,0x00,0x02,0x00,0x60,0xfd,0xff,0x01,0xa1,0xff,0x40,0x00,0x0b,0x00,0x17,0x00,0x2d,0xbf,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x06,0x05,0x00,0xb4,0x2f,0x0c,0x01,0x0c,0x12,0xb8,0x05,0x00,0xb3,0x2f,0x00,0x01,0x00,0x00, -0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x02,0x41,0x5e,0x5e,0x41,0x45,0x5d,0x5d,0x45,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0xc0,0x5d,0x45,0x41,0x5e,0x5e,0x41,0x45,0x5d,0xf6, -0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0x01,0x00,0x1e,0x04,0x20,0x02,0x8e,0x04,0x8d,0x00,0x03,0x00,0x10,0xb9,0x00,0x00,0x04,0xfd,0xb3,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x8e,0xfd,0x90,0x02,0x70,0x04,0x20,0x6d,0x00,0x00,0x02,0x00,0x3c,0xfd,0xff,0x01,0xc5,0xff,0x67,0x00,0x03, -0x00,0x07,0x00,0x21,0xbc,0x00,0x04,0x05,0x0b,0x00,0x05,0x00,0x00,0x05,0x0b,0xb2,0x01,0x04,0x00,0xb8,0x04,0xfe,0xb1,0x06,0x03,0x00,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0xb5,0x79,0x79,0x01,0x10,0x79,0x79,0xfd,0xff,0x01,0x68,0xfe,0x98,0x01,0x68,0x00,0x01,0x00,0x17, -0x05,0x44,0x01,0x77,0x07,0x6e,0x00,0x0f,0x00,0x17,0xb9,0x00,0x09,0x05,0x0d,0xb2,0x0a,0x09,0x01,0xb9,0x05,0x01,0x00,0x02,0x00,0x2f,0xed,0x2f,0x01,0x2f,0xed,0x31,0x30,0x13,0x21,0x15,0x23,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x17,0x01,0x60,0xee,0x09,0x0d,0x09,0x04,0x59,0x08,0x0f,0x16,0x07,0x6e,0x66,0x2c,0x4e,0x50, -0x58,0x35,0x6d,0x6a,0x3f,0x6b,0x68,0x6d,0x00,0x01,0x00,0x16,0x05,0x44,0x01,0xfa,0x07,0x6e,0x00,0x33,0x00,0x44,0xb9,0x00,0x31,0x05,0x0d,0xb2,0x2c,0x18,0x1c,0xb8,0x05,0x0d,0xb3,0x07,0x2e,0x1d,0x0a,0xb8,0x05,0x0d,0x40,0x0b,0x04,0x1c,0x18,0x02,0x0f,0x24,0x2f,0x2f,0x07,0x29,0x02,0xb8,0x05,0x01,0xb3,0x0f,0x15,0x15,0x0f,0x00, -0x2f,0x33,0x2f,0x10,0xfd,0x32,0xc6,0x32,0x11,0x33,0x11,0x12,0x39,0x2f,0x01,0x2f,0xed,0x2f,0x39,0x39,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17, -0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x01,0x36,0x13,0x12,0x45,0x08,0x07,0x59,0x10,0x12,0x24,0x34,0x22,0x14,0x2d,0x19,0x0f,0x30,0x14,0x11,0x0f,0x01,0x06,0x06,0x59,0x07,0x0f,0x17,0x10,0x5c,0x09,0x0e,0x06,0x0f,0x0e,0x1f,0x1f,0x0f,0x58,0x0f,0x06,0x06,0xe6,0x04,0x47,0x12,0x24,0x0f,0x29,0x2b,0x20,0x39, -0x2c,0x19,0x0c,0x0e,0x0d,0x0c,0x03,0x01,0x2d,0x5f,0x42,0x6d,0x6a,0x3f,0x6b,0x68,0x6d,0x41,0x26,0x42,0x20,0x04,0x27,0x21,0x23,0x21,0x23,0x28,0x10,0x20,0x00,0x01,0x00,0x30,0x05,0x44,0x01,0xd9,0x07,0x73,0x00,0x25,0x00,0x2b,0xb9,0x00,0x19,0x05,0x0b,0xb2,0x0c,0x0c,0x12,0xb8,0x05,0x0d,0xb6,0x13,0x13,0x22,0x03,0x25,0x25,0x1c, -0xb8,0x05,0x01,0xb1,0x03,0x09,0x00,0x2f,0xc4,0xed,0x32,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01,0xd9,0x1e,0x2e,0x0f,0x69,0x06,0x14, -0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0x07,0x6e,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35,0x1c,0x00,0x00,0x01,0x00,0x9a,0xff,0xd2,0x06,0xae, -0x02,0xbd,0x00,0x42,0x00,0x4c,0xb9,0x00,0x14,0x05,0x0a,0xb2,0x2f,0x2f,0x0f,0xb8,0x05,0x0a,0xb3,0x34,0x34,0x44,0x27,0xbb,0x05,0x0a,0x00,0x20,0x00,0x0c,0x04,0xff,0xb4,0x2f,0x39,0x01,0x39,0x1b,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x2c,0x01,0x2c,0x2f,0x24,0x01,0x24,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d, -0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02, -0x33,0x32,0x16,0x17,0x1e,0x05,0x06,0xae,0x16,0x41,0x63,0x4d,0x3a,0x2f,0x27,0x14,0x1a,0x2b,0x1d,0x1c,0x1f,0x12,0x15,0x12,0x29,0x48,0x60,0x6e,0x76,0x39,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0xa0,0x91,0x10,0x13,0x10,0x21,0x3a,0x4e,0x2c,0x3d,0x65,0x2a,0x12,0x1e,0x21,0x29,0x3a,0x50,0x99,0xa7,0x22, -0x3a,0x4c,0x53,0x55,0x25,0x33,0x2e,0x24,0x17,0x11,0x27,0x2d,0x36,0x20,0x2e,0x4a,0x39,0x28,0x1b,0x0c,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x41,0x38,0x14,0x29,0x2b,0x31,0x1d,0x27,0x45,0x33,0x1e,0x41,0x4d,0x20,0x49,0x47,0x41,0x32,0x1d,0x00,0xff,0xff,0xff,0xa2,0x00,0x26,0x02,0xd4,0x06,0xbf, -0x02,0x26,0x0f,0x65,0x00,0x00,0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0x00,0x26,0x02,0xd4,0x07,0x78,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff,0x00,0x72,0xfd,0xfe,0x02,0xd4,0x05,0x58,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06, -0x09,0x7f,0x72,0x00,0x00,0x01,0x00,0x72,0x00,0x26,0x02,0xd4,0x05,0x58,0x00,0x03,0x00,0x0c,0xb4,0x02,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x25,0x01,0x33,0x01,0x02,0x32,0xfe,0x40,0xa6,0x01,0xbc,0x26,0x05,0x32,0xfa,0xce,0xff,0xff,0xff,0x97,0x00,0x26,0x02,0xd4,0x07,0x77,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06, -0x0f,0x58,0x00,0x8f,0xff,0xff,0xff,0xc2,0x00,0x26,0x02,0xd4,0x07,0x77,0x02,0x26,0x0f,0x65,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x01,0x20,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x34,0xfd,0xfe,0x02,0xd4,0x05,0x58,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff, -0x00,0x3a,0x00,0x26,0x02,0xf8,0x05,0xe9,0x02,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x17,0x00,0x26,0x03,0x7f,0x06,0xf6,0x00,0x27,0x0f,0x65,0x00,0xab,0x00,0x00,0x01,0x06,0x0f,0x5e,0x00,0x88,0x00,0x0a,0xb4,0x01,0x2f,0x04,0x01,0x04,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x16,0x00,0x26, -0x03,0x7f,0x06,0xf6,0x00,0x27,0x0f,0x65,0x00,0xab,0x00,0x00,0x01,0x06,0x0f,0x5f,0x00,0x88,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0x00,0x01,0xff,0xc8,0xff,0xf2,0x05,0x49,0x03,0x0f,0x00,0x37,0x00,0x4b,0xb9,0x00,0x1a,0x05,0x0a,0xb2,0x17,0x23,0x0d,0xbb,0x05,0x0a,0x00,0x0a,0x00,0x00,0x05,0x0a,0xb3,0x30, -0x30,0x30,0x33,0xb8,0x04,0xff,0xb6,0x2f,0x34,0x01,0x34,0x23,0x12,0x05,0xbc,0x04,0xfb,0x00,0x28,0x05,0x03,0x00,0x1f,0x05,0x03,0xb4,0x18,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xc6,0x3f,0x3f,0xed,0x32,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xed,0xd4,0xed,0x39,0xd4,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35, -0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x35,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x01,0x47,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x39,0x5d,0x77,0x3f,0x5b,0x84,0x24, -0x04,0x1a,0x42,0x47,0x48,0x21,0x46,0x65,0x47,0x2c,0x18,0x09,0x3a,0x70,0x39,0x17,0x57,0xb6,0x5b,0x01,0x95,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x37,0x6c,0x85,0x4a,0x19,0x36,0x45,0x23,0x2f,0x1d,0x0c,0x21,0x37,0x48,0x4e,0x50,0x23,0x13,0x05,0x03,0x9c, -0x09,0x08,0x00,0x01,0xff,0xc8,0xff,0xf2,0x06,0x03,0x03,0x0f,0x00,0x44,0x00,0x5c,0xb1,0x35,0x2a,0xb8,0x05,0x0a,0xb2,0x27,0x40,0x1d,0x41,0x09,0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x00,0x08,0x00,0x3a,0x05,0x03,0x00,0x30,0x05,0x03,0xb7,0x28,0x2f,0x1b,0x01,0x1b,0x08,0x08,0x0b,0xb8,0x04,0xff,0x40,0x0b,0x2f,0x0c,0x01,0x0c, -0x40,0x35,0x00,0x2f,0x22,0x22,0x15,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x11,0x39,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x2f,0x5d,0xc6,0x3f,0x3f,0x01,0x2f,0xed,0xd4,0xed,0x39,0xd4,0xed,0x39,0x31,0x30,0x05,0x22,0x2e,0x04,0x35,0x35,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e, -0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x01,0xea,0x46,0x65,0x47,0x2c,0x18,0x09,0x3a,0x70,0x39,0x17,0x57,0xb6,0x5b,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x3e, -0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x0e,0x21,0x37,0x48,0x4e,0x50,0x23,0x13,0x05,0x03,0x9c,0x09,0x08,0x64,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc, -0xfe,0x8f,0x43,0x62,0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x00,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07, -0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x05,0x49,0x04,0x07,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0x03,0x04,0x07,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf9,0x03,0x57,0x00,0x07, -0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x05,0x49,0x03,0x0f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x06,0x03,0x03,0x0f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x05,0x49,0x05,0x1f, -0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0xf9,0xfd,0xce,0x00,0x07,0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x05,0x49,0x05,0x1f, -0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f, -0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0xf9,0x03,0x57,0xff,0xff, -0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x07,0x0d,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x51,0x01,0xf9,0x03,0x57,0x01,0x07,0x0f,0x57,0x01,0xf9,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x3d,0x01,0x3d,0x00, -0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x07,0x0d,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x57,0x01,0xf9,0x04,0xab,0x01,0x07,0x0f,0x51,0x01,0xf9,0x03,0x57,0x00,0x0c,0xb5,0x04,0x03,0x20,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x50,0x02,0x26,0x0f,0x6c, -0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xf2,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x54,0x01,0x54,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x50,0x02,0x26,0x0f,0x6d,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xf2,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x54,0x01,0x54,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2, -0x05,0x49,0x04,0xb8,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0xf9,0xfc,0xdc,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x04,0xb8,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0xf9,0xfc,0xdc,0x00,0x02,0xff,0xc8,0xff,0xea,0x06,0xa0,0x03,0x3c,0x00,0x30,0x00,0x42,0x00,0x44,0xb9,0x00,0x0c,0x05,0x0a,0xb7, -0x36,0x36,0x44,0x40,0x00,0x20,0x20,0x23,0xb8,0x04,0xff,0x40,0x09,0x2f,0x24,0x01,0x24,0x40,0x40,0x31,0x31,0x00,0xbc,0x04,0xfb,0x00,0x13,0x05,0x03,0x00,0x3b,0x04,0xfb,0xb3,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xcd,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x3e, -0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x2e,0x03,0x27,0x26,0x26,0x27,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x01,0xd4,0x18,0x4c,0x67,0x81,0x9a,0xb3,0x66,0x79,0xae,0x70,0x36,0x2d,0x52,0x71, -0x88,0x9a,0x52,0xb3,0xff,0x00,0xaf,0x68,0x1c,0x2e,0x3b,0x24,0x13,0x07,0x05,0x04,0x04,0x3c,0x68,0x36,0x17,0x42,0xae,0x5b,0x06,0x09,0x07,0x06,0x04,0x03,0x0d,0x1e,0x33,0x02,0xa7,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x9b,0x41,0x96,0x95,0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55, -0x2f,0x16,0x05,0x01,0x06,0x0d,0x0c,0x14,0x35,0x3f,0x47,0x27,0x1a,0x31,0x1c,0x03,0x04,0x9c,0x06,0x07,0x21,0x3a,0x37,0x37,0x1e,0x1a,0x2c,0x20,0x13,0x0a,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0x02,0xff,0xc8,0xff,0xea,0x07,0x59,0x03,0x3c,0x00,0x39,0x00,0x4b,0x00,0x50,0xb9,0x00,0x05,0x05, -0x0a,0x40,0x09,0x47,0x47,0x0b,0x3f,0x33,0x0b,0x22,0x22,0x25,0xb8,0x04,0xff,0xb4,0x2f,0x26,0x01,0x26,0x15,0xb8,0x05,0x03,0xb6,0x42,0x3f,0x3f,0x33,0x33,0x10,0x0a,0xbc,0x04,0xfb,0x00,0x0b,0x05,0x03,0x00,0x3a,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x2f,0x33,0x3f,0x2f,0x5d,0xed, -0x32,0x2f,0x01,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x2e,0x03,0x27,0x26,0x26,0x27,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x17,0x3e,0x05,0x17,0x22,0x0e,0x02,0x07,0x16,0x16,0x33,0x32, -0x3e,0x02,0x35,0x34,0x2e,0x02,0x04,0xd3,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54,0xb3,0xff,0x00,0xaf,0x68,0x1c,0x2e,0x3b,0x24,0x13,0x07,0x05,0x04,0x04,0x3c,0x68,0x36,0x17,0x42,0xae,0x5b,0x06,0x09,0x07,0x06,0x04,0x03,0x0d,0x1e,0x33,0x29,0x18,0x4c,0x67,0x81,0x9a, -0xb3,0x4c,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x9d,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x03,0x3c,0x49,0x7d,0xa4,0x5b,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x01,0x06,0x0d,0x0c,0x14,0x35,0x3f,0x47,0x27,0x1a,0x31,0x1c,0x03,0x04,0x9c,0x06,0x07,0x21,0x3a,0x37,0x37,0x1e,0x1a,0x2c,0x20,0x13,0x02,0x41,0x96,0x95, -0x8b,0x6a,0x40,0xa9,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0xff,0xff,0xff,0xc8,0xff,0xea,0x06,0xa0,0x04,0xb2,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xff,0xea,0x07,0x59,0x04,0xb2,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73, -0x04,0x02,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0xa0,0x03,0x3c,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xdb,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x07,0x59,0x03,0x3c,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xdb,0xfe,0xab,0xff,0xff,0xff,0xc8,0xff,0xea,0x06,0xa0,0x05,0xca,0x02,0x26,0x0f,0x82, -0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0xa0,0x04,0xb2,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x73,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xe5, -0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x07,0x59,0x04,0xb2,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x73,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xe5,0xfe,0xab,0x00,0x01,0xfd,0xa6,0xff,0xea,0x01,0x47,0x05,0xec,0x00,0x15,0x00,0x1a,0xbf,0x00,0x0b,0x05,0x0a,0x00,0x08,0x00,0x03,0x04,0xfb,0x00,0x12,0x05,0x03,0x00, -0x0a,0x00,0x2f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0xfd,0xa6,0x7f,0xe1,0x6d,0x4f,0x75,0x4e,0x26,0x9c,0x23,0x3f,0x5a,0x6e,0x81,0x46,0x61,0xcb,0x64,0xa8,0x0f,0x09,0x06,0x25,0x4f,0x49,0x04,0x99,0xfb,0x60,0x56,0x77,0x4f,0x2c,0x15,0x05, -0x0a,0x0e,0x00,0x01,0xfd,0xa6,0xff,0xea,0x02,0x01,0x05,0xec,0x00,0x1e,0x00,0x29,0xb1,0x16,0x0b,0xb8,0x05,0x0a,0xb5,0x08,0x16,0x1b,0x10,0x10,0x03,0xbd,0x04,0xfb,0x00,0x1b,0x05,0x03,0x00,0x11,0x05,0x03,0x00,0x0a,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x25,0x16,0x16,0x33,0x32,0x3e,0x02, -0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0xfd,0xa6,0x7f,0xe1,0x6d,0x4f,0x75,0x4e,0x26,0x9c,0x0f,0x2a,0x48,0x39,0x16,0x5a,0x6d,0x1e,0x04,0x1d,0x56,0x6d,0x82,0x4a,0x61,0xcb,0x64,0xa8,0x0f,0x09,0x06,0x25,0x4f,0x49,0x04,0x99,0xfb,0xac,0x47,0x62,0x3c,0x1a,0xa7,0x3b, -0x3c,0x2d,0x33,0x19,0x06,0x0a,0x0e,0x00,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x1a,0x08,0x0e,0x02,0x26,0x0f,0x8c,0x00,0x00,0x00,0x06,0x0a,0x6d,0xf2,0x32,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x1a,0x08,0x0e,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x06,0x0a,0x6d,0xf2,0x32,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0x4f,0x07,0x67,0x02,0x26, -0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x50,0xff,0xf2,0x06,0xb7,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x01,0x07,0x67,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x50,0xff,0xf2,0x06,0xb7,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0xf0,0x08,0x7f,0x02,0x26,0x0f,0x8c,0x00,0x00,0x01,0x07,0x0f,0x53,0xff,0xf2,0x06,0xb7,0x00,0x0e,0xb6,0x03, -0x02,0x01,0x20,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x01,0x08,0x7f,0x02,0x26,0x0f,0x8d,0x00,0x00,0x01,0x07,0x0f,0x53,0xff,0xf2,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x29,0x01,0x29,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xfd,0xa6,0xfd,0xc9,0x01,0xf0,0x05,0xec,0x02,0x26, -0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x54,0xff,0xf2,0xfd,0xce,0xff,0xff,0xfd,0xa6,0xfd,0xc9,0x02,0x01,0x05,0xec,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x54,0xff,0xf2,0xfd,0xce,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0xfb,0x05,0xec,0x02,0x26,0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x5c,0xff,0x6d,0x00,0x00,0xff,0xff,0xfd,0xa6, -0xff,0xea,0x02,0x01,0x05,0xec,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x5c,0xff,0x6d,0x00,0x00,0x00,0x01,0x00,0x39,0xfd,0xff,0x03,0x72,0x02,0x0a,0x00,0x22,0x00,0x2c,0xbc,0x00,0x0b,0x05,0x0a,0x00,0x1b,0x00,0x16,0x04,0xfb,0x40,0x09,0x1f,0x10,0x2f,0x10,0x02,0x10,0x08,0x08,0x06,0xb8,0x04,0xff,0xb3,0x2f,0x00,0x01,0x00, -0x00,0x2f,0x5d,0xed,0x32,0x2f,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x3e,0x03,0x03,0x35,0x1d,0x20,0x28,0x2c,0x3c,0x30,0x11,0x14,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0x7c,0x59, -0x55,0x74,0x45,0x1e,0x2d,0x20,0x2a,0x5b,0x57,0x4e,0x02,0x0a,0x2f,0x1d,0x1e,0x32,0x03,0x52,0x9c,0x46,0x8a,0xd4,0x90,0x4a,0x16,0x17,0xa5,0x27,0x3d,0x6c,0x92,0x56,0x76,0xda,0x67,0x06,0x09,0x06,0x03,0x00,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0c,0x03,0x57, -0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0xb9,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xaf,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0a,0x6d,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00, -0x00,0x07,0x0f,0x5b,0x01,0xc9,0x00,0x00,0xff,0xff,0x00,0x39,0xfd,0xfb,0x03,0x88,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x2b,0xfe,0x00,0xff,0xff,0x00,0x39,0xfd,0xe1,0x04,0x6a,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x42,0xf7,0x65,0x00,0x0a,0xb4,0x01,0x2f,0x27,0x01,0x27, -0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x39,0xfd,0xfb,0x03,0x88,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x2b,0xfe,0x00,0x00,0x07,0x0f,0x50,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39, -0xfd,0xff,0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xaf,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x87,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x5c, -0x00,0xf9,0xfc,0x4f,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xbc,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x07,0x0d,0x02,0x26, -0x0f,0x98,0x00,0x00,0x00,0x27,0x0f,0x51,0x01,0x0c,0x03,0x57,0x01,0x07,0x0f,0x57,0x01,0x0c,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x82,0xff,0x02,0x05,0x74,0x04,0x21,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x39,0xfc,0x38,0x00,0x0a,0xb4,0x01,0x2f,0x4d, -0x01,0x4d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0x2c,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x01,0xfc,0x50,0x00,0x0a,0xb4,0x01,0x2f,0x3d,0x01,0x3d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x03,0xb9,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xdc, -0x03,0x09,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xd1,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xdc,0x03,0x09,0x00,0x01,0x00,0x9a,0xff,0x02,0x05,0x74,0x02,0x0a,0x00,0x36,0x00,0x41,0xb9,0x00,0x0a,0x05,0x0a,0xb2,0x25,0x25,0x05,0xb8,0x05,0x0a,0xb3,0x2c,0x2c,0x38,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x00, -0x04,0xff,0xb4,0x2f,0x31,0x01,0x31,0x11,0xb8,0x04,0xfb,0xb7,0x2f,0x22,0x01,0x22,0x2f,0x1a,0x01,0x1a,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06, -0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x20,0x3b,0x43,0x21,0x08,0x22,0x29,0x22,0x2e,0x51,0x6e,0x7d,0x88,0x43,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x20,0x5b,0xa2,0x83,0xbc,0xb9,0x10,0x18,0x1b,0x18,0x10,0x29,0x54,0x81,0x58,0x1d,0x20,0x28,0x01, -0x6e,0x13,0x1b,0x1e,0x0b,0x22,0x2a,0x2c,0x3b,0x33,0x39,0x5a,0x43,0x2f,0x1d,0x0d,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6e,0x40,0x4a,0x7c,0x5b,0x33,0x48,0x3d,0x13,0x1d,0x1b,0x1e,0x26,0x33,0x23,0x37,0x5b,0x40,0x23,0x2f,0x1d,0x1e,0x32,0x00,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x05,0x74,0x02,0x0a,0x02,0x26,0x0f,0xab,0x00,0x00, -0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0xdd,0x05,0x3e,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x09,0x7e,0x04,0x3b,0xfd,0x55,0x00,0x01,0x00,0x1e,0xff,0x02,0x06,0x1f,0x02,0x0a,0x00,0x38,0x00,0x58,0xb9,0x00,0x1d,0x05,0x0a,0xb5,0x2d,0x2d,0x16,0x0b,0x05,0x32,0xb8,0x05,0x0a,0xb3,0x16,0x16, -0x3a,0x0e,0xb8,0x05,0x0a,0x40,0x0d,0x05,0x08,0x08,0x05,0x09,0x0a,0x0a,0x0b,0x0b,0x22,0x08,0x08,0x28,0xb8,0x04,0xff,0xb4,0x2f,0x22,0x01,0x22,0x00,0xb8,0x04,0xfb,0xb3,0x2f,0x13,0x01,0x13,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x11,0x39, -0x11,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x03,0x5c,0x98,0xcc,0x7d,0x35,0x04,0x04,0xfe,0xd0,0x01,0xe3, -0x0e,0x12,0x24,0x5d,0xa2,0x7e,0xbc,0xb9,0x10,0x18,0x1b,0x18,0x10,0x29,0x54,0x81,0x58,0x1d,0x20,0x28,0x2c,0x3b,0x43,0x21,0x08,0x22,0x29,0x22,0x2e,0x51,0x6e,0x7d,0x88,0xfe,0x4b,0x81,0xad,0x63,0x1f,0x49,0x23,0x39,0x72,0x5f,0x49,0x79,0x3f,0x4d,0x7d,0x5a,0x31,0x48,0x3d,0x13,0x1d,0x1b,0x1e,0x26,0x33,0x23,0x37,0x5b,0x40,0x23, -0x2f,0x1d,0x1e,0x32,0x13,0x1b,0x1e,0x0b,0x22,0x2a,0x2c,0x3b,0x33,0x39,0x5a,0x43,0x2f,0x1d,0x0d,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0x2c,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfc,0x50,0xff,0xff,0x00,0x9a,0xfd,0xc4,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00,0x00,0x07,0x0f,0x54, -0x01,0xc8,0xfd,0xc9,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xdf,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x37,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xdf,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0f,0x5f, -0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x37,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xc8,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x9a,0xff,0xd2,0x05,0x74, -0x02,0xbd,0x00,0x32,0x00,0x41,0xb9,0x00,0x0a,0x05,0x0a,0xb2,0x25,0x25,0x05,0xb8,0x05,0x0a,0xb3,0x2a,0x2a,0x34,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x00,0x04,0xff,0xb4,0x2f,0x2d,0x01,0x2d,0x11,0xb8,0x04,0xfb,0xb7,0x2f,0x22,0x01,0x22,0x2f,0x1a,0x01,0x1a,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39, -0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x20,0x38,0x40,0x1f,0x07,0x0c,0x0f,0x0d,0x29,0x47,0x60,0x70,0x7b, -0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x20,0x5b,0xa2,0x83,0xa9,0x96,0x0e,0x12,0x0e,0xae,0xa1,0x1d,0x20,0x28,0x01,0x6e,0x0a,0x10,0x12,0x07,0x0c,0x15,0x19,0x20,0x17,0x2d,0x48,0x37,0x27,0x19,0x0c,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6e,0x40,0x4a,0x7c,0x5b,0x33,0x30,0x29,0x0e,0x1a,0x1c,0x21,0x17,0x59,0x61, -0x2f,0x1d,0x1e,0x32,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32, -0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x21,0x04,0xad,0xfd,0xf2,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27,0x02,0x09,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10, -0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f, -0xed,0x31,0x30,0x05,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x21,0x06,0xae,0xfb,0xf1,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27, -0x04,0x0a,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x3d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5, -0x03,0x3d,0x02,0x26,0x0f,0xb6,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26, -0x0f,0xb6,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72, -0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb6,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x02,0x0a,0x02,0x06,0x0f,0xab,0x00,0x00,0xff,0xff,0x00,0x9a,0xfd,0xc4,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00, -0x00,0x07,0x0f,0x52,0x01,0xc8,0xfd,0xc9,0xff,0xff,0x00,0x9a,0xfe,0x0e,0x05,0x74,0x02,0x0a,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x0f,0x00,0x01,0xff,0xf1,0xff,0xf2,0x01,0x47,0x05,0x7e,0x00,0x0d,0x00,0x1a,0xbf,0x00,0x08,0x05,0x0a,0x00,0x05,0x00,0x00,0x04,0xfb,0x00,0x0d,0x05,0x03,0x00,0x07,0x00, -0x2f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x27,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x09,0x25,0x42,0x31,0x1c,0x9c,0x3c,0x61,0x7b,0x3e,0x99,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfb,0xce,0x65,0x86,0x4f,0x20,0x00,0x00,0x01,0xff,0xea,0xff,0xf2,0x02,0x24,0x04,0xe8,0x00,0x1c,0x00,0x22,0xb9,0x00,0x00,0x05,0x0a,0xb5, -0x1a,0x10,0x0d,0x1c,0x15,0x05,0xbb,0x04,0xfb,0x00,0x14,0x00,0x0d,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x2f,0x12,0x39,0x01,0x2f,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x47,0x0c,0x26,0x46,0x39,0x16,0x16,0x06,0x0d, -0x13,0x0c,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x0a,0x1c,0x41,0x36,0x24,0x9c,0x01,0x8c,0x3b,0x5a,0x3e,0x20,0x31,0x1f,0x10,0x1f,0x19,0x0f,0x40,0x3b,0x3f,0x3c,0xa7,0x13,0x2c,0x47,0x34,0x03,0x95,0x00,0x02,0x00,0xa1,0xff,0xf2,0x04,0x25,0x03,0xd7,0x00,0x21,0x00,0x2f,0x00,0x48,0xb9,0x00,0x15,0x05,0x0a,0xb5,0x12,0x05,0x2a,0x2a, -0x31,0x22,0xbb,0x05,0x0a,0x00,0x0d,0x00,0x2b,0x04,0xfc,0xb2,0x12,0x14,0x2a,0xb8,0x04,0xfc,0x40,0x0a,0x15,0x14,0x05,0x05,0x00,0x2f,0x14,0x01,0x14,0x1a,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xdd,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x31,0x30,0x05,0x22, -0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x03,0xec,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x17,0x18,0x07, -0x0e,0x16,0xfd,0x3d,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x0e,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x31,0x1e,0x10,0x20,0x19,0x0f,0x01,0xea,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0xff,0xff,0x00,0x39,0xfd,0xff, -0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0c,0x03,0x57,0x00,0x01,0x00,0x64,0x00,0x00,0x04,0x77,0x05,0xb2,0x00,0x23,0x00,0x65,0x40,0x38,0x82,0x16,0x01,0x76,0x0a,0x01,0x63,0x09,0x01,0x6a,0x07,0x7a,0x07,0x02,0x1a,0x1d,0x1f,0x18,0x1b,0x7e,0x01,0x00,0x03,0x22,0x05,0x01,0x01,0x25,0x0e,0x0c, -0x7e,0x0f,0x11,0x0e,0x0f,0x1f,0x22,0x91,0x01,0x1c,0x02,0x05,0x18,0x91,0x1b,0x02,0x0f,0x02,0x0f,0x02,0x20,0x12,0x08,0x91,0x15,0x04,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x10,0xc4,0xfd,0xc4,0x10,0xdd,0xc4,0xfd,0xc4,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xc4,0xc4,0xde,0xc4,0x10,0xfd,0xc4,0xc4,0xde,0xc4,0x31, -0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x33,0x35,0x23,0x35,0x33,0x35,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x02,0x52,0xbe,0xbe,0xbe,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0xbf,0xbf,0xbf,0xbf,0xa8, -0xbe,0x02,0x33,0x6e,0x84,0xbb,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xc1,0x84,0x6e,0x84,0xfe,0x51,0x01,0xaf,0x00,0x00,0x01,0x00,0x65,0xff,0xe8,0x04,0xb6,0x05,0xb2,0x00,0x31,0x00,0xed,0x40,0xa0,0x6a,0x31,0x7a,0x31,0x8a,0x31,0x03,0x7a,0x30,0x01,0x68,0x30,0x01,0x08,0x2c,0x01,0x8c,0x2b, -0x01,0x6b,0x2b,0x7b,0x2b,0x02,0x56,0x24,0x01,0x56,0x23,0x01,0x37,0x23,0x01,0x57,0x20,0x01,0x88,0x19,0x01,0x49,0x19,0x01,0x8b,0x18,0x01,0x4a,0x18,0x01,0x86,0x17,0x01,0x77,0x17,0x01,0x83,0x16,0x93,0x16,0x02,0x61,0x16,0x71,0x16,0x02,0x07,0x16,0x01,0x85,0x13,0x95,0x13,0x02,0x76,0x13,0x01,0x07,0x13,0x01,0x95,0x12,0x01,0x86, -0x12,0x01,0x65,0x12,0x75,0x12,0x02,0x76,0x01,0x01,0x65,0x01,0x01,0x28,0x2a,0x7d,0x27,0x25,0x25,0x08,0x1b,0x1f,0x17,0x7d,0x04,0x00,0x00,0x08,0x01,0x08,0x08,0x33,0x1f,0x7d,0x00,0x0e,0x0c,0x7d,0x0f,0x11,0x11,0x0f,0x00,0x01,0x00,0x00,0x28,0x10,0x28,0x02,0x28,0x28,0x1b,0x21,0x0f,0x0f,0x04,0x0a,0x25,0x04,0x01,0x04,0x15,0x21, -0x91,0x3a,0x1b,0x01,0x29,0x1b,0x01,0x1b,0x2e,0x13,0x0a,0x91,0x15,0x04,0x00,0x3f,0xed,0x3f,0x39,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x5d,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0xed,0x11,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x21,0x20,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x10,0x21,0x32,0x37,0x36,0x35,0x34, -0x27,0x33,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x65,0xa9,0x73,0xee,0xaa,0x48,0x80,0xfe,0xb8,0xfe,0xbe,0x08,0xae,0x0a,0xa1,0x84,0xcb,0x01,0xfa,0xaf,0x70,0xf5,0xa5,0x49,0x7a,0x01,0x71,0x9c,0x62,0x81,0x12,0xb4,0x0f,0xb3,0x93,0xe8,0xec,0x8c,0xab,0x01,0x85,0xcc,0x6b,0x48,0x2b,0x1e,0x26,0x42,0x85,0xe0,0xd2,0x2b,0x45, -0x4b,0x25,0xbd,0x5f,0x4e,0xfe,0x88,0xcc,0x68,0x43,0x2e,0x1f,0x28,0x44,0x85,0xfe,0xfa,0x32,0x42,0x8e,0x42,0x43,0x40,0x43,0xd9,0x6b,0x57,0x56,0x6a,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x09,0x00,0x95,0x40,0x0d,0x7c,0x06,0x01,0x74,0x01,0x01,0x01,0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xe0,0x40,0x29, -0x0b,0x0d,0x01,0x4c,0x15,0x00,0x25,0x00,0x02,0x03,0x00,0x01,0xe3,0x00,0xf3,0x00,0x02,0x1a,0x05,0x2a,0x05,0x02,0x0c,0x05,0x01,0xec,0x05,0xfc,0x05,0x02,0x05,0x01,0x91,0x04,0x12,0x00,0x07,0x91,0x08,0x03,0x06,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01, -0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x5d,0x71,0x71,0x5d,0x71,0x71,0x01,0x2b,0x2b,0x5d, -0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xb8,0x03,0x34,0xfb,0xd1,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x26,0x98,0x2f,0x04,0xd3,0x98,0x00,0x01,0x00,0x5f,0xff,0xe8,0x03,0xf0,0x06,0x02,0x00,0x2f,0x00,0xc5,0x40,0x82,0x7a,0x2f,0x01,0x79,0x2e,0x01,0x08,0x2e,0x18,0x2e,0x02,0x86,0x27,0x01, -0x24,0x27,0x01,0x26,0x26,0x46,0x26,0x02,0x85,0x23,0x01,0x56,0x23,0x01,0x79,0x21,0x01,0x79,0x1e,0x01,0x87,0x1a,0x97,0x1a,0x02,0x96,0x19,0x01,0x85,0x19,0x01,0x07,0x19,0x01,0x95,0x15,0x01,0x06,0x15,0x86,0x15,0x02,0x86,0x14,0x01,0x79,0x12,0x01,0x3b,0x12,0x01,0x38,0x11,0x01,0x9a,0x0e,0x01,0x65,0x0b,0x01,0x57,0x0b,0x01,0x57, -0x07,0x67,0x07,0x02,0x25,0x22,0x28,0x83,0x10,0x0d,0x0d,0x13,0x31,0x1b,0x84,0x1c,0x22,0x83,0x13,0x05,0x84,0x00,0x00,0x13,0x03,0x02,0x02,0x09,0x10,0x98,0x10,0x01,0x6a,0x10,0x01,0x10,0x20,0x2c,0x1b,0x1b,0x25,0x20,0x25,0x17,0x09,0x95,0x2c,0x16,0x20,0x95,0x17,0x01,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11, -0x12,0x39,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x2f,0xed,0x11,0x12,0x39,0x2f,0x39,0xed,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32, -0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x23,0x34,0x27,0x26,0x23,0x20,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x5f,0x28,0x9a,0x1c,0x55,0x4e,0x68,0x88,0x55,0x5b,0xbc,0xae,0xae,0xbc,0x7c,0x77,0xba,0xab,0x73,0x7f,0xa6,0x4b,0x44,0x68,0xfe,0xfb,0xbc, -0xae,0xae,0xbc,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x01,0x5c,0x5e,0x51,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x50,0x95,0xaa,0x57,0x4b,0x4b,0x72,0xe5,0xae,0x63,0x60,0x57,0x61,0xa8,0x68,0x39,0x34,0xfb,0x8a,0x58,0x4e,0x4d,0x76,0xd7,0xdc,0x7b,0x73,0x61,0x6a,0x00,0x00,0x02,0x00,0x0a,0xff,0xe8,0x04,0x52,0x04,0x54,0x00,0x35,0x00,0x49, -0x00,0x8c,0x40,0x5b,0x49,0x47,0x59,0x47,0x69,0x47,0x03,0x65,0x43,0x01,0x46,0x43,0x56,0x43,0x02,0x64,0x3d,0x01,0x9c,0x09,0x01,0x7a,0x08,0x01,0x8f,0x0a,0x9f,0x0a,0x02,0x7e,0x0a,0x01,0x6f,0x0a,0x01,0x87,0x3b,0x01,0x92,0x2c,0x01,0x81,0x2c,0x01,0x63,0x2c,0x73,0x2c,0x02,0x2c,0x1b,0x3b,0x0a,0x04,0x05,0x24,0x24,0x31,0x83,0x30, -0x36,0x01,0x36,0x36,0x4b,0x40,0x83,0x05,0x12,0x12,0x05,0x13,0x18,0x95,0x12,0x0a,0x0d,0x0d,0x3b,0x2c,0x24,0x29,0x95,0x23,0x1b,0x1e,0x10,0x45,0x95,0x00,0x16,0x00,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x32,0x32,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x17,0x39,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x13, -0x34,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x4c,0x6c,0xad,0x7b,0x42,0x22,0x4f,0x81,0x5f,0x30,0x69,0x3b,0x33,0x55,0x1f,0x24,0x1e,0x1b,0x22,0x1d,0x51,0x33,0x89,0xda,0x57,0x34,0x72,0x40,0x30,0x4b,0x1a,0x1f,0x16,0x1a,0x21,0x1c,0x4e,0x30,0x0c,0x16,0x0b,0x39,0x50,0x32,0x17,0x42,0x7b,0xad,0xc2, -0x1d,0x3d,0x5d,0x3f,0x59,0x86,0x5a,0x2d,0x26,0x4b,0x72,0x4b,0x4b,0x72,0x4b,0x26,0x18,0x40,0x7a,0xae,0x6e,0x33,0x84,0x89,0x81,0x30,0x0d,0x0e,0x09,0x05,0x06,0x07,0x97,0x03,0x04,0x02,0x05,0x31,0x2a,0x0b,0x0b,0x03,0x02,0x03,0x02,0x92,0x05,0x04,0x03,0x06,0x01,0x01,0x35,0x77,0x77,0x72,0x30,0x6e,0xae,0x7a,0x40,0x01,0xd6,0x32, -0x70,0x6e,0x66,0x29,0x1e,0x61,0x72,0x78,0x36,0x4c,0x7b,0x56,0x2f,0x2f,0x56,0x7b,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x83,0x40,0x1f,0x19,0x40,0x0b,0x02,0x4d,0x12,0x95,0x00,0x16,0x0c,0x95,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83, -0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x20,0x15,0x30,0x15,0x02,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b, -0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1, -0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x01,0xff,0xe6,0xfe,0x1e,0x04,0x10,0x04,0x18,0x00,0x3f,0x00,0x91,0x40,0x58,0x75,0x35,0x85,0x35,0x02,0x09,0x2d,0x01, -0x05,0x28,0x15,0x28,0x02,0x6a,0x1d,0x01,0x99,0x0a,0x01,0x99,0x05,0x01,0x00,0x02,0x83,0x3f,0x3d,0x3d,0x17,0x30,0x2f,0x33,0x2a,0x83,0x11,0x12,0x0c,0x17,0x17,0x41,0x33,0x83,0x0c,0x1f,0x84,0x20,0x20,0x0c,0x3f,0x00,0x00,0x30,0x38,0x09,0x2f,0x49,0x2f,0x59,0x2f,0x03,0x7a,0x30,0x01,0x28,0x30,0x01,0x2f,0x30,0x07,0x20,0x20,0x12, -0x1a,0x95,0x16,0x12,0x01,0x35,0x11,0x01,0x12,0x11,0x25,0x10,0x38,0x95,0x07,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x39,0x5d,0x5d,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30, -0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x25,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x05,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x03,0x70,0x0d,0x53,0x8c, -0xb9,0x66,0x51,0x94,0x71,0x43,0x25,0x45,0x64,0x3f,0x01,0x7d,0x43,0x5c,0x3a,0x1a,0x6c,0x6d,0x32,0x5c,0x4e,0x3a,0x0f,0xa6,0x12,0x5b,0x80,0x9d,0x54,0x4b,0x87,0x65,0x3c,0x27,0x46,0x63,0x3d,0xfe,0x85,0x80,0x79,0x28,0x45,0x5e,0x36,0x3d,0x75,0x5b,0x37,0x09,0x41,0x2a,0x30,0x66,0xa9,0x78,0x42,0x32,0x5b,0x83,0x51,0x45,0x80,0x6d, -0x56,0x1a,0x9b,0x1b,0x3e,0x49,0x54,0x31,0x4d,0x5d,0x1b,0x36,0x50,0x34,0x56,0x84,0x59,0x2d,0x23,0x49,0x6e,0x4b,0x43,0x7a,0x68,0x54,0x1e,0x96,0x33,0x9c,0x70,0x35,0x53,0x39,0x1e,0x2c,0x4e,0x6c,0x41,0x20,0x1b,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x04,0x55,0x04,0x00,0x00,0x09,0x00,0x41,0x40,0x22,0x06,0x01,0x00,0x01,0x84,0x05, -0x06,0x14,0x05,0x05,0x06,0x09,0x00,0x00,0x02,0x03,0x03,0x05,0x0b,0x08,0x07,0x07,0x04,0x05,0x06,0x95,0x00,0x08,0x0f,0x05,0x01,0x95,0x03,0x15,0x00,0x3f,0xed,0x33,0x3f,0x33,0xed,0x01,0x2f,0x33,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x33,0x2f,0x33,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x31,0x30,0x01,0x01,0x21,0x07,0x21,0x37,0x01, -0x21,0x37,0x21,0x04,0x4b,0xfd,0x04,0x02,0x44,0x1d,0xfc,0xb7,0x0a,0x02,0xfb,0xfd,0xef,0x1e,0x03,0x16,0x03,0xd1,0xfc,0xbb,0x8c,0x33,0x03,0x41,0x8c,0x00,0x00,0x02,0x00,0x72,0xff,0xe8,0x03,0xde,0x05,0xb2,0x00,0x0d,0x00,0x18,0x00,0x20,0x40,0x10,0x0a,0x89,0x11,0x11,0x1a,0x16,0x89,0x04,0x13,0x9a,0x07,0x07,0x0e,0x9a,0x00,0x19, -0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x12,0x11,0x14,0x02,0x06,0x27,0x32,0x12,0x11,0x10,0x21,0x22,0x02,0x11,0x10,0x12,0x02,0x22,0x80,0xc6,0x6a,0xef,0xda,0xcb,0xd8,0x6e,0xc9,0x84,0x82,0x91,0xfe,0xff,0x8b,0x90,0x8e,0x18,0xb6,0x01,0x4d,0xdd,0x01, -0x64,0x01,0x86,0xfe,0x89,0xfe,0x9e,0xe4,0xfe,0xa9,0xb6,0x8a,0x01,0x3b,0x01,0x36,0x02,0x45,0xfe,0xd9,0xfe,0xd8,0xfe,0xdd,0xfe,0xbc,0x00,0x01,0x00,0xa1,0x00,0x00,0x03,0xb2,0x05,0x9a,0x00,0x1f,0x00,0x29,0x40,0x0f,0x18,0x08,0x01,0x8a,0x0b,0x10,0x00,0x14,0x1d,0x1d,0x09,0x14,0x06,0x01,0x0e,0xb8,0x01,0x81,0xb1,0x09,0x18,0x00, -0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0xcd,0xfd,0xcd,0xc4,0x31,0x30,0x01,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x34,0x36,0x33,0x33,0x32,0x17,0x13,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x02,0x75,0xf4,0x1d,0x1f,0x1f,0x1d,0xfd,0x74,0x1f,0x1d,0x1d,0x1f,0xf4,0x29, -0x33,0x7f,0x24,0x0f,0xce,0x05,0x42,0x23,0x24,0x0f,0x04,0xe3,0xfb,0xc1,0x30,0x20,0x20,0x34,0x34,0x20,0x20,0x30,0x04,0xa5,0x2f,0x22,0x1c,0xfe,0x70,0x0c,0x0b,0x20,0x2f,0x1d,0x00,0x01,0x00,0xc2,0xff,0xe8,0x03,0x8a,0x05,0xb2,0x00,0x1b,0x00,0x27,0x40,0x13,0x00,0x8a,0x14,0x14,0x1d,0x13,0x05,0x8a,0x0b,0x04,0x9b,0x13,0x13,0x08, -0x18,0x0f,0x07,0x08,0x19,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x21,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x03,0x8a,0x1c,0x1d,0xfe,0x15,0x30,0x20,0x22,0x32,0x31,0x23,0x20, -0x30,0x01,0x80,0x31,0x23,0x20,0x30,0x03,0x54,0x22,0x32,0xfd,0x21,0x1e,0x1b,0x1c,0x1d,0x05,0x58,0x1d,0x1c,0x1b,0x1e,0xfe,0x2b,0x01,0xd5,0x1d,0x1c,0x1b,0x1e,0x00,0x00,0x01,0x01,0x1f,0x00,0x00,0x03,0x34,0x05,0xb2,0x00,0x19,0x00,0x26,0x40,0x0c,0x0f,0x07,0x01,0x8a,0x13,0x0a,0x0c,0x9b,0x11,0x11,0x17,0x09,0xb8,0x01,0x81,0xb3, -0x05,0x18,0x17,0x07,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0xcd,0x32,0x31,0x30,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x35,0x34,0x33,0x21,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x03,0x34,0x2c,0x1a,0xfe,0x77,0x46,0x46,0x01,0x2b,0xfe,0xcb,0x1f,0x1d,0x1d,0x1f,0x01,0x35, -0x30,0x20,0x22,0x32,0x05,0x79,0xfa,0xd9,0x1c,0x36,0x51,0x53,0x01,0x99,0x30,0x20,0x20,0x34,0x02,0x98,0x1e,0x1b,0x1c,0x00,0x00,0x01,0x00,0xf7,0x00,0x00,0x03,0x55,0x05,0xb2,0x00,0x1a,0x00,0x2b,0x40,0x0f,0x09,0x01,0x8a,0x14,0x14,0x1c,0x05,0x8a,0x0f,0x04,0x9b,0x13,0x13,0x18,0x05,0xb8,0x01,0x81,0xb3,0x0c,0x18,0x18,0x07,0x00, -0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xfd,0xc4,0x31,0x30,0x01,0x11,0x14,0x23,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x03,0x55,0x32,0xfe,0x78,0x01,0x74,0x1e,0x28,0x46,0xfe,0x2e,0x1e,0x28,0x1d,0x1f,0x01,0x7e,0x31,0x23, -0x20,0x30,0x05,0x79,0xfd,0x7a,0x54,0xfe,0x05,0x2a,0x23,0x57,0x39,0x30,0x02,0x86,0x20,0x34,0x02,0x36,0x1d,0x1c,0x1b,0x00,0x00,0x01,0x01,0x08,0xff,0xe8,0x03,0x47,0x05,0xb2,0x00,0x16,0x00,0x1e,0x40,0x0e,0x06,0x01,0x0a,0x8a,0x10,0x09,0x9b,0x01,0x01,0x0d,0x14,0x07,0x0d,0x19,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xfd, -0x32,0xc6,0x31,0x30,0x01,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x01,0xac,0x01,0x55,0x1e,0x28,0x28,0x1e,0xfe,0xab,0x30,0x20,0x22,0x32,0x31,0x23,0x20,0x30,0x05,0x79,0xfd,0xb3,0x2a,0x28,0x2b,0x27,0xfd,0x99,0x1e,0x1b,0x1c,0x1d,0x05,0x58,0x1d,0x1c,0x1b, -0x00,0x01,0x00,0xe1,0xff,0xe9,0x03,0x73,0x05,0xb2,0x00,0x17,0x00,0x23,0x40,0x11,0x01,0x8a,0x07,0x07,0x19,0x14,0x8a,0x0b,0x09,0x9b,0x14,0x14,0x10,0x04,0x19,0x10,0x07,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x22,0x26,0x35,0x11,0x34, -0x36,0x33,0x32,0x16,0x15,0x11,0x21,0x32,0x16,0x03,0x73,0x31,0x23,0x20,0x30,0xfe,0x66,0x22,0x32,0x30,0x20,0x22,0x32,0x01,0xb2,0x1d,0x1f,0x02,0xef,0xfd,0x33,0x1c,0x1d,0x1b,0x1e,0x02,0x7d,0x1c,0x1d,0x02,0xa1,0x1e,0x1b,0x1c,0x1d,0xfd,0xca,0x34,0x00,0x01,0x00,0xa1,0x00,0x00,0x03,0xaf,0x05,0xb2,0x00,0x16,0x00,0x21,0x40,0x0f, -0x0d,0x11,0x11,0x18,0x0c,0x8a,0x04,0x0c,0x0f,0x0f,0x01,0x08,0x07,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x01,0x06,0x01,0x68,0x73,0x25,0x2f,0x31,0x23,0x20,0x30,0x01, -0xd6,0x0d,0x20,0x24,0x43,0x06,0xfd,0xec,0x0e,0x1b,0x1b,0x05,0x43,0x1d,0x1c,0x1b,0x1e,0xfb,0x59,0x03,0x42,0x19,0x35,0x1f,0x0b,0x0c,0xfc,0x57,0x19,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x03,0xa7,0x05,0xb2,0x00,0x14,0x00,0x17,0x00,0x26,0x40,0x12,0x15,0x03,0x03,0x19,0x00,0x17,0x8a,0x0d,0x16,0x9b,0x17,0x00,0x00,0x0a,0x11,0x07, -0x0a,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x21,0x32,0x15,0x14,0x06,0x07,0x01,0x06,0x23,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x01,0x21,0x11,0x01,0x4d,0x02,0x1d,0x3d,0x16,0x16,0xfe,0x22,0x0e,0x1f,0x73,0x25,0x2f,0x31,0x23,0x20,0x30,0x01,0x83, -0xfe,0x7d,0x04,0x2a,0x3a,0x26,0x3a,0x27,0xfc,0xb0,0x19,0x1b,0x1b,0x05,0x43,0x1d,0x1c,0x1b,0x1e,0xfe,0x0d,0xfd,0x4d,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x03,0x94,0x05,0xb2,0x00,0x13,0x00,0x1f,0x00,0x33,0x40,0x1a,0x04,0x8a,0x09,0x00,0x8b,0x14,0x09,0x14,0x09,0x14,0x21,0x1a,0x8b,0x0e,0x1d,0x9b,0x03,0x0b,0x0b,0x11,0x07,0x19, -0x17,0x9b,0x11,0x07,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x94,0x9a,0x80,0x32, -0x20,0x20,0x32,0x82,0x98,0xca,0xa6,0xa6,0xc2,0x9a,0x6b,0x61,0x65,0x73,0x71,0x67,0x5c,0x70,0x04,0x6f,0x78,0xab,0x17,0xfc,0xec,0x1e,0x1b,0x1b,0x1e,0x03,0x15,0x19,0xaa,0x76,0x94,0xaf,0xad,0x8d,0x4f,0x57,0x57,0x4f,0x56,0x60,0x64,0x00,0x00,0x02,0x00,0x76,0x00,0xf7,0x03,0xb0,0x04,0x66,0x00,0x0b,0x00,0x1b,0x00,0x1f,0x40,0x0f, -0x10,0x8a,0x09,0x09,0x1d,0x03,0x8a,0x18,0x06,0x99,0x14,0x00,0x99,0x0c,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x14,0x6e,0x8f,0x93,0x6a,0x6a, -0x91,0x8d,0x6e,0x71,0xbe,0x6d,0x6f,0xbf,0x6e,0x6e,0xbf,0x71,0x6e,0xbe,0x03,0xcc,0xa2,0x7a,0x77,0xa8,0xa7,0x78,0x78,0xa4,0x9a,0x73,0xcc,0x78,0x76,0xcd,0x75,0x76,0xcc,0x76,0x76,0xcd,0x74,0x00,0x00,0x01,0x00,0x8a,0xfe,0xe6,0x03,0x37,0x05,0x9c,0x00,0x29,0x00,0x49,0x40,0x26,0x0a,0x8a,0x20,0x11,0x8a,0x17,0x0e,0x29,0x14,0x1c, -0x29,0x14,0x20,0x17,0x17,0x20,0x14,0x29,0x1c,0x05,0x2b,0x26,0x8a,0x02,0x0e,0x1c,0x29,0x1c,0x13,0x00,0x00,0x06,0x14,0x13,0x23,0x99,0x06,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x26,0x35, -0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0x6f,0xe5,0x50,0x94,0x55,0x5b,0x98,0x57,0x48,0x86,0x9c,0xf0,0xa4,0x56,0x87,0x1c,0x1c,0x2a,0x6e,0xb5,0x75,0x9d,0xad,0x4f,0x55,0x49, -0x45,0x59,0x50,0x47,0x02,0xf7,0x8f,0xd7,0x5b,0x92,0x52,0x58,0xa4,0x68,0x5f,0xb8,0xc0,0xa7,0xd2,0xd2,0x5e,0x6a,0x68,0x52,0x27,0x3b,0x23,0x2c,0x4b,0x75,0xa9,0x67,0x9d,0xd7,0xab,0x5b,0x63,0x6c,0x60,0x49,0x42,0x7d,0x2c,0x00,0x00,0x01,0x00,0x6d,0xfe,0xdb,0x03,0xbe,0x05,0x9c,0x00,0x21,0x00,0x3c,0x40,0x1d,0x00,0x21,0x1d,0x1a, -0x8a,0x0e,0x02,0x0e,0x06,0x06,0x13,0x14,0x0b,0x0e,0x09,0x09,0x11,0x0b,0x9a,0x02,0x1d,0x1d,0x00,0x11,0x9b,0x16,0x06,0x21,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x01,0x2f,0x33,0xc4,0x32,0x39,0x2f,0x12,0x39,0x10,0xed,0x32,0x2f,0x33,0x31,0x30,0x01,0x02,0x03,0x2e,0x02,0x35,0x34,0x36,0x33,0x32, -0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x07,0x07,0x16,0x12,0x17,0x03,0x39,0xee,0x9a,0x46,0x74,0x42,0x4a,0x3c,0x7c,0x50,0x85,0x8d,0xc3,0x9a,0x88,0x96,0x31,0xb1,0xa4,0x8f,0xea,0x83,0xca,0xb0,0x01,0x72,0x9e,0x66,0xfe,0xdb,0x01,0x56,0x01,0x6c,0x02,0x47,0x72,0x3b,0x3b,0x4a, -0xd2,0x2a,0xb4,0x7d,0x9c,0xc8,0x49,0x94,0x4c,0x85,0xe9,0x86,0xa9,0xfe,0xfa,0x3e,0x03,0xed,0xfe,0xf6,0x89,0x00,0x00,0x01,0x00,0x76,0xfe,0xde,0x03,0xa2,0x05,0x88,0x00,0x2f,0x00,0x60,0x40,0x19,0x00,0x2f,0x2b,0x28,0x8a,0x0f,0x0c,0x24,0x0f,0x2f,0x0f,0x2f,0x0f,0x31,0x03,0x18,0x14,0x06,0x14,0x06,0x1c,0x22,0x8a,0x18,0x0c,0xb8, -0x01,0x7e,0x40,0x15,0x2b,0x03,0x2b,0x24,0x13,0x9b,0x14,0x2b,0x09,0x14,0x14,0x09,0x2b,0x03,0x00,0x1c,0x9b,0x1d,0x06,0x2f,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0xc6,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0x10,0xed,0x32, -0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x02,0xf6,0x5a,0x71,0x4b,0x81,0x9d,0x4c,0x39,0x3a,0x83,0x3a, -0x5f,0x61,0x95,0x88,0xfe,0xc3,0x7a,0x8c,0x86,0x82,0xfe,0xd2,0x01,0x29,0x89,0xc3,0x65,0x84,0x62,0x74,0x98,0x7c,0x27,0x93,0x33,0xfe,0xde,0x8b,0x93,0x51,0x05,0x6b,0x51,0x38,0x48,0x57,0x52,0x19,0x85,0x5f,0x7b,0x83,0x97,0x66,0x5c,0x5a,0x5f,0x96,0x53,0x98,0x64,0x9d,0x61,0x06,0x2b,0xc0,0x70,0x84,0xcc,0x24,0x04,0x29,0xb9,0x4c, -0x00,0x02,0x00,0x6c,0xff,0xf3,0x04,0x48,0x05,0x88,0x00,0x25,0x00,0x31,0x00,0x50,0xb6,0x26,0x8b,0x10,0x09,0x8b,0x2c,0x02,0xb8,0x01,0x85,0x40,0x22,0x24,0x2f,0x20,0x13,0x03,0x10,0x06,0x2c,0x24,0x10,0x2c,0x24,0x24,0x2c,0x10,0x03,0x33,0x1c,0x8a,0x17,0x06,0x13,0x20,0x13,0x2f,0x03,0x0d,0x25,0x19,0x06,0x29,0x99,0x0d,0x19,0x00, -0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x16,0x17, -0x3e,0x02,0x35,0x27,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x04,0x41,0x07,0x4d,0x8b,0xa5,0x7e,0x69,0x56,0x98,0x59,0x9c,0xc4,0x65,0x80,0xae,0x89,0x4d,0x0a,0xa6,0x0e,0x41,0x77,0x96,0x92,0x77,0x42,0x04,0xfd,0xfe,0x64,0x57,0x52,0x6e,0x55,0x67,0x68,0x57,0x05,0x88,0x25,0x2e,0x66,0xba,0xb3,0x99,0x74,0xc1, -0x63,0x5d,0x91,0x50,0xb3,0x8f,0x5f,0xb9,0x79,0x94,0xa5,0xae,0x61,0x41,0x39,0x3e,0x32,0x51,0x92,0x8e,0x80,0x84,0x9a,0xa4,0x5b,0x44,0xfb,0xa6,0x4b,0x5a,0x63,0x4c,0x42,0x8f,0x5c,0x63,0x92,0x00,0x00,0x01,0x00,0x97,0xfe,0xdb,0x05,0x22,0x05,0x88,0x00,0x25,0x00,0x49,0x40,0x24,0x25,0x00,0x1a,0x09,0x13,0x0b,0x11,0x00,0x0b,0x11, -0x11,0x0b,0x00,0x03,0x22,0x17,0x16,0x27,0x03,0x8a,0x22,0x13,0x1a,0x1a,0x1e,0x9b,0x09,0x06,0x0e,0x06,0x0e,0x17,0x25,0x06,0x16,0x17,0x00,0x2f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x10,0xc6,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x32,0x11,0x33,0x31,0x30,0x01,0x06,0x06, -0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x12,0x12,0x17,0x07,0x26,0x02,0x27,0x35,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x37,0x01,0x8d,0x2e,0x24,0x8f,0x7f,0x35,0x66,0x24,0x42,0x48,0x3e,0x48,0x5f,0x3a,0x54,0xb1,0x64,0x80,0x62,0xc9,0x25,0x37,0x8c,0x3f,0x82,0xc8,0x6f,0x2b, -0x23,0x05,0x88,0xb2,0xe2,0x63,0xc9,0xd5,0x30,0x2c,0x60,0x6b,0x4b,0x5f,0x7b,0x5c,0x5f,0x5b,0xfe,0xf9,0xfe,0x91,0x85,0x5d,0x86,0x01,0xcd,0x90,0x01,0x2f,0x35,0x91,0x01,0x04,0x9c,0x6f,0x01,0x11,0x7c,0x00,0x00,0x01,0x00,0x90,0xfe,0xde,0x04,0xce,0x05,0x88,0x00,0x36,0x00,0x63,0x40,0x33,0x04,0x8a,0x19,0x16,0x15,0x22,0x1f,0x13, -0x0b,0x11,0x1f,0x0b,0x11,0x15,0x15,0x11,0x0b,0x1f,0x04,0x26,0x38,0x2d,0x2d,0x36,0x32,0x8a,0x26,0x0e,0x01,0x13,0x19,0x19,0x09,0x07,0x99,0x1b,0x22,0x01,0x9b,0x35,0x1b,0x35,0x1b,0x35,0x16,0x2e,0x9b,0x2b,0x06,0x15,0x16,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x33,0x11,0x33,0x11,0x39, -0x01,0x2f,0xfd,0xc6,0x39,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0x32,0xed,0x31,0x30,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35, -0x34,0x3e,0x02,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x03,0x61,0xed,0x73,0x7c,0x9d,0x7c,0x45,0x37,0x2a,0x3c,0x39,0x52,0x73,0x45,0x57,0x92,0x7d,0x3f,0x7c,0x2f,0x60,0x5a,0x80,0xd5,0x77,0x3c,0x4b,0x63,0x75,0x3b,0x64,0xa9,0x85,0xe0,0xca,0x7e,0x7e,0x43,0x96,0x7d,0x01,0x1a,0x02,0xe0,0x75,0x6d,0x7e,0xa2, -0x13,0x56,0x4a,0x3f,0x49,0x8f,0x5a,0x57,0x35,0xad,0xbd,0x5c,0x44,0xd4,0x6d,0x1c,0x75,0xce,0x7d,0x51,0x87,0x3c,0x06,0x26,0xa8,0x6f,0x4d,0x6c,0x47,0x2a,0x96,0x22,0x4a,0x3f,0x5e,0x72,0x00,0x01,0x00,0x76,0xff,0xf8,0x04,0xca,0x05,0x88,0x00,0x29,0x00,0x4d,0xbc,0x00,0x24,0x01,0x85,0x00,0x06,0x00,0x0d,0x01,0x85,0x40,0x0a,0x1d, -0x06,0x29,0x1d,0x1d,0x29,0x06,0x03,0x2b,0x16,0xb8,0x01,0x85,0x40,0x0f,0x15,0x00,0x9b,0x29,0x21,0x9b,0x09,0x29,0x09,0x29,0x09,0x11,0x15,0x06,0x1a,0xb8,0x01,0x80,0xb1,0x11,0x18,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01, -0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x02,0x11,0x33,0x10,0x12,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x37,0x03,0xd4,0x16,0x1d,0x78,0xaf,0x5e,0xa8,0x84,0x72,0xb0,0x60,0x7d,0xe2,0x8f,0xcd,0xfe,0xea,0x83,0x9f,0x69,0xcd,0x93, -0x95,0xb9,0x3e,0x6b,0x3e,0x3f,0x4c,0x43,0x75,0x46,0x1a,0x01,0xd4,0x05,0x62,0xae,0x67,0x89,0xb1,0x8b,0xfc,0x9c,0xb6,0xfe,0xe8,0x97,0x01,0x43,0x02,0x95,0x01,0xb8,0xfe,0x5a,0xfd,0xc3,0xfe,0xeb,0x01,0x05,0xce,0x6f,0xb1,0x64,0x59,0x4c,0x48,0x66,0x36,0x02,0x00,0x01,0x00,0x80,0xff,0xa1,0x04,0x3e,0x05,0x96,0x00,0x16,0x00,0x2f, -0x40,0x16,0x16,0x00,0x0a,0x0b,0x00,0x0b,0x00,0x0b,0x18,0x04,0x8b,0x12,0x0b,0x0a,0x0a,0x0e,0x00,0x16,0x06,0x07,0x99,0x0e,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x00,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x04,0x23,0x22,0x26, -0x26,0x35,0x34,0x12,0x00,0x13,0x03,0x97,0xfd,0xef,0x52,0x19,0x95,0x73,0x6c,0xb9,0x6d,0x89,0x81,0xfe,0xfd,0x95,0x75,0xc1,0x6f,0x82,0x01,0x23,0xe9,0x05,0x39,0xfd,0x2c,0xc9,0x3c,0x3b,0x6c,0x83,0x89,0xb4,0x57,0xc7,0xb4,0x64,0xb4,0x72,0x72,0x01,0x05,0x01,0xb2,0x01,0x42,0x00,0x00,0x01,0x00,0x76,0xfe,0xe6,0x04,0x23,0x05,0x9c, -0x00,0x27,0x00,0x42,0x40,0x21,0x27,0x00,0x24,0x8a,0x02,0x12,0x13,0x10,0x89,0x16,0x00,0x1d,0x13,0x16,0x02,0x16,0x02,0x16,0x29,0x08,0x8a,0x1d,0x00,0x9a,0x27,0x27,0x12,0x05,0x9b,0x20,0x06,0x13,0x12,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x11,0x33, -0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x01,0xf1,0xc5,0x6f,0x59,0x60,0x77,0x38,0x86,0xcc,0xd0,0x7a,0x38,0x56,0x87,0x36,0x29,0x54,0xb4,0xec, -0xa0,0x49,0xcf,0xa2,0x6b,0xaa,0x5f,0x99,0x90,0x03,0x32,0x54,0xa6,0x60,0x76,0x84,0x63,0x40,0x7e,0xa8,0xd8,0xdd,0x99,0x74,0x37,0x6b,0x6b,0x52,0x4e,0x34,0x22,0x4f,0x69,0xbf,0xfa,0xd2,0xb0,0x5a,0xa5,0xce,0x61,0xad,0x67,0x82,0xc5,0x36,0x00,0x02,0x00,0x96,0x00,0x93,0x04,0x9f,0x04,0xc9,0x00,0x0e,0x00,0x1e,0x00,0x1f,0x40,0x0f, -0x1b,0x8a,0x00,0x00,0x20,0x08,0x8a,0x13,0x0b,0x9b,0x0f,0x04,0x9b,0x17,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x03,0xff,0x55,0x9d, -0x66,0x6c,0xa8,0x5e,0xba,0x96,0x67,0xaf,0x64,0xfe,0x79,0x8c,0xdd,0x79,0x8c,0xfa,0x96,0x8e,0xe2,0x7d,0x93,0xff,0x02,0xc0,0x64,0xa4,0x5d,0x66,0xb7,0x6c,0x9b,0xcb,0x68,0xb6,0xfe,0x3f,0x8a,0xf4,0x8e,0x98,0xff,0x93,0x87,0xed,0x90,0x99,0xfe,0xfb,0x94,0x00,0x00,0x01,0x00,0x64,0xff,0xe7,0x03,0x88,0x05,0xb1,0x00,0x25,0x00,0x35, -0x40,0x1a,0x06,0x8a,0x14,0x25,0x0d,0x12,0x22,0x14,0x0d,0x22,0x14,0x14,0x22,0x0d,0x03,0x27,0x1c,0x25,0x1f,0x10,0x10,0x0a,0x1f,0x07,0x0a,0x19,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x15,0x14,0x02,0x06,0x23, -0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x32,0x12,0x5d,0x74,0xc3,0xb0,0x76,0xb2,0x6a,0x5f,0x73,0xa2,0x73,0x35,0x40,0x3b,0x3f,0x75,0x8e,0x9d,0x6a,0x3c,0x59,0x3d,0x37,0x47,0x22,0x23,0x04,0xd3,0x20,0x56,0x59,0x98,0xfe,0x81,0x7a, -0xfe,0xfa,0x86,0x5a,0x4b,0x57,0x74,0x10,0x4d,0x54,0x3d,0x77,0x7c,0x74,0x7f,0x6e,0x6a,0x35,0x44,0x55,0x3f,0x36,0x25,0x2d,0x11,0x00,0x00,0x01,0x00,0x78,0xff,0xa7,0x05,0x09,0x05,0xb1,0x00,0x2d,0x00,0x43,0x40,0x13,0x03,0x00,0x89,0x0c,0x15,0x27,0x23,0x1d,0x07,0x15,0x23,0x23,0x15,0x07,0x03,0x2f,0x1d,0x03,0x0d,0xb8,0x01,0x81, -0x40,0x0b,0x19,0x27,0x27,0x20,0x0c,0x0c,0x08,0x20,0x07,0x07,0x08,0x00,0x2f,0x33,0x3f,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0xed,0x39,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xc4,0xed,0x32,0x31,0x30,0x01,0x14,0x06,0x07,0x15,0x16,0x04,0x17,0x07,0x26,0x24,0x24,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x36,0x36, -0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x1e,0x05,0x04,0x47,0xcc,0xcf,0xc8,0x01,0x3c,0x59,0x68,0x4d,0xfe,0x8e,0xfe,0x5e,0xc8,0x10,0x31,0x85,0x3c,0x36,0x7e,0xf5,0x7c,0x41,0x75,0xa9,0x97,0x82,0x46,0x56,0x42,0x36,0x46,0x22,0x23,0x01,0x34,0x8a,0x94,0x8f,0x71,0x46,0x03,0x4b, -0x7e,0xc8,0x3f,0x06,0x4b,0xe2,0x83,0x69,0x71,0xfa,0x9c,0x12,0xa5,0x03,0x19,0x06,0x4b,0x74,0x49,0x36,0x48,0x31,0x24,0x20,0x3c,0x57,0x41,0x44,0x5b,0x42,0x2f,0x1d,0x38,0x12,0x06,0x07,0x14,0x24,0x37,0x52,0x72,0x00,0x00,0x01,0x00,0x82,0x00,0x93,0x05,0x8b,0x05,0x36,0x00,0x23,0x00,0x38,0x40,0x14,0x1a,0x8a,0x07,0x0a,0x0d,0x13, -0x0d,0x07,0x07,0x0d,0x13,0x03,0x25,0x00,0x22,0x0a,0x10,0x10,0x16,0x03,0xb8,0x01,0x80,0xb4,0x1e,0x22,0x00,0x16,0x06,0x00,0x3f,0xc6,0x32,0xd4,0xed,0x12,0x39,0x2f,0x39,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x31,0x30,0x13,0x12,0x00,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x07,0x16,0x15,0x14,0x06, -0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x03,0x37,0xfb,0x96,0x01,0x40,0xce,0x64,0x97,0x53,0x98,0x83,0x09,0x30,0x8d,0x5b,0x61,0x83,0xc7,0xa8,0x95,0xe1,0x79,0x7a,0xdf,0x8e,0xb4,0xfe,0xce,0xf2,0x4a,0x73,0x05,0x36,0xfd,0xd2,0xfe,0x25,0x6c,0xc0,0x70,0x9e,0xe3,0x18,0x0e,0x3c, -0x4a,0x5b,0x83,0x93,0x6a,0x80,0x9c,0x91,0xfe,0xfe,0x9f,0xa0,0xfe,0xf5,0x99,0xf7,0x01,0xf5,0x01,0x5e,0x59,0x00,0x00,0x03,0x00,0x8c,0x00,0x4c,0x04,0x91,0x05,0xb1,0x00,0x1d,0x00,0x2b,0x00,0x38,0x00,0x46,0x40,0x26,0x2c,0x8a,0x12,0x1a,0x8a,0x33,0x03,0x8b,0x1e,0x0e,0x12,0x33,0x1d,0x1e,0x12,0x33,0x1e,0x1e,0x33,0x12,0x03,0x3a, -0x26,0x8a,0x0b,0x22,0x1d,0x0e,0x30,0x04,0x16,0x29,0x99,0x07,0x36,0x9b,0x16,0x07,0x00,0x3f,0xed,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26, -0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x26,0x27,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x14,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x7e,0x95,0x7e,0x8a,0xee,0x8f,0x8e,0xed,0x83,0x8f,0xa7,0x87,0x7a,0x7f,0xe0,0x80,0x82,0xd2,0x77,0x6e,0x7f,0x77,0x46,0x80,0x9b, -0x9d,0x84,0x47,0xd8,0xa0,0x94,0xbd,0xfd,0x6c,0x3f,0x76,0x9f,0x9c,0x7a,0xb7,0x89,0x84,0xa6,0x03,0x32,0x3f,0xa8,0x77,0x75,0xb3,0x60,0x62,0xb1,0x75,0x7e,0xaa,0x37,0x06,0x34,0x91,0x65,0x62,0x98,0x54,0x51,0x94,0x64,0x6b,0x92,0x33,0xfe,0x98,0x44,0x63,0x4a,0x31,0x28,0x44,0x61,0x47,0x71,0x91,0x85,0x03,0x0b,0x37,0x50,0x3d,0x2f, -0x2c,0x71,0x54,0x4c,0x62,0x5e,0x00,0x02,0x00,0x96,0x00,0x01,0x05,0x82,0x05,0xb1,0x00,0x1f,0x00,0x32,0x00,0x5a,0x40,0x18,0x02,0x8a,0x30,0x2b,0x25,0x0f,0x89,0x28,0x09,0x14,0x00,0x30,0x28,0x28,0x30,0x00,0x14,0x09,0x05,0x34,0x20,0x8a,0x1a,0x13,0xb8,0x01,0x7e,0x40,0x10,0x09,0x2b,0x05,0x12,0x30,0x08,0x1e,0x12,0x08,0x12,0x08, -0x16,0x00,0x1e,0x07,0x25,0xb8,0x01,0x80,0xb1,0x16,0x18,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x32,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x33,0x33,0x10,0xed,0x31,0x30,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x15,0x07,0x0e,0x02,0x15,0x14, -0x16,0x33,0x17,0x15,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x00,0x37,0x17,0x01,0x14,0x16,0x16,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x35,0x37,0x06,0x02,0x03,0xbf,0x2f,0x84,0x5f,0x18,0x2e,0x34,0x95,0x70,0xcb,0x8f,0x48,0x7a,0x50,0x79,0xd2,0xd1,0xb0,0xfe,0xdb,0xa5,0xa5,0x01,0x2d,0xc2,0x95,0xfd,0x75,0x78, -0xde,0x95,0x43,0x42,0x5a,0x83,0x97,0x70,0x82,0x02,0xd9,0xe3,0x05,0x5e,0x5c,0x47,0x5d,0x86,0x0d,0x1f,0x4b,0x06,0x49,0x7d,0x78,0x77,0x40,0x4c,0x80,0x80,0x06,0x6b,0x95,0x01,0x01,0x95,0x91,0x01,0x4c,0x01,0x35,0x73,0x4d,0xfc,0xcc,0x76,0xb8,0x63,0x03,0x36,0xa2,0x4d,0x62,0xc2,0x6e,0x2a,0xaa,0x71,0x15,0x15,0xac,0xfe,0xac,0x00, -0x00,0x01,0x00,0x64,0xff,0xe5,0x06,0x29,0x05,0xb1,0x00,0x2d,0x00,0x5a,0xb9,0x00,0x0a,0x01,0x85,0x40,0x12,0x19,0x06,0x1b,0x01,0x8a,0x21,0x1b,0x21,0x19,0x21,0x28,0x28,0x21,0x19,0x03,0x2f,0x11,0x02,0xb8,0x01,0x80,0x40,0x12,0x11,0x12,0x1b,0x1e,0x22,0x06,0x12,0x1e,0x06,0x12,0x12,0x06,0x1e,0x03,0x0e,0x2b,0x07,0x15,0xb8,0x01, -0x80,0xb1,0x0e,0x19,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x11,0x14,0x33,0x32,0x36,0x37,0x33,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x20,0x00,0x03,0x37,0x33,0x12,0x21,0x32,0x36, -0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0x92,0x23,0x68,0xbd,0x68,0x0e,0x66,0x73,0x87,0xff,0xae,0xfe,0xae,0xfe,0x39,0x78,0x77,0x06,0xfa,0x02,0x1c,0x7a,0xb6,0x62,0x34,0x47,0xc2,0x66,0x74,0x85,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x04,0x89, -0xfe,0xd2,0x73,0x93,0xa4,0x59,0xfe,0xf7,0x98,0xa6,0xfe,0xf9,0x93,0x02,0x35,0x02,0x51,0x64,0xfb,0xb5,0x6f,0xc6,0x7b,0x7a,0x6a,0x60,0x6e,0x8f,0x78,0x01,0x72,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x00,0x02,0x00,0x87,0xff,0xe8,0x04,0xa0,0x05,0xb1,0x00,0x21,0x00,0x30,0x00,0x43,0x40,0x0a,0x24,0x14,0x8a,0x21,0x1b,0x21,0x1b,0x21, -0x32,0x2e,0xb8,0x01,0x82,0xb4,0x05,0x05,0x2e,0x24,0x22,0xb8,0x01,0x80,0x40,0x0d,0x00,0x0d,0x15,0x1e,0x02,0x02,0x0d,0x1e,0x19,0x2a,0x9b,0x0d,0x07,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x32,0x32,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x27,0x26, -0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x03,0x15,0x11,0x17,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x32,0x37,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x06,0x15,0x17,0x16,0x03,0x4e,0x63,0x96,0x5c,0xfe,0xe1,0x1b,0x19,0x1f,0x62,0x9a,0xc7,0x73,0x1f,0x58,0x59,0x3e,0x27,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58, -0x41,0x57,0x62,0xfe,0xfb,0xa2,0x63,0x29,0x37,0x3a,0x11,0x61,0xae,0x65,0x07,0x8c,0x02,0x74,0x1d,0x2a,0x13,0x1c,0x5b,0x2a,0x65,0xfc,0xb7,0x64,0x35,0x62,0x84,0xb2,0x74,0xfd,0xb2,0x4c,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0x01,0xe2,0x27,0x57,0x75,0xa0,0x63,0x2c,0x87,0xe9,0x83,0x0a,0x25,0x00,0x00,0x02,0x00,0x78,0xff,0xe8, -0x06,0x08,0x05,0xb1,0x00,0x31,0x00,0x41,0x00,0x6e,0xb3,0x1f,0x8a,0x18,0x26,0xb8,0x01,0x86,0x40,0x2d,0x3e,0x12,0x24,0x1a,0x3e,0x18,0x1a,0x3e,0x3e,0x1a,0x18,0x03,0x43,0x0e,0x35,0x8a,0x07,0x31,0x1a,0x1c,0x3e,0x34,0x32,0x9b,0x10,0x23,0x9b,0x15,0x12,0x0e,0x02,0x0a,0x1c,0x0e,0x15,0x2b,0x1c,0x10,0x15,0x15,0x10,0x1c,0x03,0x0a, -0x3a,0xb8,0x01,0x80,0xb3,0x2b,0x19,0x0a,0x07,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0xc4,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x27,0x27,0x06,0x23,0x22,0x26,0x35, -0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x37,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x03,0x35,0x25,0x22,0x07,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x36,0x35,0x27,0x26,0x26,0x01,0x26,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41, -0x56,0x63,0x78,0xa1,0x90,0x80,0x26,0x52,0x54,0x58,0x4c,0x0b,0x82,0x06,0x28,0xad,0x90,0x30,0x1b,0x0e,0x62,0x99,0xc7,0x71,0x1f,0x58,0x59,0x3e,0x27,0x01,0xca,0x9b,0x8b,0x29,0x37,0x3a,0x11,0x61,0xab,0x65,0x07,0x3b,0x6f,0x04,0x71,0x52,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0xfe,0xa4,0x36,0x3c,0x18,0x12,0x3a,0x3b,0x1d,0x1f, -0x06,0x62,0x4f,0x52,0x81,0x9b,0x06,0x19,0x2a,0x64,0xff,0xb6,0x63,0x35,0x62,0x84,0xb2,0x74,0x97,0x40,0x57,0x75,0xa0,0x63,0x2c,0x85,0xeb,0x83,0x0a,0x20,0x1e,0x00,0x00,0x01,0x00,0x96,0xff,0xe7,0x05,0x3b,0x05,0xb1,0x00,0x3c,0x00,0x67,0xb9,0x00,0x1a,0x01,0x83,0xb6,0x39,0x0d,0x39,0x0d,0x39,0x07,0x35,0xb8,0x01,0x85,0x40,0x24, -0x1d,0x2d,0x2a,0x24,0x2a,0x1d,0x1d,0x2a,0x24,0x03,0x3e,0x07,0x89,0x14,0x00,0x9b,0x18,0x31,0x21,0x07,0x10,0x0a,0x21,0x2d,0x18,0x27,0x0a,0x18,0x0a,0x18,0x10,0x27,0x07,0x10,0x19,0x1a,0xb8,0x01,0x81,0xb1,0x39,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x01, -0x2f,0xec,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x22,0x06,0x06,0x15,0x14,0x17,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x20,0x13,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x07,0x07,0x14,0x16,0x17,0x04,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x2e,0x02,0x02,0x26,0x41,0x6f,0x42,0x0c,0x0b,0x0f,0x4e,0x2d,0x41,0x5d,0x5f,0x4b,0x4d,0x90,0x56,0x6d,0xb2,0x6d,0x01,0x6e,0x4c,0x56,0x6a,0x55,0xac,0xff,0xfe,0xe1,0xe2,0x4f,0x44,0x39,0x48,0x22,0x23,0x01,0x94,0xa2,0x01,0x37,0xeb,0x7a,0x87,0xd5,0x85, -0x23,0x4e,0x72,0x02,0x1f,0x45,0x7a,0x41,0x28,0x25,0x02,0x2a,0x36,0x66,0x44,0x47,0x58,0x57,0x95,0x59,0x6a,0xc4,0x63,0xfd,0xec,0x23,0xa6,0x5f,0x42,0x6e,0x61,0x5f,0x69,0xcd,0x8a,0x54,0x5c,0x3e,0x37,0x25,0x2d,0x11,0x06,0x3f,0x6c,0x39,0x6e,0x8c,0xaf,0x6d,0x81,0xf5,0x7c,0xe5,0xe2,0x71,0x00,0x02,0x00,0x98,0x00,0xe6,0x03,0xee, -0x04,0x23,0x00,0x0b,0x00,0x17,0x00,0x2a,0xb9,0x00,0x00,0x01,0x85,0xb3,0x0c,0x0c,0x19,0x12,0xbe,0x01,0x85,0x00,0x06,0x00,0x15,0x01,0x7e,0x00,0x03,0x00,0x0f,0x01,0x7e,0xb1,0x09,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34, -0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xee,0xf8,0xb3,0xb3,0xf8,0xf0,0xbb,0xbb,0xf0,0xa0,0x93,0x78,0x77,0x94,0x97,0x74,0x73,0x98,0x02,0x83,0xae,0xef,0xef,0xae,0xbb,0xe5,0xe5,0xbb,0x71,0xab,0xad,0x6f,0x77,0xa5,0xa8,0x00,0x02,0x01,0x00,0xff,0xba,0x03,0x6f,0x05,0x1a,0x00,0x15,0x00,0x1e,0x00,0x36,0x40,0x09, -0x16,0x12,0x8a,0x02,0x00,0x02,0x00,0x20,0x1b,0xb8,0x01,0x85,0x40,0x0b,0x0a,0x1d,0x99,0x05,0x05,0x00,0x19,0x9b,0x0d,0x06,0x15,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x33,0x31,0x30,0x05,0x24,0x11,0x35,0x12,0x35,0x06,0x23,0x22,0x26,0x35,0x34, -0x36,0x33,0x32,0x16,0x15,0x10,0x03,0x15,0x14,0x17,0x01,0x35,0x34,0x23,0x22,0x15,0x14,0x33,0x32,0x03,0x6f,0xfe,0xeb,0x0a,0x25,0x25,0x7e,0x9c,0x9f,0x7c,0x7a,0x72,0x0a,0x72,0xfe,0xfa,0x4e,0x7b,0x78,0x21,0x46,0x24,0x01,0x11,0x0c,0x01,0x1e,0xe4,0x08,0x9b,0x7d,0x74,0x99,0xb2,0xe0,0xfe,0xf0,0xfe,0x83,0x07,0x8e,0x0d,0x03,0x44, -0x25,0xb8,0x6d,0x7c,0x00,0x01,0x00,0x5d,0xff,0xbe,0x04,0x26,0x04,0xee,0x00,0x20,0x00,0x4d,0xb2,0x1e,0x05,0x1c,0xb8,0x01,0x85,0x40,0x1d,0x10,0x0d,0x10,0x01,0x00,0x09,0x10,0x00,0x00,0x10,0x09,0x03,0x22,0x16,0x0d,0x05,0x1e,0x1e,0x07,0x0b,0x07,0x0b,0x07,0x01,0x13,0x9b,0x19,0x06,0x00,0xb8,0x01,0x80,0xb1,0x01,0x19,0x00,0x3f, -0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0x33,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x32,0x31,0x30,0x25,0x07,0x26,0x27,0x26,0x27,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x36,0x33,0x32,0x00,0x15,0x10,0x05,0x16,0x16, -0x04,0x26,0x28,0x79,0x5b,0x19,0xa2,0x6c,0x6f,0xd9,0xe9,0x79,0x6b,0x6b,0x80,0xc3,0xa3,0xbc,0x8f,0x65,0x72,0xbe,0x80,0xe5,0x01,0x21,0xfe,0xf6,0x65,0x6d,0x58,0x9a,0x11,0x43,0x12,0x98,0x24,0x91,0x8e,0x45,0x38,0xc5,0x73,0xa4,0xc8,0x77,0x7c,0x57,0x44,0xfe,0xda,0xe6,0xfe,0xd1,0xad,0x63,0x3e,0x00,0x00,0x01,0x00,0x6b,0xff,0x7b, -0x04,0x19,0x05,0x04,0x00,0x2a,0x00,0x68,0xb6,0x05,0x04,0x04,0x2c,0x29,0x00,0x26,0xb8,0x01,0x85,0x40,0x19,0x1b,0x08,0x02,0x02,0x16,0x1b,0x0d,0x16,0x0d,0x16,0x22,0x13,0x1b,0x02,0x09,0x29,0x29,0x17,0x0f,0x0f,0x11,0x16,0x9b,0x17,0x11,0xb8,0x01,0x81,0x40,0x0b,0x09,0x17,0x09,0x17,0x09,0x05,0x1f,0x9b,0x24,0x06,0x04,0xb9,0x01, -0x80,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x11,0x39,0x11,0x12,0x39,0x01,0x2f,0x33,0xc4,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x14,0x05,0x16,0x17,0x07,0x26,0x26,0x27,0x07,0x22,0x27,0x26,0x35,0x34,0x33, -0x32,0x17,0x24,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x16,0x04,0x19,0xfe,0xdb,0x41,0x7d,0x29,0x72,0x96,0x62,0x4c,0x8c,0x41,0x77,0xaa,0x6d,0xb3,0x01,0x20,0xfe,0xca,0xcd,0xeb,0x7c,0x94,0x82,0x49,0xa0,0xa8,0xbb,0x38,0xd6,0xc5,0x02,0x0b,0x57,0x3c, -0x9b,0x01,0x8f,0xe9,0x41,0x2e,0x22,0x9a,0x1f,0x51,0x61,0x01,0x12,0x22,0x65,0x78,0x6e,0x14,0x8d,0xcb,0xa1,0x5a,0x53,0x7c,0x29,0x17,0x47,0x97,0x50,0xfe,0xa4,0x46,0x9b,0x24,0x77,0x00,0x00,0x02,0x00,0x94,0xff,0xba,0x03,0xf0,0x05,0x1e,0x00,0x1c,0x00,0x29,0x00,0x53,0xb3,0x00,0x89,0x1c,0x06,0xbb,0x01,0x85,0x00,0x1d,0x00,0x24, -0x01,0x85,0x40,0x1e,0x0e,0x02,0x1c,0x12,0x21,0x18,0x03,0x1d,0x0e,0x1c,0x1d,0x0e,0x0e,0x1d,0x1c,0x03,0x2b,0x15,0x89,0x14,0x18,0x02,0x12,0x21,0x04,0x0a,0x1c,0x14,0x06,0x27,0xb8,0x01,0x80,0xb1,0x0a,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x10, -0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x01,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x00,0x03,0x33,0x16,0x16,0x17,0x3e,0x02,0x37,0x03,0x34,0x27,0x26,0x27,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf0,0x30,0xfe,0xef,0x81,0x3d,0x1f,0x5c,0x9b,0x53,0x54,0x9a,0x5c,0x1f,0x3e,0x80, -0xfe,0xeb,0x2c,0xaa,0x22,0x76,0x6f,0x57,0x55,0x3d,0x18,0x5a,0x38,0x11,0x5e,0x72,0x3b,0x67,0x43,0x43,0x67,0x05,0x1e,0xfe,0x81,0xfe,0xdc,0x95,0x64,0x63,0x30,0x51,0x8f,0x55,0x55,0x8f,0x51,0x30,0x63,0x65,0x94,0x01,0x28,0x01,0x7b,0xb6,0xfa,0x76,0x5a,0x8d,0xba,0x85,0xfb,0xd1,0x3b,0x50,0x18,0x6c,0x84,0x50,0x3b,0x38,0x5e,0x5c, -0x00,0x01,0x00,0x59,0xff,0xf6,0x04,0x2b,0x04,0xe1,0x00,0x1a,0x00,0x48,0xb9,0x00,0x10,0x01,0x85,0xb2,0x0a,0x18,0x00,0xb8,0x01,0x85,0x40,0x0d,0x01,0x0a,0x01,0x0a,0x01,0x1c,0x12,0x89,0x0d,0x07,0x18,0x12,0x15,0xb8,0x01,0x80,0x40,0x0b,0x02,0x07,0x0d,0x04,0x04,0x01,0x19,0x0d,0x06,0x01,0x18,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f, -0x12,0x39,0x39,0xed,0x32,0x32,0x01,0x2f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed,0x31,0x30,0x05,0x23,0x11,0x06,0x23,0x22,0x24,0x27,0x37,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x04,0x2b,0xa0,0x7b,0xe0,0xa7,0xfe,0xf9,0x29,0x4f,0x39,0x41,0x23,0xaa,0x5a, -0x65,0x1f,0x9f,0x56,0x57,0xd7,0x2d,0xa0,0x0a,0x01,0x53,0x2a,0x8e,0x7e,0x69,0x66,0x92,0x50,0xde,0x27,0xac,0xa9,0xcd,0x98,0x31,0x37,0x22,0x16,0x02,0xea,0x00,0x01,0x00,0x7d,0xff,0xf6,0x04,0x06,0x06,0x30,0x00,0x2d,0x00,0x68,0xb9,0x00,0x17,0x01,0x85,0x40,0x10,0x0c,0x13,0x0e,0x13,0x1a,0x1a,0x13,0x0e,0x03,0x05,0x2f,0x25,0x25, -0x00,0x20,0x28,0xb8,0x01,0x85,0x40,0x1c,0x09,0x07,0x05,0x14,0x9b,0x11,0x0c,0x00,0x2d,0x07,0x26,0x9b,0x23,0x1a,0x1b,0x2d,0x23,0x1b,0x1b,0x23,0x2d,0x03,0x02,0x1d,0x9b,0x0c,0x06,0x2b,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x39,0x11,0x33,0x10,0xdd,0xed,0x01, -0x2f,0x33,0x33,0xfd,0x32,0xc4,0x39,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x17,0x15,0x27,0x22,0x06,0x15,0x14,0x17,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33, -0x32,0x37,0x04,0x06,0xb9,0xc0,0xe9,0xfe,0xd9,0xa0,0x9c,0xde,0xc2,0x1c,0x98,0x7a,0x69,0x69,0x50,0x22,0x68,0x88,0x23,0x75,0x7a,0xc1,0xa2,0xba,0x84,0xec,0xcb,0xfe,0x9d,0xe0,0x91,0xa3,0xa5,0x39,0x43,0xc4,0xaf,0xa5,0x5c,0x5d,0xb1,0x98,0xb4,0x10,0x32,0x45,0x6a,0x7b,0x04,0xa7,0x03,0x1c,0x21,0x47,0x27,0x23,0x9c,0x1a,0x5f,0x61, -0x52,0x6d,0xaf,0xa1,0x61,0x72,0x3b,0x00,0x00,0x01,0x00,0xbf,0xff,0xf0,0x03,0xc4,0x05,0x25,0x00,0x17,0x00,0x40,0xb4,0x03,0x04,0x10,0x0f,0x00,0xb8,0x01,0x85,0x40,0x09,0x07,0x0f,0x07,0x04,0x07,0x04,0x07,0x19,0x0d,0xb8,0x01,0x85,0x40,0x0c,0x12,0x0f,0x10,0x10,0x15,0x04,0x03,0x19,0x0a,0x9b,0x15,0x06,0x00,0x3f,0xed,0x3f,0x33, -0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x00,0x05,0x27,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0xc4,0xfe,0xba,0xff,0x00,0x70,0xe0,0x01,0x37,0x98,0x69,0x52,0x74,0x40,0x8c,0x53,0xc4, -0xa1,0xb1,0xef,0x03,0x92,0xc2,0xfe,0x08,0xe8,0x71,0xcb,0x01,0xc9,0x9d,0x61,0x92,0x6b,0x46,0x52,0x6b,0x4e,0x75,0x96,0x8f,0xc2,0xe8,0x00,0x01,0x00,0x2b,0xff,0xf6,0x04,0x59,0x05,0x29,0x00,0x18,0x00,0x3c,0xb6,0x10,0x00,0x10,0x00,0x1a,0x0e,0x13,0xb8,0x01,0x85,0x40,0x09,0x09,0x05,0x00,0x18,0x18,0x10,0x02,0x0c,0x0f,0xb8,0x01, -0x80,0xb3,0x07,0x10,0x06,0x16,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0x33,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0xc4,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x59,0x9b, -0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x02,0xbd,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x01,0x00,0x2b,0xff,0xf6,0x04,0x59,0x05,0xda,0x00,0x25,0x00,0x4a,0xb9,0x00,0x19,0x01,0x85,0x40,0x0e,0x0f,0x1d,0x11, -0x1d,0x15,0x00,0x00,0x15,0x1d,0x11,0x04,0x27,0x0e,0x20,0xb8,0x01,0x85,0xb7,0x09,0x05,0x17,0x9b,0x14,0x1c,0x0c,0x0e,0xb8,0x01,0x80,0xb3,0x07,0x1e,0x06,0x23,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0x33,0xfd,0xcd,0x33,0xd4,0xed,0x01,0x2f,0xc4,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30, -0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x59,0x9b,0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x01,0xb5,0x11,0x8e,0xb1,0x44,0x17,0x45,0x46,0x34,0xfd,0x59,0x03, -0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x2c,0x37,0x7f,0x77,0xa0,0x06,0x11,0x3f,0x2c,0x37,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x00,0x02,0x00,0x76,0x01,0x13,0x03,0xc8,0x04,0xa4,0x00,0x0b,0x00,0x19,0x00,0x27,0xb9,0x00,0x10,0x01,0x85,0xb3,0x09,0x09,0x1b,0x03,0xbb,0x01, -0x85,0x00,0x17,0x00,0x06,0x01,0x80,0xb4,0x13,0x00,0x9b,0x0c,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x02,0x20,0x73,0x99,0x9d,0x6f,0x70,0x9a,0x97,0x73,0x75, -0xc3,0x70,0xed,0xbb,0x72,0xc6,0x72,0xe9,0x04,0x09,0xab,0x81,0x7f,0xb0,0xb0,0x7f,0x80,0xac,0x9b,0x76,0xd3,0x7f,0xc8,0xfe,0xff,0x7a,0xd3,0x7c,0xce,0xfa,0x00,0x02,0x00,0x2d,0xff,0xe8,0x03,0x89,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x3c,0x40,0x0b,0x18,0x0d,0x8a,0x0e,0x0f,0x15,0x0f,0x15,0x0f,0x23,0x1f,0xbb,0x01,0x85,0x00,0x06, -0x00,0x16,0x01,0x80,0xb3,0x03,0x03,0x09,0x0d,0xb8,0x01,0x80,0xb5,0x12,0x19,0x1c,0x9b,0x09,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x33,0x31,0x30,0x01,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35, -0x03,0x32,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x0c,0x02,0x50,0x4e,0x8c,0xb3,0xb2,0x87,0x92,0xb8,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0xa4,0x58,0x4c,0x55,0x49,0x47,0x5c,0x5b,0x03,0x39,0x02,0x15,0xb7,0x98,0x8c,0xb1,0xc9,0x9f,0xfc,0x38,0x67,0xac,0x28,0x2d,0x55,0x4b,0x03,0x3e,0x23,0x66,0x5e,0x6a,0x5e,0x49, -0x4c,0x5e,0x00,0x01,0x00,0x7c,0xff,0xe8,0x04,0x43,0x05,0xb2,0x00,0x26,0x00,0x55,0xb9,0x00,0x00,0x01,0x85,0x40,0x24,0x09,0x0a,0x1b,0x0a,0x1b,0x0a,0x28,0x18,0x03,0x8b,0x21,0x13,0x10,0x0a,0x09,0x03,0x21,0x20,0x18,0x10,0x16,0x09,0x10,0x16,0x20,0x20,0x16,0x10,0x09,0x04,0x0c,0x1e,0x9b,0x23,0x07,0x07,0xb8,0x01,0x80,0xb1,0x0c, -0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x32,0x11,0x33,0x01,0x2f,0xcd,0xc4,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x17,0x16,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36, -0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x03,0x84,0xca,0xac,0x25,0x22,0x64,0x51,0x73,0x8c,0x3a,0x96,0x9f,0x90,0xb4,0x30,0x28,0x7d,0x79,0x68,0x47,0x94,0x38,0x6e,0x81,0xbe,0x9f,0x62,0x33,0x1a,0x38,0x60,0xa7,0xed,0x7e,0x03,0xce,0xa3,0xf2,0x26,0x90,0x82,0x7e,0x47,0x9e,0x44,0xbc,0xc0,0xa3,0x05,0x4e,0x53, -0x45,0x5d,0x9d,0x20,0x9c,0x6b,0x90,0xae,0x08,0x95,0x0e,0x7a,0xdb,0x00,0x00,0x01,0x00,0x0f,0xff,0xe8,0x04,0x52,0x05,0xb2,0x00,0x2b,0x00,0x5b,0xb9,0x00,0x02,0x01,0x85,0x40,0x0d,0x00,0x1d,0x10,0x10,0x2d,0x1d,0x23,0x17,0x23,0x17,0x0a,0x09,0x29,0xb8,0x01,0x85,0x40,0x17,0x1d,0x09,0x0a,0x00,0x13,0x17,0x9b,0x18,0x23,0x22,0x0a, -0x18,0x22,0x22,0x18,0x0a,0x03,0x06,0x20,0x9b,0x25,0x07,0x0d,0xb8,0x01,0x80,0xb1,0x06,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x39,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24, -0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x03,0x80,0xd2,0x7b,0xdd,0x89,0xb9,0xfe,0xd6,0x7f,0x7a,0x5e,0xf8,0x8d,0x97,0xb1,0x70,0x5e,0x36,0x40,0x58,0x4d,0x13,0x29,0x5d,0x6f,0x8e,0x96,0x78, -0x4d,0x3f,0x23,0x4d,0x57,0x88,0xc7,0x68,0x7f,0x02,0xf7,0x8d,0xe4,0x7d,0xbc,0x65,0xb6,0xc0,0x5f,0x94,0xa6,0x8e,0x7e,0x56,0x90,0x2f,0x10,0x0b,0x97,0x07,0x89,0x6a,0x6f,0x86,0x12,0x97,0x16,0x6a,0xbd,0x74,0xb0,0x6e,0x00,0x02,0x00,0x0a,0xff,0xe8,0x04,0xc4,0x05,0xbc,0x00,0x10,0x00,0x1b,0x00,0x57,0xbc,0x00,0x16,0x01,0x85,0x00, -0x0d,0x00,0x07,0x01,0x85,0x40,0x1c,0x11,0x02,0x03,0x14,0x01,0x0f,0x03,0x0d,0x04,0x11,0x03,0x0d,0x11,0x03,0x03,0x11,0x0d,0x03,0x1d,0x00,0x10,0x01,0x0f,0x04,0x14,0x04,0x00,0x19,0xb8,0x01,0x80,0xb7,0x0a,0x19,0x03,0x10,0x10,0x02,0x00,0x07,0x00,0x3f,0x32,0x32,0x11,0x33,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0x33,0x12,0x17,0x39, -0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x01,0x01,0x17,0x01,0x16,0x12,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x10,0x37,0x01,0x01,0x34,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x70,0x01,0xf5,0x01,0xed,0x72,0xfe,0x16,0x76,0x71,0xbd,0x9b,0x9f,0xbd,0xe6,0xfe,0x17,0x03,0x19, -0x55,0x64,0xbf,0x67,0x50,0x54,0x6d,0x05,0xbc,0xfe,0x3a,0x01,0xc6,0x75,0xfe,0x3b,0x81,0xfe,0xff,0x92,0xae,0xd8,0xe0,0xb0,0x01,0x1a,0xf6,0x01,0xbc,0xfc,0x35,0x5a,0xd5,0x6e,0xcb,0xd8,0x67,0x89,0x8a,0x00,0x00,0x01,0x00,0x16,0xff,0xe8,0x05,0x11,0x05,0xb2,0x00,0x22,0x00,0x4b,0x40,0x12,0x01,0x02,0x20,0x00,0x8a,0x08,0x02,0x08, -0x02,0x08,0x24,0x1b,0x8a,0x15,0x0e,0x21,0x06,0x1e,0xb8,0x01,0x80,0x40,0x0d,0x15,0x09,0x14,0x0b,0x14,0x0b,0x14,0x05,0x12,0x9b,0x17,0x07,0x00,0xb8,0x01,0x80,0xb1,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0xed,0x3f,0x01,0x2f,0xc4,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x31, -0x30,0x25,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x38,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0x6e,0x8b,0xda,0xe8,0x2c,0x2f,0x2d,0x1c,0x1f,0x28,0x41,0x76,0x88,0x8e,0x7c,0x97,0x76,0xa4,0x82, -0x67,0xac,0x28,0x2d,0x55,0x4b,0xfb,0x35,0xed,0xdb,0x01,0xa2,0x29,0x36,0x05,0x96,0x0a,0x91,0x7f,0xfe,0x5e,0x87,0x90,0x66,0x03,0x4b,0x00,0x01,0x00,0x41,0xff,0xe8,0x04,0x85,0x05,0xbb,0x00,0x36,0x00,0x70,0xbf,0x00,0x0a,0x01,0x85,0x00,0x15,0x00,0x2a,0x01,0x85,0x00,0x27,0x00,0x04,0x01,0x85,0x40,0x11,0x1b,0x1d,0x27,0x1b,0x15, -0x00,0x0f,0x27,0x1b,0x1b,0x27,0x0f,0x00,0x15,0x05,0x38,0x30,0xb8,0x01,0x85,0x40,0x16,0x20,0x0f,0x10,0x07,0x17,0x17,0x1d,0x12,0x00,0x9b,0x2d,0x22,0x10,0x0d,0x22,0x27,0x36,0x36,0x0d,0x27,0x07,0x12,0xb8,0x01,0x80,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0xed,0x12,0x39,0x39,0x11,0x33, -0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x02,0x35,0x34,0x37,0x35,0x24,0x35,0x10,0x21,0x32,0x36,0x35,0x34,0x27,0x17, -0x16,0x15,0x14,0x06,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x30,0xb9,0x5f,0x66,0x81,0xb5,0xdb,0xc2,0xa2,0x89,0x86,0x60,0x2f,0x57,0x5b,0x3f,0x53,0xfa,0xb6,0xc1,0x62,0x44,0xfe,0xe9,0x01,0x9a,0x43,0x56,0x06,0x9d,0x04,0xac,0x82,0x87,0x7b,0x89,0x6c,0x2b,0x2d,0xed,0x03,0x1a,0x1c,0x0e,0x59,0x48,0x3d,0x3d,0x05, -0x07,0x79,0x75,0x6d,0x86,0x28,0x8b,0x1b,0x38,0x27,0x50,0x06,0x05,0x3d,0x7b,0x62,0x66,0x4a,0x02,0x45,0xdb,0x01,0x25,0x25,0x22,0x17,0x12,0x33,0x12,0x1e,0x49,0x5f,0x47,0x47,0x43,0x50,0x03,0x23,0x00,0x02,0x00,0x36,0xff,0xe8,0x04,0xaf,0x05,0xb2,0x00,0x1d,0x00,0x29,0x00,0x53,0xb1,0x21,0x16,0xbb,0x01,0x85,0x00,0x07,0x00,0x27, -0x01,0x85,0x40,0x0d,0x0f,0x07,0x0f,0x07,0x0f,0x2b,0x00,0x8b,0x1d,0x1d,0x00,0x21,0x1e,0xb8,0x01,0x80,0x40,0x09,0x0c,0x09,0x0c,0x00,0x0c,0x00,0x0c,0x12,0x03,0xb8,0x01,0x80,0xb5,0x1a,0x19,0x24,0x9b,0x12,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39, -0x2f,0x2f,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x13,0x12,0x12,0x33,0x32,0x36,0x12,0x35,0x34,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x03,0x25,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xd1,0x2c,0xcf,0xb5,0x76,0xb8,0x62,0x04,0x02,0x7d,0x9b,0xa1,0xc9, -0xc0,0xa2,0x89,0xce,0x6d,0x89,0xfd,0xa2,0xf8,0xfe,0xde,0x37,0x02,0xb4,0x42,0x89,0x3d,0x21,0x83,0x52,0x5e,0x77,0x6d,0x03,0x23,0xfe,0x94,0xfe,0xcc,0x92,0x01,0x00,0x97,0x3d,0x3a,0x6a,0xdb,0xb0,0xa5,0xc9,0xbf,0xfe,0x9b,0xed,0xc9,0xfe,0xc0,0xb0,0x01,0x70,0x01,0xa2,0x5a,0x47,0x44,0x91,0xa7,0x73,0x5f,0x6c,0x85,0x00,0x00,0x01, -0x00,0x80,0xff,0xe8,0x04,0x3e,0x05,0xbc,0x00,0x14,0x00,0x33,0x40,0x14,0x14,0x00,0x09,0x0a,0x00,0x0a,0x00,0x0a,0x16,0x04,0x8b,0x10,0x0a,0x09,0x09,0x0d,0x00,0x14,0x07,0x07,0xb8,0x01,0x80,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01, -0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x13,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x01,0x03,0x7c,0xfe,0x6e,0x6f,0x5e,0x90,0x74,0xe9,0xab,0x89,0x7c,0xfd,0xa0,0xbb,0xea,0x6c,0x71,0x01,0x96,0x05,0x5f,0xfd,0xdf,0x97,0xd8,0x5a,0x6a,0x88,0x01,0x3b,0x57,0xd3,0xac,0xe3,0xaf,0x7c,0x01,0x07,0x98,0x02,0x27,0x00,0x02, -0x00,0x7d,0xff,0xe8,0x04,0x96,0x05,0xb5,0x00,0x03,0x00,0x18,0x00,0x58,0x40,0x13,0x03,0x00,0x15,0x16,0x01,0x02,0x0b,0x0c,0x00,0x16,0x02,0x0c,0x0c,0x02,0x16,0x00,0x04,0x1a,0x04,0xb8,0x01,0x85,0x40,0x13,0x12,0x0c,0x0b,0x00,0x03,0x02,0x01,0x0b,0x03,0x01,0x01,0x03,0x0b,0x03,0x0e,0x16,0x15,0x07,0x08,0xb8,0x01,0x80,0xb1,0x0e, -0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x01,0x17,0x01,0x25,0x14,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x37,0x17,0x06,0x02,0x02, -0x1d,0x01,0xb1,0x71,0xfe,0x52,0xfe,0x8a,0x72,0xc8,0x78,0x61,0xa7,0x51,0x70,0xce,0xf5,0xae,0xfe,0xef,0x97,0xdc,0xca,0x70,0xad,0xcb,0x02,0x68,0x01,0x8c,0x73,0xfe,0x75,0x9a,0x99,0xf0,0x84,0x49,0x43,0x73,0xb4,0xab,0x01,0x3c,0xcc,0xe6,0x01,0x97,0x9d,0x75,0x84,0xfe,0x90,0x00,0x00,0x02,0x00,0x82,0x00,0xd7,0x04,0x4f,0x04,0x89, -0x00,0x0f,0x00,0x1c,0x00,0x22,0x40,0x09,0x08,0x89,0x10,0x10,0x1e,0x16,0x89,0x00,0x19,0xb8,0x01,0x80,0xb4,0x0c,0x13,0x9b,0x04,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14, -0x16,0x33,0x32,0x36,0x36,0x82,0x81,0xe3,0x83,0x81,0xe3,0x82,0x84,0xe2,0x80,0x81,0xe3,0x83,0x03,0x26,0xb9,0x86,0x84,0xbc,0xbb,0x85,0x55,0x94,0x56,0x02,0xb0,0x7d,0xda,0x82,0x80,0xdc,0x7d,0x7e,0xdc,0x7f,0x80,0xdc,0x7d,0x84,0xbc,0xbc,0x84,0x82,0xbd,0x54,0x96,0x00,0x00,0x02,0x00,0x82,0xff,0xe2,0x03,0x7f,0x05,0x7d,0x00,0x15, -0x00,0x21,0x00,0x3b,0x40,0x0e,0x08,0x8a,0x13,0x12,0x16,0x12,0x16,0x12,0x23,0x0e,0x1c,0x89,0x00,0x1f,0xb8,0x01,0x80,0x40,0x0d,0x0e,0x04,0x0c,0x0c,0x13,0x19,0x9b,0x04,0x06,0x12,0x9a,0x13,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x13, -0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x27,0x1e,0x02,0x17,0x07,0x24,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x82,0x69,0xb2,0x67,0x65,0xb1,0x65,0x64,0xb2,0x65,0x68,0x47,0x1b,0x8c,0xe0,0x84,0x56,0xfe,0xcc,0xfe,0xac,0x02,0x58,0x7d,0x59,0x55,0x7f,0x7e,0x56,0x59,0x7d,0x03, -0xe5,0x6c,0xbe,0x6e,0x69,0xb1,0x62,0x64,0xae,0x68,0x33,0x72,0xe3,0xc1,0x3c,0x86,0x92,0x02,0x27,0x01,0x66,0x5c,0x84,0x8b,0x63,0x58,0x7c,0x87,0x00,0x02,0x00,0x96,0xff,0xe2,0x03,0x93,0x05,0x7d,0x00,0x17,0x00,0x23,0x00,0x3d,0x40,0x0f,0x03,0x04,0x0a,0x00,0x89,0x1e,0x04,0x1e,0x04,0x1e,0x25,0x18,0x89,0x10,0x1b,0xb8,0x01,0x80, -0x40,0x0d,0x0a,0x14,0x0c,0x0c,0x03,0x21,0x9b,0x14,0x06,0x04,0x9a,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x31,0x30,0x01,0x10,0x00,0x05,0x27,0x36,0x36,0x37,0x15,0x36,0x37,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16, -0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x93,0xfe,0xaa,0xfe,0xcf,0x55,0x68,0xbc,0x44,0x74,0x2e,0x49,0x67,0x65,0xb1,0x65,0x67,0xb0,0x64,0x66,0xb3,0x69,0xfd,0xaa,0x7d,0x57,0x57,0x7d,0x7d,0x57,0x58,0x7c,0x03,0xe5,0xfe,0xb7,0xfd,0xd7,0x91,0x86,0x31,0x90,0x4f,0x01,0x91,0xb2,0x33,0x67,0xaf,0x64, -0x64,0xb1,0x67,0x6e,0xbe,0x50,0x5d,0x85,0x7d,0x57,0x62,0x8c,0x83,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0x4c,0x05,0x7d,0x00,0x33,0x00,0x57,0x40,0x1a,0x11,0x10,0x14,0x89,0x0d,0x22,0x32,0x8a,0x33,0x29,0x8a,0x2a,0x10,0x0d,0x33,0x2a,0x2a,0x33,0x0d,0x10,0x04,0x35,0x07,0x89,0x1b,0x0a,0xb8,0x01,0x81,0x40,0x11,0x10,0x22,0x11, -0x17,0x11,0x17,0x11,0x1f,0x2a,0x33,0x18,0x2e,0x04,0x9b,0x25,0x1f,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36, -0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x02,0xaf,0x31,0x4f,0x27,0x5c,0x82,0x4c,0x36,0x17,0x1c,0x2e,0x27,0x33,0x52,0x77,0x80,0x5a,0x50,0x8b,0x4f,0x61,0xb4,0x74,0x4f, -0x86,0x1d,0x2a,0x7f,0x4e,0xa1,0xb7,0xa4,0x69,0x46,0x4a,0x5c,0xa4,0x03,0xe7,0x3f,0x76,0x45,0xc8,0x91,0x6d,0x9d,0x26,0x19,0x16,0x2e,0x11,0x8d,0x04,0x87,0x57,0x5f,0x88,0x77,0xc7,0x74,0x8f,0xe5,0x81,0x53,0x40,0x48,0x4b,0xc0,0xa2,0xfb,0xe5,0x04,0x1b,0x4f,0x77,0x8d,0x6d,0xfc,0x19,0x00,0x00,0x02,0x00,0x64,0xff,0xe5,0x05,0x0b, -0x05,0xa9,0x00,0x17,0x00,0x23,0x00,0x53,0x40,0x29,0x1e,0x89,0x00,0x10,0x89,0x18,0x0b,0x8b,0x0a,0x08,0x1b,0x03,0x03,0x00,0x0d,0x18,0x0a,0x00,0x18,0x0a,0x0a,0x18,0x00,0x03,0x25,0x06,0x89,0x05,0x0b,0x05,0x05,0x08,0x03,0x0d,0x1b,0x04,0x14,0x0a,0x06,0x07,0x21,0xb8,0x01,0x80,0xb1,0x14,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17, -0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x12,0x05,0x36,0x13,0x17,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01, -0x27,0x95,0x84,0xee,0xee,0xa6,0xa6,0x01,0x1e,0xc3,0xe1,0x99,0xd6,0xde,0x85,0x93,0x72,0xc3,0x6f,0x6f,0xc1,0x74,0x02,0xa0,0x8c,0x70,0x73,0x8a,0x94,0x69,0x67,0x95,0x01,0x60,0x87,0xfa,0x57,0x94,0x01,0x9b,0x42,0xfe,0xa2,0xb0,0x6d,0x01,0x87,0x43,0xfe,0x8d,0xa2,0x64,0xf1,0x74,0x6e,0xb5,0x66,0x65,0xb1,0x72,0x5f,0xc7,0x3f,0x38, -0xcf,0x6b,0x5c,0x84,0x8b,0x00,0x00,0x03,0x00,0x64,0xff,0xe5,0x05,0x23,0x05,0x7d,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x6e,0x40,0x39,0x37,0x89,0x0a,0x1d,0x89,0x25,0x12,0x89,0x31,0x19,0x18,0x3a,0x28,0x03,0x08,0x04,0x0a,0x25,0x15,0x1b,0x31,0x18,0x0a,0x25,0x31,0x18,0x18,0x31,0x25,0x0a,0x04,0x3e,0x06,0x05,0x2b,0x89,0x00,0x18, -0x05,0x08,0x3a,0x15,0x03,0x28,0x1b,0x06,0x06,0x19,0x06,0x19,0x06,0x21,0x34,0x9b,0x0e,0x06,0x2e,0xb8,0x01,0x80,0xb1,0x21,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x32,0x33,0x01,0x2f,0xed,0xc6,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x17,0x39,0x11,0x33,0x10,0xed, -0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16, -0x17,0x36,0x36,0x01,0x0b,0x7d,0x6e,0xc8,0xca,0x86,0x80,0x8c,0x49,0x63,0xaa,0x61,0x5c,0xa4,0x60,0x89,0x5f,0x73,0xba,0x63,0x88,0x60,0x82,0x48,0x66,0xb0,0x64,0x65,0xb0,0x67,0x02,0x50,0x50,0x43,0x7d,0x97,0x7c,0x57,0x56,0x7e,0x79,0x6d,0x4c,0x52,0x74,0x4f,0x45,0x6a,0x81,0x01,0x47,0x57,0xb0,0x47,0x59,0x01,0x24,0x65,0xe0,0x56, -0x62,0x78,0x5d,0xa5,0x60,0x64,0xab,0x60,0x5d,0xb5,0x3b,0x2b,0xa3,0x89,0x65,0xaa,0x5c,0x7e,0x62,0x55,0x98,0x59,0x60,0xa4,0x42,0x54,0x9f,0x32,0x29,0x95,0x4b,0x53,0x74,0x62,0x03,0x2c,0x56,0x7d,0x74,0x52,0x3f,0x8a,0x3d,0x38,0x89,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x04,0xe2,0x05,0x7d,0x00,0x2f,0x00,0x57,0x40,0x16,0x12,0x89, -0x1f,0x2c,0x89,0x05,0x1f,0x05,0x1f,0x05,0x24,0x31,0x19,0x18,0x18,0x00,0x0c,0x89,0x24,0x18,0x19,0x1c,0xb8,0x01,0x80,0x40,0x0f,0x15,0x0c,0x28,0x1f,0x15,0x19,0x15,0x19,0x15,0x00,0x09,0x9b,0x28,0x06,0x01,0xb8,0x01,0x81,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x11,0x33, -0x01,0x2f,0xed,0xc4,0x39,0x2f,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x33,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15, -0x10,0x00,0x21,0x64,0xcc,0x01,0x42,0x01,0xc7,0x56,0x94,0x56,0x57,0x7e,0x37,0x2e,0x43,0x4b,0xc1,0x86,0x61,0xc1,0x42,0x86,0x36,0x75,0x33,0x44,0x5c,0x76,0x3a,0x42,0x66,0xaf,0x66,0x81,0xe4,0x84,0xfd,0xd4,0xfe,0x7a,0xa7,0x01,0x9f,0x01,0x27,0x63,0xad,0x64,0x54,0x3c,0x17,0x39,0x1a,0x26,0x6b,0x3a,0x77,0xa7,0x77,0x76,0x55,0x50, -0x57,0x46,0x2f,0x3e,0x3d,0x1f,0x6e,0x3d,0x4f,0x8b,0x50,0x90,0xf5,0x8b,0xfe,0x94,0xfd,0xff,0x00,0x02,0x00,0x64,0xff,0xe5,0x04,0xed,0x05,0x7d,0x00,0x27,0x00,0x33,0x00,0x50,0x40,0x13,0x24,0x89,0x05,0x15,0x89,0x2e,0x05,0x2e,0x00,0x00,0x2e,0x05,0x03,0x35,0x28,0x0d,0x8a,0x1c,0x2b,0xb8,0x01,0x80,0x40,0x10,0x18,0x31,0x9b,0x12, -0x0f,0x12,0x18,0x12,0x18,0x12,0x00,0x09,0x9b,0x20,0x06,0x01,0xb8,0x01,0x80,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x17,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15, -0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x10,0x00,0x21,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x64,0x95,0x01,0x5e,0x01,0xef,0x73,0xcc,0x72,0x69,0xb8,0x6b,0x09,0x27,0x7d,0x4a,0x77,0xa0,0xa0,0x70,0x6e,0xc4,0x71,0x99,0x01,0x06, -0x92,0x9f,0x01,0x17,0xa2,0xfd,0xab,0xfe,0x61,0x79,0x11,0x53,0x31,0x2e,0x3b,0x46,0x2a,0x30,0x50,0x1b,0x9c,0x01,0xad,0x01,0x32,0x66,0xb3,0x68,0x5e,0xa2,0x5e,0x18,0x26,0x43,0x54,0x9a,0x69,0x6b,0x98,0x75,0xc9,0x6f,0x86,0xec,0x88,0x92,0xfd,0x8e,0xfe,0x8b,0xfd,0xfa,0x02,0xcb,0x1b,0x24,0x40,0x28,0x26,0x36,0x4c,0x00,0x00,0x01, -0x00,0xb4,0x00,0x00,0x04,0x5a,0x05,0x42,0x00,0x05,0x00,0x16,0x40,0x0a,0x01,0x04,0x89,0x05,0x05,0x18,0x03,0x9b,0x00,0x06,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xfd,0xc4,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x23,0xb4,0x03,0xa6,0xfd,0x02,0xa8,0x05,0x42,0x99,0xfb,0x57,0x00,0x00,0x01,0x00,0x82,0xff,0xe2,0x03,0xf2,0x05,0x62,0x00,0x16, -0x00,0x3b,0x40,0x1d,0x04,0x03,0x0c,0x08,0x89,0x13,0x12,0x0c,0x00,0x05,0x12,0x05,0x12,0x18,0x0f,0x89,0x00,0x0c,0x05,0x0b,0x0b,0x03,0x12,0x99,0x13,0x19,0x06,0x03,0x06,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0xed,0x11,0x33,0x33,0x31,0x30,0x13,0x34,0x12, -0x37,0x33,0x01,0x11,0x33,0x11,0x14,0x06,0x23,0x01,0x06,0x06,0x15,0x14,0x00,0x17,0x07,0x26,0x24,0x02,0x82,0xb1,0x9b,0x1b,0x01,0x62,0xa7,0x1e,0x13,0xfe,0x14,0x56,0x54,0x01,0x19,0xec,0x43,0xac,0xfe,0xe0,0x9f,0x02,0xe5,0xac,0x01,0x58,0x79,0xfe,0x8f,0x01,0x71,0xfd,0x5b,0x0b,0x13,0x01,0xf5,0x51,0xde,0x80,0xcd,0xfe,0xb1,0x51, -0x96,0x3b,0xf3,0x01,0x35,0x00,0x00,0x02,0x00,0x77,0xff,0xe8,0x04,0x41,0x05,0x48,0x00,0x0b,0x00,0x17,0x00,0x20,0x40,0x10,0x00,0x89,0x0c,0x0c,0x19,0x12,0x89,0x06,0x09,0x99,0x0f,0x06,0x15,0x99,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33, -0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0x41,0xfb,0xeb,0xea,0xfa,0xfa,0xea,0xeb,0xfb,0xab,0x9a,0xa1,0xa1,0x98,0x97,0xa2,0xa2,0x99,0x02,0x97,0xfe,0xa8,0xfe,0xa9,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x58,0xfe,0xa8,0xfe,0xa7,0x01,0x17,0x01,0x06,0xfe,0xf7,0xfe,0xec,0xfe,0xeb,0xfe,0xfc,0x01, -0x02,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x05,0x94,0x05,0x31,0x00,0x1d,0x00,0x21,0x00,0x2d,0x00,0x57,0x40,0x30,0x21,0x89,0x14,0x19,0x0a,0x89,0x2d,0x1e,0x2d,0x00,0x89,0x07,0x14,0x2d,0x03,0x07,0x17,0x17,0x07,0x03,0x2d,0x14,0x05,0x2f,0x26,0x89,0x11,0x09,0x23,0x9b,0x14,0x19,0x21,0x21,0x0d,0x18,0x20,0x9b,0x15,0x06,0x2a,0x99, -0x0d,0x18,0x04,0x99,0x03,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x35,0x32,0x36,0x35,0x10,0x21,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37, -0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x16,0x16,0x01,0x11,0x21,0x11,0x05,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x05,0x94,0xdd,0xae,0x68,0x78,0xfe,0xc6,0xd0,0xd0,0x6e,0xce,0x83,0x8d,0x7d,0x03,0x58,0xfe,0xfd,0x39,0x72,0xc5,0x75,0xfd,0x73,0xfe,0xfb,0x01,0x05,0xfe,0xc8,0x61,0x6f,0x56,0x85,0x3b,0x79,0x79,0x01, -0xc0,0xc9,0xf5,0x02,0x95,0x92,0x89,0x01,0x04,0xd5,0xff,0xe0,0x88,0xe7,0x71,0x86,0xb7,0x13,0x02,0x01,0x94,0xfe,0xab,0x65,0xb8,0x01,0x1d,0x01,0x55,0xfe,0xab,0x94,0x72,0x62,0x49,0x9c,0x66,0xad,0xbe,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x05,0xf0,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x62,0xb4,0x23,0x89,0x0d,0x13,0x16,0xb8,0x01, -0x84,0x40,0x0f,0x2f,0x2a,0x89,0x04,0x00,0x0d,0x2f,0x04,0x04,0x2f,0x0d,0x00,0x04,0x3c,0x35,0xbe,0x01,0x84,0x00,0x1c,0x00,0x32,0x01,0x7e,0x00,0x13,0x00,0x38,0x01,0x7e,0x40,0x12,0x19,0x08,0x27,0x27,0x19,0x13,0x19,0x13,0x19,0x01,0x10,0x9b,0x20,0x06,0x2d,0x99,0x01,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11, -0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15, -0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xf0,0xfb,0xe3,0xc7,0xa3,0x45,0x70,0x90,0x96,0x90,0x70,0x45,0xb7,0x9b,0x4d,0x6f,0x33,0x84,0x7d,0x98,0x6d,0x69,0x8b,0x89,0xda,0x88,0xe2,0x01,0x16,0x83,0xf2,0xad,0x8d,0x70,0x56,0x82,0x04,0x04,0xfb,0xcf,0x46,0x2d,0x2f,0x44,0x43,0x30,0x2f, -0x44,0x60,0x6e,0x4a,0x61,0x42,0x2e,0x2d,0x36,0x52,0x7a,0x5a,0x90,0xa5,0x30,0x2f,0x04,0x80,0x7c,0x61,0x8a,0x97,0x6a,0x7d,0xe0,0x76,0xf2,0xc9,0x8a,0xd0,0x79,0x2e,0x25,0x3f,0x2c,0x2e,0x23,0x02,0xbf,0x31,0x47,0x48,0x30,0x33,0x45,0x45,0x00,0x01,0x00,0x8c,0x00,0x00,0x05,0xd1,0x05,0x31,0x00,0x20,0x00,0x51,0x40,0x2b,0x16,0x0c, -0x89,0x0d,0x1f,0x1c,0x89,0x05,0x14,0x00,0x05,0x0d,0x01,0x05,0x05,0x01,0x0d,0x03,0x22,0x10,0x89,0x11,0x02,0x1f,0x99,0x01,0x08,0x9b,0x16,0x01,0x19,0x19,0x12,0x01,0x18,0x15,0x0f,0x9b,0x12,0x06,0x0d,0x11,0x18,0x00,0x3f,0x33,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f, -0x2f,0x2f,0x11,0x39,0x39,0x10,0xed,0x32,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x05,0xd1,0xfd,0xf0,0x61,0x84,0x7b,0x6b,0x47,0x54,0x3d,0xa8,0xfe,0xf4,0xa8,0x02,0xce,0x72, -0x3e,0x64,0x45,0xa8,0xd7,0x45,0x38,0x01,0x00,0x95,0x0d,0xbe,0x7a,0x81,0x9b,0x1e,0x32,0xfd,0x5a,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfe,0xb5,0x20,0x19,0xe8,0xaf,0x5e,0xbf,0x43,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x05,0xa3,0x05,0x31,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x50,0x40,0x2b,0x18,0x89,0x0c,0x11,0x02,0x89,0x24,0x15, -0x24,0x00,0x89,0x12,0x0c,0x24,0x0f,0x12,0x12,0x0f,0x24,0x0c,0x04,0x26,0x1e,0x89,0x09,0x01,0x1a,0x9b,0x11,0x0c,0x18,0x18,0x05,0x10,0x17,0x9b,0x13,0x0d,0x06,0x21,0x99,0x05,0x18,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10, -0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x21,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x33,0x01,0x11,0x21,0x11,0x05,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x05,0xa3,0xfe,0x20,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x02,0xd0,0x6d,0x01,0x38,0xa8,0xfd,0x78,0xfe,0xed, -0x01,0x13,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0x02,0xb4,0x90,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0x94,0xfe,0xab,0x01,0xe9,0xfe,0x17,0x01,0x55,0xfe,0xab,0x94,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0x00,0x01,0x00,0x8c,0xfd,0xb9,0x07,0x18,0x07,0x21,0x00,0x34,0x00,0x62,0x40,0x35,0x19,0x89,0x1a,0x1f, -0x15,0x89,0x16,0x24,0x8a,0x0f,0x34,0x8a,0x00,0x1d,0x16,0x0f,0x1a,0x16,0x0f,0x00,0x00,0x0f,0x16,0x1a,0x04,0x36,0x08,0x89,0x2c,0x1e,0x18,0x9b,0x1b,0x04,0x9b,0x30,0x1b,0x12,0x9b,0x1f,0x21,0x00,0x21,0x00,0x1a,0x1b,0x06,0x0c,0x99,0x28,0x16,0x1a,0x18,0x00,0x3f,0x33,0xd4,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x39,0xed,0x10,0xd4, -0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x02,0x02,0x24,0x23,0x22,0x04,0x02,0x11,0x10,0x12,0x04,0x33,0x20,0x00,0x11,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x33,0x32,0x16, -0x15,0x14,0x02,0x04,0x23,0x20,0x00,0x02,0x11,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x13,0x06,0x76,0x07,0xa4,0xfe,0xde,0xba,0xd3,0xfe,0xc7,0xad,0x9d,0x01,0x1e,0xc8,0x01,0x0b,0x01,0x2e,0x5d,0x4f,0x70,0x37,0xa8,0xee,0xa8,0x02,0xb0,0x72,0x53,0x55,0xa1,0xae,0xb5,0xfe,0xb2,0xd6,0xfe,0xff,0xfe,0x93,0xc3,0xd3,0x01,0x8c,0x01,0x10, -0xe3,0x01,0x63,0xcb,0x0c,0x03,0x1d,0x01,0x03,0x01,0x91,0xdc,0xf7,0xfe,0x22,0xfe,0xbc,0xfe,0xb2,0xfe,0x1c,0xf5,0x01,0x6b,0x01,0x4f,0x72,0x8c,0x51,0xfe,0x4c,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfd,0xaa,0x51,0xe9,0xdd,0xed,0xfe,0x96,0xc2,0x01,0x18,0x02,0x22,0x01,0x81,0x01,0x71,0x02,0x22,0x01,0x1a,0xfe,0xfe,0x2c,0xfe,0xce, -0x00,0x03,0x00,0x50,0x00,0x00,0x07,0x45,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x3e,0x00,0x7a,0x40,0x44,0x3e,0x89,0x2d,0x03,0x23,0x89,0x3a,0x3b,0x3a,0x06,0x1d,0x89,0x1e,0x10,0x0d,0x89,0x17,0x2d,0x3a,0x1e,0x01,0x13,0x17,0x12,0x12,0x17,0x13,0x01,0x1e,0x3a,0x2d,0x07,0x40,0x34,0x89,0x2a,0x14,0x10,0x99,0x13,0x19,0x9b,0x06,0x13, -0x0a,0x0a,0x2e,0x13,0x18,0x22,0x30,0x9b,0x03,0x2d,0x3e,0x3e,0x26,0x02,0x3d,0x9b,0x2e,0x06,0x37,0x99,0x26,0x18,0x1e,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32, -0x10,0xed,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x15,0x23,0x11,0x16,0x16,0x17,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x21,0x35,0x36,0x36,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x01,0x23,0x22,0x06,0x06,0x15, -0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x21,0x11,0x04,0x30,0x6d,0x52,0x75,0x32,0x23,0x50,0x53,0x48,0x94,0xaf,0x3a,0x30,0xa2,0xfe,0xc3,0x28,0x33,0xa1,0x59,0x64,0xa8,0x49,0x51,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x01,0xbb,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0xfe,0xed,0x05,0x31,0x94,0xfe,0xa9,0x0a,0x43,0x40,0x42,0x4d, -0x23,0xd1,0xab,0x64,0xbb,0x3b,0x95,0x93,0x39,0xb3,0x58,0x01,0x00,0x9f,0x95,0xfe,0x5d,0x01,0x94,0x82,0x7e,0x18,0x88,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0xfd,0x83,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0xff,0x01,0x55,0xfe,0xab,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x05,0x5f,0x05,0x31,0x00,0x1a,0x00,0x26, -0x00,0x41,0x40,0x23,0x0f,0x89,0x1b,0x02,0x89,0x03,0x1b,0x03,0x00,0x00,0x03,0x1b,0x03,0x28,0x09,0x21,0x89,0x15,0x1e,0x9b,0x09,0x0c,0x0c,0x12,0x01,0x05,0x9b,0x19,0x06,0x24,0x99,0x12,0x18,0x03,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10, -0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x02,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x11,0x34,0x12,0x24,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x5f,0xab,0xa8,0xed,0x99,0xf7,0x90,0x08,0x2c,0x88,0x44,0x96,0xb7,0xbe,0x91,0xcb,0xd2,0xbd,0x01,0x47,0xc3, -0x02,0x48,0xfd,0x32,0x63,0x45,0x47,0x77,0x2a,0x0a,0x79,0x6b,0x44,0x5e,0x04,0x9d,0xfb,0x63,0x04,0x9d,0x8d,0xfe,0xfc,0xa8,0x2b,0x33,0xbf,0x9c,0x9e,0xc8,0x01,0x21,0x01,0x1e,0xd0,0x01,0x5e,0xc3,0xfc,0x27,0x54,0x82,0x3c,0x30,0x8d,0xa0,0x74,0x00,0x00,0x03,0x00,0x32,0xff,0x00,0x06,0xe6,0x05,0x31,0x00,0x2a,0x00,0x34,0x00,0x40, -0x00,0x78,0x40,0x2c,0x29,0x01,0x89,0x02,0x28,0x89,0x11,0x04,0x89,0x2b,0x14,0x17,0x89,0x35,0x3b,0x8a,0x1e,0x0f,0x11,0x2b,0x02,0x11,0x2b,0x35,0x1e,0x1e,0x35,0x2b,0x11,0x02,0x05,0x42,0x2f,0x89,0x0b,0x2a,0x06,0x04,0x2c,0x9b,0x0e,0x28,0x0e,0x3e,0xb8,0x01,0x80,0x40,0x13,0x1a,0x14,0x1a,0x22,0x0e,0x1a,0x0e,0x1a,0x07,0x38,0x9b, -0x22,0x06,0x32,0x99,0x07,0x19,0x02,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x06, -0x00,0x21,0x22,0x24,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x35,0x34,0x02,0x27,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x07,0x33,0x11,0x01,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x24,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0xe6,0xa8,0xfb,0x59, -0xfe,0x6c,0xfe,0xef,0x8d,0xfe,0xfd,0x83,0xba,0x9a,0x03,0x3c,0x07,0x80,0x78,0x25,0x1b,0xbf,0x92,0x5f,0x97,0x56,0x66,0xc1,0x84,0xb7,0x01,0x0d,0x92,0x06,0xcf,0xfe,0x58,0xfc,0xcb,0x36,0x43,0xd2,0xc5,0xaf,0x01,0x06,0xc9,0x67,0x44,0x44,0x66,0x60,0x4a,0x4b,0x60,0x05,0x31,0xf9,0xf9,0x01,0xdc,0xf9,0xfe,0xf3,0x6e,0xb8,0x75,0x74, -0x8c,0x60,0x31,0xb9,0x01,0x09,0x46,0x25,0x52,0x36,0xa2,0xc1,0x55,0x9f,0x70,0x6d,0xa9,0x5f,0xad,0xfe,0xb1,0xee,0x30,0x48,0x03,0x96,0xfb,0xd5,0x4b,0x35,0x74,0x7d,0xb6,0x03,0x30,0x53,0x7f,0x7d,0x55,0x52,0x6c,0x6e,0x00,0x04,0x00,0x50,0xff,0xe4,0x07,0x4d,0x05,0x31,0x00,0x30,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x91,0x40,0x50, -0x40,0x89,0x20,0x13,0x15,0x08,0x41,0x26,0x03,0x03,0x23,0x23,0x03,0x25,0x15,0x89,0x3c,0x3d,0x3c,0x44,0x8a,0x11,0x0b,0x8a,0x49,0x30,0x00,0x2d,0x8a,0x03,0x00,0x49,0x03,0x20,0x3c,0x11,0x49,0x03,0x03,0x49,0x11,0x3c,0x20,0x05,0x4e,0x36,0x89,0x1d,0x14,0x32,0x9b,0x25,0x20,0x40,0x40,0x19,0x23,0x3f,0x9b,0x21,0x06,0x9b,0x08,0x41, -0x29,0x29,0x0e,0x21,0x06,0x39,0x99,0x19,0x18,0x47,0x99,0x0e,0x18,0x00,0x30,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33, -0x10,0xed,0x32,0x11,0x39,0x2f,0x12,0x17,0x39,0x12,0x39,0x10,0xed,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x07, -0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x23,0x11,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x26,0x06,0x43,0x2d,0x3b,0x87,0x73,0x4d,0x42,0x69,0x78,0x88,0x79,0x80,0x9b,0x31,0x9b,0x4b,0xa2,0x87,0x7f,0xc8,0x72,0x72,0x6c,0x02,0xbc,0x6d,0xea,0x3f,0xa8,0x61,0x72,0xc0,0x6c,0x47,0x3d, -0xfc,0x0c,0x63,0x95,0x9b,0x46,0x9c,0x86,0x65,0x52,0xff,0x02,0xf9,0x25,0x20,0x44,0x30,0x62,0x2a,0x46,0x2c,0x43,0xff,0x70,0xca,0xca,0x47,0x35,0xdf,0x8e,0xb4,0xd5,0xe1,0xc0,0x8d,0x86,0x90,0xd0,0xe5,0x6f,0x70,0xd5,0x92,0x86,0xa4,0x2a,0x02,0x06,0x94,0xfe,0xab,0x57,0x65,0x83,0xeb,0x99,0xa0,0xfe,0xda,0x53,0x02,0xd0,0x28,0x5d, -0x5c,0x93,0xab,0xc1,0xf3,0xff,0x01,0x55,0xfe,0xab,0x98,0x33,0x7c,0x65,0x74,0x93,0xf1,0x47,0x80,0x5a,0x00,0x02,0x00,0x72,0xff,0xe5,0x05,0x5b,0x04,0xc9,0x00,0x0f,0x00,0x1f,0x00,0x23,0x40,0x0d,0x0c,0x8b,0x1c,0x1c,0x21,0x14,0x8b,0x04,0x10,0x9b,0x08,0x06,0x18,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f, -0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x02,0xe6,0xa6,0xfe,0xdc,0xaa,0xa9,0x01,0x25,0xa6,0xa8,0x01,0x24,0xa9,0xa9,0xfe,0xdb,0xa7,0x7f,0xda,0x80,0x7f,0xda,0x80,0x7f, -0xda,0x80,0x80,0xd9,0x1b,0xa6,0x01,0x21,0xab,0xa9,0x01,0x22,0xa7,0xa7,0xfe,0xdd,0xa8,0xa8,0xfe,0xdd,0xa7,0x04,0x5b,0x7f,0xdf,0x81,0x80,0xdd,0x7e,0x7d,0xdd,0x81,0x81,0xe0,0x7e,0x00,0x00,0x01,0x00,0x74,0xff,0xe6,0x06,0x74,0x04,0xc9,0x00,0x1b,0x00,0x3e,0xb4,0x07,0x06,0x15,0x16,0x12,0xb8,0x01,0x85,0x40,0x0a,0x18,0x06,0x16, -0x18,0x18,0x16,0x06,0x03,0x1d,0x04,0xb8,0x01,0x85,0x40,0x0b,0x0a,0x00,0x9b,0x0e,0x06,0x16,0x06,0x06,0x15,0x07,0x19,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x22,0x04,0x06,0x15,0x10,0x05,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32, -0x04,0x12,0x15,0x14,0x02,0x07,0x27,0x24,0x11,0x34,0x26,0x24,0x03,0x74,0xaa,0xfe,0xe8,0xa0,0x01,0x32,0x62,0xaf,0xbf,0xc1,0x01,0x61,0xde,0xe0,0x01,0x60,0xc0,0xbf,0xb0,0x61,0x01,0x31,0xa0,0xfe,0xea,0x04,0x33,0x89,0xef,0x88,0xfe,0xef,0xc2,0x7a,0x6a,0x01,0x37,0xac,0xb7,0x01,0x32,0xad,0xaf,0xfe,0xcf,0xb6,0xac,0xfe,0xc8,0x69, -0x7a,0xc2,0x01,0x11,0x88,0xef,0x89,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x06,0x3d,0x04,0xdc,0x00,0x1e,0x00,0x2a,0x00,0x45,0xb9,0x00,0x19,0x01,0x85,0x40,0x12,0x05,0x08,0x0a,0x8b,0x1f,0x25,0x8b,0x11,0x05,0x1f,0x11,0x11,0x1f,0x05,0x03,0x2c,0x00,0x28,0xb8,0x01,0x80,0x40,0x0c,0x08,0x0e,0x0e,0x15,0x00,0x99,0x1e,0x18,0x22,0x9b, -0x15,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x37,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x21,0x01,0x34,0x26,0x27, -0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x60,0x03,0x61,0x87,0xe4,0x72,0xb2,0x8d,0x2c,0x4e,0x81,0x4b,0x72,0x9c,0x66,0xb0,0x5f,0x99,0x01,0x21,0xab,0x9b,0xfe,0xcd,0xae,0xfc,0x9f,0x03,0x91,0x31,0x2f,0x40,0x57,0x4b,0x32,0x33,0x47,0x97,0x7d,0xd7,0x8e,0x95,0xf7,0x31,0x44,0x45,0x42,0x81,0x4b,0x9f,0x73,0x55,0x88,0x4e,0xac,0xfe, -0xe0,0xa5,0xb1,0xfe,0xee,0xa8,0x03,0xb1,0x28,0x4e,0x1f,0x0b,0x57,0x33,0x33,0x47,0x47,0x00,0x00,0x01,0x00,0x58,0xff,0xe7,0x03,0xcf,0x04,0xc9,0x00,0x28,0x00,0x53,0x40,0x2c,0x23,0x8b,0x17,0x00,0x8b,0x0e,0x26,0x0e,0x12,0x17,0x0e,0x0e,0x17,0x12,0x03,0x2a,0x1c,0x1d,0x07,0x06,0x06,0x07,0x26,0x12,0x9b,0x13,0x1d,0x1c,0x07,0x13, -0x1c,0x1c,0x13,0x07,0x03,0x1f,0x0a,0x99,0x04,0x19,0x1a,0x9b,0x1f,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x39,0x11,0x33,0x01,0x2f,0x33,0xc6,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36, -0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x03,0xcf,0x75,0xca,0x7b,0xd9,0xe4,0x5a,0x65,0xab,0x53,0x51,0x81,0x4b,0x96,0x77,0xb6,0xb6,0x77,0x83,0x98,0x7d,0x7f,0x95,0x5c,0xa8,0xe6,0x72,0xba,0x68,0x49,0x50,0x4e,0x5e,0x01,0x54, -0x60,0xab,0x62,0xc6,0x7b,0x5b,0x50,0x39,0x64,0x3a,0x60,0x74,0x8d,0x6b,0x58,0x50,0x6d,0x74,0x64,0xa4,0x58,0x9a,0x5a,0x5f,0x84,0x2d,0x2a,0x98,0x00,0x02,0x00,0x73,0xff,0xe8,0x05,0x9f,0x04,0xec,0x00,0x0b,0x00,0x32,0x00,0x66,0x40,0x36,0x16,0x8b,0x0f,0x13,0x12,0x1d,0x8b,0x03,0x08,0x8b,0x23,0x2a,0x2b,0x1a,0x12,0x25,0x03,0x23, -0x0f,0x12,0x03,0x23,0x2b,0x2b,0x23,0x03,0x12,0x0f,0x05,0x34,0x2e,0x8b,0x28,0x2b,0x2a,0x06,0x9b,0x0c,0x1a,0x26,0x0c,0x20,0x2a,0x0c,0x2a,0x0c,0x13,0x00,0x9a,0x20,0x19,0x12,0x13,0x06,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, -0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x13,0x24,0x36,0x37,0x26,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x24,0x11,0x34,0x37,0x17,0x06,0x06, -0x15,0x14,0x16,0x16,0x17,0x02,0xfe,0x33,0x47,0x47,0x33,0x35,0x45,0x48,0x30,0x01,0x17,0xee,0x05,0x05,0x58,0x51,0x3e,0x7e,0x8b,0x6c,0xca,0xb8,0x27,0x39,0x9d,0x76,0x77,0x9b,0x37,0x27,0xfe,0x29,0x8a,0x5c,0x31,0x1d,0x5c,0xbf,0xb0,0x72,0x44,0x38,0x29,0x4d,0x0e,0x0f,0x4d,0x28,0x39,0x43,0x01,0xa6,0x3b,0xb0,0x7e,0x4f,0x77,0x31, -0x74,0x3c,0xc2,0x6d,0x74,0xaf,0x7d,0x33,0x1e,0x62,0x40,0x6f,0x97,0x98,0x6e,0x37,0x67,0x21,0x67,0x01,0x46,0xa9,0x71,0x66,0x2f,0x59,0x2c,0x4d,0x79,0x54,0x20,0x00,0x00,0x02,0x00,0x5d,0xff,0xc0,0x06,0x59,0x04,0xcd,0x00,0x33,0x00,0x3e,0x00,0x7f,0xb9,0x00,0x1a,0x01,0x84,0x40,0x0a,0x19,0x0a,0x8b,0x34,0x13,0x20,0x3a,0x8b,0x04, -0x00,0xb8,0x01,0x84,0x40,0x14,0x2c,0x02,0x0d,0x20,0x03,0x34,0x2c,0x04,0x2f,0x19,0x34,0x04,0x2f,0x2f,0x04,0x34,0x19,0x04,0x40,0x28,0xb8,0x01,0x84,0x40,0x0c,0x29,0x00,0x2c,0x28,0x2f,0x9b,0x30,0x06,0x29,0x28,0x19,0x3c,0xb8,0x01,0x81,0x40,0x0f,0x02,0x0d,0x25,0x19,0x25,0x19,0x07,0x16,0x99,0x1d,0x19,0x37,0x9b,0x07,0x06,0x00, -0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x39,0xed,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x02,0x17, -0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x27,0x2e,0x03,0x23,0x22,0x00,0x03,0x27,0x36,0x12,0x37,0x26,0x26,0x27,0x37,0x1e,0x02,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x36,0x02,0xbd,0x38,0x3a,0x51,0xa3,0x85,0x80,0xa1,0x6e,0x69,0x30,0x3f,0x2b,0x17,0x0b,0x11,0x05,0x24,0x20,0x29,0x31, -0x0e,0x8b,0x13,0x83,0x63,0x5e,0x79,0x13,0x1d,0x2d,0x40,0x49,0x33,0xe0,0xfe,0xc2,0x66,0x8f,0x3d,0xf0,0xa3,0x2d,0xc1,0x7c,0x21,0x55,0xba,0x9b,0x02,0x01,0x57,0x37,0x38,0x53,0x5e,0x51,0x6a,0x02,0xc8,0x0f,0x06,0x59,0x6d,0x7f,0xa4,0x9e,0x75,0x5e,0x91,0x27,0x25,0x65,0x82,0x82,0x43,0x44,0x16,0x1f,0x5a,0x61,0x18,0x96,0xa0,0x7f, -0x79,0xb5,0x7a,0x4d,0x21,0xfe,0xd0,0xfe,0xc7,0x25,0xdd,0x01,0x4f,0x55,0x9a,0xe7,0x32,0x88,0x14,0x90,0xdb,0x5f,0x38,0x54,0x55,0x41,0x64,0x3f,0x07,0x62,0x00,0x01,0x00,0x73,0x00,0x00,0x05,0xa9,0x04,0xbe,0x00,0x1e,0x00,0x38,0x40,0x1d,0x02,0x00,0x0a,0x13,0x1a,0x1a,0x13,0x0a,0x03,0x20,0x0e,0x17,0x8a,0x04,0x00,0x02,0x14,0x9b, -0x11,0x11,0x08,0x19,0x99,0x1c,0x18,0x0b,0x9b,0x08,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x21,0x21,0x15, -0x21,0x22,0x26,0x73,0xa7,0xa7,0x5c,0xa0,0x5f,0x97,0x7f,0x66,0x6a,0x97,0x7b,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0x01,0x04,0x03,0x8f,0xfc,0x56,0xbc,0xd0,0x01,0x42,0xbd,0x6b,0x6b,0xbe,0x50,0x8c,0x4f,0x92,0x59,0x54,0x5a,0x6f,0x97,0x77,0x61,0xb0,0x97,0xa8,0x00,0x00,0x01,0x00,0x70,0xff,0xe5,0x04,0x44,0x04,0xc9,0x00,0x2e,0x00,0x54, -0xb3,0x04,0x8a,0x03,0x22,0xb8,0x01,0x85,0x40,0x0d,0x14,0x1a,0x8b,0x1b,0x03,0x14,0x1b,0x1b,0x14,0x03,0x03,0x30,0x2c,0xb8,0x01,0x85,0x40,0x11,0x0b,0x2c,0x07,0x03,0x14,0x1b,0x1e,0x03,0x1b,0x03,0x1b,0x07,0x17,0x9b,0x1e,0x06,0x00,0xb8,0x01,0x80,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39, -0x11,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x32,0x36,0x37,0x33,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x0e,0x03,0x07,0x0e,0x02,0x15,0x14,0x16,0x02,0x56, -0x95,0xa1,0x16,0xa2,0x18,0xfe,0xff,0xd5,0x8b,0xdf,0x7c,0x2e,0x5c,0x9a,0x95,0x8b,0x6f,0x3b,0xa5,0x6e,0x75,0x97,0x0d,0x9b,0xf9,0xbb,0x7b,0xc6,0x72,0x24,0x3d,0x59,0x6f,0x81,0x94,0x71,0x3e,0xad,0x7d,0x7c,0x7b,0xbd,0xd2,0x56,0x9e,0x6b,0x49,0x71,0x54,0x42,0x22,0x20,0x32,0x44,0x32,0x4c,0x6a,0x74,0x68,0xa1,0xd0,0x59,0x9b,0x53, -0x40,0x5f,0x48,0x33,0x27,0x1e,0x21,0x35,0x4d,0x38,0x5f,0x6c,0x00,0x01,0x00,0x74,0xff,0xe7,0x06,0x8b,0x04,0xc9,0x00,0x20,0x00,0x42,0xb1,0x03,0x06,0xb8,0x01,0x85,0x40,0x0c,0x1d,0x12,0x20,0x1d,0x01,0x01,0x1d,0x20,0x12,0x04,0x22,0x15,0xb8,0x01,0x85,0xb5,0x0e,0x12,0x11,0x11,0x00,0x19,0xb8,0x01,0x81,0xb6,0x0a,0x19,0x20,0x03, -0x9b,0x00,0x06,0x00,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x15,0x21,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x02,0x27,0x03,0x21,0x03, -0x6a,0xfd,0xd4,0x7c,0x81,0xa4,0xfe,0xd4,0xa4,0xa4,0xfe,0xd3,0xa3,0x7c,0x6e,0x5b,0x4d,0x58,0x7c,0xdb,0x7d,0x7c,0xdc,0x7c,0xdb,0xc0,0x04,0xc9,0x8b,0x5d,0xfb,0x91,0xa9,0xfe,0xe8,0xad,0xad,0x01,0x19,0xa8,0x92,0xfb,0x5a,0x6e,0x40,0xc9,0x70,0x7d,0xd3,0x7b,0x7b,0xd4,0x7c,0xae,0x01,0x02,0x3b,0x00,0x00,0x01,0x00,0x73,0x00,0x00, -0x05,0xa9,0x04,0xbe,0x00,0x1e,0x00,0x38,0x40,0x1d,0x1d,0x1b,0x16,0x0e,0x04,0x04,0x0e,0x16,0x03,0x20,0x08,0x12,0x8a,0x00,0x1b,0x1d,0x0f,0x9b,0x0c,0x0c,0x03,0x14,0x99,0x17,0x18,0x06,0x9b,0x03,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x31,0x30, -0x13,0x34,0x36,0x33,0x21,0x15,0x21,0x20,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x34,0x37,0x26,0x73,0xcf,0xbd,0x03,0xaa,0xfc,0x71,0xfe,0xfc,0x43,0x7a,0x55,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0xd0,0x7f,0x97,0x60,0xa0,0x5b,0xa7,0xa7,0x03,0x7b,0x99,0xaa,0x98,0xb0,0x3c, -0x64,0x38,0x96,0x70,0x59,0xa8,0x97,0x50,0x8b,0x50,0xbd,0x6b,0x6b,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x05,0x05,0x04,0xac,0x00,0x0f,0x00,0x1f,0x00,0x23,0x40,0x0d,0x00,0x8a,0x10,0x10,0x21,0x18,0x8a,0x08,0x14,0x9b,0x0c,0x06,0x1c,0xb8,0x01,0x81,0xb1,0x04,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31, -0x30,0x01,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x07,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x05,0x05,0x9b,0xfe,0xf4,0x9b,0x9c,0xfe,0xf6,0x9b,0x9a,0x01,0x0d,0x9a,0x9a,0x01,0x0c,0x9c,0xa5,0x6c,0xc0,0x71,0x70,0xc1,0x6c,0x6e,0xbe,0x71,0x70,0xbf,0x6e, -0x02,0x55,0xa2,0xfe,0xea,0x9d,0x9f,0x01,0x14,0xa2,0xa1,0x01,0x16,0xa0,0xa0,0xfe,0xe9,0xa0,0x73,0xc9,0x76,0x76,0xca,0x72,0x74,0xc9,0x74,0x73,0xca,0x00,0x00,0x01,0x00,0x82,0xff,0xfd,0x05,0x1b,0x04,0xac,0x00,0x1d,0x00,0x37,0x40,0x1c,0x13,0x12,0x03,0x04,0x00,0x8a,0x07,0x12,0x04,0x07,0x07,0x04,0x12,0x03,0x1f,0x0f,0x8a,0x16, -0x0b,0x9b,0x1a,0x06,0x04,0x12,0x12,0x03,0x13,0x18,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x07,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04, -0x12,0x05,0x1b,0xc2,0x8b,0x4a,0x68,0x8a,0x75,0xc4,0x6f,0x70,0xc5,0x72,0x8e,0x63,0x49,0x8d,0xc0,0xa0,0x01,0x10,0x9c,0x9d,0x01,0x11,0x9f,0x02,0x55,0xb8,0xfe,0xa6,0x46,0x93,0x37,0x01,0x08,0x86,0x72,0xcb,0x75,0x77,0xc9,0x72,0x8b,0xfe,0xf9,0x34,0x92,0x47,0x01,0x59,0xb8,0xa0,0x01,0x18,0x9f,0xa1,0xfe,0xe8,0x00,0x01,0x00,0x64, -0x00,0x00,0x04,0x54,0x04,0xac,0x00,0x25,0x00,0x44,0x40,0x0f,0x17,0x18,0x00,0x8a,0x0b,0x18,0x0b,0x18,0x0b,0x27,0x12,0x89,0x05,0x1e,0x15,0xb8,0x01,0x81,0x40,0x0c,0x18,0x17,0x1a,0x17,0x1a,0x17,0x05,0x0f,0x9b,0x22,0x06,0x06,0xb8,0x01,0x81,0xb1,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x01, -0x2f,0xc4,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x04,0x23,0x21,0x35,0x21,0x32,0x37,0x24,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x04,0x54,0x9c,0xfe,0xef,0x9f,0xfe,0x5c,0x01,0xa4,0x3c,0x4d, -0x01,0x1e,0x73,0xc4,0x70,0x54,0x80,0x7d,0x57,0x5c,0x3f,0x75,0x62,0xae,0x64,0xb0,0x66,0x66,0xb0,0x64,0xa8,0x01,0x0d,0x97,0x02,0x55,0x9d,0xfe,0xea,0xa2,0xa4,0x1b,0x64,0x01,0x32,0x72,0xca,0x76,0x7c,0x59,0x55,0x7f,0x44,0x72,0x77,0x66,0xae,0x65,0x64,0xb1,0x65,0x9b,0xfe,0xec,0x00,0x02,0x00,0x82,0xff,0xdd,0x04,0xa3,0x04,0xac, -0x00,0x32,0x00,0x3c,0x00,0x7a,0x40,0x21,0x1e,0x1f,0x1f,0x13,0x1a,0x8a,0x25,0x2c,0x8a,0x13,0x03,0x11,0x35,0x03,0x25,0x2e,0x13,0x00,0x25,0x13,0x00,0x00,0x13,0x25,0x03,0x3e,0x3a,0x8a,0x0a,0x38,0x9b,0x0e,0x1c,0xb8,0x01,0x81,0x40,0x12,0x22,0x1f,0x1e,0x11,0x35,0x2e,0x03,0x04,0x06,0x0e,0x22,0x1e,0x1e,0x22,0x0e,0x03,0x28,0x33, -0xb8,0x01,0x81,0xb2,0x06,0x18,0x30,0xb8,0x01,0x81,0xb5,0x00,0x19,0x17,0x9b,0x28,0x06,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x33,0x31,0x30, -0x05,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x05,0x32,0x37,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x04,0xa3,0x54, -0x6c,0x6b,0x58,0xb2,0x92,0x57,0xa4,0x5f,0x57,0x99,0x5d,0x73,0xee,0x48,0x3b,0x65,0xae,0x66,0x2d,0x3a,0x65,0x36,0x2f,0x56,0x20,0x6b,0x32,0x70,0x97,0x97,0x6a,0x8d,0xff,0x9c,0x70,0x46,0x38,0x0c,0x26,0xfd,0x55,0xc5,0x55,0x3c,0xad,0x51,0xa6,0x6d,0x23,0x33,0x61,0x45,0x2c,0x4e,0x81,0x46,0x53,0x7c,0x42,0x6f,0x55,0x53,0xbe,0x6e, -0xbd,0x69,0x30,0x27,0x58,0x41,0x68,0x35,0x47,0x8e,0x6d,0x66,0x96,0x9e,0xfe,0xf1,0x96,0xe1,0x9a,0x51,0x09,0x02,0x4f,0x43,0x4b,0x64,0x36,0x43,0x00,0x03,0x00,0x6e,0xff,0xf3,0x05,0x8a,0x04,0xc1,0x00,0x26,0x00,0x30,0x00,0x3c,0x00,0x72,0x40,0x39,0x37,0x8a,0x11,0x26,0x26,0x22,0x1b,0x8a,0x27,0x0b,0x8a,0x31,0x05,0x8a,0x22,0x2f, -0x15,0x11,0x13,0x1d,0x27,0x08,0x31,0x22,0x11,0x27,0x31,0x22,0x22,0x31,0x27,0x11,0x04,0x3e,0x2c,0x8b,0x15,0x26,0x9b,0x00,0x06,0x34,0x9b,0x13,0x08,0x0e,0x1d,0x2f,0x18,0x1f,0x1f,0x0e,0x29,0x9b,0x18,0x06,0x3a,0xb8,0x01,0x81,0xb1,0x0e,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x39,0xed,0x3f,0xed, -0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x10,0xed,0x31,0x30,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x36,0x36, -0x35,0x34,0x26,0x26,0x27,0x05,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xfe,0x51,0x90,0x6c,0x3f,0xca,0xb8,0x25,0x37,0xbb,0x8f,0x8d,0xbd,0x48,0xfe,0x56,0x92,0x69,0x67,0x95,0xc1,0x82,0xf3,0xf0,0xdd,0x3a,0x5e,0x74,0xfd,0xe6,0x33,0x24,0x25,0x3f,0x33,0x88, -0x02,0x00,0x60,0x46,0x45,0x61,0x5d,0x49,0x4b,0x5b,0x04,0xc1,0x0c,0x1f,0x44,0x78,0x64,0x87,0xce,0x46,0x23,0x63,0x38,0x88,0xa2,0xa7,0x83,0x6f,0x45,0x9b,0x01,0x45,0x69,0x92,0x95,0x67,0xa8,0x49,0x61,0x24,0x3f,0xa0,0x63,0x3a,0x42,0x1f,0x06,0x61,0x27,0x37,0x39,0x25,0x5c,0x3c,0x2d,0xfd,0xc2,0x39,0x51,0x4e,0x3c,0x35,0x45,0x45, -0x00,0x03,0x00,0x82,0xff,0xdc,0x05,0xd8,0x04,0xac,0x00,0x35,0x00,0x3e,0x00,0x47,0x00,0x99,0x40,0x4a,0x00,0x8b,0x36,0x04,0x8b,0x0b,0x3b,0x8b,0x30,0x22,0x21,0x21,0x1e,0x18,0x18,0x3f,0x08,0x08,0x0b,0x2c,0x0f,0x8a,0x3f,0x1e,0x8b,0x25,0x02,0x36,0x2e,0x0d,0x3d,0x03,0x0b,0x30,0x36,0x0b,0x30,0x3f,0x25,0x25,0x3f,0x30,0x0b,0x36, -0x05,0x49,0x42,0x8b,0x15,0x3f,0x0f,0x9b,0x18,0x3d,0x2e,0x33,0x02,0x0d,0x2c,0x2c,0x07,0x39,0x9b,0x33,0x06,0x21,0x22,0x22,0x12,0x1b,0x9b,0x28,0x06,0x45,0xb8,0x01,0x80,0xb2,0x12,0x18,0x08,0xb8,0x01,0x80,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x39,0x39,0x12,0x39,0x39, -0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x10,0xed,0x10,0xed,0x32,0x11,0x39,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x07,0x16,0x15,0x14,0x06,0x07,0x27,0x32,0x36,0x35,0x34,0x27,0x06,0x07,0x06,0x06,0x23,0x22,0x26, -0x35,0x34,0x36,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x17,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x36,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xd8,0xaa,0x74,0x89,0xaa,0x4b,0x62,0x7f,0x84,0x6b,0xf7,0x1b, -0xc7,0xa8,0x73,0xa0,0xea,0x01,0x1f,0x08,0x89,0x57,0x35,0x47,0x25,0x30,0x5a,0x3e,0x59,0xa3,0x76,0x68,0xae,0x67,0x06,0x7f,0x43,0x50,0xa5,0x7a,0x80,0xa0,0x9d,0x4e,0x35,0x83,0x72,0x94,0xfd,0x42,0xc5,0x99,0x49,0x2d,0x4d,0x7e,0x03,0x78,0xdd,0x63,0x78,0x8b,0x99,0x9a,0x26,0xa0,0x67,0x49,0x5c,0x6e,0x19,0x0f,0xe1,0xed,0x9e,0x73, -0xa2,0x9e,0x18,0xac,0xfa,0x4c,0x3c,0x1d,0x3a,0x27,0x82,0x20,0x93,0x4d,0x78,0xad,0x93,0xfe,0xfa,0xa0,0x08,0x0a,0x6a,0x89,0x84,0xb0,0xb0,0x73,0x38,0x4e,0x97,0x5c,0x69,0x3e,0xfe,0xd3,0x10,0x56,0x56,0x2b,0x42,0xa5,0x00,0x02,0x00,0x64,0x00,0x00,0x05,0x43,0x04,0xac,0x00,0x1d,0x00,0x28,0x00,0x64,0xb9,0x00,0x11,0x01,0x85,0x40, -0x12,0x1e,0x23,0x8b,0x17,0x0c,0x8b,0x07,0x00,0x1e,0x17,0x07,0x07,0x17,0x1e,0x00,0x04,0x2a,0x19,0xb8,0x01,0x85,0x40,0x09,0x09,0x05,0x17,0x23,0x23,0x21,0x9b,0x0e,0x26,0xb8,0x01,0x81,0x40,0x0d,0x0c,0x07,0x0e,0x14,0x14,0x01,0x0e,0x06,0x09,0x9b,0x0a,0x06,0x1c,0xb8,0x01,0x81,0xb1,0x01,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12, -0x39,0x2f,0x12,0x39,0x39,0xed,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xc6,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x24,0x26,0x35,0x34,0x37,0x26,0x23,0x37,0x20,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23, -0x22,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x43,0xfe,0x06,0xa4,0xfe,0xed,0x9d,0x9d,0x73,0xbb,0x0f,0x01,0x20,0x98,0x7c,0xa2,0x86,0xac,0xad,0x85,0x7e,0xa1,0x4c,0x4a,0xfc,0xb9,0x01,0xfa,0xfe,0x98,0x54,0x3e,0x7b,0x59,0x3a,0x59,0x41,0x3f,0x53,0x84,0xeb,0x8d,0xc7,0x7d,0xc7,0xa5,0xfe,0xe6,0x2b,0xa0,0x7a,0x7b,0xa7,0x85,0xa0,0x4a, -0x6c,0x93,0xb9,0x01,0xf5,0x36,0x49,0x1d,0x79,0x5c,0x40,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x04,0x9e,0x04,0xc1,0x00,0x27,0x00,0x42,0x40,0x1a,0x11,0x8a,0x16,0x1c,0x8a,0x0b,0x16,0x0b,0x27,0x27,0x0b,0x16,0x03,0x29,0x23,0x8a,0x05,0x1e,0x09,0x13,0x09,0x01,0x14,0x14,0x19,0x26,0xb8,0x01,0x81,0xb5,0x01,0x18,0x0e,0x9b,0x19,0x06, -0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x26,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x07,0x06,0x15, -0x14,0x16,0x33,0x21,0x04,0x9e,0xfd,0x4d,0x66,0xb1,0x66,0x8d,0x27,0xd9,0x84,0x4b,0x3f,0x37,0x4a,0x1b,0x8e,0x31,0xab,0x7c,0x84,0xa8,0x8b,0x3e,0x84,0x3f,0x84,0x7c,0x5c,0x02,0xb3,0x62,0xab,0x64,0xb5,0x66,0x1e,0x61,0x3a,0x49,0x3f,0x50,0x45,0x2f,0x30,0x1c,0x52,0x41,0x62,0x74,0x9f,0xae,0x8d,0x9d,0x46,0x1f,0x34,0x1e,0x40,0x70, -0x5b,0x83,0x00,0x02,0x00,0x82,0x00,0x00,0x05,0x43,0x04,0xc1,0x00,0x26,0x00,0x31,0x00,0x59,0xb3,0x24,0x24,0x22,0x13,0xb8,0x01,0x84,0x40,0x24,0x27,0x01,0x04,0x8a,0x22,0x27,0x22,0x00,0x00,0x22,0x27,0x03,0x33,0x2d,0x1a,0x8a,0x0c,0x2f,0x99,0x16,0x24,0x01,0x9b,0x25,0x18,0x25,0x16,0x25,0x16,0x25,0x08,0x2a,0x9b,0x10,0x06,0x1e, -0xb8,0x01,0x81,0xb1,0x08,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x39,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x11,0x39,0x2f,0x31,0x30,0x01,0x23,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14, -0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x10,0x27,0x35,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x33,0x32,0x36,0x05,0x43,0xd6,0x62,0x4d,0x9f,0xfe,0xf0,0x9d,0xa4,0xfe,0xf0,0x9a,0x5a,0x91,0x5d,0x64,0x90,0x90,0x64,0x5c,0x3f,0x08,0x70,0xc3,0x76,0x6e,0xc5,0x75,0xec,0x01,0xb7,0xfc,0xeb,0x3f, -0x25,0x2e,0x41,0x0b,0x3f,0x3b,0x2b,0x39,0x04,0x07,0x6a,0xc1,0x87,0x9f,0xfe,0xed,0xa3,0xa5,0x01,0x22,0xaf,0xa0,0x01,0x21,0x8a,0xa4,0x72,0x6f,0xa6,0x3c,0x23,0x40,0x80,0xd5,0x76,0x74,0xc6,0x70,0x01,0x15,0xa7,0xa1,0xff,0x00,0x29,0x49,0x58,0x53,0x4b,0x4f,0x00,0x02,0x00,0x82,0x00,0x00,0x04,0x44,0x04,0xac,0x00,0x26,0x00,0x31, -0x00,0x70,0x40,0x3c,0x17,0x18,0x0b,0x8b,0x31,0x10,0x89,0x1d,0x1f,0x06,0x2c,0x03,0x31,0x1d,0x00,0x18,0x31,0x1d,0x1d,0x31,0x18,0x00,0x04,0x33,0x04,0x8a,0x21,0x18,0x17,0x2f,0x99,0x0e,0x29,0x9b,0x08,0x06,0x2c,0x1f,0x10,0x04,0x0e,0x08,0xc0,0x0e,0xf0,0x0e,0x02,0x17,0x0e,0x08,0x08,0x0e,0x17,0x03,0x1a,0x01,0x9b,0x25,0x06,0x15, -0xb8,0x01,0x81,0xb1,0x1a,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x21,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x21,0x01,0x34,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x04,0x44,0xfd,0x93,0x48,0x68,0x35,0x73,0xa4,0x80,0x92,0x92,0x68,0x9c,0x74,0x08,0x7d,0x63,0x5c,0x37,0x74,0x6a,0x9d,0xab,0xdb,0x25,0x70,0x5b, -0x9e,0x5c,0x02,0x6d,0xfe,0xa4,0x5e,0x29,0x7f,0x17,0x20,0x6e,0x27,0x27,0x41,0x04,0x07,0x68,0x48,0x5e,0x32,0x63,0x6f,0x62,0x5d,0x7b,0x45,0x1b,0x16,0x6a,0x87,0x25,0x73,0x56,0xe3,0xb2,0x4e,0x53,0x7c,0xa5,0x5a,0x9f,0x5c,0xfd,0xa9,0x41,0x28,0x15,0x1a,0x2b,0x29,0x00,0x00,0x02,0x00,0x5d,0xff,0xe8,0x03,0xe9,0x03,0x7c,0x00,0x0b, -0x00,0x1b,0x00,0x23,0x40,0x0d,0x18,0x89,0x03,0x03,0x1d,0x09,0x89,0x10,0x06,0x9b,0x14,0x06,0x00,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15, -0x14,0x06,0x06,0x02,0x23,0x7f,0xa0,0xa0,0x7f,0x7f,0xa0,0xa0,0x7f,0x7e,0xd0,0x78,0x78,0xd1,0x7d,0x7e,0xd0,0x78,0x78,0xd0,0x81,0xa9,0x88,0x88,0xa9,0xa9,0x88,0x88,0xa9,0x99,0x76,0xd3,0x81,0x81,0xd3,0x76,0x76,0xd3,0x81,0x81,0xd3,0x76,0x00,0x02,0x00,0x00,0xfe,0x63,0x06,0xd4,0x05,0xb3,0x00,0x18,0x00,0x21,0x00,0x37,0x40,0x1e, -0x21,0x8a,0x11,0x00,0x8a,0x19,0x11,0x09,0x19,0x19,0x09,0x11,0x03,0x23,0x04,0x89,0x0d,0x1d,0x9b,0x15,0x07,0x07,0x99,0x0a,0x18,0x21,0x10,0x99,0x01,0x18,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21, -0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x10,0x12,0x21,0x20,0x00,0x11,0x03,0x11,0x10,0x26,0x23,0x22,0x06,0x11,0x11,0x06,0xd4,0xfa,0x99,0x67,0x5f,0x60,0x66,0x01,0x55,0xfe,0xb6,0xc2,0xb6,0xc4,0xb4,0x01,0x57,0xff,0x01,0x03,0x01,0x02,0x01,0x01,0xa4,0xb1,0xae,0xb0,0xae,0x3f,0x46,0x4a,0x3b,0x93,0x86,0x90,0x8f,0x8b,0x02,0x9d, -0x01,0x44,0x01,0x3f,0xfe,0xc5,0xfe,0xb8,0xfd,0x63,0x02,0x8e,0x01,0x05,0xf4,0xf8,0xfe,0xff,0xfd,0x72,0x00,0x01,0x00,0x64,0xff,0xe6,0x07,0x12,0x05,0xb3,0x00,0x1e,0x00,0x3d,0x40,0x21,0x10,0x0f,0x1e,0x89,0x02,0x1b,0x89,0x06,0x0f,0x02,0x06,0x00,0x00,0x06,0x02,0x0f,0x04,0x20,0x0c,0x89,0x13,0x03,0x1e,0x99,0x02,0x18,0x09,0x9b, -0x17,0x07,0x0f,0x10,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x07,0x12, -0xfc,0xd6,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83,0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x93,0x93,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x00,0x00,0x01,0x00,0x64, -0xff,0xe6,0x07,0x1b,0x05,0xb3,0x00,0x2d,0x00,0x50,0x40,0x2b,0x19,0x18,0x22,0x0d,0x8a,0x0e,0x2d,0x2a,0x8a,0x06,0x01,0x06,0x18,0x0e,0x02,0x06,0x06,0x02,0x0e,0x18,0x04,0x2f,0x15,0x8a,0x1c,0x22,0x19,0x09,0x12,0x9b,0x26,0x1f,0x07,0x18,0x19,0x19,0x0e,0x18,0x03,0x2d,0x99,0x02,0x18,0x00,0x3f,0xed,0x39,0x3f,0x3f,0x33,0x3f,0x33, -0xed,0x32,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x32,0x10,0xed,0x39,0x11,0x33,0x31,0x30,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x36, -0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x07,0x07,0x1b,0xfd,0x59,0x53,0x52,0x6c,0x79,0x71,0x61,0xa4,0x61,0x71,0x7b,0x6a,0x66,0x5d,0x9b,0x5f,0x6c,0xc5,0xbe,0x6e,0x96,0x21,0x08,0x20,0x96,0x6f,0x76,0xad,0x60,0x4b,0x30,0x93,0x93,0x51,0x74,0x01,0x4b,0xf6,0x01,0x12,0x01,0x00,0xc7,0xeb,0xfc,0x9a,0x03,0x66,0xea,0xc8,0xfb,0xfe,0xe9, -0xf9,0xfe,0x87,0x77,0x37,0x7f,0x01,0xa8,0xe2,0x01,0x56,0x01,0x6e,0x74,0x6b,0x6a,0x75,0xa3,0xfe,0xc0,0xe1,0x99,0xfe,0x93,0x56,0x00,0x00,0x02,0x00,0x61,0xff,0xe6,0x06,0x81,0x07,0xc8,0x00,0x30,0x00,0x3c,0x00,0x6d,0x40,0x38,0x14,0x13,0x37,0x89,0x07,0x00,0x89,0x31,0x26,0x26,0x10,0x2b,0x89,0x20,0x1d,0x34,0x0a,0x03,0x07,0x31, -0x2e,0x20,0x13,0x07,0x31,0x20,0x20,0x31,0x07,0x13,0x04,0x3e,0x10,0x89,0x17,0x1d,0x2e,0x0a,0x34,0x04,0x04,0x26,0x25,0x25,0x1b,0x23,0x9b,0x28,0x0c,0x9b,0x1b,0x07,0x13,0x14,0x19,0x3a,0xb8,0x01,0x80,0xb1,0x04,0x19,0x00,0x3f,0xed,0x3f,0x33,0x3f,0xed,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39, -0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x17,0x39,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x04,0x02,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x06,0x31,0x79,0xd9,0x88,0xac,0xd5,0xd6,0xd3,0x80,0xaf,0xac,0xfe,0xf0,0x8c,0x6e,0x6e,0x95,0x71,0x7d,0xb3,0x01,0x60,0xde,0xfd,0xba,0x77,0x5b,0x79,0x7a,0x9b,0x9f,0x1d,0xac,0xbb,0xb2,0xd7,0x7f,0x94,0x5e,0x65,0xa7,0x55,0x4b, -0xbb,0xb2,0x7c,0x69,0x80,0xa8,0x02,0x8e,0xb7,0xfe,0xc0,0xb1,0x01,0x1c,0xdd,0xdb,0x01,0x6c,0x9e,0x54,0x9d,0xfe,0xec,0xb7,0xb6,0xfe,0xc4,0x9e,0x3a,0xa6,0x01,0x7d,0xaa,0xe3,0x01,0x57,0xc6,0x8c,0x5b,0x97,0x51,0x62,0x6e,0x3b,0x8a,0x3f,0xba,0x95,0x6f,0xcf,0x72,0x6b,0xfe,0xde,0xba,0x94,0xfc,0x55,0x8d,0xfe,0xc6,0xc1,0xa3,0xbe, -0x01,0x24,0x00,0x01,0x00,0x61,0xfd,0xfe,0x07,0x0f,0x07,0x61,0x00,0x43,0x00,0x71,0x40,0x38,0x1f,0x8a,0x24,0x22,0x21,0x2a,0x8a,0x19,0x30,0x8a,0x11,0x00,0x01,0x41,0x8a,0x03,0x2c,0x11,0x01,0x24,0x21,0x14,0x19,0x11,0x01,0x03,0x03,0x01,0x11,0x19,0x14,0x21,0x24,0x07,0x45,0x0a,0x8a,0x39,0x01,0x00,0x19,0x06,0x9b,0x3d,0x27,0x2c, -0x14,0x9b,0x15,0x15,0x22,0x1c,0x9b,0x27,0x07,0x0e,0xb8,0x01,0x80,0xb3,0x34,0x21,0x22,0x19,0x00,0x3f,0x33,0xd4,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x10,0xd4,0xed,0x3f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31, -0x30,0x05,0x27,0x12,0x11,0x10,0x00,0x21,0x22,0x00,0x02,0x11,0x10,0x12,0x04,0x33,0x32,0x12,0x35,0x10,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x13,0x07,0x02,0x11,0x10,0x00,0x33,0x32,0x16,0x15,0x10,0x07,0x15,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x02,0x35,0x10,0x12,0x00,0x21,0x32, -0x04,0x12,0x11,0x14,0x02,0x06,0x7d,0x9e,0x8b,0xfe,0xaf,0xfe,0xd1,0xd4,0xfe,0xa5,0xb6,0x9c,0x01,0x0e,0xb4,0xbf,0xd4,0xf8,0x72,0x65,0x63,0x6d,0x73,0x7a,0xa8,0xa0,0x8b,0x99,0x96,0x01,0x03,0xed,0xb9,0xd3,0xae,0x67,0x7d,0x96,0xff,0xa8,0xa9,0xfe,0xea,0xc9,0x74,0xde,0x01,0xaa,0x01,0x0a,0xef,0x01,0x6b,0xc2,0x4c,0x19,0x37,0x01, -0x9f,0x01,0x92,0x01,0xa6,0x01,0xd3,0xfe,0xfe,0xfe,0x32,0xfe,0xcd,0xfe,0xd1,0xfe,0x00,0xff,0x01,0x24,0xfd,0x01,0x7d,0x96,0x9b,0x85,0xa2,0x8d,0xfe,0xe7,0xfe,0xbd,0xfe,0xb1,0xfe,0xae,0x37,0x01,0x75,0x01,0x5f,0x01,0x69,0x01,0x90,0xf0,0xca,0xfe,0xf8,0x67,0x06,0x1e,0xfc,0xb4,0xc0,0xfe,0xb0,0xa8,0xb1,0x01,0x4d,0x01,0xd0,0xe9, -0x01,0x60,0x02,0x19,0x01,0x33,0xfd,0xfe,0x2f,0xfe,0xc6,0xd7,0xfe,0x31,0x00,0x01,0x00,0x64,0xfd,0xfe,0x06,0xf4,0x05,0xb3,0x00,0x3e,0x00,0x6a,0x40,0x0b,0x00,0x3e,0x0a,0x33,0x8a,0x34,0x11,0x2a,0x8a,0x2b,0x17,0xb8,0x01,0x85,0x40,0x24,0x23,0x3e,0x34,0x1d,0x2b,0x23,0x23,0x2b,0x1d,0x34,0x3e,0x05,0x40,0x3c,0x8a,0x03,0x12,0x0b, -0x0b,0x34,0x2f,0x26,0x38,0x9b,0x15,0x0e,0x07,0x07,0x3e,0x00,0x19,0x1d,0x1e,0x1e,0x34,0x20,0xb8,0x01,0x80,0xb3,0x1b,0x2b,0x34,0x18,0x00,0x3f,0x33,0xd4,0xed,0x12,0x39,0x2f,0x33,0x3f,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x12,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10, -0xed,0x39,0x11,0x33,0x31,0x30,0x17,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x20,0x11,0x10,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x22,0x06,0x11,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x26,0x23,0x22, -0x06,0x02,0x15,0x10,0x17,0xee,0x41,0x49,0x51,0x92,0x64,0x56,0x7e,0x2a,0x05,0x24,0x86,0x5a,0x5b,0x6f,0x31,0x06,0x26,0x7f,0x60,0x01,0x3c,0x7f,0xe3,0x99,0x8c,0x6f,0x7e,0x77,0xb3,0xad,0x59,0x4e,0x5e,0x51,0xa3,0x4e,0x5b,0x63,0x54,0xa3,0x49,0x55,0x32,0x52,0x2f,0x7d,0x1a,0x85,0x01,0x91,0xdc,0xe8,0x01,0x4b,0xa8,0x56,0x6b,0x5f, -0x62,0x52,0x73,0x64,0x61,0xfc,0xcf,0xfe,0xaa,0xfd,0xe8,0xfe,0xea,0x2d,0xac,0x40,0x01,0xe2,0x01,0xf7,0x01,0x51,0x01,0x57,0xda,0xfe,0xfe,0xfc,0xc4,0x03,0x3c,0x01,0x05,0xd7,0xe9,0xf1,0xfc,0xc2,0x03,0x3e,0x01,0x0b,0xcf,0x8b,0xfe,0xf9,0xb5,0xfe,0x46,0xfa,0x00,0x02,0x00,0x46,0xff,0xe6,0x05,0x17,0x05,0xb3,0x00,0x0b,0x00,0x30, -0x00,0x47,0x40,0x1d,0x2a,0x89,0x13,0x17,0x1b,0x89,0x00,0x13,0x00,0x30,0x30,0x00,0x13,0x03,0x32,0x06,0x8a,0x22,0x09,0x99,0x30,0x0c,0x18,0x1f,0x0c,0x1f,0x0c,0x26,0x0f,0xb8,0x01,0x80,0xb5,0x2e,0x19,0x03,0x9b,0x26,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f, -0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x04,0x33,0x32,0x36,0x12,0x35,0x34,0x02,0x26,0x27,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x20,0x27,0x02,0x8f,0x6e,0x5e,0x5e,0x7a, -0x6e,0x5d,0x63,0x76,0xfd,0xb9,0x68,0x01,0x05,0x92,0xa8,0xfd,0x84,0x86,0xe3,0x82,0x03,0x55,0x62,0x62,0xb1,0x6f,0xa9,0xc8,0x86,0xed,0x9a,0xcb,0x01,0x41,0xb8,0xb6,0xfe,0xb1,0xcb,0xfe,0xbf,0xbe,0x04,0x1e,0x69,0x80,0x82,0x64,0x66,0x7c,0x78,0xfd,0x84,0x5c,0x60,0x95,0x01,0x0f,0xb0,0x9f,0x01,0x12,0xa3,0x07,0x08,0x1c,0x9b,0x60, -0x65,0xa5,0x5d,0xc6,0xa3,0x7f,0xbd,0x66,0xb4,0xfe,0xa9,0xd3,0xdc,0xfe,0xab,0xbe,0x94,0x00,0x00,0x01,0x00,0x64,0xfd,0xfe,0x06,0xea,0x05,0xb3,0x00,0x2d,0x00,0x57,0x40,0x2a,0x2c,0x01,0x8a,0x0e,0x28,0x89,0x13,0x1d,0x1c,0x0e,0x13,0x0f,0x07,0x1c,0x1c,0x07,0x0f,0x13,0x0e,0x05,0x2f,0x19,0x89,0x20,0x2d,0x06,0x16,0x9b,0x24,0x07, -0x1c,0x1d,0x19,0x10,0x2b,0x99,0x0f,0x07,0x08,0x08,0x0f,0x0b,0xb8,0x01,0x80,0xb2,0x04,0x0f,0x18,0x00,0x3f,0xd4,0xed,0x12,0x39,0x11,0x33,0x10,0xed,0x39,0x3f,0x33,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x01,0x11,0x10,0x00,0x21,0x22,0x26,0x27,0x35, -0x17,0x16,0x33,0x32,0x36,0x35,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x21,0x11,0x06,0xea,0xfe,0xcd,0xfe,0xe6,0x46,0x76,0x55,0x4a,0x69,0x70,0xbb,0xdc,0xfd,0xa2,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83,0x98,0x80,0x78, -0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x01,0x9a,0x05,0x99,0xfa,0xb4,0xfe,0xe3,0xfe,0xce,0x13,0x14,0xac,0x18,0x22,0xc6,0xa3,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x05,0x06,0x00, -0x00,0x02,0x00,0x61,0xff,0xe6,0x07,0x02,0x07,0xc8,0x00,0x3f,0x00,0x4a,0x00,0x84,0x40,0x45,0x1b,0x1a,0x26,0x10,0x8a,0x11,0x46,0x8a,0x07,0x00,0x8a,0x40,0x35,0x35,0x17,0x3a,0x8a,0x2e,0x2b,0x43,0x0a,0x03,0x07,0x40,0x3d,0x2e,0x1a,0x11,0x07,0x40,0x2e,0x2e,0x40,0x07,0x11,0x1a,0x05,0x4c,0x17,0x8a,0x1e,0x0c,0x14,0x9b,0x22,0x2b, -0x26,0x43,0x0a,0x3d,0x26,0x04,0x04,0x35,0x34,0x34,0x22,0x31,0x9b,0x37,0x29,0x22,0x07,0x1a,0x1b,0x19,0x11,0x18,0x48,0xb8,0x01,0x80,0xb1,0x04,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x3f,0x33,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x39, -0x11,0x12,0x17,0x39,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x17, -0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x10,0x33,0x32,0x12,0x06,0xc2,0x64,0xac,0x6c,0x88,0xad,0xb0,0xad,0x57,0x59,0x88,0x91,0xa2,0xea,0x8c,0x88,0x65,0x58,0x9a,0x5c,0x6b,0x6e,0xc5,0x81,0x75,0xab,0x20,0x07,0x2b,0xc0,0x7d,0x90, -0x85,0x3d,0x49,0x60,0x63,0x3b,0x64,0x3f,0x17,0x89,0x97,0x8e,0xad,0x67,0x75,0x48,0x54,0xa4,0x2b,0x30,0x8f,0x7f,0x9a,0x61,0x6e,0x02,0x8e,0xbb,0xfe,0xc2,0xaf,0x01,0x18,0xe1,0xdd,0x01,0x6f,0xa0,0x4f,0xf6,0xe6,0xfc,0xc2,0x03,0x3e,0x01,0xdc,0xfe,0xe3,0xfe,0xd4,0xb4,0xfe,0x8c,0x8c,0x37,0x98,0x01,0x9f,0xbb,0xe4,0x01,0x4a,0xad, -0x90,0x81,0x83,0x8e,0x87,0x3a,0xa8,0x5c,0x63,0x6d,0x1d,0x1e,0x8a,0x3f,0xb8,0x97,0x6f,0xd0,0x70,0x6d,0xfe,0xdd,0xb8,0xb7,0xd9,0x4b,0x84,0xfe,0xd5,0xcf,0xfe,0x9f,0x01,0x13,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0x2b,0x03,0xf1,0x00,0x0b,0x00,0x1b,0x00,0x20,0x40,0x10,0x18,0x89,0x03,0x03,0x1d,0x09,0x89,0x10,0x06,0x9b,0x14,0x06, -0x00,0x99,0x0c,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x24,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x04,0x02,0xd5,0xc7,0xdf,0xdf,0xc7,0xc5,0xdd,0xdd,0xc5,0xaa,0xfe,0xee,0x97,0x95,0x01,0x13,0xab, -0xae,0x01,0x14,0x94,0x97,0xfe,0xee,0x87,0xc2,0xa9,0xab,0xc1,0xc3,0xa9,0xa9,0xc2,0x93,0x7f,0xe9,0x96,0x97,0xea,0x7e,0x7f,0xe9,0x97,0x96,0xe8,0x80,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0xa3,0x03,0xf1,0x00,0x2b,0x00,0x37,0x00,0x5f,0xbc,0x00,0x2c,0x01,0x82,0x00,0x00,0x00,0x06,0x01,0x82,0x40,0x18,0x32,0x14,0x89,0x1b,0x28, -0x32,0x00,0x32,0x17,0x1b,0x1b,0x17,0x32,0x00,0x04,0x39,0x22,0x89,0x0c,0x18,0x99,0x17,0x18,0x2f,0xb8,0x01,0x7d,0x40,0x11,0x28,0x35,0x9b,0x03,0x28,0x03,0x28,0x03,0x09,0x1f,0x9b,0x10,0x06,0x26,0x99,0x09,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f, -0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x04,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x27,0x26,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35, -0x34,0x26,0x23,0x22,0x06,0x02,0x28,0x74,0x5a,0x5d,0x77,0xe8,0xc2,0xb7,0xe7,0xa0,0x01,0x2c,0xc4,0xbf,0x01,0x2c,0xa6,0xcb,0xc2,0x6d,0x6f,0x7a,0xdc,0x8a,0xd9,0xfe,0xf9,0x3f,0x73,0x43,0x82,0x41,0x03,0x55,0x6a,0x6c,0x3a,0x2a,0x27,0x3a,0x39,0x28,0x2b,0x39,0x01,0xb7,0x58,0x78,0x7b,0x63,0xc5,0xf0,0x01,0x05,0xd6,0x9f,0xf9,0x8a, -0x88,0xfa,0x9d,0xc0,0xf6,0x27,0x95,0x1d,0xa8,0x83,0x74,0xb5,0x63,0xd9,0xb6,0x62,0x91,0x51,0x58,0x06,0x06,0x72,0x58,0x29,0x39,0x37,0x2b,0x29,0x39,0x39,0x00,0x02,0x00,0xb4,0x00,0x00,0x05,0x90,0x05,0xe6,0x00,0x3e,0x00,0x4a,0x00,0x71,0xb9,0x00,0x2d,0x01,0x83,0x40,0x2f,0x00,0x42,0x8c,0x30,0x39,0x8c,0x48,0x27,0x26,0x06,0x0e, -0x89,0x1f,0x06,0x48,0x1f,0x00,0x30,0x48,0x1f,0x1f,0x48,0x30,0x00,0x04,0x4c,0x18,0x89,0x15,0x16,0x06,0x45,0x3f,0x30,0x3c,0x36,0x06,0x27,0x3c,0x36,0x27,0x27,0x36,0x3c,0x03,0x03,0x1b,0xb8,0x01,0x80,0xb7,0x12,0x18,0x23,0x2a,0x9b,0x0a,0x03,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11, -0x12,0x39,0x33,0x32,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11, -0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x22,0x76,0x72,0x41,0x5d,0x15,0x07,0x0d,0x6e,0x4a,0x7e,0x89,0xb7,0xa0,0xfd,0xd2,0xa1,0xb6,0xad,0x66,0x5b, -0x02,0x00,0x5b,0x64,0x36,0x33,0x2e,0x3f,0x03,0x91,0x02,0x3e,0x2d,0x31,0x31,0x27,0x1e,0x05,0x04,0x55,0x44,0x44,0x57,0x64,0x5d,0x96,0xa9,0x01,0x67,0x1f,0x2e,0x2d,0x20,0x1e,0x2d,0x2e,0x02,0x98,0xb3,0xa9,0x48,0x45,0x3f,0x4e,0xaf,0x99,0xfe,0x9e,0x9b,0xaf,0xb0,0x9a,0x04,0x9c,0xfb,0x6f,0x5b,0x60,0x60,0x5b,0x01,0x5e,0x55,0x5a, -0x4c,0x3e,0x3e,0x4c,0x58,0x72,0x4f,0x73,0x10,0x05,0x05,0x18,0x42,0x58,0x59,0x41,0x4f,0x56,0xb1,0x3e,0x2b,0x20,0x20,0x2a,0x2a,0x20,0x20,0x2b,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0x73,0x03,0xf3,0x00,0x2d,0x00,0x39,0x00,0x71,0xbc,0x00,0x31,0x01,0x82,0x00,0x25,0x00,0x2b,0x01,0x82,0x40,0x30,0x37,0x1c,0x1b,0x09,0x0f,0x89,0x15, -0x09,0x37,0x12,0x25,0x37,0x12,0x15,0x15,0x12,0x37,0x25,0x04,0x3b,0x22,0x89,0x03,0x13,0x99,0x12,0x18,0x18,0x1f,0x9b,0x06,0x2e,0x9b,0x25,0x00,0x28,0x09,0x1c,0x06,0x28,0x1c,0x28,0x1c,0x00,0x0c,0x06,0x06,0x34,0xb8,0x01,0x7d,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0xed, -0x10,0xed,0x32,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x02,0x07,0x35,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15, -0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x2f,0xc3,0xea,0xc8,0xa4,0x5f,0x8d,0x24,0x1e,0x91,0x63,0xa2,0xc1,0xc4,0xa5,0xb8,0x78,0x58,0x4e,0x53,0xab,0x58,0x4f,0x56,0x77,0x37,0x07,0x06,0x6f,0x58,0x5b,0x76,0x7a,0x55,0x29,0x39,0x39,0x29,0x2a,0x37, -0x38,0x0c,0x01,0x1d,0xeb,0xdf,0x01,0x18,0x72,0x74,0x6b,0x7b,0xfe,0xea,0xdf,0xce,0xfe,0xe9,0x24,0x96,0x3c,0x01,0x37,0x92,0xd0,0x9c,0x91,0x91,0x9c,0xce,0x96,0xb0,0x74,0x02,0x54,0x68,0x74,0x58,0x5d,0x79,0x01,0x38,0x02,0x39,0x29,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x00,0x02,0x00,0x82,0xff,0xed,0x05,0x4b,0x05,0x82,0x00,0x3b, -0x00,0x47,0x00,0x84,0xb9,0x00,0x06,0x01,0x82,0xb4,0x3f,0x28,0x89,0x27,0x45,0xbb,0x01,0x82,0x00,0x0c,0x00,0x0e,0x01,0x83,0x40,0x16,0x00,0x39,0x0c,0x00,0x14,0x3f,0x27,0x0c,0x00,0x00,0x0c,0x27,0x3f,0x14,0x05,0x49,0x32,0x89,0x1e,0x17,0x11,0x3c,0xb8,0x01,0x7d,0x40,0x1a,0x09,0x42,0x9b,0x03,0x22,0x2d,0x11,0x1b,0x0c,0x09,0x2d, -0x03,0x27,0x09,0x03,0x09,0x03,0x1b,0x27,0x06,0x39,0x35,0x99,0x1b,0x18,0x13,0xb8,0x01,0x80,0xb1,0x14,0x19,0x00,0x3f,0xed,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed, -0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37, -0x26,0x26,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xcb,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda,0xed,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0x01,0x6f, -0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0x01,0xae,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x45,0x39,0x2b,0x29,0x3a,0x39,0x2a, -0x2a,0x3a,0x00,0x03,0x00,0x82,0xff,0xed,0x05,0x4b,0x05,0x82,0x00,0x43,0x00,0x4f,0x00,0x5b,0x00,0xaa,0xbf,0x00,0x29,0x01,0x83,0x00,0x1b,0x00,0x4d,0x01,0x82,0x00,0x27,0x00,0x21,0x01,0x82,0x40,0x12,0x47,0x18,0x27,0x1b,0x27,0x47,0x2f,0x2f,0x47,0x27,0x1b,0x04,0x11,0x5d,0x07,0x89,0x06,0x00,0xb8,0x01,0x82,0x40,0x18,0x56,0x50, -0x8c,0x3e,0x3c,0x56,0x3e,0x06,0x56,0x3e,0x3e,0x56,0x06,0x03,0x5d,0x11,0x89,0x39,0x0c,0x01,0x4b,0x9b,0x1e,0x44,0xb8,0x01,0x7d,0x40,0x1a,0x24,0x32,0x2c,0x3c,0x53,0x01,0x03,0x41,0x27,0x1e,0x2c,0x24,0x1e,0x24,0x1e,0x24,0x36,0x59,0x41,0x06,0x18,0x14,0x99,0x36,0x18,0x2e,0xb8,0x01,0x80,0xb3,0x2f,0x19,0x06,0x06,0x00,0x3f,0x3f, -0xed,0x3f,0xed,0x32,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x12,0x39,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x07, -0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16, -0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x5d,0x08,0x9e,0x8f,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41, -0xab,0xa5,0x33,0xda,0xed,0xb0,0xc5,0x3d,0x74,0x59,0x64,0x72,0xdd,0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0xfe,0x0f,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x04,0x3d,0x10,0x29,0x72,0x52,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x4f,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59, -0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xb9,0x01,0x03,0x58,0x3c,0x5c,0x5a,0x75,0x81,0xfc,0xf7,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x02,0xbc,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x02,0x00,0x50,0xff,0xf4,0x04,0xa7,0x05,0x6a,0x00,0x28,0x00,0x34,0x00,0x63,0x40,0x09,0x18,0x89,0x05,0x25, -0x8c,0x2f,0x12,0x0b,0x29,0xb8,0x01,0x83,0x40,0x14,0x1f,0x00,0x0b,0x2f,0x1f,0x05,0x2f,0x1f,0x1f,0x2f,0x05,0x03,0x36,0x0f,0x89,0x0e,0x32,0x9b,0x22,0x2c,0xb8,0x01,0x7d,0x40,0x12,0x00,0x12,0x0b,0x22,0x00,0x22,0x00,0x15,0x02,0x99,0x1c,0x18,0x08,0x9b,0x15,0x06,0x0e,0x06,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f, -0x39,0x39,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x26,0x02,0x27,0x33,0x16,0x16,0x17,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xb5,0x47,0x8b,0xa9,0xc6,0xae,0x9b,0x47,0xa9,0x46,0x30,0xae,0x49,0xd5,0x2c,0x49,0x25,0x30,0x91,0x3b,0xe7,0x01,0x05,0x7e,0xeb,0x98,0xca,0xfe,0xfa,0x7a,0x6a,0x58,0x75,0x75,0x5b,0x60,0x3b,0x28,0x28,0x3b,0x3b,0x28,0x2a,0x39,0xb9, -0x34,0xc2,0xb1,0xa2,0xb0,0x26,0x1f,0xa1,0x01,0x70,0x54,0x44,0xd5,0xa6,0x16,0x1a,0xfc,0xe7,0x98,0xec,0x80,0xd7,0xaa,0x6d,0x7c,0x74,0x5c,0x57,0x76,0xce,0x2a,0x39,0x3c,0x27,0x29,0x3b,0x3a,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x06,0x80,0x05,0xe6,0x00,0x3b,0x00,0x47,0x00,0x7b,0x40,0x0c,0x17,0x89,0x14,0x26,0x25,0x06,0x06,0x2c, -0x0d,0x89,0x1e,0x35,0xb8,0x01,0x82,0x40,0x21,0x45,0x3f,0x8c,0x2f,0x1c,0x1e,0x45,0x14,0x1e,0x45,0x2f,0x2f,0x45,0x1e,0x14,0x04,0x49,0x2c,0x89,0x00,0x3c,0x9b,0x2e,0x38,0x32,0x06,0x26,0x32,0x26,0x32,0x26,0x03,0x42,0xb8,0x01,0x7d,0xb2,0x38,0x18,0x10,0xb8,0x01,0x80,0x40,0x0a,0x1c,0x18,0x15,0x06,0x21,0x29,0x9b,0x0a,0x03,0x06, -0x00,0x3f,0x33,0xed,0x32,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x3e,0x02,0x33,0x32,0x12,0x15,0x14,0x06, -0x07,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x21,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x06,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x82,0xac,0xa3,0x53,0x8a,0x23,0x0d,0x48, -0x66,0x36,0xa0,0xac,0x25,0x15,0x46,0x56,0x62,0xae,0x58,0xa4,0x66,0xfe,0xe2,0x5d,0x52,0x4d,0x2d,0x49,0x29,0xa7,0x01,0x53,0x47,0x51,0x58,0x37,0x07,0x06,0x70,0x58,0x5c,0x74,0x7b,0x64,0x80,0xc5,0x6a,0x01,0xbf,0x2a,0x3a,0x3a,0x2a,0x29,0x39,0x3a,0x01,0xfc,0xf8,0x01,0x00,0x75,0x66,0x37,0x65,0x3f,0xfe,0xfe,0xf4,0x64,0xce,0x31, -0x5f,0x5b,0x04,0x91,0xfb,0x64,0x5d,0x97,0x56,0xc8,0x01,0x36,0xa7,0xbd,0x45,0x8c,0x64,0x9f,0x96,0xb8,0xae,0xbb,0x69,0x02,0x57,0x65,0x75,0x57,0x5f,0x77,0x82,0xec,0x36,0x02,0x39,0x29,0x2a,0x38,0x3b,0x27,0x27,0x3d,0x00,0x02,0x00,0x82,0xff,0xf6,0x05,0x9c,0x05,0x82,0x00,0x40,0x00,0x4c,0x00,0x7e,0xb9,0x00,0x0b,0x01,0x82,0x40, -0x1b,0x47,0x27,0x89,0x26,0x41,0x8c,0x05,0x1a,0x33,0x00,0x47,0x26,0x33,0x05,0x1d,0x47,0x26,0x05,0x05,0x26,0x47,0x03,0x4e,0x31,0x89,0x1d,0x44,0xb8,0x01,0x7d,0x40,0x1a,0x02,0x15,0x9b,0x36,0x4a,0x9b,0x08,0x21,0x2c,0x00,0x02,0x36,0x2c,0x08,0x26,0x02,0x36,0x08,0x08,0x36,0x02,0x03,0x0e,0x26,0x06,0x33,0xb8,0x01,0x81,0xb5,0x1a, -0x18,0x3d,0x99,0x0e,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36, -0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x06,0x07,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26, -0x23,0x22,0x06,0x04,0xfc,0x16,0x1b,0x57,0x78,0x77,0x56,0x5c,0x77,0x9e,0x80,0x2f,0x57,0x56,0x45,0x3e,0x3e,0x1b,0x1e,0x25,0x18,0x10,0x02,0xda,0xfd,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0xb4,0x16,0x6f,0x5d,0x26,0x49,0x49,0x52,0x46,0x4b,0x1c,0x2e,0x49,0x0d,0x9a,0x3b,0x29,0x27,0x3b,0x3a, -0x28,0x27,0x3d,0x01,0x18,0x05,0x76,0x59,0x5a,0x75,0x7c,0x65,0xd1,0xfe,0xf7,0x27,0x46,0x4d,0x44,0x2e,0x33,0x57,0x84,0x1b,0x02,0xf1,0xc7,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0xca,0x39,0x8b,0x7f,0x22,0x39,0x54,0x4c,0x34,0x49,0x3d,0xd0,0x29,0x3b,0x39,0x2b,0x29,0x39, -0x3a,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x06,0x1b,0x04,0xfe,0x00,0x37,0x00,0x43,0x00,0x7a,0x40,0x0a,0x06,0x20,0x2a,0x13,0x89,0x12,0x21,0x89,0x22,0x32,0xbb,0x01,0x82,0x00,0x41,0x00,0x3b,0x01,0x82,0x40,0x19,0x2c,0x12,0x22,0x41,0x2c,0x2c,0x41,0x22,0x12,0x04,0x45,0x2a,0x89,0x00,0x38,0x9b,0x06,0x20,0x03,0x2c,0x35,0x2f,0x2f, -0x03,0x3e,0xb8,0x01,0x7d,0x40,0x15,0x35,0x18,0x1d,0x9b,0x09,0x17,0x9b,0x0f,0x09,0x0f,0x09,0x0f,0x12,0x22,0x18,0x12,0x06,0x26,0x9b,0x03,0x06,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10, -0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01,0x23,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14, -0x06,0x23,0x22,0x02,0x25,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x82,0xd9,0xc5,0x57,0x9d,0x2b,0x1e,0x51,0x38,0x1a,0x3f,0x4b,0x35,0x37,0x15,0x31,0x37,0xa8,0x54,0x79,0x43,0x23,0x55,0x51,0x1d,0x2e,0x11,0x1d,0x2d,0x0b,0x01,0x13,0xc1,0xe5,0x3e,0x6d,0x3f,0x4a,0x67,0x31,0x3c,0x08,0x6f,0x58,0x5b,0x76,0x7a,0x65, -0xc7,0xe6,0x01,0xbd,0x2a,0x39,0x3a,0x29,0x2a,0x37,0x38,0x01,0xdb,0xfa,0x01,0x1c,0x6a,0x57,0x94,0x7a,0x26,0x48,0x35,0x26,0xe1,0xa8,0x88,0xfe,0xe5,0x8f,0x32,0x51,0x1d,0x28,0x88,0x7f,0xfd,0x73,0x02,0x46,0xa1,0x7a,0x63,0xb5,0x6a,0x9d,0x76,0x5c,0x6e,0x74,0x58,0x5d,0x79,0x01,0x06,0x32,0x02,0x3b,0x27,0x2a,0x38,0x38,0x2a,0x28, -0x3c,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x05,0x3f,0x04,0xa3,0x00,0x0f,0x00,0x1e,0x00,0x20,0x40,0x10,0x04,0x89,0x13,0x13,0x20,0x1b,0x89,0x0c,0x00,0x99,0x17,0x06,0x10,0x99,0x08,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34, -0x12,0x24,0x13,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x02,0xe2,0xaa,0x01,0x18,0x9b,0x9e,0xfe,0xe6,0xaf,0xa9,0xfe,0xe7,0x9e,0xa0,0x01,0x1e,0xa2,0xcb,0xf2,0x6d,0xc7,0x7f,0x82,0xcd,0x71,0x71,0xc9,0x04,0xa3,0x9a,0xfe,0xed,0xad,0xad,0xfe,0xec,0x96,0x9c,0x01,0x14,0xa7,0xa9,0x01,0x15,0x9c,0xfb, -0xe5,0xf9,0xc8,0x80,0xd0,0x74,0x76,0xd0,0x80,0x7d,0xcf,0x73,0x00,0x02,0x00,0x78,0xff,0xf7,0x05,0x3b,0x04,0xa3,0x00,0x2a,0x00,0x36,0x00,0x61,0xb5,0x29,0x89,0x04,0x00,0x01,0x19,0xbb,0x01,0x82,0x00,0x2e,0x00,0x33,0x01,0x82,0x40,0x12,0x13,0x11,0x2e,0x13,0x04,0x01,0x2e,0x13,0x13,0x2e,0x01,0x04,0x04,0x38,0x0c,0x89,0x21,0x0f, -0xb8,0x01,0x7f,0x40,0x11,0x2b,0x11,0x31,0x11,0x16,0x1d,0x16,0x1d,0x16,0x00,0x25,0x99,0x08,0x06,0x01,0x00,0x18,0x00,0x3f,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x27,0x36, -0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x10,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0xf3,0x75,0x80,0x94,0x70,0xc9,0x81,0x85,0xc7,0x6e,0x85, -0x6e,0x2d,0x15,0x38,0x69,0x48,0x48,0x6b,0x5b,0xa4,0x6f,0x75,0xbc,0x68,0xa0,0x01,0x11,0xaf,0xa5,0x01,0x15,0xa9,0xfd,0x93,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x09,0x70,0x69,0x01,0x19,0x97,0x65,0xb9,0x6f,0x6a,0xbc,0x71,0x9a,0xb4,0x0b,0x34,0x4d,0x4b,0x69,0x6b,0x49,0x4e,0x81,0x49,0x73,0xd6,0x8e,0x97,0x01,0x07,0x92,0x8e,0xfe, -0xfa,0x8f,0xfe,0x90,0x65,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x04,0x52,0x06,0x66,0x00,0x25,0x00,0x31,0x00,0x5a,0xbf,0x00,0x2f,0x01,0x82,0x00,0x03,0x00,0x17,0x01,0x84,0x00,0x16,0x00,0x09,0x01,0x82,0x40,0x22,0x29,0x00,0x16,0x29,0x03,0x16,0x29,0x29,0x16,0x03,0x03,0x33,0x20,0x89,0x11, -0x13,0x1b,0x2c,0x06,0x31,0x00,0x1b,0x16,0x00,0x06,0x06,0x0d,0x17,0x16,0x07,0x24,0x99,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x39,0x12,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x26,0x26,0x35,0x34,0x36,0x33,0x32, -0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x01,0x36,0x12,0x37,0x17,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x39,0x26,0x26,0x65,0x4b,0x50,0x65,0x6c,0xc8,0x7e,0xa2,0xfb,0x8b,0x01,0x82,0x94,0xca,0x3a,0x92,0x2e,0x5c,0x75,0x8d,0x69, -0x8f,0x57,0x27,0x69,0xba,0x6a,0x61,0x90,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0xa1,0x26,0x3e,0x2d,0x50,0x62,0x68,0x4a,0x58,0x93,0x55,0x7f,0xe8,0x93,0x01,0x2b,0x01,0x35,0x77,0x01,0x06,0x9d,0x36,0x7b,0xa7,0x89,0x77,0x5a,0x91,0x7b,0x71,0x51,0x5c,0xa0,0x62,0x6b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x50, -0xff,0xf2,0x05,0x71,0x06,0xac,0x00,0x45,0x00,0x50,0x00,0x5c,0x00,0x88,0x40,0x23,0x4e,0x89,0x27,0x54,0x22,0x07,0x89,0x3f,0x24,0x46,0x16,0x2f,0x04,0x27,0x2d,0x89,0x48,0x0f,0x89,0x35,0x22,0x3f,0x27,0x3f,0x48,0x35,0x45,0x45,0x35,0x48,0x3f,0x27,0x05,0x5e,0x5a,0xb8,0x01,0x82,0x40,0x1e,0x1c,0x0a,0x3b,0x45,0x3b,0x00,0x00,0x2a, -0x04,0x9b,0x42,0x2a,0x57,0x9b,0x24,0x2f,0x22,0x16,0x04,0x19,0x46,0x2a,0x1f,0x1f,0x19,0x4c,0x9b,0x2a,0x06,0x51,0xb8,0x01,0x7d,0xb5,0x19,0x19,0x32,0x99,0x13,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x17,0x39,0xed,0x10,0xd4,0xed,0x12,0x39,0x2f,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39, -0x2f,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x26,0x02,0x35,0x34,0x36,0x33,0x32,0x16, -0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x12,0x35,0x34,0x2e,0x03,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x04,0x17,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x90,0xec,0x71,0x4f,0x26,0x1d,0x2a,0x44,0x67,0xe9,0xc2,0x6f,0x35,0x64,0xb5,0x71,0x62,0xcb, -0x6a,0x47,0x9f,0x69,0x49,0x68,0x69,0x48,0x36,0x57,0x16,0x27,0x1c,0x54,0x7a,0x7f,0x62,0x76,0x86,0x56,0x5d,0xa3,0x39,0x6d,0x81,0x1f,0x3c,0x59,0x73,0xb3,0x78,0x6a,0x3e,0x8b,0x66,0x56,0x01,0x2a,0x96,0xfd,0x51,0x27,0x2e,0x24,0x17,0x20,0x39,0xf9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0x66,0x71,0x2d,0x12,0x2d,0x1e,0x1d,0x2e, -0x28,0x59,0x74,0x93,0xcf,0x8f,0xc0,0xfe,0xc6,0xae,0x81,0x6f,0x78,0x78,0x69,0x49,0x4b,0x69,0x3b,0x30,0x32,0x4c,0x74,0x01,0x4f,0x72,0x72,0x97,0xd8,0xd4,0x9c,0xe5,0x73,0x81,0x01,0x1d,0xfc,0x65,0x92,0x6c,0x4c,0x3c,0x40,0x2b,0x43,0x57,0x3a,0x5f,0x82,0x68,0x53,0xfc,0x2e,0x69,0x77,0x81,0x93,0x39,0x3e,0x4c,0xe4,0xfd,0xf9,0x27, -0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x78,0xff,0xf2,0x05,0x25,0x06,0x3d,0x00,0x3d,0x00,0x47,0x00,0x53,0x00,0x8b,0xbc,0x00,0x0d,0x01,0x84,0x00,0x43,0x00,0x3b,0x01,0x82,0x40,0x44,0x4b,0x25,0x89,0x22,0x51,0x03,0x03,0x3e,0x08,0x03,0x43,0x06,0x8a,0x34,0x13,0x32,0x22,0x34,0x43,0x4b,0x22,0x34,0x34,0x22,0x4b, -0x43,0x04,0x55,0x2d,0x89,0x19,0x46,0x0a,0x53,0x00,0x4d,0x38,0x1d,0x29,0x08,0x32,0x3e,0x13,0x04,0x10,0x0a,0x03,0x00,0x29,0x38,0x23,0x0a,0x00,0x38,0x38,0x00,0x0a,0x03,0x10,0x23,0x06,0x30,0x99,0x15,0x19,0x40,0x10,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x12,0x17,0x39, -0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34, -0x36,0x36,0x37,0x24,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x05,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x42,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74, -0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x5c,0xbc,0xa9,0x01,0x42,0x85,0x4b,0x1e,0xa8,0xb4,0xcc,0xfe,0xf4,0x87,0x98,0x44,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0xf8,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x5e,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x02,0x0e,0x4c,0x3a,0x16,0x70,0x42,0x4f, -0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa5,0xe0,0x8c,0x2c,0x54,0x2f,0x34,0x41,0x2f,0xa3,0xb0,0x86,0xa0,0x34,0x45,0x23,0x6d,0xa7,0xa2,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0xfe,0xb6,0x50,0x2c,0x1f,0x20,0x27,0x01,0x7b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x04,0x00,0x78, -0xff,0xf2,0x05,0x25,0x06,0x3d,0x00,0x47,0x00,0x51,0x00,0x5c,0x00,0x68,0x00,0xba,0xb9,0x00,0x59,0x01,0x82,0xb6,0x3a,0x38,0x03,0x42,0x03,0x3a,0x40,0xb8,0x01,0x82,0x40,0x13,0x54,0x00,0x8a,0x45,0x3a,0x54,0x45,0x45,0x54,0x3a,0x03,0x33,0x6a,0x20,0x8a,0x10,0x66,0x1d,0x17,0xbb,0x01,0x82,0x00,0x60,0x00,0x27,0x01,0x84,0x40,0x41, -0x4d,0x1d,0x48,0x22,0x2d,0x0e,0x05,0x60,0x10,0x60,0x4d,0x4d,0x60,0x10,0x03,0x6a,0x09,0x89,0x33,0x50,0x24,0x68,0x1a,0x62,0x14,0x06,0x38,0x03,0x42,0x56,0x3d,0x22,0x0e,0x48,0x2d,0x04,0x2a,0x24,0x1d,0x1a,0x42,0x52,0x38,0x03,0x14,0x3d,0x24,0x1a,0x14,0x3d,0x3d,0x14,0x1a,0x24,0x04,0x2a,0x47,0x06,0x0c,0x99,0x2f,0x19,0x4a,0x2a, -0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x11,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10, -0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36, -0x36,0x25,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x36,0x35,0x35,0x33,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x12,0xd0,0xa8,0x23,0x72,0x80,0xc7,0x9c,0x4c,0x4a,0x41,0xc6, -0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0x47,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x68,0xe7,0x01,0x20,0x0f,0x4c,0x66,0x4d,0x4a,0x67,0x0b,0x2b,0x3f,0xa5,0xfe,0x7f,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x7d,0x35,0x2a,0x17,0x1c,0x25,0x31,0xf7,0x1a,0x27,0x27,0x1a,0x1a, -0x26,0x26,0x05,0xd5,0x99,0xbe,0x23,0x3c,0x31,0x4a,0xd9,0xb6,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa6,0xc8,0x9e,0x6b,0x08,0x35,0x5c,0x49,0x6b,0x71,0x47,0x18,0x1d,0x1c,0x6b,0x4b,0x5e,0xfa,0x87,0x50,0x2c,0x1f, -0x20,0x27,0x03,0xf6,0x21,0x29,0x1c,0x29,0x27,0x1e,0x18,0x30,0xfd,0x83,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x78,0xff,0xf2,0x06,0x58,0x06,0xac,0x00,0x4d,0x00,0x58,0x00,0x64,0x00,0xad,0x40,0x0c,0x2a,0x29,0x38,0x89,0x1c,0x0c,0x3e,0x4e,0x16,0x04,0x0e,0x14,0xb8,0x01,0x84,0xb4,0x51,0x31,0x89,0x24,0x57,0xbb, -0x01,0x84,0x00,0x0e,0x00,0x4b,0x01,0x82,0x40,0x26,0x5c,0x62,0x03,0x03,0x5c,0x44,0x29,0x1c,0x51,0x24,0x0e,0x5c,0x5c,0x0e,0x24,0x51,0x1c,0x29,0x06,0x66,0x06,0x89,0x44,0x21,0x34,0x29,0x34,0x2a,0x2a,0x5f,0x2e,0x9b,0x27,0x5f,0x54,0x9b,0x11,0x59,0xb8,0x01,0x7d,0x40,0x11,0x00,0x4e,0x16,0x0c,0x3e,0x04,0x40,0x11,0x03,0x00,0x5f, -0x11,0x00,0x11,0x00,0x40,0x48,0xb8,0x01,0x7d,0xb7,0x5f,0x06,0x18,0x0a,0x99,0x3c,0x40,0x19,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xd4,0xed,0x12,0x39,0x2f,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11, -0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x05,0x07,0x27, -0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x32,0x36,0x57,0x15,0x2e,0x40, -0x54,0x94,0x54,0x5b,0x40,0x63,0x79,0x5a,0x5b,0x6f,0x5d,0x39,0x62,0x50,0x93,0x59,0x35,0x74,0xd1,0xa0,0x70,0x6f,0x92,0x5d,0xa7,0x01,0x70,0x46,0x8f,0xa7,0x5a,0x3f,0x1d,0x28,0x48,0x5f,0xfb,0xed,0x69,0x84,0xe1,0x82,0x9d,0x6d,0x71,0x98,0x87,0xe1,0x7e,0x76,0xcc,0x78,0x48,0x6b,0x6c,0xf0,0x14,0x25,0x21,0x1a,0x1a,0x25,0xf4,0x1a, -0x27,0x27,0x1a,0x1a,0x26,0x26,0x03,0x50,0x3b,0x30,0x43,0xe3,0x6e,0x71,0xc0,0x6e,0x37,0x6f,0x87,0x62,0x7f,0x7f,0x62,0x87,0x6d,0x39,0x88,0xe6,0x80,0xa4,0xa7,0x7b,0x70,0x38,0x27,0x7e,0x4e,0x58,0x7d,0xbb,0x8b,0x43,0x4f,0x1e,0x2e,0x1d,0x20,0x2f,0x24,0x5d,0xb8,0xfe,0xfe,0xcb,0xaf,0xfe,0xd5,0xaa,0x6a,0x6a,0x94,0x01,0x04,0x9f, -0xa1,0x01,0x3a,0xb2,0x6b,0x49,0x49,0x69,0xfd,0xd9,0x14,0x57,0x17,0x2f,0x35,0x32,0x2a,0x4b,0x02,0x5b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x64,0xfd,0xeb,0x05,0x98,0x04,0xa5,0x00,0x2d,0x00,0x37,0x00,0x43,0x00,0x85,0xb3,0x3b,0x1e,0x21,0x40,0xb8,0x01,0x82,0xb2,0x19,0x0f,0x00,0xb8,0x01,0x83,0x40,0x14,0x2e, -0x23,0x2e,0x11,0x89,0x21,0x06,0x89,0x07,0x19,0x2e,0x21,0x07,0x07,0x21,0x2e,0x19,0x04,0x45,0x33,0xb8,0x01,0x83,0x40,0x11,0x28,0x3f,0x9b,0x35,0x25,0x1e,0x16,0x1c,0x23,0x0f,0x25,0x1c,0x25,0x1c,0x25,0x0c,0x38,0xb8,0x01,0x7d,0x40,0x0f,0x07,0x16,0x19,0x30,0x2b,0x2e,0x00,0x00,0x0c,0x2b,0x2b,0x02,0x99,0x0c,0x06,0x00,0x3f,0xed, -0x39,0x2f,0x12,0x39,0x11,0x33,0x11,0x33,0x3f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x39,0x11,0x12,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x24,0x33,0x32,0x12,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x23, -0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0xfc,0x01,0x16,0xc4,0xd3,0xef,0xa8,0x4d,0x82, -0x4b,0x4c,0xee,0x5f,0x39,0x39,0x57,0x74,0x44,0x49,0x68,0x69,0x48,0x3b,0x32,0x17,0x1a,0x22,0x48,0x41,0x57,0x66,0x70,0x4a,0x48,0x5f,0x44,0x29,0x3d,0x1b,0x24,0x26,0x19,0x2c,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x0f,0x96,0xfe,0xeb,0xf3,0xfb,0x4e,0x04,0xb2,0x66,0xab,0x61,0x4b,0x36,0xa7,0xba,0x55,0xea,0xa3,0x59,0x69, -0x49,0x4b,0x69,0x27,0x34,0x8f,0x37,0xac,0x73,0x22,0x69,0x52,0x4c,0x70,0x3c,0x92,0x5a,0x2a,0x1b,0x1b,0x30,0xfc,0xca,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x04,0x00,0x70,0xfe,0xa4,0x05,0x65,0x04,0xa5,0x00,0x4a,0x00,0x5d,0x00,0x67,0x00,0x73,0x00,0xa6,0xb3,0x0a,0x56,0x14,0x0c,0xb8,0x01,0x82,0x40,0x09,0x5e,0x24, -0x06,0x89,0x5a,0x62,0x8c,0x14,0x3d,0xb8,0x01,0x82,0x40,0x1e,0x6b,0x71,0x37,0x34,0x89,0x44,0x37,0x6b,0x44,0x5e,0x5a,0x14,0x6b,0x44,0x44,0x6b,0x14,0x5a,0x5e,0x05,0x75,0x4b,0x89,0x1d,0x2b,0x9b,0x00,0x00,0x03,0x48,0xb8,0x01,0x80,0xb4,0x31,0x54,0x0a,0x14,0x68,0xb8,0x01,0x7d,0x40,0x1b,0x40,0x5a,0x21,0x6e,0x9b,0x3a,0x56,0x60, -0x14,0x03,0x1a,0x21,0x37,0x3a,0x40,0x3a,0x40,0x3a,0x1a,0x28,0x31,0x06,0x4e,0x99,0x1a,0x19,0x65,0xb8,0x01,0x7d,0xb1,0x0f,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x12,0x17,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39, -0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x11,0x10,0x02,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x36,0x35,0x34, -0x26,0x26,0x23,0x22,0x07,0x06,0x07,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x36,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x35,0x01,0x06,0x06,0x05,0x34,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36, -0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xfa,0x1d,0xd2,0x3c,0xa8,0x98,0x19,0x38,0x34,0x5e,0x6b,0x48,0x49,0x6a,0x15,0x5b,0x45,0xbc,0x86,0x8c,0x3e,0x63,0x6e,0xae,0xbf,0x02,0x0d,0x7d,0x54,0x1c,0x3c,0x40,0x56,0xa3,0x22,0x0f,0x14,0x39,0x4a,0x5a,0x36,0x58,0x60,0x39,0x2c,0x0d,0x62,0x3f,0x48,0x6b,0x6c, -0x47,0x74,0xcf,0x7a,0x5c,0xa6,0x66,0x44,0x9c,0xfe,0x62,0x21,0x16,0x1c,0x60,0x60,0x82,0x01,0x21,0x42,0x21,0x2c,0x26,0x31,0xfd,0x99,0xae,0x87,0x03,0xb6,0x47,0x3c,0x26,0x1c,0x1c,0x25,0xfd,0x5f,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x3f,0x1b,0x49,0xee,0xff,0x00,0xfe,0xff,0xfe,0xf8,0x88,0x1b,0x35,0x7e,0x46,0x6c,0x6c,0x51, -0x20,0x26,0x16,0x1e,0x57,0x41,0x2f,0x6a,0x67,0x56,0x95,0x53,0xe5,0x36,0x7a,0x72,0x7d,0x8f,0x3f,0x5a,0x13,0x05,0x03,0x24,0x2a,0x21,0x78,0x7b,0x3a,0x70,0x1b,0x44,0x50,0x6b,0x49,0x49,0x69,0x70,0xc2,0x71,0x71,0xaf,0x5f,0x38,0xfb,0x11,0x1d,0x1f,0x25,0x2e,0x3e,0x68,0x06,0x19,0x7f,0x49,0x42,0xfe,0xf0,0x4d,0x5b,0x46,0x35,0x20, -0x24,0x31,0x19,0x29,0x26,0x02,0xb8,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x06,0xb5,0x04,0xa1,0x00,0x33,0x00,0x3f,0x00,0x64,0x40,0x09,0x02,0x89,0x31,0x00,0x33,0x27,0x89,0x0d,0x1a,0xb8,0x01,0x82,0x40,0x1b,0x37,0x3d,0x14,0x14,0x37,0x21,0x31,0x33,0x0d,0x37,0x37,0x0d,0x33,0x31,0x04,0x41, -0x12,0x89,0x21,0x3a,0x9b,0x14,0x1d,0x17,0x17,0x0f,0x34,0xb8,0x01,0x7d,0x40,0x0c,0x1d,0x19,0x33,0x00,0x24,0x99,0x0f,0x06,0x2e,0x99,0x06,0x19,0x00,0x3f,0xed,0x3f,0xed,0xc4,0x32,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33, -0x10,0xed,0x31,0x30,0x01,0x12,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x37,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x10,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22, -0x06,0x15,0x14,0x16,0x06,0x13,0xa2,0x70,0xcd,0x84,0x78,0xca,0x6a,0x03,0x0c,0xfe,0xe9,0x88,0x97,0x5e,0x17,0x50,0x30,0x48,0x6b,0x6c,0x47,0x6e,0xba,0x76,0xf3,0xcf,0xcf,0xf6,0x06,0x07,0x91,0x83,0x78,0x8d,0x9c,0xfc,0xa9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x9f,0xfe,0x8d,0xfe,0xdf,0x9f,0xf6,0x84,0x5f,0xb4,0x7a,0x56,0xcd, -0x22,0x01,0x47,0xc6,0xb2,0xfe,0xf2,0x83,0x27,0x2f,0x6b,0x49,0x49,0x69,0xb0,0x01,0x49,0xa5,0xf4,0x01,0x1d,0xfd,0xdc,0x30,0x6b,0x6c,0x33,0x7a,0x8c,0xbb,0xc8,0x01,0x1a,0x01,0x42,0xfb,0xfe,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0x01,0xb4,0x03,0xde,0x05,0x9a,0x00,0x0c,0x00,0x1c,0x00,0x1f,0x40,0x0f, -0x11,0x89,0x09,0x09,0x1e,0x03,0x89,0x19,0x06,0x99,0x15,0x00,0x9b,0x0d,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x2c,0x79,0x93,0x8d,0x7f, -0x80,0x8a,0x42,0x78,0x50,0x74,0xcb,0x73,0x6d,0xc8,0x7d,0x75,0xcb,0x74,0x6f,0xca,0x05,0x09,0xc9,0x9a,0xa5,0xbc,0xbb,0xa6,0x62,0xa6,0x5b,0x91,0x86,0xe6,0x89,0x92,0xe3,0x7c,0x80,0xe4,0x8d,0x8c,0xe6,0x83,0x00,0x01,0x00,0x64,0xff,0x83,0x03,0x98,0x05,0x9a,0x00,0x1d,0x00,0x38,0x40,0x1c,0x19,0x89,0x0e,0x0d,0x1d,0x00,0x03,0x0d, -0x00,0x00,0x0d,0x03,0x03,0x1f,0x09,0x89,0x11,0x0d,0x0a,0x0e,0x0e,0x15,0x00,0x1d,0x06,0x9b,0x15,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x31,0x30,0x17,0x36,0x00,0x35,0x34,0x02,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35, -0x34,0x36,0x24,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x00,0x07,0xe9,0xfa,0x01,0x0b,0x5d,0x3d,0x35,0xb1,0x60,0x42,0x39,0x9b,0x39,0x51,0xa5,0x01,0x14,0x6f,0x4b,0x78,0x49,0x85,0xfe,0xf0,0xb0,0x19,0xe7,0x01,0xb7,0xba,0x97,0x01,0x33,0x35,0x39,0x18,0x4b,0xb0,0x43,0x4d,0x51,0xe6,0x5f,0x3a,0x78,0x5a,0x88,0xfe,0xed,0x90,0x9b,0xfe, -0xae,0xfe,0x9b,0x9a,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x00,0x05,0x9a,0x00,0x23,0x00,0x38,0x40,0x1b,0x00,0x23,0x23,0x25,0x0c,0x20,0x0f,0x08,0x08,0x16,0x1c,0x89,0x0f,0x05,0x9b,0x20,0x0a,0x15,0x0a,0x15,0x00,0x12,0x9b,0x19,0x06,0x23,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0xed,0x01,0x2f,0xed,0xc4,0x39, -0x2f,0x12,0x39,0x39,0x11,0x39,0x2f,0x33,0x31,0x30,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x12,0x13,0x03,0x67,0x21,0x4d,0x63,0x85,0x57,0x74,0x5b,0x1b,0x6d,0xb8,0x41,0x41,0x5d,0x79,0x77,0x6a, -0x53,0xf2,0x6d,0x42,0xa3,0xe7,0x6b,0xba,0xd0,0x38,0x61,0x64,0x62,0x88,0x1c,0x7d,0xf0,0x01,0x05,0xa0,0x59,0x36,0x8c,0x3b,0x18,0x54,0xc7,0x48,0x59,0x63,0x90,0x73,0x85,0x90,0x7f,0x98,0x8b,0x5d,0x9f,0x89,0x5d,0x5f,0xfe,0x91,0xfe,0xff,0x00,0x01,0x00,0x78,0xff,0x83,0x03,0xd3,0x05,0x9a,0x00,0x31,0x00,0x64,0x40,0x33,0x1f,0x1e, -0x1e,0x33,0x07,0x18,0x89,0x2b,0x28,0x04,0x00,0x16,0x2b,0x07,0x0e,0x00,0x2b,0x2b,0x00,0x0e,0x03,0x24,0x14,0x89,0x07,0x2e,0x9b,0x02,0x16,0x02,0x21,0x9b,0x26,0x0d,0x11,0x02,0x28,0x1c,0x26,0x1f,0x02,0x26,0x02,0x26,0x11,0x1e,0x1f,0x0a,0x9b,0x11,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11, -0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x10,0xed,0x11,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x17,0x07, -0x02,0x21,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x01,0x0a,0x8c,0x8f,0x33,0x2e,0x59,0x4a,0x5c,0x69,0x4e,0xec,0x60,0x3c,0x8b,0xee,0x71,0x9c,0xbf,0xb1,0x8e,0x2d,0x63,0x53,0x88,0x5b,0x8d,0xa8,0xfe,0xa1,0x37,0x36,0x37,0x5f,0x69,0x85,0x6c,0x59,0x7c,0x78,0x73,0x43,0x81,0x23,0x03,0x68, -0x36,0x08,0x41,0x67,0x32,0x4b,0x4e,0x7f,0x5b,0x7b,0x77,0x79,0x99,0x84,0x8b,0x92,0x52,0x93,0x59,0x78,0x75,0x37,0x69,0xc4,0x4e,0x01,0x68,0x14,0x81,0x23,0x28,0x2c,0x97,0x46,0x53,0x5e,0x18,0x11,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x81,0x05,0x9a,0x00,0x22,0x00,0x33,0x40,0x1a,0x1c,0x89,0x04,0x0e,0x02,0x0e,0x20,0x20,0x0e,0x02, -0x03,0x24,0x09,0x89,0x14,0x21,0x9b,0x20,0x20,0x0f,0x04,0x9b,0x18,0x06,0x0e,0x0f,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30,0x01,0x20,0x11,0x34,0x37,0x22,0x0e,0x02,0x15,0x14,0x12,0x12,0x04,0x17,0x07,0x26,0x00,0x00,0x02,0x35,0x34,0x36,0x24,0x33,0x32, -0x17,0x06,0x15,0x14,0x16,0x33,0x37,0x07,0x06,0x04,0x29,0xfe,0x53,0x0e,0x2e,0xa9,0x76,0x1b,0x86,0xfb,0x01,0x1c,0x77,0x30,0x97,0xfe,0xb0,0xfe,0xe9,0x90,0x57,0x01,0x32,0x83,0x8e,0x27,0x13,0x8a,0x91,0x40,0x10,0x2a,0x02,0xa8,0x01,0xc3,0x57,0x50,0x1c,0x23,0x2a,0x45,0x92,0xfe,0xa9,0xfe,0xad,0xf2,0x2b,0x88,0x32,0x01,0x13,0x01, -0x80,0x01,0x7e,0xac,0x6f,0x61,0x58,0x29,0x9f,0x3f,0xb0,0x9e,0x05,0x9d,0x05,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0xff,0x05,0xae,0x00,0x16,0x00,0x3a,0x40,0x1c,0x04,0x03,0x00,0x89,0x16,0x07,0x14,0x16,0x03,0x16,0x03,0x16,0x18,0x0e,0x8a,0x0d,0x12,0x99,0x07,0x0e,0x09,0x09,0x04,0x00,0x0e,0x07,0x03,0x04,0x00,0x2f,0x33,0x3f, -0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x12,0x12,0x17,0x07,0x26,0x02,0x03,0x06,0x23,0x22,0x26,0x02,0x03,0x37,0x17,0x12,0x16,0x33,0x32,0x37,0x02,0x03,0x03,0x36,0x19,0xee,0xc2,0x4c,0x98,0xe5,0x46,0xa6,0x81,0x73,0x93,0x48,0x03,0xa5,0x08, -0x09,0x69,0x6d,0x3c,0x91,0x3c,0x0b,0x05,0xae,0xfd,0xd5,0xfd,0x09,0x8f,0x7a,0x62,0x01,0x9b,0x01,0x24,0x56,0x9e,0x01,0x57,0x01,0x57,0x14,0x9d,0xfe,0xbf,0xf1,0x4e,0x01,0x2c,0x01,0x41,0x00,0x01,0x00,0x78,0xff,0xf6,0x05,0x17,0x05,0x9a,0x00,0x2c,0x00,0x3f,0x40,0x20,0x17,0x16,0x16,0x1c,0x24,0x89,0x08,0x1c,0x89,0x10,0x08,0x10, -0x08,0x10,0x2e,0x00,0x8a,0x2c,0x1c,0x08,0x28,0x00,0x00,0x13,0x04,0x99,0x28,0x18,0x19,0x9b,0x13,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x12,0x12,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02, -0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x02,0x03,0x01,0x1c,0x0d,0x94,0xef,0x9d,0x39,0x8f,0x5c,0x61,0x61,0x70,0x7f,0x73,0x40,0xdb,0xaf,0x53,0xa0,0x5b,0x4e,0x9a,0x65,0x67,0x7a,0x5f,0x63,0x99,0x7d,0x57,0x35,0x8c,0xee,0x74,0xbe,0xfe,0xe1, -0xb5,0x1f,0x04,0x66,0xfe,0xd1,0xfe,0x33,0xe3,0x5a,0x91,0x52,0x42,0x6d,0x31,0x38,0x3f,0x62,0x7a,0x4e,0x95,0xc0,0x45,0x42,0x73,0x69,0x6c,0x5a,0x3c,0x6a,0x34,0x51,0x4b,0x54,0x68,0x41,0x70,0xdb,0x8f,0xf0,0x01,0xf1,0x01,0x75,0x00,0x01,0x00,0x64,0xff,0xf6,0x05,0x65,0x05,0xae,0x00,0x26,0x00,0x46,0x40,0x12,0x00,0x8b,0x26,0x1b, -0x89,0x0c,0x1f,0x0c,0x07,0x26,0x0c,0x07,0x07,0x0c,0x26,0x03,0x28,0x12,0xb8,0x01,0x84,0x40,0x10,0x13,0x13,0x07,0x12,0x12,0x04,0x0f,0x9b,0x17,0x06,0x21,0x99,0x04,0x18,0x00,0x07,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x31,0x30, -0x01,0x0a,0x02,0x23,0x22,0x26,0x27,0x36,0x37,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x02,0x03,0x27,0x12,0x12,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x02,0x07,0x16,0x33,0x32,0x36,0x12,0x12,0x13,0x05,0x65,0x07,0x72,0xf7,0xd9,0x71,0x98,0x45,0x0a,0x19,0x89,0x6d,0x67,0x6b,0x79,0x90,0x1b,0x8d,0x1c,0x68,0xb7,0x93,0x6f,0x9c,0x54, -0x3e,0x73,0x3a,0x34,0x2c,0x83,0xa4,0x61,0x31,0x0a,0x05,0xae,0xfd,0xac,0xfd,0xa6,0xfe,0xf6,0x29,0x2a,0x18,0x2c,0xef,0x01,0x4f,0x8a,0x92,0x81,0xfe,0xe8,0xfe,0xbd,0x2f,0x01,0x1b,0x01,0x19,0x89,0x65,0xb1,0x68,0x69,0xfe,0xf8,0xfe,0xe9,0x5c,0x10,0x77,0x01,0x01,0x01,0xc4,0x01,0xd7,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x5a, -0x05,0xae,0x00,0x15,0x00,0x2f,0x40,0x15,0x0c,0x0d,0x00,0x15,0x0f,0x08,0x0d,0x15,0x0d,0x15,0x17,0x08,0x0f,0x08,0x07,0x07,0x0d,0x0c,0x07,0x15,0x00,0x00,0x2f,0x32,0x3f,0x33,0x39,0x2f,0x33,0x33,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x3e,0x02, -0x37,0x17,0x04,0x07,0x36,0x33,0x32,0x04,0x12,0x17,0x03,0xc1,0x12,0x80,0xa2,0xb4,0x5b,0x83,0x60,0x23,0x2b,0x9f,0xda,0x63,0x6a,0xfe,0xeb,0x87,0x38,0x3e,0x89,0x01,0x1b,0xda,0x19,0x7d,0x81,0x01,0x4c,0xf6,0x85,0x39,0x7e,0x67,0xef,0xf2,0x56,0x64,0xff,0xf6,0x07,0xfe,0xfe,0x43,0xdb,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x2a, -0x05,0x9a,0x00,0x25,0x00,0x3e,0x40,0x20,0x00,0x25,0x0e,0x89,0x16,0x09,0x89,0x1c,0x25,0x16,0x1c,0x11,0x11,0x1c,0x16,0x25,0x04,0x27,0x23,0x89,0x02,0x11,0x0e,0x06,0x12,0x12,0x00,0x1c,0x9b,0x06,0x06,0x00,0x00,0x2f,0x3f,0xec,0x12,0x39,0x2f,0x12,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed, -0x11,0x33,0x31,0x30,0x17,0x26,0x35,0x10,0x12,0x00,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x02,0x15,0x14,0x17,0xa3,0x2b,0xce,0x01,0x45,0xbc,0x66,0x6c,0x73,0x4b,0x28,0x85,0x72,0x21,0x7a,0xaa,0x5c,0x36,0x3d,0x3a,0x39,0x1e,0x2b, -0x88,0xeb,0x91,0x2e,0x7d,0x95,0xc0,0x01,0x31,0x02,0x4d,0x01,0x44,0x4d,0x45,0x88,0x6b,0x46,0x33,0x1a,0x41,0x54,0x0f,0x91,0x12,0x54,0x74,0x3d,0x28,0x56,0x3b,0x38,0x5c,0x2d,0x19,0x12,0xfe,0xda,0xfd,0xf6,0xfc,0xc5,0x78,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x01,0x03,0x6e,0x00,0x0f,0x00,0x1b,0x00,0x21,0x40,0x0c,0x00,0x8b, -0x10,0x10,0x1d,0x16,0x8b,0x08,0x13,0x9b,0x0c,0x19,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x01,0x78,0xd2,0x78,0x78,0xd0, -0x77,0x79,0xd0,0x76,0x79,0xd0,0x79,0x97,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x01,0xaf,0x76,0xce,0x7a,0x79,0xd0,0x75,0x7a,0xd1,0x74,0x75,0xd0,0x7a,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x00,0x01,0x00,0x7f,0xff,0xf1,0x03,0xda,0x03,0x6e,0x00,0x1b,0x00,0x34,0x40,0x12,0x1b,0x0f,0x0f,0x00,0x0e,0x07,0x8b,0x15,0x00,0x1b, -0x0e,0x0f,0x1b,0x0f,0x1b,0x0f,0x03,0x12,0xb8,0x01,0x7f,0xb3,0x0b,0x18,0x9b,0x03,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x32,0x11,0x33,0x31,0x30,0x13,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26, -0x23,0x22,0x06,0x07,0x80,0x3d,0xe0,0x84,0x79,0xcb,0x75,0x7c,0xd1,0x76,0x85,0xda,0x39,0x89,0x26,0x88,0x59,0x84,0xb0,0xac,0x7e,0x5c,0x93,0x24,0x02,0x68,0x7a,0x8c,0x7a,0xd0,0x75,0x73,0xd1,0x7a,0x91,0x7b,0x37,0x54,0x60,0xab,0x7c,0x7f,0xb9,0x65,0x58,0x00,0x00,0x01,0x00,0x3a,0xfd,0xfe,0x03,0xc2,0x03,0x64,0x00,0x12,0x00,0x24, -0x40,0x0d,0x00,0x8b,0x10,0x10,0x14,0x09,0x8b,0x08,0x08,0x08,0x04,0x11,0x0d,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xc2,0x70,0xc5,0x85,0x92,0xcf,0x6d,0x98, -0x4d,0x8d,0x5c,0x88,0x9b,0x97,0x0d,0x91,0xef,0x75,0x6f,0xc7,0x82,0x52,0x8a,0x4d,0xc8,0xb1,0x03,0x5e,0x00,0x01,0x00,0x7f,0xfd,0xfe,0x03,0xda,0x03,0x6e,0x00,0x1f,0x00,0x47,0x40,0x1b,0x00,0xa8,0x1f,0x1f,0x21,0x1e,0x0a,0x10,0x04,0x04,0x11,0x03,0x18,0x8b,0x0a,0x11,0x10,0x03,0x1e,0x04,0x1c,0x10,0x04,0x10,0x04,0x14,0x07,0xb8, -0x01,0x7f,0xb4,0x1c,0x0d,0x9b,0x14,0x00,0x00,0x2f,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x32,0x11,0x33,0x11,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x01,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16, -0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x27,0x01,0x03,0x0f,0xfd,0xcb,0x2d,0x2e,0x89,0x26,0x88,0x59,0x83,0xb1,0xab,0x7f,0x5c,0x93,0x24,0x86,0x3d,0xe0,0x84,0x79,0xcc,0x74,0x7c,0xd1,0x76,0x05,0x05,0x01,0xc2,0xfd,0xfe,0x02,0x7d,0x32,0x54,0x38,0x54,0x60,0xa8,0x7e,0x80,0xb4,0x65,0x58,0x46,0x7a,0x8c,0x78,0xcd,0x75,0x73,0xd1,0x7a, -0x01,0xfe,0x07,0x00,0x00,0x01,0x00,0x80,0xfd,0xfe,0x03,0xdb,0x03,0x6e,0x00,0x1f,0x00,0x45,0x40,0x1d,0x0f,0x1b,0x1b,0x0e,0x01,0x1c,0x1c,0x07,0x21,0x1f,0x89,0x00,0x15,0x8b,0x07,0x1c,0x1b,0x0e,0x0f,0x01,0x1b,0x0f,0x1b,0x0f,0x03,0x12,0x9b,0x0b,0x18,0xb8,0x01,0x7f,0xb1,0x03,0x00,0x00,0x2f,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39, -0x2f,0x2f,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0xd4,0xed,0x11,0x12,0x39,0x2f,0x39,0x33,0x33,0x11,0x33,0x31,0x30,0x13,0x01,0x07,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x07,0x01,0x9f,0x01,0xb5,0x0b,0x06,0x75,0xd2,0x7c,0x74, -0xcb,0x7a,0x84,0xdd,0x40,0x86,0x25,0x93,0x5b,0x7f,0xab,0xb2,0x82,0x59,0x88,0x26,0x89,0x2a,0x32,0xfd,0xe0,0xfd,0xfe,0x01,0xf9,0x01,0x7a,0xd0,0x74,0x74,0xcd,0x79,0x8b,0x7b,0x46,0x58,0x65,0xb3,0x81,0x7e,0xa8,0x60,0x54,0x38,0x50,0x36,0xfd,0x83,0x00,0x02,0x00,0x80,0xfd,0xfe,0x04,0x08,0x03,0x6e,0x00,0x27,0x00,0x33,0x00,0x5c, -0xb4,0x14,0x8b,0x24,0x02,0x05,0xbb,0x01,0x83,0x00,0x2e,0x00,0x28,0x01,0x83,0x40,0x0d,0x0b,0x24,0x2e,0x0b,0x0b,0x2e,0x24,0x03,0x35,0x1d,0x8b,0x1c,0x31,0xbb,0x01,0x7e,0x00,0x02,0x00,0x2b,0x01,0x7e,0x40,0x0a,0x08,0x02,0x08,0x1c,0x1c,0x08,0x02,0x03,0x0f,0x21,0xb8,0x01,0x7f,0xb3,0x18,0x00,0x9b,0x0f,0x00,0x2f,0xed,0x2f,0xed, -0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36, -0x35,0x11,0x34,0x26,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x4d,0x7a,0x52,0x55,0x73,0x82,0x61,0x5f,0x83,0x75,0xd3,0x81,0x86,0xc5,0x70,0x70,0xc6,0x85,0x91,0xcf,0x6d,0x98,0x4d,0x8d,0x5b,0x89,0x9b,0x99,0xfe,0x2b,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x02,0xdf,0x4e,0x0a,0x81,0x56,0x5b,0x87,0x84, -0x5d,0x7b,0xce,0x76,0x76,0xee,0x91,0xfe,0x7a,0x90,0xef,0x76,0x6e,0xc8,0x82,0x56,0x86,0x4d,0xc8,0xb1,0x01,0x6a,0xb0,0xbf,0xfe,0xd2,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x2f,0x00,0x3b,0x00,0x6f,0xb9,0x00,0x30,0x01,0x83,0xb7,0x00,0x0b,0x8b,0x28,0x1a,0x8b,0x1b,0x06, -0xb8,0x01,0x83,0x40,0x11,0x36,0x08,0x36,0x00,0x28,0x1b,0x36,0x36,0x1b,0x28,0x00,0x04,0x3d,0x23,0x8b,0x12,0x33,0xb8,0x01,0x7e,0x40,0x18,0x2d,0x08,0x2d,0x39,0x9b,0x03,0x2d,0x03,0x2f,0x1b,0x01,0x1b,0x30,0x2d,0x01,0x1b,0x03,0x2d,0x03,0x0e,0x1f,0x9b,0x17,0x25,0xb9,0x01,0x7f,0x00,0x0e,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39, -0x5d,0x2f,0x5d,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x12,0x15,0x23,0x34,0x26,0x26, -0x23,0x22,0x06,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x07,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x0f,0x86,0x5c,0x5e,0x85,0x38,0x2a,0x35,0xfb,0xc6,0x8a,0xc6,0x6a,0x73,0xc5,0x82,0xd9,0xf5,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x01,0x23,0x94,0x96,0x3a,0x25,0x0a,0x0b,0x5e,0x83, -0x7f,0x3c,0x27,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x02,0x7c,0x60,0x84,0x85,0x5e,0x52,0x43,0x1d,0x49,0x37,0x9f,0xbb,0x6a,0xd7,0x8c,0x02,0x54,0x8a,0xdf,0x6e,0xfe,0xf0,0xdb,0x60,0xa0,0x5c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x61,0x5b,0x23,0x2d,0x10,0x01,0x83,0x60,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x3c,0x00,0x00,0x01,0x00,0x80,0xfe,0x05, -0x04,0x30,0x03,0x6e,0x00,0x32,0x00,0x43,0xb9,0x00,0x00,0x01,0x84,0x40,0x0c,0x32,0x23,0x8b,0x10,0x32,0x10,0x32,0x10,0x34,0x19,0x18,0x2a,0xb8,0x01,0x84,0x40,0x0b,0x08,0x18,0x19,0x32,0x19,0x32,0x04,0x13,0x9b,0x1f,0x2d,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0xed,0xc6,0x32, -0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x0e,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x04,0x30,0x07,0x40,0x6d, -0x4b,0x50,0x68,0x3a,0x1d,0x35,0x45,0x44,0x34,0x1c,0xaf,0x7c,0x7c,0xab,0x2d,0x7b,0x4a,0x79,0xd0,0x76,0x7a,0xd1,0x77,0x1e,0x32,0x50,0x58,0x35,0x2c,0x28,0x13,0x1d,0x1d,0x15,0x15,0xf9,0x48,0x74,0x46,0x32,0x5d,0x3b,0x3d,0x62,0x6e,0x6b,0x69,0x6c,0x69,0x34,0x7f,0xa7,0xae,0x82,0x58,0x4a,0x52,0x72,0x82,0x7a,0xd1,0x74,0x72,0xca, -0x79,0x34,0x75,0x68,0x7e,0x88,0x88,0x37,0x2a,0x2c,0x09,0x19,0x23,0x48,0x00,0x02,0x00,0x80,0xff,0xf0,0x04,0x01,0x03,0x6e,0x00,0x1d,0x00,0x24,0x00,0x47,0xb5,0x1a,0x8b,0x03,0x1d,0x00,0x0c,0xb8,0x01,0x83,0x40,0x0f,0x1e,0x03,0x00,0x1e,0x1e,0x00,0x03,0x03,0x26,0x21,0x8b,0x12,0x00,0x1d,0x21,0xb8,0x01,0x7d,0xb6,0x09,0x09,0x0f, -0x06,0x9b,0x16,0x23,0xb9,0x01,0x80,0x00,0x0f,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x2f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15, -0x14,0x06,0x07,0x25,0x34,0x26,0x27,0x16,0x17,0x36,0x02,0xa5,0x53,0x72,0xaf,0x7c,0x64,0xa0,0x1a,0x7c,0x9d,0x6e,0x51,0x77,0x84,0x79,0xd1,0x75,0x79,0xd0,0x79,0x9d,0x76,0xfe,0xc5,0x57,0x42,0x0a,0x74,0x1b,0x6f,0x1d,0xb5,0x6e,0x80,0xb0,0x76,0x5e,0x09,0x9b,0x6f,0x4d,0x9d,0x1d,0x45,0xf8,0x92,0x72,0xc6,0x76,0x75,0xd0,0x7a,0x92, -0xfe,0x2f,0xfd,0x45,0x66,0x04,0x91,0x7a,0x2e,0x00,0x00,0x02,0x00,0x80,0xfd,0xfe,0x04,0x08,0x03,0x6e,0x00,0x30,0x00,0x3c,0x00,0x72,0x40,0x09,0x05,0x29,0x16,0x8b,0x15,0x26,0x8b,0x08,0x2b,0xbb,0x01,0x83,0x00,0x37,0x00,0x31,0x01,0x83,0x40,0x10,0x00,0x29,0x15,0x08,0x37,0x00,0x00,0x37,0x08,0x15,0x04,0x3e,0x0e,0x8b,0x1e,0x34, -0xb8,0x01,0x7e,0x40,0x19,0x2e,0x3a,0x9b,0x03,0x29,0x03,0x20,0x15,0x30,0x15,0x40,0x15,0x03,0x15,0x2e,0x03,0x03,0x2e,0x15,0x03,0x1a,0x0b,0x9b,0x23,0x11,0xb9,0x01,0x7f,0x00,0x1a,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x39, -0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x25,0x34,0x36,0x33,0x33,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x20,0x11,0x11,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x33,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16, -0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x0f,0x83,0x5e,0x0b,0x0a,0x25,0x3a,0x97,0x93,0xfe,0xdd,0x98,0x8b,0x5b,0x93,0x48,0x98,0x6e,0xcf,0x91,0x83,0xc4,0x73,0x6a,0xc7,0x89,0xc6,0xfb,0x35,0x2a,0x38,0x82,0x61,0x5c,0x86,0x7f,0x3b,0x28,0x29,0x3b,0x3c,0x28,0x28,0x3b,0xe3,0x5e,0x83,0x01,0x10,0x2d,0x23,0x5c,0x60,0xfe, -0xaf,0xfe,0x6e,0xb1,0xbe,0x4c,0x83,0x5a,0x82,0xc7,0x6f,0x6e,0xe0,0x89,0x01,0xcc,0x8c,0xd8,0x69,0xbc,0x9e,0x37,0x49,0x1d,0x43,0x52,0x5c,0x87,0x84,0x5e,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x3c,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x0f,0x00,0x1a,0x00,0x23,0x40,0x0d,0x00,0x8b,0x1a,0x1a,0x1c,0x16,0x8b,0x07, -0x12,0x9b,0x0c,0x07,0x18,0xb8,0x01,0x7f,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x07,0x10,0x21,0x22,0x06,0x15,0x11,0x10,0x21,0x20,0x11,0x04,0x08,0xf6,0xd8,0x8a,0xc6,0x6a,0x74,0xc7,0x83,0xdb,0xef, -0x97,0xfe,0xc9,0x88,0x9b,0x01,0x23,0x01,0x37,0x01,0xc8,0xd6,0xfe,0xff,0x6a,0xd7,0x8c,0x02,0x54,0x85,0xe3,0x6f,0xf2,0xdc,0x0d,0x01,0x4c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x01,0x6f,0x00,0x00,0x01,0x00,0x66,0xff,0xe7,0x03,0xa8,0x05,0xe8,0x00,0x09,0x00,0x2d,0x40,0x15,0x03,0x8b,0x07,0x05,0x07,0x05,0x0b,0x00,0x05,0x04,0x00,0x09, -0x04,0x09,0x04,0x09,0x01,0x07,0x18,0x01,0x06,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x13,0x25,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x05,0x66,0x01,0xd1,0x1c,0x01,0x2b,0x2a,0xfe,0x30,0x1c,0xfe,0xd4,0x05,0x16,0xd2,0xfa,0xcb,0x86,0x80,0xd2,0x05,0x35,0x83, -0x00,0x01,0x00,0x80,0x00,0x00,0x03,0xd2,0x05,0xe9,0x00,0x22,0x00,0x32,0xb7,0x08,0x8b,0x1b,0x1b,0x24,0x22,0x03,0x11,0xb8,0x01,0x84,0x40,0x0e,0x00,0x12,0x03,0x00,0x00,0x01,0x12,0x18,0x1e,0x9b,0x05,0x05,0x01,0x06,0x00,0x3f,0x33,0x2f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0x33,0xed,0x32,0x32,0x12,0x39,0x2f,0xed,0x31,0x30, -0x13,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x80,0x97,0x73,0x87,0xca,0xf7,0x51,0x92,0xaa,0x80,0x66,0x37,0x94,0x43,0x77,0x9d,0x91,0x7d,0x42,0xaa,0x80,0x4e,0x83,0x29,0x04,0x12,0x01,0xd1,0x45,0x4b,0xed, -0xbd,0x57,0x9f,0x9d,0x85,0x65,0x66,0x5d,0x2e,0xd1,0xe0,0x42,0x7b,0x7d,0x7b,0x71,0x81,0x7a,0x3e,0x7b,0xa0,0x4e,0x3c,0xbe,0x00,0x01,0x00,0x66,0x00,0x00,0x04,0x34,0x05,0xe3,0x00,0x12,0x00,0x2c,0xb6,0x0a,0x8b,0x0b,0x0b,0x14,0x03,0x12,0xbb,0x01,0x85,0x00,0x00,0x00,0x0f,0x01,0x7f,0xb7,0x03,0x05,0x05,0x01,0x06,0x0b,0x00,0x18, -0x00,0x3f,0x32,0x3f,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x01,0x33,0x03,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x03,0x66,0x01,0xeb,0xa7,0xd1,0x28,0x2c,0x7d,0xcb,0x71,0x97,0xac,0x7e,0x44,0x3f,0xe9,0x05,0xe3,0xfd,0x83,0x08,0x6a,0xbd,0x70,0xfe,0x29,0x01, -0xa7,0x7f,0xb9,0x1e,0xfd,0x3f,0x00,0x01,0x00,0x66,0xff,0xe7,0x04,0x8b,0x05,0xe3,0x00,0x09,0x00,0x37,0x40,0x09,0x03,0x8b,0x07,0x05,0x07,0x05,0x07,0x0b,0x09,0xb8,0x01,0x85,0x40,0x0f,0x00,0x05,0x08,0x01,0x03,0x07,0x04,0x04,0x01,0x07,0x18,0x01,0x06,0x00,0x18,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x33,0x01, -0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x33,0x01,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x01,0x66,0x02,0x1d,0xb3,0x01,0x2c,0x29,0xfe,0x30,0x1c,0xfe,0x68,0x05,0xe3,0xfa,0xcf,0x87,0x80,0xd2,0x04,0x7a,0xfb,0x9f,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x59,0x05,0xe3,0x00,0x11,0x00,0x1d,0x00,0x35,0x40,0x16,0x00,0x04, -0x8b,0x0f,0x1c,0x02,0x1c,0x02,0x1f,0x15,0x8b,0x0b,0x03,0x12,0x9b,0x00,0x0e,0x0e,0x08,0x10,0x06,0x18,0xb8,0x01,0x7f,0xb1,0x08,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x33,0x15,0x23,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33, -0x21,0x11,0x33,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x03,0xdf,0x7a,0x7a,0x67,0xbb,0x7a,0xd0,0xf3,0xf1,0xc9,0x01,0x0e,0x97,0xfe,0x62,0x8d,0x9d,0xa6,0x8e,0x40,0x78,0x45,0x03,0x6e,0x8f,0xfe,0xa0,0x7c,0xb3,0x5f,0xee,0xd0,0xcb,0xf4,0x02,0x75,0xfc,0xfc,0xa4,0x94,0x8a,0x9d,0x3a,0x64,0x3f,0x01,0x82,0x00, -0x00,0x02,0x00,0x80,0x00,0x00,0x04,0x59,0x05,0xe9,0x00,0x11,0x00,0x1d,0x00,0x36,0x40,0x1b,0x10,0x02,0x8b,0x03,0x1d,0x03,0x00,0x03,0x00,0x03,0x1f,0x19,0x8b,0x08,0x10,0x1c,0x99,0x01,0x05,0x05,0x03,0x16,0x9b,0x0b,0x07,0x03,0x18,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11, -0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x33,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x04,0x59,0x7a,0x97,0xfe,0xf2,0xca,0xf0,0xf3,0xd0,0x79,0xbc,0x67,0x7a,0xfe,0xef,0x46,0x77,0x40,0x8e,0xa6,0x9d,0x8d,0x01,0x07,0x02,0x6c,0xfd, -0x94,0x02,0x6c,0xf4,0xcb,0xcf,0xef,0x5f,0xb3,0x7c,0xfe,0xa1,0x01,0x81,0x3f,0x65,0x39,0x9c,0x8a,0x96,0xa2,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x03,0x41,0x05,0xe3,0x00,0x07,0x00,0x2a,0x40,0x0d,0x02,0x89,0x05,0x03,0x01,0x05,0x05,0x01,0x03,0x03,0x09,0x00,0x02,0xb8,0x01,0x7f,0xb5,0x05,0x18,0x07,0x9b,0x00,0x06,0x00,0x3f,0xed, -0x3f,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x31,0x30,0x13,0x21,0x01,0x21,0x15,0x21,0x01,0x21,0x67,0x02,0xa8,0xfe,0x4f,0x01,0xe3,0xfd,0x50,0x01,0xaa,0xfe,0x2c,0x05,0xe3,0xfa,0xac,0x8f,0x05,0x54,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x01,0x05,0xfe,0x00,0x28,0x00,0x34,0x00,0x59,0x40,0x29,0x1a,0x1b,0x00,0x27, -0x03,0x09,0x8b,0x29,0x24,0x29,0x14,0x11,0x1b,0x06,0x29,0x1b,0x27,0x29,0x29,0x27,0x1b,0x03,0x36,0x1e,0x2f,0x8b,0x17,0x11,0x27,0x1b,0x1b,0x00,0x1a,0x14,0x06,0x0d,0x2c,0x9b,0x21,0x06,0x32,0xb8,0x01,0x7f,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0xc4,0x32,0x32,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39, -0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x13,0x34,0x26,0x23, -0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x5b,0x4c,0x5a,0x6e,0x60,0x5f,0x6f,0x78,0xd2,0x78,0x78,0xd0,0x77,0x6a,0x63,0x5e,0x6f,0x5d,0x4d,0x63,0x36,0x3f,0xad,0x7a,0x7e,0xad,0x40,0x39,0x66,0x13,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x05,0xfb,0x3c,0xb3,0x6d,0x6f,0xca,0x3e,0x3d,0xc7,0x75,0x76,0xce,0x7a,0x79,0xd0,0x75, -0x72,0xc7,0x40,0x3d,0xc8,0x72,0x6e,0xb4,0x3d,0x6a,0x2a,0x7e,0x4d,0x81,0xae,0xb4,0x7b,0x4b,0x80,0x2b,0x66,0xfb,0xb4,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x02,0x00,0x80,0xff,0xdc,0x04,0x01,0x05,0xe9,0x00,0x27,0x00,0x33,0x00,0x5a,0x40,0x2e,0x0d,0x0c,0x27,0x00,0x1e,0x24,0x8b,0x03,0x28,0x03,0x13,0x10,0x0c,0x21,0x03,0x0c, -0x00,0x03,0x03,0x00,0x0c,0x03,0x35,0x2e,0x09,0x8b,0x16,0x10,0x31,0x99,0x13,0x21,0x1a,0x06,0x06,0x0d,0x2b,0x9b,0x1a,0x07,0x00,0x0c,0x0c,0x27,0x0d,0x19,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10, -0xed,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0xf1,0x39,0x40, -0xae,0x7d,0x7a,0xad,0x3f,0x36,0x63,0x4d,0x5d,0x6f,0x5e,0x61,0x6c,0x78,0xd0,0x77,0x78,0xd2,0x78,0x6f,0x5f,0x61,0x6d,0x5b,0x4d,0x11,0xae,0x7d,0x7a,0xad,0xa9,0x7e,0x7e,0xad,0x46,0x2a,0x80,0x4b,0x7c,0xb3,0xae,0x81,0x4d,0x7e,0x29,0x6b,0x3d,0xb4,0x6e,0x71,0xc9,0x3d,0x3e,0xca,0x71,0x76,0xd0,0x78,0x7a,0xce,0x76,0x75,0xc6,0x3e, -0x3f,0xc9,0x6f,0x6d,0xb3,0x3e,0x04,0x4e,0x7c,0xb3,0xae,0x81,0x81,0xae,0xb1,0x00,0x00,0x02,0x00,0xa0,0xff,0xec,0x04,0x14,0x05,0xa3,0x00,0x0b,0x00,0x17,0x00,0x26,0xb9,0x00,0x00,0x01,0x85,0x40,0x0b,0x0c,0x0c,0x19,0x12,0x8a,0x06,0x0f,0x9b,0x09,0x06,0x15,0xb8,0x01,0x7f,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed, -0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0x14,0xd6,0xe5,0xe0,0xd9,0xda,0xdf,0xe0,0xdb,0xa0,0x8c,0x8f,0x8a,0x8d,0x88,0x8f,0x92,0x89,0x02,0xc8,0xfe,0x7a,0xfe,0xaa,0x01,0x58,0x01,0x84,0x01,0x78,0x01,0x63,0xfe, -0xa0,0xfe,0x85,0x01,0x3c,0x01,0x13,0xfe,0xe1,0xfe,0xd0,0xfe,0xc9,0xfe,0xe7,0x01,0x11,0x00,0x00,0x01,0x00,0x8c,0xff,0xec,0x04,0x4d,0x05,0xa3,0x00,0x2c,0x00,0x56,0xb9,0x00,0x16,0x01,0x85,0x40,0x0e,0x2b,0x09,0x03,0x23,0x09,0x03,0x1d,0x1d,0x03,0x09,0x23,0x04,0x2e,0x28,0xbb,0x01,0x85,0x00,0x0f,0x00,0x2b,0x01,0x7f,0x40,0x15, -0x0c,0x1c,0x1d,0x00,0x0c,0x06,0x0c,0x1d,0x1d,0x0c,0x06,0x03,0x13,0x1f,0x99,0x1a,0x19,0x25,0x9b,0x13,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0xed,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x00,0x11,0x14,0x02,0x04,0x23,0x22,0x27,0x27,0x16,0x33,0x32,0x36,0x12,0x35,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x38,0x29,0x30,0x4c,0x34,0x3e,0x4c,0x94,0x6f,0x9e,0xbc,0x77,0xd6,0x84,0xeb,0x01,0x05,0xaf,0xfe,0xcf,0xc4,0x48,0x50,0x1b,0x5f,0x68,0x93,0xdc, -0x81,0xfe,0xa4,0x88,0x9d,0x68,0x54,0x3a,0x02,0xf2,0x0b,0x42,0x27,0x32,0x4e,0x5a,0x3f,0x68,0x95,0xd9,0xb3,0x7b,0xd3,0x79,0xfe,0xa1,0xfe,0xb6,0xe2,0xfe,0x95,0xc1,0x0a,0xa5,0x19,0x92,0x01,0x1e,0xb6,0x02,0x2f,0xbd,0x90,0x66,0x88,0x00,0x00,0x02,0x00,0x64,0xff,0xec,0x05,0x7f,0x06,0x3b,0x00,0x4c,0x00,0x55,0x00,0x85,0xb5,0x31, -0x1a,0x1a,0x13,0x21,0x4d,0xbe,0x01,0x85,0x00,0x2b,0x00,0x25,0x01,0x84,0x00,0x52,0x00,0x38,0x01,0x85,0x40,0x0b,0x13,0x2b,0x52,0x13,0x13,0x52,0x2b,0x03,0x57,0x4c,0x04,0xb8,0x01,0x85,0xb4,0x48,0x40,0x9b,0x0b,0x50,0xb8,0x01,0x7e,0x40,0x13,0x28,0x55,0x9b,0x21,0x1a,0x9b,0x31,0x0b,0x28,0x21,0x31,0x31,0x21,0x28,0x0b,0x04,0x2f, -0x10,0x07,0xb8,0x01,0x7f,0x40,0x0b,0x3b,0x45,0x19,0x16,0x1d,0x9b,0x4c,0x00,0x34,0x2f,0x06,0x00,0x3f,0x33,0xc4,0x32,0xed,0x32,0x3f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x11,0x39,0x11, -0x33,0x31,0x30,0x13,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x11,0x34,0x23,0x22,0x06,0x07,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x2e,0x02, -0x23,0x22,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x94,0x66,0x65,0x57,0x24,0x47,0x3e,0x6c,0x68,0x30,0x5f,0x5a,0x53,0x24,0x20,0x2c,0x62,0x22,0x5a,0x2f,0x23,0x2c,0x5c,0x52,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x92,0x6a,0x2d,0x83,0x41,0x69,0x76,0x85, -0x59,0x34,0x56,0x54,0x59,0x37,0x36,0x5e,0x5b,0x5f,0x37,0x78,0x77,0x26,0x35,0x02,0x1d,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x13,0x72,0x6e,0xfb,0xa2,0x72,0x11,0x17,0x28,0x19,0x1e,0x19,0x38,0x20,0x03,0xbd,0x8a,0x46,0x38,0x2a,0x33,0x74,0x55,0x56,0xbd,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x01,0xfd,0xa8,0x9b,0x82,0x3a,0x48, -0x9b,0x8b,0xfc,0x21,0x45,0x6d,0x19,0x1e,0x19,0x19,0x1e,0x19,0x67,0x6d,0x04,0x44,0x5b,0x43,0x0f,0xfc,0xd9,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x02,0x00,0xa0,0xff,0xec,0x06,0x1e,0x05,0xa3,0x00,0x28,0x00,0x31,0x00,0x5e,0xb9,0x00,0x15,0x01,0x84,0xb2,0x2e,0x22,0x08,0xbb,0x01,0x85,0x00,0x09,0x00,0x28,0x01,0x85,0x40,0x0b, -0x00,0x2e,0x09,0x00,0x00,0x09,0x2e,0x03,0x33,0x11,0x29,0xb8,0x01,0x85,0x40,0x0f,0x1b,0x31,0x9b,0x22,0x1f,0x11,0x11,0x18,0x04,0x0d,0x9b,0x24,0x1f,0x06,0x2c,0xb8,0x01,0x7e,0xb4,0x18,0x19,0x00,0x09,0x18,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f, -0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x21,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x25,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x7e,0x82,0x62,0x69, -0x82,0xa0,0x82,0x69,0x63,0x81,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0xd4,0xb0,0x64,0xa2,0x35,0x6c,0xcf,0xaf,0xd5,0xfb,0x22,0x22,0x1c,0x37,0x4d,0x28,0x04,0x1e,0x70,0x89,0x8a,0x6f,0xfb,0xe2,0x04,0x1e,0x6f,0x8a,0x8a,0x6f,0xfd,0xc0,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x03,0x89,0xb5,0xd2,0x44,0x42,0x86,0xd1,0xb6,0xfb,0xe4, -0xba,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x01,0x00,0xa0,0xff,0xec,0x04,0xc4,0x06,0x27,0x00,0x3d,0x00,0x6f,0x40,0x12,0x08,0x89,0x32,0x38,0x8b,0x03,0x2f,0x00,0x32,0x00,0x03,0x03,0x00,0x32,0x03,0x28,0x0b,0x1f,0xb8,0x01,0x85,0xb6,0x1c,0x0b,0x1c,0x0b,0x1c,0x3f,0x28,0xb8,0x01,0x85,0x40,0x14,0x15,0x23,0x19,0x19,0x1d,0x35, -0x0e,0x2f,0x2f,0x12,0x03,0x35,0x3b,0x3b,0x12,0x06,0x9b,0x35,0x06,0x2b,0xb8,0x01,0x7f,0xb4,0x12,0x19,0x0b,0x0c,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0x10,0xc4,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10, -0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x00,0x25,0x36,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23, -0x22,0x26,0x03,0x9f,0x51,0x37,0x08,0x57,0x44,0xb6,0xe7,0xf1,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x01,0x00,0x01,0x1e,0xa9,0x97,0xa0,0x5a,0xac,0xa3,0xa4,0xb7,0x5a,0x6a,0x64,0x2e,0x77,0x7d,0x2d,0x93,0xa6,0xb8,0x9f,0x96,0xb3,0x58,0x44,0x39,0x50,0x02,0x26,0x39,0x4f,0x3b,0x44,0xdc,0x90,0xdd,0x56,0xa0,0x21,0x11,0x12, -0xc2,0x9f,0x01,0x0f,0x01,0x05,0x01,0x2e,0x4e,0x2d,0x61,0x41,0x7b,0x73,0x56,0x81,0x58,0x2b,0x2c,0x82,0xc7,0x8b,0xd6,0x83,0x89,0x0f,0x0f,0x01,0x3d,0xd9,0x93,0xb1,0xc8,0xcb,0xa7,0x4c,0x5e,0x4f,0x00,0x02,0x00,0xa0,0xff,0xec,0x04,0xf8,0x06,0x3b,0x00,0x4e,0x00,0x5a,0x00,0xa2,0xb9,0x00,0x4f,0x01,0x84,0xb4,0x3e,0x46,0x3c,0x3e, -0x44,0xbb,0x01,0x84,0x00,0x55,0x00,0x04,0x01,0x85,0x40,0x1f,0x4a,0x2a,0x89,0x15,0x1b,0x8b,0x24,0x13,0x21,0x15,0x21,0x24,0x24,0x21,0x15,0x03,0x0c,0x2d,0x3e,0x55,0x4a,0x2d,0x00,0x00,0x2d,0x4a,0x55,0x3e,0x05,0x5c,0x0c,0xb8,0x01,0x85,0x40,0x1e,0x37,0x00,0x4e,0x41,0x30,0x13,0x27,0x9b,0x18,0x46,0x3c,0x08,0x13,0x34,0x24,0x1e, -0x08,0x52,0x18,0x41,0x1e,0x18,0x1e,0x18,0x34,0x58,0x9b,0x41,0x06,0x0f,0xb8,0x01,0x7f,0xb4,0x34,0x19,0x2d,0x2e,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x39,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f, -0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x15,0x14,0x06,0x06,0x23,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x26,0x26,0x23, -0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x3e,0x02,0x35,0x35,0x34,0x36,0x37,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x04,0xf8,0x37,0x23,0x7d,0xf5,0x8f,0xae,0xaf,0x6a,0x64,0x2e,0x77,0x7d, -0x2d,0xfe,0xc7,0xc5,0x92,0x96,0xb3,0x58,0x44,0x39,0x50,0x51,0x37,0x08,0x57,0x44,0x53,0x63,0xf9,0xdf,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x43,0x8b,0x72,0x61,0x7a,0x62,0x5f,0x84,0x1b,0x41,0x62,0x38,0x67,0x64,0xfd,0x3f,0x30,0x23,0x24,0x31,0x31,0x24,0x23,0x30,0x05,0xb1,0x10,0x45,0x58,0x53,0x56,0x80,0x47,0x1d,0xbe, -0xaf,0x86,0x83,0x89,0x0f,0x0f,0x01,0x7c,0xf5,0x8b,0xb8,0xcb,0xa7,0x4c,0x5e,0x4f,0x3a,0x39,0x4f,0x3b,0x44,0x60,0x53,0x7a,0xc7,0x3d,0xa0,0x21,0x11,0x12,0xc2,0x9f,0xbf,0x7f,0xa2,0x7d,0x2a,0x43,0x70,0x5f,0x83,0x86,0x5b,0x34,0x33,0x01,0x2e,0x4b,0x25,0x88,0x6f,0x71,0x13,0xfe,0x57,0x23,0x30,0x30,0x23,0x24,0x31,0x31,0x00,0x01, -0x00,0x7b,0xff,0xec,0x04,0x61,0x06,0x3b,0x00,0x3a,0x00,0x76,0xb9,0x00,0x24,0x01,0x85,0xb4,0x0b,0x32,0x89,0x00,0x1e,0xb8,0x01,0x85,0x40,0x11,0x17,0x12,0x13,0x0b,0x00,0x39,0x17,0x13,0x13,0x17,0x39,0x00,0x0b,0x05,0x3c,0x1a,0x05,0xb8,0x01,0x85,0xb3,0x2b,0x13,0x12,0x02,0xb8,0x01,0x7f,0x40,0x0d,0x2e,0x00,0x2e,0x35,0x12,0x2e, -0x35,0x35,0x2e,0x12,0x03,0x20,0x08,0xb8,0x01,0x7f,0x40,0x0a,0x27,0x19,0x1a,0x1b,0x17,0x1e,0x0f,0x9b,0x20,0x06,0x00,0x3f,0xed,0x39,0x39,0xc4,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed, -0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x33,0x32,0x00,0x11,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x02,0x4c,0x16, -0x3a,0x54,0x68,0x9c,0x89,0xb3,0xa9,0xac,0xa5,0x6d,0xba,0x2e,0x65,0x11,0x0c,0x04,0x2f,0x2d,0x2f,0x60,0x6c,0x02,0x70,0x74,0xfc,0x01,0x09,0xff,0xf1,0x84,0xd6,0x77,0xbc,0x9e,0x49,0x77,0x43,0x4c,0x3e,0x35,0x4b,0x30,0x02,0x9d,0x16,0x88,0x66,0x90,0xbd,0x01,0x08,0x01,0x13,0x9e,0xef,0xed,0x63,0x4e,0x72,0x26,0x1b,0x15,0x19,0x2a, -0x3e,0x0c,0x8a,0x13,0x72,0x4b,0x38,0xfe,0xc8,0xfe,0xd0,0xba,0xfe,0xbd,0xfe,0xae,0x79,0xd3,0x7b,0xb3,0xd9,0x44,0x76,0x43,0x3f,0x5a,0x4f,0x31,0x27,0x42,0x00,0x02,0x00,0xa0,0xff,0xec,0x05,0x85,0x06,0x3b,0x00,0x37,0x00,0x40,0x00,0x76,0xb9,0x00,0x1c,0x01,0x84,0xb5,0x3d,0x28,0x11,0x11,0x38,0x2e,0xbb,0x01,0x85,0x00,0x0a,0x00, -0x04,0x01,0x85,0x40,0x0d,0x33,0x3d,0x0a,0x37,0x33,0x33,0x37,0x0a,0x3d,0x04,0x42,0x18,0x38,0xb8,0x01,0x85,0x40,0x15,0x22,0x40,0x9b,0x18,0x11,0x9b,0x28,0x18,0x28,0x18,0x28,0x1f,0x0e,0x14,0x9b,0x37,0x00,0x2a,0x26,0x06,0x3b,0xb8,0x01,0x7e,0xb2,0x1f,0x19,0x30,0xb8,0x01,0x7f,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33, -0xc6,0x32,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15, -0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x04,0xba,0x66,0x65,0x85,0x72,0x72,0x7f,0x28,0x30,0x23,0x63,0x52,0x2b,0x5a,0x54,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x91, -0x6a,0x6c,0x84,0x6a,0x76,0x54,0x27,0x2d,0x29,0x31,0xfc,0xb5,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x15,0x6e,0x65,0xfb,0x6d,0x64,0x70,0x69,0x5d,0x03,0xdb,0x46,0x44,0x49,0x5f,0x33,0x74,0x55,0x56,0xfd,0x73,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x03,0xcd,0xa8,0x9b,0x82,0x82,0x9d,0x89,0xfc,0x67,0x6c,0x39,0x39,0x04,0x2c,0x57, -0x3c,0x08,0xfb,0x09,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x01,0x00,0xa0,0xff,0xec,0x04,0x8e,0x06,0x27,0x00,0x45,0x00,0x6d,0xb9,0x00,0x00,0x01,0x85,0xb5,0x43,0x33,0x13,0x13,0x0c,0x2e,0xb8,0x01,0x85,0x40,0x0f,0x1a,0x1f,0x89,0x28,0x43,0x1a,0x22,0x28,0x28,0x22,0x1a,0x43,0x04,0x47,0x0c,0xbb,0x01,0x85,0x00,0x39,0x00,0x13,0x01, -0x81,0x40,0x09,0x33,0x1f,0x25,0x33,0x25,0x33,0x2b,0x17,0x0f,0xb8,0x01,0x7f,0x40,0x0b,0x31,0x36,0x19,0x05,0x3f,0x3f,0x44,0x1d,0x9b,0x2b,0x06,0x00,0x3f,0xed,0xc4,0x39,0x11,0x33,0x3f,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x39,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11, -0x33,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x0e,0x04,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x17,0x16,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x3e,0x02,0x37, -0x3e,0x02,0x35,0x35,0x33,0x04,0x8e,0x2e,0x54,0x92,0x9a,0x7e,0x72,0x56,0x3a,0x20,0x3b,0x36,0x22,0x5a,0x2f,0x23,0x2c,0x2f,0x54,0x2b,0x41,0x39,0x52,0x3c,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x8a,0x9e,0x8e,0x6a,0x92,0x6a,0x2d,0x84,0x40,0x6c,0x82,0x38,0x73,0xc5,0xc1,0x72,0x71,0x3a,0xa0,0x05,0xb4,0x4a,0x72,0x55, -0x44,0x26,0x20,0x36,0x4e,0x73,0xa1,0x6f,0xfe,0xf0,0x44,0x46,0x46,0x38,0x2a,0x32,0x3b,0x39,0x01,0x9f,0x98,0x75,0x90,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80,0xe4,0xbc,0xb9,0xf9,0x82,0x3b,0x47,0xa1,0x85,0x01,0x2c,0x8b,0xcd,0x8f,0x6c,0x39,0x23,0x3d,0x52,0x30,0x7b,0x00,0x01,0x00,0xe9,0xff,0xec,0x04,0xac,0x06,0x3b, -0x00,0x43,0x00,0x85,0xb9,0x00,0x2f,0x01,0x85,0xb5,0x1b,0x40,0x04,0x8a,0x05,0x0b,0xb8,0x01,0x85,0x40,0x15,0x3b,0x05,0x23,0x38,0x29,0x3b,0x00,0x1b,0x10,0x23,0x29,0x3b,0x3b,0x29,0x23,0x10,0x1b,0x00,0x06,0x45,0x15,0xb8,0x01,0x85,0x40,0x20,0x36,0x00,0x43,0x3e,0x1e,0x9b,0x2c,0x38,0x12,0x9b,0x0f,0x20,0x26,0x2c,0x40,0x05,0x3e, -0x26,0x2c,0x0f,0x05,0x05,0x0f,0x2c,0x26,0x04,0x33,0x08,0x9b,0x3e,0x06,0x18,0xb8,0x01,0x7f,0xb1,0x33,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x39,0x10,0xed,0x10,0xc4,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39, -0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x21,0x07,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35, -0x10,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x34,0x36,0x37,0x04,0xac,0x37,0x23,0xa2,0x22,0x8e,0x61,0x6a,0x85,0x35,0x63,0x46,0x01,0x3c,0x10,0xed,0x8f,0xb5,0xb8,0x8c,0x91,0xa8,0x41,0x30,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x7e,0x8d,0x78,0xda,0x87,0xdf,0xfe,0xfb,0xdc,0x57,0x5e,0xe0,0xb6,0xa3,0x69,0x67, -0x64,0x05,0xb1,0x10,0x45,0x58,0xa4,0x56,0x61,0x70,0x5b,0x35,0x58,0x32,0x8c,0xb2,0x91,0x8f,0xb7,0x7d,0x6d,0x49,0x5e,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80,0xa7,0x99,0x6c,0xa2,0x58,0xf1,0xcd,0x01,0x2d,0x69,0x26,0x8b,0x5b,0x9b,0xbc,0x5b,0x6f,0x71,0x13,0x00,0x02,0x00,0x84,0x00,0x45,0x03,0x96,0x05,0xa3,0x00,0x0e, -0x00,0x1d,0x00,0x1f,0x40,0x0f,0x0f,0x89,0x00,0x00,0x1f,0x07,0x89,0x17,0x0b,0x9a,0x13,0x03,0x9b,0x1b,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x12,0x37,0x14,0x02,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32, -0x12,0x02,0xef,0x60,0x4c,0x4e,0x7c,0x4e,0x33,0x55,0x2f,0x4f,0x77,0x47,0xa7,0x75,0xc9,0x87,0x67,0x95,0x51,0x7a,0xd7,0x7c,0x98,0xad,0x03,0x81,0xb6,0xe2,0xb0,0xfe,0xa8,0xb8,0x72,0xb7,0x62,0xa8,0x01,0x5f,0xa0,0xf3,0xfe,0x7f,0xbc,0x8f,0x01,0x1e,0xba,0xd5,0x01,0x5e,0xc4,0xfe,0xd5,0x00,0x00,0x01,0x00,0x69,0xfe,0xf1,0x03,0x48, -0x05,0xa3,0x00,0x2e,0x00,0x3d,0x40,0x0f,0x00,0x89,0x15,0x1c,0x89,0x28,0x15,0x21,0x28,0x28,0x21,0x15,0x03,0x30,0x0e,0xb8,0x01,0x83,0x40,0x0e,0x09,0x0c,0x24,0x0c,0x24,0x05,0x18,0x9b,0x2c,0x06,0x11,0x99,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10, -0xed,0x31,0x30,0x01,0x14,0x02,0x02,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x16,0x33,0x32,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x12,0x36,0x33,0x32,0x12,0x03,0x48,0x5d,0x88,0xa7,0x50,0x3b,0x7b,0x4d,0x4d,0x11,0x1f,0x06,0x0b, -0x51,0x2d,0x46,0x93,0x53,0x3c,0x36,0x42,0x75,0x4d,0x27,0x10,0x09,0x5f,0x1d,0x11,0x38,0x22,0x74,0xcc,0x7a,0x7f,0x8b,0x03,0x60,0xec,0xfe,0x42,0xfe,0xdd,0xa2,0x4f,0x7b,0x3a,0x12,0x3a,0x20,0x3b,0x61,0x01,0x52,0x01,0xf7,0xcb,0xb6,0xca,0xc0,0xfe,0xa8,0x90,0x72,0x8f,0x29,0x17,0x15,0x1a,0x44,0x68,0x96,0x5a,0x01,0x0e,0x01,0x9e, -0xe2,0xfe,0xd5,0x00,0x00,0x01,0x00,0x84,0x00,0x8a,0x04,0x64,0x05,0xa3,0x00,0x3f,0x00,0x4e,0xb5,0x0c,0x32,0x08,0x32,0x0f,0x00,0xb8,0x01,0x83,0x40,0x21,0x3b,0x2f,0x89,0x15,0x3b,0x15,0x0f,0x20,0x20,0x0f,0x15,0x3b,0x04,0x41,0x1c,0x89,0x27,0x32,0x08,0x0c,0x05,0x08,0x3d,0x3d,0x08,0x05,0x0c,0x04,0x23,0x17,0x9b,0x2c,0x06,0x00, -0x3f,0xed,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x17,0x16,0x15, -0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x03,0x03,0x36,0x33,0x32,0x16,0x33,0x32,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x04,0x64,0x0f,0x6e,0x65,0x44,0x1f,0x3a,0x1f,0x2b,0x35,0x0a,0x09,0x15,0x3e,0x0b,0x01,0x1a,0x29,0x31,0x68,0x41,0xb8,0x9e,0x55,0x30,0x09,0x5f,0x1c,0x13,0x31,0x21,0x6f, -0xcc,0xf4,0x72,0x78,0x89,0xa9,0xc5,0x0d,0x14,0x18,0x2c,0x1b,0x17,0x62,0x21,0x0b,0x0d,0x0b,0x23,0x4c,0x02,0x21,0x11,0x2d,0xd7,0x60,0x12,0x22,0x07,0x40,0x10,0x16,0x16,0x02,0x32,0x52,0xaa,0x28,0xb2,0x9b,0xf7,0xfe,0xeb,0x89,0x5b,0x7d,0x18,0x11,0x17,0x47,0x5b,0x8b,0x3f,0xbf,0x01,0x6d,0x01,0x23,0xa5,0xa4,0x86,0x71,0xfe,0xbb, -0xfe,0x84,0x04,0x09,0x8d,0x51,0x1c,0x17,0x23,0x00,0x00,0x01,0x00,0x84,0x01,0x73,0x04,0x1b,0x05,0xa3,0x00,0x54,0x00,0x4c,0x40,0x28,0x47,0x89,0x14,0x41,0x4b,0x0c,0x14,0x34,0x23,0x0c,0x14,0x00,0x00,0x14,0x0c,0x23,0x34,0x05,0x56,0x2f,0x89,0x3a,0x16,0x2b,0x9b,0x3e,0x41,0x3e,0x51,0x1f,0x51,0x1f,0x04,0x37,0x4b,0x03,0x0a,0x43, -0x3e,0x06,0x00,0x3f,0x33,0xc4,0x17,0x32,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x07,0x22,0x35,0x35,0x34,0x37,0x37,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07, -0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x16,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x16,0x04,0x0e,0x62,0x7f,0x2a,0x11,0x2d,0x28,0x23,0x23, -0x10,0x36,0x43,0x20,0x9b,0x2a,0x3b,0x19,0x15,0x16,0x2b,0x31,0x38,0x24,0x23,0x30,0x27,0x1b,0x11,0x2f,0x2b,0x25,0x48,0x29,0x23,0x38,0x58,0x35,0x0d,0x11,0x0d,0x6b,0x1e,0x12,0x36,0x5f,0xa8,0x72,0x29,0x68,0x16,0x5e,0x61,0x36,0x53,0x2f,0x54,0x50,0x8d,0x18,0x1c,0x20,0x4f,0x1c,0x0d,0x15,0x11,0x32,0x02,0x62,0x22,0x71,0x51,0x07, -0x0f,0x03,0x24,0x0d,0x0e,0x71,0x39,0x01,0x23,0x4d,0xc1,0x35,0x26,0x31,0x32,0x61,0x90,0x5d,0x5c,0x66,0x2e,0x1d,0x11,0x14,0x6d,0x5e,0xb5,0x62,0x26,0x26,0x82,0xfe,0xf1,0x90,0x4b,0x5c,0x3c,0x29,0x16,0x14,0x41,0xc6,0x49,0xe7,0x01,0x75,0xb7,0x32,0x23,0x55,0x32,0x57,0x33,0x4a,0xf1,0x94,0xfe,0x0b,0x3e,0x32,0x18,0x24,0x00,0x01, -0x00,0x84,0xff,0xc3,0x03,0x45,0x05,0xa7,0x00,0x26,0x00,0x2d,0x40,0x17,0x10,0x12,0x04,0x89,0x1f,0x25,0x12,0x1f,0x1f,0x12,0x25,0x03,0x28,0x18,0x8a,0x0b,0x1b,0x9a,0x08,0x10,0x06,0x00,0x07,0x00,0x3f,0x3f,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x32,0x16,0x16,0x15,0x10,0x02, -0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x02,0xa9,0x20,0x4c,0x30,0x69,0xba,0x83,0x8c,0x8f,0x8d,0x81,0x1a,0x15,0x0e,0x57,0x2c,0x75,0x5d,0x43,0x3b,0x4a,0x6e,0x40,0x28,0x2e,0x08,0x54,0x05,0xa7,0x9c,0xed, -0x6b,0xfe,0xef,0xfe,0x1c,0xfb,0xee,0xe8,0xd0,0x01,0x65,0x8e,0x1c,0x36,0x0c,0x14,0x3a,0xa0,0xfe,0xed,0x98,0x94,0xbb,0xde,0x01,0xa1,0xca,0x94,0xb9,0x49,0x0c,0x13,0x11,0x4a,0x00,0x01,0x00,0x84,0x01,0x46,0x03,0x79,0x05,0xa7,0x00,0x33,0x00,0x49,0xb9,0x00,0x31,0x01,0x83,0xb4,0x07,0x2f,0x89,0x28,0x0a,0xb8,0x01,0x84,0x40,0x1b, -0x21,0x00,0x07,0x28,0x21,0x21,0x28,0x07,0x00,0x04,0x35,0x19,0x8b,0x13,0x0a,0x16,0x2b,0x04,0x16,0x04,0x16,0x0f,0x2b,0x07,0x1d,0x99,0x0f,0x00,0x2f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27, -0x27,0x26,0x27,0x27,0x06,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x07,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x27,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x17,0x13,0x17,0x16,0x03,0x79,0x3b,0x29,0x19,0x2e,0x19,0x1a,0x18,0x0a,0x05,0x06,0x29,0x35,0x5a,0x49,0x57,0x65,0x2d, -0x1e,0x37,0x27,0x1d,0x04,0x2a,0x2b,0x30,0x38,0x0d,0x06,0x0b,0x1d,0x14,0x16,0x04,0x3e,0x17,0x1b,0x17,0x14,0x0b,0x04,0x64,0x3c,0x24,0x01,0xdd,0x17,0x23,0x7b,0x8b,0x8a,0x77,0x80,0x2b,0x7f,0xfe,0x64,0xa3,0x51,0x71,0xe0,0xf8,0x21,0x1b,0x15,0x14,0xed,0x72,0x68,0xa7,0xd6,0x5a,0xa9,0x3a,0x3c,0x40,0x10,0x45,0x11,0x11,0x1f,0x18, -0x47,0x45,0x18,0xfe,0x6e,0xd2,0x7f,0x00,0x00,0x01,0x00,0x84,0xff,0xc3,0x03,0xdd,0x05,0xa3,0x00,0x40,0x00,0x49,0xb7,0x06,0x89,0x22,0x00,0x3b,0x8b,0x36,0x27,0xb8,0x01,0x82,0x40,0x1c,0x2e,0x22,0x15,0x36,0x2e,0x2e,0x36,0x15,0x22,0x04,0x42,0x1c,0x89,0x0d,0x24,0x00,0x00,0x2b,0x2b,0x39,0x1f,0x9a,0x09,0x39,0x06,0x19,0x12,0x06, -0x00,0x3f,0x33,0x3f,0xd4,0xed,0x12,0x39,0x2f,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x10,0x02,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x02,0x15,0x10,0x12,0x33,0x32, -0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x07,0x06,0x15,0x14,0x02,0x7d,0x14,0x2a,0x16,0x78,0x94,0xc8,0xbe,0x88,0xd5,0x76,0x60,0xad,0xd8,0x60,0x37,0x26,0x10,0x2a,0x2f,0xb7,0xdc,0xa1,0x8a,0x70,0x72,0x7c,0x17,0x2e,0x20,0x01, -0x01,0x17,0x22,0x1f,0x17,0x0e,0x0d,0x08,0x08,0x1d,0x30,0x4f,0x0b,0x0b,0x03,0x2a,0x06,0x0d,0xb3,0x93,0xfe,0xee,0xfe,0xde,0xb1,0x01,0x49,0xd2,0x9a,0x01,0x1e,0xdb,0x81,0x13,0x1a,0x31,0x1d,0x12,0x07,0x1a,0xfe,0xa4,0xff,0xfe,0xee,0xfe,0xc6,0xb9,0xc6,0xf6,0x31,0x49,0x19,0x1c,0x1d,0x15,0x22,0x33,0x5d,0x5c,0x35,0x26,0x44,0x44, -0x24,0x29,0x28,0x3e,0x1e,0x46,0x47,0x2e,0x23,0x00,0x00,0x01,0x00,0x84,0xff,0xf6,0x03,0xe8,0x05,0xa3,0x00,0x3e,0x00,0x4a,0x40,0x29,0x00,0x89,0x2c,0x23,0x89,0x0a,0x27,0x89,0x06,0x2c,0x0a,0x06,0x16,0x16,0x06,0x0a,0x2c,0x04,0x40,0x37,0x10,0x89,0x1d,0x34,0x34,0x20,0x30,0x9b,0x3b,0x06,0x0d,0x9b,0x20,0x06,0x16,0x19,0x18,0x29, -0x9a,0x03,0x18,0x00,0x3f,0xed,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35, -0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x10,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x03,0xe8,0x91,0x9e,0x6b,0x60,0x0d,0x0c,0x34,0x3c,0x3c,0x30,0x34,0x35,0x08,0x1a,0x59,0x19,0x2b,0x53,0x42,0x9b,0x89,0x78,0x90,0x0c,0x0c,0x41,0x34,0x34,0x5b, -0xa1,0x60,0x23,0x46,0x47,0x20,0x09,0x20,0x14,0xab,0x62,0x95,0xeb,0x83,0x02,0xa5,0xfe,0x97,0xfe,0xba,0xb8,0xb6,0x33,0x95,0x94,0x30,0x7c,0x71,0xb2,0xb6,0x85,0xdd,0x6d,0x0f,0x1b,0x0f,0x15,0x4f,0xab,0x01,0x50,0x71,0xea,0x01,0x09,0xbd,0x9b,0x31,0x94,0x89,0x39,0xfe,0xf8,0x01,0x20,0x01,0x07,0xa6,0x01,0x23,0xa8,0x16,0x17,0x21, -0x2f,0x1e,0x18,0x31,0xc4,0xfe,0x9f,0x00,0x00,0x01,0x00,0x70,0x00,0x45,0x03,0x6c,0x05,0xa7,0x00,0x31,0x00,0x41,0xb9,0x00,0x1c,0x01,0x85,0x40,0x10,0x17,0x05,0x89,0x27,0x17,0x27,0x00,0x00,0x27,0x17,0x03,0x33,0x22,0x8b,0x14,0x22,0xb8,0x01,0x81,0xb5,0x11,0x2f,0x11,0x2f,0x19,0x27,0xb8,0x01,0x80,0xb2,0x0a,0x19,0x07,0x00,0x3f, -0xd4,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xec,0x10,0xed,0x31,0x30,0x01,0x14,0x07,0x06,0x06,0x07,0x0e,0x02,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x37,0x37,0x32,0x17,0x17,0x32,0x37, -0x3e,0x04,0x17,0x32,0x16,0x03,0x6c,0x2e,0x24,0x56,0x16,0x1b,0x17,0x20,0x0f,0x26,0x47,0x47,0x23,0x24,0x3f,0x3f,0x20,0x1d,0x27,0x67,0x01,0x43,0x09,0x44,0x23,0x31,0x12,0x14,0x26,0x57,0xfe,0xef,0x39,0x34,0x0e,0x65,0x20,0x11,0x21,0x0e,0x1f,0x0e,0x54,0x20,0x17,0x1f,0x4e,0x02,0xc6,0x14,0x4c,0x4b,0xd1,0x55,0x69,0x2a,0x1d,0x0f, -0x0e,0x0e,0x0f,0x25,0x26,0x30,0x01,0x24,0x03,0xa9,0x1a,0x1a,0x13,0x0e,0x34,0x2f,0x5b,0xe2,0xfd,0x1f,0x07,0x04,0x10,0x03,0x68,0x2d,0x60,0x25,0xd5,0x34,0x03,0x27,0x00,0x01,0x00,0x84,0xff,0xc3,0x03,0x33,0x05,0xa7,0x00,0x37,0x00,0x3f,0x40,0x21,0x00,0x1f,0x2d,0x89,0x0e,0x33,0x89,0x08,0x1f,0x0e,0x08,0x08,0x0e,0x1f,0x03,0x39, -0x14,0x89,0x27,0x36,0x9a,0x02,0x1c,0x02,0x1c,0x2a,0x17,0x9a,0x23,0x11,0x9b,0x2a,0x07,0x00,0x3f,0xed,0xd4,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x06,0x23,0x27,0x26,0x23,0x22,0x35,0x34,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x02, -0x11,0x10,0x12,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x03,0x07,0x25,0x0d,0x22,0x5d,0x3d,0x3b,0x21,0x33,0x40,0x16,0x3c,0x30,0x72,0x79,0x73,0x66,0x4c,0x31,0x35,0x09,0x10,0x16,0x42,0x5d,0x89,0x4e, -0x72,0xa8,0x5b,0xe6,0xd5,0x6e,0x86,0x2e,0x55,0x0e,0x13,0x24,0x33,0x21,0x01,0x94,0x13,0x4e,0x04,0x12,0x3b,0x18,0x54,0x81,0xdb,0x97,0x48,0x72,0x80,0xfe,0x9f,0xfe,0xc4,0xfe,0xf4,0xfe,0xda,0x3c,0x40,0x0b,0x3a,0x19,0x21,0x61,0x3d,0xa4,0x01,0x3b,0xde,0x01,0x85,0x01,0xa2,0xd1,0xab,0x4c,0xc0,0xe1,0x23,0x29,0x0e,0x10,0x0f,0x0b, -0x08,0x00,0x00,0x02,0x00,0x60,0xff,0xe7,0x04,0xa2,0x04,0x19,0x00,0x0b,0x00,0x17,0x00,0x23,0x40,0x0d,0x09,0x89,0x15,0x15,0x19,0x0f,0x89,0x03,0x0c,0x9b,0x06,0x06,0x12,0xb8,0x01,0x7f,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x14, -0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x81,0xf5,0xfe,0xd4,0x01,0x2c,0x01,0x01,0xf8,0x01,0x1d,0xfe,0xdf,0xfa,0xb3,0xcc,0xd0,0xaf,0xb5,0xbe,0xbe,0x19,0x01,0x21,0xec,0x01,0x02,0x01,0x23,0xfe,0xe7,0xfc,0xfb,0xfe,0xde,0x03,0xa6,0xd9,0xba,0xb5,0xd2,0xcb,0xc0,0xc1,0xce,0x00,0x00,0x01,0x00,0x50, -0xff,0xe7,0x03,0x44,0x04,0x19,0x00,0x15,0x00,0x28,0x40,0x0b,0x0a,0x00,0x05,0x89,0x10,0x0b,0x15,0x0b,0x15,0x02,0x0d,0xb8,0x01,0x7f,0xb5,0x08,0x19,0x13,0x9b,0x02,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xed,0xc4,0x32,0x31,0x30,0x13,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x23,0x22,0x27,0x35,0x16,0x33, -0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x56,0x72,0x9e,0xdf,0xff,0xfe,0xf8,0xf2,0x8e,0x6c,0x69,0x8f,0xa9,0xad,0xa1,0x9d,0x96,0x74,0x03,0xd3,0x46,0xfe,0xe5,0xf6,0xfe,0xfc,0xfe,0xe3,0x38,0xa2,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x00,0x02,0x00,0x2d,0xfd,0x6d,0x03,0xe5,0x04,0x19,0x00,0x1c,0x00,0x27,0x00,0x50,0xb9,0x00,0x0d,0x01, -0x83,0x40,0x0b,0x25,0x19,0x8a,0x0b,0x25,0x0b,0x25,0x0b,0x29,0x03,0x20,0xb8,0x01,0x83,0xb3,0x13,0x03,0x04,0x22,0xb8,0x01,0x7d,0x40,0x11,0x10,0x0d,0x10,0x16,0x04,0x10,0x04,0x10,0x00,0x1d,0x9b,0x16,0x06,0x06,0x9a,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed, -0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x00,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xb0,0x7b,0xb8,0x50,0xa8,0xdf,0x77,0xb4,0x63,0x1d,0x0c, -0x73,0x60,0x64,0x71,0x80,0x86,0xb6,0xb8,0xfe,0xd1,0x68,0x2f,0x33,0x60,0x2b,0x33,0x31,0xfd,0x6d,0x23,0x28,0xaa,0x6c,0x79,0xe6,0x9d,0x02,0x25,0xb3,0x65,0x59,0x65,0x70,0x61,0x6d,0x6a,0xe8,0xdd,0xfd,0x9e,0xfe,0xce,0xfe,0xad,0x06,0x3d,0x35,0x31,0x5f,0x34,0x2d,0x30,0x34,0x00,0x00,0x01,0x00,0x50,0xfd,0x6d,0x03,0xd7,0x04,0x19, -0x00,0x25,0x00,0x40,0x40,0x18,0x1c,0x27,0x13,0x0a,0x25,0x10,0x89,0x05,0x19,0x99,0x1e,0x19,0x0b,0x0a,0x15,0x00,0x13,0x0a,0x00,0x0a,0x00,0x0d,0x25,0x02,0xb8,0x01,0x7f,0xb5,0x13,0x18,0x08,0x9b,0x0d,0x06,0x00,0x3f,0xed,0x3f,0xed,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0xc4,0x32,0x39, -0x10,0xc6,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x10,0x00,0x21,0x23,0x27,0x17,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x04,0x27,0x50,0x78,0xa2,0xc0,0xc6,0xb9,0xb2,0xad,0x82,0x7d,0xb2,0xf7,0x01,0x1a,0xfe,0xdd,0xfe,0xf1,0x1a,0x19,0x53,0xb6,0xe0,0x44,0x43, -0x36,0x36,0x59,0x49,0x94,0x8f,0x87,0x78,0x66,0x27,0xc1,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x9c,0x46,0xfe,0xe4,0xf5,0xfe,0xfc,0xfe,0xe3,0x02,0x5d,0xd2,0xb8,0x1b,0x90,0x20,0x52,0x80,0x9c,0x94,0x7b,0x1e,0x00,0x00,0x01,0x00,0x60,0xfd,0x6d,0x03,0xe5,0x04,0x19,0x00,0x21,0x00,0x46,0x40,0x1d,0x1f,0x0a,0x0e,0x89,0x0f,0x12,0x0f,0x0a, -0x0f,0x0a,0x0f,0x23,0x03,0x89,0x17,0x1e,0x1f,0x12,0x09,0x1f,0x09,0x1f,0x14,0x00,0x9b,0x1b,0x06,0x0a,0x06,0xb8,0x01,0x7f,0xb3,0x14,0x18,0x0f,0x18,0x00,0x3f,0x3f,0xed,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x22,0x06,0x15, -0x14,0x16,0x33,0x32,0x24,0x37,0x15,0x03,0x06,0x02,0x07,0x23,0x36,0x12,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x02,0x75,0xb0,0xbf,0x9e,0x9b,0x57,0x01,0x09,0x46,0xcd,0xa7,0xaf,0x26,0xbb,0x3e,0xea,0x01,0x24,0x6d,0x8b,0xd4,0xfe,0xff,0x84,0xf5,0x98,0x73,0xbf,0x3c,0x41,0xcd,0x03,0x8f, -0xa9,0x9c,0x93,0x98,0x3e,0x24,0x9c,0xfe,0xf7,0xd5,0xfe,0xe1,0x7b,0xa9,0x01,0x5d,0x01,0x50,0x30,0xed,0xce,0x87,0xd2,0x72,0x26,0x20,0x9c,0x29,0x2f,0x00,0x00,0x01,0x00,0x60,0xfd,0x6d,0x05,0xb0,0x04,0x19,0x00,0x32,0x00,0x59,0xb9,0x00,0x0a,0x01,0x84,0x40,0x21,0x05,0x18,0x17,0x2b,0x2b,0x1f,0x00,0x8a,0x0f,0x22,0x05,0x0f,0x0f, -0x05,0x22,0x03,0x34,0x1f,0x89,0x24,0x21,0x22,0x2b,0x18,0x07,0x22,0x18,0x18,0x22,0x07,0x03,0x28,0x0d,0xb8,0x01,0x7f,0xb7,0x02,0x19,0x14,0x1b,0x9b,0x2e,0x28,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x12,0x39,0x11,0x33, -0x33,0x10,0xed,0x31,0x30,0x01,0x10,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x05,0xb0,0xfa,0x6c,0x79,0x14,0x83,0x0e, -0x2e,0x26,0x5e,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0xfe,0x81,0xfe,0xec,0x75,0x64,0x50,0x24,0x2f,0x2d,0x30,0x32,0x8b,0x03,0x79,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca, -0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0x00,0x00,0x01,0x00,0x77,0xff,0xe7,0x04,0x35,0x07,0x62,0x00,0x31,0x00,0x50,0x40,0x26,0x19,0x8b,0x0d,0x1f,0x89,0x06,0x0d,0x06,0x13,0x2c,0x2c,0x13,0x06,0x0d,0x04,0x33,0x31,0x8a,0x26,0x12,0x06,0x19,0x22,0x13,0x13,0x22,0x2b,0x2c,0x2c,0x10,0x2e,0x9b,0x29,0x16,0x9b,0x10,0x06,0x03, -0xb8,0x01,0x7f,0xb1,0x22,0x19,0x00,0x3f,0xed,0x3f,0xed,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x39,0x2f,0x12,0x39,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x10,0x12,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15, -0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x00,0x11,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x01,0x1b,0xb1,0xc5,0x7a,0x84,0x7c,0x77,0x4b,0x32,0x1b,0x96,0x8b,0x73,0x54,0x29,0x60,0x3e,0x41,0x46,0x57,0x75,0x66,0x65,0xd8,0xcc,0xfe,0xed,0xfe,0xf9,0x01,0x3b,0x01,0x2f,0xb6,0x98,0xa5,0xa7,0xe7,0xe1, -0x02,0xe9,0xfe,0xb3,0xfe,0xd7,0x57,0x51,0x5b,0x4a,0x46,0x3b,0x45,0x4f,0x33,0x7f,0x92,0x2b,0x90,0x13,0x20,0x4c,0x39,0x33,0x55,0x43,0x3b,0x89,0x56,0xa0,0xa0,0x01,0x72,0x01,0x90,0x01,0x40,0x01,0x97,0x01,0xa2,0x4e,0xaa,0x6d,0xfe,0x9d,0xfe,0x86,0x00,0x01,0x00,0x60,0xfd,0x6d,0x06,0xec,0x04,0x19,0x00,0x32,0x00,0x5e,0x40,0x09, -0x08,0x07,0x1b,0x1b,0x0f,0x23,0x8a,0x32,0x2b,0xb8,0x01,0x83,0x40,0x21,0x2a,0x12,0x32,0x2a,0x2a,0x32,0x12,0x03,0x34,0x0f,0x89,0x14,0x04,0x0b,0x9b,0x18,0x11,0x12,0x1b,0x08,0x18,0x2a,0x12,0x08,0x08,0x12,0x2a,0x03,0x30,0x1e,0x18,0x06,0x25,0xb8,0x01,0x7f,0xb1,0x30,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f, -0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11, -0x14,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x11,0x05,0x0c,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0x5e,0x27,0x2d,0x0e,0x83,0x15,0x79,0x6d,0xfa,0x02,0x00,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b, -0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca,0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0xfc,0x85,0x89,0x32,0x30,0x2d,0x2f,0x26,0x3e,0x70,0x79,0x01,0x14,0x00,0x01,0x00,0x0a,0x00,0x00,0x04,0x3f,0x04,0x00,0x00,0x0e,0x00,0x2a,0x40,0x14,0x0b,0x89,0x08,0x07,0x00,0x00,0x04,0x0c,0x0c,0x10,0x03,0x89,0x04,0x00,0x04,0x07, -0x06,0x0c,0x04,0x18,0x00,0x3f,0x33,0x3f,0x12,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x33,0xed,0x31,0x30,0x01,0x06,0x02,0x07,0x23,0x36,0x12,0x37,0x33,0x16,0x12,0x17,0x23,0x26,0x02,0x02,0x25,0x2b,0xc5,0x6e,0xbd,0x9a,0xf7,0x36,0xa8,0x3b,0xf2,0x99,0xbc,0x71,0xc3,0x03,0x31,0xbc,0xfe,0x3c,0xb1,0xe1,0x02,0x2e, -0xf1,0xfe,0xfd,0xe1,0xe3,0xb6,0x01,0xc4,0x00,0x01,0x00,0x60,0xfd,0x6d,0x04,0x25,0x04,0x19,0x00,0x24,0x00,0x4d,0xb9,0x00,0x0e,0x01,0x85,0x40,0x12,0x09,0x05,0x89,0x14,0x09,0x14,0x20,0x20,0x14,0x09,0x03,0x26,0x1a,0x89,0x00,0x20,0x1f,0x11,0xb8,0x01,0x7e,0x40,0x11,0x07,0x1f,0x07,0x0b,0x0b,0x07,0x1f,0x03,0x02,0x1d,0x9a,0x22, -0x19,0x17,0x9b,0x02,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x10,0x21,0x32,0x16,0x15,0x10,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12, -0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x60,0x02,0x11,0xd1,0xe3,0xfe,0xcd,0xfa,0x08,0xa0,0x08,0x2b,0x35,0x48,0x3d,0x8b,0x81,0xb3,0xb6,0xf8,0xe9,0x8f,0x86,0x7e,0x9f,0xfe,0xc4,0xfe,0xbb,0x01,0x29,0x02,0xf0,0xea,0xdb,0xfe,0x62,0xdd,0x30,0x12,0x18,0x27,0x2f,0x30,0x8e,0x8b,0x9b,0xa2,0xfe,0xd6,0xfe,0xbc,0xfe,0x74,0xfe,0x65, -0x52,0xa0,0x3d,0x01,0xe3,0x00,0x00,0x01,0x00,0x60,0xff,0xe7,0x04,0x7b,0x05,0xfa,0x00,0x22,0x00,0x4b,0xb1,0x03,0x0e,0xb8,0x01,0x84,0x40,0x19,0x0f,0x0a,0x89,0x05,0x0f,0x1b,0x05,0x05,0x1b,0x0f,0x03,0x24,0x15,0x89,0x20,0x1b,0x1a,0x03,0x0f,0x1a,0x0f,0x1a,0x0f,0x00,0x18,0xb8,0x01,0x7f,0xb6,0x1d,0x19,0x12,0x9b,0x07,0x00,0x06, -0x00,0x3f,0xc6,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x32,0x16,0x17,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x06,0x07,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x11, -0x34,0x12,0x02,0x29,0x68,0xa6,0x29,0x75,0x3f,0xb0,0x35,0x2f,0x54,0x75,0x8d,0x6e,0x5d,0x8d,0x98,0xad,0xa9,0x82,0x76,0x6c,0x8e,0xf2,0xfe,0xf8,0xf2,0x04,0x19,0x5f,0x56,0xa4,0xfc,0x8b,0x6b,0x6a,0x8e,0x65,0xa9,0x9a,0x97,0x5b,0x6f,0xce,0xb5,0xc7,0xd0,0x4e,0xa2,0x38,0x01,0x1a,0x01,0x07,0xfc,0x01,0x15,0x00,0x00,0x03,0x00,0x82, -0xff,0xe8,0x05,0x70,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x33,0x00,0x5c,0xbc,0x00,0x1b,0x01,0x85,0x00,0x27,0x00,0x00,0x01,0x85,0xb2,0x1a,0x05,0x14,0xb8,0x01,0x85,0x40,0x0f,0x13,0x2e,0x8a,0x21,0x27,0x1a,0x13,0x21,0x21,0x13,0x1a,0x27,0x04,0x35,0x0c,0xb8,0x01,0x85,0x40,0x12,0x0b,0x16,0x10,0x99,0x05,0x1a,0x13,0x0b,0x02,0x09, -0x2b,0x9b,0x24,0x06,0x31,0x99,0x1e,0x19,0x00,0x3f,0xed,0x3f,0xed,0xde,0x32,0xcd,0x32,0x32,0x39,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x21,0x22,0x26,0x27,0x0e,0x02,0x23,0x20,0x03,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x12,0x33, -0x32,0x36,0x36,0x35,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x34,0x26,0x26,0x23,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x00,0x05,0x70,0x01,0xfe,0x9f,0x59,0x9d,0x1f,0x0f,0x53,0x76,0x3c,0xfe,0x9e,0x01,0xa1,0x1f,0x5a,0x49,0x63,0x62,0xa1,0x02,0xc0,0x47,0x5a,0x21,0x99,0xfe,0x94,0xfe,0xfd,0xfe,0xfd,0xfe, -0x94,0x01,0x6d,0x01,0x02,0x01,0x01,0x01,0x6e,0xa1,0x7e,0xd5,0x7b,0xbc,0xfe,0xef,0x01,0x0c,0xc1,0xc5,0x01,0x09,0x06,0xd0,0xfe,0x51,0x57,0x4e,0x2c,0x4e,0x2b,0x01,0xaf,0x62,0x7a,0x42,0x86,0x98,0xfe,0xe2,0x3e,0x75,0x6b,0xfb,0x87,0xfe,0xfd,0xfe,0x94,0x01,0x6e,0x01,0x01,0x01,0x01,0x01,0x6e,0xfe,0x94,0xfe,0xfd,0x80,0xdb,0x83, -0xfe,0xe3,0xc1,0xbe,0xfe,0xe0,0x01,0x23,0x00,0x01,0x00,0xf0,0x00,0x00,0x01,0x91,0x06,0xd0,0x00,0x03,0x00,0x12,0xb9,0x00,0x00,0x01,0x85,0xb3,0x01,0x02,0x01,0x18,0x00,0x3f,0xcd,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x91,0xa1,0xa1,0x06,0xd0,0x00,0x04,0x00,0x64,0xff,0xe8,0x06,0x29,0x06,0xe8,0x00,0x20,0x00,0x2c, -0x00,0x38,0x00,0x45,0x00,0x81,0xb9,0x00,0x14,0x01,0x84,0xb4,0x39,0x21,0x89,0x27,0x18,0xbb,0x01,0x85,0x00,0x09,0x00,0x3f,0x01,0x84,0x40,0x37,0x0e,0x00,0x39,0x27,0x09,0x0e,0x0e,0x09,0x27,0x39,0x00,0x05,0x47,0x2d,0x89,0x33,0x3c,0x9b,0x11,0x43,0x00,0x20,0x06,0x9b,0x1a,0x24,0x30,0x2a,0x36,0x17,0x0a,0x18,0x20,0x1a,0x0a,0x36, -0x43,0x20,0x1a,0x30,0x36,0x36,0x30,0x1a,0x20,0x04,0x09,0x43,0x06,0x09,0x18,0x1e,0x99,0x02,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x10,0xed,0x11,0x33,0x10,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10, -0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x11,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x07,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16, -0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x06,0x29,0x73,0x9d,0x78,0x9b,0x86,0x4c,0x9d,0x5e,0xa2,0x72,0x50,0x49,0xcb,0x90,0x90,0xca,0x01,0x8f,0x7b,0x79,0x91,0x6f,0x9e,0x85,0x4d,0x6b,0x4b,0xfd,0x93,0x3d,0x2d,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0xfd,0xd0,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x01,0x77, -0x76,0x54,0x50,0x7a,0x3a,0x3d,0x53,0x54,0x76,0x69,0x81,0x6d,0x5a,0xaf,0x04,0x3a,0x1d,0x5d,0x62,0x77,0x90,0xcb,0xcc,0x8f,0x78,0xbb,0x20,0xfc,0xa4,0x61,0x6b,0x5b,0x5b,0x01,0xe4,0x2d,0x3d,0x3e,0x2c,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0x3d,0x2d,0x2e,0x3d,0x3e,0x02,0xa8,0x56,0x74,0x71,0x59,0x53,0x3d,0x3a,0x72,0x00,0x02,0x00,0x64, -0x00,0x00,0x04,0xfa,0x06,0xe8,0x00,0x29,0x00,0x35,0x00,0x6f,0xb1,0x16,0x22,0xbb,0x01,0x84,0x00,0x2a,0x00,0x04,0x01,0x85,0xb2,0x05,0x25,0x00,0xb8,0x01,0x84,0x40,0x0f,0x0b,0x12,0x27,0x0b,0x2a,0x05,0x0e,0x0b,0x0b,0x0e,0x05,0x2a,0x04,0x37,0x30,0xb8,0x01,0x84,0x40,0x1b,0x1c,0x33,0x99,0x19,0x2d,0x9b,0x1f,0x22,0x07,0x03,0x9b, -0x06,0x27,0x0e,0x9b,0x0f,0x06,0x0f,0x06,0x0f,0x05,0x16,0x9b,0x22,0x06,0x05,0x18,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x33,0x10,0xdd,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x33,0x10,0xed,0x32,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x01,0x10,0x21,0x23,0x11, -0x23,0x11,0x21,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x20,0x36,0x35,0x34,0x26,0x23,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x01,0x34,0x26,0x27,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xfa,0xfe,0x8f,0x5f,0xa1,0x01,0x00,0x79,0x67,0x43,0xa7,0xa1,0x01,0x02, -0x89,0x71,0x6f,0x76,0x19,0xbb,0x80,0x8c,0xcf,0xcb,0x90,0x7c,0xbf,0x19,0x76,0x01,0x71,0xc5,0xc5,0xfd,0x8f,0x76,0x54,0x51,0x79,0x6f,0x5b,0x56,0x74,0x03,0x16,0xfe,0xf9,0xfd,0xf1,0x02,0xa0,0x40,0x4a,0x34,0x3b,0x12,0x91,0x42,0x4d,0x4c,0x2f,0x75,0xa0,0xc7,0x95,0x90,0xcb,0x9c,0x75,0xf8,0xb6,0x32,0x07,0x35,0x01,0xd2,0x55,0x74, -0x01,0x71,0x59,0x51,0x79,0x76,0x00,0x01,0x00,0xb4,0x00,0x00,0x05,0x0a,0x06,0xd0,0x00,0x12,0x00,0x5c,0xb1,0x11,0x04,0xb8,0x01,0x85,0xb5,0x05,0x0e,0x05,0x0b,0x0a,0x00,0xb8,0x01,0x85,0x40,0x0a,0x01,0x05,0x0a,0x01,0x01,0x0a,0x05,0x03,0x14,0x0d,0xb8,0x01,0x85,0x40,0x16,0x07,0x03,0x07,0x9b,0x11,0x0d,0x0a,0x0b,0x0d,0x0f,0x0b, -0x0b,0x0f,0x0d,0x03,0x0c,0x01,0x05,0x18,0x08,0x0c,0x07,0x00,0x3f,0xcd,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x01,0x07,0x01,0x11,0x21,0x11, -0x33,0x11,0x21,0x05,0x0a,0xa1,0xfe,0xc7,0xa1,0xfe,0x25,0xa3,0x01,0xa5,0x72,0xfe,0xcb,0x01,0x3a,0xa1,0x01,0xda,0x02,0x48,0xfd,0xb8,0x02,0x48,0x04,0x88,0xfe,0x58,0x72,0x01,0x39,0xfc,0xea,0x01,0x22,0xfe,0xde,0x00,0x00,0x01,0x00,0xb4,0xff,0xe9,0x04,0xc6,0x06,0xd0,0x00,0x1b,0x00,0x4b,0xb9,0x00,0x00,0x01,0x84,0x40,0x0d,0x12, -0x11,0x07,0x04,0x11,0x11,0x04,0x07,0x03,0x1d,0x14,0x10,0x0d,0xb8,0x01,0x85,0x40,0x13,0x0e,0x0a,0x9b,0x11,0x12,0x14,0x18,0x12,0x18,0x12,0x0e,0x0f,0x13,0x07,0x0e,0x18,0x04,0x03,0x19,0x00,0x3f,0x33,0x3f,0x3f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x32,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33, -0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x00,0x07,0x23,0x11,0x33,0x01,0x07,0x01,0x11,0x36,0x37,0x36,0x33,0x32,0x16,0x16,0x04,0xc6,0xd5,0x96,0x37,0x7c,0x95,0x86,0x70,0xd8,0xfe,0xef,0x01,0xa1,0xa3,0x01,0xa6,0x72,0xfe,0xca,0x51,0x87,0x7f,0x93,0x71,0xb5,0x61,0x01,0xa6,0x9a,0xf6,0x2d,0x7b, -0x21,0xb4,0x6d,0x62,0x74,0xfe,0x82,0xfe,0x06,0xd0,0xfe,0x58,0x72,0x01,0x39,0xfb,0xf9,0x89,0x47,0x47,0x51,0x9e,0x00,0x02,0x00,0x64,0xff,0xe8,0x03,0xfa,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x5e,0xb9,0x00,0x00,0x01,0x84,0x40,0x13,0x1b,0x21,0x1b,0x21,0x1b,0x05,0x28,0x07,0x0a,0x14,0x11,0x04,0x08,0x12,0x12,0x08,0x0e,0x08,0x16, -0xb8,0x01,0x85,0x40,0x18,0x05,0x1e,0x9b,0x18,0x14,0x08,0x9b,0x09,0x11,0x09,0x16,0x18,0x09,0x18,0x09,0x03,0x0c,0x99,0x0f,0x06,0x24,0x99,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x01,0x2f,0xed,0xc6,0xc4,0x11,0x39,0x2f,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x2f,0x2f, -0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x20,0x11,0x10,0x13,0x21,0x35,0x21,0x36,0x37,0x21,0x15,0x21,0x06,0x07,0x21,0x15,0x21,0x02,0x11,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xfa,0xcc,0x8f,0xfe,0x6e,0x7d,0xfe,0xda,0x01,0x61,0x47,0x7a,0x01,0x74,0xfe,0xf2,0x47,0x2f,0x01,0x2f, -0xfe,0x94,0x8b,0x69,0x88,0x8f,0xcc,0x91,0x72,0x58,0x59,0x72,0x70,0x5b,0x5a,0x70,0x01,0x44,0x90,0xcc,0x02,0x57,0x01,0x2d,0x01,0x53,0x92,0xa2,0xdd,0x92,0x83,0x6a,0x92,0xfe,0xa1,0xfe,0xde,0x60,0xcc,0x8e,0x50,0x79,0x78,0x51,0x50,0x7b,0x7a,0x00,0x00,0x02,0x00,0x00,0xff,0xe8,0x05,0x9d,0x06,0xe8,0x00,0x1f,0x00,0x2b,0x00,0x5a, -0xb5,0x0a,0x8a,0x16,0x08,0x16,0x0d,0xb8,0x01,0x84,0xb7,0x26,0x16,0x26,0x16,0x26,0x2d,0x00,0x20,0xb8,0x01,0x84,0x40,0x1b,0x13,0x0a,0x16,0x16,0x1f,0x29,0x29,0x10,0x1f,0x19,0x9b,0x06,0x08,0x06,0x08,0x06,0x1f,0x1d,0x9b,0x02,0x17,0x1f,0x07,0x23,0x99,0x10,0x19,0x00,0x3f,0xed,0x3f,0x33,0xdd,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10, -0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x01,0x2f,0xed,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x11,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x01,0x14,0x16,0x33,0x32,0x36, -0x35,0x34,0x26,0x23,0x22,0x06,0x73,0x9d,0x76,0x9d,0x83,0x4e,0x9e,0x5d,0xa3,0x75,0x96,0xca,0x92,0x8f,0xcc,0x98,0x72,0x77,0x93,0x70,0x9d,0x85,0x4c,0x69,0x4e,0x03,0x26,0x77,0x53,0x54,0x77,0x78,0x53,0x53,0x77,0x06,0x67,0x81,0x6d,0x5b,0xb0,0xfb,0xc5,0x1c,0xc0,0x76,0x90,0xcb,0xca,0x91,0x77,0xc0,0x1b,0x03,0x5d,0x62,0x6c,0x5b, -0x5b,0xfb,0x47,0x53,0x77,0x76,0x54,0x54,0x76,0x77,0x00,0x04,0x00,0x82,0xff,0xe8,0x04,0x4e,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x39,0x00,0x6f,0x40,0x0a,0x34,0x8a,0x1e,0x0c,0x89,0x12,0x00,0x89,0x06,0x18,0xb8,0x01,0x85,0x40,0x11,0x2e,0x20,0x12,0x2c,0x06,0x2e,0x1e,0x12,0x06,0x2e,0x2e,0x06,0x12,0x1e,0x04,0x22,0x2a, -0xbb,0x01,0x85,0x00,0x29,0x00,0x23,0x01,0x85,0x40,0x11,0x22,0x31,0x9b,0x2c,0x20,0x26,0x26,0x1b,0x22,0x09,0x15,0x03,0x0f,0x29,0x22,0x06,0x37,0xb8,0x01,0x80,0xb1,0x1b,0x19,0x00,0x3f,0xed,0x3f,0x33,0xde,0x32,0xcd,0x32,0x11,0x12,0x39,0x2f,0x39,0x39,0xed,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12, -0x39,0x11,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x37,0x26,0x03,0x33,0x16,0x16,0x33,0x32,0x36,0x37,0x33,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22, -0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x13,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0xfd,0x7f,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0x02,0xbc,0xfe,0xe6,0xcc,0xcc,0xfe,0xe6,0xda,0xd9,0x01,0xa2,0x01,0xbd,0x86,0x87,0xbd,0x01,0xa1,0x02,0xd8,0xda,0xa1,0xbf,0x86,0x86,0xbe,0xbf,0x85,0x86,0xbf,0x06,0x18,0x2b,0x40,0x40,0x2b, -0x2d,0x3e,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0xfb,0x8c,0xc7,0xfe,0xde,0x01,0x20,0xc9,0x01,0x02,0x95,0x93,0x01,0x00,0x7e,0xc5,0xc7,0x7c,0xfe,0xff,0x92,0x95,0xfe,0xfe,0x7f,0xc7,0xc6,0x80,0x83,0xc5,0xc7,0x00,0x03,0x00,0x64,0xff,0xe9,0x05,0xdd,0x06,0xe8,0x00,0x28,0x00,0x35,0x00,0x41,0x00,0x82,0xb9,0x00,0x30,0x01, -0x84,0x40,0x11,0x23,0x0d,0x0d,0x3b,0x06,0x89,0x36,0x04,0x08,0x8b,0x12,0x1d,0x12,0x20,0x03,0x23,0x00,0xb8,0x01,0x84,0x40,0x0c,0x29,0x23,0x36,0x12,0x29,0x29,0x12,0x36,0x23,0x04,0x43,0x3b,0xb8,0x01,0x85,0xb5,0x17,0x2d,0x9b,0x26,0x33,0x3f,0xb8,0x01,0x81,0x40,0x14,0x14,0x38,0x9b,0x1b,0x20,0x03,0x1d,0x36,0x06,0x12,0x06,0x1b, -0x14,0x1b,0x14,0x1b,0x0c,0x33,0x06,0x0d,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x31,0x30,0x01,0x14, -0x06,0x07,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x27,0x06,0x21,0x22,0x24,0x27,0x34,0x37,0x36,0x33,0x20,0x17,0x36,0x35,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x32,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x06,0x07,0x14,0x16,0x33,0x32,0x36,0x01,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x20,0x37, -0x05,0xdd,0x92,0x81,0x2f,0x2f,0x79,0xf2,0x98,0xb0,0xc2,0x07,0xb5,0xfe,0xc7,0xcb,0xfe,0xec,0x01,0x8b,0x8a,0xcb,0x01,0x38,0xb6,0x07,0x01,0x7c,0x96,0xca,0x91,0x90,0xcc,0x92,0x3b,0x3a,0x55,0x55,0x74,0x01,0x71,0x59,0x56,0x74,0xfe,0x9f,0x8c,0xfe,0xe6,0x87,0xb8,0x57,0x93,0x55,0x01,0x1b,0x8b,0x05,0x8d,0x76,0xc2,0x1d,0x18,0x86, -0x74,0x72,0x88,0x9d,0xeb,0x9e,0x1d,0xa1,0x2b,0xd7,0xa0,0x28,0x29,0xc4,0xd8,0x95,0x97,0x6a,0x6c,0xc3,0x28,0x28,0x18,0x1d,0xbf,0x79,0x90,0xca,0x01,0xcc,0x8f,0x57,0x38,0x3b,0x76,0x54,0x51,0x79,0x76,0xfd,0xef,0xc2,0x74,0x50,0x32,0x5e,0x33,0xc1,0x00,0x02,0x00,0x67,0xff,0xe7,0x04,0x72,0x05,0xb2,0x00,0x0f,0x00,0x1d,0x00,0x2b, -0xb9,0x00,0x0c,0x01,0x86,0xb3,0x1b,0x1b,0x1f,0x14,0xbb,0x01,0x86,0x00,0x04,0x00,0x10,0x01,0x80,0xb2,0x08,0x07,0x17,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x35,0x10,0x12,0x24,0x33,0x32,0x16,0x16,0x15,0x10,0x02,0x04,0x13,0x22,0x06,0x02,0x15, -0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x01,0xe2,0x78,0xab,0x58,0xae,0x01,0x28,0xc1,0x69,0xaa,0x61,0xab,0xfe,0xde,0x4a,0x87,0xd4,0x86,0x75,0x70,0x81,0xd2,0x85,0x71,0x19,0x75,0xd1,0x86,0x01,0x19,0x01,0xe9,0xfd,0x6a,0xc3,0x7e,0xfe,0xcf,0xfe,0x0a,0xf9,0x05,0x2d,0xd0,0xfe,0x65,0xd5,0xa5,0xaa,0xcf,0x01,0x9b,0xd0,0xa4, -0xb1,0x00,0x00,0x01,0x00,0x84,0xff,0xe7,0x04,0x18,0x05,0xb5,0x00,0x23,0x00,0x40,0xb9,0x00,0x18,0x01,0x86,0xb2,0x0d,0x13,0x1f,0xb8,0x01,0x86,0x40,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x25,0x00,0x00,0x13,0x00,0x13,0x10,0x03,0xb8,0x01,0x80,0xb2,0x21,0x19,0x16,0xb8,0x01,0x80,0xb1,0x10,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39, -0x2f,0x2f,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc6,0x10,0xed,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x1e,0x02,0x15,0x10,0x21,0x22,0x27,0x84,0x3b,0xbe,0x50,0x9c,0x97,0x33,0x4d,0x46,0x3a,0x1f,0xc2,0xbd,0x5d, -0x5b,0x2e,0x35,0x48,0xe4,0x34,0x54,0x49,0x30,0x1d,0xfe,0x26,0xcd,0x7b,0xb2,0x13,0x1a,0x83,0x9b,0x3a,0x7c,0x6b,0x61,0x70,0x78,0x3f,0xb2,0xb7,0x10,0x9e,0x08,0x08,0xb2,0x40,0x88,0x7b,0x6c,0x62,0x69,0x3c,0xfe,0x38,0x1d,0x00,0x00,0x01,0x00,0x67,0xff,0xe7,0x04,0x8e,0x05,0xb2,0x00,0x27,0x00,0x61,0xb9,0x00,0x19,0x01,0x86,0xb4, -0x0b,0x12,0x89,0x13,0x00,0xb8,0x01,0x85,0x40,0x0e,0x27,0x09,0x1d,0x0b,0x1d,0x13,0x27,0x27,0x13,0x1d,0x0b,0x04,0x29,0x21,0xb8,0x01,0x86,0xb2,0x06,0x09,0x1c,0xb8,0x01,0x80,0x40,0x09,0x1d,0x27,0x13,0x13,0x27,0x1d,0x03,0x03,0x16,0xb8,0x01,0x80,0xb2,0x0f,0x07,0x24,0xb8,0x01,0x80,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12, -0x17,0x39,0x2f,0x2f,0x2f,0xed,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33, -0x32,0x12,0x13,0x04,0x8e,0x5d,0xfe,0xc9,0xde,0xcc,0xe9,0x92,0x7a,0xaa,0x64,0xc0,0x84,0xa0,0xe2,0x1d,0xac,0x18,0x7e,0x65,0x73,0x86,0x97,0x8a,0x28,0x9b,0xc0,0x97,0x7c,0xa0,0xec,0x3f,0x02,0xcf,0xfe,0x7f,0xfe,0x99,0xe4,0xca,0x85,0xd5,0x2a,0x6c,0xc4,0x6b,0xa4,0x5a,0xae,0x91,0x4b,0x56,0x6d,0x57,0x70,0x74,0x9e,0xa7,0x8f,0x7e, -0x95,0x01,0x4f,0x01,0x26,0x00,0x00,0x01,0x00,0x3f,0xff,0xe7,0x04,0x9f,0x05,0x9d,0x00,0x2c,0x00,0x5e,0xb6,0x0e,0x8a,0x1e,0x09,0x8a,0x23,0x15,0xb8,0x01,0x85,0x40,0x0d,0x14,0x1e,0x23,0x14,0x14,0x23,0x1e,0x03,0x2a,0x2e,0x03,0x01,0x29,0xb8,0x01,0x85,0x40,0x0f,0x2c,0x2a,0x2a,0x18,0x25,0x99,0x06,0x04,0x06,0x14,0x06,0x14,0x06, -0x00,0x10,0xb8,0x01,0x80,0xb6,0x1b,0x19,0x03,0x2c,0x99,0x00,0x06,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x3f,0x01,0x2f,0xc6,0xfd,0xc4,0x33,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x21,0x07,0x21,0x03,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06, -0x15,0x14,0x33,0x32,0x36,0x37,0x37,0x33,0x07,0x0e,0x03,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23,0x22,0x06,0x07,0x03,0x23,0x01,0x23,0xb1,0x03,0x9f,0x20,0xfd,0xc3,0x4d,0x6c,0x69,0x77,0x90,0x04,0x3d,0x21,0x52,0x2b,0x33,0x17,0x16,0xa2,0x17,0x0f,0x21,0x3e,0x68,0x57,0x70,0x6f,0x26,0x36,0x06,0x84,0x51,0x7f,0x19, -0x91,0xa1,0x01,0x12,0xc0,0x05,0x9d,0x91,0xfe,0x96,0x36,0x84,0x6e,0x10,0x26,0xfe,0xf3,0x79,0x44,0x61,0x44,0x68,0x62,0x6d,0x44,0x75,0x56,0x30,0x69,0x72,0x3a,0xab,0xf1,0x1b,0x1b,0x79,0x51,0x48,0xfd,0x52,0x05,0x0c,0x00,0x02,0x00,0x6b,0xff,0xe7,0x04,0x21,0x05,0xb0,0x00,0x14,0x00,0x21,0x00,0x4f,0xb2,0x10,0x0f,0x03,0xb8,0x01, -0x86,0x40,0x21,0x1e,0x14,0x00,0x01,0x12,0x15,0x0e,0x04,0x1e,0x0f,0x1e,0x00,0x00,0x1e,0x0f,0x03,0x23,0x19,0x89,0x09,0x00,0x0f,0x0f,0x15,0x01,0x0e,0x12,0x04,0x06,0x14,0x10,0x07,0x1b,0xb8,0x01,0x80,0xb1,0x06,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17, -0x39,0x11,0x33,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x01,0x00,0x15,0x14,0x04,0x21,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x37,0x27,0x37,0x16,0x17,0x36,0x37,0x01,0x0e,0x02,0x15,0x14,0x21,0x32,0x36,0x35,0x34,0x02,0x27,0x04,0x20,0xff,0x00,0x01,0x01,0xfe,0xf8,0xfe,0xf2,0xcb,0xd5,0x51,0x92,0xa5,0x5f,0xaa,0x98,0x3e,0x53,0x78,0x5c, -0xfe,0xfc,0x5d,0xc5,0x69,0x01,0x0b,0xa0,0xb9,0x7d,0x56,0x05,0x4f,0xfe,0xff,0xfe,0x52,0xeb,0xec,0xe2,0xb4,0xb0,0x66,0xc6,0xcb,0xad,0x64,0xfd,0x60,0x53,0x80,0x7a,0x58,0xfe,0x16,0x4b,0xf3,0xd3,0x47,0xe8,0x9a,0x8a,0x54,0x01,0x3f,0x88,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x61,0x05,0xb5,0x00,0x26,0x00,0x32,0x00,0x63,0x41,0x0b, -0x00,0x30,0x01,0x86,0x00,0x21,0x00,0x04,0x01,0x84,0x00,0x1f,0x00,0x00,0x01,0x86,0x00,0x2a,0x00,0x12,0x01,0x85,0x40,0x0c,0x11,0x21,0x1f,0x2a,0x11,0x11,0x2a,0x1f,0x21,0x04,0x34,0x0b,0xb8,0x01,0x86,0x40,0x0a,0x18,0x27,0x1f,0x04,0x11,0x04,0x11,0x04,0x15,0x2d,0xb8,0x01,0x80,0xb2,0x24,0x07,0x0e,0xb8,0x01,0x80,0xb1,0x15,0x19, -0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x07,0x06,0x06,0x07,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x37,0x17,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x36,0x37, -0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x03,0x8f,0x51,0xa4,0x63,0x0b,0x37,0x52,0x49,0x38,0x1e,0x7b,0x7b,0x8f,0xf7,0x3f,0xa2,0x58,0xfe,0xc1,0xd5,0xc6,0xd3,0x1f,0x39,0x4c,0x51,0x45,0x0e,0x3d,0xa0,0x77,0x7f,0x92,0xfe,0x9d,0x5c,0x5f,0x3e,0x2f,0x2b,0x40,0x18,0x04,0xab, -0x4b,0x78,0x54,0x0d,0x2d,0x5e,0x5c,0x50,0x56,0x59,0x30,0x72,0x7a,0x01,0x10,0xd8,0x27,0xfe,0xdc,0xfe,0xc5,0xcb,0xbc,0x3e,0x65,0x5c,0x54,0x58,0x72,0x39,0x74,0x6b,0x77,0x9b,0x93,0xfe,0x0f,0x47,0x31,0x2b,0x41,0x43,0x30,0x35,0x48,0x00,0x00,0x01,0x00,0xd6,0xff,0xe7,0x04,0x48,0x05,0x9a,0x00,0x1e,0x00,0x3d,0xb9,0x00,0x1a,0x01, -0x85,0x40,0x0c,0x19,0x05,0x19,0x01,0x19,0x01,0x19,0x20,0x12,0x8a,0x0b,0x15,0xb8,0x01,0x80,0x40,0x0c,0x05,0x0e,0x08,0x08,0x00,0x19,0x0e,0x06,0x01,0x9a,0x00,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x27,0x36,0x36,0x37,0x37,0x06, -0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x13,0x33,0x03,0x0e,0x02,0x01,0x7d,0x10,0x98,0xae,0x2b,0x34,0x29,0x97,0x57,0x81,0xa4,0x08,0x5d,0xa1,0x5a,0x06,0x5d,0x45,0x55,0x9d,0x2d,0x6a,0xa1,0xbd,0x2e,0x81,0xca,0x19,0x87,0x0c,0xa9,0xc3,0xf1,0x1a,0x22,0x87,0x67,0x2b,0x20,0x01, -0xc6,0xfe,0x4d,0x1d,0x19,0x35,0x43,0x32,0x2a,0x02,0x05,0xfc,0x7e,0xd5,0xdf,0x77,0x00,0x01,0x00,0x59,0xff,0xe7,0x04,0x5f,0x05,0xb5,0x00,0x19,0x00,0x41,0xb2,0x0c,0x0d,0x12,0xb8,0x01,0x86,0x40,0x11,0x07,0x0d,0x07,0x0d,0x07,0x1b,0x00,0x89,0x19,0x0d,0x0c,0x19,0x0c,0x19,0x0c,0x0f,0x02,0xb8,0x01,0x80,0xb2,0x16,0x19,0x0a,0xb8, -0x01,0x80,0xb1,0x0f,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x16,0x33,0x32,0x36,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x21,0x32,0x16,0x15,0x10,0x02,0x04,0x23,0x22,0x26,0x27,0x01,0x0d,0x2e,0x9a,0x69,0xaf,0x7f, -0x4c,0x75,0x71,0x9e,0x75,0x89,0xa9,0x01,0x04,0xb1,0xcb,0xae,0xfe,0xd6,0xc0,0x8c,0xc8,0x1a,0x01,0x34,0xaf,0x7f,0xe7,0x01,0x44,0x99,0xa1,0xae,0x96,0x5a,0xda,0xf9,0xd4,0xfe,0xe8,0xfe,0x14,0xfd,0xb4,0x98,0x00,0x01,0x00,0x7b,0xff,0xe7,0x04,0x7f,0x05,0xb2,0x00,0x1a,0x00,0x3f,0x40,0x0b,0x0d,0x0c,0x1a,0x89,0x00,0x0c,0x00,0x0c, -0x00,0x1c,0x07,0xb8,0x01,0x86,0xb7,0x13,0x0d,0x0c,0x00,0x0c,0x00,0x10,0x02,0xb8,0x01,0x80,0xb2,0x17,0x07,0x0a,0xb8,0x01,0x80,0xb1,0x10,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x16,0x33, -0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x12,0x24,0x33,0x32,0x16,0x17,0x03,0xcc,0x30,0x98,0x69,0xad,0x80,0x4c,0x75,0x70,0x9e,0x75,0x88,0x57,0xd3,0x82,0xaf,0xcc,0xae,0x01,0x28,0xc1,0x8d,0xc7,0x19,0x04,0x65,0xaf,0x7c,0xe7,0xfe,0xbd,0x9a,0xa5,0xaa,0x96,0x5a,0x70,0x6a,0xf9,0xd3,0x01,0x19,0x01,0xe9,0xfd,0xb6,0x96, -0x00,0x01,0x00,0x8b,0xff,0xe7,0x04,0x9b,0x05,0x9d,0x00,0x15,0x00,0x29,0xb9,0x00,0x08,0x01,0x85,0xb4,0x07,0x07,0x17,0x13,0x00,0xb8,0x01,0x86,0xb4,0x0f,0x07,0x12,0x06,0x03,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x13,0x33, -0x03,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x01,0x32,0x68,0x6d,0x75,0x88,0x22,0xd3,0xa2,0xd8,0x32,0xe2,0xbf,0xa7,0xbe,0x31,0xb1,0xa2,0xaf,0x2e,0x01,0x45,0x67,0x59,0x97,0x99,0x03,0xe7,0xfc,0x0a,0xef,0xd0,0xa3,0x8f,0x6c,0xd2,0x03,0x46,0xfc,0xca,0xcf,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a, -0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0xff,0xd0,0xfe,0x9d,0x02,0x51,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xad,0xf9,0xeb,0x00,0x0b,0xb6,0x01,0x00,0x16,0x0c,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf9,0x00,0x00,0x02,0x29,0x07,0x18,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x2a, -0xfe,0xb9,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x86,0x00,0x00,0x01,0xf0,0x07,0x5e,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0xa9,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x78,0x40,0x0a,0x12,0x0c,0x0b,0x05, -0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xfe,0x07,0x66,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xf2,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe8,0x40,0x09,0x0d, -0x0d,0x0b,0x05,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfd,0x00,0x00,0x02,0x31,0x07,0x6b,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xa1,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x10,0x05,0x26,0x01,0x00,0x10,0x0c,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0xff,0xbe, -0x00,0x00,0x03,0x58,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x68,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x74,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x40,0x40,0x09,0x0d,0x19,0x0b,0x05,0x25,0x02,0x01,0x1b,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xa1,0x00,0x27,0x0d,0xf2, -0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x31,0x40,0x09,0x0d,0x19,0x0b,0x05,0x25,0x02,0x01,0x1c,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xc1,0x00,0x00,0x03,0x67,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x77,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7d, -0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x3a,0x40,0x09,0x0f,0x19,0x0b,0x05,0x25,0x02,0x01,0x1b,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x03,0x6e,0x05,0xb3,0x00,0x27,0x0d,0xf2,0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8b,0xff,0x30,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x41, -0x40,0x09,0x12,0x0c,0x0b,0x05,0x25,0x02,0x01,0x15,0x04,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0x88,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x88,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x25,0x40,0x09,0x0f,0x19,0x0b,0x05,0x25,0x02,0x01,0x1c, -0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x03,0x6e,0x05,0xb3,0x00,0x27,0x0d,0xf2,0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8b,0xff,0x30,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x41,0x40,0x09,0x12,0x0c,0x0b,0x05,0x25,0x02,0x01,0x15,0x04,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, -0xff,0xff,0xff,0xbf,0x00,0x00,0x02,0x48,0x05,0xa1,0x00,0x26,0x0d,0xf2,0x58,0x00,0x01,0x07,0x04,0x61,0xfd,0xdd,0xff,0x7e,0x00,0x14,0xb9,0x00,0x01,0xfe,0xb9,0xb7,0x10,0x0c,0x0b,0x05,0x25,0x01,0x13,0x04,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x02,0x4a,0x05,0xa1,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07, -0x04,0x27,0xfd,0xda,0xff,0x7e,0x00,0x14,0xb9,0x00,0x01,0xfe,0xb5,0xb7,0x0d,0x18,0x0b,0x05,0x25,0x01,0x15,0x04,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x22,0x07,0x0a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x66,0x01,0x10,0x01,0x4c,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01, -0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xf2, -0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07, -0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0xfe,0x70,0x01,0xf0,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00, -0x01,0x06,0x00,0xdf,0x12,0x00,0x00,0x0b,0xb6,0x01,0x00,0x1a,0x0c,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x07,0x83,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x02,0x50,0xff,0xf0,0x01,0x5c,0x00,0x13,0x40,0x0b, -0x01,0x00,0x16,0x15,0x0b,0x05,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0xff,0xe8,0x04,0x4c,0x05,0x9a,0x00,0x26,0x0d,0xf2,0x00,0x00,0x00,0x07,0x00,0x2d,0x02,0x21,0x00,0x00,0xff,0xff,0xff,0xd1,0x00,0x00,0x02,0x52,0x07,0x0c,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xae, -0x01,0x5a,0x00,0x13,0x40,0x0b,0x01,0x00,0x16,0x0c,0x0b,0x05,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0xfe,0xc6,0x01,0xf0,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x06,0x02,0x45,0xbc,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0f,0x15,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1c, -0x00,0x00,0x01,0xf0,0x07,0x66,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x43,0xff,0xca,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xc5,0x40,0x09,0x0e,0x0c,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc7,0x00,0x00,0x02,0x4a,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07,0x04,0x60, -0xfd,0xf6,0xff,0x9b,0x00,0x14,0xb9,0x00,0x01,0xfe,0xd0,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01,0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc7,0x00,0x00,0x02,0x4a,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf9,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0xcf,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01, -0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xf3,0x00,0x00,0x02,0x3a,0x07,0xd1,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x02,0xd5,0xff,0x76,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x06,0x1f,0x19,0x0b,0x05,0x25,0x03,0x02,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff, -0xff,0xf8,0x00,0x00,0x02,0x2a,0x07,0x62,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x92,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x0c,0x0b,0x05,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x02,0x0e,0x06,0x79,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x64, -0x01,0x10,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0f,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xaf,0x00,0x00,0x02,0x2c,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x3c,0x00,0x01,0x07,0x04,0x55,0xfd,0xde,0xff,0x9b,0x00,0x14,0xb9,0x00,0x01,0xfe,0xd6,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01, -0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x06,0xe2,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x42,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x15,0x0b,0x05,0x25,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x10,0x06,0x79, -0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xd6,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0f,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x02,0x24,0x07,0x1a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xda,0xff,0xda,0x01,0x5c,0x00,0x13,0x40,0x0b, -0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x55,0x00,0x5b,0x00,0x61,0x00,0x67,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95, -0x00,0x99,0x00,0x9d,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e, -0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x05,0x21,0x35,0x33,0x11,0x07,0x35,0x37,0x11,0x33,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35, -0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d, -0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x02,0xe0,0xfe,0xf0,0x59,0x5b,0xba,0x58,0xfb,0xbb,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56, -0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfc,0x44,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08, -0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x04,0x4b,0x01,0x0b,0x13,0x4c,0x26,0xfe,0x96,0x03,0x8b,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c, -0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x61,0x00,0x67,0x00,0x6d,0x00,0x73,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99, -0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14, -0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x33,0x15,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35, -0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35, -0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x02,0x2f,0xae,0xfe,0xe5,0x7c,0x25,0x1e,0x40,0x37,0x33,0x38,0x47,0x42,0x4a,0x5b,0xfc,0x14,0xeb,0x96,0x04, -0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18, -0x01,0x2a,0xfc,0x44,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x4d,0x02,0x4f,0x4a,0x76,0x24,0x30,0x1b,0x3b,0x2c,0x53,0x25,0x43,0x38,0x4b, -0x51,0x03,0x37,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0, -0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8a,0x00,0x8e,0x00,0x92,0x00,0x96,0x00,0x9a,0x00,0x9e,0x00,0xa2,0x00,0xa6,0x00,0xaa,0x00,0xae,0x00,0xb2,0x00,0xb6,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13, -0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35, -0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01, -0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34, -0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x01,0xd9,0x2b,0x3a,0x24,0x28,0x32,0x2b,0x27,0x24,0x54,0x41,0x2b,0x29,0x2d,0x3d,0x42,0x49,0x55,0x2d,0x35,0x58,0x4e,0x42,0xfc,0x98,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56, -0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfc,0x45,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a, -0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x0a,0x52,0x1f,0x1f,0x1c,0x1d,0x1f,0x48,0x38,0x35,0x1c,0x4d,0x17,0x3b,0x30,0x54,0x15,0x02,0x06,0x37,0x27,0x3d,0x46,0x03,0xdd,0xec, -0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x13,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x0b,0x00,0x41, -0x00,0x5d,0x00,0x63,0x00,0x69,0x00,0x6f,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99,0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0x00,0x01,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x13,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35, -0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x13,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x17,0x16,0x17,0x33,0x36,0x37,0x37,0x33,0x25,0x35,0x33,0x15,0x23,0x15,0x25,0x35, -0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33, -0x03,0x82,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xe5,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x7b,0x60,0x04,0x02,0x08,0x06,0x65, -0x4f,0x67,0x04,0x09,0x03,0x04,0x57,0x8e,0x58,0x0a,0x05,0x02,0x08,0x09,0x58,0x8a,0xfc,0x28,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55, -0x05,0x6b,0x56,0x56,0x02,0xac,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfe,0x63,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d, -0x0c,0x02,0x19,0x01,0x01,0x2a,0x32,0x27,0x12,0xfe,0xdc,0x01,0x21,0x0c,0x30,0x3f,0x30,0xee,0x01,0xae,0xff,0x1f,0x1e,0x23,0x1b,0xfe,0x0a,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03, -0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x03,0x00,0x93,0xff,0x43,0x03,0x75,0x05,0xb8,0x00,0x1e,0x00,0x25,0x00,0x2a,0x00,0x5b,0xb1,0x16,0x1c,0xb8,0x01,0x84,0x40,0x0d,0x29,0x19,0x13,0x00,0x00,0x1f,0x10,0x09,0x03,0x03,0x0d,0x29,0x23,0xb8,0x01,0x84,0x40,0x0b,0x06,0x0d,0x1f,0x19,0x13,0x09, -0x26,0x0a,0x03,0x20,0x18,0xb8,0x01,0x7e,0xb6,0x10,0x7f,0x13,0x01,0x13,0x27,0x09,0xb8,0x01,0x7e,0xb1,0x00,0x03,0x00,0x2f,0x33,0xed,0x32,0x2f,0x71,0x33,0xed,0x32,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x2f,0x33,0x33,0x33,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x31,0x30,0x25,0x15,0x23,0x35,0x22, -0x27,0x35,0x16,0x16,0x33,0x11,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x03,0x11,0x06,0x06,0x15,0x14,0x16,0x13,0x11,0x36,0x35,0x34,0x02,0x2e,0x5e,0xc1,0x79,0x35,0xb6,0x4f,0xc7,0x76,0xb3,0x8a,0x5e,0xb2,0x44,0x5d,0x99,0xbd,0x8a,0xad,0xf8,0x4c,0x59,0x48,0xbb,0xaf, -0x07,0xc4,0xbd,0x4e,0x9e,0x2f,0x3e,0x01,0xd0,0x60,0xa2,0x6e,0x84,0xbf,0x13,0xa3,0x9f,0x06,0x2d,0x9a,0x48,0x06,0xfe,0x21,0x59,0xa8,0x6b,0x80,0xaf,0x02,0xce,0x01,0xa6,0x0f,0x68,0x4b,0x4d,0x64,0xfe,0xff,0xfe,0x66,0x26,0x97,0x7d,0x00,0x00,0x05,0x00,0x48,0xff,0xec,0x05,0xaa,0x05,0x27,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27, -0x00,0x33,0x00,0x6f,0xb5,0x18,0x1a,0x18,0x1a,0x03,0x25,0xbe,0x01,0x83,0x00,0x31,0x00,0x09,0x01,0x83,0x00,0x15,0x00,0x2b,0x01,0x83,0xb7,0x1f,0x15,0x1f,0x15,0x1f,0x03,0x31,0x0f,0xbb,0x01,0x83,0x00,0x03,0x00,0x12,0x01,0x7d,0xb5,0x70,0x00,0x01,0x00,0x00,0x0c,0xb8,0x01,0x7d,0xb6,0x06,0x06,0x7f,0x1b,0x01,0x1b,0x28,0xb8,0x01, -0x7d,0xb2,0x22,0x22,0x2e,0xb8,0x01,0x7d,0xb2,0x1c,0x1c,0x1a,0x00,0x2f,0x33,0x2f,0xed,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x33,0x2f,0x71,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03, -0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x6e,0x86,0xa0,0xa9,0x8f,0x8b,0x99,0xab,0x7e,0x56,0x64,0x62,0x54,0x55,0x60,0x5f,0x03,0x07,0xfc,0xbe,0x81,0x03,0x40,0x23, -0x86,0xa0,0xab,0x8d,0x8a,0x9a,0xac,0x7e,0x57,0x62,0x62,0x54,0x55,0x60,0x5f,0x02,0x88,0xb0,0x94,0xa1,0xba,0xac,0x9c,0x9c,0xbb,0x02,0x3b,0x7f,0x70,0x6d,0x7b,0x7f,0x71,0x6d,0x7a,0x50,0xfa,0xe4,0x05,0x1c,0xfa,0xd9,0xb2,0x92,0xa2,0xbb,0xae,0x9c,0x9b,0xbc,0x02,0x3b,0x7f,0x70,0x6c,0x7a,0x7f,0x70,0x6e,0x78,0x00,0x03,0x00,0x6c, -0xff,0xeb,0x05,0xa8,0x05,0x29,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0x7e,0xb1,0x41,0x33,0xbb,0x01,0x84,0x00,0x2c,0x00,0x60,0x01,0x84,0xb6,0x17,0x12,0x4e,0x24,0x03,0x17,0x21,0xb8,0x01,0x84,0xb3,0x58,0x29,0x05,0x38,0xb8,0x01,0x85,0x40,0x0b,0x49,0x17,0x58,0x49,0x49,0x58,0x17,0x03,0x0f,0x2c,0x53,0xb8,0x01,0x84,0xb3,0x0f,0x24, -0x12,0x4e,0xb8,0x01,0x7e,0x40,0x0c,0x29,0x49,0x38,0x05,0x04,0x0a,0x65,0x2f,0x65,0x2f,0x44,0x5d,0xb8,0x01,0x7e,0xb2,0x1c,0x3d,0x44,0xb8,0x01,0x7e,0xb1,0x00,0x0a,0x00,0x2f,0x33,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0xed,0x39,0x39,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x39, -0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37, -0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x05,0x1d,0x33,0x4f,0x43,0x3f,0x22,0x25,0x5f,0x74,0x89,0x51,0x62,0xa3,0x74,0x40,0x9d,0x91,0x1c,0x36,0x2b,0x1a,0x34,0x5a,0x7c,0x47,0x47,0x75,0x54,0x2f,0x7c,0x7c,0x3e, -0x66,0x56,0x4a,0x24,0x4a,0x4a,0x08,0x07,0x90,0x07,0x03,0x02,0x23,0x3a,0x4d,0x2a,0x1f,0x35,0x35,0x39,0x25,0x1b,0x38,0x1e,0x21,0x47,0xfc,0xe5,0x45,0x74,0x62,0x4f,0x21,0x37,0x5e,0x5f,0x6b,0x47,0x39,0x60,0x46,0x28,0x2d,0x4f,0x69,0x01,0x20,0x22,0x34,0x3f,0x1f,0x59,0x6a,0x01,0x17,0x29,0x36,0x1f,0x72,0x71,0x15,0x1c,0x34,0x4a, -0x2f,0x27,0x48,0x38,0x22,0x31,0x5f,0x8c,0x5a,0x8b,0xc5,0x3e,0x14,0x35,0x44,0x53,0x31,0x47,0x6f,0x4c,0x27,0x27,0x48,0x66,0x3e,0x6d,0x90,0x33,0x18,0x47,0x57,0x64,0x35,0x66,0xf7,0x87,0x22,0x3d,0x1e,0x1e,0x36,0x25,0x52,0xa7,0x9d,0x8d,0x3b,0x2b,0x41,0x2b,0x15,0x0e,0x0b,0x89,0x0d,0x0d,0x81,0x1e,0x32,0x42,0x24,0x56,0x7a,0x59, -0x40,0x1b,0x17,0x37,0x4b,0x64,0x43,0x3e,0x5e,0x3e,0x20,0x03,0x9d,0x2d,0x40,0x29,0x13,0x60,0x52,0x25,0x42,0x38,0x2b,0x10,0x28,0x6a,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x8f,0x05,0x29,0x00,0x1b,0x00,0x4d,0xb1,0x14,0x18,0xb8,0x01,0x84,0x40,0x0c,0x08,0x04,0x16,0x0f,0x00,0x00,0x0f,0x16,0x04,0x04,0x1d,0x1a,0xb8,0x01,0x86,0xb3, -0x06,0x01,0x17,0x06,0xb8,0x01,0x7e,0xb4,0x14,0x07,0x07,0x1a,0x11,0xb8,0x01,0x7e,0xb2,0x0c,0x02,0x1a,0xb9,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34, -0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x14,0x07,0x21,0x03,0x8f,0xfc,0xd1,0xc6,0xb3,0xb3,0xc5,0x9d,0x6a,0x57,0x5b,0x64,0xd0,0x01,0x0c,0xfe,0xf4,0xaf,0x02,0x84,0x7a,0x3f,0xdd,0xa9,0x80,0xe6,0xab,0xd9,0x25,0x8d,0x34,0xfe,0xea,0xd6,0x80,0x8d,0xdb,0x58,0x00,0x02,0x00,0x77,0xff,0xc4,0x02,0xdb, -0x05,0x47,0x00,0x26,0x00,0x30,0x00,0x5c,0xb2,0x1c,0x00,0x25,0xbb,0x01,0x84,0x00,0x2e,0x00,0x20,0x01,0x84,0xb2,0x07,0x16,0x02,0xb8,0x01,0x84,0x40,0x09,0x0d,0x16,0x0d,0x16,0x0d,0x12,0x2e,0x14,0x29,0xb8,0x01,0x84,0x40,0x0c,0x12,0x00,0x2c,0x14,0x27,0x20,0x27,0x2c,0x0d,0x04,0x05,0x1e,0xbc,0x01,0x7e,0x00,0x19,0x00,0x0a,0x01, -0x7e,0x00,0x05,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xfd,0xc5,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xed,0x10,0xfd,0xcd,0xc4,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17, -0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x01,0x06,0x15,0x14,0x16,0x17,0x36,0x35,0x34,0x26,0x02,0x54,0x52,0xb6,0x8c,0x77,0x61,0x75,0x6d,0x4c,0x53,0x40,0x83,0xd3,0x85,0x60,0xa9,0x8b,0x76,0x50,0x5b,0x6f,0x98,0x49,0x94,0xca,0xfe,0x8e,0x5c,0x66,0x80,0x50,0x5f,0x01,0x79,0x43,0x66,0x77,0x95,0x33,0x8f,0x43,0x48, -0x36,0x30,0x42,0x46,0x6e,0xb1,0x94,0x49,0x4b,0x7f,0x73,0x95,0x27,0x8f,0x38,0x83,0x31,0x52,0x47,0x61,0xa8,0x9a,0x01,0x5b,0x2e,0x62,0x41,0x63,0x39,0x3d,0x5f,0x41,0x5b,0x00,0x00,0x01,0x00,0x3e,0x00,0x00,0x03,0xb0,0x05,0x13,0x00,0x1b,0x00,0x72,0xb3,0x10,0x0c,0x05,0x09,0xbb,0x01,0x84,0x00,0x0a,0x00,0x01,0x01,0x82,0x40,0x15, -0x18,0x03,0x07,0x0c,0x12,0x0a,0x0e,0x18,0x07,0x07,0x18,0x0e,0x0a,0x12,0x0c,0x06,0x00,0x13,0x00,0x08,0x0c,0xb8,0x01,0x7e,0xb4,0x0d,0x05,0x0d,0x04,0x10,0xb8,0x01,0x7e,0x40,0x13,0x11,0x01,0x18,0x11,0x0f,0x11,0x1f,0x11,0x02,0x0d,0x11,0x0d,0x11,0x0a,0x13,0x7f,0x00,0x01,0x00,0x00,0x2f,0x71,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x5d, -0x11,0x39,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x11,0x33,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x03,0xb0, -0xfe,0xbe,0x01,0x02,0xfe,0xd1,0x01,0x2f,0xfe,0xd1,0x94,0xfe,0xc8,0x01,0x38,0xfe,0xc8,0x01,0x08,0xfe,0xc1,0xae,0xe2,0x19,0x12,0x03,0x0c,0x21,0xe4,0x05,0x13,0xfd,0xae,0x7e,0xbc,0x7e,0xfe,0xf7,0x01,0x09,0x7e,0xbc,0x7e,0x02,0x52,0xfe,0x2f,0x35,0x30,0x26,0x44,0x01,0xcc,0x00,0x00,0x01,0x00,0x96,0xfe,0x99,0x03,0xb5,0x03,0xa0, -0x00,0x18,0x00,0x29,0xb1,0x0e,0x0a,0xbb,0x01,0x84,0x00,0x0b,0x00,0x17,0x01,0x84,0xb5,0x14,0x03,0x15,0x0d,0x0b,0x11,0xb8,0x01,0x7e,0xb1,0x06,0x01,0x00,0x2f,0x2f,0xed,0x2f,0x2f,0x33,0x01,0x2f,0x33,0xed,0x2f,0xed,0x32,0x31,0x30,0x21,0x23,0x26,0x35,0x23,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32, -0x36,0x35,0x11,0x33,0x11,0x14,0x03,0xb5,0x9a,0x14,0x05,0x4c,0xb1,0x97,0x40,0x04,0x94,0x94,0x7d,0x65,0x6d,0x89,0x96,0x41,0x57,0xad,0x70,0xfe,0x3e,0x05,0x07,0xfd,0xc9,0x73,0x88,0x9b,0x84,0x02,0x13,0xfd,0x50,0xaa,0x00,0x01,0x00,0x2e,0xfe,0x57,0x04,0x48,0x05,0x13,0x00,0x0b,0x00,0x32,0xb1,0x08,0x0a,0xbb,0x01,0x86,0x00,0x01, -0x00,0x09,0x01,0x86,0x40,0x10,0x03,0x03,0x00,0x04,0x01,0x07,0x00,0x08,0x9a,0x7f,0x05,0x01,0x05,0x0a,0x9a,0x01,0x00,0x2f,0xed,0x2f,0x71,0xed,0x01,0x2f,0x33,0x2f,0x33,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x04,0x48,0xfb,0xe6,0x02,0x65,0xfd,0xbd,0x03,0xd4, -0xfd,0x0b,0x02,0x1a,0xfd,0xca,0x03,0x35,0xfe,0x57,0x47,0x03,0x20,0x03,0x04,0x51,0x8b,0xfd,0x39,0xfd,0x21,0x00,0x00,0x01,0x00,0x5c,0xff,0xea,0x03,0x97,0x05,0x29,0x00,0x25,0x00,0x58,0xb4,0x14,0x25,0x25,0x27,0x1d,0xb8,0x01,0x85,0xb2,0x09,0x21,0x05,0xb8,0x01,0x7e,0xb4,0x06,0x1e,0x06,0x1c,0x0c,0xb8,0x01,0x7e,0x40,0x13,0x0d, -0x19,0x0d,0x0f,0x06,0x1f,0x06,0x02,0x3f,0x0d,0x4f,0x0d,0x02,0x06,0x0d,0x06,0x0d,0x23,0x16,0xbc,0x01,0x7e,0x00,0x11,0x00,0x23,0x01,0x7e,0x00,0x02,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0x39,0x31,0x30,0x25,0x06,0x23,0x20, -0x03,0x23,0x35,0x33,0x26,0x35,0x34,0x37,0x23,0x35,0x33,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x06,0x17,0x21,0x15,0x21,0x12,0x33,0x32,0x37,0x03,0x97,0x79,0x87,0xfe,0x7d,0x4a,0x6e,0x62,0x03,0x05,0x64,0x77,0x2e,0x01,0x01,0xb7,0x7c,0x62,0x68,0x80,0x72,0xb0,0x24,0x01,0xc3,0xfe,0x2a,0x08,0x07, -0x01,0xd7,0xfe,0x37,0x41,0xfc,0x77,0x80,0x2d,0x43,0x01,0xcb,0x7f,0x1c,0x29,0x2c,0x36,0x7f,0xd9,0xf6,0x33,0x93,0x47,0xb6,0x9a,0x7f,0x5a,0x4d,0x7f,0xfe,0xb4,0x4f,0x00,0x03,0x00,0x73,0x00,0x00,0x06,0x30,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x24,0x00,0x70,0xb1,0x0e,0x1f,0xbe,0x01,0x83,0x00,0x14,0x00,0x08,0x01,0x82,0x00,0x03, -0x00,0x23,0x01,0x84,0x40,0x11,0x19,0x0f,0x03,0x00,0x0f,0x0f,0x00,0x03,0x03,0x05,0x0a,0x14,0x0c,0x01,0x05,0x08,0x02,0xbb,0x01,0x7d,0x00,0x01,0x00,0x17,0x01,0x7d,0xb7,0x1c,0x01,0x1c,0x01,0x1c,0x0d,0x10,0x23,0xb8,0x01,0x7d,0x40,0x0a,0x0f,0x04,0x99,0x07,0x07,0x7f,0x0d,0x01,0x0d,0x0c,0x00,0x2f,0x2f,0x71,0x33,0x2f,0xed,0x2f, -0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0xc4,0x2f,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0xed,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32, -0x16,0x15,0x14,0x07,0x07,0x15,0x21,0x02,0x43,0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7,0x83,0x03,0x0a,0x01,0xc4,0xfe,0x0a,0xd9,0x5e,0x33,0x45,0x38,0x6b,0x59,0x4d,0x88,0x6b,0x7d,0xb9,0x95,0x01,0x5e,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfa,0xee,0x67,0xd6,0x5c,0x63, -0x32,0x35,0x42,0x5d,0x87,0x45,0x77,0x62,0x8b,0xb1,0x8d,0x04,0x00,0x04,0x00,0x73,0x00,0x00,0x06,0x0a,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x18,0x00,0x20,0x00,0x7d,0xb5,0x17,0x10,0x0e,0xa8,0x11,0x08,0xbb,0x01,0x82,0x00,0x03,0x00,0x1d,0x01,0x83,0x40,0x18,0x13,0x03,0x00,0x13,0x13,0x00,0x03,0x03,0x05,0x1e,0x1a,0x19,0x0a,0x11, -0x0c,0x01,0x05,0x04,0x99,0x07,0x07,0x0d,0x0f,0x13,0xb8,0x01,0x7d,0xb5,0x1d,0x17,0x14,0x1d,0x08,0x02,0xb8,0x01,0x7d,0x40,0x11,0x01,0x19,0x15,0x1d,0x01,0x15,0x15,0x01,0x1d,0x03,0x0c,0x7f,0x0d,0x01,0x0d,0x11,0x0c,0x00,0x2f,0x33,0x2f,0x71,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x33,0x10,0xed,0x32, -0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0xc4,0x2f,0xc4,0x33,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xf4,0xc6,0x32,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x01,0x33,0x11,0x33,0x03,0x23,0x06,0x07,0x03,0x33,0x11,0x34,0x02,0x43, -0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7,0x83,0x03,0x0a,0x01,0x9e,0x64,0x78,0xfe,0x9c,0x01,0x4f,0x8d,0x64,0xd8,0x04,0x0a,0x18,0xc6,0xe8,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfb,0xa6,0xb9,0xb9,0x53,0x01,0xf6,0xfe,0x1a,0x01,0x74,0x1c,0x26,0xfe,0xce,0x01,0x24,0x1d, -0x00,0x04,0x00,0x75,0x00,0x00,0x06,0x45,0x05,0x25,0x00,0x20,0x00,0x24,0x00,0x2f,0x00,0x37,0x00,0x9a,0xb5,0x2e,0x27,0x25,0xa8,0x28,0x17,0xbe,0x01,0x82,0x00,0x0d,0x00,0x1c,0x01,0x83,0x00,0x06,0x00,0x34,0x01,0x83,0x40,0x0f,0x2a,0x0d,0x06,0x2a,0x2a,0x06,0x0d,0x03,0x09,0x35,0x30,0x21,0x28,0x23,0x1a,0xb8,0x01,0x86,0xb4,0x11, -0x00,0x09,0x26,0x2a,0xb8,0x01,0x7d,0xb5,0x34,0x2e,0x2b,0x34,0x19,0x09,0xb8,0x01,0x7d,0xb3,0x0a,0x0a,0x14,0x03,0xb8,0x01,0x7d,0x40,0x0d,0x1f,0x30,0x2c,0x34,0x1f,0x2c,0x2c,0x1f,0x34,0x03,0x23,0x24,0x0f,0xb8,0x01,0x7d,0xb7,0x14,0x14,0x7f,0x24,0x01,0x24,0x28,0x23,0x00,0x2f,0x33,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x17,0x39, -0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x11,0x39,0x2f,0xed,0x39,0x11,0x33,0x33,0x10,0xed,0x32,0x01,0x2f,0xc4,0xc6,0xed,0xc4,0x2f,0xc4,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xf4,0xc6,0x32,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07, -0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x01,0x33,0x11,0x33,0x03,0x23,0x06,0x07,0x03,0x33,0x11,0x34,0x75,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4f,0x72,0x66,0x7a,0x84,0xa1,0x9a,0x81,0x7c,0x04,0x74,0xfc,0xf7,0x82, -0x03,0x0a,0x01,0x98,0x64,0x78,0xfe,0x9c,0x01,0x4f,0x8d,0x64,0xd8,0x04,0x0b,0x17,0xc6,0xe8,0x02,0x2e,0x81,0x45,0x44,0x3a,0x80,0x6a,0x7a,0x6c,0x3f,0x7e,0x2e,0x6b,0x57,0x89,0x31,0x04,0x26,0x91,0x6a,0x86,0x03,0x15,0xfa,0xed,0x05,0x13,0xfb,0xa6,0xb9,0xb9,0x53,0x01,0xf6,0xfe,0x1a,0x01,0x74,0x1c,0x26,0xfe,0xce,0x01,0x24,0x1d, -0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x3e,0x05,0x13,0x00,0x11,0x00,0x4b,0x40,0x09,0x00,0x0e,0x00,0x0e,0x03,0x09,0x10,0x0c,0x02,0xb8,0x01,0x85,0xb4,0x07,0x05,0x03,0x01,0x05,0xb8,0x01,0x7f,0x40,0x12,0x06,0x10,0x06,0x0f,0x9a,0x0c,0x06,0x0c,0x06,0x0c,0x03,0x0b,0x9a,0x7f,0x08,0x01,0x08,0x03,0x00,0x2f,0x2f,0x71,0xed,0x12,0x39, -0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xc6,0x33,0xed,0x32,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x20,0xdd,0x99,0x91,0x91,0x02,0x94,0xfe,0x05,0x01,0xd5,0xfe,0x2b,0xdd,0xfc,0xfc,0xfc,0x8d,0x03,0x8a, -0x8a,0xfe,0x3f,0x89,0xb6,0x00,0x00,0x04,0x00,0xaa,0xff,0xea,0x07,0xd0,0x05,0x13,0x00,0x09,0x00,0x10,0x00,0x25,0x00,0x45,0x00,0x9b,0xb1,0x36,0x41,0xbb,0x01,0x84,0x00,0x2b,0x00,0x06,0x01,0x85,0xb2,0x0e,0x1d,0x21,0xb8,0x01,0x84,0xb5,0x1a,0x18,0x16,0x1f,0x11,0x3b,0xb8,0x01,0x84,0x40,0x0f,0x26,0x30,0x0e,0x16,0x11,0x30,0x30, -0x11,0x16,0x0e,0x04,0x02,0x2b,0x0b,0x01,0xb8,0x01,0x85,0x40,0x0e,0x02,0x2b,0x3b,0x44,0x33,0x44,0x13,0x0b,0x9a,0x00,0x33,0x38,0x20,0x18,0xb8,0x01,0x7e,0x40,0x0d,0x19,0x1d,0x19,0x00,0x19,0x1c,0x1c,0x19,0x00,0x03,0x03,0x29,0x23,0xb8,0x01,0x7e,0x40,0x09,0x13,0x0a,0x9a,0x7f,0x03,0x01,0x03,0x02,0x18,0x00,0x3f,0x2f,0x71,0xed, -0x2f,0xed,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x33,0x10,0xed,0x11,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc4,0xed,0x11,0x33,0x10,0xc6,0x33,0xed,0x32,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x20,0x11,0x14,0x06,0x23,0x03, -0x11,0x33,0x20,0x11,0x10,0x21,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x17,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x01,0x43,0x99,0x01,0x1b,0x01, -0xa3,0xf0,0xd5,0x60,0x55,0x01,0x30,0xfe,0xe3,0x03,0xd3,0x34,0x57,0x76,0x6a,0x8d,0x8d,0x94,0xd7,0xd7,0x77,0x36,0x2a,0x3e,0x6d,0x7c,0x93,0x3a,0xdf,0x61,0xa6,0x85,0x75,0x47,0x57,0x67,0x42,0x4f,0x62,0x55,0x7f,0x44,0x9f,0x8c,0x92,0x01,0xeb,0xfe,0x15,0x05,0x13,0xfe,0x7c,0xbe,0xe6,0x02,0x9e,0xfd,0xec,0x01,0x13,0x01,0x01,0xfb, -0x80,0x1d,0x81,0x8f,0x01,0xa4,0x7d,0xe3,0x31,0xfe,0xec,0x7d,0xfe,0x76,0xad,0x1f,0x66,0x9f,0x5a,0x68,0x24,0x48,0x54,0x38,0x69,0x6e,0x83,0x2a,0x91,0x3e,0x39,0x2e,0x33,0x28,0x23,0x39,0x66,0x43,0x71,0x82,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x8f,0x05,0x29,0x00,0x23,0x00,0x81,0xb5,0x10,0x0c,0x07,0x22,0x1e,0x01,0xb8,0x01,0x84, -0x40,0x0e,0x12,0x0e,0x0a,0x20,0x00,0x0a,0x00,0x19,0x19,0x00,0x0a,0x03,0x05,0x04,0xb8,0x01,0x86,0xb3,0x07,0x05,0x01,0x0c,0xb8,0x01,0x7e,0xb4,0x0d,0x22,0x0d,0x21,0x10,0xb8,0x01,0x7e,0x40,0x16,0x11,0x1e,0x11,0x30,0x0d,0x40,0x0d,0x02,0x2f,0x11,0x01,0x00,0x11,0x10,0x11,0x02,0x0d,0x11,0x0d,0x11,0x04,0x1b,0xb8,0x01,0x7e,0xb2, -0x16,0x08,0x04,0xb9,0x01,0x7e,0x00,0x07,0x00,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0xed,0x32,0x32,0x10,0xc4,0x32,0x31,0x30,0x01,0x21,0x15,0x14,0x07,0x21,0x15,0x21,0x35, -0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0xc6,0xfe,0xf4,0xaf,0x02,0x84,0xfc,0xd1,0xc6,0xb3,0xb3,0xb3,0xb3,0xc5,0x9d,0x6b,0x56,0x5a,0x65,0xd0,0x01,0x0c,0xfe,0xf4,0x01,0x0c,0x01,0xba,0x08,0xdc,0x57,0x7f,0x7a,0x41,0xdb,0x24, -0x7f,0x7b,0x80,0x71,0xab,0xd9,0x25,0x8d,0x34,0xfe,0xea,0x61,0x80,0x7b,0x00,0x05,0x00,0x73,0xff,0xee,0x06,0x35,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x21,0x00,0x2a,0x00,0x34,0x00,0x9a,0xbc,0x00,0x24,0x01,0x83,0x00,0x20,0x00,0x29,0x01,0x83,0x40,0x0a,0x1a,0x0e,0x18,0x1a,0x20,0x1a,0x20,0x1a,0x16,0x10,0xbb,0x01,0x83,0x00,0x33, -0x00,0x2d,0x01,0x83,0x40,0x0b,0x16,0x0c,0x16,0x0a,0x0a,0x16,0x0c,0x03,0x03,0x33,0x08,0xb8,0x01,0x82,0xb7,0x03,0x04,0x99,0x07,0x07,0x0d,0x08,0x02,0xb8,0x01,0x7d,0xb7,0x01,0x18,0x0e,0x2b,0x22,0x2b,0x13,0x26,0xb8,0x01,0x7d,0x40,0x0e,0x1d,0x22,0x30,0x1d,0x01,0x1d,0x01,0x1d,0x0c,0x7f,0x0d,0x01,0x0d,0x30,0xb8,0x01,0x7d,0xb3, -0x13,0x13,0x0c,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21, -0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x02,0x43,0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7, -0x83,0x03,0x0a,0x01,0x35,0x94,0x94,0x87,0x72,0x97,0x93,0x77,0x8b,0x76,0x6a,0x84,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x42,0x41,0x53,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d, -0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x75,0xff,0xee,0x06,0x76,0x05,0x25,0x00,0x20,0x00,0x24,0x00,0x38,0x00,0x41,0x00,0x4b,0x00,0xc3,0xbc,0x00,0x3b,0x01,0x83,0x00,0x37,0x00,0x40,0x01,0x83,0x40,0x0a,0x31,0x25,0x2f,0x31,0x37,0x31,0x37,0x31,0x2d,0x27,0xbb,0x01,0x83,0x00,0x4a,0x00,0x0d, -0x01,0x82,0x40,0x09,0x11,0x09,0x1a,0x03,0x00,0x17,0x17,0x00,0x1c,0xbb,0x01,0x83,0x00,0x06,0x00,0x44,0x01,0x83,0x40,0x0f,0x2d,0x23,0x06,0x2d,0x21,0x21,0x2d,0x06,0x23,0x04,0x00,0x4a,0x00,0x19,0x09,0xb8,0x01,0x7d,0xb3,0x0a,0x0a,0x14,0x03,0xb8,0x01,0x7d,0xb7,0x1f,0x2f,0x25,0x42,0x39,0x42,0x2a,0x3d,0xb8,0x01,0x7d,0x40,0x0b, -0x34,0x39,0x34,0x47,0x1f,0x34,0x1f,0x34,0x23,0x24,0x0f,0xb8,0x01,0x7d,0xb6,0x14,0x14,0x7f,0x24,0x01,0x24,0x47,0xb8,0x01,0x7d,0xb3,0x2a,0x2a,0x23,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x2f,0xed,0x39, -0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15, -0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x75,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4f,0x72,0x66, -0x7a,0x84,0xa1,0x9a,0x81,0x7c,0x04,0x75,0xfc,0xf7,0x83,0x03,0x0b,0x01,0x35,0x93,0x94,0x87,0x71,0x98,0x93,0x77,0x8b,0x77,0x6a,0x83,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x43,0x40,0x53,0x02,0x2e,0x81,0x45,0x44,0x3a,0x80,0x6a,0x7a,0x6c,0x3f,0x7e,0x2e,0x6b,0x57,0x89,0x31,0x04,0x26,0x91,0x6a,0x86,0x03,0x15,0xfa,0xed,0x05, -0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d,0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x82,0xff,0xee,0x06,0x78,0x05,0x17,0x00,0x15,0x00,0x19,0x00,0x2d,0x00,0x36,0x00,0x40,0x00,0xb6,0xbc,0x00,0x30,0x01,0x83,0x00,0x2c,0x00, -0x35,0x01,0x83,0x40,0x0a,0x26,0x1a,0x24,0x26,0x2c,0x26,0x2c,0x26,0x22,0x1c,0xb8,0x01,0x83,0xb2,0x3f,0x0c,0x11,0xbb,0x01,0x83,0x00,0x06,0x00,0x39,0x01,0x83,0x40,0x0d,0x22,0x18,0x06,0x22,0x16,0x16,0x22,0x06,0x18,0x04,0x09,0x3f,0x0e,0xb8,0x01,0x82,0xb2,0x00,0x09,0x08,0xb8,0x01,0x7d,0xb3,0x0e,0x0e,0x0a,0x03,0xb8,0x01,0x7d, -0xb7,0x14,0x1a,0x24,0x37,0x2e,0x37,0x1f,0x32,0xb8,0x01,0x7d,0x40,0x0b,0x29,0x2e,0x29,0x3c,0x14,0x29,0x14,0x29,0x1f,0x19,0x0d,0xb8,0x01,0x7d,0xb6,0x0a,0x0a,0x7f,0x19,0x01,0x19,0x3c,0xb8,0x01,0x7d,0xb3,0x1f,0x1f,0x18,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10, -0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xfd,0xc4,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x11,0x21,0x15,0x21,0x15,0x36,0x16,0x15, -0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x82,0x67,0x4e,0x4d,0x5b,0xb9,0x8c,0x01,0x9e,0xfe,0xd6,0xa5,0xa9,0x9e,0x89,0x70,0x04, -0x6c,0xfc,0xf7,0x83,0x03,0x0b,0x01,0x34,0x94,0x94,0x87,0x72,0x97,0x93,0x77,0x8b,0x76,0x6a,0x84,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x42,0x41,0x53,0x02,0x25,0x84,0x3f,0x51,0x40,0x8a,0x08,0x01,0x9a,0x71,0xb5,0x0c,0x89,0x74,0x72,0x90,0x03,0x15,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43, -0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d,0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x93,0xff,0xee,0x05,0xfe,0x05,0x1c,0x00,0x06,0x00,0x0a,0x00,0x1e,0x00,0x27,0x00,0x31,0x00,0x9a,0xbc,0x00,0x21,0x01,0x83,0x00,0x1d,0x00,0x26,0x01,0x83,0x40,0x0a,0x17,0x0b,0x15,0x17,0x1d,0x17,0x1d, -0x17,0x13,0x0d,0xbe,0x01,0x83,0x00,0x30,0x00,0x06,0x01,0x85,0x00,0x02,0x00,0x2a,0x01,0x83,0x40,0x0f,0x13,0x01,0x09,0x02,0x13,0x07,0x07,0x13,0x02,0x09,0x01,0x05,0x30,0x03,0x03,0xb8,0x01,0x7d,0x40,0x0a,0x04,0x04,0x0a,0x0b,0x15,0x1f,0x28,0x28,0x10,0x23,0xb8,0x01,0x7d,0x40,0x0e,0x1a,0x1f,0x2d,0x1a,0x01,0x1a,0x01,0x1a,0x10, -0x7f,0x0a,0x01,0x0a,0x2d,0xb8,0x01,0x7d,0xb3,0x10,0x10,0x09,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x2f,0xed,0x01,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39, -0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x23,0x01,0x21,0x35,0x21,0x15,0x25,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x73,0x84,0x01,0x23,0xfe,0x81,0x02, -0x1b,0x02,0x09,0xfc,0xf6,0x82,0x03,0x0a,0x01,0x35,0x94,0x95,0x87,0x71,0x97,0x92,0x76,0x8a,0x77,0x6a,0x83,0xf8,0x7b,0x78,0x36,0x46,0x74,0x90,0x55,0x42,0x40,0x54,0x02,0x11,0x02,0xa0,0x6b,0x30,0x27,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d, -0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x04,0x1e,0x05,0x2b,0x00,0x27,0x00,0x61,0xb1,0x22,0x26,0xb8,0x01,0x84,0x40,0x0a,0x1d,0x01,0x10,0x24,0x24,0x10,0x01,0x03,0x00,0x18,0xb8,0x01,0x84,0xb3,0x07,0x20,0x00,0x02,0xbe,0x01,0x7e,0x00,0x1d,0x00,0x25,0x01,0x7e,0x00,0x22,0x00, -0x21,0x01,0x7e,0x40,0x0a,0x1e,0x1d,0x22,0x1e,0x1e,0x22,0x1d,0x03,0x26,0x13,0xbc,0x01,0x7e,0x00,0x0c,0x00,0x26,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0x33,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x2e,0x03, -0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x04,0x1e,0xfd,0xed,0x61,0x9b,0x6c,0x3a,0x42,0x7d,0xb3,0x70,0x3e,0x71,0x2f,0x34,0x74,0x3b,0x4d,0x7a,0x52,0x2c,0x21,0x42,0x64,0x43,0x01,0xfe,0xfe,0x95,0x01,0x51,0xfe,0xaf, -0x01,0x80,0x01,0x5a,0x03,0x4c,0x80,0xa7,0x5f,0x6f,0xbb,0x87,0x4b,0x17,0x17,0x9b,0x24,0x22,0x39,0x63,0x85,0x4b,0x45,0x75,0x59,0x39,0x0a,0x01,0xba,0x7f,0xfe,0xf0,0x7f,0xfe,0xed,0x00,0x00,0x03,0x00,0x6b,0xff,0xbc,0x03,0xb5,0x05,0xa7,0x00,0x2e,0x00,0x36,0x00,0x40,0x00,0x34,0x40,0x09,0x3b,0x32,0x3f,0x03,0x28,0x15,0x15,0x42, -0x2f,0xb8,0x01,0x85,0xb6,0x28,0x3e,0x31,0x32,0x03,0x37,0x10,0xbc,0x01,0x7e,0x00,0x1b,0x00,0x37,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x2f,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x15, -0x0e,0x03,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x07,0x23,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x37,0x01,0x14,0x17,0x13,0x0e,0x03,0x01,0x22,0x06,0x07,0x01,0x16,0x16,0x17,0x01,0x26,0x02,0xe9,0x27,0x17,0x2b,0x14,0x27,0x68,0x2c,0x0e,0x1d,0x0f,0x36,0x2b,0xfe,0xc3,0x3c,0x4b,0x2a,0x47,0x42,0x41,0x23,0x22,0x43,0x48,0x4f, -0x2f,0x52,0x48,0x15,0x67,0x20,0x26,0x23,0x2f,0x66,0x46,0x45,0x4c,0x4a,0x84,0xb4,0x6b,0x29,0xfe,0x89,0x2f,0xf2,0x41,0x6b,0x4c,0x29,0x01,0xb2,0x09,0x10,0x08,0xfe,0xe2,0x0f,0x21,0x13,0x01,0x32,0x1a,0x05,0xa7,0x7e,0x02,0x02,0x82,0x93,0x04,0x09,0x04,0x96,0x19,0x0e,0xfb,0xee,0x19,0x09,0x12,0x1b,0x13,0x88,0x10,0x17,0x11,0x08, -0x16,0x44,0x69,0x16,0x1b,0x9a,0xe8,0x55,0xe8,0x90,0x8c,0xea,0xb3,0x73,0x13,0x87,0xfc,0xd3,0x96,0x74,0x03,0x1e,0x1a,0x63,0x8a,0xab,0x01,0xce,0x01,0x01,0xfc,0x52,0x14,0x21,0x10,0x03,0xf2,0x03,0x00,0x01,0x00,0x6b,0xff,0xea,0x03,0xb5,0x05,0x29,0x00,0x3e,0x00,0x45,0xb1,0x37,0x07,0xb8,0x01,0x83,0xb3,0x34,0x34,0x00,0x2f,0xb8, -0x01,0x85,0xb4,0x1a,0x25,0x10,0x00,0x02,0xb8,0x01,0x7e,0x40,0x09,0x35,0x37,0x34,0x07,0x04,0x3b,0x3b,0x0a,0x2a,0xbc,0x01,0x7e,0x00,0x1f,0x00,0x0a,0x01,0x7e,0x00,0x15,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x17,0x39,0xed,0x01,0x2f,0x33,0x33,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x06,0x15, -0x11,0x16,0x32,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x03,0xb5,0x23,0x41,0x56,0x39,0x39,0x04,0x0b,0x06,0x2a,0x47,0x42,0x41,0x23,0x22,0x43, -0x48,0x4f,0x2f,0x77,0xc7,0x90,0x51,0x5b,0xa1,0xd9,0x7e,0x28,0x40,0x3a,0x38,0x1d,0x23,0x3c,0x3a,0x3c,0x24,0x5f,0x9e,0x74,0x41,0x24,0x41,0x5c,0x39,0x85,0x03,0x1d,0x74,0x49,0x1a,0x27,0x0e,0x02,0xd1,0x1b,0x50,0x50,0x8c,0xfe,0xaa,0x01,0x09,0x12,0x1b,0x13,0x88,0x10,0x17,0x11,0x08,0x5d,0xa8,0xef,0x93,0x9c,0x01,0x00,0xb7,0x65, -0x05,0x09,0x0e,0x0a,0x96,0x11,0x16,0x0f,0x07,0x52,0x94,0xce,0x7c,0x59,0x9e,0x7f,0x5e,0x1b,0x02,0xcd,0xab,0x58,0x62,0x07,0x05,0x00,0x00,0x01,0x00,0x96,0xff,0x28,0x05,0xbc,0x04,0x93,0x00,0x2e,0x00,0x62,0xb1,0x23,0x1f,0xb8,0x01,0x84,0xb2,0x20,0x2b,0x11,0xb8,0x01,0x84,0x40,0x0d,0x16,0x15,0x20,0x12,0x00,0x01,0x12,0x01,0x12, -0x01,0x06,0x20,0x05,0xb8,0x01,0x84,0xb2,0x06,0x0f,0x19,0xb8,0x01,0x7e,0x40,0x12,0x26,0x13,0x16,0x10,0x2b,0x04,0x26,0x20,0x2e,0x2e,0x2d,0x01,0x26,0x15,0x15,0x12,0x06,0x20,0x00,0x2f,0x33,0x33,0x33,0x2f,0x2f,0x33,0x33,0x33,0x2f,0x11,0x12,0x17,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11, -0x12,0x39,0x33,0xed,0x39,0x10,0xed,0x32,0x31,0x30,0x01,0x07,0x33,0x20,0x11,0x11,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x22,0x07,0x03,0x11,0x23,0x35,0x03,0x23,0x01,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x37,0x13,0x05,0x00,0x7a,0x03,0x01,0x33,0x95,0x0f,0x2e,0x51, -0x41,0x07,0x0b,0x07,0xcc,0x94,0xde,0x8b,0x01,0x69,0xd3,0x39,0x56,0x37,0x1b,0x95,0x95,0x04,0x63,0xbd,0x2d,0x54,0x46,0x33,0x0c,0x39,0x56,0x90,0x04,0x93,0xde,0xfe,0x87,0xfd,0xc4,0x02,0x15,0x3f,0x6b,0x4e,0x2b,0x01,0xfe,0x8f,0xfe,0x3a,0xb9,0xfe,0x6f,0x02,0x8d,0x72,0x01,0x11,0x33,0x54,0x6a,0x36,0xfd,0xef,0x03,0xa0,0x93,0xa8, -0x1b,0x32,0x47,0x2c,0x69,0x2f,0x01,0x06,0x00,0x05,0x00,0x20,0x00,0x00,0x04,0x91,0x05,0x13,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x29,0x00,0x31,0x00,0xa2,0x40,0x0f,0x2f,0x22,0x21,0x12,0x04,0x11,0x14,0x11,0x28,0x0e,0x09,0x09,0x0c,0x08,0x10,0xb8,0x01,0x83,0x40,0x0d,0x29,0x1c,0x1f,0x04,0x04,0x03,0x1d,0x05,0x28,0x03,0x2e,0x20, -0x14,0xb8,0x01,0x84,0x40,0x0b,0x15,0x17,0x00,0x00,0x19,0x01,0x15,0x29,0x13,0x0f,0x17,0xb8,0x01,0x7e,0x40,0x09,0x18,0x20,0x1c,0x0c,0x18,0x23,0x1f,0x0b,0x1b,0xb8,0x01,0x7e,0x40,0x1c,0x00,0x2e,0x08,0x04,0x00,0x0f,0x00,0x1f,0x00,0x3f,0x00,0x4f,0x00,0x04,0x18,0x00,0x18,0x00,0x02,0x25,0x15,0x11,0x2b,0x06,0x7f,0x02,0x01,0x02, -0x00,0x2f,0x71,0xc4,0x33,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x11,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x32,0x32,0x2f,0x33,0x33,0x12,0x17,0x39,0xed,0x32,0x32,0x32,0x2f,0x33,0x11,0x33,0x11,0x12,0x17,0x39,0x31,0x30, -0x13,0x33,0x11,0x33,0x13,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x03,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x05,0x33,0x27,0x23,0x01,0x33,0x26,0x35,0x35,0x23,0x01,0x23,0x16,0x15,0x15,0x33,0x27,0x26,0x20,0x8a,0xb8,0xdb,0x01,0x3e,0x88,0x8e,0x8e,0x8e,0x8e,0xaf,0xed,0xfe, -0xcc,0x89,0x8a,0x8a,0x8a,0x02,0x99,0xc2,0xff,0xfe,0xb7,0xf6,0x3e,0xb8,0x02,0x4b,0x03,0x06,0x85,0xfe,0x3b,0x04,0x06,0x79,0x57,0x19,0x03,0x55,0x01,0xbe,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x7f,0x7c,0x7e,0xfe,0x24,0x01,0xdc,0xfe,0x24,0x01,0xdc,0x7e,0x7c,0x7c,0x7c,0x7c,0x7c,0xfd,0xf2,0x2d,0x91,0x56,0x02,0x79,0x2a,0x86,0x50,0xb0, -0x32,0x00,0x00,0x03,0x00,0xaa,0xff,0xea,0x05,0xdb,0x05,0x13,0x00,0x16,0x00,0x21,0x00,0x54,0x00,0x79,0xb1,0x3a,0x4c,0xb8,0x01,0x84,0xb3,0x27,0x13,0x07,0x0e,0xbb,0x01,0x85,0x00,0x1e,0x00,0x42,0x01,0x84,0x40,0x0c,0x31,0x22,0x00,0x31,0x1e,0x31,0x1e,0x31,0x07,0x27,0x18,0x06,0xb8,0x01,0x85,0x40,0x09,0x07,0x13,0x18,0x9a,0x05, -0x27,0x42,0x51,0x3d,0xb8,0x01,0x7e,0x40,0x0d,0x36,0x05,0x36,0x05,0x36,0x07,0x17,0x9a,0x7f,0x08,0x01,0x08,0x25,0xb8,0x01,0x7e,0xb4,0x51,0x51,0x01,0x07,0x18,0x00,0x3f,0x33,0x33,0x2f,0xed,0x2f,0x71,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x12,0x39,0x39,0x10,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11, -0x33,0x33,0x10,0xed,0x10,0xed,0x11,0x39,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17, -0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0xa3,0xb5,0xa0,0x47,0x80,0x44,0x99,0x01,0x3f,0x55,0x90,0x67,0x3a,0x25,0x47,0x67,0x43,0x49,0x3c,0xfe,0x65,0x84,0x39,0x61,0x46,0x28,0x81,0x80,0x01,0xee,0x38,0x75,0x3d,0xa0,0x1a,0x2d,0x3a,0x1f,0x43,0x57,0x36, -0x16,0x2a,0x4f,0x71,0x48,0x33,0x69,0x28,0x2e,0x64,0x37,0x20,0x38,0x27,0x16,0x14,0x27,0x37,0x20,0x3c,0x5b,0x3c,0x1e,0x1f,0x4a,0x77,0x58,0x3f,0x77,0x31,0x01,0x87,0xa2,0xfd,0xd7,0x05,0x13,0x2a,0x57,0x82,0x57,0x44,0x76,0x5d,0x41,0x0f,0x03,0x1b,0x7f,0x02,0xd4,0xfe,0x29,0x23,0x40,0x5d,0x3a,0x69,0x74,0xfc,0x32,0x26,0x2d,0x64, -0x1c,0x28,0x1c,0x16,0x0b,0x15,0x30,0x3b,0x46,0x2a,0x31,0x53,0x3f,0x25,0x13,0x10,0x94,0x1d,0x1c,0x0d,0x19,0x25,0x16,0x1e,0x26,0x1b,0x14,0x0a,0x14,0x2b,0x38,0x49,0x31,0x2d,0x55,0x43,0x29,0x1b,0x18,0x00,0x00,0x07,0x00,0x12,0x00,0x00,0x05,0x53,0x05,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x33,0x00,0x3b,0x00,0x43, -0x00,0x6a,0xb4,0x3b,0x33,0x05,0x01,0x09,0xb8,0x01,0x7e,0x40,0x0b,0x0a,0x28,0x24,0x20,0x1e,0x0a,0x2b,0x27,0x23,0x1d,0x0d,0xb8,0x01,0x7e,0x40,0x23,0x0e,0x40,0x1a,0x16,0x12,0x0e,0x0f,0x0e,0x1f,0x0e,0x3f,0x0e,0x4f,0x0e,0x04,0x0a,0x0e,0x0a,0x0e,0x07,0x3c,0x18,0x14,0x10,0x10,0x7f,0x14,0x01,0x14,0x37,0x36,0x2e,0x2e,0x03,0x07, -0x00,0x2f,0x33,0x33,0x11,0x33,0x33,0x2f,0x71,0x33,0x2f,0x11,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x32,0x11,0x33,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x32,0x31,0x30,0x01,0x23,0x03,0x23,0x03,0x23,0x03,0x23,0x03,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x03,0x33,0x13,0x33, -0x13,0x33,0x13,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x21,0x33,0x37,0x23,0x05,0x33,0x37,0x23,0x07,0x33,0x27,0x23,0x03,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x05,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x03,0x23,0x06,0x07,0x07,0x33,0x27,0x26,0x05,0x53,0xf4,0x5a,0x93,0x59,0xd2,0x59,0x92,0x5d,0xed,0xd3,0x17,0xbc,0xa2,0x56, -0x82,0x51,0xf4,0x55,0x78,0x50,0xe9,0x4f,0x80,0x54,0xad,0xc5,0x17,0xdb,0xfc,0x0e,0x95,0x18,0xc4,0x02,0x27,0x8f,0x16,0xbc,0xf9,0xa1,0x16,0x74,0xe0,0x0c,0x02,0x04,0x03,0x0f,0x22,0x67,0x02,0x33,0x0a,0x04,0x02,0x03,0x0d,0x20,0x62,0xd4,0x02,0x04,0x0c,0x12,0x43,0x11,0x0c,0x01,0xde,0xfe,0x22,0x01,0xde,0xfe,0x22,0x01,0xde,0x7f, -0x7b,0x80,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x80,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0xfe,0x57,0x3f,0x44,0x30,0x53,0xaf,0xb7,0x33,0x46,0x2f,0x4e,0xb3,0x02,0x5c,0x43,0x40,0x5f,0x5d,0x3d,0x00,0x00,0x03,0x00,0x57,0xfe,0xf3,0x04,0x29,0x05,0x5d,0x00,0x1c,0x00,0x31,0x00,0x35,0x00,0x64,0xb4,0x14,0x14,0x01, -0x33,0x28,0xb8,0x01,0x84,0xb4,0x0a,0x32,0x1b,0x19,0x00,0xb8,0x01,0x84,0xb4,0x1d,0x16,0x12,0x01,0x33,0xbb,0x01,0x7d,0x00,0x34,0x00,0x23,0x01,0x7e,0xb2,0x0f,0x1c,0x14,0xb8,0x01,0x7e,0x40,0x0c,0x15,0x19,0x15,0x02,0x12,0x0f,0x15,0x0f,0x15,0x05,0x18,0x2d,0xb8,0x01,0x7e,0xb3,0x05,0x18,0x01,0x18,0x00,0x3f,0x3f,0xed,0x2f,0x12, -0x39,0x39,0x2f,0x2f,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x2f,0xed,0x01,0x2f,0x33,0x33,0x33,0xfd,0x32,0xc6,0xc6,0x2f,0xed,0xc4,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x2e,0x02, -0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x13,0x21,0x35,0x21,0x03,0xae,0x94,0x04,0x67,0xd8,0x62,0x91,0x5f,0x2e,0x35,0x6a,0xa0,0x6a,0xbc,0x5a,0x04,0xfe,0xd4,0x01,0x2c,0x94,0x7b,0x7b,0x94,0x28,0x46,0x60,0x39,0x4e,0x6f,0x46,0x21,0x20,0x43,0x68,0x49,0x40,0x68,0x4a,0x26,0x70,0xfc,0xfe,0x03,0x02,0x9e,0xb4, -0x4b,0x7d,0xa9,0x5f,0x67,0xb8,0x8b,0x51,0x96,0x01,0x22,0x79,0xa3,0xa3,0x79,0xfd,0x62,0x89,0x38,0x62,0x49,0x29,0x3c,0x68,0x87,0x4c,0x44,0x7e,0x60,0x38,0x34,0x57,0x72,0xfd,0x8f,0x6c,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0x9d,0x05,0x13,0x00,0x19,0x00,0x42,0xb6,0x18,0x19,0x16,0x03,0x00,0x0f,0x07,0xb8,0x01,0x85,0xb7,0x0c,0x0a, -0x08,0x15,0x00,0x19,0x06,0x0a,0xb8,0x01,0x7e,0x40,0x0d,0x16,0x10,0x0f,0x0b,0x0b,0x01,0x14,0x7f,0x0e,0x01,0x0e,0x08,0x01,0x00,0x2f,0x33,0x2f,0x71,0x33,0x12,0x39,0x2f,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0xc6,0x33,0xed,0x32,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35, -0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x03,0x9d,0xc6,0xfe,0x92,0x0f,0x0d,0x07,0x03,0x99,0x84,0x84,0x99,0x03,0x07,0x14,0x08,0x01,0x6f,0xb0,0xfe,0x61,0x01,0x4e,0xfe,0xb9,0x02,0x1c,0x18,0x18,0x0d,0xfd,0xa7,0x02,0x5f,0x80,0x02,0x34,0xfd,0xca,0x0d,0x1e,0x0b,0x02,0x00,0xfd,0xcc,0x80,0x00,0x01, -0x00,0x25,0x00,0x00,0x03,0x1a,0x05,0x13,0x00,0x17,0x00,0x5e,0xb9,0x00,0x06,0x01,0x84,0x40,0x2c,0x07,0x15,0x11,0x9a,0x12,0x02,0x0b,0x03,0x0a,0x0a,0x09,0x0f,0x16,0x0e,0x17,0x0e,0x0d,0x08,0x05,0x09,0x04,0x04,0x03,0x0c,0x01,0x0d,0x00,0x00,0x17,0x09,0x0d,0x03,0x17,0x17,0x03,0x0d,0x09,0x04,0x07,0x7f,0x12,0x01,0x12,0x07,0x00, -0x2f,0x2f,0x71,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x01,0x07,0x15,0x37,0x15,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11,0x21,0x35,0x21,0x15,0x21, -0x11,0x37,0x02,0xbf,0xd4,0xd4,0xd4,0x98,0xd9,0xd9,0xd9,0xd9,0xfe,0xd2,0x02,0xf5,0xfe,0xd1,0xd4,0x03,0x5c,0x79,0xb9,0x79,0x81,0x78,0xfe,0x56,0x01,0x53,0x7a,0x80,0x7a,0xb9,0x7a,0x81,0x7a,0x01,0x7c,0x8a,0x8a,0xfe,0xdb,0x78,0x00,0x05,0x00,0x28,0xfe,0xbf,0x08,0x0c,0x05,0xdb,0x00,0x3a,0x00,0x53,0x00,0x6a,0x00,0x7e,0x00,0x8e, -0x00,0x98,0x40,0x09,0x8c,0x3e,0x0c,0x1e,0x4f,0x36,0x2f,0x24,0x00,0xb8,0x01,0x85,0x40,0x11,0x4a,0x68,0x54,0x6b,0x2a,0x1e,0x24,0x4a,0x6b,0x6b,0x4a,0x24,0x1e,0x2a,0x05,0x14,0x5e,0xbb,0x01,0x83,0x00,0x75,0x00,0x84,0x01,0x82,0x40,0x29,0x14,0x6a,0x24,0x4f,0x4f,0x36,0x0c,0x8c,0x07,0x7f,0x7f,0x3e,0x1e,0x43,0x19,0x68,0x63,0x7a, -0x59,0x19,0x59,0x29,0x29,0x59,0x19,0x03,0x0f,0x36,0x32,0x32,0x2f,0x36,0x43,0x89,0x89,0x0f,0x70,0x63,0x63,0x07,0x0f,0x00,0x2f,0x33,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x2f,0x33,0x33,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x12,0x39,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x2f,0x01,0x2f, -0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x33,0x33,0x11,0x33,0x33,0x33,0x31,0x30,0x01,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x37,0x36,0x36,0x37,0x0e,0x03,0x07,0x27,0x3e,0x03,0x37,0x36, -0x36,0x37,0x17,0x06,0x06,0x07,0x1e,0x03,0x05,0x06,0x02,0x07,0x1e,0x03,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x03,0x23,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0x22,0x0e,0x02,0x15, -0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x05,0xe7,0x20,0x45,0x6d,0x9a,0xca,0x7f,0x35,0x5d,0x4f,0x45,0x1f,0x3c,0x86,0x4d,0x2a,0x43,0x2f,0x1a,0x20,0x34,0x44,0x24,0x23,0x3d,0x38,0x34,0x1a,0x30,0x50,0x23,0x21,0x55,0x37,0x52,0x8c,0x7d,0x72,0x37,0x2f,0x3f,0x90,0xa1,0xb0,0x5e,0x3d,0x91,0x58,0x32,0x40,0x62,0x28,0x7d,0xbc, -0x7d,0x3e,0xfd,0x1c,0x2d,0x69,0x40,0x1b,0x39,0x42,0x48,0x2a,0x5f,0x98,0x76,0x55,0x37,0x1b,0x36,0x67,0x99,0x63,0x18,0x2d,0x29,0x29,0x02,0xa9,0x0e,0x29,0x4a,0x74,0x58,0x38,0x5c,0x43,0x26,0x28,0x4d,0x6f,0x48,0x1e,0x39,0x31,0x27,0x0b,0x7d,0x94,0x01,0x43,0x10,0x21,0x34,0x23,0x28,0x3e,0x2a,0x16,0x12,0x21,0x31,0x1d,0x30,0x43, -0x28,0x12,0xfa,0x8c,0x13,0x23,0x1b,0x11,0x11,0x19,0x22,0x10,0x34,0x59,0x28,0x2d,0x53,0x02,0xee,0x50,0xae,0xa7,0x95,0x71,0x42,0x12,0x1f,0x29,0x15,0x39,0x36,0x19,0x2e,0x41,0x27,0x2b,0x43,0x2d,0x17,0x0e,0x1a,0x21,0x13,0x56,0xf4,0x9b,0x99,0xe1,0x55,0x0a,0x30,0x42,0x4f,0x29,0x48,0x33,0x5f,0x4a,0x2f,0x02,0x42,0x5c,0x22,0x3b, -0x1c,0x43,0x2b,0x0e,0x56,0x8c,0xc0,0xa1,0xb1,0xfe,0xff,0x57,0x13,0x21,0x19,0x0e,0x39,0x61,0x81,0x8d,0x92,0x43,0x6c,0xa9,0x79,0x46,0x09,0x29,0x67,0x7b,0x94,0xfd,0xf1,0x31,0x69,0x57,0x39,0x21,0x41,0x5e,0x3d,0x41,0x73,0x56,0x31,0x0f,0x1c,0x28,0x18,0xfe,0x55,0x02,0x40,0x1d,0x38,0x2b,0x1a,0x22,0x39,0x49,0x27,0x25,0x3c,0x2c, -0x17,0x2c,0x40,0x4b,0x13,0x0c,0x17,0x21,0x14,0x16,0x23,0x17,0x0d,0x31,0x30,0x23,0x31,0x00,0x00,0x02,0x00,0x2b,0xfe,0x7a,0x03,0x18,0x05,0x54,0x00,0x3c,0x00,0x4e,0x00,0x5e,0xb9,0x00,0x02,0x01,0x82,0xb2,0x3b,0x28,0x47,0xb8,0x01,0x83,0xb3,0x0c,0x4a,0x35,0x1b,0xbb,0x01,0x82,0x00,0x07,0x00,0x16,0x01,0x82,0x40,0x1a,0x3d,0x3b, -0x0c,0x07,0x3d,0x3d,0x07,0x0c,0x3b,0x04,0x00,0x20,0x8a,0x30,0x00,0x25,0x4a,0x1b,0x07,0x35,0x01,0x02,0x3b,0x07,0x00,0x42,0xb8,0x01,0x7d,0xb2,0x11,0x3a,0x00,0x00,0x2f,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0xcd,0x32,0x10,0xfd,0xc4,0x10,0xed,0x31,0x30, -0x33,0x13,0x13,0x36,0x37,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x26,0x36,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x06,0x06,0x07,0x06,0x07,0x03,0x07,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x3e,0x03, -0x2b,0xe7,0x44,0x10,0x11,0x0f,0x25,0x14,0x23,0x43,0x34,0x20,0x1d,0x35,0x4c,0x30,0x2b,0x40,0x2b,0x15,0x0f,0x1a,0x22,0x14,0x2a,0x59,0x49,0x2d,0x38,0x64,0x88,0x4f,0x0a,0x0a,0x01,0x08,0x0b,0x21,0x49,0x3d,0x28,0x15,0x25,0x30,0x1b,0x20,0x40,0x1a,0x1d,0x1c,0x5a,0x59,0x01,0xa2,0x0d,0x17,0x1e,0x13,0x0f,0x1e,0x17,0x0d,0x3b,0x2d, -0x0d,0x16,0x11,0x0a,0x01,0xf0,0xfe,0xfe,0x32,0x3a,0x32,0x82,0x4a,0x44,0x80,0x7e,0x7d,0x41,0x39,0x5d,0x42,0x24,0x1f,0x3a,0x53,0x32,0x1f,0x5f,0x79,0x8a,0x4b,0x4c,0x9d,0xaa,0xbb,0x69,0x48,0x88,0x69,0x40,0x0b,0x08,0x06,0x0e,0x03,0x08,0x36,0x51,0x6d,0x40,0x4e,0x90,0x85,0x7b,0x3a,0x72,0xd1,0x52,0x60,0x55,0x01,0x31,0xdf,0x04, -0x6c,0x2b,0x3b,0x24,0x10,0x12,0x25,0x3b,0x2a,0x5e,0xad,0x57,0x36,0x66,0x5d,0x4e,0x00,0x04,0x00,0x22,0x00,0x00,0x04,0x20,0x05,0x13,0x00,0x1f,0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x7f,0xb3,0x30,0x2b,0x2d,0x0c,0xb8,0x01,0x85,0xb6,0x20,0x00,0x1c,0x2d,0x2f,0x24,0x19,0xb8,0x01,0x85,0x40,0x09,0x1e,0x02,0x1a,0x18,0x9a,0x2d,0x2c, -0x12,0x1c,0xb8,0x01,0x7e,0xb6,0x1d,0x24,0x0f,0x1d,0x23,0x0a,0x00,0xb8,0x01,0x7e,0x40,0x21,0x01,0x2f,0x07,0x01,0x50,0x2d,0x01,0x50,0x1d,0x01,0x1d,0x40,0x09,0x0d,0x48,0x20,0x01,0x01,0x2d,0x1d,0x01,0x01,0x1d,0x2d,0x03,0x03,0x1a,0x2e,0x9a,0x7f,0x03,0x01,0x03,0x00,0x2f,0x71,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x2b, -0x5d,0x5d,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x10,0xed,0x01,0x2f,0x33,0x33,0xed,0x32,0x32,0x32,0xc6,0x32,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x35,0x33,0x35,0x21,0x32,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x23,0x0e,0x03,0x23,0x23,0x11,0x23,0x11,0x23,0x35,0x33, -0x35,0x05,0x34,0x27,0x21,0x15,0x21,0x36,0x36,0x01,0x32,0x36,0x37,0x21,0x15,0x11,0x15,0x21,0x26,0x26,0x23,0x22,0x88,0x01,0x59,0x91,0xc7,0x2a,0x9b,0x82,0x03,0x03,0x02,0x84,0xa5,0x19,0x50,0x69,0x7f,0x49,0x9e,0x99,0x88,0x88,0x02,0x57,0x03,0xfe,0x45,0x01,0xba,0x01,0x03,0xfe,0xd8,0x5d,0x7b,0x22,0xfe,0x70,0x01,0x94,0x20,0x73, -0x5b,0x03,0x9d,0x80,0xf6,0x7e,0x78,0x80,0x18,0x1a,0x13,0x24,0x12,0x7f,0x3c,0x5f,0x42,0x23,0xfe,0x5d,0x02,0xa3,0x7f,0x7b,0x39,0x1e,0x1b,0x7b,0x0f,0x21,0xfe,0xda,0x3f,0x38,0x77,0x02,0x5d,0x6c,0x33,0x39,0x00,0x03,0x00,0x4c,0xff,0x43,0x03,0x93,0x05,0xb8,0x00,0x1c,0x00,0x27,0x00,0x2e,0x00,0x65,0x40,0x1a,0x1c,0x2e,0x2d,0x17, -0x16,0x0f,0x06,0x0e,0x00,0x00,0x02,0x22,0x23,0x0c,0x04,0x0d,0x01,0x0d,0x13,0x0e,0x01,0x0e,0x01,0x0e,0x07,0x19,0xbe,0x01,0x84,0x00,0x2b,0x00,0x1d,0x01,0x84,0x00,0x07,0x00,0x2d,0x01,0x7e,0xb4,0x17,0x17,0x0f,0x22,0x28,0xb8,0x01,0x7e,0xb4,0x02,0x1b,0x18,0x23,0x16,0xb8,0x01,0x7e,0xb1,0x0c,0x0f,0x00,0x2f,0x33,0xed,0x32,0x3f, -0x33,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x39,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x05,0x23,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x26,0x27,0x03,0x21,0x11,0x06,0x23,0x23,0x01,0x14,0x1e,0x02,0x17,0x13,0x0e, -0x03,0x01,0x32,0x36,0x37,0x11,0x23,0x03,0x02,0x04,0x63,0x11,0x5b,0x87,0x58,0x2c,0x3d,0x76,0xaf,0x73,0x10,0x63,0x10,0x4a,0x80,0x34,0x37,0x87,0x4b,0x29,0x01,0x43,0xa8,0xcb,0x0b,0xfe,0xcf,0x19,0x33,0x53,0x3b,0x59,0x4e,0x73,0x4d,0x25,0x01,0x46,0x3c,0x72,0x2c,0xc0,0x24,0xbd,0xcc,0x13,0x64,0x9e,0xd3,0x81,0x96,0xee,0xaa,0x5f, -0x07,0xac,0xac,0x05,0x21,0x1d,0xa0,0x2b,0x30,0x06,0xfe,0x1c,0xfd,0xce,0x6f,0x02,0x7e,0x65,0xa6,0x7d,0x53,0x13,0x03,0xf4,0x09,0x51,0x87,0xb6,0xfd,0x93,0x1e,0x1f,0x01,0x63,0xfe,0x60,0x00,0x03,0x00,0x0b,0x00,0x00,0x03,0xdd,0x05,0x13,0x00,0x17,0x00,0x1b,0x00,0x23,0x00,0x45,0xb6,0x1c,0x1d,0x1d,0x15,0x0a,0x06,0x0e,0xb8,0x01, -0x7e,0xb6,0x0f,0x18,0x03,0x0f,0x1b,0x02,0x12,0xb8,0x01,0x7e,0x40,0x0f,0x13,0x20,0x17,0x13,0x0f,0x13,0x0f,0x13,0x08,0x7f,0x15,0x01,0x15,0x0c,0x08,0x00,0x2f,0x33,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x23,0x17,0x33, -0x15,0x23,0x13,0x23,0x03,0x21,0x03,0x23,0x13,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x13,0x01,0x21,0x27,0x21,0x13,0x23,0x06,0x07,0x03,0x33,0x03,0x26,0x03,0xc8,0xba,0x34,0x86,0x5f,0x74,0xa8,0x6b,0xfe,0x52,0x68,0xa9,0x73,0x5d,0x85,0x33,0xb8,0xe0,0xa4,0x9d,0xa4,0xfe,0x5a,0x01,0x65,0x2f,0xfe,0xf8,0x84,0x02,0x08,0x0a, -0x4b,0xbe,0x4d,0x09,0x03,0x0e,0x80,0xa2,0x80,0xfe,0x94,0x01,0x6c,0xfe,0x94,0x01,0x6c,0x80,0xa2,0x80,0x02,0x05,0xfd,0xfb,0xfe,0xde,0xa2,0x01,0xde,0x37,0x1f,0xfe,0xf8,0x01,0x08,0x1b,0x00,0x01,0x00,0x5f,0xff,0xea,0x03,0x85,0x05,0x29,0x00,0x47,0x00,0x5c,0xb3,0x3c,0x21,0x16,0x44,0xbb,0x01,0x85,0x00,0x35,0x00,0x0e,0x01,0x85, -0xb2,0x21,0x09,0x26,0xb8,0x01,0x7d,0xb4,0x27,0x06,0x27,0x01,0x2f,0xb8,0x01,0x7d,0x40,0x1b,0x30,0x46,0x30,0x20,0x27,0x01,0x0f,0x27,0x1f,0x27,0x02,0x3f,0x30,0x4f,0x30,0x02,0x27,0x30,0x27,0x30,0x11,0x3a,0x9a,0x3f,0x11,0x9a,0x1c,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11, -0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x32,0x11,0x39,0x31,0x30,0x01,0x23,0x07,0x06,0x07,0x06,0x07,0x21,0x15,0x21,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x36,0x37,0x23,0x35,0x33,0x36,0x37,0x36,0x37,0x36,0x37,0x21,0x35,0x21,0x36,0x37,0x36,0x35, -0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x03,0x85,0x65,0x04,0x2b,0x3b,0x2f,0x35,0x01,0x33,0xfe,0x15,0x21,0x1a,0x29,0x2e,0x8a,0x8d,0x28,0x60,0x60,0x56,0x1f,0x1a,0x54,0x5e,0x5b,0x1f,0x5c,0xa7,0x80,0x4b,0x1b,0x11,0x17,0x4c,0xb4,0x14,0x15,0x3f,0x45,0x2a,0x24,0xfe,0x51,0x02,0x44,0x17, -0x0d,0x13,0x31,0x4e,0x63,0x32,0xb4,0x73,0x57,0xc1,0x54,0xa2,0x7f,0x4e,0x18,0x23,0x02,0xf3,0x04,0x2b,0x23,0x1c,0x1c,0x61,0x14,0x15,0x1f,0x4e,0x35,0x62,0x68,0x10,0x1e,0x2c,0x1b,0xb3,0x12,0x1c,0x13,0x0a,0x25,0x54,0x85,0x60,0x48,0x39,0x21,0x1e,0x61,0x0e,0x0c,0x26,0x23,0x15,0x12,0x61,0x16,0x1b,0x25,0x32,0x35,0x4a,0x2f,0x15, -0x4f,0xab,0x2e,0x2a,0x55,0x83,0x59,0x46,0x34,0x00,0x00,0x02,0x00,0x4e,0xff,0x43,0x03,0x88,0x05,0xb8,0x00,0x18,0x00,0x21,0x00,0x38,0xb2,0x16,0x10,0x03,0xb8,0x01,0x82,0xb5,0x1f,0x0d,0x04,0x04,0x00,0x1b,0xb8,0x01,0x84,0x40,0x0d,0x09,0x13,0x00,0x20,0x15,0x9a,0x0d,0x10,0x1f,0x16,0x9a,0x05,0x02,0x00,0x2f,0x33,0xed,0x32,0x2f, -0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x27,0x26,0x11,0x10,0x37,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x01,0x06,0x15,0x14,0x17,0x16,0x17,0x11,0x06,0x03,0x88,0x68,0x97,0x5f,0xd0,0x80,0x8c,0x9e,0x81,0xbd,0x5f, -0x9c,0x63,0x71,0x8e,0x94,0x6b,0xfd,0xd1,0x73,0x6c,0x56,0x82,0x7d,0x36,0x41,0x09,0xa9,0xa9,0x0f,0xa2,0xb2,0x01,0x22,0x01,0x38,0xc0,0x9d,0x1c,0x96,0x8f,0x01,0x35,0xa2,0x4d,0x01,0xfb,0xd4,0x06,0x51,0x03,0x40,0x96,0xfa,0xed,0x8e,0x70,0x17,0x04,0x1c,0x1c,0x00,0x05,0x00,0xaa,0xff,0x43,0x03,0x8c,0x05,0xb8,0x00,0x17,0x00,0x1e, -0x00,0x22,0x00,0x26,0x00,0x2d,0x00,0x76,0xb6,0x0c,0x10,0x1d,0x1d,0x2c,0x05,0x15,0xb8,0x01,0x82,0xb4,0x16,0x25,0x02,0x16,0x09,0xb8,0x01,0x85,0x40,0x0a,0x29,0x16,0x21,0x29,0x29,0x21,0x16,0x03,0x00,0x10,0xb8,0x01,0x85,0xb2,0x1a,0x24,0x20,0xb8,0x01,0x85,0x40,0x1c,0xa0,0x00,0xb0,0x00,0x02,0x00,0x0d,0x1c,0x1f,0x9a,0x2c,0x24, -0x24,0x01,0x1d,0x20,0x9a,0x17,0x14,0x04,0x2b,0x23,0x9a,0x05,0x7f,0x01,0x01,0x01,0x00,0x2f,0x71,0x33,0xed,0x32,0x2f,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x39,0x01,0x2f,0x5d,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x11,0x12,0x39,0x31,0x30,0x33,0x11, -0x21,0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x23,0x35,0x37,0x36,0x35,0x34,0x27,0x11,0x36,0x01,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x13,0x36,0x35,0x34,0x27,0x11,0x36,0xaa,0x01,0x1d,0x5e,0x85,0x53,0x5c,0x78,0x69,0x7d,0x97,0x6f,0x63,0x95,0x5e,0xe5,0x40,0xc7,0x53,0xfe, -0xcb,0x84,0x84,0x84,0xb3,0x40,0x95,0x32,0x05,0x13,0xa5,0xa6,0x08,0x49,0x53,0x84,0x6e,0xa4,0x22,0x04,0x0f,0xa8,0x86,0xa6,0x68,0x5e,0x08,0xbe,0xbd,0xc9,0x40,0x6e,0xc4,0x1d,0xfe,0x34,0x0a,0x01,0xc7,0xfe,0x2d,0x01,0xd3,0x02,0x2c,0xfe,0x5d,0x01,0xa3,0xfe,0x99,0x3d,0x6d,0x9b,0x1c,0xfe,0x6f,0x0e,0x00,0x05,0x00,0x8c,0xfe,0x2f, -0x0a,0x0a,0x05,0x5d,0x00,0x1d,0x00,0x37,0x00,0x52,0x00,0x56,0x00,0x5a,0x00,0x95,0xbc,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x33,0x05,0x0a,0x40,0x09,0x30,0x30,0x53,0x89,0x54,0x57,0x89,0x58,0x24,0xb8,0x05,0x0a,0x40,0x0e,0x21,0x0d,0x54,0x58,0x21,0x52,0x52,0x21,0x58,0x54,0x0d,0x05,0x1a,0x4a,0xb8,0x05,0x0a,0xb2,0x3f,0x00,0x03, -0xb8,0x05,0x0a,0x40,0x0a,0x1a,0x1d,0x44,0x22,0x22,0x44,0x1d,0x03,0x0f,0x3a,0xb8,0x04,0xfb,0xb4,0x2f,0x4f,0x01,0x4f,0x1e,0xb8,0x04,0xfb,0xb6,0x2f,0x29,0x01,0x29,0x59,0x55,0x08,0xb8,0x04,0xfb,0x40,0x0b,0x58,0x54,0x2f,0x15,0x01,0x15,0x31,0x2f,0x0f,0x01,0x0f,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2f,0x5d, -0xed,0x2f,0x5d,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x01,0x2f,0xfd,0xc6,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05, -0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2f,0x0a,0x0a,0x20,0x47,0x71,0x51,0x5d,0x85,0x55,0x27,0x8d,0x33, -0x75,0xc0,0x8e,0x7a,0xa5,0x63,0x2b,0x0c,0x0d,0x05,0xf7,0x55,0x52,0x8d,0x31,0x56,0x73,0x40,0x3e,0x5b,0x41,0x29,0x18,0x09,0x8e,0x08,0x20,0x3e,0x01,0x45,0x71,0x50,0x4d,0x69,0x3f,0x1b,0x11,0x1c,0x25,0x14,0x92,0x17,0x24,0x1a,0x0d,0x3d,0x6e,0x97,0x59,0x2e,0x62,0x34,0xfe,0x72,0xa8,0xa8,0x01,0x23,0xa7,0xa7,0x01,0x7e,0x41,0x6e, -0x32,0x56,0x78,0x49,0x21,0x2c,0x64,0xa2,0x75,0x04,0x51,0xfb,0x9d,0x82,0xce,0x90,0x4e,0x3e,0x74,0xa5,0x68,0x39,0x76,0x44,0xfb,0x5f,0x65,0x01,0x7e,0xfe,0x7c,0x61,0x83,0x4f,0x22,0x1e,0x34,0x44,0x4f,0x55,0x2a,0x04,0x0d,0xfc,0x29,0x3a,0x60,0x43,0x26,0xfe,0x6a,0x23,0x37,0x62,0x85,0x4d,0x44,0x81,0x7b,0x77,0x39,0x3b,0x81,0x81, -0x7e,0x38,0x7d,0xc0,0x83,0x43,0x14,0x15,0x6e,0xa4,0xa4,0xa4,0x00,0x03,0x00,0x6e,0xff,0xee,0x06,0x34,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x2e,0x00,0x82,0xb9,0x00,0x1b,0x01,0x82,0x40,0x09,0x27,0x18,0x1f,0x03,0x0f,0x25,0x25,0x0f,0x2a,0xb8,0x01,0x83,0x40,0x0b,0x14,0x0a,0x0f,0x0c,0x0c,0x0f,0x0a,0x03,0x03,0x14,0x08,0xb8,0x01, -0x82,0xb7,0x03,0x04,0x99,0x07,0x07,0x0d,0x08,0x02,0xb8,0x01,0x7d,0xb2,0x01,0x27,0x17,0xb8,0x01,0x7d,0xb3,0x18,0x18,0x11,0x1d,0xb8,0x01,0x7d,0x40,0x0b,0x22,0x01,0x22,0x01,0x22,0x0c,0x7f,0x0d,0x01,0x0d,0x11,0xb8,0x01,0x7d,0xb3,0x2d,0x2d,0x0c,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x12, -0x39,0x2f,0xed,0x39,0x10,0xed,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07, -0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x3d,0xfe,0x38,0xa7,0xae,0x01,0x24,0xab,0x02,0xef,0xfc,0xf6,0x82,0x03,0x0a,0x51,0x5d,0x67,0x49,0x53,0xc6,0x4d,0x49,0xb2,0x82,0x55,0x54,0x4f,0x72,0x67,0x79,0x83,0xa0,0x9a,0x80,0x7d,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c, -0xfa,0xed,0x05,0x13,0xfb,0x0b,0x81,0x45,0x44,0x3a,0x7f,0x6b,0x7a,0x6b,0x3e,0x7e,0x2e,0x6c,0x57,0x88,0x31,0x04,0x26,0x91,0x6a,0x86,0x00,0x03,0x00,0x80,0xff,0xee,0x06,0x32,0x05,0x25,0x00,0x16,0x00,0x1a,0x00,0x3b,0x00,0x9c,0xb9,0x00,0x28,0x01,0x82,0x40,0x09,0x2c,0x24,0x35,0x03,0x1b,0x32,0x32,0x1b,0x37,0xbb,0x01,0x83,0x00, -0x21,0x00,0x11,0x01,0x83,0x40,0x13,0x06,0x0b,0x01,0x19,0x00,0x06,0x1b,0x19,0x06,0x1b,0x17,0x17,0x1b,0x06,0x19,0x04,0x01,0x21,0x15,0xbb,0x01,0x84,0x00,0x01,0x00,0x09,0x01,0x7d,0xb4,0x0e,0x0e,0x1a,0x34,0x24,0xb8,0x01,0x7d,0xb3,0x25,0x25,0x1e,0x2a,0xb8,0x01,0x7d,0xb2,0x2f,0x02,0x15,0xb8,0x01,0x7d,0x40,0x0b,0x01,0x2f,0x01, -0x2f,0x01,0x19,0x7f,0x1a,0x01,0x1a,0x1e,0xb8,0x01,0x7d,0xb3,0x3a,0x3a,0x19,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0xed,0x39,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11, -0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x15,0x21,0x01,0x01,0x23,0x01,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15, -0x14,0x06,0x23,0x22,0x02,0x76,0xfe,0x0a,0xd9,0x5e,0x33,0x45,0x38,0x6b,0x59,0x4d,0x88,0x6b,0x7d,0xb9,0x95,0x01,0x5e,0x02,0xb4,0xfc,0xf7,0x83,0x03,0x0a,0x51,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4e,0x73,0x66,0x79,0x83,0xa0,0x9a,0x80,0x7c,0x02,0x11,0x67,0xd6,0x5d,0x62,0x32,0x35,0x42,0x5d,0x87,0x45,0x77, -0x62,0x8b,0xb0,0x8e,0x03,0x02,0x93,0xfa,0xed,0x05,0x13,0xfb,0x0b,0x81,0x45,0x44,0x3a,0x7f,0x6b,0x7a,0x6b,0x3e,0x7e,0x2e,0x6c,0x57,0x88,0x31,0x04,0x26,0x91,0x6a,0x86,0x00,0x00,0x02,0x00,0xb2,0x04,0x37,0x02,0xbc,0x06,0x1f,0x00,0x03,0x00,0x07,0x00,0x1f,0xbc,0x00,0x05,0x01,0x85,0x00,0x06,0x00,0x01,0x01,0x85,0xb5,0x02,0x06, -0x02,0x02,0x07,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x51,0x9f,0x02,0x0a,0x9f,0x06,0x1f,0xfe,0x18,0x01,0xe8,0xfe,0x18,0x01,0xe8,0x00,0x00,0x01,0x00,0xb2,0x04,0x37,0x01,0x51,0x06,0x1f,0x00,0x03,0x00,0x13,0xb9,0x00,0x01,0x01,0x85,0xb3,0x02,0x02, -0x02,0x00,0x00,0x2f,0x32,0x2f,0x01,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x01,0x51,0x9f,0x06,0x1f,0xfe,0x18,0x01,0xe8,0x00,0x01,0x00,0x53,0x03,0x1d,0x03,0x55,0x06,0x1f,0x00,0x0e,0x00,0x0f,0xb4,0x0c,0x0b,0x03,0x03,0x0c,0x00,0x2f,0x33,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x01,0x05,0x13,0x07,0x03,0x03,0x27,0x13,0x25,0x37,0x05, -0x03,0x33,0x03,0x25,0x03,0x55,0xfe,0xd4,0xd0,0x79,0xaa,0xad,0x78,0xd0,0xfe,0xd2,0x31,0x01,0x1f,0x1a,0x97,0x19,0x01,0x20,0x04,0xb7,0x3e,0xfe,0xf7,0x53,0x01,0x21,0xfe,0xdf,0x53,0x01,0x09,0x3e,0x88,0x6c,0x01,0x4c,0xfe,0xb4,0x6c,0x00,0x00,0x01,0x00,0x2b,0xfe,0xdf,0x01,0x59,0x00,0xf9,0x00,0x03,0x00,0x0f,0xb4,0x02,0x00,0x02, -0x02,0x00,0x00,0x2f,0x32,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x25,0x03,0x23,0x13,0x01,0x59,0xae,0x80,0x80,0xf9,0xfd,0xe6,0x02,0x1a,0x00,0x00,0x01,0x00,0xa6,0x02,0x49,0x03,0x1e,0x02,0xde,0x00,0x03,0x00,0x0e,0xb4,0x01,0x00,0x01,0x99,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1e,0xfd,0x88,0x02,0x78, -0x02,0x49,0x95,0x00,0x00,0x01,0x00,0x7a,0xff,0xe8,0x01,0x6f,0x00,0xde,0x00,0x0b,0x00,0x0d,0xb3,0x09,0x03,0x06,0x00,0x00,0x2f,0x32,0x01,0x2f,0xcd,0x31,0x30,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xf4,0x33,0x47,0x47,0x33,0x33,0x48,0x48,0x18,0x48,0x32,0x33,0x49,0x49,0x33,0x32,0x48,0x00,0x02,0x00,0x7a, -0xff,0xe8,0x01,0x6f,0x04,0x77,0x00,0x0b,0x00,0x17,0x00,0x15,0xb7,0x15,0x09,0x0f,0x03,0x12,0x0c,0x00,0x06,0x00,0x2f,0x33,0x2f,0x33,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xf4,0x33,0x47,0x47,0x33,0x33,0x48, -0x48,0x33,0x33,0x47,0x47,0x33,0x33,0x48,0x48,0x03,0x85,0x48,0x32,0x32,0x46,0x46,0x32,0x32,0x48,0xfc,0x63,0x48,0x32,0x33,0x49,0x49,0x33,0x32,0x48,0x00,0x00,0x02,0x00,0x2b,0xfe,0xdf,0x01,0x71,0x04,0x77,0x00,0x0b,0x00,0x0f,0x00,0x1a,0x40,0x0a,0x0c,0x0c,0x0e,0x09,0x03,0x0e,0x0e,0x0f,0x00,0x06,0x00,0x2f,0x33,0x2f,0x33,0x2f, -0x01,0x2f,0xcd,0x2f,0x39,0x2f,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x03,0x23,0x13,0xf7,0x33,0x47,0x47,0x33,0x32,0x48,0x48,0x30,0xae,0x80,0x80,0x03,0x85,0x48,0x32,0x32,0x46,0x46,0x32,0x32,0x48,0xfd,0x74,0xfd,0xe6,0x02,0x1a,0x00,0x01,0x00,0x00,0xfe,0xa9,0x03,0xd7,0xff,0x32,0x00,0x03, -0x00,0x0e,0xb4,0x01,0x00,0x01,0x9a,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0xd7,0xfc,0x29,0x03,0xd7,0xfe,0xa9,0x89,0x00,0x00,0x02,0x00,0x6a,0x00,0xe7,0x04,0x48,0x03,0xf9,0x00,0x05,0x00,0x0b,0x00,0x09,0xb1,0x05,0x0b,0x00,0x19,0x2f,0x33,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x03,0x23,0x01, -0x01,0x33,0x01,0x04,0x46,0xc3,0xfe,0xa7,0x01,0x59,0xc5,0xfe,0x9d,0x61,0xc0,0xfe,0xa6,0x01,0x5a,0xc0,0xfe,0xa2,0xe7,0x01,0x85,0x01,0x8d,0xfe,0x73,0xfe,0x7b,0x01,0x85,0x01,0x8d,0xfe,0x73,0x00,0x00,0x02,0x00,0x68,0x00,0xe7,0x04,0x48,0x03,0xf9,0x00,0x05,0x00,0x0b,0x00,0x09,0xb1,0x03,0x09,0x00,0x19,0x2f,0x33,0x31,0x30,0x01, -0x01,0x23,0x01,0x01,0x33,0x03,0x01,0x23,0x01,0x01,0x33,0x04,0x48,0xfe,0xa4,0xbf,0x01,0x5d,0xfe,0xa3,0xbf,0x66,0xfe,0xa7,0xc5,0x01,0x64,0xfe,0x9c,0xc5,0x02,0x6e,0xfe,0x79,0x01,0x87,0x01,0x8b,0xfe,0x75,0xfe,0x79,0x01,0x87,0x01,0x8b,0x00,0x01,0x00,0x00,0x02,0x29,0x04,0x5f,0x02,0xb6,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x01, -0xb9,0x01,0x7f,0x00,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x04,0x5f,0xfb,0xa1,0x04,0x5f,0x02,0x29,0x8d,0x00,0x02,0x00,0x6f,0x03,0xd0,0x02,0x9c,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x32,0x40,0x18,0x21,0x0c,0x29,0x14,0x04,0x18,0x1e,0x24,0x03,0x09,0x0f,0x15,0x15,0x1e,0xaf,0x24,0x24,0x2b,0x11,0x00, -0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x05,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35, -0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x01,0x6b,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11, -0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0x03,0xd0,0x02,0x95,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x2c,0x40,0x15,0x14,0x29,0x0c,0x21,0x04,0x03,0x0f,0x09,0x18,0x24,0x1e,0x00,0x0f,0xaf,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0xc6,0x11,0x12,0x39,0x11,0x12, -0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27, -0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x6f,0x03,0xd0,0x01,0x61, -0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x0c,0x14,0x04,0x03,0x09,0x0f,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20, -0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x15,0x40,0x09,0x14,0x0c,0x04,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x13,0x36,0x36,0x35,0x34, -0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x74,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x62,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x16,0x00,0x17, -0x40,0x0a,0x16,0x0e,0xb2,0x17,0x05,0x11,0x00,0x11,0xaf,0x0b,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31,0x30,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x62,0x1b,0x31,0x24,0x15,0x19,0x1d,0x28,0x1a,0x2f,0x30,0x3b,0x45,0x20,0x35,0x46,0x27,0xde,0x16,0x31,0x31, -0x2f,0x15,0x19,0x13,0x0d,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0xfe,0xed,0x02,0x95,0x00,0xcf,0x00,0x14,0x00,0x29,0x00,0x2a,0x40,0x14,0x14,0x0c,0x29,0x21,0xb2,0x2a,0x18,0x24,0x1e,0x03,0x0f,0xaf,0x09,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x2f,0xe1, -0x39,0x11,0x12,0x39,0x00,0x10,0xf4,0xc4,0x33,0x32,0x31,0x30,0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44, -0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x74,0x03,0xd0, -0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x00,0x08,0x04,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x36,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28, -0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a,0x5f,0x2d,0x00,0x02,0x00,0x90,0x03,0xd0,0x02,0xbd,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x2d,0x40,0x15,0x26,0x1a,0x20,0x29,0x29,0x20,0xaf,0x1a,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x15,0x00,0x1d,0x08,0x04,0x00, -0x3f,0x33,0xc4,0x32,0x01,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x05,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x52,0x27,0x46,0x35, -0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x01,0x0b,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a,0x5f,0x2d,0x3b,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a, -0x5f,0x2d,0x00,0x03,0x00,0x8d,0xff,0xe7,0x06,0x57,0x05,0xb1,0x00,0x15,0x00,0x31,0x00,0x4d,0x00,0x40,0x40,0x1d,0x10,0x0b,0x00,0x05,0x00,0x05,0x00,0x40,0x32,0x16,0x24,0x40,0x0b,0x0b,0x0d,0x15,0x02,0x13,0x0d,0x08,0x13,0x08,0x13,0x08,0x1d,0x39,0x2b,0x47,0x1d,0x00,0x2f,0xc9,0x2f,0xc9,0x11,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10, -0xc9,0xc6,0x10,0xc2,0x2f,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xc9,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x25,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x04,0x37,0x14,0x1e,0x04,0x33,0x32, -0x3e,0x04,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x04,0x80,0x69,0x8f,0xc0,0xfe,0xfc,0x01,0x0a,0xd5,0x79,0x60,0x56,0x8f,0x8d,0xb7,0xbb,0x90,0x84,0x5e,0xfc,0x0d,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x7f,0x2c,0x50,0x70,0x88,0x9d,0x55,0x54, -0x9d,0x88,0x70,0x50,0x2c,0x2c,0x50,0x70,0x88,0x9d,0x54,0x55,0x9d,0x88,0x70,0x50,0x2c,0x01,0x49,0x45,0xfa,0xbc,0xda,0x01,0x04,0x35,0x96,0x48,0xb4,0x98,0x94,0xb2,0x4e,0xfb,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x5f,0x55,0x9c,0x88,0x70,0x50,0x2c, -0x2c,0x50,0x70,0x88,0x9c,0x55,0x55,0x9d,0x88,0x70,0x50,0x2c,0x2c,0x50,0x70,0x88,0x9d,0x00,0xff,0xff,0x00,0x70,0x00,0xb2,0x01,0x50,0x04,0xde,0x02,0x07,0x00,0x1d,0x00,0x00,0x00,0xc8,0x00,0x17,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b, -0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x5b,0x00,0x6b,0x00,0x73,0x00,0x7c,0x00,0xb2,0x00,0xbc,0x00,0xc3,0x01,0x65,0x40,0xc6,0x3b,0x1b,0x38,0x18,0x37,0x2f,0x14,0x34,0x2c,0x23,0x1f,0x20,0x1c,0x0c,0x64,0x65,0x79,0x97,0x97,0xab,0x7d,0x8e,0x03,0x11,0x4d,0x50,0x51,0xa1,0x8e,0xab,0x86,0x48, -0x57,0x59,0x57,0xbe,0xb4,0xb5,0x6d,0x75,0x5c,0xb9,0xc1,0x61,0x71,0x68,0x79,0x06,0x12,0x11,0x51,0x8e,0x86,0x57,0xb5,0x5c,0xc1,0x71,0x79,0x12,0x12,0x79,0x71,0xc1,0x5c,0xb5,0x57,0x86,0x8e,0x51,0x11,0x0b,0x14,0x30,0x3c,0x40,0x05,0x04,0x0f,0x00,0x31,0x3d,0x41,0x04,0x0c,0x09,0x24,0x28,0x44,0x04,0x17,0x25,0x29,0x45,0x0a,0x04, -0x14,0x2a,0x42,0x29,0x41,0x46,0x3e,0x01,0x45,0x3d,0x3d,0x0f,0x26,0x32,0x32,0x0f,0x25,0x31,0x31,0x0f,0x97,0x97,0x9c,0x7e,0x81,0x5a,0x52,0x51,0x51,0x49,0x15,0x0d,0xb0,0x81,0xb3,0xbe,0xbd,0xb6,0x9c,0x93,0x5c,0x75,0x49,0x57,0x74,0x6d,0x6c,0x5d,0x4d,0x52,0x0a,0x00,0x0d,0xb5,0x81,0xbe,0xb6,0x93,0x75,0x57,0x6d,0x5d,0x52,0x00, -0x00,0x52,0x5d,0x6d,0x57,0x75,0x93,0xb6,0xbe,0x81,0xb5,0x0d,0x0c,0x01,0x19,0x1d,0x2d,0x13,0x04,0x0f,0x12,0x18,0x1c,0x2c,0x04,0x0c,0x20,0x34,0x38,0x06,0x04,0x04,0x07,0x21,0x35,0x39,0x04,0x01,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f, -0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0x10,0xc0,0x2f,0x10,0xc4,0x10,0xc6,0x10,0xc2,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9, -0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x11,0x33,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc5,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4, -0x32,0x31,0x30,0x13,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01, -0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23, -0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x23,0x11,0x33,0x32,0x15,0x14,0x06,0x23,0x27,0x15,0x33,0x32,0x35,0x34,0x23,0xbc,0xeb,0x96, -0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfd,0x02,0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b, -0x98,0x9d,0x48,0x4d,0x2f,0x25,0x2e,0x37,0x55,0x49,0x44,0x2a,0x1e,0x23,0x47,0x24,0x34,0x22,0x26,0x25,0x22,0xfd,0x7c,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22, -0x24,0x40,0x02,0x1f,0x61,0x98,0xa2,0x5d,0x4e,0x2e,0x26,0x4d,0x4d,0x04,0xd4,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff, -0xd1,0x2c,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfe,0x52,0x01,0xae,0x35,0x30,0x23,0x34,0x0a,0x01,0x06,0x38,0x29,0x3b,0x45,0x01,0x67,0x66,0x1d,0x19,0x30,0xae,0x72,0x1f,0x1b,0x1a,0x1e,0xfd,0x3a,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30, -0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x8f,0x94,0x01,0xae,0x89,0x41,0x50,0xd0,0x86,0x43,0x43,0x00,0x00,0x15,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23, -0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x7d,0x00,0x87,0x00,0x8e,0x00,0x98,0x00,0xb4,0x01,0x57,0x40,0xbf,0x3b,0x1b,0x38,0x18,0x14,0x23,0x1f,0x20,0x1c,0x0c,0xa8,0x2f,0x2f,0x37,0x62,0x62,0x76,0x34,0x2c,0xa4,0x8f,0x8f,0x96,0x48,0x59,0x93,0x03,0x11,0x97,0x90,0x6c,0x59, -0x96,0x92,0x76,0x51,0x37,0xa4,0x89,0x7f,0x80,0x84,0x8c,0x06,0x12,0x11,0x90,0x59,0x92,0x51,0xa4,0x80,0x8c,0x12,0x99,0x99,0x12,0x8c,0x80,0xa4,0x51,0x92,0x59,0x90,0x11,0x0a,0x14,0x30,0x3c,0x40,0x05,0x04,0x0f,0x00,0x31,0x3d,0x41,0x04,0x0c,0x09,0x24,0x28,0x44,0x04,0x17,0x25,0x29,0x45,0x0a,0x04,0x14,0x2a,0x42,0x29,0x41,0x46, -0x3e,0x01,0x45,0x3d,0x3d,0x0f,0x26,0x32,0x32,0x0f,0x25,0x31,0x31,0x0f,0x62,0x62,0x67,0x49,0x4c,0xb4,0xa4,0xac,0x15,0x0d,0x7b,0x4c,0x7e,0x89,0x88,0x81,0x67,0x5e,0xa3,0x9b,0x90,0x97,0xb1,0xb0,0xa9,0xa8,0x04,0x97,0x9e,0x9f,0xac,0x93,0x94,0x0a,0x00,0x0d,0x80,0x4c,0x89,0x81,0x5e,0x97,0xac,0x94,0x00,0x00,0x94,0xac,0x97,0x5e, -0x81,0x89,0x4c,0x80,0x0d,0x0a,0x01,0x19,0x1d,0x2d,0x13,0x04,0x0f,0x12,0x18,0x1c,0x2c,0x04,0x0c,0x20,0x34,0x38,0x06,0x04,0x04,0x07,0x21,0x35,0x39,0x04,0x01,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x32, -0x11,0x17,0x33,0x10,0xc9,0x32,0x32,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0x10,0xc4,0x32,0x10,0xc6,0x10,0xc2,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, -0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x32,0x10,0xca,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0xc4,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc4,0x32,0x10,0xc0,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0x31,0x30,0x13,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23, -0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x01,0x35,0x16, -0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x23,0x11,0x33,0x32,0x15,0x14,0x06,0x23,0x27,0x15,0x33,0x32,0x35,0x34,0x23,0x25,0x21,0x35,0x13,0x23,0x35, -0x21,0x15,0x03,0x33,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0xbc,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1, -0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfb,0xac,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40, -0x02,0x1f,0x61,0x98,0xa2,0x5d,0x4e,0x2e,0x26,0x4d,0x4d,0xfe,0x82,0xfe,0xa5,0xdd,0xcd,0x01,0x4a,0xd8,0xd9,0x02,0xb6,0x71,0x6c,0x47,0x06,0x01,0x01,0x03,0x05,0x49,0x70,0x71,0x6a,0x3c,0x04,0x02,0x02,0x01,0x07,0x4e,0x68,0x47,0x04,0x03,0x01,0x01,0x05,0x3b,0x04,0xd4,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56, -0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0xfd,0xc7,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c, -0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x8f,0x94,0x01,0xae,0x89,0x41,0x50,0xd0,0x86,0x43,0x43,0xba,0x38,0x01,0x27,0x4f,0x36,0xfe,0xd6,0x01,0x60,0xfe,0x52,0x01,0x14,0x15,0x1b,0x1d,0x13,0xfe,0xec,0x01,0xae,0xfe,0xe2,0x13,0x1f,0x17,0x1c,0x01,0x1d,0xfe,0xdf, -0x10,0x1e,0x18,0x18,0x01,0x1f,0x00,0x16,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x35,0x00,0x3b,0x00,0x41,0x00,0x47,0x00,0x4d,0x00,0x51,0x00,0x55,0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x91,0x00,0xa5,0x00,0xb5,0x00,0xbd,0x00,0xc6,0x01,0x62,0x40,0xc3, -0x71,0x51,0x6e,0x4e,0x6d,0x65,0x4a,0x6a,0x62,0x59,0x56,0x52,0x42,0x1a,0x1a,0x2e,0x00,0x11,0xae,0xaf,0xc3,0x39,0x47,0x83,0x86,0x87,0xb7,0xbf,0xa6,0xab,0xbb,0xb2,0xc3,0x7e,0x8d,0x8f,0x8d,0x97,0x9a,0x9b,0x24,0x11,0x2e,0x09,0x92,0xa1,0xa3,0xa1,0x3c,0x48,0x47,0x87,0xa6,0xbb,0xc3,0x8d,0x9b,0x11,0x09,0xa1,0x48,0x48,0xa1,0x09, -0x11,0x9b,0x8d,0xc3,0xbb,0xa6,0x87,0x47,0x0b,0x4a,0x66,0x72,0x76,0x3b,0x04,0x45,0x36,0x67,0x73,0x77,0x04,0x42,0x3f,0x5a,0x5e,0x7a,0x04,0x4d,0x5b,0x5f,0x7b,0x40,0x04,0x4a,0x60,0x78,0x5f,0x77,0x7c,0x74,0x37,0x5b,0x67,0x67,0x45,0x01,0xbf,0xa4,0x90,0x88,0x9b,0x87,0x87,0x7f,0x1a,0x7b,0x73,0x73,0xb6,0x5c,0xae,0xaf,0x03,0x68, -0xb7,0x4b,0x43,0x33,0xa6,0xbf,0x04,0xbf,0xbe,0xb7,0x1f,0xb6,0xa7,0x16,0xa7,0x93,0x7f,0x8d,0xa1,0x8d,0x97,0x83,0x88,0x9c,0x88,0x40,0x36,0x43,0xbf,0xb7,0xa7,0x8d,0x88,0x36,0x36,0x88,0x8d,0xa7,0xb7,0xbf,0x43,0x07,0x37,0x4f,0x53,0x63,0x49,0x04,0x45,0x48,0x4e,0x52,0x62,0x04,0x42,0x56,0x6a,0x6e,0x3c,0x04,0x3a,0x3d,0x57,0x6b, -0x6f,0x04,0x37,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x10,0xc9,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc4,0x17,0x32,0x10,0xc0,0x2f,0x32,0x32,0x10,0xc0,0x2f, -0x32,0x10,0xc4,0x32,0x10,0xc4,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10, -0xc9,0x10,0xc9,0x32,0x10,0xc9,0x32,0x11,0x33,0x10,0xc5,0x32,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc4,0x32,0xc4,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4,0x32,0x31,0x30,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14, -0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33, -0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x01,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x01,0x11,0x33,0x32, -0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x04,0x10,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13, -0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0xfc,0x95,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfc,0xe4, -0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b,0x02,0x01,0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b,0xfc,0xc7,0x9d,0x48,0x4d,0x2f,0x25,0x2e,0x37,0x55,0x49,0x44,0x2a,0x1e,0x23,0x47,0x24,0x34,0x22,0x26,0x25,0x22,0x01,0x0e,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11, -0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x03,0xd2,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01, -0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x2c,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfe,0x52,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfc,0x34,0x01,0xae,0x35,0x30, -0x23,0x34,0x0a,0x01,0x06,0x38,0x29,0x3b,0x45,0x01,0x67,0x66,0x1d,0x19,0x30,0xae,0x72,0x1f,0x1b,0x1a,0x1e,0x00,0xff,0xff,0x00,0xab,0xff,0xf2,0x04,0x15,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x0e,0x6f,0x02,0x01,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x73,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x3c,0x01,0x3c,0x00,0x11, -0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xf2,0x04,0xad,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x09,0x3b,0x02,0x01,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x73,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x3c,0x01,0x3c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xa1,0xff,0xf2,0x06,0x16,0x05,0x3f,0x00,0x26,0x08,0xf3,0x00,0x00,0x00,0x27, -0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x57,0x01,0x57,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xa1,0xff,0xf2,0x06,0xae,0x05,0x3f,0x00,0x26,0x08,0xf3,0x00,0x00,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x60, -0x01,0x60,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x3f,0x00,0x26,0x0e,0x5e, -0x00,0x00,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x64,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x30,0x00,0xe4,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07, -0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0e,0xb6,0x05,0x02,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x64,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x30,0x00,0xe4,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0e, -0xb6,0x05,0x02,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0a,0x6d,0x00,0xe5,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0c,0xb5,0x04,0x02,0x2f,0x3e,0x01,0x3e,0x00, -0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0a,0x6d,0x00,0xe5,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0c,0xb5,0x04,0x02,0x2f,0x3e,0x01,0x3e,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff, -0x06,0x16,0x05,0x5a,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x73,0x00,0xe5,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x5d,0x01,0x5d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x5a,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27, -0x09,0x73,0x00,0xe5,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x5d,0x01,0x5d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc5,0x08,0xc2,0x05,0x3f,0x00,0x26,0x0f,0x61,0x00,0x00,0x00,0x27,0x0f,0x52,0x01,0xc8,0xfd,0xca,0x00,0x27,0x0e,0x6f,0x06,0xae, -0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x6c,0x01,0x6c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc5,0x09,0x5a,0x05,0x3f,0x00,0x26,0x0f,0x61,0x00,0x00,0x00,0x27,0x0f,0x52,0x01,0xc8,0xfd,0xca,0x00,0x27,0x09,0x3b,0x06,0xae,0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a, -0xb4,0x04,0x2f,0x6c,0x01,0x6c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0xca,0x04,0xc0,0x05,0x3f,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0x83,0xfd,0xcf,0x00,0x27,0x0e,0x6f,0x02,0xac,0x00,0x00,0x01,0x07,0x09,0x7e,0x03,0x1e,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x55,0x01,0x55,0x00,0x11,0x5d,0x35,0xff,0xff, -0x00,0x9a,0xff,0x02,0x08,0xc2,0x05,0x3f,0x00,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x0e,0x6f,0x06,0xae,0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x09,0x5a,0x05,0x3f,0x00,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x09,0x3b,0x06,0xae, -0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xc0,0x05,0x3f,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0e,0x6f,0x02,0xac,0x00,0x00,0x01,0x07,0x09,0x7e,0x03,0x1e,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x4d,0x01,0x4d,0x00,0x11, -0x5d,0x35,0x00,0x02,0xff,0x0e,0x04,0x88,0x00,0xf3,0x07,0x90,0x00,0x19,0x00,0x25,0x00,0x2b,0x40,0x0d,0x0d,0x0d,0x00,0x1a,0x14,0x14,0x20,0x06,0x1d,0x14,0x17,0x17,0x0c,0xbb,0x01,0x36,0x00,0x23,0x00,0x03,0x01,0x3a,0x00,0x3f,0xc9,0x3f,0x39,0x2f,0x39,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0xd9,0xc0,0x2f,0x31,0x30,0x13,0x14,0x06, -0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x37,0x15,0x06,0x07,0x07,0x0e,0x02,0x07,0x33,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0xf3,0x83,0x6c,0x74,0x82,0x2d,0x68,0x80,0x71,0x1e,0x0e,0x34,0x58,0x46,0x42,0x26,0x06,0x02,0x3c,0x6f,0x69,0x79,0x54,0x58,0x48,0x68,0x34,0x59,0x4a,0x45, -0x54,0x05,0x8c,0x77,0x8d,0xa3,0xa0,0x78,0xaa,0x67,0x15,0x13,0x14,0x4d,0x0e,0x09,0x0e,0x0c,0x2f,0x68,0x49,0x57,0x8c,0x7a,0x59,0x67,0x62,0x3f,0x5c,0x79,0x68,0x00,0x00,0x03,0xff,0x36,0x04,0x96,0x00,0xcb,0x06,0x96,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0x31,0x40,0x10,0x0b,0x09,0x0d,0x0d,0x04,0x00,0x14,0x11,0x18,0x04,0x17,0x11, -0x11,0x18,0x10,0x05,0xbb,0x01,0x38,0x00,0x18,0x00,0x04,0x01,0x3a,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0xc4,0x31,0x30,0x13,0x14,0x06,0x23,0x23,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x27,0x34,0x23,0x23,0x15,0x33,0x32,0x17,0x34,0x23,0x23,0x15,0x33,0x32,0xcb,0x61, -0x47,0xed,0xdf,0x4c,0x57,0x62,0x75,0x65,0x59,0x85,0x7b,0x63,0x13,0x6f,0x82,0x8e,0x63,0x05,0x29,0x40,0x53,0x02,0x00,0x42,0x3b,0x64,0x15,0x0f,0x7c,0x43,0x90,0x94,0x4e,0x9e,0x00,0x01,0xff,0x72,0x04,0x96,0x00,0x8f,0x06,0x96,0x00,0x05,0x00,0x17,0xb4,0x04,0x01,0x02,0x00,0x03,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f, -0xc9,0x01,0x2f,0xc9,0x2f,0x31,0x30,0x03,0x11,0x23,0x11,0x21,0x15,0x3c,0x52,0x01,0x1d,0x06,0x50,0xfe,0x46,0x02,0x00,0x46,0x00,0x02,0xfe,0xfc,0x03,0xdb,0x01,0x05,0x06,0x96,0x00,0x0c,0x00,0x11,0x00,0x2f,0x40,0x0b,0x0a,0x11,0x11,0x00,0x10,0x03,0x04,0x0c,0x00,0x0e,0x08,0xb8,0x01,0x38,0xb5,0x10,0x0a,0x05,0x04,0x00,0x02,0xb8, -0x01,0x3a,0x00,0x3f,0xce,0x32,0xc9,0x32,0x32,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0xc8,0x12,0x39,0x2f,0xc9,0x31,0x30,0x13,0x35,0x21,0x15,0x23,0x11,0x33,0x36,0x13,0x21,0x11,0x33,0x11,0x03,0x23,0x06,0x07,0x33,0xbf,0xfe,0x83,0x46,0x2e,0x81,0x04,0x01,0x0a,0x4c,0x9e,0x72,0x0d,0x67,0xe6,0x03,0xdb,0xbb,0xbb,0x01,0x01,0xba,0x01, -0x00,0xfe,0x46,0xfe,0xff,0x02,0x75,0xd5,0x9f,0x00,0x00,0x01,0xfe,0x84,0x04,0x96,0x01,0x7d,0x06,0x96,0x00,0x15,0x00,0x2f,0x40,0x12,0x10,0x03,0x04,0x0d,0x04,0x0a,0x09,0x04,0x13,0x13,0x04,0x09,0x0a,0x04,0x08,0x15,0x08,0x0b,0xba,0x01,0x38,0x00,0x00,0x01,0x3a,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, -0x11,0x33,0x10,0xc9,0x32,0x31,0x30,0x01,0x27,0x23,0x15,0x23,0x35,0x23,0x07,0x23,0x13,0x27,0x33,0x17,0x33,0x35,0x33,0x15,0x33,0x37,0x33,0x07,0x13,0x01,0x0e,0xe5,0x02,0x4e,0x02,0xe4,0x6f,0xfe,0xee,0x68,0xdb,0x02,0x4e,0x02,0xdb,0x6a,0xf0,0xff,0x04,0x96,0xfd,0xfd,0xfd,0xfd,0x01,0x08,0xf8,0xf0,0xf0,0xf0,0xf0,0xf8,0xfe,0xf8, -0x00,0x01,0xff,0x46,0x04,0x88,0x00,0xbb,0x06,0xa1,0x00,0x21,0x00,0x37,0x40,0x13,0x1e,0x1f,0x0d,0x1b,0x11,0x11,0x0a,0x16,0x05,0x0d,0x00,0x0a,0x1f,0x0d,0x0e,0x0e,0x08,0x14,0x19,0xbb,0x01,0x39,0x00,0x08,0x00,0x03,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x39,0x01,0x2f,0xc9,0x2f,0xc4,0x32,0x12,0x39,0x2f,0xc9, -0x10,0xc9,0x32,0x31,0x30,0x13,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0xbb,0x70,0x64,0x6b,0x36,0x3f,0x5d,0x88,0x95,0x32,0x30,0x82,0x37,0x39,0x4b,0x4a,0x57,0x45,0xbb,0x3a,0x30,0x38,0x46,0x05,0x21, -0x47,0x52,0x1b,0x51,0x26,0x56,0x55,0x46,0x51,0x1f,0x2c,0x25,0x4c,0x1f,0x89,0x2e,0x41,0x09,0x02,0x05,0x42,0x00,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x0c,0x00,0x29,0x40,0x0c,0x0a,0x0a,0x04,0x0c,0x07,0x03,0x0b,0x04,0x02,0x07,0x09,0x06,0xbb,0x01,0x38,0x00,0x04,0x00,0x00,0x01,0x3a,0x00,0x3f,0x32,0x3f,0x33, -0x39,0x39,0x01,0x2f,0xc8,0xc9,0x32,0x2f,0x12,0x39,0x2f,0x31,0x30,0x13,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x01,0x62,0xe2,0x02,0x52,0x52,0x02,0xd7,0x6c,0xee,0x01,0x00,0x04,0x96,0xf6,0xf6,0x02,0x00,0xeb,0xeb,0xf7,0xfe,0xf7,0x00,0x01,0xff,0x20,0x04,0x8f,0x00,0xe1,0x06,0x96,0x00,0x0e,0x00,0x1c,0xb4,0x07, -0x0e,0x00,0x02,0x0c,0xb8,0x01,0x38,0xb2,0x0a,0x05,0x00,0xb8,0x01,0x3a,0x00,0x3f,0xd4,0xc9,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0x31,0x30,0x13,0x11,0x23,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x8f,0x77,0x12,0x61,0x59,0x1a,0x12,0x0d,0x19,0x70,0x1e,0x01,0x0d,0x04,0x96,0x01,0xbb,0xe9,0xd9,0x07,0x47,0x09,0x01, -0xc2,0xfe,0x00,0x00,0x00,0x01,0xfe,0xec,0x04,0x96,0x01,0x15,0x06,0x96,0x00,0x10,0x00,0x17,0xb4,0x07,0x08,0x10,0x00,0x09,0xba,0x01,0x38,0x00,0x08,0x01,0x3a,0x00,0x3f,0x3f,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x11,0x07,0x03,0x23,0x03,0x27,0x11,0x23,0x11,0x33,0x13,0x17,0x37,0x13,0x33,0x11,0xc4,0x0f,0x93,0x49,0x84,0x22, -0x47,0x69,0x87,0x25,0x24,0x83,0x6d,0x04,0x96,0x01,0xa6,0x2d,0xfe,0x87,0x01,0x48,0x5e,0xfe,0x5a,0x02,0x00,0xfe,0xb2,0x65,0x63,0x01,0x50,0xfe,0x00,0x00,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x0b,0x00,0x27,0x40,0x0b,0x07,0x03,0x04,0x0b,0x08,0x00,0x02,0x07,0x07,0x09,0x06,0xbb,0x01,0x38,0x00,0x04,0x00,0x00, -0x01,0x3a,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0xc9,0x01,0x2f,0x33,0xc9,0x2f,0xc9,0x32,0x31,0x30,0x13,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x83,0xfe,0xfb,0x52,0x52,0x01,0x05,0x52,0x04,0x96,0xe8,0xe8,0x02,0x00,0xd2,0xd2,0xfe,0x00,0x00,0x00,0x02,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa2,0x00,0x0b,0x00,0x15, -0x00,0x1c,0xb5,0x09,0x14,0x0f,0x03,0x0c,0x06,0xbb,0x01,0x39,0x00,0x12,0x00,0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x02,0x71,0x89,0x8d,0x79,0x71,0x81,0x8a,0x6e,0x4f,0x5d,0x5b, -0x51,0xa4,0x04,0x89,0x91,0x76,0x82,0x90,0x8e,0x7c,0x7c,0x93,0x01,0xd3,0x6a,0x5e,0x5b,0x6a,0xc7,0xc6,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x07,0x00,0x1c,0xb5,0x03,0x04,0x07,0x00,0x02,0x05,0xbb,0x01,0x38,0x00,0x04,0x00,0x00,0x01,0x3a,0x00,0x3f,0x32,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x11, -0x21,0x11,0x23,0x11,0x21,0x11,0x83,0xfe,0xfb,0x52,0x01,0xa9,0x04,0x96,0x01,0xba,0xfe,0x46,0x02,0x00,0xfe,0x00,0x00,0x02,0xff,0x15,0x03,0xa9,0x00,0xec,0x06,0xa2,0x00,0x10,0x00,0x1d,0x00,0x2e,0x40,0x0c,0x0b,0x17,0x11,0x05,0x01,0x02,0x00,0x05,0x08,0x14,0x01,0x0e,0xbd,0x01,0x3b,0x00,0x1a,0x00,0x08,0x01,0x39,0x00,0x03,0x01, -0x38,0x00,0x3f,0x3f,0xc9,0x3f,0xce,0xc9,0x12,0x39,0x39,0x01,0x2f,0xc9,0x32,0x32,0x2f,0xc9,0x31,0x30,0x03,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x99,0x52,0x52,0x02,0x3c,0x75,0x64,0x6e,0x7d,0x6c,0x65,0x35,0x02,0x52, -0x40,0x46,0x59,0x4e,0x44,0x47,0x58,0x04,0xdf,0xfe,0xca,0x02,0xed,0x5a,0x66,0x8a,0x73,0x82,0x9a,0x56,0x83,0x3b,0x59,0x6c,0x6d,0x52,0x64,0x62,0x48,0x00,0x00,0x01,0xff,0x40,0x04,0x89,0x00,0xc1,0x06,0xa2,0x00,0x15,0x00,0x1c,0xb5,0x05,0x10,0x0b,0x00,0x02,0x13,0xbb,0x01,0x39,0x00,0x08,0x00,0x0d,0x01,0x3b,0x00,0x3f,0xc9,0x3f, -0xc9,0x01,0x2f,0x33,0x2f,0xc9,0x31,0x30,0x13,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0xc1,0x38,0x41,0x4f,0x65,0x5d,0x51,0x43,0x3c,0x3d,0x51,0x6b,0x88,0x93,0x77,0x46,0x31,0x06,0x35,0x27,0x72,0x58,0x58,0x6b,0x2d,0x4e,0x25,0x8c,0x74,0x7d,0x9c,0x19,0x00,0x01, -0xff,0x3e,0x04,0x96,0x00,0xc3,0x06,0x96,0x00,0x07,0x00,0x1d,0xb7,0x01,0x02,0x02,0x06,0x04,0x00,0x04,0x05,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x32,0x01,0x2f,0x2f,0x39,0x2f,0xc9,0x31,0x30,0x13,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x2a,0x52,0x9a,0x01,0x85,0x06,0x50,0xfe,0x46,0x01,0xba,0x46,0x46,0x00,0x01, -0xff,0x23,0x04,0x96,0x00,0xdd,0x06,0x96,0x00,0x10,0x00,0x1d,0xb7,0x01,0x09,0x09,0x0a,0x08,0x02,0x00,0x03,0xba,0x01,0x3a,0x00,0x00,0x01,0x38,0x00,0x3f,0x3f,0x01,0x2f,0x32,0x2f,0x33,0x39,0x2f,0xc9,0x31,0x30,0x13,0x03,0x17,0x23,0x27,0x23,0x06,0x07,0x23,0x37,0x03,0x33,0x16,0x17,0x33,0x37,0x37,0xdd,0xac,0xaa,0x60,0x7b,0x02, -0x12,0x6b,0x5e,0xae,0xa8,0x60,0x6b,0x0e,0x02,0x1a,0x65,0x06,0x96,0xfe,0xfe,0xfe,0xcc,0x20,0xac,0xfc,0x01,0x04,0xbd,0x1b,0x31,0xa7,0x00,0x01,0xff,0x06,0x03,0xdb,0x00,0xfb,0x06,0x96,0x00,0x0b,0x00,0x29,0x40,0x0a,0x09,0x06,0x06,0x00,0x05,0x02,0x0b,0x00,0x07,0x04,0xb8,0x01,0x38,0xb3,0x09,0x05,0x00,0x02,0xb8,0x01,0x3a,0x00, -0x3f,0xce,0xc9,0x32,0x3f,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0x31,0x30,0x13,0x35,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x11,0xb4,0xfe,0x52,0x52,0x01,0x05,0x52,0x4c,0x03,0xdb,0xbb,0x02,0x00,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xff,0x00,0x00,0x01,0xff,0x2f,0x04,0x96,0x00,0xd2,0x06,0x96,0x00,0x0f,0x00,0x24, -0x40,0x0b,0x08,0x05,0x0f,0x0c,0x00,0x03,0x01,0x0a,0x0a,0x0d,0x07,0xba,0x01,0x38,0x00,0x00,0x01,0x3a,0x00,0x3f,0x3f,0x33,0x39,0x2f,0xcd,0xc9,0x01,0x2f,0x33,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x35,0x06,0x23,0x22,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x35,0x33,0x11,0x81,0x57,0x4f,0xac,0x52,0x61,0x49,0x56,0x51,0x04,0x96,0xce, -0x31,0xb6,0xad,0xa9,0x71,0x2b,0xeb,0xfe,0x04,0x00,0x00,0x01,0xfe,0xba,0x04,0x96,0x01,0x47,0x06,0x96,0x00,0x0b,0x00,0x29,0x40,0x0b,0x07,0x04,0x04,0x00,0x0b,0x08,0x03,0x00,0x09,0x05,0x02,0xb8,0x01,0x38,0xb2,0x07,0x03,0x00,0xb8,0x01,0x3a,0x00,0x3f,0xc9,0x32,0x3f,0x33,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0x31, -0x30,0x01,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0xfe,0xba,0x52,0xcc,0x52,0xcb,0x52,0x04,0x96,0x02,0x00,0xfe,0x46,0x01,0xba,0xfe,0x46,0x01,0xba,0xfe,0x00,0x00,0x01,0xfe,0x93,0x03,0xdb,0x01,0x6d,0x06,0x96,0x00,0x0f,0x00,0x37,0x40,0x10,0x09,0x06,0x0d,0x0a,0x06,0x0a,0x06,0x0a,0x00,0x05,0x02,0x0f,0x00,0x0b, -0x07,0x04,0xb8,0x01,0x38,0xb4,0x0d,0x09,0x05,0x00,0x02,0xb8,0x01,0x3a,0x00,0x3f,0xce,0xc9,0x32,0x32,0x3f,0x33,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x31,0x30,0x01,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x01,0x25,0xfd,0x6e,0x52,0xcb,0x52,0xcc,0x52, -0x4d,0x03,0xdb,0xbb,0x02,0x00,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xff,0x00,0x00,0x03,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa1,0x00,0x0b,0x00,0x1b,0x00,0x28,0x00,0x40,0x40,0x19,0x27,0x09,0x19,0x1f,0x13,0x03,0x19,0x13,0x1f,0x0c,0x27,0x10,0x21,0x25,0x1f,0x27,0x21,0x21,0x27,0x1f,0x25,0x04,0x16,0x1c,0x06,0xbb, -0x01,0x39,0x00,0x16,0x00,0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x33,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x22,0x27,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x06,0x06, -0x03,0x22,0x06,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x26,0x02,0x73,0x87,0x8c,0x79,0x73,0x80,0x89,0x29,0x16,0x36,0x32,0x15,0x0d,0x29,0x27,0x08,0x5c,0x45,0x48,0x51,0x0a,0x1d,0x30,0x55,0x49,0x59,0x08,0x48,0x19,0x13,0x39,0x3b,0x0c,0x0e,0x4a,0x10,0x04,0x89,0x8f,0x78,0x80,0x91,0x8c,0x7d,0x7c,0x91,0xcc,0x1b,0x1a,0x10, -0x0c,0x4b,0x57,0x4e,0x55,0x0b,0x0f,0x01,0x05,0x55,0x4d,0x18,0x19,0x1b,0x1d,0xa1,0x00,0x01,0xfe,0x94,0x04,0x88,0x01,0x6c,0x06,0x96,0x00,0x17,0x00,0x30,0x40,0x0d,0x01,0x02,0x0d,0x02,0x0d,0x02,0x12,0x16,0x07,0x12,0x00,0x04,0x15,0xbd,0x01,0x38,0x00,0x0a,0x00,0x0f,0x01,0x3b,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x3f,0xc9, -0x32,0x01,0x2f,0xc9,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x31,0x30,0x13,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0xd3,0x52,0xe0,0x56,0x64,0x58,0x4b,0x44,0x3a,0x39,0x48,0x6d,0x86,0x8d,0x7c,0x01,0xcf,0x06,0x50,0xfe,0x46,0x01,0xba,0x65,0x59,0x55, -0x6e,0x2d,0x4e,0x26,0x8c,0x75,0x7d,0x90,0x46,0x00,0x00,0x02,0xff,0x36,0x04,0x89,0x00,0xcb,0x06,0xa2,0x00,0x14,0x00,0x1e,0x00,0x3a,0x40,0x12,0x0f,0x0f,0x19,0x08,0x1e,0x0b,0x00,0x01,0x15,0x0f,0x12,0x0b,0x0b,0x1b,0x02,0x05,0x0d,0x12,0xbd,0x01,0x39,0x00,0x1b,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x3f, -0xc9,0x12,0x39,0x12,0x39,0x2f,0x12,0x39,0xc9,0x01,0x2f,0xc9,0x33,0x33,0x2f,0xd9,0xc0,0x2f,0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x07,0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0xcb,0x52,0x02,0x35,0x68,0x4e,0x56,0xa4,0x9f,0x6a,0x5c,0x4a,0x40, -0x6e,0xb4,0x52,0x7c,0x42,0x31,0x64,0x3a,0x51,0x04,0x96,0x50,0x5d,0x52,0x43,0x8d,0x18,0x18,0x81,0x3e,0x54,0x30,0xbe,0x4a,0x13,0x0a,0x2a,0x2e,0x56,0x54,0x40,0x00,0x00,0x02,0xff,0x21,0x04,0x89,0x00,0xdf,0x06,0xa2,0x00,0x11,0x00,0x17,0x00,0x2d,0x40,0x0e,0x06,0x06,0x00,0x12,0x17,0x01,0x0b,0x01,0x05,0x17,0x17,0x03,0x14,0x0e, -0xbb,0x01,0x39,0x00,0x03,0x00,0x08,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0x39,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x06,0x07,0xdf,0xfe,0x98,0x04,0xa1,0x56,0x4a,0x41,0x71,0x6d,0x7c, -0x86,0x65,0x64,0x6f,0x53,0x02,0x7e,0x3a,0x52,0x09,0x05,0x81,0xb2,0x39,0x4e,0x31,0x8b,0x80,0x76,0x98,0x80,0x76,0x1a,0x96,0x51,0x45,0x00,0x01,0xff,0x27,0x04,0x96,0x00,0xda,0x06,0x96,0x00,0x19,0x00,0x4c,0x40,0x1f,0x04,0x08,0x01,0x17,0x17,0x14,0x0d,0x19,0x19,0x13,0x14,0x06,0x06,0x0c,0x0d,0x10,0x17,0x08,0x17,0x07,0x19,0x00, -0x04,0x00,0x17,0x00,0x17,0x00,0x02,0x14,0x0d,0xba,0x01,0x3a,0x00,0x02,0x01,0x38,0x00,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0xd9,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x33,0xc9,0x32,0x31,0x30,0x03,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x16,0x16,0x15, -0x15,0x23,0x35,0x34,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x37,0x35,0x23,0xae,0x86,0x52,0x85,0x85,0x57,0x59,0x52,0x85,0x8a,0x52,0xb1,0x86,0x06,0x3a,0x5c,0x5c,0x43,0x4c,0x0a,0x78,0x6a,0x29,0x32,0xa1,0xa1,0x32,0x2c,0xd8,0x12,0x4b,0x00,0x00,0x02,0xff,0x18,0x04,0x88,0x00,0xe8,0x07,0x8c,0x00,0x12,0x00,0x1c,0x00,0x3b,0x40,0x1a, -0x10,0x08,0x0c,0x19,0x00,0x16,0x08,0x19,0x16,0x16,0x19,0x08,0x03,0x06,0x0f,0x1b,0x09,0x06,0x19,0x0c,0x09,0x0c,0x09,0x0f,0x13,0x03,0xb8,0x01,0x3b,0x00,0x3f,0xc9,0x2f,0x39,0x39,0x2f,0x2f,0xc9,0x01,0x2f,0xc6,0xc9,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x11,0x33,0x10,0xc9,0x31,0x30,0x13,0x14,0x06,0x23,0x22,0x26,0x35, -0x34,0x37,0x03,0x33,0x16,0x17,0x37,0x13,0x33,0x03,0x16,0x16,0x07,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x15,0x14,0x5d,0x44,0x34,0x35,0x47,0x47,0x98,0x5f,0x59,0x0e,0x09,0xa5,0x5c,0xda,0x23,0x2c,0x7a,0x19,0x10,0x0f,0x1d,0x26,0x04,0xf8,0x30,0x40,0x3d,0x36,0x37,0x89,0x01,0x20,0xb6,0x23,0x16,0x01,0x74,0xfe,0x30,0x3e,0x5e,0x52, -0x21,0x0e,0x10,0x2d,0x3a,0x4f,0x28,0x2f,0x00,0x02,0xfe,0xf7,0x04,0x96,0x01,0x0a,0x07,0x8c,0x00,0x12,0x00,0x19,0x00,0x3b,0x40,0x19,0x0f,0x0b,0x17,0x08,0x04,0x04,0x06,0x0d,0x00,0x13,0x06,0x16,0x0f,0x0e,0x06,0x07,0x0b,0x07,0x0f,0x07,0x0f,0x07,0x09,0x17,0x04,0xb8,0x01,0x3a,0x00,0x3f,0xc9,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33, -0x10,0xc9,0x32,0x10,0xc9,0x01,0x2f,0x2f,0xc9,0xc4,0x12,0x39,0x2f,0x33,0xc9,0x32,0x32,0x31,0x30,0x01,0x14,0x06,0x23,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x32,0x16,0x07,0x34,0x23,0x23,0x15,0x33,0x32,0x01,0x0a,0x5c,0x48,0xe3,0x8c,0x8c,0x52,0x9c,0x9c,0x89,0x4f,0x5d,0x54,0x68,0x79,0x7a,0x67,0x05, -0x36,0x47,0x59,0x02,0x59,0x43,0x5a,0x5a,0x43,0xfe,0xe2,0x51,0x4a,0x55,0xaf,0x00,0x00,0x02,0xfe,0xa2,0x04,0x8a,0x01,0x5e,0x06,0xa2,0x00,0x12,0x00,0x1a,0x00,0x3b,0x40,0x10,0x15,0x0a,0x03,0x03,0x06,0x10,0x19,0x09,0x05,0x06,0x04,0x09,0x09,0x17,0x13,0x0d,0xbf,0x01,0x39,0x00,0x07,0x01,0x38,0x00,0x06,0x01,0x3a,0x00,0x17,0x00, -0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0x3f,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x12,0x39,0x2f,0x33,0xc9,0x31,0x30,0x13,0x22,0x26,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x15,0x14,0x33,0x32,0x35,0x34,0x6c,0x6a,0x79,0x04,0x91,0x52,0x52,0x92,0x0d,0x7c, -0x69,0x70,0x76,0x81,0x6c,0x99,0x9b,0x97,0x04,0x8a,0x7f,0x75,0xe8,0x02,0x00,0xd2,0x66,0x78,0x8e,0x7c,0x7f,0x8f,0x01,0xd3,0xc8,0xc6,0xc7,0xc7,0x00,0x02,0xfe,0xc2,0x04,0x8a,0x01,0x3f,0x06,0xa2,0x00,0x1b,0x00,0x26,0x00,0x5e,0x40,0x1d,0x0f,0x0b,0x0c,0x15,0x15,0x1c,0x09,0x07,0x07,0x00,0x0c,0x22,0x1b,0x11,0x00,0x15,0x15,0x13, -0x18,0x0a,0x0f,0x23,0x11,0x0f,0x11,0x0f,0x11,0x1f,0x18,0xbd,0x01,0x39,0x00,0x0d,0x01,0x38,0x00,0x00,0x00,0x0c,0x01,0x3a,0xb4,0x01,0x02,0x02,0x1f,0x04,0xb8,0x01,0x3b,0x00,0x3f,0xd9,0xc0,0x2f,0x32,0x3f,0x33,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x01,0x2f,0x33,0xc9,0x33,0x2f,0x12,0x39, -0x2f,0xcd,0xd9,0xc0,0x2f,0x10,0xc9,0x32,0x31,0x30,0x13,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x23,0x11,0x33,0x15,0x21,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x11,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x07,0x06,0x06,0xed,0x02,0x32,0x6b,0x4c,0x57,0x1c,0xb3,0x52,0x52,0x01,0x38,0xa1,0x69,0x5b, -0x4c,0x47,0x67,0xb4,0xfe,0xc0,0x3a,0x28,0x3f,0x4d,0x7c,0x42,0x30,0x04,0x96,0x50,0x5c,0x51,0x43,0x3c,0x24,0xe8,0x02,0x00,0xd2,0x16,0x83,0x3f,0x54,0x30,0xbf,0xfe,0xb3,0x8e,0x2a,0x2b,0x57,0x3c,0x37,0x12,0x0a,0x2b,0x00,0x02,0xff,0x07,0x04,0x96,0x00,0xfa,0x06,0x96,0x00,0x08,0x00,0x14,0x00,0x47,0x40,0x1b,0x00,0x00,0x0d,0x07, -0x0e,0x04,0x03,0x0b,0x08,0x10,0x0e,0x08,0x08,0x0e,0x10,0x03,0x09,0x12,0x09,0x0b,0x10,0x10,0x08,0x0a,0x03,0x04,0x13,0xb8,0x01,0x38,0xb2,0x12,0x0e,0x0a,0xb8,0x01,0x3a,0x00,0x3f,0x33,0x33,0x3f,0xc9,0x32,0x12,0x39,0x39,0x11,0x33,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0xc6,0x32,0x10,0xc4,0xd9,0xc0,0x2f,0x31, -0x30,0x13,0x27,0x26,0x27,0x23,0x06,0x06,0x07,0x17,0x17,0x23,0x27,0x07,0x15,0x23,0x35,0x27,0x07,0x23,0x13,0x33,0x3a,0x26,0x0e,0x04,0x02,0x02,0x08,0x2f,0x3d,0xf6,0x58,0x4c,0x30,0x4b,0x32,0x4e,0x54,0xd6,0x51,0x05,0xa3,0x69,0x22,0x25,0x14,0x23,0x75,0x46,0xcb,0xc6,0x3b,0x8b,0x8b,0x3c,0xc7,0x02,0x00,0x00,0x00,0x02,0xfe,0xee, -0x04,0x96,0x01,0x12,0x06,0x96,0x00,0x12,0x00,0x17,0x00,0x51,0x40,0x20,0x12,0x12,0x0e,0x13,0x03,0x04,0x0f,0x16,0x0c,0x04,0x16,0x16,0x04,0x0c,0x03,0x0d,0x13,0x14,0x09,0x0d,0x0f,0x0c,0x02,0x05,0x16,0x0c,0x16,0x0c,0x16,0x00,0x14,0x0d,0xb8,0x01,0x38,0xb2,0x09,0x04,0x00,0xb8,0x01,0x3a,0x00,0x3f,0x32,0x32,0x3f,0xc9,0x12,0x39, -0x39,0x2f,0x2f,0x10,0xc9,0x32,0x11,0x33,0x01,0x2f,0xc6,0xc9,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x26,0x27,0x15,0x23,0x35,0x06,0x06,0x07,0x23,0x36,0x36,0x37,0x27,0x21,0x07,0x16,0x16,0x17,0x03,0x23,0x17,0x17,0x37,0xbb,0x12,0x80,0x4e,0x44,0x47,0x0b,0x57,0x15,0x5c,0x57, -0x9f,0x01,0xda,0xa4,0x53,0x5b,0x17,0xa8,0xc9,0x5b,0x07,0x04,0x04,0x96,0xb3,0x26,0xd9,0xda,0x15,0x68,0x5d,0x7e,0x7c,0x1b,0xeb,0xec,0x1b,0x7a,0x7f,0x01,0xbc,0x91,0x0f,0x08,0x00,0x02,0xfe,0xb2,0x04,0x96,0x01,0x4f,0x06,0x96,0x00,0x17,0x00,0x1c,0x00,0x69,0x40,0x2d,0x17,0x17,0x13,0x18,0x19,0x12,0x03,0x04,0x14,0x1b,0x12,0x0a, -0x11,0x04,0x1b,0x1b,0x04,0x11,0x0a,0x12,0x05,0x0d,0x18,0x10,0x0c,0x08,0x08,0x0c,0x0d,0x02,0x05,0x1b,0x0b,0x10,0x14,0x1b,0x10,0x10,0x1b,0x14,0x03,0x00,0x19,0x0e,0x12,0xb8,0x01,0x38,0xb3,0x0d,0x08,0x04,0x00,0xb8,0x01,0x3a,0x00,0x3f,0x32,0x32,0x32,0x3f,0xc4,0xc9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x32,0x01, -0x2f,0xd9,0xc2,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x26,0x27,0x15,0x23,0x35,0x06,0x07,0x23,0x36,0x37,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x27,0x21,0x07,0x16,0x16,0x17,0x03,0x23,0x17,0x17,0x37,0xf8,0x11,0x82,0x4e,0x86,0x0f,0x57,0x1e, -0x72,0xb7,0x52,0x52,0xdf,0x8f,0x01,0xda,0xa4,0x54,0x5a,0x17,0xa8,0xc9,0x5a,0x07,0x09,0x04,0x96,0xb0,0x29,0xd9,0xda,0x29,0xb1,0xb7,0x35,0xec,0x02,0x00,0xd4,0xd4,0xec,0x1c,0x76,0x82,0x01,0xbc,0x91,0x0f,0x0f,0x00,0x00,0x01,0x00,0x21,0xfe,0x99,0x04,0x7b,0x05,0x9a,0x00,0x25,0x00,0x3f,0x40,0x21,0x06,0x1a,0x0a,0x0a,0x1a,0x06, -0x03,0x00,0x03,0x09,0x0e,0x7f,0x05,0x00,0x09,0x06,0x91,0x07,0x03,0x1d,0x92,0x16,0x16,0x03,0x23,0x92,0x1a,0x11,0x04,0x0a,0x91,0x03,0x12,0x00,0x3f,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xc4,0xfd,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x31,0x30,0x05,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21, -0x15,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x03,0xe8,0xa4,0xfc,0xdd,0x03,0x41,0xfd,0x02,0x04,0x00,0xfc,0xb8,0x02,0x2a,0x94,0xa1,0x8b,0x73,0x45,0x8b,0x50,0x5d,0x4e,0x40,0x41,0x8c,0x87,0x78,0x4a,0x79,0x3f,0x30,0x64,0x32, -0x37,0x45,0x79,0x79,0x2f,0x04,0xd3,0x98,0x28,0xfb,0x26,0x87,0x7f,0x6f,0x8a,0x2e,0x24,0x29,0x43,0x33,0x73,0x85,0x29,0x19,0x13,0x26,0x3e,0x00,0x00,0x01,0x00,0x21,0xfe,0xa9,0x03,0x9e,0x04,0x00,0x00,0x22,0x00,0x40,0x40,0x22,0x18,0x06,0x0a,0x05,0x05,0x0a,0x06,0x18,0x04,0x00,0x03,0x09,0x0d,0xed,0x00,0x09,0x06,0x95,0x07,0x0f, -0x1b,0x96,0x14,0x14,0x03,0x20,0x96,0x18,0x10,0x04,0x0a,0x95,0x03,0x15,0x00,0x3f,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x05,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22, -0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x33,0x32,0x36,0x03,0x11,0x99,0xfd,0xa9,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x01,0x7b,0x01,0x11,0x7a,0x67,0x65,0x9b,0x52,0x46,0x39,0x39,0x81,0x78,0x6e,0x44,0x82,0x4b,0x50,0x2e,0x36,0x34,0x72,0x72,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0xf5,0x6a,0x84,0x4c,0x28,0x40,0x30, -0x6f,0x7e,0x2c,0x22,0x26,0x3e,0x00,0x01,0x00,0x21,0xfe,0x99,0x04,0x7b,0x05,0x9a,0x00,0x2d,0x00,0x5a,0x40,0x30,0x2d,0x1b,0x03,0x1b,0x0b,0x2c,0x07,0x07,0x2c,0x0b,0x1b,0x03,0x05,0x27,0x2a,0x09,0x06,0x0f,0x7f,0x02,0x27,0x1e,0x92,0x17,0x17,0x2a,0x24,0x92,0x1b,0x12,0x2b,0x0b,0x91,0x2a,0x0a,0x2d,0x92,0x07,0x00,0x00,0x04,0x2a, -0x12,0x06,0x03,0x91,0x04,0x03,0x00,0x3f,0xed,0x39,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xfd,0xc4,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x31,0x30,0x13,0x21,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x21,0x01,0x21,0x32,0x16,0x15,0x14,0x06, -0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x21,0x35,0x01,0x21,0xa2,0x01,0x85,0x01,0x3b,0xfd,0x02,0x04,0x00,0xfe,0x78,0x01,0x38,0xfe,0x72,0xfe,0x96,0x02,0x2a,0xa2,0x93,0x8b,0x72,0x42,0x7d,0x61,0x61,0x4a,0x40,0x42,0x8c,0x87,0x79,0x5c,0x69,0x3e, -0x30,0x63,0x32,0x37,0x44,0xa4,0xfc,0xdd,0x01,0xae,0xfe,0xd3,0x03,0x2e,0x01,0xd4,0x98,0x28,0xfd,0xbc,0x80,0xfd,0xea,0x7e,0x88,0x6f,0x8a,0x27,0x2b,0x29,0x43,0x33,0x73,0x85,0x2a,0x18,0x13,0x26,0x3e,0x2e,0x79,0x2f,0x02,0x7f,0x00,0x01,0x00,0x21,0xfe,0xa9,0x03,0x9e,0x04,0x00,0x00,0x2c,0x00,0x5a,0x40,0x31,0x1b,0x03,0x2c,0x0b, -0x2b,0x07,0x02,0x02,0x07,0x2b,0x0b,0x2c,0x03,0x1b,0x07,0x26,0x29,0x09,0x06,0x0f,0xed,0x26,0x1e,0x96,0x17,0x17,0x29,0x23,0x96,0x1b,0x12,0x2a,0x0b,0x95,0x29,0x0a,0x2c,0x96,0x07,0x00,0x00,0x04,0x29,0x15,0x06,0x03,0x95,0x04,0x0f,0x00,0x3f,0xed,0x39,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xd4,0x32,0xed,0x12,0x39, -0x2f,0xed,0x01,0x2f,0xfd,0xc4,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x13,0x21,0x13,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x21,0x03,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x21,0x35,0x01, -0x23,0x7d,0x01,0x31,0xd1,0xfd,0xdb,0x03,0x16,0xfe,0xec,0x01,0x04,0xfe,0xa4,0xf2,0x01,0x7f,0x80,0x8d,0x7c,0x6b,0x40,0x97,0x2f,0x4c,0x45,0x36,0x37,0x81,0x76,0x6a,0x41,0x7d,0x4f,0x54,0x2f,0x39,0x36,0x76,0xfd,0x86,0x01,0x33,0xd7,0x02,0x54,0x01,0x20,0x8c,0x2f,0xfe,0x83,0x7a,0xfe,0xb2,0x7f,0x76,0x69,0x85,0x33,0x19,0x28,0x40, -0x30,0x70,0x7d,0x2b,0x23,0x26,0x3e,0x2a,0x72,0x33,0x01,0xa7,0x00,0x01,0x00,0x77,0xff,0xe8,0x03,0xdc,0x05,0xb2,0x00,0x27,0x00,0x29,0x40,0x16,0x00,0x1a,0x7d,0x0d,0x22,0x7d,0x13,0x06,0x13,0x0d,0x22,0x27,0x04,0x03,0x10,0x91,0x17,0x04,0x24,0x91,0x03,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xc4,0xed,0x2f,0xfd, -0xc4,0x31,0x30,0x25,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x14,0x21,0x32,0x36,0x37,0x03,0xdc,0x3f,0xcb,0x5d,0xf1,0xfe,0xf3,0xae,0xce,0x8f,0x74,0x34,0x9b,0x96,0x5e,0x8e,0x5a,0x4f,0x88,0x5e,0xef,0x01, -0x03,0x43,0x92,0x8f,0x9d,0x7a,0x38,0x01,0x34,0x63,0xe0,0x3e,0x3a,0x26,0x2c,0xb6,0xa9,0x91,0xd8,0x66,0x48,0x55,0x5d,0x44,0x5a,0x6c,0x24,0x34,0xbd,0x1e,0x15,0xbd,0xad,0x5d,0x8e,0x7a,0x49,0x50,0x5e,0x65,0x44,0xc4,0x4a,0x37,0x00,0x01,0x00,0x70,0xff,0xe8,0x03,0x17,0x04,0x18,0x00,0x22,0x00,0x29,0x40,0x16,0x00,0x16,0x83,0x0b, -0x1d,0x83,0x10,0x05,0x10,0x0b,0x1d,0x22,0x04,0x02,0x0e,0x95,0x13,0x10,0x1f,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xc4,0xed,0x2f,0xfd,0xc4,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x0e,0x02,0x15, -0x14,0x33,0x32,0x36,0x37,0x03,0x17,0x70,0xa2,0xc6,0xcf,0x87,0x9e,0x82,0x56,0x6a,0x60,0x91,0x73,0x68,0x86,0xb5,0xd3,0x75,0x9e,0x6c,0x53,0x2b,0xd8,0x52,0x99,0x3c,0x25,0x3d,0x88,0x85,0x71,0x9c,0x3e,0x34,0x55,0x3c,0x40,0x49,0x4a,0xa6,0x2e,0x91,0x7e,0x72,0x91,0x40,0x2c,0x36,0x41,0x2b,0x86,0x35,0x2e,0x00,0x00,0x01,0x00,0xbc, -0xff,0xf0,0x02,0xc8,0x05,0x9a,0x00,0x11,0x00,0x1f,0x40,0x0f,0x09,0x7e,0x06,0x00,0x7f,0x0f,0x10,0x10,0x03,0x07,0x03,0x0c,0x91,0x03,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x02,0xc8,0x8b,0x79,0x7d, -0x8b,0xa8,0x3c,0x2d,0x2c,0x37,0x98,0xfa,0x7d,0x8d,0x9a,0x93,0x04,0x7d,0xfb,0x82,0x54,0x45,0x3b,0x3d,0x2b,0x00,0x00,0x01,0x00,0xa6,0xff,0xf0,0x02,0xa5,0x04,0x00,0x00,0x11,0x00,0x22,0xb3,0x09,0x84,0x06,0x00,0xb8,0x01,0x2e,0x40,0x0a,0x0f,0x10,0x10,0x03,0x07,0x0f,0x0c,0xec,0x03,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x01, -0x2f,0xed,0x2f,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x02,0xa5,0x85,0x78,0x7b,0x87,0xa3,0x38,0x31,0x2a,0x34,0x95,0xf1,0x76,0x8b,0x98,0x8b,0x02,0xed,0xfd,0x12,0x4a,0x48,0x38,0x3b,0x28,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x19,0x00,0x4d, -0x40,0x29,0x12,0x16,0x7e,0x0f,0x0b,0x0b,0x07,0x00,0x0d,0x06,0x7e,0x07,0x14,0x19,0x7e,0x00,0x16,0x03,0x91,0x0b,0x15,0x0d,0x92,0x0e,0x12,0x0e,0x00,0x0b,0x10,0x0b,0x02,0x0b,0x0e,0x0b,0x0e,0x07,0x10,0x03,0x00,0x07,0x12,0x00,0x3f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x33,0x01,0x2f,0xfd, -0xc4,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x12,0x37,0x35,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x15,0x04,0x11,0x11,0x04,0x2d,0xfe,0x99,0xfe,0x8c,0xa8,0xe0,0xe2,0xfe,0xba,0x01,0x46,0xa8,0x01,0x46,0xfe,0xba,0x01,0xc1,0x01,0x7c,0x01,0xaa,0xfe, -0x47,0xfe,0x93,0x01,0x78,0x01,0x08,0x01,0x28,0x11,0x99,0x8a,0xbe,0xbe,0x8a,0x9b,0x2e,0xfd,0xd8,0xfe,0x9f,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xe4,0x04,0x00,0x00,0x19,0x00,0x47,0x40,0x24,0x14,0x19,0x0d,0x07,0x12,0x16,0x84,0x0f,0x0b,0x0b,0x00,0x07,0x84,0x08,0x19,0x84,0x00,0x15,0x0d,0x96,0x12,0x0e,0x0e,0x08,0x10,0x03, -0x96,0x16,0x0b,0x0b,0x08,0x10,0x0f,0x00,0x08,0x15,0x00,0x3f,0x33,0x3f,0x12,0x39,0x2f,0x33,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xc4,0x10,0xc4,0x31,0x30,0x21,0x35,0x10,0x21,0x22,0x06,0x15,0x15,0x23,0x35,0x10,0x25,0x35,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15, -0x21,0x15,0x04,0x11,0x15,0x03,0x40,0xfe,0xf5,0x8b,0x89,0xa4,0x01,0x62,0xfe,0xf5,0x01,0x0b,0xa4,0x01,0x0b,0xfe,0xf5,0x01,0x61,0x6b,0x01,0x3c,0xa1,0xa7,0x5f,0x58,0x01,0xac,0x28,0x96,0x86,0xb8,0xb8,0x86,0x97,0x2c,0xfe,0x54,0x53,0x00,0x00,0x02,0x00,0x48,0xff,0xe7,0x05,0x73,0x05,0x9a,0x00,0x16,0x00,0x35,0x00,0x55,0x40,0x18, -0x2b,0x1d,0x7e,0x07,0x10,0x23,0x28,0x23,0x28,0x23,0x04,0x17,0x0f,0x13,0x7d,0x17,0x2e,0x7d,0x08,0x04,0x20,0x25,0x1a,0x2b,0xb8,0x01,0x05,0x40,0x10,0x07,0x10,0x0c,0x07,0x25,0x07,0x25,0x07,0x00,0x0e,0x08,0x03,0x32,0x92,0x00,0x13,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x01, -0x2f,0xc4,0xed,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xc4,0xfd,0xcd,0x31,0x30,0x05,0x22,0x24,0x26,0x35,0x34,0x36,0x37,0x01,0x33,0x01,0x17,0x33,0x37,0x01,0x33,0x01,0x16,0x16,0x15,0x14,0x06,0x04,0x01,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x06, -0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x02,0xe9,0xca,0xfe,0xcb,0xa2,0xfe,0xed,0xfe,0x69,0xdc,0x01,0x34,0x36,0x06,0x31,0x01,0x2b,0xca,0xfe,0x88,0xe1,0xfc,0xa4,0xfe,0xd6,0x01,0x1c,0xd1,0xb0,0x46,0x36,0x2a,0x33,0x38,0x43,0x4f,0x4e,0x69,0x7a,0x32,0x39,0xb2,0xdb,0x73,0xf1,0x92,0x8f,0xd8,0x6a,0x19,0x6e,0xc8,0x86,0xad, -0xe5,0x26,0x02,0x3f,0xfe,0x20,0x5e,0x56,0x01,0xe8,0xfd,0xc3,0x26,0xdc,0xa4,0x8d,0xd3,0x70,0x01,0xca,0x88,0xa3,0x0c,0x60,0x71,0x2b,0x21,0x2f,0x1f,0x89,0x1d,0x64,0x59,0x48,0x7f,0x4e,0x14,0xa6,0x82,0x61,0x8f,0x54,0x52,0x95,0x00,0x02,0x00,0x19,0xff,0xe7,0x03,0xb6,0x05,0xed,0x00,0x14,0x00,0x20,0x00,0x3b,0x40,0x1e,0x0e,0x1e, -0x09,0x15,0x84,0x07,0x12,0x00,0x84,0x1b,0x07,0x1b,0x07,0x1b,0x0a,0x11,0x0a,0x0e,0x12,0x1e,0x03,0x0a,0x0a,0x04,0x10,0x00,0x18,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0xc5,0x10,0xfd,0xc5,0xc6,0x32,0x31,0x30,0x25,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34, -0x13,0x01,0x33,0x13,0x16,0x17,0x37,0x01,0x33,0x01,0x16,0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x02,0xa2,0x3c,0x6e,0x45,0x71,0x87,0x8d,0xfe,0xd1,0xbe,0x92,0x20,0x1c,0x13,0x01,0x46,0xb8,0xfe,0x4e,0x4f,0x4f,0xfe,0xba,0x2c,0x27,0x26,0x2c,0x32,0x27,0x28,0x24,0xc6,0x3b,0x68,0x3c,0x7e,0x67,0x79,0x01, -0x07,0x02,0x40,0xfe,0xd5,0x42,0x45,0x2d,0x02,0xe6,0xfc,0x62,0x87,0xb5,0x43,0x2b,0x32,0x32,0x2b,0x23,0x85,0x47,0x59,0x6e,0x00,0x01,0x00,0x5e,0xff,0xe8,0x08,0xaa,0x05,0xb2,0x00,0x32,0x00,0x49,0x40,0x28,0x1e,0x02,0x1e,0x02,0x17,0x09,0x7d,0x30,0x24,0x7d,0x17,0x00,0x21,0x91,0x1b,0x10,0xee,0x02,0x1e,0x1e,0x1b,0x0f,0x2a,0x1f, -0x2a,0x2f,0x2a,0x03,0x2a,0x2a,0x13,0x05,0x1b,0x04,0x2d,0x27,0x91,0x0d,0x13,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x12,0x39,0x11,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x22,0x07,0x35,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x26,0x27, -0x06,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x36,0x37,0x16,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x06,0x14,0xa8,0x66,0x71,0x9b,0xc5,0x01,0x2e,0xa5,0xa4,0xfe,0xd0,0xc6,0x5e,0xd2,0x5b,0x5a,0xd6,0x5d,0xc5,0xfe,0xcf,0xa4,0xa2,0x01,0x2e,0xc8,0xa1,0x6b, -0x2e,0x8f,0x51,0xdc,0xfe,0xf6,0x01,0x0c,0xf2,0x6f,0xc9,0x3f,0x42,0xc2,0x75,0xef,0x01,0x0f,0xfe,0xf8,0x05,0x1a,0x45,0xb2,0x2b,0xb9,0xfe,0xaa,0xdf,0xd9,0xfe,0xb3,0xb6,0x2c,0x2a,0x29,0x2d,0xb6,0x01,0x4c,0xd8,0xda,0x01,0x57,0xbf,0x2b,0xb2,0x20,0x25,0xfe,0xbc,0xfe,0xf0,0xfe,0xee,0xfe,0xcb,0x35,0x2b,0x2b,0x35,0x01,0x31,0x01, -0x16,0x01,0x11,0x01,0x43,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x06,0xc6,0x04,0x18,0x00,0x2b,0x00,0x47,0x40,0x26,0x0c,0x20,0x0c,0x20,0x06,0x27,0x83,0x1b,0x11,0x83,0x06,0x1e,0x0e,0xec,0x09,0x00,0xec,0x20,0x0c,0x0c,0x09,0x16,0x40,0x09,0x0c,0x48,0x16,0x16,0x02,0x23,0x09,0x10,0x18,0x14,0x95,0x2a,0x02,0x16,0x00,0x3f,0x33,0xed, -0x32,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x12,0x39,0x11,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32, -0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x03,0x96,0x93,0xaf,0x98,0xe4,0x78,0x01,0x0a,0xdc,0x80,0x67,0x69,0x82,0x93,0xa7,0xc1,0xa7,0xa5,0x7f,0x80,0xa2,0xa9,0xbf,0xa5,0x93,0x83,0x69,0x6a,0x7e,0x90,0xdd,0x77,0xfe,0xf3,0xe6,0xae,0x42,0x5a,0x84,0xf3,0x9b,0xf6,0x01,0x28,0x30,0xaa,0x49,0xd2,0xb9,0xb9,0xcf,0x63,0x63,0xd0,0xb8,0xb8, -0xd3,0x49,0xaa,0x30,0x87,0xf7,0xa0,0xef,0xfe,0xdd,0x00,0x02,0xff,0xf3,0x00,0x00,0x04,0x5a,0x05,0xb2,0x00,0x14,0x00,0x1d,0x00,0x2d,0x40,0x17,0x00,0x1a,0x7e,0x08,0x08,0x0e,0x04,0x7d,0x15,0x0e,0x19,0x91,0x00,0x00,0x08,0x0c,0x92,0x11,0x04,0x1a,0x91,0x08,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed, -0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x01,0x86,0x01,0x1d,0xcb,0xec,0xf5,0xda,0xfe,0x53,0x4a,0x51,0x26,0x2a,0x2f,0x3e,0x8e,0x98,0x02,0x23,0xa1,0x9d,0xe5,0xe7,0x9a,0xa2,0x03, -0x3a,0xd0,0xbe,0xc5,0xe7,0x04,0x05,0x9f,0x83,0x15,0x8e,0x12,0xce,0xbf,0xfd,0x7d,0x86,0x7a,0xfd,0xf6,0x8c,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x04,0x19,0x04,0x18,0x00,0x06,0x00,0x1b,0x00,0x2d,0x40,0x17,0x13,0x04,0x84,0x1b,0x1b,0x00,0x0c,0x17,0x83,0x00,0x03,0x95,0x13,0x13,0x0f,0x04,0x95,0x1b,0x15,0x0a,0x95,0x0f,0x10,0x00, -0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x34,0x23,0x23,0x11,0x33,0x32,0x01,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x03,0x71,0xce,0xf4,0xf6,0xcc,0xfd,0x9a,0x3b,0x4a,0x30,0x24,0x39,0x37,0x83,0x8a,0x01, -0x14,0x9b,0xbb,0xb5,0x91,0xfe,0x38,0x01,0x40,0xaa,0xfe,0xa2,0x02,0x5b,0x50,0x57,0x0f,0x88,0x11,0x99,0x91,0x77,0xa5,0x92,0x92,0xae,0x00,0x03,0x00,0x33,0x00,0x00,0x06,0xa2,0x05,0x9a,0x00,0x03,0x00,0x10,0x00,0x18,0x00,0x40,0x40,0x22,0x0d,0x15,0x7e,0x08,0x04,0x7d,0x11,0x08,0x11,0x08,0x11,0x00,0x0a,0x03,0x7e,0x00,0x14,0x91, -0x0d,0x0d,0x08,0x0b,0x01,0x03,0x00,0x12,0x0a,0x91,0x0b,0x03,0x15,0x91,0x08,0x12,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x11,0x33,0x11,0x01,0x14,0x06,0x23,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x07,0x10,0x21, -0x23,0x11,0x33,0x32,0x36,0x05,0xfa,0xa8,0xfe,0xb1,0xf5,0xda,0xfe,0x53,0xfe,0x5c,0x02,0x4c,0x01,0x1e,0xcb,0xeb,0xb1,0xfe,0xc3,0xe6,0xe7,0x97,0xa5,0x05,0x9a,0xfa,0x66,0x01,0xac,0xc4,0xe8,0x05,0x02,0x98,0xfd,0xa0,0xd3,0xc5,0x01,0x00,0xfd,0xf6,0x89,0x00,0x00,0x03,0x00,0x1c,0x00,0x00,0x05,0xae,0x04,0x00,0x00,0x03,0x00,0x10, -0x00,0x18,0x00,0x40,0x40,0x22,0x0d,0x16,0x84,0x08,0x04,0x83,0x11,0x08,0x11,0x08,0x11,0x00,0x0a,0x03,0x84,0x00,0x15,0x95,0x0d,0x0d,0x08,0x0b,0x01,0x0f,0x00,0x15,0x0a,0x95,0x0b,0x0f,0x16,0x95,0x08,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10, -0xed,0x32,0x31,0x30,0x21,0x11,0x33,0x11,0x01,0x14,0x06,0x23,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x05,0x0c,0xa2,0xfe,0xae,0xb6,0x92,0xfe,0x3a,0xfe,0xce,0x01,0xd6,0x01,0x14,0xa0,0xb6,0xa8,0x67,0x6c,0xef,0xef,0xd3,0x04,0x00,0xfc,0x00,0x01,0x40,0x93,0xad,0x03,0x73,0x8d,0xfe, -0x77,0xa6,0x93,0x57,0x55,0xfe,0xa2,0x00,0x00,0x02,0x00,0xbb,0x00,0x00,0x06,0x5d,0x05,0x9a,0x00,0x16,0x00,0x1f,0x00,0x4b,0x40,0x27,0x07,0x0b,0x1c,0x7e,0x04,0x13,0x09,0x13,0x09,0x17,0x03,0x16,0x7e,0x00,0x0f,0x7d,0x17,0x0a,0x15,0x91,0x07,0x03,0x03,0x13,0x01,0x1b,0x91,0x0b,0x0b,0x13,0x05,0x01,0x03,0x00,0x12,0x1c,0x91,0x13, -0x12,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x32,0x31,0x30,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x11,0x01,0x34,0x26,0x23,0x23,0x11, -0x33,0x32,0x36,0xbb,0xa8,0x01,0x7e,0xa8,0x01,0x67,0xfe,0x99,0x01,0x1a,0xce,0xec,0xfb,0xd7,0xfe,0x56,0xfe,0x82,0x04,0x49,0x9c,0xa5,0xe2,0xe3,0x9c,0xa4,0x05,0x9a,0x95,0x95,0x95,0x98,0xfe,0xcd,0xd2,0xbc,0xc9,0xe3,0x04,0x6d,0xfb,0x93,0x01,0xa2,0x80,0x80,0xfd,0xf6,0x89,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0xaa,0x05,0xec, -0x00,0x16,0x00,0x1e,0x00,0x4b,0x40,0x27,0x09,0x17,0x07,0x0b,0x1c,0x84,0x04,0x13,0x13,0x17,0x03,0x16,0x84,0x00,0x0f,0x83,0x17,0x0a,0x15,0x95,0x07,0x03,0x03,0x13,0x01,0x1b,0x95,0x0b,0x0b,0x13,0x05,0x01,0x00,0x00,0x15,0x1c,0x95,0x13,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32, -0x01,0x2f,0xed,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x32,0x10,0xc4,0x31,0x30,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x11,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0xa6,0xa4,0x01,0x52,0xa4,0x01,0x1e,0xfe,0xe2,0x01,0x14,0xa2,0xb4,0xb6,0x91,0xfe, -0x39,0xfe,0xae,0x03,0xb8,0x63,0x70,0xef,0xef,0xd3,0x05,0xec,0xc3,0xc3,0xc3,0x8d,0xfd,0xdb,0xa7,0x90,0x91,0xaf,0x04,0x9c,0xfb,0x64,0x01,0x3e,0x55,0x57,0xfe,0xa2,0x00,0x02,0x00,0x60,0xff,0xe8,0x07,0x6a,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x36,0x40,0x1d,0x07,0x7e,0x1c,0x1c,0x0c,0x16,0x7d,0x00,0x0b,0x7e,0x08,0x0c,0x0e,0x91, -0x07,0x07,0x0c,0x09,0x03,0x0c,0x12,0x1f,0x91,0x04,0x04,0x19,0x91,0x12,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x34,0x12,0x24,0x33,0x20,0x00,0x13,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x37,0x10,0x12,0x33, -0x32,0x12,0x11,0x10,0x00,0x23,0x22,0x02,0x60,0x9a,0x01,0x21,0xbf,0x01,0x1b,0x01,0x5b,0x1f,0x01,0x53,0xa8,0xa8,0xfe,0xb2,0xa5,0xfe,0xdb,0xb7,0xcd,0xfe,0xd7,0x9d,0xb0,0xfe,0xe5,0xdf,0xf2,0xfe,0xfd,0xe1,0xe0,0xf0,0x02,0xdf,0xd7,0x01,0x49,0xb3,0xfe,0xae,0xfe,0xd5,0x02,0x65,0xfa,0x66,0x02,0x9e,0xc6,0xfe,0xbb,0xab,0xb7,0x01, -0x59,0xd0,0xfe,0xe9,0xfe,0xce,0x01,0x3b,0x01,0x17,0x01,0x13,0x01,0x36,0xfe,0xcd,0x00,0x02,0x00,0x63,0xff,0xe8,0x05,0xdb,0x04,0x18,0x00,0x13,0x00,0x1b,0x00,0x38,0x40,0x1e,0x06,0x0d,0x84,0x18,0x18,0x0b,0x14,0x83,0x00,0x0a,0x84,0x07,0x0b,0x0d,0x95,0x06,0x06,0x0b,0x08,0x0f,0x0b,0x15,0x1a,0x95,0x03,0x10,0x16,0x95,0x11,0x16, -0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x0e,0x02,0x23,0x22,0x00,0x37,0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x63,0xf0,0xdc,0xca,0xff,0x1b,0x01,0x24,0xa4,0xa4,0xfe,0xde,0x05, -0x6f,0xcb,0x8f,0xe2,0xfe,0xfe,0xa7,0x01,0x2f,0x01,0x36,0xfe,0xce,0xfe,0xcd,0x02,0x04,0xff,0x01,0x15,0xe9,0xd3,0x01,0xa4,0xfc,0x00,0x01,0xd1,0x94,0xde,0x77,0x01,0x24,0xf2,0xfe,0x74,0x01,0x8c,0x01,0x90,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x50,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x48,0xb9,0x00,0x14,0x01,0x04,0x40,0x22,0x05, -0x04,0x05,0x15,0x15,0x05,0x04,0x03,0x08,0x0f,0x0b,0x07,0x7e,0x08,0x02,0x91,0x14,0x06,0x91,0x0b,0x14,0x0b,0x14,0x0b,0x08,0x11,0x0d,0x03,0x09,0x03,0x04,0x00,0x08,0x12,0x00,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x31,0x30, -0x21,0x03,0x21,0x03,0x23,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x01,0x23,0x06,0x07,0x03,0x21,0x03,0x26,0x06,0x96,0x98,0xfd,0xa0,0x8f,0xbb,0xfb,0xfe,0x15,0xa8,0xa8,0x02,0x25,0xf1,0xae,0x02,0x28,0xfd,0x80,0x04,0x09,0x0e,0xdf,0x01,0xf1,0xe1,0x0b,0x01,0x92,0xfe,0x6e,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b, -0x02,0x75,0xfa,0x66,0x04,0xec,0x37,0x29,0xfd,0x9d,0x02,0x63,0x1f,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x05,0xa1,0x04,0x18,0x00,0x1c,0x00,0x27,0x00,0x5d,0x40,0x31,0x0f,0x0b,0x84,0x0c,0x16,0x1d,0x83,0x09,0x07,0x07,0x00,0x0c,0x23,0x1c,0x84,0x11,0x00,0x13,0x95,0x19,0x10,0x01,0x02,0x0a,0x95,0x0f,0x24,0x96,0x11,0x02,0x0c,0x0f, -0x16,0x11,0x0d,0x0f,0x11,0x0f,0x11,0x0c,0x0d,0x0f,0x00,0x0c,0x15,0x20,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x3f,0xed,0x01,0x2f,0x33,0xed,0x33,0x2f,0x12,0x39,0x2f,0xcd,0xfd,0xc4,0x10,0xed,0x32,0x31,0x30,0x21,0x35,0x23,0x06,0x23, -0x22,0x26,0x35,0x34,0x37,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x25,0x10,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x07,0x06,0x06,0x04,0xfd,0x04,0x67,0xd4,0x97,0xaf,0x38,0xfe,0x9a,0xa4,0xa4,0x02,0x71,0x01,0x42,0xd3,0x60,0xa0,0x4e,0x93,0xc9,0x01,0x69,0xfd,0x7f,0x6b,0x59,0x7a, -0x9f,0xef,0x88,0x66,0xa0,0xb8,0x9f,0x89,0x74,0x4d,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x2d,0x01,0x05,0x3d,0x41,0xa8,0x60,0xfe,0x82,0xfd,0x66,0x01,0x1c,0x4c,0x5e,0xab,0x83,0x66,0x21,0x14,0x56,0x00,0x00,0x03,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x11,0x00,0x2f,0x40,0x18,0x07,0x0d,0x0e,0x04,0x04,0x0e, -0x0d,0x07,0x04,0x00,0x03,0x00,0x06,0x92,0x0d,0x0d,0x00,0x09,0x01,0x03,0x07,0x92,0x00,0x12,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x33,0x01,0x33,0x01,0x27,0x03,0x21,0x03,0x01,0x23,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x16,0x02,0x26,0xae,0x02,0x28,0xf1, -0xae,0xfe,0x3a,0xa8,0x01,0x8d,0x04,0x08,0x08,0x08,0x97,0x01,0x62,0x99,0x08,0x06,0x05,0x9a,0xfa,0x66,0x91,0x01,0xd2,0xfe,0x2e,0x04,0x5b,0x23,0x2b,0x14,0xfe,0x62,0x01,0xa0,0x17,0x2c,0x00,0x03,0x00,0x0a,0x00,0x00,0x03,0xc7,0x04,0x00,0x00,0x03,0x00,0x07,0x00,0x0f,0x00,0x2f,0x40,0x18,0x04,0x0b,0x0c,0x05,0x05,0x0c,0x0b,0x04, -0x04,0x00,0x01,0x00,0x07,0x96,0x0b,0x0b,0x01,0x08,0x02,0x0f,0x04,0x96,0x01,0x15,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x21,0x21,0x01,0x33,0x01,0x21,0x03,0x21,0x13,0x06,0x07,0x07,0x33,0x27,0x26,0x27,0x03,0xc7,0xfc,0x43,0x01,0x98,0xa1,0xfe,0xa0,0x02,0x05, -0x71,0xfe,0xe3,0x8c,0x05,0x1a,0x43,0xcb,0x40,0x14,0x10,0x04,0x00,0xfc,0x7b,0x01,0x44,0x01,0xb8,0x44,0x47,0xb9,0xb5,0x34,0x5b,0x00,0x00,0x04,0x00,0x29,0x00,0x00,0x05,0xaa,0x05,0x9a,0x00,0x14,0x00,0x1b,0x00,0x1f,0x00,0x24,0x00,0x69,0x40,0x38,0x16,0x14,0x1c,0x0b,0x7e,0x0c,0x24,0x0c,0x15,0x02,0x7e,0x19,0x00,0x23,0x14,0x0c, -0x19,0x1d,0x01,0x01,0x1d,0x19,0x0c,0x14,0x23,0x00,0x07,0x06,0x11,0x06,0x0a,0x0e,0x92,0x23,0x1c,0x23,0x1f,0x20,0x92,0x14,0x19,0x02,0x14,0x23,0x14,0x23,0x14,0x00,0x0c,0x07,0x11,0x12,0x16,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f, -0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xfd,0xcd,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0x31,0x30,0x13,0x21,0x01,0x16,0x16,0x12,0x17,0x23,0x26,0x27,0x21,0x11,0x23,0x11,0x21,0x06,0x07,0x23,0x12,0x00,0x37,0x01,0x21,0x13,0x16,0x17,0x36,0x36,0x13,0x21,0x26,0x27,0x27,0x06,0x06,0x07,0x21,0xa5,0x04,0x9f,0xfe, -0x52,0x9e,0xcb,0x7e,0x2d,0xbf,0x10,0x31,0xfe,0x98,0xa8,0xfe,0x8c,0x2c,0x10,0xc1,0x2f,0x01,0x01,0xe9,0x01,0xe5,0xfd,0x9f,0xf8,0x23,0x11,0x11,0x0e,0x31,0x01,0x25,0x6e,0xb7,0xa8,0x68,0x8b,0x3e,0x01,0x31,0x05,0x9a,0xfd,0x60,0x36,0xb2,0xfe,0xea,0xfc,0xb1,0x6b,0xfe,0xe4,0x01,0x1c,0x6d,0xaf,0x01,0x4a,0x01,0x6c,0x46,0x02,0x06, -0xfe,0x6a,0x37,0x39,0x33,0x1a,0xfe,0x58,0x9c,0x33,0x02,0x1f,0x5b,0x57,0x00,0x04,0x00,0x1e,0x00,0x00,0x04,0x66,0x04,0x00,0x00,0x15,0x00,0x1c,0x00,0x21,0x00,0x26,0x00,0x6d,0x40,0x0c,0x20,0x17,0x0e,0x22,0x04,0xef,0x05,0x21,0x05,0x23,0x16,0x11,0xb8,0x01,0x2e,0x40,0x2a,0x1a,0x0f,0x0e,0x05,0x1a,0x10,0x10,0x1a,0x05,0x0e,0x0f, -0x05,0x0a,0x15,0x0a,0x03,0x07,0x96,0x20,0x22,0x20,0x26,0x1d,0x96,0x0e,0x11,0x1a,0x0e,0x0f,0x20,0x0e,0x20,0x0e,0x0a,0x17,0x95,0x0f,0x0f,0x05,0x00,0x0a,0x15,0x00,0x3f,0x33,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, -0x2f,0x10,0xfd,0xcd,0xcd,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0xcd,0x31,0x30,0x21,0x26,0x27,0x23,0x15,0x23,0x35,0x21,0x06,0x07,0x23,0x3e,0x02,0x37,0x01,0x21,0x01,0x1e,0x02,0x17,0x01,0x21,0x17,0x16,0x17,0x36,0x36,0x07,0x06,0x06,0x07,0x3b,0x02,0x26,0x26,0x27,0x03,0xb8,0x0a,0x21,0xf9,0x9c,0xff,0x00,0x1a,0x11,0xaf,0x24,0x60, -0x98,0x74,0xfe,0xc2,0x03,0xb5,0xfe,0xb8,0x73,0x9b,0x5e,0x1d,0xfe,0xb0,0xfe,0x6f,0x9f,0x1c,0x08,0x03,0x0a,0x5d,0x3a,0x5a,0x2d,0xc1,0x9c,0xb9,0x35,0x4c,0x38,0x74,0x4e,0xc2,0xc2,0x40,0x82,0xbe,0xc9,0x81,0x23,0x01,0xd5,0xfe,0x29,0x24,0x8a,0xcd,0xae,0x03,0x79,0xff,0x2b,0x17,0x08,0x11,0x9d,0x12,0x37,0x35,0x3a,0x30,0x12,0x00, -0x00,0x03,0x00,0xbc,0x00,0x00,0x07,0x50,0x05,0x9a,0x00,0x0b,0x00,0x0f,0x00,0x17,0x00,0x49,0x40,0x27,0x08,0x04,0x7e,0x05,0x14,0x0e,0x7e,0x0f,0x02,0x01,0x02,0x15,0x0c,0x0c,0x15,0x02,0x01,0x04,0x00,0x05,0x00,0x0e,0x03,0x91,0x14,0x08,0x08,0x01,0x11,0x0a,0x03,0x06,0x03,0x05,0x12,0x0f,0x92,0x01,0x12,0x00,0x3f,0xed,0x3f,0x3f, -0x3f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc5,0xfd,0xcd,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x03,0x21,0x03,0x01,0x23,0x06,0x07,0x03,0x21,0x03,0x26,0x07,0x50,0xfb,0x04,0xfb,0xfe,0x15,0xa8,0xa8,0x02,0x25,0xf1,0xae, -0x01,0x37,0xbe,0xfe,0x5a,0xb8,0x01,0x8d,0x04,0x09,0x0e,0x83,0x01,0x38,0x84,0x09,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xf7,0x01,0xfd,0xfe,0x03,0x04,0x5b,0x37,0x29,0xfe,0x99,0x01,0x67,0x1b,0x00,0x00,0x03,0x00,0xa6,0x00,0x00,0x05,0xd0,0x04,0x00,0x00,0x0b,0x00,0x0f,0x00,0x17,0x00,0x4d,0x40,0x2a,0x08,0x04, -0x84,0x05,0x01,0x02,0x0c,0x13,0x14,0x0d,0x0d,0x14,0x13,0x0c,0x02,0x01,0x06,0x00,0x05,0x00,0x0f,0x96,0x13,0x03,0x95,0x08,0x13,0x08,0x13,0x08,0x01,0x10,0x0a,0x0f,0x06,0x0f,0x05,0x15,0x0c,0x96,0x01,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f, -0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x21,0x03,0x21,0x13,0x06,0x07,0x07,0x33,0x26,0x26,0x27,0x05,0xd0,0xfc,0x43,0xba,0xfe,0x7d,0xa4,0xa4,0x01,0xba,0xa7,0xa1,0xfe,0xa0,0x02,0x05,0x71,0xfe,0xe3,0x8c,0x06,0x18,0x44,0xcb,0x2c,0x2c,0x0c,0x01,0xd1,0xfe, -0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfc,0x7b,0x01,0x44,0x01,0xb8,0x47,0x44,0xb9,0x7b,0x7c,0x4d,0x00,0x00,0x01,0x00,0x1e,0xfe,0x29,0x05,0xfe,0x05,0x9a,0x00,0x1a,0x00,0x2f,0x40,0x17,0x1a,0x7e,0x02,0x00,0x00,0x0b,0x14,0x0b,0x19,0x18,0x01,0x02,0x02,0x12,0x15,0x12,0x12,0x03,0x0e,0x91,0x00,0x08,0x13,0x00,0x3f,0xc6,0xed,0x3f, -0x3f,0x12,0x39,0x11,0x33,0x33,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x06,0x07,0x03,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x23,0x01,0x26,0x27,0x23,0x11,0x03,0x4d,0x05,0x0e,0x1a,0xe0,0x2c,0x8c,0x6d,0x6b,0x85,0x0d,0xa1,0x0d,0x51,0x2c,0x3c,0x1f,0x01,0xb4, -0x9a,0x02,0x0c,0xc0,0xfe,0xe4,0x1d,0x0a,0x05,0xfe,0x29,0x05,0xc9,0x60,0x47,0xfd,0xa3,0x89,0x7e,0x7b,0x80,0x64,0x4b,0x51,0x04,0x80,0xfa,0x66,0x03,0x44,0x5c,0x52,0xfa,0x37,0x00,0x01,0x00,0x05,0xfe,0x29,0x04,0xd0,0x04,0x00,0x00,0x1a,0x00,0x30,0x40,0x18,0x1a,0xef,0x02,0x00,0x00,0x0a,0x14,0x0a,0x19,0x18,0x01,0x02,0x02,0x12, -0x15,0x15,0x12,0x0f,0x0e,0x95,0x08,0x16,0x00,0x1b,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x11,0x33,0x33,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x06,0x07,0x03,0x06,0x06,0x23,0x22,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x26,0x27,0x23,0x11,0x02,0xa3,0x05,0x0f,0x12, -0x81,0x2f,0x78,0x5c,0xd5,0x1f,0x9d,0x05,0x29,0x29,0x27,0x39,0x22,0x01,0x2a,0x9d,0x01,0x8e,0xaa,0xbd,0x1a,0x0b,0x05,0xfe,0x29,0x04,0x86,0x54,0x36,0xfe,0xaf,0x85,0x68,0xeb,0x30,0x2d,0x43,0x56,0x02,0xf2,0xfc,0x00,0x02,0x16,0x58,0x41,0xfb,0x7a,0x00,0x01,0x00,0x3e,0xfe,0x7f,0x05,0x34,0x05,0x9a,0x00,0x0b,0x00,0x2a,0x40,0x15, -0x05,0x7e,0x02,0x02,0x06,0x0b,0x7f,0x00,0x09,0x7e,0x06,0x00,0x0a,0x07,0x03,0x03,0x05,0x01,0x91,0x0a,0x12,0x00,0x3f,0xed,0x32,0x3f,0x33,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x3e,0xc0,0xa8,0x02,0xe6,0xa8,0xfb,0xa5,0xfe,0x7f,0x02,0x19, -0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0x66,0xfe,0x7f,0x00,0x01,0x00,0x3e,0xfe,0x8b,0x04,0x27,0x04,0x00,0x00,0x0b,0x00,0x2a,0x40,0x15,0x05,0x84,0x02,0x02,0x06,0x0b,0xed,0x00,0x09,0x84,0x06,0x00,0x0a,0x07,0x03,0x0f,0x05,0x01,0x95,0x0a,0x15,0x00,0x3f,0xed,0x32,0x3f,0x33,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed, -0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x3e,0x97,0xa4,0x02,0x0a,0xa4,0xfc,0xa4,0xfe,0x8b,0x02,0x00,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x00,0xfe,0x8b,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x06,0xc6,0x05,0x9a,0x00,0x0f,0x00,0x15,0x00,0x3d,0x40,0x1f,0x14,0x07,0x01,0x7e,0x15,0x03,0x7f,0x04,0x15,0x04, -0x15,0x04,0x0e,0x07,0x7f,0x08,0x0e,0x04,0x08,0x06,0x00,0x11,0xee,0x0d,0x03,0x01,0x14,0x09,0x91,0x06,0x12,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x10,0xcd,0x32,0x01,0x2f,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31,0x30,0x01,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21, -0x15,0x21,0x21,0x06,0x02,0x07,0x21,0x04,0x87,0xc1,0x9b,0xfb,0xfd,0x9b,0x6f,0x92,0xc8,0x0c,0x04,0xe2,0xfd,0x19,0xfe,0x94,0x0e,0xb9,0x78,0x02,0xab,0x04,0xfe,0xfb,0x9a,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x0d,0x02,0xba,0x01,0x3b,0x9c,0xe5,0xfd,0x66,0xe7,0x00,0x02,0x00,0x12,0xfe,0x8b,0x05,0x20,0x04,0x00,0x00,0x0f, -0x00,0x15,0x00,0x3d,0x40,0x1f,0x14,0x07,0x01,0x84,0x15,0x03,0xed,0x04,0x15,0x04,0x15,0x04,0x0e,0x07,0xed,0x08,0x0e,0x04,0x08,0x06,0x00,0x11,0x95,0x0d,0x0f,0x01,0x14,0x09,0x95,0x06,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x10,0xcd,0x32,0x01,0x2f,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31, -0x30,0x01,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x35,0x21,0x15,0x21,0x23,0x06,0x02,0x07,0x21,0x03,0x8b,0x98,0x8b,0xfd,0x06,0x8c,0x5b,0x7d,0x8d,0x03,0xa9,0xfd,0xc7,0xe3,0x0a,0x79,0x66,0x01,0xcc,0x03,0x74,0xfd,0x17,0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0xb0,0x01,0xc9,0xfc,0x8c,0xc5,0xfe,0x7d,0xa1, -0x00,0x01,0x00,0x10,0xff,0xe9,0x06,0xe3,0x05,0x9a,0x00,0x17,0x00,0x24,0x40,0x12,0x17,0x7e,0x00,0x00,0x0a,0x14,0x0a,0x16,0x02,0xee,0x13,0x03,0x0e,0x91,0x08,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x21,0x07,0x06,0x02,0x02,0x06,0x23,0x22,0x27,0x35,0x16,0x16, -0x33,0x32,0x36,0x12,0x12,0x13,0x21,0x15,0x21,0x11,0x03,0xfc,0xfe,0x71,0x20,0x1e,0x46,0x57,0x8e,0x6b,0x4d,0x3c,0x12,0x47,0x18,0x44,0x4f,0x4b,0x55,0x2e,0x05,0x01,0xfd,0xc1,0x04,0xfe,0xf9,0xe7,0xfe,0x48,0xfe,0xfa,0x77,0x15,0x9e,0x0b,0x12,0x6e,0x01,0x26,0x02,0x1c,0x01,0x6b,0x9c,0xfb,0x02,0x00,0x00,0x01,0x00,0x10,0xff,0xf2, -0x05,0x26,0x04,0x00,0x00,0x11,0x00,0x24,0x40,0x12,0x11,0x84,0x00,0x00,0x07,0x0e,0x07,0x10,0x02,0x95,0x0d,0x0f,0x0a,0x95,0x05,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x13,0x21,0x15,0x21,0x11,0x02,0xee, -0xee,0x28,0xc1,0xaf,0x38,0x20,0x1f,0x2d,0x6d,0x8b,0x23,0x03,0xaf,0xfe,0x6b,0x03,0x74,0xfe,0x21,0xfe,0x5d,0x0e,0x8d,0x12,0x01,0xbf,0x01,0xc6,0x8c,0xfc,0x8c,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x08,0xb1,0x05,0x9a,0x00,0x1f,0x00,0x3f,0x40,0x1f,0x07,0x06,0x03,0x01,0x7e,0x02,0x02,0x14,0x1e,0x10,0x13,0x7e,0x14,0x00,0xee,0x1d, -0x1d,0x15,0x0f,0x07,0x06,0x10,0x19,0x10,0x14,0x15,0x03,0x0c,0x02,0x14,0x12,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x39,0x11,0x33,0x33,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x32,0x2f,0x12,0x39,0x2f,0xed,0x33,0x33,0x33,0x31,0x30,0x01,0x11,0x23,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15, -0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x01,0x21,0x15,0x06,0x72,0xa7,0x02,0x0c,0x04,0x0d,0x10,0x0e,0xfe,0x16,0x52,0xfe,0x17,0x13,0x17,0x05,0x08,0xa2,0xde,0x01,0xb8,0x31,0x11,0x06,0x29,0x1a,0x01,0xc4,0x03,0x10,0x04,0xfe,0xfb,0x02,0x03,0xc2,0x20,0x39,0xbe,0x2e,0x3f,0x1e,0xfb,0xb2,0x04,0x46,0x2d,0x66,0x6a,0xaf, -0xfc,0x40,0x05,0x9a,0xfc,0x18,0x70,0x3c,0x70,0x3c,0x03,0xe8,0x9c,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0x8d,0x04,0x00,0x00,0x17,0x00,0x34,0x40,0x1a,0x17,0x84,0x00,0x00,0x0a,0x14,0x09,0xed,0x0a,0x16,0x95,0x13,0x13,0x0b,0x01,0x08,0x0f,0x08,0x0a,0x0b,0x0f,0x00,0x0a,0x15,0x05,0x15,0x00,0x3f,0x3f,0x33,0x3f,0x12,0x39,0x39, -0x11,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x06,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x21,0x15,0x21,0x11,0x04,0x56,0x10,0x26,0xfe,0xf2,0x93,0xfe,0xf8,0x2d,0x17,0x8d,0xd1,0x01,0x0e,0x3e,0x0a,0x04,0x0f,0x26,0x01,0x18,0x02,0x6f, -0xfe,0x6b,0x03,0x4c,0x2f,0x6a,0xfd,0x4d,0x02,0x90,0x74,0x48,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x9a,0x2f,0x39,0x5d,0x02,0xcf,0x8c,0xfc,0x8c,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x28,0x40,0x14,0x15,0x7d,0x09,0x21,0x1b,0x7d,0x03,0x0f,0x00,0x06,0x06,0x0c,0x18,0x91,0x12,0x04, -0x1e,0x91,0x0c,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01,0x2f,0xc4,0xed,0x2f,0xc6,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x02,0x30,0x41,0x42,0x31, -0x30,0x42,0x41,0x37,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x23,0x01,0x71,0xfe,0x89,0xfe,0xd7,0xe1,0xfe,0xe5,0x01,0x0f,0xe1,0xef,0x01,0x0d,0xfe,0xf5,0x02,0x70,0x3c,0x30,0x2b,0x3e,0x39,0x30,0x2e,0x3e,0xfd,0x78,0x01,0x90,0x01,0x44,0x01,0x5a,0x01,0x9c,0xfe,0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x05,0x32,0xfe,0xbb,0xfe, -0xf6,0xfe,0xfb,0xfe,0xb9,0x01,0x36,0x01,0x13,0x01,0x20,0x01,0x32,0x00,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x24,0x00,0x28,0x40,0x14,0x15,0x83,0x09,0x22,0x1c,0x83,0x03,0x0f,0x00,0x06,0x06,0x0c,0x19,0x95,0x12,0x10,0x1f,0x95,0x0c,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01, -0x2f,0xc4,0xed,0x2f,0xc6,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x12,0x17,0x14,0x06,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x58,0x29,0x38,0x3a,0x27,0x2a,0x37,0x35,0x32,0xe7,0xfe,0xf5,0x01,0x1c,0xee,0xe6,0xfe,0x02, -0x83,0xe1,0x8e,0x9e,0xb8,0xb6,0xa0,0xa0,0xaa,0xac,0x01,0xaa,0x38,0x2a,0x2d,0x32,0x37,0x28,0x27,0x3b,0xfe,0x3e,0x01,0x23,0xe9,0x01,0x04,0x01,0x20,0xfe,0xe6,0xfa,0xaa,0xf1,0x81,0x03,0xa6,0xd7,0xbd,0xb2,0xd6,0xd0,0xbc,0xc2,0xce,0x00,0x00,0x04,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f, -0x00,0x32,0x40,0x19,0x2d,0x27,0x15,0x7d,0x21,0x1b,0x7d,0x09,0x03,0x0f,0x24,0x00,0x00,0x2a,0x06,0x06,0x0c,0x18,0x91,0x12,0x04,0x1e,0x91,0x0c,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xc4,0xc4,0xed,0x2f,0xed,0xc4,0xc6,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x13,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x34,0x2c,0x3d,0x3e,0x2d,0x30,0x3a,0x3c,0x9a,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x23,0x01,0x71,0xfe,0x89,0xfe,0xd7,0xe1,0xfe, -0xe5,0x01,0x0f,0xe1,0xef,0x01,0x0d,0xfe,0xf5,0x1e,0x2c,0x3d,0x3e,0x2d,0x30,0x3a,0x3c,0x02,0x70,0x3c,0x30,0x2e,0x3b,0x3e,0x2b,0x2d,0x3f,0xfd,0x78,0x01,0x90,0x01,0x44,0x01,0x5a,0x01,0x9c,0xfe,0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x05,0x32,0xfe,0xbb,0xfe,0xf6,0xfe,0xfb,0xfe,0xb9,0x01,0x36,0x01,0x13,0x01,0x20,0x01,0x32,0xfd, -0x56,0x3c,0x30,0x2e,0x3b,0x3e,0x2b,0x2d,0x3f,0x00,0x00,0x04,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x32,0x40,0x19,0x2e,0x28,0x15,0x83,0x09,0x22,0x1c,0x83,0x03,0x0f,0x25,0x00,0x00,0x2b,0x06,0x06,0x0c,0x19,0x95,0x12,0x10,0x1f,0x95,0x0c,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39, -0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xc4,0xed,0x2f,0xc4,0xed,0xc4,0xc6,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x12,0x17,0x14,0x06,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14, -0x06,0x01,0xc9,0x28,0x34,0x37,0x25,0x25,0x38,0x37,0x63,0xe7,0xfe,0xf5,0x01,0x1c,0xee,0xe6,0xfe,0x02,0x83,0xe1,0x8e,0x9e,0xb8,0xb6,0xa0,0xa0,0xaa,0xac,0x16,0x28,0x34,0x37,0x25,0x25,0x38,0x37,0x01,0xaf,0x37,0x26,0x2b,0x30,0x31,0x2a,0x28,0x35,0xfe,0x39,0x01,0x23,0xe9,0x01,0x04,0x01,0x20,0xfe,0xe6,0xfa,0xaa,0xf1,0x81,0x03, -0xa6,0xd7,0xbd,0xb2,0xd6,0xd0,0xbc,0xc2,0xce,0xfe,0x21,0x37,0x26,0x2b,0x30,0x31,0x2a,0x28,0x35,0x00,0x00,0x05,0x00,0x5e,0xff,0xe8,0x09,0x58,0x05,0xb2,0x00,0x1d,0x00,0x2b,0x00,0x37,0x00,0x43,0x00,0x4f,0x00,0x3f,0x40,0x20,0x21,0x7d,0x35,0x35,0x0c,0x4d,0x47,0x1a,0x7d,0x28,0x41,0x3b,0x2f,0x7d,0x0c,0x44,0x38,0x38,0x4a,0x3e, -0x3e,0x09,0x1e,0x2c,0x91,0x0f,0x04,0x25,0x32,0x91,0x09,0x13,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xed,0xc4,0xc4,0x2f,0xed,0xc4,0xc6,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x27,0x23,0x06,0x07,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x04,0x17,0x33,0x3e,0x02,0x33, -0x20,0x00,0x11,0x10,0x07,0x06,0x01,0x22,0x02,0x11,0x14,0x12,0x16,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x21,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x35,0x10,0x02,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0xe8,0x7b,0xc7,0x98,0x2f,0x08,0x27, -0x36,0x9e,0xfe,0xe7,0xfe,0xea,0xfe,0xb1,0x01,0x55,0x01,0x26,0xb8,0x01,0x0a,0x3e,0x08,0x24,0x9d,0xd9,0x83,0x01,0x0e,0x01,0x4c,0xaa,0xa8,0xfe,0xed,0xca,0xf6,0x69,0xc2,0x8a,0xcd,0xf3,0x67,0xc5,0xfb,0x52,0xc8,0xf8,0xf4,0xc1,0xdb,0xe5,0xef,0xcd,0x2d,0x3c,0x40,0x2a,0x2b,0x40,0x3d,0x03,0xf6,0x2b,0x3e,0x3f,0x2b,0x2b,0x40,0x3c, -0x18,0x4e,0x9d,0x7b,0x68,0x3d,0xc1,0x01,0x91,0x01,0x44,0x01,0x59,0x01,0x9c,0xbb,0xa6,0x66,0xa8,0x53,0xfe,0x70,0xfe,0xbd,0xfe,0x9f,0xca,0xcc,0x05,0x32,0xfe,0xb7,0xfe,0xfc,0xac,0xfe,0xf5,0x97,0x01,0x2e,0x01,0x1b,0xbb,0x01,0x0a,0x8d,0xfe,0xba,0xfe,0xf7,0xfe,0xf3,0xfe,0xc1,0x01,0x41,0xfe,0x01,0x2f,0x01,0x2d,0xfd,0x56,0x3f, -0x2d,0x30,0x39,0x39,0x30,0x2e,0x3e,0x3b,0x31,0x30,0x39,0x39,0x30,0x2e,0x3e,0x00,0x00,0x05,0x00,0x60,0xff,0xe8,0x06,0xdc,0x04,0x18,0x00,0x1b,0x00,0x28,0x00,0x34,0x00,0x40,0x00,0x4c,0x00,0x4b,0x40,0x28,0x3e,0x83,0x38,0x20,0x83,0x32,0x4a,0x83,0x44,0x38,0x32,0x44,0x44,0x32,0x38,0x03,0x0c,0x19,0x83,0x26,0x2c,0x83,0x0c,0x41, -0x35,0x35,0x47,0x3b,0x3b,0x08,0x1c,0x29,0x95,0x0f,0x10,0x23,0x2f,0x95,0x08,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x00, -0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x12,0x17,0x14,0x02,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x0e, -0x57,0x89,0x6d,0x25,0x04,0x2a,0xbe,0x8c,0x86,0xc6,0x78,0x01,0x08,0xd1,0x84,0xbd,0x29,0x04,0x32,0xc4,0x86,0xca,0xee,0x01,0xfb,0xc9,0x5f,0x86,0x41,0x99,0x8d,0x88,0x94,0x94,0xfc,0x8e,0x85,0xa1,0x9d,0x89,0x84,0x98,0x95,0x8c,0x24,0x34,0x32,0x26,0x23,0x35,0x32,0x02,0xc4,0x25,0x33,0x32,0x26,0x23,0x35,0x32,0x18,0x32,0x66,0x57, -0x71,0x7e,0x7a,0xea,0xa8,0x01,0x0b,0x01,0x19,0x7e,0x70,0x75,0x79,0xfe,0xe2,0xf6,0xf5,0xfe,0xd9,0x03,0xa6,0x6b,0xad,0x78,0xb2,0xda,0xce,0xbe,0xc2,0xce,0xd3,0xc1,0xb5,0xd3,0xc8,0xc9,0xbb,0xd0,0xfe,0x1c,0x38,0x2a,0x2a,0x35,0x33,0x2c,0x29,0x39,0x39,0x29,0x2a,0x35,0x33,0x2c,0x29,0x39,0x00,0x0f,0x00,0x7e,0xff,0xe7,0x05,0xd7, -0x05,0xb3,0x00,0x2a,0x00,0x36,0x00,0x42,0x00,0x4e,0x00,0x5a,0x00,0x66,0x00,0x72,0x00,0x7e,0x00,0x8a,0x00,0x96,0x00,0xa2,0x00,0xae,0x00,0xba,0x00,0xc6,0x00,0xd2,0x01,0x3c,0xb1,0xbe,0x82,0xb8,0x01,0x04,0x40,0x0f,0x0f,0x09,0x07,0x11,0x07,0x58,0x7f,0x52,0x34,0x64,0x7f,0x5e,0x2e,0x5e,0xa6,0xb8,0x01,0x04,0xb4,0xa0,0x16,0x02, -0xca,0x8e,0xb8,0x01,0x04,0x40,0x0d,0x88,0xc4,0x88,0x4c,0x7f,0x46,0x40,0x7c,0x7f,0x76,0x3a,0x76,0xb2,0xb8,0x01,0x04,0xb4,0xac,0x1d,0x26,0x1b,0x28,0xb8,0x01,0x04,0x40,0x1d,0x94,0xd0,0x94,0x70,0x7f,0x6a,0x07,0x52,0x5e,0xa0,0x88,0x46,0x76,0xac,0x94,0x6a,0x6a,0x94,0xac,0x76,0x46,0x88,0xa0,0x5e,0x52,0x07,0x0a,0x0c,0x21,0xbb, -0x01,0x04,0x00,0xb8,0x00,0x9a,0x01,0x04,0xb2,0x0c,0xc7,0xbb,0xb8,0x01,0x05,0x40,0x0c,0x14,0x73,0x5b,0xee,0x61,0x79,0x61,0x8b,0x7f,0x26,0x25,0x09,0xb8,0x01,0x05,0x40,0x0f,0x9d,0xb5,0x9d,0x67,0x43,0x4f,0xee,0x55,0x6d,0x49,0x55,0xcd,0xc1,0xaf,0x97,0xb8,0x01,0x05,0x40,0x2a,0x0f,0x1e,0x1d,0x0f,0x37,0x2b,0xee,0x31,0x3d,0x31, -0x80,0x55,0x01,0x02,0x61,0x7f,0x9d,0xa9,0x55,0xa3,0xc1,0x0f,0x31,0x16,0x16,0x31,0x0f,0xc1,0xa3,0x55,0xa9,0x9d,0x7f,0x61,0x02,0x0b,0x04,0x18,0x14,0x04,0x91,0x85,0xb8,0x01,0x05,0xb2,0x00,0x04,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x10, -0xed,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xfd,0x32,0xcd,0x32,0x10,0xed,0x11,0x33, -0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x10,0xfd,0x32,0xcd,0x32,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x10,0xcd,0x32,0xed,0x32,0x31,0x30,0x05,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x37,0x32,0x16,0x15, -0x14,0x06,0x07,0x23,0x27,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34, -0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xe2,0x8f,0x45,0x45,0x8b,0x78,0x94,0x27,0x65,0x76,0x74,0x66,0x26,0x91, -0x7e,0x8a,0x43,0x47,0x8f,0x7a,0x88,0x23,0x1c,0x6f,0x89,0x80,0x6e,0x13,0x14,0x24,0x89,0xfd,0xdc,0x1d,0x2c,0x2b,0x1e,0x1f,0x2d,0x2b,0x01,0x83,0x1d,0x2c,0x2c,0x1d,0x1e,0x2e,0x2b,0xd5,0x1d,0x2c,0x2c,0x1d,0x1d,0x2f,0x2c,0xfe,0x3c,0x1d,0x2d,0x2d,0x1d,0x1e,0x2e,0x2c,0x94,0x1d,0x2c,0x2d,0x1c,0x1e,0x2e,0x2b,0x02,0x73,0x1d,0x2c, -0x2c,0x1d,0x20,0x2b,0x2b,0xfe,0xf0,0x1d,0x2c,0x2b,0x1e,0x1e,0x2e,0x2b,0xfe,0x3b,0x46,0x54,0x56,0x48,0x4b,0x4f,0x4f,0x01,0x55,0x47,0x54,0x57,0x48,0x49,0x51,0x50,0xfd,0x5a,0x47,0x54,0x56,0x49,0x48,0x51,0x50,0x01,0x57,0x47,0x54,0x55,0x4a,0x48,0x51,0x51,0x01,0x58,0x46,0x55,0x56,0x48,0x49,0x51,0x4e,0xfd,0x1d,0x46,0x54,0x56, -0x48,0x49,0x51,0x50,0x01,0x56,0x47,0x54,0x56,0x49,0x49,0x51,0x50,0x19,0x65,0x65,0x9e,0x84,0x60,0x44,0x0f,0x99,0x76,0x77,0x9b,0x11,0x41,0x5d,0x86,0xa1,0x66,0x66,0x9e,0x8a,0x5c,0x41,0x02,0x9f,0x87,0x80,0x98,0x07,0x01,0x44,0x60,0x83,0x9e,0x04,0x5f,0x2a,0x25,0x22,0x2b,0x28,0x25,0x22,0x2d,0x2b,0x24,0x24,0x29,0x28,0x25,0x22, -0x2d,0xfe,0x3e,0x2a,0x26,0x24,0x29,0x27,0x26,0x22,0x2e,0x2b,0x25,0x22,0x2b,0x28,0x25,0x23,0x2d,0xfe,0x3f,0x2b,0x24,0x25,0x28,0x28,0x25,0x22,0x2d,0x01,0xc1,0x2c,0x24,0x23,0x2a,0x2a,0x23,0x23,0x2d,0xfe,0x3f,0x2b,0x24,0x22,0x2b,0x27,0x26,0x22,0x2d,0x01,0x09,0x69,0x59,0x5a,0x65,0x66,0x5a,0x5a,0x67,0x6a,0x59,0x59,0x65,0x64, -0x5c,0x5c,0x65,0x01,0xc2,0x6a,0x58,0x58,0x67,0x64,0x5b,0x5d,0x65,0x69,0x59,0x5a,0x65,0x63,0x5c,0x5f,0x63,0x6a,0x58,0x5a,0x65,0x64,0x5c,0x59,0x68,0x01,0xc2,0x69,0x5a,0x5a,0x65,0x64,0x5c,0x5b,0x67,0x6a,0x59,0x5a,0x65,0x64,0x5c,0x5c,0x66,0x00,0x00,0x01,0xfe,0xc2,0x04,0xd3,0x01,0x3e,0x05,0x87,0x00,0x0f,0x00,0x1a,0x40,0x0a, -0x0b,0x0c,0x03,0x04,0x00,0x40,0x07,0x80,0x0c,0x04,0x00,0x2f,0x33,0x1a,0xdd,0x1a,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x03,0x22,0x15,0x15,0x23,0x35,0x34,0x33,0x21,0x32,0x15,0x15,0x23,0x35,0x34,0x23,0x70,0x42,0x8c,0x7a,0x01,0x88,0x7a,0x8b,0x42,0x05,0x20,0x31,0x1c,0x2e,0x86,0x88,0x2c,0x1c,0x31,0x00,0x00,0x08,0x00,0x6f, -0xfe,0xb6,0x07,0x72,0x05,0xf8,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b,0x00,0x47,0x00,0x53,0x00,0x5f,0x00,0x39,0x40,0x1b,0x35,0x59,0x5b,0x37,0x5b,0x29,0x4d,0x4f,0x2b,0x4f,0x1d,0x41,0x43,0x1f,0x43,0x5b,0x4f,0x43,0x43,0x4f,0x5b,0x03,0x07,0x11,0x13,0x05,0x07,0x00,0x2f,0xce,0x2f,0xce,0x12,0x17,0x39,0x2f,0x2f,0x2f, -0x11,0x33,0x10,0xce,0x32,0x11,0x33,0x10,0xce,0x32,0x11,0x33,0x10,0xce,0x32,0x31,0x30,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x03,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x13,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37, -0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x13,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x04,0x1d,0x7e,0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x87,0x7e, -0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x01,0xa4,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0x1c,0x7e,0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0xfe,0xdf,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0xfb,0x1c,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0xfe,0xd4,0x7e, -0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x27,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0x05,0x30,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xf9,0x78,0xba,0x7b,0x7b,0xba,0xc7,0x88,0x88,0x04,0x63,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xfc,0xee,0xb9,0x7b,0x7b,0xb9,0xc8,0x88,0x88,0xfc,0xed,0xba,0x7c,0x7c,0xba, -0xc8,0x89,0x89,0x03,0xcd,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xfc,0xee,0xb9,0x7b,0x7b,0xb9,0xc8,0x88,0x88,0xfc,0xed,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0x00,0x02,0x01,0x13,0xfe,0x52,0x06,0xce,0x06,0x5b,0x00,0x07,0x00,0x0f,0x00,0x40,0xb1,0x05,0x0b,0xb8,0x01,0x04,0xb3,0x06,0x08,0x01,0x0f,0xb8,0x01,0x04,0x40,0x0c,0x02,0x0c, -0x0d,0x09,0x02,0x06,0x09,0x06,0x09,0x06,0x07,0x0b,0xbc,0x01,0x05,0x00,0x08,0x00,0x04,0x01,0x05,0x00,0x07,0x00,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x19,0x02,0x33,0x11,0x21,0x11,0x33,0x11,0x06,0xce,0x60, -0xfb,0x09,0x64,0x64,0x04,0xf7,0x60,0x06,0x5b,0xfe,0x26,0x01,0x80,0xfe,0x80,0x01,0xda,0xf7,0xf7,0x01,0xda,0xfe,0x80,0x01,0x80,0xfe,0x26,0x00,0x00,0x0a,0x00,0x26,0xfe,0x52,0x07,0xbb,0x06,0x5b,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0xae,0xb3,0x28,0x10,0x14, -0x2f,0xb8,0x01,0x04,0xb3,0x2c,0x0b,0x07,0x0f,0xb8,0x01,0x04,0xb4,0x0c,0x04,0x00,0x0c,0x1b,0xb8,0x01,0x04,0x40,0x1f,0x18,0x25,0x1d,0x21,0x14,0x2c,0x02,0x0c,0x09,0x18,0x21,0x21,0x18,0x09,0x0c,0x02,0x2c,0x14,0x07,0x11,0x24,0x20,0x1c,0x29,0x15,0x11,0x19,0x0d,0x2d,0x22,0x16,0xb8,0x01,0x05,0xb4,0x15,0x21,0x15,0x26,0x2a,0xb8, -0x01,0x05,0xb4,0x29,0x25,0x29,0x1e,0x12,0xb8,0x01,0x05,0x40,0x12,0x11,0x1d,0x11,0x2d,0x15,0x29,0x11,0x11,0x29,0x15,0x2d,0x04,0x03,0x18,0x0c,0x2c,0x0a,0x02,0xb8,0x01,0x05,0xb1,0x07,0x03,0x00,0x2f,0x33,0xed,0x32,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33, -0x10,0xed,0x32,0x11,0x33,0x33,0x01,0x2f,0x33,0x33,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x10,0xed,0x11,0x33,0x33,0x31,0x30,0x01,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x03,0x11,0x33,0x11,0x01,0x21,0x35,0x21,0x11,0x21, -0x35,0x21,0x01,0x11,0x33,0x11,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x05,0x21,0x35,0x21,0x13,0x11,0x33,0x11,0x03,0xbd,0xc0,0xc0,0x64,0xb6,0xb6,0x64,0x64,0xfd,0xd5,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0x03,0x61,0x64,0x02,0x00,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0xfa,0x3b, -0xfe,0x30,0x01,0xd0,0x2d,0x64,0x04,0x8b,0xb6,0x64,0xb6,0xb6,0x64,0xb6,0xf9,0xc7,0x01,0xd0,0xfe,0x30,0x05,0x6c,0x64,0xfc,0x68,0x64,0xfd,0x64,0x01,0xd0,0xfe,0x30,0x05,0x6c,0x64,0xfc,0x68,0x64,0x01,0x36,0x64,0x64,0x64,0xfb,0xca,0x01,0xd0,0xfe,0x30,0x00,0x00,0x02,0x00,0x7d,0x02,0xaf,0x03,0x54,0x05,0xeb,0x00,0x0b,0x00,0x17, -0x00,0x64,0xb2,0x16,0x0c,0x17,0xb8,0x01,0x00,0xb5,0x00,0x14,0x0e,0x12,0x10,0x06,0xb8,0x01,0x00,0x40,0x23,0x11,0x00,0x0e,0x11,0x11,0x0e,0x00,0x03,0x01,0x07,0x05,0x0b,0x01,0x0f,0x0c,0x0b,0x08,0x0b,0x13,0x16,0x01,0x04,0x01,0x0e,0x09,0x0b,0x14,0x01,0x0b,0x01,0x0b,0x01,0x03,0x09,0x03,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f, -0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x01,0x2f,0x33,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xfd,0xc5,0x32,0x11,0x33,0x10,0xed,0xc5,0x32,0x31,0x30,0x13,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x23,0x07,0x27,0x23,0x37,0x33,0x17,0x37,0x33,0x27,0x37,0x23,0x27,0x07,0x23,0x17,0xfa,0x7d, -0xf9,0x73,0x74,0xf7,0x7c,0x7c,0xf8,0x73,0x73,0xf7,0x69,0xb1,0x50,0x50,0xb0,0x58,0x58,0xb0,0x50,0x51,0xb0,0x58,0x04,0x4e,0xd5,0xc8,0xc8,0xd6,0xd6,0xc8,0xc8,0x3d,0x8b,0x8b,0x99,0x99,0x8b,0x8b,0x99,0x00,0x00,0x01,0xfe,0x9c,0x04,0xc2,0x01,0x64,0x05,0xf2,0x00,0x0d,0x00,0x13,0xb6,0x0a,0x04,0x0a,0x04,0x80,0x00,0x07,0x00,0x2f, -0xc9,0x1a,0xcd,0x32,0x01,0x2f,0x2f,0x31,0x30,0x03,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x01,0x4e,0x6c,0x09,0xa2,0x0f,0xc2,0x97,0x9c,0xbb,0x09,0xa2,0x12,0xae,0x05,0x36,0x67,0x55,0x8c,0xa4,0xa5,0x8b,0xbc,0x00,0x01,0xff,0x33,0x04,0x80,0x00,0xce,0x05,0xbe,0x00,0x12,0x00,0x26,0x40,0x10,0x01,0x01, -0x06,0x11,0x00,0x00,0x09,0x06,0x0c,0x40,0x03,0x03,0x10,0x08,0x80,0x00,0x00,0x2f,0x1a,0xcc,0x32,0x39,0x2f,0x1a,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0x12,0x39,0x2f,0x31,0x30,0x13,0x37,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x33,0x03,0x0e,0x1b,0x41,0x35,0x39,0x47,0x76,0x1c,0x1f,0x1d,0x27, -0x15,0x18,0x79,0x46,0x04,0x80,0x77,0x1f,0x46,0x48,0x58,0x3c,0x26,0x21,0x0e,0x09,0x6c,0xfe,0xc2,0x00,0x00,0x01,0x00,0xfc,0x04,0xc2,0x03,0xc4,0x05,0xf2,0x00,0x0d,0x00,0x11,0xb5,0x0a,0x04,0x00,0x07,0x0a,0x04,0x00,0x2f,0x33,0x2f,0xc9,0x01,0x2f,0x2f,0x31,0x30,0x01,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16, -0x33,0x02,0x5f,0x4e,0x6c,0x09,0xa2,0x0f,0xc2,0x97,0x9c,0xbb,0x09,0xa2,0x12,0xae,0x05,0x36,0x67,0x55,0x8c,0xa4,0xa5,0x8b,0xbc,0x00,0x00,0x01,0x01,0x33,0x04,0x80,0x02,0xce,0x05,0xbe,0x00,0x12,0x00,0x26,0x40,0x10,0x01,0x01,0x06,0x11,0x00,0x00,0x09,0x06,0x0c,0x40,0x03,0x03,0x10,0x08,0x80,0x00,0x00,0x2f,0x1a,0xcc,0x32,0x39, -0x2f,0x1a,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0x12,0x39,0x2f,0x31,0x30,0x01,0x37,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x33,0x03,0x02,0x0f,0x1a,0x41,0x35,0x39,0x47,0x76,0x1c,0x1f,0x1e,0x26,0x15,0x18,0x79,0x46,0x04,0x80,0x77,0x1f,0x46,0x48,0x58,0x3c,0x26,0x21,0x0e,0x09,0x6c,0xfe,0xc2, -0x00,0x02,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x06,0xa2,0x00,0x10,0x00,0x16,0x00,0x42,0x40,0x22,0x15,0x03,0x0c,0x7f,0x09,0x0e,0x7e,0x16,0x09,0x16,0x09,0x16,0x00,0x03,0x7f,0x04,0x10,0x7f,0x00,0x0a,0x0c,0x00,0x04,0x02,0x12,0x91,0x0c,0x03,0x0e,0x15,0x05,0x91,0x02,0x12,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x10,0xcd,0x32,0x10,0xcd, -0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x11,0x35,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x21,0x06,0x02,0x07,0x21,0x04,0xad,0xfb,0xfd,0x9b,0x6f,0xa4,0xc2,0x90,0x02,0x13,0xc1,0xfe,0x97,0xfe,0x94,0x11,0xb6,0x78,0x02,0xab,0xfe,0x7f, -0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x31,0x02,0xdb,0x01,0x11,0xed,0xfe,0xf8,0xfa,0xfe,0xfd,0xe7,0x06,0x83,0xf6,0xfd,0x7c,0xf0,0x00,0x00,0x02,0x00,0x12,0xfe,0x8b,0x04,0x23,0x05,0x0e,0x00,0x10,0x00,0x15,0x00,0x40,0x40,0x21,0x14,0x0c,0xed,0x09,0x0e,0x84,0x15,0x09,0x15,0x09,0x15,0x00,0x03,0xed,0x04,0x10,0xed,0x00,0x0a,0x0c, -0x00,0x04,0x02,0x12,0x95,0x0c,0x0f,0x0e,0x14,0x05,0x95,0x02,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x10,0xcd,0x32,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0xc4,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x11,0x35,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x23,0x02,0x03,0x21, -0x03,0x98,0xfd,0x06,0x8c,0x5c,0x88,0x81,0x90,0x01,0x84,0x98,0xfe,0xc4,0xe3,0x20,0xc9,0x01,0xcc,0xfe,0x8b,0x01,0x75,0xfe,0x8b,0x02,0x00,0xcf,0x01,0xad,0x01,0x15,0xf2,0xfe,0xf2,0xfc,0x8b,0xfe,0x00,0x04,0xea,0xfe,0x4d,0xfe,0xc9,0x00,0x00,0x01,0x00,0x79,0xfe,0x29,0x03,0xde,0x05,0xb2,0x00,0x22,0x00,0x28,0x40,0x15,0x22,0x16, -0x7d,0x0b,0x11,0x1d,0x7d,0x05,0x11,0x16,0x05,0x00,0x04,0x0e,0x02,0x91,0x20,0x13,0x91,0x0e,0x04,0x00,0x3f,0xed,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0xc4,0x31,0x30,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x02, -0x15,0x14,0x04,0x23,0x22,0x27,0x79,0xb7,0xca,0x93,0xa1,0x87,0xc8,0xbf,0xa5,0x01,0x0f,0xe3,0xa5,0x90,0x9e,0xa8,0x88,0xa9,0xa3,0x95,0x98,0x9b,0x48,0xfe,0xf6,0xf4,0xcc,0x9b,0xbf,0x81,0xa4,0x94,0x7d,0xbf,0x8b,0x83,0xff,0x9e,0xd4,0xff,0x33,0xbd,0x58,0xa9,0x89,0x7f,0xd0,0x5e,0x61,0xa0,0xb7,0x76,0xe7,0xfd,0x52,0x00,0x00,0x01, -0x00,0x67,0xfe,0x29,0x03,0x0f,0x04,0x18,0x00,0x23,0x00,0x29,0x40,0x16,0x23,0x18,0x83,0x0c,0x13,0x1e,0x83,0x06,0x13,0x18,0x06,0x00,0x04,0x10,0x03,0x95,0x21,0x1b,0x15,0x95,0x10,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0xc4,0x31,0x30,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26, -0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x67,0x3d,0x9b,0x50,0x64,0x74,0x6d,0x7d,0x8e,0x85,0x61,0xb3,0x74,0x8e,0x60,0x72,0x88,0x63,0x71,0x62,0x76,0xa0,0x85,0xda,0xbb,0x9b,0x77,0xea,0x2e,0x35,0x7c,0x74,0x5d,0x93,0x4b,0x53,0xd5,0x8d,0x70, -0xb3,0x62,0x2e,0xa6,0x4a,0x81,0x72,0x63,0x90,0x48,0x63,0xc3,0x83,0xb5,0xd9,0x3d,0x00,0x01,0x00,0x60,0xff,0xe8,0x08,0x9a,0x05,0xb2,0x00,0x34,0x00,0x72,0x40,0x3e,0x28,0x7d,0x1d,0x2b,0x08,0x7d,0x06,0x15,0x2f,0x03,0x7e,0x04,0x2c,0x04,0x22,0x18,0x1d,0x15,0x04,0x33,0x32,0x32,0x33,0x04,0x15,0x1d,0x18,0x22,0x07,0x0e,0x34,0x0e, -0x33,0x2f,0x02,0x2f,0x02,0x06,0x18,0x92,0x2b,0x0f,0x04,0x22,0x2d,0x19,0x19,0x04,0x31,0x2d,0x03,0x20,0x92,0x25,0x04,0x12,0x92,0x0c,0x13,0x00,0x04,0x12,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x33,0xed,0x32,0x32,0x33,0x11,0x12,0x39,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, -0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0xed,0xc4,0x10,0xed,0x31,0x30,0x21,0x01,0x23,0x11,0x23,0x11,0x21,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x11,0x33,0x11, -0x33,0x01,0x33,0x01,0x01,0x07,0xb0,0xfd,0xd7,0x2b,0xa8,0xfe,0x9d,0x91,0x7c,0xed,0xa2,0xf6,0x81,0x55,0xc7,0x61,0x9e,0xb4,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x94,0x7c,0xb9,0xa5,0xa3,0xc9,0xcc,0xea,0x54,0x45,0x01,0x9d,0xa8,0x2b,0x02,0x17,0xd1,0xfd,0xa1,0x02,0x8a,0x02,0xa0,0xfd,0x60,0x02,0xa0,0x5f,0xab,0x80,0xc3,0x6b,0x54,0xb6, -0x40,0x3b,0x96,0x7f,0x01,0x14,0x8b,0x8c,0x7c,0x6f,0x7f,0x71,0xaa,0x58,0xbf,0xa1,0x64,0x9a,0x29,0x02,0x6f,0xfd,0x91,0x02,0x6f,0xfd,0x59,0xfd,0x0d,0x00,0x00,0x01,0x00,0x50,0xff,0xe7,0x07,0x39,0x04,0x19,0x00,0x31,0x00,0x6f,0x40,0x3c,0x30,0x1d,0x84,0x13,0x20,0x00,0x84,0x0b,0x24,0x2d,0x84,0x2e,0x21,0x2e,0x0e,0x13,0x0b,0x2e, -0x28,0x27,0x27,0x28,0x2e,0x0b,0x13,0x0e,0x06,0x05,0x29,0x18,0x05,0x28,0x2c,0x24,0x24,0x2c,0x30,0x0e,0x95,0x20,0x06,0x2e,0x18,0x0f,0x0f,0x22,0x2a,0x2e,0x15,0x26,0x22,0x0f,0x16,0x95,0x1b,0x10,0x09,0x95,0x03,0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x39,0x12,0x39,0x33,0xed,0x32,0x32,0x33,0x11,0x12, -0x39,0x01,0x2f,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0xcd,0x10,0xfd,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x21,0x11,0x33,0x11, -0x33,0x01,0x33,0x01,0x01,0x23,0x01,0x23,0x11,0x23,0x11,0x21,0x16,0x03,0x3b,0xe0,0xc8,0xde,0x65,0x3a,0xab,0x54,0x01,0x0f,0xfe,0xd7,0x65,0x60,0x84,0x81,0x76,0x6a,0x95,0x96,0xa1,0x97,0x01,0x76,0x35,0x2c,0x01,0x36,0xa4,0x2a,0x01,0x88,0xd7,0xfe,0x29,0x01,0xfc,0xe6,0xfe,0x62,0x2a,0xa4,0xfe,0xf6,0x5e,0x01,0x19,0x8c,0xa6,0x36, -0xa1,0x23,0x28,0xac,0xaa,0x8b,0x4f,0x53,0x46,0x51,0x4b,0x99,0x3e,0xfe,0xed,0x3f,0x53,0x20,0x01,0xac,0xfe,0x54,0x01,0xac,0xfe,0x16,0xfd,0xea,0x01,0xc9,0xfe,0x37,0x01,0xc9,0x40,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0xc6,0x05,0x9a,0x00,0x20,0x00,0x38,0x40,0x1c,0x19,0x7e,0x16,0x14,0x14,0x00,0x0f,0x7e,0x0c,0x20,0x7e,0x1d, -0x00,0x1b,0x11,0x91,0x03,0x01,0x05,0x0d,0x09,0x09,0x1e,0x17,0x0d,0x03,0x00,0x12,0x00,0x3f,0x3f,0x33,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x22,0x27,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x37,0x26,0x35, -0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x06,0x1e,0xc3,0xa9,0xc3,0x5b,0x68,0x79,0x7c,0x41,0x9f,0xb1,0xa8,0xc9,0x4d,0xba,0x4d,0x09,0xa8,0xc9,0x96,0xb5,0xa8,0x02,0x85,0x79,0x95,0x3f,0x36,0x20,0xc1,0xad,0x02,0x20,0xfd,0xf2,0xec,0x42,0x32,0x2f,0x3c,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0xfa,0x66,0x00,0x00,0x01, -0x00,0x98,0x00,0x00,0x06,0x3b,0x04,0x00,0x00,0x20,0x00,0x3c,0x40,0x1e,0x19,0xef,0x14,0x16,0x14,0x16,0x14,0x00,0x0f,0x84,0x0c,0x20,0x84,0x1d,0x00,0x1b,0x11,0xec,0x04,0x01,0x07,0x0d,0x0a,0x0a,0x1e,0x17,0x0d,0x0f,0x00,0x15,0x00,0x3f,0x3f,0x33,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12, -0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x21,0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x05,0x98,0x46,0x9a,0x5a,0x60,0x8d,0x22,0x90,0x98,0x49,0xfe,0xba,0xa4,0xb4,0x59,0x98,0x43,0x0c,0xa3,0xb5,0x8b,0x9d, -0xa3,0x01,0x9c,0x27,0x3b,0x43,0x3c,0x4f,0x30,0x01,0x6c,0x01,0x5a,0xfe,0xaf,0xe2,0x38,0x24,0x32,0x4b,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xfc,0x00,0x00,0x02,0x00,0x0f,0xfe,0x38,0x05,0xda,0x05,0x9a,0x00,0x29,0x00,0x2f,0x00,0x4c,0x40,0x27,0x2e,0x13,0x7f,0x14,0x08,0x1b,0x7e,0x29,0x2f,0x1e,0x7f,0x0e,0x2f,0x0e,0x2f,0x0e, -0x05,0x14,0x21,0x24,0x7f,0x05,0x2b,0x91,0x19,0x03,0x21,0x09,0x08,0x08,0x03,0x27,0x2e,0x1b,0x15,0x91,0x14,0x12,0x12,0x00,0x3f,0xcd,0xed,0x32,0x32,0xc4,0x32,0x39,0x2f,0x33,0x33,0x3f,0xed,0x01,0x2f,0xfd,0xcd,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xfd,0xc4,0x10,0xfd,0xc4,0x31,0x30,0x01,0x16,0x16,0x33,0x32,0x35, -0x34,0x23,0x23,0x35,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21,0x11,0x33,0x32,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x03,0x21,0x06,0x02,0x07,0x21,0x04,0x2a,0x24,0x60,0x1e,0x7d,0x89,0x47,0x20,0x20,0x3b,0x42,0x3c,0x40,0xfb,0xf0,0x9b,0x6f,0x92,0xc7,0x0d,0x02, -0xa3,0x47,0xf9,0x36,0x28,0x32,0x3f,0x85,0x77,0x68,0x4b,0x4c,0xfe,0x94,0x0f,0xb1,0x7f,0x02,0xab,0xfe,0xc7,0x0e,0x12,0x43,0x3a,0x69,0x01,0x21,0x1b,0x1f,0x19,0xfe,0x7f,0x02,0x19,0x01,0x0a,0x02,0xc6,0x01,0x32,0xfa,0xec,0xa6,0x33,0x41,0x0b,0x0c,0x45,0x34,0x4e,0x56,0x1a,0x06,0xb0,0xef,0xfd,0x83,0xfe,0x00,0x00,0x02,0x00,0x12, -0xfe,0x38,0x04,0xcb,0x04,0x00,0x00,0x2a,0x00,0x30,0x00,0x54,0x40,0x0a,0x2f,0x13,0xed,0x14,0x08,0x1c,0x84,0x2a,0x30,0x1f,0xb8,0x01,0x2e,0x40,0x09,0x0e,0x30,0x0e,0x30,0x0e,0x05,0x14,0x22,0x25,0xb8,0x01,0x2e,0x40,0x12,0x05,0x2c,0x95,0x1a,0x0f,0x22,0x09,0x08,0x08,0x03,0x28,0x2f,0x1c,0x15,0x95,0x14,0x12,0x15,0x00,0x3f,0xcd, -0xed,0x32,0x32,0xc4,0x32,0x39,0x2f,0x33,0x33,0x3f,0xed,0x01,0x2f,0xfd,0xcd,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xfd,0xc4,0x10,0xfd,0xc4,0x31,0x30,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x35,0x35,0x21,0x11,0x33,0x32,0x15, -0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x03,0x23,0x06,0x02,0x07,0x21,0x03,0x1b,0x17,0x6d,0x1e,0x7d,0x89,0x47,0x20,0x20,0x3a,0x43,0x3c,0x36,0xfc,0xe9,0x8c,0x5b,0x80,0x8a,0x02,0x14,0x34,0xf9,0x36,0x28,0x30,0x41,0x87,0x75,0x68,0x4b,0x35,0xe3,0x0a,0x73,0x6d,0x01,0xcd,0xfe,0xc7,0x0a,0x16,0x43,0x3a,0x69,0x01, -0x20,0x1c,0x1f,0x19,0xfe,0x8b,0x02,0x00,0xb6,0x01,0xc8,0xea,0x0d,0xfc,0x87,0xa7,0x34,0x40,0x0b,0x0c,0x45,0x34,0x4e,0x56,0x1a,0x05,0x23,0xbc,0xfe,0x80,0xae,0x00,0x00,0x01,0x00,0x29,0xfe,0x66,0x05,0x3d,0x05,0x9a,0x00,0x1e,0x00,0x39,0x40,0x1d,0x13,0x0b,0xad,0x0c,0x1e,0x1e,0x05,0x0e,0x18,0x7d,0x11,0x05,0x0a,0x91,0x13,0x13, -0x0c,0x12,0x0e,0x91,0x0f,0x03,0x00,0x0c,0x02,0x91,0x1c,0x0c,0x12,0x00,0x3f,0xd4,0xed,0x11,0x39,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x39,0x2f,0x33,0xe4,0x32,0x31,0x30,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x04,0x12,0x15, -0x14,0x02,0x06,0x23,0x22,0x27,0x01,0xc8,0xa2,0x9c,0xba,0xcd,0x76,0xda,0x8d,0x42,0xa8,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x4a,0xc1,0x01,0x26,0x9e,0x89,0xff,0xab,0xaa,0x98,0x96,0x6c,0xde,0xcc,0x94,0xe8,0x7e,0xfd,0x5e,0x05,0x02,0x98,0x98,0xfe,0x38,0xa2,0xfe,0xd6,0xc0,0xab,0xfe,0xf5,0x92,0x4c,0x00,0x00,0x01,0x00,0x1e,0xfe,0x66, -0x04,0x56,0x04,0x00,0x00,0x1d,0x00,0x39,0x40,0x1d,0x12,0x0a,0x84,0x1d,0x0b,0x0b,0x05,0x0d,0x16,0x83,0x10,0x05,0x09,0x95,0x12,0x12,0x0b,0x11,0x0d,0x95,0x0e,0x0f,0x00,0x0b,0x02,0x95,0x1a,0x0b,0x15,0x00,0x3f,0xd4,0xed,0x11,0x39,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x39,0x2f,0xc4,0xed,0x32,0x31, -0x30,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x01,0x52,0x79,0x87,0xa5,0xb7,0xd9,0xbf,0x20,0xa4,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x42,0xf7,0x01,0x27,0x81,0xeb,0x9a,0x4c,0x6c,0x46,0xc0,0x4e,0xb9,0xab,0xb9,0xd7,0xfe, -0x1a,0x03,0x74,0x8c,0x8c,0xff,0x00,0xfe,0xde,0xfa,0x8e,0xe5,0x7f,0x16,0x24,0x00,0x00,0x01,0x00,0x29,0xff,0xe8,0x04,0x0c,0x05,0x9a,0x00,0x11,0x00,0x23,0x40,0x11,0x0c,0x7e,0x05,0x00,0x05,0x00,0x09,0x07,0x0b,0x07,0x91,0x08,0x03,0x0f,0x92,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0xed,0x31, -0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0x83,0x3c,0x57,0x95,0x95,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x52,0x56,0x44,0x29,0x01,0x19,0xa3,0xac,0x03,0xcb,0x98,0x98,0xfc,0x53,0x78,0x66,0x1d,0x00,0x01,0x00,0x1e,0xff,0xe8,0x03,0x29,0x04,0x00,0x00,0x10,0x00,0x23,0x40,0x11, -0x0b,0x84,0x04,0x00,0x04,0x00,0x08,0x06,0x0a,0x06,0x95,0x07,0x0f,0x0e,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0x0c,0x34,0x58,0xfe,0xd2,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x55,0x53, -0x45,0x29,0x01,0x19,0x01,0x50,0x02,0x3c,0x8c,0x8c,0xfd,0xdd,0x78,0x67,0x1d,0x00,0x00,0x01,0x00,0xae,0xfe,0x29,0x05,0xbd,0x05,0x9a,0x00,0x26,0x00,0x40,0x40,0x12,0x26,0x17,0x7e,0x14,0x14,0x0c,0x13,0x03,0x7f,0x10,0x21,0x1a,0x7f,0x0c,0x15,0x11,0x03,0x24,0xb8,0x01,0x05,0xb3,0x00,0x00,0x10,0x07,0xb8,0x01,0x05,0xb5,0x1e,0x17, -0x13,0x91,0x10,0x12,0x00,0x3f,0xed,0x32,0xd4,0xed,0x12,0x39,0x2f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x04,0x21,0x21,0x22,0x26,0x35, -0x34,0x36,0x33,0x21,0x15,0x01,0xd0,0x45,0x4e,0x88,0x8b,0x0f,0x01,0x32,0x93,0xb4,0x51,0x74,0x68,0xfc,0x6f,0xa8,0x02,0xe6,0xa8,0x63,0x68,0xff,0x00,0xfe,0xf0,0xfe,0x9a,0xd3,0xc6,0x8b,0x93,0x02,0x5a,0xd8,0x23,0x21,0x30,0x24,0x2c,0x51,0x4e,0x51,0x54,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xf8,0x22,0x92,0x69,0xab,0xa1,0x56,0x63, -0x4e,0x5d,0x65,0x00,0x00,0x01,0x00,0x8f,0xfe,0x29,0x04,0xc6,0x04,0x00,0x00,0x24,0x00,0x44,0x40,0x10,0x11,0x84,0x0e,0x24,0x15,0x84,0x12,0x0e,0x12,0x0e,0x12,0x0a,0x03,0xed,0x1f,0x18,0xb8,0x01,0x2e,0x40,0x10,0x0a,0x22,0x00,0x00,0x0e,0x06,0x1c,0x1b,0x13,0x0f,0x0f,0x15,0x11,0x95,0x0e,0x15,0x00,0x3f,0xed,0x32,0x3f,0x33,0x3f, -0xcd,0x12,0x39,0x2f,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x01,0x9a,0x3c,0x44,0x78, -0x6c,0xc3,0xc3,0xaf,0x72,0x60,0xfd,0x45,0xa4,0x02,0x0a,0xa4,0x61,0x6d,0xfb,0xfb,0xed,0xaa,0xaa,0x87,0x77,0x01,0xab,0xd8,0x23,0x20,0x32,0x26,0x01,0x66,0x67,0x4c,0x59,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x7b,0x1d,0x91,0x62,0x9e,0xa4,0x5c,0x62,0x4d,0x57,0x63,0x00,0x00,0x01,0x00,0x29,0xfe,0x9b,0x04,0x0c,0x05,0x9a,0x00,0x13, -0x00,0x31,0x40,0x19,0x00,0x7e,0x0a,0x05,0x13,0x7e,0x0c,0x0a,0x0c,0x0a,0x0c,0x10,0x0e,0x12,0x0e,0x91,0x0f,0x03,0x02,0x92,0x07,0x0b,0x92,0x00,0x12,0x00,0x3f,0xed,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc4,0x10,0xed,0x31,0x30,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x33, -0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x01,0xcf,0x0a,0xa5,0x4c,0x32,0x38,0x52,0x9f,0xac,0x9f,0xfe,0x63,0x03,0xe3,0xfe,0x62,0xdb,0x20,0x92,0x18,0xc5,0xba,0x76,0x04,0x72,0x98,0x98,0xfa,0xfe,0x00,0x00,0x01,0x00,0x1e,0xfe,0x9b,0x03,0x29,0x04,0x00,0x00,0x13,0x00,0x2d,0x40,0x17,0x05,0x13,0x84,0x0c,0x0c,0x0a,0x10,0x0e,0x00,0x84, -0x0a,0x12,0x0e,0x95,0x0f,0x0f,0x02,0x95,0x07,0x0b,0xec,0x00,0x15,0x00,0x3f,0xed,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0xed,0xc6,0x2f,0x12,0x39,0x2f,0xfd,0xc4,0x31,0x30,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x01,0x53,0x0a,0xa4,0x44,0x2e,0x3d,0x45,0x9c,0xa6,0xa3, -0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0xdb,0x20,0x93,0x17,0xc7,0xb8,0x76,0x02,0xe4,0x8c,0x8c,0xfc,0x8c,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0xc5,0x05,0x9a,0x00,0x14,0x00,0x37,0x40,0x1c,0x0d,0x7e,0x06,0x0b,0x06,0x0b,0x00,0x08,0x14,0x7e,0x11,0x00,0x12,0x03,0x0c,0x08,0x91,0x09,0x0f,0x91,0x01,0x09,0x03,0x03,0x09,0x03,0x00,0x12, -0x00,0x3f,0x3f,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x21,0x32,0x37,0x11,0x33,0x11,0x05,0x1d,0xf2,0xcb,0xc3,0xd7,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x04,0xc4,0xe7,0xa8,0x02, -0x85,0x79,0xc3,0xb0,0x01,0x85,0x96,0x98,0xfe,0x85,0xe7,0x6e,0x02,0x8c,0xfa,0x66,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0xae,0x04,0x00,0x00,0x13,0x00,0x37,0x40,0x1c,0x0c,0x84,0x05,0x0a,0x05,0x0a,0x00,0x07,0x13,0x84,0x10,0x00,0x11,0x0f,0x0b,0x07,0x95,0x08,0x0e,0xec,0x01,0x08,0x03,0x03,0x08,0x0f,0x00,0x15,0x00,0x3f,0x3f,0x39, -0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x20,0x11,0x35,0x21,0x35,0x21,0x15,0x21,0x15,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x04,0x0b,0xba,0x9c,0xfe,0x9d,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0xca,0x9a,0xb1,0xa3,0x01,0x9c,0x62,0x01,0x6c,0xce,0x8c, -0x8c,0xc6,0xe1,0x56,0x01,0xdd,0xfc,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0xb4,0x00,0x19,0x00,0x2c,0x40,0x16,0x0b,0x18,0x7e,0x19,0x11,0x7e,0x05,0x12,0x15,0x91,0x0b,0x19,0x0d,0x0d,0x02,0x12,0x19,0x12,0x07,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xc4,0xed,0x2f,0xed,0x32, -0x31,0x30,0x13,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x11,0x23,0xa6,0x01,0xf2,0x63,0x61,0x5c,0x63,0xae,0xa1,0xea,0xc0,0xbf,0xca,0xa8,0xf5,0xb6,0xe0,0xa8,0x03,0xb4,0x02,0x00,0x17,0x9a,0x1d,0xba,0xca,0x88,0x7a,0xc5,0xaf,0xfd,0xe6,0x02,0x12,0xe8, -0x6e,0xfd,0x74,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x1d,0x00,0x29,0x40,0x15,0x0d,0x1c,0x84,0x1d,0x06,0x13,0x84,0x14,0x0d,0x10,0x14,0x1d,0x15,0x17,0x95,0x10,0x10,0x09,0x95,0x03,0x01,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0x32,0x31,0x30,0x13,0x34,0x12,0x33,0x32, -0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x06,0x15,0x11,0x23,0xa6,0xf2,0xe5,0x86,0x82,0x3e,0x8c,0x3d,0xa4,0x90,0x04,0x75,0xdb,0x01,0x5a,0xa4,0xee,0x4d,0x83,0x4c,0xa4,0x03,0xe9,0xfc,0x01,0x1d,0x37,0x98,0x20,0x24,0xc3,0xc8,0x96,0xc2,0xfe,0x5f,0xfd,0x89,0x02, -0x4e,0x01,0x40,0x53,0x97,0x60,0xfd,0xbc,0x00,0x01,0x00,0xbc,0xfe,0x29,0x07,0xa5,0x05,0x9a,0x00,0x2a,0x00,0x54,0x40,0x1d,0x03,0x7f,0x25,0x17,0x7e,0x14,0x2a,0x1b,0x7e,0x18,0x25,0x14,0x18,0x18,0x14,0x25,0x03,0x0c,0x13,0x7e,0x10,0x1e,0x7f,0x0c,0x19,0x15,0x11,0x03,0x28,0xb8,0x01,0x05,0xb3,0x00,0x00,0x10,0x07,0xb8,0x01,0x05, -0xb6,0x22,0x1b,0x17,0x13,0x91,0x10,0x12,0x00,0x3f,0xed,0x32,0x32,0xd4,0xed,0x12,0x39,0x2f,0xed,0x3f,0x33,0x33,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11, -0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x04,0x21,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x03,0x47,0x45,0x4e,0x88,0x8b,0x0f,0x01,0xa3,0x93,0xb4,0x51,0x75,0x68,0xfa,0x88,0xa8,0x02,0x13,0xa8,0x02,0x12,0xa8,0x62,0x6a,0xff,0x00,0xfe,0xf0,0xfe,0x28,0xd2,0xc6,0x8b,0x93,0x02,0xcb,0xd8,0x23,0x21,0x30,0x24,0x2b, -0x53,0x4d,0x51,0x54,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xf8,0x22,0x91,0x6a,0xaa,0xa2,0x56,0x63,0x4e,0x5d,0x65,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x8f,0x04,0x00,0x00,0x28,0x00,0x51,0x40,0x16,0x03,0xed,0x23,0x15,0x84,0x12,0x28,0x19,0x84,0x16,0x23,0x12,0x16,0x16,0x12,0x23,0x03,0x0a,0x11,0x84,0x0e,0x1c, -0xb8,0x01,0x2e,0x40,0x12,0x0a,0x26,0x00,0x00,0x0e,0x06,0x20,0x1b,0x17,0x13,0x0f,0x0f,0x19,0x15,0x11,0x95,0x0e,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0x33,0x33,0x3f,0xcd,0x12,0x39,0x2f,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33, -0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x02,0x85,0x3c,0x44,0x78,0x6c,0x01,0xa1,0xc3,0xaf,0x72,0x60,0xfb,0x7c,0xa4,0x01,0x97,0xa4,0x01,0x98,0xa4,0x61,0x6d,0xfb,0xfb,0xfe,0x35,0xaa,0xaa,0x87, -0x77,0x02,0x89,0xd8,0x23,0x20,0x32,0x26,0x01,0x66,0x67,0x4c,0x59,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x7b,0x1d,0x91,0x62,0x9e,0xa4,0x5c,0x62,0x4d,0x57,0x63,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x04,0x1b,0x05,0x2f,0x00,0x1c,0x00,0x47,0x40,0x24,0x0f,0x07,0x84,0x08,0x0c,0x08,0x13,0x17,0x84,0x04,0x10,0x04, -0x08,0x04,0x08,0x04,0x00,0x0a,0x15,0x00,0x12,0x0e,0x16,0x06,0x0a,0x95,0x13,0x0f,0x0b,0x0f,0x08,0x15,0x1a,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0xc4,0x32,0x01,0x2f,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x23, -0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x04,0x1b,0x3a,0x5f,0xfe,0xf3,0xf6,0xa4,0xb0,0xb0,0xa4,0xf6,0xa4,0x01,0x01,0xfe,0xff,0x46,0x51,0x3f,0x2c,0x0a,0x20,0x01,0x2c,0x02,0x5e,0xfc,0x8c,0x03,0x74,0x8c,0xfa,0x35,0xfe,0xd1,0xfa,0x35,0xfe,0xd1,0x8b,0xfd, -0xbe,0x67,0x58,0x22,0x00,0x04,0x00,0x32,0x00,0x00,0x04,0x37,0x05,0xb2,0x00,0x3f,0x00,0x48,0x00,0x51,0x00,0x5a,0x00,0xb2,0xb1,0x4f,0x2b,0xb8,0x01,0x04,0xb2,0x09,0x2c,0x35,0xb8,0x01,0x04,0xb2,0x58,0x46,0x26,0xb8,0x01,0x04,0xb4,0x51,0x15,0x27,0x3e,0x21,0xb8,0x01,0x04,0x40,0x0e,0x22,0x48,0x22,0x2c,0x58,0x27,0x22,0x22,0x27, -0x58,0x2c,0x04,0x00,0x55,0xb8,0x01,0x04,0x40,0x40,0x30,0x10,0x1d,0x7d,0x00,0x58,0x3e,0x4f,0x48,0x51,0x05,0x52,0x46,0x25,0x52,0x33,0x42,0x3b,0x3b,0x33,0x4b,0x37,0x37,0x1d,0x00,0x39,0x35,0x2d,0x2a,0x20,0x23,0x28,0x09,0x25,0x10,0x15,0x09,0x03,0x33,0x25,0x40,0x09,0x11,0x48,0x0f,0x33,0x1f,0x33,0x2f,0x33,0x03,0x25,0x33,0x25, -0x33,0x0d,0x27,0x22,0x2c,0x12,0x12,0x91,0x0d,0x04,0x00,0x3f,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x11,0x17,0x39,0x12,0x17,0x39,0x33,0x2f,0xc9,0x11,0x33,0x2f,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xc4,0x33, -0xed,0x32,0x10,0xed,0x10,0xc4,0xed,0x32,0x31,0x30,0x01,0x34,0x2e,0x02,0x27,0x2e,0x02,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x06,0x23,0x15,0x23,0x35,0x26,0x27,0x15,0x23,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32, -0x17,0x36,0x33,0x32,0x15,0x15,0x36,0x27,0x34,0x23,0x22,0x06,0x15,0x15,0x32,0x37,0x25,0x34,0x23,0x22,0x06,0x15,0x15,0x16,0x17,0x25,0x22,0x06,0x15,0x14,0x16,0x17,0x35,0x34,0x03,0x87,0x33,0x5a,0x7b,0x47,0x9e,0x83,0x43,0x82,0xe5,0x8b,0xd3,0x62,0x7f,0xc7,0x8d,0xa4,0x2f,0x66,0xa2,0xaa,0x88,0x4a,0x90,0x84,0x60,0x42,0x61,0x60, -0x64,0x40,0x60,0x3f,0x4b,0x3c,0x33,0x5b,0x17,0x2f,0x5a,0x59,0x1e,0x2f,0x5c,0x85,0x64,0xc4,0x4e,0x24,0x31,0x69,0x3a,0xfe,0xfd,0x4e,0x26,0x30,0x39,0x6b,0xfe,0xde,0x13,0x0f,0x22,0x1e,0x01,0x5e,0x3a,0x56,0x48,0x40,0x24,0x50,0x6f,0x84,0x56,0x74,0xae,0x5d,0x33,0xbd,0x58,0x76,0x62,0x3a,0x56,0x4c,0x50,0x55,0x71,0x8a,0x57,0x7d, -0x8b,0x1b,0x4c,0x3e,0x06,0x38,0x3a,0x05,0x0d,0x4c,0x68,0x1a,0x6d,0x49,0x33,0x3d,0x54,0x53,0x53,0x53,0xaa,0x53,0x36,0x0c,0x6b,0x3e,0x30,0x6b,0x0c,0x65,0x68,0x3d,0x34,0x55,0x0c,0x05,0xe8,0x26,0x15,0x23,0x46,0x11,0x6e,0x47,0x00,0x01,0x00,0xe7,0x00,0x50,0x04,0xf6,0x04,0x5c,0x00,0x09,0x00,0x0d,0xb3,0x06,0x00,0x09,0x03,0x00, -0x2f,0xc4,0x01,0x2f,0xc4,0x31,0x30,0x37,0x01,0x23,0x27,0x05,0x17,0x13,0x27,0x35,0x01,0xe7,0x03,0x46,0xa8,0x68,0x01,0xcc,0x05,0x08,0x69,0xfc,0xb9,0xae,0x03,0x46,0x68,0x08,0x04,0xfe,0x33,0x69,0xac,0xfc,0xb8,0x00,0x00,0x01,0x00,0xe7,0x00,0x50,0x04,0xf6,0x04,0x5c,0x00,0x09,0x00,0x0d,0xb3,0x00,0x06,0x09,0x03,0x00,0x2f,0xc4, -0x01,0x2f,0xc4,0x31,0x30,0x01,0x01,0x37,0x17,0x25,0x27,0x03,0x17,0x07,0x01,0x04,0xf6,0xfc,0xb8,0xaa,0x69,0xfe,0x33,0x04,0x09,0x69,0x02,0x03,0x4a,0x03,0xfe,0xfc,0xb8,0x02,0x68,0x08,0x04,0x01,0xcd,0x68,0xaf,0x03,0x4a,0x00,0x00,0x02,0x00,0x00,0xff,0xb8,0x06,0x78,0x06,0x2e,0x00,0x09,0x00,0x13,0x00,0x2e,0x40,0x16,0x06,0x10, -0x06,0x10,0x00,0x0a,0x0a,0x15,0x30,0x00,0x01,0x00,0x03,0x0d,0x03,0x0d,0x09,0x3f,0x13,0x01,0x13,0x09,0x00,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0x11,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x35,0x01,0x21,0x37,0x21,0x17,0x11,0x07,0x11,0x09,0x02,0x21,0x07,0x21,0x27,0x11,0x37,0x11,0x01,0x01,0xee,0xfe, -0x91,0xb3,0x01,0xfe,0x02,0xb3,0xfe,0x11,0x05,0xe8,0xfe,0x12,0x01,0x6f,0xb3,0xfe,0x02,0x02,0xb3,0x01,0xef,0x48,0x01,0xee,0xb3,0x02,0xfe,0x02,0xb3,0x01,0x73,0xfe,0x0f,0x05,0xe6,0xfe,0x12,0xb3,0x02,0x01,0xfe,0xb3,0xfe,0x8d,0x01,0xf1,0x00,0x03,0x00,0x83,0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x13,0x00,0x1b,0x00,0x2f,0x00,0x3a, -0x40,0x1d,0x1b,0x08,0x08,0x09,0x09,0x1c,0xaf,0x26,0x26,0x0c,0x00,0x84,0x17,0x17,0x31,0x0c,0x1b,0x0f,0x09,0x2b,0xb0,0x21,0x15,0x0c,0x0a,0x1a,0x95,0x0f,0x00,0x00,0x3f,0xfd,0x32,0xcc,0x3f,0xfd,0xce,0x11,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x33,0x2f,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x07,0x0e,0x03,0x15, -0x07,0x23,0x03,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x13,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x31,0xcf,0x1e,0x38,0x2b,0x1a,0x03,0x87,0x10,0x5e,0x4c,0x99,0xa5,0x53,0x88,0x60,0x35,0xfe,0xae,0x57,0x59,0x65,0x55,0x0a,0x27,0x11,0x1e,0x28, -0x18,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x16,0x29,0x1e,0x12,0x04,0x5a,0xce,0xaf,0x1a,0x33,0x32,0x32,0x19,0x7f,0x03,0x80,0x20,0x52,0xb0,0x60,0x32,0x5a,0x7f,0xfe,0x78,0x4e,0x8f,0x50,0x58,0x73,0x0d,0xfd,0xe8,0xfd,0x50,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x29,0x00,0xff,0xff,0x00,0xac, -0xfe,0x1e,0x03,0x00,0x06,0x1e,0x00,0x26,0x00,0x5f,0x00,0x00,0x00,0x07,0x00,0x5f,0x01,0xc0,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x78,0x05,0x1c,0x05,0x23,0x00,0x23,0x00,0x45,0x00,0x15,0xb7,0x24,0x14,0x32,0x05,0x41,0x19,0x2b,0x0d,0x00,0x2f,0x33,0x2f,0x33,0x01,0x2f,0x33,0x2f,0x33,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e, -0x04,0x07,0x23,0x2e,0x05,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x3e,0x03,0x01,0x14,0x1e,0x04,0x17,0x3e,0x05,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x2e,0x03,0x23,0x22,0x0e,0x02,0x03,0xea,0x3b,0x6f,0x55,0x33,0x40,0x68,0x83,0x86,0x7d,0x2d,0x09,0x2d,0x7c,0x86,0x83,0x68,0x40,0x33,0x55,0x6f,0x3b,0x39,0x5b, -0x49,0x37,0x14,0x09,0x14,0x38,0x49,0x5b,0xfd,0x2b,0x34,0x54,0x69,0x6c,0x63,0x23,0x23,0x62,0x6b,0x68,0x53,0x34,0x1c,0x30,0x42,0x26,0x3a,0x5b,0x49,0x39,0x16,0x17,0x38,0x49,0x5c,0x39,0x26,0x42,0x30,0x1c,0x05,0x23,0x2b,0x57,0x84,0x5a,0x64,0xad,0x98,0x85,0x79,0x6f,0x35,0x35,0x6f,0x79,0x85,0x98,0xad,0x64,0x5a,0x84,0x57,0x2b, -0x1e,0x33,0x41,0x22,0x22,0x41,0x33,0x1e,0xfe,0xa0,0x50,0x8e,0x7e,0x6f,0x63,0x57,0x26,0x26,0x57,0x63,0x6f,0x7e,0x8e,0x50,0x3d,0x58,0x38,0x1a,0x2e,0x4b,0x5e,0x2f,0x2f,0x5e,0x4b,0x2e,0x1a,0x38,0x58,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x03,0x43,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0x21,0x40,0x0e,0x1c,0x00,0x0f,0x12,0x1d,0x0b, -0x01,0x0e,0x1e,0x1c,0x03,0x11,0x03,0x03,0x00,0x3f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x33,0xcd,0x33,0x2f,0xcd,0x32,0x32,0x31,0x30,0x01,0x25,0x11,0x33,0x15,0x37,0x15,0x07,0x11,0x37,0x15,0x07,0x11,0x23,0x35,0x05,0x11,0x23,0x35,0x07,0x35,0x37,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x25,0x11,0x05,0x01,0x37,0x01,0x05,0x67,0xa0,0xa0, -0xa0,0xa0,0x67,0xfe,0xfb,0x67,0xa0,0xa0,0xa0,0xa0,0x67,0x01,0x05,0xfe,0xfb,0x03,0xff,0x8b,0x01,0x10,0xd9,0x55,0x98,0x55,0xfe,0x42,0x55,0x98,0x55,0xfe,0xda,0xef,0x8b,0xfe,0xef,0xda,0x55,0x98,0x55,0x01,0xbe,0x55,0x98,0x55,0x01,0x0e,0xfc,0xd3,0x8b,0x01,0xbe,0x8b,0x00,0x09,0x00,0xe6,0xff,0xb8,0x07,0x19,0x05,0xe7,0x00,0x1e, -0x00,0x2c,0x00,0x3a,0x00,0x48,0x00,0x56,0x00,0x64,0x00,0x72,0x00,0x7f,0x00,0x8c,0x00,0x1e,0x40,0x13,0x30,0x49,0x23,0x36,0x57,0x41,0x86,0x50,0x79,0x6e,0x2b,0x5d,0x80,0x68,0x0e,0x3b,0x0f,0x73,0x00,0x00,0x2f,0x32,0x2f,0x33,0x17,0x39,0x31,0x30,0x05,0x22,0x27,0x2e,0x02,0x27,0x26,0x35,0x34,0x37,0x36,0x36,0x37,0x36,0x33,0x32, -0x17,0x16,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x0e,0x02,0x07,0x06,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x36,0x33,0x32,0x16,0x17,0x36,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x37,0x26,0x05,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32, -0x37,0x26,0x26,0x35,0x34,0x03,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x37,0x06,0x23,0x22,0x26,0x13,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x01,0x32,0x36,0x35,0x34,0x26,0x27,0x16,0x15,0x14,0x06,0x07,0x16,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x03,0xff,0xa4,0x76,0x69, -0xb5,0x6e,0x05,0x6e,0x6e,0x08,0xe8,0xa1,0x76,0xa4,0xa2,0x79,0xa0,0xe6,0x0a,0x6f,0x3a,0x34,0x07,0x6d,0xb6,0x69,0x77,0x02,0x11,0x54,0x96,0x56,0x63,0xa4,0x24,0x5a,0x64,0x87,0xde,0x2d,0x1b,0x84,0x23,0xa4,0x62,0x53,0x95,0x58,0x1c,0x2a,0xe1,0x86,0x66,0xfe,0x27,0x83,0xbd,0x6f,0x5e,0x2d,0x51,0x88,0x48,0x3e,0xfe,0x44,0x5b,0x71, -0x53,0x93,0x59,0x46,0x3b,0x81,0xa0,0xf1,0x1b,0x54,0x92,0x59,0x61,0xa7,0x22,0x5a,0x63,0x88,0xde,0x3c,0x24,0x9d,0x5c,0x5c,0x9b,0x56,0x1b,0x2c,0xdf,0x87,0x60,0x01,0xd3,0x82,0xbd,0x6b,0x60,0x2c,0x9d,0x86,0x40,0x01,0xbb,0x5a,0x74,0xb9,0x86,0x43,0x3e,0x7f,0xa0,0x48,0x6c,0x05,0x6c,0xb8,0x67,0x76,0xa5,0xa4,0x78,0xa0,0xe8,0x08, -0x6c,0x6d,0x08,0xe7,0x9f,0x7b,0xa4,0x4f,0x92,0x39,0x6a,0xb4,0x6c,0x06,0x6b,0x03,0x16,0x54,0x95,0x58,0x70,0x5d,0x2d,0x9f,0x84,0x40,0x01,0xbd,0x5c,0x6f,0x55,0x95,0x54,0x47,0x3c,0x82,0xa0,0x01,0x0c,0xbb,0x85,0x61,0xa5,0x24,0x58,0x67,0x60,0xa7,0x75,0x13,0x1c,0x81,0x23,0xa6,0x61,0x54,0x94,0x58,0x1b,0x2a,0xe1,0x85,0x66,0xfe, -0xaa,0x3c,0x46,0x53,0x95,0x57,0x6f,0x5d,0x2d,0xa1,0xfe,0x86,0x5b,0x71,0x56,0x94,0x55,0x45,0x3e,0x83,0xa0,0xfe,0xf5,0xbe,0x80,0x61,0xa2,0x28,0x58,0x66,0x87,0xda,0x2e,0x1c,0x80,0x23,0xa2,0x65,0x82,0xbf,0x1b,0x2b,0xdd,0x86,0x6f,0x00,0x00,0x09,0x00,0xe6,0xff,0xb8,0x07,0x19,0x05,0xe7,0x00,0x1e,0x00,0x2c,0x00,0x3a,0x00,0x48, -0x00,0x56,0x00,0x64,0x00,0x72,0x00,0x80,0x00,0x8e,0x00,0x21,0x40,0x15,0x38,0x49,0x2f,0x29,0x32,0x57,0x43,0x88,0x50,0x7a,0x21,0x6a,0x5f,0x81,0x70,0x0f,0x07,0x73,0x16,0x3b,0x07,0x00,0x2f,0x33,0x2f,0x33,0x12,0x17,0x39,0x31,0x30,0x13,0x34,0x37,0x36,0x36,0x37,0x36,0x33,0x32,0x17,0x1e,0x02,0x17,0x16,0x15,0x14,0x07,0x06,0x06, -0x07,0x06,0x23,0x22,0x27,0x2e,0x02,0x27,0x26,0x26,0x37,0x14,0x17,0x36,0x36,0x33,0x32,0x17,0x26,0x26,0x23,0x22,0x06,0x06,0x13,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x25,0x22,0x07,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x35,0x34,0x26,0x17,0x16,0x15,0x14,0x06,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34, -0x26,0x13,0x06,0x06,0x23,0x22,0x27,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x03,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x05,0x32,0x37,0x26,0x26,0x35,0x34,0x37,0x06,0x06,0x15,0x14,0x16,0x16,0x25,0x26,0x35,0x34,0x36,0x37,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0xe6,0x6f,0x08,0xe6,0xa2,0x79,0xa2, -0xa4,0x76,0x68,0xb6,0x6e,0x05,0x6e,0x6e,0x08,0xe6,0xa3,0x76,0xa4,0xa2,0x77,0x68,0xb6,0x70,0x05,0x34,0x3a,0x67,0x1b,0x2d,0xde,0x87,0x64,0x5a,0x23,0xa6,0x62,0x57,0x95,0x54,0x84,0x56,0x66,0x86,0xe1,0x2a,0x1c,0x57,0x94,0x55,0x62,0xa4,0x02,0x0c,0x43,0x3e,0x49,0x87,0x51,0x2d,0x5e,0x6f,0xbe,0xf7,0x2d,0xa0,0x81,0x3b,0x46,0x57, -0x94,0x54,0x71,0xc3,0x2b,0xde,0x88,0x63,0x5a,0x23,0xa6,0x61,0x5a,0x92,0x53,0x82,0x5d,0x60,0x88,0xdf,0x2b,0x1b,0x56,0x9a,0x5d,0x5b,0x9d,0xfd,0xf5,0x43,0x40,0x84,0x9f,0x2c,0x5f,0x6c,0x57,0x95,0xfe,0xdb,0x2d,0xa0,0x7f,0x3e,0x43,0x55,0x93,0x57,0x74,0x02,0xcd,0xa4,0x7b,0x9c,0xe9,0x09,0x6d,0x6c,0x05,0x6e,0xb5,0x68,0x78,0xa4, -0xa5,0x76,0xa0,0xe8,0x08,0x6c,0x6b,0x05,0x6c,0xb6,0x69,0x39,0x92,0x50,0x42,0x40,0x85,0x9e,0x2d,0x5c,0x71,0x58,0x95,0x01,0x27,0x2c,0xa0,0x82,0x3c,0x47,0x54,0x94,0x56,0x70,0xdd,0x1c,0x14,0x75,0xa6,0x60,0x67,0x58,0x24,0xa6,0x60,0x85,0xbb,0x81,0x59,0x66,0x85,0xe1,0x2a,0x1b,0x57,0x93,0x56,0x61,0xa6,0xfe,0x74,0x81,0xa1,0x2d, -0x5f,0x6d,0x58,0x96,0x51,0x46,0xfe,0x41,0x2d,0xa0,0x83,0x3e,0x45,0x55,0x94,0x56,0x70,0xdc,0x1c,0x2d,0xda,0x88,0x66,0x58,0x27,0xa3,0x61,0x54,0x94,0x56,0x80,0x53,0x6f,0x86,0xdd,0x2b,0x1b,0x55,0x97,0x55,0x64,0xa4,0xff,0xff,0x00,0x37,0xfe,0x70,0x01,0x4b,0x04,0x00,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xdf,0xf9,0x00, -0x00,0x0b,0xb6,0x01,0x00,0x12,0x04,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0x00,0x02,0xfd,0x33,0x00,0x00,0x02,0xcd,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x21,0x37,0x21,0x11,0x21,0xfd,0x33,0x05,0x9a,0xfa,0x66,0x7c,0x04,0xa2,0xfb,0x5e,0x05,0x9a,0xfa,0x66,0x7c,0x04,0xa2,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1, -0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x23,0x00,0x27,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x07,0x23,0x07,0x33,0x07,0x23,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x23,0x37,0x33,0x37,0x23,0x37,0x33,0x13,0x33,0x03,0x33,0x13,0x33,0x03,0x07,0x23,0x07,0x33,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0xf6,0x19,0xd1, -0x32,0xe1,0x1a,0xdc,0x42,0x8d,0x41,0xc8,0x3f,0x8c,0x3f,0xd2,0x14,0xd4,0x31,0xde,0x17,0xde,0x3d,0x8d,0x3d,0xc9,0x3f,0x8a,0x3d,0xa2,0xc9,0x35,0xcb,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfd,0x0f,0x6e,0xf0,0x6b,0xfe,0xd9,0x01,0x27,0xfe,0xd9,0x01,0x27,0x6b,0xf0,0x6e,0x01,0x29,0xfe,0xd7,0x01,0x29,0xfe,0xd7,0x6e, -0xf0,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x00,0x01,0x11,0x23,0x11,0x06,0x06,0x07,0x06,0x06,0x07,0x35,0x36,0x36,0x37,0x36,0x36,0x37,0x36,0x36,0x37,0x36,0x36,0x37,0x01,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x04,0x62,0xae,0x16,0x31,0x1a,0x1c,0x3e,0x25,0x19,0x29,0x14,0x14, -0x28,0x14,0x13,0x27,0x13,0x15,0x29,0x15,0xfc,0x7a,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0x04,0xb2,0xfb,0xfd,0x03,0x3f,0x0f,0x1c,0x0b,0x0b,0x13,0x09,0x8b,0x07,0x0e,0x07,0x08,0x11,0x08,0x0a,0x14,0x0b,0x0b,0x1a,0x0b,0x01,0x41,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03, -0x00,0x07,0x00,0x27,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x21,0x35,0x01,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x07,0x21,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x4a,0xfd,0x6f,0x01,0x3d,0x31,0x45,0x2c,0x13,0x10,0x28,0x42,0x32,0x49, -0x82,0x43,0x80,0xa9,0x45,0x73,0x53,0x2e,0x1f,0x3d,0x5b,0x3b,0xed,0x01,0xd6,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x20,0x84,0x01,0x23,0x2d,0x4a,0x46,0x4c,0x2f,0x15,0x38,0x33,0x23,0x3a,0x39,0x97,0x5c,0x2e,0x4e,0x65,0x37,0x3b,0x65,0x60,0x5f,0x34,0xd1,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89, -0x00,0x03,0x00,0x07,0x00,0x3e,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x94, -0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xd6,0x3a,0x95,0x48,0x21,0x4c,0x41,0x2b,0x29,0x49,0x63,0x3a,0x5d,0x58,0x34,0x57,0x3f,0x23,0x21,0x33,0x3c,0x1c,0x3b,0x82,0x35,0x36,0x81,0x49,0x3f,0x77,0x5c,0x37,0x73,0x64,0x31,0x5c,0x47,0x2a,0x3f,0x6c,0x8f,0x4f,0x50,0x92,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x4a, -0x9a,0x29,0x28,0x0e,0x25,0x40,0x31,0x31,0x45,0x2b,0x14,0x80,0x12,0x29,0x40,0x2e,0x2b,0x37,0x1f,0x0c,0x24,0x24,0x8e,0x1d,0x1d,0x1d,0x3c,0x5c,0x3f,0x64,0x80,0x17,0x05,0x26,0x3f,0x55,0x33,0x4a,0x70,0x4c,0x27,0x1b,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x12,0x00,0x15,0x00,0x00,0x13,0x11, -0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x01,0x33,0x11,0x33,0x21,0x11,0x01,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x83,0x88,0xae,0xfe,0x21,0x01,0xc4,0xc9,0x88,0xfe,0xca,0xfe,0xd7,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfb,0x2a,0xfe,0xfb,0x01,0x05,0x7f,0x02,0x79,0xfd,0x99,0x01, -0xac,0xfe,0x54,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2c,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x11,0x21,0x15,0x21,0x11,0x3e,0x02,0x32,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x94,0x06, -0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xd7,0x7b,0x7e,0x36,0x5c,0x43,0x26,0x2d,0x4b,0x64,0x37,0x33,0x88,0x02,0x41,0xfe,0x6c,0x0e,0x0c,0x09,0x0a,0x0c,0x4f,0x92,0x6e,0x42,0x47,0x75,0x98,0x52,0xa5,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x3f,0x97,0x42,0x18,0x30,0x47,0x2f,0x30,0x43,0x2c,0x14,0x09,0x02,0x16,0x86, -0xfe,0xf8,0x01,0x01,0x01,0x21,0x48,0x73,0x52,0x56,0x7a,0x4f,0x25,0x00,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2d,0x00,0x41,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02, -0x35,0x34,0x3e,0x04,0x33,0x32,0x17,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x31,0x5a,0x61,0x56,0x77,0x4a,0x22,0x03,0x12,0x30,0x3d,0x48,0x29,0x47,0x75,0x54,0x2e,0x31,0x5a,0x82,0x51,0x66,0x8e,0x57,0x27,0x19,0x32,0x4d,0x68,0x84,0x51,0x76, -0x48,0xfe,0xe2,0x26,0x4a,0x3b,0x25,0x1b,0x36,0x4e,0x33,0x30,0x47,0x2f,0x18,0x21,0x36,0x45,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfd,0x7c,0x2c,0x46,0x70,0x90,0x49,0x1f,0x34,0x27,0x16,0x2f,0x53,0x72,0x42,0x4c,0x80,0x5c,0x33,0x50,0x81,0xa2,0x52,0x45,0x8c,0x82,0x71,0x55,0x30,0x20,0xfe,0x24,0x1c,0x34,0x4a,0x2e, -0x29,0x49,0x39,0x21,0x24,0x3a,0x49,0x26,0x34,0x4b,0x31,0x17,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x0e,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x01,0x23,0x01,0x21,0x35,0x21,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0xae,0xfe,0x1a,0xad,0x01,0xb4,0xfd,0x9a,0x03,0x45, -0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfe,0x05,0xfc,0x23,0x03,0x78,0x8b,0x00,0x00,0x05,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2b,0x00,0x3f,0x00,0x53,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22, -0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x13,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfc,0x03,0x3b,0x70,0x56,0x34,0x5a,0x5e,0x34,0x53,0x3b,0x1f,0x3a, -0x62,0x7e,0x44,0x44,0x7e,0x62,0x3a,0x1f,0x3b,0x53,0x34,0x5e,0x5a,0x34,0x56,0x70,0x3b,0x1e,0x37,0x28,0x18,0x13,0x26,0x37,0x25,0x25,0x38,0x25,0x13,0x18,0x28,0x37,0x1e,0x28,0x44,0x32,0x1d,0x1a,0x30,0x46,0x2b,0x2c,0x45,0x30,0x1a,0x1d,0x32,0x44,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfe,0x2b,0x21,0x40,0x5e,0x3d, -0x50,0x86,0x23,0x17,0x3a,0x47,0x54,0x31,0x43,0x64,0x42,0x20,0x20,0x42,0x64,0x43,0x31,0x54,0x47,0x3a,0x17,0x23,0x86,0x50,0x3d,0x5e,0x40,0x21,0xfe,0x4a,0x0a,0x24,0x31,0x3c,0x21,0x13,0x2a,0x24,0x18,0x18,0x24,0x2a,0x13,0x21,0x3c,0x31,0x24,0xfe,0x11,0x19,0x2a,0x37,0x1e,0x24,0x39,0x30,0x2a,0x15,0x15,0x2a,0x30,0x39,0x24,0x1e, -0x37,0x2a,0x19,0x00,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2d,0x00,0x41,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x27,0x01,0x32,0x3e, -0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xdb,0x5a,0x61,0x55,0x78,0x4a,0x22,0x03,0x12,0x30,0x3d,0x48,0x29,0x47,0x75,0x54,0x2e,0x31,0x5a,0x82,0x51,0x66,0x8e,0x57,0x27,0x19,0x32,0x4d,0x68,0x84,0x51,0x76,0x48,0x01,0x1e,0x26,0x4a,0x3b,0x25,0x1b,0x36,0x4e, -0x33,0x30,0x47,0x2f,0x18,0x21,0x36,0x45,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0xc2,0x2c,0x46,0x70,0x8f,0x4a,0x1f,0x34,0x27,0x16,0x2f,0x53,0x72,0x42,0x4c,0x80,0x5c,0x33,0x50,0x81,0xa2,0x52,0x45,0x8c,0x82,0x71,0x55,0x30,0x20,0x01,0xdc,0x1c,0x34,0x4a,0x2e,0x28,0x4a,0x39,0x21,0x24,0x3a,0x49,0x26,0x34,0x4b, -0x31,0x17,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x10,0x00,0x1a,0x00,0x1e,0x00,0x22,0x00,0x00,0x25,0x22,0x26,0x27,0x26,0x35,0x34,0x36,0x37,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x06,0x03,0x22,0x11,0x14,0x16,0x33,0x32,0x11,0x34,0x26,0x01,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x03,0xd1,0x55,0x7f,0x30,0x5d,0x2f, -0x32,0x62,0xb5,0x01,0x5c,0x2f,0x32,0x63,0xa0,0xc1,0x5f,0x5e,0xb9,0x58,0xfc,0x57,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0x9e,0x40,0x40,0x7f,0xf5,0x87,0xc8,0x46,0x89,0xfd,0xfa,0x80,0xc2,0x44,0x86,0x03,0x8e,0xfe,0x6d,0xbd,0xbc,0x01,0x7f,0xc9,0xc4,0x01,0xc7,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xff,0xff,0x00,0x90,0x01,0xfa, -0x02,0xb2,0x02,0x7b,0x02,0x06,0x00,0x10,0x00,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9b,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26, -0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23, -0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x1e,0x05,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x08, -0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20, -0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x01, -0xeb,0x13,0x1e,0x19,0x13,0x0c,0x07,0x7d,0x0e,0x1c,0x2b,0x1e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d, -0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x4e,0x8b,0x81,0x7f,0x88,0x94,0x57,0xfe,0xd1,0x01, -0x29,0x76,0xcc,0xc7,0xcf,0x7a,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9b,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34, -0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06, -0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x21,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x08,0xca,0x68, -0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e, -0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xd5,0x02,0x84, -0xfe,0x1b,0x14,0x1e,0x14,0x0b,0x7d,0x0e,0x1c,0x2b,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13, -0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x85,0x5b,0xa1,0xa7,0xb6,0x6e,0xfe,0xd1,0x01,0x29,0x76,0xcc, -0xc7,0xcf,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xc4,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26, -0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06, -0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16, -0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x27,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0, -0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27, -0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xd3,0x11,0x1d,0x0c,0x11,0x1e,0x0e,0x21,0x30,0x1e,0x0e,0x1d,0x7d,0x1d,0x19,0x18,0x29,0x13,0x21,0x2f,0x1f,0x0d,0x1c,0x7d,0x1d,0x1e,0x3c,0x56,0x38,0x24,0x52,0x30,0x39, -0x4f,0x21,0x23,0x09,0x0d,0x09,0x05,0x7d,0x0e,0x1c,0x2b,0x1e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d, -0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x49,0x80,0x3d,0x04,0x03,0x16,0x26,0x33,0x1d,0x43, -0x3e,0x47,0x45,0x41,0x33,0x07,0x06,0x16,0x26,0x33,0x1d,0x43,0x3e,0x47,0x45,0x31,0x56,0x3f,0x24,0x13,0x16,0x28,0x07,0x36,0x6d,0x74,0x7f,0x48,0xfe,0xd1,0x01,0x29,0x76,0xcc,0xc7,0xcf,0x7a,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b, -0x00,0xbd,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14, -0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27, -0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x0e,0x05,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0, -0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f, -0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x02,0x63,0x43,0x5f,0x40,0x24,0x14,0x05,0x22,0x39,0x46, -0x24,0x3c,0x61,0x2f,0x65,0x72,0x39,0x6f,0x59,0x38,0x16,0x35,0x59,0x43,0x40,0x56,0x32,0x15,0x23,0x57,0x92,0x6e,0x5c,0x6c,0x37,0x10,0x19,0x42,0x73,0x5b,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16, -0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20, -0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x03,0xbf,0x3f,0x65,0x53,0x40,0x2f,0x21,0x09,0x22,0x2a,0x18,0x08,0x10,0x0c,0x84,0x24,0x18,0x33,0x51,0x38,0x21,0x54,0x65,0x76,0x42,0x1e,0x36,0x37,0x3b,0x21,0x2b,0x5b,0x59,0x54,0x25,0x8d,0x1c,0x38,0x33,0x29,0x0c,0x14,0x20,0x2b,0x39,0x2d,0x00,0x00,0x0a,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16, -0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xa1,0x00,0xb5,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17, -0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21, -0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34, -0x2e,0x02,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39, -0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20, -0x20,0x2f,0x01,0xe9,0x39,0x7c,0x66,0x43,0x31,0x5b,0x84,0x52,0x51,0x7c,0x55,0x2b,0x1f,0x34,0x45,0x4b,0x4c,0x20,0x20,0x49,0x3f,0x29,0x21,0x3a,0x4c,0x2b,0x3b,0x55,0x37,0x1a,0x2f,0x45,0x4e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e, -0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20, -0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0x24,0x44,0x84,0xc1,0x7d,0x4d,0x7f,0x5b,0x31,0x2d,0x51,0x73,0x48,0x54,0x92,0x7a,0x60,0x42,0x23,0x81,0x3c,0x6a,0x96,0x59,0x34,0x4a,0x2e,0x15,0x1b,0x32,0x46,0x2c,0x5f,0x98,0x68,0x38,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f, -0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xa1,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14, -0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01, -0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x2e,0x07,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68, -0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c, -0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x02,0xb1,0x13,0x1e,0x16,0x11,0x0b,0x09,0x06,0x04,0x03,0x02,0xfe,0x15,0x02,0x64,0x04,0x04,0x06,0x0a,0x10,0x1b,0x27,0x1b, -0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb, -0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x01,0x49,0x52,0x84,0x72,0x63,0x61,0x62,0x71,0x83,0x51,0x43,0x85,0x9e,0x70,0xac,0x93,0x84,0x91,0xab,0x6e,0x00,0x00,0x09, -0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9d,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33, -0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10, -0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x16,0x12,0x17,0x33,0x36,0x12,0x37,0x33,0x02,0x02,0x03,0x23,0x26,0x0a,0x02,0x27,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e, -0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05, -0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xce,0x50,0x8c,0x3e,0x05,0x41,0x8a, -0x50,0x7e,0x66,0xad,0x4d,0x77,0x29,0x54,0x57,0x5c,0x31,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d, -0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xba,0xd9,0xfe,0x34,0xf8,0xf8,0x01,0xcc,0xd9,0xfe,0xe6,0xfd, -0xc7,0xfe,0xd8,0x9b,0x01,0x27,0x01,0x1d,0x01,0x14,0x88,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9d,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34, -0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27, -0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x26,0x02,0x27,0x23,0x06,0x02,0x07,0x23,0x36, -0x1a,0x02,0x37,0x33,0x12,0x12,0x13,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6, -0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e, -0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x03,0x06,0x51,0x8b,0x3e,0x05,0x41,0x8a,0x50,0x7f,0x34,0x5d,0x57,0x52,0x27,0x77,0x51,0xad,0x62,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e, -0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21, -0x2e,0x2f,0x01,0x49,0xda,0x01,0xcc,0xf7,0xf8,0xfe,0x34,0xd9,0x8e,0x01,0x1a,0x01,0x1e,0x01,0x21,0x94,0xfe,0xcb,0xfd,0xc9,0xfe,0xf1,0x00,0x0a,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xaa,0x00,0xbf,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16, -0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07, -0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06, -0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x23,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x03,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28, -0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27, -0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x03,0x51,0x80,0x20,0x2c,0x1c,0x11,0x07,0x64,0x60,0x40,0x71,0x54,0x32,0x29,0x4d,0x70,0x48, -0x46,0x71,0x30,0x1a,0x1e,0x12,0x09,0x05,0x06,0x10,0x1e,0x32,0xe3,0x03,0x06,0x08,0x0c,0x08,0x1c,0x58,0x38,0x23,0x3c,0x2c,0x19,0x20,0x38,0x4d,0x2e,0x26,0x53,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f, -0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80, -0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x01,0x49,0x4e,0x97,0x8d,0x83,0x39,0x2f,0x2a,0x4d,0x72,0x48,0x40,0x7b,0x60,0x3b,0x40,0x4c,0x28,0x50,0x57,0x62,0x3b,0x41,0x91,0xa2,0xb5,0x02,0x43,0x22,0x34,0x2d,0x28,0x15,0x46,0x4e,0x1e,0x34,0x46,0x27,0x2c,0x45,0x30,0x19,0x13,0x00,0x01,0x00,0x53,0x00,0x00,0x04,0x2d,0x05,0x9a,0x00,0x1d, -0x00,0x70,0x40,0x25,0x1b,0x00,0x1a,0x01,0x1a,0x03,0x18,0x02,0x0f,0x19,0x1f,0x19,0x02,0x19,0x40,0x0f,0x12,0x48,0x19,0x19,0x15,0x17,0x04,0x16,0x05,0x16,0x14,0x07,0x15,0x06,0x06,0x00,0x05,0x10,0x05,0x02,0x05,0xb8,0xff,0xc0,0x40,0x1a,0x0f,0x12,0x48,0x05,0x05,0x02,0x01,0x60,0x15,0x70,0x15,0x02,0x0d,0x15,0x01,0x01,0x15,0x0d, -0x03,0x13,0x1c,0x03,0x08,0x91,0x13,0x12,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x2f,0x2b,0x5d,0x33,0x11,0x12,0x39,0x39,0x32,0x11,0x12,0x39,0x39,0x11,0x33,0x2f,0x2b,0x5d,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x25,0x15,0x05,0x15,0x25,0x15,0x05,0x11,0x33,0x32,0x37,0x36,0x37, -0x33,0x06,0x07,0x06,0x23,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11,0x33,0x01,0xea,0x01,0x58,0xfe,0xa8,0x01,0x58,0xfe,0xa8,0x23,0xa3,0x68,0x66,0x0b,0xa4,0x14,0x93,0x90,0xee,0xc6,0xef,0xef,0xef,0xef,0xa8,0x04,0x1d,0x89,0x99,0x89,0x83,0x89,0x99,0x88,0xfe,0x2e,0x69,0x69,0xb9,0xfe,0x92,0x92,0x02,0x26,0x5e,0x98,0x5f, -0x83,0x5f,0x98,0x5f,0x01,0xc0,0x00,0x02,0x00,0xbb,0x00,0xf7,0x03,0xf5,0x04,0x66,0x00,0x0b,0x00,0x1b,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x59,0x6e,0x8f,0x93,0x6a,0x6a,0x91,0x8d,0x6e,0x71,0xbe,0x6d,0x6f, -0xbf,0x6e,0x6e,0xbf,0x71,0x6e,0xbe,0x03,0xcc,0xa2,0x7a,0x77,0xa8,0xa7,0x78,0x78,0xa4,0x9a,0x73,0xcc,0x78,0x76,0xcd,0x75,0x76,0xcc,0x76,0x76,0xcd,0x74,0x00,0x01,0x01,0x01,0xfe,0xe6,0x03,0xae,0x05,0x9c,0x00,0x29,0x00,0x00,0x01,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x07, -0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0xe6,0xe5,0x50,0x94,0x55,0x5b,0x98,0x57,0x48,0x86,0x9c,0xf0,0xa4,0x56,0x87,0x1c,0x1c,0x2a,0x6e,0xb5,0x75,0x9d,0xad,0x4f,0x55,0x49,0x45,0x59,0x50,0x47,0x02,0xf7,0x8f,0xd7,0x5b,0x92,0x52,0x58,0xa4,0x68,0x5f,0xb8,0xc0, -0xa7,0xd2,0xd2,0x5e,0x6a,0x68,0x52,0x27,0x3b,0x23,0x2c,0x4b,0x75,0xa9,0x67,0x9d,0xd7,0xab,0x5b,0x63,0x6c,0x60,0x49,0x42,0x7d,0x2c,0x00,0x01,0x00,0xaf,0xfe,0xdb,0x04,0x00,0x05,0x9c,0x00,0x21,0x00,0x00,0x01,0x02,0x03,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16, -0x16,0x15,0x14,0x02,0x07,0x07,0x16,0x12,0x17,0x03,0x7b,0xee,0x9a,0x46,0x74,0x42,0x4a,0x3c,0x7c,0x50,0x85,0x8d,0xc3,0x9a,0x88,0x96,0x31,0xb1,0xa4,0x8f,0xea,0x83,0xca,0xb0,0x01,0x72,0x9e,0x66,0xfe,0xdb,0x01,0x56,0x01,0x6c,0x02,0x47,0x72,0x3b,0x3b,0x4a,0xd2,0x2a,0xb4,0x7d,0x9c,0xc8,0x49,0x94,0x4c,0x85,0xe9,0x86,0xa9,0xfe, -0xfa,0x3e,0x03,0xed,0xfe,0xf6,0x89,0x00,0x00,0x01,0x00,0xc2,0xfe,0xde,0x03,0xee,0x05,0x88,0x00,0x2f,0x00,0x00,0x01,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14, -0x06,0x07,0x15,0x16,0x16,0x17,0x03,0x42,0x5a,0x71,0x4b,0x81,0x9d,0x4c,0x39,0x3a,0x83,0x3a,0x5f,0x61,0x95,0x88,0xfe,0xc3,0x7a,0x8c,0x86,0x82,0xfe,0xd2,0x01,0x29,0x89,0xc3,0x65,0x84,0x62,0x74,0x98,0x7c,0x27,0x93,0x33,0xfe,0xde,0x8b,0x93,0x51,0x05,0x6b,0x51,0x38,0x48,0x57,0x52,0x19,0x85,0x5f,0x7b,0x83,0x97,0x66,0x5c,0x5a, -0x5f,0x96,0x53,0x98,0x64,0x9d,0x61,0x06,0x2b,0xc0,0x70,0x84,0xcc,0x24,0x04,0x29,0xb9,0x4c,0x00,0x02,0x00,0x6a,0xff,0xf3,0x04,0x46,0x05,0x88,0x00,0x25,0x00,0x31,0x00,0x00,0x01,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16, -0x16,0x17,0x3e,0x02,0x35,0x27,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x04,0x3f,0x07,0x4d,0x8b,0xa5,0x7e,0x69,0x56,0x98,0x59,0x9c,0xc4,0x65,0x80,0xae,0x89,0x4d,0x0a,0xa6,0x0e,0x41,0x77,0x96,0x92,0x77,0x42,0x04,0xfd,0xfe,0x64,0x57,0x52,0x6e,0x55,0x67,0x68,0x57,0x05,0x88,0x25,0x2e,0x66,0xba,0xb3,0x99, -0x74,0xc1,0x63,0x5d,0x91,0x50,0xb3,0x8f,0x5f,0xb9,0x79,0x94,0xa5,0xae,0x61,0x41,0x39,0x3e,0x32,0x51,0x92,0x8e,0x80,0x84,0x9a,0xa4,0x5b,0x44,0xfb,0xa6,0x4b,0x5a,0x63,0x4c,0x42,0x8f,0x5c,0x63,0x92,0x00,0x00,0x01,0x00,0x64,0xfe,0xdb,0x04,0xef,0x05,0x88,0x00,0x25,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37, -0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x12,0x12,0x17,0x07,0x26,0x02,0x27,0x35,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x37,0x01,0x5a,0x2e,0x24,0x8f,0x7f,0x35,0x66,0x24,0x42,0x48,0x3e,0x48,0x5f,0x3a,0x54,0xb1,0x64,0x80,0x62,0xc9,0x25,0x37,0x8c,0x3f,0x82,0xc8,0x6f,0x2b,0x23,0x05,0x88,0xb2,0xe2,0x63,0xc9, -0xd5,0x30,0x2c,0x60,0x6b,0x4b,0x5f,0x7b,0x5c,0x5f,0x5b,0xfe,0xf9,0xfe,0x91,0x85,0x5d,0x86,0x01,0xcd,0x90,0x01,0x2f,0x35,0x91,0x01,0x04,0x9c,0x6f,0x01,0x11,0x7c,0x00,0x01,0x00,0x39,0xfe,0xde,0x04,0x77,0x05,0x88,0x00,0x36,0x00,0x00,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x07,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x03,0x0a,0xed,0x73,0x7c,0x9d,0x7c,0x45,0x37,0x2a,0x3c,0x39,0x52,0x73,0x45,0x57,0x92,0x7d,0x3f,0x7c,0x2f,0x60,0x5a,0x80,0xd5,0x77,0x3c,0x4b, -0x63,0x75,0x3b,0x64,0xa9,0x85,0xe0,0xca,0x7e,0x7e,0x43,0x96,0x7d,0x01,0x1a,0x02,0xe0,0x75,0x6d,0x7e,0xa2,0x13,0x56,0x4a,0x3f,0x49,0x8f,0x5a,0x57,0x35,0xad,0xbd,0x5c,0x44,0xd4,0x6d,0x1c,0x75,0xce,0x7d,0x51,0x87,0x3c,0x06,0x26,0xa8,0x6f,0x4d,0x6c,0x47,0x2a,0x96,0x22,0x4a,0x3f,0x5e,0x72,0x00,0x00,0x01,0x00,0x2e,0xff,0xf8, -0x04,0x82,0x05,0x88,0x00,0x29,0x00,0x00,0x01,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x02,0x11,0x33,0x10,0x12,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x37,0x03,0x8c,0x16,0x1d,0x78,0xaf,0x5e,0xa8,0x84,0x72,0xb0,0x60,0x7d,0xe2, -0x8f,0xcd,0xfe,0xea,0x83,0x9f,0x69,0xcd,0x93,0x95,0xb9,0x3e,0x6b,0x3e,0x3f,0x4c,0x43,0x75,0x46,0x1a,0x01,0xd4,0x05,0x62,0xae,0x67,0x89,0xb1,0x8b,0xfc,0x9c,0xb6,0xfe,0xe8,0x97,0x01,0x43,0x02,0x95,0x01,0xb8,0xfe,0x5a,0xfd,0xc3,0xfe,0xeb,0x01,0x05,0xce,0x6f,0xb1,0x64,0x59,0x4c,0x48,0x66,0x36,0x02,0x00,0x00,0x01,0x00,0x79, -0xff,0xa1,0x04,0x37,0x05,0x96,0x00,0x16,0x00,0x00,0x01,0x00,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x00,0x13,0x03,0x90,0xfd,0xef,0x52,0x19,0x95,0x73,0x6c,0xb9,0x6d,0x89,0x81,0xfe,0xfd,0x95,0x75,0xc1,0x6f,0x82,0x01,0x23,0xe9,0x05,0x39,0xfd,0x2c,0xc9,0x3c,0x3b,0x6c, -0x83,0x89,0xb4,0x57,0xc7,0xb4,0x64,0xb4,0x72,0x72,0x01,0x05,0x01,0xb2,0x01,0x42,0x00,0x01,0x00,0x81,0xfe,0xe6,0x04,0x2e,0x05,0x9c,0x00,0x27,0x00,0x00,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x16, -0x15,0x14,0x06,0x07,0x01,0xfc,0xc5,0x6f,0x59,0x60,0x77,0x38,0x86,0xcc,0xd0,0x7a,0x38,0x56,0x87,0x36,0x29,0x54,0xb4,0xec,0xa0,0x49,0xcf,0xa2,0x6b,0xaa,0x5f,0x99,0x90,0x03,0x32,0x54,0xa6,0x60,0x76,0x84,0x63,0x40,0x7e,0xa8,0xd8,0xdd,0x99,0x74,0x37,0x6b,0x6b,0x52,0x4e,0x34,0x22,0x4f,0x69,0xbf,0xfa,0xd2,0xb0,0x5a,0xa5,0xce, -0x61,0xad,0x67,0x82,0xc5,0x36,0x00,0x02,0x00,0xfd,0x00,0x93,0x05,0x06,0x04,0xc9,0x00,0x0e,0x00,0x1e,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x04,0x66,0x55,0x9d,0x66,0x6c,0xa8,0x5e,0xba,0x96,0x67, -0xaf,0x64,0xfe,0x79,0x8c,0xdd,0x79,0x8c,0xfa,0x96,0x8e,0xe2,0x7d,0x93,0xff,0x02,0xc0,0x64,0xa4,0x5d,0x66,0xb7,0x6c,0x9b,0xcb,0x68,0xb6,0xfe,0x3f,0x8a,0xf4,0x8e,0x98,0xff,0x93,0x87,0xed,0x90,0x99,0xfe,0xfb,0x94,0x00,0x01,0x01,0x70,0xff,0xe7,0x04,0x94,0x05,0xb1,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x17,0x16,0x16,0x15,0x14, -0x02,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x02,0x3e,0x12,0x5d,0x74,0xc3,0xb0,0x76,0xb2,0x6a,0x5f,0x73,0xa2,0x73,0x35,0x40,0x3b,0x3f,0x75,0x8e,0x9d,0x6a,0x3c,0x59,0x3d,0x37,0x47,0x22,0x23,0x04,0xd3,0x20,0x56,0x59,0x98, -0xfe,0x81,0x7a,0xfe,0xfa,0x86,0x5a,0x4b,0x57,0x74,0x10,0x4d,0x54,0x3d,0x77,0x7c,0x74,0x7f,0x6e,0x6a,0x35,0x44,0x55,0x3f,0x36,0x25,0x2d,0x11,0x00,0x01,0x00,0xb9,0xff,0xa7,0x05,0x4a,0x05,0xb1,0x00,0x2d,0x00,0x00,0x01,0x14,0x06,0x07,0x15,0x16,0x04,0x17,0x07,0x26,0x24,0x24,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x36,0x36,0x35, -0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x1e,0x05,0x04,0x88,0xcc,0xcf,0xc8,0x01,0x3c,0x59,0x68,0x4d,0xfe,0x8e,0xfe,0x5e,0xc8,0x10,0x31,0x85,0x3c,0x36,0x7e,0xf5,0x7c,0x41,0x75,0xa9,0x97,0x82,0x46,0x56,0x42,0x36,0x46,0x22,0x23,0x01,0x34,0x8a,0x94,0x8f,0x71,0x46,0x03,0x4b,0x7e, -0xc8,0x3f,0x06,0x4b,0xe2,0x83,0x69,0x71,0xfa,0x9c,0x12,0xa5,0x03,0x19,0x06,0x4b,0x74,0x49,0x36,0x48,0x31,0x24,0x20,0x3c,0x57,0x41,0x44,0x5b,0x42,0x2f,0x1d,0x38,0x12,0x06,0x07,0x14,0x24,0x37,0x52,0x72,0x00,0x01,0x00,0x7d,0x00,0x93,0x05,0x86,0x05,0x36,0x00,0x23,0x00,0x00,0x13,0x12,0x00,0x33,0x32,0x36,0x36,0x35,0x34,0x26, -0x27,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x03,0x37,0xf6,0x96,0x01,0x40,0xce,0x64,0x97,0x53,0x98,0x83,0x09,0x30,0x8d,0x5b,0x61,0x83,0xc7,0xa8,0x95,0xe1,0x79,0x7a,0xdf,0x8e,0xb4,0xfe,0xce,0xf2,0x4a,0x73,0x05,0x36,0xfd,0xd2,0xfe,0x25,0x6c,0xc0, -0x70,0x9e,0xe3,0x18,0x0e,0x3c,0x4a,0x5b,0x83,0x93,0x6a,0x80,0x9c,0x91,0xfe,0xfe,0x9f,0xa0,0xfe,0xf5,0x99,0xf7,0x01,0xf5,0x01,0x5e,0x59,0x00,0x00,0x03,0x00,0xff,0x00,0x4c,0x05,0x04,0x05,0xb1,0x00,0x1d,0x00,0x2b,0x00,0x38,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26, -0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x26,0x27,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x14,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0xf1,0x95,0x7e,0x8a,0xee,0x8f,0x8e,0xed,0x83,0x8f,0xa7,0x87,0x7a,0x7f,0xe0,0x80,0x82,0xd2,0x77,0x6e,0x7f,0x77,0x46,0x80,0x9b, -0x9d,0x84,0x47,0xd8,0xa0,0x94,0xbd,0xfd,0x6c,0x3f,0x76,0x9f,0x9c,0x7a,0xb7,0x89,0x84,0xa6,0x03,0x32,0x3f,0xa8,0x77,0x75,0xb3,0x60,0x62,0xb1,0x75,0x7e,0xaa,0x37,0x06,0x34,0x91,0x65,0x62,0x98,0x54,0x51,0x94,0x64,0x6b,0x92,0x33,0xfe,0x98,0x44,0x63,0x4a,0x31,0x28,0x44,0x61,0x47,0x71,0x91,0x85,0x03,0x0b,0x37,0x50,0x3d,0x2f, -0x2c,0x71,0x54,0x4c,0x62,0x5e,0x00,0x02,0x00,0x8c,0x00,0x01,0x05,0x78,0x05,0xb1,0x00,0x1f,0x00,0x32,0x00,0x00,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x15,0x07,0x0e,0x02,0x15,0x14,0x16,0x33,0x17,0x15,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x00,0x37,0x17,0x01,0x14,0x16,0x16,0x33,0x37,0x26,0x26,0x35,0x34,0x36, -0x37,0x26,0x26,0x35,0x35,0x37,0x06,0x02,0x03,0xb5,0x2f,0x84,0x5f,0x18,0x2e,0x34,0x95,0x70,0xcb,0x8f,0x48,0x7a,0x50,0x79,0xd2,0xd1,0xb0,0xfe,0xdb,0xa5,0xa5,0x01,0x2d,0xc2,0x95,0xfd,0x75,0x78,0xde,0x95,0x43,0x42,0x5a,0x83,0x97,0x70,0x82,0x02,0xd9,0xe3,0x05,0x5e,0x5c,0x47,0x5d,0x86,0x0d,0x1f,0x4b,0x06,0x49,0x7d,0x78,0x77, -0x40,0x4c,0x80,0x80,0x06,0x6b,0x95,0x01,0x01,0x95,0x91,0x01,0x4c,0x01,0x35,0x73,0x4d,0xfc,0xcc,0x76,0xb8,0x63,0x03,0x36,0xa2,0x4d,0x62,0xc2,0x6e,0x2a,0xaa,0x71,0x15,0x15,0xac,0xfe,0xac,0x00,0x00,0x01,0x00,0x1f,0xff,0xe5,0x05,0xe4,0x05,0xb1,0x00,0x2d,0x00,0x00,0x01,0x11,0x14,0x33,0x32,0x36,0x37,0x33,0x16,0x12,0x15,0x14, -0x02,0x06,0x23,0x20,0x00,0x03,0x37,0x33,0x12,0x21,0x32,0x36,0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0x4d,0x23,0x68,0xbd,0x68,0x0e,0x66,0x73,0x87,0xff,0xae,0xfe,0xae,0xfe,0x39,0x78,0x77,0x06,0xfa,0x02,0x1c,0x7a,0xb6,0x62,0x34,0x47,0xc2,0x66,0x74, -0x85,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x04,0x89,0xfe,0xd2,0x73,0x93,0xa4,0x59,0xfe,0xf7,0x98,0xa6,0xfe,0xf9,0x93,0x02,0x35,0x02,0x51,0x64,0xfb,0xb5,0x6f,0xc6,0x7b,0x7a,0x6a,0x60,0x6e,0x8f,0x78,0x01,0x72,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x00,0x02,0x00,0xf5,0xff,0xe8,0x05,0x0e,0x05,0xb1,0x00,0x21,0x00,0x30, -0x00,0x00,0x01,0x06,0x23,0x22,0x24,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x03,0x15,0x11,0x17,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x32,0x37,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x06,0x15,0x17,0x16,0x03,0xbc,0x63,0x96,0x5c,0xfe,0xe1,0x1b,0x19,0x1f,0x62,0x9a,0xc7,0x73,0x1f,0x58,0x59, -0x3e,0x27,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x57,0x62,0xfe,0xfb,0xa2,0x63,0x29,0x37,0x3a,0x11,0x61,0xae,0x65,0x07,0x8c,0x02,0x74,0x1d,0x2a,0x13,0x1c,0x5b,0x2a,0x65,0xfc,0xb7,0x64,0x35,0x62,0x84,0xb2,0x74,0xfd,0xb2,0x4c,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0x01,0xe2,0x27,0x57,0x75,0xa0,0x63,0x2c,0x87,0xe9,0x83, -0x0a,0x25,0x00,0x02,0x00,0x3a,0xff,0xe8,0x05,0xca,0x05,0xb1,0x00,0x31,0x00,0x41,0x00,0x00,0x13,0x27,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x37,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x03, -0x35,0x25,0x22,0x07,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x36,0x35,0x27,0x26,0x26,0xe8,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x78,0xa1,0x90,0x80,0x26,0x52,0x54,0x58,0x4c,0x0b,0x82,0x06,0x28,0xad,0x90,0x30,0x1b,0x0e,0x62,0x99,0xc7,0x71,0x1f,0x58,0x59,0x3e,0x27,0x01,0xca,0x9b,0x8b,0x29,0x37,0x3a,0x11,0x61,0xab, -0x65,0x07,0x3b,0x6f,0x04,0x71,0x52,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0xfe,0xa4,0x36,0x3c,0x18,0x12,0x3a,0x3b,0x1d,0x1f,0x06,0x62,0x4f,0x52,0x81,0x9b,0x06,0x19,0x2a,0x64,0xff,0xb6,0x63,0x35,0x62,0x84,0xb2,0x74,0x97,0x40,0x57,0x75,0xa0,0x63,0x2c,0x85,0xeb,0x83,0x0a,0x20,0x1e,0x00,0x01,0x00,0xaf,0xff,0xe7,0x05,0x54, -0x05,0xb1,0x00,0x3c,0x00,0x00,0x01,0x22,0x06,0x06,0x15,0x14,0x17,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x20,0x13,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x14,0x16,0x17,0x04,0x16,0x16,0x15,0x14,0x06,0x06,0x23, -0x2e,0x02,0x02,0x3f,0x41,0x6f,0x42,0x0c,0x0b,0x0f,0x4e,0x2d,0x41,0x5d,0x5f,0x4b,0x4d,0x90,0x56,0x6d,0xb2,0x6d,0x01,0x6e,0x4c,0x56,0x6a,0x55,0xac,0xff,0xfe,0xe1,0xe2,0x4f,0x44,0x39,0x48,0x22,0x23,0x01,0x94,0xa2,0x01,0x37,0xeb,0x7a,0x87,0xd5,0x85,0x23,0x4e,0x72,0x02,0x1f,0x45,0x7a,0x41,0x28,0x25,0x02,0x2a,0x36,0x66,0x44, -0x47,0x58,0x57,0x95,0x59,0x6a,0xc4,0x63,0xfd,0xec,0x23,0xa6,0x5f,0x42,0x6e,0x61,0x5f,0x69,0xcd,0x8a,0x54,0x5c,0x3e,0x37,0x25,0x2d,0x11,0x06,0x3f,0x6c,0x39,0x6e,0x8c,0xaf,0x6d,0x81,0xf5,0x7c,0xe5,0xe2,0x71,0x00,0x00,0x02,0x00,0xb7,0x00,0xe6,0x04,0x0d,0x04,0x23,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26, -0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x0d,0xf8,0xb3,0xb3,0xf8,0xf0,0xbb,0xbb,0xf0,0xa0,0x93,0x78,0x77,0x94,0x97,0x74,0x73,0x98,0x02,0x83,0xae,0xef,0xef,0xae,0xbb,0xe5,0xe5,0xbb,0x71,0xab,0xad,0x6f,0x77,0xa5,0xa8,0x00,0x02,0x01,0x2a,0xff,0xba,0x03,0x99,0x05,0x1a, -0x00,0x15,0x00,0x1e,0x00,0x00,0x05,0x24,0x11,0x35,0x12,0x35,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x10,0x03,0x15,0x14,0x17,0x01,0x35,0x34,0x23,0x22,0x15,0x14,0x33,0x32,0x03,0x99,0xfe,0xeb,0x0a,0x25,0x25,0x7e,0x9c,0x9f,0x7c,0x7a,0x72,0x0a,0x72,0xfe,0xfa,0x4e,0x7b,0x78,0x21,0x46,0x24,0x01,0x11,0x0c,0x01, -0x1e,0xe4,0x08,0x9b,0x7d,0x74,0x99,0xb2,0xe0,0xfe,0xf0,0xfe,0x83,0x07,0x8e,0x0d,0x03,0x44,0x25,0xb8,0x6d,0x7c,0x00,0x01,0x00,0x7d,0xff,0xbe,0x04,0x46,0x04,0xee,0x00,0x20,0x00,0x00,0x25,0x07,0x26,0x27,0x26,0x27,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x36,0x33,0x32,0x00, -0x15,0x10,0x05,0x16,0x16,0x04,0x46,0x28,0x79,0x5b,0x19,0xa2,0x6c,0x6f,0xd9,0xe9,0x79,0x6b,0x6b,0x80,0xc3,0xa3,0xbc,0x8f,0x65,0x72,0xbe,0x80,0xe5,0x01,0x21,0xfe,0xf6,0x65,0x6d,0x58,0x9a,0x11,0x43,0x12,0x98,0x24,0x91,0x8e,0x45,0x38,0xc5,0x73,0xa4,0xc8,0x77,0x7c,0x57,0x44,0xfe,0xda,0xe6,0xfe,0xd1,0xad,0x63,0x3e,0x00,0x01, -0x00,0x8b,0xff,0x7b,0x04,0x39,0x05,0x04,0x00,0x2a,0x00,0x00,0x01,0x14,0x05,0x16,0x17,0x07,0x26,0x26,0x27,0x07,0x22,0x27,0x26,0x35,0x34,0x33,0x32,0x17,0x24,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x16,0x04,0x39,0xfe,0xdb,0x41,0x7d,0x29,0x72,0x96, -0x62,0x4c,0x8c,0x41,0x77,0xaa,0x6d,0xb3,0x01,0x20,0xfe,0xca,0xcd,0xeb,0x7c,0x94,0x82,0x49,0xa0,0xa8,0xbb,0x38,0xd6,0xc5,0x02,0x0b,0x57,0x3c,0x9b,0x01,0x8f,0xe9,0x41,0x2e,0x22,0x9a,0x1f,0x51,0x61,0x01,0x12,0x22,0x65,0x78,0x6e,0x14,0x8d,0xcb,0xa1,0x5a,0x53,0x7c,0x29,0x17,0x47,0x97,0x50,0xfe,0xa4,0x46,0x9b,0x24,0x77,0x00, -0x00,0x02,0x00,0xb4,0xff,0xba,0x04,0x10,0x05,0x1e,0x00,0x1c,0x00,0x29,0x00,0x00,0x01,0x02,0x01,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x00,0x03,0x33,0x16,0x16,0x17,0x3e,0x02,0x37,0x03,0x34,0x27,0x26,0x27,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0x30,0xfe,0xef,0x81,0x3d,0x1f, -0x5c,0x9b,0x53,0x54,0x9a,0x5c,0x1f,0x3e,0x80,0xfe,0xeb,0x2c,0xaa,0x22,0x76,0x6f,0x57,0x55,0x3d,0x18,0x5a,0x38,0x11,0x5e,0x72,0x3b,0x67,0x43,0x43,0x67,0x05,0x1e,0xfe,0x81,0xfe,0xdc,0x95,0x64,0x63,0x30,0x51,0x8f,0x55,0x55,0x8f,0x51,0x30,0x63,0x65,0x94,0x01,0x28,0x01,0x7b,0xb6,0xfa,0x76,0x5a,0x8d,0xba,0x85,0xfb,0xd1,0x3b, -0x50,0x18,0x6c,0x84,0x50,0x3b,0x38,0x5e,0x5c,0x00,0x00,0x01,0x00,0x79,0xff,0xf6,0x04,0x4b,0x04,0xe1,0x00,0x1a,0x00,0x00,0x05,0x23,0x11,0x06,0x23,0x22,0x24,0x27,0x37,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x04,0x4b,0xa0,0x7b,0xe0,0xa7,0xfe,0xf9,0x29,0x4f,0x39,0x41,0x23, -0xaa,0x5a,0x65,0x1f,0x9f,0x56,0x57,0xd7,0x2d,0xa0,0x0a,0x01,0x53,0x2a,0x8e,0x7e,0x69,0x66,0x92,0x50,0xde,0x27,0xac,0xa9,0xcd,0x98,0x31,0x37,0x22,0x16,0x02,0xea,0x00,0x01,0x00,0x9d,0xff,0xf6,0x04,0x26,0x06,0x30,0x00,0x2d,0x00,0x00,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33, -0x17,0x15,0x27,0x22,0x06,0x15,0x14,0x17,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x04,0x26,0xb9,0xc0,0xe9,0xfe,0xd9,0xa0,0x9c,0xde,0xc2,0x1c,0x98,0x7a,0x69,0x69,0x50,0x22,0x68,0x88,0x23,0x75,0x7a,0xc1,0xa2,0xba,0x84,0xec,0xcb,0xfe,0x9d,0xe0,0x91,0xa3,0xa5,0x39, -0x43,0xc4,0xaf,0xa5,0x5c,0x5d,0xb1,0x98,0xb4,0x10,0x32,0x45,0x6a,0x7b,0x04,0xa7,0x03,0x1c,0x21,0x47,0x27,0x23,0x9c,0x1a,0x5f,0x61,0x52,0x6d,0xaf,0xa1,0x61,0x72,0x3b,0x00,0x00,0x01,0x00,0xdf,0xff,0xf0,0x03,0xe4,0x05,0x25,0x00,0x17,0x00,0x00,0x01,0x14,0x00,0x05,0x27,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17, -0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0xe4,0xfe,0xba,0xff,0x00,0x70,0xe0,0x01,0x37,0x98,0x69,0x52,0x74,0x40,0x8c,0x53,0xc4,0xa1,0xb1,0xef,0x03,0x92,0xc2,0xfe,0x08,0xe8,0x71,0xcb,0x01,0xc9,0x9d,0x61,0x92,0x6b,0x46,0x52,0x6b,0x4e,0x75,0x96,0x8f,0xc2,0xe8,0x00,0x01,0x00,0x4b,0xff,0xf6,0x04,0x79,0x05,0x29,0x00,0x18, -0x00,0x00,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x79,0x9b,0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x02,0xbd,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x9f,0x2f, -0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x01,0x00,0x4b,0xff,0xf6,0x04,0x79,0x05,0xda,0x00,0x25,0x00,0x00,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x79,0x9b,0xa6,0xfb,0xfe, -0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x01,0xb5,0x11,0x8e,0xb1,0x44,0x17,0x45,0x46,0x34,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x2c,0x37,0x7f,0x77,0xa0,0x06,0x11,0x3f,0x2c,0x37,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x00,0x02,0x00,0xe1,0x01,0x13,0x04,0x33, -0x04,0xa4,0x00,0x0b,0x00,0x19,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x02,0x8b,0x73,0x99,0x9d,0x6f,0x70,0x9a,0x97,0x73,0x75,0xc3,0x70,0xed,0xbb,0x72,0xc6,0x72,0xe9,0x04,0x09,0xab,0x81,0x7f,0xb0,0xb0,0x7f,0x80,0xac,0x9b, -0x76,0xd3,0x7f,0xc8,0xfe,0xff,0x7a,0xd3,0x7c,0xce,0xfa,0x00,0x00,0x02,0x00,0xdc,0xff,0xe8,0x04,0x38,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x00,0x01,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x03,0x32,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xbb, -0x02,0x50,0x4e,0x8c,0xb3,0xb2,0x87,0x92,0xb8,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0xa4,0x58,0x4c,0x55,0x49,0x47,0x5c,0x5b,0x03,0x39,0x02,0x15,0xb7,0x98,0x8c,0xb1,0xc9,0x9f,0xfc,0x38,0x67,0xac,0x28,0x2d,0x55,0x4b,0x03,0x3e,0x23,0x66,0x5e,0x6a,0x5e,0x49,0x4c,0x5e,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x6d,0x05,0xb2,0x00,0x26, -0x00,0x00,0x01,0x14,0x06,0x07,0x17,0x16,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x03,0xae,0xca,0xac,0x25,0x22,0x64,0x51,0x73,0x8c,0x3a,0x96,0x9f,0x90,0xb4,0x30,0x28,0x7d,0x79,0x68,0x47,0x94,0x38, -0x6e,0x81,0xbe,0x9f,0x62,0x33,0x1a,0x38,0x60,0xa7,0xed,0x7e,0x03,0xce,0xa3,0xf2,0x26,0x90,0x82,0x7e,0x47,0x9e,0x44,0xbc,0xc0,0xa3,0x05,0x4e,0x53,0x45,0x5d,0x9d,0x20,0x9c,0x6b,0x90,0xae,0x08,0x95,0x0e,0x7a,0xdb,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0xab,0x05,0xb2,0x00,0x2b,0x00,0x00,0x01,0x16,0x15,0x14,0x06,0x06,0x23,0x22, -0x24,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x03,0xd9,0xd2,0x7b,0xdd,0x89,0xb9,0xfe,0xd6,0x7f,0x7a,0x5e,0xf8,0x8d,0x97,0xb1,0x70,0x5e,0x36,0x40,0x58,0x4d,0x13,0x29,0x5d,0x6f,0x8e,0x96, -0x78,0x4d,0x3f,0x23,0x4d,0x57,0x88,0xc7,0x68,0x7f,0x02,0xf7,0x8d,0xe4,0x7d,0xbc,0x65,0xb6,0xc0,0x5f,0x94,0xa6,0x8e,0x7e,0x56,0x90,0x2f,0x10,0x0b,0x97,0x07,0x89,0x6a,0x6f,0x86,0x12,0x97,0x16,0x6a,0xbd,0x74,0xb0,0x6e,0x00,0x00,0x02,0x00,0x2d,0xff,0xe8,0x04,0xe7,0x05,0xbc,0x00,0x10,0x00,0x1b,0x00,0x00,0x13,0x01,0x01,0x17, -0x01,0x16,0x12,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x10,0x37,0x01,0x01,0x34,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x93,0x01,0xf5,0x01,0xed,0x72,0xfe,0x16,0x76,0x71,0xbd,0x9b,0x9f,0xbd,0xe6,0xfe,0x17,0x03,0x19,0x55,0x64,0xbf,0x67,0x50,0x54,0x6d,0x05,0xbc,0xfe,0x3a,0x01,0xc6,0x75,0xfe,0x3b,0x81,0xfe,0xff,0x92,0xae, -0xd8,0xe0,0xb0,0x01,0x1a,0xf6,0x01,0xbc,0xfc,0x35,0x5a,0xd5,0x6e,0xcb,0xd8,0x67,0x89,0x8a,0x00,0x01,0x00,0x0c,0xff,0xe8,0x05,0x07,0x05,0xb2,0x00,0x22,0x00,0x00,0x25,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x33,0x32, -0x37,0x11,0x33,0x04,0x2e,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0x6e,0x8b,0xda,0xe8,0x2c,0x2f,0x2d,0x1c,0x1f,0x28,0x41,0x76,0x88,0x8e,0x7c,0x97,0x76,0xa4,0x82,0x67,0xac,0x28,0x2d,0x55,0x4b,0xfb,0x35,0xed,0xdb,0x01,0xa2,0x29,0x36,0x05,0x96,0x0a,0x91,0x7f,0xfe,0x5e,0x87,0x90,0x66,0x03,0x4b,0x00,0x00,0x01,0x00,0x68,0xff,0xe8, -0x04,0xac,0x05,0xbb,0x00,0x36,0x00,0x00,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x02,0x35,0x34,0x37,0x35,0x24,0x35,0x10,0x21,0x32,0x36,0x35,0x34,0x27,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x57, -0xb9,0x5f,0x66,0x81,0xb5,0xdb,0xc2,0xa2,0x89,0x86,0x60,0x2f,0x57,0x5b,0x3f,0x53,0xfa,0xb6,0xc1,0x62,0x44,0xfe,0xe9,0x01,0x9a,0x43,0x56,0x06,0x9d,0x04,0xac,0x82,0x87,0x7b,0x89,0x6c,0x2b,0x2d,0xed,0x03,0x1a,0x1c,0x0e,0x59,0x48,0x3d,0x3d,0x05,0x07,0x79,0x75,0x6d,0x86,0x28,0x8b,0x1b,0x38,0x27,0x50,0x06,0x05,0x3d,0x7b,0x62, -0x66,0x4a,0x02,0x45,0xdb,0x01,0x25,0x25,0x22,0x17,0x12,0x33,0x12,0x1e,0x49,0x5f,0x47,0x47,0x43,0x50,0x03,0x23,0x00,0x02,0x00,0x4d,0xff,0xe8,0x04,0xc6,0x05,0xb2,0x00,0x1d,0x00,0x29,0x00,0x00,0x13,0x12,0x12,0x33,0x32,0x36,0x12,0x35,0x34,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06, -0x23,0x22,0x00,0x03,0x25,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xe8,0x2c,0xcf,0xb5,0x76,0xb8,0x62,0x04,0x02,0x7d,0x9b,0xa1,0xc9,0xc0,0xa2,0x89,0xce,0x6d,0x89,0xfd,0xa2,0xf8,0xfe,0xde,0x37,0x02,0xb4,0x42,0x89,0x3d,0x21,0x83,0x52,0x5e,0x77,0x6d,0x03,0x23,0xfe,0x94,0xfe,0xcc,0x92,0x01,0x00,0x97,0x3d,0x3a, -0x6a,0xdb,0xb0,0xa5,0xc9,0xbf,0xfe,0x9b,0xed,0xc9,0xfe,0xc0,0xb0,0x01,0x70,0x01,0xa2,0x5a,0x47,0x44,0x91,0xa7,0x73,0x5f,0x6c,0x85,0x00,0x01,0x00,0xab,0xff,0xe8,0x04,0x69,0x05,0xbc,0x00,0x14,0x00,0x00,0x01,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x13,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x01,0x03,0xa7,0xfe, -0x6e,0x6f,0x5e,0x90,0x74,0xe9,0xab,0x89,0x7c,0xfd,0xa0,0xbb,0xea,0x6c,0x71,0x01,0x96,0x05,0x5f,0xfd,0xdf,0x97,0xd8,0x5a,0x6a,0x88,0x01,0x3b,0x57,0xd3,0xac,0xe3,0xaf,0x7c,0x01,0x07,0x98,0x02,0x27,0x00,0x00,0x02,0x00,0x7d,0xff,0xe8,0x04,0x96,0x05,0xb5,0x00,0x03,0x00,0x18,0x00,0x00,0x01,0x01,0x17,0x01,0x25,0x14,0x16,0x16, -0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x37,0x17,0x06,0x02,0x02,0x1d,0x01,0xb1,0x71,0xfe,0x52,0xfe,0x8a,0x72,0xc8,0x78,0x61,0xa7,0x51,0x70,0xce,0xf5,0xae,0xfe,0xef,0x97,0xdc,0xca,0x70,0xad,0xcb,0x02,0x68,0x01,0x8c,0x73,0xfe,0x75,0x9a,0x99,0xf0,0x84,0x49,0x43,0x73,0xb4,0xab,0x01,0x3c,0xcc,0xe6, -0x01,0x97,0x9d,0x75,0x84,0xfe,0x90,0x00,0x00,0x02,0x00,0xad,0x00,0xd7,0x04,0x7a,0x04,0x89,0x00,0x0f,0x00,0x1c,0x00,0x00,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0xad,0x81,0xe3,0x83,0x81,0xe3,0x82,0x84,0xe2,0x80,0x81, -0xe3,0x83,0x03,0x26,0xb9,0x86,0x84,0xbc,0xbb,0x85,0x55,0x94,0x56,0x02,0xb0,0x7d,0xda,0x82,0x80,0xdc,0x7d,0x7e,0xdc,0x7f,0x80,0xdc,0x7d,0x84,0xbc,0xbc,0x84,0x82,0xbd,0x54,0x96,0x00,0x00,0x02,0x01,0x15,0xff,0xe2,0x04,0x12,0x05,0x7d,0x00,0x15,0x00,0x21,0x00,0x00,0x01,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06, -0x23,0x22,0x27,0x1e,0x02,0x17,0x07,0x24,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x15,0x69,0xb2,0x67,0x65,0xb1,0x65,0x64,0xb2,0x65,0x68,0x47,0x1b,0x8c,0xe0,0x84,0x56,0xfe,0xcc,0xfe,0xac,0x02,0x58,0x7d,0x59,0x55,0x7f,0x7e,0x56,0x59,0x7d,0x03,0xe5,0x6c,0xbe,0x6e,0x69,0xb1,0x62,0x64,0xae,0x68, -0x33,0x72,0xe3,0xc1,0x3c,0x86,0x92,0x02,0x27,0x01,0x66,0x5c,0x84,0x8b,0x63,0x58,0x7c,0x87,0x00,0x02,0x01,0x15,0xff,0xe2,0x04,0x12,0x05,0x7d,0x00,0x17,0x00,0x23,0x00,0x00,0x01,0x10,0x00,0x05,0x27,0x36,0x36,0x37,0x15,0x36,0x37,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x05,0x14,0x16,0x33,0x32,0x36, -0x35,0x34,0x26,0x23,0x22,0x06,0x04,0x12,0xfe,0xaa,0xfe,0xcf,0x55,0x68,0xbc,0x44,0x74,0x2e,0x49,0x67,0x65,0xb1,0x65,0x67,0xb0,0x64,0x66,0xb3,0x69,0xfd,0xaa,0x7d,0x57,0x57,0x7d,0x7d,0x57,0x58,0x7c,0x03,0xe5,0xfe,0xb7,0xfd,0xd7,0x91,0x86,0x31,0x90,0x4f,0x01,0x91,0xb2,0x33,0x67,0xaf,0x64,0x64,0xb1,0x67,0x6e,0xbe,0x50,0x5d, -0x85,0x7d,0x57,0x62,0x8c,0x83,0x00,0x01,0x00,0x2f,0x00,0x00,0x04,0xf9,0x05,0x7d,0x00,0x33,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11, -0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x02,0x5c,0x31,0x4f,0x27,0x5c,0x82,0x4c,0x36,0x17,0x1c,0x2e,0x27,0x33,0x52,0x77,0x80,0x5a,0x50,0x8b,0x4f,0x61,0xb4,0x74,0x4f,0x86,0x1d,0x2a,0x7f,0x4e,0xa1,0xb7,0xa4,0x69,0x46,0x4a,0x5c,0xa4,0x03,0xe7,0x3f,0x76,0x45,0xc8,0x91,0x6d,0x9d,0x26,0x19,0x16,0x2e,0x11,0x8d,0x04,0x87,0x57, -0x5f,0x88,0x77,0xc7,0x74,0x8f,0xe5,0x81,0x53,0x40,0x48,0x4b,0xc0,0xa2,0xfb,0xe5,0x04,0x1b,0x4f,0x77,0x8d,0x6d,0xfc,0x19,0x00,0x02,0x00,0x40,0xff,0xe5,0x04,0xe7,0x05,0xa9,0x00,0x17,0x00,0x23,0x00,0x00,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x12,0x05,0x36,0x13,0x17,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26, -0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x03,0x95,0x84,0xee,0xee,0xa6,0xa6,0x01,0x1e,0xc3,0xe1,0x99,0xd6,0xde,0x85,0x93,0x72,0xc3,0x6f,0x6f,0xc1,0x74,0x02,0xa0,0x8c,0x70,0x73,0x8a,0x94,0x69,0x67,0x95,0x01,0x60,0x87,0xfa,0x57,0x94,0x01,0x9b,0x42,0xfe,0xa2,0xb0,0x6d,0x01,0x87,0x43,0xfe,0x8d,0xa2, -0x64,0xf1,0x74,0x6e,0xb5,0x66,0x65,0xb1,0x72,0x5f,0xc7,0x3f,0x38,0xcf,0x6b,0x5c,0x84,0x8b,0x00,0x03,0x00,0x34,0xff,0xe5,0x04,0xf3,0x05,0x7d,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x00,0x13,0x34,0x36,0x37,0x26,0x03,0x37,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27, -0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0xdb,0x7d,0x6e,0xc8,0xca,0x86,0x80,0x8c,0x49,0x63,0xaa,0x61,0x5c,0xa4,0x60,0x89,0x5f,0x73,0xba,0x63,0x88,0x60,0x82,0x48,0x66,0xb0,0x64,0x65,0xb0,0x67,0x02, -0x50,0x50,0x43,0x7d,0x97,0x7c,0x57,0x56,0x7e,0x79,0x6d,0x4c,0x52,0x74,0x4f,0x45,0x6a,0x81,0x01,0x47,0x57,0xb0,0x47,0x59,0x01,0x24,0x65,0xe0,0x56,0x62,0x78,0x5d,0xa5,0x60,0x64,0xab,0x60,0x5d,0xb5,0x3b,0x2b,0xa3,0x89,0x65,0xaa,0x5c,0x7e,0x62,0x55,0x98,0x59,0x60,0xa4,0x42,0x54,0x9f,0x32,0x29,0x95,0x4b,0x53,0x74,0x62,0x03, -0x2c,0x56,0x7d,0x74,0x52,0x3f,0x8a,0x3d,0x38,0x89,0x00,0x01,0x00,0x55,0x00,0x00,0x04,0xd3,0x05,0x7d,0x00,0x2f,0x00,0x00,0x33,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x26,0x35,0x34,0x36,0x36, -0x33,0x32,0x16,0x16,0x15,0x10,0x00,0x21,0x55,0xcc,0x01,0x42,0x01,0xc7,0x56,0x94,0x56,0x57,0x7e,0x37,0x2e,0x43,0x4b,0xc1,0x86,0x61,0xc1,0x42,0x86,0x36,0x75,0x33,0x44,0x5c,0x76,0x3a,0x42,0x66,0xaf,0x66,0x81,0xe4,0x84,0xfd,0xd4,0xfe,0x7a,0xa7,0x01,0x9f,0x01,0x27,0x63,0xad,0x64,0x54,0x3c,0x17,0x39,0x1a,0x26,0x6b,0x3a,0x77, -0xa7,0x77,0x76,0x55,0x50,0x57,0x46,0x2f,0x3e,0x3d,0x1f,0x6e,0x3d,0x4f,0x8b,0x50,0x90,0xf5,0x8b,0xfe,0x94,0xfd,0xff,0x00,0x00,0x02,0x00,0x4f,0xff,0xe5,0x04,0xd8,0x05,0x7d,0x00,0x27,0x00,0x33,0x00,0x00,0x17,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x10,0x00,0x21,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x4f,0x95,0x01,0x5e,0x01,0xef,0x73,0xcc,0x72,0x69,0xb8,0x6b,0x09,0x27,0x7d,0x4a,0x77,0xa0,0xa0,0x70,0x6e,0xc4,0x71,0x99,0x01,0x06,0x92,0x9f,0x01,0x17,0xa2,0xfd,0xab,0xfe,0x61,0x79, -0x11,0x53,0x31,0x2e,0x3b,0x46,0x2a,0x30,0x50,0x1b,0x9c,0x01,0xad,0x01,0x32,0x66,0xb3,0x68,0x5e,0xa2,0x5e,0x18,0x26,0x43,0x54,0x9a,0x69,0x6b,0x98,0x75,0xc9,0x6f,0x86,0xec,0x88,0x92,0xfd,0x8e,0xfe,0x8b,0xfd,0xfa,0x02,0xcb,0x1b,0x24,0x40,0x28,0x26,0x36,0x4c,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x04,0x67,0x05,0x42,0x00,0x05, -0x00,0x00,0x13,0x21,0x15,0x21,0x11,0x23,0xc1,0x03,0xa6,0xfd,0x02,0xa8,0x05,0x42,0x99,0xfb,0x57,0x00,0x00,0x01,0x00,0xdc,0xff,0xe2,0x04,0x4c,0x05,0x62,0x00,0x16,0x00,0x00,0x13,0x34,0x12,0x37,0x33,0x01,0x11,0x33,0x11,0x14,0x06,0x23,0x01,0x06,0x06,0x15,0x14,0x00,0x17,0x07,0x26,0x24,0x02,0xdc,0xb1,0x9b,0x1b,0x01,0x62,0xa7, -0x1e,0x13,0xfe,0x14,0x56,0x54,0x01,0x19,0xec,0x43,0xac,0xfe,0xe0,0x9f,0x02,0xe5,0xac,0x01,0x58,0x79,0xfe,0x8f,0x01,0x71,0xfd,0x5b,0x0b,0x13,0x01,0xf5,0x51,0xde,0x80,0xcd,0xfe,0xb1,0x51,0x96,0x3b,0xf3,0x01,0x35,0x00,0x02,0x01,0xbd,0xff,0xe8,0x05,0x87,0x05,0x48,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x10,0x02,0x23,0x22,0x02, -0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x05,0x87,0xfb,0xeb,0xea,0xfa,0xfa,0xea,0xeb,0xfb,0xab,0x9a,0xa1,0xa1,0x98,0x97,0xa2,0xa2,0x99,0x02,0x97,0xfe,0xa8,0xfe,0xa9,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x58,0xfe,0xa8,0xfe,0xa7,0x01,0x17,0x01,0x06,0xfe,0xf7,0xfe,0xec,0xfe, -0xeb,0xfe,0xfc,0x01,0x02,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x06,0x44,0x05,0x31,0x00,0x1d,0x00,0x21,0x00,0x2d,0x00,0x00,0x01,0x14,0x06,0x07,0x35,0x32,0x36,0x35,0x10,0x21,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x16,0x16,0x01,0x11,0x21,0x11,0x05,0x21,0x22,0x06,0x15,0x14, -0x16,0x16,0x33,0x32,0x36,0x35,0x06,0x44,0xdd,0xae,0x68,0x78,0xfe,0xc6,0xd0,0xd0,0x6e,0xce,0x83,0x8d,0x7d,0x03,0x58,0xfe,0xfd,0x39,0x72,0xc5,0x75,0xfd,0x73,0xfe,0xfb,0x01,0x05,0xfe,0xc8,0x61,0x6f,0x56,0x85,0x3b,0x79,0x79,0x01,0xc0,0xc9,0xf5,0x02,0x95,0x92,0x89,0x01,0x04,0xd5,0xff,0xe0,0x88,0xe7,0x71,0x86,0xb7,0x13,0x02, -0x01,0x94,0xfe,0xab,0x65,0xb8,0x01,0x1d,0x01,0x55,0xfe,0xab,0x94,0x72,0x62,0x49,0x9c,0x66,0xad,0xbe,0x00,0x02,0x00,0xd2,0x00,0x00,0x06,0x72,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x00,0x21,0x21,0x22,0x26,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33, -0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x72,0xfb,0xe3,0xc7,0xa3,0x45,0x70,0x90,0x96,0x90,0x70,0x45,0xb7,0x9b,0x4d,0x6f,0x33,0x84,0x7d,0x98,0x6d,0x69,0x8b,0x89,0xda,0x88,0xe2,0x01,0x16,0x83,0xf2,0xad,0x8d,0x70,0x56,0x82,0x04, -0x04,0xfb,0xcf,0x46,0x2d,0x2f,0x44,0x43,0x30,0x2f,0x44,0x60,0x6e,0x4a,0x61,0x42,0x2e,0x2d,0x36,0x52,0x7a,0x5a,0x90,0xa5,0x30,0x2f,0x04,0x80,0x7c,0x61,0x8a,0x97,0x6a,0x7d,0xe0,0x76,0xf2,0xc9,0x8a,0xd0,0x79,0x2e,0x25,0x3f,0x2c,0x2e,0x23,0x02,0xbf,0x31,0x47,0x48,0x30,0x33,0x45,0x45,0x00,0x01,0x00,0xff,0x00,0x00,0x06,0x44, -0x05,0x31,0x00,0x20,0x00,0x00,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x06,0x44,0xfd,0xf0,0x61,0x84,0x7b,0x6b,0x47,0x54,0x3d,0xa8,0xfe,0xf4,0xa8,0x02,0xce,0x72,0x3e,0x64,0x45,0xa8,0xd7,0x45,0x38, -0x01,0x00,0x95,0x0d,0xbe,0x7a,0x81,0x9b,0x1e,0x32,0xfd,0x5a,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfe,0xb5,0x20,0x19,0xe8,0xaf,0x5e,0xbf,0x43,0x00,0x03,0x00,0xf8,0x00,0x00,0x06,0x4b,0x05,0x31,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x00,0x01,0x21,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11, -0x21,0x11,0x33,0x01,0x11,0x21,0x11,0x05,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x06,0x4b,0xfe,0x20,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x02,0xd0,0x6d,0x01,0x38,0xa8,0xfd,0x78,0xfe,0xed,0x01,0x13,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0x02,0xb4,0x90,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02, -0x06,0x94,0xfe,0xab,0x01,0xe9,0xfe,0x17,0x01,0x55,0xfe,0xab,0x94,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0x00,0x01,0x00,0x5c,0xfd,0xb9,0x06,0xe8,0x07,0x21,0x00,0x34,0x00,0x00,0x01,0x02,0x02,0x24,0x23,0x22,0x04,0x02,0x11,0x10,0x12,0x04,0x33,0x20,0x00,0x11,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x21,0x15, -0x23,0x11,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x04,0x23,0x20,0x00,0x02,0x11,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x13,0x06,0x46,0x07,0xa4,0xfe,0xde,0xba,0xd3,0xfe,0xc7,0xad,0x9d,0x01,0x1e,0xc8,0x01,0x0b,0x01,0x2e,0x5d,0x4f,0x70,0x37,0xa8,0xee,0xa8,0x02,0xb0,0x72,0x53,0x55,0xa1,0xae,0xb5,0xfe,0xb2,0xd6,0xfe,0xff,0xfe,0x93, -0xc3,0xd3,0x01,0x8c,0x01,0x10,0xe3,0x01,0x63,0xcb,0x0c,0x03,0x1d,0x01,0x03,0x01,0x91,0xdc,0xf7,0xfe,0x22,0xfe,0xbc,0xfe,0xb2,0xfe,0x1c,0xf5,0x01,0x6b,0x01,0x4f,0x72,0x8c,0x51,0xfe,0x4c,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfd,0xaa,0x51,0xe9,0xdd,0xed,0xfe,0x96,0xc2,0x01,0x18,0x02,0x22,0x01,0x81,0x01,0x71,0x02,0x22,0x01, -0x1a,0xfe,0xfe,0x2c,0xfe,0xce,0x00,0x03,0x00,0x27,0x00,0x00,0x07,0x1c,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x3e,0x00,0x00,0x01,0x15,0x23,0x11,0x16,0x16,0x17,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x21,0x35,0x36,0x36,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x15,0x10,0x02,0x23,0x22,0x26, -0x26,0x35,0x34,0x36,0x37,0x11,0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x21,0x11,0x04,0x07,0x6d,0x52,0x75,0x32,0x23,0x50,0x53,0x48,0x94,0xaf,0x3a,0x30,0xa2,0xfe,0xc3,0x28,0x33,0xa1,0x59,0x64,0xa8,0x49,0x51,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x01,0xbb,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84, -0xfe,0xed,0x05,0x31,0x94,0xfe,0xa9,0x0a,0x43,0x40,0x42,0x4d,0x23,0xd1,0xab,0x64,0xbb,0x3b,0x95,0x93,0x39,0xb3,0x58,0x01,0x00,0x9f,0x95,0xfe,0x5d,0x01,0x94,0x82,0x7e,0x18,0x88,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0xfd,0x83,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0xff,0x01,0x55,0xfe,0xab,0x00,0x00,0x02, -0x01,0x1a,0x00,0x00,0x06,0x29,0x05,0x31,0x00,0x1a,0x00,0x26,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x02,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x11,0x34,0x12,0x24,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x06,0x29,0xab,0xa8,0xed,0x99,0xf7,0x90,0x08,0x2c,0x88, -0x44,0x96,0xb7,0xbe,0x91,0xcb,0xd2,0xbd,0x01,0x47,0xc3,0x02,0x48,0xfd,0x32,0x63,0x45,0x47,0x77,0x2a,0x0a,0x79,0x6b,0x44,0x5e,0x04,0x9d,0xfb,0x63,0x04,0x9d,0x8d,0xfe,0xfc,0xa8,0x2b,0x33,0xbf,0x9c,0x9e,0xc8,0x01,0x21,0x01,0x1e,0xd0,0x01,0x5e,0xc3,0xfc,0x27,0x54,0x82,0x3c,0x30,0x8d,0xa0,0x74,0x00,0x03,0x00,0x48,0xff,0x00, -0x06,0xfc,0x05,0x31,0x00,0x2a,0x00,0x34,0x00,0x40,0x00,0x00,0x01,0x11,0x23,0x11,0x23,0x06,0x00,0x21,0x22,0x24,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x35,0x34,0x02,0x27,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x07,0x33,0x11,0x01,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32, -0x24,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0xfc,0xa8,0xfb,0x59,0xfe,0x6c,0xfe,0xef,0x8d,0xfe,0xfd,0x83,0xba,0x9a,0x03,0x3c,0x07,0x80,0x78,0x25,0x1b,0xbf,0x92,0x5f,0x97,0x56,0x66,0xc1,0x84,0xb7,0x01,0x0d,0x92,0x06,0xcf,0xfe,0x58,0xfc,0xcb,0x36,0x43,0xd2,0xc5,0xaf,0x01,0x06,0xc9,0x67,0x44,0x44, -0x66,0x60,0x4a,0x4b,0x60,0x05,0x31,0xf9,0xf9,0x01,0xdc,0xf9,0xfe,0xf3,0x6e,0xb8,0x75,0x74,0x8c,0x60,0x31,0xb9,0x01,0x09,0x46,0x25,0x52,0x36,0xa2,0xc1,0x55,0x9f,0x70,0x6d,0xa9,0x5f,0xad,0xfe,0xb1,0xee,0x30,0x48,0x03,0x96,0xfb,0xd5,0x4b,0x35,0x74,0x7d,0xb6,0x03,0x30,0x53,0x7f,0x7d,0x55,0x52,0x6c,0x6e,0x00,0x04,0x00,0x23, -0xff,0xe4,0x07,0x20,0x05,0x31,0x00,0x30,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02, -0x07,0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x23,0x11,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x26,0x06,0x16,0x2d,0x3b,0x87,0x73,0x4d,0x42,0x69,0x78,0x88,0x79,0x80,0x9b,0x31,0x9b,0x4b,0xa2,0x87,0x7f,0xc8,0x72,0x72,0x6c,0x02,0xbc,0x6d,0xea,0x3f,0xa8,0x61,0x72,0xc0,0x6c,0x47, -0x3d,0xfc,0x0c,0x63,0x95,0x9b,0x46,0x9c,0x86,0x65,0x52,0xff,0x02,0xf9,0x25,0x20,0x44,0x30,0x62,0x2a,0x46,0x2c,0x43,0xff,0x70,0xca,0xca,0x47,0x35,0xdf,0x8e,0xb4,0xd5,0xe1,0xc0,0x8d,0x86,0x90,0xd0,0xe5,0x6f,0x70,0xd5,0x92,0x86,0xa4,0x2a,0x02,0x06,0x94,0xfe,0xab,0x57,0x65,0x83,0xeb,0x99,0xa0,0xfe,0xda,0x53,0x02,0xd0,0x28, -0x5d,0x5c,0x93,0xab,0xc1,0xf3,0xff,0x01,0x55,0xfe,0xab,0x98,0x33,0x7c,0x65,0x74,0x93,0xf1,0x47,0x80,0x5a,0x00,0x00,0x02,0x00,0xbf,0xff,0xe5,0x05,0xa8,0x04,0xc9,0x00,0x0f,0x00,0x1f,0x00,0x00,0x05,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32, -0x36,0x36,0x35,0x34,0x26,0x26,0x03,0x33,0xa6,0xfe,0xdc,0xaa,0xa9,0x01,0x25,0xa6,0xa8,0x01,0x24,0xa9,0xa9,0xfe,0xdb,0xa7,0x7f,0xda,0x80,0x7f,0xda,0x80,0x7f,0xda,0x80,0x80,0xd9,0x1b,0xa6,0x01,0x21,0xab,0xa9,0x01,0x22,0xa7,0xa7,0xfe,0xdd,0xa8,0xa8,0xfe,0xdd,0xa7,0x04,0x5b,0x7f,0xdf,0x81,0x80,0xdd,0x7e,0x7d,0xdd,0x81,0x81, -0xe0,0x7e,0x00,0x01,0x00,0x34,0xff,0xe6,0x06,0x34,0x04,0xc9,0x00,0x1b,0x00,0x00,0x01,0x22,0x04,0x06,0x15,0x10,0x05,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x27,0x24,0x11,0x34,0x26,0x24,0x03,0x34,0xaa,0xfe,0xe8,0xa0,0x01,0x32,0x62,0xaf,0xbf,0xc1,0x01,0x61,0xde,0xe0,0x01,0x60,0xc0,0xbf, -0xb0,0x61,0x01,0x31,0xa0,0xfe,0xea,0x04,0x33,0x89,0xef,0x88,0xfe,0xef,0xc2,0x7a,0x6a,0x01,0x37,0xac,0xb7,0x01,0x32,0xad,0xaf,0xfe,0xcf,0xb6,0xac,0xfe,0xc8,0x69,0x7a,0xc2,0x01,0x11,0x88,0xef,0x89,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x06,0x22,0x04,0xdc,0x00,0x1e,0x00,0x2a,0x00,0x00,0x37,0x21,0x32,0x36,0x36,0x35,0x34,0x26, -0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x21,0x01,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x45,0x03,0x61,0x87,0xe4,0x72,0xb2,0x8d,0x2c,0x4e,0x81,0x4b,0x72,0x9c,0x66,0xb0,0x5f,0x99,0x01,0x21,0xab,0x9b,0xfe,0xcd,0xae,0xfc,0x9f,0x03,0x91, -0x31,0x2f,0x40,0x57,0x4b,0x32,0x33,0x47,0x97,0x7d,0xd7,0x8e,0x95,0xf7,0x31,0x44,0x45,0x42,0x81,0x4b,0x9f,0x73,0x55,0x88,0x4e,0xac,0xfe,0xe0,0xa5,0xb1,0xfe,0xee,0xa8,0x03,0xb1,0x28,0x4e,0x1f,0x0b,0x57,0x33,0x33,0x47,0x47,0x00,0x01,0x01,0x78,0xff,0xe7,0x04,0xef,0x04,0xc9,0x00,0x28,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22, -0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x04,0xef,0x75,0xca,0x7b,0xd9,0xe4,0x5a,0x65,0xab,0x53,0x51,0x81,0x4b,0x96,0x77,0xb6,0xb6,0x77,0x83,0x98,0x7d,0x7f,0x95,0x5c,0xa8,0xe6,0x72,0xba, -0x68,0x49,0x50,0x4e,0x5e,0x01,0x54,0x60,0xab,0x62,0xc6,0x7b,0x5b,0x50,0x39,0x64,0x3a,0x60,0x74,0x8d,0x6b,0x58,0x50,0x6d,0x74,0x64,0xa4,0x58,0x9a,0x5a,0x5f,0x84,0x2d,0x2a,0x98,0x00,0x00,0x02,0x00,0x9e,0xff,0xe8,0x05,0xca,0x04,0xec,0x00,0x0b,0x00,0x32,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16, -0x13,0x24,0x36,0x37,0x26,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x24,0x11,0x34,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x17,0x03,0x29,0x33,0x47,0x47,0x33,0x35,0x45,0x48,0x30,0x01,0x17,0xee,0x05,0x05,0x58,0x51,0x3e,0x7e,0x8b,0x6c,0xca,0xb8,0x27,0x39, -0x9d,0x76,0x77,0x9b,0x37,0x27,0xfe,0x29,0x8a,0x5c,0x31,0x1d,0x5c,0xbf,0xb0,0x72,0x44,0x38,0x29,0x4d,0x0e,0x0f,0x4d,0x28,0x39,0x43,0x01,0xa6,0x3b,0xb0,0x7e,0x4f,0x77,0x31,0x74,0x3c,0xc2,0x6d,0x74,0xaf,0x7d,0x33,0x1e,0x62,0x40,0x6f,0x97,0x98,0x6e,0x37,0x67,0x21,0x67,0x01,0x46,0xa9,0x71,0x66,0x2f,0x59,0x2c,0x4d,0x79,0x54, -0x20,0x00,0x00,0x02,0x00,0x36,0xff,0xc0,0x06,0x32,0x04,0xcd,0x00,0x33,0x00,0x3e,0x00,0x00,0x01,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x02,0x17,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x27,0x2e,0x03,0x23,0x22,0x00,0x03,0x27,0x36,0x12,0x37,0x26,0x26,0x27,0x37, -0x1e,0x02,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x36,0x02,0x96,0x38,0x3a,0x51,0xa3,0x85,0x80,0xa1,0x6e,0x69,0x30,0x3f,0x2b,0x17,0x0b,0x11,0x05,0x24,0x20,0x29,0x31,0x0e,0x8b,0x13,0x83,0x63,0x5e,0x79,0x13,0x1d,0x2d,0x40,0x49,0x33,0xe0,0xfe,0xc2,0x66,0x8f,0x3d,0xf0,0xa3,0x2d,0xc1,0x7c,0x21,0x55,0xba,0x9b,0x02, -0x01,0x57,0x37,0x38,0x53,0x5e,0x51,0x6a,0x02,0xc8,0x0f,0x06,0x59,0x6d,0x7f,0xa4,0x9e,0x75,0x5e,0x91,0x27,0x25,0x65,0x82,0x82,0x43,0x44,0x16,0x1f,0x5a,0x61,0x18,0x96,0xa0,0x7f,0x79,0xb5,0x7a,0x4d,0x21,0xfe,0xd0,0xfe,0xc7,0x25,0xdd,0x01,0x4f,0x55,0x9a,0xe7,0x32,0x88,0x14,0x90,0xdb,0x5f,0x38,0x54,0x55,0x41,0x64,0x3f,0x07, -0x62,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x05,0xcf,0x04,0xbe,0x00,0x1e,0x00,0x00,0x13,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x21,0x21,0x15,0x21,0x22,0x26,0x99,0xa7,0xa7,0x5c,0xa0,0x5f,0x97,0x7f,0x66,0x6a,0x97,0x7b,0x01,0xd2,0xfe,0x2e,0x7b, -0x97,0x01,0x04,0x03,0x8f,0xfc,0x56,0xbc,0xd0,0x01,0x42,0xbd,0x6b,0x6b,0xbe,0x50,0x8c,0x4f,0x92,0x59,0x54,0x5a,0x6f,0x97,0x77,0x61,0xb0,0x97,0xa8,0x00,0x00,0x01,0x01,0x4a,0xff,0xe5,0x05,0x1e,0x04,0xc9,0x00,0x2e,0x00,0x00,0x25,0x32,0x36,0x37,0x33,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x34, -0x26,0x23,0x22,0x06,0x07,0x23,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x0e,0x03,0x07,0x0e,0x02,0x15,0x14,0x16,0x03,0x30,0x95,0xa1,0x16,0xa2,0x18,0xfe,0xff,0xd5,0x8b,0xdf,0x7c,0x2e,0x5c,0x9a,0x95,0x8b,0x6f,0x3b,0xa5,0x6e,0x75,0x97,0x0d,0x9b,0xf9,0xbb,0x7b,0xc6,0x72,0x24,0x3d,0x59,0x6f,0x81,0x94,0x71,0x3e,0xad,0x7d,0x7c, -0x7b,0xbd,0xd2,0x56,0x9e,0x6b,0x49,0x71,0x54,0x42,0x22,0x20,0x32,0x44,0x32,0x4c,0x6a,0x74,0x68,0xa1,0xd0,0x59,0x9b,0x53,0x40,0x5f,0x48,0x33,0x27,0x1e,0x21,0x35,0x4d,0x38,0x5f,0x6c,0x00,0x01,0x00,0x28,0xff,0xe7,0x06,0x3f,0x04,0xc9,0x00,0x20,0x00,0x00,0x01,0x21,0x15,0x21,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02, -0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x02,0x27,0x02,0xd5,0x03,0x6a,0xfd,0xd4,0x7c,0x81,0xa4,0xfe,0xd4,0xa4,0xa4,0xfe,0xd3,0xa3,0x7c,0x6e,0x5b,0x4d,0x58,0x7c,0xdb,0x7d,0x7c,0xdc,0x7c,0xdb,0xc0,0x04,0xc9,0x8b,0x5d,0xfb,0x91,0xa9,0xfe,0xe8,0xad,0xad,0x01,0x19,0xa8,0x92,0xfb, -0x5a,0x6e,0x40,0xc9,0x70,0x7d,0xd3,0x7b,0x7b,0xd4,0x7c,0xae,0x01,0x02,0x3b,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x05,0xcf,0x04,0xbe,0x00,0x1e,0x00,0x00,0x13,0x34,0x36,0x33,0x21,0x15,0x21,0x20,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x34,0x37,0x26,0x99,0xcf,0xbd, -0x03,0xaa,0xfc,0x71,0xfe,0xfc,0x43,0x7a,0x55,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0xd0,0x7f,0x97,0x60,0xa0,0x5b,0xa7,0xa7,0x03,0x7b,0x99,0xaa,0x98,0xb0,0x3c,0x64,0x38,0x96,0x70,0x59,0xa8,0x97,0x50,0x8b,0x50,0xbd,0x6b,0x6b,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x05,0x2f,0x04,0xac,0x00,0x0f,0x00,0x1f,0x00,0x00,0x01,0x14,0x02,0x04, -0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x07,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x05,0x2f,0x9b,0xfe,0xf4,0x9b,0x9c,0xfe,0xf6,0x9b,0x9a,0x01,0x0d,0x9a,0x9a,0x01,0x0c,0x9c,0xa5,0x6c,0xc0,0x71,0x70,0xc1,0x6c,0x6e,0xbe,0x71,0x70,0xbf,0x6e,0x02,0x55,0xa2,0xfe,0xea, -0x9d,0x9f,0x01,0x14,0xa2,0xa1,0x01,0x16,0xa0,0xa0,0xfe,0xe9,0xa0,0x73,0xc9,0x76,0x76,0xca,0x72,0x74,0xc9,0x74,0x73,0xca,0x00,0x01,0x00,0xa1,0xff,0xfd,0x05,0x3a,0x04,0xac,0x00,0x1d,0x00,0x00,0x01,0x14,0x02,0x07,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24, -0x33,0x32,0x04,0x12,0x05,0x3a,0xc2,0x8b,0x4a,0x68,0x8a,0x75,0xc4,0x6f,0x70,0xc5,0x72,0x8e,0x63,0x49,0x8d,0xc0,0xa0,0x01,0x10,0x9c,0x9d,0x01,0x11,0x9f,0x02,0x55,0xb8,0xfe,0xa6,0x46,0x93,0x37,0x01,0x08,0x86,0x72,0xcb,0x75,0x77,0xc9,0x72,0x8b,0xfe,0xf9,0x34,0x92,0x47,0x01,0x59,0xb8,0xa0,0x01,0x18,0x9f,0xa1,0xfe,0xe8,0x00, -0x00,0x01,0x00,0xf6,0x00,0x00,0x04,0xe6,0x04,0xac,0x00,0x25,0x00,0x00,0x01,0x14,0x02,0x04,0x23,0x21,0x35,0x21,0x32,0x37,0x24,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x04,0xe6,0x9c,0xfe,0xef,0x9f,0xfe,0x5c,0x01,0xa4,0x3c,0x4d, -0x01,0x1e,0x73,0xc4,0x70,0x54,0x80,0x7d,0x57,0x5c,0x3f,0x75,0x62,0xae,0x64,0xb0,0x66,0x66,0xb0,0x64,0xa8,0x01,0x0d,0x97,0x02,0x55,0x9d,0xfe,0xea,0xa2,0xa4,0x1b,0x64,0x01,0x32,0x72,0xca,0x76,0x7c,0x59,0x55,0x7f,0x44,0x72,0x77,0x66,0xae,0x65,0x64,0xb1,0x65,0x9b,0xfe,0xec,0x00,0x02,0x00,0xdd,0xff,0xdd,0x04,0xfe,0x04,0xac, -0x00,0x32,0x00,0x3c,0x00,0x00,0x05,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x05,0x32,0x37,0x26,0x26,0x23,0x22, -0x15,0x14,0x16,0x04,0xfe,0x54,0x6c,0x6b,0x58,0xb2,0x92,0x57,0xa4,0x5f,0x57,0x99,0x5d,0x73,0xee,0x48,0x3b,0x65,0xae,0x66,0x2d,0x3a,0x65,0x36,0x2f,0x56,0x20,0x6b,0x32,0x70,0x97,0x97,0x6a,0x8d,0xff,0x9c,0x70,0x46,0x38,0x0c,0x26,0xfd,0x55,0xc5,0x55,0x3c,0xad,0x51,0xa6,0x6d,0x23,0x33,0x61,0x45,0x2c,0x4e,0x81,0x46,0x53,0x7c, -0x42,0x6f,0x55,0x53,0xbe,0x6e,0xbd,0x69,0x30,0x27,0x58,0x41,0x68,0x35,0x47,0x8e,0x6d,0x66,0x96,0x9e,0xfe,0xf1,0x96,0xe1,0x9a,0x51,0x09,0x02,0x4f,0x43,0x4b,0x64,0x36,0x43,0x00,0x03,0x00,0x60,0xff,0xf3,0x05,0x7c,0x04,0xc1,0x00,0x26,0x00,0x30,0x00,0x3c,0x00,0x00,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06, -0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x05,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf0,0x51,0x90,0x6c,0x3f,0xca,0xb8,0x25,0x37,0xbb,0x8f,0x8d,0xbd,0x48,0xfe,0x56, -0x92,0x69,0x67,0x95,0xc1,0x82,0xf3,0xf0,0xdd,0x3a,0x5e,0x74,0xfd,0xe6,0x33,0x24,0x25,0x3f,0x33,0x88,0x02,0x00,0x60,0x46,0x45,0x61,0x5d,0x49,0x4b,0x5b,0x04,0xc1,0x0c,0x1f,0x44,0x78,0x64,0x87,0xce,0x46,0x23,0x63,0x38,0x88,0xa2,0xa7,0x83,0x6f,0x45,0x9b,0x01,0x45,0x69,0x92,0x95,0x67,0xa8,0x49,0x61,0x24,0x3f,0xa0,0x63,0x3a, -0x42,0x1f,0x06,0x61,0x27,0x37,0x39,0x25,0x5c,0x3c,0x2d,0xfd,0xc2,0x39,0x51,0x4e,0x3c,0x35,0x45,0x45,0x00,0x03,0x00,0x43,0xff,0xdc,0x05,0x99,0x04,0xac,0x00,0x35,0x00,0x3e,0x00,0x47,0x00,0x00,0x01,0x14,0x07,0x16,0x15,0x14,0x06,0x07,0x27,0x32,0x36,0x35,0x34,0x27,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x25,0x26, -0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x17,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x36,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x99,0xaa,0x74,0x89,0xaa,0x4b,0x62,0x7f,0x84,0x6b,0xf7,0x1b,0xc7,0xa8,0x73,0xa0,0xea, -0x01,0x1f,0x08,0x89,0x57,0x35,0x47,0x25,0x30,0x5a,0x3e,0x59,0xa3,0x76,0x68,0xae,0x67,0x06,0x7f,0x43,0x50,0xa5,0x7a,0x80,0xa0,0x9d,0x4e,0x35,0x83,0x72,0x94,0xfd,0x42,0xc5,0x99,0x49,0x2d,0x4d,0x7e,0x03,0x78,0xdd,0x63,0x78,0x8b,0x99,0x9a,0x26,0xa0,0x67,0x49,0x5c,0x6e,0x19,0x0f,0xe1,0xed,0x9e,0x73,0xa2,0x9e,0x18,0xac,0xfa, -0x4c,0x3c,0x1d,0x3a,0x27,0x82,0x20,0x93,0x4d,0x78,0xad,0x93,0xfe,0xfa,0xa0,0x08,0x0a,0x6a,0x89,0x84,0xb0,0xb0,0x73,0x38,0x4e,0x97,0x5c,0x69,0x3e,0xfe,0xd3,0x10,0x56,0x56,0x2b,0x42,0xa5,0x00,0x00,0x02,0x00,0x7e,0x00,0x00,0x05,0x5d,0x04,0xac,0x00,0x1d,0x00,0x28,0x00,0x00,0x21,0x21,0x22,0x24,0x26,0x35,0x34,0x37,0x26,0x23, -0x37,0x20,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x5d,0xfe,0x06,0xa4,0xfe,0xed,0x9d,0x9d,0x73,0xbb,0x0f,0x01,0x20,0x98,0x7c,0xa2,0x86,0xac,0xad,0x85,0x7e,0xa1,0x4c,0x4a,0xfc,0xb9,0x01,0xfa,0xfe,0x98,0x54,0x3e, -0x7b,0x59,0x3a,0x59,0x41,0x3f,0x53,0x84,0xeb,0x8d,0xc7,0x7d,0xc7,0xa5,0xfe,0xe6,0x2b,0xa0,0x7a,0x7b,0xa7,0x85,0xa0,0x4a,0x6c,0x93,0xb9,0x01,0xf5,0x36,0x49,0x1d,0x79,0x5c,0x40,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x05,0x06,0x04,0xc1,0x00,0x27,0x00,0x00,0x21,0x21,0x22,0x26,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x26, -0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x07,0x06,0x15,0x14,0x16,0x33,0x21,0x05,0x06,0xfd,0x4d,0x66,0xb1,0x66,0x8d,0x27,0xd9,0x84,0x4b,0x3f,0x37,0x4a,0x1b,0x8e,0x31,0xab,0x7c,0x84,0xa8,0x8b,0x3e,0x84,0x3f,0x84,0x7c,0x5c,0x02,0xb3,0x62,0xab,0x64,0xb5,0x66,0x1e,0x61, -0x3a,0x49,0x3f,0x50,0x45,0x2f,0x30,0x1c,0x52,0x41,0x62,0x74,0x9f,0xae,0x8d,0x9d,0x46,0x1f,0x34,0x1e,0x40,0x70,0x5b,0x83,0x00,0x02,0x00,0x8d,0x00,0x00,0x05,0x4e,0x04,0xc1,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x23,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22, -0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x10,0x27,0x35,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x33,0x32,0x36,0x05,0x4e,0xd6,0x62,0x4d,0x9f,0xfe,0xf0,0x9d,0xa4,0xfe,0xf0,0x9a,0x5a,0x91,0x5d,0x64,0x90,0x90,0x64,0x5c,0x3f,0x08,0x70,0xc3,0x76,0x6e,0xc5,0x75,0xec,0x01,0xb7,0xfc,0xeb,0x3f,0x25,0x2e,0x41, -0x0b,0x3f,0x3b,0x2b,0x39,0x04,0x07,0x6a,0xc1,0x87,0x9f,0xfe,0xed,0xa3,0xa5,0x01,0x22,0xaf,0xa0,0x01,0x21,0x8a,0xa4,0x72,0x6f,0xa6,0x3c,0x23,0x40,0x80,0xd5,0x76,0x74,0xc6,0x70,0x01,0x15,0xa7,0xa1,0xff,0x00,0x29,0x49,0x58,0x53,0x4b,0x4f,0x00,0x00,0x02,0x01,0x0d,0x00,0x00,0x04,0xcf,0x04,0xac,0x00,0x26,0x00,0x31,0x00,0x00, -0x01,0x21,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x21,0x01,0x34,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x04,0xcf,0xfd,0x93,0x48,0x68,0x35,0x73,0xa4,0x80,0x92,0x92,0x68,0x9c, -0x74,0x08,0x7d,0x63,0x5c,0x37,0x74,0x6a,0x9d,0xab,0xdb,0x25,0x70,0x5b,0x9e,0x5c,0x02,0x6d,0xfe,0xa4,0x5e,0x29,0x7f,0x17,0x20,0x6e,0x27,0x27,0x41,0x04,0x07,0x68,0x48,0x5e,0x32,0x63,0x6f,0x62,0x5d,0x7b,0x45,0x1b,0x16,0x6a,0x87,0x25,0x73,0x56,0xe3,0xb2,0x4e,0x53,0x7c,0xa5,0x5a,0x9f,0x5c,0xfd,0xa9,0x41,0x28,0x15,0x1a,0x2b, -0x29,0x00,0x00,0x02,0x01,0xc8,0xff,0xe8,0x05,0x54,0x03,0x7c,0x00,0x0b,0x00,0x1b,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x8e,0x7f,0xa0,0xa0,0x7f,0x7f,0xa0,0xa0,0x7f,0x7e,0xd0,0x78,0x78,0xd1,0x7d,0x7e,0xd0, -0x78,0x78,0xd0,0x81,0xa9,0x88,0x88,0xa9,0xa9,0x88,0x88,0xa9,0x99,0x76,0xd3,0x81,0x81,0xd3,0x76,0x76,0xd3,0x81,0x81,0xd3,0x76,0x00,0x00,0x02,0x00,0x24,0xfe,0x63,0x06,0xf8,0x05,0xb3,0x00,0x18,0x00,0x21,0x00,0x00,0x21,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x10,0x12,0x21, -0x20,0x00,0x11,0x03,0x11,0x10,0x26,0x23,0x22,0x06,0x11,0x11,0x06,0xf8,0xfa,0x99,0x67,0x5f,0x60,0x66,0x01,0x55,0xfe,0xb6,0xc2,0xb6,0xc4,0xb4,0x01,0x57,0xff,0x01,0x03,0x01,0x02,0x01,0x01,0xa4,0xb1,0xae,0xb0,0xae,0x3f,0x46,0x4a,0x3b,0x93,0x86,0x90,0x8f,0x8b,0x02,0x9d,0x01,0x44,0x01,0x3f,0xfe,0xc5,0xfe,0xb8,0xfd,0x63,0x02, -0x8e,0x01,0x05,0xf4,0xf8,0xfe,0xff,0xfd,0x72,0x00,0x00,0x01,0x00,0x37,0xff,0xe6,0x06,0xe5,0x05,0xb3,0x00,0x1e,0x00,0x00,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x06,0xe5,0xfc,0xd6,0x67,0x56,0xf8,0xd5,0xd5, -0xf8,0x66,0x83,0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x93,0x93,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x00,0x01,0x00,0x32,0xff,0xe6,0x06,0xe9,0x05,0xb3,0x00,0x2d, -0x00,0x00,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x07,0x06,0xe9,0xfd,0x59,0x53,0x52,0x6c,0x79,0x71,0x61,0xa4,0x61,0x71,0x7b,0x6a,0x66, -0x5d,0x9b,0x5f,0x6c,0xc5,0xbe,0x6e,0x96,0x21,0x08,0x20,0x96,0x6f,0x76,0xad,0x60,0x4b,0x30,0x93,0x93,0x51,0x74,0x01,0x4b,0xf6,0x01,0x12,0x01,0x00,0xc7,0xeb,0xfc,0x9a,0x03,0x66,0xea,0xc8,0xfb,0xfe,0xe9,0xf9,0xfe,0x87,0x77,0x37,0x7f,0x01,0xa8,0xe2,0x01,0x56,0x01,0x6e,0x74,0x6b,0x6a,0x75,0xa3,0xfe,0xc0,0xe1,0x99,0xfe,0x93, -0x56,0x00,0x00,0x02,0x00,0x7e,0xff,0xe6,0x06,0x9e,0x07,0xc8,0x00,0x30,0x00,0x3c,0x00,0x00,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x04,0x02,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x06,0x4e,0x79,0xd9,0x88,0xac,0xd5,0xd6,0xd3,0x80,0xaf,0xac,0xfe,0xf0,0x8c,0x6e,0x6e,0x95,0x71,0x7d,0xb3,0x01,0x60,0xde,0xfd,0xba,0x77,0x5b,0x79,0x7a,0x9b,0x9f,0x1d,0xac,0xbb,0xb2,0xd7,0x7f,0x94,0x5e,0x65,0xa7,0x55,0x4b,0xbb,0xb2,0x7c,0x69,0x80, -0xa8,0x02,0x8e,0xb7,0xfe,0xc0,0xb1,0x01,0x1c,0xdd,0xdb,0x01,0x6c,0x9e,0x54,0x9d,0xfe,0xec,0xb7,0xb6,0xfe,0xc4,0x9e,0x3a,0xa6,0x01,0x7d,0xaa,0xe3,0x01,0x57,0xc6,0x8c,0x5b,0x97,0x51,0x62,0x6e,0x3b,0x8a,0x3f,0xba,0x95,0x6f,0xcf,0x72,0x6b,0xfe,0xde,0xba,0x94,0xfc,0x55,0x8d,0xfe,0xc6,0xc1,0xa3,0xbe,0x01,0x24,0x00,0x00,0x01, -0x00,0x37,0xfd,0xfe,0x06,0xe5,0x07,0x61,0x00,0x43,0x00,0x00,0x05,0x27,0x12,0x11,0x10,0x00,0x21,0x22,0x00,0x02,0x11,0x10,0x12,0x04,0x33,0x32,0x12,0x35,0x10,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x13,0x07,0x02,0x11,0x10,0x00,0x33,0x32,0x16,0x15,0x10,0x07,0x15,0x16,0x16,0x15,0x14,0x02,0x06, -0x23,0x22,0x24,0x02,0x02,0x35,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x11,0x14,0x02,0x06,0x53,0x9e,0x8b,0xfe,0xaf,0xfe,0xd1,0xd4,0xfe,0xa5,0xb6,0x9c,0x01,0x0e,0xb4,0xbf,0xd4,0xf8,0x72,0x65,0x63,0x6d,0x73,0x7a,0xa8,0xa0,0x8b,0x99,0x96,0x01,0x03,0xed,0xb9,0xd3,0xae,0x67,0x7d,0x96,0xff,0xa8,0xa9,0xfe,0xea,0xc9,0x74,0xde,0x01, -0xaa,0x01,0x0a,0xef,0x01,0x6b,0xc2,0x4c,0x19,0x37,0x01,0x9f,0x01,0x92,0x01,0xa6,0x01,0xd3,0xfe,0xfe,0xfe,0x32,0xfe,0xcd,0xfe,0xd1,0xfe,0x00,0xff,0x01,0x24,0xfd,0x01,0x7d,0x96,0x9b,0x85,0xa2,0x8d,0xfe,0xe7,0xfe,0xbd,0xfe,0xb1,0xfe,0xae,0x37,0x01,0x75,0x01,0x5f,0x01,0x69,0x01,0x90,0xf0,0xca,0xfe,0xf8,0x67,0x06,0x1e,0xfc, -0xb4,0xc0,0xfe,0xb0,0xa8,0xb1,0x01,0x4d,0x01,0xd0,0xe9,0x01,0x60,0x02,0x19,0x01,0x33,0xfd,0xfe,0x2f,0xfe,0xc6,0xd7,0xfe,0x31,0x00,0x00,0x01,0x00,0x46,0xfd,0xfe,0x06,0xd6,0x05,0xb3,0x00,0x3e,0x00,0x00,0x17,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x20,0x11, -0x10,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x22,0x06,0x11,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x02,0x15,0x10,0x17,0xd0,0x41,0x49,0x51,0x92,0x64,0x56,0x7e,0x2a,0x05,0x24,0x86,0x5a,0x5b,0x6f,0x31,0x06,0x26,0x7f,0x60,0x01,0x3c,0x7f,0xe3,0x99, -0x8c,0x6f,0x7e,0x77,0xb3,0xad,0x59,0x4e,0x5e,0x51,0xa3,0x4e,0x5b,0x63,0x54,0xa3,0x49,0x55,0x32,0x52,0x2f,0x7d,0x1a,0x85,0x01,0x91,0xdc,0xe8,0x01,0x4b,0xa8,0x56,0x6b,0x5f,0x62,0x52,0x73,0x64,0x61,0xfc,0xcf,0xfe,0xaa,0xfd,0xe8,0xfe,0xea,0x2d,0xac,0x40,0x01,0xe2,0x01,0xf7,0x01,0x51,0x01,0x57,0xda,0xfe,0xfe,0xfc,0xc4,0x03, -0x3c,0x01,0x05,0xd7,0xe9,0xf1,0xfc,0xc2,0x03,0x3e,0x01,0x0b,0xcf,0x8b,0xfe,0xf9,0xb5,0xfe,0x46,0xfa,0x00,0x02,0x01,0x25,0xff,0xe6,0x05,0xf6,0x05,0xb3,0x00,0x0b,0x00,0x30,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x04,0x33,0x32,0x36,0x12,0x35,0x34,0x02,0x26,0x27,0x07,0x16,0x16,0x15, -0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x20,0x27,0x03,0x6e,0x6e,0x5e,0x5e,0x7a,0x6e,0x5d,0x63,0x76,0xfd,0xb9,0x68,0x01,0x05,0x92,0xa8,0xfd,0x84,0x86,0xe3,0x82,0x03,0x55,0x62,0x62,0xb1,0x6f,0xa9,0xc8,0x86,0xed,0x9a,0xcb,0x01,0x41,0xb8,0xb6,0xfe,0xb1,0xcb,0xfe,0xbf, -0xbe,0x04,0x1e,0x69,0x80,0x82,0x64,0x66,0x7c,0x78,0xfd,0x84,0x5c,0x60,0x95,0x01,0x0f,0xb0,0x9f,0x01,0x12,0xa3,0x07,0x08,0x1c,0x9b,0x60,0x65,0xa5,0x5d,0xc6,0xa3,0x7f,0xbd,0x66,0xb4,0xfe,0xa9,0xd3,0xdc,0xfe,0xab,0xbe,0x94,0x00,0x01,0x00,0x4b,0xfd,0xfe,0x06,0xd1,0x05,0xb3,0x00,0x2d,0x00,0x00,0x01,0x11,0x10,0x00,0x21,0x22, -0x26,0x27,0x35,0x17,0x16,0x33,0x32,0x36,0x35,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x21,0x11,0x06,0xd1,0xfe,0xcd,0xfe,0xe6,0x46,0x76,0x55,0x4a,0x69,0x70,0xbb,0xdc,0xfd,0xa2,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83, -0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x01,0x9a,0x05,0x99,0xfa,0xb4,0xfe,0xe3,0xfe,0xce,0x13,0x14,0xac,0x18,0x22,0xc6,0xa3,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74, -0x05,0x06,0x00,0x02,0x00,0x3d,0xff,0xe6,0x06,0xde,0x07,0xc8,0x00,0x3f,0x00,0x4a,0x00,0x00,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x17,0x36,0x36, -0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x10,0x33,0x32,0x12,0x06,0x9e,0x64,0xac,0x6c,0x88,0xad,0xb0,0xad,0x57,0x59,0x88,0x91,0xa2,0xea,0x8c,0x88,0x65,0x58,0x9a,0x5c,0x6b,0x6e,0xc5,0x81,0x75,0xab,0x20,0x07,0x2b,0xc0,0x7d,0x90,0x85,0x3d, -0x49,0x60,0x63,0x3b,0x64,0x3f,0x17,0x89,0x97,0x8e,0xad,0x67,0x75,0x48,0x54,0xa4,0x2b,0x30,0x8f,0x7f,0x9a,0x61,0x6e,0x02,0x8e,0xbb,0xfe,0xc2,0xaf,0x01,0x18,0xe1,0xdd,0x01,0x6f,0xa0,0x4f,0xf6,0xe6,0xfc,0xc2,0x03,0x3e,0x01,0xdc,0xfe,0xe3,0xfe,0xd4,0xb4,0xfe,0x8c,0x8c,0x37,0x98,0x01,0x9f,0xbb,0xe4,0x01,0x4a,0xad,0x90,0x81, -0x83,0x8e,0x87,0x3a,0xa8,0x5c,0x63,0x6d,0x1d,0x1e,0x8a,0x3f,0xb8,0x97,0x6f,0xd0,0x70,0x6d,0xfe,0xdd,0xb8,0xb7,0xd9,0x4b,0x84,0xfe,0xd5,0xcf,0xfe,0x9f,0x01,0x13,0x00,0x02,0x00,0xdf,0xff,0xf4,0x05,0x88,0x03,0xf1,0x00,0x0b,0x00,0x1b,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x24,0x26, -0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x04,0x03,0x32,0xc7,0xdf,0xdf,0xc7,0xc5,0xdd,0xdd,0xc5,0xaa,0xfe,0xee,0x97,0x95,0x01,0x13,0xab,0xae,0x01,0x14,0x94,0x97,0xfe,0xee,0x87,0xc2,0xa9,0xab,0xc1,0xc3,0xa9,0xa9,0xc2,0x93,0x7f,0xe9,0x96,0x97,0xea,0x7e,0x7f,0xe9,0x97,0x96,0xe8,0x80,0x00,0x00,0x02,0x00,0xa3, -0xff,0xf4,0x05,0xc4,0x03,0xf1,0x00,0x2b,0x00,0x37,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x04,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x27,0x26,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34, -0x26,0x23,0x22,0x06,0x02,0x49,0x74,0x5a,0x5d,0x77,0xe8,0xc2,0xb7,0xe7,0xa0,0x01,0x2c,0xc4,0xbf,0x01,0x2c,0xa6,0xcb,0xc2,0x6d,0x6f,0x7a,0xdc,0x8a,0xd9,0xfe,0xf9,0x3f,0x73,0x43,0x82,0x41,0x03,0x55,0x6a,0x6c,0x3a,0x2a,0x27,0x3a,0x39,0x28,0x2b,0x39,0x01,0xb7,0x58,0x78,0x7b,0x63,0xc5,0xf0,0x01,0x05,0xd6,0x9f,0xf9,0x8a,0x88, -0xfa,0x9d,0xc0,0xf6,0x27,0x95,0x1d,0xa8,0x83,0x74,0xb5,0x63,0xd9,0xb6,0x62,0x91,0x51,0x58,0x06,0x06,0x72,0x58,0x29,0x39,0x37,0x2b,0x29,0x39,0x39,0x00,0x00,0x02,0x00,0xc6,0x00,0x00,0x05,0xa2,0x05,0xe6,0x00,0x3e,0x00,0x4a,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23, -0x21,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x34,0x76,0x72,0x41,0x5d,0x15, -0x07,0x0d,0x6e,0x4a,0x7e,0x89,0xb7,0xa0,0xfd,0xd2,0xa1,0xb6,0xad,0x66,0x5b,0x02,0x00,0x5b,0x64,0x36,0x33,0x2e,0x3f,0x03,0x91,0x02,0x3e,0x2d,0x31,0x31,0x27,0x1e,0x05,0x04,0x55,0x44,0x44,0x57,0x64,0x5d,0x96,0xa9,0x01,0x67,0x1f,0x2e,0x2d,0x20,0x1e,0x2d,0x2e,0x02,0x98,0xb3,0xa9,0x48,0x45,0x3f,0x4e,0xaf,0x99,0xfe,0x9e,0x9b, -0xaf,0xb0,0x9a,0x04,0x9c,0xfb,0x6f,0x5b,0x60,0x60,0x5b,0x01,0x5e,0x55,0x5a,0x4c,0x3e,0x3e,0x4c,0x58,0x72,0x4f,0x73,0x10,0x05,0x05,0x18,0x42,0x58,0x59,0x41,0x4f,0x56,0xb1,0x3e,0x2b,0x20,0x20,0x2a,0x2a,0x20,0x20,0x2b,0x00,0x00,0x02,0x00,0xbb,0xff,0xf4,0x05,0xac,0x03,0xf3,0x00,0x2d,0x00,0x39,0x00,0x00,0x05,0x22,0x02,0x35, -0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x02,0x07,0x35,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x68,0xc3,0xea,0xc8,0xa4,0x5f,0x8d,0x24,0x1e, -0x91,0x63,0xa2,0xc1,0xc4,0xa5,0xb8,0x78,0x58,0x4e,0x53,0xab,0x58,0x4f,0x56,0x77,0x37,0x07,0x06,0x6f,0x58,0x5b,0x76,0x7a,0x55,0x29,0x39,0x39,0x29,0x2a,0x37,0x38,0x0c,0x01,0x1d,0xeb,0xdf,0x01,0x18,0x72,0x74,0x6b,0x7b,0xfe,0xea,0xdf,0xce,0xfe,0xe9,0x24,0x96,0x3c,0x01,0x37,0x92,0xd0,0x9c,0x91,0x91,0x9c,0xce,0x96,0xb0,0x74, -0x02,0x54,0x68,0x74,0x58,0x5d,0x79,0x01,0x38,0x02,0x39,0x29,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x02,0x00,0xcf,0xff,0xed,0x05,0x98,0x05,0x82,0x00,0x3b,0x00,0x47,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26, -0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x18,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda, -0xed,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0x01,0x6f,0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0x01,0xae,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57, -0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x45,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x00,0x03,0x00,0xcf,0xff,0xed,0x05,0x98,0x05,0x82,0x00,0x43,0x00,0x4f,0x00,0x5b,0x00,0x00,0x01,0x07,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16, -0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x14,0x16,0x33, -0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0xaa,0x08,0x9e,0x8f,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda,0xed,0xb0,0xc5,0x3d,0x74,0x59,0x64,0x72,0xdd,0x27,0x3b,0x38, -0x2a,0x27,0x3b,0x3c,0xfe,0x0f,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x04,0x3d,0x10,0x29,0x72,0x52,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x4f,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xb9,0x01, -0x03,0x58,0x3c,0x5c,0x5a,0x75,0x81,0xfc,0xf7,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x02,0xbc,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x02,0x01,0x08,0xff,0xf4,0x05,0x5f,0x05,0x6a,0x00,0x28,0x00,0x34,0x00,0x00,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x26,0x02,0x27,0x33,0x16,0x16,0x17,0x36,0x36,0x33, -0x32,0x04,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x6d,0x47,0x8b,0xa9,0xc6,0xae,0x9b,0x47,0xa9,0x46,0x30,0xae,0x49,0xd5,0x2c,0x49,0x25,0x30,0x91,0x3b,0xe7,0x01,0x05,0x7e,0xeb,0x98,0xca,0xfe,0xfa,0x7a,0x6a,0x58, -0x75,0x75,0x5b,0x60,0x3b,0x28,0x28,0x3b,0x3b,0x28,0x2a,0x39,0xb9,0x34,0xc2,0xb1,0xa2,0xb0,0x26,0x1f,0xa1,0x01,0x70,0x54,0x44,0xd5,0xa6,0x16,0x1a,0xfc,0xe7,0x98,0xec,0x80,0xd7,0xaa,0x6d,0x7c,0x74,0x5c,0x57,0x76,0xce,0x2a,0x39,0x3c,0x27,0x29,0x3b,0x3a,0x00,0x02,0x00,0x35,0xff,0xf4,0x06,0x33,0x05,0xe6,0x00,0x3b,0x00,0x47, -0x00,0x00,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x3e,0x02,0x33,0x32,0x12,0x15,0x14,0x06,0x07,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x21,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x06,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x05,0x06,0x06, -0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0xac,0xa3,0x53,0x8a,0x23,0x0d,0x48,0x66,0x36,0xa0,0xac,0x25,0x15,0x46,0x56,0x62,0xae,0x58,0xa4,0x66,0xfe,0xe2,0x5d,0x52,0x4d,0x2d,0x49,0x29,0xa7,0x01,0x53,0x47,0x51,0x58,0x37,0x07,0x06,0x70,0x58,0x5c,0x74,0x7b,0x64,0x80,0xc5,0x6a,0x01,0xbf,0x2a,0x3a,0x3a,0x2a,0x29,0x39, -0x3a,0x01,0xfc,0xf8,0x01,0x00,0x75,0x66,0x37,0x65,0x3f,0xfe,0xfe,0xf4,0x64,0xce,0x31,0x5f,0x5b,0x04,0x91,0xfb,0x64,0x5d,0x97,0x56,0xc8,0x01,0x36,0xa7,0xbd,0x45,0x8c,0x64,0x9f,0x96,0xb8,0xae,0xbb,0x69,0x02,0x57,0x65,0x75,0x57,0x5f,0x77,0x82,0xec,0x36,0x02,0x39,0x29,0x2a,0x38,0x3b,0x27,0x27,0x3d,0x00,0x00,0x02,0x00,0xa7, -0xff,0xf6,0x05,0xc1,0x05,0x82,0x00,0x40,0x00,0x4c,0x00,0x00,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x06,0x07,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x17,0x36,0x36, -0x33,0x32,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x21,0x16,0x1b,0x57,0x78,0x77,0x56,0x5c,0x77,0x9e,0x80,0x2f,0x57,0x56,0x45,0x3e,0x3e,0x1b,0x1e,0x25,0x18,0x10,0x02,0xda,0xfd,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c, -0xb4,0x16,0x6f,0x5d,0x26,0x49,0x49,0x52,0x46,0x4b,0x1c,0x2e,0x49,0x0d,0x9a,0x3b,0x29,0x27,0x3b,0x3a,0x28,0x27,0x3d,0x01,0x18,0x05,0x76,0x59,0x5a,0x75,0x7c,0x65,0xd1,0xfe,0xf7,0x27,0x46,0x4d,0x44,0x2e,0x33,0x57,0x84,0x1b,0x02,0xf1,0xc7,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71, -0x93,0x5f,0xca,0x39,0x8b,0x7f,0x22,0x39,0x54,0x4c,0x34,0x49,0x3d,0xd0,0x29,0x3b,0x39,0x2b,0x29,0x39,0x3a,0x00,0x00,0x02,0x00,0x67,0xff,0xf4,0x06,0x00,0x04,0xfe,0x00,0x37,0x00,0x43,0x00,0x00,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x02,0x06,0x23,0x22,0x26, -0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01,0x23,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x25,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x67,0xd9,0xc5,0x57,0x9d,0x2b,0x1e,0x51,0x38,0x1a,0x3f,0x4b,0x35,0x37,0x15,0x31,0x37,0xa8,0x54,0x79,0x43,0x23, -0x55,0x51,0x1d,0x2e,0x11,0x1d,0x2d,0x0b,0x01,0x13,0xc1,0xe5,0x3e,0x6d,0x3f,0x4a,0x67,0x31,0x3c,0x08,0x6f,0x58,0x5b,0x76,0x7a,0x65,0xc7,0xe6,0x01,0xbd,0x2a,0x39,0x3a,0x29,0x2a,0x37,0x38,0x01,0xdb,0xfa,0x01,0x1c,0x6a,0x57,0x94,0x7a,0x26,0x48,0x35,0x26,0xe1,0xa8,0x88,0xfe,0xe5,0x8f,0x32,0x51,0x1d,0x28,0x88,0x7f,0xfd,0x73, -0x02,0x46,0xa1,0x7a,0x63,0xb5,0x6a,0x9d,0x76,0x5c,0x6e,0x74,0x58,0x5d,0x79,0x01,0x06,0x32,0x02,0x3b,0x27,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x00,0x02,0x00,0xd0,0xff,0xf2,0x05,0x97,0x04,0xa3,0x00,0x0f,0x00,0x1e,0x00,0x00,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x13,0x32,0x36,0x35, -0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x03,0x3a,0xaa,0x01,0x18,0x9b,0x9e,0xfe,0xe6,0xaf,0xa9,0xfe,0xe7,0x9e,0xa0,0x01,0x1e,0xa2,0xcb,0xf2,0x6d,0xc7,0x7f,0x82,0xcd,0x71,0x71,0xc9,0x04,0xa3,0x9a,0xfe,0xed,0xad,0xad,0xfe,0xec,0x96,0x9c,0x01,0x14,0xa7,0xa9,0x01,0x15,0x9c,0xfb,0xe5,0xf9,0xc8,0x80,0xd0,0x74, -0x76,0xd0,0x80,0x7d,0xcf,0x73,0x00,0x02,0x00,0xd2,0xff,0xf7,0x05,0x95,0x04,0xa3,0x00,0x2a,0x00,0x36,0x00,0x00,0x05,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15, -0x10,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x4d,0x75,0x80,0x94,0x70,0xc9,0x81,0x85,0xc7,0x6e,0x85,0x6e,0x2d,0x15,0x38,0x69,0x48,0x48,0x6b,0x5b,0xa4,0x6f,0x75,0xbc,0x68,0xa0,0x01,0x11,0xaf,0xa5,0x01,0x15,0xa9,0xfd,0x93,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x09,0x70,0x69,0x01,0x19,0x97,0x65,0xb9, -0x6f,0x6a,0xbc,0x71,0x9a,0xb4,0x0b,0x34,0x4d,0x4b,0x69,0x6b,0x49,0x4e,0x81,0x49,0x73,0xd6,0x8e,0x97,0x01,0x07,0x92,0x8e,0xfe,0xfa,0x8f,0xfe,0x90,0x65,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x02,0x01,0x47,0xff,0xf2,0x05,0x21,0x06,0x66,0x00,0x25,0x00,0x31,0x00,0x00,0x25,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x01,0x36,0x12,0x37,0x17,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x08,0x26,0x26,0x65,0x4b,0x50,0x65,0x6c,0xc8,0x7e,0xa2,0xfb,0x8b,0x01,0x82,0x94,0xca,0x3a,0x92,0x2e,0x5c,0x75,0x8d,0x69,0x8f,0x57, -0x27,0x69,0xba,0x6a,0x61,0x90,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0xa1,0x26,0x3e,0x2d,0x50,0x62,0x68,0x4a,0x58,0x93,0x55,0x7f,0xe8,0x93,0x01,0x2b,0x01,0x35,0x77,0x01,0x06,0x9d,0x36,0x7b,0xa7,0x89,0x77,0x5a,0x91,0x7b,0x71,0x51,0x5c,0xa0,0x62,0x6b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0xa3,0xff,0xf2, -0x05,0xc4,0x06,0xac,0x00,0x45,0x00,0x50,0x00,0x5c,0x00,0x00,0x01,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x26,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x12,0x35,0x34, -0x2e,0x03,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x04,0x17,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0xe3,0xec,0x71,0x4f,0x26,0x1d,0x2a,0x44,0x67,0xe9,0xc2,0x6f,0x35,0x64,0xb5,0x71,0x62,0xcb,0x6a,0x47,0x9f,0x69,0x49,0x68,0x69,0x48,0x36,0x57, -0x16,0x27,0x1c,0x54,0x7a,0x7f,0x62,0x76,0x86,0x56,0x5d,0xa3,0x39,0x6d,0x81,0x1f,0x3c,0x59,0x73,0xb3,0x78,0x6a,0x3e,0x8b,0x66,0x56,0x01,0x2a,0x96,0xfd,0x51,0x27,0x2e,0x24,0x17,0x20,0x39,0xf9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0x66,0x71,0x2d,0x12,0x2d,0x1e,0x1d,0x2e,0x28,0x59,0x74,0x93,0xcf,0x8f,0xc0,0xfe,0xc6,0xae, -0x81,0x6f,0x78,0x78,0x69,0x49,0x4b,0x69,0x3b,0x30,0x32,0x4c,0x74,0x01,0x4f,0x72,0x72,0x97,0xd8,0xd4,0x9c,0xe5,0x73,0x81,0x01,0x1d,0xfc,0x65,0x92,0x6c,0x4c,0x3c,0x40,0x2b,0x43,0x57,0x3a,0x5f,0x82,0x68,0x53,0xfc,0x2e,0x69,0x77,0x81,0x93,0x39,0x3e,0x4c,0xe4,0xfd,0xf9,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03, -0x00,0xdd,0xff,0xf2,0x05,0x8a,0x06,0x3d,0x00,0x3d,0x00,0x47,0x00,0x53,0x00,0x00,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x24,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x05,0x0e,0x02,0x15,0x14,0x16,0x33,0x32, -0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0xa7,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x5c,0xbc,0xa9,0x01,0x42,0x85,0x4b,0x1e, -0xa8,0xb4,0xcc,0xfe,0xf4,0x87,0x98,0x44,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0xf8,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x5e,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x02,0x0e,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa5,0xe0,0x8c,0x2c,0x54,0x2f,0x34,0x41,0x2f, -0xa3,0xb0,0x86,0xa0,0x34,0x45,0x23,0x6d,0xa7,0xa2,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0xfe,0xb6,0x50,0x2c,0x1f,0x20,0x27,0x01,0x7b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x04,0x00,0xdd,0xff,0xf2,0x05,0x8a,0x06,0x3d,0x00,0x47,0x00,0x51,0x00,0x5c,0x00,0x68,0x00,0x00,0x01,0x14,0x06,0x23, -0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x25,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36, -0x36,0x35,0x35,0x33,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x77,0xd0,0xa8,0x23,0x72,0x80,0xc7,0x9c,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0x47,0x32,0x64,0x16,0x2b,0x3a,0x19, -0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x68,0xe7,0x01,0x20,0x0f,0x4c,0x66,0x4d,0x4a,0x67,0x0b,0x2b,0x3f,0xa5,0xfe,0x7f,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x7d,0x35,0x2a,0x17,0x1c,0x25,0x31,0xf7,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0xd5,0x99,0xbe,0x23,0x3c,0x31,0x4a,0xd9,0xb6,0xb9,0xd4, -0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa6,0xc8,0x9e,0x6b,0x08,0x35,0x5c,0x49,0x6b,0x71,0x47,0x18,0x1d,0x1c,0x6b,0x4b,0x5e,0xfa,0x87,0x50,0x2c,0x1f,0x20,0x27,0x03,0xf6,0x21,0x29,0x1c,0x29,0x27,0x1e,0x18,0x30,0xfd,0x83, -0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x44,0xff,0xf2,0x06,0x24,0x06,0xac,0x00,0x4d,0x00,0x58,0x00,0x64,0x00,0x00,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36, -0x33,0x32,0x05,0x07,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0xfe, -0x36,0x57,0x15,0x2e,0x40,0x54,0x94,0x54,0x5b,0x40,0x63,0x79,0x5a,0x5b,0x6f,0x5d,0x39,0x62,0x50,0x93,0x59,0x35,0x74,0xd1,0xa0,0x70,0x6f,0x92,0x5d,0xa7,0x01,0x70,0x46,0x8f,0xa7,0x5a,0x3f,0x1d,0x28,0x48,0x5f,0xfb,0xed,0x69,0x84,0xe1,0x82,0x9d,0x6d,0x71,0x98,0x87,0xe1,0x7e,0x76,0xcc,0x78,0x48,0x6b,0x6c,0xf0,0x14,0x25,0x21, -0x1a,0x1a,0x25,0xf4,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x03,0x50,0x3b,0x30,0x43,0xe3,0x6e,0x71,0xc0,0x6e,0x37,0x6f,0x87,0x62,0x7f,0x7f,0x62,0x87,0x6d,0x39,0x88,0xe6,0x80,0xa4,0xa7,0x7b,0x70,0x38,0x27,0x7e,0x4e,0x58,0x7d,0xbb,0x8b,0x43,0x4f,0x1e,0x2e,0x1d,0x20,0x2f,0x24,0x5d,0xb8,0xfe,0xfe,0xcb,0xaf,0xfe,0xd5,0xaa,0x6a, -0x6a,0x94,0x01,0x04,0x9f,0xa1,0x01,0x3a,0xb2,0x6b,0x49,0x49,0x69,0xfd,0xd9,0x14,0x57,0x17,0x2f,0x35,0x32,0x2a,0x4b,0x02,0x5b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x9a,0xfd,0xeb,0x05,0xce,0x04,0xa5,0x00,0x2d,0x00,0x37,0x00,0x43,0x00,0x00,0x01,0x24,0x33,0x32,0x12,0x15,0x11,0x23,0x11,0x34,0x26,0x26, -0x23,0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x32,0x01,0x16,0xc4,0xd3,0xef,0xa8,0x4d, -0x82,0x4b,0x4c,0xee,0x5f,0x39,0x39,0x57,0x74,0x44,0x49,0x68,0x69,0x48,0x3b,0x32,0x17,0x1a,0x22,0x48,0x41,0x57,0x66,0x70,0x4a,0x48,0x5f,0x44,0x29,0x3d,0x1b,0x24,0x26,0x19,0x2c,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x0f,0x96,0xfe,0xeb,0xf3,0xfb,0x4e,0x04,0xb2,0x66,0xab,0x61,0x4b,0x36,0xa7,0xba,0x55,0xea,0xa3,0x59, -0x69,0x49,0x4b,0x69,0x27,0x34,0x8f,0x37,0xac,0x73,0x22,0x69,0x52,0x4c,0x70,0x3c,0x92,0x5a,0x2a,0x1b,0x1b,0x30,0xfc,0xca,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x04,0x00,0xb9,0xfe,0xa4,0x05,0xae,0x04,0xa5,0x00,0x4a,0x00,0x5d,0x00,0x67,0x00,0x73,0x00,0x00,0x01,0x36,0x36,0x33,0x32,0x16,0x11,0x10,0x02,0x06,0x07,0x16, -0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x07,0x06,0x07,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x01,0x14,0x16, -0x33,0x32,0x36,0x37,0x36,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x35,0x01,0x06,0x06,0x05,0x34,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x43,0x1d,0xd2,0x3c,0xa8,0x98,0x19,0x38,0x34,0x5e,0x6b,0x48,0x49,0x6a,0x15,0x5b,0x45,0xbc,0x86,0x8c,0x3e,0x63,0x6e,0xae,0xbf, -0x02,0x0d,0x7d,0x54,0x1c,0x3c,0x40,0x56,0xa3,0x22,0x0f,0x14,0x39,0x4a,0x5a,0x36,0x58,0x60,0x39,0x2c,0x0d,0x62,0x3f,0x48,0x6b,0x6c,0x47,0x74,0xcf,0x7a,0x5c,0xa6,0x66,0x44,0x9c,0xfe,0x62,0x21,0x16,0x1c,0x60,0x60,0x82,0x01,0x21,0x42,0x21,0x2c,0x26,0x31,0xfd,0x99,0xae,0x87,0x03,0xb6,0x47,0x3c,0x26,0x1c,0x1c,0x25,0xfd,0x5f, -0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x3f,0x1b,0x49,0xee,0xff,0x00,0xfe,0xff,0xfe,0xf8,0x88,0x1b,0x35,0x7e,0x46,0x6c,0x6c,0x51,0x20,0x26,0x16,0x1e,0x57,0x41,0x2f,0x6a,0x67,0x56,0x95,0x53,0xe5,0x36,0x7a,0x72,0x7d,0x8f,0x3f,0x5a,0x13,0x05,0x03,0x24,0x2a,0x21,0x78,0x7b,0x3a,0x70,0x1b,0x44,0x50,0x6b,0x49,0x49,0x69,0x70, -0xc2,0x71,0x71,0xaf,0x5f,0x38,0xfb,0x11,0x1d,0x1f,0x25,0x2e,0x3e,0x68,0x06,0x19,0x7f,0x49,0x42,0xfe,0xf0,0x4d,0x5b,0x46,0x35,0x20,0x24,0x31,0x19,0x29,0x26,0x02,0xb8,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x15,0xff,0xf2,0x06,0x52,0x04,0xa1,0x00,0x33,0x00,0x3f,0x00,0x00,0x01,0x12,0x11,0x14,0x06,0x06, -0x23,0x22,0x26,0x26,0x35,0x37,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x10,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0xb0,0xa2,0x70,0xcd,0x84, -0x78,0xca,0x6a,0x03,0x0c,0xfe,0xe9,0x88,0x97,0x5e,0x17,0x50,0x30,0x48,0x6b,0x6c,0x47,0x6e,0xba,0x76,0xf3,0xcf,0xcf,0xf6,0x06,0x07,0x91,0x83,0x78,0x8d,0x9c,0xfc,0xa9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x9f,0xfe,0x8d,0xfe,0xdf,0x9f,0xf6,0x84,0x5f,0xb4,0x7a,0x56,0xcd,0x22,0x01,0x47,0xc6,0xb2,0xfe,0xf2,0x83,0x27,0x2f, -0x6b,0x49,0x49,0x69,0xb0,0x01,0x49,0xa5,0xf4,0x01,0x1d,0xfd,0xdc,0x30,0x6b,0x6c,0x33,0x7a,0x8c,0xbb,0xc8,0x01,0x1a,0x01,0x42,0xfb,0xfe,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x01,0x09,0x01,0xb4,0x04,0x6f,0x05,0x9a,0x00,0x0c,0x00,0x1c,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26, -0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0xbd,0x79,0x93,0x8d,0x7f,0x80,0x8a,0x42,0x78,0x50,0x74,0xcb,0x73,0x6d,0xc8,0x7d,0x75,0xcb,0x74,0x6f,0xca,0x05,0x09,0xc9,0x9a,0xa5,0xbc,0xbb,0xa6,0x62,0xa6,0x5b,0x91,0x86,0xe6,0x89,0x92,0xe3,0x7c,0x80,0xe4,0x8d,0x8c,0xe6,0x83,0x00, -0x00,0x01,0x01,0x22,0xff,0x83,0x04,0x56,0x05,0x9a,0x00,0x1d,0x00,0x00,0x05,0x36,0x00,0x35,0x34,0x02,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x00,0x07,0x01,0xa7,0xfa,0x01,0x0b,0x5d,0x3d,0x35,0xb1,0x60,0x42,0x39,0x9b,0x39,0x51,0xa5,0x01,0x14,0x6f,0x4b, -0x78,0x49,0x85,0xfe,0xf0,0xb0,0x19,0xe7,0x01,0xb7,0xba,0x97,0x01,0x33,0x35,0x39,0x18,0x4b,0xb0,0x43,0x4d,0x51,0xe6,0x5f,0x3a,0x78,0x5a,0x88,0xfe,0xed,0x90,0x9b,0xfe,0xae,0xfe,0x9b,0x9a,0x00,0x00,0x01,0x00,0xf8,0xff,0x83,0x04,0x80,0x05,0x9a,0x00,0x23,0x00,0x00,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32, -0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x12,0x13,0x03,0xe7,0x21,0x4d,0x63,0x85,0x57,0x74,0x5b,0x1b,0x6d,0xb8,0x41,0x41,0x5d,0x79,0x77,0x6a,0x53,0xf2,0x6d,0x42,0xa3,0xe7,0x6b,0xba,0xd0,0x38,0x61,0x64,0x62,0x88,0x1c,0x7d,0xf0,0x01,0x05,0xa0,0x59,0x36, -0x8c,0x3b,0x18,0x54,0xc7,0x48,0x59,0x63,0x90,0x73,0x85,0x90,0x7f,0x98,0x8b,0x5d,0x9f,0x89,0x5d,0x5f,0xfe,0x91,0xfe,0xff,0x00,0x01,0x01,0x0e,0xff,0x83,0x04,0x69,0x05,0x9a,0x00,0x31,0x00,0x00,0x01,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14, -0x06,0x06,0x07,0x16,0x17,0x07,0x02,0x21,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x01,0xa0,0x8c,0x8f,0x33,0x2e,0x59,0x4a,0x5c,0x69,0x4e,0xec,0x60,0x3c,0x8b,0xee,0x71,0x9c,0xbf,0xb1,0x8e,0x2d,0x63,0x53,0x88,0x5b,0x8d,0xa8,0xfe,0xa1,0x37,0x36,0x37,0x5f,0x69,0x85,0x6c,0x59,0x7c,0x78, -0x73,0x43,0x81,0x23,0x03,0x68,0x36,0x08,0x41,0x67,0x32,0x4b,0x4e,0x7f,0x5b,0x7b,0x77,0x79,0x99,0x84,0x8b,0x92,0x52,0x93,0x59,0x78,0x75,0x37,0x69,0xc4,0x4e,0x01,0x68,0x14,0x81,0x23,0x28,0x2c,0x97,0x46,0x53,0x5e,0x18,0x11,0x00,0x01,0x00,0xb7,0xff,0x83,0x04,0xc0,0x05,0x9a,0x00,0x22,0x00,0x00,0x01,0x20,0x11,0x34,0x37,0x22, -0x0e,0x02,0x15,0x14,0x12,0x12,0x04,0x17,0x07,0x26,0x00,0x00,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x17,0x06,0x15,0x14,0x16,0x33,0x37,0x07,0x06,0x04,0x68,0xfe,0x53,0x0e,0x2e,0xa9,0x76,0x1b,0x86,0xfb,0x01,0x1c,0x77,0x30,0x97,0xfe,0xb0,0xfe,0xe9,0x90,0x57,0x01,0x32,0x83,0x8e,0x27,0x13,0x8a,0x91,0x40,0x10,0x2a,0x02,0xa8,0x01, -0xc3,0x57,0x50,0x1c,0x23,0x2a,0x45,0x92,0xfe,0xa9,0xfe,0xad,0xf2,0x2b,0x88,0x32,0x01,0x13,0x01,0x80,0x01,0x7e,0xac,0x6f,0x61,0x58,0x29,0x9f,0x3f,0xb0,0x9e,0x05,0x9d,0x05,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0xff,0x05,0xae,0x00,0x16,0x00,0x00,0x01,0x12,0x12,0x17,0x07,0x26,0x02,0x03,0x06,0x23,0x22,0x26,0x02,0x03,0x37,0x17, -0x12,0x16,0x33,0x32,0x37,0x02,0x03,0x03,0x36,0x19,0xee,0xc2,0x4c,0x98,0xe5,0x46,0xa6,0x81,0x73,0x93,0x48,0x03,0xa5,0x08,0x09,0x69,0x6d,0x3c,0x91,0x3c,0x0b,0x05,0xae,0xfd,0xd5,0xfd,0x09,0x8f,0x7a,0x62,0x01,0x9b,0x01,0x24,0x56,0x9e,0x01,0x57,0x01,0x57,0x14,0x9d,0xfe,0xbf,0xf1,0x4e,0x01,0x2c,0x01,0x41,0x00,0x01,0x00,0x6c, -0xff,0xf6,0x05,0x0b,0x05,0x9a,0x00,0x2c,0x00,0x00,0x01,0x12,0x12,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x02,0x03,0x01,0x10,0x0d,0x94,0xef,0x9d,0x39,0x8f,0x5c,0x61,0x61,0x70, -0x7f,0x73,0x40,0xdb,0xaf,0x53,0xa0,0x5b,0x4e,0x9a,0x65,0x67,0x7a,0x5f,0x63,0x99,0x7d,0x57,0x35,0x8c,0xee,0x74,0xbe,0xfe,0xe1,0xb5,0x1f,0x04,0x66,0xfe,0xd1,0xfe,0x33,0xe3,0x5a,0x91,0x52,0x42,0x6d,0x31,0x38,0x3f,0x62,0x7a,0x4e,0x95,0xc0,0x45,0x42,0x73,0x69,0x6c,0x5a,0x3c,0x6a,0x34,0x51,0x4b,0x54,0x68,0x41,0x70,0xdb,0x8f, -0xf0,0x01,0xf1,0x01,0x75,0x00,0x00,0x01,0x00,0x3b,0xff,0xf6,0x05,0x3c,0x05,0xae,0x00,0x26,0x00,0x00,0x01,0x0a,0x02,0x23,0x22,0x26,0x27,0x36,0x37,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x02,0x03,0x27,0x12,0x12,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x02,0x07,0x16,0x33,0x32,0x36,0x12,0x12,0x13,0x05,0x3c,0x07,0x72,0xf7,0xd9, -0x71,0x98,0x45,0x0a,0x19,0x89,0x6d,0x67,0x6b,0x79,0x90,0x1b,0x8d,0x1c,0x68,0xb7,0x93,0x6f,0x9c,0x54,0x3e,0x73,0x3a,0x34,0x2c,0x83,0xa4,0x61,0x31,0x0a,0x05,0xae,0xfd,0xac,0xfd,0xa6,0xfe,0xf6,0x29,0x2a,0x18,0x2c,0xef,0x01,0x4f,0x8a,0x92,0x81,0xfe,0xe8,0xfe,0xbd,0x2f,0x01,0x1b,0x01,0x19,0x89,0x65,0xb1,0x68,0x69,0xfe,0xf8, -0xfe,0xe9,0x5c,0x10,0x77,0x01,0x01,0x01,0xc4,0x01,0xd7,0x00,0x00,0x01,0x00,0xcb,0xff,0x83,0x04,0xad,0x05,0xae,0x00,0x15,0x00,0x00,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x3e,0x02,0x37,0x17,0x04,0x07,0x36,0x33,0x32,0x04,0x12,0x17,0x04,0x14,0x12,0x80,0xa2,0xb4,0x5b,0x83,0x60,0x23,0x2b,0x9f,0xda,0x63,0x6a,0xfe,0xeb, -0x87,0x38,0x3e,0x89,0x01,0x1b,0xda,0x19,0x7d,0x81,0x01,0x4c,0xf6,0x85,0x39,0x7e,0x67,0xef,0xf2,0x56,0x64,0xff,0xf6,0x07,0xfe,0xfe,0x43,0xdb,0x00,0x01,0x00,0xe3,0xff,0x83,0x04,0x95,0x05,0x9a,0x00,0x25,0x00,0x00,0x05,0x26,0x35,0x10,0x12,0x00,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x2e,0x02,0x35, -0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x02,0x15,0x14,0x17,0x01,0x0e,0x2b,0xce,0x01,0x45,0xbc,0x66,0x6c,0x73,0x4b,0x28,0x85,0x72,0x21,0x7a,0xaa,0x5c,0x36,0x3d,0x3a,0x39,0x1e,0x2b,0x88,0xeb,0x91,0x2e,0x7d,0x95,0xc0,0x01,0x31,0x02,0x4d,0x01,0x44,0x4d,0x45,0x88,0x6b,0x46,0x33,0x1a,0x41,0x54,0x0f,0x91,0x12, -0x54,0x74,0x3d,0x28,0x56,0x3b,0x38,0x5c,0x2d,0x19,0x12,0xfe,0xda,0xfd,0xf6,0xfc,0xc5,0x78,0x00,0x02,0x00,0x47,0xff,0xf1,0x03,0xc8,0x03,0x6e,0x00,0x0f,0x00,0x1b,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xc8, -0x78,0xd2,0x78,0x78,0xd0,0x77,0x79,0xd0,0x76,0x79,0xd0,0x79,0x97,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x01,0xaf,0x76,0xce,0x7a,0x79,0xd0,0x75,0x7a,0xd1,0x74,0x75,0xd0,0x7a,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x01,0x00,0x5a,0xff,0xf1,0x03,0xb5,0x03,0x6e,0x00,0x1b,0x00,0x00,0x13,0x36,0x36,0x33,0x32,0x16,0x16,0x15, -0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x5b,0x3d,0xe0,0x84,0x79,0xcb,0x75,0x7c,0xd1,0x76,0x85,0xda,0x39,0x89,0x26,0x88,0x59,0x84,0xb0,0xac,0x7e,0x5c,0x93,0x24,0x02,0x68,0x7a,0x8c,0x7a,0xd0,0x75,0x73,0xd1,0x7a,0x91,0x7b,0x37,0x54,0x60,0xab,0x7c,0x7f,0xb9,0x65, -0x58,0x00,0x00,0x01,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x64,0x00,0x12,0x00,0x00,0x05,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xcc,0x70,0xc5,0x85,0x92,0xcf,0x6d,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x97,0x0d,0x91,0xef,0x75,0x6f,0xc7,0x82,0x52,0x8a,0x4d,0xc8,0xb1,0x03,0x5e, -0x00,0x01,0x00,0x5a,0xfd,0xfe,0x03,0xb5,0x03,0x6e,0x00,0x1f,0x00,0x00,0x01,0x01,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x27,0x01,0x02,0xea,0xfd,0xcb,0x2d,0x2e,0x89,0x26,0x88,0x59,0x83,0xb1,0xab,0x7f,0x5c,0x93,0x24,0x86, -0x3d,0xe0,0x84,0x79,0xcc,0x74,0x7c,0xd1,0x76,0x05,0x05,0x01,0xc2,0xfd,0xfe,0x02,0x7d,0x32,0x54,0x38,0x54,0x60,0xa8,0x7e,0x80,0xb4,0x65,0x58,0x46,0x7a,0x8c,0x78,0xcd,0x75,0x73,0xd1,0x7a,0x01,0xfe,0x07,0x00,0x01,0x00,0x5a,0xfd,0xfe,0x03,0xb5,0x03,0x6e,0x00,0x1f,0x00,0x00,0x13,0x01,0x07,0x23,0x22,0x26,0x26,0x35,0x34,0x36, -0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x07,0x01,0x79,0x01,0xb5,0x0b,0x06,0x75,0xd2,0x7c,0x74,0xcb,0x7a,0x84,0xdd,0x40,0x86,0x25,0x93,0x5b,0x7f,0xab,0xb2,0x82,0x59,0x88,0x26,0x89,0x2a,0x32,0xfd,0xe0,0xfd,0xfe,0x01,0xf9,0x01,0x7a,0xd0,0x74,0x74,0xcd,0x79,0x8b, -0x7b,0x46,0x58,0x65,0xb3,0x81,0x7e,0xa8,0x60,0x54,0x38,0x50,0x36,0xfd,0x83,0x00,0x00,0x02,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x6e,0x00,0x27,0x00,0x33,0x00,0x00,0x01,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16, -0x16,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x11,0x7a,0x52,0x55,0x73,0x82,0x61,0x5f,0x83,0x75,0xd3,0x81,0x86,0xc5,0x70,0x70,0xc6,0x85,0x91,0xcf,0x6d,0x98,0x4d,0x8d,0x5b,0x89,0x9b,0x99,0xfe,0x2b,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x02,0xdf,0x4e,0x0a,0x81, -0x56,0x5b,0x87,0x84,0x5d,0x7b,0xce,0x76,0x76,0xee,0x91,0xfe,0x7a,0x90,0xef,0x76,0x6e,0xc8,0x82,0x56,0x86,0x4d,0xc8,0xb1,0x01,0x6a,0xb0,0xbf,0xfe,0xd2,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x00,0x02,0x00,0x44,0xff,0xf1,0x03,0xcc,0x05,0xe9,0x00,0x2f,0x00,0x3b,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16, -0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x12,0x15,0x23,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x07,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xd3,0x86,0x5c,0x5e,0x85,0x38,0x2a,0x35,0xfb,0xc6,0x8a,0xc6,0x6a, -0x73,0xc5,0x82,0xd9,0xf5,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x01,0x23,0x94,0x96,0x3a,0x25,0x0a,0x0b,0x5e,0x83,0x7f,0x3c,0x27,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x02,0x7c,0x60,0x84,0x85,0x5e,0x52,0x43,0x1d,0x49,0x37,0x9f,0xbb,0x6a,0xd7,0x8c,0x02,0x54,0x8a,0xdf,0x6e,0xfe,0xf0,0xdb,0x60,0xa0,0x5c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x61, -0x5b,0x23,0x2d,0x10,0x01,0x83,0x60,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x3c,0x00,0x01,0x00,0x30,0xfe,0x05,0x03,0xe0,0x03,0x6e,0x00,0x32,0x00,0x00,0x05,0x0e,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06, -0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x03,0xe0,0x07,0x40,0x6d,0x4b,0x50,0x68,0x3a,0x1d,0x35,0x45,0x44,0x34,0x1c,0xaf,0x7c,0x7c,0xab,0x2d,0x7b,0x4a,0x79,0xd0,0x76,0x7a,0xd1,0x77,0x1e,0x32,0x50,0x58,0x35,0x2c,0x28,0x13,0x1d,0x1d,0x15,0x15,0xf9,0x48,0x74,0x46,0x32,0x5d,0x3b,0x3d,0x62,0x6e,0x6b,0x69, -0x6c,0x69,0x34,0x7f,0xa7,0xae,0x82,0x58,0x4a,0x52,0x72,0x82,0x7a,0xd1,0x74,0x72,0xca,0x79,0x34,0x75,0x68,0x7e,0x88,0x88,0x37,0x2a,0x2c,0x09,0x19,0x23,0x48,0x00,0x00,0x02,0x00,0x47,0xff,0xf0,0x03,0xc8,0x03,0x6e,0x00,0x1d,0x00,0x24,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07, -0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x25,0x34,0x26,0x27,0x16,0x17,0x36,0x02,0x6c,0x53,0x72,0xaf,0x7c,0x64,0xa0,0x1a,0x7c,0x9d,0x6e,0x51,0x77,0x84,0x79,0xd1,0x75,0x79,0xd0,0x79,0x9d,0x76,0xfe,0xc5,0x57,0x42,0x0a,0x74,0x1b,0x6f,0x1d,0xb5,0x6e,0x80,0xb0,0x76,0x5e,0x09,0x9b,0x6f,0x4d,0x9d, -0x1d,0x45,0xf8,0x92,0x72,0xc6,0x76,0x75,0xd0,0x7a,0x92,0xfe,0x2f,0xfd,0x45,0x66,0x04,0x91,0x7a,0x2e,0x00,0x02,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x6e,0x00,0x30,0x00,0x3c,0x00,0x00,0x25,0x34,0x36,0x33,0x33,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x20,0x11,0x11,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x33,0x14,0x06,0x06,0x23,0x22, -0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xd3,0x83,0x5e,0x0b,0x0a,0x25,0x3a,0x97,0x93,0xfe,0xdd,0x98,0x8b,0x5b,0x93,0x48,0x98,0x6e,0xcf,0x91,0x83,0xc4,0x73,0x6a,0xc7,0x89,0xc6,0xfb,0x35,0x2a, -0x38,0x82,0x61,0x5c,0x86,0x7f,0x3b,0x28,0x29,0x3b,0x3c,0x28,0x28,0x3b,0xe3,0x5e,0x83,0x01,0x10,0x2d,0x23,0x5c,0x60,0xfe,0xaf,0xfe,0x6e,0xb1,0xbe,0x4c,0x83,0x5a,0x82,0xc7,0x6f,0x6e,0xe0,0x89,0x01,0xcc,0x8c,0xd8,0x69,0xbc,0x9e,0x37,0x49,0x1d,0x43,0x52,0x5c,0x87,0x84,0x5e,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x3c,0x00,0x00,0x02, -0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x0f,0x00,0x1a,0x00,0x00,0x01,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x07,0x10,0x21,0x22,0x06,0x15,0x11,0x10,0x21,0x20,0x11,0x04,0x08,0xf6,0xd8,0x8a,0xc6,0x6a,0x74,0xc7,0x83,0xdb,0xef,0x97,0xfe,0xc9,0x88,0x9b,0x01,0x23,0x01,0x37,0x01,0xc8, -0xd6,0xfe,0xff,0x6a,0xd7,0x8c,0x02,0x54,0x85,0xe3,0x6f,0xf2,0xdc,0x0d,0x01,0x4c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x01,0x6f,0x00,0x01,0x00,0xa3,0xff,0xe7,0x03,0xe5,0x05,0xe8,0x00,0x09,0x00,0x00,0x13,0x25,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x05,0xa3,0x01,0xd1,0x1c,0x01,0x2b,0x2a,0xfe,0x30,0x1c,0xfe,0xd4,0x05,0x16,0xd2,0xfa, -0xcb,0x86,0x80,0xd2,0x05,0x35,0x83,0x00,0x00,0x01,0x00,0x9b,0x00,0x00,0x03,0xed,0x05,0xe9,0x00,0x22,0x00,0x00,0x13,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x9b,0x97,0x73,0x87,0xca,0xf7,0x51,0x92,0xaa, -0x80,0x66,0x37,0x94,0x43,0x77,0x9d,0x91,0x7d,0x42,0xaa,0x80,0x4e,0x83,0x29,0x04,0x12,0x01,0xd1,0x45,0x4b,0xed,0xbd,0x57,0x9f,0x9d,0x85,0x65,0x66,0x5d,0x2e,0xd1,0xe0,0x42,0x7b,0x7d,0x7b,0x71,0x81,0x7a,0x3e,0x7b,0xa0,0x4e,0x3c,0xbe,0x00,0x01,0x00,0x5d,0x00,0x00,0x04,0x2b,0x05,0xe3,0x00,0x12,0x00,0x00,0x33,0x01,0x33,0x03, -0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x03,0x5d,0x01,0xeb,0xa7,0xd1,0x28,0x2c,0x7d,0xcb,0x71,0x97,0xac,0x7e,0x44,0x3f,0xe9,0x05,0xe3,0xfd,0x83,0x08,0x6a,0xbd,0x70,0xfe,0x29,0x01,0xa7,0x7f,0xb9,0x1e,0xfd,0x3f,0x00,0x01,0x00,0x31,0xff,0xe7,0x04,0x56,0x05,0xe3,0x00,0x09,0x00,0x00,0x33,0x01, -0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x01,0x31,0x02,0x1d,0xb3,0x01,0x2c,0x29,0xfe,0x30,0x1c,0xfe,0x68,0x05,0xe3,0xfa,0xcf,0x87,0x80,0xd2,0x04,0x7a,0xfb,0x9f,0x00,0x00,0x02,0x00,0x57,0xff,0xf1,0x04,0x30,0x05,0xe3,0x00,0x11,0x00,0x1d,0x00,0x00,0x01,0x33,0x15,0x23,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21, -0x11,0x33,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x03,0xb6,0x7a,0x7a,0x67,0xbb,0x7a,0xd0,0xf3,0xf1,0xc9,0x01,0x0e,0x97,0xfe,0x62,0x8d,0x9d,0xa6,0x8e,0x40,0x78,0x45,0x03,0x6e,0x8f,0xfe,0xa0,0x7c,0xb3,0x5f,0xee,0xd0,0xcb,0xf4,0x02,0x75,0xfc,0xfc,0xa4,0x94,0x8a,0x9d,0x3a,0x64,0x3f,0x01,0x82,0x00,0x02, -0x00,0x57,0x00,0x00,0x04,0x30,0x05,0xe9,0x00,0x11,0x00,0x1d,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x33,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x04,0x30,0x7a,0x97,0xfe,0xf2,0xca,0xf0,0xf3,0xd0,0x79,0xbc,0x67,0x7a,0xfe,0xef,0x46,0x77,0x40,0x8e, -0xa6,0x9d,0x8d,0x01,0x07,0x02,0x6c,0xfd,0x94,0x02,0x6c,0xf4,0xcb,0xcf,0xef,0x5f,0xb3,0x7c,0xfe,0xa1,0x01,0x81,0x3f,0x65,0x39,0x9c,0x8a,0x96,0xa2,0x00,0x00,0x01,0x00,0xd7,0x00,0x00,0x03,0xb1,0x05,0xe3,0x00,0x07,0x00,0x00,0x13,0x21,0x01,0x21,0x15,0x21,0x01,0x21,0xd7,0x02,0xa8,0xfe,0x4f,0x01,0xe3,0xfd,0x50,0x01,0xaa,0xfe, -0x2c,0x05,0xe3,0xfa,0xac,0x8f,0x05,0x54,0x00,0x02,0x00,0x83,0xff,0xf1,0x04,0x04,0x05,0xfe,0x00,0x28,0x00,0x34,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27, -0x37,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x5e,0x4c,0x5a,0x6e,0x60,0x5f,0x6f,0x78,0xd2,0x78,0x78,0xd0,0x77,0x6a,0x63,0x5e,0x6f,0x5d,0x4d,0x63,0x36,0x3f,0xad,0x7a,0x7e,0xad,0x40,0x39,0x66,0x13,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x05,0xfb,0x3c,0xb3,0x6d,0x6f,0xca,0x3e,0x3d,0xc7,0x75,0x76, -0xce,0x7a,0x79,0xd0,0x75,0x72,0xc7,0x40,0x3d,0xc8,0x72,0x6e,0xb4,0x3d,0x6a,0x2a,0x7e,0x4d,0x81,0xae,0xb4,0x7b,0x4b,0x80,0x2b,0x66,0xfb,0xb4,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x00,0x02,0x00,0x83,0xff,0xdc,0x04,0x04,0x05,0xe9,0x00,0x27,0x00,0x33,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16, -0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0xf4,0x39,0x40,0xae,0x7d,0x7a,0xad,0x3f,0x36,0x63,0x4d,0x5d,0x6f,0x5e,0x61,0x6c,0x78,0xd0,0x77,0x78,0xd2,0x78,0x6f, -0x5f,0x61,0x6d,0x5b,0x4d,0x11,0xae,0x7d,0x7a,0xad,0xa9,0x7e,0x7e,0xad,0x46,0x2a,0x80,0x4b,0x7c,0xb3,0xae,0x81,0x4d,0x7e,0x29,0x6b,0x3d,0xb4,0x6e,0x71,0xc9,0x3d,0x3e,0xca,0x71,0x76,0xd0,0x78,0x7a,0xce,0x76,0x75,0xc6,0x3e,0x3f,0xc9,0x6f,0x6d,0xb3,0x3e,0x04,0x4e,0x7c,0xb3,0xae,0x81,0x81,0xae,0xb1,0x00,0x00,0x02,0x01,0x48, -0xff,0xec,0x04,0xbc,0x05,0xa3,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0xbc,0xd6,0xe5,0xe0,0xd9,0xda,0xdf,0xe0,0xdb,0xa0,0x8c,0x8f,0x8a,0x8d,0x88,0x8f,0x92,0x89,0x02,0xc8,0xfe,0x7a,0xfe,0xaa,0x01,0x58,0x01, -0x84,0x01,0x78,0x01,0x63,0xfe,0xa0,0xfe,0x85,0x01,0x3c,0x01,0x13,0xfe,0xe1,0xfe,0xd0,0xfe,0xc9,0xfe,0xe7,0x01,0x11,0x00,0x00,0x01,0x01,0x21,0xff,0xec,0x04,0xe2,0x05,0xa3,0x00,0x2c,0x00,0x00,0x01,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x00,0x11,0x14,0x02,0x04, -0x23,0x22,0x27,0x27,0x16,0x33,0x32,0x36,0x12,0x35,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0xcd,0x29,0x30,0x4c,0x34,0x3e,0x4c,0x94,0x6f,0x9e,0xbc,0x77,0xd6,0x84,0xeb,0x01,0x05,0xaf,0xfe,0xcf,0xc4,0x48,0x50,0x1b,0x5f,0x68,0x93,0xdc,0x81,0xfe,0xa4,0x88,0x9d,0x68,0x54,0x3a,0x02,0xf2,0x0b,0x42,0x27,0x32,0x4e,0x5a, -0x3f,0x68,0x95,0xd9,0xb3,0x7b,0xd3,0x79,0xfe,0xa1,0xfe,0xb6,0xe2,0xfe,0x95,0xc1,0x0a,0xa5,0x19,0x92,0x01,0x1e,0xb6,0x02,0x2f,0xbd,0x90,0x66,0x88,0x00,0x00,0x02,0x00,0x74,0xff,0xec,0x05,0x8f,0x06,0x3b,0x00,0x4c,0x00,0x55,0x00,0x00,0x13,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36, -0x35,0x11,0x34,0x23,0x22,0x06,0x07,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27, -0xa4,0x66,0x65,0x57,0x24,0x47,0x3e,0x6c,0x68,0x30,0x5f,0x5a,0x53,0x24,0x20,0x2c,0x62,0x22,0x5a,0x2f,0x23,0x2c,0x5c,0x52,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x92,0x6a,0x2d,0x83,0x41,0x69,0x76,0x85,0x59,0x34,0x56,0x54,0x59,0x37,0x36,0x5e,0x5b,0x5f,0x37,0x78,0x77,0x26,0x35,0x02,0x1d,0x22,0x1c,0x37,0x4d, -0x28,0x06,0x3b,0x13,0x72,0x6e,0xfb,0xa2,0x72,0x11,0x17,0x28,0x19,0x1e,0x19,0x38,0x20,0x03,0xbd,0x8a,0x46,0x38,0x2a,0x33,0x74,0x55,0x56,0xbd,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x01,0xfd,0xa8,0x9b,0x82,0x3a,0x48,0x9b,0x8b,0xfc,0x21,0x45,0x6d,0x19,0x1e,0x19,0x19,0x1e,0x19,0x67,0x6d,0x04,0x44,0x5b,0x43,0x0f,0xfc,0xd9, -0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x02,0x00,0x43,0xff,0xec,0x05,0xc1,0x05,0xa3,0x00,0x28,0x00,0x31,0x00,0x00,0x21,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x25,0x14, -0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x21,0x82,0x62,0x69,0x82,0xa0,0x82,0x69,0x63,0x81,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0xd4,0xb0,0x64,0xa2,0x35,0x6c,0xcf,0xaf,0xd5,0xfb,0x22,0x22,0x1c,0x37,0x4d,0x28,0x04,0x1e,0x70,0x89,0x8a,0x6f,0xfb,0xe2,0x04,0x1e,0x6f,0x8a,0x8a,0x6f,0xfd,0xc0,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59, -0x4e,0x03,0x89,0xb5,0xd2,0x44,0x42,0x86,0xd1,0xb6,0xfb,0xe4,0xba,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x01,0x00,0xf0,0xff,0xec,0x05,0x14,0x06,0x27,0x00,0x3d,0x00,0x00,0x01,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x00,0x25,0x36,0x36,0x35,0x35, -0x33,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x03,0xef,0x51,0x37,0x08,0x57,0x44,0xb6,0xe7,0xf1,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x01,0x00,0x01,0x1e,0xa9,0x97,0xa0,0x5a,0xac,0xa3,0xa4,0xb7,0x5a,0x6a, -0x64,0x2e,0x77,0x7d,0x2d,0x93,0xa6,0xb8,0x9f,0x96,0xb3,0x58,0x44,0x39,0x50,0x02,0x26,0x39,0x4f,0x3b,0x44,0xdc,0x90,0xdd,0x56,0xa0,0x21,0x11,0x12,0xc2,0x9f,0x01,0x0f,0x01,0x05,0x01,0x2e,0x4e,0x2d,0x61,0x41,0x7b,0x73,0x56,0x81,0x58,0x2b,0x2c,0x82,0xc7,0x8b,0xd6,0x83,0x89,0x0f,0x0f,0x01,0x3d,0xd9,0x93,0xb1,0xc8,0xcb,0xa7, -0x4c,0x5e,0x4f,0x00,0x00,0x02,0x00,0xd6,0xff,0xec,0x05,0x2e,0x06,0x3b,0x00,0x4e,0x00,0x5a,0x00,0x00,0x01,0x06,0x06,0x15,0x15,0x14,0x06,0x06,0x23,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x06,0x15,0x14, -0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x3e,0x02,0x35,0x35,0x34,0x36,0x37,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x2e,0x37,0x23,0x7d,0xf5,0x8f,0xae,0xaf,0x6a,0x64,0x2e,0x77,0x7d,0x2d,0xfe,0xc7,0xc5, -0x92,0x96,0xb3,0x58,0x44,0x39,0x50,0x51,0x37,0x08,0x57,0x44,0x53,0x63,0xf9,0xdf,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x43,0x8b,0x72,0x61,0x7a,0x62,0x5f,0x84,0x1b,0x41,0x62,0x38,0x67,0x64,0xfd,0x3f,0x30,0x23,0x24,0x31,0x31,0x24,0x23,0x30,0x05,0xb1,0x10,0x45,0x58,0x53,0x56,0x80,0x47,0x1d,0xbe,0xaf,0x86,0x83,0x89, -0x0f,0x0f,0x01,0x7c,0xf5,0x8b,0xb8,0xcb,0xa7,0x4c,0x5e,0x4f,0x3a,0x39,0x4f,0x3b,0x44,0x60,0x53,0x7a,0xc7,0x3d,0xa0,0x21,0x11,0x12,0xc2,0x9f,0xbf,0x7f,0xa2,0x7d,0x2a,0x43,0x70,0x5f,0x83,0x86,0x5b,0x34,0x33,0x01,0x2e,0x4b,0x25,0x88,0x6f,0x71,0x13,0xfe,0x57,0x23,0x30,0x30,0x23,0x24,0x31,0x31,0x00,0x01,0x01,0x0f,0xff,0xec, -0x04,0xf5,0x06,0x3b,0x00,0x3a,0x00,0x00,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x33,0x32,0x00,0x11,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26, -0x35,0x34,0x36,0x02,0xe0,0x16,0x3a,0x54,0x68,0x9c,0x89,0xb3,0xa9,0xac,0xa5,0x6d,0xba,0x2e,0x65,0x11,0x0c,0x04,0x2f,0x2d,0x2f,0x60,0x6c,0x02,0x70,0x74,0xfc,0x01,0x09,0xff,0xf1,0x84,0xd6,0x77,0xbc,0x9e,0x49,0x77,0x43,0x4c,0x3e,0x35,0x4b,0x30,0x02,0x9d,0x16,0x88,0x66,0x90,0xbd,0x01,0x08,0x01,0x13,0x9e,0xef,0xed,0x63,0x4e, -0x72,0x26,0x1b,0x15,0x19,0x2a,0x3e,0x0c,0x8a,0x13,0x72,0x4b,0x38,0xfe,0xc8,0xfe,0xd0,0xba,0xfe,0xbd,0xfe,0xae,0x79,0xd3,0x7b,0xb3,0xd9,0x44,0x76,0x43,0x3f,0x5a,0x4f,0x31,0x27,0x42,0x00,0x02,0x00,0x8f,0xff,0xec,0x05,0x74,0x06,0x3b,0x00,0x37,0x00,0x40,0x00,0x00,0x01,0x16,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11, -0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x04,0xa9,0x66,0x65,0x85,0x72,0x72,0x7f,0x28,0x30,0x23,0x63, -0x52,0x2b,0x5a,0x54,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x91,0x6a,0x6c,0x84,0x6a,0x76,0x54,0x27,0x2d,0x29,0x31,0xfc,0xb5,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x15,0x6e,0x65,0xfb,0x6d,0x64,0x70,0x69,0x5d,0x03,0xdb,0x46,0x44,0x49,0x5f,0x33,0x74,0x55,0x56,0xfd,0x73,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e, -0x03,0xcd,0xa8,0x9b,0x82,0x82,0x9d,0x89,0xfc,0x67,0x6c,0x39,0x39,0x04,0x2c,0x57,0x3c,0x08,0xfb,0x09,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x01,0x01,0x0b,0xff,0xec,0x04,0xf9,0x06,0x27,0x00,0x45,0x00,0x00,0x01,0x14,0x0e,0x02,0x07,0x0e,0x04,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x17,0x16,0x16,0x17,0x32,0x36,0x35,0x34, -0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x35,0x33,0x04,0xf9,0x2e,0x54,0x92,0x9a,0x7e,0x72,0x56,0x3a,0x20,0x3b,0x36,0x22,0x5a,0x2f,0x23,0x2c,0x2f,0x54,0x2b,0x41,0x39,0x52, -0x3c,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x8a,0x9e,0x8e,0x6a,0x92,0x6a,0x2d,0x84,0x40,0x6c,0x82,0x38,0x73,0xc5,0xc1,0x72,0x71,0x3a,0xa0,0x05,0xb4,0x4a,0x72,0x55,0x44,0x26,0x20,0x36,0x4e,0x73,0xa1,0x6f,0xfe,0xf0,0x44,0x46,0x46,0x38,0x2a,0x32,0x3b,0x39,0x01,0x9f,0x98,0x75,0x90,0x07,0x0a,0x39,0x23,0x2b,0x45, -0x4c,0x3a,0x60,0x80,0xe4,0xbc,0xb9,0xf9,0x82,0x3b,0x47,0xa1,0x85,0x01,0x2c,0x8b,0xcd,0x8f,0x6c,0x39,0x23,0x3d,0x52,0x30,0x7b,0x00,0x00,0x01,0x01,0x20,0xff,0xec,0x04,0xe3,0x06,0x3b,0x00,0x43,0x00,0x00,0x01,0x06,0x06,0x15,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x21,0x07,0x23,0x22,0x06,0x15,0x14,0x16, -0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x10,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x34,0x36,0x37,0x04,0xe3,0x37,0x23,0xa2,0x22,0x8e,0x61,0x6a,0x85,0x35,0x63,0x46,0x01,0x3c,0x10,0xed,0x8f,0xb5,0xb8, -0x8c,0x91,0xa8,0x41,0x30,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x7e,0x8d,0x78,0xda,0x87,0xdf,0xfe,0xfb,0xdc,0x57,0x5e,0xe0,0xb6,0xa3,0x69,0x67,0x64,0x05,0xb1,0x10,0x45,0x58,0xa4,0x56,0x61,0x70,0x5b,0x35,0x58,0x32,0x8c,0xb2,0x91,0x8f,0xb7,0x7d,0x6d,0x49,0x5e,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80, -0xa7,0x99,0x6c,0xa2,0x58,0xf1,0xcd,0x01,0x2d,0x69,0x26,0x8b,0x5b,0x9b,0xbc,0x5b,0x6f,0x71,0x13,0x00,0x00,0x02,0x00,0x9d,0x00,0x45,0x03,0xaf,0x05,0xa3,0x00,0x0e,0x00,0x1d,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x12,0x37,0x14,0x02,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33, -0x32,0x12,0x03,0x08,0x60,0x4c,0x4e,0x7c,0x4e,0x33,0x55,0x2f,0x4f,0x77,0x47,0xa7,0x75,0xc9,0x87,0x67,0x95,0x51,0x7a,0xd7,0x7c,0x98,0xad,0x03,0x81,0xb6,0xe2,0xb0,0xfe,0xa8,0xb8,0x72,0xb7,0x62,0xa8,0x01,0x5f,0xa0,0xf3,0xfe,0x7f,0xbc,0x8f,0x01,0x1e,0xba,0xd5,0x01,0x5e,0xc4,0xfe,0xd5,0x00,0x01,0x00,0xb6,0xfe,0xf1,0x03,0x95, -0x05,0xa3,0x00,0x2e,0x00,0x00,0x01,0x14,0x02,0x02,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x16,0x33,0x32,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x12,0x36,0x33,0x32,0x12,0x03,0x95,0x5d,0x88,0xa7,0x50,0x3b,0x7b,0x4d,0x4d,0x11, -0x1f,0x06,0x0b,0x51,0x2d,0x46,0x93,0x53,0x3c,0x36,0x42,0x75,0x4d,0x27,0x10,0x09,0x5f,0x1d,0x11,0x38,0x22,0x74,0xcc,0x7a,0x7f,0x8b,0x03,0x60,0xec,0xfe,0x42,0xfe,0xdd,0xa2,0x4f,0x7b,0x3a,0x12,0x3a,0x20,0x3b,0x61,0x01,0x52,0x01,0xf7,0xcb,0xb6,0xca,0xc0,0xfe,0xa8,0x90,0x72,0x8f,0x29,0x17,0x15,0x1a,0x44,0x68,0x96,0x5a,0x01, -0x0e,0x01,0x9e,0xe2,0xfe,0xd5,0x00,0x01,0x00,0x36,0x00,0x8a,0x04,0x16,0x05,0xa3,0x00,0x3f,0x00,0x00,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x12,0x36,0x33, -0x32,0x16,0x15,0x14,0x03,0x03,0x36,0x33,0x32,0x16,0x33,0x32,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x04,0x16,0x0f,0x6e,0x65,0x44,0x1f,0x3a,0x1f,0x2b,0x35,0x0a,0x09,0x15,0x3e,0x0b,0x01,0x1a,0x29,0x31,0x68,0x41,0xb8,0x9e,0x55,0x30,0x09,0x5f,0x1c,0x13,0x31,0x21,0x6f,0xcc,0xf4,0x72,0x78,0x89,0xa9,0xc5,0x0d,0x14,0x18,0x2c,0x1b, -0x17,0x62,0x21,0x0b,0x0d,0x0b,0x23,0x4c,0x02,0x21,0x11,0x2d,0xd7,0x60,0x12,0x22,0x07,0x40,0x10,0x16,0x16,0x02,0x32,0x52,0xaa,0x28,0xb2,0x9b,0xf7,0xfe,0xeb,0x89,0x5b,0x7d,0x18,0x11,0x17,0x47,0x5b,0x8b,0x3f,0xbf,0x01,0x6d,0x01,0x23,0xa5,0xa4,0x86,0x71,0xfe,0xbb,0xfe,0x84,0x04,0x09,0x8d,0x51,0x1c,0x17,0x23,0x00,0x00,0x01, -0x00,0x5a,0x01,0x73,0x03,0xf1,0x05,0xa3,0x00,0x54,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x07,0x22,0x35,0x35,0x34,0x37,0x37,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x06, -0x23,0x22,0x26,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x16,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x16,0x03,0xe4,0x62,0x7f,0x2a,0x11,0x2d,0x28,0x23,0x23,0x10,0x36,0x43,0x20,0x9b,0x2a,0x3b,0x19,0x15,0x16,0x2b,0x31,0x38,0x24,0x23,0x30,0x27,0x1b,0x11,0x2f,0x2b,0x25,0x48,0x29, -0x23,0x38,0x58,0x35,0x0d,0x11,0x0d,0x6b,0x1e,0x12,0x36,0x5f,0xa8,0x72,0x29,0x68,0x16,0x5e,0x61,0x36,0x53,0x2f,0x54,0x50,0x8d,0x18,0x1c,0x20,0x4f,0x1c,0x0d,0x15,0x11,0x32,0x02,0x62,0x22,0x71,0x51,0x07,0x0f,0x03,0x24,0x0d,0x0e,0x71,0x39,0x01,0x23,0x4d,0xc1,0x35,0x26,0x31,0x32,0x61,0x90,0x5d,0x5c,0x66,0x2e,0x1d,0x11,0x14, -0x6d,0x5e,0xb5,0x62,0x26,0x26,0x82,0xfe,0xf1,0x90,0x4b,0x5c,0x3c,0x29,0x16,0x14,0x41,0xc6,0x49,0xe7,0x01,0x75,0xb7,0x32,0x23,0x55,0x32,0x57,0x33,0x4a,0xf1,0x94,0xfe,0x0b,0x3e,0x32,0x18,0x24,0x00,0x01,0x00,0xc5,0xff,0xc3,0x03,0x86,0x05,0xa7,0x00,0x26,0x00,0x00,0x01,0x32,0x16,0x16,0x15,0x10,0x02,0x06,0x23,0x22,0x26,0x35, -0x34,0x12,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x02,0xea,0x20,0x4c,0x30,0x69,0xba,0x83,0x8c,0x8f,0x8d,0x81,0x1a,0x15,0x0e,0x57,0x2c,0x75,0x5d,0x43,0x3b,0x4a,0x6e,0x40,0x28,0x2e,0x08,0x54,0x05,0xa7,0x9c,0xed,0x6b,0xfe,0xef,0xfe,0x1c, -0xfb,0xee,0xe8,0xd0,0x01,0x65,0x8e,0x1c,0x36,0x0c,0x14,0x3a,0xa0,0xfe,0xed,0x98,0x94,0xbb,0xde,0x01,0xa1,0xca,0x94,0xb9,0x49,0x0c,0x13,0x11,0x4a,0x00,0x00,0x01,0x00,0xab,0x01,0x46,0x03,0xa0,0x05,0xa7,0x00,0x33,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x27,0x27,0x06,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x35, -0x34,0x36,0x33,0x32,0x16,0x15,0x07,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x27,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x17,0x13,0x17,0x16,0x03,0xa0,0x3b,0x29,0x19,0x2e,0x19,0x1a,0x18,0x0a,0x05,0x06,0x29,0x35,0x5a,0x49,0x57,0x65,0x2d,0x1e,0x37,0x27,0x1d,0x04,0x2a,0x2b,0x30,0x38,0x0d,0x06,0x0b,0x1d, -0x14,0x16,0x04,0x3e,0x17,0x1b,0x17,0x14,0x0b,0x04,0x64,0x3c,0x24,0x01,0xdd,0x17,0x23,0x7b,0x8b,0x8a,0x77,0x80,0x2b,0x7f,0xfe,0x64,0xa3,0x51,0x71,0xe0,0xf8,0x21,0x1b,0x15,0x14,0xed,0x72,0x68,0xa7,0xd6,0x5a,0xa9,0x3a,0x3c,0x40,0x10,0x45,0x11,0x11,0x1f,0x18,0x47,0x45,0x18,0xfe,0x6e,0xd2,0x7f,0x00,0x01,0x00,0x79,0xff,0xc3, -0x03,0xd2,0x05,0xa3,0x00,0x40,0x00,0x00,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x10,0x02,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x02,0x15,0x10,0x12,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x27,0x26,0x35,0x34, -0x36,0x33,0x32,0x15,0x14,0x07,0x06,0x15,0x14,0x02,0x72,0x14,0x2a,0x16,0x78,0x94,0xc8,0xbe,0x88,0xd5,0x76,0x60,0xad,0xd8,0x60,0x37,0x26,0x10,0x2a,0x2f,0xb7,0xdc,0xa1,0x8a,0x70,0x72,0x7c,0x17,0x2e,0x20,0x01,0x01,0x17,0x22,0x1f,0x17,0x0e,0x0d,0x08,0x08,0x1d,0x30,0x4f,0x0b,0x0b,0x03,0x2a,0x06,0x0d,0xb3,0x93,0xfe,0xee,0xfe, -0xde,0xb1,0x01,0x49,0xd2,0x9a,0x01,0x1e,0xdb,0x81,0x13,0x1a,0x31,0x1d,0x12,0x07,0x1a,0xfe,0xa4,0xff,0xfe,0xee,0xfe,0xc6,0xb9,0xc6,0xf6,0x31,0x49,0x19,0x1c,0x1d,0x15,0x22,0x33,0x5d,0x5c,0x35,0x26,0x44,0x44,0x24,0x29,0x28,0x3e,0x1e,0x46,0x47,0x2e,0x23,0x00,0x01,0x00,0x74,0xff,0xf6,0x03,0xd8,0x05,0xa3,0x00,0x3e,0x00,0x00, -0x01,0x10,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x10,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x03, -0xd8,0x91,0x9e,0x6b,0x60,0x0d,0x0c,0x34,0x3c,0x3c,0x30,0x34,0x35,0x08,0x1a,0x59,0x19,0x2b,0x53,0x42,0x9b,0x89,0x78,0x90,0x0c,0x0c,0x41,0x34,0x34,0x5b,0xa1,0x60,0x23,0x46,0x47,0x20,0x09,0x20,0x14,0xab,0x62,0x95,0xeb,0x83,0x02,0xa5,0xfe,0x97,0xfe,0xba,0xb8,0xb6,0x33,0x95,0x94,0x30,0x7c,0x71,0xb2,0xb6,0x85,0xdd,0x6d,0x0f, -0x1b,0x0f,0x15,0x4f,0xab,0x01,0x50,0x71,0xea,0x01,0x09,0xbd,0x9b,0x31,0x94,0x89,0x39,0xfe,0xf8,0x01,0x20,0x01,0x07,0xa6,0x01,0x23,0xa8,0x16,0x17,0x21,0x2f,0x1e,0x18,0x31,0xc4,0xfe,0x9f,0x00,0x00,0x01,0x00,0xa8,0x00,0x45,0x03,0xa4,0x05,0xa7,0x00,0x31,0x00,0x00,0x01,0x14,0x07,0x06,0x06,0x07,0x0e,0x02,0x23,0x22,0x27,0x26, -0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x37,0x37,0x32,0x17,0x17,0x32,0x37,0x3e,0x04,0x17,0x32,0x16,0x03,0xa4,0x2e,0x24,0x56,0x16,0x1b,0x17,0x20,0x0f,0x26,0x47,0x47,0x23,0x24,0x3f,0x3f,0x20,0x1d,0x27,0x67,0x01,0x43,0x09,0x44,0x23,0x31,0x12,0x14,0x26, -0x57,0xfe,0xef,0x39,0x34,0x0e,0x65,0x20,0x11,0x21,0x0e,0x1f,0x0e,0x54,0x20,0x17,0x1f,0x4e,0x02,0xc6,0x14,0x4c,0x4b,0xd1,0x55,0x69,0x2a,0x1d,0x0f,0x0e,0x0e,0x0f,0x25,0x26,0x30,0x01,0x24,0x03,0xa9,0x1a,0x1a,0x13,0x0e,0x34,0x2f,0x5b,0xe2,0xfd,0x1f,0x07,0x04,0x10,0x03,0x68,0x2d,0x60,0x25,0xd5,0x34,0x03,0x27,0x00,0x00,0x01, -0x00,0xce,0xff,0xc3,0x03,0x7d,0x05,0xa7,0x00,0x37,0x00,0x00,0x01,0x14,0x06,0x23,0x27,0x26,0x23,0x22,0x35,0x34,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14, -0x16,0x17,0x16,0x03,0x51,0x25,0x0d,0x22,0x5d,0x3d,0x3b,0x21,0x33,0x40,0x16,0x3c,0x30,0x72,0x79,0x73,0x66,0x4c,0x31,0x35,0x09,0x10,0x16,0x42,0x5d,0x89,0x4e,0x72,0xa8,0x5b,0xe6,0xd5,0x6e,0x86,0x2e,0x55,0x0e,0x13,0x24,0x33,0x21,0x01,0x94,0x13,0x4e,0x04,0x12,0x3b,0x18,0x54,0x81,0xdb,0x97,0x48,0x72,0x80,0xfe,0x9f,0xfe,0xc4, -0xfe,0xf4,0xfe,0xda,0x3c,0x40,0x0b,0x3a,0x19,0x21,0x61,0x3d,0xa4,0x01,0x3b,0xde,0x01,0x85,0x01,0xa2,0xd1,0xab,0x4c,0xc0,0xe1,0x23,0x29,0x0e,0x10,0x0f,0x0b,0x08,0x00,0x02,0x00,0xc3,0xff,0xe7,0x05,0x05,0x04,0x19,0x00,0x0b,0x00,0x17,0x00,0x00,0x05,0x22,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15, -0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xe4,0xf5,0xfe,0xd4,0x01,0x2c,0x01,0x01,0xf8,0x01,0x1d,0xfe,0xdf,0xfa,0xb3,0xcc,0xd0,0xaf,0xb5,0xbe,0xbe,0x19,0x01,0x21,0xec,0x01,0x02,0x01,0x23,0xfe,0xe7,0xfc,0xfb,0xfe,0xde,0x03,0xa6,0xd9,0xba,0xb5,0xd2,0xcb,0xc0,0xc1,0xce,0x00,0x01,0x01,0x6a,0xff,0xe7,0x04,0x5e,0x04,0x19, -0x00,0x15,0x00,0x00,0x01,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x01,0x70,0x72,0x9e,0xdf,0xff,0xfe,0xf8,0xf2,0x8e,0x6c,0x69,0x8f,0xa9,0xad,0xa1,0x9d,0x96,0x74,0x03,0xd3,0x46,0xfe,0xe5,0xf6,0xfe,0xfc,0xfe,0xe3,0x38,0xa2,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x00, -0x00,0x02,0x01,0x08,0xfd,0x6d,0x04,0xc0,0x04,0x19,0x00,0x1c,0x00,0x27,0x00,0x00,0x01,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x00,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x8b,0x7b,0xb8,0x50,0xa8,0xdf,0x77, -0xb4,0x63,0x1d,0x0c,0x73,0x60,0x64,0x71,0x80,0x86,0xb6,0xb8,0xfe,0xd1,0x68,0x2f,0x33,0x60,0x2b,0x33,0x31,0xfd,0x6d,0x23,0x28,0xaa,0x6c,0x79,0xe6,0x9d,0x02,0x25,0xb3,0x65,0x59,0x65,0x70,0x61,0x6d,0x6a,0xe8,0xdd,0xfd,0x9e,0xfe,0xce,0xfe,0xad,0x06,0x3d,0x35,0x31,0x5f,0x34,0x2d,0x30,0x34,0x00,0x00,0x01,0x01,0x20,0xfd,0x6d, -0x04,0xa7,0x04,0x19,0x00,0x25,0x00,0x00,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x10,0x00,0x21,0x23,0x27,0x17,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x04,0x27,0x01,0x20,0x78,0xa2,0xc0,0xc6,0xb9,0xb2,0xad,0x82,0x7d,0xb2,0xf7,0x01,0x1a,0xfe,0xdd,0xfe,0xf1,0x1a,0x19, -0x53,0xb6,0xe0,0x44,0x43,0x36,0x36,0x59,0x49,0x94,0x8f,0x87,0x78,0x66,0x27,0xc1,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x9c,0x46,0xfe,0xe4,0xf5,0xfe,0xfc,0xfe,0xe3,0x02,0x5d,0xd2,0xb8,0x1b,0x90,0x20,0x52,0x80,0x9c,0x94,0x7b,0x1e,0x00,0x01,0x01,0x21,0xfd,0x6d,0x04,0xa6,0x04,0x19,0x00,0x21,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16, -0x33,0x32,0x24,0x37,0x15,0x03,0x06,0x02,0x07,0x23,0x36,0x12,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x03,0x36,0xb0,0xbf,0x9e,0x9b,0x57,0x01,0x09,0x46,0xcd,0xa7,0xaf,0x26,0xbb,0x3e,0xea,0x01,0x24,0x6d,0x8b,0xd4,0xfe,0xff,0x84,0xf5,0x98,0x73,0xbf,0x3c,0x41,0xcd,0x03,0x8f,0xa9,0x9c, -0x93,0x98,0x3e,0x24,0x9c,0xfe,0xf7,0xd5,0xfe,0xe1,0x7b,0xa9,0x01,0x5d,0x01,0x50,0x30,0xed,0xce,0x87,0xd2,0x72,0x26,0x20,0x9c,0x29,0x2f,0x00,0x00,0x01,0x00,0x3c,0xfd,0x6d,0x05,0x8c,0x04,0x19,0x00,0x32,0x00,0x00,0x01,0x10,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x11,0x34,0x26,0x26,0x23,0x22, -0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x05,0x8c,0xfa,0x6c,0x79,0x14,0x83,0x0e,0x2e,0x26,0x5e,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b, -0x77,0x88,0xa5,0x4e,0xfe,0x81,0xfe,0xec,0x75,0x64,0x50,0x24,0x2f,0x2d,0x30,0x32,0x8b,0x03,0x79,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca,0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0x00,0x01,0x01,0x05,0xff,0xe7,0x04,0xc3,0x07,0x62,0x00,0x31,0x00,0x00,0x01,0x10,0x12,0x33, -0x32,0x36,0x35,0x34,0x27,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x00,0x11,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x01,0xa9,0xb1,0xc5,0x7a,0x84,0x7c,0x77,0x4b,0x32,0x1b,0x96,0x8b,0x73,0x54,0x29,0x60,0x3e,0x41,0x46, -0x57,0x75,0x66,0x65,0xd8,0xcc,0xfe,0xed,0xfe,0xf9,0x01,0x3b,0x01,0x2f,0xb6,0x98,0xa5,0xa7,0xe7,0xe1,0x02,0xe9,0xfe,0xb3,0xfe,0xd7,0x57,0x51,0x5b,0x4a,0x46,0x3b,0x45,0x4f,0x33,0x7f,0x92,0x2b,0x90,0x13,0x20,0x4c,0x39,0x33,0x55,0x43,0x3b,0x89,0x56,0xa0,0xa0,0x01,0x72,0x01,0x90,0x01,0x40,0x01,0x97,0x01,0xa2,0x4e,0xaa,0x6d, -0xfe,0x9d,0xfe,0x86,0x00,0x01,0x00,0x50,0xfd,0x6d,0x06,0xdc,0x04,0x19,0x00,0x32,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15, -0x14,0x06,0x23,0x22,0x11,0x04,0xfc,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0x5e,0x27,0x2d,0x0e,0x83,0x15,0x79,0x6d,0xfa,0x02,0x00,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca, -0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0xfc,0x85,0x89,0x32,0x30,0x2d,0x2f,0x26,0x3e,0x70,0x79,0x01,0x14,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xfe,0x04,0x00,0x00,0x0e,0x00,0x00,0x01,0x06,0x02,0x07,0x23,0x36,0x12,0x37,0x33,0x16,0x12,0x17,0x23,0x26,0x02,0x02,0xe4,0x2b,0xc5,0x6e,0xbd,0x9a,0xf7,0x36,0xa8,0x3b,0xf2,0x99, -0xbc,0x71,0xc3,0x03,0x31,0xbc,0xfe,0x3c,0xb1,0xe1,0x02,0x2e,0xf1,0xfe,0xfd,0xe1,0xe3,0xb6,0x01,0xc4,0x00,0x01,0x01,0x01,0xfd,0x6d,0x04,0xc6,0x04,0x19,0x00,0x24,0x00,0x00,0x01,0x10,0x21,0x32,0x16,0x15,0x10,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33, -0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x01,0x01,0x02,0x11,0xd1,0xe3,0xfe,0xcd,0xfa,0x08,0xa0,0x08,0x2b,0x35,0x48,0x3d,0x8b,0x81,0xb3,0xb6,0xf8,0xe9,0x8f,0x86,0x7e,0x9f,0xfe,0xc4,0xfe,0xbb,0x01,0x29,0x02,0xf0,0xea,0xdb,0xfe,0x62,0xdd,0x30,0x12,0x18,0x27,0x2f,0x30,0x8e,0x8b,0x9b,0xa2,0xfe,0xd6,0xfe,0xbc,0xfe,0x74,0xfe,0x65, -0x52,0xa0,0x3d,0x01,0xe3,0x00,0x00,0x01,0x00,0xd6,0xff,0xe7,0x04,0xf1,0x05,0xfa,0x00,0x22,0x00,0x00,0x01,0x32,0x16,0x17,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x06,0x07,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x11,0x34,0x12,0x02,0x9f,0x68,0xa6,0x29,0x75,0x3f,0xb0,0x35, -0x2f,0x54,0x75,0x8d,0x6e,0x5d,0x8d,0x98,0xad,0xa9,0x82,0x76,0x6c,0x8e,0xf2,0xfe,0xf8,0xf2,0x04,0x19,0x5f,0x56,0xa4,0xfc,0x8b,0x6b,0x6a,0x8e,0x65,0xa9,0x9a,0x97,0x5b,0x6f,0xce,0xb5,0xc7,0xd0,0x4e,0xa2,0x38,0x01,0x1a,0x01,0x07,0xfc,0x01,0x15,0x00,0x03,0x00,0x8b,0xff,0xe8,0x05,0x79,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x33, -0x00,0x00,0x01,0x02,0x21,0x22,0x26,0x27,0x0e,0x02,0x23,0x20,0x03,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x12,0x33,0x32,0x36,0x36,0x35,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x34,0x26,0x26,0x23,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x00,0x05,0x79,0x01,0xfe,0x9f,0x59,0x9d,0x1f,0x0f,0x53,0x76, -0x3c,0xfe,0x9e,0x01,0xa1,0x1f,0x5a,0x49,0x63,0x62,0xa1,0x02,0xc0,0x47,0x5a,0x21,0x99,0xfe,0x94,0xfe,0xfd,0xfe,0xfd,0xfe,0x94,0x01,0x6d,0x01,0x02,0x01,0x01,0x01,0x6e,0xa1,0x7e,0xd5,0x7b,0xbc,0xfe,0xef,0x01,0x0c,0xc1,0xc5,0x01,0x09,0x06,0xd0,0xfe,0x51,0x57,0x4e,0x2c,0x4e,0x2b,0x01,0xaf,0x62,0x7a,0x42,0x86,0x98,0xfe,0xe2, -0x3e,0x75,0x6b,0xfb,0x87,0xfe,0xfd,0xfe,0x94,0x01,0x6e,0x01,0x01,0x01,0x01,0x01,0x6e,0xfe,0x94,0xfe,0xfd,0x80,0xdb,0x83,0xfe,0xe3,0xc1,0xbe,0xfe,0xe0,0x01,0x23,0x00,0x01,0x02,0xb1,0x00,0x00,0x03,0x52,0x06,0xd0,0x00,0x03,0x00,0x00,0x21,0x23,0x11,0x33,0x03,0x52,0xa1,0xa1,0x06,0xd0,0x00,0x04,0x00,0x1f,0xff,0xe8,0x05,0xe4, -0x06,0xe8,0x00,0x20,0x00,0x2c,0x00,0x38,0x00,0x45,0x00,0x00,0x25,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x11,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x07,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35, -0x34,0x36,0x33,0x32,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x05,0xe4,0x73,0x9d,0x78,0x9b,0x86,0x4c,0x9d,0x5e,0xa2,0x72,0x50,0x49,0xcb,0x90,0x90,0xca,0x01,0x8f,0x7b,0x79,0x91,0x6f,0x9e,0x85,0x4d,0x6b,0x4b,0xfd,0x93,0x3d,0x2d,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0xfd,0xd0,0x3e,0x2d,0x2b,0x40,0x40, -0x2b,0x2d,0x3e,0x01,0x77,0x76,0x54,0x50,0x7a,0x3a,0x3d,0x53,0x54,0x76,0x69,0x81,0x6d,0x5a,0xaf,0x04,0x3a,0x1d,0x5d,0x62,0x77,0x90,0xcb,0xcc,0x8f,0x78,0xbb,0x20,0xfc,0xa4,0x61,0x6b,0x5b,0x5b,0x01,0xe4,0x2d,0x3d,0x3e,0x2c,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0x3d,0x2d,0x2e,0x3d,0x3e,0x02,0xa8,0x56,0x74,0x71,0x59,0x53,0x3d,0x3a, -0x72,0x00,0x00,0x02,0x00,0xb7,0x00,0x00,0x05,0x4d,0x06,0xe8,0x00,0x29,0x00,0x35,0x00,0x00,0x01,0x10,0x21,0x23,0x11,0x23,0x11,0x21,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x20,0x36,0x35,0x34,0x26,0x23,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x01,0x34,0x26,0x27, -0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x4d,0xfe,0x8f,0x5f,0xa1,0x01,0x00,0x79,0x67,0x43,0xa7,0xa1,0x01,0x02,0x89,0x71,0x6f,0x76,0x19,0xbb,0x80,0x8c,0xcf,0xcb,0x90,0x7c,0xbf,0x19,0x76,0x01,0x71,0xc5,0xc5,0xfd,0x8f,0x76,0x54,0x51,0x79,0x6f,0x5b,0x56,0x74,0x03,0x16,0xfe,0xf9,0xfd,0xf1,0x02,0xa0,0x40,0x4a,0x34,0x3b, -0x12,0x91,0x42,0x4d,0x4c,0x2f,0x75,0xa0,0xc7,0x95,0x90,0xcb,0x9c,0x75,0xf8,0xb6,0x32,0x07,0x35,0x01,0xd2,0x55,0x74,0x01,0x71,0x59,0x51,0x79,0x76,0x00,0x00,0x01,0x00,0xd7,0x00,0x00,0x05,0x2d,0x06,0xd0,0x00,0x12,0x00,0x00,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x01,0x07,0x01,0x11,0x21,0x11,0x33,0x11,0x21,0x05, -0x2d,0xa1,0xfe,0xc7,0xa1,0xfe,0x25,0xa3,0x01,0xa5,0x72,0xfe,0xcb,0x01,0x3a,0xa1,0x01,0xda,0x02,0x48,0xfd,0xb8,0x02,0x48,0x04,0x88,0xfe,0x58,0x72,0x01,0x39,0xfc,0xea,0x01,0x22,0xfe,0xde,0x00,0x00,0x01,0x00,0xf9,0xff,0xe9,0x05,0x0b,0x06,0xd0,0x00,0x1b,0x00,0x00,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22, -0x00,0x07,0x23,0x11,0x33,0x01,0x07,0x01,0x11,0x36,0x37,0x36,0x33,0x32,0x16,0x16,0x05,0x0b,0xd5,0x96,0x37,0x7c,0x95,0x86,0x70,0xd8,0xfe,0xef,0x01,0xa1,0xa3,0x01,0xa6,0x72,0xfe,0xca,0x51,0x87,0x7f,0x93,0x71,0xb5,0x61,0x01,0xa6,0x9a,0xf6,0x2d,0x7b,0x21,0xb4,0x6d,0x62,0x74,0xfe,0x82,0xfe,0x06,0xd0,0xfe,0x58,0x72,0x01,0x39, -0xfb,0xf9,0x89,0x47,0x47,0x51,0x9e,0x00,0x00,0x02,0x01,0x37,0xff,0xe8,0x04,0xcd,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x00,0x01,0x14,0x06,0x23,0x20,0x11,0x10,0x13,0x21,0x35,0x21,0x36,0x37,0x21,0x15,0x21,0x06,0x07,0x21,0x15,0x21,0x02,0x11,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04, -0xcd,0xcc,0x8f,0xfe,0x6e,0x7d,0xfe,0xda,0x01,0x61,0x47,0x7a,0x01,0x74,0xfe,0xf2,0x47,0x2f,0x01,0x2f,0xfe,0x94,0x8b,0x69,0x88,0x8f,0xcc,0x91,0x72,0x58,0x59,0x72,0x70,0x5b,0x5a,0x70,0x01,0x44,0x90,0xcc,0x02,0x57,0x01,0x2d,0x01,0x53,0x92,0xa2,0xdd,0x92,0x83,0x6a,0x92,0xfe,0xa1,0xfe,0xde,0x60,0xcc,0x8e,0x50,0x79,0x78,0x51, -0x50,0x7b,0x7a,0x00,0x00,0x02,0x00,0x33,0xff,0xe8,0x05,0xd0,0x06,0xe8,0x00,0x1f,0x00,0x2b,0x00,0x00,0x13,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x11,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06, -0x33,0x73,0x9d,0x76,0x9d,0x83,0x4e,0x9e,0x5d,0xa3,0x75,0x96,0xca,0x92,0x8f,0xcc,0x98,0x72,0x77,0x93,0x70,0x9d,0x85,0x4c,0x69,0x4e,0x03,0x26,0x77,0x53,0x54,0x77,0x78,0x53,0x53,0x77,0x06,0x67,0x81,0x6d,0x5b,0xb0,0xfb,0xc5,0x1c,0xc0,0x76,0x90,0xcb,0xca,0x91,0x77,0xc0,0x1b,0x03,0x5d,0x62,0x6c,0x5b,0x5b,0xfb,0x47,0x53,0x77, -0x76,0x54,0x54,0x76,0x77,0x00,0x00,0x04,0x01,0x1c,0xff,0xe8,0x04,0xe8,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x39,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x37,0x26,0x03,0x33,0x16,0x16, -0x33,0x32,0x36,0x37,0x33,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xad,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0xfd,0x7f,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0x02,0xbc,0xfe,0xe6,0xcc,0xcc,0xfe,0xe6,0xda,0xd9,0x01,0xa2,0x01,0xbd,0x86,0x87,0xbd,0x01,0xa1,0x02,0xd8,0xda,0xa1,0xbf, -0x86,0x86,0xbe,0xbf,0x85,0x86,0xbf,0x06,0x18,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0xfb,0x8c,0xc7,0xfe,0xde,0x01,0x20,0xc9,0x01,0x02,0x95,0x93,0x01,0x00,0x7e,0xc5,0xc7,0x7c,0xfe,0xff,0x92,0x95,0xfe,0xfe,0x7f,0xc7,0xc6,0x80,0x83,0xc5,0xc7,0x00,0x00,0x03,0x00,0x45,0xff,0xe9,0x05,0xbe, -0x06,0xe8,0x00,0x28,0x00,0x35,0x00,0x41,0x00,0x00,0x01,0x14,0x06,0x07,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x27,0x06,0x21,0x22,0x24,0x27,0x34,0x37,0x36,0x33,0x20,0x17,0x36,0x35,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x32,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x06,0x07,0x14,0x16,0x33,0x32,0x36, -0x01,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x20,0x37,0x05,0xbe,0x92,0x81,0x2f,0x2f,0x79,0xf2,0x98,0xb0,0xc2,0x07,0xb5,0xfe,0xc7,0xcb,0xfe,0xec,0x01,0x8b,0x8a,0xcb,0x01,0x38,0xb6,0x07,0x01,0x7c,0x96,0xca,0x91,0x90,0xcc,0x92,0x3b,0x3a,0x55,0x55,0x74,0x01,0x71,0x59,0x56,0x74,0xfe,0x9f,0x8c,0xfe,0xe6,0x87,0xb8,0x57, -0x93,0x55,0x01,0x1b,0x8b,0x05,0x8d,0x76,0xc2,0x1d,0x18,0x86,0x74,0x72,0x88,0x9d,0xeb,0x9e,0x1d,0xa1,0x2b,0xd7,0xa0,0x28,0x29,0xc4,0xd8,0x95,0x97,0x6a,0x6c,0xc3,0x28,0x28,0x18,0x1d,0xbf,0x79,0x90,0xca,0x01,0xcc,0x8f,0x57,0x38,0x3b,0x76,0x54,0x51,0x79,0x76,0xfd,0xef,0xc2,0x74,0x50,0x32,0x5e,0x33,0xc1,0xff,0xff,0x00,0x00, -0xfd,0xff,0x03,0xbd,0xff,0xbb,0x02,0x26,0x0b,0x59,0x00,0x00,0x00,0x27,0x0b,0x5f,0x02,0x6d,0x00,0x00,0x00,0x07,0x0b,0x53,0x03,0x04,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x97,0xff,0xbb,0x02,0x26,0x0b,0x5a,0x00,0x00,0x00,0x67,0x0b,0x5f,0x02,0x47,0x00,0x00,0xc0,0x01,0x40,0x00,0x00,0x07,0x0b,0x53,0x02,0xde,0x00,0x00, -0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x97,0xff,0xbb,0x02,0x26,0x0b,0x5b,0x00,0x00,0x00,0x67,0x0b,0x5f,0x02,0x47,0x00,0x00,0xc0,0x01,0x40,0x00,0x00,0x07,0x0b,0x53,0x02,0xde,0x00,0x00,0xff,0xff,0xff,0x9c,0x05,0x77,0x00,0x67,0x06,0x40,0x02,0x06,0x0b,0x66,0x00,0x00,0xff,0xff,0xfe,0xe6,0x05,0x77,0x01,0x1b,0x06,0x40,0x02,0x27, -0x0b,0x66,0xff,0x4a,0x00,0x00,0x00,0x07,0x0b,0x66,0x00,0xb4,0x00,0x00,0xff,0xff,0xff,0x9c,0xfe,0x8d,0x00,0x67,0xff,0x56,0x02,0x06,0x0b,0x67,0x00,0x00,0xff,0xff,0x00,0x31,0x00,0x00,0x03,0x17,0x05,0xd5,0x02,0x26,0x0b,0x6a,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0x9f,0x00,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x05,0xd5, -0x02,0x26,0x0b,0x6b,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xea,0x00,0x00,0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x05,0xd5,0x02,0x26,0x0b,0x6c,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0xad,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x05,0xd5,0x02,0x26,0x0b,0x82,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0xf3,0x00,0x00,0x00,0x02, -0x00,0x6d,0xff,0xe8,0x01,0xcc,0x05,0xb2,0x00,0x0d,0x00,0x1b,0x00,0x4d,0x40,0x2e,0x11,0x03,0x7e,0x18,0x0a,0x0a,0x1d,0x1b,0x14,0x0d,0x06,0x15,0x91,0x14,0x0d,0x91,0x00,0x2f,0x14,0x01,0x20,0x00,0x50,0x00,0x80,0x00,0xb0,0x00,0xd0,0x00,0xe0,0x00,0x06,0x14,0x00,0x14,0x00,0x06,0x1b,0x91,0x0e,0x04,0x07,0x91,0x06,0x13,0x00,0x3f, -0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x10,0xed,0x01,0x2f,0x33,0x33,0x33,0x12,0x39,0x2f,0x33,0xe9,0x32,0x31,0x30,0x13,0x32,0x16,0x15,0x14,0x06,0x23,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x11,0x32,0x16,0x15,0x14,0x06,0x23,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x6d,0x91,0xce,0xce,0x91,0x52,0x65,0x65,0x52, -0x91,0xce,0xce,0x91,0x52,0x65,0x65,0x52,0x02,0xa6,0xce,0x91,0x91,0xce,0x98,0x06,0x6e,0x53,0x53,0x6e,0x06,0x03,0xa4,0xce,0x91,0x91,0xce,0x98,0x06,0x6e,0x53,0x53,0x6e,0x06,0x00,0x02,0x00,0x5a,0x01,0x80,0x01,0x52,0x05,0xb2,0x00,0x0d,0x00,0x1b,0x00,0x30,0x40,0x18,0x11,0x03,0xed,0x18,0x0a,0x0a,0x1d,0x1b,0x14,0x0d,0x06,0x07, -0x96,0x06,0x0d,0x96,0x00,0x15,0x96,0x14,0x1b,0x96,0x0e,0x04,0x00,0x3f,0xed,0xd6,0xed,0xd6,0xed,0xd6,0xed,0x01,0x2f,0x33,0x33,0x33,0x12,0x39,0x2f,0x33,0xe9,0x32,0x31,0x30,0x13,0x16,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x5a,0x68, -0x90,0x90,0x68,0x36,0x3a,0x3a,0x36,0x68,0x90,0x90,0x68,0x36,0x3a,0x3a,0x36,0x03,0x70,0x02,0x91,0x65,0x65,0x91,0x02,0x82,0x05,0x3b,0x36,0x36,0x3b,0x05,0x02,0xc4,0x02,0x91,0x65,0x65,0x91,0x02,0x82,0x05,0x3b,0x36,0x36,0x3b,0x05,0x00,0x00,0x01,0x00,0x5b,0x02,0xac,0x01,0xde,0x05,0xb2,0x00,0x0d,0x00,0x1e,0x40,0x0e,0x00,0x07, -0x07,0x0f,0x03,0x7e,0x0a,0x06,0x91,0x07,0x00,0x91,0x0d,0x04,0x00,0x3f,0xed,0xd6,0xed,0x01,0x2f,0xe9,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0xde,0x60,0x7b,0x7b,0x60,0xa7,0xdc,0xdc,0xa7,0x05,0x1a,0x06,0x85,0x60,0x60,0x85,0x06,0x98,0xdc,0xa7,0xa7,0xdc,0x00, -0x00,0x01,0x00,0x4e,0x03,0x90,0x01,0x5e,0x05,0xb2,0x00,0x0d,0x00,0x1e,0x40,0x0e,0x00,0x07,0x07,0x0f,0x03,0xed,0x0a,0x06,0x96,0x07,0x00,0x96,0x0d,0x04,0x00,0x3f,0xed,0xd6,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x15,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x5e,0x3f,0x49,0x49,0x3f, -0x77,0x99,0x95,0x7b,0x05,0x30,0x05,0x4b,0x3f,0x3f,0x4b,0x05,0x82,0x02,0x98,0x77,0x75,0x98,0x04,0x00,0x00,0x01,0x00,0xbc,0xfe,0x5a,0x04,0xf2,0x05,0x9a,0x00,0x15,0x00,0x3b,0x40,0x1f,0x13,0x00,0x7e,0x0b,0x06,0x0b,0x06,0x0b,0x17,0x12,0x0e,0x7e,0x0f,0x0d,0x91,0x40,0x12,0x10,0x0f,0x12,0x91,0x2b,0x30,0x14,0x10,0x03,0x08,0x91, -0x03,0x0f,0x12,0x00,0x3f,0xd4,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xb5,0xb7,0x4c,0x3d,0x4f,0x3e,0x5f,0x61,0xfd,0x1a,0xa8, -0xa8,0x02,0xe6,0xa8,0x3f,0xf8,0xed,0x1f,0xa5,0x2c,0x86,0x89,0x02,0x8d,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00,0x01,0x00,0xa6,0xfe,0x5a,0x03,0xf8,0x05,0xec,0x00,0x1a,0x00,0x2f,0x40,0x18,0x00,0x84,0x0a,0x06,0x0a,0x06,0x0a,0x1c,0x15,0x11,0x84,0x12,0x15,0x0d,0x95,0x18,0x0f,0x13,0x00,0x08,0xec,0x03,0x12,0x15,0x00,0x3f, -0xd4,0xed,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x21,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xb7,0xaf,0x4d,0x3d,0x4f,0x3f,0xbe,0xee,0x77,0xa5,0xa4,0xa4,0x04,0x77,0xd9,0x01, -0x5a,0xd4,0xd2,0x1f,0xa5,0x2c,0x01,0x0e,0x02,0x4e,0x01,0x40,0xb8,0x92,0xfd,0xbc,0x05,0xec,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x00,0x01,0x00,0x29,0xfe,0x21,0x05,0x83,0x05,0x9a,0x00,0x21,0x00,0x5c,0x40,0x31,0x1f,0x17,0x7e,0x13,0x0a,0x18,0x03,0x7d,0x10,0x15,0x21,0x1a,0x18,0x1d,0x10,0x21,0x21,0x10,0x1d,0x18,0x1a,0x05,0x22,0x23, -0x00,0x14,0x21,0x15,0x91,0x1f,0x12,0x92,0x00,0x00,0x06,0x1f,0x1f,0x18,0x1e,0x1a,0x91,0x1b,0x03,0x0a,0x0d,0x92,0x06,0x18,0x12,0x00,0x3f,0xd4,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x10,0xc6,0xc4,0xe9,0x32, -0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x15,0x03,0xea,0xbf,0xda,0xfe,0xdf,0xea,0x76,0xaa,0x56,0x63,0xb7,0x63,0x96,0xbc,0xfe,0xa1,0x8c,0x01,0x8a,0xfd,0xfe,0xa8,0xfe,0x63,0x03,0xe3,0xfe, -0x62,0x03,0x02,0x01,0x73,0x04,0xd8,0xb6,0xce,0xf2,0x26,0x2e,0xb6,0x44,0x37,0xa0,0x87,0x01,0x1e,0x07,0x02,0x3f,0xfc,0xc5,0x05,0x02,0x98,0x98,0xfe,0xd1,0x28,0x00,0x00,0x01,0x00,0x2b,0xfe,0x21,0x04,0xe4,0x05,0x2f,0x00,0x29,0x00,0x57,0x40,0x2e,0x00,0x12,0x03,0x83,0x0e,0x14,0x29,0x12,0x0e,0x29,0x29,0x0e,0x12,0x03,0x2b,0x27, -0x15,0x84,0x24,0x22,0x09,0x20,0x29,0x15,0x21,0x95,0x23,0x11,0x96,0x00,0x00,0x06,0x27,0x26,0x23,0x0f,0x1b,0x19,0x95,0x1e,0x15,0x09,0x0b,0x95,0x06,0x1b,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x33,0x33,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x32,0x01,0x2f,0xc4,0x33,0x33,0xe9,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10, -0xe9,0x11,0x33,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x03,0x20,0xd2,0xf2,0xfe,0xb5,0xf0,0xb6,0x9a,0xa6,0xb0,0xab,0xe2,0xdb,0xd1,0x52,0x01, -0x80,0xfd,0xc1,0x46,0x51,0x3f,0x2c,0x3b,0x5e,0xfe,0xf3,0xb0,0xb0,0xa4,0x03,0x2a,0x01,0xae,0x1c,0xe9,0xb3,0xce,0xfe,0xf9,0x51,0xa2,0x68,0xb2,0x94,0x9b,0xa0,0x33,0x02,0x14,0xfd,0xbf,0x67,0x58,0x22,0x8c,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x33,0x00,0x00,0x01,0x00,0x66,0xff,0xe9,0x04,0x0b,0x05,0xb2,0x00,0x24, -0x00,0x4b,0x40,0x17,0x24,0x1a,0x18,0x01,0x20,0x0e,0x1a,0x01,0x0e,0x0e,0x01,0x1a,0x03,0x26,0x09,0x7d,0x15,0x20,0x23,0x91,0x1c,0x00,0x05,0xb8,0x01,0x05,0x40,0x0e,0x19,0x1a,0x24,0x1b,0x19,0x04,0x12,0x1c,0x04,0x0e,0x0c,0x91,0x12,0x13,0x00,0x3f,0xed,0x32,0x3f,0x12,0x17,0x39,0x10,0xed,0x33,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12, -0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x26,0x26,0x27,0x27,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x20,0x24,0x35,0x34,0x24,0x37,0x35,0x01,0x35,0x01,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x07,0x03,0x3c,0x0c,0x25,0x13,0x26,0x1f,0xd2,0xca,0xd4,0xac,0xb9,0xbb,0x5c, -0xb3,0x65,0xfe,0xfd,0xfe,0xd2,0x01,0x17,0xf4,0xfe,0x49,0x01,0xb7,0x93,0x9c,0x4f,0x53,0xbf,0x58,0xf8,0x03,0x40,0x8c,0x03,0x03,0x01,0x02,0x99,0x9b,0x7e,0x8c,0x5c,0xa6,0x29,0x23,0xdc,0xc3,0xc6,0xd8,0x02,0x04,0x01,0x23,0x2e,0x01,0x35,0x24,0x22,0xaa,0x30,0x28,0xab,0x00,0x01,0x00,0x26,0xfe,0x1d,0x03,0xc5,0x04,0x00,0x00,0x25, -0x00,0x4a,0x40,0x26,0x25,0x1b,0x19,0x00,0x1b,0x00,0x1b,0x00,0x16,0x21,0x10,0x10,0x27,0x09,0x84,0x16,0x21,0x24,0x95,0x1d,0x06,0x96,0x00,0x1c,0x25,0x1b,0x03,0x1d,0x19,0x19,0x13,0x1d,0x10,0x0f,0x0c,0x95,0x13,0x1c,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f, -0xc4,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x26,0x26,0x27,0x27,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x24,0x37,0x35,0x01,0x35,0x01,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x07,0x02,0xf6,0x0c,0x25,0x13,0x26,0x1f,0xc3,0xde,0xe3,0xa2,0x5e,0xb8,0x5e, -0x67,0xaa,0x63,0xf9,0xfe,0xce,0x01,0x1e,0xee,0xfe,0x56,0x01,0x8f,0x9a,0xaa,0x4e,0x53,0xbf,0x58,0xf0,0x01,0x8e,0x8c,0x03,0x03,0x01,0x02,0xa9,0x97,0x83,0xa0,0x34,0x2e,0x9c,0x2d,0x24,0xe3,0xca,0xc5,0xe3,0x02,0x05,0x01,0x23,0x2e,0x01,0x36,0x24,0x22,0x9b,0x30,0x28,0xbe,0x00,0x00,0x02,0x00,0x51,0xff,0xe6,0x03,0x95,0x05,0x9a, -0x00,0x12,0x00,0x1e,0x00,0x35,0x40,0x1a,0x13,0x12,0x01,0x7e,0x0f,0x08,0x0f,0x08,0x0f,0x20,0x1e,0x10,0x11,0x10,0x91,0x17,0x12,0x1e,0x1e,0x04,0x12,0x03,0x0b,0x91,0x04,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x01,0x2f,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x33,0x31,0x30,0x01,0x11,0x14,0x06,0x23, -0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x13,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x07,0x06,0x07,0x01,0x03,0x95,0xa4,0xbc,0x23,0x65,0x21,0x1f,0x61,0x29,0x60,0x58,0xfd,0x64,0x02,0x95,0x07,0x07,0x03,0x04,0x07,0x09,0x11,0x09,0x08,0xfe,0x47,0x05,0x9a,0xfb,0xdc,0xde,0xb2,0x0f,0x10,0xa5,0x11,0x1b, -0x58,0x80,0x0f,0x81,0x03,0xb4,0xfc,0x61,0x02,0x4d,0x18,0x54,0x1a,0x0f,0x10,0x1d,0x0f,0x0c,0xfd,0x84,0x00,0x02,0x00,0x21,0xfe,0x1e,0x03,0x50,0x04,0x00,0x00,0x12,0x00,0x1d,0x00,0x30,0x40,0x18,0x13,0x11,0x00,0x84,0x0e,0x07,0x0e,0x07,0x0e,0x1f,0x1d,0x10,0x17,0x11,0x0f,0x10,0x1d,0x96,0x0f,0x15,0x0a,0x95,0x03,0x1c,0x00,0x3f, -0xed,0x3f,0xed,0x32,0x3f,0x33,0x01,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x33,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x33,0x03,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x01,0x03,0x50,0xae,0xa5,0x29,0x57,0x29,0x2b,0x51,0x2a,0x5a,0x58,0xfd,0x75, -0x02,0x85,0xaa,0xa4,0x02,0x05,0x03,0x03,0x0a,0x06,0x14,0xfe,0x46,0x3f,0xca,0xd9,0x0c,0x14,0x99,0x1b,0x12,0x7e,0x9b,0x3d,0x6f,0x03,0x91,0xfc,0x84,0x02,0x54,0x1e,0x32,0x15,0x07,0x14,0x0a,0x22,0xfd,0x8e,0x00,0x03,0x00,0x51,0xff,0xe6,0x04,0xa1,0x05,0x9a,0x00,0x16,0x00,0x22,0x00,0x26,0x00,0x54,0x40,0x2c,0x26,0x23,0x24,0x25, -0x01,0x04,0x7e,0x13,0x17,0x16,0x13,0x23,0x03,0x25,0x13,0x0c,0x0c,0x13,0x25,0x03,0x23,0x05,0x28,0x22,0x14,0x25,0x12,0x26,0x04,0x14,0x91,0x15,0x01,0x1b,0x16,0x22,0x22,0x08,0x16,0x03,0x0f,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0xfd,0x32,0xcc,0x3f,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f, -0x2f,0x2f,0x11,0x33,0x33,0x10,0xe9,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x13,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x07,0x06,0x07,0x01,0x05,0x03,0x23,0x13,0x03,0x95,0xf1,0xf1,0xa6,0xba,0x23,0x65,0x21,0x1f,0x61, -0x29,0x60,0x58,0xfd,0x64,0x02,0x95,0x07,0x07,0x03,0x04,0x07,0x09,0x11,0x09,0x08,0xfe,0x47,0x03,0x99,0xa6,0x7b,0x75,0x05,0x9a,0xfc,0x61,0x96,0x0e,0xc7,0xaa,0x0f,0x10,0xa5,0x11,0x1b,0x58,0x80,0x0f,0x81,0x03,0xb4,0xfc,0x61,0x02,0x4d,0x18,0x54,0x1a,0x0f,0x10,0x1d,0x0f,0x0c,0xfd,0x84,0xf8,0xfe,0xfc,0x01,0x04,0x00,0x00,0x03, -0x00,0x21,0xfe,0x1e,0x04,0x72,0x04,0x00,0x00,0x16,0x00,0x21,0x00,0x25,0x00,0x4b,0x40,0x26,0x23,0x24,0x25,0x22,0x07,0x24,0x14,0x22,0x22,0x14,0x24,0x07,0x04,0x27,0x21,0x10,0x13,0x16,0x84,0x17,0x11,0x0e,0x1b,0x11,0x0f,0x24,0x24,0x03,0x13,0x10,0x21,0x25,0x16,0x0f,0x15,0x0a,0x03,0x1c,0x00,0x3f,0xcd,0x3f,0x33,0xcc,0xcd,0x32, -0x32,0x12,0x39,0x2f,0x3f,0x33,0x01,0x2f,0x33,0x33,0xe9,0x32,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x33,0x11,0x21,0x15,0x21,0x27,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x01,0x05,0x03,0x23, -0x13,0x03,0x50,0xae,0xa5,0x29,0x57,0x29,0x2b,0x51,0x2a,0x5a,0x58,0xfd,0x75,0x02,0x85,0xaa,0x01,0x05,0xfe,0xfb,0xa4,0x02,0x05,0x03,0x03,0x0a,0x06,0x14,0xfe,0x46,0x03,0xa3,0xa6,0x7b,0x75,0x3f,0xca,0xd9,0x0c,0x14,0x99,0x1b,0x12,0x7e,0x9b,0x3d,0x6f,0x03,0x91,0xfc,0x84,0x84,0x84,0x02,0x54,0x1e,0x32,0x15,0x07,0x14,0x0a,0x22, -0xfd,0x8e,0xdc,0xfe,0xfc,0x01,0x04,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x0b,0x04,0x33,0x00,0x09,0x00,0x26,0x40,0x12,0x03,0x00,0x00,0x0b,0x02,0x05,0x84,0x07,0x05,0x95,0x02,0x02,0x07,0x01,0x95,0x08,0x07,0x15,0x00,0x3f,0xdd,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xc6,0x31,0x30,0x01,0x21,0x11,0x21, -0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x0b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0xa4,0x02,0x5b,0x03,0xa8,0xfe,0xb1,0x8a,0xfe,0x31,0x04,0x33,0x00,0x01,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45,0x00,0x21,0x00,0x34,0x40,0x1b,0x1b,0x84,0x06,0x11,0x06,0x11,0x21,0x23,0x16,0x84,0x0b,0x21,0x11,0x13,0x95,0x16,0x0b,0x1b,0x06,0x04,0x0e,0x1e, -0x00,0x03,0x95,0x1e,0x16,0x00,0x3f,0xfd,0xc6,0x10,0xd4,0x17,0x39,0xfd,0xc6,0x01,0x2f,0xd4,0xe9,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x6b,0x33, -0xa3,0x4a,0x73,0x68,0x71,0xfe,0xef,0x7c,0xd7,0xa8,0xa0,0x4a,0x5f,0x93,0x61,0x75,0x77,0x01,0x01,0x87,0xd7,0xb9,0x43,0xa8,0x22,0xd7,0x29,0x38,0x54,0x44,0x46,0x57,0x87,0x91,0x69,0x7e,0x9b,0x26,0xa5,0x42,0x4e,0x3e,0x4d,0x59,0x7b,0x8d,0x67,0x88,0xa6,0x28,0x16,0x00,0x00,0x03,0x00,0x16,0x00,0x00,0x08,0xf1,0x05,0x9a,0x00,0x17, -0x00,0x21,0x00,0x2b,0x00,0x3f,0x40,0x1f,0x17,0x0c,0x1c,0x03,0x05,0x26,0x13,0x00,0x00,0x05,0x13,0x13,0x2d,0x05,0x26,0x1c,0x16,0x03,0x91,0x2b,0x21,0x21,0x04,0x1c,0x11,0x06,0x03,0x14,0x01,0x04,0x12,0x00,0x3f,0x33,0x33,0x3f,0x33,0xcd,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x33,0x01,0x2f,0x11,0x33,0x2f,0x12,0x39,0x2f,0x12,0x39, -0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x01,0x17,0x16,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x01,0x6f,0x16,0x06, -0x0b,0x02,0x04,0x15,0x09,0x01,0x77,0xae,0x02,0x28,0xba,0x98,0xfd,0xa0,0x60,0xfe,0xaa,0xe1,0x06,0x0e,0x02,0x04,0x02,0x0d,0x08,0xdf,0x05,0xd0,0xe1,0x06,0x0e,0x02,0x04,0x02,0x0d,0x08,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x9a,0xfc,0x47,0x3b,0x12,0x23,0x0d,0x0d,0x40,0x16,0x03,0xd3,0xfa,0x66,0x01,0x92,0xfe,0xf2,0x01,0xa5,0x02,0x63, -0x10,0x3a,0x16,0x14,0x36,0x15,0xfd,0x9c,0x02,0x63,0x10,0x3a,0x16,0x14,0x36,0x15,0xfd,0x9c,0x00,0x03,0x00,0x5a,0xff,0xe8,0x05,0xfc,0x04,0x18,0x00,0x2d,0x00,0x38,0x00,0x43,0x00,0x5d,0x40,0x30,0x09,0x09,0x00,0x32,0xef,0x39,0x23,0x19,0x39,0x2e,0x11,0x84,0x12,0x04,0x12,0x39,0x12,0x39,0x12,0x45,0x3d,0x83,0x27,0x20,0x09,0x27, -0x27,0x06,0x25,0x95,0x2a,0x2e,0x39,0x96,0x04,0x23,0x23,0x0d,0x2a,0x0f,0x35,0x40,0x95,0x16,0x1d,0x16,0x12,0x15,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x33,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0xc4,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x33,0x11,0x33,0x33,0x10,0xf9,0x32,0xc0,0x2f,0x31, -0x30,0x01,0x36,0x36,0x37,0x25,0x10,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x05,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x25,0x07,0x06,0x06,0x15,0x14, -0x16,0x33,0x32,0x36,0x35,0x03,0x7b,0x1f,0x5b,0x30,0x01,0x33,0xcd,0x3f,0x8f,0x1f,0x3d,0x87,0x52,0x9f,0xa9,0xa4,0x04,0x6a,0xd1,0x78,0x91,0x26,0x04,0x32,0xa9,0x6b,0x94,0xb2,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x97,0xc5,0xb9,0xa8,0x01,0xdd,0xf7,0x82,0x64,0x73,0x51,0x78,0xa1,0xfd,0x87,0xf7,0x82,0x64,0x6d,0x57,0x7a,0x9f,0x02, -0x2d,0x12,0x18,0x07,0x2b,0x01,0x05,0x49,0x35,0x9e,0x39,0x31,0xbe,0xc0,0xfd,0x66,0xa0,0xb8,0x5b,0x61,0x5a,0x62,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xc3,0xbb,0x94,0x22,0x12,0x5f,0x57,0x4d,0x5d,0xae,0x80,0x66,0x22,0x12,0x5f,0x57,0x50,0x5a,0xae,0x80,0x00,0x00,0x03,0x00,0x16,0xff,0xe8,0x08,0xdb,0x05,0xb2, -0x00,0x15,0x00,0x21,0x00,0x2b,0x00,0x3b,0x40,0x1f,0x0d,0x7d,0x26,0x06,0x1b,0x1b,0x00,0x2d,0x21,0x7f,0x07,0x00,0x14,0x91,0x06,0x2b,0x2b,0x01,0x15,0x12,0x18,0x91,0x10,0x13,0x1e,0x91,0x0a,0x04,0x26,0x01,0x03,0x00,0x3f,0xcd,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0x2f,0xe9,0x11,0x12,0x39,0x2f,0x39,0x39, -0xe9,0x31,0x30,0x33,0x01,0x33,0x13,0x16,0x17,0x17,0x33,0x36,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x24,0x27,0x21,0x03,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x07,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x9f,0x0b,0x08,0x0c,0x04,0x21,0x01,0x60,0x01,0x1a,0x01,0x28,0x01, -0x6c,0xfe,0x8c,0xfe,0xc8,0xeb,0xfe,0xbd,0x42,0xfd,0xa1,0x8f,0x03,0x6e,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xb6,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfe,0x62,0x1d,0x19,0x2c,0xdf,0x01,0x39,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0xed,0xbd,0xfe,0x6e,0x01,0xc1,0xfe,0xbe,0x01,0x34, -0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0xa2,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0xb6,0x04,0x18,0x00,0x20,0x00,0x2c,0x00,0x37,0x00,0x52,0x40,0x2c,0x00,0x14,0x2c,0x84,0x30,0x0a,0x30,0x1b,0x83,0x26,0x30,0x26,0x30,0x26,0x39,0x34,0x83,0x0e,0x07,0x23,0x95,0x1e, -0x16,0x29,0x95,0x18,0x10,0x0e,0x0c,0x95,0x11,0x30,0x96,0x14,0x11,0x00,0x0a,0x0a,0x11,0x10,0x37,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x39,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xc4,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9,0x39,0x39,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22, -0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x26,0x36,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x03,0x27,0x02,0x45,0xc8,0x78,0x92,0xb4,0x01,0x52,0x01,0x33,0xd3,0xba, -0x94,0x97,0xc5,0x8d,0x98,0x18,0x04,0x44,0xd3,0x6a,0xe0,0xfa,0xfe,0xf2,0xe4,0x83,0xe0,0x22,0xb4,0x99,0x9c,0xa2,0xa2,0x9c,0x9c,0xb1,0xfe,0xc2,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xcd,0x73,0x72,0xa2,0x86,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0x64,0x4b,0x61,0x4e,0xfe,0xe4,0xf8,0xf3,0xfe,0xd7,0x75,0xed,0xd8,0xcf,0xbd,0xbe, -0xd2,0xe1,0xa1,0xfe,0x66,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x16,0xff,0xe8,0x07,0x3a,0x05,0x9a,0x00,0x13,0x00,0x1d,0x00,0x30,0x40,0x18,0x02,0x7e,0x18,0x08,0x0c,0x01,0x01,0x1f,0x0c,0x0a,0x91,0x1d,0x1d,0x0b,0x18,0x01,0x0d,0x03,0x0b,0x12,0x12,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x3f,0x33,0xcd,0x12, -0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0xe9,0x31,0x30,0x01,0x11,0x33,0x11,0x10,0x21,0x22,0x26,0x27,0x03,0x21,0x03,0x23,0x01,0x33,0x01,0x16,0x16,0x33,0x20,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x06,0x92,0xa8,0xfd,0xdf,0x34,0x59,0x34,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x01,0xf5,0x12,0x29, -0x11,0x01,0x67,0xfc,0xf7,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x02,0x29,0x03,0x71,0xfc,0xaa,0xfd,0xa4,0x0a,0x0e,0x01,0x92,0xfe,0x6e,0x05,0x9a,0xfa,0xea,0x03,0x02,0x01,0xaa,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xff,0xe8,0x06,0x1e,0x04,0x18,0x00,0x26,0x00,0x31,0x00,0x50,0x40,0x2b, -0x1d,0x84,0x2a,0x12,0x08,0x2a,0x02,0x00,0x84,0x24,0x2a,0x24,0x2a,0x24,0x33,0x2e,0x83,0x18,0x0f,0x25,0x0f,0x18,0x16,0x95,0x1b,0x2a,0x96,0x12,0x12,0x1b,0x0f,0x08,0x31,0x95,0x0c,0x16,0x02,0x21,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x39,0x2f,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc4,0xe1,0x12, -0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x11,0x33,0x33,0x10,0xe9,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33, -0x06,0x1e,0x9f,0x04,0x63,0xd0,0x75,0x98,0x2f,0x03,0x3f,0xc0,0x6a,0x99,0xad,0x01,0x52,0x01,0x33,0x6b,0x68,0xba,0x94,0x97,0xc5,0x01,0x69,0x7b,0x74,0x74,0x94,0xa4,0xfc,0x27,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xa2,0xba,0x57,0x65,0x5d,0x5f,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x11,0x75,0x7f,0x7e,0xa8,0x60,0xfe,0x82,0xf4,0x92,0xa2,0xb2, -0x8e,0x02,0x4e,0xfc,0x72,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x16,0x00,0x00,0x07,0x24,0x05,0x9a,0x00,0x10,0x00,0x1a,0x00,0x32,0x40,0x18,0x15,0x05,0x00,0x0a,0x0b,0x0b,0x1c,0x0c,0x06,0x00,0x0f,0x91,0x1a,0x1a,0x01,0x10,0x05,0x0d,0x12,0x0a,0x03,0x15,0x01,0x03,0x00,0x3f,0xcd,0x3f,0x3f,0x33,0x33,0x12, -0x39,0x2f,0xed,0x01,0x2f,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x39,0x31,0x30,0x33,0x01,0x33,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x01,0xb5,0x14,0x0b,0x04,0x10,0x08,0x01,0x95,0xb5,0xfd,0xed,0xb9,0x98,0xfd,0xa0,0x8f, -0x02,0xb8,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfb,0x8f,0x36,0x49,0x18,0x51,0x16,0x04,0x71,0xfa,0x66,0x01,0x92,0xfe,0x6e,0x02,0x29,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xff,0xe8,0x05,0x3a,0x04,0x18,0x00,0x1b,0x00,0x26,0x00,0x45,0x40,0x24,0x0c,0x04,0x84,0x17,0x0e,0x1f, -0x1f,0x14,0x0a,0x0b,0x0b,0x28,0x23,0x83,0x1b,0x14,0x1f,0x96,0x05,0x17,0x17,0x02,0x0e,0x26,0x95,0x11,0x16,0x0c,0x15,0x0a,0x0f,0x1b,0x19,0x95,0x02,0x10,0x00,0x3f,0xed,0x32,0x3f,0x3f,0x3f,0xed,0x32,0x11,0x39,0x2f,0x39,0xed,0x01,0x2f,0xc4,0xe9,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0xe9,0x32,0x31,0x30,0x13,0x36,0x33, -0x20,0x11,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0xbe,0x97,0xc5,0x01,0x69,0x04,0x03,0x16,0x11,0xdc,0xad,0xfe,0x4a,0xa5,0x04,0x6a,0xd1,0x99,0xad,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x01,0x87, -0x9a,0xf7,0x8f,0x57,0x6e,0x56,0x03,0xb8,0x60,0xfe,0x82,0xfe,0x87,0x24,0x51,0x2a,0x02,0x40,0xfc,0x00,0xa0,0xb8,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xfd,0x62,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x03,0x00,0x16,0x00,0x00,0x07,0x24,0x05,0x9a,0x00,0x0f,0x00,0x19,0x00,0x22,0x00,0x3b,0x40,0x1c,0x00,0x1d, -0x10,0x1d,0x05,0x0d,0x0a,0x0b,0x0b,0x24,0x05,0x22,0x0f,0x03,0x91,0x0c,0x08,0x1c,0x14,0x14,0x04,0x10,0x0a,0x06,0x03,0x01,0x04,0x12,0x00,0x3f,0x33,0x3f,0x33,0xcd,0x12,0x39,0x2f,0x39,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x11,0x33,0x2f,0x33,0xc6,0x12,0x39,0x39,0x11,0x33,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x01, -0x21,0x13,0x33,0x03,0x33,0x15,0x21,0x01,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x27,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x13,0x21,0x05,0x11,0xb9,0xe5,0xfe,0x3a,0xdc,0xbb,0x02,0x26,0xae,0x01,0x02,0x01,0x94,0xef,0xb5,0xf9,0xcd,0xfe,0xfb,0xfc,0x9b,0x05,0x0b,0x07,0x93,0x01,0x57,0x93,0x05,0x0c,0x05,0x02,0x0d,0x14,0x0b,0x04, -0x10,0x08,0x70,0xfe,0xdc,0x02,0x64,0xfd,0x9c,0x05,0x9a,0xfd,0x61,0x02,0x9f,0xfd,0x61,0x97,0x02,0x88,0x1f,0x30,0x11,0xfe,0x6f,0x01,0x91,0x0f,0x30,0x21,0xfc,0x3d,0x36,0x49,0x18,0x51,0x16,0x01,0x3b,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x05,0x3a,0x04,0x18,0x00,0x1d,0x00,0x24,0x00,0x2f,0x00,0x4d,0x40,0x28,0x1a,0x17,0x18,0x18, -0x31,0x1d,0x15,0x1f,0x84,0x0a,0x01,0x2f,0x28,0x83,0x0f,0x07,0x17,0x0f,0x0f,0x0d,0x95,0x12,0x1f,0x1c,0x2f,0x96,0x19,0x15,0x20,0x0a,0x0a,0x12,0x10,0x01,0x2b,0x95,0x04,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x39,0x2f,0x39,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc4,0xe9,0x2f,0x33,0x33,0xe9,0x32,0x32, -0x11,0x33,0x2f,0x33,0xc6,0x31,0x30,0x21,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x24,0x21,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x15,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x03,0x13,0x23,0x15,0x33,0x36,0x36,0x37,0x27,0x20,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x02,0xdf,0x04,0x6a,0xd1,0x99,0xad,0x01,0x29, -0x01,0x5c,0x69,0x6a,0xba,0x94,0x97,0xc5,0x01,0x69,0x7e,0x8c,0xad,0x9f,0x77,0xaf,0xdf,0x4b,0x4c,0x04,0x05,0x20,0x11,0xf3,0xfe,0xf6,0xbe,0x6e,0x56,0x7f,0x9a,0xa0,0xb8,0xa1,0x87,0xbe,0xbf,0x83,0x7e,0x7e,0xa8,0x60,0xfe,0x82,0x0d,0x01,0x73,0xfe,0x8d,0x83,0xfd,0xf6,0x02,0x0a,0xf1,0x2e,0x64,0x2e,0x31,0x76,0x78,0x4b,0x5f,0xa9, -0x8f,0x60,0x00,0x02,0x00,0x16,0xfe,0x1e,0x07,0x24,0x05,0x9a,0x00,0x1c,0x00,0x26,0x00,0x42,0x40,0x22,0x21,0x00,0x0c,0x05,0x19,0x03,0x0b,0x13,0x13,0x00,0x0a,0x0b,0x0b,0x28,0x00,0x1b,0x91,0x05,0x1c,0x26,0x26,0x01,0x19,0x1c,0x12,0x15,0x91,0x0f,0x1c,0x0a,0x03,0x21,0x01,0x03,0x00,0x3f,0xcd,0x3f,0x3f,0xed,0x3f,0x33,0x12,0x39, -0x2f,0x12,0x39,0xed,0x01,0x2f,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x17,0x39,0x12,0x39,0x31,0x30,0x33,0x01,0x33,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x01, -0xb5,0x14,0x0b,0x04,0x10,0x08,0x01,0x95,0xb5,0xfd,0xe5,0x5f,0xb6,0x8c,0x1e,0x30,0x1d,0x31,0x30,0x3a,0x60,0x22,0x48,0xa2,0xfd,0xa0,0x8f,0x02,0xb8,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfb,0x8f,0x36,0x49,0x18,0x51,0x16,0x04,0x71,0xfa,0x53,0xfd,0xd2,0x05,0x08,0x9d,0x12,0x56,0x50,0xa4,0x01,0x92,0xfe,0x6e, -0x02,0x29,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xfe,0x1e,0x05,0x3a,0x04,0x18,0x00,0x25,0x00,0x30,0x00,0x56,0x40,0x2d,0x28,0x13,0x84,0x25,0x0a,0x1b,0x25,0x1a,0x20,0x25,0x20,0x25,0x07,0x19,0x1a,0x1a,0x32,0x2d,0x83,0x07,0x0e,0x0e,0x07,0x22,0x95,0x1d,0x1c,0x19,0x0f,0x0e,0x0c,0x95,0x11,0x29, -0x96,0x14,0x0a,0x0a,0x11,0x10,0x00,0x30,0x95,0x04,0x16,0x00,0x3f,0xed,0x32,0x3f,0x39,0x2f,0x39,0xed,0x10,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xe9,0x11,0x33,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xe9,0x33,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22, -0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x26,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x02,0xe4,0x04,0x36,0xa1,0x69,0x99,0xad,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x97,0xc5,0x01,0x69,0x04,0x03,0x18,0x10,0xdb,0xad,0xfe,0x0a,0x7e,0xe4, -0x41,0x2a,0x34,0x2d,0x7f,0x3d,0x50,0x9f,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xa8,0x5d,0x63,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xfe,0x82,0xfe,0x8c,0x24,0x51,0x2a,0x02,0x3b,0xfb,0x5c,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x70,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x68,0xff,0xe8,0x04,0x96, -0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x37,0x40,0x1c,0x1b,0xc0,0x21,0x10,0x7d,0x05,0x21,0x05,0x21,0x05,0x23,0x0a,0x15,0x1e,0xc1,0x18,0x18,0x0d,0x00,0x02,0x91,0x13,0x13,0x0a,0x08,0x91,0x0d,0x04,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37, -0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x27,0x00,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x68,0x9d,0xd9,0xea,0x01,0x1e,0xfe,0xcc,0xf6,0xb9,0x9b,0x87,0xcb,0x01,0x3e,0x01,0x9e,0xfe,0x8f,0xfe,0xcf,0xed,0x9f,0x01,0x27,0x3a,0x29,0x2a,0x38,0x38,0x2a, -0x29,0x3a,0xdf,0x60,0x01,0x38,0x01,0x05,0x01,0x14,0x01,0x4a,0x56,0xb3,0x3b,0xfe,0x58,0xfe,0xa8,0xfe,0xbf,0xfe,0x77,0x54,0x02,0xc2,0x37,0x36,0x2a,0x2a,0x39,0x3b,0x28,0x00,0x00,0x02,0x00,0x50,0xff,0xe8,0x03,0x52,0x04,0x18,0x00,0x15,0x00,0x21,0x00,0x37,0x40,0x1c,0x1b,0xc0,0x21,0x10,0x83,0x05,0x21,0x05,0x21,0x05,0x23,0x0a, -0x15,0x1e,0xc1,0x18,0x18,0x0d,0x00,0x02,0x95,0x13,0x16,0x0a,0x08,0x95,0x0d,0x10,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x27,0x12, -0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x52,0x77,0x85,0x9e,0xbe,0xca,0x9c,0x81,0x73,0x69,0x85,0xf1,0x01,0x23,0xfe,0xf3,0xdb,0xa1,0x77,0xa1,0x3a,0x29,0x2a,0x38,0x38,0x2a,0x29,0x3a,0xcb,0x59,0xd0,0xb4,0xb6,0xe2,0x50,0xa8,0x32,0xfe,0xcd,0xfd,0xe4,0xfe,0xe4,0x47,0x01,0xfd,0x37,0x36,0x2a,0x2a,0x39,0x3b,0x28, -0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x46,0x40,0x23,0x17,0x18,0x00,0x19,0x10,0x10,0x07,0x01,0x00,0x00,0x1b,0x12,0x0e,0x06,0x7e,0x0b,0x09,0x07,0x11,0x09,0x92,0x0e,0x04,0x19,0x12,0x03,0x0a,0x0a,0x07,0x17,0x0c,0x03,0x01,0x07,0x12,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0x33,0xed,0x32, -0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x39,0x10,0xc6,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x07,0x13,0x0c, -0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x43,0x40,0x22,0x09,0x09,0x0d,0x0e,0x11,0x0e,0x10,0x10,0x16,0x0f,0x0b,0x07,0x14,0x84,0x04,0x02,0x00,0x0d,0x0f,0x0a,0x02,0x96, -0x07,0x12,0x0f,0x0b,0x03,0x03,0x03,0x05,0x00,0x11,0x00,0x15,0x00,0x3f,0x32,0x3f,0x39,0x2f,0x17,0x39,0x33,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x32,0x11,0x33,0x11,0x33,0x33,0x2f,0x33,0x39,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x01,0x23,0x01,0x23,0x11, -0xa6,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x02,0x00,0xe6,0xfe,0x3c,0x04,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5,0xfe,0x12,0xfd,0xee,0x01,0xec,0xfe,0x14,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x41,0x40,0x21,0x0a,0x0c,0x13,0x0c,0x13,0x0c,0x08,0x09,0x09,0x10, -0x0f,0x0f,0x1b,0x03,0x19,0x7e,0x00,0x13,0x12,0x0d,0x0c,0x0c,0x03,0x0a,0x17,0x12,0x05,0x08,0x01,0x03,0x10,0x00,0x12,0x00,0x3f,0x32,0x3f,0x33,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xe1,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01, -0x17,0x01,0x15,0x07,0x01,0x23,0x01,0x07,0x35,0x37,0x27,0x26,0x27,0x23,0x11,0xbc,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xa5,0x01,0x08,0xa8,0x01,0x8d,0xea,0xfe,0xec,0xcc,0x6e,0xb8,0x1e,0x08,0x04,0x05,0x9a,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0xbc,0x01,0x21,0xd5,0xb8,0xfe,0x3e,0x01,0x46,0xe1,0xd7,0x79, -0xdb,0x24,0x0e,0xfd,0x3e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x40,0x40,0x21,0x02,0x13,0x84,0x14,0x0e,0x08,0x0e,0x08,0x05,0x14,0x04,0x05,0x05,0x0c,0x0b,0x0f,0x0e,0x09,0x08,0x08,0x02,0x06,0x11,0x0e,0x05,0x04,0x0c,0x14,0x15,0x04,0x0f,0x00,0x00,0x00,0x3f,0x3f,0x3f,0x33,0x12,0x17,0x39,0x11, -0x33,0x11,0x33,0x01,0x2f,0x33,0x33,0x2f,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x32,0x31,0x30,0x13,0x33,0x11,0x33,0x01,0x33,0x01,0x17,0x37,0x15,0x07,0x01,0x23,0x27,0x07,0x35,0x37,0x27,0x23,0x11,0x23,0xa6,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x67,0xe6,0x88,0x01,0x3b,0xe6,0xc4,0x99,0x3e,0xa5,0x04,0xa4,0x05,0xec,0xfc, -0x3f,0x01,0xd5,0xfe,0x12,0x6b,0xee,0xc2,0x8d,0xfe,0xba,0xd4,0x9e,0xc2,0x40,0xb4,0xfe,0x14,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x21,0x00,0x54,0x40,0x2b,0x12,0x14,0x1b,0x14,0x1b,0x14,0x10,0x11,0x11,0x18,0x17,0x17,0x23,0x0b,0x07,0x21,0x7e,0x04,0x02,0x00,0x0a,0x02,0x92,0x07,0x03,0x15,0x14,0x1b,0x1a,0x1a, -0x1f,0x12,0x0b,0x14,0x05,0x03,0x03,0x10,0x05,0x03,0x18,0x00,0x12,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0x17,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11, -0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x17,0x01,0x15,0x07,0x01,0x23,0x01,0x07,0x35,0x37,0x27,0x26,0x27,0x23,0x11,0xbc,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xa5,0x01,0x08,0xa8,0x01,0x8d,0xea,0xfe,0xec,0xcc,0x6e,0xb8,0x1e,0x08,0x04,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x0b,0x18,0x0e,0x02, -0x71,0xfd,0x50,0xbc,0x01,0x21,0xd5,0xb8,0xfe,0x3e,0x01,0x46,0xe1,0xd7,0x79,0xdb,0x24,0x0e,0xfd,0x3e,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x1c,0x00,0x59,0x40,0x2e,0x0d,0x0f,0x16,0x0f,0x16,0x0f,0x0b,0x0c,0x0c,0x13,0x12,0x12,0x1e,0x09,0x05,0x1a,0x84,0x02,0x00,0x1b,0x10,0x0f,0x16,0x15,0x15,0x18,0x0d,0x09, -0x0f,0x05,0x0b,0x1b,0x08,0x00,0x96,0x05,0x01,0x01,0x03,0x13,0x1b,0x15,0x0b,0x0f,0x03,0x00,0x00,0x3f,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x35,0x33,0x35,0x33, -0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x17,0x37,0x15,0x07,0x01,0x23,0x27,0x07,0x35,0x37,0x27,0x23,0x11,0x23,0x11,0x27,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x67,0xe6,0x88,0x01,0x3b,0xe6,0xc4,0x99,0x3e,0xa5,0x04,0xa4,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5,0xfe,0x12,0x6b,0xee,0xc2, -0x8d,0xfe,0xba,0xd4,0x9e,0xc2,0x40,0xb4,0xfe,0x14,0x04,0xb2,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0x3b,0x05,0x9a,0x00,0x09,0x00,0x2a,0x40,0x16,0x01,0x7e,0x04,0x02,0x04,0x02,0x0b,0x08,0x7e,0x06,0x06,0x05,0x09,0x00,0x04,0x04,0x07,0x03,0x01,0x91,0x04,0x12,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f, -0x2f,0xe1,0x31,0x30,0x01,0x11,0x21,0x15,0x21,0x11,0x07,0x11,0x33,0x11,0x01,0xfc,0x02,0x3f,0xfd,0x18,0x97,0xa9,0x03,0x18,0xfd,0x80,0x98,0x02,0xa8,0x2f,0x03,0x21,0xfd,0x4d,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0xdc,0x05,0xed,0x00,0x07,0x00,0x2b,0x40,0x16,0x06,0x84,0x04,0x00,0x84,0x02,0x04,0x02,0x04,0x02,0x08,0x09,0x04,0x03, -0x07,0x00,0x04,0x02,0x05,0x00,0x02,0x15,0x00,0x3f,0x3f,0x12,0x17,0x39,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x11,0x23,0x11,0x07,0x11,0x33,0x11,0x01,0xdc,0xa4,0x92,0xa4,0x03,0x43,0xfc,0xbd,0x02,0xd5,0x2e,0x03,0x46,0xfd,0x26,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x0d, -0x00,0x2d,0x40,0x16,0x09,0x0c,0x09,0x0c,0x0f,0x0b,0x7e,0x02,0x00,0x0a,0x02,0x92,0x07,0x03,0x03,0x00,0x05,0x03,0x0b,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x15,0xbc,0xaa,0xaa, -0xa8,0xe8,0xe8,0x02,0x40,0x04,0x9c,0x85,0x79,0x79,0x85,0xfb,0xfc,0x98,0x00,0x01,0x00,0x1e,0x00,0x00,0x01,0xd2,0x05,0xec,0x00,0x0b,0x00,0x2c,0x40,0x15,0x09,0x09,0x07,0x0a,0x84,0x04,0x02,0x00,0x00,0x0c,0x0d,0x0a,0x02,0x96,0x07,0x03,0x03,0x05,0x00,0x00,0x15,0x00,0x3f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x01,0x39,0x2f, -0xc6,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0xa6,0x88,0x88,0xa4,0x88,0x88,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfb,0x4e,0x00,0x03,0x00,0x00,0xff,0xe8,0x06,0x08,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x3f,0x40,0x20,0x0a,0x0a,0x08,0x0b,0x7d,0x12,0x1f,0x1f,0x21,0x18, -0x19,0x7d,0x02,0x00,0x11,0x19,0x0b,0x11,0x91,0x18,0x08,0x02,0x02,0x05,0x1c,0x91,0x0e,0x13,0x15,0x91,0x05,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x11,0x35,0x33,0x12,0x00,0x21,0x20,0x00,0x13,0x33,0x15,0x23,0x02, -0x00,0x21,0x20,0x00,0x03,0x25,0x26,0x02,0x23,0x22,0x00,0x07,0x15,0x16,0x00,0x33,0x32,0x00,0x37,0x61,0x14,0x01,0x7a,0x01,0x27,0x01,0x1e,0x01,0x5d,0x17,0x60,0x62,0x16,0xfe,0x91,0xfe,0xdd,0xfe,0xdc,0xfe,0x9a,0x14,0x04,0x97,0x15,0xfe,0xda,0xd3,0xfe,0xee,0x14,0x14,0x01,0x0f,0xca,0xdf,0x01,0x05,0x15,0x02,0x7e,0x9b,0x01,0x2c, -0x01,0x6d,0xfe,0x9e,0xfe,0xc9,0x9b,0xfe,0xd0,0xfe,0x9a,0x01,0x69,0x01,0x2d,0x9b,0xf9,0x01,0x08,0xfe,0xea,0xeb,0x9b,0xe6,0xfe,0xe7,0x01,0x09,0xf6,0x00,0x00,0x03,0x00,0x00,0xff,0xe8,0x04,0xb0,0x04,0x18,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x3b,0x40,0x1e,0x08,0x08,0x07,0x0a,0x83,0x19,0x18,0x1f,0x12,0x83,0x01,0x00,0x10,0x12, -0x0a,0x11,0x95,0x1f,0x07,0x00,0x00,0x04,0x15,0x95,0x0d,0x16,0x1c,0x95,0x04,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x33,0xe1,0x32,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x11,0x33,0x36,0x24,0x33,0x32,0x16,0x17,0x33,0x15,0x23,0x06,0x00,0x23,0x22,0x00,0x27,0x23,0x21,0x16,0x16, -0x33,0x32,0x36,0x37,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x66,0x1e,0x01,0x10,0xd6,0xce,0xfd,0x16,0x65,0x62,0x10,0xfe,0xf2,0xde,0xdc,0xfe,0xf9,0x0e,0x61,0x01,0x0a,0x0c,0xb1,0x97,0x96,0xa5,0x0d,0x04,0x15,0xa3,0x8c,0x87,0xb0,0x19,0x02,0x5b,0xd0,0xed,0xec,0xd1,0x8b,0xe1,0xfe,0xf9,0x01,0x04,0xe4,0xa4,0xba,0xb2,0xac,0x8c,0x95, -0x9d,0xa0,0x92,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x06,0xcb,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x2c,0x00,0x44,0x40,0x25,0x00,0x2b,0x22,0x03,0x11,0x0b,0x7d,0x1b,0x06,0x7f,0x25,0x1b,0x25,0x1b,0x25,0x2e,0x21,0x7d,0x11,0x1e,0x91,0x14,0x04,0x22,0x92,0x09,0x09,0x03,0x18,0x91,0x0e,0x13,0x00,0x28,0x92,0x03,0x04,0x00,0x3f,0xed, -0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x11,0x17,0x39,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x17,0x15,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x15,0x25,0x36,0x36,0x35, -0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x04,0xda,0x26,0x7c,0x55,0x73,0x87,0xa0,0x83,0x02,0xfe,0x8e,0xfe,0xc6,0xfe,0xd0,0xfe,0x90,0x01,0x78,0x01,0x40,0x01,0x14,0xfc,0xe4,0x01,0x11,0xdf,0xef,0x01,0x0d,0xfe,0xfd,0xed,0xe8,0xfe,0xec,0x04,0x89,0x47,0x59,0x39,0x37,0x31,0x4e,0x19,0x4c,0x05,0x04,0x52,0x5c,0x9d,0x84,0x95,0xcd,0x11, -0x1f,0x20,0xfe,0xa8,0xfe,0x61,0x01,0x97,0x01,0x3d,0x01,0x59,0x01,0x9d,0xfc,0x1a,0xfe,0xb3,0x01,0x40,0x01,0x09,0x01,0x17,0x01,0x3b,0xfe,0xac,0xfb,0xd3,0x13,0x7e,0x57,0x4f,0x56,0x4a,0x42,0x71,0x00,0x03,0x00,0x60,0xff,0xe8,0x05,0x4b,0x04,0x18,0x00,0x13,0x00,0x1f,0x00,0x2a,0x00,0x45,0xb7,0x20,0x29,0x04,0x03,0x0d,0x84,0x19, -0x0a,0xb8,0x01,0x03,0x40,0x1b,0x23,0x19,0x23,0x19,0x23,0x2c,0x1f,0x83,0x13,0x20,0x96,0x0d,0x0d,0x07,0x16,0x95,0x10,0x16,0x04,0x26,0x96,0x07,0x0f,0x1c,0x95,0x02,0x10,0x00,0x3f,0xed,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x17,0x39,0x31,0x30,0x12,0x00,0x33, -0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x00,0x23,0x22,0x00,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x60,0x01,0x1b,0xef,0xc4,0x7a,0x22,0x61,0x3c,0x6a,0x7a,0x8e,0x6f,0x16,0xfe,0xef,0xd5,0xe3,0xfe,0xf1,0xa8,0xba,0x9c,0xa1, -0xa9,0xa8,0xa2,0x9f,0xb7,0x03,0x45,0x39,0x40,0x34,0x31,0x23,0x33,0x14,0x4a,0x02,0xef,0x01,0x29,0x68,0x2f,0x39,0x8d,0x79,0x79,0xb8,0x15,0xe0,0xfe,0xfc,0x01,0x24,0xe8,0xa9,0xd9,0xcf,0xbd,0xbf,0xd1,0xe1,0xb3,0x4c,0x19,0x67,0x45,0x40,0x55,0x29,0x1f,0x70,0x00,0x03,0x00,0x5e,0xff,0xe8,0x0a,0x47,0x05,0xb2,0x00,0x19,0x00,0x25, -0x00,0x31,0x00,0x3f,0x40,0x22,0x00,0x0d,0x25,0x7d,0x2b,0x2b,0x07,0x13,0x7d,0x1f,0x1f,0x33,0x31,0x7d,0x07,0x1c,0x91,0x16,0x13,0x22,0x91,0x10,0x04,0x0d,0x00,0x04,0x2e,0x91,0x0a,0x04,0x28,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x39, -0x39,0x31,0x30,0x01,0x0e,0x02,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x04,0x17,0x36,0x24,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x26,0x26,0x36,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x05,0x50,0x1e,0xb0,0xef,0x95,0xfe,0xcf,0xfe,0x91,0x01,0x77, -0x01,0x41,0xd1,0x01,0x2c,0x43,0x42,0x01,0x39,0xe2,0x01,0x28,0x01,0x6c,0xfe,0x8c,0xfe,0xc8,0x93,0xec,0xae,0x3d,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xfb,0x63,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0x01,0x4a,0x54,0xb2,0x5c,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xc5,0x9e,0x9a, -0xc9,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x5d,0xb1,0xcb,0xfe,0xbe,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0xfe,0xf6,0xfe,0xbe,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3f,0x40,0x22,0x00,0x0c, -0x23,0x83,0x29,0x29,0x06,0x12,0x83,0x1d,0x1d,0x31,0x2f,0x83,0x06,0x1a,0x95,0x15,0x16,0x20,0x95,0x0f,0x10,0x0c,0x00,0x03,0x2c,0x95,0x09,0x10,0x26,0x95,0x03,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x39,0x39,0x31,0x30,0x25,0x06,0x06,0x23,0x22, -0x00,0x35,0x10,0x00,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x26,0x36,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x04,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x03,0xf9,0x2d,0xdb,0x9f,0xe4,0xfe,0xf2,0x01,0x19,0xf1,0x92,0xd7,0x2e,0x27,0xe6,0xa4,0xe6,0x01,0x00,0xfe, -0xeb,0xe9,0x98,0xde,0x2c,0xbb,0x9b,0xa1,0xa9,0xa8,0xa2,0xa0,0xb6,0xfc,0xb8,0xba,0x9c,0xa1,0xa9,0xa8,0xa2,0xa0,0xb6,0xc9,0x60,0x81,0x01,0x1f,0xed,0x01,0x01,0x01,0x23,0x75,0x6b,0x5b,0x85,0xfe,0xe5,0xf9,0xf5,0xfe,0xd9,0x81,0xd9,0xd0,0xcf,0xbd,0xbf,0xd1,0xda,0xbb,0xb5,0xd2,0xcf,0xbd,0xbf,0xd1,0xda,0xba,0x00,0x02,0x00,0x19, -0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0x47,0x40,0x24,0x0f,0x7d,0x18,0x18,0x06,0x1c,0x14,0x05,0x03,0x03,0x01,0x05,0x7e,0x0a,0x08,0x06,0x00,0x91,0x14,0x04,0x08,0x92,0x09,0x01,0x09,0x14,0x09,0x14,0x09,0x06,0x13,0x91,0x0b,0x03,0x06,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32, -0x10,0xed,0x01,0x2f,0xc6,0x33,0xf9,0x32,0xc2,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x15,0x21,0x15,0x21,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x21,0x32,0x04,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0x01,0x0d,0xfe,0xf3,0xa8,0xa3,0xa3,0x01,0x8a,0xe1,0x01,0x02,0xfe,0xe8,0xf0,0xbd, -0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0x9d,0x85,0xfc,0xfc,0x85,0x04,0x19,0xe2,0xca,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x00,0x02,0x00,0x1e,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x19,0x00,0x26,0x00,0x49,0x40,0x27,0x0d,0x83,0x20,0x20,0x19,0x28,0x16,0x16,0x14,0x06,0x18,0x84,0x03,0x01,0x19,0x00,0x16,0x96, -0x03,0x15,0x15,0x10,0x19,0x1b,0x12,0x1d,0x95,0x2f,0x10,0x01,0x10,0x16,0x06,0x23,0x95,0x0a,0x10,0x04,0x0f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x5d,0xed,0x32,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xf9,0x32,0x32,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x13,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33, -0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x88,0x88,0xa4,0x04,0x3f,0xaf,0x74,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0x01,0x4b,0xfe,0xb5,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0xfe,0xdd,0x86,0x04,0x9d,0xb4,0x68, -0x64,0xfe,0xee,0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfe,0xcf,0x86,0xb4,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x05,0x31,0x05,0x9a,0x00,0x18,0x00,0x20,0x00,0x39,0x40,0x1d,0x15,0x7d,0x1e,0x1e,0x02,0x22,0x07,0x7e,0x0c,0x1a,0x01,0x7e,0x10,0x02,0x03,0x00,0x91,0x10,0x1a,0x09,0x1a,0x09, -0x02,0x19,0x91,0x11,0x03,0x02,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0xd4,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35, -0x10,0x21,0x02,0x6c,0xa8,0x5c,0x51,0x59,0x14,0x9e,0x16,0xca,0x9a,0x42,0x01,0x8a,0xe5,0xfe,0xfe,0xe8,0xf0,0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x02,0x1e,0x5c,0x4e,0x36,0x34,0x36,0x44,0x89,0xa9,0x02,0xe4,0xe3,0xc9,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x02,0x00,0x05,0xfe,0x29,0x05,0x46, -0x04,0x18,0x00,0x1d,0x00,0x28,0x00,0x39,0x40,0x1e,0x09,0x83,0x22,0x14,0x83,0x1a,0x1e,0x02,0x0e,0x84,0x00,0x0f,0x17,0x17,0x0d,0x0f,0x1b,0x00,0x1e,0x95,0x10,0x0d,0x15,0x03,0x25,0x95,0x06,0x10,0x01,0x0f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x3f,0x12,0x39,0x2f,0x01,0x2f,0x33,0xe9,0x32,0x32,0xd4,0xed,0x2f,0xe9,0x31, -0x30,0x25,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x21,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x3b,0x02,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x98,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfe,0xdd,0xfe,0xf1,0xd8,0xa4,0x39,0x64,0x6c,0x1c,0x94,0x07,0x0b,0xb1,0x99, -0xed,0xe4,0xc6,0xb8,0x9e,0x87,0x8d,0xb0,0x8a,0x03,0x76,0xb4,0xcc,0xfe,0xee,0xe8,0xff,0x00,0xfe,0xe2,0xfe,0x29,0x01,0xd7,0x52,0x52,0x32,0x3a,0x0e,0x4b,0x1d,0x89,0x9b,0xd1,0xc6,0xab,0xc2,0xc5,0x98,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x06,0x27,0x05,0xb2,0x00,0x23,0x00,0x2b,0x00,0x41,0x40,0x22,0x20,0x7d,0x29,0x29,0x02,0x2d, -0x15,0x7e,0x0e,0x08,0x08,0x2c,0x25,0x01,0x7e,0x1b,0x02,0x03,0x00,0x91,0x1b,0x25,0x25,0x01,0x24,0x91,0x1c,0x03,0x0b,0x91,0x12,0x04,0x01,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0x12,0x39,0x2f,0xc6,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22,0x26, -0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x16,0x16,0x33,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x03,0x62,0xa8,0x27,0xcd,0xb4,0x41,0x4e,0x20,0x3a,0x1f,0x28,0x42,0x28,0x7f,0x9f,0x27,0x5b,0x55,0x29,0x01,0x8a,0xe5,0xfe,0xfe,0xe8,0xf0, -0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x02,0x1e,0xb0,0xca,0xd3,0x4e,0x5b,0x0c,0x0a,0x9e,0x0b,0x0b,0x9c,0x7c,0xc4,0x83,0x6b,0x31,0x02,0xe3,0xe3,0xc9,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x00,0x02,0x00,0x05,0xfe,0x29,0x06,0x85,0x04,0x96,0x00,0x28,0x00,0x33,0x00,0x44,0x40,0x24,0x23,0x83, -0x2d,0x2d,0x00,0x35,0x15,0x84,0x0c,0x05,0x05,0x34,0x29,0x1d,0x28,0x84,0x1a,0x00,0x1d,0x30,0x95,0x20,0x10,0x09,0x95,0x11,0x1b,0x0f,0x29,0x1a,0x95,0x27,0x01,0x15,0x00,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0x32,0x12,0x39,0x2f,0xc6,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30, -0x01,0x11,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x16,0x33,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x21,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x02,0xd7,0x49,0xcd,0xb4,0x3e,0x43,0x23,0x41,0x23,0x28,0x1e, -0x31,0x20,0x83,0x92,0x29,0x5d,0x55,0x4b,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfe,0xdd,0xfe,0xf1,0xd8,0xe4,0xc6,0xb8,0x9e,0x87,0x8d,0xb0,0xfe,0x29,0x01,0xd7,0xb0,0xca,0x01,0xf3,0x4f,0x50,0x10,0x10,0x94,0x09,0x07,0x06,0x95,0x83,0xfe,0x2b,0x81,0x6c,0x32,0x03,0x76,0xb4,0xcc,0xfe,0xee,0xe8,0xff,0x00,0xfe,0xe2,0xfe,0x29,0x02,0x61, -0xd1,0xc6,0xab,0xc2,0xc5,0x98,0x00,0x02,0x00,0x5e,0xfe,0xd0,0x06,0x25,0x05,0xb2,0x00,0x18,0x00,0x24,0x00,0x4f,0x40,0x2a,0x02,0x7d,0x1e,0x0b,0x0a,0x07,0x10,0x05,0x1e,0x0e,0x1e,0x07,0x07,0x1e,0x0e,0x03,0x26,0x24,0x7d,0x15,0x21,0x91,0x18,0x04,0x0c,0x0f,0x09,0x06,0x04,0x0b,0x0b,0x0d,0x08,0x07,0x1b,0x91,0x0e,0x0d,0x10,0x05, -0x12,0x13,0x00,0x3f,0x33,0x33,0xc6,0x32,0xfd,0xc0,0x32,0x11,0x39,0x2f,0x17,0x39,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x10,0xc6,0x32,0x10,0xe9,0x31,0x30,0x00,0x00,0x11,0x14,0x02,0x07,0x17,0x25,0x15,0x07,0x17,0x21,0x27,0x05,0x35,0x37,0x27,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x00,0x00, -0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x04,0x3e,0x01,0x6c,0xa1,0x77,0x44,0x01,0x05,0x8d,0xd7,0xfe,0xcf,0x46,0xff,0x00,0x8a,0x52,0x6b,0x7d,0xfe,0xcf,0xfe,0x91,0x01,0x77,0x01,0x41,0xfd,0xf8,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0x05,0xb2,0xfe,0x70,0xfe,0xbd,0xeb,0xfe,0xbd,0x51,0x31,0xa6, -0xa3,0x59,0x9a,0x34,0xa3,0xa3,0x58,0x3e,0x21,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xfc,0x11,0xfe,0xbc,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x98,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x4f,0x40,0x2b,0x14,0x17,0x84,0x00,0x25,0x10,0x04,0x00,0x02,0x00,0x16,0x16, -0x00,0x02,0x03,0x27,0x1f,0x83,0x0b,0x12,0x0f,0x10,0x1c,0x95,0x0e,0x10,0x06,0x22,0x95,0x08,0x17,0x02,0x96,0x14,0x03,0x03,0x2f,0x08,0x01,0x08,0x16,0x00,0x1b,0x00,0x3f,0x3f,0x5d,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x33,0x10,0xe9,0x32,0x31, -0x30,0x01,0x35,0x21,0x35,0x21,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x33,0x15,0x23,0x15,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x03,0x6c,0xfe,0xb5,0x01,0x4b,0x04,0x6b,0xf3,0xc2,0xe8,0xff,0xd9,0xd2,0x5e,0x04,0xa4,0x88,0x88,0xa4,0xa7,0x7d,0x94,0xac,0xa4, -0x85,0x90,0xab,0xfe,0x29,0xb4,0x86,0x01,0x4d,0xc8,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfb,0x63,0x86,0xb4,0x04,0x39,0x7f,0xad,0xdc,0xc6,0xb0,0xca,0xc6,0x95,0x00,0x02,0x00,0x5e,0xfe,0x3c,0x07,0xa9,0x05,0xb2,0x00,0x23,0x00,0x2f,0x00,0x5a,0x40,0x31,0x00,0x01,0x0e,0x7d,0x29,0x1d,0x7e,0x16,0x03,0x11,0x29,0x01,0x29,0x19, -0x22,0x16,0x16,0x22,0x19,0x29,0x01,0x05,0x31,0x2f,0x7d,0x08,0x19,0x92,0x11,0x12,0x03,0x03,0x1a,0x1a,0x05,0x2c,0x91,0x0b,0x04,0x21,0x02,0x05,0x23,0x23,0x01,0x26,0x91,0x05,0x13,0x00,0x3f,0xed,0xc6,0x39,0x2f,0x12,0x39,0x39,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0xed,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x12, -0x39,0x39,0x10,0xe9,0x10,0xe9,0x11,0x33,0x31,0x30,0x01,0x23,0x01,0x27,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x02,0x07,0x17,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x37,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x17,0x21,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x04,0x43,0xaf,0x01,0x00,0xae, -0x6b,0x7d,0xfe,0xcf,0xfe,0x91,0x01,0x77,0x01,0x41,0x01,0x28,0x01,0x6c,0x8f,0x89,0x6e,0x01,0x38,0x64,0x6c,0x6d,0x85,0x01,0xc6,0xcc,0x59,0x8a,0xfe,0xaa,0xb5,0xfe,0xe7,0xfc,0x02,0x01,0x11,0xdf,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xfe,0x3c,0x01,0x4b,0x82,0x21,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xfe,0x70,0xfe, -0xbd,0xce,0xfe,0xac,0x5d,0x4f,0x01,0x93,0x81,0xb7,0x32,0x4c,0x4c,0x91,0x90,0x8e,0x3d,0xb4,0xb0,0xfe,0x49,0x82,0x02,0x83,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x02,0x00,0x60,0xfe,0x29,0x06,0x12,0x04,0x18,0x00,0x25,0x00,0x32,0x00,0x56,0x40,0x2e,0x00,0x01,0x32,0x23,0x84,0x24,0x10,0x02, -0x24,0x1d,0xef,0x16,0x01,0x09,0x24,0x19,0x16,0x16,0x19,0x24,0x03,0x34,0x2c,0x83,0x09,0x25,0x01,0x01,0x06,0x24,0x1b,0x19,0x95,0x1a,0x10,0x0e,0x29,0x95,0x0c,0x10,0x12,0x03,0x2f,0x95,0x06,0x16,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39, -0x10,0xed,0x11,0x33,0x33,0x10,0xe9,0x33,0x11,0x33,0x31,0x30,0x01,0x23,0x01,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x37,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x01,0x11,0x23,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x02, -0xcd,0xa5,0x01,0x44,0x04,0x6b,0xf3,0xc2,0xe8,0xff,0xd9,0xd2,0x5e,0x04,0xa4,0x9b,0x64,0x6c,0x71,0x81,0x01,0xc4,0xc4,0x52,0x43,0x4e,0xfe,0xe1,0xa4,0xa7,0x7d,0x94,0xac,0xa4,0x85,0x90,0xab,0xfe,0x4e,0x01,0x9f,0xc3,0xc8,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfc,0xbe,0xc7,0x81,0xb7,0x32,0x4f,0x50,0x8a,0x90,0x8e,0x40,0xa4, -0x58,0x65,0xfe,0x92,0xfe,0x3e,0xf0,0x03,0x49,0x7f,0xad,0xdc,0xc6,0xb0,0xca,0xc6,0x95,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0x13,0x05,0xb3,0x00,0x16,0x00,0x3d,0x40,0x1f,0x14,0x01,0x11,0x7d,0x04,0x16,0x15,0x01,0x04,0x15,0x15,0x04,0x01,0x03,0x18,0x0a,0x7e,0x0b,0x14,0x01,0x0a,0x01,0x0a,0x01,0x0e,0x16,0x12,0x07,0x91,0x0e, -0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x35,0x24,0x24,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x24,0x33,0x32,0x04,0x15,0x14,0x00,0x07,0x01,0x23,0x01,0x3c,0x01,0x0c,0x01,0x0a,0xa1,0x84,0x8f,0xb1,0x24,0xab, -0x24,0x01,0x1a,0xd4,0xd0,0x01,0x02,0xfe,0xeb,0xca,0x01,0xf0,0xd3,0x02,0x4c,0x3e,0x27,0xc6,0x94,0x7b,0x95,0x9b,0x8f,0xd2,0xf0,0xe7,0xc1,0xa8,0xfe,0xf9,0x2c,0xfd,0xd0,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x03,0x0b,0x04,0x18,0x00,0x16,0x00,0x3e,0x40,0x20,0x0b,0x0a,0x06,0x83,0x10,0x09,0x0c,0x0a,0x10,0x0c,0x0c,0x10,0x0a,0x03, -0x18,0x16,0x84,0x00,0x0c,0x09,0x96,0x0d,0x00,0x0d,0x00,0x03,0x0b,0x15,0x13,0x95,0x03,0x10,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x11,0x33,0x31,0x30,0x13,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x23,0x01,0x35,0x36,0x36,0x35,0x34, -0x26,0x23,0x22,0x06,0x07,0x0f,0x29,0xbb,0xa1,0x94,0xbe,0xab,0x93,0x01,0x63,0xd6,0xfe,0xaa,0x9d,0xc2,0x5e,0x4e,0x58,0x66,0x1f,0x02,0xcf,0xa1,0xa8,0xae,0x89,0x71,0xae,0x32,0xfe,0x70,0x01,0x9e,0x40,0x16,0x8c,0x61,0x4c,0x61,0x56,0x69,0x00,0x01,0x00,0x3d,0x00,0x00,0x04,0x53,0x05,0xb0,0x00,0x1e,0x00,0x4c,0x40,0x26,0x10,0x7e, -0x04,0x1a,0x1a,0x18,0x1c,0x7e,0x1d,0x15,0x1d,0x04,0x1d,0x04,0x1d,0x20,0x14,0x09,0x00,0x1b,0x1e,0x91,0x15,0x18,0x01,0x15,0x16,0x15,0x16,0x15,0x0d,0x1d,0x12,0x09,0x07,0x92,0x0d,0x04,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x01,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10, -0xf9,0x32,0xc2,0x2f,0x10,0xe9,0x31,0x30,0x13,0x35,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x3d,0xfe,0xa8,0x4e,0x3e,0x76,0x5f,0x3d,0x77,0x3d,0x80,0x95,0x5a,0x91,0xaf,0x01,0xf1,0xa8,0xcc,0xcc,0xa8,0x01,0x47,0x96,0x01, -0x05,0x01,0x29,0x7c,0x43,0x55,0x76,0xa4,0x39,0x2a,0x9e,0x8b,0x64,0xc5,0xc3,0xbe,0x01,0xfb,0xfe,0x05,0x96,0xfe,0xb9,0x01,0x47,0x00,0x00,0x01,0x00,0x0f,0xfe,0xe7,0x03,0xe0,0x04,0x18,0x00,0x1e,0x00,0x48,0x40,0x24,0x1b,0x84,0x0e,0x04,0x04,0x03,0x07,0x84,0x08,0x00,0x08,0x0e,0x08,0x0e,0x08,0x20,0x1e,0x14,0x0a,0x14,0x11,0x95, -0x18,0x01,0x01,0x09,0x18,0x10,0x0b,0x03,0x00,0x96,0x08,0x06,0x09,0x15,0x00,0x3f,0x33,0xcd,0xed,0x32,0x32,0x3f,0x12,0x39,0x2f,0x10,0xed,0x32,0x01,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xf9,0x32,0xc0,0x2f,0x10,0xe9,0x31,0x30,0x25,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x37,0x36,0x12,0x35,0x34, -0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x07,0x02,0x9d,0xa4,0x9f,0x9f,0xa4,0xfd,0x72,0x02,0xc9,0xca,0x46,0x42,0x36,0x6b,0x30,0x39,0x79,0x39,0x7d,0x91,0xb1,0xd6,0x84,0x01,0xe3,0xfe,0x1d,0x84,0xfe,0xe7,0x01,0x19,0x77,0xc4,0x01,0x44,0x7f,0x42,0x4e,0x36,0x36,0x93,0x34,0x2f,0x98,0x7b,0x7a,0xfe, -0xd1,0xd8,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xe6,0x05,0x9a,0x00,0x14,0x00,0x3a,0x40,0x1d,0x14,0x00,0x05,0x06,0x00,0x06,0x00,0x06,0x0f,0x10,0x10,0x16,0x03,0x02,0x04,0x07,0x01,0x13,0x0b,0x05,0x14,0x14,0x02,0x12,0x12,0x0f,0x05,0x02,0x03,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0x32,0x11,0x33,0x2f,0x33, -0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x37,0x13,0x01,0x33,0x13,0x13,0x33,0x01,0x17,0x16,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x03,0xb0,0xb1,0xfe,0xb1,0xbb,0xed,0xf3,0x93,0xfe,0xc2,0x58,0x0a,0x0e,0x05,0x04,0x07,0x1a,0x01,0x95,0xb5,0xfd,0xed,0xb9,0x6f,0x68,0x0f,0x01,0xee,0x03,0x9d,0xfd,0x5a,0x02, -0xa6,0xfc,0x8a,0xfb,0x1c,0x3f,0x24,0x3c,0x45,0x04,0x6f,0xfa,0x66,0x01,0x31,0xfe,0xde,0x00,0x00,0x01,0xff,0xe8,0xff,0x37,0x03,0xcb,0x04,0xd1,0x00,0x14,0x00,0x42,0x40,0x24,0x10,0x0f,0x06,0x03,0x01,0x13,0x04,0x07,0x12,0x05,0x05,0x02,0x0f,0x05,0x02,0x02,0x05,0x0f,0x03,0x16,0x14,0x00,0x04,0x07,0x01,0x0a,0x04,0x03,0x14,0x12, -0x15,0x06,0x0f,0x0f,0x03,0x0f,0x00,0x3f,0x3f,0xce,0x3f,0xce,0x12,0x17,0x39,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x33,0x32,0x11,0x33,0x30,0x31,0x07,0x01,0x03,0x33,0x13,0x13,0x33,0x01,0x17,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x03,0x18,0x01,0x09,0xe3,0xb4,0x88,0xff,0x87,0xfe, -0xb7,0x3f,0x1d,0x07,0x04,0x05,0x10,0x0b,0x01,0x10,0xad,0xfe,0x68,0xa1,0x62,0xc3,0xc9,0x02,0x71,0x02,0x58,0xfe,0x79,0x02,0x58,0xfc,0xfb,0xb4,0x53,0x3c,0x26,0x46,0x1f,0x02,0xec,0xfc,0x00,0x01,0x01,0xfe,0x36,0x00,0x00,0x01,0x00,0x1a,0xfe,0x1e,0x07,0x60,0x05,0x9a,0x00,0x2c,0x00,0x4e,0x40,0x27,0x18,0x17,0x1d,0x23,0x22,0x13, -0x0f,0x01,0x27,0x1d,0x19,0x13,0x27,0x00,0x09,0x09,0x19,0x2c,0x00,0x00,0x2e,0x1a,0x19,0x1d,0x27,0x13,0x03,0x18,0x2c,0x22,0x19,0x03,0x0f,0x18,0x12,0x0b,0x91,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x11,0x33,0x33,0x11,0x33, -0x33,0x11,0x33,0x33,0x31,0x30,0x01,0x01,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x07,0x60,0xfe,0x74,0x3c,0x75,0x9c,0x63,0x1d,0x31,0x1d,0x30,0x31,0x3b, -0x67,0x1f,0x3c,0xfe,0xc8,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x13,0x05,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x37,0x09,0x09,0x03,0x03,0x04,0x0a,0x0a,0x01,0x24,0x05,0x9a,0xfa,0x88,0xd5,0xca,0x65,0x05,0x08,0x9d,0x12,0x56,0x52,0xa2,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x05,0x9a, -0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xb0,0x20,0x4a,0x20,0x21,0x43,0x26,0x04,0x50,0x00,0x00,0x01,0x00,0x18,0xfe,0x1e,0x05,0xb0,0x04,0x00,0x00,0x2c,0x00,0x4b,0x40,0x25,0x18,0x17,0x1f,0x23,0x22,0x13,0x0f,0x27,0x1f,0x19,0x13,0x27,0x00,0x09,0x09,0x19,0x2c,0x00,0x00,0x2e,0x1a,0x19,0x27,0x1e,0x13,0x03,0x18,0x2c, -0x22,0x19,0x0f,0x0b,0x95,0x05,0x0f,0x18,0x15,0x00,0x3f,0x33,0xd4,0xed,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x11,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x31,0x30,0x01,0x01,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x03,0x26,0x26,0x27, -0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x33,0x34,0x36,0x37,0x13,0x05,0xb0,0xfe,0xb4,0x39,0x59,0x88,0x6a,0x1c,0x34,0x1b,0x34,0x2d,0x51,0x66,0x23,0x2d,0xdd,0x06,0x08,0x02,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x05,0x07,0x02,0x08,0x03,0x0f,0xec,0x96,0xd5, -0x05,0x06,0x02,0x06,0x06,0x08,0xd6,0x04,0x00,0xfb,0xb6,0xba,0x90,0x4e,0x05,0x08,0x93,0x12,0x5b,0x6f,0x8a,0x02,0xdd,0x15,0x30,0x1a,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc,0xfe,0x11,0x2e,0x1d,0x2d,0x31,0x03,0x00,0xfc,0xfc,0x13,0x2d,0x1c,0x13,0x2f,0x1a,0x03,0x04,0x00,0x00,0x01,0x00,0x55,0xfe,0x21,0x04,0x93,0x05,0xc2,0x00,0x2c, -0x00,0x53,0x40,0x19,0x0c,0x20,0x20,0x26,0x00,0x00,0x26,0x22,0x0b,0x0b,0x0f,0x7d,0x1c,0x1c,0x2e,0x16,0x06,0x7d,0x26,0x0b,0x22,0x91,0x09,0x21,0x1f,0xb8,0x01,0x05,0x40,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x12,0x03,0x91,0x29,0x16,0x19,0x91,0x12,0x1c,0x00,0x3f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed, -0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x32,0x11,0x39,0x2f,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x32,0x04,0x15,0x14,0x04,0x21,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32, -0x16,0x17,0x02,0x7e,0x1f,0x63,0x27,0x59,0x78,0x8e,0x84,0x01,0xf9,0xfe,0xad,0xd3,0x01,0x04,0xfe,0xc0,0xfe,0xfb,0x57,0xae,0x57,0x59,0xb1,0x58,0xb9,0xd8,0xc2,0xf0,0x68,0x01,0x4c,0xfe,0xd8,0xec,0xd9,0x9b,0x32,0x5b,0x29,0x05,0x00,0x10,0x1d,0x74,0x5b,0x74,0x7d,0x56,0xfe,0x65,0xe0,0xbe,0xcc,0xf1,0x20,0x2a,0xa2,0x32,0x22,0x9c, -0x8e,0x91,0x8e,0x37,0x01,0x9c,0xc9,0xc0,0x95,0xcf,0x0b,0x0c,0x00,0x01,0x00,0x3e,0xfe,0x21,0x04,0x0c,0x04,0xdd,0x00,0x2c,0x00,0x53,0x40,0x19,0x0c,0x20,0x20,0x26,0x00,0x00,0x26,0x22,0x0b,0x0b,0x0f,0x83,0x1c,0x1c,0x2e,0x16,0x06,0x83,0x26,0x0b,0x22,0x95,0x09,0x21,0x1f,0xb8,0x01,0x05,0x40,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x12, -0x03,0x96,0x29,0x16,0x19,0x95,0x12,0x1c,0x00,0x3f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0xc4,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x32,0x11,0x39,0x2f,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x04,0x23, -0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x02,0x00,0x26,0x4b,0x27,0x39,0x4a,0x5d,0x5e,0x01,0xec,0xfe,0xbe,0xd4,0xee,0xfe,0xc6,0xf1,0x53,0xa6,0x53,0x55,0xa8,0x54,0xab,0xd3,0xe0,0xcf,0x4f,0x01,0x42,0xfe,0xf9,0x9e,0xc5,0xa8,0x77,0x29, -0x51,0x29,0x04,0x33,0x14,0x10,0x46,0x39,0x4a,0x4e,0x53,0xfe,0x7e,0x11,0xd6,0xb6,0xc6,0xe7,0x1f,0x28,0xa2,0x34,0x2a,0x9c,0x8b,0x91,0x96,0x35,0x01,0x85,0xa0,0x84,0x70,0x95,0x0b,0x11,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x14,0x00,0x1c,0x00,0x56,0x40,0x16,0x11,0x7d,0x1a,0x16,0x0d,0x01,0x0b,0x0b,0x09,0x01, -0x7e,0x06,0x04,0x02,0x00,0x91,0x16,0x15,0x91,0x0d,0x0c,0x04,0xb8,0x01,0x05,0xb6,0x05,0x09,0x05,0x20,0x16,0x01,0x05,0xb8,0xff,0xc0,0x40,0x0c,0x09,0x0e,0x48,0x16,0x05,0x16,0x05,0x02,0x07,0x03,0x02,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x5d,0x11,0x33,0x10,0xfd,0x32,0xdc,0xed,0x10,0xed,0x01,0x2f,0xc6,0x33,0xf9, -0x32,0xc0,0x2f,0x11,0x33,0x33,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xaa,0xaa,0xa8,0xd4,0xd4,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xae,0xb7,0xfe,0xb0,0x01,0x3e,0xfe,0xc2,0x04, -0xee,0x67,0x45,0x45,0x67,0x36,0xe0,0xcc,0xcb,0xfe,0xfd,0x02,0xe3,0xfd,0xb4,0x9b,0x92,0x01,0x1f,0x00,0x00,0x02,0x00,0x27,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4f,0x40,0x2c,0x10,0x83,0x1f,0x08,0x1f,0x08,0x1f,0x27,0x0a,0x06,0x17,0x84,0x03,0x01,0x18,0x17,0x1b,0x15,0x1c,0x95,0x13,0x16,0x0a,0x22,0x95,0x0d, -0x09,0x01,0x96,0x06,0x02,0x02,0x04,0x00,0x0d,0x10,0x0d,0x20,0x0d,0x03,0x0d,0x10,0x04,0x00,0x00,0x3f,0x3f,0x5d,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x13,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36, -0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x79,0xe9,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x9a,0xcc,0xfe,0xee, -0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfd,0x95,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x14,0x00,0x1c,0x00,0x44,0x40,0x23,0x11,0x7d,0x1a,0x1a,0x06,0x1e,0x16,0x05,0x03,0x03,0x01,0x05,0x7e,0x0a,0x08,0x06,0x15,0x91,0x0d,0x0d,0x06,0x0b,0x03,0x16,0x91,0x00,0x01,0x0f, -0x09,0x01,0x09,0x04,0x08,0x06,0x12,0x00,0x3f,0xde,0x32,0xdd,0x5d,0x32,0xdc,0xed,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc6,0x33,0xf9,0x32,0xc2,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36, -0x35,0x10,0x21,0x01,0x64,0xd4,0xd4,0xa8,0xaa,0xaa,0xa8,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xae,0xb7,0xfe,0xb0,0x01,0x3e,0x55,0x67,0x82,0x82,0x67,0x04,0xb1,0xe2,0xe0,0xcc,0xcb,0xfe,0xfd,0x02,0xe3,0xfd,0xb4,0x9b,0x92,0x01,0x1f,0x00,0x02,0x00,0x27,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4b,0x40,0x28, -0x0c,0x1f,0x1f,0x18,0x27,0x19,0x17,0x15,0x15,0x13,0x06,0x17,0x03,0x01,0x18,0x17,0x1b,0x11,0x1c,0x95,0x0f,0x00,0x16,0x96,0x03,0x13,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0x16,0x06,0x22,0x95,0x09,0x10,0x04,0x00,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x5d,0xde,0x32,0xed,0x32,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xd1,0x32,0x32,0xc2,0x2f, -0x11,0x33,0x11,0x12,0x39,0x2f,0xc1,0x31,0x30,0x17,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x7f,0x7f,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0x01,0x54,0xfe, -0xac,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0xf8,0x86,0x06,0x5e,0xfd,0x60,0xcc,0xfe,0xee,0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfe,0xfa,0x86,0xdf,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x01,0x00,0xbc,0xfe,0x29,0x03,0xc7,0x05,0x9a,0x00,0x0b,0x00,0x23,0x40,0x10,0x09,0x0a,0x0a,0x0d,0x04,0x00,0x7e,0x01, -0x04,0x0b,0x01,0x09,0x02,0x03,0x01,0x1b,0x00,0x3f,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0xe9,0x32,0x11,0x33,0x2f,0x33,0x31,0x30,0x01,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x01,0x64,0xa8,0xa8,0x04,0x03,0x0e,0x0d,0x01,0x8c,0xb5,0xfd,0x9d,0xfe,0x29,0x07,0x71,0xfb,0xcb,0x12,0x31,0x1e,0x03,0xd4,0xfa,0x66,0x00, -0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0x28,0x04,0x00,0x00,0x0b,0x00,0x21,0x40,0x0f,0x08,0x09,0x09,0x0d,0x03,0x0a,0x84,0x00,0x0a,0x03,0x08,0x01,0x0f,0x00,0x1b,0x00,0x3f,0x3f,0x33,0x39,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x11,0xa6,0xa4,0x04,0x0a,0x2b, -0x14,0xe4,0xad,0xfe,0x22,0xfe,0x29,0x05,0xd7,0xfd,0x34,0x33,0x68,0x2f,0x02,0x02,0xfc,0x00,0xfe,0x29,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x5d,0x05,0xb2,0x00,0x29,0x00,0x41,0x40,0x22,0x1c,0x7d,0x0f,0x23,0x7d,0x06,0x1f,0x0f,0x0a,0x0f,0x06,0x06,0x0f,0x0a,0x03,0x2b,0x15,0x29,0x1f,0x0a,0x91,0x0b,0x0b,0x19,0x00,0x03,0x91,0x26, -0x13,0x15,0x12,0x91,0x19,0x04,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15, -0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x60,0x4b,0xa1,0x4b,0x80,0x99,0x9b,0x93,0x71,0x5a,0x7f,0x95,0x67,0x62,0x45,0x99,0x41,0x4b,0x93,0x4b,0xa9,0xc3,0x6d,0x6a,0x7c,0x8c,0xf8,0xcc,0x4e,0x9d,0x4e,0xd7,0x32,0x26,0x95,0x82,0x80,0x85,0x98,0x97,0x84,0x64,0x69,0x2d,0x30,0xa2,0x2b,0x27,0xc1,0xa0,0x7d, -0xa9,0x2d,0x08,0x16,0xbe,0x8c,0xc4,0xea,0x21,0x2c,0x00,0x01,0x00,0x1e,0xfe,0x23,0x02,0xe7,0x04,0x18,0x00,0x29,0x00,0x41,0x40,0x22,0x1c,0x84,0x0f,0x23,0x84,0x06,0x20,0x0f,0x0a,0x0f,0x06,0x06,0x0f,0x0a,0x03,0x2b,0x15,0x00,0x1f,0x0a,0x95,0x0b,0x0b,0x19,0x00,0x03,0x95,0x26,0x1c,0x15,0x12,0x95,0x19,0x10,0x00,0x3f,0xed,0x32, -0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x00,0x23, -0x22,0x26,0x27,0x21,0x23,0x6c,0x2b,0x97,0xd0,0x9c,0xba,0x46,0x52,0x78,0xa1,0x71,0x65,0x47,0x8f,0x47,0x48,0x94,0x48,0xaf,0xc6,0x72,0x51,0x80,0x73,0xfe,0xcf,0xdb,0x2a,0x66,0x2a,0xfe,0xcc,0x0f,0x11,0xc5,0x96,0x8b,0x85,0x89,0xa2,0x78,0x65,0x70,0x29,0x2b,0x98,0x25,0x20,0xb8,0xa6,0x5d,0xc0,0x2a,0x05,0x2c,0xbb,0x80,0xcd,0xfe, -0xe9,0x08,0x09,0x00,0x00,0x02,0x00,0x14,0xff,0xe8,0x03,0xba,0x05,0xb0,0x00,0x19,0x00,0x24,0x00,0x41,0x40,0x21,0x24,0x0e,0x7e,0x00,0x03,0x00,0x0a,0x7d,0x1d,0x00,0x1d,0x00,0x1d,0x26,0x01,0x15,0x15,0x17,0x91,0x12,0x0e,0x00,0x91,0x24,0x02,0x02,0x07,0x12,0x13,0x20,0x91,0x07,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed, -0x32,0x10,0xed,0x32,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9,0x32,0x31,0x30,0x01,0x21,0x35,0x21,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x01,0x83,0xfe,0xe2,0x01,0x1e, -0x95,0x86,0x7d,0x9f,0xb9,0x86,0x50,0xd1,0xbc,0x54,0x36,0x36,0x56,0xe3,0xf9,0x49,0x45,0x31,0x36,0x41,0x37,0x03,0x70,0x97,0x81,0x8c,0x9c,0x99,0x7c,0x80,0xab,0xfe,0x92,0xf8,0xfe,0xde,0x18,0xa6,0x27,0x01,0x81,0x02,0x07,0x53,0x41,0x36,0x4a,0x50,0x43,0x81,0x00,0x02,0xff,0x76,0xfe,0x1e,0x03,0x15,0x06,0x02,0x00,0x19,0x00,0x24, -0x00,0x41,0x40,0x21,0x24,0x0e,0x84,0x00,0x03,0x00,0x0a,0x83,0x1d,0x00,0x1d,0x00,0x1d,0x26,0x01,0x15,0x15,0x17,0x95,0x12,0x0e,0x00,0x95,0x24,0x02,0x02,0x07,0x12,0x1c,0x20,0x95,0x07,0x00,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9, -0x32,0x31,0x30,0x13,0x23,0x35,0x37,0x35,0x34,0x36,0x37,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0xe2,0xd8,0xd8,0x91,0x8a,0x7d,0x9b,0xae,0x83,0x5e,0xcc,0xbc,0x45,0x43,0x49,0x43,0xe0,0xf9,0x43,0x4f,0x3d,0x33,0x3c,0x3b, -0x03,0xc6,0x8c,0x01,0x87,0x89,0x9e,0x01,0x98,0x7a,0x82,0xa8,0xfc,0x65,0xfd,0xfe,0xf0,0x20,0x99,0x2d,0x01,0x66,0x04,0x42,0x57,0x47,0x3d,0x4b,0x54,0x4a,0x88,0x00,0x00,0x01,0x00,0x38,0xff,0xe8,0x03,0xca,0x05,0xb2,0x00,0x25,0x00,0x37,0x40,0x1c,0x15,0x7d,0x22,0x08,0x22,0x08,0x22,0x27,0x1c,0x02,0x7e,0x0f,0x1c,0x1f,0x91,0x18, -0x08,0x05,0x91,0x0c,0x0c,0x12,0x18,0x13,0x25,0x91,0x12,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x00,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x22,0x26, -0x27,0x35,0x16,0x16,0x33,0x32,0x12,0x11,0x10,0x26,0x23,0x01,0x7c,0x9b,0x8b,0x7c,0x3a,0x6e,0x36,0x35,0x6d,0x3d,0xc1,0xee,0xf8,0xcd,0xde,0xef,0xfe,0xc0,0xfe,0xe7,0x3c,0x77,0x3c,0x39,0x81,0x39,0xcf,0xd6,0x8f,0x90,0x05,0x1c,0xae,0x8d,0x90,0xaf,0x28,0x2b,0xa2,0x23,0x24,0xfc,0xc7,0xd7,0x01,0x0c,0xfe,0x9f,0xfe,0xbe,0xfe,0x87, -0xfe,0x52,0x18,0x16,0xa5,0x1d,0x20,0x01,0x4c,0x01,0x45,0x01,0x10,0xfd,0x00,0x01,0x00,0x43,0xfe,0x4e,0x03,0xce,0x04,0x18,0x00,0x25,0x00,0x34,0x40,0x1a,0x15,0x83,0x22,0x08,0x22,0x08,0x22,0x27,0x1c,0x02,0x84,0x0f,0x08,0x05,0x95,0x0c,0x0c,0x12,0x1c,0x1f,0x95,0x18,0x25,0x95,0x12,0x0f,0x00,0x3f,0xed,0x2f,0xed,0x32,0x11,0x39, -0x2f,0xed,0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x00,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x01,0x83,0x9c,0x8e,0x7b,0x39,0x6d,0x37,0x36,0x71, -0x37,0xc0,0xec,0xf5,0xcd,0xdd,0xec,0xfe,0xc8,0xfe,0xe2,0x3c,0x76,0x3c,0x39,0x82,0x38,0xd4,0xd5,0x91,0x92,0x03,0x8e,0xb6,0x8e,0x96,0xb2,0x24,0x2b,0x98,0x23,0x1e,0xfb,0xc5,0xd6,0x01,0x0a,0xfe,0xa2,0xfe,0xbb,0xfe,0x8a,0xfe,0x4f,0x16,0x14,0x9d,0x1d,0x20,0x01,0x55,0x01,0x49,0x01,0x18,0x01,0x00,0x00,0x01,0x00,0x28,0x02,0x89, -0x02,0x39,0x05,0xaa,0x00,0x24,0x00,0x44,0xb3,0x00,0x00,0x05,0x0b,0xb8,0x01,0x04,0xb3,0x18,0x18,0x26,0x1e,0xb8,0x01,0x04,0xb3,0x12,0x05,0x12,0x15,0xb8,0x01,0x05,0xb2,0x0e,0x24,0x21,0xb8,0x01,0x05,0xb4,0x02,0x02,0x08,0x0e,0x1b,0xb8,0x01,0x05,0xb1,0x08,0x04,0x00,0x3f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x01, -0x2f,0xc4,0xe9,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x01,0x7a,0x2b,0x32,0x77,0x7e,0x8f,0x71,0x83,0x8e,0xa9,0x9c,0x29,0x4b,0x26, -0x28,0x4b,0x28,0x5f,0x62,0x49,0x45,0x3a,0x47,0x38,0x3f,0x18,0x31,0x13,0x03,0xbb,0x11,0x83,0x72,0x74,0x97,0xbf,0xad,0xc5,0xf0,0x0f,0x0e,0x78,0x14,0x11,0xa3,0xa1,0x86,0x77,0x55,0x42,0x3f,0x52,0x0c,0x0e,0x00,0x02,0x00,0x60,0xff,0x43,0x05,0x60,0x05,0xec,0x00,0x1a,0x00,0x27,0x00,0x4e,0x40,0x2a,0x27,0x19,0x84,0x15,0x09,0x06, -0x07,0x00,0x01,0x09,0x07,0x01,0x03,0x03,0x01,0x07,0x09,0x04,0x29,0x21,0x83,0x10,0x17,0x00,0x15,0x1e,0x95,0x13,0x10,0x0a,0x24,0x95,0x07,0x0d,0x16,0x02,0x00,0x19,0x95,0x05,0x09,0x15,0x00,0x3f,0x33,0xfd,0xc6,0x33,0x3f,0xc6,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33, -0x11,0x33,0xe9,0x33,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x33,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x04,0xbc,0x8e,0x59,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0x04,0x72,0xee,0xc0,0xe8,0xff,0xd6,0xd3, -0x60,0x04,0xa4,0x53,0xf7,0xa6,0x7c,0x97,0xab,0xa3,0x8d,0x88,0xac,0x01,0x44,0xba,0x8a,0xbd,0xbd,0xae,0xc6,0x01,0x11,0xef,0xfc,0x01,0x34,0xa6,0x02,0x7a,0xfa,0x9e,0x01,0xdc,0x7e,0xaa,0xdd,0xc1,0xb1,0xcd,0xc6,0x97,0x00,0x01,0x00,0xa6,0xff,0x43,0x02,0x9a,0x05,0xec,0x00,0x0d,0x00,0x30,0x40,0x17,0x0b,0x0c,0x05,0x06,0x0c,0x06, -0x00,0x08,0x08,0x0f,0x03,0x84,0x00,0x01,0x00,0x07,0x05,0x03,0x95,0x0c,0x0a,0x00,0x15,0x00,0x3f,0x32,0xc6,0xfd,0xc6,0x33,0x3f,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0xa6,0xa4,0x53,0x57,0x8e,0x57,0x6f,0xb1,0x59,0x8e, -0x59,0x05,0xec,0xfa,0x9e,0xba,0xba,0x8a,0xbd,0xbd,0x00,0x01,0x00,0xa6,0xff,0x43,0x07,0xa4,0x04,0x18,0x00,0x29,0x00,0x5d,0x40,0x32,0x1d,0x19,0x84,0x1a,0x23,0x11,0x84,0x12,0x28,0x84,0x09,0x06,0x07,0x00,0x01,0x12,0x09,0x07,0x01,0x03,0x03,0x01,0x07,0x09,0x12,0x05,0x04,0x1a,0x04,0x23,0x1d,0x0d,0x15,0x95,0x25,0x20,0x10,0x1b, -0x0f,0x12,0x19,0x15,0x02,0x00,0x28,0x95,0x07,0x05,0x09,0x15,0x00,0x3f,0x33,0xc6,0xfd,0xc6,0x33,0x3f,0x33,0x3f,0x3f,0x33,0xed,0x32,0x32,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xe9,0x10,0xe9,0x39,0x10,0xe9,0x32,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x11, -0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x11,0x33,0x06,0xfe,0x8e,0x57,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0x68,0x7d,0x69,0x93,0xa4,0xe9,0x6a,0x8e,0xa4,0xa4,0x04,0x6d,0xd1,0x68,0x9e,0x1c,0x72,0xe2,0x01,0x52,0x53,0x01,0x44, -0xba,0x8a,0xbd,0xbd,0x02,0x4c,0xa7,0x9b,0xbe,0x88,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb3,0x93,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x76,0x5e,0xd4,0xfe,0x5f,0xfe,0x13,0x00,0x00,0x01,0x00,0xa6,0xff,0x43,0x05,0x48,0x04,0x18,0x00,0x1c,0x00,0x45,0x40,0x25,0x14,0x10,0x84,0x11,0x1b,0x84,0x06,0x07,0x00,0x01,0x09,0x07,0x01,0x03,0x03,0x01, -0x07,0x09,0x04,0x04,0x11,0x04,0x15,0x0c,0x95,0x17,0x10,0x12,0x0f,0x11,0x15,0x00,0x1b,0x95,0x07,0x09,0x15,0x00,0x3f,0xc6,0xfd,0xc6,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x10,0xe9,0x32,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x11,0x10,0x23, -0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x04,0xa5,0x8e,0x5a,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x53,0x01,0x46,0xbc,0x8a,0xbd,0xbd,0x02,0x48,0x01,0x46,0xb8,0x8e,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfe,0x18,0x00,0x00,0x01,0x00,0xa6, -0x00,0x00,0x02,0xbc,0x04,0x91,0x00,0x17,0x00,0x3a,0x40,0x1e,0x09,0x0a,0x00,0x01,0x0a,0x01,0x06,0x06,0x01,0x0a,0x03,0x19,0x12,0x0f,0x84,0x10,0x11,0x0f,0x10,0x15,0x14,0x0b,0x09,0x08,0xec,0x17,0x00,0x96,0x02,0x10,0x00,0x3f,0xed,0x33,0xfd,0xcd,0x33,0x33,0x3f,0x3f,0x01,0x2f,0xe9,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33, -0x11,0x33,0x31,0x30,0x01,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x07,0x23,0x37,0x06,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x37,0x02,0x26,0x7a,0x23,0x14,0x1e,0x0d,0x26,0x42,0x3a,0x7a,0x31,0x3a,0x4d,0xa4,0xa4,0x04,0x1a,0x5b,0x3b,0x04,0x91,0x80,0x02,0x06,0x05,0xaa,0x1d,0x03,0xd7,0xb7,0x26,0xa8,0x82,0xfd,0xf6, -0x04,0x00,0xd3,0x4f,0x6c,0x18,0x00,0x02,0x00,0xa6,0xff,0x43,0x04,0xa2,0x04,0x01,0x00,0x1e,0x00,0x27,0x00,0x53,0x40,0x2c,0x0f,0x06,0x0c,0x83,0x1c,0x1d,0x16,0x17,0x17,0x14,0x1d,0x00,0x04,0x19,0x24,0x19,0x24,0x19,0x07,0x1a,0x20,0x06,0x84,0x07,0x0f,0x20,0x96,0x05,0x05,0x06,0x1f,0x96,0x08,0x0f,0x06,0x15,0x18,0x16,0x14,0x95, -0x1d,0x1b,0x00,0x15,0x00,0x3f,0x32,0xc6,0xfd,0xc6,0x33,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xe9,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0xed,0x11,0x39,0x31,0x30,0x21,0x03,0x26,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x17,0x33,0x37, -0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x02,0xe5,0x98,0x2e,0x40,0x4e,0x47,0xa4,0x01,0x36,0xce,0xb2,0x90,0x67,0x1f,0x3b,0x2a,0x69,0x53,0x4f,0x8e,0x4f,0x6f,0xb1,0x59,0x8e,0x59,0xfd,0xe7,0x78,0x72,0x80,0x67,0x73,0x01,0x1b,0x54,0x34,0xfe,0x5d,0x04,0x01,0x8b,0x94,0x5f,0x97,0x0c, -0x03,0x09,0x3d,0x4d,0xc0,0xa7,0xa7,0x8a,0xbd,0xbd,0x03,0x7e,0xfe,0xab,0x5f,0x5a,0x4f,0x4d,0x00,0x02,0x00,0x2b,0xff,0xea,0x05,0x12,0x05,0xb1,0x00,0x21,0x00,0x2c,0x00,0x4d,0x40,0x28,0x1c,0xef,0x25,0x09,0x25,0x09,0x25,0x2e,0x14,0x03,0x84,0x11,0x0f,0x0d,0x2c,0x21,0x84,0x15,0x00,0x28,0x96,0x19,0x20,0x02,0x0e,0x95,0x11,0x2c, -0x14,0x11,0x13,0x13,0x11,0x0f,0x06,0x95,0x0b,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x33,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0xd4,0xed,0x01,0x2f,0x33,0xe9,0x32,0x2f,0xc6,0x33,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35, -0x33,0x35,0x37,0x11,0x21,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x02,0xf2,0xfe,0x8d,0x46,0x51,0x3f,0x2c,0x3b,0x5e,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x73,0x8c,0x8a,0x83,0x87,0xa7,0xa0,0x35,0x36,0x4f,0x5d,0x37,0x39,0x39,0x37,0x03,0x74,0xfd,0xbf,0x67, -0x58,0x22,0x8c,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x6e,0xa9,0x9a,0x96,0x82,0x8d,0x98,0xfc,0x8c,0x04,0x00,0x4b,0x4f,0x49,0x48,0x52,0x6e,0x6b,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x03,0x5b,0x05,0xb2,0x00,0x22,0x00,0x2e,0x00,0x4c,0x40,0x28,0x1f,0x10,0x22,0x0d,0x7e,0x26,0x03,0x23,0x00,0x26,0x13,0x7e,0x1c,0x26, -0x1c,0x26,0x1c,0x30,0x22,0x00,0x2c,0x7e,0x18,0x07,0x1f,0x03,0x10,0x23,0x04,0x22,0x22,0x0a,0x18,0x91,0x16,0x12,0x29,0x91,0x0a,0x03,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0xc6,0xe9,0xc6,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x12,0x39,0x39,0x10,0xe9,0x11,0x39,0x39,0x31,0x30,0x13,0x36,0x12,0x37, -0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x21,0x35,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x07,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x95,0x4d,0x8d,0x3c,0x10,0x93,0x4c,0x98,0x6f,0x73,0x88,0x31,0x22,0x84,0x6c,0xe5,0xc4,0xfe,0x3a,0x01,0xd1, -0x69,0x89,0x42,0x48,0x3d,0x87,0x4b,0xcf,0x15,0x18,0x2c,0x29,0x29,0x31,0x49,0x01,0x3a,0x80,0x01,0x04,0x80,0x0e,0x82,0x97,0x4f,0x6b,0x93,0x92,0x79,0x4b,0xa5,0x59,0x84,0xd8,0x73,0xba,0xd5,0x97,0x89,0x6d,0x54,0x9e,0x4e,0x7e,0xed,0x7b,0x02,0xf5,0x38,0x5d,0x38,0x36,0x3b,0x3c,0x29,0x39,0x69,0x00,0x00,0x02,0x00,0x0f,0xff,0xe8, -0x05,0xaa,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x28,0x40,0x14,0x05,0x7d,0x0e,0x0b,0x14,0x14,0x1c,0x1a,0x7d,0x00,0x0b,0x11,0x91,0x08,0x13,0x17,0x0e,0x91,0x01,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x01,0x2f,0xc6,0xe9,0x12,0x39,0x2f,0x12,0x39,0xe9,0x31,0x30,0x13,0x35,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12, -0x37,0x02,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x15,0x0f,0x03,0x07,0x01,0x25,0x01,0x6f,0xfe,0x8c,0xfe,0xc8,0xfe,0xd4,0xfe,0x8c,0x99,0x74,0x5d,0x01,0x11,0xdf,0xe9,0x01,0x13,0xfe,0xfc,0xec,0xe1,0xfe,0xe5,0x05,0x02,0x98,0xfe,0x6d,0xfe,0xcc,0xfe,0xb0,0xfe,0x65,0x01,0x8d,0x01,0x3b,0xe1,0x01,0x2a,0x47,0xfc,0xc1, -0xfe,0xbc,0x01,0x34,0x01,0x09,0x01,0x10,0x01,0x36,0xfe,0xb9,0xfc,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x18,0x05,0xe9,0x00,0x13,0x00,0x1e,0x00,0x2f,0x40,0x18,0x09,0x0c,0x10,0x83,0x19,0x19,0x20,0x0d,0x0c,0x1e,0x83,0x02,0x08,0x05,0x16,0x95,0x13,0x16,0x0d,0x00,0x1b,0x95,0x05,0x10,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39, -0x01,0x2f,0xe9,0xc4,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x31,0x30,0x04,0x02,0x35,0x34,0x00,0x33,0x32,0x16,0x17,0x37,0x26,0x00,0x27,0x33,0x04,0x00,0x11,0x14,0x00,0x23,0x00,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x01,0x5c,0xfc,0x01,0x09,0xde,0x33,0x5e,0x1f,0x03,0x4f,0xfe,0xea,0xbc,0xfa,0x01,0x20,0x01,0x25,0xfe, -0xfa,0xd4,0xfe,0xca,0xa9,0x91,0x8a,0xa4,0xfe,0xd6,0x96,0xa8,0x18,0x01,0x1c,0xf6,0xf0,0x01,0x2e,0x1e,0x1d,0x02,0x77,0x01,0x06,0x8d,0xdb,0xfe,0x07,0xfe,0xf1,0xef,0xfe,0xd1,0x01,0x61,0xd7,0xdf,0xad,0x01,0x90,0xdc,0xb8,0x00,0x00,0x01,0x00,0xbc,0xfe,0x29,0x02,0xf4,0x05,0xac,0x00,0x15,0x00,0x2b,0x40,0x16,0x07,0x00,0x00,0x17, -0x0d,0x06,0x09,0x83,0x0b,0x0e,0x02,0xf4,0x12,0x01,0x0c,0x00,0x0a,0x1b,0x06,0xec,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x02,0xf4,0x2f,0x57,0x78, -0x92,0x01,0x77,0xfe,0x89,0xa8,0xa8,0x04,0x26,0x9b,0x61,0x23,0x34,0x13,0x04,0xea,0x21,0xd1,0xc8,0xfd,0x25,0x97,0xfe,0x29,0x07,0x71,0xd3,0x6b,0x7a,0x07,0x07,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x14,0x00,0x2b,0x40,0x16,0x07,0x00,0x00,0x16,0x0d,0x06,0x09,0x84,0x0b,0x0e,0x02,0xec,0x12,0x10,0x0c,0x0f, -0x0a,0x1b,0x06,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2c,0x50,0x6a,0x8c,0x01,0x56,0xfe,0xaa,0xa4,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24, -0x03,0x5a,0x21,0xc5,0xac,0xfe,0x80,0x8a,0xfe,0x29,0x05,0xd7,0xd3,0x6e,0x77,0x0e,0x00,0x02,0x00,0x5a,0xff,0xe8,0x04,0x49,0x05,0x9a,0x00,0x1a,0x00,0x2b,0x00,0x4d,0x40,0x28,0x07,0x7d,0x18,0x0b,0x7d,0x1d,0x00,0x04,0x15,0x25,0x1d,0x18,0x1d,0x04,0x04,0x1d,0x18,0x03,0x2d,0x28,0x7d,0x01,0x12,0x18,0x07,0x25,0x07,0x02,0x15,0x15, -0x02,0x2b,0x91,0x0f,0x13,0x04,0x00,0x91,0x02,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0x12,0x39,0xcd,0x11,0x33,0x01,0x2f,0xc4,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x11,0x33,0x10,0xe9,0x10,0xe9,0x31,0x30,0x01,0x21,0x35,0x21,0x15,0x06,0x06,0x15,0x14,0x04,0x16,0x15,0x15,0x06,0x04,0x23,0x22,0x24,0x35, -0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x12,0x36,0x35,0x34,0x26,0x2f,0x02,0x26,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x02,0x82,0xfe,0x27,0x03,0x4b,0x95,0xeb,0x01,0x31,0xa4,0x06,0xfe,0xe8,0xe5,0xdb,0xfe,0xef,0xc0,0xda,0x19,0x17,0x69,0xb6,0xb6,0x55,0x39,0x4b,0x3c,0x0e,0x19,0x0e,0xbe,0x87,0xa9,0x96,0x05,0x04,0x96,0x85, -0x1a,0x90,0x52,0x52,0xce,0xcb,0x81,0x07,0xd0,0xee,0xed,0xc3,0x9d,0xee,0x61,0x21,0x53,0x23,0x46,0x7f,0xfb,0x9f,0xa1,0x8c,0x40,0x76,0x2d,0x3a,0x2d,0x0a,0x14,0x0c,0x5a,0xae,0x76,0x88,0x9b,0x00,0x00,0x02,0x00,0x59,0x00,0x00,0x04,0x48,0x05,0xb2,0x00,0x1d,0x00,0x2d,0x00,0x45,0x40,0x24,0x1b,0x7d,0x07,0x15,0x7d,0x2a,0x00,0x0f, -0x07,0x2a,0x01,0x01,0x2a,0x07,0x03,0x2f,0x20,0x7d,0x04,0x0f,0x27,0x1b,0x07,0x07,0x18,0x18,0x03,0x2d,0x91,0x12,0x04,0x04,0x00,0x91,0x03,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x39,0x11,0x33,0xcd,0x01,0x2f,0xc4,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x25,0x21,0x15,0x21,0x35, -0x36,0x24,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x35,0x36,0x24,0x33,0x32,0x04,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x02,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x02,0x20,0x01,0xd9,0xfc,0xb5,0x7b,0x01,0x05,0x45,0x47,0x46,0x8f,0x74,0x06,0x01,0x17,0xe6,0xdb,0x01,0x11,0xc9,0xd1, -0x19,0x17,0x69,0xb6,0xb6,0x60,0x9a,0x1c,0x0d,0x19,0x0e,0xbe,0x87,0xa9,0x96,0x96,0x96,0x85,0x12,0x93,0x57,0x2a,0x53,0x33,0x32,0x6a,0xb5,0x65,0x0d,0xcf,0xef,0xed,0xc3,0xa1,0xf0,0x5b,0x21,0x53,0x23,0x46,0x7f,0x04,0x61,0xa1,0x8c,0x41,0x85,0x6f,0x15,0x0a,0x14,0x0c,0x5a,0xae,0x76,0x88,0x9b,0x00,0x00,0x02,0x00,0x60,0xfe,0x39, -0x04,0x3f,0x04,0x18,0x00,0x19,0x00,0x27,0x00,0x48,0x40,0x25,0x21,0x14,0x1c,0x17,0x84,0x07,0x11,0x83,0x24,0x00,0x0b,0x07,0x01,0x24,0x07,0x24,0x07,0x24,0x29,0x1c,0x83,0x04,0x0b,0x21,0x96,0x14,0x14,0x02,0x27,0x95,0x0e,0x10,0x04,0x00,0x95,0x02,0x1b,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xe9,0x12, -0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xe9,0x10,0xe9,0x11,0x39,0x39,0x31,0x30,0x01,0x21,0x15,0x21,0x35,0x36,0x36,0x35,0x34,0x24,0x26,0x35,0x34,0x24,0x33,0x32,0x04,0x15,0x14,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x02,0x06,0x15,0x14,0x16,0x1f,0x02,0x36,0x36,0x35,0x34,0x26,0x23,0x02,0x08,0x01,0xc0,0xfc,0xd3,0xd5, -0xb0,0xfe,0xc2,0x82,0x01,0x1a,0xef,0xca,0x01,0x0c,0xd8,0xc6,0x14,0x11,0x6a,0x96,0xbe,0x5c,0x60,0x6a,0x1b,0xa7,0xa7,0xaa,0x8a,0xfe,0xc5,0x8c,0x47,0x61,0x97,0x4e,0x5b,0xd6,0xd0,0x86,0xd5,0xf6,0xef,0xc9,0xb2,0xfe,0xf7,0x5c,0x21,0x41,0x21,0x4d,0x8e,0x04,0xa2,0xa7,0x95,0x68,0x7f,0x4d,0x54,0x18,0x52,0xc8,0x95,0x8c,0xa1,0x00, -0x00,0x01,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x00,0x05,0x00,0x1a,0x40,0x0c,0x02,0x7e,0x03,0x03,0x07,0x05,0x03,0x12,0x05,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x12,0x39,0x2f,0xe9,0x31,0x30,0x13,0x21,0x11,0x23,0x11,0x21,0x20,0x02,0xe8,0xa8,0xfd,0xc0,0x05,0x9a,0xfa,0x66,0x05,0x02,0x00,0x01,0x00,0xa6,0x00,0x00, -0x01,0x4a,0x05,0xec,0x00,0x03,0x00,0x17,0x40,0x0a,0x00,0x84,0x01,0x01,0x04,0x05,0x02,0x00,0x01,0x15,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xe9,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x4a,0xa4,0xa4,0x05,0xec,0x00,0x00,0x01,0x00,0xbc,0xfe,0x29,0x05,0xfc,0x05,0xb2,0x00,0x1e,0x00,0x2e,0x40,0x18,0x00,0x7e,0x0d,0x06,0x0d,0x06, -0x20,0x17,0x14,0x7e,0x15,0x19,0x10,0x91,0x1b,0x04,0x17,0x03,0x14,0x1b,0x03,0x91,0x0a,0x13,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x21,0x22,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33, -0x12,0x21,0x32,0x12,0x11,0x05,0x27,0x34,0x31,0x20,0x36,0x1a,0x18,0x44,0x1f,0x7e,0x84,0xfe,0x9f,0xc1,0xf9,0xa8,0xa8,0x06,0x9d,0x01,0x3f,0xe8,0xf9,0x01,0x21,0x5b,0x48,0x0e,0x0e,0x9e,0x0b,0x09,0x91,0x7f,0x02,0x3d,0x01,0xe5,0xfe,0xe5,0xd4,0xfa,0xfe,0x07,0x71,0xfe,0xfa,0x01,0x1e,0xfe,0xcd,0xfe,0xe3,0x00,0x00,0x01,0x00,0xa6, -0xfe,0x29,0x04,0xb0,0x04,0x18,0x00,0x1e,0x00,0x2e,0x40,0x18,0x00,0x84,0x0d,0x06,0x0d,0x06,0x20,0x18,0x14,0x84,0x15,0x18,0x10,0x95,0x1b,0x10,0x17,0x0f,0x14,0x1b,0x03,0x95,0x0a,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x15, -0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0x2c,0x2c,0x16,0x34,0x16,0x17,0x39,0x19,0x73,0x80,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x01,0x14,0x5e,0x45,0x0a,0x0e,0x8d,0x0b,0x09,0x8d,0x83,0x01,0x50,0x01,0x46,0xb8,0x8e,0xfb,0xe1, -0x05,0xd7,0xaa,0xc2,0xd8,0xce,0x00,0x01,0x00,0xbc,0xfe,0x29,0x02,0xf4,0x05,0xb2,0x00,0x11,0x00,0x21,0x40,0x10,0x0c,0x0c,0x13,0x04,0x00,0x83,0x01,0x04,0x0e,0xf4,0x08,0x01,0x03,0x00,0x00,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16, -0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x01,0x64,0xa8,0xa8,0x04,0x26,0x9b,0x61,0x23,0x34,0x13,0x2f,0x57,0x78,0x92,0xfe,0x29,0x07,0x71,0xcd,0x6b,0x7a,0x07,0x07,0xb4,0x21,0xd1,0xc8,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x10,0x00,0x21,0x40,0x10,0x00,0x00,0x12,0x0b,0x06,0x84,0x07,0x0a,0x02,0xec,0x0e,0x10, -0x09,0x0f,0x06,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2c,0x50,0x6a,0x8c,0xa4,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24,0x03,0x5a,0x21,0xc5,0xac,0xfc,0x1f,0x05,0xd7,0xd3,0x6e,0x77,0x0e,0x00, -0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xb9,0x05,0x9b,0x00,0x1e,0x00,0x2f,0x40,0x17,0x1d,0x19,0x12,0x08,0x12,0x08,0x20,0x1e,0x0c,0x7d,0x19,0x13,0x12,0x12,0x0f,0x91,0x16,0x13,0x09,0x1d,0x91,0x00,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x2f,0x33,0x01,0x2f,0xe1,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x33,0x32, -0x37,0x21,0x32,0x17,0x33,0x15,0x21,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x20,0x00,0x11,0x34,0x12,0x36,0x37,0x21,0x6b,0xe6,0x64,0x4f,0x01,0xc6,0x32,0x3a,0x83,0xfe,0x88,0xe7,0xfe,0xb4,0x01,0x20,0xe9,0x57,0xa6,0x78,0x50,0xc0,0x6a,0xfe,0xc4,0xfe,0x88,0x84,0xad,0x35,0xfe,0xa7,0x05,0x9a,0x01,0x01, -0x97,0xfe,0xa4,0xeb,0xfa,0xfe,0xbd,0x28,0x38,0xa3,0x2a,0x2a,0x01,0x88,0x01,0x42,0x91,0x01,0x18,0x96,0x12,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x98,0x04,0x00,0x00,0x17,0x00,0x2d,0x40,0x16,0x16,0x13,0x0c,0x02,0x0c,0x02,0x19,0x17,0x06,0x83,0x13,0x0c,0x0c,0x09,0x95,0x10,0x16,0x03,0x16,0x95,0x00,0x0f,0x00,0x3f,0xed,0x32, -0x3f,0xed,0x32,0x2f,0x01,0x2f,0xe9,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x00,0x35,0x34,0x36,0x37,0x23,0x60,0x03,0x38,0xfe,0xe3,0x9c,0xbf,0xbd,0x93,0x44,0x7f,0x44,0x45,0x82,0x44,0xdd,0xfe,0xe7,0x72,0x5a,0xe2,0x04,0x00, -0x89,0xda,0xaf,0xa1,0xdc,0x2b,0x30,0x9c,0x29,0x1f,0x01,0x16,0xdf,0x95,0xcc,0x39,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x00,0x09,0x00,0x25,0x40,0x12,0x08,0x7e,0x01,0x07,0x07,0x0b,0x04,0x7e,0x03,0x02,0x91,0x05,0x05,0x07,0x03,0x03,0x00,0x12,0x00,0x3f,0x3f,0x33,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x33, -0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0x4a,0xfc,0x72,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0x03,0x0c,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x00,0x00,0x02,0xff,0xe5,0xfe,0x1e,0x03,0x30,0x05,0xec,0x00,0x22,0x00,0x2c,0x00,0x55,0x40,0x2c,0x00,0x08,0x84,0x12,0x23,0x20,0x12,0x0c,0x04,0x12,0x04,0x12,0x04,0x2e, -0x28,0xef,0x1a,0x07,0x17,0x96,0x04,0x03,0x2b,0x00,0x2b,0x25,0x96,0x1d,0x20,0x1d,0x20,0x2b,0x01,0x2b,0x1d,0x2b,0x1d,0x0f,0x21,0x00,0x0a,0x95,0x0f,0x1c,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x11,0x33,0x10,0xc4,0x32,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc6,0x11,0x33,0x33, -0x10,0xe9,0x32,0x31,0x30,0x01,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x07,0x22,0x07,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x03,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x16,0x3c,0x75,0x3c,0x3c,0x75,0x3c,0xac,0x3c,0x32,0x29,0x4d,0x8e, -0xba,0x15,0x0c,0x0d,0x2e,0x8d,0xa4,0x85,0x6a,0x25,0x53,0x26,0xa4,0xa4,0x04,0x8f,0x2a,0x39,0x4d,0x61,0x25,0x03,0x8b,0x1a,0x49,0x34,0xa6,0x2a,0x3f,0x17,0xfc,0x8d,0xdf,0x1a,0x93,0x13,0xc0,0xa1,0x03,0x51,0x02,0x01,0x01,0x81,0x73,0x65,0x7b,0x16,0x22,0x01,0x84,0xfd,0x6a,0xc4,0x30,0x2a,0x3a,0x36,0x00,0x01,0x00,0xbc,0xfe,0x7f, -0x06,0x00,0x05,0x9a,0x00,0x1a,0x00,0x38,0x40,0x1c,0x12,0x0c,0x7e,0x0b,0x0e,0x7f,0x10,0x0b,0x10,0x0b,0x10,0x1c,0x02,0x1a,0x7e,0x00,0x15,0x06,0x01,0x1a,0x10,0x0d,0x91,0x12,0x12,0x0b,0x01,0x03,0x00,0x3f,0x33,0x3f,0xed,0xce,0x33,0x12,0x39,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x33,0x31,0x30, -0x33,0x11,0x33,0x01,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0xbc,0xda,0x02,0xce,0x17,0x1c,0x07,0x04,0x05,0x05,0xa8,0xc0,0x9b,0xf3,0xfd,0x1e,0x1b,0x13,0x06,0x04,0x04,0x05,0x9a,0xfb,0x9b,0x23,0x30,0x0d,0x1f,0x68,0x4c,0x03,0xf2,0xfa,0xfe,0xfd,0xe7, -0x01,0x81,0x04,0x77,0x2a,0x30,0x17,0x61,0x4d,0xfb,0xf4,0x00,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x8f,0x04,0x18,0x00,0x16,0x00,0x35,0x40,0x1b,0x13,0x84,0x01,0x15,0xed,0x16,0x01,0x16,0x01,0x16,0x18,0x0b,0x08,0x84,0x09,0x0c,0x04,0x0f,0x10,0x0a,0x0f,0x08,0x15,0x16,0x13,0x01,0x15,0x00,0x3f,0xcd,0xce,0x3f,0x3f,0x3f,0xcd,0x32, -0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x11,0x23,0x04,0x02,0xae,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x97,0x8d,0x02,0x48,0x01,0x46,0xb8,0x8e,0xfd,0xb8,0x04,0x00,0xaa, -0xc2,0xd8,0xce,0xfe,0x19,0xfe,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x00,0x1b,0x00,0x3e,0x40,0x1f,0x15,0x06,0x06,0x1d,0x1a,0x01,0x7d,0x0f,0x0d,0x0c,0x14,0x15,0x15,0x17,0x91,0x12,0x01,0x0c,0x91,0x1a,0x0f,0x0f,0x12,0x04,0x07,0x06,0x06,0x04,0x91,0x09,0x13,0x00,0x3f,0xed,0x32,0x2f,0x33,0x3f,0x39,0x2f, -0x33,0xed,0x32,0x10,0xed,0x32,0x2f,0x33,0x01,0x2f,0xcd,0x33,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x21,0x16,0x00,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x03,0x23,0x35,0x33,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x02,0xa2,0xfe,0x6e,0x10,0x01,0x18,0xde,0xd8,0x9e,0x9f,0xed,0xfe,0xdc,0xfe,0x93, -0x10,0x5f,0x62,0x1d,0x01,0x91,0x01,0x2a,0xcb,0x87,0x9b,0xb9,0xe3,0xfe,0xd6,0x19,0x01,0x90,0x02,0x7d,0xe7,0xfe,0xe9,0x60,0xa3,0x54,0x01,0x6b,0x01,0x2a,0x9b,0x01,0x25,0x01,0x75,0x3b,0xb3,0x56,0xfe,0xe8,0xea,0x00,0x00,0x01,0x00,0x00,0xff,0xe8,0x03,0x62,0x04,0x18,0x00,0x1b,0x00,0x32,0x40,0x19,0x07,0x14,0x14,0x1d,0x0c,0x0f, -0x83,0x01,0x00,0x1a,0x0f,0x1a,0x95,0x0c,0x00,0x00,0x04,0x12,0x95,0x17,0x16,0x09,0x95,0x04,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xcd,0x33,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x11,0x33,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x15, -0x06,0x23,0x22,0x00,0x27,0x23,0x68,0x1f,0x01,0x15,0xd8,0x85,0x69,0x73,0x81,0x89,0xbc,0x19,0x01,0x36,0xfe,0xc3,0x09,0xbc,0x96,0x85,0x77,0x77,0xa1,0xd5,0xfe,0xf5,0x08,0x60,0x02,0x5c,0xc6,0xf6,0x32,0xa8,0x50,0xac,0x86,0x8b,0xa5,0xba,0x59,0x9c,0x47,0x01,0x0d,0xdc,0x00,0x01,0x00,0x01,0xff,0xe8,0x05,0x1a,0x05,0xb2,0x00,0x1f, -0x00,0x78,0x40,0x2b,0x19,0x19,0x00,0x00,0x0b,0x7e,0x06,0x08,0x06,0x08,0x06,0x21,0x1e,0x01,0x7e,0x13,0x10,0x19,0x19,0x1b,0x91,0x16,0x10,0x01,0x11,0x00,0x00,0x1f,0x08,0x91,0x13,0x1e,0x12,0x1f,0x12,0x11,0x1f,0x16,0x11,0xc0,0x09,0x01,0x09,0xb8,0xff,0xc0,0xb3,0x0f,0x13,0x48,0x09,0xb8,0xff,0xc0,0x40,0x0d,0x0a,0x0d,0x48,0x09, -0x09,0x16,0x04,0x0b,0x06,0x04,0x91,0x0d,0x13,0x00,0x3f,0xed,0x32,0x32,0x3f,0x39,0x2f,0x2b,0x2b,0x5d,0x39,0x12,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0xed,0x11,0x33,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x2f,0x01,0x2f,0x33,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x32,0x2f,0x32,0x2f,0x31,0x30,0x01,0x01,0x16,0x00,0x33,0x32, -0x37,0x11,0x21,0x35,0x21,0x11,0x06,0x21,0x20,0x00,0x03,0x07,0x35,0x37,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x01,0x05,0x1a,0xfb,0xf6,0x13,0x01,0x19,0xe5,0xa9,0x7a,0xfe,0xc6,0x01,0xe2,0xd9,0xfe,0xf9,0xfe,0xe7,0xfe,0x92,0x20,0x64,0x5d,0x0b,0x01,0xa2,0x01,0x3b,0xeb,0x9e,0xaf,0xed,0xe2,0xfe,0xd5,0x14,0x04, -0x08,0x03,0xe0,0xfe,0x9c,0xed,0xfe,0xf0,0x43,0x01,0x92,0x98,0xfd,0x76,0x7a,0x01,0x4c,0x01,0x0d,0x22,0x9a,0x20,0x01,0x41,0x01,0x98,0x4c,0xba,0x6e,0xfe,0xdc,0xe0,0x01,0x64,0x00,0x03,0x00,0x00,0xfe,0x1e,0x04,0x81,0x04,0x18,0x00,0x21,0x00,0x29,0x00,0x31,0x00,0x60,0x40,0x34,0x22,0x2a,0x84,0x0d,0x0b,0x00,0x0e,0x1b,0x1b,0x19, -0x1d,0x84,0x2b,0x29,0x16,0x04,0x00,0x02,0x95,0x1f,0x1b,0x17,0x0f,0x15,0x2e,0x95,0x1c,0x29,0x22,0x0b,0x04,0x0c,0x1b,0x1b,0x19,0x2a,0x0e,0x03,0x0d,0x1a,0x0d,0x0c,0x1a,0x0c,0x08,0x13,0x10,0x05,0x25,0x95,0x08,0x16,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0xed,0x32,0x3f, -0x3f,0xed,0x32,0x01,0x2f,0x33,0x33,0x33,0xf9,0x32,0xc2,0x2f,0x2f,0xc4,0x33,0xcd,0xe9,0x32,0x31,0x30,0x17,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x07,0x35,0x37,0x26,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x37,0x15,0x07,0x11,0x10,0x21,0x22,0x27,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x05,0x25, -0x26,0x26,0x23,0x22,0x06,0x15,0xa8,0xac,0x9e,0x01,0x7a,0x04,0x75,0xeb,0x96,0xd0,0x29,0x79,0x62,0x02,0xfa,0xdb,0xcf,0x64,0x04,0xa4,0x71,0x71,0xfd,0xe4,0xbe,0x8e,0x72,0x1e,0x91,0x6c,0x8a,0xad,0xfd,0x9c,0x02,0x5c,0x16,0x97,0x6b,0x99,0xab,0xf6,0x60,0x01,0x92,0x70,0xc4,0xa8,0x8e,0x29,0x8e,0x21,0x0e,0x1e,0x01,0x14,0x01,0x34, -0xa6,0x8e,0xfe,0xe9,0x27,0x8e,0x27,0xfd,0xf7,0xfd,0xcc,0x48,0x02,0xf0,0x67,0x7d,0xc4,0x99,0x53,0x45,0xd1,0x5c,0x84,0xdf,0xc5,0x00,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x17,0x00,0x1d,0x00,0x57,0x40,0x2f,0x0b,0x10,0x0d,0x09,0x0a,0x0a,0x11,0x10,0x10,0x1f,0x13,0x04,0x19,0x7e,0x17,0x01,0x15,0x0f,0x12,0x13, -0x16,0x04,0x17,0x0e,0x0e,0x0c,0x1a,0x19,0x01,0x04,0x00,0x0d,0x00,0x17,0x17,0x18,0x0b,0x04,0x0d,0x05,0x02,0x11,0x15,0x12,0x09,0x02,0x03,0x00,0x3f,0x33,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0x33,0xc6,0xed,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x33,0x11,0x39,0x31, -0x30,0x13,0x37,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x17,0x25,0x15,0x05,0x01,0x23,0x01,0x07,0x11,0x23,0x11,0x07,0x01,0x15,0x37,0x27,0x26,0x27,0x12,0xaa,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0x81,0x01,0xfb,0xfe,0x6a,0x01,0xac,0xea,0xfe,0x97,0xeb,0xa8,0xaa,0x01,0x52,0x89,0x5f,0x1e,0x08,0x01,0x7c, -0x3a,0x03,0xe4,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0x93,0xaf,0x96,0x8c,0xfe,0x1c,0x01,0xab,0x51,0xfe,0xa6,0x01,0x20,0x3a,0x01,0xdc,0xd2,0x2f,0x71,0x24,0x0e,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x18,0x00,0x54,0x40,0x2e,0x12,0x11,0x15,0x0e,0x06,0x84,0x0b,0x09,0x07,0x14,0x10,0x11, -0x11,0x03,0x02,0x01,0x04,0x05,0x08,0x04,0x09,0x00,0x00,0x13,0x16,0x15,0x0b,0x04,0x0a,0x14,0x0a,0x09,0x09,0x17,0x12,0x0e,0x14,0x05,0x07,0x10,0x0f,0x0c,0x00,0x03,0x07,0x15,0x00,0x3f,0x33,0x3f,0x3f,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0xce,0x33,0xe9, -0x32,0x32,0x11,0x39,0x31,0x30,0x01,0x05,0x01,0x23,0x01,0x07,0x15,0x23,0x35,0x07,0x35,0x37,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x17,0x25,0x05,0x37,0x27,0x23,0x03,0xea,0xfe,0xc2,0x01,0x4c,0xe6,0xfe,0xf7,0xbf,0xa4,0x80,0x80,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x4d,0x01,0xa5,0xfd,0x60,0x5c,0x58,0x04,0x01,0xc5,0x6d,0xfe,0xa8, -0x01,0x20,0x42,0xde,0xa6,0x2c,0x8e,0x2c,0x04,0xb8,0xfc,0x3f,0x01,0xd5,0xfe,0x12,0x50,0x91,0xe7,0x20,0x60,0x00,0x00,0x03,0x00,0x12,0x00,0x00,0x05,0xea,0x05,0x9a,0x00,0x13,0x00,0x1c,0x00,0x26,0x00,0x58,0x40,0x31,0x0c,0x08,0x0a,0x0a,0x08,0x7e,0x25,0x07,0x07,0x28,0x18,0x04,0x11,0x7e,0x02,0x00,0x12,0x0c,0x25,0x26,0x0f,0x10, -0x13,0x06,0x00,0x0b,0x0b,0x06,0x09,0x01,0x0a,0x01,0x00,0x20,0x00,0x02,0x18,0x19,0x05,0x0a,0x14,0x08,0x03,0x0e,0x12,0x12,0x07,0x03,0x03,0x00,0x3f,0x33,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0xce,0x33,0xe9,0x32,0x32,0x12,0x39,0x2f,0x33,0xf9,0xca,0x2f,0x11,0x33,0x31,0x30, -0x13,0x35,0x37,0x11,0x33,0x01,0x25,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x23,0x01,0x05,0x11,0x23,0x11,0x13,0x16,0x16,0x15,0x11,0x25,0x03,0x26,0x27,0x01,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x05,0x12,0xaa,0xda,0x01,0x90,0x01,0x72,0xa8,0xaa,0xaa,0xce,0xfe,0x6a,0xfe,0x88,0xa8,0xa0,0x04,0x04,0x01,0x26,0xfa,0x1b,0x13,0x03, -0x02,0x17,0x1c,0x07,0x04,0x05,0x05,0xfe,0xde,0x01,0x82,0x9a,0x3a,0x03,0x44,0xfd,0x8e,0x7e,0x01,0xf4,0xfe,0x45,0x3a,0x9a,0x3a,0xfc,0xbb,0x02,0x75,0x80,0xfe,0x0b,0x01,0xbc,0x03,0x15,0x17,0x61,0x4d,0xfe,0x83,0x64,0x01,0x84,0x2a,0x30,0xfc,0x64,0x23,0x30,0x0d,0x1f,0x68,0x4c,0x01,0x64,0x63,0x00,0x00,0x02,0x00,0x19,0x00,0x00, -0x04,0x86,0x04,0x18,0x00,0x15,0x00,0x1c,0x00,0x55,0x40,0x2e,0x17,0x0d,0x06,0x84,0x0b,0x09,0x07,0x14,0x02,0x00,0x00,0x02,0x84,0x18,0x03,0x0f,0x1a,0x95,0x01,0x04,0x05,0x03,0x09,0x00,0x00,0x14,0x18,0x17,0x0b,0x04,0x0a,0x15,0x0a,0x09,0x09,0x08,0x15,0x03,0x06,0x11,0x10,0x0d,0x0f,0x03,0x06,0x15,0x00,0x3f,0x33,0x3f,0x3f,0x12, -0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0xed,0x32,0x01,0x2f,0x33,0xf9,0xca,0x2f,0x11,0x33,0x2f,0xce,0x33,0xe9,0x32,0x32,0x31,0x30,0x01,0x07,0x11,0x23,0x11,0x05,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x37,0x05,0x15,0x25,0x26,0x23,0x22,0x06,0x04,0x86,0x8e,0xa4, -0xfd,0xf6,0xa4,0x8d,0x8d,0xa4,0x04,0x74,0xdc,0x93,0xad,0x14,0x94,0xfc,0xc4,0x02,0x05,0x1d,0xcc,0x7a,0xa2,0x02,0x78,0x30,0xfd,0xb8,0x02,0x10,0xb4,0xfe,0xa4,0x01,0x23,0x30,0x8e,0x30,0x02,0x4f,0xaa,0xc2,0xa6,0x9e,0x32,0xbe,0x5e,0xb2,0xf2,0xb8,0x00,0x03,0x00,0x12,0x00,0x00,0x04,0xc0,0x05,0x9a,0x00,0x1d,0x00,0x24,0x00,0x2a, -0x00,0x65,0x40,0x35,0x0f,0x22,0x1c,0x15,0x14,0x09,0x09,0x14,0x14,0x2c,0x07,0x0c,0x27,0x23,0x26,0x1e,0x1b,0x7e,0x02,0x00,0x1c,0x0a,0x23,0x24,0x1d,0x04,0x00,0x09,0x09,0x07,0x27,0x26,0x02,0x04,0x01,0x08,0x01,0x00,0x0f,0x1e,0x91,0x08,0x00,0x1a,0x1a,0x03,0x15,0x1b,0x12,0x25,0x91,0x03,0x03,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39, -0x2f,0x39,0x39,0xed,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x2f,0x33,0xc1,0x32,0x11,0x33,0x2f,0x33,0x2f,0x11,0x33,0x12,0x39,0x39,0x31,0x30,0x13,0x35,0x37,0x11,0x21,0x32,0x16,0x17,0x37,0x15,0x07,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x01,0x23,0x03,0x26,0x26, -0x23,0x23,0x11,0x23,0x11,0x17,0x33,0x32,0x36,0x35,0x35,0x05,0x11,0x11,0x25,0x26,0x26,0x23,0x12,0xaa,0x01,0xac,0x84,0xcd,0x35,0xbc,0x91,0x03,0xa7,0x97,0x2f,0x4d,0x59,0x01,0x0d,0xc8,0xf0,0x47,0x7b,0x58,0x8a,0xa8,0xa8,0xe4,0x81,0xa3,0xfd,0xf8,0x01,0xdb,0x23,0x7b,0x57,0x02,0xf4,0x9a,0x3a,0x01,0xd2,0x5d,0x5f,0x40,0x9a,0x31, -0x1b,0x1c,0x90,0xcb,0x27,0x04,0x15,0x44,0x8e,0xfe,0x51,0x01,0x92,0x79,0x57,0xfd,0x9e,0x03,0x2e,0x34,0x97,0x7d,0x0a,0xb1,0x01,0x9b,0xfe,0xff,0xa1,0x2f,0x31,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x17,0x00,0x48,0x40,0x23,0x17,0x11,0x11,0x19,0x16,0x09,0x02,0x84,0x07,0x05,0x03,0x11,0x11,0x0b,0x13,0x0e, -0x10,0x04,0x01,0x05,0x00,0x00,0x07,0x16,0x06,0x17,0x06,0x05,0x17,0x05,0x03,0x08,0x0f,0x03,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x3f,0xcd,0x32,0x32,0x2f,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x05,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33, -0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x25,0x02,0xa4,0xfe,0xa6,0xa4,0x83,0x83,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24,0x2c,0x50,0x69,0x8d,0x01,0x5a,0x02,0x20,0xa1,0xfe,0x81,0x01,0x33,0x3c,0x92,0x3c,0x02,0x3b,0xd3,0x6e,0x77,0x0e,0xaa,0x21,0xc5,0xa5,0xa1,0x00,0x00,0x01,0x00,0x45,0xff,0xe8,0x04,0x06, -0x05,0xb2,0x00,0x2a,0x00,0x5b,0x40,0x31,0x0f,0x7d,0x00,0x04,0x15,0x15,0x19,0x7d,0x26,0x04,0x26,0x0a,0x0a,0x26,0x04,0x03,0x2c,0x20,0x1f,0x20,0x29,0x16,0x2a,0x15,0x15,0x01,0x13,0x00,0x14,0x00,0x2a,0x26,0x19,0x2a,0x14,0x04,0x0f,0x06,0x07,0x23,0x91,0x1c,0x13,0x09,0x0a,0x0c,0x91,0x07,0x04,0x00,0x3f,0xed,0xcd,0x32,0x3f,0xed, -0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xc4,0x32,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xf9,0xc2,0x2f,0x10,0xc6,0xe9,0x31,0x30,0x13,0x25,0x26,0x26,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x25,0x15,0x05,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x26, -0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x05,0x45,0x01,0x2b,0x86,0x6f,0x01,0x1b,0xd7,0xd3,0x62,0x7f,0xc7,0x8a,0xa7,0x54,0x8e,0x3f,0x01,0xba,0xfe,0xf0,0x7b,0x6d,0xfe,0xf2,0xf0,0x52,0xe2,0x33,0x40,0xe2,0x5f,0x9c,0x98,0x62,0xaf,0xfe,0x28,0x02,0x6f,0x66,0x4d,0xa4,0x6d,0xae,0xd1,0x33,0xbd,0x58,0x74,0x64,0x4d, -0x68,0x4d,0x1f,0x97,0x96,0x5d,0x4f,0xa8,0x64,0xba,0xc8,0x2f,0x23,0xc6,0x39,0x48,0x72,0x6d,0x4a,0x79,0x59,0xa1,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x2b,0x04,0x18,0x00,0x27,0x00,0x63,0x40,0x35,0x26,0x01,0x04,0x22,0x83,0x13,0x17,0x04,0x83,0x0e,0x27,0x1d,0x14,0x11,0x0e,0x17,0x0e,0x1d,0x1d,0x0e,0x17,0x03,0x29,0x09,0x1d,0x1f, -0x95,0x11,0x01,0x12,0x00,0x00,0x14,0x26,0x13,0x27,0x13,0x12,0x0e,0x04,0x12,0x27,0x17,0x22,0x06,0x07,0x1a,0x10,0x0a,0x0c,0x95,0x07,0x16,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xfd,0xc6,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x10,0xc6,0x10,0xe9,0x10, -0xc6,0xe9,0x11,0x39,0x39,0x31,0x30,0x01,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x35,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x25,0x03,0x2b,0x9e,0x3f,0x43,0xe2,0xb3,0x9f,0x73,0x85,0xa2,0xd8,0x41,0x68,0xfe,0xa2,0xa7, -0x53,0x4a,0xe2,0xa6,0x86,0x68,0x71,0x93,0x5b,0x6f,0x41,0x39,0x51,0x01,0x4e,0x02,0x2a,0x37,0x27,0x6a,0x50,0x89,0xa1,0x3d,0xb0,0x63,0x90,0x33,0x4d,0x2a,0x78,0x8e,0x39,0x2d,0x74,0x54,0x84,0xa4,0x2e,0xa6,0x4a,0x50,0x40,0x3b,0x45,0x18,0x21,0x73,0x00,0x01,0xff,0xac,0x00,0x00,0x05,0x44,0x05,0x9a,0x00,0x17,0x00,0x39,0x40,0x1e, -0x17,0x7e,0x14,0x00,0x00,0x04,0x19,0x09,0x7e,0x0e,0x13,0x03,0x7e,0x04,0x15,0x03,0x02,0x91,0x13,0x0b,0x0b,0x04,0x06,0x91,0x11,0x03,0x04,0x12,0x00,0x12,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x2f,0xed,0x3f,0x01,0x2f,0xed,0x32,0xd4,0xe9,0x11,0x12,0x39,0x2f,0x33,0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x23,0x11,0x23,0x22,0x06, -0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0x9c,0xfd,0x1a,0xa8,0x18,0x51,0x59,0x14,0x9e,0x16,0xc8,0x9a,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0xfd,0x72,0x05,0x02,0x5c,0x4e,0x36,0x34,0x36,0x44,0x88,0xaa,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x00,0x02,0x00,0x19,0x02,0x9a,0x03,0x4b,0x05,0x9a,0x00,0x13, -0x00,0x17,0x00,0x5d,0xb3,0x0a,0x0a,0x08,0x0c,0xb8,0x01,0x0c,0xb7,0x14,0x05,0x0d,0x0d,0x19,0x17,0x04,0x10,0xb8,0x01,0x0c,0xb3,0x13,0x01,0x11,0x0f,0xb8,0x01,0x0e,0x40,0x0a,0x30,0x17,0x40,0x17,0x02,0x17,0x17,0x00,0x0d,0x11,0xb8,0x01,0x0a,0xb2,0x16,0x0b,0x13,0xb8,0x01,0x0e,0xb4,0x08,0x04,0x00,0x06,0x02,0xb8,0x01,0x06,0x00, -0x3f,0x33,0xde,0x32,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x5d,0xed,0x01,0x2f,0x33,0xce,0xe1,0x32,0x32,0x12,0x39,0x2f,0x33,0x33,0xf1,0x32,0xca,0x2f,0x31,0x30,0x13,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x05,0x35,0x21,0x15,0x19,0x62,0x83,0x01,0x68,0x84,0x61, -0x61,0x84,0xfe,0x98,0x83,0x62,0x02,0x4d,0xfe,0x98,0x05,0x2b,0x6f,0x6f,0x6f,0x6f,0x70,0xfd,0xdf,0x01,0x4e,0xfe,0xb2,0x02,0x21,0x63,0x63,0x63,0x00,0x03,0x00,0x3e,0x02,0x89,0x03,0xf6,0x04,0xcf,0x00,0x1f,0x00,0x2b,0x00,0x30,0x00,0x7a,0xb3,0x15,0x02,0x30,0x0b,0xb8,0x01,0x0c,0xb2,0x22,0x0f,0x0a,0xb8,0x01,0x0c,0xb6,0x2c,0x22, -0x2c,0x22,0x2c,0x32,0x28,0xb8,0x01,0x0c,0xb2,0x1c,0x02,0x25,0xbb,0x01,0x0d,0x00,0x1f,0x00,0x0b,0x01,0x0d,0x40,0x0e,0x0c,0x30,0x1c,0x30,0x2c,0x30,0x03,0x30,0x0f,0x30,0x0f,0x1f,0x0d,0x2e,0x41,0x0d,0x01,0x0d,0x00,0x06,0x00,0x1f,0x01,0x09,0x00,0x15,0x00,0x2b,0x01,0x0d,0x00,0x19,0x00,0x0d,0x01,0x0d,0x00,0x12,0x00,0x19,0x01, -0x0b,0x00,0x3f,0xd4,0xed,0x10,0xed,0x32,0x3f,0xd4,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc6,0x10,0xed,0x32,0x39,0x39,0x31,0x30,0x00,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x23,0x06, -0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x12,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x25,0x26,0x23,0x22,0x07,0x01,0x9f,0x71,0x2b,0x04,0x23,0x6a,0x37,0x71,0x82,0xfe,0x87,0x0b,0x99,0x5b,0x4f,0x48,0x78,0x3b,0x6c,0x29,0x04,0x26,0x71,0x48,0x7f,0x9b,0xa0,0x86,0x43,0x57,0x57,0x49,0x49,0x57,0x58,0x48,0x02,0x1d, -0x02,0x78,0x78,0x0c,0x04,0xcf,0x2c,0x3c,0x36,0x32,0x92,0x7b,0x43,0x8f,0x35,0x6f,0x2d,0x2a,0x3c,0x30,0x36,0x9d,0x80,0x85,0xa4,0xfe,0x25,0x61,0x57,0x58,0x60,0x61,0x57,0x57,0x61,0xee,0x8a,0x8a,0x00,0x01,0x00,0x90,0xff,0xe8,0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x3b,0x40,0x1f,0x1b,0x0b,0x84,0x08,0x08,0x1f,0x14,0x12,0x84,0x11, -0x11,0x21,0x02,0x84,0x1f,0x1b,0x05,0x95,0x1d,0x16,0x15,0x0d,0x95,0x18,0x16,0x14,0x15,0x11,0x01,0x09,0x0f,0x00,0x3f,0x33,0x33,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xed,0x33,0x12,0x39,0x2f,0xe9,0x33,0x31,0x30,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35, -0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x90,0xa4,0x67,0x7e,0x68,0x94,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6e,0xd0,0x6b,0x9a,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xa8,0x9a,0xc1,0x85,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb4,0x92,0x02,0x48,0xfc,0x00,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1, -0x00,0x01,0x00,0x54,0x00,0x00,0x03,0x2c,0x05,0x9a,0x00,0x09,0x00,0x29,0x40,0x14,0x02,0x7e,0x03,0x06,0x03,0x06,0x03,0x0b,0x09,0x04,0x91,0x07,0x07,0x00,0x03,0x12,0x08,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x13,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11, -0x21,0x54,0x02,0xd8,0xa8,0xfd,0xfa,0x02,0x06,0xfd,0xd0,0x05,0x9a,0xfa,0x66,0x02,0x7b,0x97,0x01,0xf0,0x00,0x02,0x00,0x52,0x00,0x00,0x03,0xbf,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x28,0x40,0x14,0x11,0x08,0x7e,0x09,0x09,0x14,0x0d,0x7d,0x03,0x0a,0x91,0x11,0x11,0x06,0x09,0x12,0x12,0x91,0x06,0x03,0x00,0x3f,0xed,0x3f,0x12,0x39, -0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x33,0x31,0x30,0x01,0x22,0x00,0x35,0x34,0x36,0x33,0x21,0x11,0x23,0x11,0x03,0x20,0x11,0x14,0x16,0x33,0x33,0x11,0x02,0x5a,0xf0,0xfe,0xe8,0xff,0xe4,0x01,0x8a,0xa8,0xc5,0xfe,0xb0,0xb6,0xaf,0xb0,0x02,0x1e,0x01,0x05,0xcb,0xcd,0xdf,0xfa,0x66,0x02,0x1e,0x02,0xe4,0xfe,0xe4,0x92,0x9e, -0x02,0x4c,0x00,0x01,0x00,0xbd,0x00,0x00,0x06,0x73,0x05,0x9a,0x00,0x1e,0x00,0x30,0x40,0x18,0x15,0x13,0x7e,0x05,0x00,0x0d,0x12,0x12,0x20,0x1d,0x01,0x7e,0x00,0x0d,0x06,0x18,0x03,0x15,0x1d,0x12,0x12,0x09,0x00,0x03,0x00,0x3f,0x32,0x32,0x3f,0x33,0x17,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0x39,0x12,0x39,0xe9,0x33,0x31,0x30, -0x13,0x33,0x11,0x14,0x06,0x07,0x33,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x11,0x23,0x01,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0xbd,0xa7,0x07,0x07,0x04,0x18,0x13,0x01,0xea,0x52,0x01,0xe9,0x14,0x17,0x04,0x04,0x04,0xa2,0xde,0xfe,0x48,0x33,0x0f,0x06,0x16,0x22,0x0d,0xfe,0x3f,0xd2,0x05,0x9a,0xfc, -0x3e,0x39,0x8b,0x53,0x63,0x28,0x04,0x4e,0xfb,0xba,0x2e,0x65,0x2b,0x8b,0x63,0x03,0xc0,0xfa,0x66,0x03,0xe8,0x74,0x38,0x3c,0x57,0x1d,0xfc,0x1c,0x00,0x01,0x00,0xbc,0xfe,0x29,0x01,0x64,0x05,0x9a,0x00,0x03,0x00,0x17,0x40,0x0a,0x00,0x7e,0x01,0x01,0x04,0x05,0x02,0x03,0x01,0x1b,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xe9,0x31, -0x30,0x01,0x23,0x11,0x33,0x01,0x64,0xa8,0xa8,0xfe,0x29,0x07,0x71,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x09,0x12,0x05,0x9a,0x00,0x27,0x00,0x48,0x40,0x25,0x0c,0x0b,0x04,0x00,0x0f,0x15,0x14,0x24,0x1f,0x1e,0x18,0x18,0x24,0x0f,0x04,0x04,0x0a,0x1d,0x1d,0x29,0x27,0x10,0x0a,0x0f,0x18,0x04,0x23,0x04,0x09,0x1c,0x14,0x0b,0x03,0x1f, -0x00,0x09,0x12,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x2f,0x33,0x11,0x33,0x2f,0x12,0x17,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x11,0x33,0x33,0x31,0x30,0x21,0x01,0x27,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37, -0x01,0x33,0x01,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x03,0x70,0xfe,0xcc,0x13,0x0a,0x03,0x04,0x03,0x12,0x0a,0xfe,0xd7,0xb6,0x01,0xb2,0xb9,0x01,0x31,0x13,0x05,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x04,0x17,0x01,0x25,0xb6,0xfe,0x6b,0xc5,0xfe,0xd9,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0x04, -0x1a,0x46,0x23,0x25,0x25,0x46,0x23,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x34,0x56,0x04,0x50,0xfa,0x66,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x06,0xd7,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00, -0x01,0x07,0x02,0x3a,0x04,0x37,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x11,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x50,0xff,0xeb,0x06,0xd4,0x05,0xb0,0x00,0x27,0x0c,0xea,0x04,0x2e,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x06,0x00,0xf0,0x00,0x00,0x00,0x09,0xb3,0x01,0x00,0x1f,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff, -0x00,0x4a,0xff,0xec,0x09,0x19,0x05,0xb0,0x00,0x26,0x00,0xf0,0xfa,0x00,0x00,0x27,0x00,0xf0,0x04,0x00,0xfd,0xb9,0x00,0x27,0x0c,0xe1,0x06,0x74,0x00,0x00,0x01,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0x00,0x0e,0xb6,0x03,0x02,0x1a,0x2d,0x01,0x0d,0x2c,0x00,0x3f,0x35,0x3f,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xa3,0x05,0xb0, -0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x02,0x39,0x04,0x19,0xfd,0xb9,0x01,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0x00,0x07,0xb2,0x01,0x30,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x8d,0xff,0xec,0x06,0xe5,0x05,0xae,0x00,0x26,0x00,0xf1,0x25,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x5b,0xfd,0xb9, -0x00,0x07,0xb2,0x02,0x47,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x06,0xe5,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x5b,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x48,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x2f,0xff,0xec,0x06,0xa3,0x05,0x9a,0x00,0x26, -0x02,0x38,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x19,0xfd,0xb9,0x00,0x07,0xb2,0x03,0x39,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xb3,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x0c,0xe7,0x04,0x0d,0x00,0x00,0x00,0x09, -0xb3,0x03,0x02,0x2b,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x7b,0xff,0xec,0x06,0xed,0x05,0x9e,0x00,0x26,0x02,0x39,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xf9,0x00,0x00,0x01,0x07,0x0c,0xe7,0x04,0x47,0x00,0x00,0x00,0x09,0xb3,0x03,0x02,0x43,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x05,0x71,0x05,0xb0, -0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0x27,0x00,0x00,0xff,0xff, -0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x05,0x12,0x05,0xd9,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x07,0x00,0x4c,0x03,0xac,0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x02,0x05,0xd9,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x27,0x00,0x4c,0x03,0xac,0x00,0x00,0x00,0x07, -0x00,0x4c,0x05,0x9c,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x02,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x02,0x06,0x00,0x47,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x04,0x18, -0x02,0x06,0x00,0x50,0x00,0x00,0x00,0x03,0x00,0x5e,0x00,0x00,0x07,0xde,0x05,0x9a,0x00,0x0f,0x00,0x19,0x00,0x23,0x00,0x2d,0x40,0x17,0x11,0x7e,0x22,0x22,0x05,0x0a,0x7d,0x17,0x17,0x25,0x1c,0x7d,0x05,0x10,0x23,0x91,0x07,0x03,0x11,0x22,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12, -0x39,0x2f,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x1e,0x02,0x33,0x33,0x11,0x03,0x64,0xaa,0xfe,0xe4,0xce,0x72,0x02,0xf6,0x01,0x94,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0x66,0x68,0x8b,0xdd,0x9a,0x52,0xfd, -0xb6,0xfe,0x74,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0x68,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0xfb,0x96,0x4c,0x93,0xd8,0x8c,0x02,0x27,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x04,0x6a,0x00,0x03,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x09,0x00,0x20,0x00,0x2b,0x00,0x41,0x40,0x22,0x11,0x7e, -0x24,0x24,0x00,0x04,0x7d,0x1e,0x1e,0x2d,0x2b,0x0b,0x18,0x7e,0x00,0x2a,0x92,0x0b,0x2b,0x92,0x17,0x0b,0x17,0x0b,0x17,0x00,0x0a,0x91,0x01,0x03,0x18,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xe9,0x32,0x32,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x31,0x30,0x33,0x11,0x21, -0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x03,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0xbc,0x01,0x8c,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0xd4,0x5a,0x65,0xa1,0x6f,0x3b,0x3a,0x6f,0xa0,0x65,0x5c,0xd6,0x8b,0xdd,0x9a,0x52,0xfd, -0xb6,0x83,0x78,0x89,0x24,0x44,0x60,0x3c,0x5a,0x05,0x9a,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0x9d,0x30,0x61,0x95,0x65,0x65,0x9d,0x6b,0x38,0x9d,0x4c,0x93,0xd8,0x8c,0x02,0x27,0xfc,0xba,0x8b,0x93,0x49,0x64,0x3d,0x1a,0xfd,0xde,0x00,0x05,0x00,0x5e,0x00,0x00,0x07,0xde,0x05,0x9a,0x00,0x0f,0x00,0x26,0x00,0x3d,0x00,0x48, -0x00,0x53,0x00,0x6b,0x40,0x39,0x45,0x7e,0x20,0x53,0x30,0x3d,0x7e,0x19,0x3e,0x26,0x19,0x36,0x7e,0x4c,0x20,0x19,0x4c,0x4c,0x19,0x20,0x03,0x05,0x0a,0x7d,0x2c,0x2c,0x55,0x13,0x7d,0x05,0x52,0x3f,0x92,0x26,0x30,0x26,0x53,0x3e,0x92,0x1a,0x3c,0x1a,0x26,0x1a,0x26,0x1a,0x00,0x2f,0x10,0x91,0x07,0x03,0x3d,0x19,0x91,0x00,0x12,0x00, -0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x33,0x10,0xe9,0x32,0x32,0x10,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x01, -0x23,0x20,0x11,0x14,0x1e,0x02,0x33,0x33,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x01,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x03,0x64,0xaa,0xfe,0xe4, -0xce,0x72,0x02,0xf6,0x01,0x94,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0xfe,0xf2,0x72,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0x68,0x5c,0x65,0xa0,0x6f,0x3a,0x3b,0x6f,0xa1,0x65,0x5a,0x01,0x10,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0x72,0x5a,0x65,0xa1,0x6f,0x3b,0x3a,0x6f,0xa0,0x65,0x5c,0xa8,0x5a,0x3c,0x60,0x44,0x24,0x89,0x78,0x01,0x62,0x78,0x89, -0x24,0x44,0x60,0x3c,0x5a,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x9d,0x38,0x6b,0x9d,0x65,0x65,0x95,0x61,0x30,0xfc,0x33,0x4c,0x93,0xd8,0x8c,0x02,0x27,0x9d,0x30,0x61,0x95,0x65,0x65,0x9d,0x6b,0x38,0x9d,0x01,0x24,0x02,0x22,0x1a,0x3d,0x64,0x49,0x93,0x8b, -0x8b,0x93,0x49,0x64,0x3d,0x1a,0xfd,0xde,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x00,0x19,0x00,0x2f,0x40,0x18,0x06,0x7d,0x13,0x13,0x1b,0x0d,0x19,0x0c,0x2f,0x0d,0x01,0x0d,0x0d,0x0f,0x91,0x0a,0x13,0x00,0x19,0x19,0x17,0x91,0x02,0x04,0x00,0x3f,0xed,0x32,0x2f,0x33,0x3f,0xed,0x32,0x2f,0x5d,0x33,0x01,0x2f,0x33,0x12, -0x39,0x2f,0xe9,0x31,0x30,0x13,0x36,0x33,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x11,0x10,0x27,0x26,0x23,0x22,0x07,0x68,0x9f,0xed,0x01,0x31,0xb9,0xb8,0xcf,0xcf,0xfe,0xc2,0xcb,0x87,0x9b,0xb9,0xf6,0x9b,0x99,0x8f,0x90,0xe9,0xd9,0x9d,0x05,0x5e,0x54,0xc5,0xc4,0xfe,0xbf,0xfe,0xa7,0xd3, -0xd4,0x3b,0xb3,0x56,0xa5,0xa5,0x01,0x14,0x01,0x05,0x9d,0x9b,0x60,0x00,0x00,0x01,0x00,0x5e,0xfe,0x7f,0x04,0x8c,0x05,0xb2,0x00,0x20,0x00,0x38,0x40,0x1e,0x1c,0x7f,0x1f,0x0d,0x1f,0x0d,0x22,0x14,0x7d,0x05,0x0c,0x30,0x0d,0x01,0x0d,0x0d,0x0f,0x91,0x0a,0x04,0x20,0x1c,0x01,0x1c,0x1c,0x19,0x91,0x1e,0x00,0x13,0x00,0x3f,0xce,0xed, -0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x33,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x23,0x11,0x06,0x03,0x00,0xa1,0xfb,0xac,0x5a,0x6b,0xc2,0x01,0x0d,0xa2,0xcb,0x87, -0x9b,0xb9,0x87,0xcf,0x8c,0x48,0x47,0x87,0xc0,0x7a,0x6b,0xba,0x51,0x9b,0x6e,0x18,0x70,0xc2,0x01,0x04,0x94,0xa6,0x01,0x1a,0xcd,0x73,0x3b,0xb3,0x56,0x61,0xa6,0xdc,0x7b,0x7a,0xd1,0x9a,0x58,0x2f,0x32,0xfd,0x9f,0x01,0x83,0x1a,0x00,0x01,0x01,0x05,0xff,0xcc,0x05,0x57,0x05,0xc6,0x00,0x08,0x00,0x24,0x40,0x0f,0x03,0x08,0x01,0x07, -0x07,0x0a,0x05,0x07,0x00,0x06,0x06,0x03,0x01,0x05,0x03,0x00,0x2f,0xdd,0xc4,0x12,0x39,0x11,0x33,0x2f,0x01,0x2f,0x12,0x39,0x2f,0x39,0xc9,0x39,0x31,0x30,0x01,0x01,0x11,0x01,0x01,0x11,0x01,0x11,0x21,0x03,0xb1,0x01,0xa6,0xfd,0xd7,0xfd,0xd7,0x01,0xa8,0x01,0x04,0x01,0x66,0x01,0x70,0xfe,0xd7,0xfe,0x1f,0x01,0xe1,0x01,0x29,0xfe, -0x90,0x04,0x60,0x00,0x00,0x04,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x09,0x00,0x20,0x00,0x36,0x00,0x3f,0x00,0x65,0x40,0x18,0x2f,0x7f,0x3a,0x11,0x7e,0x26,0x3a,0x26,0x3a,0x26,0x00,0x04,0x7d,0x1e,0x1e,0x41,0x3f,0x36,0x2b,0x0b,0x18,0x7e,0x00,0x3e,0xb8,0x01,0x05,0xb4,0x2b,0x2a,0x92,0x0b,0x3f,0xb8,0x01,0x05,0x40,0x14, -0x35,0x36,0x92,0x17,0x40,0x0b,0x01,0x0b,0x17,0x0b,0x17,0x00,0x0a,0x91,0x01,0x03,0x18,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xfd,0xd6,0xed,0x10,0xfd,0xd6,0xed,0x01,0x2f,0xe9,0x32,0x32,0x32,0x32,0x12,0x39,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x33,0x11,0x21, -0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0xbc,0x01,0x8c,0x02,0xf6,0x72,0xce,0xfe, -0xe4,0xaa,0xd4,0x8c,0x7d,0xc6,0x89,0x48,0x48,0x89,0xc5,0x7c,0x8e,0xd6,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0x54,0x61,0x8b,0x5a,0x2a,0xb1,0xbf,0x8c,0x3c,0x9f,0xa8,0x30,0x56,0x77,0x48,0x3e,0x3c,0x5b,0x57,0x56,0x5c,0x3c,0x05,0x9a,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0x53,0x35,0x71,0xb2,0x7c,0x73,0xb5,0x7e,0x42,0x5b,0x4c, -0x93,0xd8,0x8c,0x02,0x27,0xfc,0x6e,0x3a,0x64,0x83,0x4a,0xa8,0xaf,0x4b,0x7c,0x90,0x50,0x6e,0x44,0x1e,0x4b,0xba,0x52,0x5f,0x55,0x48,0xfe,0xb2,0x00,0x07,0x00,0x5e,0x00,0x00,0x08,0xba,0x05,0x9a,0x00,0x0f,0x00,0x26,0x00,0x3d,0x00,0x53,0x00,0x69,0x00,0x72,0x00,0x7b,0x00,0x95,0x40,0x2c,0x4e,0x7e,0x2c,0x78,0x7f,0x45,0x72,0x69, -0x5e,0x19,0x26,0x7e,0x3c,0x73,0x49,0x3e,0x32,0x3c,0x62,0x7f,0x6d,0x1f,0x7e,0x59,0x2c,0x45,0x3c,0x6d,0x59,0x59,0x6d,0x3c,0x45,0x2c,0x05,0x05,0x0a,0x7d,0x15,0x36,0x7d,0x05,0x71,0x74,0xb8,0x01,0x05,0x40,0x13,0x5e,0x49,0x5d,0x4a,0x92,0x19,0x20,0x32,0x30,0x32,0x02,0x32,0x18,0x33,0x91,0x07,0x03,0x72,0x73,0xb8,0x01,0x05,0x40, -0x0f,0x68,0x3f,0x69,0x3e,0x92,0x25,0x2f,0x3d,0x01,0x3d,0x26,0x3c,0x91,0x00,0x12,0x00,0x3f,0xfd,0x32,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0x32,0xed,0x32,0x3f,0xfd,0x32,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0x32,0xed,0x32,0x01,0x2f,0xe9,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x11,0x33,0x33,0x33,0x33,0x10, -0xe9,0x32,0x32,0x32,0x32,0x10,0xe9,0x10,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x37,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x25,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x23,0x20,0x11,0x14,0x1e,0x02, -0x33,0x33,0x3d,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x64,0xaa,0xfe, -0xe4,0xce,0x72,0x02,0xf6,0x02,0x70,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0x02,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0xe0,0x8c,0x7d,0xc6,0x89,0x48,0x48,0x89,0xc5,0x7c,0x8e,0xfe,0xca,0x7d,0xc4,0x89,0x48,0x48,0x89,0xc6,0x7d,0x8c,0xe0,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0xd6,0x3e,0x48,0x77,0x56,0x30,0xa8,0x9f,0x3c,0x8c,0xbf,0xb1,0x2a,0x5a, -0x8b,0x61,0x01,0xc0,0x61,0x8b,0x5a,0x2a,0xb1,0xbf,0x8c,0x3c,0x9f,0xa8,0x30,0x56,0x77,0x48,0x3e,0x3c,0x5b,0x57,0x56,0x5c,0x3c,0xa8,0x3c,0x5c,0x56,0x56,0x5c,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x98,0x4c,0x93,0xd8,0x8c,0x02,0x27,0x53,0x35,0x71,0xb2,0x7c,0x73,0xb5,0x7e,0x42,0x5b,0x5b,0x42, -0x7e,0xb5,0x73,0x7c,0xb2,0x71,0x35,0x53,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x5b,0x7d,0x4b,0x1e,0x44,0x6e,0x50,0x90,0x7c,0x4b,0xaf,0xa8,0x4a,0x83,0x64,0x3a,0x3a,0x64,0x83,0x4a,0xa8,0xaf,0x4b,0x7c,0x90,0x50,0x6e,0x44,0x1e,0x4b,0xba,0x52,0x5f,0x55,0x48,0xfe,0xb2,0x01,0x4e,0x48,0x55,0x5f,0x52,0x00,0xff,0xff,0x00,0x48,0xff,0xec, -0x06,0xd9,0x05,0xae,0x00,0x27,0x00,0xbc,0x03,0x03,0x00,0x00,0x00,0x27,0x00,0xf2,0x04,0x4b,0xfd,0xb9,0x01,0x06,0x08,0x8d,0x00,0x00,0x00,0x07,0xb2,0x01,0x23,0x2d,0x00,0x3f,0x35,0x00,0x00,0x01,0x00,0x00,0x01,0x46,0x04,0x27,0x01,0xb6,0x00,0x03,0x00,0x0e,0xb4,0x01,0x00,0x01,0x52,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30, -0x01,0x21,0x35,0x21,0x04,0x27,0xfb,0xd9,0x04,0x27,0x01,0x46,0x70,0x00,0x00,0x02,0x00,0xab,0xfe,0x0a,0x07,0x59,0x03,0x0f,0x00,0x2e,0x00,0x35,0x00,0x00,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03, -0x33,0x32,0x3e,0x02,0x35,0x11,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x06,0x9f,0x0c,0x27,0x49,0x3e,0x16,0x61,0x70,0x20,0x04,0x2c,0x80,0x9d,0xb4,0x60,0x88,0xe1,0xb5,0x88,0x30,0x40,0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1d,0x5c,0x92,0xd1,0x93,0x80,0xc0,0x7f,0x3f,0xfd,0x6c,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x03,0x0f,0xfe,0x89, -0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x35,0x19,0x05,0x04,0x15,0x2c,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0xfa,0xfb,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x02,0xff,0xba,0xfe,0x0a,0x02,0xac,0x03,0x0f,0x00,0x1f,0x00,0x26,0x00,0x00,0x01,0x14, -0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x03,0x33,0x17,0x37,0x33,0x03,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0xa9,0xec,0x7d,0xab, -0xa8,0x79,0xe6,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0xfa,0xfb,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x02,0x00,0xab,0xfe,0x0a,0x06,0x9f,0x03,0x0f,0x00,0x25,0x00,0x2c,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35, -0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x01,0x62,0x09,0x11,0x1e,0x30,0x1d,0x5c,0x91,0xd2,0x93,0x80,0xc0,0x7f,0x3f,0x9c,0x33,0x5d,0x81,0x9a,0xaf,0x5d,0x86,0xde,0xb3,0x87,0x30,0x3f,0x30,0x12,0x0b,0x02,0xa7,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x02, -0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0xfe,0x4b,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x03,0x15,0x2d,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0xfb,0xab,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x02,0xff,0xba,0xfe,0x0a,0x02,0xa6,0x03,0x0f,0x00,0x16,0x00,0x1d,0x00,0x00,0x37,0x32,0x3e,0x02, -0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x49,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20, -0x20,0x33,0xfd,0x71,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xb2,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x00,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36, -0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe, -0xf9,0xb9,0xb9,0xfe,0xe9,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x0e,0xb5,0x03,0x7e,0xb5,0xb5,0xb5,0x00,0x04, -0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xb2,0x00,0x40,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x00,0x01,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33, -0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0x22,0x40,0x1e,0x05,0x26,0x46,0x69,0x47,0x18,0x63,0x8f,0x5f,0x31,0x05,0x8d,0xc0,0x75,0x32,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31, -0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xd4,0xb9,0xb9,0xf2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x02,0x01,0x09,0x12,0x09,0x60,0x7e,0x49,0x1d,0xa7,0x3f,0x75,0xa6,0x67,0x33,0x6e,0x77,0x80,0x45,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19, -0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfc,0xe6,0xb5,0x03,0xa6,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x04,0xb2,0x00,0x28,0x00,0x2c,0x00,0x30,0x00,0x34,0x00,0x00,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32, -0x1e,0x04,0x17,0x07,0x0e,0x05,0x23,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x2b,0x73,0x92,0xb1,0xd0,0xf1,0x88,0x02,0x81,0xb9,0xb9,0xc3,0xb9,0xb9,0x01,0x42, -0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x0a,0x42,0x59,0x62,0x53,0x36,0xfe,0xb4,0xb5,0x04,0xa2,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x04,0xad,0x04,0xb2,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x00,0x15,0x22, -0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39, -0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x14,0x35,0x5e,0x4a,0x14,0x62,0x7d,0x4a,0x1e,0x02,0x48,0xab,0xc8,0xe3,0x80,0x02,0x81,0xb9,0xb9,0xc3,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10, -0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2b,0x3b,0x25,0x10,0xa7,0x29,0x46,0x5d,0x35,0x2b,0x5b,0x4b,0x30,0xfe,0xb4,0xb5,0x04,0xa2,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x00,0x20,0x00,0x34,0x00,0x38,0x00,0x3c,0x00,0x00,0x01,0x33,0x11,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02, -0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x55,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x5a,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb7,0xfe,0xf5,0xc6,0x92, -0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x02,0x52,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x97,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xec,0xfc,0x1d,0x01,0x43,0x7a,0x5d,0x36,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x55,0x2f,0x16,0x05,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a, -0x66,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x00,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36, -0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x79,0xae,0x70,0x36,0x2d,0x51,0x71,0x88,0x9a,0x52,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4, -0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x83,0x75,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x96,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x54,0x2e,0x16,0x04,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82, -0x52,0x25,0x2c,0x4e,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x00,0x04,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x00,0x2d,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x00,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33, -0x21,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x6f,0x89,0x9d,0x54,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23, -0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x96,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3c,0x43,0x30,0x35,0x1a,0x05,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a, -0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x29,0x00,0x3d,0x00,0x41,0x00,0x45,0x00,0x00,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26, -0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26, -0x70,0x89,0x9d,0x54,0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x97,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a, -0x06,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x06,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x06,0x3c,0x00,0x36,0x00,0x4a,0x00,0x4e,0x00,0x52,0x00,0x56, -0x00,0x5a,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35, -0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x01,0x62,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x3a,0x64,0x89,0x9d,0xac,0x55,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x05,0xe6,0x0f, -0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1a,0x18,0x42,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0xfe,0x0f,0xb9,0xb9,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x60, -0x84,0x57,0x30,0x17,0x05,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0xf2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x00,0x06,0xff,0xba,0xfe,0xa6,0x03,0x49,0x06,0x3c,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44, -0x00,0x48,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x13,0x23,0x35,0x33, -0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81,0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x39,0xb9,0xb9, -0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42,0x4a,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x00,0x06,0xff,0xba,0xfe,0xa6, -0x04,0x02,0x06,0x3c,0x00,0x2f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22, -0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x13,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8, -0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x39,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17, -0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x06,0x00,0xab,0xfe,0xa6,0x08,0x04,0x06,0x3c,0x00,0x41,0x00,0x55,0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x00,0x01,0x34,0x3e,0x02, -0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36, -0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0xb0,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5b,0x27,0x33,0x77,0x82,0x8a,0x45,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d, -0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x01,0xfe,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x41,0x73,0x5a,0x23,0x1b,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0xfe,0x0f,0xb9,0xb9,0x01,0xd1,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x63,0x27,0x09,0x03,0xa7,0x07, -0x0e,0x16,0x0f,0x18,0x1a,0x0d,0x03,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x35,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x1f,0x3e,0x43,0x4a,0x2b,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5, -0x00,0x05,0x00,0x9b,0xfc,0xb6,0x05,0x4b,0x04,0x79,0x00,0x30,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x50,0x00,0x00,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x2e,0x05, -0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0xad,0x50,0x5c,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x1b,0x28,0x1b,0x0e,0x4a,0x98,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x67,0x93,0x64,0x3b,0x21, -0x0b,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xf8,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x6a,0xb9,0xb9,0x17,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x2a,0x68,0x75,0x7f,0x40,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26, -0x1d,0x32,0x46,0x51,0x5b,0xd0,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x03,0x1f,0xb5,0xb5,0xb5,0xf8,0x3d,0xb5,0x00,0x00,0x05,0xff,0xba,0xfe,0xa6,0x03,0x49,0x05,0x24,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e, -0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81, -0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x68,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04, -0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42,0x4a,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0xf9,0x82,0xb5,0x00,0x05,0xff,0xba,0xfe,0xa6,0x04,0x02,0x05,0x24,0x00,0x2f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16, -0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30, -0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x68,0xb9,0xb9, -0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x03,0x3e,0xb5,0xb5,0xb5,0xf9,0x82,0xb5,0x00, -0x00,0x05,0x00,0x9b,0xfc,0xb6,0x06,0x03,0x04,0x79,0x00,0x30,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x03,0x2e, -0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0x36,0x5c,0x91,0x66,0x36,0x30,0x55,0x73,0x44,0x48,0x78,0x36,0x2d,0x34,0x07,0xbc,0xbb,0x0b,0x54,0x99,0xe0,0x97,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x60,0x8d,0x63,0x3e, -0x24,0x10,0x03,0x1d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1a,0x7c,0x86,0x65,0x04,0x0e,0xfe,0xf5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x6a,0xb9,0xb9,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x48,0xc0,0x6d,0xa7,0x7f,0xbc,0x7b,0x3d,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x19, -0x2d,0x3e,0x49,0x52,0x2b,0x01,0x42,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0x02,0xb6,0xb5,0xb5,0xb5,0xf8,0x3d,0xb5,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x51,0x05,0xec,0x00,0x2d,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15, -0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x05,0x51,0xb3,0xb3,0xb3,0x38,0x81,0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfd,0xa8,0x8f,0xe4, -0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x02,0x44,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xa5,0x05,0xec,0x00,0x26,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32, -0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x02,0xa5,0xb3,0xb3,0xb3,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x2e,0x47,0x30,0x18,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfd,0xe0,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0x0f,0x2a, -0x48,0x39,0x02,0x19,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x00,0x2f,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21, -0x35,0x21,0x11,0x33,0x11,0x33,0x02,0xa5,0xb3,0xb3,0xb3,0x0c,0x27,0x4a,0x3d,0x16,0x61,0x74,0x1d,0x04,0x1b,0x43,0x48,0x49,0x22,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfe,0x2c,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20, -0x20,0x33,0x12,0x2c,0x47,0x35,0x02,0x19,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x00,0x38,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02, -0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x05,0x51,0xb3,0xb3,0xb3,0x0c,0x27,0x4a,0x3d,0x13,0x49,0x59,0x1c,0x04,0x11,0x4c,0x7f,0xb7,0x7c,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04, -0x5c,0x83,0x6d,0xfe,0x30,0x43,0x61,0x40,0x1f,0xa7,0x28,0x26,0x5f,0x95,0x69,0x37,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x02,0x44,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x05,0x00,0x39,0xfd,0xff,0x03,0xf4,0x05,0x91,0x00,0x26,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44, -0x00,0x00,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x02,0xac,0x4c,0x79,0x55,0x2e, -0x23,0x47,0x69,0x45,0x31,0x66,0x61,0x59,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x2e,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x54,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x02,0xb9,0x53,0x7d,0x91,0x3e,0x3b,0x6c,0x52,0x30, -0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x43,0x23,0x0b,0xfd,0xdf,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0f,0x0d,0x09,0x03,0x2c,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0xff,0xba,0xff,0xf2,0x03,0xf4,0x05,0x91,0x00,0x23,0x00,0x33,0x00,0x37, -0x00,0x3b,0x00,0x3f,0x00,0x00,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x23,0x23, -0x23,0x23,0x1a,0x3f,0x57,0x3b,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x35,0x9a,0x5e,0x01,0x6e,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3f,0x2d,0xb0,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1a,0x2f, -0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f,0x50,0x43,0x01,0x13,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x02,0x89,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x91,0x00,0x30,0x00,0x40,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x00,0x05,0x23,0x22,0x26, -0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x04,0x17,0x1e,0x03,0x33,0x25,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x04,0xad,0x16,0x5b, -0x6f,0x1e,0x05,0x2d,0x87,0x61,0x34,0x61,0x57,0x4b,0x1e,0x35,0x99,0x5f,0x13,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57,0x3a,0x23,0x0b,0x0d,0x21,0x2b,0x38,0x48,0x5c,0x39,0x4f,0x72,0x50,0x33,0x1c,0x0c,0x02,0x04,0x0d,0x25,0x46,0x3d,0xfc,0xd4,0x2b,0x8e,0x56,0x5e,0x69,0x1a,0x35,0x52,0x37,0x30,0x4f,0x3e,0x2f,0xaf,0xb9,0xb9,0x01,0x42, -0xb9,0xb9,0xa1,0xb9,0xb9,0x0e,0x40,0x41,0x39,0x48,0x18,0x28,0x35,0x1e,0x50,0x43,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1b,0x1f,0x49,0x48,0x42,0x34,0x1e,0x2e,0x48,0x56,0x51,0x40,0x0e,0x21,0x3e,0x30,0x1d,0x6d,0x35,0x36,0x44,0x45,0x21,0x51,0x45,0x2f,0x26,0x45,0x5f,0x02,0x85,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0x00,0x39, -0xfd,0xff,0x04,0xad,0x05,0x91,0x00,0x2f,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x00,0x25,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02, -0x23,0x22,0x06,0x07,0x1e,0x03,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x04,0xad,0x16,0x51,0x68,0x21,0x04,0x26,0x6c,0x4f,0x31,0x65,0x60,0x57,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x15,0x44,0x6e,0x53,0x34,0x0b,0x06,0x0f,0x26,0x45,0xfe,0x55, -0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x54,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x99,0xa7,0x3a,0x36,0x36,0x3b,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x42,0x24,0x0b,0x41,0x67,0x80,0x3f,0x26,0x43,0x33,0x1d,0x01, -0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0e,0x0e,0x09,0x03,0x2c,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x04,0x00,0x82,0xfe,0x10,0x05,0x91,0x04,0xcc,0x00,0x35,0x00,0x4e,0x00,0x52,0x00,0x56,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e, -0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d, -0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xfe,0xa1,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xc2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58, -0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x05,0x0c,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x4a,0xb5,0xb5,0xb5, -0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0x48,0x05,0x3e,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x37,0x00,0x00,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26, -0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x06,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x63,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c, -0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0xfe,0x0d,0xb5,0xb5,0xb5,0x05,0x78,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x00,0x1f,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x00,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23, -0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23, -0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0d,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xdf,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x01,0xc4,0x03,0x04,0x25, -0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x6e,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x82,0xfd,0xc0,0x06,0xae,0x04,0x68,0x00,0x44,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34, -0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x06,0xae,0x16,0x43,0x67, -0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e,0x21,0x2a,0x3b,0x52,0xfb,0x36,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55, -0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xc2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57, -0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0x03,0x64,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x5e,0xb5,0xb5,0xb5,0x00,0x00,0x04,0x00,0x9a,0xfe,0x10,0x05,0x91,0x04,0x78,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06, -0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b, -0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0x9d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0xb2,0xb9,0xb9,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58,0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23, -0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0xfe,0xbb,0xb5,0xb5,0xb5,0x04,0xfe,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0x48,0x04,0xb2,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x22,0x00,0x00,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01, -0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x06,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x4f,0xb9,0xb9,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0xfe,0x0d,0xb5,0xb5,0xb5,0x04, -0xa2,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x00,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xf2, -0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0xec,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x4f,0xb9,0xb9,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0xfb,0x97,0xb5,0xb5,0xb5,0x04, -0xa2,0xb5,0x00,0x04,0x00,0x9a,0xfd,0xc0,0x06,0xae,0x03,0xba,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x50,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e, -0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x06,0xae,0x16,0x43,0x67,0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d, -0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e,0x21,0x2a,0x3b,0x52,0xfb,0xf8,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x9b,0xb9,0xb9,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c, -0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0xfd,0x27,0xb5,0xb5,0xb5,0x04,0x90,0xb5,0x00,0x02,0xff,0xa6,0xfd,0xff,0x03,0x5a,0x02,0x5e,0x00,0x28,0x00,0x38,0x00,0x00,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e, -0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x03,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x02,0x31,0x1a,0x28,0x1c,0x0f,0x0f,0x0d,0x3c,0x6c,0x30,0x8b,0x3f,0x51,0x23,0x56,0x5f,0x64,0x30,0x45,0x6f,0x4f,0x2a,0x2e,0x4e,0x67,0x39,0x4e,0x9a,0x4b,0x07,0x05,0x13,0x1f, -0x29,0x16,0xbc,0x46,0x78,0x2a,0x37,0x7c,0x47,0x26,0x31,0x1d,0x0b,0x0f,0x23,0x37,0x02,0x5e,0x41,0x8e,0x8f,0x8b,0x3e,0x3e,0x6d,0x31,0x2b,0x72,0x4a,0x57,0x61,0x44,0x36,0x4a,0x2e,0x15,0x22,0x40,0x5d,0x3b,0x3d,0x5b,0x3a,0x1d,0x1d,0x20,0x31,0x41,0x1e,0x4b,0x8e,0x88,0x83,0x3f,0xfc,0x49,0x33,0x39,0x18,0x19,0x0d,0x16,0x1d,0x10, -0x10,0x1c,0x15,0x0c,0x00,0x02,0xff,0xa6,0xfd,0xff,0x03,0x5a,0x02,0x5e,0x00,0x30,0x00,0x40,0x00,0x00,0x01,0x16,0x16,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x03,0x32, -0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x02,0x31,0x1e,0x2b,0x0f,0x06,0x1c,0x31,0x49,0x32,0x16,0x3f,0x4a,0x1a,0x0f,0x0d,0x3c,0x6c,0x30,0x8b,0x3f,0x51,0x23,0x56,0x5f,0x64,0x30,0x45,0x6f,0x4f,0x2a,0x2e,0x4e,0x67,0x39,0x4e,0x9a,0x4b,0x07,0x05,0x13,0x1f,0x29,0x16,0xbc,0x46,0x78,0x2a,0x37,0x7c,0x47,0x26, -0x31,0x1d,0x0b,0x0f,0x23,0x37,0x02,0x5e,0x4c,0xa5,0x53,0x21,0x31,0x20,0x0f,0xa7,0x24,0x21,0x3e,0x6d,0x31,0x2b,0x72,0x4a,0x57,0x61,0x44,0x36,0x4a,0x2e,0x15,0x22,0x40,0x5d,0x3b,0x3d,0x5b,0x3a,0x1d,0x1d,0x20,0x31,0x41,0x1e,0x4b,0x8e,0x88,0x83,0x3f,0xfc,0x49,0x33,0x39,0x18,0x19,0x0d,0x16,0x1d,0x10,0x10,0x1c,0x15,0x0c,0x00, -0x00,0x03,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x00,0x22,0x00,0x36,0x00,0x3a,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01, -0x23,0x35,0x33,0x6c,0xad,0x52,0x64,0x7b,0x45,0x1a,0x02,0x53,0x59,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x34,0x72,0xb6,0x82,0x5b,0xac,0x64,0x02,0xa9,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xfe,0x93,0xb9,0xb9,0xfe,0xf9,0x2c,0x23,0x42,0x68,0x82,0x41, -0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xed,0x84,0x74,0xd3,0xa2,0x60,0x26,0x2e,0x02,0x66,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0xfe,0x8c,0xb5,0x00,0x03,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x00,0x27,0x00,0x38,0x00,0x3c,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e, -0x02,0x37,0x36,0x36,0x37,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x01,0x23,0x35,0x33,0x6c,0xad,0x52,0x45,0x66,0x48,0x2c,0x0c,0x05,0x0b,0x04,0x75,0x5c,0x92,0x66,0x36,0x30, -0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x35,0x07,0xbc,0xbd,0x08,0x3e,0x74,0xab,0x75,0x5b,0xac,0x64,0x02,0x8d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1b,0x7c,0x87,0x65,0x04,0x0e,0xfe,0x7f,0xb9,0xb9,0xfe,0xf9,0x2c,0x23,0x21,0x39,0x4c,0x2c,0x13,0x3d,0x26,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x56,0x48,0xbf,0x6d,0xa7, -0x66,0xb5,0x88,0x50,0x26,0x2e,0x02,0xe1,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0xfe,0x23,0xb5,0x00,0x00,0x04,0x00,0x02,0xfe,0x8d,0x03,0xfe,0x03,0x62,0x00,0x3d,0x00,0x51,0x00,0x55,0x00,0x59,0x00,0x00,0x25,0x16,0x16,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23, -0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x27,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x15,0x1d,0x47,0x26,0x19,0x23,0x23,0x23, -0x23,0x22,0x17,0x3f,0x4a,0x51,0x27,0x32,0x5e,0x4d,0x35,0x07,0x10,0x29,0x49,0x39,0x21,0x83,0x03,0x01,0x41,0x67,0x7f,0x3e,0x10,0x22,0x0a,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x82,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0x87,0xb9,0xb9, -0x01,0x42,0xb9,0xb9,0xa5,0x05,0x07,0x33,0x20,0x20,0x34,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x25,0x4f,0x7b,0x56,0x20,0x16,0x1e,0x05,0x7d,0xb1,0x71,0x34,0x01,0x01,0x07,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0xa2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20, -0x3e,0x44,0x4a,0x2b,0x18,0x4f,0xfd,0x75,0xb5,0xb5,0xb5,0x00,0x00,0x04,0x00,0x02,0xfe,0x8d,0x04,0x1c,0x03,0x62,0x00,0x37,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x2e,0x03,0x35,0x34, -0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x1c,0x30,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x5e,0x4d,0x35,0x07,0x10,0x29,0x49,0x39,0x21,0x83,0x03,0x01,0x41,0x67,0x7f,0x3e,0x0e,0x25, -0x09,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x39,0x8b,0xfe,0xd3,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0x87,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x99,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x25,0x4f,0x7b,0x56,0x20,0x16,0x1e,0x05, -0x7d,0xb1,0x71,0x34,0x01,0x01,0x07,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xd4,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0xfd,0x75,0xb5,0xb5,0xb5,0x00,0x00,0x01,0x00,0x00,0x06,0x40,0x02,0x35,0x07,0xaa,0x00,0x1b, -0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x0c,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x06,0x40,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23, -0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x02,0x00,0x00,0x06,0x76,0x02,0x33,0x08,0x14,0x00,0x2a,0x00,0x37,0x00,0x00,0x01,0x06,0x07,0x06,0x07,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x37,0x1e,0x03,0x33,0x32,0x37,0x36,0x37,0x26,0x27,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x37,0x27,0x34,0x26, -0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x02,0x33,0x25,0x29,0x0b,0x11,0x22,0x72,0x54,0x21,0x44,0x3e,0x31,0x0d,0x44,0x07,0x1a,0x27,0x34,0x22,0x2d,0x26,0x12,0x10,0x10,0x10,0x1c,0x2c,0x1b,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x0f,0x0e,0x6e,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x24,0x1c,0x0b,0x07,0x07,0x0c,0x09, -0x14,0x12,0x25,0x31,0x13,0x22,0x31,0x1e,0x35,0x0e,0x22,0x1e,0x14,0x0b,0x05,0x07,0x02,0x05,0x09,0x24,0x38,0x27,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x14,0x15,0x06,0x07,0x19,0x2a,0x21,0x24,0x1f,0x1f,0x24,0x02,0x1a,0x00,0x00,0x01,0x00,0x00,0xfe,0x89,0x02,0x35,0xff,0xf3,0x00,0x1b,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02, -0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x0c,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0xfe,0x89,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00, -0x00,0x02,0x00,0x00,0x06,0x40,0x02,0x7b,0x08,0x72,0x00,0x1b,0x00,0x37,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x27,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22, -0x06,0x15,0x14,0x17,0x52,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x9f,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x06,0x40,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e, -0x20,0x13,0x0d,0x9d,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x04,0x00,0x00,0x06,0x76,0x02,0xdd,0x08,0xfa,0x00,0x28,0x00,0x51,0x00,0x5e,0x00,0x6c,0x00,0x00,0x01,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x37,0x1e,0x03,0x33,0x32,0x37,0x2e,0x03, -0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x37,0x01,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x07,0x2e,0x03,0x23,0x22,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x06,0x06,0x07,0x17,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x05,0x34,0x26,0x23,0x22, -0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x36,0x02,0xdd,0x26,0x28,0x0f,0x2e,0x40,0x53,0x34,0x21,0x44,0x3e,0x31,0x0d,0x44,0x07,0x1a,0x27,0x34,0x22,0x43,0x31,0x19,0x2f,0x24,0x16,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x08,0x0e,0x07,0xfd,0x35,0x25,0x29,0x0f,0x2e,0x40,0x52,0x35,0x21,0x44,0x3e,0x30,0x0e,0x44,0x08,0x19, -0x27,0x34,0x22,0x44,0x31,0x19,0x2f,0x25,0x16,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x08,0x0e,0x07,0x6e,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x24,0x1c,0x0b,0x01,0xdd,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x12,0x20,0x0e,0x0b,0x07,0x07,0x0c,0x09,0x1a,0x2d,0x21,0x14,0x13,0x22,0x31,0x1e,0x35,0x0e,0x22,0x1e,0x14,0x17,0x03,0x15,0x24, -0x34,0x23,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x16,0x13,0x03,0x06,0x04,0x01,0x14,0x0c,0x09,0x19,0x2e,0x21,0x14,0x13,0x22,0x31,0x1e,0x35,0x0d,0x22,0x1e,0x15,0x18,0x03,0x15,0x24,0x34,0x22,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x15,0x13,0x02,0x07,0x03,0x19,0x2a,0x21,0x24,0x1f,0x1f,0x24,0x03,0x1b,0xb1,0x2a,0x21,0x24, -0x1f,0x1f,0x24,0x01,0x01,0x1b,0x00,0x02,0x00,0x00,0xfd,0xc1,0x02,0x7b,0xff,0xf3,0x00,0x1b,0x00,0x37,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x27,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15, -0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x52,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x9f,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0xfd,0xc1,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b, -0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x9d,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x01,0x00,0x64,0x06,0x76,0x01,0x1d,0x07,0x2b,0x00,0x03,0x00,0x00,0x01,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x06,0x76,0xb5,0x00,0x00,0x02,0x00,0x64,0x06,0x76, -0x02,0x5f,0x07,0x2b,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x06,0x76,0xb5,0xb5,0xb5,0x00,0x00,0x02,0x00,0x00,0x06,0x41,0x02,0x3f,0x07,0xda,0x00,0x1c,0x00,0x2b,0x00,0x00,0x01,0x26,0x27,0x06,0x07,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16, -0x17,0x16,0x17,0x36,0x37,0x17,0x06,0x07,0x06,0x07,0x16,0x17,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x01,0xa4,0x09,0x0b,0x1a,0x1e,0x36,0x43,0x28,0x50,0x3f,0x28,0x5a,0x51,0x3b,0x6c,0x2b,0x27,0x1e,0x37,0x2a,0x1c,0x1a,0x21,0x0e,0x10,0x0b,0x07,0xb5,0x1e,0x4a,0x28,0x0f,0x20,0x1b,0x11,0x47,0x3d, -0x4c,0x3f,0x11,0x06,0x41,0x23,0x20,0x04,0x04,0x06,0x0d,0x27,0x48,0x3a,0x51,0x5d,0x3e,0x36,0x30,0x3f,0x0f,0x10,0x64,0x07,0x0b,0x04,0x05,0x23,0x26,0xcf,0x2a,0x30,0x07,0x12,0x1e,0x17,0x29,0x27,0x0a,0x20,0x00,0x01,0x00,0x64,0xfe,0xa6,0x01,0x1d,0xff,0x5b,0x00,0x03,0x00,0x00,0x01,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0xfe,0xa6, -0xb5,0x00,0x00,0x02,0x00,0x64,0xfe,0xa6,0x02,0x5f,0xff,0x5b,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0xa6,0xb5,0xb5,0xb5,0x00,0x00,0x02,0x00,0x00,0xfd,0xd1,0x02,0x3f,0xff,0x6a,0x00,0x1c,0x00,0x2b,0x00,0x00,0x01,0x26,0x27,0x06,0x07,0x06,0x23,0x22, -0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x17,0x36,0x37,0x17,0x06,0x07,0x06,0x07,0x16,0x17,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x01,0xa4,0x09,0x0b,0x1b,0x1d,0x36,0x43,0x28,0x50,0x3f,0x28,0x5a,0x51,0x3b,0x6c,0x2b,0x27,0x1e,0x37,0x2a,0x1c,0x1a,0x21,0x0e,0x10,0x0b,0x07,0xb5,0x1e, -0x4a,0x28,0x0f,0x20,0x1b,0x11,0x47,0x3d,0x4c,0x40,0x11,0xfd,0xd1,0x23,0x21,0x05,0x03,0x07,0x0d,0x27,0x48,0x3a,0x51,0x5d,0x3e,0x36,0x30,0x3f,0x0f,0x10,0x64,0x07,0x0a,0x05,0x04,0x24,0x26,0xd0,0x29,0x30,0x07,0x12,0x1e,0x17,0x29,0x27,0x0a,0x20,0x00,0x02,0x00,0x00,0x06,0x76,0x02,0xae,0x08,0x74,0x00,0x03,0x00,0x07,0x00,0x00, -0x11,0x25,0x17,0x05,0x13,0x25,0x17,0x05,0x02,0x22,0x1e,0xfd,0xde,0x50,0x02,0x22,0x1e,0xfd,0xde,0x06,0xde,0x9c,0x68,0x9c,0x01,0x62,0x9c,0x68,0x9c,0x00,0x00,0x04,0xff,0xbf,0x06,0x55,0x03,0xd2,0x08,0x0e,0x00,0x21,0x00,0x2f,0x00,0x51,0x00,0x5f,0x00,0x00,0x01,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32, -0x36,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x05,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37, -0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x17,0x28,0x11,0x18,0x30,0x15,0x72,0x5e,0x12,0x33,0x5a,0x39,0x01,0x0b,0x07,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x01,0xcf,0x17,0x28,0x11,0x18,0x30,0x15,0x72,0x5e, -0x12,0x33,0x5a,0x39,0x01,0x0b,0x07,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x06,0x55,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25, -0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0xe9,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x02,0x00,0x00,0xfd,0x6c,0x02,0xae,0xff,0x6a,0x00,0x03,0x00,0x07, -0x00,0x00,0x11,0x25,0x17,0x05,0x13,0x25,0x17,0x05,0x02,0x22,0x1e,0xfd,0xde,0x50,0x02,0x22,0x1e,0xfd,0xde,0xfd,0xd4,0x9c,0x68,0x9c,0x01,0x62,0x9c,0x68,0x9c,0x00,0x00,0x02,0x00,0x00,0x06,0x76,0x01,0xc8,0x08,0xdd,0x00,0x23,0x00,0x35,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34, -0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x3c,0x5c,0x2b,0x34,0x41,0x25,0x0e,0x15,0x2d,0x17,0x24,0x42,0x33,0x1e,0x1a,0x2e,0x3f,0x24,0x26,0x45,0x1d,0x1d,0x1d,0x1e,0x3f,0x63,0x45,0x31,0x5c,0x36,0x01,0x6a,0x01,0x11, -0x1d,0x25,0x15,0x0f,0x1c,0x17,0x0e,0x12,0x1d,0x27,0x15,0x13,0x28,0x07,0x01,0x18,0x12,0x1e,0x31,0x3d,0x20,0x08,0x0a,0x16,0x2a,0x3d,0x28,0x22,0x47,0x39,0x25,0x2b,0x2e,0x2d,0x70,0x47,0x3e,0x6c,0x51,0x2f,0x10,0x19,0x01,0x3d,0x14,0x38,0x33,0x24,0x0f,0x1a,0x24,0x14,0x13,0x1f,0x15,0x0c,0x06,0x00,0x00,0x03,0x00,0x0a,0x06,0x7b, -0x02,0x06,0x08,0x1c,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x00,0x13,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x15,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x32,0x36,0x37,0x23,0x16,0x16,0x13,0x22,0x06,0x07,0x33,0x26,0x26,0x0a,0x5c,0x0a,0x50,0x42,0x42,0x52,0x0b,0x65,0x64,0x08,0x50,0x48,0x45,0x51,0x08,0x5a,0xfb,0x2a,0x22, -0x04,0xa3,0x04,0x25,0x2a,0x27,0x26,0x05,0xa0,0x05,0x23,0x07,0x7e,0x50,0x4e,0x4e,0x50,0x58,0x55,0x56,0x56,0x55,0x60,0x2b,0x35,0x35,0x2b,0x01,0x0b,0x25,0x2e,0x2d,0x26,0x00,0x00,0x02,0x00,0x05,0x06,0x7c,0x02,0x01,0x07,0xdf,0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x21,0x15,0x21,0x25,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01, -0x5b,0xb9,0xb9,0x06,0xd4,0x58,0xae,0xb5,0x00,0x02,0x00,0x05,0xfe,0x07,0x02,0x01,0xff,0x6a,0x00,0x03,0x00,0x07,0x00,0x00,0x17,0x21,0x15,0x21,0x01,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01,0x5b,0xb9,0xb9,0x96,0x58,0xfe,0xf5,0xb5,0x00,0x01,0x00,0x00,0x06,0x62,0x01,0x49,0x08,0x48,0x00,0x06,0x00,0x00,0x11,0x25,0x15,0x07, -0x17,0x15,0x25,0x01,0x49,0xe7,0xe7,0xfe,0xb7,0x07,0x8e,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0x06,0x62,0x01,0x49,0x08,0x48,0x00,0x06,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x07,0x1c,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0xfd,0x84,0x01,0x49, -0xff,0x6a,0x00,0x06,0x00,0x00,0x11,0x25,0x15,0x07,0x17,0x15,0x25,0x01,0x49,0xe7,0xe7,0xfe,0xb7,0xfe,0xb0,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0xfd,0x84,0x01,0x49,0xff,0x6a,0x00,0x06,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0xfe,0x3e,0xba,0x7d,0x76,0x76,0x7d, -0xba,0x00,0x00,0x02,0x00,0x00,0x06,0x62,0x02,0xd9,0x08,0x48,0x00,0x06,0x00,0x0d,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x0d,0x02,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x01,0x90,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x07,0x1c,0xba,0x7d,0x76,0x76,0x7d,0xba,0x72,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x03, -0x00,0x64,0x06,0x62,0x04,0x41,0x08,0x48,0x00,0x03,0x00,0x0a,0x00,0x11,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x05,0x35,0x37,0x27,0x35,0x0d,0x02,0x35,0x37,0x27,0x35,0x05,0x01,0x1d,0xb9,0xb9,0x01,0x94,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x01,0x90,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x06,0xf8,0xb5,0x91,0xba,0x7d,0x76,0x76,0x7d,0xba,0x72, -0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x02,0x00,0x64,0x06,0x62,0x02,0xb1,0x08,0x48,0x00,0x03,0x00,0x0a,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x1d,0xb9,0xb9,0x01,0x94,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x06,0xf8,0xb5,0x91,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x03,0x00,0x00,0x06,0x55,0x02,0x84, -0x08,0x0e,0x00,0x21,0x00,0x2f,0x00,0x33,0x00,0x00,0x01,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x25,0x23,0x35,0x33,0x01,0xf6,0x17,0x28,0x11, -0x18,0x30,0x15,0x72,0x5e,0x12,0x33,0x5a,0x39,0x01,0x0c,0x08,0x36,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0xfe,0x8a,0xb9,0xb9,0x06,0x55,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x02,0x45,0x43,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42, -0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x11,0xb5,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x0b,0xf8,0x02,0x3e,0x00,0x45,0x00,0x2c,0xb1,0x40,0x37,0xb8,0x04,0xfb,0xb5,0x0e,0x45,0x45,0x3c,0x3c,0x30,0xb8,0x04,0xfb,0xb4,0x15,0x05,0x0e,0x28,0x1f,0xb9,0x04,0xfb,0x00,0x21,0x00,0x2f,0xfd, -0x32,0xde,0x32,0xdc,0xed,0x32,0x2f,0x33,0x2f,0x10,0xed,0x32,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x33,0x15,0x21,0x22,0x26,0x27,0x27,0x37,0x21,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x33,0x32,0x3e,0x02,0x35,0x33,0x14, -0x16,0x33,0x32,0x3e,0x02,0x35,0x0b,0xf8,0x16,0x2d,0x44,0x2e,0x2d,0x4a,0x17,0x07,0x12,0x24,0x26,0x28,0x16,0x29,0x39,0x2c,0x25,0x2b,0x36,0x26,0x20,0x24,0x14,0x05,0x0b,0x17,0x21,0x17,0x8c,0xf8,0x84,0x55,0xb2,0x51,0x1c,0x05,0x07,0xa7,0x17,0x15,0x1a,0x38,0x56,0x3c,0x2a,0x3d,0x30,0x28,0x29,0x2f,0x20,0x20,0x2d,0x1c,0x0d,0x6e, -0x26,0x33,0x13,0x18,0x0e,0x06,0x02,0x3d,0x45,0x6f,0x4e,0x2a,0x27,0x2a,0x1a,0x20,0x11,0x06,0x14,0x1e,0x24,0x1e,0x14,0x11,0x1a,0x20,0x10,0x15,0x30,0x2e,0x27,0x0b,0xa7,0x0e,0x0f,0x85,0x05,0x25,0x5c,0x23,0x30,0x5a,0x47,0x2b,0x17,0x22,0x27,0x22,0x17,0x20,0x30,0x37,0x17,0x54,0x4a,0x1f,0x30,0x37,0x18,0x00,0x00,0x01,0x00,0xbc, -0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x07,0x00,0x00,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0xfa,0xfd,0x6a,0xa8,0xa8,0x03,0x25,0x97,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x07,0x00,0x00,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0x04,0xfe,0x46,0xa4,0xa4,0x02,0x5c, -0x8b,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0x33,0x05,0x9a,0x00,0x0b,0x00,0x00,0x01,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x04,0x33,0xa8,0xf6,0xa8,0xf5,0xa8,0x05,0x9a,0xfe,0x1e,0x01,0x4a,0xfa,0xfe,0x05,0x02,0xfe,0xb6,0x01,0xe2,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x03,0xe8, -0x05,0x3f,0x00,0x0b,0x00,0x00,0x01,0x11,0x23,0x35,0x23,0x11,0x23,0x11,0x23,0x15,0x23,0x11,0x03,0xe8,0x9e,0xdc,0xa4,0xdc,0x9e,0x05,0x3f,0xfe,0x8e,0xe6,0xfb,0x4d,0x04,0xb3,0xe6,0x01,0x72,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x01,0xef,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00, -0x02,0x06,0x02,0x0f,0x00,0x00,0x00,0x01,0x00,0xbc,0xfe,0x8c,0x04,0x98,0x05,0x9a,0x00,0x12,0x00,0x00,0x25,0x01,0x27,0x01,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x04,0x98,0xfe,0x30,0x63,0x01,0x49,0xfd,0xe0,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x05,0xfe,0x87, -0x74,0x01,0x0b,0x02,0x85,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x10,0xff,0xe9,0x06,0xe4,0x05,0x9a,0x00,0x28,0x00,0x00,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x23,0x03,0x06,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x12,0x13, -0x21,0x01,0x16,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x06,0xe4,0xcd,0xfe,0xb6,0x10,0x11,0x04,0x05,0x11,0x0c,0xfe,0xac,0xce,0x01,0xe0,0xfe,0xa4,0x7a,0x6d,0x10,0x2d,0x14,0x52,0xc5,0x4f,0x3a,0x34,0x3d,0x3e,0x36,0x37,0x71,0x45,0x01,0x76,0x01,0x25,0x0e,0x1a,0x0b,0x04,0x1f,0x19,0x01,0x31,0xc1,0xfe,0x3d,0x02,0x25,0x1b,0x2c, -0x0b,0x24,0x18,0xfd,0xdb,0x02,0xd1,0x02,0x31,0xfd,0x02,0x71,0xa3,0x36,0xd1,0x15,0x9e,0x1d,0x4a,0x4a,0x02,0x6e,0x02,0x19,0xfe,0x08,0x19,0x32,0x19,0x41,0x27,0x01,0xf4,0xfd,0x39,0x00,0x00,0x01,0x00,0x10,0xff,0xf2,0x05,0x40,0x04,0x00,0x00,0x21,0x00,0x00,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x03, -0x23,0x02,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x13,0x16,0x16,0x17,0x33,0x01,0x05,0x40,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xcd,0xbd,0x01,0x5d,0xf5,0x30,0x29,0x64,0x63,0xa8,0x31,0x27,0x22,0x2a,0xdc,0x3f,0x01,0x1f,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x04,0x00,0xfd,0xfa,0xfe,0x06, -0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfe,0xb4,0x01,0xf6,0x01,0x7f,0xfe,0x0f,0xc9,0xc9,0x0e,0x8d,0x12,0x03,0x85,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x05,0xe0,0x05,0x9a,0x00,0x11,0x00,0x19,0x00,0x00,0x01,0x11,0x23,0x11,0x21,0x32,0x17,0x16,0x17,0x13,0x33,0x01,0x01,0x23,0x01,0x06,0x06,0x23, -0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0x01,0x8a,0xe7,0x7d,0x73,0x0b,0xf1,0xc1,0xfe,0x3d,0x01,0xc9,0xcd,0xfe,0x63,0x42,0xab,0x68,0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0x70,0x66,0xb5,0x01,0x8b,0xfd,0x39,0xfd,0x2d,0x02,0x80,0x32,0x30,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x02, -0x00,0xa6,0xfe,0x29,0x05,0xea,0x04,0x18,0x00,0x1a,0x00,0x2f,0x00,0x00,0x09,0x02,0x23,0x03,0x0e,0x03,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x13,0x01,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0xea,0xfe,0xa8,0x01,0x52,0xbf,0xe2,0x13,0x4e, -0x72,0x95,0x5a,0xc7,0x6c,0x04,0xa4,0xa4,0x04,0x79,0xe9,0x58,0x8f,0x6a,0x42,0x0b,0xe7,0xfc,0x15,0x2b,0x4e,0x6b,0x40,0x4b,0x76,0x52,0x2b,0x29,0x4c,0x6d,0x43,0x47,0x75,0x53,0x2e,0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x74,0x5b,0x93,0x67,0x37,0xac,0xfd,0x95,0x05,0xd7,0xb4,0xcc,0x3a,0x6b,0x99,0x5e,0x01,0x84,0xfe,0x31,0x8f,0x3f, -0x6f,0x52,0x30,0x3b,0x70,0x9f,0x65,0x55,0x87,0x5f,0x32,0x35,0x5e,0x80,0x00,0x02,0x00,0x3d,0x00,0x00,0x06,0x4d,0x05,0x9a,0x00,0x24,0x00,0x2f,0x00,0x00,0x21,0x21,0x11,0x23,0x22,0x0e,0x02,0x07,0x03,0x23,0x13,0x3e,0x03,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x11,0x23, -0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x06,0x4d,0xfd,0x08,0xd1,0x1e,0x34,0x31,0x2f,0x19,0xb4,0xc8,0xda,0x0a,0x21,0x2b,0x33,0x1d,0x47,0x70,0x4e,0x29,0x44,0x7a,0xaa,0x66,0x03,0xd0,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0xfd,0x08,0xe9,0x8f,0x9c,0x2a,0x4d,0x6d,0x43,0x02,0x62,0x0b,0x25,0x47,0x3b,0xfe,0x50,0x01,0xdf,0x16,0x34, -0x30,0x29,0x0b,0x04,0x10,0x43,0x60,0x7b,0x47,0x5c,0x95,0x6a,0x39,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x02,0x62,0x02,0x08,0x85,0x7b,0x3d,0x62,0x44,0x25,0x00,0x00,0x03,0x00,0x3e,0xff,0xe8,0x06,0x3a,0x04,0x18,0x00,0x28,0x00,0x31,0x00,0x38,0x00,0x00,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x22, -0x07,0x03,0x23,0x13,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x21,0x15,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x07,0x11,0x23,0x22,0x15,0x14,0x33,0x06,0x3a,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88,0xdd,0x63,0xa1,0x77,0x48,0x0a,0x8c,0x63,0x51,0x85,0xbe,0xac,0x3d,0x54,0x79,0x7d,0x33, -0x61,0x8b,0x58,0x01,0x66,0x3e,0x9b,0x5a,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0xab,0xc2,0xcf,0xc9,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x3c,0x72,0xa7,0x6b,0xa0,0xfe,0xf8,0x01,0x3c,0x6f,0x22,0x10,0x8f,0x6d,0x44,0x6d,0x4d,0x29,0x62,0x3a,0x40,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42, -0x31,0x01,0x43,0x9d,0xa6,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x00,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x27,0x37,0x17,0x37,0x33,0x01,0x17,0x07,0x27,0x03,0x04,0xa2,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xa8,0x04,0x07,0x13,0x0c,0x01,0x04,0x7f,0x6a, -0x79,0xb0,0xd1,0xfe,0xe6,0x92,0x6e,0x8b,0xe6,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x0b,0x18,0x0e,0x01,0x30,0x8d,0x69,0x82,0xcd,0xfe,0xc5,0x9c,0x71,0x99,0xfe,0xff,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x14,0x00,0x00,0x01,0x37,0x33,0x07,0x17,0x07,0x27,0x07,0x01,0x23,0x01,0x23,0x11,0x23, -0x11,0x33,0x11,0x33,0x37,0x27,0x37,0x02,0x84,0x78,0xd7,0xed,0x66,0x61,0x5e,0x95,0x02,0x00,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0xdf,0x57,0x5f,0x03,0x7d,0x83,0xf6,0x77,0x54,0x6e,0x9b,0xfd,0xee,0x01,0xec,0xfe,0x14,0x04,0x00,0xfe,0x2b,0xf3,0x66,0x55,0x00,0x00,0x01,0x00,0x10,0xfe,0x66,0x07,0x73,0x05,0x9a,0x00,0x2e,0x00,0x00, -0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x03,0x06,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x12,0x13,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x03,0xfe,0xa3,0x9b,0xbe,0xc9,0x42,0x7a,0xb0,0x6d,0x46,0xa8,0xfe,0x72,0x6d,0x10,0x2d,0x14,0x52,0xc5, -0x4f,0x3a,0x34,0x3d,0x3e,0x36,0x37,0x71,0x45,0x02,0xc2,0x4a,0x93,0xee,0xa8,0x5c,0x4b,0x90,0xd2,0x86,0xae,0xfe,0xb2,0xb8,0x6c,0xde,0xcc,0x69,0xb9,0x89,0x4f,0xfd,0x5e,0x05,0x02,0xfd,0x02,0x71,0xa3,0x36,0xd1,0x15,0x9e,0x1d,0x4a,0x4a,0x02,0x6e,0x02,0x19,0xfd,0xa0,0x5f,0xac,0xf0,0x91,0x7d,0xd6,0x9c,0x59,0x00,0x01,0x00,0x10, -0xfe,0x66,0x05,0xf1,0x04,0x00,0x00,0x2c,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x23,0x06,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x02,0xed,0x75,0x8b,0x54,0x81,0x59,0x2e,0x39,0x6a,0x97,0x5e,0x20, -0xa3,0xee,0x15,0x46,0x65,0x85,0x53,0x31,0x27,0x22,0x2a,0xdc,0x3f,0x02,0x1a,0x42,0x7b,0xc8,0x8e,0x4d,0x49,0x87,0xbf,0x77,0x9a,0xfe,0xa0,0xa0,0x4e,0x30,0x5b,0x85,0x54,0x5d,0x94,0x67,0x38,0xfe,0x1a,0x03,0x75,0xfb,0xfe,0xa9,0xd4,0x5d,0x0e,0x8d,0x12,0x03,0x85,0xfe,0x74,0x4c,0x8d,0xc8,0x7b,0x6b,0xb6,0x85,0x4c,0x00,0x00,0x01, -0x00,0xbc,0xfe,0x66,0x07,0xc1,0x05,0x9a,0x00,0x25,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x04,0x4c,0xa3,0x9b,0xbe,0xc9,0x42,0x7a,0xb0,0x6d,0x46,0xa8,0xfd,0x1a,0xa8,0xa8,0x02, -0xe6,0xa8,0x4a,0x93,0xee,0xa8,0x5c,0x4b,0x90,0xd2,0x86,0xae,0xfe,0xb2,0xb8,0x6c,0xde,0xcc,0x69,0xb9,0x89,0x4f,0xfd,0x5e,0x02,0xa3,0xfd,0x5d,0x05,0x9a,0xfd,0xa0,0x02,0x60,0xfd,0xa0,0x5f,0xac,0xf0,0x91,0x7d,0xd6,0x9c,0x59,0x00,0x01,0x00,0xa6,0xfe,0x66,0x06,0x58,0x04,0x00,0x00,0x27,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x3e, -0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x03,0x54,0x75,0x8b,0x54,0x81,0x59,0x2e,0x39,0x6a,0x97,0x5e,0x20,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x42,0x7b,0xc8,0x8e,0x4d,0x49,0x87,0xbf,0x77,0x9a,0xfe,0xa0,0xa0, -0x4e,0x30,0x5b,0x85,0x54,0x5d,0x94,0x67,0x38,0xfe,0x1a,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfe,0x74,0x4c,0x8d,0xc8,0x7b,0x6b,0xb6,0x85,0x4c,0x00,0x00,0x01,0x00,0xa6,0xfe,0x7f,0x05,0x41,0x05,0x9a,0x00,0x16,0x00,0x00,0x13,0x33,0x11,0x36,0x33,0x32,0x1e,0x02,0x15,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x34,0x23, -0x22,0x07,0x11,0x23,0xa6,0xa8,0xe5,0xc5,0x5e,0x92,0x65,0x34,0xc0,0x9b,0xcd,0xf6,0xb1,0xe4,0xa8,0x05,0x9a,0xfd,0x7b,0x79,0x32,0x5f,0x8a,0x58,0xfe,0x7d,0xfd,0xe7,0x01,0x81,0x02,0x13,0xe7,0x6e,0xfd,0x74,0x00,0x01,0x00,0x98,0xfe,0x8b,0x04,0x76,0x04,0x00,0x00,0x13,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x11, -0x23,0x11,0x33,0x11,0x36,0x33,0x20,0x11,0x15,0x33,0x04,0x76,0x8d,0xae,0xc2,0x94,0xaa,0xa3,0xa3,0xb5,0x97,0x01,0x58,0x97,0xfe,0x8b,0x01,0x75,0x01,0x52,0xe1,0x56,0xfe,0x23,0x04,0x00,0xfe,0x64,0x62,0xfe,0x94,0xcf,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x1a,0x00,0x00,0x01,0x07,0x11,0x23,0x11,0x07,0x35,0x37, -0x35,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x37,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xaf,0x32,0x58,0x76,0x45,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0x02,0xec,0x92,0xfd,0xa6,0x01,0xf8,0x6a,0xa5,0x68,0xd9,0x8c,0xa6,0x51,0x81,0x5a,0x30,0x12,0x94,0x1b,0xd9,0xfe,0x5f,0x8f,0x00,0x01,0x00,0x35, -0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x18,0x00,0x00,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xba,0x0d,0x3b,0x52,0x67,0x39,0x4b,0x2c,0x30,0x3d,0x7b,0x23,0x05,0x09,0x8c,0xfb,0x83,0x03,0x74,0x8c,0x7d,0x8c,0x3a,0x5d, -0x40,0x22,0x12,0x94,0x1b,0x6e,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x53,0x05,0xfe,0x00,0x27,0x00,0x38,0x00,0x00,0x01,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x03,0x04,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e, -0x02,0x35,0x34,0x2e,0x02,0x03,0xe7,0xa9,0xab,0x32,0x51,0x3a,0x20,0x19,0x36,0x55,0x3c,0x72,0xa7,0x6e,0x36,0x4a,0x88,0xc0,0x77,0x6d,0xb5,0x83,0x49,0xd3,0xcc,0xee,0x36,0x65,0x91,0x5a,0xa6,0xbf,0xfe,0x92,0x2f,0x57,0x7a,0x4b,0x4f,0x7f,0x59,0x30,0x22,0x4a,0x75,0x05,0xbe,0xb7,0x65,0x12,0x21,0x2f,0x1d,0x18,0x31,0x36,0x3e,0x24, -0x45,0x7c,0x81,0x8f,0x5a,0x75,0xbb,0x83,0x47,0x46,0x7f,0xb1,0x6c,0x9c,0x01,0x01,0x58,0x93,0xa3,0x40,0x63,0x44,0x23,0xfd,0x75,0x95,0xfe,0xec,0x4f,0x7e,0x59,0x30,0x32,0x5d,0x82,0x50,0x3b,0x68,0x63,0x62,0x00,0x02,0x00,0xbc,0x00,0x00,0x05,0x0c,0x05,0x9a,0x00,0x05,0x00,0x09,0x00,0x00,0x21,0x21,0x11,0x33,0x11,0x21,0x05,0x23, -0x11,0x33,0x05,0x0c,0xfd,0x18,0xa8,0x02,0x40,0xfc,0x58,0xa8,0xa8,0x05,0x9a,0xfa,0xfe,0x98,0x05,0x9a,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x26,0x05,0xec,0x00,0x13,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x03,0x26,0x88,0xa4,0xb0,0xa4,0x88,0x88,0xa4,0xb0, -0xa4,0x88,0x04,0xb2,0xfb,0x4e,0x04,0xb2,0xfb,0x4e,0x04,0xb2,0x86,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x01,0x00,0x81,0xff,0xe9,0x04,0x4b,0x05,0xee,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x17,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27, -0x03,0x8d,0x5a,0x64,0x43,0x7d,0xb1,0x6e,0x77,0xb7,0x7d,0x40,0x3b,0x62,0x7d,0x42,0x80,0x3e,0x6c,0x50,0x2e,0x2a,0x51,0x75,0x4b,0x43,0x6d,0x4e,0x2b,0x38,0x33,0x03,0x9b,0x43,0xda,0x8d,0x75,0xbf,0x89,0x4b,0x56,0xa4,0xf0,0x9b,0x92,0x01,0x11,0xea,0xb9,0x3a,0x6b,0x40,0x9e,0xc2,0xe8,0x8b,0x6c,0xb7,0x84,0x4b,0x36,0x5e,0x82,0x4c, -0x60,0x96,0x32,0x00,0x00,0x01,0x00,0x77,0xff,0xe8,0x03,0xaa,0x05,0xf1,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x17,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x02,0xf1,0x58,0x61,0x33,0x61,0x8c,0x5a,0x6c,0xa5,0x6f,0x39,0x3b,0x61, -0x7c,0x42,0x78,0x3e,0x6c,0x50,0x2e,0x25,0x47,0x66,0x41,0x31,0x4d,0x34,0x1c,0x38,0x33,0x03,0x96,0x42,0xd8,0x8c,0x75,0xbf,0x89,0x4b,0x56,0xa5,0xf0,0x9b,0x93,0x01,0x13,0xeb,0xb9,0x39,0x65,0x40,0x9f,0xc4,0xec,0x8d,0x6e,0xbb,0x88,0x4d,0x37,0x62,0x86,0x4e,0x61,0x98,0x33,0x00,0x00,0x02,0x00,0x06,0xff,0xe7,0x04,0x96,0x05,0x9a, -0x00,0x1a,0x00,0x29,0x00,0x00,0x01,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x01,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x26,0x04,0x96,0xfe,0x45,0x3c,0x70,0x71,0x76,0x41,0x3b,0x5f,0x43,0x24,0x42,0x6e,0x8d,0x4b,0x30,0x2f,0xfe,0x4f,0xbf, -0x01,0x58,0x05,0x12,0x0e,0x05,0x01,0x65,0xfd,0x96,0x2e,0x4a,0x35,0x1d,0x3a,0x35,0x18,0x35,0x3c,0x42,0x24,0x43,0x05,0x9a,0xfc,0x17,0x87,0xb0,0x69,0x2a,0x26,0x44,0x5e,0x37,0x48,0x6f,0x4b,0x26,0x06,0x03,0x92,0xfd,0x02,0x0a,0x2e,0x25,0x03,0x5b,0xfb,0xea,0x15,0x26,0x35,0x20,0x3b,0x3c,0x19,0x38,0x5c,0x44,0x16,0x00,0x00,0x02, -0xff,0xbd,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x00,0x19,0x00,0x29,0x00,0x00,0x01,0x01,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x01,0x33,0x01,0x17,0x33,0x36,0x36,0x37,0x01,0x01,0x22,0x0e,0x02,0x15,0x14,0x33,0x32,0x3e,0x02,0x37,0x37,0x26,0x22,0x03,0xd5,0xfe,0x29,0x7e,0xe4,0x32,0x52,0x3b,0x20,0x43,0x6f, -0x8f,0x4b,0x14,0x25,0x13,0xfe,0x79,0xb6,0x01,0x15,0x15,0x06,0x02,0x0a,0x08,0x01,0x23,0xfe,0x08,0x2e,0x4c,0x36,0x1e,0x49,0x12,0x2a,0x2b,0x28,0x0f,0x22,0x0e,0x1e,0x04,0x00,0xfb,0x5c,0xfe,0xc2,0x1b,0x36,0x51,0x36,0x48,0x6f,0x4a,0x26,0x02,0x02,0x03,0xe7,0xfc,0xec,0x4e,0x0c,0x26,0x1a,0x03,0x16,0xfb,0x93,0x15,0x25,0x35,0x20, -0x58,0x12,0x25,0x38,0x25,0x51,0x02,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x05,0x8c,0x05,0xb2,0x00,0x18,0x00,0x2d,0x00,0x00,0x01,0x3e,0x03,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x15,0x23,0x11,0x33,0x11,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x01,0x64, -0x27,0x70,0x7c,0x7e,0x35,0x85,0xe0,0xa2,0x5b,0x67,0xb0,0xea,0x82,0x42,0x7c,0x6c,0x5a,0x21,0xa8,0xa8,0x16,0x65,0x7c,0x84,0x35,0x5d,0xa5,0x7d,0x49,0x40,0x76,0xa5,0x66,0x33,0x82,0x7d,0x69,0x1c,0x04,0xab,0x4a,0x65,0x3d,0x1b,0x6a,0xc3,0xfe,0xeb,0xab,0xa9,0xfe,0xf1,0xbf,0x66,0x22,0x3b,0x4d,0x2b,0xbd,0x05,0x9a,0xfc,0x6d,0x6e, -0x96,0x5c,0x28,0x4e,0x96,0xd9,0x8c,0x8a,0xdc,0x9a,0x52,0x27,0x5c,0x98,0x70,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x40,0x04,0x18,0x00,0x31,0x00,0x3a,0x00,0x00,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x17,0x0e,0x03,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e, -0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x0a,0x04,0xaf,0x9b,0x3c,0x79,0x6b,0x52,0x15,0x6a,0x03,0x18,0x2d,0x45,0x30,0x28,0x46,0x3b,0x32,0x15,0x4a,0x1e,0x4d,0x56,0x5c,0x2d,0x54,0x7a,0x1b,0x29,0x67,0x75,0x7d,0x3f,0x75,0xb7,0x7e,0x42,0x49,0x7f,0xad,0x63,0x65,0x9d,0x6b,0x38,0xa8,0x01, -0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x12,0x39,0x6a,0x57,0x1b,0x1f,0x43,0x37,0x24,0x23,0x3d,0x51,0x2e,0x23,0x57,0x7f,0x54,0x29,0x67,0x62,0x45,0x5c,0x38,0x17,0x47,0x89,0xc6,0x7e,0x77,0xc7,0x8f,0x4f,0x43,0x7f,0xb6,0x73,0x56,0x8b,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x00,0x01,0x00,0x78,0xff,0xee,0x02,0x8e, -0x05,0xfe,0x00,0x25,0x00,0x00,0x37,0x16,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x0e,0x03,0x23,0x22,0x27,0x78,0x2b,0x51,0x69,0x47,0x22,0x24,0x24,0x22,0x47,0x69,0x51,0x2b,0x24,0x3e,0x2d,0x51,0x46,0x36,0x12,0x04,0xa4,0xa4, -0x04,0x12,0x36,0x46,0x51,0x2d,0x3e,0x24,0xa6,0x21,0x63,0x30,0x81,0x53,0x02,0x14,0x52,0x82,0x30,0x63,0x21,0xaa,0x0e,0x1f,0x3b,0x55,0x36,0xd3,0xfa,0x14,0xd3,0x36,0x55,0x3b,0x1f,0x0e,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x13,0x00,0x2f,0x00,0x3e,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32, -0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x35,0x34,0x26,0x03,0x22,0x0e,0x02,0x15,0x14,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x02,0x52,0x71,0xb8,0x82,0x47,0x49,0x88,0xc1,0x78,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f, -0x59,0x30,0x4d,0x46,0x06,0x1f,0x38,0x4d,0x2d,0x2c,0x4a,0x36,0x1f,0x07,0x3e,0x40,0xaa,0x9f,0x18,0x29,0x1e,0x11,0x70,0x19,0x2b,0x1f,0x11,0x41,0x18,0x4b,0x8a,0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x73,0xab,0x31,0x18,0x1b,0x2d,0x49,0x34,0x1c,0x1d,0x33,0x46,0x2a, -0x1c,0x16,0x31,0xa7,0x74,0xc1,0xcf,0xfd,0xc5,0x11,0x1f,0x29,0x18,0x70,0x11,0x1e,0x29,0x18,0x31,0x40,0x00,0x01,0x00,0x49,0x00,0x00,0x02,0xc0,0x04,0x33,0x00,0x0b,0x00,0x00,0x37,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x49,0x01,0xd3,0xfe,0x6b,0x01,0x95,0xfe,0x49,0x02,0x5b,0xfd,0x89,0x8b,0x01,0x52,0x8b,0x01, -0x40,0x8b,0xfb,0xcd,0x00,0x02,0x00,0x06,0xfd,0xe3,0x01,0x4a,0x02,0x13,0x00,0x0d,0x00,0x19,0x00,0x00,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x27,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x40,0x74,0x6e,0x15,0x2c,0x17,0x3a,0x20,0x6a,0x76,0x3f,0x1d,0x2a,0x2a,0x1d,0x1e,0x2b, -0x2b,0xf7,0x8f,0x97,0x0b,0x0a,0x72,0x25,0xb5,0x02,0x19,0x76,0x28,0x1e,0x1d,0x27,0x27,0x1d,0x1d,0x29,0x00,0x01,0x00,0x1c,0x02,0x9a,0x02,0xdb,0x05,0xa3,0x00,0x08,0x00,0x00,0x01,0x01,0x23,0x01,0x33,0x13,0x17,0x37,0x13,0x02,0xdb,0xfe,0xd7,0x79,0xfe,0xe3,0x83,0xcf,0x0a,0x0a,0xd9,0x05,0xa3,0xfc,0xf7,0x03,0x09,0xfd,0xb7,0x2f, -0x2e,0x02,0x4a,0x00,0x00,0x01,0x00,0x79,0xfe,0x92,0x03,0xde,0x05,0xb2,0x00,0x49,0x00,0x00,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x26,0x27,0x26,0x26,0x27,0x35,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03, -0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x17,0x1e,0x03,0x33,0x32,0x36,0x37,0x03,0xab,0x23,0x5b,0x38,0x32,0x5f,0x53,0x42,0x15,0x41,0x8c,0x23,0x3d,0x14,0x22,0x5f,0x69,0x6a,0x2d,0x9c,0x98,0x27,0x53,0x7e,0x57,0x4b,0x82,0x60,0x37,0x56,0x8c,0xb3,0x5d,0xd3,0x62,0x7f,0xc7,0x38,0x6d,0x56,0x36,0x29,0x50,0x73,0x4b,0x4d,0x8a,0x68,0x3d, -0x4d,0x83,0xac,0x5f,0x13,0x1d,0x0b,0x0f,0x2c,0x33,0x38,0x1a,0x2c,0x56,0x2b,0xfe,0xb9,0x14,0x13,0x15,0x2b,0x40,0x2b,0x83,0x4a,0x0a,0x18,0x0e,0xc6,0x1e,0x30,0x21,0x12,0x71,0x6d,0x37,0x4f,0x45,0x45,0x2d,0x27,0x4d,0x5e,0x77,0x50,0x62,0x90,0x5f,0x2e,0x33,0xbd,0x58,0x17,0x34,0x52,0x3b,0x37,0x50,0x42,0x3e,0x25,0x26,0x54,0x66, -0x7d,0x4f,0x64,0x8e,0x5d,0x2e,0x04,0x11,0x28,0x17,0x1d,0x2c,0x1d,0x0f,0x14,0x15,0x00,0x01,0x00,0x21,0xfe,0x8b,0x04,0x64,0x05,0x9a,0x00,0x1c,0x00,0x00,0x01,0x01,0x1e,0x03,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x27,0x2e,0x03,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xbd,0x3a,0x6d,0x60,0x54,0x23, -0x4e,0x75,0x32,0x29,0x43,0x28,0x40,0x69,0xaa,0xaa,0x2b,0x51,0x54,0x59,0x33,0xae,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x2e,0x0c,0x30,0x3e,0x48,0x24,0x51,0x50,0x14,0x15,0x91,0x26,0xba,0x2e,0x47,0x2e,0x18,0x2f,0x04,0xd3,0x98,0x00,0x01,0x00,0x70,0xff,0xea,0x01,0x50,0x01,0xcf,0x00,0x17,0x00,0x00,0x17,0x22,0x2e,0x02, -0x35,0x34,0x3e,0x02,0x37,0x17,0x0e,0x03,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0xdf,0x17,0x28,0x1e,0x12,0x1b,0x24,0x26,0x0b,0x66,0x0b,0x16,0x13,0x10,0x06,0x24,0x30,0x12,0x1f,0x29,0x16,0x12,0x1e,0x29,0x17,0x20,0x67,0x6e,0x63,0x1d,0x13,0x19,0x3c,0x41,0x41,0x1e,0x0a,0x3d,0x26,0x17,0x29,0x1e,0x12,0x00,0x01,0x00,0x70,0x00,0xf8, -0x01,0x50,0x01,0xd9,0x00,0x13,0x00,0x00,0x37,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0xdf,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0xf8,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x01,0x00,0x27,0xff,0xd4, -0x01,0x3c,0x01,0xc0,0x00,0x03,0x00,0x00,0x01,0x03,0x23,0x13,0x01,0x3c,0xa0,0x75,0x75,0x01,0xc0,0xfe,0x14,0x01,0xec,0x00,0x00,0x02,0x00,0x6f,0xff,0xea,0x01,0x9a,0x05,0x08,0x00,0x13,0x00,0x17,0x00,0x00,0x37,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x03,0x13,0x33,0x03,0xdf,0x17,0x29,0x1e, -0x12,0x12,0x1e,0x29,0x17,0x17,0x29,0x1e,0x12,0x12,0x1e,0x29,0x43,0xa0,0x75,0x75,0xc8,0x12,0x1e,0x29,0x17,0x18,0x28,0x1d,0x11,0x11,0x1e,0x28,0x17,0x17,0x29,0x1e,0x12,0x02,0x54,0x01,0xec,0xfe,0x14,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x01,0xda,0x05,0x99,0x00,0x09,0x00,0x00,0x25,0x23,0x03,0x05,0x35,0x05,0x03,0x33,0x03,0x33, -0x01,0xaa,0x4c,0x28,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x30,0xe5,0x02,0xb6,0x1e,0x96,0x14,0x01,0x9a,0xfe,0x66,0x00,0x01,0x01,0x2e,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x09,0x00,0x00,0x01,0x33,0x03,0x33,0x03,0x25,0x15,0x25,0x03,0x23,0x01,0x2e,0x30,0x28,0x9c,0x28,0x01,0x2e,0xfe,0xfa,0x28,0x4c,0x03,0xff,0x01,0x9a,0xfe,0x66, -0x14,0x96,0x1e,0xfd,0x4a,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x0b,0x00,0x00,0x01,0x25,0x13,0x23,0x13,0x05,0x35,0x05,0x13,0x33,0x13,0x25,0x02,0xd8,0xfe,0xd2,0x28,0x9c,0x28,0xfe,0xd2,0x01,0x06,0x28,0x4c,0x28,0x01,0x06,0x02,0x6b,0x14,0xfe,0x66,0x01,0x9a,0x14,0x96,0x1e,0x02,0xb6,0xfd,0x4a,0x1e,0x00, -0x00,0x02,0x00,0x83,0x01,0x31,0x03,0x27,0x05,0xd3,0x00,0x1f,0x00,0x2d,0x00,0x00,0x01,0x26,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x1e,0x02,0x17,0x16,0x15,0x14,0x06,0x07,0x01,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x35,0x34,0x2e,0x02,0x02,0x1e,0x18,0x5d,0x3d,0xe9, -0x93,0x6a,0x31,0x5a,0x7d,0x4c,0x84,0x57,0x65,0x7a,0xa8,0x0d,0x32,0x61,0x54,0xdf,0x3d,0x39,0xfe,0xdd,0x65,0x1a,0x3c,0x61,0x47,0x58,0x18,0x38,0x5d,0x01,0x31,0x13,0x3c,0x20,0x7a,0xc3,0xa3,0x51,0x52,0x8d,0x40,0x6b,0x4d,0x2b,0x2b,0x9e,0x3e,0x90,0x1c,0x2f,0x32,0x3a,0x28,0x6a,0xbb,0x4c,0x7b,0x35,0x01,0xd1,0x33,0x6c,0x25,0x3d, -0x39,0x39,0x20,0x43,0x69,0x24,0x3b,0x36,0x35,0x00,0x00,0x01,0x00,0x00,0x01,0xfa,0x0b,0xf2,0x02,0x7b,0x00,0x03,0x00,0x00,0x01,0x21,0x35,0x21,0x0b,0xf2,0xf4,0x0e,0x0b,0xf2,0x01,0xfa,0x81,0x00,0x00,0x01,0x00,0x00,0x01,0xfa,0x0f,0xfe,0x02,0x7b,0x00,0x03,0x00,0x00,0x01,0x21,0x35,0x21,0x0f,0xfe,0xf0,0x02,0x0f,0xfe,0x01,0xfa, -0x81,0x00,0x00,0x01,0x00,0x25,0x06,0x12,0x02,0x7d,0x09,0x46,0x00,0x1f,0x00,0x00,0x01,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x1e,0x03,0x33,0x32,0x36,0x37,0x02,0x7d,0x5c,0x85,0x55,0x8a,0x62,0x36,0x3a,0x67,0x8f,0x56,0x74,0x5e,0x6b,0x68,0x6b,0x8d,0x0e,0x01, -0x54,0xfe,0xac,0x06,0x2a,0x42,0x58,0x35,0x39,0x6d,0x34,0x06,0x44,0x32,0x3a,0x68,0x92,0x58,0x60,0x9c,0x6f,0x3d,0x25,0x7c,0x38,0x83,0x7b,0x69,0x39,0x5d,0x42,0x23,0x1f,0x21,0x00,0x01,0x00,0x5b,0x06,0x20,0x02,0xe6,0x09,0x3a,0x00,0x09,0x00,0x00,0x01,0x23,0x11,0x01,0x23,0x11,0x33,0x11,0x01,0x33,0x02,0xe6,0x78,0xfe,0x76,0x89, -0x78,0x01,0x87,0x8c,0x06,0x20,0x02,0x64,0xfd,0x9c,0x03,0x1a,0xfd,0x9e,0x02,0x62,0x00,0x03,0xff,0xda,0x06,0x1f,0x01,0x31,0x09,0x2f,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x00,0x13,0x23,0x11,0x33,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x76, -0x76,0x2c,0x1b,0x28,0x27,0x1b,0x1d,0x27,0x26,0xeb,0x1d,0x29,0x28,0x1c,0x1c,0x29,0x28,0x06,0x1f,0x02,0x3e,0x51,0x24,0x1c,0x1c,0x25,0x25,0x1c,0x1b,0x25,0x26,0x1a,0x1c,0x25,0x25,0x1c,0x1b,0x25,0x00,0x01,0xff,0xf7,0x05,0x1c,0x02,0x26,0x08,0x5d,0x00,0x14,0x00,0x00,0x01,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32, -0x36,0x37,0x37,0x26,0x02,0x27,0x33,0x13,0x13,0x02,0x26,0xfe,0xfc,0x22,0x68,0x41,0x12,0x24,0x12,0x2b,0x17,0x1b,0x2e,0x0e,0x2a,0x35,0x70,0x36,0x80,0x97,0x9e,0x08,0x5d,0xfd,0x72,0x55,0x5e,0x05,0x06,0x68,0x0f,0x25,0x23,0x65,0x89,0x01,0x1e,0x89,0xfe,0x53,0x01,0xad,0x00,0x02,0x00,0x0c,0x06,0x1f,0x02,0xe6,0x09,0x39,0x00,0x0e, -0x00,0x16,0x00,0x00,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0xea,0xde,0x01,0x55,0x84,0x79,0x88,0x25,0x45,0x62,0x3d,0x7c,0x71,0x48,0x50,0x98,0x06,0x1f,0x02,0xb0,0x6a,0xfe,0xb9,0x74,0x6e,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x44,0x3e,0x7f,0x00,0x03, -0x00,0x5b,0x06,0x1f,0x03,0x0c,0x09,0x39,0x00,0x03,0x00,0x10,0x00,0x18,0x00,0x00,0x01,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x03,0x0c,0x77,0x77,0xfd,0x4f,0x78,0x83,0x7a,0x88,0x25,0x45,0x62,0x3d,0x7c,0x71,0x48,0x50,0x98,0x06,0x1f,0x03,0x1a,0xfc, -0xe6,0x03,0x1a,0xfe,0xb9,0x75,0x6d,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x43,0x3f,0x7f,0x00,0x02,0x00,0x5a,0x06,0x1f,0x02,0x57,0x09,0x39,0x00,0x0c,0x00,0x14,0x00,0x00,0x13,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x5a,0x78,0x83,0x7a,0x88,0x25,0x45,0x62,0x3d,0x7c, -0x71,0x48,0x50,0x98,0x06,0x1f,0x03,0x1a,0xfe,0xb9,0x75,0x6d,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x43,0x3f,0x7f,0x00,0x00,0x01,0x00,0x1e,0x06,0x1f,0x03,0xd5,0x09,0x39,0x00,0x2d,0x00,0x00,0x01,0x2e,0x05,0x27,0x33,0x1e,0x03,0x17,0x13,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x3e,0x05,0x37,0x33,0x0e,0x05,0x07,0x23,0x26,0x26, -0x27,0x03,0x01,0x19,0x2b,0x41,0x31,0x24,0x1c,0x14,0x0a,0x79,0x0c,0x20,0x2b,0x38,0x26,0x6b,0x0c,0x12,0x0f,0x0d,0x06,0x78,0x0d,0x1f,0x2b,0x39,0x26,0x1a,0x2a,0x23,0x1c,0x18,0x14,0x09,0x78,0x09,0x15,0x1b,0x24,0x32,0x40,0x2b,0x6b,0x2a,0x3f,0x18,0x68,0x06,0x1f,0x53,0x89,0x7b,0x73,0x7a,0x86,0x50,0x6c,0xa7,0x90,0x89,0x4f,0x01, -0x11,0x28,0x52,0x59,0x60,0x37,0x6e,0xa6,0x91,0x89,0x51,0x36,0x5f,0x5d,0x5f,0x6a,0x7a,0x4a,0x51,0x86,0x7a,0x74,0x7a,0x89,0x52,0x51,0x83,0x3c,0xfe,0xf0,0x00,0x01,0x00,0x5c,0x06,0x12,0x03,0xfb,0x09,0x46,0x00,0x27,0x00,0x00,0x01,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x16,0x17, -0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x1e,0x03,0x33,0x32,0x36,0x37,0x03,0xfb,0x5e,0x84,0x50,0x84,0x61,0x3a,0x06,0xcf,0x79,0x79,0xd1,0x09,0x40,0x66,0x86,0x4e,0x3b,0x68,0x2f,0x6d,0x66,0x6c,0x8d,0x0d,0x01,0x53,0xfe,0xac,0x06,0x2a,0x42,0x58,0x35,0x39,0x6d,0x35,0x06,0x44,0x32,0x33,0x5e,0x83,0x50,0xfe,0xa9,0x03,0x1a, -0xfe,0xa6,0x52,0x85,0x5d,0x33,0x13,0x12,0x7c,0x38,0x83,0x7b,0x69,0x39,0x5d,0x42,0x23,0x1f,0x21,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x71,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28, -0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xc8,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02, -0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfd,0xa3,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23, -0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfb,0xe1,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64, -0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfa,0x1f,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f, -0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64,0xff,0xf1,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12, -0x12,0x1f,0x29,0x07,0x58,0xf8,0x99,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x71,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01, -0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x06,0x90,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34, -0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x04,0xfb,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03, -0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x03,0x39,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29, -0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x01,0x77, -0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0xff,0xf1,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29, -0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x0f,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x05,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x02,0xc9,0x06,0xd4,0xf9,0x2c,0x07,0x58,0x00, -0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x94,0x02,0x35,0x05,0x1f,0xfa,0xe1,0x07,0x58,0xfe,0x4b,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb, -0x94,0x94,0x02,0x35,0x03,0x6a,0xfc,0x96,0x07,0x58,0xfc,0x96,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x94,0x02,0x35,0x01,0xb5,0xfe,0x4b,0x07,0x58,0xfa,0xe1,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x05,0x00,0x00, -0x13,0x33,0x11,0x21,0x15,0x21,0x96,0x94,0x02,0x35,0xfd,0x37,0x07,0x58,0xf9,0x2c,0x84,0x00,0x00,0x04,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0e,0x00,0x26,0x00,0x3a,0x00,0x46,0x00,0x5f,0xb9,0x00,0x0e,0x01,0x43,0xb2,0x07,0x0d,0x36,0xbb,0x01,0x43,0x00,0x20,0x00,0x16,0x01,0x43,0x40,0x0c,0x2c,0x0d,0x20,0x2c,0x2c,0x20, -0x0d,0x03,0x3b,0x41,0x3b,0x44,0xbc,0x01,0x42,0x00,0x3e,0x01,0x41,0x00,0x27,0x01,0x44,0xb2,0x1b,0x07,0x31,0xb8,0x01,0x44,0x40,0x0c,0x0f,0x19,0x0e,0x18,0x04,0x0c,0x01,0x0c,0x06,0x07,0x00,0x07,0x00,0x3f,0xde,0xce,0x33,0x5d,0x3f,0x3f,0xe6,0x3f,0xe6,0x3f,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe6,0x10,0xe6, -0x10,0xcd,0xe6,0x30,0x31,0x01,0x23,0x0e,0x03,0x07,0x15,0x3e,0x03,0x37,0x11,0x33,0x05,0x32,0x3e,0x04,0x35,0x34,0x02,0x26,0x26,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x1e,0x04,0x13,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x04,0x2f, -0x7a,0x26,0x68,0x75,0x79,0x36,0x30,0x65,0x5b,0x49,0x13,0xe0,0x02,0x8f,0x64,0x8f,0x62,0x3b,0x20,0x0a,0x2c,0x61,0x9d,0x70,0x75,0xa8,0x6c,0x33,0x0f,0x24,0x3c,0x5c,0x7e,0x6a,0x3a,0x4a,0x2b,0x10,0x11,0x2c,0x4d,0x3b,0x3c,0x4e,0x2d,0x12,0x12,0x2f,0x50,0xfa,0x1d,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe, -0x1b,0xfd,0x49,0x05,0xba,0x21,0x45,0x3f,0x33,0x0f,0xce,0x0c,0x2a,0x30,0x31,0x13,0xfb,0x51,0x18,0x45,0x73,0x98,0xa6,0xa9,0x4c,0xb8,0x01,0x13,0xb8,0x5c,0x62,0xc2,0xfe,0xe0,0xbe,0x58,0xae,0x9f,0x87,0x64,0x38,0x05,0x0d,0x46,0x8d,0xd3,0x8d,0x87,0xcc,0x87,0x44,0x42,0x85,0xc8,0x85,0x8f,0xd7,0x8f,0x48,0xfd,0xd8,0x01,0xe5,0x02, -0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x04,0x08,0x05,0x9a,0x00,0x1a,0x00,0x27,0x00,0x5c,0x40,0x35,0x76,0x15,0x01,0x59,0x22,0x69,0x22,0x89,0x22,0x03,0x22,0x15,0x29,0x05,0x01,0x1c,0x09,0x0d,0x0b,0x06,0x0f,0x07,0x03,0x02,0x0a,0x02,0x0b,0x1a,0x1d,0x0e,0x1d,0x2f,0x02,0x6f, -0x02,0x7f,0x02,0xbf,0x02,0x04,0x2f,0x1d,0x01,0x02,0x1d,0x02,0x1d,0x05,0x27,0x0f,0x06,0x05,0x18,0x00,0x3f,0x3f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10,0xcd,0x32,0x11,0x33,0x10,0xcd,0x32,0x01,0x2f,0x33,0x33,0xce,0x32,0xcd,0x32,0x32,0x10,0xde,0xcd,0x5d,0x5d,0x30,0x31,0x01,0x15,0x21,0x15,0x21,0x11,0x23,0x11, -0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x01,0x5b,0x01,0x82,0xfe,0x7e,0xa4,0x77,0x77,0x77,0x77,0x01,0x84,0x5c,0xa7,0x7f,0x4b,0x43,0x80,0xb8,0x76,0xbc,0xa7,0x57,0x85,0x5b,0x2e,0x2a,0x54,0x7e,0x54,0x02,0x7f,0xcf,0x8b,0xfe, -0xdb,0x01,0x25,0x8b,0xcf,0x8b,0x02,0x90,0x2f,0x60,0x92,0x63,0x66,0x98,0x66,0x33,0x02,0x90,0xfd,0xfb,0x1b,0x3d,0x64,0x48,0x47,0x62,0x3d,0x1b,0x00,0x01,0x00,0x32,0x00,0x00,0x05,0xe6,0x05,0x9a,0x00,0x27,0x00,0x57,0x40,0x35,0x67,0x25,0x01,0x00,0x12,0x25,0x13,0x13,0x1e,0x0a,0x0f,0x07,0x3f,0x07,0x02,0x07,0x29,0x1b,0x5f,0x1e, -0x6f,0x1e,0x8f,0x1e,0xaf,0x1e,0x04,0x1e,0x78,0x11,0x88,0x11,0x02,0x11,0x5b,0x14,0x01,0x3a,0x14,0x4a,0x14,0x02,0x14,0x00,0x25,0x25,0x13,0x27,0x06,0x1c,0x09,0x13,0x18,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x2f,0x33,0xcd,0x5d,0x5d,0x32,0x5d,0x01,0x2f,0x5d,0xcd,0x10,0xde,0x5d,0xcd,0x12,0x39,0x2f,0x33,0xcd,0x32,0x00,0x5d,0x30, -0x31,0x01,0x1e,0x04,0x12,0x15,0x15,0x23,0x35,0x34,0x2e,0x04,0x27,0x11,0x23,0x11,0x0e,0x05,0x15,0x15,0x23,0x35,0x34,0x12,0x3e,0x03,0x37,0x11,0x33,0x03,0x5e,0x55,0xa3,0x90,0x78,0x57,0x31,0xa4,0x27,0x45,0x5d,0x6c,0x75,0x3a,0xa4,0x39,0x73,0x6c,0x5e,0x46,0x28,0xa4,0x32,0x58,0x7a,0x90,0xa1,0x53,0xa4,0x04,0x6d,0x09,0x39,0x65, -0x95,0xcd,0xfe,0xf9,0xa5,0xb8,0xbf,0x91,0xe3,0xac,0x79,0x51,0x2c,0x09,0xfc,0x22,0x03,0xe0,0x08,0x2a,0x4f,0x7a,0xad,0xe5,0x94,0xbf,0xb8,0xa8,0x01,0x0b,0xce,0x95,0x63,0x35,0x08,0x01,0x2c,0x00,0x00,0x16,0x00,0x26,0x00,0x00,0x07,0x15,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23, -0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x57,0x00,0x5c,0x00,0x62,0x00,0x7c,0x00,0x00,0x13,0x35,0x33,0x15,0x23,0x15,0x03,0x35,0x33,0x15,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x13,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23, -0x35,0x33,0x35,0x23,0x35,0x33,0x25,0x35,0x33,0x15,0x23,0x35,0x03,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x23,0x27,0x23,0x07,0x23,0x13,0x33,0x13,0x27,0x27,0x15,0x07,0x05,0x21,0x11,0x33,0x11, -0x33,0x05,0x23,0x11,0x34,0x34,0x37,0x03,0x23,0x03,0x15,0x11,0x23,0x11,0x33,0x13,0x16,0x16,0x17,0x36,0x37,0x3e,0x03,0x37,0x33,0x26,0xeb,0x96,0x55,0x55,0x96,0x5b,0xd3,0xd3,0xd3,0x5e,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0xfd,0x0d,0x55,0x55,0x55,0x55,0x05,0xae,0xec,0x56,0x96,0x96,0x56,0xfd,0xe6,0xd2,0x01,0x48,0x56,0x56, -0x56,0x56,0xfc,0xb7,0xd1,0xd1,0xd1,0x5e,0xd2,0x01,0x48,0x56,0x56,0xfb,0x91,0x50,0x35,0xc6,0x32,0x50,0xc2,0x48,0x28,0x4d,0x01,0x4b,0x02,0x7d,0xfe,0xed,0x4a,0xc9,0x02,0x4a,0x4b,0x01,0xa9,0x28,0xaa,0x48,0x5b,0x9a,0x08,0x04,0x05,0x0a,0x08,0x12,0x28,0x29,0x28,0x12,0x58,0x04,0xd4,0xec,0x55,0x97,0xfb,0x2c,0xeb,0x95,0x56,0x56, -0x56,0x05,0x6b,0x55,0x55,0xfa,0x95,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xf3,0x55,0xec,0x97,0xfa,0x95,0x56,0x95,0xeb,0x56,0x56,0x01,0x48,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x05,0x6b,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0xfe,0xb6,0x8c,0x8c,0x01,0xfb,0xfe,0xce,0xcf,0x02,0x02,0xcf,0xc9, -0x01,0xfb,0xfe,0x42,0x3d,0x01,0x53,0x09,0x14,0x0b,0xfe,0x85,0x01,0x7b,0x29,0xfe,0xae,0x01,0xfb,0xfe,0xa2,0x12,0x0f,0x09,0x1b,0x10,0x28,0x59,0x5c,0x59,0x27,0x00,0x00,0x01,0x00,0xbc,0xfe,0x96,0x06,0x72,0x05,0x9a,0x00,0x26,0x00,0x1f,0x40,0x10,0x0e,0x16,0x21,0x03,0x1c,0x1d,0x03,0x08,0x03,0x03,0x1c,0x12,0x12,0x12,0x00,0x03, -0x00,0x3f,0x3f,0x3f,0x33,0x2f,0x33,0x3f,0x12,0x17,0x39,0x30,0x31,0x01,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x06,0x72,0xfe,0xaf,0x3f,0x39,0x32,0x3e,0xb2,0x07,0x07,0x04, -0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x14,0x17,0x04,0x04,0x04,0xa2,0xde,0x01,0xb8,0x33,0x0f,0x06,0x16,0x22,0x0d,0x01,0xc1,0x05,0x9a,0xfa,0x9b,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x03,0x8d,0x39,0x8b,0x53,0x63,0x28,0xfb,0xb2,0x04,0x46,0x2e,0x65,0x2b,0x8c,0x62,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x74,0x38,0x3c,0x57,0x1d,0x03,0xe4, -0x00,0x02,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x07,0x00,0x11,0x00,0x1a,0x40,0x0c,0x11,0x0d,0x06,0x02,0x02,0x01,0x06,0x12,0x04,0x03,0x01,0x03,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x30,0x31,0x13,0x33,0x13,0x21,0x13,0x33,0x01,0x23,0x03,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x16,0xba,0x98,0x02, -0x60,0x8f,0xbb,0xfd,0xda,0xae,0x9f,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfe,0x6e,0x01,0x92,0xfa,0x66,0x03,0x71,0xfd,0x9d,0x0f,0x30,0x21,0x1f,0x30,0x11,0x02,0x63,0xff,0xff,0x00,0x60,0xfe,0x96,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x08,0x5d,0x02,0x89,0x00,0x00,0xff,0xff,0x00,0xa6, -0xfe,0x96,0x04,0x91,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x00,0x07,0x08,0x5d,0x03,0xba,0x00,0x00,0x00,0x03,0x00,0x6e,0x00,0x00,0x05,0x5b,0x05,0x9a,0x00,0x2a,0x00,0x32,0x00,0x3c,0x00,0x29,0x40,0x15,0x1f,0x35,0x91,0x2b,0x13,0x91,0x01,0x01,0x2b,0x0a,0x2b,0x0a,0x00,0x3c,0x91,0x14,0x03,0x2c,0x91,0x00,0x12,0x00,0x3f,0xed, -0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x2f,0xed,0x10,0xed,0x39,0x30,0x31,0x21,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x3e, -0x02,0x35,0x34,0x21,0x01,0xe8,0x47,0x28,0x3b,0x27,0x13,0x06,0x05,0x98,0x09,0x28,0x4b,0x6a,0x41,0x5c,0x01,0x98,0x5d,0x95,0x69,0x39,0x22,0x40,0x5c,0x3a,0x48,0x75,0x54,0x2e,0x47,0x7c,0xab,0x63,0xfa,0xe4,0x95,0xa2,0xfe,0xa6,0xc1,0xac,0x45,0x6e,0x4c,0x29,0xfe,0xed,0x02,0x9c,0x17,0x25,0x31,0x1a,0x0f,0x2c,0x13,0x30,0x29,0x47, -0x67,0x44,0x20,0x02,0x68,0x30,0x57,0x78,0x49,0x3d,0x6b,0x58,0x41,0x13,0x04,0x08,0x38,0x5a,0x7a,0x4a,0x5c,0x98,0x6c,0x3c,0x02,0x9c,0xfd,0xfc,0x8b,0x7b,0xfe,0x02,0x66,0xfe,0x31,0x22,0x41,0x5f,0x3c,0xd1,0x00,0x02,0x00,0x75,0xfe,0xab,0x05,0x80,0x05,0xec,0x00,0x30,0x00,0x43,0x00,0x24,0x40,0x14,0x12,0x0f,0x21,0x03,0x15,0x23, -0x15,0x2d,0x96,0x05,0x36,0x95,0x1f,0x15,0x40,0x95,0x15,0x10,0x11,0x00,0x00,0x3f,0x3f,0xed,0x3f,0xed,0xdc,0xed,0x3f,0x12,0x17,0x39,0x30,0x31,0x05,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x23,0x15,0x23,0x11,0x0e,0x03,0x15,0x14, -0x16,0x33,0x32,0x36,0x37,0x03,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x03,0x4d,0x10,0x3c,0x4c,0x54,0x27,0x7d,0xac,0x6c,0x30,0x2b,0x57,0x83,0x58,0xa4,0x46,0x9f,0x5b,0x66,0xa9,0x78,0x43,0x40,0x79,0xad,0x6d,0xcc,0x67,0x04,0xa4,0x2f,0x44,0x2c,0x16,0x8d,0x98,0x3f,0x77,0x27,0xa9,0x2b,0x4e, -0x6b,0x40,0x4b,0x76,0x52,0x2b,0x22,0x50,0x83,0x61,0x4e,0x85,0x39,0xf7,0x12,0x22,0x1a,0x10,0x44,0x79,0xa9,0x65,0x4c,0xc0,0xc9,0xc3,0x4e,0x02,0x90,0xfd,0xe0,0x23,0x29,0x48,0x85,0xbb,0x72,0x7f,0xd1,0x94,0x52,0xac,0x94,0x02,0x9c,0x41,0x91,0x92,0x89,0x39,0xa8,0xae,0x1d,0x19,0x02,0x4c,0x3f,0x6f,0x52,0x30,0x3b,0x70,0x9f,0x65, -0x46,0x83,0x66,0x3d,0x2b,0x25,0x00,0x01,0xff,0x9a,0xfe,0x96,0x03,0x94,0x05,0x9a,0x00,0x15,0x00,0x20,0x40,0x10,0x14,0x91,0x01,0x01,0x09,0x91,0x06,0x06,0x02,0x11,0x91,0x0c,0x04,0x91,0x02,0x03,0x00,0x3f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x03,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x10, -0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x23,0x1f,0xdb,0x02,0xd8,0xfd,0xd0,0x01,0x20,0xfe,0xe0,0xfe,0xae,0x3f,0x39,0x32,0x3e,0xb2,0xdb,0x03,0x12,0x02,0x88,0x98,0xfe,0x10,0x97,0xfd,0xba,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x02,0x46,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x1d,0x00,0x33,0xb6,0x05, -0x95,0x08,0x08,0x02,0x95,0x1d,0xb8,0xff,0xc0,0x40,0x14,0x09,0x0c,0x48,0x1d,0x1d,0x03,0x1c,0x95,0x19,0x0f,0x16,0x95,0x11,0x00,0x09,0x95,0x0c,0x0f,0x03,0x15,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x30,0x31,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34, -0x37,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x15,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xaf,0x5d,0x5d,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0xf0,0x03,0x06,0x8c,0xfd,0x86,0x02,0x7a,0x8c,0x6e,0x8c,0xa6,0xa1,0x5d,0x5e,0x12,0x94,0x1b,0xd9,0x9e,0x8c,0x6e,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0x8e,0x05,0xb2, -0x00,0x21,0x00,0x3d,0x00,0x26,0x40,0x14,0x0f,0x36,0x92,0x35,0x35,0x00,0x21,0x03,0x1f,0x2d,0x91,0x1a,0x04,0x02,0x22,0x92,0x05,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e, -0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x01,0x32,0x3e,0x02,0x37,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x04,0x8e,0xa8,0x4e,0xd4,0x83,0x6c,0xb1,0x80,0x46,0x2d,0x54,0x77,0x4a,0x44,0x66,0x44,0x22,0x43,0x79,0xab,0x68,0x3b,0x70,0x64,0x56,0x22,0xa8,0xfd,0xbe,0x4d,0x7b,0x63, -0x4e,0x21,0x21,0x54,0x63,0x72,0x3f,0x47,0x69,0x46,0x23,0xae,0x9d,0xc2,0xbc,0x30,0x55,0x73,0x8c,0x4b,0x59,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x12,0x38,0x4f,0x6a,0x44,0x54,0x8b,0x63,0x37,0x14,0x23,0x31,0x1d,0x6d,0xfa,0xdd,0x27,0x40,0x52,0x2c,0x02,0xf3,0x2d,0x4b,0x36,0x1d,0x23,0x40,0x59,0x35,0x7e,0x80,0x8b, -0x8a,0x8a,0x3e,0x66,0x49,0x28,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0x97,0x04,0x19,0x00,0x1f,0x00,0x3d,0x00,0x26,0x40,0x14,0x0f,0x36,0x96,0x34,0x34,0x01,0x1f,0x0f,0x1d,0x2b,0x95,0x18,0x10,0x02,0x20,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06, -0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x01,0x32,0x3e,0x02,0x37,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x03,0x97,0xa4,0x3c,0x8d,0x5f,0x4f,0x85,0x61,0x36,0x24,0x42,0x5d,0x39,0x64, -0x6f,0x36,0x5d,0x7c,0x47,0x2e,0x52,0x45,0x39,0x16,0xa4,0xfe,0x54,0x24,0x4a,0x45,0x3e,0x17,0x16,0x38,0x41,0x48,0x25,0x37,0x4d,0x31,0x16,0x6d,0x7b,0x06,0x0b,0x4a,0x67,0x3f,0x1c,0x78,0x5d,0x34,0x41,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28,0x05,0x05,0x15,0x6c,0x5a,0x45,0x6d,0x4c,0x29,0x12,0x1c,0x23,0x12,0x4a,0xfc,0x71,0x10, -0x1e,0x2e,0x1e,0x02,0x28,0x1b,0x2d,0x21,0x12,0x19,0x2b,0x3c,0x22,0x51,0x4c,0x81,0x17,0x2c,0x42,0x2a,0x57,0x57,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x14,0x05,0xb2,0x00,0x1e,0x00,0x39,0x00,0x1c,0x40,0x0e,0x0a,0x28,0x92,0x27,0x27,0x00,0x1f,0x91,0x15,0x04,0x30,0x92,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39, -0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x02,0x6a,0x7b,0xc3,0x87,0x47,0x2d,0x54,0x77,0x4a,0x44,0x66,0x44, -0x22,0x44,0x80,0xb8,0x74,0x94,0xf3,0xae,0x5f,0x62,0xb3,0xfb,0x90,0x50,0x72,0x4b,0x23,0xae,0x9d,0xc2,0xbc,0x31,0x58,0x7a,0x4a,0x75,0xc0,0x87,0x4a,0x46,0x81,0xb7,0x18,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x12,0x38,0x4f,0x6a,0x44,0x54,0x8b,0x63,0x37,0x6a,0xbf,0xfe,0xf6,0xa0,0xaa,0xfe,0xe9,0xc8,0x6e,0x05,0x32, -0x23,0x40,0x59,0x35,0x7e,0x80,0x8b,0x8a,0x8a,0x3e,0x66,0x49,0x28,0x52,0x99,0xdc,0x8a,0x8f,0xde,0x97,0x4e,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x10,0x04,0x19,0x00,0x1c,0x00,0x3b,0x00,0x1e,0x40,0x0f,0x00,0x1c,0x1d,0x96,0x3b,0x3b,0x08,0x26,0x95,0x12,0x16,0x30,0x95,0x08,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed, -0x39,0x39,0x30,0x31,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x17,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x33,0x01,0x5c,0x64,0x6f,0x38,0x68,0x96,0x5d,0x6f,0xb8, -0x84,0x49,0x49,0x87,0xc0,0x78,0x63,0x9d,0x6d,0x3b,0x24,0x42,0x5d,0x39,0xbe,0x0b,0x4a,0x67,0x3f,0x1c,0x80,0x89,0x54,0x82,0x58,0x2e,0x24,0x50,0x82,0x5e,0x37,0x56,0x3c,0x1f,0x18,0x36,0x59,0x41,0x06,0x02,0x17,0x15,0x6c,0x5a,0x45,0x6d,0x4c,0x29,0x43,0x85,0xc8,0x85,0x71,0xc5,0x92,0x54,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28, -0x05,0x44,0x17,0x2c,0x42,0x2a,0x57,0x57,0x3b,0x6a,0x92,0x56,0x52,0x92,0x6d,0x3f,0x19,0x2b,0x3c,0x22,0x29,0x3b,0x26,0x13,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8e,0x05,0x9a,0x00,0x2b,0x00,0x21,0x40,0x11,0x0f,0x1c,0x92,0x1b,0x1b,0x00,0x2b,0x03,0x15,0x03,0x02,0x24,0x92,0x05,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f, -0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x11,0x33,0x04,0x8e,0xa8,0x4e,0xd4,0x83,0x6c,0xb1,0x80,0x46,0x2d,0x54,0x77,0x4a,0x7d,0x8a,0xa8,0x31, -0x58,0x7b,0x4a,0xc2,0xbc,0x30,0x55,0x73,0x43,0x4d,0x7b,0x63,0x4e,0x21,0xa8,0x8c,0x4b,0x59,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x22,0x87,0x74,0x01,0x8b,0xfe,0x76,0x39,0x56,0x39,0x1d,0x8b,0x8a,0x8a,0x3e,0x66,0x49,0x28,0x27,0x40,0x52,0x2c,0x04,0x3e,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x97,0x04,0x00,0x00,0x2b, -0x00,0x21,0x40,0x11,0x0f,0x1b,0x96,0x1a,0x1a,0x00,0x2b,0x0f,0x15,0x0f,0x02,0x24,0x92,0x05,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x0e, -0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x11,0x33,0x03,0x97,0xa4,0x3c,0x8d,0x5f,0x4f,0x85,0x61,0x36,0x24,0x42,0x5d,0x39,0x64,0x6f,0xa4,0x6d,0x7a,0x06,0x0b,0x4a,0x67,0x3f,0x1c,0x78,0x70,0x24,0x4a,0x45,0x3e,0x17,0xa4,0x5d,0x34,0x41,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28,0x05,0x05,0x15,0x6c,0x5a,0x01,0x0e,0xfe,0xec, -0x51,0x4c,0x81,0x17,0x2c,0x42,0x2a,0x57,0x57,0x10,0x1e,0x2e,0x1e,0x03,0x15,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x02,0x06,0x01,0xee,0x00,0x00,0x00,0x02,0x00,0x5e,0xfe,0x1e,0x05,0x2c,0x05,0xb2,0x00,0x1f,0x00,0x36,0x00,0x25,0x40,0x14,0x19,0x91,0x16,0x2f,0x14,0x01,0x14,0x11,0x03,0x0f,0x1d,0x00,0x20,0x91, -0x0a,0x04,0x2a,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x2f,0x5d,0x33,0xed,0x30,0x31,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04, -0x35,0x11,0x34,0x2e,0x02,0x02,0xb9,0x86,0xde,0x9f,0x58,0x5c,0xa9,0xf0,0x94,0x4e,0x80,0x66,0x4d,0x1c,0xa8,0xfd,0x6b,0xf4,0xb6,0xdf,0xc9,0xf2,0xfd,0x40,0xe1,0x80,0x6c,0xad,0x7a,0x42,0x42,0x79,0xa9,0x66,0x33,0x67,0x5f,0x53,0x3d,0x23,0x3b,0x6e,0x9a,0x18,0x6a,0xbf,0x01,0x0a,0xa1,0xac,0x01,0x18,0xc6,0x6c,0x21,0x39,0x4b,0x2a, -0xb7,0xfa,0xf0,0xfd,0x94,0x4f,0xb2,0x69,0xdf,0xdd,0x64,0x6d,0x81,0x05,0x32,0x56,0x9c,0xd9,0x84,0x84,0xd9,0x9a,0x55,0x13,0x2c,0x48,0x6a,0x90,0x5d,0x01,0x0d,0x6c,0xa2,0x6c,0x36,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x04,0x9d,0x05,0x9a,0x00,0x20,0x00,0x2c,0x00,0x32,0x40,0x1c,0x1e,0x07,0x92,0x2b,0x17,0x2b,0x23,0x92,0x11,0x8f, -0x11,0xef,0x11,0x02,0x61,0x11,0x01,0x2b,0x11,0x2b,0x11,0x01,0x15,0x03,0x1f,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x30,0x31,0x21,0x21,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x37,0x15,0x06,0x06, -0x07,0x11,0x21,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x04,0x9d,0xfd,0x18,0x0b,0x10,0x13,0x19,0x15,0x46,0x71,0x4f,0x2b,0x23,0x3f,0x58,0x35,0x25,0x53,0x26,0xa8,0x3c,0x75,0x3c,0x3c,0x75,0x3c,0x02,0x40,0xfd,0x18,0x04,0x8f,0x2a,0x39,0x12,0x29,0x43,0x30,0x25,0x02,0x22,0x01,0x01,0x01,0x01,0x21,0x3e,0x5b,0x3a, -0x31,0x53,0x3b,0x21,0x16,0x22,0x01,0xe0,0xfd,0x43,0x1a,0x49,0x34,0xa6,0x2a,0x3f,0x17,0xfe,0x4a,0x02,0x10,0xc4,0x30,0x2a,0x1d,0x2a,0x1c,0x0d,0x00,0x01,0x00,0x02,0x00,0x00,0x03,0xe8,0x05,0x9a,0x00,0x10,0x00,0x19,0x40,0x0d,0x0e,0x12,0x04,0x10,0x0a,0x03,0x06,0x09,0x12,0x06,0x03,0x01,0x03,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39, -0x3f,0x30,0x31,0x13,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x02,0xea,0x02,0x2a,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0xfd,0xe8,0xd1,0x02,0x67,0x05,0x9a,0xfd,0x70,0x25,0x0d,0x02,0xc2,0xfa,0x66,0x02,0xa2,0x16,0x1b,0xfd,0x8f,0x02,0xb0,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c, -0x05,0x9a,0x00,0x07,0x00,0x0f,0xb6,0x05,0x03,0x06,0x02,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0x30,0x31,0x21,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x0c,0xfc,0x1d,0x01,0x9d,0xa8,0x01,0x9e,0x98,0x05,0x02,0xfa,0xfe,0x00,0x00,0x01,0x00,0x32,0x02,0x79,0x05,0xcc,0x03,0x21,0x00,0x03,0x00,0x08,0xb1,0x01,0x03,0x00,0x2f,0xcd, -0x30,0x31,0x01,0x15,0x21,0x35,0x05,0xcc,0xfa,0x66,0x03,0x21,0xa8,0xa8,0x00,0x03,0xff,0xf9,0xff,0xe8,0x04,0xc5,0x04,0x18,0x00,0x27,0x00,0x30,0x00,0x39,0x00,0x30,0x40,0x19,0x1c,0x0f,0x20,0x0c,0x35,0x1d,0x0f,0x19,0x14,0x04,0x2d,0x2d,0x07,0x28,0x95,0x14,0x10,0x31,0xec,0x07,0x16,0x25,0xec,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed, -0x3f,0xed,0x12,0x39,0x2f,0x39,0x12,0x39,0x33,0x33,0xcd,0x32,0x32,0x3f,0x30,0x31,0x25,0x06,0x23,0x22,0x03,0x23,0x02,0x21,0x22,0x2e,0x02,0x27,0x23,0x35,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x1e,0x03,0x33,0x32,0x37,0x01,0x22,0x0e,0x02,0x07,0x21,0x26,0x26,0x03,0x32,0x36,0x37,0x21,0x1e, -0x03,0x04,0xc5,0x33,0x2c,0x9a,0x36,0x04,0x95,0xfe,0xf7,0x5a,0x94,0x6b,0x3d,0x04,0x61,0x67,0x0c,0x4d,0x79,0xa3,0x63,0x3f,0x72,0x60,0x4c,0x1a,0x04,0x55,0xac,0xab,0xa0,0xaa,0x10,0x20,0x26,0x2c,0x1c,0x16,0x12,0xfd,0x74,0x3f,0x67,0x4e,0x33,0x0a,0x02,0x53,0x2a,0x92,0x95,0x66,0xa8,0x3a,0xfd,0xb1,0x05,0x29,0x43,0x5d,0x05,0x0d, -0x01,0x25,0xfe,0xcb,0x48,0x7f,0xae,0x66,0x81,0x68,0xac,0x7c,0x44,0x26,0x4a,0x6a,0x44,0x01,0x06,0xfe,0x44,0x81,0x59,0x75,0x46,0x1d,0x05,0x02,0xf9,0x32,0x59,0x79,0x48,0xa2,0xaa,0xfc,0xe8,0xa6,0xa5,0x47,0x79,0x58,0x33,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0x58,0x04,0x18,0x00,0x29,0x00,0x38,0x00,0x41,0x00,0x43,0x40,0x24, -0x23,0x25,0x95,0x20,0x10,0x18,0x16,0x95,0x1b,0x39,0x95,0x28,0x2a,0x95,0x14,0x08,0x0c,0x28,0x1d,0x14,0x1b,0x28,0x14,0x28,0x14,0x0c,0x1b,0x10,0x33,0x95,0x0c,0x16,0x3e,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x3f,0xed,0x32,0x30, -0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x15,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x05,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x37,0x1e,0x03,0x33,0x32,0x36,0x37,0x06,0x58,0x38, -0x6b,0x9d,0x65,0x80,0xcc,0x3e,0x04,0x91,0xf2,0x4d,0x79,0x55,0x2d,0x01,0x7f,0x01,0x06,0xd7,0xaf,0x9b,0x94,0xc8,0xdb,0x48,0x3c,0xb8,0x7b,0xdd,0x88,0x92,0xac,0x9b,0xaf,0x04,0x02,0xd3,0xfc,0x87,0xcb,0x8b,0x89,0x1b,0x33,0x49,0x2d,0x3b,0x67,0x4d,0x2c,0xa8,0x0a,0x33,0x4e,0x64,0x3a,0x79,0x86,0x01,0x01,0xd3,0x73,0xb6,0x7f,0x43, -0x7e,0x6e,0x07,0xe5,0x2a,0x4d,0x6d,0x44,0x01,0x2c,0x18,0x10,0x01,0x2a,0x7a,0xa4,0x60,0xb1,0x56,0x5b,0x62,0x9a,0x72,0xb9,0xac,0x50,0x0c,0x08,0x52,0x5f,0x24,0x3c,0x2b,0x17,0x2d,0x50,0x6c,0x3f,0x04,0x43,0x6e,0x4f,0x2c,0x9d,0x8f,0x00,0x00,0x02,0x00,0x64,0xff,0xd8,0x03,0x40,0x04,0x12,0x00,0x20,0x00,0x2a,0x00,0x22,0x40,0x0f, -0x1f,0x1e,0x14,0x21,0x1e,0x21,0x1e,0x21,0x01,0x25,0x0d,0x20,0x19,0x01,0x15,0x00,0x3f,0xcd,0x33,0x2f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x30,0x31,0x05,0x37,0x2e,0x03,0x35,0x11,0x34,0x3e,0x02,0x37,0x25,0x33,0x13,0x16,0x15,0x14,0x07,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x17,0x01,0x03,0x25,0x36,0x35, -0x27,0x0e,0x03,0x15,0x01,0xac,0x09,0x62,0x82,0x4d,0x20,0x07,0x10,0x1c,0x14,0x01,0x7c,0x31,0xd9,0x0f,0x1a,0xfe,0x35,0x2f,0x45,0x50,0x21,0x21,0x31,0x2d,0x2f,0x1e,0x2d,0xfe,0xaf,0x92,0x01,0x0b,0x11,0xa7,0x19,0x2b,0x1f,0x12,0x0d,0x1a,0x1e,0x4b,0x5b,0x6c,0x40,0x01,0x18,0x23,0x2d,0x20,0x17,0x0c,0xea,0xfe,0xd6,0x1a,0x09,0x0f, -0x10,0xfe,0xef,0x30,0x44,0x2d,0x15,0x07,0x13,0x21,0x19,0x2d,0xfe,0xd2,0x02,0x09,0x9a,0x0b,0x07,0xf1,0x10,0x1a,0x23,0x35,0x2c,0x00,0x00,0x02,0x00,0x13,0xff,0xe8,0x04,0x23,0x04,0x18,0x00,0x20,0x00,0x29,0x00,0x36,0x40,0x1e,0x11,0x0b,0xff,0x06,0x01,0x06,0x03,0x14,0x03,0x01,0x95,0x29,0xe0,0x03,0xf0,0x03,0x02,0x03,0x29,0x03, -0x29,0x0e,0x24,0x95,0x1b,0x10,0x09,0x95,0x0e,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xdd,0x5d,0xce,0x33,0x30,0x31,0x01,0x21,0x14,0x17,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x23,0x35,0x33,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x27, -0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x03,0xdd,0xfd,0x2d,0x06,0x03,0x13,0xfd,0x15,0x29,0x92,0x65,0xac,0x92,0x88,0xdd,0xa1,0xdb,0x31,0x71,0x53,0x06,0x49,0x7f,0xad,0x63,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0x26,0x21,0x81,0x4d,0x50,0x72,0x9a,0x62,0x98,0x8f,0x81,0x33,0x39,0x77,0xc7,0x8f, -0x4f,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x02,0x00,0x29,0xff,0xe8,0x04,0xc4,0x04,0x18,0x00,0x26,0x00,0x2f,0x00,0x27,0x40,0x14,0x0f,0x95,0x1b,0x1b,0x01,0x95,0x2f,0x13,0x2f,0x13,0x2f,0x09,0x2a,0x95,0x21,0x10,0x04,0x95,0x09,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f, -0xed,0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x04,0xc4,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88,0xdd,0x75,0xab,0x72,0x3a,0x04,0x0e,0x8a,0x29, -0x89,0x27,0x25,0x44,0x60,0x3b,0x22,0x0e,0x4c,0x77,0x9f,0x60,0x6f,0xa0,0x66,0x30,0xa8,0x01,0x86,0x79,0x41,0x66,0x4b,0x2e,0x09,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x4e,0x87,0xb4,0x66,0x77,0x4a,0x47,0x49,0x56,0x38,0x5a,0x40,0x22,0x5b,0x9f,0x77,0x45,0x50,0x88,0xb2,0x61,0x35,0x8f,0x9d,0x34,0x54,0x6c,0x38,0xff,0xff,0x00,0x35, -0x00,0x00,0x02,0xa0,0x06,0x02,0x02,0x06,0x00,0x49,0x00,0x00,0x00,0x03,0x00,0x60,0xfe,0x11,0x04,0x35,0x04,0x18,0x00,0x2d,0x00,0x42,0x00,0x4e,0x00,0x45,0x40,0x2b,0x24,0x15,0x18,0x27,0x0f,0x33,0x95,0x22,0x10,0x24,0x12,0x01,0x02,0x46,0x2a,0x12,0x04,0x05,0x49,0x96,0x2f,0x0f,0x01,0x0f,0x3d,0x95,0xef,0x18,0x01,0x18,0x40,0x09, -0x0f,0x48,0x18,0x15,0x43,0x96,0x05,0x1b,0x2d,0x00,0x1b,0x00,0x3f,0x32,0x3f,0xed,0x3f,0x2b,0x5d,0xed,0xde,0x5d,0xed,0x12,0x17,0x39,0x5d,0x3f,0xed,0x3f,0x12,0x39,0x39,0x30,0x31,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x35,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e, -0x02,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x14,0x07,0x16,0x16,0x17,0x03,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x01,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0xaa,0x1c,0x2b,0x49,0xbc,0x63,0x3a,0x69,0x50,0x2f,0x34,0x56,0x71,0x3e,0x51,0x9e,0x45,0x26,0x04,0x75,0xeb, -0x5f,0x9d,0x6f,0x3d,0x41,0x79,0xae,0x6d,0xcf,0x64,0x04,0xa4,0x4a,0x26,0x38,0x11,0xc9,0x2c,0x4e,0x69,0x3d,0x4b,0x78,0x54,0x2d,0x2a,0x4f,0x6f,0x45,0x45,0x72,0x53,0x2d,0xfe,0x95,0x4d,0x78,0x2d,0x30,0x6e,0x3e,0x4d,0x51,0x48,0xfe,0x11,0x42,0x36,0x3b,0x30,0x1c,0x35,0x4b,0x2f,0x31,0x4b,0x33,0x1b,0x29,0x27,0x5b,0x7e,0x70,0xc4, -0x47,0x83,0xba,0x73,0x82,0xd2,0x95,0x50,0xa6,0x8e,0xfc,0x52,0xd0,0x83,0x29,0x60,0x39,0x04,0x29,0x3c,0x6b,0x51,0x30,0x38,0x6c,0x9c,0x64,0x54,0x8b,0x63,0x36,0x35,0x5d,0x80,0x4b,0xfc,0xd1,0x2a,0x26,0x1f,0x22,0x27,0x1d,0x23,0x2a,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0xb7,0x05,0xec,0x00,0x2b,0x00,0x2b,0x40,0x15,0x21,0x20, -0x11,0x03,0x03,0x1a,0x27,0x0a,0x0b,0x20,0x27,0x0b,0x0b,0x27,0x20,0x03,0x16,0x2a,0x00,0x16,0x15,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x30,0x31,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x23,0x11,0x26,0x26, -0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x01,0xae,0x0f,0x1d,0x0e,0x1b,0x25,0x17,0x09,0x57,0x27,0x58,0x47,0x6f,0x68,0x0e,0x18,0x0c,0xa4,0x0f,0x20,0x11,0x32,0x29,0x2d,0x2a,0x26,0x4d,0x53,0x6a,0x68,0x1a,0x1e,0xa4,0x03,0x1f,0x06,0x08,0x10,0x1c,0x27,0x17,0x5b,0x19,0x52,0x17, -0x63,0x4c,0x5f,0x70,0x04,0x03,0xfd,0x4d,0x02,0xff,0x05,0x07,0x3c,0x2e,0x34,0x32,0x0e,0x51,0x0e,0x62,0x55,0x5f,0x70,0x08,0x02,0x84,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0xa4,0x05,0xec,0x00,0x26,0x00,0x4f,0x6e,0x00,0x00,0x27,0x00,0xd8,0x00,0x00,0xfe,0x71,0x00,0x07,0x00,0xd8,0x00,0x00,0xfd,0x3b,0x00,0x03,0xff,0xf6,0x00,0x00, -0x01,0xfa,0x05,0xec,0x00,0x15,0x00,0x1b,0x00,0x22,0x00,0x29,0x40,0x13,0x20,0x15,0x15,0x18,0x02,0x1f,0x0d,0x0d,0x19,0x0a,0x02,0x0a,0x02,0x0a,0x01,0x0b,0x00,0x01,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x2f,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x21,0x23,0x11,0x2e,0x03,0x35,0x34,0x36,0x37,0x11,0x33, -0x11,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x27,0x14,0x17,0x35,0x06,0x06,0x05,0x34,0x26,0x27,0x15,0x36,0x36,0x01,0x4a,0xa4,0x27,0x41,0x2e,0x1a,0x60,0x50,0xa4,0x50,0x60,0x1a,0x2f,0x41,0x26,0xe4,0x40,0x1d,0x23,0x01,0x1e,0x20,0x1a,0x1a,0x20,0x02,0x1c,0x0a,0x2a,0x3a,0x4a,0x2c,0x5b,0x7a,0x17,0x02,0x00,0xfe,0x01,0x16,0x7a,0x55, -0x2a,0x4a,0x3c,0x2d,0x0c,0xe6,0x5f,0x1e,0xf5,0x13,0x3f,0x26,0x23,0x3c,0x13,0xe3,0x13,0x3b,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0xb4,0x04,0x18,0x00,0x3a,0x00,0x47,0x00,0x36,0x40,0x1e,0x36,0x1a,0x95,0x38,0x03,0x96,0x01,0x01,0x3b,0x96,0x13,0x13,0x20,0x38,0x10,0x2e,0x24,0x95,0x31,0x10,0x2d,0x0f,0x2a,0x15,0x20,0x15,0x43,0x95, -0x09,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x10,0xed,0x32,0x30,0x31,0x01,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33, -0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x33,0x20,0x11,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x54,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66,0x3c,0x56,0x19,0x37,0x57,0x3e,0x35,0x5c,0x44,0x27,0xa4,0xe9,0x35,0x5b,0x42,0x26,0xa4,0xa4,0x04,0x6d,0xd1,0x34,0x5d,0x4b,0x38, -0x0e,0x72,0xe2,0x01,0x52,0xeb,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x01,0xd8,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x74,0x54,0x7a,0x4f,0x25,0x34,0x5a,0x76,0x42,0xfd,0xb8,0x02,0x60,0x01,0x2e,0x30,0x56,0x78,0x48,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0xfe,0x5f,0xfe,0xf2, -0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x58,0x04,0x18,0x00,0x26,0x00,0x33,0x00,0x2b,0x40,0x17,0x20,0x17,0x95,0x23,0x03,0x96,0x00,0x00,0x27,0x96,0x13,0x13,0x1c,0x23,0x10,0x1f,0x0f,0x1c,0x15,0x2f,0x95,0x09,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed, -0x10,0xed,0x32,0x30,0x31,0x01,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x10,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x03,0xf8,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42, -0x24,0x2a,0x4a,0x66,0x3c,0x56,0xee,0x7b,0x51,0x50,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0xeb,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x01,0xd8,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x70,0x01,0x46,0x5d,0x5c,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfe,0xf7,0x16,0x24,0x2f,0x19,0x35,0x3f, -0x50,0x43,0x63,0x00,0x00,0x02,0x00,0xa6,0xfe,0x11,0x04,0x1c,0x04,0x18,0x00,0x2e,0x00,0x3a,0x00,0x3f,0x40,0x28,0x17,0x95,0x24,0x10,0x20,0x0f,0x24,0x12,0x01,0x02,0x32,0x2b,0x12,0x04,0x05,0x35,0x96,0x2f,0x0f,0x5f,0x0f,0x6f,0x0f,0xef,0x0f,0x04,0x06,0x0f,0x01,0x0f,0x0f,0x1d,0x15,0x2e,0x00,0x00,0x2f,0x96,0x05,0x1b,0x00,0x3f, -0xed,0x33,0x2f,0x33,0x3f,0x33,0x2f,0x5d,0x5d,0xed,0x12,0x17,0x39,0x5d,0x3f,0x3f,0xed,0x30,0x31,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x35,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x16,0x16,0x17,0x25, -0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x91,0x1c,0x2a,0x4a,0xbb,0x64,0x3a,0x69,0x50,0x2f,0x34,0x56,0x71,0x3e,0x51,0x9e,0x46,0x26,0xee,0x3d,0x68,0x4c,0x2b,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x27,0x23,0x26,0x37,0x11,0xfd,0xca,0x44,0x83,0x2d,0x30,0x6e,0x3e,0x4d,0x51,0x47,0xfe,0x11,0x42,0x36,0x3b,0x30, -0x1c,0x35,0x4b,0x2f,0x31,0x4b,0x33,0x1b,0x29,0x27,0x5a,0x7f,0x02,0x0c,0x01,0x46,0x31,0x57,0x78,0x46,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfd,0xca,0x61,0x9e,0x3f,0x28,0x60,0x39,0x63,0x29,0x26,0x1f,0x23,0x27,0x1d,0x23,0x2a,0x00,0x00,0x02,0x00,0x64,0xff,0xd8,0x03,0xc9,0x04,0x12,0x00,0x1e,0x00,0x30,0x00,0x0d,0xb4,0x30, -0x1e,0x25,0x10,0x16,0x00,0x3f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x07,0x1e,0x03,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x07,0x23,0x26,0x26,0x27,0x35,0x3e,0x03,0x35,0x11,0x34,0x26,0x27,0x25,0x05,0x11,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x26,0x26,0x27,0x03,0x02,0x20,0x03,0x23,0x36,0x40,0x20,0x16,0x15,0x19,0x38, -0x5c,0x42,0xbd,0x43,0x04,0xbe,0xb4,0x10,0x13,0x0b,0x04,0x05,0x05,0x02,0x54,0xfe,0xa6,0x2d,0x52,0x42,0x2d,0x06,0x0e,0x26,0x22,0x18,0x29,0x28,0x30,0x56,0x13,0x03,0xd9,0x0e,0x05,0x3b,0x55,0x67,0x32,0x23,0x41,0x2a,0x28,0x4e,0x58,0x69,0x42,0xbe,0x14,0x50,0x2d,0x3e,0x05,0x11,0x20,0x31,0x26,0x01,0x57,0x33,0x53,0x22,0xdf,0xd4, -0xfd,0xb8,0x15,0x1e,0x15,0x0a,0x2b,0x47,0x5a,0x2f,0x3a,0x6d,0x3f,0x4a,0x74,0x2a,0x00,0x03,0x00,0x54,0xff,0xb4,0x03,0xc9,0x04,0x40,0x00,0x22,0x00,0x31,0x00,0x37,0x00,0x16,0x40,0x09,0x37,0x00,0x20,0x13,0x12,0x12,0x23,0x0e,0x16,0x00,0x3f,0xcd,0x33,0x2f,0x33,0x2f,0x33,0x33,0x30,0x31,0x01,0x07,0x16,0x16,0x17,0x16,0x16,0x15, -0x14,0x0e,0x02,0x07,0x07,0x23,0x26,0x26,0x27,0x07,0x23,0x37,0x27,0x35,0x3e,0x03,0x35,0x11,0x34,0x26,0x27,0x25,0x17,0x37,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x01,0x1e,0x03,0x03,0x11,0x13,0x26,0x26,0x27,0x03,0x9e,0x83,0x1b,0x46,0x22,0x16,0x15,0x19,0x38,0x5c,0x42,0xbd,0x43,0x03,0x60,0x5b,0x50,0x78,0x62,0x52,0x10, -0x13,0x0b,0x04,0x05,0x05,0x02,0x54,0x14,0x31,0xab,0x0e,0x26,0x22,0x18,0x29,0x28,0x06,0xfe,0xff,0x2b,0x4f,0x3f,0x2b,0xee,0xcb,0x1b,0x2d,0x0b,0x04,0x40,0xd3,0x2d,0x6d,0x36,0x23,0x41,0x2a,0x28,0x4e,0x58,0x69,0x42,0xbe,0x0e,0x31,0x1e,0x81,0x9f,0x16,0x3e,0x05,0x11,0x20,0x31,0x26,0x01,0x57,0x33,0x53,0x22,0xdf,0x22,0x50,0xfc, -0x64,0x2b,0x47,0x5a,0x2f,0x3a,0x6d,0x3f,0x09,0xfe,0x63,0x14,0x1c,0x14,0x09,0x02,0x9a,0xfe,0x64,0x01,0x48,0x27,0x42,0x1a,0x00,0x02,0x00,0x80,0xff,0xb4,0x04,0x50,0x04,0x40,0x00,0x23,0x00,0x2b,0x00,0x2b,0x40,0x15,0x0c,0x22,0x0e,0x23,0x23,0x1f,0x12,0x1b,0x12,0x1b,0x09,0x18,0x95,0x1f,0x10,0x0e,0x0e,0x24,0x95,0x09,0x16,0x00, -0x3f,0xed,0x33,0x2f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x30,0x31,0x01,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x23,0x37,0x26,0x27,0x33,0x16,0x16,0x17,0x01,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x17,0x37,0x01,0x32,0x36,0x35,0x34,0x27,0x01,0x16,0x04,0x25, -0x66,0x47,0x4a,0x48,0x84,0xbd,0x75,0x38,0x64,0x2d,0x36,0x78,0x53,0x7a,0x34,0xb3,0x0e,0x28,0x17,0x01,0x9c,0x4d,0x71,0x6b,0x9b,0x29,0xaf,0x34,0xfd,0xb9,0x4b,0x81,0x36,0x40,0xfe,0xb2,0xa0,0xaa,0x42,0xfe,0x72,0x3c,0x04,0x40,0xa5,0x45,0xce,0x84,0x79,0xc7,0x8e,0x4e,0x12,0x11,0x57,0x87,0x54,0x98,0x1f,0x34,0x15,0x02,0x99,0x36, -0x65,0x5e,0x9f,0xae,0x20,0x1f,0x67,0xfc,0x32,0xcd,0xbf,0xa8,0x65,0xfd,0x7f,0x18,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x1f,0x04,0x18,0x00,0x22,0x00,0x32,0x00,0x3b,0x00,0x2c,0x40,0x18,0x1e,0x95,0x19,0x10,0x33,0x95,0x16,0x14,0x08,0x21,0x21,0x0a,0x23,0x95,0x14,0x10,0x2d,0x95,0x0a,0x16,0x38,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f, -0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0x12,0x39,0xed,0x3f,0xed,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x20,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x1e,0x03,0x33, -0x32,0x36,0x37,0x07,0x1f,0x38,0x6b,0x9d,0x65,0x80,0xca,0x3c,0x83,0xfe,0xe1,0x72,0xb9,0x81,0x46,0x4a,0x89,0xc1,0x78,0x01,0x17,0x6f,0x39,0xc2,0x86,0xdd,0x88,0x92,0xac,0x9b,0xaf,0x04,0x02,0xd3,0xfb,0x3f,0x4e,0x7f,0x59,0x30,0x30,0x58,0x7e,0x4e,0xa0,0xac,0xac,0x01,0x52,0x0a,0x33,0x4e,0x64,0x3a,0x79,0x86,0x01,0x01,0xd3,0x73, -0xb6,0x7f,0x43,0x7e,0x6e,0xec,0x4b,0x89,0xc0,0x76,0x81,0xcc,0x8e,0x4b,0xd4,0x67,0x6d,0x62,0x9a,0x72,0xb9,0xac,0x01,0x65,0x38,0x69,0x98,0x5f,0x5a,0x8f,0x65,0x36,0xcc,0xbe,0xc3,0xcf,0xfe,0x10,0x43,0x6e,0x4f,0x2c,0x9d,0x8f,0x00,0x04,0x00,0x60,0xff,0xb4,0x07,0x21,0x04,0x40,0x00,0x2d,0x00,0x36,0x00,0x41,0x00,0x4a,0x00,0x41, -0x40,0x24,0x2e,0x95,0x29,0x2c,0x3f,0x34,0x0b,0x04,0x0c,0x2d,0x2d,0x29,0x10,0x42,0x95,0x10,0x13,0x26,0x24,0x19,0x19,0x13,0x1f,0x95,0x24,0x10,0x45,0x95,0x13,0x16,0x0c,0x0c,0x37,0x95,0x09,0x16,0x00,0x3f,0xed,0x33,0x2f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x3f,0x33,0x2f,0x12,0x17,0x39,0x10,0xed,0x30, -0x31,0x01,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x23,0x06,0x21,0x22,0x2e,0x02,0x35,0x35,0x21,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x16,0x17,0x37,0x05,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0x26,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x01,0x16,0x01,0x16, -0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0xf5,0x69,0x48,0x4d,0x4a,0x89,0xc2,0x77,0x6a,0x55,0x33,0x78,0x52,0x4d,0x2d,0x04,0x76,0xfe,0xf5,0x63,0x9a,0x6a,0x37,0x02,0xd5,0x02,0x2f,0x56,0x7a,0x4d,0xaf,0x90,0x89,0xdc,0x01,0x0d,0x71,0x04,0x82,0x01,0x1e,0x4d,0x85,0x38,0x43,0xfe,0xa9,0xa0,0xac,0x3c,0x39,0x01,0x9c,0x52,0x75,0x4f,0x7f, -0x59,0x2f,0x24,0x22,0xfe,0x72,0x39,0xfc,0x2a,0x02,0x85,0x75,0x3d,0x67,0x50,0x33,0x08,0x04,0x40,0xaa,0x45,0xc7,0x7c,0x81,0xcc,0x8e,0x4b,0x1f,0x53,0x84,0x38,0x63,0xeb,0x45,0x7f,0xb5,0x70,0x58,0x55,0x85,0x5c,0x2f,0x72,0x9a,0x62,0xed,0xed,0x23,0x21,0x6c,0xb2,0xcc,0xbe,0x72,0xa5,0x33,0x02,0x9a,0x3a,0xfc,0xe4,0x39,0x69,0x97, -0x5f,0x4e,0x7f,0x31,0xfd,0x7f,0x15,0x01,0x2c,0x8f,0x9d,0x2e,0x51,0x6e,0x3f,0x00,0x00,0x04,0x00,0x60,0xff,0xe8,0x07,0x21,0x04,0x18,0x00,0x24,0x00,0x2d,0x00,0x36,0x00,0x3f,0x00,0x3b,0x40,0x20,0x3a,0x95,0x1f,0x16,0x37,0x95,0x01,0x2b,0x95,0x31,0x1c,0x1a,0x01,0x0d,0x31,0x01,0x31,0x01,0x31,0x10,0x25,0x95,0x1a,0x16,0x2e,0x95, -0x10,0x10,0x06,0x95,0x0b,0x10,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x3f,0xed,0x30,0x31,0x13,0x21,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x20,0x27,0x23,0x06,0x21,0x22,0x2e,0x02,0x35,0x01, -0x32,0x3e,0x02,0x37,0x21,0x16,0x16,0x13,0x22,0x06,0x07,0x21,0x2e,0x03,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x60,0x02,0xd5,0x02,0x2f,0x56,0x7a,0x4d,0xaf,0x90,0x89,0xdc,0x01,0x0d,0x71,0x04,0x82,0x01,0x1e,0x73,0xb8,0x81,0x46,0x4a,0x89,0xc2,0x77,0xfe,0xda,0x6c,0x04,0x76,0xfe,0xf5,0x63,0x9a,0x6a,0x37,0x04,0xc3,0x49,0x77, -0x58,0x35,0x07,0xfd,0x63,0x0b,0xab,0x95,0x8c,0xa7,0x14,0x02,0x95,0x0a,0x38,0x55,0x72,0xfb,0x9e,0x02,0x85,0x75,0x3d,0x67,0x50,0x33,0x08,0x02,0x29,0x55,0x85,0x5c,0x2f,0x72,0x9a,0x62,0xed,0xed,0x4c,0x89,0xc0,0x75,0x81,0xcc,0x8e,0x4b,0xeb,0xeb,0x45,0x7f,0xb5,0x70,0xfe,0xa1,0x30,0x5b,0x82,0x52,0xab,0xb4,0x03,0x1c,0x9d,0x95, -0x47,0x72,0x4f,0x2a,0xfe,0x10,0x8f,0x9d,0x2e,0x51,0x6e,0x3f,0x00,0x02,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x00,0x32,0x00,0x42,0x00,0x1f,0x40,0x11,0x33,0x95,0x29,0x10,0x17,0x95,0x10,0x10,0x21,0x95,0x06,0x16,0x03,0x3d,0x95,0x00,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x30,0x31,0x05,0x22,0x26,0x27,0x06, -0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x07,0x26,0x22,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x9a,0x8d,0xd5,0x3f,0x42,0xd6,0x8f,0x71,0xb8,0x82, -0x47,0x49,0x88,0xc1,0x78,0x0d,0x18,0x0c,0x19,0x09,0x12,0x09,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0x4a,0x89,0xc0,0x77,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0xaa,0x18,0x71,0x66,0x66,0x71,0x4b,0x8a,0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x01,0x01,0x89,0x01,0x37,0x69, -0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0x7e,0xc8,0x8b,0x49,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0xc1,0xcf,0x00,0x03,0x00,0x60,0xff,0xb4,0x07,0x98,0x04,0x40,0x00,0x3c,0x00,0x47,0x00,0x4f,0x00,0x30,0x40,0x1b,0x03,0x45,0x4d,0x32,0x04,0x05,0x33,0x33,0x3d,0x95, -0x2f,0x10,0x1d,0x95,0x16,0x10,0x09,0x27,0x95,0x0c,0x16,0x05,0x05,0x48,0x95,0x00,0x16,0x00,0x3f,0xed,0x33,0x2f,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x33,0x2f,0x12,0x17,0x39,0x30,0x31,0x05,0x22,0x26,0x27,0x07,0x23,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x07,0x26,0x22,0x23, -0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x01,0x26,0x03,0x32,0x36,0x35,0x34,0x27,0x01,0x16,0x05,0x9a,0x38,0x64,0x2d,0x36,0x78,0x54,0x26,0x3f,0x19,0x42,0xd6,0x8f,0x71,0xb8,0x82,0x47,0x49, -0x88,0xc1,0x78,0x0d,0x18,0x0c,0x19,0x09,0x12,0x09,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0x4a,0x89,0xc0,0x77,0x4b,0x81,0x36,0x40,0x79,0x66,0x47,0x4a,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x3f,0x3a,0x01,0x9b,0x4d,0x71,0xa0,0xaa,0x42,0xfe,0x72,0x3c,0x18,0x13,0x11,0x58,0x87,0x1a,0x42,0x28,0x66,0x71,0x4b,0x8a, -0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x01,0x01,0x89,0x01,0x37,0x69,0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0x7e,0xc8,0x8b,0x49,0x20,0x1f,0x67,0xa5,0x45,0xce,0x84,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x69,0x9f,0x33,0x02,0x99,0x36,0xfc,0xe4,0xcd,0xbf,0xa8,0x65,0xfd,0x7f,0x18,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xe4, -0x04,0x00,0x00,0x11,0x00,0x19,0x40,0x0c,0x0b,0x03,0x96,0x0e,0x0e,0x07,0x0c,0x0f,0x07,0x15,0x00,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x30,0x31,0x21,0x35,0x10,0x21,0x22,0x06,0x15,0x15,0x23,0x35,0x10,0x25,0x11,0x33,0x11,0x04,0x11,0x15,0x03,0x40,0xfe,0xf5,0x8c,0x88,0xa4,0x01,0x62,0xa4,0x01,0x61,0x6b,0x01,0x3c, -0xa0,0xa8,0x5f,0x58,0x01,0xab,0x29,0x01,0xd4,0xfe,0x2b,0x2c,0xfe,0x54,0x53,0x00,0x00,0x02,0x00,0xb0,0xfe,0x8d,0x04,0x24,0x04,0x33,0x00,0x2a,0x00,0x35,0x00,0x1d,0x40,0x0e,0x0a,0x27,0x3a,0x30,0x30,0x28,0x2f,0x3a,0x2a,0x16,0x3a,0x1d,0x28,0x08,0x00,0x3f,0xdc,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x01,0x32,0x1e, -0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x02,0x1d,0x56,0x8a,0x61,0x34,0x26,0x46,0x62,0x3c,0x3c,0x55,0x37,0x19,0x09,0x1b,0x30,0x28,0x11,0x20, -0x0e,0x11,0x22,0x13,0x96,0x83,0x27,0x40,0x51,0x29,0x90,0xa4,0x02,0x37,0x77,0x76,0xa6,0xa0,0x37,0x59,0x40,0x23,0x04,0x33,0x27,0x4a,0x69,0x43,0x3b,0x62,0x4c,0x35,0x0d,0x03,0x14,0x2e,0x3e,0x4f,0x33,0xe8,0x3b,0x58,0x3a,0x1e,0x05,0x05,0x88,0x04,0x04,0xb8,0xb9,0xff,0x25,0x43,0x33,0x1d,0xfe,0x4b,0x04,0x33,0xfe,0xd7,0x57,0x4c, -0xfe,0x8e,0x1e,0x37,0x4c,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0xef,0x04,0x00,0x00,0x0d,0x00,0x11,0xb7,0x09,0x00,0x0d,0x0f,0x07,0x0f,0x05,0x15,0x00,0x3f,0x3f,0x3f,0x33,0x32,0x30,0x31,0x01,0x06,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x37,0x01,0xef,0x35,0x2a,0x46,0xa4,0xa4,0x04,0x18,0x51,0x35,0x03,0x6a, -0x18,0x3a,0x62,0xac,0xfd,0xf6,0x04,0x00,0xd3,0x49,0x68,0x1a,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf2,0x04,0x12,0x00,0x1e,0x00,0x1b,0x40,0x0e,0x14,0x07,0x0a,0xec,0x1a,0x10,0x13,0x0f,0x10,0x15,0x05,0xec,0x00,0x10,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x30,0x31,0x01,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x26,0x26,0x23, -0x22,0x06,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x36,0x03,0x90,0x3e,0x24,0x2c,0x50,0x65,0x45,0x2a,0x50,0x20,0x35,0x4a,0x23,0x46,0xa4,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x32,0x49,0x1a,0x47,0x04,0x12,0x0e,0xaa,0x21,0x5b,0x37,0x24,0x31,0x32,0x62,0xac,0xfd,0xf6,0x04,0x00,0xd3,0x36,0x55, -0x3b,0x1f,0x20,0x1d,0x3d,0x00,0x00,0x02,0x00,0x1c,0xff,0xe8,0x03,0x9e,0x04,0x12,0x00,0x26,0x00,0x33,0x00,0x28,0x40,0x15,0x02,0xec,0x24,0x10,0x0a,0x96,0x07,0x07,0x27,0x96,0x1e,0x1c,0x1b,0x1b,0x10,0x1c,0x0f,0x2f,0x95,0x10,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x2f,0xed,0x3f,0xed,0x30,0x31,0x01,0x26, -0x23,0x22,0x07,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x17,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x03,0x9e,0x2c,0x50,0x6a,0x46,0x46,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66, -0x3c,0x56,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x3e,0x24,0xfd,0xa3,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x03,0x5a,0x21,0x63,0x62,0xac,0x32,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x02,0x28,0xd3,0x36,0x55,0x3b,0x1f,0x0e,0xfd,0x65,0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x02, -0x00,0x1c,0xff,0xe8,0x04,0xd4,0x04,0x12,0x00,0x32,0x00,0x3f,0x00,0x30,0x40,0x1a,0x07,0x0a,0xec,0x2e,0x10,0x14,0x96,0x11,0x11,0x33,0x96,0x28,0x27,0x25,0x25,0x1a,0x27,0x0f,0x3b,0x95,0x1a,0x16,0x05,0xec,0x00,0x10,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x2f,0xed,0x3f,0xed,0x32,0x30,0x31,0x01,0x32, -0x17,0x15,0x26,0x23,0x22,0x07,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x36,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x04,0x72,0x3e,0x24,0x2c,0x50,0x65,0x45, -0x2a,0x50,0x20,0x35,0x4a,0x23,0x23,0x23,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66,0x3c,0x56,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x32,0x49,0x1a,0x47,0xfd,0x29,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x04,0x12,0x0e,0xaa,0x21,0x5b,0x37,0x24,0x31,0x32,0x32,0x90,0x56,0x28,0x6f,0x63,0x46,0x6b,0x48,0x25, -0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x02,0x28,0xd3,0x36,0x55,0x3b,0x1f,0x20,0x1d,0x3d,0xfd,0x57,0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x03,0x14,0x04,0x00,0x00,0x15,0x00,0x1d,0x40,0x0e,0x05,0x96,0x0f,0x0a,0x0f,0x0a,0x0f,0x01,0x14,0x0f,0x0c,0x0f,0x01,0x15,0x00,0x3f,0x3f,0x3f, -0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x30,0x31,0x21,0x23,0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x03,0x14,0xa4,0x2d,0x70,0x46,0x4a,0x6e,0x2b,0x6e,0x83,0x27,0x64,0x41,0x25,0x4a,0x3f,0x2e,0x09,0xa4,0x03,0x64,0x1a,0x1f,0x1f,0x1c,0xd4,0x01,0x6e,0x38,0x24,0x10,0x1a,0x21, -0x11,0x00,0x00,0x02,0x00,0x3c,0xff,0xe9,0x05,0x06,0x04,0x00,0x00,0x20,0x00,0x2c,0x00,0x29,0x40,0x16,0x21,0x96,0x1c,0x09,0x96,0x13,0x0d,0x1c,0x13,0x13,0x1c,0x0d,0x03,0x00,0x18,0x0f,0x10,0x0f,0x27,0x96,0x00,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x30,0x31,0x05,0x22,0x2e,0x02,0x35, -0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x11,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xb0,0x48,0x76,0x54,0x2e,0x2d,0x70,0x46,0x4a,0x6e,0x2b,0x6e,0x83,0x27,0x64,0x41,0x25,0x4a,0x3f,0x2e,0x09,0xa4,0x49,0x6b,0x01, -0x3e,0xb2,0x94,0x5d,0x4f,0x4e,0x5b,0x5a,0x4c,0x4b,0x17,0x27,0x4b,0x70,0x4a,0x02,0x4f,0x1a,0x1f,0x1f,0x1c,0xd4,0x01,0x6e,0x38,0x24,0x10,0x1a,0x21,0x11,0xfe,0x73,0x24,0xfe,0xac,0xaa,0xb0,0x02,0x52,0x81,0x83,0x79,0x79,0x7a,0x7d,0x80,0x7f,0x00,0xff,0xff,0xff,0x92,0xfe,0x1e,0x02,0x68,0x06,0x02,0x02,0x06,0x05,0x88,0x00,0x00, -0x00,0x01,0x00,0x90,0xff,0xe8,0x03,0xe2,0x04,0x00,0x00,0x12,0x00,0x19,0x40,0x0c,0x11,0x11,0x01,0x09,0x0f,0x02,0x0c,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x30,0x31,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6, -0xfe,0x92,0xa3,0xf8,0x79,0x4c,0x4e,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x58,0x58,0x90,0x01,0x03,0x00,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0xa4,0x04,0x00,0x00,0x15,0x00,0x1f,0x00,0x28,0x40,0x13,0x0a,0x01,0x18,0x10,0x14,0x0d,0x10,0x12,0x10,0x12,0x10,0x07,0x0f,0x0f,0x04,0x1b,0x95,0x07,0x15,0x00,0x3f,0xed, -0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xcd,0x32,0x32,0x30,0x31,0x01,0x23,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x35,0x33,0x15,0x33,0x05,0x35,0x21,0x15,0x10,0x33,0x32,0x3e,0x02,0x04,0xa4,0x98,0xa4,0x04,0x66,0xd5,0xfe,0x8f,0x97,0x97,0xa4,0x02,0x0c,0xa4,0x98,0xfe, -0xc4,0xfd,0xf4,0xfa,0x3c,0x65,0x48,0x29,0x01,0xdb,0xfe,0x25,0xa2,0xba,0x01,0xb4,0x3f,0x8b,0x01,0x9a,0xfe,0x66,0x50,0x50,0xb4,0x29,0x25,0xfe,0xbc,0x2f,0x54,0x76,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0x54,0x04,0x12,0x00,0x27,0x00,0x3b,0x00,0x29,0x40,0x16,0x0e,0x0e,0x25,0x28,0x32,0x10,0x07,0x95,0x25,0x16,0x23,0x1b,0x11,0x95, -0x1e,0x16,0x1a,0x15,0x17,0x0f,0x01,0x0f,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x3f,0xed,0x3f,0xcd,0x12,0x39,0x2f,0x30,0x31,0x13,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x23,0x20,0x11,0x01,0x22,0x2e, -0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0xa6,0xa4,0x19,0x36,0x57,0x3f,0x34,0x5c,0x45,0x27,0xa4,0xe9,0x36,0x5b,0x42,0x25,0xa4,0xa4,0x04,0x6e,0xd0,0x35,0x5d,0x4b,0x37,0x0e,0x72,0xe2,0xfe,0xae,0x02,0xd7,0x16,0x27,0x1c,0x11,0x11,0x1c,0x27,0x16,0x16,0x28,0x1d,0x11,0x11,0x1d,0x28,0x04,0x00,0xfd,0xb4, -0x55,0x7a,0x4e,0x25,0x35,0x59,0x76,0x42,0x8d,0xa5,0xfe,0xd2,0x30,0x57,0x77,0x48,0x02,0x48,0xfc,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0x01,0xa1,0x01,0xb4,0x10,0x1c,0x27,0x17,0x17,0x27,0x1d,0x10,0x10,0x1d,0x27,0x17,0x16,0x27,0x1c,0x11,0x00,0x00,0x02,0x00,0xa6,0xff,0xee,0x06,0x54,0x04,0x18,0x00,0x27,0x00,0x3b,0x00,0x2b, -0x40,0x17,0x28,0x32,0x16,0x07,0x95,0x25,0x10,0x11,0x95,0x1e,0x10,0x23,0x1b,0x19,0x0e,0x0e,0x18,0x19,0x0f,0x18,0x15,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x3f,0xcd,0x30,0x31,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11, -0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x33,0x20,0x11,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x06,0x54,0xa4,0x19,0x36,0x57,0x3f,0x35,0x5b,0x45,0x27,0xa4,0xe9,0x36,0x5b,0x42,0x25,0xa4,0xa4,0x04,0x6d,0xd1,0x34,0x5e,0x4b,0x37,0x0e,0x72,0xe2,0x01,0x52,0xfd,0x29, -0x16,0x27,0x1c,0x11,0x11,0x1c,0x27,0x16,0x17,0x27,0x1d,0x11,0x11,0x1d,0x27,0x02,0x4c,0x55,0x7a,0x4e,0x25,0x35,0x59,0x76,0x42,0x8d,0xa5,0x01,0x2e,0x30,0x57,0x77,0x48,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0xfe,0x5f,0xfe,0x4c,0x10,0x1c,0x27,0x17,0x17,0x27,0x1d,0x10,0x10,0x1d,0x27,0x17,0x16,0x27,0x1c,0x11, -0x00,0x01,0x00,0x0e,0xff,0xe8,0x04,0x46,0x04,0x31,0x00,0x21,0x00,0x1c,0x40,0x0e,0x0d,0x95,0x13,0x13,0x02,0x01,0x20,0x0f,0x1b,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x39,0x33,0x2f,0xed,0x30,0x31,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02, -0x15,0x11,0x10,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x04,0x46,0xa4,0x04,0x66,0xd6,0xfe,0x92,0x0a,0x1c,0x35,0x2a,0x1e,0x2a,0x19,0x2a,0x4c,0x48,0x68,0x43,0x20,0xf8,0x79,0x4c,0x4e,0xa4,0xa2,0xba,0x01,0xb4,0x01,0x2b,0x38,0x54,0x37,0x1c,0x0d,0x0e,0x94,0x12,0x34,0x5e,0x82,0x4e,0xfe,0xe7,0xfe,0xbc,0x58,0x58,0x90,0x02,0x4e,0x00, -0xff,0xff,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x02,0x06,0x01,0xd3,0x00,0x00,0x00,0x02,0x00,0x0c,0xfe,0x21,0x04,0xbc,0x04,0x18,0x00,0x28,0x00,0x3c,0x00,0x28,0x40,0x15,0x38,0x18,0x0a,0x1b,0x07,0x04,0x19,0x1f,0x1f,0x08,0x19,0x0f,0x0d,0xec,0x12,0x10,0x2e,0x00,0x00,0x08,0x1b,0x00,0x3f,0x33,0x2f,0x32,0x3f,0xed,0x3f,0x12, -0x39,0x2f,0x12,0x17,0x39,0x33,0x30,0x31,0x01,0x22,0x26,0x27,0x26,0x26,0x27,0x03,0x01,0x23,0x01,0x03,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x17,0x13,0x01,0x33,0x01,0x13,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0xea, -0x3e,0x5c,0x1c,0x1c,0x35,0x1f,0xa0,0xfe,0xa1,0xb9,0x01,0xc6,0xae,0x42,0x48,0x2e,0x2a,0x21,0x4a,0x2b,0x44,0x39,0x32,0x1a,0x8c,0x01,0x11,0xb9,0xfe,0x89,0xdc,0x1c,0x4c,0x2d,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d,0x8c,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0xfe,0x21,0x38,0x30,0x30,0x6c, -0x43,0x01,0x56,0xfd,0x6f,0x03,0x38,0x01,0x89,0x94,0x0e,0x9a,0x0a,0x15,0x32,0x51,0x3c,0xfe,0xb6,0x02,0x06,0xfd,0x58,0xfe,0x18,0x1a,0x1b,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0xc6,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x00,0x01,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x00,0x21, -0x00,0x20,0x40,0x12,0x02,0xec,0x1f,0x1c,0x08,0x16,0x05,0x19,0x04,0x07,0x18,0x1b,0x13,0xec,0x0e,0x10,0x07,0x0f,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x17,0x39,0x3f,0xed,0x30,0x31,0x13,0x16,0x33,0x32,0x37,0x13,0x01,0x33,0x01,0x13,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x03,0x01,0x23,0x01,0x03,0x0e,0x03,0x23,0x22,0x27, -0x0c,0x27,0x27,0x48,0x44,0xec,0xfe,0x89,0xb9,0x01,0x11,0x8c,0x1a,0x32,0x39,0x44,0x2b,0x4a,0x21,0x2a,0x2e,0x48,0x42,0xae,0x01,0xc6,0xb9,0xfe,0xa1,0x9f,0x26,0x44,0x45,0x4b,0x2d,0x31,0x2b,0xfe,0xc6,0x10,0x96,0x02,0x0c,0x02,0xa8,0xfd,0xfa,0x01,0x4a,0x3d,0x52,0x31,0x14,0x0a,0x9a,0x0e,0x94,0xfe,0x77,0xfc,0xc8,0x02,0x91,0xfe, -0x95,0x57,0x75,0x48,0x1e,0x09,0x00,0x02,0x00,0x1a,0xff,0xd3,0x04,0x2c,0x04,0x00,0x00,0x27,0x00,0x3b,0x00,0x26,0x40,0x16,0x21,0x0f,0x37,0x25,0x01,0x1f,0x18,0x04,0x05,0x40,0x0b,0x0e,0x48,0x05,0x05,0x1d,0x15,0x2d,0x0f,0x16,0x00,0x0f,0x00,0x3f,0x3f,0x33,0x3f,0x39,0x2f,0x2b,0x17,0x39,0x33,0x3f,0x30,0x31,0x01,0x01,0x17,0x36, -0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0x92,0xfe,0xa8,0x88,0x1c,0x51,0x32,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d, -0x2b,0x34,0x46,0x34,0x2c,0x19,0x63,0x09,0x17,0x0d,0x04,0x02,0x18,0x15,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x1b,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x04,0x00,0xfd,0xfa,0xe2,0x1e,0x21,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0x1b,0x32,0x49,0x2e, -0xb5,0x11,0x26,0x17,0x05,0x26,0x23,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfc,0x99,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x00,0x01,0xff,0x1f,0xfe,0x57,0x03,0x92,0x04,0x00,0x00,0x15,0x00,0x1a,0x40,0x0e,0x06,0x0d,0x01,0x13,0x04,0x03,0x15,0x0f,0x0f,0x0f, -0x0b,0x1b,0x03,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x30,0x31,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x03,0x92,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xfe,0x38,0xbd,0x02,0x58,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00, -0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfd,0x0b,0x03,0x9f,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0x00,0x02,0xff,0x1f,0xfe,0x57,0x04,0x2c,0x04,0x00,0x00,0x27,0x00,0x3b,0x00,0x2a,0x40,0x18,0x37,0x18,0x1f,0x01,0x25,0x04,0x27,0x2f,0x05,0x3f,0x05,0x02,0x05,0x05,0x0f,0x27,0x0f,0x21,0x0f,0x1d, -0x1b,0x2d,0x0f,0x16,0x00,0x3f,0x33,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x5d,0x12,0x17,0x39,0x33,0x30,0x31,0x01,0x01,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e, -0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0x92,0xfe,0xa8,0x88,0x1c,0x51,0x32,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d,0x2b,0x29,0x3f,0x36,0x2e,0x16,0x74,0x09,0x17,0x0d,0x04,0x02,0x18,0x15,0xfe,0x38,0xbd,0x02,0x58,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x1b,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d, -0x26,0x15,0x15,0x26,0x1d,0x10,0x04,0x00,0xfd,0xfa,0xe2,0x1e,0x21,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0x15,0x29,0x3e,0x29,0xd4,0x11,0x26,0x17,0x05,0x26,0x23,0xfd,0x0b,0x03,0x9f,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfc,0x99,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x01, -0xfe,0xc8,0xfe,0x21,0x03,0x7a,0x04,0x00,0x00,0x23,0x00,0x1d,0x40,0x10,0x02,0xec,0x21,0x1c,0x0e,0x12,0x08,0x17,0x04,0x10,0x14,0x15,0x10,0x0f,0x0a,0x0f,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x3f,0xed,0x30,0x31,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x33,0x01,0x01,0x23,0x03,0x26,0x27, -0x23,0x06,0x06,0x07,0x01,0x0e,0x03,0x23,0x22,0x27,0xfe,0xc8,0x27,0x27,0x14,0x1d,0x1f,0x2a,0x21,0x01,0xae,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0xb5,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xfe,0xab,0x2b,0x41,0x3c,0x41,0x2a,0x31,0x2b,0xfe,0xc6,0x10,0x0a,0x21,0x3f,0x34,0x02,0xa2,0x02,0x0a, -0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfd,0xdc,0x45,0x64,0x40,0x1e,0x09,0x00,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x03,0x40,0x04,0x00,0x00,0x14,0x00,0x18,0x40,0x0b,0x0f,0x0b,0x14,0x14,0x03,0x0d,0x0f,0x08,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0x30,0x31, -0x01,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0x40,0xfe,0xbe,0x7e,0xe4,0x41,0x2a,0x34,0x2d,0x7d,0x3d,0x52,0xfe,0x70,0xb6,0x01,0x15,0x15,0x06,0x02,0x0a,0x08,0x99,0x02,0x89,0xfc,0xd3,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x4e,0x0c,0x26,0x1a, -0x01,0x9f,0x00,0x02,0x00,0x25,0x03,0x50,0x02,0x4a,0x05,0xbe,0x00,0x10,0x00,0x21,0x00,0x14,0xb7,0x11,0x16,0x14,0x1c,0x0b,0x10,0x0d,0x05,0x00,0x2f,0xcd,0xcc,0x32,0xde,0xcd,0xcc,0x32,0x30,0x31,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e, -0x02,0x17,0x02,0x4a,0x05,0x2e,0x4a,0x61,0x39,0x3a,0x61,0x47,0x2a,0x02,0x64,0x0c,0xa0,0x45,0x60,0x0a,0x0a,0x60,0x45,0xa0,0x0c,0x64,0x02,0x2a,0x47,0x61,0x3a,0x37,0x62,0x4a,0x2f,0x05,0x05,0xbe,0x38,0x5c,0x43,0x25,0x24,0x42,0x5d,0x39,0x9b,0x53,0x48,0xfd,0x92,0x48,0x53,0x9b,0x39,0x5d,0x42,0x24,0x25,0x42,0x5d,0x38,0x00,0x01, -0x00,0x64,0x01,0xbc,0x02,0x4e,0x05,0xc4,0x00,0x21,0x00,0x14,0xb7,0x12,0x1f,0x1f,0x19,0x1a,0x0a,0x05,0x19,0x00,0x2f,0xdc,0xcd,0x2f,0x12,0x39,0x2f,0xcd,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02, -0x4e,0x1f,0x3a,0x56,0x36,0x2b,0x24,0x2b,0x26,0x13,0x25,0x1b,0x11,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a,0xb4,0x02,0xa0,0x3e,0x57,0x36,0x19,0x10,0x5f,0x16,0x06,0x1a,0x32,0x2c,0x01,0x3a,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0x00,0x01,0x00,0x00,0x02,0x9a,0x01,0xf4,0x05,0xc4,0x00,0x28, -0x00,0x29,0x40,0x13,0x1c,0x1d,0x0e,0x02,0x02,0x16,0x23,0x07,0x08,0x1d,0x23,0x08,0x08,0x23,0x1d,0x03,0x12,0x27,0x12,0x00,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x30,0x31,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26, -0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x01,0x3c,0x12,0x11,0x24,0x1b,0x3f,0x1e,0x42,0x35,0x50,0x4b,0x10,0x0d,0x80,0x0a,0x14,0x0b,0x21,0x1b,0x21,0x1e,0x1e,0x39,0x3f,0x4d,0x4c,0x09,0x11,0x09,0x80,0x04,0x6b,0x05,0x27,0x20,0x3d,0x11,0x43,0x11,0x48,0x38,0x45,0x52, -0x03,0xfe,0x81,0x01,0xb9,0x03,0x04,0x29,0x1f,0x23,0x23,0x0a,0x41,0x0b,0x48,0x3e,0x45,0x52,0x03,0x02,0x01,0x20,0x00,0x01,0x00,0x00,0x02,0x95,0x01,0xbf,0x05,0xc0,0x00,0x2f,0x00,0x23,0x40,0x0f,0x03,0x2d,0x2d,0x0a,0x10,0x10,0x28,0x22,0x22,0x15,0x1b,0x1b,0x07,0x1e,0x07,0x00,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x33,0x2f,0xcd,0x32, -0x2f,0xcd,0x33,0x2f,0xcd,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x35,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x35,0x33,0x11,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x27,0x15,0x16,0x33,0x32,0x37,0x01,0xbf,0x02,0x40,0x38,0x11,0x10,0x86,0x14, -0x0d,0x41,0x02,0x3a,0x02,0x40,0x3b,0x11,0x10,0x14,0x0d,0x41,0x02,0x3a,0x02,0x40,0x3b,0x11,0x10,0x86,0x0d,0x11,0x3e,0x02,0x3d,0x02,0x40,0x38,0x11,0x10,0x0d,0x11,0x3e,0x02,0x04,0x3d,0x47,0x59,0x03,0xfe,0xf5,0x01,0x45,0x06,0x50,0x49,0x57,0x04,0x76,0x06,0x50,0x49,0x57,0x04,0xcc,0xfe,0xf7,0x04,0x52,0x47,0x59,0x03,0x79,0x04, -0x52,0x00,0x00,0x01,0x00,0x00,0x02,0x8d,0x02,0x80,0x04,0xfc,0x00,0x25,0x00,0x19,0x40,0x0a,0x0c,0x13,0x13,0x02,0x01,0x25,0x1e,0x06,0x06,0x01,0x00,0x2f,0x33,0x2f,0xcd,0x2f,0x12,0x39,0x33,0x2f,0xcd,0x30,0x31,0x01,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02, -0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x02,0x80,0x7f,0x02,0x1d,0x4f,0x3d,0xd3,0x1c,0x30,0x11,0x18,0x0e,0x0c,0x2e,0x16,0x29,0x42,0x2d,0x18,0x05,0x14,0x29,0x23,0x24,0x3a,0x29,0x15,0x7f,0x02,0x9a,0x5c,0x35,0x34,0xf7,0xa0,0x40,0x3f,0x07,0x08,0x5e,0x05,0x05,0x1e,0x35,0x4a,0x2c,0x8c,0x2e,0x45,0x2e,0x17, -0x1e,0x33,0x41,0x24,0x01,0x3b,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x0e,0x04,0x18,0x00,0x14,0x00,0x29,0x00,0x1b,0x40,0x0e,0x00,0x1b,0x95,0x13,0x10,0x06,0x25,0x95,0x09,0x16,0x04,0x15,0x03,0x0f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x30,0x31,0x01,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34, -0x3e,0x02,0x33,0x32,0x13,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0x66,0x04,0xa4,0xa4,0x04,0x7a,0xe8,0x63,0x9c,0x6c,0x39,0x40,0x79,0xad,0x6d,0xcc,0x6b,0x2c,0x4e,0x6b,0x3f,0x4a,0x76,0x52,0x2c,0x29,0x4c,0x6c,0x44,0x48,0x75,0x53,0x2d,0x03,0x6c,0x94,0xfc,0x00,0xb4,0xcc,0x48,0x84, -0xbb,0x73,0x7f,0xd0,0x95,0x52,0xfd,0xb7,0x8f,0x3e,0x6f,0x53,0x30,0x3b,0x6f,0xa0,0x65,0x55,0x87,0x5f,0x32,0x36,0x5e,0x7f,0xff,0xff,0x00,0x58,0x00,0x00,0x04,0xb8,0x04,0x45,0x02,0x06,0x0d,0x80,0x00,0x00,0xff,0xff,0x00,0xcf,0x03,0xca,0x01,0x88,0x04,0x7f,0x00,0x07,0x0f,0x50,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0xcf,0xfe,0xe8, -0x01,0x88,0xff,0x9d,0x00,0x07,0x0f,0x50,0x00,0x2b,0xfe,0xed,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x04,0x7f,0x00,0x07,0x0f,0x51,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfe,0xe8,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x51,0x00,0x2b,0xfe,0xed,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x05,0x97,0x00,0x07,0x0f,0x53,0x00,0x2b, -0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x53,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x05,0x97,0x00,0x07,0x0f,0x54,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x54,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29, -0x05,0x97,0x00,0x07,0x0f,0x56,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x56,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x67,0xfe,0x36,0x01,0xf0,0xff,0x9e,0x00,0x06,0x0f,0x5d,0x2b,0x37,0xff,0xff,0x00,0xcf,0x03,0xca,0x01,0x88,0x05,0x97,0x00,0x07,0x0f,0x52,0x00,0x2b,0x03,0xcf,0xff,0xff, -0x00,0xcf,0xfd,0xd0,0x01,0x88,0xff,0x9d,0x00,0x07,0x0f,0x52,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x8b,0xfe,0x63,0x01,0xcc,0xff,0xa4,0x00,0x06,0x0f,0x5b,0x2b,0x64,0xff,0xff,0x00,0x0c,0x03,0xca,0x02,0x72,0x06,0x2c,0x00,0x07,0x0f,0x57,0x00,0x46,0x03,0xca,0xff,0xff,0x00,0x0c,0xfe,0x17,0x02,0x72,0x00,0x79,0x00,0x07,0x0f,0x57, -0x00,0x46,0xfe,0x17,0xff,0xff,0xff,0xd4,0x03,0xc3,0x02,0x33,0x06,0xa7,0x02,0x07,0x0e,0x65,0x00,0x00,0xfe,0xa3,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x05,0x95,0x00,0x27,0x0a,0x65,0x00,0x1e,0xfe,0xa3,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x06,0xa0,0x00,0x27,0x0a,0x66,0x00,0x1e,0xfe,0xa3, -0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x05,0x9f,0x00,0x27,0x0a,0x67,0x00,0x1e,0xfe,0xa3,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x05,0xff,0xf2,0x02,0x01,0x07,0x8d,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x2c,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x01,0x07,0x8d,0x02,0x26, -0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x2c,0x00,0x00,0x00,0x02,0x00,0x52,0xfe,0x9c,0x0c,0xb6,0x03,0xba,0x00,0x7a,0x00,0x8a,0x00,0x68,0xb1,0x72,0x03,0xbd,0x04,0xfb,0x00,0x77,0x05,0x03,0x00,0x15,0x00,0x6a,0x04,0xfb,0xb6,0x6b,0x6b,0x59,0x1f,0x5e,0x37,0x34,0xb8,0x04,0xfb,0xb6,0x7b,0x55,0x59,0x33,0x33,0x2c,0x3c,0x41,0x09,0x04, -0xfb,0x00,0x59,0x05,0x03,0x00,0x7e,0x04,0xfb,0x00,0x50,0x05,0x03,0x00,0x86,0x04,0xfb,0xb5,0x2f,0x46,0x01,0x46,0x46,0x25,0xb8,0x04,0xff,0xb3,0x2c,0x0e,0x0e,0x2c,0x00,0x2f,0x33,0x2f,0x10,0xed,0x33,0x2f,0x5d,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x32,0x32,0x39,0x11,0x33,0x2f,0xed,0x32,0x3f,0xed,0x32, -0x30,0x31,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x00,0x17,0x1e,0x03,0x17,0x26,0x26,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23, -0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x05,0x15,0x14,0x1e,0x02,0x17,0x07,0x2e,0x05,0x27,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x52,0x61,0xa6,0x39,0x4f,0x6c,0x42,0x1d,0x3b,0x60,0x7b,0x40,0xb9,0x01,0x05,0x2d,0x1f,0x5e,0x76,0x8a,0x4b, -0x06,0x09,0x31,0x5a,0x80,0x9f,0xb9,0x67,0x39,0x60,0x68,0x7d,0x56,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x13,0x30,0x55,0x44,0x3f,0x56,0x3a,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x32,0x88,0x55,0x31,0x43,0x6e, -0x50,0x30,0x05,0x30,0x6f,0x70,0x66,0x50,0x2f,0x24,0x4b,0x73,0x50,0x2f,0x50,0xad,0xad,0xa5,0x91,0x77,0x28,0x1c,0x53,0x67,0x76,0x3f,0x3a,0x9a,0x4b,0x09,0xd1,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3e,0x2e,0xa9,0x0b,0x0b,0x15,0x2c,0x44,0x2f,0x49,0x9c,0x9f,0xa1,0x4e,0xfe,0xdc,0xf9,0x5a,0x97,0x7b,0x61,0x23, -0x1e,0x39,0x12,0x38,0x57,0x47,0x3e,0x3d,0x42,0x29,0x05,0x1b,0x36,0x2a,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2a,0x3a,0x26,0x11,0x2e,0x41,0x48,0x1a,0x2f,0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f,0x4b,0x48,0x29,0x4d,0x6e,0x45,0x0c,0x24,0x2a,0x31, -0x34,0x38,0x1b,0x25,0x43,0x35,0x22,0x04,0xaa,0x08,0x2a,0x41,0x55,0x67,0x77,0x42,0x2c,0x3b,0x24,0x0f,0x0c,0x0a,0x01,0x05,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x00,0x00,0x12,0x00,0x32,0xff,0x17,0x07,0xc3,0x06,0x5d,0x01,0x37,0x01,0x67,0x01,0x8a,0x01,0xb5,0x01,0xb9,0x01,0xc7,0x01,0xec,0x02,0x11,0x02,0x21, -0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x48,0x02,0x4c,0x02,0x50,0x02,0x54,0x02,0x58,0x02,0x5c,0x00,0x00,0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17, -0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x15,0x14,0x16,0x33,0x33,0x35,0x33,0x15,0x21, -0x32,0x3e,0x02,0x35,0x11,0x23,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x33,0x14,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x17, -0x33,0x11,0x33,0x11,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x23,0x11,0x14,0x1e,0x02,0x33,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17, -0x36,0x36,0x37,0x15,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x21,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x3e,0x02,0x35,0x35,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06, -0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x27,0x15,0x14,0x0e,0x02,0x23, -0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x36,0x35,0x35,0x01,0x33,0x11,0x23,0x25,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x01,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14, -0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x05,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x01,0x34, -0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x1e,0x03,0x03,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x13,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x01,0x21,0x15,0x21,0x25,0x33,0x15,0x23,0x03,0x23,0x35,0x33, -0x07,0x23,0x35,0x33,0x05,0xf4,0x19,0x27,0x32,0x18,0x23,0x37,0x0e,0x11,0x39,0x17,0x1d,0x38,0x10,0x17,0x39,0x17,0x68,0x2f,0x35,0x0b,0x15,0x31,0x14,0x97,0x18,0x28,0x0d,0x10,0x24,0x19,0x13,0x27,0x11,0x0f,0x1b,0x0a,0x19,0x14,0x0e,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0c,0x18,0x27,0x1e,0x13,0x05,0x01,0x05,0x0e, -0x19,0x15,0x8d,0x09,0x15,0x11,0x0c,0xdb,0x1d,0x27,0x0d,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x13,0x23,0xd2,0x41,0x01,0xee,0x09,0x15,0x11,0x0c,0x0c,0x26,0x2e,0x0a,0x15,0x31,0x14,0x27,0x2f,0x22,0x1b,0x12,0x13,0x24,0x21,0x29,0x21,0x8b,0x94,0x75, -0x6a,0x01,0x02,0x3c,0x03,0x20,0x30,0x3a,0x1a,0x73,0x6d,0x24,0x2a,0x24,0x42,0x3c,0x1f,0x2a,0x22,0x24,0x1a,0x09,0x14,0x11,0x0b,0x41,0x18,0x22,0x0a,0x41,0x1a,0x21,0x05,0x05,0x42,0x04,0x04,0x03,0x04,0x3c,0x10,0x36,0x3d,0x3e,0x19,0x2c,0x3c,0x25,0x10,0x21,0x39,0x4d,0x2d,0x4b,0x1a,0x36,0x30,0x28,0x0d,0x01,0x0f,0x2d,0x16,0x0e, -0x07,0x11,0x1d,0x15,0xb7,0x2e,0x1b,0x15,0x2c,0x42,0x2c,0x0e,0x2d,0x12,0x11,0x25,0x14,0x17,0x26,0x1d,0x10,0x24,0x35,0x2f,0x4e,0x33,0x2d,0x4e,0x4a,0x48,0x27,0x8c,0x2f,0x35,0x0b,0x15,0x31,0x14,0xfe,0x16,0x07,0x11,0x1d,0x15,0x6b,0x0b,0x18,0x13,0x0d,0x43,0x1d,0x26,0x0c,0x17,0x12,0x0c,0x40,0x21,0x2a,0x0e,0x1a,0x13,0x0b,0xfc, -0x2c,0x13,0x23,0x17,0x22,0x42,0x16,0x24,0x2d,0x16,0x20,0x2a,0x0e,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x04,0x1d,0x2a,0x43,0x20,0x27,0x31,0x1b,0x0a,0x01,0x21,0x22,0x1a,0x30,0x25,0x16,0x13,0x21,0x2d,0x1b,0x1d,0x2e,0x14,0x16,0x15,0x14,0x2d,0x48, -0x33,0x23,0x43,0x27,0xe6,0x12,0x1c,0x23,0x12,0x34,0x16,0x0d,0x27,0x11,0x14,0x29,0x0b,0x11,0x28,0x11,0xfe,0xa3,0x01,0x60,0x11,0x1f,0x30,0x15,0x1b,0x11,0x1e,0x2d,0x18,0x1d,0x15,0x1e,0xfd,0xf8,0x42,0x42,0x04,0x15,0x4d,0x3c,0x11,0x19,0x1c,0x0c,0x17,0x2d,0x28,0x21,0x0b,0xfa,0xe9,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09, -0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x02,0x68,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x03,0x7c,0x0d,0x16,0x1c,0x0f,0x0c,0x16,0x11,0x0b,0x31,0x20,0x0f,0x1e,0xfa,0x73,0x14,0x19,0x09,0x11,0x15,0x0c,0x2d,0x1b,0x17,0x1d,0x12,0x0a,0xf3, -0x29,0x1b,0x0c,0x18,0x0c,0x32,0x42,0x05,0x29,0x1b,0x0c,0x18,0x0c,0x32,0x42,0x03,0x5d,0x01,0x0d,0xfe,0xf3,0x01,0x0d,0xfe,0xf3,0x02,0x36,0x01,0x0d,0xfe,0xf3,0xfd,0x85,0xd1,0xd1,0xe2,0x4c,0x4c,0x83,0x4b,0x4b,0x01,0x23,0xa2,0x29,0x31,0x1b,0x09,0x12,0x0f,0x14,0x0d,0x11,0x14,0x16,0x0f,0x18,0x0d,0x15,0x10,0x13,0x0e,0x10,0x11, -0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c,0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x01,0x48,0x14,0x11,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21,0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20,0x01,0x07,0xf3,0x26,0x27,0x7c,0x7c,0x05, -0x0d,0x16,0x11,0x01,0x83,0x02,0x17,0x0c,0x15,0x10,0x2b,0x34,0x2b,0x1d,0x1a,0x10,0x26,0x2b,0x30,0x1a,0x4f,0x4b,0x4d,0x55,0x0e,0x17,0x0e,0x13,0x15,0x09,0x20,0x25,0x12,0x05,0x29,0x30,0x11,0x22,0x26,0x2c,0x1c,0x39,0x48,0x2b,0x33,0x2b,0x05,0x0e,0x15,0x11,0x02,0x0c,0xfe,0x0b,0x1a,0x30,0x05,0x01,0xb8,0xfe,0x48,0x02,0x17,0x14, -0x11,0x29,0x17,0x17,0x2b,0x15,0x21,0x03,0x38,0x59,0x3e,0x21,0x1c,0x2f,0x40,0x24,0x33,0x39,0x1b,0x06,0x02,0x09,0x14,0x12,0x14,0x1d,0xfe,0x94,0x0f,0x1c,0x17,0x0e,0x27,0x3b,0x19,0x1d,0x35,0x27,0x17,0x03,0x03,0x46,0x03,0x04,0x05,0x11,0x1f,0x19,0x17,0x37,0x21,0x09,0x1f,0x19,0x4e,0x14,0x1a,0x10,0x06,0x18,0x0d,0x15,0x10,0xfe, -0xcf,0x0f,0x1c,0x17,0x0e,0x04,0x0d,0x16,0x12,0x63,0x4b,0x2c,0x25,0x04,0x0c,0x17,0x12,0x63,0x49,0x2c,0x26,0x01,0x04,0x0c,0x17,0x12,0x9f,0x03,0x42,0x26,0x27,0x1a,0x1f,0x01,0x6d,0xfe,0x90,0x25,0x30,0x1d,0x0c,0x13,0x12,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21,0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20, -0x01,0x39,0xfa,0x39,0x11,0x0e,0x1a,0x28,0x33,0x1a,0x0f,0x10,0x1f,0x2d,0x1d,0x19,0x37,0x2f,0x1e,0x21,0x21,0x22,0x5c,0x34,0x2d,0x53,0x3f,0x26,0x0f,0x12,0x56,0x6d,0x1b,0x21,0x12,0x06,0x16,0x0e,0x08,0x0b,0x0e,0x0f,0x0a,0x30,0x0f,0x17,0x43,0x32,0x1d,0x1a,0x0e,0x18,0x43,0x31,0x1d,0x1a,0x01,0x0e,0x18,0x6b,0x06,0x70,0xfd,0x3c, -0x95,0x1b,0x24,0x20,0x29,0x18,0x0a,0x1c,0x2f,0x3e,0x21,0x02,0x02,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0x69,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03, -0x0f,0x08,0xfa,0xc0,0x0f,0x2d,0x2a,0x1e,0x0f,0x17,0x1e,0x0f,0x1d,0x21,0x05,0x20,0x0f,0x14,0x0c,0x1d,0x18,0x11,0x68,0x04,0x05,0x03,0x01,0x02,0x33,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0x01,0xe7,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0xfc,0xd6,0x25,0x01,0x6f,0x25,0x03,0x3f,0x25,0x51,0x25,0xfb,0x58,0x4c,0x4c,0x4c,0x00,0x00,0x05, -0x00,0x32,0xff,0xba,0x06,0xc7,0x06,0x22,0x00,0xa9,0x00,0xb9,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0x00,0x25,0x22,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x35,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x26, -0x26,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x16,0x33,0x32,0x37,0x26,0x02,0x27,0x35,0x33,0x16,0x12,0x17,0x33,0x11,0x33,0x11,0x14,0x07,0x16,0x16,0x17,0x3e,0x03,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x3e,0x02, -0x37,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x17,0x36,0x36,0x37,0x26,0x26,0x27,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x16,0x17,0x36,0x36,0x37,0x17,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x37,0x15,0x0e,0x05,0x25,0x26,0x26,0x27,0x0e,0x03,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x01,0x0e,0x03,0x15,0x14,0x16,0x33,0x32, -0x3e,0x02,0x35,0x01,0x23,0x35,0x33,0x07,0x23,0x35,0x33,0x04,0xc2,0x2d,0x39,0x10,0x09,0x0a,0x3b,0x5d,0x7e,0x4c,0x6b,0xc5,0xab,0x8a,0x2e,0x33,0x93,0xae,0xc0,0x60,0x3e,0x70,0x56,0x32,0x14,0x2d,0x39,0x16,0x14,0x37,0x3d,0x42,0x20,0x2d,0x5e,0x58,0x4d,0x1c,0x34,0x69,0x29,0x25,0x40,0x22,0x10,0x10,0x05,0x10,0x07,0x0f,0x08,0x32, -0x43,0x2c,0x4d,0x39,0x20,0x17,0x48,0x2a,0x21,0x33,0x23,0x13,0x34,0x51,0x61,0x2d,0x4c,0x3e,0x46,0x3a,0x24,0x39,0x96,0x61,0x5c,0x41,0x81,0x3e,0x08,0x48,0x25,0x0e,0x1b,0x0d,0x13,0x22,0x18,0x0e,0x47,0x08,0x0b,0x0a,0x25,0x14,0x16,0x47,0x16,0x19,0x3d,0x42,0x44,0x21,0x22,0x41,0x22,0x23,0x27,0x2a,0x62,0x35,0x22,0x13,0x1f,0x0c, -0x15,0x3e,0x2a,0x2b,0x56,0x2f,0x1c,0x21,0x2a,0x57,0x33,0x63,0x5d,0x14,0x2d,0x14,0x03,0x19,0x17,0x3d,0x22,0x15,0x27,0x15,0x59,0x1e,0x51,0x5d,0x63,0x5f,0x56,0x01,0x3d,0x0f,0x2b,0x20,0x2f,0x60,0x5b,0x51,0x20,0x0f,0x2e,0x1d,0x29,0x5e,0x5c,0x56,0xfb,0x47,0x22,0x43,0x35,0x21,0x24,0x1f,0x10,0x2a,0x25,0x19,0x04,0xb9,0x3f,0x3f, -0xad,0x3f,0x3f,0x47,0x28,0x26,0x1f,0x18,0x38,0x30,0x20,0x31,0x4e,0x61,0x30,0x61,0x37,0x67,0x50,0x30,0x18,0x29,0x36,0x1e,0x1c,0x24,0x2f,0x25,0x34,0x21,0x0f,0x11,0x1d,0x24,0x13,0x54,0x1e,0x2d,0x0b,0x0a,0x06,0x03,0x02,0x39,0x19,0x33,0x19,0x19,0x15,0x28,0x39,0x23,0x17,0x20,0x18,0x29,0x34,0x1c,0x34,0x44,0x29,0x13,0x03,0x25, -0xfe,0xec,0x32,0x36,0x15,0xab,0x01,0x4c,0x9f,0x05,0x6b,0xfe,0xea,0xb4,0x03,0x86,0xfc,0x77,0x4c,0x31,0x2b,0x5c,0x30,0x08,0x1f,0x27,0x2c,0x15,0x04,0x7b,0xfb,0xb5,0x20,0x38,0x1a,0x17,0x20,0x04,0xa7,0xfb,0x59,0x0d,0x16,0x1c,0x10,0x0a,0x08,0x52,0x13,0x11,0x0c,0x0a,0x11,0x08,0x11,0x21,0x10,0x10,0x0e,0x52,0x0e,0x10,0x1e,0x43, -0x0b,0x1a,0x0b,0x5a,0x0f,0x0e,0x24,0x13,0x0c,0x1a,0x10,0x32,0x54,0x16,0x33,0x34,0x31,0x25,0x17,0xda,0x0e,0x1b,0x0f,0x18,0x2d,0x23,0x16,0x01,0x1c,0x24,0x18,0x27,0x30,0x01,0xe0,0x03,0x0b,0x19,0x2b,0x22,0x1e,0x29,0x06,0x0d,0x14,0x0e,0xfd,0x9c,0x40,0x85,0x40,0x00,0x00,0x20,0x00,0x32,0xfe,0x62,0x08,0x31,0x06,0xaf,0x00,0x69, -0x00,0xcf,0x01,0x2d,0x01,0x5d,0x01,0x61,0x01,0x86,0x01,0x8a,0x01,0x96,0x01,0xa5,0x01,0xb4,0x01,0xbe,0x01,0xc2,0x01,0xc6,0x01,0xca,0x01,0xf0,0x01,0xf4,0x02,0x1a,0x02,0x1e,0x02,0x2a,0x02,0x36,0x02,0x42,0x02,0x4e,0x02,0x52,0x02,0x56,0x02,0x5a,0x02,0x5e,0x02,0x62,0x02,0x66,0x02,0x6a,0x02,0x6e,0x02,0x93,0x02,0xb8,0x00,0x00, -0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02, -0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x3e,0x02,0x35,0x35,0x01,0x06,0x06,0x07,0x0e,0x03,0x23,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36, -0x37,0x36,0x36,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x37,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x03,0x06,0x06,0x07,0x0e,0x03,0x23,0x23, -0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x37,0x27,0x26,0x26,0x23,0x22,0x06, -0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x17,0x1e,0x03,0x33,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x25,0x33,0x11,0x23,0x01,0x06,0x06,0x15, -0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x01,0x23,0x35,0x33,0x13,0x22,0x06,0x07,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x01,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x01,0x32,0x36,0x35, -0x34,0x2e,0x02,0x23,0x22,0x07,0x1e,0x03,0x25,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x01,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x13,0x23,0x35,0x33,0x01,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x27,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16, -0x33,0x01,0x33,0x11,0x23,0x03,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x27,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x01,0x33,0x11,0x23,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22, -0x06,0x15,0x14,0x16,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x03,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x05,0x33,0x15,0x23,0x03,0x33,0x15,0x23,0x05,0x06,0x06,0x15, -0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x13,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23, -0x22,0x26,0x35,0x34,0x34,0x37,0x08,0x31,0x19,0x27,0x32,0x18,0x23,0x37,0x0e,0x11,0x39,0x17,0x1d,0x38,0x10,0x17,0x39,0x17,0x20,0x33,0x0f,0x15,0x31,0x14,0x30,0x18,0x28,0x0d,0x10,0x24,0x19,0x13,0x27,0x11,0x0f,0x1b,0x0a,0x19,0x14,0x0e,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0c,0x18,0x27,0x1e,0x13,0x05,0x01,0x05, -0x0e,0x19,0x15,0x26,0x09,0x15,0x11,0x0c,0x41,0x1d,0x23,0x0b,0x18,0x13,0x0d,0x43,0x1d,0x26,0x0c,0x17,0x12,0x0c,0x40,0x21,0x2a,0x0e,0x1a,0x13,0x0b,0xfd,0x03,0x1a,0x32,0x17,0x16,0x32,0x39,0x3f,0x23,0x24,0x44,0x1c,0x13,0x2c,0x20,0x21,0x3a,0x18,0x12,0x2d,0x19,0x18,0x11,0x15,0x09,0x05,0x58,0x65,0x2f,0x41,0x28,0x12,0x03,0x02, -0x02,0x03,0x42,0x05,0x05,0x31,0x3b,0x23,0x32,0x1f,0x0e,0x07,0x06,0x42,0x08,0x02,0x1c,0x1d,0x10,0x16,0x11,0x0b,0x04,0x0d,0x1a,0x20,0x29,0x1c,0x29,0x34,0x1c,0x0b,0x01,0x08,0x12,0x20,0x1b,0x1c,0x18,0x2f,0x34,0x3b,0x23,0x16,0x23,0x23,0x23,0x16,0x18,0x2f,0x17,0x14,0x33,0x1b,0x22,0x3c,0x3c,0x3f,0x23,0x4f,0x0e,0x31,0x2a,0x16, -0x2e,0x37,0x42,0x2a,0x38,0x20,0x2a,0x0e,0x15,0x31,0x14,0x27,0x17,0x28,0x0d,0x10,0x24,0x1a,0x13,0x26,0x11,0x0f,0x1b,0x0a,0x19,0x15,0x0f,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0b,0x19,0x27,0x1e,0x13,0x05,0x01,0x05,0x0e,0x18,0x15,0x1d,0x09,0x15,0x11,0x0c,0x40,0x14,0x23,0x4b,0x19,0x2e,0x33,0x3b,0x26,0x19,0x19, -0x38,0x2c,0x18,0x2e,0x17,0x14,0x32,0x1c,0x2a,0x39,0x1a,0x0d,0x19,0x1e,0x24,0x17,0xfd,0x23,0x13,0x23,0x17,0x22,0x42,0x16,0x24,0x2d,0x16,0x20,0x2a,0x0e,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x01,0x20,0x42,0x42,0xfe,0x7f,0x02,0x01,0x18,0x14,0x2d, -0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x01,0x40,0x33,0x33,0x32,0x1e,0x27,0x0c,0x1e,0x38,0x3e,0x08,0x10,0x19,0xfe,0x84,0x17,0x1c,0x12,0x0a,0x06,0x15,0x19,0x09,0x11,0x16,0x0c,0x2c,0x03,0x0f,0x14,0x19,0x09,0x11,0x15,0x0c,0x2d,0x1b,0x17,0x1d,0x12,0x0a,0xfb,0xfb,0x29,0x1b,0x0c,0x18, -0x0c,0x32,0x42,0x07,0xb1,0x4b,0x4b,0xf9,0x00,0x4b,0x4b,0xac,0x2d,0x2d,0x04,0xac,0x1e,0x1d,0x42,0x16,0x24,0x2e,0x18,0x3e,0x20,0x15,0x03,0x1a,0x2a,0x38,0x21,0x23,0x2e,0x31,0x1f,0x36,0x2c,0x1a,0x10,0x42,0x0e,0x0f,0x05,0x04,0x20,0x26,0x01,0x10,0x41,0x41,0xdf,0x1e,0x1d,0x42,0x16,0x24,0x2e,0x18,0x3e,0x20,0x15,0x03,0x1a,0x2a, -0x38,0x21,0x23,0x2e,0x31,0x1f,0x36,0x2c,0x1a,0x10,0x42,0x0e,0x0f,0x05,0x04,0x20,0x26,0x01,0x10,0x41,0x41,0xfe,0x50,0x20,0x2c,0x2c,0x20,0x20,0x2c,0x2c,0x20,0x11,0x15,0x15,0x11,0x10,0x15,0x15,0xfe,0xd8,0x1f,0x2c,0x2c,0x1f,0x21,0x2c,0x2c,0x21,0x10,0x15,0x15,0x10,0x11,0x15,0x15,0xfe,0x51,0x4b,0x4b,0x83,0x4c,0x4c,0x02,0x10, -0xd1,0xd1,0xfe,0xd8,0xc7,0xc7,0x60,0xc7,0xc7,0x01,0x86,0xd1,0xd1,0xfb,0x5c,0xc7,0xc7,0x75,0xbd,0xbd,0x05,0x44,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x2c,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d, -0x02,0x04,0xf0,0xa2,0x29,0x31,0x1b,0x09,0x12,0x0f,0x14,0x0d,0x11,0x14,0x16,0x0f,0x14,0x11,0x15,0x10,0x13,0x0e,0x10,0x11,0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c,0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x63,0x4c,0x2a,0x26,0x04,0x0d,0x16,0x12,0x63, -0x4b,0x2c,0x25,0x04,0x0c,0x17,0x12,0x9f,0x85,0x2c,0x26,0x01,0x04,0x0c,0x17,0x12,0x9f,0xfc,0xfb,0x07,0x20,0x0e,0x0e,0x1f,0x1a,0x10,0x27,0x14,0x13,0x1c,0x14,0x14,0x1c,0x08,0x07,0x59,0x63,0x19,0x2e,0x42,0x29,0x0f,0x1b,0x0e,0x0e,0x16,0x0c,0x21,0x2f,0x11,0x3f,0x31,0x10,0x24,0x3b,0x2b,0x17,0x3d,0x24,0x41,0x11,0x14,0x0b,0x11, -0x13,0x09,0x1b,0x2e,0x23,0x14,0x22,0x2d,0x2c,0x0a,0x09,0x12,0x0f,0x09,0x0f,0x1a,0x25,0x17,0x0b,0x11,0x0c,0x06,0x08,0x06,0x46,0x06,0x08,0x15,0x19,0x15,0x01,0xfd,0x54,0x04,0x19,0x1d,0x0f,0x1d,0x17,0x0e,0x14,0x11,0x15,0x10,0x13,0x0e,0x10,0x11,0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c, -0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x9f,0x89,0x2a,0x25,0x0d,0x19,0x26,0x19,0x0c,0x0d,0x15,0x08,0x06,0x45,0x06,0x08,0x15,0x0d,0x06,0x0c,0x09,0x06,0x04,0x83,0x26,0x27,0x1a,0x1f,0x01,0x6d,0xfe,0x90,0x25,0x30,0x1d,0x0c,0x13,0x12,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21, -0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20,0x01,0x39,0x5a,0xfd,0xf1,0x02,0x46,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xfc,0x7e,0xdb,0xfe,0xa4,0x2c,0x25,0x20,0x29,0x0a,0x19,0x16,0x0f,0xfd,0x41,0x04,0x05,0x03,0x01,0x0f,0x14, -0x0c,0x1c,0x19,0x11,0x04,0x56,0x0f,0x14,0x0c,0x1d,0x18,0x11,0x68,0x04,0x05,0x03,0x01,0x6a,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0xfe,0xb5,0x4c,0xfe,0xb0,0x4d,0x03,0xa2,0x71,0xfb,0x17,0x14,0x25,0x01,0x9c,0xfe,0x61,0x29,0x32,0x1b,0x09,0x10,0x2e,0x3e,0x27,0x11,0x12,0x45,0x10,0x35,0x38,0x31,0x5b,0x2b,0x1f,0x2c,0x1b,0x16,0x12, -0x01,0xd0,0xfd,0xe7,0xfd,0xd0,0x14,0x25,0x01,0xa7,0xfe,0x56,0x29,0x31,0x1b,0x09,0x10,0x2e,0x41,0x2a,0x13,0x12,0x44,0x10,0x3d,0x39,0x30,0x5b,0x2c,0x1f,0x2d,0x1b,0x16,0x12,0x01,0xdb,0xfd,0xdd,0x06,0xa1,0x2d,0x20,0x20,0x2c,0x2c,0x20,0x20,0x2d,0x71,0x14,0x10,0x10,0x15,0x15,0x10,0x10,0x14,0xfd,0xfb,0x2d,0x21,0x20,0x2c,0x2c, -0x20,0x21,0x2d,0x72,0x14,0x10,0x10,0x16,0x16,0x10,0x10,0x14,0xfb,0xca,0x4c,0x4c,0x4c,0x04,0x61,0x25,0x8e,0x29,0xfb,0x6f,0x29,0x02,0x00,0x25,0x21,0x2a,0x03,0x7d,0x2a,0xbb,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xfd,0x87,0x0a,0x14, -0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xff,0xff,0x00,0x29,0x03,0xcb,0x02,0x25,0x04,0xdc,0x00,0x07,0x09,0x2c,0x00,0x24,0xfd,0x4f,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x04,0xdc,0x00,0x27,0x09,0x2c,0x00,0x24,0xfd,0x4f,0x00,0x06,0x14,0x02, -0x00,0x00,0xff,0xff,0x00,0x05,0x03,0x9a,0x02,0x9c,0x05,0x53,0x00,0x07,0x09,0x2d,0x00,0xd2,0xfd,0x45,0x00,0x01,0x00,0x9a,0xff,0xf2,0x03,0x2a,0x02,0xdd,0x00,0x13,0x00,0x10,0xb1,0x0a,0x12,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x30,0x31,0x05,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14, -0x1e,0x02,0x33,0x33,0x03,0x2a,0x79,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x56,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0xff,0xff,0x00,0x05,0xfe,0x60,0x02,0x01,0xff,0x71,0x00,0x06,0x09,0x2e,0x00,0x00,0xff,0xff,0x00,0x15,0x03,0xcb,0x02,0x11,0x04,0x23,0x00,0x07, -0x09,0x2f,0x00,0x10,0xfd,0x4f,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x04,0x23,0x02,0x26,0x14,0x02,0x00,0x00,0x00,0x07,0x09,0x2f,0x00,0x10,0xfd,0x4f,0xff,0xff,0x00,0x21,0x03,0x90,0x02,0x2c,0x05,0x49,0x00,0x07,0x09,0x30,0x00,0x62,0xfd,0x3b,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x05,0x49,0x00,0x27,0x09,0x30,0x00,0x62, -0xfd,0x3b,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x29,0xff,0x19,0x02,0x25,0xff,0x71,0x00,0x06,0x09,0x31,0x24,0x00,0xff,0xff,0xff,0xba,0xff,0x19,0x02,0x4e,0x00,0x99,0x00,0x26,0x09,0x31,0x24,0x00,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xf8,0x03,0xc5,0x02,0x57,0x04,0xef,0x00,0x07,0x09,0x32,0x00,0x24,0xfd,0x4f, -0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x57,0x04,0xef,0x00,0x27,0x09,0x32,0x00,0x24,0xfd,0x4f,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x69,0x03,0xbb,0x01,0xe5,0x05,0x2e,0x00,0x07,0x09,0x33,0x00,0x24,0xfd,0x45,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x05,0x2e,0x00,0x27,0x09,0x33,0x00,0x24,0xfd,0x45,0x00,0x06,0x14,0x02, -0x00,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0x4e,0x00,0x99,0x00,0x08,0x00,0x0e,0xbb,0x00,0x08,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x30,0x31,0x05,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x02,0x4e,0xfd,0xb2,0x23,0x23,0x23,0x23,0x02,0x4e,0x0e,0x34,0x20,0x20,0x33,0x00,0x01,0xff,0xe7,0x06,0x19,0x05,0x0f,0x07,0x5f, -0x00,0x1a,0x00,0x16,0xbc,0x00,0x12,0x04,0xfb,0x00,0x07,0x00,0x19,0x04,0xfb,0xb1,0x0c,0x02,0x00,0x2f,0x33,0xed,0xdc,0xed,0x30,0x31,0x01,0x07,0x21,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e,0x04,0x33,0x21,0x05,0x0f,0x5a,0xfd,0xf4,0x4a,0x7d,0x66,0x4d,0x19,0x10,0x27,0x2e,0x34,0x1d,0x79,0x28,0x57, -0x5a,0x59,0x2a,0x18,0x39,0x3f,0x44,0x49,0x4c,0x27,0x02,0x3c,0x06,0xb6,0x9d,0x32,0x3d,0x32,0x08,0x1f,0x3c,0x34,0x55,0x78,0x4c,0x23,0x18,0x23,0x29,0x23,0x18,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0x76,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x09,0x7e,0x02,0xb6,0xfc,0x8d, -0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x14,0x05,0x3e,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55, -0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0x76,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x09,0x7e,0x02,0xb6,0xfc,0x8d,0xff,0xff,0x00,0xc4,0xfd,0xe4,0x01,0x42,0xff,0x6c,0x00,0x07,0x09,0x73,0x00,0x00,0xf7,0x68,0xff,0xff,0x00,0x52,0xfd,0xc9,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15, -0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xc9,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xc9,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0xf7,0x03,0x3c,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x54,0x06,0x46,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9, -0x07,0x4b,0x03,0x3c,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x54,0x03,0x9c,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x08,0x04,0x03,0x3c,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x54,0x03,0x9c,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x0a,0xb0,0x03,0x3c,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x54,0x06,0x46, -0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xb9,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x14,0x18,0x06,0xe0,0xff,0x38,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x5d,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x14,0x18,0x03,0x84,0xff,0x38,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56, -0x00,0x00,0x00,0x07,0x14,0x18,0x03,0x84,0xff,0x38,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x14,0x18,0x06,0xe0,0xff,0x38,0x00,0x02,0x00,0xab,0xfe,0x0c,0x03,0x49,0x02,0xb7,0x00,0x15,0x00,0x29,0x00,0x18,0xb1,0x11,0x1d,0xbd,0x04,0xfb,0x00,0x0a,0x00,0x27,0x04,0xfb,0x00,0x00, -0x05,0x03,0x00,0x3f,0xed,0x2f,0xed,0x2f,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x11,0x23,0x11,0x06,0x06,0x37,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xff,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x9c,0x2a,0x58,0x7e,0x01, -0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xf0,0x92,0xfd,0xd5,0x02,0x09,0x11,0x12,0xc7,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0x02,0x00,0xab,0xfe,0x0c,0x04,0x02,0x02,0xb7,0x00,0x18, -0x00,0x2c,0x00,0x23,0xb1,0x14,0x11,0x41,0x0a,0x04,0xfb,0x00,0x13,0x05,0x03,0x00,0x20,0x04,0xfb,0x00,0x0a,0x00,0x2a,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0xed,0x3f,0xed,0x2f,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x11,0x23,0x11,0x06,0x06,0x37,0x2e, -0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xff,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x33,0x08,0xbd,0xb9,0x9c,0x2a,0x58,0x7e,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x47,0xbc, -0x72,0xa7,0xfe,0x1a,0x02,0x09,0x11,0x12,0xc7,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc3,0x05,0xca,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x07,0x0a,0x6e,0x00,0x9b,0xfd,0xee,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57, -0x05,0xca,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x07,0x0a,0x6e,0x00,0x9b,0xfd,0xee,0x00,0x01,0x00,0x8c,0x06,0x56,0x01,0xc8,0x08,0x05,0x00,0x18,0x00,0x0c,0xb3,0x08,0x0e,0x00,0x18,0x00,0x2f,0xcd,0xdc,0xcd,0x30,0x31,0x13,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32, -0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x8c,0x2a,0x49,0x35,0x1f,0x3e,0x2d,0x10,0x1d,0x0d,0x21,0x1f,0x37,0x52,0x36,0x1b,0x2d,0x53,0x75,0x47,0x06,0xa9,0x0a,0x17,0x23,0x33,0x26,0x29,0x2a,0x04,0x03,0x6d,0x06,0x1c,0x2e,0x3e,0x22,0x3e,0x57,0x3c,0x26,0x0e,0x00,0x00,0x01,0xfe,0x45,0x04,0x3a,0xff,0xd9,0x05,0xc0,0x00,0x03,0x00,0x0c, -0xb3,0x03,0x02,0x01,0x00,0x00,0x2f,0x32,0xcd,0x32,0x30,0x31,0x01,0x35,0x01,0x15,0xfe,0x45,0x01,0x94,0x04,0x3a,0x85,0x01,0x01,0x8f,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x80,0x05,0xbb,0x05,0x9a,0x00,0x26,0x01,0xb5,0x00,0x00,0x00,0x07,0x0a,0xbd,0x03,0x5b, -0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x8a,0x04,0x91,0x04,0x00,0x00,0x26,0x02,0x16,0x00,0x00,0x00,0x07,0x0a,0xbe,0x02,0x44,0x00,0x00,0x00,0x01,0xff,0x98,0xfe,0x96,0x04,0xf2,0x05,0x9a,0x00,0x13,0x00,0x1d,0x40,0x0e,0x10,0x91,0x0b,0x0b,0x06,0x07,0x91,0x01,0x01,0x06,0x12,0x03,0x00,0x03,0x00,0x3f,0x32,0x3f,0x39,0x2f,0xed,0x11, -0x33,0x2f,0xed,0x30,0x31,0x01,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x01,0x64,0x02,0xe6,0xa8,0xa8,0xfd,0x1a,0xfe,0xbc,0x4c,0x3c,0x36,0x44,0xaa,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x02,0x8e,0xfd,0x9d,0xfe,0x6b,0x1a,0x94,0x17,0x01,0x08,0x05,0x65,0x00,0x00,0x01, -0xff,0x5c,0xfe,0x1e,0x03,0xf8,0x04,0x00,0x00,0x16,0x00,0x1f,0x40,0x0f,0x16,0x95,0x10,0x10,0x0e,0x14,0x0a,0x95,0x05,0x05,0x14,0x15,0x11,0x0e,0x0f,0x00,0x3f,0x33,0x3f,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x30,0x31,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x23,0x11, -0x21,0x01,0x4a,0x31,0x5d,0x87,0x57,0x4b,0x37,0x3d,0x45,0xc8,0xa4,0x02,0x0a,0xa4,0xa4,0xfd,0xf6,0x04,0x73,0xb2,0x7a,0x3f,0x1a,0x99,0x27,0x01,0x3e,0x04,0x18,0xfe,0x5c,0x01,0xa4,0xfc,0x00,0x01,0xd1,0x00,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x0a,0x06,0x05,0x9a,0x00,0x25,0x00,0x2e,0x00,0x32,0x40,0x1b,0x08,0x91,0x04,0x25,0x1e,0x03, -0x1a,0x1a,0x07,0x23,0x1c,0x03,0x27,0x91,0x19,0x03,0x12,0x0a,0x26,0x91,0x10,0x0c,0x0e,0x12,0x01,0x07,0x12,0x00,0x3f,0x33,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0xed,0x30,0x31,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12, -0x37,0x12,0x13,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x01,0x11,0x21,0x06,0x02,0x07,0x06,0x02,0x07,0x0a,0x06,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xfe,0x67,0xc1,0x9b,0xfb,0xfd,0x9b,0x6f,0x48,0x79,0x33,0x65,0x0d,0x02,0xa3,0x01,0x99,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xfc,0x6b,0xfe, -0x94,0x08,0x36,0x30,0x30,0x67,0x3a,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x02,0x8e,0xfe,0x0a,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x19,0x84,0x01,0x31,0xb1,0x01,0x61,0x01,0x3b,0xfd,0x8b,0x02,0x75,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0xfd,0xae,0x04,0x6a,0x7d,0xfe,0xe2,0xa7,0xa7,0xfe,0xee,0x6f,0x00,0x02,0x00,0x12,0xfe,0x8b, -0x08,0x44,0x04,0x00,0x00,0x1d,0x00,0x22,0x00,0x32,0x40,0x1b,0x07,0x95,0x02,0x1d,0x19,0x03,0x15,0x15,0x05,0x1b,0x17,0x0f,0x1f,0x95,0x14,0x0f,0x10,0x08,0x1e,0x95,0x0e,0x0a,0x0c,0x15,0x01,0x05,0x15,0x00,0x3f,0x33,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0xed,0x30,0x31,0x21,0x23,0x01,0x23, -0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x00,0x13,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x11,0x23,0x02,0x03,0x08,0x44,0xe6,0xfe,0x3c,0x04,0xa4,0xfe,0x99,0x98,0x8b,0xfd,0x06,0x8c,0x5b,0x01,0x05,0x05,0x02,0x14,0x01,0x67,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0xfc,0xa3,0xe3,0x1b, -0xce,0x01,0xec,0xfe,0x14,0x01,0xd1,0xfe,0xba,0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0x01,0x79,0x01,0xfc,0xfe,0x5c,0x01,0xa4,0xfe,0x2b,0x01,0xd5,0xfe,0x12,0xfe,0x79,0x02,0xea,0xfe,0x62,0xfe,0xb4,0x00,0x00,0x03,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x05,0x9a,0x00,0x13,0x00,0x1a,0x00,0x1f,0x00,0x29,0x40,0x14,0x09,0x14,0x91,0x11, -0x1e,0x13,0x1b,0x1b,0x04,0x0e,0x13,0x03,0x08,0x00,0x18,0x91,0x06,0x02,0x04,0x12,0x00,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0xed,0x32,0x30,0x31,0x25,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x01,0x33,0x01,0x22,0x27,0x01,0x21,0x11,0x06,0x27,0x32, -0x37,0x11,0x01,0x04,0x81,0xc7,0x9b,0xfb,0xfd,0x9b,0x01,0x40,0x53,0x56,0xa8,0x63,0x02,0x28,0xa8,0xfd,0xae,0x30,0x2b,0xfe,0xe2,0x03,0x23,0xe5,0xb0,0xb1,0xe4,0xfe,0x66,0x98,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x1a,0x01,0xa4,0x2d,0xa2,0x73,0x02,0x1b,0xfd,0xed,0x93,0x36,0x02,0xdc,0xfc,0x72,0x06,0xfe,0x86,0x01,0xed,0x79,0x94, -0x6e,0x01,0xb1,0xfd,0xe1,0x00,0x00,0x03,0x00,0x12,0xfe,0x8b,0x04,0x23,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0x1f,0x00,0x2b,0x40,0x15,0x09,0x13,0xec,0x18,0x10,0x1d,0x0d,0x1a,0x1a,0x04,0x11,0x0d,0x0f,0x08,0x01,0x16,0x95,0x06,0x02,0x04,0x15,0x00,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0xed, -0x32,0x30,0x31,0x25,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x01,0x33,0x01,0x22,0x27,0x07,0x21,0x11,0x06,0x27,0x32,0x37,0x11,0x01,0x16,0x03,0xdf,0x44,0x8b,0xfd,0x06,0x8c,0xe8,0x62,0xa4,0x30,0x01,0xd0,0xa3,0xfe,0x11,0x52,0x3f,0xb2,0x02,0x8f,0xb5,0x89,0x94,0xaa,0xfe,0x98,0x13,0x8b, -0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0xfe,0x59,0xc4,0x01,0x5a,0xfe,0xae,0x6f,0x39,0x01,0xfa,0xfd,0x3a,0x15,0xc4,0x01,0x11,0x62,0x93,0x56,0x01,0x3a,0xfe,0x73,0x03,0x00,0xff,0xff,0x00,0x10,0xfe,0x80,0x05,0x60,0x05,0x9a,0x00,0x26,0x01,0xf2,0x00,0x00,0x00,0x07,0x0a,0xbd,0x03,0x00,0x00,0x00,0xff,0xff,0x00,0x10,0xfe,0x8a, -0x04,0x29,0x04,0x00,0x00,0x26,0x02,0x12,0x00,0x00,0x00,0x07,0x0a,0xbe,0x01,0xdc,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x0a,0x47,0x05,0xb2,0x02,0x06,0x12,0x8f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x02,0x06,0x12,0x90,0x00,0x00,0x00,0x05,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x13,0x00,0x1a, -0x00,0x21,0x00,0x28,0x00,0x2f,0x00,0x22,0x40,0x11,0x15,0x2a,0x91,0x23,0x21,0x21,0x00,0x24,0x20,0x91,0x0a,0x03,0x14,0x2b,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x30,0x31,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x27,0x11, -0x21,0x1e,0x03,0x01,0x2e,0x03,0x27,0x11,0x21,0x21,0x11,0x0e,0x03,0x01,0x21,0x11,0x3e,0x03,0x02,0xfe,0x98,0xf8,0xb0,0x60,0x61,0xb4,0x01,0x02,0xa1,0x94,0xf3,0xae,0x5f,0x61,0xb3,0xfc,0xdf,0xfe,0x57,0x09,0x45,0x6f,0x94,0x02,0x93,0x08,0x40,0x6b,0x92,0x5a,0xfd,0xbb,0x01,0xa9,0x59,0x93,0x6e,0x45,0x03,0xda,0xfe,0x61,0x5b,0x91, -0x6a,0x40,0x18,0x6a,0xbf,0x01,0x0a,0xa1,0xac,0x01,0x18,0xc6,0x6c,0x6a,0xbf,0xfe,0xf6,0xa0,0xaf,0xfe,0xe7,0xc5,0x6a,0x9b,0x01,0xfa,0x6b,0xb0,0x82,0x51,0x02,0x89,0x6e,0xb2,0x82,0x4f,0x0c,0xfe,0x03,0x01,0xfc,0x0d,0x53,0x84,0xaf,0xfe,0xfc,0xfe,0x08,0x0d,0x50,0x80,0xaf,0x00,0x00,0x05,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18, -0x00,0x13,0x00,0x17,0x00,0x1e,0x00,0x22,0x00,0x27,0x00,0x22,0x40,0x11,0x19,0x15,0x95,0x24,0x22,0x22,0x00,0x25,0x21,0x95,0x0a,0x0f,0x18,0x16,0x95,0x00,0x15,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x13,0x21, -0x11,0x36,0x05,0x11,0x21,0x1e,0x03,0x01,0x02,0x27,0x11,0x21,0x21,0x11,0x06,0x06,0x02,0x52,0x72,0xb8,0x82,0x46,0x49,0x88,0xc1,0x78,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0xdf,0xfe,0xfe,0xef,0xfe,0x7d,0xfe,0xfa,0x06,0x26,0x40,0x5c,0x01,0xd0,0x24,0xda,0xfe,0x6a,0x01,0x02,0x69,0x85,0x18,0x4c,0x8a,0xc1,0x75,0x81,0xcb,0x8d,0x4b, -0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x01,0xe9,0xfe,0xa6,0x25,0x23,0x01,0x58,0x42,0x72,0x5a,0x3d,0x01,0xd6,0x01,0x0a,0x22,0xfe,0xd4,0x01,0x2a,0x15,0x98,0x00,0xff,0xff,0x00,0x0c,0x06,0x1f,0x02,0xe6,0x09,0x39,0x02,0x06,0x13,0x7b,0x00,0x00,0xff,0xff,0x00,0x5a,0x06,0x1f,0x02,0x57,0x09,0x39,0x02,0x06,0x13,0x7d,0x00,0x00, -0x00,0x03,0x00,0x28,0xff,0xe8,0x04,0xca,0x05,0x88,0x00,0x4a,0x00,0x68,0x00,0x79,0x00,0x54,0x40,0x16,0x3a,0x37,0x99,0x40,0x32,0x27,0x2e,0x03,0x5a,0x4f,0x2b,0x00,0x4a,0x4a,0x2b,0x9a,0x55,0x55,0x22,0x9a,0x5e,0x07,0xb8,0x01,0x7f,0xb2,0x6f,0x6f,0x4b,0xb8,0x01,0x7f,0x40,0x0a,0x18,0x5e,0x18,0x5e,0x18,0x11,0x3b,0x40,0x19,0x75, -0xb9,0x01,0x7d,0x00,0x11,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0xed,0x10,0xed,0x33,0x2f,0xed,0x32,0x2f,0x33,0x10,0xcd,0x32,0x17,0x39,0x10,0xed,0x32,0x30,0x31,0x13,0x3e,0x03,0x37,0x11,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e, -0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x07,0x01,0x11,0x36,0x36,0x37,0x17,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x17,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x01,0x14,0x1e,0x02, -0x33,0x33,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x7c,0x09,0x2b,0x3c,0x48,0x26,0x23,0x56,0x6b,0x3a,0x14,0x25,0x41,0x59,0x35,0x3e,0x56,0x36,0x18,0x01,0x6f,0x49,0x7f,0x5e,0x37,0x1a,0x3a,0x5d,0x43,0x12,0x26,0x25,0x20,0x0c,0x07,0x18,0x3b,0x26,0x20,0x3e,0x17,0x07,0x0e,0x28,0x19,0x07,0x27,0x3f,0x58,0x39,0x5b,0x8b,0x34,0x1c, -0x47,0x4c,0x4d,0x22,0x5b,0x91,0x69,0x40,0x09,0x24,0x44,0x3c,0x30,0x0e,0x01,0x82,0x21,0x2e,0x07,0x3b,0x05,0x0f,0x1b,0x15,0x15,0x2a,0x22,0x15,0x3b,0x30,0x2b,0x10,0x26,0x22,0x17,0x24,0x3d,0x51,0x2e,0xfd,0x4e,0x0d,0x21,0x38,0x2c,0x0c,0x03,0x0e,0x1e,0x1b,0x17,0x20,0x14,0x09,0x01,0x97,0x01,0x09,0x0f,0x15,0x0e,0x01,0x9d,0x37, -0x50,0x59,0x21,0x43,0x68,0x47,0x25,0x2c,0x46,0x56,0x2b,0x98,0x2a,0x4f,0x72,0x49,0x3e,0x78,0x5e,0x3b,0x06,0x11,0x1b,0x15,0x26,0x21,0x20,0x27,0x0b,0x14,0x0a,0x54,0x6c,0x40,0x19,0x35,0x30,0xb1,0x13,0x1c,0x13,0x09,0x2b,0x5d,0x92,0x67,0x08,0x0e,0x0a,0x07,0x02,0x02,0x30,0xfe,0xb3,0x17,0x37,0x20,0x11,0x14,0x2d,0x27,0x19,0x1c, -0x2c,0x33,0x17,0x11,0x39,0x48,0x14,0x2d,0x46,0x32,0x2e,0x45,0x2e,0x17,0x01,0x1b,0x21,0x35,0x25,0x13,0x7a,0x1b,0x3a,0x30,0x1f,0x17,0x27,0x34,0x00,0x01,0xff,0x38,0x06,0x19,0x05,0x0f,0x06,0xc0,0x00,0x04,0x00,0x0c,0xba,0x00,0x02,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x30,0x31,0x01,0x21,0x35,0x21,0x15,0x04,0xb5,0xfa,0x83,0x05, -0xd7,0x06,0x19,0xa7,0x0a,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x05,0x26,0x06,0x50,0x00,0x3b,0x00,0x2e,0x40,0x12,0x3a,0x31,0x00,0x30,0x17,0x0b,0x11,0x9a,0x36,0x15,0x06,0x0d,0x0d,0x23,0x36,0x07,0x26,0x21,0xb8,0x01,0x7f,0xb1,0x23,0x18,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x39,0x39,0xcc,0x32, -0x30,0x31,0x01,0x1e,0x03,0x17,0x23,0x2e,0x03,0x27,0x11,0x23,0x11,0x26,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x21,0x35,0x21,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x03,0x6d,0x67,0xa0,0x6f,0x3e,0x05,0xa5,0x05,0x23,0x42,0x65, -0x45,0x72,0x0e,0x1e,0x0f,0x12,0x21,0x10,0x72,0x47,0x67,0x43,0x20,0x45,0x83,0xbd,0x78,0x01,0xd7,0xfb,0xb4,0x01,0x12,0x4a,0x78,0x54,0x2e,0x40,0x74,0xa4,0x63,0x72,0x11,0x23,0x12,0x0e,0x1c,0x0e,0x72,0x05,0x9c,0x1b,0x76,0xa6,0xcd,0x73,0x5c,0x9d,0x7d,0x59,0x18,0xfe,0x19,0x01,0xff,0x01,0x02,0x02,0x02,0xfe,0x02,0x01,0xe1,0x1d, -0x69,0x8e,0xae,0x62,0x78,0xd9,0xa4,0x61,0x8c,0x8c,0x22,0x7c,0xa1,0xbb,0x62,0x7c,0xde,0xb3,0x81,0x20,0xba,0xa2,0x02,0x02,0x02,0x01,0xa1,0x00,0x00,0x03,0x00,0xbc,0xff,0x2f,0x03,0xea,0x06,0x50,0x00,0x28,0x00,0x33,0x00,0x3e,0x00,0x38,0x40,0x0b,0x12,0x2a,0x99,0x35,0x35,0x27,0x26,0x06,0x00,0x00,0x34,0xb8,0x01,0x80,0xb7,0x08, -0x02,0x27,0x06,0x1d,0x24,0x24,0x2b,0xb8,0x01,0x80,0xb3,0x22,0x1b,0x26,0x18,0x00,0x3f,0x33,0x33,0xed,0x33,0x2f,0x33,0x3f,0x33,0x33,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x01,0x33,0x15,0x33,0x32,0x17,0x35,0x33,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x06,0x07,0x15,0x23,0x35, -0x06,0x22,0x23,0x23,0x15,0x23,0x35,0x23,0x11,0x33,0x13,0x23,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x01,0x7f,0x68,0x0f,0x23,0x24,0x68,0x3a,0x62,0x48,0x29,0x24,0x42,0x5b,0x37,0x48,0x71,0x4e,0x29,0xa9,0x9c,0x68,0x11,0x22,0x12,0x11,0x68,0xc3,0xc3,0x77,0x92,0x94,0x48,0x77, -0x54,0x2f,0xdc,0xfa,0x92,0x81,0x8b,0x17,0x3c,0x68,0x51,0x06,0x50,0xb6,0x03,0xb9,0xc7,0x0c,0x30,0x4b,0x69,0x47,0x3d,0x6c,0x58,0x41,0x12,0x04,0x09,0x3c,0x5c,0x78,0x45,0xac,0xc2,0x1f,0xe0,0xd3,0x02,0xd1,0xd1,0x05,0x9a,0xfd,0x02,0xfd,0xfc,0x1a,0x3d,0x64,0x4b,0xd9,0x1f,0x02,0x6c,0xfe,0x31,0x82,0x7c,0x2b,0x4c,0x39,0x21,0x00, -0x00,0x01,0x00,0x66,0xfe,0xef,0x02,0x50,0x02,0x19,0x00,0x13,0x00,0x12,0xb6,0x04,0x11,0x11,0x0b,0x0c,0x01,0x0b,0x00,0x2f,0x33,0x2f,0x12,0x39,0x2f,0x33,0x30,0x31,0x01,0x23,0x11,0x34,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a, -0xb4,0xfe,0xef,0x01,0x33,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0xff,0xff,0x00,0x66,0xfe,0xef,0x02,0x56,0x02,0x19,0x02,0x07,0x07,0xb1,0x00,0x00,0xfc,0x55,0x00,0x01,0x00,0x66,0xfe,0xef,0x00,0xe6,0x02,0x19,0x00,0x03,0x00,0x08,0xb1,0x03,0x00,0x00,0x2f,0x2f,0x30,0x31,0x13,0x23,0x11,0x33,0xe6,0x80, -0x80,0xfe,0xef,0x03,0x2a,0x00,0xff,0xff,0x00,0x66,0xfe,0xef,0x03,0x9a,0x01,0x24,0x02,0x07,0x07,0xb2,0x00,0x00,0xfc,0x55,0x00,0x01,0x00,0x66,0xfe,0xef,0x02,0x50,0x01,0x24,0x00,0x13,0x00,0x14,0xb7,0x04,0x11,0x11,0x0e,0x0b,0x0c,0x01,0x0b,0x00,0x2f,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x11,0x34,0x23,0x22, -0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a,0xb4,0xfe,0xef,0x01,0x33,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7,0x00,0xff,0xff,0x00,0x66,0xfd,0xf9,0x02,0x89,0x01,0x24,0x02,0x07,0x07,0xb8,0x00,0x00,0xfc,0x55,0x00,0x01, -0x00,0x3c,0xfe,0xdc,0x01,0xcd,0x01,0x26,0x00,0x2e,0x00,0x12,0xb6,0x06,0x1f,0x15,0x03,0x2c,0x1c,0x15,0x00,0x2f,0x33,0x2f,0x33,0x12,0x39,0x39,0x30,0x31,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15, -0x14,0x0e,0x02,0x23,0x22,0x27,0x3c,0x28,0x59,0x2f,0x33,0x32,0x10,0x1d,0x27,0x16,0x2c,0x40,0x2a,0x14,0x22,0x3b,0x51,0x30,0x2a,0x4e,0x20,0x23,0x4d,0x2d,0x2a,0x34,0x39,0x33,0x27,0x3f,0x2c,0x17,0x27,0x42,0x55,0x2e,0x60,0x45,0x96,0x16,0x15,0x1d,0x21,0x13,0x1a,0x14,0x10,0x09,0x10,0x21,0x27,0x30,0x21,0x28,0x3e,0x2a,0x16,0x0f, -0x0e,0x6d,0x0f,0x14,0x1a,0x1d,0x20,0x26,0x13,0x0f,0x1f,0x28,0x32,0x21,0x2b,0x40,0x2a,0x15,0x25,0x00,0xff,0xff,0x00,0x0a,0xfe,0xe3,0x01,0x68,0x01,0xb7,0x02,0x07,0x07,0xb9,0x00,0x00,0xfc,0x55,0x00,0x03,0x00,0x1e,0x04,0xdb,0x03,0x93,0x0a,0x63,0x00,0x1d,0x00,0x26,0x00,0x31,0x00,0x27,0x40,0x11,0x1f,0x1d,0x1d,0x27,0x04,0x1e, -0x13,0x13,0x28,0x0e,0x04,0x0e,0x04,0x0e,0x02,0x10,0x02,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x2f,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x11,0x23,0x11,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34, -0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x02,0x14,0x77,0x12,0x52,0x87,0x60,0x34,0x36,0x61,0x88,0x53,0x0d,0x77,0x0a,0x54,0x8a,0x62,0x35,0x34,0x5f,0x86,0x52,0x14,0x0a,0x73,0x7f,0x7c,0x71,0x86,0x0d,0x70,0x7f,0x20,0x3e,0x5a,0x3b,0x06,0x29,0xfe,0xb2,0x01,0x4e,0x38,0x65,0x8d,0x55,0x5a,0x93,0x69,0x3a,0x01, -0x2b,0xfe,0xd5,0x3a,0x69,0x93,0x5a,0x54,0x8d,0x66,0x38,0x02,0xa4,0xfd,0xc6,0x95,0x84,0x89,0x98,0xfd,0xc6,0x02,0x3a,0x97,0x8a,0x41,0x67,0x4a,0x27,0x00,0x00,0x01,0x00,0x6e,0xff,0x35,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x0e,0xb4,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x25,0x23,0x22,0x06,0x15,0x14, -0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0x9d,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0x00,0x02,0x00,0x6e,0xfe,0x48,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x19,0x00,0x14, -0xb7,0x16,0x19,0x19,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x25,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x21,0x35,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10, -0xfe,0x0a,0x01,0xf6,0x9d,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0xfd,0x36,0x75,0x00,0x00,0x01,0x00,0x6e,0x05,0x32,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x0e,0xb4,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02, -0x35,0x34,0x3e,0x02,0x33,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0x06,0x9a,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0x00,0x00,0x02,0x00,0x6e,0x04,0x45,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x16,0x19,0x19,0x07,0x09, -0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x21,0x35,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0xfe,0x0a,0x01,0xf6,0x06,0x9a, -0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0xfd,0x36,0x75,0x00,0x01,0x00,0x6e,0x05,0x32,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x0e,0xb4,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23, -0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x07,0x0f,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0x00,0x02,0x00,0x6e,0x04,0x45,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x19,0x16,0x16,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f, -0x33,0x33,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x21,0x15,0x21,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0xf6,0xfe,0x0a,0x07,0x0f,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77, -0x36,0x3f,0x40,0x3c,0xfe,0x20,0x75,0x00,0x00,0x01,0x00,0x6e,0xff,0x35,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x0e,0xb4,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25, -0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0x12,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0x00,0x02,0x00,0x6e,0xfe,0x48,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x19,0x16,0x16,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x13,0x21, -0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x21,0x15,0x21,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0xf6,0xfe,0x0a,0x01,0x12,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0xfe,0x20,0x75,0x00, -0xff,0xff,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x02,0x02,0x00,0xc3,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x0b,0x00,0x15,0x40,0x0a,0x09,0x04,0x91,0x06,0x03,0x0a,0x03,0x91,0x01,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x30,0x31,0x21,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x04, -0x0c,0xfc,0x1d,0x01,0x9d,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x9e,0x98,0x04,0x6a,0x98,0x98,0xfb,0x96,0x00,0x02,0x00,0x20,0xff,0xde,0x02,0xd9,0x05,0xa4,0x00,0x1d,0x00,0x29,0x00,0x2a,0x40,0x19,0x07,0x21,0x00,0x16,0x04,0xb9,0x24,0xc9,0x24,0x02,0x24,0x14,0x14,0x0a,0x19,0x03,0xb6,0x1e,0xc6,0x1e,0x02,0x1e,0x04,0x0a,0x12,0x00, -0x3f,0x33,0x33,0x5d,0x3f,0x12,0x39,0x2f,0x33,0x5d,0x17,0x39,0x30,0x31,0x25,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x05,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x83,0x1c,0x2d,0x0d,0x91,0x09,0x18,0x0d,0x38, -0x86,0x4a,0x35,0x59,0x40,0x24,0x29,0x46,0x5f,0x35,0x77,0x66,0x12,0xa8,0x17,0xfe,0x7c,0x2c,0x4d,0x20,0x22,0x47,0x28,0x33,0x33,0x36,0xd6,0x29,0x63,0x37,0x35,0x1b,0x3d,0x17,0x33,0x29,0x1d,0x36,0x4d,0x30,0x32,0x50,0x37,0x1d,0x43,0x4e,0x6d,0x03,0x95,0xfc,0x68,0x52,0x9e,0x91,0x1b,0x20,0x1b,0x1d,0x20,0x19,0x1e,0x1c,0xff,0xff, -0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x02,0x00,0x3b,0x00,0x00,0x00,0x03,0x00,0xbc,0xfe,0x29,0x04,0x2f,0x05,0x9a,0x00,0x19,0x00,0x21,0x00,0x2b,0x00,0x22,0x40,0x11,0x0b,0x1a,0x91,0x23,0x23,0x00,0x1b,0x91,0x17,0x19,0x19,0x17,0x12,0x22,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x39, -0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x23,0x11,0x23,0x13,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x21,0xbc,0x01,0x98,0x5d,0x95,0x69,0x39,0x22,0x40,0x5c,0x3a,0x48,0x75,0x54,0x2e,0x47,0x7c,0xab,0x63,0xfa,0xa8,0xa8,0xe4,0x95, -0xa2,0xfe,0xa6,0xc1,0xac,0x45,0x6e,0x4c,0x29,0xfe,0xed,0x05,0x9a,0x30,0x57,0x78,0x49,0x3d,0x6b,0x58,0x41,0x13,0x04,0x08,0x38,0x5a,0x7a,0x4a,0x5c,0x98,0x6c,0x3c,0xfe,0x29,0x04,0x73,0xfd,0xfc,0x8b,0x7b,0xfe,0x02,0x66,0xfe,0x31,0x22,0x41,0x5f,0x3c,0xd1,0xff,0xff,0x00,0xa7,0xfe,0x1f,0x04,0x15,0x05,0xfc,0x02,0x02,0x01,0xc4, -0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x07,0x58,0x05,0x9a,0x00,0x44,0x00,0x20,0x40,0x10,0x38,0x91,0x21,0x12,0x1c,0x17,0x3f,0x3f,0x0a,0x00,0x91,0x17,0x12,0x2e,0x0a,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x3f,0xed,0x30,0x31,0x25,0x32,0x12,0x11,0x34,0x2e,0x04,0x27,0x33,0x1e,0x05,0x15,0x14,0x02,0x06,0x06, -0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x3e,0x04,0x37,0x33,0x0e,0x05,0x15,0x10,0x12,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x05,0x5d,0xa0,0xab,0x18,0x28,0x35,0x3a,0x3b,0x1b,0xb5,0x18,0x38,0x39,0x35,0x29,0x19,0x46,0x85,0xc0,0x79,0x4a,0x72,0x5a,0x47,0x1e,0x1f,0x47,0x5a,0x72, -0x49,0x7a,0xbf,0x85,0x46,0x19,0x29,0x35,0x39,0x38,0x18,0xb5,0x1b,0x3b,0x3a,0x35,0x28,0x18,0xaa,0xa1,0x5c,0x76,0x44,0x1a,0xa8,0x18,0x42,0x77,0x7f,0x01,0x0a,0x01,0x15,0x45,0x96,0x96,0x8f,0x7b,0x63,0x1e,0x1c,0x58,0x73,0x88,0x98,0xa4,0x54,0xa7,0xfe,0xff,0xb0,0x5b,0x16,0x2b,0x3f,0x29,0x29,0x3f,0x2b,0x16,0x5b,0xb0,0x01,0x01, -0xa7,0x54,0xa4,0x98,0x88,0x73,0x58,0x1c,0x1e,0x63,0x7b,0x8f,0x96,0x96,0x45,0xfe,0xeb,0xfe,0xf6,0x32,0x62,0x93,0x62,0x01,0xc7,0xfe,0x4d,0x66,0x9b,0x68,0x34,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x04,0x01,0x02,0x02,0x01,0xd5,0x00,0x01,0x00,0x02,0x00,0xa6,0x00,0x00,0x06,0x14,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x1e, -0x40,0x0f,0x12,0x95,0x04,0x04,0x00,0x11,0x95,0x02,0x0f,0x13,0x95,0x0f,0x0f,0x00,0x15,0x00,0x3f,0x32,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x21,0x23,0x11,0x21,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x07,0x06,0x23,0x21,0x11,0x21,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x4a,0xa4,0x03,0x04,0x01,0x14,0x51,0x7f,0x58, -0x2e,0x5c,0x5c,0x8f,0xfe,0x39,0xfe,0x44,0x02,0x60,0xf6,0xcc,0xce,0x04,0x00,0xfe,0x6a,0x28,0x4e,0x71,0x49,0x93,0x54,0x53,0x03,0x74,0xfe,0x69,0xfe,0xaf,0xae,0xa3,0x00,0x02,0x00,0xa6,0xff,0xe8,0x05,0xfe,0x04,0x18,0x00,0x1f,0x00,0x28,0x00,0x27,0x40,0x15,0x23,0x95,0x1a,0x0f,0x01,0x95,0x28,0x28,0x0f,0x95,0x14,0x14,0x11,0x12, -0x0f,0x11,0x15,0x04,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x3f,0xed,0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x05,0xfe,0xfd,0x2d,0x04, -0xaf,0x9b,0xac,0x92,0x88,0xdd,0x68,0xa8,0x78,0x44,0x04,0xfe,0xc8,0xa4,0xa4,0x01,0x3e,0x0f,0x52,0x7b,0x9c,0x59,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x42,0x7f,0xb8,0x76,0xfe,0x29,0x04,0x00,0xfe,0x62,0x62,0xa2,0x73,0x3f,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c, -0x4f,0x6f,0x42,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x37,0x04,0x18,0x00,0x2e,0x00,0x37,0x00,0x2e,0x40,0x19,0x32,0x95,0x29,0x0f,0x01,0x95,0x0c,0x0f,0x26,0x23,0x37,0x37,0x0f,0x1e,0x95,0x23,0x0f,0x14,0x95,0x0f,0x15,0x04,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x3f,0xed, -0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x06,0x37,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88, -0xdd,0x88,0xc8,0x3a,0x45,0xdd,0x91,0x85,0x69,0x73,0x81,0x4e,0x84,0x5f,0x35,0x31,0x5b,0x81,0x4f,0x85,0x77,0x77,0xa1,0x89,0xd0,0x3f,0x40,0xc7,0x79,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x6d,0x69,0x66,0x70,0x32,0xa8,0x50,0x3b,0x6c,0x96,0x5b,0x5a,0x8f,0x65,0x36, -0x59,0x9c,0x47,0x73,0x65,0x66,0x72,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x02,0x00,0x90,0xff,0xe8,0x07,0x2a,0x04,0x18,0x00,0x23,0x00,0x33,0x00,0x22,0x40,0x12,0x24,0x95,0x1a,0x0f,0x17,0x03,0x08,0x15,0x0b,0x0f,0x0f,0x95,0x08,0x15,0x2e,0x95,0x00,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39, -0x3f,0xed,0x30,0x31,0x05,0x22,0x26,0x27,0x0e,0x03,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x2c,0x81,0xc6,0x40,0x17,0x3d,0x58,0x77,0x4f,0xfe,0x5d,0xa3,0x01,0x00, -0x48,0x66,0x40,0x1d,0xa4,0x42,0xb2,0x6e,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0xaa,0x18,0x5e,0x57,0x23,0x41,0x33,0x1e,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x2f,0x55,0x75,0x47,0x02,0x4e,0x62,0x3c,0x3e,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96, -0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0xc1,0xcf,0x00,0x00,0x01,0x00,0x35,0xff,0xea,0x04,0xce,0x06,0x02,0x00,0x26,0x00,0x26,0x40,0x14,0x1c,0x0b,0x16,0x95,0x11,0x00,0x20,0x06,0x09,0x95,0x1d,0x19,0x0b,0x0f,0x07,0x15,0x24,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x30,0x31,0x25,0x06, -0x23,0x20,0x11,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x21,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x04,0xce,0x3b,0x5e,0xfe,0xf3,0xfe,0x5f,0xa3,0xaf,0xaf,0x5d,0x5d,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0x01,0xa1,0xa4,0x01,0x02,0xfe,0xfe,0x46, -0x51,0x3f,0x2c,0x0a,0x20,0x01,0x2c,0x02,0x5e,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0x5d,0x5e,0x12,0x94,0x1b,0xd9,0x9e,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x05,0x47,0x05,0x2f,0x00,0x3d,0x00,0x25,0x40,0x14,0x37,0x95,0x34,0x0f,0x0b,0x21,0x1a,0x33,0x05,0x95,0x31,0x0f,0x1f,0x95, -0x1a,0x15,0x3b,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x33,0x12,0x39,0x39,0x3f,0xed,0x30,0x31,0x25,0x06,0x23,0x20,0x11,0x11,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x35,0x37, -0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x05,0x47,0x3b,0x5e,0xfe,0xf3,0xfe,0x3b,0x2e,0x4a,0x35,0x1d,0x1d,0x38,0x50,0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x93,0x4f,0x9f,0x73,0x85,0xa2,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x3d,0x63,0x7e,0x40,0x01,0xd9,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3f,0x2c,0x0a,0x20, -0x01,0x2c,0x02,0x5e,0x0d,0x1c,0x2d,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5b,0x3d,0x4c,0x70,0x4a,0x24,0x3d,0xb0,0x63,0x90,0x27,0x38,0x2d,0x25,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x67,0x42,0x1f,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0xad,0x04,0xda,0x00,0x0b,0x00,0x0b, -0xb3,0x05,0x06,0x00,0x18,0x00,0x3f,0x2f,0x39,0x30,0x31,0x21,0x26,0x02,0x27,0x00,0x25,0x37,0x04,0x13,0x16,0x12,0x17,0x04,0x74,0x58,0xde,0x8d,0xfe,0xeb,0xfe,0xb4,0xe6,0x01,0x1d,0xe7,0x75,0xb8,0x46,0xcd,0x01,0x5b,0x97,0x01,0x2a,0x85,0x6c,0xd4,0xfe,0xbe,0xa3,0xfe,0xa0,0xc1,0x00,0x01,0x00,0x50,0xff,0xfa,0x02,0xd5,0x04,0xdd, -0x00,0x42,0x00,0x26,0x40,0x11,0x2a,0x29,0x29,0x10,0x11,0x36,0x3e,0x11,0x3e,0x11,0x3e,0x05,0x18,0x20,0x33,0x05,0x18,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x23,0x35,0x21,0x36,0x36,0x35,0x34,0x26,0x23, -0x22,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x36,0x1e,0x02,0x15,0x14,0x06,0x15,0x33,0x15,0x23,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x02,0xd5,0x2d,0x51,0x70,0x43,0x17,0x4c,0x4b,0x36,0x1b,0x28,0x30,0x14,0xf7,0x01,0x0e,0x09,0x0d,0x4a,0x40,0x1d,0x27,0x08,0x11,0x0d,0x10, -0x47,0x69,0x45,0x21,0x04,0xe1,0xf3,0x2b,0x39,0x21,0x0d,0x39,0x42,0x3c,0x57,0x1d,0x27,0x20,0x11,0x1b,0x22,0x12,0x1d,0x2d,0x1f,0x10,0x01,0x02,0x2f,0x5e,0x4c,0x2f,0x26,0x46,0x62,0x3c,0x36,0x7a,0x80,0x82,0x3e,0x4e,0x11,0x39,0x28,0x4e,0x55,0x0b,0x08,0x1f,0x1a,0x11,0x26,0x17,0x02,0x3b,0x5e,0x72,0x36,0x17,0x2e,0x15,0x4e,0x7a, -0x9f,0x6a,0x44,0x1d,0x5d,0x65,0x47,0x36,0x12,0x31,0x19,0x13,0x25,0x1b,0x11,0x19,0x27,0x31,0x00,0x03,0x00,0x3c,0xfd,0xec,0x06,0xe7,0x05,0x65,0x00,0x3b,0x00,0x4f,0x00,0x63,0x00,0x43,0x40,0x0e,0x2e,0x15,0x9b,0x18,0x55,0x9b,0x4b,0x18,0x4b,0x18,0x4b,0x06,0x21,0x1f,0xb8,0x01,0x80,0x40,0x0c,0x27,0x5f,0x9b,0x41,0x41,0x06,0x39, -0x99,0x02,0x02,0x35,0x0b,0xb8,0x01,0x80,0xb2,0x09,0x06,0x18,0x00,0x3f,0x33,0xed,0x33,0x33,0x2f,0xed,0x11,0x33,0x2f,0xed,0x2f,0xed,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x30,0x31,0x01,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x37,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x20,0x35, -0x34,0x2e,0x02,0x23,0x22,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x16,0x15,0x14,0x0e,0x02,0x07,0x16,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xcf,0x67,0x59, -0xb2,0x7f,0x56,0x2f,0xbf,0x5e,0x8c,0x50,0xa6,0x34,0x5a,0x43,0x26,0x2d,0x51,0x70,0x43,0x8b,0x8b,0x01,0x35,0x27,0x44,0x5c,0x34,0x9c,0x5d,0x89,0x18,0x4f,0x65,0x76,0x40,0x59,0x96,0x6c,0x3c,0xa6,0xa3,0x33,0x5c,0x7f,0x4b,0x0c,0x4f,0x63,0x61,0x42,0x2c,0x03,0x61,0x3f,0x6c,0x8f,0x51,0x50,0x8f,0x6c,0x3f,0x3f,0x6c,0x8f,0x50,0x50, -0x90,0x6c,0x3f,0xa1,0x25,0x40,0x55,0x30,0x30,0x55,0x40,0x25,0x25,0x40,0x55,0x30,0x30,0x55,0x40,0x25,0xfe,0x20,0x34,0xcd,0x8a,0xc5,0x1f,0xa4,0x4d,0x77,0x1e,0x38,0x4c,0x2f,0x38,0x5b,0x40,0x22,0xa0,0xdc,0x31,0x53,0x3d,0x23,0x77,0x50,0x2d,0x49,0x33,0x1c,0x38,0x66,0x8e,0x56,0xc3,0x6a,0x63,0xe1,0x4a,0x7f,0x60,0x3d,0x09,0x60, -0x81,0xa5,0x26,0x02,0xdb,0x50,0x8f,0x6c,0x3f,0x3f,0x6c,0x8f,0x50,0x51,0x90,0x6c,0x3f,0x3f,0x6c,0x90,0x51,0x30,0x55,0x41,0x25,0x25,0x41,0x55,0x30,0x30,0x55,0x40,0x25,0x25,0x40,0x55,0x00,0x02,0x00,0x54,0xfe,0x9b,0x08,0x76,0x08,0xe0,0x00,0x72,0x00,0x82,0x00,0x53,0xb9,0x00,0x39,0x01,0x81,0xb4,0x4b,0x4b,0x43,0x48,0x42,0xb8, -0x01,0x81,0x40,0x18,0x45,0x11,0x63,0x79,0x23,0x04,0x16,0x7e,0x1e,0x1e,0x01,0x76,0x16,0x16,0x69,0x71,0x01,0x01,0x45,0x45,0x43,0x0c,0x69,0x2d,0xb8,0x01,0x81,0xb4,0x55,0x55,0x40,0x43,0x18,0x00,0x3f,0x33,0x33,0x2f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x17,0x39,0x10,0xed, -0x32,0x12,0x39,0x2f,0xed,0x30,0x31,0x01,0x21,0x35,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x3e,0x03,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x0e,0x02,0x02,0x15,0x14,0x12,0x04,0x04,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21, -0x15,0x23,0x11,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x06,0x04,0x23,0x22,0x24,0x24,0x26,0x26,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x21,0x25,0x34,0x26,0x23,0x22,0x06,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x06,0xe5,0xfe,0x0b,0x1d,0x2f,0x20,0x11,0x28,0x4b,0x6b,0x42,0x3a, -0x60,0x47,0x2a,0x04,0x08,0x1a,0x20,0x20,0x0e,0x76,0x82,0x23,0x3f,0x56,0x34,0x38,0x56,0x40,0x2a,0x0d,0x46,0x93,0x78,0x4c,0x90,0x01,0x05,0x01,0x6d,0xde,0x5f,0xaf,0x96,0x7b,0x57,0x30,0x18,0x2d,0x40,0x29,0x1d,0x36,0x29,0x19,0xd8,0xfe,0xd7,0xd8,0x03,0xcd,0xf4,0x40,0x7f,0x50,0x81,0x5a,0x31,0x66,0xd9,0xfe,0xad,0xec,0xb2,0xfe, -0xc6,0xfe,0xf8,0xd2,0x91,0x4d,0x30,0x54,0x71,0x82,0x8d,0x45,0x44,0x75,0x9d,0x58,0x60,0xa4,0x77,0x44,0x23,0x23,0x01,0x21,0xfd,0x25,0x2b,0x2e,0x26,0x3b,0x11,0x02,0x16,0x22,0x2a,0x17,0x10,0x1d,0x16,0x0d,0x05,0xa8,0x7f,0x12,0x39,0x44,0x47,0x20,0x48,0x75,0x53,0x2e,0x29,0x46,0x61,0x37,0x04,0x08,0x08,0x05,0x78,0x6e,0x32,0x52, -0x3b,0x20,0x27,0x40,0x52,0x2c,0x2d,0x8f,0xd4,0xfe,0xe1,0xbd,0xda,0xfe,0xa0,0xfa,0x87,0x08,0x1f,0x3f,0x6e,0xa6,0x77,0x47,0x78,0x57,0x31,0x21,0x36,0x42,0x21,0xfe,0x1c,0x04,0x78,0xfb,0x88,0x05,0x28,0xb0,0xfe,0x99,0x3e,0x46,0x7c,0xad,0x67,0xb3,0xfe,0xee,0xba,0x5f,0x4b,0x8d,0xca,0xfe,0x01,0x2c,0xa9,0x8e,0xf6,0xd0,0xaa,0x87, -0x64,0x21,0x17,0x58,0x9d,0x75,0x45,0x45,0x78,0xa5,0x60,0x3c,0x7a,0x3b,0x56,0x36,0x30,0x15,0x0e,0x1e,0x37,0x2a,0x1a,0x0f,0x18,0x1f,0x00,0x01,0x00,0x74,0x00,0xfd,0x03,0x47,0x05,0x5a,0x00,0x5c,0x00,0x2b,0x40,0x14,0x37,0x53,0x59,0x22,0x1c,0x12,0x2d,0x03,0x53,0x03,0x12,0x12,0x03,0x53,0x03,0x0a,0x4d,0x40,0x21,0x0a,0x00,0x2f, -0x33,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x11,0x33,0x32,0x32,0x11,0x33,0x30,0x31,0x01,0x06,0x06,0x07,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x11,0x26,0x26,0x27,0x22,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16, -0x17,0x35,0x34,0x26,0x23,0x22,0x06,0x23,0x22,0x2e,0x02,0x27,0x13,0x33,0x17,0x16,0x33,0x32,0x37,0x17,0x07,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x15,0x36,0x36,0x37,0x03,0x47,0x2e,0x82,0x53,0x0d,0x15,0x1a,0x0c,0x42,0x24,0x50,0x43,0x2c,0x3b,0x2e,0x06,0x1b,0x1b,0x15,0x18,0x1c,0x18,0x0b,0x15, -0x20,0x15,0x2e,0x55,0x31,0x36,0x3c,0x10,0x1c,0x26,0x17,0x27,0x3b,0x07,0x0e,0x28,0x1e,0x2a,0x25,0x0f,0x17,0x09,0x0b,0x10,0x10,0x12,0x0c,0xfc,0x1c,0x9f,0x06,0x12,0x0f,0x0c,0x1d,0x75,0x08,0x1e,0x2b,0x38,0x22,0x1a,0x28,0x11,0x0e,0x19,0x0b,0x27,0x3f,0x2d,0x18,0x34,0x66,0x33,0x03,0x8b,0x54,0x4f,0x0e,0xfe,0x69,0x0f,0x1a,0x13, -0x0a,0x38,0x5b,0x75,0x3d,0x3f,0x47,0x06,0x18,0x33,0x2d,0x27,0x27,0x14,0x08,0x07,0x0c,0x25,0x23,0x19,0x01,0x69,0x04,0x0b,0x12,0x3f,0x2a,0x16,0x26,0x1d,0x10,0x2b,0x23,0x09,0x0d,0x0c,0x34,0x35,0x28,0x03,0x0e,0x1b,0x27,0x18,0x01,0x0c,0x6c,0x06,0x09,0x2a,0x78,0x1a,0x20,0x1a,0x2a,0x1b,0x02,0x03,0x17,0x25,0x31,0x1a,0x93,0x05, -0x2c,0x3b,0x00,0x01,0xff,0xf8,0xff,0xec,0x09,0x3b,0x05,0xcd,0x00,0xa4,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x3e,0x03,0x37,0x17,0x0e,0x05,0x07,0x0e,0x05,0x07,0x3e,0x05,0x37,0x3e,0x03,0x37,0x3e,0x03,0x37,0x17, -0x0e,0x05,0x07,0x0e,0x05,0x15,0x14,0x33,0x32,0x3e,0x02,0x37,0x17,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x3e,0x05,0x37,0x0e,0x03,0x07,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x12,0x37,0x3e,0x05,0x37,0x0e,0x05,0x07,0x0e,0x05,0x01,0x0a,0x3f,0x65,0x48,0x26,0x1c,0x31,0x44,0x29,0x22, -0x2c,0x1a,0x0b,0x14,0x2c,0x43,0x2f,0x1a,0x11,0x13,0x2e,0x4b,0x38,0x4b,0x87,0x7e,0x77,0x76,0x78,0x41,0x61,0xc1,0xb0,0x96,0x36,0x21,0x09,0x32,0x40,0x47,0x3f,0x2e,0x07,0x07,0x24,0x30,0x36,0x31,0x26,0x07,0x20,0x4b,0x51,0x55,0x55,0x52,0x27,0x2d,0x4a,0x43,0x40,0x23,0x39,0x70,0x64,0x55,0x1f,0x22,0x17,0x3d,0x44,0x48,0x46,0x40, -0x19,0x15,0x38,0x3c,0x3b,0x2f,0x1d,0x10,0x1b,0x51,0x5b,0x5e,0x29,0x19,0x27,0x5f,0x62,0x5f,0x28,0x23,0x38,0x27,0x15,0x24,0x3b,0x48,0x48,0x3f,0x15,0x1a,0x4d,0x55,0x58,0x4b,0x37,0x0a,0x1a,0x70,0x9d,0xc4,0x6d,0x3e,0x6b,0x5d,0x51,0x24,0x1f,0x38,0x34,0x2f,0x15,0x22,0x27,0x14,0x05,0x19,0x49,0x84,0x6c,0x18,0x3e,0x42,0x41,0x36, -0x28,0x08,0x2c,0x6c,0x74,0x79,0x71,0x67,0x28,0x37,0x6d,0x71,0x78,0x85,0x96,0x14,0x27,0x48,0x63,0x3c,0x2b,0x4c,0x38,0x20,0x14,0x21,0x28,0x14,0x18,0x2d,0x26,0x1c,0x06,0x03,0x16,0x12,0x09,0x30,0x31,0x26,0x3a,0x65,0x8b,0xa0,0xaf,0x58,0x84,0xef,0xc3,0x90,0x26,0x15,0x15,0x6e,0x91,0xa1,0x8e,0x69,0x10,0x10,0x59,0x79,0x8e,0x8f, -0x83,0x30,0x20,0x66,0x7c,0x8a,0x8a,0x82,0x35,0x3d,0x64,0x55,0x4b,0x25,0x3d,0x69,0x54,0x3e,0x12,0x21,0x21,0x65,0x78,0x85,0x85,0x7d,0x33,0x2a,0x79,0x8a,0x90,0x81,0x67,0x1c,0x1d,0x38,0x59,0x6e,0x35,0x15,0x36,0x72,0x5e,0x3d,0x1a,0x3c,0x64,0x4a,0x31,0x7c,0x86,0x87,0x78,0x60,0x1c,0x23,0x5f,0x67,0x67,0x56,0x3e,0x0b,0x12,0x56, -0x97,0xde,0x99,0x59,0xa6,0x98,0x85,0x36,0x2e,0x4f,0x3b,0x21,0x2f,0x45,0x4d,0x1e,0x21,0x7b,0xbc,0x01,0x01,0xa7,0x26,0x5c,0x5e,0x5b,0x4c,0x36,0x0b,0x21,0x6b,0x82,0x91,0x90,0x86,0x36,0x49,0xa1,0x9b,0x8d,0x6b,0x3f,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x04,0x2a,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xc9, -0xfe,0xf4,0xff,0xff,0x00,0xab,0xfe,0xa6,0x05,0xf4,0x05,0xec,0x00,0x27,0x0f,0x50,0x02,0x59,0xfe,0xab,0x00,0x06,0x09,0x24,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0x12,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0xff,0xff,0x00,0xab,0xfd,0xc9, -0x06,0x9f,0x04,0x12,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xad,0xfd,0xce,0x00,0x07,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x04,0x39,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x14,0x7c,0x03,0xc6,0xfb,0xaa,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x5f,0x02,0x26,0x09,0x17, -0x00,0x00,0x00,0x07,0x0a,0x1f,0x00,0xa5,0xfc,0xd3,0xff,0xff,0x00,0x9a,0xfd,0xfb,0x05,0x91,0x05,0xe2,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0x01,0xfe,0x00,0x00,0x07,0x0a,0x1f,0x01,0xc4,0xfd,0x56,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x4b,0x03,0x62,0x02,0x06,0x09,0xc8,0x00,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff, -0x05,0x4b,0x02,0xb7,0x02,0x06,0x09,0x7c,0x00,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x01,0xc1,0x02,0x06,0x09,0x5f,0x00,0x00,0x00,0x04,0x00,0x00,0x06,0x71,0x04,0xb4,0x09,0x9a,0x00,0x28,0x00,0x2c,0x00,0x6e,0x00,0x7c,0x00,0x00,0x01,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23, -0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x13,0x33,0x11,0x23,0x25,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26, -0x27,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x33,0x27,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x17,0x3e,0x03,0x03,0x75,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x0b,0x13,0x08,0x08,0x6a,0x4d,0x15,0x2b,0x17,0x17,0x2f,0x10,0x1d,0x27,0x18,0x0a,0x1f,0x11,0x61,0x0c,0x12,0x05,0x04, -0x1d,0x1d,0xee,0x5c,0x5c,0xfd,0x6b,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x1b,0x45,0x78,0x33,0x31,0x26,0x10,0x23,0x38,0x27,0x26,0x53,0x26,0x2b,0x4d,0x28,0x3f,0x5b,0x39,0x1b,0x0a,0x1a,0x2e,0x23,0x19,0x30,0x11,0x08,0x05,0x12,0x2d,0x32,0x35,0x1a,0x19,0x38,0x2d,0x1e,0x09,0x19,0x2c,0x24,0x25,0x50,0x2d,0x8d,0x26,0x21,0x18,0x32, -0x17,0x11,0x27,0x14,0x1c,0x24,0x15,0x07,0x07,0x95,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x07,0x03,0x66,0x67,0x08,0x0b,0x5f,0x07,0x09,0x15,0x26,0x34,0x1f,0x39,0x73,0x30,0x1d,0x42,0x20,0x14,0x15,0x02,0x05,0xfd,0x9a,0x61,0x16,0x23,0xb7,0xba,0x31,0x3c,0x20,0x0a,0x36,0x2e,0x16,0x30,0x1a,0x16,0x27,0x1e,0x11,0x0f, -0x0d,0x5a,0x14,0x09,0x1e,0x35,0x45,0x27,0x15,0x2b,0x2a,0x29,0x15,0x1c,0x45,0x1d,0x46,0x05,0x09,0x01,0x03,0x07,0x07,0x04,0x07,0x13,0x25,0x1e,0x0e,0x26,0x2a,0x2b,0x14,0x17,0x1a,0xbb,0x0b,0x08,0x04,0x03,0x1a,0x2e,0x14,0x0d,0x18,0x15,0x11,0x00,0x00,0x02,0xff,0x2b,0x06,0x1f,0x02,0xdf,0x08,0x40,0x00,0x36,0x00,0x48,0x00,0x21, -0x40,0x0e,0x00,0x37,0x37,0x23,0x31,0x05,0x0f,0x0f,0x1a,0x3f,0x05,0x05,0x29,0x1a,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x33,0x11,0x33,0x30,0x31,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15, -0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x33,0x17,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x01,0x35,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13,0x20,0x46,0x71,0x51,0x17,0x3e,0x3b,0x30,0x0a,0x02,0x02,0x1a,0x36,0x56,0x3e,0x3f,0x54,0x32,0x15,0x06,0x07,0x56, -0x05,0x05,0x3a,0x45,0x28,0x38,0x23,0x10,0x07,0x07,0x58,0x0a,0x02,0x1b,0x13,0xd3,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c,0x1d,0x1b,0x07,0x2f,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x06,0x0c,0x0a,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x1a,0x37,0x1d,0x1b,0x29,0x16,0x42, -0x34,0x12,0x28,0x41,0x2f,0x21,0x43,0x2f,0x5d,0x14,0x1c,0x03,0x02,0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x00,0x01,0x00,0x00,0x06,0x1e,0x01,0xba,0x08,0xdd,0x00,0x35,0x00,0x19,0x40,0x0a,0x19,0x00,0x30,0x30,0x11,0x2a,0x21,0x21,0x0a,0x11,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0x30,0x31,0x01, -0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x32,0x16,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x3e,0x03,0x37,0x01,0x62,0x47,0x61,0x3d,0x1b,0x12,0x26,0x3d,0x2b,0x2d,0x65,0x26,0x2f,0x5c,0x2e,0x45,0x61, -0x3e,0x1d,0x23,0x30,0x1c,0x1a,0x1c,0x35,0x4d,0x30,0x06,0x16,0x1a,0x16,0x06,0x0b,0x2b,0x11,0x34,0x43,0x11,0x0e,0x10,0x2f,0x34,0x37,0x1a,0x07,0xaa,0x10,0x28,0x2f,0x33,0x1b,0x18,0x2b,0x20,0x13,0x16,0x0e,0x63,0x10,0x12,0x21,0x38,0x4c,0x2a,0x2a,0x56,0x2a,0x1f,0x49,0x23,0x24,0x44,0x34,0x1f,0x02,0x03,0x03,0x64,0x02,0x03,0x25, -0x32,0x1a,0x2d,0x0f,0x0a,0x13,0x13,0x10,0x07,0x00,0x00,0x04,0x00,0x00,0x06,0x71,0x01,0xf5,0x09,0x3e,0x00,0x2a,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x27,0x40,0x11,0x40,0x3e,0x3e,0x3b,0x39,0x39,0x2b,0x00,0x19,0x0f,0x0f,0x22,0x33,0x19,0x19,0x08,0x22,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x32,0x2f,0x33, -0x33,0x2f,0x33,0x30,0x31,0x13,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x32,0x36,0x37,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x65, -0x03,0x05,0x0f,0x23,0x3a,0x2c,0x31,0x3c,0x23,0x0e,0x03,0x18,0x1a,0x1d,0x36,0x29,0x19,0x15,0x26,0x33,0x1e,0x21,0x33,0x19,0x16,0x17,0x7d,0x88,0x43,0x5c,0x38,0x19,0x05,0x05,0x01,0x61,0x0b,0x15,0x0b,0x02,0x0b,0x11,0x16,0x0b,0x10,0x1d,0x27,0x2f,0x73,0x73,0xc8,0x73,0x73,0x07,0xa4,0x1a,0x2c,0x13,0x21,0x2c,0x1b,0x0c,0x0f,0x1b, -0x25,0x15,0x07,0x12,0x23,0x33,0x21,0x1b,0x3d,0x33,0x21,0x25,0x25,0x21,0x65,0x33,0x7e,0x77,0x1b,0x34,0x4e,0x32,0x17,0x32,0x1c,0x10,0x01,0x05,0x0e,0x25,0x21,0x17,0x2b,0x19,0x15,0x18,0x01,0x38,0x71,0x71,0x71,0x00,0x00,0x03,0x00,0x32,0x05,0xd1,0x01,0xd4,0x08,0x8c,0x00,0x1c,0x00,0x20,0x00,0x24,0x00,0x1d,0x40,0x0c,0x23,0x22, -0x22,0x1f,0x1d,0x1d,0x11,0x08,0x1c,0x1c,0x16,0x08,0x00,0x2f,0x33,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x32,0x2f,0x33,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x21,0x15,0x21,0x01,0xc7,0x07,0x06, -0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06,0x05,0x58,0x09,0x30,0x3c,0x46,0x3c,0x07,0x06,0x31,0x73,0x73,0xdd,0x01,0x52,0xfe,0xae,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x36,0x29,0x40,0x4f,0x1a,0x3d,0x26,0x38,0x71,0xfd,0x9d,0x58,0xff,0xff,0x00,0x32,0xfc,0xd5,0x01,0xd4, -0xff,0x90,0x02,0x03,0x14,0x61,0x00,0x00,0xf7,0x04,0x00,0x0b,0xfc,0xe6,0x07,0x1d,0x02,0xe0,0x0a,0x0e,0x00,0x64,0x00,0x68,0x00,0x6c,0x00,0x70,0x00,0x74,0x00,0x78,0x00,0x7c,0x00,0x80,0x00,0x84,0x00,0x88,0x00,0x8c,0x00,0x00,0x03,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x35, -0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17, -0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x01,0x33,0x11,0x23,0x01,0x33,0x15,0x23,0x07,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xf6,0x14,0x26,0x50,0x09,0x14,0x12,0x0c,0x5c,0x13,0x26,0x36,0x09,0x15, -0x11,0x0c,0x5c,0x11,0x21,0x3e,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x3b,0x23,0x32,0x11,0x17,0x35,0x19,0x4c,0x19,0x2c,0x0d,0x17,0x39,0x19,0x6a,0x17,0x2d,0x0d,0x17,0x35,0x1a,0x0e,0x17,0x27,0x22,0x1d,0x0e,0x16,0x2b,0x17,0x1c,0x28,0x50,0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x17,0x2a,0x17,0x0e,0x09,0x15, -0x11,0x0c,0x5c,0x03,0x7a,0x5c,0x5c,0xfc,0xdd,0x3f,0x3f,0x9e,0x65,0x65,0x02,0x2e,0x65,0x65,0xfc,0x7b,0x65,0x65,0x03,0xcc,0x64,0x64,0xfc,0xc0,0x64,0x64,0x01,0x12,0x64,0x64,0x45,0x64,0x64,0x02,0x2e,0x64,0x64,0x07,0xe9,0x2c,0x28,0x06,0x0d,0x16,0x11,0x01,0xcb,0xfe,0x4f,0x2c,0x28,0x06,0x0d,0x16,0x11,0xb7,0x9d,0x2a,0x2a,0x16, -0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x15,0x12,0x16,0x11,0x16,0x11,0x16,0x11,0x18,0x0f,0x16,0x11,0x0c,0x13,0x18,0x0c,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x12,0x1d,0x06,0x0d,0x16,0x11,0xb7,0x01,0x14,0xfd,0x9a,0x02,0xda,0xc4,0x8f,0x62,0x62,0x62,0xeb,0x62,0xaf,0x62, -0xfe,0x8d,0x62,0xaf,0x62,0xea,0x62,0x62,0x62,0x00,0x00,0x07,0xfb,0x6b,0x06,0xaa,0x03,0xb0,0x09,0x9a,0x00,0x84,0x00,0x94,0x00,0x98,0x00,0xa4,0x00,0xa8,0x00,0xac,0x00,0xb0,0x00,0x00,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x33,0x32,0x3e,0x02,0x37,0x27,0x26,0x26,0x23,0x22, -0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x07,0x07,0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06, -0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x03,0x1e,0x03,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x27,0x01,0x33,0x11,0x23,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x13,0x23,0x35,0x33, -0x17,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0xfc,0xb3,0x26,0x47,0x16,0x32,0x29,0x0c,0x13,0x1a,0x0e,0x5f,0x17,0x20,0x0b,0x02,0x08,0x0e,0x15,0x0f,0x09,0x2a,0x4f,0x49,0x45,0x20,0x0b,0x1d,0x3f,0x32,0x1e,0x3d,0x13,0x17,0x3c,0x1f,0x32,0x45,0x1e,0x0d,0x1d,0x22,0x2b,0x1c,0x10,0x3d,0x02,0x22,0x2c,0x1d,0x09,0x15,0x11,0x0c,0x5c,0x03, -0x0b,0x15,0x11,0x16,0x22,0x5c,0x13,0x26,0x17,0x1d,0x5d,0x10,0x21,0x0d,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x1c,0x27,0x0e,0x14,0x34,0x1a,0x22,0x35,0x12,0x17,0x37,0x19,0x24,0x32,0x0f,0x16,0x38,0x18,0x38,0x2d,0x42,0x08,0x1c,0x41,0x4b,0x54,0x2f,0x0f,0x1b,0x2b,0x0c,0x1a,0x4e,0x2e,0x17,0x41,0x1d,0xe7,0x35,0x49,0x2d,0x13, -0x51,0x49,0x47,0x4b,0x35,0x21,0x1f,0x07,0xb2,0x5c,0x5c,0xf8,0x73,0x21,0x17,0x20,0x1c,0x18,0x21,0x1a,0x21,0x20,0x65,0x65,0x8c,0x64,0x64,0x02,0xe0,0x64,0x64,0x07,0x9e,0x05,0x06,0x14,0x16,0x12,0x3e,0x4b,0x52,0x24,0x45,0x79,0x31,0x0a,0x19,0x17,0x0f,0x01,0x12,0x1e,0x27,0x14,0x05,0x10,0x18,0x08,0x05,0x58,0x08,0x0b,0x19,0x10, -0x06,0x0d,0x0b,0x09,0x02,0x59,0x27,0x14,0x10,0x06,0x0d,0x16,0x11,0x71,0x58,0x15,0x20,0x14,0x0a,0x17,0x23,0x71,0x57,0x2c,0x28,0x17,0x23,0xb8,0x9b,0x2b,0x2a,0x02,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x13,0x0f,0x13,0x0f,0x10,0x17,0x16,0x11,0x14,0x12,0x14,0x12,0x30,0x2a,0x10,0x20,0x1a,0x10,0x1c,0x11,0x1b,0x15, -0x08,0x04,0x01,0x96,0x21,0x43,0x45,0x47,0x25,0x42,0x51,0x49,0x3e,0x40,0x63,0x1f,0x1a,0x01,0x0c,0xfd,0x9a,0x8a,0x1a,0x17,0x1a,0x16,0x1f,0x3c,0x23,0x16,0x42,0x01,0x2a,0x62,0x62,0x62,0xfd,0x3b,0x62,0x00,0x00,0x06,0xfb,0x9b,0x07,0x31,0x03,0x92,0x09,0x9a,0x00,0x7e,0x00,0x82,0x00,0x92,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0x00, -0x01,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x26,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37, -0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x16,0x16,0x17,0x01,0x33,0x11,0x23,0x25,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23, -0x22,0x0e,0x02,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x7a,0x17,0x1d,0x5d,0x03,0x0c,0x16,0x13,0x10,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x20,0x2c,0x0f,0x14,0x34,0x1a,0x1b,0x24,0x2d,0x11,0x11,0x2e,0x35,0x3b,0x1e,0x48,0x66,0x45,0x2a,0x0b,0x0c,0x11, -0x07,0x17,0x37,0x19,0x19,0x11,0x1c,0x1a,0x19,0x0f,0x2a,0x67,0x36,0x48,0x68,0x89,0x27,0x1d,0x15,0x0b,0x05,0x5a,0x04,0x09,0x0a,0x0e,0x0c,0x22,0x33,0x48,0x31,0x13,0x26,0x21,0x18,0x04,0x22,0x10,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x39,0x17,0x21,0x09,0x05,0x5c,0x0e,0x02,0x0e,0x10,0x0f,0x37,0x4e,0x65,0x3d,0x33,0x4a, -0x30,0x17,0x01,0x0e,0x17,0x01,0xe2,0x5c,0x5c,0xfc,0x5a,0x21,0x52,0x35,0x26,0x39,0x27,0x14,0x40,0x32,0x25,0x41,0x34,0x29,0xfe,0x59,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x11,0x64,0x64,0x04,0x24,0x64,0x64,0x07,0x95,0x17,0x23,0xb8,0x9b,0x17,0x20,0x16,0x0a,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a, -0x01,0x11,0x10,0x13,0x0f,0x0f,0x18,0x0e,0x11,0x09,0x02,0x01,0x03,0x05,0x05,0x05,0x0f,0x08,0x16,0x11,0x03,0x06,0x08,0x06,0x13,0x07,0x0f,0x20,0x17,0x43,0x25,0x1b,0x34,0x14,0x11,0x34,0x13,0x14,0x23,0x09,0x08,0x0a,0x04,0x01,0x01,0x02,0x02,0x01,0x16,0x31,0x20,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x19,0x0f,0x11, -0x3a,0x17,0x68,0x0b,0x11,0x04,0x28,0x5c,0x4e,0x34,0x1f,0x35,0x46,0x27,0x20,0x25,0x01,0x02,0x04,0xfd,0x9a,0x61,0x01,0x01,0x03,0x0c,0x19,0x16,0x3a,0x31,0x1d,0x2f,0x3c,0x24,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x19,0x0f,0x0d,0x01,0x42,0x62,0x8d,0x62,0x00,0x00,0x05,0xfc,0x00,0x07,0x1d,0x02,0x8d,0x09,0xb2,0x00,0x7e, -0x00,0x82,0x00,0x86,0x00,0x8a,0x00,0x8e,0x00,0x00,0x01,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x35,0x25,0x15,0x07,0x1e,0x03,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22, -0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x05,0x23,0x35, -0x33,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xfe,0x24,0x14,0x26,0xd5,0x43,0x30,0x23,0x40,0x5a,0x36,0x01,0x5e,0xea,0x42,0x50,0x2e,0x15,0x07,0x01,0x07,0x10,0x1d,0x19,0x13,0x09,0x15,0x11,0x0c,0x5c,0x03,0x0b,0x15,0x11,0x16,0x22,0x5c,0x13,0x26,0x17,0x1d,0x5d,0x0f,0x22,0x38,0x29,0x22,0x35,0x12,0x17,0x37, -0x19,0x24,0x32,0x0f,0x16,0x38,0x18,0x38,0x0a,0x16,0x16,0x12,0x05,0x17,0x50,0x42,0xdd,0x23,0x32,0x11,0x17,0x35,0x1a,0x10,0x2c,0x41,0x1c,0x16,0x2b,0x17,0x1c,0x28,0x50,0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x17,0x2a,0x17,0x0e,0x09,0x15,0x11,0x0c,0x5c,0xfe,0x62,0x65,0x65,0x01,0x57,0x65,0x65,0x8c,0x64, -0x64,0xfe,0xa9,0x64,0x64,0x07,0xe9,0x2c,0x28,0x1a,0x18,0x1b,0x35,0x34,0x34,0x1b,0x3d,0xdb,0x61,0x94,0x20,0x38,0x36,0x36,0x1e,0x07,0x18,0x16,0x11,0x06,0x0d,0x16,0x11,0x71,0x58,0x15,0x20,0x14,0x0a,0x17,0x23,0x71,0x57,0x2c,0x28,0x17,0x23,0xb8,0x9b,0x33,0x46,0x2b,0x14,0x10,0x17,0x16,0x11,0x14,0x12,0x14,0x12,0x0b,0x10,0x12, -0x07,0x17,0x1d,0x15,0x12,0x16,0x11,0x2a,0x19,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x12,0x1d,0x06,0x0d,0x16,0x11,0xb7,0x54,0x62,0x27,0x62,0x62,0x62,0xeb,0x62,0x00,0x00,0x06,0xfd,0x71,0x07,0x31,0x01,0x80,0x09,0x5c,0x00,0x43,0x00,0x52,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d, -0x00,0x00,0x03,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x26,0x26,0x17,0x34, -0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xfc,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x74,0x1f,0x16,0x15,0x26,0x32,0x1e,0x24,0x38,0x28,0x15,0x33,0x4f,0x60,0x2c,0x4b,0x1a,0x2f, -0x14,0x2a,0x67,0x36,0x48,0x68,0x89,0x27,0x1d,0x15,0x0b,0x05,0x5a,0x04,0x09,0x0a,0x0e,0x0c,0x22,0x33,0x48,0x31,0x13,0x26,0x21,0x18,0x04,0x22,0x10,0xc8,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x01,0x58,0x0b,0x12,0x17,0x0c,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x58,0x65,0x65,0x8c,0x64,0x64,0xfe,0x63,0x64,0x64, -0x08,0x00,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x16,0x35,0x20,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x3e,0x44,0x1f,0x05,0x0f,0x08,0x13,0x07,0x0f,0x20,0x17,0x43,0x25,0x1b,0x34,0x14,0x11,0x34,0x13,0x14,0x23,0x09,0x08,0x0a,0x04,0x01,0x01,0x02,0x02,0x01,0x16,0x31,0x08,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14, -0x15,0x19,0x0f,0x0d,0x20,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x18,0x0f,0x0f,0x01,0x3f,0x62,0x62,0x62,0x62,0x62,0x00,0x0a,0xfd,0x0e,0x06,0x71,0x02,0x8c,0x09,0x5c,0x00,0x4b,0x00,0x6d,0x00,0x7c,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xaf,0x00,0x00,0x01,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02, -0x15,0x14,0x07,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x05,0x16,0x16,0x33,0x32, -0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x23, -0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x32,0x36,0x37,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0xfe,0xa0,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x74,0x1f,0x16,0x15,0x26,0x32,0x1e,0x24,0x38,0x28,0x15,0x33,0x4f,0x60,0x2c,0x4b,0x19,0x30,0x14,0x15,0x30,0x2f,0x2c,0x12,0x27,0x30,0x42,0x1d,0x16,0x2b,0x17,0x1c,0x28,0x50, -0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x19,0x2f,0x1e,0x14,0x1e,0x05,0x22,0x10,0x02,0x89,0x2a,0x51,0x1d,0x1e,0x27,0x19,0x0c,0x02,0x16,0x1c,0x1d,0x35,0x2a,0x19,0x16,0x25,0x33,0x1e,0x2d,0x3b,0x23,0x0f,0x16,0x30,0x4e,0x37,0x26,0x4b,0x27,0xfe,0x3f,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c, -0x01,0x58,0x0b,0x12,0x17,0x0c,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x58,0x65,0x65,0xfd,0x2c,0x65,0x65,0x01,0xc3,0x64,0x64,0x01,0x9d,0x64,0x64,0xfd,0x2c,0x64,0x64,0x03,0xe3,0x0b,0x15,0x0a,0x02,0x0b,0x11,0x14,0x0c,0x08,0x10,0x0d,0x08,0x27,0x08,0x00,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x16,0x35,0x20,0x1b,0x3d, -0x33,0x21,0x2c,0x40,0x49,0x1d,0x3e,0x44,0x1f,0x05,0x0f,0x08,0x08,0x0a,0x04,0x01,0x2a,0x19,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x14,0x1c,0x03,0x02,0x16,0x31,0xe9,0x11,0x13,0x12,0x1d,0x25,0x14,0x07,0x12,0x23,0x33,0x21,0x1b,0x3d,0x33,0x21,0x38,0x51,0x59,0x21,0x30,0x59,0x43, -0x29,0x09,0x13,0x01,0x4b,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x19,0x0f,0x0d,0x20,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x18,0x0f,0x0f,0x01,0x3f,0x62,0xfe,0xd6,0x62,0x66,0x62,0x62,0x62,0xfe,0xd6,0x62,0xff,0x02,0x05,0x0e,0x25,0x21,0x16,0x0c,0x14,0x17,0x0c,0x16,0x18,0x00,0x02,0x00,0x00,0x06,0x71,0x02,0xf4, -0x08,0x06,0x00,0x1b,0x00,0x2e,0x00,0x14,0xb7,0x21,0x18,0x18,0x05,0x2a,0x10,0x10,0x05,0x00,0x2f,0x33,0x2f,0x33,0x11,0x33,0x11,0x33,0x30,0x31,0x01,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x32,0x36,0x37,0x25,0x14,0x1e,0x02,0x33,0x33,0x36,0x36,0x35,0x34,0x2e,0x02,0x23, -0x22,0x0e,0x02,0x02,0xf4,0x11,0x3c,0x4e,0x5d,0x31,0xef,0x3f,0x54,0x33,0x16,0x11,0x2b,0x48,0x38,0x2b,0x43,0x2c,0x17,0x13,0x81,0x59,0x93,0x2d,0xfd,0x66,0x0f,0x21,0x34,0x24,0x15,0x0f,0x0d,0x10,0x1a,0x20,0x10,0x1d,0x25,0x15,0x08,0x06,0x98,0x08,0x0f,0x0a,0x06,0x26,0x3c,0x49,0x23,0x21,0x47,0x3a,0x25,0x1f,0x36,0x4a,0x2b,0x32, -0x33,0x13,0x10,0x41,0x13,0x24,0x1c,0x11,0x1d,0x31,0x15,0x19,0x26,0x1a,0x0d,0x12,0x1c,0x25,0x00,0x02,0xff,0xfe,0x06,0x71,0x03,0x28,0x07,0xeb,0x00,0x29,0x00,0x39,0x00,0x21,0x40,0x0e,0x0f,0x2d,0x2d,0x20,0x08,0x14,0x1c,0x1c,0x26,0x35,0x14,0x14,0x03,0x26,0x00,0x2f,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0x39,0x33,0x11, -0x33,0x30,0x31,0x03,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x22,0x27,0x25,0x32,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x02,0x0f,0x1b,0x0d,0x37,0x4b,0x2e,0x16,0x03,0x5b,0x04,0x0c, -0x18,0x15,0x0d,0x30,0x44,0x57,0x35,0x42,0x43,0x1d,0x41,0x67,0x4a,0x5d,0x4c,0x52,0x06,0x04,0x0b,0x22,0x35,0x4c,0x35,0x0a,0x13,0x0b,0x01,0xe4,0x08,0x16,0x0c,0x16,0x3f,0x3a,0x2a,0x23,0x1d,0x1f,0x34,0x29,0x1e,0x06,0xda,0x01,0x02,0x11,0x1f,0x2e,0x1e,0x14,0x1a,0x26,0x1a,0x0d,0x01,0x29,0x61,0x53,0x37,0x4c,0x46,0x28,0x51,0x42, -0x2a,0x3e,0x34,0x19,0x2b,0x1f,0x12,0x01,0x66,0x01,0x08,0x18,0x2f,0x27,0x17,0x24,0x1f,0x33,0x3f,0x00,0x00,0x02,0x00,0xdc,0x01,0x03,0x03,0xa8,0x04,0x9a,0x00,0x1e,0x00,0x39,0x00,0x1a,0xb1,0x03,0x1b,0xb8,0x04,0xfb,0xb3,0x36,0x1f,0x22,0x2c,0xb9,0x04,0xfb,0x00,0x0f,0x00,0x2f,0xed,0x2f,0xce,0x33,0xed,0x32,0x30,0x31,0x01,0x06, -0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x3f,0x20,0x4d,0x2e,0x25,0x47,0x39,0x23,0x24,0x3b,0x4c,0x51,0x4e,0x20,0x1e,0x4d,0x4e,0x4b,0x3b, -0x23,0x26,0x3c,0x4b,0x25,0x2d,0x4a,0x1b,0x28,0x2d,0x30,0x13,0x24,0x1c,0x10,0x35,0x4b,0x52,0x1d,0x1d,0x4e,0x48,0x32,0x0f,0x1a,0x25,0x15,0x28,0x31,0x02,0x01,0x68,0x38,0x2d,0x1c,0x46,0x78,0x5c,0x5a,0xa0,0x87,0x6c,0x4c,0x28,0x27,0x4a,0x69,0x83,0x9c,0x57,0x60,0x7e,0x4b,0x1e,0x2d,0x38,0xaf,0x3a,0x49,0x0f,0x28,0x45,0x37,0x62, -0xa9,0x7b,0x46,0x47,0x7b,0xa6,0x5e,0x35,0x46,0x2c,0x12,0x44,0x3f,0x00,0xff,0xff,0xfe,0xd4,0xfe,0x53,0x00,0xdf,0x00,0x0c,0x02,0x07,0x0a,0x51,0xff,0x15,0xf7,0xe0,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x03,0x95,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x47,0x0f,0x54,0x01,0x91,0xfe,0xe7,0x2d,0x51,0x2d,0x42,0xff,0xff,0xff,0xba, -0xfd,0xc9,0x04,0xad,0x03,0x5e,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x7f,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x3c,0x03,0x8a,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x31,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0xae,0x05,0xec,0x00,0x27,0x0f,0x50,0x02,0x59,0xfe,0xab,0x00,0x06, -0x0e,0x55,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x06,0x02,0x00,0x27,0x0f,0x50,0x00,0xf6,0xfe,0xab,0x00,0x06,0x0e,0x56,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x4b,0x06,0x02,0x00,0x27,0x0f,0x50,0x00,0x98,0xfe,0xab,0x00,0x06,0x08,0xed,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0x12,0x00,0x27, -0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x27,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0x00,0x06,0x0e,0x6e,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x00,0x27,0x0f,0x50,0x00,0xa1,0xfe,0xab,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0a,0x19,0x00,0x65,0xfc,0xe0,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x8d,0x05,0x3e,0x00,0x27, -0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x04,0x12,0x00,0x27,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0x00,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x05,0x3e,0x02,0x26, -0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x8d,0x05,0x3e,0x00,0x27,0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x04,0x39,0x02,0x26, -0x0e,0x6e,0x00,0x00,0x00,0x07,0x14,0x7c,0x03,0xc6,0xfb,0xaa,0x00,0x04,0xff,0xba,0xff,0xf2,0x03,0xf1,0x05,0x17,0x00,0x21,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x25,0x40,0x0c,0x4b,0x47,0x4a,0x49,0x34,0x22,0x3a,0x2d,0x2d,0x20,0x05,0x19,0xb8,0x04,0xfb,0xb1,0x06,0x12,0x00,0x2f,0x33,0xed,0x32,0x2f,0x33,0x2f,0xcd,0xde,0x32,0xde, -0x32,0xcd,0x32,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36, -0x37,0x37,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x48,0x07,0x20,0x44,0x3e,0x16,0x32,0x4a,0x37,0x27,0x0f,0x04,0x1a,0x41,0x46,0x47,0x21,0xfe,0x1b,0x23,0x23,0x23,0x23,0x01,0xef,0x1d,0x43,0x38,0x25,0x9c,0xfd,0x2d,0x06,0x09,0x0e,0x16,0x0c,0x1b,0x2b,0x43,0x35,0x39,0x4f,0x31,0x16,0x5e,0x2f,0x54,0x73,0x45,0x3d,0x4f,0x38,0x2a, -0x17,0x1e,0x17,0x0a,0x07,0x97,0x73,0x47,0x72,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x10,0x1f,0x2e,0x1e,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x01,0x5b,0x1a,0x3c,0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x31,0x2c,0xb4,0xb8,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25, -0x42,0x1f,0x3d,0x70,0x70,0x70,0x70,0x00,0x00,0x04,0xff,0xba,0xff,0xf2,0x03,0x48,0x05,0x17,0x00,0x14,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x21,0x40,0x0b,0x3e,0x3a,0x3d,0x3c,0x27,0x15,0x2d,0x20,0x20,0x14,0x0d,0xb9,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed,0x2f,0x33,0x2f,0xcd,0xde,0x32,0xde,0x32,0xcd,0x32,0x30,0x31,0x01,0x11,0x14, -0x0e,0x02,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x11,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x48,0x3d,0x63,0x80,0x43,0xfe,0x1b,0x23, -0x23,0x23,0x23,0x01,0xef,0x2e,0x47,0x30,0x18,0xfd,0xc9,0x06,0x09,0x0e,0x16,0x0c,0x1b,0x2b,0x43,0x35,0x39,0x4f,0x31,0x16,0x5e,0x2f,0x54,0x73,0x45,0x3d,0x4f,0x38,0x2a,0x17,0x1e,0x17,0x0a,0x07,0x97,0x73,0x47,0x72,0x03,0x0f,0xfe,0x3d,0x71,0x88,0x49,0x18,0x34,0x20,0x20,0x33,0x0f,0x2a,0x48,0x39,0x01,0xbc,0x01,0x5b,0x1a,0x3c, -0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x31,0x2c,0xb4,0xb8,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25,0x42,0x1f,0x3d,0x70,0x70,0x70,0x70,0x00,0x00,0x03,0xfe,0x84,0x06,0x71,0x01,0x76,0x08,0x8f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x1d,0x40,0x0c,0x24,0x27,0x27,0x29,0x2b,0x2b,0x00,0x18,0x11,0x11, -0x0b,0x18,0x00,0x2f,0x33,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0xfe,0xed,0x06,0x09,0x12,0x1a,0x10,0x22, -0x37,0x56,0x44,0x49,0x66,0x3f,0x1d,0x5e,0x38,0x65,0x8a,0x52,0x49,0x60,0x43,0x32,0x1b,0x24,0x1c,0x0a,0x07,0x01,0x46,0x73,0x73,0xb9,0x72,0x72,0x07,0xe2,0x1a,0x3c,0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x32,0x2b,0xef,0xf3,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25,0x42,0x1f,0x3d,0x70,0x70,0x70, -0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x5f,0x00,0x27,0x0a,0x1f,0x00,0xa5,0xfc,0xd3,0x00,0x06,0x0b,0x0c,0x00,0x00,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x06,0xae,0x04,0x24,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0x01,0xfd,0xd8,0x00,0x07,0x0a,0x1f,0x01,0xde,0xfb,0x98,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac, -0x05,0xb4,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x1f,0x00,0xa0,0xfd,0x28,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x74,0x05,0xb4,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x1f,0x00,0xa0,0xfd,0x28,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04, -0x03,0x62,0x02,0x06,0x0e,0xa5,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03, -0x02,0xb7,0x02,0x02,0x0e,0x70,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58, -0x01,0xc1,0x02,0x02,0x0e,0xcf,0x00,0x00,0x00,0x01,0x00,0xab,0x01,0xe1,0x01,0xac,0x02,0xe2,0x00,0x13,0x00,0x08,0xb1,0x0a,0x00,0x00,0x2f,0xcd,0x30,0x31,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x2d,0x17,0x2e,0x25,0x18,0x18,0x25,0x2e,0x17,0x16,0x2d,0x25,0x17,0x17,0x25,0x2d,0x01, -0xe1,0x17,0x25,0x2d,0x16,0x16,0x2f,0x25,0x18,0x18,0x25,0x2f,0x16,0x16,0x2d,0x25,0x17,0x00,0x00,0x01,0x00,0xd4,0x01,0x18,0x01,0x84,0x03,0xe5,0x00,0x0d,0x00,0x08,0xb1,0x06,0x00,0x00,0x2f,0x2f,0x30,0x31,0x01,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x01,0x43,0x11,0x18,0x10,0x08,0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5, -0x45,0x74,0x70,0x74,0x45,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x01,0x00,0x66,0x01,0x18,0x02,0x01,0x03,0xe5,0x00,0x0f,0x00,0x0a,0xb2,0x01,0x0e,0x07,0x00,0x2f,0x2f,0xcd,0x30,0x31,0x01,0x21,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x21,0x02,0x01,0xfe,0xf2,0x08,0x0d,0x09,0x05,0x6b,0x07,0x10,0x1b,0x13,0x01,0x9b, -0x03,0x5d,0x2b,0x51,0x53,0x59,0x32,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x01,0x00,0x1f,0x01,0x18,0x02,0x39,0x03,0xe5,0x00,0x37,0x00,0x14,0xb7,0x30,0x2b,0x25,0x06,0x16,0x1c,0x00,0x0d,0x00,0x2f,0x33,0x33,0xdc,0x32,0xcd,0x32,0x2f,0x30,0x31,0x13,0x16,0x16,0x17,0x16,0x32,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16, -0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x8e,0x0c,0x12,0x07,0x04,0x09,0x04,0x28,0x1f,0x12,0x0b,0x6b,0x0d,0x0d,0x04,0x02,0x08,0x0e,0x07,0x28,0x1f,0x12,0x0b,0x6b,0x0d,0x0d, -0x18,0x2b,0x3c,0x23,0x18,0x33,0x1d,0x13,0x2f,0x18,0x10,0x05,0x05,0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5,0x30,0x51,0x27,0x01,0x25,0x1b,0x19,0x38,0x18,0x20,0x37,0x1b,0x0e,0x19,0x0d,0x02,0x01,0x25,0x1b,0x19,0x38,0x18,0x21,0x35,0x1d,0x29,0x3f,0x2d,0x17,0x0b,0x0f,0x0d,0x0c,0x2d,0x5e,0x39,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00, -0x00,0x01,0x00,0x7f,0x01,0x0b,0x01,0xd8,0x03,0xfa,0x00,0x2e,0x00,0x0c,0xb3,0x14,0x13,0x2e,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37, -0x01,0xd8,0x23,0x3f,0x21,0x27,0x4d,0x3d,0x25,0x3b,0x46,0x43,0x38,0x1b,0x3e,0x66,0x4b,0x39,0x44,0x23,0x0b,0x21,0x35,0x44,0x24,0x3f,0x4a,0x25,0x0a,0x16,0x1f,0x25,0x0f,0x14,0x20,0x1e,0x20,0x13,0x01,0x20,0x0b,0x0a,0x10,0x23,0x37,0x28,0x2f,0x6c,0x44,0x20,0x42,0x33,0x22,0x41,0x3a,0x35,0x17,0x8d,0x11,0x1b,0x14,0x0e,0x04,0x0a, -0x1b,0x1c,0x1d,0x0d,0x1d,0x35,0x4b,0x32,0x1d,0x07,0x0e,0x0f,0x07,0x02,0x01,0x04,0x06,0x05,0x00,0x02,0x00,0x4f,0x01,0x60,0x02,0x08,0x03,0x99,0x00,0x13,0x00,0x27,0x00,0x0c,0xb3,0x14,0x0a,0x1e,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22, -0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x26,0x30,0x4f,0x39,0x1f,0x2c,0x42,0x4b,0x20,0x22,0x4f,0x43,0x2c,0x22,0x3c,0x53,0x30,0x11,0x26,0x20,0x16,0x12,0x1e,0x28,0x16,0x23,0x2d,0x1b,0x0a,0x18,0x24,0x29,0x01,0x60,0x1b,0x36,0x4f,0x35,0x54,0x84,0x5b,0x31,0x2b,0x54,0x7e,0x54,0x39,0x56,0x3b, -0x1e,0x01,0xb3,0x1f,0x38,0x4d,0x2e,0x1b,0x22,0x14,0x07,0x0f,0x19,0x1f,0x10,0x30,0x4e,0x37,0x1e,0x00,0x00,0x01,0x00,0x35,0x01,0x18,0x02,0x22,0x03,0xe5,0x00,0x12,0x00,0x0a,0xb2,0x12,0x07,0x0a,0x00,0x2f,0xcd,0x2f,0x30,0x31,0x01,0x2e,0x05,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x01,0xb2,0x10,0x16,0x10,0x09,0x06,0x04,0x02, -0xfe,0xce,0x01,0x99,0x03,0x02,0x04,0x07,0x0a,0x11,0x18,0x11,0x01,0x18,0x43,0x66,0x56,0x4d,0x55,0x63,0x41,0x88,0x63,0x46,0x6c,0x5b,0x53,0x5b,0x6a,0x45,0x00,0x01,0x00,0x1b,0x01,0x12,0x02,0x3c,0x03,0xe5,0x00,0x13,0x00,0x0c,0xb3,0x03,0x10,0x00,0x0a,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x36,0x36,0x37,0x33,0x0e,0x03,0x07, -0x23,0x2e,0x03,0x27,0x33,0x16,0x16,0x17,0x01,0x2d,0x22,0x4e,0x2d,0x72,0x23,0x3d,0x38,0x32,0x19,0x5c,0x1a,0x34,0x38,0x3b,0x21,0x72,0x2d,0x4e,0x22,0x01,0xe5,0x87,0xfc,0x7d,0x60,0xb6,0xb1,0xb1,0x5b,0x60,0xb4,0xb1,0xb1,0x5d,0x7d,0xfb,0x88,0x00,0x00,0x01,0x00,0x1b,0x01,0x18,0x02,0x3c,0x03,0xea,0x00,0x13,0x00,0x0c,0xb3,0x13, -0x09,0x10,0x03,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x06,0x06,0x07,0x23,0x3e,0x03,0x37,0x33,0x1e,0x03,0x17,0x23,0x26,0x26,0x27,0x01,0x2a,0x22,0x4e,0x2d,0x72,0x23,0x3d,0x37,0x33,0x19,0x5c,0x1a,0x34,0x38,0x3b,0x21,0x72,0x2d,0x4e,0x22,0x03,0x18,0x88,0xfb,0x7d,0x60,0xb5,0xb1,0xb1,0x5b,0x5f,0xb4,0xb1,0xb1,0x5d,0x7d,0xfa, -0x89,0x00,0x00,0x02,0x00,0x35,0x01,0x18,0x02,0x23,0x03,0xeb,0x00,0x1c,0x00,0x2d,0x00,0x0e,0xb4,0x1c,0x05,0x28,0x20,0x0f,0x00,0x2f,0xdd,0xde,0xcd,0x2f,0x30,0x31,0x01,0x26,0x26,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x17,0x03,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14, -0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x01,0xb2,0x28,0x20,0x08,0x38,0x36,0x27,0x45,0x35,0x1e,0x1c,0x33,0x47,0x2c,0x2a,0x47,0x1f,0x10,0x13,0x0c,0x07,0x04,0x03,0x0a,0x15,0x23,0x1d,0xdd,0x0e,0x2d,0x1f,0x13,0x1e,0x14,0x0b,0x38,0x29,0x14,0x2e,0x18,0x03,0x07,0x01,0x18,0x5b,0xa5,0x40,0x16,0x19,0x31,0x4a,0x32,0x2f,0x53,0x3d,0x24, -0x28,0x2e,0x1a,0x30,0x36,0x3e,0x26,0x26,0x53,0x63,0x75,0x48,0x02,0x04,0x22,0x28,0x10,0x19,0x20,0x0f,0x26,0x25,0x08,0x07,0x1a,0x1f,0x00,0x01,0x00,0x53,0x01,0x18,0x02,0x05,0x03,0xf1,0x00,0x2b,0x00,0x10,0xb5,0x24,0x1c,0x15,0x0b,0x00,0x05,0x00,0x2f,0x33,0xdd,0xde,0xcd,0x2f,0x30,0x31,0x13,0x17,0x17,0x36,0x36,0x33,0x32,0x16, -0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0xc2,0x12,0x03,0x1a,0x58,0x3f,0x0c,0x23,0x16,0x22,0x25,0x1d,0x38,0x2b,0x1b,0x14,0x1f,0x27,0x14,0x2d,0x58,0x27,0x1f,0x5b,0x30,0x18,0x2e,0x14,0x02,0x02,0x02, -0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5,0x52,0x01,0x2a,0x35,0x03,0x05,0x85,0x08,0x0a,0x13,0x1c,0x12,0x11,0x17,0x0f,0x07,0x1e,0x18,0x8a,0x14,0x1d,0x09,0x0b,0x01,0x1b,0x33,0x20,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x00,0x02,0x00,0x32,0x01,0x07,0x02,0x25,0x03,0xed,0x00,0x1a,0x00,0x35,0x00,0x12,0xb6,0x28,0x25,0x2c,0x03,0x17, -0x1b,0x0d,0x00,0x2f,0xcd,0x2f,0x33,0xdd,0x32,0xcc,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x33,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x29,0x14,0x34,0x1e,0x1a, -0x33,0x2a,0x1a,0x32,0x4c,0x58,0x27,0x26,0x57,0x49,0x30,0x1c,0x2c,0x36,0x1a,0x1d,0x32,0x12,0x04,0x15,0x32,0x2b,0x1c,0x08,0x0d,0x13,0x0b,0x17,0x18,0x02,0x5b,0x17,0x1b,0x0a,0x12,0x0e,0x08,0x1e,0x2d,0x34,0x01,0x4e,0x28,0x1f,0x17,0x3b,0x64,0x4e,0x6c,0xb1,0x7f,0x46,0x44,0x7b,0xae,0x69,0x50,0x69,0x3e,0x19,0x1f,0x28,0x02,0x1f, -0x35,0x5d,0x7f,0x4b,0x26,0x32,0x1d,0x0c,0x31,0x39,0x34,0x35,0x09,0x1b,0x31,0x27,0x4e,0x81,0x5d,0x34,0x00,0x01,0x00,0x59,0x01,0x03,0x01,0xff,0x03,0xec,0x00,0x27,0x00,0x19,0x40,0x0a,0x20,0x19,0x00,0x23,0x1f,0x1f,0x24,0x23,0x0f,0x08,0x00,0x2f,0xcd,0x2f,0x33,0x39,0x2f,0x12,0x39,0x33,0x33,0x30,0x31,0x01,0x26,0x26,0x35,0x34, -0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x27,0x36,0x36,0x37,0x01,0x18,0x48,0x46,0x24,0x3f,0x56,0x32,0x10,0x25,0x1a,0x1b,0x2a,0x12,0x18,0x2b,0x21,0x14,0x12,0x1c,0x25,0x14,0x12,0x1f,0x0f,0x14,0x2e,0x21,0x6a,0xc3,0x5a,0x1f, -0x28,0x62,0x36,0x02,0x70,0x13,0x59,0x45,0x31,0x4c,0x33,0x1b,0x03,0x04,0x88,0x04,0x04,0x07,0x12,0x1f,0x17,0x16,0x1e,0x13,0x09,0x06,0x05,0x0b,0x1a,0x10,0x9b,0x2e,0xb4,0x86,0x9c,0x3c,0x65,0x2d,0x00,0x01,0x00,0x2b,0x01,0x18,0x02,0x2d,0x03,0xec,0x00,0x28,0x00,0x0e,0xb4,0x09,0x0f,0x04,0x23,0x19,0x00,0x2f,0x2f,0x33,0xdd,0xcc, -0x30,0x31,0x01,0x36,0x36,0x37,0x33,0x0e,0x03,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x01,0x6c,0x0e,0x1e,0x13,0x82,0x1e,0x2b,0x21,0x18,0x0a,0x5b,0x09,0x19,0x20,0x27,0x16,0x17,0x13,0x09,0x03,0x08,0x08,0x6b,0x0b,0x0d,0x0b, -0x4c,0x3e,0x22,0x38,0x2c,0x22,0x0c,0x03,0x71,0x21,0x37,0x1c,0x2a,0x48,0x45,0x45,0x26,0x22,0x3c,0x2b,0x19,0x17,0x12,0x11,0x2c,0x14,0x2d,0x7c,0x58,0xd2,0xce,0x60,0x7a,0x51,0x36,0x1b,0x45,0x45,0x15,0x23,0x2c,0x17,0x00,0x01,0x00,0x4d,0x01,0x12,0x02,0x0a,0x03,0xe5,0x00,0x0e,0x00,0x0c,0xb3,0x09,0x05,0x07,0x00,0x00,0x2f,0x2f, -0xcd,0x32,0x30,0x31,0x01,0x0e,0x03,0x07,0x21,0x15,0x21,0x35,0x3e,0x03,0x37,0x01,0x5d,0x06,0x15,0x1e,0x26,0x18,0x01,0x24,0xfe,0x43,0x25,0x39,0x29,0x19,0x06,0x03,0xe5,0x79,0xb1,0x87,0x69,0x31,0x88,0x47,0x43,0x7f,0x94,0xb9,0x7d,0x00,0x00,0x06,0x00,0xa1,0xff,0xf2,0x0b,0x4d,0x08,0x36,0x00,0x64,0x00,0x78,0x00,0x86,0x00,0xb4, -0x00,0xb8,0x00,0xbc,0x00,0x54,0x40,0x0b,0xb8,0xb6,0xa0,0x87,0x94,0x9a,0x8d,0xa6,0xad,0x4d,0x34,0xb8,0x04,0xfb,0x40,0x0f,0x3e,0x82,0x40,0x7e,0x82,0x7e,0x82,0x40,0x40,0x5a,0x4d,0x76,0x53,0x46,0x61,0xb8,0x04,0xfb,0xb5,0x2c,0x25,0x1a,0xbc,0xba,0x6c,0xb9,0x04,0xfb,0x00,0x0a,0x00,0x2f,0xed,0xde,0xcd,0x2f,0x33,0x33,0xed,0x32, -0x32,0x32,0x2f,0x33,0x33,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0xed,0x10,0xde,0x32,0xdd,0x32,0xdc,0x32,0x32,0xde,0xcd,0x30,0x31,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x07,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27, -0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x25,0x14,0x1e,0x02,0x33, -0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x34,0x27,0x33,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x25,0x23,0x11,0x33,0x01,0x23,0x35,0x33,0x09,0xa8,0x4a,0x61,0x38, -0x16,0x31,0x55,0x75,0x44,0x48,0x79,0x36,0x14,0x26,0x1d,0x11,0x39,0x61,0x82,0x90,0x98,0x47,0x8d,0x3b,0x5c,0x46,0x34,0x13,0x04,0x19,0x40,0x49,0x4f,0x28,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1c,0x41,0x36,0x24,0x9c,0x0c, -0x26,0x46,0x39,0x25,0x42,0x31,0x1c,0x9c,0x20,0x3c,0x57,0x38,0x96,0x30,0x75,0x36,0x01,0x0a,0x10,0x1b,0x27,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1c,0x19,0x43,0x73,0x5a,0x21,0x1e,0xf6,0x87,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x02,0xf8,0x03,0x01,0x26,0x2d,0x2d,0x22,0x01,0x5f,0x01,0x22,0x2d,0x30,0x24,0x03,0x5f, -0x01,0x01,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x03,0x01,0x6b,0x74,0x74,0x04,0xfb,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x57,0x21,0x4a,0x52,0x5a,0x30,0x60,0x82,0x53,0x2d,0x15,0x06,0x02,0x11,0x20,0x2e,0x1c,0x23,0x2f,0x1d,0x0c,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a, -0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xa4,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfc,0x0d,0x45,0x5c,0x39,0x18,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x43,0x49,0x2a,0x18,0x4d,0xab,0x26, -0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x04,0x80,0x1c,0x18,0x09,0x33,0x3f,0x3d,0x3c,0x0d,0x1c,0x0d,0x0e,0x1c,0x0b,0x3d,0x3d,0x3e,0x37,0x1f,0x1b,0x0c,0x18,0x08,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x21,0x18,0x53,0x01,0x56,0xfc,0x39,0xb5,0x00,0x00,0x04,0x00,0xa1,0xff,0xf2,0x0b,0x4d,0x05,0x7e, -0x00,0x64,0x00,0x78,0x00,0x86,0x00,0x8a,0x00,0x3b,0xb9,0x00,0x34,0x04,0xfb,0x40,0x0d,0x82,0x3e,0x40,0x7e,0x7e,0x40,0x40,0x5a,0x4d,0x76,0x53,0x46,0x60,0xb8,0x04,0xfb,0xb5,0x2c,0x25,0x19,0x8a,0x88,0x6c,0xb9,0x04,0xfb,0x00,0x0a,0x00,0x2f,0xed,0xde,0xcd,0x2f,0x33,0x33,0xed,0x32,0x32,0x32,0x2f,0x33,0x33,0x2f,0x39,0x2f,0x12, -0x39,0x39,0xed,0x30,0x31,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x07,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02, -0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x25,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x23,0x35,0x33,0x09,0xa8,0x4a,0x61,0x38,0x16,0x31,0x55,0x75,0x44,0x48, -0x79,0x36,0x14,0x26,0x1d,0x11,0x39,0x61,0x82,0x90,0x98,0x47,0x8d,0x3b,0x5c,0x46,0x34,0x13,0x04,0x19,0x40,0x49,0x4f,0x28,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1c,0x41,0x36,0x24,0x9c,0x0c,0x26,0x46,0x39,0x25,0x42,0x31, -0x1c,0x9c,0x20,0x3c,0x57,0x38,0x96,0x30,0x75,0x36,0x01,0x0a,0x10,0x1b,0x27,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1c,0x19,0x43,0x73,0x5a,0x21,0x1e,0xf6,0x87,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x08,0xfe,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x57,0x21,0x4a,0x52,0x5a,0x30,0x60,0x82, -0x53,0x2d,0x15,0x06,0x02,0x11,0x20,0x2e,0x1c,0x23,0x2f,0x1d,0x0c,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xa4,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfc,0x0d,0x45,0x5c,0x39,0x18,0x01, -0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x43,0x49,0x2a,0x18,0x4d,0xab,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x02,0x62,0xb5,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x00,0x0e,0x00,0x0c,0xba,0x00,0x0e,0x04,0xfb,0x00,0x01,0x00,0x2f,0xed,0x30,0x31,0x05,0x21, -0x22,0x2e,0x02,0x27,0x27,0x37,0x1e,0x03,0x33,0x21,0x08,0xfe,0xf9,0xb1,0x4b,0x99,0x8f,0x7d,0x2e,0x1e,0x05,0x36,0x8d,0x9f,0xa9,0x50,0x06,0x2b,0x0e,0x07,0x0f,0x15,0x0e,0x91,0x05,0x0a,0x0f,0x0a,0x05,0x00,0x00,0x01,0x00,0x00,0xff,0xf2,0x05,0x2f,0x00,0x99,0x00,0x07,0x00,0x0c,0xba,0x00,0x00,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed, -0x30,0x31,0x35,0x21,0x17,0x07,0x06,0x06,0x23,0x21,0x05,0x2a,0x05,0x1a,0x56,0xb9,0x6e,0xfc,0x68,0x99,0x05,0x84,0x0d,0x11,0x00,0x01,0x00,0x00,0xff,0xf2,0x05,0x2f,0x00,0x99,0x00,0x07,0x00,0x0c,0xba,0x00,0x00,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed,0x30,0x31,0x35,0x21,0x17,0x07,0x06,0x06,0x23,0x21,0x05,0x2a,0x05,0x1a,0x56,0xb9, -0x6e,0xfc,0x68,0x99,0x05,0x84,0x0d,0x11,0xff,0xff,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x02,0x06,0x14,0x99,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x02,0x06,0x14,0x99,0x00,0x00,0x00,0x01,0x00,0xf2,0x02,0x84,0x02,0x5a,0x03,0xed,0x00,0x13,0x00,0x08,0xb1,0x0a,0x00,0x00,0x2f,0xcd,0x30,0x31,0x01,0x22, -0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xa8,0x20,0x40,0x35,0x21,0x21,0x35,0x40,0x20,0x1f,0x40,0x33,0x20,0x20,0x33,0x40,0x02,0x84,0x20,0x34,0x3f,0x20,0x1f,0x41,0x34,0x22,0x21,0x35,0x41,0x1f,0x20,0x3f,0x34,0x20,0x00,0x00,0x01,0x01,0x2f,0x01,0x4a,0x02,0x1d,0x05,0x7d,0x00,0x0d,0x00,0x08, -0xb1,0x06,0x00,0x00,0x2f,0x2f,0x30,0x31,0x01,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x01,0xb7,0x19,0x27,0x19,0x0d,0x84,0x0c,0x19,0x29,0x1c,0x05,0x7d,0x6c,0xb4,0xb1,0xbc,0x73,0xfe,0xcd,0x01,0x2d,0x67,0xb5,0xb5,0xc1,0x74,0x00,0x01,0x00,0x76,0x01,0x4a,0x02,0xd6,0x05,0x7d,0x00,0x0f,0x00,0x0a,0xb2,0x01,0x0f,0x08, -0x00,0x2f,0x2f,0xcd,0x30,0x31,0x01,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x02,0xd6,0xfe,0x4a,0x10,0x19,0x12,0x09,0x84,0x0c,0x19,0x29,0x1c,0x05,0x7d,0x97,0x4f,0x9b,0xa0,0xa9,0x5d,0xfe,0xf4,0x01,0x06,0x75,0xc5,0xbc,0xc3,0x74,0x00,0x00,0x01,0x00,0x25,0x01,0x4a,0x03,0x28,0x05,0x7d,0x00,0x3c,0x00,0x14, -0xb7,0x35,0x2c,0x26,0x06,0x15,0x1d,0x00,0x0f,0x00,0x2f,0x33,0x33,0xdc,0x32,0xcd,0x32,0x2f,0x30,0x31,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26, -0x27,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0xac,0x11,0x1b,0x0b,0x0c,0x17,0x0b,0x1f,0x2c,0x1b,0x0c,0x12,0x0f,0x84,0x1f,0x12,0x24,0x1e,0x1f,0x2c,0x1b,0x0c,0x12,0x0f,0x84,0x0e,0x10,0x1d,0x39,0x54,0x37,0x23,0x4c,0x2d,0x1b,0x42,0x25,0x0c,0x19,0x0d,0x06,0x0a,0x07,0x04,0x83,0x10,0x1c,0x27,0x17,0x05,0x7d,0x45,0x79, -0x3a,0x03,0x02,0x13,0x21,0x2b,0x19,0x21,0x44,0x20,0x4b,0x45,0x36,0x2d,0x0a,0x13,0x21,0x2b,0x19,0x21,0x44,0x20,0x21,0x52,0x27,0x2c,0x51,0x3e,0x24,0x11,0x16,0x14,0x12,0x02,0x02,0x28,0x53,0x62,0x77,0x4c,0xfe,0xe1,0x01,0x1a,0x6c,0xcb,0xc4,0xbf,0x5f,0x00,0x00,0x01,0x00,0xab,0x01,0x38,0x02,0xa1,0x05,0x97,0x00,0x2f,0x00,0x0c, -0xb3,0x25,0x24,0x0a,0x10,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x02,0x3f,0x5f,0x6c,0x36,0x0e,0x25,0x36,0x3d,0x18,0x39,0x58,0x30,0x62,0x65, -0x37,0x6d,0x56,0x35,0x15,0x30,0x50,0x3c,0x39,0x4d,0x2e,0x14,0x24,0x55,0x8e,0x6b,0x56,0x66,0x34,0x0f,0x20,0x43,0x6a,0x4b,0x03,0x91,0x55,0x7b,0x56,0x33,0x0c,0x1c,0x22,0x12,0x06,0x0c,0x0d,0x96,0x21,0x17,0x31,0x4e,0x38,0x20,0x4d,0x5b,0x68,0x3a,0x1b,0x31,0x34,0x39,0x22,0x2d,0x58,0x55,0x4f,0x23,0x9f,0x1a,0x31,0x29,0x21,0x0a, -0x11,0x22,0x28,0x33,0x22,0x00,0x00,0x02,0x00,0x62,0x01,0xbc,0x02,0xeb,0x04,0xf3,0x00,0x13,0x00,0x27,0x00,0x0c,0xb3,0x1e,0x0a,0x14,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34, -0x2e,0x02,0x01,0xa1,0x35,0x74,0x62,0x3f,0x2f,0x57,0x7c,0x4c,0x4a,0x75,0x51,0x2b,0x40,0x60,0x6f,0x2e,0x1c,0x41,0x37,0x25,0x1e,0x33,0x43,0x26,0x36,0x4c,0x30,0x15,0x29,0x3d,0x46,0x04,0xf3,0x40,0x7c,0xb8,0x78,0x4d,0x7a,0x56,0x2e,0x29,0x4e,0x70,0x47,0x78,0xc1,0x87,0x49,0x94,0x35,0x5e,0x84,0x4f,0x2e,0x3f,0x26,0x11,0x18,0x2c, -0x3c,0x23,0x54,0x85,0x5d,0x31,0x00,0x01,0x00,0x42,0x01,0x4a,0x03,0x0a,0x05,0x7d,0x00,0x13,0x00,0x0a,0xb2,0x13,0x08,0x0a,0x00,0x2f,0xcd,0x2f,0x30,0x31,0x01,0x2e,0x05,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x02,0x80,0x17,0x21,0x17,0x0e,0x0a,0x06,0x03,0x03,0xfe,0x35,0x02,0x4a,0x05,0x03,0x07,0x0a,0x0f,0x19,0x23,0x1a, -0x01,0x4a,0x60,0x96,0x7e,0x70,0x79,0x8a,0x59,0x5c,0x97,0x94,0x68,0xa1,0x89,0x7d,0x88,0xa1,0x67,0x00,0x00,0x01,0x00,0x1c,0x01,0x47,0x03,0x30,0x05,0x7d,0x00,0x13,0x00,0x0c,0xb3,0x03,0x0e,0x07,0x00,0x00,0x2f,0x32,0x2f,0x33,0x30,0x31,0x13,0x16,0x12,0x17,0x33,0x36,0x12,0x37,0x33,0x06,0x0a,0x02,0x07,0x23,0x26,0x0a,0x02,0x27, -0xa5,0x49,0x7d,0x39,0x04,0x3a,0x7d,0x49,0x88,0x32,0x59,0x53,0x4c,0x24,0x78,0x27,0x4e,0x53,0x57,0x2f,0x05,0x7d,0xc7,0xfe,0x64,0xdf,0xdf,0x01,0x9d,0xc6,0x89,0xfe,0xf5,0xfe,0xf5,0xfe,0xf3,0x8a,0x91,0x01,0x12,0x01,0x0b,0x01,0x05,0x83,0x00,0x01,0x00,0x1d,0x01,0x4a,0x03,0x30,0x05,0x80,0x00,0x13,0x00,0x0c,0xb3,0x03,0x0d,0x00, -0x07,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x26,0x02,0x27,0x23,0x06,0x02,0x07,0x23,0x36,0x1a,0x02,0x37,0x33,0x16,0x1a,0x02,0x17,0x02,0xa8,0x4a,0x7d,0x38,0x05,0x39,0x7e,0x48,0x88,0x31,0x59,0x52,0x4d,0x25,0x78,0x26,0x4e,0x53,0x57,0x2f,0x01,0x4a,0xc7,0x01,0x9b,0xe0,0xe0,0xfe,0x64,0xc6,0x88,0x01,0x0b,0x01,0x0b,0x01,0x0e, -0x8a,0x90,0xfe,0xed,0xfe,0xf6,0xfe,0xfa,0x83,0x00,0x00,0x02,0x00,0x3c,0x01,0x4a,0x03,0x10,0x05,0x87,0x00,0x1e,0x00,0x33,0x00,0x10,0xb5,0x07,0x31,0x31,0x1e,0x27,0x11,0x00,0x2f,0xcd,0x2f,0x39,0x2f,0xcd,0x30,0x31,0x01,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03, -0x17,0x01,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x02,0x88,0x1f,0x28,0x1b,0x10,0x06,0x5d,0x55,0x3b,0x6a,0x4f,0x2e,0x27,0x4a,0x6a,0x43,0x41,0x6a,0x2d,0x18,0x1d,0x11,0x09,0x05,0x05,0x0f,0x1e,0x31,0x27,0xfe,0xf3,0x03,0x05,0x07,0x09,0x07,0x19,0x4d,0x33,0x1f,0x35,0x26,0x15,0x1c,0x30, -0x42,0x27,0x22,0x4a,0x01,0x4a,0x47,0x8a,0x81,0x77,0x34,0x29,0x26,0x4a,0x6c,0x46,0x3f,0x76,0x5b,0x37,0x3b,0x47,0x26,0x4b,0x51,0x5c,0x38,0x3b,0x85,0x97,0xab,0x63,0x02,0x86,0x1b,0x2b,0x25,0x21,0x11,0x3d,0x44,0x1b,0x2d,0x3b,0x20,0x25,0x3a,0x27,0x14,0x10,0x00,0x01,0x00,0x69,0x01,0x4a,0x02,0xe4,0x05,0x92,0x00,0x31,0x00,0x12, -0xb6,0x22,0x17,0x17,0x2a,0x0d,0x00,0x07,0x00,0x2f,0x33,0xcd,0x2f,0x39,0x2f,0xcd,0x30,0x31,0x13,0x17,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x26,0x27,0x07,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0xf0,0x21,0x04,0x0d, -0x32,0x46,0x59,0x35,0x16,0x36,0x1d,0x33,0x36,0x30,0x58,0x42,0x28,0x1e,0x31,0x3c,0x1e,0x24,0x48,0x43,0x3d,0x19,0x12,0x37,0x45,0x4d,0x27,0x2a,0x53,0x1d,0x03,0x0a,0x07,0x83,0x0b,0x19,0x28,0x1e,0x05,0x7d,0x92,0x21,0x3d,0x2e,0x1b,0x05,0x08,0x95,0x0c,0x12,0x22,0x30,0x1d,0x1a,0x25,0x18,0x0b,0x0e,0x17,0x1e,0x10,0x9a,0x0e,0x1c, -0x16,0x0f,0x14,0x17,0x02,0x48,0xac,0x53,0xfe,0xe5,0x01,0x16,0x6a,0xba,0xba,0xc8,0x77,0x00,0x00,0x02,0x00,0x3c,0x01,0x36,0x03,0x10,0x05,0x81,0x00,0x1e,0x00,0x3c,0x00,0x12,0xb6,0x3c,0x3a,0x24,0x03,0x1b,0x30,0x0f,0x00,0x2f,0xcd,0x2f,0x33,0xdd,0x32,0xcc,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33, -0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x01,0xa3,0x20,0x4c,0x2e,0x25,0x49,0x3b,0x24,0x22,0x38,0x4b,0x52,0x53,0x26,0x25,0x51,0x4f,0x48,0x37,0x20,0x27,0x3d,0x4d,0x26,0x2c,0x49,0x1c,0x36,0x0a, -0x15,0x21,0x16,0x23,0x25,0x10,0x02,0x16,0x25,0x30,0x35,0x35,0x18,0x23,0x50,0x44,0x2c,0x0e,0x18,0x21,0x13,0x50,0x06,0x01,0xa3,0x3c,0x31,0x22,0x55,0x91,0x70,0x6b,0xbe,0xa1,0x80,0x59,0x30,0x2e,0x57,0x7d,0x9c,0xba,0x68,0x74,0x98,0x5a,0x25,0x31,0x3c,0xcb,0x1f,0x37,0x29,0x18,0x33,0x47,0x48,0x15,0x53,0x96,0x81,0x68,0x49,0x28, -0x59,0x9a,0xd2,0x78,0x41,0x57,0x34,0x16,0x9c,0x00,0x00,0x01,0x00,0x6f,0x01,0x3a,0x02,0xdd,0x05,0x86,0x00,0x25,0x00,0x1b,0x40,0x0c,0x20,0x00,0x07,0x03,0x03,0x25,0x25,0x03,0x16,0x10,0x04,0x03,0x00,0x2f,0x33,0x2f,0xcd,0x11,0x39,0x2f,0x12,0x17,0x39,0x30,0x31,0x01,0x06,0x00,0x07,0x27,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34, -0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x36,0x36,0x37,0x02,0xdd,0xa7,0xfe,0xde,0x83,0x22,0x43,0xa6,0x5e,0x01,0x6e,0x76,0x30,0x57,0x79,0x4a,0x2d,0x3e,0x1d,0x3b,0x1a,0x27,0x46,0x33,0x1e,0x19,0x2c,0x3b,0x21,0x34,0x35,0x1d,0x3c,0x24,0x03,0x78,0x4e,0xfe,0xe3,0xd3,0xaf, -0x6d,0xbe,0x4c,0x03,0x16,0x88,0x69,0x42,0x69,0x4a,0x27,0x09,0x99,0x05,0x05,0x0f,0x22,0x37,0x28,0x25,0x36,0x24,0x11,0x13,0x11,0x22,0x12,0x00,0x00,0x01,0x00,0x41,0x01,0x4a,0x03,0x0b,0x05,0x88,0x00,0x29,0x00,0x0e,0xb4,0x04,0x09,0x29,0x20,0x16,0x00,0x2f,0x2f,0x33,0xdd,0xce,0x30,0x31,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23, -0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x03,0x0b,0x42,0x54,0x1c,0x7a,0x0d,0x29,0x35,0x40,0x25,0x15,0x1a,0x0f,0x06,0x08,0x0c,0x0d,0x0c,0x08,0x83,0x13,0x16,0x13,0x67,0x5e,0x34,0x56,0x44,0x30,0x0e,0x04,0x14,0x30,0x1d,0x05,0x7d,0x61, -0xc2,0x71,0x36,0x60,0x46,0x29,0x0b,0x13,0x19,0x0d,0x11,0x2b,0x3b,0x52,0x73,0x99,0x65,0xfe,0xda,0x01,0x10,0x93,0xd0,0x8e,0x5b,0x1e,0x5b,0x69,0x29,0x3f,0x4e,0x25,0x3c,0x65,0x2f,0x00,0x00,0x01,0x00,0x6b,0x01,0x47,0x02,0xe1,0x05,0x7d,0x00,0x12,0x00,0x0c,0xb3,0x00,0x0f,0x11,0x08,0x00,0x2f,0x2f,0xcd,0x32,0x30,0x31,0x13,0x3e, -0x05,0x37,0x33,0x0e,0x05,0x07,0x21,0x15,0x21,0x6b,0x25,0x3f,0x33,0x28,0x1e,0x13,0x05,0x83,0x06,0x12,0x19,0x21,0x27,0x2f,0x1a,0x01,0xc0,0xfd,0x8a,0x01,0x8b,0x45,0x83,0x89,0x98,0xb2,0xd5,0x82,0x82,0xd1,0xaa,0x8a,0x77,0x6b,0x36,0x97,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0x5f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07, -0x0a,0x1f,0x01,0x09,0xfc,0xd3,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x05,0x74,0x04,0x24,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x27,0x0a,0x1f,0x02,0x00,0xfb,0x98,0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0x00,0x01,0x00,0x55,0xff,0xe8,0x04,0x79,0x05,0x9a,0x00,0x2d,0x00,0x14,0x40,0x09,0x0e,0x0e,0x05,0x24,0x03,0x16,0x91,0x05,0x13,0x00, -0x3f,0xed,0x3f,0x12,0x39,0x2f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x1e,0x03,0x04,0x79,0x4e,0x8f,0xc7,0x78,0x78,0xc1,0x87,0x48,0x0c,0x10,0xb4,0x0e,0x12,0x2c,0x58,0x83,0x58,0xb1, -0xb4,0x1e,0x35,0x49,0x2b,0x2f,0x57,0x44,0x2c,0x04,0xa8,0x03,0x22,0x38,0x4c,0x2e,0x2b,0x57,0x45,0x2b,0x01,0xdc,0x7b,0xbb,0x7e,0x40,0x43,0x75,0x9e,0x5b,0x27,0x52,0x2a,0x21,0x50,0x33,0x3e,0x67,0x4b,0x29,0xa9,0xae,0x40,0x6f,0x62,0x56,0x28,0x2c,0x67,0x85,0xab,0x72,0x60,0x89,0x69,0x57,0x2e,0x2c,0x60,0x74,0x8e,0x00,0x00,0x02, -0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0x9a,0x00,0x2f,0x00,0x41,0x00,0x1c,0x40,0x0e,0x3d,0x91,0x26,0x13,0x12,0x00,0x10,0x03,0x03,0x1c,0x35,0x91,0x00,0x10,0x00,0x3f,0xed,0x39,0x39,0x3f,0x12,0x39,0x3f,0xed,0x30,0x31,0x01,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x06,0x35,0x35,0x33,0x15,0x14,0x1e,0x04,0x15,0x14,0x06,0x07,0x1e, -0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x9f,0x0e,0x1b,0x0e,0x01,0x01,0x20,0x35,0x44,0x46,0x44,0x35,0x20,0xa4,0x38,0x55,0x62,0x55,0x38,0x04,0x02,0x4d,0x74,0x4d,0x26,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88, -0xcf,0x01,0xec,0x33,0x5b,0x80,0x4c,0xb8,0xc4,0x32,0x5f,0x89,0x58,0x58,0x85,0x5a,0x2d,0x04,0x17,0x01,0x01,0x05,0x0a,0x05,0x18,0x1e,0x16,0x11,0x17,0x20,0x34,0x4b,0x36,0x28,0x28,0x1f,0x23,0x1d,0x1d,0x33,0x4f,0x40,0x0b,0x27,0x0f,0x1c,0x60,0x80,0x9c,0x57,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0xfd,0xe7, -0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0x34,0x62,0x8f,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0xae,0x00,0x2f,0x00,0x41,0x00,0x21,0x40,0x11,0x3d,0x91,0x26,0x13,0x10,0x10,0x00,0x0b,0x91,0x16,0x04,0x03,0x1e,0x35,0x91,0x00,0x10,0x00,0x3f,0xed,0x39,0x39,0x3f,0xed,0x12,0x39,0x2f,0x3f,0xed,0x30,0x31,0x01, -0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x9f,0x26,0x46,0x21,0x07,0x08,0x1a,0x2f, -0x40,0x27,0x2f,0x47,0x2f,0x17,0xaf,0x35,0x60,0x86,0x50,0x51,0x82,0x5b,0x32,0x14,0x0c,0x73,0x70,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88,0xcf,0x01,0xec,0x33,0x5b,0x80,0x4c,0xb8,0xc4,0x32,0x5f,0x89,0x58,0x58,0x85,0x5a,0x2d,0x04,0x17,0x07,0x07,0x17,0x35,0x22,0x29,0x3d,0x28,0x13,0x17,0x27,0x36,0x1f,0x43,0x6e,0x4e, -0x2a,0x2a,0x50,0x71,0x46,0x39,0x58,0x1f,0x45,0xed,0x97,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0xfd,0xe7,0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0x34,0x62,0x8f,0x00,0x02,0x00,0x82,0xff,0xe0,0x06,0xac,0x05,0xaf,0x00,0x42,0x00,0x52,0x00,0x34,0x40,0x1b,0x1f,0x2e,0x2a,0x92,0x33,0x50,0x91,0x0a, -0x33,0x0a,0x33,0x0a,0x25,0x15,0x91,0x3d,0x04,0x24,0x25,0x13,0x12,0x40,0x40,0x48,0x91,0x00,0x04,0x00,0x3f,0xed,0x39,0x11,0x33,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x39,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02, -0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x17,0x07,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x3e,0x03,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xdf,0x6a,0xab,0x78,0x40,0x40,0x78,0xab,0x6a,0x6a,0xb1,0x7f,0x47,0x29,0x26,0x38,0x6d,0x31, -0x4e,0x79,0x53,0x2b,0x59,0x94,0xc0,0x67,0x57,0xa4,0x9b,0x91,0x45,0x5d,0x44,0xbb,0xd2,0xda,0x63,0x78,0xc1,0x3c,0x1b,0x46,0x4d,0x50,0x25,0x52,0x89,0x62,0x36,0x48,0x85,0xbb,0x73,0x55,0x9a,0x47,0x3e,0x97,0x01,0x74,0x21,0x46,0x6c,0x4a,0x4b,0x72,0x4d,0x27,0x9b,0x96,0x95,0x88,0x05,0xaf,0x42,0x7d,0xb6,0x75,0x75,0xb6,0x7d,0x40, -0x41,0x7e,0xb6,0x75,0x56,0x90,0x39,0x22,0x11,0x38,0x67,0x93,0x5a,0x82,0xb6,0x7f,0x54,0x20,0x1b,0x35,0x3e,0x4a,0x2f,0x7b,0x33,0x5b,0x45,0x28,0x23,0x1b,0x9c,0x0a,0x11,0x0d,0x08,0x02,0x22,0x68,0x8a,0xab,0x66,0x7e,0xca,0x8c,0x4b,0x25,0x37,0x2d,0x2f,0xfe,0x16,0x52,0x7e,0x57,0x2d,0x32,0x5a,0x7c,0x4a,0xa5,0xaf,0xad,0x00,0x01, -0x00,0x64,0xff,0xe8,0x04,0x87,0x05,0xb2,0x00,0x31,0x00,0x1b,0x40,0x0d,0x26,0x0e,0x26,0x0e,0x05,0x21,0x91,0x2c,0x04,0x16,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11, -0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x04,0x87,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x2d,0x51,0x72,0x44,0x42,0x6c,0x4b,0x29,0xb0,0x48,0x7e,0xaa,0x62,0x62,0xae,0x81,0x4b,0x01,0xda,0x71,0xb7,0x83,0x47,0x44, -0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x02,0x27,0x44,0x68,0x47,0x25,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x35,0x66,0x96,0x61,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0xb2,0x00,0x41,0x00,0x22,0x40,0x11,0x3d,0x1f,0x2d,0x22,0x91,0x0d,0x1f,0x1f,0x05,0x2a,0x91,0x33, -0x04,0x15,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xce,0xfd,0xce,0x12,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x3e,0x02, -0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x04,0x93,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x52,0x6b,0x3f,0x1a,0x7f,0x82,0x79,0x8c,0xb0,0x40,0x75,0xa5,0x65,0x5c,0x9b,0x71,0x3f,0x21,0x3f,0x5d,0x3c,0x43,0x76,0x59,0x33, -0x01,0xb2,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x60,0x6b,0x68,0x6b,0x5c,0x88,0x5a,0x2c,0x31,0x5c,0x81,0x50,0x3b,0x66,0x4e,0x34,0x09,0x08,0x3c,0x61,0x83,0x00,0x00,0x03,0x00,0x28,0xff,0xe8,0x05,0xfe,0x05,0xb2, -0x00,0x27,0x00,0x37,0x00,0x45,0x00,0x24,0x40,0x13,0x1e,0x3b,0x91,0x23,0x10,0x0b,0x33,0x91,0x10,0x10,0x05,0x2b,0x91,0x1a,0x04,0x43,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x3f,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02, -0x33,0x32,0x16,0x15,0x15,0x3e,0x03,0x33,0x32,0x1e,0x02,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x01,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xfe,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0x0d,0x28,0x2e,0x34,0x19,0x41,0x70,0x53,0x30,0x2f,0x56,0x79,0x49,0x9e,0xa1,0x21, -0x53,0x5d,0x63,0x31,0x6e,0xb5,0x81,0x47,0xfc,0x0e,0x58,0x45,0x45,0x58,0x18,0x2a,0x39,0x21,0x21,0x3a,0x2a,0x19,0x03,0x40,0xa8,0x9d,0x4f,0x80,0x5a,0x30,0xaa,0xaf,0xa5,0xa0,0x02,0x16,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x01,0x70,0x0d,0x16,0x0f,0x09,0x2a,0x51,0x73,0x4a,0x4a,0x76,0x53,0x2c,0x9b,0x9c,0xf7,0x29,0x38,0x22, -0x0f,0x42,0x82,0xbf,0x01,0xe2,0x54,0x52,0x52,0x54,0x2c,0x3e,0x28,0x12,0x12,0x28,0x3e,0xfd,0xc7,0xbf,0xb1,0x2d,0x5b,0x8c,0x60,0xc4,0xca,0xcb,0x00,0x02,0x00,0x82,0xff,0xe8,0x07,0x4c,0x05,0xb2,0x00,0x28,0x00,0x36,0x00,0x20,0x40,0x11,0x10,0x23,0x23,0x0e,0x91,0x26,0x04,0x2c,0x91,0x21,0x04,0x34,0x91,0x17,0x13,0x06,0x12,0x00, -0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x39,0x11,0x33,0x30,0x31,0x01,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x10,0x02,0x23,0x22,0x07,0x16,0x11,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x00,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x1e,0x02,0x33,0x32,0x12,0x07, -0x4c,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0xae,0xb4,0x91,0x58,0x61,0x4a,0x8b,0xca,0x7f,0x73,0xc3,0x8d,0x4f,0x4c,0x8e,0xce,0x82,0xc6,0x7d,0x44,0xac,0x67,0xf9,0x01,0x0d,0xfc,0xb6,0xae,0xb4,0xb2,0xbc,0x32,0x5e,0x88,0x56,0xac,0xb6,0x02,0xc0,0x80,0xd2,0xab,0x8a,0x39,0x3a,0x9c,0xb8,0xcd,0x6b,0x01,0x2a,0x01,0x2c,0x60, -0xb7,0xfe,0xc7,0xba,0xfe,0xea,0xb8,0x5c,0x53,0xaf,0x01,0x12,0xc0,0xc0,0x01,0x1c,0xbd,0x5d,0x75,0x3c,0x39,0xfe,0x89,0xfe,0x8b,0x01,0x2a,0x01,0x2b,0xfe,0xd4,0xfe,0xd3,0x97,0xda,0x8e,0x44,0x01,0x1f,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x04,0xb2,0x05,0xb2,0x00,0x24,0x00,0x0f,0xb6,0x0b,0x1a,0x12,0x12,0x91,0x00,0x04,0x00,0x3f, -0xed,0x3f,0x33,0x30,0x31,0x01,0x32,0x16,0x16,0x12,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x10,0x21,0x22,0x02,0x11,0x14,0x1e,0x02,0x17,0x23,0x2e,0x03,0x35,0x34,0x12,0x36,0x36,0x02,0xa7,0x7c,0xc3,0x86,0x46,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0xfe,0x9c,0xb4,0xb8,0x1e,0x34,0x49,0x2b,0xc9,0x20,0x3e,0x31,0x1e, -0x4b,0x8e,0xcb,0x05,0xb2,0x5e,0xbc,0xfe,0xe5,0xbd,0x80,0xd2,0xab,0x8a,0x39,0x3a,0x9c,0xb6,0xc9,0x67,0x02,0x60,0xfe,0xd4,0xfe,0xd6,0x6b,0xcd,0xb8,0x9c,0x3a,0x39,0x8a,0xab,0xd2,0x80,0xbd,0x01,0x1b,0xbc,0x5e,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0xb2,0x00,0x3a,0x00,0x1e,0x40,0x0f,0x36,0x23,0x91,0x0e,0x20,0x20, -0x05,0x2b,0x91,0x2c,0x04,0x16,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x35,0x32,0x1e,0x02, -0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x04,0x93,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x0e,0x0f,0xb8,0x12,0x14,0x36,0x60,0x83,0x4c,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x52,0x6b,0x3f,0x1a,0x7b,0x83,0x63,0x9f,0x70,0x3c,0x21,0x40,0x5e,0x3d,0x45,0x78,0x58,0x33,0x01,0xb2,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60, -0x26,0x52,0x2c,0x26,0x4f,0x2e,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x60,0x6b,0x97,0x31,0x5c,0x81,0x50,0x3b,0x65,0x4e,0x34,0x0a,0x09,0x3c,0x61,0x82,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x08,0x12,0x05,0xb3,0x00,0x5c,0x00,0x3d,0x40,0x21,0x48,0x3e,0x0e,0x0a,0x07,0x91,0x57,0x0b, -0x57,0x3e,0x2e,0x57,0x57,0x2e,0x3e,0x03,0x00,0x39,0x91,0x24,0x04,0x21,0x1b,0x42,0x91,0x1e,0x04,0x4d,0x91,0x18,0x04,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x39,0x11,0x33,0x30,0x31,0x21,0x2e,0x05,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x37,0x2e,0x03, -0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x16,0x04,0x04,0x16, -0x17,0x05,0xf6,0x0c,0x50,0x7a,0x9e,0xb3,0xc4,0x63,0x7e,0xf0,0x68,0x3c,0x93,0x55,0x66,0x8e,0x58,0x28,0x2b,0x59,0x88,0x5c,0x6d,0x9a,0x2f,0x27,0x9a,0x67,0x65,0x9d,0x26,0x32,0x93,0x66,0x54,0x8b,0x62,0x36,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x20,0x36,0x48,0x29,0x73,0x64,0xa8,0x63,0x73,0x39,0x4f,0x31,0x15,0xa8,0x64, -0x73,0x2c,0x49,0x35,0x1d,0x43,0x6f,0x8e,0x4b,0xc7,0x01,0x59,0x01,0x0b,0xb0,0x1f,0x1c,0x38,0x31,0x2a,0x1e,0x11,0x1f,0x22,0x9c,0x11,0x16,0x05,0x33,0x85,0x9c,0xb0,0x5f,0x62,0xb2,0x87,0x50,0x5b,0x65,0x65,0x5b,0x61,0x5f,0x66,0x5a,0x3e,0x7c,0xbb,0x7c,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x62,0x85,0x52,0x23,0xac, -0xae,0x88,0x88,0xae,0xac,0x2b,0x57,0x81,0x57,0x88,0x88,0xae,0xac,0x26,0x53,0x84,0x5f,0x77,0xb9,0x8e,0x67,0x23,0x0f,0x39,0x5c,0x80,0x55,0x00,0x00,0x02,0x00,0x82,0xff,0xe8,0x04,0x74,0x05,0xb2,0x00,0x2a,0x00,0x3a,0x00,0x1e,0x40,0x0f,0x14,0x36,0x91,0x1f,0x0f,0x0f,0x05,0x1a,0x91,0x25,0x04,0x2e,0x91,0x05,0x13,0x00,0x3f,0xed, -0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x04,0x74,0x47,0x82,0xb7, -0x6f,0x7a,0xc0,0x84,0x45,0x47,0x81,0xb5,0x6e,0x31,0x62,0x5c,0x50,0x20,0x2e,0x52,0x72,0x44,0x42,0x6f,0x4f,0x2c,0xb0,0x4b,0x81,0xae,0x62,0x62,0xae,0x82,0x4c,0xfc,0xbe,0xa2,0xa5,0xaf,0xa4,0x2f,0x57,0x7e,0x4f,0x4e,0x7a,0x54,0x2b,0x01,0xfc,0x7f,0xc6,0x88,0x47,0x48,0x8c,0xcc,0x84,0x7d,0xbc,0x7e,0x3f,0x0f,0x23,0x38,0x29,0x92, -0x45,0x69,0x47,0x25,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x32,0x63,0x92,0x61,0xfd,0xdc,0xc7,0xc1,0xc0,0xc4,0x60,0x89,0x58,0x29,0x28,0x57,0x87,0x00,0x00,0x02,0x00,0xa0,0xff,0xe8,0x04,0x92,0x05,0xb2,0x00,0x30,0x00,0x40,0x00,0x2b,0x40,0x16,0x21,0x2b,0x91,0x18,0x26,0x91,0x1d,0x1d,0x18,0x00,0x36,0x91,0x05,0x05,0x0f,0x20, -0x18,0x04,0x3e,0x91,0x0f,0x13,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x39,0x11,0x33,0x2f,0xed,0x10,0xed,0x32,0x30,0x31,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15, -0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x42,0x21,0x53,0x5d,0x63,0x31,0x6e,0xb5,0x81,0x47,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0xa3,0xac,0x2b,0x63,0x5f,0x55,0x1e,0x2a,0x74,0x38,0x17,0x36,0x38,0x36,0x18,0x2e,0x62,0x5e,0x56,0x22,0x2e,0x41,0x28,0x13,0x02,0xa6,0x2d,0x56,0x7c,0x4e,0x4f, -0x80,0x5a,0x30,0xaa,0xaf,0xa5,0xa8,0x03,0x84,0x29,0x38,0x22,0x0f,0x42,0x82,0xbf,0x7d,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x02,0x5a,0xa9,0xa9,0x16,0x1a,0x16,0x21,0x23,0xaa,0x0c,0x12,0x0c,0x06,0x16,0x1a,0x16,0x10,0x28,0x42,0x33,0xfd,0xa1,0x60,0x8b,0x5a,0x2b,0x2d,0x5b,0x8c,0x60,0xc4,0xca,0xcb,0x00,0x00,0x01,0x00,0x82, -0x00,0x00,0x06,0xf8,0x05,0xb4,0x00,0x3e,0x00,0x20,0x40,0x10,0x2a,0x25,0x0c,0x0c,0x2f,0x1c,0x3a,0x12,0x05,0x91,0x2f,0x04,0x12,0x91,0x25,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x30,0x31,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e, -0x02,0x17,0x23,0x2e,0x03,0x35,0x10,0x12,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x06,0x48,0x21,0x46,0x6c,0x4a,0x3a,0x67,0x4e,0x2d,0xa4,0x2d,0x4e,0x67,0x3a,0x4a,0x6c,0x46,0x21,0x1e,0x34,0x49,0x2b,0xc9,0x20,0x3e,0x31,0x1e,0xee,0xe2,0x36,0x6e,0x62,0x4f,0x16,0x13, -0x4f,0x68,0x78,0x3d,0x69,0xa5,0x72,0x3c,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0x02,0xbc,0x91,0xe2,0x9c,0x52,0x46,0x86,0xc4,0x7e,0x6e,0x6e,0x7e,0xc4,0x86,0x46,0x4e,0x98,0xde,0x91,0x73,0xd0,0xb5,0x96,0x3a,0x39,0x8a,0xac,0xd2,0x80,0x01,0x77,0x01,0x7c,0x23,0x4a,0x76,0x52,0x52,0x75,0x4b,0x23,0x61,0xbf,0xfe,0xe3,0xbb, -0x81,0xd0,0xa9,0x89,0x39,0x3a,0x96,0xb2,0xcb,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0x9a,0x00,0x43,0x00,0x1f,0x40,0x0f,0x3b,0x01,0x0f,0x36,0x91,0x21,0x33,0x33,0x01,0x29,0x91,0x19,0x13,0x01,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x11,0x39,0x30,0x31,0x01,0x33,0x1e,0x07,0x15,0x14,0x0e,0x02,0x07, -0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x06,0x01,0x12,0xbe,0x04,0x3a,0x5a,0x71,0x75,0x6f,0x57,0x35,0x24,0x41,0x5d,0x39,0x43,0x76,0x59,0x33,0x5a,0x94,0xbf,0x66,0x75,0xc3, -0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x4f,0x6d,0x44,0x1e,0x36,0x58,0x71,0x78,0x74,0x5e,0x3e,0x05,0x9a,0x23,0x2a,0x1b,0x11,0x16,0x21,0x38,0x56,0x41,0x2e,0x50,0x40,0x2c,0x09,0x08,0x3c,0x61,0x83,0x4e,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a, -0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x1e,0x2e,0x38,0x1a,0x28,0x2f,0x1c,0x12,0x15,0x20,0x39,0x5a,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xc3,0x05,0xb2,0x00,0x42,0x00,0x35,0x40,0x1e,0x3e,0x1a,0x92,0x00,0x0e,0x00,0x0e,0x00,0x20,0xb0,0x30,0xc0,0x30,0xd0,0x30,0x03,0x30,0x13,0x91,0x08,0x08,0x21, -0x38,0x91,0x27,0x13,0x21,0x04,0x20,0x03,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0xce,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x32,0x3e,0x02,0x37,0x33,0x07,0x11,0x14,0x0e,0x02,0x23, -0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x02,0xf1,0x14,0x13,0x2a,0x53,0x7c,0x52,0x3f,0x81,0x68,0x41,0xaa,0x20,0x33,0x3f,0x1f,0x52,0x5d,0x2a,0x31,0x37,0x5e,0x9c,0x86,0x76,0x37,0x4c,0x01,0x4a,0x8b,0xca,0x80,0x75,0xc1,0x8b,0x4c,0x0f,0x10,0xb6,0x0f,0x16, -0x30,0x5e,0x88,0x59,0x57,0x85,0x5a,0x2f,0x18,0x44,0x4e,0x55,0x04,0x7c,0x23,0x4a,0x25,0x39,0x6a,0x52,0x31,0x21,0x4b,0x78,0x58,0x2f,0x3f,0x27,0x11,0x4d,0x51,0x2b,0x43,0x1c,0x83,0x10,0x27,0x43,0x33,0x02,0xfc,0x2a,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53, -0x02,0xe8,0x0e,0x18,0x14,0x0c,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0xd0,0x05,0x9a,0x00,0x54,0x00,0x44,0x40,0x14,0x17,0x45,0x91,0x1e,0x3e,0x1b,0x1b,0x38,0x91,0x23,0x80,0x23,0x90,0x23,0xa0,0x23,0xe0,0x23,0x04,0x23,0xb8,0xff,0xc0,0x40,0x11,0x09,0x0d,0x48,0x3e,0x23,0x3e,0x23,0x0d,0x4f,0x2d,0x12,0x12,0x91,0x07,0x07,0x0d,0x03, -0x00,0x3f,0x33,0x2f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x5d,0x10,0xed,0x33,0x2f,0x12,0x39,0xed,0x39,0x30,0x31,0x13,0x34,0x3e,0x04,0x37,0x3e,0x03,0x37,0x33,0x0e,0x03,0x07,0x0e,0x03,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02, -0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x23,0x2e,0x03,0x82,0x3f,0x6a,0x8d,0x9b,0xa0,0x49,0x55,0x6c,0x42,0x24,0x0d,0xb5,0x10,0x49,0x77,0xa8,0x6f,0x4d,0x8b,0x72,0x58,0x1a,0x05,0x22,0x4f,0x28,0x6a,0x88,0x1b,0x0e,0x3d,0x51,0x5f,0x2f,0x54,0x8b,0x63,0x37,0x1d,0x2f, -0x3c,0x1f,0xc2,0x23,0x45,0x36,0x21,0x22,0x39,0x4b,0x29,0x3b,0x53,0x33,0x17,0xa2,0x14,0x32,0x54,0x40,0x2f,0x4f,0x39,0x20,0x23,0x37,0x44,0x21,0xc2,0x1f,0x3c,0x2f,0x1d,0x02,0x26,0xab,0xf2,0xa4,0x62,0x38,0x18,0x09,0x0a,0x13,0x1a,0x25,0x1c,0x42,0x58,0x3c,0x27,0x10,0x0b,0x11,0x20,0x3b,0x34,0x1d,0x1a,0x7c,0x85,0x45,0x61,0x3d, -0x1d,0x3e,0x7d,0xbb,0x7c,0x66,0xa3,0x85,0x6b,0x2d,0x29,0x6b,0x88,0xa6,0x64,0x62,0x85,0x52,0x23,0x37,0x60,0x83,0x4c,0x30,0x30,0x4d,0x83,0x60,0x36,0x29,0x56,0x83,0x5a,0x64,0xa6,0x88,0x6b,0x29,0x2d,0x6d,0x87,0xa2,0x00,0x01,0x00,0xa0,0xff,0xe8,0x04,0xac,0x05,0x9a,0x00,0x27,0x00,0x18,0x40,0x0b,0x23,0x15,0x1f,0x1f,0x05,0x0c, -0x03,0x10,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x04,0xac,0x46,0x83,0xbb,0x75,0x80,0xc6,0x87,0x46,0xa2,0xb2,0xad,0x58,0x85, -0x58,0x2c,0x13,0x1e,0x21,0x1e,0x13,0x15,0x1b,0xb1,0x15,0x22,0x29,0x31,0x29,0x01,0x98,0x5a,0x9d,0x75,0x44,0x47,0x83,0xb7,0x71,0x03,0xc0,0xfc,0x42,0xa6,0xb8,0x2a,0x4b,0x68,0x3d,0x3a,0x5e,0x4e,0x43,0x40,0x40,0x24,0x22,0x4c,0x2d,0x20,0x46,0x32,0x2c,0x5a,0x6c,0x86,0x00,0x02,0x00,0x6e,0xff,0xe8,0x05,0xba,0x05,0xb2,0x00,0x5a, -0x00,0x66,0x00,0x3e,0xb6,0x3d,0x2d,0x64,0x54,0x64,0x01,0x64,0xb8,0xff,0xe0,0x40,0x1a,0x10,0x15,0x48,0x64,0x9f,0x13,0x01,0x13,0x13,0x35,0x1e,0x1b,0x92,0x23,0x23,0x49,0x55,0x0f,0x05,0x91,0x49,0x13,0x5e,0x92,0x35,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x33,0x12,0x39,0x2f,0x5d,0x33,0x2b,0x5d,0x12,0x39,0x39, -0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x04,0x27,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x16,0x16,0x17,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x05,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e, -0x02,0x37,0x33,0x0e,0x03,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x1d,0x57,0x8e,0xb4,0x5d,0x3a,0x78,0x70,0x62,0x49,0x2a,0x20,0x38,0x4a,0x56,0x5b,0x2d,0x19,0x2b,0x21,0x13,0x31,0x36,0x1d,0x38,0x11,0x23,0x39,0x18,0x52,0x92,0x38,0x5c,0x41,0x24,0x17,0x26,0x33,0x1c,0x3a,0x48,0x28,0x46,0x5c,0x35,0x31, -0x5a,0x46,0x2a,0x43,0x30,0x30,0x66,0x61,0x56,0x40,0x26,0x71,0xbc,0xf6,0x84,0x52,0xa4,0x97,0x81,0x60,0x37,0x21,0x3a,0x4f,0x2d,0xd7,0x35,0x5c,0x46,0x28,0x02,0xbf,0x33,0x2a,0x31,0x31,0x36,0x2d,0x27,0x35,0x02,0x1c,0x6e,0x9c,0x64,0x2f,0x11,0x25,0x3b,0x54,0x70,0x47,0x3c,0x5f,0x4c,0x3d,0x34,0x2e,0x17,0x15,0x27,0x25,0x24,0x12, -0x26,0x32,0x1a,0x16,0x11,0x2d,0x16,0x6d,0x22,0x3b,0x52,0x30,0x27,0x44,0x3b,0x34,0x17,0x2a,0x70,0x51,0x31,0x52,0x3b,0x21,0x21,0x3b,0x52,0x31,0x3c,0x67,0x2d,0x17,0x32,0x3d,0x4b,0x5f,0x77,0x4a,0x93,0xd2,0x86,0x3f,0x1c,0x39,0x59,0x7a,0x9c,0x61,0x46,0x89,0x7f,0x74,0x31,0x2f,0x6f,0x7b,0x86,0x02,0x72,0x23,0x2d,0x2f,0x21,0x2c, -0x41,0x1c,0x20,0x42,0x00,0x01,0x00,0x0a,0xff,0xe8,0x06,0x23,0x05,0xb8,0x00,0x54,0x00,0x30,0x40,0x19,0x10,0x91,0x0d,0x1e,0x07,0x07,0x19,0x4e,0x35,0x4e,0x35,0x4e,0x21,0x3d,0x91,0x2c,0x13,0x48,0x91,0x21,0x04,0x00,0x91,0x19,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x39,0x39,0xed, -0x30,0x31,0x01,0x22,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x16,0x33,0x32,0x3e,0x06,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15, -0x23,0x35,0x34,0x2e,0x02,0x02,0x76,0x32,0x39,0x27,0x22,0x36,0x58,0x49,0x32,0x53,0x3b,0x21,0x97,0x30,0x1d,0x1e,0x2b,0x20,0x1c,0x20,0x29,0x3b,0x51,0x39,0x38,0x5a,0x42,0x2b,0x08,0x1d,0x9b,0x74,0x54,0x88,0x60,0x33,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x20, -0x36,0x48,0x29,0x3b,0x52,0x33,0x17,0xa8,0x13,0x2d,0x49,0x05,0x21,0x2f,0x45,0x51,0x45,0x2e,0x23,0x3f,0x55,0x32,0x2a,0x2a,0x1b,0x2c,0x39,0x3a,0x39,0x2c,0x1b,0x26,0x44,0x5f,0x38,0x80,0x7f,0x3e,0x7d,0xbb,0x7c,0xfe,0x16,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82, -0x53,0x01,0xe1,0x64,0x89,0x52,0x24,0x37,0x60,0x83,0x4c,0x30,0x30,0x49,0x82,0x63,0x39,0x00,0x00,0x02,0x00,0x55,0xff,0xe8,0x06,0xd5,0x05,0xb2,0x00,0x56,0x00,0x66,0x00,0x31,0x40,0x1a,0x64,0x91,0x04,0x2b,0x47,0x19,0x91,0x16,0x2b,0x16,0x2b,0x16,0x3d,0x0c,0x91,0x52,0x13,0x38,0x21,0x91,0x3d,0x04,0x5c,0x91,0x35,0x04,0x00,0x3f, -0xed,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xce,0xed,0x30,0x31,0x01,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x07,0x06,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e, -0x02,0x33,0x32,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x13,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0x59,0x03,0x02,0xb0,0x03,0x02,0x3f,0x6c,0x92,0x53,0x69,0x96,0x60,0x2d,0x25,0x4f,0x79,0x54,0x5e,0x58,0x51,0x6c, -0x41,0x1b,0x82,0x82,0x61,0xaf,0x53,0x1d,0x3a,0x6c,0x9b,0x62,0x61,0xa1,0x73,0x40,0x42,0x75,0xa0,0x5e,0x64,0x9d,0x36,0x37,0x6e,0x6f,0x6f,0x39,0x5d,0x9c,0x71,0x40,0x20,0x3e,0x5a,0x3a,0x3a,0x69,0x4f,0x2e,0x62,0xa2,0xce,0x6c,0x81,0xd4,0x97,0x52,0xa4,0x1c,0x3b,0x5c,0x40,0x41,0x61,0x42,0x21,0x83,0x82,0x80,0x73,0x01,0x8e,0x0f, -0x1f,0x11,0x11,0x1e,0x0f,0x44,0x66,0x44,0x22,0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x5f,0x6d,0x01,0x02,0x30,0x3d,0x54,0x69,0x6c,0xa6,0x71,0x3b,0x3c,0x72,0xa7,0x6b,0x6a,0xa6,0x72,0x3c,0x3e,0x3c,0x26,0x31,0x1c,0x0a,0x31,0x5c,0x81,0x50,0x3b,0x65,0x4e,0x33,0x09,0x04,0x07,0x3b,0x61,0x83,0x4e,0x75, -0xad,0x71,0x37,0x3c,0x6e,0x9c,0x02,0xc1,0x47,0x6f,0x4c,0x27,0x2c,0x4e,0x6c,0x41,0x90,0x99,0x98,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x04,0x7d,0x05,0x9a,0x00,0x31,0x00,0x23,0x40,0x11,0x24,0x0a,0x24,0x0a,0x1b,0x13,0x05,0x91,0x10,0x10,0x15,0x2c,0x91,0x1b,0x13,0x15,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x12,0x39, -0x39,0x2f,0x2f,0x30,0x31,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x03,0xd5,0x2e,0x52,0x72,0x44,0x42,0x6f,0x4f,0x2c,0xa6,0x48,0x7e,0xaa,0x62,0x59, -0x9c,0x41,0xa8,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x02,0xed,0x43,0x68,0x47,0x24,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x28,0x29,0x01,0x51,0xfc,0x40,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a, -0x82,0x53,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0xb6,0x05,0xb3,0x00,0x4d,0x00,0x33,0x40,0x1b,0x08,0x05,0x92,0x4a,0x09,0x0c,0x19,0x37,0x1c,0x0c,0x26,0x37,0x37,0x26,0x0c,0x03,0x00,0x31,0x91,0x1c,0x04,0x3e,0x91,0x16,0x04,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x33,0xed, -0x32,0x30,0x31,0x21,0x2e,0x03,0x27,0x22,0x06,0x07,0x35,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x17,0x16,0x16, -0x17,0x04,0x49,0x19,0x65,0x8a,0xa7,0x6e,0x46,0xbb,0x59,0x41,0x98,0x51,0x68,0x90,0x5a,0x28,0x2b,0x59,0x88,0x5c,0x6d,0x92,0x2f,0x27,0x99,0x67,0x54,0x8b,0x62,0x36,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x20,0x36,0x49,0x2a,0x39,0x4f,0x30,0x15,0xa8,0x16,0x31,0x4f,0x39,0x2c,0x49,0x35,0x1d,0x2b,0x4a,0x62,0x6d,0x74,0x36, -0xb8,0xf1,0x2f,0x2e,0x4f,0x3a,0x23,0x04,0x1e,0x23,0x9c,0x15,0x19,0x02,0x2d,0x83,0x9e,0xb3,0x5e,0x62,0xb2,0x87,0x50,0x5b,0x65,0x65,0x5b,0x3e,0x7c,0xbb,0x7c,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x62,0x85,0x52,0x23,0x2b,0x57,0x81,0x57,0x88,0x88,0x57,0x81,0x57,0x2b,0x26,0x53,0x84,0x5f,0x5a,0x98,0x7e,0x65,0x4f, -0x39,0x13,0x2d,0xa7,0x7d,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x91,0x05,0x9a,0x00,0x3d,0x00,0x1d,0x40,0x0e,0x00,0x1a,0x91,0x30,0x05,0x05,0x21,0x38,0x91,0x27,0x13,0x10,0x21,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x33,0x0e,0x03, -0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x03,0xe9,0x20,0x54,0x5e,0x63,0x30,0x5a,0xa8,0x80,0x4d,0x08,0x0d,0x13,0x0b,0xb6,0x0d,0x15,0x0f,0x08,0x39,0x57,0x68,0x30,0x49,0x7f,0x5e,0x36,0xa8, -0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x03,0x5f,0x2a,0x3a,0x26,0x11,0x34,0x6d,0xaa,0x77,0x21,0x49,0x48,0x45,0x1d,0x1a,0x45,0x4b,0x4c,0x22,0x5f,0x74,0x3f,0x15,0x33,0x57,0x75,0x42,0xfe,0xfc,0x40,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20, -0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x00,0x02,0x00,0x32,0xff,0xe8,0x04,0xf3,0x05,0xb3,0x00,0x13,0x00,0x57,0x00,0x32,0x40,0x1c,0x38,0x33,0x2b,0x20,0x0f,0x91,0x57,0x48,0x00,0x52,0x10,0x52,0x02,0x52,0x52,0x3d,0x05,0x91,0x48,0x13,0x19,0x92,0x3d,0x04,0x26,0x92,0x33,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12, -0x39,0x2f,0x5d,0x12,0x39,0xed,0xce,0x32,0x11,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32, -0x1e,0x02,0x15,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x01,0xb1,0x39,0x5d,0x75,0x3c,0x3c,0x79,0x61,0x3d,0x39,0x5e,0x7a,0x42,0x42,0x76,0x5a,0x35,0x02,0x9a,0x18,0x2d,0x44,0x2b,0x36,0x48,0x2c,0x13,0x9e,0x1c,0x33,0x46,0x2a,0x4e,0x4f,0x15,0xb5,0x0e,0x32,0x5a,0x7b,0x49,0x2a,0x4e, -0x45,0x38,0x13,0x11,0x36,0x43,0x4d,0x29,0x5a,0x87,0x5b,0x2d,0x52,0x89,0xb3,0x61,0x69,0xbc,0x8c,0x52,0x59,0x8e,0xae,0x56,0x31,0x62,0x5b,0x51,0x20,0x01,0xde,0x56,0x83,0x59,0x2e,0x2d,0x58,0x82,0x55,0x55,0x83,0x59,0x2e,0x2b,0x56,0x83,0x01,0xc8,0x50,0x71,0x48,0x22,0x1e,0x33,0x45,0x27,0x2b,0x2b,0x2d,0x46,0x30,0x1a,0x62,0x54, -0x30,0x42,0x36,0x32,0x52,0x7b,0x53,0x2a,0x0f,0x23,0x38,0x29,0x28,0x38,0x24,0x10,0x32,0x6d,0xac,0x7a,0xfd,0xec,0x72,0xb9,0x81,0x46,0x46,0x84,0xbc,0x76,0x78,0xb8,0x7d,0x3f,0x11,0x24,0x37,0x27,0x00,0x02,0x00,0xa0,0x00,0x00,0x04,0x94,0x05,0xb1,0x00,0x0d,0x00,0x3f,0x00,0x22,0x40,0x11,0x06,0x91,0x3a,0x3a,0x3b,0x23,0x91,0x0e, -0x0e,0x2a,0x00,0x92,0x30,0x04,0x19,0x2a,0x12,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x33,0x2f,0xed,0x30,0x31,0x01,0x22,0x0e,0x02,0x15,0x15,0x3e,0x03,0x35,0x34,0x26,0x13,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32, -0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x3e,0x03,0x01,0xde,0x23,0x39,0x28,0x16,0x4e,0x6e,0x45,0x1f,0x3f,0x9a,0x63,0xab,0x7f,0x48,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x37,0x56,0x6b,0x33,0x48,0x87,0x69,0x3f,0xa2,0x33,0x57,0x73,0x41,0x44,0x6f,0x50,0x2b,0x2e,0x6b,0xb0,0x81,0x21,0x5b,0x66,0x6b,0x05,0x21,0x18,0x2a, -0x3c,0x24,0x83,0x0a,0x25,0x31,0x3b,0x20,0x30,0x3a,0xfe,0x36,0x35,0x71,0xb0,0x7b,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x5f,0x7b,0x47,0x1c,0x30,0x57,0x7d,0x4c,0xfe,0x8e,0x04,0x74,0x4c,0x77,0x50,0x2a,0x20,0x3f,0x5b,0x3b,0x34,0x66,0x5a,0x48,0x16,0xc5,0x2d,0x43,0x2c,0x16,0x00,0x01,0x00,0x82,0xff,0xe8,0x05,0x1d, -0x05,0x9a,0x00,0x42,0x00,0x20,0x40,0x10,0x14,0x3d,0x91,0x00,0x07,0x3c,0x3c,0x1e,0x28,0x03,0x31,0x91,0x1e,0x13,0x07,0x03,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x39,0x30,0x31,0x01,0x34,0x2e,0x04,0x35,0x33,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x26,0x02,0x35, -0x34,0x3e,0x02,0x37,0x33,0x06,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x04,0x28,0x3a,0x57,0x65,0x57,0x3a,0xb1,0x39,0x55,0x64,0x55,0x39,0x24,0x41,0x5c,0x37,0x45,0x77,0x56,0x31,0x5f,0x9f,0xd2,0x73,0x87,0xdd,0x9e,0x56,0x1f,0x34,0x42,0x23,0xc7,0x6d,0x68,0x3c,0x72, -0xa4,0x68,0x69,0x97,0x60,0x2d,0x2c,0x58,0x85,0x59,0x7f,0x79,0x46,0x6a,0x48,0x25,0x04,0x1a,0x31,0x32,0x20,0x1c,0x35,0x5c,0x50,0x2c,0x2d,0x1d,0x1c,0x36,0x5e,0x51,0x30,0x54,0x42,0x2d,0x08,0x09,0x3c,0x61,0x82,0x4e,0x75,0xad,0x71,0x37,0x5e,0xbc,0x01,0x1b,0xbd,0x7b,0xd3,0xaf,0x8d,0x36,0x94,0xfe,0xa4,0xd6,0x94,0xe0,0x96,0x4b, -0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x20,0x32,0x3e,0x00,0x02,0x00,0x6e,0xff,0xe8,0x04,0x60,0x05,0x9a,0x00,0x16,0x00,0x24,0x00,0x16,0x40,0x0b,0x15,0x03,0x22,0x91,0x14,0x0f,0x10,0x1a,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32, -0x1e,0x02,0x17,0x11,0x33,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x04,0x60,0x47,0x82,0xb7,0x6f,0x7a,0xc0,0x84,0x45,0x47,0x81,0xb5,0x6e,0x31,0x63,0x5b,0x51,0x1f,0xa8,0xfc,0xbe,0xa2,0xa5,0xae,0xa5,0x2f,0x57,0x7e,0x4f,0x9d,0xaa,0x02,0x06,0x7f,0xc9,0x8c,0x4a,0x4b,0x90,0xcf,0x84,0x7d,0xc0,0x82,0x43, -0x10,0x24,0x39,0x28,0x02,0x17,0xfc,0x76,0xc7,0xcb,0xcb,0xc3,0x60,0x8c,0x5d,0x2d,0xb3,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x04,0xff,0x05,0xb3,0x00,0x41,0x00,0x56,0x00,0x33,0x40,0x1c,0x3f,0x53,0x91,0x17,0x12,0x30,0x00,0x00,0x00,0x10,0x00,0x02,0x23,0x00,0x23,0x00,0x09,0x29,0x92,0x1c,0x04,0x36,0x92,0x12,0x04,0x47,0x09,0x12, -0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xce,0x11,0x39,0xed,0x39,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x07,0x01,0x23,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35, -0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x17,0x36,0x36,0x13,0x1e,0x03,0x17,0x33,0x3e,0x03,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x02,0xa4,0x58,0x8c,0x62,0x33,0x2d,0xfe,0xfe,0x8e,0xfe,0x17,0x11,0x16,0x32,0x5a,0x7e,0x4b,0x29,0x4d,0x43,0x36,0x11,0x13,0x38,0x45,0x4e,0x2a,0x49,0x7c,0x5a,0x33,0x0e, -0xb7,0x15,0x4f,0x4e,0x2a,0x46,0x33,0x1c,0x9e,0x13,0x2c,0x48,0x36,0x22,0x3b,0x2b,0x19,0x0c,0x0c,0x39,0x4e,0xa7,0x33,0x05,0x10,0x10,0x0d,0x03,0x02,0x03,0x0e,0x11,0x11,0x05,0x72,0x18,0x67,0x72,0x4b,0x7e,0x37,0x03,0xd5,0x28,0x4c,0x6d,0x45,0x59,0x5a,0xfe,0x04,0x03,0xca,0x23,0x5b,0x32,0x51,0x76,0x4d,0x25,0x10,0x24,0x38,0x28, -0x29,0x38,0x23,0x0f,0x2a,0x53,0x7b,0x52,0x32,0x36,0x42,0x30,0x54,0x62,0x1a,0x30,0x46,0x2d,0x2b,0x2b,0x27,0x45,0x33,0x1e,0x18,0x2e,0x43,0x2b,0x1d,0x36,0x17,0x72,0x1d,0x20,0xfd,0x79,0x0b,0x20,0x25,0x25,0x0f,0x0f,0x25,0x25,0x21,0x0b,0xe1,0x2e,0x3a,0x53,0x53,0x1c,0x19,0x00,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x26,0x05,0x9a, -0x00,0x41,0x00,0x53,0x00,0x3f,0x40,0x25,0x02,0x41,0x09,0x4f,0x2d,0x10,0x06,0x05,0x0d,0x0d,0x4c,0x91,0x1f,0x32,0x05,0x05,0x42,0x91,0x3c,0x6f,0x32,0x7f,0x32,0xdf,0x32,0x03,0x32,0x3c,0x32,0x3c,0x01,0x27,0x91,0x16,0x13,0x01,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x33,0x2f,0x10,0xce,0xed,0x33,0x2f, -0x12,0x17,0x39,0x30,0x31,0x01,0x33,0x11,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x16,0x16,0x17,0x15,0x26,0x26,0x27,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x25,0x22, -0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x2e,0x03,0x03,0xad,0xa8,0x33,0x66,0x38,0x39,0x69,0x30,0x30,0x69,0x39,0x38,0x66,0x33,0x4a,0x8b,0xca,0x80,0x7e,0xc1,0x82,0x43,0x0f,0x10,0xb6,0x0f,0x16,0x2b,0x58,0x87,0x5c,0x57,0x85,0x5a,0x2f,0x2d,0x5a,0x5f,0x66,0x37,0x43,0x70,0x52,0x2e,0x2e,0x52,0x70,0x43,0x37,0x66,0x5f, -0x5a,0x2d,0xfe,0x88,0x17,0x32,0x2a,0x1b,0x1b,0x2a,0x32,0x17,0x66,0xbf,0x55,0x2a,0x5b,0x5f,0x63,0x05,0x9a,0xfe,0xac,0x2a,0x4d,0x21,0xa0,0x1d,0x46,0x26,0x26,0x45,0x1d,0xa0,0x20,0x4e,0x29,0xfe,0xb6,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x01,0x53,0x22, -0x3b,0x2c,0x19,0x2b,0x4f,0x6d,0x42,0x42,0x6d,0x4e,0x2b,0x19,0x2c,0x3b,0x22,0x0f,0x0f,0x23,0x39,0x2a,0x2a,0x3a,0x23,0x0f,0x55,0x40,0x20,0x37,0x28,0x17,0x00,0x02,0x00,0xa0,0xff,0xe8,0x04,0x92,0x05,0x9a,0x00,0x16,0x00,0x24,0x00,0x16,0x40,0x0b,0x22,0x91,0x11,0x13,0x1a,0x91,0x02,0x07,0x10,0x01,0x03,0x00,0x3f,0x3f,0x33,0xed, -0x3f,0xed,0x30,0x31,0x13,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x25,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0xa0,0xa8,0x1f,0x51,0x5b,0x63,0x31,0x6e,0xb5,0x81,0x47,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0x03,0x42,0xaa,0x9d,0x4f,0x7e,0x57,0x2f,0xa5,0xae, -0xa5,0xa2,0x05,0x9a,0xfd,0xe9,0x28,0x39,0x24,0x10,0x43,0x82,0xc0,0x7d,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x0a,0xbf,0xb3,0x2d,0x5d,0x8c,0x60,0xc3,0xcb,0xcb,0x00,0x01,0x00,0x50,0xff,0xe8,0x05,0xea,0x05,0xb2,0x00,0x5b,0x00,0x34,0x40,0x1d,0x14,0x4f,0x21,0x4f,0x21,0x4f,0x29,0x48,0x91,0x57,0x13,0x5b,0x44,0x15,0x2d,0x04, -0x08,0x34,0x91,0x3b,0x04,0x19,0x92,0x29,0x04,0x0e,0x92,0x08,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x01,0x26,0x26,0x27,0x22,0x06,0x06,0x15,0x14, -0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x01,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x01,0x01,0x16,0x16,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x01,0xd9,0x19,0x1d,0x24,0x49, -0x6e,0x4a,0x20,0x48,0x1f,0x3c,0x4b,0x39,0x39,0x3b,0x3d,0x01,0xc9,0xfe,0xb5,0x0f,0x21,0x12,0x09,0x1a,0x16,0x1c,0x17,0xa4,0x11,0x15,0x25,0x3d,0x4e,0x2a,0x48,0x6a,0x2a,0x01,0x32,0x01,0xc4,0x23,0x1b,0x29,0x1e,0x35,0x51,0x2c,0x2b,0x66,0x28,0x3d,0x5a,0x3b,0x1d,0x3e,0x3e,0xfe,0x21,0x01,0x40,0x0f,0x1f,0x15,0x20,0x18,0x1c,0x17, -0xae,0x11,0x15,0x26,0x3f,0x50,0x2a,0x48,0x6f,0x2a,0xfe,0xd9,0x01,0x7c,0x24,0x54,0x28,0x2f,0x58,0x44,0x29,0x0d,0x0f,0xb5,0x47,0x3f,0x2e,0x30,0x61,0x26,0x01,0x45,0x02,0x1e,0x18,0x0f,0x01,0x08,0x1f,0x1d,0x26,0x5b,0x2c,0x2b,0x50,0x2c,0x37,0x52,0x37,0x1b,0x3f,0x45,0xfe,0x10,0x01,0x42,0x19,0x34,0x14,0x1a,0x22,0x1e,0x17,0xa4, -0x11,0x15,0x22,0x3a,0x4f,0x2d,0x3c,0x6d,0x2c,0xfe,0xad,0xfd,0xfa,0x18,0x12,0x01,0x04,0x24,0x1d,0x26,0x55,0x2c,0x2b,0x50,0x2c,0x37,0x54,0x38,0x1d,0x3f,0x45,0x01,0xe3,0x00,0x00,0x01,0x00,0x50,0xff,0xe8,0x04,0x46,0x05,0x9a,0x00,0x52,0x00,0x2e,0x40,0x19,0x31,0x16,0x91,0x13,0x39,0x0d,0x91,0x0a,0x5f,0x0a,0x01,0x13,0x4b,0x0a, -0x0a,0x4b,0x13,0x03,0x22,0x00,0x91,0x43,0x13,0x22,0x03,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x39,0x30,0x31,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x2e,0x06,0x35,0x33,0x14,0x1e,0x06,0x15,0x14, -0x0e,0x02,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x02,0x58,0x4a,0x76,0x52,0x2b,0x21,0x3b,0x51,0x2f,0x5e,0x5e,0x67,0x75,0x6b,0x71,0x5e,0x5e,0x73,0x69,0x2a,0x46,0x58,0x5d,0x58,0x46,0x2a,0xb1,0x2a,0x46,0x58,0x5d,0x58,0x46, -0x2a,0x17,0x31,0x4c,0x35,0x65,0x63,0x1a,0x32,0x4b,0x31,0x35,0x4c,0x30,0x17,0x3f,0x7c,0xbb,0x7b,0x6f,0xbd,0x8a,0x4e,0x1e,0xb7,0x12,0x13,0x33,0x5c,0x7e,0x7e,0x13,0x2a,0x41,0x2e,0x21,0x36,0x25,0x15,0x96,0x3b,0x3d,0x3f,0x31,0x96,0x3d,0x3b,0x1e,0x24,0x16,0x0e,0x13,0x1d,0x33,0x4f,0x3b,0x1b,0x22,0x18,0x11,0x14,0x1d,0x2e,0x44, -0x32,0x27,0x49,0x3c,0x29,0x07,0x14,0x5c,0x4d,0x26,0x41,0x32,0x21,0x06,0x09,0x2e,0x3f,0x4d,0x28,0x47,0x71,0x50,0x2b,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x00,0x01,0x00,0x82,0xff,0xe8,0x04,0xcc,0x05,0x9a,0x00,0x57,0x00,0x2c,0x40,0x17,0x20,0x4c,0x91,0x49,0x18,0x55,0x91,0x52,0x5f,0x49,0x01,0x49, -0x52,0x49,0x52,0x09,0x3f,0x91,0x2a,0x13,0x35,0x09,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x39,0x30,0x31,0x01,0x34,0x2e,0x06,0x35,0x33,0x14,0x1e,0x06,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x26,0x02,0x35,0x34, -0x3e,0x02,0x37,0x33,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x04,0x1b,0x1f,0x33,0x41,0x45,0x41,0x33,0x1f,0xb1,0x1f,0x33,0x41,0x45,0x41,0x33,0x1f,0x17,0x31,0x4c,0x35,0x65,0x63,0x1a,0x32,0x4b,0x31,0x35,0x4c,0x30,0x17, -0x3f,0x7c,0xbb,0x7b,0x87,0xdd,0x9e,0x56,0x1e,0x33,0x43,0x24,0xc9,0x38,0x50,0x33,0x17,0x3b,0x70,0xa2,0x68,0x47,0x73,0x50,0x2b,0x21,0x3b,0x51,0x2f,0x5e,0x5e,0x67,0x75,0x6b,0x71,0x5e,0x5e,0x73,0x69,0x04,0x47,0x1e,0x25,0x18,0x11,0x14,0x1e,0x32,0x4b,0x38,0x1b,0x22,0x18,0x11,0x14,0x1d,0x2e,0x44,0x32,0x27,0x49,0x3c,0x29,0x07, -0x14,0x5c,0x4d,0x26,0x41,0x32,0x21,0x06,0x09,0x2e,0x3f,0x4d,0x28,0x47,0x71,0x50,0x2b,0x5e,0xbc,0x01,0x1b,0xbd,0x7c,0xd2,0xaf,0x8d,0x36,0x4a,0xa0,0xb0,0xc1,0x6b,0x94,0xe0,0x96,0x4b,0x13,0x29,0x41,0x2e,0x21,0x36,0x25,0x15,0x96,0x3b,0x3d,0x3f,0x31,0x96,0x3d,0x00,0x00,0x02,0x00,0x64,0xff,0xe8,0x05,0xe4,0x05,0xb2,0x00,0x29, -0x00,0x3b,0x00,0x26,0x40,0x14,0x2f,0x91,0x1f,0x04,0x37,0xee,0x08,0x08,0x10,0x15,0x91,0x0f,0x0a,0x13,0x00,0x27,0x91,0x01,0x06,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x39,0x10,0xed,0x3f,0xed,0x30,0x31,0x25,0x15,0x0e,0x03,0x23,0x22,0x27,0x06,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x17,0x2e,0x03,0x35,0x34,0x12, -0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x36,0x36,0x03,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x12,0x17,0x3e,0x03,0x05,0xe4,0x35,0x64,0x6d,0x7c,0x4c,0x82,0x72,0x6b,0x74,0x56,0x83,0x6f,0x63,0x34,0x2f,0x5a,0x5f,0x67,0x3c,0x5c,0x83,0x56,0x28,0x5d,0xaf,0xfa,0x9e,0x92,0xec,0xa7,0x5b,0xb9,0xba,0x72,0xc9,0x78, -0x40,0x7b,0xb1,0x70,0x6e,0xb4,0x80,0x46,0xf7,0xe9,0x75,0xb4,0x7b,0x40,0xd8,0xb0,0x10,0x18,0x10,0x08,0x15,0x15,0x08,0x10,0x18,0x10,0xb5,0x12,0x1e,0x17,0x10,0x03,0x2d,0x82,0xa0,0xbc,0x68,0xa6,0x01,0x04,0xb4,0x5e,0x5d,0xae,0xf8,0x9c,0xe2,0xfe,0xab,0x5d,0x04,0x2f,0x02,0x54,0x85,0xc8,0x85,0x42,0x49,0x8b,0xc8,0x7e,0xf3,0xfe, -0xc7,0x38,0x1b,0x6c,0x9d,0xcb,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0x89,0x05,0xbb,0x00,0x34,0x00,0x26,0x40,0x13,0x0c,0x0a,0x91,0x1b,0x2d,0x1b,0x2d,0x15,0x00,0x91,0x25,0x13,0x10,0x91,0x15,0x15,0x18,0x13,0x04,0x00,0x3f,0x33,0x33,0x2f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x39,0x30,0x31,0x25,0x32,0x3e,0x02,0x35,0x34, -0x2e,0x02,0x23,0x23,0x35,0x01,0x23,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x37,0x15,0x01,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x02,0x78,0x64,0x8a,0x54,0x25,0x2c,0x58,0x85,0x59,0xc5,0x01,0x64,0x03,0x77,0x76,0xaa,0xb7,0x2b,0x8d,0xce,0x67,0xff,0x81, -0xfe,0x76,0x03,0x8b,0xb9,0x6d,0x2d,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x7f,0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x4b,0x01,0xdb,0x18,0x41,0x97,0x40,0x21,0x20,0x3f,0xfd,0xf0,0x02,0x07,0x53,0x7c,0x97,0x4b,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69, -0x48,0x25,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0x89,0x05,0x9a,0x00,0x44,0x00,0x2e,0x40,0x1a,0x3d,0x91,0x08,0x0f,0x36,0x91,0x33,0x00,0x33,0x10,0x33,0x02,0x08,0x33,0x21,0x21,0x33,0x08,0x03,0x00,0x29,0x91,0x19,0x13,0x00,0x03,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x30,0x31,0x01,0x33, -0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x01,0x17,0xaf,0x09,0x1f,0x3d,0x5a,0x3b, -0x01,0x91,0x24,0x41,0x5d,0x39,0x43,0x76,0x59,0x33,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0x70,0x6a,0x4f,0x6d,0x45,0x1f,0xfe,0x58,0x93,0x69,0x3b,0x06,0x05,0x9a,0x24,0x1b,0x23,0x29,0x15,0x05,0xda,0x2e,0x50,0x40,0x2c,0x09,0x08,0x3c,0x61,0x83, -0x4e,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x1e,0x2e,0x38,0x1a,0x55,0x17,0x35,0x57,0x41,0x14,0x2c,0x00,0x03,0x00,0x6e,0xff,0xe8,0x04,0x29,0x05,0xb2,0x00,0x29,0x00,0x38,0x00,0x47,0x00,0x35,0x40,0x1c,0x24,0x2a,0x91,0x13,0x27,0x13, -0x01,0x39,0x91,0x12,0x28,0x12,0x2f,0x13,0x01,0x13,0x12,0x13,0x12,0x07,0x2e,0x91,0x1e,0x04,0x44,0x91,0x07,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x30,0x31,0x01,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x23,0x22, -0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x33,0x15,0x23,0x15,0x33,0x01,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x13,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x04,0x29,0xad,0x35,0x63,0x8e,0x5a,0x54,0x91,0x6c,0x3d,0x3e,0x6f,0x9a,0x5c,0xc9,0xc9,0x5c,0x9a,0x6f,0x3e, -0x3d,0x6a,0x92,0x55,0x5a,0x8e,0x63,0x35,0xad,0xad,0xad,0xfe,0xb1,0x73,0x6b,0x2f,0x53,0x3e,0x24,0x25,0x42,0x5c,0x36,0xc9,0xc9,0x36,0x5c,0x42,0x25,0x24,0x3e,0x53,0x2f,0x68,0x76,0x01,0xe6,0x94,0x5a,0x88,0x5b,0x2d,0x29,0x52,0x7a,0x52,0x51,0x7c,0x55,0x2b,0xa2,0x2b,0x55,0x7c,0x51,0x52,0x7a,0x52,0x29,0x2e,0x5a,0x88,0x5a,0x94, -0x96,0xa2,0x01,0x38,0x94,0x69,0x6c,0x13,0x2a,0x44,0x31,0x2e,0x44,0x2e,0x17,0xfe,0x32,0x17,0x2e,0x45,0x2d,0x31,0x44,0x2a,0x13,0x6b,0x6a,0x00,0x00,0x03,0x00,0x6e,0xff,0xf1,0x05,0xd9,0x05,0xa7,0x00,0x1d,0x00,0x2a,0x00,0x37,0x00,0x2d,0x40,0x17,0x37,0x91,0x04,0x04,0x20,0x91,0x1d,0x2d,0x92,0x0e,0x0e,0x2a,0x92,0x13,0x1d,0x13, -0x1d,0x13,0x01,0x10,0x03,0x01,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0xed,0x10,0xed,0x33,0x2f,0xed,0x30,0x31,0x25,0x15,0x23,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23, -0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x03,0x78,0xa8,0x2b,0x7c,0xd0,0x97,0x54,0x54,0x97,0xd1,0x7d,0x29,0xa8,0x2a,0x7d,0xd0,0x96,0x54,0x55,0x97,0xcf,0x7a,0x2c,0x2c,0x5a,0x91,0x64,0x36,0x37,0x65,0x91,0x5a,0xd2,0x29,0x59,0x91,0x67,0x38,0x35,0x64,0x92,0x5c,0xba,0xc9,0xc9,0x54,0x96,0xd1,0x7d,0x7b,0xc9,0x8f, -0x4d,0x95,0x95,0x4f,0x8f,0xc8,0x7a,0x7e,0xd1,0x96,0x53,0x03,0xca,0xfc,0xcc,0x39,0x6b,0x9a,0x62,0x5b,0x95,0x6a,0x3a,0xfc,0xcc,0x03,0x34,0x39,0x69,0x96,0x5d,0x62,0x9b,0x6a,0x38,0x00,0x00,0x01,0x00,0x76,0xff,0xe8,0x04,0xc1,0x05,0xb2,0x00,0x3a,0x00,0x1b,0x40,0x0d,0x29,0x0a,0x1a,0x31,0x2b,0x91,0x36,0x13,0x15,0x0f,0x91,0x1a, -0x04,0x00,0x3f,0xed,0xcd,0x3f,0xed,0xcd,0x12,0x39,0x39,0x30,0x31,0x13,0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x10,0x21,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x76,0x4c,0x86,0xb8,0x6c, -0x49,0x81,0x62,0x39,0x28,0x4c,0x70,0x49,0x4c,0x76,0x50,0x29,0xaa,0x54,0x88,0xae,0x59,0x71,0xb0,0x79,0x3f,0x4c,0x85,0xb6,0x6a,0x46,0x82,0x65,0x3d,0x01,0x74,0x44,0x89,0x6f,0x46,0xab,0x60,0x9d,0xc7,0x67,0x6b,0xc5,0x96,0x5a,0x01,0x85,0x6f,0x92,0x5f,0x37,0x13,0x0c,0x25,0x3c,0x5b,0x43,0x33,0x52,0x3b,0x20,0x24,0x42,0x5c,0x38, -0x6f,0x99,0x5f,0x2b,0x35,0x63,0x8b,0x55,0x66,0x8d,0x60,0x3a,0x14,0x0d,0x24,0x3e,0x5e,0x47,0xfe,0xfa,0x1d,0x41,0x6a,0x4e,0x74,0xa3,0x67,0x2f,0x2a,0x60,0x9e,0x00,0x00,0x01,0x00,0xa0,0xff,0xe8,0x04,0xc3,0x05,0x9a,0x00,0x3d,0x00,0x1d,0x40,0x0e,0x3d,0x23,0x91,0x0e,0x38,0x38,0x16,0x2d,0x1d,0x03,0x05,0x91,0x16,0x13,0x00,0x3f, -0xed,0x3f,0x33,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x01,0x48, -0x2f,0x5a,0x85,0x57,0x58,0x86,0x5a,0x2e,0x16,0x0f,0xb6,0x10,0x0f,0x4a,0x87,0xbe,0x75,0x80,0xca,0x8b,0x4a,0xa8,0x36,0x5e,0x7f,0x49,0x30,0x68,0x57,0x39,0x08,0x0f,0x15,0x0d,0xb6,0x0b,0x13,0x0d,0x08,0x4d,0x80,0xa8,0x5a,0x30,0x63,0x5e,0x54,0x20,0x01,0xdc,0x53,0x82,0x5a,0x2f,0x2b,0x4b,0x68,0x3d,0x30,0x53,0x20,0x2a,0x53,0x27, -0x5a,0x9d,0x75,0x44,0x47,0x83,0xb7,0x71,0x03,0xc0,0xfe,0x42,0x75,0x57,0x33,0x19,0x44,0x78,0x5f,0x22,0x48,0x47,0x40,0x1a,0x1d,0x45,0x48,0x49,0x21,0x77,0xaa,0x6d,0x34,0x11,0x26,0x3a,0x2a,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0xae,0x00,0x2f,0x00,0x3f,0x00,0x26,0x40,0x15,0x1e,0x03,0x35,0x91,0x11,0x00,0x40,0x09, -0x0d,0x48,0x00,0x00,0x16,0x3d,0x91,0x26,0x04,0x0b,0x91,0x16,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x2b,0xce,0xed,0x39,0x39,0x30,0x31,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e, -0x02,0x15,0x14,0x0e,0x02,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x02,0x87,0x26,0x46,0x21,0x07,0x08,0x1a,0x2f,0x40,0x27,0x2f,0x47,0x2f,0x17,0xaf,0x35,0x60,0x86,0x50,0x51,0x82,0x5b,0x32,0x14,0x0c,0x73,0x70,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88,0xcf,0xfe,0x14,0x33,0x5b,0x7f,0x4d, -0xb8,0xc4,0x32,0x5f,0x89,0x58,0xb0,0xb4,0x01,0x7f,0x07,0x07,0x17,0x35,0x22,0x29,0x3d,0x28,0x13,0x17,0x27,0x36,0x1f,0x43,0x6e,0x4e,0x2a,0x2a,0x50,0x70,0x47,0x39,0x58,0x1f,0x45,0xed,0x97,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0x02,0x19,0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0xca,0x00,0x01, -0x00,0x82,0xff,0xd5,0x05,0x14,0x05,0xb2,0x00,0x24,0x00,0x22,0x40,0x10,0x03,0x22,0x00,0x24,0x12,0x24,0x12,0x24,0x01,0x18,0x91,0x0d,0x04,0x02,0x01,0x13,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x39,0x39,0x30,0x31,0x25,0x01,0x35,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e, -0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x33,0x25,0x04,0xd6,0xfc,0x21,0x01,0x73,0x71,0xb5,0x7e,0x44,0x59,0x9d,0xd8,0x7f,0x83,0xd6,0x99,0x53,0xaa,0x36,0x68,0x9a,0x63,0x65,0x9c,0x6b,0x37,0x4d,0x94,0xd5,0x89,0x01,0x01,0x6a,0xe5,0xfe,0xf0,0x9d,0x6b,0x20,0x75,0xa2,0xcd,0x78,0x84,0xdd,0x9f,0x59,0x50,0x96,0xd5,0x85, -0x5d,0x9d,0x70,0x3f,0x48,0x7e,0xaa,0x61,0x68,0xb8,0x92,0x65,0x15,0x65,0x00,0x01,0x00,0x62,0xff,0xe8,0x04,0xad,0x05,0xb2,0x00,0x3a,0x00,0x1b,0x40,0x0d,0x31,0x12,0x05,0x2c,0x91,0x26,0x21,0x04,0x10,0x91,0x0a,0x05,0x13,0x00,0x3f,0xcd,0xed,0x3f,0xcd,0xed,0x12,0x39,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35, -0x33,0x14,0x1e,0x02,0x33,0x20,0x11,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0xad,0x5a,0x96,0xc5,0x6b,0x67,0xc7,0x9d,0x60,0xab,0x46,0x6f,0x89,0x44,0x01,0x74,0x3d,0x65,0x82,0x46,0x6a,0xb6,0x85,0x4c,0x42,0x7b, -0xaf,0x6d,0x59,0xad,0x89,0x54,0xaa,0x29,0x50,0x76,0x4c,0x49,0x70,0x4d,0x27,0x39,0x61,0x82,0x49,0x6c,0xb8,0x86,0x4c,0x01,0x85,0x75,0x9e,0x60,0x2a,0x2f,0x67,0xa3,0x74,0x4e,0x6a,0x41,0x1d,0x01,0x06,0x47,0x5e,0x3e,0x24,0x0d,0x14,0x3a,0x60,0x8d,0x66,0x53,0x8b,0x63,0x37,0x2b,0x5f,0x99,0x6f,0x38,0x5c,0x42,0x24,0x20,0x3b,0x52, -0x33,0x43,0x5b,0x3c,0x25,0x0c,0x13,0x37,0x5f,0x92,0x00,0x02,0x00,0x64,0xff,0xe8,0x05,0xe4,0x05,0xb2,0x00,0x29,0x00,0x3b,0x00,0x26,0x40,0x14,0x2f,0x91,0x1e,0x13,0x0f,0x14,0x91,0x0e,0x09,0x04,0x37,0xee,0x07,0x07,0x29,0x26,0x91,0x00,0x05,0x04,0x00,0x3f,0x33,0xed,0x32,0x39,0x10,0xed,0x3f,0x33,0xed,0x32,0x3f,0xed,0x30,0x31, -0x13,0x3e,0x03,0x33,0x32,0x17,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x27,0x1e,0x03,0x15,0x14,0x02,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x37,0x06,0x06,0x07,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x02,0x27,0x0e,0x03,0x64,0x34,0x65,0x6d,0x7c,0x4c,0x82,0x72,0x6a,0x75,0x55,0x84,0x6f,0x62,0x35,0x2f, -0x5a,0x5f,0x67,0x3c,0x5b,0x84,0x56,0x28,0x5d,0xaf,0xfb,0x9d,0x92,0xec,0xa7,0x5b,0xb9,0xba,0x72,0xc9,0x66,0xde,0x40,0x7b,0xb0,0x71,0x6e,0xb4,0x80,0x46,0xf7,0xe9,0x75,0xb4,0x7b,0x40,0x05,0x72,0x10,0x18,0x10,0x08,0x15,0x15,0x08,0x10,0x18,0x10,0xb5,0x12,0x1e,0x17,0x10,0x03,0x2d,0x82,0xa0,0xbc,0x68,0xa6,0xfe,0xfc,0xb4,0x5e, -0x5d,0xae,0xf8,0x9c,0xe2,0x01,0x55,0x5d,0x04,0x2f,0x26,0xfd,0xd2,0x86,0xc7,0x85,0x42,0x49,0x8b,0xc8,0x7e,0xf3,0x01,0x39,0x38,0x1b,0x6c,0x9d,0xcb,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x05,0xbe,0x05,0xb2,0x00,0x13,0x00,0x27,0x00,0x10,0xb7,0x14,0x91,0x0a,0x04,0x1e,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x30,0x31,0x05,0x22, -0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x03,0x15,0x98,0xf6,0xb0,0x5f,0x60,0xb4,0x01,0x01,0xa0,0x94,0xf2,0xac,0x5f,0x61,0xb2,0xfb,0x8f,0x72,0xbc,0x87,0x4a,0x48,0x83,0xb8,0x70,0x76,0xbd,0x85, -0x47,0x44,0x81,0xb9,0x18,0x6a,0xc0,0x01,0x0a,0xa0,0xac,0x01,0x18,0xc6,0x6c,0x6a,0xbe,0xfe,0xf5,0xa0,0xaf,0xfe,0xe7,0xc5,0x6a,0x05,0x32,0x56,0x9c,0xd9,0x84,0x83,0xd9,0x9b,0x55,0x4f,0x96,0xda,0x8a,0x8d,0xdd,0x98,0x50,0x00,0x00,0x03,0x00,0xbe,0x02,0x27,0x03,0x98,0x06,0x8f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x1a,0x40,0x09, -0x0b,0x09,0x09,0x02,0x05,0x07,0x07,0x00,0x02,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x2f,0xcd,0x30,0x31,0x01,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0x05,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x02,0x31,0xa9,0xa9,0xfe,0xe8,0xa9,0xa9,0x02,0x27,0x02,0xa6,0xfd,0x5a,0x02,0xa6,0x67,0x02,0x29,0x00,0x00,0x00,0x00,0x01, -0x00,0x00,0xc2,0x66,0x00,0x01,0x20,0x64,0xc0,0x00,0x00,0x0d,0x02,0x58,0x00,0x05,0x00,0x55,0xff,0xcd,0x00,0x05,0x00,0x56,0xff,0xbe,0x00,0x05,0x00,0xe4,0xff,0xbe,0x00,0x05,0x00,0xfb,0xff,0xbe,0x00,0x05,0x01,0x1b,0xff,0xcd,0x00,0x05,0x01,0x1d,0xff,0xcd,0x00,0x05,0x01,0x1f,0xff,0xbe,0x00,0x05,0x01,0x73,0xff,0xcd,0x00,0x05, -0x01,0x75,0xff,0xbe,0x00,0x05,0x01,0xd5,0xff,0x6f,0x00,0x05,0x02,0x2b,0xff,0xbc,0x00,0x05,0x02,0x3e,0xff,0xbe,0x00,0x0a,0x00,0x55,0xff,0xcd,0x00,0x0a,0x00,0x56,0xff,0xbe,0x00,0x0a,0x00,0xe4,0xff,0xbe,0x00,0x0a,0x00,0xfb,0xff,0xbe,0x00,0x0a,0x01,0x1b,0xff,0xcd,0x00,0x0a,0x01,0x1d,0xff,0xcd,0x00,0x0a,0x01,0x1f,0xff,0xbe, -0x00,0x0a,0x01,0x73,0xff,0xcd,0x00,0x0a,0x01,0x75,0xff,0xbe,0x00,0x0a,0x01,0xd5,0xff,0x6f,0x00,0x0a,0x02,0x2b,0xff,0xbc,0x00,0x0a,0x02,0x3e,0xff,0xbe,0x00,0x0b,0x00,0x4d,0x00,0xe9,0x00,0x0b,0x01,0x64,0x00,0xe9,0x00,0x0d,0x00,0x24,0xff,0x5a,0x00,0x0d,0x00,0x2d,0xff,0x66,0x00,0x0d,0x00,0x46,0xff,0x9a,0x00,0x0d,0x00,0x47, -0xff,0x9a,0x00,0x0d,0x00,0x48,0xff,0x9a,0x00,0x0d,0x00,0x4a,0xff,0x9a,0x00,0x0d,0x00,0x52,0xff,0x9a,0x00,0x0d,0x00,0x54,0xff,0x9a,0x00,0x0d,0x00,0xa9,0xff,0x58,0x00,0x0d,0x00,0xf8,0xff,0x9a,0x00,0x0d,0x00,0xfd,0xff,0x9a,0x00,0x0d,0x00,0xff,0xff,0x9a,0x00,0x0d,0x01,0x00,0xff,0x9a,0x00,0x0d,0x01,0x03,0xff,0x5a,0x00,0x0d, -0x01,0x05,0xff,0x5a,0x00,0x0d,0x01,0x08,0xff,0x9a,0x00,0x0d,0x01,0x0b,0xff,0x9a,0x00,0x0d,0x01,0x45,0xff,0x5a,0x00,0x0d,0x01,0x48,0xff,0x9a,0x00,0x0d,0x01,0x52,0xff,0x9a,0x00,0x0d,0x01,0x54,0xff,0x9a,0x00,0x0d,0x01,0x56,0xff,0x9a,0x00,0x0d,0x01,0x63,0xff,0x66,0x00,0x0d,0x01,0x85,0xff,0x5a,0x00,0x0d,0x01,0x87,0xff,0x5a, -0x00,0x0d,0x01,0xa9,0xff,0x58,0x00,0x0d,0x01,0xb0,0xff,0x58,0x00,0x0d,0x01,0xe7,0xff,0x58,0x00,0x0d,0x02,0x0c,0xff,0x98,0x00,0x0d,0x02,0x15,0xff,0x98,0x00,0x0d,0x02,0x18,0xff,0x98,0x00,0x0d,0x02,0x1b,0xff,0x98,0x00,0x0d,0x02,0x27,0xff,0x98,0x00,0x0d,0x02,0x2a,0xff,0x98,0x00,0x0f,0x00,0xb4,0xff,0x31,0x00,0x0f,0x00,0xb5, -0xff,0x31,0x00,0x0f,0x00,0xb6,0xff,0x31,0x00,0x0f,0x00,0xb7,0xff,0x31,0x00,0x10,0x01,0x33,0xff,0xdb,0x00,0x10,0x01,0xd3,0xff,0xe7,0x00,0x10,0x02,0x37,0xff,0xdb,0x00,0x11,0x00,0xb4,0xff,0x31,0x00,0x11,0x00,0xb5,0xff,0x3d,0x00,0x11,0x00,0xb6,0xff,0x31,0x00,0x11,0x00,0xb7,0xff,0x3d,0x00,0x1e,0x02,0x37,0xff,0xdb,0x00,0x22, -0x01,0xcb,0xff,0xe7,0x00,0x22,0x02,0x37,0xff,0xdb,0x00,0x24,0x00,0x0d,0xff,0x7f,0x00,0x24,0x00,0x0f,0x00,0x44,0x00,0x24,0x00,0x1e,0x00,0x44,0x00,0x24,0x00,0x26,0xff,0xe5,0x00,0x24,0x00,0x2a,0xff,0xe5,0x00,0x24,0x00,0x2d,0x00,0x5e,0x00,0x24,0x00,0x32,0xff,0xe5,0x00,0x24,0x00,0x37,0xff,0x6d,0x00,0x24,0x00,0x38,0xff,0xe5, -0x00,0x24,0x00,0x39,0xff,0x8b,0x00,0x24,0x00,0x3a,0xff,0xb6,0x00,0x24,0x00,0x3c,0xff,0x64,0x00,0x24,0x00,0x3d,0x00,0x3b,0x00,0x24,0x00,0x57,0xff,0xe5,0x00,0x24,0x00,0x59,0xff,0xd5,0x00,0x24,0x00,0x5a,0xff,0xe5,0x00,0x24,0x00,0x5c,0xff,0xdb,0x00,0x24,0x00,0x8d,0xff,0x9a,0x00,0x24,0x00,0xb4,0xff,0x66,0x00,0x24,0x00,0xb5, -0xff,0x3f,0x00,0x24,0x00,0xb6,0xff,0x66,0x00,0x24,0x00,0xb7,0xff,0x3f,0x00,0x24,0x00,0xba,0xff,0xc1,0x00,0x24,0x00,0xbb,0xff,0x64,0x00,0x24,0x00,0xe5,0x00,0x3b,0x00,0x24,0x00,0xea,0xff,0x64,0x00,0x24,0x00,0xeb,0xff,0xdb,0x00,0x24,0x00,0xf7,0xff,0xe5,0x00,0x24,0x00,0xfc,0xff,0xe5,0x00,0x24,0x00,0xfe,0xff,0xe5,0x00,0x24, -0x01,0x18,0xff,0xe5,0x00,0x24,0x01,0x20,0xff,0x6d,0x00,0x24,0x01,0x21,0xff,0xe5,0x00,0x24,0x01,0x22,0xff,0x6d,0x00,0x24,0x01,0x23,0xff,0xe5,0x00,0x24,0x01,0x24,0xff,0xe5,0x00,0x24,0x01,0x26,0xff,0xe5,0x00,0x24,0x01,0x28,0x00,0x3b,0x00,0x24,0x01,0x2a,0x00,0x3b,0x00,0x24,0x01,0x47,0xff,0xe5,0x00,0x24,0x01,0x51,0xff,0xe5, -0x00,0x24,0x01,0x53,0xff,0xe5,0x00,0x24,0x01,0x55,0xff,0xe5,0x00,0x24,0x01,0x63,0x00,0x5e,0x00,0x24,0x01,0x6e,0xff,0xe5,0x00,0x24,0x01,0x70,0xff,0xe5,0x00,0x24,0x01,0x76,0xff,0x6d,0x00,0x24,0x01,0x77,0xff,0xe5,0x00,0x24,0x01,0x78,0xff,0xe5,0x00,0x24,0x01,0x7a,0xff,0xe5,0x00,0x24,0x01,0x7c,0xff,0xe5,0x00,0x24,0x01,0x7e, -0xff,0xe5,0x00,0x24,0x01,0x80,0xff,0xb6,0x00,0x24,0x01,0x81,0xff,0xe5,0x00,0x24,0x01,0x82,0xff,0x64,0x00,0x24,0x01,0x83,0xff,0xdb,0x00,0x24,0x01,0x89,0xff,0xe5,0x00,0x24,0x01,0x8c,0xff,0xb6,0x00,0x24,0x01,0x8d,0xff,0xe5,0x00,0x24,0x01,0x8e,0xff,0xb6,0x00,0x24,0x01,0x8f,0xff,0xe5,0x00,0x24,0x01,0x90,0xff,0xb6,0x00,0x24, -0x01,0x91,0xff,0xe5,0x00,0x24,0x01,0x92,0xff,0x64,0x00,0x24,0x01,0x93,0xff,0xdb,0x00,0x25,0x00,0x37,0xff,0xa4,0x00,0x25,0x00,0x3c,0xff,0xbe,0x00,0x25,0x00,0xbb,0xff,0xbe,0x00,0x25,0x00,0xc4,0xff,0xb2,0x00,0x25,0x00,0xc5,0xff,0xb2,0x00,0x25,0x00,0xea,0xff,0xbe,0x00,0x25,0x01,0x20,0xff,0xa4,0x00,0x25,0x01,0x22,0xff,0xa4, -0x00,0x25,0x01,0x76,0xff,0xa4,0x00,0x25,0x01,0x82,0xff,0xbe,0x00,0x25,0x01,0x92,0xff,0xbe,0x00,0x26,0x00,0x22,0x00,0x02,0x00,0x26,0x00,0x26,0xff,0xc9,0x00,0x26,0x00,0x2a,0xff,0xc9,0x00,0x26,0x00,0x32,0xff,0xe5,0x00,0x26,0x00,0x34,0xff,0xc9,0x00,0x26,0x00,0x64,0xff,0xc9,0x00,0x26,0x00,0x67,0xff,0xc9,0x00,0x26,0x00,0x77, -0x00,0x1d,0x00,0x26,0x00,0x92,0xff,0xc9,0x00,0x26,0x00,0xaa,0xff,0xcf,0x00,0x26,0x00,0xaf,0xff,0xc9,0x00,0x26,0x00,0xb0,0xff,0xc9,0x00,0x26,0x00,0xbe,0xff,0xcf,0x00,0x26,0x00,0xd0,0xff,0xc9,0x00,0x26,0x00,0xd1,0xff,0xc9,0x00,0x26,0x00,0xd2,0xff,0xc9,0x00,0x26,0x00,0xf7,0xff,0xc9,0x00,0x26,0x00,0xfc,0xff,0xc9,0x00,0x26, -0x00,0xfe,0xff,0xc9,0x00,0x26,0x01,0x18,0xff,0xe5,0x00,0x26,0x01,0x47,0xff,0xc9,0x00,0x26,0x01,0x51,0xff,0xc9,0x00,0x26,0x01,0x53,0xff,0xc9,0x00,0x26,0x01,0x55,0xff,0xc9,0x00,0x26,0x01,0x5c,0x00,0x1d,0x00,0x26,0x01,0x5e,0x00,0x1d,0x00,0x26,0x01,0x60,0x00,0x1d,0x00,0x26,0x01,0x6e,0xff,0xe5,0x00,0x26,0x01,0x70,0xff,0xe5, -0x00,0x26,0x01,0x89,0xff,0xe5,0x00,0x27,0x00,0x0f,0xff,0x7f,0x00,0x27,0x00,0x11,0xff,0x7f,0x00,0x27,0x00,0x24,0xff,0xdf,0x00,0x27,0x00,0x37,0xff,0xa4,0x00,0x27,0x00,0x3b,0xff,0xcb,0x00,0x27,0x00,0x3d,0xff,0xcf,0x00,0x27,0x00,0x62,0xff,0xdf,0x00,0x27,0x00,0x63,0xff,0xdf,0x00,0x27,0x00,0x91,0xff,0xb6,0x00,0x27,0x00,0xac, -0xff,0x7f,0x00,0x27,0x00,0xad,0xff,0xdf,0x00,0x27,0x00,0xae,0xff,0xdf,0x00,0x27,0x00,0xbb,0xff,0xf6,0x00,0x27,0x00,0xc4,0xff,0x8b,0x00,0x27,0x00,0xc5,0xff,0x8b,0x00,0x27,0x00,0xc7,0xff,0xdf,0x00,0x27,0x00,0xc9,0xff,0xdf,0x00,0x27,0x00,0xe5,0xff,0xcf,0x00,0x27,0x01,0x03,0xff,0xdf,0x00,0x27,0x01,0x05,0xff,0xdf,0x00,0x27, -0x01,0x20,0xff,0xa4,0x00,0x27,0x01,0x22,0xff,0xa4,0x00,0x27,0x01,0x28,0xff,0xcf,0x00,0x27,0x01,0x2a,0xff,0xcf,0x00,0x27,0x01,0x45,0xff,0xdf,0x00,0x27,0x01,0x76,0xff,0xa4,0x00,0x27,0x01,0x85,0xff,0xdf,0x00,0x27,0x01,0x87,0xff,0xdf,0x00,0x28,0x00,0x24,0x00,0x0a,0x00,0x28,0x00,0x2d,0x00,0x44,0x00,0x28,0x00,0x37,0x00,0x04, -0x00,0x28,0x00,0x3a,0x00,0x1d,0x00,0x28,0x00,0x3b,0x00,0x08,0x00,0x28,0x00,0x62,0x00,0x0a,0x00,0x28,0x00,0x63,0x00,0x0a,0x00,0x28,0x00,0x77,0x00,0x12,0x00,0x28,0x00,0xad,0x00,0x0a,0x00,0x28,0x00,0xae,0x00,0x0a,0x00,0x28,0x00,0xc7,0x00,0x0a,0x00,0x28,0x00,0xc9,0x00,0x0a,0x00,0x28,0x01,0x03,0x00,0x0a,0x00,0x28,0x01,0x05, -0x00,0x0a,0x00,0x28,0x01,0x20,0x00,0x04,0x00,0x28,0x01,0x22,0x00,0x04,0x00,0x28,0x01,0x45,0x00,0x0a,0x00,0x28,0x01,0x5c,0x00,0x12,0x00,0x28,0x01,0x5e,0x00,0x12,0x00,0x28,0x01,0x60,0x00,0x12,0x00,0x28,0x01,0x63,0x00,0x44,0x00,0x28,0x01,0x76,0x00,0x04,0x00,0x28,0x01,0x80,0x00,0x1d,0x00,0x28,0x01,0x85,0x00,0x0a,0x00,0x28, -0x01,0x87,0x00,0x0a,0x00,0x28,0x01,0x8c,0x00,0x1d,0x00,0x28,0x01,0x8e,0x00,0x1d,0x00,0x28,0x01,0x90,0x00,0x1d,0x00,0x29,0x00,0x0f,0xff,0x66,0x00,0x29,0x00,0x11,0xff,0x66,0x00,0x29,0x00,0x24,0xff,0x7b,0x00,0x29,0x00,0x2d,0xff,0xbe,0x00,0x29,0x00,0x36,0xff,0xe5,0x00,0x29,0x00,0x37,0x00,0x0e,0x00,0x29,0x00,0x44,0xff,0xb4, -0x00,0x29,0x00,0x49,0x00,0x0a,0x00,0x29,0x00,0x62,0xff,0x7b,0x00,0x29,0x00,0x63,0xff,0x7b,0x00,0x29,0x00,0x77,0x00,0x27,0x00,0x29,0x00,0x91,0xff,0x4c,0x00,0x29,0x00,0xac,0xff,0x66,0x00,0x29,0x00,0xad,0xff,0x7b,0x00,0x29,0x00,0xae,0xff,0x7b,0x00,0x29,0x00,0xc4,0xff,0x4a,0x00,0x29,0x00,0xc5,0xff,0x4a,0x00,0x29,0x00,0xc7, -0xff,0x7b,0x00,0x29,0x00,0xc9,0xff,0x7b,0x00,0x29,0x00,0xe3,0xff,0xe5,0x00,0x29,0x00,0xfa,0xff,0xe5,0x00,0x29,0x01,0x03,0xff,0x7b,0x00,0x29,0x01,0x05,0xff,0x7b,0x00,0x29,0x01,0x06,0xff,0xb4,0x00,0x29,0x01,0x1e,0xff,0xe5,0x00,0x29,0x01,0x20,0x00,0x0e,0x00,0x29,0x01,0x22,0x00,0x0e,0x00,0x29,0x01,0x45,0xff,0x7b,0x00,0x29, -0x01,0x5c,0x00,0x27,0x00,0x29,0x01,0x5e,0x00,0x27,0x00,0x29,0x01,0x60,0x00,0x27,0x00,0x29,0x01,0x63,0xff,0xbe,0x00,0x29,0x01,0x74,0xff,0xe5,0x00,0x29,0x01,0x76,0x00,0x0e,0x00,0x29,0x01,0x85,0xff,0x7b,0x00,0x29,0x01,0x87,0xff,0x7b,0x00,0x29,0x01,0x88,0xff,0xb4,0x00,0x29,0x02,0x3d,0xff,0xe5,0x00,0x2a,0x00,0x37,0xff,0xcf, -0x00,0x2a,0x00,0x39,0xff,0xe5,0x00,0x2a,0x00,0x5c,0xff,0xe5,0x00,0x2a,0x00,0xba,0xff,0xe5,0x00,0x2a,0x00,0xeb,0xff,0xe5,0x00,0x2a,0x01,0x20,0xff,0xcf,0x00,0x2a,0x01,0x22,0xff,0xcf,0x00,0x2a,0x01,0x76,0xff,0xcf,0x00,0x2a,0x01,0x83,0xff,0xe5,0x00,0x2a,0x01,0x93,0xff,0xe5,0x00,0x2d,0x00,0x0f,0xff,0x9a,0x00,0x2d,0x00,0x11, -0xff,0x9a,0x00,0x2d,0x00,0x24,0xff,0xdb,0x00,0x2d,0x00,0x2d,0xff,0xbe,0x00,0x2d,0x00,0x44,0xff,0xe5,0x00,0x2d,0x00,0x62,0xff,0xdb,0x00,0x2d,0x00,0x63,0xff,0xdb,0x00,0x2d,0x00,0x69,0xff,0xe5,0x00,0x2d,0x00,0x6a,0xff,0xe5,0x00,0x2d,0x00,0x6b,0xff,0xe5,0x00,0x2d,0x00,0x6c,0xff,0xe5,0x00,0x2d,0x00,0x6d,0xff,0xe5,0x00,0x2d, -0x00,0x6e,0xff,0xe5,0x00,0x2d,0x00,0x91,0xff,0x98,0x00,0x2d,0x00,0xa0,0xff,0xe5,0x00,0x2d,0x00,0xac,0xff,0x9a,0x00,0x2d,0x00,0xad,0xff,0xdb,0x00,0x2d,0x00,0xae,0xff,0xdb,0x00,0x2d,0x00,0xc4,0xff,0x66,0x00,0x2d,0x00,0xc5,0xff,0x9a,0x00,0x2d,0x00,0xc7,0xff,0xdb,0x00,0x2d,0x00,0xc9,0xff,0xdb,0x00,0x2d,0x01,0x03,0xff,0xdb, -0x00,0x2d,0x01,0x04,0xff,0xe5,0x00,0x2d,0x01,0x05,0xff,0xdb,0x00,0x2d,0x01,0x06,0xff,0xe5,0x00,0x2d,0x01,0x45,0xff,0xdb,0x00,0x2d,0x01,0x46,0xff,0xe5,0x00,0x2d,0x01,0x63,0xff,0xbe,0x00,0x2d,0x01,0x85,0xff,0xdb,0x00,0x2d,0x01,0x86,0xff,0xe5,0x00,0x2d,0x01,0x87,0xff,0xdb,0x00,0x2d,0x01,0x88,0xff,0xe5,0x00,0x2e,0x00,0x0f, -0x00,0x27,0x00,0x2e,0x00,0x1e,0x00,0x27,0x00,0x2e,0x00,0x26,0xff,0xa6,0x00,0x2e,0x00,0x2a,0xff,0xa6,0x00,0x2e,0x00,0x2d,0x00,0x5a,0x00,0x2e,0x00,0x32,0xff,0xa6,0x00,0x2e,0x00,0x34,0xff,0xa6,0x00,0x2e,0x00,0x3b,0x00,0x25,0x00,0x2e,0x00,0x3d,0x00,0x27,0x00,0x2e,0x00,0x46,0xff,0xe5,0x00,0x2e,0x00,0x47,0xff,0xe5,0x00,0x2e, -0x00,0x48,0xff,0xe5,0x00,0x2e,0x00,0x4a,0xff,0xe5,0x00,0x2e,0x00,0x52,0xff,0xe5,0x00,0x2e,0x00,0x54,0xff,0xe5,0x00,0x2e,0x00,0x57,0xff,0xd1,0x00,0x2e,0x00,0x59,0xff,0xb6,0x00,0x2e,0x00,0x5a,0xff,0xcb,0x00,0x2e,0x00,0x5c,0xff,0xa4,0x00,0x2e,0x00,0x64,0xff,0x9a,0x00,0x2e,0x00,0x67,0xff,0xa6,0x00,0x2e,0x00,0x6f,0xff,0xe5, -0x00,0x2e,0x00,0x70,0xff,0xe5,0x00,0x2e,0x00,0x71,0xff,0xe5,0x00,0x2e,0x00,0x72,0xff,0xe5,0x00,0x2e,0x00,0x73,0xff,0xe5,0x00,0x2e,0x00,0x74,0xff,0xcf,0x00,0x2e,0x00,0x77,0x00,0x27,0x00,0x2e,0x00,0x79,0xff,0xe5,0x00,0x2e,0x00,0x7a,0xff,0xe5,0x00,0x2e,0x00,0x7b,0xff,0xe5,0x00,0x2e,0x00,0x7c,0xff,0xe5,0x00,0x2e,0x00,0x7d, -0xff,0xe5,0x00,0x2e,0x00,0x92,0xff,0xa6,0x00,0x2e,0x00,0xaf,0xff,0xa6,0x00,0x2e,0x00,0xb0,0xff,0xa6,0x00,0x2e,0x00,0xb1,0xff,0xe5,0x00,0x2e,0x00,0xba,0xff,0xa4,0x00,0x2e,0x00,0xc4,0x00,0x44,0x00,0x2e,0x00,0xc5,0x00,0x44,0x00,0x2e,0x00,0xd0,0xff,0xa6,0x00,0x2e,0x00,0xd1,0xff,0xa6,0x00,0x2e,0x00,0xd2,0xff,0xa6,0x00,0x2e, -0x00,0xe5,0x00,0x27,0x00,0x2e,0x00,0xeb,0xff,0xa4,0x00,0x2e,0x00,0xf7,0xff,0xa6,0x00,0x2e,0x00,0xf8,0xff,0xe5,0x00,0x2e,0x00,0xfc,0xff,0xa6,0x00,0x2e,0x00,0xfd,0xff,0xe5,0x00,0x2e,0x00,0xfe,0xff,0xa6,0x00,0x2e,0x00,0xff,0xff,0xe5,0x00,0x2e,0x01,0x00,0xff,0xe5,0x00,0x2e,0x01,0x08,0xff,0xe5,0x00,0x2e,0x01,0x0b,0xff,0xe5, -0x00,0x2e,0x01,0x0d,0xff,0xe5,0x00,0x2e,0x01,0x18,0xff,0xa6,0x00,0x2e,0x01,0x19,0xff,0xe5,0x00,0x2e,0x01,0x21,0xff,0xd1,0x00,0x2e,0x01,0x23,0xff,0xd1,0x00,0x2e,0x01,0x28,0x00,0x27,0x00,0x2e,0x01,0x2a,0x00,0x27,0x00,0x2e,0x01,0x47,0xff,0xa6,0x00,0x2e,0x01,0x48,0xff,0xe5,0x00,0x2e,0x01,0x4c,0xff,0xe5,0x00,0x2e,0x01,0x4e, -0xff,0xe5,0x00,0x2e,0x01,0x50,0xff,0xe5,0x00,0x2e,0x01,0x51,0xff,0xa6,0x00,0x2e,0x01,0x52,0xff,0xe5,0x00,0x2e,0x01,0x53,0xff,0xa6,0x00,0x2e,0x01,0x54,0xff,0xe5,0x00,0x2e,0x01,0x55,0xff,0xa6,0x00,0x2e,0x01,0x56,0xff,0xe5,0x00,0x2e,0x01,0x5c,0x00,0x27,0x00,0x2e,0x01,0x5e,0x00,0x27,0x00,0x2e,0x01,0x60,0x00,0x27,0x00,0x2e, -0x01,0x63,0x00,0x5a,0x00,0x2e,0x01,0x6e,0xff,0xa6,0x00,0x2e,0x01,0x6f,0xff,0xe5,0x00,0x2e,0x01,0x70,0xff,0xa6,0x00,0x2e,0x01,0x71,0xff,0xe5,0x00,0x2e,0x01,0x77,0xff,0xd1,0x00,0x2e,0x01,0x81,0xff,0xcb,0x00,0x2e,0x01,0x83,0xff,0xa4,0x00,0x2e,0x01,0x89,0xff,0xa6,0x00,0x2e,0x01,0x8a,0xff,0xe5,0x00,0x2e,0x01,0x8d,0xff,0xcb, -0x00,0x2e,0x01,0x8f,0xff,0xcb,0x00,0x2e,0x01,0x91,0xff,0xcb,0x00,0x2e,0x01,0x93,0xff,0xa4,0x00,0x2f,0x00,0x0d,0xff,0x31,0x00,0x2f,0x00,0x22,0xff,0x9a,0x00,0x2f,0x00,0x24,0x00,0x3b,0x00,0x2f,0x00,0x26,0xff,0xbe,0x00,0x2f,0x00,0x2a,0xff,0xbe,0x00,0x2f,0x00,0x2d,0x00,0x64,0x00,0x2f,0x00,0x32,0xff,0xba,0x00,0x2f,0x00,0x34, -0xff,0xba,0x00,0x2f,0x00,0x37,0xff,0x8f,0x00,0x2f,0x00,0x38,0xff,0xe3,0x00,0x2f,0x00,0x39,0xff,0x8b,0x00,0x2f,0x00,0x3a,0xff,0xcf,0x00,0x2f,0x00,0x3c,0xff,0x7f,0x00,0x2f,0x00,0x3d,0x00,0x3b,0x00,0x2f,0x00,0x57,0xff,0xe5,0x00,0x2f,0x00,0x59,0xff,0x9a,0x00,0x2f,0x00,0x5a,0xff,0xbe,0x00,0x2f,0x00,0x5c,0xff,0xb4,0x00,0x2f, -0x00,0x64,0xff,0xbe,0x00,0x2f,0x00,0x67,0xff,0xba,0x00,0x2f,0x00,0x68,0xff,0xe3,0x00,0x2f,0x00,0x8d,0xff,0x9a,0x00,0x2f,0x00,0x92,0xff,0xba,0x00,0x2f,0x00,0xaf,0xff,0xba,0x00,0x2f,0x00,0xb0,0xff,0xba,0x00,0x2f,0x00,0xb4,0xff,0x73,0x00,0x2f,0x00,0xb5,0xff,0x8b,0x00,0x2f,0x00,0xb6,0xff,0x73,0x00,0x2f,0x00,0xb7,0xff,0x7f, -0x00,0x2f,0x00,0xba,0xff,0xb4,0x00,0x2f,0x00,0xbb,0xff,0x9a,0x00,0x2f,0x00,0xc4,0x00,0x44,0x00,0x2f,0x00,0xc5,0x00,0x44,0x00,0x2f,0x00,0xd0,0xff,0xba,0x00,0x2f,0x00,0xd1,0xff,0xba,0x00,0x2f,0x00,0xd2,0xff,0xba,0x00,0x2f,0x00,0xd3,0xff,0xe3,0x00,0x2f,0x00,0xd4,0xff,0xe3,0x00,0x2f,0x00,0xd5,0xff,0xe3,0x00,0x2f,0x00,0xe5, -0x00,0x3b,0x00,0x2f,0x00,0xea,0xff,0x7f,0x00,0x2f,0x00,0xeb,0xff,0xb4,0x00,0x2f,0x00,0xf7,0xff,0xbe,0x00,0x2f,0x00,0xfc,0xff,0xbe,0x00,0x2f,0x00,0xfe,0xff,0xbe,0x00,0x2f,0x01,0x03,0x00,0x3b,0x00,0x2f,0x01,0x05,0x00,0x3b,0x00,0x2f,0x01,0x18,0xff,0xba,0x00,0x2f,0x01,0x20,0xff,0x8f,0x00,0x2f,0x01,0x21,0xff,0xe5,0x00,0x2f, -0x01,0x22,0xff,0x8f,0x00,0x2f,0x01,0x23,0xff,0xe5,0x00,0x2f,0x01,0x24,0xff,0xe3,0x00,0x2f,0x01,0x26,0xff,0xe3,0x00,0x2f,0x01,0x28,0x00,0x3b,0x00,0x2f,0x01,0x2a,0x00,0x3b,0x00,0x2f,0x01,0x45,0x00,0x3b,0x00,0x2f,0x01,0x47,0xff,0xbe,0x00,0x2f,0x01,0x51,0xff,0xbe,0x00,0x2f,0x01,0x53,0xff,0xbe,0x00,0x2f,0x01,0x55,0xff,0xbe, -0x00,0x2f,0x01,0x63,0x00,0x64,0x00,0x2f,0x01,0x6e,0xff,0xba,0x00,0x2f,0x01,0x70,0xff,0xba,0x00,0x2f,0x01,0x76,0xff,0x8f,0x00,0x2f,0x01,0x77,0xff,0xe5,0x00,0x2f,0x01,0x78,0xff,0xe3,0x00,0x2f,0x01,0x7a,0xff,0xe3,0x00,0x2f,0x01,0x7c,0xff,0xe3,0x00,0x2f,0x01,0x7e,0xff,0xe3,0x00,0x2f,0x01,0x80,0xff,0xcf,0x00,0x2f,0x01,0x81, -0xff,0xbe,0x00,0x2f,0x01,0x82,0xff,0x7f,0x00,0x2f,0x01,0x83,0xff,0xb4,0x00,0x2f,0x01,0x85,0x00,0x3b,0x00,0x2f,0x01,0x87,0x00,0x3b,0x00,0x2f,0x01,0x89,0xff,0xba,0x00,0x2f,0x01,0x8c,0xff,0xcf,0x00,0x2f,0x01,0x8d,0xff,0xbe,0x00,0x2f,0x01,0x8e,0xff,0xcf,0x00,0x2f,0x01,0x8f,0xff,0xbe,0x00,0x2f,0x01,0x90,0xff,0xcf,0x00,0x2f, -0x01,0x91,0xff,0xbe,0x00,0x2f,0x01,0x92,0xff,0x7f,0x00,0x2f,0x01,0x93,0xff,0xb4,0x00,0x32,0x00,0x0f,0xff,0xa4,0x00,0x32,0x00,0x11,0xff,0xa4,0x00,0x32,0x00,0x24,0xff,0xe5,0x00,0x32,0x00,0x2d,0xff,0xf6,0x00,0x32,0x00,0x37,0xff,0xa4,0x00,0x32,0x00,0x3b,0xff,0xdb,0x00,0x32,0x00,0x3c,0xff,0xe7,0x00,0x32,0x00,0x3d,0xff,0xcf, -0x00,0x32,0x00,0x62,0xff,0xe5,0x00,0x32,0x00,0x63,0xff,0xe5,0x00,0x32,0x00,0xac,0xff,0xa4,0x00,0x32,0x00,0xad,0xff,0xe5,0x00,0x32,0x00,0xae,0xff,0xe5,0x00,0x32,0x00,0xbb,0xff,0xf6,0x00,0x32,0x00,0xc4,0xff,0x4c,0x00,0x32,0x00,0xc5,0xff,0x98,0x00,0x32,0x00,0xc7,0xff,0xe5,0x00,0x32,0x00,0xc9,0xff,0xe5,0x00,0x32,0x00,0xe5, -0xff,0xcf,0x00,0x32,0x00,0xea,0xff,0xe7,0x00,0x32,0x01,0x03,0xff,0xe5,0x00,0x32,0x01,0x05,0xff,0xe5,0x00,0x32,0x01,0x20,0xff,0xa4,0x00,0x32,0x01,0x22,0xff,0xa4,0x00,0x32,0x01,0x28,0xff,0xcf,0x00,0x32,0x01,0x2a,0xff,0xcf,0x00,0x32,0x01,0x45,0xff,0xe5,0x00,0x32,0x01,0x63,0xff,0xf6,0x00,0x32,0x01,0x76,0xff,0xa4,0x00,0x32, -0x01,0x82,0xff,0xe7,0x00,0x32,0x01,0x85,0xff,0xe5,0x00,0x32,0x01,0x87,0xff,0xe5,0x00,0x32,0x01,0x92,0xff,0xe7,0x00,0x33,0x00,0x0f,0xfe,0xba,0x00,0x33,0x00,0x11,0xfe,0xba,0x00,0x33,0x00,0x24,0xff,0x62,0x00,0x33,0x00,0x2a,0xff,0xf6,0x00,0x33,0x00,0x2d,0xff,0x7f,0x00,0x33,0x00,0x3a,0x00,0x27,0x00,0x33,0x00,0x3b,0xff,0xc3, -0x00,0x33,0x00,0x44,0xff,0xbe,0x00,0x33,0x00,0x46,0xff,0xb4,0x00,0x33,0x00,0x47,0xff,0xb4,0x00,0x33,0x00,0x48,0xff,0xb4,0x00,0x33,0x00,0x4a,0xff,0xb4,0x00,0x33,0x00,0x52,0xff,0xb4,0x00,0x33,0x00,0x54,0xff,0xb6,0x00,0x33,0x00,0x62,0xff,0x62,0x00,0x33,0x00,0x63,0xff,0x62,0x00,0x33,0x00,0x69,0xff,0xbe,0x00,0x33,0x00,0x6a, -0xff,0xbe,0x00,0x33,0x00,0x6b,0xff,0xbe,0x00,0x33,0x00,0x6c,0xff,0xbe,0x00,0x33,0x00,0x6d,0xff,0xbe,0x00,0x33,0x00,0x6e,0xff,0xbe,0x00,0x33,0x00,0x6f,0xff,0xb4,0x00,0x33,0x00,0x70,0xff,0xb4,0x00,0x33,0x00,0x71,0xff,0xb4,0x00,0x33,0x00,0x72,0xff,0xb4,0x00,0x33,0x00,0x73,0xff,0xb4,0x00,0x33,0x00,0x79,0xff,0xb4,0x00,0x33, -0x00,0x7a,0xff,0xb4,0x00,0x33,0x00,0x7b,0xff,0xb4,0x00,0x33,0x00,0x7c,0xff,0xb4,0x00,0x33,0x00,0x7d,0xff,0xb4,0x00,0x33,0x00,0x91,0xfe,0xe9,0x00,0x33,0x00,0xa0,0xff,0xbe,0x00,0x33,0x00,0xac,0xfe,0xba,0x00,0x33,0x00,0xad,0xff,0x62,0x00,0x33,0x00,0xae,0xff,0x62,0x00,0x33,0x00,0xb1,0xff,0xb4,0x00,0x33,0x00,0xc4,0xfe,0xba, -0x00,0x33,0x00,0xc5,0xfe,0xae,0x00,0x33,0x00,0xc7,0xff,0x62,0x00,0x33,0x00,0xc9,0xff,0x62,0x00,0x33,0x00,0xf7,0xff,0xf6,0x00,0x33,0x00,0xf8,0xff,0xb4,0x00,0x33,0x00,0xfd,0xff,0xb4,0x00,0x33,0x00,0xff,0xff,0xb4,0x00,0x33,0x01,0x00,0xff,0xb4,0x00,0x33,0x01,0x03,0xff,0x62,0x00,0x33,0x01,0x04,0xff,0xbe,0x00,0x33,0x01,0x05, -0xff,0x62,0x00,0x33,0x01,0x06,0xff,0xbe,0x00,0x33,0x01,0x08,0xff,0xb4,0x00,0x33,0x01,0x0b,0xff,0xb4,0x00,0x33,0x01,0x0d,0xff,0xb4,0x00,0x33,0x01,0x19,0xff,0xb4,0x00,0x33,0x01,0x45,0xff,0x62,0x00,0x33,0x01,0x46,0xff,0xbe,0x00,0x33,0x01,0x48,0xff,0xb4,0x00,0x33,0x01,0x4c,0xff,0xb4,0x00,0x33,0x01,0x4e,0xff,0xb4,0x00,0x33, -0x01,0x50,0xff,0xb4,0x00,0x33,0x01,0x51,0xff,0xf6,0x00,0x33,0x01,0x52,0xff,0xb4,0x00,0x33,0x01,0x53,0xff,0xf6,0x00,0x33,0x01,0x54,0xff,0xb4,0x00,0x33,0x01,0x55,0xff,0xf6,0x00,0x33,0x01,0x56,0xff,0xb4,0x00,0x33,0x01,0x63,0xff,0x7f,0x00,0x33,0x01,0x6f,0xff,0xb4,0x00,0x33,0x01,0x71,0xff,0xb4,0x00,0x33,0x01,0x80,0x00,0x27, -0x00,0x33,0x01,0x85,0xff,0x62,0x00,0x33,0x01,0x86,0xff,0xbe,0x00,0x33,0x01,0x87,0xff,0x62,0x00,0x33,0x01,0x88,0xff,0xbe,0x00,0x33,0x01,0x8a,0xff,0xb4,0x00,0x33,0x01,0x8c,0x00,0x27,0x00,0x33,0x01,0x8e,0x00,0x27,0x00,0x33,0x01,0x90,0x00,0x27,0x00,0x34,0x00,0x0f,0xff,0xa4,0x00,0x34,0x00,0x11,0xff,0x7f,0x00,0x34,0x00,0x24, -0xff,0xe5,0x00,0x34,0x00,0x37,0xff,0xa4,0x00,0x34,0x00,0x3b,0xff,0xdb,0x00,0x34,0x00,0x3c,0xff,0xf6,0x00,0x34,0x00,0x3d,0xff,0xcf,0x00,0x34,0x00,0x62,0xff,0xe5,0x00,0x34,0x00,0x63,0xff,0xe5,0x00,0x34,0x00,0xac,0xff,0x7f,0x00,0x34,0x00,0xad,0xff,0xe5,0x00,0x34,0x00,0xae,0xff,0xe5,0x00,0x34,0x00,0xbb,0xff,0xf6,0x00,0x34, -0x00,0xc4,0xff,0x98,0x00,0x34,0x00,0xc5,0xff,0x98,0x00,0x34,0x00,0xc7,0xff,0xe5,0x00,0x34,0x00,0xc9,0xff,0xe5,0x00,0x34,0x00,0xe5,0xff,0xcf,0x00,0x34,0x00,0xea,0xff,0xf6,0x00,0x34,0x01,0x03,0xff,0xe5,0x00,0x34,0x01,0x05,0xff,0xe5,0x00,0x34,0x01,0x20,0xff,0xa4,0x00,0x34,0x01,0x22,0xff,0xa4,0x00,0x34,0x01,0x28,0xff,0xcf, -0x00,0x34,0x01,0x2a,0xff,0xcf,0x00,0x34,0x01,0x45,0xff,0xe5,0x00,0x34,0x01,0x76,0xff,0xa4,0x00,0x34,0x01,0x82,0xff,0xf6,0x00,0x34,0x01,0x85,0xff,0xe5,0x00,0x34,0x01,0x87,0xff,0xe5,0x00,0x34,0x01,0x92,0xff,0xf6,0x00,0x35,0x00,0x1e,0x00,0x52,0x00,0x35,0x00,0x26,0xff,0xe3,0x00,0x35,0x00,0x2a,0xff,0xe3,0x00,0x35,0x00,0x2d, -0x00,0x39,0x00,0x35,0x00,0x32,0xff,0xec,0x00,0x35,0x00,0x34,0xff,0xec,0x00,0x35,0x00,0x37,0xff,0xcb,0x00,0x35,0x00,0x3c,0xff,0xd9,0x00,0x35,0x00,0x46,0xff,0xcb,0x00,0x35,0x00,0x47,0xff,0xcb,0x00,0x35,0x00,0x48,0xff,0xc7,0x00,0x35,0x00,0x4a,0xff,0xc7,0x00,0x35,0x00,0x52,0xff,0xc5,0x00,0x35,0x00,0x54,0xff,0xcb,0x00,0x35, -0x00,0x64,0xff,0xe5,0x00,0x35,0x00,0x67,0xff,0xec,0x00,0x35,0x00,0x6f,0xff,0xbe,0x00,0x35,0x00,0x70,0xff,0xbe,0x00,0x35,0x00,0x71,0xff,0xbe,0x00,0x35,0x00,0x72,0xff,0xbe,0x00,0x35,0x00,0x73,0xff,0xbe,0x00,0x35,0x00,0x79,0xff,0xc5,0x00,0x35,0x00,0x7a,0xff,0xc5,0x00,0x35,0x00,0x7b,0xff,0xc5,0x00,0x35,0x00,0x7c,0xff,0xc5, -0x00,0x35,0x00,0x7d,0xff,0xc5,0x00,0x35,0x00,0x92,0xff,0xec,0x00,0x35,0x00,0xaf,0xff,0xec,0x00,0x35,0x00,0xb0,0xff,0xec,0x00,0x35,0x00,0xb1,0xff,0xc5,0x00,0x35,0x00,0xbb,0xff,0xe5,0x00,0x35,0x00,0xd0,0xff,0xec,0x00,0x35,0x00,0xd1,0xff,0xec,0x00,0x35,0x00,0xd2,0xff,0xec,0x00,0x35,0x00,0xea,0xff,0xd9,0x00,0x35,0x00,0xf7, -0xff,0xe3,0x00,0x35,0x00,0xf8,0xff,0xc7,0x00,0x35,0x00,0xfc,0xff,0xe3,0x00,0x35,0x00,0xfd,0xff,0xcb,0x00,0x35,0x00,0xfe,0xff,0xe3,0x00,0x35,0x00,0xff,0xff,0xcb,0x00,0x35,0x01,0x00,0xff,0xcb,0x00,0x35,0x01,0x08,0xff,0xcb,0x00,0x35,0x01,0x0b,0xff,0xc7,0x00,0x35,0x01,0x0d,0xff,0xbe,0x00,0x35,0x01,0x18,0xff,0xec,0x00,0x35, -0x01,0x19,0xff,0xc5,0x00,0x35,0x01,0x20,0xff,0xcb,0x00,0x35,0x01,0x22,0xff,0xcb,0x00,0x35,0x01,0x47,0xff,0xe3,0x00,0x35,0x01,0x48,0xff,0xcb,0x00,0x35,0x01,0x4c,0xff,0xbe,0x00,0x35,0x01,0x4e,0xff,0xbe,0x00,0x35,0x01,0x50,0xff,0xbe,0x00,0x35,0x01,0x51,0xff,0xe3,0x00,0x35,0x01,0x52,0xff,0xc7,0x00,0x35,0x01,0x53,0xff,0xe3, -0x00,0x35,0x01,0x54,0xff,0xc7,0x00,0x35,0x01,0x55,0xff,0xe3,0x00,0x35,0x01,0x56,0xff,0xc7,0x00,0x35,0x01,0x63,0x00,0x39,0x00,0x35,0x01,0x6e,0xff,0xec,0x00,0x35,0x01,0x6f,0xff,0xc5,0x00,0x35,0x01,0x70,0xff,0xec,0x00,0x35,0x01,0x71,0xff,0xc5,0x00,0x35,0x01,0x76,0xff,0xcb,0x00,0x35,0x01,0x82,0xff,0xd9,0x00,0x35,0x01,0x89, -0xff,0xec,0x00,0x35,0x01,0x8a,0xff,0xc5,0x00,0x35,0x01,0x92,0xff,0xd9,0x00,0x36,0x00,0x57,0xff,0xbe,0x00,0x36,0x00,0x59,0xff,0xcf,0x00,0x36,0x00,0x5a,0xff,0xe5,0x00,0x36,0x00,0x5c,0xff,0xd1,0x00,0x36,0x00,0xba,0xff,0xbe,0x00,0x36,0x00,0xc4,0xff,0xb2,0x00,0x36,0x00,0xc5,0xff,0xb2,0x00,0x36,0x00,0xeb,0xff,0xd1,0x00,0x36, -0x01,0x21,0xff,0xbe,0x00,0x36,0x01,0x23,0xff,0xbe,0x00,0x36,0x01,0x77,0xff,0xbe,0x00,0x36,0x01,0x81,0xff,0xe5,0x00,0x36,0x01,0x83,0xff,0xd1,0x00,0x36,0x01,0x8d,0xff,0xe5,0x00,0x36,0x01,0x8f,0xff,0xe5,0x00,0x36,0x01,0x91,0xff,0xe5,0x00,0x36,0x01,0x93,0xff,0xd1,0x00,0x37,0x00,0x0f,0xff,0x7f,0x00,0x37,0x00,0x11,0xff,0x4c, -0x00,0x37,0x00,0x1d,0xff,0xe9,0x00,0x37,0x00,0x1e,0xff,0xe9,0x00,0x37,0x00,0x24,0xff,0x66,0x00,0x37,0x00,0x26,0xff,0xa4,0x00,0x37,0x00,0x2a,0xff,0xa4,0x00,0x37,0x00,0x2d,0xff,0x8f,0x00,0x37,0x00,0x32,0xff,0xa4,0x00,0x37,0x00,0x34,0xff,0xa4,0x00,0x37,0x00,0x37,0x00,0x27,0x00,0x37,0x00,0x39,0x00,0x2b,0x00,0x37,0x00,0x3a, -0x00,0x27,0x00,0x37,0x00,0x3b,0xff,0xfa,0x00,0x37,0x00,0x3c,0x00,0x1d,0x00,0x37,0x00,0x44,0xff,0x27,0x00,0x37,0x00,0x46,0xff,0x2d,0x00,0x37,0x00,0x47,0xff,0x2d,0x00,0x37,0x00,0x48,0xff,0x2d,0x00,0x37,0x00,0x49,0xff,0xa0,0x00,0x37,0x00,0x4a,0xff,0x2d,0x00,0x37,0x00,0x50,0xff,0x4e,0x00,0x37,0x00,0x51,0xff,0x4e,0x00,0x37, -0x00,0x52,0xff,0x2d,0x00,0x37,0x00,0x53,0xff,0x4e,0x00,0x37,0x00,0x54,0xff,0x2d,0x00,0x37,0x00,0x55,0xff,0x4e,0x00,0x37,0x00,0x56,0xff,0x66,0x00,0x37,0x00,0x58,0xff,0x4e,0x00,0x37,0x00,0x59,0xff,0x9a,0x00,0x37,0x00,0x5a,0xff,0x8f,0x00,0x37,0x00,0x5b,0xff,0x4c,0x00,0x37,0x00,0x5c,0xff,0x8f,0x00,0x37,0x00,0x5d,0xff,0x7f, -0x00,0x37,0x00,0x62,0xff,0x66,0x00,0x37,0x00,0x63,0xff,0x66,0x00,0x37,0x00,0x64,0xff,0xa4,0x00,0x37,0x00,0x67,0xff,0xa4,0x00,0x37,0x00,0x69,0xff,0x27,0x00,0x37,0x00,0x6a,0xff,0x27,0x00,0x37,0x00,0x6b,0xff,0x27,0x00,0x37,0x00,0x6c,0xff,0x27,0x00,0x37,0x00,0x6d,0xff,0x3f,0x00,0x37,0x00,0x6e,0xff,0x27,0x00,0x37,0x00,0x6f, -0xff,0x1b,0x00,0x37,0x00,0x70,0xff,0x2d,0x00,0x37,0x00,0x71,0xff,0x2d,0x00,0x37,0x00,0x72,0xff,0x2d,0x00,0x37,0x00,0x73,0xff,0x2d,0x00,0x37,0x00,0x74,0xff,0xe9,0x00,0x37,0x00,0x76,0x00,0x31,0x00,0x37,0x00,0x77,0x00,0x6f,0x00,0x37,0x00,0x78,0xff,0x4e,0x00,0x37,0x00,0x79,0xff,0x2d,0x00,0x37,0x00,0x7a,0xff,0x2d,0x00,0x37, -0x00,0x7b,0xff,0x2d,0x00,0x37,0x00,0x7c,0xff,0x2d,0x00,0x37,0x00,0x7d,0xff,0x2d,0x00,0x37,0x00,0x7e,0xff,0x4e,0x00,0x37,0x00,0x7f,0xff,0x4e,0x00,0x37,0x00,0x80,0xff,0x4e,0x00,0x37,0x00,0x81,0xff,0x4e,0x00,0x37,0x00,0x8d,0x00,0x52,0x00,0x37,0x00,0x91,0xff,0x0c,0x00,0x37,0x00,0x92,0xff,0xa4,0x00,0x37,0x00,0xa0,0xff,0x27, -0x00,0x37,0x00,0xaa,0xff,0x9a,0x00,0x37,0x00,0xab,0xff,0xcf,0x00,0x37,0x00,0xac,0xff,0x4c,0x00,0x37,0x00,0xad,0xff,0x66,0x00,0x37,0x00,0xae,0xff,0x66,0x00,0x37,0x00,0xaf,0xff,0xa4,0x00,0x37,0x00,0xb0,0xff,0xa4,0x00,0x37,0x00,0xb1,0xff,0x2d,0x00,0x37,0x00,0xb5,0x00,0x27,0x00,0x37,0x00,0xb7,0x00,0x27,0x00,0x37,0x00,0xba, -0xff,0x8f,0x00,0x37,0x00,0xbe,0xff,0x9a,0x00,0x37,0x00,0xbf,0xff,0xcf,0x00,0x37,0x00,0xc4,0xff,0x17,0x00,0x37,0x00,0xc5,0xff,0x17,0x00,0x37,0x00,0xc7,0xff,0x66,0x00,0x37,0x00,0xc9,0xff,0x66,0x00,0x37,0x00,0xd0,0xff,0xa4,0x00,0x37,0x00,0xd1,0xff,0xa4,0x00,0x37,0x00,0xd2,0xff,0xa4,0x00,0x37,0x00,0xe4,0xff,0x66,0x00,0x37, -0x00,0xe6,0xff,0x7f,0x00,0x37,0x00,0xea,0x00,0x1d,0x00,0x37,0x00,0xeb,0xff,0x8f,0x00,0x37,0x00,0xf7,0xff,0xa4,0x00,0x37,0x00,0xf8,0xff,0x2d,0x00,0x37,0x00,0xfb,0xff,0x66,0x00,0x37,0x00,0xfc,0xff,0xa4,0x00,0x37,0x00,0xfd,0xff,0x2d,0x00,0x37,0x00,0xfe,0xff,0xa4,0x00,0x37,0x00,0xff,0xff,0x2d,0x00,0x37,0x01,0x00,0xff,0x2d, -0x00,0x37,0x01,0x03,0xff,0x66,0x00,0x37,0x01,0x04,0xff,0x27,0x00,0x37,0x01,0x05,0xff,0x66,0x00,0x37,0x01,0x06,0xff,0x27,0x00,0x37,0x01,0x08,0xff,0x2d,0x00,0x37,0x01,0x0b,0xff,0x2d,0x00,0x37,0x01,0x0d,0xff,0x2d,0x00,0x37,0x01,0x15,0xff,0x4e,0x00,0x37,0x01,0x17,0xff,0x4e,0x00,0x37,0x01,0x18,0xff,0xa4,0x00,0x37,0x01,0x19, -0xff,0x2d,0x00,0x37,0x01,0x1b,0xff,0x4e,0x00,0x37,0x01,0x1d,0xff,0x4e,0x00,0x37,0x01,0x1f,0xff,0x66,0x00,0x37,0x01,0x20,0x00,0x27,0x00,0x37,0x01,0x22,0x00,0x27,0x00,0x37,0x01,0x25,0xff,0x4e,0x00,0x37,0x01,0x27,0xff,0x4e,0x00,0x37,0x01,0x29,0xff,0x7f,0x00,0x37,0x01,0x2b,0xff,0x7f,0x00,0x37,0x01,0x45,0xff,0x66,0x00,0x37, -0x01,0x46,0xff,0x27,0x00,0x37,0x01,0x47,0xff,0xa4,0x00,0x37,0x01,0x48,0xff,0x2d,0x00,0x37,0x01,0x4c,0xff,0x2d,0x00,0x37,0x01,0x4e,0xff,0x2d,0x00,0x37,0x01,0x50,0xff,0x2d,0x00,0x37,0x01,0x51,0xff,0xa4,0x00,0x37,0x01,0x52,0xff,0x2d,0x00,0x37,0x01,0x53,0xff,0xa4,0x00,0x37,0x01,0x54,0xff,0x2d,0x00,0x37,0x01,0x55,0xff,0xa4, -0x00,0x37,0x01,0x56,0xff,0x2d,0x00,0x37,0x01,0x5c,0x00,0x6f,0x00,0x37,0x01,0x5e,0x00,0x6f,0x00,0x37,0x01,0x60,0x00,0x6f,0x00,0x37,0x01,0x63,0xff,0x8f,0x00,0x37,0x01,0x6d,0xff,0x4e,0x00,0x37,0x01,0x6e,0xff,0xa4,0x00,0x37,0x01,0x6f,0xff,0x2d,0x00,0x37,0x01,0x70,0xff,0xa4,0x00,0x37,0x01,0x71,0xff,0x2d,0x00,0x37,0x01,0x73, -0xff,0x4e,0x00,0x37,0x01,0x75,0xff,0x66,0x00,0x37,0x01,0x76,0x00,0x27,0x00,0x37,0x01,0x79,0xff,0x4e,0x00,0x37,0x01,0x7b,0xff,0x4e,0x00,0x37,0x01,0x7d,0xff,0x4e,0x00,0x37,0x01,0x7f,0xff,0x4e,0x00,0x37,0x01,0x80,0x00,0x27,0x00,0x37,0x01,0x81,0xff,0x8f,0x00,0x37,0x01,0x82,0x00,0x1d,0x00,0x37,0x01,0x83,0xff,0x8f,0x00,0x37, -0x01,0x85,0xff,0x66,0x00,0x37,0x01,0x86,0xff,0x27,0x00,0x37,0x01,0x87,0xff,0x66,0x00,0x37,0x01,0x88,0xff,0x27,0x00,0x37,0x01,0x89,0xff,0xa4,0x00,0x37,0x01,0x8a,0xff,0x2d,0x00,0x37,0x01,0x8c,0x00,0x27,0x00,0x37,0x01,0x8d,0xff,0x8f,0x00,0x37,0x01,0x8e,0x00,0x27,0x00,0x37,0x01,0x8f,0xff,0x8f,0x00,0x37,0x01,0x90,0x00,0x27, -0x00,0x37,0x01,0x91,0xff,0x8f,0x00,0x37,0x01,0x92,0x00,0x1d,0x00,0x37,0x01,0x93,0xff,0x8f,0x00,0x37,0x02,0x3e,0xff,0x66,0x00,0x38,0x00,0x24,0xff,0xd7,0x00,0x38,0x00,0x91,0xff,0x8b,0x00,0x38,0x00,0xc4,0xff,0xa6,0x00,0x38,0x00,0xc5,0xff,0xa6,0x00,0x38,0x01,0x03,0xff,0xd7,0x00,0x38,0x01,0x05,0xff,0xd7,0x00,0x38,0x01,0x45, -0xff,0xd7,0x00,0x38,0x01,0x85,0xff,0xd7,0x00,0x38,0x01,0x87,0xff,0xd7,0x00,0x39,0x00,0x0f,0xff,0x33,0x00,0x39,0x00,0x11,0xff,0x1b,0x00,0x39,0x00,0x24,0xff,0x8b,0x00,0x39,0x00,0x26,0xff,0xd5,0x00,0x39,0x00,0x2a,0xff,0xd5,0x00,0x39,0x00,0x2d,0xff,0xba,0x00,0x39,0x00,0x32,0xff,0xf4,0x00,0x39,0x00,0x34,0xff,0xd5,0x00,0x39, -0x00,0x36,0xff,0xe5,0x00,0x39,0x00,0x37,0x00,0x27,0x00,0x39,0x00,0x44,0xff,0x6d,0x00,0x39,0x00,0x46,0xff,0x7f,0x00,0x39,0x00,0x47,0xff,0x7f,0x00,0x39,0x00,0x48,0xff,0x7f,0x00,0x39,0x00,0x4a,0xff,0x7f,0x00,0x39,0x00,0x50,0xff,0xb4,0x00,0x39,0x00,0x51,0xff,0xb4,0x00,0x39,0x00,0x52,0xff,0x7f,0x00,0x39,0x00,0x53,0xff,0xb4, -0x00,0x39,0x00,0x54,0xff,0x7f,0x00,0x39,0x00,0x55,0xff,0xb4,0x00,0x39,0x00,0x56,0xff,0xbe,0x00,0x39,0x00,0x58,0xff,0xb4,0x00,0x39,0x00,0x62,0xff,0x8b,0x00,0x39,0x00,0x63,0xff,0x8b,0x00,0x39,0x00,0x64,0xff,0xe1,0x00,0x39,0x00,0x67,0xff,0xf4,0x00,0x39,0x00,0x69,0xff,0x6d,0x00,0x39,0x00,0x6a,0xff,0x6d,0x00,0x39,0x00,0x6b, -0xff,0x6d,0x00,0x39,0x00,0x6c,0xff,0x6d,0x00,0x39,0x00,0x6d,0xff,0x6d,0x00,0x39,0x00,0x6e,0xff,0x6d,0x00,0x39,0x00,0x6f,0xff,0x7f,0x00,0x39,0x00,0x70,0xff,0x7f,0x00,0x39,0x00,0x71,0xff,0x7f,0x00,0x39,0x00,0x72,0xff,0x7f,0x00,0x39,0x00,0x73,0xff,0x7f,0x00,0x39,0x00,0x76,0x00,0x1d,0x00,0x39,0x00,0x77,0x00,0x5a,0x00,0x39, -0x00,0x78,0xff,0xb4,0x00,0x39,0x00,0x79,0xff,0x7f,0x00,0x39,0x00,0x7a,0xff,0x7f,0x00,0x39,0x00,0x7b,0xff,0x7f,0x00,0x39,0x00,0x7c,0xff,0x7f,0x00,0x39,0x00,0x7d,0xff,0x7f,0x00,0x39,0x00,0x7e,0xff,0xb4,0x00,0x39,0x00,0x7f,0xff,0xb4,0x00,0x39,0x00,0x80,0xff,0xb4,0x00,0x39,0x00,0x81,0xff,0xb4,0x00,0x39,0x00,0x8d,0x00,0x52, -0x00,0x39,0x00,0x91,0xff,0x44,0x00,0x39,0x00,0x92,0xff,0xf4,0x00,0x39,0x00,0xa0,0xff,0x6d,0x00,0x39,0x00,0xa2,0xff,0x75,0x00,0x39,0x00,0xaa,0xff,0xcf,0x00,0x39,0x00,0xac,0xff,0x1b,0x00,0x39,0x00,0xad,0xff,0x8b,0x00,0x39,0x00,0xae,0xff,0x8b,0x00,0x39,0x00,0xaf,0xff,0xf4,0x00,0x39,0x00,0xb0,0xff,0xf4,0x00,0x39,0x00,0xb1, -0xff,0x7f,0x00,0x39,0x00,0xbe,0xff,0xcf,0x00,0x39,0x00,0xc4,0xff,0x73,0x00,0x39,0x00,0xc5,0xff,0x7f,0x00,0x39,0x00,0xc7,0xff,0x8b,0x00,0x39,0x00,0xc9,0xff,0x8b,0x00,0x39,0x00,0xd0,0xff,0xf4,0x00,0x39,0x00,0xd1,0xff,0xf4,0x00,0x39,0x00,0xd2,0xff,0xf4,0x00,0x39,0x00,0xe3,0xff,0xe5,0x00,0x39,0x00,0xe4,0xff,0xbe,0x00,0x39, -0x00,0xf7,0xff,0xd5,0x00,0x39,0x00,0xf8,0xff,0x7f,0x00,0x39,0x00,0xfa,0xff,0xe5,0x00,0x39,0x00,0xfb,0xff,0xbe,0x00,0x39,0x00,0xfc,0xff,0xd5,0x00,0x39,0x00,0xfd,0xff,0x7f,0x00,0x39,0x00,0xfe,0xff,0xd5,0x00,0x39,0x00,0xff,0xff,0x7f,0x00,0x39,0x01,0x00,0xff,0x7f,0x00,0x39,0x01,0x03,0xff,0x8b,0x00,0x39,0x01,0x04,0xff,0x6d, -0x00,0x39,0x01,0x05,0xff,0x8b,0x00,0x39,0x01,0x06,0xff,0x6d,0x00,0x39,0x01,0x08,0xff,0x7f,0x00,0x39,0x01,0x0b,0xff,0x7f,0x00,0x39,0x01,0x0d,0xff,0x7f,0x00,0x39,0x01,0x15,0xff,0xb4,0x00,0x39,0x01,0x17,0xff,0xb4,0x00,0x39,0x01,0x18,0xff,0xf4,0x00,0x39,0x01,0x19,0xff,0x7f,0x00,0x39,0x01,0x1b,0xff,0xb4,0x00,0x39,0x01,0x1d, -0xff,0xb4,0x00,0x39,0x01,0x1e,0xff,0xe5,0x00,0x39,0x01,0x1f,0xff,0xbe,0x00,0x39,0x01,0x20,0x00,0x27,0x00,0x39,0x01,0x22,0x00,0x27,0x00,0x39,0x01,0x25,0xff,0xb4,0x00,0x39,0x01,0x27,0xff,0xb4,0x00,0x39,0x01,0x45,0xff,0x8b,0x00,0x39,0x01,0x46,0xff,0x6d,0x00,0x39,0x01,0x47,0xff,0xd5,0x00,0x39,0x01,0x48,0xff,0x7f,0x00,0x39, -0x01,0x4c,0xff,0x7f,0x00,0x39,0x01,0x4e,0xff,0x7f,0x00,0x39,0x01,0x50,0xff,0x7f,0x00,0x39,0x01,0x51,0xff,0xd5,0x00,0x39,0x01,0x52,0xff,0x7f,0x00,0x39,0x01,0x53,0xff,0xd5,0x00,0x39,0x01,0x54,0xff,0x7f,0x00,0x39,0x01,0x55,0xff,0xd5,0x00,0x39,0x01,0x56,0xff,0x7f,0x00,0x39,0x01,0x5c,0x00,0x5a,0x00,0x39,0x01,0x5e,0x00,0x5a, -0x00,0x39,0x01,0x60,0x00,0x5a,0x00,0x39,0x01,0x63,0xff,0xba,0x00,0x39,0x01,0x6d,0xff,0xb4,0x00,0x39,0x01,0x6e,0xff,0xf4,0x00,0x39,0x01,0x6f,0xff,0x7f,0x00,0x39,0x01,0x70,0xff,0xf4,0x00,0x39,0x01,0x71,0xff,0x7f,0x00,0x39,0x01,0x73,0xff,0xb4,0x00,0x39,0x01,0x74,0xff,0xe5,0x00,0x39,0x01,0x75,0xff,0xbe,0x00,0x39,0x01,0x76, -0x00,0x27,0x00,0x39,0x01,0x79,0xff,0xb4,0x00,0x39,0x01,0x7b,0xff,0xb4,0x00,0x39,0x01,0x7d,0xff,0xb4,0x00,0x39,0x01,0x7f,0xff,0xb4,0x00,0x39,0x01,0x85,0xff,0x8b,0x00,0x39,0x01,0x86,0xff,0x6d,0x00,0x39,0x01,0x87,0xff,0x8b,0x00,0x39,0x01,0x88,0xff,0x6d,0x00,0x39,0x01,0x89,0xff,0xf4,0x00,0x39,0x01,0x8a,0xff,0x7f,0x00,0x39, -0x02,0x3d,0xff,0xe5,0x00,0x39,0x02,0x3e,0xff,0xbe,0x00,0x3a,0x00,0x0f,0xff,0x8b,0x00,0x3a,0x00,0x11,0xff,0x7f,0x00,0x3a,0x00,0x24,0xff,0xb6,0x00,0x3a,0x00,0x37,0x00,0x27,0x00,0x3a,0x00,0x44,0xff,0xb4,0x00,0x3a,0x00,0x46,0xff,0xcf,0x00,0x3a,0x00,0x47,0xff,0xcf,0x00,0x3a,0x00,0x48,0xff,0xcf,0x00,0x3a,0x00,0x4a,0xff,0xcf, -0x00,0x3a,0x00,0x52,0xff,0xcf,0x00,0x3a,0x00,0x54,0xff,0xcf,0x00,0x3a,0x00,0x62,0xff,0xb6,0x00,0x3a,0x00,0x63,0xff,0xb6,0x00,0x3a,0x00,0x69,0xff,0xb4,0x00,0x3a,0x00,0x6a,0xff,0xb4,0x00,0x3a,0x00,0x6b,0xff,0xb4,0x00,0x3a,0x00,0x6c,0xff,0xb4,0x00,0x3a,0x00,0x6d,0xff,0xb4,0x00,0x3a,0x00,0x6e,0xff,0xb4,0x00,0x3a,0x00,0x6f, -0xff,0xcf,0x00,0x3a,0x00,0x70,0xff,0xcf,0x00,0x3a,0x00,0x71,0xff,0xcf,0x00,0x3a,0x00,0x72,0xff,0xcf,0x00,0x3a,0x00,0x73,0xff,0xcf,0x00,0x3a,0x00,0x76,0x00,0x31,0x00,0x3a,0x00,0x77,0x00,0x64,0x00,0x3a,0x00,0x79,0xff,0xcf,0x00,0x3a,0x00,0x7a,0xff,0xcf,0x00,0x3a,0x00,0x7b,0xff,0xcf,0x00,0x3a,0x00,0x7c,0xff,0xcf,0x00,0x3a, -0x00,0x7d,0xff,0xcf,0x00,0x3a,0x00,0x91,0xff,0x9a,0x00,0x3a,0x00,0xa0,0xff,0xb4,0x00,0x3a,0x00,0xa2,0xff,0xa4,0x00,0x3a,0x00,0xaa,0xff,0xcf,0x00,0x3a,0x00,0xab,0x00,0x27,0x00,0x3a,0x00,0xac,0xff,0x7f,0x00,0x3a,0x00,0xad,0xff,0xb6,0x00,0x3a,0x00,0xae,0xff,0xb6,0x00,0x3a,0x00,0xb1,0xff,0xcf,0x00,0x3a,0x00,0xbe,0xff,0xcf, -0x00,0x3a,0x00,0xbf,0x00,0x27,0x00,0x3a,0x00,0xc4,0xff,0x7f,0x00,0x3a,0x00,0xc5,0xff,0x8b,0x00,0x3a,0x00,0xc7,0xff,0xb6,0x00,0x3a,0x00,0xc9,0xff,0xb6,0x00,0x3a,0x00,0xf8,0xff,0xcf,0x00,0x3a,0x00,0xfd,0xff,0xcf,0x00,0x3a,0x00,0xff,0xff,0xcf,0x00,0x3a,0x01,0x00,0xff,0xcf,0x00,0x3a,0x01,0x03,0xff,0xb6,0x00,0x3a,0x01,0x04, -0xff,0xb4,0x00,0x3a,0x01,0x05,0xff,0xb6,0x00,0x3a,0x01,0x06,0xff,0xb4,0x00,0x3a,0x01,0x08,0xff,0xcf,0x00,0x3a,0x01,0x0b,0xff,0xcf,0x00,0x3a,0x01,0x0d,0xff,0xcf,0x00,0x3a,0x01,0x19,0xff,0xcf,0x00,0x3a,0x01,0x20,0x00,0x27,0x00,0x3a,0x01,0x22,0x00,0x27,0x00,0x3a,0x01,0x45,0xff,0xb6,0x00,0x3a,0x01,0x46,0xff,0xb4,0x00,0x3a, -0x01,0x48,0xff,0xcf,0x00,0x3a,0x01,0x4c,0xff,0xcf,0x00,0x3a,0x01,0x4e,0xff,0xcf,0x00,0x3a,0x01,0x50,0xff,0xcf,0x00,0x3a,0x01,0x52,0xff,0xcf,0x00,0x3a,0x01,0x54,0xff,0xcf,0x00,0x3a,0x01,0x56,0xff,0xcf,0x00,0x3a,0x01,0x5c,0x00,0x64,0x00,0x3a,0x01,0x5e,0x00,0x64,0x00,0x3a,0x01,0x60,0x00,0x64,0x00,0x3a,0x01,0x6f,0xff,0xcf, -0x00,0x3a,0x01,0x71,0xff,0xcf,0x00,0x3a,0x01,0x76,0x00,0x27,0x00,0x3a,0x01,0x85,0xff,0xb6,0x00,0x3a,0x01,0x86,0xff,0xb4,0x00,0x3a,0x01,0x87,0xff,0xb6,0x00,0x3a,0x01,0x88,0xff,0xb4,0x00,0x3a,0x01,0x8a,0xff,0xcf,0x00,0x3b,0x00,0x0f,0x00,0x44,0x00,0x3b,0x00,0x11,0x00,0x39,0x00,0x3b,0x00,0x1e,0x00,0x52,0x00,0x3b,0x00,0x26, -0xff,0xe9,0x00,0x3b,0x00,0x2a,0xff,0xe9,0x00,0x3b,0x00,0x2d,0x00,0x60,0x00,0x3b,0x00,0x32,0xff,0xe9,0x00,0x3b,0x00,0x34,0xff,0xe9,0x00,0x3b,0x00,0x37,0x00,0x21,0x00,0x3b,0x00,0x64,0xff,0xe9,0x00,0x3b,0x00,0x67,0xff,0xe9,0x00,0x3b,0x00,0x77,0x00,0x52,0x00,0x3b,0x00,0x92,0xff,0xe9,0x00,0x3b,0x00,0xac,0x00,0x39,0x00,0x3b, -0x00,0xaf,0xff,0xe9,0x00,0x3b,0x00,0xb0,0xff,0xe9,0x00,0x3b,0x00,0xc4,0x00,0x44,0x00,0x3b,0x00,0xc5,0x00,0x52,0x00,0x3b,0x00,0xd0,0xff,0xe9,0x00,0x3b,0x00,0xd1,0xff,0xe9,0x00,0x3b,0x00,0xd2,0xff,0xe9,0x00,0x3b,0x00,0xf7,0xff,0xe9,0x00,0x3b,0x00,0xfc,0xff,0xe9,0x00,0x3b,0x00,0xfe,0xff,0xe9,0x00,0x3b,0x01,0x18,0xff,0xe9, -0x00,0x3b,0x01,0x20,0x00,0x21,0x00,0x3b,0x01,0x22,0x00,0x21,0x00,0x3b,0x01,0x47,0xff,0xe9,0x00,0x3b,0x01,0x51,0xff,0xe9,0x00,0x3b,0x01,0x53,0xff,0xe9,0x00,0x3b,0x01,0x55,0xff,0xe9,0x00,0x3b,0x01,0x5c,0x00,0x52,0x00,0x3b,0x01,0x5e,0x00,0x52,0x00,0x3b,0x01,0x60,0x00,0x52,0x00,0x3b,0x01,0x63,0x00,0x60,0x00,0x3b,0x01,0x6e, -0xff,0xe9,0x00,0x3b,0x01,0x70,0xff,0xe9,0x00,0x3b,0x01,0x76,0x00,0x21,0x00,0x3b,0x01,0x89,0xff,0xe9,0x00,0x3c,0x00,0x0f,0xff,0x50,0x00,0x3c,0x00,0x11,0xff,0x3d,0x00,0x3c,0x00,0x24,0xff,0x62,0x00,0x3c,0x00,0x26,0xff,0xd3,0x00,0x3c,0x00,0x2a,0xff,0xd3,0x00,0x3c,0x00,0x2d,0xff,0xbe,0x00,0x3c,0x00,0x32,0xff,0xd3,0x00,0x3c, -0x00,0x34,0xff,0xd3,0x00,0x3c,0x00,0x36,0xff,0xe5,0x00,0x3c,0x00,0x37,0x00,0x27,0x00,0x3c,0x00,0x44,0xff,0x39,0x00,0x3c,0x00,0x46,0xff,0x4c,0x00,0x3c,0x00,0x47,0xff,0x4c,0x00,0x3c,0x00,0x48,0xff,0x4c,0x00,0x3c,0x00,0x49,0xff,0xe5,0x00,0x3c,0x00,0x4a,0xff,0x4c,0x00,0x3c,0x00,0x50,0xff,0x73,0x00,0x3c,0x00,0x51,0xff,0x73, -0x00,0x3c,0x00,0x52,0xff,0x4c,0x00,0x3c,0x00,0x53,0xff,0x73,0x00,0x3c,0x00,0x54,0xff,0x4c,0x00,0x3c,0x00,0x55,0xff,0x73,0x00,0x3c,0x00,0x56,0xff,0x7b,0x00,0x3c,0x00,0x58,0xff,0x73,0x00,0x3c,0x00,0x62,0xff,0x62,0x00,0x3c,0x00,0x63,0xff,0x62,0x00,0x3c,0x00,0x64,0xff,0xcd,0x00,0x3c,0x00,0x67,0xff,0xd3,0x00,0x3c,0x00,0x69, -0xff,0x39,0x00,0x3c,0x00,0x6a,0xff,0x39,0x00,0x3c,0x00,0x6b,0xff,0x39,0x00,0x3c,0x00,0x6c,0xff,0x7f,0x00,0x3c,0x00,0x6d,0xff,0x66,0x00,0x3c,0x00,0x6e,0xff,0x39,0x00,0x3c,0x00,0x6f,0xff,0x4c,0x00,0x3c,0x00,0x70,0xff,0x4c,0x00,0x3c,0x00,0x71,0xff,0x4c,0x00,0x3c,0x00,0x72,0xff,0x4c,0x00,0x3c,0x00,0x73,0xff,0x4c,0x00,0x3c, -0x00,0x77,0x00,0x5a,0x00,0x3c,0x00,0x78,0xff,0x73,0x00,0x3c,0x00,0x79,0xff,0x4c,0x00,0x3c,0x00,0x7a,0xff,0x4c,0x00,0x3c,0x00,0x7b,0xff,0x4c,0x00,0x3c,0x00,0x7c,0xff,0x4c,0x00,0x3c,0x00,0x7d,0xff,0x4c,0x00,0x3c,0x00,0x7e,0xff,0x73,0x00,0x3c,0x00,0x7f,0xff,0x73,0x00,0x3c,0x00,0x80,0xff,0x73,0x00,0x3c,0x00,0x81,0xff,0x73, -0x00,0x3c,0x00,0x91,0xff,0x3f,0x00,0x3c,0x00,0x92,0xff,0xd3,0x00,0x3c,0x00,0xa0,0xff,0x39,0x00,0x3c,0x00,0xa2,0xff,0x1b,0x00,0x3c,0x00,0xaa,0xff,0xcf,0x00,0x3c,0x00,0xac,0xff,0x3d,0x00,0x3c,0x00,0xad,0xff,0x62,0x00,0x3c,0x00,0xae,0xff,0x62,0x00,0x3c,0x00,0xaf,0xff,0xd3,0x00,0x3c,0x00,0xb0,0xff,0xd3,0x00,0x3c,0x00,0xb1, -0xff,0x4c,0x00,0x3c,0x00,0xbe,0xff,0x9a,0x00,0x3c,0x00,0xc4,0xff,0x08,0x00,0x3c,0x00,0xc5,0xff,0x08,0x00,0x3c,0x00,0xc7,0xff,0x62,0x00,0x3c,0x00,0xc9,0xff,0x62,0x00,0x3c,0x00,0xd0,0xff,0xd3,0x00,0x3c,0x00,0xd1,0xff,0xd3,0x00,0x3c,0x00,0xd2,0xff,0xd3,0x00,0x3c,0x00,0xe3,0xff,0xe5,0x00,0x3c,0x00,0xe4,0xff,0x7b,0x00,0x3c, -0x00,0xf7,0xff,0xd3,0x00,0x3c,0x00,0xf8,0xff,0x4c,0x00,0x3c,0x00,0xfa,0xff,0xe5,0x00,0x3c,0x00,0xfb,0xff,0x7b,0x00,0x3c,0x00,0xfc,0xff,0xd3,0x00,0x3c,0x00,0xfd,0xff,0x4c,0x00,0x3c,0x00,0xfe,0xff,0xd3,0x00,0x3c,0x00,0xff,0xff,0x4c,0x00,0x3c,0x01,0x00,0xff,0x4c,0x00,0x3c,0x01,0x03,0xff,0x62,0x00,0x3c,0x01,0x04,0xff,0x7f, -0x00,0x3c,0x01,0x05,0xff,0x62,0x00,0x3c,0x01,0x06,0xff,0x39,0x00,0x3c,0x01,0x08,0xff,0x4c,0x00,0x3c,0x01,0x0b,0xff,0x4c,0x00,0x3c,0x01,0x0d,0xff,0x4c,0x00,0x3c,0x01,0x15,0xff,0x73,0x00,0x3c,0x01,0x17,0xff,0x73,0x00,0x3c,0x01,0x18,0xff,0xd3,0x00,0x3c,0x01,0x19,0xff,0x4c,0x00,0x3c,0x01,0x1b,0xff,0x73,0x00,0x3c,0x01,0x1d, -0xff,0x73,0x00,0x3c,0x01,0x1e,0xff,0xe5,0x00,0x3c,0x01,0x1f,0xff,0x7b,0x00,0x3c,0x01,0x20,0x00,0x27,0x00,0x3c,0x01,0x22,0x00,0x27,0x00,0x3c,0x01,0x25,0xff,0x73,0x00,0x3c,0x01,0x27,0xff,0x73,0x00,0x3c,0x01,0x45,0xff,0x62,0x00,0x3c,0x01,0x46,0xff,0x7f,0x00,0x3c,0x01,0x47,0xff,0xd3,0x00,0x3c,0x01,0x48,0xff,0x4c,0x00,0x3c, -0x01,0x4c,0xff,0x4c,0x00,0x3c,0x01,0x4e,0xff,0x4c,0x00,0x3c,0x01,0x50,0xff,0x4c,0x00,0x3c,0x01,0x51,0xff,0xd3,0x00,0x3c,0x01,0x52,0xff,0x4c,0x00,0x3c,0x01,0x53,0xff,0xd3,0x00,0x3c,0x01,0x54,0xff,0x4c,0x00,0x3c,0x01,0x55,0xff,0xd3,0x00,0x3c,0x01,0x56,0xff,0x4c,0x00,0x3c,0x01,0x5c,0x00,0x5a,0x00,0x3c,0x01,0x5e,0x00,0x5a, -0x00,0x3c,0x01,0x60,0x00,0x5a,0x00,0x3c,0x01,0x63,0xff,0xbe,0x00,0x3c,0x01,0x6d,0xff,0x73,0x00,0x3c,0x01,0x6e,0xff,0xd3,0x00,0x3c,0x01,0x6f,0xff,0x4c,0x00,0x3c,0x01,0x70,0xff,0xd3,0x00,0x3c,0x01,0x71,0xff,0x4c,0x00,0x3c,0x01,0x73,0xff,0x73,0x00,0x3c,0x01,0x74,0xff,0xe5,0x00,0x3c,0x01,0x75,0xff,0x7b,0x00,0x3c,0x01,0x76, -0x00,0x27,0x00,0x3c,0x01,0x79,0xff,0x73,0x00,0x3c,0x01,0x7b,0xff,0x73,0x00,0x3c,0x01,0x7d,0xff,0x73,0x00,0x3c,0x01,0x7f,0xff,0x73,0x00,0x3c,0x01,0x85,0xff,0x62,0x00,0x3c,0x01,0x86,0xff,0x7f,0x00,0x3c,0x01,0x87,0xff,0x62,0x00,0x3c,0x01,0x88,0xff,0x39,0x00,0x3c,0x01,0x89,0xff,0xd3,0x00,0x3c,0x01,0x8a,0xff,0x4c,0x00,0x3c, -0x02,0x3d,0xff,0xe5,0x00,0x3c,0x02,0x3e,0xff,0x7b,0x00,0x3d,0x00,0x2d,0x00,0x52,0x00,0x3d,0x00,0x37,0x00,0x27,0x00,0x3d,0x00,0x5c,0xff,0xcb,0x00,0x3d,0x00,0x77,0x00,0x46,0x00,0x3d,0x00,0xab,0x00,0x27,0x00,0x3d,0x00,0xba,0xff,0xbe,0x00,0x3d,0x00,0xbf,0x00,0x52,0x00,0x3d,0x00,0xeb,0xff,0xcb,0x00,0x3d,0x01,0x20,0x00,0x27, -0x00,0x3d,0x01,0x22,0x00,0x27,0x00,0x3d,0x01,0x5c,0x00,0x46,0x00,0x3d,0x01,0x5e,0x00,0x46,0x00,0x3d,0x01,0x60,0x00,0x46,0x00,0x3d,0x01,0x63,0x00,0x52,0x00,0x3d,0x01,0x76,0x00,0x27,0x00,0x3d,0x01,0x83,0xff,0xcb,0x00,0x3d,0x01,0x93,0xff,0xcb,0x00,0x3e,0x00,0x4d,0x00,0xe9,0x00,0x3e,0x01,0x64,0x00,0xe9,0x00,0x45,0x00,0x44, -0xff,0xe5,0x00,0x45,0x00,0x49,0xff,0xf6,0x00,0x45,0x00,0x5b,0xff,0xe7,0x00,0x45,0x00,0x69,0xff,0xe5,0x00,0x45,0x00,0x6a,0xff,0xe5,0x00,0x45,0x00,0x6b,0xff,0xe5,0x00,0x45,0x00,0x6c,0xff,0xe5,0x00,0x45,0x00,0x6d,0xff,0xe5,0x00,0x45,0x00,0x6e,0xff,0xe5,0x00,0x45,0x00,0xa0,0xff,0xe5,0x00,0x45,0x00,0xc0,0xff,0xf6,0x00,0x45, -0x00,0xc1,0xff,0xf6,0x00,0x45,0x01,0x04,0xff,0xe5,0x00,0x45,0x01,0x06,0xff,0xe5,0x00,0x45,0x01,0x46,0xff,0xe5,0x00,0x45,0x01,0x86,0xff,0xe5,0x00,0x45,0x01,0x88,0xff,0xe5,0x00,0x46,0x00,0x2d,0x00,0x46,0x00,0x46,0x00,0x37,0xff,0x9a,0x00,0x46,0x00,0x3c,0xff,0xb4,0x00,0x46,0x00,0xea,0xff,0xb4,0x00,0x46,0x01,0x20,0xff,0x9a, -0x00,0x46,0x01,0x22,0xff,0x9a,0x00,0x46,0x01,0x63,0x00,0x46,0x00,0x46,0x01,0x76,0xff,0x9a,0x00,0x46,0x01,0x82,0xff,0xb4,0x00,0x46,0x01,0x92,0xff,0xb4,0x00,0x48,0x00,0x05,0xff,0x98,0x00,0x48,0x00,0x0a,0xff,0x98,0x00,0x49,0x00,0x0c,0x00,0x8d,0x00,0x49,0x00,0x0f,0xff,0x7f,0x00,0x49,0x00,0x10,0xff,0x9a,0x00,0x49,0x00,0x11, -0xff,0x7f,0x00,0x49,0x00,0x1d,0x00,0x52,0x00,0x49,0x00,0x1e,0x00,0x52,0x00,0x49,0x00,0x22,0x00,0x42,0x00,0x49,0x00,0x40,0x00,0x8d,0x00,0x49,0x00,0x45,0x00,0x12,0x00,0x49,0x00,0x4b,0x00,0x12,0x00,0x49,0x00,0x57,0x00,0x25,0x00,0x49,0x00,0x59,0x00,0x27,0x00,0x49,0x00,0x5a,0x00,0x27,0x00,0x49,0x00,0x5b,0x00,0x12,0x00,0x49, -0x00,0x5c,0x00,0x21,0x00,0x49,0x00,0x60,0x00,0x52,0x00,0x49,0x00,0x75,0x00,0x2d,0x00,0x49,0x00,0x76,0x00,0x12,0x00,0x49,0x00,0x77,0x00,0x79,0x00,0x49,0x00,0x8d,0x00,0x93,0x00,0x49,0x00,0xab,0x00,0x27,0x00,0x49,0x00,0xac,0xff,0x7f,0x00,0x49,0x00,0xb4,0x00,0x5e,0x00,0x49,0x00,0xb5,0x00,0x52,0x00,0x49,0x00,0xb6,0x00,0x5e, -0x00,0x49,0x00,0xb7,0x00,0x52,0x00,0x49,0x00,0xbf,0x00,0x27,0x00,0x49,0x00,0xc4,0xff,0xb0,0x00,0x49,0x00,0xc5,0xff,0xb0,0x00,0x49,0x00,0xeb,0x00,0x21,0x00,0x49,0x00,0xed,0x00,0x12,0x00,0x49,0x01,0x21,0x00,0x25,0x00,0x49,0x01,0x23,0x00,0x25,0x00,0x49,0x01,0x58,0x00,0x12,0x00,0x49,0x01,0x5a,0x00,0x12,0x00,0x49,0x01,0x5c, -0x00,0x79,0x00,0x49,0x01,0x5e,0x00,0x79,0x00,0x49,0x01,0x60,0x00,0x79,0x00,0x49,0x01,0x77,0x00,0x25,0x00,0x49,0x01,0x81,0x00,0x27,0x00,0x49,0x01,0x83,0x00,0x21,0x00,0x49,0x01,0x8d,0x00,0x27,0x00,0x49,0x01,0x8f,0x00,0x27,0x00,0x49,0x01,0x91,0x00,0x27,0x00,0x49,0x01,0x93,0x00,0x21,0x00,0x4a,0x00,0x4d,0x00,0x2f,0x00,0x4a, -0x01,0x64,0x00,0x2f,0x00,0x4d,0x00,0x4d,0x00,0x23,0x00,0x4d,0x01,0x64,0x00,0x23,0x00,0x4e,0x00,0x0f,0x00,0x52,0x00,0x4e,0x00,0x10,0xff,0x75,0x00,0x4e,0x00,0x11,0x00,0x52,0x00,0x4e,0x00,0x1d,0x00,0x52,0x00,0x4e,0x00,0x1e,0x00,0x52,0x00,0x4e,0x00,0x46,0xff,0xd7,0x00,0x4e,0x00,0x47,0xff,0xe5,0x00,0x4e,0x00,0x48,0xff,0xd7, -0x00,0x4e,0x00,0x4a,0xff,0xd7,0x00,0x4e,0x00,0x52,0xff,0xd7,0x00,0x4e,0x00,0x54,0xff,0xe5,0x00,0x4e,0x00,0x57,0xff,0xf0,0x00,0x4e,0x00,0x6f,0xff,0xe5,0x00,0x4e,0x00,0x70,0xff,0xd7,0x00,0x4e,0x00,0x71,0xff,0xd7,0x00,0x4e,0x00,0x72,0xff,0xd7,0x00,0x4e,0x00,0x73,0xff,0xd7,0x00,0x4e,0x00,0x79,0xff,0xd7,0x00,0x4e,0x00,0x7a, -0xff,0xd7,0x00,0x4e,0x00,0x7b,0xff,0xd7,0x00,0x4e,0x00,0x7c,0xff,0xd7,0x00,0x4e,0x00,0x7d,0xff,0xd7,0x00,0x4e,0x00,0xac,0x00,0x52,0x00,0x4e,0x00,0xb1,0xff,0xd7,0x00,0x4e,0x00,0xf8,0xff,0xd7,0x00,0x4e,0x00,0xfd,0xff,0xd7,0x00,0x4e,0x00,0xff,0xff,0xd7,0x00,0x4e,0x01,0x00,0xff,0xe5,0x00,0x4e,0x01,0x08,0xff,0xe5,0x00,0x4e, -0x01,0x0b,0xff,0xd7,0x00,0x4e,0x01,0x0d,0xff,0xd7,0x00,0x4e,0x01,0x19,0xff,0xd7,0x00,0x4e,0x01,0x21,0xff,0xf0,0x00,0x4e,0x01,0x23,0xff,0xf0,0x00,0x4e,0x01,0x48,0xff,0xd7,0x00,0x4e,0x01,0x4c,0xff,0xd7,0x00,0x4e,0x01,0x4e,0xff,0xd7,0x00,0x4e,0x01,0x50,0xff,0xd7,0x00,0x4e,0x01,0x52,0xff,0xd7,0x00,0x4e,0x01,0x54,0xff,0xd7, -0x00,0x4e,0x01,0x56,0xff,0xd7,0x00,0x4e,0x01,0x6f,0xff,0xd7,0x00,0x4e,0x01,0x71,0xff,0xd7,0x00,0x4e,0x01,0x77,0xff,0xf0,0x00,0x4e,0x01,0x8a,0xff,0xd7,0x00,0x51,0x00,0x05,0xff,0x98,0x00,0x51,0x00,0x0a,0xff,0x98,0x00,0x52,0x00,0x05,0xff,0x6f,0x00,0x52,0x00,0x0a,0xff,0x6f,0x00,0x52,0x00,0x44,0xff,0xe5,0x00,0x52,0x00,0x49, -0xff,0xdb,0x00,0x52,0x00,0x5b,0xff,0xe7,0x00,0x52,0x00,0x69,0xff,0xe5,0x00,0x52,0x00,0x6a,0xff,0xe5,0x00,0x52,0x00,0x6b,0xff,0xe5,0x00,0x52,0x00,0x6c,0xff,0xe5,0x00,0x52,0x00,0x6d,0xff,0xe5,0x00,0x52,0x00,0x6e,0xff,0xe5,0x00,0x52,0x00,0xa0,0xff,0xe5,0x00,0x52,0x00,0xb4,0xff,0xb2,0x00,0x52,0x00,0xb5,0xff,0x7d,0x00,0x52, -0x00,0xb6,0xff,0xbe,0x00,0x52,0x00,0xb7,0xff,0x7d,0x00,0x52,0x00,0xc0,0xff,0xe7,0x00,0x52,0x00,0xc1,0xff,0xe7,0x00,0x52,0x01,0x04,0xff,0xe5,0x00,0x52,0x01,0x06,0xff,0xe5,0x00,0x52,0x01,0x46,0xff,0xe5,0x00,0x52,0x01,0x86,0xff,0xe5,0x00,0x52,0x01,0x88,0xff,0xe5,0x00,0x53,0x00,0x44,0xff,0xe5,0x00,0x53,0x00,0x49,0xff,0xdb, -0x00,0x53,0x00,0x5b,0xff,0xe7,0x00,0x53,0x00,0x69,0xff,0xe5,0x00,0x53,0x00,0x6a,0xff,0xe5,0x00,0x53,0x00,0x6b,0xff,0xe5,0x00,0x53,0x00,0x6c,0xff,0xe5,0x00,0x53,0x00,0x6d,0xff,0xe5,0x00,0x53,0x00,0x6e,0xff,0xe5,0x00,0x53,0x00,0xa0,0xff,0xe5,0x00,0x53,0x00,0xb4,0xff,0xcb,0x00,0x53,0x00,0xb5,0xff,0x89,0x00,0x53,0x00,0xb6, -0xff,0x89,0x00,0x53,0x00,0xb7,0xff,0x89,0x00,0x53,0x00,0xc0,0xff,0xe7,0x00,0x53,0x00,0xc1,0xff,0xe7,0x00,0x53,0x01,0x04,0xff,0xe5,0x00,0x53,0x01,0x06,0xff,0xe5,0x00,0x53,0x01,0x46,0xff,0xe5,0x00,0x53,0x01,0x86,0xff,0xe5,0x00,0x53,0x01,0x88,0xff,0xe5,0x00,0x54,0x00,0x4d,0x00,0x66,0x00,0x54,0x01,0x64,0x00,0x66,0x00,0x55, -0x00,0x0f,0xff,0x62,0x00,0x55,0x00,0x10,0xff,0x7f,0x00,0x55,0x00,0x11,0xff,0x56,0x00,0x55,0x00,0x1d,0x00,0x52,0x00,0x55,0x00,0x1e,0x00,0x52,0x00,0x55,0x00,0x46,0xff,0xe5,0x00,0x55,0x00,0x47,0xff,0xe5,0x00,0x55,0x00,0x48,0xff,0xe5,0x00,0x55,0x00,0x49,0x00,0x27,0x00,0x55,0x00,0x4a,0xff,0xe5,0x00,0x55,0x00,0x50,0xff,0xfc, -0x00,0x55,0x00,0x51,0xff,0xfc,0x00,0x55,0x00,0x52,0xff,0xe5,0x00,0x55,0x00,0x54,0xff,0xe5,0x00,0x55,0x00,0x56,0x00,0x0e,0x00,0x55,0x00,0x57,0x00,0x3b,0x00,0x55,0x00,0x59,0x00,0x52,0x00,0x55,0x00,0x5a,0x00,0x52,0x00,0x55,0x00,0x5b,0x00,0x3b,0x00,0x55,0x00,0x5c,0x00,0x52,0x00,0x55,0x00,0x5d,0x00,0x27,0x00,0x55,0x00,0x6f, -0xff,0xe5,0x00,0x55,0x00,0x70,0xff,0xe5,0x00,0x55,0x00,0x71,0xff,0xe5,0x00,0x55,0x00,0x72,0xff,0xe5,0x00,0x55,0x00,0x73,0xff,0xe5,0x00,0x55,0x00,0x79,0xff,0xe5,0x00,0x55,0x00,0x7a,0xff,0xe5,0x00,0x55,0x00,0x7b,0xff,0xe5,0x00,0x55,0x00,0x7c,0xff,0xe5,0x00,0x55,0x00,0x7d,0xff,0xe5,0x00,0x55,0x00,0xac,0xff,0x56,0x00,0x55, -0x00,0xb1,0xff,0xe5,0x00,0x55,0x00,0xb4,0x00,0xa4,0x00,0x55,0x00,0xb5,0x00,0x79,0x00,0x55,0x00,0xb6,0x00,0xa4,0x00,0x55,0x00,0xb7,0x00,0x79,0x00,0x55,0x00,0xc4,0xff,0x62,0x00,0x55,0x00,0xc5,0xff,0x62,0x00,0x55,0x00,0xe4,0x00,0x0e,0x00,0x55,0x00,0xe6,0x00,0x27,0x00,0x55,0x00,0xeb,0x00,0x52,0x00,0x55,0x00,0xf8,0xff,0xe5, -0x00,0x55,0x00,0xfb,0x00,0x0e,0x00,0x55,0x00,0xfd,0xff,0xe5,0x00,0x55,0x00,0xff,0xff,0xe5,0x00,0x55,0x01,0x00,0xff,0xe5,0x00,0x55,0x01,0x08,0xff,0xe5,0x00,0x55,0x01,0x0b,0xff,0xe5,0x00,0x55,0x01,0x0d,0xff,0xe5,0x00,0x55,0x01,0x19,0xff,0xe5,0x00,0x55,0x01,0x1f,0x00,0x0e,0x00,0x55,0x01,0x21,0x00,0x3b,0x00,0x55,0x01,0x23, -0x00,0x3b,0x00,0x55,0x01,0x29,0x00,0x27,0x00,0x55,0x01,0x2b,0x00,0x27,0x00,0x55,0x01,0x48,0xff,0xe5,0x00,0x55,0x01,0x4c,0xff,0xe5,0x00,0x55,0x01,0x4e,0xff,0xe5,0x00,0x55,0x01,0x50,0xff,0xe5,0x00,0x55,0x01,0x52,0xff,0xe5,0x00,0x55,0x01,0x54,0xff,0xe5,0x00,0x55,0x01,0x56,0xff,0xe5,0x00,0x55,0x01,0x6d,0xff,0xfc,0x00,0x55, -0x01,0x6f,0xff,0xe5,0x00,0x55,0x01,0x71,0xff,0xe5,0x00,0x55,0x01,0x75,0x00,0x0e,0x00,0x55,0x01,0x77,0x00,0x3b,0x00,0x55,0x01,0x81,0x00,0x52,0x00,0x55,0x01,0x83,0x00,0x52,0x00,0x55,0x01,0x8a,0xff,0xe5,0x00,0x55,0x01,0x8d,0x00,0x52,0x00,0x55,0x01,0x8f,0x00,0x52,0x00,0x55,0x01,0x91,0x00,0x52,0x00,0x55,0x01,0x93,0x00,0x52, -0x00,0x55,0x02,0x3e,0x00,0x0e,0x00,0x57,0x00,0x10,0xff,0x8f,0x00,0x57,0x00,0x22,0xff,0xcb,0x00,0x57,0x00,0x46,0xff,0xe5,0x00,0x57,0x00,0x47,0xff,0xe5,0x00,0x57,0x00,0x48,0xff,0xf0,0x00,0x57,0x00,0x4a,0xff,0xf0,0x00,0x57,0x00,0x52,0xff,0xf0,0x00,0x57,0x00,0x54,0xff,0xf0,0x00,0x57,0x00,0x5b,0x00,0x1d,0x00,0x57,0x00,0x6f, -0xff,0xe5,0x00,0x57,0x00,0x70,0xff,0xf0,0x00,0x57,0x00,0x71,0xff,0xf0,0x00,0x57,0x00,0x72,0xff,0xf0,0x00,0x57,0x00,0x73,0xff,0xf0,0x00,0x57,0x00,0x79,0xff,0xf0,0x00,0x57,0x00,0x7a,0xff,0xf0,0x00,0x57,0x00,0x7b,0xff,0xf0,0x00,0x57,0x00,0x7c,0xff,0xf0,0x00,0x57,0x00,0x7d,0xff,0xf0,0x00,0x57,0x00,0xab,0x00,0x27,0x00,0x57, -0x00,0xb1,0xff,0xf0,0x00,0x57,0x00,0xbf,0x00,0x27,0x00,0x57,0x00,0xf8,0xff,0xf0,0x00,0x57,0x00,0xfd,0xff,0xe5,0x00,0x57,0x00,0xff,0xff,0xe5,0x00,0x57,0x01,0x00,0xff,0xe5,0x00,0x57,0x01,0x08,0xff,0xe5,0x00,0x57,0x01,0x0b,0xff,0xf0,0x00,0x57,0x01,0x0d,0xff,0xf0,0x00,0x57,0x01,0x19,0xff,0xf0,0x00,0x57,0x01,0x48,0xff,0xe5, -0x00,0x57,0x01,0x4c,0xff,0xf0,0x00,0x57,0x01,0x4e,0xff,0xf0,0x00,0x57,0x01,0x50,0xff,0xf0,0x00,0x57,0x01,0x52,0xff,0xf0,0x00,0x57,0x01,0x54,0xff,0xf0,0x00,0x57,0x01,0x56,0xff,0xf0,0x00,0x57,0x01,0x6f,0xff,0xf0,0x00,0x57,0x01,0x71,0xff,0xf0,0x00,0x57,0x01,0x8a,0xff,0xf0,0x00,0x58,0x00,0x05,0xff,0xbe,0x00,0x58,0x00,0x0a, -0xff,0xbe,0x00,0x59,0x00,0x0f,0xff,0x8b,0x00,0x59,0x00,0x11,0xff,0x7f,0x00,0x59,0x00,0x44,0xff,0xdb,0x00,0x59,0x00,0x46,0xff,0xf4,0x00,0x59,0x00,0x47,0xff,0xf0,0x00,0x59,0x00,0x48,0xff,0xf4,0x00,0x59,0x00,0x4a,0xff,0xf4,0x00,0x59,0x00,0x52,0xff,0xf4,0x00,0x59,0x00,0x54,0xff,0xf0,0x00,0x59,0x00,0x69,0xff,0xdb,0x00,0x59, -0x00,0x6a,0xff,0xdb,0x00,0x59,0x00,0x6b,0xff,0xdb,0x00,0x59,0x00,0x6c,0xff,0xdb,0x00,0x59,0x00,0x6d,0xff,0xdb,0x00,0x59,0x00,0x6e,0xff,0xdb,0x00,0x59,0x00,0x6f,0xff,0xf4,0x00,0x59,0x00,0x70,0xff,0xf4,0x00,0x59,0x00,0x71,0xff,0xf4,0x00,0x59,0x00,0x72,0xff,0xf4,0x00,0x59,0x00,0x73,0xff,0xf4,0x00,0x59,0x00,0x79,0xff,0xf4, -0x00,0x59,0x00,0x7a,0xff,0xf4,0x00,0x59,0x00,0x7b,0xff,0xf4,0x00,0x59,0x00,0x7c,0xff,0xf4,0x00,0x59,0x00,0x7d,0xff,0xf4,0x00,0x59,0x00,0xa0,0xff,0xdb,0x00,0x59,0x00,0xac,0xff,0x7f,0x00,0x59,0x00,0xb1,0xff,0xf4,0x00,0x59,0x00,0xc4,0xff,0x8b,0x00,0x59,0x00,0xc5,0xff,0x7f,0x00,0x59,0x00,0xf8,0xff,0xf4,0x00,0x59,0x00,0xfd, -0xff,0xf4,0x00,0x59,0x00,0xff,0xff,0xf4,0x00,0x59,0x01,0x00,0xff,0xf0,0x00,0x59,0x01,0x04,0xff,0xdb,0x00,0x59,0x01,0x06,0xff,0xdb,0x00,0x59,0x01,0x08,0xff,0xf0,0x00,0x59,0x01,0x0b,0xff,0xf4,0x00,0x59,0x01,0x0d,0xff,0xf4,0x00,0x59,0x01,0x19,0xff,0xf4,0x00,0x59,0x01,0x46,0xff,0xdb,0x00,0x59,0x01,0x48,0xff,0xf4,0x00,0x59, -0x01,0x4c,0xff,0xf4,0x00,0x59,0x01,0x4e,0xff,0xf4,0x00,0x59,0x01,0x50,0xff,0xf4,0x00,0x59,0x01,0x52,0xff,0xf4,0x00,0x59,0x01,0x54,0xff,0xf4,0x00,0x59,0x01,0x56,0xff,0xf4,0x00,0x59,0x01,0x6f,0xff,0xf4,0x00,0x59,0x01,0x71,0xff,0xf4,0x00,0x59,0x01,0x86,0xff,0xdb,0x00,0x59,0x01,0x88,0xff,0xdb,0x00,0x59,0x01,0x8a,0xff,0xf4, -0x00,0x5a,0x00,0x0f,0xff,0xa6,0x00,0x5a,0x00,0x11,0xff,0x9a,0x00,0x5a,0x00,0x46,0xff,0xfa,0x00,0x5a,0x00,0x47,0xff,0xf6,0x00,0x5a,0x00,0x48,0xff,0xf6,0x00,0x5a,0x00,0x4a,0xff,0xfa,0x00,0x5a,0x00,0x52,0xff,0xfa,0x00,0x5a,0x00,0x54,0xff,0xf6,0x00,0x5a,0x00,0x6f,0xff,0xfa,0x00,0x5a,0x00,0x70,0xff,0xf6,0x00,0x5a,0x00,0x71, -0xff,0xf6,0x00,0x5a,0x00,0x72,0xff,0xf6,0x00,0x5a,0x00,0x73,0xff,0xf6,0x00,0x5a,0x00,0x79,0xff,0xfa,0x00,0x5a,0x00,0x7a,0xff,0xfa,0x00,0x5a,0x00,0x7b,0xff,0xfa,0x00,0x5a,0x00,0x7c,0xff,0xfa,0x00,0x5a,0x00,0x7d,0xff,0xfa,0x00,0x5a,0x00,0xac,0xff,0x9a,0x00,0x5a,0x00,0xb1,0xff,0xfa,0x00,0x5a,0x00,0xc4,0xff,0xb4,0x00,0x5a, -0x00,0xc5,0xff,0xb4,0x00,0x5a,0x00,0xf8,0xff,0xfa,0x00,0x5a,0x00,0xfd,0xff,0xfa,0x00,0x5a,0x00,0xff,0xff,0xfa,0x00,0x5a,0x01,0x00,0xff,0xf6,0x00,0x5a,0x01,0x08,0xff,0xf6,0x00,0x5a,0x01,0x0b,0xff,0xf6,0x00,0x5a,0x01,0x0d,0xff,0xf6,0x00,0x5a,0x01,0x19,0xff,0xfa,0x00,0x5a,0x01,0x48,0xff,0xfa,0x00,0x5a,0x01,0x4c,0xff,0xf6, -0x00,0x5a,0x01,0x4e,0xff,0xf6,0x00,0x5a,0x01,0x50,0xff,0xf6,0x00,0x5a,0x01,0x52,0xff,0xfa,0x00,0x5a,0x01,0x54,0xff,0xfa,0x00,0x5a,0x01,0x56,0xff,0xfa,0x00,0x5a,0x01,0x6f,0xff,0xfa,0x00,0x5a,0x01,0x71,0xff,0xfa,0x00,0x5a,0x01,0x8a,0xff,0xfa,0x00,0x5b,0x00,0x46,0xff,0xf0,0x00,0x5b,0x00,0x47,0xff,0xf0,0x00,0x5b,0x00,0x48, -0xff,0xf0,0x00,0x5b,0x00,0x4a,0xff,0xf0,0x00,0x5b,0x00,0x52,0xff,0xf0,0x00,0x5b,0x00,0x54,0xff,0xf0,0x00,0x5b,0x00,0x6f,0xff,0xf0,0x00,0x5b,0x00,0x70,0xff,0xf0,0x00,0x5b,0x00,0x71,0xff,0xf0,0x00,0x5b,0x00,0x72,0xff,0xf0,0x00,0x5b,0x00,0x73,0xff,0xf0,0x00,0x5b,0x00,0x79,0xff,0xf0,0x00,0x5b,0x00,0x7a,0xff,0xf0,0x00,0x5b, -0x00,0x7b,0xff,0xf0,0x00,0x5b,0x00,0x7c,0xff,0xf0,0x00,0x5b,0x00,0x7d,0xff,0xf0,0x00,0x5b,0x00,0xb1,0xff,0xf0,0x00,0x5b,0x00,0xf8,0xff,0xf0,0x00,0x5b,0x00,0xfd,0xff,0xf0,0x00,0x5b,0x00,0xff,0xff,0xf0,0x00,0x5b,0x01,0x00,0xff,0xf0,0x00,0x5b,0x01,0x08,0xff,0xf0,0x00,0x5b,0x01,0x0b,0xff,0xf0,0x00,0x5b,0x01,0x0d,0xff,0xf0, -0x00,0x5b,0x01,0x19,0xff,0xf0,0x00,0x5b,0x01,0x48,0xff,0xf0,0x00,0x5b,0x01,0x4c,0xff,0xf0,0x00,0x5b,0x01,0x4e,0xff,0xf0,0x00,0x5b,0x01,0x50,0xff,0xf0,0x00,0x5b,0x01,0x52,0xff,0xf0,0x00,0x5b,0x01,0x54,0xff,0xf0,0x00,0x5b,0x01,0x56,0xff,0xf0,0x00,0x5b,0x01,0x6f,0xff,0xf0,0x00,0x5b,0x01,0x71,0xff,0xf0,0x00,0x5b,0x01,0x8a, -0xff,0xf0,0x00,0x5c,0x00,0x05,0x00,0x1d,0x00,0x5c,0x00,0x0a,0x00,0x1d,0x00,0x5c,0x00,0x0f,0xff,0x9a,0x00,0x5c,0x00,0x11,0xff,0x81,0x00,0x5c,0x00,0x22,0xff,0xb4,0x00,0x5c,0x00,0x46,0xff,0xf6,0x00,0x5c,0x00,0x47,0xff,0xf6,0x00,0x5c,0x00,0x48,0xff,0xf6,0x00,0x5c,0x00,0x49,0x00,0x04,0x00,0x5c,0x00,0x4a,0xff,0xf6,0x00,0x5c, -0x00,0x52,0xff,0xf6,0x00,0x5c,0x00,0x54,0xff,0xf6,0x00,0x5c,0x00,0x57,0x00,0x06,0x00,0x5c,0x00,0x6f,0xff,0xf6,0x00,0x5c,0x00,0x70,0xff,0xf6,0x00,0x5c,0x00,0x71,0xff,0xf6,0x00,0x5c,0x00,0x72,0xff,0xf6,0x00,0x5c,0x00,0x73,0xff,0xf6,0x00,0x5c,0x00,0x79,0xff,0xf6,0x00,0x5c,0x00,0x7a,0xff,0xf6,0x00,0x5c,0x00,0x7b,0xff,0xf6, -0x00,0x5c,0x00,0x7c,0xff,0xf6,0x00,0x5c,0x00,0x7d,0xff,0xf6,0x00,0x5c,0x00,0xac,0xff,0x81,0x00,0x5c,0x00,0xb1,0xff,0xf6,0x00,0x5c,0x00,0xbf,0x00,0x0c,0x00,0x5c,0x00,0xc4,0xff,0x8d,0x00,0x5c,0x00,0xc5,0xff,0x8d,0x00,0x5c,0x00,0xf8,0xff,0xf6,0x00,0x5c,0x00,0xfd,0xff,0xf6,0x00,0x5c,0x00,0xff,0xff,0xf6,0x00,0x5c,0x01,0x00, -0xff,0xf6,0x00,0x5c,0x01,0x08,0xff,0xf6,0x00,0x5c,0x01,0x0b,0xff,0xf6,0x00,0x5c,0x01,0x0d,0xff,0xf6,0x00,0x5c,0x01,0x19,0xff,0xf6,0x00,0x5c,0x01,0x21,0x00,0x06,0x00,0x5c,0x01,0x23,0x00,0x06,0x00,0x5c,0x01,0x48,0xff,0xf6,0x00,0x5c,0x01,0x4c,0xff,0xf6,0x00,0x5c,0x01,0x4e,0xff,0xf6,0x00,0x5c,0x01,0x50,0xff,0xf6,0x00,0x5c, -0x01,0x52,0xff,0xf6,0x00,0x5c,0x01,0x54,0xff,0xf6,0x00,0x5c,0x01,0x56,0xff,0xf6,0x00,0x5c,0x01,0x6f,0xff,0xf6,0x00,0x5c,0x01,0x71,0xff,0xf6,0x00,0x5c,0x01,0x77,0x00,0x06,0x00,0x5c,0x01,0x8a,0xff,0xf6,0x00,0x5e,0x00,0x4d,0x00,0xcb,0x00,0x5e,0x01,0x64,0x00,0xcb,0x00,0x62,0x00,0x2d,0x00,0x5e,0x00,0x62,0x00,0x37,0xff,0x6d, -0x00,0x62,0x00,0x39,0xff,0x8b,0x00,0x62,0x00,0x3a,0xff,0xb0,0x00,0x62,0x00,0x3c,0xff,0x64,0x00,0x62,0x00,0xea,0xff,0x64,0x00,0x62,0x01,0x20,0xff,0x6d,0x00,0x62,0x01,0x22,0xff,0x6d,0x00,0x62,0x01,0x63,0x00,0x5e,0x00,0x62,0x01,0x76,0xff,0x6d,0x00,0x62,0x01,0x80,0xff,0xb0,0x00,0x62,0x01,0x82,0xff,0x64,0x00,0x62,0x01,0x8c, -0xff,0xb0,0x00,0x62,0x01,0x8e,0xff,0xb0,0x00,0x62,0x01,0x90,0xff,0xb0,0x00,0x62,0x01,0x92,0xff,0x64,0x00,0x63,0x00,0x2d,0x00,0x5e,0x00,0x63,0x00,0x37,0xff,0x6d,0x00,0x63,0x00,0x39,0xff,0x8b,0x00,0x63,0x00,0x3a,0xff,0xb6,0x00,0x63,0x00,0x3c,0xff,0x64,0x00,0x63,0x00,0xea,0xff,0x64,0x00,0x63,0x01,0x20,0xff,0x6d,0x00,0x63, -0x01,0x22,0xff,0x6d,0x00,0x63,0x01,0x63,0x00,0x5e,0x00,0x63,0x01,0x76,0xff,0x6d,0x00,0x63,0x01,0x80,0xff,0xb6,0x00,0x63,0x01,0x82,0xff,0x64,0x00,0x63,0x01,0x8c,0xff,0xb6,0x00,0x63,0x01,0x8e,0xff,0xb6,0x00,0x63,0x01,0x90,0xff,0xb6,0x00,0x63,0x01,0x92,0xff,0x64,0x00,0x64,0x00,0x26,0xff,0xc9,0x00,0x64,0x00,0x2a,0xff,0xc9, -0x00,0x64,0x00,0x32,0xff,0xc9,0x00,0x64,0x00,0x34,0xff,0xc9,0x00,0x64,0x00,0xf7,0xff,0xc9,0x00,0x64,0x00,0xfc,0xff,0xc9,0x00,0x64,0x00,0xfe,0xff,0xc9,0x00,0x64,0x01,0x18,0xff,0xc9,0x00,0x64,0x01,0x47,0xff,0xc9,0x00,0x64,0x01,0x51,0xff,0xc9,0x00,0x64,0x01,0x53,0xff,0xc9,0x00,0x64,0x01,0x55,0xff,0xc9,0x00,0x64,0x01,0x6e, -0xff,0xc9,0x00,0x64,0x01,0x70,0xff,0xc9,0x00,0x64,0x01,0x89,0xff,0xc9,0x00,0x65,0x00,0x2d,0x00,0x3d,0x00,0x65,0x01,0x63,0x00,0x3d,0x00,0x67,0x00,0x24,0xff,0xe5,0x00,0x67,0x00,0x37,0xff,0xa4,0x00,0x67,0x00,0x3b,0xff,0xdb,0x00,0x67,0x00,0x3d,0xff,0xcf,0x00,0x67,0x00,0xe5,0xff,0xcf,0x00,0x67,0x01,0x03,0xff,0xe5,0x00,0x67, -0x01,0x05,0xff,0xe5,0x00,0x67,0x01,0x20,0xff,0xa4,0x00,0x67,0x01,0x22,0xff,0xa4,0x00,0x67,0x01,0x28,0xff,0xcf,0x00,0x67,0x01,0x2a,0xff,0xcf,0x00,0x67,0x01,0x45,0xff,0xe5,0x00,0x67,0x01,0x76,0xff,0xa4,0x00,0x67,0x01,0x85,0xff,0xe5,0x00,0x67,0x01,0x87,0xff,0xe5,0x00,0x79,0x00,0x44,0xff,0xe5,0x00,0x79,0x00,0x49,0xff,0xe7, -0x00,0x79,0x00,0x5b,0xff,0xe5,0x00,0x79,0x00,0xc0,0xff,0xe7,0x00,0x79,0x00,0xc1,0xff,0xe7,0x00,0x79,0x01,0x06,0xff,0xe5,0x00,0x79,0x01,0x88,0xff,0xe5,0x00,0x7a,0x00,0x44,0xff,0xe5,0x00,0x7a,0x00,0x49,0xff,0xe7,0x00,0x7a,0x00,0x5b,0xff,0xe5,0x00,0x7a,0x00,0xc0,0xff,0xe7,0x00,0x7a,0x00,0xc1,0xff,0xe7,0x00,0x7a,0x01,0x06, -0xff,0xe5,0x00,0x7a,0x01,0x88,0xff,0xe5,0x00,0x7b,0x00,0x44,0xff,0xe5,0x00,0x7b,0x00,0x49,0xff,0xe7,0x00,0x7b,0x00,0x5b,0xff,0xe5,0x00,0x7b,0x00,0xc0,0xff,0xe7,0x00,0x7b,0x00,0xc1,0xff,0xe7,0x00,0x7b,0x01,0x06,0xff,0xe5,0x00,0x7b,0x01,0x88,0xff,0xe5,0x00,0x7c,0x00,0x44,0xff,0xe5,0x00,0x7c,0x00,0x49,0xff,0xe7,0x00,0x7c, -0x00,0x5b,0xff,0xe5,0x00,0x7c,0x00,0xc0,0xff,0xe7,0x00,0x7c,0x00,0xc1,0xff,0xe7,0x00,0x7c,0x01,0x06,0xff,0xe5,0x00,0x7c,0x01,0x88,0xff,0xe5,0x00,0x7d,0x00,0x44,0xff,0xe5,0x00,0x7d,0x00,0x49,0xff,0xe7,0x00,0x7d,0x00,0x5b,0xff,0xe5,0x00,0x7d,0x00,0xc0,0xff,0xe7,0x00,0x7d,0x00,0xc1,0xff,0xe7,0x00,0x7d,0x01,0x06,0xff,0xe5, -0x00,0x7d,0x01,0x88,0xff,0xe5,0x00,0x91,0x00,0x2d,0x00,0x0e,0x00,0x91,0x01,0x63,0x00,0x0e,0x00,0x92,0x00,0x24,0xff,0xe5,0x00,0x92,0x00,0x37,0xff,0xa4,0x00,0x92,0x00,0x3b,0xff,0xdb,0x00,0x92,0x00,0x3d,0xff,0xcf,0x00,0x92,0x00,0xe5,0xff,0xcf,0x00,0x92,0x01,0x03,0xff,0xe5,0x00,0x92,0x01,0x05,0xff,0xe5,0x00,0x92,0x01,0x20, -0xff,0xa4,0x00,0x92,0x01,0x22,0xff,0xa4,0x00,0x92,0x01,0x28,0xff,0xcf,0x00,0x92,0x01,0x2a,0xff,0xcf,0x00,0x92,0x01,0x45,0xff,0xe5,0x00,0x92,0x01,0x76,0xff,0xa4,0x00,0x92,0x01,0x85,0xff,0xe5,0x00,0x92,0x01,0x87,0xff,0xe5,0x00,0xa1,0x00,0x44,0xff,0xe5,0x00,0xa1,0x00,0x49,0xff,0xe7,0x00,0xa1,0x00,0x5b,0xff,0xe5,0x00,0xa1, -0x00,0xc0,0xff,0xe7,0x00,0xa1,0x00,0xc1,0xff,0xe7,0x00,0xa1,0x01,0x06,0xff,0xe5,0x00,0xa1,0x01,0x88,0xff,0xe5,0x00,0xa2,0x00,0x3c,0xff,0x9a,0x00,0xa2,0x00,0x4d,0x00,0xbc,0x00,0xa2,0x00,0xea,0xff,0x9a,0x00,0xa2,0x01,0x64,0x00,0xbc,0x00,0xa2,0x01,0x82,0xff,0x9a,0x00,0xa2,0x01,0x92,0xff,0x9a,0x00,0xa4,0x00,0x4d,0x00,0xa0, -0x00,0xa4,0x01,0x33,0xff,0xdb,0x00,0xa4,0x01,0x64,0x00,0xa0,0x00,0xa4,0x02,0x37,0xff,0xdb,0x00,0xa9,0x00,0x0d,0xff,0x7f,0x00,0xa9,0x00,0x8d,0xff,0x98,0x00,0xa9,0x00,0xb4,0xff,0x66,0x00,0xa9,0x00,0xb5,0xff,0x3d,0x00,0xa9,0x00,0xb6,0xff,0x66,0x00,0xa9,0x00,0xb7,0xff,0x3d,0x00,0xa9,0x01,0x2d,0xff,0xd5,0x00,0xa9,0x01,0x2e, -0xff,0xd5,0x00,0xa9,0x01,0x33,0xff,0xa4,0x00,0xa9,0x01,0xb4,0xff,0xd5,0x00,0xa9,0x01,0xb7,0x00,0x3d,0x00,0xa9,0x01,0xb8,0xff,0x66,0x00,0xa9,0x01,0xb9,0xff,0x66,0x00,0xa9,0x01,0xba,0x00,0x3d,0x00,0xa9,0x01,0xbb,0xff,0x79,0x00,0xa9,0x01,0xbc,0x00,0x12,0x00,0xa9,0x01,0xbe,0xff,0x66,0x00,0xa9,0x01,0xc3,0xff,0xf6,0x00,0xa9, -0x01,0xc5,0xff,0xb6,0x00,0xa9,0x01,0xc8,0xff,0xf4,0x00,0xa9,0x01,0xcb,0x00,0x3d,0x00,0xa9,0x01,0xcd,0xff,0xdb,0x00,0xa9,0x01,0xd2,0xff,0xf6,0x00,0xa9,0x01,0xd3,0xff,0xc1,0x00,0xa9,0x01,0xd4,0xff,0xf6,0x00,0xa9,0x01,0xd7,0xff,0xf6,0x00,0xa9,0x01,0xd9,0xff,0xf6,0x00,0xaa,0x00,0x2d,0x00,0x52,0x00,0xaa,0x00,0x37,0xff,0xcf, -0x00,0xaa,0x00,0x3a,0x00,0x52,0x00,0xaa,0x00,0x3d,0x00,0x52,0x00,0xaa,0x00,0x5c,0x00,0x0c,0x00,0xaa,0x00,0xe5,0x00,0x52,0x00,0xaa,0x00,0xeb,0x00,0x0c,0x00,0xaa,0x01,0x20,0xff,0xcf,0x00,0xaa,0x01,0x22,0xff,0xcf,0x00,0xaa,0x01,0x28,0x00,0x52,0x00,0xaa,0x01,0x2a,0x00,0x52,0x00,0xaa,0x01,0x63,0x00,0x52,0x00,0xaa,0x01,0x76, -0xff,0xcf,0x00,0xaa,0x01,0x80,0x00,0x52,0x00,0xaa,0x01,0x83,0x00,0x0c,0x00,0xaa,0x01,0x8c,0x00,0x52,0x00,0xaa,0x01,0x8e,0x00,0x52,0x00,0xaa,0x01,0x90,0x00,0x52,0x00,0xaa,0x01,0x93,0x00,0x0c,0x00,0xaa,0x01,0xac,0x00,0x52,0x00,0xaa,0x01,0xb8,0xff,0xcd,0x00,0xaa,0x01,0xdc,0xff,0xcd,0x00,0xaa,0x01,0xe1,0x00,0x52,0x00,0xaa, -0x01,0xe3,0xff,0xcd,0x00,0xaa,0x01,0xeb,0x00,0x52,0x00,0xaa,0x01,0xf2,0x00,0x52,0x00,0xaa,0x01,0xf9,0xff,0xcd,0x00,0xaa,0x02,0x01,0xff,0xcd,0x00,0xaa,0x02,0x1a,0x00,0x0e,0x00,0xaa,0x02,0x31,0x00,0x0e,0x00,0xab,0x00,0x37,0xff,0xcf,0x00,0xab,0x00,0x39,0xff,0xcf,0x00,0xab,0x00,0x3a,0xff,0xcf,0x00,0xab,0x00,0x3c,0xff,0x9a, -0x00,0xab,0x00,0xea,0xff,0x9a,0x00,0xab,0x01,0x20,0xff,0xcf,0x00,0xab,0x01,0x22,0xff,0xcf,0x00,0xab,0x01,0x76,0xff,0xcf,0x00,0xab,0x01,0x80,0xff,0xcf,0x00,0xab,0x01,0x82,0xff,0x9a,0x00,0xab,0x01,0x8c,0xff,0xcf,0x00,0xab,0x01,0x8e,0xff,0xcf,0x00,0xab,0x01,0x90,0xff,0xcf,0x00,0xab,0x01,0x92,0xff,0x9a,0x00,0xab,0x01,0xb8, -0xff,0xcd,0x00,0xab,0x01,0xb9,0xff,0x98,0x00,0xab,0x01,0xdc,0xff,0xcd,0x00,0xab,0x01,0xe3,0xff,0xcd,0x00,0xab,0x01,0xf9,0xff,0xcd,0x00,0xab,0x02,0x01,0xff,0xcd,0x00,0xac,0x00,0xb4,0xff,0x31,0x00,0xac,0x00,0xb5,0xff,0x3d,0x00,0xac,0x00,0xb6,0xff,0x31,0x00,0xac,0x00,0xb7,0xff,0x3d,0x00,0xad,0x00,0x2d,0x00,0x5e,0x00,0xad, -0x00,0x37,0xff,0x6d,0x00,0xad,0x00,0x39,0xff,0x8b,0x00,0xad,0x00,0x3a,0xff,0xb6,0x00,0xad,0x00,0x3c,0xff,0x64,0x00,0xad,0x00,0xea,0xff,0x64,0x00,0xad,0x01,0x20,0xff,0x6d,0x00,0xad,0x01,0x22,0xff,0x6d,0x00,0xad,0x01,0x63,0x00,0x5e,0x00,0xad,0x01,0x76,0xff,0x6d,0x00,0xad,0x01,0x80,0xff,0xb6,0x00,0xad,0x01,0x82,0xff,0x64, -0x00,0xad,0x01,0x8c,0xff,0xb6,0x00,0xad,0x01,0x8e,0xff,0xb6,0x00,0xad,0x01,0x90,0xff,0xb6,0x00,0xad,0x01,0x92,0xff,0x64,0x00,0xae,0x00,0x2d,0x00,0x5e,0x00,0xae,0x00,0x37,0xff,0x6d,0x00,0xae,0x00,0x39,0xff,0x8b,0x00,0xae,0x00,0x3a,0xff,0xb6,0x00,0xae,0x00,0x3c,0xff,0x64,0x00,0xae,0x00,0xea,0xff,0x64,0x00,0xae,0x01,0x20, -0xff,0x6d,0x00,0xae,0x01,0x22,0xff,0x6d,0x00,0xae,0x01,0x63,0x00,0x5e,0x00,0xae,0x01,0x76,0xff,0x6d,0x00,0xae,0x01,0x80,0xff,0xb6,0x00,0xae,0x01,0x82,0xff,0x64,0x00,0xae,0x01,0x8c,0xff,0xb6,0x00,0xae,0x01,0x8e,0xff,0xb6,0x00,0xae,0x01,0x90,0xff,0xb6,0x00,0xae,0x01,0x92,0xff,0x64,0x00,0xaf,0x00,0x24,0xff,0xe5,0x00,0xaf, -0x00,0x37,0xff,0xa4,0x00,0xaf,0x00,0x3b,0xff,0xdb,0x00,0xaf,0x00,0x3d,0xff,0xcf,0x00,0xaf,0x00,0xe5,0xff,0xcf,0x00,0xaf,0x01,0x03,0xff,0xe5,0x00,0xaf,0x01,0x05,0xff,0xe5,0x00,0xaf,0x01,0x20,0xff,0xa4,0x00,0xaf,0x01,0x22,0xff,0xa4,0x00,0xaf,0x01,0x28,0xff,0xcf,0x00,0xaf,0x01,0x2a,0xff,0xcf,0x00,0xaf,0x01,0x45,0xff,0xe5, -0x00,0xaf,0x01,0x76,0xff,0xa4,0x00,0xaf,0x01,0x85,0xff,0xe5,0x00,0xaf,0x01,0x87,0xff,0xe5,0x00,0xb0,0x00,0x24,0x00,0x1d,0x00,0xb0,0x00,0x2d,0x00,0x44,0x00,0xb0,0x00,0x37,0x00,0x04,0x00,0xb0,0x00,0x3b,0x00,0x08,0x00,0xb0,0x01,0x03,0x00,0x1d,0x00,0xb0,0x01,0x05,0x00,0x1d,0x00,0xb0,0x01,0x20,0x00,0x04,0x00,0xb0,0x01,0x22, -0x00,0x04,0x00,0xb0,0x01,0x45,0x00,0x1d,0x00,0xb0,0x01,0x63,0x00,0x44,0x00,0xb0,0x01,0x76,0x00,0x04,0x00,0xb0,0x01,0x85,0x00,0x1d,0x00,0xb0,0x01,0x87,0x00,0x1d,0x00,0xb4,0x00,0x0f,0xff,0x98,0x00,0xb4,0x00,0x11,0xff,0x98,0x00,0xb4,0x00,0x24,0xff,0x25,0x00,0xb4,0x00,0x2d,0xff,0x62,0x00,0xb4,0x00,0x37,0x00,0x52,0x00,0xb4, -0x00,0x46,0xff,0x7f,0x00,0xb4,0x00,0x47,0xff,0x7f,0x00,0xb4,0x00,0x48,0xff,0x7f,0x00,0xb4,0x00,0x4a,0xff,0x73,0x00,0xb4,0x00,0x56,0xff,0xb2,0x00,0xb4,0x00,0x91,0xfe,0x87,0x00,0xb4,0x00,0xac,0xff,0x98,0x00,0xb4,0x00,0xe4,0xff,0xb2,0x00,0xb4,0x00,0xf8,0xff,0x73,0x00,0xb4,0x00,0xfb,0xff,0xb2,0x00,0xb4,0x00,0xfd,0xff,0x7f, -0x00,0xb4,0x00,0xff,0xff,0x7f,0x00,0xb4,0x01,0x00,0xff,0x7f,0x00,0xb4,0x01,0x03,0xff,0x25,0x00,0xb4,0x01,0x05,0xff,0x25,0x00,0xb4,0x01,0x08,0xff,0x7f,0x00,0xb4,0x01,0x0b,0xff,0x7f,0x00,0xb4,0x01,0x1f,0xff,0xb2,0x00,0xb4,0x01,0x20,0x00,0x52,0x00,0xb4,0x01,0x22,0x00,0x52,0x00,0xb4,0x01,0x45,0xff,0x25,0x00,0xb4,0x01,0x48, -0xff,0x7f,0x00,0xb4,0x01,0x52,0xff,0x73,0x00,0xb4,0x01,0x54,0xff,0x73,0x00,0xb4,0x01,0x56,0xff,0x73,0x00,0xb4,0x01,0x63,0xff,0x62,0x00,0xb4,0x01,0x75,0xff,0xb2,0x00,0xb4,0x01,0x76,0x00,0x52,0x00,0xb4,0x01,0x85,0xff,0x25,0x00,0xb4,0x01,0x87,0xff,0x25,0x00,0xb4,0x01,0xb8,0x00,0x52,0x00,0xb4,0x01,0xdc,0x00,0x52,0x00,0xb4, -0x01,0xe1,0xff,0x6f,0x00,0xb4,0x01,0xe3,0x00,0x52,0x00,0xb4,0x01,0xe7,0xff,0x23,0x00,0xb4,0x01,0xeb,0xff,0x6f,0x00,0xb4,0x01,0xf2,0xff,0x6f,0x00,0xb4,0x01,0xf9,0x00,0x52,0x00,0xb4,0x02,0x01,0x00,0x52,0x00,0xb4,0x02,0x0c,0xff,0x7f,0x00,0xb4,0x02,0x15,0xff,0x7f,0x00,0xb4,0x02,0x18,0xff,0x7f,0x00,0xb4,0x02,0x1b,0xff,0x7f, -0x00,0xb4,0x02,0x27,0xff,0x7f,0x00,0xb4,0x02,0x2a,0xff,0x7f,0x00,0xb4,0x02,0x2b,0xff,0xb0,0x00,0xb4,0x02,0x3e,0xff,0xb2,0x00,0xb5,0x00,0x0f,0xff,0x9a,0x00,0xb5,0x00,0x11,0xff,0x9a,0x00,0xb5,0x00,0x24,0xff,0x66,0x00,0xb5,0x00,0x37,0x00,0x52,0x00,0xb5,0x00,0x46,0xff,0xdd,0x00,0xb5,0x00,0x47,0xff,0x62,0x00,0xb5,0x00,0x48, -0xff,0x62,0x00,0xb5,0x00,0x4a,0xff,0x62,0x00,0xb5,0x00,0x52,0xff,0x62,0x00,0xb5,0x00,0x56,0xff,0x7f,0x00,0xb5,0x00,0x91,0xff,0x0a,0x00,0xb5,0x00,0xac,0xff,0x9a,0x00,0xb5,0x00,0xe4,0xff,0x7f,0x00,0xb5,0x00,0xf8,0xff,0x62,0x00,0xb5,0x00,0xfb,0xff,0x7f,0x00,0xb5,0x00,0xfd,0xff,0xdd,0x00,0xb5,0x00,0xff,0xff,0xdd,0x00,0xb5, -0x01,0x00,0xff,0x62,0x00,0xb5,0x01,0x03,0xff,0x66,0x00,0xb5,0x01,0x05,0xff,0x66,0x00,0xb5,0x01,0x08,0xff,0x62,0x00,0xb5,0x01,0x0b,0xff,0x62,0x00,0xb5,0x01,0x1f,0xff,0x7f,0x00,0xb5,0x01,0x20,0x00,0x52,0x00,0xb5,0x01,0x22,0x00,0x52,0x00,0xb5,0x01,0x45,0xff,0x66,0x00,0xb5,0x01,0x48,0xff,0xdd,0x00,0xb5,0x01,0x52,0xff,0x62, -0x00,0xb5,0x01,0x54,0xff,0x62,0x00,0xb5,0x01,0x56,0xff,0x62,0x00,0xb5,0x01,0x75,0xff,0x7f,0x00,0xb5,0x01,0x76,0x00,0x52,0x00,0xb5,0x01,0x85,0xff,0x66,0x00,0xb5,0x01,0x87,0xff,0x66,0x00,0xb5,0x01,0xdc,0x00,0x52,0x00,0xb5,0x01,0xe3,0x00,0x52,0x00,0xb5,0x01,0xe7,0xff,0x66,0x00,0xb5,0x01,0xf9,0x00,0x52,0x00,0xb5,0x02,0x01, -0x00,0x52,0x00,0xb5,0x02,0x0c,0xff,0x62,0x00,0xb5,0x02,0x15,0xff,0x62,0x00,0xb5,0x02,0x18,0xff,0x62,0x00,0xb5,0x02,0x1b,0xff,0x62,0x00,0xb5,0x02,0x27,0xff,0x62,0x00,0xb5,0x02,0x2a,0xff,0x62,0x00,0xb5,0x02,0x2b,0xff,0x7f,0x00,0xb5,0x02,0x3e,0xff,0x7f,0x00,0xb6,0x00,0x24,0xff,0x25,0x00,0xb6,0x00,0x26,0xff,0xbe,0x00,0xb6, -0x00,0x2d,0xff,0x6f,0x00,0xb6,0x00,0x37,0x00,0x52,0x00,0xb6,0x00,0x46,0xff,0x7f,0x00,0xb6,0x00,0x47,0xff,0x62,0x00,0xb6,0x00,0x48,0xff,0x7f,0x00,0xb6,0x00,0x4a,0xff,0x7f,0x00,0xb6,0x00,0x52,0xff,0x7f,0x00,0xb6,0x00,0x56,0xff,0xb2,0x00,0xb6,0x00,0x91,0xff,0x0a,0x00,0xb6,0x00,0xb6,0xff,0x54,0x00,0xb6,0x00,0xe4,0xff,0xb2, -0x00,0xb6,0x00,0xf8,0xff,0x7f,0x00,0xb6,0x00,0xfb,0xff,0xb2,0x00,0xb6,0x00,0xfc,0xff,0xbe,0x00,0xb6,0x00,0xfd,0xff,0x7f,0x00,0xb6,0x00,0xfe,0xff,0xbe,0x00,0xb6,0x00,0xff,0xff,0x7f,0x00,0xb6,0x01,0x00,0xff,0x62,0x00,0xb6,0x01,0x03,0xff,0x25,0x00,0xb6,0x01,0x05,0xff,0x25,0x00,0xb6,0x01,0x08,0xff,0x62,0x00,0xb6,0x01,0x0b, -0xff,0x7f,0x00,0xb6,0x01,0x1f,0xff,0xb2,0x00,0xb6,0x01,0x20,0x00,0x52,0x00,0xb6,0x01,0x22,0x00,0x52,0x00,0xb6,0x01,0x45,0xff,0x25,0x00,0xb6,0x01,0x47,0xff,0xbe,0x00,0xb6,0x01,0x48,0xff,0x7f,0x00,0xb6,0x01,0x52,0xff,0x7f,0x00,0xb6,0x01,0x54,0xff,0x7f,0x00,0xb6,0x01,0x56,0xff,0x7f,0x00,0xb6,0x01,0x63,0xff,0x6f,0x00,0xb6, -0x01,0x75,0xff,0xb2,0x00,0xb6,0x01,0x76,0x00,0x52,0x00,0xb6,0x01,0x85,0xff,0x25,0x00,0xb6,0x01,0x87,0xff,0x25,0x00,0xb6,0x01,0xdc,0x00,0x52,0x00,0xb6,0x01,0xde,0xff,0xbc,0x00,0xb6,0x01,0xe1,0xff,0x6f,0x00,0xb6,0x01,0xe3,0x00,0x52,0x00,0xb6,0x01,0xe7,0xff,0x23,0x00,0xb6,0x01,0xeb,0xff,0x6f,0x00,0xb6,0x01,0xf2,0xff,0x6f, -0x00,0xb6,0x01,0xf5,0xff,0xbc,0x00,0xb6,0x01,0xf8,0xff,0xbc,0x00,0xb6,0x01,0xf9,0x00,0x52,0x00,0xb6,0x01,0xfb,0xff,0xbc,0x00,0xb6,0x02,0x01,0x00,0x52,0x00,0xb6,0x02,0x0c,0xff,0x7f,0x00,0xb6,0x02,0x15,0xff,0x7f,0x00,0xb6,0x02,0x18,0xff,0x7f,0x00,0xb6,0x02,0x1b,0xff,0x7f,0x00,0xb6,0x02,0x27,0xff,0x7f,0x00,0xb6,0x02,0x2a, -0xff,0x7f,0x00,0xb6,0x02,0x2b,0xff,0xb0,0x00,0xb6,0x02,0x3e,0xff,0xb2,0x00,0xb7,0x00,0x0f,0xff,0x9a,0x00,0xb7,0x00,0x11,0xff,0x9a,0x00,0xb7,0x00,0x24,0xff,0x5a,0x00,0xb7,0x00,0x2d,0xff,0x62,0x00,0xb7,0x00,0x37,0x00,0x52,0x00,0xb7,0x00,0x44,0xff,0x98,0x00,0xb7,0x00,0x46,0xff,0x3d,0x00,0xb7,0x00,0x47,0xff,0x62,0x00,0xb7, -0x00,0x48,0xff,0x62,0x00,0xb7,0x00,0x4a,0xff,0x62,0x00,0xb7,0x00,0x52,0xff,0x62,0x00,0xb7,0x00,0x54,0xff,0x6f,0x00,0xb7,0x00,0x56,0xff,0x8b,0x00,0xb7,0x00,0x91,0xff,0x08,0x00,0xb7,0x00,0xac,0xff,0x9a,0x00,0xb7,0x00,0xb7,0xff,0x54,0x00,0xb7,0x00,0xc4,0xff,0x98,0x00,0xb7,0x00,0xe4,0xff,0x8b,0x00,0xb7,0x00,0xf8,0xff,0x62, -0x00,0xb7,0x00,0xfb,0xff,0x8b,0x00,0xb7,0x00,0xfd,0xff,0x3d,0x00,0xb7,0x00,0xff,0xff,0x3d,0x00,0xb7,0x01,0x00,0xff,0x62,0x00,0xb7,0x01,0x03,0xff,0x5a,0x00,0xb7,0x01,0x05,0xff,0x5a,0x00,0xb7,0x01,0x06,0xff,0x98,0x00,0xb7,0x01,0x08,0xff,0x62,0x00,0xb7,0x01,0x0b,0xff,0x62,0x00,0xb7,0x01,0x1f,0xff,0x8b,0x00,0xb7,0x01,0x20, -0x00,0x52,0x00,0xb7,0x01,0x22,0x00,0x52,0x00,0xb7,0x01,0x45,0xff,0x5a,0x00,0xb7,0x01,0x48,0xff,0x3d,0x00,0xb7,0x01,0x52,0xff,0x62,0x00,0xb7,0x01,0x54,0xff,0x62,0x00,0xb7,0x01,0x56,0xff,0x62,0x00,0xb7,0x01,0x63,0xff,0x62,0x00,0xb7,0x01,0x75,0xff,0x8b,0x00,0xb7,0x01,0x76,0x00,0x52,0x00,0xb7,0x01,0x85,0xff,0x5a,0x00,0xb7, -0x01,0x87,0xff,0x5a,0x00,0xb7,0x01,0x88,0xff,0x98,0x00,0xb7,0x01,0xdc,0x00,0x52,0x00,0xb7,0x01,0xe1,0xff,0x62,0x00,0xb7,0x01,0xe3,0x00,0x52,0x00,0xb7,0x01,0xe7,0xff,0x5a,0x00,0xb7,0x01,0xeb,0xff,0x62,0x00,0xb7,0x01,0xf2,0xff,0x62,0x00,0xb7,0x01,0xf9,0x00,0x52,0x00,0xb7,0x02,0x01,0x00,0x52,0x00,0xb7,0x02,0x07,0xff,0x96, -0x00,0xb7,0x02,0x0c,0xff,0x62,0x00,0xb7,0x02,0x15,0xff,0x62,0x00,0xb7,0x02,0x18,0xff,0x62,0x00,0xb7,0x02,0x1b,0xff,0x62,0x00,0xb7,0x02,0x27,0xff,0x62,0x00,0xb7,0x02,0x2a,0xff,0x62,0x00,0xb7,0x02,0x2b,0xff,0x8b,0x00,0xb7,0x02,0x3e,0xff,0x8b,0x00,0xba,0x00,0x46,0xff,0xf6,0x00,0xba,0x00,0x47,0xff,0xf6,0x00,0xba,0x00,0x48, -0xff,0xf6,0x00,0xba,0x00,0x4a,0xff,0xf6,0x00,0xba,0x00,0x52,0xff,0xf6,0x00,0xba,0x00,0x54,0xff,0xf6,0x00,0xba,0x00,0xf8,0xff,0xf6,0x00,0xba,0x00,0xfd,0xff,0xf6,0x00,0xba,0x00,0xff,0xff,0xf6,0x00,0xba,0x01,0x00,0xff,0xf6,0x00,0xba,0x01,0x08,0xff,0xf6,0x00,0xba,0x01,0x0b,0xff,0xf6,0x00,0xba,0x01,0x48,0xff,0xf6,0x00,0xba, -0x01,0x52,0xff,0xf6,0x00,0xba,0x01,0x54,0xff,0xf6,0x00,0xba,0x01,0x56,0xff,0xf6,0x00,0xbb,0x00,0x24,0xff,0x62,0x00,0xbb,0x00,0x26,0xff,0xe1,0x00,0xbb,0x00,0x2a,0xff,0xe1,0x00,0xbb,0x00,0x32,0xff,0xe1,0x00,0xbb,0x00,0x34,0xff,0xcd,0x00,0xbb,0x00,0x36,0xff,0xe5,0x00,0xbb,0x00,0xe3,0xff,0xe5,0x00,0xbb,0x00,0xf7,0xff,0xe1, -0x00,0xbb,0x00,0xfa,0xff,0xe5,0x00,0xbb,0x00,0xfc,0xff,0xe1,0x00,0xbb,0x00,0xfe,0xff,0xe1,0x00,0xbb,0x01,0x03,0xff,0x62,0x00,0xbb,0x01,0x05,0xff,0x62,0x00,0xbb,0x01,0x18,0xff,0xe1,0x00,0xbb,0x01,0x1e,0xff,0xe5,0x00,0xbb,0x01,0x45,0xff,0x62,0x00,0xbb,0x01,0x47,0xff,0xe1,0x00,0xbb,0x01,0x51,0xff,0xe1,0x00,0xbb,0x01,0x53, -0xff,0xe1,0x00,0xbb,0x01,0x55,0xff,0xe1,0x00,0xbb,0x01,0x6e,0xff,0xe1,0x00,0xbb,0x01,0x70,0xff,0xe1,0x00,0xbb,0x01,0x74,0xff,0xe5,0x00,0xbb,0x01,0x85,0xff,0x62,0x00,0xbb,0x01,0x87,0xff,0x62,0x00,0xbb,0x01,0x89,0xff,0xe1,0x00,0xbb,0x02,0x3d,0xff,0xe5,0x00,0xbe,0x00,0x2d,0x00,0x52,0x00,0xbe,0x00,0x37,0xff,0xcf,0x00,0xbe, -0x00,0x3a,0x00,0x27,0x00,0xbe,0x00,0x3d,0x00,0x52,0x00,0xbe,0x00,0x5c,0x00,0x0c,0x00,0xbe,0x00,0xe5,0x00,0x52,0x00,0xbe,0x00,0xeb,0x00,0x0c,0x00,0xbe,0x01,0x20,0xff,0xcf,0x00,0xbe,0x01,0x22,0xff,0xcf,0x00,0xbe,0x01,0x28,0x00,0x52,0x00,0xbe,0x01,0x2a,0x00,0x52,0x00,0xbe,0x01,0x63,0x00,0x52,0x00,0xbe,0x01,0x76,0xff,0xcf, -0x00,0xbe,0x01,0x80,0x00,0x27,0x00,0xbe,0x01,0x83,0x00,0x0c,0x00,0xbe,0x01,0x8c,0x00,0x27,0x00,0xbe,0x01,0x8e,0x00,0x27,0x00,0xbe,0x01,0x90,0x00,0x27,0x00,0xbe,0x01,0x93,0x00,0x0c,0x00,0xbe,0x01,0xdc,0xff,0xcd,0x00,0xbe,0x01,0xe1,0x00,0x52,0x00,0xbe,0x01,0xe3,0xff,0xcd,0x00,0xbe,0x01,0xeb,0x00,0x52,0x00,0xbe,0x01,0xf2, -0x00,0x52,0x00,0xbe,0x01,0xf9,0xff,0xcd,0x00,0xbe,0x02,0x01,0xff,0xcd,0x00,0xbe,0x02,0x1a,0x00,0x0e,0x00,0xbe,0x02,0x31,0x00,0x0e,0x00,0xbf,0x00,0x37,0xff,0x9a,0x00,0xbf,0x00,0x39,0xff,0xcf,0x00,0xbf,0x00,0x3a,0xff,0xcf,0x00,0xbf,0x00,0x3c,0xff,0x9a,0x00,0xbf,0x00,0xea,0xff,0x9a,0x00,0xbf,0x01,0x20,0xff,0x9a,0x00,0xbf, -0x01,0x22,0xff,0x9a,0x00,0xbf,0x01,0x76,0xff,0x9a,0x00,0xbf,0x01,0x80,0xff,0xcf,0x00,0xbf,0x01,0x82,0xff,0x9a,0x00,0xbf,0x01,0x8c,0xff,0xcf,0x00,0xbf,0x01,0x8e,0xff,0xcf,0x00,0xbf,0x01,0x90,0xff,0xcf,0x00,0xbf,0x01,0x92,0xff,0x9a,0x00,0xbf,0x01,0xdc,0xff,0x98,0x00,0xbf,0x01,0xe3,0xff,0x98,0x00,0xbf,0x01,0xf9,0xff,0x98, -0x00,0xbf,0x02,0x01,0xff,0x98,0x00,0xc4,0x00,0x2a,0xff,0xb2,0x00,0xc4,0x00,0x2d,0x00,0x6d,0x00,0xc4,0x00,0x32,0xff,0xa6,0x00,0xc4,0x00,0x37,0xff,0x31,0x00,0xc4,0x00,0x38,0xff,0xf6,0x00,0xc4,0x00,0x39,0xff,0x73,0x00,0xc4,0x00,0x3a,0xff,0x7f,0x00,0xc4,0x00,0x3b,0x00,0x39,0x00,0xc4,0x00,0x3c,0xff,0x08,0x00,0xc4,0x00,0x52, -0x00,0x19,0x00,0xc4,0x00,0x59,0xff,0x8b,0x00,0xc4,0x00,0x5a,0xff,0x7f,0x00,0xc4,0x00,0xea,0xff,0x08,0x00,0xc4,0x00,0xf7,0xff,0xb2,0x00,0xc4,0x01,0x18,0xff,0xa6,0x00,0xc4,0x01,0x20,0xff,0x31,0x00,0xc4,0x01,0x22,0xff,0x31,0x00,0xc4,0x01,0x24,0xff,0xf6,0x00,0xc4,0x01,0x26,0xff,0xf6,0x00,0xc4,0x01,0x51,0xff,0xb2,0x00,0xc4, -0x01,0x53,0xff,0xb2,0x00,0xc4,0x01,0x55,0xff,0xb2,0x00,0xc4,0x01,0x63,0x00,0x6d,0x00,0xc4,0x01,0x6e,0xff,0xa6,0x00,0xc4,0x01,0x70,0xff,0xa6,0x00,0xc4,0x01,0x76,0xff,0x31,0x00,0xc4,0x01,0x78,0xff,0xf6,0x00,0xc4,0x01,0x7a,0xff,0xf6,0x00,0xc4,0x01,0x7c,0xff,0xf6,0x00,0xc4,0x01,0x7e,0xff,0xf6,0x00,0xc4,0x01,0x80,0xff,0x7f, -0x00,0xc4,0x01,0x81,0xff,0x7f,0x00,0xc4,0x01,0x82,0xff,0x08,0x00,0xc4,0x01,0x89,0xff,0xa6,0x00,0xc4,0x01,0x8c,0xff,0x7f,0x00,0xc4,0x01,0x8d,0xff,0x7f,0x00,0xc4,0x01,0x8e,0xff,0x7f,0x00,0xc4,0x01,0x8f,0xff,0x7f,0x00,0xc4,0x01,0x90,0xff,0x7f,0x00,0xc4,0x01,0x91,0xff,0x7f,0x00,0xc4,0x01,0x92,0xff,0x08,0x00,0xc4,0x01,0xdc, -0xff,0x31,0x00,0xc4,0x01,0xde,0xff,0xa4,0x00,0xc4,0x01,0xe1,0x00,0x6f,0x00,0xc4,0x01,0xe3,0xff,0x31,0x00,0xc4,0x01,0xeb,0x00,0x6f,0x00,0xc4,0x01,0xf2,0x00,0x6f,0x00,0xc4,0x01,0xf5,0xff,0xa4,0x00,0xc4,0x01,0xf8,0xff,0xa4,0x00,0xc4,0x01,0xf9,0xff,0x31,0x00,0xc4,0x01,0xfb,0xff,0xa4,0x00,0xc4,0x01,0xfc,0x00,0x39,0x00,0xc4, -0x02,0x01,0xff,0x31,0x00,0xc4,0x02,0x08,0x00,0x1b,0x00,0xc4,0x02,0x0c,0x00,0x1b,0x00,0xc4,0x02,0x15,0x00,0x1b,0x00,0xc4,0x02,0x18,0x00,0x1b,0x00,0xc4,0x02,0x1b,0x00,0x1b,0x00,0xc4,0x02,0x27,0x00,0x1b,0x00,0xc4,0x02,0x2a,0x00,0x1b,0x00,0xc5,0x00,0x2a,0xff,0xa6,0x00,0xc5,0x00,0x2d,0x00,0x6d,0x00,0xc5,0x00,0x32,0xff,0xb2, -0x00,0xc5,0x00,0x37,0xff,0x31,0x00,0xc5,0x00,0x38,0xff,0xf6,0x00,0xc5,0x00,0x39,0xff,0x7f,0x00,0xc5,0x00,0x3a,0xff,0x8b,0x00,0xc5,0x00,0x3b,0x00,0x27,0x00,0xc5,0x00,0x3c,0xff,0x3d,0x00,0xc5,0x00,0x59,0xff,0x8b,0x00,0xc5,0x00,0x5a,0xff,0x7f,0x00,0xc5,0x00,0xea,0xff,0x3d,0x00,0xc5,0x00,0xf7,0xff,0xa6,0x00,0xc5,0x01,0x18, -0xff,0xb2,0x00,0xc5,0x01,0x20,0xff,0x31,0x00,0xc5,0x01,0x22,0xff,0x31,0x00,0xc5,0x01,0x24,0xff,0xf6,0x00,0xc5,0x01,0x26,0xff,0xf6,0x00,0xc5,0x01,0x51,0xff,0xa6,0x00,0xc5,0x01,0x53,0xff,0xa6,0x00,0xc5,0x01,0x55,0xff,0xa6,0x00,0xc5,0x01,0x63,0x00,0x6d,0x00,0xc5,0x01,0x6e,0xff,0xb2,0x00,0xc5,0x01,0x70,0xff,0xb2,0x00,0xc5, -0x01,0x76,0xff,0x31,0x00,0xc5,0x01,0x78,0xff,0xf6,0x00,0xc5,0x01,0x7a,0xff,0xf6,0x00,0xc5,0x01,0x7c,0xff,0xf6,0x00,0xc5,0x01,0x7e,0xff,0xf6,0x00,0xc5,0x01,0x80,0xff,0x8b,0x00,0xc5,0x01,0x81,0xff,0x7f,0x00,0xc5,0x01,0x82,0xff,0x3d,0x00,0xc5,0x01,0x89,0xff,0xb2,0x00,0xc5,0x01,0x8c,0xff,0x8b,0x00,0xc5,0x01,0x8d,0xff,0x7f, -0x00,0xc5,0x01,0x8e,0xff,0x8b,0x00,0xc5,0x01,0x8f,0xff,0x7f,0x00,0xc5,0x01,0x90,0xff,0x8b,0x00,0xc5,0x01,0x91,0xff,0x7f,0x00,0xc5,0x01,0x92,0xff,0x3d,0x00,0xc5,0x01,0xdc,0xff,0x31,0x00,0xc5,0x01,0xde,0xff,0xb0,0x00,0xc5,0x01,0xe1,0x00,0x6f,0x00,0xc5,0x01,0xe3,0xff,0x31,0x00,0xc5,0x01,0xeb,0x00,0x6f,0x00,0xc5,0x01,0xf2, -0x00,0x6f,0x00,0xc5,0x01,0xf5,0xff,0xb0,0x00,0xc5,0x01,0xf8,0xff,0xb0,0x00,0xc5,0x01,0xf9,0xff,0x31,0x00,0xc5,0x01,0xfb,0xff,0xb0,0x00,0xc5,0x01,0xfc,0x00,0x29,0x00,0xc5,0x02,0x01,0xff,0x31,0x00,0xc7,0x00,0x2d,0x00,0x5e,0x00,0xc7,0x00,0x37,0xff,0x6d,0x00,0xc7,0x00,0x39,0xff,0x8b,0x00,0xc7,0x00,0x3a,0xff,0xb6,0x00,0xc7, -0x00,0x3c,0xff,0x64,0x00,0xc7,0x00,0xea,0xff,0x64,0x00,0xc7,0x01,0x20,0xff,0x6d,0x00,0xc7,0x01,0x22,0xff,0x6d,0x00,0xc7,0x01,0x63,0x00,0x5e,0x00,0xc7,0x01,0x76,0xff,0x6d,0x00,0xc7,0x01,0x80,0xff,0xb6,0x00,0xc7,0x01,0x82,0xff,0x64,0x00,0xc7,0x01,0x8c,0xff,0xb6,0x00,0xc7,0x01,0x8e,0xff,0xb6,0x00,0xc7,0x01,0x90,0xff,0xb6, -0x00,0xc7,0x01,0x92,0xff,0x64,0x00,0xc8,0x00,0x2d,0x00,0x3d,0x00,0xc8,0x01,0x63,0x00,0x3d,0x00,0xc9,0x00,0x2d,0x00,0x5e,0x00,0xc9,0x00,0x37,0xff,0x6d,0x00,0xc9,0x00,0x39,0xff,0x8b,0x00,0xc9,0x00,0x3a,0xff,0xb6,0x00,0xc9,0x00,0x3c,0xff,0x64,0x00,0xc9,0x00,0xea,0xff,0x64,0x00,0xc9,0x01,0x20,0xff,0x6d,0x00,0xc9,0x01,0x22, -0xff,0x6d,0x00,0xc9,0x01,0x63,0x00,0x5e,0x00,0xc9,0x01,0x76,0xff,0x6d,0x00,0xc9,0x01,0x80,0xff,0xb6,0x00,0xc9,0x01,0x82,0xff,0x64,0x00,0xc9,0x01,0x8c,0xff,0xb6,0x00,0xc9,0x01,0x8e,0xff,0xb6,0x00,0xc9,0x01,0x90,0xff,0xb6,0x00,0xc9,0x01,0x92,0xff,0x64,0x00,0xca,0x00,0x2d,0x00,0x3d,0x00,0xca,0x01,0x63,0x00,0x3d,0x00,0xcb, -0x00,0x2d,0x00,0x3d,0x00,0xcb,0x01,0x63,0x00,0x3d,0x00,0xd0,0x00,0x24,0xff,0xe5,0x00,0xd0,0x00,0x37,0xff,0xa4,0x00,0xd0,0x00,0x3b,0xff,0xdb,0x00,0xd0,0x00,0x3d,0xff,0xcf,0x00,0xd0,0x00,0xe5,0xff,0xcf,0x00,0xd0,0x01,0x03,0xff,0xe5,0x00,0xd0,0x01,0x05,0xff,0xe5,0x00,0xd0,0x01,0x20,0xff,0xa4,0x00,0xd0,0x01,0x22,0xff,0xa4, -0x00,0xd0,0x01,0x28,0xff,0xcf,0x00,0xd0,0x01,0x2a,0xff,0xcf,0x00,0xd0,0x01,0x45,0xff,0xe5,0x00,0xd0,0x01,0x76,0xff,0xa4,0x00,0xd0,0x01,0x85,0xff,0xe5,0x00,0xd0,0x01,0x87,0xff,0xe5,0x00,0xd1,0x00,0x24,0xff,0xe5,0x00,0xd1,0x00,0x37,0xff,0xa4,0x00,0xd1,0x00,0x3b,0xff,0xdb,0x00,0xd1,0x00,0x3d,0xff,0xcf,0x00,0xd1,0x00,0xe5, -0xff,0xcf,0x00,0xd1,0x01,0x03,0xff,0xe5,0x00,0xd1,0x01,0x05,0xff,0xe5,0x00,0xd1,0x01,0x20,0xff,0xa4,0x00,0xd1,0x01,0x22,0xff,0xa4,0x00,0xd1,0x01,0x28,0xff,0xcf,0x00,0xd1,0x01,0x2a,0xff,0xcf,0x00,0xd1,0x01,0x45,0xff,0xe5,0x00,0xd1,0x01,0x76,0xff,0xa4,0x00,0xd1,0x01,0x85,0xff,0xe5,0x00,0xd1,0x01,0x87,0xff,0xe5,0x00,0xd2, -0x00,0x24,0xff,0xe5,0x00,0xd2,0x00,0x37,0xff,0xa4,0x00,0xd2,0x00,0x3b,0xff,0xdb,0x00,0xd2,0x00,0x3d,0xff,0xcf,0x00,0xd2,0x00,0xe5,0xff,0xcf,0x00,0xd2,0x01,0x03,0xff,0xe5,0x00,0xd2,0x01,0x05,0xff,0xe5,0x00,0xd2,0x01,0x20,0xff,0xa4,0x00,0xd2,0x01,0x22,0xff,0xa4,0x00,0xd2,0x01,0x28,0xff,0xcf,0x00,0xd2,0x01,0x2a,0xff,0xcf, -0x00,0xd2,0x01,0x45,0xff,0xe5,0x00,0xd2,0x01,0x76,0xff,0xa4,0x00,0xd2,0x01,0x85,0xff,0xe5,0x00,0xd2,0x01,0x87,0xff,0xe5,0x00,0xe1,0x00,0x0d,0xff,0x31,0x00,0xe1,0x00,0x22,0xff,0x9a,0x00,0xe1,0x00,0x24,0x00,0x3b,0x00,0xe1,0x00,0x26,0xff,0xbe,0x00,0xe1,0x00,0x2a,0xff,0xbe,0x00,0xe1,0x00,0x2d,0x00,0x64,0x00,0xe1,0x00,0x32, -0xff,0xba,0x00,0xe1,0x00,0x34,0xff,0xba,0x00,0xe1,0x00,0x37,0xff,0x8f,0x00,0xe1,0x00,0x38,0xff,0xe3,0x00,0xe1,0x00,0x39,0xff,0x8b,0x00,0xe1,0x00,0x3a,0xff,0xcf,0x00,0xe1,0x00,0x3c,0xff,0x7f,0x00,0xe1,0x00,0x3d,0x00,0x3b,0x00,0xe1,0x00,0x57,0xff,0xe5,0x00,0xe1,0x00,0x59,0xff,0x9a,0x00,0xe1,0x00,0x5a,0xff,0xbe,0x00,0xe1, -0x00,0x5c,0xff,0xb4,0x00,0xe1,0x00,0x64,0xff,0xbe,0x00,0xe1,0x00,0x67,0xff,0xba,0x00,0xe1,0x00,0x68,0xff,0xe3,0x00,0xe1,0x00,0x8d,0xff,0x9a,0x00,0xe1,0x00,0x92,0xff,0xba,0x00,0xe1,0x00,0xaf,0xff,0xba,0x00,0xe1,0x00,0xb0,0xff,0xba,0x00,0xe1,0x00,0xb4,0xff,0x73,0x00,0xe1,0x00,0xb5,0xff,0x8b,0x00,0xe1,0x00,0xb6,0xff,0x73, -0x00,0xe1,0x00,0xb7,0xff,0x7f,0x00,0xe1,0x00,0xba,0xff,0xb4,0x00,0xe1,0x00,0xbb,0xff,0x9a,0x00,0xe1,0x00,0xc4,0x00,0x44,0x00,0xe1,0x00,0xc5,0x00,0x44,0x00,0xe1,0x00,0xd0,0xff,0xba,0x00,0xe1,0x00,0xd1,0xff,0xba,0x00,0xe1,0x00,0xd2,0xff,0xba,0x00,0xe1,0x00,0xd3,0xff,0xe3,0x00,0xe1,0x00,0xd4,0xff,0xe3,0x00,0xe1,0x00,0xd5, -0xff,0xe3,0x00,0xe1,0x00,0xe5,0x00,0x3b,0x00,0xe1,0x00,0xea,0xff,0x7f,0x00,0xe1,0x00,0xeb,0xff,0xb4,0x00,0xe1,0x00,0xf7,0xff,0xbe,0x00,0xe1,0x00,0xfc,0xff,0xbe,0x00,0xe1,0x00,0xfe,0xff,0xbe,0x00,0xe1,0x01,0x03,0x00,0x3b,0x00,0xe1,0x01,0x05,0x00,0x3b,0x00,0xe1,0x01,0x18,0xff,0xba,0x00,0xe1,0x01,0x20,0xff,0x8f,0x00,0xe1, -0x01,0x21,0xff,0xe5,0x00,0xe1,0x01,0x22,0xff,0x8f,0x00,0xe1,0x01,0x23,0xff,0xe5,0x00,0xe1,0x01,0x24,0xff,0xe3,0x00,0xe1,0x01,0x26,0xff,0xe3,0x00,0xe1,0x01,0x28,0x00,0x3b,0x00,0xe1,0x01,0x2a,0x00,0x3b,0x00,0xe1,0x01,0x45,0x00,0x3b,0x00,0xe1,0x01,0x47,0xff,0xbe,0x00,0xe1,0x01,0x51,0xff,0xbe,0x00,0xe1,0x01,0x53,0xff,0xbe, -0x00,0xe1,0x01,0x55,0xff,0xbe,0x00,0xe1,0x01,0x63,0x00,0x64,0x00,0xe1,0x01,0x6e,0xff,0xba,0x00,0xe1,0x01,0x70,0xff,0xba,0x00,0xe1,0x01,0x76,0xff,0x8f,0x00,0xe1,0x01,0x77,0xff,0xe5,0x00,0xe1,0x01,0x78,0xff,0xe3,0x00,0xe1,0x01,0x7a,0xff,0xe3,0x00,0xe1,0x01,0x7c,0xff,0xe3,0x00,0xe1,0x01,0x7e,0xff,0xe3,0x00,0xe1,0x01,0x80, -0xff,0xcf,0x00,0xe1,0x01,0x81,0xff,0xbe,0x00,0xe1,0x01,0x82,0xff,0x7f,0x00,0xe1,0x01,0x83,0xff,0xb4,0x00,0xe1,0x01,0x85,0x00,0x3b,0x00,0xe1,0x01,0x87,0x00,0x3b,0x00,0xe1,0x01,0x89,0xff,0xba,0x00,0xe1,0x01,0x8c,0xff,0xcf,0x00,0xe1,0x01,0x8d,0xff,0xbe,0x00,0xe1,0x01,0x8e,0xff,0xcf,0x00,0xe1,0x01,0x8f,0xff,0xbe,0x00,0xe1, -0x01,0x90,0xff,0xcf,0x00,0xe1,0x01,0x91,0xff,0xbe,0x00,0xe1,0x01,0x92,0xff,0x7f,0x00,0xe1,0x01,0x93,0xff,0xb4,0x00,0xe3,0x00,0x57,0xff,0xbe,0x00,0xe3,0x00,0x59,0xff,0xcf,0x00,0xe3,0x00,0x5a,0xff,0xe5,0x00,0xe3,0x00,0x5c,0xff,0xd1,0x00,0xe3,0x00,0xba,0xff,0xbe,0x00,0xe3,0x00,0xc4,0xff,0xb2,0x00,0xe3,0x00,0xc5,0xff,0xb2, -0x00,0xe3,0x00,0xeb,0xff,0xd1,0x00,0xe3,0x01,0x21,0xff,0xbe,0x00,0xe3,0x01,0x23,0xff,0xbe,0x00,0xe3,0x01,0x77,0xff,0xbe,0x00,0xe3,0x01,0x81,0xff,0xe5,0x00,0xe3,0x01,0x83,0xff,0xd1,0x00,0xe3,0x01,0x8d,0xff,0xe5,0x00,0xe3,0x01,0x8f,0xff,0xe5,0x00,0xe3,0x01,0x91,0xff,0xe5,0x00,0xe3,0x01,0x93,0xff,0xd1,0x00,0xe5,0x00,0x2d, -0x00,0x52,0x00,0xe5,0x00,0x37,0x00,0x27,0x00,0xe5,0x00,0x5c,0xff,0xcb,0x00,0xe5,0x00,0x77,0x00,0x46,0x00,0xe5,0x00,0xab,0x00,0x27,0x00,0xe5,0x00,0xba,0xff,0xbe,0x00,0xe5,0x00,0xbf,0x00,0x52,0x00,0xe5,0x00,0xeb,0xff,0xcb,0x00,0xe5,0x01,0x20,0x00,0x27,0x00,0xe5,0x01,0x22,0x00,0x27,0x00,0xe5,0x01,0x5c,0x00,0x46,0x00,0xe5, -0x01,0x5e,0x00,0x46,0x00,0xe5,0x01,0x60,0x00,0x46,0x00,0xe5,0x01,0x63,0x00,0x52,0x00,0xe5,0x01,0x76,0x00,0x27,0x00,0xe5,0x01,0x83,0xff,0xcb,0x00,0xe5,0x01,0x93,0xff,0xcb,0x00,0xe8,0x00,0x0f,0xff,0x7f,0x00,0xe8,0x00,0x11,0xff,0x7f,0x00,0xe8,0x00,0x24,0xff,0xdf,0x00,0xe8,0x00,0x37,0xff,0xa4,0x00,0xe8,0x00,0x3b,0xff,0xcb, -0x00,0xe8,0x00,0x3d,0xff,0xcf,0x00,0xe8,0x00,0x62,0xff,0xdf,0x00,0xe8,0x00,0x63,0xff,0xdf,0x00,0xe8,0x00,0x91,0xff,0xb6,0x00,0xe8,0x00,0xac,0xff,0x7f,0x00,0xe8,0x00,0xad,0xff,0xdf,0x00,0xe8,0x00,0xae,0xff,0xdf,0x00,0xe8,0x00,0xbb,0xff,0xf6,0x00,0xe8,0x00,0xc4,0xff,0x8b,0x00,0xe8,0x00,0xc5,0xff,0x8b,0x00,0xe8,0x00,0xc7, -0xff,0xdf,0x00,0xe8,0x00,0xc9,0xff,0xdf,0x00,0xe8,0x00,0xe5,0xff,0xcf,0x00,0xe8,0x01,0x03,0xff,0xdf,0x00,0xe8,0x01,0x05,0xff,0xdf,0x00,0xe8,0x01,0x20,0xff,0xa4,0x00,0xe8,0x01,0x22,0xff,0xa4,0x00,0xe8,0x01,0x28,0xff,0xcf,0x00,0xe8,0x01,0x2a,0xff,0xcf,0x00,0xe8,0x01,0x45,0xff,0xdf,0x00,0xe8,0x01,0x76,0xff,0xa4,0x00,0xe8, -0x01,0x85,0xff,0xdf,0x00,0xe8,0x01,0x87,0xff,0xdf,0x00,0xea,0x00,0x0f,0xff,0x50,0x00,0xea,0x00,0x11,0xff,0x3d,0x00,0xea,0x00,0x24,0xff,0x62,0x00,0xea,0x00,0x26,0xff,0xd3,0x00,0xea,0x00,0x2a,0xff,0xd3,0x00,0xea,0x00,0x2d,0xff,0xbe,0x00,0xea,0x00,0x32,0xff,0xd3,0x00,0xea,0x00,0x34,0xff,0xd3,0x00,0xea,0x00,0x36,0xff,0xe5, -0x00,0xea,0x00,0x37,0x00,0x27,0x00,0xea,0x00,0x44,0xff,0x39,0x00,0xea,0x00,0x46,0xff,0x4c,0x00,0xea,0x00,0x47,0xff,0x4c,0x00,0xea,0x00,0x48,0xff,0x4c,0x00,0xea,0x00,0x49,0xff,0xe5,0x00,0xea,0x00,0x4a,0xff,0x4c,0x00,0xea,0x00,0x50,0xff,0x73,0x00,0xea,0x00,0x51,0xff,0x73,0x00,0xea,0x00,0x52,0xff,0x4c,0x00,0xea,0x00,0x53, -0xff,0x73,0x00,0xea,0x00,0x54,0xff,0x4c,0x00,0xea,0x00,0x55,0xff,0x73,0x00,0xea,0x00,0x56,0xff,0x7b,0x00,0xea,0x00,0x58,0xff,0x73,0x00,0xea,0x00,0x62,0xff,0x62,0x00,0xea,0x00,0x63,0xff,0x62,0x00,0xea,0x00,0x64,0xff,0xcd,0x00,0xea,0x00,0x67,0xff,0xd3,0x00,0xea,0x00,0x69,0xff,0x39,0x00,0xea,0x00,0x6a,0xff,0x39,0x00,0xea, -0x00,0x6b,0xff,0x39,0x00,0xea,0x00,0x6c,0xff,0x7f,0x00,0xea,0x00,0x6d,0xff,0x66,0x00,0xea,0x00,0x6e,0xff,0x39,0x00,0xea,0x00,0x6f,0xff,0x4c,0x00,0xea,0x00,0x70,0xff,0x4c,0x00,0xea,0x00,0x71,0xff,0x4c,0x00,0xea,0x00,0x72,0xff,0x4c,0x00,0xea,0x00,0x73,0xff,0x4c,0x00,0xea,0x00,0x77,0x00,0x5a,0x00,0xea,0x00,0x78,0xff,0x73, -0x00,0xea,0x00,0x79,0xff,0x4c,0x00,0xea,0x00,0x7a,0xff,0x4c,0x00,0xea,0x00,0x7b,0xff,0x4c,0x00,0xea,0x00,0x7c,0xff,0x4c,0x00,0xea,0x00,0x7d,0xff,0x4c,0x00,0xea,0x00,0x7e,0xff,0x73,0x00,0xea,0x00,0x7f,0xff,0x73,0x00,0xea,0x00,0x80,0xff,0x73,0x00,0xea,0x00,0x81,0xff,0x73,0x00,0xea,0x00,0x91,0xff,0x3f,0x00,0xea,0x00,0x92, -0xff,0xd3,0x00,0xea,0x00,0xa0,0xff,0x39,0x00,0xea,0x00,0xa2,0xff,0x1b,0x00,0xea,0x00,0xaa,0xff,0xcf,0x00,0xea,0x00,0xac,0xff,0x3d,0x00,0xea,0x00,0xad,0xff,0x62,0x00,0xea,0x00,0xae,0xff,0x62,0x00,0xea,0x00,0xaf,0xff,0xd3,0x00,0xea,0x00,0xb0,0xff,0xd3,0x00,0xea,0x00,0xb1,0xff,0x4c,0x00,0xea,0x00,0xbe,0xff,0x9a,0x00,0xea, -0x00,0xc4,0xff,0x08,0x00,0xea,0x00,0xc5,0xff,0x08,0x00,0xea,0x00,0xc7,0xff,0x62,0x00,0xea,0x00,0xc9,0xff,0x62,0x00,0xea,0x00,0xd0,0xff,0xd3,0x00,0xea,0x00,0xd1,0xff,0xd3,0x00,0xea,0x00,0xd2,0xff,0xd3,0x00,0xea,0x00,0xe3,0xff,0xe5,0x00,0xea,0x00,0xe4,0xff,0x7b,0x00,0xea,0x00,0xf7,0xff,0xd3,0x00,0xea,0x00,0xf8,0xff,0x4c, -0x00,0xea,0x00,0xfa,0xff,0xe5,0x00,0xea,0x00,0xfb,0xff,0x7b,0x00,0xea,0x00,0xfc,0xff,0xd3,0x00,0xea,0x00,0xfd,0xff,0x4c,0x00,0xea,0x00,0xfe,0xff,0xd3,0x00,0xea,0x00,0xff,0xff,0x4c,0x00,0xea,0x01,0x00,0xff,0x4c,0x00,0xea,0x01,0x03,0xff,0x62,0x00,0xea,0x01,0x04,0xff,0x7f,0x00,0xea,0x01,0x05,0xff,0x62,0x00,0xea,0x01,0x06, -0xff,0x39,0x00,0xea,0x01,0x08,0xff,0x4c,0x00,0xea,0x01,0x0b,0xff,0x4c,0x00,0xea,0x01,0x0d,0xff,0x4c,0x00,0xea,0x01,0x15,0xff,0x73,0x00,0xea,0x01,0x17,0xff,0x73,0x00,0xea,0x01,0x18,0xff,0xd3,0x00,0xea,0x01,0x19,0xff,0x4c,0x00,0xea,0x01,0x1b,0xff,0x73,0x00,0xea,0x01,0x1d,0xff,0x73,0x00,0xea,0x01,0x1e,0xff,0xe5,0x00,0xea, -0x01,0x1f,0xff,0x7b,0x00,0xea,0x01,0x20,0x00,0x27,0x00,0xea,0x01,0x22,0x00,0x27,0x00,0xea,0x01,0x25,0xff,0x73,0x00,0xea,0x01,0x27,0xff,0x73,0x00,0xea,0x01,0x45,0xff,0x62,0x00,0xea,0x01,0x46,0xff,0x7f,0x00,0xea,0x01,0x47,0xff,0xd3,0x00,0xea,0x01,0x48,0xff,0x4c,0x00,0xea,0x01,0x4c,0xff,0x4c,0x00,0xea,0x01,0x4e,0xff,0x4c, -0x00,0xea,0x01,0x50,0xff,0x4c,0x00,0xea,0x01,0x51,0xff,0xd3,0x00,0xea,0x01,0x52,0xff,0x4c,0x00,0xea,0x01,0x53,0xff,0xd3,0x00,0xea,0x01,0x54,0xff,0x4c,0x00,0xea,0x01,0x55,0xff,0xd3,0x00,0xea,0x01,0x56,0xff,0x4c,0x00,0xea,0x01,0x5c,0x00,0x5a,0x00,0xea,0x01,0x5e,0x00,0x5a,0x00,0xea,0x01,0x60,0x00,0x5a,0x00,0xea,0x01,0x63, -0xff,0xbe,0x00,0xea,0x01,0x6d,0xff,0x73,0x00,0xea,0x01,0x6e,0xff,0xd3,0x00,0xea,0x01,0x6f,0xff,0x4c,0x00,0xea,0x01,0x70,0xff,0xd3,0x00,0xea,0x01,0x71,0xff,0x4c,0x00,0xea,0x01,0x73,0xff,0x73,0x00,0xea,0x01,0x74,0xff,0xe5,0x00,0xea,0x01,0x75,0xff,0x7b,0x00,0xea,0x01,0x76,0x00,0x27,0x00,0xea,0x01,0x79,0xff,0x73,0x00,0xea, -0x01,0x7b,0xff,0x73,0x00,0xea,0x01,0x7d,0xff,0x73,0x00,0xea,0x01,0x7f,0xff,0x73,0x00,0xea,0x01,0x85,0xff,0x62,0x00,0xea,0x01,0x86,0xff,0x7f,0x00,0xea,0x01,0x87,0xff,0x62,0x00,0xea,0x01,0x88,0xff,0x39,0x00,0xea,0x01,0x89,0xff,0xd3,0x00,0xea,0x01,0x8a,0xff,0x4c,0x00,0xea,0x02,0x3d,0xff,0xe5,0x00,0xea,0x02,0x3e,0xff,0x7b, -0x00,0xeb,0x00,0x05,0x00,0x1d,0x00,0xeb,0x00,0x0a,0x00,0x1d,0x00,0xeb,0x00,0x0f,0xff,0x9a,0x00,0xeb,0x00,0x11,0xff,0x81,0x00,0xeb,0x00,0x22,0xff,0xb4,0x00,0xeb,0x00,0x46,0xff,0xf6,0x00,0xeb,0x00,0x47,0xff,0xf6,0x00,0xeb,0x00,0x48,0xff,0xf6,0x00,0xeb,0x00,0x49,0x00,0x04,0x00,0xeb,0x00,0x4a,0xff,0xf6,0x00,0xeb,0x00,0x52, -0xff,0xf6,0x00,0xeb,0x00,0x54,0xff,0xf6,0x00,0xeb,0x00,0x57,0x00,0x06,0x00,0xeb,0x00,0x6f,0xff,0xf6,0x00,0xeb,0x00,0x70,0xff,0xf6,0x00,0xeb,0x00,0x71,0xff,0xf6,0x00,0xeb,0x00,0x72,0xff,0xf6,0x00,0xeb,0x00,0x73,0xff,0xf6,0x00,0xeb,0x00,0x79,0xff,0xf6,0x00,0xeb,0x00,0x7a,0xff,0xf6,0x00,0xeb,0x00,0x7b,0xff,0xf6,0x00,0xeb, -0x00,0x7c,0xff,0xf6,0x00,0xeb,0x00,0x7d,0xff,0xf6,0x00,0xeb,0x00,0xac,0xff,0x81,0x00,0xeb,0x00,0xb1,0xff,0xf6,0x00,0xeb,0x00,0xbf,0x00,0x0c,0x00,0xeb,0x00,0xc4,0xff,0x8d,0x00,0xeb,0x00,0xc5,0xff,0x8d,0x00,0xeb,0x00,0xf8,0xff,0xf6,0x00,0xeb,0x00,0xfd,0xff,0xf6,0x00,0xeb,0x00,0xff,0xff,0xf6,0x00,0xeb,0x01,0x00,0xff,0xf6, -0x00,0xeb,0x01,0x08,0xff,0xf6,0x00,0xeb,0x01,0x0b,0xff,0xf6,0x00,0xeb,0x01,0x0d,0xff,0xf6,0x00,0xeb,0x01,0x19,0xff,0xf6,0x00,0xeb,0x01,0x21,0x00,0x06,0x00,0xeb,0x01,0x23,0x00,0x06,0x00,0xeb,0x01,0x48,0xff,0xf6,0x00,0xeb,0x01,0x4c,0xff,0xf6,0x00,0xeb,0x01,0x4e,0xff,0xf6,0x00,0xeb,0x01,0x50,0xff,0xf6,0x00,0xeb,0x01,0x52, -0xff,0xf6,0x00,0xeb,0x01,0x54,0xff,0xf6,0x00,0xeb,0x01,0x56,0xff,0xf6,0x00,0xeb,0x01,0x6f,0xff,0xf6,0x00,0xeb,0x01,0x71,0xff,0xf6,0x00,0xeb,0x01,0x77,0x00,0x06,0x00,0xeb,0x01,0x8a,0xff,0xf6,0x00,0xec,0x00,0x0f,0xfe,0xba,0x00,0xec,0x00,0x11,0xfe,0xba,0x00,0xec,0x00,0x24,0xff,0x62,0x00,0xec,0x00,0x2a,0xff,0xf6,0x00,0xec, -0x00,0x2d,0xff,0x7f,0x00,0xec,0x00,0x3a,0x00,0x27,0x00,0xec,0x00,0x3b,0xff,0xc3,0x00,0xec,0x00,0x44,0xff,0xbe,0x00,0xec,0x00,0x46,0xff,0xb4,0x00,0xec,0x00,0x47,0xff,0xb4,0x00,0xec,0x00,0x48,0xff,0xb4,0x00,0xec,0x00,0x4a,0xff,0xb4,0x00,0xec,0x00,0x52,0xff,0xb4,0x00,0xec,0x00,0x54,0xff,0xb6,0x00,0xec,0x00,0x62,0xff,0x62, -0x00,0xec,0x00,0x63,0xff,0x62,0x00,0xec,0x00,0x69,0xff,0xbe,0x00,0xec,0x00,0x6a,0xff,0xbe,0x00,0xec,0x00,0x6b,0xff,0xbe,0x00,0xec,0x00,0x6c,0xff,0xbe,0x00,0xec,0x00,0x6d,0xff,0xbe,0x00,0xec,0x00,0x6e,0xff,0xbe,0x00,0xec,0x00,0x6f,0xff,0xb4,0x00,0xec,0x00,0x70,0xff,0xb4,0x00,0xec,0x00,0x71,0xff,0xb4,0x00,0xec,0x00,0x72, -0xff,0xb4,0x00,0xec,0x00,0x73,0xff,0xb4,0x00,0xec,0x00,0x79,0xff,0xb4,0x00,0xec,0x00,0x7a,0xff,0xb4,0x00,0xec,0x00,0x7b,0xff,0xb4,0x00,0xec,0x00,0x7c,0xff,0xb4,0x00,0xec,0x00,0x7d,0xff,0xb4,0x00,0xec,0x00,0x91,0xfe,0xe9,0x00,0xec,0x00,0xa0,0xff,0xbe,0x00,0xec,0x00,0xac,0xfe,0xba,0x00,0xec,0x00,0xad,0xff,0x62,0x00,0xec, -0x00,0xae,0xff,0x62,0x00,0xec,0x00,0xb1,0xff,0xb4,0x00,0xec,0x00,0xc4,0xfe,0xba,0x00,0xec,0x00,0xc5,0xfe,0xae,0x00,0xec,0x00,0xc7,0xff,0x62,0x00,0xec,0x00,0xc9,0xff,0x62,0x00,0xec,0x00,0xf7,0xff,0xf6,0x00,0xec,0x00,0xf8,0xff,0xb4,0x00,0xec,0x00,0xfd,0xff,0xb4,0x00,0xec,0x00,0xff,0xff,0xb4,0x00,0xec,0x01,0x00,0xff,0xb4, -0x00,0xec,0x01,0x03,0xff,0x62,0x00,0xec,0x01,0x04,0xff,0xbe,0x00,0xec,0x01,0x05,0xff,0x62,0x00,0xec,0x01,0x06,0xff,0xbe,0x00,0xec,0x01,0x08,0xff,0xb4,0x00,0xec,0x01,0x0b,0xff,0xb4,0x00,0xec,0x01,0x0d,0xff,0xb4,0x00,0xec,0x01,0x19,0xff,0xb4,0x00,0xec,0x01,0x45,0xff,0x62,0x00,0xec,0x01,0x46,0xff,0xbe,0x00,0xec,0x01,0x48, -0xff,0xb4,0x00,0xec,0x01,0x4c,0xff,0xb4,0x00,0xec,0x01,0x4e,0xff,0xb4,0x00,0xec,0x01,0x50,0xff,0xb4,0x00,0xec,0x01,0x51,0xff,0xf6,0x00,0xec,0x01,0x52,0xff,0xb4,0x00,0xec,0x01,0x53,0xff,0xf6,0x00,0xec,0x01,0x54,0xff,0xb4,0x00,0xec,0x01,0x55,0xff,0xf6,0x00,0xec,0x01,0x56,0xff,0xb4,0x00,0xec,0x01,0x63,0xff,0x7f,0x00,0xec, -0x01,0x6f,0xff,0xb4,0x00,0xec,0x01,0x71,0xff,0xb4,0x00,0xec,0x01,0x80,0x00,0x27,0x00,0xec,0x01,0x85,0xff,0x62,0x00,0xec,0x01,0x86,0xff,0xbe,0x00,0xec,0x01,0x87,0xff,0x62,0x00,0xec,0x01,0x88,0xff,0xbe,0x00,0xec,0x01,0x8a,0xff,0xb4,0x00,0xec,0x01,0x8c,0x00,0x27,0x00,0xec,0x01,0x8e,0x00,0x27,0x00,0xec,0x01,0x90,0x00,0x27, -0x00,0xed,0x00,0x44,0xff,0xe5,0x00,0xed,0x00,0x49,0xff,0xf6,0x00,0xed,0x00,0x5b,0xff,0xe7,0x00,0xed,0x00,0x69,0xff,0xe5,0x00,0xed,0x00,0x6a,0xff,0xe5,0x00,0xed,0x00,0x6b,0xff,0xe5,0x00,0xed,0x00,0x6c,0xff,0xe5,0x00,0xed,0x00,0x6d,0xff,0xe5,0x00,0xed,0x00,0x6e,0xff,0xe5,0x00,0xed,0x00,0xa0,0xff,0xe5,0x00,0xed,0x00,0xc0, -0xff,0xf6,0x00,0xed,0x00,0xc1,0xff,0xf6,0x00,0xed,0x01,0x04,0xff,0xe5,0x00,0xed,0x01,0x06,0xff,0xe5,0x00,0xed,0x01,0x46,0xff,0xe5,0x00,0xed,0x01,0x86,0xff,0xe5,0x00,0xed,0x01,0x88,0xff,0xe5,0x00,0xf7,0x00,0x37,0xff,0xcf,0x00,0xf7,0x00,0x39,0xff,0xe5,0x00,0xf7,0x00,0x5c,0xff,0xe5,0x00,0xf7,0x00,0xba,0xff,0xe5,0x00,0xf7, -0x00,0xeb,0xff,0xe5,0x00,0xf7,0x01,0x20,0xff,0xcf,0x00,0xf7,0x01,0x22,0xff,0xcf,0x00,0xf7,0x01,0x76,0xff,0xcf,0x00,0xf7,0x01,0x83,0xff,0xe5,0x00,0xf7,0x01,0x93,0xff,0xe5,0x00,0xf8,0x00,0x4d,0x00,0x2f,0x00,0xf8,0x01,0x64,0x00,0x2f,0x00,0xfa,0x00,0x57,0xff,0xbe,0x00,0xfa,0x00,0x59,0xff,0xcf,0x00,0xfa,0x00,0x5a,0xff,0xe5, -0x00,0xfa,0x00,0x5c,0xff,0xd1,0x00,0xfa,0x00,0xba,0xff,0xbe,0x00,0xfa,0x00,0xc4,0xff,0xb2,0x00,0xfa,0x00,0xc5,0xff,0xb2,0x00,0xfa,0x00,0xeb,0xff,0xd1,0x00,0xfa,0x01,0x21,0xff,0xbe,0x00,0xfa,0x01,0x23,0xff,0xbe,0x00,0xfa,0x01,0x77,0xff,0xbe,0x00,0xfa,0x01,0x81,0xff,0xe5,0x00,0xfa,0x01,0x83,0xff,0xd1,0x00,0xfa,0x01,0x8d, -0xff,0xe5,0x00,0xfa,0x01,0x8f,0xff,0xe5,0x00,0xfa,0x01,0x91,0xff,0xe5,0x00,0xfa,0x01,0x93,0xff,0xd1,0x00,0xfc,0x00,0x26,0xff,0xc9,0x00,0xfc,0x00,0x2a,0xff,0xc9,0x00,0xfc,0x00,0x32,0xff,0xe5,0x00,0xfc,0x00,0x34,0xff,0xc9,0x00,0xfc,0x00,0x64,0xff,0xc9,0x00,0xfc,0x00,0x67,0xff,0xc9,0x00,0xfc,0x00,0x77,0x00,0x1d,0x00,0xfc, -0x00,0x92,0xff,0xc9,0x00,0xfc,0x00,0xaa,0xff,0xcf,0x00,0xfc,0x00,0xaf,0xff,0xc9,0x00,0xfc,0x00,0xb0,0xff,0xc9,0x00,0xfc,0x00,0xbe,0xff,0xcf,0x00,0xfc,0x00,0xd0,0xff,0xc9,0x00,0xfc,0x00,0xd1,0xff,0xc9,0x00,0xfc,0x00,0xd2,0xff,0xc9,0x00,0xfc,0x00,0xf7,0xff,0xc9,0x00,0xfc,0x00,0xfc,0xff,0xc9,0x00,0xfc,0x00,0xfe,0xff,0xc9, -0x00,0xfc,0x01,0x18,0xff,0xe5,0x00,0xfc,0x01,0x47,0xff,0xc9,0x00,0xfc,0x01,0x51,0xff,0xc9,0x00,0xfc,0x01,0x53,0xff,0xc9,0x00,0xfc,0x01,0x55,0xff,0xc9,0x00,0xfc,0x01,0x5c,0x00,0x1d,0x00,0xfc,0x01,0x5e,0x00,0x1d,0x00,0xfc,0x01,0x60,0x00,0x1d,0x00,0xfc,0x01,0x6e,0xff,0xe5,0x00,0xfc,0x01,0x70,0xff,0xe5,0x00,0xfc,0x01,0x89, -0xff,0xe5,0x00,0xfd,0x00,0x2d,0x00,0x46,0x00,0xfd,0x00,0x37,0xff,0x9a,0x00,0xfd,0x00,0x3c,0xff,0xb4,0x00,0xfd,0x00,0xea,0xff,0xb4,0x00,0xfd,0x01,0x20,0xff,0x9a,0x00,0xfd,0x01,0x22,0xff,0x9a,0x00,0xfd,0x01,0x63,0x00,0x46,0x00,0xfd,0x01,0x76,0xff,0x9a,0x00,0xfd,0x01,0x82,0xff,0xb4,0x00,0xfd,0x01,0x92,0xff,0xb4,0x00,0xfe, -0x00,0x26,0xff,0xc9,0x00,0xfe,0x00,0x2a,0xff,0xc9,0x00,0xfe,0x00,0x32,0xff,0xe5,0x00,0xfe,0x00,0x34,0xff,0xc9,0x00,0xfe,0x00,0x64,0xff,0xc9,0x00,0xfe,0x00,0x67,0xff,0xc9,0x00,0xfe,0x00,0x77,0x00,0x1d,0x00,0xfe,0x00,0x92,0xff,0xc9,0x00,0xfe,0x00,0xaa,0xff,0xcf,0x00,0xfe,0x00,0xaf,0xff,0xc9,0x00,0xfe,0x00,0xb0,0xff,0xc9, -0x00,0xfe,0x00,0xbe,0xff,0xcf,0x00,0xfe,0x00,0xd0,0xff,0xc9,0x00,0xfe,0x00,0xd1,0xff,0xc9,0x00,0xfe,0x00,0xd2,0xff,0xc9,0x00,0xfe,0x00,0xf7,0xff,0xc9,0x00,0xfe,0x00,0xfc,0xff,0xc9,0x00,0xfe,0x00,0xfe,0xff,0xc9,0x00,0xfe,0x01,0x18,0xff,0xe5,0x00,0xfe,0x01,0x47,0xff,0xc9,0x00,0xfe,0x01,0x51,0xff,0xc9,0x00,0xfe,0x01,0x53, -0xff,0xc9,0x00,0xfe,0x01,0x55,0xff,0xc9,0x00,0xfe,0x01,0x5c,0x00,0x1d,0x00,0xfe,0x01,0x5e,0x00,0x1d,0x00,0xfe,0x01,0x60,0x00,0x1d,0x00,0xfe,0x01,0x6e,0xff,0xe5,0x00,0xfe,0x01,0x70,0xff,0xe5,0x00,0xfe,0x01,0x89,0xff,0xe5,0x00,0xff,0x00,0x2d,0x00,0x46,0x00,0xff,0x00,0x37,0xff,0x9a,0x00,0xff,0x00,0x3c,0xff,0xb4,0x00,0xff, -0x00,0xea,0xff,0xb4,0x00,0xff,0x01,0x20,0xff,0x9a,0x00,0xff,0x01,0x22,0xff,0x9a,0x00,0xff,0x01,0x63,0x00,0x46,0x00,0xff,0x01,0x76,0xff,0x9a,0x00,0xff,0x01,0x82,0xff,0xb4,0x00,0xff,0x01,0x92,0xff,0xb4,0x01,0x03,0x00,0x0d,0xff,0x7f,0x01,0x03,0x00,0x0f,0x00,0x44,0x01,0x03,0x00,0x1e,0x00,0x44,0x01,0x03,0x00,0x26,0xff,0xe5, -0x01,0x03,0x00,0x2a,0xff,0xe5,0x01,0x03,0x00,0x2d,0x00,0x5e,0x01,0x03,0x00,0x32,0xff,0xe5,0x01,0x03,0x00,0x37,0xff,0x6d,0x01,0x03,0x00,0x38,0xff,0xe5,0x01,0x03,0x00,0x39,0xff,0x8b,0x01,0x03,0x00,0x3a,0xff,0xb6,0x01,0x03,0x00,0x3c,0xff,0x64,0x01,0x03,0x00,0x3d,0x00,0x3b,0x01,0x03,0x00,0x57,0xff,0xe5,0x01,0x03,0x00,0x59, -0xff,0xd5,0x01,0x03,0x00,0x5a,0xff,0xe5,0x01,0x03,0x00,0x5c,0xff,0xdb,0x01,0x03,0x00,0x8d,0xff,0x9a,0x01,0x03,0x00,0xb4,0xff,0x66,0x01,0x03,0x00,0xb5,0xff,0x3f,0x01,0x03,0x00,0xb6,0xff,0x66,0x01,0x03,0x00,0xb7,0xff,0x3f,0x01,0x03,0x00,0xba,0xff,0xc1,0x01,0x03,0x00,0xbb,0xff,0x64,0x01,0x03,0x00,0xe5,0x00,0x3b,0x01,0x03, -0x00,0xea,0xff,0x64,0x01,0x03,0x00,0xeb,0xff,0xdb,0x01,0x03,0x00,0xf7,0xff,0xe5,0x01,0x03,0x00,0xfc,0xff,0xe5,0x01,0x03,0x00,0xfe,0xff,0xe5,0x01,0x03,0x01,0x18,0xff,0xe5,0x01,0x03,0x01,0x20,0xff,0x6d,0x01,0x03,0x01,0x21,0xff,0xe5,0x01,0x03,0x01,0x22,0xff,0x6d,0x01,0x03,0x01,0x23,0xff,0xe5,0x01,0x03,0x01,0x24,0xff,0xe5, -0x01,0x03,0x01,0x26,0xff,0xe5,0x01,0x03,0x01,0x28,0x00,0x3b,0x01,0x03,0x01,0x2a,0x00,0x3b,0x01,0x03,0x01,0x47,0xff,0xe5,0x01,0x03,0x01,0x51,0xff,0xe5,0x01,0x03,0x01,0x53,0xff,0xe5,0x01,0x03,0x01,0x55,0xff,0xe5,0x01,0x03,0x01,0x63,0x00,0x5e,0x01,0x03,0x01,0x6e,0xff,0xe5,0x01,0x03,0x01,0x70,0xff,0xe5,0x01,0x03,0x01,0x76, -0xff,0x6d,0x01,0x03,0x01,0x77,0xff,0xe5,0x01,0x03,0x01,0x78,0xff,0xe5,0x01,0x03,0x01,0x7a,0xff,0xe5,0x01,0x03,0x01,0x7c,0xff,0xe5,0x01,0x03,0x01,0x7e,0xff,0xe5,0x01,0x03,0x01,0x80,0xff,0xb6,0x01,0x03,0x01,0x81,0xff,0xe5,0x01,0x03,0x01,0x82,0xff,0x64,0x01,0x03,0x01,0x83,0xff,0xdb,0x01,0x03,0x01,0x89,0xff,0xe5,0x01,0x03, -0x01,0x8c,0xff,0xb6,0x01,0x03,0x01,0x8d,0xff,0xe5,0x01,0x03,0x01,0x8e,0xff,0xb6,0x01,0x03,0x01,0x8f,0xff,0xe5,0x01,0x03,0x01,0x90,0xff,0xb6,0x01,0x03,0x01,0x91,0xff,0xe5,0x01,0x03,0x01,0x92,0xff,0x64,0x01,0x03,0x01,0x93,0xff,0xdb,0x01,0x05,0x00,0x0d,0xff,0x7f,0x01,0x05,0x00,0x0f,0x00,0x44,0x01,0x05,0x00,0x1e,0x00,0x44, -0x01,0x05,0x00,0x26,0xff,0xe5,0x01,0x05,0x00,0x2a,0xff,0xe5,0x01,0x05,0x00,0x2d,0x00,0x5e,0x01,0x05,0x00,0x32,0xff,0xe5,0x01,0x05,0x00,0x37,0xff,0x6d,0x01,0x05,0x00,0x38,0xff,0xe5,0x01,0x05,0x00,0x39,0xff,0x8b,0x01,0x05,0x00,0x3a,0xff,0xb6,0x01,0x05,0x00,0x3c,0xff,0x64,0x01,0x05,0x00,0x3d,0x00,0x3b,0x01,0x05,0x00,0x57, -0xff,0xe5,0x01,0x05,0x00,0x59,0xff,0xd5,0x01,0x05,0x00,0x5a,0xff,0xe5,0x01,0x05,0x00,0x5c,0xff,0xdb,0x01,0x05,0x00,0x8d,0xff,0x9a,0x01,0x05,0x00,0xb4,0xff,0x66,0x01,0x05,0x00,0xb5,0xff,0x3f,0x01,0x05,0x00,0xb6,0xff,0x66,0x01,0x05,0x00,0xb7,0xff,0x3f,0x01,0x05,0x00,0xba,0xff,0xc1,0x01,0x05,0x00,0xbb,0xff,0x64,0x01,0x05, -0x00,0xe5,0x00,0x3b,0x01,0x05,0x00,0xea,0xff,0x64,0x01,0x05,0x00,0xeb,0xff,0xdb,0x01,0x05,0x00,0xf7,0xff,0xe5,0x01,0x05,0x00,0xfc,0xff,0xe5,0x01,0x05,0x00,0xfe,0xff,0xe5,0x01,0x05,0x01,0x18,0xff,0xe5,0x01,0x05,0x01,0x20,0xff,0x6d,0x01,0x05,0x01,0x21,0xff,0xe5,0x01,0x05,0x01,0x22,0xff,0x6d,0x01,0x05,0x01,0x23,0xff,0xe5, -0x01,0x05,0x01,0x24,0xff,0xe5,0x01,0x05,0x01,0x26,0xff,0xe5,0x01,0x05,0x01,0x28,0x00,0x3b,0x01,0x05,0x01,0x2a,0x00,0x3b,0x01,0x05,0x01,0x47,0xff,0xe5,0x01,0x05,0x01,0x51,0xff,0xe5,0x01,0x05,0x01,0x53,0xff,0xe5,0x01,0x05,0x01,0x55,0xff,0xe5,0x01,0x05,0x01,0x63,0x00,0x5e,0x01,0x05,0x01,0x6e,0xff,0xe5,0x01,0x05,0x01,0x70, -0xff,0xe5,0x01,0x05,0x01,0x76,0xff,0x6d,0x01,0x05,0x01,0x77,0xff,0xe5,0x01,0x05,0x01,0x78,0xff,0xe5,0x01,0x05,0x01,0x7a,0xff,0xe5,0x01,0x05,0x01,0x7c,0xff,0xe5,0x01,0x05,0x01,0x7e,0xff,0xe5,0x01,0x05,0x01,0x80,0xff,0xb6,0x01,0x05,0x01,0x81,0xff,0xe5,0x01,0x05,0x01,0x82,0xff,0x64,0x01,0x05,0x01,0x83,0xff,0xdb,0x01,0x05, -0x01,0x89,0xff,0xe5,0x01,0x05,0x01,0x8c,0xff,0xb6,0x01,0x05,0x01,0x8d,0xff,0xe5,0x01,0x05,0x01,0x8e,0xff,0xb6,0x01,0x05,0x01,0x8f,0xff,0xe5,0x01,0x05,0x01,0x90,0xff,0xb6,0x01,0x05,0x01,0x91,0xff,0xe5,0x01,0x05,0x01,0x92,0xff,0x64,0x01,0x05,0x01,0x93,0xff,0xdb,0x01,0x07,0x00,0x0f,0xff,0x7f,0x01,0x07,0x00,0x11,0xff,0x7f, -0x01,0x07,0x00,0x24,0xff,0xdf,0x01,0x07,0x00,0x37,0xff,0xa4,0x01,0x07,0x00,0x3b,0xff,0xcb,0x01,0x07,0x00,0x3d,0xff,0xcf,0x01,0x07,0x00,0x62,0xff,0xdf,0x01,0x07,0x00,0x63,0xff,0xdf,0x01,0x07,0x00,0x91,0xff,0xb6,0x01,0x07,0x00,0xac,0xff,0x7f,0x01,0x07,0x00,0xad,0xff,0xdf,0x01,0x07,0x00,0xae,0xff,0xdf,0x01,0x07,0x00,0xbb, -0xff,0xf6,0x01,0x07,0x00,0xc4,0xff,0x8b,0x01,0x07,0x00,0xc5,0xff,0x8b,0x01,0x07,0x00,0xc7,0xff,0xdf,0x01,0x07,0x00,0xc9,0xff,0xdf,0x01,0x07,0x00,0xe5,0xff,0xcf,0x01,0x07,0x01,0x03,0xff,0xdf,0x01,0x07,0x01,0x05,0xff,0xdf,0x01,0x07,0x01,0x20,0xff,0xa4,0x01,0x07,0x01,0x22,0xff,0xa4,0x01,0x07,0x01,0x28,0xff,0xcf,0x01,0x07, -0x01,0x2a,0xff,0xcf,0x01,0x07,0x01,0x45,0xff,0xdf,0x01,0x07,0x01,0x76,0xff,0xa4,0x01,0x07,0x01,0x85,0xff,0xdf,0x01,0x07,0x01,0x87,0xff,0xdf,0x01,0x0a,0x00,0x24,0x00,0x0a,0x01,0x0a,0x00,0x2d,0x00,0x44,0x01,0x0a,0x00,0x37,0x00,0x04,0x01,0x0a,0x00,0x3a,0x00,0x1d,0x01,0x0a,0x00,0x3b,0x00,0x08,0x01,0x0a,0x00,0x62,0x00,0x0a, -0x01,0x0a,0x00,0x63,0x00,0x0a,0x01,0x0a,0x00,0x77,0x00,0x12,0x01,0x0a,0x00,0xad,0x00,0x0a,0x01,0x0a,0x00,0xae,0x00,0x0a,0x01,0x0a,0x00,0xc7,0x00,0x0a,0x01,0x0a,0x00,0xc9,0x00,0x0a,0x01,0x0a,0x01,0x03,0x00,0x0a,0x01,0x0a,0x01,0x05,0x00,0x0a,0x01,0x0a,0x01,0x20,0x00,0x04,0x01,0x0a,0x01,0x22,0x00,0x04,0x01,0x0a,0x01,0x45, -0x00,0x0a,0x01,0x0a,0x01,0x5c,0x00,0x12,0x01,0x0a,0x01,0x5e,0x00,0x12,0x01,0x0a,0x01,0x60,0x00,0x12,0x01,0x0a,0x01,0x63,0x00,0x44,0x01,0x0a,0x01,0x76,0x00,0x04,0x01,0x0a,0x01,0x80,0x00,0x1d,0x01,0x0a,0x01,0x85,0x00,0x0a,0x01,0x0a,0x01,0x87,0x00,0x0a,0x01,0x0a,0x01,0x8c,0x00,0x1d,0x01,0x0a,0x01,0x8e,0x00,0x1d,0x01,0x0a, -0x01,0x90,0x00,0x1d,0x01,0x0b,0x00,0x05,0xff,0x98,0x01,0x0b,0x00,0x0a,0xff,0x98,0x01,0x0c,0x00,0x24,0x00,0x0a,0x01,0x0c,0x00,0x2d,0x00,0x44,0x01,0x0c,0x00,0x37,0x00,0x04,0x01,0x0c,0x00,0x3a,0x00,0x1d,0x01,0x0c,0x00,0x3b,0x00,0x08,0x01,0x0c,0x00,0x62,0x00,0x0a,0x01,0x0c,0x00,0x63,0x00,0x0a,0x01,0x0c,0x00,0x77,0x00,0x12, -0x01,0x0c,0x00,0xad,0x00,0x0a,0x01,0x0c,0x00,0xae,0x00,0x0a,0x01,0x0c,0x00,0xc7,0x00,0x0a,0x01,0x0c,0x00,0xc9,0x00,0x0a,0x01,0x0c,0x01,0x03,0x00,0x0a,0x01,0x0c,0x01,0x05,0x00,0x0a,0x01,0x0c,0x01,0x20,0x00,0x04,0x01,0x0c,0x01,0x22,0x00,0x04,0x01,0x0c,0x01,0x45,0x00,0x0a,0x01,0x0c,0x01,0x5c,0x00,0x12,0x01,0x0c,0x01,0x5e, -0x00,0x12,0x01,0x0c,0x01,0x60,0x00,0x12,0x01,0x0c,0x01,0x63,0x00,0x44,0x01,0x0c,0x01,0x76,0x00,0x04,0x01,0x0c,0x01,0x80,0x00,0x1d,0x01,0x0c,0x01,0x85,0x00,0x0a,0x01,0x0c,0x01,0x87,0x00,0x0a,0x01,0x0c,0x01,0x8c,0x00,0x1d,0x01,0x0c,0x01,0x8e,0x00,0x1d,0x01,0x0c,0x01,0x90,0x00,0x1d,0x01,0x0d,0x00,0x05,0xff,0x98,0x01,0x0d, -0x00,0x0a,0xff,0x98,0x01,0x0e,0x00,0x0d,0xff,0x31,0x01,0x0e,0x00,0x22,0xff,0x9a,0x01,0x0e,0x00,0x24,0x00,0x3b,0x01,0x0e,0x00,0x26,0xff,0xbe,0x01,0x0e,0x00,0x2a,0xff,0xbe,0x01,0x0e,0x00,0x2d,0x00,0x64,0x01,0x0e,0x00,0x32,0xff,0xba,0x01,0x0e,0x00,0x34,0xff,0xba,0x01,0x0e,0x00,0x37,0xff,0x8f,0x01,0x0e,0x00,0x38,0xff,0xe3, -0x01,0x0e,0x00,0x39,0xff,0x8b,0x01,0x0e,0x00,0x3a,0xff,0xcf,0x01,0x0e,0x00,0x3c,0xff,0x7f,0x01,0x0e,0x00,0x3d,0x00,0x3b,0x01,0x0e,0x00,0x57,0xff,0xe5,0x01,0x0e,0x00,0x59,0xff,0x9a,0x01,0x0e,0x00,0x5a,0xff,0xbe,0x01,0x0e,0x00,0x5c,0xff,0xb4,0x01,0x0e,0x00,0x64,0xff,0xbe,0x01,0x0e,0x00,0x67,0xff,0xba,0x01,0x0e,0x00,0x68, -0xff,0xe3,0x01,0x0e,0x00,0x8d,0xff,0x9a,0x01,0x0e,0x00,0x92,0xff,0xba,0x01,0x0e,0x00,0xaf,0xff,0xba,0x01,0x0e,0x00,0xb0,0xff,0xba,0x01,0x0e,0x00,0xb4,0xff,0x73,0x01,0x0e,0x00,0xb5,0xff,0x8b,0x01,0x0e,0x00,0xb6,0xff,0x73,0x01,0x0e,0x00,0xb7,0xff,0x7f,0x01,0x0e,0x00,0xba,0xff,0xb4,0x01,0x0e,0x00,0xbb,0xff,0x9a,0x01,0x0e, -0x00,0xc4,0x00,0x44,0x01,0x0e,0x00,0xc5,0x00,0x44,0x01,0x0e,0x00,0xd0,0xff,0xba,0x01,0x0e,0x00,0xd1,0xff,0xba,0x01,0x0e,0x00,0xd2,0xff,0xba,0x01,0x0e,0x00,0xd3,0xff,0xe3,0x01,0x0e,0x00,0xd4,0xff,0xe3,0x01,0x0e,0x00,0xd5,0xff,0xe3,0x01,0x0e,0x00,0xe5,0x00,0x3b,0x01,0x0e,0x00,0xea,0xff,0x7f,0x01,0x0e,0x00,0xeb,0xff,0xb4, -0x01,0x0e,0x00,0xf7,0xff,0xbe,0x01,0x0e,0x00,0xfc,0xff,0xbe,0x01,0x0e,0x00,0xfe,0xff,0xbe,0x01,0x0e,0x01,0x03,0x00,0x3b,0x01,0x0e,0x01,0x05,0x00,0x3b,0x01,0x0e,0x01,0x18,0xff,0xba,0x01,0x0e,0x01,0x20,0xff,0x8f,0x01,0x0e,0x01,0x21,0xff,0xe5,0x01,0x0e,0x01,0x22,0xff,0x8f,0x01,0x0e,0x01,0x23,0xff,0xe5,0x01,0x0e,0x01,0x24, -0xff,0xe3,0x01,0x0e,0x01,0x26,0xff,0xe3,0x01,0x0e,0x01,0x28,0x00,0x3b,0x01,0x0e,0x01,0x2a,0x00,0x3b,0x01,0x0e,0x01,0x45,0x00,0x3b,0x01,0x0e,0x01,0x47,0xff,0xbe,0x01,0x0e,0x01,0x51,0xff,0xbe,0x01,0x0e,0x01,0x53,0xff,0xbe,0x01,0x0e,0x01,0x55,0xff,0xbe,0x01,0x0e,0x01,0x63,0x00,0x64,0x01,0x0e,0x01,0x6e,0xff,0xba,0x01,0x0e, -0x01,0x70,0xff,0xba,0x01,0x0e,0x01,0x76,0xff,0x8f,0x01,0x0e,0x01,0x77,0xff,0xe5,0x01,0x0e,0x01,0x78,0xff,0xe3,0x01,0x0e,0x01,0x7a,0xff,0xe3,0x01,0x0e,0x01,0x7c,0xff,0xe3,0x01,0x0e,0x01,0x7e,0xff,0xe3,0x01,0x0e,0x01,0x80,0xff,0xcf,0x01,0x0e,0x01,0x81,0xff,0xbe,0x01,0x0e,0x01,0x82,0xff,0x7f,0x01,0x0e,0x01,0x83,0xff,0xb4, -0x01,0x0e,0x01,0x85,0x00,0x3b,0x01,0x0e,0x01,0x87,0x00,0x3b,0x01,0x0e,0x01,0x89,0xff,0xba,0x01,0x0e,0x01,0x8c,0xff,0xcf,0x01,0x0e,0x01,0x8d,0xff,0xbe,0x01,0x0e,0x01,0x8e,0xff,0xcf,0x01,0x0e,0x01,0x8f,0xff,0xbe,0x01,0x0e,0x01,0x90,0xff,0xcf,0x01,0x0e,0x01,0x91,0xff,0xbe,0x01,0x0e,0x01,0x92,0xff,0x7f,0x01,0x0e,0x01,0x93, -0xff,0xb4,0x01,0x10,0x00,0x0d,0xff,0x31,0x01,0x10,0x00,0x22,0xff,0x9a,0x01,0x10,0x00,0x24,0x00,0x3b,0x01,0x10,0x00,0x26,0xff,0xbe,0x01,0x10,0x00,0x2a,0xff,0xbe,0x01,0x10,0x00,0x2d,0x00,0x64,0x01,0x10,0x00,0x32,0xff,0xba,0x01,0x10,0x00,0x34,0xff,0xba,0x01,0x10,0x00,0x37,0xff,0x8f,0x01,0x10,0x00,0x38,0xff,0xe3,0x01,0x10, -0x00,0x39,0xff,0x8b,0x01,0x10,0x00,0x3a,0xff,0xcf,0x01,0x10,0x00,0x3c,0xff,0x7f,0x01,0x10,0x00,0x3d,0x00,0x3b,0x01,0x10,0x00,0x57,0xff,0xe5,0x01,0x10,0x00,0x59,0xff,0x9a,0x01,0x10,0x00,0x5a,0xff,0xbe,0x01,0x10,0x00,0x5c,0xff,0xb4,0x01,0x10,0x00,0x64,0xff,0xbe,0x01,0x10,0x00,0x67,0xff,0xba,0x01,0x10,0x00,0x68,0xff,0xe3, -0x01,0x10,0x00,0x8d,0xff,0x9a,0x01,0x10,0x00,0x92,0xff,0xba,0x01,0x10,0x00,0xaf,0xff,0xba,0x01,0x10,0x00,0xb0,0xff,0xba,0x01,0x10,0x00,0xb4,0xff,0x73,0x01,0x10,0x00,0xb5,0xff,0x8b,0x01,0x10,0x00,0xb6,0xff,0x73,0x01,0x10,0x00,0xb7,0xff,0x7f,0x01,0x10,0x00,0xba,0xff,0xb4,0x01,0x10,0x00,0xbb,0xff,0x9a,0x01,0x10,0x00,0xc4, -0x00,0x44,0x01,0x10,0x00,0xc5,0x00,0x44,0x01,0x10,0x00,0xd0,0xff,0xba,0x01,0x10,0x00,0xd1,0xff,0xba,0x01,0x10,0x00,0xd2,0xff,0xba,0x01,0x10,0x00,0xd3,0xff,0xe3,0x01,0x10,0x00,0xd4,0xff,0xe3,0x01,0x10,0x00,0xd5,0xff,0xe3,0x01,0x10,0x00,0xe5,0x00,0x3b,0x01,0x10,0x00,0xea,0xff,0x7f,0x01,0x10,0x00,0xeb,0xff,0xb4,0x01,0x10, -0x00,0xf7,0xff,0xbe,0x01,0x10,0x00,0xfc,0xff,0xbe,0x01,0x10,0x00,0xfe,0xff,0xbe,0x01,0x10,0x01,0x03,0x00,0x3b,0x01,0x10,0x01,0x05,0x00,0x3b,0x01,0x10,0x01,0x20,0xff,0x8f,0x01,0x10,0x01,0x21,0xff,0xe5,0x01,0x10,0x01,0x22,0xff,0x8f,0x01,0x10,0x01,0x23,0xff,0xe5,0x01,0x10,0x01,0x24,0xff,0xe3,0x01,0x10,0x01,0x26,0xff,0xe3, -0x01,0x10,0x01,0x28,0x00,0x3b,0x01,0x10,0x01,0x2a,0x00,0x3b,0x01,0x10,0x01,0x45,0x00,0x3b,0x01,0x10,0x01,0x47,0xff,0xbe,0x01,0x10,0x01,0x51,0xff,0xbe,0x01,0x10,0x01,0x53,0xff,0xbe,0x01,0x10,0x01,0x55,0xff,0xbe,0x01,0x10,0x01,0x63,0x00,0x64,0x01,0x10,0x01,0x6e,0xff,0xba,0x01,0x10,0x01,0x70,0xff,0xba,0x01,0x10,0x01,0x76, -0xff,0x8f,0x01,0x10,0x01,0x77,0xff,0xe5,0x01,0x10,0x01,0x78,0xff,0xe3,0x01,0x10,0x01,0x7a,0xff,0xe3,0x01,0x10,0x01,0x7c,0xff,0xe3,0x01,0x10,0x01,0x7e,0xff,0xe3,0x01,0x10,0x01,0x80,0xff,0xcf,0x01,0x10,0x01,0x81,0xff,0xbe,0x01,0x10,0x01,0x82,0xff,0x7f,0x01,0x10,0x01,0x83,0xff,0xb4,0x01,0x10,0x01,0x85,0x00,0x3b,0x01,0x10, -0x01,0x87,0x00,0x3b,0x01,0x10,0x01,0x89,0xff,0xba,0x01,0x10,0x01,0x8c,0xff,0xcf,0x01,0x10,0x01,0x8d,0xff,0xbe,0x01,0x10,0x01,0x8e,0xff,0xcf,0x01,0x10,0x01,0x8f,0xff,0xbe,0x01,0x10,0x01,0x90,0xff,0xcf,0x01,0x10,0x01,0x91,0xff,0xbe,0x01,0x10,0x01,0x92,0xff,0x7f,0x01,0x10,0x01,0x93,0xff,0xb4,0x01,0x12,0x00,0x0d,0xff,0x31, -0x01,0x12,0x00,0x22,0xff,0x9a,0x01,0x12,0x00,0x24,0x00,0x3b,0x01,0x12,0x00,0x26,0xff,0xbe,0x01,0x12,0x00,0x2a,0xff,0xbe,0x01,0x12,0x00,0x2d,0x00,0x64,0x01,0x12,0x00,0x32,0xff,0xba,0x01,0x12,0x00,0x34,0xff,0xba,0x01,0x12,0x00,0x37,0xff,0x8f,0x01,0x12,0x00,0x38,0xff,0xe3,0x01,0x12,0x00,0x39,0xff,0x8b,0x01,0x12,0x00,0x3a, -0xff,0xcf,0x01,0x12,0x00,0x3c,0xff,0x7f,0x01,0x12,0x00,0x3d,0x00,0x3b,0x01,0x12,0x00,0x57,0xff,0xe5,0x01,0x12,0x00,0x59,0xff,0x9a,0x01,0x12,0x00,0x5a,0xff,0xbe,0x01,0x12,0x00,0x5c,0xff,0xb4,0x01,0x12,0x00,0x64,0xff,0xbe,0x01,0x12,0x00,0x67,0xff,0xba,0x01,0x12,0x00,0x68,0xff,0xe3,0x01,0x12,0x00,0x8d,0xff,0x9a,0x01,0x12, -0x00,0x92,0xff,0xba,0x01,0x12,0x00,0xaf,0xff,0xba,0x01,0x12,0x00,0xb0,0xff,0xba,0x01,0x12,0x00,0xb4,0xff,0x73,0x01,0x12,0x00,0xb5,0xff,0x8b,0x01,0x12,0x00,0xb6,0xff,0x73,0x01,0x12,0x00,0xb7,0xff,0x7f,0x01,0x12,0x00,0xba,0xff,0xb4,0x01,0x12,0x00,0xbb,0xff,0x9a,0x01,0x12,0x00,0xc4,0x00,0x44,0x01,0x12,0x00,0xc5,0x00,0x44, -0x01,0x12,0x00,0xd0,0xff,0xba,0x01,0x12,0x00,0xd1,0xff,0xba,0x01,0x12,0x00,0xd2,0xff,0xba,0x01,0x12,0x00,0xd3,0xff,0xe3,0x01,0x12,0x00,0xd4,0xff,0xe3,0x01,0x12,0x00,0xd5,0xff,0xe3,0x01,0x12,0x00,0xe5,0x00,0x3b,0x01,0x12,0x00,0xea,0xff,0x7f,0x01,0x12,0x00,0xeb,0xff,0xb4,0x01,0x12,0x00,0xf7,0xff,0xbe,0x01,0x12,0x00,0xfc, -0xff,0xbe,0x01,0x12,0x00,0xfe,0xff,0xbe,0x01,0x12,0x01,0x03,0x00,0x3b,0x01,0x12,0x01,0x05,0x00,0x3b,0x01,0x12,0x01,0x18,0xff,0xba,0x01,0x12,0x01,0x20,0xff,0x8f,0x01,0x12,0x01,0x21,0xff,0xe5,0x01,0x12,0x01,0x22,0xff,0x8f,0x01,0x12,0x01,0x23,0xff,0xe5,0x01,0x12,0x01,0x24,0xff,0xe3,0x01,0x12,0x01,0x26,0xff,0xe3,0x01,0x12, -0x01,0x28,0x00,0x3b,0x01,0x12,0x01,0x2a,0x00,0x3b,0x01,0x12,0x01,0x45,0x00,0x3b,0x01,0x12,0x01,0x47,0xff,0xbe,0x01,0x12,0x01,0x51,0xff,0xbe,0x01,0x12,0x01,0x53,0xff,0xbe,0x01,0x12,0x01,0x55,0xff,0xbe,0x01,0x12,0x01,0x63,0x00,0x64,0x01,0x12,0x01,0x6e,0xff,0xba,0x01,0x12,0x01,0x70,0xff,0xba,0x01,0x12,0x01,0x76,0xff,0x8f, -0x01,0x12,0x01,0x77,0xff,0xe5,0x01,0x12,0x01,0x78,0xff,0xe3,0x01,0x12,0x01,0x7a,0xff,0xe3,0x01,0x12,0x01,0x7c,0xff,0xe3,0x01,0x12,0x01,0x7e,0xff,0xe3,0x01,0x12,0x01,0x80,0xff,0xcf,0x01,0x12,0x01,0x81,0xff,0xbe,0x01,0x12,0x01,0x82,0xff,0x7f,0x01,0x12,0x01,0x83,0xff,0xb4,0x01,0x12,0x01,0x85,0x00,0x3b,0x01,0x12,0x01,0x87, -0x00,0x3b,0x01,0x12,0x01,0x89,0xff,0xba,0x01,0x12,0x01,0x8c,0xff,0xcf,0x01,0x12,0x01,0x8d,0xff,0xbe,0x01,0x12,0x01,0x8e,0xff,0xcf,0x01,0x12,0x01,0x8f,0xff,0xbe,0x01,0x12,0x01,0x90,0xff,0xcf,0x01,0x12,0x01,0x91,0xff,0xbe,0x01,0x12,0x01,0x92,0xff,0x7f,0x01,0x12,0x01,0x93,0xff,0xb4,0x01,0x15,0x00,0x05,0xff,0x98,0x01,0x15, -0x00,0x0a,0xff,0x98,0x01,0x17,0x00,0x05,0xff,0x98,0x01,0x17,0x00,0x0a,0xff,0x98,0x01,0x18,0x00,0x0f,0xff,0xa4,0x01,0x18,0x00,0x11,0xff,0xa4,0x01,0x18,0x00,0x24,0xff,0xe5,0x01,0x18,0x00,0x2d,0xff,0xf6,0x01,0x18,0x00,0x37,0xff,0xa4,0x01,0x18,0x00,0x3b,0xff,0xdb,0x01,0x18,0x00,0x3c,0xff,0xe7,0x01,0x18,0x00,0x3d,0xff,0xcf, -0x01,0x18,0x00,0x62,0xff,0xe5,0x01,0x18,0x00,0x63,0xff,0xe5,0x01,0x18,0x00,0xac,0xff,0xa4,0x01,0x18,0x00,0xad,0xff,0xe5,0x01,0x18,0x00,0xae,0xff,0xe5,0x01,0x18,0x00,0xbb,0xff,0xf6,0x01,0x18,0x00,0xc4,0xff,0x4c,0x01,0x18,0x00,0xc5,0xff,0x98,0x01,0x18,0x00,0xc7,0xff,0xe5,0x01,0x18,0x00,0xc9,0xff,0xe5,0x01,0x18,0x00,0xe5, -0xff,0xcf,0x01,0x18,0x00,0xea,0xff,0xe7,0x01,0x18,0x01,0x03,0xff,0xe5,0x01,0x18,0x01,0x05,0xff,0xe5,0x01,0x18,0x01,0x20,0xff,0xa4,0x01,0x18,0x01,0x22,0xff,0xa4,0x01,0x18,0x01,0x28,0xff,0xcf,0x01,0x18,0x01,0x2a,0xff,0xcf,0x01,0x18,0x01,0x45,0xff,0xe5,0x01,0x18,0x01,0x63,0xff,0xf6,0x01,0x18,0x01,0x76,0xff,0xa4,0x01,0x18, -0x01,0x82,0xff,0xe7,0x01,0x18,0x01,0x85,0xff,0xe5,0x01,0x18,0x01,0x87,0xff,0xe5,0x01,0x18,0x01,0x92,0xff,0xe7,0x01,0x19,0x00,0x05,0xff,0x6f,0x01,0x19,0x00,0x0a,0xff,0x6f,0x01,0x19,0x00,0x44,0xff,0xe5,0x01,0x19,0x00,0x49,0xff,0xdb,0x01,0x19,0x00,0x5b,0xff,0xe7,0x01,0x19,0x00,0x69,0xff,0xe5,0x01,0x19,0x00,0x6a,0xff,0xe5, -0x01,0x19,0x00,0x6b,0xff,0xe5,0x01,0x19,0x00,0x6c,0xff,0xe5,0x01,0x19,0x00,0x6d,0xff,0xe5,0x01,0x19,0x00,0x6e,0xff,0xe5,0x01,0x19,0x00,0xa0,0xff,0xe5,0x01,0x19,0x00,0xb4,0xff,0xb2,0x01,0x19,0x00,0xb5,0xff,0x7d,0x01,0x19,0x00,0xb6,0xff,0xbe,0x01,0x19,0x00,0xb7,0xff,0x7d,0x01,0x19,0x00,0xc0,0xff,0xe7,0x01,0x19,0x00,0xc1, -0xff,0xe7,0x01,0x19,0x01,0x04,0xff,0xe5,0x01,0x19,0x01,0x06,0xff,0xe5,0x01,0x19,0x01,0x46,0xff,0xe5,0x01,0x19,0x01,0x86,0xff,0xe5,0x01,0x19,0x01,0x88,0xff,0xe5,0x01,0x1a,0x00,0x1e,0x00,0x52,0x01,0x1a,0x00,0x26,0xff,0xe3,0x01,0x1a,0x00,0x2a,0xff,0xe3,0x01,0x1a,0x00,0x2d,0x00,0x39,0x01,0x1a,0x00,0x32,0xff,0xec,0x01,0x1a, -0x00,0x34,0xff,0xec,0x01,0x1a,0x00,0x37,0xff,0xcb,0x01,0x1a,0x00,0x3c,0xff,0xd9,0x01,0x1a,0x00,0x46,0xff,0xcb,0x01,0x1a,0x00,0x47,0xff,0xcb,0x01,0x1a,0x00,0x48,0xff,0xc7,0x01,0x1a,0x00,0x4a,0xff,0xc7,0x01,0x1a,0x00,0x52,0xff,0xc5,0x01,0x1a,0x00,0x54,0xff,0xcb,0x01,0x1a,0x00,0x64,0xff,0xe5,0x01,0x1a,0x00,0x67,0xff,0xec, -0x01,0x1a,0x00,0x6f,0xff,0xbe,0x01,0x1a,0x00,0x70,0xff,0xbe,0x01,0x1a,0x00,0x71,0xff,0xbe,0x01,0x1a,0x00,0x72,0xff,0xbe,0x01,0x1a,0x00,0x73,0xff,0xbe,0x01,0x1a,0x00,0x79,0xff,0xc5,0x01,0x1a,0x00,0x7a,0xff,0xc5,0x01,0x1a,0x00,0x7b,0xff,0xc5,0x01,0x1a,0x00,0x7c,0xff,0xc5,0x01,0x1a,0x00,0x7d,0xff,0xc5,0x01,0x1a,0x00,0x92, -0xff,0xec,0x01,0x1a,0x00,0xaf,0xff,0xec,0x01,0x1a,0x00,0xb0,0xff,0xec,0x01,0x1a,0x00,0xb1,0xff,0xc5,0x01,0x1a,0x00,0xbb,0xff,0xe5,0x01,0x1a,0x00,0xd0,0xff,0xec,0x01,0x1a,0x00,0xd1,0xff,0xec,0x01,0x1a,0x00,0xd2,0xff,0xec,0x01,0x1a,0x00,0xea,0xff,0xd9,0x01,0x1a,0x00,0xf7,0xff,0xe3,0x01,0x1a,0x00,0xf8,0xff,0xc7,0x01,0x1a, -0x00,0xfc,0xff,0xe3,0x01,0x1a,0x00,0xfd,0xff,0xcb,0x01,0x1a,0x00,0xfe,0xff,0xe3,0x01,0x1a,0x00,0xff,0xff,0xcb,0x01,0x1a,0x01,0x00,0xff,0xcb,0x01,0x1a,0x01,0x08,0xff,0xcb,0x01,0x1a,0x01,0x0b,0xff,0xc7,0x01,0x1a,0x01,0x0d,0xff,0xbe,0x01,0x1a,0x01,0x18,0xff,0xec,0x01,0x1a,0x01,0x19,0xff,0xc5,0x01,0x1a,0x01,0x20,0xff,0xcb, -0x01,0x1a,0x01,0x22,0xff,0xcb,0x01,0x1a,0x01,0x47,0xff,0xe3,0x01,0x1a,0x01,0x48,0xff,0xcb,0x01,0x1a,0x01,0x4c,0xff,0xbe,0x01,0x1a,0x01,0x4e,0xff,0xbe,0x01,0x1a,0x01,0x50,0xff,0xbe,0x01,0x1a,0x01,0x51,0xff,0xe3,0x01,0x1a,0x01,0x52,0xff,0xc7,0x01,0x1a,0x01,0x53,0xff,0xe3,0x01,0x1a,0x01,0x54,0xff,0xc7,0x01,0x1a,0x01,0x55, -0xff,0xe3,0x01,0x1a,0x01,0x56,0xff,0xc7,0x01,0x1a,0x01,0x63,0x00,0x39,0x01,0x1a,0x01,0x6e,0xff,0xec,0x01,0x1a,0x01,0x6f,0xff,0xc5,0x01,0x1a,0x01,0x70,0xff,0xec,0x01,0x1a,0x01,0x71,0xff,0xc5,0x01,0x1a,0x01,0x76,0xff,0xcb,0x01,0x1a,0x01,0x82,0xff,0xd9,0x01,0x1a,0x01,0x89,0xff,0xec,0x01,0x1a,0x01,0x8a,0xff,0xc5,0x01,0x1a, -0x01,0x92,0xff,0xd9,0x01,0x1b,0x00,0x0f,0xff,0x62,0x01,0x1b,0x00,0x10,0xff,0x7f,0x01,0x1b,0x00,0x11,0xff,0x56,0x01,0x1b,0x00,0x1d,0x00,0x52,0x01,0x1b,0x00,0x1e,0x00,0x52,0x01,0x1b,0x00,0x46,0xff,0xe5,0x01,0x1b,0x00,0x47,0xff,0xe5,0x01,0x1b,0x00,0x48,0xff,0xe5,0x01,0x1b,0x00,0x49,0x00,0x27,0x01,0x1b,0x00,0x4a,0xff,0xe5, -0x01,0x1b,0x00,0x50,0xff,0xfc,0x01,0x1b,0x00,0x51,0xff,0xfc,0x01,0x1b,0x00,0x52,0xff,0xe5,0x01,0x1b,0x00,0x54,0xff,0xe5,0x01,0x1b,0x00,0x56,0x00,0x0e,0x01,0x1b,0x00,0x57,0x00,0x3b,0x01,0x1b,0x00,0x59,0x00,0x52,0x01,0x1b,0x00,0x5a,0x00,0x52,0x01,0x1b,0x00,0x5b,0x00,0x3b,0x01,0x1b,0x00,0x5c,0x00,0x52,0x01,0x1b,0x00,0x5d, -0x00,0x27,0x01,0x1b,0x00,0x6f,0xff,0xe5,0x01,0x1b,0x00,0x70,0xff,0xe5,0x01,0x1b,0x00,0x71,0xff,0xe5,0x01,0x1b,0x00,0x72,0xff,0xe5,0x01,0x1b,0x00,0x73,0xff,0xe5,0x01,0x1b,0x00,0x79,0xff,0xe5,0x01,0x1b,0x00,0x7a,0xff,0xe5,0x01,0x1b,0x00,0x7b,0xff,0xe5,0x01,0x1b,0x00,0x7c,0xff,0xe5,0x01,0x1b,0x00,0x7d,0xff,0xe5,0x01,0x1b, -0x00,0xac,0xff,0x56,0x01,0x1b,0x00,0xb1,0xff,0xe5,0x01,0x1b,0x00,0xb4,0x00,0xa4,0x01,0x1b,0x00,0xb5,0x00,0x79,0x01,0x1b,0x00,0xb6,0x00,0xa4,0x01,0x1b,0x00,0xb7,0x00,0x79,0x01,0x1b,0x00,0xc4,0xff,0x62,0x01,0x1b,0x00,0xc5,0xff,0x62,0x01,0x1b,0x00,0xe4,0x00,0x0e,0x01,0x1b,0x00,0xe6,0x00,0x27,0x01,0x1b,0x00,0xeb,0x00,0x52, -0x01,0x1b,0x00,0xf8,0xff,0xe5,0x01,0x1b,0x00,0xfb,0x00,0x0e,0x01,0x1b,0x00,0xfd,0xff,0xe5,0x01,0x1b,0x00,0xff,0xff,0xe5,0x01,0x1b,0x01,0x00,0xff,0xe5,0x01,0x1b,0x01,0x08,0xff,0xe5,0x01,0x1b,0x01,0x0b,0xff,0xe5,0x01,0x1b,0x01,0x0d,0xff,0xe5,0x01,0x1b,0x01,0x19,0xff,0xe5,0x01,0x1b,0x01,0x1f,0x00,0x0e,0x01,0x1b,0x01,0x21, -0x00,0x3b,0x01,0x1b,0x01,0x23,0x00,0x3b,0x01,0x1b,0x01,0x29,0x00,0x27,0x01,0x1b,0x01,0x2b,0x00,0x27,0x01,0x1b,0x01,0x48,0xff,0xe5,0x01,0x1b,0x01,0x4c,0xff,0xe5,0x01,0x1b,0x01,0x4e,0xff,0xe5,0x01,0x1b,0x01,0x50,0xff,0xe5,0x01,0x1b,0x01,0x52,0xff,0xe5,0x01,0x1b,0x01,0x54,0xff,0xe5,0x01,0x1b,0x01,0x56,0xff,0xe5,0x01,0x1b, -0x01,0x6d,0xff,0xfc,0x01,0x1b,0x01,0x6f,0xff,0xe5,0x01,0x1b,0x01,0x71,0xff,0xe5,0x01,0x1b,0x01,0x75,0x00,0x0e,0x01,0x1b,0x01,0x77,0x00,0x3b,0x01,0x1b,0x01,0x81,0x00,0x52,0x01,0x1b,0x01,0x83,0x00,0x52,0x01,0x1b,0x01,0x8a,0xff,0xe5,0x01,0x1b,0x01,0x8d,0x00,0x52,0x01,0x1b,0x01,0x8f,0x00,0x52,0x01,0x1b,0x01,0x91,0x00,0x52, -0x01,0x1b,0x01,0x93,0x00,0x52,0x01,0x1b,0x02,0x3e,0x00,0x0e,0x01,0x1c,0x00,0x1e,0x00,0x52,0x01,0x1c,0x00,0x26,0xff,0xe3,0x01,0x1c,0x00,0x2a,0xff,0xe3,0x01,0x1c,0x00,0x2d,0x00,0x39,0x01,0x1c,0x00,0x32,0xff,0xec,0x01,0x1c,0x00,0x34,0xff,0xec,0x01,0x1c,0x00,0x37,0xff,0xcb,0x01,0x1c,0x00,0x3c,0xff,0xd9,0x01,0x1c,0x00,0x46, -0xff,0xcb,0x01,0x1c,0x00,0x47,0xff,0xcb,0x01,0x1c,0x00,0x48,0xff,0xc7,0x01,0x1c,0x00,0x4a,0xff,0xc7,0x01,0x1c,0x00,0x52,0xff,0xc5,0x01,0x1c,0x00,0x54,0xff,0xcb,0x01,0x1c,0x00,0x64,0xff,0xe5,0x01,0x1c,0x00,0x67,0xff,0xec,0x01,0x1c,0x00,0x6f,0xff,0xbe,0x01,0x1c,0x00,0x70,0xff,0xbe,0x01,0x1c,0x00,0x71,0xff,0xbe,0x01,0x1c, -0x00,0x72,0xff,0xbe,0x01,0x1c,0x00,0x73,0xff,0xbe,0x01,0x1c,0x00,0x79,0xff,0xc5,0x01,0x1c,0x00,0x7a,0xff,0xc5,0x01,0x1c,0x00,0x7b,0xff,0xc5,0x01,0x1c,0x00,0x7c,0xff,0xc5,0x01,0x1c,0x00,0x7d,0xff,0xc5,0x01,0x1c,0x00,0x92,0xff,0xec,0x01,0x1c,0x00,0xaf,0xff,0xec,0x01,0x1c,0x00,0xb0,0xff,0xec,0x01,0x1c,0x00,0xb1,0xff,0xc5, -0x01,0x1c,0x00,0xbb,0xff,0xe5,0x01,0x1c,0x00,0xd0,0xff,0xec,0x01,0x1c,0x00,0xd1,0xff,0xec,0x01,0x1c,0x00,0xd2,0xff,0xec,0x01,0x1c,0x00,0xea,0xff,0xd9,0x01,0x1c,0x00,0xf7,0xff,0xe3,0x01,0x1c,0x00,0xf8,0xff,0xc7,0x01,0x1c,0x00,0xfc,0xff,0xe3,0x01,0x1c,0x00,0xfd,0xff,0xcb,0x01,0x1c,0x00,0xfe,0xff,0xe3,0x01,0x1c,0x00,0xff, -0xff,0xcb,0x01,0x1c,0x01,0x00,0xff,0xcb,0x01,0x1c,0x01,0x08,0xff,0xcb,0x01,0x1c,0x01,0x0b,0xff,0xc7,0x01,0x1c,0x01,0x0d,0xff,0xbe,0x01,0x1c,0x01,0x18,0xff,0xec,0x01,0x1c,0x01,0x19,0xff,0xc5,0x01,0x1c,0x01,0x20,0xff,0xcb,0x01,0x1c,0x01,0x22,0xff,0xcb,0x01,0x1c,0x01,0x47,0xff,0xe3,0x01,0x1c,0x01,0x48,0xff,0xcb,0x01,0x1c, -0x01,0x4c,0xff,0xbe,0x01,0x1c,0x01,0x4e,0xff,0xbe,0x01,0x1c,0x01,0x50,0xff,0xbe,0x01,0x1c,0x01,0x51,0xff,0xe3,0x01,0x1c,0x01,0x52,0xff,0xc7,0x01,0x1c,0x01,0x53,0xff,0xe3,0x01,0x1c,0x01,0x54,0xff,0xc7,0x01,0x1c,0x01,0x55,0xff,0xe3,0x01,0x1c,0x01,0x56,0xff,0xc7,0x01,0x1c,0x01,0x63,0x00,0x39,0x01,0x1c,0x01,0x6e,0xff,0xec, -0x01,0x1c,0x01,0x6f,0xff,0xc5,0x01,0x1c,0x01,0x70,0xff,0xec,0x01,0x1c,0x01,0x71,0xff,0xc5,0x01,0x1c,0x01,0x76,0xff,0xcb,0x01,0x1c,0x01,0x82,0xff,0xd9,0x01,0x1c,0x01,0x89,0xff,0xec,0x01,0x1c,0x01,0x8a,0xff,0xc5,0x01,0x1c,0x01,0x92,0xff,0xd9,0x01,0x1d,0x00,0x0f,0xff,0x62,0x01,0x1d,0x00,0x10,0xff,0x7f,0x01,0x1d,0x00,0x11, -0xff,0x56,0x01,0x1d,0x00,0x1d,0x00,0x52,0x01,0x1d,0x00,0x1e,0x00,0x52,0x01,0x1d,0x00,0x46,0xff,0xe5,0x01,0x1d,0x00,0x47,0xff,0xe5,0x01,0x1d,0x00,0x48,0xff,0xe5,0x01,0x1d,0x00,0x49,0x00,0x27,0x01,0x1d,0x00,0x4a,0xff,0xe5,0x01,0x1d,0x00,0x50,0xff,0xfc,0x01,0x1d,0x00,0x51,0xff,0xfc,0x01,0x1d,0x00,0x52,0xff,0xe5,0x01,0x1d, -0x00,0x54,0xff,0xe5,0x01,0x1d,0x00,0x56,0x00,0x0e,0x01,0x1d,0x00,0x57,0x00,0x3b,0x01,0x1d,0x00,0x59,0x00,0x52,0x01,0x1d,0x00,0x5a,0x00,0x52,0x01,0x1d,0x00,0x5b,0x00,0x3b,0x01,0x1d,0x00,0x5c,0x00,0x52,0x01,0x1d,0x00,0x5d,0x00,0x27,0x01,0x1d,0x00,0x6f,0xff,0xe5,0x01,0x1d,0x00,0x70,0xff,0xe5,0x01,0x1d,0x00,0x71,0xff,0xe5, -0x01,0x1d,0x00,0x72,0xff,0xe5,0x01,0x1d,0x00,0x73,0xff,0xe5,0x01,0x1d,0x00,0x79,0xff,0xe5,0x01,0x1d,0x00,0x7a,0xff,0xe5,0x01,0x1d,0x00,0x7b,0xff,0xe5,0x01,0x1d,0x00,0x7c,0xff,0xe5,0x01,0x1d,0x00,0x7d,0xff,0xe5,0x01,0x1d,0x00,0xac,0xff,0x56,0x01,0x1d,0x00,0xb1,0xff,0xe5,0x01,0x1d,0x00,0xb4,0x00,0xa4,0x01,0x1d,0x00,0xb5, -0x00,0x79,0x01,0x1d,0x00,0xb6,0x00,0xa4,0x01,0x1d,0x00,0xb7,0x00,0x79,0x01,0x1d,0x00,0xc4,0xff,0x62,0x01,0x1d,0x00,0xc5,0xff,0x62,0x01,0x1d,0x00,0xe4,0x00,0x0e,0x01,0x1d,0x00,0xe6,0x00,0x27,0x01,0x1d,0x00,0xeb,0x00,0x52,0x01,0x1d,0x00,0xf8,0xff,0xe5,0x01,0x1d,0x00,0xfb,0x00,0x0e,0x01,0x1d,0x00,0xfd,0xff,0xe5,0x01,0x1d, -0x00,0xff,0xff,0xe5,0x01,0x1d,0x01,0x00,0xff,0xe5,0x01,0x1d,0x01,0x08,0xff,0xe5,0x01,0x1d,0x01,0x0b,0xff,0xe5,0x01,0x1d,0x01,0x0d,0xff,0xe5,0x01,0x1d,0x01,0x19,0xff,0xe5,0x01,0x1d,0x01,0x1f,0x00,0x0e,0x01,0x1d,0x01,0x21,0x00,0x3b,0x01,0x1d,0x01,0x23,0x00,0x3b,0x01,0x1d,0x01,0x29,0x00,0x27,0x01,0x1d,0x01,0x2b,0x00,0x27, -0x01,0x1d,0x01,0x48,0xff,0xe5,0x01,0x1d,0x01,0x4c,0xff,0xe5,0x01,0x1d,0x01,0x4e,0xff,0xe5,0x01,0x1d,0x01,0x50,0xff,0xe5,0x01,0x1d,0x01,0x52,0xff,0xe5,0x01,0x1d,0x01,0x54,0xff,0xe5,0x01,0x1d,0x01,0x56,0xff,0xe5,0x01,0x1d,0x01,0x6d,0xff,0xfc,0x01,0x1d,0x01,0x6f,0xff,0xe5,0x01,0x1d,0x01,0x71,0xff,0xe5,0x01,0x1d,0x01,0x75, -0x00,0x0e,0x01,0x1d,0x01,0x77,0x00,0x3b,0x01,0x1d,0x01,0x81,0x00,0x52,0x01,0x1d,0x01,0x83,0x00,0x52,0x01,0x1d,0x01,0x8a,0xff,0xe5,0x01,0x1d,0x01,0x8d,0x00,0x52,0x01,0x1d,0x01,0x8f,0x00,0x52,0x01,0x1d,0x01,0x91,0x00,0x52,0x01,0x1d,0x01,0x93,0x00,0x52,0x01,0x1d,0x02,0x3e,0x00,0x0e,0x01,0x1e,0x00,0x57,0xff,0xbe,0x01,0x1e, -0x00,0x59,0xff,0xcf,0x01,0x1e,0x00,0x5a,0xff,0xe5,0x01,0x1e,0x00,0x5c,0xff,0xd1,0x01,0x1e,0x00,0xba,0xff,0xbe,0x01,0x1e,0x00,0xc4,0xff,0xb2,0x01,0x1e,0x00,0xc5,0xff,0xb2,0x01,0x1e,0x00,0xeb,0xff,0xd1,0x01,0x1e,0x01,0x21,0xff,0xbe,0x01,0x1e,0x01,0x23,0xff,0xbe,0x01,0x1e,0x01,0x77,0xff,0xbe,0x01,0x1e,0x01,0x81,0xff,0xe5, -0x01,0x1e,0x01,0x83,0xff,0xd1,0x01,0x1e,0x01,0x8d,0xff,0xe5,0x01,0x1e,0x01,0x8f,0xff,0xe5,0x01,0x1e,0x01,0x91,0xff,0xe5,0x01,0x1e,0x01,0x93,0xff,0xd1,0x01,0x20,0x00,0x0f,0xff,0x7f,0x01,0x20,0x00,0x11,0xff,0x4c,0x01,0x20,0x00,0x1d,0xff,0xe9,0x01,0x20,0x00,0x1e,0xff,0xe9,0x01,0x20,0x00,0x24,0xff,0x66,0x01,0x20,0x00,0x26, -0xff,0xa4,0x01,0x20,0x00,0x2a,0xff,0xa4,0x01,0x20,0x00,0x2d,0xff,0x8f,0x01,0x20,0x00,0x32,0xff,0xa4,0x01,0x20,0x00,0x34,0xff,0xa4,0x01,0x20,0x00,0x37,0x00,0x27,0x01,0x20,0x00,0x39,0x00,0x2b,0x01,0x20,0x00,0x3a,0x00,0x27,0x01,0x20,0x00,0x3b,0xff,0xfa,0x01,0x20,0x00,0x3c,0x00,0x1d,0x01,0x20,0x00,0x44,0xff,0x27,0x01,0x20, -0x00,0x46,0xff,0x2d,0x01,0x20,0x00,0x47,0xff,0x2d,0x01,0x20,0x00,0x48,0xff,0x2d,0x01,0x20,0x00,0x49,0xff,0xa0,0x01,0x20,0x00,0x4a,0xff,0x2d,0x01,0x20,0x00,0x50,0xff,0x4e,0x01,0x20,0x00,0x51,0xff,0x4e,0x01,0x20,0x00,0x52,0xff,0x2d,0x01,0x20,0x00,0x53,0xff,0x4e,0x01,0x20,0x00,0x54,0xff,0x2d,0x01,0x20,0x00,0x55,0xff,0x4e, -0x01,0x20,0x00,0x56,0xff,0x66,0x01,0x20,0x00,0x58,0xff,0x4e,0x01,0x20,0x00,0x59,0xff,0x9a,0x01,0x20,0x00,0x5a,0xff,0x8f,0x01,0x20,0x00,0x5b,0xff,0x4c,0x01,0x20,0x00,0x5c,0xff,0x8f,0x01,0x20,0x00,0x5d,0xff,0x7f,0x01,0x20,0x00,0x62,0xff,0x66,0x01,0x20,0x00,0x63,0xff,0x66,0x01,0x20,0x00,0x64,0xff,0xa4,0x01,0x20,0x00,0x67, -0xff,0xa4,0x01,0x20,0x00,0x69,0xff,0x27,0x01,0x20,0x00,0x6a,0xff,0x27,0x01,0x20,0x00,0x6b,0xff,0x27,0x01,0x20,0x00,0x6c,0xff,0x27,0x01,0x20,0x00,0x6d,0xff,0x3f,0x01,0x20,0x00,0x6e,0xff,0x27,0x01,0x20,0x00,0x6f,0xff,0x1b,0x01,0x20,0x00,0x70,0xff,0x2d,0x01,0x20,0x00,0x71,0xff,0x2d,0x01,0x20,0x00,0x72,0xff,0x2d,0x01,0x20, -0x00,0x73,0xff,0x2d,0x01,0x20,0x00,0x74,0xff,0xe9,0x01,0x20,0x00,0x76,0x00,0x31,0x01,0x20,0x00,0x77,0x00,0x6f,0x01,0x20,0x00,0x78,0xff,0x4e,0x01,0x20,0x00,0x79,0xff,0x2d,0x01,0x20,0x00,0x7a,0xff,0x2d,0x01,0x20,0x00,0x7b,0xff,0x2d,0x01,0x20,0x00,0x7c,0xff,0x2d,0x01,0x20,0x00,0x7d,0xff,0x2d,0x01,0x20,0x00,0x7e,0xff,0x4e, -0x01,0x20,0x00,0x7f,0xff,0x4e,0x01,0x20,0x00,0x80,0xff,0x4e,0x01,0x20,0x00,0x81,0xff,0x4e,0x01,0x20,0x00,0x8d,0x00,0x52,0x01,0x20,0x00,0x91,0xff,0x0c,0x01,0x20,0x00,0x92,0xff,0xa4,0x01,0x20,0x00,0xa0,0xff,0x27,0x01,0x20,0x00,0xaa,0xff,0x9a,0x01,0x20,0x00,0xab,0xff,0xcf,0x01,0x20,0x00,0xac,0xff,0x4c,0x01,0x20,0x00,0xad, -0xff,0x66,0x01,0x20,0x00,0xae,0xff,0x66,0x01,0x20,0x00,0xaf,0xff,0xa4,0x01,0x20,0x00,0xb0,0xff,0xa4,0x01,0x20,0x00,0xb1,0xff,0x2d,0x01,0x20,0x00,0xb5,0x00,0x27,0x01,0x20,0x00,0xb7,0x00,0x27,0x01,0x20,0x00,0xba,0xff,0x8f,0x01,0x20,0x00,0xbe,0xff,0x9a,0x01,0x20,0x00,0xbf,0xff,0xcf,0x01,0x20,0x00,0xc4,0xff,0x17,0x01,0x20, -0x00,0xc5,0xff,0x17,0x01,0x20,0x00,0xc7,0xff,0x66,0x01,0x20,0x00,0xc9,0xff,0x66,0x01,0x20,0x00,0xd0,0xff,0xa4,0x01,0x20,0x00,0xd1,0xff,0xa4,0x01,0x20,0x00,0xd2,0xff,0xa4,0x01,0x20,0x00,0xe4,0xff,0x66,0x01,0x20,0x00,0xe6,0xff,0x7f,0x01,0x20,0x00,0xea,0x00,0x1d,0x01,0x20,0x00,0xeb,0xff,0x8f,0x01,0x20,0x00,0xf7,0xff,0xa4, -0x01,0x20,0x00,0xf8,0xff,0x2d,0x01,0x20,0x00,0xfb,0xff,0x66,0x01,0x20,0x00,0xfc,0xff,0xa4,0x01,0x20,0x00,0xfd,0xff,0x2d,0x01,0x20,0x00,0xfe,0xff,0xa4,0x01,0x20,0x00,0xff,0xff,0x2d,0x01,0x20,0x01,0x00,0xff,0x2d,0x01,0x20,0x01,0x03,0xff,0x66,0x01,0x20,0x01,0x04,0xff,0x27,0x01,0x20,0x01,0x05,0xff,0x66,0x01,0x20,0x01,0x06, -0xff,0x27,0x01,0x20,0x01,0x08,0xff,0x2d,0x01,0x20,0x01,0x0b,0xff,0x2d,0x01,0x20,0x01,0x0d,0xff,0x2d,0x01,0x20,0x01,0x15,0xff,0x4e,0x01,0x20,0x01,0x17,0xff,0x4e,0x01,0x20,0x01,0x18,0xff,0xa4,0x01,0x20,0x01,0x19,0xff,0x2d,0x01,0x20,0x01,0x1b,0xff,0x4e,0x01,0x20,0x01,0x1d,0xff,0x4e,0x01,0x20,0x01,0x1f,0xff,0x66,0x01,0x20, -0x01,0x20,0x00,0x27,0x01,0x20,0x01,0x22,0x00,0x27,0x01,0x20,0x01,0x25,0xff,0x4e,0x01,0x20,0x01,0x27,0xff,0x4e,0x01,0x20,0x01,0x29,0xff,0x7f,0x01,0x20,0x01,0x2b,0xff,0x7f,0x01,0x20,0x01,0x45,0xff,0x66,0x01,0x20,0x01,0x46,0xff,0x27,0x01,0x20,0x01,0x47,0xff,0xa4,0x01,0x20,0x01,0x48,0xff,0x2d,0x01,0x20,0x01,0x4c,0xff,0x2d, -0x01,0x20,0x01,0x4e,0xff,0x2d,0x01,0x20,0x01,0x50,0xff,0x2d,0x01,0x20,0x01,0x51,0xff,0xa4,0x01,0x20,0x01,0x52,0xff,0x2d,0x01,0x20,0x01,0x53,0xff,0xa4,0x01,0x20,0x01,0x54,0xff,0x2d,0x01,0x20,0x01,0x55,0xff,0xa4,0x01,0x20,0x01,0x56,0xff,0x2d,0x01,0x20,0x01,0x5c,0x00,0x6f,0x01,0x20,0x01,0x5e,0x00,0x6f,0x01,0x20,0x01,0x60, -0x00,0x6f,0x01,0x20,0x01,0x63,0xff,0x8f,0x01,0x20,0x01,0x6d,0xff,0x4e,0x01,0x20,0x01,0x6e,0xff,0xa4,0x01,0x20,0x01,0x6f,0xff,0x2d,0x01,0x20,0x01,0x70,0xff,0xa4,0x01,0x20,0x01,0x71,0xff,0x2d,0x01,0x20,0x01,0x73,0xff,0x4e,0x01,0x20,0x01,0x75,0xff,0x66,0x01,0x20,0x01,0x76,0x00,0x27,0x01,0x20,0x01,0x79,0xff,0x4e,0x01,0x20, -0x01,0x7b,0xff,0x4e,0x01,0x20,0x01,0x7d,0xff,0x4e,0x01,0x20,0x01,0x7f,0xff,0x4e,0x01,0x20,0x01,0x80,0x00,0x27,0x01,0x20,0x01,0x81,0xff,0x8f,0x01,0x20,0x01,0x82,0x00,0x1d,0x01,0x20,0x01,0x83,0xff,0x8f,0x01,0x20,0x01,0x85,0xff,0x66,0x01,0x20,0x01,0x86,0xff,0x27,0x01,0x20,0x01,0x87,0xff,0x66,0x01,0x20,0x01,0x88,0xff,0x27, -0x01,0x20,0x01,0x89,0xff,0xa4,0x01,0x20,0x01,0x8a,0xff,0x2d,0x01,0x20,0x01,0x8c,0x00,0x27,0x01,0x20,0x01,0x8d,0xff,0x8f,0x01,0x20,0x01,0x8e,0x00,0x27,0x01,0x20,0x01,0x8f,0xff,0x8f,0x01,0x20,0x01,0x90,0x00,0x27,0x01,0x20,0x01,0x91,0xff,0x8f,0x01,0x20,0x01,0x92,0x00,0x1d,0x01,0x20,0x01,0x93,0xff,0x8f,0x01,0x20,0x02,0x3e, -0xff,0x66,0x01,0x21,0x00,0x10,0xff,0x8f,0x01,0x21,0x00,0x22,0xff,0xcb,0x01,0x21,0x00,0x46,0xff,0xe5,0x01,0x21,0x00,0x47,0xff,0xe5,0x01,0x21,0x00,0x48,0xff,0xf0,0x01,0x21,0x00,0x4a,0xff,0xf0,0x01,0x21,0x00,0x52,0xff,0xf0,0x01,0x21,0x00,0x54,0xff,0xf0,0x01,0x21,0x00,0x5b,0x00,0x1d,0x01,0x21,0x00,0x6f,0xff,0xe5,0x01,0x21, -0x00,0x70,0xff,0xf0,0x01,0x21,0x00,0x71,0xff,0xf0,0x01,0x21,0x00,0x72,0xff,0xf0,0x01,0x21,0x00,0x73,0xff,0xf0,0x01,0x21,0x00,0x79,0xff,0xf0,0x01,0x21,0x00,0x7a,0xff,0xf0,0x01,0x21,0x00,0x7b,0xff,0xf0,0x01,0x21,0x00,0x7c,0xff,0xf0,0x01,0x21,0x00,0x7d,0xff,0xf0,0x01,0x21,0x00,0xab,0x00,0x27,0x01,0x21,0x00,0xb1,0xff,0xf0, -0x01,0x21,0x00,0xbf,0x00,0x27,0x01,0x21,0x00,0xf8,0xff,0xf0,0x01,0x21,0x00,0xfd,0xff,0xe5,0x01,0x21,0x00,0xff,0xff,0xe5,0x01,0x21,0x01,0x00,0xff,0xe5,0x01,0x21,0x01,0x08,0xff,0xe5,0x01,0x21,0x01,0x0b,0xff,0xf0,0x01,0x21,0x01,0x0d,0xff,0xf0,0x01,0x21,0x01,0x19,0xff,0xf0,0x01,0x21,0x01,0x48,0xff,0xe5,0x01,0x21,0x01,0x4c, -0xff,0xf0,0x01,0x21,0x01,0x4e,0xff,0xf0,0x01,0x21,0x01,0x50,0xff,0xf0,0x01,0x21,0x01,0x52,0xff,0xf0,0x01,0x21,0x01,0x54,0xff,0xf0,0x01,0x21,0x01,0x56,0xff,0xf0,0x01,0x21,0x01,0x6f,0xff,0xf0,0x01,0x21,0x01,0x71,0xff,0xf0,0x01,0x21,0x01,0x8a,0xff,0xf0,0x01,0x22,0x00,0x0f,0xff,0x7f,0x01,0x22,0x00,0x11,0xff,0x4c,0x01,0x22, -0x00,0x1d,0xff,0xe9,0x01,0x22,0x00,0x1e,0xff,0xe9,0x01,0x22,0x00,0x24,0xff,0x66,0x01,0x22,0x00,0x26,0xff,0xa4,0x01,0x22,0x00,0x2a,0xff,0xa4,0x01,0x22,0x00,0x2d,0xff,0x8f,0x01,0x22,0x00,0x32,0xff,0xa4,0x01,0x22,0x00,0x34,0xff,0xa4,0x01,0x22,0x00,0x37,0x00,0x27,0x01,0x22,0x00,0x39,0x00,0x2b,0x01,0x22,0x00,0x3a,0x00,0x27, -0x01,0x22,0x00,0x3b,0xff,0xfa,0x01,0x22,0x00,0x3c,0x00,0x1d,0x01,0x22,0x00,0x44,0xff,0x27,0x01,0x22,0x00,0x46,0xff,0x2d,0x01,0x22,0x00,0x47,0xff,0x2d,0x01,0x22,0x00,0x48,0xff,0x2d,0x01,0x22,0x00,0x49,0xff,0xa0,0x01,0x22,0x00,0x4a,0xff,0x2d,0x01,0x22,0x00,0x50,0xff,0x4e,0x01,0x22,0x00,0x51,0xff,0x4e,0x01,0x22,0x00,0x52, -0xff,0x2d,0x01,0x22,0x00,0x53,0xff,0x4e,0x01,0x22,0x00,0x54,0xff,0x2d,0x01,0x22,0x00,0x55,0xff,0x4e,0x01,0x22,0x00,0x56,0xff,0x66,0x01,0x22,0x00,0x58,0xff,0x4e,0x01,0x22,0x00,0x59,0xff,0x9a,0x01,0x22,0x00,0x5a,0xff,0x8f,0x01,0x22,0x00,0x5b,0xff,0x4c,0x01,0x22,0x00,0x5c,0xff,0x8f,0x01,0x22,0x00,0x5d,0xff,0x7f,0x01,0x22, -0x00,0x62,0xff,0x66,0x01,0x22,0x00,0x63,0xff,0x66,0x01,0x22,0x00,0x64,0xff,0xa4,0x01,0x22,0x00,0x67,0xff,0xa4,0x01,0x22,0x00,0x69,0xff,0x27,0x01,0x22,0x00,0x6a,0xff,0x27,0x01,0x22,0x00,0x6b,0xff,0x27,0x01,0x22,0x00,0x6c,0xff,0x27,0x01,0x22,0x00,0x6d,0xff,0x3f,0x01,0x22,0x00,0x6e,0xff,0x27,0x01,0x22,0x00,0x6f,0xff,0x1b, -0x01,0x22,0x00,0x70,0xff,0x2d,0x01,0x22,0x00,0x71,0xff,0x2d,0x01,0x22,0x00,0x72,0xff,0x2d,0x01,0x22,0x00,0x73,0xff,0x2d,0x01,0x22,0x00,0x74,0xff,0xe9,0x01,0x22,0x00,0x76,0x00,0x31,0x01,0x22,0x00,0x77,0x00,0x6f,0x01,0x22,0x00,0x78,0xff,0x4e,0x01,0x22,0x00,0x79,0xff,0x2d,0x01,0x22,0x00,0x7a,0xff,0x2d,0x01,0x22,0x00,0x7b, -0xff,0x2d,0x01,0x22,0x00,0x7c,0xff,0x2d,0x01,0x22,0x00,0x7d,0xff,0x2d,0x01,0x22,0x00,0x7e,0xff,0x4e,0x01,0x22,0x00,0x7f,0xff,0x4e,0x01,0x22,0x00,0x80,0xff,0x4e,0x01,0x22,0x00,0x81,0xff,0x4e,0x01,0x22,0x00,0x8d,0x00,0x52,0x01,0x22,0x00,0x91,0xff,0x0c,0x01,0x22,0x00,0x92,0xff,0xa4,0x01,0x22,0x00,0xa0,0xff,0x27,0x01,0x22, -0x00,0xaa,0xff,0x9a,0x01,0x22,0x00,0xab,0xff,0xcf,0x01,0x22,0x00,0xac,0xff,0x4c,0x01,0x22,0x00,0xad,0xff,0x66,0x01,0x22,0x00,0xae,0xff,0x66,0x01,0x22,0x00,0xaf,0xff,0xa4,0x01,0x22,0x00,0xb0,0xff,0xa4,0x01,0x22,0x00,0xb1,0xff,0x2d,0x01,0x22,0x00,0xb5,0x00,0x27,0x01,0x22,0x00,0xb7,0x00,0x27,0x01,0x22,0x00,0xba,0xff,0x8f, -0x01,0x22,0x00,0xbe,0xff,0x9a,0x01,0x22,0x00,0xbf,0xff,0xcf,0x01,0x22,0x00,0xc4,0xff,0x17,0x01,0x22,0x00,0xc5,0xff,0x17,0x01,0x22,0x00,0xc7,0xff,0x66,0x01,0x22,0x00,0xc9,0xff,0x66,0x01,0x22,0x00,0xd0,0xff,0xa4,0x01,0x22,0x00,0xd1,0xff,0xa4,0x01,0x22,0x00,0xd2,0xff,0xa4,0x01,0x22,0x00,0xe4,0xff,0x66,0x01,0x22,0x00,0xe6, -0xff,0x7f,0x01,0x22,0x00,0xea,0x00,0x1d,0x01,0x22,0x00,0xeb,0xff,0x8f,0x01,0x22,0x00,0xf7,0xff,0xa4,0x01,0x22,0x00,0xf8,0xff,0x2d,0x01,0x22,0x00,0xfb,0xff,0x66,0x01,0x22,0x00,0xfc,0xff,0xa4,0x01,0x22,0x00,0xfd,0xff,0x2d,0x01,0x22,0x00,0xfe,0xff,0xa4,0x01,0x22,0x00,0xff,0xff,0x2d,0x01,0x22,0x01,0x00,0xff,0x2d,0x01,0x22, -0x01,0x03,0xff,0x66,0x01,0x22,0x01,0x04,0xff,0x27,0x01,0x22,0x01,0x05,0xff,0x66,0x01,0x22,0x01,0x06,0xff,0x27,0x01,0x22,0x01,0x08,0xff,0x2d,0x01,0x22,0x01,0x0b,0xff,0x2d,0x01,0x22,0x01,0x0d,0xff,0x2d,0x01,0x22,0x01,0x15,0xff,0x4e,0x01,0x22,0x01,0x17,0xff,0x4e,0x01,0x22,0x01,0x18,0xff,0xa4,0x01,0x22,0x01,0x19,0xff,0x2d, -0x01,0x22,0x01,0x1b,0xff,0x4e,0x01,0x22,0x01,0x1d,0xff,0x4e,0x01,0x22,0x01,0x1f,0xff,0x66,0x01,0x22,0x01,0x20,0x00,0x27,0x01,0x22,0x01,0x22,0x00,0x27,0x01,0x22,0x01,0x25,0xff,0x4e,0x01,0x22,0x01,0x27,0xff,0x4e,0x01,0x22,0x01,0x29,0xff,0x7f,0x01,0x22,0x01,0x2b,0xff,0x7f,0x01,0x22,0x01,0x45,0xff,0x66,0x01,0x22,0x01,0x46, -0xff,0x27,0x01,0x22,0x01,0x47,0xff,0xa4,0x01,0x22,0x01,0x48,0xff,0x2d,0x01,0x22,0x01,0x4c,0xff,0x2d,0x01,0x22,0x01,0x4e,0xff,0x2d,0x01,0x22,0x01,0x50,0xff,0x2d,0x01,0x22,0x01,0x51,0xff,0xa4,0x01,0x22,0x01,0x52,0xff,0x2d,0x01,0x22,0x01,0x53,0xff,0xa4,0x01,0x22,0x01,0x54,0xff,0x2d,0x01,0x22,0x01,0x55,0xff,0xa4,0x01,0x22, -0x01,0x56,0xff,0x2d,0x01,0x22,0x01,0x5c,0x00,0x6f,0x01,0x22,0x01,0x5e,0x00,0x6f,0x01,0x22,0x01,0x60,0x00,0x6f,0x01,0x22,0x01,0x63,0xff,0x8f,0x01,0x22,0x01,0x6d,0xff,0x4e,0x01,0x22,0x01,0x6e,0xff,0xa4,0x01,0x22,0x01,0x6f,0xff,0x2d,0x01,0x22,0x01,0x70,0xff,0xa4,0x01,0x22,0x01,0x71,0xff,0x2d,0x01,0x22,0x01,0x73,0xff,0x4e, -0x01,0x22,0x01,0x75,0xff,0x66,0x01,0x22,0x01,0x76,0x00,0x27,0x01,0x22,0x01,0x79,0xff,0x4e,0x01,0x22,0x01,0x7b,0xff,0x4e,0x01,0x22,0x01,0x7d,0xff,0x4e,0x01,0x22,0x01,0x7f,0xff,0x4e,0x01,0x22,0x01,0x80,0x00,0x27,0x01,0x22,0x01,0x81,0xff,0x8f,0x01,0x22,0x01,0x82,0x00,0x1d,0x01,0x22,0x01,0x83,0xff,0x8f,0x01,0x22,0x01,0x85, -0xff,0x66,0x01,0x22,0x01,0x86,0xff,0x27,0x01,0x22,0x01,0x87,0xff,0x66,0x01,0x22,0x01,0x88,0xff,0x27,0x01,0x22,0x01,0x89,0xff,0xa4,0x01,0x22,0x01,0x8a,0xff,0x2d,0x01,0x22,0x01,0x8c,0x00,0x27,0x01,0x22,0x01,0x8d,0xff,0x8f,0x01,0x22,0x01,0x8e,0x00,0x27,0x01,0x22,0x01,0x8f,0xff,0x8f,0x01,0x22,0x01,0x90,0x00,0x27,0x01,0x22, -0x01,0x91,0xff,0x8f,0x01,0x22,0x01,0x92,0x00,0x1d,0x01,0x22,0x01,0x93,0xff,0x8f,0x01,0x22,0x02,0x3e,0xff,0x66,0x01,0x23,0x00,0x10,0xff,0x8f,0x01,0x23,0x00,0x22,0xff,0xcb,0x01,0x23,0x00,0x46,0xff,0xe5,0x01,0x23,0x00,0x47,0xff,0xe5,0x01,0x23,0x00,0x48,0xff,0xf0,0x01,0x23,0x00,0x4a,0xff,0xf0,0x01,0x23,0x00,0x52,0xff,0xf0, -0x01,0x23,0x00,0x54,0xff,0xf0,0x01,0x23,0x00,0x5b,0x00,0x1d,0x01,0x23,0x00,0x6f,0xff,0xe5,0x01,0x23,0x00,0x70,0xff,0xf0,0x01,0x23,0x00,0x71,0xff,0xf0,0x01,0x23,0x00,0x72,0xff,0xf0,0x01,0x23,0x00,0x73,0xff,0xf0,0x01,0x23,0x00,0x79,0xff,0xf0,0x01,0x23,0x00,0x7a,0xff,0xf0,0x01,0x23,0x00,0x7b,0xff,0xf0,0x01,0x23,0x00,0x7c, -0xff,0xf0,0x01,0x23,0x00,0x7d,0xff,0xf0,0x01,0x23,0x00,0xab,0x00,0x27,0x01,0x23,0x00,0xb1,0xff,0xf0,0x01,0x23,0x00,0xbf,0x00,0x27,0x01,0x23,0x00,0xf8,0xff,0xf0,0x01,0x23,0x00,0xfd,0xff,0xe5,0x01,0x23,0x00,0xff,0xff,0xe5,0x01,0x23,0x01,0x00,0xff,0xe5,0x01,0x23,0x01,0x08,0xff,0xe5,0x01,0x23,0x01,0x0b,0xff,0xf0,0x01,0x23, -0x01,0x0d,0xff,0xf0,0x01,0x23,0x01,0x19,0xff,0xf0,0x01,0x23,0x01,0x48,0xff,0xe5,0x01,0x23,0x01,0x4c,0xff,0xf0,0x01,0x23,0x01,0x4e,0xff,0xf0,0x01,0x23,0x01,0x50,0xff,0xf0,0x01,0x23,0x01,0x52,0xff,0xf0,0x01,0x23,0x01,0x54,0xff,0xf0,0x01,0x23,0x01,0x56,0xff,0xf0,0x01,0x23,0x01,0x6f,0xff,0xf0,0x01,0x23,0x01,0x71,0xff,0xf0, -0x01,0x23,0x01,0x8a,0xff,0xf0,0x01,0x24,0x00,0x24,0xff,0xd7,0x01,0x24,0x00,0x91,0xff,0x8b,0x01,0x24,0x00,0xc4,0xff,0xa6,0x01,0x24,0x00,0xc5,0xff,0xa6,0x01,0x24,0x01,0x03,0xff,0xd7,0x01,0x24,0x01,0x05,0xff,0xd7,0x01,0x24,0x01,0x45,0xff,0xd7,0x01,0x24,0x01,0x85,0xff,0xd7,0x01,0x24,0x01,0x87,0xff,0xd7,0x01,0x25,0x00,0x05, -0xff,0xbe,0x01,0x25,0x00,0x0a,0xff,0xbe,0x01,0x26,0x00,0x24,0xff,0xd7,0x01,0x26,0x00,0x91,0xff,0x8b,0x01,0x26,0x00,0xc4,0xff,0xa6,0x01,0x26,0x00,0xc5,0xff,0xa6,0x01,0x26,0x01,0x03,0xff,0xd7,0x01,0x26,0x01,0x05,0xff,0xd7,0x01,0x26,0x01,0x45,0xff,0xd7,0x01,0x26,0x01,0x85,0xff,0xd7,0x01,0x26,0x01,0x87,0xff,0xd7,0x01,0x27, -0x00,0x05,0xff,0xbe,0x01,0x27,0x00,0x0a,0xff,0xbe,0x01,0x28,0x00,0x2d,0x00,0x52,0x01,0x28,0x00,0x37,0x00,0x27,0x01,0x28,0x00,0x5c,0xff,0xcb,0x01,0x28,0x00,0x77,0x00,0x46,0x01,0x28,0x00,0xab,0x00,0x27,0x01,0x28,0x00,0xba,0xff,0xbe,0x01,0x28,0x00,0xbf,0x00,0x52,0x01,0x28,0x00,0xeb,0xff,0xcb,0x01,0x28,0x01,0x20,0x00,0x27, -0x01,0x28,0x01,0x22,0x00,0x27,0x01,0x28,0x01,0x5c,0x00,0x46,0x01,0x28,0x01,0x5e,0x00,0x46,0x01,0x28,0x01,0x60,0x00,0x46,0x01,0x28,0x01,0x63,0x00,0x52,0x01,0x28,0x01,0x76,0x00,0x27,0x01,0x28,0x01,0x83,0xff,0xcb,0x01,0x28,0x01,0x93,0xff,0xcb,0x01,0x2a,0x00,0x2d,0x00,0x52,0x01,0x2a,0x00,0x37,0x00,0x27,0x01,0x2a,0x00,0x5c, -0xff,0xcb,0x01,0x2a,0x00,0x77,0x00,0x46,0x01,0x2a,0x00,0xab,0x00,0x27,0x01,0x2a,0x00,0xba,0xff,0xbe,0x01,0x2a,0x00,0xbf,0x00,0x52,0x01,0x2a,0x00,0xeb,0xff,0xcb,0x01,0x2a,0x01,0x20,0x00,0x27,0x01,0x2a,0x01,0x22,0x00,0x27,0x01,0x2a,0x01,0x5c,0x00,0x46,0x01,0x2a,0x01,0x5e,0x00,0x46,0x01,0x2a,0x01,0x60,0x00,0x46,0x01,0x2a, -0x01,0x63,0x00,0x52,0x01,0x2a,0x01,0x76,0x00,0x27,0x01,0x2a,0x01,0x83,0xff,0xcb,0x01,0x2a,0x01,0x93,0xff,0xcb,0x01,0x2c,0x00,0x04,0x00,0x44,0x01,0x2c,0x00,0x0f,0xff,0x7d,0x01,0x2c,0x00,0x11,0xff,0x4c,0x01,0x2c,0x00,0x1d,0xff,0xe9,0x01,0x2c,0x00,0x1e,0xff,0xe9,0x01,0x2c,0x00,0x8d,0x00,0x52,0x01,0x2c,0x00,0xa9,0xff,0x6d, -0x01,0x2c,0x00,0xaa,0xff,0x98,0x01,0x2c,0x00,0xab,0xff,0xcd,0x01,0x2c,0x00,0xac,0xff,0x4c,0x01,0x2c,0x00,0xb5,0x00,0x29,0x01,0x2c,0x00,0xb7,0x00,0x29,0x01,0x2c,0x00,0xbe,0xff,0x98,0x01,0x2c,0x00,0xbf,0xff,0xcd,0x01,0x2c,0x00,0xc4,0xff,0x14,0x01,0x2c,0x00,0xc5,0xff,0x14,0x01,0x2c,0x01,0x2d,0xff,0xb6,0x01,0x2c,0x01,0x2e, -0xff,0xb6,0x01,0x2c,0x01,0x2f,0xff,0x2b,0x01,0x2c,0x01,0x30,0xff,0xb0,0x01,0x2c,0x01,0x31,0xff,0x2b,0x01,0x2c,0x01,0x32,0xff,0x2b,0x01,0x2c,0x01,0x33,0xff,0x8f,0x01,0x2c,0x01,0x34,0xff,0x2b,0x01,0x2c,0x01,0xa8,0x00,0x7b,0x01,0x2c,0x01,0xa9,0xff,0x6d,0x01,0x2c,0x01,0xac,0x00,0x0a,0x01,0x2c,0x01,0xb0,0xff,0x6d,0x01,0x2c, -0x01,0xb4,0xff,0xb6,0x01,0x2c,0x01,0xb8,0x00,0x2f,0x01,0x2c,0x01,0xb9,0x00,0x1d,0x01,0x2c,0x01,0xbc,0xff,0xcf,0x01,0x2c,0x01,0xbf,0xff,0x2b,0x01,0x2c,0x01,0xc0,0xff,0x2b,0x01,0x2c,0x01,0xc1,0xff,0x4e,0x01,0x2c,0x01,0xc2,0xff,0x8f,0x01,0x2c,0x01,0xc5,0xff,0xc1,0x01,0x2c,0x01,0xc7,0xff,0x4e,0x01,0x2c,0x01,0xc9,0xff,0x4e, -0x01,0x2c,0x01,0xca,0xff,0x4e,0x01,0x2c,0x01,0xcc,0xff,0x4e,0x01,0x2c,0x01,0xce,0xff,0xb0,0x01,0x2c,0x01,0xcf,0xff,0x2b,0x01,0x2c,0x01,0xd0,0xff,0x4e,0x01,0x2c,0x01,0xd1,0xff,0x2b,0x01,0x2c,0x01,0xd2,0xff,0x4e,0x01,0x2c,0x01,0xd3,0xff,0x7f,0x01,0x2c,0x01,0xd4,0xff,0x4e,0x01,0x2c,0x01,0xd5,0xff,0x2b,0x01,0x2c,0x01,0xd6, -0x00,0x52,0x01,0x2c,0x01,0xd7,0xff,0x4e,0x01,0x2c,0x01,0xd8,0xff,0x2b,0x01,0x2c,0x01,0xd9,0xff,0x4e,0x01,0x2c,0x01,0xda,0xff,0x2b,0x01,0x2c,0x02,0x37,0xff,0x8f,0x01,0x2d,0x00,0x0f,0xff,0xa2,0x01,0x2d,0x00,0xa9,0xff,0xcf,0x01,0x2d,0x00,0xc4,0xff,0x4a,0x01,0x2d,0x00,0xc5,0xff,0x96,0x01,0x2d,0x01,0xa9,0xff,0xe5,0x01,0x2d, -0x01,0xac,0xff,0xcd,0x01,0x2d,0x01,0xb0,0xff,0xe5,0x01,0x2d,0x01,0xb7,0xff,0xe3,0x01,0x2d,0x01,0xb8,0xff,0xa4,0x01,0x2d,0x01,0xb9,0xff,0xe7,0x01,0x2d,0x01,0xba,0xff,0xdb,0x01,0x2d,0x01,0xbe,0xff,0xe7,0x01,0x2d,0x01,0xcb,0xff,0xd7,0x01,0x2e,0x00,0x0f,0xff,0xa2,0x01,0x2e,0x00,0xa9,0xff,0xcf,0x01,0x2e,0x00,0xc4,0xff,0x4a, -0x01,0x2e,0x00,0xc5,0xff,0x96,0x01,0x2e,0x01,0xa9,0xff,0xcf,0x01,0x2e,0x01,0xac,0xff,0xcd,0x01,0x2e,0x01,0xb0,0xff,0xcf,0x01,0x2e,0x01,0xb7,0xff,0xe3,0x01,0x2e,0x01,0xb8,0xff,0xa4,0x01,0x2e,0x01,0xb9,0xff,0xe7,0x01,0x2e,0x01,0xba,0xff,0xd3,0x01,0x2e,0x01,0xbe,0xff,0xe7,0x01,0x2e,0x01,0xcb,0xff,0xc3,0x01,0x2f,0x01,0x2f, -0xff,0xee,0x01,0x2f,0x01,0x30,0xff,0xee,0x01,0x2f,0x01,0x32,0xff,0xee,0x01,0x2f,0x01,0x34,0xff,0xee,0x01,0x2f,0x01,0xbf,0xff,0xee,0x01,0x2f,0x01,0xcf,0xff,0xee,0x01,0x2f,0x01,0xd1,0xff,0xee,0x01,0x2f,0x01,0xd5,0xff,0xee,0x01,0x2f,0x01,0xd8,0xff,0xee,0x01,0x30,0x00,0x05,0xff,0x6f,0x01,0x30,0x00,0x0a,0xff,0x6f,0x01,0x30, -0x00,0xb4,0xff,0xb0,0x01,0x30,0x00,0xb5,0xff,0x7b,0x01,0x30,0x00,0xb6,0xff,0xbc,0x01,0x30,0x00,0xb7,0xff,0x7b,0x01,0x30,0x01,0x33,0xff,0xdb,0x01,0x30,0x01,0xc5,0xff,0xc1,0x01,0x30,0x01,0xd3,0xff,0xaa,0x01,0x30,0x02,0x37,0xff,0xdb,0x01,0x32,0x01,0x33,0x00,0x19,0x01,0x32,0x01,0xc5,0x00,0x31,0x01,0x32,0x01,0xcd,0x00,0x39, -0x01,0x32,0x01,0xd3,0x00,0x19,0x01,0x32,0x02,0x37,0x00,0x19,0x01,0x33,0x01,0x2f,0xff,0xdb,0x01,0x33,0x01,0x30,0xff,0xdb,0x01,0x33,0x01,0x32,0xff,0xdb,0x01,0x33,0x01,0x33,0x00,0x19,0x01,0x33,0x01,0x34,0xff,0xdb,0x01,0x33,0x01,0xbf,0xff,0xdb,0x01,0x33,0x01,0xc5,0x00,0x29,0x01,0x33,0x01,0xcd,0x00,0x25,0x01,0x33,0x01,0xcf, -0xff,0xdb,0x01,0x33,0x01,0xd0,0xff,0xcf,0x01,0x33,0x01,0xd3,0x00,0x19,0x01,0x33,0x01,0xd5,0xff,0xdb,0x01,0x33,0x01,0xd8,0xff,0xdb,0x01,0x33,0x01,0xda,0xff,0xdb,0x01,0x34,0x00,0x05,0xff,0x6f,0x01,0x34,0x00,0x0a,0xff,0x6f,0x01,0x34,0x00,0xb4,0xff,0xb0,0x01,0x34,0x00,0xb5,0xff,0x7b,0x01,0x34,0x00,0xb6,0xff,0xbc,0x01,0x34, -0x00,0xb7,0xff,0x7b,0x01,0x34,0x01,0x33,0xff,0xdb,0x01,0x34,0x01,0xc5,0xff,0xdb,0x01,0x34,0x01,0xd3,0xff,0xc3,0x01,0x34,0x02,0x37,0xff,0xdb,0x01,0x3a,0x00,0x4d,0x00,0x23,0x01,0x3a,0x01,0x64,0x00,0x23,0x01,0x3b,0x00,0x05,0xff,0x98,0x01,0x3b,0x00,0x0a,0xff,0x98,0x01,0x45,0x00,0x0d,0xff,0x7f,0x01,0x45,0x00,0x0f,0x00,0x44, -0x01,0x45,0x00,0x1e,0x00,0x44,0x01,0x45,0x00,0x26,0xff,0xe5,0x01,0x45,0x00,0x2a,0xff,0xe5,0x01,0x45,0x00,0x2d,0x00,0x5e,0x01,0x45,0x00,0x32,0xff,0xe5,0x01,0x45,0x00,0x37,0xff,0x6d,0x01,0x45,0x00,0x38,0xff,0xe5,0x01,0x45,0x00,0x39,0xff,0x8b,0x01,0x45,0x00,0x3a,0xff,0xb6,0x01,0x45,0x00,0x3c,0xff,0x64,0x01,0x45,0x00,0x3d, -0x00,0x3b,0x01,0x45,0x00,0x57,0xff,0xe5,0x01,0x45,0x00,0x59,0xff,0xd5,0x01,0x45,0x00,0x5a,0xff,0xe5,0x01,0x45,0x00,0x5c,0xff,0xdb,0x01,0x45,0x00,0x8d,0xff,0x9a,0x01,0x45,0x00,0xb4,0xff,0x66,0x01,0x45,0x00,0xb5,0xff,0x3f,0x01,0x45,0x00,0xb6,0xff,0x66,0x01,0x45,0x00,0xb7,0xff,0x3f,0x01,0x45,0x00,0xba,0xff,0xc1,0x01,0x45, -0x00,0xbb,0xff,0x64,0x01,0x45,0x00,0xe5,0x00,0x3b,0x01,0x45,0x00,0xea,0xff,0x64,0x01,0x45,0x00,0xeb,0xff,0xdb,0x01,0x45,0x00,0xf7,0xff,0xe5,0x01,0x45,0x00,0xfc,0xff,0xe5,0x01,0x45,0x00,0xfe,0xff,0xe5,0x01,0x45,0x01,0x18,0xff,0xe5,0x01,0x45,0x01,0x20,0xff,0x6d,0x01,0x45,0x01,0x21,0xff,0xe5,0x01,0x45,0x01,0x22,0xff,0x6d, -0x01,0x45,0x01,0x23,0xff,0xe5,0x01,0x45,0x01,0x24,0xff,0xe5,0x01,0x45,0x01,0x26,0xff,0xe5,0x01,0x45,0x01,0x28,0x00,0x3b,0x01,0x45,0x01,0x2a,0x00,0x3b,0x01,0x45,0x01,0x47,0xff,0xe5,0x01,0x45,0x01,0x51,0xff,0xe5,0x01,0x45,0x01,0x53,0xff,0xe5,0x01,0x45,0x01,0x55,0xff,0xe5,0x01,0x45,0x01,0x63,0x00,0x5e,0x01,0x45,0x01,0x6e, -0xff,0xe5,0x01,0x45,0x01,0x70,0xff,0xe5,0x01,0x45,0x01,0x76,0xff,0x6d,0x01,0x45,0x01,0x77,0xff,0xe5,0x01,0x45,0x01,0x78,0xff,0xe5,0x01,0x45,0x01,0x7a,0xff,0xe5,0x01,0x45,0x01,0x7c,0xff,0xe5,0x01,0x45,0x01,0x7e,0xff,0xe5,0x01,0x45,0x01,0x80,0xff,0xb6,0x01,0x45,0x01,0x81,0xff,0xe5,0x01,0x45,0x01,0x82,0xff,0x64,0x01,0x45, -0x01,0x83,0xff,0xdb,0x01,0x45,0x01,0x89,0xff,0xe5,0x01,0x45,0x01,0x8c,0xff,0xb6,0x01,0x45,0x01,0x8d,0xff,0xe5,0x01,0x45,0x01,0x8e,0xff,0xb6,0x01,0x45,0x01,0x8f,0xff,0xe5,0x01,0x45,0x01,0x90,0xff,0xb6,0x01,0x45,0x01,0x91,0xff,0xe5,0x01,0x45,0x01,0x92,0xff,0x64,0x01,0x45,0x01,0x93,0xff,0xdb,0x01,0x47,0x00,0x26,0xff,0xc9, -0x01,0x47,0x00,0x2a,0xff,0xc9,0x01,0x47,0x00,0x32,0xff,0xe5,0x01,0x47,0x00,0x34,0xff,0xc9,0x01,0x47,0x00,0x64,0xff,0xc9,0x01,0x47,0x00,0x67,0xff,0xc9,0x01,0x47,0x00,0x77,0x00,0x1d,0x01,0x47,0x00,0x92,0xff,0xc9,0x01,0x47,0x00,0xaa,0xff,0xcf,0x01,0x47,0x00,0xaf,0xff,0xc9,0x01,0x47,0x00,0xb0,0xff,0xc9,0x01,0x47,0x00,0xbe, -0xff,0xcf,0x01,0x47,0x00,0xd0,0xff,0xc9,0x01,0x47,0x00,0xd1,0xff,0xc9,0x01,0x47,0x00,0xd2,0xff,0xc9,0x01,0x47,0x00,0xf7,0xff,0xc9,0x01,0x47,0x00,0xfc,0xff,0xc9,0x01,0x47,0x00,0xfe,0xff,0xc9,0x01,0x47,0x01,0x18,0xff,0xe5,0x01,0x47,0x01,0x47,0xff,0xc9,0x01,0x47,0x01,0x51,0xff,0xc9,0x01,0x47,0x01,0x53,0xff,0xc9,0x01,0x47, -0x01,0x55,0xff,0xc9,0x01,0x47,0x01,0x5c,0x00,0x1d,0x01,0x47,0x01,0x5e,0x00,0x1d,0x01,0x47,0x01,0x60,0x00,0x1d,0x01,0x47,0x01,0x6e,0xff,0xe5,0x01,0x47,0x01,0x70,0xff,0xe5,0x01,0x47,0x01,0x89,0xff,0xe5,0x01,0x48,0x00,0x2d,0x00,0x46,0x01,0x48,0x00,0x37,0xff,0x9a,0x01,0x48,0x00,0x3c,0xff,0xb4,0x01,0x48,0x00,0xea,0xff,0xb4, -0x01,0x48,0x01,0x20,0xff,0x9a,0x01,0x48,0x01,0x22,0xff,0x9a,0x01,0x48,0x01,0x63,0x00,0x46,0x01,0x48,0x01,0x76,0xff,0x9a,0x01,0x48,0x01,0x82,0xff,0xb4,0x01,0x48,0x01,0x92,0xff,0xb4,0x01,0x4b,0x00,0x24,0x00,0x0a,0x01,0x4b,0x00,0x2d,0x00,0x44,0x01,0x4b,0x00,0x37,0x00,0x04,0x01,0x4b,0x00,0x3a,0x00,0x1d,0x01,0x4b,0x00,0x3b, -0x00,0x08,0x01,0x4b,0x00,0x62,0x00,0x0a,0x01,0x4b,0x00,0x63,0x00,0x0a,0x01,0x4b,0x00,0x77,0x00,0x12,0x01,0x4b,0x00,0xad,0x00,0x0a,0x01,0x4b,0x00,0xae,0x00,0x0a,0x01,0x4b,0x00,0xc7,0x00,0x0a,0x01,0x4b,0x00,0xc9,0x00,0x0a,0x01,0x4b,0x01,0x03,0x00,0x0a,0x01,0x4b,0x01,0x05,0x00,0x0a,0x01,0x4b,0x01,0x20,0x00,0x04,0x01,0x4b, -0x01,0x22,0x00,0x04,0x01,0x4b,0x01,0x45,0x00,0x0a,0x01,0x4b,0x01,0x5c,0x00,0x12,0x01,0x4b,0x01,0x5e,0x00,0x12,0x01,0x4b,0x01,0x60,0x00,0x12,0x01,0x4b,0x01,0x63,0x00,0x44,0x01,0x4b,0x01,0x76,0x00,0x04,0x01,0x4b,0x01,0x80,0x00,0x1d,0x01,0x4b,0x01,0x85,0x00,0x0a,0x01,0x4b,0x01,0x87,0x00,0x0a,0x01,0x4b,0x01,0x8c,0x00,0x1d, -0x01,0x4b,0x01,0x8e,0x00,0x1d,0x01,0x4b,0x01,0x90,0x00,0x1d,0x01,0x4c,0x00,0x05,0xff,0x98,0x01,0x4c,0x00,0x0a,0xff,0x98,0x01,0x4d,0x00,0x24,0x00,0x0a,0x01,0x4d,0x00,0x2d,0x00,0x44,0x01,0x4d,0x00,0x37,0x00,0x04,0x01,0x4d,0x00,0x3a,0x00,0x1d,0x01,0x4d,0x00,0x3b,0x00,0x08,0x01,0x4d,0x00,0x62,0x00,0x0a,0x01,0x4d,0x00,0x63, -0x00,0x0a,0x01,0x4d,0x00,0x77,0x00,0x12,0x01,0x4d,0x00,0xad,0x00,0x0a,0x01,0x4d,0x00,0xae,0x00,0x0a,0x01,0x4d,0x00,0xc7,0x00,0x0a,0x01,0x4d,0x00,0xc9,0x00,0x0a,0x01,0x4d,0x01,0x03,0x00,0x0a,0x01,0x4d,0x01,0x05,0x00,0x0a,0x01,0x4d,0x01,0x20,0x00,0x04,0x01,0x4d,0x01,0x22,0x00,0x04,0x01,0x4d,0x01,0x45,0x00,0x0a,0x01,0x4d, -0x01,0x5c,0x00,0x12,0x01,0x4d,0x01,0x5e,0x00,0x12,0x01,0x4d,0x01,0x60,0x00,0x12,0x01,0x4d,0x01,0x63,0x00,0x44,0x01,0x4d,0x01,0x76,0x00,0x04,0x01,0x4d,0x01,0x80,0x00,0x1d,0x01,0x4d,0x01,0x85,0x00,0x0a,0x01,0x4d,0x01,0x87,0x00,0x0a,0x01,0x4d,0x01,0x8c,0x00,0x1d,0x01,0x4d,0x01,0x8e,0x00,0x1d,0x01,0x4d,0x01,0x90,0x00,0x1d, -0x01,0x4e,0x00,0x05,0xff,0x98,0x01,0x4e,0x00,0x0a,0xff,0x98,0x01,0x4f,0x00,0x24,0x00,0x0a,0x01,0x4f,0x00,0x2d,0x00,0x44,0x01,0x4f,0x00,0x37,0x00,0x04,0x01,0x4f,0x00,0x3a,0x00,0x1d,0x01,0x4f,0x00,0x3b,0x00,0x08,0x01,0x4f,0x00,0x62,0x00,0x0a,0x01,0x4f,0x00,0x63,0x00,0x0a,0x01,0x4f,0x00,0x77,0x00,0x12,0x01,0x4f,0x00,0xad, -0x00,0x0a,0x01,0x4f,0x00,0xae,0x00,0x0a,0x01,0x4f,0x00,0xc7,0x00,0x0a,0x01,0x4f,0x00,0xc9,0x00,0x0a,0x01,0x4f,0x01,0x03,0x00,0x0a,0x01,0x4f,0x01,0x05,0x00,0x0a,0x01,0x4f,0x01,0x20,0x00,0x04,0x01,0x4f,0x01,0x22,0x00,0x04,0x01,0x4f,0x01,0x45,0x00,0x0a,0x01,0x4f,0x01,0x5c,0x00,0x12,0x01,0x4f,0x01,0x5e,0x00,0x12,0x01,0x4f, -0x01,0x60,0x00,0x12,0x01,0x4f,0x01,0x63,0x00,0x44,0x01,0x4f,0x01,0x76,0x00,0x04,0x01,0x4f,0x01,0x80,0x00,0x1d,0x01,0x4f,0x01,0x85,0x00,0x0a,0x01,0x4f,0x01,0x87,0x00,0x0a,0x01,0x4f,0x01,0x8c,0x00,0x1d,0x01,0x4f,0x01,0x8e,0x00,0x1d,0x01,0x4f,0x01,0x90,0x00,0x1d,0x01,0x50,0x00,0x05,0xff,0x98,0x01,0x50,0x00,0x0a,0xff,0x98, -0x01,0x51,0x00,0x37,0xff,0xcf,0x01,0x51,0x00,0x39,0xff,0xe5,0x01,0x51,0x00,0x5c,0xff,0xe5,0x01,0x51,0x00,0xba,0xff,0xe5,0x01,0x51,0x00,0xeb,0xff,0xe5,0x01,0x51,0x01,0x20,0xff,0xcf,0x01,0x51,0x01,0x22,0xff,0xcf,0x01,0x51,0x01,0x76,0xff,0xcf,0x01,0x51,0x01,0x83,0xff,0xe5,0x01,0x51,0x01,0x93,0xff,0xe5,0x01,0x52,0x00,0x4d, -0x00,0x2f,0x01,0x52,0x01,0x64,0x00,0x2f,0x01,0x53,0x00,0x37,0xff,0xcf,0x01,0x53,0x00,0x39,0xff,0xe5,0x01,0x53,0x00,0x5c,0xff,0xe5,0x01,0x53,0x00,0xba,0xff,0xe5,0x01,0x53,0x00,0xeb,0xff,0xe5,0x01,0x53,0x01,0x20,0xff,0xcf,0x01,0x53,0x01,0x22,0xff,0xcf,0x01,0x53,0x01,0x76,0xff,0xcf,0x01,0x53,0x01,0x83,0xff,0xe5,0x01,0x53, -0x01,0x93,0xff,0xe5,0x01,0x54,0x00,0x4d,0x00,0x2f,0x01,0x54,0x01,0x64,0x00,0x2f,0x01,0x55,0x00,0x37,0xff,0xcf,0x01,0x55,0x00,0x39,0xff,0xe5,0x01,0x55,0x00,0x5c,0xff,0xe5,0x01,0x55,0x00,0xba,0xff,0xe5,0x01,0x55,0x00,0xeb,0xff,0xe5,0x01,0x55,0x01,0x20,0xff,0xcf,0x01,0x55,0x01,0x22,0xff,0xcf,0x01,0x55,0x01,0x76,0xff,0xcf, -0x01,0x55,0x01,0x83,0xff,0xe5,0x01,0x55,0x01,0x93,0xff,0xe5,0x01,0x56,0x00,0x4d,0x00,0x2f,0x01,0x56,0x01,0x64,0x00,0x2f,0x01,0x63,0x00,0x0f,0xff,0x9a,0x01,0x63,0x00,0x11,0xff,0x9a,0x01,0x63,0x00,0x24,0xff,0xdb,0x01,0x63,0x00,0x2d,0xff,0xbe,0x01,0x63,0x00,0x44,0xff,0xe5,0x01,0x63,0x00,0x62,0xff,0xdb,0x01,0x63,0x00,0x63, -0xff,0xdb,0x01,0x63,0x00,0x69,0xff,0xe5,0x01,0x63,0x00,0x6a,0xff,0xe5,0x01,0x63,0x00,0x6b,0xff,0xe5,0x01,0x63,0x00,0x6c,0xff,0xe5,0x01,0x63,0x00,0x6d,0xff,0xe5,0x01,0x63,0x00,0x6e,0xff,0xe5,0x01,0x63,0x00,0x91,0xff,0x98,0x01,0x63,0x00,0xa0,0xff,0xe5,0x01,0x63,0x00,0xac,0xff,0x9a,0x01,0x63,0x00,0xad,0xff,0xdb,0x01,0x63, -0x00,0xae,0xff,0xdb,0x01,0x63,0x00,0xc4,0xff,0x66,0x01,0x63,0x00,0xc5,0xff,0x9a,0x01,0x63,0x00,0xc7,0xff,0xdb,0x01,0x63,0x00,0xc9,0xff,0xdb,0x01,0x63,0x01,0x03,0xff,0xdb,0x01,0x63,0x01,0x04,0xff,0xe5,0x01,0x63,0x01,0x05,0xff,0xdb,0x01,0x63,0x01,0x06,0xff,0xe5,0x01,0x63,0x01,0x45,0xff,0xdb,0x01,0x63,0x01,0x46,0xff,0xe5, -0x01,0x63,0x01,0x63,0xff,0xbe,0x01,0x63,0x01,0x85,0xff,0xdb,0x01,0x63,0x01,0x86,0xff,0xe5,0x01,0x63,0x01,0x87,0xff,0xdb,0x01,0x63,0x01,0x88,0xff,0xe5,0x01,0x64,0x00,0x4d,0x00,0x23,0x01,0x64,0x01,0x64,0x00,0x23,0x01,0x65,0x00,0x0f,0x00,0x27,0x01,0x65,0x00,0x1e,0x00,0x27,0x01,0x65,0x00,0x26,0xff,0xa6,0x01,0x65,0x00,0x2a, -0xff,0xa6,0x01,0x65,0x00,0x2d,0x00,0x5a,0x01,0x65,0x00,0x32,0xff,0xa6,0x01,0x65,0x00,0x34,0xff,0xa6,0x01,0x65,0x00,0x3b,0x00,0x25,0x01,0x65,0x00,0x3d,0x00,0x27,0x01,0x65,0x00,0x46,0xff,0xe5,0x01,0x65,0x00,0x47,0xff,0xe5,0x01,0x65,0x00,0x48,0xff,0xe5,0x01,0x65,0x00,0x4a,0xff,0xe5,0x01,0x65,0x00,0x52,0xff,0xe5,0x01,0x65, -0x00,0x54,0xff,0xe5,0x01,0x65,0x00,0x57,0xff,0xd1,0x01,0x65,0x00,0x59,0xff,0xb6,0x01,0x65,0x00,0x5a,0xff,0xcb,0x01,0x65,0x00,0x5c,0xff,0xa4,0x01,0x65,0x00,0x64,0xff,0x9a,0x01,0x65,0x00,0x67,0xff,0xa6,0x01,0x65,0x00,0x6f,0xff,0xe5,0x01,0x65,0x00,0x70,0xff,0xe5,0x01,0x65,0x00,0x71,0xff,0xe5,0x01,0x65,0x00,0x72,0xff,0xe5, -0x01,0x65,0x00,0x73,0xff,0xe5,0x01,0x65,0x00,0x74,0xff,0xcf,0x01,0x65,0x00,0x77,0x00,0x27,0x01,0x65,0x00,0x79,0xff,0xe5,0x01,0x65,0x00,0x7a,0xff,0xe5,0x01,0x65,0x00,0x7b,0xff,0xe5,0x01,0x65,0x00,0x7c,0xff,0xe5,0x01,0x65,0x00,0x7d,0xff,0xe5,0x01,0x65,0x00,0x92,0xff,0xa6,0x01,0x65,0x00,0xaf,0xff,0xa6,0x01,0x65,0x00,0xb0, -0xff,0xa6,0x01,0x65,0x00,0xb1,0xff,0xe5,0x01,0x65,0x00,0xba,0xff,0xa4,0x01,0x65,0x00,0xc4,0x00,0x44,0x01,0x65,0x00,0xc5,0x00,0x44,0x01,0x65,0x00,0xd0,0xff,0xa6,0x01,0x65,0x00,0xd1,0xff,0xa6,0x01,0x65,0x00,0xd2,0xff,0xa6,0x01,0x65,0x00,0xe5,0x00,0x27,0x01,0x65,0x00,0xeb,0xff,0xa4,0x01,0x65,0x00,0xf7,0xff,0xa6,0x01,0x65, -0x00,0xf8,0xff,0xe5,0x01,0x65,0x00,0xfc,0xff,0xa6,0x01,0x65,0x00,0xfd,0xff,0xe5,0x01,0x65,0x00,0xfe,0xff,0xa6,0x01,0x65,0x00,0xff,0xff,0xe5,0x01,0x65,0x01,0x00,0xff,0xe5,0x01,0x65,0x01,0x08,0xff,0xe5,0x01,0x65,0x01,0x0b,0xff,0xe5,0x01,0x65,0x01,0x0d,0xff,0xe5,0x01,0x65,0x01,0x18,0xff,0xa6,0x01,0x65,0x01,0x19,0xff,0xe5, -0x01,0x65,0x01,0x21,0xff,0xd1,0x01,0x65,0x01,0x23,0xff,0xd1,0x01,0x65,0x01,0x28,0x00,0x27,0x01,0x65,0x01,0x2a,0x00,0x27,0x01,0x65,0x01,0x47,0xff,0xa6,0x01,0x65,0x01,0x48,0xff,0xe5,0x01,0x65,0x01,0x4c,0xff,0xe5,0x01,0x65,0x01,0x4e,0xff,0xe5,0x01,0x65,0x01,0x50,0xff,0xe5,0x01,0x65,0x01,0x51,0xff,0xa6,0x01,0x65,0x01,0x52, -0xff,0xe5,0x01,0x65,0x01,0x53,0xff,0xa6,0x01,0x65,0x01,0x54,0xff,0xe5,0x01,0x65,0x01,0x55,0xff,0xa6,0x01,0x65,0x01,0x56,0xff,0xe5,0x01,0x65,0x01,0x5c,0x00,0x27,0x01,0x65,0x01,0x5e,0x00,0x27,0x01,0x65,0x01,0x60,0x00,0x27,0x01,0x65,0x01,0x63,0x00,0x5a,0x01,0x65,0x01,0x6e,0xff,0xa6,0x01,0x65,0x01,0x6f,0xff,0xe5,0x01,0x65, -0x01,0x70,0xff,0xa6,0x01,0x65,0x01,0x71,0xff,0xe5,0x01,0x65,0x01,0x77,0xff,0xd1,0x01,0x65,0x01,0x81,0xff,0xcb,0x01,0x65,0x01,0x83,0xff,0xa4,0x01,0x65,0x01,0x89,0xff,0xa6,0x01,0x65,0x01,0x8a,0xff,0xe5,0x01,0x65,0x01,0x8d,0xff,0xcb,0x01,0x65,0x01,0x8f,0xff,0xcb,0x01,0x65,0x01,0x91,0xff,0xcb,0x01,0x65,0x01,0x93,0xff,0xa4, -0x01,0x66,0x00,0x0f,0x00,0x52,0x01,0x66,0x00,0x10,0xff,0x75,0x01,0x66,0x00,0x11,0x00,0x52,0x01,0x66,0x00,0x1d,0x00,0x52,0x01,0x66,0x00,0x1e,0x00,0x52,0x01,0x66,0x00,0x46,0xff,0xd7,0x01,0x66,0x00,0x47,0xff,0xe5,0x01,0x66,0x00,0x48,0xff,0xd7,0x01,0x66,0x00,0x4a,0xff,0xd7,0x01,0x66,0x00,0x52,0xff,0xd7,0x01,0x66,0x00,0x54, -0xff,0xe5,0x01,0x66,0x00,0x57,0xff,0xf0,0x01,0x66,0x00,0x6f,0xff,0xe5,0x01,0x66,0x00,0x70,0xff,0xd7,0x01,0x66,0x00,0x71,0xff,0xd7,0x01,0x66,0x00,0x72,0xff,0xd7,0x01,0x66,0x00,0x73,0xff,0xd7,0x01,0x66,0x00,0x79,0xff,0xd7,0x01,0x66,0x00,0x7a,0xff,0xd7,0x01,0x66,0x00,0x7b,0xff,0xd7,0x01,0x66,0x00,0x7c,0xff,0xd7,0x01,0x66, -0x00,0x7d,0xff,0xd7,0x01,0x66,0x00,0xac,0x00,0x52,0x01,0x66,0x00,0xb1,0xff,0xd7,0x01,0x66,0x00,0xf8,0xff,0xd7,0x01,0x66,0x00,0xfd,0xff,0xd7,0x01,0x66,0x00,0xff,0xff,0xd7,0x01,0x66,0x01,0x00,0xff,0xe5,0x01,0x66,0x01,0x08,0xff,0xe5,0x01,0x66,0x01,0x0b,0xff,0xd7,0x01,0x66,0x01,0x0d,0xff,0xd7,0x01,0x66,0x01,0x19,0xff,0xd7, -0x01,0x66,0x01,0x21,0xff,0xf0,0x01,0x66,0x01,0x23,0xff,0xf0,0x01,0x66,0x01,0x48,0xff,0xd7,0x01,0x66,0x01,0x4c,0xff,0xd7,0x01,0x66,0x01,0x4e,0xff,0xd7,0x01,0x66,0x01,0x50,0xff,0xd7,0x01,0x66,0x01,0x52,0xff,0xd7,0x01,0x66,0x01,0x54,0xff,0xd7,0x01,0x66,0x01,0x56,0xff,0xd7,0x01,0x66,0x01,0x6f,0xff,0xd7,0x01,0x66,0x01,0x71, -0xff,0xd7,0x01,0x66,0x01,0x77,0xff,0xf0,0x01,0x66,0x01,0x8a,0xff,0xd7,0x01,0x67,0x00,0x0f,0x00,0x52,0x01,0x67,0x00,0x10,0xff,0x75,0x01,0x67,0x00,0x11,0x00,0x52,0x01,0x67,0x00,0x1d,0x00,0x52,0x01,0x67,0x00,0x1e,0x00,0x52,0x01,0x67,0x00,0x46,0xff,0xd7,0x01,0x67,0x00,0x47,0xff,0xe5,0x01,0x67,0x00,0x48,0xff,0xd7,0x01,0x67, -0x00,0x4a,0xff,0xd7,0x01,0x67,0x00,0x52,0xff,0xd7,0x01,0x67,0x00,0x54,0xff,0xe5,0x01,0x67,0x00,0x57,0xff,0xf0,0x01,0x67,0x00,0x6f,0xff,0xe5,0x01,0x67,0x00,0x70,0xff,0xd7,0x01,0x67,0x00,0x71,0xff,0xd7,0x01,0x67,0x00,0x72,0xff,0xd7,0x01,0x67,0x00,0x73,0xff,0xd7,0x01,0x67,0x00,0x79,0xff,0xd7,0x01,0x67,0x00,0x7a,0xff,0xd7, -0x01,0x67,0x00,0x7b,0xff,0xd7,0x01,0x67,0x00,0x7c,0xff,0xd7,0x01,0x67,0x00,0x7d,0xff,0xd7,0x01,0x67,0x00,0xac,0x00,0x52,0x01,0x67,0x00,0xb1,0xff,0xd7,0x01,0x67,0x00,0xf8,0xff,0xd7,0x01,0x67,0x00,0xfd,0xff,0xd7,0x01,0x67,0x00,0xff,0xff,0xd7,0x01,0x67,0x01,0x00,0xff,0xe5,0x01,0x67,0x01,0x08,0xff,0xe5,0x01,0x67,0x01,0x0b, -0xff,0xd7,0x01,0x67,0x01,0x0d,0xff,0xd7,0x01,0x67,0x01,0x19,0xff,0xd7,0x01,0x67,0x01,0x21,0xff,0xf0,0x01,0x67,0x01,0x23,0xff,0xf0,0x01,0x67,0x01,0x48,0xff,0xd7,0x01,0x67,0x01,0x4c,0xff,0xd7,0x01,0x67,0x01,0x4e,0xff,0xd7,0x01,0x67,0x01,0x50,0xff,0xd7,0x01,0x67,0x01,0x52,0xff,0xd7,0x01,0x67,0x01,0x54,0xff,0xd7,0x01,0x67, -0x01,0x56,0xff,0xd7,0x01,0x67,0x01,0x6f,0xff,0xd7,0x01,0x67,0x01,0x71,0xff,0xd7,0x01,0x67,0x01,0x77,0xff,0xf0,0x01,0x67,0x01,0x8a,0xff,0xd7,0x01,0x68,0x00,0x0d,0xff,0x31,0x01,0x68,0x00,0x22,0xff,0x9a,0x01,0x68,0x00,0x24,0x00,0x3b,0x01,0x68,0x00,0x26,0xff,0xbe,0x01,0x68,0x00,0x2a,0xff,0xbe,0x01,0x68,0x00,0x2d,0x00,0x64, -0x01,0x68,0x00,0x32,0xff,0xba,0x01,0x68,0x00,0x34,0xff,0xba,0x01,0x68,0x00,0x37,0xff,0x8f,0x01,0x68,0x00,0x38,0xff,0xe3,0x01,0x68,0x00,0x39,0xff,0x8b,0x01,0x68,0x00,0x3a,0xff,0xcf,0x01,0x68,0x00,0x3c,0xff,0x7f,0x01,0x68,0x00,0x3d,0x00,0x3b,0x01,0x68,0x00,0x57,0xff,0xe5,0x01,0x68,0x00,0x59,0xff,0x9a,0x01,0x68,0x00,0x5a, -0xff,0xbe,0x01,0x68,0x00,0x5c,0xff,0xb4,0x01,0x68,0x00,0x64,0xff,0xbe,0x01,0x68,0x00,0x67,0xff,0xba,0x01,0x68,0x00,0x68,0xff,0xe3,0x01,0x68,0x00,0x8d,0xff,0x9a,0x01,0x68,0x00,0x92,0xff,0xba,0x01,0x68,0x00,0xaf,0xff,0xba,0x01,0x68,0x00,0xb0,0xff,0xba,0x01,0x68,0x00,0xb4,0xff,0x73,0x01,0x68,0x00,0xb5,0xff,0x8b,0x01,0x68, -0x00,0xb6,0xff,0x73,0x01,0x68,0x00,0xb7,0xff,0x7f,0x01,0x68,0x00,0xba,0xff,0xb4,0x01,0x68,0x00,0xbb,0xff,0x9a,0x01,0x68,0x00,0xc4,0x00,0x44,0x01,0x68,0x00,0xc5,0x00,0x44,0x01,0x68,0x00,0xd0,0xff,0xba,0x01,0x68,0x00,0xd1,0xff,0xba,0x01,0x68,0x00,0xd2,0xff,0xba,0x01,0x68,0x00,0xd3,0xff,0xe3,0x01,0x68,0x00,0xd4,0xff,0xe3, -0x01,0x68,0x00,0xd5,0xff,0xe3,0x01,0x68,0x00,0xe5,0x00,0x3b,0x01,0x68,0x00,0xea,0xff,0x7f,0x01,0x68,0x00,0xeb,0xff,0xb4,0x01,0x68,0x00,0xf7,0xff,0xbe,0x01,0x68,0x00,0xfc,0xff,0xbe,0x01,0x68,0x00,0xfe,0xff,0xbe,0x01,0x68,0x01,0x03,0x00,0x3b,0x01,0x68,0x01,0x05,0x00,0x3b,0x01,0x68,0x01,0x18,0xff,0xba,0x01,0x68,0x01,0x20, -0xff,0x8f,0x01,0x68,0x01,0x21,0xff,0xe5,0x01,0x68,0x01,0x22,0xff,0x8f,0x01,0x68,0x01,0x23,0xff,0xe5,0x01,0x68,0x01,0x24,0xff,0xe3,0x01,0x68,0x01,0x26,0xff,0xe3,0x01,0x68,0x01,0x28,0x00,0x3b,0x01,0x68,0x01,0x2a,0x00,0x3b,0x01,0x68,0x01,0x45,0x00,0x3b,0x01,0x68,0x01,0x47,0xff,0xbe,0x01,0x68,0x01,0x51,0xff,0xbe,0x01,0x68, -0x01,0x53,0xff,0xbe,0x01,0x68,0x01,0x55,0xff,0xbe,0x01,0x68,0x01,0x63,0x00,0x64,0x01,0x68,0x01,0x6e,0xff,0xba,0x01,0x68,0x01,0x70,0xff,0xba,0x01,0x68,0x01,0x76,0xff,0x8f,0x01,0x68,0x01,0x77,0xff,0xe5,0x01,0x68,0x01,0x78,0xff,0xe3,0x01,0x68,0x01,0x7a,0xff,0xe3,0x01,0x68,0x01,0x7c,0xff,0xe3,0x01,0x68,0x01,0x7e,0xff,0xe3, -0x01,0x68,0x01,0x80,0xff,0xcf,0x01,0x68,0x01,0x81,0xff,0xbe,0x01,0x68,0x01,0x82,0xff,0x7f,0x01,0x68,0x01,0x83,0xff,0xb4,0x01,0x68,0x01,0x85,0x00,0x3b,0x01,0x68,0x01,0x87,0x00,0x3b,0x01,0x68,0x01,0x89,0xff,0xba,0x01,0x68,0x01,0x8c,0xff,0xcf,0x01,0x68,0x01,0x8d,0xff,0xbe,0x01,0x68,0x01,0x8e,0xff,0xcf,0x01,0x68,0x01,0x8f, -0xff,0xbe,0x01,0x68,0x01,0x90,0xff,0xcf,0x01,0x68,0x01,0x91,0xff,0xbe,0x01,0x68,0x01,0x92,0xff,0x7f,0x01,0x68,0x01,0x93,0xff,0xb4,0x01,0x6c,0x00,0x0f,0xff,0x9a,0x01,0x6c,0x00,0x11,0xff,0x9a,0x01,0x6c,0x00,0x24,0xff,0xdb,0x01,0x6c,0x00,0x2d,0xff,0xbe,0x01,0x6c,0x00,0x44,0xff,0xe5,0x01,0x6c,0x00,0x62,0xff,0xdb,0x01,0x6c, -0x00,0x63,0xff,0xdb,0x01,0x6c,0x00,0x69,0xff,0xe5,0x01,0x6c,0x00,0x6a,0xff,0xe5,0x01,0x6c,0x00,0x6b,0xff,0xe5,0x01,0x6c,0x00,0x6c,0xff,0xe5,0x01,0x6c,0x00,0x6d,0xff,0xe5,0x01,0x6c,0x00,0x6e,0xff,0xe5,0x01,0x6c,0x00,0x91,0xff,0x98,0x01,0x6c,0x00,0xa0,0xff,0xe5,0x01,0x6c,0x00,0xac,0xff,0x9a,0x01,0x6c,0x00,0xad,0xff,0xdb, -0x01,0x6c,0x00,0xae,0xff,0xdb,0x01,0x6c,0x00,0xc4,0xff,0x66,0x01,0x6c,0x00,0xc5,0xff,0x9a,0x01,0x6c,0x00,0xc7,0xff,0xdb,0x01,0x6c,0x00,0xc9,0xff,0xdb,0x01,0x6c,0x01,0x03,0xff,0xdb,0x01,0x6c,0x01,0x04,0xff,0xe5,0x01,0x6c,0x01,0x05,0xff,0xdb,0x01,0x6c,0x01,0x06,0xff,0xe5,0x01,0x6c,0x01,0x45,0xff,0xdb,0x01,0x6c,0x01,0x46, -0xff,0xe5,0x01,0x6c,0x01,0x63,0xff,0xbe,0x01,0x6c,0x01,0x85,0xff,0xdb,0x01,0x6c,0x01,0x86,0xff,0xe5,0x01,0x6c,0x01,0x87,0xff,0xdb,0x01,0x6c,0x01,0x88,0xff,0xe5,0x01,0x6d,0x00,0x4d,0x00,0x23,0x01,0x6d,0x01,0x64,0x00,0x23,0x01,0x6e,0x00,0x0f,0xff,0xa4,0x01,0x6e,0x00,0x11,0xff,0xa4,0x01,0x6e,0x00,0x24,0xff,0xe5,0x01,0x6e, -0x00,0x2d,0xff,0xf6,0x01,0x6e,0x00,0x37,0xff,0xa4,0x01,0x6e,0x00,0x3b,0xff,0xdb,0x01,0x6e,0x00,0x3c,0xff,0xe7,0x01,0x6e,0x00,0x3d,0xff,0xcf,0x01,0x6e,0x00,0x62,0xff,0xe5,0x01,0x6e,0x00,0x63,0xff,0xe5,0x01,0x6e,0x00,0xac,0xff,0xa4,0x01,0x6e,0x00,0xad,0xff,0xe5,0x01,0x6e,0x00,0xae,0xff,0xe5,0x01,0x6e,0x00,0xbb,0xff,0xf6, -0x01,0x6e,0x00,0xc4,0xff,0x4c,0x01,0x6e,0x00,0xc5,0xff,0x98,0x01,0x6e,0x00,0xc7,0xff,0xe5,0x01,0x6e,0x00,0xc9,0xff,0xe5,0x01,0x6e,0x00,0xe5,0xff,0xcf,0x01,0x6e,0x00,0xea,0xff,0xe7,0x01,0x6e,0x01,0x03,0xff,0xe5,0x01,0x6e,0x01,0x05,0xff,0xe5,0x01,0x6e,0x01,0x20,0xff,0xa4,0x01,0x6e,0x01,0x22,0xff,0xa4,0x01,0x6e,0x01,0x28, -0xff,0xcf,0x01,0x6e,0x01,0x2a,0xff,0xcf,0x01,0x6e,0x01,0x45,0xff,0xe5,0x01,0x6e,0x01,0x63,0xff,0xf6,0x01,0x6e,0x01,0x76,0xff,0xa4,0x01,0x6e,0x01,0x82,0xff,0xe7,0x01,0x6e,0x01,0x85,0xff,0xe5,0x01,0x6e,0x01,0x87,0xff,0xe5,0x01,0x6e,0x01,0x92,0xff,0xe7,0x01,0x6f,0x00,0x05,0xff,0x6f,0x01,0x6f,0x00,0x0a,0xff,0x6f,0x01,0x6f, -0x00,0x44,0xff,0xe5,0x01,0x6f,0x00,0x49,0xff,0xdb,0x01,0x6f,0x00,0x5b,0xff,0xe7,0x01,0x6f,0x00,0x69,0xff,0xe5,0x01,0x6f,0x00,0x6a,0xff,0xe5,0x01,0x6f,0x00,0x6b,0xff,0xe5,0x01,0x6f,0x00,0x6c,0xff,0xe5,0x01,0x6f,0x00,0x6d,0xff,0xe5,0x01,0x6f,0x00,0x6e,0xff,0xe5,0x01,0x6f,0x00,0xa0,0xff,0xe5,0x01,0x6f,0x00,0xb4,0xff,0xb2, -0x01,0x6f,0x00,0xb5,0xff,0x7d,0x01,0x6f,0x00,0xb6,0xff,0xbe,0x01,0x6f,0x00,0xb7,0xff,0x7d,0x01,0x6f,0x00,0xc0,0xff,0xe7,0x01,0x6f,0x00,0xc1,0xff,0xe7,0x01,0x6f,0x01,0x04,0xff,0xe5,0x01,0x6f,0x01,0x06,0xff,0xe5,0x01,0x6f,0x01,0x46,0xff,0xe5,0x01,0x6f,0x01,0x86,0xff,0xe5,0x01,0x6f,0x01,0x88,0xff,0xe5,0x01,0x70,0x00,0x0f, -0xff,0xa4,0x01,0x70,0x00,0x11,0xff,0xa4,0x01,0x70,0x00,0x24,0xff,0xe5,0x01,0x70,0x00,0x2d,0xff,0xf6,0x01,0x70,0x00,0x37,0xff,0xa4,0x01,0x70,0x00,0x3b,0xff,0xdb,0x01,0x70,0x00,0x3c,0xff,0xe7,0x01,0x70,0x00,0x3d,0xff,0xcf,0x01,0x70,0x00,0x62,0xff,0xe5,0x01,0x70,0x00,0x63,0xff,0xe5,0x01,0x70,0x00,0xac,0xff,0xa4,0x01,0x70, -0x00,0xad,0xff,0xe5,0x01,0x70,0x00,0xae,0xff,0xe5,0x01,0x70,0x00,0xbb,0xff,0xf6,0x01,0x70,0x00,0xc4,0xff,0x4c,0x01,0x70,0x00,0xc5,0xff,0x98,0x01,0x70,0x00,0xc7,0xff,0xe5,0x01,0x70,0x00,0xc9,0xff,0xe5,0x01,0x70,0x00,0xe5,0xff,0xcf,0x01,0x70,0x00,0xea,0xff,0xe7,0x01,0x70,0x01,0x03,0xff,0xe5,0x01,0x70,0x01,0x05,0xff,0xe5, -0x01,0x70,0x01,0x20,0xff,0xa4,0x01,0x70,0x01,0x22,0xff,0xa4,0x01,0x70,0x01,0x28,0xff,0xcf,0x01,0x70,0x01,0x2a,0xff,0xcf,0x01,0x70,0x01,0x45,0xff,0xe5,0x01,0x70,0x01,0x63,0xff,0xf6,0x01,0x70,0x01,0x76,0xff,0xa4,0x01,0x70,0x01,0x82,0xff,0xe7,0x01,0x70,0x01,0x85,0xff,0xe5,0x01,0x70,0x01,0x87,0xff,0xe5,0x01,0x70,0x01,0x92, -0xff,0xe7,0x01,0x71,0x00,0x05,0xff,0x6f,0x01,0x71,0x00,0x0a,0xff,0x6f,0x01,0x71,0x00,0x44,0xff,0xe5,0x01,0x71,0x00,0x49,0xff,0xdb,0x01,0x71,0x00,0x5b,0xff,0xe7,0x01,0x71,0x00,0x69,0xff,0xe5,0x01,0x71,0x00,0x6a,0xff,0xe5,0x01,0x71,0x00,0x6b,0xff,0xe5,0x01,0x71,0x00,0x6c,0xff,0xe5,0x01,0x71,0x00,0x6d,0xff,0xe5,0x01,0x71, -0x00,0x6e,0xff,0xe5,0x01,0x71,0x00,0xa0,0xff,0xe5,0x01,0x71,0x00,0xb4,0xff,0xb2,0x01,0x71,0x00,0xb5,0xff,0x7d,0x01,0x71,0x00,0xb6,0xff,0xbe,0x01,0x71,0x00,0xb7,0xff,0x7d,0x01,0x71,0x00,0xc0,0xff,0xe7,0x01,0x71,0x00,0xc1,0xff,0xe7,0x01,0x71,0x01,0x04,0xff,0xe5,0x01,0x71,0x01,0x06,0xff,0xe5,0x01,0x71,0x01,0x46,0xff,0xe5, -0x01,0x71,0x01,0x86,0xff,0xe5,0x01,0x71,0x01,0x88,0xff,0xe5,0x01,0x72,0x00,0x1e,0x00,0x52,0x01,0x72,0x00,0x26,0xff,0xe3,0x01,0x72,0x00,0x2a,0xff,0xe3,0x01,0x72,0x00,0x2d,0x00,0x39,0x01,0x72,0x00,0x32,0xff,0xec,0x01,0x72,0x00,0x34,0xff,0xec,0x01,0x72,0x00,0x37,0xff,0xcb,0x01,0x72,0x00,0x3c,0xff,0xd9,0x01,0x72,0x00,0x46, -0xff,0xcb,0x01,0x72,0x00,0x47,0xff,0xcb,0x01,0x72,0x00,0x48,0xff,0xc7,0x01,0x72,0x00,0x4a,0xff,0xc7,0x01,0x72,0x00,0x52,0xff,0xc5,0x01,0x72,0x00,0x54,0xff,0xcb,0x01,0x72,0x00,0x64,0xff,0xe5,0x01,0x72,0x00,0x67,0xff,0xec,0x01,0x72,0x00,0x6f,0xff,0xbe,0x01,0x72,0x00,0x70,0xff,0xbe,0x01,0x72,0x00,0x71,0xff,0xbe,0x01,0x72, -0x00,0x72,0xff,0xbe,0x01,0x72,0x00,0x73,0xff,0xbe,0x01,0x72,0x00,0x79,0xff,0xc5,0x01,0x72,0x00,0x7a,0xff,0xc5,0x01,0x72,0x00,0x7b,0xff,0xc5,0x01,0x72,0x00,0x7c,0xff,0xc5,0x01,0x72,0x00,0x7d,0xff,0xc5,0x01,0x72,0x00,0x92,0xff,0xec,0x01,0x72,0x00,0xaf,0xff,0xec,0x01,0x72,0x00,0xb0,0xff,0xec,0x01,0x72,0x00,0xb1,0xff,0xc5, -0x01,0x72,0x00,0xbb,0xff,0xe5,0x01,0x72,0x00,0xd0,0xff,0xec,0x01,0x72,0x00,0xd1,0xff,0xec,0x01,0x72,0x00,0xd2,0xff,0xec,0x01,0x72,0x00,0xea,0xff,0xd9,0x01,0x72,0x00,0xf7,0xff,0xe3,0x01,0x72,0x00,0xf8,0xff,0xc7,0x01,0x72,0x00,0xfc,0xff,0xe3,0x01,0x72,0x00,0xfd,0xff,0xcb,0x01,0x72,0x00,0xfe,0xff,0xe3,0x01,0x72,0x00,0xff, -0xff,0xcb,0x01,0x72,0x01,0x00,0xff,0xcb,0x01,0x72,0x01,0x08,0xff,0xcb,0x01,0x72,0x01,0x0b,0xff,0xc7,0x01,0x72,0x01,0x0d,0xff,0xbe,0x01,0x72,0x01,0x18,0xff,0xec,0x01,0x72,0x01,0x19,0xff,0xc5,0x01,0x72,0x01,0x20,0xff,0xcb,0x01,0x72,0x01,0x22,0xff,0xcb,0x01,0x72,0x01,0x47,0xff,0xe3,0x01,0x72,0x01,0x48,0xff,0xcb,0x01,0x72, -0x01,0x4c,0xff,0xbe,0x01,0x72,0x01,0x4e,0xff,0xbe,0x01,0x72,0x01,0x50,0xff,0xbe,0x01,0x72,0x01,0x51,0xff,0xe3,0x01,0x72,0x01,0x52,0xff,0xc7,0x01,0x72,0x01,0x53,0xff,0xe3,0x01,0x72,0x01,0x54,0xff,0xc7,0x01,0x72,0x01,0x55,0xff,0xe3,0x01,0x72,0x01,0x56,0xff,0xc7,0x01,0x72,0x01,0x63,0x00,0x39,0x01,0x72,0x01,0x6e,0xff,0xec, -0x01,0x72,0x01,0x6f,0xff,0xc5,0x01,0x72,0x01,0x70,0xff,0xec,0x01,0x72,0x01,0x71,0xff,0xc5,0x01,0x72,0x01,0x76,0xff,0xcb,0x01,0x72,0x01,0x82,0xff,0xd9,0x01,0x72,0x01,0x89,0xff,0xec,0x01,0x72,0x01,0x8a,0xff,0xc5,0x01,0x72,0x01,0x92,0xff,0xd9,0x01,0x73,0x00,0x0f,0xff,0x62,0x01,0x73,0x00,0x10,0xff,0x7f,0x01,0x73,0x00,0x11, -0xff,0x56,0x01,0x73,0x00,0x1d,0x00,0x52,0x01,0x73,0x00,0x1e,0x00,0x52,0x01,0x73,0x00,0x46,0xff,0xe5,0x01,0x73,0x00,0x47,0xff,0xe5,0x01,0x73,0x00,0x48,0xff,0xe5,0x01,0x73,0x00,0x49,0x00,0x27,0x01,0x73,0x00,0x4a,0xff,0xe5,0x01,0x73,0x00,0x50,0xff,0xfc,0x01,0x73,0x00,0x51,0xff,0xfc,0x01,0x73,0x00,0x52,0xff,0xe5,0x01,0x73, -0x00,0x54,0xff,0xe5,0x01,0x73,0x00,0x56,0x00,0x0e,0x01,0x73,0x00,0x57,0x00,0x3b,0x01,0x73,0x00,0x59,0x00,0x52,0x01,0x73,0x00,0x5a,0x00,0x52,0x01,0x73,0x00,0x5b,0x00,0x3b,0x01,0x73,0x00,0x5c,0x00,0x52,0x01,0x73,0x00,0x5d,0x00,0x27,0x01,0x73,0x00,0x6f,0xff,0xe5,0x01,0x73,0x00,0x70,0xff,0xe5,0x01,0x73,0x00,0x71,0xff,0xe5, -0x01,0x73,0x00,0x72,0xff,0xe5,0x01,0x73,0x00,0x73,0xff,0xe5,0x01,0x73,0x00,0x79,0xff,0xe5,0x01,0x73,0x00,0x7a,0xff,0xe5,0x01,0x73,0x00,0x7b,0xff,0xe5,0x01,0x73,0x00,0x7c,0xff,0xe5,0x01,0x73,0x00,0x7d,0xff,0xe5,0x01,0x73,0x00,0xac,0xff,0x56,0x01,0x73,0x00,0xb1,0xff,0xe5,0x01,0x73,0x00,0xb4,0x00,0xa4,0x01,0x73,0x00,0xb5, -0x00,0x79,0x01,0x73,0x00,0xb6,0x00,0xa4,0x01,0x73,0x00,0xb7,0x00,0x79,0x01,0x73,0x00,0xc4,0xff,0x62,0x01,0x73,0x00,0xc5,0xff,0x62,0x01,0x73,0x00,0xe4,0x00,0x0e,0x01,0x73,0x00,0xe6,0x00,0x27,0x01,0x73,0x00,0xeb,0x00,0x52,0x01,0x73,0x00,0xf8,0xff,0xe5,0x01,0x73,0x00,0xfb,0x00,0x0e,0x01,0x73,0x00,0xfd,0xff,0xe5,0x01,0x73, -0x00,0xff,0xff,0xe5,0x01,0x73,0x01,0x00,0xff,0xe5,0x01,0x73,0x01,0x08,0xff,0xe5,0x01,0x73,0x01,0x0b,0xff,0xe5,0x01,0x73,0x01,0x0d,0xff,0xe5,0x01,0x73,0x01,0x19,0xff,0xe5,0x01,0x73,0x01,0x1f,0x00,0x0e,0x01,0x73,0x01,0x21,0x00,0x3b,0x01,0x73,0x01,0x23,0x00,0x3b,0x01,0x73,0x01,0x29,0x00,0x27,0x01,0x73,0x01,0x2b,0x00,0x27, -0x01,0x73,0x01,0x48,0xff,0xe5,0x01,0x73,0x01,0x4c,0xff,0xe5,0x01,0x73,0x01,0x4e,0xff,0xe5,0x01,0x73,0x01,0x50,0xff,0xe5,0x01,0x73,0x01,0x52,0xff,0xe5,0x01,0x73,0x01,0x54,0xff,0xe5,0x01,0x73,0x01,0x56,0xff,0xe5,0x01,0x73,0x01,0x6d,0xff,0xfc,0x01,0x73,0x01,0x6f,0xff,0xe5,0x01,0x73,0x01,0x71,0xff,0xe5,0x01,0x73,0x01,0x75, -0x00,0x0e,0x01,0x73,0x01,0x77,0x00,0x3b,0x01,0x73,0x01,0x81,0x00,0x52,0x01,0x73,0x01,0x83,0x00,0x52,0x01,0x73,0x01,0x8a,0xff,0xe5,0x01,0x73,0x01,0x8d,0x00,0x52,0x01,0x73,0x01,0x8f,0x00,0x52,0x01,0x73,0x01,0x91,0x00,0x52,0x01,0x73,0x01,0x93,0x00,0x52,0x01,0x73,0x02,0x3e,0x00,0x0e,0x01,0x74,0x00,0x57,0xff,0xbe,0x01,0x74, -0x00,0x59,0xff,0xcf,0x01,0x74,0x00,0x5a,0xff,0xe5,0x01,0x74,0x00,0x5c,0xff,0xd1,0x01,0x74,0x00,0xba,0xff,0xbe,0x01,0x74,0x00,0xc4,0xff,0xb2,0x01,0x74,0x00,0xc5,0xff,0xb2,0x01,0x74,0x00,0xeb,0xff,0xd1,0x01,0x74,0x01,0x21,0xff,0xbe,0x01,0x74,0x01,0x23,0xff,0xbe,0x01,0x74,0x01,0x77,0xff,0xbe,0x01,0x74,0x01,0x81,0xff,0xe5, -0x01,0x74,0x01,0x83,0xff,0xd1,0x01,0x74,0x01,0x8d,0xff,0xe5,0x01,0x74,0x01,0x8f,0xff,0xe5,0x01,0x74,0x01,0x91,0xff,0xe5,0x01,0x74,0x01,0x93,0xff,0xd1,0x01,0x76,0x00,0x0f,0xff,0x7f,0x01,0x76,0x00,0x11,0xff,0x4c,0x01,0x76,0x00,0x1d,0xff,0xe9,0x01,0x76,0x00,0x1e,0xff,0xe9,0x01,0x76,0x00,0x24,0xff,0x66,0x01,0x76,0x00,0x26, -0xff,0xa4,0x01,0x76,0x00,0x2a,0xff,0xa4,0x01,0x76,0x00,0x2d,0xff,0x8f,0x01,0x76,0x00,0x32,0xff,0xa4,0x01,0x76,0x00,0x34,0xff,0xa4,0x01,0x76,0x00,0x37,0x00,0x27,0x01,0x76,0x00,0x39,0x00,0x2b,0x01,0x76,0x00,0x3a,0x00,0x27,0x01,0x76,0x00,0x3b,0xff,0xfa,0x01,0x76,0x00,0x3c,0x00,0x1d,0x01,0x76,0x00,0x44,0xff,0x27,0x01,0x76, -0x00,0x46,0xff,0x2d,0x01,0x76,0x00,0x47,0xff,0x2d,0x01,0x76,0x00,0x48,0xff,0x2d,0x01,0x76,0x00,0x49,0xff,0xa0,0x01,0x76,0x00,0x4a,0xff,0x2d,0x01,0x76,0x00,0x50,0xff,0x4e,0x01,0x76,0x00,0x51,0xff,0x4e,0x01,0x76,0x00,0x52,0xff,0x2d,0x01,0x76,0x00,0x53,0xff,0x4e,0x01,0x76,0x00,0x54,0xff,0x2d,0x01,0x76,0x00,0x55,0xff,0x4e, -0x01,0x76,0x00,0x56,0xff,0x66,0x01,0x76,0x00,0x58,0xff,0x4e,0x01,0x76,0x00,0x59,0xff,0x9a,0x01,0x76,0x00,0x5a,0xff,0x8f,0x01,0x76,0x00,0x5b,0xff,0x4c,0x01,0x76,0x00,0x5c,0xff,0x8f,0x01,0x76,0x00,0x5d,0xff,0x7f,0x01,0x76,0x00,0x62,0xff,0x66,0x01,0x76,0x00,0x63,0xff,0x66,0x01,0x76,0x00,0x64,0xff,0xa4,0x01,0x76,0x00,0x67, -0xff,0xa4,0x01,0x76,0x00,0x69,0xff,0x27,0x01,0x76,0x00,0x6a,0xff,0x27,0x01,0x76,0x00,0x6b,0xff,0x27,0x01,0x76,0x00,0x6c,0xff,0x27,0x01,0x76,0x00,0x6d,0xff,0x3f,0x01,0x76,0x00,0x6e,0xff,0x27,0x01,0x76,0x00,0x6f,0xff,0x1b,0x01,0x76,0x00,0x70,0xff,0x2d,0x01,0x76,0x00,0x71,0xff,0x2d,0x01,0x76,0x00,0x72,0xff,0x2d,0x01,0x76, -0x00,0x73,0xff,0x2d,0x01,0x76,0x00,0x74,0xff,0xe9,0x01,0x76,0x00,0x76,0x00,0x31,0x01,0x76,0x00,0x77,0x00,0x6f,0x01,0x76,0x00,0x78,0xff,0x4e,0x01,0x76,0x00,0x79,0xff,0x2d,0x01,0x76,0x00,0x7a,0xff,0x2d,0x01,0x76,0x00,0x7b,0xff,0x2d,0x01,0x76,0x00,0x7c,0xff,0x2d,0x01,0x76,0x00,0x7d,0xff,0x2d,0x01,0x76,0x00,0x7e,0xff,0x4e, -0x01,0x76,0x00,0x7f,0xff,0x4e,0x01,0x76,0x00,0x80,0xff,0x4e,0x01,0x76,0x00,0x81,0xff,0x4e,0x01,0x76,0x00,0x8d,0x00,0x52,0x01,0x76,0x00,0x91,0xff,0x0c,0x01,0x76,0x00,0x92,0xff,0xa4,0x01,0x76,0x00,0xa0,0xff,0x27,0x01,0x76,0x00,0xaa,0xff,0x9a,0x01,0x76,0x00,0xab,0xff,0xcf,0x01,0x76,0x00,0xac,0xff,0x4c,0x01,0x76,0x00,0xad, -0xff,0x66,0x01,0x76,0x00,0xae,0xff,0x66,0x01,0x76,0x00,0xaf,0xff,0xa4,0x01,0x76,0x00,0xb0,0xff,0xa4,0x01,0x76,0x00,0xb1,0xff,0x2d,0x01,0x76,0x00,0xb5,0x00,0x27,0x01,0x76,0x00,0xb7,0x00,0x27,0x01,0x76,0x00,0xba,0xff,0x8f,0x01,0x76,0x00,0xbe,0xff,0x9a,0x01,0x76,0x00,0xbf,0xff,0xcf,0x01,0x76,0x00,0xc4,0xff,0x17,0x01,0x76, -0x00,0xc5,0xff,0x17,0x01,0x76,0x00,0xc7,0xff,0x66,0x01,0x76,0x00,0xc9,0xff,0x66,0x01,0x76,0x00,0xd0,0xff,0xa4,0x01,0x76,0x00,0xd1,0xff,0xa4,0x01,0x76,0x00,0xd2,0xff,0xa4,0x01,0x76,0x00,0xe4,0xff,0x66,0x01,0x76,0x00,0xe6,0xff,0x7f,0x01,0x76,0x00,0xea,0x00,0x1d,0x01,0x76,0x00,0xeb,0xff,0x8f,0x01,0x76,0x00,0xf7,0xff,0xa4, -0x01,0x76,0x00,0xf8,0xff,0x2d,0x01,0x76,0x00,0xfb,0xff,0x66,0x01,0x76,0x00,0xfc,0xff,0xa4,0x01,0x76,0x00,0xfd,0xff,0x2d,0x01,0x76,0x00,0xfe,0xff,0xa4,0x01,0x76,0x00,0xff,0xff,0x2d,0x01,0x76,0x01,0x00,0xff,0x2d,0x01,0x76,0x01,0x03,0xff,0x66,0x01,0x76,0x01,0x04,0xff,0x27,0x01,0x76,0x01,0x05,0xff,0x66,0x01,0x76,0x01,0x06, -0xff,0x27,0x01,0x76,0x01,0x08,0xff,0x2d,0x01,0x76,0x01,0x0b,0xff,0x2d,0x01,0x76,0x01,0x0d,0xff,0x2d,0x01,0x76,0x01,0x15,0xff,0x4e,0x01,0x76,0x01,0x17,0xff,0x4e,0x01,0x76,0x01,0x18,0xff,0xa4,0x01,0x76,0x01,0x19,0xff,0x2d,0x01,0x76,0x01,0x1b,0xff,0x4e,0x01,0x76,0x01,0x1d,0xff,0x4e,0x01,0x76,0x01,0x1f,0xff,0x66,0x01,0x76, -0x01,0x20,0x00,0x27,0x01,0x76,0x01,0x22,0x00,0x27,0x01,0x76,0x01,0x25,0xff,0x4e,0x01,0x76,0x01,0x27,0xff,0x4e,0x01,0x76,0x01,0x29,0xff,0x7f,0x01,0x76,0x01,0x2b,0xff,0x7f,0x01,0x76,0x01,0x45,0xff,0x66,0x01,0x76,0x01,0x46,0xff,0x27,0x01,0x76,0x01,0x47,0xff,0xa4,0x01,0x76,0x01,0x48,0xff,0x2d,0x01,0x76,0x01,0x4c,0xff,0x2d, -0x01,0x76,0x01,0x4e,0xff,0x2d,0x01,0x76,0x01,0x50,0xff,0x2d,0x01,0x76,0x01,0x51,0xff,0xa4,0x01,0x76,0x01,0x52,0xff,0x2d,0x01,0x76,0x01,0x53,0xff,0xa4,0x01,0x76,0x01,0x54,0xff,0x2d,0x01,0x76,0x01,0x55,0xff,0xa4,0x01,0x76,0x01,0x56,0xff,0x2d,0x01,0x76,0x01,0x5c,0x00,0x6f,0x01,0x76,0x01,0x5e,0x00,0x6f,0x01,0x76,0x01,0x60, -0x00,0x6f,0x01,0x76,0x01,0x63,0xff,0x8f,0x01,0x76,0x01,0x6d,0xff,0x4e,0x01,0x76,0x01,0x6e,0xff,0xa4,0x01,0x76,0x01,0x6f,0xff,0x2d,0x01,0x76,0x01,0x70,0xff,0xa4,0x01,0x76,0x01,0x71,0xff,0x2d,0x01,0x76,0x01,0x73,0xff,0x4e,0x01,0x76,0x01,0x75,0xff,0x66,0x01,0x76,0x01,0x76,0x00,0x27,0x01,0x76,0x01,0x79,0xff,0x4e,0x01,0x76, -0x01,0x7b,0xff,0x4e,0x01,0x76,0x01,0x7d,0xff,0x4e,0x01,0x76,0x01,0x7f,0xff,0x4e,0x01,0x76,0x01,0x80,0x00,0x27,0x01,0x76,0x01,0x81,0xff,0x8f,0x01,0x76,0x01,0x82,0x00,0x1d,0x01,0x76,0x01,0x83,0xff,0x8f,0x01,0x76,0x01,0x85,0xff,0x66,0x01,0x76,0x01,0x86,0xff,0x27,0x01,0x76,0x01,0x87,0xff,0x66,0x01,0x76,0x01,0x88,0xff,0x27, -0x01,0x76,0x01,0x89,0xff,0xa4,0x01,0x76,0x01,0x8a,0xff,0x2d,0x01,0x76,0x01,0x8c,0x00,0x27,0x01,0x76,0x01,0x8d,0xff,0x8f,0x01,0x76,0x01,0x8e,0x00,0x27,0x01,0x76,0x01,0x8f,0xff,0x8f,0x01,0x76,0x01,0x90,0x00,0x27,0x01,0x76,0x01,0x91,0xff,0x8f,0x01,0x76,0x01,0x92,0x00,0x1d,0x01,0x76,0x01,0x93,0xff,0x8f,0x01,0x76,0x02,0x3e, -0xff,0x66,0x01,0x77,0x00,0x10,0xff,0x8f,0x01,0x77,0x00,0x22,0xff,0xcb,0x01,0x77,0x00,0x46,0xff,0xe5,0x01,0x77,0x00,0x47,0xff,0xe5,0x01,0x77,0x00,0x48,0xff,0xf0,0x01,0x77,0x00,0x4a,0xff,0xf0,0x01,0x77,0x00,0x52,0xff,0xf0,0x01,0x77,0x00,0x54,0xff,0xf0,0x01,0x77,0x00,0x5b,0x00,0x1d,0x01,0x77,0x00,0x6f,0xff,0xe5,0x01,0x77, -0x00,0x70,0xff,0xf0,0x01,0x77,0x00,0x71,0xff,0xf0,0x01,0x77,0x00,0x72,0xff,0xf0,0x01,0x77,0x00,0x73,0xff,0xf0,0x01,0x77,0x00,0x79,0xff,0xf0,0x01,0x77,0x00,0x7a,0xff,0xf0,0x01,0x77,0x00,0x7b,0xff,0xf0,0x01,0x77,0x00,0x7c,0xff,0xf0,0x01,0x77,0x00,0x7d,0xff,0xf0,0x01,0x77,0x00,0xab,0x00,0x27,0x01,0x77,0x00,0xb1,0xff,0xf0, -0x01,0x77,0x00,0xbf,0x00,0x27,0x01,0x77,0x00,0xf8,0xff,0xf0,0x01,0x77,0x00,0xfd,0xff,0xe5,0x01,0x77,0x00,0xff,0xff,0xe5,0x01,0x77,0x01,0x00,0xff,0xe5,0x01,0x77,0x01,0x08,0xff,0xe5,0x01,0x77,0x01,0x0b,0xff,0xf0,0x01,0x77,0x01,0x0d,0xff,0xf0,0x01,0x77,0x01,0x19,0xff,0xf0,0x01,0x77,0x01,0x48,0xff,0xe5,0x01,0x77,0x01,0x4c, -0xff,0xf0,0x01,0x77,0x01,0x4e,0xff,0xf0,0x01,0x77,0x01,0x50,0xff,0xf0,0x01,0x77,0x01,0x52,0xff,0xf0,0x01,0x77,0x01,0x54,0xff,0xf0,0x01,0x77,0x01,0x56,0xff,0xf0,0x01,0x77,0x01,0x6f,0xff,0xf0,0x01,0x77,0x01,0x71,0xff,0xf0,0x01,0x77,0x01,0x8a,0xff,0xf0,0x01,0x78,0x00,0x24,0xff,0xd7,0x01,0x78,0x00,0x91,0xff,0x8b,0x01,0x78, -0x00,0xc4,0xff,0xa6,0x01,0x78,0x00,0xc5,0xff,0xa6,0x01,0x78,0x01,0x03,0xff,0xd7,0x01,0x78,0x01,0x05,0xff,0xd7,0x01,0x78,0x01,0x45,0xff,0xd7,0x01,0x78,0x01,0x85,0xff,0xd7,0x01,0x78,0x01,0x87,0xff,0xd7,0x01,0x79,0x00,0x05,0xff,0xbe,0x01,0x79,0x00,0x0a,0xff,0xbe,0x01,0x7a,0x00,0x24,0xff,0xd7,0x01,0x7a,0x00,0x91,0xff,0x8b, -0x01,0x7a,0x00,0xc4,0xff,0xa6,0x01,0x7a,0x00,0xc5,0xff,0xa6,0x01,0x7a,0x01,0x03,0xff,0xd7,0x01,0x7a,0x01,0x05,0xff,0xd7,0x01,0x7a,0x01,0x45,0xff,0xd7,0x01,0x7a,0x01,0x85,0xff,0xd7,0x01,0x7a,0x01,0x87,0xff,0xd7,0x01,0x7b,0x00,0x05,0xff,0xbe,0x01,0x7b,0x00,0x0a,0xff,0xbe,0x01,0x7c,0x00,0x24,0xff,0xd7,0x01,0x7c,0x00,0x91, -0xff,0x8b,0x01,0x7c,0x00,0xc4,0xff,0xa6,0x01,0x7c,0x00,0xc5,0xff,0xa6,0x01,0x7c,0x01,0x03,0xff,0xd7,0x01,0x7c,0x01,0x05,0xff,0xd7,0x01,0x7c,0x01,0x45,0xff,0xd7,0x01,0x7c,0x01,0x85,0xff,0xd7,0x01,0x7c,0x01,0x87,0xff,0xd7,0x01,0x7d,0x00,0x05,0xff,0xbe,0x01,0x7d,0x00,0x0a,0xff,0xbe,0x01,0x7e,0x00,0x24,0xff,0xd7,0x01,0x7e, -0x00,0x91,0xff,0x8b,0x01,0x7e,0x00,0xc4,0xff,0xa6,0x01,0x7e,0x00,0xc5,0xff,0xa6,0x01,0x7e,0x01,0x03,0xff,0xd7,0x01,0x7e,0x01,0x05,0xff,0xd7,0x01,0x7e,0x01,0x45,0xff,0xd7,0x01,0x7e,0x01,0x85,0xff,0xd7,0x01,0x7e,0x01,0x87,0xff,0xd7,0x01,0x7f,0x00,0x05,0xff,0xbe,0x01,0x7f,0x00,0x0a,0xff,0xbe,0x01,0x80,0x00,0x0f,0xff,0x8b, -0x01,0x80,0x00,0x11,0xff,0x7f,0x01,0x80,0x00,0x24,0xff,0xb6,0x01,0x80,0x00,0x37,0x00,0x27,0x01,0x80,0x00,0x44,0xff,0xb4,0x01,0x80,0x00,0x46,0xff,0xcf,0x01,0x80,0x00,0x47,0xff,0xcf,0x01,0x80,0x00,0x48,0xff,0xcf,0x01,0x80,0x00,0x4a,0xff,0xcf,0x01,0x80,0x00,0x52,0xff,0xcf,0x01,0x80,0x00,0x54,0xff,0xcf,0x01,0x80,0x00,0x62, -0xff,0xb6,0x01,0x80,0x00,0x63,0xff,0xb6,0x01,0x80,0x00,0x69,0xff,0xb4,0x01,0x80,0x00,0x6a,0xff,0xb4,0x01,0x80,0x00,0x6b,0xff,0xb4,0x01,0x80,0x00,0x6c,0xff,0xb4,0x01,0x80,0x00,0x6d,0xff,0xb4,0x01,0x80,0x00,0x6e,0xff,0xb4,0x01,0x80,0x00,0x6f,0xff,0xcf,0x01,0x80,0x00,0x70,0xff,0xcf,0x01,0x80,0x00,0x71,0xff,0xcf,0x01,0x80, -0x00,0x72,0xff,0xcf,0x01,0x80,0x00,0x73,0xff,0xcf,0x01,0x80,0x00,0x76,0x00,0x31,0x01,0x80,0x00,0x77,0x00,0x64,0x01,0x80,0x00,0x79,0xff,0xcf,0x01,0x80,0x00,0x7a,0xff,0xcf,0x01,0x80,0x00,0x7b,0xff,0xcf,0x01,0x80,0x00,0x7c,0xff,0xcf,0x01,0x80,0x00,0x7d,0xff,0xcf,0x01,0x80,0x00,0x91,0xff,0x9a,0x01,0x80,0x00,0xa0,0xff,0xb4, -0x01,0x80,0x00,0xa2,0xff,0xa4,0x01,0x80,0x00,0xaa,0xff,0xcf,0x01,0x80,0x00,0xab,0x00,0x27,0x01,0x80,0x00,0xac,0xff,0x7f,0x01,0x80,0x00,0xad,0xff,0xb6,0x01,0x80,0x00,0xae,0xff,0xb6,0x01,0x80,0x00,0xb1,0xff,0xcf,0x01,0x80,0x00,0xbe,0xff,0xcf,0x01,0x80,0x00,0xbf,0x00,0x27,0x01,0x80,0x00,0xc4,0xff,0x7f,0x01,0x80,0x00,0xc5, -0xff,0x8b,0x01,0x80,0x00,0xc7,0xff,0xb6,0x01,0x80,0x00,0xc9,0xff,0xb6,0x01,0x80,0x00,0xf8,0xff,0xcf,0x01,0x80,0x00,0xfd,0xff,0xcf,0x01,0x80,0x00,0xff,0xff,0xcf,0x01,0x80,0x01,0x00,0xff,0xcf,0x01,0x80,0x01,0x03,0xff,0xb6,0x01,0x80,0x01,0x04,0xff,0xb4,0x01,0x80,0x01,0x05,0xff,0xb6,0x01,0x80,0x01,0x06,0xff,0xb4,0x01,0x80, -0x01,0x08,0xff,0xcf,0x01,0x80,0x01,0x0b,0xff,0xcf,0x01,0x80,0x01,0x0d,0xff,0xcf,0x01,0x80,0x01,0x19,0xff,0xcf,0x01,0x80,0x01,0x20,0x00,0x27,0x01,0x80,0x01,0x22,0x00,0x27,0x01,0x80,0x01,0x45,0xff,0xb6,0x01,0x80,0x01,0x46,0xff,0xb4,0x01,0x80,0x01,0x48,0xff,0xcf,0x01,0x80,0x01,0x4c,0xff,0xcf,0x01,0x80,0x01,0x4e,0xff,0xcf, -0x01,0x80,0x01,0x50,0xff,0xcf,0x01,0x80,0x01,0x52,0xff,0xcf,0x01,0x80,0x01,0x54,0xff,0xcf,0x01,0x80,0x01,0x56,0xff,0xcf,0x01,0x80,0x01,0x5c,0x00,0x64,0x01,0x80,0x01,0x5e,0x00,0x64,0x01,0x80,0x01,0x60,0x00,0x64,0x01,0x80,0x01,0x6f,0xff,0xcf,0x01,0x80,0x01,0x71,0xff,0xcf,0x01,0x80,0x01,0x76,0x00,0x27,0x01,0x80,0x01,0x85, -0xff,0xb6,0x01,0x80,0x01,0x86,0xff,0xb4,0x01,0x80,0x01,0x87,0xff,0xb6,0x01,0x80,0x01,0x88,0xff,0xb4,0x01,0x80,0x01,0x8a,0xff,0xcf,0x01,0x81,0x00,0x0f,0xff,0xa6,0x01,0x81,0x00,0x11,0xff,0x9a,0x01,0x81,0x00,0x46,0xff,0xfa,0x01,0x81,0x00,0x47,0xff,0xf6,0x01,0x81,0x00,0x48,0xff,0xf6,0x01,0x81,0x00,0x4a,0xff,0xfa,0x01,0x81, -0x00,0x52,0xff,0xfa,0x01,0x81,0x00,0x54,0xff,0xf6,0x01,0x81,0x00,0x6f,0xff,0xfa,0x01,0x81,0x00,0x70,0xff,0xf6,0x01,0x81,0x00,0x71,0xff,0xf6,0x01,0x81,0x00,0x72,0xff,0xf6,0x01,0x81,0x00,0x73,0xff,0xf6,0x01,0x81,0x00,0x79,0xff,0xfa,0x01,0x81,0x00,0x7a,0xff,0xfa,0x01,0x81,0x00,0x7b,0xff,0xfa,0x01,0x81,0x00,0x7c,0xff,0xfa, -0x01,0x81,0x00,0x7d,0xff,0xfa,0x01,0x81,0x00,0xac,0xff,0x9a,0x01,0x81,0x00,0xb1,0xff,0xfa,0x01,0x81,0x00,0xc4,0xff,0xb4,0x01,0x81,0x00,0xc5,0xff,0xb4,0x01,0x81,0x00,0xf8,0xff,0xfa,0x01,0x81,0x00,0xfd,0xff,0xfa,0x01,0x81,0x00,0xff,0xff,0xfa,0x01,0x81,0x01,0x00,0xff,0xf6,0x01,0x81,0x01,0x08,0xff,0xf6,0x01,0x81,0x01,0x0b, -0xff,0xf6,0x01,0x81,0x01,0x0d,0xff,0xf6,0x01,0x81,0x01,0x19,0xff,0xfa,0x01,0x81,0x01,0x48,0xff,0xfa,0x01,0x81,0x01,0x4c,0xff,0xf6,0x01,0x81,0x01,0x4e,0xff,0xf6,0x01,0x81,0x01,0x50,0xff,0xf6,0x01,0x81,0x01,0x52,0xff,0xfa,0x01,0x81,0x01,0x54,0xff,0xfa,0x01,0x81,0x01,0x56,0xff,0xfa,0x01,0x81,0x01,0x6f,0xff,0xfa,0x01,0x81, -0x01,0x71,0xff,0xfa,0x01,0x81,0x01,0x8a,0xff,0xfa,0x01,0x82,0x00,0x0f,0xff,0x50,0x01,0x82,0x00,0x11,0xff,0x3d,0x01,0x82,0x00,0x24,0xff,0x62,0x01,0x82,0x00,0x26,0xff,0xd3,0x01,0x82,0x00,0x2a,0xff,0xd3,0x01,0x82,0x00,0x2d,0xff,0xbe,0x01,0x82,0x00,0x32,0xff,0xd3,0x01,0x82,0x00,0x34,0xff,0xd3,0x01,0x82,0x00,0x36,0xff,0xe5, -0x01,0x82,0x00,0x37,0x00,0x27,0x01,0x82,0x00,0x44,0xff,0x39,0x01,0x82,0x00,0x46,0xff,0x4c,0x01,0x82,0x00,0x47,0xff,0x4c,0x01,0x82,0x00,0x48,0xff,0x4c,0x01,0x82,0x00,0x49,0xff,0xe5,0x01,0x82,0x00,0x4a,0xff,0x4c,0x01,0x82,0x00,0x50,0xff,0x73,0x01,0x82,0x00,0x51,0xff,0x73,0x01,0x82,0x00,0x52,0xff,0x4c,0x01,0x82,0x00,0x53, -0xff,0x73,0x01,0x82,0x00,0x54,0xff,0x4c,0x01,0x82,0x00,0x55,0xff,0x73,0x01,0x82,0x00,0x56,0xff,0x7b,0x01,0x82,0x00,0x58,0xff,0x73,0x01,0x82,0x00,0x62,0xff,0x62,0x01,0x82,0x00,0x63,0xff,0x62,0x01,0x82,0x00,0x64,0xff,0xcd,0x01,0x82,0x00,0x67,0xff,0xd3,0x01,0x82,0x00,0x69,0xff,0x39,0x01,0x82,0x00,0x6a,0xff,0x39,0x01,0x82, -0x00,0x6b,0xff,0x39,0x01,0x82,0x00,0x6c,0xff,0x7f,0x01,0x82,0x00,0x6d,0xff,0x66,0x01,0x82,0x00,0x6e,0xff,0x39,0x01,0x82,0x00,0x6f,0xff,0x4c,0x01,0x82,0x00,0x70,0xff,0x4c,0x01,0x82,0x00,0x71,0xff,0x4c,0x01,0x82,0x00,0x72,0xff,0x4c,0x01,0x82,0x00,0x73,0xff,0x4c,0x01,0x82,0x00,0x77,0x00,0x5a,0x01,0x82,0x00,0x78,0xff,0x73, -0x01,0x82,0x00,0x79,0xff,0x4c,0x01,0x82,0x00,0x7a,0xff,0x4c,0x01,0x82,0x00,0x7b,0xff,0x4c,0x01,0x82,0x00,0x7c,0xff,0x4c,0x01,0x82,0x00,0x7d,0xff,0x4c,0x01,0x82,0x00,0x7e,0xff,0x73,0x01,0x82,0x00,0x7f,0xff,0x73,0x01,0x82,0x00,0x80,0xff,0x73,0x01,0x82,0x00,0x81,0xff,0x73,0x01,0x82,0x00,0x91,0xff,0x3f,0x01,0x82,0x00,0x92, -0xff,0xd3,0x01,0x82,0x00,0xa0,0xff,0x39,0x01,0x82,0x00,0xa2,0xff,0x1b,0x01,0x82,0x00,0xaa,0xff,0xcf,0x01,0x82,0x00,0xac,0xff,0x3d,0x01,0x82,0x00,0xad,0xff,0x62,0x01,0x82,0x00,0xae,0xff,0x62,0x01,0x82,0x00,0xaf,0xff,0xd3,0x01,0x82,0x00,0xb0,0xff,0xd3,0x01,0x82,0x00,0xb1,0xff,0x4c,0x01,0x82,0x00,0xbe,0xff,0x9a,0x01,0x82, -0x00,0xc4,0xff,0x08,0x01,0x82,0x00,0xc5,0xff,0x08,0x01,0x82,0x00,0xc7,0xff,0x62,0x01,0x82,0x00,0xc9,0xff,0x62,0x01,0x82,0x00,0xd0,0xff,0xd3,0x01,0x82,0x00,0xd1,0xff,0xd3,0x01,0x82,0x00,0xd2,0xff,0xd3,0x01,0x82,0x00,0xe3,0xff,0xe5,0x01,0x82,0x00,0xe4,0xff,0x7b,0x01,0x82,0x00,0xf7,0xff,0xd3,0x01,0x82,0x00,0xf8,0xff,0x4c, -0x01,0x82,0x00,0xfa,0xff,0xe5,0x01,0x82,0x00,0xfb,0xff,0x7b,0x01,0x82,0x00,0xfc,0xff,0xd3,0x01,0x82,0x00,0xfd,0xff,0x4c,0x01,0x82,0x00,0xfe,0xff,0xd3,0x01,0x82,0x00,0xff,0xff,0x4c,0x01,0x82,0x01,0x00,0xff,0x4c,0x01,0x82,0x01,0x03,0xff,0x62,0x01,0x82,0x01,0x04,0xff,0x7f,0x01,0x82,0x01,0x05,0xff,0x62,0x01,0x82,0x01,0x06, -0xff,0x39,0x01,0x82,0x01,0x08,0xff,0x4c,0x01,0x82,0x01,0x0b,0xff,0x4c,0x01,0x82,0x01,0x0d,0xff,0x4c,0x01,0x82,0x01,0x15,0xff,0x73,0x01,0x82,0x01,0x17,0xff,0x73,0x01,0x82,0x01,0x18,0xff,0xd3,0x01,0x82,0x01,0x19,0xff,0x4c,0x01,0x82,0x01,0x1b,0xff,0x73,0x01,0x82,0x01,0x1d,0xff,0x73,0x01,0x82,0x01,0x1e,0xff,0xe5,0x01,0x82, -0x01,0x1f,0xff,0x7b,0x01,0x82,0x01,0x20,0x00,0x27,0x01,0x82,0x01,0x22,0x00,0x27,0x01,0x82,0x01,0x25,0xff,0x73,0x01,0x82,0x01,0x27,0xff,0x73,0x01,0x82,0x01,0x45,0xff,0x62,0x01,0x82,0x01,0x46,0xff,0x7f,0x01,0x82,0x01,0x47,0xff,0xd3,0x01,0x82,0x01,0x48,0xff,0x4c,0x01,0x82,0x01,0x4c,0xff,0x4c,0x01,0x82,0x01,0x4e,0xff,0x4c, -0x01,0x82,0x01,0x50,0xff,0x4c,0x01,0x82,0x01,0x51,0xff,0xd3,0x01,0x82,0x01,0x52,0xff,0x4c,0x01,0x82,0x01,0x53,0xff,0xd3,0x01,0x82,0x01,0x54,0xff,0x4c,0x01,0x82,0x01,0x55,0xff,0xd3,0x01,0x82,0x01,0x56,0xff,0x4c,0x01,0x82,0x01,0x5c,0x00,0x5a,0x01,0x82,0x01,0x5e,0x00,0x5a,0x01,0x82,0x01,0x60,0x00,0x5a,0x01,0x82,0x01,0x63, -0xff,0xbe,0x01,0x82,0x01,0x6d,0xff,0x73,0x01,0x82,0x01,0x6e,0xff,0xd3,0x01,0x82,0x01,0x6f,0xff,0x4c,0x01,0x82,0x01,0x70,0xff,0xd3,0x01,0x82,0x01,0x71,0xff,0x4c,0x01,0x82,0x01,0x73,0xff,0x73,0x01,0x82,0x01,0x74,0xff,0xe5,0x01,0x82,0x01,0x75,0xff,0x7b,0x01,0x82,0x01,0x76,0x00,0x27,0x01,0x82,0x01,0x79,0xff,0x73,0x01,0x82, -0x01,0x7b,0xff,0x73,0x01,0x82,0x01,0x7d,0xff,0x73,0x01,0x82,0x01,0x7f,0xff,0x73,0x01,0x82,0x01,0x85,0xff,0x62,0x01,0x82,0x01,0x86,0xff,0x7f,0x01,0x82,0x01,0x87,0xff,0x62,0x01,0x82,0x01,0x88,0xff,0x39,0x01,0x82,0x01,0x89,0xff,0xd3,0x01,0x82,0x01,0x8a,0xff,0x4c,0x01,0x82,0x02,0x3d,0xff,0xe5,0x01,0x82,0x02,0x3e,0xff,0x7b, -0x01,0x83,0x00,0x05,0x00,0x1d,0x01,0x83,0x00,0x0a,0x00,0x1d,0x01,0x83,0x00,0x0f,0xff,0x9a,0x01,0x83,0x00,0x11,0xff,0x81,0x01,0x83,0x00,0x22,0xff,0xb4,0x01,0x83,0x00,0x46,0xff,0xf6,0x01,0x83,0x00,0x47,0xff,0xf6,0x01,0x83,0x00,0x48,0xff,0xf6,0x01,0x83,0x00,0x49,0x00,0x04,0x01,0x83,0x00,0x4a,0xff,0xf6,0x01,0x83,0x00,0x52, -0xff,0xf6,0x01,0x83,0x00,0x54,0xff,0xf6,0x01,0x83,0x00,0x57,0x00,0x06,0x01,0x83,0x00,0x6f,0xff,0xf6,0x01,0x83,0x00,0x70,0xff,0xf6,0x01,0x83,0x00,0x71,0xff,0xf6,0x01,0x83,0x00,0x72,0xff,0xf6,0x01,0x83,0x00,0x73,0xff,0xf6,0x01,0x83,0x00,0x79,0xff,0xf6,0x01,0x83,0x00,0x7a,0xff,0xf6,0x01,0x83,0x00,0x7b,0xff,0xf6,0x01,0x83, -0x00,0x7c,0xff,0xf6,0x01,0x83,0x00,0x7d,0xff,0xf6,0x01,0x83,0x00,0xac,0xff,0x81,0x01,0x83,0x00,0xb1,0xff,0xf6,0x01,0x83,0x00,0xbf,0x00,0x0c,0x01,0x83,0x00,0xc4,0xff,0x8d,0x01,0x83,0x00,0xc5,0xff,0x8d,0x01,0x83,0x00,0xf8,0xff,0xf6,0x01,0x83,0x00,0xfd,0xff,0xf6,0x01,0x83,0x00,0xff,0xff,0xf6,0x01,0x83,0x01,0x00,0xff,0xf6, -0x01,0x83,0x01,0x08,0xff,0xf6,0x01,0x83,0x01,0x0b,0xff,0xf6,0x01,0x83,0x01,0x0d,0xff,0xf6,0x01,0x83,0x01,0x19,0xff,0xf6,0x01,0x83,0x01,0x21,0x00,0x06,0x01,0x83,0x01,0x23,0x00,0x06,0x01,0x83,0x01,0x48,0xff,0xf6,0x01,0x83,0x01,0x4c,0xff,0xf6,0x01,0x83,0x01,0x4e,0xff,0xf6,0x01,0x83,0x01,0x50,0xff,0xf6,0x01,0x83,0x01,0x52, -0xff,0xf6,0x01,0x83,0x01,0x54,0xff,0xf6,0x01,0x83,0x01,0x56,0xff,0xf6,0x01,0x83,0x01,0x6f,0xff,0xf6,0x01,0x83,0x01,0x71,0xff,0xf6,0x01,0x83,0x01,0x77,0x00,0x06,0x01,0x83,0x01,0x8a,0xff,0xf6,0x01,0x84,0x00,0x0c,0x00,0x8d,0x01,0x84,0x00,0x0f,0xff,0x7f,0x01,0x84,0x00,0x10,0xff,0x9a,0x01,0x84,0x00,0x11,0xff,0x7f,0x01,0x84, -0x00,0x1d,0x00,0x52,0x01,0x84,0x00,0x1e,0x00,0x52,0x01,0x84,0x00,0x22,0x00,0x42,0x01,0x84,0x00,0x40,0x00,0x8d,0x01,0x84,0x00,0x45,0x00,0x12,0x01,0x84,0x00,0x4b,0x00,0x12,0x01,0x84,0x00,0x57,0x00,0x25,0x01,0x84,0x00,0x59,0x00,0x27,0x01,0x84,0x00,0x5a,0x00,0x27,0x01,0x84,0x00,0x5b,0x00,0x12,0x01,0x84,0x00,0x5c,0x00,0x21, -0x01,0x84,0x00,0x60,0x00,0x52,0x01,0x84,0x00,0x75,0x00,0x2d,0x01,0x84,0x00,0x76,0x00,0x12,0x01,0x84,0x00,0x77,0x00,0x79,0x01,0x84,0x00,0x8d,0x00,0x93,0x01,0x84,0x00,0xab,0x00,0x27,0x01,0x84,0x00,0xac,0xff,0x7f,0x01,0x84,0x00,0xb4,0x00,0x5e,0x01,0x84,0x00,0xb5,0x00,0x52,0x01,0x84,0x00,0xb6,0x00,0x5e,0x01,0x84,0x00,0xb7, -0x00,0x52,0x01,0x84,0x00,0xbf,0x00,0x27,0x01,0x84,0x00,0xc4,0xff,0xb0,0x01,0x84,0x00,0xc5,0xff,0xb0,0x01,0x84,0x00,0xeb,0x00,0x21,0x01,0x84,0x00,0xed,0x00,0x12,0x01,0x84,0x01,0x21,0x00,0x25,0x01,0x84,0x01,0x23,0x00,0x25,0x01,0x84,0x01,0x58,0x00,0x12,0x01,0x84,0x01,0x5a,0x00,0x12,0x01,0x84,0x01,0x5c,0x00,0x79,0x01,0x84, -0x01,0x5e,0x00,0x79,0x01,0x84,0x01,0x60,0x00,0x79,0x01,0x84,0x01,0x77,0x00,0x25,0x01,0x84,0x01,0x81,0x00,0x27,0x01,0x84,0x01,0x83,0x00,0x21,0x01,0x84,0x01,0x8d,0x00,0x27,0x01,0x84,0x01,0x8f,0x00,0x27,0x01,0x84,0x01,0x91,0x00,0x27,0x01,0x84,0x01,0x93,0x00,0x21,0x01,0x85,0x00,0x0d,0xff,0x7f,0x01,0x85,0x00,0x0f,0x00,0x44, -0x01,0x85,0x00,0x1e,0x00,0x44,0x01,0x85,0x00,0x26,0xff,0xe5,0x01,0x85,0x00,0x2a,0xff,0xe5,0x01,0x85,0x00,0x2d,0x00,0x5e,0x01,0x85,0x00,0x32,0xff,0xe5,0x01,0x85,0x00,0x37,0xff,0x6d,0x01,0x85,0x00,0x38,0xff,0xe5,0x01,0x85,0x00,0x39,0xff,0x8b,0x01,0x85,0x00,0x3a,0xff,0xb6,0x01,0x85,0x00,0x3c,0xff,0x64,0x01,0x85,0x00,0x3d, -0x00,0x3b,0x01,0x85,0x00,0x57,0xff,0xe5,0x01,0x85,0x00,0x59,0xff,0xd5,0x01,0x85,0x00,0x5a,0xff,0xe5,0x01,0x85,0x00,0x5c,0xff,0xdb,0x01,0x85,0x00,0x8d,0xff,0x9a,0x01,0x85,0x00,0xb4,0xff,0x66,0x01,0x85,0x00,0xb5,0xff,0x3f,0x01,0x85,0x00,0xb6,0xff,0x66,0x01,0x85,0x00,0xb7,0xff,0x3f,0x01,0x85,0x00,0xba,0xff,0xc1,0x01,0x85, -0x00,0xbb,0xff,0x64,0x01,0x85,0x00,0xe5,0x00,0x3b,0x01,0x85,0x00,0xea,0xff,0x64,0x01,0x85,0x00,0xeb,0xff,0xdb,0x01,0x85,0x00,0xf7,0xff,0xe5,0x01,0x85,0x00,0xfc,0xff,0xe5,0x01,0x85,0x00,0xfe,0xff,0xe5,0x01,0x85,0x01,0x18,0xff,0xe5,0x01,0x85,0x01,0x20,0xff,0x6d,0x01,0x85,0x01,0x21,0xff,0xe5,0x01,0x85,0x01,0x22,0xff,0x6d, -0x01,0x85,0x01,0x23,0xff,0xe5,0x01,0x85,0x01,0x24,0xff,0xe5,0x01,0x85,0x01,0x26,0xff,0xe5,0x01,0x85,0x01,0x28,0x00,0x3b,0x01,0x85,0x01,0x2a,0x00,0x3b,0x01,0x85,0x01,0x47,0xff,0xe5,0x01,0x85,0x01,0x51,0xff,0xe5,0x01,0x85,0x01,0x53,0xff,0xe5,0x01,0x85,0x01,0x55,0xff,0xe5,0x01,0x85,0x01,0x63,0x00,0x5e,0x01,0x85,0x01,0x6e, -0xff,0xe5,0x01,0x85,0x01,0x70,0xff,0xe5,0x01,0x85,0x01,0x76,0xff,0x6d,0x01,0x85,0x01,0x77,0xff,0xe5,0x01,0x85,0x01,0x78,0xff,0xe5,0x01,0x85,0x01,0x7a,0xff,0xe5,0x01,0x85,0x01,0x7c,0xff,0xe5,0x01,0x85,0x01,0x7e,0xff,0xe5,0x01,0x85,0x01,0x80,0xff,0xb6,0x01,0x85,0x01,0x81,0xff,0xe5,0x01,0x85,0x01,0x82,0xff,0x64,0x01,0x85, -0x01,0x83,0xff,0xdb,0x01,0x85,0x01,0x89,0xff,0xe5,0x01,0x85,0x01,0x8c,0xff,0xb6,0x01,0x85,0x01,0x8d,0xff,0xe5,0x01,0x85,0x01,0x8e,0xff,0xb6,0x01,0x85,0x01,0x8f,0xff,0xe5,0x01,0x85,0x01,0x90,0xff,0xb6,0x01,0x85,0x01,0x91,0xff,0xe5,0x01,0x85,0x01,0x92,0xff,0x64,0x01,0x85,0x01,0x93,0xff,0xdb,0x01,0x87,0x00,0x24,0x00,0x0a, -0x01,0x87,0x00,0x2d,0x00,0x44,0x01,0x87,0x00,0x37,0x00,0x04,0x01,0x87,0x00,0x3a,0x00,0x1d,0x01,0x87,0x00,0x3b,0x00,0x08,0x01,0x87,0x00,0x62,0x00,0x0a,0x01,0x87,0x00,0x63,0x00,0x0a,0x01,0x87,0x00,0x77,0x00,0x12,0x01,0x87,0x00,0xad,0x00,0x0a,0x01,0x87,0x00,0xae,0x00,0x0a,0x01,0x87,0x00,0xc7,0x00,0x0a,0x01,0x87,0x00,0xc9, -0x00,0x0a,0x01,0x87,0x01,0x03,0x00,0x0a,0x01,0x87,0x01,0x05,0x00,0x0a,0x01,0x87,0x01,0x20,0x00,0x04,0x01,0x87,0x01,0x22,0x00,0x04,0x01,0x87,0x01,0x45,0x00,0x0a,0x01,0x87,0x01,0x5c,0x00,0x12,0x01,0x87,0x01,0x5e,0x00,0x12,0x01,0x87,0x01,0x60,0x00,0x12,0x01,0x87,0x01,0x63,0x00,0x44,0x01,0x87,0x01,0x76,0x00,0x04,0x01,0x87, -0x01,0x80,0x00,0x1d,0x01,0x87,0x01,0x85,0x00,0x0a,0x01,0x87,0x01,0x87,0x00,0x0a,0x01,0x87,0x01,0x8c,0x00,0x1d,0x01,0x87,0x01,0x8e,0x00,0x1d,0x01,0x87,0x01,0x90,0x00,0x1d,0x01,0x88,0x00,0x05,0xff,0x98,0x01,0x88,0x00,0x0a,0xff,0x98,0x01,0x89,0x00,0x0f,0xff,0xa4,0x01,0x89,0x00,0x11,0xff,0xa4,0x01,0x89,0x00,0x24,0xff,0xe5, -0x01,0x89,0x00,0x2d,0xff,0xf6,0x01,0x89,0x00,0x37,0xff,0xa4,0x01,0x89,0x00,0x3b,0xff,0xdb,0x01,0x89,0x00,0x3c,0xff,0xe7,0x01,0x89,0x00,0x3d,0xff,0xcf,0x01,0x89,0x00,0x62,0xff,0xe5,0x01,0x89,0x00,0x63,0xff,0xe5,0x01,0x89,0x00,0xac,0xff,0xa4,0x01,0x89,0x00,0xad,0xff,0xe5,0x01,0x89,0x00,0xae,0xff,0xe5,0x01,0x89,0x00,0xbb, -0xff,0xf6,0x01,0x89,0x00,0xc4,0xff,0x4c,0x01,0x89,0x00,0xc5,0xff,0x98,0x01,0x89,0x00,0xc7,0xff,0xe5,0x01,0x89,0x00,0xc9,0xff,0xe5,0x01,0x89,0x00,0xe5,0xff,0xcf,0x01,0x89,0x00,0xea,0xff,0xe7,0x01,0x89,0x01,0x03,0xff,0xe5,0x01,0x89,0x01,0x05,0xff,0xe5,0x01,0x89,0x01,0x20,0xff,0xa4,0x01,0x89,0x01,0x22,0xff,0xa4,0x01,0x89, -0x01,0x28,0xff,0xcf,0x01,0x89,0x01,0x2a,0xff,0xcf,0x01,0x89,0x01,0x45,0xff,0xe5,0x01,0x89,0x01,0x63,0xff,0xf6,0x01,0x89,0x01,0x76,0xff,0xa4,0x01,0x89,0x01,0x82,0xff,0xe7,0x01,0x89,0x01,0x85,0xff,0xe5,0x01,0x89,0x01,0x87,0xff,0xe5,0x01,0x89,0x01,0x92,0xff,0xe7,0x01,0x8a,0x00,0x05,0xff,0x6f,0x01,0x8a,0x00,0x0a,0xff,0x6f, -0x01,0x8a,0x00,0x44,0xff,0xe5,0x01,0x8a,0x00,0x49,0xff,0xdb,0x01,0x8a,0x00,0x5b,0xff,0xe7,0x01,0x8a,0x00,0x69,0xff,0xe5,0x01,0x8a,0x00,0x6a,0xff,0xe5,0x01,0x8a,0x00,0x6b,0xff,0xe5,0x01,0x8a,0x00,0x6c,0xff,0xe5,0x01,0x8a,0x00,0x6d,0xff,0xe5,0x01,0x8a,0x00,0x6e,0xff,0xe5,0x01,0x8a,0x00,0xa0,0xff,0xe5,0x01,0x8a,0x00,0xb4, -0xff,0xb2,0x01,0x8a,0x00,0xb5,0xff,0x7d,0x01,0x8a,0x00,0xb6,0xff,0xbe,0x01,0x8a,0x00,0xb7,0xff,0x7d,0x01,0x8a,0x00,0xc0,0xff,0xe7,0x01,0x8a,0x00,0xc1,0xff,0xe7,0x01,0x8a,0x01,0x04,0xff,0xe5,0x01,0x8a,0x01,0x06,0xff,0xe5,0x01,0x8a,0x01,0x46,0xff,0xe5,0x01,0x8a,0x01,0x86,0xff,0xe5,0x01,0x8a,0x01,0x88,0xff,0xe5,0x01,0x8c, -0x00,0x0f,0xff,0x8b,0x01,0x8c,0x00,0x11,0xff,0x7f,0x01,0x8c,0x00,0x24,0xff,0xb6,0x01,0x8c,0x00,0x37,0x00,0x27,0x01,0x8c,0x00,0x44,0xff,0xb4,0x01,0x8c,0x00,0x46,0xff,0xcf,0x01,0x8c,0x00,0x47,0xff,0xcf,0x01,0x8c,0x00,0x48,0xff,0xcf,0x01,0x8c,0x00,0x4a,0xff,0xcf,0x01,0x8c,0x00,0x52,0xff,0xcf,0x01,0x8c,0x00,0x54,0xff,0xcf, -0x01,0x8c,0x00,0x62,0xff,0xb6,0x01,0x8c,0x00,0x63,0xff,0xb6,0x01,0x8c,0x00,0x69,0xff,0xb4,0x01,0x8c,0x00,0x6a,0xff,0xb4,0x01,0x8c,0x00,0x6b,0xff,0xb4,0x01,0x8c,0x00,0x6c,0xff,0xb4,0x01,0x8c,0x00,0x6d,0xff,0xb4,0x01,0x8c,0x00,0x6e,0xff,0xb4,0x01,0x8c,0x00,0x6f,0xff,0xcf,0x01,0x8c,0x00,0x70,0xff,0xcf,0x01,0x8c,0x00,0x71, -0xff,0xcf,0x01,0x8c,0x00,0x72,0xff,0xcf,0x01,0x8c,0x00,0x73,0xff,0xcf,0x01,0x8c,0x00,0x76,0x00,0x31,0x01,0x8c,0x00,0x77,0x00,0x64,0x01,0x8c,0x00,0x79,0xff,0xcf,0x01,0x8c,0x00,0x7a,0xff,0xcf,0x01,0x8c,0x00,0x7b,0xff,0xcf,0x01,0x8c,0x00,0x7c,0xff,0xcf,0x01,0x8c,0x00,0x7d,0xff,0xcf,0x01,0x8c,0x00,0x91,0xff,0x9a,0x01,0x8c, -0x00,0xa0,0xff,0xb4,0x01,0x8c,0x00,0xa2,0xff,0xa4,0x01,0x8c,0x00,0xaa,0xff,0xcf,0x01,0x8c,0x00,0xab,0x00,0x27,0x01,0x8c,0x00,0xac,0xff,0x7f,0x01,0x8c,0x00,0xad,0xff,0xb6,0x01,0x8c,0x00,0xae,0xff,0xb6,0x01,0x8c,0x00,0xb1,0xff,0xcf,0x01,0x8c,0x00,0xbe,0xff,0xcf,0x01,0x8c,0x00,0xbf,0x00,0x27,0x01,0x8c,0x00,0xc4,0xff,0x7f, -0x01,0x8c,0x00,0xc5,0xff,0x8b,0x01,0x8c,0x00,0xc7,0xff,0xb6,0x01,0x8c,0x00,0xc9,0xff,0xb6,0x01,0x8c,0x00,0xf8,0xff,0xcf,0x01,0x8c,0x00,0xfd,0xff,0xcf,0x01,0x8c,0x00,0xff,0xff,0xcf,0x01,0x8c,0x01,0x00,0xff,0xcf,0x01,0x8c,0x01,0x03,0xff,0xb6,0x01,0x8c,0x01,0x04,0xff,0xb4,0x01,0x8c,0x01,0x05,0xff,0xb6,0x01,0x8c,0x01,0x06, -0xff,0xb4,0x01,0x8c,0x01,0x08,0xff,0xcf,0x01,0x8c,0x01,0x0b,0xff,0xcf,0x01,0x8c,0x01,0x0d,0xff,0xcf,0x01,0x8c,0x01,0x19,0xff,0xcf,0x01,0x8c,0x01,0x20,0x00,0x27,0x01,0x8c,0x01,0x22,0x00,0x27,0x01,0x8c,0x01,0x45,0xff,0xb6,0x01,0x8c,0x01,0x46,0xff,0xb4,0x01,0x8c,0x01,0x48,0xff,0xcf,0x01,0x8c,0x01,0x4c,0xff,0xcf,0x01,0x8c, -0x01,0x4e,0xff,0xcf,0x01,0x8c,0x01,0x50,0xff,0xcf,0x01,0x8c,0x01,0x52,0xff,0xcf,0x01,0x8c,0x01,0x54,0xff,0xcf,0x01,0x8c,0x01,0x56,0xff,0xcf,0x01,0x8c,0x01,0x5c,0x00,0x64,0x01,0x8c,0x01,0x5e,0x00,0x64,0x01,0x8c,0x01,0x60,0x00,0x64,0x01,0x8c,0x01,0x6f,0xff,0xcf,0x01,0x8c,0x01,0x71,0xff,0xcf,0x01,0x8c,0x01,0x76,0x00,0x27, -0x01,0x8c,0x01,0x85,0xff,0xb6,0x01,0x8c,0x01,0x86,0xff,0xb4,0x01,0x8c,0x01,0x87,0xff,0xb6,0x01,0x8c,0x01,0x88,0xff,0xb4,0x01,0x8c,0x01,0x8a,0xff,0xcf,0x01,0x8d,0x00,0x0f,0xff,0xa6,0x01,0x8d,0x00,0x11,0xff,0x9a,0x01,0x8d,0x00,0x46,0xff,0xfa,0x01,0x8d,0x00,0x47,0xff,0xf6,0x01,0x8d,0x00,0x48,0xff,0xf6,0x01,0x8d,0x00,0x4a, -0xff,0xfa,0x01,0x8d,0x00,0x52,0xff,0xfa,0x01,0x8d,0x00,0x54,0xff,0xf6,0x01,0x8d,0x00,0x6f,0xff,0xfa,0x01,0x8d,0x00,0x70,0xff,0xf6,0x01,0x8d,0x00,0x71,0xff,0xf6,0x01,0x8d,0x00,0x72,0xff,0xf6,0x01,0x8d,0x00,0x73,0xff,0xf6,0x01,0x8d,0x00,0x79,0xff,0xfa,0x01,0x8d,0x00,0x7a,0xff,0xfa,0x01,0x8d,0x00,0x7b,0xff,0xfa,0x01,0x8d, -0x00,0x7c,0xff,0xfa,0x01,0x8d,0x00,0x7d,0xff,0xfa,0x01,0x8d,0x00,0xac,0xff,0x9a,0x01,0x8d,0x00,0xb1,0xff,0xfa,0x01,0x8d,0x00,0xc4,0xff,0xb4,0x01,0x8d,0x00,0xc5,0xff,0xb4,0x01,0x8d,0x00,0xf8,0xff,0xfa,0x01,0x8d,0x00,0xfd,0xff,0xfa,0x01,0x8d,0x00,0xff,0xff,0xfa,0x01,0x8d,0x01,0x00,0xff,0xf6,0x01,0x8d,0x01,0x08,0xff,0xf6, -0x01,0x8d,0x01,0x0b,0xff,0xf6,0x01,0x8d,0x01,0x0d,0xff,0xf6,0x01,0x8d,0x01,0x19,0xff,0xfa,0x01,0x8d,0x01,0x48,0xff,0xfa,0x01,0x8d,0x01,0x4c,0xff,0xf6,0x01,0x8d,0x01,0x4e,0xff,0xf6,0x01,0x8d,0x01,0x50,0xff,0xf6,0x01,0x8d,0x01,0x52,0xff,0xfa,0x01,0x8d,0x01,0x54,0xff,0xfa,0x01,0x8d,0x01,0x56,0xff,0xfa,0x01,0x8d,0x01,0x6f, -0xff,0xfa,0x01,0x8d,0x01,0x71,0xff,0xfa,0x01,0x8d,0x01,0x8a,0xff,0xfa,0x01,0x8e,0x00,0x0f,0xff,0x8b,0x01,0x8e,0x00,0x11,0xff,0x7f,0x01,0x8e,0x00,0x24,0xff,0xb6,0x01,0x8e,0x00,0x37,0x00,0x27,0x01,0x8e,0x00,0x44,0xff,0xb4,0x01,0x8e,0x00,0x46,0xff,0xcf,0x01,0x8e,0x00,0x47,0xff,0xcf,0x01,0x8e,0x00,0x48,0xff,0xcf,0x01,0x8e, -0x00,0x4a,0xff,0xcf,0x01,0x8e,0x00,0x52,0xff,0xcf,0x01,0x8e,0x00,0x54,0xff,0xcf,0x01,0x8e,0x00,0x62,0xff,0xb6,0x01,0x8e,0x00,0x63,0xff,0xb6,0x01,0x8e,0x00,0x69,0xff,0xb4,0x01,0x8e,0x00,0x6a,0xff,0xb4,0x01,0x8e,0x00,0x6b,0xff,0xb4,0x01,0x8e,0x00,0x6c,0xff,0xb4,0x01,0x8e,0x00,0x6d,0xff,0xb4,0x01,0x8e,0x00,0x6e,0xff,0xb4, -0x01,0x8e,0x00,0x6f,0xff,0xcf,0x01,0x8e,0x00,0x70,0xff,0xcf,0x01,0x8e,0x00,0x71,0xff,0xcf,0x01,0x8e,0x00,0x72,0xff,0xcf,0x01,0x8e,0x00,0x73,0xff,0xcf,0x01,0x8e,0x00,0x76,0x00,0x31,0x01,0x8e,0x00,0x77,0x00,0x64,0x01,0x8e,0x00,0x79,0xff,0xcf,0x01,0x8e,0x00,0x7a,0xff,0xcf,0x01,0x8e,0x00,0x7b,0xff,0xcf,0x01,0x8e,0x00,0x7c, -0xff,0xcf,0x01,0x8e,0x00,0x7d,0xff,0xcf,0x01,0x8e,0x00,0x91,0xff,0x9a,0x01,0x8e,0x00,0xa0,0xff,0xb4,0x01,0x8e,0x00,0xa2,0xff,0xa4,0x01,0x8e,0x00,0xaa,0xff,0xcf,0x01,0x8e,0x00,0xab,0x00,0x27,0x01,0x8e,0x00,0xac,0xff,0x7f,0x01,0x8e,0x00,0xad,0xff,0xb6,0x01,0x8e,0x00,0xae,0xff,0xb6,0x01,0x8e,0x00,0xb1,0xff,0xcf,0x01,0x8e, -0x00,0xbe,0xff,0xcf,0x01,0x8e,0x00,0xbf,0x00,0x27,0x01,0x8e,0x00,0xc4,0xff,0x7f,0x01,0x8e,0x00,0xc5,0xff,0x8b,0x01,0x8e,0x00,0xc7,0xff,0xb6,0x01,0x8e,0x00,0xc9,0xff,0xb6,0x01,0x8e,0x00,0xf8,0xff,0xcf,0x01,0x8e,0x00,0xfd,0xff,0xcf,0x01,0x8e,0x00,0xff,0xff,0xcf,0x01,0x8e,0x01,0x00,0xff,0xcf,0x01,0x8e,0x01,0x03,0xff,0xb6, -0x01,0x8e,0x01,0x04,0xff,0xb4,0x01,0x8e,0x01,0x05,0xff,0xb6,0x01,0x8e,0x01,0x06,0xff,0xb4,0x01,0x8e,0x01,0x08,0xff,0xcf,0x01,0x8e,0x01,0x0b,0xff,0xcf,0x01,0x8e,0x01,0x0d,0xff,0xcf,0x01,0x8e,0x01,0x19,0xff,0xcf,0x01,0x8e,0x01,0x20,0x00,0x27,0x01,0x8e,0x01,0x22,0x00,0x27,0x01,0x8e,0x01,0x45,0xff,0xb6,0x01,0x8e,0x01,0x46, -0xff,0xb4,0x01,0x8e,0x01,0x48,0xff,0xcf,0x01,0x8e,0x01,0x4c,0xff,0xcf,0x01,0x8e,0x01,0x4e,0xff,0xcf,0x01,0x8e,0x01,0x50,0xff,0xcf,0x01,0x8e,0x01,0x52,0xff,0xcf,0x01,0x8e,0x01,0x54,0xff,0xcf,0x01,0x8e,0x01,0x56,0xff,0xcf,0x01,0x8e,0x01,0x5c,0x00,0x64,0x01,0x8e,0x01,0x5e,0x00,0x64,0x01,0x8e,0x01,0x60,0x00,0x64,0x01,0x8e, -0x01,0x6f,0xff,0xcf,0x01,0x8e,0x01,0x71,0xff,0xcf,0x01,0x8e,0x01,0x76,0x00,0x27,0x01,0x8e,0x01,0x85,0xff,0xb6,0x01,0x8e,0x01,0x86,0xff,0xb4,0x01,0x8e,0x01,0x87,0xff,0xb6,0x01,0x8e,0x01,0x88,0xff,0xb4,0x01,0x8e,0x01,0x8a,0xff,0xcf,0x01,0x8f,0x00,0x0f,0xff,0xa6,0x01,0x8f,0x00,0x11,0xff,0x9a,0x01,0x8f,0x00,0x46,0xff,0xfa, -0x01,0x8f,0x00,0x47,0xff,0xf6,0x01,0x8f,0x00,0x48,0xff,0xf6,0x01,0x8f,0x00,0x4a,0xff,0xfa,0x01,0x8f,0x00,0x52,0xff,0xfa,0x01,0x8f,0x00,0x54,0xff,0xf6,0x01,0x8f,0x00,0x6f,0xff,0xfa,0x01,0x8f,0x00,0x70,0xff,0xf6,0x01,0x8f,0x00,0x71,0xff,0xf6,0x01,0x8f,0x00,0x72,0xff,0xf6,0x01,0x8f,0x00,0x73,0xff,0xf6,0x01,0x8f,0x00,0x79, -0xff,0xfa,0x01,0x8f,0x00,0x7a,0xff,0xfa,0x01,0x8f,0x00,0x7b,0xff,0xfa,0x01,0x8f,0x00,0x7c,0xff,0xfa,0x01,0x8f,0x00,0x7d,0xff,0xfa,0x01,0x8f,0x00,0xac,0xff,0x9a,0x01,0x8f,0x00,0xb1,0xff,0xfa,0x01,0x8f,0x00,0xc4,0xff,0xb4,0x01,0x8f,0x00,0xc5,0xff,0xb4,0x01,0x8f,0x00,0xf8,0xff,0xfa,0x01,0x8f,0x00,0xfd,0xff,0xfa,0x01,0x8f, -0x00,0xff,0xff,0xfa,0x01,0x8f,0x01,0x00,0xff,0xf6,0x01,0x8f,0x01,0x08,0xff,0xf6,0x01,0x8f,0x01,0x0b,0xff,0xf6,0x01,0x8f,0x01,0x0d,0xff,0xf6,0x01,0x8f,0x01,0x19,0xff,0xfa,0x01,0x8f,0x01,0x48,0xff,0xfa,0x01,0x8f,0x01,0x4c,0xff,0xf6,0x01,0x8f,0x01,0x4e,0xff,0xf6,0x01,0x8f,0x01,0x50,0xff,0xf6,0x01,0x8f,0x01,0x52,0xff,0xfa, -0x01,0x8f,0x01,0x54,0xff,0xfa,0x01,0x8f,0x01,0x56,0xff,0xfa,0x01,0x8f,0x01,0x6f,0xff,0xfa,0x01,0x8f,0x01,0x71,0xff,0xfa,0x01,0x8f,0x01,0x8a,0xff,0xfa,0x01,0x90,0x00,0x0f,0xff,0x8b,0x01,0x90,0x00,0x11,0xff,0x7f,0x01,0x90,0x00,0x24,0xff,0xb6,0x01,0x90,0x00,0x37,0x00,0x27,0x01,0x90,0x00,0x44,0xff,0xb4,0x01,0x90,0x00,0x46, -0xff,0xcf,0x01,0x90,0x00,0x47,0xff,0xcf,0x01,0x90,0x00,0x48,0xff,0xcf,0x01,0x90,0x00,0x4a,0xff,0xcf,0x01,0x90,0x00,0x52,0xff,0xcf,0x01,0x90,0x00,0x54,0xff,0xcf,0x01,0x90,0x00,0x62,0xff,0xb6,0x01,0x90,0x00,0x63,0xff,0xb6,0x01,0x90,0x00,0x69,0xff,0xb4,0x01,0x90,0x00,0x6a,0xff,0xb4,0x01,0x90,0x00,0x6b,0xff,0xb4,0x01,0x90, -0x00,0x6c,0xff,0xb4,0x01,0x90,0x00,0x6d,0xff,0xb4,0x01,0x90,0x00,0x6e,0xff,0xb4,0x01,0x90,0x00,0x6f,0xff,0xcf,0x01,0x90,0x00,0x70,0xff,0xcf,0x01,0x90,0x00,0x71,0xff,0xcf,0x01,0x90,0x00,0x72,0xff,0xcf,0x01,0x90,0x00,0x73,0xff,0xcf,0x01,0x90,0x00,0x76,0x00,0x31,0x01,0x90,0x00,0x77,0x00,0x64,0x01,0x90,0x00,0x79,0xff,0xcf, -0x01,0x90,0x00,0x7a,0xff,0xcf,0x01,0x90,0x00,0x7b,0xff,0xcf,0x01,0x90,0x00,0x7c,0xff,0xcf,0x01,0x90,0x00,0x7d,0xff,0xcf,0x01,0x90,0x00,0x91,0xff,0x9a,0x01,0x90,0x00,0xa0,0xff,0xb4,0x01,0x90,0x00,0xa2,0xff,0xa4,0x01,0x90,0x00,0xaa,0xff,0xcf,0x01,0x90,0x00,0xab,0x00,0x27,0x01,0x90,0x00,0xac,0xff,0x7f,0x01,0x90,0x00,0xad, -0xff,0xb6,0x01,0x90,0x00,0xae,0xff,0xb6,0x01,0x90,0x00,0xb1,0xff,0xcf,0x01,0x90,0x00,0xbe,0xff,0xcf,0x01,0x90,0x00,0xbf,0x00,0x27,0x01,0x90,0x00,0xc4,0xff,0x7f,0x01,0x90,0x00,0xc5,0xff,0x8b,0x01,0x90,0x00,0xc7,0xff,0xb6,0x01,0x90,0x00,0xc9,0xff,0xb6,0x01,0x90,0x00,0xf8,0xff,0xcf,0x01,0x90,0x00,0xfd,0xff,0xcf,0x01,0x90, -0x00,0xff,0xff,0xcf,0x01,0x90,0x01,0x00,0xff,0xcf,0x01,0x90,0x01,0x03,0xff,0xb6,0x01,0x90,0x01,0x04,0xff,0xb4,0x01,0x90,0x01,0x05,0xff,0xb6,0x01,0x90,0x01,0x06,0xff,0xb4,0x01,0x90,0x01,0x08,0xff,0xcf,0x01,0x90,0x01,0x0b,0xff,0xcf,0x01,0x90,0x01,0x0d,0xff,0xcf,0x01,0x90,0x01,0x19,0xff,0xcf,0x01,0x90,0x01,0x20,0x00,0x27, -0x01,0x90,0x01,0x22,0x00,0x27,0x01,0x90,0x01,0x45,0xff,0xb6,0x01,0x90,0x01,0x46,0xff,0xb4,0x01,0x90,0x01,0x48,0xff,0xcf,0x01,0x90,0x01,0x4c,0xff,0xcf,0x01,0x90,0x01,0x4e,0xff,0xcf,0x01,0x90,0x01,0x50,0xff,0xcf,0x01,0x90,0x01,0x52,0xff,0xcf,0x01,0x90,0x01,0x54,0xff,0xcf,0x01,0x90,0x01,0x56,0xff,0xcf,0x01,0x90,0x01,0x5c, -0x00,0x64,0x01,0x90,0x01,0x5e,0x00,0x64,0x01,0x90,0x01,0x60,0x00,0x64,0x01,0x90,0x01,0x6f,0xff,0xcf,0x01,0x90,0x01,0x71,0xff,0xcf,0x01,0x90,0x01,0x76,0x00,0x27,0x01,0x90,0x01,0x85,0xff,0xb6,0x01,0x90,0x01,0x86,0xff,0xb4,0x01,0x90,0x01,0x87,0xff,0xb6,0x01,0x90,0x01,0x88,0xff,0xb4,0x01,0x90,0x01,0x8a,0xff,0xcf,0x01,0x91, -0x00,0x0f,0xff,0xa6,0x01,0x91,0x00,0x11,0xff,0x9a,0x01,0x91,0x00,0x46,0xff,0xfa,0x01,0x91,0x00,0x47,0xff,0xf6,0x01,0x91,0x00,0x48,0xff,0xf6,0x01,0x91,0x00,0x4a,0xff,0xfa,0x01,0x91,0x00,0x52,0xff,0xfa,0x01,0x91,0x00,0x54,0xff,0xf6,0x01,0x91,0x00,0x6f,0xff,0xfa,0x01,0x91,0x00,0x70,0xff,0xf6,0x01,0x91,0x00,0x71,0xff,0xf6, -0x01,0x91,0x00,0x72,0xff,0xf6,0x01,0x91,0x00,0x73,0xff,0xf6,0x01,0x91,0x00,0x79,0xff,0xfa,0x01,0x91,0x00,0x7a,0xff,0xfa,0x01,0x91,0x00,0x7b,0xff,0xfa,0x01,0x91,0x00,0x7c,0xff,0xfa,0x01,0x91,0x00,0x7d,0xff,0xfa,0x01,0x91,0x00,0xac,0xff,0x9a,0x01,0x91,0x00,0xb1,0xff,0xfa,0x01,0x91,0x00,0xc4,0xff,0xb4,0x01,0x91,0x00,0xc5, -0xff,0xb4,0x01,0x91,0x00,0xf8,0xff,0xfa,0x01,0x91,0x00,0xfd,0xff,0xfa,0x01,0x91,0x00,0xff,0xff,0xfa,0x01,0x91,0x01,0x00,0xff,0xf6,0x01,0x91,0x01,0x08,0xff,0xf6,0x01,0x91,0x01,0x0b,0xff,0xf6,0x01,0x91,0x01,0x0d,0xff,0xf6,0x01,0x91,0x01,0x19,0xff,0xfa,0x01,0x91,0x01,0x48,0xff,0xfa,0x01,0x91,0x01,0x4c,0xff,0xf6,0x01,0x91, -0x01,0x4e,0xff,0xf6,0x01,0x91,0x01,0x50,0xff,0xf6,0x01,0x91,0x01,0x52,0xff,0xfa,0x01,0x91,0x01,0x54,0xff,0xfa,0x01,0x91,0x01,0x56,0xff,0xfa,0x01,0x91,0x01,0x6f,0xff,0xfa,0x01,0x91,0x01,0x71,0xff,0xfa,0x01,0x91,0x01,0x8a,0xff,0xfa,0x01,0x92,0x00,0x0f,0xff,0x50,0x01,0x92,0x00,0x11,0xff,0x3d,0x01,0x92,0x00,0x24,0xff,0x62, -0x01,0x92,0x00,0x26,0xff,0xd3,0x01,0x92,0x00,0x2a,0xff,0xd3,0x01,0x92,0x00,0x2d,0xff,0xbe,0x01,0x92,0x00,0x32,0xff,0xd3,0x01,0x92,0x00,0x34,0xff,0xd3,0x01,0x92,0x00,0x36,0xff,0xe5,0x01,0x92,0x00,0x37,0x00,0x27,0x01,0x92,0x00,0x44,0xff,0x39,0x01,0x92,0x00,0x46,0xff,0x4c,0x01,0x92,0x00,0x47,0xff,0x4c,0x01,0x92,0x00,0x48, -0xff,0x4c,0x01,0x92,0x00,0x49,0xff,0xe5,0x01,0x92,0x00,0x4a,0xff,0x4c,0x01,0x92,0x00,0x50,0xff,0x73,0x01,0x92,0x00,0x51,0xff,0x73,0x01,0x92,0x00,0x52,0xff,0x4c,0x01,0x92,0x00,0x53,0xff,0x73,0x01,0x92,0x00,0x54,0xff,0x4c,0x01,0x92,0x00,0x55,0xff,0x73,0x01,0x92,0x00,0x56,0xff,0x7b,0x01,0x92,0x00,0x58,0xff,0x73,0x01,0x92, -0x00,0x62,0xff,0x62,0x01,0x92,0x00,0x63,0xff,0x62,0x01,0x92,0x00,0x64,0xff,0xcd,0x01,0x92,0x00,0x67,0xff,0xd3,0x01,0x92,0x00,0x69,0xff,0x39,0x01,0x92,0x00,0x6a,0xff,0x39,0x01,0x92,0x00,0x6b,0xff,0x39,0x01,0x92,0x00,0x6c,0xff,0x7f,0x01,0x92,0x00,0x6d,0xff,0x66,0x01,0x92,0x00,0x6e,0xff,0x39,0x01,0x92,0x00,0x6f,0xff,0x4c, -0x01,0x92,0x00,0x70,0xff,0x4c,0x01,0x92,0x00,0x71,0xff,0x4c,0x01,0x92,0x00,0x72,0xff,0x4c,0x01,0x92,0x00,0x73,0xff,0x4c,0x01,0x92,0x00,0x77,0x00,0x5a,0x01,0x92,0x00,0x78,0xff,0x73,0x01,0x92,0x00,0x79,0xff,0x4c,0x01,0x92,0x00,0x7a,0xff,0x4c,0x01,0x92,0x00,0x7b,0xff,0x4c,0x01,0x92,0x00,0x7c,0xff,0x4c,0x01,0x92,0x00,0x7d, -0xff,0x4c,0x01,0x92,0x00,0x7e,0xff,0x73,0x01,0x92,0x00,0x7f,0xff,0x73,0x01,0x92,0x00,0x80,0xff,0x73,0x01,0x92,0x00,0x81,0xff,0x73,0x01,0x92,0x00,0x91,0xff,0x3f,0x01,0x92,0x00,0x92,0xff,0xd3,0x01,0x92,0x00,0xa0,0xff,0x39,0x01,0x92,0x00,0xa2,0xff,0x1b,0x01,0x92,0x00,0xaa,0xff,0xcf,0x01,0x92,0x00,0xac,0xff,0x3d,0x01,0x92, -0x00,0xad,0xff,0x62,0x01,0x92,0x00,0xae,0xff,0x62,0x01,0x92,0x00,0xaf,0xff,0xd3,0x01,0x92,0x00,0xb0,0xff,0xd3,0x01,0x92,0x00,0xb1,0xff,0x4c,0x01,0x92,0x00,0xbe,0xff,0x9a,0x01,0x92,0x00,0xc4,0xff,0x08,0x01,0x92,0x00,0xc5,0xff,0x08,0x01,0x92,0x00,0xc7,0xff,0x62,0x01,0x92,0x00,0xc9,0xff,0x62,0x01,0x92,0x00,0xd0,0xff,0xd3, -0x01,0x92,0x00,0xd1,0xff,0xd3,0x01,0x92,0x00,0xd2,0xff,0xd3,0x01,0x92,0x00,0xe3,0xff,0xe5,0x01,0x92,0x00,0xe4,0xff,0x7b,0x01,0x92,0x00,0xf7,0xff,0xd3,0x01,0x92,0x00,0xf8,0xff,0x4c,0x01,0x92,0x00,0xfa,0xff,0xe5,0x01,0x92,0x00,0xfb,0xff,0x7b,0x01,0x92,0x00,0xfc,0xff,0xd3,0x01,0x92,0x00,0xfd,0xff,0x4c,0x01,0x92,0x00,0xfe, -0xff,0xd3,0x01,0x92,0x00,0xff,0xff,0x4c,0x01,0x92,0x01,0x00,0xff,0x4c,0x01,0x92,0x01,0x03,0xff,0x62,0x01,0x92,0x01,0x04,0xff,0x7f,0x01,0x92,0x01,0x05,0xff,0x62,0x01,0x92,0x01,0x06,0xff,0x39,0x01,0x92,0x01,0x08,0xff,0x4c,0x01,0x92,0x01,0x0b,0xff,0x4c,0x01,0x92,0x01,0x0d,0xff,0x4c,0x01,0x92,0x01,0x15,0xff,0x73,0x01,0x92, -0x01,0x17,0xff,0x73,0x01,0x92,0x01,0x18,0xff,0xd3,0x01,0x92,0x01,0x19,0xff,0x4c,0x01,0x92,0x01,0x1b,0xff,0x73,0x01,0x92,0x01,0x1d,0xff,0x73,0x01,0x92,0x01,0x1e,0xff,0xe5,0x01,0x92,0x01,0x1f,0xff,0x7b,0x01,0x92,0x01,0x20,0x00,0x27,0x01,0x92,0x01,0x22,0x00,0x27,0x01,0x92,0x01,0x25,0xff,0x73,0x01,0x92,0x01,0x27,0xff,0x73, -0x01,0x92,0x01,0x45,0xff,0x62,0x01,0x92,0x01,0x46,0xff,0x7f,0x01,0x92,0x01,0x47,0xff,0xd3,0x01,0x92,0x01,0x48,0xff,0x4c,0x01,0x92,0x01,0x4c,0xff,0x4c,0x01,0x92,0x01,0x4e,0xff,0x4c,0x01,0x92,0x01,0x50,0xff,0x4c,0x01,0x92,0x01,0x51,0xff,0xd3,0x01,0x92,0x01,0x52,0xff,0x4c,0x01,0x92,0x01,0x53,0xff,0xd3,0x01,0x92,0x01,0x54, -0xff,0x4c,0x01,0x92,0x01,0x55,0xff,0xd3,0x01,0x92,0x01,0x56,0xff,0x4c,0x01,0x92,0x01,0x5c,0x00,0x5a,0x01,0x92,0x01,0x5e,0x00,0x5a,0x01,0x92,0x01,0x60,0x00,0x5a,0x01,0x92,0x01,0x63,0xff,0xbe,0x01,0x92,0x01,0x6d,0xff,0x73,0x01,0x92,0x01,0x6e,0xff,0xd3,0x01,0x92,0x01,0x6f,0xff,0x4c,0x01,0x92,0x01,0x70,0xff,0xd3,0x01,0x92, -0x01,0x71,0xff,0x4c,0x01,0x92,0x01,0x73,0xff,0x73,0x01,0x92,0x01,0x74,0xff,0xe5,0x01,0x92,0x01,0x75,0xff,0x7b,0x01,0x92,0x01,0x76,0x00,0x27,0x01,0x92,0x01,0x79,0xff,0x73,0x01,0x92,0x01,0x7b,0xff,0x73,0x01,0x92,0x01,0x7d,0xff,0x73,0x01,0x92,0x01,0x7f,0xff,0x73,0x01,0x92,0x01,0x85,0xff,0x62,0x01,0x92,0x01,0x86,0xff,0x7f, -0x01,0x92,0x01,0x87,0xff,0x62,0x01,0x92,0x01,0x88,0xff,0x39,0x01,0x92,0x01,0x89,0xff,0xd3,0x01,0x92,0x01,0x8a,0xff,0x4c,0x01,0x92,0x02,0x3d,0xff,0xe5,0x01,0x92,0x02,0x3e,0xff,0x7b,0x01,0x93,0x00,0x05,0x00,0x1d,0x01,0x93,0x00,0x0a,0x00,0x1d,0x01,0x93,0x00,0x0f,0xff,0x9a,0x01,0x93,0x00,0x11,0xff,0x81,0x01,0x93,0x00,0x22, -0xff,0xb4,0x01,0x93,0x00,0x46,0xff,0xf6,0x01,0x93,0x00,0x47,0xff,0xf6,0x01,0x93,0x00,0x48,0xff,0xf6,0x01,0x93,0x00,0x49,0x00,0x04,0x01,0x93,0x00,0x4a,0xff,0xf6,0x01,0x93,0x00,0x52,0xff,0xf6,0x01,0x93,0x00,0x54,0xff,0xf6,0x01,0x93,0x00,0x57,0x00,0x06,0x01,0x93,0x00,0x6f,0xff,0xf6,0x01,0x93,0x00,0x70,0xff,0xf6,0x01,0x93, -0x00,0x71,0xff,0xf6,0x01,0x93,0x00,0x72,0xff,0xf6,0x01,0x93,0x00,0x73,0xff,0xf6,0x01,0x93,0x00,0x79,0xff,0xf6,0x01,0x93,0x00,0x7a,0xff,0xf6,0x01,0x93,0x00,0x7b,0xff,0xf6,0x01,0x93,0x00,0x7c,0xff,0xf6,0x01,0x93,0x00,0x7d,0xff,0xf6,0x01,0x93,0x00,0xac,0xff,0x81,0x01,0x93,0x00,0xb1,0xff,0xf6,0x01,0x93,0x00,0xbf,0x00,0x0c, -0x01,0x93,0x00,0xc4,0xff,0x8d,0x01,0x93,0x00,0xc5,0xff,0x8d,0x01,0x93,0x00,0xf8,0xff,0xf6,0x01,0x93,0x00,0xfd,0xff,0xf6,0x01,0x93,0x00,0xff,0xff,0xf6,0x01,0x93,0x01,0x00,0xff,0xf6,0x01,0x93,0x01,0x08,0xff,0xf6,0x01,0x93,0x01,0x0b,0xff,0xf6,0x01,0x93,0x01,0x0d,0xff,0xf6,0x01,0x93,0x01,0x19,0xff,0xf6,0x01,0x93,0x01,0x21, -0x00,0x06,0x01,0x93,0x01,0x23,0x00,0x06,0x01,0x93,0x01,0x48,0xff,0xf6,0x01,0x93,0x01,0x4c,0xff,0xf6,0x01,0x93,0x01,0x4e,0xff,0xf6,0x01,0x93,0x01,0x50,0xff,0xf6,0x01,0x93,0x01,0x52,0xff,0xf6,0x01,0x93,0x01,0x54,0xff,0xf6,0x01,0x93,0x01,0x56,0xff,0xf6,0x01,0x93,0x01,0x6f,0xff,0xf6,0x01,0x93,0x01,0x71,0xff,0xf6,0x01,0x93, -0x01,0x77,0x00,0x06,0x01,0x93,0x01,0x8a,0xff,0xf6,0x01,0xa1,0x00,0x0d,0xff,0x7f,0x01,0xa1,0x00,0x8d,0xff,0x98,0x01,0xa1,0x00,0xb4,0xff,0x66,0x01,0xa1,0x00,0xb5,0xff,0x3d,0x01,0xa1,0x00,0xb6,0xff,0x66,0x01,0xa1,0x00,0xb7,0xff,0x3d,0x01,0xa1,0x01,0x2d,0xff,0xe5,0x01,0xa1,0x01,0x2e,0xff,0xcf,0x01,0xa1,0x01,0x33,0xff,0x8f, -0x01,0xa1,0x01,0xb4,0xff,0xe5,0x01,0xa1,0x01,0xb7,0x00,0x3d,0x01,0xa1,0x01,0xb8,0xff,0x6d,0x01,0xa1,0x01,0xb9,0xff,0x64,0x01,0xa1,0x01,0xbb,0xff,0x79,0x01,0xa1,0x01,0xbe,0xff,0x64,0x01,0xa1,0x01,0xc5,0xff,0xaa,0x01,0xa1,0x01,0xc8,0xff,0xe7,0x01,0xa1,0x01,0xd3,0xff,0xcf,0x01,0xa2,0x00,0xa9,0x00,0x0c,0x01,0xa2,0x01,0xa8, -0x00,0x0a,0x01,0xa2,0x01,0xa9,0x00,0x0c,0x01,0xa2,0x01,0xb0,0x00,0x0c,0x01,0xa2,0x01,0xb8,0x00,0x33,0x01,0xa5,0x01,0xa9,0xff,0xe5,0x01,0xa5,0x01,0xb0,0xff,0xe5,0x01,0xa5,0x01,0xb8,0xff,0xa4,0x01,0xa5,0x01,0xb9,0xff,0xe7,0x01,0xa5,0x01,0xbe,0xff,0xe7,0x01,0xa5,0x01,0xcb,0xff,0xd7,0x01,0xa6,0x00,0x04,0xff,0xd7,0x01,0xa6, -0x00,0x11,0xff,0x71,0x01,0xa6,0x00,0x1e,0xff,0x4c,0x01,0xa6,0x00,0xa2,0xff,0xd7,0x01,0xa6,0x00,0xa9,0xff,0x71,0x01,0xa6,0x00,0xac,0xff,0x71,0x01,0xa6,0x01,0x2d,0xff,0xd3,0x01,0xa6,0x01,0x2e,0xff,0xd3,0x01,0xa6,0x01,0x2f,0xff,0x4c,0x01,0xa6,0x01,0x30,0xff,0xc3,0x01,0xa6,0x01,0x31,0xff,0x9c,0x01,0xa6,0x01,0x32,0xff,0x4c, -0x01,0xa6,0x01,0x33,0xff,0xcf,0x01,0xa6,0x01,0x34,0xff,0x4c,0x01,0xa6,0x01,0xa9,0xff,0x60,0x01,0xa6,0x01,0xb0,0xff,0x60,0x01,0xa6,0x01,0xb4,0xff,0xd3,0x01,0xa6,0x01,0xb8,0x00,0x29,0x01,0xa6,0x01,0xbf,0xff,0x4c,0x01,0xa6,0x01,0xc0,0xff,0x9c,0x01,0xa6,0x01,0xc3,0xff,0x9a,0x01,0xa6,0x01,0xc6,0xff,0xc1,0x01,0xa6,0x01,0xc7, -0xff,0x71,0x01,0xa6,0x01,0xc9,0xff,0xd7,0x01,0xa6,0x01,0xca,0xff,0x71,0x01,0xa6,0x01,0xcc,0xff,0x71,0x01,0xa6,0x01,0xce,0xff,0xb0,0x01,0xa6,0x01,0xcf,0xff,0x4c,0x01,0xa6,0x01,0xd0,0xff,0x71,0x01,0xa6,0x01,0xd1,0xff,0x4c,0x01,0xa6,0x01,0xd2,0xff,0x9a,0x01,0xa6,0x01,0xd3,0xff,0xdb,0x01,0xa6,0x01,0xd4,0xff,0x9a,0x01,0xa6, -0x01,0xd5,0xff,0x4c,0x01,0xa6,0x01,0xd7,0xff,0x9a,0x01,0xa6,0x01,0xd8,0xff,0x4c,0x01,0xa6,0x01,0xd9,0xff,0x9a,0x01,0xa6,0x01,0xda,0xff,0x4c,0x01,0xa6,0x02,0x37,0xff,0xcf,0x01,0xa8,0x01,0xcb,0x00,0x6a,0x01,0xa9,0x00,0x0d,0xff,0x7f,0x01,0xa9,0x00,0x0f,0x00,0x46,0x01,0xa9,0x00,0x1e,0x00,0x46,0x01,0xa9,0x00,0x8d,0xff,0x98, -0x01,0xa9,0x00,0xa4,0xff,0xf6,0x01,0xa9,0x00,0xb4,0xff,0x66,0x01,0xa9,0x00,0xb5,0xff,0x3d,0x01,0xa9,0x00,0xb6,0xff,0x66,0x01,0xa9,0x00,0xb7,0xff,0x3d,0x01,0xa9,0x01,0x2d,0xff,0xe5,0x01,0xa9,0x01,0x2e,0xff,0xcf,0x01,0xa9,0x01,0x33,0xff,0x8f,0x01,0xa9,0x01,0xb4,0xff,0xe5,0x01,0xa9,0x01,0xb7,0x00,0x3d,0x01,0xa9,0x01,0xb8, -0xff,0x6d,0x01,0xa9,0x01,0xb9,0xff,0x64,0x01,0xa9,0x01,0xbb,0xff,0x79,0x01,0xa9,0x01,0xbe,0xff,0x64,0x01,0xa9,0x01,0xc5,0xff,0xaa,0x01,0xa9,0x01,0xc8,0xff,0xe7,0x01,0xa9,0x01,0xcb,0x00,0x3d,0x01,0xa9,0x01,0xcd,0xff,0xcf,0x01,0xa9,0x01,0xd3,0xff,0xcf,0x01,0xa9,0x01,0xd4,0xff,0xf6,0x01,0xaa,0x00,0xc4,0xff,0xb0,0x01,0xaa, -0x00,0xc5,0xff,0xb0,0x01,0xaa,0x01,0xb8,0xff,0xa4,0x01,0xaa,0x01,0xb9,0xff,0xbe,0x01,0xaa,0x01,0xbb,0xff,0xe7,0x01,0xaa,0x01,0xbe,0xff,0xbe,0x01,0xaa,0x01,0xd3,0xff,0xe7,0x01,0xab,0x00,0xa9,0x00,0x0c,0x01,0xab,0x01,0xa8,0x00,0x0a,0x01,0xab,0x01,0xa9,0x00,0x0c,0x01,0xab,0x01,0xb0,0x00,0x0c,0x01,0xab,0x01,0xb8,0x00,0x33, -0x01,0xab,0x01,0xba,0x00,0x0a,0x01,0xac,0x00,0xab,0x00,0x29,0x01,0xac,0x00,0xbf,0x00,0x52,0x01,0xac,0x01,0xa8,0x00,0x3d,0x01,0xac,0x01,0xb8,0x00,0x29,0x01,0xac,0x01,0xcb,0x00,0x25,0x01,0xaf,0x00,0x0f,0x00,0x29,0x01,0xaf,0x00,0x1e,0x00,0x29,0x01,0xaf,0x00,0xc4,0x00,0x46,0x01,0xaf,0x00,0xc5,0x00,0x46,0x01,0xaf,0x01,0x2d, -0xff,0xa6,0x01,0xaf,0x01,0x2e,0xff,0x91,0x01,0xaf,0x01,0x2f,0xff,0xe7,0x01,0xaf,0x01,0x30,0xff,0xe7,0x01,0xaf,0x01,0x32,0xff,0xe7,0x01,0xaf,0x01,0x33,0xff,0x9a,0x01,0xaf,0x01,0x34,0xff,0xe7,0x01,0xaf,0x01,0xa8,0x00,0x4a,0x01,0xaf,0x01,0xac,0x00,0x29,0x01,0xaf,0x01,0xb4,0xff,0xa6,0x01,0xaf,0x01,0xb7,0x00,0x3f,0x01,0xaf, -0x01,0xba,0x00,0x25,0x01,0xaf,0x01,0xbb,0xff,0xdb,0x01,0xaf,0x01,0xbf,0xff,0xe7,0x01,0xaf,0x01,0xc2,0xff,0xe7,0x01,0xaf,0x01,0xc3,0xff,0xe7,0x01,0xaf,0x01,0xc5,0xff,0xd1,0x01,0xaf,0x01,0xc8,0xff,0xe7,0x01,0xaf,0x01,0xc9,0xff,0xe7,0x01,0xaf,0x01,0xca,0x00,0x29,0x01,0xaf,0x01,0xcb,0x00,0x3d,0x01,0xaf,0x01,0xcc,0x00,0x29, -0x01,0xaf,0x01,0xcf,0xff,0xe7,0x01,0xaf,0x01,0xd1,0xff,0xe7,0x01,0xaf,0x01,0xd2,0xff,0xe7,0x01,0xaf,0x01,0xd4,0xff,0xe7,0x01,0xaf,0x01,0xd5,0xff,0xe7,0x01,0xaf,0x01,0xd7,0xff,0xe7,0x01,0xaf,0x01,0xd9,0xff,0xe7,0x01,0xaf,0x01,0xda,0xff,0xe7,0x01,0xb0,0x00,0x0d,0xff,0x7f,0x01,0xb0,0x00,0x8d,0xff,0x98,0x01,0xb0,0x00,0xb4, -0xff,0x66,0x01,0xb0,0x00,0xb5,0xff,0x3d,0x01,0xb0,0x00,0xb6,0xff,0x66,0x01,0xb0,0x00,0xb7,0xff,0x3d,0x01,0xb0,0x01,0x2d,0xff,0xe5,0x01,0xb0,0x01,0x2e,0xff,0xcf,0x01,0xb0,0x01,0x33,0xff,0x8f,0x01,0xb0,0x01,0xb4,0xff,0xe5,0x01,0xb0,0x01,0xb7,0x00,0x3d,0x01,0xb0,0x01,0xb8,0xff,0x6d,0x01,0xb0,0x01,0xb9,0xff,0x64,0x01,0xb0, -0x01,0xbb,0xff,0x79,0x01,0xb0,0x01,0xbe,0xff,0x64,0x01,0xb0,0x01,0xc3,0xff,0xf6,0x01,0xb0,0x01,0xc5,0xff,0xaa,0x01,0xb0,0x01,0xc8,0xff,0xe7,0x01,0xb0,0x01,0xcb,0x00,0x3d,0x01,0xb0,0x01,0xcd,0xff,0xcf,0x01,0xb0,0x01,0xd3,0xff,0xcf,0x01,0xb0,0x01,0xd4,0xff,0xf6,0x01,0xb0,0x01,0xd9,0xff,0xf6,0x01,0xb3,0x01,0xa8,0x00,0x3d, -0x01,0xb3,0x01,0xb7,0x00,0x25,0x01,0xb3,0x01,0xcb,0x00,0x3d,0x01,0xb4,0x00,0x0f,0xff,0xa2,0x01,0xb4,0x00,0xa9,0xff,0xcf,0x01,0xb4,0x00,0xc4,0xff,0x4a,0x01,0xb4,0x00,0xc5,0xff,0x96,0x01,0xb4,0x01,0xa9,0xff,0xe5,0x01,0xb4,0x01,0xac,0xff,0xcd,0x01,0xb4,0x01,0xb0,0xff,0xe5,0x01,0xb4,0x01,0xb7,0xff,0xe3,0x01,0xb4,0x01,0xb8, -0xff,0xa4,0x01,0xb4,0x01,0xb9,0xff,0xe7,0x01,0xb4,0x01,0xba,0xff,0xdb,0x01,0xb4,0x01,0xbe,0xff,0xe7,0x01,0xb4,0x01,0xcb,0xff,0xd7,0x01,0xb6,0x00,0x0f,0xfe,0xba,0x01,0xb6,0x00,0x11,0xfe,0xba,0x01,0xb6,0x00,0xa9,0xff,0x58,0x01,0xb6,0x00,0xac,0xfe,0xba,0x01,0xb6,0x00,0xc4,0xfe,0xba,0x01,0xb6,0x00,0xc5,0xfe,0xae,0x01,0xb6, -0x01,0x2f,0xff,0xb2,0x01,0xb6,0x01,0x30,0xff,0xb2,0x01,0xb6,0x01,0x32,0xff,0xb2,0x01,0xb6,0x01,0x34,0xff,0xb2,0x01,0xb6,0x01,0xa9,0xff,0x60,0x01,0xb6,0x01,0xb0,0xff,0x60,0x01,0xb6,0x01,0xba,0xff,0xc3,0x01,0xb6,0x01,0xbf,0xff,0xb2,0x01,0xb6,0x01,0xcb,0xff,0xc3,0x01,0xb6,0x01,0xcf,0xff,0xb2,0x01,0xb6,0x01,0xd0,0xff,0xa0, -0x01,0xb6,0x01,0xd1,0xff,0xc3,0x01,0xb6,0x01,0xd5,0xff,0xc3,0x01,0xb6,0x01,0xd8,0xff,0xb2,0x01,0xb7,0x00,0xa9,0x00,0x3d,0x01,0xb7,0x01,0x2d,0xff,0xe7,0x01,0xb7,0x01,0x2e,0xff,0xe7,0x01,0xb7,0x01,0x33,0xff,0xb6,0x01,0xb7,0x01,0xa9,0x00,0x3d,0x01,0xb7,0x01,0xb0,0x00,0x3d,0x01,0xb7,0x01,0xb3,0x00,0x25,0x01,0xb7,0x01,0xb4, -0xff,0xe7,0x01,0xb7,0x01,0xba,0x00,0x12,0x01,0xb7,0x01,0xcb,0x00,0x3d,0x01,0xb7,0x01,0xd3,0xff,0xdb,0x01,0xb8,0x00,0x0f,0xff,0x7d,0x01,0xb8,0x00,0x11,0xff,0x4c,0x01,0xb8,0x00,0x1d,0xff,0x7d,0x01,0xb8,0x00,0x1e,0xff,0xe9,0x01,0xb8,0x00,0x8d,0x00,0x52,0x01,0xb8,0x00,0xa9,0xff,0x6d,0x01,0xb8,0x00,0xaa,0xff,0x98,0x01,0xb8, -0x00,0xab,0xff,0xcd,0x01,0xb8,0x00,0xac,0xff,0x4c,0x01,0xb8,0x00,0xb5,0x00,0x29,0x01,0xb8,0x00,0xb7,0x00,0x29,0x01,0xb8,0x00,0xbe,0xff,0x98,0x01,0xb8,0x00,0xbf,0xff,0xcd,0x01,0xb8,0x00,0xc4,0xff,0x14,0x01,0xb8,0x00,0xc5,0xff,0x14,0x01,0xb8,0x01,0x2d,0xff,0xa4,0x01,0xb8,0x01,0x2e,0xff,0xa4,0x01,0xb8,0x01,0x2f,0xff,0x2b, -0x01,0xb8,0x01,0x30,0xff,0xb0,0x01,0xb8,0x01,0x31,0xff,0x2b,0x01,0xb8,0x01,0x32,0xff,0x2b,0x01,0xb8,0x01,0x33,0xff,0x8f,0x01,0xb8,0x01,0x34,0xff,0x2b,0x01,0xb8,0x01,0xa8,0x00,0x7b,0x01,0xb8,0x01,0xa9,0xff,0x66,0x01,0xb8,0x01,0xb0,0xff,0x66,0x01,0xb8,0x01,0xb4,0xff,0xa4,0x01,0xb8,0x01,0xb8,0x00,0x29,0x01,0xb8,0x01,0xb9, -0x00,0x1d,0x01,0xb8,0x01,0xba,0xff,0xf8,0x01,0xb8,0x01,0xbe,0x00,0x1d,0x01,0xb8,0x01,0xbf,0xff,0x2b,0x01,0xb8,0x01,0xc0,0xff,0x2b,0x01,0xb8,0x01,0xc1,0xff,0x4e,0x01,0xb8,0x01,0xc2,0xff,0x8f,0x01,0xb8,0x01,0xc3,0xff,0x4e,0x01,0xb8,0x01,0xc5,0xff,0xc1,0x01,0xb8,0x01,0xc6,0xff,0xc1,0x01,0xb8,0x01,0xc7,0xff,0x4e,0x01,0xb8, -0x01,0xc9,0xff,0x4e,0x01,0xb8,0x01,0xca,0xff,0x4e,0x01,0xb8,0x01,0xcc,0xff,0x4e,0x01,0xb8,0x01,0xce,0xff,0xb0,0x01,0xb8,0x01,0xcf,0xff,0x2b,0x01,0xb8,0x01,0xd0,0xff,0x4e,0x01,0xb8,0x01,0xd1,0xff,0x2b,0x01,0xb8,0x01,0xd2,0xff,0x4e,0x01,0xb8,0x01,0xd3,0xff,0x7f,0x01,0xb8,0x01,0xd4,0xff,0x4e,0x01,0xb8,0x01,0xd5,0xff,0x2b, -0x01,0xb8,0x01,0xd6,0x00,0x52,0x01,0xb8,0x01,0xd7,0xff,0x4e,0x01,0xb8,0x01,0xd8,0xff,0x2b,0x01,0xb8,0x01,0xd9,0xff,0x4e,0x01,0xb8,0x01,0xda,0xff,0x2b,0x01,0xb8,0x02,0x37,0xff,0x8f,0x01,0xb9,0x00,0x0f,0xff,0x50,0x01,0xb9,0x00,0x11,0xff,0x3d,0x01,0xb9,0x00,0x1e,0xff,0x4c,0x01,0xb9,0x00,0xa2,0xff,0x19,0x01,0xb9,0x00,0xa9, -0xff,0x71,0x01,0xb9,0x00,0xaa,0xff,0xcd,0x01,0xb9,0x00,0xac,0xff,0x3d,0x01,0xb9,0x00,0xbe,0xff,0x98,0x01,0xb9,0x00,0xc4,0xff,0x06,0x01,0xb9,0x00,0xc5,0xff,0x06,0x01,0xb9,0x01,0x2d,0xff,0xd3,0x01,0xb9,0x01,0x2e,0xff,0xd3,0x01,0xb9,0x01,0x2f,0xff,0x4c,0x01,0xb9,0x01,0x30,0xff,0xc3,0x01,0xb9,0x01,0x31,0xff,0x9c,0x01,0xb9, -0x01,0x32,0xff,0x4c,0x01,0xb9,0x01,0x33,0xff,0xcf,0x01,0xb9,0x01,0x34,0xff,0x4c,0x01,0xb9,0x01,0xa8,0x00,0x5c,0x01,0xb9,0x01,0xa9,0xff,0x60,0x01,0xb9,0x01,0xb0,0xff,0x60,0x01,0xb9,0x01,0xb4,0xff,0xd3,0x01,0xb9,0x01,0xb8,0x00,0x29,0x01,0xb9,0x01,0xbf,0xff,0x4c,0x01,0xb9,0x01,0xc0,0xff,0x9c,0x01,0xb9,0x01,0xc2,0xff,0x9a, -0x01,0xb9,0x01,0xc3,0xff,0x9a,0x01,0xb9,0x01,0xc6,0xff,0xc1,0x01,0xb9,0x01,0xc7,0xff,0x71,0x01,0xb9,0x01,0xc9,0xff,0x9a,0x01,0xb9,0x01,0xca,0xff,0x71,0x01,0xb9,0x01,0xcc,0xff,0x71,0x01,0xb9,0x01,0xce,0xff,0xb0,0x01,0xb9,0x01,0xcf,0xff,0x4c,0x01,0xb9,0x01,0xd0,0xff,0x71,0x01,0xb9,0x01,0xd1,0xff,0x4c,0x01,0xb9,0x01,0xd2, -0xff,0x9a,0x01,0xb9,0x01,0xd3,0xff,0xdb,0x01,0xb9,0x01,0xd4,0xff,0x9a,0x01,0xb9,0x01,0xd5,0xff,0x4c,0x01,0xb9,0x01,0xd6,0x00,0x29,0x01,0xb9,0x01,0xd7,0xff,0x9a,0x01,0xb9,0x01,0xd8,0xff,0x4c,0x01,0xb9,0x01,0xd9,0xff,0x9a,0x01,0xb9,0x01,0xda,0xff,0x4c,0x01,0xb9,0x02,0x37,0xff,0xcf,0x01,0xba,0x00,0x0f,0x00,0x46,0x01,0xba, -0x00,0x10,0xff,0xe7,0x01,0xba,0x00,0x11,0x00,0x39,0x01,0xba,0x00,0x1e,0x00,0x52,0x01,0xba,0x00,0xa9,0x00,0x3d,0x01,0xba,0x00,0xac,0x00,0x39,0x01,0xba,0x00,0xc4,0x00,0x46,0x01,0xba,0x00,0xc5,0x00,0x52,0x01,0xba,0x01,0x2d,0xff,0xe7,0x01,0xba,0x01,0x2e,0xff,0xe7,0x01,0xba,0x01,0x33,0xff,0xc3,0x01,0xba,0x01,0xa8,0x00,0x52, -0x01,0xba,0x01,0xb4,0xff,0xe7,0x01,0xba,0x01,0xb7,0x00,0x12,0x01,0xba,0x01,0xb8,0x00,0x23,0x01,0xba,0x01,0xc2,0xff,0xe7,0x01,0xba,0x01,0xc3,0xff,0xe7,0x01,0xba,0x01,0xc9,0xff,0xe7,0x01,0xba,0x01,0xd2,0xff,0xe7,0x01,0xba,0x01,0xd4,0xff,0xe7,0x01,0xba,0x01,0xd6,0x00,0x0a,0x01,0xba,0x01,0xd7,0xff,0xe7,0x01,0xba,0x01,0xd9, -0xff,0xe7,0x01,0xbb,0x00,0xa9,0xff,0x71,0x01,0xbb,0x01,0x2f,0xff,0xe7,0x01,0xbb,0x01,0x30,0xff,0xe7,0x01,0xbb,0x01,0x32,0xff,0xe7,0x01,0xbb,0x01,0x34,0xff,0xe7,0x01,0xbb,0x01,0xa9,0xff,0x6d,0x01,0xbb,0x01,0xb0,0xff,0x6d,0x01,0xbb,0x01,0xbf,0xff,0xe7,0x01,0xbb,0x01,0xcf,0xff,0xe7,0x01,0xbb,0x01,0xd1,0xff,0xe7,0x01,0xbb, -0x01,0xd5,0xff,0xe7,0x01,0xbb,0x01,0xd8,0xff,0xe7,0x01,0xbb,0x01,0xda,0xff,0xe7,0x01,0xbc,0x00,0xa9,0x00,0x12,0x01,0xbe,0x00,0x04,0xff,0xd7,0x01,0xbe,0x00,0x11,0xff,0x71,0x01,0xbe,0x00,0x1e,0xff,0x4c,0x01,0xbe,0x00,0xa2,0xff,0xd7,0x01,0xbe,0x00,0xa9,0xff,0x71,0x01,0xbe,0x00,0xac,0xff,0x71,0x01,0xbe,0x01,0x2d,0xff,0xd3, -0x01,0xbe,0x01,0x2e,0xff,0xd3,0x01,0xbe,0x01,0x2f,0xff,0x4c,0x01,0xbe,0x01,0x30,0xff,0xc3,0x01,0xbe,0x01,0x31,0xff,0x9c,0x01,0xbe,0x01,0x32,0xff,0x4c,0x01,0xbe,0x01,0x33,0xff,0xcf,0x01,0xbe,0x01,0x34,0xff,0x4c,0x01,0xbe,0x01,0xa9,0xff,0x60,0x01,0xbe,0x01,0xb0,0xff,0x60,0x01,0xbe,0x01,0xb4,0xff,0xd3,0x01,0xbe,0x01,0xb8, -0x00,0x29,0x01,0xbe,0x01,0xbf,0xff,0x4c,0x01,0xbe,0x01,0xc0,0xff,0x9c,0x01,0xbe,0x01,0xc3,0xff,0x9a,0x01,0xbe,0x01,0xc6,0xff,0xc1,0x01,0xbe,0x01,0xc7,0xff,0x71,0x01,0xbe,0x01,0xc9,0xff,0xd7,0x01,0xbe,0x01,0xca,0xff,0x71,0x01,0xbe,0x01,0xcc,0xff,0x71,0x01,0xbe,0x01,0xce,0xff,0xb0,0x01,0xbe,0x01,0xcf,0xff,0x4c,0x01,0xbe, -0x01,0xd0,0xff,0x71,0x01,0xbe,0x01,0xd1,0xff,0x4c,0x01,0xbe,0x01,0xd2,0xff,0x9a,0x01,0xbe,0x01,0xd3,0xff,0xdb,0x01,0xbe,0x01,0xd4,0xff,0x9a,0x01,0xbe,0x01,0xd5,0xff,0x4c,0x01,0xbe,0x01,0xd7,0xff,0x9a,0x01,0xbe,0x01,0xd8,0xff,0x4c,0x01,0xbe,0x01,0xd9,0xff,0x9a,0x01,0xbe,0x01,0xda,0xff,0x4c,0x01,0xbe,0x02,0x37,0xff,0xcf, -0x01,0xbf,0x00,0x1e,0xff,0xee,0x01,0xbf,0x01,0x2f,0xff,0xee,0x01,0xbf,0x01,0x30,0xff,0xee,0x01,0xbf,0x01,0x32,0xff,0xee,0x01,0xbf,0x01,0x34,0xff,0xee,0x01,0xbf,0x01,0xcf,0xff,0xee,0x01,0xbf,0x01,0xd1,0xff,0xee,0x01,0xbf,0x01,0xd5,0xff,0xee,0x01,0xc1,0x00,0x05,0xff,0x98,0x01,0xc1,0x00,0x0a,0xff,0x98,0x01,0xc2,0x01,0xcb, -0x00,0x6a,0x01,0xc3,0x00,0x05,0xff,0x6f,0x01,0xc3,0x00,0x0a,0xff,0x6f,0x01,0xc3,0x01,0xc5,0xff,0xdb,0x01,0xc3,0x01,0xcb,0xff,0xe7,0x01,0xc3,0x01,0xd3,0xff,0xe7,0x01,0xc4,0x01,0x33,0xff,0xd1,0x01,0xc4,0x01,0xd3,0xff,0xc1,0x01,0xc5,0x01,0x30,0xff,0xe5,0x01,0xc5,0x01,0x33,0x00,0x19,0x01,0xc5,0x01,0xc8,0x00,0x19,0x01,0xc5, -0x01,0xd0,0xff,0xe7,0x01,0xc5,0x02,0x37,0x00,0x19,0x01,0xc6,0x01,0x2f,0xff,0xb6,0x01,0xc6,0x01,0x30,0xff,0xb6,0x01,0xc6,0x01,0x32,0xff,0xb6,0x01,0xc6,0x01,0x33,0xff,0x81,0x01,0xc6,0x01,0x34,0xff,0xb6,0x01,0xc6,0x01,0xa8,0x00,0x3d,0x01,0xc6,0x01,0xbf,0xff,0xb6,0x01,0xc6,0x01,0xc3,0xff,0xe7,0x01,0xc6,0x01,0xc5,0xff,0xc3, -0x01,0xc6,0x01,0xcd,0xff,0x8f,0x01,0xc6,0x01,0xcf,0xff,0xb6,0x01,0xc6,0x01,0xd1,0xff,0xb6,0x01,0xc6,0x01,0xd2,0xff,0xe7,0x01,0xc6,0x01,0xd4,0xff,0xc3,0x01,0xc6,0x01,0xd5,0xff,0xb6,0x01,0xc6,0x01,0xd7,0xff,0xe7,0x01,0xc6,0x01,0xd8,0xff,0xb6,0x01,0xc6,0x01,0xd9,0xff,0xe7,0x01,0xc7,0x00,0x05,0xff,0x98,0x01,0xc7,0x00,0x0a, -0xff,0x98,0x01,0xc9,0x01,0xcb,0x00,0x6a,0x01,0xca,0x00,0x0f,0x00,0x29,0x01,0xca,0x00,0x10,0xff,0xb8,0x01,0xca,0x00,0x11,0x00,0x29,0x01,0xca,0x00,0x1d,0x00,0x52,0x01,0xca,0x00,0x1e,0x00,0x52,0x01,0xca,0x00,0xac,0x00,0x29,0x01,0xca,0x01,0x2f,0xff,0xd7,0x01,0xca,0x01,0x30,0xff,0xd7,0x01,0xca,0x01,0x32,0xff,0xd7,0x01,0xca, -0x01,0x34,0xff,0xd7,0x01,0xca,0x01,0xbf,0xff,0xd7,0x01,0xca,0x01,0xcb,0x00,0x31,0x01,0xca,0x01,0xcf,0xff,0xd7,0x01,0xca,0x01,0xd1,0xff,0xd7,0x01,0xca,0x01,0xd5,0xff,0xd7,0x01,0xca,0x01,0xd8,0xff,0xd7,0x01,0xca,0x01,0xda,0xff,0xd7,0x01,0xcb,0x01,0x33,0xff,0xb0,0x01,0xcb,0x01,0xc3,0xff,0xdb,0x01,0xcb,0x01,0xcb,0x00,0x31, -0x01,0xcb,0x01,0xcd,0xff,0xd1,0x01,0xcb,0x01,0xd2,0xff,0xdb,0x01,0xcb,0x01,0xd3,0xff,0xcf,0x01,0xcb,0x01,0xd4,0xff,0xdb,0x01,0xcb,0x01,0xd7,0xff,0xdb,0x01,0xcb,0x01,0xd9,0xff,0xdb,0x01,0xcd,0x01,0x2f,0xff,0xd7,0x01,0xcd,0x01,0x30,0xff,0xd7,0x01,0xcd,0x01,0x32,0xff,0xd7,0x01,0xcd,0x01,0x34,0xff,0xd7,0x01,0xcd,0x01,0xbf, -0xff,0xd7,0x01,0xcd,0x01,0xcb,0xff,0xb6,0x01,0xcd,0x01,0xce,0xff,0xe7,0x01,0xcd,0x01,0xcf,0xff,0xd7,0x01,0xcd,0x01,0xd0,0xff,0xdb,0x01,0xcd,0x01,0xd1,0xff,0xec,0x01,0xcd,0x01,0xd5,0xff,0xd7,0x01,0xcd,0x01,0xd8,0xff,0xd7,0x01,0xcd,0x01,0xda,0xff,0xd7,0x01,0xce,0x01,0x2f,0xff,0xd7,0x01,0xce,0x01,0x30,0xff,0xd7,0x01,0xce, -0x01,0x32,0xff,0xd7,0x01,0xce,0x01,0x34,0xff,0xd7,0x01,0xce,0x01,0xbf,0xff,0xd7,0x01,0xce,0x01,0xcf,0xff,0xd7,0x01,0xce,0x01,0xd5,0xff,0xd7,0x01,0xce,0x01,0xda,0xff,0xd7,0x01,0xcf,0x00,0x05,0xff,0x6f,0x01,0xcf,0x00,0x0a,0xff,0x6f,0x01,0xcf,0x00,0xb4,0xff,0xb0,0x01,0xcf,0x00,0xb5,0xff,0x7b,0x01,0xcf,0x00,0xb6,0xff,0xbc, -0x01,0xcf,0x00,0xb7,0xff,0x7b,0x01,0xcf,0x01,0x33,0xff,0xdb,0x01,0xcf,0x01,0xc5,0xff,0xdb,0x01,0xcf,0x01,0xd3,0xff,0xc3,0x01,0xcf,0x02,0x37,0xff,0xdb,0x01,0xd0,0x00,0x05,0xff,0x6f,0x01,0xd0,0x00,0x0a,0xff,0x6f,0x01,0xd0,0x00,0xb4,0xff,0xb0,0x01,0xd0,0x00,0xb5,0xff,0x7b,0x01,0xd0,0x00,0xb6,0xff,0xbc,0x01,0xd0,0x00,0xb7, -0xff,0x7b,0x01,0xd0,0x01,0x33,0xff,0xdb,0x01,0xd0,0x01,0xc5,0xff,0xe7,0x01,0xd0,0x01,0xd3,0xff,0xc3,0x01,0xd0,0x02,0x37,0xff,0xdb,0x01,0xd1,0x01,0x2f,0xff,0xc3,0x01,0xd1,0x01,0x30,0xff,0xc3,0x01,0xd1,0x01,0x32,0xff,0xc3,0x01,0xd1,0x01,0x34,0xff,0xc3,0x01,0xd1,0x01,0xbf,0xff,0xc3,0x01,0xd1,0x01,0xcb,0x00,0x25,0x01,0xd1, -0x01,0xcf,0xff,0xc3,0x01,0xd1,0x01,0xd8,0xff,0xc3,0x01,0xd1,0x01,0xda,0xff,0xc3,0x01,0xd2,0x00,0x05,0xff,0x6f,0x01,0xd2,0x00,0x0a,0xff,0x6f,0x01,0xd2,0x00,0xb4,0xff,0xb0,0x01,0xd2,0x00,0xb5,0xff,0x7b,0x01,0xd2,0x00,0xb6,0xff,0xbc,0x01,0xd2,0x00,0xb7,0xff,0x7b,0x01,0xd2,0x01,0x33,0xff,0xdb,0x01,0xd2,0x01,0xc5,0xff,0xdb, -0x01,0xd2,0x01,0xcb,0xff,0xe7,0x01,0xd2,0x01,0xd3,0xff,0xe7,0x01,0xd2,0x02,0x37,0xff,0xdb,0x01,0xd3,0x00,0x10,0xff,0xe7,0x01,0xd3,0x01,0x2f,0xff,0xc3,0x01,0xd3,0x01,0x30,0xff,0x9c,0x01,0xd3,0x01,0x31,0xff,0xd7,0x01,0xd3,0x01,0x32,0xff,0xc3,0x01,0xd3,0x01,0x34,0xff,0xc3,0x01,0xd3,0x01,0xbf,0xff,0xc3,0x01,0xd3,0x01,0xc0, -0xff,0xd7,0x01,0xd3,0x01,0xc3,0xff,0xe7,0x01,0xd3,0x01,0xcb,0xff,0xe7,0x01,0xd3,0x01,0xcf,0xff,0xc3,0x01,0xd3,0x01,0xd1,0xff,0xbe,0x01,0xd3,0x01,0xd2,0xff,0xe7,0x01,0xd3,0x01,0xd3,0x00,0x19,0x01,0xd3,0x01,0xd5,0xff,0xc3,0x01,0xd3,0x01,0xd7,0xff,0xe7,0x01,0xd3,0x01,0xd8,0xff,0xc3,0x01,0xd3,0x01,0xd9,0xff,0xe7,0x01,0xd3, -0x01,0xda,0xff,0xc3,0x01,0xd4,0x01,0xcb,0xff,0xe7,0x01,0xd5,0x00,0x05,0xff,0x6f,0x01,0xd5,0x00,0x0a,0xff,0x6f,0x01,0xd5,0x00,0xb4,0xff,0xb0,0x01,0xd5,0x00,0xb5,0xff,0x7b,0x01,0xd5,0x00,0xb6,0xff,0xbc,0x01,0xd5,0x00,0xb7,0xff,0x7b,0x01,0xd5,0x01,0x33,0xff,0xdb,0x01,0xd5,0x01,0xc5,0xff,0xdb,0x01,0xd5,0x01,0xd3,0xff,0xe7, -0x01,0xd5,0x02,0x37,0xff,0xdb,0x01,0xd6,0x01,0xcb,0x00,0x6a,0x01,0xd7,0x00,0x05,0xff,0x6f,0x01,0xd7,0x00,0x0a,0xff,0x6f,0x01,0xd7,0x00,0xb4,0xff,0xb0,0x01,0xd7,0x00,0xb5,0xff,0x7b,0x01,0xd7,0x00,0xb6,0xff,0xbc,0x01,0xd7,0x00,0xb7,0xff,0x7b,0x01,0xd7,0x01,0xc5,0xff,0xdb,0x01,0xd7,0x01,0xcb,0xff,0xe7,0x01,0xd7,0x01,0xd3, -0xff,0xe7,0x01,0xd8,0x00,0x05,0xff,0x6f,0x01,0xd8,0x00,0x0a,0xff,0x6f,0x01,0xd8,0x00,0xb4,0xff,0xb0,0x01,0xd8,0x00,0xb5,0xff,0x7b,0x01,0xd8,0x00,0xb6,0xff,0xbc,0x01,0xd8,0x00,0xb7,0xff,0x7b,0x01,0xd8,0x01,0xc5,0xff,0xdb,0x01,0xd8,0x01,0xd3,0xff,0xc3,0x01,0xd9,0x00,0x05,0xff,0x6f,0x01,0xd9,0x00,0x0a,0xff,0x6f,0x01,0xd9, -0x00,0xb4,0xff,0xb0,0x01,0xd9,0x00,0xb5,0xff,0x7b,0x01,0xd9,0x00,0xb6,0xff,0xbc,0x01,0xd9,0x00,0xb7,0xff,0x7b,0x01,0xd9,0x01,0xc5,0xff,0xdb,0x01,0xd9,0x01,0xcb,0xff,0xe7,0x01,0xd9,0x01,0xd3,0xff,0xe7,0x01,0xda,0x00,0x05,0xff,0x6f,0x01,0xda,0x00,0x0a,0xff,0x6f,0x01,0xda,0x00,0xb4,0xff,0xb0,0x01,0xda,0x00,0xb5,0xff,0x7b, -0x01,0xda,0x00,0xb6,0xff,0xbc,0x01,0xda,0x00,0xb7,0xff,0x7b,0x01,0xda,0x01,0xc5,0xff,0xdb,0x01,0xda,0x01,0xd3,0xff,0xe7,0x01,0xdb,0x01,0xe1,0x00,0x46,0x01,0xdb,0x01,0xe7,0x00,0x0c,0x01,0xdb,0x01,0xeb,0x00,0x46,0x01,0xdb,0x01,0xed,0x00,0x14,0x01,0xdb,0x01,0xf2,0x00,0x46,0x01,0xdb,0x01,0xfc,0x00,0x0a,0x01,0xdc,0x01,0xdc, -0xff,0x79,0x01,0xdc,0x01,0xde,0xff,0xcf,0x01,0xdc,0x01,0xe1,0x00,0x29,0x01,0xdc,0x01,0xe3,0xff,0x79,0x01,0xdc,0x01,0xe5,0xff,0xee,0x01,0xdc,0x01,0xeb,0x00,0x29,0x01,0xdc,0x01,0xf2,0x00,0x29,0x01,0xdc,0x01,0xf5,0xff,0xcf,0x01,0xdc,0x01,0xf8,0xff,0xcf,0x01,0xdc,0x01,0xf9,0xff,0x79,0x01,0xdc,0x01,0xfa,0xff,0xee,0x01,0xdc, -0x01,0xfb,0xff,0xc3,0x01,0xdc,0x01,0xfe,0xff,0x60,0x01,0xdc,0x02,0x01,0xff,0x79,0x01,0xdc,0x02,0x19,0xff,0xcf,0x01,0xdc,0x02,0x1a,0xff,0xe7,0x01,0xdc,0x02,0x31,0xff,0xe7,0x01,0xdd,0x00,0x0f,0xff,0x83,0x01,0xdd,0x00,0x11,0xff,0x83,0x01,0xdd,0x00,0xaa,0xff,0x91,0x01,0xdd,0x00,0xab,0xff,0xd7,0x01,0xdd,0x00,0xac,0xff,0x83, -0x01,0xdd,0x01,0xdc,0x00,0x29,0x01,0xdd,0x01,0xde,0xff,0xa2,0x01,0xdd,0x01,0xe1,0xff,0xa2,0x01,0xdd,0x01,0xe3,0x00,0x29,0x01,0xdd,0x01,0xe5,0x00,0x1d,0x01,0xdd,0x01,0xe7,0xff,0x71,0x01,0xdd,0x01,0xeb,0xff,0xa2,0x01,0xdd,0x01,0xf2,0xff,0xa2,0x01,0xdd,0x01,0xf5,0xff,0xcf,0x01,0xdd,0x01,0xf8,0xff,0xcf,0x01,0xdd,0x01,0xf9, -0x00,0x29,0x01,0xdd,0x01,0xfa,0x00,0x1d,0x01,0xdd,0x01,0xfb,0xff,0xa2,0x01,0xdd,0x02,0x01,0x00,0x29,0x01,0xdd,0x02,0x06,0xff,0xe7,0x01,0xdd,0x02,0x07,0xff,0x27,0x01,0xdd,0x02,0x09,0xff,0x4e,0x01,0xdd,0x02,0x0a,0xff,0x4e,0x01,0xdd,0x02,0x0b,0xff,0x9e,0x01,0xdd,0x02,0x0c,0xff,0x2b,0x01,0xdd,0x02,0x0f,0xff,0x4e,0x01,0xdd, -0x02,0x10,0xff,0x4e,0x01,0xdd,0x02,0x11,0xff,0x4e,0x01,0xdd,0x02,0x12,0xff,0x9e,0x01,0xdd,0x02,0x13,0xff,0x4e,0x01,0xdd,0x02,0x14,0xff,0x4e,0x01,0xdd,0x02,0x15,0xff,0x2b,0x01,0xdd,0x02,0x16,0xff,0x4e,0x01,0xdd,0x02,0x17,0xff,0x4e,0x01,0xdd,0x02,0x18,0xff,0x2b,0x01,0xdd,0x02,0x19,0xff,0xc3,0x01,0xdd,0x02,0x1b,0xff,0x2b, -0x01,0xdd,0x02,0x1c,0xff,0x4c,0x01,0xdd,0x02,0x1d,0xff,0x4e,0x01,0xdd,0x02,0x1e,0xff,0x4e,0x01,0xdd,0x02,0x1f,0xff,0x4e,0x01,0xdd,0x02,0x20,0xff,0x4e,0x01,0xdd,0x02,0x21,0xff,0xc3,0x01,0xdd,0x02,0x22,0xff,0x4e,0x01,0xdd,0x02,0x23,0xff,0x4e,0x01,0xdd,0x02,0x24,0xff,0x60,0x01,0xdd,0x02,0x25,0xff,0x4e,0x01,0xdd,0x02,0x26, -0xff,0x54,0x01,0xdd,0x02,0x27,0xff,0x2b,0x01,0xdd,0x02,0x29,0xff,0x4e,0x01,0xdd,0x02,0x2a,0xff,0x2b,0x01,0xdd,0x02,0x2b,0xff,0x66,0x01,0xdd,0x02,0x2c,0x00,0x6f,0x01,0xdd,0x02,0x2d,0xff,0x9e,0x01,0xdd,0x02,0x2e,0xff,0x4e,0x01,0xdd,0x02,0x32,0xff,0x4e,0x01,0xdd,0x02,0x34,0xff,0x4e,0x01,0xde,0x00,0xaa,0xff,0xcd,0x01,0xde, -0x00,0xbe,0xff,0xcd,0x01,0xde,0x01,0xde,0xff,0xc9,0x01,0xde,0x01,0xf5,0xff,0xc9,0x01,0xde,0x01,0xf8,0xff,0xc9,0x01,0xde,0x01,0xfb,0xff,0xc9,0x01,0xde,0x02,0x19,0xff,0xdb,0x01,0xde,0x02,0x21,0xff,0xdb,0x01,0xde,0x02,0x2c,0x00,0x1f,0x01,0xdf,0x00,0xc4,0xff,0xb0,0x01,0xdf,0x00,0xc5,0xff,0xb0,0x01,0xdf,0x01,0xf5,0xff,0xe7, -0x01,0xdf,0x01,0xfb,0xff,0xdb,0x01,0xdf,0x01,0xfe,0xff,0xdb,0x01,0xdf,0x02,0x1a,0xff,0xcf,0x01,0xdf,0x02,0x31,0xff,0xcf,0x01,0xe1,0x01,0xdc,0xff,0x79,0x01,0xe1,0x01,0xde,0xff,0xe7,0x01,0xe1,0x01,0xe3,0xff,0x79,0x01,0xe1,0x01,0xf5,0xff,0xe7,0x01,0xe1,0x01,0xf8,0xff,0xe7,0x01,0xe1,0x01,0xf9,0xff,0x79,0x01,0xe1,0x01,0xfb, -0xff,0xe7,0x01,0xe1,0x01,0xfe,0xff,0x62,0x01,0xe1,0x02,0x01,0xff,0x79,0x01,0xe1,0x02,0x19,0xff,0xcf,0x01,0xe1,0x02,0x21,0xff,0xcf,0x01,0xe2,0x01,0xdc,0xff,0x79,0x01,0xe2,0x01,0xde,0xff,0xe7,0x01,0xe2,0x01,0xe3,0xff,0x79,0x01,0xe2,0x01,0xf5,0xff,0xe7,0x01,0xe2,0x01,0xf8,0xff,0xe7,0x01,0xe2,0x01,0xf9,0xff,0x79,0x01,0xe2, -0x01,0xfb,0xff,0xe7,0x01,0xe2,0x01,0xfe,0xff,0x62,0x01,0xe2,0x02,0x01,0xff,0x79,0x01,0xe2,0x02,0x19,0xff,0xcf,0x01,0xe2,0x02,0x21,0xff,0xcf,0x01,0xe3,0x01,0xdc,0xff,0x79,0x01,0xe3,0x01,0xe1,0x00,0x3d,0x01,0xe3,0x01,0xe3,0xff,0x58,0x01,0xe3,0x01,0xeb,0x00,0x3d,0x01,0xe3,0x01,0xf2,0x00,0x3d,0x01,0xe3,0x01,0xfb,0xff,0xe7, -0x01,0xe3,0x01,0xfe,0xff,0x4e,0x01,0xe3,0x02,0x01,0xff,0xae,0x01,0xe4,0x00,0x0f,0x00,0x29,0x01,0xe4,0x00,0x1e,0x00,0x29,0x01,0xe4,0x00,0xc4,0x00,0x46,0x01,0xe4,0x00,0xc5,0x00,0x46,0x01,0xe4,0x01,0xde,0xff,0xa4,0x01,0xe4,0x01,0xe1,0x00,0x5c,0x01,0xe4,0x01,0xeb,0x00,0x5c,0x01,0xe4,0x01,0xed,0x00,0x62,0x01,0xe4,0x01,0xf2, -0x00,0x5c,0x01,0xe4,0x01,0xf5,0xff,0xa4,0x01,0xe4,0x01,0xf8,0xff,0xa4,0x01,0xe4,0x01,0xfb,0xff,0xa4,0x01,0xe4,0x01,0xfc,0x00,0x25,0x01,0xe4,0x01,0xfe,0xff,0xc3,0x01,0xe4,0x02,0x08,0xff,0xe5,0x01,0xe4,0x02,0x0b,0x00,0x62,0x01,0xe4,0x02,0x0c,0xff,0xe5,0x01,0xe4,0x02,0x0d,0x00,0x3d,0x01,0xe4,0x02,0x12,0x00,0x62,0x01,0xe4, -0x02,0x15,0xff,0xe5,0x01,0xe4,0x02,0x18,0xff,0xe5,0x01,0xe4,0x02,0x1a,0xff,0xa2,0x01,0xe4,0x02,0x1b,0xff,0xe5,0x01,0xe4,0x02,0x1e,0xff,0xc3,0x01,0xe4,0x02,0x27,0xff,0xe5,0x01,0xe4,0x02,0x2a,0xff,0xe5,0x01,0xe4,0x02,0x2c,0x00,0x29,0x01,0xe4,0x02,0x2d,0x00,0x62,0x01,0xe4,0x02,0x31,0xff,0xa2,0x01,0xe5,0x00,0x0f,0xff,0x3b, -0x01,0xe5,0x00,0x11,0xff,0x2b,0x01,0xe5,0x00,0xac,0xff,0x2b,0x01,0xe5,0x01,0xdc,0x00,0x29,0x01,0xe5,0x01,0xe1,0xff,0x75,0x01,0xe5,0x01,0xe3,0x00,0x29,0x01,0xe5,0x01,0xe7,0xff,0x33,0x01,0xe5,0x01,0xeb,0xff,0x75,0x01,0xe5,0x01,0xed,0x00,0x25,0x01,0xe5,0x01,0xf2,0xff,0x75,0x01,0xe5,0x01,0xf9,0x00,0x29,0x01,0xe5,0x02,0x01, -0x00,0x29,0x01,0xe5,0x02,0x07,0xff,0x79,0x01,0xe5,0x02,0x09,0xff,0xb6,0x01,0xe5,0x02,0x0a,0xff,0xb6,0x01,0xe5,0x02,0x0b,0xfe,0xfe,0x01,0xe5,0x02,0x0c,0xff,0x91,0x01,0xe5,0x02,0x0f,0xff,0xb6,0x01,0xe5,0x02,0x10,0xff,0xb6,0x01,0xe5,0x02,0x11,0xff,0xb6,0x01,0xe5,0x02,0x12,0xfe,0xfe,0x01,0xe5,0x02,0x13,0xff,0xb6,0x01,0xe5, -0x02,0x14,0xff,0xb6,0x01,0xe5,0x02,0x15,0xff,0x91,0x01,0xe5,0x02,0x16,0xff,0xb6,0x01,0xe5,0x02,0x17,0xff,0xb6,0x01,0xe5,0x02,0x18,0xff,0x91,0x01,0xe5,0x02,0x1b,0xff,0x91,0x01,0xe5,0x02,0x1c,0xff,0xb6,0x01,0xe5,0x02,0x1d,0xff,0xb6,0x01,0xe5,0x02,0x1f,0xff,0xb6,0x01,0xe5,0x02,0x20,0xff,0xb6,0x01,0xe5,0x02,0x22,0xff,0xb6, -0x01,0xe5,0x02,0x23,0xff,0xb6,0x01,0xe5,0x02,0x25,0xff,0xb6,0x01,0xe5,0x02,0x26,0xff,0xaa,0x01,0xe5,0x02,0x27,0xff,0x91,0x01,0xe5,0x02,0x29,0xff,0xb6,0x01,0xe5,0x02,0x2a,0xff,0x91,0x01,0xe5,0x02,0x2b,0xff,0xc3,0x01,0xe5,0x02,0x2c,0x00,0x6d,0x01,0xe5,0x02,0x2d,0xfe,0xfe,0x01,0xe5,0x02,0x2e,0xff,0xb6,0x01,0xe5,0x02,0x30, -0xff,0xb6,0x01,0xe5,0x02,0x32,0xff,0xb6,0x01,0xe5,0x02,0x34,0xff,0xb6,0x01,0xe7,0x00,0x0d,0xff,0x7f,0x01,0xe7,0x00,0x0f,0x00,0x46,0x01,0xe7,0x00,0x1e,0x00,0x46,0x01,0xe7,0x00,0x8d,0xff,0x98,0x01,0xe7,0x00,0xb4,0xff,0x66,0x01,0xe7,0x00,0xb5,0xff,0x3d,0x01,0xe7,0x00,0xb6,0xff,0x66,0x01,0xe7,0x00,0xb7,0xff,0x3d,0x01,0xe7, -0x01,0xdc,0xff,0x6d,0x01,0xe7,0x01,0xde,0xff,0xe5,0x01,0xe7,0x01,0xe1,0x00,0x60,0x01,0xe7,0x01,0xe3,0xff,0x6d,0x01,0xe7,0x01,0xeb,0x00,0x60,0x01,0xe7,0x01,0xed,0x00,0x3d,0x01,0xe7,0x01,0xf2,0x00,0x60,0x01,0xe7,0x01,0xf5,0xff,0xe5,0x01,0xe7,0x01,0xf8,0xff,0xe5,0x01,0xe7,0x01,0xf9,0xff,0x6d,0x01,0xe7,0x01,0xfb,0xff,0xc3, -0x01,0xe7,0x01,0xfe,0xff,0x3d,0x01,0xe7,0x02,0x01,0xff,0x6d,0x01,0xe7,0x02,0x0b,0x00,0x56,0x01,0xe7,0x02,0x0d,0x00,0x29,0x01,0xe7,0x02,0x12,0x00,0x56,0x01,0xe7,0x02,0x1a,0xff,0xd9,0x01,0xe7,0x02,0x2d,0x00,0x56,0x01,0xe7,0x02,0x31,0xff,0xd9,0x01,0xe8,0x01,0xde,0xff,0xe7,0x01,0xe8,0x01,0xf5,0xff,0xe7,0x01,0xe8,0x01,0xf8, -0xff,0xe7,0x01,0xe8,0x01,0xfb,0xff,0xe7,0x01,0xe8,0x01,0xfe,0xff,0x62,0x01,0xe8,0x02,0x19,0xff,0xcf,0x01,0xe8,0x02,0x21,0xff,0xcf,0x01,0xe9,0x00,0xc4,0xff,0xb0,0x01,0xe9,0x00,0xc5,0xff,0xb0,0x01,0xe9,0x01,0xdc,0xff,0xa2,0x01,0xe9,0x01,0xe3,0xff,0xa2,0x01,0xe9,0x01,0xf9,0xff,0xa2,0x01,0xe9,0x01,0xfe,0xff,0xd5,0x01,0xe9, -0x02,0x01,0xff,0xa2,0x01,0xea,0x00,0x0f,0xff,0x83,0x01,0xea,0x00,0x11,0xff,0x83,0x01,0xea,0x00,0xaa,0xff,0x91,0x01,0xea,0x00,0xab,0xff,0xd7,0x01,0xea,0x00,0xac,0xff,0x83,0x01,0xea,0x01,0xdc,0x00,0x29,0x01,0xea,0x01,0xde,0xff,0xa2,0x01,0xea,0x01,0xe1,0xff,0x9e,0x01,0xea,0x01,0xe3,0x00,0x29,0x01,0xea,0x01,0xe5,0x00,0x1d, -0x01,0xea,0x01,0xe7,0xff,0x71,0x01,0xea,0x01,0xeb,0xff,0xa2,0x01,0xea,0x01,0xf2,0xff,0xa2,0x01,0xea,0x01,0xf5,0xff,0xcf,0x01,0xea,0x01,0xf8,0xff,0xcf,0x01,0xea,0x01,0xf9,0x00,0x29,0x01,0xea,0x01,0xfa,0x00,0x1d,0x01,0xea,0x01,0xfb,0xff,0xa2,0x01,0xea,0x02,0x01,0x00,0x29,0x01,0xea,0x02,0x06,0xff,0xe7,0x01,0xea,0x02,0x07, -0xff,0x27,0x01,0xea,0x02,0x09,0xff,0x4e,0x01,0xea,0x02,0x0a,0xff,0x4e,0x01,0xea,0x02,0x0b,0xff,0x9e,0x01,0xea,0x02,0x0c,0xff,0x2b,0x01,0xea,0x02,0x0f,0xff,0x4e,0x01,0xea,0x02,0x10,0xff,0x4e,0x01,0xea,0x02,0x11,0xff,0x4e,0x01,0xea,0x02,0x12,0xff,0x9e,0x01,0xea,0x02,0x13,0xff,0x4e,0x01,0xea,0x02,0x14,0xff,0x4e,0x01,0xea, -0x02,0x15,0xff,0x2b,0x01,0xea,0x02,0x16,0xff,0x4e,0x01,0xea,0x02,0x17,0xff,0x4e,0x01,0xea,0x02,0x18,0xff,0x2b,0x01,0xea,0x02,0x19,0xff,0xc3,0x01,0xea,0x02,0x1b,0xff,0x2b,0x01,0xea,0x02,0x1c,0xff,0x4c,0x01,0xea,0x02,0x1d,0xff,0x4e,0x01,0xea,0x02,0x1e,0xff,0x4e,0x01,0xea,0x02,0x1f,0xff,0x4e,0x01,0xea,0x02,0x20,0xff,0x4e, -0x01,0xea,0x02,0x21,0xff,0xc3,0x01,0xea,0x02,0x22,0xff,0x4e,0x01,0xea,0x02,0x23,0xff,0x4e,0x01,0xea,0x02,0x24,0xff,0x60,0x01,0xea,0x02,0x25,0xff,0x4e,0x01,0xea,0x02,0x26,0xff,0x54,0x01,0xea,0x02,0x27,0xff,0x2b,0x01,0xea,0x02,0x29,0xff,0x4e,0x01,0xea,0x02,0x2a,0xff,0x2b,0x01,0xea,0x02,0x2b,0xff,0x66,0x01,0xea,0x02,0x2c, -0x00,0x6f,0x01,0xea,0x02,0x2d,0xff,0x9e,0x01,0xea,0x02,0x2e,0xff,0x4e,0x01,0xea,0x02,0x32,0xff,0x4e,0x01,0xea,0x02,0x34,0xff,0x4e,0x01,0xec,0x01,0xe1,0x00,0x46,0x01,0xec,0x01,0xe7,0x00,0x0c,0x01,0xec,0x01,0xeb,0x00,0x46,0x01,0xec,0x01,0xed,0x00,0x14,0x01,0xec,0x01,0xf2,0x00,0x46,0x01,0xec,0x01,0xfc,0x00,0x0a,0x01,0xec, -0x02,0x2c,0x00,0x14,0x01,0xed,0x00,0x0f,0x00,0x52,0x01,0xed,0x00,0x1e,0x00,0x52,0x01,0xed,0x00,0xc4,0x00,0x5a,0x01,0xed,0x00,0xc5,0x00,0x5a,0x01,0xed,0x01,0xde,0xff,0xcd,0x01,0xed,0x01,0xe1,0x00,0x85,0x01,0xed,0x01,0xe7,0x00,0x3d,0x01,0xed,0x01,0xeb,0x00,0x85,0x01,0xed,0x01,0xed,0x00,0x66,0x01,0xed,0x01,0xf5,0xff,0xcd, -0x01,0xed,0x01,0xf8,0xff,0xcd,0x01,0xed,0x01,0xfb,0xff,0xcd,0x01,0xed,0x01,0xfc,0x00,0x25,0x01,0xed,0x01,0xfe,0xff,0xdb,0x01,0xed,0x02,0x06,0x00,0x3d,0x01,0xed,0x02,0x0b,0x00,0x7b,0x01,0xed,0x02,0x0d,0x00,0x3d,0x01,0xed,0x02,0x12,0x00,0x7b,0x01,0xed,0x02,0x1a,0xff,0xd1,0x01,0xed,0x02,0x1c,0x00,0x48,0x01,0xed,0x02,0x1e, -0xff,0xe7,0x01,0xed,0x02,0x2c,0x00,0x52,0x01,0xed,0x02,0x2d,0x00,0x7b,0x01,0xed,0x02,0x31,0xff,0xd1,0x01,0xee,0x01,0xdc,0xff,0xe1,0x01,0xee,0x01,0xde,0xff,0xdb,0x01,0xee,0x01,0xe3,0xff,0xe1,0x01,0xee,0x01,0xf5,0xff,0xdb,0x01,0xee,0x01,0xf8,0xff,0xdb,0x01,0xee,0x01,0xf9,0xff,0xe1,0x01,0xee,0x01,0xfb,0xff,0xdb,0x01,0xee, -0x01,0xfe,0xff,0xdd,0x01,0xee,0x02,0x01,0xff,0xe1,0x01,0xf1,0x00,0x0f,0x00,0x29,0x01,0xf1,0x00,0x1e,0x00,0x29,0x01,0xf1,0x00,0xc4,0x00,0x46,0x01,0xf1,0x00,0xc5,0x00,0x46,0x01,0xf1,0x01,0xde,0xff,0xa4,0x01,0xf1,0x01,0xe1,0x00,0x5c,0x01,0xf1,0x01,0xeb,0x00,0x5c,0x01,0xf1,0x01,0xed,0x00,0x62,0x01,0xf1,0x01,0xf2,0x00,0x5c, -0x01,0xf1,0x01,0xf5,0xff,0xa4,0x01,0xf1,0x01,0xf8,0xff,0xa4,0x01,0xf1,0x01,0xfb,0xff,0xa4,0x01,0xf1,0x01,0xfc,0x00,0x25,0x01,0xf1,0x01,0xfe,0xff,0xc3,0x01,0xf1,0x02,0x06,0x00,0x3d,0x01,0xf1,0x02,0x08,0xff,0xe5,0x01,0xf1,0x02,0x0b,0x00,0x62,0x01,0xf1,0x02,0x0c,0xff,0xe5,0x01,0xf1,0x02,0x0d,0x00,0x3d,0x01,0xf1,0x02,0x12, -0x00,0x62,0x01,0xf1,0x02,0x15,0xff,0xe5,0x01,0xf1,0x02,0x18,0xff,0xe5,0x01,0xf1,0x02,0x1a,0xff,0xa2,0x01,0xf1,0x02,0x1b,0xff,0xe5,0x01,0xf1,0x02,0x1e,0xff,0xc3,0x01,0xf1,0x02,0x27,0xff,0xe5,0x01,0xf1,0x02,0x2a,0xff,0xe5,0x01,0xf1,0x02,0x2c,0x00,0x29,0x01,0xf1,0x02,0x2d,0x00,0x62,0x01,0xf1,0x02,0x31,0xff,0xa2,0x01,0xf5, -0x00,0x0f,0xff,0xa2,0x01,0xf5,0x00,0x11,0xff,0xa2,0x01,0xf5,0x00,0xac,0xff,0xa2,0x01,0xf5,0x00,0xc4,0xff,0x4a,0x01,0xf5,0x00,0xc5,0xff,0x96,0x01,0xf5,0x01,0xdc,0xff,0xa2,0x01,0xf5,0x01,0xdf,0xff,0xdb,0x01,0xf5,0x01,0xe1,0xff,0xf6,0x01,0xf5,0x01,0xe3,0xff,0xa2,0x01,0xf5,0x01,0xe5,0xff,0xe7,0x01,0xf5,0x01,0xe7,0xff,0xe5, -0x01,0xf5,0x01,0xeb,0xff,0xf6,0x01,0xf5,0x01,0xed,0xff,0xcd,0x01,0xf5,0x01,0xf2,0xff,0xf6,0x01,0xf5,0x01,0xf9,0xff,0xa2,0x01,0xf5,0x01,0xfa,0xff,0xe7,0x01,0xf5,0x01,0xfc,0xff,0xdb,0x01,0xf5,0x02,0x01,0xff,0xa2,0x01,0xf7,0x00,0x0f,0xfe,0xba,0x01,0xf7,0x00,0x11,0xfe,0xba,0x01,0xf7,0x00,0xac,0xfe,0xba,0x01,0xf7,0x00,0xc4, -0xfe,0xba,0x01,0xf7,0x00,0xc5,0xfe,0xae,0x01,0xf7,0x01,0xde,0xff,0xf6,0x01,0xf7,0x01,0xe1,0xff,0x7f,0x01,0xf7,0x01,0xe5,0xff,0xe7,0x01,0xf7,0x01,0xe7,0xff,0x60,0x01,0xf7,0x01,0xeb,0xff,0x7f,0x01,0xf7,0x01,0xed,0xff,0xcf,0x01,0xf7,0x01,0xee,0xff,0xe7,0x01,0xf7,0x01,0xf2,0xff,0x7f,0x01,0xf7,0x01,0xf5,0xff,0xf6,0x01,0xf7, -0x01,0xf8,0xff,0xf6,0x01,0xf7,0x01,0xfa,0xff,0xe7,0x01,0xf7,0x01,0xfb,0xff,0xf6,0x01,0xf7,0x01,0xfc,0xff,0xc1,0x01,0xf7,0x02,0x07,0xff,0xbc,0x01,0xf7,0x02,0x0b,0xff,0x6d,0x01,0xf7,0x02,0x0c,0xff,0xb2,0x01,0xf7,0x02,0x12,0xff,0x6d,0x01,0xf7,0x02,0x15,0xff,0xb2,0x01,0xf7,0x02,0x18,0xff,0xb2,0x01,0xf7,0x02,0x1b,0xff,0xb2, -0x01,0xf7,0x02,0x27,0xff,0xb2,0x01,0xf7,0x02,0x2a,0xff,0xb2,0x01,0xf7,0x02,0x2d,0xff,0x6d,0x01,0xf8,0x00,0xaa,0xff,0xcd,0x01,0xf8,0x00,0xbe,0xff,0xcd,0x01,0xf8,0x01,0xde,0xff,0xc9,0x01,0xf8,0x01,0xed,0x00,0x31,0x01,0xf8,0x01,0xf5,0xff,0xc9,0x01,0xf8,0x01,0xf8,0xff,0xc9,0x01,0xf8,0x01,0xfb,0xff,0xc9,0x01,0xf8,0x02,0x19, -0xff,0xdb,0x01,0xf8,0x02,0x21,0xff,0xdb,0x01,0xf8,0x02,0x2c,0x00,0x1f,0x01,0xf9,0x00,0x0f,0xff,0x7d,0x01,0xf9,0x00,0x11,0xff,0x4c,0x01,0xf9,0x00,0x1d,0xff,0xe9,0x01,0xf9,0x00,0x1e,0xff,0xe9,0x01,0xf9,0x00,0x8d,0x00,0x52,0x01,0xf9,0x00,0xaa,0xff,0x98,0x01,0xf9,0x00,0xab,0xff,0xcd,0x01,0xf9,0x00,0xac,0xff,0x4c,0x01,0xf9, -0x00,0xb5,0x00,0x29,0x01,0xf9,0x00,0xb7,0x00,0x29,0x01,0xf9,0x00,0xbe,0xff,0x98,0x01,0xf9,0x00,0xbf,0xff,0xcd,0x01,0xf9,0x00,0xc4,0xff,0x14,0x01,0xf9,0x00,0xc5,0xff,0x14,0x01,0xf9,0x01,0xdc,0x00,0x29,0x01,0xf9,0x01,0xde,0xff,0xa2,0x01,0xf9,0x01,0xe1,0xff,0x8d,0x01,0xf9,0x01,0xe3,0x00,0x29,0x01,0xf9,0x01,0xe7,0xff,0x66, -0x01,0xf9,0x01,0xeb,0xff,0x8d,0x01,0xf9,0x01,0xf2,0xff,0x8d,0x01,0xf9,0x01,0xf5,0xff,0xa2,0x01,0xf9,0x01,0xf8,0xff,0xa2,0x01,0xf9,0x01,0xf9,0x00,0x29,0x01,0xf9,0x01,0xfb,0xff,0xa2,0x01,0xf9,0x01,0xfc,0xff,0xf8,0x01,0xf9,0x02,0x01,0x00,0x29,0x01,0xf9,0x02,0x06,0xff,0xe7,0x01,0xf9,0x02,0x07,0xff,0x27,0x01,0xf9,0x02,0x09, -0xff,0x4e,0x01,0xf9,0x02,0x0a,0xff,0x4e,0x01,0xf9,0x02,0x0b,0xff,0x9e,0x01,0xf9,0x02,0x0c,0xff,0x2b,0x01,0xf9,0x02,0x0d,0xff,0xa6,0x01,0xf9,0x02,0x0f,0xff,0x4e,0x01,0xf9,0x02,0x10,0xff,0x4e,0x01,0xf9,0x02,0x11,0xff,0x4e,0x01,0xf9,0x02,0x12,0xff,0x9e,0x01,0xf9,0x02,0x13,0xff,0x4e,0x01,0xf9,0x02,0x14,0xff,0x4e,0x01,0xf9, -0x02,0x15,0xff,0x2b,0x01,0xf9,0x02,0x16,0xff,0x4e,0x01,0xf9,0x02,0x17,0xff,0x4e,0x01,0xf9,0x02,0x18,0xff,0x2b,0x01,0xf9,0x02,0x19,0xff,0xc3,0x01,0xf9,0x02,0x1a,0xff,0x8d,0x01,0xf9,0x02,0x1b,0xff,0x2b,0x01,0xf9,0x02,0x1c,0xff,0x4c,0x01,0xf9,0x02,0x1d,0xff,0x4e,0x01,0xf9,0x02,0x1e,0xff,0x4e,0x01,0xf9,0x02,0x1f,0xff,0x4e, -0x01,0xf9,0x02,0x20,0xff,0x4e,0x01,0xf9,0x02,0x21,0xff,0xc3,0x01,0xf9,0x02,0x22,0xff,0x4e,0x01,0xf9,0x02,0x23,0xff,0x4e,0x01,0xf9,0x02,0x24,0xff,0x60,0x01,0xf9,0x02,0x25,0xff,0x4e,0x01,0xf9,0x02,0x26,0xff,0x54,0x01,0xf9,0x02,0x27,0xff,0x2b,0x01,0xf9,0x02,0x29,0xff,0x4e,0x01,0xf9,0x02,0x2a,0xff,0x2b,0x01,0xf9,0x02,0x2b, -0xff,0x66,0x01,0xf9,0x02,0x2c,0x00,0x6f,0x01,0xf9,0x02,0x2d,0xff,0x9e,0x01,0xf9,0x02,0x2e,0xff,0x4e,0x01,0xf9,0x02,0x30,0xff,0x4e,0x01,0xf9,0x02,0x31,0xff,0x8d,0x01,0xf9,0x02,0x32,0xff,0x4e,0x01,0xf9,0x02,0x34,0xff,0x4e,0x01,0xfa,0x00,0x0f,0xff,0x3b,0x01,0xfa,0x00,0x11,0xff,0x2b,0x01,0xfa,0x00,0xac,0xff,0x2b,0x01,0xfa, -0x01,0xdc,0x00,0x29,0x01,0xfa,0x01,0xe1,0xff,0x75,0x01,0xfa,0x01,0xe3,0x00,0x29,0x01,0xfa,0x01,0xe7,0xff,0x33,0x01,0xfa,0x01,0xeb,0xff,0x75,0x01,0xfa,0x01,0xed,0x00,0x25,0x01,0xfa,0x01,0xf2,0xff,0x75,0x01,0xfa,0x01,0xf8,0xff,0xdb,0x01,0xfa,0x01,0xf9,0x00,0x29,0x01,0xfa,0x02,0x01,0x00,0x29,0x01,0xfa,0x02,0x07,0xff,0x79, -0x01,0xfa,0x02,0x09,0xff,0xb6,0x01,0xfa,0x02,0x0a,0xff,0xb6,0x01,0xfa,0x02,0x0b,0xfe,0xfe,0x01,0xfa,0x02,0x0c,0xff,0x91,0x01,0xfa,0x02,0x0f,0xff,0xb6,0x01,0xfa,0x02,0x10,0xff,0xb6,0x01,0xfa,0x02,0x11,0xff,0xb6,0x01,0xfa,0x02,0x12,0xfe,0xfe,0x01,0xfa,0x02,0x13,0xff,0xb6,0x01,0xfa,0x02,0x14,0xff,0xb6,0x01,0xfa,0x02,0x15, -0xff,0x91,0x01,0xfa,0x02,0x16,0xff,0xb6,0x01,0xfa,0x02,0x17,0xff,0xb6,0x01,0xfa,0x02,0x18,0xff,0x91,0x01,0xfa,0x02,0x1b,0xff,0x91,0x01,0xfa,0x02,0x1c,0xff,0xb6,0x01,0xfa,0x02,0x1d,0xff,0xb6,0x01,0xfa,0x02,0x1f,0xff,0xb6,0x01,0xfa,0x02,0x20,0xff,0xb6,0x01,0xfa,0x02,0x22,0xff,0xb6,0x01,0xfa,0x02,0x23,0xff,0xb6,0x01,0xfa, -0x02,0x25,0xff,0xb6,0x01,0xfa,0x02,0x26,0xff,0xaa,0x01,0xfa,0x02,0x27,0xff,0x91,0x01,0xfa,0x02,0x29,0xff,0xb6,0x01,0xfa,0x02,0x2a,0xff,0x91,0x01,0xfa,0x02,0x2b,0xff,0xc3,0x01,0xfa,0x02,0x2c,0x00,0x6d,0x01,0xfa,0x02,0x2d,0xfe,0xfe,0x01,0xfa,0x02,0x2e,0xff,0xb6,0x01,0xfa,0x02,0x30,0xff,0xb6,0x01,0xfa,0x02,0x32,0xff,0xb6, -0x01,0xfa,0x02,0x34,0xff,0xb6,0x01,0xfb,0x00,0x0f,0xff,0xa2,0x01,0xfb,0x00,0x11,0xff,0xa2,0x01,0xfb,0x00,0xac,0xff,0xa2,0x01,0xfb,0x00,0xc4,0xff,0x4a,0x01,0xfb,0x00,0xc5,0xff,0x96,0x01,0xfb,0x01,0xdc,0xff,0xa2,0x01,0xfb,0x01,0xdf,0xff,0xdb,0x01,0xfb,0x01,0xe1,0xff,0xf6,0x01,0xfb,0x01,0xe3,0xff,0xa2,0x01,0xfb,0x01,0xe5, -0xff,0xe7,0x01,0xfb,0x01,0xe7,0xff,0xc3,0x01,0xfb,0x01,0xeb,0xff,0xf6,0x01,0xfb,0x01,0xed,0xff,0xcd,0x01,0xfb,0x01,0xee,0xff,0xcf,0x01,0xfb,0x01,0xf2,0xff,0xf6,0x01,0xfb,0x01,0xf9,0xff,0xa2,0x01,0xfb,0x01,0xfa,0xff,0xe7,0x01,0xfb,0x01,0xfc,0xff,0xdb,0x01,0xfb,0x02,0x01,0xff,0xa2,0x01,0xfb,0x02,0x07,0xff,0xe7,0x01,0xfb, -0x02,0x0b,0xff,0x91,0x01,0xfb,0x02,0x2d,0xff,0x91,0x01,0xfc,0x00,0x0f,0x00,0x46,0x01,0xfc,0x00,0x11,0x00,0x39,0x01,0xfc,0x00,0x1e,0x00,0x52,0x01,0xfc,0x00,0xac,0x00,0x39,0x01,0xfc,0x00,0xc4,0x00,0x46,0x01,0xfc,0x00,0xc5,0x00,0x52,0x01,0xfc,0x01,0xdc,0x00,0x23,0x01,0xfc,0x01,0xde,0xff,0xdb,0x01,0xfc,0x01,0xe1,0x00,0x62, -0x01,0xfc,0x01,0xe3,0x00,0x23,0x01,0xfc,0x01,0xeb,0x00,0x62,0x01,0xfc,0x01,0xed,0x00,0x25,0x01,0xfc,0x01,0xf2,0x00,0x62,0x01,0xfc,0x01,0xf5,0xff,0xe7,0x01,0xfc,0x01,0xf8,0xff,0xdb,0x01,0xfc,0x01,0xf9,0x00,0x23,0x01,0xfc,0x01,0xfb,0xff,0xdb,0x01,0xfc,0x02,0x01,0x00,0x23,0x01,0xfc,0x02,0x2c,0x00,0x52,0x01,0xfd,0x00,0x0f, -0x00,0x29,0x01,0xfd,0x00,0xc4,0x00,0x29,0x01,0xfd,0x00,0xc5,0x00,0x29,0x01,0xfd,0x01,0xe1,0x00,0x3d,0x01,0xfd,0x01,0xeb,0x00,0x3d,0x01,0xfd,0x01,0xf2,0x00,0x3d,0x01,0xfd,0x01,0xfe,0xff,0xdb,0x01,0xfd,0x02,0x0b,0x00,0x25,0x01,0xfd,0x02,0x12,0x00,0x25,0x01,0xfd,0x02,0x2d,0x00,0x25,0x02,0x00,0x00,0x0f,0x00,0x29,0x02,0x00, -0x00,0x1e,0x00,0x29,0x02,0x00,0x00,0xc4,0x00,0x29,0x02,0x00,0x00,0xc5,0x00,0x29,0x02,0x00,0x01,0xe1,0x00,0x3d,0x02,0x00,0x01,0xeb,0x00,0x3d,0x02,0x00,0x01,0xf2,0x00,0x3d,0x02,0x00,0x01,0xfb,0xff,0xcf,0x02,0x00,0x01,0xfe,0xff,0xdb,0x02,0x00,0x02,0x0b,0x00,0x25,0x02,0x00,0x02,0x12,0x00,0x25,0x02,0x00,0x02,0x2d,0x00,0x25, -0x02,0x01,0x01,0xdc,0xff,0x79,0x02,0x01,0x01,0xde,0xff,0xe7,0x02,0x01,0x01,0xe3,0xff,0x79,0x02,0x01,0x01,0xf5,0xff,0xe7,0x02,0x01,0x01,0xf8,0xff,0xe7,0x02,0x01,0x01,0xf9,0xff,0x79,0x02,0x01,0x01,0xfb,0xff,0xe7,0x02,0x01,0x01,0xfe,0xff,0x62,0x02,0x01,0x02,0x01,0xff,0x79,0x02,0x01,0x02,0x19,0xff,0xcf,0x02,0x01,0x02,0x21, -0xff,0xcf,0x02,0x03,0x01,0xdc,0xff,0x79,0x02,0x03,0x01,0xde,0xff,0xe7,0x02,0x03,0x01,0xe3,0xff,0x79,0x02,0x03,0x01,0xf5,0xff,0xe7,0x02,0x03,0x01,0xf8,0xff,0xe7,0x02,0x03,0x01,0xf9,0xff,0x79,0x02,0x03,0x01,0xfb,0xff,0xe7,0x02,0x03,0x01,0xfe,0xff,0x62,0x02,0x03,0x02,0x01,0xff,0x79,0x02,0x03,0x02,0x19,0xff,0xcf,0x02,0x03, -0x02,0x21,0xff,0xcf,0x02,0x04,0x00,0x0f,0xff,0xa2,0x02,0x04,0x00,0x11,0xff,0xa2,0x02,0x04,0x00,0xac,0xff,0xa2,0x02,0x04,0x00,0xc4,0xff,0x4a,0x02,0x04,0x00,0xc5,0xff,0x96,0x02,0x04,0x01,0xdc,0xff,0xa2,0x02,0x04,0x01,0xdf,0xff,0xdb,0x02,0x04,0x01,0xe1,0xff,0xf6,0x02,0x04,0x01,0xe3,0xff,0xa2,0x02,0x04,0x01,0xe5,0xff,0xe7, -0x02,0x04,0x01,0xe7,0xff,0xe5,0x02,0x04,0x01,0xeb,0xff,0xf6,0x02,0x04,0x01,0xf2,0xff,0xf6,0x02,0x04,0x01,0xf9,0xff,0xa2,0x02,0x04,0x01,0xfa,0xff,0xe7,0x02,0x04,0x01,0xfc,0xff,0xdb,0x02,0x04,0x02,0x01,0xff,0xa2,0x02,0x05,0x00,0x0f,0xff,0xa2,0x02,0x05,0x00,0x11,0xff,0xa2,0x02,0x05,0x00,0xac,0xff,0xa2,0x02,0x05,0x00,0xc4, -0xff,0x4a,0x02,0x05,0x00,0xc5,0xff,0x96,0x02,0x05,0x01,0xdc,0xff,0xa2,0x02,0x05,0x01,0xdf,0xff,0xdb,0x02,0x05,0x01,0xe1,0xff,0xf6,0x02,0x05,0x01,0xe3,0xff,0xa2,0x02,0x05,0x01,0xe5,0xff,0xe7,0x02,0x05,0x01,0xe7,0xff,0xe5,0x02,0x05,0x01,0xeb,0xff,0xf6,0x02,0x05,0x01,0xf2,0xff,0xf6,0x02,0x05,0x01,0xf9,0xff,0xa2,0x02,0x05, -0x01,0xfa,0xff,0xe7,0x02,0x05,0x01,0xfc,0xff,0xdb,0x02,0x05,0x02,0x01,0xff,0xa2,0x02,0x07,0x02,0x1e,0xff,0xe7,0x02,0x08,0x02,0x0b,0xff,0xe7,0x02,0x08,0x02,0x0d,0xff,0xe1,0x02,0x08,0x02,0x19,0xff,0xdb,0x02,0x08,0x02,0x21,0xff,0xdb,0x02,0x09,0x02,0x19,0xff,0xee,0x02,0x09,0x02,0x1e,0xff,0xe7,0x02,0x09,0x02,0x21,0xff,0xee, -0x02,0x0a,0x00,0x0f,0xff,0xc3,0x02,0x0a,0x00,0x11,0xff,0xae,0x02,0x0a,0x00,0xac,0xff,0xae,0x02,0x0a,0x02,0x07,0xff,0xc3,0x02,0x0a,0x02,0x0b,0xff,0xb6,0x02,0x0a,0x02,0x0c,0xff,0xdb,0x02,0x0a,0x02,0x12,0xff,0xb6,0x02,0x0a,0x02,0x15,0xff,0xdb,0x02,0x0a,0x02,0x18,0xff,0xdb,0x02,0x0a,0x02,0x19,0x00,0x29,0x02,0x0a,0x02,0x1b, -0xff,0xdb,0x02,0x0a,0x02,0x21,0x00,0x29,0x02,0x0a,0x02,0x26,0xff,0xe7,0x02,0x0a,0x02,0x27,0xff,0xdb,0x02,0x0a,0x02,0x2a,0xff,0xdb,0x02,0x0a,0x02,0x2d,0xff,0xb6,0x02,0x0b,0x02,0x12,0x00,0x14,0x02,0x0b,0x02,0x1e,0xff,0xdb,0x02,0x0b,0x02,0x2d,0x00,0x14,0x02,0x0c,0x00,0x05,0xff,0x98,0x02,0x0c,0x00,0x0a,0xff,0x98,0x02,0x0d, -0x00,0x0f,0x00,0x52,0x02,0x0d,0x00,0x10,0xff,0x73,0x02,0x0d,0x00,0x11,0x00,0x52,0x02,0x0d,0x00,0x1d,0x00,0x52,0x02,0x0d,0x00,0x1e,0x00,0x52,0x02,0x0d,0x00,0xac,0x00,0x52,0x02,0x0d,0x02,0x0b,0x00,0x29,0x02,0x0d,0x02,0x0c,0xff,0xd7,0x02,0x0d,0x02,0x0d,0x00,0x4a,0x02,0x0d,0x02,0x12,0x00,0x52,0x02,0x0d,0x02,0x15,0xff,0xd7, -0x02,0x0d,0x02,0x18,0xff,0xd7,0x02,0x0d,0x02,0x1b,0xff,0xd7,0x02,0x0d,0x02,0x1e,0xff,0xe7,0x02,0x0d,0x02,0x27,0xff,0xd7,0x02,0x0d,0x02,0x2a,0xff,0xd7,0x02,0x0d,0x02,0x2d,0x00,0x29,0x02,0x0e,0x02,0x1e,0xff,0xd7,0x02,0x11,0x00,0x0f,0x00,0x52,0x02,0x11,0x00,0x10,0xff,0x73,0x02,0x11,0x00,0x11,0x00,0x52,0x02,0x11,0x00,0x1d, -0x00,0x52,0x02,0x11,0x00,0x1e,0x00,0x52,0x02,0x11,0x00,0xac,0x00,0x52,0x02,0x11,0x02,0x0b,0x00,0x14,0x02,0x11,0x02,0x0c,0xff,0xd7,0x02,0x11,0x02,0x0d,0x00,0x3d,0x02,0x11,0x02,0x12,0x00,0x29,0x02,0x11,0x02,0x15,0xff,0xd7,0x02,0x11,0x02,0x18,0xff,0xd7,0x02,0x11,0x02,0x1b,0xff,0xd7,0x02,0x11,0x02,0x1e,0xff,0xe7,0x02,0x11, -0x02,0x27,0xff,0xd7,0x02,0x11,0x02,0x2a,0xff,0xd7,0x02,0x11,0x02,0x2d,0x00,0x29,0x02,0x15,0x00,0x05,0xff,0x6f,0x02,0x15,0x00,0x0a,0xff,0x6f,0x02,0x15,0x00,0xb4,0xff,0xb0,0x02,0x15,0x00,0xb5,0xff,0x7b,0x02,0x15,0x00,0xb6,0xff,0xbc,0x02,0x15,0x00,0xb7,0xff,0x7b,0x02,0x15,0x02,0x07,0xff,0xe5,0x02,0x15,0x02,0x0b,0xff,0xe7, -0x02,0x15,0x02,0x0d,0xff,0xd7,0x02,0x15,0x02,0x19,0xff,0xdb,0x02,0x15,0x02,0x1c,0xff,0xe7,0x02,0x15,0x02,0x21,0xff,0xdb,0x02,0x17,0x00,0x05,0xff,0x6f,0x02,0x17,0x00,0x0a,0xff,0x6f,0x02,0x17,0x00,0xb4,0xff,0xc9,0x02,0x17,0x00,0xb5,0xff,0x87,0x02,0x17,0x00,0xb6,0xff,0x87,0x02,0x17,0x00,0xb7,0xff,0x87,0x02,0x17,0x02,0x07, -0xff,0xe5,0x02,0x17,0x02,0x0b,0xff,0xe7,0x02,0x17,0x02,0x0d,0xff,0xd7,0x02,0x17,0x02,0x19,0xff,0xdb,0x02,0x17,0x02,0x1c,0xff,0xe7,0x02,0x17,0x02,0x21,0xff,0xdb,0x02,0x19,0x00,0x0f,0xff,0xc3,0x02,0x19,0x00,0x11,0xff,0xae,0x02,0x19,0x00,0xac,0xff,0xae,0x02,0x19,0x02,0x0b,0xff,0xdb,0x02,0x19,0x02,0x0c,0xff,0xdb,0x02,0x19, -0x02,0x12,0xff,0xdb,0x02,0x19,0x02,0x15,0xff,0xdb,0x02,0x19,0x02,0x18,0xff,0xdb,0x02,0x19,0x02,0x19,0x00,0x14,0x02,0x19,0x02,0x1a,0x00,0x29,0x02,0x19,0x02,0x1b,0xff,0xdb,0x02,0x19,0x02,0x21,0x00,0x29,0x02,0x19,0x02,0x26,0xff,0xe7,0x02,0x19,0x02,0x27,0xff,0xdb,0x02,0x19,0x02,0x2a,0xff,0xdb,0x02,0x19,0x02,0x2d,0xff,0xdb, -0x02,0x19,0x02,0x31,0x00,0x29,0x02,0x1a,0x00,0x05,0x00,0x1d,0x02,0x1a,0x00,0x0a,0x00,0x1d,0x02,0x1a,0x00,0x0f,0xff,0x98,0x02,0x1a,0x00,0x11,0xff,0x7f,0x02,0x1a,0x00,0x22,0xff,0xb2,0x02,0x1a,0x00,0xac,0xff,0x7f,0x02,0x1a,0x00,0xbf,0x00,0x0e,0x02,0x1a,0x00,0xc4,0xff,0x8b,0x02,0x1a,0x00,0xc5,0xff,0x8b,0x02,0x1a,0x02,0x0b, -0xff,0x91,0x02,0x1a,0x02,0x0c,0xff,0xf6,0x02,0x1a,0x02,0x12,0xff,0x91,0x02,0x1a,0x02,0x15,0xff,0xf6,0x02,0x1a,0x02,0x18,0xff,0xf6,0x02,0x1a,0x02,0x19,0x00,0x29,0x02,0x1a,0x02,0x1b,0xff,0xf6,0x02,0x1a,0x02,0x21,0x00,0x29,0x02,0x1a,0x02,0x27,0xff,0xf6,0x02,0x1a,0x02,0x2a,0xff,0xf6,0x02,0x1a,0x02,0x2d,0xff,0x91,0x02,0x1b, -0x00,0x05,0xff,0x6f,0x02,0x1b,0x00,0x0a,0xff,0x6f,0x02,0x1b,0x00,0xb4,0xff,0xb0,0x02,0x1b,0x00,0xb5,0xff,0x7b,0x02,0x1b,0x00,0xb6,0xff,0xbc,0x02,0x1b,0x00,0xb7,0xff,0x7b,0x02,0x1b,0x02,0x07,0xff,0xe5,0x02,0x1b,0x02,0x0b,0xff,0xe7,0x02,0x1b,0x02,0x0d,0xff,0xd7,0x02,0x1b,0x02,0x19,0xff,0xdb,0x02,0x1b,0x02,0x1c,0xff,0xe7, -0x02,0x1b,0x02,0x21,0xff,0xdb,0x02,0x1c,0x02,0x0b,0x00,0x14,0x02,0x1c,0x02,0x0c,0xff,0xee,0x02,0x1c,0x02,0x12,0x00,0x29,0x02,0x1c,0x02,0x15,0xff,0xee,0x02,0x1c,0x02,0x18,0xff,0xee,0x02,0x1c,0x02,0x1b,0xff,0xee,0x02,0x1c,0x02,0x1e,0xff,0xdb,0x02,0x1c,0x02,0x27,0xff,0xee,0x02,0x1c,0x02,0x2a,0xff,0xee,0x02,0x1c,0x02,0x2d, -0x00,0x29,0x02,0x1d,0x02,0x1e,0xff,0xdb,0x02,0x20,0x02,0x1e,0xff,0xdb,0x02,0x21,0x02,0x0c,0xff,0xf4,0x02,0x21,0x02,0x15,0xff,0xf4,0x02,0x21,0x02,0x18,0xff,0xf4,0x02,0x21,0x02,0x19,0xff,0xaa,0x02,0x21,0x02,0x1a,0xff,0xb6,0x02,0x21,0x02,0x1b,0xff,0xf4,0x02,0x21,0x02,0x1e,0xff,0x85,0x02,0x21,0x02,0x21,0xff,0xaa,0x02,0x21, -0x02,0x27,0xff,0xf4,0x02,0x21,0x02,0x2a,0xff,0xf4,0x02,0x21,0x02,0x31,0xff,0xb6,0x02,0x23,0x02,0x0c,0xff,0xf4,0x02,0x23,0x02,0x15,0xff,0xf4,0x02,0x23,0x02,0x18,0xff,0xf4,0x02,0x23,0x02,0x19,0xff,0xaa,0x02,0x23,0x02,0x1a,0xff,0xb6,0x02,0x23,0x02,0x1b,0xff,0xf4,0x02,0x23,0x02,0x1e,0xff,0x85,0x02,0x23,0x02,0x21,0xff,0xaa, -0x02,0x23,0x02,0x27,0xff,0xf4,0x02,0x23,0x02,0x2a,0xff,0xf4,0x02,0x23,0x02,0x31,0xff,0xb6,0x02,0x24,0x00,0x05,0xff,0x6f,0x02,0x24,0x00,0x0a,0xff,0x6f,0x02,0x24,0x00,0xb4,0xff,0xb0,0x02,0x24,0x00,0xb5,0xff,0x7b,0x02,0x24,0x00,0xb6,0xff,0xbc,0x02,0x24,0x00,0xb7,0xff,0x7b,0x02,0x24,0x02,0x07,0xff,0xe5,0x02,0x24,0x02,0x0b, -0xff,0xe7,0x02,0x24,0x02,0x0d,0xff,0xd7,0x02,0x24,0x02,0x19,0xff,0xdb,0x02,0x24,0x02,0x1c,0xff,0xe7,0x02,0x24,0x02,0x21,0xff,0xdb,0x02,0x25,0x00,0x05,0xff,0x6f,0x02,0x25,0x00,0x0a,0xff,0x6f,0x02,0x25,0x00,0xb4,0xff,0xb0,0x02,0x25,0x00,0xb5,0xff,0x7b,0x02,0x25,0x00,0xb6,0xff,0xbc,0x02,0x25,0x00,0xb7,0xff,0x7b,0x02,0x25, -0x02,0x07,0xff,0xe5,0x02,0x25,0x02,0x0b,0xff,0xe7,0x02,0x25,0x02,0x0d,0xff,0xd7,0x02,0x25,0x02,0x19,0xff,0xdb,0x02,0x25,0x02,0x1c,0xff,0xe7,0x02,0x25,0x02,0x21,0xff,0xdb,0x02,0x27,0x00,0x05,0xff,0x98,0x02,0x27,0x00,0x0a,0xff,0x98,0x02,0x28,0x00,0x05,0xff,0x6f,0x02,0x28,0x00,0x0a,0xff,0x6f,0x02,0x28,0x00,0xb4,0xff,0xb0, -0x02,0x28,0x00,0xb5,0xff,0x7b,0x02,0x28,0x00,0xb6,0xff,0xbc,0x02,0x28,0x00,0xb7,0xff,0x7b,0x02,0x28,0x02,0x07,0xff,0xee,0x02,0x28,0x02,0x19,0xff,0xe7,0x02,0x28,0x02,0x1c,0xff,0xee,0x02,0x28,0x02,0x1e,0xff,0xe7,0x02,0x28,0x02,0x21,0xff,0xe7,0x02,0x29,0x00,0x0f,0xff,0xc3,0x02,0x29,0x00,0x11,0xff,0xae,0x02,0x29,0x00,0xac, -0xff,0xae,0x02,0x29,0x02,0x07,0xff,0xc3,0x02,0x29,0x02,0x0b,0xff,0xb6,0x02,0x29,0x02,0x0c,0xff,0xdb,0x02,0x29,0x02,0x12,0xff,0xb6,0x02,0x29,0x02,0x15,0xff,0xdb,0x02,0x29,0x02,0x18,0xff,0xdb,0x02,0x29,0x02,0x19,0x00,0x29,0x02,0x29,0x02,0x1b,0xff,0xdb,0x02,0x29,0x02,0x21,0x00,0x29,0x02,0x29,0x02,0x26,0xff,0xe7,0x02,0x29, -0x02,0x27,0xff,0xdb,0x02,0x29,0x02,0x2a,0xff,0xdb,0x02,0x29,0x02,0x2d,0xff,0xb6,0x02,0x2a,0x01,0xe4,0xff,0xe5,0x02,0x2c,0x02,0x28,0x00,0x52,0x02,0x2c,0x02,0x2f,0x00,0x52,0x02,0x2d,0x02,0x0c,0xff,0xf4,0x02,0x2d,0x02,0x15,0xff,0xf4,0x02,0x2d,0x02,0x18,0xff,0xf4,0x02,0x2d,0x02,0x19,0xff,0xaa,0x02,0x2d,0x02,0x1a,0xff,0xb6, -0x02,0x2d,0x02,0x1b,0xff,0xf4,0x02,0x2d,0x02,0x1e,0xff,0x85,0x02,0x2d,0x02,0x21,0xff,0xaa,0x02,0x2d,0x02,0x27,0xff,0xf4,0x02,0x2d,0x02,0x2a,0xff,0xf4,0x02,0x2d,0x02,0x31,0xff,0xb6,0x02,0x2e,0x02,0x0c,0xff,0xf4,0x02,0x2e,0x02,0x15,0xff,0xf4,0x02,0x2e,0x02,0x18,0xff,0xf4,0x02,0x2e,0x02,0x19,0xff,0xaa,0x02,0x2e,0x02,0x1a, -0xff,0xb6,0x02,0x2e,0x02,0x1b,0xff,0xf4,0x02,0x2e,0x02,0x1e,0xff,0x85,0x02,0x2e,0x02,0x21,0xff,0xaa,0x02,0x2e,0x02,0x27,0xff,0xf4,0x02,0x2e,0x02,0x2a,0xff,0xf4,0x02,0x2e,0x02,0x31,0xff,0xb6,0x02,0x2f,0x00,0x05,0xff,0x98,0x02,0x2f,0x00,0x0a,0xff,0x98,0x02,0x30,0x00,0x0f,0x00,0x52,0x02,0x30,0x00,0x10,0xff,0x73,0x02,0x30, -0x00,0x11,0x00,0x52,0x02,0x30,0x00,0x1d,0x00,0x52,0x02,0x30,0x00,0x1e,0x00,0x52,0x02,0x30,0x00,0xac,0x00,0x52,0x02,0x30,0x02,0x0b,0x00,0x29,0x02,0x30,0x02,0x0c,0xff,0xd7,0x02,0x30,0x02,0x12,0x00,0x3d,0x02,0x30,0x02,0x15,0xff,0xd7,0x02,0x30,0x02,0x18,0xff,0xd7,0x02,0x30,0x02,0x1b,0xff,0xd7,0x02,0x30,0x02,0x1e,0xff,0xe7, -0x02,0x30,0x02,0x27,0xff,0xd7,0x02,0x30,0x02,0x2a,0xff,0xd7,0x02,0x30,0x02,0x2d,0x00,0x3d,0x02,0x31,0x00,0x05,0x00,0x1d,0x02,0x31,0x00,0x0a,0x00,0x1d,0x02,0x31,0x00,0x0f,0xff,0x98,0x02,0x31,0x00,0x11,0xff,0x7f,0x02,0x31,0x00,0x22,0xff,0xb2,0x02,0x31,0x00,0xac,0xff,0x7f,0x02,0x31,0x00,0xbf,0x00,0x0e,0x02,0x31,0x00,0xc4, -0xff,0x8b,0x02,0x31,0x00,0xc5,0xff,0x8b,0x02,0x31,0x02,0x0b,0xff,0x91,0x02,0x31,0x02,0x0c,0xff,0xf6,0x02,0x31,0x02,0x12,0xff,0x91,0x02,0x31,0x02,0x15,0xff,0xf6,0x02,0x31,0x02,0x18,0xff,0xf6,0x02,0x31,0x02,0x19,0x00,0x29,0x02,0x31,0x02,0x1b,0xff,0xf6,0x02,0x31,0x02,0x21,0x00,0x29,0x02,0x31,0x02,0x27,0xff,0xf6,0x02,0x31, -0x02,0x2a,0xff,0xf6,0x02,0x31,0x02,0x2d,0xff,0x91,0x02,0x33,0x01,0xdc,0x00,0x29,0x02,0x33,0x01,0xde,0xff,0xa2,0x02,0x33,0x01,0xe0,0x00,0x2d,0x02,0x33,0x01,0xe1,0xff,0xa2,0x02,0x33,0x01,0xe3,0x00,0x29,0x02,0x33,0x01,0xe5,0x00,0x1d,0x02,0x33,0x01,0xe7,0xff,0x71,0x02,0x33,0x01,0xeb,0xff,0xa2,0x02,0x33,0x01,0xf2,0xff,0xa2, -0x02,0x33,0x01,0xf5,0xff,0xcf,0x02,0x33,0x01,0xf8,0xff,0xcf,0x02,0x33,0x01,0xf9,0x00,0x29,0x02,0x33,0x01,0xfa,0x00,0x1d,0x02,0x33,0x01,0xfb,0xff,0xa2,0x02,0x33,0x02,0x01,0x00,0x29,0x02,0x33,0x02,0x06,0xff,0xe7,0x02,0x33,0x02,0x07,0xff,0x27,0x02,0x33,0x02,0x09,0xff,0x4e,0x02,0x33,0x02,0x0a,0xff,0x4e,0x02,0x33,0x02,0x0b, -0xff,0x9e,0x02,0x33,0x02,0x0c,0xff,0x2b,0x02,0x33,0x02,0x0f,0xff,0x4e,0x02,0x33,0x02,0x10,0xff,0x4e,0x02,0x33,0x02,0x11,0xff,0x4e,0x02,0x33,0x02,0x12,0xff,0x9e,0x02,0x33,0x02,0x13,0xff,0x4e,0x02,0x33,0x02,0x14,0xff,0x4e,0x02,0x33,0x02,0x15,0xff,0x2b,0x02,0x33,0x02,0x16,0xff,0x4e,0x02,0x33,0x02,0x17,0xff,0x4e,0x02,0x33, -0x02,0x18,0xff,0x2b,0x02,0x33,0x02,0x19,0xff,0xc3,0x02,0x33,0x02,0x1b,0xff,0x2b,0x02,0x33,0x02,0x1c,0xff,0x4c,0x02,0x33,0x02,0x1d,0xff,0x4e,0x02,0x33,0x02,0x1e,0xff,0x4e,0x02,0x33,0x02,0x1f,0xff,0x4e,0x02,0x33,0x02,0x20,0xff,0x4e,0x02,0x33,0x02,0x21,0xff,0xc3,0x02,0x33,0x02,0x22,0xff,0x4e,0x02,0x33,0x02,0x23,0xff,0x4e, -0x02,0x33,0x02,0x24,0xff,0x60,0x02,0x33,0x02,0x25,0xff,0x4e,0x02,0x33,0x02,0x26,0xff,0x54,0x02,0x33,0x02,0x27,0xff,0x2b,0x02,0x33,0x02,0x29,0xff,0x4e,0x02,0x33,0x02,0x2a,0xff,0x2b,0x02,0x33,0x02,0x2b,0xff,0x66,0x02,0x33,0x02,0x2c,0x00,0x6f,0x02,0x33,0x02,0x2d,0xff,0x9e,0x02,0x33,0x02,0x2e,0xff,0x4e,0x02,0x33,0x02,0x32, -0xff,0x4e,0x02,0x33,0x02,0x34,0xff,0x4e,0x02,0x34,0x00,0x0f,0xff,0xc3,0x02,0x34,0x00,0x11,0xff,0xae,0x02,0x34,0x00,0xac,0xff,0xae,0x02,0x34,0x02,0x07,0xff,0xc3,0x02,0x34,0x02,0x0b,0xff,0xb6,0x02,0x34,0x02,0x0c,0xff,0xdb,0x02,0x34,0x02,0x12,0xff,0xb6,0x02,0x34,0x02,0x15,0xff,0xdb,0x02,0x34,0x02,0x18,0xff,0xdb,0x02,0x34, -0x02,0x19,0x00,0x29,0x02,0x34,0x02,0x1b,0xff,0xdb,0x02,0x34,0x02,0x21,0x00,0x29,0x02,0x34,0x02,0x26,0xff,0xe7,0x02,0x34,0x02,0x27,0xff,0xdb,0x02,0x34,0x02,0x2a,0xff,0xdb,0x02,0x34,0x02,0x2c,0x00,0x52,0x02,0x34,0x02,0x2d,0xff,0xb6,0x02,0x37,0x01,0x33,0x00,0x19,0x02,0x37,0x01,0xc5,0x00,0x29,0x02,0x37,0x02,0x37,0x00,0x19, -0x02,0x3d,0x00,0x57,0xff,0xbe,0x02,0x3d,0x00,0x59,0xff,0xcf,0x02,0x3d,0x00,0x5a,0xff,0xe5,0x02,0x3d,0x00,0x5c,0xff,0xd1,0x02,0x3d,0x00,0xba,0xff,0xbe,0x02,0x3d,0x00,0xc4,0xff,0xb2,0x02,0x3d,0x00,0xc5,0xff,0xb2,0x02,0x3d,0x00,0xeb,0xff,0xd1,0x02,0x3d,0x01,0x21,0xff,0xbe,0x02,0x3d,0x01,0x23,0xff,0xbe,0x02,0x3d,0x01,0x77, -0xff,0xbe,0x02,0x3d,0x01,0x81,0xff,0xe5,0x02,0x3d,0x01,0x83,0xff,0xd1,0x02,0x3d,0x01,0x8d,0xff,0xe5,0x02,0x3d,0x01,0x8f,0xff,0xe5,0x02,0x3d,0x01,0x91,0xff,0xe5,0x02,0x3d,0x01,0x93,0xff,0xd1,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x46,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x14,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, -0x00,0x01,0x00,0x10,0x02,0x14,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x24,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x10,0x02,0x14,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x18,0x02,0x52,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x0e, -0x02,0x6a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x72,0x02,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x2a,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0b,0x00,0x56,0x02,0xea,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0d,0x0e,0x04,0x03,0x40,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x56,0x02,0xea,0x00,0x03, -0x00,0x01,0x04,0x03,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x05,0x00,0x02,0x00,0x10,0x11,0x50,0x00,0x03,0x00,0x01,0x04,0x06,0x00,0x02,0x00,0x0c,0x11,0x60,0x00,0x03,0x00,0x01,0x04,0x07,0x00,0x02,0x00,0x10,0x11,0x6c,0x00,0x03,0x00,0x01,0x04,0x08,0x00,0x02,0x00,0x10,0x11,0x7c,0x00,0x03,0x00,0x01,0x04,0x09, -0x00,0x00,0x02,0x18,0x11,0x8c,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x10,0x02,0x14,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e,0x02,0x24,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x20,0x02,0x32,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x10,0x02,0x14,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x18, -0x02,0x52,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x0e,0x02,0x6a,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x07,0x00,0x72,0x02,0x78,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x08,0x00,0x2a,0x00,0x0e,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x56,0x02,0xea,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0d,0x0e,0x18,0x13,0xa4,0x00,0x03, -0x00,0x01,0x04,0x09,0x00,0x0e,0x00,0x4a,0x02,0xea,0x00,0x03,0x00,0x01,0x04,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x0b,0x00,0x02,0x00,0x10,0x21,0xbc,0x00,0x03,0x00,0x01,0x04,0x0c,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x0e,0x00,0x02,0x00,0x0c,0x21,0xcc,0x00,0x03,0x00,0x01,0x04,0x10, -0x00,0x02,0x00,0x0e,0x21,0xd8,0x00,0x03,0x00,0x01,0x04,0x13,0x00,0x02,0x00,0x12,0x21,0xe6,0x00,0x03,0x00,0x01,0x04,0x14,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x15,0x00,0x02,0x00,0x10,0x21,0xf8,0x00,0x03,0x00,0x01,0x04,0x16,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x19,0x00,0x02,0x00,0x0e, -0x22,0x08,0x00,0x03,0x00,0x01,0x04,0x1b,0x00,0x02,0x00,0x10,0x22,0x16,0x00,0x03,0x00,0x01,0x04,0x1d,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x1f,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x24,0x00,0x02,0x00,0x0e,0x22,0x26,0x00,0x03,0x00,0x01,0x04,0x2d,0x00,0x02,0x00,0x0e,0x22,0x34,0x00,0x03, -0x00,0x01,0x08,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x08,0x16,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x0c,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x0c,0x0c,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x31,0x00,0x38,0x00,0x20,0x00,0x4d,0x00,0x69, -0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x72,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x52,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20, -0x00,0x52,0x00,0x65,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0d,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f, -0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x33,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x37, -0x00,0x2c,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x54, -0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65, -0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x75,0x00,0x72,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64, -0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x3b,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x65,0x00,0x64, -0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x73, -0x00,0x2e,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x55,0x00,0x49,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x55,0x00,0x49,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72, -0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x35,0x00,0x2e,0x00,0x36,0x00,0x32,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x55,0x00,0x49,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x74,0x00,0x72, -0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x6d,0x00,0x61,0x00,0x72,0x00,0x6b,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x6f,0x00,0x75,0x00,0x70,0x00,0x20,0x00,0x6f, -0x00,0x66,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x70,0x00,0x61,0x00,0x6e,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x2e,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x64,0x00,0x6f,0x00,0x63,0x00,0x73,0x00,0x2e,0x00,0x6d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f, -0x00,0x66,0x00,0x74,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x2f,0x00,0x74,0x00,0x79,0x00,0x70,0x00,0x6f,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x70,0x00,0x68,0x00,0x79,0x00,0x2f,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74, -0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73, -0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x63,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x70,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x70,0x00,0x72, -0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20, -0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f, -0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65, -0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x69,0x00,0x63,0x00,0x68,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20, -0x00,0x77,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x65, -0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72, -0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74, -0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x3b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20, -0x00,0x28,0x00,0x69,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x72,0x00,0x69,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x77,0x00,0x6e,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66, -0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x70,0x00,0x75,0x00,0x74, -0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x6c,0x00,0x70,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x41, -0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x0d,0x00,0x0d,0x00,0x54,0x00,0x68,0x00,0x65, -0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65, -0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x65,0x00,0x6e,0x00,0x2e,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x69, -0x00,0x61,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x2f,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x5f,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x73, -0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f, -0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x20,0x1d, -0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x6a,0x00,0x6f,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6c,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48, -0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0d,0x00,0x50,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73, -0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x65,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20, -0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6f,0x00,0x62,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20, -0x00,0x61,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f, -0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x6f, -0x00,0x63,0x00,0x69,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x63,0x00,0x75,0x00,0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20, -0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x20,0x1d,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x61, -0x00,0x6c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x77, -0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x77,0x00,0x69, -0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x75, -0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x6f,0x00,0x64,0x00,0x69,0x00,0x66,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x65,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x73,0x00,0x68, -0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x62,0x00,0x75,0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x2f,0x00,0x6f,0x00,0x72, -0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63, -0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x73, -0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61, -0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x75,0x00,0x72,0x00,0x6e,0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6a,0x00,0x65,0x00,0x63, -0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x3a,0x00,0x0d,0x00,0x0d, -0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x76,0x00,0x65,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74, -0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x69, -0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e, -0x00,0x74,0x00,0x69,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69, -0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2e,0x00,0x0d,0x00,0x0d,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x20,0x00,0x50,0x00,0x52,0x00,0x4f, -0x00,0x56,0x00,0x49,0x00,0x44,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x27,0x00,0x41,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x27,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x59,0x00,0x20, -0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x4b,0x00,0x49,0x00,0x4e,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x45,0x00,0x58,0x00,0x50,0x00,0x52,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4d,0x00,0x50,0x00,0x4c,0x00,0x49,0x00,0x45,0x00,0x44,0x00,0x2c, -0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x4c,0x00,0x55,0x00,0x44,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x42,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x20,0x00,0x54,0x00,0x48, -0x00,0x45,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x49,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4d,0x00,0x45,0x00,0x52,0x00,0x43,0x00,0x48,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c, -0x00,0x20,0x00,0x46,0x00,0x49,0x00,0x54,0x00,0x4e,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x20,0x00,0x50,0x00,0x41,0x00,0x52,0x00,0x54,0x00,0x49,0x00,0x43,0x00,0x55,0x00,0x4c,0x00,0x41,0x00,0x52,0x00,0x20,0x00,0x50,0x00,0x55,0x00,0x52,0x00,0x50,0x00,0x4f,0x00,0x53, -0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x44,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x4e,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x52,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x45,0x00,0x4d,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x2e,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x20,0x00,0x45,0x00,0x56,0x00,0x45, -0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x48,0x00,0x41,0x00,0x4c,0x00,0x4c,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x55,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x50,0x00,0x59,0x00,0x52,0x00,0x49,0x00,0x47,0x00,0x48, -0x00,0x54,0x00,0x20,0x00,0x48,0x00,0x4f,0x00,0x4c,0x00,0x44,0x00,0x45,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x42,0x00,0x45,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x4c,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x43,0x00,0x4c,0x00,0x41,0x00,0x49, -0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x44,0x00,0x41,0x00,0x4d,0x00,0x41,0x00,0x47,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x57, -0x00,0x48,0x00,0x45,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x52,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x2c, -0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x52,0x00,0x54,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x57,0x00,0x49,0x00,0x53,0x00,0x45,0x00,0x2c,0x00,0x20,0x00,0x41,0x00,0x52,0x00,0x49,0x00,0x53,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x46,0x00,0x52,0x00,0x4f,0x00,0x4d, -0x00,0x2c,0x00,0x20,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x4e,0x00,0x45,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x20,0x00,0x54, -0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x55,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20, -0x00,0x44,0x00,0x45,0x00,0x41,0x00,0x4c,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x2e,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x6f, -0x00,0x62,0x00,0x79,0x01,0x0d,0x00,0x65,0x00,0x6a,0x00,0x6e,0x00,0xe9,0x00,0x6e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x61,0x00,0x72,0x00,0x64,0x03,0x9a,0x03,0xb1,0x03,0xbd,0x03,0xbf,0x03,0xbd,0x03,0xb9,0x03,0xba,0x03,0xac,0x00,0xa9,0x00,0x20,0x00,0x32, -0x00,0x30,0x00,0x31,0x00,0x38,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x72,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x52, -0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54, -0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30, -0x00,0x33,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x37,0x00,0x2c,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48, -0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62, -0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x75,0x00,0x72,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74, -0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x3b,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x65,0x00,0x20, -0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72, -0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x73,0x00,0x2e,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74, -0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x63,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x74, -0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x70,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73, -0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20, -0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66, -0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69, -0x00,0x6e,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x69,0x00,0x63,0x00,0x68,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x77,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20, -0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74, -0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20, -0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20, -0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x3b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x72,0x00,0x69, -0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x77,0x00,0x6e,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74, -0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x70,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x6c, -0x00,0x70,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69, -0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x6c, -0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65, -0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x65,0x00,0x6e,0x00,0x2e,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x69,0x00,0x61,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x2f,0x00,0x4d, -0x00,0x49,0x00,0x54,0x00,0x5f,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e, -0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48, -0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x20,0x1d,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x6a,0x00,0x6f,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x6c,0x00,0x79,0x00,0x20, -0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6c,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x4a, -0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x50,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x68,0x00,0x65, -0x00,0x72,0x00,0x65,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f, -0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6f,0x00,0x62,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20, -0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69, -0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x6f,0x00,0x63,0x00,0x69,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x63, -0x00,0x75,0x00,0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f, -0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x20,0x1d,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c, -0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x77,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73, -0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x77,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x6d,0x00,0x69, -0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x2c,0x00,0x20, -0x00,0x6d,0x00,0x6f,0x00,0x64,0x00,0x69,0x00,0x66,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x65,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x62,0x00,0x75, -0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x2f,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69, -0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2c, -0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x74, -0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x75,0x00,0x72,0x00,0x6e, -0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66, -0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x3a,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x76, -0x00,0x65,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d, -0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20, -0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x69,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x70,0x00,0x6f,0x00,0x72, -0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61, -0x00,0x72,0x00,0x65,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x20,0x00,0x50,0x00,0x52,0x00,0x4f,0x00,0x56,0x00,0x49,0x00,0x44,0x00,0x45,0x00,0x44,0x00,0x20, -0x00,0x27,0x00,0x41,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x27,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x59,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59, -0x00,0x20,0x00,0x4b,0x00,0x49,0x00,0x4e,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x45,0x00,0x58,0x00,0x50,0x00,0x52,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4d,0x00,0x50,0x00,0x4c,0x00,0x49,0x00,0x45,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x4c,0x00,0x55, -0x00,0x44,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x42,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52, -0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x49,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4d,0x00,0x45,0x00,0x52,0x00,0x43,0x00,0x48,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x46,0x00,0x49,0x00,0x54,0x00,0x4e,0x00,0x45, -0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x20,0x00,0x50,0x00,0x41,0x00,0x52,0x00,0x54,0x00,0x49,0x00,0x43,0x00,0x55,0x00,0x4c,0x00,0x41,0x00,0x52,0x00,0x20,0x00,0x50,0x00,0x55,0x00,0x52,0x00,0x50,0x00,0x4f,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x44,0x00,0x20, -0x00,0x4e,0x00,0x4f,0x00,0x4e,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x52,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x45,0x00,0x4d,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x2e,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x20,0x00,0x45,0x00,0x56,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x48,0x00,0x41, -0x00,0x4c,0x00,0x4c,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x55,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x50,0x00,0x59,0x00,0x52,0x00,0x49,0x00,0x47,0x00,0x48,0x00,0x54,0x00,0x20,0x00,0x48,0x00,0x4f,0x00,0x4c,0x00,0x44, -0x00,0x45,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x42,0x00,0x45,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x4c,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x43,0x00,0x4c,0x00,0x41,0x00,0x49,0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x44,0x00,0x41,0x00,0x4d, -0x00,0x41,0x00,0x47,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x48,0x00,0x45,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52, -0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x52,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x2c,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x52,0x00,0x54,0x00,0x20, -0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x57,0x00,0x49,0x00,0x53,0x00,0x45,0x00,0x2c,0x00,0x20,0x00,0x41,0x00,0x52,0x00,0x49,0x00,0x53,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x46,0x00,0x52,0x00,0x4f,0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20, -0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x4e,0x00,0x45,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46, -0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x55,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x44,0x00,0x45,0x00,0x41,0x00,0x4c,0x00,0x49,0x00,0x4e, -0x00,0x47,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x61,0x00,0x6c,0x00,0x69,0x00,0x4e,0x00,0x6f,0x00,0x72, -0x00,0x6d,0x00,0xe1,0x00,0x6c,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x65,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x61,0x00,0x61,0x00,0x72,0x00,0x64,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x6e,0x00,0x79,0x04,0x1e,0x04,0x31,0x04,0x4b,0x04,0x47,0x04,0x3d, -0x04,0x4b,0x04,0x39,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0xe1,0x00,0x6c,0x00,0x6e,0x00,0x65,0x00,0x4e,0x00,0x61,0x00,0x76,0x00,0x61,0x00,0x64,0x00,0x6e,0x00,0x6f,0x00,0x41,0x00,0x72,0x00,0x72,0x00,0x75,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x4e,0x00,0x77,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x08,0x00,0x0a,0x00,0x13,0x00,0x07,0xff,0xff,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x23,0x8a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x82,0x30,0x82,0x23,0x7e, -0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x23,0x6f,0x30,0x82,0x23,0x6b,0x02,0x01,0x01,0x31,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x71,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0xa0,0x63,0x30,0x61,0x30,0x2c,0x06,0x0a,0x2b,0x06,0x01, -0x04,0x01,0x82,0x37,0x02,0x01,0x1c,0xa2,0x1e,0x80,0x1c,0x00,0x3c,0x00,0x3c,0x00,0x3c,0x00,0x4f,0x00,0x62,0x00,0x73,0x00,0x6f,0x00,0x6c,0x00,0x65,0x00,0x74,0x00,0x65,0x00,0x3e,0x00,0x3e,0x00,0x3e,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,0xd1,0x66,0x06,0x5e,0x25,0x40, -0xdd,0x89,0xdd,0x33,0x17,0x38,0x13,0xf4,0x79,0x7b,0x24,0x66,0x3e,0x9d,0x0d,0xef,0x96,0x4e,0xe9,0x40,0xb6,0xb7,0x21,0xab,0x14,0x43,0xa0,0x82,0x0d,0x81,0x30,0x82,0x05,0xff,0x30,0x82,0x03,0xe7,0xa0,0x03,0x02,0x01,0x02,0x02,0x13,0x33,0x00,0x00,0x01,0x03,0x5e,0x25,0x1c,0x99,0x1f,0xa3,0x1e,0xb8,0x00,0x00,0x00,0x00,0x01,0x03, -0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65, -0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53, -0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x30,0x1e,0x17,0x0d,0x31,0x38,0x30,0x37,0x31,0x32,0x32,0x30,0x30,0x38,0x34,0x38,0x5a,0x17,0x0d,0x31,0x39,0x30,0x37,0x32,0x36,0x32,0x30,0x30,0x38,0x34,0x38,0x5a,0x30,0x74,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13, -0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72, -0x61,0x74,0x69,0x6f,0x6e,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x03,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01, -0x0a,0x02,0x82,0x01,0x01,0x00,0xd1,0x94,0x76,0x36,0xe6,0x86,0xab,0x36,0xfe,0x69,0xf9,0x46,0x7c,0x8b,0x88,0x50,0xcb,0x90,0x70,0x7f,0xb0,0x55,0xa9,0x24,0x1d,0x7e,0x39,0xe7,0x05,0x9f,0x0f,0xac,0x7b,0x97,0xb2,0xce,0x73,0x0a,0xfb,0xd4,0x9b,0x24,0x5c,0x16,0xb5,0x39,0xdd,0x1b,0x7e,0x33,0x6c,0x11,0xfc,0x3b,0x26,0xf3,0x98,0xaa, -0x5d,0x53,0x6b,0xaa,0xc3,0xec,0x13,0xb8,0xd2,0xef,0xcf,0x57,0x7f,0xcc,0x65,0xcb,0xaf,0x4d,0x2e,0x32,0xb1,0x56,0x2b,0x4e,0x34,0x07,0x89,0xfe,0x69,0x21,0xbd,0x3e,0x44,0xfb,0xde,0x12,0x9d,0x85,0xbf,0x7c,0x76,0x86,0x7d,0x72,0xb1,0x76,0x9b,0x61,0xe6,0x8a,0x64,0x4c,0x46,0xce,0xb6,0xd5,0x3a,0x8c,0x77,0x93,0x77,0x67,0x21,0x9c, -0xb6,0x5a,0x06,0x5e,0x47,0x86,0xf5,0x3c,0xd1,0x09,0xca,0x0d,0x3d,0xcd,0xb2,0xe9,0xa1,0x50,0x78,0xd1,0x84,0x88,0xe2,0x01,0x3c,0x22,0xfc,0xaf,0x96,0x08,0xcc,0x5d,0x99,0xc0,0xed,0xeb,0xa5,0x5a,0x98,0x92,0xf5,0xc8,0x40,0x4e,0x6a,0x73,0xaf,0xde,0xe3,0x74,0x7a,0xd3,0x5f,0x46,0x97,0xbc,0xe2,0x67,0x28,0x77,0x99,0xac,0xc1,0x0e, -0x31,0x16,0x8f,0x00,0x0f,0x01,0xfe,0x4b,0x5e,0x54,0x0f,0xca,0xc4,0x65,0x3f,0x0a,0xe3,0xa3,0x46,0xdb,0xf6,0x2c,0x03,0x3a,0x19,0xbe,0x68,0x05,0x16,0x9c,0xe6,0x7f,0x34,0xbf,0xa7,0x87,0x8d,0x65,0x39,0x26,0xc9,0x63,0xd4,0xef,0xc5,0xdd,0xbd,0x25,0xfe,0xfd,0x28,0xf4,0x34,0x86,0x79,0xac,0x2a,0xd5,0x5f,0x30,0x91,0x3b,0xe4,0x14, -0x6a,0xeb,0xb1,0xca,0x04,0x23,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x7e,0x30,0x82,0x01,0x7a,0x30,0x1f,0x06,0x03,0x55,0x1d,0x25,0x04,0x18,0x30,0x16,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x4c,0x08,0x01,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x47, -0xbe,0xc0,0xcb,0xe1,0xa6,0x3f,0xfd,0x65,0xd6,0x38,0xf2,0x03,0x5d,0xb7,0xaf,0x77,0xf7,0x40,0xff,0x30,0x50,0x06,0x03,0x55,0x1d,0x11,0x04,0x49,0x30,0x47,0xa4,0x45,0x30,0x43,0x31,0x29,0x30,0x27,0x06,0x03,0x55,0x04,0x0b,0x13,0x20,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e, -0x73,0x20,0x50,0x75,0x65,0x72,0x74,0x6f,0x20,0x52,0x69,0x63,0x6f,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x05,0x13,0x0d,0x32,0x33,0x30,0x30,0x31,0x32,0x2b,0x34,0x33,0x37,0x39,0x36,0x35,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x48,0x6e,0x64,0xe5,0x50,0x05,0xd3,0x82,0xaa,0x17,0x37,0x37,0x22,0xb5, -0x6d,0xa8,0xca,0x75,0x02,0x95,0x30,0x54,0x06,0x03,0x55,0x1d,0x1f,0x04,0x4d,0x30,0x4b,0x30,0x49,0xa0,0x47,0xa0,0x45,0x86,0x43,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x63,0x72,0x6c,0x2f,0x4d,0x69,0x63, -0x43,0x6f,0x64,0x53,0x69,0x67,0x50,0x43,0x41,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x2d,0x30,0x37,0x2d,0x30,0x38,0x2e,0x63,0x72,0x6c,0x30,0x61,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x55,0x30,0x53,0x30,0x51,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f, -0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x43,0x6f,0x64,0x53,0x69,0x67,0x50,0x43,0x41,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x2d,0x30,0x37,0x2d,0x30,0x38,0x2e,0x63,0x72,0x74,0x30, -0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x9f,0xf5,0xc9,0x53,0x0d,0x3f,0x0d,0x26,0xec,0xa2,0x44,0xd8,0x0d,0xd1,0x9f,0x63,0x96,0x06,0x4b,0x3f,0x1e,0x5c,0xc5,0x33,0xa3,0xa4,0xc3,0x6c,0xaf,0x1f,0xc0, -0x01,0xba,0xeb,0x65,0xec,0x9e,0x33,0x10,0x0f,0xa7,0xac,0x5b,0xd4,0xbd,0x90,0x61,0x17,0xe7,0x31,0xe7,0xc3,0x26,0xb4,0xac,0xf5,0x27,0xd3,0x48,0x93,0x86,0x88,0xfe,0x12,0x35,0x91,0x64,0x22,0xd1,0x6b,0x2d,0x3b,0xa8,0x2c,0x15,0x94,0x29,0xd2,0x37,0x96,0xe6,0x35,0xff,0x0c,0xce,0xc8,0x06,0x16,0x16,0x9e,0x24,0xb1,0xe2,0x39,0xf9, -0x6e,0x0e,0x78,0xd8,0x0c,0x1b,0xb6,0x29,0x60,0x27,0x76,0x34,0x24,0x9b,0xdd,0xb9,0x97,0x75,0xcb,0x01,0x3b,0xad,0x82,0x12,0x16,0x22,0x80,0x89,0x15,0x84,0xbb,0x98,0x50,0x20,0xb0,0x17,0x26,0x86,0x49,0xaf,0xce,0x7d,0x45,0x15,0x43,0x34,0x96,0xcf,0x81,0x5c,0x18,0x2c,0xd4,0x93,0xf2,0x67,0xab,0xe2,0x73,0xc8,0x3d,0xa3,0xcd,0xfc, -0x32,0x1e,0x60,0x1c,0xe9,0xb0,0x1b,0x30,0xfb,0x2c,0xbb,0x07,0x2e,0x96,0x84,0x93,0x45,0x28,0x54,0x5c,0xcd,0x96,0xfd,0xa0,0xdb,0x81,0xd8,0xb6,0x30,0xca,0x43,0xb1,0xf3,0x48,0xc0,0xb2,0x46,0x1c,0x5d,0x5e,0x76,0x2a,0x58,0x9f,0xd4,0xee,0xf2,0xf4,0xfa,0x48,0x4c,0xb5,0x61,0x8b,0xb0,0x8c,0x41,0xe9,0xaa,0xb8,0x9d,0x90,0xf4,0xff, -0x6a,0x42,0x0f,0xb9,0x3e,0xe9,0x0e,0xec,0x94,0xfc,0x8d,0x80,0xbb,0x78,0xe3,0x23,0xa7,0x78,0x5b,0xb2,0x6d,0x1f,0xf9,0x59,0xc1,0x7d,0xb6,0xd1,0x39,0xc9,0x79,0xe0,0x83,0x1c,0x60,0x0a,0xda,0x3d,0xb0,0xd1,0xed,0x36,0xbf,0x45,0x07,0xe9,0x1b,0x36,0x6e,0xe5,0x3d,0x3b,0x05,0x03,0xa7,0xd4,0xa7,0x25,0x12,0x8f,0xe6,0x76,0xa3,0x13, -0xb3,0x45,0x5a,0x43,0x31,0x82,0xda,0xd8,0x84,0xae,0xb9,0xb0,0x1f,0x75,0xf5,0xf6,0x1d,0x7d,0x51,0x11,0x37,0x27,0xe8,0xb5,0x35,0x84,0x71,0xf7,0x57,0xaa,0xae,0xfa,0x89,0x71,0xc9,0x98,0xd2,0x9e,0x5a,0x64,0x76,0xbe,0x8c,0xc3,0x7d,0x15,0x6a,0x91,0xf1,0x14,0xf4,0xf2,0xd9,0x35,0x31,0xb8,0xdb,0x72,0xfa,0xb4,0x75,0xc8,0x88,0x9b, -0x6a,0xbf,0x98,0x45,0xc7,0x66,0xb2,0xd7,0xff,0xce,0x92,0x90,0x75,0xe4,0xeb,0xe6,0x86,0xd2,0xc8,0x1b,0xdb,0x27,0xc0,0x5b,0x95,0x6f,0x49,0x6f,0x58,0x5d,0x69,0x2a,0xde,0x53,0x4b,0xf8,0xe8,0xca,0x7b,0xf6,0x6c,0x15,0xf9,0x03,0x19,0x0f,0x11,0x85,0xaa,0x4f,0x9a,0xbf,0xaa,0x57,0xdd,0x60,0xc6,0xf5,0x71,0x20,0xf4,0x51,0xa8,0x9a, -0xca,0xe9,0xd1,0xeb,0x34,0x47,0x3d,0x75,0xfa,0x22,0xec,0x55,0x3f,0x6a,0x19,0x39,0x6b,0x10,0xe9,0x5a,0x3f,0x8e,0xf4,0x23,0x78,0x30,0xb2,0xf2,0xa6,0x38,0xcb,0x35,0x8d,0xaa,0x98,0x59,0x24,0x40,0xb8,0x3a,0x67,0xa4,0x07,0x5f,0xa0,0xfe,0xd8,0x3b,0x49,0x13,0xfb,0x0c,0xe1,0xed,0x0b,0x6d,0x83,0x50,0xce,0xf0,0x7f,0x3e,0xe0,0xd9, -0x08,0xe8,0x8c,0x21,0x4a,0x41,0xc2,0xde,0xeb,0x8e,0x5b,0xee,0x03,0xc3,0x1d,0x6e,0x6e,0xe6,0x54,0x35,0x66,0x67,0x72,0x7c,0x1a,0xea,0x52,0xf6,0x22,0xc4,0x72,0x3f,0xae,0x30,0x82,0x07,0x7a,0x30,0x82,0x05,0x62,0xa0,0x03,0x02,0x01,0x02,0x02,0x0a,0x61,0x0e,0x90,0xd2,0x00,0x00,0x00,0x00,0x00,0x03,0x30,0x0d,0x06,0x09,0x2a,0x86, -0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81,0x88,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64, -0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66, -0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x32,0x30,0x31,0x31,0x30,0x1e,0x17,0x0d,0x31,0x31,0x30,0x37,0x30,0x38,0x32,0x30,0x35,0x39,0x30,0x39,0x5a,0x17,0x0d,0x32,0x36,0x30,0x37,0x30,0x38,0x32,0x31,0x30,0x39,0x30,0x39,0x5a,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13, -0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43, -0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x30,0x82,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86, -0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0f,0x00,0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0xab,0xf0,0xfa,0x72,0x10,0x1c,0x2e,0xad,0xd8,0x6e,0xaa,0x82,0x10,0x4d,0x34,0xba,0xf2,0xb6,0x58,0x21,0x9f,0x42,0x1b,0x2a,0x6b,0xe9,0x5a,0x50,0xaa,0xb8,0x06,0x38,0x1a,0x04,0x49,0xba,0x7f,0xc3,0x0c,0x1e,0xdd,0x37,0x6b, -0xc6,0x12,0xd8,0x0b,0xf0,0x38,0xc2,0x99,0x06,0xb0,0xc8,0x39,0xd5,0x01,0x14,0x31,0x42,0xd3,0x89,0x0d,0x79,0x64,0x87,0x7e,0x94,0x60,0x24,0x6c,0xaf,0x9e,0x49,0x9c,0xe9,0x68,0x5e,0xd2,0xdf,0x9b,0x53,0xb2,0x0a,0x2c,0xc3,0xaf,0xd9,0xa9,0x2b,0xae,0x7a,0x09,0xaf,0xd7,0x96,0x59,0xca,0x60,0x1a,0x05,0xe9,0x66,0x76,0xe8,0x32,0x52, -0x26,0x12,0x2f,0xe7,0xab,0x08,0x50,0xcf,0xb3,0x44,0xb7,0x5d,0xd8,0xc4,0x2e,0x03,0x75,0xab,0x68,0xf3,0xcb,0x6d,0xf3,0x3a,0x5c,0xa1,0x16,0xf4,0x46,0xba,0xe0,0x38,0x64,0xac,0x6e,0x64,0x35,0x78,0xa6,0xa0,0x63,0x0f,0x2d,0xd3,0x40,0x93,0xf8,0xe3,0xde,0x07,0x0d,0xd5,0x5c,0x79,0xa5,0x49,0x29,0xe7,0x0d,0xbe,0xa0,0x13,0x77,0xbe, -0x94,0x3d,0xef,0xfb,0xe3,0x2b,0x5a,0x10,0x1f,0x4d,0x56,0x28,0xa2,0x7a,0x72,0xe0,0x12,0x3a,0xb7,0x49,0x5e,0xd8,0xed,0xed,0x43,0x91,0x83,0xd9,0x7b,0xb2,0x7b,0x86,0x1b,0xd9,0x3e,0xb1,0x8c,0x5d,0xe8,0x89,0x4f,0x84,0x1a,0xf2,0xa1,0x2f,0x59,0xe4,0x90,0x3b,0x2d,0xae,0x33,0x58,0xc5,0xb7,0x3e,0xfe,0x32,0xd3,0xb3,0x03,0x3d,0xb1, -0xb2,0xaf,0x92,0x38,0x7e,0xd2,0x9d,0x80,0x2c,0xf5,0x4e,0x56,0x91,0x21,0x35,0x25,0xc3,0x39,0x6e,0x64,0x7f,0x53,0xba,0x9c,0x0f,0xad,0x19,0x23,0x84,0xcb,0xf4,0xba,0x03,0x86,0x8d,0xf7,0x5f,0xf0,0xd0,0x52,0xbf,0x8c,0x94,0x87,0xbc,0xc0,0x21,0x74,0x25,0x5f,0x18,0x28,0xb6,0xcc,0x27,0x28,0x38,0x25,0x98,0x39,0x4a,0x36,0xcf,0x7c, -0xb1,0x92,0xae,0x1c,0x23,0xa7,0xa9,0x66,0xec,0x61,0x1f,0x6a,0xe1,0x28,0x49,0x9d,0x5f,0x88,0xe2,0x25,0x5d,0xd3,0x21,0x4b,0x3e,0x52,0xc4,0xb5,0x57,0x3f,0x24,0x03,0xf0,0xd1,0x7a,0x5b,0x2f,0xd5,0x23,0xe3,0x70,0x5d,0x0f,0x51,0x46,0x77,0xb3,0xf8,0x00,0xe1,0xbc,0xac,0x02,0x82,0x5f,0xdb,0xc0,0x15,0xb3,0xbd,0x1b,0xd4,0x55,0x4b, -0xe7,0x39,0xa1,0x0f,0xe9,0x23,0x49,0xbc,0x18,0xb8,0x44,0x7c,0x45,0xe4,0xc1,0xc3,0x72,0x7a,0xe0,0x72,0xe7,0x24,0xdf,0xbf,0x46,0x99,0xc5,0xef,0xc2,0x1c,0x57,0xdb,0x83,0x8d,0xec,0x4d,0x49,0x30,0xa7,0xab,0x8e,0xdf,0xec,0x5b,0x9f,0xaf,0xfc,0xdd,0xb0,0x66,0xe2,0xc1,0x97,0x81,0x7b,0xed,0xd6,0xed,0x4b,0xe7,0x49,0x29,0xa7,0x13, -0x28,0xa6,0xa7,0x7d,0x67,0x80,0xe6,0x8a,0x62,0x78,0x5f,0xb2,0x2f,0x84,0xd7,0x57,0x9c,0x5c,0xbf,0x77,0x28,0x28,0xf1,0xed,0x6d,0xc3,0x28,0x8f,0x2c,0x8f,0x40,0x37,0x4f,0xc1,0xe1,0x85,0x44,0x89,0xc4,0x09,0x4c,0xc5,0xd4,0xa5,0x43,0x2f,0x74,0x95,0xf7,0x6e,0xf8,0x78,0x20,0x58,0x2c,0x13,0x5d,0x60,0x95,0x9a,0x3e,0x4f,0x33,0x84, -0xda,0xb0,0x88,0x17,0xde,0x9e,0x4e,0xf4,0x96,0xb0,0xbc,0x46,0xa0,0x6c,0x98,0xd2,0xe0,0xd6,0x88,0x8c,0x0b,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0xed,0x30,0x82,0x01,0xe9,0x30,0x10,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x48, -0x6e,0x64,0xe5,0x50,0x05,0xd3,0x82,0xaa,0x17,0x37,0x37,0x22,0xb5,0x6d,0xa8,0xca,0x75,0x02,0x95,0x30,0x19,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04,0x0c,0x1e,0x0a,0x00,0x53,0x00,0x75,0x00,0x62,0x00,0x43,0x00,0x41,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f,0x06,0x03,0x55, -0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x72,0x2d,0x3a,0x02,0x31,0x90,0x43,0xb9,0x14,0x05,0x4e,0xe1,0xea,0xa7,0xc7,0x31,0xd1,0x23,0x89,0x34,0x30,0x5a,0x06,0x03,0x55,0x1d,0x1f,0x04,0x53,0x30,0x51,0x30,0x4f,0xa0,0x4d,0xa0,0x4b,0x86,0x49, -0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x5f, -0x30,0x33,0x5f,0x32,0x32,0x2e,0x63,0x72,0x6c,0x30,0x5e,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x52,0x30,0x50,0x30,0x4e,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x42,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f, -0x70,0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x5f,0x30,0x33,0x5f,0x32,0x32,0x2e,0x63,0x72,0x74,0x30,0x81,0x9f,0x06,0x03,0x55,0x1d,0x20,0x04,0x81,0x97,0x30,0x81,0x94,0x30,0x81,0x91,0x06,0x09,0x2b,0x06,0x01,0x04, -0x01,0x82,0x37,0x2e,0x03,0x30,0x81,0x83,0x30,0x3f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x33,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x64,0x6f,0x63,0x73,0x2f,0x70,0x72,0x69,0x6d,0x61, -0x72,0x79,0x63,0x70,0x73,0x2e,0x68,0x74,0x6d,0x30,0x40,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x34,0x1e,0x32,0x20,0x1d,0x00,0x4c,0x00,0x65,0x00,0x67,0x00,0x61,0x00,0x6c,0x00,0x5f,0x00,0x70,0x00,0x6f,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x79,0x00,0x5f,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x65,0x00, -0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x20,0x1d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x67,0xf2,0x86,0xa5,0x98,0xe0,0x54,0x79,0x1a,0x2e,0xd3,0xd8,0x74,0x67,0x22,0x9b,0x0b,0x96,0x11,0xe1,0x63,0x92,0x99,0x42,0x96,0x7d,0xd2,0x79,0x0c,0x90,0xc1,0x65,0x5f, -0x2e,0x2c,0x3e,0xf8,0xc3,0x72,0xd1,0x6d,0x83,0xfe,0xbe,0x3f,0xe8,0x0a,0xca,0x3b,0xbf,0x47,0xa9,0xa3,0xf3,0x69,0xdb,0x63,0xbf,0x22,0x35,0xa5,0x97,0x5d,0x65,0x84,0x90,0x7d,0x8b,0x46,0x50,0x55,0xd8,0x0c,0x92,0x7c,0xd2,0x1a,0x4b,0x1c,0xf3,0x3c,0x42,0x8b,0x52,0xd0,0xb0,0xfd,0x6b,0xe3,0x3e,0x07,0x2e,0x29,0x9b,0xe6,0x3d,0x1b, -0xa5,0xd4,0xb5,0x1d,0x77,0x94,0x39,0xe2,0xe9,0x64,0xc9,0x44,0x3d,0x78,0x7a,0x23,0xf3,0x13,0x7d,0xa6,0x90,0x74,0x83,0x8d,0xf4,0xcb,0x26,0x02,0x46,0x2a,0xc2,0x8a,0x10,0xbb,0xa4,0xa9,0x05,0x0c,0x9b,0xed,0x68,0xfa,0x68,0x2e,0x95,0xa0,0x2a,0x3f,0x2a,0x6b,0x58,0x49,0x63,0x1f,0x09,0x69,0x6e,0x5a,0x98,0x96,0xe4,0x83,0xf4,0xc0, -0x8f,0xf3,0x46,0x2b,0xde,0xfc,0x3b,0xd0,0xbd,0x35,0xef,0x6e,0x25,0xae,0xe5,0xaf,0x27,0xed,0xd0,0xdd,0xf3,0x0e,0xaf,0x99,0x28,0x97,0x98,0x4d,0x0e,0x3d,0x0b,0xf2,0x08,0x89,0xd6,0x1f,0xc3,0x32,0x18,0xe2,0xf0,0xc5,0x2d,0xce,0x5b,0x9e,0xb4,0x49,0x39,0x0a,0xc6,0x0a,0xc2,0xc6,0xad,0xae,0xe5,0xb2,0xd9,0xdb,0x15,0x88,0x51,0x45, -0x58,0x38,0x32,0x71,0x27,0x1a,0x7f,0xb1,0xf4,0x27,0xf8,0xde,0x2c,0x3a,0x20,0x69,0x98,0xb2,0x59,0x89,0x68,0x6e,0x6f,0xa7,0xb7,0x74,0xc3,0x40,0x05,0x06,0xa6,0x01,0x2a,0x28,0x3e,0x82,0x3f,0x13,0x4d,0x66,0x0b,0xc0,0xb3,0x4d,0xf5,0xe1,0x8f,0x7f,0x1c,0x6f,0x15,0x7d,0x45,0xa7,0x76,0xe5,0x40,0x2a,0x65,0xa3,0xc3,0x5d,0x52,0x62, -0x86,0xc3,0x1d,0x63,0x36,0x97,0x86,0xdf,0xda,0xf3,0xf8,0xf2,0x16,0xa1,0x9a,0x27,0xe1,0xcd,0xa5,0x97,0xd0,0xee,0x5d,0x63,0x41,0xe3,0x5b,0x07,0x9c,0x87,0x3e,0x06,0x77,0x06,0xd1,0x06,0xb1,0x75,0x1f,0x14,0xbe,0x61,0x61,0xb5,0xf0,0xdc,0xc6,0x1b,0x04,0xbe,0xdf,0x41,0xc7,0x0e,0x28,0xee,0xde,0x65,0x2f,0xec,0x97,0xf6,0xa1,0x5c, -0x96,0xd8,0x00,0xd6,0xa1,0x46,0xbd,0x59,0xf3,0x97,0xa5,0x09,0x4b,0x48,0x10,0x99,0x80,0x1f,0xd0,0x00,0x29,0xc5,0xb1,0x9b,0xa5,0x3f,0x45,0x77,0x1e,0x35,0xc6,0xd2,0xa2,0xa2,0x9f,0x7a,0x7a,0x22,0xfa,0x48,0x95,0x1f,0xab,0xfb,0x47,0x23,0x80,0xf5,0x9e,0xf8,0xbf,0x6b,0xb7,0x4b,0x97,0xe2,0xeb,0x75,0x78,0x1a,0xec,0xea,0x37,0x99, -0x79,0x18,0x4b,0xff,0xd6,0xb3,0x23,0x68,0x75,0xe6,0xaf,0xfa,0xfc,0x8b,0xeb,0x0b,0x80,0xea,0x69,0x3b,0xaf,0xfc,0x30,0xed,0x04,0x4c,0x8e,0xdf,0xdf,0x75,0x6d,0x63,0x91,0x3d,0xd1,0x9d,0x56,0x4e,0x4f,0xbf,0x80,0x57,0x22,0xa1,0x78,0x11,0x32,0x21,0x7a,0xef,0x41,0x0a,0xb1,0x3f,0xfb,0xa8,0xcc,0xa4,0x5d,0xc1,0xa1,0x88,0x9b,0x57, -0x71,0x56,0x4e,0x48,0x45,0xc0,0x42,0xc9,0x9b,0x76,0x5b,0x0a,0x80,0x48,0x6b,0xfd,0x79,0x9f,0xc1,0xbd,0x6d,0x6d,0x6a,0xc9,0x52,0x73,0x13,0x0d,0x7a,0x50,0xcd,0x31,0x82,0x15,0x5b,0x30,0x82,0x15,0x57,0x02,0x01,0x01,0x30,0x81,0x95,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11, -0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74, -0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x02,0x13,0x33,0x00,0x00,0x01,0x03,0x5e,0x25,0x1c,0x99,0x1f,0xa3,0x1e,0xb8,0x00,0x00,0x00,0x00, -0x01,0x03,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x81,0xae,0x30,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0x30,0x1c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0b,0x31,0x0e,0x30, -0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x15,0x30,0x2f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xef,0x1c,0x60,0x9d,0x4d,0xa4,0xea,0x66,0x76,0x09,0x51,0xf4,0xba,0x29,0x24,0x71,0xc9,0x1d,0x9e,0x20,0xa1,0x48,0x83,0xb3,0x95,0xb6,0x32,0x21,0x3f,0xc2,0xe1,0x1b,0x30,0x42, -0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0c,0x31,0x34,0x30,0x32,0xa0,0x14,0x80,0x12,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0xa1,0x1a,0x80,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63, -0x6f,0x6d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x01,0x00,0x40,0xe0,0xd2,0x89,0x67,0x1e,0x8d,0xfc,0xdd,0x9c,0xd3,0x57,0x55,0xe8,0x1f,0x88,0x8d,0x5a,0xb1,0x90,0xf0,0xfa,0xb0,0x85,0xec,0xba,0xfa,0x6d,0x70,0xfa,0xab,0x25,0x02,0xe2,0x31,0xef,0xa5,0xfb,0xb2,0x85,0x7a,0xf7,0x50, -0xcf,0x79,0xff,0xf4,0x16,0x03,0x5f,0x86,0xa6,0xde,0xda,0x4a,0xfc,0x47,0xdd,0x21,0x41,0x45,0xda,0xcd,0x3b,0xe9,0xf3,0xf1,0xe6,0xd3,0xf8,0x9b,0xd8,0x83,0xcb,0x5f,0x4e,0x07,0x80,0x70,0x2a,0xc3,0x57,0x1e,0xa3,0x72,0xf3,0xe7,0xc7,0x90,0xd3,0x53,0xc7,0x44,0x76,0xd6,0xff,0xeb,0x2e,0x62,0xf4,0x1b,0xe2,0x09,0x62,0x8f,0x0a,0x08, -0x1b,0xc9,0xc5,0x1a,0xe0,0xd3,0x20,0x65,0x22,0x84,0xc1,0x58,0x73,0xa8,0x05,0x4c,0x6c,0x2a,0xee,0x5c,0x61,0x76,0x16,0x53,0x2b,0xf2,0x1a,0xb3,0xdb,0x8c,0xd7,0x39,0x03,0x3d,0x4c,0xf6,0xbd,0x67,0x20,0x8e,0x69,0xf9,0x0e,0x50,0x18,0x08,0x70,0x7d,0x33,0xfb,0xff,0x2e,0x5c,0x62,0x2d,0x6e,0xc6,0x3e,0x5e,0xf7,0x60,0x56,0x99,0xce, -0x52,0x94,0xce,0x2f,0xae,0xf8,0x50,0x19,0xe7,0x6e,0x6a,0x22,0x9b,0x27,0x70,0xfe,0xbe,0x79,0xdb,0x31,0x52,0x01,0x3f,0x4e,0xb4,0xcd,0xe8,0xf7,0x30,0xc2,0x61,0x02,0xc7,0x05,0x9b,0x0a,0x2f,0xe5,0xf5,0x0e,0x0c,0x9d,0xcb,0x2a,0xb0,0x79,0xac,0x96,0xf8,0x39,0xf0,0xb4,0xe5,0x67,0x7f,0x94,0x8a,0xac,0x77,0x9a,0xc9,0x38,0xb9,0x93, -0xed,0xf5,0x33,0xc2,0x44,0x82,0x81,0x5d,0xab,0x33,0x75,0xd2,0x6e,0x43,0xf4,0x03,0xf0,0x91,0x23,0x18,0xfb,0xa1,0x82,0x12,0xe5,0x30,0x82,0x12,0xe1,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x03,0x03,0x01,0x31,0x82,0x12,0xd1,0x30,0x82,0x12,0xcd,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x12,0xbe, -0x30,0x82,0x12,0xba,0x02,0x01,0x03,0x31,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x82,0x01,0x51,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x01,0x04,0xa0,0x82,0x01,0x40,0x04,0x82,0x01,0x3c,0x30,0x82,0x01,0x38,0x02,0x01,0x01,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84, -0x59,0x0a,0x03,0x01,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,0x4d,0xd8,0x6e,0x4d,0x11,0x8e,0x9b,0xbb,0x96,0x9d,0x1d,0x2e,0x32,0x48,0x7c,0xb0,0xde,0x56,0x6c,0xeb,0x7e,0x1c,0xe6,0x73,0xbc,0xa1,0x52,0xc7,0xa9,0xdb,0x41,0x31,0x02,0x06,0x5c,0x3d,0xd3,0x10,0xa8,0xe5,0x18, -0x13,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x34,0x31,0x38,0x34,0x30,0x33,0x36,0x2e,0x37,0x34,0x35,0x5a,0x30,0x04,0x80,0x02,0x01,0xf4,0xa0,0x81,0xd0,0xa4,0x81,0xcd,0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69, -0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b, -0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54,0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37, -0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0xa0,0x82,0x0e,0x3c,0x30,0x82,0x04,0xf1,0x30,0x82,0x03,0xd9,0xa0,0x03,0x02,0x01,0x02,0x02,0x13, -0x33,0x00,0x00,0x00,0xee,0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c,0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68, -0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04, -0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x1e,0x17,0x0d,0x31,0x38,0x31,0x30,0x32,0x34,0x32,0x31,0x31,0x34,0x31,0x35,0x5a,0x17,0x0d,0x32,0x30,0x30,0x31,0x31,0x30,0x32,0x31,0x31,0x34,0x31,0x35,0x5a, -0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a, -0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26, -0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54,0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37,0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d, -0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xa3,0xf7,0x56,0x35,0x84,0xf3,0xdd,0x34,0xe4,0xa3,0x93,0x48,0x65,0xb2,0x92,0x69,0xb8,0xa1, -0x51,0xc2,0xfb,0x51,0x1e,0x08,0xbe,0xa5,0x84,0xaf,0xf3,0x48,0x46,0x9b,0x6c,0x0c,0xdc,0x8f,0xc3,0x82,0x4b,0x12,0x11,0xb1,0x11,0x5c,0xff,0x22,0xb3,0x3e,0xc2,0xde,0xb7,0xda,0xac,0x93,0x45,0x91,0xf4,0x8a,0xff,0x12,0x16,0x6f,0xd2,0x2d,0x4f,0xc8,0x20,0x76,0x05,0x21,0x37,0x4b,0x9f,0xd4,0xfd,0x57,0x7e,0xa9,0xf4,0x91,0x21,0xa6, -0xb9,0x8c,0x69,0xbf,0xe9,0x21,0xb8,0x98,0x0c,0x20,0xb7,0x5b,0xb4,0xc5,0xbf,0x4f,0xc3,0x6c,0x74,0x86,0x8d,0x10,0xfc,0x68,0xfe,0x8d,0x0c,0x85,0x64,0x5b,0xf0,0x23,0x2d,0xda,0x24,0x0b,0x0c,0x50,0xb4,0x8c,0x8f,0x67,0x02,0x0d,0x97,0x37,0xb4,0x1f,0x1d,0xaf,0x8b,0xcd,0xd5,0x87,0x8c,0x1e,0x70,0xd3,0xee,0xdf,0x22,0xc9,0xfe,0x54, -0xac,0x57,0xf4,0xbe,0xcd,0x55,0x12,0xfb,0x9b,0xa0,0x29,0xe1,0xcb,0x56,0x02,0x2e,0x4d,0xcb,0x72,0x2a,0xbf,0x4c,0x8c,0x14,0x9a,0x84,0x2a,0x25,0xdf,0x11,0xce,0x80,0x81,0xea,0x15,0x60,0x62,0x57,0xa2,0x0e,0x1a,0x09,0x74,0xa5,0x18,0xad,0xe9,0x9a,0x88,0x56,0x2c,0xcd,0xaf,0xd2,0x69,0x5d,0x2f,0xf1,0x88,0x1a,0x96,0x11,0x38,0x51, -0x0e,0x97,0xbd,0xdd,0x6c,0x11,0x52,0xe8,0x32,0xa5,0x95,0x17,0xa4,0x27,0x49,0xa9,0x7e,0x38,0x1a,0x84,0x1d,0xe8,0xe5,0xe7,0xcd,0x9f,0x6c,0x9c,0x2f,0x44,0x65,0x13,0x5d,0x89,0x5a,0x80,0x3d,0x3c,0x5a,0x37,0x7e,0xfd,0x5f,0xc6,0xab,0x2d,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x1b,0x30,0x82,0x01,0x17,0x30,0x1d,0x06,0x03,0x55, -0x1d,0x0e,0x04,0x16,0x04,0x14,0x26,0x77,0xcd,0x38,0x2b,0x45,0x7e,0xbd,0xd3,0x33,0x65,0x28,0xf7,0xcf,0xe3,0x68,0xf2,0x0e,0x65,0x4d,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xd5,0x63,0x3a,0x5c,0x8a,0x31,0x90,0xf3,0x43,0x7b,0x7c,0x46,0x1b,0xc5,0x33,0x68,0x5a,0x85,0x6d,0x55,0x30,0x56,0x06,0x03,0x55, -0x1d,0x1f,0x04,0x4f,0x30,0x4d,0x30,0x4b,0xa0,0x49,0xa0,0x47,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x54,0x69,0x6d,0x53,0x74, -0x61,0x50,0x43,0x41,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x37,0x2d,0x30,0x31,0x2e,0x63,0x72,0x6c,0x30,0x5a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x4e,0x30,0x4c,0x30,0x4a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72, -0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x54,0x69,0x6d,0x53,0x74,0x61,0x50,0x43,0x41,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x37,0x2d,0x30,0x31,0x2e,0x63,0x72,0x74,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x13,0x06, -0x03,0x55,0x1d,0x25,0x04,0x0c,0x30,0x0a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x08,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x91,0x3f,0xe2,0xd1,0x15,0x1b,0x20,0x21,0x1c,0xf2,0x7b,0xbc,0xe4,0x9b,0x59,0x03,0xdf,0x8c,0x9a,0x5c,0x62,0xc4,0x1e,0xc1,0xc5,0xd3, -0x4e,0x96,0x21,0x60,0xf5,0x03,0xe5,0xcf,0x83,0x98,0x94,0x27,0x4d,0x5d,0xf8,0x1a,0x4e,0xec,0xa4,0x59,0xe3,0x23,0x87,0x2c,0x2c,0xc8,0x72,0xf8,0xc4,0x26,0xc3,0x73,0x06,0x5a,0xa7,0xff,0xed,0xfe,0xee,0xa1,0x8a,0x27,0xc5,0x65,0x68,0xc8,0xf6,0x16,0x8f,0x5a,0x4e,0x72,0xe5,0x37,0xf1,0x91,0x81,0xfc,0x18,0xe4,0x6e,0x2c,0xcd,0x94, -0x99,0xb5,0xda,0x60,0xa0,0x60,0x5f,0x76,0x3c,0x64,0x46,0x45,0xff,0x19,0x16,0x0c,0x40,0x25,0x7f,0x67,0xbb,0x2f,0x3a,0xfc,0x1f,0xbf,0x18,0x6c,0x68,0x90,0x8c,0xad,0x9a,0x23,0x6f,0xfd,0xa9,0xa6,0x3e,0x29,0xb2,0x57,0x1e,0xaa,0x83,0x8c,0xa3,0x1a,0xb5,0x95,0xe3,0xd7,0x0b,0x78,0xc9,0xa4,0xd1,0x0b,0x1c,0xbb,0xcd,0xc5,0xcf,0xe3, -0x13,0x45,0x57,0x43,0x0f,0x1f,0xc1,0x17,0x86,0x26,0x71,0x2f,0xad,0x27,0x6e,0x11,0xf3,0xa6,0xb3,0x72,0x5d,0x90,0xa3,0xdd,0xa0,0x2b,0x74,0x87,0xf7,0x77,0x26,0xd9,0x06,0x8f,0x5f,0x4d,0xfd,0x1e,0x0f,0x7b,0x0c,0x34,0xf0,0x25,0x54,0x21,0xe4,0x6e,0x4b,0x1f,0xab,0x7d,0x9d,0x9a,0x01,0x80,0x02,0xdf,0xf6,0xa9,0xa6,0x19,0xf9,0x24, -0xd2,0xa8,0x14,0x2e,0x38,0xfa,0x21,0x59,0x33,0xfe,0x9b,0x67,0xca,0x10,0x77,0x4f,0x66,0x4e,0x7c,0x97,0xb7,0x04,0x5a,0xa5,0x04,0xb3,0x56,0x39,0xb6,0x2f,0x54,0x21,0xe2,0x5c,0xc5,0x01,0xa8,0x46,0x30,0x82,0x06,0x71,0x30,0x82,0x04,0x59,0xa0,0x03,0x02,0x01,0x02,0x02,0x0a,0x61,0x09,0x81,0x2a,0x00,0x00,0x00,0x00,0x00,0x02,0x30, -0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81,0x88,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65, -0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43, -0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x32,0x30,0x31,0x30,0x30,0x1e,0x17,0x0d,0x31,0x30,0x30,0x37,0x30,0x31,0x32,0x31,0x33,0x36,0x35,0x35,0x5a,0x17,0x0d,0x32,0x35,0x30,0x37,0x30,0x31,0x32,0x31,0x34,0x36,0x35,0x35,0x5a,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06, -0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73, -0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a, -0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xa9,0x1d,0x0d,0xbc,0x77,0x11,0x8a,0x3a,0x20,0xec,0xfc,0x13,0x97,0xf5,0xfa,0x7f,0x69,0x94,0x6b,0x74,0x54,0x10,0xd5,0xa5,0x0a,0x00,0x82,0x85,0xfb,0xed,0x7c,0x68,0x4b,0x2c,0x5f,0xc5,0xc3,0xe5,0x61,0xc2, -0x76,0xb7,0x3e,0x66,0x2b,0x5b,0xf0,0x15,0x53,0x27,0x04,0x31,0x1f,0x41,0x1b,0x1a,0x95,0x1d,0xce,0x09,0x13,0x8e,0x7c,0x61,0x30,0x59,0xb1,0x30,0x44,0x0f,0xf1,0x60,0x88,0x84,0x54,0x43,0x0c,0xd7,0x4d,0xb8,0x38,0x08,0xb3,0x42,0xdd,0x93,0xac,0xd6,0x73,0x30,0x57,0x26,0x82,0xa3,0x45,0x0d,0xd0,0xea,0xf5,0x47,0x81,0xcd,0xbf,0x24, -0x60,0x32,0x58,0x60,0x46,0xf2,0x58,0x47,0x86,0x32,0x84,0x1e,0x74,0x61,0x67,0x91,0x5f,0x81,0x54,0xb1,0xcf,0x93,0x4c,0x92,0xc1,0xc4,0xa6,0x5d,0xd1,0x61,0x13,0x6e,0x28,0xc6,0x1a,0xf9,0x86,0x80,0xbb,0xdf,0x61,0xfc,0x46,0xc1,0x27,0x1d,0x24,0x67,0x12,0x72,0x1a,0x21,0x8a,0xaf,0x4b,0x64,0x89,0x50,0x62,0xb1,0x5d,0xfd,0x77,0x1f, -0x3d,0xf0,0x57,0x75,0xac,0xbd,0x8a,0x42,0x4d,0x40,0x51,0xd1,0x0f,0x9c,0x06,0x3e,0x67,0x7f,0xf5,0x66,0xc0,0x03,0x96,0x44,0x7e,0xef,0xd0,0x4b,0xfd,0x6e,0xe5,0x9a,0xca,0xb1,0xa8,0xf2,0x7a,0x2a,0x0a,0x31,0xf0,0xda,0x4e,0x06,0x91,0xb6,0x88,0x08,0x35,0xe8,0x78,0x1c,0xb0,0xe9,0x99,0xcd,0x3c,0xe7,0x2f,0x44,0xba,0xa7,0xf4,0xdc, -0x64,0xbd,0xa4,0x01,0xc1,0x20,0x09,0x93,0x78,0xcd,0xfc,0xbc,0xc0,0xc9,0x44,0x5d,0x5e,0x16,0x9c,0x01,0x05,0x4f,0x22,0x4d,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0xe6,0x30,0x82,0x01,0xe2,0x30,0x10,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16, -0x04,0x14,0xd5,0x63,0x3a,0x5c,0x8a,0x31,0x90,0xf3,0x43,0x7b,0x7c,0x46,0x1b,0xc5,0x33,0x68,0x5a,0x85,0x6d,0x55,0x30,0x19,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04,0x0c,0x1e,0x0a,0x00,0x53,0x00,0x75,0x00,0x62,0x00,0x43,0x00,0x41,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f, -0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xd5,0xf6,0x56,0xcb,0x8f,0xe8,0xa2,0x5c,0x62,0x68,0xd1,0x3d,0x94,0x90,0x5b,0xd7,0xce,0x9a,0x18,0xc4,0x30,0x56,0x06,0x03,0x55,0x1d,0x1f,0x04,0x4f,0x30,0x4d,0x30,0x4b,0xa0,0x49,0xa0, -0x47,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30, -0x36,0x2d,0x32,0x33,0x2e,0x63,0x72,0x6c,0x30,0x5a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x4e,0x30,0x4c,0x30,0x4a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70, -0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x36,0x2d,0x32,0x33,0x2e,0x63,0x72,0x74,0x30,0x81,0xa0,0x06,0x03,0x55,0x1d,0x20,0x01,0x01,0xff,0x04,0x81,0x95,0x30,0x81,0x92,0x30,0x81,0x8f,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82, -0x37,0x2e,0x03,0x30,0x81,0x81,0x30,0x3d,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x31,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x50,0x4b,0x49,0x2f,0x64,0x6f,0x63,0x73,0x2f,0x43,0x50,0x53,0x2f,0x64,0x65,0x66,0x61,0x75,0x6c, -0x74,0x2e,0x68,0x74,0x6d,0x30,0x40,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x34,0x1e,0x32,0x20,0x1d,0x00,0x4c,0x00,0x65,0x00,0x67,0x00,0x61,0x00,0x6c,0x00,0x5f,0x00,0x50,0x00,0x6f,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x79,0x00,0x5f,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x65,0x00, -0x6e,0x00,0x74,0x00,0x2e,0x20,0x1d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x07,0xe6,0x88,0x51,0x0d,0xe2,0xc6,0xe0,0x98,0x3f,0x81,0x71,0x03,0x3d,0x9d,0xa3,0xa1,0x21,0x6f,0xb3,0xeb,0xa6,0xcc,0xf5,0x31,0xbe,0xcf,0x05,0xe2,0xa9,0xfe,0xfa,0x57,0x6d,0x19,0x30,0xb3, -0xc2,0xc5,0x66,0xc9,0x6a,0xdf,0xf5,0xe7,0xf0,0x78,0xbd,0xc7,0xa8,0x9e,0x25,0xe3,0xf9,0xbc,0xed,0x6b,0x54,0x57,0x08,0x2b,0x51,0x82,0x44,0x12,0xfb,0xb9,0x53,0x8c,0xcc,0xf4,0x60,0x12,0x8a,0x76,0xcc,0x40,0x40,0x41,0x9b,0xdc,0x5c,0x17,0xff,0x5c,0xf9,0x5e,0x17,0x35,0x98,0x24,0x56,0x4b,0x74,0xef,0x42,0x10,0xc8,0xaf,0xbf,0x7f, -0xc6,0x7f,0xf2,0x37,0x7d,0x5a,0x3f,0x1c,0xf2,0x99,0x79,0x4a,0x91,0x52,0x00,0xaf,0x38,0x0f,0x17,0xf5,0x2f,0x79,0x81,0x65,0xd9,0xa9,0xb5,0x6b,0xe4,0xc7,0xce,0xf6,0xca,0x7a,0x00,0x6f,0x4b,0x30,0x44,0x24,0x22,0x3c,0xcf,0xed,0x03,0xa5,0x96,0x8f,0x59,0x29,0xbc,0xb6,0xfd,0x04,0xe1,0x70,0x9f,0x32,0x4a,0x27,0xfd,0x55,0xaf,0x2f, -0xfe,0xb6,0xe5,0x8e,0x33,0xbb,0x62,0x5f,0x9a,0xdb,0x57,0x40,0xe9,0xf1,0xce,0x99,0x66,0x90,0x8c,0xff,0x6a,0x62,0x7f,0xdd,0xc5,0x4a,0x0b,0x91,0x26,0xe2,0x39,0xec,0x19,0x4a,0x71,0x63,0x9d,0x7b,0x21,0x6d,0xc3,0x9c,0xa3,0xa2,0x3c,0xfa,0x7f,0x7d,0x96,0x6a,0x90,0x78,0xa6,0x6d,0xd2,0xe1,0x9c,0xf9,0x1d,0xfc,0x38,0xd8,0x94,0xf4, -0xc6,0xa5,0x0a,0x96,0x86,0xa4,0xbd,0x9e,0x1a,0xae,0x04,0x42,0x83,0xb8,0xb5,0x80,0x9b,0x22,0x38,0x20,0xb5,0x25,0xe5,0x64,0xec,0xf7,0xf4,0xbf,0x7e,0x63,0x59,0x25,0x0f,0x7a,0x2e,0x39,0x57,0x76,0xa2,0x71,0xaa,0x06,0x8a,0x0f,0x89,0x16,0xba,0x61,0xa7,0x11,0xcb,0x9a,0xd8,0x0e,0x47,0x9a,0x80,0xc5,0xd0,0xcd,0xa7,0xd0,0xef,0x7d, -0x83,0xf0,0xe1,0x3b,0x71,0x09,0xdf,0x5d,0x74,0x98,0x22,0x08,0x61,0xda,0xb0,0x50,0x1e,0x6f,0xbd,0xf1,0xe1,0x00,0xdf,0xe7,0x31,0x07,0xa4,0x93,0x3a,0xf7,0x65,0x47,0x78,0xe8,0xf8,0xa8,0x48,0xab,0xf7,0xde,0x72,0x7e,0x61,0x6b,0x6f,0x77,0xa9,0x81,0xcb,0xa7,0x09,0xac,0x39,0xbb,0xec,0xc6,0xcb,0xd8,0x82,0xb4,0x72,0xcd,0x1d,0xf4, -0xb8,0x85,0x01,0x1e,0x80,0xfb,0x1b,0x89,0x2a,0x54,0x39,0xb2,0x5b,0xda,0xc8,0x0d,0x55,0x99,0x7a,0x87,0x73,0x3b,0x08,0xe6,0x98,0x2d,0xea,0x8d,0xe0,0x33,0x2e,0x12,0x29,0xf5,0xc0,0x2f,0x54,0x27,0x21,0xf7,0xc8,0xac,0x4e,0xda,0x28,0xb8,0xb1,0xa9,0xdb,0x96,0xb2,0xa7,0x42,0xa2,0xc9,0xcf,0x19,0x41,0x4d,0xe0,0x86,0xf9,0x2a,0x9a, -0xa3,0x11,0x66,0x30,0xd3,0xbb,0x74,0x32,0x4b,0xdf,0x63,0x7b,0xf5,0x99,0x8a,0x2f,0x1b,0xc7,0x21,0xaf,0x59,0xb5,0xae,0xdc,0x44,0x3c,0x97,0x50,0x71,0xd7,0xa1,0xd2,0xc5,0x55,0xe3,0x69,0xde,0x57,0xc1,0xd1,0xde,0x30,0xc0,0xfd,0xcc,0xe6,0x4d,0xfb,0x0d,0xbf,0x5d,0x4f,0xe9,0x9d,0x1e,0x19,0x38,0x2f,0xbc,0xcf,0x58,0x05,0x2e,0xef, -0x0d,0xa0,0x50,0x35,0xda,0xef,0x09,0x27,0x1c,0xd5,0xb3,0x7e,0x35,0x1e,0x08,0xba,0xda,0x36,0xdb,0xd3,0x5f,0x8f,0xde,0x74,0x88,0x49,0x12,0xa1,0x82,0x02,0xce,0x30,0x82,0x02,0x37,0x02,0x01,0x01,0x30,0x81,0xf8,0xa1,0x81,0xd0,0xa4,0x81,0xcd,0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31, -0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f, -0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54, -0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37,0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0xa2,0x23,0x0a,0x01, -0x01,0x30,0x07,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x03,0x15,0x00,0x38,0x3d,0xac,0x26,0x41,0x22,0x8f,0x3c,0xc6,0xc6,0x55,0xda,0x06,0x0a,0xf9,0x32,0x6d,0x93,0x2e,0x69,0xa0,0x81,0x83,0x30,0x81,0x80,0xa4,0x7e,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04, -0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31, -0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x02,0x05,0x00,0xdf,0xf4,0x2e,0xe3,0x30,0x22,0x18, -0x0f,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x34,0x32,0x30,0x33,0x32,0x33,0x35,0x5a,0x18,0x0f,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x35,0x32,0x30,0x33,0x32,0x33,0x35,0x5a,0x30,0x77,0x30,0x3d,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a,0x04,0x01,0x31,0x2f,0x30,0x2d,0x30,0x0a,0x02,0x05,0x00,0xdf,0xf4,0x2e,0xe3,0x02,0x01, -0x00,0x30,0x0a,0x02,0x01,0x00,0x02,0x02,0x19,0xf6,0x02,0x01,0xff,0x30,0x07,0x02,0x01,0x00,0x02,0x02,0x11,0x74,0x30,0x0a,0x02,0x05,0x00,0xdf,0xf5,0x80,0x63,0x02,0x01,0x00,0x30,0x36,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a,0x04,0x02,0x31,0x28,0x30,0x26,0x30,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a, -0x03,0x02,0xa0,0x0a,0x30,0x08,0x02,0x01,0x00,0x02,0x03,0x07,0xa1,0x20,0xa1,0x0a,0x30,0x08,0x02,0x01,0x00,0x02,0x03,0x01,0x86,0xa0,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00,0x79,0x78,0x9e,0x72,0x3a,0x6f,0xf0,0x0e,0x50,0x48,0xa6,0x78,0x90,0xb3,0x7b,0xd8,0xf9,0xd8,0xeb, -0x34,0x2d,0x2b,0x30,0xd5,0x86,0xfa,0x8c,0xc2,0x8e,0x06,0xad,0x31,0xb1,0xf1,0xfa,0x4b,0x6b,0xce,0xd8,0x44,0x4c,0xc7,0xc5,0xb0,0xa0,0x86,0x94,0x97,0x10,0x01,0x25,0xd1,0x29,0x21,0x2b,0x6c,0x1d,0x67,0x37,0xd3,0x15,0x81,0x32,0x40,0xa9,0x7f,0x2e,0x6b,0x4d,0x0d,0xcb,0xc9,0xa0,0x05,0xed,0x54,0x89,0x0a,0x8c,0x7f,0x0d,0x52,0x1a, -0x26,0xda,0x26,0x7f,0x8e,0xa4,0xc2,0x49,0xba,0x54,0x51,0xd1,0x1e,0xfc,0xf2,0x66,0xbf,0x46,0xa5,0xde,0x59,0x55,0x9a,0xbc,0xea,0xca,0xf7,0xf7,0xf9,0x7b,0x77,0x66,0x86,0x03,0xf0,0xf2,0xb8,0x53,0x28,0xa3,0x4a,0x0e,0xbe,0xf9,0x71,0x31,0x82,0x03,0x0d,0x30,0x82,0x03,0x09,0x02,0x01,0x01,0x30,0x81,0x93,0x30,0x7c,0x31,0x0b,0x30, -0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72, -0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x02,0x13,0x33,0x00,0x00,0x00,0xee, -0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c,0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x82,0x01,0x4a,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0d,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x01,0x04,0x30,0x2f,0x06, -0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xa9,0xb8,0x68,0x0f,0x5b,0x53,0xc4,0x53,0x8f,0x02,0x31,0x6a,0xa0,0x8b,0xf7,0x6b,0x41,0xea,0x53,0x11,0xcb,0xc2,0x98,0xe8,0xce,0x11,0x08,0xe6,0x0c,0xe8,0x14,0xd4,0x30,0x81,0xfa,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x02,0x2f,0x31,0x81, -0xea,0x30,0x81,0xe7,0x30,0x81,0xe4,0x30,0x81,0xbd,0x04,0x20,0x3f,0xae,0xc6,0x22,0xb7,0x3e,0xfb,0xf8,0xb4,0xb1,0x77,0x93,0x35,0x3e,0x92,0x51,0x0a,0x9f,0x0b,0x21,0x01,0xf2,0x99,0x2b,0x12,0x0c,0xd1,0x23,0x2f,0x10,0x2e,0xc3,0x30,0x81,0x98,0x30,0x81,0x80,0xa4,0x7e,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13, -0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43, -0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x02,0x13,0x33,0x00,0x00,0x00,0xee,0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c, -0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x22,0x04,0x20,0x14,0xc2,0x54,0x4f,0xba,0xe2,0x1c,0xdf,0x0c,0x3b,0x9d,0xfc,0xbc,0x5c,0xd8,0xb1,0x97,0xa6,0x39,0x9a,0x30,0x96,0xf8,0xa5,0xf4,0xb2,0x11,0xd6,0x59,0xc6,0x50,0xdd,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x04,0x82,0x01,0x00,0x4e,0x09, -0xa9,0x0d,0x51,0x40,0x35,0x45,0x38,0x88,0x5f,0x87,0xc6,0xaf,0x4a,0xd8,0x8c,0x36,0x34,0xd4,0x98,0x9b,0x5b,0xfb,0xc0,0xc0,0x85,0xd8,0x62,0x7e,0x9d,0x36,0x78,0x97,0xc6,0x77,0x76,0x2c,0xfb,0xf7,0x48,0x80,0x3e,0x93,0x18,0x95,0x1d,0xda,0xab,0x0a,0x0a,0xd1,0x9d,0xdb,0xcd,0xb7,0x67,0x8c,0x91,0xa8,0xdd,0x33,0x8d,0x55,0x9e,0xa0, -0x25,0xdb,0x26,0x6d,0x71,0xea,0xb6,0x99,0x10,0xce,0xa6,0x7a,0xfe,0x58,0x2e,0xb0,0x19,0xbd,0xc4,0x92,0xa4,0xa4,0x2b,0x56,0x85,0x54,0x02,0xdc,0x8d,0xe5,0x7b,0x23,0xcd,0xd7,0xee,0x49,0xcb,0x8d,0x7d,0x2f,0x80,0x9d,0x48,0x77,0xa2,0xe1,0xcc,0xb9,0x66,0x09,0xbd,0x3b,0x43,0x88,0x4d,0x7d,0xbc,0x83,0xff,0xfc,0xbf,0x27,0x4d,0x0c, -0xc7,0x06,0xbb,0x68,0x0d,0x37,0xcc,0xa0,0x0f,0xda,0xe0,0xf5,0xcc,0x8c,0xd2,0x24,0x97,0xe4,0x6c,0x02,0x83,0xb3,0xbd,0x0e,0x50,0xdd,0x2f,0x0c,0x05,0xee,0xe7,0xda,0x9b,0x11,0xc4,0x9d,0x6e,0x67,0x8c,0x29,0x9b,0x4e,0xef,0x33,0xe7,0x31,0x20,0x9e,0xdf,0x47,0xdd,0x6a,0xea,0x7b,0xac,0x08,0x0f,0x83,0x04,0x2c,0xee,0x13,0x35,0x69, -0x90,0xb4,0x8a,0xbe,0xc5,0x5e,0x5e,0x29,0x29,0x09,0xc0,0x1b,0xa7,0x68,0x47,0x29,0x21,0x91,0x3b,0xdf,0xa3,0x2f,0x81,0x42,0x88,0x50,0x90,0x72,0x29,0x4f,0x24,0xc5,0x03,0x45,0x2e,0xa2,0x6a,0x10,0xf4,0xd1,0x0b,0x23,0xbd,0xbf,0x92,0x8c,0xc8,0x74,0x6e,0x35,0xcd,0x74,0x9b,0x38,0xdf,0x13,0xd2,0x2a,0xc5,0xfa,0x30,0xab,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x02,0x1a,0x02,0x22,0x00,0x02,0x00,0x57,0x00,0x00,0x02,0x43,0x00,0x01,0x02,0x44,0x02,0x56,0x00,0x03,0x02,0x57,0x04,0x61,0x00,0x01,0x04,0x62,0x04,0xaf,0x00,0x03,0x04,0xb0,0x05,0xfc,0x00,0x01,0x05,0xfd,0x06,0x02,0x00,0x03,0x06,0x03,0x06,0x65,0x00,0x01,0x06,0x66,0x06,0x72,0x00,0x03, -0x06,0x73,0x06,0x9a,0x00,0x01,0x06,0x9b,0x06,0x9b,0x00,0x03,0x06,0x9c,0x06,0xad,0x00,0x01,0x06,0xae,0x06,0xd9,0x00,0x02,0x06,0xda,0x06,0xda,0x00,0x03,0x06,0xdb,0x07,0x38,0x00,0x02,0x07,0x39,0x07,0x3d,0x00,0x03,0x07,0x3e,0x07,0x54,0x00,0x01,0x07,0x55,0x07,0x5f,0x00,0x03,0x07,0x60,0x07,0xec,0x00,0x01,0x07,0xed,0x07,0xf0, -0x00,0x03,0x07,0xf1,0x08,0x4b,0x00,0x01,0x08,0x4c,0x08,0x4f,0x00,0x03,0x08,0x50,0x09,0x2b,0x00,0x01,0x09,0x2c,0x09,0x33,0x00,0x03,0x09,0x34,0x09,0x36,0x00,0x01,0x09,0x37,0x09,0x37,0x00,0x03,0x09,0x38,0x09,0x70,0x00,0x01,0x09,0x71,0x09,0x71,0x00,0x02,0x09,0x72,0x09,0x72,0x00,0x01,0x09,0x73,0x09,0x75,0x00,0x03,0x09,0x76, -0x09,0x76,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x03,0x09,0x78,0x09,0x7d,0x00,0x01,0x09,0x7e,0x09,0x7f,0x00,0x03,0x09,0x80,0x0a,0x0e,0x00,0x01,0x0a,0x0f,0x0a,0x13,0x00,0x03,0x0a,0x14,0x0a,0x15,0x00,0x01,0x0a,0x16,0x0a,0x1f,0x00,0x03,0x0a,0x20,0x0a,0x20,0x00,0x01,0x0a,0x21,0x0a,0x23,0x00,0x03,0x0a,0x24,0x0a,0x4a,0x00,0x01, -0x0a,0x4b,0x0a,0x53,0x00,0x03,0x0a,0x54,0x0a,0x5b,0x00,0x01,0x0a,0x5c,0x0a,0x5e,0x00,0x03,0x0a,0x5f,0x0a,0x62,0x00,0x01,0x0a,0x63,0x0a,0x64,0x00,0x02,0x0a,0x65,0x0a,0x69,0x00,0x03,0x0a,0x6a,0x0a,0x6b,0x00,0x01,0x0a,0x6c,0x0a,0x71,0x00,0x03,0x0a,0x72,0x0a,0xda,0x00,0x01,0x0a,0xdb,0x0a,0xe3,0x00,0x03,0x0a,0xe4,0x0b,0x52, -0x00,0x01,0x0b,0x53,0x0b,0x5f,0x00,0x03,0x0b,0x60,0x0b,0x60,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x03,0x0b,0x62,0x0b,0x62,0x00,0x01,0x0b,0x63,0x0b,0x64,0x00,0x03,0x0b,0x65,0x0b,0x65,0x00,0x01,0x0b,0x66,0x0b,0x67,0x00,0x03,0x0b,0x68,0x0b,0xb8,0x00,0x01,0x0b,0xb9,0x0b,0xb9,0x00,0x03,0x0b,0xba,0x0b,0xbe,0x00,0x01,0x0b,0xbf, -0x0b,0xde,0x00,0x03,0x0b,0xdf,0x0b,0xe0,0x00,0x01,0x0b,0xe1,0x0b,0xe1,0x00,0x03,0x0b,0xe2,0x0e,0x19,0x00,0x01,0x0e,0x1a,0x0e,0x1e,0x00,0x03,0x0e,0x1f,0x0e,0x61,0x00,0x01,0x0e,0x62,0x0e,0x6c,0x00,0x03,0x0e,0x6d,0x0e,0xea,0x00,0x01,0x0e,0xeb,0x0e,0xeb,0x00,0x03,0x0e,0xec,0x12,0x58,0x00,0x01,0x12,0x59,0x12,0x5e,0x00,0x03, -0x12,0x5f,0x13,0x29,0x00,0x01,0x13,0x2a,0x13,0x44,0x00,0x03,0x13,0x45,0x13,0xd8,0x00,0x01,0x13,0xd9,0x13,0xe9,0x00,0x03,0x13,0xea,0x13,0xee,0x00,0x01,0x13,0xef,0x13,0xf2,0x00,0x02,0x13,0xf3,0x14,0x16,0x00,0x01,0x14,0x17,0x14,0x17,0x00,0x03,0x14,0x18,0x14,0x5c,0x00,0x01,0x14,0x5d,0x14,0x6a,0x00,0x03,0x14,0x6b,0x14,0x6b, -0x00,0x01,0x14,0x6c,0x14,0x6c,0x00,0x03,0x14,0x6d,0x14,0x96,0x00,0x01,0x14,0x97,0x14,0x98,0x00,0x02,0x14,0x99,0x14,0xdf,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x33,0x02,0x44,0x02,0x44,0x00,0x02,0x02,0x45,0x02,0x45,0x00,0x04,0x02,0x46,0x02,0x47,0x00,0x02,0x04,0x62,0x04,0x73,0x00,0x02,0x04,0x75, -0x04,0x78,0x00,0x04,0x04,0x79,0x04,0x79,0x00,0x02,0x04,0x7b,0x04,0x7f,0x00,0x04,0x04,0x82,0x04,0x84,0x00,0x04,0x04,0x87,0x04,0x91,0x00,0x04,0x04,0x97,0x04,0x9a,0x00,0x04,0x04,0x9b,0x04,0x9d,0x00,0x02,0x04,0xa0,0x04,0xa2,0x00,0x02,0x04,0xa3,0x04,0xa3,0x00,0x04,0x04,0xa4,0x04,0xa4,0x00,0x02,0x04,0xa5,0x04,0xa7,0x00,0x04, -0x04,0xa8,0x04,0xaa,0x00,0x02,0x04,0xab,0x04,0xac,0x00,0x04,0x05,0xfd,0x06,0x00,0x00,0x02,0x06,0x66,0x06,0x72,0x00,0x02,0x07,0x3a,0x07,0x3d,0x00,0x03,0x07,0x55,0x07,0x57,0x00,0x02,0x07,0x58,0x07,0x5b,0x00,0x04,0x07,0x5c,0x07,0x5c,0x00,0x02,0x07,0xed,0x07,0xee,0x00,0x04,0x07,0xef,0x07,0xef,0x00,0x02,0x08,0x4c,0x08,0x4d, -0x00,0x02,0x08,0x4e,0x08,0x4e,0x00,0x04,0x08,0x4f,0x08,0x4f,0x00,0x02,0x09,0x2e,0x09,0x2e,0x00,0x01,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x01,0x09,0x7f,0x09,0x7f,0x00,0x01,0x0a,0x1a,0x0a,0x1a,0x00,0x01,0x0a,0x21,0x0a,0x21,0x00,0x01,0x0a,0x23,0x0a,0x23,0x00,0x01,0x0a,0x50,0x0a,0x50,0x00,0x01,0x0a,0x6f, -0x0a,0x6f,0x00,0x01,0x0a,0xdb,0x0a,0xe0,0x00,0x02,0x0a,0xe1,0x0a,0xe1,0x00,0x04,0x0a,0xe2,0x0a,0xe2,0x00,0x02,0x0a,0xe3,0x0a,0xe3,0x00,0x04,0x0e,0x1e,0x0e,0x1e,0x00,0x01,0x0e,0x6b,0x0e,0x6c,0x00,0x01,0x13,0x2c,0x13,0x2c,0x00,0x01,0x13,0x2f,0x13,0x2f,0x00,0x01,0x13,0x33,0x13,0x35,0x00,0x01,0x13,0x38,0x13,0x38,0x00,0x01, -0x13,0x3c,0x13,0x3c,0x00,0x01,0x13,0x3f,0x13,0x40,0x00,0x01,0x14,0x62,0x14,0x62,0x00,0x01,0x14,0x6c,0x14,0x6c,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x0a,0x01,0xee,0x04,0xce,0x00,0x15,0x61,0x72,0x61,0x62,0x00,0x80,0x62,0x6e,0x67,0x32,0x00,0xea,0x63,0x79,0x72,0x6c,0x00,0xf4,0x64,0x65,0x76,0x32,0x01,0x08,0x67,0x6a,0x72,0x32, -0x01,0x22,0x67,0x72,0x65,0x6b,0x01,0x12,0x67,0x75,0x72,0x32,0x01,0x2c,0x68,0x65,0x62,0x72,0x01,0x36,0x6b,0x68,0x6d,0x72,0x01,0x4e,0x6b,0x6e,0x64,0x32,0x01,0x44,0x6c,0x61,0x6f,0x20,0x01,0x58,0x6c,0x61,0x74,0x6e,0x01,0x62,0x6d,0x6c,0x6d,0x32,0x01,0x8a,0x6d,0x6f,0x6e,0x67,0x01,0x94,0x6d,0x79,0x6d,0x72,0x01,0x9e,0x6f,0x72, -0x79,0x32,0x01,0xb2,0x74,0x61,0x6c,0x75,0x01,0xa8,0x74,0x65,0x6c,0x32,0x01,0xc6,0x74,0x68,0x61,0x69,0x01,0xd0,0x74,0x69,0x62,0x74,0x01,0xda,0x74,0x6d,0x6c,0x32,0x01,0xbc,0x00,0x2e,0x00,0x05,0x41,0x52,0x41,0x20,0x00,0x22,0x4d,0x4c,0x59,0x20,0x00,0x3a,0x4d,0x4f,0x52,0x20,0x00,0x46,0x53,0x4e,0x44,0x20,0x00,0x52,0x55,0x52, -0x44,0x20,0x00,0x5e,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1c,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x09,0x00,0x13,0x00,0x1d,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0b,0x00,0x15,0x00,0x1f,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0c,0x00,0x16,0x00,0x20, -0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0d,0x00,0x17,0x00,0x21,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x04,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x22,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x05, -0x00,0x01,0x00,0x0f,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x10,0x00,0x19,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00, -0xff,0xff,0x00,0x00,0x00,0x0a,0x00,0x01,0x54,0x52,0x4b,0x20,0x00,0x1a,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x06,0x00,0x02,0x00,0x11,0x00,0x1a,0x00,0x23,0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x07,0x00,0x03,0x00,0x1b,0x00,0x24,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00, -0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00, -0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x25,0x63,0x61,0x73,0x65,0x00,0xe0,0x63,0x61,0x73,0x65,0x00,0xe6,0x63,0x61,0x73,0x65,0x00,0xec,0x63,0x61,0x73,0x65,0x00,0xf2,0x63,0x70,0x73,0x70,0x00,0xf8,0x63,0x70,0x73,0x70,0x01,0x02,0x63,0x70,0x73,0x70,0x01,0x0c,0x63,0x70,0x73,0x70,0x01,0x16,0x6b,0x65,0x72,0x6e,0x01,0x20,0x6b,0x65, -0x72,0x6e,0x01,0x36,0x6b,0x65,0x72,0x6e,0x01,0x60,0x6b,0x65,0x72,0x6e,0x01,0x76,0x6b,0x65,0x72,0x6e,0x01,0x8c,0x6b,0x65,0x72,0x6e,0x01,0xa2,0x6b,0x65,0x72,0x6e,0x01,0xcc,0x6b,0x65,0x72,0x6e,0x01,0xd2,0x6b,0x65,0x72,0x6e,0x01,0xd8,0x6b,0x65,0x72,0x6e,0x01,0xde,0x6d,0x61,0x72,0x6b,0x01,0xe4,0x6d,0x61,0x72,0x6b,0x01,0xee, -0x6d,0x61,0x72,0x6b,0x01,0xf8,0x6d,0x61,0x72,0x6b,0x02,0x02,0x6d,0x61,0x72,0x6b,0x02,0x0c,0x6d,0x61,0x72,0x6b,0x02,0x16,0x6d,0x61,0x72,0x6b,0x02,0x20,0x6d,0x61,0x72,0x6b,0x02,0x28,0x6d,0x61,0x72,0x6b,0x02,0x6a,0x6d,0x61,0x72,0x6b,0x02,0x80,0x6d,0x6b,0x6d,0x6b,0x02,0x94,0x6d,0x6b,0x6d,0x6b,0x02,0x9c,0x6d,0x6b,0x6d,0x6b, -0x02,0xa4,0x6d,0x6b,0x6d,0x6b,0x02,0xac,0x6d,0x6b,0x6d,0x6b,0x02,0xb4,0x6d,0x6b,0x6d,0x6b,0x02,0xbc,0x6d,0x6b,0x6d,0x6b,0x02,0xc4,0x6d,0x6b,0x6d,0x6b,0x02,0xcc,0x6d,0x6b,0x6d,0x6b,0x02,0xd8,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00, -0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x13, -0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x09, -0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40, -0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x19,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00, -0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x13,0x00,0x00,0x00,0x1f,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20, -0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2c,0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x07,0x00,0x08,0x00,0x09, -0x00,0x0a,0x00,0x0c,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0c,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17, -0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x04,0x00,0x0d,0x00,0x0e,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x0d,0x00,0x0e,0x00,0x86,0x01,0x0e,0x01,0x28,0x01,0x42,0x01,0x52,0x01,0x62,0x01,0x72,0x01,0x82,0x01,0x92,0x01,0xa2,0x01,0xb2,0x01,0xc2,0x01,0xd2, -0x01,0xe2,0x01,0xf2,0x02,0x02,0x02,0x12,0x02,0x22,0x02,0x32,0x02,0x42,0x02,0x52,0x02,0x62,0x02,0x72,0x02,0x96,0x02,0xa6,0x02,0xb6,0x02,0xc6,0x02,0xd6,0x02,0xe6,0x02,0xf6,0x03,0x06,0x03,0x2a,0x03,0x3a,0x03,0x68,0x04,0x5e,0x05,0xb8,0x05,0xc8,0x05,0xd8,0x06,0x56,0x06,0x7a,0x06,0xee,0x07,0x1c,0x09,0x70,0x09,0x80,0x09,0x90, -0x09,0xa0,0x09,0xb0,0x09,0xc0,0x09,0xd0,0x09,0xe0,0x0a,0x04,0x0a,0x14,0x0a,0x38,0x0a,0x7a,0x0a,0xa8,0x0a,0xb8,0x0a,0xc8,0x0a,0xf6,0x0b,0x06,0x0b,0x16,0x0b,0x26,0x0b,0x36,0x0b,0x46,0x0b,0x56,0x0b,0x66,0x0b,0x76,0x0b,0x9a,0x0b,0xbe,0x0b,0xe2,0x0c,0x06,0x0c,0x2a,0x0c,0x4e,0x0c,0x72,0x0c,0x96,0x0c,0xba,0x0c,0xde,0x0c,0xee, -0x0c,0xfe,0x0d,0x0e,0x0d,0x1e,0x0d,0x2e,0x0d,0x3e,0x0d,0x4e,0x0d,0x5e,0x0d,0x6e,0x0d,0x7e,0x0d,0x8e,0x0d,0x9e,0x0d,0xae,0x0d,0xbe,0x0d,0xce,0x0d,0xde,0x0d,0xee,0x0d,0xfe,0x0e,0x0e,0x0e,0x1e,0x0e,0x2e,0x0e,0x3e,0x0e,0x4e,0x0e,0x5e,0x0e,0x6e,0x0e,0x7e,0x0e,0x8e,0x0e,0x9e,0x0e,0xae,0x0e,0xbe,0x0e,0xce,0x0e,0xde,0x0e,0xee, -0x0e,0xfe,0x0f,0x0e,0x0f,0x1e,0x0f,0x2e,0x0f,0x3e,0x0f,0x4e,0x0f,0x5e,0x0f,0x6e,0x0f,0x7e,0x0f,0x8e,0x0f,0x9e,0x0f,0xae,0x0f,0xbe,0x0f,0xce,0x0f,0xde,0x0f,0xee,0x0f,0xfe,0x10,0x0e,0x10,0x1e,0x10,0x2e,0x10,0x3e,0x10,0x4e,0x10,0x5e,0x10,0x6e,0x10,0x7e,0x10,0x8e,0x00,0x09,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01, -0x00,0x02,0x00,0x00,0x0f,0x86,0x00,0x01,0x00,0x02,0x00,0x00,0x2d,0x04,0x00,0x09,0x00,0x08,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x02,0x00,0x00,0x35,0xd0,0x00,0x01,0x00,0x02,0x00,0x00,0x36,0x16,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x82,0xbe,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, -0x00,0x01,0x00,0x04,0x00,0x00,0x97,0x3c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x98,0x5c,0x00,0x09,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x36,0x96,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x99,0xa2,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, -0x00,0x01,0x00,0x04,0x00,0x00,0x9a,0x78,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xa8,0x76,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xa9,0x56,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xaa,0x32,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, -0x00,0x01,0x00,0x04,0x00,0x00,0xb1,0x9a,0x00,0x09,0x03,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xb2,0x1c,0x00,0x09,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0xfe,0xcc,0x00,0x09,0x04,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x01,0x20,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, -0x00,0x01,0x00,0x01,0x00,0x00,0x48,0x22,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x49,0xe8,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x49,0xf2,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x4a,0x08,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, -0x00,0x01,0x00,0x04,0x00,0x01,0x02,0x92,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x02,0xa8,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x40,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x78,0x00,0x09,0x00,0x01, -0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x05,0x00,0x01,0x12,0xb8,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x15,0x60,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x18,0xd4,0x00,0x09,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x4a,0xcc,0x00,0x09,0x00,0x01, -0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1a,0x3a,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1a,0x90,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xa2,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xe4, -0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xfc,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1d,0x58,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x2c,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x36,0x00,0x01, -0x00,0x08,0x00,0x00,0x4f,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x50,0x00,0x09,0x00,0x01,0x00,0x18,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde, -0x00,0xe6,0x00,0xee,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x58,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x64,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x7e,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x8a,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x98,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xa2,0x00,0x01,0x00,0x08, -0x00,0x00,0x4f,0xb0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xd2,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xe0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x12,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x24,0x00,0x01,0x00,0x08, -0x00,0x00,0x50,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x56,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x66,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x78,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x8a,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x9e,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xaa,0x00,0x01,0x00,0x08, -0x00,0x00,0x50,0xb8,0x00,0x09,0x00,0x01,0x00,0x22,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x8a,0x00,0x92,0x00,0x9a,0x00,0xa2,0x00,0xaa,0x00,0xb2,0x00,0xba,0x00,0xc2,0x00,0xca,0x00,0xd2,0x00,0xda,0x00,0xe2,0x00,0xea,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x01,0x12,0x01,0x1a, -0x01,0x22,0x01,0x2a,0x01,0x32,0x01,0x3a,0x01,0x42,0x01,0x4a,0x01,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xce,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xda,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xe8,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xf8,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x06,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x16,0x00,0x01, -0x00,0x08,0x00,0x00,0x51,0x28,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x34,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x82,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x90,0x00,0x01, -0x00,0x08,0x00,0x00,0x51,0xa0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xd0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xe2,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xf2,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x04,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x18,0x00,0x01, -0x00,0x08,0x00,0x00,0x52,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x36,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x48,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x94,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xa6,0x00,0x01, -0x00,0x08,0x00,0x00,0x52,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xca,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xdc,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xf0,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1b,0xac,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xbe,0x00,0x09, -0x00,0x01,0x00,0x0c,0x00,0x1e,0x00,0x26,0x00,0x2e,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xfa,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x06,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x14,0x00,0x01,0x00,0x08, -0x00,0x00,0x54,0x1e,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x2a,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x4e,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x66,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x72,0x00,0x09,0x00,0x01, -0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xd8,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xe4,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xf2,0x00,0x09,0x00,0x01,0x00,0x0b,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x44,0x00,0x4c,0x00,0x54,0x00,0x5c,0x00,0x64,0x00,0x6c,0x00,0x01,0x00,0x08, -0x00,0x00,0x55,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x4e,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x6c,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x78,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x86,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x96,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xa2,0x00,0x01,0x00,0x08, -0x00,0x00,0x55,0xb0,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xcc,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x56,0x00,0x01,0x00,0x08,0x00,0x00, -0x56,0x68,0x00,0x09,0x00,0x01,0x00,0x3b,0x00,0x7c,0x00,0x84,0x00,0x8c,0x00,0x94,0x00,0x9c,0x00,0xa4,0x00,0xac,0x00,0xb4,0x00,0xbc,0x00,0xc4,0x00,0xcc,0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x01,0x14,0x01,0x1c,0x01,0x24,0x01,0x2c,0x01,0x34,0x01,0x3c,0x01,0x44,0x01,0x4c,0x01,0x54, -0x01,0x5c,0x01,0x64,0x01,0x6c,0x01,0x74,0x01,0x7c,0x01,0x84,0x01,0x8c,0x01,0x94,0x01,0x9c,0x01,0xa4,0x01,0xac,0x01,0xb4,0x01,0xbc,0x01,0xc4,0x01,0xcc,0x01,0xd4,0x01,0xdc,0x01,0xe4,0x01,0xec,0x01,0xf4,0x01,0xfc,0x02,0x04,0x02,0x0c,0x02,0x14,0x02,0x1c,0x02,0x24,0x02,0x2c,0x02,0x34,0x02,0x3c,0x02,0x44,0x02,0x4c,0x00,0x01, -0x00,0x08,0x00,0x00,0x56,0x62,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x90,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xa0,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xc4,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xd8,0x00,0x01, -0x00,0x08,0x00,0x00,0x56,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xfc,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x10,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x24,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x4a,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x6e,0x00,0x01, -0x00,0x08,0x00,0x00,0x57,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x94,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xa8,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xbe,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xd2,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xe6,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xfc,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x12,0x00,0x01, -0x00,0x08,0x00,0x00,0x58,0x2a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x4a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x92,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xa6,0x00,0x01, -0x00,0x08,0x00,0x00,0x58,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xd0,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xe2,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xf4,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x32,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x46,0x00,0x01, -0x00,0x08,0x00,0x00,0x59,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x96,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xaa,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xbe,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xd4,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xea,0x00,0x01, -0x00,0x08,0x00,0x00,0x59,0xf8,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x18,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x28,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x4c,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x72,0x00,0x01, -0x00,0x08,0x00,0x00,0x5a,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x98,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0xac,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1d,0x36,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xa4,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01, -0x00,0x08,0x00,0x00,0x5b,0xb6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xd0,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x1e,0xda,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x1f,0x28,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01, -0x00,0x06,0x00,0x01,0x20,0x1c,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xb6,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xc2,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xce,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x20,0xb0,0x00,0x09,0x00,0x01,0x00,0x03, -0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x2c,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x46,0x00,0x09,0x00,0x01,0x00,0x06,0x00,0x12,0x00,0x1a,0x00,0x22,0x00,0x2a,0x00,0x32,0x00,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xc6,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xd2, -0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xde,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xf6,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x02,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x66,0x00,0x01, -0x00,0x08,0x00,0x00,0x5d,0x72,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x7e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0xe6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x20,0xc8,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08, -0x00,0x00,0x5e,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x70,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x21,0x7a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xa4,0x00,0x09,0x00,0x00, -0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xb6,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xca,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xde,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xf4,0x00,0x09,0x00,0x00, -0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x0a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x20,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x2e,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x48,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x62, -0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x8c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xa8,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xb8,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xd4, -0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xf0,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x1e,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x3c,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x4e, -0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x6c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x8a,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x9c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xd8,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c, -0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x0a,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x2a,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x3e,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x5e,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x7e,0x00,0x09,0x00,0x00, -0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x92,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xd2,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xe6,0x00,0x01,0x00,0x08,0x00,0x00,0x62,0x06,0x00,0x01,0x00,0x08, -0x00,0x00,0x62,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04, -0x00,0x00,0x65,0x04,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x67,0x4e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x68,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x68,0xf8,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04, -0x00,0x00,0x69,0xca,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6a,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6b,0xb0,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6c,0x88,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04, -0x00,0x00,0x6c,0xea,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6d,0xbc,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x18,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0xe6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04, -0x00,0x00,0x6f,0xbe,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x70,0x96,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x71,0x6e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x72,0x94,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06, -0x00,0x00,0x72,0xea,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x73,0x40,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0x96,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xe0,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x60,0xfc,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x02,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x06,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x08,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x0a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x0e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x14,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x18,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x1c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x20,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x22,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x24,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x26,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x2a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x2e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x32,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x36,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x3a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x3e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x42,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x46,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x4a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x4e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x52,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x56,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x58,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x5a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x5c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x5e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x60,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x62,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x64,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x66,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x68,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x6c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x61,0x70,0x00,0x01,0x1c,0xce,0x00,0x05,0x00,0x00,0x00,0x53,0x00,0xb8,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x09,0x64,0x14,0x30,0x00,0xb8,0x10,0x92,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c, -0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x14,0x30,0x14,0x30,0x15,0x52,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x08,0x3c,0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x00,0xb8, -0x00,0xb8,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x00,0x01,0x09,0x08,0x01,0x56,0x01,0x56,0x00,0x01,0x09,0x08, -0x00,0xab,0x00,0xab,0x01,0x3f,0x08,0xcc,0xff,0x55,0xff,0x55,0x08,0xcd,0xff,0x55,0xff,0x55,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55, -0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9,0xff,0x55,0xff,0x55,0x08,0xfa,0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06, -0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55, -0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55,0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55, -0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29,0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b, -0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55,0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55, -0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5c,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55, -0xff,0x55,0x09,0x65,0xff,0x55,0xff,0x55,0x09,0x67,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a,0xff,0x55,0xff,0x55,0x09,0x8c, -0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x93,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x95,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab, -0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55, -0xff,0x55,0x09,0xb7,0xff,0x55,0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd,0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1, -0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55, -0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55,0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55, -0xff,0x55,0x09,0xe2,0xff,0x55,0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9,0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0, -0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xf9,0xff,0x55,0xff,0x55,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55,0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55, -0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55,0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55,0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55, -0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78, -0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55, -0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55,0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55, -0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55,0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf, -0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4,0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55, -0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55,0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55, -0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd1,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16, -0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20,0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55, -0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x3c,0xff,0x55,0xff,0x55,0x0f,0x3e,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55, -0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55,0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74,0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a, -0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55, -0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55,0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55,0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55, -0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56,0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59, -0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x75,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x7b,0xff,0x55,0xff,0x55,0x14,0x83,0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55, -0x00,0x31,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c, -0x00,0xab,0x00,0xab,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xf2,0x00,0xab,0x00,0xab, -0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8f,0x00,0xab, -0x00,0xab,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0xab,0x00,0xab,0x00,0xab,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e, -0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x78,0x00,0xab,0x00,0xab,0x01,0x32,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55, -0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9, -0xff,0x55,0xff,0x55,0x08,0xfa,0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06,0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55, -0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55, -0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26, -0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29,0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b,0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab, -0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55,0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55,0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55, -0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a, -0xff,0x55,0xff,0x55,0x09,0x8c,0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab, -0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55,0xff,0x55,0x09,0xb7,0xff,0x55, -0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd,0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2, -0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55, -0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55,0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55,0xff,0x55,0x09,0xe2,0xff,0x55, -0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9,0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0,0xff,0x55,0xff,0x55,0x09,0xf2, -0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55,0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55,0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55, -0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55,0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55,0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55, -0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a, -0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55, -0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55,0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55, -0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf,0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4, -0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55,0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55, -0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55, -0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20, -0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab, -0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55,0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55, -0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74,0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a,0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84, -0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55,0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55, -0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55,0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55,0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab, -0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56,0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x83, -0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x9a,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55, -0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16, -0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55, -0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x65,0xff,0x55, -0xff,0x55,0x09,0x67,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x8c,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97, -0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55, -0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55, -0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a, -0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55, -0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab, -0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d, -0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55, -0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x3c,0xff,0x55, -0xff,0x55,0x0f,0x3e,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56, -0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x83,0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x30,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x0e,0xff,0x55, -0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98, -0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x73,0x00,0xab,0x00,0xab, -0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0xab,0x00,0xab,0x00,0xab,0x0e,0x49,0x00,0xab, -0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x40, -0x00,0xab,0x00,0xab,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x78,0x00,0xab,0x00,0xab,0x01,0x3f,0x08,0xcc,0xff,0x55,0xff,0x55,0x08,0xcd,0xff,0x55,0xff,0x55,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55, -0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9,0xff,0x55,0xff,0x55,0x08,0xfa, -0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06,0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55, -0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55,0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55, -0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29, -0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b,0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55, -0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55,0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5c,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55, -0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a,0xff,0x55,0xff,0x55,0x09,0x8c, -0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x93,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x95,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab, -0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55, -0xff,0x55,0x09,0xb3,0xff,0x55,0xff,0x55,0x09,0xb4,0xff,0x55,0xff,0x55,0x09,0xb5,0xff,0x55,0xff,0x55,0x09,0xb6,0xff,0x55,0xff,0x55,0x09,0xb7,0xff,0x55,0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd, -0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55, -0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55, -0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55,0xff,0x55,0x09,0xe2,0xff,0x55,0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9, -0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0,0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xf9,0xff,0x55,0xff,0x55,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfd,0xff,0x55,0xff,0x55,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55, -0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55,0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55,0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55, -0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55,0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72, -0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab, -0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55,0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55, -0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55,0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55,0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7, -0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf,0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4,0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55, -0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55,0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55,0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab, -0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf, -0xff,0x55,0xff,0x55,0x0e,0xd1,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20,0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab, -0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab, -0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55,0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55,0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74, -0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a,0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55, -0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55,0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55,0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55, -0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55,0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56, -0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x75,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x7b,0xff,0x55,0xff,0x55,0x14,0x83,0xff,0x55,0xff,0x55, -0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x02,0x00,0x1e,0x08,0xc8,0x08,0xc9,0x00,0x00,0x08,0xff,0x09,0x01,0x00,0x02,0x09,0x04,0x09,0x04,0x00,0x05,0x09,0x08,0x09,0x09,0x00,0x06,0x09,0x17,0x09,0x18,0x00,0x08,0x09,0x45,0x09,0x45,0x00,0x0a,0x09,0x5d,0x09,0x5e,0x00,0x0b, -0x09,0x80,0x09,0x83,0x00,0x0d,0x09,0xad,0x09,0xad,0x00,0x11,0x09,0xaf,0x09,0xb1,0x00,0x12,0x09,0xb3,0x09,0xb8,0x00,0x15,0x0a,0x54,0x0a,0x57,0x00,0x1b,0x0a,0x88,0x0a,0x88,0x00,0x1f,0x0a,0xb4,0x0a,0xb5,0x00,0x20,0x0b,0x0c,0x0b,0x0f,0x00,0x22,0x0b,0x11,0x0b,0x18,0x00,0x26,0x0e,0x8f,0x0e,0x8f,0x00,0x2e,0x0e,0x93,0x0e,0x93, -0x00,0x2f,0x0e,0x95,0x0e,0x97,0x00,0x30,0x0f,0x02,0x0f,0x02,0x00,0x33,0x0f,0x22,0x0f,0x23,0x00,0x34,0x0f,0x28,0x0f,0x2b,0x00,0x36,0x0f,0x62,0x0f,0x63,0x00,0x3a,0x0f,0x66,0x0f,0x67,0x00,0x3c,0x0f,0x6a,0x0f,0x6b,0x00,0x3e,0x0f,0x98,0x0f,0xa6,0x00,0x40,0x0f,0xc3,0x0f,0xc3,0x00,0x4f,0x14,0x58,0x14,0x58,0x00,0x50,0x14,0x7d, -0x14,0x7d,0x00,0x51,0x14,0xad,0x14,0xad,0x00,0x52,0x00,0x02,0x01,0x70,0x00,0x05,0x00,0x00,0x02,0x2e,0x03,0x3a,0x00,0x08,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0xff,0x55, -0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0xab,0x00,0xab,0x00,0xab, -0x00,0xab,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x02,0x00,0x1f,0x08,0xc9, -0x08,0xca,0x00,0x00,0x08,0xff,0x09,0x01,0x00,0x02,0x09,0x04,0x09,0x04,0x00,0x05,0x09,0x08,0x09,0x08,0x00,0x06,0x09,0x0a,0x09,0x0b,0x00,0x07,0x09,0x29,0x09,0x29,0x00,0x09,0x09,0x45,0x09,0x45,0x00,0x0a,0x09,0x85,0x09,0x85,0x00,0x0b,0x09,0xb3,0x09,0xb8,0x00,0x0c,0x0a,0x56,0x0a,0x57,0x00,0x12,0x0a,0xb4,0x0a,0xb5,0x00,0x14, -0x0b,0x0c,0x0b,0x0f,0x00,0x16,0x0b,0x11,0x0b,0x18,0x00,0x1a,0x0e,0x24,0x0e,0x24,0x00,0x22,0x0e,0x5e,0x0e,0x5e,0x00,0x23,0x0e,0x74,0x0e,0x75,0x00,0x24,0x0e,0xdc,0x0e,0xe3,0x00,0x26,0x0e,0xe6,0x0e,0xe6,0x00,0x2e,0x0f,0x02,0x0f,0x02,0x00,0x2f,0x0f,0x22,0x0f,0x23,0x00,0x30,0x0f,0x39,0x0f,0x39,0x00,0x32,0x0f,0x3b,0x0f,0x3b, -0x00,0x33,0x0f,0x62,0x0f,0x63,0x00,0x34,0x0f,0x66,0x0f,0x67,0x00,0x36,0x0f,0x6a,0x0f,0x6b,0x00,0x38,0x0f,0x98,0x0f,0xa6,0x00,0x3a,0x0f,0xc3,0x0f,0xc3,0x00,0x49,0x11,0x02,0x11,0x09,0x00,0x4a,0x14,0x58,0x14,0x58,0x00,0x52,0x14,0x7d,0x14,0x7d,0x00,0x53,0x14,0xad,0x14,0xad,0x00,0x54,0x00,0x02,0x00,0x2c,0x08,0xc9,0x08,0xc9, -0x00,0x01,0x08,0xca,0x08,0xca,0x00,0x03,0x08,0xff,0x09,0x01,0x00,0x04,0x09,0x04,0x09,0x04,0x00,0x04,0x09,0x08,0x09,0x08,0x00,0x01,0x09,0x0a,0x09,0x0a,0x00,0x02,0x09,0x0b,0x09,0x0b,0x00,0x03,0x09,0x29,0x09,0x29,0x00,0x02,0x09,0x45,0x09,0x45,0x00,0x07,0x09,0x85,0x09,0x85,0x00,0x03,0x09,0xb3,0x09,0xb5,0x00,0x05,0x09,0xb6, -0x09,0xb6,0x00,0x06,0x09,0xb7,0x09,0xb8,0x00,0x07,0x0a,0x56,0x0a,0x57,0x00,0x07,0x0a,0xb4,0x0a,0xb5,0x00,0x07,0x0b,0x0c,0x0b,0x0c,0x00,0x05,0x0b,0x0d,0x0b,0x0d,0x00,0x06,0x0b,0x0e,0x0b,0x0f,0x00,0x07,0x0b,0x11,0x0b,0x13,0x00,0x05,0x0b,0x14,0x0b,0x14,0x00,0x06,0x0b,0x15,0x0b,0x18,0x00,0x07,0x0e,0x24,0x0e,0x24,0x00,0x02, -0x0e,0x5e,0x0e,0x5e,0x00,0x02,0x0e,0x74,0x0e,0x75,0x00,0x02,0x0e,0xdc,0x0e,0xe3,0x00,0x02,0x0e,0xe6,0x0e,0xe6,0x00,0x02,0x0f,0x02,0x0f,0x02,0x00,0x06,0x0f,0x22,0x0f,0x23,0x00,0x07,0x0f,0x39,0x0f,0x39,0x00,0x02,0x0f,0x3b,0x0f,0x3b,0x00,0x02,0x0f,0x62,0x0f,0x63,0x00,0x04,0x0f,0x66,0x0f,0x67,0x00,0x04,0x0f,0x6a,0x0f,0x6b, -0x00,0x04,0x0f,0x98,0x0f,0x99,0x00,0x05,0x0f,0x9a,0x0f,0x9b,0x00,0x07,0x0f,0x9c,0x0f,0x9f,0x00,0x05,0x0f,0xa0,0x0f,0xa2,0x00,0x07,0x0f,0xa3,0x0f,0xa3,0x00,0x05,0x0f,0xa4,0x0f,0xa6,0x00,0x07,0x0f,0xc3,0x0f,0xc3,0x00,0x07,0x11,0x02,0x11,0x09,0x00,0x02,0x14,0x58,0x14,0x58,0x00,0x07,0x14,0x7d,0x14,0x7d,0x00,0x07,0x14,0xad, -0x14,0xad,0x00,0x07,0x00,0x02,0x00,0xf0,0x08,0xcc,0x08,0xcd,0x00,0x05,0x08,0xd4,0x08,0xd5,0x00,0x01,0x08,0xd6,0x08,0xd6,0x00,0x02,0x08,0xe1,0x08,0xe2,0x00,0x02,0x08,0xe5,0x08,0xe5,0x00,0x02,0x08,0xe8,0x08,0xe8,0x00,0x02,0x08,0xeb,0x08,0xeb,0x00,0x02,0x08,0xed,0x08,0xed,0x00,0x08,0x08,0xee,0x08,0xee,0x00,0x01,0x08,0xef, -0x08,0xef,0x00,0x02,0x08,0xf0,0x08,0xf0,0x00,0x01,0x08,0xf1,0x08,0xf1,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x06,0x08,0xf9,0x08,0xfa,0x00,0x01,0x08,0xff,0x08,0xff,0x00,0x01,0x09,0x01,0x09,0x01,0x00,0x01,0x09,0x06,0x09,0x06,0x00,0x01,0x09,0x07,0x09,0x07,0x00,0x02,0x09,0x09,0x09,0x09,0x00,0x03,0x09,0x0a,0x09,0x0a,0x00,0x01, -0x09,0x0c,0x09,0x0d,0x00,0x01,0x09,0x0f,0x09,0x0f,0x00,0x04,0x09,0x10,0x09,0x11,0x00,0x02,0x09,0x12,0x09,0x14,0x00,0x06,0x09,0x15,0x09,0x16,0x00,0x02,0x09,0x17,0x09,0x1a,0x00,0x01,0x09,0x1b,0x09,0x1e,0x00,0x02,0x09,0x1f,0x09,0x20,0x00,0x07,0x09,0x22,0x09,0x22,0x00,0x02,0x09,0x24,0x09,0x24,0x00,0x01,0x09,0x26,0x09,0x26, -0x00,0x02,0x09,0x28,0x09,0x28,0x00,0x02,0x09,0x29,0x09,0x2b,0x00,0x01,0x09,0x34,0x09,0x34,0x00,0x01,0x09,0x3c,0x09,0x3c,0x00,0x02,0x09,0x3e,0x09,0x3e,0x00,0x02,0x09,0x40,0x09,0x40,0x00,0x02,0x09,0x41,0x09,0x42,0x00,0x06,0x09,0x45,0x09,0x45,0x00,0x01,0x09,0x46,0x09,0x49,0x00,0x08,0x09,0x4a,0x09,0x4a,0x00,0x01,0x09,0x4c, -0x09,0x4c,0x00,0x06,0x09,0x4e,0x09,0x4e,0x00,0x02,0x09,0x5b,0x09,0x5b,0x00,0x02,0x09,0x5c,0x09,0x5c,0x00,0x05,0x09,0x5d,0x09,0x5d,0x00,0x02,0x09,0x5e,0x09,0x5e,0x00,0x01,0x09,0x60,0x09,0x60,0x00,0x02,0x09,0x63,0x09,0x63,0x00,0x02,0x09,0x64,0x09,0x64,0x00,0x04,0x09,0x65,0x09,0x65,0x00,0x0a,0x09,0x67,0x09,0x67,0x00,0x0a, -0x09,0x6c,0x09,0x6d,0x00,0x02,0x09,0x71,0x09,0x71,0x00,0x01,0x09,0x80,0x09,0x80,0x00,0x03,0x09,0x82,0x09,0x82,0x00,0x03,0x09,0x88,0x09,0x8a,0x00,0x01,0x09,0x8c,0x09,0x8c,0x00,0x02,0x09,0x8d,0x09,0x8d,0x00,0x01,0x09,0x8e,0x09,0x8e,0x00,0x02,0x09,0x8f,0x09,0x8f,0x00,0x06,0x09,0x90,0x09,0x90,0x00,0x02,0x09,0x92,0x09,0x92, -0x00,0x02,0x09,0x93,0x09,0x93,0x00,0x05,0x09,0x94,0x09,0x94,0x00,0x02,0x09,0x95,0x09,0x95,0x00,0x05,0x09,0x96,0x09,0x96,0x00,0x02,0x09,0x97,0x09,0x98,0x00,0x06,0x09,0x9b,0x09,0x9b,0x00,0x06,0x09,0x9e,0x09,0x9e,0x00,0x06,0x09,0xa1,0x09,0xa1,0x00,0x06,0x09,0xa4,0x09,0xa4,0x00,0x06,0x09,0xa7,0x09,0xa7,0x00,0x06,0x09,0xaa, -0x09,0xac,0x00,0x02,0x09,0xae,0x09,0xae,0x00,0x02,0x09,0xb2,0x09,0xb2,0x00,0x01,0x09,0xb3,0x09,0xb6,0x00,0x09,0x09,0xb7,0x09,0xbe,0x00,0x01,0x09,0xbf,0x09,0xc3,0x00,0x02,0x09,0xc4,0x09,0xc4,0x00,0x07,0x09,0xc6,0x09,0xc6,0x00,0x02,0x09,0xc8,0x09,0xca,0x00,0x02,0x09,0xcc,0x09,0xcd,0x00,0x02,0x09,0xd2,0x09,0xd3,0x00,0x02, -0x09,0xd7,0x09,0xd8,0x00,0x02,0x09,0xd9,0x09,0xda,0x00,0x08,0x09,0xdb,0x09,0xdb,0x00,0x01,0x09,0xdc,0x09,0xdc,0x00,0x08,0x09,0xdd,0x09,0xdd,0x00,0x01,0x09,0xde,0x09,0xde,0x00,0x08,0x09,0xdf,0x09,0xdf,0x00,0x01,0x09,0xe1,0x09,0xe5,0x00,0x08,0x09,0xe7,0x09,0xea,0x00,0x08,0x09,0xec,0x09,0xec,0x00,0x01,0x09,0xee,0x09,0xee, -0x00,0x01,0x09,0xf0,0x09,0xf0,0x00,0x01,0x09,0xf2,0x09,0xf2,0x00,0x06,0x09,0xf9,0x09,0xf9,0x00,0x05,0x09,0xfa,0x09,0xfa,0x00,0x06,0x09,0xfd,0x09,0xfd,0x00,0x09,0x09,0xfe,0x0a,0x05,0x00,0x01,0x0a,0x07,0x0a,0x07,0x00,0x01,0x0a,0x0a,0x0a,0x0b,0x00,0x01,0x0a,0x0d,0x0a,0x0d,0x00,0x01,0x0a,0x24,0x0a,0x25,0x00,0x01,0x0a,0x26, -0x0a,0x27,0x00,0x02,0x0a,0x28,0x0a,0x28,0x00,0x07,0x0a,0x2a,0x0a,0x2a,0x00,0x02,0x0a,0x3e,0x0a,0x3e,0x00,0x08,0x0a,0x56,0x0a,0x56,0x00,0x01,0x0a,0x58,0x0a,0x58,0x00,0x02,0x0a,0x5a,0x0a,0x5a,0x00,0x02,0x0a,0x63,0x0a,0x63,0x00,0x01,0x0a,0x72,0x0a,0x72,0x00,0x02,0x0a,0x73,0x0a,0x73,0x00,0x06,0x0a,0x74,0x0a,0x74,0x00,0x02, -0x0a,0x76,0x0a,0x76,0x00,0x02,0x0a,0x77,0x0a,0x77,0x00,0x06,0x0a,0x78,0x0a,0x78,0x00,0x02,0x0a,0x79,0x0a,0x79,0x00,0x06,0x0a,0x7a,0x0a,0x7a,0x00,0x02,0x0a,0x7b,0x0a,0x7b,0x00,0x06,0x0a,0x7c,0x0a,0x7c,0x00,0x02,0x0a,0x7d,0x0a,0x7d,0x00,0x06,0x0a,0x7e,0x0a,0x7e,0x00,0x02,0x0a,0x7f,0x0a,0x7f,0x00,0x01,0x0a,0x80,0x0a,0x80, -0x00,0x06,0x0a,0x83,0x0a,0x83,0x00,0x06,0x0a,0x86,0x0a,0x87,0x00,0x02,0x0a,0x88,0x0a,0x8a,0x00,0x01,0x0a,0x8b,0x0a,0x8b,0x00,0x07,0x0a,0x8d,0x0a,0x8d,0x00,0x02,0x0a,0x8f,0x0a,0x8f,0x00,0x07,0x0a,0x91,0x0a,0x91,0x00,0x02,0x0a,0x93,0x0a,0x93,0x00,0x07,0x0a,0x95,0x0a,0x95,0x00,0x02,0x0a,0x9d,0x0a,0x9e,0x00,0x08,0x0a,0xa0, -0x0a,0xa1,0x00,0x08,0x0a,0xa3,0x0a,0xa3,0x00,0x08,0x0a,0xa6,0x0a,0xa9,0x00,0x02,0x0a,0xab,0x0a,0xab,0x00,0x06,0x0a,0xad,0x0a,0xad,0x00,0x01,0x0a,0xaf,0x0a,0xaf,0x00,0x01,0x0a,0xb2,0x0a,0xb2,0x00,0x01,0x0a,0xb4,0x0a,0xb7,0x00,0x01,0x0b,0x19,0x0b,0x19,0x00,0x02,0x0e,0x20,0x0e,0x20,0x00,0x01,0x0e,0x3a,0x0e,0x3a,0x00,0x02, -0x0e,0x3d,0x0e,0x3d,0x00,0x02,0x0e,0x3f,0x0e,0x3f,0x00,0x08,0x0e,0x41,0x0e,0x41,0x00,0x08,0x0e,0x43,0x0e,0x43,0x00,0x08,0x0e,0x47,0x0e,0x47,0x00,0x01,0x0e,0x49,0x0e,0x49,0x00,0x06,0x0e,0x4b,0x0e,0x4b,0x00,0x01,0x0e,0x4d,0x0e,0x4d,0x00,0x06,0x0e,0x4f,0x0e,0x4f,0x00,0x01,0x0e,0x51,0x0e,0x51,0x00,0x06,0x0e,0x5b,0x0e,0x5c, -0x00,0x02,0x0e,0x5f,0x0e,0x5f,0x00,0x02,0x0e,0x6f,0x0e,0x6f,0x00,0x02,0x0e,0x71,0x0e,0x71,0x00,0x02,0x0e,0x76,0x0e,0x76,0x00,0x01,0x0e,0xa3,0x0e,0xa3,0x00,0x02,0x0e,0xac,0x0e,0xac,0x00,0x02,0x0e,0xaf,0x0e,0xaf,0x00,0x02,0x0e,0xd1,0x0e,0xd1,0x00,0x05,0x0e,0xd7,0x0e,0xd7,0x00,0x02,0x0e,0xe7,0x0e,0xe7,0x00,0x06,0x0e,0xe9, -0x0e,0xe9,0x00,0x06,0x0f,0x16,0x0f,0x16,0x00,0x06,0x0f,0x1a,0x0f,0x1a,0x00,0x06,0x0f,0x1e,0x0f,0x1e,0x00,0x01,0x0f,0x20,0x0f,0x20,0x00,0x01,0x0f,0x22,0x0f,0x22,0x00,0x01,0x0f,0x24,0x0f,0x24,0x00,0x06,0x0f,0x28,0x0f,0x28,0x00,0x01,0x0f,0x2a,0x0f,0x2a,0x00,0x01,0x0f,0x2c,0x0f,0x2c,0x00,0x01,0x0f,0x2e,0x0f,0x2e,0x00,0x06, -0x0f,0x30,0x0f,0x30,0x00,0x01,0x0f,0x32,0x0f,0x32,0x00,0x06,0x0f,0x34,0x0f,0x34,0x00,0x01,0x0f,0x36,0x0f,0x36,0x00,0x06,0x0f,0x38,0x0f,0x38,0x00,0x01,0x0f,0x3a,0x0f,0x3a,0x00,0x01,0x0f,0x3c,0x0f,0x3c,0x00,0x0a,0x0f,0x3e,0x0f,0x3e,0x00,0x0a,0x0f,0x40,0x0f,0x40,0x00,0x06,0x0f,0x44,0x0f,0x44,0x00,0x01,0x0f,0x46,0x0f,0x46, -0x00,0x01,0x0f,0x48,0x0f,0x48,0x00,0x01,0x0f,0x4a,0x0f,0x4a,0x00,0x01,0x0f,0x4c,0x0f,0x4c,0x00,0x01,0x0f,0x4e,0x0f,0x4e,0x00,0x08,0x0f,0x6c,0x0f,0x6c,0x00,0x01,0x0f,0x6e,0x0f,0x6e,0x00,0x01,0x0f,0x70,0x0f,0x70,0x00,0x01,0x0f,0x72,0x0f,0x72,0x00,0x01,0x0f,0x74,0x0f,0x74,0x00,0x01,0x0f,0x76,0x0f,0x76,0x00,0x01,0x0f,0x78, -0x0f,0x78,0x00,0x01,0x0f,0x7a,0x0f,0x7a,0x00,0x01,0x0f,0x7c,0x0f,0x7c,0x00,0x01,0x0f,0x7e,0x0f,0x7e,0x00,0x01,0x0f,0x80,0x0f,0x80,0x00,0x01,0x0f,0x82,0x0f,0x82,0x00,0x02,0x0f,0x84,0x0f,0x84,0x00,0x02,0x0f,0x86,0x0f,0x86,0x00,0x02,0x0f,0x88,0x0f,0x88,0x00,0x02,0x0f,0x8a,0x0f,0x8a,0x00,0x02,0x0f,0x8c,0x0f,0x8c,0x00,0x01, -0x0f,0x8e,0x0f,0x8e,0x00,0x01,0x0f,0x90,0x0f,0x90,0x00,0x01,0x0f,0x92,0x0f,0x92,0x00,0x01,0x0f,0x94,0x0f,0x94,0x00,0x06,0x0f,0x96,0x0f,0x96,0x00,0x01,0x0f,0xc0,0x0f,0xc0,0x00,0x01,0x10,0xfe,0x10,0xfe,0x00,0x01,0x11,0x00,0x11,0x00,0x00,0x01,0x11,0x02,0x11,0x02,0x00,0x01,0x11,0x04,0x11,0x04,0x00,0x01,0x11,0x06,0x11,0x06, -0x00,0x01,0x11,0x08,0x11,0x08,0x00,0x01,0x11,0x0a,0x11,0x0a,0x00,0x01,0x11,0x0c,0x11,0x0d,0x00,0x01,0x11,0x0f,0x11,0x0f,0x00,0x01,0x14,0x53,0x14,0x53,0x00,0x07,0x14,0x54,0x14,0x54,0x00,0x01,0x14,0x55,0x14,0x57,0x00,0x02,0x14,0x58,0x14,0x59,0x00,0x01,0x14,0x5a,0x14,0x5b,0x00,0x02,0x14,0x6f,0x14,0x6f,0x00,0x02,0x14,0x72, -0x14,0x72,0x00,0x08,0x14,0x75,0x14,0x75,0x00,0x05,0x14,0x78,0x14,0x78,0x00,0x06,0x14,0x7b,0x14,0x7b,0x00,0x05,0x14,0x80,0x14,0x80,0x00,0x06,0x14,0x83,0x14,0x83,0x00,0x02,0x14,0x97,0x14,0x98,0x00,0x02,0x00,0x01,0x00,0x26,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x1a,0x00,0x20,0x00,0x20,0x00,0x1a,0x00,0x1a,0x00,0x20,0x00,0x20, -0x00,0x1a,0x00,0x01,0x08,0xdd,0xff,0x55,0x00,0x01,0x08,0xdb,0xff,0x55,0x00,0x02,0x00,0x06,0x08,0xd7,0x08,0xd7,0x00,0x00,0x08,0xd9,0x08,0xd9,0x00,0x01,0x08,0xde,0x08,0xdf,0x00,0x02,0x09,0x4f,0x09,0x4f,0x00,0x04,0x09,0x51,0x09,0x51,0x00,0x05,0x09,0x56,0x09,0x57,0x00,0x06,0x00,0x02,0x00,0x30,0x00,0x04,0x00,0x00,0x00,0x4c, -0x00,0x80,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0xfe,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0x00,0x02,0x00,0x04,0x08,0xd9,0x08,0xda,0x00,0x00,0x08,0xde,0x08,0xdf,0x00,0x02,0x09,0x51,0x09,0x53,0x00,0x04,0x09,0x55,0x09,0x57, -0x00,0x07,0x00,0x02,0x00,0x08,0x08,0xd9,0x08,0xda,0x00,0x01,0x08,0xde,0x08,0xde,0x00,0x01,0x08,0xdf,0x08,0xdf,0x00,0x03,0x09,0x51,0x09,0x52,0x00,0x01,0x09,0x53,0x09,0x53,0x00,0x02,0x09,0x55,0x09,0x55,0x00,0x02,0x09,0x56,0x09,0x56,0x00,0x01,0x09,0x57,0x09,0x57,0x00,0x03,0x00,0x02,0x00,0x0a,0x08,0xd7,0x08,0xd7,0x00,0x01, -0x08,0xdc,0x08,0xdc,0x00,0x01,0x08,0xde,0x08,0xde,0x00,0x02,0x08,0xdf,0x08,0xdf,0x00,0x03,0x08,0xe0,0x08,0xe0,0x00,0x02,0x09,0x4f,0x09,0x4f,0x00,0x01,0x09,0x54,0x09,0x55,0x00,0x01,0x09,0x56,0x09,0x56,0x00,0x02,0x09,0x57,0x09,0x57,0x00,0x03,0x09,0x58,0x09,0x58,0x00,0x02,0x00,0x01,0x10,0xc6,0x00,0x04,0x00,0x00,0x00,0x57, -0x00,0xb8,0x01,0xbe,0x01,0xe4,0x02,0x3e,0x02,0xa8,0x03,0x2a,0x03,0x70,0x03,0xa6,0x04,0xf0,0x06,0x16,0x06,0x9c,0x07,0x96,0x08,0x14,0x09,0x0a,0x09,0x50,0x0b,0x7a,0x0b,0xa8,0x0d,0x72,0x0e,0x88,0x0e,0xde,0x10,0x88,0x00,0xb8,0x00,0xb8,0x01,0xe4,0x06,0x16,0x0b,0x7a,0x06,0x16,0x00,0xb8,0x00,0xb8,0x06,0x16,0x06,0x16,0x0e,0xde, -0x00,0xb8,0x00,0xb8,0x06,0x16,0x06,0x16,0x06,0x16,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x09,0x0a,0x10,0x88,0x02,0x3e,0x0e,0xde,0x03,0x2a,0x09,0x0a,0x01,0xe4,0x01,0xe4,0x00,0xb8,0x00,0xb8,0x04,0xf0,0x06,0x16,0x08,0x14,0x08,0x14,0x09,0x0a,0x09,0x50,0x09,0x50,0x0b,0x7a,0x0b,0x7a,0x10,0x88,0x10,0x88,0x00,0xb8,0x01,0xe4,0x03,0x2a, -0x03,0x2a,0x03,0x2a,0x03,0x70,0x03,0xa6,0x04,0xf0,0x06,0x16,0x06,0x16,0x08,0x14,0x09,0x0a,0x09,0x50,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x0d,0x72,0x0e,0xde,0x00,0xb8,0x06,0x16,0x0d,0x72,0x0d,0x72,0x0d,0x72,0x0e,0xde,0x09,0x0a,0x00,0x41,0x00,0x26,0xff,0xd8,0x00,0x2a,0xff,0xd8,0x00,0x2d,0x00,0x5e,0x00,0x32,0xff,0xd8, -0x00,0x37,0xff,0x6d,0x00,0x38,0xff,0xd8,0x00,0x39,0xff,0x74,0x00,0x3a,0xff,0x74,0x00,0x3c,0xff,0x74,0x00,0x3d,0x00,0x3c,0x00,0x59,0xff,0xd8,0x00,0x5a,0xff,0xd8,0x00,0x5c,0xff,0xd8,0x00,0x64,0xff,0xd8,0x00,0x67,0xff,0xd8,0x00,0x68,0xff,0xd8,0x00,0x92,0xff,0xd8,0x00,0xaf,0xff,0xd8,0x00,0xb0,0xff,0xd8,0x00,0xba,0xff,0xd8, -0x00,0xbb,0xff,0x74,0x00,0xd0,0xff,0xd8,0x00,0xd1,0xff,0xd8,0x00,0xd2,0xff,0xd8,0x00,0xd3,0xff,0xd8,0x00,0xd4,0xff,0xd8,0x00,0xd5,0xff,0xd8,0x00,0xe5,0x00,0x3c,0x00,0xea,0xff,0x74,0x00,0xeb,0xff,0xd8,0x00,0xf7,0xff,0xd8,0x00,0xfc,0xff,0xd8,0x00,0xfe,0xff,0xd8,0x01,0x18,0xff,0xd8,0x01,0x20,0xff,0x6d,0x01,0x22,0xff,0x6d, -0x01,0x24,0xff,0xd8,0x01,0x26,0xff,0xd8,0x01,0x28,0x00,0x3c,0x01,0x2a,0x00,0x3c,0x01,0x47,0xff,0xd8,0x01,0x51,0xff,0xd8,0x01,0x53,0xff,0xd8,0x01,0x55,0xff,0xd8,0x01,0x63,0x00,0x5e,0x01,0x6e,0xff,0xd8,0x01,0x70,0xff,0xd8,0x01,0x76,0xff,0x6d,0x01,0x78,0xff,0xd8,0x01,0x7a,0xff,0xd8,0x01,0x7c,0xff,0xd8,0x01,0x7e,0xff,0xd8, -0x01,0x80,0xff,0x74,0x01,0x81,0xff,0xd8,0x01,0x82,0xff,0x74,0x01,0x83,0xff,0xd8,0x01,0x89,0xff,0xd8,0x01,0x8c,0xff,0x74,0x01,0x8d,0xff,0xd8,0x01,0x8e,0xff,0x74,0x01,0x8f,0xff,0xd8,0x01,0x90,0xff,0x74,0x01,0x91,0xff,0xd8,0x01,0x92,0xff,0x74,0x01,0x93,0xff,0xd8,0x00,0x09,0x00,0x37,0xff,0xa4,0x00,0x3c,0xff,0xbe,0x00,0xbb, -0xff,0xbe,0x00,0xea,0xff,0xbe,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x76,0xff,0xa4,0x01,0x82,0xff,0xbe,0x01,0x92,0xff,0xbe,0x00,0x16,0x00,0x26,0xff,0xc9,0x00,0x2a,0xff,0xc9,0x00,0x32,0xff,0xc9,0x00,0x64,0xff,0xc9,0x00,0x67,0xff,0xc9,0x00,0x92,0xff,0xc9,0x00,0xaf,0xff,0xc9,0x00,0xb0,0xff,0xc9,0x00,0xd0,0xff,0xc9, -0x00,0xd1,0xff,0xc9,0x00,0xd2,0xff,0xc9,0x00,0xf7,0xff,0xc9,0x00,0xfc,0xff,0xc9,0x00,0xfe,0xff,0xc9,0x01,0x18,0xff,0xc9,0x01,0x47,0xff,0xc9,0x01,0x51,0xff,0xc9,0x01,0x53,0xff,0xc9,0x01,0x55,0xff,0xc9,0x01,0x6e,0xff,0xc9,0x01,0x70,0xff,0xc9,0x01,0x89,0xff,0xc9,0x00,0x1a,0x00,0x24,0xff,0xce,0x00,0x37,0xff,0xa4,0x00,0x39, -0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xc4,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a, -0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x85,0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e,0xff,0xce,0x01,0x90,0xff,0xce,0x00,0x20,0x00,0x24,0xff,0x88,0x00,0x2d,0xff,0xbe,0x00,0x44,0xff,0xba,0x00,0x62,0xff,0x88,0x00,0x63,0xff,0x88,0x00,0x69,0xff,0xba,0x00,0x6a,0xff,0xba,0x00,0x6b,0xff,0xba, -0x00,0x6c,0xff,0xba,0x00,0x6d,0xff,0xba,0x00,0x6e,0xff,0xba,0x00,0x75,0x00,0x32,0x00,0x76,0x00,0x32,0x00,0x77,0x00,0x32,0x00,0xa0,0xff,0xba,0x00,0xad,0xff,0x88,0x00,0xae,0xff,0x88,0x00,0xc7,0xff,0x88,0x00,0xc9,0xff,0x88,0x01,0x03,0xff,0x88,0x01,0x04,0xff,0xba,0x01,0x05,0xff,0x88,0x01,0x06,0xff,0xba,0x01,0x45,0xff,0x88, -0x01,0x46,0xff,0xba,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0xff,0xbe,0x01,0x85,0xff,0x88,0x01,0x86,0xff,0xba,0x01,0x88,0xff,0xba,0x00,0x11,0x00,0x37,0xff,0xcf,0x00,0x39,0xff,0xd8,0x00,0x3a,0xff,0xd8,0x00,0x3b,0xff,0xd8,0x00,0x5c,0xff,0xd8,0x00,0x5d,0xff,0xd8,0x00,0xba,0xff,0xd8,0x00,0xeb, -0xff,0xd8,0x01,0x20,0xff,0xcf,0x01,0x22,0xff,0xcf,0x01,0x76,0xff,0xcf,0x01,0x80,0xff,0xd8,0x01,0x83,0xff,0xd8,0x01,0x8c,0xff,0xd8,0x01,0x8e,0xff,0xd8,0x01,0x90,0xff,0xd8,0x01,0x93,0xff,0xd8,0x00,0x0d,0x00,0x24,0xff,0xce,0x00,0x2d,0xff,0xb0,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce, -0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x63,0xff,0xb0,0x01,0x85,0xff,0xce,0x00,0x52,0x00,0x26,0xff,0xa6,0x00,0x2a,0xff,0xa6,0x00,0x2d,0x00,0x5a,0x00,0x32,0xff,0xa6,0x00,0x39,0x00,0x28,0x00,0x3a,0x00,0x28,0x00,0x3b,0x00,0x32,0x00,0x3c,0x00,0x28,0x00,0x3d, -0x00,0x28,0x00,0x46,0xff,0xe5,0x00,0x47,0xff,0xe5,0x00,0x48,0xff,0xe5,0x00,0x4a,0xff,0xe5,0x00,0x52,0xff,0xce,0x00,0x54,0xff,0xce,0x00,0x57,0xff,0xd1,0x00,0x59,0xff,0xba,0x00,0x5a,0xff,0xba,0x00,0x5b,0x00,0x1e,0x00,0x5c,0xff,0xa6,0x00,0x64,0xff,0xa6,0x00,0x67,0xff,0xa6,0x00,0x79,0xff,0xce,0x00,0x7a,0xff,0xce,0x00,0x7b, -0xff,0xce,0x00,0x7c,0xff,0xce,0x00,0x7d,0xff,0xce,0x00,0x92,0xff,0xa6,0x00,0xaf,0xff,0xa6,0x00,0xb0,0xff,0xa6,0x00,0xb1,0xff,0xce,0x00,0xba,0xff,0xa6,0x00,0xbb,0x00,0x28,0x00,0xd0,0xff,0xa6,0x00,0xd1,0xff,0xa6,0x00,0xd2,0xff,0xa6,0x00,0xe5,0x00,0x28,0x00,0xea,0x00,0x28,0x00,0xeb,0xff,0xa6,0x00,0xf7,0xff,0xa6,0x00,0xf8, -0xff,0xe5,0x00,0xfc,0xff,0xa6,0x00,0xfd,0xff,0xe5,0x00,0xfe,0xff,0xa6,0x00,0xff,0xff,0xe5,0x01,0x00,0xff,0xe5,0x01,0x08,0xff,0xe5,0x01,0x0b,0xff,0xe5,0x01,0x18,0xff,0xa6,0x01,0x19,0xff,0xce,0x01,0x21,0xff,0xd1,0x01,0x23,0xff,0xd1,0x01,0x28,0x00,0x28,0x01,0x2a,0x00,0x28,0x01,0x47,0xff,0xa6,0x01,0x48,0xff,0xe5,0x01,0x51, -0xff,0xa6,0x01,0x52,0xff,0xe5,0x01,0x53,0xff,0xa6,0x01,0x54,0xff,0xe5,0x01,0x55,0xff,0xa6,0x01,0x56,0xff,0xe5,0x01,0x63,0x00,0x5a,0x01,0x6e,0xff,0xa6,0x01,0x6f,0xff,0xce,0x01,0x70,0xff,0xa6,0x01,0x71,0xff,0xce,0x01,0x77,0xff,0xd1,0x01,0x80,0x00,0x28,0x01,0x81,0xff,0xba,0x01,0x82,0x00,0x28,0x01,0x83,0xff,0xa6,0x01,0x89, -0xff,0xa6,0x01,0x8a,0xff,0xce,0x01,0x8c,0x00,0x28,0x01,0x8d,0xff,0xba,0x01,0x8e,0x00,0x28,0x01,0x8f,0xff,0xba,0x01,0x90,0x00,0x28,0x01,0x91,0xff,0xba,0x01,0x92,0x00,0x28,0x01,0x93,0xff,0xa6,0x00,0x49,0x00,0x24,0x00,0x3c,0x00,0x26,0xff,0xba,0x00,0x2a,0xff,0xbe,0x00,0x2d,0x00,0x64,0x00,0x32,0xff,0xba,0x00,0x37,0xff,0x74, -0x00,0x38,0xff,0xd8,0x00,0x39,0xff,0x88,0x00,0x3a,0xff,0x88,0x00,0x3c,0xff,0x88,0x00,0x3d,0x00,0x3b,0x00,0x57,0xff,0xe5,0x00,0x59,0xff,0x9c,0x00,0x5a,0xff,0x9c,0x00,0x5c,0xff,0x9c,0x00,0x62,0x00,0x3c,0x00,0x63,0x00,0x3c,0x00,0x64,0xff,0xba,0x00,0x68,0xff,0xd8,0x00,0xad,0x00,0x3c,0x00,0xae,0x00,0x3c,0x00,0xba,0xff,0x9c, -0x00,0xbb,0xff,0x88,0x00,0xc7,0x00,0x3c,0x00,0xc9,0x00,0x3c,0x00,0xd3,0xff,0xd8,0x00,0xd4,0xff,0xd8,0x00,0xd5,0xff,0xd8,0x00,0xe5,0x00,0x3b,0x00,0xea,0xff,0x88,0x00,0xeb,0xff,0x9c,0x00,0xf7,0xff,0xbe,0x00,0xfc,0xff,0xba,0x00,0xfe,0xff,0xba,0x01,0x03,0x00,0x3c,0x01,0x05,0x00,0x3c,0x01,0x18,0xff,0xba,0x01,0x20,0xff,0x74, -0x01,0x21,0xff,0xe5,0x01,0x22,0xff,0x74,0x01,0x23,0xff,0xe5,0x01,0x24,0xff,0xd8,0x01,0x26,0xff,0xd8,0x01,0x28,0x00,0x3b,0x01,0x2a,0x00,0x3b,0x01,0x45,0x00,0x3c,0x01,0x47,0xff,0xba,0x01,0x51,0xff,0xbe,0x01,0x53,0xff,0xbe,0x01,0x55,0xff,0xbe,0x01,0x63,0x00,0x64,0x01,0x6e,0xff,0xba,0x01,0x70,0xff,0xba,0x01,0x76,0xff,0x74, -0x01,0x77,0xff,0xe5,0x01,0x78,0xff,0xd8,0x01,0x7a,0xff,0xd8,0x01,0x7c,0xff,0xd8,0x01,0x7e,0xff,0xd8,0x01,0x80,0xff,0x88,0x01,0x81,0xff,0x9c,0x01,0x82,0xff,0x88,0x01,0x83,0xff,0x9c,0x01,0x85,0x00,0x3c,0x01,0x89,0xff,0xba,0x01,0x8c,0xff,0x88,0x01,0x8d,0xff,0x9c,0x01,0x8e,0xff,0x88,0x01,0x8f,0xff,0x9c,0x01,0x90,0xff,0x88, -0x01,0x91,0xff,0x9c,0x01,0x92,0xff,0x88,0x01,0x93,0xff,0x9c,0x00,0x21,0x00,0x24,0xff,0xce,0x00,0x2d,0xff,0xf6,0x00,0x37,0xff,0xa4,0x00,0x39,0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xce,0x00,0x3c,0xff,0xce,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xbb, -0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x00,0xea,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x63,0xff,0xf6,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x82,0xff,0xce,0x01,0x85, -0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e,0xff,0xce,0x01,0x90,0xff,0xce,0x01,0x92,0xff,0xce,0x00,0x3e,0x00,0x24,0xff,0x74,0x00,0x2d,0xff,0x7f,0x00,0x3b,0xff,0xce,0x00,0x44,0xff,0xba,0x00,0x46,0xff,0xb4,0x00,0x47,0xff,0xb4,0x00,0x48,0xff,0xb4,0x00,0x4a,0xff,0xb4,0x00,0x52,0xff,0xb4,0x00,0x54,0xff,0xb4,0x00,0x62,0xff,0x74, -0x00,0x63,0xff,0x74,0x00,0x69,0xff,0xba,0x00,0x6a,0xff,0xba,0x00,0x6b,0xff,0xba,0x00,0x6c,0xff,0xba,0x00,0x6d,0xff,0xba,0x00,0x6e,0xff,0xba,0x00,0x6f,0xff,0xb4,0x00,0x70,0xff,0xb4,0x00,0x71,0xff,0xb4,0x00,0x72,0xff,0xb4,0x00,0x73,0xff,0xb4,0x00,0x79,0xff,0xb4,0x00,0x7a,0xff,0xb4,0x00,0x7b,0xff,0xb4,0x00,0x7c,0xff,0xb4, -0x00,0x7d,0xff,0xb4,0x00,0xa0,0xff,0xba,0x00,0xad,0xff,0x74,0x00,0xae,0xff,0x74,0x00,0xb1,0xff,0xb4,0x00,0xc7,0xff,0x74,0x00,0xc9,0xff,0x74,0x00,0xf8,0xff,0xb4,0x00,0xfd,0xff,0xb4,0x00,0xff,0xff,0xb4,0x01,0x00,0xff,0xb4,0x01,0x03,0xff,0x74,0x01,0x04,0xff,0xba,0x01,0x05,0xff,0x74,0x01,0x06,0xff,0xba,0x01,0x08,0xff,0xb4, -0x01,0x0b,0xff,0xb4,0x01,0x0d,0xff,0xb4,0x01,0x19,0xff,0xb4,0x01,0x45,0xff,0x74,0x01,0x46,0xff,0xba,0x01,0x48,0xff,0xb4,0x01,0x4c,0xff,0xb4,0x01,0x4e,0xff,0xb4,0x01,0x50,0xff,0xb4,0x01,0x52,0xff,0xb4,0x01,0x54,0xff,0xb4,0x01,0x56,0xff,0xb4,0x01,0x63,0xff,0x7f,0x01,0x6f,0xff,0xb4,0x01,0x71,0xff,0xb4,0x01,0x85,0xff,0x74, -0x01,0x86,0xff,0xba,0x01,0x88,0xff,0xba,0x01,0x8a,0xff,0xb4,0x00,0x1f,0x00,0x24,0xff,0xce,0x00,0x37,0xff,0xa4,0x00,0x39,0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xce,0x00,0x3c,0xff,0xce,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xbb,0xff,0xce,0x00,0xc7, -0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x00,0xea,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x82,0xff,0xce,0x01,0x85,0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e, -0xff,0xce,0x01,0x90,0xff,0xce,0x01,0x92,0xff,0xce,0x00,0x3d,0x00,0x26,0xff,0xe3,0x00,0x2a,0xff,0xe3,0x00,0x2d,0x00,0x39,0x00,0x32,0xff,0xec,0x00,0x37,0xff,0xa4,0x00,0x3c,0xff,0xd9,0x00,0x46,0xff,0xc4,0x00,0x47,0xff,0xc4,0x00,0x48,0xff,0xc4,0x00,0x4a,0xff,0xc4,0x00,0x52,0xff,0xc4,0x00,0x54,0xff,0xcb,0x00,0x64,0xff,0xe3, -0x00,0x6f,0xff,0xc4,0x00,0x70,0xff,0xc4,0x00,0x71,0xff,0xc4,0x00,0x72,0xff,0xc4,0x00,0x73,0xff,0xc4,0x00,0x79,0xff,0xc4,0x00,0x7a,0xff,0xc4,0x00,0x7b,0xff,0xc4,0x00,0x7c,0xff,0xc4,0x00,0x7d,0xff,0xc4,0x00,0xb1,0xff,0xc4,0x00,0xbb,0xff,0xd9,0x00,0xea,0xff,0xd9,0x00,0xf7,0xff,0xe3,0x00,0xf8,0xff,0xc4,0x00,0xfc,0xff,0xe3, -0x00,0xfd,0xff,0xc4,0x00,0xfe,0xff,0xe3,0x00,0xff,0xff,0xc4,0x01,0x00,0xff,0xc4,0x01,0x08,0xff,0xc4,0x01,0x0b,0xff,0xc4,0x01,0x0d,0xff,0xc4,0x01,0x18,0xff,0xec,0x01,0x19,0xff,0xc4,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x47,0xff,0xe3,0x01,0x48,0xff,0xc4,0x01,0x4c,0xff,0xc4,0x01,0x4e,0xff,0xc4,0x01,0x50,0xff,0xc4, -0x01,0x51,0xff,0xe3,0x01,0x52,0xff,0xc4,0x01,0x53,0xff,0xe3,0x01,0x54,0xff,0xc4,0x01,0x55,0xff,0xe3,0x01,0x56,0xff,0xc4,0x01,0x63,0x00,0x39,0x01,0x6e,0xff,0xec,0x01,0x6f,0xff,0xc4,0x01,0x70,0xff,0xec,0x01,0x71,0xff,0xc4,0x01,0x76,0xff,0xa4,0x01,0x82,0xff,0xd9,0x01,0x89,0xff,0xec,0x01,0x8a,0xff,0xc4,0x01,0x92,0xff,0xd9, -0x00,0x11,0x00,0x57,0xff,0xbe,0x00,0x59,0xff,0xce,0x00,0x5a,0xff,0xe2,0x00,0x5b,0xff,0xe2,0x00,0x5c,0xff,0xc4,0x00,0x5d,0xff,0xc4,0x00,0xba,0xff,0xc4,0x00,0xeb,0xff,0xc4,0x01,0x21,0xff,0xbe,0x01,0x23,0xff,0xbe,0x01,0x77,0xff,0xbe,0x01,0x81,0xff,0xe2,0x01,0x83,0xff,0xc4,0x01,0x8d,0xff,0xe2,0x01,0x8f,0xff,0xe2,0x01,0x91, -0xff,0xe2,0x01,0x93,0xff,0xc4,0x00,0x8a,0x00,0x24,0xff,0x74,0x00,0x26,0xff,0xa1,0x00,0x2a,0xff,0xa1,0x00,0x2d,0xff,0x8f,0x00,0x32,0xff,0xa1,0x00,0x36,0xff,0xd8,0x00,0x37,0x00,0x28,0x00,0x39,0x00,0x2b,0x00,0x3a,0x00,0x2b,0x00,0x3c,0x00,0x28,0x00,0x44,0xff,0x1a,0x00,0x46,0xff,0x38,0x00,0x47,0xff,0x38,0x00,0x48,0xff,0x38, -0x00,0x49,0xff,0xa0,0x00,0x4a,0xff,0x38,0x00,0x50,0xff,0x4e,0x00,0x51,0xff,0x4e,0x00,0x52,0xff,0x38,0x00,0x53,0xff,0x4e,0x00,0x54,0xff,0x38,0x00,0x55,0xff,0x4e,0x00,0x56,0xff,0x66,0x00,0x59,0xff,0x9a,0x00,0x5a,0xff,0x8f,0x00,0x5b,0xff,0x4c,0x00,0x5c,0xff,0x8f,0x00,0x5d,0xff,0x8f,0x00,0x62,0xff,0x74,0x00,0x63,0xff,0x74, -0x00,0x64,0xff,0xa1,0x00,0x67,0xff,0xa1,0x00,0x69,0xff,0x1a,0x00,0x6a,0xff,0x1a,0x00,0x6b,0xff,0x1a,0x00,0x6c,0xff,0x38,0x00,0x6d,0xff,0x38,0x00,0x6e,0xff,0x1a,0x00,0x6f,0xff,0x38,0x00,0x70,0xff,0x38,0x00,0x71,0xff,0x38,0x00,0x72,0xff,0x38,0x00,0x73,0xff,0x38,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x32,0x00,0x77,0x00,0x32, -0x00,0x79,0xff,0x38,0x00,0x7a,0xff,0x38,0x00,0x7b,0xff,0x38,0x00,0x7c,0xff,0x38,0x00,0x7d,0xff,0x38,0x00,0x92,0xff,0xa1,0x00,0xa0,0xff,0x1a,0x00,0xad,0xff,0x74,0x00,0xae,0xff,0x74,0x00,0xaf,0xff,0xa1,0x00,0xb0,0xff,0xa1,0x00,0xb1,0xff,0x38,0x00,0xba,0xff,0x8f,0x00,0xbb,0x00,0x28,0x00,0xc7,0xff,0x74,0x00,0xc9,0xff,0x74, -0x00,0xd0,0xff,0xa1,0x00,0xd1,0xff,0xa1,0x00,0xd2,0xff,0xa1,0x00,0xe3,0xff,0xd8,0x00,0xe4,0xff,0x66,0x00,0xea,0x00,0x28,0x00,0xeb,0xff,0x8f,0x00,0xf7,0xff,0xa1,0x00,0xf8,0xff,0x38,0x00,0xfa,0xff,0xd8,0x00,0xfb,0xff,0x66,0x00,0xfc,0xff,0xa1,0x00,0xfd,0xff,0x38,0x00,0xfe,0xff,0xa1,0x00,0xff,0xff,0x38,0x01,0x00,0xff,0x38, -0x01,0x03,0xff,0x74,0x01,0x04,0xff,0x38,0x01,0x05,0xff,0x74,0x01,0x06,0xff,0x1a,0x01,0x08,0xff,0x38,0x01,0x0b,0xff,0x38,0x01,0x0d,0xff,0x38,0x01,0x18,0xff,0xa1,0x01,0x19,0xff,0x38,0x01,0x1b,0xff,0x4e,0x01,0x1d,0xff,0x4e,0x01,0x1e,0xff,0xd8,0x01,0x1f,0xff,0x66,0x01,0x20,0x00,0x28,0x01,0x22,0x00,0x28,0x01,0x45,0xff,0x74, -0x01,0x46,0xff,0x38,0x01,0x47,0xff,0xa1,0x01,0x48,0xff,0x38,0x01,0x4c,0xff,0x38,0x01,0x4e,0xff,0x38,0x01,0x50,0xff,0x38,0x01,0x51,0xff,0xa1,0x01,0x52,0xff,0x38,0x01,0x53,0xff,0xa1,0x01,0x54,0xff,0x38,0x01,0x55,0xff,0xa1,0x01,0x56,0xff,0x38,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0xff,0x8f, -0x01,0x6d,0xff,0x4e,0x01,0x6e,0xff,0xa1,0x01,0x6f,0xff,0x38,0x01,0x70,0xff,0xa1,0x01,0x71,0xff,0x38,0x01,0x73,0xff,0x4e,0x01,0x74,0xff,0xd8,0x01,0x75,0xff,0x66,0x01,0x76,0x00,0x28,0x01,0x80,0x00,0x2b,0x01,0x81,0xff,0x8f,0x01,0x82,0x00,0x28,0x01,0x83,0xff,0x8f,0x01,0x85,0xff,0x74,0x01,0x86,0xff,0x38,0x01,0x88,0xff,0x1a, -0x01,0x89,0xff,0xa1,0x01,0x8a,0xff,0x38,0x01,0x8c,0x00,0x2b,0x01,0x8d,0xff,0x8f,0x01,0x8e,0x00,0x2b,0x01,0x8f,0xff,0x8f,0x01,0x90,0x00,0x2b,0x01,0x91,0xff,0x8f,0x01,0x92,0x00,0x28,0x01,0x93,0xff,0x8f,0x02,0x3d,0xff,0xd8,0x02,0x3e,0xff,0x66,0x00,0x0b,0x00,0x24,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad, -0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x85,0xff,0xce,0x00,0x72,0x00,0x24,0xff,0x88,0x00,0x26,0xff,0xce,0x00,0x2a,0xff,0xce,0x00,0x2d,0xff,0xba,0x00,0x32,0xff,0xce,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0x6a,0x00,0x46,0xff,0x7e, -0x00,0x47,0xff,0x7e,0x00,0x48,0xff,0x7e,0x00,0x4a,0xff,0x7e,0x00,0x50,0xff,0xb0,0x00,0x51,0xff,0xb0,0x00,0x52,0xff,0x7e,0x00,0x53,0xff,0xb4,0x00,0x54,0xff,0x7e,0x00,0x55,0xff,0xb4,0x00,0x56,0xff,0xbe,0x00,0x58,0xff,0xce,0x00,0x62,0xff,0x88,0x00,0x63,0xff,0x88,0x00,0x64,0xff,0xce,0x00,0x67,0xff,0xce,0x00,0x69,0xff,0x6a, -0x00,0x6a,0xff,0x6a,0x00,0x6b,0xff,0x6a,0x00,0x6c,0xff,0x6a,0x00,0x6d,0xff,0x6a,0x00,0x6e,0xff,0x6a,0x00,0x6f,0xff,0x7e,0x00,0x70,0xff,0x7e,0x00,0x71,0xff,0x7e,0x00,0x72,0xff,0x7e,0x00,0x73,0xff,0x7e,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x1e,0x00,0x77,0x00,0x3c,0x00,0x79,0xff,0x7e,0x00,0x7a,0xff,0x7e,0x00,0x7b,0xff,0x7e, -0x00,0x7c,0xff,0x7e,0x00,0x7d,0xff,0x7e,0x00,0x92,0xff,0xce,0x00,0xa0,0xff,0x6a,0x00,0xad,0xff,0x88,0x00,0xae,0xff,0x88,0x00,0xaf,0xff,0xce,0x00,0xb0,0xff,0xce,0x00,0xb1,0xff,0x7e,0x00,0xc7,0xff,0x88,0x00,0xc9,0xff,0x88,0x00,0xd0,0xff,0xce,0x00,0xd1,0xff,0xce,0x00,0xd2,0xff,0xce,0x00,0xe4,0xff,0xbe,0x00,0xf7,0xff,0xce, -0x00,0xf8,0xff,0x7e,0x00,0xfb,0xff,0xbe,0x00,0xfc,0xff,0xce,0x00,0xfd,0xff,0x7e,0x00,0xfe,0xff,0xce,0x00,0xff,0xff,0x7e,0x01,0x00,0xff,0x7e,0x01,0x03,0xff,0x88,0x01,0x04,0xff,0x6a,0x01,0x05,0xff,0x88,0x01,0x06,0xff,0x6a,0x01,0x08,0xff,0x7e,0x01,0x0b,0xff,0x7e,0x01,0x0d,0xff,0x7e,0x01,0x18,0xff,0xce,0x01,0x19,0xff,0x7e, -0x01,0x1b,0xff,0xb4,0x01,0x1d,0xff,0xb4,0x01,0x1f,0xff,0xbe,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x25,0xff,0xce,0x01,0x27,0xff,0xce,0x01,0x45,0xff,0x88,0x01,0x46,0xff,0x6a,0x01,0x47,0xff,0xce,0x01,0x48,0xff,0x7e,0x01,0x4c,0xff,0x7e,0x01,0x4e,0xff,0x7e,0x01,0x50,0xff,0x7e,0x01,0x51,0xff,0xce,0x01,0x52,0xff,0x7e, -0x01,0x53,0xff,0xce,0x01,0x54,0xff,0x7e,0x01,0x55,0xff,0xce,0x01,0x56,0xff,0x7e,0x01,0x5c,0x00,0x3c,0x01,0x5e,0x00,0x3c,0x01,0x60,0x00,0x3c,0x01,0x63,0xff,0xba,0x01,0x6d,0xff,0xb0,0x01,0x6e,0xff,0xce,0x01,0x6f,0xff,0x7e,0x01,0x70,0xff,0xce,0x01,0x71,0xff,0x7e,0x01,0x73,0xff,0xb4,0x01,0x75,0xff,0xbe,0x01,0x76,0x00,0x27, -0x01,0x79,0xff,0xce,0x01,0x7b,0xff,0xce,0x01,0x7d,0xff,0xce,0x01,0x7f,0xff,0xce,0x01,0x85,0xff,0x88,0x01,0x86,0xff,0x6a,0x01,0x88,0xff,0x6a,0x01,0x89,0xff,0xce,0x01,0x8a,0xff,0x7e,0x02,0x3e,0xff,0xbe,0x00,0x45,0x00,0x24,0xff,0xb0,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0xb0,0x00,0x46,0xff,0xb0,0x00,0x47,0xff,0xb0,0x00,0x48, -0xff,0xb0,0x00,0x4a,0xff,0xb0,0x00,0x52,0xff,0xb0,0x00,0x54,0xff,0xb0,0x00,0x62,0xff,0xb0,0x00,0x63,0xff,0xb0,0x00,0x69,0xff,0xb0,0x00,0x6a,0xff,0xb0,0x00,0x6b,0xff,0xb0,0x00,0x6c,0xff,0xb0,0x00,0x6d,0xff,0xb0,0x00,0x6e,0xff,0xb0,0x00,0x6f,0xff,0xb0,0x00,0x70,0xff,0xb0,0x00,0x71,0xff,0xb0,0x00,0x72,0xff,0xb0,0x00,0x73, -0xff,0xb0,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x1e,0x00,0x77,0x00,0x3c,0x00,0x79,0xff,0xb0,0x00,0x7a,0xff,0xb0,0x00,0x7b,0xff,0xb0,0x00,0x7c,0xff,0xb0,0x00,0x7d,0xff,0xb0,0x00,0xa0,0xff,0xb0,0x00,0xad,0xff,0xb0,0x00,0xae,0xff,0xb0,0x00,0xb1,0xff,0xb0,0x00,0xc7,0xff,0xb0,0x00,0xc9,0xff,0xb0,0x00,0xf8,0xff,0xb0,0x00,0xfd, -0xff,0xb0,0x00,0xff,0xff,0xb0,0x01,0x00,0xff,0xb0,0x01,0x03,0xff,0xb0,0x01,0x04,0xff,0xb0,0x01,0x05,0xff,0xb0,0x01,0x06,0xff,0xb0,0x01,0x08,0xff,0xb0,0x01,0x0b,0xff,0xb0,0x01,0x0d,0xff,0xb0,0x01,0x19,0xff,0xb0,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x45,0xff,0xb0,0x01,0x46,0xff,0xb0,0x01,0x48,0xff,0xb0,0x01,0x4c, -0xff,0xb0,0x01,0x4e,0xff,0xb0,0x01,0x50,0xff,0xb0,0x01,0x52,0xff,0xb0,0x01,0x54,0xff,0xb0,0x01,0x56,0xff,0xb0,0x01,0x5c,0x00,0x3c,0x01,0x5e,0x00,0x3c,0x01,0x60,0x00,0x3c,0x01,0x6f,0xff,0xb0,0x01,0x71,0xff,0xb0,0x01,0x76,0x00,0x27,0x01,0x85,0xff,0xb0,0x01,0x86,0xff,0xb0,0x01,0x88,0xff,0xb0,0x01,0x8a,0xff,0xb0,0x00,0x15, -0x00,0x26,0xff,0xe9,0x00,0x2a,0xff,0xe9,0x00,0x2d,0x00,0x60,0x00,0x32,0xff,0xe9,0x00,0x37,0x00,0x21,0x00,0x64,0xff,0xe9,0x00,0xf7,0xff,0xe9,0x00,0xfc,0xff,0xe9,0x00,0xfe,0xff,0xe9,0x01,0x18,0xff,0xe9,0x01,0x20,0x00,0x21,0x01,0x22,0x00,0x21,0x01,0x47,0xff,0xe9,0x01,0x51,0xff,0xe9,0x01,0x53,0xff,0xe9,0x01,0x55,0xff,0xe9, -0x01,0x63,0x00,0x60,0x01,0x6e,0xff,0xe9,0x01,0x70,0xff,0xe9,0x01,0x76,0x00,0x21,0x01,0x89,0xff,0xe9,0x00,0x6a,0x00,0x24,0xff,0x60,0x00,0x26,0xff,0xb0,0x00,0x2a,0xff,0xb0,0x00,0x2d,0xff,0xbe,0x00,0x32,0xff,0xb0,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0x4c,0x00,0x46,0xff,0x4c,0x00,0x47,0xff,0x4c,0x00,0x48,0xff,0x4c,0x00,0x49, -0xff,0xe5,0x00,0x4a,0xff,0x4c,0x00,0x50,0xff,0x73,0x00,0x51,0xff,0x73,0x00,0x52,0xff,0x4c,0x00,0x53,0xff,0x74,0x00,0x54,0xff,0x4c,0x00,0x55,0xff,0x73,0x00,0x56,0xff,0x7b,0x00,0x62,0xff,0x60,0x00,0x63,0xff,0x60,0x00,0x64,0xff,0xb0,0x00,0x67,0xff,0xb0,0x00,0x69,0xff,0x4c,0x00,0x6a,0xff,0x4c,0x00,0x6b,0xff,0x4c,0x00,0x6c, -0xff,0x4c,0x00,0x6d,0xff,0x4c,0x00,0x6e,0xff,0x4c,0x00,0x6f,0xff,0x4c,0x00,0x70,0xff,0x4c,0x00,0x71,0xff,0x4c,0x00,0x72,0xff,0x4c,0x00,0x73,0xff,0x4c,0x00,0x77,0x00,0x32,0x00,0x79,0xff,0x4c,0x00,0x7a,0xff,0x4c,0x00,0x7b,0xff,0x4c,0x00,0x7c,0xff,0x4c,0x00,0x7d,0xff,0x4c,0x00,0x92,0xff,0xb0,0x00,0xa0,0xff,0x4c,0x00,0xad, -0xff,0x60,0x00,0xae,0xff,0x60,0x00,0xaf,0xff,0xb0,0x00,0xb0,0xff,0xb0,0x00,0xb1,0xff,0x4c,0x00,0xc7,0xff,0x60,0x00,0xc9,0xff,0x60,0x00,0xd0,0xff,0xb0,0x00,0xd1,0xff,0xb0,0x00,0xd2,0xff,0xb0,0x00,0xe4,0xff,0x7b,0x00,0xf7,0xff,0xb0,0x00,0xf8,0xff,0x4c,0x00,0xfb,0xff,0x7b,0x00,0xfc,0xff,0xb0,0x00,0xfd,0xff,0x4c,0x00,0xfe, -0xff,0xb0,0x00,0xff,0xff,0x4c,0x01,0x00,0xff,0x4c,0x01,0x03,0xff,0x60,0x01,0x04,0xff,0x4c,0x01,0x05,0xff,0x60,0x01,0x06,0xff,0x4c,0x01,0x08,0xff,0x4c,0x01,0x0b,0xff,0x4c,0x01,0x0d,0xff,0x4c,0x01,0x18,0xff,0xb0,0x01,0x19,0xff,0x4c,0x01,0x1b,0xff,0x73,0x01,0x1d,0xff,0x73,0x01,0x1f,0xff,0x7b,0x01,0x20,0x00,0x27,0x01,0x22, -0x00,0x27,0x01,0x45,0xff,0x60,0x01,0x46,0xff,0x4c,0x01,0x47,0xff,0xb0,0x01,0x48,0xff,0x4c,0x01,0x4c,0xff,0x4c,0x01,0x4e,0xff,0x4c,0x01,0x50,0xff,0x4c,0x01,0x51,0xff,0xb0,0x01,0x52,0xff,0x4c,0x01,0x53,0xff,0xb0,0x01,0x54,0xff,0x4c,0x01,0x55,0xff,0xb0,0x01,0x56,0xff,0x4c,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60, -0x00,0x32,0x01,0x63,0xff,0xbe,0x01,0x6d,0xff,0x73,0x01,0x6e,0xff,0xb0,0x01,0x6f,0xff,0x4c,0x01,0x70,0xff,0xb0,0x01,0x71,0xff,0x4c,0x01,0x73,0xff,0x73,0x01,0x75,0xff,0x7b,0x01,0x76,0x00,0x27,0x01,0x85,0xff,0x60,0x01,0x86,0xff,0x4c,0x01,0x88,0xff,0x4c,0x01,0x89,0xff,0xb0,0x01,0x8a,0xff,0x4c,0x02,0x3e,0xff,0x7b,0x00,0x0f, -0x00,0x2d,0x00,0x52,0x00,0x37,0x00,0x27,0x00,0x5c,0xff,0xcb,0x00,0x77,0x00,0x32,0x00,0xba,0xff,0xcb,0x00,0xeb,0xff,0xcb,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0x00,0x52,0x01,0x76,0x00,0x27,0x01,0x83,0xff,0xcb,0x01,0x93,0xff,0xcb,0x00,0x02,0x00,0x3b, -0x00,0x24,0x00,0x27,0x00,0x00,0x00,0x29,0x00,0x2a,0x00,0x04,0x00,0x2d,0x00,0x2f,0x00,0x06,0x00,0x32,0x00,0x3d,0x00,0x09,0x00,0x62,0x00,0x64,0x00,0x15,0x00,0x67,0x00,0x68,0x00,0x18,0x00,0x92,0x00,0x92,0x00,0x1a,0x00,0xad,0x00,0xb0,0x00,0x1b,0x00,0xbb,0x00,0xbb,0x00,0x1f,0x00,0xc7,0x00,0xc7,0x00,0x20,0x00,0xc9,0x00,0xc9, -0x00,0x21,0x00,0xd0,0x00,0xd5,0x00,0x22,0x00,0xe3,0x00,0xe3,0x00,0x28,0x00,0xe5,0x00,0xe5,0x00,0x29,0x00,0xe8,0x00,0xe8,0x00,0x2a,0x00,0xea,0x00,0xea,0x00,0x2b,0x00,0xf7,0x00,0xf7,0x00,0x2c,0x00,0xfa,0x00,0xfa,0x00,0x2d,0x00,0xfc,0x00,0xfc,0x00,0x2e,0x00,0xfe,0x00,0xfe,0x00,0x2f,0x01,0x03,0x01,0x03,0x00,0x30,0x01,0x05, -0x01,0x05,0x00,0x31,0x01,0x0e,0x01,0x0e,0x00,0x32,0x01,0x18,0x01,0x18,0x00,0x33,0x01,0x1a,0x01,0x1a,0x00,0x34,0x01,0x1c,0x01,0x1c,0x00,0x35,0x01,0x1e,0x01,0x1e,0x00,0x36,0x01,0x20,0x01,0x20,0x00,0x37,0x01,0x22,0x01,0x22,0x00,0x38,0x01,0x24,0x01,0x24,0x00,0x39,0x01,0x26,0x01,0x26,0x00,0x3a,0x01,0x28,0x01,0x28,0x00,0x3b, -0x01,0x2a,0x01,0x2a,0x00,0x3c,0x01,0x45,0x01,0x45,0x00,0x3d,0x01,0x47,0x01,0x47,0x00,0x3e,0x01,0x51,0x01,0x51,0x00,0x3f,0x01,0x53,0x01,0x53,0x00,0x40,0x01,0x55,0x01,0x55,0x00,0x41,0x01,0x63,0x01,0x63,0x00,0x42,0x01,0x65,0x01,0x65,0x00,0x43,0x01,0x68,0x01,0x68,0x00,0x44,0x01,0x6e,0x01,0x6e,0x00,0x45,0x01,0x70,0x01,0x70, -0x00,0x46,0x01,0x72,0x01,0x72,0x00,0x47,0x01,0x74,0x01,0x74,0x00,0x48,0x01,0x76,0x01,0x76,0x00,0x49,0x01,0x78,0x01,0x78,0x00,0x4a,0x01,0x7a,0x01,0x7a,0x00,0x4b,0x01,0x7c,0x01,0x7c,0x00,0x4c,0x01,0x7e,0x01,0x7e,0x00,0x4d,0x01,0x80,0x01,0x80,0x00,0x4e,0x01,0x82,0x01,0x82,0x00,0x4f,0x01,0x85,0x01,0x85,0x00,0x50,0x01,0x89, -0x01,0x89,0x00,0x51,0x01,0x8c,0x01,0x8c,0x00,0x52,0x01,0x8e,0x01,0x8e,0x00,0x53,0x01,0x90,0x01,0x90,0x00,0x54,0x01,0x92,0x01,0x92,0x00,0x55,0x02,0x3d,0x02,0x3d,0x00,0x56,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24,0x00,0x48,0x00,0x02,0x00,0x4c,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x62,0x00,0x68,0x00,0x1a,0x00,0x91,0x00,0x92, -0x00,0x21,0x00,0xad,0x00,0xb0,0x00,0x23,0x00,0xbb,0x00,0xbb,0x00,0x27,0x00,0xc7,0x00,0xd5,0x00,0x28,0x00,0xe1,0x00,0xe1,0x00,0x37,0x00,0xe3,0x00,0xe3,0x00,0x38,0x00,0xe5,0x00,0xe5,0x00,0x39,0x00,0xe8,0x00,0xe8,0x00,0x3a,0x00,0xea,0x00,0xea,0x00,0x3b,0x00,0xec,0x00,0xec,0x00,0x3c,0x00,0xf7,0x00,0xf7,0x00,0x3d,0x00,0xf9, -0x00,0xfa,0x00,0x3e,0x00,0xfc,0x00,0xfc,0x00,0x40,0x00,0xfe,0x00,0xfe,0x00,0x41,0x01,0x03,0x01,0x03,0x00,0x42,0x01,0x05,0x01,0x05,0x00,0x43,0x01,0x07,0x01,0x07,0x00,0x44,0x01,0x09,0x01,0x0a,0x00,0x45,0x01,0x0c,0x01,0x0c,0x00,0x47,0x01,0x0e,0x01,0x0e,0x00,0x48,0x01,0x10,0x01,0x10,0x00,0x49,0x01,0x12,0x01,0x12,0x00,0x4a, -0x01,0x14,0x01,0x14,0x00,0x4b,0x01,0x16,0x01,0x16,0x00,0x4c,0x01,0x18,0x01,0x18,0x00,0x4d,0x01,0x1a,0x01,0x1a,0x00,0x4e,0x01,0x1c,0x01,0x1c,0x00,0x4f,0x01,0x1e,0x01,0x1e,0x00,0x50,0x01,0x20,0x01,0x20,0x00,0x51,0x01,0x22,0x01,0x22,0x00,0x52,0x01,0x24,0x01,0x24,0x00,0x53,0x01,0x26,0x01,0x26,0x00,0x54,0x01,0x28,0x01,0x28, -0x00,0x55,0x01,0x2a,0x01,0x2a,0x00,0x56,0x01,0x39,0x01,0x39,0x00,0x57,0x01,0x45,0x01,0x45,0x00,0x58,0x01,0x47,0x01,0x47,0x00,0x59,0x01,0x49,0x01,0x49,0x00,0x5a,0x01,0x4b,0x01,0x4b,0x00,0x5b,0x01,0x4d,0x01,0x4d,0x00,0x5c,0x01,0x4f,0x01,0x4f,0x00,0x5d,0x01,0x51,0x01,0x51,0x00,0x5e,0x01,0x53,0x01,0x53,0x00,0x5f,0x01,0x55, -0x01,0x55,0x00,0x60,0x01,0x57,0x01,0x57,0x00,0x61,0x01,0x59,0x01,0x59,0x00,0x62,0x01,0x5b,0x01,0x5b,0x00,0x63,0x01,0x5d,0x01,0x5d,0x00,0x64,0x01,0x5f,0x01,0x5f,0x00,0x65,0x01,0x61,0x01,0x61,0x00,0x66,0x01,0x63,0x01,0x63,0x00,0x67,0x01,0x65,0x01,0x65,0x00,0x68,0x01,0x68,0x01,0x68,0x00,0x69,0x01,0x6a,0x01,0x6a,0x00,0x6a, -0x01,0x6c,0x01,0x6c,0x00,0x6b,0x01,0x6e,0x01,0x6e,0x00,0x6c,0x01,0x70,0x01,0x70,0x00,0x6d,0x01,0x72,0x01,0x72,0x00,0x6e,0x01,0x74,0x01,0x74,0x00,0x6f,0x01,0x76,0x01,0x76,0x00,0x70,0x01,0x78,0x01,0x78,0x00,0x71,0x01,0x7a,0x01,0x7a,0x00,0x72,0x01,0x7c,0x01,0x7c,0x00,0x73,0x01,0x7e,0x01,0x7e,0x00,0x74,0x01,0x80,0x01,0x80, -0x00,0x75,0x01,0x82,0x01,0x82,0x00,0x76,0x01,0x85,0x01,0x85,0x00,0x77,0x01,0x87,0x01,0x87,0x00,0x78,0x01,0x89,0x01,0x89,0x00,0x79,0x01,0x8c,0x01,0x8c,0x00,0x7a,0x01,0x8e,0x01,0x8e,0x00,0x7b,0x01,0x90,0x01,0x90,0x00,0x7c,0x01,0x92,0x01,0x92,0x00,0x7d,0x0b,0x21,0x0b,0x21,0x00,0x7e,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24, -0x00,0x48,0x00,0x02,0x00,0x02,0x01,0xdb,0x02,0x06,0x00,0x00,0x02,0x33,0x02,0x33,0x00,0x2c,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24,0x00,0x48,0x00,0x02,0x00,0x04,0x00,0xa9,0x00,0xa9,0x00,0x00,0x01,0x2c,0x01,0x2e,0x00,0x01,0x01,0xa1,0x01,0xa7,0x00,0x04,0x01,0xa9,0x01,0xbe,0x00,0x0b,0x00,0x02,0x00,0x26,0x00,0x02,0x00,0x0f, -0x00,0x8c,0x00,0x8c,0x00,0x6e,0x00,0x8c,0x00,0x8c,0x00,0x8c,0x00,0x8c,0x01,0x96,0x01,0x96,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x02,0x00,0x0b,0x00,0x0b,0x00,0x0c,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x02,0x00,0x3e,0x00,0x3e,0x00,0x03,0x00,0x40,0x00,0x40,0x00,0x04,0x00,0x5e,0x00,0x5e,0x00,0x05, -0x00,0x60,0x00,0x60,0x00,0x06,0x00,0xa2,0x00,0xa2,0x00,0x07,0x00,0xa4,0x00,0xa4,0x00,0x08,0x00,0xaa,0x00,0xab,0x00,0x09,0x00,0xb2,0x00,0xb3,0x00,0x0b,0x00,0xbe,0x00,0xbf,0x00,0x0d,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x02,0x00,0x02,0x0f,0x2c,0x0f,0x2d,0x00,0x00, -0x0f,0x30,0x0f,0x31,0x00,0x02,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4b,0x00,0x01,0x00,0x02,0x0a,0x07,0x0a,0x08,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x8e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x02, -0x00,0x14,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x0c,0x09,0x0c,0x00,0x03,0x09,0x2a,0x09,0x2b,0x00,0x04,0x09,0x4a,0x09,0x4b,0x00,0x06,0x09,0x8a,0x09,0x8b,0x00,0x08,0x0a,0x05,0x0a,0x08,0x00,0x0a,0x0a,0x0b,0x0a,0x0e,0x00,0x0e,0x0e,0x20,0x0e,0x21,0x00,0x12,0x0e,0x4b, -0x0e,0x4c,0x00,0x14,0x0e,0x4f,0x0e,0x50,0x00,0x16,0x0f,0x2c,0x0f,0x2d,0x00,0x18,0x0f,0x30,0x0f,0x31,0x00,0x1a,0x0f,0x34,0x0f,0x35,0x00,0x1c,0x13,0x1c,0x13,0x1c,0x00,0x1e,0x13,0x1f,0x13,0x20,0x00,0x1f,0x13,0x23,0x13,0x23,0x00,0x21,0x14,0x59,0x14,0x59,0x00,0x22,0x14,0x7e,0x14,0x7e,0x00,0x23,0x00,0x01,0x00,0x01,0x09,0x73, -0x00,0x01,0x03,0x7e,0x00,0x05,0x00,0x00,0x00,0x2e,0x00,0x66,0x00,0xd4,0x01,0x48,0x02,0x04,0x02,0x84,0x02,0x84,0x02,0x84,0x01,0x48,0x02,0x84,0x02,0x92,0x02,0x92,0x02,0x9a,0x02,0x92,0x02,0xc6,0x03,0x76,0x02,0x84,0x02,0x84,0x01,0x48,0x01,0x48,0x00,0x66,0x01,0x48,0x02,0x84,0x01,0x48,0x01,0x48,0x02,0xc6,0x02,0xc6,0x02,0xc6, -0x02,0xc6,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x01,0x48,0x02,0x84,0x02,0x84,0x01,0x48,0x02,0x84,0x01,0x48,0x02,0xc6,0x02,0x84,0x01,0x48,0x00,0x66,0x01,0x48,0x01,0x48,0x01,0x48,0x01,0x48,0x00,0x12,0x0b,0x6b,0xff,0xec,0xff,0xec,0x0b,0x74,0xff,0xec,0xff,0xec,0x0b,0x7a,0xff,0xec,0xff,0xec,0x0b,0x7f,0xff,0xec,0xff,0xec, -0x0b,0x81,0xff,0xec,0xff,0xec,0x0b,0x8a,0xff,0xec,0xff,0xec,0x0b,0x8b,0xff,0xec,0xff,0xec,0x0b,0x8d,0xff,0xec,0xff,0xec,0x0b,0x8f,0xff,0xec,0xff,0xec,0x0b,0x92,0xff,0xec,0xff,0xec,0x0b,0x97,0xff,0xec,0xff,0xec,0x0b,0x98,0xff,0xec,0xff,0xec,0x0b,0x99,0xff,0xec,0xff,0xec,0x0b,0x9a,0xff,0xec,0xff,0xec,0x0b,0xa0,0xff,0xec, -0xff,0xec,0x0b,0xaf,0xff,0xec,0xff,0xec,0x0b,0xb1,0xff,0xec,0xff,0xec,0x0b,0xbb,0xff,0xec,0xff,0xec,0x00,0x13,0x0b,0x6b,0xff,0xec,0xff,0xec,0x0b,0x71,0xff,0xec,0xff,0xec,0x0b,0x74,0xff,0xec,0xff,0xec,0x0b,0x7a,0xff,0xec,0xff,0xec,0x0b,0x7f,0xff,0xec,0xff,0xec,0x0b,0x81,0xff,0xec,0xff,0xec,0x0b,0x8a,0xff,0xec,0xff,0xec, -0x0b,0x8b,0xff,0xec,0xff,0xec,0x0b,0x8d,0xff,0xec,0xff,0xec,0x0b,0x8f,0xff,0xec,0xff,0xec,0x0b,0x92,0xff,0xec,0xff,0xec,0x0b,0x97,0xff,0xec,0xff,0xec,0x0b,0x98,0xff,0xec,0xff,0xec,0x0b,0x99,0xff,0xec,0xff,0xec,0x0b,0x9a,0xff,0xec,0xff,0xec,0x0b,0xa0,0xff,0xec,0xff,0xec,0x0b,0xaf,0xff,0xec,0xff,0xec,0x0b,0xb1,0xff,0xec, -0xff,0xec,0x0b,0xbb,0xff,0xec,0xff,0xec,0x00,0x1f,0x0b,0x69,0xff,0xce,0xff,0xce,0x0b,0x6a,0xff,0xce,0xff,0xce,0x0b,0x6c,0xff,0xce,0xff,0xce,0x0b,0x6e,0x00,0x28,0x00,0x28,0x0b,0x6f,0xff,0xce,0xff,0xce,0x0b,0x70,0xff,0xd8,0xff,0xd8,0x0b,0x73,0xff,0xd8,0xff,0xd8,0x0b,0x75,0xff,0xce,0xff,0xce,0x0b,0x76,0xff,0xce,0xff,0xce, -0x0b,0x78,0xff,0xce,0xff,0xce,0x0b,0x79,0xff,0xd8,0xff,0xd8,0x0b,0x7b,0xff,0xce,0xff,0xce,0x0b,0x7c,0xff,0xd8,0xff,0xd8,0x0b,0x7d,0x00,0x14,0x00,0x14,0x0b,0x82,0xff,0xce,0xff,0xce,0x0b,0x90,0xff,0xce,0xff,0xce,0x0b,0x91,0xff,0xd8,0xff,0xd8,0x0b,0x93,0xff,0xce,0xff,0xce,0x0b,0x94,0xff,0xce,0xff,0xce,0x0b,0x95,0xff,0xce, -0xff,0xce,0x0b,0x9f,0xff,0xce,0xff,0xce,0x0b,0xa1,0xff,0xce,0xff,0xce,0x0b,0xa4,0xff,0xd8,0xff,0xd8,0x0b,0xa6,0xff,0xce,0xff,0xce,0x0b,0xa7,0xff,0xd8,0xff,0xd8,0x0b,0xa9,0xff,0xce,0xff,0xce,0x0b,0xab,0xff,0xd8,0xff,0xd8,0x0b,0xac,0xff,0xce,0xff,0xce,0x0b,0xad,0xff,0xd8,0xff,0xd8,0x0b,0xb0,0xff,0xce,0xff,0xce,0x0b,0xb2, -0xff,0xce,0xff,0xce,0x00,0x15,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x6c,0xff,0xec,0xff,0xec,0x0b,0x6e,0x00,0x14,0x00,0x14,0x0b,0x6f,0xff,0xec,0xff,0xec,0x0b,0x75,0xff,0xec,0xff,0xec,0x0b,0x76,0xff,0xec,0xff,0xec,0x0b,0x78,0xff,0xec,0xff,0xec,0x0b,0x7b,0xff,0xec,0xff,0xec,0x0b,0x7d,0x00,0x14,0x00,0x14,0x0b,0x82,0xff,0xec, -0xff,0xec,0x0b,0x90,0xff,0xec,0xff,0xec,0x0b,0x93,0xff,0xec,0xff,0xec,0x0b,0x94,0xff,0xec,0xff,0xec,0x0b,0x95,0xff,0xec,0xff,0xec,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x0b,0xa1,0xff,0xec,0xff,0xec,0x0b,0xa6,0xff,0xec,0xff,0xec,0x0b,0xa9,0xff,0xec,0xff,0xec,0x0b,0xac,0xff,0xec,0xff,0xec,0x0b,0xb0,0xff,0xec,0xff,0xec,0x0b,0xb2, -0xff,0xec,0xff,0xec,0x00,0x02,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x00,0x01,0x0b,0x6e,0x00,0x14,0x00,0x14,0x00,0x07,0x0b,0x79,0xff,0xe2,0xff,0xe2,0x0b,0x7c,0xff,0xe2,0xff,0xe2,0x0b,0x91,0xff,0xe2,0xff,0xe2,0x0b,0xa4,0xff,0xe2,0xff,0xe2,0x0b,0xa7,0xff,0xe2,0xff,0xe2,0x0b,0xab,0xff,0xe2,0xff,0xe2, -0x0b,0xad,0xff,0xe2,0xff,0xe2,0x00,0x1d,0x0b,0x69,0xff,0xec,0xff,0xec,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x6c,0xff,0xec,0xff,0xec,0x0b,0x6f,0xff,0xec,0xff,0xec,0x0b,0x70,0xff,0xec,0xff,0xec,0x0b,0x73,0xff,0xec,0xff,0xec,0x0b,0x75,0xff,0xec,0xff,0xec,0x0b,0x76,0xff,0xec,0xff,0xec,0x0b,0x78,0xff,0xec,0xff,0xec,0x0b,0x79, -0xff,0xec,0xff,0xec,0x0b,0x7b,0xff,0xec,0xff,0xec,0x0b,0x7c,0xff,0xec,0xff,0xec,0x0b,0x82,0xff,0xec,0xff,0xec,0x0b,0x90,0xff,0xec,0xff,0xec,0x0b,0x91,0xff,0xec,0xff,0xec,0x0b,0x93,0xff,0xec,0xff,0xec,0x0b,0x94,0xff,0xec,0xff,0xec,0x0b,0x95,0xff,0xec,0xff,0xec,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x0b,0xa1,0xff,0xec,0xff,0xec, -0x0b,0xa4,0xff,0xec,0xff,0xec,0x0b,0xa6,0xff,0xec,0xff,0xec,0x0b,0xa7,0xff,0xec,0xff,0xec,0x0b,0xa9,0xff,0xec,0xff,0xec,0x0b,0xab,0xff,0xec,0xff,0xec,0x0b,0xac,0xff,0xec,0xff,0xec,0x0b,0xad,0xff,0xec,0xff,0xec,0x0b,0xb0,0xff,0xec,0xff,0xec,0x0b,0xb2,0xff,0xec,0xff,0xec,0x00,0x01,0x0b,0x81,0xff,0xe2,0xff,0xe2,0x00,0x02, -0x00,0x16,0x0b,0x68,0x0b,0x68,0x00,0x00,0x0b,0x6a,0x0b,0x6b,0x00,0x01,0x0b,0x6e,0x0b,0x6e,0x00,0x03,0x0b,0x70,0x0b,0x71,0x00,0x04,0x0b,0x73,0x0b,0x74,0x00,0x06,0x0b,0x79,0x0b,0x7a,0x00,0x08,0x0b,0x7d,0x0b,0x7f,0x00,0x0a,0x0b,0x81,0x0b,0x82,0x00,0x0d,0x0b,0x84,0x0b,0x85,0x00,0x0f,0x0b,0x8a,0x0b,0x8b,0x00,0x11,0x0b,0x8e, -0x0b,0x8f,0x00,0x13,0x0b,0x91,0x0b,0x92,0x00,0x15,0x0b,0x94,0x0b,0x94,0x00,0x17,0x0b,0x97,0x0b,0x9d,0x00,0x18,0x0b,0x9f,0x0b,0xa0,0x00,0x1f,0x0b,0xa4,0x0b,0xa4,0x00,0x21,0x0b,0xa7,0x0b,0xa8,0x00,0x22,0x0b,0xab,0x0b,0xab,0x00,0x24,0x0b,0xb0,0x0b,0xb1,0x00,0x25,0x0b,0xb5,0x0b,0xb5,0x00,0x27,0x0b,0xb7,0x0b,0xb7,0x00,0x28, -0x0b,0xba,0x0b,0xbe,0x00,0x29,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x00,0x00,0x4d,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, -0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x02,0x00,0x44,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x4e,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x02,0x00,0x30,0x00,0x5e,0x00,0x01, -0x00,0x00,0x00,0x4e,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x02,0x00,0x1c,0x00,0x50,0x00,0x01,0x00,0x00,0x00,0x4e,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9, -0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x58,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x5a,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x02,0x00,0x4e,0x00,0x48,0x00,0x01,0x00,0x00,0x00,0x4f, -0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x3a,0x00,0x3a,0x00,0x34,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x05,0x0b,0x5f, -0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x30,0x00,0x02,0x02,0x36,0x02,0x3c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x1c,0x00,0x02,0x02,0x22,0x02,0x38,0x00,0x01, -0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x08,0x00,0x03,0x02,0x0e,0x02,0x2a,0x02,0x24,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xf2,0x00,0x02,0x01,0xf8,0x02,0x36,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xde,0x00,0x03,0x01,0xe4,0x02,0x00,0x02,0x22,0x00,0x01, -0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x01,0x02,0x12,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xb6,0x00,0x03,0x01,0xd8,0x01,0xbc,0x01,0xc2,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x04,0x01,0xc2,0x01,0xc2,0x01,0xa6,0x01,0xac,0x00,0x01, -0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x88,0x00,0x05,0x01,0xaa,0x01,0xaa,0x01,0xaa,0x01,0x8e,0x01,0x94,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x6e,0x00,0x03,0x01,0x90,0x01,0x74,0x01,0x8a,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x04,0x01,0x7a, -0x01,0x5e,0x01,0x7a,0x01,0x74,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x40,0x00,0x04,0x01,0x62,0x01,0x62,0x01,0x46,0x01,0x5c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x28,0x00,0x05,0x01,0x4a,0x01,0x4a,0x01,0x2e,0x01,0x4a,0x01,0x44,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03, -0x00,0x00,0x00,0x01,0x01,0x0e,0x00,0x05,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x14,0x01,0x2a,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf4,0x00,0x06,0x01,0x16,0x01,0x16,0x01,0x16,0x00,0xfa,0x01,0x16,0x01,0x10,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xd8,0x00,0x03,0x00,0xfa, -0x00,0xde,0x01,0x1c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xc2,0x00,0x04,0x00,0xe4,0x00,0xc8,0x00,0xe4,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xaa,0x00,0x04,0x00,0xcc,0x00,0xcc,0x00,0xb0,0x00,0xee,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01, -0x00,0x92,0x00,0x05,0x00,0xb4,0x00,0xb4,0x00,0x98,0x00,0xb4,0x00,0xd6,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x05,0x00,0x9a,0x00,0x9a,0x00,0x9a,0x00,0x7e,0x00,0xbc,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x06,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x64, -0x00,0x80,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x02,0x00,0x64,0x00,0x8c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x50,0x00,0x50,0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x3a, -0x00,0x3a,0x00,0x3a,0x00,0x62,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, -0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x3c,0x00,0x02,0x03,0x42,0x03,0x82,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x28,0x00,0x03,0x03,0xa8,0x03,0x2e,0x03,0x6e, -0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x12,0x00,0x04,0x03,0x92,0x03,0x92,0x03,0x18,0x03,0x58,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xfa,0x00,0x03,0x03,0x00,0x03,0x9c,0x03,0xa2,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x04,0x03,0x64, -0x02,0xea,0x03,0x86,0x03,0x8c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xcc,0x00,0x05,0x03,0x4c,0x03,0x4c,0x02,0xd2,0x03,0x6e,0x03,0x74,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xb2,0x00,0x02,0x02,0xb8,0x03,0x6a,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01, -0x02,0x9e,0x00,0x03,0x03,0x1e,0x02,0xa4,0x03,0x56,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x88,0x00,0x04,0x03,0x08,0x03,0x08,0x02,0x8e,0x03,0x40,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x70,0x00,0x03,0x02,0x76,0x03,0x12,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03, -0x00,0x00,0x00,0x01,0x02,0x5a,0x00,0x04,0x02,0xda,0x02,0x60,0x02,0xfc,0x03,0x18,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x42,0x00,0x05,0x02,0xc2,0x02,0xc2,0x02,0x48,0x02,0xe4,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x28,0x00,0x03,0x02,0x2e,0x02,0xca,0x02,0xec, -0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x12,0x00,0x04,0x02,0x92,0x02,0x18,0x02,0xb4,0x02,0xd6,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xfa,0x00,0x05,0x02,0x7a,0x02,0x7a,0x02,0x00,0x02,0x9c,0x02,0xbe,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xe0, -0x00,0x03,0x01,0xe6,0x02,0x60,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xca,0x00,0x04,0x02,0x4a,0x01,0xd0,0x02,0x4a,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xb2,0x00,0x05,0x02,0x32,0x02,0x32,0x01,0xb8,0x02,0x32,0x01,0xf8,0x00,0x01,0x00,0x00,0x00,0x51, -0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x98,0x00,0x04,0x01,0x9e,0x02,0x18,0x02,0x3a,0x02,0x40,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x05,0x02,0x00,0x01,0x86,0x02,0x00,0x02,0x22,0x02,0x28,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x66,0x00,0x06,0x01,0xe6,0x01,0xe6, -0x01,0x6c,0x01,0xe6,0x02,0x08,0x02,0x0e,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x4a,0x00,0x03,0x01,0x50,0x01,0xca,0x02,0x02,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x34,0x00,0x04,0x01,0xb4,0x01,0x3a,0x01,0xb4,0x01,0xec,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00, -0x00,0x01,0x01,0x1c,0x00,0x05,0x01,0x9c,0x01,0x9c,0x01,0x22,0x01,0x9c,0x01,0xd4,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x02,0x00,0x05,0x01,0x08,0x01,0x82,0x01,0xa4,0x01,0xcc,0x01,0xd2,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x06,0x01,0x68,0x00,0xee,0x01,0x68, -0x01,0x8a,0x01,0xb2,0x01,0xb8,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xcc,0x00,0x07,0x01,0x4c,0x01,0x4c,0x00,0xd2,0x01,0x4c,0x01,0x6e,0x01,0x96,0x01,0x9c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xae,0x00,0x04,0x00,0xb4,0x01,0x2e,0x01,0x50,0x01,0x6c,0x00,0x01,0x00,0x00, -0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x05,0x01,0x16,0x00,0x9c,0x01,0x16,0x01,0x38,0x01,0x54,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x7c,0x00,0x06,0x00,0xfc,0x00,0xfc,0x00,0x82,0x00,0xfc,0x01,0x1e,0x01,0x3a,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x60, -0x00,0x04,0x00,0x66,0x00,0xe0,0x01,0x02,0x01,0x24,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x05,0x00,0xc8,0x00,0x4e,0x00,0xc8,0x00,0xea,0x01,0x0c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x06,0x00,0xae,0x00,0xae,0x00,0x34,0x00,0xae,0x00,0xd0,0x00,0xf2, -0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x01,0x00,0xe8,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07, -0x0b,0xd6,0x0b,0xd6,0x00,0x08,0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c,0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30, -0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68, -0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x61,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1a,0x00,0x01,0x00,0x42, -0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x52,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x03,0x0b,0xc0,0x0b,0xc0,0x00,0x00, -0x0b,0xd7,0x0b,0xd7,0x00,0x01,0x0b,0xdc,0x0b,0xdc,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0xf8,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xde,0x00,0x02,0x01,0x0e,0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xca,0x00,0x03,0x00,0xfa,0x00,0xfa, -0x00,0xd2,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x01,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xa2,0x00,0x02,0x00,0xd2,0x00,0xf4,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x8e,0x00,0x03,0x00,0xbe,0x00,0xbe,0x00,0xe0,0x00,0x01, -0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x01,0x00,0xd0,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x02,0x00,0x96,0x00,0xbe,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x52,0x00,0x03,0x00,0x82,0x00,0x82,0x00,0xaa,0x00,0x01,0x00,0x00,0x00,0x53, -0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x9a,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2a,0x00,0x02,0x00,0x5a,0x00,0x88,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x03,0x00,0x46,0x00,0x46,0x00,0x74,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x01,0x00,0x02, -0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd, -0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x62,0x00,0x01,0x00,0x01,0x11,0x86,0x00,0x01,0x00,0x01,0x0b,0x07,0x00,0x03,0x00,0x01,0x00,0x40,0x00,0x01,0x00,0x46,0x00,0x01,0x00,0x4e,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x03,0x00,0x01,0x00,0x2c,0x00,0x01,0x00,0x32,0x00,0x02, -0x00,0x74,0x00,0x7a,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x5e,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88, -0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x03, -0x00,0x02,0x00,0xee,0x00,0xee,0x00,0x01,0x01,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x01,0x08,0x00,0xda,0x00,0xda,0x00,0x01,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0xf2,0x00,0xf2,0x00,0xc4,0x00,0xc4,0x00,0x01,0x00,0xec,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55, -0x00,0x03,0x00,0x02,0x00,0xac,0x00,0xda,0x00,0x01,0x00,0xd4,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x00,0xc6,0x00,0x98,0x00,0xc6,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0xb0,0x00,0xb0,0x00,0x82,0x00,0xb0,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0x00, -0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x6a,0x00,0xc6,0x00,0x01,0x00,0x92,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x00,0x84,0x00,0x56,0x00,0xb2,0x00,0x01,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0x6e,0x00,0x6e,0x00,0x40,0x00,0x9c,0x00,0x01,0x00,0x68,0x00,0x00,0x00,0x01, -0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x8a,0x00,0x01,0x00,0x50,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x7c,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95, -0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1, -0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x62,0x00,0x01,0x00,0x01,0x11,0x86,0x00,0x01,0x00,0x01,0x0b,0x07,0x00,0x03,0x00,0x03,0x00,0x64,0x00,0x6a,0x00,0x6a,0x00,0x01,0x00,0x92,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x04,0x00,0x4e,0x00,0x54,0x00,0x82,0x00,0x54,0x00,0x01,0x00,0x7c, -0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x05,0x00,0x36,0x00,0x3c,0x00,0x6a,0x00,0x6a,0x00,0x3c,0x00,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x06,0x00,0x1c,0x00,0x22,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x22,0x00,0x01,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x01, -0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61, -0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x03,0x00,0x02,0x06,0x38,0x06,0x3e,0x00,0x01,0x06,0x66,0x00,0x01,0x06,0xa6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0x22,0x06,0xca,0x06,0x28, -0x00,0x01,0x06,0x50,0x00,0x01,0x06,0x90,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x06,0x0a,0x06,0x10,0x00,0x01,0x06,0x38,0x00,0x02,0x06,0xba,0x06,0x78,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0xa2,0x05,0xf2,0x05,0xf8,0x00,0x01,0x06,0x20,0x00,0x01,0x06,0x60,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03, -0x00,0x04,0x06,0x8a,0x06,0x8a,0x05,0xda,0x05,0xe0,0x00,0x01,0x06,0x08,0x00,0x01,0x06,0x48,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0x70,0x05,0xc0,0x05,0xc6,0x00,0x01,0x05,0xee,0x00,0x02,0x06,0x70,0x06,0x2e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x06,0x56,0x06,0x56,0x05,0xa6,0x05,0xac,0x00,0x01, -0x05,0xd4,0x00,0x02,0x06,0x56,0x06,0x14,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x8a,0x06,0x32,0x05,0x90,0x00,0x01,0x05,0xb8,0x00,0x02,0x06,0x3a,0x05,0xf8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x06,0x20,0x05,0x70,0x06,0x18,0x05,0x76,0x00,0x01,0x05,0x9e,0x00,0x01,0x05,0xde,0x00,0x01,0x00,0x00, -0x00,0x57,0x00,0x03,0x00,0x05,0x06,0x06,0x06,0x06,0x05,0x56,0x05,0xfe,0x05,0x5c,0x00,0x01,0x05,0x84,0x00,0x01,0x05,0xc4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x05,0xea,0x05,0x3a,0x05,0xe2,0x05,0x40,0x00,0x01,0x05,0x68,0x00,0x02,0x05,0xea,0x05,0xa8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x05,0xce, -0x05,0xce,0x05,0x1e,0x05,0xc6,0x05,0x24,0x00,0x01,0x05,0x4c,0x00,0x02,0x05,0xce,0x05,0x8c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x05,0x00,0x05,0x06,0x00,0x01,0x05,0x2e,0x00,0x02,0x05,0xd2,0x05,0xd8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x04,0xe8,0x05,0x90,0x04,0xee,0x00,0x01,0x05,0x16,0x00,0x02, -0x05,0xba,0x05,0xc0,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x04,0xce,0x04,0xd4,0x00,0x01,0x04,0xfc,0x00,0x03,0x05,0x7e,0x05,0xa0,0x05,0xa6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x64,0x04,0xb4,0x04,0xba,0x00,0x01,0x04,0xe2,0x00,0x02,0x05,0x86,0x05,0x8c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03, -0x00,0x04,0x05,0x4a,0x05,0x4a,0x04,0x9a,0x04,0xa0,0x00,0x01,0x04,0xc8,0x00,0x02,0x05,0x6c,0x05,0x72,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x2e,0x04,0x7e,0x04,0x84,0x00,0x01,0x04,0xac,0x00,0x03,0x05,0x2e,0x05,0x50,0x05,0x56,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x05,0x12,0x05,0x12,0x04,0x62, -0x04,0x68,0x00,0x01,0x04,0x90,0x00,0x03,0x05,0x12,0x05,0x34,0x05,0x3a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x04,0x44,0x04,0xec,0x04,0x4a,0x00,0x01,0x04,0x72,0x00,0x03,0x04,0xf4,0x05,0x16,0x05,0x1c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x04,0xd8,0x04,0x28,0x04,0xd0,0x04,0x2e,0x00,0x01,0x04,0x56, -0x00,0x02,0x04,0xfa,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x04,0xbc,0x04,0xbc,0x04,0x0c,0x04,0xb4,0x04,0x12,0x00,0x01,0x04,0x3a,0x00,0x02,0x04,0xde,0x04,0xe4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x04,0x9e,0x03,0xee,0x04,0x96,0x03,0xf4,0x00,0x01,0x04,0x1c,0x00,0x03,0x04,0x9e,0x04,0xc0, -0x04,0xc6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x04,0x80,0x04,0x80,0x03,0xd0,0x04,0x78,0x03,0xd6,0x00,0x01,0x03,0xfe,0x00,0x03,0x04,0x80,0x04,0xa2,0x04,0xa8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x03,0xb0,0x03,0xb6,0x00,0x01,0x03,0xde,0x00,0x02,0x04,0x82,0x04,0x98,0x00,0x01,0x00,0x00,0x00,0x57, -0x00,0x03,0x00,0x02,0x03,0x98,0x03,0x9e,0x00,0x01,0x03,0xc6,0x00,0x02,0x04,0x6a,0x04,0x86,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x80,0x04,0x28,0x03,0x86,0x00,0x01,0x03,0xae,0x00,0x02,0x04,0x52,0x04,0x68,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x66,0x04,0x0e,0x03,0x6c,0x00,0x01,0x03,0x94, -0x00,0x02,0x04,0x38,0x04,0x54,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x03,0x4c,0x03,0x52,0x00,0x01,0x03,0x7a,0x00,0x03,0x03,0xfc,0x04,0x1e,0x04,0x34,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0xe2,0x03,0x32,0x03,0x38,0x00,0x01,0x03,0x60,0x00,0x02,0x04,0x04,0x04,0x1a,0x00,0x01,0x00,0x00,0x00,0x57, -0x00,0x03,0x00,0x04,0x03,0xc8,0x03,0xc8,0x03,0x18,0x03,0x1e,0x00,0x01,0x03,0x46,0x00,0x02,0x03,0xea,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0xac,0x02,0xfc,0x03,0x02,0x00,0x01,0x03,0x2a,0x00,0x03,0x03,0xac,0x03,0xce,0x03,0xe4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x90,0x03,0x90, -0x02,0xe0,0x02,0xe6,0x00,0x01,0x03,0x0e,0x00,0x03,0x03,0x90,0x03,0xb2,0x03,0xc8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x02,0xc2,0x02,0xc8,0x00,0x01,0x02,0xf0,0x00,0x03,0x03,0x72,0x03,0x94,0x03,0xb0,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x58,0x02,0xa8,0x02,0xae,0x00,0x01,0x02,0xd6,0x00,0x02, -0x03,0x7a,0x03,0x96,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x3e,0x03,0x3e,0x02,0x8e,0x02,0x94,0x00,0x01,0x02,0xbc,0x00,0x02,0x03,0x60,0x03,0x7c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x22,0x02,0x72,0x02,0x78,0x00,0x01,0x02,0xa0,0x00,0x03,0x03,0x22,0x03,0x44,0x03,0x60,0x00,0x01,0x00,0x00, -0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x06,0x03,0x06,0x02,0x56,0x02,0x5c,0x00,0x01,0x02,0x84,0x00,0x03,0x03,0x06,0x03,0x28,0x03,0x44,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x02,0x38,0x02,0xe0,0x02,0x3e,0x00,0x01,0x02,0x66,0x00,0x03,0x02,0xe8,0x03,0x0a,0x03,0x20,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04, -0x02,0xcc,0x02,0x1c,0x02,0xc4,0x02,0x22,0x00,0x01,0x02,0x4a,0x00,0x02,0x02,0xee,0x03,0x04,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0xb0,0x02,0x00,0x02,0xa8,0x02,0x06,0x00,0x01,0x02,0x2e,0x00,0x02,0x02,0xd2,0x02,0xe8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x94,0x01,0xe4,0x02,0x8c,0x01,0xea, -0x00,0x01,0x02,0x12,0x00,0x03,0x02,0x94,0x02,0xb6,0x02,0xcc,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x02,0x76,0x02,0x76,0x00,0x01,0x01,0xf4,0x00,0x03,0x02,0x76,0x02,0x98,0x02,0xae,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0xac,0x02,0x54,0x01,0xb2,0x00,0x01,0x01,0xda,0x00,0x03,0x02,0x5c,0x02,0x7e, -0x02,0x94,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x40,0x01,0x90,0x02,0x38,0x01,0x96,0x00,0x01,0x01,0xbe,0x00,0x02,0x02,0x62,0x02,0x78,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x02,0x24,0x02,0x24,0x01,0x74,0x02,0x1c,0x01,0x7a,0x00,0x01,0x01,0xa2,0x00,0x02,0x02,0x46,0x02,0x5c,0x00,0x01,0x00,0x00, -0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x06,0x01,0x56,0x01,0xfe,0x01,0x5c,0x00,0x01,0x01,0x84,0x00,0x03,0x02,0x06,0x02,0x28,0x02,0x3e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x01,0x38,0x01,0x3e,0x00,0x01,0x01,0x66,0x00,0x01,0x02,0x2c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0x22,0x01,0xca,0x01,0x28, -0x00,0x01,0x01,0x50,0x00,0x01,0x02,0x16,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x01,0x0a,0x01,0x10,0x00,0x01,0x01,0x38,0x00,0x02,0x01,0xba,0x01,0xfe,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0xa2,0x00,0xf2,0x00,0xf8,0x00,0x01,0x01,0x20,0x00,0x01,0x01,0xe6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03, -0x00,0x04,0x01,0x8a,0x01,0x8a,0x00,0xda,0x00,0xe0,0x00,0x01,0x01,0x08,0x00,0x01,0x01,0xce,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0x70,0x00,0xc0,0x00,0xc6,0x00,0x01,0x00,0xee,0x00,0x02,0x01,0x70,0x01,0xb4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x01,0x56,0x01,0x56,0x00,0xa6,0x00,0xac,0x00,0x01, -0x00,0xd4,0x00,0x02,0x01,0x56,0x01,0x9a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x00,0x8a,0x01,0x32,0x00,0x90,0x00,0x01,0x00,0xb8,0x00,0x02,0x01,0x3a,0x01,0x7e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x01,0x20,0x00,0x70,0x01,0x18,0x00,0x76,0x00,0x01,0x00,0x9e,0x00,0x01,0x01,0x64,0x00,0x01,0x00,0x00, -0x00,0x57,0x00,0x03,0x00,0x05,0x01,0x06,0x01,0x06,0x00,0x56,0x00,0xfe,0x00,0x5c,0x00,0x01,0x00,0x84,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x00,0xea,0x00,0x3a,0x00,0xe2,0x00,0x40,0x00,0x01,0x00,0x68,0x00,0x02,0x00,0xea,0x01,0x2e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x00,0xce, -0x00,0xce,0x00,0x1e,0x00,0xc6,0x00,0x24,0x00,0x01,0x00,0x4c,0x00,0x02,0x00,0xce,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31, -0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07,0x0b,0xd6,0x0b,0xd6,0x00,0x08,0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c, -0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a, -0x00,0x01,0x00,0x02,0x0b,0x5e,0x0b,0x61,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b, -0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x58,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a, -0x00,0x01,0x00,0x00,0x00,0x59,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x02,0x0b,0x58,0x0b,0x5b,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x04,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x5a,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x02,0x0b,0x54,0x0b,0x56, -0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x42,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x00,0x00,0x5b,0x00,0x03,0x00,0x01,0x00,0x8a,0x00,0x01,0x00,0x2e,0x00,0x01,0x00,0x5c,0x00,0x01,0x00,0x00,0x00,0x5b,0x00,0x03,0x00,0x01,0x00,0x7c,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x48,0x00,0x01, -0x00,0x00,0x00,0x5b,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f, -0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x88,0x00,0x01,0x00,0x01,0x0b,0x89,0x00,0x03,0x00,0x02,0x00,0x3e,0x00,0x6c,0x00,0x01,0x00,0x72,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x03,0x00,0x03,0x00,0x66,0x00,0x7c,0x00,0x82,0x00,0x01,0x00,0x5e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x94,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01, -0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x53,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9, -0x00,0x0a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x03,0x00,0x02,0x00,0x78,0x00,0xa6,0x00,0x01, -0x00,0xac,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x64,0x00,0xa0,0x00,0x01,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x50,0x00,0x92,0x00,0x01,0x00,0x84,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x3c,0x00,0x84,0x00,0x01,0x00,0x70,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x76,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x68,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, -0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x58,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0x59,0x00,0x01,0x00,0x01,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x5b,0x00,0x01,0x00,0x01, -0x0b,0x5d,0x00,0x01,0x00,0x01,0x0b,0xb9,0x00,0x03,0x00,0x02,0x00,0x50,0x00,0x7e,0x00,0x01,0x00,0x84,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x3c,0x00,0x78,0x00,0x01,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x6a,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x01, -0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x5c,0x00,0x72,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05, -0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x54,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0x55,0x00,0x01,0x00,0x01,0x0b,0x56,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x03,0x00,0x00, -0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x4c,0x00,0x01,0x00,0x00,0x00,0x5f,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1, -0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d, -0x00,0x10,0x00,0x03,0x00,0x01,0x00,0x5c,0x00,0x01,0x00,0x8a,0x00,0x01,0x00,0x90,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x48,0x00,0x01,0x00,0x76,0x00,0x02,0x00,0x48,0x00,0x7c,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x32,0x00,0x01,0x00,0x60,0x00,0x03,0x00,0x32,0x00,0x32,0x00,0x66,0x00,0x01, -0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x48,0x00,0x04,0x00,0x1a,0x00,0x1a,0x00,0x1a,0x00,0x4e,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11, -0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x01,0x00,0x01,0x0b,0x75,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14, -0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x62,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x63,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01, -0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x02, -0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x01,0x00,0x01,0x14,0x6b,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01, -0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01, -0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e, -0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6d,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x02,0x00,0x01, -0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6f,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01, -0x00,0x00,0x00,0x70,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x71,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x16, -0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01, -0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x74,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00, -0x00,0x75,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16, -0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01, -0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x79,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00, -0x00,0x7a,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x18, -0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02,0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x02,0x00,0x01,0x14,0x9e, -0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02,0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02, -0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01, -0x0a,0x44,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00, -0x00,0x82,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x04,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x04,0x00,0x18, -0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x04,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x85,0x00,0x02,0x00,0x01,0x14,0x9e, -0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x01,0x00,0x0a,0x00,0x03,0x00,0x64,0xff,0xce,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x0a,0x00,0x03,0x01,0x2c,0xff,0xce,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0xc8,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x5d, -0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x89,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88, -0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfc,0xb5,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0c,0x00,0x07,0xfc,0xc8,0xfc,0xc7,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00, -0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0xe6,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf6,0xcd,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf6,0x8e,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08, -0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x8d,0xfc,0xb2,0x00,0x02,0x00,0x01, -0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x74,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x35,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac, -0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01, -0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xff,0x82,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05, -0xfd,0x69,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfd,0x2a,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01, -0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08, -0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e, -0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x8d,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x74,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x35,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00, -0x00,0x01,0x02,0x1c,0x02,0x32,0x00,0x03,0x00,0x0c,0x00,0x3a,0x00,0x0b,0x00,0x00,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x00,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x50,0x4f,0xae,0x4f,0xb4, -0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x4f,0xde,0x50,0x1a,0x50,0x20,0x50,0x14,0x50,0x26,0x50,0x2c,0x50,0x32,0x50,0x38,0x50,0x3e,0x50,0x44,0x50,0x4a,0x50,0x50,0x4f,0xde,0x50,0x1a,0x50,0x20,0x50,0x56, -0x50,0x5c,0x50,0x62,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0x9e,0x50,0xa4,0x50,0xaa,0x50,0xb0,0x50,0xb6,0x50,0xbc,0x50,0xc2,0x50,0xc8,0x50,0xce,0x50,0xd4,0x50,0xda,0x50,0xe0,0x50,0xe6,0x50,0xec,0x50,0xf2,0x50,0xf8,0x50,0xfe,0x51,0x04, -0x51,0x0a,0x51,0x10,0x51,0x16,0x51,0x1c,0x51,0x22,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x76,0x51,0x7c,0x51,0x82,0x51,0x76,0x51,0x7c,0x51,0x82,0x51,0x76,0x51,0x7c,0x51,0x82,0x50,0x56,0x50,0x5c,0x50,0x62,0x50,0x56,0x50,0x5c, -0x50,0x62,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x7a,0x50,0x80,0x50,0x86,0x51,0x88,0x51,0x8e,0x51,0x94,0x51,0x9a,0x51,0xa0,0x51,0xa6,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x51,0xac,0x51,0xb2,0x51,0xb8,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x51,0x40, -0x51,0x46,0x51,0x4c,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14, -0x51,0xbe,0x51,0xc4,0x51,0xca,0x51,0xd0,0x51,0xd6,0x51,0xdc,0x50,0x44,0x50,0x4a,0x50,0x50,0x51,0xbe,0x51,0xc4,0x51,0xca,0x50,0x56,0x50,0x5c,0x50,0x62,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0xb0,0x50,0xb6,0x50,0xbc,0x50,0xc2,0x50,0xc8,0x50,0xce,0x50,0xe6,0x50,0xec, -0x50,0xf2,0x50,0xf8,0x50,0xfe,0x51,0x04,0x51,0x1c,0x51,0x22,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x4f,0xde,0x50,0x1a,0x50,0x20,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0xf8,0x50,0xfe,0x51,0x04,0x51,0x9a, -0x51,0xa0,0x51,0xa6,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x51,0x64,0x51,0x6a,0x51,0x70,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85, -0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x4d,0x7c,0x00,0x00,0x4d,0x7c,0x00,0x50,0x4f,0xac,0x4f,0xb2,0x4f,0xb8,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x4f,0xd0, -0x4e,0xc2,0x4f,0xd6,0x4f,0xdc,0x4f,0xd0,0x4e,0x20,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x4f,0xee,0x4e,0x68,0x4f,0xf4,0x4f,0xfa,0x50,0x00,0x4e,0xb0,0x50,0x06,0x4e,0xd4,0x50,0x0c,0x50,0x12,0x50,0x18,0x50,0x1e,0x50,0x24,0x50,0x2a,0x50,0x2a,0x50,0x2a,0x4e,0x20,0x4e,0x20,0x4f,0xe8,0x4f,0xe8,0x50,0x30,0x50,0x36,0x4f,0xb2,0x4f,0xc4, -0x4f,0xca,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x50,0x18,0x50,0x24,0x50,0x1e,0x50,0x1e,0x50,0x1e,0x50,0x1e,0x4f,0xb2,0x4f,0xb8,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x50,0x3c,0x50,0x42,0x4f,0xdc,0x50,0x3c,0x4e,0x20,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x4f,0xf4,0x50,0x48,0x4e,0xb0,0x50,0x06,0x50,0x0c,0x50,0x12,0x50,0x18,0x50,0x1e,0x50,0x24, -0x4f,0xd0,0x4f,0xb8,0x4f,0xe2,0x50,0x06,0x50,0x36,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x50,0x24,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62, -0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4c,0x94,0x00,0x50,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a, -0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a, -0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06, -0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4b,0xb2,0x00,0x50,0x4e,0x8e,0x4e,0x94,0x4e,0x9a,0x4e,0xa0, -0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xb2,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xbe,0x4e,0xdc,0x4e,0xb2,0x4e,0xe2,0x4e,0xe8,0x4e,0xee,0x4e,0xf4,0x4e,0xe8,0x4e,0xfa,0x4f,0x00,0x4e,0xdc,0x4e,0xca,0x4f,0x06,0x4f,0x0c,0x4e,0xb2,0x4e,0xb2,0x4e,0xb2,0x4e,0xca,0x4e,0xca,0x4e,0xd6,0x4e,0xd6,0x4e,0xb2, -0x4e,0xee,0x4e,0x94,0x4e,0xa6,0x4e,0xac,0x4e,0xd0,0x4e,0xd6,0x4e,0xbe,0x4e,0xca,0x4f,0x0c,0x4f,0x06,0x4f,0x12,0x4f,0x06,0x4f,0x12,0x4e,0x94,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4f,0x18,0x4e,0xf4,0x4e,0xc4,0x4f,0x18,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x4e,0xe8,0x4e,0xf4,0x4e,0xe8,0x4f,0x00,0x4e,0xdc, -0x4e,0xca,0x4f,0x06,0x4f,0x0c,0x4f,0x1e,0x4f,0x24,0x4f,0x2a,0x4f,0x30,0x4e,0xd6,0x4f,0x36,0x4f,0x24,0x4f,0x3c,0x4f,0x42,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31, -0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x2c,0x00,0x32,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0xd0,0x00,0x0c,0x4e,0x66,0x4e,0x6c,0x4e,0x72,0x4e,0x6c,0x4e,0x6c,0x4e,0x78,0x4e,0x66,0x4e,0x7e,0x4e,0x78,0x4e,0x84,0x4e,0x78,0x4e,0x54,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a, -0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x01,0x5c,0x01,0x72,0x00,0x02,0x00,0x0c,0x00,0x1a,0x00,0x03, -0x00,0x00,0x4a,0x64,0x00,0x00,0x4a,0x64,0x00,0x01,0x4a,0x64,0x00,0x50,0x4e,0x16,0x4e,0x1c,0x4e,0x22,0x4e,0x28,0x4e,0x2e,0x4e,0x34,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4e,0x5e,0x4e,0x64,0x4e,0x6a,0x4e,0x70,0x4e,0x76,0x4e,0x7c,0x4e,0x82,0x4e,0x88,0x4e,0x5e,0x4e,0x64,0x4e,0x8e,0x4e,0x94,0x4e,0x9a, -0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0x7c,0x4e,0x16,0x4e,0x58,0x4e,0x5e,0x4e,0x64,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x4e,0xc4,0x4e,0xca,0x4e,0xe8,0x4e,0xee,0x4e,0xf4,0x4e,0xfa,0x4f,0x00,0x4e,0x58,0x4e,0x8e,0x4e,0x94,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4e,0x5e, -0x4e,0x7c,0x4e,0x5e,0x4e,0x7c,0x4e,0x5e,0x4e,0x7c,0x4e,0x8e,0x4e,0x94,0x4e,0x8e,0x4e,0x94,0x4e,0xa6,0x4e,0xac,0x4e,0xa6,0x4e,0xac,0x4e,0x5e,0x4e,0x7c,0x4e,0xd0,0x4e,0xd6,0x4e,0x22,0x4e,0x28,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0x7c,0x4e,0x8e,0x4e,0x94,0x4f,0x12, -0x4f,0x18,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x1e,0x4f,0x24,0x4e,0x2e,0x4f,0x2a,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4f,0x30,0x4f,0x36,0x4f,0x3c,0x4f,0x42,0x4e,0x82,0x4e,0x88,0x4f,0x30,0x4f,0x36,0x4e,0x8e,0x4e,0x94,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6, -0x4e,0xac,0x4e,0x16,0x4e,0x58,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xca,0x4e,0xdc,0x4e,0xe2,0x4e,0xc4,0x4e,0xca,0x4e,0xf4,0x4e,0xfa,0x4f,0x00,0x4e,0x58,0x4e,0x8e,0x4e,0x94,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4e,0x5e,0x4e,0x64,0x4e,0x2e,0x4e,0x34,0x4f,0x48,0x4e,0xa0,0x4e,0xc4,0x4e,0xca,0x4e,0xa6,0x4e,0xac,0x4e,0x3a, -0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4f,0x12,0x4f,0x18,0x00,0x02,0x00,0x03,0x0b,0xc0,0x0b,0xc0,0x00,0x00,0x0b,0xd7,0x0b,0xd7,0x00,0x01,0x0b,0xdc,0x0b,0xdc,0x00,0x02,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d, -0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x48,0xca,0x00,0x00,0x48,0xca,0x00,0x50,0x4a,0x76,0x4d,0xb8,0x4d,0xbe,0x4d,0xc4,0x4d,0xbe,0x4d,0xca,0x4b,0xc6,0x4d,0xd0,0x4b,0x8a,0x4d,0xd6,0x4b,0xc6,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8, -0x4d,0xee,0x4d,0xf4,0x4b,0xc6,0x4d,0xfa,0x4e,0x00,0x4b,0x1e,0x4e,0x06,0x4e,0x0c,0x4e,0x12,0x4e,0x18,0x4e,0x1e,0x4d,0xdc,0x4e,0x24,0x4e,0x2a,0x49,0x68,0x49,0x68,0x49,0x68,0x4d,0xdc,0x4d,0xdc,0x4d,0xe8,0x4d,0xe8,0x4e,0x30,0x4b,0x1e,0x4d,0xb8,0x4d,0xbe,0x4d,0xca,0x4d,0xe2,0x4d,0xe8,0x4d,0xee,0x4d,0xdc,0x4e,0x2a,0x4e,0x24, -0x4e,0x24,0x4e,0x24,0x4e,0x24,0x4d,0xb8,0x4d,0xbe,0x4d,0xc4,0x4d,0xbe,0x4d,0xca,0x4c,0x2c,0x4e,0x36,0x4d,0xd6,0x4c,0x2c,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8,0x4d,0xf4,0x4d,0xfa,0x4e,0x00,0x4e,0x06,0x4e,0x0c,0x4e,0x18,0x4e,0x1e,0x4d,0xdc,0x4e,0x24,0x4e,0x2a,0x4e,0x3c,0x4e,0x42,0x4e,0x48,0x4e,0x4e,0x4e,0x54,0x4e,0x5a,0x4e,0x42, -0x4e,0x60,0x4e,0x66,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16, -0x00,0x02,0x00,0x00,0x47,0xe2,0x00,0x00,0x47,0xe2,0x00,0x0c,0x4d,0x84,0x4d,0x8a,0x49,0xbe,0x4d,0x8a,0x4d,0x8a,0x4d,0x90,0x4d,0x84,0x48,0xfe,0x4d,0x90,0x4d,0x96,0x4d,0x90,0x4d,0x72,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71, -0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x47,0x70,0x00,0x50,0x49,0x20,0x4c,0x62,0x4c,0x68, -0x4c,0x6e,0x4c,0x68,0x4c,0x74,0x4a,0x70,0x4c,0x7a,0x4a,0x34,0x4c,0x80,0x4a,0x70,0x4c,0x86,0x4c,0x8c,0x4d,0x2e,0x4c,0x98,0x4c,0x9e,0x4a,0x70,0x4c,0xa4,0x4c,0xaa,0x49,0xc8,0x4c,0xb0,0x4c,0xb6,0x4c,0xbc,0x4c,0xc2,0x4c,0xc8,0x4c,0x86,0x4c,0xce,0x4c,0xd4,0x48,0x12,0x48,0x12,0x48,0x12,0x4c,0x86,0x4c,0x86,0x4d,0x2e,0x4d,0x2e, -0x4c,0xda,0x49,0xc8,0x4c,0x62,0x4c,0x68,0x4c,0x74,0x4c,0x8c,0x4d,0x2e,0x4c,0x98,0x4c,0x86,0x4c,0xd4,0x4c,0xce,0x4c,0xce,0x4c,0xce,0x4c,0xce,0x4c,0x62,0x4c,0x68,0x4c,0x6e,0x4c,0x68,0x4c,0x74,0x4a,0xd6,0x4c,0xe0,0x4c,0x80,0x4a,0xd6,0x4c,0x86,0x4c,0x8c,0x4d,0x2e,0x4c,0x9e,0x4c,0xa4,0x4c,0xaa,0x4c,0xb0,0x4c,0xb6,0x4c,0xc2, -0x4c,0xc8,0x4c,0x86,0x4c,0xce,0x4c,0xd4,0x4d,0x34,0x4c,0xec,0x4c,0xf2,0x4c,0xf8,0x4c,0xfe,0x4d,0x04,0x4c,0xec,0x4d,0x0a,0x4d,0x10,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7, -0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x2c,0x00,0x32,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x46,0x8e,0x00,0x0c,0x4c,0x58,0x4c,0x5e,0x4c,0x64,0x4c,0x5e,0x4c,0x5e,0x4c,0x6a,0x4c,0x58,0x4c,0x70,0x4c,0x6a,0x4c,0x76,0x4c,0x6a,0x4c,0x22,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x09,0x0b,0x6a, -0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0x64,0x00,0xa4,0x00,0x01,0x00,0x0c,0x00,0x4a, -0x00,0x0f,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x0c, -0x46,0x50,0x4b,0xd8,0x47,0xfa,0x4b,0xd8,0x4b,0xd8,0x4b,0xde,0x46,0x50,0x4b,0xe4,0x4b,0xde,0x4b,0xea,0x4b,0xde,0x4b,0x7e,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07,0x0b,0xd6,0x0b,0xd6,0x00,0x08, -0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c,0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07, -0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x45,0x44,0x00,0x00,0x45,0x44,0x00,0x50,0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4a,0x3e,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4a,0x3e, -0x4a,0x8c,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x47,0xaa,0x45,0x88,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6,0x4b,0xac,0x45,0x9a,0x4b,0xb2,0x4b,0xb8,0x47,0xf8,0x46,0x24,0x46,0x24,0x46,0x24,0x4a,0x8c,0x4a,0x8c,0x4b,0x82,0x4b,0x82,0x48,0x04,0x46,0x8a,0x4b,0x4c,0x4b,0x5e,0x4b,0x64,0x4b,0xbe,0x4b,0x82,0x4b,0x88, -0x4b,0xb2,0x47,0xf8,0x4b,0xb8,0x4b,0xb8,0x4b,0xb8,0x4b,0xb8,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0xc4,0x4b,0x0a,0x4b,0x76,0x4b,0xc4,0x4a,0x8c,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x94,0x47,0xaa,0x4b,0x9a,0x4b,0xa0,0x4b,0xac,0x45,0x9a,0x4b,0xb2,0x4b,0xb8,0x47,0xf8,0x4a,0x3e,0x4b,0x52,0x4b,0x7c,0x4b,0xa0, -0x46,0x8a,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x47,0xf8,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0, -0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x44,0x5c,0x00,0x00,0x44,0x5c,0x00,0x50,0x4a,0xe2,0x4a,0xe8,0x4a,0xee,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4a,0xfa,0x49,0x92,0x4b,0x00,0x4b,0x06,0x4a,0xfa,0x4b,0x0c,0x46,0x14,0x46,0x02,0x4b,0x12,0x4b,0x12,0x4a,0xa6,0x4b,0x18,0x4b,0x1e,0x4b,0x24,0x47,0x22,0x4b,0x2a,0x4a,0xbe, -0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x4e,0x4b,0x4e,0x4b,0x0c,0x4b,0x0c,0x46,0x02,0x46,0x02,0x4b,0x54,0x4b,0x5a,0x4a,0xe8,0x44,0xdc,0x4a,0xf4,0x4b,0x60,0x46,0x02,0x4b,0x12,0x4b,0x3c,0x4b,0x48,0x4b,0x42,0x4b,0x42,0x4b,0x42,0x4b,0x42,0x4a,0xe8,0x4a,0xee,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4b,0x66, -0x4b,0x6c,0x4b,0x06,0x4b,0x66,0x4b,0x0c,0x46,0x14,0x46,0x02,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x47,0x22,0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4a,0xfa,0x4a,0xee,0x46,0x14,0x4b,0x2a,0x4b,0x5a,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4b,0x48,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43, -0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x43,0x74,0x00,0x00,0x43,0x74,0x00,0x50,0x4a,0x8a,0x4a,0x90,0x4a,0x96, -0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4a,0xa2,0x4a,0xa8,0x4a,0xae,0x4a,0xb4,0x4a,0xa2,0x4a,0xba,0x4a,0xc0,0x46,0x04,0x46,0x16,0x46,0x16,0x4a,0xc6,0x43,0x82,0x4a,0xcc,0x4a,0xd2,0x45,0xb6,0x4a,0xd8,0x4a,0xde,0x45,0xfe,0x4a,0xe4,0x4a,0xea,0x4a,0xf0,0x4a,0xf6,0x4a,0xfc,0x4a,0xfc,0x4a,0xfc,0x4a,0xba,0x4a,0xba,0x46,0x04,0x46,0x04, -0x4b,0x02,0x4b,0x08,0x4a,0x90,0x4a,0x9c,0x46,0x1c,0x4b,0x0e,0x46,0x04,0x46,0x16,0x4a,0xea,0x4a,0xf6,0x4a,0xf0,0x4a,0xf0,0x4a,0xf0,0x4a,0xf0,0x4a,0x90,0x4a,0x96,0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4b,0x14,0x4a,0x72,0x4a,0xb4,0x4b,0x14,0x4a,0xba,0x4a,0xc0,0x46,0x04,0x46,0x16,0x43,0x82,0x4a,0xcc,0x45,0xb6,0x4a,0xd8,0x45,0xfe, -0x4a,0xe4,0x4a,0xea,0x4a,0xf0,0x4a,0xf6,0x4a,0xa2,0x4a,0x96,0x4a,0xc0,0x4a,0xd8,0x4b,0x08,0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4a,0xf6,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d, -0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xe0,0x01,0x0e,0x00,0x01,0x00,0x0c,0x00,0x3e,0x00,0x0c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c, -0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x50,0x48,0x90,0x43,0xe6,0x4a,0x0a,0x47,0xee,0x4a,0x10,0x4a,0x16,0x4a,0x1c,0x4a,0x22,0x4a,0x28,0x4a,0x2e,0x4a,0x1c,0x43,0x80,0x4a,0x34,0x47,0x64,0x48,0xf0,0x48,0xf0,0x4a,0x3a,0x4a,0x40,0x4a,0x46,0x4a,0x4c,0x4a,0x52,0x4a,0x58,0x4a,0x5e,0x4a,0x64,0x4a,0x6a,0x4a,0x70,0x4a,0x76, -0x4a,0x7c,0x4a,0x82,0x4a,0x82,0x4a,0x82,0x43,0x80,0x43,0x80,0x47,0x64,0x47,0x64,0x4a,0x88,0x4a,0x8e,0x43,0xe6,0x4a,0x10,0x4a,0x16,0x4a,0x94,0x47,0x64,0x48,0xf0,0x4a,0x70,0x4a,0x7c,0x4a,0x76,0x4a,0x76,0x4a,0x76,0x4a,0x76,0x43,0xe6,0x4a,0x0a,0x47,0xee,0x4a,0x10,0x4a,0x16,0x47,0x82,0x4a,0x9a,0x4a,0x2e,0x47,0x82,0x43,0x80, -0x4a,0x34,0x47,0x64,0x48,0xf0,0x4a,0x40,0x4a,0x46,0x4a,0x52,0x4a,0x58,0x4a,0x64,0x4a,0x6a,0x4a,0x70,0x4a,0x76,0x4a,0x7c,0x4a,0x1c,0x4a,0x0a,0x4a,0x34,0x4a,0x58,0x4a,0x8e,0x47,0xee,0x4a,0x10,0x4a,0x16,0x4a,0x7c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02, -0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c, -0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x41,0x56,0x00,0x00,0x41,0x56,0x00,0x0c,0x49,0x92,0x49,0x98,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f, -0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x40,0xf0,0x00,0x00,0x40,0xf0,0x00,0x0c,0x46,0x2c, -0x46,0x2c,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x46,0xf2,0x49,0x3e,0x49,0x3e,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04, -0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x40,0x8a,0x00,0x00,0x40,0x8a,0x00,0x0c,0x46,0x8c,0x46,0x8c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x48,0xde,0x47,0x1c,0x47,0x1c,0x00,0x01,0x00,0x02, -0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0xf8,0x01,0x32,0x00,0x01,0x00,0x0c,0x00,0x56,0x00,0x12, -0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24, -0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x50,0x48,0x3e,0x48,0x44,0x40,0x28,0x48,0x4a,0x40,0x28,0x48,0x50,0x40,0x88,0x48,0x56,0x48,0x5c,0x48,0x62,0x40,0x88,0x45,0x08,0x41,0x2a,0x42,0x32,0x48,0x68,0x48,0x6e,0x40,0x88,0x42,0x38,0x48,0x74,0x48,0x7a,0x48,0x80,0x46,0x28,0x40,0x76,0x48,0x86,0x48,0x8c,0x45,0x08,0x47,0x00, -0x48,0x92,0x48,0x98,0x48,0x98,0x48,0x98,0x45,0x08,0x45,0x08,0x42,0x32,0x42,0x32,0x47,0xd8,0x48,0x7a,0x48,0x44,0x40,0x28,0x48,0x50,0x41,0x2a,0x42,0x32,0x48,0x68,0x45,0x08,0x48,0x92,0x42,0x56,0x46,0xc4,0x42,0x56,0x46,0xc4,0x48,0x44,0x40,0x28,0x48,0x4a,0x40,0x28,0x48,0x50,0x48,0x9e,0x48,0xa4,0x48,0x62,0x48,0x9e,0x45,0x08, -0x41,0x2a,0x42,0x32,0x48,0x6e,0x42,0x38,0x48,0x74,0x48,0x80,0x46,0x28,0x48,0x86,0x48,0x8c,0x45,0x08,0x47,0x00,0x48,0x92,0x48,0xaa,0x48,0xb0,0x48,0xb6,0x48,0xbc,0x46,0x52,0x48,0xc2,0x48,0xc8,0x48,0xce,0x48,0xd4,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05, -0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d, -0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x3e,0xca,0x00,0x50,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0, -0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0, -0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0, -0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x12,0xf4,0x13,0x46,0x00,0x03,0x00,0x0c,0x01,0xbe,0x00,0x6c,0x00,0x00,0x46,0xe8, -0x00,0x02,0x46,0xee,0x00,0x00,0x46,0xf4,0x00,0x00,0x46,0xf4,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x00,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x06,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x0c,0x00,0x00,0x47,0x0c,0x00,0x00,0x47,0x12, -0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x18,0x00,0x00,0x47,0x1e,0x00,0x00,0x47,0x24,0x00,0x01,0x47,0x2a,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x30,0x00,0x02,0x47,0x36,0x00,0x00,0x47,0x3c,0x00,0x02,0x47,0x42,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x4e, -0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x54,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x54,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x5a,0x00,0x02,0x47,0x60,0x00,0x02,0x47,0x66,0x00,0x02,0x47,0x6c,0x00,0x02,0x3d,0xe8, -0x00,0x02,0x47,0x72,0x00,0x02,0x3d,0xe8,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x78,0x00,0x00,0x47,0x00,0x00,0x00,0x47,0x7e,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x3c,0x00,0x02,0x43,0xb2,0x00,0x00,0x46,0xfa,0x00,0x02,0x47,0x84,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x8a,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x90, -0x00,0x02,0x47,0x96,0x00,0x02,0x47,0x9c,0x00,0x00,0x47,0xa2,0x00,0x00,0x47,0xa8,0x00,0x00,0x47,0xae,0x00,0x00,0x47,0xae,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c, -0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xc0,0x00,0x00,0x46,0xfa,0x00,0x02,0x47,0xc6,0x00,0x02,0x47,0xcc,0x00,0x02,0x47,0xcc,0x00,0x02,0x47,0xcc,0x00,0x00,0x47,0xd2,0x00,0x02,0x47,0xd8,0x00,0x02,0x47,0x5a,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xba, -0x00,0x02,0x47,0xde,0x00,0x00,0x47,0xe4,0x00,0x00,0x47,0xea,0x00,0x00,0x47,0xea,0x00,0x00,0x47,0xf0,0x00,0x00,0x47,0xf0,0x00,0x00,0x47,0xf6,0x00,0x00,0x47,0xf6,0x00,0x02,0x47,0xfc,0x00,0x00,0x48,0x02,0x00,0x02,0x48,0x08,0x02,0xde,0x46,0x5c,0x46,0x62,0x46,0x68,0x46,0x6e,0x46,0x74,0x46,0x7a,0x46,0x80,0x46,0x86,0x46,0x8c, -0x46,0x92,0x46,0x98,0x46,0x9e,0x46,0xa4,0x46,0xaa,0x46,0xb0,0x46,0xa4,0x46,0xaa,0x46,0xb0,0x46,0xb6,0x46,0xbc,0x46,0xc2,0x46,0xc8,0x46,0xce,0x46,0xd4,0x46,0xda,0x46,0xe0,0x46,0xe6,0x46,0xec,0x46,0xf2,0x46,0xf8,0x46,0xfe,0x47,0x04,0x47,0x0a,0x47,0x10,0x47,0x16,0x47,0x1c,0x47,0x22,0x47,0x28,0x47,0x2e,0x46,0xb6,0x47,0x34, -0x47,0x3a,0x47,0x40,0x47,0x46,0x47,0x4c,0x47,0x52,0x46,0x74,0x47,0x58,0x47,0x40,0x47,0x46,0x47,0x5e,0x47,0x52,0x47,0x64,0x46,0x68,0x47,0x6a,0x46,0xaa,0x47,0x70,0x47,0x76,0x47,0x7c,0x47,0x82,0x46,0x92,0x47,0x46,0x47,0x88,0x47,0x8e,0x47,0x46,0x47,0x94,0x47,0x9a,0x47,0xa0,0x47,0xa6,0x47,0xac,0x46,0x98,0x47,0xb2,0x47,0xb8, -0x47,0x04,0x47,0xbe,0x46,0xfe,0x47,0x04,0x47,0xbe,0x47,0xc4,0x47,0xca,0x47,0xd0,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x47,0xe8,0x47,0xee,0x47,0xf4,0x47,0xfa,0x48,0x00,0x48,0x06,0x48,0x0c,0x47,0xca,0x47,0xf4,0x48,0x12,0x46,0x80,0x48,0x18,0x48,0x0c,0x48,0x1e,0x48,0x24,0x47,0xd6,0x47,0xdc,0x47,0x1c,0x48,0x2a,0x48,0x30,0x48,0x36, -0x48,0x3c,0x48,0x30,0x48,0x42,0x47,0xd6,0x48,0x48,0x47,0x1c,0x48,0x2a,0x48,0x4e,0x48,0x36,0x48,0x54,0x48,0x5a,0x48,0x60,0x48,0x66,0x48,0x6c,0x47,0x1c,0x48,0x72,0x48,0x6c,0x48,0x78,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x66,0x48,0x8a,0x48,0x84,0x48,0x90,0x48,0x96,0x48,0x36,0x48,0x9c,0x48,0xa2,0x48,0xa8,0x48,0xae,0x48,0xb4, -0x48,0xba,0x47,0xe8,0x48,0xc0,0x47,0x70,0x48,0xc6,0x48,0xcc,0x48,0xd2,0x48,0xd8,0x48,0xde,0x48,0xe4,0x48,0xea,0x48,0xf0,0x48,0xf6,0x48,0xfc,0x48,0x7e,0x49,0x02,0x49,0x08,0x47,0xee,0x49,0x0e,0x49,0x14,0x49,0x1a,0x46,0x68,0x49,0x14,0x49,0x1a,0x46,0x68,0x46,0x80,0x46,0x86,0x49,0x20,0x49,0x26,0x49,0x2c,0x46,0xb0,0x49,0x32, -0x49,0x38,0x47,0x3a,0x49,0x3e,0x49,0x44,0x47,0x4c,0x49,0x4a,0x49,0x50,0x47,0x88,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x62,0x49,0x5c,0x49,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x74,0x47,0xd0,0x47,0xe8,0x47,0xee,0x49,0x7a,0x49,0x80,0x49,0x5c,0x47,0xf4, -0x49,0x80,0x49,0x5c,0x47,0xf4,0x49,0x86,0x49,0x5c,0x49,0x8c,0x49,0x92,0x49,0x5c,0x47,0x70,0x48,0x2a,0x49,0x98,0x48,0x36,0x48,0x2a,0x49,0x9e,0x48,0x36,0x49,0xa4,0x49,0xaa,0x48,0x36,0x49,0xb0,0x49,0xaa,0x48,0x36,0x49,0xb6,0x49,0xbc,0x47,0x1c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x49,0xc2,0x49,0xbc,0x48,0x78,0x49,0xc8,0x49,0xbc, -0x49,0xce,0x49,0xd4,0x49,0xbc,0x48,0x78,0x49,0xd4,0x49,0xbc,0x48,0x78,0x49,0xda,0x49,0xe0,0x47,0x70,0x49,0xda,0x49,0xe0,0x47,0x70,0x49,0x80,0x49,0xe0,0x47,0xf4,0x49,0xe6,0x49,0xe0,0x47,0xf4,0x49,0xec,0x49,0xf2,0x49,0xf8,0x49,0xfe,0x4a,0x04,0x4a,0x0a,0x47,0x40,0x49,0x44,0x47,0x4c,0x4a,0x10,0x4a,0x16,0x4a,0x1c,0x48,0x72, -0x49,0xbc,0x48,0x78,0x4a,0x22,0x4a,0x28,0x4a,0x2e,0x4a,0x34,0x49,0x1a,0x46,0x68,0x49,0x14,0x4a,0x3a,0x46,0x68,0x49,0x3e,0x49,0x44,0x47,0x4c,0x4a,0x40,0x4a,0x46,0x4a,0x4c,0x4a,0x52,0x4a,0x58,0x4a,0x5e,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x4a,0x70,0x4a,0x76,0x47,0xbe,0x4a,0x34,0x49,0x1a,0x46,0x68,0x4a,0x7c,0x4a,0x82,0x4a,0x88, -0x4a,0x34,0x4a,0x8e,0x46,0x68,0x4a,0x94,0x4a,0x9a,0x4a,0x88,0x49,0x26,0x4a,0x82,0x46,0xb0,0x4a,0xa0,0x4a,0xa6,0x46,0xe6,0x4a,0xac,0x4a,0xa6,0x4a,0xb2,0x4a,0xb8,0x4a,0xbe,0x46,0xe6,0x4a,0xa0,0x4a,0xc4,0x46,0xe6,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xd0,0x49,0x50, -0x47,0x88,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4a,0xd6,0x4a,0xdc,0x48,0x36,0x47,0x10,0x47,0x16,0x47,0x1c,0x4a,0xe2,0x4a,0xe8,0x4a,0xee,0x4a,0xf4,0x4a,0xfa,0x47,0x70,0x4b,0x00,0x4b,0x06,0x48,0xa8,0x4b,0x0c,0x4b,0x12,0x47,0xbe,0x4b,0x18,0x4b,0x1e,0x49,0x0e,0x46,0x92,0x46,0x98,0x46,0x9e,0x4b,0x24, -0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x4b,0x3c,0x4a,0x6a,0x49,0x02,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x54,0x4b,0x5a,0x4b,0x60,0x4b,0x66,0x4b,0x6c,0x46,0xc2,0x49,0x80,0x4b,0x72,0x48,0x24,0x4b,0x78,0x4b,0x7e,0x4a,0xb2,0x47,0x6a,0x46,0xaa,0x4b,0x84,0x48,0x9c,0x48,0xa2,0x4b,0x8a,0x4b,0x90,0x4b,0x96,0x46,0x8c, -0x49,0xda,0x4b,0x1e,0x47,0xf4,0x4b,0x9c,0x4b,0x96,0x4b,0xa2,0x4b,0xa8,0x4b,0x1e,0x4b,0xae,0x47,0xfa,0x48,0x00,0x48,0x06,0x4a,0x34,0x4a,0x3a,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0,0x4b,0xb4,0x46,0x62,0x4b,0xba,0x47,0xc4,0x47,0xca,0x4b,0xc0,0x4b,0xc6,0x4b,0xcc,0x4b,0xd2,0x47,0xfa,0x48,0x00,0x48,0x06,0x46,0x92,0x46,0x98, -0x46,0x9e,0x46,0xa4,0x46,0xaa,0x4b,0xd8,0x48,0x0c,0x47,0xca,0x4b,0xde,0x4a,0x7c,0x4a,0xfa,0x46,0xb0,0x49,0x80,0x49,0x5c,0x47,0xf4,0x4b,0xe4,0x4b,0xea,0x47,0x1c,0x4b,0xf0,0x4b,0xf6,0x48,0x36,0x47,0x10,0x4b,0xfc,0x47,0x1c,0x48,0x2a,0x4c,0x02,0x48,0x36,0x47,0x10,0x47,0x16,0x47,0x1c,0x48,0x2a,0x48,0x4e,0x48,0x36,0x4b,0x66, -0x4c,0x08,0x47,0x3a,0x4c,0x0e,0x49,0xbc,0x47,0x1c,0x4a,0xca,0x4c,0x08,0x4c,0x14,0x49,0xc2,0x49,0xbc,0x46,0xb0,0x4a,0xca,0x4c,0x1a,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x4c,0x20,0x4c,0x26,0x46,0x68,0x4c,0x2c,0x4c,0x32,0x48,0x36,0x4c,0x20,0x4c,0x26,0x46,0x68,0x4c,0x38,0x4c,0x32,0x48,0x36,0x4c,0x3e,0x4a,0xfa,0x47,0x70, -0x4c,0x38,0x4b,0x06,0x48,0xa8,0x47,0x76,0x47,0x7c,0x4b,0x84,0x48,0xae,0x48,0xb4,0x4c,0x44,0x4a,0xf4,0x4c,0x4a,0x47,0x82,0x4c,0x50,0x4c,0x56,0x48,0xba,0x4b,0xc6,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4c,0x62,0x4c,0x68,0x47,0xbe,0x4c,0x6e,0x4b,0x1e, -0x49,0x0e,0x4c,0x74,0x4c,0x7a,0x47,0x1c,0x4c,0x80,0x4b,0x1e,0x49,0x0e,0x4c,0x86,0x4c,0x8c,0x4c,0x92,0x4c,0x98,0x4c,0x9e,0x4c,0xa4,0x4c,0xaa,0x4c,0xb0,0x4c,0xb6,0x4c,0xbc,0x4a,0x3a,0x46,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x4c,0xc2,0x4b,0x96,0x4c,0xc8,0x49,0xda,0x4b,0x1e,0x47,0xf4,0x49,0x3e,0x4c,0xce,0x47,0x4c,0x49,0xd4, -0x4b,0x1e,0x48,0x78,0x4c,0xd4,0x4a,0x9a,0x47,0xbe,0x49,0xe6,0x4c,0xda,0x47,0xf4,0x4c,0xe0,0x4a,0x9a,0x46,0xb0,0x49,0xda,0x49,0x5c,0x47,0x70,0x4c,0xe6,0x4c,0xec,0x47,0x82,0x49,0xe6,0x49,0x5c,0x47,0xf4,0x4b,0x9c,0x4c,0xf2,0x4b,0xa2,0x4b,0xa8,0x4b,0x72,0x4c,0xf8,0x49,0x32,0x4b,0x6c,0x46,0xc2,0x49,0xe6,0x4b,0x72,0x48,0x24, -0x46,0xb6,0x46,0xbc,0x4c,0xfe,0x4d,0x04,0x4d,0x0a,0x48,0x24,0x4d,0x10,0x4c,0x08,0x46,0xd4,0x4d,0x16,0x4d,0x1c,0x47,0xb2,0x4d,0x22,0x4d,0x28,0x4d,0x2e,0x4d,0x34,0x4d,0x3a,0x4d,0x40,0x4d,0x46,0x4a,0xbe,0x4a,0xee,0x4d,0x4c,0x49,0xaa,0x48,0x36,0x4d,0x52,0x4a,0xbe,0x46,0xe6,0x4d,0x58,0x49,0xaa,0x48,0x36,0x4d,0x5e,0x4a,0xc4, -0x4a,0xee,0x4d,0x64,0x49,0x9e,0x48,0x36,0x4d,0x6a,0x46,0xe0,0x4d,0x70,0x48,0x2a,0x48,0x30,0x4d,0x76,0x4d,0x7c,0x4d,0x82,0x46,0xf8,0x48,0x3c,0x4d,0x88,0x48,0x42,0x46,0xfe,0x47,0x04,0x4d,0x8e,0x47,0xd6,0x48,0x48,0x4d,0x94,0x4d,0x9a,0x4d,0xa0,0x4d,0xa6,0x47,0x10,0x47,0x16,0x4d,0xac,0x48,0x2a,0x48,0x4e,0x4d,0xb2,0x46,0xb6, -0x47,0x34,0x4c,0xfe,0x48,0x66,0x48,0x6c,0x4d,0x94,0x46,0xb6,0x47,0x34,0x4d,0xb8,0x48,0x66,0x48,0x6c,0x48,0x84,0x4d,0xbe,0x49,0x44,0x47,0x4c,0x49,0xd4,0x49,0xbc,0x48,0x78,0x4a,0xca,0x49,0x44,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x47,0x52,0x47,0x64,0x4d,0xc4,0x48,0x90,0x48,0x96,0x4d,0xca,0x4a,0xf4,0x4a,0xfa,0x47,0x70, -0x4c,0x38,0x4b,0x06,0x48,0xa8,0x4d,0xd0,0x4d,0xd6,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8,0x48,0xba,0x49,0x4a,0x49,0x50,0x47,0x88,0x49,0x92,0x49,0xe0,0x47,0x70,0x4d,0xee,0x49,0x50,0x47,0x88,0x49,0x92,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x49,0x50,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x46,0x92,0x47,0x46,0x4d,0xf4,0x47,0xe8,0x48,0xc0, -0x4d,0xfa,0x4e,0x00,0x4e,0x06,0x47,0xa6,0x4e,0x0c,0x4e,0x12,0x48,0xe4,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x49,0x56,0x4a,0x6a,0x4e,0x18,0x4e,0x1e,0x4e,0x24,0x48,0x36,0x4e,0x2a,0x4e,0x06,0x47,0xa6,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4e,0x2a,0x4e,0x06,0x47,0xa6,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4e,0x36,0x4e,0x06,0x47,0xa6,0x4e,0x3c, -0x4e,0x12,0x48,0xe4,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x4b,0x3c,0x4e,0x42,0x49,0x02,0x47,0x40,0x4e,0x48,0x47,0x4c,0x48,0x72,0x4e,0x4e,0x48,0x78,0x4e,0x54,0x4e,0x5a,0x47,0x88,0x4e,0x60,0x4e,0x66,0x47,0x70,0x4b,0xb4,0x46,0x62,0x4e,0x6c,0x4e,0x72,0x47,0xca,0x4e,0x78,0x4a,0x34,0x4a,0x8e,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0, -0x47,0xb8,0x46,0xaa,0x4e,0x7e,0x48,0x66,0x47,0xca,0x4e,0x84,0x4a,0xf4,0x4a,0xfa,0x47,0x82,0x49,0x80,0x49,0x5c,0x47,0xf4,0x4c,0xe6,0x4a,0x9a,0x47,0x82,0x49,0xe6,0x4c,0xda,0x47,0xf4,0x4a,0xa0,0x4e,0x8a,0x46,0xe6,0x48,0x2a,0x4e,0x90,0x48,0x36,0x46,0xda,0x46,0xe0,0x4e,0x96,0x48,0x2a,0x48,0x30,0x4e,0x9c,0x47,0x40,0x47,0x46, -0x4e,0xa2,0x48,0x72,0x48,0x6c,0x4e,0xa8,0x4a,0xca,0x4c,0x5c,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x46,0x92,0x47,0x46,0x4e,0xae,0x47,0xe8,0x48,0xc0,0x4e,0xb4,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x47,0xb8,0x47,0x04,0x4e,0x7e,0x48,0xfc,0x48,0x7e,0x49,0x02,0x4b,0x36,0x4b,0x12,0x47,0xbe,0x4b,0x3c, -0x4e,0x42,0x49,0x02,0x4a,0x70,0x4a,0x76,0x47,0xbe,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x47,0x76,0x47,0x7c,0x4e,0xba,0x48,0xae,0x48,0xb4,0x4e,0xc0,0x4e,0xc6,0x4e,0xcc,0x4e,0xd2,0x4e,0xd8,0x4e,0xde,0x4e,0xe4,0x46,0xa4,0x46,0xaa,0x4e,0xea,0x48,0x0c,0x47,0xca,0x49,0x7a,0x4b,0xb4,0x46,0x62,0x4e,0xf0,0x47,0xc4,0x47,0xca,0x4e,0xf6, -0x4e,0xfc,0x4f,0x02,0x46,0x7a,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x4f,0x08,0x46,0x74,0x4f,0x0e,0x47,0xd6,0x47,0xdc,0x4f,0x14,0x47,0xb8,0x46,0x74,0x4f,0x1a,0x47,0xd6,0x47,0xdc,0x4f,0x20,0x49,0x14,0x4f,0x26,0x46,0x68,0x47,0xfa,0x48,0x00,0x48,0x06,0x4f,0x2c,0x46,0x98,0x4f,0x32,0x4f,0x38,0x48,0x00,0x4e,0xa8,0x46,0xfe,0x46,0x98, -0x4f,0x3e,0x47,0xd6,0x48,0x00,0x4f,0x44,0x46,0x92,0x46,0x98,0x4f,0x4a,0x47,0xfa,0x48,0x00,0x4f,0x50,0x4f,0x56,0x46,0x98,0x4f,0x5c,0x47,0xd6,0x48,0x00,0x48,0x84,0x47,0x10,0x46,0xaa,0x48,0x84,0x4f,0x62,0x47,0xca,0x4c,0xf8,0x4f,0x08,0x46,0xaa,0x4f,0x68,0x48,0x0c,0x47,0xca,0x4b,0xde,0x4f,0x6e,0x4a,0x82,0x4f,0x74,0x4f,0x7a, -0x4f,0x80,0x48,0x18,0x4f,0x86,0x49,0x38,0x46,0xc2,0x49,0xe6,0x4b,0x72,0x48,0x24,0x4f,0x8c,0x4f,0x92,0x46,0xd4,0x4f,0x98,0x4f,0x9e,0x47,0x1c,0x46,0xc8,0x46,0xce,0x4f,0xa4,0x4f,0xaa,0x47,0xdc,0x4f,0xb0,0x4f,0x8c,0x49,0x38,0x46,0xd4,0x4f,0xb6,0x4f,0xbc,0x47,0x94,0x46,0xc8,0x46,0xce,0x4f,0xc2,0x47,0xd6,0x47,0xdc,0x48,0x84, -0x46,0xc8,0x46,0xce,0x4f,0xc8,0x47,0xd6,0x47,0xdc,0x4f,0xce,0x46,0xda,0x46,0xe0,0x4f,0xd4,0x48,0x2a,0x48,0x30,0x4d,0x76,0x4f,0xda,0x4c,0x68,0x47,0x0a,0x4f,0xe0,0x49,0x2c,0x47,0x1c,0x47,0x8e,0x47,0x04,0x4f,0xe6,0x4f,0xec,0x48,0x48,0x4e,0xb4,0x46,0xfe,0x47,0x04,0x4f,0x3e,0x4f,0xf2,0x48,0x48,0x4f,0xf8,0x47,0x76,0x47,0x16, -0x4e,0xb4,0x48,0x2a,0x48,0x4e,0x4e,0x9c,0x4f,0xfe,0x50,0x04,0x4e,0xb4,0x50,0x0a,0x4b,0xf6,0x4e,0x9c,0x4f,0x08,0x47,0x16,0x4f,0xf8,0x48,0x2a,0x48,0x4e,0x50,0x10,0x50,0x16,0x47,0x16,0x50,0x1c,0x48,0x2a,0x48,0x4e,0x50,0x22,0x50,0x28,0x50,0x2e,0x47,0x2e,0x50,0x34,0x50,0x3a,0x48,0x60,0x50,0x40,0x50,0x46,0x47,0x2e,0x50,0x34, -0x50,0x3a,0x48,0x60,0x47,0x22,0x47,0x28,0x50,0x4c,0x48,0x54,0x48,0x5a,0x50,0x52,0x50,0x58,0x49,0x38,0x50,0x5e,0x49,0xd4,0x49,0xbc,0x46,0xb0,0x50,0x64,0x47,0x34,0x50,0x6a,0x48,0x72,0x48,0x6c,0x4e,0xa8,0x50,0x64,0x47,0x34,0x50,0x70,0x48,0x72,0x48,0x6c,0x50,0x76,0x47,0x40,0x47,0x34,0x50,0x7c,0x48,0x66,0x48,0x6c,0x48,0x84, -0x4c,0x20,0x50,0x82,0x47,0x58,0x4c,0x0e,0x4a,0x6a,0x48,0x84,0x4a,0x94,0x50,0x88,0x4a,0x88,0x50,0x8e,0x4a,0x6a,0x50,0x94,0x50,0x9a,0x50,0xa0,0x46,0xb0,0x50,0xa6,0x4c,0x32,0x48,0x36,0x47,0x52,0x47,0x64,0x50,0xac,0x48,0x90,0x48,0x96,0x4e,0x9c,0x47,0x52,0x47,0x64,0x50,0xb2,0x48,0x90,0x48,0x96,0x50,0x10,0x4c,0x74,0x4a,0x82, -0x50,0xb8,0x4c,0x2c,0x4b,0x06,0x50,0xbe,0x47,0x6a,0x46,0xaa,0x4e,0xb4,0x50,0xc4,0x48,0xa2,0x50,0xca,0x4c,0x3e,0x50,0xd0,0x47,0x70,0x4c,0x38,0x50,0xd6,0x48,0xa8,0x50,0xdc,0x50,0xd0,0x4b,0xae,0x50,0xe2,0x50,0xd6,0x48,0xa8,0x50,0xe8,0x4a,0x82,0x50,0xee,0x4c,0x2c,0x4b,0x06,0x50,0xf4,0x4c,0xe6,0x4a,0x9a,0x47,0x82,0x50,0xfa, -0x4c,0x56,0x48,0xba,0x47,0x76,0x47,0x7c,0x4e,0xb4,0x48,0xae,0x48,0xb4,0x51,0x00,0x47,0x76,0x47,0x7c,0x51,0x06,0x48,0xae,0x48,0xb4,0x51,0x0c,0x47,0x76,0x47,0x7c,0x51,0x12,0x48,0xae,0x48,0xb4,0x51,0x18,0x46,0x92,0x47,0x46,0x4e,0xae,0x51,0x1e,0x48,0xc0,0x51,0x24,0x46,0x92,0x47,0x46,0x4e,0xae,0x47,0xe8,0x48,0xc0,0x4e,0xb4, -0x4f,0x56,0x47,0x46,0x4f,0x5c,0x51,0x2a,0x48,0xc0,0x50,0x1c,0x51,0x30,0x51,0x36,0x47,0x94,0x49,0x62,0x51,0x3c,0x48,0xd2,0x47,0x8e,0x47,0x46,0x4f,0xe6,0x48,0xc6,0x48,0xcc,0x51,0x42,0x51,0x48,0x51,0x4e,0x47,0xa6,0x51,0x54,0x4e,0x12,0x48,0xe4,0x47,0x9a,0x47,0xa0,0x51,0x5a,0x48,0xd8,0x48,0xde,0x51,0x60,0x51,0x66,0x51,0x6c, -0x47,0xb2,0x51,0x72,0x51,0x78,0x48,0xf6,0x51,0x66,0x4f,0x26,0x47,0xb2,0x51,0x72,0x4e,0x42,0x48,0xf6,0x4a,0x70,0x4c,0x7a,0x47,0xbe,0x4a,0x64,0x4e,0x42,0x49,0x02,0x49,0x26,0x4b,0x12,0x46,0xb0,0x4c,0x6e,0x4b,0x1e,0x51,0x7e,0x46,0xfe,0x47,0x04,0x4e,0xa8,0x49,0x08,0x47,0xee,0x51,0x84,0x46,0xfe,0x47,0x04,0x4f,0x1a,0x48,0x90, -0x47,0xee,0x51,0x8a,0x47,0xd6,0x47,0xdc,0x4f,0x44,0x51,0x90,0x51,0x96,0x48,0xba,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4b,0x3c,0x4a,0x6a,0x49,0x02,0x49,0x56,0x51,0x9c,0x47,0xd0,0x51,0xa2,0x51,0xa8,0x51,0xae,0x4b,0x54,0x51,0xb4,0x51,0xba,0x51,0xc0,0x51,0xc6,0x51,0xcc,0x51,0xd2,0x51,0xd8,0x51,0xde,0x4b,0x54,0x51,0xe4,0x51,0xba, -0x51,0xea,0x51,0xf0,0x51,0xf6,0x4b,0x54,0x51,0xb4,0x51,0xba,0x51,0xfc,0x52,0x02,0x52,0x08,0x52,0x0e,0x52,0x14,0x52,0x1a,0x52,0x20,0x52,0x26,0x4b,0x30,0x52,0x2c,0x52,0x32,0x46,0x9e,0x52,0x38,0x52,0x3e,0x52,0x44,0x52,0x4a,0x52,0x50,0x52,0x56,0x4b,0x54,0x52,0x5c,0x51,0xba,0x52,0x62,0x52,0x68,0x52,0x6e,0x52,0x74,0x52,0x7a, -0x51,0x7e,0x52,0x80,0x52,0x86,0x48,0x78,0x52,0x8c,0x52,0x92,0x52,0x98,0x52,0x9e,0x52,0xa4,0x46,0xc2,0x52,0xaa,0x52,0xb0,0x52,0xb6,0x52,0xbc,0x52,0xc2,0x52,0xc8,0x52,0xce,0x52,0xd4,0x48,0x18,0x52,0xda,0x52,0xe0,0x4a,0xb2,0x52,0xe6,0x52,0xec,0x52,0xf2,0x52,0xf8,0x52,0xfe,0x53,0x04,0x53,0x0a,0x53,0x10,0x53,0x16,0x53,0x1c, -0x53,0x22,0x53,0x04,0x53,0x28,0x53,0x2e,0x53,0x34,0x53,0x3a,0x53,0x40,0x53,0x46,0x53,0x4c,0x53,0x52,0x53,0x58,0x53,0x5e,0x53,0x64,0x53,0x6a,0x53,0x70,0x53,0x76,0x53,0x7c,0x53,0x82,0x53,0x88,0x53,0x8e,0x53,0x94,0x53,0x9a,0x53,0xa0,0x53,0xa6,0x53,0xac,0x4b,0x60,0x53,0xb2,0x53,0xb8,0x53,0xbe,0x47,0x6a,0x46,0xaa,0x47,0x70, -0x48,0x9c,0x48,0xa2,0x48,0xa8,0x53,0xc4,0x53,0xca,0x53,0xd0,0x53,0xd6,0x53,0xdc,0x53,0xe2,0x53,0xe8,0x53,0xee,0x53,0xf4,0x53,0xfa,0x54,0x00,0x54,0x06,0x54,0x0c,0x54,0x12,0x54,0x18,0x53,0xfa,0x54,0x00,0x54,0x1e,0x54,0x24,0x54,0x2a,0x54,0x30,0x54,0x36,0x54,0x3c,0x54,0x42,0x54,0x48,0x54,0x4e,0x54,0x54,0x54,0x5a,0x54,0x60, -0x54,0x66,0x46,0xfe,0x47,0x04,0x47,0xbe,0x49,0x08,0x47,0xee,0x49,0x0e,0x47,0x76,0x47,0x04,0x51,0x12,0x46,0x80,0x46,0xce,0x54,0x6c,0x54,0x72,0x54,0x78,0x54,0x7e,0x54,0x84,0x54,0x8a,0x54,0x90,0x54,0x96,0x54,0x9c,0x54,0xa2,0x54,0xa8,0x54,0xae,0x54,0xb4,0x54,0xba,0x54,0xc0,0x54,0xc6,0x54,0xcc,0x54,0xd2,0x54,0xd8,0x54,0xde, -0x54,0xe4,0x54,0xea,0x54,0xf0,0x54,0xf6,0x54,0xfc,0x55,0x02,0x55,0x08,0x55,0x0e,0x55,0x14,0x55,0x1a,0x55,0x20,0x55,0x26,0x55,0x2c,0x55,0x32,0x55,0x38,0x55,0x3e,0x55,0x44,0x4a,0x34,0x4a,0x8e,0x46,0x68,0x55,0x4a,0x49,0x5c,0x55,0x50,0x4a,0xa0,0x4a,0xa6,0x46,0xe6,0x48,0x2a,0x55,0x56,0x48,0x36,0x4a,0xca,0x4c,0x5c,0x47,0x4c, -0x49,0xc2,0x49,0xbc,0x48,0x78,0x55,0x5c,0x4c,0x5c,0x55,0x62,0x4b,0xa8,0x49,0xe0,0x4b,0xae,0x4e,0x72,0x47,0xca,0x52,0x08,0x55,0x68,0x55,0x6e,0x55,0x74,0x55,0x7a,0x55,0x80,0x55,0x86,0x46,0xb6,0x46,0xbc,0x46,0xc2,0x48,0x0c,0x48,0x1e,0x48,0x24,0x55,0x8c,0x4c,0xf2,0x55,0x92,0x4b,0xa8,0x4b,0x72,0x4c,0xf8,0x49,0x26,0x4c,0x68, -0x46,0xb0,0x55,0x98,0x49,0x2c,0x53,0x04,0x47,0x40,0x47,0x46,0x55,0x9e,0x48,0x72,0x48,0x6c,0x55,0xa4,0x4d,0xbe,0x49,0x44,0x55,0x9e,0x49,0xd4,0x49,0xbc,0x55,0xa4,0x55,0xaa,0x4c,0x68,0x4e,0x18,0x55,0xb0,0x4b,0x1e,0x55,0xb6,0x48,0x3c,0x55,0xbc,0x48,0x42,0x55,0xc2,0x55,0xc8,0x55,0xce,0x55,0xd4,0x55,0xda,0x54,0xc6,0x55,0xe0, -0x55,0xe6,0x54,0xd8,0x4b,0x66,0x4c,0xf2,0x46,0xc2,0x49,0x80,0x4b,0x72,0x48,0x24,0x46,0x92,0x55,0xec,0x46,0x9e,0x55,0xf2,0x55,0xf8,0x55,0xfe,0x4b,0x66,0x49,0x38,0x47,0x3a,0x4c,0x0e,0x49,0xbc,0x47,0x1c,0x4a,0x34,0x56,0x04,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0,0x4a,0x34,0x4a,0x3a,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0, -0x4c,0xe0,0x56,0x0a,0x46,0xb0,0x49,0xda,0x49,0x5c,0x47,0xf4,0x4a,0x7c,0x4a,0x9a,0x4a,0x88,0x49,0xda,0x49,0x5c,0x47,0x70,0x4a,0xa0,0x56,0x10,0x46,0xe6,0x48,0x2a,0x56,0x16,0x48,0x36,0x4a,0xa0,0x4a,0xbe,0x46,0xe6,0x48,0x2a,0x49,0xaa,0x48,0x36,0x4b,0x90,0x49,0x44,0x47,0x4c,0x49,0x80,0x49,0xbc,0x48,0x78,0x4a,0xca,0x49,0x44, -0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x4a,0xf4,0x4c,0x26,0x46,0xb0,0x4b,0x00,0x4c,0x32,0x48,0x36,0x4c,0x20,0x50,0xa0,0x46,0x68,0x56,0x1c,0x4c,0x32,0x48,0x36,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4b,0xa8,0x49,0xe0,0x4b,0xae,0x56,0x22,0x56,0x28,0x56,0x2e,0x56,0x34, -0x56,0x3a,0x56,0x40,0x4d,0x10,0x4c,0x08,0x46,0xd4,0x55,0x98,0x56,0x46,0x47,0x1c,0x56,0x4c,0x56,0x52,0x56,0x58,0x56,0x5e,0x56,0x64,0x56,0x6a,0x56,0x70,0x56,0x76,0x4b,0xae,0x46,0xfe,0x47,0x04,0x56,0x7c,0x49,0x08,0x47,0xee,0x56,0x82,0x49,0x14,0x49,0x1a,0x46,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x49,0x3e,0x49,0x50,0x47,0x4c, -0x49,0xd4,0x49,0xbc,0x48,0x78,0x4a,0x70,0x4f,0x92,0x47,0xbe,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x56,0x88,0x56,0x8e,0x56,0x94,0x56,0x9a,0x56,0xa0,0x56,0xa6,0x56,0x9a,0x56,0xac,0x56,0xa6,0x56,0xb2,0x56,0xb8,0x56,0xbe,0x56,0xc4,0x56,0xca,0x56,0xd0,0x56,0xd6,0x56,0xca,0x56,0xdc,0x56,0xe2,0x56,0xe8,0x56,0xee,0x56,0xe2,0x56,0xf4, -0x56,0xbe,0x56,0xfa,0x4e,0xde,0x57,0x00,0x57,0x06,0x57,0x0c,0x57,0x12,0x57,0x18,0x57,0x1e,0x57,0x24,0x57,0x2a,0x57,0x1e,0x57,0x30,0x57,0x2a,0x57,0x36,0x57,0x30,0x57,0x3c,0x57,0x42,0x57,0x48,0x57,0x4e,0x57,0x54,0x57,0x5a,0x57,0x60,0x56,0xf4,0x48,0x24,0x48,0x0c,0x48,0x1e,0x48,0x24,0x57,0x66,0x57,0x6c,0x57,0x72,0x57,0x78, -0x57,0x7e,0x57,0x84,0x57,0x8a,0x57,0x90,0x57,0x96,0x57,0x9c,0x57,0xa2,0x57,0xa8,0x57,0xae,0x57,0xb4,0x47,0x1c,0x57,0xae,0x57,0xb4,0x57,0xa8,0x57,0xba,0x57,0xc0,0x57,0xc6,0x57,0xcc,0x57,0xd2,0x48,0x18,0x57,0xd8,0x57,0xde,0x57,0xe4,0x57,0xea,0x57,0xf0,0x57,0xf6,0x57,0xfc,0x58,0x02,0x58,0x08,0x58,0x0e,0x58,0x14,0x58,0x1a, -0x58,0x20,0x58,0x26,0x58,0x2c,0x58,0x32,0x58,0x38,0x4c,0x92,0x58,0x32,0x58,0x38,0x58,0x3e,0x48,0x54,0x48,0x5a,0x58,0x44,0x48,0x66,0x48,0x6c,0x48,0x84,0x48,0x66,0x48,0x6c,0x48,0x84,0x58,0x4a,0x58,0x50,0x46,0xb0,0x58,0x56,0x58,0x5c,0x48,0x78,0x58,0x62,0x58,0x68,0x58,0x6e,0x58,0x74,0x58,0x7a,0x58,0x80,0x58,0x86,0x58,0x8c, -0x58,0x92,0x58,0x98,0x58,0x9e,0x58,0xa4,0x58,0xaa,0x58,0xb0,0x58,0xa4,0x58,0x98,0x58,0x9e,0x58,0xb6,0x58,0xbc,0x48,0x96,0x50,0x22,0x58,0xbc,0x48,0x96,0x57,0x5a,0x58,0xc2,0x58,0xc8,0x58,0xce,0x58,0xd4,0x58,0xda,0x58,0xe0,0x58,0xe6,0x58,0xec,0x58,0xf2,0x58,0xe6,0x58,0xf8,0x58,0xf2,0x48,0x9c,0x48,0xa2,0x58,0xfe,0x59,0x04, -0x59,0x0a,0x59,0x10,0x59,0x16,0x59,0x1c,0x59,0x22,0x59,0x28,0x59,0x2e,0x59,0x34,0x59,0x3a,0x59,0x40,0x59,0x46,0x59,0x4c,0x59,0x52,0x59,0x58,0x48,0xae,0x48,0xb4,0x59,0x5e,0x59,0x64,0x59,0x6a,0x59,0x70,0x59,0x76,0x59,0x7c,0x59,0x82,0x59,0x88,0x59,0x8e,0x59,0x94,0x59,0x9a,0x59,0xa0,0x48,0xd2,0x59,0xa6,0x59,0xac,0x59,0xb2, -0x59,0xb8,0x59,0xbe,0x58,0xf2,0x59,0xc4,0x59,0xca,0x59,0xd0,0x49,0x08,0x47,0xee,0x59,0xd6,0x49,0x08,0x47,0xee,0x59,0xdc,0x59,0xe2,0x47,0xee,0x56,0x40,0x59,0xe2,0x47,0xee,0x56,0x40,0x59,0xe8,0x59,0xee,0x59,0xf4,0x59,0xe8,0x59,0xfa,0x5a,0x00,0x57,0xea,0x5a,0x06,0x5a,0x0c,0x5a,0x12,0x5a,0x18,0x48,0x24,0x5a,0x1e,0x5a,0x24, -0x5a,0x2a,0x58,0xe6,0x5a,0x30,0x58,0xf2,0x5a,0x36,0x5a,0x3c,0x5a,0x42,0x5a,0x48,0x5a,0x4e,0x5a,0x54,0x5a,0x5a,0x57,0xa2,0x4d,0x40,0x5a,0x60,0x5a,0x66,0x5a,0x6c,0x5a,0x72,0x5a,0x78,0x5a,0x7e,0x5a,0x84,0x5a,0x8a,0x51,0x7e,0x47,0xd6,0x5a,0x90,0x48,0x84,0x59,0xe8,0x59,0xee,0x59,0xf4,0x59,0xe8,0x59,0xfa,0x5a,0x00,0x5a,0x96, -0x5a,0x9c,0x5a,0xa2,0x5a,0x96,0x5a,0xa8,0x5a,0xae,0x5a,0x96,0x5a,0xb4,0x5a,0xba,0x5a,0xc0,0x5a,0xc6,0x5a,0xcc,0x5a,0xd2,0x5a,0xd8,0x5a,0xde,0x5a,0xe4,0x5a,0xea,0x5a,0xf0,0x5a,0xf6,0x53,0x64,0x5a,0xfc,0x5b,0x02,0x5b,0x08,0x5b,0x0e,0x5b,0x14,0x5b,0x1a,0x5b,0x20,0x5b,0x26,0x5b,0x2c,0x5b,0x32,0x5b,0x38,0x5b,0x2c,0x5b,0x32, -0x5b,0x3e,0x5b,0x44,0x48,0x42,0x5b,0x4a,0x5b,0x44,0x46,0xe6,0x5b,0x50,0x5b,0x56,0x5b,0x5c,0x5b,0x62,0x5b,0x68,0x50,0x22,0x5b,0x6e,0x5b,0x74,0x48,0x84,0x5b,0x7a,0x5b,0x80,0x5b,0x86,0x52,0x62,0x5b,0x8c,0x52,0x6e,0x52,0x62,0x5b,0x8c,0x52,0x6e,0x5b,0x92,0x5b,0x98,0x5b,0x9e,0x5b,0xa4,0x5b,0xaa,0x5b,0xb0,0x5b,0xb6,0x5b,0xbc, -0x5b,0xc2,0x5b,0xc8,0x5b,0xce,0x5b,0xd4,0x5b,0xda,0x5b,0xe0,0x5b,0xe6,0x47,0x10,0x47,0x16,0x47,0x1c,0x5b,0xec,0x5b,0xf2,0x5b,0xf8,0x48,0x9c,0x48,0xa2,0x5b,0xfe,0x49,0x08,0x47,0xee,0x5c,0x04,0x5c,0x0a,0x5c,0x10,0x48,0xd2,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x47,0xfa,0x48,0x00,0x48,0x06,0x48,0x12,0x46,0x80,0x48,0x18,0x48,0x54, -0x48,0x5a,0x48,0x60,0x48,0x66,0x48,0x6c,0x47,0x1c,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x90,0x48,0x96,0x48,0x36,0x5c,0x16,0x5c,0x1c,0x5c,0x22,0x48,0x9c,0x48,0xa2,0x48,0xa8,0x48,0xae,0x48,0xb4,0x48,0xba,0x49,0x08,0x47,0xee,0x49,0x0e,0x5c,0x28,0x5c,0x2e,0x56,0xee,0x5c,0x34,0x5c,0x3a,0x5c,0x40,0x5c,0x46,0x5c,0x4c,0x5c,0x52, -0x5c,0x58,0x5c,0x5e,0x5c,0x64,0x5c,0x6a,0x57,0xde,0x5c,0x70,0x4a,0xd6,0x5c,0x76,0x48,0x36,0x48,0x66,0x48,0x7e,0x48,0x84,0x5c,0x7c,0x5c,0x82,0x5c,0x88,0x59,0x76,0x59,0x7c,0x59,0x82,0x47,0xd6,0x47,0xdc,0x5c,0x8e,0x47,0xfa,0x48,0x00,0x5c,0x94,0x48,0x12,0x46,0x80,0x5c,0x9a,0x48,0x0c,0x48,0x1e,0x48,0x24,0x47,0xd6,0x48,0x48, -0x5c,0xa0,0x48,0x2a,0x48,0x4e,0x4d,0x76,0x48,0x54,0x48,0x5a,0x5c,0xa6,0x48,0x66,0x48,0x6c,0x5c,0xa0,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x90,0x48,0x96,0x4d,0x76,0x48,0x9c,0x48,0xa2,0x58,0xfe,0x59,0x04,0x59,0x0a,0x59,0x10,0x48,0xc6,0x48,0xcc,0x5c,0xac,0x48,0xea,0x48,0xf0,0x5c,0xb2,0x49,0x08,0x47,0xee,0x5c,0xb8,0x47,0xc4, -0x47,0xca,0x4b,0xc0,0x48,0x66,0x48,0x8a,0x5c,0xa0,0x47,0xd6,0x5a,0x90,0x5c,0xa0,0x48,0x0c,0x47,0xca,0x4b,0xde,0x57,0x18,0x57,0x1e,0x5c,0xbe,0x57,0x2a,0x57,0x1e,0x5c,0xc4,0x48,0x0c,0x47,0xca,0x47,0xf4,0x48,0x2a,0x48,0x30,0x4d,0x76,0x5c,0xca,0x47,0xee,0x5c,0xd0,0x59,0x04,0x59,0x0a,0x59,0x10,0x47,0xe8,0x48,0xc0,0x4d,0xfa, -0x5c,0xd6,0x5c,0xdc,0x5c,0xe2,0x5c,0xe8,0x5c,0xee,0x5c,0xf4,0x5c,0xfa,0x5d,0x00,0x57,0xe4,0x46,0x6e,0x46,0x74,0x46,0x7a,0x46,0x92,0x47,0x46,0x47,0x88,0x46,0xfe,0x46,0x62,0x47,0x0a,0x46,0xa4,0x46,0xaa,0x5d,0x06,0x5d,0x0c,0x5d,0x12,0x4b,0xde,0x46,0xec,0x46,0xf2,0x46,0xf8,0x48,0x3c,0x48,0x30,0x48,0x42,0x5d,0x18,0x5d,0x1e, -0x5d,0x24,0x5d,0x2a,0x5d,0x30,0x5d,0x36,0x47,0x52,0x47,0x64,0x46,0x68,0x48,0x90,0x48,0x96,0x48,0x36,0x47,0xb8,0x47,0x04,0x47,0xbe,0x48,0xfc,0x48,0x7e,0x49,0x02,0x5d,0x3c,0x5d,0x42,0x5d,0x48,0x47,0x10,0x47,0x16,0x47,0x1c,0x5d,0x4e,0x48,0x4e,0x5d,0x54,0x47,0x10,0x47,0x16,0x47,0x1c,0x47,0x52,0x46,0x74,0x47,0x58,0x47,0x52, -0x47,0x64,0x5d,0x5a,0x5d,0x60,0x5d,0x66,0x4b,0xc0,0x5d,0x6c,0x5d,0x72,0x5d,0x78,0x48,0x66,0x5d,0x7e,0x47,0x1c,0x5d,0x84,0x5d,0x8a,0x5d,0x90,0x4a,0xd6,0x4a,0xdc,0x4d,0x76,0x00,0x02,0x00,0x0d,0x02,0x44,0x02,0x47,0x00,0x00,0x04,0x62,0x04,0x79,0x00,0x04,0x04,0x7b,0x04,0x7f,0x00,0x1c,0x04,0x82,0x04,0x84,0x00,0x21,0x04,0x87, -0x04,0x91,0x00,0x24,0x04,0x97,0x04,0x9d,0x00,0x2f,0x04,0xa0,0x04,0xac,0x00,0x36,0x05,0xfd,0x06,0x00,0x00,0x43,0x06,0x66,0x06,0x72,0x00,0x47,0x07,0x55,0x07,0x5c,0x00,0x54,0x07,0xed,0x07,0xef,0x00,0x5c,0x08,0x4c,0x08,0x4f,0x00,0x5f,0x0a,0xdb,0x0a,0xe3,0x00,0x63,0x00,0x02,0x00,0x36,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44, -0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77, -0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0x5a,0x00,0xff,0x02,0x6f,0x02,0x74,0x01,0x03,0x02,0x7f,0x02,0x86,0x01,0x09,0x02,0x9b,0x02,0x9e,0x01,0x11,0x02,0xa9,0x02,0xb0, -0x01,0x15,0x02,0xcd,0x02,0xce,0x01,0x1d,0x02,0xe1,0x02,0xea,0x01,0x1f,0x02,0xed,0x02,0xf6,0x01,0x29,0x02,0xfb,0x02,0xfe,0x01,0x33,0x03,0x01,0x03,0x10,0x01,0x37,0x03,0x13,0x03,0x2e,0x01,0x47,0x03,0x37,0x03,0x3e,0x01,0x63,0x03,0x41,0x03,0x5a,0x01,0x6b,0x03,0x5f,0x03,0x78,0x01,0x85,0x04,0xb0,0x04,0xe2,0x01,0x9f,0x04,0xe6, -0x04,0xe7,0x01,0xd2,0x04,0xe9,0x04,0xe9,0x01,0xd4,0x04,0xee,0x04,0xfe,0x01,0xd5,0x05,0x07,0x05,0x07,0x01,0xe6,0x05,0x0c,0x05,0x46,0x01,0xe7,0x05,0x4b,0x05,0x4c,0x02,0x22,0x05,0x4f,0x05,0x50,0x02,0x24,0x05,0x56,0x05,0xb2,0x02,0x26,0x06,0xac,0x06,0xad,0x02,0x83,0x07,0x3e,0x07,0x43,0x02,0x85,0x07,0xe1,0x07,0xe2,0x02,0x8b, -0x07,0xe4,0x07,0xeb,0x02,0x8d,0x07,0xf7,0x08,0x05,0x02,0x95,0x08,0x07,0x08,0x26,0x02,0xa4,0x0a,0x43,0x0a,0x43,0x02,0xc4,0x0a,0xbf,0x0a,0xcc,0x02,0xc5,0x0a,0xe5,0x0a,0xe5,0x02,0xd3,0x0a,0xe7,0x0a,0xed,0x02,0xd4,0x0a,0xf4,0x0a,0xf4,0x02,0xdb,0x0a,0xf7,0x0a,0xf7,0x02,0xdc,0x11,0x8c,0x11,0x8c,0x02,0xdd,0x00,0x01,0x00,0x98, -0x00,0xc0,0x00,0x02,0x00,0x0c,0x00,0x2e,0x00,0x08,0x00,0x00,0x4a,0xba,0x00,0x00,0x4a,0xc0,0x00,0x01,0x4a,0xc6,0x00,0x00,0x4a,0xcc,0x00,0x01,0x4a,0xc6,0x00,0x00,0x4a,0xc6,0x00,0x01,0x4a,0xc6,0x00,0x01,0x4a,0xc6,0x00,0x1a,0x4a,0xb0,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x4a,0xc2,0x4a,0xc2,0x4a,0xc8,0x4a,0xc8,0x4a,0xce,0x4a,0xce, -0x4a,0xd4,0x4a,0xda,0x4a,0xe0,0x4a,0xe6,0x4a,0xec,0x4a,0xf2,0x4a,0xf8,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x4b,0x10,0x40,0xb4,0x40,0xb4,0x4b,0x16,0x4b,0x1c,0x4b,0x22,0x4b,0x22,0x4b,0x28,0x4b,0x2e,0x4b,0x34,0x4b,0x3a,0x4b,0x40,0x4b,0x40,0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x5e,0x4b,0x64,0x4b,0x6a, -0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0x22,0x4b,0x22,0x00,0x02,0x00,0x06,0x02,0x46,0x02,0x47,0x00,0x00,0x04,0x63,0x04,0x64,0x00,0x02,0x04,0x66,0x04,0x66,0x00,0x04,0x04,0x6b,0x04,0x6b,0x00,0x05,0x04,0x6e,0x04,0x6e,0x00,0x06,0x04,0x70,0x04,0x70,0x00,0x07,0x00,0x02,0x00,0x12, -0x01,0xdb,0x01,0xdb,0x00,0x00,0x01,0xe5,0x01,0xe5,0x00,0x01,0x01,0xe7,0x01,0xe7,0x00,0x02,0x01,0xec,0x01,0xec,0x00,0x03,0x01,0xef,0x01,0xf0,0x00,0x04,0x01,0xf5,0x01,0xf5,0x00,0x06,0x01,0xfa,0x01,0xfa,0x00,0x07,0x02,0x02,0x02,0x02,0x00,0x08,0x02,0x04,0x02,0x07,0x00,0x09,0x02,0x0c,0x02,0x0c,0x00,0x0d,0x02,0x0f,0x02,0x10, -0x00,0x0e,0x02,0x15,0x02,0x15,0x00,0x10,0x02,0x1a,0x02,0x1a,0x00,0x11,0x02,0x22,0x02,0x22,0x00,0x12,0x02,0x24,0x02,0x27,0x00,0x13,0x02,0x31,0x02,0x31,0x00,0x17,0x02,0xcd,0x02,0xcd,0x00,0x18,0x05,0x07,0x05,0x07,0x00,0x19,0x00,0x01,0x00,0xd8,0x00,0xde,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x92,0x00,0x62, -0x4a,0x92,0x4a,0x98,0x4a,0x9e,0x4a,0xa4,0x4a,0xaa,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x4a,0xc2,0x4a,0xc8,0x4a,0xce,0x4a,0xd4,0x4a,0xda,0x4a,0xe0,0x4a,0xe6,0x4a,0xec,0x4a,0xe6,0x4a,0xf2,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x4b,0x10,0x42,0x52,0x4b,0x16,0x4b,0x1c,0x4b,0x22,0x4b,0x28,0x4b,0x2e,0x4b,0x34,0x4b,0x3a,0x4b,0x40, -0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6,0x4b,0xac,0x4b,0xb2,0x4b,0xb8,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x3a,0x4b,0x3a,0x4b,0x3a,0x4b,0x3a,0x4b,0x52,0x4b,0x52, -0x4b,0x52,0x4b,0x52,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x9a,0x4b,0x9a,0x4b,0x9a,0x4b,0x9a,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xb2,0x4b,0xd0,0x4b,0xb2,0x4b,0xd6,0x4b,0xdc,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4b,0xf4,0x4b,0xfa,0x4c,0x00,0x4c,0x06,0x4c,0x0c,0x4c,0x12,0x4c,0x18,0x4b,0x76,0x4c,0x1e,0x4c,0x24, -0x4c,0x2a,0x4c,0x30,0x00,0x01,0x00,0x01,0x06,0x9b,0x00,0x02,0x00,0x16,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x69,0x00,0x6e,0x00,0x34,0x00,0x70,0x00,0x77,0x00,0x3a,0x00,0x79,0x00,0x81,0x00,0x42,0x00,0xa0,0x00,0xa1,0x00,0x4b,0x00,0xb1,0x00,0xb1,0x00,0x4d,0x00,0xba,0x00,0xba,0x00,0x4e,0x00,0xd6, -0x00,0xd6,0x00,0x4f,0x00,0xeb,0x00,0xeb,0x00,0x50,0x05,0x07,0x05,0x07,0x00,0x51,0x05,0x56,0x05,0x58,0x00,0x52,0x05,0x5a,0x05,0x5a,0x00,0x55,0x05,0x5e,0x05,0x5e,0x00,0x56,0x05,0x60,0x05,0x61,0x00,0x57,0x05,0x63,0x05,0x63,0x00,0x59,0x05,0x69,0x05,0x69,0x00,0x5a,0x05,0x6d,0x05,0x6d,0x00,0x5b,0x05,0x6f,0x05,0x6f,0x00,0x5c, -0x05,0x7a,0x05,0x7b,0x00,0x5d,0x05,0x8e,0x05,0x8f,0x00,0x5f,0x05,0x91,0x05,0x91,0x00,0x61,0x00,0x01,0x00,0x9c,0x00,0xa6,0x00,0x01,0x00,0x0c,0x00,0x22,0x00,0x05,0x00,0x00,0x4a,0xd6,0x00,0x00,0x4a,0xd6,0x00,0x00,0x26,0xc4,0x00,0x00,0x4a,0xdc,0x00,0x00,0x4a,0xe2,0x00,0x3c,0x4a,0xd2,0x4a,0xd8,0x4a,0xde,0x4a,0xe4,0x4a,0xea, -0x4a,0xf0,0x4a,0xf6,0x4a,0xfc,0x4b,0x02,0x4b,0x08,0x4b,0x0e,0x4b,0x14,0x4b,0x1a,0x4b,0x20,0x4b,0x26,0x4b,0x2c,0x4b,0x32,0x4b,0x2c,0x4b,0x38,0x4b,0x3e,0x4b,0x44,0x4b,0x4a,0x4b,0x50,0x4b,0x56,0x4b,0x5c,0x4b,0x62,0x4b,0x68,0x4b,0x6e,0x4b,0x74,0x4b,0x7a,0x4b,0x80,0x4b,0x86,0x4b,0x8c,0x4b,0x92,0x4b,0x98,0x4b,0x9e,0x4b,0xa4, -0x4b,0xaa,0x4b,0xb0,0x4b,0xb6,0x4b,0xbc,0x4b,0xc2,0x4b,0xc8,0x4b,0xce,0x4b,0xd4,0x4b,0xda,0x4b,0xe0,0x4b,0xe6,0x4b,0xec,0x4b,0xf2,0x4b,0xf8,0x4b,0xfe,0x4c,0x04,0x4c,0x0a,0x4c,0x10,0x4c,0x16,0x4c,0x1c,0x4c,0x22,0x4c,0x28,0x4c,0x2e,0x00,0x02,0x00,0x01,0x04,0x92,0x04,0x96,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x24,0x00,0x3d, -0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x79,0x00,0x79,0x00,0x34,0x00,0xd0,0x00,0xd0,0x00,0x35,0x00,0xe4,0x00,0xe4,0x00,0x36,0x00,0xe6,0x00,0xe6,0x00,0x37,0x00,0xe9,0x00,0xe9,0x00,0x38,0x05,0x83,0x05,0x83,0x00,0x39,0x05,0x88,0x05,0x88,0x00,0x3a,0x05,0x97,0x05,0x97,0x00,0x3b,0x00,0x01,0x0c,0xf8,0x0d,0x0e,0x00,0x02, -0x00,0x0c,0x00,0x2a,0x00,0x07,0x00,0x00,0x4b,0x64,0x00,0x00,0x4b,0x6a,0x00,0x01,0x2f,0x68,0x00,0x00,0x4b,0x6a,0x00,0x00,0x4b,0x6a,0x00,0x01,0x4b,0x70,0x00,0x01,0x2f,0x8c,0x03,0x33,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6, -0x4b,0xac,0x4b,0xb2,0x4b,0xb8,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xd0,0x4b,0xd6,0x4b,0xdc,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4b,0xf4,0x4b,0xfa,0x4c,0x00,0x4c,0x06,0x4c,0x0c,0x4c,0x12,0x4c,0x18,0x4c,0x1e,0x4c,0x24,0x4c,0x2a,0x4c,0x30,0x4c,0x36,0x4c,0x3c,0x4c,0x42,0x4c,0x48,0x4c,0x4e,0x4c,0x54,0x4c,0x5a,0x4c,0x60,0x4c,0x66, -0x4c,0x6c,0x4c,0x72,0x4c,0x78,0x4c,0x7e,0x4c,0x84,0x4c,0x8a,0x4c,0x90,0x4c,0x96,0x4c,0x9c,0x4c,0xa2,0x4c,0xa8,0x4c,0xae,0x4c,0xb4,0x4c,0xba,0x4c,0xc0,0x4c,0xc6,0x4c,0xcc,0x4c,0xd2,0x4c,0xb4,0x4c,0xba,0x4c,0xd8,0x4c,0xde,0x4c,0xe4,0x4c,0xea,0x4c,0xe4,0x4c,0xea,0x4c,0xd8,0x4c,0xde,0x4c,0xf0,0x4c,0xf6,0x4c,0xfc,0x4d,0x02, -0x4c,0xd8,0x4c,0xde,0x4d,0x08,0x4d,0x0e,0x4c,0x9c,0x4c,0xa2,0x4c,0xb4,0x4c,0xba,0x4d,0x14,0x4d,0x1a,0x4d,0x20,0x4d,0x26,0x4d,0x2c,0x4d,0x32,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x4d,0x4a,0x4d,0x50,0x4d,0x56,0x4d,0x5c,0x4d,0x62,0x4d,0x68,0x4d,0x6e,0x4d,0x74,0x4d,0x7a,0x4d,0x80,0x4b,0x5e,0x4d,0x80,0x4b,0x5e,0x4b,0x70,0x4b,0x76, -0x4b,0x88,0x4b,0x8e,0x4d,0x86,0x4b,0xfa,0x4d,0x8c,0x4c,0x06,0x4d,0x92,0x4c,0x4e,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0xa8,0x4c,0xae,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4d,0x98,0x4d,0x9e, -0x4d,0xa4,0x4d,0xaa,0x4d,0xb0,0x4d,0xb6,0x4d,0xbc,0x4d,0xc2,0x4c,0xd8,0x4c,0xde,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0xc8,0x4d,0xce,0x4d,0xd4,0x4d,0xda,0x4c,0x00,0x4c,0x06, -0x4d,0xe0,0x4d,0xe6,0x4d,0xec,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4d,0x80,0x4b,0x5e,0x4d,0x80,0x4b,0x5e,0x4d,0x8c,0x4c,0x06,0x4e,0x04,0x4e,0x0a,0x4e,0x10,0x4e,0x16,0x4d,0x68,0x4d,0x6e,0x4c,0x78,0x4c,0x7e,0x4d,0x80,0x4b,0x5e,0x4e,0x1c,0x4b,0x8e,0x4d,0x80,0x4b,0x5e,0x4e,0x1c,0x4b,0x8e,0x4e,0x1c,0x4b,0x8e,0x4e,0x22,0x4e,0x28, -0x4e,0x2e,0x4e,0x34,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4b,0xbe,0x4d,0x8c,0x4c,0x06,0x4d,0x8c,0x4c,0x06,0x4d,0x8c,0x4c,0x06,0x4d,0x92,0x4c,0x4e,0x4d,0x92,0x4c,0x4e,0x4d,0x92,0x4c,0x4e,0x4c,0xf0,0x4c,0xf6,0x4b,0xdc,0x4b,0xe2,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a, -0x4b,0x7c,0x4b,0x82,0x4e,0x64,0x4e,0x6a,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4c,0x0c,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4b,0xb8,0x4b,0xbe,0x4c,0x30,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4b,0x70,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4e,0x82,0x4e,0x88, -0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4e,0x8e,0x4b,0x82,0x4e,0x94,0x4e,0x9a,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0xa0,0x4b,0xe2,0x4e,0xa6,0x4e,0xac,0x4b,0xdc,0x4b,0xe2,0x4e,0xb2,0x4e,0xb8,0x4b,0xdc,0x4b,0xe2, -0x4e,0xbe,0x4e,0xc4,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a,0x4e,0xd0,0x4e,0xd6,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x3c,0x4c,0x42,0x4e,0xdc,0x4e,0xe2,0x4e,0xe8,0x4c,0x42, -0x4e,0xee,0x4e,0xf4,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4e,0xfa,0x4f,0x00,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae, -0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4b,0xa0,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde, -0x4f,0x2a,0x4f,0x30,0x4c,0xd8,0x4c,0xde,0x4f,0x36,0x4f,0x3c,0x4f,0x42,0x4f,0x48,0x4f,0x4e,0x4f,0x54,0x4f,0x5a,0x4f,0x60,0x4f,0x66,0x4f,0x6c,0x4f,0x72,0x4f,0x78,0x4b,0xb8,0x4b,0xbe,0x4c,0xe4,0x4c,0xea,0x4f,0x7e,0x4f,0x84,0x4f,0x4e,0x4f,0x54,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4c,0xd8,0x4c,0xde,0x4b,0xdc,0x4b,0xe2, -0x4d,0x98,0x4d,0x9e,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4c,0x24,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4d,0x92,0x4c,0x4e, -0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x60,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4f,0x8a,0x4f,0x90,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56, -0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4f,0x9c,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4f,0xb4,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xcc,0x4f,0xd2,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96, -0x4d,0x80,0x4b,0x5e,0x4f,0xd8,0x4f,0xde,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96, -0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x4e,0x1c,0x4b,0x8e,0x50,0x1a,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6, -0x4e,0x46,0x4b,0xbe,0x50,0x20,0x50,0x26,0x4b,0xb8,0x4b,0xbe,0x4c,0xe4,0x4c,0xea,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4e,0x82,0x4e,0x88,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x50,0x2c,0x4d,0x0e, -0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4f,0x9c,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e, -0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4c,0x78,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e, -0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x50,0x3e,0x50,0x44,0x50,0x4a,0x50,0x50,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x50,0x56,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4b,0x64,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4b,0x64,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae, -0x4e,0x8e,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6, -0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x50,0x5c,0x4b,0x9a,0x50,0x62,0x4c,0xd2,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4f,0x1e,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde,0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde, -0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x4b,0xd6,0x4f,0x24,0x4c,0xde,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4b,0xdc,0x4b,0xe2,0x50,0x9e,0x50,0xa4,0x4e,0xa0,0x4b,0xe2,0x50,0xaa,0x50,0xb0, -0x4b,0xdc,0x4b,0xe2,0x50,0xb6,0x50,0xbc,0x4b,0xdc,0x4b,0xe2,0x4e,0xa6,0x4e,0xac,0x50,0xc2,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x50,0xc2,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x4b,0xe8,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde, -0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x50,0x2c,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x50,0xc8,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x50,0xc8,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a, -0x4c,0x24,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4c,0x24,0x4c,0x2a,0x50,0xce,0x50,0xd4,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x30,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x50,0xda,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x50,0xda,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26, -0x4e,0xe8,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x50,0xe0,0x50,0xe6,0x4c,0x3c,0x4c,0x42,0x50,0xec,0x50,0xf2,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e, -0x4d,0x92,0x4c,0x4e,0x50,0xf8,0x4d,0x3e,0x50,0xfe,0x4c,0x5a,0x4d,0x44,0x4d,0x4a,0x4c,0x54,0x4c,0x5a,0x4d,0x44,0x4d,0x4a,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4c,0x60,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x51,0x04,0x4c,0x72,0x4d,0x5c,0x4d,0x62,0x51,0x04,0x4c,0x72,0x4d,0x5c,0x4d,0x62,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e, -0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0xd8,0x4c,0xde,0x4d,0x2c,0x4d,0x32,0x4d,0x50,0x4d,0x56,0x4d,0x68,0x4d,0x6e,0x4c,0x90,0x4c,0x96,0x51,0x0a,0x4f,0x90,0x4c,0x9c,0x4c,0xa2,0x51,0x10,0x51,0x16,0x51,0x1c,0x51,0x22,0x4c,0x9c,0x4c,0xa2, -0x51,0x1c,0x51,0x22,0x4c,0x9c,0x4c,0xa2,0x4e,0x82,0x4e,0x88,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x4b,0x7c,0x4b,0x82,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x34,0x51,0x3a,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x76,0x4b,0x94,0x4b,0x9a,0x51,0x7c,0x51,0x82,0x4c,0x54,0x4c,0x5a,0x51,0x88,0x51,0x8e, -0x51,0x94,0x51,0x9a,0x4d,0xbc,0x4d,0xc2,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x51,0xa0,0x51,0xa6,0x51,0xac,0x51,0xb2,0x51,0xb8,0x51,0xbe,0x51,0x28,0x51,0x2e,0x4c,0xd8,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x51,0xc4,0x51,0xca,0x51,0xd0,0x51,0xd6,0x51,0xdc,0x51,0xe2,0x4c,0x9c,0x4c,0xa2,0x51,0xe8,0x51,0xee,0x51,0xf4,0x51,0xfa, -0x52,0x00,0x52,0x06,0x52,0x0c,0x52,0x12,0x4e,0xbe,0x4e,0xc4,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x52,0x18,0x52,0x1e,0x52,0x24,0x52,0x2a,0x52,0x30,0x52,0x36,0x4c,0x78,0x4c,0x7e,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x52,0x3c,0x52,0x42,0x52,0x48,0x52,0x4e,0x52,0x54,0x52,0x5a, -0x52,0x60,0x52,0x66,0x52,0x6c,0x52,0x72,0x52,0x78,0x52,0x7e,0x52,0x84,0x52,0x8a,0x52,0x90,0x52,0x96,0x52,0x9c,0x52,0xa2,0x52,0xa8,0x52,0xae,0x52,0xb4,0x52,0xba,0x52,0xc0,0x52,0xc6,0x52,0xcc,0x52,0xd2,0x52,0xd8,0x52,0xde,0x52,0xe4,0x52,0xea,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6,0x52,0xfc,0x53,0x02,0x53,0x08,0x53,0x0e, -0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x50,0x4a,0x50,0x50,0x53,0x14,0x4d,0xda,0x53,0x1a,0x53,0x20,0x53,0x26,0x53,0x2c,0x53,0x32,0x53,0x38,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x50,0x98,0x4b,0xd6,0x4f,0x24,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06, -0x4d,0x08,0x4d,0x0e,0x53,0x3e,0x52,0x42,0x53,0x44,0x53,0x4a,0x4d,0xbc,0x4d,0xc2,0x53,0x50,0x52,0x8a,0x53,0x56,0x53,0x5c,0x53,0x62,0x53,0x68,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x53,0x6e,0x53,0x74,0x53,0x7a,0x53,0x80,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6,0x4d,0x80,0x4b,0x5e, -0x52,0xf0,0x52,0xf6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x46,0x4b,0xbe,0x53,0x86,0x53,0x8c,0x53,0x92,0x53,0x98,0x53,0x9e,0x53,0xa4,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a, -0x53,0xaa,0x53,0xb0,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x4d,0x4a,0x53,0xb6,0x53,0xbc,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde,0x53,0x7a,0x53,0x80,0x51,0x10,0x51,0x16,0x53,0xc2,0x53,0xc8,0x51,0xdc,0x51,0xe2,0x53,0xce,0x53,0xd4,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6, -0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4d,0xf8,0x4d,0xfe,0x4c,0xb4,0x4c,0xba,0x4c,0x9c,0x4c,0xa2,0x53,0xda,0x53,0xe0,0x53,0xe6,0x53,0xec,0x53,0xf2,0x53,0xf8,0x53,0xfe,0x54,0x04,0x53,0xfe,0x54,0x04,0x50,0x4a,0x50,0x50,0x54,0x0a,0x54,0x10,0x54,0x16,0x54,0x1c,0x54,0x22,0x54,0x28, -0x54,0x2e,0x54,0x34,0x4c,0x3c,0x4c,0x42,0x54,0x3a,0x54,0x40,0x53,0xfe,0x54,0x04,0x4c,0xb4,0x4c,0xba,0x54,0x46,0x54,0x4c,0x54,0x52,0x54,0x58,0x53,0xce,0x53,0xd4,0x4d,0x38,0x4d,0x3e,0x4c,0xd8,0x4c,0xde,0x4c,0xd8,0x4c,0xde,0x54,0x5e,0x54,0x64,0x54,0x6a,0x54,0x70,0x54,0x76,0x54,0x7c,0x54,0x82,0x54,0x88,0x54,0x22,0x54,0x28, -0x54,0x8e,0x54,0x94,0x54,0x9a,0x54,0xa0,0x4c,0xfc,0x4d,0x02,0x4c,0xfc,0x4d,0x02,0x4c,0xfc,0x4d,0x02,0x4c,0xd8,0x4c,0xde,0x54,0xa6,0x54,0xac,0x54,0xb2,0x54,0xb8,0x4d,0x08,0x4d,0x0e,0x54,0xbe,0x54,0xc4,0x54,0xca,0x54,0xd0,0x54,0xd6,0x54,0xdc,0x54,0xe2,0x4f,0x6c,0x54,0xe2,0x4f,0x6c,0x54,0xe8,0x54,0xee,0x4d,0x14,0x4d,0x1a, -0x4d,0x14,0x4d,0x1a,0x54,0xf4,0x54,0xfa,0x55,0x00,0x55,0x06,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x55,0x0c,0x55,0x12,0x55,0x18,0x55,0x1e,0x55,0x24,0x55,0x2a,0x55,0x30,0x55,0x36,0x55,0x3c,0x55,0x42,0x55,0x3c,0x55,0x42,0x4d,0x2c,0x4d,0x32,0x55,0x48,0x55,0x4e,0x51,0xe8,0x51,0xee,0x52,0x78,0x52,0x7e,0x52,0x54,0x52,0x5a, -0x4d,0x50,0x4d,0x56,0x55,0x54,0x55,0x5a,0x55,0x60,0x55,0x66,0x55,0x6c,0x55,0x72,0x55,0x78,0x55,0x7e,0x53,0x44,0x53,0x4a,0x55,0x84,0x55,0x8a,0x55,0x90,0x55,0x96,0x55,0x9c,0x55,0xa2,0x55,0xa8,0x55,0xae,0x55,0xb4,0x55,0xba,0x55,0xc0,0x55,0xc6,0x55,0xcc,0x55,0xd2,0x55,0xd8,0x55,0xde,0x4c,0x9c,0x4c,0xa2,0x4d,0x38,0x4d,0x3e, -0x55,0xe4,0x4e,0x40,0x55,0xea,0x55,0xf0,0x55,0xf6,0x55,0xfc,0x53,0xfe,0x54,0x04,0x55,0x90,0x55,0x96,0x55,0x9c,0x55,0xa2,0x56,0x02,0x56,0x08,0x56,0x0e,0x56,0x14,0x56,0x1a,0x56,0x20,0x56,0x26,0x56,0x2c,0x56,0x32,0x56,0x38,0x4c,0x00,0x4c,0x06,0x56,0x3e,0x56,0x44,0x4d,0x08,0x4d,0x0e,0x4c,0x78,0x4c,0x7e,0x56,0x4a,0x56,0x50, -0x55,0xcc,0x55,0xd2,0x4c,0xf0,0x4c,0xf6,0x54,0x5e,0x54,0x64,0x56,0x56,0x56,0x5c,0x55,0xea,0x55,0xf0,0x56,0x62,0x56,0x68,0x55,0x84,0x55,0x8a,0x52,0x78,0x52,0x7e,0x53,0x7a,0x53,0x80,0x56,0x6e,0x56,0x74,0x56,0x6e,0x56,0x74,0x4b,0x58,0x4b,0x5e,0x56,0x7a,0x56,0x80,0x56,0x86,0x56,0x8c,0x4b,0xdc,0x4b,0xe2,0x56,0x92,0x56,0x98, -0x4d,0x20,0x4d,0x26,0x4d,0x74,0x4d,0x7a,0x56,0x9e,0x56,0xa4,0x4c,0x9c,0x4c,0xa2,0x56,0xaa,0x56,0xb0,0x4c,0xcc,0x4c,0xd2,0x52,0xd8,0x52,0xde,0x56,0xb6,0x56,0xbc,0x4c,0x9c,0x4c,0xa2,0x4d,0x14,0x4d,0x1a,0x54,0xf4,0x54,0xfa,0x56,0xc2,0x56,0xc8,0x4d,0x2c,0x4d,0x32,0x4d,0x74,0x4d,0x7a,0x53,0xda,0x53,0xe0,0x56,0xce,0x56,0xd4, -0x56,0xda,0x56,0xe0,0x56,0xe6,0x56,0xec,0x56,0xf2,0x56,0xf8,0x56,0xfe,0x57,0x04,0x4c,0x48,0x4c,0x4e,0x57,0x0a,0x57,0x10,0x57,0x16,0x57,0x1c,0x4c,0x9c,0x4c,0xa2,0x4f,0xa8,0x4f,0xae,0x4c,0xcc,0x4c,0xd2,0x57,0x22,0x57,0x28,0x57,0x2e,0x57,0x34,0x57,0x3a,0x57,0x40,0x57,0x46,0x57,0x4c,0x57,0x52,0x57,0x58,0x4c,0x9c,0x4c,0xa2, -0x4d,0x14,0x4d,0x1a,0x57,0x5e,0x57,0x64,0x57,0x6a,0x57,0x70,0x57,0x76,0x57,0x7c,0x4d,0x5c,0x4d,0x62,0x4d,0x74,0x4d,0x7a,0x57,0x82,0x57,0x88,0x57,0x8e,0x57,0x94,0x53,0xfe,0x54,0x04,0x57,0x9a,0x57,0xa0,0x4c,0x0c,0x4c,0x12,0x57,0xa6,0x57,0xac,0x57,0xb2,0x57,0xb8,0x57,0xbe,0x57,0xc4,0x53,0xe6,0x53,0xec,0x55,0x18,0x55,0x1e, -0x57,0xca,0x57,0xd0,0x53,0x44,0x53,0x4a,0x57,0xd6,0x57,0xdc,0x54,0x16,0x54,0x1c,0x4d,0xec,0x4d,0xf2,0x57,0xe2,0x57,0xe8,0x57,0xee,0x57,0xf4,0x4c,0x3c,0x4c,0x42,0x4b,0x64,0x4b,0x6a,0x55,0x0c,0x55,0x12,0x4b,0xb8,0x4b,0xbe,0x57,0xfa,0x58,0x00,0x53,0x32,0x53,0x38,0x56,0x92,0x56,0x98,0x58,0x06,0x58,0x0c,0x58,0x12,0x58,0x18, -0x51,0xac,0x51,0xb2,0x58,0x1e,0x58,0x24,0x58,0x2a,0x58,0x30,0x58,0x36,0x58,0x3c,0x58,0x42,0x58,0x48,0x51,0xdc,0x51,0xe2,0x56,0x92,0x56,0x98,0x58,0x4e,0x58,0x54,0x58,0x5a,0x58,0x60,0x58,0x66,0x58,0x6c,0x58,0x72,0x58,0x78,0x4c,0xf0,0x4c,0xea,0x00,0x02,0x00,0x03,0x04,0xad,0x04,0xaf,0x00,0x00,0x07,0x5d,0x07,0x5f,0x00,0x03, -0x07,0xf0,0x07,0xf0,0x00,0x06,0x00,0x02,0x00,0x2a,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f, -0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce, -0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46,0x02,0x3c,0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e, -0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf,0x0a,0xcc,0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31, -0x11,0x8c,0x11,0x8c,0x03,0x32,0x00,0x01,0x00,0xa4,0x00,0xaa,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x8e,0x00,0x48,0x4a,0x8e,0x4a,0x94,0x4a,0x9a,0x4a,0xa0,0x4a,0xa6,0x4a,0xa6,0x4a,0xac,0x4a,0xb2,0x4a,0xb8,0x4a,0xbe,0x4a,0xc4,0x4a,0xca,0x4a,0xd0,0x4a,0xd6,0x4a,0xdc,0x4a,0xe2,0x4a,0xdc,0x4a,0xe8,0x4a,0xee, -0x4a,0xf4,0x4a,0xfa,0x4b,0x00,0x4b,0x06,0x3a,0xbc,0x3a,0xbc,0x3a,0xbc,0x4b,0x0c,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x4b,0x24,0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x54,0x4b,0x5a,0x4b,0x60,0x4b,0x66,0x4b,0x6c,0x4b,0x72,0x4b,0x78,0x4b,0x7e,0x4b,0x84,0x4b,0x8a,0x4b,0x90,0x4b,0x96,0x4b,0x9c, -0x4b,0xa2,0x4b,0x60,0x4b,0x60,0x4b,0x60,0x4b,0x84,0x4b,0x84,0x4a,0xdc,0x4a,0xdc,0x4a,0xdc,0x4a,0xfa,0x4a,0xfa,0x4a,0xfa,0x4b,0x84,0x4a,0xdc,0x4b,0x60,0x4a,0xdc,0x4b,0x60,0x4a,0xfa,0x4b,0x84,0x4a,0xfa,0x4b,0x84,0x00,0x01,0x00,0x01,0x04,0x7a,0x00,0x02,0x00,0x0b,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a, -0x00,0x79,0x00,0x7a,0x00,0x34,0x00,0x7d,0x00,0x7f,0x00,0x36,0x00,0xaf,0x00,0xaf,0x00,0x39,0x00,0xd0,0x00,0xd0,0x00,0x3a,0x00,0xd2,0x00,0xd3,0x00,0x3b,0x00,0xd5,0x00,0xd5,0x00,0x3d,0x01,0x78,0x01,0x79,0x00,0x3e,0x02,0x83,0x02,0x86,0x00,0x40,0x02,0x9b,0x02,0x9e,0x00,0x44,0x00,0x01,0x00,0x58,0x00,0x5e,0x00,0x01,0x00,0x0c, -0x00,0x12,0x00,0x01,0x00,0x00,0x1e,0xc0,0x00,0x22,0x4a,0xb8,0x4a,0xbe,0x17,0x16,0x2b,0x02,0x19,0xec,0x4a,0xc4,0x18,0x30,0x4a,0xca,0x4a,0xd0,0x4a,0xd6,0x4a,0xdc,0x17,0x70,0x4a,0xe2,0x23,0xb2,0x4a,0xe8,0x4a,0xee,0x4a,0xf4,0x4a,0xfa,0x4b,0x00,0x4b,0x06,0x4b,0x0c,0x21,0x54,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x32,0xe8,0x4b,0x06, -0x4b,0x06,0x32,0xe8,0x32,0xe8,0x19,0xec,0x4a,0xe2,0x4a,0xe2,0x4b,0x06,0x00,0x01,0x00,0x01,0x04,0x85,0x00,0x02,0x00,0x17,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x26,0x00,0x26,0x00,0x01,0x00,0x28,0x00,0x28,0x00,0x02,0x00,0x2a,0x00,0x2a,0x00,0x03,0x00,0x2c,0x00,0x2c,0x00,0x04,0x00,0x2e,0x00,0x2f,0x00,0x05,0x00,0x31,0x00,0x32, -0x00,0x07,0x00,0x35,0x00,0x38,0x00,0x09,0x00,0x44,0x00,0x44,0x00,0x0d,0x00,0x46,0x00,0x46,0x00,0x0e,0x00,0x48,0x00,0x48,0x00,0x0f,0x00,0x4a,0x00,0x4a,0x00,0x10,0x00,0x4c,0x00,0x4c,0x00,0x11,0x00,0x4e,0x00,0x4f,0x00,0x12,0x00,0x51,0x00,0x52,0x00,0x14,0x00,0x55,0x00,0x58,0x00,0x16,0x00,0x74,0x00,0x74,0x00,0x1a,0x00,0x76, -0x00,0x76,0x00,0x1b,0x00,0x7e,0x00,0x7e,0x00,0x1c,0x00,0x80,0x00,0x80,0x00,0x1d,0x00,0xcd,0x00,0xcd,0x00,0x1e,0x00,0xd3,0x00,0xd4,0x00,0x1f,0x01,0x0f,0x01,0x0f,0x00,0x21,0x00,0x01,0x06,0x78,0x06,0x7e,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x3e,0x03,0x32,0x4a,0x3e,0x4a,0x44,0x4a,0x4a,0x4a,0x44,0x1d,0x98, -0x4a,0x50,0x4a,0x56,0x4a,0x5c,0x4a,0x50,0x4a,0x62,0x4a,0x68,0x4a,0x6e,0x4a,0x74,0x4a,0x7a,0x4a,0x80,0x4a,0x50,0x4a,0x86,0x4a,0x8c,0x4a,0x92,0x4a,0x98,0x1d,0x98,0x16,0x2a,0x4a,0x9e,0x4a,0x68,0x4a,0xa4,0x4a,0xaa,0x1b,0xfa,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x16,0x7e,0x19,0x24,0x4a,0xc2,0x4a,0xc8,0x4a,0x50,0x4a,0xce,0x4a,0xd4, -0x19,0x12,0x4a,0xda,0x4a,0xc8,0x16,0x7e,0x4a,0xe0,0x4a,0xe6,0x19,0x12,0x4a,0x98,0x4a,0xec,0x4a,0xf2,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x16,0x7e,0x4a,0x3e,0x4a,0x3e,0x4b,0x10,0x1d,0x98,0x4b,0x16,0x4a,0x80,0x1d,0x98,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x4b,0x1c,0x16,0x7e,0x16,0x7e,0x16,0x7e, -0x16,0x7e,0x19,0x12,0x19,0x12,0x19,0x12,0x19,0x12,0x4a,0xc8,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x4a,0xf2,0x4a,0xf2,0x4a,0xf2,0x4a,0xf2,0x17,0xe0,0x4a,0xda,0x4a,0x80,0x4b,0x22,0x16,0x7e,0x4b,0x28,0x4a,0x3e,0x4a,0x3e,0x4a,0x80,0x4b,0x2e,0x4b,0x34,0x4b,0x0a,0x4a,0xa4,0x4a,0x3e,0x1d,0x98,0x4a,0x3e,0x1d,0x98, -0x1d,0x98,0x4a,0x50,0x19,0x24,0x4a,0x50,0x4b,0x3a,0x4a,0x80,0x4a,0x80,0x4a,0x80,0x1d,0x98,0x1d,0x98,0x1d,0x98,0x19,0x12,0x4a,0x6e,0x4a,0x62,0x4a,0x92,0x4a,0x98,0x4a,0xaa,0x16,0x7e,0x4b,0x40,0x4b,0x46,0x4a,0xa4,0x4b,0x0a,0x19,0x36,0x4b,0x4c,0x4a,0x56,0x4a,0xc2,0x4a,0x50,0x4b,0x52,0x4b,0x58,0x4a,0x4a,0x4a,0xb6,0x4a,0x4a, -0x4a,0xb6,0x4a,0xbc,0x4a,0x3e,0x1b,0xfa,0x4b,0x5e,0x29,0x80,0x4a,0x44,0x4a,0xbc,0x4a,0x44,0x4b,0x64,0x4b,0x6a,0x1d,0x98,0x16,0x7e,0x4a,0x6e,0x19,0x12,0x4a,0x6e,0x19,0x12,0x4a,0x6e,0x19,0x12,0x4a,0x7a,0x4a,0xc8,0x4a,0x7a,0x4a,0xc8,0x4a,0x80,0x16,0x7e,0x4a,0x8c,0x19,0x12,0x4a,0x8c,0x19,0x12,0x4a,0x92,0x4a,0x98,0x47,0x32, -0x4b,0x70,0x4a,0x98,0x4a,0xec,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4a,0xaa,0x16,0x7e,0x4a,0xaa,0x16,0x7e,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4a,0x3e,0x1b,0xfa,0x4a,0x4a,0x4a,0xb6,0x4a,0x4a,0x4a,0xb6,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4a,0x56,0x4a,0xc2,0x4a,0x56,0x4a,0xc2,0x4b,0x88,0x4a,0xc2, -0x4a,0x5c,0x4a,0xc8,0x4a,0x5c,0x4a,0xc8,0x4a,0x50,0x19,0x12,0x4a,0x50,0x19,0x12,0x4a,0x50,0x4b,0x8e,0x2c,0x50,0x4b,0x94,0x4a,0x62,0x4a,0xce,0x4a,0x68,0x1d,0xda,0x16,0x4e,0x4b,0x1c,0x4b,0x9a,0x4a,0x7a,0x4a,0xaa,0x4b,0xa0,0x4b,0xa6,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x8c,0x4b,0x8e,0x4a,0x92,0x4a,0x98,0x4a,0x98, -0x4a,0xec,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4b,0x64,0x4b,0xac,0x4a,0x9e,0x4a,0xfe,0x4a,0xa4,0x4b,0x0a,0x19,0x12,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4a,0xfe,0x4a,0xa4,0x4b,0x0a,0x4a,0x80,0x16,0x7e,0x1d,0x98,0x4a,0xf2,0x4a,0x3e,0x4b,0xb2,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa, -0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x4b,0xb2,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x4b,0xb2,0x1c,0x8a,0x4b,0xb8,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e, -0x1c,0x8a,0x4b,0xb8,0x19,0x36,0x19,0x12,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xd0,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4b,0xd6,0x4b,0xdc,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4a,0xbc, -0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4b,0xf4,0x4a,0xbc,0x4b,0xfa,0x4c,0x00,0x4a,0xa4,0x4b,0x0a,0x4a,0xa4,0x4b,0x0a,0x4c,0x06,0x4c,0x0c,0x4a,0xf2,0x16,0x2a,0x3e,0x62,0x4c,0x12,0x4a,0x3e,0x4a,0xd4,0x4a,0x44,0x4a,0xb0,0x4c,0x18,0x4c,0x1e,0x4c,0x24,0x4c,0x2a, -0x42,0xa0,0x4c,0x30,0x4a,0x44,0x4a,0xbc,0x4c,0x36,0x4a,0xaa,0x4c,0x3c,0x4c,0x42,0x4c,0x48,0x4a,0xaa,0x4c,0x4e,0x23,0x32,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4c,0x54,0x4c,0x54,0x4c,0x5a,0x4c,0x60,0x4c,0x66,0x4c,0x12,0x19,0x36,0x19,0x24,0x4a,0x56,0x4a,0xc2,0x4a,0x5c,0x4a,0xc8,0x4a,0x5c,0x1e,0x4c,0x4a,0x5c,0x4a,0xc8, -0x4a,0x5c,0x4a,0xc8,0x4c,0x6c,0x4c,0x72,0x4c,0x78,0x4c,0x7e,0x4a,0x50,0x19,0x12,0x4a,0x68,0x4a,0xd4,0x4a,0x68,0x4c,0x84,0x4c,0x8a,0x4c,0x90,0x4a,0xf2,0x4c,0x96,0x4a,0xf2,0x4c,0x9c,0x4c,0xa2,0x29,0xc8,0x4c,0xa8,0x4c,0xae,0x4a,0x74,0x4a,0xda,0x4a,0x74,0x4a,0xda,0x4a,0x74,0x4c,0xb4,0x4a,0x7a,0x4a,0xc8,0x4a,0x7a,0x4a,0xaa, -0x4c,0xba,0x28,0xfc,0x22,0xd8,0x4c,0xc0,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x19,0x36,0x4c,0xc6,0x19,0x36,0x4c,0xc6,0x4a,0x8c,0x19,0x12,0x4a,0x8c,0x4b,0x8e,0x4a,0x8c,0x4b,0x8e,0x4c,0xcc,0x4c,0xd2,0x4a,0x92,0x4a,0x98,0x4c,0xd8,0x4c,0xde,0x4a,0x92,0x4a,0x98,0x4a,0x92,0x4a,0x98, -0x4c,0xe4,0x4c,0xea,0x4a,0x98,0x4a,0xec,0x4c,0xf0,0x4c,0xf6,0x4c,0xfc,0x4d,0x02,0x4d,0x08,0x4d,0x0e,0x4d,0x14,0x4d,0x1a,0x4d,0x20,0x4d,0x26,0x4c,0x4e,0x4c,0xa8,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x16,0x2a,0x4a,0xf8,0x4c,0x60,0x33,0x8e,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4d,0x2c,0x4a,0x68,0x4b,0x04,0x4a,0x68,0x4b,0x04, -0x4a,0xa4,0x4b,0x0a,0x4a,0xaa,0x16,0x7e,0x4d,0x32,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x28,0xfc,0x4a,0xec,0x4a,0xfe,0x4b,0x0a,0x1b,0xfa,0x19,0x12,0x4a,0xb0,0x4d,0x4a,0x4d,0x50,0x4a,0xb0,0x1b,0xdc,0x4a,0xb0,0x4d,0x56,0x4a,0x4a,0x4d,0x5c,0x4a,0x44,0x1c,0x4e,0x4d,0x62,0x4d,0x68,0x4d,0x6e,0x4d,0x74,0x4d,0x7a,0x4d,0x80,0x4a,0x56, -0x29,0x02,0x4d,0x86,0x4d,0x8c,0x19,0x36,0x4a,0x68,0x4a,0xd4,0x19,0x12,0x4a,0xf2,0x4a,0x74,0x4a,0x7a,0x4d,0x92,0x4a,0x80,0x4d,0x98,0x4d,0x9e,0x4d,0xa4,0x4d,0xaa,0x4d,0xb0,0x1d,0x26,0x4d,0xb6,0x4b,0xb2,0x4d,0xbc,0x4d,0xc2,0x4a,0x98,0x4a,0xec,0x4d,0xc8,0x4d,0xce,0x4d,0xd4,0x17,0xc2,0x4b,0x0a,0x4a,0xaa,0x16,0x7e,0x4d,0xda, -0x4d,0xe0,0x17,0xe6,0x4d,0xe6,0x4d,0xec,0x4b,0x4c,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4e,0x04,0x47,0xaa,0x4b,0x7c,0x4e,0x0a,0x4e,0x10,0x4e,0x16,0x4a,0x3e,0x1b,0xfa,0x4a,0x50,0x19,0x12,0x4a,0x80,0x16,0x7e,0x1d,0x98,0x4a,0xf2,0x1c,0x0c,0x4e,0x1c,0x4e,0x22,0x4a,0x56,0x4a,0xc2,0x4a,0x56,0x4a,0xc2,0x4a,0x68,0x4a,0xd4,0x4e,0x28, -0x4e,0x2e,0x4e,0x28,0x4e,0x2e,0x4d,0x6e,0x4e,0x34,0x4a,0xce,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4a,0x56,0x4a,0xc2,0x4e,0x3a,0x4e,0x40,0x4b,0x16,0x4a,0xc8,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4a,0x50,0x19,0x12,0x4a,0x50,0x19,0x12,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x8c, -0x19,0x12,0x4a,0x8c,0x19,0x12,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x29,0x20,0x36,0x4c,0x4a,0x5c,0x4a,0xc8,0x4e,0x46,0x4a,0xb0,0x16,0x7e,0x1a,0xe6,0x4a,0xa4,0x4a,0x3e,0x1b,0xfa,0x4a,0x80,0x16,0x7e,0x4a,0xa4,0x4b,0x0a,0x4e,0x4c,0x4e,0x52,0x1e,0x46,0x4b,0x04,0x4e,0x58,0x1b,0x82,0x4e,0x5e,0x4a,0xbc,0x16,0x2a,0x4e,0x64, -0x15,0xfa,0x4d,0xec,0x4e,0x6a,0x4e,0x70,0x4e,0x76,0x4a,0xc2,0x4a,0xc2,0x1b,0x22,0x4e,0x7c,0x4e,0x82,0x4e,0x88,0x4a,0xc8,0x44,0x56,0x18,0xe2,0x4d,0x8c,0x4e,0x8e,0x4b,0x3a,0x4e,0x94,0x2f,0xf8,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4a,0xc8,0x4e,0xb2,0x1e,0x9a,0x16,0x7e,0x4e,0xb8,0x4d,0x2c,0x26,0xb0,0x4e,0xbe,0x4e,0xc4, -0x2a,0x4c,0x32,0xc8,0x2f,0xf8,0x19,0x9c,0x4e,0xca,0x4e,0xd0,0x1b,0xee,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x20,0xb0,0x4e,0xe8,0x4e,0xee,0x2f,0xe6,0x4d,0x68,0x1e,0x46,0x4e,0xf4,0x4b,0xb2,0x4e,0x22,0x4b,0xb2,0x4e,0xfa,0x4f,0x00,0x4b,0x04,0x4f,0x06,0x4f,0x0c,0x18,0xd6,0x4f,0x12,0x4f,0x18,0x4f,0x1e,0x4f,0x24,0x17,0xc2,0x1b,0x9a, -0x1a,0xe6,0x1c,0x18,0x4f,0x2a,0x4f,0x30,0x1c,0x0c,0x4f,0x36,0x18,0xd6,0x4f,0x3c,0x4f,0x42,0x4f,0x48,0x4d,0x98,0x4a,0xf2,0x4f,0x4e,0x4f,0x54,0x4f,0x5a,0x4f,0x60,0x4a,0xaa,0x1d,0xe6,0x4f,0x60,0x4a,0xce,0x19,0x12,0x4e,0x16,0x4f,0x66,0x4f,0x6c,0x44,0x6e,0x4f,0x72,0x4e,0x5e,0x4f,0x78,0x4f,0x7e,0x4a,0x3e,0x4a,0x4a,0x4a,0xb6, -0x4a,0x6e,0x4a,0x98,0x4c,0xde,0x4f,0x84,0x4d,0xec,0x4a,0xb0,0x4a,0xbc,0x19,0x24,0x4a,0xda,0x4a,0xc8,0x4a,0xe0,0x19,0x12,0x4b,0x8e,0x4a,0xa4,0x4a,0xec,0x16,0x7e,0x4f,0x8a,0x4f,0x90,0x2f,0x56,0x4f,0x96,0x4f,0x9c,0x1e,0x34,0x4a,0xe0,0x4f,0xa2,0x1e,0x46,0x4f,0xa8,0x4f,0xae,0x27,0x28,0x4a,0xc2,0x4f,0xb4,0x4f,0xba,0x4f,0xc0, -0x4f,0xc6,0x4a,0xe0,0x4f,0xba,0x25,0x72,0x4e,0xdc,0x4f,0xb4,0x4f,0xcc,0x25,0x90,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x1c,0x0c,0x25,0x78,0x27,0x28,0x21,0xfa,0x4f,0xf6,0x1a,0xe6,0x4f,0xfc,0x50,0x02,0x4a,0x44,0x1d,0x98,0x50,0x08,0x1d,0x98,0x16,0x7e,0x4a,0x62,0x4a,0xce,0x50,0x0e,0x50,0x14,0x4a,0x8c, -0x19,0x12,0x4a,0xa4,0x50,0x1a,0x4a,0xb6,0x4a,0x6e,0x4b,0x3a,0x4a,0x6e,0x4a,0x62,0x4a,0x8c,0x1b,0xfa,0x4a,0xec,0x4d,0xb6,0x50,0x20,0x00,0x01,0x00,0x01,0x04,0x86,0x00,0x02,0x00,0x29,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92, -0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45, -0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce,0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46,0x02,0x3c, -0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e,0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf,0x0a,0xcc, -0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31,0x00,0x01,0x00,0x68,0x00,0x70,0x00,0x02,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x48,0xb4,0x00,0x01,0x48,0xba,0x00,0x14,0x48,0xb6,0x48,0xb6,0x48,0xbc,0x48,0xbc,0x48,0xc2,0x48,0xc8,0x48,0xce, -0x48,0xce,0x48,0xd4,0x48,0xda,0x48,0xe0,0x48,0xe0,0x48,0xe6,0x48,0xe6,0x48,0xec,0x48,0xec,0x42,0x9e,0x42,0x9e,0x48,0xf2,0x48,0xf2,0x48,0xf8,0x48,0xe0,0x48,0xfe,0x48,0xfe,0x49,0x04,0x49,0x04,0x49,0x0a,0x49,0x0a,0x49,0x10,0x49,0x10,0x0f,0x62,0x0f,0x62,0x14,0xf0,0x14,0xf0,0x49,0x16,0x49,0x16,0x49,0x1c,0x49,0x22,0x49,0x28, -0x49,0x2e,0x00,0x01,0x00,0x02,0x04,0x80,0x04,0x81,0x00,0x02,0x00,0x05,0x00,0x45,0x00,0x47,0x00,0x00,0x00,0x49,0x00,0x4b,0x00,0x03,0x00,0x4d,0x00,0x51,0x00,0x06,0x00,0x53,0x00,0x5a,0x00,0x0b,0x00,0x5d,0x00,0x5d,0x00,0x13,0x00,0x01,0x0c,0xec,0x0c,0xf6,0x00,0x02,0x00,0x0c,0x00,0x1e,0x00,0x04,0x00,0x00,0x48,0xac,0x00,0x01, -0x48,0xb2,0x00,0x00,0x48,0xb8,0x00,0x01,0x48,0xbe,0x03,0x33,0x48,0xb2,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x48,0xca,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x48,0xee,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x48,0xfa,0x48,0xb8, -0x49,0x00,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x54,0x48,0xb8, -0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x49,0x60,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x66,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x84,0x48,0xb8, -0x49,0x8a,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x37,0x00,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8, -0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x54,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8, -0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0xae,0x48,0xb8,0x49,0xb4,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0xba,0x48,0xb8,0x49,0x78,0x48,0xb8,0x38,0x44,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x06,0x48,0xb8, -0x49,0xc0,0x48,0xb8,0x49,0xc6,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x37,0x00,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x06,0x48,0xb8, -0x49,0x24,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x24,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xcc,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0xd2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8, -0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0xd8,0x48,0xb8, -0x48,0xca,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xde,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xe4,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8, -0x49,0x78,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0xea,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x42,0x48,0xb8, -0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0xf0,0x48,0xb8,0x49,0xf6,0x48,0xb8,0x49,0xfc,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8, -0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8, -0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8, -0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8, -0x49,0x66,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8, -0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8, -0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8, -0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8, -0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8, -0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8, -0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x4a,0x14,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8, -0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8, -0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x49,0x60,0x48,0xb8, -0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8, -0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8, -0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8,0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8, -0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8, -0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8, -0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x90,0x48,0xb8, -0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8, -0x49,0x66,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x20,0x48,0xb8,0x4a,0x26,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x2c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x32,0x48,0xb8,0x4a,0x32,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x48,0xca,0x48,0xb8, -0x4a,0x3e,0x48,0xb8,0x4a,0x44,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4a,0x50,0x48,0xb8,0x4a,0x56,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x4a,0x5c,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x4a,0x62,0x48,0xb8,0x4a,0x68,0x48,0xb8,0x4a,0x6e,0x48,0xb8,0x48,0xee,0x48,0xb8,0x4a,0x74,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x74,0x48,0xb8, -0x4a,0x7a,0x48,0xb8,0x49,0x00,0x48,0xb8,0x39,0x1c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x4a,0x80,0x48,0xb8,0x4a,0x86,0x48,0xb8,0x4a,0x8c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x92,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x4a,0x98,0x48,0xb8,0x4a,0x9e,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4a,0xaa,0x48,0xb8,0x4a,0xa4,0x48,0xb8, -0x4a,0xaa,0x48,0xb8,0x4a,0xb0,0x48,0xb8,0x4a,0xb6,0x48,0xb8,0x4a,0xbc,0x48,0xb8,0x4a,0xc2,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x38,0x44,0x48,0xb8,0x4a,0xce,0x48,0xb8,0x4a,0xd4,0x48,0xb8,0x4a,0xda,0x48,0xb8,0x4a,0xe0,0x48,0xb8,0x4a,0xe6,0x48,0xb8,0x4a,0xec,0x48,0xb8, -0x4a,0xf2,0x48,0xb8,0x4a,0xf8,0x48,0xb8,0x4a,0xfe,0x48,0xb8,0x4b,0x04,0x48,0xb8,0x4b,0x0a,0x48,0xb8,0x4b,0x10,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x49,0xb4,0x48,0xb8, -0x4b,0x1c,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x4b,0x22,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0xe0,0x48,0xb8,0x4a,0xe6,0x48,0xb8, -0x4a,0xec,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0x28,0x48,0xb8,0x4b,0x2e,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe2,0x48,0xb8, -0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x39,0x1c,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x34,0x48,0xb8, -0x4b,0x3a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x40,0x48,0xb8,0x49,0x36,0x48,0xb8,0x4b,0x46,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x37,0x36,0x48,0xb8, -0x37,0x36,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x39,0x16,0x48,0xb8,0x4b,0x4c,0x48,0xb8,0x4b,0x4c,0x48,0xb8,0x4a,0x50,0x48,0xb8,0x4b,0x52,0x48,0xb8,0x36,0x52,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0x58,0x48,0xb8, -0x49,0x90,0x48,0xb8,0x4b,0x5e,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x64,0x48,0xb8,0x4a,0x6e,0x48,0xb8,0x4b,0x6a,0x48,0xb8,0x4b,0x70,0x48,0xb8,0x4b,0x76,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x4b,0x7c,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x72,0x48,0xb8,0x4b,0x82,0x48,0xb8, -0x4b,0x82,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4b,0x88,0x48,0xb8,0x4a,0x14,0x48,0xb8,0x4b,0x8e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4b,0x9a,0x48,0xb8,0x4b,0x9a,0x48,0xb8,0x4b,0xa0,0x48,0xb8, -0x4b,0xa6,0x48,0xb8,0x4b,0xac,0x48,0xb8,0x4a,0x68,0x48,0xb8,0x4b,0xb2,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4b,0xb8,0x48,0xb8,0x4b,0xbe,0x48,0xb8,0x4b,0xc4,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0xca,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4b,0xd0,0x48,0xb8,0x4b,0x22,0x48,0xb8, -0x4b,0x22,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x37,0x36,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0xdc,0x48,0xb8,0x4b,0x58,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x4a,0x74,0x48,0xb8,0x4b,0xe2,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8, -0x4b,0xe8,0x48,0xb8,0x4b,0xee,0x48,0xb8,0x4b,0xf4,0x48,0xb8,0x4a,0x20,0x48,0xb8,0x4b,0xfa,0x48,0xb8,0x4c,0x00,0x48,0xb8,0x4c,0x06,0x48,0xb8,0x48,0xee,0x48,0xb8,0x4a,0xbc,0x48,0xb8,0x4c,0x0c,0x48,0xb8,0x4c,0x0c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4b,0x64,0x48,0xb8,0x4c,0x12,0x48,0xb8,0x4c,0x18,0x48,0xb8,0x4c,0x1e,0x48,0xb8, -0x49,0x8a,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4c,0x24,0x48,0xb8,0x4c,0x24,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4c,0x2a,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x60,0x48,0xb8, -0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4c,0x30,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4c,0x36,0x48,0xb8,0x4c,0x3c,0x48,0xb8,0x4c,0x42,0x48,0xb8,0x4b,0x6a,0x48,0xb8,0x4c,0x48,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4c,0x4e,0x48,0xb8, -0x4b,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x60,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x84,0x48,0xb8,0x4c,0x54,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0xa8,0x48,0xb8, -0x49,0x48,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x4c,0x5a,0x48,0xb8,0x4c,0x60,0x48,0xb8,0x4c,0x66,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x4b,0xa6,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x22,0x48,0xb8,0x4c,0x6c,0x48,0xb8,0x4c,0x72,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x24,0x48,0xb8, -0x4c,0x78,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4c,0x7e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4c,0x84,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x4c,0x8a,0x48,0xb8,0x4c,0x90,0x48,0xb8,0x49,0x0c,0x48,0xb8, -0x49,0x12,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x4c,0x96,0x48,0xb8,0x4c,0x9c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x00,0x02,0x00,0x01,0x07,0x3a,0x07,0x3d,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91, -0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0, -0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce,0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46, -0x02,0x3c,0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e,0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf, -0x0a,0xcc,0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31,0x11,0x8c,0x11,0x8c,0x03,0x32,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x00,0x00,0x01,0x02,0x47,0x00,0x00,0x00,0x01,0x01,0xc1,0x00,0x00,0x00,0x01,0x03,0x0a,0x00,0x00, -0x00,0x01,0x02,0x6d,0x00,0x00,0x00,0x01,0x01,0xe7,0x00,0x00,0x00,0x01,0x02,0xb9,0x00,0x00,0x00,0x01,0x02,0x1c,0x00,0x00,0x00,0x01,0x01,0x96,0x00,0x00,0x00,0x01,0x02,0x30,0x00,0x00,0x00,0x01,0x01,0x93,0x00,0x00,0x00,0x01,0x01,0x0d,0x00,0x00,0x00,0x01,0x02,0xf2,0x00,0x00,0x00,0x01,0x02,0x23,0x00,0x00,0x00,0x01,0x01,0x61, -0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x02,0xa0,0x00,0x00,0x00,0x01,0x02,0x1a,0x00,0x00,0x00,0x01,0x00,0xf9,0x00,0x00,0x00,0x01,0x00,0x73,0x00,0x00,0x00,0x01,0x01,0x4b,0x00,0x00,0x00,0x01,0x00,0xcf,0x00,0x00,0x00,0x01,0x03,0x3b,0x00,0x00,0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x02,0x18,0x00,0x00,0x00,0x01, -0x03,0x3a,0x00,0x00,0x00,0x01,0x02,0x9d,0x00,0x00,0x00,0x01,0x02,0x17,0x00,0x00,0x00,0x01,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0xfc,0x00,0x00,0x00,0x01,0xff,0xf5,0x00,0x00,0x00,0x01,0x02,0x48,0x00,0x00,0x00,0x01,0x01,0xab,0x00,0x00,0x00,0x01,0x01,0x39,0x00,0x00,0x00,0x01,0x02,0x4d,0x00,0x00,0x00,0x01,0x01,0xb0,0x00,0x00, -0x00,0x01,0x01,0x2a,0x00,0x00,0x00,0x01,0x03,0x42,0x00,0x00,0x00,0x01,0x02,0xa5,0x00,0x00,0x00,0x01,0x02,0x1f,0x00,0x00,0x00,0x01,0xff,0xb5,0x00,0x00,0x00,0x01,0xfe,0x98,0x00,0x00,0x00,0x01,0xfd,0x91,0x00,0x00,0x00,0x01,0x01,0xee,0x00,0x00,0x00,0x01,0x01,0x51,0x00,0x00,0x00,0x01,0x00,0xcb,0x00,0x00,0x00,0x01,0x03,0x37, -0x00,0x00,0x00,0x01,0x02,0x9a,0x00,0x00,0x00,0x01,0x02,0x14,0x00,0x00,0x00,0x01,0x02,0xe8,0x00,0x00,0x00,0x01,0x02,0x4b,0x00,0x00,0x00,0x01,0x01,0xc5,0x00,0x00,0x00,0x01,0x02,0x85,0x00,0x00,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x01,0x02,0xcf,0x00,0x00,0x00,0x01,0x02,0x32,0x00,0x00,0x00,0x01, -0x01,0xac,0x00,0x00,0x00,0x01,0x00,0xd3,0x00,0x00,0x00,0x01,0xff,0xb6,0x00,0x00,0x00,0x01,0xfe,0xaf,0x00,0x00,0x00,0x01,0x02,0x8e,0x00,0x00,0x00,0x01,0x01,0xf1,0x00,0x00,0x00,0x01,0x01,0x6b,0x00,0x00,0x00,0x01,0x03,0x89,0x00,0x00,0x00,0x01,0x03,0x6b,0x00,0x00,0x00,0x01,0x03,0x61,0x00,0x00,0x00,0x01,0x03,0xe7,0x00,0x00, -0x00,0x01,0x03,0x18,0x00,0x00,0x00,0x01,0x02,0x06,0x00,0x00,0x00,0x01,0x03,0x83,0x00,0x00,0x00,0x01,0x02,0xe6,0x00,0x00,0x00,0x01,0x02,0x60,0x00,0x00,0x00,0x01,0x03,0x7e,0x00,0x00,0x00,0x01,0x02,0xe1,0x00,0x00,0x00,0x01,0x02,0x5b,0x00,0x00,0x00,0x01,0x02,0x9b,0x00,0x00,0x00,0x01,0x01,0xfe,0x00,0x00,0x00,0x01,0x01,0x78, -0x00,0x00,0x00,0x01,0x02,0xad,0x00,0x00,0x00,0x01,0x02,0x10,0x00,0x00,0x00,0x01,0x01,0x8a,0x00,0x00,0x00,0x01,0x02,0xc5,0x00,0x00,0x00,0x01,0x02,0x28,0x00,0x00,0x00,0x01,0x01,0xa2,0x00,0x00,0x00,0x01,0x02,0x34,0x00,0x00,0x00,0x01,0x01,0x97,0x00,0x00,0x00,0x01,0x01,0x11,0x00,0x00,0x00,0x01,0x01,0xdc,0x00,0x00,0x00,0x01, -0x01,0x3f,0x00,0x00,0x00,0x01,0x00,0xb9,0x00,0x00,0x00,0x01,0x02,0x42,0x00,0x00,0x00,0x01,0x01,0x73,0x00,0x00,0x00,0x01,0x00,0xf7,0x00,0x00,0x00,0x01,0x03,0xbf,0x00,0x00,0x00,0x01,0x03,0xe5,0x00,0x00,0x00,0x01,0x03,0x9a,0x00,0x00,0x00,0x01,0x03,0x0b,0x00,0x00,0x00,0x01,0x03,0x5b,0x00,0x00,0x00,0x01,0x04,0x18,0x00,0x00, -0x00,0x01,0x02,0x71,0x00,0x00,0x00,0x01,0x04,0x16,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x01,0x03,0x41,0x00,0x00,0x00,0x01,0x03,0x28,0x00,0x00,0x00,0x01,0x04,0x1d,0x00,0x00,0x00,0x01,0x02,0xc9,0x00,0x00,0x00,0x01,0x04,0x12,0x00,0x00,0x00,0x01,0x03,0xa1,0x00,0x00,0x00,0x01,0x03,0xaa,0x00,0x00,0x00,0x01,0x03,0x69, -0x00,0x00,0x00,0x01,0x05,0x40,0x00,0x00,0x00,0x01,0x03,0xab,0x00,0x00,0x00,0x01,0x04,0x5e,0x00,0x00,0x00,0x01,0x04,0x59,0x00,0x00,0x00,0x01,0x03,0x76,0x00,0x00,0x00,0x01,0x03,0x88,0x00,0x00,0x00,0x01,0x03,0xa0,0x00,0x00,0x00,0x01,0x02,0xb7,0x00,0x00,0x00,0x01,0x02,0xf7,0x00,0x00,0x00,0x01,0x04,0x11,0x00,0x00,0x00,0x01, -0xfe,0xfd,0x00,0x00,0x00,0x01,0x00,0xe6,0xff,0x9c,0x00,0x01,0x00,0xef,0x00,0x00,0x00,0x01,0x00,0xb8,0x00,0x00,0x00,0x01,0x00,0xca,0x00,0x00,0x00,0x01,0x00,0x8a,0x00,0x00,0x00,0x01,0x01,0x1d,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x00,0x01,0x01,0x10,0x00,0x00,0x00,0x01,0x00,0xf2,0x00,0x00, -0x00,0x01,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x01,0xff,0xac,0x00,0x00,0x00,0x01,0x01,0x17,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x00,0x01,0x00,0xb5,0x00,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0xc0, -0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x00,0x00,0x01,0xff,0xb4,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x01,0xff,0xc4,0x00,0x00,0x00,0x01,0x00,0xd2,0x00,0x00,0x00,0x01,0x01,0x18,0x00,0x00,0x00,0x01, -0x00,0xb6,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x00,0x01,0x00,0xa0,0x00,0x00,0x00,0x01,0x00,0x7c,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x00,0x01,0x00,0xed,0x00,0xf0,0x00,0x01,0x01,0xa6,0x00,0xf0,0x00,0x01,0x00,0xe4,0x00,0xf0,0x00,0x01,0x01,0x9d,0x00,0xf0,0x00,0x01,0x00,0x8e,0x00,0xf0, -0x00,0x01,0x01,0x47,0x00,0xf0,0x00,0x01,0x00,0x3c,0x00,0xf0,0x00,0x01,0x00,0xf5,0x00,0xf0,0x00,0x01,0x00,0x60,0x00,0xf0,0x00,0x01,0x01,0x19,0x00,0xf0,0x00,0x01,0x01,0x11,0x00,0xf0,0x00,0x01,0x01,0x97,0x00,0xf0,0x00,0x01,0x00,0x84,0x00,0xf0,0x00,0x01,0x01,0x3d,0x00,0xf0,0x00,0x01,0x00,0x6c,0x00,0xf0,0x00,0x01,0x01,0x25, -0x00,0xf0,0x00,0x01,0x01,0x0e,0x00,0xf0,0x00,0x01,0x01,0x90,0x00,0xf0,0x00,0x01,0x00,0xf0,0x00,0xf0,0x00,0x01,0x01,0x72,0x00,0xf0,0x00,0x01,0x00,0x6d,0x00,0xf0,0x00,0x01,0x01,0x26,0x00,0xf0,0x00,0x01,0x00,0x8a,0x00,0xf0,0x00,0x01,0x01,0x43,0x00,0xf0,0x00,0x01,0xff,0x1e,0x00,0xf0,0x00,0x01,0xff,0xd7,0x00,0xf0,0x00,0x01, -0x01,0x04,0x00,0xf0,0x00,0x01,0x00,0x62,0x00,0xf0,0x00,0x01,0x01,0x1b,0x00,0xf0,0x00,0x01,0x00,0xdc,0x00,0xf0,0x00,0x01,0x01,0x68,0x00,0xf0,0x00,0x01,0x00,0xb3,0x00,0xf0,0x00,0x01,0x01,0x6c,0x00,0xf0,0x00,0x01,0x00,0xb2,0x00,0xf0,0x00,0x01,0x01,0x3e,0x00,0xf0,0x00,0x01,0x00,0x64,0x00,0xf0,0x00,0x01,0x01,0x1d,0x00,0xf0, -0x00,0x01,0x00,0xaa,0x00,0xf0,0x00,0x01,0x01,0x63,0x00,0xf0,0x00,0x01,0x01,0x0b,0x00,0xf0,0x00,0x01,0x00,0xbe,0x00,0xf0,0x00,0x01,0x01,0x77,0x00,0xf0,0x00,0x01,0x00,0xf2,0x00,0xf0,0x00,0x01,0x01,0xab,0x00,0xf0,0x00,0x01,0x00,0xe3,0x00,0xf0,0x00,0x01,0x01,0x9c,0x00,0xf0,0x00,0x01,0x01,0x01,0x00,0xf0,0x00,0x01,0x00,0xca, -0x00,0xf0,0x00,0x01,0x01,0x83,0x00,0xf0,0x00,0x01,0x00,0x94,0x00,0xf0,0x00,0x01,0x01,0x4d,0x00,0xf0,0x00,0x01,0xff,0x5e,0x00,0xf0,0x00,0x01,0x02,0xa8,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0x00,0x00,0x01,0x01,0x56,0x00,0x00,0x00,0x01,0x02,0xc1,0x00,0x00,0x00,0x01, -0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x02,0x3d,0x00,0x00,0x00,0x01,0x02,0xbf,0x00,0x00,0x00,0x01,0x02,0xbe,0x00,0x00,0x00,0x01,0x01,0x6a,0x00,0x00,0x00,0x01,0x02,0xb3,0x00,0x00,0x00,0x01,0x02,0x26,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0x00,0x00,0x01,0x02,0x33,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00, -0x00,0x01,0x02,0xaf,0x00,0x00,0x00,0x01,0x03,0x1f,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0x00,0x00,0x01,0x02,0x29,0x00,0x00,0x00,0x01,0x01,0x7f,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0xf0,0x00,0x01,0x01,0xeb,0x00,0xdc,0x00,0x01,0x01,0xc8,0x00,0xdc,0x00,0x01,0x02,0x45,0x00,0xdc,0x00,0x01,0x02,0x91,0x00,0x00,0x00,0x01,0x01,0xa0, -0x00,0xdc,0x00,0x01,0x02,0xae,0x00,0xdc,0x00,0x01,0x02,0xf4,0x00,0xdc,0x00,0x01,0x02,0x4e,0x00,0x00,0x00,0x01,0x01,0xcf,0x00,0x00,0x00,0x01,0x02,0x38,0x00,0x00,0x00,0x01,0x02,0x15,0x00,0x00,0x00,0x01,0x02,0x3b,0x00,0x00,0x00,0x01,0xff,0xa6,0x00,0x00,0x00,0x01,0x02,0x4c,0x00,0x00,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01, -0x02,0x0e,0x00,0x00,0x00,0x01,0x02,0x36,0x00,0x00,0x00,0x01,0x02,0x12,0x00,0x00,0x00,0x01,0x02,0x13,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x01,0x01,0xe0,0x00,0x00,0x00,0x01,0x01,0xe1,0x00,0x00,0x00,0x01,0x02,0xee,0x00,0x00,0x00,0x01,0x03,0x14,0x00,0x00,0x00,0x01,0x02,0xc3,0x00,0x00, -0x00,0x01,0x02,0x3a,0x00,0x00,0x00,0x01,0x03,0x10,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x00,0x00,0x01,0x02,0x24,0x00,0x00,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x01,0x03,0x44,0x00,0x00,0x00,0x01,0x02,0x52,0x00,0x00,0x00,0x01,0x02,0x57,0x00,0x00,0x00,0x01,0x03,0x4c,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x01,0x01,0xf8, -0x00,0x00,0x00,0x01,0x02,0xbb,0x00,0x00,0x00,0x01,0x02,0xd9,0x00,0x00,0x00,0x01,0x01,0x45,0x00,0x00,0x00,0x01,0x02,0x98,0x00,0x00,0x00,0x01,0x04,0x05,0x00,0x00,0x00,0x01,0x03,0x8d,0x00,0x00,0x00,0x01,0x02,0x3e,0x00,0x00,0x00,0x01,0x01,0xe6,0x00,0x00,0x00,0x01,0x03,0x7d,0x00,0x00,0x00,0x01,0x03,0xa3,0x00,0x00,0x00,0x01, -0x03,0x52,0x00,0x00,0x00,0x01,0x03,0xd6,0x00,0x00,0x00,0x01,0x02,0x2f,0x00,0x00,0x00,0x01,0x03,0xd4,0x00,0x00,0x00,0x01,0x03,0xd3,0x00,0x00,0x00,0x01,0x02,0x8b,0x00,0x00,0x00,0x01,0x03,0xdb,0x00,0x00,0x00,0x01,0x02,0x87,0x00,0x00,0x00,0x01,0x03,0xd0,0x00,0x00,0x00,0x01,0x03,0x81,0x00,0x00,0x00,0x01,0x03,0x68,0x00,0x00, -0x00,0x01,0x03,0x27,0x00,0x00,0x00,0x01,0x04,0x2b,0x00,0x00,0x00,0x01,0x04,0x30,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x17,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x5e,0x00,0x00,0x00,0x01,0x02,0xcd,0x00,0x00,0x00,0x01,0x02,0x75,0x00,0x00,0x00,0x01,0x02,0xdb, -0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x01,0x04,0x26,0x00,0x00,0x00,0x01,0x03,0xd5,0x00,0x00,0x00,0x01,0x03,0x8c,0x00,0x00,0x00,0x01,0x02,0xb2,0x00,0x00,0x00,0x01,0x03,0x36,0x00,0x00,0x00,0x01,0x04,0x57,0x00,0x00,0x00,0x01,0x04,0x56,0x00,0x00,0x00,0x01,0x02,0x9f,0x00,0x00,0x00,0x01,0x03,0x64,0x00,0x00,0x00,0x01, -0x00,0x3b,0x00,0x00,0x00,0x01,0x04,0x53,0x00,0x00,0x00,0x01,0x04,0x04,0x00,0x00,0x00,0x01,0x03,0xeb,0x00,0x00,0x00,0x01,0x01,0x59,0x00,0x00,0x00,0x01,0x05,0x1e,0x00,0x00,0x00,0x01,0x04,0x4f,0x00,0x00,0x00,0x01,0x04,0x9f,0x00,0x00,0x00,0x01,0x04,0x9a,0x00,0x00,0x00,0x01,0x03,0xb7,0x00,0x00,0x00,0x01,0x03,0xc9,0x00,0x00, -0x00,0x01,0x03,0xe1,0x00,0x00,0x00,0x01,0x03,0x50,0x00,0x00,0x00,0x01,0x02,0xf8,0x00,0x00,0x00,0x01,0x03,0x1a,0x00,0x00,0x00,0x01,0x03,0x03,0x00,0x00,0x00,0x01,0x03,0x9e,0x00,0x00,0x00,0x01,0x01,0xf7,0x00,0x00,0x00,0x01,0x02,0x7b,0x00,0x00,0x00,0x01,0x03,0x9c,0x00,0x00,0x00,0x01,0x03,0x9b,0x00,0x00,0x00,0x01,0x02,0xa9, -0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x00,0x00,0x01,0x02,0x4f,0x00,0x00,0x00,0x01,0x03,0x98,0x00,0x00,0x00,0x01,0x03,0x49,0x00,0x00,0x00,0x01,0x02,0x80,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x00,0xce,0x00,0x00,0x00,0x01,0x02,0xef,0x00,0x00,0x00,0x01,0x04,0x46,0x00,0x00,0x00,0x01,0x03,0xf8,0x00,0x00,0x00,0x01, -0x03,0xe4,0x00,0x00,0x00,0x01,0x03,0xdf,0x00,0x00,0x00,0x01,0x02,0xfc,0x00,0x00,0x00,0x01,0x03,0x0e,0x00,0x00,0x00,0x01,0x03,0x26,0x00,0x00,0x00,0x01,0x02,0x95,0x00,0x00,0x00,0x01,0x02,0xa3,0x00,0x00,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x01,0x5e,0x00,0x00,0x00,0x01,0x01,0xc2,0x00,0x00,0x00,0x01,0x02,0xbc,0x00,0x00, -0x00,0x01,0x03,0x84,0x00,0x00,0x00,0x01,0x03,0x67,0x00,0x00,0x00,0x01,0x03,0xaf,0x00,0x00,0x00,0x01,0x02,0xa7,0x00,0x00,0x00,0x01,0x03,0xb5,0x00,0x00,0x00,0x01,0x02,0x5d,0x00,0x00,0x00,0x01,0x03,0xbe,0x00,0x00,0x00,0x01,0x03,0xc8,0x00,0x00,0x00,0x01,0x03,0xc6,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x00,0x00,0x01,0x03,0xba, -0x00,0x00,0x00,0x01,0x03,0x78,0x00,0x00,0x00,0x01,0x03,0x2d,0x00,0x00,0x00,0x01,0x03,0x65,0x00,0x00,0x00,0x01,0x03,0xb6,0x00,0x00,0x00,0x01,0x03,0xfb,0x00,0x00,0x00,0x01,0x03,0x1e,0x00,0x00,0x00,0x01,0x02,0x5f,0x00,0x00,0x00,0x01,0x02,0x86,0x00,0x00,0x00,0x01,0x02,0x5f,0x00,0xf0,0x00,0x01,0x02,0xf2,0x00,0xd0,0x00,0x01, -0x02,0xcf,0x00,0xd0,0x00,0x01,0x03,0x4c,0x00,0xd0,0x00,0x01,0x02,0xa7,0x00,0xd0,0x00,0x01,0x02,0xf2,0x00,0xdc,0x00,0x01,0x03,0xb5,0x00,0xd0,0x00,0x01,0x03,0xfb,0x00,0xd0,0x00,0x01,0x01,0x04,0x04,0xb0,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x01,0x13,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0xb0,0x00,0x01,0x00,0x00,0x05,0x64, -0x00,0x01,0xff,0xce,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x88,0x00,0x01,0x00,0x46,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x60,0x00,0x01,0x00,0x00,0x03,0xde,0x00,0x01,0x00,0x00,0x03,0xe8,0x00,0x01,0xff,0xc4,0x03,0xe8,0x00,0x01,0xff,0xf6,0x00,0x41,0x00,0x01,0x00,0x0a,0x00,0x41,0x00,0x01,0x00,0x00,0x04,0x7e,0x00,0x01,0x00,0x0f, -0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x41,0x00,0x01,0xff,0xfb,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0xff,0xc9,0x00,0x01,0x00,0x00,0xff,0xe2,0x00,0x01,0xff,0xf1,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0x00,0x00,0x04,0xec,0x00,0x01,0x00,0x00,0xff,0xec,0x00,0x01, -0x01,0xae,0x00,0x82,0x00,0x01,0x00,0x00,0x00,0x46,0x00,0x01,0x00,0x1e,0x04,0xb0,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01,0x01,0x93,0x04,0xb0,0x00,0x01,0x01,0xa6,0x04,0xb0,0x00,0x01,0x01,0xb2,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x6f,0x00,0x01,0x00,0x00,0x04,0xa6,0x00,0x01,0x00,0x0f,0x04,0x7e, -0x00,0x01,0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0xff,0xf1,0x04,0x7e,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0x00,0x04,0xc4,0x00,0x01,0x01,0xd9,0x04,0xba,0x00,0x01,0x01,0xd9,0x03,0xca,0x00,0x01,0x02,0x07,0x04,0x74,0x00,0x01,0x00,0xd9,0x00,0x82,0x00,0x01,0x01,0x53, -0x04,0x06,0x00,0x01,0x02,0x80,0x00,0x82,0x00,0x01,0x02,0x8c,0x06,0x40,0x00,0x01,0x03,0x93,0x05,0xdc,0x00,0x01,0x02,0x9e,0xff,0xf1,0x00,0x01,0x02,0x1c,0x06,0x40,0x00,0x01,0x03,0xe8,0x05,0xdc,0x00,0x01,0x02,0x1c,0xff,0xf1,0x00,0x01,0x02,0xee,0x06,0x40,0x00,0x01,0x04,0xc4,0x05,0xdc,0x00,0x01,0x02,0xee,0xff,0xe7,0x00,0x01, -0x02,0xbc,0x06,0x40,0x00,0x01,0x04,0xce,0x05,0xdc,0x00,0x01,0x02,0xbc,0xff,0xf1,0x00,0x01,0x02,0x58,0x06,0x40,0x00,0x01,0x03,0xd4,0x05,0xdc,0x00,0x01,0x02,0x58,0xff,0xf1,0x00,0x01,0x03,0x20,0x06,0x40,0x00,0x01,0x05,0x00,0x05,0xdc,0x00,0x01,0x03,0x20,0xff,0xe7,0x00,0x01,0x02,0xd0,0x06,0x40,0x00,0x01,0x05,0x28,0x05,0xdc, -0x00,0x01,0x02,0xd0,0xff,0xf1,0x00,0x01,0x01,0x09,0x06,0x40,0x00,0x01,0x02,0x08,0x05,0xdc,0x00,0x01,0x01,0x09,0xff,0xf1,0x00,0x01,0x01,0xd6,0x06,0x40,0x00,0x01,0x02,0x58,0x05,0xdc,0x00,0x01,0x01,0x7c,0xff,0xf1,0x00,0x01,0x02,0x8a,0x06,0x40,0x00,0x01,0x04,0xb0,0x05,0xdc,0x00,0x01,0x02,0x8a,0xff,0xf1,0x00,0x01,0x02,0x4e, -0x06,0x40,0x00,0x01,0x03,0x84,0x05,0xdc,0x00,0x01,0x02,0x4e,0xff,0xf1,0x00,0x01,0x03,0x93,0x06,0x40,0x00,0x01,0x06,0xa4,0x05,0xdc,0x00,0x01,0x03,0x93,0xff,0xf1,0x00,0x01,0x05,0x78,0x05,0xdc,0x00,0x01,0x03,0x20,0xff,0xf1,0x00,0x01,0x03,0x02,0x06,0x40,0x00,0x01,0x05,0x14,0x05,0xdc,0x00,0x01,0x03,0x02,0xff,0xe7,0x00,0x01, -0x02,0x62,0x06,0x40,0x00,0x01,0x02,0x62,0xff,0xf1,0x00,0x01,0x03,0x02,0xfe,0xf2,0x00,0x01,0x04,0x10,0x05,0xdc,0x00,0x01,0x02,0x3a,0x06,0x40,0x00,0x01,0x02,0x26,0xff,0xe7,0x00,0x01,0x02,0x26,0x06,0x40,0x00,0x01,0x04,0x4c,0x05,0xdc,0x00,0x01,0x02,0x26,0xff,0xf1,0x00,0x01,0x02,0xbc,0xff,0xe7,0x00,0x01,0x02,0x80,0x06,0x40, -0x00,0x01,0x02,0x80,0xff,0xf1,0x00,0x01,0x03,0xca,0x06,0x40,0x00,0x01,0x07,0x9e,0x05,0xdc,0x00,0x01,0x03,0xca,0xff,0xf1,0x00,0x01,0x02,0x6c,0x06,0x40,0x00,0x01,0x02,0x6c,0xff,0xf1,0x00,0x01,0x02,0x44,0x06,0x40,0x00,0x01,0x02,0x44,0xff,0xf1,0x00,0x01,0x02,0x08,0x05,0x14,0x00,0x01,0x03,0x84,0x04,0xb0,0x00,0x01,0x02,0x08, -0xff,0xe7,0x00,0x01,0x02,0x4e,0x06,0x72,0x00,0x01,0x03,0xca,0x05,0x78,0x00,0x01,0x02,0x6c,0xff,0xe7,0x00,0x01,0x02,0x26,0x05,0x14,0x00,0x01,0x03,0x98,0x04,0xb0,0x00,0x01,0x02,0x3a,0xff,0xe7,0x00,0x01,0x02,0x1c,0x06,0x72,0x00,0x01,0x04,0x4c,0x06,0x40,0x00,0x01,0x02,0x1c,0xff,0xe7,0x00,0x01,0x02,0x3a,0x05,0x14,0x00,0x01, -0x01,0xe0,0x06,0x72,0x00,0x01,0x01,0x36,0xff,0xf1,0x00,0x01,0x04,0x38,0x04,0xb0,0x00,0x01,0x02,0x3a,0xfe,0x2a,0x00,0x01,0x00,0xfa,0x06,0x72,0x00,0x01,0x01,0xa4,0x06,0x0e,0x00,0x01,0x00,0xfa,0xff,0xf1,0x00,0x01,0x00,0xf0,0x06,0x72,0x00,0x01,0x00,0x50,0xfe,0x2a,0x00,0x01,0x03,0x84,0x05,0x78,0x00,0x01,0x01,0x7c,0x06,0x40, -0x00,0x01,0x03,0x7a,0x05,0x14,0x00,0x01,0x06,0x40,0x04,0xb0,0x00,0x01,0x03,0x7a,0xff,0xf1,0x00,0x01,0x02,0x4e,0x05,0x14,0x00,0x01,0x03,0xe8,0x04,0xb0,0x00,0x01,0x02,0x58,0x05,0x14,0x00,0x01,0x02,0x58,0xff,0xe7,0x00,0x01,0x04,0x1a,0x04,0xb0,0x00,0x01,0x02,0x4e,0xfe,0x2a,0x00,0x01,0x04,0x42,0x04,0xb0,0x00,0x01,0x01,0xcc, -0x05,0x14,0x00,0x01,0x02,0xe4,0x04,0xb0,0x00,0x01,0x01,0xae,0x05,0x14,0x00,0x01,0x03,0x02,0x04,0xb0,0x00,0x01,0x01,0xae,0xff,0xe7,0x00,0x01,0x01,0x2c,0x05,0xdc,0x00,0x01,0x01,0xe0,0x05,0x78,0x00,0x01,0x01,0x80,0xff,0xe7,0x00,0x01,0x04,0x06,0x04,0xb0,0x00,0x01,0x01,0xf4,0x05,0x14,0x00,0x01,0x04,0x10,0x04,0xb0,0x00,0x01, -0x01,0xf4,0xff,0xf1,0x00,0x01,0x02,0xf3,0x05,0x14,0x00,0x01,0x05,0xf0,0x04,0xb0,0x00,0x01,0x02,0xf3,0xff,0xf1,0x00,0x01,0x01,0xd6,0x05,0x14,0x00,0x01,0x03,0xca,0x04,0xb0,0x00,0x01,0x01,0xd6,0xff,0xf1,0x00,0x01,0x01,0xf9,0x05,0x14,0x00,0x01,0x01,0xf9,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x05,0x14,0x00,0x01,0x01,0xc2,0xff,0xf1, -0x00,0x01,0x02,0x9e,0x07,0x80,0x00,0x01,0x04,0x33,0x06,0x7c,0x00,0x01,0x02,0xee,0xfe,0x48,0x00,0x01,0x02,0x58,0x07,0xb0,0x00,0x01,0x03,0xd4,0x06,0xa4,0x00,0x01,0x03,0x20,0x07,0x80,0x00,0x01,0x05,0x78,0x06,0x7c,0x00,0x01,0x03,0x02,0x07,0x80,0x00,0x01,0x05,0x8c,0x06,0x7c,0x00,0x01,0x02,0xbc,0x07,0x80,0x00,0x01,0x05,0x64, -0x06,0x7c,0x00,0x01,0x02,0x08,0x06,0x54,0x00,0x01,0x03,0xd4,0x05,0x50,0x00,0x01,0x01,0xf4,0x06,0x04,0x00,0x01,0x01,0xf4,0xff,0xe7,0x00,0x01,0x02,0x08,0x06,0x04,0x00,0x01,0x03,0x84,0x05,0x50,0x00,0x01,0x02,0x3a,0xfe,0x48,0x00,0x01,0x02,0x3a,0x06,0x54,0x00,0x01,0x02,0x2b,0x06,0x54,0x00,0x01,0x02,0x2b,0xff,0xe7,0x00,0x01, -0x02,0x26,0x06,0x04,0x00,0x01,0x02,0x44,0x05,0x46,0x00,0x01,0x01,0xf4,0x05,0x1e,0x00,0x01,0x00,0xe6,0x06,0x72,0x00,0x01,0x02,0x44,0x05,0x1e,0x00,0x01,0x00,0xe6,0x06,0x0e,0x00,0x01,0x02,0x4e,0x06,0x04,0x00,0x01,0x04,0x38,0x05,0x50,0x00,0x01,0x02,0x58,0x06,0x54,0x00,0x01,0x02,0x53,0x06,0x54,0x00,0x01,0x02,0x53,0xff,0xe7, -0x00,0x01,0x02,0x58,0x06,0x04,0x00,0x01,0x02,0x26,0x06,0x54,0x00,0x01,0x04,0x56,0x05,0x50,0x00,0x01,0x02,0x3a,0x06,0x04,0x00,0x01,0x02,0x2d,0x06,0xa2,0x00,0x01,0x04,0x5a,0x06,0x02,0x00,0x01,0x02,0x2d,0xff,0xe7,0x00,0x01,0x03,0xe8,0x06,0x40,0x00,0x01,0x06,0xe2,0x05,0xdc,0x00,0x01,0x03,0xe8,0xff,0xf1,0x00,0x01,0x03,0x48, -0x05,0x14,0x00,0x01,0x06,0xa8,0x04,0xb0,0x00,0x01,0x03,0x48,0xff,0xe7,0x00,0x01,0x03,0x02,0x06,0x72,0x00,0x01,0x04,0x00,0x05,0x9a,0x00,0x01,0x01,0x4b,0xfe,0xd4,0x00,0x01,0x02,0x9e,0x07,0xb0,0x00,0x01,0x04,0x83,0x06,0x7c,0x00,0x01,0x04,0x74,0x06,0x40,0x00,0x01,0x07,0x72,0x05,0xdc,0x00,0x01,0x04,0x74,0xff,0xe7,0x00,0x01, -0x03,0xfc,0x05,0x14,0x00,0x01,0x07,0x6c,0x04,0xb0,0x00,0x01,0x03,0xfc,0xff,0xe7,0x00,0x01,0x01,0xf9,0x06,0x04,0x00,0x01,0x04,0x6a,0x05,0x50,0x00,0x01,0x02,0x44,0x07,0x80,0x00,0x01,0x05,0x00,0x06,0x7c,0x00,0x01,0x02,0x30,0x07,0xb0,0x00,0x01,0x04,0x24,0x06,0x7c,0x00,0x01,0x02,0x30,0xff,0xf1,0x00,0x01,0x04,0x33,0x06,0xa4, -0x00,0x01,0x02,0x30,0x07,0x80,0x00,0x01,0x04,0x4c,0x06,0x7c,0x00,0x01,0x01,0x09,0x07,0xb0,0x00,0x01,0x02,0x80,0x06,0xa4,0x00,0x01,0x01,0x1d,0x07,0xb0,0x00,0x01,0x01,0x1d,0xff,0xf1,0x00,0x01,0x01,0x09,0x07,0x80,0x00,0x01,0x02,0x80,0x06,0x7c,0x00,0x01,0x02,0x30,0x06,0x7c,0x00,0x01,0x03,0x02,0x07,0xb0,0x00,0x01,0x02,0xbc, -0x07,0xb0,0x00,0x01,0x00,0xfa,0x04,0xa0,0x00,0x01,0x01,0x7c,0x04,0x50,0x00,0x01,0x01,0x0e,0x06,0x72,0x00,0x01,0x01,0xa4,0x06,0x40,0x00,0x01,0x01,0x0e,0xff,0xf1,0x00,0x01,0x02,0x26,0x07,0xb0,0x00,0x01,0x04,0x24,0x06,0xa4,0x00,0x01,0x01,0x90,0x06,0x54,0x00,0x01,0x03,0x52,0x05,0x50,0x00,0x01,0x02,0x6c,0x07,0xb0,0x00,0x01, -0x05,0x00,0x06,0xa4,0x00,0x01,0x01,0xf4,0x06,0x54,0x00,0x01,0x03,0xe8,0x05,0x50,0x00,0x01,0x02,0x3c,0x06,0x94,0x00,0x01,0x04,0x79,0x05,0xf4,0x00,0x01,0x02,0x3c,0xff,0xe7,0x00,0x01,0x02,0x44,0x07,0xb0,0x00,0x01,0x01,0xf9,0x06,0x54,0x00,0x01,0x02,0x3d,0x06,0x3a,0x00,0x01,0x04,0x7b,0x04,0xfa,0x00,0x01,0x02,0x3d,0xff,0xf1, -0x00,0x01,0x02,0x5a,0x06,0x8c,0x00,0x01,0x04,0xb4,0x05,0x4c,0x00,0x01,0x02,0x5a,0xfe,0x2a,0x00,0x01,0x03,0x20,0x07,0xb0,0x00,0x01,0x05,0x50,0x06,0x7c,0x00,0x01,0x04,0x88,0x05,0x50,0x00,0x01,0x01,0x1d,0x07,0x08,0x00,0x01,0x02,0x21,0x06,0x42,0x00,0x01,0x02,0x26,0xfe,0x48,0x00,0x01,0x01,0xae,0xfe,0x48,0x00,0x01,0x02,0xee, -0x07,0xb0,0x00,0x01,0x05,0x14,0x06,0xa4,0x00,0x01,0x03,0x0c,0x07,0xb0,0x00,0x01,0x03,0x0c,0xff,0xe7,0x00,0x01,0x02,0x44,0x06,0x54,0x00,0x01,0x02,0x44,0xff,0xe7,0x00,0x01,0x02,0x9e,0x06,0x40,0x00,0x01,0x02,0x9e,0xfe,0xa2,0x00,0x01,0x02,0x08,0xfe,0xa2,0x00,0x01,0x02,0xa8,0x07,0xb0,0x00,0x01,0x05,0x1e,0x06,0xa4,0x00,0x01, -0x02,0xa8,0xff,0xf1,0x00,0x01,0x02,0x58,0xfe,0xa2,0x00,0x01,0x02,0x3a,0xfe,0xa2,0x00,0x01,0x02,0x4e,0x07,0xb0,0x00,0x01,0x03,0x84,0x06,0xa4,0x00,0x01,0x00,0xfa,0x08,0x02,0x00,0x01,0x01,0xf4,0x06,0xe0,0x00,0x01,0x03,0xc4,0x05,0xdc,0x00,0x01,0x02,0x75,0x06,0x40,0x00,0x01,0x05,0x78,0x06,0xa4,0x00,0x01,0x02,0x4e,0x06,0x54, -0x00,0x01,0x03,0x02,0xff,0xf1,0x00,0x01,0x05,0x8c,0x06,0xa4,0x00,0x01,0x02,0x62,0x07,0xb0,0x00,0x01,0x04,0x60,0x06,0xa4,0x00,0x01,0x01,0xcc,0x06,0x54,0x00,0x01,0x03,0x34,0x05,0x50,0x00,0x01,0x01,0xae,0x06,0x54,0x00,0x01,0x02,0x3a,0x07,0xb0,0x00,0x01,0x01,0x80,0xfe,0x48,0x00,0x01,0x04,0x9c,0x06,0xa4,0x00,0x01,0x01,0x2c, -0x06,0x0e,0x00,0x01,0x02,0x30,0x06,0x18,0x00,0x01,0x05,0x64,0x06,0xa4,0x00,0x01,0x02,0x8a,0x07,0x80,0x00,0x01,0x04,0xb0,0x06,0xa4,0x00,0x01,0x01,0xe0,0x06,0x54,0x00,0x01,0x02,0x4e,0x07,0x80,0x00,0x01,0x04,0xb0,0x06,0x7c,0x00,0x01,0x01,0xe0,0x06,0x04,0x00,0x01,0x03,0xf8,0x06,0x3a,0x00,0x01,0x04,0xac,0x06,0x3a,0x00,0x01, -0x03,0x7a,0xff,0xe7,0x00,0x01,0x03,0x0c,0x06,0x79,0x00,0x01,0x03,0xf6,0x06,0x29,0x00,0x01,0x02,0x8a,0xfe,0x2a,0x00,0x01,0x02,0xe8,0x05,0xb2,0x00,0x01,0x04,0x39,0x04,0xb0,0x00,0x01,0x02,0xe8,0xff,0xf1,0x00,0x01,0x02,0x9e,0x07,0x30,0x00,0x01,0x02,0xf8,0x07,0xb0,0x00,0x01,0x02,0xf8,0xff,0xe7,0x00,0x01,0x04,0xc4,0x06,0x7c, -0x00,0x01,0x02,0x44,0x07,0x30,0x00,0x01,0x03,0xfc,0x05,0x50,0x00,0x01,0x02,0x1c,0x07,0xb0,0x00,0x01,0x02,0x26,0x07,0x80,0x00,0x01,0x03,0xd4,0x06,0x40,0x00,0x01,0x05,0x50,0x06,0xa4,0x00,0x01,0x02,0x44,0xfe,0x2a,0x00,0x01,0x03,0x20,0xfe,0x70,0x00,0x01,0x02,0x3a,0x06,0x16,0x00,0x01,0x04,0x66,0x05,0xa0,0x00,0x01,0x02,0xd0, -0x07,0xb0,0x00,0x01,0x02,0x6c,0x07,0xb2,0x00,0x01,0x04,0x1a,0x06,0x18,0x00,0x01,0x02,0xd7,0x06,0x3a,0x00,0x01,0x05,0x5e,0x05,0xea,0x00,0x01,0x02,0xd7,0xff,0xf1,0x00,0x01,0x02,0x43,0x06,0x3c,0x00,0x01,0x04,0x37,0x05,0x4c,0x00,0x01,0x02,0x43,0xff,0xf1,0x00,0x01,0x01,0x0e,0x07,0x80,0x00,0x01,0x00,0xfa,0x06,0x0e,0x00,0x01, -0x01,0x09,0x07,0x30,0x00,0x01,0x00,0xfa,0x05,0xd2,0x00,0x01,0x01,0x0e,0x07,0xb0,0x00,0x01,0x00,0xe1,0x06,0x72,0x00,0x01,0x01,0x0e,0x06,0x40,0x00,0x01,0x01,0x0e,0xfe,0xa2,0x00,0x01,0x00,0xfa,0xfe,0xa2,0x00,0x01,0x01,0xd6,0x07,0xb0,0x00,0x01,0x02,0xd0,0x06,0xa4,0x00,0x01,0x01,0xf4,0x05,0x6e,0x00,0x01,0x02,0x8a,0xfe,0x70, -0x00,0x01,0x02,0x4e,0xfe,0x70,0x00,0x01,0x01,0xfd,0x04,0xa0,0x00,0x01,0x03,0xfa,0x04,0xa0,0x00,0x01,0x01,0xfd,0xff,0xf1,0x00,0x01,0x02,0x4e,0xfe,0x48,0x00,0x01,0x00,0xfa,0xfe,0x48,0x00,0x01,0x03,0x20,0xfe,0x2a,0x00,0x01,0x03,0x02,0x07,0x30,0x00,0x01,0x02,0x9e,0xfe,0x70,0x00,0x01,0x00,0xfa,0xfe,0x70,0x00,0x01,0x02,0x18, -0x05,0xea,0x00,0x01,0x04,0x81,0x05,0xea,0x00,0x01,0x02,0x18,0xff,0xf1,0x00,0x01,0x01,0x2c,0x05,0x7f,0x00,0x01,0x02,0xb6,0x05,0x2f,0x00,0x01,0x02,0xbc,0x07,0x30,0x00,0x01,0x02,0xbc,0xfe,0xa2,0x00,0x01,0x02,0x26,0xfe,0xa2,0x00,0x01,0x03,0xd4,0x07,0xb0,0x00,0x01,0x07,0x9e,0x06,0x7c,0x00,0x01,0x02,0xf8,0x06,0x54,0x00,0x01, -0x05,0xf0,0x05,0x50,0x00,0x01,0x02,0x08,0xfe,0x2a,0x00,0x01,0x01,0x7c,0x06,0x72,0x00,0x01,0x02,0x8e,0x06,0x52,0x00,0x01,0x03,0xca,0x07,0xb0,0x00,0x01,0x02,0xf3,0x06,0x54,0x00,0x01,0x03,0xca,0x07,0x80,0x00,0x01,0x02,0xf3,0x06,0x04,0x00,0x01,0x04,0x1a,0x05,0x50,0x00,0x01,0x06,0x1a,0x06,0x7c,0x00,0x01,0x04,0xc7,0x04,0xb0, -0x00,0x01,0x02,0xbc,0x06,0xd6,0x00,0x01,0x05,0xfa,0x06,0x7c,0x00,0x01,0x02,0x26,0x05,0x46,0x00,0x01,0x05,0x04,0x05,0x00,0x00,0x01,0x02,0xb2,0xfe,0xc0,0x00,0x01,0x02,0x12,0x05,0x14,0x00,0x01,0x02,0x12,0xfe,0xc0,0x00,0x01,0x02,0x44,0xfe,0xc0,0x00,0x01,0x02,0x4e,0xfe,0xc0,0x00,0x01,0x02,0x30,0x06,0xc2,0x00,0x01,0x01,0xf4, -0x05,0x82,0x00,0x01,0x01,0x09,0xfe,0xc0,0x00,0x01,0x00,0xfa,0xfe,0xc0,0x00,0x01,0x03,0x02,0xfe,0xc0,0x00,0x01,0x02,0x58,0xfe,0xc0,0x00,0x01,0x02,0xbc,0xfe,0xc0,0x00,0x01,0x02,0x26,0xfe,0xc0,0x00,0x01,0x02,0x26,0xfe,0x84,0x00,0x01,0x01,0x80,0xfe,0x84,0x00,0x01,0x02,0xe2,0x06,0x52,0x00,0x01,0x05,0x74,0x05,0x62,0x00,0x01, -0x02,0xe2,0xff,0xe7,0x00,0x01,0x02,0x03,0x04,0xb8,0x00,0x01,0x03,0xdf,0x03,0xc8,0x00,0x01,0x02,0x03,0xff,0xe7,0x00,0x01,0x02,0x58,0xfe,0x48,0x00,0x01,0x02,0x9e,0xfe,0x02,0x00,0x01,0x02,0x08,0xfe,0x02,0x00,0x01,0x02,0x1c,0x07,0x80,0x00,0x01,0x03,0xe8,0x06,0x7c,0x00,0x01,0x02,0x30,0x06,0x40,0x00,0x01,0x02,0x30,0xfe,0xc0, -0x00,0x01,0x02,0x6c,0xfe,0xc0,0x00,0x01,0x02,0x44,0xff,0x24,0x00,0x01,0x02,0x6c,0xff,0x24,0x00,0x01,0x05,0x1e,0x06,0x7c,0x00,0x01,0x02,0xa8,0x06,0x40,0x00,0x01,0x02,0xa8,0xfe,0xc0,0x00,0x01,0x02,0x58,0x06,0x72,0x00,0x01,0x02,0x8a,0xff,0x24,0x00,0x01,0x02,0x4e,0xff,0x24,0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x02,0x1c, -0xfe,0x70,0x00,0x01,0x02,0xb2,0x06,0x40,0x00,0x01,0x02,0xb2,0xfe,0x2a,0x00,0x01,0x02,0x44,0x05,0x14,0x00,0x01,0x02,0x30,0xfe,0xa2,0x00,0x01,0x02,0x12,0x07,0x80,0x00,0x01,0x02,0x12,0xff,0xf1,0x00,0x01,0x01,0xe0,0x07,0x62,0x00,0x01,0x02,0xee,0x06,0xe0,0x00,0x01,0x03,0x20,0x07,0x30,0x00,0x01,0x02,0xd0,0x07,0x80,0x00,0x01, -0x05,0x28,0x06,0x7c,0x00,0x01,0x02,0x4e,0x06,0xd6,0x00,0x01,0x03,0xca,0x06,0x18,0x00,0x01,0x02,0xee,0xfe,0xc0,0x00,0x01,0x02,0x3a,0x06,0x72,0x00,0x01,0x02,0x3a,0xfe,0xc0,0x00,0x01,0x02,0x80,0x07,0xb2,0x00,0x01,0x04,0x1a,0x06,0x54,0x00,0x01,0x02,0xd0,0xfe,0x2a,0x00,0x01,0x02,0xd0,0xfe,0x84,0x00,0x01,0x02,0x4e,0xfe,0x84, -0x00,0x01,0x01,0x09,0xfe,0xa2,0x00,0x01,0x02,0x8a,0x07,0xb0,0x00,0x01,0x02,0x4e,0x07,0xb2,0x00,0x01,0x02,0x80,0xfe,0xc0,0x00,0x01,0x02,0x26,0x06,0x72,0x00,0x01,0x02,0x30,0x06,0x72,0x00,0x01,0x02,0x30,0xff,0x24,0x00,0x01,0x02,0x26,0x07,0x30,0x00,0x01,0x03,0xd4,0x06,0x7c,0x00,0x01,0x00,0xfa,0x07,0x12,0x00,0x01,0x00,0xfa, -0xff,0x24,0x00,0x01,0x02,0x2b,0x06,0x40,0x00,0x01,0x02,0x2b,0xfe,0x2a,0x00,0x01,0x00,0xfa,0xfe,0x2a,0x00,0x01,0x03,0x93,0x07,0xb0,0x00,0x01,0x06,0xa4,0x06,0xa4,0x00,0x01,0x03,0x7a,0x06,0x54,0x00,0x01,0x06,0x40,0x05,0x50,0x00,0x01,0x03,0x5c,0x07,0x80,0x00,0x01,0x06,0xa4,0x06,0x7c,0x00,0x01,0x03,0x5c,0xfe,0xc0,0x00,0x01, -0x03,0x7a,0xfe,0xc0,0x00,0x01,0x02,0xf8,0x07,0x80,0x00,0x01,0x02,0xf8,0xff,0xf1,0x00,0x01,0x02,0xf8,0x06,0x40,0x00,0x01,0x02,0xf8,0xfe,0xc0,0x00,0x01,0x02,0xf8,0xff,0x24,0x00,0x01,0x02,0x58,0xff,0x24,0x00,0x01,0x03,0x02,0xfe,0x2a,0x00,0x01,0x04,0x38,0x06,0xa4,0x00,0x01,0x04,0x38,0x06,0x7c,0x00,0x01,0x02,0x6c,0x06,0x04, -0x00,0x01,0x02,0x6c,0xfe,0x2a,0x00,0x01,0x02,0x58,0x07,0x80,0x00,0x01,0x04,0x60,0x06,0x7c,0x00,0x01,0x01,0x90,0x06,0x04,0x00,0x01,0x02,0x8a,0xfe,0xc0,0x00,0x01,0x02,0x9e,0xff,0x24,0x00,0x01,0x02,0x4e,0xff,0xe7,0x00,0x01,0x01,0xcc,0xff,0xe7,0x00,0x01,0x01,0xc2,0x05,0x14,0x00,0x01,0x01,0xc2,0xfe,0xc0,0x00,0x01,0x04,0x24, -0x07,0x1c,0x00,0x01,0x03,0x52,0x05,0xf0,0x00,0x01,0x02,0x44,0x07,0xd0,0x00,0x01,0x01,0xae,0x06,0xa4,0x00,0x01,0x02,0x62,0x07,0x80,0x00,0x01,0x02,0x62,0xfe,0xc0,0x00,0x01,0x01,0xd6,0xfe,0xc0,0x00,0x01,0x01,0x2c,0x07,0x1c,0x00,0x01,0x01,0x68,0xfe,0xc0,0x00,0x01,0x02,0x26,0xff,0x24,0x00,0x01,0x01,0x80,0xff,0x24,0x00,0x01, -0x02,0x26,0xfe,0x2a,0x00,0x01,0x01,0x68,0xfe,0x2a,0x00,0x01,0x02,0x1c,0x05,0x14,0x00,0x01,0x02,0x1c,0xfe,0xc0,0x00,0x01,0x02,0x2b,0x05,0x14,0x00,0x01,0x02,0x80,0x07,0x80,0x00,0x01,0x05,0x14,0x06,0x7c,0x00,0x01,0x04,0x60,0x05,0x50,0x00,0x01,0x01,0xf4,0xfe,0xc0,0x00,0x01,0x03,0xde,0x07,0x80,0x00,0x01,0x07,0xee,0x06,0x7c, -0x00,0x01,0x02,0xf8,0x06,0x04,0x00,0x01,0x03,0xca,0xfe,0xc0,0x00,0x01,0x02,0xf3,0xfe,0xc0,0x00,0x01,0x02,0x6c,0x07,0x80,0x00,0x01,0x04,0xce,0x06,0x7c,0x00,0x01,0x01,0xd6,0x06,0x24,0x00,0x01,0x03,0xca,0x05,0x50,0x00,0x01,0x01,0xe0,0xff,0xf1,0x00,0x01,0x01,0xe0,0xfe,0xc0,0x00,0x01,0x01,0xcc,0xff,0x24,0x00,0x01,0x01,0x54, -0x07,0x1c,0x00,0x01,0x02,0xd0,0x06,0x18,0x00,0x01,0x03,0xd4,0x05,0x82,0x00,0x01,0x01,0x8b,0x07,0xb2,0x00,0x01,0x02,0x8e,0x06,0x92,0x00,0x01,0x00,0xf7,0xff,0xf1,0x00,0x01,0x04,0x64,0x05,0x4c,0x00,0x01,0x02,0x5a,0xff,0xe7,0x00,0x01,0x02,0x74,0x06,0x3a,0x00,0x01,0x04,0x98,0x05,0x4a,0x00,0x01,0x02,0x74,0xff,0xf1,0x00,0x01, -0x02,0x49,0x06,0x3a,0x00,0x01,0x04,0x93,0x05,0x9a,0x00,0x01,0x02,0x49,0xff,0xe7,0x00,0x01,0x04,0xb4,0x05,0xec,0x00,0x01,0x02,0x4f,0x06,0x52,0x00,0x01,0x04,0x4e,0x05,0x12,0x00,0x01,0x02,0x4f,0xff,0xe7,0x00,0x01,0x02,0x12,0x06,0x52,0x00,0x01,0x04,0xa6,0x05,0x62,0x00,0x01,0x02,0x12,0xff,0xe7,0x00,0x01,0x02,0xfa,0x06,0xd6, -0x00,0x01,0x05,0x96,0x06,0x83,0x00,0x01,0x02,0xfa,0xff,0xe7,0x00,0x01,0x02,0x3c,0x05,0x46,0x00,0x01,0x04,0x5a,0x05,0x25,0x00,0x01,0x02,0xce,0x06,0x3a,0x00,0x01,0x05,0x4c,0x05,0x4a,0x00,0x01,0x03,0x2a,0x06,0x3a,0x00,0x01,0x05,0x9e,0x05,0x4a,0x00,0x01,0x03,0x2a,0xff,0xf1,0x00,0x01,0x02,0x4a,0x06,0x3a,0x00,0x01,0x04,0x44, -0x05,0xea,0x00,0x01,0x02,0x4a,0xff,0xe7,0x00,0x01,0x04,0xb4,0x06,0x3c,0x00,0x01,0x02,0x5e,0x04,0xb8,0x00,0x01,0x04,0x6c,0x03,0xc8,0x00,0x01,0x02,0x5e,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x06,0x3a,0x00,0x01,0x03,0xbe,0x05,0xea,0x00,0x01,0x02,0x58,0x06,0x52,0x00,0x01,0x04,0x04,0x05,0xb2,0x00,0x01,0x02,0x44,0x06,0x3a,0x00,0x01, -0x03,0xe8,0x05,0xea,0x00,0x01,0x01,0x2c,0xfe,0x84,0x00,0x01,0x03,0x20,0x06,0xd6,0x00,0x01,0x05,0xd9,0x06,0x83,0x00,0x01,0x02,0x7c,0x06,0x3a,0x00,0x01,0x05,0x48,0x05,0xea,0x00,0x01,0x02,0x7c,0xfe,0x2a,0x00,0x01,0x03,0x7f,0x06,0x8c,0x00,0x01,0x06,0xae,0x05,0x4c,0x00,0x01,0x03,0x7f,0xff,0xe7,0x00,0x01,0x01,0x36,0x06,0x72, -0x00,0x01,0x01,0xfe,0x05,0xea,0x00,0x01,0x01,0x1d,0x06,0x3a,0x00,0x01,0x02,0x3a,0x05,0xea,0x00,0x01,0x02,0x52,0x06,0x52,0x00,0x01,0x04,0xf4,0x06,0x02,0x00,0x01,0x02,0x52,0xff,0xf1,0x00,0x01,0x01,0xfe,0x06,0xa2,0x00,0x01,0x03,0xfc,0x06,0xa2,0x00,0x01,0x01,0xfe,0xff,0xf1,0x00,0x01,0x00,0xf8,0x06,0x8c,0x00,0x01,0x01,0xa0, -0x06,0x3c,0x00,0x01,0x00,0xf8,0xff,0xf1,0x00,0x01,0x01,0xfe,0x06,0x8e,0x00,0x01,0x03,0xac,0x05,0x4e,0x00,0x01,0x03,0x91,0x06,0x3a,0x00,0x01,0x06,0xd3,0x05,0xea,0x00,0x01,0x03,0x91,0xff,0xe7,0x00,0x01,0x02,0xfe,0x06,0x3a,0x00,0x01,0x05,0xac,0x05,0xea,0x00,0x01,0x03,0x97,0xff,0xf1,0x00,0x01,0x02,0x4d,0x04,0xb8,0x00,0x01, -0x04,0x4a,0x04,0x18,0x00,0x01,0x02,0x4d,0xfe,0x70,0x00,0x01,0x03,0x04,0x06,0x52,0x00,0x01,0x05,0xb8,0x05,0x62,0x00,0x01,0x03,0x04,0xff,0xe7,0x00,0x01,0x03,0xe0,0x06,0x52,0x00,0x01,0x07,0x48,0x06,0x02,0x00,0x01,0x03,0xe0,0xff,0xe7,0x00,0x01,0x03,0x29,0x04,0xb8,0x00,0x01,0x06,0x02,0x04,0x68,0x00,0x01,0x03,0x29,0xff,0xe7, -0x00,0x01,0x02,0x67,0x06,0x3a,0x00,0x01,0x04,0x7f,0x05,0x9a,0x00,0x01,0x02,0x67,0xff,0xf1,0x00,0x01,0x02,0x5a,0x06,0xa2,0x00,0x01,0x04,0x64,0x05,0x62,0x00,0x01,0x02,0x4e,0x06,0x3a,0x00,0x01,0x04,0x4c,0x04,0xfa,0x00,0x01,0x02,0x4e,0xff,0x51,0x00,0x01,0x02,0x10,0x06,0x3a,0x00,0x01,0x03,0xd1,0x05,0xea,0x00,0x01,0x02,0x10, -0xff,0xf1,0x00,0x01,0x00,0xaa,0x06,0xa2,0x00,0x01,0x02,0x0e,0x05,0xb2,0x00,0x01,0x01,0x6b,0xfe,0x2a,0x00,0x01,0x01,0x5c,0x05,0xcf,0x00,0x01,0x02,0xb8,0x05,0x2f,0x00,0x01,0x01,0x5c,0xfe,0x84,0x00,0x01,0x02,0x19,0x06,0x3a,0x00,0x01,0x04,0x33,0x05,0xea,0x00,0x01,0x02,0x19,0xff,0xf1,0x00,0x01,0x01,0x5c,0x06,0xa2,0x00,0x01, -0x03,0x08,0x06,0x52,0x00,0x01,0x01,0x5c,0xff,0xe7,0x00,0x01,0x02,0x19,0xfe,0x84,0x00,0x01,0x03,0x05,0x06,0x3a,0x00,0x01,0x06,0x0a,0x05,0xea,0x00,0x01,0x03,0x05,0xff,0xe7,0x00,0x01,0x02,0xd9,0x06,0x52,0x00,0x01,0x05,0x12,0x06,0x02,0x00,0x01,0x02,0xd9,0xff,0xe7,0x00,0x01,0x02,0x81,0x06,0x52,0x00,0x01,0x04,0xde,0x06,0x02, -0x00,0x01,0x02,0x81,0xff,0xf1,0x00,0x01,0x02,0x7b,0x05,0x14,0x00,0x01,0x04,0xc3,0x04,0x18,0x00,0x01,0x02,0x7b,0xfe,0x2a,0x00,0x01,0x02,0xee,0xfe,0x2a,0x00,0x01,0x02,0x28,0x06,0x3a,0x00,0x01,0x03,0xb0,0x06,0x3a,0x00,0x01,0x02,0x28,0xff,0xe7,0x00,0x01,0x01,0x85,0x04,0xa0,0x00,0x01,0x02,0xba,0x04,0xa0,0x00,0x01,0x01,0x85, -0xff,0xe7,0x00,0x01,0x02,0x2f,0x04,0xb8,0x00,0x01,0x04,0x5e,0x04,0x18,0x00,0x01,0x01,0x4b,0xfe,0x2a,0x00,0x01,0x07,0xbc,0x07,0xb0,0x00,0x01,0x09,0xe8,0x06,0xa4,0x00,0x01,0x07,0xbc,0xff,0xf1,0x00,0x01,0x07,0x6c,0x06,0x54,0x00,0x01,0x09,0x1c,0x05,0x50,0x00,0x01,0x07,0x6c,0xff,0xf1,0x00,0x01,0x06,0x86,0x06,0x54,0x00,0x01, -0x08,0x33,0x05,0x50,0x00,0x01,0x06,0x86,0xff,0xf1,0x00,0x01,0x05,0xd2,0x06,0x3a,0x00,0x01,0x06,0x89,0x05,0xdc,0x00,0x01,0x05,0x7b,0xff,0xe7,0x00,0x01,0x04,0xc4,0x06,0x79,0x00,0x01,0x05,0x72,0x06,0x0e,0x00,0x01,0x04,0x6e,0xfe,0x2a,0x00,0x01,0x03,0x0c,0x06,0x8c,0x00,0x01,0x03,0xb1,0x06,0x0e,0x00,0x01,0x02,0xa8,0xfe,0x2a, -0x00,0x01,0x07,0x8f,0x06,0x3a,0x00,0x01,0x08,0x44,0x05,0xdc,0x00,0x01,0x07,0x40,0xff,0xe7,0x00,0x01,0x06,0xc2,0x06,0x79,0x00,0x01,0x07,0x6e,0x06,0x0e,0x00,0x01,0x06,0x72,0xfe,0x2a,0x00,0x01,0x05,0x78,0x06,0x79,0x00,0x01,0x06,0x27,0x06,0x0e,0x00,0x01,0x05,0x23,0xfe,0x2a,0x00,0x01,0x01,0xfe,0x06,0x54,0x00,0x01,0x01,0xfe, -0xff,0xe7,0x00,0x01,0x02,0x44,0x05,0x82,0x00,0x01,0x02,0xc6,0x07,0xb0,0x00,0x01,0x02,0xc6,0xff,0xe7,0x00,0x01,0x04,0x92,0x07,0x30,0x00,0x01,0x06,0x92,0x06,0x7c,0x00,0x01,0x04,0x92,0xff,0xf1,0x00,0x01,0x03,0x50,0x06,0x04,0x00,0x01,0x06,0x50,0x05,0x50,0x00,0x01,0x03,0x50,0xff,0xe7,0x00,0x01,0x02,0xda,0x07,0xb0,0x00,0x01, -0x02,0xda,0xff,0xe7,0x00,0x01,0x01,0xfe,0x07,0xb2,0x00,0x01,0x03,0x02,0xfe,0x70,0x00,0x01,0x02,0x58,0xfe,0x70,0x00,0x01,0x02,0x08,0x07,0xb0,0x00,0x01,0x01,0x7c,0x06,0x54,0x00,0x01,0x01,0x7c,0xfe,0x2a,0x00,0x01,0x02,0x94,0x06,0x0e,0x00,0x01,0x07,0xda,0x06,0xe0,0x00,0x01,0x09,0xe8,0x05,0xdc,0x00,0x01,0x07,0xda,0xff,0xf1, -0x00,0x01,0x07,0x6c,0x05,0xb4,0x00,0x01,0x09,0x1c,0x04,0xb0,0x00,0x01,0x06,0x86,0x05,0xb4,0x00,0x01,0x08,0x33,0x04,0xb0,0x00,0x01,0x07,0xae,0x05,0xdc,0x00,0x01,0x02,0xc1,0x06,0x52,0x00,0x01,0x05,0x83,0x05,0xb2,0x00,0x01,0x01,0x62,0xfe,0x2a,0x00,0x01,0x04,0x83,0x06,0xa4,0x00,0x01,0x04,0x4c,0x06,0xa4,0x00,0x01,0x02,0x30, -0x06,0xa4,0x00,0x01,0x01,0xf4,0x05,0x50,0x00,0x01,0x01,0xb8,0x06,0x54,0x00,0x01,0x01,0xb8,0x06,0x52,0x00,0x01,0x03,0xb8,0x05,0x62,0x00,0x01,0x01,0xb8,0xfe,0x2a,0x00,0x01,0x01,0x90,0x04,0xb8,0x00,0x01,0x03,0x20,0x03,0xc8,0x00,0x01,0x01,0x90,0xfe,0x2a,0x00,0x01,0x04,0x1a,0x06,0xa4,0x00,0x01,0x02,0xef,0x06,0x52,0x00,0x01, -0x05,0x3f,0x05,0xb2,0x00,0x01,0x02,0xef,0xfe,0x2a,0x00,0x01,0x02,0x5c,0x06,0x3a,0x00,0x01,0x04,0x68,0x05,0x9a,0x00,0x01,0x02,0x5c,0xff,0xe7,0x00,0x01,0x02,0x44,0x06,0x8c,0x00,0x01,0x04,0x39,0x05,0xec,0x00,0x01,0x02,0x48,0xff,0x24,0x00,0x01,0x01,0xcf,0xff,0x24,0x00,0x01,0x02,0x05,0x04,0xb8,0x00,0x01,0x03,0xba,0x03,0xc8, -0x00,0x01,0x02,0x05,0xff,0xe7,0x00,0x01,0x02,0x79,0x04,0xb8,0x00,0x01,0x04,0xa2,0x04,0x68,0x00,0x01,0x02,0x79,0xff,0xe7,0x00,0x01,0x04,0xa2,0x04,0x18,0x00,0x01,0x02,0x5b,0x06,0xa2,0x00,0x01,0x04,0x66,0x05,0xaa,0x00,0x01,0x02,0x5b,0xff,0xe7,0x00,0x01,0x01,0xab,0x04,0xb8,0x00,0x01,0x03,0x6a,0x03,0xc8,0x00,0x01,0x01,0xab, -0xff,0xe7,0x00,0x01,0x02,0x08,0x04,0xb8,0x00,0x01,0x02,0x08,0xff,0x51,0x00,0x01,0x02,0x5b,0x06,0x8c,0x00,0x01,0x04,0x66,0x05,0xec,0x00,0x01,0x02,0x5b,0xfe,0x2a,0x00,0x01,0x05,0x56,0x06,0x52,0x00,0x01,0x02,0x17,0x04,0xb8,0x00,0x01,0x02,0x17,0xff,0xe7,0x00,0x01,0x01,0xf5,0x04,0xb8,0x00,0x01,0x04,0x96,0x03,0xc8,0x00,0x01, -0x01,0xf5,0xff,0xe7,0x00,0x01,0x01,0xbb,0x04,0xb8,0x00,0x01,0x02,0xfe,0x03,0xc8,0x00,0x01,0x01,0xbb,0xff,0xe7,0x00,0x01,0x01,0x93,0x04,0xb8,0x00,0x01,0x01,0x93,0xff,0xe7,0x00,0x01,0x03,0xa0,0x03,0xc8,0x00,0x01,0x02,0x34,0x04,0xb8,0x00,0x01,0x04,0x18,0x03,0xc8,0x00,0x01,0x02,0x34,0xff,0xe7,0x00,0x01,0x01,0x1c,0x04,0xa0, -0x00,0x01,0x02,0x38,0x04,0x50,0x00,0x01,0x01,0x1c,0xfe,0x2a,0x00,0x01,0x02,0x5b,0x06,0x72,0x00,0x01,0x02,0x1e,0x04,0xb8,0x00,0x01,0x03,0xec,0x04,0x18,0x00,0x01,0x02,0x1e,0xff,0xe7,0x00,0x01,0x01,0xea,0x04,0xa0,0x00,0x01,0x03,0xd5,0x04,0x50,0x00,0x01,0x01,0xea,0xfe,0x2a,0x00,0x01,0x01,0xd4,0x04,0xb8,0x00,0x01,0x03,0xa8, -0x04,0x68,0x00,0x01,0x01,0xd4,0xff,0xe7,0x00,0x01,0x02,0x43,0x04,0xe2,0x00,0x01,0x04,0x37,0x04,0x50,0x00,0x01,0x02,0x43,0xfe,0x2a,0x00,0x01,0x02,0x43,0x06,0xa2,0x00,0x01,0x04,0x1a,0x05,0x78,0x00,0x01,0x01,0x0c,0x06,0x29,0x00,0x01,0x01,0xc8,0x05,0x89,0x00,0x01,0x01,0x0c,0xff,0xf1,0x00,0x01,0x00,0xe1,0x04,0xa0,0x00,0x01, -0x01,0xea,0x04,0x50,0x00,0x01,0x01,0x40,0x04,0xa0,0x00,0x01,0x02,0x90,0x04,0x50,0x00,0x01,0x01,0x40,0xff,0xf1,0x00,0x01,0x01,0x18,0x06,0x8c,0x00,0x01,0x02,0x3e,0x05,0x9c,0x00,0x01,0x01,0x18,0xff,0xf1,0x00,0x01,0x01,0x9a,0x06,0x8c,0x00,0x01,0x03,0x02,0x05,0x9c,0x00,0x01,0x01,0x9a,0xff,0xf1,0x00,0x01,0x00,0xf7,0x06,0x8c, -0x00,0x01,0x01,0xee,0x05,0x9c,0x00,0x01,0x01,0x3f,0xfe,0x2a,0x00,0x01,0x02,0xf8,0x06,0x72,0x00,0x01,0x04,0xd3,0x04,0xb0,0x00,0x01,0x02,0xf8,0xfe,0x2a,0x00,0x01,0x03,0x7a,0x04,0xa0,0x00,0x01,0x06,0x94,0x04,0x50,0x00,0x01,0x03,0x7a,0xfe,0x2a,0x00,0x01,0x02,0x11,0xff,0xf1,0x00,0x01,0x02,0x58,0x04,0xa0,0x00,0x01,0x04,0x60, -0x04,0x50,0x00,0x01,0x02,0x58,0x04,0xb8,0x00,0x01,0x04,0x60,0x03,0xc8,0x00,0x01,0x03,0x6b,0x04,0xb6,0x00,0x01,0x05,0x96,0x04,0x66,0x00,0x01,0x03,0x6b,0xff,0xe7,0x00,0x01,0x02,0xdf,0x04,0xb8,0x00,0x01,0x05,0x74,0x03,0xc8,0x00,0x01,0x02,0xdf,0xff,0xe7,0x00,0x01,0x02,0x8d,0x06,0x8c,0x00,0x01,0x04,0xca,0x05,0x4c,0x00,0x01, -0x02,0x8d,0xfe,0x2a,0x00,0x01,0x01,0xd1,0x04,0xa0,0x00,0x01,0x02,0x78,0x04,0x50,0x00,0x01,0x01,0x64,0xff,0xe7,0x00,0x01,0x01,0xd1,0x06,0x8c,0x00,0x01,0x02,0x78,0x06,0x3c,0x00,0x01,0x01,0x64,0xfe,0x2a,0x00,0x01,0x01,0xcc,0x04,0xb2,0x00,0x01,0x01,0x86,0x04,0xb8,0x00,0x01,0x02,0xfe,0x04,0x68,0x00,0x01,0x00,0xe1,0xff,0xf1, -0x00,0x01,0x01,0x18,0x04,0xb8,0x00,0x01,0x02,0x5e,0x04,0x18,0x00,0x01,0x01,0xcc,0xff,0xf1,0x00,0x01,0x01,0xef,0x04,0xa0,0x00,0x01,0x03,0xa2,0x04,0x00,0x00,0x01,0x01,0xef,0xff,0xf1,0x00,0x01,0x03,0xa2,0x04,0x50,0x00,0x01,0x01,0xae,0xfe,0xa2,0x00,0x01,0x01,0x4a,0x06,0xa2,0x00,0x01,0x02,0x9a,0x06,0x52,0x00,0x01,0x00,0xb4, -0xfe,0x2a,0x00,0x01,0x01,0x5e,0x06,0xa2,0x00,0x01,0x02,0xb0,0x06,0x52,0x00,0x01,0x00,0xc8,0xfe,0x2a,0x00,0x01,0x00,0xb4,0x06,0xa2,0x00,0x01,0x01,0xfe,0x05,0xb2,0x00,0x01,0x01,0x4a,0xff,0xe7,0x00,0x01,0x01,0x68,0x06,0xa2,0x00,0x01,0x02,0xe4,0x06,0x52,0x00,0x01,0x00,0xdc,0xfe,0x2a,0x00,0x01,0x01,0x2c,0x04,0xb6,0x00,0x01, -0x02,0x68,0x03,0xc6,0x00,0x01,0x01,0x90,0xfe,0xd4,0x00,0x01,0x01,0x80,0xfe,0x2a,0x00,0x01,0x02,0x65,0x04,0xa0,0x00,0x01,0x04,0x7b,0x04,0x50,0x00,0x01,0x02,0x65,0xff,0xe7,0x00,0x01,0x02,0x61,0x04,0xa0,0x00,0x01,0x04,0xc2,0x04,0x50,0x00,0x01,0x02,0x61,0xff,0xe7,0x00,0x01,0x02,0x3b,0x04,0xb8,0x00,0x01,0x04,0x27,0x04,0x68, -0x00,0x01,0x02,0x3b,0xff,0xe7,0x00,0x01,0x01,0xf4,0x04,0xa0,0x00,0x01,0x03,0x35,0x04,0x50,0x00,0x01,0x02,0xe4,0x04,0xa0,0x00,0x01,0x05,0x28,0x04,0x50,0x00,0x01,0x02,0xe4,0xff,0xf1,0x00,0x01,0x01,0xef,0x06,0x8c,0x00,0x01,0x03,0xdf,0x05,0x9c,0x00,0x01,0x01,0xab,0x04,0xa0,0x00,0x01,0x03,0x56,0x04,0x50,0x00,0x01,0x01,0xab, -0xff,0xf1,0x00,0x01,0x01,0xc2,0xfe,0xd4,0x00,0x01,0x02,0x0c,0xff,0x51,0x00,0x01,0x01,0x90,0x05,0x14,0x00,0x01,0x01,0x76,0x06,0xa2,0x00,0x01,0x03,0x3c,0x05,0xb2,0x00,0x01,0x01,0x2c,0xff,0xf1,0x00,0x01,0x02,0xec,0x05,0xb2,0x00,0x01,0x01,0xa4,0xff,0xf1,0x00,0x01,0x02,0x9c,0x05,0x4c,0x00,0x01,0x01,0x58,0xff,0xe7,0x00,0x01, -0x02,0x3a,0x04,0xb8,0x00,0x01,0x03,0xba,0x04,0x68,0x00,0x01,0x02,0x71,0x06,0xa4,0x00,0x01,0x04,0x74,0x05,0xdc,0x00,0x01,0x02,0x71,0xff,0xe7,0x00,0x01,0x03,0x8f,0x04,0x00,0x00,0x01,0x02,0x31,0x04,0xb8,0x00,0x01,0x04,0x12,0x03,0xc8,0x00,0x01,0x02,0x31,0xff,0xe7,0x00,0x01,0x02,0x8a,0x05,0x46,0x00,0x01,0x04,0xdc,0x04,0xe2, -0x00,0x01,0x02,0x8a,0xff,0xe7,0x00,0x01,0x02,0x43,0x04,0xa0,0x00,0x01,0x01,0x04,0x06,0x79,0x00,0x01,0x01,0x9e,0x05,0x89,0x00,0x01,0x00,0x62,0xfe,0x2a,0x00,0x01,0x01,0xfe,0x04,0xa0,0x00,0x01,0x03,0xac,0x04,0x50,0x00,0x01,0x01,0xfe,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x04,0xa0,0x00,0x01,0x03,0x14,0x03,0xb0,0x00,0x01,0x05,0x56, -0x06,0x02,0x00,0x01,0x05,0xaa,0x06,0x72,0x00,0x01,0x07,0x54,0x04,0xb0,0x00,0x01,0x05,0xaa,0xff,0xf1,0x00,0x01,0x07,0x98,0x04,0xb0,0x00,0x01,0x05,0xaa,0xfe,0x2a,0x00,0x01,0x07,0x7f,0x04,0xb0,0x00,0x01,0x05,0xaa,0xff,0x51,0x00,0x01,0x03,0x6f,0x05,0x78,0x00,0x01,0x04,0x98,0x04,0xb0,0x00,0x01,0x03,0x6f,0xff,0xf1,0x00,0x01, -0x02,0xaa,0x06,0x52,0x00,0x01,0x04,0x6f,0x06,0x52,0x00,0x01,0x02,0xaa,0xfe,0x2a,0x00,0x01,0x04,0x05,0x05,0x78,0x00,0x01,0x05,0x6e,0x04,0x8f,0x00,0x01,0x04,0x05,0xff,0xe7,0x00,0x01,0x04,0x70,0x06,0x72,0x00,0x01,0x04,0x70,0xfe,0x2a,0x00,0x01,0x03,0x3f,0x06,0x72,0x00,0x01,0x04,0x54,0x04,0xb0,0x00,0x01,0x03,0x3f,0xff,0xe7, -0x00,0x01,0x02,0xee,0x06,0x72,0x00,0x01,0x04,0x8e,0x04,0xb0,0x00,0x01,0x02,0xee,0xff,0xf1,0x00,0x01,0x02,0x08,0x06,0x3a,0x00,0x01,0x04,0x44,0x05,0x9a,0x00,0x01,0x01,0xfa,0xff,0xf1,0x00,0x01,0x01,0xfa,0x06,0x3a,0x00,0x01,0x00,0xf0,0x05,0x14,0x00,0x01,0x01,0xa4,0x04,0xb0,0x00,0x01,0x01,0x09,0x05,0x14,0x00,0x01,0x02,0x1c, -0x06,0x8c,0x00,0x01,0x04,0x87,0x06,0x8c,0x00,0x01,0x02,0x1c,0xfe,0x2a,0x00,0x01,0x00,0xfa,0x06,0x8c,0x00,0x01,0x01,0x96,0x06,0x8c,0x00,0x01,0x02,0x4e,0x04,0xb8,0x00,0x01,0x03,0xec,0x04,0xb8,0x00,0x01,0x01,0x2c,0x05,0xcf,0x00,0x01,0x01,0xe5,0x05,0x7f,0x00,0x01,0x01,0x2c,0xfe,0x2a,0x00,0x01,0x04,0x6c,0x04,0x68,0x00,0x01, -0x03,0xbd,0x06,0x72,0x00,0x01,0x06,0xba,0x05,0x78,0x00,0x01,0x03,0xbd,0xff,0xe7,0x00,0x01,0x03,0xbd,0x05,0x14,0x00,0x01,0x06,0xba,0x04,0xb0,0x00,0x01,0x03,0xbd,0xfe,0x2a,0x00,0x01,0x02,0x8c,0x06,0x90,0x00,0x01,0x03,0x93,0x06,0x7c,0x00,0x01,0x02,0x9e,0xff,0xa1,0x00,0x01,0x02,0xee,0x06,0x90,0x00,0x01,0x04,0x7c,0x06,0x2c, -0x00,0x01,0x02,0xee,0xff,0x97,0x00,0x01,0x02,0x26,0x05,0xb4,0x00,0x01,0x04,0x52,0x04,0xd1,0x00,0x01,0x02,0x3a,0xff,0x97,0x00,0x01,0x02,0x26,0x06,0x90,0x00,0x01,0x04,0x9c,0x06,0x2c,0x00,0x01,0x02,0x26,0xff,0xa1,0x00,0x01,0x01,0xae,0xfe,0x8e,0x00,0x01,0x01,0xc2,0xfe,0x8e,0x00,0x01,0x02,0x0b,0x06,0x7a,0x00,0x01,0x03,0xc6, -0x06,0x02,0x00,0x01,0x01,0x9b,0x05,0x14,0x00,0x01,0x02,0xd6,0x04,0xb0,0x00,0x01,0x00,0xe6,0xff,0xf1,0x00,0x01,0x02,0x5b,0x04,0xb8,0x00,0x01,0x04,0xb6,0x04,0x18,0x00,0x01,0x01,0xd8,0x06,0x3a,0x00,0x01,0x03,0xb1,0x05,0x9a,0x00,0x01,0x01,0xd8,0xff,0xf1,0x00,0x01,0x02,0x4f,0x04,0xa0,0x00,0x01,0x04,0x9f,0x04,0x50,0x00,0x01, -0x02,0x4f,0xfe,0x2a,0x00,0x01,0x05,0x11,0x06,0xc2,0x00,0x01,0x06,0x83,0x05,0x78,0x00,0x01,0x05,0x11,0xff,0xf1,0x00,0x01,0x01,0x48,0x04,0xa0,0x00,0x01,0x01,0x48,0xff,0xf1,0x00,0x01,0x01,0xa4,0x04,0xa0,0x00,0x01,0x02,0x23,0x04,0xa0,0x00,0x01,0x03,0xf6,0x04,0x50,0x00,0x01,0x02,0x23,0xff,0xe7,0x00,0x01,0x02,0x6c,0xfe,0xa2, -0x00,0x01,0x02,0x1c,0xfe,0xa2,0x00,0x01,0x01,0x36,0xfe,0xa2,0x00,0x01,0x02,0x4e,0xfe,0xa2,0x00,0x01,0x03,0x7a,0xfe,0xa2,0x00,0x01,0x01,0xf4,0xfe,0xa2,0x00,0x01,0x01,0xd6,0xfe,0xa2,0x00,0x01,0x01,0xc2,0xfe,0xa2,0x00,0x01,0x01,0xbb,0xfe,0xa2,0x00,0x01,0x01,0x93,0xfe,0xa2,0x00,0x01,0x01,0xdd,0x05,0x14,0x00,0x01,0x01,0xdd, -0xfe,0xa2,0x00,0x01,0x01,0xc4,0x04,0xa0,0x00,0x01,0x03,0x89,0x04,0x50,0x00,0x01,0x01,0xc4,0xfe,0x2a,0x00,0x01,0x02,0x60,0x04,0xee,0x00,0x01,0x04,0x71,0x04,0x4e,0x00,0x01,0x02,0x60,0xff,0xe7,0x00,0x01,0x01,0x7a,0x05,0xd0,0x00,0x01,0x02,0xa4,0x05,0x30,0x00,0x01,0x02,0x58,0xff,0x6a,0x00,0x01,0x02,0x3a,0x05,0x8d,0x00,0x01, -0x04,0x2f,0x05,0x00,0x00,0x01,0x03,0x00,0x06,0x52,0x00,0x01,0x05,0x4d,0x06,0x02,0x00,0x01,0x03,0x00,0xff,0x06,0x00,0x01,0x02,0x5b,0x05,0x14,0x00,0x01,0x04,0x34,0x04,0x68,0x00,0x01,0x02,0x5b,0xff,0x06,0x00,0x01,0x01,0xce,0x04,0xa1,0x00,0x01,0x03,0x20,0x04,0xa1,0x00,0x01,0x01,0xce,0xff,0xf1,0x00,0x01,0x01,0x22,0x06,0x72, -0x00,0x01,0x01,0x22,0xff,0xf1,0x00,0x01,0x02,0x9e,0xfe,0x8e,0x00,0x01,0x02,0x08,0x05,0x8d,0x00,0x01,0x03,0x9a,0x05,0x00,0x00,0x01,0x01,0x2c,0x05,0xea,0x00,0x01,0x02,0x66,0x05,0xc8,0x00,0x01,0x01,0x80,0xff,0x06,0x00,0x01,0x04,0x4c,0x04,0xb0,0x00,0x01,0x02,0xcc,0x04,0xb8,0x00,0x01,0x04,0xb0,0x04,0xb0,0x00,0x01,0x02,0xcc, -0xff,0xe7,0x00,0x01,0x01,0x18,0x04,0xba,0x00,0x01,0x01,0x04,0x04,0xba,0x00,0x01,0x00,0x00,0x04,0xba,0x00,0x01,0xff,0xf6,0x04,0xb0,0x00,0x01,0x02,0x26,0x07,0x33,0x00,0x01,0x02,0x58,0x07,0x62,0x00,0x01,0x02,0x76,0x07,0xa8,0x00,0x01,0x02,0x94,0x06,0x3a,0x00,0x01,0x02,0x06,0x06,0x3a,0x00,0x01,0x02,0xff,0x06,0x3a,0x00,0x01, -0x02,0xee,0x07,0x4a,0x00,0x01,0x03,0x0c,0x07,0xa8,0x00,0x01,0x03,0x04,0x06,0x6a,0x00,0x01,0x03,0x04,0x06,0x3a,0x00,0x01,0x02,0x40,0x06,0x52,0x00,0x01,0x02,0x40,0x06,0x3a,0x00,0x01,0x03,0x22,0x06,0x3a,0x00,0x01,0x02,0x77,0x06,0x6a,0x00,0x01,0x02,0x58,0x06,0x3a,0x00,0x01,0x04,0x13,0x06,0x6a,0x00,0x01,0x03,0xd4,0x06,0x3a, -0x00,0x01,0x02,0x09,0x04,0xd0,0x00,0x01,0x02,0x08,0x04,0xd0,0x00,0x01,0x02,0x17,0x04,0xd0,0x00,0x01,0x02,0x53,0x04,0xa0,0x00,0x01,0x02,0x53,0x04,0xd0,0x00,0x01,0x02,0x3f,0x05,0xee,0x00,0x01,0x02,0x58,0x06,0x5e,0x00,0x01,0x02,0x58,0x04,0xd0,0x00,0x01,0x01,0xef,0x05,0x4a,0x00,0x01,0x01,0xef,0x04,0xd0,0x00,0x01,0x02,0xd6, -0x04,0xa0,0x00,0x01,0x02,0xd0,0x04,0xd0,0x00,0x01,0x01,0xd9,0x04,0xd0,0x00,0x01,0x03,0x40,0x04,0xd0,0x00,0x01,0x03,0x20,0x04,0xd0,0x00,0x01,0x02,0x03,0x04,0xa0,0x00,0x01,0x02,0x03,0x04,0xd0,0x00,0x01,0x02,0x17,0x05,0x9f,0x00,0x01,0x02,0x17,0x06,0x2c,0x00,0x01,0x01,0xdc,0x06,0x19,0x00,0x01,0x01,0xf4,0x06,0x5e,0x00,0x01, -0x02,0xe2,0x06,0x6a,0x00,0x01,0x02,0xe2,0x06,0x3a,0x00,0x01,0x00,0xc8,0x02,0xf8,0x00,0x01,0x03,0x0c,0x05,0x9a,0x00,0x01,0x03,0xc0,0x05,0x22,0x00,0x01,0x04,0x8e,0x05,0x82,0x00,0x01,0x04,0xaf,0x05,0x07,0x00,0x01,0x03,0x94,0x05,0x9a,0x00,0x01,0x03,0x9d,0x05,0x9a,0x00,0x01,0x04,0xcf,0x05,0x40,0x00,0x01,0x04,0xf7,0x05,0x9a, -0x00,0x01,0x01,0xe0,0x05,0x9a,0x00,0x01,0x02,0x2d,0x05,0xa0,0x00,0x01,0x04,0x2c,0x05,0x9a,0x00,0x01,0x01,0x6a,0x05,0x9a,0x00,0x01,0x06,0x6d,0x05,0x9a,0x00,0x01,0x05,0x45,0x05,0x9a,0x00,0x01,0x05,0x51,0x04,0x94,0x00,0x01,0x04,0x03,0x05,0x22,0x00,0x01,0x03,0xf7,0x05,0x22,0x00,0x01,0x03,0xad,0x05,0x82,0x00,0x01,0x04,0x01, -0x05,0x9a,0x00,0x01,0x04,0xd1,0x05,0xa0,0x00,0x01,0x04,0xd1,0x05,0x9a,0x00,0x01,0x07,0x47,0x05,0x9a,0x00,0x01,0x04,0x38,0x05,0x9a,0x00,0x01,0x04,0x4c,0x05,0x9a,0x00,0x01,0x03,0x70,0x03,0x8e,0x00,0x01,0x04,0x0f,0x03,0x92,0x00,0x01,0x03,0x5d,0x03,0xdf,0x00,0x01,0x04,0x08,0x05,0xe9,0x00,0x01,0x03,0x98,0x03,0x8e,0x00,0x01, -0x02,0xa2,0x05,0xf0,0x00,0x01,0x04,0x08,0x03,0xff,0x00,0x01,0x03,0xe2,0x03,0x35,0x00,0x01,0x01,0x4a,0x03,0xfc,0x00,0x01,0x01,0x4b,0x03,0xf8,0x00,0x01,0x03,0x82,0x04,0x02,0x00,0x01,0x01,0x40,0x05,0xe9,0x00,0x01,0x06,0x40,0x03,0xa0,0x00,0x01,0x03,0xd4,0x03,0xa0,0x00,0x01,0x03,0xfc,0x03,0x8e,0x00,0x01,0x03,0xfc,0x03,0xaf, -0x00,0x01,0x04,0x08,0x04,0x03,0x00,0x01,0x02,0xb3,0x04,0x06,0x00,0x01,0x02,0xe4,0x03,0xfc,0x00,0x01,0x02,0x74,0x03,0xfe,0x00,0x01,0x03,0xde,0x03,0xfc,0x00,0x01,0x03,0xc1,0x04,0x00,0x00,0x01,0x05,0xa0,0x04,0x00,0x00,0x01,0x03,0x66,0x04,0x00,0x00,0x01,0x03,0xc0,0x03,0xfc,0x00,0x01,0x03,0x52,0x04,0x00,0x00,0x01,0x06,0x30, -0x03,0x8e,0x00,0x01,0x04,0x3e,0x03,0x07,0x00,0x01,0x06,0xf4,0x03,0x8e,0x00,0x01,0x01,0x40,0x04,0x06,0x00,0x01,0x03,0x84,0x03,0xb8,0x00,0x01,0x03,0x6e,0x04,0x0c,0x00,0x01,0x04,0x9e,0x04,0x0c,0x00,0x01,0x03,0xd8,0x03,0xf1,0x00,0x01,0x02,0xf1,0x03,0xb8,0x00,0x01,0x03,0x42,0x03,0xe8,0x00,0x01,0x02,0xd6,0x03,0xfc,0x00,0x01, -0x02,0x80,0x03,0xfc,0x00,0x01,0x03,0xde,0x03,0xb8,0x00,0x01,0x03,0x9c,0x04,0x1a,0x00,0x01,0x01,0x61,0x03,0xfc,0x00,0x01,0x02,0x33,0x04,0x00,0x00,0x01,0x05,0x39,0x04,0x08,0x00,0x01,0x04,0x02,0x03,0xfc,0x00,0x01,0x04,0x5c,0x04,0x0f,0x00,0x01,0x02,0x56,0x03,0xfd,0x00,0x01,0x00,0x00,0x02,0x21,0x00,0x01,0x00,0x00,0x02,0x12, -0x00,0x01,0x00,0x00,0x02,0x58,0x00,0x01,0x02,0x94,0x02,0xcd,0x00,0x01,0x02,0x4b,0x02,0xcd,0x00,0x01,0x02,0xde,0x02,0xe5,0x00,0x01,0x02,0xee,0x02,0xcd,0x00,0x01,0x02,0x06,0x02,0xcd,0x00,0x01,0x01,0xf4,0x02,0xcd,0x00,0x01,0x02,0xbe,0x02,0xe5,0x00,0x01,0x02,0xd7,0x02,0xcd,0x00,0x01,0x01,0x10,0x02,0xcd,0x00,0x01,0x01,0xd1, -0x02,0xd9,0x00,0x01,0x00,0xed,0x03,0xeb,0x00,0x01,0x01,0x0e,0x02,0xcd,0x00,0x01,0x03,0xa2,0x03,0x42,0x00,0x01,0x02,0xfe,0x02,0xcd,0x00,0x01,0x03,0x04,0x02,0xe5,0x00,0x01,0x02,0x64,0x03,0xeb,0x00,0x01,0x03,0x04,0x02,0xe2,0x00,0x01,0x02,0x20,0x02,0xe5,0x00,0x01,0x02,0x18,0x02,0xcd,0x00,0x01,0x02,0xbf,0x02,0xd9,0x00,0x01, -0x02,0x7c,0x02,0xcd,0x00,0x01,0x03,0xbc,0x02,0xcd,0x00,0x01,0x02,0x5c,0x02,0xcd,0x00,0x01,0x02,0x36,0x01,0xae,0x00,0x01,0x02,0x48,0x02,0xcd,0x00,0x01,0x02,0x09,0x01,0x41,0x00,0x01,0x02,0x80,0x01,0xce,0x00,0x01,0x02,0x3d,0x02,0x18,0x00,0x01,0x02,0x44,0x02,0x1b,0x00,0x01,0x02,0x35,0x02,0x58,0x00,0x01,0x01,0x40,0x02,0x67, -0x00,0x01,0x02,0x37,0x01,0xfc,0x00,0x01,0x01,0x01,0x04,0x71,0x00,0x01,0x01,0x03,0x02,0x26,0x00,0x01,0x00,0xf8,0x01,0xef,0x00,0x01,0x00,0xfa,0x04,0x25,0x00,0x01,0x00,0xfa,0x02,0xf9,0x00,0x01,0x03,0x72,0x02,0x0c,0x00,0x01,0x02,0x4c,0x02,0x0c,0x00,0x01,0x02,0x53,0x02,0x18,0x00,0x01,0x02,0x7c,0x01,0xef,0x00,0x01,0x02,0x3d, -0x02,0x13,0x00,0x01,0x01,0x01,0x01,0xe5,0x00,0x01,0x01,0xb2,0x02,0x18,0x00,0x01,0x01,0x2c,0x02,0x1b,0x00,0x01,0x02,0x39,0x02,0x0c,0x00,0x01,0x02,0x17,0x02,0x6c,0x00,0x01,0x02,0xe4,0x02,0x00,0x00,0x01,0x01,0xd6,0x02,0x00,0x00,0x01,0x01,0xef,0x02,0x5a,0x00,0x01,0x01,0xcf,0x02,0x00,0x00,0x01,0x02,0x58,0x01,0xd7,0x00,0x01, -0x03,0x04,0x02,0xff,0x00,0x01,0x01,0xb2,0x01,0xd7,0x00,0x01,0x01,0x9d,0x01,0xd0,0x00,0x01,0x02,0x3c,0x01,0xcf,0x00,0x01,0x00,0xe5,0x02,0x0c,0x00,0x01,0x00,0xfd,0x03,0x28,0x00,0x01,0x02,0xf6,0x00,0x6f,0x00,0x01,0x00,0x00,0x05,0xc8,0x00,0x01,0x00,0x00,0x05,0xbe,0x00,0x01,0x00,0x00,0xff,0x6a,0x00,0x01,0x05,0x12,0x07,0x6c, -0x00,0x01,0x05,0x12,0xfe,0x5c,0x00,0x01,0x04,0x2f,0x07,0x6c,0x00,0x01,0x04,0x2f,0xfe,0x5c,0x00,0x01,0x04,0x8c,0x07,0x6c,0x00,0x01,0x04,0x8c,0xfe,0x5c,0x00,0x01,0x05,0x3e,0x07,0x6c,0x00,0x01,0x05,0x3e,0xfe,0x5c,0x00,0x01,0x03,0xb4,0x07,0x6c,0x00,0x01,0x03,0xb4,0xfe,0x5c,0x00,0x01,0x03,0x94,0x07,0x6c,0x00,0x01,0x03,0x94, -0xfe,0x5c,0x00,0x01,0x04,0xec,0x07,0x6c,0x00,0x01,0x04,0xec,0xfe,0x5c,0x00,0x01,0x04,0xf2,0x07,0x6c,0x00,0x01,0x04,0xf2,0xfe,0x5c,0x00,0x01,0x01,0xf0,0x07,0x6c,0x00,0x01,0x01,0xf0,0xfe,0x5c,0x00,0x01,0x02,0x2b,0x07,0x6c,0x00,0x01,0x02,0x2b,0xfe,0x5c,0x00,0x01,0x04,0xa2,0x07,0x6c,0x00,0x01,0x04,0xa2,0xfe,0x5c,0x00,0x01, -0x03,0xa4,0x07,0x6c,0x00,0x01,0x03,0xa4,0xfe,0x5c,0x00,0x01,0x06,0x72,0x07,0x6c,0x00,0x01,0x06,0x72,0xfe,0x5c,0x00,0x01,0x05,0x40,0x07,0x6c,0x00,0x01,0x05,0x40,0xfe,0x5c,0x00,0x01,0x05,0xaa,0x07,0x6c,0x00,0x01,0x05,0xaa,0xfe,0x5c,0x00,0x01,0x04,0x29,0x07,0x6c,0x00,0x01,0x04,0x29,0xfe,0x5c,0x00,0x01,0x05,0xcc,0x07,0x6c, -0x00,0x01,0x05,0xcc,0xfe,0x5c,0x00,0x01,0x04,0xc0,0x07,0x6c,0x00,0x01,0x04,0xc0,0xfe,0x5c,0x00,0x01,0x03,0xde,0x07,0x6c,0x00,0x01,0x03,0xde,0xfe,0x5c,0x00,0x01,0x04,0x0c,0x07,0x6c,0x00,0x01,0x04,0x0c,0xfe,0x5c,0x00,0x01,0x04,0xd5,0x07,0x6c,0x00,0x01,0x04,0xd5,0xfe,0x5c,0x00,0x01,0x04,0xe6,0x07,0x6c,0x00,0x01,0x04,0xe6, -0xfe,0x5c,0x00,0x01,0x07,0x60,0x07,0x6c,0x00,0x01,0x07,0x60,0xfe,0x5c,0x00,0x01,0x04,0x9a,0x07,0x6c,0x00,0x01,0x04,0x9a,0xfe,0x5c,0x00,0x01,0x04,0x60,0x07,0x6c,0x00,0x01,0x04,0x60,0xfe,0x5c,0x00,0x01,0x04,0x64,0x07,0x6c,0x00,0x01,0x04,0x64,0xfe,0x5c,0x00,0x01,0x03,0x83,0x07,0x6c,0x00,0x01,0x03,0x83,0xfe,0x5c,0x00,0x01, -0x04,0x54,0x07,0x6c,0x00,0x01,0x04,0x54,0xfe,0x5c,0x00,0x01,0x03,0x62,0x07,0x6c,0x00,0x01,0x03,0x62,0xfe,0x5c,0x00,0x01,0x04,0x10,0x07,0x6c,0x00,0x01,0x04,0x10,0xfe,0x5c,0x00,0x01,0x03,0xdd,0x07,0x6c,0x00,0x01,0x03,0xdd,0xfe,0x5c,0x00,0x01,0x02,0xa0,0x07,0x6c,0x00,0x01,0x02,0xa0,0xfe,0x5c,0x00,0x01,0x03,0xf8,0x07,0x6c, -0x00,0x01,0x03,0xf8,0xfe,0x5c,0x00,0x01,0x01,0x66,0x07,0x6c,0x00,0x01,0x01,0x66,0xfe,0x5c,0x00,0x01,0x01,0x4a,0x07,0x6c,0x00,0x01,0x01,0x4a,0xfe,0x5c,0x00,0x01,0x06,0x54,0x07,0x6c,0x00,0x01,0x06,0x54,0xfe,0x5c,0x00,0x01,0x04,0x50,0x07,0x6c,0x00,0x01,0x04,0x50,0xfe,0x5c,0x00,0x01,0x02,0xbc,0x07,0x6c,0x00,0x01,0x02,0xbc, -0xfe,0x5c,0x00,0x01,0x03,0x0f,0x07,0x6c,0x00,0x01,0x03,0x0f,0xfe,0x5c,0x00,0x01,0x02,0x81,0x07,0x6c,0x00,0x01,0x02,0x81,0xfe,0x5c,0x00,0x01,0x03,0xe2,0x07,0x6c,0x00,0x01,0x03,0xe2,0xfe,0x5c,0x00,0x01,0x03,0xcb,0x07,0x6c,0x00,0x01,0x03,0xcb,0xfe,0x5c,0x00,0x01,0x05,0xb0,0x07,0x6c,0x00,0x01,0x05,0xb0,0xfe,0x5c,0x00,0x01, -0x03,0x92,0x07,0x6c,0x00,0x01,0x03,0x92,0xfe,0x5c,0x00,0x01,0x03,0xd5,0x07,0x6c,0x00,0x01,0x03,0xd5,0xfe,0x5c,0x00,0x01,0x03,0x70,0x07,0x6c,0x00,0x01,0x03,0x70,0xfe,0x5c,0x00,0x01,0x05,0x12,0x08,0x34,0x00,0x01,0x05,0x40,0x08,0x34,0x00,0x01,0x05,0xaa,0x08,0x34,0x00,0x01,0x04,0xd5,0x08,0x34,0x00,0x01,0x01,0xdd,0x07,0x6c, -0x00,0x01,0x01,0xdd,0xfe,0x5c,0x00,0x01,0x01,0x71,0x07,0x6c,0x00,0x01,0x01,0x71,0xfe,0x5c,0x00,0x01,0x02,0x07,0x07,0x6c,0x00,0x01,0x02,0x07,0xfe,0x5c,0x00,0x01,0x02,0x10,0x07,0x6c,0x00,0x01,0x02,0x10,0xfe,0x5c,0x00,0x01,0x04,0x14,0x07,0x6c,0x00,0x01,0x04,0x14,0xfe,0x5c,0x00,0x01,0x06,0x83,0x07,0x6c,0x00,0x01,0x06,0x83, -0xfe,0x5c,0x00,0x01,0x06,0x56,0x07,0x6c,0x00,0x01,0x06,0x56,0xfe,0x5c,0x00,0x01,0x04,0x96,0x07,0x6c,0x00,0x01,0x04,0x96,0xfe,0x5c,0x00,0x01,0x03,0xb8,0x07,0x6c,0x00,0x01,0x03,0xb8,0xfe,0x5c,0x00,0x01,0x07,0x12,0x07,0x6c,0x00,0x01,0x07,0x12,0xfe,0x5c,0x00,0x01,0x07,0x21,0x07,0x6c,0x00,0x01,0x07,0x21,0xfe,0x5c,0x00,0x01, -0x03,0xb4,0x08,0x34,0x00,0x01,0x01,0xfd,0x08,0x34,0x00,0x01,0x01,0xfd,0xfe,0x5c,0x00,0x01,0x02,0x30,0x08,0x34,0x00,0x01,0x02,0x30,0xfe,0x5c,0x00,0x01,0x02,0x38,0x08,0x34,0x00,0x01,0x02,0x38,0xfe,0x5c,0x00,0x01,0x01,0xf0,0x08,0x34,0x00,0x01,0x02,0x12,0x07,0x6c,0x00,0x01,0x02,0x12,0xfe,0x5c,0x00,0x01,0x03,0xde,0x08,0x34, -0x00,0x01,0x04,0x64,0x08,0x34,0x00,0x01,0x04,0x18,0x07,0x6c,0x00,0x01,0x04,0x18,0xfe,0x5c,0x00,0x01,0x04,0x60,0x08,0x34,0x00,0x01,0x04,0xec,0x08,0x34,0x00,0x01,0x04,0x8c,0x08,0x34,0x00,0x01,0x04,0x98,0x07,0x6c,0x00,0x01,0x04,0x98,0xfe,0x5c,0x00,0x01,0x05,0x3e,0x08,0x34,0x00,0x01,0x05,0xb3,0x07,0x6c,0x00,0x01,0x05,0xb3, -0xfe,0x5c,0x00,0x01,0x03,0xa4,0x08,0x34,0x00,0x01,0x02,0x13,0x07,0x6c,0x00,0x01,0x02,0x13,0xfe,0x5c,0x00,0x01,0x02,0xc3,0x07,0x6c,0x00,0x01,0x02,0xc3,0xfe,0x5c,0x00,0x01,0x02,0x87,0x07,0x6c,0x00,0x01,0x02,0x87,0xfe,0x5c,0x00,0x01,0x04,0xc0,0x08,0x34,0x00,0x01,0x02,0xc9,0x07,0x6c,0x00,0x01,0x02,0xc9,0xfe,0x5c,0x00,0x01, -0x02,0x9a,0x07,0x6c,0x00,0x01,0x02,0x9a,0xfe,0x5c,0x00,0x01,0x04,0x0c,0x08,0x34,0x00,0x01,0x03,0xd3,0x07,0x6c,0x00,0x01,0x03,0xd3,0xfe,0x5c,0x00,0x01,0x04,0x4e,0x07,0x6c,0x00,0x01,0x04,0x4e,0xfe,0x5c,0x00,0x01,0x03,0x6c,0x07,0x6c,0x00,0x01,0x03,0x6c,0xfe,0x5c,0x00,0x01,0x04,0x4a,0x07,0x6c,0x00,0x01,0x04,0x4a,0xfe,0x5c, -0x00,0x01,0x04,0xf2,0x08,0x34,0x00,0x01,0x03,0xf8,0x08,0x34,0x00,0x01,0x05,0x92,0x07,0x6c,0x00,0x01,0x05,0x92,0xfe,0x5c,0x00,0x01,0x02,0x51,0x07,0x6c,0x00,0x01,0x02,0x51,0xfe,0x5c,0x00,0x01,0x02,0x2e,0x07,0x6c,0x00,0x01,0x02,0x2e,0xfe,0x5c,0x00,0x01,0x02,0x0f,0x07,0x6c,0x00,0x01,0x02,0x0f,0xfe,0x5c,0x00,0x01,0x01,0xeb, -0x07,0x6c,0x00,0x01,0x01,0xeb,0xfe,0x5c,0x00,0x01,0x02,0x23,0x08,0x34,0x00,0x01,0x02,0x23,0xfe,0x5c,0x00,0x01,0x02,0x00,0x07,0x6c,0x00,0x01,0x02,0x00,0xfe,0x5c,0x00,0x01,0x02,0xf2,0x07,0x6c,0x00,0x01,0x02,0xf2,0xfe,0x5c,0x00,0x01,0x02,0x62,0x07,0x6c,0x00,0x01,0x02,0x62,0xfe,0x5c,0x00,0x01,0x07,0x60,0x08,0x34,0x00,0x01, -0x06,0x3a,0x07,0x6c,0x00,0x01,0x06,0x3a,0xfe,0x5c,0x00,0x01,0x04,0xa9,0x07,0x6c,0x00,0x01,0x04,0xa9,0xfe,0x5c,0x00,0x01,0x05,0xd0,0x07,0x6c,0x00,0x01,0x05,0xd0,0xfe,0x5c,0x00,0x01,0x04,0xc7,0x07,0x6c,0x00,0x01,0x04,0xc7,0xfe,0x5c,0x00,0x01,0x04,0x52,0x07,0x6c,0x00,0x01,0x04,0x52,0xfe,0x5c,0x00,0x01,0x03,0xe9,0x07,0x6c, -0x00,0x01,0x03,0xe9,0xfe,0x5c,0x00,0x01,0x03,0x83,0x08,0x34,0x00,0x01,0x04,0x6f,0x08,0x34,0x00,0x01,0x04,0x6f,0xfe,0x5c,0x00,0x01,0x04,0x5a,0x07,0x6c,0x00,0x01,0x04,0x5a,0xfe,0x5c,0x00,0x01,0x04,0x20,0x08,0x34,0x00,0x01,0x04,0x20,0xfe,0x5c,0x00,0x01,0x04,0x32,0x07,0x6c,0x00,0x01,0x04,0x32,0xfe,0x5c,0x00,0x01,0x03,0xdd, -0x08,0x34,0x00,0x01,0x01,0xa1,0x07,0x6c,0x00,0x01,0x01,0xa1,0xfe,0x5c,0x00,0x01,0x04,0x50,0x08,0x34,0x00,0x01,0x06,0x3a,0x08,0x34,0x00,0x01,0x05,0xd0,0x08,0x34,0x00,0x01,0x05,0x66,0x07,0x6c,0x00,0x01,0x05,0x66,0xfe,0x5c,0x00,0x01,0x03,0xcf,0x07,0x6c,0x00,0x01,0x03,0xcf,0xfe,0x5c,0x00,0x01,0x04,0x2f,0x08,0x34,0x00,0x01, -0x03,0x94,0x08,0x34,0x00,0x01,0x02,0xa0,0x08,0x34,0x00,0x01,0x02,0x50,0x07,0x6c,0x00,0x01,0x02,0x50,0xfe,0x5c,0x00,0x01,0x02,0x3a,0x07,0x6c,0x00,0x01,0x02,0x3a,0xfe,0x5c,0x00,0x01,0x02,0x39,0x08,0x34,0x00,0x01,0x02,0x39,0xfe,0x5c,0x00,0x01,0x02,0x1b,0x08,0x34,0x00,0x01,0x02,0x1b,0xfe,0x5c,0x00,0x01,0x04,0xa2,0x08,0x34, -0x00,0x01,0x01,0x5b,0x07,0x6c,0x00,0x01,0x01,0x5b,0xfe,0x5c,0x00,0x01,0x01,0xf6,0x08,0x34,0x00,0x01,0x01,0xf6,0xfe,0x5c,0x00,0x01,0x01,0xf8,0x07,0x6c,0x00,0x01,0x01,0xf8,0xfe,0x5c,0x00,0x01,0x06,0x72,0x08,0x34,0x00,0x01,0x04,0x29,0x08,0x34,0x00,0x01,0x02,0xc7,0x07,0x6c,0x00,0x01,0x02,0xc7,0xfe,0x5c,0x00,0x01,0x03,0x0f, -0x08,0x34,0x00,0x01,0x02,0x95,0x07,0x6c,0x00,0x01,0x02,0x95,0xfe,0x5c,0x00,0x01,0x02,0x86,0x07,0x6c,0x00,0x01,0x02,0x86,0xfe,0x5c,0x00,0x01,0x03,0xe2,0x08,0x34,0x00,0x01,0x04,0xe6,0x08,0x34,0x00,0x01,0x04,0x9a,0x08,0x34,0x00,0x01,0x02,0x62,0x08,0x34,0x00,0x01,0x04,0x81,0x07,0x6c,0x00,0x01,0x04,0x81,0xfe,0x5c,0x00,0x01, -0x04,0x38,0x07,0x6c,0x00,0x01,0x04,0x38,0xfe,0x5c,0x00,0x01,0x05,0x42,0x07,0x6c,0x00,0x01,0x05,0x42,0xfe,0x5c,0x00,0x01,0x04,0x0e,0x07,0x6c,0x00,0x01,0x04,0x0e,0xfe,0x5c,0x00,0x01,0x05,0x90,0x07,0x6c,0x00,0x01,0x05,0x90,0xfe,0x5c,0x00,0x01,0x03,0xd7,0x07,0x6c,0x00,0x01,0x03,0xd7,0xfe,0x5c,0x00,0x01,0x04,0x5c,0x07,0x6c, -0x00,0x01,0x04,0x5c,0xfe,0x5c,0x00,0x01,0x03,0x52,0x07,0x6c,0x00,0x01,0x03,0x52,0xfe,0x5c,0x00,0x01,0x03,0xf4,0x07,0x6c,0x00,0x01,0x03,0xf4,0xfe,0x5c,0x00,0x01,0x05,0x85,0x07,0x6c,0x00,0x01,0x05,0x85,0xfe,0x5c,0x00,0x01,0x06,0x87,0x07,0x6c,0x00,0x01,0x06,0x87,0xfe,0x5c,0x00,0x01,0x02,0x25,0x07,0x6c,0x00,0x01,0x02,0x25, -0xfe,0x5c,0x00,0x01,0x01,0xdb,0x07,0x6c,0x00,0x01,0x01,0xdb,0xfe,0x5c,0x00,0x01,0x03,0xdf,0x07,0x6c,0x00,0x01,0x03,0xdf,0xfe,0x5c,0x00,0x01,0x06,0x66,0x07,0x6c,0x00,0x01,0x06,0x66,0xfe,0x5c,0x00,0x01,0x07,0x04,0x07,0x6c,0x00,0x01,0x07,0x04,0xfe,0x5c,0x00,0x01,0x05,0xac,0x07,0x6c,0x00,0x01,0x05,0xac,0xfe,0x5c,0x00,0x01, -0x04,0x7b,0x07,0x6c,0x00,0x01,0x04,0x7b,0xfe,0x5c,0x00,0x01,0x04,0x62,0x07,0x6c,0x00,0x01,0x04,0x62,0xfe,0x5c,0x00,0x01,0x03,0xc7,0x07,0x6c,0x00,0x01,0x03,0xc7,0xfe,0x5c,0x00,0x01,0x02,0xfd,0x07,0x6c,0x00,0x01,0x02,0xfd,0xfe,0x5c,0x00,0x01,0x03,0xf0,0x07,0x6c,0x00,0x01,0x03,0xf0,0xfe,0x5c,0x00,0x01,0x05,0xa8,0x07,0x6c, -0x00,0x01,0x05,0xa8,0xfe,0x5c,0x00,0x01,0x05,0x54,0x07,0x6c,0x00,0x01,0x05,0x54,0xfe,0x5c,0x00,0x01,0x04,0x7f,0x07,0x6c,0x00,0x01,0x04,0x7f,0xfe,0x5c,0x00,0x01,0x04,0x83,0x07,0x6c,0x00,0x01,0x04,0x83,0xfe,0x5c,0x00,0x01,0x04,0xd7,0x07,0x6c,0x00,0x01,0x04,0xd7,0xfe,0x5c,0x00,0x01,0x03,0xc8,0x07,0x6c,0x00,0x01,0x03,0xc8, -0xfe,0x5c,0x00,0x01,0x02,0xcd,0x07,0x6c,0x00,0x01,0x02,0xcd,0xfe,0x5c,0x00,0x01,0x02,0xe4,0x07,0x6c,0x00,0x01,0x02,0xe4,0xfe,0x5c,0x00,0x01,0x04,0x16,0x07,0x6c,0x00,0x01,0x04,0x16,0xfe,0x5c,0x00,0x01,0x09,0xbc,0x08,0x34,0x00,0x01,0x09,0xbc,0xfe,0x5c,0x00,0x01,0x08,0xef,0x07,0x6c,0x00,0x01,0x08,0xef,0xfe,0x5c,0x00,0x01, -0x08,0x05,0x07,0x6c,0x00,0x01,0x08,0x05,0xfe,0x5c,0x00,0x01,0x06,0x29,0x07,0x6c,0x00,0x01,0x06,0x29,0xfe,0x5c,0x00,0x01,0x05,0x39,0x07,0x6c,0x00,0x01,0x05,0x39,0xfe,0x5c,0x00,0x01,0x03,0x77,0x07,0x6c,0x00,0x01,0x03,0x77,0xfe,0x5c,0x00,0x01,0x07,0xe4,0x07,0x6c,0x00,0x01,0x07,0xe4,0xfe,0x5c,0x00,0x01,0x07,0x34,0x07,0x6c, -0x00,0x01,0x07,0x34,0xfe,0x5c,0x00,0x01,0x05,0xed,0x07,0x6c,0x00,0x01,0x05,0xed,0xfe,0x5c,0x00,0x01,0x03,0x7b,0x07,0x6c,0x00,0x01,0x03,0x7b,0xfe,0x5c,0x00,0x01,0x02,0x29,0x08,0x34,0x00,0x01,0x02,0x29,0xfe,0x5c,0x00,0x01,0x02,0x11,0x07,0x6c,0x00,0x01,0x02,0x11,0xfe,0x5c,0x00,0x01,0x06,0x83,0x08,0x34,0x00,0x01,0x06,0x4e, -0x07,0x6c,0x00,0x01,0x06,0x4e,0xfe,0x5c,0x00,0x01,0x05,0x7d,0x07,0x6c,0x00,0x01,0x05,0x7d,0xfe,0x5c,0x00,0x01,0x04,0xb6,0x07,0x6c,0x00,0x01,0x04,0xb6,0xfe,0x5c,0x00,0x01,0x04,0x83,0x08,0x34,0x00,0x01,0x03,0x68,0x07,0x6c,0x00,0x01,0x03,0x68,0xfe,0x5c,0x00,0x01,0x09,0xbc,0x07,0x6c,0x00,0x01,0x08,0xf0,0x07,0x6c,0x00,0x01, -0x08,0xf0,0xfe,0x5c,0x00,0x01,0x08,0x06,0x07,0x6c,0x00,0x01,0x08,0x06,0xfe,0x5c,0x00,0x01,0x07,0x79,0x07,0x6c,0x00,0x01,0x07,0x79,0xfe,0x5c,0x00,0x01,0x05,0x27,0x07,0x6c,0x00,0x01,0x05,0x27,0xfe,0x5c,0x00,0x01,0x01,0xb6,0x07,0x6c,0x00,0x01,0x01,0xb6,0xfe,0x5c,0x00,0x01,0x02,0x28,0x08,0x34,0x00,0x01,0x02,0x28,0xfe,0x5c, -0x00,0x01,0x02,0x0a,0x07,0x6c,0x00,0x01,0x02,0x0a,0xfe,0x5c,0x00,0x01,0x02,0xca,0x07,0x6c,0x00,0x01,0x02,0xca,0xfe,0x5c,0x00,0x01,0x03,0x3e,0x07,0x6c,0x00,0x01,0x03,0x3e,0xfe,0x5c,0x00,0x01,0x04,0x42,0x07,0x6c,0x00,0x01,0x04,0x42,0xfe,0x5c,0x00,0x01,0x03,0x9e,0x07,0x6c,0x00,0x01,0x03,0x9e,0xfe,0x5c,0x00,0x01,0x04,0x56, -0x07,0x6c,0x00,0x01,0x04,0x56,0xfe,0x5c,0x00,0x01,0x03,0x5a,0x07,0x6c,0x00,0x01,0x03,0x5a,0xfe,0x5c,0x00,0x01,0x03,0xa0,0x07,0x6c,0x00,0x01,0x03,0xa0,0xfe,0x5c,0x00,0x01,0x05,0x21,0x07,0x6c,0x00,0x01,0x05,0x21,0xfe,0x5c,0x00,0x01,0x05,0x16,0x07,0x6c,0x00,0x01,0x05,0x16,0xfe,0x5c,0x00,0x01,0x02,0xf4,0x07,0x6c,0x00,0x01, -0x02,0xf4,0xfe,0x5c,0x00,0x01,0x02,0xee,0x07,0x6c,0x00,0x01,0x02,0xee,0xfe,0x5c,0x00,0x01,0x04,0x35,0x07,0x6c,0x00,0x01,0x04,0x35,0xfe,0x5c,0x00,0x01,0x02,0x1c,0x07,0x6c,0x00,0x01,0x02,0x1c,0xfe,0x5c,0x00,0x01,0x03,0xcd,0x07,0x6c,0x00,0x01,0x03,0xcd,0xfe,0x5c,0x00,0x01,0x03,0xc6,0x07,0x6c,0x00,0x01,0x03,0xc6,0xfe,0x5c, -0x00,0x01,0x02,0x0e,0x07,0x6c,0x00,0x01,0x02,0x0e,0xfe,0x5c,0x00,0x01,0x02,0x2f,0x07,0x6c,0x00,0x01,0x02,0x2f,0xfe,0x5c,0x00,0x01,0x02,0x44,0x07,0x6c,0x00,0x01,0x02,0x44,0xfe,0x5c,0x00,0x01,0x02,0x52,0x07,0x6c,0x00,0x01,0x02,0x52,0xfe,0x5c,0x00,0x01,0x02,0x5a,0x07,0x6c,0x00,0x01,0x02,0x5a,0xfe,0x5c,0x00,0x01,0x04,0xb2, -0x07,0x6c,0x00,0x01,0x04,0xb2,0xfe,0x5c,0x00,0x01,0x05,0x08,0x07,0x6c,0x00,0x01,0x05,0x08,0xfe,0x5c,0x00,0x01,0x04,0x0a,0x07,0x6c,0x00,0x01,0x04,0x0a,0xfe,0x5c,0x00,0x01,0x05,0x60,0x07,0x6c,0x00,0x01,0x05,0x60,0xfe,0x5c,0x00,0x01,0x05,0x64,0x07,0x6c,0x00,0x01,0x05,0x64,0xfe,0x5c,0x00,0x01,0x04,0xba,0x07,0x6c,0x00,0x01, -0x04,0xba,0xfe,0x5c,0x00,0x01,0x02,0x23,0x07,0x6c,0x00,0x01,0x03,0x33,0x07,0x6c,0x00,0x01,0x03,0x33,0xfe,0x5c,0x00,0x01,0x02,0xa2,0x07,0x6c,0x00,0x01,0x02,0xa2,0xfe,0x5c,0x00,0x01,0x02,0x1e,0x07,0x6c,0x00,0x01,0x02,0x1e,0xfe,0x5c,0x00,0x01,0x02,0xdb,0x07,0x6c,0x00,0x01,0x02,0xdb,0xfe,0x5c,0x00,0x01,0x02,0x68,0x07,0x6c, -0x00,0x01,0x02,0x68,0xfe,0x5c,0x00,0x01,0x02,0x72,0x07,0x6c,0x00,0x01,0x02,0x72,0xfe,0x5c,0x00,0x01,0x02,0x48,0x07,0x6c,0x00,0x01,0x02,0x48,0xfe,0x5c,0x00,0x01,0x02,0x8e,0x07,0x6c,0x00,0x01,0x02,0x8e,0xfe,0x5c,0x00,0x01,0x04,0xa4,0x07,0x6c,0x00,0x01,0x04,0xa4,0xfe,0x5c,0x00,0x01,0x03,0xd1,0x07,0x6c,0x00,0x01,0x03,0xd1, -0xfe,0x5c,0x00,0x01,0x03,0x4c,0x07,0x6c,0x00,0x01,0x03,0x4c,0xfe,0x5c,0x00,0x01,0x03,0xfe,0x07,0x6c,0x00,0x01,0x03,0xfe,0xfe,0x5c,0x00,0x01,0x04,0x25,0x07,0x6c,0x00,0x01,0x04,0x25,0xfe,0x5c,0x00,0x01,0x03,0x8c,0x07,0x6c,0x00,0x01,0x03,0x8c,0xfe,0x5c,0x00,0x01,0x02,0xe8,0x07,0x6c,0x00,0x01,0x02,0xe8,0xfe,0x5c,0x00,0x01, -0x02,0xcf,0x07,0x6c,0x00,0x01,0x02,0xcf,0xfe,0x5c,0x00,0x01,0x02,0xcb,0x07,0x6c,0x00,0x01,0x02,0xcb,0xfe,0x5c,0x00,0x01,0x03,0x60,0x07,0x6c,0x00,0x01,0x03,0x60,0xfe,0x5c,0x00,0x01,0x04,0x92,0x07,0x6c,0x00,0x01,0x04,0x92,0xfe,0x5c,0x00,0x01,0x03,0x7f,0x07,0x6c,0x00,0x01,0x03,0x7f,0xfe,0x5c,0x00,0x01,0x04,0x02,0x07,0x6c, -0x00,0x01,0x04,0x02,0xfe,0x5c,0x00,0x01,0x02,0x38,0x07,0x6c,0x00,0x01,0x03,0x56,0x07,0x6c,0x00,0x01,0x03,0x56,0xfe,0x5c,0x00,0x01,0x02,0xf8,0x07,0x6c,0x00,0x01,0x02,0xf8,0xfe,0x5c,0x00,0x01,0x07,0x27,0x07,0x6c,0x00,0x01,0x07,0x27,0xfe,0x5c,0x00,0x01,0x07,0x77,0x07,0x6c,0x00,0x01,0x07,0x77,0xfe,0x5c,0x00,0x01,0x07,0xdb, -0x07,0x6c,0x00,0x01,0x07,0xdb,0xfe,0x5c,0x00,0x01,0x04,0x94,0x07,0x6c,0x00,0x01,0x04,0x94,0xfe,0x5c,0x00,0x01,0x04,0x3e,0x07,0x6c,0x00,0x01,0x04,0x3e,0xfe,0x5c,0x00,0x01,0x05,0xc8,0x07,0x6c,0x00,0x01,0x05,0xc8,0xfe,0x5c,0x00,0x01,0x03,0xc2,0x07,0x6c,0x00,0x01,0x03,0xc2,0xfe,0x5c,0x00,0x01,0x06,0x1c,0x07,0x6c,0x00,0x01, -0x06,0x1c,0xfe,0x5c,0x00,0x01,0x06,0x04,0x07,0x6c,0x00,0x01,0x06,0x04,0xfe,0x5c,0x00,0x01,0x07,0x1a,0x07,0x6c,0x00,0x01,0x07,0x1a,0xfe,0x5c,0x00,0x01,0x04,0xf0,0x07,0x6c,0x00,0x01,0x04,0xf0,0xfe,0x5c,0x00,0x01,0x04,0x0b,0x07,0x6c,0x00,0x01,0x04,0x0b,0xfe,0x5c,0x00,0x01,0x04,0xc9,0x07,0x6c,0x00,0x01,0x04,0xc9,0xfe,0x5c, -0x00,0x01,0x03,0xf6,0x07,0x6c,0x00,0x01,0x03,0xf6,0xfe,0x5c,0x00,0x01,0x04,0xff,0x07,0x6c,0x00,0x01,0x04,0xff,0xfe,0x5c,0x00,0x01,0x04,0xdc,0x07,0x6c,0x00,0x01,0x04,0xdc,0xfe,0x5c,0x00,0x01,0x03,0xac,0x07,0x6c,0x00,0x01,0x03,0xac,0xfe,0x5c,0x00,0x01,0x03,0x37,0x07,0x6c,0x00,0x01,0x03,0x37,0xfe,0x5c,0x00,0x01,0x04,0x3f, -0x07,0x6c,0x00,0x01,0x04,0x3f,0xfe,0x5c,0x00,0x01,0x06,0xae,0x07,0x6c,0x00,0x01,0x06,0xae,0xfe,0x5c,0x00,0x01,0x02,0x46,0x07,0x6c,0x00,0x01,0x02,0x46,0xfe,0x5c,0x00,0x01,0x02,0x08,0x07,0x6c,0x00,0x01,0x02,0x08,0xfe,0x5c,0x00,0x01,0x04,0x24,0x07,0x6c,0x00,0x01,0x04,0x24,0xfe,0x5c,0x00,0x01,0x04,0xae,0x07,0x6c,0x00,0x01, -0x04,0xae,0xfe,0x5c,0x00,0x01,0x05,0xfc,0x07,0x6c,0x00,0x01,0x05,0xfc,0xfe,0x5c,0x00,0x01,0x03,0xf9,0x07,0x6c,0x00,0x01,0x03,0xf9,0xfe,0x5c,0x00,0x01,0x01,0xe3,0x07,0x6c,0x00,0x01,0x01,0xe3,0xfe,0x5c,0x00,0x01,0x06,0xed,0x07,0x6c,0x00,0x01,0x06,0xed,0xfe,0x5c,0x00,0x01,0x04,0x91,0x07,0x6c,0x00,0x01,0x04,0x91,0xfe,0x5c, -0x00,0x01,0x03,0xad,0x07,0x6c,0x00,0x01,0x03,0xad,0xfe,0x5c,0x00,0x01,0x03,0x4b,0x07,0x6c,0x00,0x01,0x03,0x4b,0xfe,0x5c,0x00,0x01,0x04,0x06,0x07,0x6c,0x00,0x01,0x04,0x06,0xfe,0x5c,0x00,0x01,0x04,0x71,0x07,0x6c,0x00,0x01,0x04,0x71,0xfe,0x5c,0x00,0x01,0x04,0xfe,0x07,0x6c,0x00,0x01,0x04,0xfe,0xfe,0x5c,0x00,0x01,0x04,0x84, -0x07,0x6c,0x00,0x01,0x04,0x84,0xfe,0x5c,0x00,0x01,0x03,0x3b,0x07,0x6c,0x00,0x01,0x03,0x3b,0xfe,0x5c,0x00,0x01,0x05,0xe0,0x07,0x6c,0x00,0x01,0x05,0xe0,0xfe,0x5c,0x00,0x01,0x02,0xd1,0x07,0x6c,0x00,0x01,0x02,0xd1,0xfe,0x5c,0x00,0x01,0x04,0xd0,0x07,0x6c,0x00,0x01,0x04,0xd0,0xfe,0x5c,0x00,0x01,0x04,0xc1,0x07,0x6c,0x00,0x01, -0x04,0xc1,0xfe,0x5c,0x00,0x01,0x05,0x7f,0x07,0x6c,0x00,0x01,0x05,0x7f,0xfe,0x5c,0x00,0x01,0x05,0x07,0x07,0x6c,0x00,0x01,0x05,0x07,0xfe,0x5c,0x00,0x01,0x06,0x01,0x07,0x6c,0x00,0x01,0x06,0x01,0xfe,0x5c,0x00,0x01,0x02,0xc8,0x07,0x6c,0x00,0x01,0x02,0xc8,0xfe,0x5c,0x00,0x01,0x04,0x6c,0x07,0x6c,0x00,0x01,0x04,0x6c,0xfe,0x5c, -0x00,0x01,0x03,0x9c,0x07,0x6c,0x00,0x01,0x03,0x9c,0xfe,0x5c,0x00,0x01,0x03,0xc4,0x07,0x6c,0x00,0x01,0x03,0xc4,0xfe,0x5c,0x00,0x01,0x02,0x4a,0x07,0x6c,0x00,0x01,0x02,0x4a,0xfe,0x5c,0x00,0x01,0x04,0x19,0x07,0x6c,0x00,0x01,0x04,0x19,0xfe,0x5c,0x00,0x01,0x04,0x12,0x07,0x6c,0x00,0x01,0x04,0x12,0xfe,0x5c,0x00,0x01,0x02,0xb6, -0x07,0x6c,0x00,0x01,0x02,0xb6,0xfe,0x5c,0x00,0x01,0x04,0x8d,0x07,0x6c,0x00,0x01,0x04,0x8d,0xfe,0x5c,0x00,0x01,0x05,0x98,0x07,0x6c,0x00,0x01,0x05,0x98,0xfe,0x5c,0x00,0x01,0xff,0x9c,0x05,0x14,0x00,0x01,0x03,0x34,0x05,0x9a,0x00,0x01,0x03,0xf6,0x04,0xfa,0x00,0x01,0x04,0x81,0x05,0x79,0x00,0x01,0x04,0xb0,0x04,0xfa,0x00,0x01, -0x03,0x70,0x05,0x9a,0x00,0x01,0x04,0xd4,0x05,0x69,0x00,0x01,0x05,0x0e,0x05,0x9a,0x00,0x01,0x01,0xfe,0x05,0x9a,0x00,0x01,0x02,0x3b,0x05,0x9a,0x00,0x01,0x04,0x04,0x05,0x9a,0x00,0x01,0x01,0x42,0x05,0x9a,0x00,0x01,0x06,0xae,0x05,0x9a,0x00,0x01,0x05,0x5c,0x05,0x9a,0x00,0x01,0x04,0xd8,0x05,0x28,0x00,0x01,0x03,0xdb,0x04,0xfa, -0x00,0x01,0x04,0x29,0x04,0xfa,0x00,0x01,0x03,0xa0,0x05,0x94,0x00,0x01,0x04,0x06,0x05,0xa3,0x00,0x01,0x04,0xda,0x05,0x9f,0x00,0x01,0x04,0xa9,0x05,0x9a,0x00,0x01,0x07,0x58,0x05,0x9a,0x00,0x01,0x03,0x20,0x03,0xf1,0x00,0x01,0x04,0x14,0x03,0xb6,0x00,0x01,0x03,0x59,0x03,0xf1,0x00,0x01,0x04,0x04,0x05,0xf2,0x00,0x01,0x03,0x71, -0x03,0xcd,0x00,0x01,0x02,0x9e,0x06,0x02,0x00,0x01,0x04,0x0d,0x04,0x04,0x00,0x01,0x03,0xd5,0x03,0xaa,0x00,0x01,0x01,0x59,0x04,0x01,0x00,0x01,0x01,0x50,0x04,0x01,0x00,0x01,0x03,0xb4,0x04,0x0b,0x00,0x01,0x01,0x67,0x05,0xf2,0x00,0x01,0x06,0x44,0x03,0x78,0x00,0x01,0x03,0xe7,0x03,0x78,0x00,0x01,0x03,0xde,0x03,0x84,0x00,0x01, -0x04,0x14,0x03,0x87,0x00,0x01,0x04,0x04,0x04,0x03,0x00,0x01,0x02,0xc1,0x04,0x02,0x00,0x01,0x02,0xe0,0x03,0xf3,0x00,0x01,0x02,0x70,0x04,0x03,0x00,0x01,0x03,0xd4,0x03,0xfc,0x00,0x01,0x03,0xb3,0x04,0x00,0x00,0x01,0x05,0xa6,0x04,0x00,0x00,0x01,0x03,0x6f,0x04,0x00,0x00,0x01,0x03,0xb4,0x04,0x0c,0x00,0x01,0x03,0x34,0x04,0x00, -0x00,0x01,0x02,0x94,0xff,0xce,0x00,0x01,0x02,0xde,0xff,0xf1,0x00,0x01,0x02,0x52,0xff,0xce,0x00,0x01,0x02,0xfe,0xff,0xce,0x00,0x01,0x03,0x04,0xff,0xf1,0x00,0x01,0x02,0x64,0xff,0xce,0x00,0x01,0x02,0x20,0xff,0xf1,0x00,0x01,0x02,0xbf,0xff,0xf1,0x00,0x01,0x02,0x3a,0xff,0xf1,0x00,0x01,0x02,0x2b,0xff,0xf1,0x00,0x01,0x02,0x44, -0xfe,0x3e,0x00,0x01,0x00,0xfa,0x00,0x14,0x00,0x01,0x01,0xfd,0xff,0xce,0x00,0x01,0x00,0xfa,0x00,0x00,0x00,0x01,0x02,0x43,0xff,0xce,0x00,0x01,0x00,0xf6,0x00,0x00,0x00,0x01,0x01,0xa8,0xff,0xf1,0x00,0x01,0x01,0xbf,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf6,0x00,0x01,0x04,0x65,0x00,0x00,0x00,0x01,0x02,0x58,0x00,0x00,0x00,0x01, -0x03,0x5c,0xff,0xf1,0x00,0x01,0x00,0xe6,0x00,0x00,0x00,0x01,0x03,0xa7,0x00,0x00,0x00,0x01,0x04,0x4c,0x00,0x00,0x00,0x01,0x00,0xc8,0x00,0x00,0x00,0x01,0x03,0xca,0x00,0x00,0x00,0x01,0x02,0xda,0x00,0x00,0x00,0x01,0x05,0xd2,0x00,0x00,0x00,0x01,0x04,0x88,0x00,0x00,0x00,0x01,0x03,0x3e,0xff,0xf1,0x00,0x01,0x03,0x70,0xff,0x4c, -0x00,0x01,0x04,0x10,0x00,0x00,0x00,0x01,0x02,0x62,0x00,0x00,0x00,0x01,0x01,0xcc,0x00,0x00,0x00,0x01,0x05,0x19,0x00,0x00,0x00,0x01,0x01,0xf4,0x00,0x00,0x00,0x01,0x03,0x8e,0x00,0x00,0x00,0x01,0x02,0xc6,0x00,0x00,0x00,0x01,0x02,0x94,0x00,0x00,0x00,0x01,0x03,0x66,0x00,0x00,0x00,0x01,0x02,0xd2,0xfe,0x70,0x00,0x01,0x03,0x5c, -0x00,0x00,0x00,0x01,0x00,0x32,0xfe,0x5c,0x00,0x01,0x03,0x16,0x00,0x00,0x00,0x01,0x05,0xaa,0x00,0x00,0x00,0x01,0x00,0xaa,0xfe,0x20,0x00,0x01,0x03,0x70,0xfe,0x20,0x00,0x01,0x01,0xb8,0xff,0xf1,0x00,0x01,0x03,0x3e,0x00,0x00,0x00,0x01,0x01,0xa4,0x00,0x00,0x00,0x01,0x03,0xde,0x00,0x00,0x00,0x01,0x02,0xd0,0x00,0x00,0x00,0x01, -0x00,0xdc,0xfe,0x48,0x00,0x01,0x02,0xf8,0xfe,0x70,0x00,0x01,0x04,0x6a,0x00,0x00,0x00,0x01,0x02,0x44,0xfe,0x70,0x00,0x01,0x05,0x80,0x00,0x27,0x00,0x01,0x00,0xf1,0xff,0x0e,0x00,0x01,0x06,0x4a,0x00,0x00,0x00,0x01,0x05,0xf0,0x00,0x00,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x02,0xf0,0x00,0x1b,0x00,0x01,0x02,0x9a,0x00,0x09, -0x00,0x01,0x00,0xaa,0xfe,0x2a,0x00,0x01,0x02,0x3a,0xfe,0x70,0x00,0x01,0x01,0xcc,0xfe,0x70,0x00,0x01,0x04,0x4c,0xfe,0x84,0x00,0x01,0x02,0xe4,0xfe,0x84,0x00,0x01,0x02,0x76,0xfe,0x84,0x00,0x01,0x01,0xb8,0xfe,0x5c,0x00,0x01,0x02,0xeb,0x00,0x03,0x00,0x01,0x02,0x4e,0xfe,0x5c,0x00,0x01,0x03,0xb2,0x00,0x00,0x00,0x01,0x02,0x76, -0xfe,0x99,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x84,0x00,0x01,0x01,0x18,0xfe,0x70,0x00,0x01,0x03,0xd6,0xfe,0x5c,0x00,0x01,0x02,0xa3,0xfe,0x5c,0x00,0x01,0x03,0x66,0xfe,0x84,0x00,0x01,0x03,0x20,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x3f,0x00,0x01,0x00,0xfd,0xfe,0xee,0x00,0x01,0x00,0xdc,0xfe,0xdc,0x00,0x01, -0x02,0xed,0xfe,0xec,0x00,0x01,0x02,0x4d,0xfe,0xfb,0x00,0x01,0x02,0xdb,0xfe,0xec,0x00,0x01,0x02,0x44,0xfe,0xf2,0x00,0x01,0x02,0xf6,0xfe,0xf5,0x00,0x01,0x02,0x3b,0xfe,0xf2,0x00,0x01,0x02,0xab,0xfe,0xfb,0x00,0x01,0x02,0x99,0xfe,0xf2,0x00,0x01,0x02,0x0f,0xfe,0xe5,0x00,0x01,0x01,0x00,0xfe,0x67,0x00,0x01,0x01,0x86,0xfe,0x98, -0x00,0x01,0x01,0x18,0xfe,0x98,0x00,0x01,0x02,0x17,0xfe,0x5c,0x00,0x01,0x02,0x08,0xfe,0xd4,0x00,0x01,0x02,0x48,0xfe,0xd4,0x00,0x01,0x02,0x2a,0xff,0x24,0x00,0x01,0x02,0x63,0xff,0x24,0x00,0x01,0x02,0x26,0xfe,0x5c,0x00,0x01,0x02,0x72,0xfe,0xd4,0x00,0x01,0x02,0x60,0xff,0x24,0x00,0x01,0x02,0x3d,0xff,0x24,0x00,0x01,0x02,0x3e, -0xfe,0x92,0x00,0x01,0x02,0x9e,0xfe,0x48,0x00,0x01,0x02,0x35,0xfe,0x48,0x00,0x01,0x02,0x2a,0xfe,0xd4,0x00,0x01,0x02,0x4e,0xfe,0xd4,0x00,0x01,0x02,0x2a,0xfe,0x5c,0x00,0x01,0x02,0xe4,0xfe,0xa2,0x00,0x01,0x02,0x76,0xfe,0xa2,0x00,0x01,0x01,0x22,0xfe,0xd4,0x00,0x01,0x00,0xf0,0xfe,0xd4,0x00,0x01,0x03,0x7a,0x00,0x00,0x00,0x01, -0x04,0x3f,0x00,0x00,0x00,0x01,0x02,0x23,0xff,0x24,0x00,0x01,0x00,0xd2,0xfe,0xd4,0x00,0x01,0x00,0xc8,0xfe,0xd4,0x00,0x01,0x02,0x1c,0xff,0x24,0x00,0x01,0x02,0x17,0xfe,0x48,0x00,0x01,0x00,0xe6,0xfe,0x48,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x02,0xf3,0xff,0x24,0x00,0x01,0x02,0x44,0xfe,0x48,0x00,0x01,0x00,0xb4,0xfe,0x20, -0x00,0x01,0x02,0x84,0xff,0x24,0x00,0x01,0x01,0x9e,0xff,0x24,0x00,0x01,0x01,0xf9,0xfe,0xd4,0x00,0x01,0x01,0x9a,0xfe,0xd4,0x00,0x01,0x02,0x2b,0xfe,0xd4,0x00,0x01,0x01,0xa9,0xfe,0xd4,0x00,0x01,0x01,0xf4,0xfe,0xd4,0x00,0x01,0x01,0x3b,0xfe,0xd4,0x00,0x01,0x01,0xf0,0xff,0x24,0x00,0x01,0x01,0x82,0xff,0x24,0x00,0x01,0x02,0x12, -0xfe,0x48,0x00,0x01,0x01,0x54,0xfe,0x48,0x00,0x01,0x02,0xb2,0xfe,0xac,0x00,0x01,0x02,0x1c,0xfe,0xac,0x00,0x01,0x02,0xb4,0xfe,0xd4,0x00,0x01,0x02,0x4b,0xfe,0xd4,0x00,0x01,0x04,0x1a,0x00,0x00,0x00,0x01,0x02,0x26,0xfe,0xd4,0x00,0x01,0x01,0xae,0xfe,0xd4,0x00,0x01,0x02,0x3a,0xff,0x24,0x00,0x01,0x01,0xc2,0xff,0x24,0x00,0x01, -0x02,0x9c,0x00,0x00,0x00,0x01,0x02,0x0d,0x00,0x00,0x00,0x01,0x01,0xd7,0xff,0xf1,0x00,0x01,0x02,0x7d,0xff,0xf1,0x00,0x01,0x03,0x54,0x00,0x00,0x00,0x01,0x03,0x74,0x00,0x00,0x00,0x01,0x02,0xe4,0xfe,0x70,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x01,0x02,0xca,0x00,0x00,0x00,0x01,0x00,0x5c,0xfe,0xb6,0x00,0x01,0x05,0x00,0x00,0x00, -0x00,0x01,0x01,0x54,0xff,0xf1,0x00,0x01,0x03,0x52,0xfe,0x70,0x00,0x01,0x06,0x72,0x00,0x00,0x00,0x01,0x05,0x0a,0x00,0x00,0x00,0x01,0x01,0x25,0x00,0x00,0x00,0x01,0x00,0xb9,0xfe,0x2a,0x00,0x01,0x03,0x98,0xff,0x74,0x00,0x01,0x02,0x08,0x00,0x00,0x00,0x01,0x01,0xe4,0xfe,0x2a,0x00,0x01,0x01,0x78,0xfe,0xab,0x00,0x01,0x02,0xe8, -0xfe,0x9b,0x00,0x01,0x03,0x39,0xff,0xf1,0x00,0x01,0x02,0xe9,0xff,0xfa,0x00,0x01,0x02,0x58,0xfe,0x3a,0x00,0x01,0x03,0x66,0xfe,0x2f,0x00,0x01,0x01,0x90,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x00,0x00,0x01,0x08,0xde,0x00,0x00,0x00,0x01,0x08,0x20,0x00,0x00,0x00,0x01,0x07,0x30,0x00,0x00,0x00,0x01,0x04,0xce,0x00,0x00,0x00,0x01, -0x06,0x86,0x00,0x00,0x00,0x01,0x05,0xfa,0xfe,0x5c,0x00,0x01,0x04,0xb0,0xfe,0x5c,0x00,0x01,0x05,0xa2,0x00,0x00,0x00,0x01,0x05,0x14,0x00,0x00,0x00,0x01,0x02,0xda,0xfe,0x84,0x00,0x01,0x02,0x3a,0xfe,0x84,0x00,0x01,0x01,0xcc,0xfe,0x48,0x00,0x01,0x06,0x18,0x00,0x00,0x00,0x01,0x00,0xbe,0xfe,0x2a,0x00,0x01,0x04,0x88,0xfe,0x2a, -0x00,0x01,0x02,0x66,0x00,0x00,0x00,0x01,0x03,0x70,0x00,0x00,0x00,0x01,0x01,0xa5,0xff,0xf7,0x00,0x01,0x04,0x4c,0xfe,0x2a,0x00,0x01,0x02,0x22,0x00,0x00,0x00,0x01,0x01,0xb6,0x00,0x00,0x00,0x01,0x02,0xc2,0x00,0x00,0x00,0x01,0x00,0x8c,0xfe,0x75,0x00,0x01,0x01,0xd8,0xfe,0x5c,0x00,0x01,0x01,0xd4,0x00,0x00,0x00,0x01,0x03,0x47, -0xfe,0x2a,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x01,0x48,0x00,0x00,0x00,0x01,0x03,0x0c,0xfe,0x48,0x00,0x01,0x05,0xa4,0x00,0x00,0x00,0x01,0x05,0xa4,0xfe,0x2a,0x00,0x01,0x04,0xff,0xfe,0x35,0x00,0x01,0x04,0x3d,0xfe,0x2a,0x00,0x01,0x04,0x9c,0x00,0x00,0x00,0x01,0x01,0x91,0x00,0x00,0x00,0x01,0x01,0x88,0x00,0x00,0x00,0x01, -0x01,0x84,0x00,0x09,0x00,0x01,0x02,0xde,0x00,0x09,0x00,0x01,0x01,0x8d,0xfe,0xe0,0x00,0x01,0x00,0x91,0xfe,0x7e,0x00,0x01,0x00,0x8a,0xfe,0x63,0x00,0x01,0x00,0xa4,0xfe,0x5c,0x00,0x01,0x01,0x5c,0xfe,0xfb,0x00,0x01,0x02,0x76,0x00,0x00,0x00,0x01,0x01,0x6c,0x00,0x09,0x00,0x01,0x03,0x52,0xff,0x06,0x00,0x01,0x01,0xc2,0xfe,0x41, -0x00,0x01,0x01,0xc2,0xfe,0x4a,0x00,0x01,0x01,0x5b,0x00,0x00,0x00,0x01,0x01,0x47,0x00,0x00,0x00,0x01,0x02,0x7d,0xfe,0x48,0x00,0x01,0x02,0xa5,0xff,0xfa,0x00,0x01,0x00,0x43,0xfe,0x41,0x00,0x01,0x02,0xbc,0xfe,0x16,0x00,0x01,0x03,0x76,0xfe,0x2a,0x00,0x01,0x01,0x64,0x00,0x00,0x00,0x01,0x06,0x5e,0x00,0x00,0x00,0x01,0x05,0xb4, -0xfe,0x36,0x00,0x01,0x02,0x14,0xfe,0x4a,0x00,0x01,0x04,0xb0,0x00,0x00,0x00,0x01,0x04,0xb0,0xfe,0x48,0x00,0x01,0x03,0x02,0x00,0x00,0x00,0x01,0x01,0xf4,0xfe,0x5c,0x00,0x01,0x04,0x9c,0xfe,0x5c,0x00,0x01,0x03,0x84,0xfe,0x2a,0x00,0x01,0x05,0x82,0x00,0x00,0x00,0x01,0x03,0x7a,0xfe,0x20,0x00,0x01,0x02,0x1f,0xfe,0xd4,0x00,0x01, -0x02,0x9e,0xfe,0x2a,0x00,0x01,0x02,0xd0,0x01,0xf6,0x00,0x01,0x06,0x1a,0x00,0x00,0x00,0x01,0x01,0x22,0x00,0x00,0x00,0x01,0x02,0x6c,0x00,0x00,0x00,0x01,0x02,0xd0,0xfe,0xa2,0x00,0x01,0x03,0x98,0xfe,0xa2,0x00,0x01,0x02,0xee,0xfe,0xa2,0x00,0x01,0x00,0xd2,0xfe,0xa2,0x00,0x01,0x05,0xdc,0xfe,0xa2,0x00,0x01,0x03,0x84,0xfe,0xa2, -0x00,0x01,0x02,0x80,0xfe,0xa2,0x00,0x01,0x03,0xa2,0xfe,0xa2,0x00,0x01,0x04,0x2e,0xfe,0xa2,0x00,0x01,0x04,0x38,0xfe,0xa2,0x00,0x01,0x03,0xb6,0xfe,0xc0,0x00,0x01,0x03,0x52,0xfe,0xa2,0x00,0x01,0x02,0x7f,0x00,0x46,0x00,0x01,0x03,0xfc,0xfe,0xa2,0x00,0x01,0x04,0x21,0x00,0x00,0x00,0x01,0x00,0xe6,0x00,0x8c,0x00,0x01,0x04,0x42, -0x00,0x00,0x00,0x01,0x05,0xbe,0xfe,0xa2,0x00,0x01,0x04,0xba,0xfe,0xa2,0x00,0x01,0x00,0xc8,0xfe,0x48,0x00,0x01,0x03,0xa2,0x00,0x0f,0x00,0x01,0x00,0x8c,0x00,0x1e,0x00,0x01,0xff,0x6a,0x00,0x1e,0x00,0x01,0x03,0x4a,0x00,0x50,0x00,0x01,0x02,0xd5,0x00,0x1a,0x00,0x01,0x03,0xbc,0x00,0x09,0x00,0x01,0x03,0xbc,0x00,0x00,0x00,0x01, -0x01,0x40,0x00,0x00,0x00,0x01,0x03,0x3a,0xfe,0x93,0x00,0x01,0x03,0x48,0xfe,0xc0,0x00,0x01,0x03,0xa8,0x00,0x00,0x00,0x01,0x00,0x83,0xfe,0x89,0x00,0x01,0x03,0x5a,0x00,0x00,0x00,0x01,0x05,0xfc,0x00,0x00,0x00,0x01,0x03,0xa2,0x00,0x09,0x00,0x01,0x03,0x5c,0x00,0x3f,0x00,0x01,0x03,0xb3,0xfe,0x42,0x00,0x01,0x00,0xf8,0x00,0x00, -0x00,0x01,0x02,0x60,0x00,0x50,0x00,0x01,0x01,0xea,0x00,0x00,0x00,0x01,0x04,0x27,0x00,0x09,0x00,0x01,0x04,0x27,0x00,0x00,0x00,0x01,0x03,0x07,0xff,0xf7,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x01,0x02,0x58,0x06,0xea,0x00,0x01,0xff,0x6f,0x06,0xea,0x00,0x01,0x00,0xaa,0x06,0x40,0x00,0x01,0xff,0x7e,0x06,0x40,0x00,0x01,0x05,0x29, -0x08,0x34,0x00,0x01,0x00,0x00,0x08,0x34,0x00,0x01,0x04,0x96,0x08,0x34,0x00,0x01,0x04,0xf4,0x08,0x34,0x00,0x01,0x05,0x9c,0x08,0x34,0x00,0x01,0x03,0xe8,0x08,0x34,0x00,0x01,0x05,0x7d,0x08,0x34,0x00,0x01,0x05,0xae,0x08,0x34,0x00,0x01,0x02,0x21,0x08,0x34,0x00,0x01,0x02,0xdb,0x08,0x34,0x00,0x01,0x04,0xa4,0x08,0x34,0x00,0x01, -0x03,0xc4,0x08,0x34,0x00,0x01,0x07,0x2f,0x08,0x34,0x00,0x01,0x05,0xfc,0x08,0x34,0x00,0x01,0x06,0x08,0x08,0x34,0x00,0x01,0x04,0x7b,0x08,0x34,0x00,0x01,0x04,0xc9,0x08,0x34,0x00,0x01,0x04,0x40,0x08,0x34,0x00,0x01,0x04,0x31,0x08,0x34,0x00,0x01,0x05,0x7f,0x08,0x34,0x00,0x01,0x04,0xf8,0x08,0x34,0x00,0x01,0x07,0x79,0x08,0x34, -0x00,0x01,0x04,0xb8,0x08,0x34,0x00,0x01,0x04,0x6c,0x08,0x34,0x00,0x01,0x04,0x90,0x08,0x34,0x00,0x01,0x04,0x12,0x08,0x34,0x00,0x01,0x04,0xb4,0x08,0x34,0x00,0x01,0x03,0xb2,0x08,0x34,0x00,0x01,0x04,0xb6,0x08,0x34,0x00,0x01,0x02,0x81,0x08,0x34,0x00,0x01,0x04,0x87,0x08,0x34,0x00,0x01,0x03,0xfa,0x08,0x34,0x00,0x01,0x06,0xe4, -0x08,0x34,0x00,0x01,0x04,0xb0,0x08,0x34,0x00,0x01,0x02,0xc8,0x08,0x34,0x00,0x01,0x03,0x65,0x08,0x34,0x00,0x01,0x02,0xb6,0x08,0x34,0x00,0x01,0x03,0xd5,0x08,0x34,0x00,0x01,0x05,0xc8,0x08,0x34,0x00,0x01,0x03,0xac,0x08,0x34,0x00,0x01,0x03,0xdf,0x08,0x34,0x00,0x01,0x03,0x9e,0x08,0x34,0x00,0x01,0x04,0x5a,0x08,0x34,0x00,0x01, -0x06,0xe2,0x08,0x34,0x00,0x01,0x06,0xa8,0x08,0x34,0x00,0x01,0x07,0x72,0x08,0x34,0x00,0x01,0x07,0x6c,0x08,0x34,0x00,0x01,0x02,0x31,0x08,0x34,0x00,0x01,0x04,0x79,0x08,0x34,0x00,0x01,0x05,0x65,0x08,0x34,0x00,0x01,0x02,0x75,0x08,0x34,0x00,0x01,0x02,0x85,0x08,0x34,0x00,0x01,0x03,0x85,0x08,0x34,0x00,0x01,0x04,0xfc,0x08,0x34, -0x00,0x01,0x03,0xf6,0x08,0x34,0x00,0x01,0x04,0xd9,0x08,0x34,0x00,0x01,0x01,0xee,0x08,0x34,0x00,0x01,0x06,0x1a,0x08,0x34,0x00,0x01,0x04,0xc7,0x08,0x34,0x00,0x01,0x05,0xc4,0x08,0x34,0x00,0x01,0x06,0x8e,0x08,0x34,0x00,0x01,0x04,0xe8,0x08,0x34,0x00,0x01,0x04,0x93,0x08,0x34,0x00,0x01,0x04,0x9e,0x08,0x34,0x00,0x01,0x04,0xf6, -0x08,0x34,0x00,0x01,0x03,0xba,0x08,0x34,0x00,0x01,0x05,0xee,0x08,0x34,0x00,0x01,0x04,0x94,0x08,0x34,0x00,0x01,0x04,0xbc,0x08,0x34,0x00,0x01,0x04,0x0e,0x08,0x34,0x00,0x01,0x04,0x54,0x08,0x34,0x00,0x01,0x05,0x89,0x08,0x34,0x00,0x01,0x06,0xfe,0x08,0x34,0x00,0x01,0x02,0x4e,0x08,0x34,0x00,0x01,0x02,0x3a,0x08,0x34,0x00,0x01, -0x03,0xfc,0x08,0x34,0x00,0x01,0x07,0x23,0x08,0x34,0x00,0x01,0x07,0xc0,0x08,0x34,0x00,0x01,0x06,0x52,0x08,0x34,0x00,0x01,0x04,0xcf,0x08,0x34,0x00,0x01,0x04,0x9c,0x08,0x34,0x00,0x01,0x04,0x21,0x08,0x34,0x00,0x01,0x02,0x5e,0x08,0x34,0x00,0x01,0x02,0xb8,0x08,0x34,0x00,0x01,0x04,0x33,0x08,0x34,0x00,0x01,0x06,0x0a,0x08,0x34, -0x00,0x01,0x05,0xb2,0x08,0x34,0x00,0x01,0x04,0x8e,0x08,0x34,0x00,0x01,0x04,0x23,0x08,0x34,0x00,0x01,0x04,0xe2,0x08,0x34,0x00,0x01,0x03,0x0a,0x08,0x34,0x00,0x01,0x03,0x27,0x08,0x34,0x00,0x01,0x04,0x5e,0x08,0x34,0x00,0x01,0x09,0xe8,0x08,0x34,0x00,0x01,0x09,0x1c,0x08,0x34,0x00,0x01,0x08,0x33,0x08,0x34,0x00,0x01,0x06,0xd9, -0x08,0x34,0x00,0x01,0x05,0xc2,0x08,0x34,0x00,0x01,0x04,0x01,0x08,0x34,0x00,0x01,0x08,0x94,0x08,0x34,0x00,0x01,0x07,0xbe,0x08,0x34,0x00,0x01,0x06,0x77,0x08,0x34,0x00,0x01,0x04,0x0a,0x08,0x34,0x00,0x01,0x06,0xa0,0x08,0x34,0x00,0x01,0x03,0x89,0x08,0x34,0x00,0x01,0x07,0xfe,0x08,0x34,0x00,0x01,0x05,0x83,0x08,0x34,0x00,0x01, -0x04,0x08,0x08,0x34,0x00,0x01,0x03,0x70,0x08,0x34,0x00,0x01,0x05,0xdf,0x08,0x34,0x00,0x01,0x04,0x89,0x08,0x34,0x00,0x01,0x03,0x4e,0x08,0x34,0x00,0x01,0x04,0x68,0x08,0x34,0x00,0x01,0x04,0x3c,0x08,0x34,0x00,0x01,0x03,0xa8,0x08,0x34,0x00,0x01,0x02,0x18,0x08,0x34,0x00,0x01,0x02,0x90,0x08,0x34,0x00,0x01,0x02,0x3e,0x08,0x34, -0x00,0x01,0x03,0x02,0x08,0x34,0x00,0x01,0x04,0xd3,0x08,0x34,0x00,0x01,0x04,0x72,0x08,0x34,0x00,0x01,0x05,0x96,0x08,0x34,0x00,0x01,0x05,0x1a,0x08,0x34,0x00,0x01,0x02,0xae,0x08,0x34,0x00,0x01,0x03,0xa2,0x08,0x34,0x00,0x01,0x03,0x2f,0x08,0x34,0x00,0x01,0x01,0xfa,0x08,0x34,0x00,0x01,0x02,0x10,0x08,0x34,0x00,0x01,0x02,0x44, -0x08,0x34,0x00,0x01,0x04,0xcb,0x08,0x34,0x00,0x01,0x04,0xc2,0x08,0x34,0x00,0x01,0x04,0x77,0x08,0x34,0x00,0x01,0x03,0x56,0x08,0x34,0x00,0x01,0x04,0x18,0x08,0x34,0x00,0x01,0x02,0xec,0x08,0x34,0x00,0x01,0x04,0x62,0x08,0x34,0x00,0x01,0x03,0x14,0x08,0x34,0x00,0x01,0x07,0x54,0x08,0x34,0x00,0x01,0x07,0x98,0x08,0x34,0x00,0x01, -0x07,0xcf,0x08,0x34,0x00,0x01,0x03,0xcf,0x08,0x34,0x00,0x01,0x05,0xbe,0x08,0x34,0x00,0x01,0x06,0x58,0x08,0x34,0x00,0x01,0x03,0xf4,0x08,0x34,0x00,0x01,0x05,0x27,0x08,0x34,0x00,0x01,0x02,0x60,0x08,0x34,0x00,0x01,0x05,0x0e,0x08,0x34,0x00,0x01,0x07,0x7a,0x08,0x34,0x00,0x01,0x04,0x16,0x08,0x34,0x00,0x01,0x03,0xb5,0x08,0x34, -0x00,0x01,0x03,0xb1,0x08,0x34,0x00,0x01,0x04,0x9f,0x08,0x34,0x00,0x01,0x07,0x3d,0x08,0x34,0x00,0x01,0x02,0x22,0x08,0x34,0x00,0x01,0x04,0x46,0x08,0x34,0x00,0x01,0x03,0x76,0x08,0x34,0x00,0x01,0x03,0x81,0x08,0x34,0x00,0x01,0x03,0x91,0x08,0x34,0x00,0x01,0x05,0xe0,0x08,0x34,0x00,0x01,0x04,0xc1,0x08,0x34,0x00,0x01,0x02,0xf4, -0x08,0x34,0x00,0x01,0x05,0x07,0x08,0x34,0x00,0x01,0x06,0x01,0x08,0x34,0x00,0x01,0x03,0x9c,0x08,0x34,0x00,0x01,0x02,0x4a,0x08,0x34,0x00,0x01,0x04,0x19,0x08,0x34,0x00,0x01,0x04,0x8d,0x08,0x34,0x00,0x01,0x05,0x98,0x08,0x34,0x00,0x01,0x01,0x90,0x01,0xfa,0x00,0x01,0x00,0x0c,0x01,0x0e,0x00,0x40,0x00,0x00,0x2b,0xce,0x00,0x00, -0x2b,0xd4,0x00,0x00,0x2b,0xd4,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xe0,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xe6,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xec,0x00,0x00,0x2b,0xec,0x00,0x00,0x2b,0xf2,0x00,0x00,0x2b,0xda,0x00,0x00, -0x2b,0xda,0x00,0x00,0x2b,0xf8,0x00,0x00,0x2b,0xfe,0x00,0x00,0x2c,0x04,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x10,0x00,0x00,0x2b,0xe0,0x00,0x00,0x2c,0x16,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x1c,0x00,0x00,0x2c,0x22,0x00,0x00, -0x2c,0x28,0x00,0x00,0x2c,0x2e,0x00,0x00,0x2c,0x2e,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00, -0x2c,0x3a,0x00,0x00,0x2c,0x40,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x46,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x4c,0x00,0x00,0x2c,0x52,0x00,0x00,0x2c,0x52,0x00,0x00,0x2c,0x58,0x00,0x00,0x2c,0x58,0x00,0x00,0x2c,0x5e,0x00,0x00,0x2c,0x5e,0x00,0x00,0x2c,0x64,0x00,0x40,0x2b,0x68,0x2b,0x6e, -0x2b,0x74,0x2b,0x7a,0x2b,0x80,0x2b,0x86,0x2b,0x8c,0x2b,0x92,0x2b,0x98,0x2b,0x9e,0x2b,0xa4,0x2b,0xaa,0x2b,0xb0,0x2b,0xaa,0x2b,0xaa,0x2b,0xaa,0x2b,0xb6,0x2b,0x92,0x2b,0xbc,0x2b,0xc2,0x2b,0xc2,0x2b,0xb6,0x2b,0xc8,0x2b,0xce,0x2b,0xd4,0x2b,0xda,0x2b,0xe0,0x2b,0xaa,0x2b,0xe6,0x2b,0xec,0x2b,0xf2,0x2b,0xf8,0x2b,0xfe,0x2c,0x04, -0x2c,0x0a,0x2c,0x0a,0x2c,0x10,0x2c,0x10,0x2c,0x16,0x2c,0x10,0x2c,0x10,0x2c,0x10,0x2c,0x1c,0x2c,0x1c,0x2c,0x10,0x2c,0x10,0x2c,0x22,0x2c,0x10,0x2c,0x10,0x2c,0x28,0x2c,0x2e,0x2b,0xb6,0x2c,0x2e,0x2c,0x34,0x2c,0x3a,0x2c,0x3a,0x2b,0x92,0x2c,0x40,0x2c,0x40,0x2c,0x46,0x2c,0x46,0x2c,0x4c,0x2c,0x4c,0x2c,0x52,0x00,0x02,0x00,0x11, -0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79,0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57, -0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f,0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x02,0x00,0x11,0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79, -0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57,0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f, -0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x01,0x01,0x12,0x01,0x6a,0x00,0x01,0x00,0x0c,0x00,0xba,0x00,0x2b,0x00,0x00,0x2a,0xf6,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x02,0x00,0x00,0x2b,0x08,0x00,0x00,0x2b,0x0e,0x00,0x00,0x2b,0x14,0x00,0x00,0x2b,0x14,0x00,0x00, -0x2b,0x14,0x00,0x00,0x2b,0x1a,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x20,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x20,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x26,0x00,0x00,0x2b,0x2c,0x00,0x00,0x2b,0x32,0x00,0x00, -0x2b,0x38,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x3e,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x44,0x00,0x00,0x2b,0x4a,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x50,0x00,0x00,0x2b,0x56,0x00,0x00,0x2b,0x5c,0x00,0x00,0x2b,0x62,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x6e,0x00,0x00,0x2b,0x26,0x00,0x00, -0x2b,0x74,0x00,0x00,0x2b,0x7a,0x00,0x00,0x2b,0x80,0x00,0x2b,0x2a,0xd8,0x2a,0xde,0x2a,0xde,0x2a,0xde,0x2a,0xde,0x2a,0xe4,0x2a,0xde,0x2a,0xde,0x2a,0xe4,0x2a,0xea,0x2a,0xf0,0x2a,0xf6,0x2a,0xe4,0x2a,0xfc,0x2a,0xe4,0x2b,0x02,0x2a,0xde,0x2a,0xde,0x2b,0x08,0x2b,0x0e,0x2b,0x14,0x2b,0x1a,0x2b,0x20,0x2b,0x26,0x2a,0xe4,0x2a,0xe4, -0x2b,0x2c,0x2b,0x14,0x2b,0x32,0x2b,0x38,0x2a,0xfc,0x2a,0xde,0x2a,0xe4,0x2a,0xe4,0x2b,0x3e,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xde,0x2b,0x44,0x2b,0x4a,0x00,0x02,0x00,0x0e,0x02,0x45,0x02,0x45,0x00,0x00,0x04,0x75,0x04,0x78,0x00,0x01,0x04,0x7b,0x04,0x7f,0x00,0x05,0x04,0x82,0x04,0x84,0x00,0x0a,0x04,0x87, -0x04,0x91,0x00,0x0d,0x04,0x97,0x04,0x9a,0x00,0x18,0x04,0xa3,0x04,0xa3,0x00,0x1c,0x04,0xa5,0x04,0xa7,0x00,0x1d,0x04,0xab,0x04,0xac,0x00,0x20,0x07,0x58,0x07,0x5b,0x00,0x22,0x07,0xed,0x07,0xee,0x00,0x26,0x08,0x4e,0x08,0x4e,0x00,0x28,0x0a,0xe1,0x0a,0xe1,0x00,0x29,0x0a,0xe3,0x0a,0xe3,0x00,0x2a,0x00,0x02,0x00,0x0e,0x02,0x45, -0x02,0x45,0x00,0x00,0x04,0x75,0x04,0x78,0x00,0x01,0x04,0x7b,0x04,0x7f,0x00,0x05,0x04,0x82,0x04,0x84,0x00,0x0a,0x04,0x87,0x04,0x91,0x00,0x0d,0x04,0x97,0x04,0x9a,0x00,0x18,0x04,0xa3,0x04,0xa3,0x00,0x1c,0x04,0xa5,0x04,0xa7,0x00,0x1d,0x04,0xab,0x04,0xac,0x00,0x20,0x07,0x58,0x07,0x5b,0x00,0x22,0x07,0xed,0x07,0xee,0x00,0x26, -0x08,0x4e,0x08,0x4e,0x00,0x28,0x0a,0xe1,0x0a,0xe1,0x00,0x29,0x0a,0xe3,0x0a,0xe3,0x00,0x2a,0x00,0x01,0x00,0x18,0x00,0x1e,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x27,0xb4,0x00,0x02,0x2a,0x36,0x2a,0x3c,0x00,0x01,0x00,0x01,0x04,0x64,0x00,0x01,0x00,0x02,0x02,0xcf,0x02,0xd0,0x00,0x01,0x0e,0xec,0x0f,0x62,0x00,0x02, -0x00,0x0c,0x01,0xca,0x00,0x6f,0x00,0x00,0x2a,0x22,0x00,0x00,0x2a,0x28,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0x34,0x00,0x00,0x2a,0x3a,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0x40,0x00,0x00,0x2a,0x40,0x00,0x00,0x2a,0x46,0x00,0x00,0x2a,0x22,0x00,0x00,0x2a,0x4c,0x00,0x00,0x2a,0x52,0x00,0x01,0x2a,0x58,0x00,0x00,0x2a,0x5e,0x00,0x01, -0x2a,0x64,0x00,0x00,0x2a,0x4c,0x00,0x00,0x2a,0x52,0x00,0x00,0x2a,0x6a,0x00,0x00,0x2a,0x70,0x00,0x00,0x2a,0x76,0x00,0x00,0x2a,0x7c,0x00,0x00,0x2a,0x82,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0x8e,0x00,0x01,0x2a,0x94,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0x9a,0x00,0x00,0x2a,0x88,0x00,0x01,0x2a,0xa0,0x00,0x00,0x2a,0xa6,0x00,0x01, -0x2a,0xac,0x00,0x00,0x2a,0xb2,0x00,0x00,0x2a,0xb8,0x00,0x00,0x2a,0xbe,0x00,0x00,0x2a,0xc4,0x00,0x00,0x2a,0xca,0x00,0x01,0x2a,0xd0,0x00,0x00,0x2a,0x3a,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0xd6,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xe2,0x00,0x00,0x2a,0xe8,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xe8,0x00,0x00,0x2a,0x22,0x00,0x00, -0x2a,0x22,0x00,0x00,0x2a,0x22,0x00,0x01,0x2a,0xee,0x00,0x00,0x2a,0xf4,0x00,0x00,0x2a,0xfa,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x06,0x00,0x00,0x2a,0x22,0x00,0x00,0x2b,0x0c,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2b,0x12,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2b,0x18,0x00,0x00,0x2b,0x1e,0x00,0x00, -0x2b,0x18,0x00,0x00,0x2b,0x1e,0x00,0x00,0x2b,0x1e,0x00,0x01,0x2b,0x24,0x00,0x01,0x2b,0x24,0x00,0x00,0x2b,0x2a,0x00,0x00,0x2b,0x2a,0x00,0x01,0x2b,0x30,0x00,0x00,0x2b,0x36,0x00,0x00,0x2b,0x3c,0x00,0x01,0x2b,0x42,0x00,0x00,0x2b,0x48,0x00,0x00,0x2b,0x4e,0x00,0x00,0x2b,0x54,0x00,0x01,0x2b,0x5a,0x00,0x01,0x2b,0x60,0x00,0x01, -0x2b,0x66,0x00,0x00,0x2b,0x6c,0x00,0x00,0x2b,0x72,0x00,0x01,0x2b,0x78,0x00,0x00,0x2b,0x7e,0x00,0x00,0x2b,0x54,0x00,0x00,0x2b,0x54,0x00,0x01,0x2b,0x84,0x00,0x00,0x2b,0x48,0x00,0x00,0x2b,0x8a,0x00,0x01,0x2b,0x90,0x00,0x01,0x2b,0x90,0x00,0x00,0x2b,0x36,0x00,0x00,0x2b,0x96,0x00,0x00,0x2b,0x9c,0x00,0x00,0x2b,0x6c,0x00,0x00, -0x2b,0xa2,0x00,0x00,0x2b,0xa8,0x00,0x00,0x2b,0xae,0x00,0x00,0x2b,0xb4,0x00,0x00,0x2b,0xba,0x00,0x00,0x2b,0xc0,0x00,0x00,0x2b,0xc6,0x00,0x01,0x2b,0xcc,0x00,0x00,0x2b,0xd2,0x00,0x00,0x2b,0xd8,0x00,0x00,0x2b,0xde,0x00,0x00,0x2b,0xe4,0x00,0x00,0x2b,0xea,0x00,0x00,0x2b,0xf0,0x00,0x00,0x2b,0xf6,0x00,0x00,0x2b,0xfc,0x00,0x01, -0x2c,0x02,0x03,0x48,0x2a,0x4a,0x2a,0x50,0x2a,0x56,0x2a,0x50,0x2a,0x5c,0x2a,0x50,0x2a,0x4a,0x2a,0x62,0x2a,0x68,0x2a,0x6e,0x2a,0x74,0x2a,0x7a,0x2a,0x80,0x2a,0x7a,0x2a,0x86,0x2a,0x8c,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0xa4,0x2a,0x9e,0x2a,0xaa,0x2a,0x98,0x2a,0xb0,0x2a,0xb6,0x2a,0xbc,0x2a,0xb6, -0x2a,0xc2,0x2a,0xc8,0x2a,0xc2,0x2a,0xc8,0x2a,0xce,0x2a,0xd4,0x2a,0xda,0x2a,0xd4,0x2a,0xe0,0x2a,0xe6,0x2a,0xec,0x2a,0xd4,0x2a,0xf2,0x2a,0xd4,0x2a,0xf8,0x2a,0xe6,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2b,0x0a,0x2b,0x04,0x2b,0x0a,0x2b,0x04,0x2b,0x10,0x2b,0x16,0x2b,0x1c,0x2b,0x22,0x2b,0x28,0x2b,0x2e,0x2b,0x34,0x2a,0x7a, -0x2b,0x3a,0x2b,0x40,0x2b,0x46,0x2b,0x4c,0x2b,0x52,0x2b,0x58,0x2a,0x68,0x2b,0x5e,0x2b,0x64,0x2b,0x6a,0x2b,0x70,0x2b,0x58,0x2b,0x64,0x2b,0x76,0x2b,0x7c,0x2a,0x7a,0x2b,0x82,0x2b,0x88,0x2b,0x8e,0x2b,0x94,0x2a,0x5c,0x2b,0x9a,0x2a,0x56,0x2b,0x9a,0x2b,0xa0,0x2b,0xa6,0x2a,0x4a,0x2a,0x62,0x2b,0xac,0x2b,0xb2,0x2a,0x4a,0x2b,0x9a, -0x2b,0xb8,0x2b,0xbe,0x2b,0xc4,0x2b,0xca,0x2b,0xd0,0x2b,0xd6,0x2b,0xdc,0x2b,0xd6,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0xaa,0x2a,0x98,0x2b,0xe2,0x2b,0xe8,0x2b,0xee,0x2b,0xe8,0x2b,0xf4,0x2b,0xfa,0x2c,0x00,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x2c,0x12,0x2c,0x18,0x2c,0x12,0x2c,0x18,0x2c,0x1e,0x2c,0x24, -0x2c,0x1e,0x2c,0x24,0x2c,0x2a,0x2a,0xe6,0x2c,0x30,0x2a,0xe6,0x2c,0x36,0x2c,0x3c,0x2c,0x42,0x2c,0x48,0x2c,0x4e,0x2c,0x54,0x2c,0x5a,0x2c,0x60,0x2c,0x66,0x2c,0x6c,0x2c,0x72,0x2c,0x78,0x2c,0x7e,0x2c,0x84,0x2c,0x8a,0x2b,0xca,0x2c,0x90,0x2b,0xa6,0x2c,0x96,0x2c,0x9c,0x2c,0x96,0x2c,0xa2,0x2a,0x68,0x2a,0x7a,0x2c,0xa8,0x2b,0x04, -0x2c,0xa8,0x2b,0x04,0x2b,0xb8,0x2b,0xd6,0x2b,0x1c,0x2b,0x16,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2c,0xb4,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba,0x2c,0xc0,0x2b,0xfa,0x2c,0xc6,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x2c,0x96,0x2c,0x9c,0x2b,0x64,0x2b,0x76,0x2a,0x68,0x2b,0x5e, -0x2c,0xde,0x2b,0x58,0x2c,0xe4,0x2b,0xca,0x2c,0x66,0x2c,0x6c,0x2c,0xea,0x2b,0xd6,0x2c,0xf0,0x2a,0x7a,0x2c,0xf6,0x2b,0xe8,0x2c,0xfc,0x2b,0xfa,0x2d,0x02,0x2c,0x84,0x2d,0x08,0x2b,0xca,0x2a,0x68,0x2d,0x0e,0x2d,0x14,0x2d,0x1a,0x2c,0xe4,0x2b,0xca,0x2b,0xc4,0x2b,0xca,0x2d,0x20,0x2d,0x26,0x2d,0x2c,0x2d,0x32,0x2d,0x38,0x2d,0x26, -0x2d,0x3e,0x2d,0x32,0x2d,0x44,0x2c,0x48,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x2d,0x50,0x2d,0x56,0x2d,0x5c,0x2c,0x54,0x2d,0x62,0x2b,0x9a,0x2d,0x62,0x2a,0x50,0x2a,0x56,0x2b,0x9a,0x2a,0x56,0x2a,0x50,0x2a,0x4a,0x2d,0x68,0x2a,0x4a,0x2d,0x68,0x2a,0x4a,0x2b,0x9a,0x2a,0x4a,0x2a,0x50,0x2d,0x6e,0x2b,0xa6,0x2d,0x74,0x2d,0x7a, -0x2d,0x80,0x2c,0x9c,0x2d,0x86,0x2b,0x76,0x2d,0x8c,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2d,0x98,0x2b,0xd0,0x2d,0x9e,0x2a,0x74,0x2d,0xa4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2d,0x98,0x2d,0xb0,0x2a,0x98,0x2d,0xb0,0x2a,0x98, -0x2d,0xb6,0x2a,0x9e,0x2d,0xbc,0x2a,0x98,0x2d,0xbc,0x2a,0x98,0x2d,0xc2,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2a,0x8c,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba,0x2d,0xc8,0x2a,0x98,0x2d,0xc8,0x2a,0x98,0x2d,0xc2,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba, -0x2b,0xe2,0x2d,0xce,0x2b,0xe2,0x2d,0xd4,0x2b,0xee,0x2d,0xd4,0x2b,0xee,0x2b,0xe8,0x2b,0xe2,0x2d,0xd4,0x2d,0xda,0x2b,0xe8,0x2d,0xda,0x2b,0xe8,0x2d,0xda,0x2b,0xe8,0x2d,0xe0,0x2b,0xfa,0x2b,0xf4,0x2b,0xfa,0x2b,0xf4,0x2d,0xe6,0x2b,0xf4,0x2d,0xec,0x2c,0x00,0x2d,0xe6,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0x06,0x2d,0xf2, -0x2d,0xf8,0x2d,0xfe,0x2c,0x06,0x2e,0x04,0x2a,0xb0,0x2e,0x0a,0x2c,0x06,0x2e,0x04,0x2a,0xbc,0x2e,0x0a,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2e,0x16,0x2e,0x1c,0x2c,0x18,0x2e,0x22,0x2a,0xc8,0x2e,0x28,0x2c,0x24,0x2e,0x2e,0x2a,0xe6,0x2e,0x34,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4,0x2e,0x40,0x2a,0xd4,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48, -0x2c,0xa8,0x2e,0x46,0x2c,0xa8,0x2e,0x46,0x2c,0x42,0x2c,0x48,0x2a,0xfe,0x2e,0x46,0x2a,0xfe,0x2e,0x46,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x4c,0x2c,0xa8,0x2e,0x4c,0x2d,0x44,0x2c,0x48,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x2e,0x52,0x2c,0x54,0x2e,0x58,0x2c,0x54,0x2e,0x5e,0x2e,0x64,0x2e,0x6a,0x2e,0x70,0x2c,0xc6,0x2c,0xcc, -0x2b,0x10,0x2b,0x16,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x82,0x2c,0x60,0x2e,0x88,0x2b,0x16,0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2d,0x98,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x2e,0x8e,0x2c,0xcc,0x2e,0x94,0x2b,0x16,0x2c,0xd2,0x2e,0x9a,0x2c,0xd8,0x2e,0xa0,0x2c,0xd2,0x2e,0xa6,0x2c,0xd8,0x2d,0x98,0x2e,0xac,0x2c,0xcc, -0x2e,0xb2,0x2b,0x16,0x2c,0x66,0x2c,0x6c,0x2e,0xb8,0x2b,0x22,0x2c,0x66,0x2c,0x6c,0x2e,0xbe,0x2b,0x22,0x2c,0x66,0x2c,0x6c,0x2e,0xc4,0x2b,0x22,0x2c,0x66,0x2e,0xca,0x2b,0x1c,0x2e,0xd0,0x2e,0xd6,0x2e,0xdc,0x2b,0x34,0x2a,0x6e,0x2e,0xe2,0x2c,0x84,0x2e,0xd6,0x2e,0xe8,0x2b,0x34,0x2d,0xa4,0x2e,0xee,0x2c,0x84,0x2a,0xaa,0x2a,0x98, -0x2a,0xaa,0x2a,0x98,0x2a,0xa4,0x2c,0xba,0x2c,0x90,0x2b,0xa6,0x2e,0xf4,0x2e,0xfa,0x2f,0x00,0x2b,0xa6,0x2f,0x06,0x2b,0xa6,0x2f,0x0c,0x2b,0xa6,0x2f,0x00,0x2b,0xa6,0x2f,0x12,0x2b,0xa6,0x2f,0x18,0x2b,0xa6,0x2f,0x1e,0x2f,0x24,0x2f,0x2a,0x2b,0x88,0x2f,0x30,0x2c,0x9c,0x2f,0x36,0x2b,0x76,0x2f,0x3c,0x2b,0x5e,0x2f,0x12,0x2b,0xa6, -0x2f,0x42,0x2f,0x48,0x2f,0x4e,0x2f,0x54,0x2f,0x42,0x2f,0x5a,0x2f,0x4e,0x2f,0x60,0x2c,0x06,0x2d,0xf2,0x2a,0xbc,0x2d,0xfe,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2f,0x66,0x2c,0x30,0x2a,0xe6,0x2f,0x6c,0x2a,0xe6,0x2a,0xec,0x2f,0x72,0x2a,0xf2,0x2f,0x72,0x2c,0x72,0x2f,0x78,0x2f,0x7e,0x2c,0xcc,0x2f,0x7e,0x2c,0xcc,0x2f,0x84,0x2f,0x8a, -0x2f,0x90,0x2b,0xe8,0x2f,0x96,0x2b,0xe8,0x2d,0xe0,0x2b,0xfa,0x2d,0xe0,0x2b,0xfa,0x2f,0x9c,0x2b,0x40,0x2f,0xa2,0x2b,0x4c,0x2f,0xa8,0x2f,0xae,0x2f,0xb4,0x2f,0xba,0x2e,0xb8,0x2b,0x16,0x2e,0xbe,0x2b,0x16,0x2e,0xc4,0x2b,0x16,0x2b,0x1c,0x2e,0xd0,0x2b,0xb8,0x2f,0xc0,0x2a,0x68,0x2f,0xc6,0x2b,0xdc,0x2b,0xbe,0x2a,0x80,0x2a,0x6e, -0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2c,0xb4,0x2b,0xd0,0x2d,0x92,0x2a,0x74,0x2c,0xb4,0x2b,0xd0,0x2e,0x9a,0x2b,0x34,0x2f,0xcc,0x2b,0xb8,0x2f,0xd2,0x2a,0x68,0x2f,0xd8,0x2f,0xde,0x2b,0xd6,0x2f,0x3c,0x2a,0x7a,0x2a,0xaa,0x2a,0x98,0x2a,0xaa,0x2a,0x98,0x2a,0xa4,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba, -0x2b,0xe2,0x2f,0xe4,0x2b,0xe2,0x2f,0xea,0x2b,0xf4,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2f,0xf0,0x2a,0xb6,0x2f,0xf6,0x2a,0xe6,0x2f,0xfc,0x2a,0xe6,0x2a,0xec,0x2a,0xd4,0x2a,0xf2,0x2a,0xd4,0x30,0x02,0x2a,0xe6,0x30,0x08,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4,0x2e,0x40,0x2a,0xd4,0x30,0x02,0x2a,0xe6,0x30,0x08,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4, -0x2e,0x40,0x2a,0xd4,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x30,0x0e,0x2c,0xa8,0x30,0x0e,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x4c,0x2c,0xa8,0x30,0x14,0x30,0x1a,0x2c,0xcc,0x2e,0x7c,0x2b,0x16,0x2e,0x7c,0x2b,0x16,0x30,0x20,0x2c,0xcc,0x2e,0x88,0x2b,0x16,0x2e,0x88,0x2b,0x16,0x2c,0xc6,0x2c,0xae,0x2b,0x10,0x30,0x26,0x2b,0x10,0x30,0x26, -0x30,0x2c,0x2c,0x78,0x30,0x32,0x2b,0x2e,0x2c,0x72,0x30,0x38,0x2b,0x28,0x30,0x3e,0x2e,0xd6,0x30,0x44,0x2b,0x34,0x2b,0x5e,0x30,0x4a,0x2c,0x84,0x30,0x50,0x2a,0x7a,0x30,0x56,0x2c,0x84,0x30,0x5c,0x2a,0x7a,0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2c,0x6c,0x2b,0x1c,0x2b,0x22,0x2b,0x1c,0x2b,0x16,0x2c,0xc0,0x2b,0xfa,0x30,0x62,0x2b,0xfa, -0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2b,0xf4,0x2b,0xfa,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0xfc,0x2b,0xfa,0x2d,0xe0,0x2b,0xfa,0x2b,0xf4,0x2b,0xfa,0x2b,0xf4,0x2d,0xe6,0x2b,0xf4,0x2d,0xec,0x2c,0x00,0x2d,0xe6,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x30,0x62,0x2b,0xfa,0x30,0x68,0x30,0x6e, -0x2b,0x64,0x30,0x74,0x2a,0x68,0x2d,0xa4,0x2a,0x68,0x2d,0xa4,0x2b,0xa0,0x2b,0xa6,0x2b,0x7c,0x2a,0x7a,0x2b,0xb8,0x2b,0xbe,0x2a,0x68,0x2a,0x6e,0x2b,0xd0,0x2b,0xd6,0x2a,0x74,0x2a,0x7a,0x2b,0xdc,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2a,0x86,0x2a,0x8c,0x2a,0x86,0x2a,0x9e,0x2a,0xa4,0x2a,0x9e,0x30,0x7a,0x2b,0xe8,0x30,0x80,0x2b,0xe8, -0x2c,0x06,0x2c,0x0c,0x2a,0xb0,0x2a,0xb6,0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2c,0x12,0x2c,0x18,0x2a,0xc2,0x2a,0xc8,0x2c,0x12,0x2c,0x18,0x2a,0xc2,0x2a,0xc8,0x2c,0x1e,0x2c,0x24,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x2c,0x24,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x30,0x86,0x30,0x8c,0x2c,0x9c,0x30,0x92,0x2b,0x76, -0x2a,0x74,0x2b,0x5e,0x2a,0x74,0x2b,0x5e,0x30,0x98,0x2c,0x9c,0x30,0x9e,0x2b,0x76,0x2a,0x80,0x2b,0x5e,0x2a,0x80,0x2b,0x5e,0x2c,0x42,0x2c,0x48,0x2c,0x4e,0x2c,0x54,0x2c,0x5a,0x2c,0x60,0x2b,0x10,0x2b,0x16,0x2c,0x72,0x2c,0x78,0x2b,0x28,0x2b,0x2e,0x2c,0x7e,0x2c,0x84,0x2b,0x34,0x2a,0x7a,0x30,0xa4,0x2a,0x9e,0x30,0xaa,0x2b,0x40, -0x30,0xb0,0x30,0xb6,0x2c,0x90,0x2b,0xa6,0x2a,0x68,0x2a,0x7a,0x2a,0x68,0x2a,0x7a,0x2a,0x68,0x2b,0x5e,0x2b,0xb8,0x2b,0xd6,0x2a,0x68,0x2a,0x7a,0x2d,0x5c,0x2c,0x54,0x2c,0xa8,0x2b,0x04,0x2c,0xa8,0x2b,0x04,0x2d,0x6e,0x2b,0xa6,0x2d,0x74,0x2d,0x7a,0x30,0xbc,0x2a,0x7a,0x30,0xbc,0x2a,0x7a,0x2c,0xea,0x2b,0xd6,0x2c,0xf0,0x2a,0x7a, -0x2d,0x8c,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2d,0x98,0x2b,0xd0,0x2d,0x9e,0x2a,0x74,0x2d,0xa4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2c,0xb4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2d,0x98,0x2d,0xb6,0x2a,0x9e,0x2d,0xc2,0x2a,0x9e, -0x2a,0x86,0x2a,0x8c,0x2a,0x86,0x2c,0xba,0x2d,0xc2,0x2a,0x9e,0x2a,0x86,0x2c,0xba,0x2a,0x86,0x2c,0xba,0x30,0xc2,0x2b,0xe8,0x30,0x7a,0x2d,0xce,0x30,0x7a,0x2d,0xd4,0x30,0x80,0x2d,0xd4,0x30,0x80,0x2b,0xe8,0x30,0x7a,0x2d,0xd4,0x30,0xc8,0x2b,0xe8,0x30,0xc8,0x2b,0xe8,0x30,0xc8,0x2b,0xe8,0x2c,0x06,0x2d,0xf2,0x2d,0xf8,0x2d,0xfe, -0x2c,0x06,0x2e,0x04,0x2a,0xb0,0x2e,0x0a,0x2c,0x06,0x2e,0x04,0x2a,0xbc,0x2e,0x0a,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2e,0x16,0x2e,0x1c,0x2c,0x18,0x2e,0x22,0x2a,0xc8,0x2e,0x28,0x2c,0x24,0x2e,0x28,0x30,0x86,0x2e,0x28,0x30,0x86,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x2d,0x44,0x2c,0x48,0x2c,0x42,0x2c,0x48, -0x2d,0x44,0x2c,0x48,0x2e,0x52,0x2c,0x54,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2e,0x58,0x2c,0x54,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x30,0xce,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2e,0x5e,0x2e,0x64,0x2e,0x6a,0x2e,0x70,0x30,0xce,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x82,0x2c,0x60, -0x2e,0x88,0x2b,0x16,0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2d,0x98,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x30,0xd4,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x30,0xda,0x2c,0xcc,0x2e,0x94,0x2b,0x16,0x30,0xd4,0x2e,0x9a,0x2c,0xd8,0x2e,0xa0,0x30,0xd4,0x2e,0xa6,0x2c,0xd8,0x2d,0x98,0x30,0xe0,0x2c,0xcc,0x2e,0xb2,0x2b,0x16,0x2c,0x66,0x2c,0x6c, -0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2e,0xca,0x30,0xe6,0x30,0xec,0x2b,0x34,0x2a,0x6e,0x2d,0x02,0x2c,0x84,0x2e,0xe2,0x2c,0x84,0x2c,0xf0,0x2a,0x7a,0x2c,0xf0,0x2a,0x7a,0x30,0xe6,0x2e,0xe8,0x2b,0x34,0x2d,0xa4,0x2e,0xee,0x2c,0x84,0x30,0xa4,0x2a,0x9e,0x30,0xb0,0x30,0xb6,0x2a,0xa4,0x2c,0xba,0x30,0xf2,0x2d,0x56, -0x30,0xf8,0x2d,0x56,0x2c,0x90,0x2b,0xa6,0x2e,0xf4,0x2e,0xfa,0x2f,0x00,0x2b,0xa6,0x2f,0x06,0x2b,0xa6,0x2f,0x0c,0x2b,0xa6,0x2f,0x00,0x2b,0xa6,0x2f,0x12,0x2b,0xa6,0x2f,0x18,0x2b,0xa6,0x2a,0x68,0x2b,0x5e,0x2f,0x3c,0x2b,0x5e,0x2f,0x12,0x2b,0xa6,0x2a,0x68,0x2d,0x98,0x2a,0x68,0x2d,0x98,0x2a,0x68,0x2c,0xb4,0x2a,0x68,0x2c,0xb4, -0x2c,0x06,0x2d,0xf2,0x2a,0xbc,0x2d,0xfe,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2f,0x66,0x2b,0xb8,0x2f,0xc0,0x2a,0x68,0x2a,0x6e,0x2b,0xdc,0x2b,0xbe,0x2a,0x80,0x2a,0x6e,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2c,0xb4,0x2b,0xd0,0x2d,0x92,0x2a,0x74,0x2c,0xb4,0x2b,0xd0,0x2e,0x9a,0x2b,0x34,0x2f,0xcc,0x2b,0xb8,0x2f,0xd2,0x2a,0x68,0x2f,0xd8, -0x2f,0xde,0x2b,0xd6,0x2f,0x3c,0x2a,0x7a,0x2a,0xa4,0x2a,0x9e,0x2a,0x86,0x2c,0xba,0x30,0xfe,0x2f,0xe4,0x30,0x7a,0x2f,0xea,0x2b,0xf4,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2f,0xf0,0x2a,0xb6,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x31,0x04,0x2c,0xcc,0x31,0x0a,0x2c,0xcc,0x30,0xce,0x2c,0xae,0x30,0x2c,0x2c,0x78,0x30,0x32,0x2b,0x2e, -0x2c,0x72,0x30,0x38,0x2b,0x28,0x30,0x3e,0x30,0xe6,0x31,0x10,0x2b,0x34,0x2b,0x5e,0x30,0x4a,0x2c,0x84,0x30,0x50,0x2a,0x7a,0x30,0x56,0x2c,0x84,0x30,0x5c,0x2a,0x7a,0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2a,0x92,0x31,0x16,0x2a,0x92,0x31,0x16,0x2a,0x86,0x31,0x1c,0x2a,0x86,0x31,0x1c,0x2a,0x92,0x31,0x22,0x2a,0x92,0x31,0x22, -0x31,0x28,0x31,0x2e,0x31,0x28,0x31,0x2e,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0x34,0x2a,0xb6,0x31,0x34,0x2a,0xb6,0x31,0x3a,0x2b,0xfa,0x31,0x3a,0x2b,0xfa,0x31,0x40,0x2a,0x98,0x31,0x40,0x2a,0x98,0x31,0x46,0x2a,0x9e,0x31,0x46,0x2a,0x9e,0x31,0x4c,0x31,0x52,0x31,0x4c,0x31,0x58,0x31,0x4c,0x31,0x52,0x31,0x4c,0x31,0x58, -0x31,0x5e,0x2c,0x9c,0x31,0x64,0x2b,0x76,0x31,0x6a,0x2b,0x5e,0x31,0x6a,0x2b,0x5e,0x31,0x5e,0x2c,0x9c,0x31,0x64,0x2b,0x76,0x31,0x6a,0x2b,0x5e,0x31,0x6a,0x2b,0x5e,0x2f,0x42,0x31,0x70,0x31,0x76,0x31,0x70,0x2a,0x68,0x31,0x7c,0x2a,0x68,0x31,0x7c,0x31,0x82,0x31,0x88,0x31,0x82,0x31,0x88,0x31,0x8e,0x31,0x94,0x31,0x8e,0x31,0x94, -0x31,0x9a,0x2d,0x26,0x31,0xa0,0x2d,0x32,0x31,0x9a,0x2d,0x26,0x31,0xa0,0x2d,0x32,0x2a,0x92,0x31,0x16,0x2a,0x92,0x31,0x16,0x2a,0x86,0x31,0xa6,0x2a,0x86,0x31,0xa6,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0xac,0x2a,0xb6,0x31,0xac,0x2a,0xb6,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0xb2,0x2a,0xb6,0x31,0xb2,0x2a,0xb6, -0x2e,0x76,0x2c,0x60,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x7c,0x2b,0x16,0x31,0xb8,0x31,0xbe,0x31,0xc4,0x31,0xbe,0x31,0xca,0x31,0xd0,0x31,0xca,0x31,0xbe,0x31,0xd6,0x31,0xbe,0x31,0xd6,0x31,0xbe,0x31,0xca,0x31,0xd0,0x31,0xdc,0x31,0xbe,0x31,0xe2,0x31,0xbe,0x31,0xe2,0x31,0xbe,0x31,0xe8,0x2a,0xd4,0x31,0xe8,0x2a,0xd4, -0x31,0xee,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x31,0xf4,0x31,0xfa,0x31,0xf4,0x31,0xfa,0x31,0xe8,0x32,0x00,0x31,0xe8,0x32,0x00,0x31,0xee,0x32,0x00,0x31,0xee,0x32,0x00,0x31,0xee,0x31,0xfa,0x31,0xee,0x31,0xfa,0x32,0x06,0x2a,0xd4,0x32,0x06,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x32,0x0c,0x2a,0xd4,0x32,0x0c,0x2a,0xd4, -0x32,0x12,0x2a,0xd4,0x32,0x12,0x2a,0xd4,0x32,0x18,0x2a,0xd4,0x32,0x18,0x2a,0xd4,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x32,0x24,0x32,0x1e,0x32,0x24,0x32,0x2a,0x2a,0xc8,0x32,0x2a,0x2a,0xc8,0x32,0x1e,0x2e,0x16,0x32,0x1e,0x2e,0x16,0x32,0x30,0x32,0x36,0x32,0x30,0x32,0x3c, -0x32,0x42,0x32,0x36,0x32,0x42,0x32,0x3c,0x32,0x48,0x32,0x36,0x32,0x48,0x32,0x3c,0x32,0x4e,0x32,0x36,0x32,0x4e,0x32,0x3c,0x32,0x30,0x32,0x54,0x32,0x30,0x32,0x5a,0x32,0x30,0x32,0x36,0x32,0x30,0x32,0x3c,0x32,0x60,0x32,0x66,0x32,0x6c,0x32,0x66,0x32,0x72,0x32,0x66,0x32,0x78,0x32,0x66,0x32,0x60,0x32,0x66,0x32,0x60,0x32,0x7e, -0x32,0x60,0x32,0x84,0x32,0x6c,0x32,0x7e,0x32,0x6c,0x32,0x66,0x32,0x8a,0x32,0x66,0x32,0x78,0x32,0x66,0x32,0x60,0x32,0x66,0x32,0x8a,0x32,0x66,0x32,0x90,0x32,0x66,0x32,0x96,0x32,0x66,0x2b,0x82,0x2b,0x88,0x32,0x9c,0x2b,0x76,0x32,0xa2,0x2b,0x76,0x32,0xa8,0x2b,0x76,0x32,0xae,0x2b,0x76,0x32,0xae,0x32,0xb4,0x2d,0x86,0x2b,0x76, -0x32,0xba,0x2b,0x88,0x2f,0x36,0x2b,0x76,0x31,0x76,0x32,0xc0,0x31,0x64,0x2b,0x76,0x31,0x64,0x2b,0x76,0x31,0x76,0x32,0xc6,0x31,0x76,0x32,0xcc,0x32,0xd2,0x2d,0x32,0x32,0xd2,0x2d,0x32,0x2d,0x3e,0x2d,0x32,0x2d,0x3e,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x32,0xae,0x2b,0x76, -0x31,0x76,0x32,0xd8,0x32,0xae,0x32,0xde,0x32,0xe4,0x32,0xea,0x32,0xf0,0x32,0xf6,0x2b,0x52,0x2b,0x58,0x32,0x8a,0x32,0x66,0x32,0xfc,0x33,0x02,0x2a,0x68,0x33,0x08,0x32,0xfc,0x33,0x02,0x2a,0x68,0x33,0x08,0x33,0x0e,0x33,0x14,0x33,0x0e,0x33,0x14,0x33,0x1a,0x2a,0x8c,0x33,0x1a,0x2a,0x8c,0x33,0x20,0x2c,0x24,0x33,0x20,0x2c,0x24, -0x33,0x20,0x2c,0x24,0x33,0x20,0x2c,0x24,0x2c,0x42,0x33,0x26,0x33,0x2c,0x33,0x32,0x33,0x2c,0x33,0x32,0x33,0x38,0x33,0x26,0x33,0x3e,0x33,0x44,0x33,0x4a,0x33,0x32,0x33,0x4a,0x33,0x32,0x33,0x3e,0x33,0x44,0x33,0x50,0x33,0x56,0x33,0x5c,0x32,0xea,0x33,0x5c,0x2b,0x16,0x33,0x50,0x33,0x56,0x33,0x62,0x33,0x68,0x33,0x6e,0x2b,0x2e, -0x33,0x6e,0x2b,0x2e,0x33,0x62,0x33,0x68,0x33,0x74,0x33,0x7a,0x33,0x80,0x33,0x86,0x33,0x80,0x33,0x8c,0x33,0x92,0x33,0x98,0x33,0x9e,0x33,0x7a,0x33,0xa4,0x33,0x8c,0x33,0xa4,0x33,0x8c,0x33,0xaa,0x33,0x98,0x33,0xb0,0x33,0xb6,0x33,0xb0,0x33,0xb6,0x2c,0x90,0x33,0xbc,0x2c,0x90,0x33,0xbc,0x33,0xc2,0x33,0xc8,0x33,0xc2,0x33,0xc8, -0x2b,0xd0,0x33,0x02,0x33,0x80,0x33,0x8c,0x33,0x80,0x33,0x8c,0x2b,0xd0,0x33,0x02,0x30,0x7a,0x33,0xce,0x30,0x7a,0x33,0xce,0x2c,0x12,0x33,0xd4,0x2a,0xc2,0x33,0xda,0x2a,0xc2,0x33,0xda,0x2c,0x12,0x33,0xd4,0x2c,0xd2,0x2c,0xcc,0x33,0xe0,0x2b,0x16,0x33,0xe0,0x2b,0x16,0x2c,0xd2,0x2c,0xcc,0x2c,0x90,0x33,0xe6,0x2c,0x90,0x33,0xe6, -0x33,0xec,0x2b,0xfa,0x33,0xec,0x2b,0xfa,0x2c,0x2a,0x2a,0xe6,0x2c,0x5a,0x2c,0xae,0x33,0xf2,0x2b,0xbe,0x33,0xf2,0x2c,0xae,0x33,0xf2,0x2b,0xd6,0x33,0xf8,0x2b,0xfa,0x33,0xfe,0x2c,0xa2,0x2c,0x42,0x2c,0x48,0x2d,0x5c,0x2c,0x54,0x2d,0x02,0x2c,0x84,0x34,0x04,0x27,0x56,0x2a,0xe0,0x2a,0xe6,0x2a,0xda,0x34,0x0a,0x2a,0xce,0x34,0x10, -0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2e,0xa0,0x2b,0x10,0x2e,0xa0,0x33,0xf2,0x2b,0xbe,0x34,0x16,0x2a,0x6e,0x34,0x16,0x2a,0x6e,0x33,0xf2,0x2c,0xae,0x34,0x16,0x2c,0xb4,0x34,0x16,0x2c,0xb4,0x33,0xf2,0x2b,0xd6,0x34,0x1c,0x2b,0x16,0x34,0x1c,0x2b,0x16,0x33,0xf8,0x2b,0xfa,0x34,0x22,0x2b,0x6a,0x2a,0x80,0x2b,0x5e,0x2a,0x80,0x2b,0x5e, -0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x46,0x2c,0xa8,0x2e,0x46,0x2d,0x5c,0x2c,0x54,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2d,0x02,0x2c,0x84,0x27,0x56,0x27,0x56,0x27,0x56,0x27,0x56,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c, -0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44, -0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x25,0x08,0xc7,0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe9,0x00,0x10,0x08,0xeb,0x08,0xf7,0x00,0x19,0x08,0xf9,0x08,0xf9,0x00,0x26,0x09,0x02,0x09,0x02,0x00,0x27,0x09,0x07,0x09,0x2b, -0x00,0x28,0x09,0x3b,0x09,0x4e,0x00,0x4d,0x09,0x59,0x09,0x59,0x00,0x61,0x09,0x5b,0x09,0x68,0x00,0x62,0x09,0x6c,0x09,0x6e,0x00,0x70,0x09,0x72,0x09,0x72,0x00,0x73,0x09,0x7c,0x09,0x7c,0x00,0x74,0x09,0x80,0x09,0xf8,0x00,0x75,0x09,0xfa,0x0a,0x0e,0x00,0xee,0x0a,0x24,0x0a,0x2b,0x01,0x03,0x0a,0x2d,0x0a,0x2d,0x01,0x0b,0x0a,0x3e, -0x0a,0x3f,0x01,0x0c,0x0a,0x43,0x0a,0x43,0x01,0x0e,0x0a,0x54,0x0a,0x5b,0x01,0x0f,0x0a,0x5f,0x0a,0x62,0x01,0x17,0x0a,0x72,0x0a,0xb7,0x01,0x1b,0x0b,0x0c,0x0b,0x18,0x01,0x61,0x0e,0x20,0x0e,0x3e,0x01,0x6e,0x0e,0x4b,0x0e,0x61,0x01,0x8d,0x0e,0x6e,0x0e,0x72,0x01,0xa4,0x0e,0x74,0x0e,0xd5,0x01,0xa9,0x0e,0xd7,0x0e,0xea,0x02,0x0b, -0x0e,0xec,0x0f,0x4f,0x02,0x1f,0x0f,0x62,0x0f,0xc3,0x02,0x83,0x13,0x00,0x13,0x29,0x02,0xe5,0x14,0x04,0x14,0x07,0x03,0x0f,0x14,0x09,0x14,0x16,0x03,0x13,0x14,0x53,0x14,0x5c,0x03,0x21,0x14,0x6b,0x14,0x6b,0x03,0x2b,0x14,0x6d,0x14,0x7b,0x03,0x2c,0x14,0x7d,0x14,0x87,0x03,0x3b,0x14,0xad,0x14,0xae,0x03,0x46,0x00,0x01,0x02,0x2c, -0x02,0xa2,0x00,0x02,0x00,0x0c,0x01,0xca,0x00,0x6f,0x00,0x00,0x19,0xde,0x00,0x00,0x19,0xe4,0x00,0x01,0x19,0xea,0x00,0x00,0x19,0xf0,0x00,0x00,0x19,0xf6,0x00,0x01,0x19,0xea,0x00,0x00,0x19,0xfc,0x00,0x00,0x19,0xfc,0x00,0x00,0x1a,0x02,0x00,0x00,0x19,0xde,0x00,0x00,0x1a,0x08,0x00,0x00,0x1a,0x0e,0x00,0x01,0x1a,0x14,0x00,0x00, -0x1a,0x1a,0x00,0x01,0x1a,0x20,0x00,0x00,0x1a,0x08,0x00,0x00,0x1a,0x0e,0x00,0x00,0x1a,0x26,0x00,0x00,0x1a,0x2c,0x00,0x00,0x1a,0x32,0x00,0x00,0x1a,0x38,0x00,0x00,0x1a,0x3e,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x4a,0x00,0x01,0x1a,0x50,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x56,0x00,0x00,0x1a,0x44,0x00,0x01,0x1a,0x5c,0x00,0x00, -0x1a,0x62,0x00,0x01,0x1a,0x68,0x00,0x00,0x1a,0x6e,0x00,0x00,0x1a,0x74,0x00,0x00,0x1a,0x7a,0x00,0x00,0x1a,0x80,0x00,0x00,0x1a,0x86,0x00,0x01,0x1a,0x8c,0x00,0x00,0x19,0xf6,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x92,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0x9e,0x00,0x00,0x1a,0xa4,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xa4,0x00,0x00, -0x19,0xde,0x00,0x00,0x19,0xde,0x00,0x00,0x19,0xde,0x00,0x01,0x1a,0xaa,0x00,0x00,0x1a,0xb0,0x00,0x00,0x1a,0xb6,0x00,0x00,0x1a,0xbc,0x00,0x00,0x1a,0xc2,0x00,0x00,0x19,0xde,0x00,0x00,0x1a,0xc8,0x00,0x01,0x19,0xea,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xce,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xd4,0x00,0x00, -0x1a,0xda,0x00,0x00,0x1a,0xd4,0x00,0x00,0x1a,0xda,0x00,0x00,0x1a,0xda,0x00,0x01,0x1a,0xe0,0x00,0x01,0x1a,0xe0,0x00,0x00,0x1a,0xe6,0x00,0x00,0x1a,0xe6,0x00,0x01,0x1a,0xec,0x00,0x00,0x1a,0xf2,0x00,0x00,0x1a,0xf8,0x00,0x01,0x1a,0xfe,0x00,0x00,0x1b,0x04,0x00,0x00,0x1b,0x0a,0x00,0x00,0x1b,0x10,0x00,0x01,0x1b,0x16,0x00,0x01, -0x1b,0x1c,0x00,0x01,0x1b,0x22,0x00,0x00,0x1b,0x28,0x00,0x00,0x1b,0x2e,0x00,0x01,0x1b,0x34,0x00,0x00,0x1b,0x3a,0x00,0x00,0x1b,0x10,0x00,0x00,0x1b,0x10,0x00,0x01,0x1b,0x40,0x00,0x00,0x1b,0x04,0x00,0x00,0x1b,0x46,0x00,0x01,0x1b,0x4c,0x00,0x01,0x1b,0x4c,0x00,0x00,0x1a,0xf2,0x00,0x00,0x1b,0x52,0x00,0x00,0x1b,0x58,0x00,0x00, -0x1b,0x28,0x00,0x00,0x1b,0x5e,0x00,0x00,0x1b,0x64,0x00,0x00,0x1b,0x6a,0x00,0x00,0x1b,0x70,0x00,0x00,0x1b,0x76,0x00,0x00,0x1b,0x7c,0x00,0x00,0x1b,0x82,0x00,0x01,0x1b,0x88,0x00,0x00,0x1b,0x8e,0x00,0x00,0x1b,0x94,0x00,0x00,0x1b,0x9a,0x00,0x00,0x1b,0xa0,0x00,0x00,0x1b,0xa6,0x00,0x00,0x1b,0xac,0x00,0x00,0x1b,0xb2,0x00,0x00, -0x1b,0xb8,0x00,0x01,0x1b,0xbe,0x00,0x05,0x00,0x0c,0x00,0x1a,0x00,0x2c,0x00,0x3e,0x00,0x50,0x00,0x03,0x23,0xd8,0x23,0xde,0x23,0xe4,0x23,0xea,0x1b,0x02,0x1b,0x08,0x00,0x04,0x23,0xe2,0x23,0xe8,0x23,0xca,0x23,0xd0,0x23,0xd6,0x23,0xdc,0x1a,0xf4,0x1a,0xfa,0x00,0x04,0x23,0xdc,0x23,0xe2,0x23,0xe8,0x23,0xee,0x23,0xf4,0x23,0xfa, -0x1b,0xf6,0x1b,0xfc,0x00,0x04,0x23,0xee,0x23,0xf4,0x23,0xa6,0x23,0xac,0x23,0xb2,0x23,0xb8,0x1a,0xd0,0x1a,0xd6,0x00,0x04,0x23,0xdc,0x23,0xe2,0x23,0xe8,0x23,0x9a,0x23,0xee,0x23,0xa6,0x1a,0xbe,0x1a,0xc4,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77, -0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38, -0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x03,0x09,0x71,0x09,0x71,0x00,0x00,0x0a,0x63,0x0a,0x64,0x00,0x01,0x14,0x97,0x14,0x98,0x00,0x03,0x00,0x01,0x02,0x20,0x02,0xd2,0x00,0x01,0x00,0x0c,0x01,0x6e, -0x00,0x58,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x2c,0x00,0x00,0x17,0x38,0x00,0x00,0x17,0x3e,0x00,0x00,0x17,0x44,0x00,0x00,0x17,0x44,0x00,0x00,0x17,0x4a,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x50,0x00,0x00,0x17,0x56,0x00,0x00,0x17,0x62,0x00,0x00,0x17,0x50,0x00,0x00,0x17,0x56,0x00,0x00,0x17,0x6e,0x00,0x00,0x17,0x74,0x00,0x00, -0x17,0x7a,0x00,0x00,0x17,0x80,0x00,0x00,0x17,0x86,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0x92,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0x9e,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0xaa,0x00,0x00,0x17,0xb6,0x00,0x00,0x17,0xbc,0x00,0x00,0x17,0xc2,0x00,0x00,0x17,0xc8,0x00,0x00,0x17,0xce,0x00,0x00,0x17,0x3e,0x00,0x00,0x17,0x8c,0x00,0x00, -0x17,0xda,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xe6,0x00,0x00,0x17,0xec,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xec,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0xf8,0x00,0x00,0x17,0xfe,0x00,0x00,0x18,0x04,0x00,0x00,0x18,0x0a,0x00,0x00,0x17,0x26,0x00,0x00,0x18,0x10,0x00,0x00,0x17,0xe0,0x00,0x00, -0x18,0x16,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xe0,0x00,0x00,0x18,0x1c,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x1c,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x2e,0x00,0x00,0x18,0x2e,0x00,0x00,0x18,0x3a,0x00,0x00,0x18,0x40,0x00,0x00,0x18,0x4c,0x00,0x00,0x18,0x52,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x70,0x00,0x00, -0x18,0x76,0x00,0x00,0x18,0x82,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x4c,0x00,0x00,0x18,0x8e,0x00,0x00,0x18,0x3a,0x00,0x00,0x18,0x9a,0x00,0x00,0x18,0xa0,0x00,0x00,0x18,0x70,0x00,0x00,0x18,0xa6,0x00,0x00,0x18,0xac,0x00,0x00,0x18,0xb2,0x00,0x00,0x18,0xb8,0x00,0x00,0x18,0xbe,0x00,0x00,0x18,0xc4,0x00,0x00, -0x18,0xca,0x00,0x00,0x18,0xd6,0x00,0x00,0x18,0xdc,0x00,0x00,0x18,0xe2,0x00,0x00,0x18,0xe8,0x00,0x00,0x18,0xee,0x00,0x00,0x18,0xf4,0x00,0x00,0x18,0xfa,0x00,0x00,0x19,0x00,0x00,0x58,0x21,0xe8,0x21,0xee,0x21,0xf4,0x21,0xfa,0x21,0xe8,0x22,0x00,0x22,0x06,0x22,0x0c,0x22,0x12,0x22,0x18,0x22,0x1e,0x22,0x24,0x22,0x2a,0x22,0x30, -0x22,0x36,0x22,0x3c,0x22,0x42,0x22,0x36,0x22,0x48,0x22,0x4e,0x22,0x06,0x22,0x54,0x22,0x5a,0x22,0x0c,0x22,0x60,0x22,0x66,0x22,0x6c,0x22,0x72,0x22,0x78,0x22,0x7e,0x22,0x84,0x22,0x8a,0x22,0x90,0x22,0x96,0x22,0x90,0x22,0x84,0x22,0x9c,0x22,0xa2,0x22,0x42,0x22,0x42,0x22,0xa8,0x22,0xae,0x22,0xb4,0x22,0xba,0x22,0xc0,0x22,0xc6, -0x22,0x9c,0x22,0xcc,0x22,0xcc,0x22,0x84,0x22,0xd2,0x22,0xd8,0x22,0xde,0x22,0xe4,0x22,0xea,0x22,0xf0,0x22,0xf6,0x22,0xfc,0x23,0x02,0x23,0x08,0x23,0x0e,0x23,0x14,0x23,0x1a,0x23,0x20,0x23,0x26,0x23,0x2c,0x23,0x32,0x23,0x38,0x23,0x3e,0x23,0x44,0x23,0x4a,0x23,0x50,0x23,0x56,0x23,0x5c,0x22,0xe4,0x23,0x62,0x23,0x68,0x23,0x6e, -0x23,0x74,0x23,0x7a,0x23,0x80,0x23,0x86,0x23,0x8c,0x23,0x92,0x23,0x98,0x23,0x9e,0x23,0xa4,0x23,0xaa,0x00,0x02,0x00,0x1d,0x09,0x2c,0x09,0x2d,0x00,0x00,0x09,0x2f,0x09,0x30,0x00,0x02,0x09,0x32,0x09,0x33,0x00,0x04,0x09,0x37,0x09,0x37,0x00,0x06,0x09,0x73,0x09,0x75,0x00,0x07,0x09,0x7e,0x09,0x7e,0x00,0x0a,0x0a,0x0f,0x0a,0x13, -0x00,0x0b,0x0a,0x16,0x0a,0x19,0x00,0x10,0x0a,0x1b,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x15,0x0a,0x22,0x0a,0x22,0x00,0x17,0x0a,0x4b,0x0a,0x4f,0x00,0x18,0x0a,0x51,0x0a,0x53,0x00,0x1d,0x0a,0x65,0x0a,0x69,0x00,0x20,0x0a,0x6c,0x0a,0x6e,0x00,0x25,0x0a,0x70,0x0a,0x71,0x00,0x28,0x0e,0x1a,0x0e,0x1d,0x00,0x2a,0x0e,0x62, -0x0e,0x6a,0x00,0x2e,0x13,0x2a,0x13,0x2b,0x00,0x37,0x13,0x2d,0x13,0x2e,0x00,0x39,0x13,0x30,0x13,0x32,0x00,0x3b,0x13,0x36,0x13,0x37,0x00,0x3e,0x13,0x39,0x13,0x3b,0x00,0x40,0x13,0x3d,0x13,0x3e,0x00,0x43,0x13,0x41,0x13,0x44,0x00,0x45,0x13,0xe9,0x13,0xe9,0x00,0x49,0x14,0x17,0x14,0x17,0x00,0x4a,0x14,0x5d,0x14,0x61,0x00,0x4b, -0x14,0x63,0x14,0x6a,0x00,0x50,0x00,0x02,0x00,0x1d,0x09,0x2c,0x09,0x2d,0x00,0x00,0x09,0x2f,0x09,0x30,0x00,0x02,0x09,0x32,0x09,0x33,0x00,0x04,0x09,0x37,0x09,0x37,0x00,0x06,0x09,0x73,0x09,0x75,0x00,0x07,0x09,0x7e,0x09,0x7e,0x00,0x0a,0x0a,0x0f,0x0a,0x13,0x00,0x0b,0x0a,0x16,0x0a,0x19,0x00,0x10,0x0a,0x1b,0x0a,0x1b,0x00,0x14, -0x0a,0x1e,0x0a,0x1f,0x00,0x15,0x0a,0x22,0x0a,0x22,0x00,0x17,0x0a,0x4b,0x0a,0x4f,0x00,0x18,0x0a,0x51,0x0a,0x53,0x00,0x1d,0x0a,0x65,0x0a,0x69,0x00,0x20,0x0a,0x6c,0x0a,0x6e,0x00,0x25,0x0a,0x70,0x0a,0x71,0x00,0x28,0x0e,0x1a,0x0e,0x1d,0x00,0x2a,0x0e,0x62,0x0e,0x6a,0x00,0x2e,0x13,0x2a,0x13,0x2b,0x00,0x37,0x13,0x2d,0x13,0x2e, -0x00,0x39,0x13,0x30,0x13,0x32,0x00,0x3b,0x13,0x36,0x13,0x37,0x00,0x3e,0x13,0x39,0x13,0x3b,0x00,0x40,0x13,0x3d,0x13,0x3e,0x00,0x43,0x13,0x41,0x13,0x44,0x00,0x45,0x13,0xe9,0x13,0xe9,0x00,0x49,0x14,0x17,0x14,0x17,0x00,0x4a,0x14,0x5d,0x14,0x61,0x00,0x4b,0x14,0x63,0x14,0x6a,0x00,0x50,0x00,0x01,0x00,0x9a,0x01,0x10,0x00,0x01, -0x00,0x0c,0x00,0x6a,0x00,0x17,0x00,0x00,0x13,0xae,0x00,0x00,0x13,0xae,0x00,0x00,0x13,0xd8,0x00,0x00,0x13,0xe4,0x00,0x00,0x14,0x14,0x00,0x00,0x14,0x20,0x00,0x00,0x14,0x2c,0x00,0x00,0x14,0x50,0x00,0x00,0x14,0x6e,0x00,0x00,0x13,0xae,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xb0,0x00,0x00,0x14,0xc2,0x00,0x00, -0x14,0xda,0x00,0x00,0x14,0xe0,0x00,0x00,0x14,0xe6,0x00,0x00,0x14,0xf8,0x00,0x00,0x15,0x04,0x00,0x00,0x15,0x10,0x00,0x00,0x15,0x10,0x00,0x00,0x15,0x4c,0x00,0x00,0x15,0x82,0x00,0x17,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x42,0x21,0x4e,0x21,0x42,0x21,0x54,0x21,0x36,0x21,0x42,0x21,0x5a,0x21,0x60,0x21,0x66, -0x21,0x6c,0x21,0x72,0x21,0x78,0x21,0x7e,0x21,0x84,0x21,0x8a,0x21,0x8a,0x21,0x90,0x21,0x96,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06, -0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f,0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62, -0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06,0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f, -0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62,0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x01, -0x00,0x32,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x11,0x0e,0x00,0x0f,0x20,0x6e,0x20,0x74,0x20,0x7a,0x20,0x80,0x20,0x86,0x20,0x8c,0x20,0x92,0x20,0x98,0x20,0x9e,0x20,0xa4,0x20,0xaa,0x20,0xb0,0x20,0x7a,0x20,0xb6,0x20,0xbc,0x00,0x01,0x00,0x01,0x0b,0x5e,0x00,0x02,0x00,0x07,0x0a,0x43,0x0a,0x43,0x00,0x00, -0x0b,0x6f,0x0b,0x6f,0x00,0x01,0x0b,0x75,0x0b,0x75,0x00,0x02,0x0b,0x77,0x0b,0x77,0x00,0x03,0x0b,0x7a,0x0b,0x7a,0x00,0x04,0x0b,0x7d,0x0b,0x7d,0x00,0x05,0x0b,0x8d,0x0b,0x95,0x00,0x06,0x00,0x01,0x02,0xc8,0x02,0xe4,0x00,0x04,0x00,0x0c,0x00,0x46,0x00,0x0e,0x00,0x00,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x02, -0x10,0xa8,0x00,0x00,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x50,0x20,0x28,0x20,0x2e,0x20,0x34,0x20,0x3a,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x58,0x20,0x5e, -0x20,0x64,0x20,0x6a,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x20,0xb8,0x20,0xbe,0x20,0xc4,0x20,0xca,0x20,0xd0,0x20,0xd6,0x20,0xdc,0x20,0xe2,0x20,0xe8,0x20,0xee,0x20,0xf4,0x20,0xfa,0x21,0x00,0x21,0x06,0x21,0x0c,0x21,0x12,0x20,0xb8,0x20,0xbe, -0x20,0xc4,0x20,0xca,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x20,0xc4,0x21,0x78,0x21,0x7e,0x21,0x84,0x21,0x8a,0x21,0x90,0x21,0x42,0x21,0x96,0x21,0x9c,0x21,0xa2, -0x21,0xa8,0x21,0xae,0x21,0xb4,0x21,0xba,0x21,0x72,0x21,0xc0,0x21,0xc6,0x21,0xa8,0x21,0xcc,0x21,0xd2,0x21,0xd8,0x21,0xde,0x21,0xe4,0x21,0xea,0x21,0xf0,0x21,0xf6,0x21,0xfc,0x22,0x02,0x22,0x08,0x22,0x0e,0x21,0xc0,0x20,0x9a,0x22,0x14,0x22,0x1a,0x22,0x20,0x22,0x26,0x22,0x2c,0x22,0x32,0x22,0x38,0x22,0x3e,0x22,0x44,0x22,0x4a, -0x22,0x50,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x48,0x21,0x4e, -0x21,0x54,0x21,0x5a,0x22,0x86,0x22,0x8c,0x22,0x92,0x22,0x98,0x22,0x9e,0x22,0xa4,0x22,0xaa,0x22,0xb0,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x10,0x68,0x22,0xb6,0x20,0x9a,0x22,0xbc,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66, -0x21,0x6c,0x21,0x72,0x22,0x2c,0x22,0x32,0x22,0xc2,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x58,0x20,0x5e, -0x20,0x64,0x20,0x6a,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x22,0xc8,0x22,0xce,0x22,0xd4,0x22,0xda,0x22,0xe0,0x22,0xe6,0x22,0xec,0x20,0xdc,0x21,0x00,0x21,0x06,0x21,0x0c,0x21,0x12,0x22,0xc8,0x22,0xce,0x22,0xd4,0x22,0xda,0x21,0x18,0x21,0x1e, -0x21,0x24,0x21,0x2a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x21,0x8a,0x21,0x90,0x21,0x42,0x21,0x96,0x21,0x9c,0x21,0xa2,0x21,0xa8,0x21,0xae,0x21,0xc6,0x21,0xa8,0x21,0xcc,0x21,0xd2,0x21,0xd8,0x21,0xde,0x21,0xe4,0x21,0xea,0x22,0x08,0x22,0x0e, -0x21,0xc0,0x20,0x9a,0x22,0x14,0x22,0x1a,0x22,0x20,0x22,0x26,0x22,0x2c,0x22,0x32,0x22,0x38,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x20,0xb8,0x20,0xbe,0x20,0xc4,0x20,0xca,0x20,0x58,0x20,0x5e,0x20,0x64,0x20,0x6a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0xd8,0x21,0xde, -0x21,0xe4,0x21,0xea,0x22,0x9e,0x22,0xa4,0x22,0xaa,0x22,0xb0,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x00,0x02,0x00,0x04,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9, -0x00,0x0a,0x12,0x59,0x12,0x5b,0x00,0x0b,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00, -0x0d,0x9c,0x00,0x50,0x20,0x1a,0x1d,0x5c,0x1f,0xba,0x20,0x20,0x20,0x26,0x20,0x2c,0x20,0x32,0x20,0x38,0x20,0x3e,0x20,0x44,0x20,0x32,0x20,0x4a,0x20,0x50,0x20,0x56,0x20,0x3e,0x20,0x5c,0x20,0x32,0x20,0x62,0x1e,0xd6,0x20,0x68,0x20,0x6e,0x1e,0xd6,0x20,0x74,0x20,0x7a,0x20,0x5c,0x20,0x4a,0x20,0x80,0x20,0x86,0x20,0x32,0x20,0x32, -0x20,0x32,0x20,0x4a,0x20,0x4a,0x20,0x56,0x20,0x56,0x20,0x32,0x20,0x68,0x1d,0x5c,0x20,0x26,0x20,0x2c,0x20,0x50,0x20,0x56,0x20,0x3e,0x20,0x4a,0x20,0x86,0x20,0x80,0x20,0x8c,0x20,0x80,0x20,0x8c,0x1d,0x5c,0x1f,0xba,0x20,0x20,0x20,0x26,0x20,0x2c,0x20,0x92,0x20,0x6e,0x20,0x44,0x20,0x92,0x20,0x4a,0x20,0x50,0x20,0x56,0x20,0x5c, -0x20,0x62,0x1e,0xd6,0x20,0x6e,0x1e,0xd6,0x20,0x7a,0x20,0x5c,0x20,0x4a,0x20,0x80,0x20,0x86,0x20,0x98,0x20,0x9e,0x20,0xa4,0x20,0xaa,0x20,0x56,0x20,0xb0,0x20,0x9e,0x20,0xb6,0x20,0xbc,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f, -0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x04,0xda,0x05,0x14,0x00,0x07,0x00,0x0c,0x00,0x6a,0x00,0x17,0x00,0x01,0x0c,0xba,0x00,0x00,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x06,0x0c,0xba, -0x00,0x01,0x0c,0xba,0x00,0x04,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x03,0x0c,0xba,0x00,0x02,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x00,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x05,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x51,0x1f,0x88, -0x1f,0x8e,0x1f,0x94,0x1f,0x8e,0x1f,0x9a,0x1f,0xa0,0x1f,0xa6,0x1f,0xac,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x1f,0xc4,0x1f,0xc4,0x1f,0xca,0x1f,0xd0,0x1f,0xd6,0x1f,0xd0,0x1f,0xdc,0x1f,0xe2,0x1f,0xe2,0x1f,0xe8,0x1f,0xee,0x1f,0xf4,0x1f,0xee,0x1f,0xfa,0x20,0x00,0x20,0x06,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18, -0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x20,0x42,0x1e,0xf8,0x20,0x48,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x20,0x5a,0x1e,0x92,0x20,0x60,0x1e,0x92,0x20,0x66,0x20,0x6c,0x20,0x24,0x1d,0x78,0x1b,0xc8,0x20,0x72,0x1b,0xc8,0x20,0x78,0x20,0x7e,0x1d,0xf6,0x1f,0x28,0x20,0x84, -0x20,0x8a,0x20,0x84,0x20,0x90,0x20,0x96,0x20,0x7e,0x20,0x42,0x1e,0xf8,0x20,0x9c,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90,0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea, -0x20,0xf0,0x20,0xf6,0x20,0xfc,0x21,0x02,0x20,0xfc,0x21,0x08,0x20,0x7e,0x1d,0xf6,0x1f,0x88,0x21,0x0e,0x21,0x14,0x21,0x0e,0x21,0x1a,0x1c,0x7c,0x21,0x20,0x20,0x42,0x1e,0xf8,0x20,0x9c,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x21,0x26,0x21,0x2c,0x21,0x32,0x21,0x2c,0x21,0x38,0x21,0x3e,0x21,0x44,0x21,0x4a,0x21,0x50,0x21,0x56, -0x21,0x50,0x21,0x5c,0x1d,0x1e,0x21,0x62,0x21,0x68,0x21,0x6e,0x21,0x74,0x21,0x6e,0x21,0x7a,0x21,0x80,0x21,0x86,0x21,0x8c,0x1c,0x76,0x21,0x92,0x1c,0x76,0x21,0x98,0x1e,0x7a,0x21,0x9e,0x21,0x4a,0x21,0xa4,0x21,0xaa,0x21,0xa4,0x21,0xb0,0x1d,0x1e,0x21,0x62,0x21,0xb6,0x21,0xbc,0x21,0xc2,0x21,0xbc,0x21,0xc8,0x1e,0xf2,0x20,0x06, -0x21,0xce,0x21,0xd4,0x21,0xda,0x21,0xd4,0x21,0xe0,0x21,0xe6,0x21,0xec,0x21,0xf2,0x21,0xf8,0x21,0xfe,0x21,0xf8,0x22,0x04,0x1c,0x7c,0x20,0x3c,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1f,0x34,0x22,0x0a,0x22,0x10,0x22,0x0a,0x22,0x16,0x22,0x1c,0x21,0xe6,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22, -0x22,0x2e,0x21,0x20,0x1c,0x7c,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xbc, -0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x22,0x46,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x22,0x4c,0x22,0x52,0x22,0x46,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x22,0x4c,0x22,0x52,0x20,0x42,0x22,0x58,0x22,0x5e,0x22,0x58,0x22,0x64,0x20,0x7e,0x1d,0xf6,0x21,0x68,0x21,0x6e,0x21,0x74,0x21,0x6e,0x21,0x7a, -0x21,0x80,0x21,0x86,0x1f,0xac,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x1f,0xc4,0x1f,0xc4,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18,0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90,0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2, -0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea,0x20,0xf0,0x20,0xf6,0x20,0xfc,0x21,0x02,0x20,0xfc,0x21,0x08,0x20,0x7e,0x1d,0xf6,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22,0x22,0x2e,0x21,0x20,0x1c,0x7c,0x1f,0x34,0x22,0x0a,0x22,0x6a,0x22,0x70,0x22,0x76,0x22,0x1c, -0x21,0xe6,0x22,0x7c,0x22,0x0a,0x22,0x10,0x22,0x82,0x22,0x16,0x22,0x88,0x22,0x8e,0x1f,0x34,0x22,0x0a,0x22,0x6a,0x22,0x70,0x22,0x76,0x22,0x1c,0x21,0xe6,0x22,0x7c,0x22,0x0a,0x22,0x10,0x22,0x82,0x22,0x16,0x22,0x88,0x22,0x8e,0x22,0x94,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x22,0x9a,0x22,0x9a,0x1f,0xca,0x1f,0xd0,0x1f,0xd6, -0x1f,0xd0,0x1f,0xdc,0x22,0xa0,0x1f,0xe2,0x1f,0xe8,0x1f,0xee,0x1f,0xf4,0x1f,0xee,0x1f,0xfa,0x20,0x00,0x20,0x06,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18,0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x1e,0xe6,0x1f,0x58,0x22,0xa6,0x1f,0x58,0x22,0xac,0x22,0xb2,0x22,0xb8, -0x22,0xbe,0x22,0xc4,0x21,0x32,0x22,0xc4,0x1c,0x16,0x1d,0x5a,0x21,0x44,0x1f,0x28,0x20,0x84,0x20,0x8a,0x20,0x84,0x20,0x90,0x20,0x96,0x20,0x7e,0x1e,0xe6,0x1f,0x58,0x22,0xa6,0x1f,0x58,0x22,0xac,0x22,0xb2,0x22,0xb8,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90, -0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea,0x20,0xf0,0x1f,0x88,0x21,0x0e,0x21,0x14,0x21,0x0e,0x21,0x1a,0x1c,0x7c,0x21,0x20,0x21,0x26,0x21,0x2c,0x21,0x32,0x21,0x2c,0x21,0x38,0x21,0x3e,0x21,0x44,0x21,0x4a,0x21,0x50,0x21,0x56,0x21,0x50,0x21,0x5c,0x1d,0x1e,0x21,0x62,0x21,0x8c, -0x1c,0x76,0x21,0x92,0x1c,0x76,0x21,0x98,0x1e,0x7a,0x21,0x9e,0x21,0x4a,0x21,0xa4,0x21,0xaa,0x21,0xa4,0x21,0xb0,0x1d,0x1e,0x21,0x62,0x21,0xce,0x21,0xd4,0x21,0xda,0x21,0xd4,0x21,0xe0,0x21,0xe6,0x21,0xec,0x21,0xf2,0x21,0xf8,0x21,0xfe,0x21,0xf8,0x22,0x04,0x1c,0x7c,0x20,0x3c,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae, -0x20,0xb4,0x20,0xb4,0x1f,0x34,0x22,0x0a,0x22,0x10,0x22,0x0a,0x22,0x16,0x22,0x1c,0x21,0xe6,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22,0x22,0x2e,0x21,0x20,0x1c,0x7c,0x22,0xca,0x20,0xea,0x22,0xd0,0x22,0xd6,0x22,0xdc,0x22,0xe2,0x22,0xe8,0x22,0xee,0x22,0xf4,0x22,0xfa,0x22,0xf4,0x23,0x00,0x23,0x06,0x1e,0x98,0x23,0x0c,0x23,0x12, -0x23,0x18,0x23,0x12,0x23,0x1e,0x23,0x24,0x23,0x2a,0x23,0x30,0x23,0x36,0x23,0x3c,0x23,0x36,0x21,0xb0,0x22,0xbe,0x23,0x42,0x20,0xcc,0x23,0x48,0x23,0x4e,0x23,0x54,0x23,0x5a,0x20,0xea,0x20,0xf0,0x23,0x60,0x23,0x66,0x1b,0xc8,0x23,0x66,0x23,0x6c,0x23,0x72,0x1c,0x34,0x23,0x78,0x23,0x7e,0x23,0x84,0x23,0x7e,0x23,0x8a,0x23,0x90, -0x23,0x96,0x22,0xee,0x22,0xf4,0x22,0xfa,0x22,0xf4,0x23,0x00,0x23,0x06,0x1e,0x98,0x23,0x9c,0x23,0xa2,0x23,0xa8,0x23,0xa2,0x20,0x36,0x23,0xae,0x23,0xb4,0x1e,0xec,0x23,0xba,0x23,0xc0,0x23,0xba,0x22,0x2e,0x20,0xc6,0x1c,0x7c,0x00,0x02,0x00,0x09,0x0b,0x61,0x0b,0x61,0x00,0x00,0x0b,0xc0,0x0b,0xc3,0x00,0x01,0x0b,0xc5,0x0b,0xc7, -0x00,0x05,0x0b,0xca,0x0b,0xcf,0x00,0x08,0x0b,0xd6,0x0b,0xd7,0x00,0x0e,0x0b,0xd9,0x0b,0xda,0x00,0x10,0x0b,0xdc,0x0b,0xdd,0x00,0x12,0x0b,0xe1,0x0b,0xe1,0x00,0x14,0x12,0x5c,0x12,0x5d,0x00,0x15,0x00,0x02,0x00,0x07,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a, -0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x0b,0xdf,0x0b,0xdf,0x00,0x4c,0x12,0x5f,0x12,0x62,0x00,0x4d,0x00,0x01,0x01,0x88,0x01,0xbc,0x00,0x02,0x00,0x0c,0x00,0x46,0x00,0x0e,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00, -0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x50,0x1a,0x70,0x1a,0x7c,0x1e,0xa8,0x1e,0xae,0x1e,0xb4,0x1e,0xba,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x19,0xda,0x1b,0x30,0x1c,0x1a,0x1e,0xd8,0x16,0xaa,0x1e,0xde, -0x1e,0xe4,0x1e,0xea,0x19,0xda,0x1b,0x30,0x1e,0xf0,0x1e,0xf6,0x18,0xea,0x1c,0xaa,0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x08,0x1b,0xf0,0x1f,0x0e,0x1f,0x14,0x1f,0x1a,0x1c,0x0e,0x17,0x5e,0x1c,0x32,0x1f,0x20,0x1f,0x26,0x1f,0x2c,0x1f,0x32,0x1f,0x38,0x1f,0x3e,0x1f,0x44,0x1f,0x4a,0x1c,0x50,0x1f,0x50,0x1f,0x56,0x1c,0xda,0x1f,0x5c, -0x1f,0x62,0x1f,0x02,0x1f,0x68,0x1f,0x6e,0x1f,0x74,0x1f,0x7a,0x1d,0x16,0x1f,0x80,0x1d,0x16,0x1f,0x80,0x1d,0x16,0x1f,0x80,0x1e,0xf0,0x1e,0xf6,0x1e,0xf0,0x1e,0xf6,0x1e,0xfc,0x1f,0x02,0x1e,0xfc,0x1f,0x02,0x1d,0x3a,0x1f,0x86,0x1f,0x8c,0x1f,0x2c,0x1e,0xa8,0x1e,0xae,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1f,0x92,0x1f,0x98,0x1c,0xaa, -0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x9e,0x1f,0x62,0x1f,0x02,0x1f,0x74,0x1f,0x7a,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1e,0xa8,0x1e,0xae,0x1e,0xb4,0x1e,0xba,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x1a,0x3a,0x1d,0x8e,0x18,0xf0,0x17,0x5e,0x1e,0xe4,0x1e,0xea, -0x1a,0x3a,0x1d,0x8e,0x1e,0xf0,0x1e,0xf6,0x18,0xea,0x1c,0xaa,0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x0e,0x1c,0x0e,0x17,0x5e,0x1c,0x32,0x1f,0x20,0x1f,0x32,0x1f,0x38,0x1f,0x3e,0x1f,0x44,0x1f,0x50,0x1f,0x56,0x1c,0xda,0x1f,0x5c,0x1f,0x62,0x1f,0x02,0x1f,0x68,0x1f,0x6e,0x1f,0x74,0x1f,0x7a,0x19,0xda,0x1b,0x30,0x1e,0xb4,0x1e,0xba, -0x18,0xea,0x1c,0xaa,0x1f,0x3e,0x1f,0x44,0x1f,0x8c,0x1f,0xa4,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x1f,0x74,0x1f,0x7a,0x00,0x02,0x00,0x08,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc8,0x0b,0xc9,0x00,0x04,0x0b,0xd0, -0x0b,0xd5,0x00,0x06,0x0b,0xd8,0x0b,0xd8,0x00,0x0c,0x0b,0xdb,0x0b,0xdb,0x00,0x0d,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x40,0x00,0x56,0x00,0x01, -0x00,0x0c,0x00,0x3a,0x00,0x0b,0x00,0x00,0x05,0x94,0x00,0x00,0x1e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x05,0x94,0x00,0x00,0x18,0x2a,0x00,0x00,0x18,0x2a,0x00,0x00,0x1e,0x06,0x00,0x00,0x1e,0x06,0x00,0x00,0x17,0x46,0x00,0x00,0x1e,0x06,0x00,0x02,0x1d,0xde,0x16,0x70,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b, -0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x01,0x00,0xb4,0x00,0xe8,0x00,0x04,0x00,0x0c,0x00,0x42,0x00,0x0d,0x00,0x00,0x05,0x36,0x00,0x00,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x03,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x01,0x05,0x36, -0x00,0x01,0x1d,0xb4,0x00,0x01,0x05,0x36,0x00,0x02,0x05,0x36,0x00,0x01,0x1d,0xba,0x00,0x01,0x05,0x36,0x00,0x03,0x1d,0xc0,0x00,0x0e,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x17,0xa2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x15,0xf2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xa2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xa8,0x1d,0x90,0x1d,0x96,0x1d,0x9c, -0x17,0xa2,0x1d,0x90,0x1d,0xae,0x1d,0x9c,0x1d,0xb4,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xb4,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0x90,0x1d,0xae,0x1d,0x9c,0x1d,0xba,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0xc0,0x1d,0xae,0x1d,0xc6,0x1d,0x06,0x1d,0xc0,0x1d,0xcc,0x1d,0xc6, -0x1a,0x84,0x1d,0xc0,0x1d,0xcc,0x1d,0xc6,0x1a,0x84,0x00,0x02,0x00,0x08,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc8,0x0b,0xc9,0x00,0x04,0x0b,0xd1,0x0b,0xd5,0x00,0x06,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x0b,0xdb,0x0b,0xdb,0x00,0x0c,0x00,0x02, -0x00,0x04,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x12,0x59,0x12,0x5b,0x00,0x0b,0x00,0x01,0x00,0x78,0x00,0x8e,0x00,0x02,0x00,0x0c,0x00,0x1e,0x00,0x04,0x00,0x00,0x04,0x32,0x00,0x00,0x04,0x32,0x00,0x01,0x04,0x32,0x00,0x01,0x04,0x32,0x00,0x16,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2, -0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0x98,0x1c,0xfe,0x1c,0xf2,0x1c,0xf8,0x1d,0x04,0x1d,0x0a,0x1d,0x04,0x1d,0x10,0x1d,0x16,0x1d,0x10,0x1d,0x1c,0x1d,0x22,0x1d,0x28,0x1d,0x2e,0x1d,0x28, -0x1d,0x34,0x1d,0x3a,0x1c,0xfe,0x1d,0x40,0x1d,0x46,0x1d,0x4c,0x1d,0x52,0x1d,0x04,0x1d,0x22,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x57,0x0b,0x58,0x00,0x01,0x0b,0x5a,0x0b,0x5a,0x00,0x03,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x67,0x0b,0x67,0x00,0x0a,0x0b,0xb9, -0x0b,0xb9,0x00,0x0b,0x0b,0xbf,0x0b,0xbf,0x00,0x0c,0x0b,0xc4,0x0b,0xc4,0x00,0x0d,0x0b,0xc9,0x0b,0xc9,0x00,0x0e,0x0b,0xd0,0x0b,0xd5,0x00,0x0f,0x0b,0xd8,0x0b,0xd8,0x00,0x15,0x00,0x01,0x00,0x70,0x00,0x9e,0x00,0x02,0x00,0x0c,0x00,0x3e,0x00,0x0c,0x00,0x00,0x1b,0xe8,0x00,0x00,0x03,0x6a,0x00,0x00,0x16,0xf6,0x00,0x00,0x1c,0xa2, -0x00,0x00,0x1c,0xa2,0x00,0x00,0x1c,0xa2,0x00,0x00,0x1c,0xa8,0x00,0x00,0x1c,0xa8,0x00,0x00,0x1c,0xa2,0x00,0x01,0x03,0x6a,0x00,0x00,0x1c,0xae,0x00,0x00,0x1c,0xa2,0x00,0x0c,0x1c,0x82,0x1c,0x52,0x1c,0x88,0x1c,0x2e,0x1c,0x8e,0x1c,0x94,0x1c,0x8e,0x1c,0x10,0x1c,0x8e,0x1c,0x10,0x1c,0x8e,0x1c,0x9a,0x14,0x42,0x1c,0xa0,0x1c,0xa6, -0x1c,0xac,0x1c,0x8e,0x1c,0xa0,0x1c,0xb2,0x1c,0xb8,0x14,0x42,0x1c,0xbe,0x1c,0x8e,0x1c,0x9a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b, -0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x7c,0x00,0xb6,0x00,0x01,0x00,0x0c,0x00,0x56,0x00,0x12,0x00,0x00,0x1b,0x1c, -0x00,0x00,0x1a,0x74,0x00,0x00,0x02,0x9e,0x00,0x00,0x1c,0x2a,0x00,0x00,0x17,0xf8,0x00,0x00,0x1c,0x2a,0x00,0x00,0x16,0x2a,0x00,0x00,0x1c,0x30,0x00,0x00,0x1b,0xe2,0x00,0x00,0x15,0xac,0x00,0x00,0x02,0x9e,0x00,0x00,0x02,0x9e,0x00,0x00,0x1c,0x2a,0x00,0x00,0x02,0x9e,0x00,0x00,0x1b,0xe2,0x00,0x00,0x1c,0x36,0x00,0x00,0x1b,0x1c, -0x00,0x00,0x1c,0x36,0x00,0x12,0x1b,0x6e,0x1b,0x80,0x1b,0xf2,0x1b,0x38,0x1b,0xf8,0x1b,0xc8,0x1b,0xfe,0x1c,0x04,0x1c,0x0a,0x1c,0x0a,0x1c,0x0a,0x1c,0x10,0x1b,0x6e,0x1b,0x4a,0x1b,0xc8,0x1b,0xfe,0x1b,0x80,0x1b,0xd4,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05, -0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06, -0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x01,0x00,0x1a,0x00,0x22,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x01,0xae,0x00,0x00,0x01,0xae,0x00,0x01,0x1b,0x66,0x00,0x01,0x00,0x02,0x0b,0x63,0x0b,0x64, -0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x01,0x04,0x04,0xb0,0x00,0x01,0x01,0x13,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0xb0,0x00,0x01,0x00,0x00,0x05,0x64,0x00,0x01,0xff,0xce,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x88,0x00,0x01,0x00,0x46,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x60,0x00,0x01,0x00,0x00,0x03,0xde,0x00,0x01,0x00,0x00, -0x03,0xe8,0x00,0x01,0x00,0x00,0x04,0x7e,0x00,0x01,0x00,0x00,0x04,0xec,0x00,0x01,0x00,0x00,0xff,0xec,0x00,0x01,0x00,0x1e,0x04,0xb0,0x00,0x01,0x01,0x93,0x04,0xb0,0x00,0x01,0x01,0xa6,0x04,0xb0,0x00,0x01,0x01,0xa8,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x6f,0x00,0x01,0x00,0x00,0x04,0xa6,0x00,0x01,0x00,0x0f,0x04,0x7e,0x00,0x01, -0xff,0xf1,0x04,0x7e,0x00,0x01,0x00,0x00,0x04,0xc4,0x00,0x01,0x01,0xd9,0x04,0xba,0x00,0x01,0x01,0xd9,0x03,0xca,0x00,0x01,0x02,0x07,0x04,0x74,0x00,0x01,0x01,0x53,0x04,0x06,0x00,0x01,0x01,0x18,0x06,0x77,0x00,0x01,0x00,0xe1,0x06,0x08,0x00,0x01,0x01,0x0e,0x06,0x08,0x00,0x01,0x00,0x00,0x06,0x5e,0x00,0x01,0x00,0x00,0x05,0xdc, -0x00,0x01,0x00,0x00,0x05,0x7f,0x00,0x01,0x00,0x00,0x06,0x3c,0x00,0x01,0x00,0x00,0x06,0x0e,0x00,0x01,0x00,0x00,0x05,0xd5,0x00,0x01,0x00,0x00,0x05,0xd7,0x00,0x01,0x00,0x00,0x06,0x6c,0x00,0x01,0x00,0x00,0x06,0x50,0x00,0x01,0x00,0x00,0x06,0x5c,0x00,0x01,0x00,0x00,0x06,0xb8,0x00,0x01,0x00,0x00,0x06,0x73,0x00,0x01,0x00,0x00, -0x05,0xf0,0x00,0x01,0x00,0x00,0x06,0xb5,0x00,0x01,0x00,0x00,0x07,0x6c,0x00,0x01,0x00,0x00,0x07,0x54,0x00,0x01,0x00,0x00,0x01,0x4d,0x00,0x01,0x00,0x00,0x06,0x3a,0x00,0x01,0x00,0x00,0x06,0x40,0x00,0x01,0x00,0x00,0x06,0xc4,0x00,0x01,0x00,0x00,0x07,0xb2,0x00,0x01,0x00,0x00,0x06,0xf0,0x00,0x01,0x01,0x93,0x06,0x22,0x00,0x01, -0x01,0xa6,0x06,0x18,0x00,0x01,0x01,0xa8,0x06,0x4a,0x00,0x01,0x00,0x00,0x06,0xfe,0x00,0x01,0x00,0x00,0x07,0xda,0x00,0x01,0x00,0x00,0x07,0xe4,0x00,0x01,0x00,0x00,0x07,0x80,0x00,0x01,0x00,0x00,0x06,0xa8,0x00,0x01,0x00,0x00,0x06,0x54,0x00,0x01,0x00,0x00,0x06,0xc2,0x00,0x01,0x00,0x00,0x06,0x27,0x00,0x01,0x01,0xd9,0x06,0x5a, -0x00,0x01,0x01,0xd9,0x05,0x80,0x00,0x01,0x02,0x07,0x06,0x22,0x00,0x01,0x01,0x53,0x06,0xc9,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x41,0x00,0x01,0x00,0x0a,0x00,0x41,0x00,0x01,0x00,0x0f,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x41,0x00,0x01,0xff,0xfb,0x00,0x32,0x00,0x01,0x00,0x00, -0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0xff,0xc9,0x00,0x01,0x00,0x00,0xff,0xe2,0x00,0x01,0xff,0xf1,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0xff,0xa6,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x82,0x00,0x01,0x00,0x00,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01, -0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0xd9,0x00,0x82,0x00,0x01,0x02,0x80,0x00,0x82,0x00,0x01,0x01,0x54,0xfe,0xc0,0x00,0x01,0x00,0x00,0xfe,0x48,0x00,0x01,0x00,0x00,0xfe,0x5c,0x00,0x01,0xff,0xfb,0xff,0x4c,0x00,0x01,0x00,0x00,0xfe,0xc0, -0x00,0x01,0x00,0x00,0xfe,0x7a,0x00,0x01,0x00,0x00,0xfe,0x20,0x00,0x01,0x00,0x00,0xfe,0xb6,0x00,0x01,0x00,0x00,0xfe,0x84,0x00,0x01,0x00,0x00,0xff,0x10,0x00,0x01,0x00,0x00,0xfe,0xa2,0x00,0x01,0x00,0x00,0xff,0x56,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x01,0x00,0x00,0xfd,0xf8,0x00,0x01,0x00,0x00,0xfe,0x16,0x00,0x01,0x00,0x00, -0xfe,0x3e,0x00,0x01,0x01,0xa9,0xfe,0xa2,0x00,0x01,0x00,0x00,0xfe,0x0c,0x00,0x01,0x00,0xd9,0xfe,0x02,0x00,0x01,0x02,0x80,0xfe,0x02,0x00,0x01,0x03,0x16,0x06,0x0e,0x00,0x01,0x02,0x67,0x04,0xb0,0x00,0x01,0x01,0x03,0x06,0x7c,0x00,0x01,0x00,0x7e,0x06,0x73,0x00,0x01,0x01,0x03,0xff,0x71,0x00,0x01,0x01,0x03,0x06,0x5e,0x00,0x01, -0x00,0xc4,0x06,0x73,0x00,0x01,0x01,0x03,0x06,0x76,0x00,0x01,0x01,0x03,0x06,0x62,0x00,0x01,0x01,0x03,0x06,0x1d,0x00,0x01,0x00,0xef,0x06,0x71,0x00,0x01,0x00,0xb2,0xff,0x6b,0x00,0x01,0x00,0xf5,0x06,0x7c,0x00,0x01,0x01,0x03,0xff,0x6b,0x00,0x01,0x00,0xe9,0x06,0x1e,0x00,0x01,0x01,0x03,0x06,0x70,0x00,0x01,0x00,0xec,0x06,0x1f, -0x00,0x01,0x01,0x03,0x06,0x8f,0x00,0x01,0x01,0x03,0x06,0x7b,0x00,0x01,0x01,0x03,0x06,0x71,0x00,0x01,0x01,0x1f,0x06,0x65,0x00,0x01,0x00,0xec,0x00,0x05,0x00,0x01,0x01,0x0c,0x06,0x70,0x00,0x01,0x01,0x03,0xff,0xc1,0x00,0x01,0x01,0x03,0x06,0x35,0x00,0x01,0x01,0x1f,0x00,0x34,0x00,0x01,0x00,0xf9,0x06,0x55,0x00,0x01,0x00,0xeb, -0x06,0x55,0x00,0x01,0x01,0x11,0x06,0x1f,0x00,0x01,0x01,0x1c,0x06,0x1f,0x00,0x01,0x00,0xf3,0x06,0x71,0x00,0x01,0x01,0x03,0xff,0x7e,0x00,0x01,0x00,0xf9,0x06,0x7c,0x00,0x01,0x01,0x03,0x05,0x16,0x00,0x01,0x01,0x03,0x05,0x20,0x00,0x01,0x01,0x03,0x05,0x28,0x00,0x01,0x01,0x03,0xff,0x69,0x00,0x01,0x01,0x42,0x06,0x73,0x00,0x01, -0x01,0x03,0x06,0x67,0x00,0x01,0x00,0xf8,0x06,0x1d,0x00,0x01,0x00,0xd7,0x06,0x1f,0x00,0x01,0x00,0xe1,0x06,0x7a,0x00,0x01,0x01,0x03,0x06,0x60,0x00,0x01,0x01,0x03,0x05,0x26,0x00,0x01,0x00,0xfa,0x05,0x26,0x00,0x01,0x01,0x03,0x00,0xc1,0x00,0x01,0x01,0x18,0x06,0x72,0x00,0x01,0x00,0xfa,0xff,0xce,0x00,0x01,0x01,0x40,0x06,0x72, -0x00,0x01,0x01,0x7c,0x06,0x72,0x00,0x01,0x01,0x2c,0xff,0xce,0x00,0x01,0x00,0xc8,0x06,0x72,0x00,0x01,0x01,0x68,0x06,0x72,0x00,0x01,0x00,0xfa,0x06,0x72,0x00,0x01,0x00,0xbe,0xff,0x74,0x00,0x01,0x01,0x5e,0xff,0x74,0x00,0x01,0x00,0xc8,0xff,0x74,0x00,0x01,0x01,0x2c,0x06,0x72,0x00,0x01,0x01,0xe0,0x06,0x72,0x00,0x01,0x01,0x7c, -0xff,0x74,0x00,0x01,0x00,0xdc,0x06,0x72,0x00,0x01,0x01,0x04,0xff,0x74,0x00,0x01,0x00,0xa0,0x06,0x72,0x00,0x01,0x00,0x8c,0xff,0x4c,0x00,0x01,0x02,0x80,0x06,0x72,0x00,0x01,0x01,0x4a,0x06,0x72,0x00,0x01,0x01,0x03,0x03,0xb8,0x00,0x01,0x00,0xfa,0x06,0x5e,0x00,0x01,0x02,0x5a,0x06,0x71,0x00,0x01,0x01,0x05,0x06,0x1f,0x00,0x01, -0x00,0xdd,0x06,0x1e,0x00,0x01,0x00,0xfa,0x06,0x71,0x00,0x01,0x01,0x03,0x05,0xd1,0x00,0x01,0x01,0x03,0xff,0x90,0x00,0x01,0x00,0x1d,0x07,0x1d,0x00,0x01,0xff,0x8e,0x07,0x1d,0x00,0x01,0xff,0x97,0x07,0x1d,0x00,0x01,0xff,0x47,0x07,0x1d,0x00,0x01,0xff,0x79,0x07,0x1d,0x00,0x01,0xff,0xcd,0x07,0x1d,0x00,0x01,0x01,0x7a,0x06,0x71, -0x00,0x01,0x01,0x93,0x06,0x71,0x00,0x01,0xff,0xda,0x00,0x0c,0x00,0x01,0x00,0xfa,0x06,0x1e,0x00,0x01,0x00,0xfa,0xff,0x5c,0x00,0x01,0x00,0xfa,0x08,0x1b,0x00,0x01,0x00,0xfa,0x07,0x62,0x00,0x01,0x00,0xfa,0xfd,0xcc,0x00,0x01,0x00,0xfa,0x04,0x09,0x00,0x01,0x01,0x2c,0xfe,0x42,0x00,0x01,0x01,0x90,0x05,0x48,0x00,0x01,0x00,0xfa, -0xff,0x2a,0x00,0x01,0x01,0x90,0x06,0x2e,0x00,0x01,0x01,0xf4,0x04,0x09,0x00,0x01,0x02,0x26,0xfe,0x42,0x00,0x01,0x02,0x0e,0x04,0x4e,0x00,0x01,0x02,0xa4,0xfd,0xcd,0x00,0x01,0x02,0x26,0xff,0x2a,0x00,0x01,0x01,0xf4,0x04,0xf7,0x00,0x01,0x02,0x0e,0x05,0x3e,0x00,0x01,0x01,0xc2,0x04,0x3b,0x00,0x01,0x02,0x58,0xff,0x2a,0x00,0x01, -0x01,0x5e,0x04,0x89,0x00,0x01,0x01,0x2c,0x03,0xd2,0x00,0x01,0x02,0xbc,0xff,0x22,0x00,0x01,0x01,0xc2,0x04,0xb6,0x00,0x01,0x01,0xf4,0xff,0x2a,0x00,0x01,0x01,0xf4,0x04,0x8a,0x00,0x01,0x01,0xf5,0x04,0x5d,0x00,0x01,0x02,0x8b,0xfd,0xcd,0x00,0x01,0x01,0xc2,0x05,0x48,0x00,0x01,0x01,0xf4,0x05,0x16,0x00,0x01,0x01,0xf5,0x05,0x65, -0x00,0x01,0x01,0x90,0x05,0x88,0x00,0x01,0x01,0x90,0xff,0x2a,0x00,0x01,0x01,0xc2,0x05,0x88,0x00,0x01,0x00,0xfa,0x05,0x9e,0x00,0x01,0x01,0x5e,0xff,0x2a,0x00,0x01,0x01,0x5e,0x06,0x1e,0x00,0x01,0x01,0x2c,0xff,0x2a,0x00,0x01,0x01,0x4a,0x03,0xdb,0x00,0x01,0x02,0x44,0xfe,0xf8,0x00,0x01,0x01,0x5e,0x05,0x48,0x00,0x01,0x01,0x7f, -0x04,0xe9,0x00,0x01,0x02,0x79,0xff,0x2a,0x00,0x01,0x01,0xc5,0x04,0x50,0x00,0x01,0x03,0x55,0xfd,0xcd,0x00,0x01,0x01,0xff,0x04,0x9f,0x00,0x01,0x02,0x31,0xff,0x2a,0x00,0x01,0x01,0x40,0xfe,0x42,0x00,0x01,0x01,0xc6,0x03,0x3f,0x00,0x01,0x00,0x64,0xfe,0xff,0x00,0x01,0x01,0xff,0x05,0xc8,0x00,0x01,0x01,0xf8,0xfe,0x9e,0x00,0x01, -0x01,0x5e,0x05,0xd4,0x00,0x01,0x01,0xae,0x04,0xb7,0x00,0x01,0x01,0xe0,0xfe,0x9e,0x00,0x01,0x01,0x22,0x03,0x7c,0x00,0x01,0x01,0x81,0xff,0x38,0x00,0x01,0x00,0xfa,0xff,0x9c,0x00,0x01,0x01,0x90,0x05,0xa2,0x00,0x01,0x01,0x90,0xfd,0xcd,0x00,0x01,0x01,0xae,0x05,0x62,0x00,0x01,0x01,0xe0,0xfe,0xf1,0x00,0x01,0x02,0x3b,0x03,0xd7, -0x00,0x01,0x01,0x73,0xff,0x0a,0x00,0x01,0x01,0xa5,0x05,0xc1,0x00,0x01,0x02,0x09,0xff,0x22,0x00,0x01,0x02,0x3b,0x05,0x48,0x00,0x01,0x01,0xd7,0xff,0x22,0x00,0x01,0x01,0x73,0x05,0x02,0x00,0x01,0x01,0x1a,0x04,0x82,0x00,0x01,0x01,0xb0,0xff,0x22,0x00,0x01,0x01,0x1a,0x05,0xc1,0x00,0x01,0x01,0x90,0x03,0x26,0x00,0x01,0x01,0x2c, -0xfd,0xcd,0x00,0x01,0x01,0x90,0x04,0x6b,0x00,0x01,0x02,0x8f,0x03,0xd7,0x00,0x01,0x06,0x13,0xff,0x2b,0x00,0x01,0x02,0x8f,0x03,0xd2,0x00,0x01,0x06,0xdb,0xff,0x2b,0x00,0x01,0x03,0xe8,0x05,0x24,0x00,0x01,0x02,0xee,0xff,0x22,0x00,0x01,0x01,0x91,0x04,0xf2,0x00,0x01,0x01,0x91,0x05,0xf3,0x00,0x01,0x00,0x96,0x02,0x29,0x00,0x01, -0x00,0x96,0xfe,0x62,0x00,0x01,0x02,0x9f,0x04,0x2a,0x00,0x01,0x02,0x3b,0xff,0x22,0x00,0x01,0x01,0x31,0x04,0x79,0x00,0x01,0x02,0xc1,0xfd,0xcd,0x00,0x01,0x02,0x3b,0x05,0x24,0x00,0x01,0x03,0x03,0xff,0x22,0x00,0x01,0x01,0xc7,0x05,0x24,0x00,0x01,0x02,0x8f,0xfe,0x48,0x00,0x01,0x01,0x33,0x03,0x81,0x00,0x01,0x02,0x5f,0xff,0x2b, -0x00,0x01,0x02,0x5d,0x04,0x24,0x00,0x01,0x02,0x8f,0xfd,0xcd,0x00,0x01,0x01,0xa5,0x04,0x96,0x00,0x01,0x01,0xc2,0x03,0xe3,0x00,0x01,0x01,0xc6,0x04,0x15,0x00,0x01,0x01,0xf8,0xfe,0xf1,0x00,0x01,0x00,0x64,0xff,0x27,0x00,0x01,0x01,0x90,0x04,0x5c,0x00,0x01,0x01,0x41,0xff,0x27,0x00,0x01,0x01,0x72,0xfd,0x97,0x00,0x01,0x02,0x26, -0xfd,0x97,0x00,0x01,0x01,0x90,0x05,0x83,0x00,0x01,0x01,0xd7,0x04,0xa4,0x00,0x01,0x03,0x67,0xff,0x22,0x00,0x01,0x01,0xd7,0x05,0x76,0x00,0x01,0x00,0xfa,0x06,0xa2,0x00,0x01,0x01,0xff,0x06,0x7d,0x00,0x01,0x01,0xa5,0x06,0x76,0x00,0x01,0x01,0x73,0x04,0x8d,0x00,0x01,0x01,0x5e,0x06,0x96,0x00,0x01,0x00,0xe8,0x07,0x41,0x00,0x01, -0x01,0x5e,0x06,0x1d,0x00,0x01,0x02,0x5d,0x02,0xed,0x00,0x01,0x01,0xa5,0x04,0xc8,0x00,0x01,0x00,0xfa,0xfd,0xd8,0x00,0x01,0x01,0x5e,0x03,0x2d,0x00,0x01,0x01,0x90,0xfd,0xc8,0x00,0x01,0x01,0x6c,0x03,0xf1,0x00,0x01,0x02,0x66,0xff,0x22,0x00,0x01,0x01,0x6c,0x01,0x2f,0x00,0x01,0x02,0x66,0xfd,0xf6,0x00,0x01,0x01,0x6c,0x05,0xa2, -0x00,0x01,0x01,0x6c,0x03,0xa1,0x00,0x01,0x02,0x9f,0x04,0xf2,0x00,0x01,0x01,0xc2,0x06,0xa0,0x00,0x01,0x01,0x83,0x02,0xe7,0x00,0x01,0x02,0x19,0xff,0x19,0x00,0x01,0x01,0xf9,0x03,0x7f,0x00,0x01,0x00,0xfa,0x08,0x1a,0x00,0x01,0x00,0x96,0xfd,0xcc,0x00,0x01,0x01,0xc2,0x05,0xa2,0x00,0x01,0x01,0xa9,0x05,0xc7,0x00,0x01,0x01,0x77, -0xfd,0xcd,0x00,0x01,0x01,0xc6,0x04,0x8b,0x00,0x01,0x01,0xc6,0x03,0x4a,0x00,0x01,0x01,0x73,0x04,0x9e,0x00,0x01,0x01,0x73,0xff,0x27,0x00,0x01,0x01,0x5e,0xfd,0x97,0x00,0x01,0x01,0xd7,0xff,0x20,0x00,0x01,0x00,0xfa,0xfe,0xa1,0x00,0x01,0x01,0x41,0x04,0x9e,0x00,0x01,0x02,0x0e,0x05,0xf3,0x00,0x01,0x01,0xf4,0x05,0x7a,0x00,0x01, -0x02,0x0e,0x06,0x56,0x00,0x01,0x01,0xf4,0x05,0xdd,0x00,0x01,0x01,0xdc,0x06,0x56,0x00,0x01,0x01,0xb0,0xfe,0x90,0x00,0x01,0x01,0xb0,0xfe,0x42,0x00,0x01,0x01,0x1a,0x06,0xd9,0x00,0x01,0x01,0x90,0x05,0x13,0x00,0x01,0x01,0x2c,0xfd,0xc9,0x00,0x01,0x01,0x2c,0xfd,0xaf,0x00,0x01,0x06,0x13,0xfe,0x63,0x00,0x01,0x01,0xc2,0x04,0x39, -0x00,0x01,0x01,0xc2,0xff,0x3c,0x00,0x01,0x06,0x13,0xfd,0x97,0x00,0x01,0x01,0x5e,0xff,0x27,0x00,0x01,0x07,0x3f,0xfe,0x63,0x00,0x01,0x02,0x26,0xff,0x0a,0x00,0x01,0x02,0x8f,0x04,0x68,0x00,0x01,0x01,0x2c,0x04,0x68,0x00,0x01,0x03,0xe8,0x06,0x1e,0x00,0x01,0x01,0x91,0x06,0xd9,0x00,0x01,0x01,0xf5,0x06,0x74,0x00,0x01,0x01,0xc2, -0x06,0x60,0x00,0x01,0x01,0xf4,0x06,0x2e,0x00,0x01,0x01,0x90,0xfe,0x42,0x00,0x01,0x01,0xc2,0xfd,0x97,0x00,0x01,0x01,0x95,0x04,0x47,0x00,0x01,0x01,0x63,0x04,0xc9,0x00,0x01,0x01,0xdb,0x04,0x4b,0x00,0x01,0x03,0x6b,0xfe,0xf0,0x00,0x01,0x01,0x5e,0x04,0x7d,0x00,0x01,0x02,0x8a,0xfe,0xf0,0x00,0x01,0x02,0x3b,0x06,0xe5,0x00,0x01, -0x01,0x2c,0x06,0xe5,0x00,0x01,0x01,0xa5,0x07,0x35,0x00,0x01,0x01,0x2c,0x07,0xfd,0x00,0x01,0x01,0xd7,0x05,0x9d,0x00,0x01,0x01,0x2c,0x07,0xf5,0x00,0x01,0x01,0x41,0xff,0x0a,0x00,0x01,0x01,0x5e,0xfe,0x42,0x00,0x01,0x01,0xa5,0xff,0x27,0x00,0x01,0x01,0xd7,0x05,0x6b,0x00,0x01,0x00,0xfa,0x08,0xef,0x00,0x01,0x01,0x90,0x08,0x40, -0x00,0x01,0x01,0x5e,0x07,0x99,0x00,0x01,0x01,0x90,0x08,0xb1,0x00,0x01,0x02,0x8f,0xfd,0x92,0x00,0x01,0x01,0x2c,0xfd,0x97,0x00,0x01,0x02,0x5d,0x05,0x7a,0x00,0x01,0x00,0xcd,0xfe,0xf5,0x00,0x01,0x02,0x5d,0x05,0x72,0x00,0x01,0x00,0xcd,0xfe,0xb9,0x00,0x01,0x02,0x5d,0x05,0x0a,0x00,0x01,0x01,0xc2,0x04,0x48,0x00,0x01,0x01,0x90, -0xfd,0xcc,0x00,0x01,0x01,0xc2,0x05,0x95,0x00,0x01,0x01,0xc2,0x05,0xc7,0x00,0x01,0x01,0xc2,0x05,0xbd,0x00,0x01,0x01,0xc2,0x04,0xdd,0x00,0x01,0x01,0x90,0x05,0xf5,0x00,0x01,0x01,0xc2,0x04,0x15,0x00,0x01,0x01,0xf4,0xfe,0xf1,0x00,0x01,0x01,0xae,0x03,0x3f,0x00,0x01,0x01,0xc6,0x06,0x40,0x00,0x01,0x01,0xc6,0x04,0x90,0x00,0x01, -0x01,0x90,0x05,0xbe,0x00,0x01,0x01,0xc6,0x04,0xdc,0x00,0x01,0x01,0x2c,0xff,0x27,0x00,0x01,0x01,0xc6,0x03,0xe9,0x00,0x01,0x00,0xfa,0xff,0x22,0x00,0x01,0x00,0xc8,0xff,0x27,0x00,0x01,0x00,0xc8,0xff,0x22,0x00,0x01,0x02,0x8a,0xff,0x0a,0x00,0x01,0x01,0xf5,0x05,0x8e,0x00,0x01,0x01,0xf4,0xfe,0x42,0x00,0x01,0x02,0x5f,0xfd,0xcd, -0x00,0x01,0x01,0xd7,0x05,0x41,0x00,0x01,0x02,0x62,0x05,0x16,0x00,0x01,0x02,0x62,0xff,0x92,0x00,0x01,0x01,0x1a,0x06,0x69,0x00,0x01,0x01,0x7e,0x06,0x69,0x00,0x01,0x01,0x7f,0x06,0x40,0x00,0x01,0x01,0xc5,0x05,0xaa,0x00,0x01,0x00,0xe6,0x06,0x40,0x00,0x01,0x01,0xe0,0xff,0x2a,0x00,0x01,0x01,0x18,0x06,0x0e,0x00,0x01,0x02,0x12, -0xfd,0xcd,0x00,0x01,0x01,0x0f,0xff,0x3c,0x00,0x01,0x00,0xfa,0xfe,0x42,0x00,0x01,0x01,0x72,0xfe,0x42,0x00,0x01,0x01,0x41,0xff,0x0d,0x00,0x01,0x01,0x5e,0xfd,0xe1,0x00,0x01,0x02,0x3b,0x05,0xbe,0x00,0x01,0x01,0xb0,0xfd,0x97,0x00,0x01,0x01,0xb0,0xfd,0xe1,0x00,0x01,0x01,0x2c,0x04,0x89,0x00,0x01,0x01,0x91,0x06,0x07,0x00,0x01, -0x01,0xf5,0x05,0x84,0x00,0x01,0x01,0x91,0x06,0xed,0x00,0x01,0x01,0xf5,0x06,0x6a,0x00,0x01,0x01,0xc2,0xfe,0x42,0x00,0x01,0x01,0xf4,0xfd,0x83,0x00,0x01,0x01,0xd7,0x05,0x55,0x00,0x01,0x01,0xd7,0x04,0xdd,0x00,0x01,0x01,0x90,0xfd,0x97,0x00,0x01,0x01,0x01,0x04,0xdd,0x00,0x01,0x01,0x4a,0x04,0xdd,0x00,0x01,0x02,0x5f,0xfe,0x63, -0x00,0x01,0x02,0x44,0xfe,0x42,0x00,0x01,0x00,0x9b,0xfe,0x91,0x00,0x01,0x02,0x5d,0x06,0xc8,0x00,0x01,0x01,0x5e,0x08,0x1e,0x00,0x01,0x02,0x5d,0x05,0xc7,0x00,0x01,0x01,0x90,0x07,0x1d,0x00,0x01,0x01,0x90,0x05,0x20,0x00,0x01,0x01,0xc6,0x04,0x47,0x00,0x01,0x00,0xfa,0xff,0x2b,0x00,0x01,0x00,0xfa,0xfe,0xd6,0x00,0x01,0x01,0x7e, -0x04,0x82,0x00,0x01,0x01,0x7e,0x05,0xc1,0x00,0x01,0x02,0xee,0xff,0x25,0x00,0x01,0x02,0x2a,0x05,0x78,0x00,0x01,0x02,0x2a,0x04,0x2c,0x00,0x01,0x02,0x2a,0x06,0x84,0x00,0x01,0x02,0x2a,0x05,0x58,0x00,0x01,0x01,0x5e,0x04,0xe9,0x00,0x01,0x01,0x7f,0x05,0x1b,0x00,0x01,0x01,0x5e,0x04,0x50,0x00,0x01,0x02,0x26,0xfd,0xcd,0x00,0x01, -0x00,0xfa,0x05,0x70,0x00,0x01,0x01,0x7e,0x07,0x41,0x00,0x01,0x01,0x7e,0x06,0xd9,0x00,0x01,0x02,0x09,0x04,0xa4,0x00,0x01,0x02,0x09,0x05,0x76,0x00,0x01,0x02,0x09,0x05,0x9d,0x00,0x01,0x02,0x09,0x05,0x6b,0x00,0x01,0x02,0x5d,0x05,0x7e,0x00,0x01,0x00,0xcd,0xfe,0xf0,0x00,0x01,0x01,0x83,0x04,0x75,0x00,0x01,0x01,0x83,0x03,0xc0, -0x00,0x01,0x01,0x7e,0x06,0x40,0x00,0x01,0x02,0x09,0x05,0x55,0x00,0x01,0x02,0x09,0x04,0xdd,0x00,0x01,0x00,0x9b,0xfe,0x8c,0x00,0x01,0x02,0xa4,0xfd,0xcc,0x00,0x01,0x02,0x26,0xfd,0xd1,0x00,0x01,0x02,0xa4,0xfd,0xc8,0x00,0x01,0x01,0xf4,0x03,0xd5,0x00,0x01,0x02,0x26,0xfd,0xc8,0x00,0x01,0x01,0x2c,0x05,0xaf,0x00,0x01,0x01,0x90, -0x07,0x3f,0x00,0x01,0x01,0xaa,0x06,0xbe,0x00,0x01,0x01,0xf4,0x06,0x77,0x00,0x01,0x00,0xfa,0x07,0xa0,0x00,0x01,0x01,0x90,0xff,0x9c,0x00,0x01,0x01,0x90,0xff,0x5c,0x00,0x01,0x01,0xc6,0x05,0xee,0x00,0x01,0x01,0xc6,0x05,0x43,0x00,0x01,0x01,0x90,0x06,0x5a,0x00,0x01,0x00,0xc8,0xff,0x08,0x00,0x01,0x01,0xc6,0x03,0xb7,0x00,0x01, -0x00,0xfa,0xfd,0x46,0x00,0x01,0x01,0xd9,0x05,0x27,0x00,0x01,0x02,0x3d,0xfd,0xcd,0x00,0x01,0x01,0xd8,0x05,0x27,0x00,0x01,0x02,0x3c,0xfd,0xcd,0x00,0x01,0x01,0x6c,0x05,0xd2,0x00,0x01,0x01,0x6c,0x03,0xd1,0x00,0x01,0x02,0x26,0xfd,0x46,0x00,0x01,0x01,0x2c,0x04,0xba,0x00,0x01,0x01,0x5e,0x04,0x54,0x00,0x01,0x00,0xc8,0x06,0xf1, -0x00,0x01,0x01,0x2c,0xff,0x2c,0x00,0x01,0x00,0xc8,0x07,0xaa,0x00,0x01,0x00,0xc8,0x05,0x8a,0x00,0x01,0x01,0x2c,0xfd,0xcc,0x00,0x01,0x00,0xc8,0x07,0xa9,0x00,0x01,0x00,0xc8,0x06,0x1b,0x00,0x01,0x00,0xc8,0x07,0x28,0x00,0x01,0x01,0x5e,0x04,0x3b,0x00,0x01,0x00,0xfa,0x04,0x89,0x00,0x01,0x01,0x5e,0x04,0x39,0x00,0x01,0x01,0x5e, -0xff,0x0a,0x00,0x01,0x00,0xfa,0xff,0x27,0x00,0x01,0x01,0x5e,0x05,0x83,0x00,0x01,0x00,0xfa,0x05,0xaf,0x00,0x01,0x00,0xfa,0x04,0xec,0x00,0x01,0x00,0xfa,0x04,0x54,0x00,0x01,0x01,0x2c,0x04,0x36,0x00,0x01,0x01,0x90,0xff,0x0a,0x00,0x01,0x01,0x2c,0x04,0xfe,0x00,0x01,0x00,0xf8,0x06,0x1e,0x00,0x01,0x00,0x94,0xff,0x86,0x00,0x01, -0x00,0xc6,0xff,0x86,0x00,0x01,0x00,0xf8,0x08,0x40,0x00,0x01,0x00,0xf8,0x07,0x99,0x00,0x01,0x00,0xf8,0x08,0xb1,0x00,0x01,0x00,0x94,0xfd,0x97,0x00,0x01,0x00,0xc6,0xfd,0x97,0x00,0x01,0x01,0xc9,0x02,0xd2,0x00,0x01,0x01,0x65,0xfd,0xcd,0x00,0x01,0x01,0xc9,0x04,0x6b,0x00,0x01,0x01,0x97,0x06,0x1d,0x00,0x01,0x01,0xc9,0x05,0x13, -0x00,0x01,0x01,0x65,0xfd,0xc9,0x00,0x01,0x01,0x65,0xfd,0xaf,0x00,0x01,0x01,0xc9,0x05,0x83,0x00,0x01,0x01,0xc9,0x05,0x20,0x00,0x01,0x01,0xc9,0x07,0x3f,0x00,0x01,0x01,0xc6,0x04,0xc2,0x00,0x01,0x01,0xc6,0x04,0x4f,0x00,0x01,0x01,0xc6,0x05,0x67,0x00,0x01,0x01,0xc6,0x03,0x04,0x00,0x01,0x00,0xcc,0xfe,0xcd,0x00,0x01,0x01,0xae, -0x03,0x04,0x00,0x01,0x00,0x9a,0xfe,0xf0,0x00,0x01,0x00,0x9a,0xff,0x08,0x00,0x01,0x01,0xf8,0xff,0x6e,0x00,0x01,0x01,0x6c,0x01,0xc5,0x00,0x01,0x00,0xcc,0xff,0x22,0x00,0x01,0x01,0x30,0xfe,0xa4,0x00,0x01,0x00,0xc8,0x05,0xe2,0x00,0x01,0x00,0xc8,0xff,0x2a,0x00,0x01,0x00,0x64,0x05,0x4c,0x00,0x01,0x00,0xb4,0xff,0x2a,0x00,0x01, -0x02,0x3a,0x03,0xd7,0x00,0x01,0x01,0x40,0xff,0x24,0x00,0x01,0x01,0x86,0xfd,0x8a,0x00,0x01,0x02,0x58,0x05,0x32,0x00,0x01,0x02,0xbc,0xfd,0xcd,0x00,0x01,0x02,0x26,0x05,0x32,0x00,0x01,0x03,0xde,0x05,0x50,0x00,0x01,0x02,0x3a,0xff,0x22,0x00,0x01,0x01,0xe0,0x06,0xc2,0x00,0x01,0x01,0xe0,0xfe,0x52,0x00,0x01,0x02,0x9e,0x04,0x2a, -0x00,0x01,0x01,0x68,0x04,0x47,0x00,0x01,0x02,0xe4,0xfc,0x7c,0x00,0x01,0x01,0xd6,0x05,0xaa,0x00,0x01,0x01,0x68,0x05,0x24,0x00,0x01,0x02,0x8a,0xfe,0x48,0x00,0x01,0x01,0x7c,0x06,0x54,0x00,0x01,0x02,0x9e,0x05,0xfa,0x00,0x01,0x02,0x6c,0xff,0x2b,0x00,0x01,0x02,0x94,0x06,0x0e,0x00,0x01,0x01,0x36,0x05,0x1e,0x00,0x01,0x00,0x6e, -0xff,0x10,0x00,0x01,0x01,0x72,0x05,0x96,0x00,0x01,0x01,0x40,0xfe,0x52,0x00,0x01,0x01,0x4a,0xfe,0x52,0x00,0x01,0x01,0x40,0x04,0xf6,0x00,0x01,0x00,0x64,0xfe,0xd4,0x00,0x01,0x02,0x08,0x05,0x0a,0x00,0x01,0x01,0x72,0x05,0x64,0x00,0x01,0x01,0xf4,0x04,0x38,0x00,0x01,0x01,0x90,0x03,0x20,0x00,0x01,0x00,0xdc,0xfd,0xcd,0x00,0x01, -0x01,0x72,0xfd,0xcd,0x00,0x01,0x01,0xea,0x04,0x10,0x00,0x01,0x02,0x58,0xfe,0x52,0x00,0x01,0x01,0xce,0xfd,0x94,0x00,0x01,0x07,0x43,0xfd,0x6c,0x00,0x01,0x04,0xa4,0xfd,0x6c,0x00,0x01,0x01,0x6b,0x05,0xd8,0x00,0x01,0x01,0xc3,0xfe,0xe2,0x00,0x01,0x01,0x90,0x06,0x40,0x00,0x01,0x02,0x3b,0x04,0xb0,0x00,0x01,0x01,0x90,0x05,0xc3, -0x00,0x01,0x02,0x2a,0x06,0x40,0x00,0x01,0x02,0x32,0x05,0x46,0x00,0x01,0x02,0x8a,0xfd,0x7a,0x00,0x01,0x02,0x26,0xfd,0x7a,0x00,0x01,0x01,0x90,0x05,0xaa,0x00,0x01,0x01,0x5e,0x05,0x91,0x00,0x01,0x02,0x2a,0x04,0x90,0x00,0x01,0x06,0xf4,0x06,0xc2,0x00,0x01,0x06,0xf4,0xff,0x2a,0x00,0x01,0x05,0x0a,0x08,0x7a,0x00,0x01,0x04,0xb0, -0xff,0x2a,0x00,0x01,0x08,0xfc,0x06,0x32,0x00,0x01,0x08,0xfc,0xff,0x9c,0x00,0x01,0x0a,0x0a,0x03,0x26,0x00,0x01,0x09,0xa6,0xfd,0xcd,0x00,0x01,0x07,0xd0,0x03,0xe8,0x00,0x01,0x07,0x62,0xfe,0x3e,0x00,0x01,0x06,0x5e,0x06,0x54,0x00,0x01,0x05,0x46,0xfe,0x70,0x00,0x01,0x09,0x92,0x05,0x88,0x00,0x01,0x09,0x92,0xff,0x2a,0x00,0x01, -0x07,0x08,0x06,0x5e,0x00,0x01,0x04,0xe2,0x05,0xbe,0x00,0x01,0x01,0x03,0x07,0xda,0x00,0x01,0x00,0x7e,0x08,0x52,0x00,0x01,0x01,0x03,0x07,0x26,0x00,0x01,0x00,0xc4,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0x2a,0x00,0x01,0x01,0x03,0x07,0x6c,0x00,0x01,0x01,0x03,0x08,0x3e,0x00,0x01,0x01,0x03,0x08,0x98,0x00,0x01,0x00,0xef,0x09,0x24, -0x00,0x01,0x00,0xf5,0x08,0x3e,0x00,0x01,0x01,0x03,0x09,0x38,0x00,0x01,0x00,0xef,0x08,0x5c,0x00,0x01,0x00,0xe9,0x08,0x98,0x00,0x01,0x01,0x03,0x08,0x66,0x00,0x01,0x00,0xec,0x08,0x2a,0x00,0x01,0x01,0x03,0x08,0x16,0x00,0x01,0x01,0x03,0x07,0xf8,0x00,0x01,0x01,0x1f,0x08,0x8e,0x00,0x01,0x01,0x0c,0x08,0x66,0x00,0x01,0x01,0x03, -0x08,0xde,0x00,0x01,0x00,0xf9,0x08,0x34,0x00,0x01,0x00,0xeb,0x08,0x34,0x00,0x01,0x01,0x11,0x08,0x3e,0x00,0x01,0x01,0x1c,0x08,0xd4,0x00,0x01,0x00,0xf3,0x07,0xf8,0x00,0x01,0x00,0xc4,0x08,0x70,0x00,0x01,0x01,0x03,0x08,0x34,0x00,0x01,0x00,0xf9,0x09,0x1a,0x00,0x01,0x01,0x03,0x07,0x30,0x00,0x01,0x01,0x03,0x08,0x48,0x00,0x01, -0x01,0x03,0x07,0xe4,0x00,0x01,0x01,0x03,0x07,0x3a,0x00,0x01,0x01,0x42,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0x7a,0x00,0x01,0x00,0xf8,0x09,0x1a,0x00,0x01,0x00,0xd7,0x08,0xfc,0x00,0x01,0x01,0x03,0x07,0x12,0x00,0x01,0x00,0xe1,0x08,0x34,0x00,0x01,0x01,0x03,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0xb6,0x00,0x01,0x00,0xfa,0x07,0x9e, -0x00,0x01,0x01,0x03,0x08,0xca,0x00,0x01,0x00,0xfa,0x08,0x52,0x00,0x01,0x00,0xfa,0x08,0x98,0x00,0x01,0x01,0x18,0x07,0xd0,0x00,0x01,0x01,0x18,0x08,0x61,0x00,0x01,0x01,0x40,0x08,0x98,0x00,0x01,0x01,0x7c,0x09,0x47,0x00,0x01,0x00,0xc8,0x07,0x78,0x00,0x01,0x01,0x68,0x07,0x78,0x00,0x01,0x00,0xfa,0x08,0x27,0x00,0x01,0x01,0x2c, -0x08,0x98,0x00,0x01,0x01,0xe0,0x08,0x5b,0x00,0x01,0x00,0xdc,0x09,0x2a,0x00,0x01,0x00,0xfa,0x08,0x69,0x00,0x01,0x00,0xfa,0x08,0x2c,0x00,0x01,0x00,0xc8,0x08,0x95,0x00,0x01,0x00,0xa0,0x08,0x95,0x00,0x01,0x01,0x40,0x08,0x95,0x00,0x01,0x02,0x80,0x08,0x95,0x00,0x01,0x01,0x4a,0x08,0x95,0x00,0x01,0x01,0x2c,0x08,0x5b,0x00,0x01, -0x01,0x03,0x06,0xf4,0x00,0x01,0x02,0x5a,0x09,0xc4,0x00,0x01,0x01,0x05,0x08,0x65,0x00,0x01,0x00,0xc9,0x09,0x2a,0x00,0x01,0x00,0xfa,0x09,0x8b,0x00,0x01,0x01,0x03,0x08,0xd9,0x00,0x01,0x00,0x1d,0x0a,0x5b,0x00,0x01,0xff,0x8e,0x09,0xe7,0x00,0x01,0xff,0x97,0x09,0xe7,0x00,0x01,0xff,0x47,0x09,0xff,0x00,0x01,0xff,0x79,0x09,0xa9, -0x00,0x01,0xff,0xcd,0x09,0xa9,0x00,0x01,0x01,0x7a,0x08,0x53,0x00,0x01,0x01,0x93,0x08,0x38,0x00,0x01,0x01,0x03,0xfe,0x0c,0x00,0x01,0x01,0x03,0xfe,0xd4,0x00,0x01,0x00,0xb2,0xfd,0xbc,0x00,0x01,0x01,0x03,0xfd,0xbc,0x00,0x01,0x00,0xec,0xfd,0xc6,0x00,0x01,0x01,0x1f,0xfd,0xc6,0x00,0x01,0x01,0x03,0xfe,0x48,0x00,0x01,0x01,0x03, -0xfe,0x70,0x00,0x01,0x00,0xfa,0xfe,0x53,0x00,0x01,0x01,0x2c,0xfd,0x8b,0x00,0x01,0x00,0xbe,0xfe,0x5c,0x00,0x01,0x01,0x5e,0xfe,0x5c,0x00,0x01,0x00,0xc8,0xfd,0xa5,0x00,0x01,0x01,0x7c,0xfd,0x5e,0x00,0x01,0x01,0x04,0xfd,0xbd,0x00,0x01,0x00,0x8c,0xfd,0x3a,0x00,0x01,0x01,0x03,0xfc,0x8b,0x00,0x01,0x00,0x00,0xfe,0x09,0x00,0x01, -0x02,0x62,0xff,0xe2,0x00,0x01,0x02,0xb7,0x00,0x00,0x00,0x01,0x02,0xc9,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x02,0xad,0x00,0x50,0x00,0x01,0x00,0xdf,0xff,0x44,0x00,0x01,0x02,0xb2,0x00,0x50,0x00,0x01,0x02,0x3a,0xfe,0x42,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x02,0xb8,0x00,0x00,0x00,0x01,0x01,0xa4,0x00,0x00, -0x00,0x01,0x01,0xc6,0x00,0x00,0x00,0x01,0x01,0xb3,0x00,0x00,0x00,0x01,0x03,0x20,0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x01,0x01,0x75,0x00,0x00,0x00,0x01,0x00,0xef,0x00,0x00,0x00,0x01,0x00,0x95,0x00,0x00,0x00,0x01,0x02,0x2a,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x01,0x15,0x00,0x00,0x00,0x01,0x00,0xbb, -0x00,0x00,0x00,0x01,0x01,0xd9,0x00,0x00,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x01,0x00,0xc4,0x00,0x00,0x00,0x01,0x00,0x6a,0x00,0x00,0x00,0x01,0x01,0x50,0x00,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00,0x00,0x01,0xff,0xe1,0x00,0x00,0x00,0x01,0x02,0x26,0x00,0x00,0x00,0x01,0x01,0x97,0x00,0x00,0x00,0x01, -0x00,0xdf,0x00,0x00,0x00,0x01,0x00,0x3f,0x00,0x00,0x00,0x01,0x02,0x5d,0x00,0x00,0x00,0x01,0x01,0xce,0x00,0x00,0x00,0x01,0x01,0x48,0x00,0x00,0x00,0x01,0x00,0xee,0x00,0x00,0x00,0x01,0x00,0xb6,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x01,0xff,0xa1,0x00,0x00,0x00,0x01,0xff,0x47,0x00,0x00,0x00,0x01,0x01,0x3a,0x00,0x00, -0x00,0x01,0x00,0xab,0x00,0x00,0x00,0x01,0xff,0xf3,0x00,0x00,0x00,0x01,0xff,0xcb,0x00,0x00,0x00,0x01,0x02,0x5b,0x00,0x00,0x00,0x01,0x01,0xcc,0x00,0x00,0x00,0x01,0x01,0x46,0x00,0x00,0x00,0x01,0x00,0xec,0x00,0x00,0x00,0x01,0x02,0x5a,0x00,0x00,0x00,0x01,0x01,0xcb,0x00,0x00,0x00,0x01,0x01,0x45,0x00,0x00,0x00,0x01,0x00,0xeb, -0x00,0x00,0x00,0x01,0x01,0x49,0x00,0x00,0x00,0x01,0x00,0xba,0x00,0x00,0x00,0x01,0xff,0xf5,0x00,0x00,0x00,0x01,0xff,0x3b,0x00,0x00,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x00,0xd9,0x00,0x00,0x00,0x01,0x00,0x53,0x00,0x00,0x00,0x01,0xff,0xf9,0x00,0x00,0x00,0x01,0x01,0x6d,0x00,0x00,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x01, -0x00,0x58,0x00,0x00,0x00,0x01,0xff,0xfe,0x00,0x00,0x00,0x01,0x02,0x62,0x00,0x00,0x00,0x01,0x01,0xd3,0x00,0x00,0x00,0x01,0x01,0x4d,0x00,0x00,0x00,0x01,0x00,0xf3,0x00,0x00,0x00,0x01,0xfe,0x98,0x00,0x00,0x00,0x01,0xfd,0x91,0x00,0x00,0x00,0x01,0xfc,0xd7,0x00,0x00,0x00,0x01,0x01,0x0e,0x00,0x00,0x00,0x01,0x00,0x7f,0x00,0x00, -0x00,0x01,0xff,0x9f,0x00,0x00,0x00,0x01,0x02,0x57,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x01,0x42,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x00,0x01,0x02,0x08,0x00,0x00,0x00,0x01,0x01,0x79,0x00,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x00,0x01,0x01,0xd1,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x01,0xff,0xa7, -0x00,0x00,0x00,0x01,0x01,0xef,0x00,0x00,0x00,0x01,0x01,0x60,0x00,0x00,0x00,0x01,0x00,0xda,0x00,0x00,0x00,0x01,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0xbf,0x00,0x00,0x00,0x01,0xff,0xb6,0x00,0x00,0x00,0x01,0xfe,0xaf,0x00,0x00,0x00,0x01,0xfd,0xf5,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x00,0x00,0x01,0x01,0x1f,0x00,0x00,0x00,0x01, -0x02,0x53,0x00,0x00,0x00,0x01,0x01,0xc4,0x00,0x00,0x00,0x01,0x01,0xbe,0x00,0x00,0x00,0x01,0x01,0xaa,0x00,0x00,0x00,0x01,0x03,0x1b,0x00,0x00,0x00,0x01,0x02,0x8c,0x00,0x00,0x00,0x01,0x01,0xc0,0x00,0x00,0x00,0x01,0x01,0x34,0x00,0x00,0x00,0x01,0x02,0xa3,0x00,0x00,0x00,0x01,0x02,0x14,0x00,0x00,0x00,0x01,0x01,0x8e,0x00,0x00, -0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x02,0x0f,0x00,0x00,0x00,0x01,0x01,0x89,0x00,0x00,0x00,0x01,0x01,0x2f,0x00,0x00,0x00,0x01,0x01,0xbb,0x00,0x00,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01,0x01,0x3e,0x00,0x00,0x00,0x01,0x00,0xb8, -0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x00,0x01,0x01,0xe5,0x00,0x00,0x00,0x01,0x01,0x56,0x00,0x00,0x00,0x01,0x00,0xd0,0x00,0x00,0x00,0x01,0x00,0x76,0x00,0x00,0x00,0x01,0x00,0xc5,0x00,0x00,0x00,0x01,0xff,0xe5,0x00,0x00,0x00,0x01,0x01,0xd4,0x00,0x00,0x00,0x01,0x00,0xfc,0x00,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x00,0x01, -0xff,0xe7,0x00,0x00,0x00,0x01,0xff,0x8d,0x00,0x00,0x00,0x01,0x01,0x62,0x00,0x00,0x00,0x01,0x00,0xd3,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0xe6,0xff,0x9c,0x00,0x01,0x00,0xca,0x00,0x00,0x00,0x01,0x00,0x8a,0x00,0x00,0x00,0x01,0x01,0x1d,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00, -0x00,0x01,0x01,0x10,0x00,0x00,0x00,0x01,0x00,0xf2,0x00,0x00,0x00,0x01,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x01,0xff,0xac,0x00,0x00,0x00,0x01,0x01,0x17,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0xb5,0x00,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x98, -0x00,0x00,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x00,0x00,0x01,0xff,0xb4,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x01,0xff,0xc4,0x00,0x00,0x00,0x01,0x00,0xd2,0x00,0x00,0x00,0x01, -0x01,0x18,0x00,0x00,0x00,0x01,0x00,0xed,0x00,0x00,0x00,0x01,0x02,0x60,0x00,0x00,0x00,0x01,0x03,0xd5,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x01,0x01,0xa6,0x00,0x00,0x00,0x01,0x01,0x98,0x00,0x00,0x00,0x01,0x00,0xe4,0x00,0x00,0x00,0x01,0x02,0xa8,0x00,0x00,0x00,0x01,0x04,0x6c,0x00,0x00,0x00,0x01,0x03,0x7a,0x00,0x00, -0x00,0x01,0x01,0x9d,0x00,0x00,0x00,0x01,0x00,0x8e,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0x00,0x00,0x01,0x03,0xee,0x00,0x00,0x00,0x01,0x02,0xfc,0x00,0x00,0x00,0x01,0x01,0x47,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x02,0xf8,0x00,0x00,0x00,0x01,0x02,0x0d,0x00,0x00,0x00,0x01,0x00,0xf5, -0x00,0x00,0x00,0x01,0x01,0x13,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x00,0x01,0x03,0xa2,0x00,0x00,0x00,0x01,0x02,0xba,0x00,0x00,0x00,0x01,0x01,0x19,0x00,0x00,0x00,0x01,0x01,0x11,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0x00,0x00,0x01,0x04,0xc1,0x00,0x00,0x00,0x01,0x03,0xcf,0x00,0x00,0x00,0x01,0x01,0xb5,0x00,0x00,0x00,0x01, -0x00,0x84,0x00,0x00,0x00,0x01,0x02,0x3b,0x00,0x00,0x00,0x01,0x01,0x0c,0x00,0x00,0x00,0x01,0x01,0x3d,0x00,0x00,0x00,0x01,0x00,0x6c,0x00,0x00,0x00,0x01,0x02,0xc4,0x00,0x00,0x00,0x01,0x01,0xdc,0x00,0x00,0x00,0x01,0x01,0x25,0x00,0x00,0x00,0x01,0x04,0xbb,0x00,0x00,0x00,0x01,0x03,0xc9,0x00,0x00,0x00,0x01,0x01,0x90,0x00,0x00, -0x00,0x01,0x02,0xc1,0x00,0x00,0x00,0x01,0x05,0x02,0x00,0x00,0x00,0x01,0x04,0x10,0x00,0x00,0x00,0x01,0x01,0x72,0x00,0x00,0x00,0x01,0x02,0x3c,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x03,0xce,0x00,0x00,0x00,0x01,0x02,0xdc,0x00,0x00,0x00,0x01,0x01,0x26,0x00,0x00,0x00,0x01,0x03,0xc4,0x00,0x00,0x00,0x01,0x02,0xd2, -0x00,0x00,0x00,0x01,0x01,0x43,0x00,0x00,0x00,0x01,0xff,0x1e,0x00,0x00,0x00,0x01,0x02,0x2b,0x00,0x00,0x00,0x01,0x03,0xec,0x00,0x00,0x00,0x01,0x03,0x38,0x00,0x00,0x00,0x01,0x02,0xe6,0x00,0x00,0x00,0x01,0xff,0xd7,0x00,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x00,0x01,0x01,0x04,0x00,0x00,0x00,0x01,0x02,0xbf,0x00,0x00,0x00,0x01, -0x04,0xe3,0x00,0x00,0x00,0x01,0x03,0xf1,0x00,0x00,0x00,0x01,0x02,0xbe,0x00,0x00,0x00,0x01,0x04,0xe9,0x00,0x00,0x00,0x01,0x03,0xf7,0x00,0x00,0x00,0x01,0x01,0xab,0x00,0x00,0x00,0x01,0x00,0x62,0x00,0x00,0x00,0x01,0x01,0x6a,0x00,0x00,0x00,0x01,0x02,0xec,0x00,0x00,0x00,0x01,0x01,0x96,0x00,0x00,0x00,0x01,0x01,0x1b,0x00,0x00, -0x00,0x01,0x01,0x39,0x00,0x00,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x02,0xb3,0x00,0x00,0x00,0x01,0x04,0xd0,0x00,0x00,0x00,0x01,0x03,0xde,0x00,0x00,0x00,0x01,0x01,0x86,0x00,0x00,0x00,0x01,0x00,0xb3,0x00,0x00,0x00,0x01,0x02,0x71,0x00,0x00,0x00,0x01,0x04,0x2c,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x01,0x01,0x6c, -0x00,0x00,0x00,0x01,0x01,0x4e,0x00,0x00,0x00,0x01,0x00,0xb2,0x00,0x00,0x00,0x01,0x04,0x3a,0x00,0x00,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x01,0x5c,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0x00,0x00,0x01,0x04,0x75,0x00,0x00,0x00,0x01,0x03,0x83,0x00,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x02,0x33,0x00,0x00,0x00,0x01, -0x04,0x04,0x00,0x00,0x00,0x01,0x02,0xd3,0x00,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00,0x00,0x01,0x04,0x26,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x01,0x63,0x00,0x00,0x00,0x01,0x01,0x4f,0x00,0x00,0x00,0x01,0x01,0x0b,0x00,0x00,0x00,0x01,0x02,0xaf,0x00,0x00,0x00,0x01,0x04,0xd3,0x00,0x00, -0x00,0x01,0x03,0xcd,0x00,0x00,0x00,0x01,0x03,0x1f,0x00,0x00,0x00,0x01,0x05,0xd9,0x00,0x00,0x00,0x01,0x04,0xe5,0x00,0x00,0x00,0x01,0x01,0x77,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0x00,0x00,0x01,0x05,0x24,0x00,0x00,0x00,0x01,0x04,0x32,0x00,0x00,0x00,0x01,0x02,0x17,0x00,0x00,0x00,0x01,0x03,0x71,0x00,0x00,0x00,0x01,0x02,0x7f, -0x00,0x00,0x00,0x01,0xff,0x1e,0x01,0x04,0x00,0x01,0xff,0xd7,0x00,0xdc,0x00,0x01,0x00,0x59,0x00,0xf0,0x00,0x01,0x02,0x29,0x00,0x00,0x00,0x01,0x03,0x96,0x00,0x00,0x00,0x01,0x02,0xa4,0x00,0x00,0x00,0x01,0x07,0x17,0x00,0x00,0x00,0x01,0x02,0xf1,0x00,0x00,0x00,0x01,0x05,0xca,0x00,0x00,0x00,0x01,0xff,0x26,0x00,0x00,0x00,0x01, -0x03,0x4e,0x00,0x00,0x00,0x01,0x01,0x77,0x00,0xdc,0x00,0x01,0x00,0x75,0x00,0x00,0x00,0x01,0x00,0xe3,0x00,0x00,0x00,0x01,0x01,0x9c,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x01,0x02,0x82,0x00,0x00,0x00,0x01,0x01,0x52,0x00,0x00,0x00,0x01,0x01,0x83,0x00,0x00,0x00,0x01,0x01,0x8d,0x00,0x00,0x00,0x01,0x00,0x94,0x00,0x00, -0x00,0x01,0x01,0x7f,0x00,0x00,0x00,0x01,0xff,0x7a,0x00,0x00,0x00,0x01,0x02,0xa7,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0xf0,0x00,0x01,0x01,0x5a,0x00,0x00,0x00,0x01,0x01,0x3d,0x00,0xdc,0x00,0x01,0x00,0xc9,0x00,0x00,0x00,0x01,0xff,0x81,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0xdc,0x00,0x01,0x04,0x54,0x00,0x00,0x00,0x01,0x03,0x07, -0x00,0x00,0x00,0x01,0x00,0x3a,0x00,0x00,0x00,0x01,0xff,0x5e,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0xdc,0x00,0x01,0x04,0x31,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0xad,0x00,0x00,0x00,0x01,0xff,0xdb,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0xdc,0x00,0x01,0x04,0xae,0x00,0x00,0x00,0x01, -0x01,0x2a,0x00,0x00,0x00,0x01,0x02,0x91,0x00,0x00,0x00,0x01,0x04,0x8a,0x00,0x00,0x00,0x01,0x03,0x39,0x00,0x00,0x00,0x01,0x03,0x98,0x00,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x00,0x01,0x01,0xe0,0x00,0x00,0x00,0x01,0x02,0x0b,0x00,0x00,0x00,0x01,0x01,0x7d,0x00,0x00,0x00,0x01,0xff,0x36,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0xdc, -0x00,0x01,0x04,0x09,0x00,0x00,0x00,0x01,0x02,0xbc,0x00,0x00,0x00,0x01,0xff,0xef,0x00,0x00,0x00,0x01,0x00,0x85,0x00,0x00,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0xdc,0x00,0x01,0x05,0x17,0x00,0x00,0x00,0x01,0x00,0xfd,0x00,0x00,0x00,0x01,0x01,0x93,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0xdc,0x00,0x01,0x05,0x5d, -0x00,0x00,0x00,0x01,0x02,0x86,0x00,0x00,0x00,0x01,0x03,0x99,0x00,0x00,0x00,0x01,0x02,0x35,0x00,0x00,0x00,0x01,0x03,0x36,0x00,0x00,0x00,0x01,0x01,0xac,0x00,0x00,0x00,0x01,0x02,0x2c,0x00,0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x00,0x01,0x02,0xb9,0x00,0x00,0x00,0x01,0x01,0x6f,0x00,0x00,0x00,0x01,0x03,0xca,0x00,0x00,0x00,0x01, -0x02,0xb6,0x00,0x00,0x00,0x01,0x04,0x11,0x00,0x00,0x00,0x01,0x01,0xa5,0x00,0x00,0x00,0x01,0x03,0xb9,0x00,0x00,0x00,0x01,0x01,0xc9,0x00,0x00,0x00,0x01,0x02,0xdd,0x00,0x00,0x00,0x01,0x03,0xf0,0x00,0x00,0x00,0x01,0x03,0xf8,0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x00,0x00,0x01,0x01,0x53,0x00,0x00,0x00,0x01,0x03,0xdf,0x00,0x00, -0x00,0x01,0x02,0x64,0x00,0x00,0x00,0x01,0x03,0x3b,0x00,0x00,0x00,0x01,0x02,0x2d,0x00,0x00,0x00,0x01,0x04,0x25,0x00,0x00,0x00,0x01,0x02,0x4b,0x00,0x00,0x00,0x01,0x03,0x84,0x00,0x00,0x00,0x01,0x00,0xce,0x00,0x00,0x00,0x01,0x02,0x0a,0x00,0x00,0x00,0x01,0x02,0xed,0x00,0x00,0x00,0x01,0x03,0xba,0x00,0x00,0x00,0x01,0x03,0x77, -0x00,0x00,0x00,0x01,0x02,0xff,0x00,0x00,0x00,0x01,0x04,0x51,0x00,0x00,0x00,0x01,0x02,0xfa,0x00,0x00,0x00,0x01,0x04,0x33,0x00,0x00,0x00,0x01,0x02,0x80,0x00,0x00,0x00,0x01,0x02,0xa5,0x00,0x00,0x00,0x01,0x02,0x41,0x00,0x00,0x00,0x01,0x03,0xd0,0x00,0x00,0x00,0x01,0x01,0xb0,0x00,0x00,0x00,0x01,0x03,0xf2,0x00,0x00,0x00,0x01, -0x03,0xb2,0x00,0x00,0x00,0x01,0x02,0x24,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0xfe,0xac,0x00,0x00,0x00,0x01,0xff,0xce,0x00,0x00,0x00,0x01,0xff,0xd8,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x00,0x00,0x01,0xff,0x74,0x00,0x00,0x00,0x01,0xfe,0xf2,0x00,0x00,0x00,0x01,0xfe,0xca,0x00,0x00,0x00,0x01,0x02,0x3a,0x00,0x00, -0x00,0x01,0x02,0x44,0x00,0x00,0x00,0x01,0xff,0x06,0x00,0x00,0x00,0x01,0x01,0x9a,0x00,0x00,0x00,0x01,0x02,0x4e,0x00,0x00,0x00,0x01,0xff,0x6a,0x00,0x00,0x00,0x01,0xfe,0xa2,0x00,0x00,0x00,0x01,0xff,0x1a,0x00,0x00,0x00,0x01,0xfe,0xe8,0x00,0x00,0x00,0x01,0xfd,0xd0,0x00,0x00,0x00,0x01,0xfd,0x76,0x00,0x00,0x00,0x01,0xfe,0x34, -0x00,0x00,0x00,0x01,0xfd,0x44,0x00,0x00,0x00,0x01,0xfd,0x1c,0x00,0x00,0x00,0x01,0xfe,0x2a,0x00,0x00,0x00,0x01,0xfe,0x52,0x00,0x00,0x00,0x01,0xfd,0x12,0x00,0x00,0x00,0x01,0xfe,0x66,0x00,0x00,0x00,0x01,0xfd,0x80,0x00,0x00,0x00,0x01,0xfd,0x62,0x00,0x00,0x00,0x01,0xfe,0x3e,0x00,0x00,0x00,0x01,0xfd,0xe4,0x00,0x00,0x00,0x01, -0xfd,0x3a,0x00,0x00,0x00,0x01,0xfe,0x5c,0x00,0x00,0x00,0x01,0xfd,0x4e,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0xfe,0xd4,0x00,0x00,0x00,0x01,0xfe,0xc0,0x00,0x00,0x00,0x01,0xfe,0x70,0x00,0x00,0x00,0x01,0xfd,0xda,0x00,0x00,0x00,0x01,0xfd,0xc6,0x00,0x00, -0x00,0x01,0xfe,0x20,0x00,0x00,0x00,0x01,0xfe,0x8e,0x00,0x00,0x00,0x01,0xfd,0xf8,0x00,0x00,0x00,0x01,0xfe,0x16,0x00,0x00,0x00,0x01,0xfd,0xbc,0x00,0x00,0x00,0x01,0xfe,0x02,0x00,0x00,0x00,0x01,0xff,0xe2,0x00,0x00,0x00,0x01,0x00,0xfa,0x00,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x00,0x01,0xfd,0xf1,0x00,0x00,0x00,0x01,0xfd,0x8a, -0x00,0x00,0x00,0x01,0xfd,0xa8,0x00,0x00,0x00,0x01,0xfc,0xe0,0x00,0x00,0x00,0x01,0xfe,0x0c,0x00,0x00,0x00,0x01,0xfd,0xee,0x00,0x00,0x00,0x01,0x02,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x02,0xbc,0x0a,0x6a,0x00,0x15,0x61,0x72,0x61,0x62,0x00,0x80,0x62,0x6e,0x67,0x32,0x01,0x3c,0x63,0x79,0x72,0x6c,0x01,0x48,0x64,0x65, -0x76,0x32,0x01,0x70,0x67,0x6a,0x72,0x32,0x01,0xa4,0x67,0x72,0x65,0x6b,0x01,0x7c,0x67,0x75,0x72,0x32,0x01,0xb0,0x68,0x65,0x62,0x72,0x01,0xbc,0x6b,0x68,0x6d,0x72,0x01,0xd8,0x6b,0x6e,0x64,0x32,0x01,0xcc,0x6c,0x61,0x6f,0x20,0x01,0xe4,0x6c,0x61,0x74,0x6e,0x01,0xf0,0x6d,0x6c,0x6d,0x32,0x02,0x46,0x6d,0x6f,0x6e,0x67,0x02,0x52, -0x6d,0x79,0x6d,0x72,0x02,0x5e,0x6f,0x72,0x79,0x32,0x02,0x76,0x74,0x61,0x6c,0x75,0x02,0x6a,0x74,0x65,0x6c,0x32,0x02,0x8e,0x74,0x68,0x61,0x69,0x02,0x9a,0x74,0x69,0x62,0x74,0x02,0xa6,0x74,0x6d,0x6c,0x32,0x02,0x82,0x00,0x3c,0x00,0x05,0x41,0x52,0x41,0x20,0x00,0x22,0x4d,0x4c,0x59,0x20,0x00,0x54,0x4d,0x4f,0x52,0x20,0x00,0x6e, -0x53,0x4e,0x44,0x20,0x00,0x88,0x55,0x52,0x44,0x20,0x00,0xa2,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x04,0x00,0x13,0x00,0x0a,0x00,0x28,0x00,0x2e,0x00,0x3d,0x00,0x4b,0x00,0x51,0x00,0x2f,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x09,0x00,0x05,0x00,0x14,0x00,0x0b,0x00,0x29,0x00,0x3e,0x00,0x4c,0x00,0x52,0x00,0x30,0x00,0x1f,0x00,0x00, -0xff,0xff,0x00,0x0a,0x00,0x06,0x00,0x15,0x00,0x0c,0x00,0x2a,0x00,0x39,0x00,0x3f,0x00,0x4d,0x00,0x53,0x00,0x31,0x00,0x20,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x07,0x00,0x16,0x00,0x0d,0x00,0x2b,0x00,0x3a,0x00,0x40,0x00,0x4e,0x00,0x54,0x00,0x32,0x00,0x21,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x08,0x00,0x17,0x00,0x0e,0x00,0x2c, -0x00,0x3b,0x00,0x41,0x00,0x4f,0x00,0x55,0x00,0x33,0x00,0x22,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x09,0x00,0x18,0x00,0x0f,0x00,0x2d,0x00,0x3c,0x00,0x42,0x00,0x50,0x00,0x56,0x00,0x34,0x00,0x23,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x78,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x19,0x00,0x24, -0x00,0x35,0x00,0x43,0x00,0x47,0x00,0x5c,0x00,0x00,0x00,0x58,0x00,0x60,0x00,0x64,0x00,0x68,0x00,0x6c,0x00,0x70,0x00,0x74,0x00,0x79,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7a,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x1a,0x00,0x25,0x00,0x36,0x00,0x44,0x00,0x48,0x00,0x5d,0x00,0x01,0x00,0x59, -0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x7b,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7c,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x1b,0x00,0x10,0x00,0x57,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01, -0x00,0x7e,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7f,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x80,0x00,0x0a,0x00,0x01,0x54,0x52,0x4b,0x20,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x1c,0x00,0x26,0x00,0x11,0x00,0x37,0x00,0x45,0x00,0x49,0x00,0x5e,0x00,0x02,0x00,0x5a,0x00,0x62,0x00,0x66, -0x00,0x6a,0x00,0x6e,0x00,0x72,0x00,0x76,0x00,0x81,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x1d,0x00,0x27,0x00,0x12,0x00,0x38,0x00,0x46,0x00,0x4a,0x00,0x5f,0x00,0x03,0x00,0x5b,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73,0x00,0x77,0x00,0x82,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x83,0x00,0x04,0x00,0x00, -0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x84,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x85,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x86,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x87,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x88,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff, -0x00,0x01,0x00,0x89,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x8a,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x8b,0x00,0x8c,0x63,0x32,0x73,0x63,0x03,0x4a,0x63,0x32,0x73,0x63,0x03,0x50,0x63,0x32,0x73,0x63,0x03,0x56,0x63,0x32,0x73,0x63,0x03,0x60,0x63,0x61,0x6c,0x74,0x03,0x6a,0x63,0x61,0x6c,0x74, -0x03,0x70,0x63,0x61,0x6c,0x74,0x03,0x76,0x63,0x61,0x6c,0x74,0x03,0x7c,0x63,0x61,0x6c,0x74,0x03,0x82,0x63,0x61,0x6c,0x74,0x03,0x88,0x63,0x63,0x6d,0x70,0x03,0x8e,0x63,0x63,0x6d,0x70,0x03,0x98,0x63,0x63,0x6d,0x70,0x03,0xaa,0x63,0x63,0x6d,0x70,0x03,0xb4,0x63,0x63,0x6d,0x70,0x03,0xbe,0x63,0x63,0x6d,0x70,0x03,0xc8,0x63,0x63, -0x6d,0x70,0x03,0xda,0x63,0x63,0x6d,0x70,0x04,0x0c,0x63,0x63,0x6d,0x70,0x04,0x1a,0x64,0x6c,0x69,0x67,0x04,0x24,0x64,0x6c,0x69,0x67,0x04,0x2a,0x64,0x6c,0x69,0x67,0x04,0x30,0x64,0x6c,0x69,0x67,0x04,0x36,0x64,0x6c,0x69,0x67,0x04,0x3c,0x64,0x6c,0x69,0x67,0x04,0x42,0x64,0x6c,0x69,0x67,0x04,0x48,0x64,0x6c,0x69,0x67,0x04,0x4e, -0x64,0x6c,0x69,0x67,0x04,0x54,0x64,0x6c,0x69,0x67,0x04,0x5a,0x64,0x6c,0x69,0x67,0x04,0x62,0x66,0x69,0x6e,0x61,0x04,0x68,0x66,0x69,0x6e,0x61,0x04,0x6e,0x66,0x69,0x6e,0x61,0x04,0x74,0x66,0x69,0x6e,0x61,0x04,0x7a,0x66,0x69,0x6e,0x61,0x04,0x80,0x66,0x69,0x6e,0x61,0x04,0x86,0x66,0x72,0x61,0x63,0x04,0x8c,0x66,0x72,0x61,0x63, -0x04,0x96,0x66,0x72,0x61,0x63,0x04,0xa0,0x66,0x72,0x61,0x63,0x04,0xaa,0x69,0x6e,0x69,0x74,0x04,0xb4,0x69,0x6e,0x69,0x74,0x04,0xba,0x69,0x6e,0x69,0x74,0x04,0xc0,0x69,0x6e,0x69,0x74,0x04,0xc6,0x69,0x6e,0x69,0x74,0x04,0xcc,0x69,0x6e,0x69,0x74,0x04,0xd2,0x69,0x73,0x6f,0x6c,0x04,0xd8,0x6c,0x69,0x67,0x61,0x04,0xde,0x6c,0x69, -0x67,0x61,0x04,0xe8,0x6c,0x69,0x67,0x61,0x04,0xf2,0x6c,0x69,0x67,0x61,0x04,0xfa,0x6c,0x69,0x67,0x61,0x05,0x04,0x6c,0x69,0x67,0x61,0x05,0x0c,0x6c,0x6e,0x75,0x6d,0x05,0x16,0x6c,0x6e,0x75,0x6d,0x05,0x1e,0x6c,0x6e,0x75,0x6d,0x05,0x26,0x6c,0x6e,0x75,0x6d,0x05,0x2e,0x6c,0x6f,0x63,0x6c,0x05,0x36,0x6c,0x6f,0x63,0x6c,0x05,0x3c, -0x6c,0x6f,0x63,0x6c,0x05,0x42,0x6c,0x6f,0x63,0x6c,0x05,0x48,0x6d,0x65,0x64,0x69,0x05,0x4e,0x6d,0x65,0x64,0x69,0x05,0x54,0x6d,0x65,0x64,0x69,0x05,0x5a,0x6d,0x65,0x64,0x69,0x05,0x60,0x6d,0x65,0x64,0x69,0x05,0x66,0x6d,0x65,0x64,0x69,0x05,0x6c,0x6f,0x6e,0x75,0x6d,0x05,0x72,0x6f,0x6e,0x75,0x6d,0x05,0x7a,0x6f,0x6e,0x75,0x6d, -0x05,0x82,0x6f,0x6e,0x75,0x6d,0x05,0x8a,0x70,0x6e,0x75,0x6d,0x05,0x92,0x70,0x6e,0x75,0x6d,0x05,0x9a,0x70,0x6e,0x75,0x6d,0x05,0xa2,0x70,0x6e,0x75,0x6d,0x05,0xaa,0x72,0x63,0x6c,0x74,0x05,0xb2,0x72,0x63,0x6c,0x74,0x05,0xb8,0x72,0x63,0x6c,0x74,0x05,0xbe,0x72,0x63,0x6c,0x74,0x05,0xc4,0x72,0x63,0x6c,0x74,0x05,0xca,0x72,0x63, -0x6c,0x74,0x05,0xd0,0x72,0x6c,0x69,0x67,0x05,0xd6,0x72,0x6c,0x69,0x67,0x05,0xde,0x72,0x6c,0x69,0x67,0x05,0xe6,0x72,0x6c,0x69,0x67,0x05,0xee,0x72,0x6c,0x69,0x67,0x05,0xf6,0x72,0x6c,0x69,0x67,0x05,0xfe,0x72,0x6c,0x69,0x67,0x06,0x06,0x73,0x61,0x6c,0x74,0x06,0x0c,0x73,0x61,0x6c,0x74,0x06,0x18,0x73,0x61,0x6c,0x74,0x06,0x24, -0x73,0x61,0x6c,0x74,0x06,0x30,0x73,0x6d,0x63,0x70,0x06,0x3c,0x73,0x6d,0x63,0x70,0x06,0x42,0x73,0x6d,0x63,0x70,0x06,0x48,0x73,0x6d,0x63,0x70,0x06,0x54,0x73,0x73,0x30,0x31,0x06,0x60,0x73,0x73,0x30,0x31,0x06,0x66,0x73,0x73,0x30,0x31,0x06,0x6c,0x73,0x73,0x30,0x31,0x06,0x72,0x73,0x73,0x31,0x38,0x06,0x78,0x73,0x73,0x31,0x38, -0x06,0x80,0x73,0x73,0x31,0x38,0x06,0x88,0x73,0x73,0x31,0x38,0x06,0x90,0x73,0x73,0x31,0x39,0x06,0x98,0x73,0x73,0x31,0x39,0x06,0x9e,0x73,0x73,0x31,0x39,0x06,0xa4,0x73,0x73,0x31,0x39,0x06,0xaa,0x73,0x73,0x32,0x30,0x06,0xb0,0x73,0x73,0x32,0x30,0x06,0xba,0x73,0x73,0x32,0x30,0x06,0xc4,0x73,0x73,0x32,0x30,0x06,0xce,0x73,0x75, -0x62,0x73,0x06,0xd8,0x73,0x75,0x62,0x73,0x06,0xde,0x73,0x75,0x62,0x73,0x06,0xe4,0x73,0x75,0x62,0x73,0x06,0xea,0x73,0x75,0x70,0x73,0x06,0xf0,0x73,0x75,0x70,0x73,0x06,0xf6,0x73,0x75,0x70,0x73,0x06,0xfc,0x73,0x75,0x70,0x73,0x07,0x02,0x74,0x6e,0x75,0x6d,0x07,0x08,0x74,0x6e,0x75,0x6d,0x07,0x0e,0x74,0x6e,0x75,0x6d,0x07,0x16, -0x74,0x6e,0x75,0x6d,0x07,0x1c,0x74,0x6e,0x75,0x6d,0x07,0x24,0x74,0x6e,0x75,0x6d,0x07,0x2a,0x74,0x6e,0x75,0x6d,0x07,0x30,0x74,0x6e,0x75,0x6d,0x07,0x36,0x74,0x6e,0x75,0x6d,0x07,0x3c,0x74,0x6e,0x75,0x6d,0x07,0x42,0x74,0x6e,0x75,0x6d,0x07,0x6e,0x74,0x6e,0x75,0x6d,0x07,0x76,0x74,0x6e,0x75,0x6d,0x07,0x7c,0x74,0x6e,0x75,0x6d, -0x07,0x82,0x74,0x6e,0x75,0x6d,0x07,0x8a,0x74,0x6e,0x75,0x6d,0x07,0x90,0x74,0x6e,0x75,0x6d,0x07,0x96,0x74,0x6e,0x75,0x6d,0x07,0x9c,0x74,0x6e,0x75,0x6d,0x07,0xa2,0x74,0x6e,0x75,0x6d,0x07,0xa8,0x00,0x00,0x00,0x01,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x1f,0x00,0x00,0x00,0x03,0x00,0x1d,0x00,0x1f,0x00,0x21,0x00,0x00,0x00,0x03, -0x00,0x1d,0x00,0x1f,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x05,0x00,0x08,0x00,0x09,0x00,0x0a, -0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x05,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x17,0x00,0x4e,0x00,0x4f,0x00,0x50, -0x00,0x51,0x00,0x52,0x00,0x53,0x00,0x54,0x00,0x55,0x00,0x56,0x00,0x57,0x00,0x58,0x00,0x59,0x00,0x5a,0x00,0x5b,0x00,0x5c,0x00,0x5d,0x00,0x5e,0x00,0x5f,0x00,0x60,0x00,0x61,0x00,0x62,0x00,0x63,0x00,0x64,0x00,0x00,0x00,0x05,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x39,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x18,0x00,0x19,0x00,0x1a, -0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x4d,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x26,0x00,0x00, -0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03, -0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x13, -0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x13,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x13,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f, -0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01, -0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00, -0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11, -0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37, -0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x04,0x00,0x1e,0x00,0x20,0x00,0x22,0x00,0x23,0x00,0x00,0x00,0x04,0x00,0x1e,0x00,0x20,0x00,0x22,0x00,0x24,0x00,0x00,0x00,0x01, -0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0x36, -0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1b, -0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x3d,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30, -0x00,0x00,0x00,0x01,0x00,0x3e,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x45,0x00,0x00,0x00,0x14,0x00,0x2d,0x00,0x30,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47, -0x00,0x48,0x00,0x49,0x00,0x4a,0x00,0x4b,0x00,0x4c,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x00,0x01,0x00,0x4a,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x00,0x01,0x00,0x3f,0x00,0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00, -0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x46,0x00,0x84,0x01,0x0a,0x01,0x1a,0x01,0x2a,0x01,0x3a,0x01,0x4a,0x01,0x64,0x01,0x74,0x01,0x84,0x01,0x94,0x01,0xb8,0x01,0xe6,0x02,0x00,0x02,0x1a,0x02,0x2a,0x02,0x44,0x02,0x54,0x02,0x64,0x02,0x74,0x02,0x84,0x02,0x94,0x02,0xa4,0x02,0xb4,0x02,0xc4,0x02,0xd4,0x02,0xf8,0x03,0x08, -0x03,0x18,0x03,0x28,0x03,0x38,0x03,0x48,0x03,0x58,0x03,0x68,0x03,0x78,0x03,0x88,0x03,0x98,0x03,0xa8,0x03,0xb8,0x03,0xc8,0x03,0xd8,0x03,0xe8,0x03,0xf8,0x04,0x08,0x04,0x18,0x04,0x28,0x04,0x38,0x04,0x48,0x04,0x58,0x04,0x68,0x04,0x78,0x04,0x88,0x04,0x98,0x04,0xa8,0x04,0xb8,0x04,0xc8,0x04,0xd8,0x04,0xe8,0x04,0xf8,0x05,0x08, -0x05,0x18,0x05,0x28,0x05,0x38,0x05,0x48,0x05,0x58,0x05,0x68,0x05,0x78,0x05,0x88,0x05,0x98,0x05,0xa8,0x05,0xb8,0x05,0xc8,0x05,0xd8,0x05,0xe8,0x05,0xf8,0x06,0x08,0x06,0x18,0x06,0x28,0x06,0x38,0x06,0x48,0x06,0x58,0x06,0x68,0x06,0x96,0x07,0xbe,0x07,0xce,0x07,0xde,0x07,0xee,0x07,0xfe,0x08,0x0e,0x08,0x1e,0x08,0x2e,0x08,0x3e, -0x08,0x4e,0x08,0x5e,0x08,0x6e,0x08,0x7e,0x08,0x8e,0x09,0x84,0x09,0x94,0x09,0xa4,0x0a,0x72,0x0a,0x82,0x0a,0x92,0x0b,0x06,0x0b,0x98,0x0b,0xa8,0x0b,0xb8,0x0b,0xc8,0x0b,0xd8,0x0b,0xe8,0x0b,0xf8,0x0c,0x08,0x0c,0x18,0x0c,0x28,0x0c,0x38,0x0c,0x48,0x0c,0x58,0x0c,0x68,0x0c,0x78,0x0c,0x88,0x0c,0x98,0x0c,0xa8,0x0c,0xb8,0x0c,0xc8, -0x0c,0xd8,0x0c,0xe8,0x0c,0xf8,0x0d,0x08,0x0d,0x18,0x0d,0x28,0x0d,0x38,0x0d,0x48,0x0d,0x58,0x0d,0x68,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x66,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x80,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, -0x00,0x00,0x0c,0x7e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x80,0x00,0x07,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00,0x0c,0x92,0x00,0x01,0x00,0x06,0x00,0x00,0x0c,0x98,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x11,0x58,0x00,0x07, -0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x12,0x72,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x12,0x82,0x00,0x07,0x00,0x09,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x12,0xc6,0x00,0x01,0x00,0x06,0x00,0x00,0x12,0xd0,0x00,0x01,0x00,0x06,0x00,0x00, -0x12,0xdc,0x00,0x07,0x00,0x09,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x0a,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x14,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x2e,0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00, -0x13,0x6a,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x74,0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xa2,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xac,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xde,0x00,0x07,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01, -0x00,0x06,0x00,0x00,0x14,0x0e,0x00,0x01,0x00,0x06,0x00,0x00,0x14,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x14,0x44,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x19,0x4e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x1d,0x54,0x00,0x07, -0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x21,0x62,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x21,0xc6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x22,0x68,0x00,0x07, -0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x22,0xa2,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x23,0xcc,0x00,0x07,0x01,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x24,0x5c,0x00,0x01,0x00,0x06,0x00,0x00,0x27,0x74,0x00,0x01,0x00,0x06,0x00,0x00, -0x27,0x80,0x00,0x07,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x2f,0x74,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x2f,0xf6,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x35,0x5a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x36,0xf2,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x06,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x2a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x94,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x37,0xfe,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x38,0x52,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x38,0xa8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3b,0x78,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x3e,0x4c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0x4a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3e,0x48,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3e,0x62,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x3e,0x82,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x3e,0x80,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0x9c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xb0,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x3e,0xc4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xd8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xec,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x3f,0x14,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x28,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x3c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3f,0x50,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x3f,0xf6,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x41,0x0c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x41,0x62,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x42,0x9a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x43,0x42,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0x40,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0x48,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0xd2,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x44,0x5c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x70,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x84,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x98,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x44,0xac,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xc0,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xd4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xe8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x44,0xfc,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x10,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x24,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x38,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x45,0x4c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x60,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x74,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x88,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x45,0x9c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0xb0,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x45,0xc4,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x45,0xcc,0x00,0x07,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26, -0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xd0,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xda,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xe6,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xf2,0x00,0x07,0x00,0x01,0x00,0x1d,0x00,0x40,0x00,0x48,0x00,0x50,0x00,0x58,0x00,0x60,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0, -0x00,0xa8,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x00,0xc8,0x00,0xd0,0x00,0xd8,0x00,0xe0,0x00,0xe8,0x00,0xf0,0x00,0xf8,0x01,0x00,0x01,0x08,0x01,0x10,0x01,0x18,0x01,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x44,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x52,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x62,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x72, -0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x84,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x90,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x9e,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xac,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xbc,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xcc,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xde,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xee, -0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x0c,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x1a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x2a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x3a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x48,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x58,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x6a, -0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x7c,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x9a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xaa,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xba,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xcc,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xde,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xf2, -0x00,0x01,0x00,0x06,0x00,0x00,0x48,0x04,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x48,0xde,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x48,0xdc,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x48,0xe8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08, -0x00,0x01,0x00,0x04,0x00,0x00,0x49,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x49,0x36,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x4a,0xd6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x4b,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08, -0x00,0x01,0x00,0x04,0x00,0x00,0x4b,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x59,0xc8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5a,0x70,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5b,0xe2,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08, -0x00,0x01,0x00,0x04,0x00,0x00,0x5c,0x08,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x5c,0x10,0x00,0x07,0x00,0x01,0x00,0x18,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6, -0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe6,0x00,0xee,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xe0,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xec,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xfa,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x0a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x2a,0x00,0x01, -0x00,0x06,0x00,0x00,0x5c,0x3a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x4c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x60,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x6c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x7a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x9c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xaa,0x00,0x01, -0x00,0x06,0x00,0x00,0x5c,0xb8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xc8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xd8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xea,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xfc,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x10,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x30,0x00,0x01, -0x00,0x06,0x00,0x00,0x5d,0x3e,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x4a,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5e,0x3a,0x00,0x07,0x00,0x01,0x00,0x14,0x00,0x2e,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56, -0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x34,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x42,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x52,0x00,0x01,0x00,0x06, -0x00,0x00,0x5e,0x60,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x70,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x7e,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x8e,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x9c,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xac,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xba,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xca,0x00,0x01,0x00,0x06, -0x00,0x00,0x5e,0xd8,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xe8,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xf6,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x06,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x14,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x32,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x42,0x00,0x07,0x00,0x01, -0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x60,0x46,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x60,0xc4,0x00,0x07,0x00,0x01,0x00,0x0b,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x44,0x00,0x4c,0x00,0x54,0x00,0x5c,0x00,0x64,0x00,0x6c,0x00,0x01,0x00,0x06,0x00,0x00,0x60,0xec, -0x00,0x01,0x00,0x06,0x00,0x00,0x60,0xfc,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x0c,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x1a,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x28,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x36,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x44,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x52,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x60, -0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x6e,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x7c,0x00,0x07,0x00,0x01,0x00,0x0e,0x00,0x22,0x00,0x2a,0x00,0x32,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x62,0x5e,0x00,0x01,0x00,0x06,0x00,0x00, -0x62,0x6a,0x00,0x01,0x00,0x06,0x00,0x00,0x63,0x06,0x00,0x01,0x00,0x06,0x00,0x00,0x63,0x2e,0x00,0x01,0x00,0x06,0x00,0x00,0x64,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x64,0x42,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0x22,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0x36,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0xee,0x00,0x01,0x00,0x06,0x00,0x00, -0x66,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x66,0xb0,0x00,0x01,0x00,0x06,0x00,0x00,0x66,0xe0,0x00,0x01,0x00,0x06,0x00,0x00,0x67,0xd6,0x00,0x01,0x00,0x06,0x00,0x00,0x68,0x00,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x68,0xe2,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x68,0xe0,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x69,0x18,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x69,0x50,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6a,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00, -0x6a,0xc8,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6b,0x84,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6b,0xa8,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6b,0xea,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x6c,0x22,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6c,0xfe,0x00,0x07,0x01,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6d,0xc0,0x00,0x07,0x01,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6d,0xda,0x00,0x07,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x6d,0xf4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x08,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x1a,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, -0x6e,0x18,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x16,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x2c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6e,0x34,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00, -0x6e,0xb8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6f,0x58,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0xb4,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0xc0,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00, -0x74,0x38,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0x9e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xc6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xea,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00, -0x75,0x1a,0x00,0x02,0x00,0x0e,0x00,0x04,0x0e,0x19,0x0e,0x1f,0x0e,0x63,0x0e,0x64,0x00,0x02,0x00,0x04,0x08,0xf8,0x08,0xf8,0x00,0x00,0x09,0x05,0x09,0x05,0x00,0x01,0x09,0x2d,0x09,0x2d,0x00,0x02,0x0a,0x68,0x0a,0x68,0x00,0x03,0x00,0x02,0x00,0x08,0x00,0x01,0x0a,0x3e,0x00,0x01,0x00,0x01,0x09,0xdd,0x00,0x02,0x00,0x0a,0x00,0x02, -0x0e,0x19,0x0e,0x1f,0x00,0x01,0x00,0x02,0x08,0xf8,0x09,0x05,0x00,0x02,0x00,0x0e,0x00,0x04,0x0a,0x3c,0x08,0xdd,0x0a,0x3d,0x0e,0x15,0x00,0x02,0x00,0x03,0x09,0x53,0x09,0x53,0x00,0x00,0x09,0x55,0x09,0x56,0x00,0x01,0x0e,0x14,0x0e,0x14,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x1e,0x00,0x01,0x04,0xd8,0x00,0x00,0x00,0x00,0x00,0x03, -0x00,0x00,0x00,0x01,0x04,0xca,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x02,0x00,0xc9,0x08,0xc7,0x08,0xca,0x00,0x00,0x08,0xcf,0x08,0xcf,0x00,0x04,0x08,0xd1,0x08,0xd1,0x00,0x05,0x08,0xd3,0x08,0xd3,0x00,0x06,0x08,0xe4,0x08,0xe4,0x00,0x07,0x08,0xe7,0x08,0xe7,0x00,0x08,0x08,0xf1,0x08,0xf3,0x00,0x09,0x08,0xf5,0x08,0xf7, -0x00,0x0c,0x08,0xfa,0x08,0xfb,0x00,0x0f,0x08,0xff,0x09,0x00,0x00,0x11,0x09,0x02,0x09,0x02,0x00,0x13,0x09,0x08,0x09,0x20,0x00,0x14,0x09,0x22,0x09,0x2b,0x00,0x2d,0x09,0x34,0x09,0x35,0x00,0x37,0x09,0x3e,0x09,0x3e,0x00,0x39,0x09,0x40,0x09,0x40,0x00,0x3a,0x09,0x42,0x09,0x43,0x00,0x3b,0x09,0x45,0x09,0x46,0x00,0x3d,0x09,0x48, -0x09,0x48,0x00,0x3f,0x09,0x4a,0x09,0x4b,0x00,0x40,0x09,0x4d,0x09,0x4e,0x00,0x42,0x09,0x59,0x09,0x59,0x00,0x44,0x09,0x5b,0x09,0x5b,0x00,0x45,0x09,0x5d,0x09,0x60,0x00,0x46,0x09,0x63,0x09,0x68,0x00,0x4a,0x09,0x6c,0x09,0x6c,0x00,0x50,0x09,0x72,0x09,0x72,0x00,0x51,0x09,0x7c,0x09,0x7c,0x00,0x52,0x09,0x80,0x09,0x8c,0x00,0x53, -0x09,0x8e,0x09,0x8e,0x00,0x60,0x09,0x90,0x09,0x90,0x00,0x61,0x09,0x92,0x09,0x92,0x00,0x62,0x09,0x94,0x09,0x94,0x00,0x63,0x09,0x96,0x09,0x96,0x00,0x64,0x09,0x98,0x09,0x99,0x00,0x65,0x09,0x9b,0x09,0x9c,0x00,0x67,0x09,0x9e,0x09,0x9f,0x00,0x69,0x09,0xa1,0x09,0xa2,0x00,0x6b,0x09,0xa4,0x09,0xa5,0x00,0x6d,0x09,0xa7,0x09,0xa8, -0x00,0x6f,0x09,0xaa,0x09,0xb9,0x00,0x71,0x09,0xbb,0x09,0xbb,0x00,0x81,0x09,0xbd,0x09,0xbd,0x00,0x82,0x09,0xbf,0x09,0xbf,0x00,0x83,0x09,0xc1,0x09,0xc1,0x00,0x84,0x09,0xc3,0x09,0xc5,0x00,0x85,0x09,0xc8,0x09,0xc9,0x00,0x88,0x09,0xcc,0x09,0xcc,0x00,0x8a,0x09,0xcf,0x09,0xcf,0x00,0x8b,0x09,0xd2,0x09,0xd2,0x00,0x8c,0x09,0xd5, -0x09,0xd7,0x00,0x8d,0x09,0xd9,0x09,0xd9,0x00,0x90,0x09,0xdb,0x09,0xdb,0x00,0x91,0x09,0xdd,0x09,0xdd,0x00,0x92,0x09,0xdf,0x09,0xdf,0x00,0x93,0x09,0xe1,0x09,0xe1,0x00,0x94,0x09,0xe3,0x09,0xe3,0x00,0x95,0x09,0xe5,0x09,0xe5,0x00,0x96,0x09,0xe7,0x09,0xe7,0x00,0x97,0x09,0xe9,0x09,0xe9,0x00,0x98,0x09,0xeb,0x09,0xeb,0x00,0x99, -0x09,0xed,0x09,0xed,0x00,0x9a,0x09,0xef,0x09,0xef,0x00,0x9b,0x09,0xf1,0x09,0xf1,0x00,0x9c,0x09,0xf3,0x09,0xf3,0x00,0x9d,0x09,0xf5,0x09,0xf6,0x00,0x9e,0x09,0xf8,0x09,0xf8,0x00,0xa0,0x09,0xfa,0x09,0xfb,0x00,0xa1,0x09,0xfd,0x0a,0x08,0x00,0xa3,0x0a,0x0a,0x0a,0x0e,0x00,0xaf,0x0a,0x24,0x0a,0x24,0x00,0xb4,0x0a,0x26,0x0a,0x26, -0x00,0xb5,0x0a,0x28,0x0a,0x29,0x00,0xb6,0x0a,0x32,0x0a,0x3b,0x00,0xb8,0x0a,0x3e,0x0a,0x3f,0x00,0xc2,0x0a,0x41,0x0a,0x42,0x00,0xc4,0x0a,0x54,0x0a,0x59,0x00,0xc6,0x0a,0x72,0x0a,0x72,0x00,0xcc,0x0a,0x74,0x0a,0x74,0x00,0xcd,0x0a,0x76,0x0a,0x76,0x00,0xce,0x0a,0x78,0x0a,0x78,0x00,0xcf,0x0a,0x7a,0x0a,0x7a,0x00,0xd0,0x0a,0x7c, -0x0a,0x7c,0x00,0xd1,0x0a,0x7e,0x0a,0x7e,0x00,0xd2,0x0a,0x80,0x0a,0x81,0x00,0xd3,0x0a,0x83,0x0a,0x84,0x00,0xd5,0x0a,0x86,0x0a,0x89,0x00,0xd7,0x0a,0x8b,0x0a,0x8c,0x00,0xdb,0x0a,0x8f,0x0a,0x90,0x00,0xdd,0x0a,0x93,0x0a,0x94,0x00,0xdf,0x0a,0x97,0x0a,0x97,0x00,0xe1,0x0a,0x9a,0x0a,0x9a,0x00,0xe2,0x0a,0x9d,0x0a,0x9d,0x00,0xe3, -0x0a,0xa0,0x0a,0xa0,0x00,0xe4,0x0a,0xa3,0x0a,0xa3,0x00,0xe5,0x0a,0xa6,0x0a,0xa6,0x00,0xe6,0x0a,0xa8,0x0a,0xa8,0x00,0xe7,0x0a,0xaa,0x0a,0xaa,0x00,0xe8,0x0a,0xac,0x0a,0xac,0x00,0xe9,0x0a,0xae,0x0a,0xae,0x00,0xea,0x0a,0xb0,0x0a,0xb1,0x00,0xeb,0x0a,0xb4,0x0a,0xb6,0x00,0xed,0x0a,0xb9,0x0a,0xba,0x00,0xf0,0x0b,0x0c,0x0b,0x1a, -0x00,0xf2,0x0e,0x20,0x0e,0x21,0x01,0x01,0x0e,0x24,0x0e,0x24,0x01,0x03,0x0e,0x26,0x0e,0x26,0x01,0x04,0x0e,0x28,0x0e,0x28,0x01,0x05,0x0e,0x2a,0x0e,0x2a,0x01,0x06,0x0e,0x2f,0x0e,0x31,0x01,0x07,0x0e,0x33,0x0e,0x33,0x01,0x0a,0x0e,0x35,0x0e,0x35,0x01,0x0b,0x0e,0x37,0x0e,0x37,0x01,0x0c,0x0e,0x39,0x0e,0x39,0x01,0x0d,0x0e,0x3c, -0x0e,0x3c,0x01,0x0e,0x0e,0x3f,0x0e,0x40,0x01,0x0f,0x0e,0x43,0x0e,0x44,0x01,0x11,0x0e,0x47,0x0e,0x48,0x01,0x13,0x0e,0x4b,0x0e,0x4c,0x01,0x15,0x0e,0x4f,0x0e,0x50,0x01,0x17,0x0e,0x53,0x0e,0x55,0x01,0x19,0x0e,0x57,0x0e,0x57,0x01,0x1c,0x0e,0x59,0x0e,0x59,0x01,0x1d,0x0e,0x5e,0x0e,0x5e,0x01,0x1e,0x0e,0x6e,0x0e,0x6e,0x01,0x1f, -0x0e,0x70,0x0e,0x70,0x01,0x20,0x0e,0x74,0x0e,0x75,0x01,0x21,0x0e,0x78,0x0e,0x78,0x01,0x23,0x0e,0x7a,0x0e,0x7a,0x01,0x24,0x0e,0x7c,0x0e,0x7c,0x01,0x25,0x0e,0x7e,0x0e,0x7e,0x01,0x26,0x0e,0x80,0x0e,0x80,0x01,0x27,0x0e,0x82,0x0e,0x82,0x01,0x28,0x0e,0x84,0x0e,0x84,0x01,0x29,0x0e,0x86,0x0e,0x86,0x01,0x2a,0x0e,0x8f,0x0e,0x98, -0x01,0x2b,0x0e,0x9a,0x0e,0x9a,0x01,0x35,0x0e,0x9c,0x0e,0x9c,0x01,0x36,0x0e,0x9e,0x0e,0x9e,0x01,0x37,0x0e,0xa0,0x0e,0xa0,0x01,0x38,0x0e,0xa2,0x0e,0xa2,0x01,0x39,0x0e,0xa5,0x0e,0xab,0x01,0x3a,0x0e,0xae,0x0e,0xae,0x01,0x41,0x0e,0xb1,0x0e,0xb1,0x01,0x42,0x0e,0xb3,0x0e,0xb3,0x01,0x43,0x0e,0xb5,0x0e,0xb5,0x01,0x44,0x0e,0xb7, -0x0e,0xb7,0x01,0x45,0x0e,0xb9,0x0e,0xb9,0x01,0x46,0x0e,0xbb,0x0e,0xbb,0x01,0x47,0x0e,0xbd,0x0e,0xbd,0x01,0x48,0x0e,0xbf,0x0e,0xbf,0x01,0x49,0x0e,0xc1,0x0e,0xc1,0x01,0x4a,0x0e,0xc3,0x0e,0xc3,0x01,0x4b,0x0e,0xc5,0x0e,0xc5,0x01,0x4c,0x0e,0xc7,0x0e,0xc7,0x01,0x4d,0x0e,0xc9,0x0e,0xcd,0x01,0x4e,0x0e,0xcf,0x0e,0xd0,0x01,0x53, -0x0e,0xd3,0x0e,0xd3,0x01,0x55,0x0e,0xd5,0x0e,0xd5,0x01,0x56,0x0e,0xda,0x0e,0xe3,0x01,0x57,0x0e,0xe6,0x0e,0xe6,0x01,0x61,0x0e,0xec,0x0e,0xec,0x01,0x62,0x0e,0xee,0x0e,0xee,0x01,0x63,0x0e,0xf0,0x0e,0xf0,0x01,0x64,0x0e,0xf2,0x0e,0xf2,0x01,0x65,0x0e,0xf4,0x0e,0xf4,0x01,0x66,0x0e,0xf6,0x0e,0xf6,0x01,0x67,0x0e,0xf8,0x0e,0xf8, -0x01,0x68,0x0e,0xfa,0x0e,0xfa,0x01,0x69,0x0e,0xfc,0x0e,0xfc,0x01,0x6a,0x0f,0x00,0x0f,0x03,0x01,0x6b,0x0f,0x05,0x0f,0x0a,0x01,0x6f,0x0f,0x0c,0x0f,0x0c,0x01,0x75,0x0f,0x0e,0x0f,0x0e,0x01,0x76,0x0f,0x10,0x0f,0x10,0x01,0x77,0x0f,0x12,0x0f,0x12,0x01,0x78,0x0f,0x14,0x0f,0x14,0x01,0x79,0x0f,0x16,0x0f,0x17,0x01,0x7a,0x0f,0x1a, -0x0f,0x1b,0x01,0x7c,0x0f,0x1e,0x0f,0x1f,0x01,0x7e,0x0f,0x22,0x0f,0x25,0x01,0x80,0x0f,0x28,0x0f,0x2d,0x01,0x84,0x0f,0x30,0x0f,0x31,0x01,0x8a,0x0f,0x34,0x0f,0x35,0x01,0x8c,0x0f,0x38,0x0f,0x41,0x01,0x8e,0x0f,0x44,0x0f,0x45,0x01,0x98,0x0f,0x48,0x0f,0x49,0x01,0x9a,0x0f,0x4c,0x0f,0x4d,0x01,0x9c,0x0f,0x62,0x0f,0x6b,0x01,0x9e, -0x0f,0x98,0x0f,0xa4,0x01,0xa8,0x0f,0xa6,0x0f,0xb3,0x01,0xb5,0x0f,0xb5,0x0f,0xbc,0x01,0xc3,0x14,0x55,0x14,0x5c,0x01,0xcb,0x14,0x73,0x14,0x73,0x01,0xd3,0x14,0x76,0x14,0x76,0x01,0xd4,0x14,0x79,0x14,0x79,0x01,0xd5,0x14,0x7d,0x14,0x7e,0x01,0xd6,0x14,0x81,0x14,0x81,0x01,0xd8,0x14,0x84,0x14,0x84,0x01,0xd9,0x14,0x87,0x14,0x87, -0x01,0xda,0x14,0xad,0x14,0xae,0x01,0xdb,0x00,0x01,0x00,0x01,0x09,0x28,0x00,0x01,0x01,0x0e,0x00,0x0c,0x00,0x1e,0x00,0x30,0x00,0x42,0x00,0x4c,0x00,0x5e,0x00,0x70,0x00,0x7a,0x00,0xb4,0x00,0xbe,0x00,0xd0,0x00,0xf2,0x01,0x04,0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x62,0x00,0x02,0x09,0x32,0x0e,0x69,0x00,0x02,0x09,0x7e,0x00,0x02, -0x00,0x06,0x00,0x0c,0x0a,0x68,0x00,0x02,0x09,0x32,0x0e,0x66,0x00,0x02,0x09,0x7e,0x00,0x01,0x00,0x04,0x0e,0x6b,0x00,0x02,0x09,0x7f,0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x65,0x00,0x02,0x09,0x32,0x0e,0x67,0x00,0x02,0x09,0x7e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x66,0x00,0x02,0x09,0x32,0x0e,0x68,0x00,0x02,0x09,0x7e,0x00,0x01, -0x00,0x04,0x0e,0x6c,0x00,0x02,0x09,0x7f,0x00,0x07,0x00,0x10,0x00,0x16,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x2e,0x00,0x34,0x0a,0x65,0x00,0x02,0x09,0x2f,0x0a,0x66,0x00,0x02,0x09,0x30,0x0a,0x68,0x00,0x02,0x09,0x2d,0x0e,0x62,0x00,0x02,0x09,0x2c,0x0e,0x64,0x00,0x02,0x0e,0x63,0x0e,0x65,0x00,0x02,0x09,0x73,0x13,0xe9,0x00,0x02, -0x09,0x73,0x00,0x01,0x00,0x04,0x0e,0x6a,0x00,0x02,0x09,0x7e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x65,0x00,0x02,0x09,0x32,0x13,0xe9,0x00,0x02,0x09,0x32,0x00,0x04,0x00,0x0a,0x00,0x10,0x00,0x16,0x00,0x1c,0x0e,0x66,0x00,0x02,0x09,0x2d,0x0e,0x67,0x00,0x02,0x09,0x2f,0x0e,0x68,0x00,0x02,0x09,0x30,0x0e,0x6a,0x00,0x02,0x09,0x33, -0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x6b,0x00,0x02,0x09,0x2e,0x0e,0x6c,0x00,0x02,0x09,0x31,0x00,0x01,0x00,0x04,0x0e,0x64,0x00,0x02,0x09,0x32,0x00,0x02,0x00,0x04,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x73,0x09,0x73,0x00,0x08,0x09,0x7e,0x09,0x7f,0x00,0x09,0x0e,0x63,0x0e,0x63,0x00,0x0b,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x08, -0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x67,0x00,0x02,0x09,0x31,0x0a,0x69,0x00,0x02,0x09,0x2e,0x00,0x01,0x00,0x01,0x09,0x32,0x00,0x01,0x00,0x52,0x00,0x01,0x00,0x08,0x00,0x09,0x00,0x14,0x00,0x1a,0x00,0x20,0x00,0x26,0x00,0x2c,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x11,0x9a,0x00,0x02,0x08,0xd8,0x11,0x9b,0x00,0x02,0x08,0xd9, -0x11,0x9c,0x00,0x02,0x08,0xda,0x11,0x9d,0x00,0x02,0x08,0xdb,0x11,0x9e,0x00,0x02,0x08,0xdc,0x11,0x9f,0x00,0x02,0x08,0xdd,0x11,0xa0,0x00,0x02,0x08,0xde,0x11,0xa1,0x00,0x02,0x08,0xdf,0x11,0xa2,0x00,0x02,0x08,0xe0,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x00, -0x00,0x67,0x00,0x03,0x00,0x02,0x00,0x48,0x00,0x52,0x00,0x01,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x03,0x00,0x03,0x00,0x34,0x00,0x34,0x00,0x3e,0x00,0x01,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x01,0x00,0x02,0x0a,0x14,0x14,0x6b,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f, -0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x6a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x03,0x00,0x02,0x00,0x6e,0x00,0x42,0x00,0x01,0x00,0x58,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68, -0x00,0x03,0x00,0x03,0x00,0x5a,0x00,0x5a,0x00,0x2e,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x03,0x00,0x04,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x18,0x00,0x01,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x00,0x03,0x0a,0x44,0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45, -0x13,0x45,0x00,0x02,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x26,0x00,0x01,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x03,0x00,0x02,0x00,0x30,0x00,0x3a,0x00,0x01, -0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x01,0x0a,0x45,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x14,0x9a,0x00,0x03,0x00,0x01,0x00,0x26,0x00,0x01,0x00,0x2e, -0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x03,0x00,0x02,0x00,0x32,0x00,0x3c,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x01,0x00,0x02,0x0a,0x45,0x0a,0x46,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e, -0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x14,0x9a,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x24,0x00,0x01,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x02,0x00,0x02,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x53,0x09,0x55,0x00,0x0a,0x00,0x01,0x00,0x02,0x14,0x03,0x14,0x2b,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00, -0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x2e,0x00,0x2e,0x00,0x2e,0x00,0x2e,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x02,0x00,0x03,0x0a,0x44, -0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45,0x13,0x45,0x00,0x02,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x02,0x01,0xc8,0x00,0xe1,0x08,0xf2,0x08,0xc9,0x08,0xc8,0x0e,0x24,0x08,0xca,0x09,0x02,0x08,0xc7,0x0e,0x26,0x08,0xf6,0x0e,0x28,0x0e,0x2a,0x08,0xcf,0x08,0xd1,0x08,0xd3,0x0e,0x2f,0x0e,0x30, -0x0b,0x0c,0x0b,0x0d,0x0e,0x31,0x0e,0x33,0x0e,0x35,0x0e,0x37,0x0e,0x39,0x0e,0x3c,0x08,0xe4,0x08,0xe7,0x0e,0x53,0x0e,0x54,0x0e,0x55,0x09,0x59,0x0e,0x57,0x0e,0x59,0x08,0xf3,0x0e,0x5e,0x08,0xf7,0x08,0xf5,0x0e,0x6e,0x0e,0x82,0x09,0x43,0x0b,0x0e,0x0e,0xb1,0x0e,0xbd,0x09,0x4b,0x09,0x4d,0x0e,0x78,0x0e,0x8f,0x0b,0x0f,0x0e,0xcf, -0x09,0x72,0x0e,0xda,0x0e,0xdb,0x09,0x66,0x09,0x68,0x0e,0xa8,0x0e,0x70,0x09,0x81,0x09,0x83,0x09,0x85,0x09,0x87,0x0e,0x74,0x0e,0x75,0x09,0x8b,0x0e,0x7a,0x0e,0x7c,0x0e,0x7e,0x0e,0x80,0x0e,0x84,0x0e,0x86,0x09,0x99,0x09,0x9c,0x09,0x9f,0x09,0xa2,0x09,0xa5,0x09,0xa8,0x0e,0x90,0x0e,0x91,0x0e,0x92,0x0e,0x93,0x0e,0x94,0x0e,0x95, -0x0e,0x96,0x0e,0x97,0x0b,0x10,0x0b,0x11,0x0b,0x12,0x0b,0x13,0x0b,0x14,0x0b,0x15,0x0b,0x16,0x0e,0x98,0x0e,0x9a,0x0e,0x9c,0x0e,0x9e,0x0e,0xa0,0x0e,0xa2,0x09,0xc5,0x0e,0xa5,0x0e,0xa6,0x0e,0xa7,0x0e,0xa9,0x0e,0xaa,0x0e,0xab,0x0e,0xae,0x0e,0xb3,0x0e,0xb5,0x0e,0xb7,0x0e,0xb9,0x0e,0xbb,0x0e,0xbf,0x0e,0xc1,0x0e,0xc3,0x0e,0xc5, -0x0e,0xc7,0x0e,0xc9,0x0e,0xca,0x0e,0xcb,0x0e,0xcc,0x0e,0xcd,0x0e,0xd0,0x0e,0xd3,0x0e,0xd5,0x09,0xfb,0x0e,0xdc,0x0e,0xdd,0x0e,0xde,0x0e,0xdf,0x0e,0xe0,0x0e,0xe1,0x0e,0xe2,0x0e,0xe3,0x0a,0x06,0x0a,0x08,0x0e,0xe6,0x0a,0x0c,0x0a,0x0e,0x0e,0xec,0x0e,0xee,0x0a,0x29,0x0a,0x3f,0x0a,0x55,0x0a,0x57,0x0a,0x59,0x0e,0xf0,0x0e,0xf2, -0x0e,0xf4,0x0e,0xf6,0x0e,0xf8,0x0e,0xfa,0x0e,0xfc,0x0a,0x81,0x0a,0x84,0x0f,0x00,0x0f,0x01,0x0f,0x02,0x0f,0x03,0x0a,0x8c,0x0a,0x90,0x0a,0x94,0x0f,0x05,0x0f,0x06,0x0f,0x07,0x0f,0x08,0x0f,0x09,0x0f,0x0a,0x0f,0x0c,0x0f,0x0e,0x0f,0x10,0x0f,0x12,0x0a,0xb1,0x0b,0x17,0x0b,0x18,0x0f,0x14,0x0b,0x1a,0x0e,0x21,0x0e,0x40,0x0e,0x44, -0x0e,0x48,0x0e,0x4c,0x0e,0x50,0x0f,0x17,0x0f,0x1b,0x0f,0x1f,0x0f,0x23,0x0f,0x25,0x0f,0x29,0x0f,0x2b,0x0f,0x2d,0x0f,0x31,0x0f,0x35,0x0f,0x39,0x0f,0x3b,0x0f,0x3d,0x0f,0x3f,0x0f,0x41,0x0f,0x45,0x0f,0x49,0x0f,0x4d,0x13,0x00,0x13,0x05,0x13,0x0b,0x13,0x0f,0x13,0x13,0x13,0x17,0x13,0x1b,0x13,0x1f,0x13,0x23,0x13,0x25,0x13,0x27, -0x13,0x29,0x14,0x07,0x14,0x0a,0x14,0x0e,0x14,0x12,0x14,0x14,0x14,0x16,0x14,0x6d,0x14,0x70,0x14,0x73,0x14,0x76,0x14,0x79,0x14,0x7d,0x14,0x7e,0x14,0x81,0x14,0x84,0x14,0x87,0x00,0x02,0x00,0x8d,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x08,0x09,0x20,0x00,0x01,0x09,0x22,0x09,0x2b,0x00,0x1a,0x09,0x3e,0x09,0x3e,0x00,0x24,0x09,0x40, -0x09,0x40,0x00,0x25,0x09,0x42,0x09,0x42,0x00,0x26,0x09,0x45,0x09,0x46,0x00,0x27,0x09,0x48,0x09,0x48,0x00,0x29,0x09,0x4a,0x09,0x4a,0x00,0x2a,0x09,0x4e,0x09,0x4e,0x00,0x2b,0x09,0x5b,0x09,0x5b,0x00,0x2c,0x09,0x5d,0x09,0x60,0x00,0x2d,0x09,0x63,0x09,0x65,0x00,0x31,0x09,0x67,0x09,0x67,0x00,0x34,0x09,0x6c,0x09,0x6c,0x00,0x35, -0x09,0x7c,0x09,0x7c,0x00,0x36,0x09,0x80,0x09,0x80,0x00,0x37,0x09,0x82,0x09,0x82,0x00,0x38,0x09,0x84,0x09,0x84,0x00,0x39,0x09,0x86,0x09,0x86,0x00,0x3a,0x09,0x88,0x09,0x8a,0x00,0x3b,0x09,0x8c,0x09,0x8c,0x00,0x3e,0x09,0x8e,0x09,0x8e,0x00,0x3f,0x09,0x90,0x09,0x90,0x00,0x40,0x09,0x92,0x09,0x92,0x00,0x41,0x09,0x94,0x09,0x94, -0x00,0x42,0x09,0x96,0x09,0x96,0x00,0x43,0x09,0x98,0x09,0x98,0x00,0x44,0x09,0x9b,0x09,0x9b,0x00,0x45,0x09,0x9e,0x09,0x9e,0x00,0x46,0x09,0xa1,0x09,0xa1,0x00,0x47,0x09,0xa4,0x09,0xa4,0x00,0x48,0x09,0xa7,0x09,0xa7,0x00,0x49,0x09,0xaa,0x09,0xb9,0x00,0x4a,0x09,0xbb,0x09,0xbb,0x00,0x5a,0x09,0xbd,0x09,0xbd,0x00,0x5b,0x09,0xbf, -0x09,0xbf,0x00,0x5c,0x09,0xc1,0x09,0xc1,0x00,0x5d,0x09,0xc3,0x09,0xc4,0x00,0x5e,0x09,0xc8,0x09,0xc9,0x00,0x60,0x09,0xcc,0x09,0xcc,0x00,0x62,0x09,0xcf,0x09,0xcf,0x00,0x63,0x09,0xd2,0x09,0xd2,0x00,0x64,0x09,0xd5,0x09,0xd7,0x00,0x65,0x09,0xd9,0x09,0xd9,0x00,0x68,0x09,0xdb,0x09,0xdb,0x00,0x69,0x09,0xdd,0x09,0xdd,0x00,0x6a, -0x09,0xdf,0x09,0xdf,0x00,0x6b,0x09,0xe1,0x09,0xe1,0x00,0x6c,0x09,0xe3,0x09,0xe3,0x00,0x6d,0x09,0xe5,0x09,0xe5,0x00,0x6e,0x09,0xe7,0x09,0xe7,0x00,0x6f,0x09,0xe9,0x09,0xe9,0x00,0x70,0x09,0xeb,0x09,0xeb,0x00,0x71,0x09,0xed,0x09,0xed,0x00,0x72,0x09,0xef,0x09,0xef,0x00,0x73,0x09,0xf1,0x09,0xf1,0x00,0x74,0x09,0xf3,0x09,0xf3, -0x00,0x75,0x09,0xf5,0x09,0xf6,0x00,0x76,0x09,0xf8,0x09,0xf8,0x00,0x78,0x09,0xfa,0x09,0xfa,0x00,0x79,0x09,0xfd,0x0a,0x05,0x00,0x7a,0x0a,0x07,0x0a,0x07,0x00,0x83,0x0a,0x0a,0x0a,0x0b,0x00,0x84,0x0a,0x0d,0x0a,0x0d,0x00,0x86,0x0a,0x24,0x0a,0x24,0x00,0x87,0x0a,0x26,0x0a,0x26,0x00,0x88,0x0a,0x28,0x0a,0x28,0x00,0x89,0x0a,0x3e, -0x0a,0x3e,0x00,0x8a,0x0a,0x54,0x0a,0x54,0x00,0x8b,0x0a,0x56,0x0a,0x56,0x00,0x8c,0x0a,0x58,0x0a,0x58,0x00,0x8d,0x0a,0x72,0x0a,0x72,0x00,0x8e,0x0a,0x74,0x0a,0x74,0x00,0x8f,0x0a,0x76,0x0a,0x76,0x00,0x90,0x0a,0x78,0x0a,0x78,0x00,0x91,0x0a,0x7a,0x0a,0x7a,0x00,0x92,0x0a,0x7c,0x0a,0x7c,0x00,0x93,0x0a,0x7e,0x0a,0x7e,0x00,0x94, -0x0a,0x80,0x0a,0x80,0x00,0x95,0x0a,0x83,0x0a,0x83,0x00,0x96,0x0a,0x86,0x0a,0x89,0x00,0x97,0x0a,0x8b,0x0a,0x8b,0x00,0x9b,0x0a,0x8f,0x0a,0x8f,0x00,0x9c,0x0a,0x93,0x0a,0x93,0x00,0x9d,0x0a,0x97,0x0a,0x97,0x00,0x9e,0x0a,0x9a,0x0a,0x9a,0x00,0x9f,0x0a,0x9d,0x0a,0x9d,0x00,0xa0,0x0a,0xa0,0x0a,0xa0,0x00,0xa1,0x0a,0xa3,0x0a,0xa3, -0x00,0xa2,0x0a,0xa6,0x0a,0xa6,0x00,0xa3,0x0a,0xa8,0x0a,0xa8,0x00,0xa4,0x0a,0xaa,0x0a,0xaa,0x00,0xa5,0x0a,0xac,0x0a,0xac,0x00,0xa6,0x0a,0xae,0x0a,0xae,0x00,0xa7,0x0a,0xb0,0x0a,0xb0,0x00,0xa8,0x0a,0xb4,0x0a,0xb6,0x00,0xa9,0x0b,0x19,0x0b,0x19,0x00,0xac,0x0e,0x20,0x0e,0x20,0x00,0xad,0x0e,0x3f,0x0e,0x3f,0x00,0xae,0x0e,0x43, -0x0e,0x43,0x00,0xaf,0x0e,0x47,0x0e,0x47,0x00,0xb0,0x0e,0x4b,0x0e,0x4b,0x00,0xb1,0x0e,0x4f,0x0e,0x4f,0x00,0xb2,0x0f,0x16,0x0f,0x16,0x00,0xb3,0x0f,0x1a,0x0f,0x1a,0x00,0xb4,0x0f,0x1e,0x0f,0x1e,0x00,0xb5,0x0f,0x22,0x0f,0x22,0x00,0xb6,0x0f,0x24,0x0f,0x24,0x00,0xb7,0x0f,0x28,0x0f,0x28,0x00,0xb8,0x0f,0x2a,0x0f,0x2a,0x00,0xb9, -0x0f,0x2c,0x0f,0x2c,0x00,0xba,0x0f,0x30,0x0f,0x30,0x00,0xbb,0x0f,0x34,0x0f,0x34,0x00,0xbc,0x0f,0x38,0x0f,0x38,0x00,0xbd,0x0f,0x3a,0x0f,0x3a,0x00,0xbe,0x0f,0x3c,0x0f,0x3c,0x00,0xbf,0x0f,0x3e,0x0f,0x3e,0x00,0xc0,0x0f,0x40,0x0f,0x40,0x00,0xc1,0x0f,0x44,0x0f,0x44,0x00,0xc2,0x0f,0x48,0x0f,0x48,0x00,0xc3,0x0f,0x4c,0x0f,0x4c, -0x00,0xc4,0x13,0x02,0x13,0x02,0x00,0xc5,0x13,0x04,0x13,0x04,0x00,0xc6,0x13,0x08,0x13,0x08,0x00,0xc7,0x13,0x0c,0x13,0x0c,0x00,0xc8,0x13,0x10,0x13,0x10,0x00,0xc9,0x13,0x14,0x13,0x14,0x00,0xca,0x13,0x18,0x13,0x18,0x00,0xcb,0x13,0x1c,0x13,0x1c,0x00,0xcc,0x13,0x20,0x13,0x20,0x00,0xcd,0x13,0x24,0x13,0x24,0x00,0xce,0x13,0x26, -0x13,0x26,0x00,0xcf,0x13,0x28,0x13,0x28,0x00,0xd0,0x14,0x04,0x14,0x04,0x00,0xd1,0x14,0x09,0x14,0x09,0x00,0xd2,0x14,0x0b,0x14,0x0b,0x00,0xd3,0x14,0x0f,0x14,0x0f,0x00,0xd4,0x14,0x13,0x14,0x13,0x00,0xd5,0x14,0x15,0x14,0x15,0x00,0xd6,0x14,0x53,0x14,0x5c,0x00,0xd7,0x00,0x02,0x01,0x36,0x00,0x98,0x0e,0xd8,0x0e,0x25,0x0e,0x27, -0x0e,0x29,0x0e,0x2b,0x0e,0x2c,0x0e,0x2d,0x0e,0x2e,0x0e,0x32,0x0e,0x34,0x0e,0x36,0x0e,0x38,0x0e,0x3b,0x0e,0x3e,0x08,0xe3,0x08,0xe6,0x08,0xe9,0x08,0xec,0x0e,0x56,0x09,0x3f,0x0e,0x58,0x0e,0x5a,0x0e,0x5d,0x0e,0x60,0x0e,0x61,0x09,0x3b,0x0e,0x83,0x0e,0x8d,0x0e,0xb2,0x0e,0xbe,0x0e,0xe4,0x0e,0x79,0x09,0x62,0x09,0x6e,0x0e,0x72, -0x0e,0x77,0x0e,0x7b,0x0e,0x7d,0x0e,0x7f,0x0e,0x81,0x0e,0x85,0x0e,0x87,0x0e,0x88,0x0e,0x89,0x0e,0x8a,0x0e,0x8b,0x0e,0x8c,0x0e,0x8e,0x0e,0x99,0x0e,0x9b,0x0e,0x9d,0x0e,0x9f,0x0e,0xa1,0x0e,0xa4,0x09,0xc7,0x09,0x3d,0x09,0xcb,0x09,0xce,0x09,0xd1,0x09,0xd4,0x0e,0xad,0x0e,0xb0,0x0e,0xb4,0x0e,0xb6,0x0e,0xb8,0x0e,0xba,0x0e,0xbc, -0x0e,0xc0,0x0e,0xc2,0x0e,0xc4,0x0e,0xc6,0x0e,0xc8,0x0a,0x5f,0x0a,0x60,0x0a,0x61,0x0a,0x62,0x0e,0xce,0x0e,0xd2,0x0e,0xd4,0x0e,0xd6,0x0e,0xd9,0x0e,0xe5,0x0e,0xe8,0x0e,0xea,0x0e,0xed,0x0e,0xef,0x0a,0x2b,0x0e,0xba,0x0a,0x5b,0x0e,0xf1,0x0e,0xf3,0x0e,0xf5,0x0e,0xf7,0x0e,0xf9,0x0e,0xfb,0x0e,0xfd,0x0e,0xfe,0x0e,0xff,0x0f,0x04, -0x0a,0x8e,0x0a,0x92,0x0a,0x96,0x0a,0x99,0x0a,0x9c,0x0a,0x9f,0x0a,0xa2,0x0a,0xa5,0x0f,0x0b,0x0f,0x0d,0x0f,0x0f,0x0f,0x11,0x0f,0x13,0x0a,0xb3,0x0f,0x15,0x0e,0x23,0x0e,0x42,0x0e,0x46,0x0e,0x4a,0x0e,0x4e,0x0e,0x52,0x0f,0x19,0x0f,0x1d,0x0f,0x21,0x0f,0x27,0x0f,0x2f,0x0f,0x33,0x0f,0x37,0x0f,0x43,0x0f,0x47,0x0f,0x4b,0x0f,0x4f, -0x13,0x01,0x13,0x07,0x13,0x0a,0x13,0x0e,0x13,0x12,0x13,0x16,0x13,0x1a,0x13,0x1e,0x13,0x22,0x14,0x06,0x14,0x0d,0x14,0x11,0x14,0x6e,0x14,0x71,0x14,0x74,0x14,0x77,0x14,0x7a,0x14,0x7f,0x14,0x82,0x14,0x85,0x0e,0x5a,0x00,0x02,0x00,0x7a,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x0c,0x09,0x0c,0x00,0x01,0x09,0x0e,0x09,0x0e,0x00,0x02, -0x09,0x10,0x09,0x14,0x00,0x03,0x09,0x19,0x09,0x20,0x00,0x08,0x09,0x22,0x09,0x28,0x00,0x10,0x09,0x2a,0x09,0x2b,0x00,0x17,0x09,0x3e,0x09,0x3e,0x00,0x19,0x09,0x40,0x09,0x40,0x00,0x1a,0x09,0x42,0x09,0x42,0x00,0x1b,0x09,0x46,0x09,0x46,0x00,0x1c,0x09,0x48,0x09,0x48,0x00,0x1d,0x09,0x4a,0x09,0x4a,0x00,0x1e,0x09,0x5b,0x09,0x5b, -0x00,0x1f,0x09,0x60,0x09,0x60,0x00,0x20,0x09,0x6c,0x09,0x6c,0x00,0x21,0x09,0x7c,0x09,0x7c,0x00,0x22,0x09,0x8a,0x09,0x8a,0x00,0x23,0x09,0x8c,0x09,0x8c,0x00,0x24,0x09,0x8e,0x09,0x8e,0x00,0x25,0x09,0x90,0x09,0x90,0x00,0x26,0x09,0x92,0x09,0x92,0x00,0x27,0x09,0x94,0x09,0x94,0x00,0x28,0x09,0x96,0x09,0x96,0x00,0x29,0x09,0x98, -0x09,0x98,0x00,0x2a,0x09,0x9b,0x09,0x9b,0x00,0x2b,0x09,0x9e,0x09,0x9e,0x00,0x2c,0x09,0xa1,0x09,0xa1,0x00,0x2d,0x09,0xa4,0x09,0xa4,0x00,0x2e,0x09,0xa7,0x09,0xa7,0x00,0x2f,0x09,0xb9,0x09,0xb9,0x00,0x30,0x09,0xbb,0x09,0xbb,0x00,0x31,0x09,0xbd,0x09,0xbd,0x00,0x32,0x09,0xbf,0x09,0xbf,0x00,0x33,0x09,0xc1,0x09,0xc1,0x00,0x34, -0x09,0xc3,0x09,0xc4,0x00,0x35,0x09,0xc8,0x09,0xc9,0x00,0x37,0x09,0xcc,0x09,0xcc,0x00,0x39,0x09,0xcf,0x09,0xcf,0x00,0x3a,0x09,0xd2,0x09,0xd2,0x00,0x3b,0x09,0xd5,0x09,0xd7,0x00,0x3c,0x09,0xd9,0x09,0xd9,0x00,0x3f,0x09,0xdb,0x09,0xdb,0x00,0x40,0x09,0xdd,0x09,0xdd,0x00,0x41,0x09,0xdf,0x09,0xdf,0x00,0x42,0x09,0xe1,0x09,0xe1, -0x00,0x43,0x09,0xe3,0x09,0xe3,0x00,0x44,0x09,0xe5,0x09,0xe5,0x00,0x45,0x09,0xe7,0x09,0xe7,0x00,0x46,0x09,0xe9,0x09,0xe9,0x00,0x47,0x09,0xeb,0x09,0xeb,0x00,0x48,0x09,0xed,0x09,0xed,0x00,0x49,0x09,0xef,0x09,0xef,0x00,0x4a,0x09,0xf1,0x09,0xf1,0x00,0x4b,0x09,0xf3,0x09,0xf3,0x00,0x4c,0x09,0xf5,0x09,0xf6,0x00,0x4d,0x09,0xf8, -0x09,0xf8,0x00,0x4f,0x09,0xfa,0x09,0xfa,0x00,0x50,0x0a,0x07,0x0a,0x07,0x00,0x51,0x0a,0x0b,0x0a,0x0b,0x00,0x52,0x0a,0x0d,0x0a,0x0d,0x00,0x53,0x0a,0x24,0x0a,0x24,0x00,0x54,0x0a,0x26,0x0a,0x26,0x00,0x55,0x0a,0x28,0x0a,0x28,0x00,0x56,0x0a,0x3e,0x0a,0x3e,0x00,0x57,0x0a,0x58,0x0a,0x58,0x00,0x58,0x0a,0x72,0x0a,0x72,0x00,0x59, -0x0a,0x74,0x0a,0x74,0x00,0x5a,0x0a,0x76,0x0a,0x76,0x00,0x5b,0x0a,0x78,0x0a,0x78,0x00,0x5c,0x0a,0x7a,0x0a,0x7a,0x00,0x5d,0x0a,0x7c,0x0a,0x7c,0x00,0x5e,0x0a,0x7e,0x0a,0x7e,0x00,0x5f,0x0a,0x80,0x0a,0x80,0x00,0x60,0x0a,0x83,0x0a,0x83,0x00,0x61,0x0a,0x89,0x0a,0x89,0x00,0x62,0x0a,0x8b,0x0a,0x8b,0x00,0x63,0x0a,0x8f,0x0a,0x8f, -0x00,0x64,0x0a,0x93,0x0a,0x93,0x00,0x65,0x0a,0x97,0x0a,0x97,0x00,0x66,0x0a,0x9a,0x0a,0x9a,0x00,0x67,0x0a,0x9d,0x0a,0x9d,0x00,0x68,0x0a,0xa0,0x0a,0xa0,0x00,0x69,0x0a,0xa3,0x0a,0xa3,0x00,0x6a,0x0a,0xa6,0x0a,0xa6,0x00,0x6b,0x0a,0xa8,0x0a,0xa8,0x00,0x6c,0x0a,0xaa,0x0a,0xaa,0x00,0x6d,0x0a,0xac,0x0a,0xac,0x00,0x6e,0x0a,0xae, -0x0a,0xae,0x00,0x6f,0x0a,0xb0,0x0a,0xb0,0x00,0x70,0x0a,0xb6,0x0a,0xb6,0x00,0x71,0x0e,0x20,0x0e,0x20,0x00,0x72,0x0e,0x3f,0x0e,0x3f,0x00,0x73,0x0e,0x43,0x0e,0x43,0x00,0x74,0x0e,0x47,0x0e,0x47,0x00,0x75,0x0e,0x4b,0x0e,0x4b,0x00,0x76,0x0e,0x4f,0x0e,0x4f,0x00,0x77,0x0f,0x16,0x0f,0x16,0x00,0x78,0x0f,0x1a,0x0f,0x1a,0x00,0x79, -0x0f,0x1e,0x0f,0x1e,0x00,0x7a,0x0f,0x24,0x0f,0x24,0x00,0x7b,0x0f,0x2c,0x0f,0x2c,0x00,0x7c,0x0f,0x30,0x0f,0x30,0x00,0x7d,0x0f,0x34,0x0f,0x34,0x00,0x7e,0x0f,0x40,0x0f,0x40,0x00,0x7f,0x0f,0x44,0x0f,0x44,0x00,0x80,0x0f,0x48,0x0f,0x48,0x00,0x81,0x0f,0x4c,0x0f,0x4c,0x00,0x82,0x13,0x02,0x13,0x02,0x00,0x83,0x13,0x04,0x13,0x04, -0x00,0x84,0x13,0x08,0x13,0x08,0x00,0x85,0x13,0x0c,0x13,0x0c,0x00,0x86,0x13,0x10,0x13,0x10,0x00,0x87,0x13,0x14,0x13,0x14,0x00,0x88,0x13,0x18,0x13,0x18,0x00,0x89,0x13,0x1c,0x13,0x1c,0x00,0x8a,0x13,0x20,0x13,0x20,0x00,0x8b,0x14,0x04,0x14,0x04,0x00,0x8c,0x14,0x0b,0x14,0x0b,0x00,0x8d,0x14,0x0f,0x14,0x0f,0x00,0x8e,0x14,0x53, -0x14,0x57,0x00,0x8f,0x14,0x59,0x14,0x5c,0x00,0x94,0x00,0x02,0x01,0x38,0x00,0x99,0x0e,0xd7,0x08,0xf9,0x08,0xcb,0x08,0xcc,0x08,0xcd,0x08,0xce,0x08,0xd0,0x08,0xd2,0x08,0xd4,0x08,0xd5,0x08,0xd6,0x08,0xe1,0x0e,0x3a,0x0e,0x3d,0x08,0xe2,0x08,0xe5,0x08,0xe8,0x08,0xeb,0x08,0xed,0x08,0xee,0x08,0xef,0x08,0xf0,0x0e,0x5b,0x0e,0x5f, -0x08,0xf4,0x0e,0x6f,0x09,0x41,0x09,0x44,0x09,0x47,0x09,0x49,0x09,0x4c,0x09,0x5c,0x09,0x61,0x09,0x6d,0x0e,0x71,0x0e,0x76,0x09,0x8d,0x09,0x8f,0x09,0x91,0x09,0x93,0x09,0x95,0x09,0x97,0x09,0x9a,0x09,0x9d,0x09,0xa0,0x09,0xa3,0x09,0xa6,0x09,0xa9,0x09,0xba,0x09,0xbc,0x09,0xbe,0x09,0xc0,0x09,0xc2,0x0e,0xa3,0x09,0xc6,0x09,0x3c, -0x09,0xca,0x09,0xcd,0x09,0xd0,0x09,0xd3,0x0e,0xac,0x0e,0xaf,0x09,0xd8,0x09,0xda,0x09,0xdc,0x09,0xde,0x09,0xe0,0x09,0xe2,0x09,0xe4,0x09,0xe6,0x09,0xe8,0x09,0xea,0x09,0xec,0x09,0xee,0x09,0xf0,0x09,0xf2,0x09,0xf4,0x0e,0xd1,0x09,0xf7,0x09,0xf9,0x09,0xfc,0x0a,0x09,0x0e,0xe7,0x0e,0xe9,0x0a,0x10,0x0a,0x25,0x0a,0x27,0x0a,0x2a, -0x09,0xde,0x0a,0x5a,0x0a,0x73,0x0a,0x75,0x0a,0x77,0x0a,0x79,0x0a,0x7b,0x0a,0x7d,0x0a,0x7f,0x0a,0x82,0x0a,0x85,0x0a,0x8a,0x0a,0x8d,0x0a,0x91,0x0a,0x95,0x0a,0x98,0x0a,0x9b,0x0a,0x9e,0x0a,0xa1,0x0a,0xa4,0x0a,0xa7,0x0a,0xa9,0x0a,0xab,0x0a,0xad,0x0a,0xaf,0x0a,0xb2,0x0a,0xb7,0x0e,0x22,0x0e,0x41,0x0e,0x45,0x0e,0x49,0x0e,0x4d, -0x0e,0x51,0x0f,0x18,0x0f,0x1c,0x0f,0x20,0x0f,0x26,0x0f,0x2e,0x0f,0x32,0x0f,0x36,0x0f,0x42,0x0f,0x46,0x0f,0x4a,0x0f,0x4e,0x13,0x03,0x13,0x06,0x13,0x09,0x13,0x0d,0x13,0x11,0x13,0x15,0x13,0x19,0x13,0x1d,0x13,0x21,0x14,0x05,0x14,0x0c,0x14,0x10,0x14,0x6f,0x14,0x72,0x14,0x75,0x14,0x78,0x14,0x7b,0x14,0x80,0x14,0x83,0x14,0x86, -0x08,0xf0,0x00,0x02,0x00,0x7b,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x0c,0x09,0x0c,0x00,0x01,0x09,0x0e,0x09,0x0e,0x00,0x02,0x09,0x10,0x09,0x14,0x00,0x03,0x09,0x19,0x09,0x20,0x00,0x08,0x09,0x22,0x09,0x28,0x00,0x10,0x09,0x2a,0x09,0x2b,0x00,0x17,0x09,0x3e,0x09,0x3e,0x00,0x19,0x09,0x40,0x09,0x40,0x00,0x1a,0x09,0x42,0x09,0x42, -0x00,0x1b,0x09,0x46,0x09,0x46,0x00,0x1c,0x09,0x48,0x09,0x48,0x00,0x1d,0x09,0x4a,0x09,0x4a,0x00,0x1e,0x09,0x5b,0x09,0x5b,0x00,0x1f,0x09,0x60,0x09,0x60,0x00,0x20,0x09,0x6c,0x09,0x6c,0x00,0x21,0x09,0x7c,0x09,0x7c,0x00,0x22,0x09,0x8a,0x09,0x8a,0x00,0x23,0x09,0x8c,0x09,0x8c,0x00,0x24,0x09,0x8e,0x09,0x8e,0x00,0x25,0x09,0x90, -0x09,0x90,0x00,0x26,0x09,0x92,0x09,0x92,0x00,0x27,0x09,0x94,0x09,0x94,0x00,0x28,0x09,0x96,0x09,0x96,0x00,0x29,0x09,0x98,0x09,0x98,0x00,0x2a,0x09,0x9b,0x09,0x9b,0x00,0x2b,0x09,0x9e,0x09,0x9e,0x00,0x2c,0x09,0xa1,0x09,0xa1,0x00,0x2d,0x09,0xa4,0x09,0xa4,0x00,0x2e,0x09,0xa7,0x09,0xa7,0x00,0x2f,0x09,0xb9,0x09,0xb9,0x00,0x30, -0x09,0xbb,0x09,0xbb,0x00,0x31,0x09,0xbd,0x09,0xbd,0x00,0x32,0x09,0xbf,0x09,0xbf,0x00,0x33,0x09,0xc1,0x09,0xc1,0x00,0x34,0x09,0xc3,0x09,0xc4,0x00,0x35,0x09,0xc8,0x09,0xc9,0x00,0x37,0x09,0xcc,0x09,0xcc,0x00,0x39,0x09,0xcf,0x09,0xcf,0x00,0x3a,0x09,0xd2,0x09,0xd2,0x00,0x3b,0x09,0xd5,0x09,0xd7,0x00,0x3c,0x09,0xd9,0x09,0xd9, -0x00,0x3f,0x09,0xdb,0x09,0xdb,0x00,0x40,0x09,0xdd,0x09,0xdd,0x00,0x41,0x09,0xdf,0x09,0xdf,0x00,0x42,0x09,0xe1,0x09,0xe1,0x00,0x43,0x09,0xe3,0x09,0xe3,0x00,0x44,0x09,0xe5,0x09,0xe5,0x00,0x45,0x09,0xe7,0x09,0xe7,0x00,0x46,0x09,0xe9,0x09,0xe9,0x00,0x47,0x09,0xeb,0x09,0xeb,0x00,0x48,0x09,0xed,0x09,0xed,0x00,0x49,0x09,0xef, -0x09,0xef,0x00,0x4a,0x09,0xf1,0x09,0xf1,0x00,0x4b,0x09,0xf3,0x09,0xf3,0x00,0x4c,0x09,0xf5,0x09,0xf6,0x00,0x4d,0x09,0xf8,0x09,0xf8,0x00,0x4f,0x09,0xfa,0x09,0xfa,0x00,0x50,0x0a,0x07,0x0a,0x07,0x00,0x51,0x0a,0x0b,0x0a,0x0b,0x00,0x52,0x0a,0x0d,0x0a,0x0d,0x00,0x53,0x0a,0x10,0x0a,0x10,0x00,0x54,0x0a,0x24,0x0a,0x24,0x00,0x55, -0x0a,0x26,0x0a,0x26,0x00,0x56,0x0a,0x28,0x0a,0x28,0x00,0x57,0x0a,0x3e,0x0a,0x3e,0x00,0x58,0x0a,0x58,0x0a,0x58,0x00,0x59,0x0a,0x72,0x0a,0x72,0x00,0x5a,0x0a,0x74,0x0a,0x74,0x00,0x5b,0x0a,0x76,0x0a,0x76,0x00,0x5c,0x0a,0x78,0x0a,0x78,0x00,0x5d,0x0a,0x7a,0x0a,0x7a,0x00,0x5e,0x0a,0x7c,0x0a,0x7c,0x00,0x5f,0x0a,0x7e,0x0a,0x7e, -0x00,0x60,0x0a,0x80,0x0a,0x80,0x00,0x61,0x0a,0x83,0x0a,0x83,0x00,0x62,0x0a,0x89,0x0a,0x89,0x00,0x63,0x0a,0x8b,0x0a,0x8b,0x00,0x64,0x0a,0x8f,0x0a,0x8f,0x00,0x65,0x0a,0x93,0x0a,0x93,0x00,0x66,0x0a,0x97,0x0a,0x97,0x00,0x67,0x0a,0x9a,0x0a,0x9a,0x00,0x68,0x0a,0x9d,0x0a,0x9d,0x00,0x69,0x0a,0xa0,0x0a,0xa0,0x00,0x6a,0x0a,0xa3, -0x0a,0xa3,0x00,0x6b,0x0a,0xa6,0x0a,0xa6,0x00,0x6c,0x0a,0xa8,0x0a,0xa8,0x00,0x6d,0x0a,0xaa,0x0a,0xaa,0x00,0x6e,0x0a,0xac,0x0a,0xac,0x00,0x6f,0x0a,0xae,0x0a,0xae,0x00,0x70,0x0a,0xb0,0x0a,0xb0,0x00,0x71,0x0a,0xb6,0x0a,0xb6,0x00,0x72,0x0e,0x20,0x0e,0x20,0x00,0x73,0x0e,0x3f,0x0e,0x3f,0x00,0x74,0x0e,0x43,0x0e,0x43,0x00,0x75, -0x0e,0x47,0x0e,0x47,0x00,0x76,0x0e,0x4b,0x0e,0x4b,0x00,0x77,0x0e,0x4f,0x0e,0x4f,0x00,0x78,0x0f,0x16,0x0f,0x16,0x00,0x79,0x0f,0x1a,0x0f,0x1a,0x00,0x7a,0x0f,0x1e,0x0f,0x1e,0x00,0x7b,0x0f,0x24,0x0f,0x24,0x00,0x7c,0x0f,0x2c,0x0f,0x2c,0x00,0x7d,0x0f,0x30,0x0f,0x30,0x00,0x7e,0x0f,0x34,0x0f,0x34,0x00,0x7f,0x0f,0x40,0x0f,0x40, -0x00,0x80,0x0f,0x44,0x0f,0x44,0x00,0x81,0x0f,0x48,0x0f,0x48,0x00,0x82,0x0f,0x4c,0x0f,0x4c,0x00,0x83,0x13,0x02,0x13,0x02,0x00,0x84,0x13,0x04,0x13,0x04,0x00,0x85,0x13,0x08,0x13,0x08,0x00,0x86,0x13,0x0c,0x13,0x0c,0x00,0x87,0x13,0x10,0x13,0x10,0x00,0x88,0x13,0x14,0x13,0x14,0x00,0x89,0x13,0x18,0x13,0x18,0x00,0x8a,0x13,0x1c, -0x13,0x1c,0x00,0x8b,0x13,0x20,0x13,0x20,0x00,0x8c,0x14,0x04,0x14,0x04,0x00,0x8d,0x14,0x0b,0x14,0x0b,0x00,0x8e,0x14,0x0f,0x14,0x0f,0x00,0x8f,0x14,0x53,0x14,0x57,0x00,0x90,0x14,0x59,0x14,0x5c,0x00,0x95,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x6d,0x00,0x02,0x00,0x08,0x08,0xee, -0x08,0xee,0x00,0x00,0x09,0x3f,0x09,0x3f,0x00,0x01,0x09,0xec,0x09,0xec,0x00,0x02,0x09,0xee,0x09,0xee,0x00,0x03,0x09,0xf0,0x09,0xf0,0x00,0x04,0x09,0xf2,0x09,0xf2,0x00,0x05,0x0a,0x5f,0x0a,0x62,0x00,0x06,0x0a,0xb2,0x0a,0xb3,0x00,0x0a,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca,0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83, -0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x02,0x00,0x01,0x0f,0x8c,0x0f,0x97,0x00,0x00,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca, -0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83,0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x01,0x00,0x62,0x00,0x03,0x00,0x0c,0x00,0x2a,0x00,0x44,0x00,0x02,0x00,0x06,0x00,0x14,0x14,0x97,0x00,0x06,0x09,0x3f,0x09,0x3f, -0x09,0x32,0x09,0x73,0x08,0xf3,0x14,0x97,0x00,0x04,0x09,0x3f,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x06,0x00,0x12,0x09,0x71,0x00,0x05,0x09,0x3f,0x09,0x32,0x09,0x73,0x08,0xf3,0x09,0x71,0x00,0x03,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x06,0x00,0x14,0x0a,0x63,0x00,0x06,0x08,0xee,0x09,0x3f,0x09,0x32,0x09,0x73,0x08,0xf3,0x0a,0x63, -0x00,0x04,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x03,0x08,0xe8,0x08,0xe8,0x00,0x00,0x08,0xee,0x08,0xee,0x00,0x01,0x09,0x0d,0x09,0x0d,0x00,0x02,0x00,0x01,0x00,0x34,0x00,0x03,0x00,0x0c,0x00,0x1a,0x00,0x26,0x00,0x01,0x00,0x04,0x14,0x97,0x00,0x04,0x09,0x3f,0x09,0x3f,0x09,0x72,0x00,0x01,0x00,0x04,0x09,0x71,0x00,0x03, -0x09,0x3f,0x09,0x72,0x00,0x01,0x00,0x04,0x0a,0x63,0x00,0x04,0x08,0xee,0x09,0x3f,0x09,0x72,0x00,0x02,0x00,0x03,0x08,0xe8,0x08,0xe8,0x00,0x00,0x08,0xee,0x08,0xee,0x00,0x01,0x09,0x0d,0x09,0x0d,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0xb8,0x00,0x01,0x00,0x00,0x00,0x6f,0x00,0x02,0x00,0x1b,0x08,0xd4, -0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe1,0x00,0x03,0x09,0xba,0x09,0xba,0x00,0x04,0x09,0xbc,0x09,0xbc,0x00,0x05,0x09,0xbe,0x09,0xbe,0x00,0x06,0x09,0xc0,0x09,0xc0,0x00,0x07,0x09,0xc2,0x09,0xc2,0x00,0x08,0x0a,0x25,0x0a,0x25,0x00,0x09,0x0a,0x27,0x0a,0x27,0x00,0x0a,0x0a,0x8a,0x0a,0x8a,0x00,0x0b,0x0a,0xb7,0x0a,0xb7,0x00,0x0c, -0x0e,0x32,0x0e,0x32,0x00,0x0d,0x0e,0x34,0x0e,0x34,0x00,0x0e,0x0e,0x36,0x0e,0x36,0x00,0x0f,0x0e,0x38,0x0e,0x38,0x00,0x10,0x0e,0x99,0x0e,0x99,0x00,0x11,0x0e,0x9b,0x0e,0x9b,0x00,0x12,0x0e,0x9d,0x0e,0x9d,0x00,0x13,0x0e,0x9f,0x0e,0x9f,0x00,0x14,0x0e,0xa1,0x0e,0xa1,0x00,0x15,0x0e,0xed,0x0e,0xed,0x00,0x16,0x0e,0xef,0x0e,0xef, -0x00,0x17,0x0f,0x04,0x0f,0x04,0x00,0x18,0x0f,0x15,0x0f,0x15,0x00,0x19,0x0f,0x20,0x0f,0x21,0x00,0x1a,0x0f,0x46,0x0f,0x47,0x00,0x1c,0x0f,0x4a,0x0f,0x4b,0x00,0x1e,0x00,0x02,0x00,0x15,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b, -0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06,0x0a,0x0e,0x0a,0x0e,0x00,0x07,0x0a,0x57,0x0a,0x57,0x00,0x08,0x0a,0xb5,0x0a,0xb5,0x00,0x09,0x0b,0x0c,0x0b,0x0d,0x00,0x0a,0x0b,0x0f,0x0b,0x17,0x00,0x0c,0x0e,0x48,0x0e,0x48,0x00,0x15,0x0e,0x4c,0x0e,0x4c,0x00,0x16,0x0e,0x50,0x0e,0x50,0x00,0x17,0x0f,0x02, -0x0f,0x02,0x00,0x18,0x0f,0x23,0x0f,0x23,0x00,0x19,0x0f,0x2d,0x0f,0x2d,0x00,0x1a,0x0f,0x31,0x0f,0x31,0x00,0x1b,0x0f,0x35,0x0f,0x35,0x00,0x1c,0x14,0x7d,0x14,0x7e,0x00,0x1d,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x02,0x00,0x01,0x0f,0x6c,0x0f,0x8b,0x00,0x00,0x00,0x02, -0x00,0x16,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b,0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06,0x0a,0x0c,0x0a,0x0c,0x00,0x07,0x0a,0x0e,0x0a,0x0e,0x00,0x08,0x0a,0x57,0x0a,0x57,0x00,0x09,0x0a,0xb5, -0x0a,0xb5,0x00,0x0a,0x0b,0x0c,0x0b,0x17,0x00,0x0b,0x0e,0x21,0x0e,0x21,0x00,0x17,0x0e,0x48,0x0e,0x48,0x00,0x18,0x0e,0x4c,0x0e,0x4c,0x00,0x19,0x0e,0x50,0x0e,0x50,0x00,0x1a,0x0f,0x02,0x0f,0x02,0x00,0x1b,0x0f,0x23,0x0f,0x23,0x00,0x1c,0x0f,0x2d,0x0f,0x2d,0x00,0x1d,0x0f,0x31,0x0f,0x31,0x00,0x1e,0x0f,0x35,0x0f,0x35,0x00,0x1f, -0x14,0x7d,0x14,0x7e,0x00,0x20,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x03,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x71,0x00,0x02,0x00,0x7d,0x08,0xca,0x08,0xcb,0x00,0x00,0x08,0xce,0x08,0xce,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x03,0x09,0x0a,0x09,0x0b,0x00,0x04,0x09,0x17,0x09,0x18,0x00,0x06,0x09,0x29,0x09,0x29,0x00,0x08, -0x09,0x2e,0x09,0x2e,0x00,0x09,0x09,0x31,0x09,0x31,0x00,0x0a,0x09,0x41,0x09,0x41,0x00,0x0b,0x09,0x44,0x09,0x45,0x00,0x0c,0x09,0x4c,0x09,0x4c,0x00,0x0e,0x09,0x5e,0x09,0x5e,0x00,0x0f,0x09,0x61,0x09,0x62,0x00,0x10,0x09,0x77,0x09,0x77,0x00,0x12,0x09,0x7f,0x09,0x7f,0x00,0x13,0x09,0x84,0x09,0x85,0x00,0x14,0x09,0x88,0x09,0x89, -0x00,0x16,0x09,0x8f,0x09,0x8f,0x00,0x18,0x09,0x91,0x09,0x91,0x00,0x19,0x09,0x97,0x09,0x97,0x00,0x1a,0x09,0xa0,0x09,0xa0,0x00,0x1b,0x09,0xa3,0x09,0xa3,0x00,0x1c,0x09,0xa9,0x09,0xac,0x00,0x1d,0x09,0xae,0x09,0xae,0x00,0x21,0x09,0xb2,0x09,0xb8,0x00,0x22,0x09,0xba,0x09,0xba,0x00,0x29,0x09,0xbc,0x09,0xbc,0x00,0x2a,0x09,0xbe, -0x09,0xbe,0x00,0x2b,0x09,0xc0,0x09,0xc0,0x00,0x2c,0x09,0xca,0x09,0xcb,0x00,0x2d,0x09,0xcd,0x09,0xce,0x00,0x2f,0x09,0xd0,0x09,0xd1,0x00,0x31,0x09,0xe0,0x09,0xe0,0x00,0x33,0x09,0xe6,0x09,0xe6,0x00,0x34,0x09,0xe8,0x09,0xe8,0x00,0x35,0x09,0xf2,0x09,0xf2,0x00,0x36,0x09,0xf4,0x09,0xf4,0x00,0x37,0x09,0xf7,0x09,0xf7,0x00,0x38, -0x09,0xfc,0x0a,0x04,0x00,0x39,0x0a,0x0a,0x0a,0x0a,0x00,0x42,0x0a,0x1a,0x0a,0x1a,0x00,0x43,0x0a,0x21,0x0a,0x21,0x00,0x44,0x0a,0x23,0x0a,0x23,0x00,0x45,0x0a,0x25,0x0a,0x25,0x00,0x46,0x0a,0x27,0x0a,0x27,0x00,0x47,0x0a,0x2a,0x0a,0x2b,0x00,0x48,0x0a,0x50,0x0a,0x50,0x00,0x4a,0x0a,0x56,0x0a,0x57,0x00,0x4b,0x0a,0x5b,0x0a,0x5b, -0x00,0x4d,0x0a,0x62,0x0a,0x62,0x00,0x4e,0x0a,0x6f,0x0a,0x6f,0x00,0x4f,0x0a,0x73,0x0a,0x73,0x00,0x50,0x0a,0x75,0x0a,0x75,0x00,0x51,0x0a,0x77,0x0a,0x77,0x00,0x52,0x0a,0x79,0x0a,0x79,0x00,0x53,0x0a,0x7b,0x0a,0x7b,0x00,0x54,0x0a,0x7d,0x0a,0x7d,0x00,0x55,0x0a,0x85,0x0a,0x88,0x00,0x56,0x0a,0x98,0x0a,0x99,0x00,0x5a,0x0a,0x9b, -0x0a,0x9c,0x00,0x5c,0x0a,0xa4,0x0a,0xa5,0x00,0x5e,0x0a,0xa9,0x0a,0xa9,0x00,0x60,0x0a,0xab,0x0a,0xab,0x00,0x61,0x0a,0xb4,0x0a,0xb5,0x00,0x62,0x0b,0x0c,0x0b,0x18,0x00,0x64,0x0e,0x1e,0x0e,0x1e,0x00,0x71,0x0e,0x22,0x0e,0x23,0x00,0x72,0x0e,0x27,0x0e,0x27,0x00,0x74,0x0e,0x2c,0x0e,0x2c,0x00,0x75,0x0e,0x45,0x0e,0x46,0x00,0x76, -0x0e,0x49,0x0e,0x4a,0x00,0x78,0x0e,0x4d,0x0e,0x4e,0x00,0x7a,0x0e,0x51,0x0e,0x52,0x00,0x7c,0x0e,0x61,0x0e,0x61,0x00,0x7e,0x0e,0x6b,0x0e,0x6c,0x00,0x7f,0x0e,0x74,0x0e,0x75,0x00,0x81,0x0e,0x7d,0x0e,0x7d,0x00,0x83,0x0e,0x7f,0x0e,0x7f,0x00,0x84,0x0e,0x83,0x0e,0x83,0x00,0x85,0x0e,0x87,0x0e,0x87,0x00,0x86,0x0e,0x8a,0x0e,0x8b, -0x00,0x87,0x0e,0x8d,0x0e,0x8e,0x00,0x89,0x0e,0x90,0x0e,0x92,0x00,0x8b,0x0e,0x94,0x0e,0x94,0x00,0x8e,0x0e,0x99,0x0e,0x99,0x00,0x8f,0x0e,0x9b,0x0e,0x9b,0x00,0x90,0x0e,0x9d,0x0e,0x9d,0x00,0x91,0x0e,0x9f,0x0e,0x9f,0x00,0x92,0x0e,0xbc,0x0e,0xbc,0x00,0x93,0x0e,0xc4,0x0e,0xc4,0x00,0x94,0x0e,0xc6,0x0e,0xc6,0x00,0x95,0x0e,0xce, -0x0e,0xce,0x00,0x96,0x0e,0xd4,0x0e,0xd4,0x00,0x97,0x0e,0xd8,0x0e,0xd9,0x00,0x98,0x0e,0xdc,0x0e,0xe4,0x00,0x9a,0x0e,0xe6,0x0e,0xea,0x00,0xa3,0x0e,0xed,0x0e,0xed,0x00,0xa8,0x0e,0xef,0x0e,0xef,0x00,0xa9,0x0e,0xf1,0x0e,0xf1,0x00,0xaa,0x0e,0xf3,0x0e,0xf3,0x00,0xab,0x0e,0xf5,0x0e,0xf5,0x00,0xac,0x0e,0xf7,0x0e,0xf7,0x00,0xad, -0x0e,0xf9,0x0e,0xf9,0x00,0xae,0x0e,0xfb,0x0e,0xfb,0x00,0xaf,0x0e,0xff,0x0f,0x02,0x00,0xb0,0x0f,0x0d,0x0f,0x0d,0x00,0xb4,0x0f,0x0f,0x0f,0x0f,0x00,0xb5,0x0f,0x18,0x0f,0x19,0x00,0xb6,0x0f,0x1c,0x0f,0x1d,0x00,0xb8,0x0f,0x22,0x0f,0x23,0x00,0xba,0x0f,0x2e,0x0f,0x2f,0x00,0xbc,0x0f,0x32,0x0f,0x33,0x00,0xbe,0x0f,0x36,0x0f,0x3b, -0x00,0xc0,0x0f,0x42,0x0f,0x43,0x00,0xc6,0x0f,0x64,0x0f,0x64,0x00,0xc8,0x0f,0x68,0x0f,0x68,0x00,0xc9,0x0f,0x98,0x0f,0xa6,0x00,0xca,0x13,0x2c,0x13,0x2c,0x00,0xd9,0x13,0x2f,0x13,0x2f,0x00,0xda,0x13,0x33,0x13,0x35,0x00,0xdb,0x13,0x38,0x13,0x38,0x00,0xde,0x13,0x3c,0x13,0x3c,0x00,0xdf,0x13,0x3f,0x13,0x40,0x00,0xe0,0x14,0x62, -0x14,0x62,0x00,0xe2,0x14,0x6c,0x14,0x6c,0x00,0xe3,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x03,0x00,0x02,0x00,0x28,0x04,0xfa,0x00,0x01,0x07,0x86,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x03,0x00,0x02,0x00,0x14, -0x07,0x8e,0x00,0x01,0x07,0x72,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x02,0x00,0xcd,0x08,0xcb,0x08,0xce,0x00,0x00,0x08,0xd0,0x08,0xd0,0x00,0x04,0x08,0xd2,0x08,0xd2,0x00,0x05,0x08,0xd4,0x08,0xd6,0x00,0x06,0x08,0xe1,0x08,0xe3,0x00,0x09,0x08,0xe5,0x08,0xe6,0x00,0x0c,0x08,0xe8,0x08,0xe9,0x00,0x0e,0x08,0xeb,0x08,0xf0, -0x00,0x10,0x08,0xf4,0x08,0xf4,0x00,0x16,0x08,0xf9,0x08,0xfb,0x00,0x17,0x08,0xff,0x09,0x00,0x00,0x1a,0x09,0x21,0x09,0x21,0x00,0x1c,0x09,0x34,0x09,0x35,0x00,0x1d,0x09,0x3b,0x09,0x3d,0x00,0x1f,0x09,0x3f,0x09,0x3f,0x00,0x22,0x09,0x41,0x09,0x41,0x00,0x23,0x09,0x44,0x09,0x44,0x00,0x24,0x09,0x47,0x09,0x47,0x00,0x25,0x09,0x49, -0x09,0x49,0x00,0x26,0x09,0x4c,0x09,0x4c,0x00,0x27,0x09,0x5c,0x09,0x5c,0x00,0x28,0x09,0x61,0x09,0x62,0x00,0x29,0x09,0x6d,0x09,0x6e,0x00,0x2b,0x09,0x8d,0x09,0x8d,0x00,0x2d,0x09,0x8f,0x09,0x8f,0x00,0x2e,0x09,0x91,0x09,0x91,0x00,0x2f,0x09,0x93,0x09,0x93,0x00,0x30,0x09,0x95,0x09,0x95,0x00,0x31,0x09,0x97,0x09,0x97,0x00,0x32, -0x09,0x9a,0x09,0x9a,0x00,0x33,0x09,0x9d,0x09,0x9d,0x00,0x34,0x09,0xa0,0x09,0xa0,0x00,0x35,0x09,0xa3,0x09,0xa3,0x00,0x36,0x09,0xa6,0x09,0xa6,0x00,0x37,0x09,0xa9,0x09,0xa9,0x00,0x38,0x09,0xba,0x09,0xba,0x00,0x39,0x09,0xbc,0x09,0xbc,0x00,0x3a,0x09,0xbe,0x09,0xbe,0x00,0x3b,0x09,0xc0,0x09,0xc0,0x00,0x3c,0x09,0xc2,0x09,0xc2, -0x00,0x3d,0x09,0xc6,0x09,0xc7,0x00,0x3e,0x09,0xca,0x09,0xcb,0x00,0x40,0x09,0xcd,0x09,0xce,0x00,0x42,0x09,0xd0,0x09,0xd1,0x00,0x44,0x09,0xd3,0x09,0xd4,0x00,0x46,0x09,0xd8,0x09,0xd8,0x00,0x48,0x09,0xda,0x09,0xda,0x00,0x49,0x09,0xdc,0x09,0xdc,0x00,0x4a,0x09,0xde,0x09,0xde,0x00,0x4b,0x09,0xe0,0x09,0xe0,0x00,0x4c,0x09,0xe2, -0x09,0xe2,0x00,0x4d,0x09,0xe4,0x09,0xe4,0x00,0x4e,0x09,0xe6,0x09,0xe6,0x00,0x4f,0x09,0xe8,0x09,0xe8,0x00,0x50,0x09,0xea,0x09,0xea,0x00,0x51,0x09,0xec,0x09,0xec,0x00,0x52,0x09,0xee,0x09,0xee,0x00,0x53,0x09,0xf0,0x09,0xf0,0x00,0x54,0x09,0xf2,0x09,0xf2,0x00,0x55,0x09,0xf4,0x09,0xf4,0x00,0x56,0x09,0xf7,0x09,0xf7,0x00,0x57, -0x09,0xf9,0x09,0xf9,0x00,0x58,0x09,0xfc,0x09,0xfc,0x00,0x59,0x0a,0x09,0x0a,0x09,0x00,0x5a,0x0a,0x10,0x0a,0x10,0x00,0x5b,0x0a,0x25,0x0a,0x25,0x00,0x5c,0x0a,0x27,0x0a,0x27,0x00,0x5d,0x0a,0x2a,0x0a,0x2b,0x00,0x5e,0x0a,0x32,0x0a,0x3b,0x00,0x60,0x0a,0x41,0x0a,0x42,0x00,0x6a,0x0a,0x5a,0x0a,0x5b,0x00,0x6c,0x0a,0x5f,0x0a,0x62, -0x00,0x6e,0x0a,0x73,0x0a,0x73,0x00,0x72,0x0a,0x75,0x0a,0x75,0x00,0x73,0x0a,0x77,0x0a,0x77,0x00,0x74,0x0a,0x79,0x0a,0x79,0x00,0x75,0x0a,0x7b,0x0a,0x7b,0x00,0x76,0x0a,0x7d,0x0a,0x7d,0x00,0x77,0x0a,0x7f,0x0a,0x7f,0x00,0x78,0x0a,0x82,0x0a,0x82,0x00,0x79,0x0a,0x85,0x0a,0x85,0x00,0x7a,0x0a,0x8a,0x0a,0x8a,0x00,0x7b,0x0a,0x8d, -0x0a,0x8e,0x00,0x7c,0x0a,0x91,0x0a,0x92,0x00,0x7e,0x0a,0x95,0x0a,0x96,0x00,0x80,0x0a,0x98,0x0a,0x99,0x00,0x82,0x0a,0x9b,0x0a,0x9c,0x00,0x84,0x0a,0x9e,0x0a,0x9f,0x00,0x86,0x0a,0xa1,0x0a,0xa2,0x00,0x88,0x0a,0xa4,0x0a,0xa5,0x00,0x8a,0x0a,0xa7,0x0a,0xa7,0x00,0x8c,0x0a,0xa9,0x0a,0xa9,0x00,0x8d,0x0a,0xab,0x0a,0xab,0x00,0x8e, -0x0a,0xad,0x0a,0xad,0x00,0x8f,0x0a,0xaf,0x0a,0xaf,0x00,0x90,0x0a,0xb2,0x0a,0xb3,0x00,0x91,0x0a,0xb7,0x0a,0xb7,0x00,0x93,0x0a,0xb9,0x0a,0xba,0x00,0x94,0x0e,0x22,0x0e,0x23,0x00,0x96,0x0e,0x25,0x0e,0x25,0x00,0x98,0x0e,0x27,0x0e,0x27,0x00,0x99,0x0e,0x29,0x0e,0x29,0x00,0x9a,0x0e,0x2b,0x0e,0x2e,0x00,0x9b,0x0e,0x32,0x0e,0x32, -0x00,0x9f,0x0e,0x34,0x0e,0x34,0x00,0xa0,0x0e,0x36,0x0e,0x36,0x00,0xa1,0x0e,0x38,0x0e,0x38,0x00,0xa2,0x0e,0x3a,0x0e,0x3b,0x00,0xa3,0x0e,0x3d,0x0e,0x3e,0x00,0xa5,0x0e,0x41,0x0e,0x42,0x00,0xa7,0x0e,0x45,0x0e,0x46,0x00,0xa9,0x0e,0x49,0x0e,0x4a,0x00,0xab,0x0e,0x4d,0x0e,0x4e,0x00,0xad,0x0e,0x51,0x0e,0x52,0x00,0xaf,0x0e,0x56, -0x0e,0x56,0x00,0xb1,0x0e,0x58,0x0e,0x58,0x00,0xb2,0x0e,0x5a,0x0e,0x5b,0x00,0xb3,0x0e,0x5d,0x0e,0x5d,0x00,0xb5,0x0e,0x5f,0x0e,0x61,0x00,0xb6,0x0e,0x6f,0x0e,0x6f,0x00,0xb9,0x0e,0x71,0x0e,0x72,0x00,0xba,0x0e,0x76,0x0e,0x77,0x00,0xbc,0x0e,0x79,0x0e,0x79,0x00,0xbe,0x0e,0x7b,0x0e,0x7b,0x00,0xbf,0x0e,0x7d,0x0e,0x7d,0x00,0xc0, -0x0e,0x7f,0x0e,0x7f,0x00,0xc1,0x0e,0x81,0x0e,0x81,0x00,0xc2,0x0e,0x83,0x0e,0x83,0x00,0xc3,0x0e,0x85,0x0e,0x85,0x00,0xc4,0x0e,0x87,0x0e,0x8e,0x00,0xc5,0x0e,0x99,0x0e,0x99,0x00,0xcd,0x0e,0x9b,0x0e,0x9b,0x00,0xce,0x0e,0x9d,0x0e,0x9d,0x00,0xcf,0x0e,0x9f,0x0e,0x9f,0x00,0xd0,0x0e,0xa1,0x0e,0xa1,0x00,0xd1,0x0e,0xa3,0x0e,0xa4, -0x00,0xd2,0x0e,0xac,0x0e,0xad,0x00,0xd4,0x0e,0xaf,0x0e,0xb0,0x00,0xd6,0x0e,0xb2,0x0e,0xb2,0x00,0xd8,0x0e,0xb4,0x0e,0xb4,0x00,0xd9,0x0e,0xb6,0x0e,0xb6,0x00,0xda,0x0e,0xb8,0x0e,0xb8,0x00,0xdb,0x0e,0xba,0x0e,0xba,0x00,0xdc,0x0e,0xbc,0x0e,0xbc,0x00,0xdd,0x0e,0xbe,0x0e,0xbe,0x00,0xde,0x0e,0xc0,0x0e,0xc0,0x00,0xdf,0x0e,0xc2, -0x0e,0xc2,0x00,0xe0,0x0e,0xc4,0x0e,0xc4,0x00,0xe1,0x0e,0xc6,0x0e,0xc6,0x00,0xe2,0x0e,0xc8,0x0e,0xc8,0x00,0xe3,0x0e,0xce,0x0e,0xce,0x00,0xe4,0x0e,0xd1,0x0e,0xd2,0x00,0xe5,0x0e,0xd4,0x0e,0xd4,0x00,0xe7,0x0e,0xd6,0x0e,0xd9,0x00,0xe8,0x0e,0xe4,0x0e,0xe5,0x00,0xec,0x0e,0xe7,0x0e,0xea,0x00,0xee,0x0e,0xed,0x0e,0xed,0x00,0xf2, -0x0e,0xef,0x0e,0xef,0x00,0xf3,0x0e,0xf1,0x0e,0xf1,0x00,0xf4,0x0e,0xf3,0x0e,0xf3,0x00,0xf5,0x0e,0xf5,0x0e,0xf5,0x00,0xf6,0x0e,0xf7,0x0e,0xf7,0x00,0xf7,0x0e,0xf9,0x0e,0xf9,0x00,0xf8,0x0e,0xfb,0x0e,0xfb,0x00,0xf9,0x0e,0xfd,0x0e,0xff,0x00,0xfa,0x0f,0x04,0x0f,0x04,0x00,0xfd,0x0f,0x0b,0x0f,0x0b,0x00,0xfe,0x0f,0x0d,0x0f,0x0d, -0x00,0xff,0x0f,0x0f,0x0f,0x0f,0x01,0x00,0x0f,0x11,0x0f,0x11,0x01,0x01,0x0f,0x13,0x0f,0x13,0x01,0x02,0x0f,0x15,0x0f,0x15,0x01,0x03,0x0f,0x18,0x0f,0x19,0x01,0x04,0x0f,0x1c,0x0f,0x1d,0x01,0x06,0x0f,0x20,0x0f,0x21,0x01,0x08,0x0f,0x26,0x0f,0x27,0x01,0x0a,0x0f,0x2e,0x0f,0x2f,0x01,0x0c,0x0f,0x32,0x0f,0x33,0x01,0x0e,0x0f,0x36, -0x0f,0x37,0x01,0x10,0x0f,0x42,0x0f,0x43,0x01,0x12,0x0f,0x46,0x0f,0x47,0x01,0x14,0x0f,0x4a,0x0f,0x4b,0x01,0x16,0x0f,0x4e,0x0f,0x4f,0x01,0x18,0x0f,0x6c,0x0f,0x6c,0x01,0x1a,0x0f,0x6e,0x0f,0x6e,0x01,0x1b,0x0f,0x70,0x0f,0x70,0x01,0x1c,0x0f,0x72,0x0f,0x72,0x01,0x1d,0x0f,0x74,0x0f,0x74,0x01,0x1e,0x0f,0x76,0x0f,0x76,0x01,0x1f, -0x0f,0x78,0x0f,0x78,0x01,0x20,0x0f,0x7a,0x0f,0x7a,0x01,0x21,0x0f,0x7c,0x0f,0x7c,0x01,0x22,0x0f,0x7e,0x0f,0x7e,0x01,0x23,0x0f,0x80,0x0f,0x80,0x01,0x24,0x0f,0x82,0x0f,0x82,0x01,0x25,0x0f,0x84,0x0f,0x84,0x01,0x26,0x0f,0x86,0x0f,0x86,0x01,0x27,0x0f,0x88,0x0f,0x88,0x01,0x28,0x0f,0x8a,0x0f,0x8a,0x01,0x29,0x0f,0x8c,0x0f,0x8c, -0x01,0x2a,0x0f,0x8e,0x0f,0x8e,0x01,0x2b,0x0f,0x90,0x0f,0x90,0x01,0x2c,0x0f,0x92,0x0f,0x92,0x01,0x2d,0x0f,0x94,0x0f,0x94,0x01,0x2e,0x0f,0x96,0x0f,0x96,0x01,0x2f,0x00,0x02,0x00,0x6c,0x08,0xca,0x08,0xcb,0x00,0x00,0x08,0xce,0x08,0xce,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x03,0x09,0x0a,0x09,0x0b,0x00,0x04,0x09,0x17,0x09,0x18, -0x00,0x06,0x09,0x29,0x09,0x29,0x00,0x08,0x09,0x41,0x09,0x41,0x00,0x09,0x09,0x44,0x09,0x45,0x00,0x0a,0x09,0x4c,0x09,0x4c,0x00,0x0c,0x09,0x5e,0x09,0x5e,0x00,0x0d,0x09,0x61,0x09,0x62,0x00,0x0e,0x09,0x77,0x09,0x77,0x00,0x10,0x09,0x7f,0x09,0x7f,0x00,0x11,0x09,0x84,0x09,0x85,0x00,0x12,0x09,0x88,0x09,0x89,0x00,0x14,0x09,0x8f, -0x09,0x8f,0x00,0x16,0x09,0x91,0x09,0x91,0x00,0x17,0x09,0x97,0x09,0x97,0x00,0x18,0x09,0xa0,0x09,0xa0,0x00,0x19,0x09,0xa3,0x09,0xa3,0x00,0x1a,0x09,0xa9,0x09,0xac,0x00,0x1b,0x09,0xae,0x09,0xae,0x00,0x1f,0x09,0xb2,0x09,0xb8,0x00,0x20,0x09,0xba,0x09,0xba,0x00,0x27,0x09,0xbc,0x09,0xbc,0x00,0x28,0x09,0xbe,0x09,0xbe,0x00,0x29, -0x09,0xc0,0x09,0xc0,0x00,0x2a,0x09,0xca,0x09,0xcb,0x00,0x2b,0x09,0xcd,0x09,0xce,0x00,0x2d,0x09,0xd0,0x09,0xd1,0x00,0x2f,0x09,0xe0,0x09,0xe0,0x00,0x31,0x09,0xe6,0x09,0xe6,0x00,0x32,0x09,0xe8,0x09,0xe8,0x00,0x33,0x09,0xf2,0x09,0xf2,0x00,0x34,0x09,0xf4,0x09,0xf4,0x00,0x35,0x09,0xf7,0x09,0xf7,0x00,0x36,0x09,0xfc,0x0a,0x04, -0x00,0x37,0x0a,0x0a,0x0a,0x0a,0x00,0x40,0x0a,0x25,0x0a,0x25,0x00,0x41,0x0a,0x27,0x0a,0x27,0x00,0x42,0x0a,0x2a,0x0a,0x2b,0x00,0x43,0x0a,0x56,0x0a,0x57,0x00,0x45,0x0a,0x5b,0x0a,0x5b,0x00,0x47,0x0a,0x62,0x0a,0x62,0x00,0x48,0x0a,0x73,0x0a,0x73,0x00,0x49,0x0a,0x75,0x0a,0x75,0x00,0x4a,0x0a,0x77,0x0a,0x77,0x00,0x4b,0x0a,0x79, -0x0a,0x79,0x00,0x4c,0x0a,0x7b,0x0a,0x7b,0x00,0x4d,0x0a,0x7d,0x0a,0x7d,0x00,0x4e,0x0a,0x85,0x0a,0x88,0x00,0x4f,0x0a,0x98,0x0a,0x99,0x00,0x53,0x0a,0x9b,0x0a,0x9c,0x00,0x55,0x0a,0xa4,0x0a,0xa5,0x00,0x57,0x0a,0xa9,0x0a,0xa9,0x00,0x59,0x0a,0xab,0x0a,0xab,0x00,0x5a,0x0a,0xb4,0x0a,0xb5,0x00,0x5b,0x0b,0x0c,0x0b,0x18,0x00,0x5d, -0x0e,0x22,0x0e,0x23,0x00,0x6a,0x0e,0x27,0x0e,0x27,0x00,0x6c,0x0e,0x2c,0x0e,0x2c,0x00,0x6d,0x0e,0x45,0x0e,0x46,0x00,0x6e,0x0e,0x49,0x0e,0x4a,0x00,0x70,0x0e,0x4d,0x0e,0x4e,0x00,0x72,0x0e,0x51,0x0e,0x52,0x00,0x74,0x0e,0x61,0x0e,0x61,0x00,0x76,0x0e,0x74,0x0e,0x75,0x00,0x77,0x0e,0x7d,0x0e,0x7d,0x00,0x79,0x0e,0x7f,0x0e,0x7f, -0x00,0x7a,0x0e,0x83,0x0e,0x83,0x00,0x7b,0x0e,0x87,0x0e,0x87,0x00,0x7c,0x0e,0x8a,0x0e,0x8b,0x00,0x7d,0x0e,0x8d,0x0e,0x8e,0x00,0x7f,0x0e,0x90,0x0e,0x92,0x00,0x81,0x0e,0x94,0x0e,0x94,0x00,0x84,0x0e,0x99,0x0e,0x99,0x00,0x85,0x0e,0x9b,0x0e,0x9b,0x00,0x86,0x0e,0x9d,0x0e,0x9d,0x00,0x87,0x0e,0x9f,0x0e,0x9f,0x00,0x88,0x0e,0xbc, -0x0e,0xbc,0x00,0x89,0x0e,0xc4,0x0e,0xc4,0x00,0x8a,0x0e,0xc6,0x0e,0xc6,0x00,0x8b,0x0e,0xce,0x0e,0xce,0x00,0x8c,0x0e,0xd4,0x0e,0xd4,0x00,0x8d,0x0e,0xd8,0x0e,0xd9,0x00,0x8e,0x0e,0xdc,0x0e,0xe4,0x00,0x90,0x0e,0xe6,0x0e,0xea,0x00,0x99,0x0e,0xed,0x0e,0xed,0x00,0x9e,0x0e,0xef,0x0e,0xef,0x00,0x9f,0x0e,0xf1,0x0e,0xf1,0x00,0xa0, -0x0e,0xf3,0x0e,0xf3,0x00,0xa1,0x0e,0xf5,0x0e,0xf5,0x00,0xa2,0x0e,0xf7,0x0e,0xf7,0x00,0xa3,0x0e,0xf9,0x0e,0xf9,0x00,0xa4,0x0e,0xfb,0x0e,0xfb,0x00,0xa5,0x0e,0xff,0x0f,0x02,0x00,0xa6,0x0f,0x0d,0x0f,0x0d,0x00,0xaa,0x0f,0x0f,0x0f,0x0f,0x00,0xab,0x0f,0x18,0x0f,0x19,0x00,0xac,0x0f,0x1c,0x0f,0x1d,0x00,0xae,0x0f,0x22,0x0f,0x23, -0x00,0xb0,0x0f,0x2e,0x0f,0x2f,0x00,0xb2,0x0f,0x32,0x0f,0x33,0x00,0xb4,0x0f,0x36,0x0f,0x3b,0x00,0xb6,0x0f,0x42,0x0f,0x43,0x00,0xbc,0x0f,0x64,0x0f,0x64,0x00,0xbe,0x0f,0x68,0x0f,0x68,0x00,0xbf,0x0f,0x98,0x0f,0xa6,0x00,0xc0,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d, -0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06,0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f, -0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62,0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x03, -0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x02,0x00,0x03,0x00,0x4c,0x00,0x4d,0x00,0x00,0x01,0x62,0x01,0x62,0x00,0x02,0x05,0x6d,0x05,0x6d,0x00,0x03,0x00,0x02,0x00,0x11,0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79, -0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57,0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f, -0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x01,0x05,0x6a,0x00,0x05,0x00,0x10,0x01,0x22,0x02,0x34,0x03,0x46,0x04,0x58,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0,0x00,0xa8, -0x00,0xb0,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xae,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xaf,0x00,0x03,0x06,0xa2,0x06,0xa4,0x06,0xb0,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xb1,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xb2,0x00,0x03,0x06,0xa3, -0x06,0xa2,0x06,0xb3,0x00,0x03,0x06,0xa3,0x06,0xa3,0x06,0xb4,0x00,0x03,0x06,0xa3,0x06,0xa4,0x06,0xb5,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xb6,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xb7,0x00,0x02,0x06,0xa3,0x06,0xb8,0x00,0x03,0x06,0xa4,0x06,0xa2,0x06,0xb9,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xba,0x00,0x03,0x06,0xa4,0x06,0xa4, -0x06,0xbb,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xbc,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xbd,0x00,0x02,0x06,0xa4,0x06,0xbe,0x00,0x03,0x06,0xa5,0x06,0xa2,0x06,0xbf,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xc0,0x00,0x03,0x06,0xa5,0x06,0xa4,0x06,0xc1,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xc2,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xc3, -0x00,0x02,0x06,0xa5,0x06,0xc4,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xc5,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xc6,0x00,0x03,0x06,0xa6,0x06,0xa4,0x06,0xc7,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xc8,0x00,0x03,0x06,0xa6,0x06,0xa6,0x06,0xc9,0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62, -0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0,0x00,0xa8,0x00,0xb0,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xca,0x00,0x03,0x06,0xa2,0x06,0xa2,0x06,0xcb,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xcc,0x00,0x03, -0x06,0xa2,0x06,0xa4,0x06,0xcd,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xce,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xcf,0x00,0x02,0x06,0xa2,0x06,0xd0,0x00,0x03,0x06,0xa3,0x06,0xa2,0x06,0xd1,0x00,0x03,0x06,0xa3,0x06,0xa4,0x06,0xd2,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xd3,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xd4,0x00,0x03,0x06,0xa4, -0x06,0xa2,0x06,0xd5,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xd6,0x00,0x03,0x06,0xa4,0x06,0xa4,0x06,0xd7,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xd8,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xd9,0x00,0x02,0x06,0xa4,0x06,0xda,0x00,0x03,0x06,0xa5,0x06,0xa2,0x06,0xdb,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xdc,0x00,0x03,0x06,0xa5,0x06,0xa4, -0x06,0xdd,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xde,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xdf,0x00,0x02,0x06,0xa5,0x06,0xe0,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xe1,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xe2,0x00,0x03,0x06,0xa6,0x06,0xa4,0x06,0xe3,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xe4,0x00,0x03,0x06,0xa6,0x06,0xa6,0x06,0xe5, -0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xe6, -0x00,0x03,0x06,0xa2,0x06,0xa2,0x06,0xe7,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xe8,0x00,0x03,0x06,0xa2,0x06,0xa4,0x06,0xe9,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xea,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xeb,0x00,0x02,0x06,0xa2,0x06,0xeb,0x00,0x03,0x06,0xa3,0x06,0xa2,0x06,0xec,0x00,0x03,0x06,0xa3,0x06,0xa3,0x06,0xed,0x00,0x03, -0x06,0xa3,0x06,0xa4,0x06,0xee,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xef,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xf0,0x00,0x02,0x06,0xa3,0x06,0xf1,0x00,0x03,0x06,0xa4,0x06,0xa2,0x06,0xf2,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xf3,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xf4,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xf5,0x00,0x03,0x06,0xa5, -0x06,0xa2,0x06,0xf6,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xf7,0x00,0x03,0x06,0xa5,0x06,0xa4,0x06,0xf8,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xf9,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xfa,0x00,0x02,0x06,0xa5,0x06,0xfb,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xfc,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xfd,0x00,0x03,0x06,0xa6,0x06,0xa4, -0x06,0xfe,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xff,0x00,0x03,0x06,0xa6,0x06,0xa6,0x07,0x00,0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc4,0x00,0xcc, -0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xea,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x07,0x01,0x00,0x03,0x06,0xa2,0x06,0xa2,0x07,0x02,0x00,0x03,0x06,0xa2,0x06,0xa3,0x07,0x03,0x00,0x03,0x06,0xa2,0x06,0xa4,0x07,0x04,0x00,0x03,0x06,0xa2,0x06,0xa5,0x07,0x05,0x00,0x03,0x06,0xa2,0x06,0xa6,0x07,0x06,0x00,0x02,0x06,0xa2,0x07,0x07, -0x00,0x03,0x06,0xa3,0x06,0xa2,0x07,0x08,0x00,0x03,0x06,0xa3,0x06,0xa3,0x07,0x09,0x00,0x03,0x06,0xa3,0x06,0xa4,0x07,0x0a,0x00,0x03,0x06,0xa3,0x06,0xa5,0x07,0x0b,0x00,0x03,0x06,0xa3,0x06,0xa6,0x07,0x0c,0x00,0x02,0x06,0xa3,0x07,0x0d,0x00,0x03,0x06,0xa4,0x06,0xa2,0x07,0x0e,0x00,0x03,0x06,0xa4,0x06,0xa3,0x07,0x0f,0x00,0x03, -0x06,0xa4,0x06,0xa4,0x07,0x10,0x00,0x03,0x06,0xa4,0x06,0xa5,0x07,0x11,0x00,0x03,0x06,0xa4,0x06,0xa6,0x07,0x12,0x00,0x02,0x06,0xa4,0x07,0x13,0x00,0x03,0x06,0xa5,0x06,0xa2,0x07,0x14,0x00,0x03,0x06,0xa5,0x06,0xa3,0x07,0x15,0x00,0x03,0x06,0xa5,0x06,0xa4,0x07,0x16,0x00,0x03,0x06,0xa5,0x06,0xa6,0x07,0x1c,0x00,0x02,0x06,0xa6, -0x07,0x17,0x00,0x03,0x06,0xa6,0x06,0xa2,0x07,0x18,0x00,0x03,0x06,0xa6,0x06,0xa3,0x07,0x19,0x00,0x03,0x06,0xa6,0x06,0xa4,0x07,0x1a,0x00,0x03,0x06,0xa6,0x06,0xa5,0x07,0x1b,0x00,0x03,0x06,0xa6,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88, -0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc4,0x00,0xcc,0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xec,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x07,0x1d,0x00,0x03,0x06,0xa2,0x06,0xa2,0x07,0x1e,0x00,0x03,0x06,0xa2,0x06,0xa3,0x07,0x1f,0x00,0x03,0x06,0xa2,0x06,0xa4,0x07,0x20,0x00,0x03,0x06,0xa2, -0x06,0xa5,0x07,0x21,0x00,0x03,0x06,0xa2,0x06,0xa6,0x07,0x22,0x00,0x02,0x06,0xa2,0x07,0x23,0x00,0x03,0x06,0xa3,0x06,0xa2,0x07,0x24,0x00,0x03,0x06,0xa3,0x06,0xa3,0x07,0x25,0x00,0x03,0x06,0xa3,0x06,0xa4,0x07,0x26,0x00,0x03,0x06,0xa3,0x06,0xa5,0x07,0x27,0x00,0x03,0x06,0xa3,0x06,0xa6,0x07,0x28,0x00,0x02,0x06,0xa3,0x07,0x29, -0x00,0x03,0x06,0xa4,0x06,0xa2,0x07,0x2a,0x00,0x03,0x06,0xa4,0x06,0xa3,0x07,0x2b,0x00,0x03,0x06,0xa4,0x06,0xa4,0x07,0x2c,0x00,0x03,0x06,0xa4,0x06,0xa5,0x07,0x2d,0x00,0x03,0x06,0xa4,0x06,0xa6,0x07,0x2e,0x00,0x02,0x06,0xa4,0x07,0x2f,0x00,0x03,0x06,0xa5,0x06,0xa2,0x07,0x30,0x00,0x03,0x06,0xa5,0x06,0xa3,0x07,0x31,0x00,0x03, -0x06,0xa5,0x06,0xa4,0x07,0x32,0x00,0x03,0x06,0xa5,0x06,0xa5,0x07,0x33,0x00,0x03,0x06,0xa5,0x06,0xa6,0x07,0x34,0x00,0x02,0x06,0xa5,0x07,0x35,0x00,0x03,0x06,0xa6,0x06,0xa2,0x07,0x36,0x00,0x03,0x06,0xa6,0x06,0xa3,0x07,0x37,0x00,0x03,0x06,0xa6,0x06,0xa4,0x07,0x38,0x00,0x03,0x06,0xa6,0x06,0xa5,0x00,0x02,0x00,0x01,0x06,0xa2, -0x06,0xa6,0x00,0x00,0x00,0x01,0x01,0x92,0x00,0x03,0x00,0x0c,0x00,0x6e,0x01,0x00,0x00,0x08,0x00,0x12,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x08,0x62,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x63,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x64,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46, -0x08,0x65,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x66,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x67,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x68,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x69,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x00,0x0c,0x00,0x1a,0x00,0x24,0x00,0x2e,0x00,0x38,0x00,0x42,0x00,0x4c, -0x00,0x56,0x00,0x60,0x00,0x6a,0x00,0x74,0x00,0x7e,0x00,0x88,0x08,0x6a,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x6b,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x6c,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46,0x08,0x6d,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x6e,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x6f, -0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x70,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x71,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x08,0x7a,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x46,0x08,0x7b,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x47,0x08,0x7c,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x46,0x08,0x7d,0x00,0x04,0x04,0x68, -0x04,0x66,0x02,0x47,0x00,0x0c,0x00,0x1a,0x00,0x24,0x00,0x2e,0x00,0x38,0x00,0x42,0x00,0x4c,0x00,0x56,0x00,0x60,0x00,0x6a,0x00,0x74,0x00,0x7e,0x00,0x88,0x08,0x72,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x73,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x74,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46,0x08,0x75,0x00,0x04, -0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x76,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x77,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x78,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x79,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x08,0x7e,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x46,0x08,0x7f,0x00,0x04,0x04,0x68,0x04,0x64, -0x02,0x47,0x08,0x80,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x46,0x08,0x81,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x47,0x00,0x02,0x00,0x03,0x01,0x2f,0x01,0x2f,0x00,0x00,0x01,0xc9,0x01,0xc9,0x00,0x01,0x01,0xd2,0x01,0xd2,0x00,0x02,0x00,0x02,0x00,0x1a,0x00,0x0a,0x08,0xa5,0x08,0xa6,0x08,0xa7,0x08,0xa8,0x08,0xa9,0x08,0xaa,0x08,0xab, -0x08,0xac,0x08,0xad,0x08,0xae,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x0c,0x08,0x99,0x08,0x98,0x08,0x96,0x08,0x97,0x08,0x9a,0x08,0x9b,0x08,0x9c,0x08,0x9d,0x08,0x9e,0x08,0x9f,0x08,0x95,0x01,0x37,0x00,0x02,0x00,0x03,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x4c,0x00,0x4c,0x00,0x0a,0x00,0x51, -0x00,0x51,0x00,0x0b,0x00,0x02,0x00,0x64,0x00,0x2f,0x0d,0x8a,0x0d,0x8b,0x0d,0x8c,0x0d,0x8d,0x0d,0x8e,0x0d,0x90,0x0d,0x92,0x0d,0x93,0x0d,0x94,0x0d,0x95,0x0d,0x96,0x0d,0x97,0x0d,0x98,0x0d,0x99,0x0d,0x9a,0x0d,0x9b,0x0d,0x9c,0x0d,0x9d,0x0d,0x9e,0x0d,0x9f,0x0d,0xa0,0x0d,0xa1,0x0d,0xa2,0x0d,0xa3,0x0d,0xa4,0x0d,0xa5,0x0d,0xa6, -0x0d,0xa7,0x0d,0xa8,0x0d,0xa9,0x0d,0xaa,0x0d,0xab,0x0d,0xac,0x0d,0xad,0x0d,0xae,0x0d,0xaf,0x0d,0xb0,0x0d,0xb1,0x0d,0xb2,0x0d,0xb3,0x0d,0xb4,0x0d,0xb5,0x0d,0xb6,0x0d,0xb7,0x0d,0xb8,0x0d,0x8f,0x0d,0x91,0x00,0x02,0x00,0x03,0x01,0xdb,0x02,0x06,0x00,0x00,0x02,0x33,0x02,0x33,0x00,0x2c,0x02,0xb5,0x02,0xb6,0x00,0x2d,0x00,0x02, -0x00,0x64,0x00,0x2f,0x0d,0x98,0x0d,0x99,0x0d,0x9a,0x0d,0x9b,0x0d,0x9c,0x0d,0x9d,0x0d,0x9e,0x0d,0x9f,0x0d,0xa0,0x0d,0xa1,0x0d,0xa2,0x0d,0xa3,0x0d,0xa4,0x0d,0xa5,0x0d,0xa6,0x0d,0xa7,0x0d,0xa8,0x0d,0xa9,0x0d,0xaa,0x0d,0xab,0x0d,0xac,0x0d,0xad,0x0d,0xae,0x0d,0xaf,0x0d,0xb0,0x0d,0xb1,0x0d,0xb2,0x0d,0xb3,0x0d,0xb4,0x0d,0xb5, -0x0d,0xb6,0x0d,0xb7,0x0d,0x8a,0x0d,0x8b,0x0d,0x8c,0x0d,0x8d,0x0d,0x8e,0x0d,0x90,0x0d,0x92,0x0d,0x93,0x0d,0x94,0x0d,0x95,0x0d,0x96,0x0d,0x97,0x0d,0xb8,0x0d,0x8f,0x0d,0x91,0x00,0x02,0x00,0x03,0x02,0x07,0x02,0x32,0x00,0x00,0x02,0x34,0x02,0x34,0x00,0x2c,0x02,0xb7,0x02,0xb8,0x00,0x2d,0x00,0x02,0x00,0x48,0x00,0x21,0x0d,0x6c, -0x0d,0x6b,0x0d,0x70,0x0d,0x7d,0x0d,0x81,0x0d,0x82,0x0d,0x83,0x0d,0x84,0x0d,0x85,0x0d,0x86,0x0d,0x87,0x0d,0x69,0x0d,0x6a,0x0d,0x6d,0x0d,0x6e,0x0d,0x6f,0x0d,0x71,0x0d,0x72,0x0d,0x73,0x0d,0x74,0x0d,0x75,0x0d,0x76,0x0d,0x77,0x0d,0x78,0x0d,0x79,0x0d,0x7a,0x0d,0x7b,0x0d,0x7c,0x0d,0x7e,0x0d,0x7f,0x0d,0x80,0x0d,0x88,0x0d,0x89, -0x00,0x02,0x00,0x04,0x00,0xa9,0x00,0xa9,0x00,0x00,0x01,0x2c,0x01,0x2e,0x00,0x01,0x01,0xa1,0x01,0xa7,0x00,0x04,0x01,0xa9,0x01,0xbe,0x00,0x0b,0x00,0x02,0x00,0x4a,0x00,0x22,0x0d,0x69,0x0d,0x6c,0x0d,0x6d,0x0d,0x7a,0x0d,0x7b,0x0d,0x7d,0x0d,0x81,0x0d,0x82,0x0d,0x83,0x0d,0x84,0x0d,0x6a,0x0d,0x6b,0x0d,0x6e,0x0d,0x6f,0x0d,0x70, -0x0d,0x71,0x0d,0x72,0x0d,0x73,0x0d,0x74,0x0d,0x75,0x0d,0x76,0x0d,0x77,0x0d,0x79,0x0d,0x7a,0x0d,0x7c,0x0d,0x7e,0x0d,0x7f,0x0d,0x80,0x0d,0x88,0x0d,0x89,0x0d,0x85,0x0d,0x86,0x0d,0x87,0x0d,0x78,0x00,0x02,0x00,0x04,0x01,0x2f,0x01,0x34,0x00,0x00,0x01,0xbf,0x01,0xc2,0x00,0x06,0x01,0xc4,0x01,0xda,0x00,0x0a,0x02,0x37,0x02,0x37, -0x00,0x21,0x00,0x02,0x01,0x08,0x00,0x81,0x0d,0xbe,0x0c,0xeb,0x0c,0xec,0x0c,0xed,0x0c,0xee,0x0c,0xef,0x0c,0xf0,0x0c,0xf1,0x0c,0xf2,0x0c,0xf3,0x0c,0xf4,0x0c,0xf5,0x0c,0xf6,0x0c,0xf7,0x0c,0xf8,0x0c,0xf9,0x0c,0xfa,0x0c,0xfb,0x0c,0xfc,0x0c,0xfd,0x0c,0xfe,0x0c,0xff,0x0d,0x00,0x0d,0x01,0x0d,0x02,0x0d,0x03,0x0d,0x04,0x0d,0x10, -0x0d,0x11,0x0d,0x12,0x0d,0x14,0x0d,0x1b,0x0d,0x20,0x0d,0x24,0x0d,0x05,0x0d,0x08,0x0d,0x0c,0x0d,0x0f,0x0d,0x1f,0x0d,0x06,0x0d,0x61,0x0d,0x0e,0x0d,0x15,0x0d,0x0d,0x0d,0x16,0x0d,0x13,0x0d,0x18,0x0d,0x19,0x0d,0x1a,0x0d,0x17,0x0d,0x1d,0x0d,0x1e,0x0d,0x1c,0x0d,0x22,0x0d,0x23,0x0d,0x21,0x0d,0x07,0x0d,0x51,0x0d,0x65,0x0d,0x0a, -0x0d,0x25,0x0d,0x09,0x0d,0x33,0x0d,0x3c,0x0d,0x50,0x0d,0x29,0x0d,0x2a,0x0d,0x27,0x0d,0x28,0x0d,0x2c,0x0d,0x2d,0x0d,0x31,0x0d,0x32,0x0d,0x40,0x0d,0x42,0x0d,0x43,0x0d,0x44,0x0d,0x46,0x0d,0x4a,0x0d,0x4b,0x0d,0x4d,0x0d,0x4e,0x0d,0x52,0x0d,0x54,0x0d,0x59,0x0d,0x5a,0x0d,0x63,0x0d,0x64,0x0d,0x3d,0x0d,0x26,0x0d,0xbf,0x0d,0x35, -0x0d,0x2e,0x0d,0x2f,0x0d,0x30,0x0d,0xc0,0x0d,0x2b,0x0d,0x34,0x0d,0x36,0x0d,0x37,0x0d,0x38,0x0d,0x39,0x0d,0x3a,0x0d,0x3b,0x0d,0x3e,0x0d,0x3f,0x0d,0x41,0x0d,0x45,0x0d,0x47,0x0d,0x48,0x0d,0x49,0x0d,0x4c,0x0d,0x4f,0x0d,0x55,0x0d,0x56,0x0d,0x57,0x0d,0x58,0x0d,0x5b,0x0d,0x5c,0x0d,0x60,0x0d,0x66,0x0d,0x67,0x0d,0x68,0x0d,0x5d, -0x0d,0x5e,0x0d,0x5f,0x0d,0x62,0x0d,0xc1,0x0d,0x0b,0x00,0x02,0x00,0x4e,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x24,0x00,0x3d,0x00,0x01,0x00,0x62,0x00,0x68,0x00,0x1b,0x00,0x91,0x00,0x92,0x00,0x22,0x00,0xad,0x00,0xb0,0x00,0x24,0x00,0xbb,0x00,0xbb,0x00,0x28,0x00,0xc7,0x00,0xd5,0x00,0x29,0x00,0xe1,0x00,0xe1,0x00,0x38,0x00,0xe3, -0x00,0xe3,0x00,0x39,0x00,0xe5,0x00,0xe5,0x00,0x3a,0x00,0xe8,0x00,0xe8,0x00,0x3b,0x00,0xea,0x00,0xea,0x00,0x3c,0x00,0xec,0x00,0xec,0x00,0x3d,0x00,0xf7,0x00,0xf7,0x00,0x3e,0x00,0xf9,0x00,0xfa,0x00,0x3f,0x00,0xfc,0x00,0xfc,0x00,0x41,0x00,0xfe,0x00,0xfe,0x00,0x42,0x01,0x03,0x01,0x03,0x00,0x43,0x01,0x05,0x01,0x05,0x00,0x44, -0x01,0x07,0x01,0x07,0x00,0x45,0x01,0x09,0x01,0x0a,0x00,0x46,0x01,0x0c,0x01,0x0c,0x00,0x48,0x01,0x0e,0x01,0x0e,0x00,0x49,0x01,0x10,0x01,0x10,0x00,0x4a,0x01,0x12,0x01,0x12,0x00,0x4b,0x01,0x14,0x01,0x14,0x00,0x4c,0x01,0x16,0x01,0x16,0x00,0x4d,0x01,0x18,0x01,0x18,0x00,0x4e,0x01,0x1a,0x01,0x1a,0x00,0x4f,0x01,0x1c,0x01,0x1c, -0x00,0x50,0x01,0x1e,0x01,0x1e,0x00,0x51,0x01,0x20,0x01,0x20,0x00,0x52,0x01,0x22,0x01,0x22,0x00,0x53,0x01,0x24,0x01,0x24,0x00,0x54,0x01,0x26,0x01,0x26,0x00,0x55,0x01,0x28,0x01,0x28,0x00,0x56,0x01,0x2a,0x01,0x2a,0x00,0x57,0x01,0x39,0x01,0x39,0x00,0x58,0x01,0x45,0x01,0x45,0x00,0x59,0x01,0x47,0x01,0x47,0x00,0x5a,0x01,0x49, -0x01,0x49,0x00,0x5b,0x01,0x4b,0x01,0x4b,0x00,0x5c,0x01,0x4d,0x01,0x4d,0x00,0x5d,0x01,0x4f,0x01,0x4f,0x00,0x5e,0x01,0x51,0x01,0x51,0x00,0x5f,0x01,0x53,0x01,0x53,0x00,0x60,0x01,0x55,0x01,0x55,0x00,0x61,0x01,0x57,0x01,0x57,0x00,0x62,0x01,0x59,0x01,0x59,0x00,0x63,0x01,0x5b,0x01,0x5b,0x00,0x64,0x01,0x5d,0x01,0x5d,0x00,0x65, -0x01,0x5f,0x01,0x5f,0x00,0x66,0x01,0x61,0x01,0x61,0x00,0x67,0x01,0x63,0x01,0x63,0x00,0x68,0x01,0x65,0x01,0x65,0x00,0x69,0x01,0x68,0x01,0x68,0x00,0x6a,0x01,0x6a,0x01,0x6a,0x00,0x6b,0x01,0x6c,0x01,0x6c,0x00,0x6c,0x01,0x6e,0x01,0x6e,0x00,0x6d,0x01,0x70,0x01,0x70,0x00,0x6e,0x01,0x72,0x01,0x72,0x00,0x6f,0x01,0x74,0x01,0x74, -0x00,0x70,0x01,0x76,0x01,0x76,0x00,0x71,0x01,0x78,0x01,0x78,0x00,0x72,0x01,0x7a,0x01,0x7a,0x00,0x73,0x01,0x7c,0x01,0x7c,0x00,0x74,0x01,0x7e,0x01,0x7e,0x00,0x75,0x01,0x80,0x01,0x80,0x00,0x76,0x01,0x82,0x01,0x82,0x00,0x77,0x01,0x85,0x01,0x85,0x00,0x78,0x01,0x87,0x01,0x87,0x00,0x79,0x01,0x89,0x01,0x89,0x00,0x7a,0x01,0x8c, -0x01,0x8c,0x00,0x7b,0x01,0x8e,0x01,0x8e,0x00,0x7c,0x01,0x90,0x01,0x90,0x00,0x7d,0x01,0x92,0x01,0x92,0x00,0x7e,0x02,0x3d,0x02,0x3d,0x00,0x7f,0x0b,0x21,0x0b,0x21,0x00,0x80,0x00,0x02,0x01,0x06,0x00,0x80,0x0d,0xbe,0x0c,0xeb,0x0c,0xec,0x0c,0xed,0x0c,0xee,0x0c,0xef,0x0c,0xf0,0x0c,0xf1,0x0c,0xf2,0x0c,0xf4,0x0c,0xf5,0x0c,0xf6, -0x0c,0xf7,0x0c,0xf8,0x0c,0xf9,0x0c,0xfa,0x0c,0xfb,0x0c,0xfc,0x0c,0xfd,0x0c,0xfe,0x0c,0xff,0x0d,0x00,0x0d,0x01,0x0d,0x02,0x0d,0x03,0x0d,0x04,0x0d,0x0d,0x0d,0x0c,0x0d,0x0e,0x0d,0x10,0x0d,0x0f,0x0d,0x11,0x0d,0x12,0x0d,0x14,0x0d,0x13,0x0d,0x15,0x0d,0x16,0x0d,0x18,0x0d,0x17,0x0d,0x19,0x0d,0x1a,0x0d,0x1b,0x0d,0x1d,0x0d,0x1c, -0x0d,0x1e,0x0d,0x20,0x0d,0x1f,0x0d,0x22,0x0d,0x21,0x0d,0x23,0x0d,0x24,0x0d,0x0b,0x0d,0x05,0x0d,0x08,0x0d,0x06,0x0d,0x61,0x0c,0xf3,0x0d,0x07,0x0d,0x51,0x0d,0x65,0x0d,0x0a,0x0d,0x25,0x0d,0x09,0x0d,0x33,0x0d,0x50,0x0d,0x29,0x0d,0x2a,0x0d,0x2d,0x0d,0x27,0x0d,0x28,0x0d,0x2c,0x0d,0x31,0x0d,0x32,0x0d,0x40,0x0d,0x42,0x0d,0x43, -0x0d,0x44,0x0d,0x46,0x0d,0x4a,0x0d,0x4b,0x0d,0x4d,0x0d,0x4e,0x0d,0x52,0x0d,0x54,0x0d,0x59,0x0d,0x5a,0x0d,0x63,0x0d,0x64,0x0d,0x3d,0x0d,0x26,0x0d,0xbf,0x0d,0x35,0x0d,0x2e,0x0d,0x2f,0x0d,0x30,0x0d,0xc0,0x0d,0x2b,0x0d,0x34,0x0d,0x36,0x0d,0x37,0x0d,0x38,0x0d,0x39,0x0d,0x3a,0x0d,0x3b,0x0d,0x3e,0x0d,0x3f,0x0d,0x41,0x0d,0x45, -0x0d,0x47,0x0d,0x48,0x0d,0x49,0x0d,0x4c,0x0d,0x4f,0x0d,0x55,0x0d,0x56,0x0d,0x57,0x0d,0x58,0x0d,0x5b,0x0d,0x5c,0x0d,0x60,0x0d,0x66,0x0d,0x67,0x0d,0x68,0x0d,0x5d,0x0d,0x5e,0x0d,0x5f,0x0d,0x62,0x0d,0xc1,0x00,0x02,0x00,0x4f,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x44,0x00,0x4b,0x00,0x01,0x00,0x4d,0x00,0x5d,0x00,0x09,0x00,0x69, -0x00,0x81,0x00,0x1a,0x00,0x89,0x00,0x89,0x00,0x33,0x00,0xa0,0x00,0xa1,0x00,0x34,0x00,0xb1,0x00,0xb1,0x00,0x36,0x00,0xba,0x00,0xba,0x00,0x37,0x00,0xd6,0x00,0xd6,0x00,0x38,0x00,0xe2,0x00,0xe2,0x00,0x39,0x00,0xe4,0x00,0xe4,0x00,0x3a,0x00,0xe6,0x00,0xe6,0x00,0x3b,0x00,0xe9,0x00,0xe9,0x00,0x3c,0x00,0xeb,0x00,0xeb,0x00,0x3d, -0x00,0xed,0x00,0xed,0x00,0x3e,0x00,0xf8,0x00,0xf8,0x00,0x3f,0x00,0xfb,0x00,0xfb,0x00,0x40,0x00,0xfd,0x00,0xfd,0x00,0x41,0x00,0xff,0x01,0x00,0x00,0x42,0x01,0x04,0x01,0x04,0x00,0x44,0x01,0x06,0x01,0x06,0x00,0x45,0x01,0x08,0x01,0x08,0x00,0x46,0x01,0x0b,0x01,0x0b,0x00,0x47,0x01,0x0d,0x01,0x0d,0x00,0x48,0x01,0x0f,0x01,0x0f, -0x00,0x49,0x01,0x11,0x01,0x11,0x00,0x4a,0x01,0x13,0x01,0x13,0x00,0x4b,0x01,0x15,0x01,0x15,0x00,0x4c,0x01,0x17,0x01,0x17,0x00,0x4d,0x01,0x19,0x01,0x19,0x00,0x4e,0x01,0x1b,0x01,0x1b,0x00,0x4f,0x01,0x1d,0x01,0x1d,0x00,0x50,0x01,0x1f,0x01,0x1f,0x00,0x51,0x01,0x21,0x01,0x21,0x00,0x52,0x01,0x23,0x01,0x23,0x00,0x53,0x01,0x25, -0x01,0x25,0x00,0x54,0x01,0x27,0x01,0x27,0x00,0x55,0x01,0x29,0x01,0x29,0x00,0x56,0x01,0x2b,0x01,0x2b,0x00,0x57,0x01,0x3a,0x01,0x3a,0x00,0x58,0x01,0x46,0x01,0x46,0x00,0x59,0x01,0x48,0x01,0x48,0x00,0x5a,0x01,0x4a,0x01,0x4a,0x00,0x5b,0x01,0x4c,0x01,0x4c,0x00,0x5c,0x01,0x4e,0x01,0x4e,0x00,0x5d,0x01,0x50,0x01,0x50,0x00,0x5e, -0x01,0x52,0x01,0x52,0x00,0x5f,0x01,0x54,0x01,0x54,0x00,0x60,0x01,0x56,0x01,0x56,0x00,0x61,0x01,0x58,0x01,0x58,0x00,0x62,0x01,0x5a,0x01,0x5a,0x00,0x63,0x01,0x5c,0x01,0x5c,0x00,0x64,0x01,0x5e,0x01,0x5e,0x00,0x65,0x01,0x60,0x01,0x60,0x00,0x66,0x01,0x62,0x01,0x62,0x00,0x67,0x01,0x64,0x01,0x64,0x00,0x68,0x01,0x66,0x01,0x66, -0x00,0x69,0x01,0x69,0x01,0x69,0x00,0x6a,0x01,0x6b,0x01,0x6b,0x00,0x6b,0x01,0x6d,0x01,0x6d,0x00,0x6c,0x01,0x6f,0x01,0x6f,0x00,0x6d,0x01,0x71,0x01,0x71,0x00,0x6e,0x01,0x73,0x01,0x73,0x00,0x6f,0x01,0x75,0x01,0x75,0x00,0x70,0x01,0x77,0x01,0x77,0x00,0x71,0x01,0x79,0x01,0x79,0x00,0x72,0x01,0x7b,0x01,0x7b,0x00,0x73,0x01,0x7d, -0x01,0x7d,0x00,0x74,0x01,0x7f,0x01,0x7f,0x00,0x75,0x01,0x81,0x01,0x81,0x00,0x76,0x01,0x83,0x01,0x83,0x00,0x77,0x01,0x86,0x01,0x86,0x00,0x78,0x01,0x88,0x01,0x88,0x00,0x79,0x01,0x8a,0x01,0x8a,0x00,0x7a,0x01,0x8d,0x01,0x8d,0x00,0x7b,0x01,0x8f,0x01,0x8f,0x00,0x7c,0x01,0x91,0x01,0x91,0x00,0x7d,0x01,0x93,0x01,0x93,0x00,0x7e, -0x02,0x3e,0x02,0x3e,0x00,0x7f,0x00,0x02,0x00,0x08,0x00,0x01,0x0c,0xf3,0x00,0x01,0x00,0x01,0x00,0x4c,0x00,0x02,0x00,0x08,0x00,0x01,0x0d,0x3c,0x00,0x01,0x00,0x01,0x00,0x4c,0x00,0x01,0x00,0x24,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x10,0x00,0x16,0x0d,0xbd,0x00,0x03,0x00,0x49,0x00,0x4f,0x0d,0xbb,0x00,0x02,0x00,0x49, -0x0d,0xba,0x00,0x02,0x00,0x4f,0x00,0x01,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x28,0x00,0x02,0x00,0x0a,0x00,0x1e,0x00,0x02,0x00,0x06,0x00,0x0e,0x0d,0xbc,0x00,0x03,0x00,0x49,0x00,0x4c,0x0d,0xb9,0x00,0x02,0x00,0x4c,0x00,0x01,0x00,0x04,0x0d,0xbc,0x00,0x02,0x00,0x4c,0x00,0x01,0x00,0x02,0x00,0x49,0x0d,0xbb,0x00,0x02,0x00,0x08, -0x00,0x01,0x00,0xbc,0x00,0x01,0x00,0x01,0x00,0x12,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x74,0x00,0x02,0x00,0x02,0x00,0xbc,0x00,0xbc,0x00,0x00,0x0c,0xe1,0x0c,0xea,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x08,0x8d,0x00,0xf0, -0x00,0xf1,0x00,0xf2,0x02,0x38,0x02,0x39,0x08,0x8e,0x02,0x3a,0x02,0x3b,0x08,0x8f,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xc3,0x0c,0xc4,0x0c,0xc5,0x0c,0xc6,0x0c,0xc7,0x0c,0xc8,0x0c,0xc9,0x0c,0xca,0x0c,0xcb,0x0c,0xcc,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02, -0x00,0x1a,0x00,0x0a,0x0c,0xb9,0x0c,0xba,0x0c,0xbb,0x0c,0xbc,0x0c,0xbd,0x0c,0xbe,0x0c,0xbf,0x0c,0xc0,0x0c,0xc1,0x0c,0xc2,0x00,0x02,0x00,0x01,0x0c,0xcd,0x0c,0xd6,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x01, -0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x02,0x00,0x01,0x0c,0xcd,0x0c,0xd6,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xb9,0x0c,0xba,0x0c,0xbb,0x0c,0xbc,0x0c,0xbd,0x0c,0xbe,0x0c,0xbf,0x0c,0xc0, -0x0c,0xc1,0x0c,0xc2,0x00,0x02,0x00,0x01,0x0c,0xc3,0x0c,0xcc,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x02,0x00,0x01,0x0c,0xc3,0x0c,0xcc,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xc3,0x0c,0xc4,0x0c,0xc5,0x0c,0xc6, -0x0c,0xc7,0x0c,0xc8,0x0c,0xc9,0x0c,0xca,0x0c,0xcb,0x0c,0xcc,0x00,0x02,0x00,0x01,0x0c,0xb9,0x0c,0xc2,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x01,0x0c,0xb9,0x0c,0xc2,0x00,0x00,0x00,0x01,0x00,0x9a,0x00,0x06, -0x00,0x12,0x00,0x38,0x00,0x44,0x00,0x50,0x00,0x6a,0x00,0x76,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1c,0x10,0xb9,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x14,0x10,0xba,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x15,0x10,0xbb,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x16,0x00,0x01,0x00,0x04,0x08,0xc5,0x00,0x03,0x00,0x35,0x00,0x30,0x00,0x01, -0x00,0x04,0x10,0xbc,0x00,0x03,0x00,0x39,0x00,0x36,0x00,0x02,0x00,0x06,0x00,0x10,0x10,0xfb,0x00,0x04,0x00,0x25,0x00,0x36,0x00,0x33,0x10,0xfd,0x00,0x04,0x00,0x31,0x00,0x25,0x00,0x36,0x00,0x01,0x00,0x04,0x08,0xc6,0x00,0x03,0x00,0x2f,0x00,0x30,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1a,0x10,0xfc,0x00,0x04,0x00,0x3a,0x00,0x36, -0x00,0x33,0x08,0xc4,0x00,0x03,0x00,0x3a,0x00,0x2d,0x08,0xc3,0x00,0x04,0x00,0x3a,0x00,0x31,0x00,0x2d,0x00,0x02,0x00,0x04,0x00,0x29,0x00,0x29,0x00,0x00,0x00,0x2f,0x00,0x31,0x00,0x01,0x00,0x35,0x00,0x35,0x00,0x04,0x00,0x3d,0x00,0x3d,0x00,0x05,0x00,0x02,0x00,0x80,0x00,0x3d,0x10,0xe5,0x10,0xbd,0x10,0xbe,0x10,0xbf,0x10,0xe6, -0x10,0xe7,0x10,0xe8,0x10,0xe9,0x10,0xea,0x10,0xeb,0x10,0xec,0x10,0xed,0x10,0xc0,0x10,0xc1,0x10,0xf9,0x10,0xc2,0x10,0xc3,0x10,0xc4,0x10,0xee,0x10,0xef,0x10,0xf0,0x10,0xf1,0x10,0xf2,0x10,0xf3,0x10,0xf4,0x10,0xc5,0x10,0xf5,0x10,0xf6,0x10,0xc6,0x10,0xc7,0x10,0xc8,0x10,0xc9,0x10,0xca,0x10,0xf7,0x10,0xcb,0x10,0xcc,0x10,0xcd, -0x10,0xce,0x10,0xcf,0x10,0xd0,0x10,0xd1,0x10,0xd2,0x10,0xd3,0x10,0xd4,0x10,0xd5,0x10,0xd6,0x10,0xd7,0x10,0xd8,0x10,0xd9,0x10,0xda,0x10,0xdb,0x10,0xdc,0x10,0xdd,0x10,0xde,0x10,0xdf,0x10,0xe0,0x10,0xe1,0x10,0xf8,0x10,0xe2,0x10,0xe3,0x10,0xe4,0x00,0x02,0x00,0x1b,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x0a,0x00,0x01, -0x00,0x0d,0x00,0x0d,0x00,0x05,0x00,0x0f,0x00,0x11,0x00,0x06,0x00,0x1d,0x00,0x1e,0x00,0x09,0x00,0x42,0x00,0x42,0x00,0x0b,0x00,0x85,0x00,0x86,0x00,0x0c,0x00,0x8c,0x00,0x8c,0x00,0x0e,0x00,0x97,0x00,0x98,0x00,0x0f,0x00,0x9a,0x00,0x9a,0x00,0x11,0x00,0xaa,0x00,0xab,0x00,0x12,0x00,0xb2,0x00,0xb2,0x00,0x14,0x00,0xb4,0x00,0xb7, -0x00,0x15,0x00,0xbd,0x00,0xbd,0x00,0x19,0x00,0xc4,0x00,0xc5,0x00,0x1a,0x00,0xf3,0x00,0xf6,0x00,0x1c,0x01,0x38,0x01,0x38,0x00,0x20,0x01,0x94,0x01,0x94,0x00,0x21,0x01,0x96,0x01,0x96,0x00,0x22,0x01,0x98,0x01,0x9b,0x00,0x23,0x07,0xd2,0x07,0xd8,0x00,0x27,0x07,0xda,0x07,0xdf,0x00,0x2e,0x08,0x56,0x08,0x59,0x00,0x34,0x08,0x8c, -0x08,0x8c,0x00,0x38,0x08,0xbd,0x08,0xbd,0x00,0x39,0x0a,0x64,0x0a,0x64,0x00,0x3a,0x0b,0x2a,0x0b,0x2b,0x00,0x3b,0x00,0x02,0x00,0x56,0x00,0x28,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4, -0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x02,0x00,0x13,0x00,0x1c,0x00,0x00,0x0c,0xb9,0x0c,0xd6,0x00,0x0a,0x00,0x02,0x00,0xa2, -0x00,0x4e,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0d,0xf2,0x0d,0xf3,0x10,0x9a,0x10,0x9b,0x10,0xa5,0x10,0xaf,0x10,0xb6,0x10,0xac,0x10,0xad,0x10,0xb7,0x10,0xb8,0x10,0xa9,0x10,0xb1,0x10,0x99,0x10,0xa6,0x10,0xa7,0x10,0xab,0x10,0xae,0x10,0xa8,0x10,0x96,0x10,0xb2, -0x10,0xa3,0x10,0xa2,0x10,0x9c,0x10,0x9e,0x10,0x9d,0x10,0xa0,0x10,0x9f,0x10,0xa1,0x10,0xa4,0x10,0xb4,0x10,0xb5,0x10,0xb0,0x10,0xb3,0x10,0x98,0x10,0x97,0x10,0xaa,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc, -0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x10,0x95,0x00,0x02,0x00,0x1b,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x2c,0x00,0x2c,0x00,0x0a,0x00,0x34,0x00,0x34,0x00,0x0b,0x00,0xcc,0x00,0xcf,0x00,0x0c,0x00,0xf9,0x00,0xf9,0x00,0x10, -0x01,0x39,0x01,0x39,0x00,0x11,0x01,0x5b,0x01,0x5b,0x00,0x12,0x01,0x5d,0x01,0x5d,0x00,0x13,0x01,0x5f,0x01,0x5f,0x00,0x14,0x01,0x61,0x01,0x61,0x00,0x15,0x01,0xa4,0x01,0xa4,0x00,0x16,0x01,0xae,0x01,0xae,0x00,0x17,0x01,0xbd,0x01,0xbd,0x00,0x18,0x01,0xe0,0x01,0xe0,0x00,0x19,0x02,0x7f,0x02,0x7f,0x00,0x1a,0x02,0x81,0x02,0x81, -0x00,0x1b,0x02,0xb5,0x02,0xb5,0x00,0x1c,0x03,0x0f,0x03,0x0f,0x00,0x1d,0x03,0x11,0x03,0x11,0x00,0x1e,0x03,0xad,0x03,0xb4,0x00,0x1f,0x04,0x3f,0x04,0x42,0x00,0x27,0x04,0xf9,0x04,0xf9,0x00,0x2b,0x05,0x2c,0x05,0x2c,0x00,0x2c,0x05,0x2e,0x05,0x2e,0x00,0x2d,0x06,0x21,0x06,0x21,0x00,0x2e,0x0c,0xb9,0x0c,0xd6,0x00,0x2f,0x0d,0xe4, -0x0d,0xe4,0x00,0x4d,0x00,0x02,0x00,0x42,0x00,0x1e,0x0d,0xf5,0x0d,0xf6,0x0d,0xf7,0x0d,0xf8,0x0d,0xf9,0x0d,0xfa,0x0d,0xfb,0x0d,0xfc,0x0d,0xfd,0x0d,0xfe,0x0d,0xff,0x0e,0x00,0x0e,0x01,0x0e,0x0b,0x0e,0x02,0x0e,0x03,0x0e,0x04,0x0e,0x05,0x0e,0x06,0x0e,0x07,0x0e,0x08,0x0e,0x09,0x0e,0x0a,0x0e,0x0f,0x0e,0x10,0x0e,0x0e,0x0e,0x0c, -0x0e,0x0d,0x0e,0x11,0x0e,0x12,0x00,0x02,0x00,0x13,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x01,0x00,0x1e,0x00,0x1e,0x00,0x02,0x00,0x22,0x00,0x22,0x00,0x03,0x00,0xb4,0x00,0xb7,0x00,0x04,0x00,0xc4,0x00,0xc5,0x00,0x08,0x01,0x08,0x01,0x08,0x00,0x0a,0x01,0x10,0x01,0x11,0x00,0x0b,0x01,0x23,0x01,0x23,0x00,0x0d, -0x01,0x3b,0x01,0x3b,0x00,0x0e,0x01,0x55,0x01,0x56,0x00,0x0f,0x01,0x65,0x01,0x66,0x00,0x11,0x01,0x6a,0x01,0x6b,0x00,0x13,0x01,0x72,0x01,0x73,0x00,0x15,0x01,0x94,0x01,0x94,0x00,0x17,0x01,0x9c,0x01,0x9c,0x00,0x18,0x01,0x9e,0x01,0x9e,0x00,0x19,0x02,0x3d,0x02,0x3e,0x00,0x1a,0x02,0xaf,0x02,0xb0,0x00,0x1c,0x00,0x02,0x00,0x08, -0x00,0x01,0x0d,0xf4,0x00,0x01,0x00,0x01,0x00,0x09,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x11,0x84,0x00,0x02,0x11,0x83,0x00,0x01,0x00,0x01,0x11,0x82,0x00,0x01,0x00,0x8a,0x00,0x0b,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x00,0x62,0x00,0x6c,0x00,0x76,0x00,0x80,0x00,0x01, -0x00,0x04,0x11,0x8e,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x98,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x8f,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x90,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x91,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x92,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x93, -0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x94,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x95,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x96,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x97,0x00,0x02,0x11,0x8d,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x00,0x0c,0xcd,0x0c,0xd6,0x00,0x01,0x00,0x01,0x00,0x8a, -0x00,0x0b,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x00,0x62,0x00,0x6c,0x00,0x76,0x00,0x80,0x00,0x01,0x00,0x04,0x11,0x8e,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x98,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x8f,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x90,0x00,0x02,0x11,0x8d, -0x00,0x01,0x00,0x04,0x11,0x91,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x92,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x93,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x94,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x95,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x96,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04, -0x11,0x97,0x00,0x02,0x11,0x8d,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x13,0x00,0x1c,0x00,0x01,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xa4,0x11,0xa5,0x11,0xa6,0x11,0xa7,0x11,0xa8,0x11,0xa9,0x11,0xaa,0x11,0xab,0x11,0xac,0x11,0xad,0x00,0x02,0x00,0x01,0x0f,0xd6,0x0f,0xdf,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a, -0x11,0xb8,0x11,0xb9,0x11,0xba,0x11,0xbb,0x11,0xbc,0x11,0xbd,0x11,0xbe,0x11,0xbf,0x11,0xc0,0x11,0xc1,0x00,0x02,0x00,0x01,0x0f,0xea,0x0f,0xf3,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xae,0x11,0xaf,0x11,0xb0,0x11,0xb1,0x11,0xb2,0x11,0xb3,0x11,0xb4,0x11,0xb5,0x11,0xb6,0x11,0xb7,0x00,0x02,0x00,0x01,0x0f,0xe0,0x0f,0xe9, -0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xc2,0x11,0xc3,0x11,0xc4,0x11,0xc5,0x11,0xc6,0x11,0xc7,0x11,0xc8,0x11,0xc9,0x11,0xca,0x11,0xcb,0x00,0x02,0x00,0x01,0x0f,0xf4,0x0f,0xfd,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xcc,0x11,0xcd,0x11,0xce,0x11,0xcf,0x11,0xd0,0x11,0xd1,0x11,0xd2,0x11,0xd3,0x11,0xd4,0x11,0xd5, -0x00,0x02,0x00,0x01,0x0f,0xfe,0x10,0x07,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xd6,0x11,0xd7,0x11,0xd8,0x11,0xd9,0x11,0xda,0x11,0xdb,0x11,0xdc,0x11,0xdd,0x11,0xde,0x11,0xdf,0x00,0x02,0x00,0x01,0x10,0x08,0x10,0x11,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xe0,0x11,0xe1,0x11,0xe2,0x11,0xe3,0x11,0xe4,0x11,0xe5, -0x11,0xe6,0x11,0xe7,0x11,0xe8,0x11,0xe9,0x00,0x02,0x00,0x01,0x10,0x12,0x10,0x1b,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xea,0x11,0xeb,0x11,0xec,0x11,0xed,0x11,0xee,0x11,0xef,0x11,0xf0,0x11,0xf1,0x11,0xf2,0x11,0xf3,0x00,0x02,0x00,0x01,0x10,0x1c,0x10,0x25,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xf4,0x11,0xf5, -0x11,0xf6,0x11,0xf7,0x11,0xf8,0x11,0xf9,0x11,0xfa,0x11,0xfb,0x11,0xfc,0x11,0xfd,0x00,0x02,0x00,0x01,0x10,0x26,0x10,0x2f,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xfe,0x11,0xff,0x12,0x00,0x12,0x01,0x12,0x02,0x12,0x03,0x12,0x04,0x12,0x05,0x12,0x06,0x12,0x07,0x00,0x02,0x00,0x01,0x10,0x30,0x10,0x39,0x00,0x00,0x00,0x02, -0x00,0x1a,0x00,0x0a,0x12,0x08,0x12,0x09,0x12,0x0a,0x12,0x0b,0x12,0x0c,0x12,0x0d,0x12,0x0e,0x12,0x0f,0x12,0x10,0x12,0x11,0x00,0x02,0x00,0x01,0x10,0x3a,0x10,0x43,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x12,0x12,0x13,0x12,0x14,0x12,0x15,0x12,0x16,0x12,0x17,0x12,0x18,0x12,0x19,0x12,0x1a,0x12,0x1b,0x00,0x02,0x00,0x01, -0x10,0x44,0x10,0x4d,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x1c,0x12,0x1d,0x12,0x1e,0x12,0x1f,0x12,0x20,0x12,0x21,0x12,0x22,0x12,0x23,0x12,0x24,0x12,0x25,0x00,0x02,0x00,0x01,0x10,0x4e,0x10,0x57,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x26,0x12,0x27,0x12,0x28,0x12,0x29,0x12,0x2a,0x12,0x2b,0x12,0x2c,0x12,0x2d, -0x12,0x2e,0x12,0x2f,0x00,0x02,0x00,0x01,0x10,0x58,0x10,0x61,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x30,0x12,0x31,0x12,0x32,0x12,0x33,0x12,0x34,0x12,0x35,0x12,0x36,0x12,0x37,0x12,0x38,0x12,0x39,0x00,0x02,0x00,0x01,0x10,0x62,0x10,0x6b,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x3a,0x12,0x3b,0x12,0x3c,0x12,0x3d, -0x12,0x3e,0x12,0x3f,0x12,0x40,0x12,0x41,0x12,0x42,0x12,0x43,0x00,0x02,0x00,0x01,0x10,0x6c,0x10,0x75,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x44,0x12,0x45,0x12,0x46,0x12,0x47,0x12,0x48,0x12,0x49,0x12,0x4a,0x12,0x4b,0x12,0x4c,0x12,0x4d,0x00,0x02,0x00,0x01,0x10,0x76,0x10,0x7f,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a, -0x12,0x4f,0x12,0x50,0x12,0x51,0x12,0x52,0x12,0x53,0x12,0x54,0x12,0x55,0x12,0x56,0x12,0x57,0x12,0x58,0x00,0x02,0x00,0x01,0x10,0x81,0x10,0x8a,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0xb7,0x00,0x02,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x08,0x00,0x01, -0x00,0x04,0x0b,0xb7,0x00,0x03,0x08,0xc4,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x02,0x00,0x82,0x00,0x88,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x02, -0x00,0x6e,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x02,0x00,0x5a,0x00,0x94,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x00,0x01,0x0b,0x7a,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b, -0x0b,0xb9,0x0b,0xb9,0x00,0x0c,0x0b,0xbf,0x0b,0xbf,0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02, -0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0xc8,0x00,0x03,0x00,0x02,0x02,0xbc,0x02,0xea,0x00,0x01,0x02,0xf0,0x00,0x01,0x02,0xf6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x02,0xa6, -0x02,0xa6,0x02,0xd4,0x00,0x01,0x02,0xda,0x00,0x01,0x02,0xe0,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x02,0x8e,0x02,0xf0,0x02,0xbc,0x00,0x01,0x02,0xc2,0x00,0x01,0x02,0xc8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x02,0x76,0x02,0x76,0x02,0xd8,0x02,0xa4,0x00,0x01,0x02,0xaa,0x00,0x01,0x02,0xb0,0x00,0x01, -0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0xc6,0x00,0x01,0x02,0x90,0x00,0x01,0x02,0xcc,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x02,0x48,0x02,0xb2,0x00,0x01,0x02,0x7c,0x00,0x01,0x02,0xb8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x9c,0x00,0x01,0x02,0x66,0x00,0x02,0x02,0xdc,0x02,0x32,0x00,0x01, -0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x02,0x1c,0x02,0x86,0x00,0x01,0x02,0x50,0x00,0x02,0x02,0xc6,0x02,0x1c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x6e,0x00,0x01,0x02,0x38,0x00,0x03,0x02,0xae,0x02,0xb4,0x02,0xba,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0xec,0x02,0x56,0x00,0x01,0x02,0x20, -0x00,0x03,0x02,0x96,0x02,0x9c,0x02,0xa2,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x3c,0x00,0x01,0x02,0x06,0x00,0x03,0x02,0x7c,0x02,0x82,0x02,0x3c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0xba,0x02,0x24,0x00,0x01,0x01,0xee,0x00,0x03,0x02,0x64,0x02,0x6a,0x02,0x24,0x00,0x01,0x00,0x00,0x00,0x76, -0x00,0x03,0x00,0x01,0x02,0x5c,0x00,0x01,0x01,0xd4,0x00,0x01,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x48,0x00,0x01,0x01,0xc0,0x00,0x02,0x02,0x36,0x01,0x8c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x32,0x00,0x01,0x01,0xaa,0x00,0x03,0x02,0x20,0x02,0x26,0x01,0xe0,0x00,0x01,0x00,0x00, -0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x1a,0x00,0x01,0x01,0x92,0x00,0x03,0x02,0x08,0x02,0x0e,0x02,0x14,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x46,0x02,0x02,0x00,0x01,0x01,0x7a,0x00,0x01,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x30,0x01,0xec,0x00,0x01,0x01,0x64,0x00,0x02,0x01,0xda, -0x01,0x30,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x18,0x01,0xd4,0x00,0x01,0x01,0x4c,0x00,0x03,0x01,0xc2,0x01,0xc8,0x01,0x82,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x00,0xfe,0x01,0xba,0x00,0x01,0x01,0x32,0x00,0x03,0x01,0xa8,0x01,0xae,0x01,0xb4,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02, -0x01,0xa6,0x01,0xac,0x00,0x01,0x01,0x18,0x00,0x01,0x01,0x1e,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x01,0x90,0x01,0x84,0x01,0x96,0x00,0x01,0x01,0x02,0x00,0x01,0x01,0x08,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x01,0x6c,0x01,0x78,0x01,0x7e,0x00,0x01,0x00,0xea,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0x00, -0x00,0x76,0x00,0x03,0x00,0x03,0x00,0x9e,0x01,0x60,0x01,0x66,0x00,0x01,0x00,0xd2,0x00,0x01,0x00,0xd8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x86,0x00,0x86,0x01,0x48,0x01,0x4e,0x00,0x01,0x00,0xba,0x00,0x01,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x6c,0x01,0x2e,0x01,0x22,0x01,0x34, -0x00,0x01,0x00,0xa0,0x00,0x01,0x00,0xa6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x05,0x00,0x52,0x00,0x52,0x01,0x14,0x01,0x08,0x01,0x1a,0x00,0x01,0x00,0x86,0x00,0x01,0x00,0x8c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x36,0x00,0xec,0x00,0xf8,0x00,0xfe,0x00,0x01,0x00,0x6a,0x00,0x01,0x00,0x70,0x00,0x01, -0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x05,0x00,0x1c,0x00,0x1c,0x00,0xd2,0x00,0xde,0x00,0xe4,0x00,0x01,0x00,0x50,0x00,0x01,0x00,0x56,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd, -0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62, -0x00,0x4c,0x00,0x01,0x00,0x02,0x0b,0x5e,0x0b,0x61,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0, -0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0x5e,0x00,0x01,0x00,0x01,0x0b,0xde,0x00,0x01,0x00,0x01,0x0b,0x64,0x00,0x01,0x00,0x01,0x0b,0x81,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0xd8,0x00,0x01,0x00,0x01,0x0b,0xd0,0x00,0x01,0x00,0x16, -0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0x8c,0x00,0x04,0x08,0xc4,0x0b,0x71,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x71,0x00,0x01,0x00,0x2a,0x00,0x03,0x00,0x0c,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x04,0x12,0x59,0x00,0x02,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5a,0x00,0x02,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5b,0x00,0x02, -0x0b,0x5f,0x00,0x02,0x00,0x01,0x0b,0x54,0x0b,0x56,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x03,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x01,0x00,0x04,0x12,0x59,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5a,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5b,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x02,0x00,0x01, -0x0b,0x54,0x0b,0x56,0x00,0x00,0x00,0x01,0x01,0xaa,0x00,0x01,0x00,0x08,0x00,0x34,0x00,0x6a,0x00,0x70,0x00,0x76,0x00,0x7c,0x00,0x82,0x00,0x88,0x00,0x8e,0x00,0x94,0x00,0x9a,0x00,0xa0,0x00,0xa6,0x00,0xac,0x00,0xb2,0x00,0xb8,0x00,0xbe,0x00,0xc4,0x00,0xca,0x00,0xd0,0x00,0xd6,0x00,0xdc,0x00,0xe2,0x00,0xe8,0x00,0xee,0x00,0xf4, -0x00,0xfa,0x01,0x00,0x01,0x06,0x01,0x0c,0x01,0x12,0x01,0x18,0x01,0x1e,0x01,0x24,0x01,0x2a,0x01,0x30,0x01,0x36,0x01,0x3c,0x01,0x42,0x01,0x48,0x01,0x4e,0x01,0x54,0x01,0x5a,0x01,0x60,0x01,0x66,0x01,0x6c,0x01,0x72,0x01,0x78,0x01,0x7e,0x01,0x84,0x01,0x8a,0x01,0x90,0x01,0x96,0x01,0x9c,0x0b,0x53,0x00,0x02,0x0b,0x53,0x0b,0x54, -0x00,0x02,0x0b,0x54,0x0b,0x55,0x00,0x02,0x0b,0x55,0x0b,0x56,0x00,0x02,0x0b,0x56,0x0b,0x57,0x00,0x02,0x0b,0x57,0x0b,0x58,0x00,0x02,0x0b,0x58,0x0b,0x59,0x00,0x02,0x0b,0x59,0x0b,0x5a,0x00,0x02,0x0b,0x5a,0x0b,0x5b,0x00,0x02,0x0b,0x5b,0x0b,0x5c,0x00,0x02,0x0b,0x5c,0x0b,0x5d,0x00,0x02,0x0b,0x5d,0x0b,0x5e,0x00,0x02,0x0b,0x5e, -0x0b,0x5f,0x00,0x02,0x0b,0x5f,0x0b,0x61,0x00,0x02,0x0b,0x61,0x0b,0x66,0x00,0x02,0x0b,0x66,0x0b,0x67,0x00,0x02,0x0b,0x67,0x0b,0xb9,0x00,0x02,0x0b,0xb9,0x0b,0xbf,0x00,0x02,0x0b,0xbf,0x0b,0xc0,0x00,0x02,0x0b,0xc0,0x0b,0xc1,0x00,0x02,0x0b,0xc1,0x0b,0xc2,0x00,0x02,0x0b,0xc2,0x0b,0xc3,0x00,0x02,0x0b,0xc3,0x0b,0xc4,0x00,0x02, -0x0b,0xc4,0x0b,0xc5,0x00,0x02,0x0b,0xc5,0x0b,0xc6,0x00,0x02,0x0b,0xc6,0x0b,0xc7,0x00,0x02,0x0b,0xc7,0x0b,0xc8,0x00,0x02,0x0b,0xc8,0x0b,0xc9,0x00,0x02,0x0b,0xc9,0x0b,0xca,0x00,0x02,0x0b,0xca,0x0b,0xcb,0x00,0x02,0x0b,0xcb,0x0b,0xcc,0x00,0x02,0x0b,0xcc,0x0b,0xcd,0x00,0x02,0x0b,0xcd,0x0b,0xce,0x00,0x02,0x0b,0xce,0x0b,0xcf, -0x00,0x02,0x0b,0xcf,0x0b,0xd0,0x00,0x02,0x0b,0xd0,0x0b,0xd1,0x00,0x02,0x0b,0xd1,0x0b,0xd2,0x00,0x02,0x0b,0xd2,0x0b,0xd3,0x00,0x02,0x0b,0xd3,0x0b,0xd4,0x00,0x02,0x0b,0xd4,0x0b,0xd5,0x00,0x02,0x0b,0xd5,0x0b,0xd6,0x00,0x02,0x0b,0xd6,0x0b,0xd7,0x00,0x02,0x0b,0xd7,0x0b,0xd8,0x00,0x02,0x0b,0xd8,0x0b,0xd9,0x00,0x02,0x0b,0xd9, -0x0b,0xda,0x00,0x02,0x0b,0xda,0x0b,0xdb,0x00,0x02,0x0b,0xdb,0x0b,0xdc,0x00,0x02,0x0b,0xdc,0x0b,0xdd,0x00,0x02,0x0b,0xdd,0x0b,0xe1,0x00,0x02,0x0b,0xe1,0x12,0x5c,0x00,0x02,0x12,0x5c,0x12,0x5d,0x00,0x02,0x12,0x5d,0x12,0x5e,0x00,0x02,0x12,0x5e,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01, -0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x1a, -0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xdf,0x00,0x02,0x07,0x39,0x0b,0xdf,0x00,0x02,0x08,0xc4,0x00,0x01,0x00,0x01,0x0b,0x78,0x00,0x01,0x0e,0x76,0x00,0x84,0x01,0x0e,0x01,0x28,0x01,0x42,0x01,0x5c,0x01,0x76,0x01,0x90,0x01,0xaa,0x01,0xc4,0x01,0xde,0x01,0xf8,0x02,0x12,0x02,0x2c,0x02,0x46,0x02,0x60,0x02,0x7a, -0x02,0x94,0x02,0xae,0x02,0xc8,0x02,0xe2,0x02,0xfc,0x03,0x16,0x03,0x30,0x03,0x4a,0x03,0x64,0x03,0x7e,0x03,0x98,0x03,0xb2,0x03,0xcc,0x03,0xe6,0x04,0x00,0x04,0x1a,0x04,0x34,0x04,0x4e,0x04,0x68,0x04,0x82,0x04,0x9c,0x04,0xb6,0x04,0xd0,0x04,0xea,0x05,0x04,0x05,0x1e,0x05,0x38,0x05,0x52,0x05,0x6c,0x05,0x86,0x05,0xa0,0x05,0xba, -0x05,0xd4,0x05,0xee,0x06,0x08,0x06,0x22,0x06,0x3c,0x06,0x56,0x06,0x70,0x06,0x8a,0x06,0xa4,0x06,0xbe,0x06,0xd8,0x06,0xf2,0x07,0x0c,0x07,0x26,0x07,0x40,0x07,0x5a,0x07,0x74,0x07,0x8e,0x07,0xa8,0x07,0xc2,0x07,0xdc,0x07,0xf6,0x08,0x10,0x08,0x2a,0x08,0x44,0x08,0x5e,0x08,0x78,0x08,0x92,0x08,0xac,0x08,0xc6,0x08,0xe0,0x08,0xfa, -0x09,0x14,0x09,0x2e,0x09,0x48,0x09,0x62,0x09,0x7c,0x09,0x96,0x09,0xb0,0x09,0xca,0x09,0xe4,0x09,0xfe,0x0a,0x18,0x0a,0x32,0x0a,0x4c,0x0a,0x66,0x0a,0x80,0x0a,0x9a,0x0a,0xb4,0x0a,0xce,0x0a,0xe8,0x0b,0x02,0x0b,0x1c,0x0b,0x36,0x0b,0x50,0x0b,0x6a,0x0b,0x84,0x0b,0x9e,0x0b,0xb8,0x0b,0xd2,0x0b,0xec,0x0c,0x06,0x0c,0x20,0x0c,0x3a, -0x0c,0x54,0x0c,0x6e,0x0c,0x88,0x0c,0xa2,0x0c,0xbc,0x0c,0xd6,0x0c,0xf0,0x0d,0x0a,0x0d,0x24,0x0d,0x3e,0x0d,0x58,0x0d,0x72,0x0d,0x8c,0x0d,0xa6,0x0d,0xc0,0x0d,0xda,0x0d,0xf4,0x0e,0x0e,0x0e,0x28,0x0e,0x42,0x0e,0x5c,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0a,0x43,0x00,0x02,0x07,0x39,0x0a,0x43,0x00,0x02,0x08,0xc4,0x0a,0x43, -0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x53,0x00,0x02,0x07,0x39,0x0b,0x53,0x00,0x02,0x08,0xc4,0x0b,0x53,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x54,0x00,0x02,0x07,0x39,0x0b,0x54,0x00,0x02,0x08,0xc4,0x0b,0x54,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, -0x0b,0x55,0x00,0x02,0x07,0x39,0x0b,0x55,0x00,0x02,0x08,0xc4,0x0b,0x55,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x56,0x00,0x02,0x07,0x39,0x0b,0x56,0x00,0x02,0x08,0xc4,0x0b,0x56,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x57,0x00,0x02,0x07,0x39,0x0b,0x57,0x00,0x02,0x08,0xc4, -0x0b,0x57,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x58,0x00,0x02,0x07,0x39,0x0b,0x58,0x00,0x02,0x08,0xc4,0x0b,0x58,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x59,0x00,0x02,0x07,0x39,0x0b,0x59,0x00,0x02,0x08,0xc4,0x0b,0x59,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e, -0x00,0x14,0x0b,0x5a,0x00,0x02,0x07,0x39,0x0b,0x5a,0x00,0x02,0x08,0xc4,0x0b,0x5a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5b,0x00,0x02,0x07,0x39,0x0b,0x5b,0x00,0x02,0x08,0xc4,0x0b,0x5b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5c,0x00,0x02,0x07,0x39,0x0b,0x5c,0x00,0x02, -0x08,0xc4,0x0b,0x5c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5d,0x00,0x02,0x07,0x39,0x0b,0x5d,0x00,0x02,0x08,0xc4,0x0b,0x5d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5e,0x00,0x02,0x07,0x39,0x0b,0x5e,0x00,0x02,0x08,0xc4,0x0b,0x5e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08, -0x00,0x0e,0x00,0x14,0x0b,0x5f,0x00,0x02,0x07,0x39,0x0b,0x5f,0x00,0x02,0x08,0xc4,0x0b,0x5f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x61,0x00,0x02,0x07,0x39,0x0b,0x61,0x00,0x02,0x08,0xc4,0x0b,0x61,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x66,0x00,0x02,0x07,0x39,0x0b,0x66, -0x00,0x02,0x08,0xc4,0x0b,0x66,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x67,0x00,0x02,0x07,0x39,0x0b,0x67,0x00,0x02,0x08,0xc4,0x0b,0x67,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x68,0x00,0x02,0x07,0x39,0x0b,0x68,0x00,0x02,0x08,0xc4,0x0b,0x68,0x00,0x02,0x08,0xc3,0x00,0x03, -0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x69,0x00,0x02,0x07,0x39,0x0b,0x69,0x00,0x02,0x08,0xc4,0x0b,0x69,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6a,0x00,0x02,0x07,0x39,0x0b,0x6a,0x00,0x02,0x08,0xc4,0x0b,0x6a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6b,0x00,0x02,0x07,0x39, -0x0b,0x6b,0x00,0x02,0x08,0xc4,0x0b,0x6b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6c,0x00,0x02,0x07,0x39,0x0b,0x6c,0x00,0x02,0x08,0xc4,0x0b,0x6c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6d,0x00,0x02,0x07,0x39,0x0b,0x6d,0x00,0x02,0x08,0xc4,0x0b,0x6d,0x00,0x02,0x08,0xc3, -0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6e,0x00,0x02,0x07,0x39,0x0b,0x6e,0x00,0x02,0x08,0xc4,0x0b,0x6e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6f,0x00,0x02,0x07,0x39,0x0b,0x6f,0x00,0x02,0x08,0xc4,0x0b,0x6f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x70,0x00,0x02, -0x07,0x39,0x0b,0x70,0x00,0x02,0x08,0xc4,0x0b,0x70,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x71,0x00,0x02,0x07,0x39,0x0b,0x71,0x00,0x02,0x08,0xc4,0x0b,0x71,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x72,0x00,0x02,0x07,0x39,0x0b,0x72,0x00,0x02,0x08,0xc4,0x0b,0x72,0x00,0x02, -0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x73,0x00,0x02,0x07,0x39,0x0b,0x73,0x00,0x02,0x08,0xc4,0x0b,0x73,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x74,0x00,0x02,0x07,0x39,0x0b,0x74,0x00,0x02,0x08,0xc4,0x0b,0x74,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x75, -0x00,0x02,0x07,0x39,0x0b,0x75,0x00,0x02,0x08,0xc4,0x0b,0x75,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x76,0x00,0x02,0x07,0x39,0x0b,0x76,0x00,0x02,0x08,0xc4,0x0b,0x76,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x77,0x00,0x02,0x07,0x39,0x0b,0x77,0x00,0x02,0x08,0xc4,0x0b,0x77, -0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x78,0x00,0x02,0x07,0x39,0x0b,0x78,0x00,0x02,0x08,0xc4,0x0b,0x78,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x79,0x00,0x02,0x07,0x39,0x0b,0x79,0x00,0x02,0x08,0xc4,0x0b,0x79,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, -0x0b,0x7a,0x00,0x02,0x07,0x39,0x0b,0x7a,0x00,0x02,0x08,0xc4,0x0b,0x7a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7b,0x00,0x02,0x07,0x39,0x0b,0x7b,0x00,0x02,0x08,0xc4,0x0b,0x7b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7c,0x00,0x02,0x07,0x39,0x0b,0x7c,0x00,0x02,0x08,0xc4, -0x0b,0x7c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7d,0x00,0x02,0x07,0x39,0x0b,0x7d,0x00,0x02,0x08,0xc4,0x0b,0x7d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7e,0x00,0x02,0x07,0x39,0x0b,0x7e,0x00,0x02,0x08,0xc4,0x0b,0x7e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e, -0x00,0x14,0x0b,0x7f,0x00,0x02,0x07,0x39,0x0b,0x7f,0x00,0x02,0x08,0xc4,0x0b,0x7f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x80,0x00,0x02,0x07,0x39,0x0b,0x80,0x00,0x02,0x08,0xc4,0x0b,0x80,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x81,0x00,0x02,0x07,0x39,0x0b,0x81,0x00,0x02, -0x08,0xc4,0x0b,0x81,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x82,0x00,0x02,0x07,0x39,0x0b,0x82,0x00,0x02,0x08,0xc4,0x0b,0x82,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x83,0x00,0x02,0x07,0x39,0x0b,0x83,0x00,0x02,0x08,0xc4,0x0b,0x83,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08, -0x00,0x0e,0x00,0x14,0x0b,0x84,0x00,0x02,0x07,0x39,0x0b,0x84,0x00,0x02,0x08,0xc4,0x0b,0x84,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x85,0x00,0x02,0x07,0x39,0x0b,0x85,0x00,0x02,0x08,0xc4,0x0b,0x85,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x88,0x00,0x02,0x07,0x39,0x0b,0x88, -0x00,0x02,0x08,0xc4,0x0b,0x88,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x89,0x00,0x02,0x07,0x39,0x0b,0x89,0x00,0x02,0x08,0xc4,0x0b,0x89,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8a,0x00,0x02,0x07,0x39,0x0b,0x8a,0x00,0x02,0x08,0xc4,0x0b,0x8a,0x00,0x02,0x08,0xc3,0x00,0x03, -0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8b,0x00,0x02,0x07,0x39,0x0b,0x8b,0x00,0x02,0x08,0xc4,0x0b,0x8b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8c,0x00,0x02,0x07,0x39,0x0b,0x8c,0x00,0x02,0x08,0xc4,0x0b,0x8c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8d,0x00,0x02,0x07,0x39, -0x0b,0x8d,0x00,0x02,0x08,0xc4,0x0b,0x8d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8e,0x00,0x02,0x07,0x39,0x0b,0x8e,0x00,0x02,0x08,0xc4,0x0b,0x8e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8f,0x00,0x02,0x07,0x39,0x0b,0x8f,0x00,0x02,0x08,0xc4,0x0b,0x8f,0x00,0x02,0x08,0xc3, -0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x90,0x00,0x02,0x07,0x39,0x0b,0x90,0x00,0x02,0x08,0xc4,0x0b,0x90,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x91,0x00,0x02,0x07,0x39,0x0b,0x91,0x00,0x02,0x08,0xc4,0x0b,0x91,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x92,0x00,0x02, -0x07,0x39,0x0b,0x92,0x00,0x02,0x08,0xc4,0x0b,0x92,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x93,0x00,0x02,0x07,0x39,0x0b,0x93,0x00,0x02,0x08,0xc4,0x0b,0x93,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x94,0x00,0x02,0x07,0x39,0x0b,0x94,0x00,0x02,0x08,0xc4,0x0b,0x94,0x00,0x02, -0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x95,0x00,0x02,0x07,0x39,0x0b,0x95,0x00,0x02,0x08,0xc4,0x0b,0x95,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x97,0x00,0x02,0x07,0x39,0x0b,0x97,0x00,0x02,0x08,0xc4,0x0b,0x97,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x98, -0x00,0x02,0x07,0x39,0x0b,0x98,0x00,0x02,0x08,0xc4,0x0b,0x98,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x99,0x00,0x02,0x07,0x39,0x0b,0x99,0x00,0x02,0x08,0xc4,0x0b,0x99,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9a,0x00,0x02,0x07,0x39,0x0b,0x9a,0x00,0x02,0x08,0xc4,0x0b,0x9a, -0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9d,0x00,0x02,0x07,0x39,0x0b,0x9d,0x00,0x02,0x08,0xc4,0x0b,0x9d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9e,0x00,0x02,0x07,0x39,0x0b,0x9e,0x00,0x02,0x08,0xc4,0x0b,0x9e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, -0x0b,0x9f,0x00,0x02,0x07,0x39,0x0b,0x9f,0x00,0x02,0x08,0xc4,0x0b,0x9f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa0,0x00,0x02,0x07,0x39,0x0b,0xa0,0x00,0x02,0x08,0xc4,0x0b,0xa0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa1,0x00,0x02,0x07,0x39,0x0b,0xa1,0x00,0x02,0x08,0xc4, -0x0b,0xa1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa2,0x00,0x02,0x07,0x39,0x0b,0xa2,0x00,0x02,0x08,0xc4,0x0b,0xa2,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa3,0x00,0x02,0x07,0x39,0x0b,0xa3,0x00,0x02,0x08,0xc4,0x0b,0xa3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e, -0x00,0x14,0x0b,0xa4,0x00,0x02,0x07,0x39,0x0b,0xa4,0x00,0x02,0x08,0xc4,0x0b,0xa4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa5,0x00,0x02,0x07,0x39,0x0b,0xa5,0x00,0x02,0x08,0xc4,0x0b,0xa5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa6,0x00,0x02,0x07,0x39,0x0b,0xa6,0x00,0x02, -0x08,0xc4,0x0b,0xa6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa7,0x00,0x02,0x07,0x39,0x0b,0xa7,0x00,0x02,0x08,0xc4,0x0b,0xa7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa8,0x00,0x02,0x07,0x39,0x0b,0xa8,0x00,0x02,0x08,0xc4,0x0b,0xa8,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08, -0x00,0x0e,0x00,0x14,0x0b,0xa9,0x00,0x02,0x07,0x39,0x0b,0xa9,0x00,0x02,0x08,0xc4,0x0b,0xa9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xaa,0x00,0x02,0x07,0x39,0x0b,0xaa,0x00,0x02,0x08,0xc4,0x0b,0xaa,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xab,0x00,0x02,0x07,0x39,0x0b,0xab, -0x00,0x02,0x08,0xc4,0x0b,0xab,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xac,0x00,0x02,0x07,0x39,0x0b,0xac,0x00,0x02,0x08,0xc4,0x0b,0xac,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xad,0x00,0x02,0x07,0x39,0x0b,0xad,0x00,0x02,0x08,0xc4,0x0b,0xad,0x00,0x02,0x08,0xc3,0x00,0x03, -0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xae,0x00,0x02,0x07,0x39,0x0b,0xae,0x00,0x02,0x08,0xc4,0x0b,0xae,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xaf,0x00,0x02,0x07,0x39,0x0b,0xaf,0x00,0x02,0x08,0xc4,0x0b,0xaf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb0,0x00,0x02,0x07,0x39, -0x0b,0xb0,0x00,0x02,0x08,0xc4,0x0b,0xb0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb1,0x00,0x02,0x07,0x39,0x0b,0xb1,0x00,0x02,0x08,0xc4,0x0b,0xb1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb2,0x00,0x02,0x07,0x39,0x0b,0xb2,0x00,0x02,0x08,0xc4,0x0b,0xb2,0x00,0x02,0x08,0xc3, -0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb3,0x00,0x02,0x07,0x39,0x0b,0xb3,0x00,0x02,0x08,0xc4,0x0b,0xb3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb4,0x00,0x02,0x07,0x39,0x0b,0xb4,0x00,0x02,0x08,0xc4,0x0b,0xb4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb5,0x00,0x02, -0x07,0x39,0x0b,0xb5,0x00,0x02,0x08,0xc4,0x0b,0xb5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb6,0x00,0x02,0x07,0x39,0x0b,0xb6,0x00,0x02,0x08,0xc4,0x0b,0xb6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb7,0x00,0x02,0x07,0x39,0x0b,0xb7,0x00,0x02,0x08,0xc4,0x0b,0xb7,0x00,0x02, -0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb9,0x00,0x02,0x07,0x39,0x0b,0xb9,0x00,0x02,0x08,0xc4,0x0b,0xb9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xbf,0x00,0x02,0x07,0x39,0x0b,0xbf,0x00,0x02,0x08,0xc4,0x0b,0xbf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc0, -0x00,0x02,0x07,0x39,0x0b,0xc0,0x00,0x02,0x08,0xc4,0x0b,0xc0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc1,0x00,0x02,0x07,0x39,0x0b,0xc1,0x00,0x02,0x08,0xc4,0x0b,0xc1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc2,0x00,0x02,0x07,0x39,0x0b,0xc2,0x00,0x02,0x08,0xc4,0x0b,0xc2, -0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc3,0x00,0x02,0x07,0x39,0x0b,0xc3,0x00,0x02,0x08,0xc4,0x0b,0xc3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc4,0x00,0x02,0x07,0x39,0x0b,0xc4,0x00,0x02,0x08,0xc4,0x0b,0xc4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, -0x0b,0xc5,0x00,0x02,0x07,0x39,0x0b,0xc5,0x00,0x02,0x08,0xc4,0x0b,0xc5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc6,0x00,0x02,0x07,0x39,0x0b,0xc6,0x00,0x02,0x08,0xc4,0x0b,0xc6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc7,0x00,0x02,0x07,0x39,0x0b,0xc7,0x00,0x02,0x08,0xc4, -0x0b,0xc7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc8,0x00,0x02,0x07,0x39,0x0b,0xc8,0x00,0x02,0x08,0xc4,0x0b,0xc8,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc9,0x00,0x02,0x07,0x39,0x0b,0xc9,0x00,0x02,0x08,0xc4,0x0b,0xc9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e, -0x00,0x14,0x0b,0xca,0x00,0x02,0x07,0x39,0x0b,0xca,0x00,0x02,0x08,0xc4,0x0b,0xca,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcb,0x00,0x02,0x07,0x39,0x0b,0xcb,0x00,0x02,0x08,0xc4,0x0b,0xcb,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcc,0x00,0x02,0x07,0x39,0x0b,0xcc,0x00,0x02, -0x08,0xc4,0x0b,0xcc,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcd,0x00,0x02,0x07,0x39,0x0b,0xcd,0x00,0x02,0x08,0xc4,0x0b,0xcd,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xce,0x00,0x02,0x07,0x39,0x0b,0xce,0x00,0x02,0x08,0xc4,0x0b,0xce,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08, -0x00,0x0e,0x00,0x14,0x0b,0xcf,0x00,0x02,0x07,0x39,0x0b,0xcf,0x00,0x02,0x08,0xc4,0x0b,0xcf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd0,0x00,0x02,0x07,0x39,0x0b,0xd0,0x00,0x02,0x08,0xc4,0x0b,0xd0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd1,0x00,0x02,0x07,0x39,0x0b,0xd1, -0x00,0x02,0x08,0xc4,0x0b,0xd1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd2,0x00,0x02,0x07,0x39,0x0b,0xd2,0x00,0x02,0x08,0xc4,0x0b,0xd2,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd3,0x00,0x02,0x07,0x39,0x0b,0xd3,0x00,0x02,0x08,0xc4,0x0b,0xd3,0x00,0x02,0x08,0xc3,0x00,0x03, -0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd4,0x00,0x02,0x07,0x39,0x0b,0xd4,0x00,0x02,0x08,0xc4,0x0b,0xd4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd5,0x00,0x02,0x07,0x39,0x0b,0xd5,0x00,0x02,0x08,0xc4,0x0b,0xd5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd6,0x00,0x02,0x07,0x39, -0x0b,0xd6,0x00,0x02,0x08,0xc4,0x0b,0xd6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd7,0x00,0x02,0x07,0x39,0x0b,0xd7,0x00,0x02,0x08,0xc4,0x0b,0xd7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd8,0x00,0x02,0x07,0x39,0x0b,0xd8,0x00,0x02,0x08,0xc4,0x0b,0xd8,0x00,0x02,0x08,0xc3, -0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd9,0x00,0x02,0x07,0x39,0x0b,0xd9,0x00,0x02,0x08,0xc4,0x0b,0xd9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xda,0x00,0x02,0x07,0x39,0x0b,0xda,0x00,0x02,0x08,0xc4,0x0b,0xda,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdb,0x00,0x02, -0x07,0x39,0x0b,0xdb,0x00,0x02,0x08,0xc4,0x0b,0xdb,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdc,0x00,0x02,0x07,0x39,0x0b,0xdc,0x00,0x02,0x08,0xc4,0x0b,0xdc,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdd,0x00,0x02,0x07,0x39,0x0b,0xdd,0x00,0x02,0x08,0xc4,0x0b,0xdd,0x00,0x02, -0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xe1,0x00,0x02,0x07,0x39,0x0b,0xe1,0x00,0x02,0x08,0xc4,0x0b,0xe1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5c,0x00,0x02,0x07,0x39,0x12,0x5c,0x00,0x02,0x08,0xc4,0x12,0x5c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5d, -0x00,0x02,0x07,0x39,0x12,0x5d,0x00,0x02,0x08,0xc4,0x12,0x5d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5e,0x00,0x02,0x07,0x39,0x12,0x5e,0x00,0x02,0x08,0xc4,0x12,0x5e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5f,0x00,0x02,0x07,0x39,0x12,0x5f,0x00,0x02,0x08,0xc4,0x12,0x5f, -0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x60,0x00,0x02,0x07,0x39,0x12,0x60,0x00,0x02,0x08,0xc4,0x12,0x60,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x61,0x00,0x02,0x07,0x39,0x12,0x61,0x00,0x02,0x08,0xc4,0x12,0x61,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, -0x12,0x62,0x00,0x02,0x07,0x39,0x12,0x62,0x00,0x02,0x08,0xc4,0x12,0x62,0x00,0x02,0x08,0xc3,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a,0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41, -0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd,0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x01,0x00,0xa2,0x00,0x0d,0x00,0x20,0x00,0x2a,0x00,0x34,0x00,0x3e,0x00,0x48,0x00,0x52,0x00,0x5c,0x00,0x66,0x00,0x70,0x00,0x7a,0x00,0x84,0x00,0x8e,0x00,0x98,0x00,0x01,0x00,0x04,0x0b,0x53,0x00,0x02, -0x0b,0x53,0x00,0x01,0x00,0x04,0x0b,0x54,0x00,0x02,0x0b,0x54,0x00,0x01,0x00,0x04,0x0b,0x55,0x00,0x02,0x0b,0x55,0x00,0x01,0x00,0x04,0x0b,0x56,0x00,0x02,0x0b,0x56,0x00,0x01,0x00,0x04,0x0b,0x57,0x00,0x02,0x0b,0x57,0x00,0x01,0x00,0x04,0x0b,0x58,0x00,0x02,0x0b,0x58,0x00,0x01,0x00,0x04,0x0b,0x59,0x00,0x02,0x0b,0x59,0x00,0x01, -0x00,0x04,0x0b,0x5a,0x00,0x02,0x0b,0x5a,0x00,0x01,0x00,0x04,0x0b,0x5b,0x00,0x02,0x0b,0x5b,0x00,0x01,0x00,0x04,0x0b,0x5c,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x04,0x0b,0x5d,0x00,0x02,0x0b,0x5d,0x00,0x01,0x00,0x04,0x0b,0xb9,0x00,0x02,0x0b,0xb9,0x00,0x01,0x00,0x04,0x0b,0xde,0x00,0x02,0x0b,0xde,0x00,0x02,0x00,0x03,0x0b,0x53, -0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x0b,0xde,0x0b,0xde,0x00,0x0c,0x00,0x01,0x01,0x5a,0x00,0x16,0x00,0x32,0x00,0x3c,0x00,0x4e,0x00,0x60,0x00,0x72,0x00,0x84,0x00,0x8e,0x00,0x98,0x00,0xa2,0x00,0xac,0x00,0xb6,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x01,0x0c,0x01,0x16,0x01,0x20,0x01,0x2a, -0x01,0x48,0x00,0x01,0x00,0x04,0x0b,0x9d,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x9e,0x00,0x02,0x0b,0x5e,0x0b,0xb4,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x9f,0x00,0x02,0x0b,0x5e,0x12,0x5f,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa0,0x00,0x02,0x0b,0x5e,0x12,0x60,0x00,0x02, -0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa1,0x00,0x02,0x0b,0x5e,0x12,0x61,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xa2,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa3,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa4,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa5,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04, -0x0b,0xa6,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa7,0x00,0x02,0x0b,0x5e,0x0b,0xb5,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xa8,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa9,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xaa,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xab,0x00,0x02,0x0b,0x5e, -0x00,0x01,0x00,0x04,0x0b,0xac,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xad,0x00,0x02,0x0b,0x5e,0x0b,0xb6,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xae,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xaf,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xb0,0x00,0x02,0x0b,0x5e,0x00,0x03,0x00,0x08,0x00,0x0e, -0x00,0x16,0x0b,0xb1,0x00,0x02,0x0b,0x5e,0x0b,0x99,0x00,0x03,0x0b,0x63,0x0b,0x5e,0x0b,0x9a,0x00,0x03,0x0b,0x64,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xb2,0x00,0x02,0x0b,0x5e,0x12,0x62,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x0b,0x68,0x0b,0x6e,0x00,0x00,0x0b,0x70,0x0b,0x74,0x00,0x07,0x0b,0x76,0x0b,0x76,0x00,0x0c, -0x0b,0x78,0x0b,0x79,0x00,0x0d,0x0b,0x7b,0x0b,0x7c,0x00,0x0f,0x0b,0x7e,0x0b,0x82,0x00,0x11,0x00,0x01,0x00,0x2e,0x00,0x02,0x00,0x0a,0x00,0x1c,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x97,0x00,0x02,0x0b,0x63,0x0b,0x98,0x00,0x02,0x0b,0x64,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x99,0x00,0x02,0x0b,0x63,0x0b,0x9a,0x00,0x02,0x0b,0x64, -0x00,0x01,0x00,0x02,0x0b,0x81,0x0b,0xb1,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0xb3,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0xde,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x38,0x02,0x40,0x00,0x01,0x02,0x46,0x00,0x01,0x00,0x00, -0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x24,0x02,0x2c,0x00,0x02,0x02,0x6c,0x02,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x0e,0x02,0x16,0x00,0x03,0x02,0x56,0x02,0x56,0x02,0x1c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xf6,0x01,0xfe,0x00,0x04,0x02,0x3e,0x02,0x3e, -0x02,0x3e,0x02,0x04,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xdc,0x01,0xe4,0x00,0x02,0x02,0x46,0x02,0x4c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xc6,0x01,0xce,0x00,0x03,0x02,0x0e,0x02,0x30,0x02,0x36,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xae, -0x01,0xb6,0x00,0x04,0x01,0xf6,0x01,0xf6,0x02,0x18,0x02,0x1e,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x94,0x01,0x9c,0x00,0x05,0x01,0xdc,0x01,0xdc,0x01,0xdc,0x01,0xfe,0x02,0x04,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x78,0x01,0x80,0x00,0x01,0x01,0xf8,0x00,0x01,0x00,0x00, -0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x64,0x01,0x6c,0x00,0x02,0x01,0xac,0x01,0xe4,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x4e,0x01,0x56,0x00,0x03,0x01,0x96,0x01,0x96,0x01,0xce,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x36,0x01,0x3e,0x00,0x04,0x01,0x7e,0x01,0x7e, -0x01,0x7e,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x1c,0x01,0x24,0x00,0x02,0x01,0x86,0x01,0xa2,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x06,0x01,0x0e,0x00,0x02,0x01,0x70,0x01,0x92,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xf0,0x00,0xf8, -0x00,0x03,0x01,0x38,0x01,0x5a,0x01,0x76,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0xe0,0x00,0x03,0x01,0x20,0x01,0x42,0x01,0x64,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xc0,0x00,0xc8,0x00,0x04,0x01,0x08,0x01,0x08,0x01,0x2a,0x01,0x46,0x00,0x01,0x00,0x00,0x00,0x78, -0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0xae,0x00,0x04,0x00,0xee,0x00,0xee,0x01,0x10,0x01,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x94,0x00,0x05,0x00,0xd4,0x00,0xd4,0x00,0xd4,0x00,0xf6,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x78, -0x00,0x05,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xda,0x00,0xfc,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x5c,0x00,0x01,0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x48,0x00,0x02,0x00,0xd8,0x00,0xd2,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00, -0x00,0x02,0x00,0x2a,0x00,0x32,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x16,0x00,0x1e,0x00,0x02,0x00,0xae,0x00,0xdc,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x00,0x02,0x0b,0x74,0x0b,0xa8,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69, -0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, -0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02, -0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0xdc,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x1c,0x00,0x02,0x00,0x22,0x00,0x28, -0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x79,0x00,0x01,0x00,0x01,0x0b,0x53,0x00,0x01,0x00,0x01,0x0b,0x7e,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x88,0x00,0x02,0x0b,0x53,0x0b,0x89,0x00,0x02,0x0b,0x5b,0x00,0x01,0x00,0x01,0x0b,0x72, -0x00,0x03,0x00,0x02,0x01,0xcc,0x01,0xe8,0x00,0x01,0x01,0xee,0x00,0x02,0x02,0x1c,0x02,0x56,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0xb4,0x01,0xd0,0x00,0x01,0x01,0xd6,0x00,0x01,0x02,0x54,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x9e,0x02,0x66,0x00,0x01,0x01,0xc0,0x00,0x02,0x01,0xee,0x02,0x28, -0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x86,0x02,0x4e,0x00,0x01,0x01,0xa8,0x00,0x01,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x70,0x02,0x3e,0x00,0x01,0x01,0x92,0x00,0x02,0x01,0xc0,0x01,0xfa,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x58,0x02,0x26,0x00,0x01,0x01,0x7a, -0x00,0x01,0x01,0xf8,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x42,0x02,0x16,0x00,0x01,0x01,0x64,0x00,0x02,0x01,0x92,0x01,0xcc,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x2a,0x01,0xfe,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0xca,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x14,0x01,0xee, -0x00,0x01,0x01,0x36,0x00,0x02,0x01,0x64,0x01,0x9e,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xfc,0x01,0xd6,0x00,0x01,0x01,0x1e,0x00,0x01,0x01,0x9c,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xe6,0x01,0xc6,0x00,0x01,0x01,0x08,0x00,0x02,0x01,0x36,0x01,0x70,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03, -0x00,0x02,0x00,0xce,0x01,0xae,0x00,0x01,0x00,0xf0,0x00,0x01,0x01,0x6e,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xb8,0x01,0x9e,0x00,0x01,0x00,0xda,0x00,0x02,0x01,0x08,0x01,0x42,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xa0,0x01,0x86,0x00,0x01,0x00,0xc2,0x00,0x01,0x01,0x40,0x00,0x01,0x00,0x00, -0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x8a,0x01,0x76,0x00,0x01,0x00,0xac,0x00,0x02,0x00,0xda,0x01,0x14,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x72,0x01,0x5e,0x00,0x01,0x00,0x94,0x00,0x01,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x5c,0x01,0x4e,0x00,0x01,0x00,0x7e,0x00,0x02,0x00,0xac, -0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x44,0x01,0x36,0x00,0x01,0x00,0x66,0x00,0x01,0x00,0xe4,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x2e,0x01,0x26,0x00,0x01,0x00,0x50,0x00,0x02,0x00,0x7e,0x00,0xb8,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x16,0x01,0x0e,0x00,0x01, -0x00,0x38,0x00,0x01,0x00,0xb6,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x02,0x00,0x04,0x0b,0x54,0x0b,0x56,0x00,0x00,0x0b,0x58,0x0b,0x5b,0x00,0x03,0x0b,0x5d,0x0b,0x5d,0x00,0x07,0x0b,0xb9,0x0b,0xb9,0x00,0x08,0x00,0x01,0x00,0x01,0x0b,0x6a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, -0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6b,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x02,0x0b,0x71,0x0b,0x71,0x00,0x04,0x0b,0x7d,0x0b,0x7d,0x00,0x05,0x0b,0x7f,0x0b,0x80,0x00,0x06,0x0b,0x9f, -0x0b,0xa0,0x00,0x08,0x0b,0xa2,0x0b,0xa3,0x00,0x0a,0x0b,0xa5,0x0b,0xa5,0x00,0x0c,0x0b,0xaf,0x0b,0xb0,0x00,0x0d,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x06,0x0b,0x72,0x0b,0x72,0x00,0x00,0x0b,0x77,0x0b,0x77,0x00,0x01,0x0b,0x7b,0x0b,0x7b, -0x00,0x02,0x0b,0x88,0x0b,0x89,0x00,0x03,0x0b,0xa6,0x0b,0xa6,0x00,0x05,0x0b,0xac,0x0b,0xac,0x00,0x06,0x00,0x01,0x00,0x01,0x0b,0x9f,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x71,0x00,0x01,0x00,0x01,0x0b,0xa5,0x00,0x01,0x00,0x01,0x0b,0x78,0x00,0x01,0x00,0x01,0x0b,0xaa,0x00,0x01, -0x00,0x01,0x0b,0x6e,0x00,0x01,0x00,0x01,0x0b,0xa3,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x14,0x00,0x01,0x00,0x54,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b,0x0b,0xb9,0x0b,0xb9,0x00,0x0c, -0x0b,0xbf,0x0b,0xbf,0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x5a,0x0b,0x5a,0x00,0x01,0x0b,0x5f,0x0b,0x5f,0x00,0x02,0x0b,0x67,0x0b,0x67,0x00,0x03,0x0b,0xbf,0x0b,0xbf,0x00,0x04, -0x0b,0xc4,0x0b,0xc4,0x00,0x05,0x0b,0xc9,0x0b,0xc9,0x00,0x06,0x0b,0xd0,0x0b,0xd5,0x00,0x07,0x0b,0xd8,0x0b,0xd8,0x00,0x0d,0x00,0x01,0x00,0x36,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x26,0x00,0x2e,0x00,0x01,0x00,0x04,0x0b,0x67,0x00,0x01,0x00,0x02,0x00,0x06,0x00,0x0c,0x12,0x5d,0x00,0x02,0x04,0x67,0x12,0x5c,0x00,0x01,0x00,0x01, -0x00,0x04,0x12,0x5d,0x00,0x01,0x00,0x01,0x00,0x04,0x12,0x5c,0x00,0x01,0x00,0x02,0x00,0x03,0x02,0x45,0x02,0x45,0x00,0x00,0x04,0x67,0x04,0x68,0x00,0x01,0x0b,0x66,0x0b,0x66,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf6,0x00,0x04,0x01,0x3c,0x01,0x76,0x01,0x76,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00, -0x00,0x01,0x00,0xde,0x00,0x04,0x01,0x24,0x01,0x5e,0x01,0x5e,0x01,0xa4,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xc6,0x00,0x03,0x01,0x0c,0x01,0x92,0x01,0x86,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xb0,0x00,0x03,0x00,0xf6,0x01,0x7c,0x01,0x76,0x00,0x01,0x00,0x00,0x00,0x7c, -0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x9a,0x00,0x03,0x00,0xe0,0x01,0x6c,0x01,0x5a,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x84,0x00,0x03,0x00,0xca,0x01,0x56,0x01,0x4a,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x03,0x00,0xb4,0x01,0x46,0x01,0x2e,0x00,0x01,0x00,0x00, -0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x58,0x00,0x03,0x00,0x9e,0x01,0x30,0x01,0x1e,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x03,0x00,0x88,0x01,0x20,0x01,0x26,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2c,0x00,0x03,0x00,0x72,0x01,0x0a,0x01,0x16,0x00,0x01, -0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x03,0x00,0x5c,0x00,0xf4,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a, -0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41,0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd,0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f, -0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b,0x0b,0xb9,0x0b,0xb9,0x00,0x0c,0x0b,0xbf,0x0b,0xbf, -0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x01,0x00,0x01,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0xc8,0x00,0x01,0x00,0x01,0x12,0x5b,0x00,0x01,0x00,0x01,0x12,0x59,0x00,0x01,0x00,0x01,0x12,0x5a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x01, -0x00,0x01,0x0b,0x55,0x00,0x01,0x00,0x01,0x0b,0x54,0x00,0x01,0x00,0x01,0x0b,0x56,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x2a,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x16,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x01,0x00,0x01,0x08,0xef, -0x00,0x01,0x00,0x01,0x0e,0x2d,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x2f,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14, -0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a, -0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x12,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x76,0x00,0x7c,0x00,0x82,0x00,0x68,0x00,0x88,0x00,0x76,0x00,0x90,0x00,0x68,0x00,0x96,0x00,0x9c,0x00,0x76,0x00,0xa2,0x00,0xa8,0x00,0x68,0x00,0xae,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x12,0x00,0x32, -0x00,0x38,0x00,0x3e,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x38,0x00,0x58,0x00,0x46,0x00,0x60,0x00,0x38,0x00,0x66,0x00,0x6c,0x00,0x46,0x00,0x72,0x00,0x78,0x00,0x38,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x02,0x08,0xf7,0x09,0x4b,0x00,0x01, -0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xe2,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x01,0x00,0x01,0x08,0xf3,0x00,0x01,0x00,0x01,0x09,0x29,0x00,0x01,0x00,0x01,0x08,0xd4,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x02,0x00,0x13, -0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69, -0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x0f,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x6a, -0x00,0x70,0x00,0x6a,0x00,0x76,0x00,0x5c,0x00,0x7c,0x00,0x82,0x00,0x6a,0x00,0x8a,0x00,0x90,0x00,0x5c,0x00,0x96,0x00,0x01,0x00,0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0f,0x00,0x2c,0x00,0x32,0x00,0x38,0x00,0x40,0x00,0x46,0x00,0x40,0x00,0x4c,0x00,0x32,0x00,0x52,0x00,0x58,0x00,0x40,0x00,0x60,0x00,0x66,0x00,0x32,0x00,0x6c, -0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x02,0x08,0xf7,0x09,0x4b,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x0a,0x63,0x00,0x01,0x00,0x01,0x08,0xe2,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x01,0x00,0x01, -0x09,0x29,0x00,0x01,0x00,0x01,0x08,0xd4,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f, -0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c, -0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x3a,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x1e,0x00,0x24,0x00,0x2a,0x00,0x1e,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x01, -0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x01,0x09,0x59,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x01,0x08,0xc7,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09, -0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c, -0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x36,0x00,0x48,0x00,0x4e,0x00,0x54,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07, -0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x1c,0x00,0x2e,0x00,0x34,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x01,0x09,0x59,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x08,0xfb,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x02,0x00,0x13, -0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69, -0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x16,0x00,0x72,0x00,0x78,0x00,0x7e,0x00,0x84, -0x00,0x8a,0x00,0x90,0x00,0x96,0x00,0x9c,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0xa2,0x00,0xa8,0x00,0xae,0x00,0xb4,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0xa2,0x00,0xa8,0x00,0xba,0x00,0x7e,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x16,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64, -0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x6a,0x00,0x70,0x00,0x76,0x00,0x7c,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x6a,0x00,0x70,0x00,0x82,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x82,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x01,0x0e,0x32,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01, -0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x01,0x08,0xf3,0x00,0x01,0x00,0x01,0x0b,0x0c,0x00,0x01,0x00,0x01,0x08,0xd0,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x59,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37, -0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a, -0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x13,0x00,0x66,0x00,0x6c,0x00,0x72,0x00,0x78,0x00,0x7e,0x00,0x78,0x00,0x84,0x00,0x8a,0x00,0x90, -0x00,0x96,0x00,0x9c,0x00,0xa2,0x00,0x78,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0x96,0x00,0xa8,0x00,0x72,0x00,0x01,0x00,0xae,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x13,0x00,0x34,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x46,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64,0x00,0x6a,0x00,0x70,0x00,0x46,0x00,0x52,0x00,0x58,0x00,0x5e, -0x00,0x64,0x00,0x76,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x01,0x0e,0x32,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x0a,0x63,0x00,0x01,0x00,0x01,0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x01,0x0b,0x0c,0x00,0x01, -0x00,0x01,0x08,0xd0,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x59,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16, -0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f, -0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x08,0x00,0x01,0x0e,0x5c,0x00,0x01,0x00,0x01,0x09,0x28,0x00,0x02,0x00,0x32,0x00,0x16,0x14,0x88,0x14,0x89,0x14,0x8a,0x14,0x8b,0x14,0x8c,0x14,0x8d,0x14,0x8e,0x14,0x8f,0x14,0x90,0x14,0x91,0x14,0x88,0x14,0x89,0x14,0x8a,0x14,0x8b,0x14,0x92,0x14,0x93, -0x14,0x94,0x14,0x8f,0x14,0x90,0x14,0x91,0x14,0x95,0x14,0x96,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x32,0x00,0x16,0x14,0x9e,0x14,0x9f,0x14,0xa0,0x14,0xa1,0x14,0xa2,0x14,0xa3,0x14,0xa4,0x14,0xa5,0x14,0xa6,0x14,0xa7,0x14,0x9e,0x14,0x9f, -0x14,0xa0,0x14,0xa1,0x14,0xa8,0x14,0xa9,0x14,0xaa,0x14,0xa5,0x14,0xa6,0x14,0xa7,0x14,0xab,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c, -0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a,0x14,0xa2,0x00,0x02,0x14,0x9a,0x14,0xa3, -0x00,0x02,0x14,0x9a,0x14,0xa4,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a,0x14,0xa8,0x00,0x02,0x14,0x9a,0x14,0xa9,0x00,0x02,0x14,0x9a, -0x14,0xaa,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0xab,0x00,0x02,0x14,0x9a,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38, -0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1, -0x00,0x02,0x14,0x9a,0x14,0xa2,0x00,0x02,0x14,0x9a,0x14,0xa3,0x00,0x02,0x14,0x9a,0x14,0xa4,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a, -0x14,0xa8,0x00,0x02,0x14,0x9a,0x14,0xa9,0x00,0x02,0x14,0x9a,0x14,0xaa,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0xab,0x00,0x02,0x14,0x9a,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d, -0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x2b,0x08,0xd7,0x00,0x02,0x14,0x2b,0x08,0xd8, -0x00,0x02,0x14,0x2b,0x08,0xd9,0x00,0x02,0x14,0x2b,0x08,0xda,0x00,0x02,0x14,0x2b,0x08,0xdb,0x00,0x02,0x14,0x2b,0x08,0xdc,0x00,0x02,0x14,0x2b,0x08,0xdd,0x00,0x02,0x14,0x2b,0x08,0xde,0x00,0x02,0x14,0x2b,0x08,0xdf,0x00,0x02,0x14,0x2b,0x08,0xe0,0x00,0x02,0x14,0x2b,0x08,0xd7,0x00,0x02,0x14,0x2b,0x08,0xd8,0x00,0x02,0x14,0x2b, -0x08,0xd9,0x00,0x02,0x14,0x2b,0x08,0xda,0x00,0x02,0x14,0x2b,0x09,0x53,0x00,0x02,0x14,0x2b,0x09,0x54,0x00,0x02,0x14,0x2b,0x09,0x55,0x00,0x02,0x14,0x2b,0x08,0xde,0x00,0x02,0x14,0x2b,0x08,0xdf,0x00,0x02,0x14,0x2b,0x08,0xe0,0x00,0x02,0x14,0x2b,0x0a,0x3c,0x00,0x02,0x14,0x2b,0x0a,0x3d,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0, -0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x02,0x14,0x99,0x0a,0x44,0x00,0x02,0x14,0x9c,0x0a,0x47,0x00,0x02,0x14,0x9d,0x13,0x45,0x00,0x02,0x00,0x03,0x0a,0x44,0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45,0x13,0x45, -0x00,0x02,0x00,0x02,0x00,0x1e,0x00,0x0c,0x0f,0x8c,0x0f,0x8d,0x0f,0x8e,0x0f,0x90,0x0f,0x92,0x0f,0x94,0x0f,0x8f,0x0f,0x91,0x0f,0x93,0x0f,0x95,0x0f,0x96,0x0f,0x97,0x00,0x02,0x00,0x08,0x08,0xee,0x08,0xee,0x00,0x00,0x09,0x3f,0x09,0x3f,0x00,0x01,0x09,0xec,0x09,0xec,0x00,0x02,0x09,0xee,0x09,0xee,0x00,0x03,0x09,0xf0,0x09,0xf0, -0x00,0x04,0x09,0xf2,0x09,0xf2,0x00,0x05,0x0a,0x5f,0x0a,0x62,0x00,0x06,0x0a,0xb2,0x0a,0xb3,0x00,0x0a,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0f,0x65,0x0f,0x63,0x0f,0x62,0x0f,0x64,0x0f,0x66,0x0f,0x67,0x0f,0x68,0x0f,0x69,0x0f,0x6a,0x0f,0x6b,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca,0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83, -0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x02,0x00,0x46,0x00,0x20,0x0f,0x6c,0x0f,0x6e,0x0f,0x82,0x0f,0x84,0x0f,0x70,0x0f,0x72,0x0f,0x74,0x0f,0x86,0x0f,0x88,0x0f,0x76,0x0f,0x8a,0x0f,0x78,0x0f,0x7a,0x0f,0x6d,0x0f,0x6f, -0x0f,0x83,0x0f,0x85,0x0f,0x71,0x0f,0x73,0x0f,0x75,0x0f,0x87,0x0f,0x89,0x0f,0x77,0x0f,0x8b,0x0f,0x79,0x0f,0x7b,0x0f,0x7c,0x0f,0x7d,0x0f,0x7e,0x0f,0x7f,0x0f,0x80,0x0f,0x81,0x00,0x02,0x00,0x1b,0x08,0xd4,0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe1,0x00,0x03,0x09,0xba,0x09,0xba,0x00,0x04,0x09,0xbc,0x09,0xbc,0x00,0x05,0x09,0xbe, -0x09,0xbe,0x00,0x06,0x09,0xc0,0x09,0xc0,0x00,0x07,0x09,0xc2,0x09,0xc2,0x00,0x08,0x0a,0x25,0x0a,0x25,0x00,0x09,0x0a,0x27,0x0a,0x27,0x00,0x0a,0x0a,0x8a,0x0a,0x8a,0x00,0x0b,0x0a,0xb7,0x0a,0xb7,0x00,0x0c,0x0e,0x32,0x0e,0x32,0x00,0x0d,0x0e,0x34,0x0e,0x34,0x00,0x0e,0x0e,0x36,0x0e,0x36,0x00,0x0f,0x0e,0x38,0x0e,0x38,0x00,0x10, -0x0e,0x99,0x0e,0x99,0x00,0x11,0x0e,0x9b,0x0e,0x9b,0x00,0x12,0x0e,0x9d,0x0e,0x9d,0x00,0x13,0x0e,0x9f,0x0e,0x9f,0x00,0x14,0x0e,0xa1,0x0e,0xa1,0x00,0x15,0x0e,0xed,0x0e,0xed,0x00,0x16,0x0e,0xef,0x0e,0xef,0x00,0x17,0x0f,0x04,0x0f,0x04,0x00,0x18,0x0f,0x15,0x0f,0x15,0x00,0x19,0x0f,0x20,0x0f,0x21,0x00,0x1a,0x0f,0x46,0x0f,0x47, -0x00,0x1c,0x0f,0x4a,0x0f,0x4b,0x00,0x1e,0x00,0x02,0x00,0x4a,0x00,0x22,0x0f,0xac,0x0f,0xab,0x0f,0xa7,0x0f,0xbd,0x0f,0xad,0x0f,0xae,0x0f,0xaf,0x0f,0xbe,0x0f,0xb0,0x0f,0xa2,0x0f,0xa5,0x0f,0x98,0x0f,0x99,0x0f,0xc3,0x0f,0x9a,0x0f,0x9b,0x0f,0x9c,0x0f,0x9d,0x0f,0x9e,0x0f,0x9f,0x0f,0xa0,0x0f,0xa1,0x0f,0xa4,0x0f,0xbf,0x0f,0xa8, -0x0f,0xa9,0x0f,0xaa,0x0f,0xa3,0x0f,0xa6,0x0f,0xb1,0x0f,0xb2,0x0f,0xb3,0x14,0xad,0x14,0xae,0x00,0x02,0x00,0x16,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b,0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06, -0x0a,0x0c,0x0a,0x0c,0x00,0x07,0x0a,0x0e,0x0a,0x0e,0x00,0x08,0x0a,0x57,0x0a,0x57,0x00,0x09,0x0a,0xb5,0x0a,0xb5,0x00,0x0a,0x0b,0x0c,0x0b,0x17,0x00,0x0b,0x0e,0x21,0x0e,0x21,0x00,0x17,0x0e,0x48,0x0e,0x48,0x00,0x18,0x0e,0x4c,0x0e,0x4c,0x00,0x19,0x0e,0x50,0x0e,0x50,0x00,0x1a,0x0f,0x02,0x0f,0x02,0x00,0x1b,0x0f,0x23,0x0f,0x23, -0x00,0x1c,0x0f,0x2d,0x0f,0x2d,0x00,0x1d,0x0f,0x31,0x0f,0x31,0x00,0x1e,0x0f,0x35,0x0f,0x35,0x00,0x1f,0x14,0x7d,0x14,0x7e,0x00,0x20,0x00,0x02,0x00,0x0e,0x00,0x04,0x0f,0xb6,0x0f,0xb8,0x0f,0xba,0x0f,0xbc,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f, -0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x0e,0x00,0x04,0x0f,0xb5,0x0f,0xb7,0x0f,0xb9,0x0f,0xbb,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x0e,0x00,0x04,0x00,0xd6,0x06,0xac,0x11,0x8c,0x06,0xad,0x00,0x02,0x00,0x03, -0x00,0x4c,0x00,0x4d,0x00,0x00,0x01,0x62,0x01,0x62,0x00,0x02,0x05,0x6d,0x05,0x6d,0x00,0x03,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xe1,0x0c,0xe2,0x0c,0xe3,0x0c,0xe4,0x0c,0xe5,0x0c,0xe6,0x0c,0xe7,0x0c,0xe8,0x0c,0xe9,0x0c,0xea,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0x8d,0x00,0x01, -0x00,0x01,0x0b,0x7a,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0xd6,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02,0x00,0x08,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x1e,0x00,0x02,0x00,0x0a,0x00,0x14,0x00,0x01,0x00,0x04,0x0b,0x8a,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x04,0x0b,0x8b,0x00,0x02,0x0b,0x5c,0x00,0x01, -0x00,0x02,0x0b,0x74,0x0b,0xa8,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0x57,0x00,0x02,0x0b,0x57,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x66,0x00,0x0c,0x00,0x1e,0x00,0x24,0x00,0x2a,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x48,0x00,0x4e,0x00,0x54,0x00,0x5a,0x00,0x60,0x00,0x02,0x0b,0x5f, -0x0b,0x07,0x00,0x02,0x0b,0x67,0x0b,0x07,0x00,0x02,0x0b,0xbf,0x0b,0x07,0x00,0x02,0x0b,0xc4,0x0b,0x07,0x00,0x02,0x0b,0xc9,0x0b,0x07,0x00,0x02,0x0b,0xd0,0x0b,0x07,0x00,0x02,0x0b,0xd1,0x0b,0x07,0x00,0x02,0x0b,0xd2,0x0b,0x07,0x00,0x02,0x0b,0xd3,0x0b,0x07,0x00,0x02,0x0b,0xd4,0x0b,0x07,0x00,0x02,0x0b,0xd5,0x0b,0x07,0x00,0x02, -0x0b,0xd8,0x0b,0x07,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x76,0x00,0x0e,0x00,0x22,0x00,0x28,0x00,0x2e,0x00,0x34, -0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64,0x00,0x6a,0x00,0x70,0x00,0x02,0x0b,0x53,0x11,0x86,0x00,0x02,0x0b,0x5a,0x11,0x86,0x00,0x02,0x0b,0x5f,0x11,0x86,0x00,0x02,0x0b,0x67,0x11,0x86,0x00,0x02,0x0b,0xbf,0x11,0x86,0x00,0x02,0x0b,0xc4,0x11,0x86,0x00,0x02,0x0b,0xc9,0x11,0x86,0x00,0x02, -0x0b,0xd0,0x11,0x86,0x00,0x02,0x0b,0xd1,0x11,0x86,0x00,0x02,0x0b,0xd2,0x11,0x86,0x00,0x02,0x0b,0xd3,0x11,0x86,0x00,0x02,0x0b,0xd4,0x11,0x86,0x00,0x02,0x0b,0xd5,0x11,0x86,0x00,0x02,0x0b,0xd8,0x11,0x86,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x5a,0x0b,0x5a,0x00,0x01,0x0b,0x5f,0x0b,0x5f,0x00,0x02,0x0b,0x67, -0x0b,0x67,0x00,0x03,0x0b,0xbf,0x0b,0xbf,0x00,0x04,0x0b,0xc4,0x0b,0xc4,0x00,0x05,0x0b,0xc9,0x0b,0xc9,0x00,0x06,0x0b,0xd0,0x0b,0xd5,0x00,0x07,0x0b,0xd8,0x0b,0xd8,0x00,0x0d,0x00,0x01,0x04,0x26,0x00,0x84,0x01,0x0e,0x01,0x14,0x01,0x1a,0x01,0x20,0x01,0x26,0x01,0x2c,0x01,0x32,0x01,0x38,0x01,0x3e,0x01,0x44,0x01,0x4a,0x01,0x50, -0x01,0x56,0x01,0x5c,0x01,0x62,0x01,0x68,0x01,0x6e,0x01,0x74,0x01,0x7a,0x01,0x80,0x01,0x86,0x01,0x8c,0x01,0x92,0x01,0x98,0x01,0x9e,0x01,0xa4,0x01,0xaa,0x01,0xb0,0x01,0xb6,0x01,0xbc,0x01,0xc2,0x01,0xc8,0x01,0xce,0x01,0xd4,0x01,0xda,0x01,0xe0,0x01,0xe6,0x01,0xec,0x01,0xf2,0x01,0xf8,0x01,0xfe,0x02,0x04,0x02,0x0a,0x02,0x10, -0x02,0x16,0x02,0x1c,0x02,0x22,0x02,0x28,0x02,0x2e,0x02,0x34,0x02,0x3a,0x02,0x40,0x02,0x46,0x02,0x4c,0x02,0x52,0x02,0x58,0x02,0x5e,0x02,0x64,0x02,0x6a,0x02,0x70,0x02,0x76,0x02,0x7c,0x02,0x82,0x02,0x88,0x02,0x8e,0x02,0x94,0x02,0x9a,0x02,0xa0,0x02,0xa6,0x02,0xac,0x02,0xb2,0x02,0xb8,0x02,0xbe,0x02,0xc4,0x02,0xca,0x02,0xd0, -0x02,0xd6,0x02,0xdc,0x02,0xe2,0x02,0xe8,0x02,0xee,0x02,0xf4,0x02,0xfa,0x03,0x00,0x03,0x06,0x03,0x0c,0x03,0x12,0x03,0x18,0x03,0x1e,0x03,0x24,0x03,0x2a,0x03,0x30,0x03,0x36,0x03,0x3c,0x03,0x42,0x03,0x48,0x03,0x4e,0x03,0x54,0x03,0x5a,0x03,0x60,0x03,0x66,0x03,0x6c,0x03,0x72,0x03,0x78,0x03,0x7e,0x03,0x84,0x03,0x8a,0x03,0x90, -0x03,0x96,0x03,0x9c,0x03,0xa2,0x03,0xa8,0x03,0xae,0x03,0xb4,0x03,0xba,0x03,0xc0,0x03,0xc6,0x03,0xcc,0x03,0xd2,0x03,0xd8,0x03,0xde,0x03,0xe4,0x03,0xea,0x03,0xf0,0x03,0xf6,0x03,0xfc,0x04,0x02,0x04,0x08,0x04,0x0e,0x04,0x14,0x04,0x1a,0x04,0x20,0x00,0x02,0x0a,0x43,0x11,0x86,0x00,0x02,0x0b,0x53,0x11,0x86,0x00,0x02,0x0b,0x54, -0x11,0x86,0x00,0x02,0x0b,0x55,0x11,0x86,0x00,0x02,0x0b,0x56,0x11,0x86,0x00,0x02,0x0b,0x57,0x11,0x86,0x00,0x02,0x0b,0x58,0x11,0x86,0x00,0x02,0x0b,0x59,0x11,0x86,0x00,0x02,0x0b,0x5a,0x11,0x86,0x00,0x02,0x0b,0x5b,0x11,0x86,0x00,0x02,0x0b,0x5c,0x11,0x86,0x00,0x02,0x0b,0x5d,0x11,0x86,0x00,0x02,0x0b,0x5e,0x11,0x86,0x00,0x02, -0x0b,0x5f,0x11,0x86,0x00,0x02,0x0b,0x61,0x11,0x86,0x00,0x02,0x0b,0x66,0x11,0x86,0x00,0x02,0x0b,0x67,0x11,0x86,0x00,0x02,0x0b,0x68,0x11,0x86,0x00,0x02,0x0b,0x69,0x11,0x86,0x00,0x02,0x0b,0x6a,0x11,0x86,0x00,0x02,0x0b,0x6b,0x11,0x86,0x00,0x02,0x0b,0x6c,0x11,0x86,0x00,0x02,0x0b,0x6d,0x11,0x86,0x00,0x02,0x0b,0x6e,0x11,0x86, -0x00,0x02,0x0b,0x6f,0x11,0x86,0x00,0x02,0x0b,0x70,0x11,0x86,0x00,0x02,0x0b,0x71,0x11,0x86,0x00,0x02,0x0b,0x72,0x11,0x86,0x00,0x02,0x0b,0x73,0x11,0x86,0x00,0x02,0x0b,0x74,0x11,0x86,0x00,0x02,0x0b,0x75,0x11,0x86,0x00,0x02,0x0b,0x76,0x11,0x86,0x00,0x02,0x0b,0x77,0x11,0x86,0x00,0x02,0x0b,0x78,0x11,0x86,0x00,0x02,0x0b,0x79, -0x11,0x86,0x00,0x02,0x0b,0x7a,0x11,0x86,0x00,0x02,0x0b,0x7b,0x11,0x86,0x00,0x02,0x0b,0x7c,0x11,0x86,0x00,0x02,0x0b,0x7d,0x11,0x86,0x00,0x02,0x0b,0x7e,0x11,0x86,0x00,0x02,0x0b,0x7f,0x11,0x86,0x00,0x02,0x0b,0x80,0x11,0x86,0x00,0x02,0x0b,0x81,0x11,0x86,0x00,0x02,0x0b,0x82,0x11,0x86,0x00,0x02,0x0b,0x83,0x11,0x86,0x00,0x02, -0x0b,0x84,0x11,0x86,0x00,0x02,0x0b,0x85,0x11,0x86,0x00,0x02,0x0b,0x88,0x11,0x86,0x00,0x02,0x0b,0x89,0x11,0x86,0x00,0x02,0x0b,0x8a,0x11,0x86,0x00,0x02,0x0b,0x8b,0x11,0x86,0x00,0x02,0x0b,0x8c,0x11,0x86,0x00,0x02,0x0b,0x8d,0x11,0x86,0x00,0x02,0x0b,0x8e,0x11,0x86,0x00,0x02,0x0b,0x8f,0x11,0x86,0x00,0x02,0x0b,0x90,0x11,0x86, -0x00,0x02,0x0b,0x91,0x11,0x86,0x00,0x02,0x0b,0x92,0x11,0x86,0x00,0x02,0x0b,0x93,0x11,0x86,0x00,0x02,0x0b,0x94,0x11,0x86,0x00,0x02,0x0b,0x95,0x11,0x86,0x00,0x02,0x0b,0x97,0x11,0x86,0x00,0x02,0x0b,0x98,0x11,0x86,0x00,0x02,0x0b,0x99,0x11,0x86,0x00,0x02,0x0b,0x9a,0x11,0x86,0x00,0x02,0x0b,0x9d,0x11,0x86,0x00,0x02,0x0b,0x9e, -0x11,0x86,0x00,0x02,0x0b,0x9f,0x11,0x86,0x00,0x02,0x0b,0xa0,0x11,0x86,0x00,0x02,0x0b,0xa1,0x11,0x86,0x00,0x02,0x0b,0xa2,0x11,0x86,0x00,0x02,0x0b,0xa3,0x11,0x86,0x00,0x02,0x0b,0xa4,0x11,0x86,0x00,0x02,0x0b,0xa5,0x11,0x86,0x00,0x02,0x0b,0xa6,0x11,0x86,0x00,0x02,0x0b,0xa7,0x11,0x86,0x00,0x02,0x0b,0xa8,0x11,0x86,0x00,0x02, -0x0b,0xa9,0x11,0x86,0x00,0x02,0x0b,0xaa,0x11,0x86,0x00,0x02,0x0b,0xab,0x11,0x86,0x00,0x02,0x0b,0xac,0x11,0x86,0x00,0x02,0x0b,0xad,0x11,0x86,0x00,0x02,0x0b,0xae,0x11,0x86,0x00,0x02,0x0b,0xaf,0x11,0x86,0x00,0x02,0x0b,0xb0,0x11,0x86,0x00,0x02,0x0b,0xb1,0x11,0x86,0x00,0x02,0x0b,0xb2,0x11,0x86,0x00,0x02,0x0b,0xb3,0x11,0x86, -0x00,0x02,0x0b,0xb4,0x11,0x86,0x00,0x02,0x0b,0xb5,0x11,0x86,0x00,0x02,0x0b,0xb6,0x11,0x86,0x00,0x02,0x0b,0xb7,0x11,0x86,0x00,0x02,0x0b,0xb9,0x11,0x86,0x00,0x02,0x0b,0xbf,0x11,0x86,0x00,0x02,0x0b,0xc0,0x11,0x86,0x00,0x02,0x0b,0xc1,0x11,0x86,0x00,0x02,0x0b,0xc2,0x11,0x86,0x00,0x02,0x0b,0xc3,0x11,0x86,0x00,0x02,0x0b,0xc4, -0x11,0x86,0x00,0x02,0x0b,0xc5,0x11,0x86,0x00,0x02,0x0b,0xc6,0x11,0x86,0x00,0x02,0x0b,0xc7,0x11,0x86,0x00,0x02,0x0b,0xc8,0x11,0x86,0x00,0x02,0x0b,0xc9,0x11,0x86,0x00,0x02,0x0b,0xca,0x11,0x86,0x00,0x02,0x0b,0xcb,0x11,0x86,0x00,0x02,0x0b,0xcc,0x11,0x86,0x00,0x02,0x0b,0xcd,0x11,0x86,0x00,0x02,0x0b,0xce,0x11,0x86,0x00,0x02, -0x0b,0xcf,0x11,0x86,0x00,0x02,0x0b,0xd0,0x11,0x86,0x00,0x02,0x0b,0xd1,0x11,0x86,0x00,0x02,0x0b,0xd2,0x11,0x86,0x00,0x02,0x0b,0xd3,0x11,0x86,0x00,0x02,0x0b,0xd4,0x11,0x86,0x00,0x02,0x0b,0xd5,0x11,0x86,0x00,0x02,0x0b,0xd6,0x11,0x86,0x00,0x02,0x0b,0xd7,0x11,0x86,0x00,0x02,0x0b,0xd8,0x11,0x86,0x00,0x02,0x0b,0xd9,0x11,0x86, -0x00,0x02,0x0b,0xda,0x11,0x86,0x00,0x02,0x0b,0xdb,0x11,0x86,0x00,0x02,0x0b,0xdc,0x11,0x86,0x00,0x02,0x0b,0xdd,0x11,0x86,0x00,0x02,0x0b,0xe1,0x11,0x86,0x00,0x02,0x12,0x5c,0x11,0x86,0x00,0x02,0x12,0x5d,0x11,0x86,0x00,0x02,0x12,0x5e,0x11,0x86,0x00,0x02,0x12,0x5f,0x11,0x86,0x00,0x02,0x12,0x60,0x11,0x86,0x00,0x02,0x12,0x61, -0x11,0x86,0x00,0x02,0x12,0x62,0x11,0x86,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a,0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41,0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd, -0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xef,0x00,0x04,0x0e,0x2d,0x0e,0x58,0x0e,0x2f,0x00,0x01,0x00,0x01,0x08,0xef,0x00,0x01,0x00,0x82,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x2e,0x00,0x54,0x13,0xf0,0x00,0x12,0x09,0x3f, -0x08,0xf7,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x12,0x09,0x3f,0x09,0x4b,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29, -0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x12,0x09,0x3f,0x09,0x4b,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x09,0x60,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x28, -0x00,0x48,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x08,0xf7,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x09,0x4b,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f, -0x0e,0x57,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x09,0x4b,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x09,0x60,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x32,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x18,0x13,0xf1,0x00,0x08,0x09,0x59,0x00,0x03,0x08,0xce, -0x09,0x3f,0x08,0xc7,0x08,0xee,0x08,0xf3,0x13,0xf1,0x00,0x08,0x09,0x59,0x00,0x03,0x08,0xce,0x09,0x3f,0x08,0xc7,0x08,0xee,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x2e,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x16,0x13,0xf1,0x00,0x07,0x09,0x59,0x00,0x03,0x08,0xce,0x08,0xfb,0x08,0xee,0x08,0xf3,0x13,0xf1, -0x00,0x07,0x09,0x59,0x00,0x03,0x08,0xce,0x08,0xfb,0x08,0xee,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x3a,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xf2,0x00,0x16,0x0e,0x32,0x0e,0x57,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x58,0x0e,0x59, -0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x61,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x34,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xf2,0x00,0x13,0x0e,0x32,0x0e,0x57,0x00,0x03,0x0a,0x63,0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x58,0x0e,0x59,0x00,0x03,0x09,0x0d,0x08,0xee, -0x0b,0x0c,0x08,0xd0,0x0e,0x61,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x02,0x64,0x6c,0x6e,0x67,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x2c,0x73,0x6c,0x6e,0x67,0x00,0x00,0x00,0x54, -0x00,0x00,0x00,0x2c,0x4c,0x61,0x74,0x6e,0x2c,0x47,0x72,0x65,0x6b,0x2c,0x43,0x79,0x72,0x6c,0x2c,0x41,0x72,0x6d,0x6e,0x2c,0x47,0x65,0x6f,0x72,0x2c,0x47,0x65,0x6f,0x6b,0x2c,0x41,0x72,0x61,0x62,0x2c,0x48,0x65,0x62,0x72,0x2c,0x4c,0x69,0x73,0x75,0x4c,0x61,0x74,0x6e,0x2c,0x47,0x72,0x65,0x6b,0x2c,0x43,0x79,0x72,0x6c,0x2c,0x41, -0x72,0x6d,0x6e,0x2c,0x47,0x65,0x6f,0x72,0x2c,0x47,0x65,0x6f,0x6b,0x2c,0x41,0x72,0x61,0x62,0x2c,0x48,0x65,0x62,0x72,0x2c,0x4c,0x69,0x73,0x75, -}; - -read_only global String8 rd_default_main_font_bytes = {rd_default_main_font_bytes__data, sizeof(rd_default_main_font_bytes__data)}; -read_only global U8 rd_default_code_font_bytes__data[] = -{ -0x00,0x01,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x04,0x00,0x10,0x47,0x44,0x45,0x46,0x14,0xdc,0x05,0x92,0x00,0x03,0xa6,0x14,0x00,0x00,0x02,0x2a,0x47,0x50,0x4f,0x53,0x68,0xe9,0x9a,0x47,0x00,0x03,0xa8,0x40,0x00,0x00,0x23,0x96,0x47,0x53,0x55,0x42,0x28,0xdb,0xc9,0x88,0x00,0x03,0xcb,0xd8,0x00,0x00,0x62,0x14,0x4f,0x53,0x2f,0x32, -0x12,0x35,0x0b,0x84,0x00,0x00,0x01,0x98,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0x5a,0x24,0x58,0xda,0x00,0x00,0x1d,0x34,0x00,0x00,0x42,0x6a,0x63,0x76,0x74,0x20,0x27,0x58,0x0f,0x1a,0x00,0x00,0x6e,0x84,0x00,0x00,0x00,0xa8,0x66,0x70,0x67,0x6d,0x62,0x2f,0x03,0x7f,0x00,0x00,0x5f,0xa0,0x00,0x00,0x0e,0x0c,0x67,0x61,0x73,0x70, -0x00,0x00,0x00,0x10,0x00,0x03,0xa6,0x0c,0x00,0x00,0x00,0x08,0x67,0x6c,0x79,0x66,0x6c,0x17,0x21,0x7d,0x00,0x00,0x8a,0x6c,0x00,0x02,0xc9,0x3c,0x68,0x65,0x61,0x64,0x1b,0x2b,0x60,0x84,0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,0x00,0x35,0x07,0x57,0x00,0x00,0x01,0x54,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78, -0x54,0xf6,0x4a,0x0f,0x00,0x00,0x01,0xf8,0x00,0x00,0x1b,0x3c,0x6c,0x6f,0x63,0x61,0x08,0x34,0x21,0x64,0x00,0x00,0x6f,0x2c,0x00,0x00,0x1b,0x40,0x6d,0x61,0x78,0x70,0x0f,0xc8,0x14,0x44,0x00,0x00,0x01,0x78,0x00,0x00,0x00,0x20,0x6e,0x61,0x6d,0x65,0x94,0x4b,0x4e,0x5d,0x00,0x03,0x53,0xa8,0x00,0x00,0x06,0x2f,0x70,0x6f,0x73,0x74, -0x5d,0x5a,0x9a,0x04,0x00,0x03,0x59,0xd8,0x00,0x00,0x4c,0x33,0x70,0x72,0x65,0x70,0x8a,0xcd,0x9c,0x1e,0x00,0x00,0x6d,0xac,0x00,0x00,0x00,0xd6,0x00,0x01,0x00,0x00,0x00,0x02,0x4d,0xd3,0x13,0x13,0x3d,0xf7,0x5f,0x0f,0x3c,0xf5,0x00,0x0f,0x03,0xe8,0x00,0x00,0x00,0x00,0xdf,0xe8,0x66,0x79,0x00,0x00,0x00,0x00,0xdf,0xe8,0x68,0x84, -0xf9,0x39,0xfe,0x70,0x02,0xfd,0x04,0x60,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0xfc,0xfe,0xd4,0x00,0x00,0x02,0x58,0xf9,0x39,0xff,0x5b,0x02,0xfd,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xcf,0x00,0x01,0x00,0x00,0x06,0xcf,0x01,0xb8, -0x00,0x6e,0x00,0x87,0x00,0x06,0x00,0x02,0x02,0x94,0x03,0xf6,0x00,0x8d,0x00,0x00,0x05,0x60,0x0e,0x0c,0x00,0x03,0x00,0x01,0x00,0x04,0x02,0x58,0x01,0x90,0x00,0x05,0x00,0x00,0x02,0x8a,0x02,0x58,0x00,0x00,0x00,0x4b,0x02,0x8a,0x02,0x58,0x00,0x00,0x01,0x5e,0x00,0x32,0x01,0x40,0x00,0x00,0x02,0x00,0x00,0x09,0x00,0x00,0x00,0x00, -0x00,0x00,0xa0,0x04,0x02,0xff,0x12,0x00,0xf9,0xfb,0x02,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x4a,0x42,0x00,0x00,0x00,0xc0,0x00,0x0d,0xff,0xff,0x03,0xfc,0xfe,0xd4,0x00,0x00,0x03,0xfc,0x01,0x2c,0x20,0x00,0x01,0x9f,0xdf,0xd7,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x00,0x00,0x20,0x00,0x06,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x32, -0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32, -0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c, -0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64, -0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x0a, -0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x5c, -0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x75,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58, -0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58, -0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x48, -0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, -0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x32, -0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x55, -0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43, -0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43, -0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3f,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x54, -0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x58, -0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xd4,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55, -0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x61,0x02,0x58,0x00,0x61, -0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c, -0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54, -0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x70,0x02,0x58,0x00,0x70, -0x02,0x58,0x00,0x70,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x5a, -0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, -0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36, -0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41, -0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, -0x02,0x58,0x00,0x5a,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64, -0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, -0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, -0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0xaf,0x02,0x58,0x00,0xb9,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x06, -0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x2e, -0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5e,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69, -0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x38,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x51,0x02,0x58,0x00,0x59,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x06,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x5a, -0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x56,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x82, -0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58, -0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x30,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x55, -0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3f,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5b,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x49,0x02,0x58,0x00,0x64, -0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32, -0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c, -0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0xb0,0x02,0x58,0xff,0x83,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x23, -0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x36, -0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x5a, -0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x30,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x1a,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x4b, -0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b, -0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4b, -0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e, -0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4c,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x40,0x02,0x58,0x00,0x52,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x40,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x49, -0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b, -0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b, -0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84, -0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x05, -0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x91,0x02,0x58,0x00,0x4c,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xd9,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xe1,0x02,0x58,0x00,0xe1,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x73, -0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x24,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xda,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xd9,0x00,0x00,0xff,0x1a, -0x00,0x00,0xff,0x79,0x02,0x58,0x00,0xb9,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x6e,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x87, -0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xdc,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xd2, -0x02,0x58,0x00,0xdc,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0xf9,0x02,0x58,0xfe,0x34,0x02,0x58,0xfb,0xdc,0x02,0x58,0xf9,0x4d,0x02,0x58,0xfb,0xa6,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfd,0xfd, -0x02,0x58,0xfb,0xa5,0x02,0x58,0xfd,0xfd,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfe,0x11,0x02,0x58,0xfe,0x0c,0x02,0x58,0xf9,0x7f,0x02,0x58,0xf9,0x7f,0x02,0x58,0xfc,0x09,0x02,0x58,0xfe,0x43,0x02,0x58,0xfe,0x34,0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0x8e,0x02,0x58,0xfe,0x3e,0x02,0x58,0xfe,0xd4,0x02,0x58,0xfc,0x90,0x02,0x58,0xfc,0x71, -0x02,0x58,0xfe,0x82,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfe,0xd1,0x02,0x58,0xfc,0xc9,0x02,0x58,0xfc,0x44,0x02,0x58,0xfe,0xb3,0x02,0x58,0xfc,0x2c,0x02,0x58,0xfe,0x52,0x02,0x58,0xfe,0x81,0x02,0x58,0xfe,0x81,0x02,0x58,0xfe,0xc5,0x02,0x58,0xfc,0xbd,0x02,0x58,0xfe,0xc5,0x02,0x58,0xfc,0x68,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa5, -0x02,0x58,0xfe,0x90,0x02,0x58,0xfe,0x90,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfb,0xfa,0x02,0x58,0xfe,0x52,0x02,0x58,0xfb,0x9c,0x02,0x58,0xfd,0xe5,0x02,0x58,0xfd,0xcc,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xe9,0x02,0x58,0xfb,0x91, -0x02,0x58,0xf9,0x39,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfb,0x73,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x11,0x02,0x58,0xfb,0xa0,0x02,0x58,0xfe,0x16,0x02,0x58,0xfe,0x3e,0x02,0x58,0xfb,0xfa,0x02,0x58,0xfc,0x13,0x02,0x58,0xfe,0x66,0x02,0x58,0xfe,0x66,0x02,0x58,0xfc,0x22,0x02,0x58,0xfd,0xe4, -0x02,0x58,0xfe,0x5c,0x02,0x58,0xfc,0x0e,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x00, -0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x13,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x1d, -0x02,0x58,0x00,0x9e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x9b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x9f,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xf6, -0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0xe6,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0x97,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x2d, -0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x41,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x46,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2d, -0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55, -0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x64, -0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x9b, -0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0e,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0xd9,0x02,0x58,0x00,0x23, -0x02,0x58,0x00,0x1e,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00, -0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00, -0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x1d,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x28, -0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x6e, -0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x6e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x0a, -0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0xd8,0x02,0x58,0xff,0xd8,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00, -0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x01,0x2c,0x02,0x58,0x02,0x0d,0x02,0x58,0x00,0x00,0x02,0x58,0x01,0x2c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00, -0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x01,0x2c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6, -0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0xb4,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6, -0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x96, -0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x8c,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, -0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa, -0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec, -0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, -0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x19, -0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, -0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, -0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa, -0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x44,0x02,0x58,0x00,0x44,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32, -0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x1e, -0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00, -0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xaa,0x02,0x58,0x00,0x7d, -0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x58,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x27, -0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x46, -0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xc3,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xc3,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d, -0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x51, -0x02,0x58,0x00,0x14,0x02,0x58,0xff,0x5b,0x02,0x58,0xff,0xc9,0x02,0x58,0xff,0xa9,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x52,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, -0x02,0x58,0x00,0xf5,0x02,0x58,0x00,0x06,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x49,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0f, -0x02,0x58,0x00,0x37,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0xfe,0x13,0x02,0x58,0xfe,0x07,0x02,0x58,0xfb,0xc8,0x02,0x58,0xfd,0xda,0x02,0x58,0xfb,0x82,0x02,0x58,0xfd,0xdf,0x02,0x58,0xfd,0xd5,0x02,0x58,0xfd,0xc6,0x02,0x58,0xfb,0x73,0x02,0x58,0xfd,0xd5,0x02,0x58,0xfe,0xa7,0x02,0x58,0xfb,0xd2,0x02,0x58,0xfe,0xbb, -0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0xe3,0x02,0x58,0xfc,0xa4,0x02,0x58,0xfc,0xc7,0x02,0x58,0xfa,0xc9,0x02,0x58,0xfc,0xa4,0x02,0x58,0xfc,0xd6,0x02,0x58,0xfe,0xa7,0x02,0x58,0xfb,0xd2,0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0x13,0x02,0x58,0xfe,0x20,0x02,0x58,0xfb,0xff,0x02,0x58,0xfd,0xda,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xa0, -0x02,0x58,0xfb,0xa0,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfd,0xfd,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa1,0x02,0x58,0xfe,0x0c,0x02,0x58,0xfb,0xb3,0x02,0x58,0xfe,0x61,0x02,0x58,0xfe,0x89,0x02,0x58,0xfe,0xcf,0x02,0x58,0xfb,0xb3,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xb3, -0x02,0x58,0xfb,0xb3,0x02,0x58,0xfc,0x6d,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x89,0x02,0x58,0xfb,0xcd,0x02,0x58,0xf9,0x43,0x02,0x58,0xfd,0xee,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfe,0x98,0x02,0x58,0xfc,0x77,0x02,0x58,0xfa,0x7e,0x02,0x58,0xfb,0xe6, -0x02,0x58,0xfe,0x07,0x02,0x58,0xfb,0xbe,0x02,0x58,0xf9,0x43,0x02,0x58,0xfd,0xee,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfe,0xcf,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xf9,0x43,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x34,0x02,0x58,0xfe,0x47,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0xf5, -0x02,0x58,0xfb,0x9b,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xf5,0x02,0x58,0xfe,0x11,0x02,0x58,0xfd,0xee,0x02,0x58,0xfd,0xee,0x02,0x58,0xfe,0x57,0x02,0x58,0xfb,0x96,0x02,0x58,0xfe,0x39,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa0,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x41, -0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xa5,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x4a,0x00,0x00,0xfe,0x90,0x00,0x00,0xfe,0x3b,0x00,0x00,0xff,0x60,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x5c, -0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xfd,0xf0,0x00,0x00,0xfe,0x7a,0x00,0x00,0xff,0x18,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x5c,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x75,0x00,0x00,0xfe,0x61,0x00,0x00,0xfd,0x8a,0x00,0x00,0xfd,0xcb,0x00,0x00,0xfe,0x16,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0xe5, -0x02,0x58,0x00,0xa2,0x02,0x58,0x00,0xe8,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0xb9,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x4a,0x00,0x00,0xfe,0x90, -0x00,0x00,0xfe,0x3b,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x5c,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xfd,0xf0,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xff,0x1b,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x75, -0x00,0x00,0xfe,0x61,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0xe5,0x02,0x58,0x00,0xa2,0x02,0x58,0x00,0xe8,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xe1, -0x02,0x58,0x00,0x7d,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20, -0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xd8,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x00,0x00,0x00,0x00,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x24, -0x00,0x00,0x00,0x04,0x00,0x00,0x0f,0x12,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x03,0x00,0x0a,0x00,0x00,0x0f,0x12,0x00,0x04,0x0e,0xee,0x00,0x00,0x01,0xa8,0x01,0x00,0x00,0x07,0x00,0xa8,0x00,0x0d,0x00,0x2f,0x00,0x39,0x00,0x7e,0x01,0x31,0x01,0x7f,0x01,0x90,0x01,0x92,0x01,0x9b,0x01,0xa1,0x01,0xb0,0x01,0xce,0x01,0xd0, -0x01,0xd2,0x01,0xd4,0x01,0xd6,0x01,0xd8,0x01,0xda,0x01,0xdc,0x01,0xe7,0x01,0xeb,0x01,0xf5,0x01,0xff,0x02,0x1b,0x02,0x33,0x02,0x37,0x02,0x59,0x02,0xba,0x02,0xbc,0x02,0xc7,0x02,0xc9,0x02,0xdd,0x02,0xf3,0x02,0xf7,0x03,0x04,0x03,0x0c,0x03,0x0f,0x03,0x12,0x03,0x1b,0x03,0x23,0x03,0x28,0x03,0x38,0x03,0x75,0x03,0x7e,0x03,0x8a, -0x03,0x8c,0x03,0x90,0x03,0xa1,0x03,0xa9,0x03,0xb0,0x03,0xc9,0x03,0xcf,0x03,0xd7,0x04,0x0c,0x04,0x1a,0x04,0x23,0x04,0x3a,0x04,0x43,0x04,0x4f,0x04,0x5c,0x04,0x5f,0x04,0x93,0x04,0x9b,0x04,0xa3,0x04,0xb1,0x04,0xb7,0x04,0xbb,0x04,0xd9,0x04,0xdf,0x04,0xe9,0x04,0xf5,0x0a,0xea,0x1e,0x85,0x1e,0x9e,0x1e,0xf9,0x20,0x01,0x20,0x0b, -0x20,0x10,0x20,0x14,0x20,0x16,0x20,0x22,0x20,0x24,0x20,0x26,0x20,0x30,0x20,0x34,0x20,0x3a,0x20,0x3f,0x20,0x46,0x20,0x70,0x20,0x79,0x20,0x7a,0x20,0x7c,0x20,0x89,0x20,0xac,0x20,0xae,0x20,0xb4,0x20,0xbd,0x20,0xbf,0x21,0x02,0x21,0x0d,0x21,0x13,0x21,0x16,0x21,0x1a,0x21,0x1d,0x21,0x22,0x21,0x24,0x21,0x2e,0x21,0x40,0x21,0x8b, -0x21,0x99,0x21,0x9e,0x21,0xa0,0x21,0xa3,0x21,0xa7,0x21,0xaa,0x21,0xad,0x21,0xbe,0x21,0xc9,0x21,0xd4,0x21,0xdb,0x21,0xdf,0x21,0xe5,0x21,0xe8,0x21,0xea,0x22,0x0c,0x22,0x13,0x22,0x15,0x22,0x1a,0x22,0x1e,0x22,0x25,0x22,0x2b,0x22,0x39,0x22,0x3c,0x22,0x3e,0x22,0x43,0x22,0x45,0x22,0x49,0x22,0x4b,0x22,0x4d,0x22,0x54,0x22,0x57, -0x22,0x65,0x22,0x73,0x22,0x7c,0x22,0x89,0x22,0x99,0x22,0xa5,0x22,0xb4,0x22,0xb8,0x22,0xbd,0x22,0xc4,0x22,0xc6,0x22,0xca,0x22,0xce,0x22,0xd0,0x22,0xe2,0x22,0xf1,0x23,0x05,0x23,0x0b,0x23,0x18,0x23,0x1f,0x23,0x26,0x23,0x28,0x23,0x2b,0x23,0x7a,0x23,0x8b,0x23,0x95,0x23,0xad,0x23,0xce,0x23,0xfe,0x24,0x21,0x24,0x24,0x25,0x94, -0x25,0x9f,0x25,0xa1,0x25,0xab,0x25,0xcc,0x25,0xcf,0x25,0xd5,0x25,0xe6,0x25,0xeb,0x25,0xef,0x25,0xf6,0x26,0x6d,0x26,0x6f,0x26,0x87,0x26,0xa1,0x27,0x13,0x27,0x15,0x27,0x17,0x27,0x36,0x27,0x71,0x27,0x94,0x27,0x9e,0x27,0xc6,0x27,0xdc,0x27,0xeb,0x27,0xf7,0x29,0x16,0x29,0x4a,0x29,0x88,0x2a,0x00,0x2a,0x06,0x2b,0x58,0xe0,0xa2, -0xe0,0xb3,0xfe,0x62,0xfe,0xff,0xff,0x5b,0xff,0x5d,0xff,0xfd,0xff,0xff,0x00,0x00,0x00,0x0d,0x00,0x20,0x00,0x30,0x00,0x3a,0x00,0xa0,0x01,0x34,0x01,0x8f,0x01,0x92,0x01,0x9b,0x01,0xa0,0x01,0xaf,0x01,0xcd,0x01,0xd0,0x01,0xd2,0x01,0xd4,0x01,0xd6,0x01,0xd8,0x01,0xda,0x01,0xdc,0x01,0xe6,0x01,0xea,0x01,0xf4,0x01,0xfc,0x02,0x18, -0x02,0x32,0x02,0x37,0x02,0x59,0x02,0xb9,0x02,0xbc,0x02,0xc6,0x02,0xc9,0x02,0xd8,0x02,0xf3,0x02,0xf7,0x03,0x00,0x03,0x06,0x03,0x0f,0x03,0x12,0x03,0x1b,0x03,0x23,0x03,0x25,0x03,0x36,0x03,0x74,0x03,0x7e,0x03,0x84,0x03,0x8c,0x03,0x8e,0x03,0x91,0x03,0xa3,0x03,0xaa,0x03,0xb1,0x03,0xca,0x03,0xd5,0x04,0x01,0x04,0x0e,0x04,0x1b, -0x04,0x24,0x04,0x3b,0x04,0x44,0x04,0x51,0x04,0x5e,0x04,0x90,0x04,0x9a,0x04,0xa2,0x04,0xae,0x04,0xb6,0x04,0xba,0x04,0xd8,0x04,0xdc,0x04,0xe4,0x04,0xf4,0x0a,0xea,0x1e,0x80,0x1e,0x9e,0x1e,0xa0,0x20,0x01,0x20,0x0b,0x20,0x10,0x20,0x13,0x20,0x16,0x20,0x18,0x20,0x24,0x20,0x26,0x20,0x30,0x20,0x32,0x20,0x39,0x20,0x3c,0x20,0x44, -0x20,0x70,0x20,0x74,0x20,0x7a,0x20,0x7c,0x20,0x80,0x20,0xab,0x20,0xae,0x20,0xb4,0x20,0xbd,0x20,0xbf,0x21,0x02,0x21,0x0d,0x21,0x13,0x21,0x15,0x21,0x19,0x21,0x1d,0x21,0x22,0x21,0x24,0x21,0x2e,0x21,0x40,0x21,0x8a,0x21,0x90,0x21,0x9d,0x21,0xa0,0x21,0xa2,0x21,0xa5,0x21,0xa9,0x21,0xad,0x21,0xbe,0x21,0xc9,0x21,0xd0,0x21,0xdb, -0x21,0xde,0x21,0xe5,0x21,0xe7,0x21,0xea,0x22,0x00,0x22,0x0e,0x22,0x15,0x22,0x18,0x22,0x1e,0x22,0x23,0x22,0x27,0x22,0x34,0x22,0x3c,0x22,0x3e,0x22,0x43,0x22,0x45,0x22,0x47,0x22,0x4b,0x22,0x4d,0x22,0x54,0x22,0x57,0x22,0x5f,0x22,0x6a,0x22,0x7a,0x22,0x82,0x22,0x8e,0x22,0x9b,0x22,0xb4,0x22,0xb8,0x22,0xbb,0x22,0xc2,0x22,0xc6, -0x22,0xc8,0x22,0xce,0x22,0xd0,0x22,0xe2,0x22,0xee,0x23,0x02,0x23,0x08,0x23,0x18,0x23,0x1c,0x23,0x24,0x23,0x28,0x23,0x2b,0x23,0x36,0x23,0x89,0x23,0x95,0x23,0x9b,0x23,0xce,0x23,0xfb,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x95,0x25,0xa0,0x25,0xaa,0x25,0xb2,0x25,0xce,0x25,0xd4,0x25,0xe6,0x25,0xe7,0x25,0xef,0x25,0xf6,0x26,0x6d, -0x26,0x6f,0x26,0x87,0x26,0xa0,0x27,0x13,0x27,0x15,0x27,0x17,0x27,0x36,0x27,0x6e,0x27,0x94,0x27,0x9c,0x27,0xc5,0x27,0xdc,0x27,0xe6,0x27,0xf5,0x29,0x16,0x29,0x4a,0x29,0x87,0x2a,0x00,0x2a,0x05,0x2b,0x58,0xe0,0xa0,0xe0,0xb0,0xfe,0x62,0xfe,0xff,0xff,0x5b,0xff,0x5d,0xff,0xfd,0xff,0xff,0x03,0xb3,0x00,0x00,0x02,0xa4,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x36,0xff,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x33,0xff,0x53,0xff,0x80,0xff,0x84,0xff,0x7f,0xff,0x7e,0xff,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xd7,0xfe,0x9a,0x00,0x00,0x03,0xa8,0x03,0xbf,0x03,0x9d,0x00,0x00,0x03,0x10,0x03,0x0d,0x00,0x00,0x00,0x00, -0x03,0x66,0x03,0x64,0x03,0x5c,0x03,0x55,0x03,0x54,0x03,0x47,0x02,0xee,0x00,0x3d,0x00,0x00,0xfe,0xe1,0x00,0x00,0xfe,0xc0,0xfe,0xbf,0x00,0x00,0xfe,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0xbc,0x00,0x00,0xfd,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x3e,0x00,0x00,0xe1,0xe9,0x00,0x00,0xe3,0xbb,0xe3,0xb2,0xe3,0x4b,0xe3,0x46,0xe3,0x21,0x00,0x00,0xe3,0x17,0xe3,0x07,0xe4,0x09,0x00,0x00,0xe3,0x2e,0x00,0x00,0x00,0x00,0xe2,0x92,0xe2,0x92,0xe3,0xc1,0xe3,0x6a,0xe2,0x64,0xe3,0x1b,0xe3,0x1e,0xe3,0x15,0xe3,0x0d,0xe3,0x03,0xe1,0xa0,0xe1,0x9a, -0xe4,0xae,0x00,0x00,0xe1,0x96,0xe1,0x94,0xe4,0x98,0xe1,0x95,0xe4,0x96,0xe3,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0xde,0xe2,0xdd,0xe2,0xdc,0xe2,0xdc,0xe2,0xcf,0xe2,0xc9,0xe2,0xbf,0x00,0x00,0xe2,0xb3,0x00,0x00,0xe2,0x9f,0xe2,0xa8,0xe3,0xf8,0x00,0x00,0x00,0x00,0xe1,0xc8,0x00,0x00,0xe2,0x06,0x00,0x00,0xe1,0xff,0x00,0x00, -0xe2,0x12,0xe1,0xaf,0xe1,0x8d,0xe1,0x92,0x00,0x00,0xe2,0x19,0xe1,0x9b,0xe1,0x81,0xe1,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x54,0xe1,0x44,0x00,0x00,0x00,0x00,0xe1,0x93,0x00,0x00,0xe1,0x0c,0xe1,0x10,0xe1,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0xd1,0x00,0x00,0x00,0x00,0xe2,0xbd,0xe2,0xb8, -0x00,0x00,0x00,0x00,0xe1,0xf0,0x00,0x00,0xe2,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x17,0xdf,0x28,0xdf,0x20,0x00,0x00,0x00,0x00,0xde,0xe9,0xde,0xdd,0xde,0xe5,0xde,0xcd,0xde,0xc9,0xdf,0xf3,0xdf,0xf2,0xdf,0x24,0xdf,0x0c,0xde,0x9b,0xde,0x9a,0xde,0x99,0xde,0x7b,0x00,0x00,0xdc,0xff,0xdc,0xf8,0x00,0x00,0xdc,0x13, -0x00,0x00,0xdc,0xa2,0xdb,0x2d,0xda,0xa4,0xd9,0xce,0xd9,0xfe,0xd9,0xfa,0xda,0x99,0x26,0x24,0x26,0x17,0x05,0xd8,0x04,0xc2,0x03,0xee,0x03,0xed,0x05,0xf9,0x00,0x01,0x00,0x00,0x01,0xa6,0x00,0x00,0x01,0xc2,0x02,0x4a,0x03,0x6c,0x04,0x02,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xf8,0x03,0xfa,0x03,0xfc,0x03,0xfe,0x04,0x04,0x04,0x0a,0x00,0x00,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x04,0x0a,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0e,0x00,0x00,0x04,0x18,0x00,0x00, -0x00,0x00,0x04,0x18,0x00,0x00,0x04,0x22,0x04,0x2c,0x04,0x30,0x04,0x46,0x00,0x00,0x04,0x5c,0x00,0x00,0x04,0x86,0x04,0x9c,0x04,0xb2,0x04,0xb4,0x04,0xba,0x04,0xbc,0x04,0xbe,0x04,0xc4,0x04,0xc6,0x04,0xc8,0x04,0xca,0x04,0xd0,0x04,0xda,0x00,0x00,0x04,0xda,0x00,0x00,0x04,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x05,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x98,0x00,0x00,0x05,0x9a,0x05,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x80,0x05,0x82,0x05,0x94,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x88,0x00,0x00,0x05,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x8a,0x05,0xa2,0x00,0x00,0x05,0xaa,0x00,0x00,0x05,0xac,0x00,0x00,0x05,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xac,0x05,0xb8,0x05,0xca, -0x05,0xce,0x05,0xdc,0x05,0xf2,0x00,0x00,0x00,0x00,0x06,0x02,0x06,0x06,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x0c,0x06,0x12,0x00,0x00,0x06,0x16,0x06,0x1c,0x00,0x00,0x00,0x00,0x06,0x1c,0x06,0xa4,0x00,0x00,0x06,0xa6,0x00,0x00,0x06,0xc8,0x06,0xce,0x07,0x10,0x07,0x12,0x00,0x00,0x00,0x00,0x00,0x00, -0x08,0x34,0x08,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x50,0x00,0x00,0x00,0x00,0x08,0x52,0x00,0x00,0x08,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xbe,0x03,0x2e,0x03,0x6a,0x03,0x3a,0x03,0xc5,0x04,0x38,0x05,0xb5,0x03,0x6b,0x03,0x43,0x03,0x44,0x03,0x34,0x04,0x15,0x03,0x2a,0x03,0x57,0x03,0x29,0x03,0x3d,0x03,0x2b,0x03,0x2c,0x04,0x1c,0x04,0x19,0x04,0x1b,0x03,0x30,0x05,0xb4,0x00,0x01,0x00,0x1a,0x00,0x1b,0x00,0x21,0x00,0x25, -0x00,0x38,0x00,0x39,0x00,0x40,0x00,0x43,0x00,0x4f,0x00,0x51,0x00,0x53,0x00,0x59,0x00,0x5a,0x00,0x60,0x00,0x7a,0x00,0x7c,0x00,0x7d,0x00,0x81,0x00,0x89,0x00,0x8e,0x00,0xa1,0x00,0xa2,0x00,0xa7,0x00,0xa8,0x00,0xb1,0x03,0x47,0x03,0x3e,0x03,0x48,0x04,0x23,0x03,0x5c,0x06,0x82,0x00,0xbd,0x00,0xd6,0x00,0xd7,0x00,0xdd,0x00,0xe1, -0x00,0xf4,0x00,0xf5,0x00,0xfc,0x00,0xff,0x01,0x0d,0x01,0x10,0x01,0x13,0x01,0x1a,0x01,0x1b,0x01,0x22,0x01,0x3d,0x01,0x3f,0x01,0x40,0x01,0x44,0x01,0x4c,0x01,0x51,0x01,0x69,0x01,0x6a,0x01,0x6f,0x01,0x70,0x01,0x79,0x03,0x45,0x05,0xbe,0x03,0x46,0x04,0x22,0x03,0xbf,0x03,0x2f,0x03,0xc3,0x03,0xcb,0x03,0xc4,0x03,0xcd,0x05,0xbf, -0x05,0xb7,0x06,0x80,0x05,0xb8,0x01,0xc6,0x03,0x65,0x04,0x21,0x03,0x58,0x05,0xb9,0x06,0x8a,0x05,0xbb,0x04,0x1f,0x03,0x04,0x03,0x05,0x06,0x83,0x04,0x30,0x05,0xb6,0x03,0x32,0x06,0x8b,0x03,0x03,0x01,0xc7,0x03,0x66,0x03,0x22,0x03,0x21,0x03,0x23,0x03,0x31,0x00,0x12,0x00,0x02,0x00,0x0a,0x00,0x17,0x00,0x10,0x00,0x16,0x00,0x18, -0x00,0x1e,0x00,0x32,0x00,0x26,0x00,0x29,0x00,0x2f,0x00,0x4a,0x00,0x44,0x00,0x46,0x00,0x47,0x00,0x22,0x00,0x5f,0x00,0x6b,0x00,0x61,0x00,0x63,0x00,0x78,0x00,0x69,0x04,0x17,0x00,0x76,0x00,0x94,0x00,0x8f,0x00,0x91,0x00,0x92,0x00,0xa9,0x00,0x7b,0x01,0x4a,0x00,0xce,0x00,0xbe,0x00,0xc6,0x00,0xd3,0x00,0xcc,0x00,0xd2,0x00,0xd4, -0x00,0xda,0x00,0xee,0x00,0xe2,0x00,0xe5,0x00,0xeb,0x01,0x08,0x01,0x01,0x01,0x04,0x01,0x05,0x00,0xde,0x01,0x21,0x01,0x2e,0x01,0x23,0x01,0x26,0x01,0x3b,0x01,0x2c,0x04,0x18,0x01,0x39,0x01,0x5c,0x01,0x52,0x01,0x55,0x01,0x56,0x01,0x71,0x01,0x3e,0x01,0x73,0x00,0x14,0x00,0xd0,0x00,0x03,0x00,0xbf,0x00,0x15,0x00,0xd1,0x00,0x1c, -0x00,0xd8,0x00,0x1f,0x00,0xdb,0x00,0x20,0x00,0xdc,0x00,0x1d,0x00,0xd9,0x00,0x23,0x00,0xdf,0x00,0x24,0x00,0xe0,0x00,0x34,0x00,0xf0,0x00,0x27,0x00,0xe3,0x00,0x30,0x00,0xec,0x00,0x35,0x00,0xf1,0x00,0x28,0x00,0xe4,0x00,0x3d,0x00,0xf9,0x00,0x3b,0x00,0xf7,0x00,0x3f,0x00,0xfb,0x00,0x3e,0x00,0xfa,0x00,0x42,0x00,0xfe,0x00,0x41, -0x00,0xfd,0x00,0x4e,0x01,0x0c,0x00,0x4c,0x01,0x0a,0x00,0x45,0x01,0x02,0x00,0x4d,0x01,0x0b,0x00,0x48,0x01,0x00,0x00,0x50,0x01,0x0f,0x00,0x52,0x01,0x11,0x01,0x12,0x00,0x54,0x01,0x14,0x00,0x56,0x01,0x17,0x00,0x55,0x01,0x16,0x00,0x57,0x01,0x18,0x00,0x58,0x01,0x19,0x00,0x5b,0x01,0x1c,0x00,0x5d,0x01,0x1f,0x00,0x5c,0x01,0x1e, -0x01,0x1d,0x00,0x5e,0x01,0x20,0x00,0x74,0x01,0x37,0x00,0x62,0x01,0x24,0x00,0x73,0x01,0x36,0x00,0x79,0x01,0x3c,0x00,0x7e,0x01,0x41,0x00,0x80,0x01,0x43,0x00,0x7f,0x01,0x42,0x00,0x82,0x01,0x45,0x00,0x85,0x01,0x48,0x00,0x84,0x01,0x47,0x00,0x83,0x01,0x46,0x00,0x8c,0x01,0x4f,0x00,0x8b,0x01,0x4e,0x00,0x8a,0x01,0x4d,0x00,0xa0, -0x01,0x68,0x00,0x9d,0x01,0x65,0x00,0x90,0x01,0x53,0x00,0x9f,0x01,0x67,0x00,0x9c,0x01,0x64,0x00,0x9e,0x01,0x66,0x00,0xa4,0x01,0x6c,0x00,0xaa,0x01,0x72,0x00,0xab,0x00,0xb2,0x01,0x7a,0x00,0xb4,0x01,0x7c,0x00,0xb3,0x01,0x7b,0x01,0x4b,0x00,0x88,0x00,0x36,0x00,0x6d,0x01,0x30,0x00,0x96,0x01,0x5e,0x00,0x09,0x00,0xc5,0x00,0x3c, -0x00,0xf8,0x00,0x75,0x01,0x38,0x00,0x3a,0x00,0xf6,0x00,0x19,0x00,0xd5,0x00,0x77,0x01,0x3a,0x00,0x86,0x01,0x49,0x00,0x8d,0x01,0x50,0x00,0xaf,0x01,0x77,0x06,0x67,0x06,0x65,0x06,0x87,0x06,0x81,0x06,0x88,0x06,0x8c,0x06,0x89,0x06,0x84,0x06,0x6a,0x06,0x6b,0x06,0x6e,0x06,0x72,0x06,0x73,0x06,0x70,0x06,0x69,0x06,0x68,0x06,0x74, -0x06,0x71,0x06,0x6c,0x06,0x6f,0x06,0xb0,0x06,0xb2,0x02,0x69,0x03,0xba,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6e,0x02,0x6f,0x02,0x90,0x02,0x70,0x02,0x71,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x8e,0x02,0x93,0x02,0x8f,0x02,0x92,0x02,0x94,0x02,0x91,0x02,0x95,0x02,0x72,0x02,0x9a,0x02,0x9b,0x02,0x99,0x01,0xd0,0x01,0xf6,0x01,0xcc, -0x01,0xee,0x01,0xed,0x01,0xf0,0x01,0xf1,0x01,0xf2,0x01,0xeb,0x01,0xec,0x01,0xf3,0x01,0xd6,0x01,0xe0,0x01,0xe7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xce,0x01,0xcf,0x01,0xd1,0x01,0xd2,0x01,0xd3,0x01,0xd4,0x01,0xd5,0x01,0xe1,0x01,0xe2,0x01,0xe4,0x01,0xe3,0x01,0xe5,0x01,0xe6,0x01,0xe9,0x01,0xea,0x01,0xe8,0x01,0xef, -0x01,0xf4,0x01,0xf5,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x12,0x02,0x13,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x25,0x02,0x26,0x02,0x28,0x02,0x27,0x02,0x29,0x02,0x2a,0x02,0x2d,0x02,0x2e,0x02,0x2c,0x02,0x33,0x02,0x38,0x02,0x39,0x02,0x14,0x02,0x3a,0x02,0x10,0x02,0x32,0x02,0x31,0x02,0x34,0x02,0x35, -0x02,0x36,0x02,0x2f,0x02,0x30,0x02,0x37,0x02,0x1a,0x02,0x24,0x02,0x2b,0x01,0xcd,0x02,0x11,0x01,0xf7,0x02,0x3b,0x01,0xf8,0x02,0x3c,0x01,0xf9,0x02,0x3d,0x01,0xfa,0x02,0x3e,0x01,0xfb,0x02,0x3f,0x01,0xfc,0x02,0x40,0x01,0xfd,0x02,0x41,0x01,0xfe,0x02,0x42,0x01,0xff,0x02,0x43,0x02,0x00,0x02,0x44,0x02,0x01,0x02,0x45,0x02,0x02, -0x02,0x46,0x02,0x03,0x02,0x47,0x02,0x04,0x02,0x48,0x00,0xa6,0x01,0x6e,0x00,0xa3,0x01,0x6b,0x00,0xa5,0x01,0x6d,0x00,0x11,0x00,0xcd,0x00,0x13,0x00,0xcf,0x00,0x0b,0x00,0xc7,0x00,0x0d,0x00,0xc9,0x00,0x0e,0x00,0xca,0x00,0x0f,0x00,0xcb,0x00,0x0c,0x00,0xc8,0x00,0x04,0x00,0xc0,0x00,0x06,0x00,0xc2,0x00,0x07,0x00,0xc3,0x00,0x08, -0x00,0xc4,0x00,0x05,0x00,0xc1,0x00,0x31,0x00,0xed,0x00,0x33,0x00,0xef,0x00,0x37,0x00,0xf2,0x00,0x2a,0x00,0xe6,0x00,0x2c,0x00,0xe8,0x00,0x2d,0x00,0xe9,0x00,0x2e,0x00,0xea,0x00,0x2b,0x00,0xe7,0x00,0x4b,0x01,0x09,0x00,0x49,0x01,0x07,0x00,0x6a,0x01,0x2d,0x00,0x6c,0x01,0x2f,0x00,0x64,0x01,0x27,0x00,0x66,0x01,0x29,0x00,0x67, -0x01,0x2a,0x00,0x68,0x01,0x2b,0x00,0x65,0x01,0x28,0x00,0x6e,0x01,0x31,0x00,0x70,0x01,0x33,0x00,0x71,0x01,0x34,0x00,0x72,0x01,0x35,0x00,0x6f,0x01,0x32,0x00,0x93,0x01,0x5b,0x00,0x95,0x01,0x5d,0x00,0x97,0x01,0x5f,0x00,0x99,0x01,0x61,0x00,0x9a,0x01,0x62,0x00,0x9b,0x01,0x63,0x00,0x98,0x01,0x60,0x00,0xad,0x01,0x75,0x00,0xac, -0x01,0x74,0x00,0xae,0x01,0x76,0x00,0xb0,0x01,0x78,0x03,0x61,0x03,0x62,0x03,0x5d,0x03,0x63,0x03,0x5f,0x03,0x60,0x03,0x5e,0x03,0x64,0x05,0xc0,0x05,0xc2,0x03,0x33,0x05,0xbc,0x05,0xbd,0x03,0x69,0x03,0x38,0x03,0x39,0x03,0x3c,0x03,0x3f,0x03,0x20,0x03,0x35,0x03,0x36,0x02,0xad,0x05,0xc3,0x05,0xff,0x05,0xfe,0x04,0x77,0x04,0x71, -0x04,0x73,0x04,0x75,0x04,0x79,0x04,0x7a,0x04,0x78,0x04,0x72,0x04,0x74,0x04,0x76,0x04,0x7b,0x04,0x7d,0x04,0x8c,0x04,0x89,0x04,0x8a,0x04,0x8b,0x04,0x8d,0x05,0xe8,0x05,0xe7,0x04,0x65,0x03,0xd6,0x04,0x2f,0x03,0xea,0x04,0x62,0x04,0x25,0x04,0x2b,0x03,0xeb,0x03,0xe2,0x04,0x0b,0x03,0xe3,0x04,0x5d,0x04,0x0a,0x03,0xe5,0x04,0x2c, -0x03,0xd8,0x04,0x2d,0x04,0x16,0x03,0xf9,0x04,0x4d,0x03,0xd4,0x04,0x2e,0x03,0xdc,0x03,0xde,0x04,0x31,0x04,0x63,0x03,0xd1,0x04,0x40,0x04,0x3e,0x03,0xdf,0x03,0xe9,0x04,0x04,0x04,0x20,0x04,0x09,0x04,0x3f,0x04,0x1a,0x03,0xe7,0x04,0x0f,0x04,0x5a,0x04,0x1e,0x04,0x1d,0x03,0xfb,0x03,0xfa,0x03,0xd2,0x04,0x0c,0x04,0x10,0x04,0x0d, -0x04,0x11,0x04,0x0e,0x03,0xf7,0x03,0xec,0x04,0x3c,0x04,0x5c,0x04,0x3d,0x04,0x5b,0x04,0x5f,0x04,0x13,0x04,0x14,0x04,0x41,0x04,0x42,0x04,0x05,0x04,0x06,0x03,0xfd,0x04,0x55,0x04,0x57,0x04,0x56,0x04,0x58,0x04,0x4f,0x04,0x50,0x04,0x70,0x04,0x6d,0x04,0x6e,0x04,0x6c,0x04,0x6f,0x04,0x69,0x04,0x6b,0x04,0x6a,0x04,0x53,0x04,0x52, -0x04,0x54,0x04,0x51,0x04,0x4b,0x04,0x61,0x04,0x60,0x04,0x67,0x04,0x68,0x04,0x01,0x04,0x07,0x04,0x02,0x04,0x03,0x03,0xdb,0x03,0xd3,0x03,0xf3,0x04,0x47,0x03,0xe4,0x03,0xf8,0x04,0x66,0x03,0xe1,0x05,0xe1,0x05,0xca,0x04,0x91,0x05,0xf4,0x03,0x4f,0x03,0x52,0x03,0x50,0x03,0x53,0x05,0xce,0x05,0xcd,0x05,0xcb,0x05,0xcc,0x04,0x92, -0x05,0xe6,0x05,0xe4,0x05,0x65,0x05,0xa0,0x05,0x8f,0x05,0x8c,0x05,0x8b,0x05,0x91,0x05,0x87,0x05,0x6d,0x05,0x6b,0x05,0x9f,0x05,0x68,0x05,0x97,0x05,0x86,0x05,0x93,0x05,0x90,0x05,0x82,0x05,0x9d,0x05,0x92,0x05,0x96,0x05,0x69,0x05,0x79,0x05,0x72,0x05,0x8e,0x05,0x8a,0x05,0x78,0x05,0xa9,0x05,0x98,0x05,0xa8,0x05,0x71,0x05,0x99, -0x05,0x89,0x05,0xa7,0x05,0x7a,0x05,0x8d,0x05,0x9b,0x05,0x73,0x05,0x75,0x05,0x80,0x05,0x6e,0x05,0xa5,0x05,0x9a,0x05,0x6c,0x05,0x88,0x05,0xa6,0x05,0x70,0x05,0xa1,0x05,0x7f,0x05,0x6a,0x05,0x77,0x05,0x81,0x05,0xa3,0x05,0x7c,0x05,0x6f,0x05,0x74,0x05,0xaa,0x05,0xa2,0x05,0x9e,0x05,0x94,0x05,0x95,0x05,0x76,0x05,0xa4,0x05,0x7d, -0x05,0x9c,0x05,0x83,0x05,0x67,0x05,0x7b,0x05,0x7e,0x05,0x84,0x05,0x66,0x05,0xe0,0x05,0xd5,0x05,0xc7,0x04,0x34,0x04,0x32,0x04,0x33,0x04,0x37,0x04,0x35,0x04,0x36,0x03,0xf6,0x03,0xf4,0x03,0xf5,0x04,0x4a,0x04,0x48,0x04,0x49,0x03,0xf2,0x03,0xf1,0x03,0xf0,0x03,0xd9,0x04,0x46,0x04,0x45,0x04,0x44,0x05,0xef,0x05,0xf0,0x05,0xf2, -0x05,0xf3,0x05,0xee,0x05,0xfa,0x05,0xfb,0x05,0xd7,0x05,0xd8,0x05,0xda,0x05,0xb2,0x05,0xc5,0x05,0xb3,0x05,0xdf,0x05,0xeb,0x06,0x01,0x05,0xdd,0x05,0xc9,0x05,0xf8,0x05,0xf7,0x05,0xcf,0x05,0xd2,0x05,0xd4,0x05,0xd3,0x05,0xd1,0x05,0xec,0x05,0xfd,0x05,0xd9,0x05,0xc8,0x05,0xd6,0x05,0xfc,0x05,0xdb,0x05,0xdc,0x05,0xde,0x05,0xf5, -0x06,0x00,0x05,0xf9,0x05,0xd0,0x05,0xc6,0x05,0xed,0x05,0x2e,0x05,0x08,0x05,0x3b,0x05,0x15,0x05,0x34,0x05,0x0e,0x05,0x35,0x05,0x0f,0x05,0x31,0x05,0x0b,0x05,0x32,0x05,0x0c,0x05,0x2d,0x04,0xfc,0x04,0xf6,0x05,0x07,0x05,0x2c,0x04,0xfa,0x04,0xf4,0x05,0x06,0x05,0x3a,0x05,0x55,0x05,0x4f,0x05,0x14,0x05,0x39,0x05,0x53,0x05,0x4d, -0x05,0x12,0x05,0x3e,0x05,0x61,0x05,0x4e,0x04,0xf7,0x05,0x5e,0x04,0xfd,0x05,0x54,0x05,0x18,0x05,0x3d,0x05,0x60,0x05,0x4c,0x04,0xf5,0x05,0x5d,0x04,0xfb,0x05,0x52,0x05,0x17,0x05,0x2b,0x05,0x1a,0x05,0x40,0x04,0xf9,0x04,0xf3,0x05,0x43,0x05,0x1d,0x05,0x05,0x05,0x38,0x05,0x1b,0x05,0x41,0x05,0x51,0x05,0x4b,0x05,0x44,0x05,0x1e, -0x05,0x11,0x05,0x3c,0x05,0x1c,0x05,0x42,0x05,0x5f,0x05,0x4a,0x04,0xf8,0x05,0x5c,0x05,0x20,0x05,0x46,0x05,0x19,0x05,0x3f,0x04,0xfe,0x05,0x50,0x05,0x45,0x05,0x1f,0x05,0x16,0x05,0x28,0x05,0x02,0x05,0x29,0x05,0x03,0x04,0xe8,0x04,0xec,0x05,0x01,0x04,0xf2,0x04,0xe7,0x05,0x00,0x04,0xf1,0x04,0xe6,0x05,0x58,0x05,0x49,0x04,0xeb, -0x05,0x57,0x05,0x48,0x04,0xea,0x05,0x64,0x05,0x5b,0x04,0xef,0x05,0x63,0x05,0x5a,0x04,0xee,0x04,0xff,0x04,0xf0,0x04,0xe5,0x05,0x56,0x05,0x47,0x04,0xe9,0x05,0x62,0x05,0x59,0x04,0xed,0x05,0x22,0x05,0x21,0x05,0x23,0x05,0x24,0x05,0x27,0x05,0x26,0x05,0x25,0x05,0x2f,0x05,0x36,0x05,0x33,0x05,0x2a,0x05,0x09,0x05,0x10,0x05,0x0d, -0x05,0x04,0x05,0x30,0x05,0x37,0x05,0x0a,0x05,0x13,0x04,0xa2,0x04,0x9a,0x04,0x9b,0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xaa,0x04,0xa9,0x04,0xa8,0x04,0xa7,0x04,0xa6,0x04,0xa5,0x04,0xa4,0x04,0xab,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xa3,0x04,0xd1,0x04,0xd5,0x04,0xdd,0x04,0xe1,0x04,0xd2,0x04,0xd6, -0x04,0xde,0x04,0xe2,0x04,0xd9,0x04,0xdb,0x04,0xd3,0x04,0xd7,0x04,0xdf,0x04,0xe3,0x04,0xd4,0x04,0xd8,0x04,0xe0,0x04,0xe4,0x04,0xda,0x04,0xdc,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc1,0x04,0xc7,0x04,0xbb,0x04,0xc0,0x04,0xc2,0x04,0xba,0x03,0x4c,0x03,0x4e,0x03,0x4b,0x03,0x4d,0x03,0x51,0x03,0x54,0x03,0xb6,0x03,0xb9,0x03,0xb4, -0x03,0xb7,0x03,0xb5,0x03,0xb8,0x00,0x0c,0x00,0x00,0x00,0x00,0x33,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x46,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x03,0xc0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x03,0xbe,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x03,0x2e,0x00,0x00,0x00,0x22,0x00,0x00, -0x00,0x22,0x00,0x00,0x03,0x6a,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x03,0x3a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x03,0xc5,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x25,0x00,0x00,0x04,0x38,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x05,0xb5,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x00, -0x03,0x6b,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x29,0x00,0x00,0x03,0x43,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x03,0x34,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x04,0x15,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x2c,0x00,0x00,0x03,0x2a,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x00,0x00,0x03,0x57,0x00,0x00, -0x00,0x2e,0x00,0x00,0x00,0x2e,0x00,0x00,0x03,0x29,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x2f,0x00,0x00,0x03,0x3d,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x39,0x00,0x00,0x02,0xd4,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x3b,0x00,0x00,0x03,0x2b,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3c,0x00,0x00,0x04,0x1c,0x00,0x00,0x00,0x3d,0x00,0x00, -0x00,0x3d,0x00,0x00,0x04,0x19,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3e,0x00,0x00,0x04,0x1b,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x03,0x30,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x05,0xb4,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x43,0x00,0x00, -0x00,0x1a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x43,0x00,0x00, -0x00,0x4a,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x50,0x00,0x00, -0x00,0x50,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x57,0x00,0x00, -0x00,0xa1,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x5b,0x00,0x00,0x03,0x47,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x5c,0x00,0x00,0x03,0x3e,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5d,0x00,0x00,0x03,0x48,0x00,0x00, -0x00,0x5e,0x00,0x00,0x00,0x5e,0x00,0x00,0x04,0x23,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x5f,0x00,0x00,0x03,0x5c,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x64,0x00,0x00, -0x00,0x64,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x6a,0x00,0x00, -0x01,0x0d,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x6b,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x6c,0x00,0x00,0x01,0x13,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x6e,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x6f,0x00,0x00,0x01,0x22,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0x3d,0x00,0x00, -0x00,0x71,0x00,0x00,0x00,0x72,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x01,0x44,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x74,0x00,0x00,0x01,0x4c,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x75,0x00,0x00,0x01,0x51,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x77,0x00,0x00,0x01,0x69,0x00,0x00,0x00,0x78,0x00,0x00, -0x00,0x79,0x00,0x00,0x01,0x6f,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x7a,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x03,0x45,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x7c,0x00,0x00,0x05,0xbe,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x7d,0x00,0x00,0x03,0x46,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x7e,0x00,0x00, -0x04,0x22,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xa0,0x00,0x00,0x03,0xbf,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0xa1,0x00,0x00,0x03,0x2f,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xa2,0x00,0x00,0x03,0xc3,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xa3,0x00,0x00,0x03,0xcb,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x03,0xc4,0x00,0x00, -0x00,0xa5,0x00,0x00,0x00,0xa5,0x00,0x00,0x03,0xcd,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xa6,0x00,0x00,0x05,0xbf,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xa7,0x00,0x00,0x05,0xb7,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xa8,0x00,0x00,0x06,0x80,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xa9,0x00,0x00,0x05,0xb8,0x00,0x00,0x00,0xaa,0x00,0x00, -0x00,0xaa,0x00,0x00,0x01,0xc6,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xab,0x00,0x00,0x03,0x65,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xac,0x00,0x00,0x04,0x21,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0xad,0x00,0x00,0x03,0x58,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x05,0xb9,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0xaf,0x00,0x00, -0x06,0x8a,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xb0,0x00,0x00,0x05,0xbb,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0xb1,0x00,0x00,0x04,0x1f,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xb3,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xb4,0x00,0x00,0x06,0x83,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0xb5,0x00,0x00,0x04,0x30,0x00,0x00, -0x00,0xb6,0x00,0x00,0x00,0xb6,0x00,0x00,0x05,0xb6,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xb8,0x00,0x00,0x06,0x8b,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xb9,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0xba,0x00,0x00,0x01,0xc7,0x00,0x00,0x00,0xbb,0x00,0x00, -0x00,0xbb,0x00,0x00,0x03,0x66,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbc,0x00,0x00,0x03,0x22,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xbd,0x00,0x00,0x03,0x21,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0xbe,0x00,0x00,0x03,0x23,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xbf,0x00,0x00,0x03,0x31,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00, -0x00,0x12,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x16,0x00,0x00, -0x00,0xc6,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0xcb,0x00,0x00, -0x00,0xcb,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0xd1,0x00,0x00, -0x00,0x5f,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x69,0x00,0x00, -0x00,0xd7,0x00,0x00,0x00,0xd7,0x00,0x00,0x04,0x17,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0xdd,0x00,0x00, -0x00,0xdd,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0xdf,0x00,0x00,0x01,0x4a,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0xe2,0x00,0x00, -0x00,0xc6,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0xda,0x00,0x00, -0x00,0xe8,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x08,0x00,0x00,0x00,0xed,0x00,0x00, -0x00,0xed,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0xef,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0xf1,0x00,0x00,0x01,0x21,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0xf2,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0xf3,0x00,0x00, -0x01,0x23,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0xf4,0x00,0x00,0x01,0x26,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0xf5,0x00,0x00,0x01,0x3b,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xf6,0x00,0x00,0x01,0x2c,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0xf7,0x00,0x00,0x04,0x18,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x00,0x00,0x01,0x39,0x00,0x00, -0x00,0xf9,0x00,0x00,0x00,0xf9,0x00,0x00,0x01,0x5c,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xfa,0x00,0x00,0x01,0x52,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xfc,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0xfd,0x00,0x00,0x01,0x71,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0xff,0x00,0x00, -0x00,0xff,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x01,0x04,0x00,0x00,0x01,0x04,0x00,0x00, -0x00,0x15,0x00,0x00,0x01,0x05,0x00,0x00,0x01,0x05,0x00,0x00,0x00,0xd1,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x1c,0x00,0x00,0x01,0x07,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0xd8,0x00,0x00,0x01,0x08,0x00,0x00,0x01,0x08,0x00,0x00,0x00,0x1f,0x00,0x00,0x01,0x09,0x00,0x00,0x01,0x09,0x00,0x00,0x00,0xdb,0x00,0x00, -0x01,0x0a,0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x0b,0x00,0x00,0x00,0xdc,0x00,0x00,0x01,0x0c,0x00,0x00,0x01,0x0c,0x00,0x00,0x00,0x1d,0x00,0x00,0x01,0x0d,0x00,0x00,0x01,0x0d,0x00,0x00,0x00,0xd9,0x00,0x00,0x01,0x0e,0x00,0x00,0x01,0x0e,0x00,0x00,0x00,0x23,0x00,0x00,0x01,0x0f,0x00,0x00, -0x01,0x0f,0x00,0x00,0x00,0xdf,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x11,0x00,0x00,0x00,0xe0,0x00,0x00,0x01,0x12,0x00,0x00,0x01,0x12,0x00,0x00,0x00,0x34,0x00,0x00,0x01,0x13,0x00,0x00,0x01,0x13,0x00,0x00,0x00,0xf0,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x14,0x00,0x00, -0x00,0x27,0x00,0x00,0x01,0x15,0x00,0x00,0x01,0x15,0x00,0x00,0x00,0xe3,0x00,0x00,0x01,0x16,0x00,0x00,0x01,0x16,0x00,0x00,0x00,0x30,0x00,0x00,0x01,0x17,0x00,0x00,0x01,0x17,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0x18,0x00,0x00,0x00,0x35,0x00,0x00,0x01,0x19,0x00,0x00,0x01,0x19,0x00,0x00,0x00,0xf1,0x00,0x00, -0x01,0x1a,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x28,0x00,0x00,0x01,0x1b,0x00,0x00,0x01,0x1b,0x00,0x00,0x00,0xe4,0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x3d,0x00,0x00,0x01,0x1d,0x00,0x00,0x01,0x1d,0x00,0x00,0x00,0xf9,0x00,0x00,0x01,0x1e,0x00,0x00,0x01,0x1e,0x00,0x00,0x00,0x3b,0x00,0x00,0x01,0x1f,0x00,0x00, -0x01,0x1f,0x00,0x00,0x00,0xf7,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,0x01,0x21,0x00,0x00,0x00,0xfb,0x00,0x00,0x01,0x22,0x00,0x00,0x01,0x22,0x00,0x00,0x00,0x3e,0x00,0x00,0x01,0x23,0x00,0x00,0x01,0x23,0x00,0x00,0x00,0xfa,0x00,0x00,0x01,0x24,0x00,0x00,0x01,0x24,0x00,0x00, -0x00,0x42,0x00,0x00,0x01,0x25,0x00,0x00,0x01,0x25,0x00,0x00,0x00,0xfe,0x00,0x00,0x01,0x26,0x00,0x00,0x01,0x26,0x00,0x00,0x00,0x41,0x00,0x00,0x01,0x27,0x00,0x00,0x01,0x27,0x00,0x00,0x00,0xfd,0x00,0x00,0x01,0x28,0x00,0x00,0x01,0x28,0x00,0x00,0x00,0x4e,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x0c,0x00,0x00, -0x01,0x2a,0x00,0x00,0x01,0x2a,0x00,0x00,0x00,0x4c,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x0a,0x00,0x00,0x01,0x2c,0x00,0x00,0x01,0x2c,0x00,0x00,0x00,0x45,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x2e,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0x4d,0x00,0x00,0x01,0x2f,0x00,0x00, -0x01,0x2f,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x30,0x00,0x00,0x01,0x30,0x00,0x00,0x00,0x48,0x00,0x00,0x01,0x31,0x00,0x00,0x01,0x31,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x34,0x00,0x00,0x01,0x34,0x00,0x00,0x00,0x50,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x0f,0x00,0x00,0x01,0x36,0x00,0x00,0x01,0x36,0x00,0x00, -0x00,0x52,0x00,0x00,0x01,0x37,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x39,0x00,0x00,0x01,0x39,0x00,0x00,0x00,0x54,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x3b,0x00,0x00,0x01,0x3b,0x00,0x00,0x00,0x56,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x17,0x00,0x00, -0x01,0x3d,0x00,0x00,0x01,0x3d,0x00,0x00,0x00,0x55,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x16,0x00,0x00,0x01,0x3f,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x57,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0x41,0x00,0x00,0x01,0x41,0x00,0x00,0x00,0x58,0x00,0x00,0x01,0x42,0x00,0x00, -0x01,0x42,0x00,0x00,0x01,0x19,0x00,0x00,0x01,0x43,0x00,0x00,0x01,0x43,0x00,0x00,0x00,0x5b,0x00,0x00,0x01,0x44,0x00,0x00,0x01,0x44,0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x45,0x00,0x00,0x01,0x45,0x00,0x00,0x00,0x5d,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x1f,0x00,0x00,0x01,0x47,0x00,0x00,0x01,0x47,0x00,0x00, -0x00,0x5c,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x1e,0x00,0x00,0x01,0x49,0x00,0x00,0x01,0x49,0x00,0x00,0x01,0x1d,0x00,0x00,0x01,0x4a,0x00,0x00,0x01,0x4a,0x00,0x00,0x00,0x5e,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x4c,0x00,0x00,0x01,0x4c,0x00,0x00,0x00,0x74,0x00,0x00, -0x01,0x4d,0x00,0x00,0x01,0x4d,0x00,0x00,0x01,0x37,0x00,0x00,0x01,0x4e,0x00,0x00,0x01,0x4e,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x24,0x00,0x00,0x01,0x50,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x73,0x00,0x00,0x01,0x51,0x00,0x00,0x01,0x51,0x00,0x00,0x01,0x36,0x00,0x00,0x01,0x52,0x00,0x00, -0x01,0x52,0x00,0x00,0x00,0x79,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x54,0x00,0x00,0x01,0x54,0x00,0x00,0x00,0x7e,0x00,0x00,0x01,0x55,0x00,0x00,0x01,0x55,0x00,0x00,0x01,0x41,0x00,0x00,0x01,0x56,0x00,0x00,0x01,0x56,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x57,0x00,0x00,0x01,0x57,0x00,0x00, -0x01,0x43,0x00,0x00,0x01,0x58,0x00,0x00,0x01,0x58,0x00,0x00,0x00,0x7f,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0x42,0x00,0x00,0x01,0x5a,0x00,0x00,0x01,0x5a,0x00,0x00,0x00,0x82,0x00,0x00,0x01,0x5b,0x00,0x00,0x01,0x5b,0x00,0x00,0x01,0x45,0x00,0x00,0x01,0x5c,0x00,0x00,0x01,0x5c,0x00,0x00,0x00,0x85,0x00,0x00, -0x01,0x5d,0x00,0x00,0x01,0x5d,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x5e,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x84,0x00,0x00,0x01,0x5f,0x00,0x00,0x01,0x5f,0x00,0x00,0x01,0x47,0x00,0x00,0x01,0x60,0x00,0x00,0x01,0x60,0x00,0x00,0x00,0x83,0x00,0x00,0x01,0x61,0x00,0x00,0x01,0x61,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x62,0x00,0x00, -0x01,0x62,0x00,0x00,0x00,0x8c,0x00,0x00,0x01,0x63,0x00,0x00,0x01,0x63,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x64,0x00,0x00,0x01,0x64,0x00,0x00,0x00,0x8b,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x4e,0x00,0x00,0x01,0x66,0x00,0x00,0x01,0x66,0x00,0x00,0x00,0x8a,0x00,0x00,0x01,0x67,0x00,0x00,0x01,0x67,0x00,0x00, -0x01,0x4d,0x00,0x00,0x01,0x68,0x00,0x00,0x01,0x68,0x00,0x00,0x00,0xa0,0x00,0x00,0x01,0x69,0x00,0x00,0x01,0x69,0x00,0x00,0x01,0x68,0x00,0x00,0x01,0x6a,0x00,0x00,0x01,0x6a,0x00,0x00,0x00,0x9d,0x00,0x00,0x01,0x6b,0x00,0x00,0x01,0x6b,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x6c,0x00,0x00,0x00,0x90,0x00,0x00, -0x01,0x6d,0x00,0x00,0x01,0x6d,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x6e,0x00,0x00,0x01,0x6e,0x00,0x00,0x00,0x9f,0x00,0x00,0x01,0x6f,0x00,0x00,0x01,0x6f,0x00,0x00,0x01,0x67,0x00,0x00,0x01,0x70,0x00,0x00,0x01,0x70,0x00,0x00,0x00,0x9c,0x00,0x00,0x01,0x71,0x00,0x00,0x01,0x71,0x00,0x00,0x01,0x64,0x00,0x00,0x01,0x72,0x00,0x00, -0x01,0x72,0x00,0x00,0x00,0x9e,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x66,0x00,0x00,0x01,0x74,0x00,0x00,0x01,0x74,0x00,0x00,0x00,0xa4,0x00,0x00,0x01,0x75,0x00,0x00,0x01,0x75,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x76,0x00,0x00,0x01,0x76,0x00,0x00,0x00,0xaa,0x00,0x00,0x01,0x77,0x00,0x00,0x01,0x77,0x00,0x00, -0x01,0x72,0x00,0x00,0x01,0x78,0x00,0x00,0x01,0x78,0x00,0x00,0x00,0xab,0x00,0x00,0x01,0x79,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0xb2,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7b,0x00,0x00,0x01,0x7b,0x00,0x00,0x00,0xb4,0x00,0x00,0x01,0x7c,0x00,0x00,0x01,0x7c,0x00,0x00,0x01,0x7c,0x00,0x00, -0x01,0x7d,0x00,0x00,0x01,0x7d,0x00,0x00,0x00,0xb3,0x00,0x00,0x01,0x7e,0x00,0x00,0x01,0x7e,0x00,0x00,0x01,0x7b,0x00,0x00,0x01,0x7f,0x00,0x00,0x01,0x7f,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x8f,0x00,0x00,0x01,0x8f,0x00,0x00,0x00,0x88,0x00,0x00,0x01,0x90,0x00,0x00,0x01,0x90,0x00,0x00,0x00,0x36,0x00,0x00,0x01,0x92,0x00,0x00, -0x01,0x92,0x00,0x00,0x03,0xc8,0x00,0x00,0x01,0x9b,0x00,0x00,0x01,0x9b,0x00,0x00,0x01,0x15,0x00,0x00,0x01,0xa0,0x00,0x00,0x01,0xa0,0x00,0x00,0x00,0x6d,0x00,0x00,0x01,0xa1,0x00,0x00,0x01,0xa1,0x00,0x00,0x01,0x30,0x00,0x00,0x01,0xaf,0x00,0x00,0x01,0xaf,0x00,0x00,0x00,0x96,0x00,0x00,0x01,0xb0,0x00,0x00,0x01,0xb0,0x00,0x00, -0x01,0x5e,0x00,0x00,0x01,0xcd,0x00,0x00,0x01,0xcd,0x00,0x00,0x00,0x09,0x00,0x00,0x01,0xce,0x00,0x00,0x01,0xce,0x00,0x00,0x00,0xc5,0x00,0x00,0x01,0xd0,0x00,0x00,0x01,0xd0,0x00,0x00,0x01,0x03,0x00,0x00,0x01,0xd2,0x00,0x00,0x01,0xd2,0x00,0x00,0x01,0x25,0x00,0x00,0x01,0xd4,0x00,0x00,0x01,0xd4,0x00,0x00,0x01,0x54,0x00,0x00, -0x01,0xd6,0x00,0x00,0x01,0xd6,0x00,0x00,0x01,0x5a,0x00,0x00,0x01,0xd8,0x00,0x00,0x01,0xd8,0x00,0x00,0x01,0x57,0x00,0x00,0x01,0xda,0x00,0x00,0x01,0xda,0x00,0x00,0x01,0x58,0x00,0x00,0x01,0xdc,0x00,0x00,0x01,0xdc,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0xe6,0x00,0x00,0x01,0xe6,0x00,0x00,0x00,0x3c,0x00,0x00,0x01,0xe7,0x00,0x00, -0x01,0xe7,0x00,0x00,0x00,0xf8,0x00,0x00,0x01,0xea,0x00,0x00,0x01,0xea,0x00,0x00,0x00,0x75,0x00,0x00,0x01,0xeb,0x00,0x00,0x01,0xeb,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0xf4,0x00,0x00,0x01,0xf4,0x00,0x00,0x00,0x3a,0x00,0x00,0x01,0xf5,0x00,0x00,0x01,0xf5,0x00,0x00,0x00,0xf6,0x00,0x00,0x01,0xfc,0x00,0x00,0x01,0xfc,0x00,0x00, -0x00,0x19,0x00,0x00,0x01,0xfd,0x00,0x00,0x01,0xfd,0x00,0x00,0x00,0xd5,0x00,0x00,0x01,0xfe,0x00,0x00,0x01,0xfe,0x00,0x00,0x00,0x77,0x00,0x00,0x01,0xff,0x00,0x00,0x01,0xff,0x00,0x00,0x01,0x3a,0x00,0x00,0x02,0x18,0x00,0x00,0x02,0x18,0x00,0x00,0x00,0x86,0x00,0x00,0x02,0x19,0x00,0x00,0x02,0x19,0x00,0x00,0x01,0x49,0x00,0x00, -0x02,0x1a,0x00,0x00,0x02,0x1a,0x00,0x00,0x00,0x8d,0x00,0x00,0x02,0x1b,0x00,0x00,0x02,0x1b,0x00,0x00,0x01,0x50,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x00,0xaf,0x00,0x00,0x02,0x33,0x00,0x00,0x02,0x33,0x00,0x00,0x01,0x77,0x00,0x00,0x02,0x37,0x00,0x00,0x02,0x37,0x00,0x00,0x01,0x0e,0x00,0x00,0x02,0x59,0x00,0x00, -0x02,0x59,0x00,0x00,0x00,0xf3,0x00,0x00,0x02,0xb9,0x00,0x00,0x02,0xb9,0x00,0x00,0x06,0x67,0x00,0x00,0x02,0xba,0x00,0x00,0x02,0xba,0x00,0x00,0x06,0x65,0x00,0x00,0x02,0xbc,0x00,0x00,0x02,0xbc,0x00,0x00,0x06,0x64,0x00,0x00,0x02,0xc6,0x00,0x00,0x02,0xc7,0x00,0x00,0x06,0x85,0x00,0x00,0x02,0xc9,0x00,0x00,0x02,0xc9,0x00,0x00, -0x06,0x66,0x00,0x00,0x02,0xd8,0x00,0x00,0x02,0xd8,0x00,0x00,0x06,0x87,0x00,0x00,0x02,0xd9,0x00,0x00,0x02,0xd9,0x00,0x00,0x06,0x81,0x00,0x00,0x02,0xda,0x00,0x00,0x02,0xda,0x00,0x00,0x06,0x88,0x00,0x00,0x02,0xdb,0x00,0x00,0x02,0xdb,0x00,0x00,0x06,0x8c,0x00,0x00,0x02,0xdc,0x00,0x00,0x02,0xdc,0x00,0x00,0x06,0x89,0x00,0x00, -0x02,0xdd,0x00,0x00,0x02,0xdd,0x00,0x00,0x06,0x84,0x00,0x00,0x02,0xf3,0x00,0x00,0x02,0xf3,0x00,0x00,0x06,0x03,0x00,0x00,0x02,0xf7,0x00,0x00,0x02,0xf7,0x00,0x00,0x06,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x06,0x6a,0x00,0x00,0x03,0x02,0x00,0x00,0x03,0x02,0x00,0x00,0x06,0x6e,0x00,0x00,0x03,0x03,0x00,0x00, -0x03,0x04,0x00,0x00,0x06,0x72,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x06,0x70,0x00,0x00,0x03,0x07,0x00,0x00,0x03,0x07,0x00,0x00,0x06,0x69,0x00,0x00,0x03,0x08,0x00,0x00,0x03,0x08,0x00,0x00,0x06,0x68,0x00,0x00,0x03,0x09,0x00,0x00,0x03,0x09,0x00,0x00,0x06,0x74,0x00,0x00,0x03,0x0a,0x00,0x00,0x03,0x0a,0x00,0x00, -0x06,0x71,0x00,0x00,0x03,0x0b,0x00,0x00,0x03,0x0b,0x00,0x00,0x06,0x6c,0x00,0x00,0x03,0x0c,0x00,0x00,0x03,0x0c,0x00,0x00,0x06,0x6f,0x00,0x00,0x03,0x0f,0x00,0x00,0x03,0x0f,0x00,0x00,0x06,0x75,0x00,0x00,0x03,0x12,0x00,0x00,0x03,0x12,0x00,0x00,0x06,0x76,0x00,0x00,0x03,0x1b,0x00,0x00,0x03,0x1b,0x00,0x00,0x06,0x77,0x00,0x00, -0x03,0x23,0x00,0x00,0x03,0x23,0x00,0x00,0x06,0x78,0x00,0x00,0x03,0x25,0x00,0x00,0x03,0x28,0x00,0x00,0x06,0x79,0x00,0x00,0x03,0x36,0x00,0x00,0x03,0x38,0x00,0x00,0x06,0x7d,0x00,0x00,0x03,0x74,0x00,0x00,0x03,0x75,0x00,0x00,0x06,0x62,0x00,0x00,0x03,0x7e,0x00,0x00,0x03,0x7e,0x00,0x00,0x03,0xbb,0x00,0x00,0x03,0x84,0x00,0x00, -0x03,0x84,0x00,0x00,0x06,0xb0,0x00,0x00,0x03,0x85,0x00,0x00,0x03,0x85,0x00,0x00,0x06,0xb2,0x00,0x00,0x03,0x86,0x00,0x00,0x03,0x86,0x00,0x00,0x02,0x69,0x00,0x00,0x03,0x87,0x00,0x00,0x03,0x87,0x00,0x00,0x03,0xba,0x00,0x00,0x03,0x88,0x00,0x00,0x03,0x8a,0x00,0x00,0x02,0x6a,0x00,0x00,0x03,0x8c,0x00,0x00,0x03,0x8c,0x00,0x00, -0x02,0x6d,0x00,0x00,0x03,0x8e,0x00,0x00,0x03,0x8f,0x00,0x00,0x02,0x6e,0x00,0x00,0x03,0x90,0x00,0x00,0x03,0x90,0x00,0x00,0x02,0x90,0x00,0x00,0x03,0x91,0x00,0x00,0x03,0xa1,0x00,0x00,0x02,0x51,0x00,0x00,0x03,0xa3,0x00,0x00,0x03,0xa9,0x00,0x00,0x02,0x62,0x00,0x00,0x03,0xaa,0x00,0x00,0x03,0xab,0x00,0x00,0x02,0x70,0x00,0x00, -0x03,0xac,0x00,0x00,0x03,0xae,0x00,0x00,0x02,0x96,0x00,0x00,0x03,0xaf,0x00,0x00,0x03,0xaf,0x00,0x00,0x02,0x8e,0x00,0x00,0x03,0xb0,0x00,0x00,0x03,0xb0,0x00,0x00,0x02,0x93,0x00,0x00,0x03,0xb1,0x00,0x00,0x03,0xc9,0x00,0x00,0x02,0x75,0x00,0x00,0x03,0xca,0x00,0x00,0x03,0xca,0x00,0x00,0x02,0x8f,0x00,0x00,0x03,0xcb,0x00,0x00, -0x03,0xcb,0x00,0x00,0x02,0x92,0x00,0x00,0x03,0xcc,0x00,0x00,0x03,0xcc,0x00,0x00,0x02,0x94,0x00,0x00,0x03,0xcd,0x00,0x00,0x03,0xcd,0x00,0x00,0x02,0x91,0x00,0x00,0x03,0xce,0x00,0x00,0x03,0xce,0x00,0x00,0x02,0x95,0x00,0x00,0x03,0xcf,0x00,0x00,0x03,0xcf,0x00,0x00,0x02,0x72,0x00,0x00,0x03,0xd5,0x00,0x00,0x03,0xd6,0x00,0x00, -0x02,0x9a,0x00,0x00,0x03,0xd7,0x00,0x00,0x03,0xd7,0x00,0x00,0x02,0x99,0x00,0x00,0x04,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0x01,0xd0,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x01,0xf6,0x00,0x00,0x04,0x03,0x00,0x00,0x04,0x03,0x00,0x00,0x01,0xcc,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x01,0xee,0x00,0x00, -0x04,0x05,0x00,0x00,0x04,0x05,0x00,0x00,0x01,0xed,0x00,0x00,0x04,0x06,0x00,0x00,0x04,0x08,0x00,0x00,0x01,0xf0,0x00,0x00,0x04,0x09,0x00,0x00,0x04,0x0a,0x00,0x00,0x01,0xeb,0x00,0x00,0x04,0x0b,0x00,0x00,0x04,0x0b,0x00,0x00,0x01,0xf3,0x00,0x00,0x04,0x0c,0x00,0x00,0x04,0x0c,0x00,0x00,0x01,0xd6,0x00,0x00,0x04,0x0e,0x00,0x00, -0x04,0x0e,0x00,0x00,0x01,0xe0,0x00,0x00,0x04,0x0f,0x00,0x00,0x04,0x0f,0x00,0x00,0x01,0xe7,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x13,0x00,0x00,0x01,0xc8,0x00,0x00,0x04,0x14,0x00,0x00,0x04,0x15,0x00,0x00,0x01,0xce,0x00,0x00,0x04,0x16,0x00,0x00,0x04,0x1a,0x00,0x00,0x01,0xd1,0x00,0x00,0x04,0x1b,0x00,0x00,0x04,0x23,0x00,0x00, -0x01,0xd7,0x00,0x00,0x04,0x24,0x00,0x00,0x04,0x25,0x00,0x00,0x01,0xe1,0x00,0x00,0x04,0x26,0x00,0x00,0x04,0x26,0x00,0x00,0x01,0xe4,0x00,0x00,0x04,0x27,0x00,0x00,0x04,0x27,0x00,0x00,0x01,0xe3,0x00,0x00,0x04,0x28,0x00,0x00,0x04,0x29,0x00,0x00,0x01,0xe5,0x00,0x00,0x04,0x2a,0x00,0x00,0x04,0x2b,0x00,0x00,0x01,0xe9,0x00,0x00, -0x04,0x2c,0x00,0x00,0x04,0x2c,0x00,0x00,0x01,0xe8,0x00,0x00,0x04,0x2d,0x00,0x00,0x04,0x2d,0x00,0x00,0x01,0xef,0x00,0x00,0x04,0x2e,0x00,0x00,0x04,0x2f,0x00,0x00,0x01,0xf4,0x00,0x00,0x04,0x30,0x00,0x00,0x04,0x33,0x00,0x00,0x02,0x0c,0x00,0x00,0x04,0x34,0x00,0x00,0x04,0x35,0x00,0x00,0x02,0x12,0x00,0x00,0x04,0x36,0x00,0x00, -0x04,0x3a,0x00,0x00,0x02,0x15,0x00,0x00,0x04,0x3b,0x00,0x00,0x04,0x43,0x00,0x00,0x02,0x1b,0x00,0x00,0x04,0x44,0x00,0x00,0x04,0x45,0x00,0x00,0x02,0x25,0x00,0x00,0x04,0x46,0x00,0x00,0x04,0x46,0x00,0x00,0x02,0x28,0x00,0x00,0x04,0x47,0x00,0x00,0x04,0x47,0x00,0x00,0x02,0x27,0x00,0x00,0x04,0x48,0x00,0x00,0x04,0x49,0x00,0x00, -0x02,0x29,0x00,0x00,0x04,0x4a,0x00,0x00,0x04,0x4b,0x00,0x00,0x02,0x2d,0x00,0x00,0x04,0x4c,0x00,0x00,0x04,0x4c,0x00,0x00,0x02,0x2c,0x00,0x00,0x04,0x4d,0x00,0x00,0x04,0x4d,0x00,0x00,0x02,0x33,0x00,0x00,0x04,0x4e,0x00,0x00,0x04,0x4f,0x00,0x00,0x02,0x38,0x00,0x00,0x04,0x51,0x00,0x00,0x04,0x51,0x00,0x00,0x02,0x14,0x00,0x00, -0x04,0x52,0x00,0x00,0x04,0x52,0x00,0x00,0x02,0x3a,0x00,0x00,0x04,0x53,0x00,0x00,0x04,0x53,0x00,0x00,0x02,0x10,0x00,0x00,0x04,0x54,0x00,0x00,0x04,0x54,0x00,0x00,0x02,0x32,0x00,0x00,0x04,0x55,0x00,0x00,0x04,0x55,0x00,0x00,0x02,0x31,0x00,0x00,0x04,0x56,0x00,0x00,0x04,0x58,0x00,0x00,0x02,0x34,0x00,0x00,0x04,0x59,0x00,0x00, -0x04,0x5a,0x00,0x00,0x02,0x2f,0x00,0x00,0x04,0x5b,0x00,0x00,0x04,0x5b,0x00,0x00,0x02,0x37,0x00,0x00,0x04,0x5c,0x00,0x00,0x04,0x5c,0x00,0x00,0x02,0x1a,0x00,0x00,0x04,0x5e,0x00,0x00,0x04,0x5e,0x00,0x00,0x02,0x24,0x00,0x00,0x04,0x5f,0x00,0x00,0x04,0x5f,0x00,0x00,0x02,0x2b,0x00,0x00,0x04,0x90,0x00,0x00,0x04,0x90,0x00,0x00, -0x01,0xcd,0x00,0x00,0x04,0x91,0x00,0x00,0x04,0x91,0x00,0x00,0x02,0x11,0x00,0x00,0x04,0x92,0x00,0x00,0x04,0x92,0x00,0x00,0x01,0xf7,0x00,0x00,0x04,0x93,0x00,0x00,0x04,0x93,0x00,0x00,0x02,0x3b,0x00,0x00,0x04,0x9a,0x00,0x00,0x04,0x9a,0x00,0x00,0x01,0xf8,0x00,0x00,0x04,0x9b,0x00,0x00,0x04,0x9b,0x00,0x00,0x02,0x3c,0x00,0x00, -0x04,0xa2,0x00,0x00,0x04,0xa2,0x00,0x00,0x01,0xf9,0x00,0x00,0x04,0xa3,0x00,0x00,0x04,0xa3,0x00,0x00,0x02,0x3d,0x00,0x00,0x04,0xae,0x00,0x00,0x04,0xae,0x00,0x00,0x01,0xfa,0x00,0x00,0x04,0xaf,0x00,0x00,0x04,0xaf,0x00,0x00,0x02,0x3e,0x00,0x00,0x04,0xb0,0x00,0x00,0x04,0xb0,0x00,0x00,0x01,0xfb,0x00,0x00,0x04,0xb1,0x00,0x00, -0x04,0xb1,0x00,0x00,0x02,0x3f,0x00,0x00,0x04,0xb6,0x00,0x00,0x04,0xb6,0x00,0x00,0x01,0xfc,0x00,0x00,0x04,0xb7,0x00,0x00,0x04,0xb7,0x00,0x00,0x02,0x40,0x00,0x00,0x04,0xba,0x00,0x00,0x04,0xba,0x00,0x00,0x01,0xfd,0x00,0x00,0x04,0xbb,0x00,0x00,0x04,0xbb,0x00,0x00,0x02,0x41,0x00,0x00,0x04,0xd8,0x00,0x00,0x04,0xd8,0x00,0x00, -0x01,0xfe,0x00,0x00,0x04,0xd9,0x00,0x00,0x04,0xd9,0x00,0x00,0x02,0x42,0x00,0x00,0x04,0xdc,0x00,0x00,0x04,0xdc,0x00,0x00,0x01,0xff,0x00,0x00,0x04,0xdd,0x00,0x00,0x04,0xdd,0x00,0x00,0x02,0x43,0x00,0x00,0x04,0xde,0x00,0x00,0x04,0xde,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0xdf,0x00,0x00,0x04,0xdf,0x00,0x00,0x02,0x44,0x00,0x00, -0x04,0xe4,0x00,0x00,0x04,0xe4,0x00,0x00,0x02,0x01,0x00,0x00,0x04,0xe5,0x00,0x00,0x04,0xe5,0x00,0x00,0x02,0x45,0x00,0x00,0x04,0xe6,0x00,0x00,0x04,0xe6,0x00,0x00,0x02,0x02,0x00,0x00,0x04,0xe7,0x00,0x00,0x04,0xe7,0x00,0x00,0x02,0x46,0x00,0x00,0x04,0xe8,0x00,0x00,0x04,0xe8,0x00,0x00,0x02,0x03,0x00,0x00,0x04,0xe9,0x00,0x00, -0x04,0xe9,0x00,0x00,0x02,0x47,0x00,0x00,0x04,0xf4,0x00,0x00,0x04,0xf4,0x00,0x00,0x02,0x04,0x00,0x00,0x04,0xf5,0x00,0x00,0x04,0xf5,0x00,0x00,0x02,0x48,0x00,0x00,0x0a,0xea,0x00,0x00,0x0a,0xea,0x00,0x00,0x03,0x28,0x00,0x00,0x1e,0x80,0x00,0x00,0x1e,0x80,0x00,0x00,0x00,0xa6,0x00,0x00,0x1e,0x81,0x00,0x00,0x1e,0x81,0x00,0x00, -0x01,0x6e,0x00,0x00,0x1e,0x82,0x00,0x00,0x1e,0x82,0x00,0x00,0x00,0xa3,0x00,0x00,0x1e,0x83,0x00,0x00,0x1e,0x83,0x00,0x00,0x01,0x6b,0x00,0x00,0x1e,0x84,0x00,0x00,0x1e,0x84,0x00,0x00,0x00,0xa5,0x00,0x00,0x1e,0x85,0x00,0x00,0x1e,0x85,0x00,0x00,0x01,0x6d,0x00,0x00,0x1e,0x9e,0x00,0x00,0x1e,0x9e,0x00,0x00,0x00,0x87,0x00,0x00, -0x1e,0xa0,0x00,0x00,0x1e,0xa0,0x00,0x00,0x00,0x11,0x00,0x00,0x1e,0xa1,0x00,0x00,0x1e,0xa1,0x00,0x00,0x00,0xcd,0x00,0x00,0x1e,0xa2,0x00,0x00,0x1e,0xa2,0x00,0x00,0x00,0x13,0x00,0x00,0x1e,0xa3,0x00,0x00,0x1e,0xa3,0x00,0x00,0x00,0xcf,0x00,0x00,0x1e,0xa4,0x00,0x00,0x1e,0xa4,0x00,0x00,0x00,0x0b,0x00,0x00,0x1e,0xa5,0x00,0x00, -0x1e,0xa5,0x00,0x00,0x00,0xc7,0x00,0x00,0x1e,0xa6,0x00,0x00,0x1e,0xa6,0x00,0x00,0x00,0x0d,0x00,0x00,0x1e,0xa7,0x00,0x00,0x1e,0xa7,0x00,0x00,0x00,0xc9,0x00,0x00,0x1e,0xa8,0x00,0x00,0x1e,0xa8,0x00,0x00,0x00,0x0e,0x00,0x00,0x1e,0xa9,0x00,0x00,0x1e,0xa9,0x00,0x00,0x00,0xca,0x00,0x00,0x1e,0xaa,0x00,0x00,0x1e,0xaa,0x00,0x00, -0x00,0x0f,0x00,0x00,0x1e,0xab,0x00,0x00,0x1e,0xab,0x00,0x00,0x00,0xcb,0x00,0x00,0x1e,0xac,0x00,0x00,0x1e,0xac,0x00,0x00,0x00,0x0c,0x00,0x00,0x1e,0xad,0x00,0x00,0x1e,0xad,0x00,0x00,0x00,0xc8,0x00,0x00,0x1e,0xae,0x00,0x00,0x1e,0xae,0x00,0x00,0x00,0x04,0x00,0x00,0x1e,0xaf,0x00,0x00,0x1e,0xaf,0x00,0x00,0x00,0xc0,0x00,0x00, -0x1e,0xb0,0x00,0x00,0x1e,0xb0,0x00,0x00,0x00,0x06,0x00,0x00,0x1e,0xb1,0x00,0x00,0x1e,0xb1,0x00,0x00,0x00,0xc2,0x00,0x00,0x1e,0xb2,0x00,0x00,0x1e,0xb2,0x00,0x00,0x00,0x07,0x00,0x00,0x1e,0xb3,0x00,0x00,0x1e,0xb3,0x00,0x00,0x00,0xc3,0x00,0x00,0x1e,0xb4,0x00,0x00,0x1e,0xb4,0x00,0x00,0x00,0x08,0x00,0x00,0x1e,0xb5,0x00,0x00, -0x1e,0xb5,0x00,0x00,0x00,0xc4,0x00,0x00,0x1e,0xb6,0x00,0x00,0x1e,0xb6,0x00,0x00,0x00,0x05,0x00,0x00,0x1e,0xb7,0x00,0x00,0x1e,0xb7,0x00,0x00,0x00,0xc1,0x00,0x00,0x1e,0xb8,0x00,0x00,0x1e,0xb8,0x00,0x00,0x00,0x31,0x00,0x00,0x1e,0xb9,0x00,0x00,0x1e,0xb9,0x00,0x00,0x00,0xed,0x00,0x00,0x1e,0xba,0x00,0x00,0x1e,0xba,0x00,0x00, -0x00,0x33,0x00,0x00,0x1e,0xbb,0x00,0x00,0x1e,0xbb,0x00,0x00,0x00,0xef,0x00,0x00,0x1e,0xbc,0x00,0x00,0x1e,0xbc,0x00,0x00,0x00,0x37,0x00,0x00,0x1e,0xbd,0x00,0x00,0x1e,0xbd,0x00,0x00,0x00,0xf2,0x00,0x00,0x1e,0xbe,0x00,0x00,0x1e,0xbe,0x00,0x00,0x00,0x2a,0x00,0x00,0x1e,0xbf,0x00,0x00,0x1e,0xbf,0x00,0x00,0x00,0xe6,0x00,0x00, -0x1e,0xc0,0x00,0x00,0x1e,0xc0,0x00,0x00,0x00,0x2c,0x00,0x00,0x1e,0xc1,0x00,0x00,0x1e,0xc1,0x00,0x00,0x00,0xe8,0x00,0x00,0x1e,0xc2,0x00,0x00,0x1e,0xc2,0x00,0x00,0x00,0x2d,0x00,0x00,0x1e,0xc3,0x00,0x00,0x1e,0xc3,0x00,0x00,0x00,0xe9,0x00,0x00,0x1e,0xc4,0x00,0x00,0x1e,0xc4,0x00,0x00,0x00,0x2e,0x00,0x00,0x1e,0xc5,0x00,0x00, -0x1e,0xc5,0x00,0x00,0x00,0xea,0x00,0x00,0x1e,0xc6,0x00,0x00,0x1e,0xc6,0x00,0x00,0x00,0x2b,0x00,0x00,0x1e,0xc7,0x00,0x00,0x1e,0xc7,0x00,0x00,0x00,0xe7,0x00,0x00,0x1e,0xc8,0x00,0x00,0x1e,0xc8,0x00,0x00,0x00,0x4b,0x00,0x00,0x1e,0xc9,0x00,0x00,0x1e,0xc9,0x00,0x00,0x01,0x09,0x00,0x00,0x1e,0xca,0x00,0x00,0x1e,0xca,0x00,0x00, -0x00,0x49,0x00,0x00,0x1e,0xcb,0x00,0x00,0x1e,0xcb,0x00,0x00,0x01,0x07,0x00,0x00,0x1e,0xcc,0x00,0x00,0x1e,0xcc,0x00,0x00,0x00,0x6a,0x00,0x00,0x1e,0xcd,0x00,0x00,0x1e,0xcd,0x00,0x00,0x01,0x2d,0x00,0x00,0x1e,0xce,0x00,0x00,0x1e,0xce,0x00,0x00,0x00,0x6c,0x00,0x00,0x1e,0xcf,0x00,0x00,0x1e,0xcf,0x00,0x00,0x01,0x2f,0x00,0x00, -0x1e,0xd0,0x00,0x00,0x1e,0xd0,0x00,0x00,0x00,0x64,0x00,0x00,0x1e,0xd1,0x00,0x00,0x1e,0xd1,0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0xd2,0x00,0x00,0x1e,0xd2,0x00,0x00,0x00,0x66,0x00,0x00,0x1e,0xd3,0x00,0x00,0x1e,0xd3,0x00,0x00,0x01,0x29,0x00,0x00,0x1e,0xd4,0x00,0x00,0x1e,0xd4,0x00,0x00,0x00,0x67,0x00,0x00,0x1e,0xd5,0x00,0x00, -0x1e,0xd5,0x00,0x00,0x01,0x2a,0x00,0x00,0x1e,0xd6,0x00,0x00,0x1e,0xd6,0x00,0x00,0x00,0x68,0x00,0x00,0x1e,0xd7,0x00,0x00,0x1e,0xd7,0x00,0x00,0x01,0x2b,0x00,0x00,0x1e,0xd8,0x00,0x00,0x1e,0xd8,0x00,0x00,0x00,0x65,0x00,0x00,0x1e,0xd9,0x00,0x00,0x1e,0xd9,0x00,0x00,0x01,0x28,0x00,0x00,0x1e,0xda,0x00,0x00,0x1e,0xda,0x00,0x00, -0x00,0x6e,0x00,0x00,0x1e,0xdb,0x00,0x00,0x1e,0xdb,0x00,0x00,0x01,0x31,0x00,0x00,0x1e,0xdc,0x00,0x00,0x1e,0xdc,0x00,0x00,0x00,0x70,0x00,0x00,0x1e,0xdd,0x00,0x00,0x1e,0xdd,0x00,0x00,0x01,0x33,0x00,0x00,0x1e,0xde,0x00,0x00,0x1e,0xde,0x00,0x00,0x00,0x71,0x00,0x00,0x1e,0xdf,0x00,0x00,0x1e,0xdf,0x00,0x00,0x01,0x34,0x00,0x00, -0x1e,0xe0,0x00,0x00,0x1e,0xe0,0x00,0x00,0x00,0x72,0x00,0x00,0x1e,0xe1,0x00,0x00,0x1e,0xe1,0x00,0x00,0x01,0x35,0x00,0x00,0x1e,0xe2,0x00,0x00,0x1e,0xe2,0x00,0x00,0x00,0x6f,0x00,0x00,0x1e,0xe3,0x00,0x00,0x1e,0xe3,0x00,0x00,0x01,0x32,0x00,0x00,0x1e,0xe4,0x00,0x00,0x1e,0xe4,0x00,0x00,0x00,0x93,0x00,0x00,0x1e,0xe5,0x00,0x00, -0x1e,0xe5,0x00,0x00,0x01,0x5b,0x00,0x00,0x1e,0xe6,0x00,0x00,0x1e,0xe6,0x00,0x00,0x00,0x95,0x00,0x00,0x1e,0xe7,0x00,0x00,0x1e,0xe7,0x00,0x00,0x01,0x5d,0x00,0x00,0x1e,0xe8,0x00,0x00,0x1e,0xe8,0x00,0x00,0x00,0x97,0x00,0x00,0x1e,0xe9,0x00,0x00,0x1e,0xe9,0x00,0x00,0x01,0x5f,0x00,0x00,0x1e,0xea,0x00,0x00,0x1e,0xea,0x00,0x00, -0x00,0x99,0x00,0x00,0x1e,0xeb,0x00,0x00,0x1e,0xeb,0x00,0x00,0x01,0x61,0x00,0x00,0x1e,0xec,0x00,0x00,0x1e,0xec,0x00,0x00,0x00,0x9a,0x00,0x00,0x1e,0xed,0x00,0x00,0x1e,0xed,0x00,0x00,0x01,0x62,0x00,0x00,0x1e,0xee,0x00,0x00,0x1e,0xee,0x00,0x00,0x00,0x9b,0x00,0x00,0x1e,0xef,0x00,0x00,0x1e,0xef,0x00,0x00,0x01,0x63,0x00,0x00, -0x1e,0xf0,0x00,0x00,0x1e,0xf0,0x00,0x00,0x00,0x98,0x00,0x00,0x1e,0xf1,0x00,0x00,0x1e,0xf1,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0xf2,0x00,0x00,0x1e,0xf2,0x00,0x00,0x00,0xad,0x00,0x00,0x1e,0xf3,0x00,0x00,0x1e,0xf3,0x00,0x00,0x01,0x75,0x00,0x00,0x1e,0xf4,0x00,0x00,0x1e,0xf4,0x00,0x00,0x00,0xac,0x00,0x00,0x1e,0xf5,0x00,0x00, -0x1e,0xf5,0x00,0x00,0x01,0x74,0x00,0x00,0x1e,0xf6,0x00,0x00,0x1e,0xf6,0x00,0x00,0x00,0xae,0x00,0x00,0x1e,0xf7,0x00,0x00,0x1e,0xf7,0x00,0x00,0x01,0x76,0x00,0x00,0x1e,0xf8,0x00,0x00,0x1e,0xf8,0x00,0x00,0x00,0xb0,0x00,0x00,0x1e,0xf9,0x00,0x00,0x1e,0xf9,0x00,0x00,0x01,0x78,0x00,0x00,0x20,0x01,0x00,0x00,0x20,0x01,0x00,0x00, -0x03,0xbc,0x00,0x00,0x20,0x0b,0x00,0x00,0x20,0x0b,0x00,0x00,0x03,0xbd,0x00,0x00,0x20,0x10,0x00,0x00,0x20,0x10,0x00,0x00,0x03,0x5b,0x00,0x00,0x20,0x13,0x00,0x00,0x20,0x14,0x00,0x00,0x03,0x59,0x00,0x00,0x20,0x16,0x00,0x00,0x20,0x16,0x00,0x00,0x03,0x37,0x00,0x00,0x20,0x18,0x00,0x00,0x20,0x19,0x00,0x00,0x03,0x61,0x00,0x00, -0x20,0x1a,0x00,0x00,0x20,0x1a,0x00,0x00,0x03,0x5d,0x00,0x00,0x20,0x1b,0x00,0x00,0x20,0x1b,0x00,0x00,0x03,0x63,0x00,0x00,0x20,0x1c,0x00,0x00,0x20,0x1d,0x00,0x00,0x03,0x5f,0x00,0x00,0x20,0x1e,0x00,0x00,0x20,0x1e,0x00,0x00,0x03,0x5e,0x00,0x00,0x20,0x1f,0x00,0x00,0x20,0x1f,0x00,0x00,0x03,0x64,0x00,0x00,0x20,0x20,0x00,0x00, -0x20,0x20,0x00,0x00,0x05,0xc0,0x00,0x00,0x20,0x21,0x00,0x00,0x20,0x21,0x00,0x00,0x05,0xc2,0x00,0x00,0x20,0x22,0x00,0x00,0x20,0x22,0x00,0x00,0x03,0x33,0x00,0x00,0x20,0x24,0x00,0x00,0x20,0x24,0x00,0x00,0x03,0x3b,0x00,0x00,0x20,0x26,0x00,0x00,0x20,0x26,0x00,0x00,0x03,0x2d,0x00,0x00,0x20,0x30,0x00,0x00,0x20,0x30,0x00,0x00, -0x04,0x39,0x00,0x00,0x20,0x32,0x00,0x00,0x20,0x33,0x00,0x00,0x05,0xbc,0x00,0x00,0x20,0x34,0x00,0x00,0x20,0x34,0x00,0x00,0x03,0x69,0x00,0x00,0x20,0x39,0x00,0x00,0x20,0x3a,0x00,0x00,0x03,0x67,0x00,0x00,0x20,0x3c,0x00,0x00,0x20,0x3d,0x00,0x00,0x03,0x38,0x00,0x00,0x20,0x3e,0x00,0x00,0x20,0x3e,0x00,0x00,0x03,0x3c,0x00,0x00, -0x20,0x3f,0x00,0x00,0x20,0x3f,0x00,0x00,0x03,0x3f,0x00,0x00,0x20,0x44,0x00,0x00,0x20,0x44,0x00,0x00,0x03,0x20,0x00,0x00,0x20,0x45,0x00,0x00,0x20,0x46,0x00,0x00,0x03,0x35,0x00,0x00,0x20,0x70,0x00,0x00,0x20,0x70,0x00,0x00,0x03,0x02,0x00,0x00,0x20,0x74,0x00,0x00,0x20,0x79,0x00,0x00,0x03,0x06,0x00,0x00,0x20,0x7a,0x00,0x00, -0x20,0x7a,0x00,0x00,0x04,0x3b,0x00,0x00,0x20,0x7c,0x00,0x00,0x20,0x7c,0x00,0x00,0x03,0xe6,0x00,0x00,0x20,0x80,0x00,0x00,0x20,0x89,0x00,0x00,0x02,0xe4,0x00,0x00,0x20,0xab,0x00,0x00,0x20,0xac,0x00,0x00,0x03,0xc6,0x00,0x00,0x20,0xae,0x00,0x00,0x20,0xae,0x00,0x00,0x03,0xcc,0x00,0x00,0x20,0xb4,0x00,0x00,0x20,0xb4,0x00,0x00, -0x03,0xc9,0x00,0x00,0x20,0xbd,0x00,0x00,0x20,0xbd,0x00,0x00,0x03,0xca,0x00,0x00,0x20,0xbf,0x00,0x00,0x20,0xbf,0x00,0x00,0x03,0xc2,0x00,0x00,0x21,0x02,0x00,0x00,0x21,0x02,0x00,0x00,0x02,0xa2,0x00,0x00,0x21,0x0d,0x00,0x00,0x21,0x0d,0x00,0x00,0x02,0xa7,0x00,0x00,0x21,0x13,0x00,0x00,0x21,0x13,0x00,0x00,0x05,0xc1,0x00,0x00, -0x21,0x15,0x00,0x00,0x21,0x15,0x00,0x00,0x02,0xad,0x00,0x00,0x21,0x16,0x00,0x00,0x21,0x16,0x00,0x00,0x05,0xc3,0x00,0x00,0x21,0x19,0x00,0x00,0x21,0x1a,0x00,0x00,0x02,0xaf,0x00,0x00,0x21,0x1d,0x00,0x00,0x21,0x1d,0x00,0x00,0x02,0xb1,0x00,0x00,0x21,0x22,0x00,0x00,0x21,0x22,0x00,0x00,0x05,0xba,0x00,0x00,0x21,0x24,0x00,0x00, -0x21,0x24,0x00,0x00,0x02,0xb9,0x00,0x00,0x21,0x2e,0x00,0x00,0x21,0x2e,0x00,0x00,0x05,0xc4,0x00,0x00,0x21,0x40,0x00,0x00,0x21,0x40,0x00,0x00,0x04,0x5e,0x00,0x00,0x21,0x8a,0x00,0x00,0x21,0x8a,0x00,0x00,0x05,0xff,0x00,0x00,0x21,0x8b,0x00,0x00,0x21,0x8b,0x00,0x00,0x05,0xfe,0x00,0x00,0x21,0x90,0x00,0x00,0x21,0x90,0x00,0x00, -0x04,0x77,0x00,0x00,0x21,0x91,0x00,0x00,0x21,0x91,0x00,0x00,0x04,0x71,0x00,0x00,0x21,0x92,0x00,0x00,0x21,0x92,0x00,0x00,0x04,0x73,0x00,0x00,0x21,0x93,0x00,0x00,0x21,0x93,0x00,0x00,0x04,0x75,0x00,0x00,0x21,0x94,0x00,0x00,0x21,0x95,0x00,0x00,0x04,0x79,0x00,0x00,0x21,0x96,0x00,0x00,0x21,0x96,0x00,0x00,0x04,0x78,0x00,0x00, -0x21,0x97,0x00,0x00,0x21,0x97,0x00,0x00,0x04,0x72,0x00,0x00,0x21,0x98,0x00,0x00,0x21,0x98,0x00,0x00,0x04,0x74,0x00,0x00,0x21,0x99,0x00,0x00,0x21,0x99,0x00,0x00,0x04,0x76,0x00,0x00,0x21,0x9d,0x00,0x00,0x21,0x9d,0x00,0x00,0x04,0x7b,0x00,0x00,0x21,0x9e,0x00,0x00,0x21,0x9e,0x00,0x00,0x04,0x7d,0x00,0x00,0x21,0xa0,0x00,0x00, -0x21,0xa0,0x00,0x00,0x04,0x7e,0x00,0x00,0x21,0xa2,0x00,0x00,0x21,0xa3,0x00,0x00,0x04,0x7f,0x00,0x00,0x21,0xa5,0x00,0x00,0x21,0xa7,0x00,0x00,0x04,0x81,0x00,0x00,0x21,0xa9,0x00,0x00,0x21,0xaa,0x00,0x00,0x04,0x85,0x00,0x00,0x21,0xad,0x00,0x00,0x21,0xad,0x00,0x00,0x04,0x7c,0x00,0x00,0x21,0xbe,0x00,0x00,0x21,0xbe,0x00,0x00, -0x04,0x87,0x00,0x00,0x21,0xc9,0x00,0x00,0x21,0xc9,0x00,0x00,0x04,0x88,0x00,0x00,0x21,0xd0,0x00,0x00,0x21,0xd0,0x00,0x00,0x04,0x8c,0x00,0x00,0x21,0xd1,0x00,0x00,0x21,0xd3,0x00,0x00,0x04,0x89,0x00,0x00,0x21,0xd4,0x00,0x00,0x21,0xd4,0x00,0x00,0x04,0x8d,0x00,0x00,0x21,0xdb,0x00,0x00,0x21,0xdb,0x00,0x00,0x04,0x8e,0x00,0x00, -0x21,0xde,0x00,0x00,0x21,0xde,0x00,0x00,0x05,0xe8,0x00,0x00,0x21,0xdf,0x00,0x00,0x21,0xdf,0x00,0x00,0x05,0xe7,0x00,0x00,0x21,0xe5,0x00,0x00,0x21,0xe5,0x00,0x00,0x04,0x84,0x00,0x00,0x21,0xe7,0x00,0x00,0x21,0xe8,0x00,0x00,0x04,0x8f,0x00,0x00,0x21,0xea,0x00,0x00,0x21,0xea,0x00,0x00,0x05,0xe2,0x00,0x00,0x22,0x00,0x00,0x00, -0x22,0x00,0x00,0x00,0x04,0x65,0x00,0x00,0x22,0x01,0x00,0x00,0x22,0x01,0x00,0x00,0x03,0xd6,0x00,0x00,0x22,0x02,0x00,0x00,0x22,0x02,0x00,0x00,0x04,0x2f,0x00,0x00,0x22,0x03,0x00,0x00,0x22,0x03,0x00,0x00,0x03,0xea,0x00,0x00,0x22,0x04,0x00,0x00,0x22,0x04,0x00,0x00,0x04,0x62,0x00,0x00,0x22,0x05,0x00,0x00,0x22,0x05,0x00,0x00, -0x04,0x25,0x00,0x00,0x22,0x06,0x00,0x00,0x22,0x06,0x00,0x00,0x04,0x2b,0x00,0x00,0x22,0x07,0x00,0x00,0x22,0x07,0x00,0x00,0x03,0xeb,0x00,0x00,0x22,0x08,0x00,0x00,0x22,0x08,0x00,0x00,0x03,0xe2,0x00,0x00,0x22,0x09,0x00,0x00,0x22,0x09,0x00,0x00,0x04,0x0b,0x00,0x00,0x22,0x0a,0x00,0x00,0x22,0x0a,0x00,0x00,0x03,0xe3,0x00,0x00, -0x22,0x0b,0x00,0x00,0x22,0x0b,0x00,0x00,0x04,0x5d,0x00,0x00,0x22,0x0c,0x00,0x00,0x22,0x0c,0x00,0x00,0x04,0x0a,0x00,0x00,0x22,0x0e,0x00,0x00,0x22,0x0e,0x00,0x00,0x03,0xe5,0x00,0x00,0x22,0x0f,0x00,0x00,0x22,0x0f,0x00,0x00,0x04,0x2c,0x00,0x00,0x22,0x10,0x00,0x00,0x22,0x10,0x00,0x00,0x03,0xd8,0x00,0x00,0x22,0x11,0x00,0x00, -0x22,0x11,0x00,0x00,0x04,0x2d,0x00,0x00,0x22,0x12,0x00,0x00,0x22,0x12,0x00,0x00,0x04,0x16,0x00,0x00,0x22,0x13,0x00,0x00,0x22,0x13,0x00,0x00,0x03,0xf9,0x00,0x00,0x22,0x15,0x00,0x00,0x22,0x15,0x00,0x00,0x03,0xdd,0x00,0x00,0x22,0x18,0x00,0x00,0x22,0x18,0x00,0x00,0x04,0x4d,0x00,0x00,0x22,0x19,0x00,0x00,0x22,0x19,0x00,0x00, -0x03,0xd4,0x00,0x00,0x22,0x1a,0x00,0x00,0x22,0x1a,0x00,0x00,0x04,0x2e,0x00,0x00,0x22,0x1e,0x00,0x00,0x22,0x1e,0x00,0x00,0x04,0x24,0x00,0x00,0x22,0x23,0x00,0x00,0x22,0x23,0x00,0x00,0x03,0xdc,0x00,0x00,0x22,0x24,0x00,0x00,0x22,0x24,0x00,0x00,0x03,0xde,0x00,0x00,0x22,0x25,0x00,0x00,0x22,0x25,0x00,0x00,0x04,0x31,0x00,0x00, -0x22,0x27,0x00,0x00,0x22,0x2b,0x00,0x00,0x04,0x26,0x00,0x00,0x22,0x34,0x00,0x00,0x22,0x34,0x00,0x00,0x04,0x63,0x00,0x00,0x22,0x35,0x00,0x00,0x22,0x35,0x00,0x00,0x03,0xd1,0x00,0x00,0x22,0x36,0x00,0x00,0x22,0x36,0x00,0x00,0x04,0x40,0x00,0x00,0x22,0x37,0x00,0x00,0x22,0x37,0x00,0x00,0x04,0x3e,0x00,0x00,0x22,0x38,0x00,0x00, -0x22,0x38,0x00,0x00,0x03,0xdf,0x00,0x00,0x22,0x39,0x00,0x00,0x22,0x39,0x00,0x00,0x03,0xe9,0x00,0x00,0x22,0x3c,0x00,0x00,0x22,0x3c,0x00,0x00,0x04,0x4e,0x00,0x00,0x22,0x3e,0x00,0x00,0x22,0x3e,0x00,0x00,0x03,0xed,0x00,0x00,0x22,0x43,0x00,0x00,0x22,0x43,0x00,0x00,0x03,0xd0,0x00,0x00,0x22,0x45,0x00,0x00,0x22,0x45,0x00,0x00, -0x03,0xd7,0x00,0x00,0x22,0x47,0x00,0x00,0x22,0x47,0x00,0x00,0x04,0x04,0x00,0x00,0x22,0x48,0x00,0x00,0x22,0x48,0x00,0x00,0x04,0x20,0x00,0x00,0x22,0x49,0x00,0x00,0x22,0x49,0x00,0x00,0x04,0x09,0x00,0x00,0x22,0x4b,0x00,0x00,0x22,0x4b,0x00,0x00,0x04,0x64,0x00,0x00,0x22,0x4d,0x00,0x00,0x22,0x4d,0x00,0x00,0x03,0xe8,0x00,0x00, -0x22,0x54,0x00,0x00,0x22,0x54,0x00,0x00,0x03,0xd5,0x00,0x00,0x22,0x57,0x00,0x00,0x22,0x57,0x00,0x00,0x04,0x4c,0x00,0x00,0x22,0x5f,0x00,0x00,0x22,0x5f,0x00,0x00,0x04,0x3f,0x00,0x00,0x22,0x60,0x00,0x00,0x22,0x60,0x00,0x00,0x04,0x1a,0x00,0x00,0x22,0x61,0x00,0x00,0x22,0x61,0x00,0x00,0x03,0xe7,0x00,0x00,0x22,0x62,0x00,0x00, -0x22,0x62,0x00,0x00,0x04,0x0f,0x00,0x00,0x22,0x63,0x00,0x00,0x22,0x63,0x00,0x00,0x04,0x5a,0x00,0x00,0x22,0x64,0x00,0x00,0x22,0x64,0x00,0x00,0x04,0x1e,0x00,0x00,0x22,0x65,0x00,0x00,0x22,0x65,0x00,0x00,0x04,0x1d,0x00,0x00,0x22,0x6a,0x00,0x00,0x22,0x6a,0x00,0x00,0x03,0xfb,0x00,0x00,0x22,0x6b,0x00,0x00,0x22,0x6b,0x00,0x00, -0x03,0xfa,0x00,0x00,0x22,0x6c,0x00,0x00,0x22,0x6c,0x00,0x00,0x03,0xd2,0x00,0x00,0x22,0x6d,0x00,0x00,0x22,0x6d,0x00,0x00,0x04,0x0c,0x00,0x00,0x22,0x6e,0x00,0x00,0x22,0x6e,0x00,0x00,0x04,0x10,0x00,0x00,0x22,0x6f,0x00,0x00,0x22,0x6f,0x00,0x00,0x04,0x0d,0x00,0x00,0x22,0x70,0x00,0x00,0x22,0x70,0x00,0x00,0x04,0x11,0x00,0x00, -0x22,0x71,0x00,0x00,0x22,0x71,0x00,0x00,0x04,0x0e,0x00,0x00,0x22,0x72,0x00,0x00,0x22,0x72,0x00,0x00,0x03,0xf7,0x00,0x00,0x22,0x73,0x00,0x00,0x22,0x73,0x00,0x00,0x03,0xec,0x00,0x00,0x22,0x7a,0x00,0x00,0x22,0x7a,0x00,0x00,0x04,0x3c,0x00,0x00,0x22,0x7b,0x00,0x00,0x22,0x7b,0x00,0x00,0x04,0x5c,0x00,0x00,0x22,0x7c,0x00,0x00, -0x22,0x7c,0x00,0x00,0x04,0x3d,0x00,0x00,0x22,0x82,0x00,0x00,0x22,0x82,0x00,0x00,0x04,0x5b,0x00,0x00,0x22,0x83,0x00,0x00,0x22,0x83,0x00,0x00,0x04,0x5f,0x00,0x00,0x22,0x84,0x00,0x00,0x22,0x85,0x00,0x00,0x04,0x13,0x00,0x00,0x22,0x86,0x00,0x00,0x22,0x87,0x00,0x00,0x04,0x41,0x00,0x00,0x22,0x88,0x00,0x00,0x22,0x89,0x00,0x00, -0x04,0x05,0x00,0x00,0x22,0x8e,0x00,0x00,0x22,0x8e,0x00,0x00,0x03,0xfd,0x00,0x00,0x22,0x8f,0x00,0x00,0x22,0x8f,0x00,0x00,0x04,0x55,0x00,0x00,0x22,0x90,0x00,0x00,0x22,0x90,0x00,0x00,0x04,0x57,0x00,0x00,0x22,0x91,0x00,0x00,0x22,0x91,0x00,0x00,0x04,0x56,0x00,0x00,0x22,0x92,0x00,0x00,0x22,0x92,0x00,0x00,0x04,0x58,0x00,0x00, -0x22,0x93,0x00,0x00,0x22,0x94,0x00,0x00,0x04,0x4f,0x00,0x00,0x22,0x95,0x00,0x00,0x22,0x95,0x00,0x00,0x04,0x70,0x00,0x00,0x22,0x96,0x00,0x00,0x22,0x97,0x00,0x00,0x04,0x6d,0x00,0x00,0x22,0x98,0x00,0x00,0x22,0x98,0x00,0x00,0x04,0x6c,0x00,0x00,0x22,0x99,0x00,0x00,0x22,0x99,0x00,0x00,0x04,0x6f,0x00,0x00,0x22,0x9b,0x00,0x00, -0x22,0x9b,0x00,0x00,0x04,0x69,0x00,0x00,0x22,0x9c,0x00,0x00,0x22,0x9c,0x00,0x00,0x04,0x6b,0x00,0x00,0x22,0x9d,0x00,0x00,0x22,0x9d,0x00,0x00,0x04,0x6a,0x00,0x00,0x22,0x9e,0x00,0x00,0x22,0x9e,0x00,0x00,0x04,0x53,0x00,0x00,0x22,0x9f,0x00,0x00,0x22,0x9f,0x00,0x00,0x04,0x52,0x00,0x00,0x22,0xa0,0x00,0x00,0x22,0xa0,0x00,0x00, -0x04,0x54,0x00,0x00,0x22,0xa1,0x00,0x00,0x22,0xa1,0x00,0x00,0x04,0x51,0x00,0x00,0x22,0xa2,0x00,0x00,0x22,0xa2,0x00,0x00,0x04,0x4b,0x00,0x00,0x22,0xa3,0x00,0x00,0x22,0xa3,0x00,0x00,0x04,0x61,0x00,0x00,0x22,0xa4,0x00,0x00,0x22,0xa4,0x00,0x00,0x04,0x60,0x00,0x00,0x22,0xa5,0x00,0x00,0x22,0xa5,0x00,0x00,0x04,0x67,0x00,0x00, -0x22,0xb4,0x00,0x00,0x22,0xb4,0x00,0x00,0x04,0x08,0x00,0x00,0x22,0xb8,0x00,0x00,0x22,0xb8,0x00,0x00,0x03,0xfc,0x00,0x00,0x22,0xbb,0x00,0x00,0x22,0xbb,0x00,0x00,0x04,0x68,0x00,0x00,0x22,0xbc,0x00,0x00,0x22,0xbc,0x00,0x00,0x04,0x01,0x00,0x00,0x22,0xbd,0x00,0x00,0x22,0xbd,0x00,0x00,0x04,0x07,0x00,0x00,0x22,0xc2,0x00,0x00, -0x22,0xc3,0x00,0x00,0x04,0x02,0x00,0x00,0x22,0xc4,0x00,0x00,0x22,0xc4,0x00,0x00,0x03,0xdb,0x00,0x00,0x22,0xc6,0x00,0x00,0x22,0xc6,0x00,0x00,0x04,0x59,0x00,0x00,0x22,0xc8,0x00,0x00,0x22,0xc8,0x00,0x00,0x03,0xd3,0x00,0x00,0x22,0xc9,0x00,0x00,0x22,0xc9,0x00,0x00,0x03,0xf3,0x00,0x00,0x22,0xca,0x00,0x00,0x22,0xca,0x00,0x00, -0x04,0x47,0x00,0x00,0x22,0xce,0x00,0x00,0x22,0xce,0x00,0x00,0x03,0xda,0x00,0x00,0x22,0xd0,0x00,0x00,0x22,0xd0,0x00,0x00,0x03,0xe0,0x00,0x00,0x22,0xe2,0x00,0x00,0x22,0xe2,0x00,0x00,0x04,0x12,0x00,0x00,0x22,0xee,0x00,0x00,0x22,0xee,0x00,0x00,0x03,0xe4,0x00,0x00,0x22,0xef,0x00,0x00,0x22,0xef,0x00,0x00,0x03,0xf8,0x00,0x00, -0x22,0xf0,0x00,0x00,0x22,0xf0,0x00,0x00,0x04,0x66,0x00,0x00,0x22,0xf1,0x00,0x00,0x22,0xf1,0x00,0x00,0x03,0xe1,0x00,0x00,0x23,0x02,0x00,0x00,0x23,0x02,0x00,0x00,0x05,0xe1,0x00,0x00,0x23,0x03,0x00,0x00,0x23,0x03,0x00,0x00,0x05,0xca,0x00,0x00,0x23,0x04,0x00,0x00,0x23,0x04,0x00,0x00,0x04,0x91,0x00,0x00,0x23,0x05,0x00,0x00, -0x23,0x05,0x00,0x00,0x05,0xf4,0x00,0x00,0x23,0x08,0x00,0x00,0x23,0x08,0x00,0x00,0x03,0x4f,0x00,0x00,0x23,0x09,0x00,0x00,0x23,0x09,0x00,0x00,0x03,0x52,0x00,0x00,0x23,0x0a,0x00,0x00,0x23,0x0a,0x00,0x00,0x03,0x50,0x00,0x00,0x23,0x0b,0x00,0x00,0x23,0x0b,0x00,0x00,0x03,0x53,0x00,0x00,0x23,0x18,0x00,0x00,0x23,0x18,0x00,0x00, -0x05,0xe9,0x00,0x00,0x23,0x1c,0x00,0x00,0x23,0x1c,0x00,0x00,0x05,0xce,0x00,0x00,0x23,0x1d,0x00,0x00,0x23,0x1d,0x00,0x00,0x05,0xcd,0x00,0x00,0x23,0x1e,0x00,0x00,0x23,0x1f,0x00,0x00,0x05,0xcb,0x00,0x00,0x23,0x24,0x00,0x00,0x23,0x24,0x00,0x00,0x04,0x92,0x00,0x00,0x23,0x25,0x00,0x00,0x23,0x25,0x00,0x00,0x05,0xe6,0x00,0x00, -0x23,0x26,0x00,0x00,0x23,0x26,0x00,0x00,0x05,0xe4,0x00,0x00,0x23,0x28,0x00,0x00,0x23,0x28,0x00,0x00,0x05,0xe5,0x00,0x00,0x23,0x2b,0x00,0x00,0x23,0x2b,0x00,0x00,0x05,0xe3,0x00,0x00,0x23,0x36,0x00,0x00,0x23,0x36,0x00,0x00,0x05,0x65,0x00,0x00,0x23,0x37,0x00,0x00,0x23,0x37,0x00,0x00,0x05,0xa0,0x00,0x00,0x23,0x38,0x00,0x00, -0x23,0x38,0x00,0x00,0x05,0x8f,0x00,0x00,0x23,0x39,0x00,0x00,0x23,0x39,0x00,0x00,0x05,0x8c,0x00,0x00,0x23,0x3a,0x00,0x00,0x23,0x3a,0x00,0x00,0x05,0x8b,0x00,0x00,0x23,0x3b,0x00,0x00,0x23,0x3b,0x00,0x00,0x05,0x91,0x00,0x00,0x23,0x3c,0x00,0x00,0x23,0x3c,0x00,0x00,0x05,0x87,0x00,0x00,0x23,0x3d,0x00,0x00,0x23,0x3d,0x00,0x00, -0x05,0x6d,0x00,0x00,0x23,0x3e,0x00,0x00,0x23,0x3e,0x00,0x00,0x05,0x6b,0x00,0x00,0x23,0x3f,0x00,0x00,0x23,0x3f,0x00,0x00,0x05,0x9f,0x00,0x00,0x23,0x40,0x00,0x00,0x23,0x40,0x00,0x00,0x05,0x68,0x00,0x00,0x23,0x41,0x00,0x00,0x23,0x41,0x00,0x00,0x05,0x97,0x00,0x00,0x23,0x42,0x00,0x00,0x23,0x42,0x00,0x00,0x05,0x86,0x00,0x00, -0x23,0x43,0x00,0x00,0x23,0x43,0x00,0x00,0x05,0x93,0x00,0x00,0x23,0x44,0x00,0x00,0x23,0x44,0x00,0x00,0x05,0x90,0x00,0x00,0x23,0x45,0x00,0x00,0x23,0x45,0x00,0x00,0x05,0x82,0x00,0x00,0x23,0x46,0x00,0x00,0x23,0x46,0x00,0x00,0x05,0x9d,0x00,0x00,0x23,0x47,0x00,0x00,0x23,0x47,0x00,0x00,0x05,0x92,0x00,0x00,0x23,0x48,0x00,0x00, -0x23,0x48,0x00,0x00,0x05,0x96,0x00,0x00,0x23,0x49,0x00,0x00,0x23,0x49,0x00,0x00,0x05,0x69,0x00,0x00,0x23,0x4a,0x00,0x00,0x23,0x4a,0x00,0x00,0x05,0x79,0x00,0x00,0x23,0x4b,0x00,0x00,0x23,0x4b,0x00,0x00,0x05,0x72,0x00,0x00,0x23,0x4c,0x00,0x00,0x23,0x4c,0x00,0x00,0x05,0x8e,0x00,0x00,0x23,0x4d,0x00,0x00,0x23,0x4d,0x00,0x00, -0x05,0x8a,0x00,0x00,0x23,0x4e,0x00,0x00,0x23,0x4e,0x00,0x00,0x05,0x78,0x00,0x00,0x23,0x4f,0x00,0x00,0x23,0x4f,0x00,0x00,0x05,0xa9,0x00,0x00,0x23,0x50,0x00,0x00,0x23,0x50,0x00,0x00,0x05,0x98,0x00,0x00,0x23,0x51,0x00,0x00,0x23,0x51,0x00,0x00,0x05,0xa8,0x00,0x00,0x23,0x52,0x00,0x00,0x23,0x52,0x00,0x00,0x05,0x71,0x00,0x00, -0x23,0x53,0x00,0x00,0x23,0x53,0x00,0x00,0x05,0x99,0x00,0x00,0x23,0x54,0x00,0x00,0x23,0x54,0x00,0x00,0x05,0x89,0x00,0x00,0x23,0x55,0x00,0x00,0x23,0x55,0x00,0x00,0x05,0xa7,0x00,0x00,0x23,0x56,0x00,0x00,0x23,0x56,0x00,0x00,0x05,0x7a,0x00,0x00,0x23,0x57,0x00,0x00,0x23,0x57,0x00,0x00,0x05,0x8d,0x00,0x00,0x23,0x58,0x00,0x00, -0x23,0x58,0x00,0x00,0x05,0x9b,0x00,0x00,0x23,0x59,0x00,0x00,0x23,0x59,0x00,0x00,0x05,0x73,0x00,0x00,0x23,0x5a,0x00,0x00,0x23,0x5a,0x00,0x00,0x05,0x75,0x00,0x00,0x23,0x5b,0x00,0x00,0x23,0x5b,0x00,0x00,0x05,0x80,0x00,0x00,0x23,0x5c,0x00,0x00,0x23,0x5c,0x00,0x00,0x05,0x6e,0x00,0x00,0x23,0x5d,0x00,0x00,0x23,0x5d,0x00,0x00, -0x05,0xa5,0x00,0x00,0x23,0x5e,0x00,0x00,0x23,0x5e,0x00,0x00,0x05,0x9a,0x00,0x00,0x23,0x5f,0x00,0x00,0x23,0x5f,0x00,0x00,0x05,0x6c,0x00,0x00,0x23,0x60,0x00,0x00,0x23,0x60,0x00,0x00,0x05,0x88,0x00,0x00,0x23,0x61,0x00,0x00,0x23,0x61,0x00,0x00,0x05,0xa6,0x00,0x00,0x23,0x62,0x00,0x00,0x23,0x62,0x00,0x00,0x05,0x70,0x00,0x00, -0x23,0x63,0x00,0x00,0x23,0x63,0x00,0x00,0x05,0xa1,0x00,0x00,0x23,0x64,0x00,0x00,0x23,0x64,0x00,0x00,0x05,0x7f,0x00,0x00,0x23,0x65,0x00,0x00,0x23,0x65,0x00,0x00,0x05,0x6a,0x00,0x00,0x23,0x66,0x00,0x00,0x23,0x66,0x00,0x00,0x05,0x77,0x00,0x00,0x23,0x67,0x00,0x00,0x23,0x67,0x00,0x00,0x05,0x81,0x00,0x00,0x23,0x68,0x00,0x00, -0x23,0x68,0x00,0x00,0x05,0xa3,0x00,0x00,0x23,0x69,0x00,0x00,0x23,0x69,0x00,0x00,0x05,0x7c,0x00,0x00,0x23,0x6a,0x00,0x00,0x23,0x6a,0x00,0x00,0x05,0x6f,0x00,0x00,0x23,0x6b,0x00,0x00,0x23,0x6b,0x00,0x00,0x05,0x74,0x00,0x00,0x23,0x6c,0x00,0x00,0x23,0x6c,0x00,0x00,0x05,0xaa,0x00,0x00,0x23,0x6d,0x00,0x00,0x23,0x6d,0x00,0x00, -0x05,0xa2,0x00,0x00,0x23,0x6e,0x00,0x00,0x23,0x6e,0x00,0x00,0x05,0x9e,0x00,0x00,0x23,0x6f,0x00,0x00,0x23,0x70,0x00,0x00,0x05,0x94,0x00,0x00,0x23,0x71,0x00,0x00,0x23,0x71,0x00,0x00,0x05,0x76,0x00,0x00,0x23,0x72,0x00,0x00,0x23,0x72,0x00,0x00,0x05,0xa4,0x00,0x00,0x23,0x73,0x00,0x00,0x23,0x73,0x00,0x00,0x05,0x7d,0x00,0x00, -0x23,0x74,0x00,0x00,0x23,0x74,0x00,0x00,0x05,0x9c,0x00,0x00,0x23,0x75,0x00,0x00,0x23,0x75,0x00,0x00,0x05,0x83,0x00,0x00,0x23,0x76,0x00,0x00,0x23,0x76,0x00,0x00,0x05,0x67,0x00,0x00,0x23,0x77,0x00,0x00,0x23,0x77,0x00,0x00,0x05,0x7b,0x00,0x00,0x23,0x78,0x00,0x00,0x23,0x78,0x00,0x00,0x05,0x7e,0x00,0x00,0x23,0x79,0x00,0x00, -0x23,0x79,0x00,0x00,0x05,0x84,0x00,0x00,0x23,0x7a,0x00,0x00,0x23,0x7a,0x00,0x00,0x05,0x66,0x00,0x00,0x23,0x89,0x00,0x00,0x23,0x89,0x00,0x00,0x05,0xe0,0x00,0x00,0x23,0x8a,0x00,0x00,0x23,0x8a,0x00,0x00,0x05,0xd5,0x00,0x00,0x23,0x8b,0x00,0x00,0x23,0x8b,0x00,0x00,0x05,0xc7,0x00,0x00,0x23,0x95,0x00,0x00,0x23,0x95,0x00,0x00, -0x05,0x85,0x00,0x00,0x23,0x9b,0x00,0x00,0x23,0x9b,0x00,0x00,0x04,0x34,0x00,0x00,0x23,0x9c,0x00,0x00,0x23,0x9d,0x00,0x00,0x04,0x32,0x00,0x00,0x23,0x9e,0x00,0x00,0x23,0x9e,0x00,0x00,0x04,0x37,0x00,0x00,0x23,0x9f,0x00,0x00,0x23,0xa0,0x00,0x00,0x04,0x35,0x00,0x00,0x23,0xa1,0x00,0x00,0x23,0xa1,0x00,0x00,0x03,0xf6,0x00,0x00, -0x23,0xa2,0x00,0x00,0x23,0xa3,0x00,0x00,0x03,0xf4,0x00,0x00,0x23,0xa4,0x00,0x00,0x23,0xa4,0x00,0x00,0x04,0x4a,0x00,0x00,0x23,0xa5,0x00,0x00,0x23,0xa6,0x00,0x00,0x04,0x48,0x00,0x00,0x23,0xa7,0x00,0x00,0x23,0xa7,0x00,0x00,0x03,0xf2,0x00,0x00,0x23,0xa8,0x00,0x00,0x23,0xa8,0x00,0x00,0x03,0xf1,0x00,0x00,0x23,0xa9,0x00,0x00, -0x23,0xa9,0x00,0x00,0x03,0xf0,0x00,0x00,0x23,0xaa,0x00,0x00,0x23,0xaa,0x00,0x00,0x03,0xd9,0x00,0x00,0x23,0xab,0x00,0x00,0x23,0xab,0x00,0x00,0x04,0x46,0x00,0x00,0x23,0xac,0x00,0x00,0x23,0xac,0x00,0x00,0x04,0x45,0x00,0x00,0x23,0xad,0x00,0x00,0x23,0xad,0x00,0x00,0x04,0x44,0x00,0x00,0x23,0xce,0x00,0x00,0x23,0xce,0x00,0x00, -0x05,0xea,0x00,0x00,0x23,0xfb,0x00,0x00,0x23,0xfc,0x00,0x00,0x05,0xef,0x00,0x00,0x23,0xfd,0x00,0x00,0x23,0xfe,0x00,0x00,0x05,0xf2,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x05,0xee,0x00,0x00,0x24,0x01,0x00,0x00,0x24,0x02,0x00,0x00,0x05,0xfa,0x00,0x00,0x24,0x03,0x00,0x00,0x24,0x04,0x00,0x00,0x05,0xd7,0x00,0x00, -0x24,0x05,0x00,0x00,0x24,0x05,0x00,0x00,0x05,0xda,0x00,0x00,0x24,0x06,0x00,0x00,0x24,0x06,0x00,0x00,0x05,0xb2,0x00,0x00,0x24,0x07,0x00,0x00,0x24,0x07,0x00,0x00,0x05,0xc5,0x00,0x00,0x24,0x08,0x00,0x00,0x24,0x08,0x00,0x00,0x05,0xb3,0x00,0x00,0x24,0x09,0x00,0x00,0x24,0x09,0x00,0x00,0x05,0xdf,0x00,0x00,0x24,0x0a,0x00,0x00, -0x24,0x0a,0x00,0x00,0x05,0xeb,0x00,0x00,0x24,0x0b,0x00,0x00,0x24,0x0b,0x00,0x00,0x06,0x01,0x00,0x00,0x24,0x0c,0x00,0x00,0x24,0x0c,0x00,0x00,0x05,0xdd,0x00,0x00,0x24,0x0d,0x00,0x00,0x24,0x0d,0x00,0x00,0x05,0xc9,0x00,0x00,0x24,0x0e,0x00,0x00,0x24,0x0e,0x00,0x00,0x05,0xf8,0x00,0x00,0x24,0x0f,0x00,0x00,0x24,0x0f,0x00,0x00, -0x05,0xf7,0x00,0x00,0x24,0x10,0x00,0x00,0x24,0x10,0x00,0x00,0x05,0xcf,0x00,0x00,0x24,0x11,0x00,0x00,0x24,0x11,0x00,0x00,0x05,0xd2,0x00,0x00,0x24,0x12,0x00,0x00,0x24,0x12,0x00,0x00,0x05,0xd4,0x00,0x00,0x24,0x13,0x00,0x00,0x24,0x13,0x00,0x00,0x05,0xd3,0x00,0x00,0x24,0x14,0x00,0x00,0x24,0x14,0x00,0x00,0x05,0xd1,0x00,0x00, -0x24,0x15,0x00,0x00,0x24,0x15,0x00,0x00,0x05,0xec,0x00,0x00,0x24,0x16,0x00,0x00,0x24,0x16,0x00,0x00,0x05,0xfd,0x00,0x00,0x24,0x17,0x00,0x00,0x24,0x17,0x00,0x00,0x05,0xd9,0x00,0x00,0x24,0x18,0x00,0x00,0x24,0x18,0x00,0x00,0x05,0xc8,0x00,0x00,0x24,0x19,0x00,0x00,0x24,0x19,0x00,0x00,0x05,0xd6,0x00,0x00,0x24,0x1a,0x00,0x00, -0x24,0x1a,0x00,0x00,0x05,0xfc,0x00,0x00,0x24,0x1b,0x00,0x00,0x24,0x1c,0x00,0x00,0x05,0xdb,0x00,0x00,0x24,0x1d,0x00,0x00,0x24,0x1d,0x00,0x00,0x05,0xde,0x00,0x00,0x24,0x1e,0x00,0x00,0x24,0x1e,0x00,0x00,0x05,0xf5,0x00,0x00,0x24,0x1f,0x00,0x00,0x24,0x1f,0x00,0x00,0x06,0x00,0x00,0x00,0x24,0x20,0x00,0x00,0x24,0x20,0x00,0x00, -0x05,0xf9,0x00,0x00,0x24,0x21,0x00,0x00,0x24,0x21,0x00,0x00,0x05,0xd0,0x00,0x00,0x24,0x23,0x00,0x00,0x24,0x23,0x00,0x00,0x05,0xc6,0x00,0x00,0x24,0x24,0x00,0x00,0x24,0x24,0x00,0x00,0x05,0xed,0x00,0x00,0x25,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x05,0x2e,0x00,0x00,0x25,0x01,0x00,0x00,0x25,0x01,0x00,0x00,0x05,0x08,0x00,0x00, -0x25,0x02,0x00,0x00,0x25,0x02,0x00,0x00,0x05,0x3b,0x00,0x00,0x25,0x03,0x00,0x00,0x25,0x03,0x00,0x00,0x05,0x15,0x00,0x00,0x25,0x04,0x00,0x00,0x25,0x04,0x00,0x00,0x05,0x34,0x00,0x00,0x25,0x05,0x00,0x00,0x25,0x05,0x00,0x00,0x05,0x0e,0x00,0x00,0x25,0x06,0x00,0x00,0x25,0x06,0x00,0x00,0x05,0x35,0x00,0x00,0x25,0x07,0x00,0x00, -0x25,0x07,0x00,0x00,0x05,0x0f,0x00,0x00,0x25,0x08,0x00,0x00,0x25,0x08,0x00,0x00,0x05,0x31,0x00,0x00,0x25,0x09,0x00,0x00,0x25,0x09,0x00,0x00,0x05,0x0b,0x00,0x00,0x25,0x0a,0x00,0x00,0x25,0x0a,0x00,0x00,0x05,0x32,0x00,0x00,0x25,0x0b,0x00,0x00,0x25,0x0b,0x00,0x00,0x05,0x0c,0x00,0x00,0x25,0x0c,0x00,0x00,0x25,0x0c,0x00,0x00, -0x05,0x2d,0x00,0x00,0x25,0x0d,0x00,0x00,0x25,0x0d,0x00,0x00,0x04,0xfc,0x00,0x00,0x25,0x0e,0x00,0x00,0x25,0x0e,0x00,0x00,0x04,0xf6,0x00,0x00,0x25,0x0f,0x00,0x00,0x25,0x0f,0x00,0x00,0x05,0x07,0x00,0x00,0x25,0x10,0x00,0x00,0x25,0x10,0x00,0x00,0x05,0x2c,0x00,0x00,0x25,0x11,0x00,0x00,0x25,0x11,0x00,0x00,0x04,0xfa,0x00,0x00, -0x25,0x12,0x00,0x00,0x25,0x12,0x00,0x00,0x04,0xf4,0x00,0x00,0x25,0x13,0x00,0x00,0x25,0x13,0x00,0x00,0x05,0x06,0x00,0x00,0x25,0x14,0x00,0x00,0x25,0x14,0x00,0x00,0x05,0x3a,0x00,0x00,0x25,0x15,0x00,0x00,0x25,0x15,0x00,0x00,0x05,0x55,0x00,0x00,0x25,0x16,0x00,0x00,0x25,0x16,0x00,0x00,0x05,0x4f,0x00,0x00,0x25,0x17,0x00,0x00, -0x25,0x17,0x00,0x00,0x05,0x14,0x00,0x00,0x25,0x18,0x00,0x00,0x25,0x18,0x00,0x00,0x05,0x39,0x00,0x00,0x25,0x19,0x00,0x00,0x25,0x19,0x00,0x00,0x05,0x53,0x00,0x00,0x25,0x1a,0x00,0x00,0x25,0x1a,0x00,0x00,0x05,0x4d,0x00,0x00,0x25,0x1b,0x00,0x00,0x25,0x1b,0x00,0x00,0x05,0x12,0x00,0x00,0x25,0x1c,0x00,0x00,0x25,0x1c,0x00,0x00, -0x05,0x3e,0x00,0x00,0x25,0x1d,0x00,0x00,0x25,0x1d,0x00,0x00,0x05,0x61,0x00,0x00,0x25,0x1e,0x00,0x00,0x25,0x1e,0x00,0x00,0x05,0x4e,0x00,0x00,0x25,0x1f,0x00,0x00,0x25,0x1f,0x00,0x00,0x04,0xf7,0x00,0x00,0x25,0x20,0x00,0x00,0x25,0x20,0x00,0x00,0x05,0x5e,0x00,0x00,0x25,0x21,0x00,0x00,0x25,0x21,0x00,0x00,0x04,0xfd,0x00,0x00, -0x25,0x22,0x00,0x00,0x25,0x22,0x00,0x00,0x05,0x54,0x00,0x00,0x25,0x23,0x00,0x00,0x25,0x23,0x00,0x00,0x05,0x18,0x00,0x00,0x25,0x24,0x00,0x00,0x25,0x24,0x00,0x00,0x05,0x3d,0x00,0x00,0x25,0x25,0x00,0x00,0x25,0x25,0x00,0x00,0x05,0x60,0x00,0x00,0x25,0x26,0x00,0x00,0x25,0x26,0x00,0x00,0x05,0x4c,0x00,0x00,0x25,0x27,0x00,0x00, -0x25,0x27,0x00,0x00,0x04,0xf5,0x00,0x00,0x25,0x28,0x00,0x00,0x25,0x28,0x00,0x00,0x05,0x5d,0x00,0x00,0x25,0x29,0x00,0x00,0x25,0x29,0x00,0x00,0x04,0xfb,0x00,0x00,0x25,0x2a,0x00,0x00,0x25,0x2a,0x00,0x00,0x05,0x52,0x00,0x00,0x25,0x2b,0x00,0x00,0x25,0x2b,0x00,0x00,0x05,0x17,0x00,0x00,0x25,0x2c,0x00,0x00,0x25,0x2c,0x00,0x00, -0x05,0x2b,0x00,0x00,0x25,0x2d,0x00,0x00,0x25,0x2d,0x00,0x00,0x05,0x1a,0x00,0x00,0x25,0x2e,0x00,0x00,0x25,0x2e,0x00,0x00,0x05,0x40,0x00,0x00,0x25,0x2f,0x00,0x00,0x25,0x2f,0x00,0x00,0x04,0xf9,0x00,0x00,0x25,0x30,0x00,0x00,0x25,0x30,0x00,0x00,0x04,0xf3,0x00,0x00,0x25,0x31,0x00,0x00,0x25,0x31,0x00,0x00,0x05,0x43,0x00,0x00, -0x25,0x32,0x00,0x00,0x25,0x32,0x00,0x00,0x05,0x1d,0x00,0x00,0x25,0x33,0x00,0x00,0x25,0x33,0x00,0x00,0x05,0x05,0x00,0x00,0x25,0x34,0x00,0x00,0x25,0x34,0x00,0x00,0x05,0x38,0x00,0x00,0x25,0x35,0x00,0x00,0x25,0x35,0x00,0x00,0x05,0x1b,0x00,0x00,0x25,0x36,0x00,0x00,0x25,0x36,0x00,0x00,0x05,0x41,0x00,0x00,0x25,0x37,0x00,0x00, -0x25,0x37,0x00,0x00,0x05,0x51,0x00,0x00,0x25,0x38,0x00,0x00,0x25,0x38,0x00,0x00,0x05,0x4b,0x00,0x00,0x25,0x39,0x00,0x00,0x25,0x39,0x00,0x00,0x05,0x44,0x00,0x00,0x25,0x3a,0x00,0x00,0x25,0x3a,0x00,0x00,0x05,0x1e,0x00,0x00,0x25,0x3b,0x00,0x00,0x25,0x3b,0x00,0x00,0x05,0x11,0x00,0x00,0x25,0x3c,0x00,0x00,0x25,0x3c,0x00,0x00, -0x05,0x3c,0x00,0x00,0x25,0x3d,0x00,0x00,0x25,0x3d,0x00,0x00,0x05,0x1c,0x00,0x00,0x25,0x3e,0x00,0x00,0x25,0x3e,0x00,0x00,0x05,0x42,0x00,0x00,0x25,0x3f,0x00,0x00,0x25,0x3f,0x00,0x00,0x05,0x5f,0x00,0x00,0x25,0x40,0x00,0x00,0x25,0x40,0x00,0x00,0x05,0x4a,0x00,0x00,0x25,0x41,0x00,0x00,0x25,0x41,0x00,0x00,0x04,0xf8,0x00,0x00, -0x25,0x42,0x00,0x00,0x25,0x42,0x00,0x00,0x05,0x5c,0x00,0x00,0x25,0x43,0x00,0x00,0x25,0x43,0x00,0x00,0x05,0x20,0x00,0x00,0x25,0x44,0x00,0x00,0x25,0x44,0x00,0x00,0x05,0x46,0x00,0x00,0x25,0x45,0x00,0x00,0x25,0x45,0x00,0x00,0x05,0x19,0x00,0x00,0x25,0x46,0x00,0x00,0x25,0x46,0x00,0x00,0x05,0x3f,0x00,0x00,0x25,0x47,0x00,0x00, -0x25,0x47,0x00,0x00,0x04,0xfe,0x00,0x00,0x25,0x48,0x00,0x00,0x25,0x48,0x00,0x00,0x05,0x50,0x00,0x00,0x25,0x49,0x00,0x00,0x25,0x49,0x00,0x00,0x05,0x45,0x00,0x00,0x25,0x4a,0x00,0x00,0x25,0x4a,0x00,0x00,0x05,0x1f,0x00,0x00,0x25,0x4b,0x00,0x00,0x25,0x4b,0x00,0x00,0x05,0x16,0x00,0x00,0x25,0x4c,0x00,0x00,0x25,0x4c,0x00,0x00, -0x05,0x28,0x00,0x00,0x25,0x4d,0x00,0x00,0x25,0x4d,0x00,0x00,0x05,0x02,0x00,0x00,0x25,0x4e,0x00,0x00,0x25,0x4e,0x00,0x00,0x05,0x29,0x00,0x00,0x25,0x4f,0x00,0x00,0x25,0x4f,0x00,0x00,0x05,0x03,0x00,0x00,0x25,0x50,0x00,0x00,0x25,0x50,0x00,0x00,0x04,0xe8,0x00,0x00,0x25,0x51,0x00,0x00,0x25,0x51,0x00,0x00,0x04,0xec,0x00,0x00, -0x25,0x52,0x00,0x00,0x25,0x52,0x00,0x00,0x05,0x01,0x00,0x00,0x25,0x53,0x00,0x00,0x25,0x53,0x00,0x00,0x04,0xf2,0x00,0x00,0x25,0x54,0x00,0x00,0x25,0x54,0x00,0x00,0x04,0xe7,0x00,0x00,0x25,0x55,0x00,0x00,0x25,0x55,0x00,0x00,0x05,0x00,0x00,0x00,0x25,0x56,0x00,0x00,0x25,0x56,0x00,0x00,0x04,0xf1,0x00,0x00,0x25,0x57,0x00,0x00, -0x25,0x57,0x00,0x00,0x04,0xe6,0x00,0x00,0x25,0x58,0x00,0x00,0x25,0x58,0x00,0x00,0x05,0x58,0x00,0x00,0x25,0x59,0x00,0x00,0x25,0x59,0x00,0x00,0x05,0x49,0x00,0x00,0x25,0x5a,0x00,0x00,0x25,0x5a,0x00,0x00,0x04,0xeb,0x00,0x00,0x25,0x5b,0x00,0x00,0x25,0x5b,0x00,0x00,0x05,0x57,0x00,0x00,0x25,0x5c,0x00,0x00,0x25,0x5c,0x00,0x00, -0x05,0x48,0x00,0x00,0x25,0x5d,0x00,0x00,0x25,0x5d,0x00,0x00,0x04,0xea,0x00,0x00,0x25,0x5e,0x00,0x00,0x25,0x5e,0x00,0x00,0x05,0x64,0x00,0x00,0x25,0x5f,0x00,0x00,0x25,0x5f,0x00,0x00,0x05,0x5b,0x00,0x00,0x25,0x60,0x00,0x00,0x25,0x60,0x00,0x00,0x04,0xef,0x00,0x00,0x25,0x61,0x00,0x00,0x25,0x61,0x00,0x00,0x05,0x63,0x00,0x00, -0x25,0x62,0x00,0x00,0x25,0x62,0x00,0x00,0x05,0x5a,0x00,0x00,0x25,0x63,0x00,0x00,0x25,0x63,0x00,0x00,0x04,0xee,0x00,0x00,0x25,0x64,0x00,0x00,0x25,0x64,0x00,0x00,0x04,0xff,0x00,0x00,0x25,0x65,0x00,0x00,0x25,0x65,0x00,0x00,0x04,0xf0,0x00,0x00,0x25,0x66,0x00,0x00,0x25,0x66,0x00,0x00,0x04,0xe5,0x00,0x00,0x25,0x67,0x00,0x00, -0x25,0x67,0x00,0x00,0x05,0x56,0x00,0x00,0x25,0x68,0x00,0x00,0x25,0x68,0x00,0x00,0x05,0x47,0x00,0x00,0x25,0x69,0x00,0x00,0x25,0x69,0x00,0x00,0x04,0xe9,0x00,0x00,0x25,0x6a,0x00,0x00,0x25,0x6a,0x00,0x00,0x05,0x62,0x00,0x00,0x25,0x6b,0x00,0x00,0x25,0x6b,0x00,0x00,0x05,0x59,0x00,0x00,0x25,0x6c,0x00,0x00,0x25,0x6c,0x00,0x00, -0x04,0xed,0x00,0x00,0x25,0x6d,0x00,0x00,0x25,0x6d,0x00,0x00,0x05,0x22,0x00,0x00,0x25,0x6e,0x00,0x00,0x25,0x6e,0x00,0x00,0x05,0x21,0x00,0x00,0x25,0x6f,0x00,0x00,0x25,0x70,0x00,0x00,0x05,0x23,0x00,0x00,0x25,0x71,0x00,0x00,0x25,0x71,0x00,0x00,0x05,0x27,0x00,0x00,0x25,0x72,0x00,0x00,0x25,0x72,0x00,0x00,0x05,0x26,0x00,0x00, -0x25,0x73,0x00,0x00,0x25,0x73,0x00,0x00,0x05,0x25,0x00,0x00,0x25,0x74,0x00,0x00,0x25,0x74,0x00,0x00,0x05,0x2f,0x00,0x00,0x25,0x75,0x00,0x00,0x25,0x75,0x00,0x00,0x05,0x36,0x00,0x00,0x25,0x76,0x00,0x00,0x25,0x76,0x00,0x00,0x05,0x33,0x00,0x00,0x25,0x77,0x00,0x00,0x25,0x77,0x00,0x00,0x05,0x2a,0x00,0x00,0x25,0x78,0x00,0x00, -0x25,0x78,0x00,0x00,0x05,0x09,0x00,0x00,0x25,0x79,0x00,0x00,0x25,0x79,0x00,0x00,0x05,0x10,0x00,0x00,0x25,0x7a,0x00,0x00,0x25,0x7a,0x00,0x00,0x05,0x0d,0x00,0x00,0x25,0x7b,0x00,0x00,0x25,0x7b,0x00,0x00,0x05,0x04,0x00,0x00,0x25,0x7c,0x00,0x00,0x25,0x7c,0x00,0x00,0x05,0x30,0x00,0x00,0x25,0x7d,0x00,0x00,0x25,0x7d,0x00,0x00, -0x05,0x37,0x00,0x00,0x25,0x7e,0x00,0x00,0x25,0x7e,0x00,0x00,0x05,0x0a,0x00,0x00,0x25,0x7f,0x00,0x00,0x25,0x7f,0x00,0x00,0x05,0x13,0x00,0x00,0x25,0x80,0x00,0x00,0x25,0x80,0x00,0x00,0x04,0xa2,0x00,0x00,0x25,0x81,0x00,0x00,0x25,0x88,0x00,0x00,0x04,0x9a,0x00,0x00,0x25,0x89,0x00,0x00,0x25,0x89,0x00,0x00,0x04,0xaa,0x00,0x00, -0x25,0x8a,0x00,0x00,0x25,0x8a,0x00,0x00,0x04,0xa9,0x00,0x00,0x25,0x8b,0x00,0x00,0x25,0x8b,0x00,0x00,0x04,0xa8,0x00,0x00,0x25,0x8c,0x00,0x00,0x25,0x8c,0x00,0x00,0x04,0xa7,0x00,0x00,0x25,0x8d,0x00,0x00,0x25,0x8d,0x00,0x00,0x04,0xa6,0x00,0x00,0x25,0x8e,0x00,0x00,0x25,0x8e,0x00,0x00,0x04,0xa5,0x00,0x00,0x25,0x8f,0x00,0x00, -0x25,0x8f,0x00,0x00,0x04,0xa4,0x00,0x00,0x25,0x90,0x00,0x00,0x25,0x90,0x00,0x00,0x04,0xab,0x00,0x00,0x25,0x91,0x00,0x00,0x25,0x93,0x00,0x00,0x04,0xb7,0x00,0x00,0x25,0x94,0x00,0x00,0x25,0x94,0x00,0x00,0x04,0xa3,0x00,0x00,0x25,0x95,0x00,0x00,0x25,0x9f,0x00,0x00,0x04,0xac,0x00,0x00,0x25,0xa0,0x00,0x00,0x25,0xa1,0x00,0x00, -0x04,0xc8,0x00,0x00,0x25,0xaa,0x00,0x00,0x25,0xab,0x00,0x00,0x04,0xca,0x00,0x00,0x25,0xb2,0x00,0x00,0x25,0xb2,0x00,0x00,0x04,0xd1,0x00,0x00,0x25,0xb3,0x00,0x00,0x25,0xb3,0x00,0x00,0x04,0xd5,0x00,0x00,0x25,0xb4,0x00,0x00,0x25,0xb4,0x00,0x00,0x04,0xdd,0x00,0x00,0x25,0xb5,0x00,0x00,0x25,0xb5,0x00,0x00,0x04,0xe1,0x00,0x00, -0x25,0xb6,0x00,0x00,0x25,0xb6,0x00,0x00,0x04,0xd2,0x00,0x00,0x25,0xb7,0x00,0x00,0x25,0xb7,0x00,0x00,0x04,0xd6,0x00,0x00,0x25,0xb8,0x00,0x00,0x25,0xb8,0x00,0x00,0x04,0xde,0x00,0x00,0x25,0xb9,0x00,0x00,0x25,0xb9,0x00,0x00,0x04,0xe2,0x00,0x00,0x25,0xba,0x00,0x00,0x25,0xba,0x00,0x00,0x04,0xd9,0x00,0x00,0x25,0xbb,0x00,0x00, -0x25,0xbb,0x00,0x00,0x04,0xdb,0x00,0x00,0x25,0xbc,0x00,0x00,0x25,0xbc,0x00,0x00,0x04,0xd3,0x00,0x00,0x25,0xbd,0x00,0x00,0x25,0xbd,0x00,0x00,0x04,0xd7,0x00,0x00,0x25,0xbe,0x00,0x00,0x25,0xbe,0x00,0x00,0x04,0xdf,0x00,0x00,0x25,0xbf,0x00,0x00,0x25,0xbf,0x00,0x00,0x04,0xe3,0x00,0x00,0x25,0xc0,0x00,0x00,0x25,0xc0,0x00,0x00, -0x04,0xd4,0x00,0x00,0x25,0xc1,0x00,0x00,0x25,0xc1,0x00,0x00,0x04,0xd8,0x00,0x00,0x25,0xc2,0x00,0x00,0x25,0xc2,0x00,0x00,0x04,0xe0,0x00,0x00,0x25,0xc3,0x00,0x00,0x25,0xc3,0x00,0x00,0x04,0xe4,0x00,0x00,0x25,0xc4,0x00,0x00,0x25,0xc4,0x00,0x00,0x04,0xda,0x00,0x00,0x25,0xc5,0x00,0x00,0x25,0xc5,0x00,0x00,0x04,0xdc,0x00,0x00, -0x25,0xc6,0x00,0x00,0x25,0xc8,0x00,0x00,0x04,0xc4,0x00,0x00,0x25,0xc9,0x00,0x00,0x25,0xc9,0x00,0x00,0x04,0xc1,0x00,0x00,0x25,0xca,0x00,0x00,0x25,0xca,0x00,0x00,0x04,0xc7,0x00,0x00,0x25,0xcb,0x00,0x00,0x25,0xcb,0x00,0x00,0x04,0xbb,0x00,0x00,0x25,0xcc,0x00,0x00,0x25,0xcc,0x00,0x00,0x04,0xc0,0x00,0x00,0x25,0xce,0x00,0x00, -0x25,0xce,0x00,0x00,0x04,0xc2,0x00,0x00,0x25,0xcf,0x00,0x00,0x25,0xcf,0x00,0x00,0x04,0xba,0x00,0x00,0x25,0xd4,0x00,0x00,0x25,0xd5,0x00,0x00,0x04,0xbd,0x00,0x00,0x25,0xe6,0x00,0x00,0x25,0xe6,0x00,0x00,0x04,0xc3,0x00,0x00,0x25,0xe7,0x00,0x00,0x25,0xeb,0x00,0x00,0x04,0xcc,0x00,0x00,0x25,0xef,0x00,0x00,0x25,0xef,0x00,0x00, -0x04,0xbc,0x00,0x00,0x25,0xf6,0x00,0x00,0x25,0xf6,0x00,0x00,0x04,0xbf,0x00,0x00,0x26,0x6d,0x00,0x00,0x26,0x6d,0x00,0x00,0x06,0x60,0x00,0x00,0x26,0x6f,0x00,0x00,0x26,0x6f,0x00,0x00,0x06,0x61,0x00,0x00,0x26,0x87,0x00,0x00,0x26,0x87,0x00,0x00,0x05,0xab,0x00,0x00,0x26,0xa0,0x00,0x00,0x26,0xa1,0x00,0x00,0x05,0xac,0x00,0x00, -0x27,0x13,0x00,0x00,0x27,0x13,0x00,0x00,0x05,0xae,0x00,0x00,0x27,0x15,0x00,0x00,0x27,0x15,0x00,0x00,0x05,0xaf,0x00,0x00,0x27,0x17,0x00,0x00,0x27,0x17,0x00,0x00,0x05,0xb0,0x00,0x00,0x27,0x36,0x00,0x00,0x27,0x36,0x00,0x00,0x05,0xb1,0x00,0x00,0x27,0x6e,0x00,0x00,0x27,0x6e,0x00,0x00,0x03,0x4c,0x00,0x00,0x27,0x6f,0x00,0x00, -0x27,0x6f,0x00,0x00,0x03,0x4e,0x00,0x00,0x27,0x70,0x00,0x00,0x27,0x70,0x00,0x00,0x03,0x4b,0x00,0x00,0x27,0x71,0x00,0x00,0x27,0x71,0x00,0x00,0x03,0x4d,0x00,0x00,0x27,0x94,0x00,0x00,0x27,0x94,0x00,0x00,0x04,0x93,0x00,0x00,0x27,0x9c,0x00,0x00,0x27,0x9e,0x00,0x00,0x04,0x94,0x00,0x00,0x27,0xc5,0x00,0x00,0x27,0xc5,0x00,0x00, -0x03,0x51,0x00,0x00,0x27,0xc6,0x00,0x00,0x27,0xc6,0x00,0x00,0x03,0x54,0x00,0x00,0x27,0xdc,0x00,0x00,0x27,0xdc,0x00,0x00,0x03,0xef,0x00,0x00,0x27,0xe6,0x00,0x00,0x27,0xe6,0x00,0x00,0x03,0xb6,0x00,0x00,0x27,0xe7,0x00,0x00,0x27,0xe7,0x00,0x00,0x03,0xb9,0x00,0x00,0x27,0xe8,0x00,0x00,0x27,0xe8,0x00,0x00,0x03,0xb4,0x00,0x00, -0x27,0xe9,0x00,0x00,0x27,0xe9,0x00,0x00,0x03,0xb7,0x00,0x00,0x27,0xea,0x00,0x00,0x27,0xea,0x00,0x00,0x03,0xb5,0x00,0x00,0x27,0xeb,0x00,0x00,0x27,0xeb,0x00,0x00,0x03,0xb8,0x00,0x00,0x27,0xf5,0x00,0x00,0x27,0xf7,0x00,0x00,0x04,0x97,0x00,0x00,0x29,0x16,0x00,0x00,0x29,0x16,0x00,0x00,0x04,0x43,0x00,0x00,0x29,0x4a,0x00,0x00, -0x29,0x4a,0x00,0x00,0x03,0xee,0x00,0x00,0x29,0x87,0x00,0x00,0x29,0x88,0x00,0x00,0x03,0x55,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x03,0xfe,0x00,0x00,0x2a,0x05,0x00,0x00,0x2a,0x06,0x00,0x00,0x03,0xff,0x00,0x00,0x2b,0x58,0x00,0x00,0x2b,0x58,0x00,0x00,0x05,0xf1,0x00,0x00,0xe0,0xa0,0x00,0x00,0xe0,0xa2,0x00,0x00, -0x06,0xc4,0x00,0x00,0xe0,0xb0,0x00,0x00,0xe0,0xb3,0x00,0x00,0x06,0xc7,0x00,0x00,0xfe,0x62,0x00,0x00,0xfe,0x62,0x00,0x00,0x04,0x3a,0x00,0x00,0xfe,0xff,0x00,0x00,0xfe,0xff,0x00,0x00,0x03,0xc1,0x00,0x00,0xff,0x5b,0x00,0x00,0xff,0x5b,0x00,0x00,0x03,0x49,0x00,0x00,0xff,0x5d,0x00,0x00,0xff,0x5d,0x00,0x00,0x03,0x4a,0x00,0x00, -0xff,0xfd,0x00,0x00,0xff,0xfd,0x00,0x00,0x05,0xf6,0x00,0x01,0x69,0x10,0x00,0x01,0x69,0x10,0x00,0x00,0x02,0x9f,0x00,0x01,0xd5,0x38,0x00,0x01,0xd5,0x39,0x00,0x00,0x02,0xa0,0x00,0x01,0xd5,0x3b,0x00,0x01,0xd5,0x3e,0x00,0x00,0x02,0xa3,0x00,0x01,0xd5,0x40,0x00,0x01,0xd5,0x44,0x00,0x00,0x02,0xa8,0x00,0x01,0xd5,0x46,0x00,0x01, -0xd5,0x46,0x00,0x00,0x02,0xae,0x00,0x01,0xd5,0x4a,0x00,0x01,0xd5,0x50,0x00,0x00,0x02,0xb2,0x00,0x01,0xd5,0x52,0x00,0x01,0xd5,0x6b,0x00,0x00,0x02,0xba,0x00,0x00,0xb0,0x00,0x2c,0x20,0xb0,0x00,0x55,0x58,0x45,0x59,0x20,0x20,0x4b,0xb8,0x00,0x0e,0x51,0x4b,0xb0,0x06,0x53,0x5a,0x58,0xb0,0x34,0x1b,0xb0,0x28,0x59,0x60,0x66,0x20, -0x8a,0x55,0x58,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x62,0x1b,0x21,0x21,0xb0,0x00,0x59,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x01,0x2c,0xb0,0x20,0x60,0x66,0x2d,0xb0,0x02,0x2c,0x23,0x21,0x23,0x21,0x2d,0xb0,0x03,0x2c,0x20,0x64,0xb3,0x03,0x14,0x15,0x00,0x42,0x43,0xb0, -0x13,0x43,0x20,0x60,0x60,0x42,0xb1,0x02,0x14,0x43,0x42,0xb1,0x25,0x03,0x43,0xb0,0x02,0x43,0x54,0x78,0x20,0xb0,0x0c,0x23,0xb0,0x02,0x43,0x43,0x61,0x64,0xb0,0x04,0x50,0x78,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb0,0x21,0x65,0x1c,0x21,0xb0,0x02,0x43,0x43,0xb2,0x0e,0x15,0x01,0x42,0x1c,0x20,0xb0,0x02,0x43,0x23,0x42,0xb2,0x13, -0x01,0x13,0x43,0x60,0x42,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb2,0x16,0x01,0x02,0x43,0x60,0x42,0x2d,0xb0,0x04,0x2c,0xb0,0x03,0x2b,0xb0,0x15,0x43,0x58,0x23,0x21,0x23,0x21,0xb0,0x16,0x43,0x43,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x1b,0x20,0x64,0x20,0xb0,0xc0,0x50,0xb0,0x04,0x26,0x5a,0xb2,0x28,0x01,0x0d,0x43,0x45,0x63,0x45, -0xb0,0x06,0x45,0x58,0x21,0xb0,0x03,0x25,0x59,0x52,0x5b,0x58,0x21,0x23,0x21,0x1b,0x8a,0x58,0x20,0xb0,0x50,0x50,0x58,0x21,0xb0,0x40,0x59,0x1b,0x20,0xb0,0x38,0x50,0x58,0x21,0xb0,0x38,0x59,0x59,0x20,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x61,0x64,0xb0,0x28,0x50,0x58,0x21,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x20,0xb0,0x30,0x50, -0x58,0x21,0xb0,0x30,0x59,0x1b,0x20,0xb0,0xc0,0x50,0x58,0x20,0x66,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x0a,0x50,0x58,0x60,0x1b,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x0a,0x60,0x1b,0x20,0xb0,0x36,0x50,0x58,0x21,0xb0,0x36,0x60,0x1b,0x60,0x59,0x59,0x59,0x1b,0xb0,0x02,0x25,0xb0,0x0c,0x43,0x63,0xb0,0x00,0x52,0x58,0xb0,0x00,0x4b,0xb0, -0x0a,0x50,0x58,0x21,0xb0,0x0c,0x43,0x1b,0x4b,0xb0,0x1e,0x50,0x58,0x21,0xb0,0x1e,0x4b,0x61,0xb8,0x10,0x00,0x63,0xb0,0x0c,0x43,0x63,0xb8,0x05,0x00,0x62,0x59,0x59,0x64,0x61,0x59,0xb0,0x01,0x2b,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x59,0x20,0x64,0xb0,0x16,0x43,0x23,0x42,0x59,0x2d,0xb0,0x05,0x2c,0x20,0x45,0x20,0xb0, -0x04,0x25,0x61,0x64,0x20,0xb0,0x07,0x43,0x50,0x58,0xb0,0x07,0x23,0x42,0xb0,0x08,0x23,0x42,0x1b,0x21,0x21,0x59,0xb0,0x01,0x60,0x2d,0xb0,0x06,0x2c,0x23,0x21,0x23,0x21,0xb0,0x03,0x2b,0x20,0x64,0xb1,0x07,0x62,0x42,0x20,0xb0,0x08,0x23,0x42,0xb0,0x06,0x45,0x58,0x1b,0xb1,0x01,0x0d,0x43,0x45,0x63,0xb1,0x01,0x0d,0x43,0xb0,0x05, -0x60,0x45,0x63,0xb0,0x05,0x2a,0x21,0x20,0xb0,0x08,0x43,0x20,0x8a,0x20,0x8a,0xb0,0x01,0x2b,0xb1,0x30,0x05,0x25,0xb0,0x04,0x26,0x51,0x58,0x60,0x50,0x1b,0x61,0x52,0x59,0x58,0x23,0x59,0x21,0x59,0x20,0xb0,0x40,0x53,0x58,0xb0,0x01,0x2b,0x1b,0x21,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x2d,0xb0,0x07,0x2c,0xb0,0x09, -0x43,0x2b,0xb2,0x00,0x02,0x00,0x43,0x60,0x42,0x2d,0xb0,0x08,0x2c,0xb0,0x09,0x23,0x42,0x23,0x20,0xb0,0x00,0x23,0x42,0x61,0xb0,0x02,0x62,0x66,0xb0,0x01,0x63,0xb0,0x01,0x60,0xb0,0x07,0x2a,0x2d,0xb0,0x09,0x2c,0x20,0x20,0x45,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0, -0x01,0x63,0x60,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0a,0x2c,0xb2,0x09,0x0e,0x00,0x43,0x45,0x42,0x2a,0x21,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0b,0x2c,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0c,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45, -0x8a,0x23,0x61,0x20,0x64,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x00,0x1b,0xb0,0x30,0x50,0x58,0xb0,0x20,0x1b,0xb0,0x40,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0d,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a, -0x23,0x61,0x20,0x64,0xb0,0x24,0x50,0x58,0xb0,0x00,0x1b,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0e,0x2c,0x20,0xb0,0x00,0x23,0x42,0xb3,0x0d,0x0c,0x00,0x03,0x45,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x2a,0x21,0x2d,0xb0,0x0f,0x2c,0xb1,0x02,0x02,0x45,0xb0, -0x64,0x61,0x44,0x2d,0xb0,0x10,0x2c,0xb0,0x01,0x60,0x20,0x20,0xb0,0x0f,0x43,0x4a,0xb0,0x00,0x50,0x58,0x20,0xb0,0x0f,0x23,0x42,0x59,0xb0,0x10,0x43,0x4a,0xb0,0x00,0x52,0x58,0x20,0xb0,0x10,0x23,0x42,0x59,0x2d,0xb0,0x11,0x2c,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0x20,0xb8,0x04,0x00,0x63,0x8a,0x23,0x61,0xb0,0x11,0x43,0x60, -0x20,0x8a,0x60,0x20,0xb0,0x11,0x23,0x42,0x23,0x2d,0xb0,0x12,0x2c,0x4b,0x54,0x58,0xb1,0x04,0x64,0x44,0x59,0x24,0xb0,0x0d,0x65,0x23,0x78,0x2d,0xb0,0x13,0x2c,0x4b,0x51,0x58,0x4b,0x53,0x58,0xb1,0x04,0x64,0x44,0x59,0x1b,0x21,0x59,0x24,0xb0,0x13,0x65,0x23,0x78,0x2d,0xb0,0x14,0x2c,0xb1,0x00,0x12,0x43,0x55,0x58,0xb1,0x12,0x12, -0x43,0xb0,0x01,0x61,0x42,0xb0,0x11,0x2b,0x59,0xb0,0x00,0x43,0xb0,0x02,0x25,0x42,0xb1,0x0f,0x02,0x25,0x42,0xb1,0x10,0x02,0x25,0x42,0xb0,0x01,0x16,0x23,0x20,0xb0,0x03,0x25,0x50,0x58,0xb1,0x01,0x00,0x43,0x60,0xb0,0x04,0x25,0x42,0x8a,0x8a,0x20,0x8a,0x23,0x61,0xb0,0x10,0x2a,0x21,0x23,0xb0,0x01,0x61,0x20,0x8a,0x23,0x61,0xb0, -0x10,0x2a,0x21,0x1b,0xb1,0x01,0x00,0x43,0x60,0xb0,0x02,0x25,0x42,0xb0,0x02,0x25,0x61,0xb0,0x10,0x2a,0x21,0x59,0xb0,0x0f,0x43,0x47,0xb0,0x10,0x43,0x47,0x60,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60, -0x59,0x66,0xb0,0x01,0x63,0x60,0xb1,0x00,0x00,0x13,0x23,0x44,0xb0,0x01,0x43,0xb0,0x00,0x3e,0xb2,0x01,0x01,0x01,0x43,0x60,0x42,0x2d,0xb0,0x15,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x05,0x60,0x42,0x20,0x60,0xb7,0x18,0x18,0x01,0x00,0x11,0x00,0x13,0x00, -0x42,0x42,0x42,0x8a,0x60,0x20,0xb0,0x14,0x23,0x42,0xb0,0x01,0x61,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x16,0x2c,0xb1,0x00,0x15,0x2b,0x2d,0xb0,0x17,0x2c,0xb1,0x01,0x15,0x2b,0x2d,0xb0,0x18,0x2c,0xb1,0x02,0x15,0x2b,0x2d,0xb0,0x19,0x2c,0xb1,0x03,0x15,0x2b,0x2d,0xb0,0x1a,0x2c,0xb1,0x04,0x15,0x2b,0x2d, -0xb0,0x1b,0x2c,0xb1,0x05,0x15,0x2b,0x2d,0xb0,0x1c,0x2c,0xb1,0x06,0x15,0x2b,0x2d,0xb0,0x1d,0x2c,0xb1,0x07,0x15,0x2b,0x2d,0xb0,0x1e,0x2c,0xb1,0x08,0x15,0x2b,0x2d,0xb0,0x1f,0x2c,0xb1,0x09,0x15,0x2b,0x2d,0xb0,0x2b,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x06,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x5d, -0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2c,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x16,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x71,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2d,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x26,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x72,0x1b,0x21,0x21,0x59,0x2d,0xb0, -0x20,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x05,0x60,0x42,0x20,0x60,0xb0,0x01,0x61,0xb5,0x18,0x18,0x01,0x00,0x11,0x00,0x42,0x42,0x8a,0x60,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x21,0x2c,0xb1,0x00,0x20,0x2b,0x2d, -0xb0,0x22,0x2c,0xb1,0x01,0x20,0x2b,0x2d,0xb0,0x23,0x2c,0xb1,0x02,0x20,0x2b,0x2d,0xb0,0x24,0x2c,0xb1,0x03,0x20,0x2b,0x2d,0xb0,0x25,0x2c,0xb1,0x04,0x20,0x2b,0x2d,0xb0,0x26,0x2c,0xb1,0x05,0x20,0x2b,0x2d,0xb0,0x27,0x2c,0xb1,0x06,0x20,0x2b,0x2d,0xb0,0x28,0x2c,0xb1,0x07,0x20,0x2b,0x2d,0xb0,0x29,0x2c,0xb1,0x08,0x20,0x2b,0x2d, -0xb0,0x2a,0x2c,0xb1,0x09,0x20,0x2b,0x2d,0xb0,0x2e,0x2c,0x20,0x3c,0xb0,0x01,0x60,0x2d,0xb0,0x2f,0x2c,0x20,0x60,0xb0,0x18,0x60,0x20,0x43,0x23,0xb0,0x01,0x60,0x43,0xb0,0x02,0x25,0x61,0xb0,0x01,0x60,0xb0,0x2e,0x2a,0x21,0x2d,0xb0,0x30,0x2c,0xb0,0x2f,0x2b,0xb0,0x2f,0x2a,0x2d,0xb0,0x31,0x2c,0x20,0x20,0x47,0x20,0x20,0xb0,0x0e, -0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x23,0x20,0x8a,0x55,0x58,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x1b,0x21,0x59,0x2d,0xb0,0x32,0x2c, -0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x33,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22, -0x59,0x2d,0xb0,0x34,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0xb0,0x35,0x2c,0x00,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x45,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01, -0x63,0xb0,0x01,0x2b,0xb0,0x00,0x16,0xb4,0x00,0x00,0x00,0x00,0x00,0x44,0x3e,0x23,0x38,0xb1,0x34,0x01,0x15,0x2a,0x21,0x2d,0xb0,0x36,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0x38,0x2d,0xb0,0x37,0x2c,0x2e, -0x17,0x3c,0x2d,0xb0,0x38,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0xb0,0x01,0x43,0x63,0x38,0x2d,0xb0,0x39,0x2c,0xb1,0x02,0x00,0x16,0x25,0x20,0x2e,0x20,0x47,0xb0,0x00,0x23,0x42,0xb0,0x02,0x25,0x49,0x8a, -0x8a,0x47,0x23,0x47,0x23,0x61,0x20,0x58,0x62,0x1b,0x21,0x59,0xb0,0x01,0x23,0x42,0xb2,0x38,0x01,0x01,0x15,0x14,0x2a,0x2d,0xb0,0x3a,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x65,0x8a,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0, -0x3b,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0xb0,0x0a,0x43, -0x20,0x8a,0x23,0x47,0x23,0x47,0x23,0x61,0x23,0x46,0x60,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0, -0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x1b,0x23,0xb0,0x0a,0x43,0x46,0xb0,0x02,0x25,0xb0,0x0a,0x43,0x47,0x23,0x47,0x23,0x61,0x60,0x20,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66, -0xb0,0x01,0x63,0x60,0x23,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x06,0x43,0x60,0xb0,0x01,0x2b,0xb0,0x05,0x25,0x61,0xb0,0x05,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x04,0x26,0x61,0x20,0xb0,0x04,0x25,0x60,0x64,0x23,0xb0,0x03,0x25,0x60,0x64,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x23, -0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x59,0x2d,0xb0,0x3c,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0x20,0x20,0xb0,0x05,0x26,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x23,0x3c,0x38,0x2d,0xb0,0x3d,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x23,0x42,0x20,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61, -0x38,0x2d,0xb0,0x3e,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x03,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x00,0x54,0x58,0x2e,0x20,0x3c,0x23,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x05,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x06,0x25,0xb0,0x05,0x25,0x49,0xb0, -0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x20,0x58,0x62,0x1b,0x21,0x59,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x23,0x21,0x59,0x2d,0xb0,0x3f,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x43,0x20,0x2e, -0x47,0x23,0x47,0x23,0x61,0x20,0x60,0xb0,0x20,0x60,0x66,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x40,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d, -0xb0,0x41,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x42,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43, -0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x43,0x2c,0xb0,0x3a,0x2b,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x44,0x2c,0xb0,0x3b,0x2b,0x8a,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x8a, -0x38,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x45,0x2c,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x26,0x20,0x20,0x20,0x46,0x23,0x47,0x61,0xb0,0x0c,0x23,0x42,0x2e,0x47,0x23,0x47,0x23,0x61, -0xb0,0x0b,0x43,0x2b,0x23,0x20,0x3c,0x20,0x2e,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x46,0x2c,0xb1,0x0a,0x04,0x25,0x42,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58, -0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0x47,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b, -0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0xb0,0x02,0x25,0x46,0x61,0x38,0x23,0x20,0x3c,0x23,0x38,0x1b,0x21,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x21,0x59,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x47,0x2c,0xb1,0x00,0x3a,0x2b, -0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x48,0x2c,0xb1,0x00,0x3b,0x2b,0x21,0x23,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x49,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4a, -0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4b,0x2c,0xb1,0x00,0x01,0x14,0x13,0xb0,0x37,0x2a,0x2d,0xb0,0x4c,0x2c,0xb0,0x39,0x2a,0x2d,0xb0,0x4d,0x2c,0xb0,0x00,0x16,0x45,0x23,0x20,0x2e,0x20,0x46,0x8a,0x23,0x61,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0, -0x4e,0x2c,0xb0,0x0a,0x23,0x42,0xb0,0x4d,0x2b,0x2d,0xb0,0x4f,0x2c,0xb2,0x00,0x00,0x46,0x2b,0x2d,0xb0,0x50,0x2c,0xb2,0x00,0x01,0x46,0x2b,0x2d,0xb0,0x51,0x2c,0xb2,0x01,0x00,0x46,0x2b,0x2d,0xb0,0x52,0x2c,0xb2,0x01,0x01,0x46,0x2b,0x2d,0xb0,0x53,0x2c,0xb2,0x00,0x00,0x47,0x2b,0x2d,0xb0,0x54,0x2c,0xb2,0x00,0x01,0x47,0x2b,0x2d, -0xb0,0x55,0x2c,0xb2,0x01,0x00,0x47,0x2b,0x2d,0xb0,0x56,0x2c,0xb2,0x01,0x01,0x47,0x2b,0x2d,0xb0,0x57,0x2c,0xb3,0x00,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x58,0x2c,0xb3,0x00,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x59,0x2c,0xb3,0x01,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x5a,0x2c,0xb3,0x01,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x5b,0x2c,0xb3,0x00,0x00, -0x01,0x43,0x2b,0x2d,0xb0,0x5c,0x2c,0xb3,0x00,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5d,0x2c,0xb3,0x01,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5e,0x2c,0xb3,0x01,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5f,0x2c,0xb2,0x00,0x00,0x45,0x2b,0x2d,0xb0,0x60,0x2c,0xb2,0x00,0x01,0x45,0x2b,0x2d,0xb0,0x61,0x2c,0xb2,0x01,0x00,0x45,0x2b,0x2d,0xb0,0x62,0x2c, -0xb2,0x01,0x01,0x45,0x2b,0x2d,0xb0,0x63,0x2c,0xb2,0x00,0x00,0x48,0x2b,0x2d,0xb0,0x64,0x2c,0xb2,0x00,0x01,0x48,0x2b,0x2d,0xb0,0x65,0x2c,0xb2,0x01,0x00,0x48,0x2b,0x2d,0xb0,0x66,0x2c,0xb2,0x01,0x01,0x48,0x2b,0x2d,0xb0,0x67,0x2c,0xb3,0x00,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x68,0x2c,0xb3,0x00,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x69, -0x2c,0xb3,0x01,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x6a,0x2c,0xb3,0x01,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x6b,0x2c,0xb3,0x00,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6c,0x2c,0xb3,0x00,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6d,0x2c,0xb3,0x01,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6e,0x2c,0xb3,0x01,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6f,0x2c,0xb1,0x00,0x3c, -0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x70,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x71,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x72,0x2c,0xb0,0x00,0x16,0xb1,0x00,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x73,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x74,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x41, -0x2b,0x2d,0xb0,0x75,0x2c,0xb0,0x00,0x16,0xb1,0x01,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x76,0x2c,0xb1,0x00,0x3d,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x77,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x78,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x79,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0, -0x7a,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7b,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x7c,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7d,0x2c,0xb1,0x00,0x3e,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x7e,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7f,0x2c,0xb1,0x00,0x3e,0x2b, -0xb0,0x41,0x2b,0x2d,0xb0,0x80,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x81,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x82,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x83,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x84,0x2c,0xb1,0x00,0x3f,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x85, -0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x86,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x87,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x88,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x89,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x8a,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x42,0x2b,0x2d, -0xb0,0x8b,0x2c,0xb2,0x0b,0x00,0x03,0x45,0x50,0x58,0xb0,0x06,0x1b,0xb2,0x04,0x02,0x03,0x45,0x58,0x23,0x21,0x1b,0x21,0x59,0x59,0x42,0x2b,0xb0,0x08,0x65,0xb0,0x03,0x24,0x50,0x78,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x2d,0x00,0x4b,0xb8,0x00,0xc8,0x52,0x58,0xb1,0x01,0x01,0x8e,0x59,0xb0,0x01,0xb9,0x08,0x00,0x08,0x00,0x63, -0x70,0xb1,0x00,0x07,0x42,0xb6,0x00,0x00,0x41,0x31,0x21,0x05,0x00,0x2a,0xb1,0x00,0x07,0x42,0x40,0x0c,0x4e,0x04,0x46,0x04,0x36,0x08,0x26,0x08,0x18,0x07,0x05,0x0a,0x2a,0xb1,0x00,0x07,0x42,0x40,0x0c,0x52,0x02,0x4a,0x02,0x3e,0x06,0x2e,0x06,0x1f,0x05,0x05,0x0a,0x2a,0xb1,0x00,0x0c,0x42,0xbe,0x13,0xc0,0x11,0xc0,0x0d,0xc0,0x09, -0xc0,0x06,0x40,0x00,0x05,0x00,0x0b,0x2a,0xb1,0x00,0x11,0x42,0xbe,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x05,0x00,0x0b,0x2a,0xb9,0x00,0x03,0x00,0x00,0x44,0xb1,0x24,0x01,0x88,0x51,0x58,0xb0,0x40,0x88,0x58,0xb9,0x00,0x03,0x00,0x64,0x44,0xb1,0x28,0x01,0x88,0x51,0x58,0xb8,0x08,0x00,0x88,0x58,0xb9,0x00,0x03, -0x00,0x00,0x44,0x59,0x1b,0xb1,0x27,0x01,0x88,0x51,0x58,0xba,0x08,0x80,0x00,0x01,0x04,0x40,0x88,0x63,0x54,0x58,0xb9,0x00,0x03,0x00,0x00,0x44,0x59,0x59,0x59,0x59,0x59,0x40,0x0c,0x50,0x02,0x48,0x02,0x38,0x06,0x28,0x06,0x1a,0x05,0x05,0x0e,0x2a,0xb8,0x01,0xff,0x85,0xb0,0x04,0x8d,0xb1,0x02,0x00,0x44,0xb3,0x05,0x64,0x06,0x00, -0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0x26,0x00,0x00, -0xff,0x4c,0x02,0xe4,0xff,0xf6,0x02,0x30,0xff,0xf8,0xff,0x4c,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0xda,0x02,0x26,0x00,0x00,0xff,0x4c,0x02,0xe4,0xff,0xf6,0x02,0xe4,0x02,0x2e,0xff,0xf8,0xff,0x4c,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0xda,0x02,0x26,0x00,0x00,0xff,0x4c, -0x02,0xe4,0xff,0xf6,0x03,0x09,0x02,0x30,0xff,0xf8,0xff,0x4c,0x00,0x47,0x00,0x47,0x00,0x40,0x00,0x40,0x01,0x3b,0xff,0x7b,0x01,0x40,0xff,0x76,0x00,0x47,0x00,0x47,0x00,0x40,0x00,0x40,0x03,0x3e,0x01,0x7e,0x03,0x43,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x04, -0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x54,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x84,0x00,0x00,0x01,0x9c,0x00,0x00,0x01,0xb4,0x00,0x00,0x01,0xcc,0x00,0x00,0x01,0xec,0x00,0x00,0x02,0x04,0x00,0x00,0x02,0x1c,0x00,0x00,0x02,0x34,0x00,0x00,0x02,0x4c,0x00,0x00,0x02,0x64,0x00,0x00,0x02,0x7c,0x00,0x00,0x02,0x94, -0x00,0x00,0x02,0xac,0x00,0x00,0x03,0x78,0x00,0x00,0x03,0x90,0x00,0x00,0x03,0xa8,0x00,0x00,0x04,0x28,0x00,0x00,0x04,0x40,0x00,0x00,0x04,0xe0,0x00,0x00,0x05,0x70,0x00,0x00,0x05,0x88,0x00,0x00,0x05,0xa0,0x00,0x00,0x06,0xb8,0x00,0x00,0x06,0xd0,0x00,0x00,0x06,0xe8,0x00,0x00,0x07,0x58,0x00,0x00,0x07,0xe8,0x00,0x00,0x08,0x00, -0x00,0x00,0x08,0x90,0x00,0x00,0x08,0xec,0x00,0x00,0x09,0x04,0x00,0x00,0x09,0x1c,0x00,0x00,0x09,0x34,0x00,0x00,0x09,0x4c,0x00,0x00,0x09,0x64,0x00,0x00,0x09,0x84,0x00,0x00,0x09,0x9c,0x00,0x00,0x09,0xb4,0x00,0x00,0x09,0xcc,0x00,0x00,0x09,0xe4,0x00,0x00,0x09,0xfc,0x00,0x00,0x0a,0x14,0x00,0x00,0x0a,0x2c,0x00,0x00,0x0a,0x44, -0x00,0x00,0x0a,0x5c,0x00,0x00,0x0b,0x20,0x00,0x00,0x0b,0xf0,0x00,0x00,0x0c,0x08,0x00,0x00,0x0c,0x5c,0x00,0x00,0x0c,0xf4,0x00,0x00,0x0d,0x0c,0x00,0x00,0x0d,0x24,0x00,0x00,0x0d,0x3c,0x00,0x00,0x0d,0x54,0x00,0x00,0x0d,0x6c,0x00,0x00,0x0d,0x84,0x00,0x00,0x0d,0xd8,0x00,0x00,0x0e,0x58,0x00,0x00,0x0e,0x70,0x00,0x00,0x0e,0xc4, -0x00,0x00,0x0e,0xdc,0x00,0x00,0x0e,0xf4,0x00,0x00,0x0f,0x0c,0x00,0x00,0x0f,0x24,0x00,0x00,0x0f,0x3c,0x00,0x00,0x0f,0x54,0x00,0x00,0x0f,0x6c,0x00,0x00,0x0f,0x84,0x00,0x00,0x0f,0x9c,0x00,0x00,0x10,0x50,0x00,0x00,0x10,0x68,0x00,0x00,0x10,0xcc,0x00,0x00,0x10,0xe4,0x00,0x00,0x11,0x44,0x00,0x00,0x11,0x5c,0x00,0x00,0x11,0x98, -0x00,0x00,0x11,0xb0,0x00,0x00,0x11,0xc8,0x00,0x00,0x11,0xe0,0x00,0x00,0x12,0x04,0x00,0x00,0x12,0x64,0x00,0x00,0x12,0xdc,0x00,0x00,0x13,0x40,0x00,0x00,0x13,0x58,0x00,0x00,0x13,0x70,0x00,0x00,0x13,0x88,0x00,0x00,0x14,0x08,0x00,0x00,0x14,0x20,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xbc,0x00,0x00,0x14,0xd4,0x00,0x00,0x14,0xec, -0x00,0x00,0x15,0x04,0x00,0x00,0x15,0x24,0x00,0x00,0x15,0x3c,0x00,0x00,0x15,0x54,0x00,0x00,0x15,0x6c,0x00,0x00,0x15,0x84,0x00,0x00,0x15,0x9c,0x00,0x00,0x15,0xb4,0x00,0x00,0x15,0xcc,0x00,0x00,0x16,0x74,0x00,0x00,0x16,0x8c,0x00,0x00,0x16,0xa4,0x00,0x00,0x16,0xbc,0x00,0x00,0x16,0xd4,0x00,0x00,0x16,0xec,0x00,0x00,0x17,0x04, -0x00,0x00,0x17,0x1c,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0xec,0x00,0x00,0x19,0x04,0x00,0x00,0x19,0x1c,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1a,0xe8,0x00,0x00,0x1b,0x5c,0x00,0x00,0x1b,0xfc,0x00,0x00,0x1c,0x7c,0x00,0x00,0x1c,0x94,0x00,0x00,0x1c,0xac,0x00,0x00,0x1c,0xc4,0x00,0x00,0x1d,0x78,0x00,0x00,0x1d,0x90,0x00,0x00,0x1d,0xa8, -0x00,0x00,0x1e,0xe4,0x00,0x00,0x1e,0xfc,0x00,0x00,0x1f,0x14,0x00,0x00,0x1f,0xac,0x00,0x00,0x20,0x4c,0x00,0x00,0x20,0x90,0x00,0x00,0x20,0xf4,0x00,0x00,0x21,0x0c,0x00,0x00,0x21,0xc8,0x00,0x00,0x21,0xe0,0x00,0x00,0x22,0x40,0x00,0x00,0x22,0x58,0x00,0x00,0x22,0x70,0x00,0x00,0x22,0x88,0x00,0x00,0x22,0xa0,0x00,0x00,0x22,0xb8, -0x00,0x00,0x22,0xd0,0x00,0x00,0x22,0xe8,0x00,0x00,0x23,0x6c,0x00,0x00,0x23,0x84,0x00,0x00,0x23,0x9c,0x00,0x00,0x23,0xb4,0x00,0x00,0x23,0xcc,0x00,0x00,0x23,0xe4,0x00,0x00,0x23,0xfc,0x00,0x00,0x24,0x14,0x00,0x00,0x24,0xcc,0x00,0x00,0x24,0xe4,0x00,0x00,0x24,0xfc,0x00,0x00,0x25,0x54,0x00,0x00,0x25,0xe8,0x00,0x00,0x26,0x00, -0x00,0x00,0x26,0x18,0x00,0x00,0x26,0x30,0x00,0x00,0x26,0x48,0x00,0x00,0x26,0xc4,0x00,0x00,0x27,0x24,0x00,0x00,0x27,0x3c,0x00,0x00,0x27,0x54,0x00,0x00,0x27,0x6c,0x00,0x00,0x27,0x84,0x00,0x00,0x27,0x9c,0x00,0x00,0x27,0xb4,0x00,0x00,0x27,0xcc,0x00,0x00,0x27,0xe4,0x00,0x00,0x28,0x3c,0x00,0x00,0x28,0x54,0x00,0x00,0x28,0x6c, -0x00,0x00,0x28,0x84,0x00,0x00,0x29,0x10,0x00,0x00,0x29,0x28,0x00,0x00,0x29,0x40,0x00,0x00,0x29,0x58,0x00,0x00,0x29,0x70,0x00,0x00,0x29,0xcc,0x00,0x00,0x29,0xe4,0x00,0x00,0x2a,0x94,0x00,0x00,0x2b,0x88,0x00,0x00,0x2b,0xa0,0x00,0x00,0x2b,0xb8,0x00,0x00,0x2b,0xd0,0x00,0x00,0x2b,0xf0,0x00,0x00,0x2c,0x08,0x00,0x00,0x2c,0x20, -0x00,0x00,0x2c,0x38,0x00,0x00,0x2c,0x50,0x00,0x00,0x2c,0x68,0x00,0x00,0x2c,0x80,0x00,0x00,0x2c,0xa0,0x00,0x00,0x2c,0xb8,0x00,0x00,0x2c,0xd0,0x00,0x00,0x2c,0xe8,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x18,0x00,0x00,0x2d,0x30,0x00,0x00,0x2d,0x48,0x00,0x00,0x2d,0x60,0x00,0x00,0x2e,0xe0,0x00,0x00,0x2e,0xf8,0x00,0x00,0x2f,0x10, -0x00,0x00,0x30,0x6c,0x00,0x00,0x30,0x84,0x00,0x00,0x31,0x54,0x00,0x00,0x31,0xe4,0x00,0x00,0x31,0xfc,0x00,0x00,0x32,0x14,0x00,0x00,0x33,0x2c,0x00,0x00,0x33,0x44,0x00,0x00,0x33,0x5c,0x00,0x00,0x34,0x2c,0x00,0x00,0x35,0x00,0x00,0x00,0x35,0xf8,0x00,0x00,0x36,0xf0,0x00,0x00,0x37,0x94,0x00,0x00,0x37,0xac,0x00,0x00,0x37,0xc4, -0x00,0x00,0x37,0xdc,0x00,0x00,0x37,0xf4,0x00,0x00,0x38,0x0c,0x00,0x00,0x38,0x2c,0x00,0x00,0x38,0x44,0x00,0x00,0x38,0x5c,0x00,0x00,0x38,0x74,0x00,0x00,0x38,0x8c,0x00,0x00,0x38,0xa4,0x00,0x00,0x38,0xbc,0x00,0x00,0x38,0xd4,0x00,0x00,0x38,0xec,0x00,0x00,0x39,0x04,0x00,0x00,0x3a,0x0c,0x00,0x00,0x3a,0x24,0x00,0x00,0x3a,0xc4, -0x00,0x00,0x3b,0x28,0x00,0x00,0x3c,0x10,0x00,0x00,0x3c,0x28,0x00,0x00,0x3c,0x40,0x00,0x00,0x3c,0x58,0x00,0x00,0x3c,0x70,0x00,0x00,0x3c,0x88,0x00,0x00,0x3c,0xa0,0x00,0x00,0x3d,0x10,0x00,0x00,0x3d,0x20,0x00,0x00,0x3d,0x44,0x00,0x00,0x3d,0x5c,0x00,0x00,0x3d,0xa8,0x00,0x00,0x3d,0xc0,0x00,0x00,0x3d,0xd8,0x00,0x00,0x3d,0xf0, -0x00,0x00,0x3e,0x08,0x00,0x00,0x3e,0x20,0x00,0x00,0x3e,0x38,0x00,0x00,0x3e,0x58,0x00,0x00,0x3e,0x70,0x00,0x00,0x3e,0x88,0x00,0x00,0x3e,0xa0,0x00,0x00,0x3f,0xc8,0x00,0x00,0x3f,0xe0,0x00,0x00,0x3f,0xf8,0x00,0x00,0x40,0x50,0x00,0x00,0x40,0x68,0x00,0x00,0x40,0xcc,0x00,0x00,0x40,0xe4,0x00,0x00,0x40,0xf4,0x00,0x00,0x41,0x4c, -0x00,0x00,0x41,0x64,0x00,0x00,0x41,0xe0,0x00,0x00,0x41,0xf8,0x00,0x00,0x42,0x10,0x00,0x00,0x42,0x34,0x00,0x00,0x42,0xa4,0x00,0x00,0x43,0x64,0x00,0x00,0x43,0xf4,0x00,0x00,0x44,0x0c,0x00,0x00,0x44,0x30,0x00,0x00,0x44,0x48,0x00,0x00,0x44,0x60,0x00,0x00,0x45,0x14,0x00,0x00,0x45,0x2c,0x00,0x00,0x45,0xac,0x00,0x00,0x45,0xc4, -0x00,0x00,0x45,0xdc,0x00,0x00,0x45,0xf4,0x00,0x00,0x46,0x0c,0x00,0x00,0x46,0x24,0x00,0x00,0x46,0x44,0x00,0x00,0x46,0x5c,0x00,0x00,0x46,0x74,0x00,0x00,0x46,0x8c,0x00,0x00,0x46,0xa4,0x00,0x00,0x46,0xbc,0x00,0x00,0x46,0xd4,0x00,0x00,0x46,0xec,0x00,0x00,0x47,0xc8,0x00,0x00,0x47,0xe0,0x00,0x00,0x47,0xf8,0x00,0x00,0x48,0x10, -0x00,0x00,0x48,0x28,0x00,0x00,0x48,0x40,0x00,0x00,0x48,0x58,0x00,0x00,0x48,0x70,0x00,0x00,0x49,0x54,0x00,0x00,0x4a,0x18,0x00,0x00,0x4a,0x30,0x00,0x00,0x4a,0x48,0x00,0x00,0x4b,0x50,0x00,0x00,0x4c,0x1c,0x00,0x00,0x4c,0xf0,0x00,0x00,0x4d,0xc0,0x00,0x00,0x4e,0x58,0x00,0x00,0x4e,0x70,0x00,0x00,0x4e,0x88,0x00,0x00,0x4e,0xa0, -0x00,0x00,0x4f,0x50,0x00,0x00,0x4f,0x68,0x00,0x00,0x4f,0x80,0x00,0x00,0x50,0xb4,0x00,0x00,0x50,0xcc,0x00,0x00,0x50,0xe4,0x00,0x00,0x51,0x90,0x00,0x00,0x51,0xdc,0x00,0x00,0x52,0x4c,0x00,0x00,0x52,0xd4,0x00,0x00,0x52,0xf8,0x00,0x00,0x53,0xe8,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x60,0x00,0x00,0x54,0x78,0x00,0x00,0x54,0x90, -0x00,0x00,0x54,0xa8,0x00,0x00,0x54,0xc0,0x00,0x00,0x54,0xd8,0x00,0x00,0x55,0x04,0x00,0x00,0x55,0x30,0x00,0x00,0x55,0x5c,0x00,0x00,0x55,0x88,0x00,0x00,0x55,0xa0,0x00,0x00,0x55,0xb8,0x00,0x00,0x55,0xd0,0x00,0x00,0x56,0x6c,0x00,0x00,0x56,0x84,0x00,0x00,0x56,0x9c,0x00,0x00,0x56,0xb4,0x00,0x00,0x56,0xcc,0x00,0x00,0x56,0xe4, -0x00,0x00,0x56,0xfc,0x00,0x00,0x57,0x14,0x00,0x00,0x57,0xc8,0x00,0x00,0x57,0xe0,0x00,0x00,0x57,0xf8,0x00,0x00,0x58,0x50,0x00,0x00,0x58,0xe8,0x00,0x00,0x59,0x00,0x00,0x00,0x59,0x18,0x00,0x00,0x59,0x30,0x00,0x00,0x59,0x48,0x00,0x00,0x59,0xc4,0x00,0x00,0x5a,0x24,0x00,0x00,0x5a,0x3c,0x00,0x00,0x5a,0x54,0x00,0x00,0x5a,0x6c, -0x00,0x00,0x5a,0x84,0x00,0x00,0x5a,0x9c,0x00,0x00,0x5a,0xb4,0x00,0x00,0x5a,0xcc,0x00,0x00,0x5a,0xe4,0x00,0x00,0x5b,0x3c,0x00,0x00,0x5b,0x54,0x00,0x00,0x5b,0x6c,0x00,0x00,0x5b,0x84,0x00,0x00,0x5b,0x94,0x00,0x00,0x5b,0xe0,0x00,0x00,0x5b,0xf8,0x00,0x00,0x5c,0x10,0x00,0x00,0x5c,0x28,0x00,0x00,0x5c,0x4c,0x00,0x00,0x5c,0xbc, -0x00,0x00,0x5d,0x48,0x00,0x00,0x5d,0xe8,0x00,0x00,0x5e,0x0c,0x00,0x00,0x5f,0x20,0x00,0x00,0x5f,0x38,0x00,0x00,0x60,0xbc,0x00,0x00,0x60,0xd4,0x00,0x00,0x60,0xec,0x00,0x00,0x61,0x04,0x00,0x00,0x61,0x1c,0x00,0x00,0x61,0x34,0x00,0x00,0x61,0x4c,0x00,0x00,0x61,0x64,0x00,0x00,0x62,0x04,0x00,0x00,0x62,0x1c,0x00,0x00,0x62,0x90, -0x00,0x00,0x62,0xa8,0x00,0x00,0x62,0xc0,0x00,0x00,0x62,0xd8,0x00,0x00,0x63,0x7c,0x00,0x00,0x64,0x04,0x00,0x00,0x64,0xd0,0x00,0x00,0x65,0x5c,0x00,0x00,0x65,0x74,0x00,0x00,0x65,0x8c,0x00,0x00,0x65,0xa4,0x00,0x00,0x65,0xbc,0x00,0x00,0x66,0x1c,0x00,0x00,0x66,0x34,0x00,0x00,0x66,0x44,0x00,0x00,0x66,0xb8,0x00,0x00,0x67,0x64, -0x00,0x00,0x67,0x7c,0x00,0x00,0x67,0x94,0x00,0x00,0x67,0xac,0x00,0x00,0x68,0x1c,0x00,0x00,0x68,0x34,0x00,0x00,0x68,0x4c,0x00,0x00,0x68,0x64,0x00,0x00,0x68,0x7c,0x00,0x00,0x68,0x94,0x00,0x00,0x68,0xac,0x00,0x00,0x68,0xc4,0x00,0x00,0x68,0xdc,0x00,0x00,0x69,0x6c,0x00,0x00,0x6a,0x28,0x00,0x00,0x6b,0x0c,0x00,0x00,0x6b,0xdc, -0x00,0x00,0x6d,0x00,0x00,0x00,0x6d,0xcc,0x00,0x00,0x6e,0x8c,0x00,0x00,0x6f,0x9c,0x00,0x00,0x70,0x80,0x00,0x00,0x70,0x98,0x00,0x00,0x70,0xb0,0x00,0x00,0x70,0xc8,0x00,0x00,0x70,0xe0,0x00,0x00,0x70,0xf8,0x00,0x00,0x71,0xd0,0x00,0x00,0x72,0xb8,0x00,0x00,0x73,0xc0,0x00,0x00,0x74,0xc8,0x00,0x00,0x76,0x48,0x00,0x00,0x76,0xcc, -0x00,0x00,0x77,0x44,0x00,0x00,0x77,0xac,0x00,0x00,0x78,0xa8,0x00,0x00,0x79,0x30,0x00,0x00,0x79,0x40,0x00,0x00,0x79,0xb8,0x00,0x00,0x79,0xc8,0x00,0x00,0x7a,0x08,0x00,0x00,0x7a,0x20,0x00,0x00,0x7a,0x8c,0x00,0x00,0x7b,0x0c,0x00,0x00,0x7b,0x1c,0x00,0x00,0x7b,0x34,0x00,0x00,0x7b,0xb8,0x00,0x00,0x7c,0x88,0x00,0x00,0x7c,0xec, -0x00,0x00,0x7d,0x04,0x00,0x00,0x7d,0x14,0x00,0x00,0x7d,0x2c,0x00,0x00,0x7d,0xb4,0x00,0x00,0x7d,0xc4,0x00,0x00,0x7d,0xd4,0x00,0x00,0x7d,0xe4,0x00,0x00,0x7e,0x28,0x00,0x00,0x7e,0x38,0x00,0x00,0x7e,0x48,0x00,0x00,0x7e,0x58,0x00,0x00,0x7e,0xb4,0x00,0x00,0x7e,0xcc,0x00,0x00,0x7f,0xf0,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x5c, -0x00,0x00,0x80,0xb4,0x00,0x00,0x81,0x08,0x00,0x00,0x81,0x6c,0x00,0x00,0x81,0xe4,0x00,0x00,0x82,0x54,0x00,0x00,0x82,0xd0,0x00,0x00,0x83,0x58,0x00,0x00,0x84,0x28,0x00,0x00,0x84,0xb4,0x00,0x00,0x84,0xc4,0x00,0x00,0x85,0x68,0x00,0x00,0x85,0xfc,0x00,0x00,0x86,0x0c,0x00,0x00,0x86,0x24,0x00,0x00,0x86,0x34,0x00,0x00,0x86,0xb0, -0x00,0x00,0x87,0x8c,0x00,0x00,0x88,0x14,0x00,0x00,0x88,0xac,0x00,0x00,0x89,0x08,0x00,0x00,0x89,0x7c,0x00,0x00,0x89,0xe0,0x00,0x00,0x89,0xf0,0x00,0x00,0x8a,0x68,0x00,0x00,0x8a,0xd4,0x00,0x00,0x8b,0x30,0x00,0x00,0x8b,0xd0,0x00,0x00,0x8b,0xe8,0x00,0x00,0x8c,0x00,0x00,0x00,0x8c,0x18,0x00,0x00,0x8c,0x30,0x00,0x00,0x8c,0xcc, -0x00,0x00,0x8c,0xe4,0x00,0x00,0x8d,0x64,0x00,0x00,0x8d,0x74,0x00,0x00,0x8d,0x8c,0x00,0x00,0x8d,0xfc,0x00,0x00,0x8e,0x70,0x00,0x00,0x8e,0x88,0x00,0x00,0x8f,0x60,0x00,0x00,0x8f,0x70,0x00,0x00,0x90,0x14,0x00,0x00,0x90,0xb4,0x00,0x00,0x90,0xf4,0x00,0x00,0x91,0x0c,0x00,0x00,0x91,0x78,0x00,0x00,0x91,0xf8,0x00,0x00,0x92,0x08, -0x00,0x00,0x92,0x20,0x00,0x00,0x92,0x9c,0x00,0x00,0x93,0x68,0x00,0x00,0x93,0xc8,0x00,0x00,0x93,0xe0,0x00,0x00,0x94,0x3c,0x00,0x00,0x94,0x54,0x00,0x00,0x94,0xdc,0x00,0x00,0x95,0x4c,0x00,0x00,0x95,0x9c,0x00,0x00,0x95,0xac,0x00,0x00,0x95,0xf0,0x00,0x00,0x96,0x00,0x00,0x00,0x96,0x10,0x00,0x00,0x96,0x54,0x00,0x00,0x96,0x64, -0x00,0x00,0x96,0x7c,0x00,0x00,0x97,0x34,0x00,0x00,0x97,0x44,0x00,0x00,0x97,0x9c,0x00,0x00,0x97,0xf4,0x00,0x00,0x98,0x48,0x00,0x00,0x98,0xac,0x00,0x00,0x99,0x24,0x00,0x00,0x99,0x90,0x00,0x00,0x9a,0x04,0x00,0x00,0x9a,0x88,0x00,0x00,0x9b,0x8c,0x00,0x00,0x9c,0x14,0x00,0x00,0x9c,0x24,0x00,0x00,0x9c,0xc8,0x00,0x00,0x9d,0x6c, -0x00,0x00,0x9d,0x84,0x00,0x00,0x9d,0x9c,0x00,0x00,0x9d,0xb4,0x00,0x00,0x9e,0x40,0x00,0x00,0x9f,0x18,0x00,0x00,0x9f,0x98,0x00,0x00,0xa0,0x40,0x00,0x00,0xa0,0x9c,0x00,0x00,0xa1,0x08,0x00,0x00,0xa1,0x68,0x00,0x00,0xa1,0x78,0x00,0x00,0xa1,0xf0,0x00,0x00,0xa2,0x5c,0x00,0x00,0xa2,0xb8,0x00,0x00,0xa3,0x5c,0x00,0x00,0xa3,0x74, -0x00,0x00,0xa3,0x8c,0x00,0x00,0xa3,0xa4,0x00,0x00,0xa3,0xbc,0x00,0x00,0xa4,0x58,0x00,0x00,0xa4,0x70,0x00,0x00,0xa4,0x88,0x00,0x00,0xa5,0x08,0x00,0x00,0xa5,0x64,0x00,0x00,0xa5,0x7c,0x00,0x00,0xa5,0xe8,0x00,0x00,0xa5,0xf8,0x00,0x00,0xa6,0x10,0x00,0x00,0xa6,0xbc,0x00,0x00,0xa6,0xcc,0x00,0x00,0xa6,0xdc,0x00,0x00,0xa6,0xec, -0x00,0x00,0xa7,0x50,0x00,0x00,0xa7,0x60,0x00,0x00,0xa7,0x70,0x00,0x00,0xa7,0x80,0x00,0x00,0xa8,0x20,0x00,0x00,0xa8,0x30,0x00,0x00,0xa8,0x40,0x00,0x00,0xa8,0x90,0x00,0x00,0xa8,0xa0,0x00,0x00,0xa8,0xb0,0x00,0x00,0xa9,0x24,0x00,0x00,0xa9,0x34,0x00,0x00,0xa9,0x44,0x00,0x00,0xa9,0x54,0x00,0x00,0xa9,0xbc,0x00,0x00,0xa9,0xcc, -0x00,0x00,0xa9,0xdc,0x00,0x00,0xa9,0xec,0x00,0x00,0xa9,0xfc,0x00,0x00,0xaa,0x78,0x00,0x00,0xab,0x44,0x00,0x00,0xab,0x5c,0x00,0x00,0xab,0x74,0x00,0x00,0xab,0x8c,0x00,0x00,0xab,0xa4,0x00,0x00,0xab,0xbc,0x00,0x00,0xab,0xd4,0x00,0x00,0xab,0xec,0x00,0x00,0xac,0x04,0x00,0x00,0xac,0x1c,0x00,0x00,0xac,0xac,0x00,0x00,0xac,0xbc, -0x00,0x00,0xad,0x48,0x00,0x00,0xae,0x14,0x00,0x00,0xae,0xe8,0x00,0x00,0xaf,0x48,0x00,0x00,0xaf,0xf4,0x00,0x00,0xb0,0xc4,0x00,0x00,0xb1,0x40,0x00,0x00,0xb1,0x50,0x00,0x00,0xb1,0xec,0x00,0x00,0xb2,0x44,0x00,0x00,0xb2,0x54,0x00,0x00,0xb2,0xb0,0x00,0x00,0xb3,0x54,0x00,0x00,0xb3,0x64,0x00,0x00,0xb4,0x2c,0x00,0x00,0xb4,0x3c, -0x00,0x00,0xb4,0xd4,0x00,0x00,0xb5,0x6c,0x00,0x00,0xb5,0xf0,0x00,0x00,0xb6,0x88,0x00,0x00,0xb6,0xe8,0x00,0x00,0xb6,0xf8,0x00,0x00,0xb7,0xa8,0x00,0x00,0xb7,0xb8,0x00,0x00,0xb8,0x30,0x00,0x00,0xb8,0xe4,0x00,0x00,0xb8,0xfc,0x00,0x00,0xb9,0x14,0x00,0x00,0xb9,0x2c,0x00,0x00,0xb9,0x44,0x00,0x00,0xb9,0x5c,0x00,0x00,0xb9,0x74, -0x00,0x00,0xb9,0x8c,0x00,0x00,0xb9,0xa4,0x00,0x00,0xba,0x9c,0x00,0x00,0xbc,0x6c,0x00,0x00,0xbc,0x84,0x00,0x00,0xbd,0x10,0x00,0x00,0xbd,0x20,0x00,0x00,0xbd,0xe4,0x00,0x00,0xbd,0xf4,0x00,0x00,0xbe,0x6c,0x00,0x00,0xbf,0x20,0x00,0x00,0xbf,0x20,0x00,0x00,0xbf,0xac,0x00,0x00,0xc0,0x98,0x00,0x00,0xc1,0x48,0x00,0x00,0xc1,0xe8, -0x00,0x00,0xc2,0x58,0x00,0x00,0xc2,0xc0,0x00,0x00,0xc3,0x90,0x00,0x00,0xc4,0x18,0x00,0x00,0xc4,0x7c,0x00,0x00,0xc5,0x0c,0x00,0x00,0xc5,0xa0,0x00,0x00,0xc5,0xf4,0x00,0x00,0xc6,0x9c,0x00,0x00,0xc7,0x1c,0x00,0x00,0xc7,0xd8,0x00,0x00,0xc8,0x78,0x00,0x00,0xc9,0x50,0x00,0x00,0xca,0x20,0x00,0x00,0xcb,0x18,0x00,0x00,0xcb,0x70, -0x00,0x00,0xcb,0xf0,0x00,0x00,0xcc,0x64,0x00,0x00,0xcd,0x3c,0x00,0x00,0xcd,0xb8,0x00,0x00,0xce,0x3c,0x00,0x00,0xce,0xb8,0x00,0x00,0xd0,0x00,0x00,0x00,0xd1,0x24,0x00,0x00,0xd1,0xd0,0x00,0x00,0xd2,0xf0,0x00,0x00,0xd3,0xc4,0x00,0x00,0xd4,0x54,0x00,0x00,0xd5,0x88,0x00,0x00,0xd6,0x24,0x00,0x00,0xd7,0x24,0x00,0x00,0xd8,0x30, -0x00,0x00,0xd8,0xc4,0x00,0x00,0xd9,0x30,0x00,0x00,0xda,0x80,0x00,0x00,0xdb,0x54,0x00,0x00,0xdc,0x0c,0x00,0x00,0xdd,0x28,0x00,0x00,0xde,0x48,0x00,0x00,0xdf,0x14,0x00,0x00,0xe0,0x10,0x00,0x00,0xe0,0xac,0x00,0x00,0xe1,0x2c,0x00,0x00,0xe1,0xa0,0x00,0x00,0xe2,0x80,0x00,0x00,0xe2,0xf4,0x00,0x00,0xe3,0x84,0x00,0x00,0xe3,0xf0, -0x00,0x00,0xe4,0xa8,0x00,0x00,0xe4,0xfc,0x00,0x00,0xe5,0x80,0x00,0x00,0xe6,0x18,0x00,0x00,0xe6,0x78,0x00,0x00,0xe7,0x08,0x00,0x00,0xe7,0xac,0x00,0x00,0xe8,0x28,0x00,0x00,0xe9,0x0c,0x00,0x00,0xe9,0xac,0x00,0x00,0xea,0x50,0x00,0x00,0xea,0xe4,0x00,0x00,0xeb,0xa4,0x00,0x00,0xec,0x68,0x00,0x00,0xed,0x48,0x00,0x00,0xed,0xf8, -0x00,0x00,0xee,0x18,0x00,0x00,0xee,0x38,0x00,0x00,0xee,0x58,0x00,0x00,0xee,0x78,0x00,0x00,0xee,0x98,0x00,0x00,0xee,0xb8,0x00,0x00,0xee,0xd8,0x00,0x00,0xee,0xf8,0x00,0x00,0xef,0x18,0x00,0x00,0xef,0x38,0x00,0x00,0xef,0x58,0x00,0x00,0xef,0x78,0x00,0x00,0xef,0x98,0x00,0x00,0xef,0xb8,0x00,0x00,0xef,0xd8,0x00,0x00,0xef,0xf8, -0x00,0x00,0xf0,0x18,0x00,0x00,0xf0,0x38,0x00,0x00,0xf0,0x58,0x00,0x00,0xf0,0x78,0x00,0x00,0xf0,0x94,0x00,0x00,0xf0,0xb0,0x00,0x00,0xf0,0xcc,0x00,0x00,0xf0,0xe8,0x00,0x00,0xf1,0x04,0x00,0x00,0xf1,0x20,0x00,0x00,0xf1,0x3c,0x00,0x00,0xf1,0x58,0x00,0x00,0xf1,0x74,0x00,0x00,0xf1,0x90,0x00,0x00,0xf2,0x14,0x00,0x00,0xf2,0x68, -0x00,0x00,0xf2,0xf0,0x00,0x00,0xf3,0x84,0x00,0x00,0xf3,0xe4,0x00,0x00,0xf4,0x70,0x00,0x00,0xf5,0x04,0x00,0x00,0xf5,0x80,0x00,0x00,0xf6,0x58,0x00,0x00,0xf6,0xec,0x00,0x00,0xf7,0x0c,0x00,0x00,0xf7,0x2c,0x00,0x00,0xf7,0x4c,0x00,0x00,0xf7,0x6c,0x00,0x00,0xf7,0x8c,0x00,0x00,0xf7,0xac,0x00,0x00,0xf7,0xc8,0x00,0x00,0xf7,0xe4, -0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x88,0x00,0x00,0xf9,0x48,0x00,0x00,0xfa,0x04,0x00,0x00,0xfa,0x24,0x00,0x00,0xfa,0x44,0x00,0x00,0xfa,0x60,0x00,0x00,0xfb,0x44,0x00,0x00,0xfb,0x64,0x00,0x00,0xfb,0x80,0x00,0x00,0xfb,0x9c,0x00,0x00,0xfc,0x4c,0x00,0x00,0xfc,0x84,0x00,0x00,0xfd,0x78,0x00,0x00,0xfe,0x44,0x00,0x00,0xff,0x98, -0x00,0x00,0xff,0xb8,0x00,0x00,0xff,0xc8,0x00,0x00,0xff,0xe8,0x00,0x01,0x00,0x70,0x00,0x01,0x01,0x10,0x00,0x01,0x01,0x58,0x00,0x01,0x01,0xa8,0x00,0x01,0x02,0x24,0x00,0x01,0x02,0xb4,0x00,0x01,0x03,0x5c,0x00,0x01,0x03,0xc8,0x00,0x01,0x04,0x38,0x00,0x01,0x05,0x0c,0x00,0x01,0x05,0xe8,0x00,0x01,0x06,0x08,0x00,0x01,0x06,0x54, -0x00,0x01,0x07,0x00,0x00,0x01,0x07,0x5c,0x00,0x01,0x07,0xb4,0x00,0x01,0x07,0xfc,0x00,0x01,0x08,0x14,0x00,0x01,0x08,0xbc,0x00,0x01,0x09,0x60,0x00,0x01,0x09,0x70,0x00,0x01,0x09,0xb0,0x00,0x01,0x09,0xe4,0x00,0x01,0x0a,0x1c,0x00,0x01,0x0a,0x74,0x00,0x01,0x0a,0xf4,0x00,0x01,0x0b,0x14,0x00,0x01,0x0b,0x34,0x00,0x01,0x0b,0x78, -0x00,0x01,0x0b,0xbc,0x00,0x01,0x0c,0x6c,0x00,0x01,0x0d,0x1c,0x00,0x01,0x0d,0x68,0x00,0x01,0x0d,0xb4,0x00,0x01,0x0d,0xc4,0x00,0x01,0x0d,0xd4,0x00,0x01,0x0e,0x14,0x00,0x01,0x0e,0x58,0x00,0x01,0x0e,0x94,0x00,0x01,0x0e,0xd0,0x00,0x01,0x0f,0x14,0x00,0x01,0x0f,0x58,0x00,0x01,0x10,0x24,0x00,0x01,0x10,0x68,0x00,0x01,0x10,0xac, -0x00,0x01,0x11,0x70,0x00,0x01,0x11,0xbc,0x00,0x01,0x12,0x04,0x00,0x01,0x12,0x3c,0x00,0x01,0x12,0x4c,0x00,0x01,0x12,0x84,0x00,0x01,0x12,0xbc,0x00,0x01,0x12,0xcc,0x00,0x01,0x13,0x0c,0x00,0x01,0x13,0x7c,0x00,0x01,0x13,0x94,0x00,0x01,0x14,0x20,0x00,0x01,0x14,0x50,0x00,0x01,0x14,0xa4,0x00,0x01,0x14,0xc4,0x00,0x01,0x15,0x14, -0x00,0x01,0x15,0x94,0x00,0x01,0x15,0xfc,0x00,0x01,0x16,0x64,0x00,0x01,0x16,0xac,0x00,0x01,0x16,0xf0,0x00,0x01,0x17,0x30,0x00,0x01,0x17,0x48,0x00,0x01,0x17,0x80,0x00,0x01,0x17,0xd0,0x00,0x01,0x18,0x38,0x00,0x01,0x19,0xa4,0x00,0x01,0x1a,0x04,0x00,0x01,0x1a,0x70,0x00,0x01,0x1a,0xd8,0x00,0x01,0x1b,0x78,0x00,0x01,0x1b,0xd4, -0x00,0x01,0x1c,0x58,0x00,0x01,0x1d,0x1c,0x00,0x01,0x1d,0x34,0x00,0x01,0x1e,0xa8,0x00,0x01,0x20,0x1c,0x00,0x01,0x20,0x3c,0x00,0x01,0x21,0x00,0x00,0x01,0x21,0x18,0x00,0x01,0x21,0x7c,0x00,0x01,0x21,0xa0,0x00,0x01,0x22,0x74,0x00,0x01,0x22,0x8c,0x00,0x01,0x22,0xac,0x00,0x01,0x22,0xd0,0x00,0x01,0x22,0xe8,0x00,0x01,0x23,0x0c, -0x00,0x01,0x23,0x24,0x00,0x01,0x23,0x48,0x00,0x01,0x23,0x7c,0x00,0x01,0x23,0x94,0x00,0x01,0x25,0xa8,0x00,0x01,0x26,0x8c,0x00,0x01,0x26,0xb0,0x00,0x01,0x26,0xd4,0x00,0x01,0x26,0xec,0x00,0x01,0x27,0x10,0x00,0x01,0x27,0x28,0x00,0x01,0x27,0x48,0x00,0x01,0x27,0xc4,0x00,0x01,0x28,0x70,0x00,0x01,0x28,0x88,0x00,0x01,0x28,0xa0, -0x00,0x01,0x28,0xb8,0x00,0x01,0x28,0xd8,0x00,0x01,0x2a,0x04,0x00,0x01,0x2a,0x30,0x00,0x01,0x2a,0x48,0x00,0x01,0x2a,0x6c,0x00,0x01,0x2b,0x50,0x00,0x01,0x2c,0xe8,0x00,0x01,0x2d,0xc0,0x00,0x01,0x2f,0x0c,0x00,0x01,0x30,0x54,0x00,0x01,0x32,0x24,0x00,0x01,0x33,0x30,0x00,0x01,0x34,0xa8,0x00,0x01,0x36,0x88,0x00,0x01,0x37,0xe0, -0x00,0x01,0x38,0x98,0x00,0x01,0x39,0x88,0x00,0x01,0x39,0xac,0x00,0x01,0x39,0xe0,0x00,0x01,0x3a,0x48,0x00,0x01,0x3a,0xb0,0x00,0x01,0x3b,0x1c,0x00,0x01,0x3b,0x34,0x00,0x01,0x3b,0xb8,0x00,0x01,0x3b,0xd8,0x00,0x01,0x3c,0x28,0x00,0x01,0x3c,0x78,0x00,0x01,0x3c,0xe0,0x00,0x01,0x3d,0x18,0x00,0x01,0x3d,0xc0,0x00,0x01,0x3e,0x94, -0x00,0x01,0x3e,0xdc,0x00,0x01,0x3f,0x50,0x00,0x01,0x3f,0xb0,0x00,0x01,0x3f,0xf8,0x00,0x01,0x40,0x5c,0x00,0x01,0x40,0xbc,0x00,0x01,0x40,0xdc,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x41,0xc4,0x00,0x01,0x42,0x78, -0x00,0x01,0x43,0x68,0x00,0x01,0x44,0x40,0x00,0x01,0x45,0x5c,0x00,0x01,0x46,0x2c,0x00,0x01,0x46,0xa8,0x00,0x01,0x47,0x94,0x00,0x01,0x48,0x30,0x00,0x01,0x48,0xe8,0x00,0x01,0x49,0x68,0x00,0x01,0x4a,0x00,0x00,0x01,0x4a,0xa8,0x00,0x01,0x4b,0x68,0x00,0x01,0x4c,0x48,0x00,0x01,0x4c,0xf0,0x00,0x01,0x4d,0x8c,0x00,0x01,0x4d,0xd4, -0x00,0x01,0x4d,0xf0,0x00,0x01,0x4e,0xa8,0x00,0x01,0x4f,0x74,0x00,0x01,0x50,0x7c,0x00,0x01,0x50,0xd4,0x00,0x01,0x51,0x08,0x00,0x01,0x51,0x64,0x00,0x01,0x51,0x98,0x00,0x01,0x51,0xc8,0x00,0x01,0x51,0xd8,0x00,0x01,0x52,0x34,0x00,0x01,0x52,0xa0,0x00,0x01,0x53,0x5c,0x00,0x01,0x54,0x08,0x00,0x01,0x54,0x94,0x00,0x01,0x55,0x10, -0x00,0x01,0x55,0xbc,0x00,0x01,0x55,0xec,0x00,0x01,0x56,0x44,0x00,0x01,0x56,0xb8,0x00,0x01,0x57,0x5c,0x00,0x01,0x57,0xf8,0x00,0x01,0x58,0x58,0x00,0x01,0x58,0xc0,0x00,0x01,0x59,0xb8,0x00,0x01,0x5a,0x50,0x00,0x01,0x5a,0xa0,0x00,0x01,0x5b,0x2c,0x00,0x01,0x5b,0x7c,0x00,0x01,0x5b,0xf8,0x00,0x01,0x5c,0x48,0x00,0x01,0x5c,0x90, -0x00,0x01,0x5c,0xc4,0x00,0x01,0x5d,0x08,0x00,0x01,0x5d,0x4c,0x00,0x01,0x5e,0x04,0x00,0x01,0x5e,0xa4,0x00,0x01,0x5f,0x04,0x00,0x01,0x5f,0x68,0x00,0x01,0x5f,0xd0,0x00,0x01,0x60,0x60,0x00,0x01,0x61,0x00,0x00,0x01,0x61,0xc4,0x00,0x01,0x62,0x0c,0x00,0x01,0x62,0x58,0x00,0x01,0x62,0xdc,0x00,0x01,0x63,0x40,0x00,0x01,0x63,0xa0, -0x00,0x01,0x64,0xe8,0x00,0x01,0x66,0x2c,0x00,0x01,0x67,0x3c,0x00,0x01,0x67,0xc0,0x00,0x01,0x68,0x30,0x00,0x01,0x69,0xc0,0x00,0x01,0x6a,0xd4,0x00,0x01,0x6b,0xe4,0x00,0x01,0x6c,0xb0,0x00,0x01,0x6d,0x2c,0x00,0x01,0x6e,0x08,0x00,0x01,0x6f,0x24,0x00,0x01,0x6f,0xa8,0x00,0x01,0x70,0x84,0x00,0x01,0x71,0xa8,0x00,0x01,0x72,0x50, -0x00,0x01,0x72,0xfc,0x00,0x01,0x73,0x74,0x00,0x01,0x73,0x84,0x00,0x01,0x73,0xbc,0x00,0x01,0x74,0x58,0x00,0x01,0x74,0xb0,0x00,0x01,0x75,0x2c,0x00,0x01,0x75,0x68,0x00,0x01,0x75,0xa8,0x00,0x01,0x76,0x14,0x00,0x01,0x76,0x84,0x00,0x01,0x77,0x08,0x00,0x01,0x77,0x34,0x00,0x01,0x77,0x98,0x00,0x01,0x78,0x50,0x00,0x01,0x78,0xb0, -0x00,0x01,0x79,0x9c,0x00,0x01,0x7a,0x78,0x00,0x01,0x7a,0xd0,0x00,0x01,0x7b,0x28,0x00,0x01,0x7b,0x8c,0x00,0x01,0x7b,0xec,0x00,0x01,0x7c,0x50,0x00,0x01,0x7c,0x60,0x00,0x01,0x7c,0xb8,0x00,0x01,0x7d,0x28,0x00,0x01,0x7d,0x94,0x00,0x01,0x7e,0x48,0x00,0x01,0x7e,0x58,0x00,0x01,0x7e,0xa0,0x00,0x01,0x7e,0xd4,0x00,0x01,0x7f,0x10, -0x00,0x01,0x7f,0x54,0x00,0x01,0x7f,0x64,0x00,0x01,0x7f,0xa0,0x00,0x01,0x7f,0xdc,0x00,0x01,0x81,0x28,0x00,0x01,0x82,0xd8,0x00,0x01,0x83,0x30,0x00,0x01,0x83,0x88,0x00,0x01,0x83,0xfc,0x00,0x01,0x84,0x94,0x00,0x01,0x85,0x68,0x00,0x01,0x86,0x88,0x00,0x01,0x86,0x98,0x00,0x01,0x87,0x28,0x00,0x01,0x87,0xb4,0x00,0x01,0x88,0x94, -0x00,0x01,0x88,0xe4,0x00,0x01,0x89,0x58,0x00,0x01,0x89,0xa0,0x00,0x01,0x89,0xe4,0x00,0x01,0x89,0xf4,0x00,0x01,0x8a,0x30,0x00,0x01,0x8a,0x6c,0x00,0x01,0x8a,0xb8,0x00,0x01,0x8b,0x70,0x00,0x01,0x8b,0xec,0x00,0x01,0x8b,0xfc,0x00,0x01,0x8c,0x48,0x00,0x01,0x8c,0x90,0x00,0x01,0x8d,0x14,0x00,0x01,0x8d,0x84,0x00,0x01,0x8e,0x00, -0x00,0x01,0x8e,0x98,0x00,0x01,0x8e,0xe4,0x00,0x01,0x8f,0x50,0x00,0x01,0x8f,0x98,0x00,0x01,0x90,0x04,0x00,0x01,0x90,0x48,0x00,0x01,0x90,0xdc,0x00,0x01,0x91,0x4c,0x00,0x01,0x91,0xc0,0x00,0x01,0x92,0x48,0x00,0x01,0x92,0xcc,0x00,0x01,0x93,0x38,0x00,0x01,0x93,0x80,0x00,0x01,0x93,0xc8,0x00,0x01,0x94,0xb8,0x00,0x01,0x95,0x60, -0x00,0x01,0x97,0x44,0x00,0x01,0x97,0xb8,0x00,0x01,0x98,0x68,0x00,0x01,0x98,0xac,0x00,0x01,0x99,0x2c,0x00,0x01,0x9a,0x64,0x00,0x01,0x9b,0x18,0x00,0x01,0x9b,0xec,0x00,0x01,0x9c,0xa0,0x00,0x01,0x9d,0x54,0x00,0x01,0x9e,0x3c,0x00,0x01,0x9f,0x00,0x00,0x01,0x9f,0xd0,0x00,0x01,0xa0,0x24,0x00,0x01,0xa0,0x88,0x00,0x01,0xa0,0xf4, -0x00,0x01,0xa1,0x54,0x00,0x01,0xa1,0xa8,0x00,0x01,0xa2,0x10,0x00,0x01,0xa2,0x74,0x00,0x01,0xa2,0xd4,0x00,0x01,0xa3,0x60,0x00,0x01,0xa3,0xc4,0x00,0x01,0xa4,0xa0,0x00,0x01,0xa5,0x8c,0x00,0x01,0xa6,0x34,0x00,0x01,0xa6,0xd4,0x00,0x01,0xa7,0x6c,0x00,0x01,0xa8,0x00,0x00,0x01,0xa8,0x64,0x00,0x01,0xa8,0xf8,0x00,0x01,0xa9,0x58, -0x00,0x01,0xa9,0xd0,0x00,0x01,0xaa,0x6c,0x00,0x01,0xab,0x00,0x00,0x01,0xab,0x38,0x00,0x01,0xab,0xf0,0x00,0x01,0xac,0x48,0x00,0x01,0xac,0xec,0x00,0x01,0xad,0x38,0x00,0x01,0xad,0xd4,0x00,0x01,0xae,0x98,0x00,0x01,0xaf,0x54,0x00,0x01,0xaf,0xd0,0x00,0x01,0xb0,0x48,0x00,0x01,0xb0,0x70,0x00,0x01,0xb0,0xe8,0x00,0x01,0xb1,0x64, -0x00,0x01,0xb2,0x18,0x00,0x01,0xb2,0x60,0x00,0x01,0xb2,0xa8,0x00,0x01,0xb3,0x30,0x00,0x01,0xb3,0xb8,0x00,0x01,0xb4,0x7c,0x00,0x01,0xb4,0xb4,0x00,0x01,0xb4,0xe8,0x00,0x01,0xb5,0x1c,0x00,0x01,0xb5,0x50,0x00,0x01,0xb5,0x84,0x00,0x01,0xb5,0xb8,0x00,0x01,0xb5,0xec,0x00,0x01,0xb6,0x20,0x00,0x01,0xb6,0x54,0x00,0x01,0xb6,0x8c, -0x00,0x01,0xb6,0xbc,0x00,0x01,0xb6,0xec,0x00,0x01,0xb7,0x1c,0x00,0x01,0xb7,0x50,0x00,0x01,0xb7,0x84,0x00,0x01,0xb7,0xb8,0x00,0x01,0xb7,0xec,0x00,0x01,0xb8,0x20,0x00,0x01,0xb8,0x54,0x00,0x01,0xb8,0x88,0x00,0x01,0xb8,0xbc,0x00,0x01,0xb8,0xf0,0x00,0x01,0xb9,0x30,0x00,0x01,0xb9,0x84,0x00,0x01,0xb9,0xc4,0x00,0x01,0xba,0x04, -0x00,0x01,0xba,0x38,0x00,0x01,0xba,0x90,0x00,0x01,0xba,0xd0,0x00,0x01,0xbd,0x1c,0x00,0x01,0xc1,0xbc,0x00,0x01,0xc4,0x08,0x00,0x01,0xc4,0x58,0x00,0x01,0xc4,0xec,0x00,0x01,0xc5,0x80,0x00,0x01,0xc6,0x1c,0x00,0x01,0xc6,0x98,0x00,0x01,0xc7,0x4c,0x00,0x01,0xc8,0x80,0x00,0x01,0xc9,0x58,0x00,0x01,0xca,0x64,0x00,0x01,0xca,0xe0, -0x00,0x01,0xcb,0x08,0x00,0x01,0xcb,0x40,0x00,0x01,0xcb,0x88,0x00,0x01,0xcc,0x10,0x00,0x01,0xcc,0x40,0x00,0x01,0xcc,0x94,0x00,0x01,0xcc,0xc8,0x00,0x01,0xcd,0x18,0x00,0x01,0xcd,0x6c,0x00,0x01,0xcd,0xc0,0x00,0x01,0xce,0x10,0x00,0x01,0xce,0x64,0x00,0x01,0xce,0xc8,0x00,0x01,0xce,0xf8,0x00,0x01,0xcf,0x18,0x00,0x01,0xcf,0x3c, -0x00,0x01,0xcf,0x60,0x00,0x01,0xcf,0xac,0x00,0x01,0xcf,0xdc,0x00,0x01,0xd0,0x1c,0x00,0x01,0xd0,0x50,0x00,0x01,0xd0,0x70,0x00,0x01,0xd0,0x90,0x00,0x01,0xd0,0xc0,0x00,0x01,0xd0,0xec,0x00,0x01,0xd1,0x1c,0x00,0x01,0xd1,0x3c,0x00,0x01,0xd1,0x64,0x00,0x01,0xd1,0x84,0x00,0x01,0xd1,0xcc,0x00,0x01,0xd1,0xf8,0x00,0x01,0xd2,0x34, -0x00,0x01,0xd2,0x60,0x00,0x01,0xd2,0xe4,0x00,0x01,0xd3,0x50,0x00,0x01,0xd3,0xbc,0x00,0x01,0xd4,0x14,0x00,0x01,0xd4,0x94,0x00,0x01,0xd4,0xfc,0x00,0x01,0xd5,0x64,0x00,0x01,0xd5,0xb0,0x00,0x01,0xd6,0x60,0x00,0x01,0xd6,0xec,0x00,0x01,0xd7,0x74,0x00,0x01,0xd7,0xcc,0x00,0x01,0xd8,0x20,0x00,0x01,0xd8,0x74,0x00,0x01,0xd8,0xc0, -0x00,0x01,0xd9,0x04,0x00,0x01,0xd9,0x5c,0x00,0x01,0xd9,0xa0,0x00,0x01,0xd9,0xf8,0x00,0x01,0xda,0x58,0x00,0x01,0xda,0xa4,0x00,0x01,0xda,0xe8,0x00,0x01,0xdb,0x40,0x00,0x01,0xdb,0x84,0x00,0x01,0xdb,0xdc,0x00,0x01,0xdc,0x3c,0x00,0x01,0xdc,0xa8,0x00,0x01,0xdd,0x00,0x00,0x01,0xdd,0x58,0x00,0x01,0xdd,0xa8,0x00,0x01,0xdd,0xfc, -0x00,0x01,0xde,0x30,0x00,0x01,0xde,0x7c,0x00,0x01,0xde,0xc0,0x00,0x01,0xdf,0x04,0x00,0x01,0xdf,0x3c,0x00,0x01,0xdf,0x74,0x00,0x01,0xdf,0xc0,0x00,0x01,0xe0,0x3c,0x00,0x01,0xe0,0xcc,0x00,0x01,0xe1,0x04,0x00,0x01,0xe1,0x68,0x00,0x01,0xe1,0xdc,0x00,0x01,0xe2,0x10,0x00,0x01,0xe2,0x5c,0x00,0x01,0xe2,0xa0,0x00,0x01,0xe2,0xe4, -0x00,0x01,0xe3,0x28,0x00,0x01,0xe3,0x5c,0x00,0x01,0xe3,0xb8,0x00,0x01,0xe4,0x08,0x00,0x01,0xe4,0x58,0x00,0x01,0xe4,0xc0,0x00,0x01,0xe5,0x18,0x00,0x01,0xe5,0x70,0x00,0x01,0xe5,0xd4,0x00,0x01,0xe6,0x2c,0x00,0x01,0xe6,0x80,0x00,0x01,0xe6,0xe0,0x00,0x01,0xe7,0x48,0x00,0x01,0xe7,0xa0,0x00,0x01,0xe7,0xf8,0x00,0x01,0xe8,0x50, -0x00,0x01,0xe8,0xac,0x00,0x01,0xe9,0x18,0x00,0x01,0xe9,0x58,0x00,0x01,0xe9,0x98,0x00,0x01,0xe9,0xe8,0x00,0x01,0xea,0x3c,0x00,0x01,0xea,0x70,0x00,0x01,0xea,0xbc,0x00,0x01,0xeb,0x00,0x00,0x01,0xeb,0x44,0x00,0x01,0xeb,0x7c,0x00,0x01,0xeb,0xb4,0x00,0x01,0xec,0x00,0x00,0x01,0xec,0x7c,0x00,0x01,0xed,0x0c,0x00,0x01,0xed,0x44, -0x00,0x01,0xed,0xa8,0x00,0x01,0xee,0x1c,0x00,0x01,0xee,0x50,0x00,0x01,0xee,0x94,0x00,0x01,0xee,0xe0,0x00,0x01,0xef,0x24,0x00,0x01,0xef,0x68,0x00,0x01,0xef,0x9c,0x00,0x01,0xef,0xfc,0x00,0x01,0xf0,0x4c,0x00,0x01,0xf0,0x9c,0x00,0x01,0xf1,0x04,0x00,0x01,0xf1,0x5c,0x00,0x01,0xf1,0xb4,0x00,0x01,0xf2,0x18,0x00,0x01,0xf2,0x70, -0x00,0x01,0xf2,0xc4,0x00,0x01,0xf3,0x24,0x00,0x01,0xf3,0x8c,0x00,0x01,0xf3,0xe4,0x00,0x01,0xf4,0x38,0x00,0x01,0xf4,0x8c,0x00,0x01,0xf4,0xec,0x00,0x01,0xf5,0x38,0x00,0x01,0xf5,0x90,0x00,0x01,0xf5,0xd4,0x00,0x01,0xf6,0x2c,0x00,0x01,0xf6,0x70,0x00,0x01,0xf6,0xd0,0x00,0x01,0xf7,0x1c,0x00,0x01,0xf7,0x74,0x00,0x01,0xf7,0xb8, -0x00,0x01,0xf8,0x10,0x00,0x01,0xf8,0x54,0x00,0x01,0xf8,0xbc,0x00,0x01,0xf9,0x14,0x00,0x01,0xf9,0x6c,0x00,0x01,0xf9,0xe4,0x00,0x01,0xfa,0x48,0x00,0x01,0xfa,0xb0,0x00,0x01,0xfb,0x0c,0x00,0x01,0xfb,0x5c,0x00,0x01,0xfb,0xac,0x00,0x01,0xfc,0x0c,0x00,0x01,0xfc,0x5c,0x00,0x01,0xfc,0xac,0x00,0x01,0xfd,0x30,0x00,0x01,0xfd,0x94, -0x00,0x01,0xfd,0xf8,0x00,0x01,0xfe,0x54,0x00,0x01,0xff,0x0c,0x00,0x01,0xff,0xe0,0x00,0x02,0x00,0x40,0x00,0x02,0x00,0x58,0x00,0x02,0x01,0x48,0x00,0x02,0x02,0x3c,0x00,0x02,0x03,0x08,0x00,0x02,0x03,0xac,0x00,0x02,0x04,0x60,0x00,0x02,0x04,0xc0,0x00,0x02,0x05,0x7c,0x00,0x02,0x06,0x04,0x00,0x02,0x06,0x88,0x00,0x02,0x07,0x0c, -0x00,0x02,0x08,0x20,0x00,0x02,0x08,0x84,0x00,0x02,0x08,0x9c,0x00,0x02,0x09,0x14,0x00,0x02,0x09,0xd8,0x00,0x02,0x0a,0x3c,0x00,0x02,0x0a,0x98,0x00,0x02,0x0b,0x84,0x00,0x02,0x0b,0x9c,0x00,0x02,0x0b,0xac,0x00,0x02,0x0c,0x28,0x00,0x02,0x0d,0x00,0x00,0x02,0x0d,0x9c,0x00,0x02,0x0e,0x3c,0x00,0x02,0x0e,0xa8,0x00,0x02,0x0f,0x58, -0x00,0x02,0x10,0x24,0x00,0x02,0x10,0x78,0x00,0x02,0x10,0xe0,0x00,0x02,0x11,0xb0,0x00,0x02,0x12,0x64,0x00,0x02,0x13,0x10,0x00,0x02,0x13,0xc0,0x00,0x02,0x14,0x44,0x00,0x02,0x15,0x1c,0x00,0x02,0x15,0xc8,0x00,0x02,0x16,0x58,0x00,0x02,0x16,0xe8,0x00,0x02,0x17,0x80,0x00,0x02,0x17,0xa0,0x00,0x02,0x18,0x60,0x00,0x02,0x18,0xf4, -0x00,0x02,0x19,0xc4,0x00,0x02,0x1a,0xec,0x00,0x02,0x1b,0xac,0x00,0x02,0x1c,0x20,0x00,0x02,0x1c,0xd0,0x00,0x02,0x1d,0x6c,0x00,0x02,0x1d,0xf0,0x00,0x02,0x1e,0x54,0x00,0x02,0x1e,0xf0,0x00,0x02,0x1f,0x60,0x00,0x02,0x1f,0xf8,0x00,0x02,0x20,0x58,0x00,0x02,0x20,0xa8,0x00,0x02,0x21,0x54,0x00,0x02,0x22,0x4c,0x00,0x02,0x22,0x70, -0x00,0x02,0x22,0x88,0x00,0x02,0x23,0x4c,0x00,0x02,0x23,0xf4,0x00,0x02,0x24,0xbc,0x00,0x02,0x25,0x14,0x00,0x02,0x25,0x74,0x00,0x02,0x26,0x54,0x00,0x02,0x27,0x44,0x00,0x02,0x27,0xdc,0x00,0x02,0x28,0x20,0x00,0x02,0x28,0x4c,0x00,0x02,0x28,0x84,0x00,0x02,0x28,0xbc,0x00,0x02,0x28,0xf4,0x00,0x02,0x29,0xbc,0x00,0x02,0x2a,0xfc, -0x00,0x02,0x2b,0xdc,0x00,0x02,0x2d,0x04,0x00,0x02,0x2d,0x64,0x00,0x02,0x2e,0x78,0x00,0x02,0x2f,0x90,0x00,0x02,0x30,0x98,0x00,0x02,0x31,0x60,0x00,0x02,0x31,0xe8,0x00,0x02,0x32,0x08,0x00,0x02,0x32,0x38,0x00,0x02,0x32,0x68,0x00,0x02,0x32,0xc0,0x00,0x02,0x33,0x18,0x00,0x02,0x33,0xc8,0x00,0x02,0x34,0x40,0x00,0x02,0x35,0x5c, -0x00,0x02,0x36,0x18,0x00,0x02,0x36,0xe0,0x00,0x02,0x37,0x4c,0x00,0x02,0x37,0xfc,0x00,0x02,0x38,0xe4,0x00,0x02,0x39,0xe4,0x00,0x02,0x3a,0x20,0x00,0x02,0x3a,0x5c,0x00,0x02,0x3a,0xa0,0x00,0x02,0x3a,0xdc,0x00,0x02,0x3b,0x20,0x00,0x02,0x3b,0xd8,0x00,0x02,0x3c,0x74,0x00,0x02,0x3d,0x30,0x00,0x02,0x3d,0xe0,0x00,0x02,0x3f,0x0c, -0x00,0x02,0x3f,0xe8,0x00,0x02,0x40,0xc4,0x00,0x02,0x41,0x98,0x00,0x02,0x42,0x64,0x00,0x02,0x42,0xf4,0x00,0x02,0x43,0xd4,0x00,0x02,0x45,0x18,0x00,0x02,0x45,0xf4,0x00,0x02,0x46,0xf0,0x00,0x02,0x47,0x88,0x00,0x02,0x48,0xc0,0x00,0x02,0x49,0x50,0x00,0x02,0x4a,0x34,0x00,0x02,0x4a,0x8c,0x00,0x02,0x4b,0x3c,0x00,0x02,0x4b,0xbc, -0x00,0x02,0x4c,0x3c,0x00,0x02,0x4d,0x3c,0x00,0x02,0x4d,0xa0,0x00,0x02,0x4e,0x20,0x00,0x02,0x4e,0xa4,0x00,0x02,0x50,0x10,0x00,0x02,0x50,0xa8,0x00,0x02,0x51,0x28,0x00,0x02,0x51,0xe0,0x00,0x02,0x52,0x74,0x00,0x02,0x53,0x28,0x00,0x02,0x54,0x00,0x00,0x02,0x54,0xd8,0x00,0x02,0x55,0x74,0x00,0x02,0x55,0xc0,0x00,0x02,0x56,0x28, -0x00,0x02,0x56,0x90,0x00,0x02,0x57,0xb8,0x00,0x02,0x58,0xa8,0x00,0x02,0x59,0xa8,0x00,0x02,0x5a,0xd4,0x00,0x02,0x5b,0xe8,0x00,0x02,0x5c,0xec,0x00,0x02,0x5e,0x14,0x00,0x02,0x5f,0x54,0x00,0x02,0x60,0x64,0x00,0x02,0x61,0x00,0x00,0x02,0x61,0x84,0x00,0x02,0x62,0x88,0x00,0x02,0x63,0x10,0x00,0x02,0x63,0xbc,0x00,0x02,0x63,0xd0, -0x00,0x02,0x64,0x88,0x00,0x02,0x65,0x70,0x00,0x02,0x66,0x5c,0x00,0x02,0x67,0x68,0x00,0x02,0x68,0x80,0x00,0x02,0x6a,0x00,0x00,0x02,0x6a,0xc8,0x00,0x02,0x6b,0xcc,0x00,0x02,0x6d,0x9c,0x00,0x02,0x70,0x14,0x00,0x02,0x71,0x70,0x00,0x02,0x71,0xdc,0x00,0x02,0x72,0x54,0x00,0x02,0x73,0x14,0x00,0x02,0x73,0x78,0x00,0x02,0x73,0x90, -0x00,0x02,0x74,0x18,0x00,0x02,0x74,0x78,0x00,0x02,0x75,0x34,0x00,0x02,0x75,0xd8,0x00,0x02,0x76,0x78,0x00,0x02,0x77,0x00,0x00,0x02,0x77,0x98,0x00,0x02,0x78,0x1c,0x00,0x02,0x79,0x14,0x00,0x02,0x79,0xa8,0x00,0x02,0x7a,0x60,0x00,0x02,0x7a,0xf0,0x00,0x02,0x7b,0xcc,0x00,0x02,0x7c,0xe4,0x00,0x02,0x7d,0xbc,0x00,0x02,0x7e,0x14, -0x00,0x02,0x7e,0x88,0x00,0x02,0x7f,0x40,0x00,0x02,0x7f,0xf8,0x00,0x02,0x80,0xb0,0x00,0x02,0x81,0x4c,0x00,0x02,0x81,0xc8,0x00,0x02,0x82,0x30,0x00,0x02,0x82,0xc0,0x00,0x02,0x82,0xe4,0x00,0x02,0x83,0x08,0x00,0x02,0x83,0x58,0x00,0x02,0x83,0xfc,0x00,0x02,0x84,0x20,0x00,0x02,0x84,0xa0,0x00,0x02,0x85,0x38,0x00,0x02,0x85,0x58, -0x00,0x02,0x85,0xc4,0x00,0x02,0x86,0x30,0x00,0x02,0x86,0x98,0x00,0x02,0x87,0x08,0x00,0x02,0x87,0x78,0x00,0x02,0x87,0x9c,0x00,0x02,0x87,0xc8,0x00,0x02,0x88,0xa4,0x00,0x02,0x88,0xbc,0x00,0x02,0x88,0xdc,0x00,0x02,0x89,0x60,0x00,0x02,0x8a,0x00,0x00,0x02,0x8a,0xbc,0x00,0x02,0x8b,0x60,0x00,0x02,0x8c,0x68,0x00,0x02,0x8d,0x94, -0x00,0x02,0x8e,0x9c,0x00,0x02,0x8f,0x30,0x00,0x02,0x8f,0xf4,0x00,0x02,0x90,0x44,0x00,0x02,0x90,0xc8,0x00,0x02,0x91,0x6c,0x00,0x02,0x92,0x34,0x00,0x02,0x92,0xfc,0x00,0x02,0x93,0x8c,0x00,0x02,0x93,0xe4,0x00,0x02,0x93,0xfc,0x00,0x02,0x94,0x7c,0x00,0x02,0x95,0x14,0x00,0x02,0x95,0x34,0x00,0x02,0x96,0xb8,0x00,0x02,0x98,0x00, -0x00,0x02,0x99,0x80,0x00,0x02,0x9b,0x3c,0x00,0x02,0x9b,0xa8,0x00,0x02,0x9c,0x44,0x00,0x02,0x9d,0x0c,0x00,0x02,0x9e,0xb0,0x00,0x02,0x9f,0xf4,0x00,0x02,0xa0,0xfc,0x00,0x02,0xa2,0xec,0x00,0x02,0xa3,0x74,0x00,0x02,0xa3,0xf8,0x00,0x02,0xa4,0xa8,0x00,0x02,0xa5,0x20,0x00,0x02,0xa5,0xc0,0x00,0x02,0xa5,0xf8,0x00,0x02,0xa6,0x08, -0x00,0x02,0xa6,0x44,0x00,0x02,0xa6,0x9c,0x00,0x02,0xa6,0xb0,0x00,0x02,0xa6,0xec,0x00,0x02,0xa7,0x6c,0x00,0x02,0xa7,0xc0,0x00,0x02,0xa7,0xfc,0x00,0x02,0xa8,0x38,0x00,0x02,0xa8,0x94,0x00,0x02,0xa8,0xc8,0x00,0x02,0xa9,0x14,0x00,0x02,0xa9,0x60,0x00,0x02,0xa9,0xc4,0x00,0x02,0xaa,0x4c,0x00,0x02,0xab,0x04,0x00,0x02,0xab,0x44, -0x00,0x02,0xab,0xc8,0x00,0x02,0xac,0x14,0x00,0x02,0xac,0x50,0x00,0x02,0xac,0xc8,0x00,0x02,0xad,0x1c,0x00,0x02,0xad,0xa0,0x00,0x02,0xad,0xdc,0x00,0x02,0xae,0x50,0x00,0x02,0xae,0xb8,0x00,0x02,0xae,0xf8,0x00,0x02,0xaf,0x38,0x00,0x02,0xaf,0x78,0x00,0x02,0xaf,0x8c,0x00,0x02,0xaf,0xa0,0x00,0x02,0xaf,0xb4,0x00,0x02,0xaf,0xc8, -0x00,0x02,0xaf,0xdc,0x00,0x02,0xaf,0xf0,0x00,0x02,0xb0,0x04,0x00,0x02,0xb0,0x18,0x00,0x02,0xb0,0x2c,0x00,0x02,0xb0,0x40,0x00,0x02,0xb0,0x54,0x00,0x02,0xb0,0x68,0x00,0x02,0xb0,0x7c,0x00,0x02,0xb0,0x8c,0x00,0x02,0xb1,0x04,0x00,0x02,0xb1,0x50,0x00,0x02,0xb1,0x84,0x00,0x02,0xb1,0xb8,0x00,0x02,0xb2,0x0c,0x00,0x02,0xb2,0x50, -0x00,0x02,0xb2,0x94,0x00,0x02,0xb2,0xf0,0x00,0x02,0xb3,0x70,0x00,0x02,0xb4,0x20,0x00,0x02,0xb4,0x58,0x00,0x02,0xb4,0xd4,0x00,0x02,0xb5,0x18,0x00,0x02,0xb5,0x70,0x00,0x02,0xb5,0xac,0x00,0x02,0xb6,0x14,0x00,0x02,0xb6,0x60,0x00,0x02,0xb6,0xd4,0x00,0x02,0xb7,0x08,0x00,0x02,0xb7,0x94,0x00,0x02,0xb8,0x10,0x00,0x02,0xb8,0x6c, -0x00,0x02,0xb8,0xa4,0x00,0x02,0xb8,0xb8,0x00,0x02,0xb8,0xcc,0x00,0x02,0xb8,0xe0,0x00,0x02,0xb8,0xf4,0x00,0x02,0xb9,0x08,0x00,0x02,0xb9,0x1c,0x00,0x02,0xb9,0x30,0x00,0x02,0xb9,0x44,0x00,0x02,0xb9,0x58,0x00,0x02,0xb9,0x6c,0x00,0x02,0xb9,0x80,0x00,0x02,0xb9,0xbc,0x00,0x02,0xb9,0xf0,0x00,0x02,0xba,0xc0,0x00,0x02,0xbb,0x1c, -0x00,0x02,0xbb,0x98,0x00,0x02,0xbc,0x14,0x00,0x02,0xbc,0xe8,0x00,0x02,0xbd,0xec,0x00,0x02,0xbe,0x50,0x00,0x02,0xbe,0xc0,0x00,0x02,0xbf,0x80,0x00,0x02,0xc0,0x74,0x00,0x02,0xc0,0xf4,0x00,0x02,0xc1,0x74,0x00,0x02,0xc2,0x4c,0x00,0x02,0xc3,0x18,0x00,0x02,0xc3,0x7c,0x00,0x02,0xc3,0xec,0x00,0x02,0xc4,0xac,0x00,0x02,0xc5,0x68, -0x00,0x02,0xc5,0xec,0x00,0x02,0xc6,0x9c,0x00,0x02,0xc7,0x70,0x00,0x02,0xc7,0xa8,0x00,0x02,0xc7,0xf0,0x00,0x02,0xc8,0x30,0x00,0x02,0xc8,0x78,0x00,0x02,0xc9,0x24,0x00,0x02,0xc9,0x3c,0x00,0x02,0xc9,0x3c,0x00,0x02,0xc9,0x3c,0x00,0x03,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x31,0x40,0x2e, -0x09,0x04,0x02,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x33,0x11,0x21,0x11,0x25,0x01,0x21,0x13,0x21,0x11,0x5a,0x01,0xa4,0xfe,0x8e,0x01,0x2c, -0xfe,0xd4,0x14,0x01,0x2c,0x02,0xda,0xfd,0x26,0x6d,0x02,0x3b,0xfd,0x8a,0x02,0x3b,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x2c,0x40,0x29,0x0d,0x01,0x04,0x00,0x01,0x4c,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x68,0x00,0x00,0x00,0x38,0x4d,0x05,0x03,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x09, -0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x06,0x09,0x19,0x2b,0x33,0x13,0x33,0x13,0x23,0x27,0x23,0x07,0x13,0x33,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x32,0xbe,0x79,0xbd,0x5b,0x30,0xdd,0x30,0x42,0xb8,0x38,0x10,0x12,0x02,0x02,0x12,0x10,0x02,0xda,0xfd,0x26,0xc2,0xc2,0x01,0x0e,0xe1,0x40,0x56,0x0d,0x0d,0x56,0x3f,0x00,0x00,0x00, -0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x00,0x27,0x06,0xbc,0x02,0x58, -0x00,0x00,0x02,0x06,0x00,0x01,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26,0x03,0xb6,0x00,0x27,0x06,0x95,0x02,0x58,0x00,0x00,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbd,0x02,0x58,0x00,0x00, -0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbe,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbf,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00, -0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x67,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26, -0x03,0xb6,0x00,0x27,0x06,0x93,0x02,0x58,0x00,0x00,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc1,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00, -0x00,0x07,0x06,0xc2,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb1,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26, -0x02,0xda,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xd4,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00, -0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0x93,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x32,0xff,0x35,0x02,0x49,0x02,0xda,0x00,0x16,0x00,0x1f,0x00,0x65,0x40,0x0a,0x1c,0x01,0x06,0x00,0x13,0x01,0x01,0x04,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1f,0x00,0x06,0x00,0x04,0x01, -0x06,0x04,0x68,0x00,0x00,0x00,0x38,0x4d,0x07,0x05,0x02,0x01,0x01,0x39,0x4d,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x1c,0x00,0x06,0x00,0x04,0x01,0x06,0x04,0x68,0x00,0x02,0x00,0x03,0x02,0x03,0x63,0x00,0x00,0x00,0x38,0x4d,0x07,0x05,0x02,0x01,0x01,0x39,0x01,0x4e,0x59,0x40,0x10,0x00,0x00,0x18,0x17, -0x00,0x16,0x00,0x16,0x16,0x21,0x25,0x11,0x11,0x08,0x09,0x1b,0x2b,0x33,0x13,0x33,0x13,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x27,0x23,0x07,0x13,0x33,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x32,0xbe,0x79,0xbd,0x11,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x21,0x29,0x30,0xdd,0x30,0x42, -0xb8,0x38,0x10,0x12,0x02,0x02,0x12,0x10,0x02,0xda,0xfd,0x26,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1b,0x36,0x1f,0xc0,0xc2,0x01,0x0e,0xe1,0x40,0x56,0x0d,0x0d,0x56,0x3f,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xe2,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x96,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32, -0x00,0x00,0x02,0x26,0x03,0xb1,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0f,0x00,0x13,0x00,0x3f,0x40,0x3c,0x00,0x02,0x00,0x03,0x08,0x02,0x03,0x67,0x00,0x08,0x00,0x06,0x04,0x08,0x06,0x67,0x09,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38, -0x4d,0x00,0x04,0x04,0x05,0x5f,0x0a,0x07,0x02,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x13,0x12,0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1d,0x2b,0x33,0x13,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x21,0x35,0x23,0x07,0x13,0x33,0x11,0x23,0x1e,0x91,0x01,0x8b,0xb6,0x9d,0x9d,0xb6,0xfe, -0xf4,0x8d,0x28,0x36,0x7f,0x38,0x02,0xda,0x52,0xe4,0x52,0xff,0x00,0x52,0xcb,0xcb,0x01,0x16,0x01,0x72,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x3a,0x03,0xb6,0x02,0x26,0x00,0x18,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0x00,0x03,0x00,0x5d,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x10,0x00,0x19,0x00,0x22,0x00,0x39,0x40,0x36, -0x08,0x01,0x05,0x02,0x01,0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x01,0x5f,0x06,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x22,0x20,0x1c,0x1a,0x19,0x17,0x13,0x11,0x00,0x10,0x00,0x0f,0x21,0x07,0x09,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07, -0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5d,0xcf,0x64,0x71,0x47,0x39,0x2b,0x41,0x25,0x73,0x64,0x86,0x76,0x3a,0x43,0x42,0x3a,0x77,0x7c,0x3f,0x49,0x49,0x3f,0x7c,0x02,0xda,0x64,0x59,0x38,0x5a,0x0b,0x03,0x05,0x32,0x4d,0x2e,0x5e,0x6d,0x01, -0xa3,0x3e,0x35,0x35,0x3e,0xfd,0xc8,0x43,0x3a,0x3c,0x4b,0x00,0x00,0x01,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x1b,0x00,0x3b,0x40,0x38,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00, -0x4e,0x01,0x00,0x19,0x18,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b, -0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26, -0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x5d,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x35,0x02,0x0a,0x02,0xe4,0x00,0x2f,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x05,0x28,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00, -0x07,0x01,0x72,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09, -0x01,0x08,0x00,0x08,0x63,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x2f,0x00,0x2e,0x12,0x12,0x25,0x22,0x12,0x27,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x34,0x36,0x33, -0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd2,0x46,0x16,0x1b,0x37,0x32,0x18,0x49,0x53,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x62,0x03,0x01,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb, -0x37,0x17,0x0d,0x11,0x1a,0x41,0x10,0x6a,0x52,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x43,0x3e,0x61,0x71,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x5c, -0xff,0xf6,0x02,0x0a,0x03,0xb0,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0b,0x00,0x15,0x00,0x27,0x40,0x24,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x15,0x13, -0x0e,0x0c,0x00,0x0b,0x00,0x0a,0x21,0x05,0x09,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x5c,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x02,0xda,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41, -0x4a,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0f,0x00,0x1d,0x00,0x37,0x40,0x34,0x06,0x01,0x01,0x07,0x01,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x08,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x17,0x12,0x10, -0x00,0x0f,0x00,0x0e,0x21,0x11,0x11,0x09,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x15,0x33,0x15,0x23,0x5c,0x52,0x52,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x6c,0x6c,0x01,0x4f,0x4b,0x01, -0x40,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41,0x4a,0xf0,0x4b,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x21,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0f,0x00,0x1d,0x00,0x37,0x40,0x34,0x06,0x01, -0x01,0x07,0x01,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x08,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x17,0x12,0x10,0x00,0x0f,0x00,0x0e,0x21,0x11,0x11,0x09,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14, -0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x15,0x33,0x15,0x23,0x5c,0x52,0x52,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x6c,0x6c,0x01,0x4f,0x4b,0x01,0x40,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41,0x4a,0xf0,0x4b,0x00,0x00,0x00,0x01,0x00,0x64, -0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x06,0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21, -0x15,0x21,0x11,0x21,0x15,0x64,0x01,0xa4,0xfe,0xb5,0x01,0x28,0xfe,0xd8,0x01,0x4b,0x02,0xda,0x52,0xe2,0x50,0xfe,0xfc,0x52,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00, -0x00,0x07,0x06,0x95,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x71, -0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x2b,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x27,0x06,0x9e,0x02,0x62,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00, -0x00,0x07,0x06,0xc1,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x30,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc2,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08, -0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb0,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x2b,0x02,0x08,0x02,0xda,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x62,0x00,0x00, -0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xd4,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0x93,0x02,0x26,0x00,0x25,0x00,0x00, -0x00,0x07,0x06,0x98,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0x35,0x02,0x0d,0x02,0xda,0x00,0x1b,0x00,0x6e,0x4b,0xb0,0x15,0x50,0x58,0x40,0x29,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x4d,0x00,0x06,0x06,0x07,0x5f, -0x00,0x07,0x07,0x3d,0x07,0x4e,0x1b,0x40,0x26,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x06,0x00,0x07,0x06,0x07,0x63,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x05,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x1b,0x00,0x1b,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x11, -0x0a,0x09,0x1e,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x21,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x64,0x01,0xa4,0xfe,0xb5,0x01,0x28,0xfe,0xd8,0x01,0x4b,0x2f,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x02,0xda,0x52,0xe2,0x50,0xfe,0xfc,0x52,0x1b,0x2d, -0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0x00,0x01,0x00,0x42,0xff,0xf6,0x02,0x24,0x02,0xe4,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x07,0x01,0x05,0x04,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00, -0x01,0x01,0x3e,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x2a,0x29,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x16,0x14,0x13,0x10,0x0e,0x00,0x2d,0x01,0x2d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23, -0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x0e,0x02,0x01,0x35,0x48,0x6d,0x3e,0x4e,0x3e,0x34,0x41,0x37,0x61,0x40,0x42,0x65,0x38,0x5a,0x4a,0x3b,0x38,0x46,0x47,0x39,0x57,0x56,0x43,0x53,0x53,0x43,0x41,0x54,0x01,0x5a,0x01,0x3d,0x6b,0x0a,0x35,0x5e,0x3e,0x47,0x67,0x0b,0x03, -0x0d,0x5b,0x3c,0x38,0x55,0x30,0x35,0x5e,0x3f,0x3a,0x48,0x41,0x35,0x36,0x44,0x50,0x4b,0x3c,0x3c,0x4b,0x48,0x3a,0x3e,0x5f,0x35,0x00,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x5f,0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x09, -0x00,0x29,0x40,0x26,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x5f,0x01,0xae,0xfe,0xaa,0x01,0x3c,0xfe,0xc6,0x02,0xda, -0x52,0xf2,0x52,0xfe,0xbc,0x00,0x00,0x00,0x00,0x01,0x00,0x58,0xff,0xf6,0x02,0x06,0x02,0xe4,0x00,0x1f,0x00,0x3e,0x40,0x3b,0x00,0x02,0x03,0x06,0x03,0x02,0x06,0x80,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00, -0x1c,0x1b,0x1a,0x19,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f,0x01,0x1f,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x15,0x14,0x06,0x01,0x30,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b, -0x43,0x43,0x3b,0x3b,0x41,0x94,0xee,0x74,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x42,0x3e,0xfe,0xb5,0x3e,0x44,0x44,0x3e,0x64,0x52,0xb6,0x61,0x71,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06, -0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00, -0xff,0xff,0x00,0x58,0xff,0x10,0x02,0x06,0x02,0xe4,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x5c,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb0,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x00,0x0b,0x00,0x27,0x40,0x24, -0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x38,0x4d,0x06,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x5d,0x5a,0xea,0x5a,0x5a,0xea,0x02,0xda,0xfe,0xc8,0x01,0x38,0xfd,0x26,0x01, -0x50,0xfe,0xb0,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x13,0x00,0x17,0x00,0x3b,0x40,0x38,0x05,0x03,0x02,0x01,0x0b,0x06,0x02,0x00,0x0a,0x01,0x00,0x67,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x67,0x04,0x01,0x02,0x02,0x38,0x4d,0x0c,0x09,0x02,0x07,0x07,0x39,0x07,0x4e,0x00,0x00,0x17,0x16,0x15,0x14,0x00,0x13, -0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1f,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x11,0x33,0x35,0x23,0x5d,0x53,0x53,0x5a,0xea,0x5a,0x53,0x53,0x5a,0xea,0xea,0xea,0x02,0x0d,0x4b,0x82,0x82,0x82,0x82,0x4b,0xfd,0xf3,0x01,0x50,0xfe, -0xb0,0x01,0xa2,0x6b,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x03,0xb6,0x02,0x26,0x00,0x40,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x00,0x0b,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x06,0x01,0x05, -0x05,0x39,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x69,0x95,0x95,0x01,0x86,0x95,0x95,0x52,0x02,0x36,0x52,0x52,0xfd,0xca,0x52,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00, -0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef, -0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb0,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0xff,0x2b,0x01,0xef,0x02,0xda,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00, -0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xd4,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0x93,0x02,0x26,0x00,0x43,0x00,0x00, -0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x35,0x01,0xef,0x02,0xda,0x00,0x1b,0x00,0x62,0x4b,0xb0,0x15,0x50,0x58,0x40,0x23,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x4d,0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x07,0x3d,0x07,0x4e, -0x1b,0x40,0x20,0x00,0x06,0x00,0x07,0x06,0x07,0x63,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x05,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x1b,0x00,0x1b,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15, -0x23,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x69,0x95,0x95,0x01,0x86,0x95,0x95,0xa2,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x52,0x02,0x36,0x52,0x52,0xfd,0xca,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x69, -0x00,0x00,0x01,0xef,0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x2d,0xff,0xf6,0x01,0xef,0x02,0xda,0x00,0x0f,0x00,0x2b,0x40,0x28,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x03,0x03,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0c, -0x0b,0x08,0x06,0x04,0x03,0x00,0x0f,0x01,0x0f,0x05,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x0e,0x69,0x78,0x5a,0x47,0x40,0x40,0x47,0x5a,0x79,0x0a,0x76,0x66,0x43,0x49,0x49,0x43,0x02,0x08,0xfd,0xf8,0x66,0x76,0x00,0x00,0x00,0xff,0xff,0x00,0x2d,0xff,0xf6,0x02,0x77, -0x03,0xb6,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0xee,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x0c,0x00,0x2d,0x40,0x2a,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x38,0x4d,0x06,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0c, -0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x23,0x03,0x23,0x11,0x5c,0x5a,0x6c,0xa2,0x62,0xb5,0xbf,0x67,0xaa,0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0x86,0x01,0x51,0xfe,0xaf,0xff,0xff,0x00,0x5c,0xff,0x10,0x02,0x30,0x02,0xda,0x02,0x26,0x00,0x51,0x00,0x00, -0x00,0x07,0x06,0xa0,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x05,0x00,0x1f,0x40,0x1c,0x00,0x00,0x00,0x38,0x4d,0x00,0x01,0x01,0x02,0x60,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x09,0x18,0x2b,0x33,0x11,0x33,0x11,0x21,0x15,0x82,0x5a,0x01,0x4a,0x02, -0xda,0xfd,0x78,0x52,0xff,0xff,0x00,0x75,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x06,0x91,0x01,0xe5,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x06,0x6d,0x01,0xf9,0x00,0x00,0xff,0xff,0x00,0x82,0xff,0x10,0x02,0x26,0x02,0xda,0x02,0x26, -0x00,0x53,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x80,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x03,0x29,0x00,0xa5,0x01,0x13,0x00,0x09,0xb1,0x01,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x2c,0x40,0x29, -0x0a,0x09,0x08,0x07,0x04,0x03,0x02,0x01,0x08,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x01,0x01,0x02,0x60,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x15,0x15,0x04,0x09,0x18,0x2b,0x33,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x21,0x15,0x82,0x6e,0x6e,0x5a,0xaa,0xaa,0x01,0x4a, -0x01,0x30,0x4a,0x50,0x4a,0x01,0x5a,0xfe,0xe3,0x73,0x50,0x73,0xfe,0xe5,0x52,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0xda,0x00,0x13,0x00,0x2e,0x40,0x2b,0x0f,0x0c,0x03,0x03,0x03,0x00,0x01,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x01,0x01,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00, -0x00,0x13,0x00,0x13,0x16,0x11,0x12,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x13,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x36,0x37,0x03,0x23,0x03,0x16,0x16,0x15,0x11,0x48,0x85,0x5d,0x61,0x85,0x57,0x03,0x06,0x04,0x76,0x4e,0x71,0x08,0x06,0x02,0xda,0xfe,0xc4,0x01,0x3c,0xfd,0x26,0x01,0x59,0x31,0x7f,0x82,0x34,0xfe,0x87,0x01,0x70, -0x4a,0xb0,0x63,0xfe,0xa7,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x11,0x00,0x24,0x40,0x21,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x05,0x09,0x19,0x2b,0x33,0x11,0x33,0x13,0x2e,0x02, -0x35,0x11,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x11,0x5a,0x78,0xdf,0x02,0x05,0x03,0x57,0x78,0xde,0x02,0x04,0x03,0x02,0xda,0xfd,0x8f,0x19,0x49,0x51,0x24,0x01,0x9a,0xfd,0x26,0x02,0x71,0x18,0x49,0x51,0x25,0xfe,0x66,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x91, -0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x10,0x01,0xfe,0x02,0xda,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x4c,0x01,0xfe,0x02,0xda,0x00,0x19, -0x00,0x2f,0x40,0x2c,0x0f,0x06,0x05,0x03,0x01,0x02,0x01,0x4c,0x03,0x01,0x02,0x02,0x38,0x4d,0x00,0x01,0x01,0x39,0x4d,0x00,0x00,0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x3d,0x04,0x4e,0x00,0x00,0x00,0x19,0x00,0x18,0x16,0x11,0x18,0x21,0x06,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x03,0x1e,0x02,0x15,0x11,0x23,0x11,0x33,0x13, -0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0xf0,0x41,0x35,0x3e,0xfc,0x02,0x04,0x03,0x57,0x78,0xdf,0x02,0x05,0x03,0x57,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x02,0x62,0x18,0x49,0x51,0x25,0xfe,0x66,0x02,0xda,0xfd,0xdb,0x19,0x49,0x52,0x24,0x01,0x4d,0xfd,0x35,0x58,0x6b,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb1,0x02,0x26, -0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08, -0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x0a,0x72,0x6a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe, -0xc9,0x6a,0x72,0x51,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00, -0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x67,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00, -0x00,0x27,0x06,0x9e,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x1c,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc1,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc2,0x02,0x58,0x00,0x00, -0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x00,0x02,0xe4,0x02,0x26,0x00,0x60,0x00,0x00, -0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xd4,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0xf6,0x02,0x12, -0x03,0x2a,0x00,0x15,0x00,0x23,0x00,0x3e,0x40,0x3b,0x09,0x01,0x04,0x01,0x10,0x01,0x03,0x04,0x02,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x0d,0x0c,0x08,0x06,0x00,0x15, -0x01,0x15,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x35,0x33,0x15,0x14,0x07,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x50,0x35,0x16,0x4b,0x30,0x1e,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x0a, -0x72,0x6a,0x01,0x36,0x6a,0x72,0x26,0x07,0x1a,0x4b,0x50,0x3a,0x19,0x33,0x4b,0xfe,0xc9,0x6a,0x72,0x51,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb6,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x12, -0x03,0x2a,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb6,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x44,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xd4,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x4e,0x00,0x00, -0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb1,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0x93,0x02,0x26,0x00,0x60,0x00,0x00, -0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0xe4,0x00,0x1d,0x00,0x2b,0x00,0x64,0x4b,0xb0,0x15,0x50,0x58,0x40,0x21,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x03,0x03,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e, -0x1b,0x40,0x1e,0x00,0x03,0x06,0x01,0x00,0x03,0x00,0x63,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x17,0x1f,0x1e,0x01,0x00,0x26,0x24,0x1e,0x2b,0x1f,0x2b,0x1c,0x1a,0x0e,0x0c,0x07,0x05,0x00,0x1d,0x01,0x1d,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35, -0x34,0x37,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x7b,0x37,0x43,0x38,0x0d,0x62,0x72,0x72,0x62,0x62,0x72,0x2b,0x27,0x1d,0x21,0x1a,0x1e,0x19,0x3c,0x9d,0x3b,0x3f,0x3f, -0x3b,0x3a,0x40,0x40,0xcb,0x35,0x28,0x2e,0x36,0x70,0x62,0x01,0x4a,0x62,0x70,0x6f,0x62,0xfe,0xb5,0x3b,0x5a,0x1a,0x18,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x01,0x12,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x00,0x00,0x03,0x00,0x23,0xff,0xd8,0x02,0x35,0x02,0xee,0x00,0x15,0x00,0x1c,0x00,0x23,0x00,0x75,0x40,0x13, -0x09,0x01,0x04,0x00,0x22,0x21,0x18,0x17,0x0c,0x01,0x06,0x05,0x04,0x14,0x01,0x02,0x05,0x03,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x01,0x01,0x00,0x00,0x3e,0x4d,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x1b,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x06, -0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3e,0x4d,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x59,0x40,0x14,0x1e,0x1d,0x00,0x00,0x1d,0x23,0x1e,0x23,0x1b,0x19,0x00,0x15,0x00,0x15,0x26,0x12,0x26,0x08,0x09,0x19,0x2b,0x17,0x37,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x37,0x33,0x07, -0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x07,0x13,0x11,0x13,0x26,0x23,0x22,0x06,0x13,0x32,0x36,0x35,0x11,0x03,0x16,0x23,0x4c,0x17,0x72,0x62,0x5c,0x38,0x21,0x54,0x46,0x11,0x72,0x62,0x55,0x37,0x29,0x3b,0xe0,0x1f,0x47,0x3a,0x40,0x7a,0x3b,0x3f,0xda,0x20,0x28,0x86,0x2d,0x3d,0x01,0x4a,0x62,0x70,0x31,0x3b,0x7d,0x29,0x35,0xfe, -0xb5,0x62,0x70,0x2b,0x49,0x02,0x3a,0xfe,0xc3,0x01,0x8d,0x31,0x43,0xfd,0xf7,0x43,0x3e,0x01,0x29,0xfe,0x7e,0x28,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0xd8,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0x76,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00, -0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x28,0xff,0xf6,0x02,0x3f,0x02,0xe4,0x00,0x1d,0x00,0x2b,0x00,0xe3,0x4b,0xb0,0x15,0x50,0x58,0x40,0x0a,0x0b,0x01,0x03,0x01,0x19,0x01,0x00,0x06,0x02,0x4c,0x1b,0x40,0x0a,0x0b,0x01,0x03,0x09,0x19,0x01,0x08,0x06,0x02,0x4c,0x59,0x4b,0xb0,0x15,0x50,0x58,0x40,0x23,0x00,0x04, -0x00,0x05,0x06,0x04,0x05,0x67,0x09,0x01,0x03,0x03,0x01,0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x0b,0x08,0x02,0x06,0x06,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x38,0x00,0x04,0x00,0x05,0x06,0x04,0x05,0x67,0x00,0x09,0x09,0x01,0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x00,0x03,0x03,0x01, -0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x00,0x06,0x06,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x33,0x00,0x04,0x00,0x05,0x06,0x04,0x05,0x67,0x00,0x09,0x09,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d, -0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x1f,0x1f,0x1e,0x01,0x00,0x26,0x24,0x1e,0x2b,0x1f,0x2b,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1d,0x01,0x1d,0x0c,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x11, -0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x33,0x35,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x21,0x35,0x23,0x0e,0x02,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0xc3,0x48,0x53,0x53,0x48,0x23,0x2e,0x1a,0x03,0x05,0x01,0x09,0xb1,0x98,0x98,0xb1,0xfe,0xf7,0x05,0x03,0x1a,0x2e,0x0a,0x2a,0x30,0x30, -0x2a,0x2a,0x30,0x30,0x0a,0x66,0x58,0x01,0x72,0x58,0x66,0x1d,0x29,0x14,0x50,0x52,0xe6,0x52,0xfe,0x52,0x50,0x13,0x2a,0x1d,0x50,0x3b,0x33,0x01,0x72,0x33,0x3b,0x3b,0x33,0xfe,0x8e,0x33,0x3b,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2b,0x40,0x28,0x00,0x03,0x00,0x01,0x02,0x03, -0x01,0x67,0x00,0x04,0x04,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x0a,0x24,0x21,0x06,0x09,0x18,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5c,0xeb,0x66,0x79,0x79,0x66,0x91,0x91,0x3b, -0x47,0x47,0x3b,0x91,0x02,0xda,0x75,0x62,0x62,0x75,0xfe,0xd4,0x01,0x7d,0x49,0x3d,0x3e,0x48,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x2f,0x40,0x2c,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x67,0x00,0x04,0x00,0x02,0x03,0x04,0x02,0x67,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x03,0x03,0x39, -0x03,0x4e,0x00,0x00,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0d,0x25,0x21,0x11,0x07,0x09,0x19,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5a,0x5a,0x99,0x42,0x61,0x36,0x76,0x63,0x99,0x99,0x3a,0x42,0x43,0x39,0x99,0x02,0xda,0x96,0x32,0x5a,0x3c,0x5b, -0x6d,0xb4,0x01,0x04,0x41,0x37,0x38,0x40,0x00,0x02,0x00,0x50,0xff,0x4c,0x02,0x0e,0x02,0xe4,0x00,0x13,0x00,0x21,0x00,0x38,0x40,0x35,0x12,0x01,0x00,0x03,0x01,0x4c,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x05,0x01,0x02,0x02,0x3d,0x02,0x4e,0x15,0x14,0x00,0x00, -0x1c,0x1a,0x14,0x21,0x15,0x21,0x00,0x13,0x00,0x13,0x25,0x23,0x07,0x09,0x18,0x2b,0x05,0x27,0x22,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x17,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0xa6,0x67,0x04,0x0a,0x05,0x65,0x77,0x77,0x65,0x65,0x77,0x3a,0x35, -0x75,0xe2,0x3b,0x47,0x47,0x3b,0x3b,0x47,0x47,0xb4,0xab,0x01,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x43,0x64,0x19,0xc1,0xfa,0x4a,0x3d,0x01,0x40,0x3e,0x49,0x49,0x3e,0xfe,0xc0,0x3d,0x4a,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x02,0x21,0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x33,0x40,0x30,0x09,0x01,0x02,0x04,0x01,0x4c, -0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x03,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x17,0x15,0x11,0x0f,0x00,0x0e,0x00,0x0e,0x11,0x17,0x21,0x07,0x09,0x19,0x2b,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x23,0x03,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34, -0x26,0x23,0x23,0x5d,0xe1,0x41,0x62,0x36,0x4c,0x3f,0x95,0x63,0x8f,0x79,0x88,0x38,0x44,0x44,0x38,0x88,0x02,0xda,0x35,0x5e,0x3f,0x4a,0x6a,0x15,0xfe,0xc1,0x01,0x36,0xfe,0xca,0x01,0x87,0x47,0x3a,0x3b,0x46,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00, -0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5d,0xff,0x10,0x02,0x21,0x02,0xda,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0xf6,0x02,0x10,0x02,0xe4,0x00,0x29,0x00,0x3b,0x40,0x38, -0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3e,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1c,0x1a,0x19,0x16,0x14,0x08,0x06,0x04,0x03,0x00,0x29,0x01,0x29,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16, -0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x01,0x30,0x6a,0x7e,0x5a,0x4e,0x40,0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x34,0x5e,0x3d,0x3e,0x5f,0x36,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49, -0x51,0x7a,0x0a,0x70,0x62,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x3a,0x58,0x31,0x31,0x57,0x39,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x60,0x72,0x00,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x48, -0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0x35,0x02,0x10,0x02,0xe4,0x00,0x3d,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x03,0x36,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03, -0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3e,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07, -0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3e,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x3d,0x00,0x3c,0x1b,0x22,0x13,0x2c,0x22,0x14,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23, -0x37,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xcd,0x46,0x16,0x1b,0x37,0x32,0x18,0x4f,0x5c,0x5a,0x4e,0x40, -0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x34,0x5e,0x3d,0x3e,0x5f,0x36,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49,0x51,0x7a,0x66,0x03,0x02,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x40,0x0f,0x6b,0x53,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x3a,0x58,0x31,0x31,0x57,0x39,0x32,0x3f,0x3f,0x32, -0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x60,0x72,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x48,0xff,0x10,0x02,0x10,0x02,0xe4,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00, -0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x20,0x00,0x38,0x40,0x35,0x1a,0x07,0x02,0x01,0x05,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x61,0x07,0x06,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x20,0x00,0x20,0x22,0x24,0x21,0x25, -0x12,0x24,0x08,0x09,0x1c,0x2b,0x33,0x11,0x34,0x36,0x36,0x33,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x22,0x06,0x15,0x11,0x5c,0x34,0x5f,0x3f,0xe3,0xa2,0x4e,0x5f,0x36,0x60,0x41,0x43,0x39,0x3c,0x46,0x46,0x3c,0x2d,0xa4,0x84,0x37,0x41,0x02,0x0c,0x3e, -0x5d,0x33,0x58,0xdb,0x05,0x70,0x5b,0x40,0x61,0x36,0x52,0x48,0x3d,0x3c,0x46,0x4e,0xe1,0x42,0x3a,0xfd,0xf4,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x16,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02,0x02,0x04,0x61,0x00, -0x04,0x04,0x3e,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x11,0x0f,0x0d,0x0c,0x0a,0x08,0x05,0x04,0x00,0x16,0x01,0x16,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x11, -0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x61,0x71,0x01,0x4a,0x3d,0x3b,0x3a,0x3e,0x5a,0x70,0x62,0x64,0x6e,0x70,0x62,0x3e,0x3a,0xf0,0x3b,0x0a,0x73,0x5f,0xc8,0x83,0x3e,0x43,0x44,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x5f,0x73,0x4b,0x46,0x41,0x82,0x82,0x41,0x46,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x21, -0x02,0xda,0x00,0x07,0x00,0x21,0x40,0x1e,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xc8,0x01,0xea,0xc8,0x02,0x88,0x52,0x52,0xfd,0x78,0x00,0x00,0x00,0x01,0x00,0x37, -0x00,0x00,0x02,0x21,0x02,0xda,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x05,0x01,0x01,0x06,0x01,0x00,0x07,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x08,0x01,0x07,0x07,0x39,0x07,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x23, -0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0xff,0x91,0x91,0xc8,0x01,0xea,0xc8,0x91,0x91,0x01,0x27,0x4b,0x01,0x16,0x52,0x52,0xfe,0xea,0x4b,0xfe,0xd9,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x89,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0x35,0x02,0x21, -0x02,0xda,0x00,0x19,0x00,0x6f,0x40,0x0b,0x08,0x01,0x05,0x06,0x01,0x4c,0x07,0x01,0x06,0x01,0x4b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x24,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x4d,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40, -0x21,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x00,0x04,0x00,0x03,0x04,0x03,0x63,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x59,0x40,0x0f,0x00,0x00,0x00,0x19,0x00,0x19,0x14,0x21,0x28,0x11,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x07,0x1e,0x02, -0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0xff,0xc8,0x01,0xea,0xc8,0x0c,0x1a,0x38,0x26,0x42,0x36,0x55,0x46,0x16,0x1b,0x37,0x32,0x19,0x02,0x88,0x52,0x52,0xfd,0x78,0x23,0x03,0x14,0x24,0x1a,0x22,0x31,0x37,0x17,0x0d,0x11,0x1a,0x45,0x00,0xff,0xff,0x00,0x37,0xff,0x10,0x02,0x21,0x02,0xda,0x02,0x26, -0x00,0x89,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x11,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x05,0x09,0x16,0x2b,0x05,0x22, -0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x2c,0x66,0x6c,0x5a,0x3b,0x3d,0x3c,0x3c,0x5a,0x6b,0x0a,0x71,0x61,0x02,0x12,0xfd,0xee,0x3c,0x46,0x46,0x3c,0x02,0x12,0xfd,0xee,0x62,0x70,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x91, -0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb1,0x02,0x26, -0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x01,0xfe,0x02,0xda,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a, -0xff,0xf6,0x01,0xfe,0x03,0xd4,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0x48,0x00,0x1a,0x00,0x31,0x40,0x2e,0x17,0x01,0x02,0x01,0x01,0x4c,0x00,0x04,0x01,0x04,0x85,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00, -0x4e,0x01,0x00,0x13,0x12,0x0f,0x0d,0x0a,0x08,0x05,0x04,0x00,0x1a,0x01,0x1a,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x11,0x14,0x06,0x01,0x2c,0x66,0x6c,0x5a,0x3b,0x3d,0x3c,0x3c,0x41,0x10,0x13,0x4b,0x2e,0x27,0x6b,0x0a,0x71, -0x61,0x02,0x12,0xfd,0xee,0x3c,0x46,0x46,0x3c,0x02,0x12,0x13,0x10,0x4b,0x50,0x27,0x31,0x06,0xfe,0x2e,0x62,0x70,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xb6,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x53,0x03,0x48,0x02,0x26,0x00,0x96,0x00,0x00, -0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xb6,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xd4,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53, -0x03,0xb1,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x93,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00, -0x00,0x01,0x00,0x5a,0xff,0x35,0x01,0xfe,0x02,0xda,0x00,0x20,0x00,0x56,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x19,0x00,0x05,0x06,0x01,0x00,0x05,0x00,0x63,0x04,0x01,0x02,0x02, -0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x13,0x01,0x00,0x1f,0x1d,0x14,0x13,0x10,0x0e,0x0b,0x0a,0x07,0x05,0x00,0x20,0x01,0x20,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x37,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x07,0x07,0x06,0x06,0x15, -0x14,0x16,0x33,0x33,0x15,0x01,0x7b,0x37,0x43,0x38,0x0d,0x62,0x70,0x5a,0x3e,0x3a,0x3b,0x3d,0x5a,0x50,0x1d,0x21,0x1a,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x2e,0x36,0x70,0x62,0x02,0x12,0xfd,0xee,0x3e,0x43,0x43,0x3e,0x02,0x12,0xfd,0xee,0x79,0x36,0x18,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe, -0x03,0xe2,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x96,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb1,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x21,0x40,0x1e,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01, -0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xee,0xbc,0x5c,0x7d,0x0d,0x11,0x04,0x04,0x13,0x0d,0x78,0x5d,0xbd,0x02,0xda,0xfe,0x0f,0x34,0x58,0x17,0x17,0x59,0x34,0x01,0xf0,0xfd,0x26,0x00, -0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x1e,0x00,0x26,0x40,0x23,0x1a,0x06,0x02,0x03,0x00,0x01,0x4c,0x02,0x01,0x02,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x1e,0x00,0x1e,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33, -0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x6b,0x57,0x53,0x39,0x04,0x04,0x01,0x02,0x07,0x04,0x48,0x61,0x42,0x04,0x08,0x02,0x02,0x05,0x04,0x3b,0x4f,0x59,0x71,0x42,0x04,0x04,0x02,0x02,0x04,0x05,0x47,0x02,0xda,0xfd,0xe4,0x21,0x47,0x15,0x15,0x47,0x21,0x02,0x1c,0xfd,0xe4, -0x21,0x47,0x15,0x15,0x47,0x21,0x02,0x1c,0xfd,0x26,0x02,0x26,0x22,0x41,0x12,0x12,0x41,0x22,0xfd,0xda,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x93, -0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb1,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x17, -0x00,0x26,0x40,0x23,0x13,0x0d,0x07,0x01,0x04,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x18,0x12,0x05,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x13,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07, -0x28,0xd2,0xc7,0x68,0x71,0x09,0x13,0x06,0x05,0x13,0x09,0x73,0x63,0xc7,0xd2,0x67,0x7d,0x09,0x13,0x05,0x05,0x13,0x09,0x7e,0x01,0x72,0x01,0x68,0xd8,0x11,0x27,0x0b,0x0b,0x27,0x11,0xd8,0xfe,0x9e,0xfe,0x88,0xe8,0x11,0x27,0x0c,0x0c,0x26,0x11,0xe9,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x0e,0x00,0x23,0x40,0x20, -0x0d,0x07,0x01,0x03,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x18,0x12,0x04,0x09,0x18,0x2b,0x33,0x11,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x11,0xff,0xdc,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xdc,0x01,0x11,0x01, -0xc9,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x37,0xfe,0xef,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00, -0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb1,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x2b,0x02,0x35,0x02,0xda,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00, -0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xd4,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0x93,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35, -0x03,0xb1,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xda,0x00,0x09,0x00,0x2c,0x40,0x29,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00, -0x09,0x00,0x09,0x12,0x11,0x12,0x05,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x55,0x01,0x49,0xfe,0xbc,0x01,0x9f,0xfe,0xb7,0x01,0x53,0x5a,0x02,0x2e,0x52,0x5a,0xfd,0xd2,0x52,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb6,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00, -0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb6,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb0,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x19,0x00,0x00,0x02,0x3f,0x02,0xda,0x00,0x18,0x00,0x2d,0x40,0x2a, -0x17,0x06,0x02,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x02,0x01,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33, -0x03,0x23,0x03,0x03,0x62,0x49,0x53,0x30,0x03,0x03,0x01,0x02,0x04,0x07,0x4c,0x66,0x45,0x06,0x07,0x01,0x01,0x05,0x03,0x32,0x4f,0x4b,0x73,0x53,0x59,0x02,0xda,0xfd,0xe4,0x21,0x3d,0x15,0x15,0x3c,0x22,0x01,0x90,0xfe,0x70,0x22,0x3c,0x15,0x15,0x3d,0x21,0x02,0x1c,0xfd,0x26,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x00,0xff,0xff,0x00,0x19, -0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb1,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x8e, -0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x38,0x4d,0x05,0x03,0x04,0x03,0x01, -0x01,0x39,0x01,0x4e,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x11,0x33,0x11,0x01,0xbf,0xf9,0xf9,0x67,0xf0,0xfa,0xfe,0x2d,0x5a,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0x84,0x02,0xda,0xfd,0x26,0x00,0xff,0xff,0x00,0x5d,0xff,0x10,0x02,0x30, -0x02,0xda,0x02,0x26,0x00,0xba,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x4c,0x02,0x00,0x02,0xe4,0x00,0x18,0x00,0x26,0x00,0x3e,0x40,0x3b,0x12,0x04,0x02,0x02,0x03,0x01,0x4c,0x06,0x01,0x03,0x04,0x02,0x04,0x03,0x02,0x80,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x02,0x02,0x00, -0x60,0x05,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1a,0x19,0x01,0x00,0x21,0x1f,0x19,0x26,0x1a,0x26,0x17,0x15,0x0c,0x0a,0x00,0x18,0x01,0x18,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x15,0x14,0x16,0x33,0x33,0x15,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22, -0x06,0x15,0x11,0x14,0x16,0x01,0x8b,0x44,0x52,0x4a,0x53,0x72,0x62,0x62,0x72,0x5e,0x53,0x21,0x1b,0x6e,0xcd,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0xb4,0x4f,0x42,0x1e,0x0f,0x6e,0x5a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe,0xc9,0x60,0x70,0x0a,0x1b,0x1c,0x23,0x52,0xfb,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x00, -0x00,0x02,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0x30,0x00,0x1b,0x00,0x26,0x00,0x84,0xb5,0x18,0x01,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x28,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x05,0x08, -0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x05,0x05,0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1b,0x1d,0x1c,0x01,0x00,0x22,0x20,0x1c,0x26, -0x1d,0x26,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x0a,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x35,0x34,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xfc,0x55,0x64,0x2e,0x52, -0x35,0xaa,0x75,0x34,0x40,0x02,0x5a,0x05,0x6f,0x5c,0x64,0x6b,0x59,0x02,0x08,0x56,0x31,0x42,0x4e,0xa0,0x2c,0x37,0x3d,0x0a,0x5f,0x4d,0x33,0x4c,0x2b,0x2b,0x6b,0x26,0x22,0x41,0x55,0x60,0x56,0xfe,0x86,0x64,0x33,0x3b,0x4c,0x40,0x37,0x4d,0x35,0x2c,0x2e,0x35,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26, -0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x7a,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb4,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43, -0xff,0x2b,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x5d,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x7a,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb5,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0xa2,0x02,0x26, -0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb6,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0xa0,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb7,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43, -0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x76,0x03,0x84,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0x2b,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x27,0x06,0x78, -0x02,0x5d,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x26,0x03,0x84,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb9,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x2b,0x03,0xa2,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xba,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43, -0xff,0xf6,0x01,0xfc,0x03,0xa0,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x09,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0x2b,0x01,0xfc,0x02,0x30,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x78, -0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x53,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x39,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0xe9,0x02,0x26, -0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x43,0xff,0x35,0x02,0x31,0x02,0x30,0x00,0x2b,0x00,0x36,0x00,0xea,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0a,0x28,0x01,0x08,0x09,0x16,0x01,0x00,0x08,0x02,0x4c,0x1b,0x40,0x0b,0x28,0x01,0x08,0x09,0x01,0x4c,0x16,0x01,0x07,0x01,0x4b,0x59,0x4b,0xb0,0x15,0x50, -0x58,0x40,0x32,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x4d,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3d,0x06,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2f,0x00,0x03,0x02, -0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00,0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00, -0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x1f,0x2d,0x2c,0x01,0x00,0x32,0x30,0x2c,0x36,0x2d,0x36,0x27,0x26,0x21,0x1f,0x1e,0x1c,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x08,0x06,0x00,0x2b, -0x01,0x2b,0x0c,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x35,0x34,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xfc,0x55,0x64, -0x2e,0x52,0x35,0xaa,0x75,0x34,0x40,0x02,0x5a,0x05,0x6f,0x5c,0x64,0x6b,0x02,0x22,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x0d,0x02,0x08,0x56,0x31,0x42,0x4e,0xa0,0x2c,0x37,0x3d,0x0a,0x5f,0x4d,0x33,0x4c,0x2b,0x2b,0x6b,0x26,0x22,0x41,0x55,0x60,0x56,0xfe,0x86,0x1c,0x2c,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x64, -0x33,0x3b,0x4c,0x40,0x37,0x4d,0x35,0x2c,0x2e,0x35,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x44,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x71,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x0c,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x5d,0x00,0x00,0x00,0x03,0x00,0x1f, -0xff,0xf6,0x02,0x35,0x02,0x30,0x00,0x2d,0x00,0x36,0x00,0x41,0x00,0xa9,0x40,0x0a,0x15,0x01,0x03,0x02,0x2b,0x01,0x07,0x08,0x02,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x72,0x00,0x08,0x06,0x07,0x07,0x08,0x72,0x0a,0x01,0x01,0x0d,0x01,0x06,0x08,0x01,0x06,0x67,0x0b,0x01,0x02,0x02,0x04,0x61,0x05, -0x01,0x04,0x04,0x41,0x4d,0x0f,0x0c,0x02,0x07,0x07,0x00,0x62,0x09,0x0e,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x35,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x0a,0x01,0x01,0x0d,0x01,0x06,0x08,0x01,0x06,0x67,0x0b,0x01,0x02,0x02,0x04,0x61,0x05,0x01,0x04,0x04,0x41,0x4d,0x0f,0x0c,0x02, -0x07,0x07,0x00,0x62,0x09,0x0e,0x02,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x27,0x38,0x37,0x01,0x00,0x3d,0x3b,0x37,0x41,0x38,0x41,0x34,0x32,0x2f,0x2e,0x29,0x27,0x25,0x24,0x22,0x20,0x1d,0x1c,0x19,0x17,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x2d,0x01,0x2d,0x10,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35, -0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x13,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x03,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xb2,0x41,0x52,0x54,0x43,0x51,0x24, -0x20,0x1f,0x26,0x4f,0x4b,0x3c,0x31,0x44,0x05,0x05,0x41,0x2e,0x41,0x50,0xde,0x25,0x20,0x20,0x25,0x54,0x50,0x41,0x2b,0x41,0x08,0x08,0x46,0x75,0x8a,0x25,0x20,0x1f,0x26,0x98,0x21,0x27,0x4f,0x1f,0x26,0x29,0x0a,0x5e,0x4b,0x4a,0x5b,0x4b,0x29,0x2d,0x27,0x20,0x41,0x51,0x31,0x28,0x28,0x31,0x59,0x47,0x90,0x6a,0x28,0x2d,0x28,0x20, -0x41,0x52,0x32,0x28,0x28,0x32,0x01,0x4e,0x4c,0x27,0x2e,0x2e,0x27,0xfe,0xb1,0x2e,0x27,0x6a,0x34,0x2c,0x2b,0x34,0x00,0x00,0xff,0xff,0x00,0x1f,0xff,0xf6,0x02,0x35,0x03,0x11,0x02,0x26,0x00,0xd4,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0x00,0x02,0x00,0x5c,0xff,0xf6,0x02,0x01,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6b, -0xb6,0x0a,0x03,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x01,0x06,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x01, -0x01,0x39,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x17,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x0f,0x0d,0x08,0x07,0x06,0x05,0x00,0x14,0x01,0x14,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06, -0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x4c,0x3e,0x50,0x07,0x01,0x5a,0x5a,0x02,0x01,0x08,0x51,0x3e,0x53,0x62,0x62,0x71,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0x0a,0x3d,0x36,0x69,0x02,0xda,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5e,0x6e,0x4e,0x3c,0x43,0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46, -0x00,0x01,0x00,0x58,0xff,0xf6,0x02,0x0b,0x02,0x30,0x00,0x1b,0x00,0x3b,0x40,0x38,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x19,0x18,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08, -0x06,0x00,0x1b,0x01,0x1b,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x34,0x64,0x78,0x78,0x64,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x0a,0x70,0x62,0x96, -0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x58,0x66,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x6a,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x60,0x00,0x00, -0x00,0x01,0x00,0x58,0xff,0x35,0x02,0x0b,0x02,0x30,0x00,0x2f,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x05,0x28,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x41, -0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x04,0x04,0x02,0x61,0x00,0x02, -0x02,0x41,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x2f,0x00,0x2e,0x12,0x12,0x25,0x22,0x12,0x27,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14, -0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd1,0x46,0x16,0x1b,0x37,0x32,0x18,0x49,0x56,0x78,0x64,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x5f,0x03,0x02,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x41,0x10,0x6a, -0x52,0x96,0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x58,0x66,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x60,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x09,0x02,0x26,0x00,0xd7,0x00,0x00, -0x00,0x07,0x06,0x69,0x02,0x60,0x00,0x00,0x00,0x02,0x00,0x57,0xff,0xf6,0x01,0xfc,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6b,0xb6,0x11,0x0a,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x03,0x06,0x02,0x00, -0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x39,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x17,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x14,0x01,0x14,0x08, -0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x63,0x62,0x53,0x3e,0x51,0x08,0x01,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x40,0x40,0x0a,0x6e, -0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xfd,0x26,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46,0x3b,0x44,0xa0,0x43,0x3c,0x00,0x02,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0xdf,0x00,0x20,0x00,0x2c,0x00,0x4c,0x40,0x49,0x19,0x18,0x16,0x13,0x12,0x11,0x10,0x07,0x01,0x03,0x01,0x4c,0x17,0x01,0x03,0x4a,0x00,0x02,0x01,0x05,0x01,0x02, -0x05,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x6a,0x00,0x03,0x03,0x38,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x22,0x21,0x01,0x00,0x28,0x26,0x21,0x2c,0x22,0x2c,0x15,0x14,0x0c,0x0b,0x09,0x07,0x00,0x20,0x01,0x20,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17, -0x33,0x26,0x26,0x27,0x27,0x07,0x35,0x37,0x27,0x33,0x17,0x37,0x15,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2b,0x44,0x68,0x39,0x35,0x5f,0x3f,0x2c,0x3b,0x0b,0x0e,0x04,0x20,0x1c,0x41,0xa3,0x78,0x48,0x68,0x2c,0x94,0x6a,0x4e,0x2c,0x35,0x3a,0x67,0x46,0x40,0x4d, -0x4d,0x40,0x3e,0x4d,0x4d,0x0a,0x38,0x66,0x43,0x43,0x63,0x37,0x26,0x12,0x0a,0x35,0x25,0x5b,0x4c,0x50,0x38,0x63,0x40,0x45,0x50,0x31,0x71,0x40,0x8e,0x40,0x46,0x69,0x3a,0x50,0x50,0x41,0x41,0x50,0x50,0x41,0x41,0x50,0x00,0x00,0x00,0x03,0x00,0x3f,0xff,0xf6,0x02,0x5c,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x26,0x00,0x81,0xb6,0x11, -0x0a,0x02,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x09,0x01,0x05,0x05,0x02,0x5f,0x04,0x01,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x0a,0x01,0x06,0x06,0x00,0x61,0x03,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x28,0x09,0x01,0x05,0x05,0x02,0x5f,0x04,0x01,0x02,0x02,0x38,0x4d, -0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x39,0x4d,0x0a,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1f,0x1a,0x19,0x15,0x15,0x01,0x00,0x21,0x1f,0x19,0x26,0x1a,0x26,0x15,0x18,0x15,0x18,0x17,0x16,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x14,0x01,0x14,0x0b,0x09,0x16,0x2b,0x17, -0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x13,0x37,0x33,0x07,0x01,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xe4,0x4c,0x59,0x59,0x4c,0x39,0x47,0x06,0x03,0x02,0x5a,0x5a,0x01,0x06,0x47,0xdc,0x0f,0x54,0x18,0xfe,0xbe,0x32,0x37,0x37,0x32,0x31, -0x38,0x38,0x0a,0x6c,0x5b,0xab,0x5c,0x6c,0x3e,0x35,0x7d,0xa0,0xfd,0x26,0x69,0x35,0x3e,0x02,0x30,0xb4,0xb4,0xfe,0x1e,0x43,0x3c,0xa0,0x3c,0x43,0x43,0x3c,0xa0,0x3c,0x43,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x02,0x58,0x02,0xda,0x00,0x1c,0x00,0x2a,0x00,0x83,0xb6,0x19,0x0a,0x02,0x08,0x09,0x01,0x4c,0x4b,0xb0,0x18,0x50, -0x58,0x40,0x25,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x00,0x04,0x04,0x38,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x29,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x00,0x04,0x04, -0x38,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1f,0x1e,0x1d,0x01,0x00,0x25,0x23,0x1d,0x2a,0x1e,0x2a,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1c,0x01,0x1c,0x0c,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32, -0x16,0x17,0x33,0x27,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x60,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0xa6,0xa6,0x5a,0x5e,0x5e,0x5a,0x01,0x07,0x4e,0x20,0x38,0x3e,0x3e,0x38,0x39,0x3d,0x3d,0x0a,0x6e, -0x5e,0x65,0x5f,0x6e,0x3e,0x35,0x7d,0x3c,0x4b,0x55,0x55,0x4b,0xfd,0xc6,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x5a,0x3e,0x46,0x44,0x40,0x5a,0x40,0x44,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x00,0x17,0x00,0x20,0x00,0x3e,0x40,0x3b,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x06, -0x06,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1c,0x19,0x18,0x15,0x14,0x12,0x10,0x0d,0x0c,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x21,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33, -0x06,0x06,0x03,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x2c,0x61,0x77,0x77,0x61,0x41,0x61,0x36,0xfe,0xa8,0x46,0x3a,0x32,0x41,0x07,0x5a,0x09,0x74,0xd7,0x01,0x00,0x43,0x3d,0x3d,0x43,0x0a,0x75,0x67,0x82,0x67,0x75,0x34,0x5e,0x40,0x62,0x34,0x3d,0x47,0x27,0x21,0x45,0x51,0x01,0x4c,0x1c,0x41,0x47,0x47,0x41,0x00,0x00,0x00, -0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00, -0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x71,0x03,0x84,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04, -0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x21,0x03,0x84,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xb9,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x26,0x03,0xa2,0x02,0x26,0x00,0xe1,0x00,0x00, -0x00,0x07,0x06,0xba,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0xa0,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x09,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04, -0x03,0x09,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x02,0x30,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00, -0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x39,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0xe9,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0x30,0x00,0x25,0x00,0x2e,0x00,0x84, -0x4b,0xb0,0x15,0x50,0x58,0x40,0x30,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x07,0x00,0x03,0x05,0x07,0x03,0x67,0x00,0x08,0x08,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x06,0x06,0x00,0x60,0x09,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x2d,0x00,0x05,0x03,0x04,0x03,0x05, -0x04,0x80,0x00,0x07,0x00,0x03,0x05,0x07,0x03,0x67,0x00,0x06,0x09,0x01,0x00,0x06,0x00,0x64,0x00,0x08,0x08,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x19,0x01,0x00,0x2c,0x2a,0x27,0x26,0x24,0x22,0x19,0x18,0x17,0x15,0x12,0x11,0x0e,0x0c,0x07,0x05,0x00,0x25,0x01,0x25, -0x0a,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x37,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x14,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x75,0x37,0x43,0x3b,0x0a,0x61,0x73,0x73,0x61,0x62,0x72,0xfe, -0xb0,0x3f,0x3d,0x69,0x0f,0x5a,0x05,0x32,0x27,0x10,0x22,0x1e,0x1e,0x19,0x3c,0xfe,0xed,0xf8,0x3e,0x3e,0x3d,0x3f,0xcb,0x35,0x28,0x2f,0x35,0x73,0x5f,0x96,0x5f,0x73,0x73,0x5f,0x61,0x35,0x41,0x45,0x4a,0x2b,0x40,0x13,0x0d,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x02,0x0c,0x1d,0x41,0x46,0x46,0x41,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04, -0x03,0x0c,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x30,0x00,0x15,0x00,0x1e,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x08,0x01,0x05,0x05, -0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1b,0x1a,0x16,0x1e,0x17,0x1e,0x10,0x0e,0x0c,0x0b,0x0a,0x08,0x05,0x04,0x00,0x15,0x01,0x15,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15, -0x14,0x16,0x01,0x2c,0x61,0x71,0x01,0x4c,0x3c,0x3e,0x67,0x0f,0x5a,0x09,0x70,0x57,0x62,0x70,0x70,0x62,0x3e,0x3c,0xf4,0x3d,0x0a,0x73,0x5f,0x61,0x35,0x41,0x45,0x4a,0x45,0x51,0x73,0x5f,0x96,0x5f,0x73,0x4b,0x46,0x41,0x1d,0x1d,0x41,0x46,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x12,0x00,0x2d,0x40,0x2a, -0x04,0x01,0x01,0x05,0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x12,0x21,0x23,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0xd7,0xa0, -0xa0,0x52,0x48,0xa1,0xa1,0x40,0xe1,0xe1,0x01,0x89,0x52,0x73,0x41,0x4b,0x52,0x3a,0x73,0x52,0xfe,0x77,0x00,0x02,0x00,0x58,0xff,0x4c,0x01,0xfb,0x02,0x30,0x00,0x1c,0x00,0x2a,0x00,0x6f,0xb6,0x15,0x07,0x02,0x05,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x20,0x08,0x01,0x05,0x00,0x01,0x00,0x05,0x01,0x69,0x00,0x06,0x06,0x02, -0x61,0x03,0x01,0x02,0x02,0x41,0x4d,0x00,0x00,0x00,0x04,0x5f,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x1b,0x40,0x24,0x08,0x01,0x05,0x00,0x01,0x00,0x05,0x01,0x69,0x00,0x03,0x03,0x3b,0x4d,0x00,0x06,0x06,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x00,0x00,0x04,0x5f,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x59,0x40,0x15,0x1e,0x1d,0x00, -0x00,0x25,0x23,0x1d,0x2a,0x1e,0x2a,0x00,0x1c,0x00,0x1b,0x14,0x25,0x27,0x21,0x09,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x35,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x33,0x11,0x14,0x06,0x23,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xa1,0x9b, -0x2f,0x36,0x02,0x03,0x08,0x4e,0x3b,0x55,0x62,0x62,0x55,0x3b,0x4e,0x08,0x02,0x59,0x67,0x59,0x11,0x38,0x40,0x40,0x38,0x39,0x3f,0x3f,0xb4,0x52,0x35,0x2d,0x32,0x5a,0x31,0x35,0x6c,0x5e,0x74,0x5e,0x6e,0x38,0x31,0x5f,0xfd,0xda,0x53,0x61,0x01,0x25,0x46,0x3e,0x69,0x3e,0x46,0x42,0x38,0x7d,0x38,0x42,0x00,0x00,0xff,0xff,0x00,0x58, -0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x5f,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6f, -0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x70,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x76,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x09,0x02,0x26, -0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x55,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x14,0x00,0x2d,0x40,0x2a,0x03,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x23, -0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x5c,0x5a,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x02,0xda,0xfe,0xe3,0x37,0x3c,0x66,0x58,0xfe,0x8e,0x01,0x63,0x3e,0x43,0x46,0x40,0xfe,0xa2,0x00,0xff,0xff,0x00,0x00, -0x00,0x00,0x01,0xfe,0x02,0xda,0x02,0x06,0x02,0x37,0x00,0x00,0xff,0xff,0xff,0xd4,0x00,0x00,0x01,0xfe,0x03,0xc5,0x02,0x26,0x00,0xfc,0x00,0x00,0x01,0x07,0x06,0x6e,0x01,0xb5,0x00,0xb4,0x00,0x08,0xb1,0x01,0x01,0xb0,0xb4,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00, -0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0x00,0x01,0x00,0x55,0x00,0x00,0x02,0x2b,0x02,0x26,0x00,0x09,0x00,0x27,0x40,0x24,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33, -0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x55,0xc3,0xaf,0x01,0x09,0xb9,0x52,0x01,0x82,0x52,0xfe,0x2c,0x52,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x71,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x70, -0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26, -0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x2b,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x27,0x06,0x69,0x02,0x67,0x00,0x00,0x00,0x07,0x06,0x78, -0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x39,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x02,0xe9,0x02,0x26, -0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x67,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0x35,0x02,0x2b,0x03,0x09,0x00,0x0b,0x00,0x25,0x00,0xb6,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2d,0x0a,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09, -0x02,0x06,0x06,0x39,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x2b,0x00,0x01,0x0a,0x01,0x00,0x04,0x01,0x00,0x69,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09,0x02,0x06,0x06,0x39,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08, -0x3d,0x08,0x4e,0x1b,0x40,0x28,0x00,0x01,0x0a,0x01,0x00,0x04,0x01,0x00,0x69,0x00,0x07,0x00,0x08,0x07,0x08,0x63,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09,0x02,0x06,0x06,0x39,0x06,0x4e,0x59,0x59,0x40,0x1f,0x0c,0x0c,0x01,0x00,0x0c,0x25,0x0c,0x25,0x20,0x1e,0x1d,0x1b,0x16,0x15, -0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x01,0x3b,0x21,0x26,0x26,0x21,0x21,0x26, -0x26,0xfe,0xf9,0xc3,0xaf,0x01,0x09,0xb9,0xcf,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x77,0x52,0x01,0x82,0x52,0xfe,0x2c,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x0c,0x02,0x26, -0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x4c,0x01,0xc3,0x03,0x09,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x4c,0x01,0xb3,0x02,0x26,0x00,0x0d,0x00,0x25,0x40,0x22,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x00,0x00, -0x00,0x03,0x5f,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0c,0x11,0x13,0x21,0x05,0x09,0x19,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11,0x21,0x35,0x21,0x11,0x14,0x06,0x23,0x5a,0x7c,0x3e,0x45,0xfe,0xfc,0x01,0x5e,0x78,0x65,0xb4,0x52,0x44,0x3d,0x01,0xb5,0x52,0xfd,0xf9,0x61,0x72,0x00,0x00,0xff,0xff,0x00,0x55, -0xff,0x4c,0x02,0x31,0x03,0x11,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x02,0x2f,0x02,0xda,0x00,0x0c,0x00,0x31,0x40,0x2e,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x06,0x05,0x02,0x03, -0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x61,0x5a,0x69,0x9a,0x67,0xb1,0xbb,0x69,0xa0,0x6b,0x02,0xda,0xfe,0x69,0xe3,0xfe,0xfa,0xfe,0xe0,0xf5,0xf5,0x00,0x00,0x00,0xff,0xff,0x00,0x61,0xff,0x10,0x02,0x2f, -0x02,0xda,0x02,0x26,0x01,0x10,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x02,0x06,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x28,0x40,0x25,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x5f,0x04, -0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x7c,0x49,0x57,0xbe,0x01,0x18,0x26,0x20,0xaa,0x55,0x46,0x01,0xed,0x52,0xfd,0xc1,0x22,0x27,0x52,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x26, -0x03,0xb6,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x26,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xe4,0x00,0x15,0x00,0x2c,0x40,0x29,0x11,0x0b,0x0a,0x08,0x05,0x04,0x03,0x02,0x08,0x01,0x00,0x01,0x4c,0x09,0x01,0x00,0x4a,0x00,0x00,0x00,0x38,0x4d,0x03,0x02,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00, -0x00,0x15,0x00,0x15,0x15,0x16,0x04,0x09,0x18,0x2b,0x33,0x13,0x27,0x07,0x35,0x37,0x27,0x33,0x17,0x37,0x15,0x07,0x13,0x23,0x03,0x26,0x26,0x27,0x14,0x06,0x07,0x03,0x32,0xcc,0x04,0xa0,0x86,0x2c,0x60,0x1b,0xa7,0x8d,0xdd,0x60,0x83,0x0d,0x0c,0x05,0x08,0x0c,0x7e,0x02,0x1d,0x09,0x50,0x50,0x43,0x71,0x49,0x53,0x50,0x47,0xfd,0xb3, -0x01,0x65,0x23,0x36,0x0f,0x0f,0x36,0x23,0xfe,0x9b,0x00,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x6d,0x02,0x3a,0x00,0x00,0xff,0xff,0x00,0x1e,0xff,0x10,0x02,0x26,0x02,0xda,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x0a, -0x00,0x00,0x02,0x75,0x02,0xda,0x00,0x26,0x01,0x13,0xec,0x00,0x01,0x07,0x03,0x29,0x00,0xf7,0x01,0x13,0x00,0x09,0xb1,0x01,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x15,0x00,0x2c,0x40,0x29,0x15,0x0a,0x09,0x08,0x07,0x02,0x01,0x00,0x08,0x02,0x00,0x01,0x4c,0x00,0x00,0x00, -0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x39,0x03,0x4e,0x21,0x27,0x11,0x13,0x04,0x09,0x1a,0x2b,0x37,0x35,0x37,0x11,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x35,0x64,0x78,0xbe,0x01,0x18,0xa0,0xa0,0x26,0x20,0xaa,0xaa,0x49,0x57,0xe6,0x50,0x51, -0x01,0x01,0x52,0xfe,0xea,0x6c,0x50,0x6c,0xd9,0x22,0x27,0x52,0x55,0x46,0x9c,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x30,0x00,0x24,0x00,0x56,0xb6,0x0a,0x03,0x02,0x03,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x16,0x06,0x01,0x04,0x04,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x08,0x07,0x05,0x03,0x03,0x03, -0x39,0x03,0x4e,0x1b,0x40,0x1a,0x00,0x00,0x00,0x3b,0x4d,0x06,0x01,0x04,0x04,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x08,0x07,0x05,0x03,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x10,0x00,0x00,0x00,0x24,0x00,0x24,0x23,0x13,0x23,0x13,0x25,0x24,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33, -0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x3c,0x4e,0x02,0x05,0x31,0x26,0x24,0x32,0x0b,0x01,0x07,0x31,0x26,0x35,0x3f,0x54,0x20,0x1c,0x1b,0x20,0x4a,0x20,0x1b,0x1c,0x20,0x02,0x26,0x49,0x25,0x2e,0x2a,0x24,0x24,0x2a,0x4f,0x3f,0xfe,0x5e,0x01, -0xa3,0x21,0x27,0x26,0x21,0xfe,0x5c,0x01,0xa3,0x21,0x27,0x26,0x21,0xfe,0x5c,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0x30,0x00,0x14,0x00,0x4c,0xb5,0x03,0x01,0x02,0x03,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x13,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x1b, -0x40,0x17,0x00,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x5c, -0x5a,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x02,0x26,0x69,0x37,0x3c,0x66,0x58,0xfe,0x8e,0x01,0x62,0x3f,0x43,0x46,0x40,0xfe,0xa2,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x67,0x00,0x00,0xff,0xff,0xff,0xf6,0x00,0x00,0x01,0xfe, -0x03,0x16,0x02,0x26,0x01,0x1b,0x00,0x00,0x01,0x07,0x06,0x7a,0x01,0x90,0x03,0x75,0x00,0x09,0xb1,0x01,0x01,0xb8,0x03,0x75,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0x10,0x01,0xfe,0x02,0x30,0x02,0x26, -0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5e,0xff,0x4c,0x01,0xfc,0x02,0x30,0x00,0x1c,0x00,0x5f,0xb5,0x11,0x01,0x02,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1c,0x00,0x01,0x01,0x03,0x61,0x04,0x01,0x03,0x03,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05, -0x05,0x3d,0x05,0x4e,0x1b,0x40,0x20,0x00,0x03,0x03,0x3b,0x4d,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x1c,0x00,0x1b,0x24,0x11,0x13,0x25,0x21,0x07,0x09,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11, -0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0xf0,0x3f,0x35,0x3e,0x3d,0x36,0x38,0x3f,0x5a,0x5a,0x01,0x06,0x4b,0x3f,0x53,0x60,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x01,0x59,0x3b,0x41,0x46,0x40,0xfe,0xa2,0x02,0x26,0x69,0x37,0x3c,0x66,0x58,0xfe,0x9d,0x58,0x6b,0x00, -0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x0c,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x42,0x00, -0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x63,0x75,0x74,0x64,0x64,0x74,0x75,0x63,0x3b,0x43,0x43,0x3b,0x3a, -0x44,0x44,0x08,0x74,0x68,0x7e,0x69,0x73,0x73,0x69,0x7e,0x68,0x74,0x50,0x42,0x40,0x92,0x40,0x42,0x42,0x40,0x92,0x40,0x42,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00, -0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x71, -0x03,0x84,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x21,0x03,0x84,0x02,0x26,0x01,0x22,0x00,0x00, -0x00,0x07,0x06,0xb9,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x26,0x03,0xa2,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xba,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0xa0,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04, -0x03,0x09,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x02,0x2e,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00, -0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x39,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf8,0x02,0x1c,0x02,0x80,0x00,0x17,0x00,0x25,0x00,0x71,0xb5,0x12,0x01,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x21,0x00,0x03,0x01,0x03,0x85,0x00,0x02,0x02,0x3b,0x4d, -0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00,0x4e,0x1b,0x40,0x24,0x00,0x03,0x01,0x03,0x85,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00,0x4e,0x59,0x40, -0x17,0x19,0x18,0x01,0x00,0x20,0x1e,0x18,0x25,0x19,0x25,0x0e,0x0d,0x0b,0x09,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01, -0x2c,0x63,0x75,0x74,0x64,0x45,0x32,0x0b,0x23,0x4b,0x20,0x1c,0x24,0x75,0x63,0x3b,0x43,0x43,0x3b,0x3a,0x44,0x44,0x08,0x74,0x68,0x7e,0x69,0x73,0x1c,0x23,0x4b,0x50,0x1f,0x2e,0x0a,0x36,0x51,0x7e,0x68,0x74,0x50,0x42,0x40,0x92,0x40,0x42,0x42,0x40,0x92,0x40,0x42,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x11,0x02,0x26, -0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x1c,0x02,0x80,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x11,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x44,0x00,0x00,0xff,0xff,0x00,0x54, -0xff,0xf8,0x02,0x1c,0x03,0x39,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x0c,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x10,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6c, -0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0xe9,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0x30,0x00,0x1e,0x00,0x2c,0x00,0x64,0x4b,0xb0,0x15,0x50,0x58,0x40,0x21,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x07,0x01,0x04, -0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x03,0x03,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x1e,0x00,0x03,0x06,0x01,0x00,0x03,0x00,0x63,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x17,0x20,0x1f,0x01,0x00,0x27,0x25,0x1f,0x2c, -0x20,0x2c,0x1d,0x1b,0x0f,0x0d,0x08,0x06,0x00,0x1e,0x01,0x1e,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x74,0x37, -0x43,0x19,0x22,0x09,0x62,0x72,0x72,0x62,0x62,0x72,0x2e,0x2b,0x18,0x22,0x1e,0x1e,0x19,0x3c,0x96,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0xcb,0x35,0x28,0x16,0x2f,0x1f,0x70,0x62,0x96,0x62,0x70,0x6f,0x62,0x97,0x3e,0x5b,0x1a,0x14,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x01,0x11,0x42,0x40,0x96,0x40,0x42,0x42,0x40,0x96,0x40,0x42,0x00,0x00, -0x00,0x03,0x00,0x23,0xff,0xe2,0x02,0x35,0x02,0x4e,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x4a,0x40,0x47,0x09,0x01,0x04,0x00,0x26,0x25,0x19,0x0c,0x01,0x05,0x05,0x04,0x14,0x01,0x02,0x05,0x03,0x4c,0x00,0x01,0x00,0x01,0x85,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x41,0x4d,0x07,0x01,0x05,0x05,0x02, -0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x20,0x1f,0x00,0x00,0x1f,0x27,0x20,0x27,0x1c,0x1a,0x00,0x15,0x00,0x15,0x26,0x12,0x26,0x08,0x09,0x19,0x2b,0x17,0x37,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x33,0x07,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x37,0x14,0x17,0x13,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35, -0x34,0x27,0x03,0x16,0x23,0x51,0x1c,0x72,0x62,0x4c,0x34,0x2e,0x5b,0x54,0x1f,0x72,0x62,0x50,0x36,0x29,0x30,0x03,0xcc,0x20,0x30,0x3c,0x43,0x7f,0x3c,0x43,0x04,0xd0,0x20,0x1e,0x72,0x31,0x43,0x96,0x62,0x70,0x22,0x40,0x76,0x32,0x47,0x97,0x62,0x70,0x26,0x3a,0xe6,0x11,0x0e,0x01,0x20,0x17,0x44,0x3e,0xfe,0xe8,0x45,0x3d,0x96,0x15, -0x13,0xfe,0xdb,0x1b,0xff,0xff,0x00,0x23,0xff,0xe2,0x02,0x35,0x03,0x11,0x02,0x26,0x01,0x39,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x0c,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x23,0xff,0xf6,0x02,0x35,0x02,0x30,0x00,0x28, -0x00,0x36,0x00,0x3f,0x00,0x59,0x40,0x56,0x0b,0x01,0x09,0x08,0x24,0x01,0x04,0x05,0x02,0x4c,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x09,0x00,0x03,0x05,0x09,0x03,0x67,0x0a,0x01,0x08,0x08,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0c,0x07,0x02,0x04,0x04,0x00,0x61,0x06,0x0b,0x02,0x00,0x00,0x3f,0x00,0x4e,0x2a,0x29,0x01, -0x00,0x3d,0x3b,0x38,0x37,0x31,0x2f,0x29,0x36,0x2a,0x36,0x21,0x1f,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x11,0x0f,0x08,0x06,0x00,0x28,0x01,0x28,0x0d,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x33,0x3e,0x02,0x33,0x32,0x16,0x15,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22, -0x26,0x26,0x27,0x23,0x0e,0x02,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x13,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xb4,0x43,0x4e,0x4e,0x43,0x28,0x33,0x1a,0x01,0x04,0x02,0x19,0x33,0x28,0x43,0x4e,0xde,0x24,0x1f,0x1a,0x25,0x04,0x55,0x0a,0x4c,0x38,0x28,0x33,0x19,0x02,0x04,0x01,0x1a,0x33,0x1e, -0x1f,0x24,0x24,0x1f,0x20,0x26,0x26,0xb9,0x89,0x26,0x20,0x1f,0x24,0x0a,0x57,0x49,0xfa,0x4a,0x56,0x1a,0x25,0x11,0x11,0x25,0x1a,0x56,0x4a,0x96,0x64,0x26,0x2d,0x20,0x1a,0x3e,0x49,0x1a,0x25,0x11,0x11,0x25,0x1a,0x4d,0x2d,0x26,0xfa,0x26,0x2d,0x2d,0x26,0xfa,0x26,0x2d,0x01,0x00,0x4d,0x26,0x2d,0x2d,0x26,0x00,0x00,0x02,0x00,0x5c, -0xff,0x4c,0x02,0x01,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x68,0xb6,0x11,0x03,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x05,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x00,0x00,0x00,0x3b,0x4d, -0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x14,0x16,0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x25,0x24,0x11,0x08,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15, -0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5c,0x5a,0x01,0x07,0x50,0x3e,0x53,0x62,0x62,0x53,0x3e,0x50,0x07,0x03,0x02,0x78,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0xb4,0x02,0xda,0x69,0x36,0x3d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x3c,0x43, -0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46,0x00,0x02,0x00,0x57,0xff,0x56,0x01,0xfc,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6c,0xb6,0x12,0x04,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x31,0x50,0x58,0x40,0x21,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f, -0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x59,0x40,0x14,0x16,0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x25,0x25,0x11, -0x08,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x11,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x57,0x5a,0x02,0x01,0x08,0x51,0x3e,0x53,0x62,0x62,0x53,0x3e,0x50,0x07,0x01,0x78,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0xaa,0x03, -0x84,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5e,0x6e,0x3d,0x36,0xfe,0xed,0xee,0x3c,0x43,0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0xff,0x4c,0x01,0xfc,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x68,0xb6,0x10,0x02,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x05,0x01,0x61, -0x02,0x01,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x3b,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x14,0x16, -0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x14,0x25,0x25,0x08,0x09,0x19,0x2b,0x05,0x35,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x33,0x11,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0xa2,0x02,0x03,0x07,0x50,0x3e,0x53,0x62, -0x63,0x52,0x3e,0x50,0x07,0x01,0x5a,0xd2,0x38,0x40,0x40,0x38,0x39,0x40,0x40,0xb4,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5f,0x6d,0x3d,0x36,0x69,0xfd,0x26,0xf8,0x46,0x3e,0x96,0x3e,0x46,0x3a,0x40,0xaa,0x40,0x3a,0x00,0x00,0x00,0x00,0x01,0x00,0x70,0x00,0x00,0x02,0x12,0x02,0x30,0x00,0x13,0x00,0x5a,0xb5,0x03,0x01,0x02,0x03,0x01, -0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x1e,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x04,0x04, -0x39,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x13,0x00,0x13,0x22,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x23,0x22,0x06,0x15,0x11,0x70,0x5a,0x02,0x07,0x4c,0x40,0x56,0x5d,0x5a,0x75,0x3b,0x3e,0x02,0x26,0x69,0x35,0x3e,0x67,0x5f,0x2f,0x2f,0x78,0x44,0x40, -0xfe,0xa2,0x00,0x00,0xff,0xff,0x00,0x70,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x76,0x00,0x00,0xff,0xff,0x00,0x70,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x10,0x02,0x12,0x02,0x30,0x02,0x26, -0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x7a,0x01,0xbd,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xf8,0x02,0x03,0x02,0x2e,0x00,0x28,0x00,0x3b,0x40,0x38,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00, -0x4e,0x01,0x00,0x1e,0x1b,0x19,0x18,0x16,0x13,0x09,0x06,0x04,0x03,0x00,0x28,0x01,0x27,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x15,0x14,0x06,0x23,0x01,0x16, -0x5c,0x65,0x5a,0x36,0x31,0x2c,0x32,0x37,0x41,0x98,0x38,0x3e,0x63,0x57,0x2c,0x50,0x65,0x04,0x5b,0x02,0x33,0x29,0x2c,0x2e,0x34,0x35,0x8e,0x8c,0x65,0x5c,0x08,0x53,0x4c,0x26,0x2b,0x2c,0x28,0x47,0x09,0x16,0x08,0x4d,0x3f,0x48,0x52,0x4f,0x40,0x1d,0x26,0x2a,0x24,0x3a,0x08,0x14,0x14,0x90,0x4d,0x55,0x00,0x00,0xff,0xff,0x00,0x55, -0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x35,0x02,0x03,0x02,0x2e,0x00,0x3a,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x03, -0x33,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x42,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08, -0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x42,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00, -0x3a,0x00,0x39,0x29,0x32,0x12,0x3a,0x32,0x14,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x15,0x14,0x06, -0x23,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd7,0x46,0x16,0x1b,0x37,0x32,0x17,0x50,0x57,0x5a,0x36,0x31,0x2c,0x32,0x37,0x41,0x98,0x38,0x3e,0x63,0x57,0x2c,0x50,0x65,0x04,0x5b,0x02,0x33,0x29,0x2c,0x2e,0x34,0x35,0x8e,0x8c,0x65,0x5c,0x0d,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x3e,0x06,0x51,0x47,0x26, -0x2b,0x2c,0x28,0x47,0x09,0x16,0x08,0x4d,0x3f,0x48,0x52,0x4f,0x40,0x1d,0x26,0x2a,0x24,0x3a,0x08,0x14,0x14,0x90,0x4d,0x55,0x1b,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x10,0x02,0x03, -0x02,0x2e,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x18,0x02,0xe4,0x00,0x2a,0x00,0x37,0x40,0x34,0x0c,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x69,0x00,0x05,0x05,0x00,0x61,0x00,0x00,0x00,0x3e,0x4d,0x00,0x02,0x02,0x01,0x61,0x07,0x06,0x02, -0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x00,0x2a,0x00,0x2a,0x24,0x21,0x24,0x21,0x2d,0x24,0x08,0x09,0x1c,0x2b,0x33,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11, -0x5c,0x35,0x5f,0x3f,0x3f,0x5e,0x35,0x41,0x34,0x3e,0x4e,0x38,0x63,0x42,0x3a,0x30,0x3e,0x4d,0x48,0x3a,0x39,0x2e,0x35,0x43,0x43,0x35,0x36,0x43,0x02,0x16,0x3d,0x5d,0x34,0x2f,0x52,0x37,0x3b,0x5a,0x0d,0x03,0x0b,0x68,0x48,0x3c,0x5c,0x34,0x52,0x48,0x3a,0x3a,0x48,0x50,0x42,0x35,0x35,0x42,0x46,0x38,0xfd,0xea,0x00,0x01,0x00,0xa5, -0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x0b,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x21,0x23,0x04,0x09,0x18,0x2b,0x33,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x11,0xa5,0x5d,0x4c,0xb0,0xb0,0x23,0x2c,0x02,0x3b,0x47,0x58, -0x50,0x2c,0x24,0xfd,0xc6,0x00,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08,0x02,0xc1,0x00,0x13,0x00,0x35,0x40,0x32,0x00,0x03,0x02,0x03,0x85,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x60,0x07,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x12,0x10,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07, -0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x08,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x63,0x44,0x52,0x9e,0x9e,0x5a,0xe1,0xe1,0x21,0x1b,0xa0,0x4f,0x42,0x01,0x43,0x52,0x9b,0x9b,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08, -0x02,0xc1,0x00,0x1b,0x00,0x3e,0x40,0x3b,0x00,0x03,0x02,0x03,0x85,0x06,0x01,0x00,0x0b,0x0a,0x02,0x07,0x08,0x00,0x07,0x67,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x08,0x08,0x09,0x60,0x00,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x1b,0x00,0x1b,0x18,0x16,0x23,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x0c,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x35,0x55,0x78,0x9e,0x9e,0x5a,0xe1,0xe1,0xb4,0xb4,0x21,0x1b,0xa0,0xa0,0x44,0x52,0xef,0x4b,0x9a,0x52,0x9b,0x9b,0x52,0x9a,0x4b,0x5e,0x1c,0x23,0x52,0x4f,0x42,0x5e,0x00, -0xff,0xff,0x00,0x2f,0x00,0x00,0x02,0x08,0x03,0x21,0x02,0x26,0x01,0x4c,0x00,0x00,0x01,0x07,0x06,0x6d,0x02,0x12,0x00,0x47,0x00,0x08,0xb1,0x01,0x01,0xb0,0x47,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0x2f,0xff,0x35,0x02,0x08,0x02,0xc1,0x00,0x25,0x00,0x87,0x40,0x0a,0x09,0x01,0x08,0x07,0x1e,0x01,0x01,0x08,0x02,0x4c,0x4b,0xb0, -0x15,0x50,0x58,0x40,0x2f,0x00,0x04,0x03,0x04,0x85,0x00,0x01,0x08,0x00,0x08,0x01,0x00,0x80,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x39,0x4d,0x00,0x00,0x00,0x09,0x5f,0x0a,0x01,0x09,0x09,0x3d,0x09,0x4e,0x1b,0x40,0x2c,0x00,0x04,0x03,0x04,0x85,0x00,0x01,0x08,0x00, -0x08,0x01,0x00,0x80,0x00,0x00,0x0a,0x01,0x09,0x00,0x09,0x63,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x39,0x08,0x4e,0x59,0x40,0x12,0x00,0x00,0x00,0x25,0x00,0x24,0x11,0x23,0x11,0x11,0x11,0x11,0x15,0x14,0x21,0x0b,0x09,0x1f,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34, -0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0x01,0x09,0x46,0x16,0x1b,0x37,0x32,0x1c,0x30,0x36,0x9e,0x9e,0x5a,0xe1,0xe1,0x21,0x1b,0xa0,0x99,0x0c,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x4b,0x0d,0x49, -0x35,0x01,0x43,0x52,0x9b,0x9b,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x23,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0xff,0xff,0x00,0x2f,0xff,0x10,0x02,0x08,0x02,0xc1,0x02,0x26,0x01,0x4c,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x94,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x26,0x00,0x11,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x01, -0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x05,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x2b,0x5f,0x72,0x5a,0x40,0x37,0x38,0x41,0x5a,0x74,0x0a,0x71,0x61,0x01,0x5e, -0xfe,0xa2,0x3c,0x47,0x47,0x3c,0x01,0x5e,0xfe,0xa2,0x61,0x71,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a, -0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x68, -0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6b,0x02,0x62,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00, -0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6f,0x02,0x58,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6a,0x02,0x4e,0x00,0xe3,0x00,0x08,0xb1,0x03, -0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xcc,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x73,0x02,0x58,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x01,0xfe,0x02,0x26,0x02,0x26, -0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x39,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a, -0xff,0xf6,0x02,0x58,0x02,0x94,0x00,0x19,0x00,0x4e,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1c,0x00,0x03,0x00,0x00,0x03,0x70,0x00,0x04,0x04,0x00,0x61,0x02,0x01,0x00,0x00,0x3b,0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x00,0x03,0x85,0x00,0x04,0x04,0x00,0x61,0x02,0x01,0x00,0x00,0x3b,0x4d, -0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x09,0x23,0x13,0x12,0x23,0x23,0x11,0x06,0x09,0x1c,0x2b,0x37,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x11,0x14,0x06,0x23,0x22,0x26,0x5a,0x5a,0x40,0x37,0x38,0x41,0x46,0x23,0x4b,0x2b,0x2f,0x74,0x5f,0x5f, -0x72,0xc8,0x01,0x5e,0xfe,0xa2,0x3e,0x45,0x45,0x3e,0x01,0x5e,0x23,0x4b,0x50,0x2b,0x34,0xfe,0xe3,0x61,0x71,0x71,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x58,0x02,0x94,0x02,0x26,0x01,0x5e,0x00,0x00, -0x00,0x07,0x06,0x78,0x02,0x57,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x39,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58, -0x03,0x0c,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6c,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe9,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00, -0x00,0x01,0x00,0x5a,0xff,0x35,0x01,0xfe,0x02,0x26,0x00,0x1f,0x00,0x56,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x05,0x05,0x00,0x60,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x19,0x00,0x05,0x06,0x01,0x00,0x05,0x00,0x64,0x04,0x01,0x02,0x02, -0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x13,0x01,0x00,0x1e,0x1c,0x13,0x12,0x10,0x0e,0x0c,0x0b,0x08,0x06,0x00,0x1f,0x01,0x1f,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x07,0x07,0x06,0x06,0x15,0x14, -0x16,0x33,0x33,0x15,0x01,0x74,0x37,0x43,0x19,0x22,0x09,0x62,0x70,0x5a,0x78,0x78,0x5a,0x57,0x18,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x16,0x2f,0x1f,0x70,0x62,0x01,0x5e,0xfe,0xa2,0x82,0x82,0x01,0x5e,0xfe,0xa2,0x7f,0x34,0x14,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x44,0x02,0x26, -0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x71,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x0c,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0x26,0x00,0x0c,0x00,0x21,0x40,0x1e,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d, -0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xf1,0xbb,0x61,0x78,0x0b,0x10,0x04,0x05,0x0e,0x0a,0x78,0x5f,0xbb,0x02,0x26,0xfe,0x8e,0x21,0x3d,0x11,0x11,0x3d,0x21,0x01,0x72,0xfd,0xda,0x00,0x00,0x01,0x00,0x1f, -0x00,0x00,0x02,0x39,0x02,0x26,0x00,0x1e,0x00,0x27,0x40,0x24,0x1a,0x0f,0x06,0x03,0x03,0x00,0x01,0x4c,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x1e,0x00,0x1e,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16, -0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x79,0x5a,0x4e,0x38,0x03,0x06,0x01,0x02,0x05,0x04,0x45,0x5a,0x45,0x04,0x07,0x01,0x02,0x06,0x03,0x3a,0x4a,0x5e,0x63,0x3f,0x04,0x07,0x02,0x01,0x08,0x05,0x42,0x02,0x26,0xfe,0x7c,0x16,0x35,0x11,0x11,0x35,0x16,0x01,0x84,0xfe,0x7c,0x16,0x35,0x11, -0x11,0x35,0x16,0x01,0x84,0xfd,0xda,0x01,0x7c,0x1c,0x3f,0x11,0x11,0x3f,0x1c,0xfe,0x84,0x00,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6e, -0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x09,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x00,0x17, -0x00,0x26,0x40,0x23,0x13,0x0d,0x07,0x01,0x04,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x18,0x12,0x05,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x13,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07, -0x32,0xc3,0xb7,0x6a,0x6d,0x07,0x0d,0x04,0x03,0x0d,0x07,0x6d,0x6a,0xb7,0xc2,0x6a,0x76,0x07,0x0d,0x05,0x04,0x0f,0x08,0x76,0x01,0x1b,0x01,0x0b,0xaa,0x0b,0x1a,0x08,0x08,0x1a,0x0b,0xaa,0xfe,0xf4,0xfe,0xe6,0xb4,0x0b,0x1d,0x09,0x09,0x1d,0x0b,0xb4,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x0d,0x00,0x22,0x40,0x1f, -0x07,0x01,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d,0x03,0x01,0x02,0x02,0x3d,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x18,0x12,0x04,0x09,0x18,0x2b,0x17,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x01,0xb2,0x51,0xcd,0x61,0x82,0x08,0x0e,0x03,0x03,0x0e,0x07,0x79,0x5f,0xfe,0xee,0xb4,0xd6,0x02, -0x04,0xfe,0xac,0x14,0x2c,0x10,0x10,0x2c,0x14,0x01,0x54,0xfd,0x26,0x00,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00, -0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x09,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x2b,0x02,0x22,0x02,0x26,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0xf8,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00, -0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x39,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0xe9,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22, -0x03,0x0c,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0x26,0x00,0x09,0x00,0x2c,0x40,0x29,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00, -0x09,0x00,0x09,0x12,0x11,0x12,0x05,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x5a,0x01,0x34,0xfe,0xd4,0x01,0x91,0xfe,0xc6,0x01,0x45,0x5a,0x01,0x7a,0x52,0x5a,0xfe,0x86,0x52,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00, -0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x1c,0x02,0xda,0x02,0x06,0x00,0x87,0x00,0x00, -0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x09,0x00,0x27,0x40,0x24,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x41, -0xc8,0xb4,0x01,0x0e,0xc8,0x52,0x02,0x36,0x52,0xfd,0x78,0x52,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0x2b,0x03,0xb6,0x02,0x26,0x01,0x7e,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x53,0x00,0x00,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0x2b,0x02,0xda,0x02,0x26,0x01,0x7e,0x00,0x00,0x00,0x07,0x06,0x6d,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x41, -0xff,0x10,0x02,0x2b,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x5d,0x00,0x00,0x02,0x06,0x01,0x7e,0x00,0x00,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0xa7,0x02,0xda,0x00,0x27,0x03,0x29,0x01,0x29,0x01,0x13,0x03,0x06,0x01,0x7e,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x2b, -0x02,0xda,0x00,0x11,0x00,0x34,0x40,0x31,0x0e,0x0d,0x0c,0x0b,0x06,0x05,0x04,0x03,0x08,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x15,0x11,0x15,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33,0x35,0x07,0x35, -0x37,0x35,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x11,0x33,0x15,0x41,0xc8,0x8c,0x8c,0xb4,0x01,0x0e,0x8c,0x8c,0xc8,0x52,0xf3,0x5f,0x50,0x5f,0xf3,0x52,0xfe,0xf7,0x5f,0x50,0x5f,0xfe,0xd1,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0xf6,0x02,0x24,0x02,0xc1,0x00,0x19,0x00,0x3f,0x40,0x3c,0x00,0x03,0x02,0x03,0x85,0x00,0x07,0x01, -0x06,0x01,0x07,0x06,0x80,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x16,0x14,0x12,0x10,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x19,0x01,0x19,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15, -0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x70,0x54,0x63,0x96,0x96,0x5a,0xe1,0xe1,0x32,0x2b,0x2b,0x31,0x58,0x61,0x0a,0x62,0x54,0x01,0x28,0x52,0x9b,0x9b,0x52,0xfe,0xd8,0x2f,0x37,0x37,0x2f,0x03,0x03,0x54,0x62,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0xf6,0x02,0x24,0x02,0xc1,0x00,0x21, -0x00,0x48,0x40,0x45,0x00,0x03,0x02,0x03,0x85,0x00,0x09,0x07,0x08,0x07,0x09,0x08,0x80,0x06,0x01,0x00,0x0c,0x0b,0x02,0x07,0x09,0x00,0x07,0x67,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x08,0x08,0x0a,0x61,0x00,0x0a,0x0a,0x3f,0x0a,0x4e,0x00,0x00,0x00,0x21,0x00,0x21,0x1e,0x1c,0x19,0x17,0x23,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x55,0x64,0x96,0x96,0x5a,0xe1,0xe1,0xc8,0xc8,0x32,0x2b,0x2b,0x31,0x58,0x61,0x53,0x54,0x63,0xef,0x4b, -0x9a,0x52,0x9b,0x9b,0x52,0x9a,0x4b,0x43,0x2f,0x37,0x37,0x2f,0x03,0x03,0x54,0x62,0x62,0x54,0x43,0x00,0xff,0xff,0x00,0x23,0xff,0xf6,0x02,0x24,0x03,0x21,0x02,0x26,0x01,0x84,0x00,0x00,0x01,0x07,0x06,0x6d,0x02,0x12,0x00,0x47,0x00,0x08,0xb1,0x01,0x01,0xb0,0x47,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0x35,0x02,0x24, -0x02,0xc1,0x00,0x2d,0x00,0x98,0x40,0x0a,0x09,0x01,0x09,0x07,0x26,0x01,0x01,0x09,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x04,0x03,0x04,0x85,0x00,0x08,0x02,0x07,0x02,0x08,0x07,0x80,0x00,0x01,0x09,0x00,0x09,0x01,0x72,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x09,0x61,0x00,0x09, -0x09,0x3f,0x4d,0x00,0x00,0x00,0x0a,0x5f,0x0b,0x01,0x0a,0x0a,0x3d,0x0a,0x4e,0x1b,0x40,0x34,0x00,0x04,0x03,0x04,0x85,0x00,0x08,0x02,0x07,0x02,0x08,0x07,0x80,0x00,0x01,0x09,0x00,0x09,0x01,0x00,0x80,0x00,0x00,0x0b,0x01,0x0a,0x00,0x0a,0x63,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x09,0x61, -0x00,0x09,0x09,0x3f,0x09,0x4e,0x59,0x40,0x14,0x00,0x00,0x00,0x2d,0x00,0x2c,0x25,0x22,0x22,0x23,0x11,0x11,0x11,0x11,0x15,0x14,0x21,0x0c,0x09,0x1f,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14, -0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0x01,0x09,0x46,0x16,0x1b,0x37,0x32,0x19,0x38,0x3f,0x96,0x96,0x5a,0xe1,0xe1,0x32,0x2b,0x2b,0x31,0x58,0x61,0x53,0x05,0x04,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x44,0x10,0x5a,0x43,0x01,0x28,0x52,0x9b,0x9b,0x52,0xfe,0xd8,0x2f,0x37,0x37,0x2f,0x03, -0x03,0x54,0x62,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x10,0x02,0x24,0x02,0xc1,0x02,0x26,0x01,0x84,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x94,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0x42,0x02,0x46,0x02,0x30,0x00,0x26,0x00,0x32,0x00,0x40,0x00,0xd1,0x40,0x0a,0x08,0x01,0x04,0x06,0x07,0x01,0x09,0x05, -0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2a,0x0b,0x01,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09,0x67,0x07,0x01,0x03,0x03,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0c,0x01,0x08,0x08,0x00,0x5f,0x0a,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x4b,0xb0,0x31,0x50,0x58,0x40,0x32,0x0b,0x01,0x06,0x00,0x04, -0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09,0x67,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x0c,0x01,0x08,0x08,0x00,0x5f,0x0a,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x2f,0x0b,0x01,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09, -0x67,0x0c,0x01,0x08,0x0a,0x01,0x00,0x08,0x00,0x63,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x3b,0x03,0x4e,0x59,0x59,0x40,0x23,0x35,0x33,0x28,0x27,0x01,0x00,0x3c,0x39,0x33,0x40,0x35,0x40,0x2e,0x2c,0x27,0x32,0x28,0x32,0x1f,0x1d,0x1b,0x19,0x13,0x12,0x11,0x10,0x0f,0x0d,0x00, -0x26,0x01,0x25,0x0d,0x09,0x16,0x2b,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x15,0x23,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x23,0x15,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x33,0x32,0x36,0x35,0x34, -0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0xe2,0x33,0x50,0x2d,0x51,0x40,0x34,0x3a,0x6e,0x5e,0x2e,0x19,0xde,0xb9,0x29,0x33,0x6c,0x5c,0x09,0x08,0x77,0x34,0x4f,0x2e,0x2e,0x4f,0x34,0x66,0x38,0x40,0x40,0x38,0x38,0x42,0x42,0x07,0xa6,0x26,0x31,0x31,0x26,0xa6,0x25,0x32,0x32,0xbe,0x29,0x49,0x30,0x42,0x57,0x0a,0x5f,0x13,0x50,0x39, -0x50,0x5e,0x0a,0x4a,0x01,0x05,0x2d,0x30,0x4b,0x57,0x4e,0x2a,0x4a,0x31,0x30,0x49,0x29,0x01,0xdc,0x36,0x2e,0x2e,0x36,0x36,0x2e,0x2e,0x36,0xfe,0x72,0x30,0x27,0x27,0x30,0x30,0x27,0x27,0x30,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00, -0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00, -0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x70,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x76,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x09,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x01,0xfe, -0x03,0x09,0x02,0x26,0x01,0x91,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xe3,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x42,0x01,0xee,0x02,0x26,0x00,0x15,0x00,0x58,0x4b,0xb0,0x31,0x50,0x58,0x40,0x1e,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00, -0x3d,0x00,0x4e,0x1b,0x40,0x1b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x02,0x05,0x01,0x00,0x02,0x00,0x65,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x03,0x4e,0x59,0x40,0x11,0x01,0x00,0x11,0x10,0x0f,0x0e,0x0b,0x09,0x06,0x05,0x00,0x15,0x01,0x15,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x33,0x15,0x14,0x16, -0x33,0x32,0x36,0x35,0x11,0x21,0x35,0x21,0x11,0x14,0x06,0x06,0x01,0x24,0x3c,0x5b,0x33,0x5a,0x3f,0x31,0x32,0x3e,0xfe,0xf3,0x01,0x67,0x33,0x5b,0xbe,0x32,0x58,0x3a,0x4a,0x4a,0x34,0x40,0x40,0x34,0x01,0xce,0x52,0xfd,0xe0,0x3a,0x58,0x32,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x02,0x6c,0x03,0x11,0x02,0x26,0x01,0x91,0x00,0x00, -0x00,0x07,0x06,0x6e,0x02,0xe3,0x00,0x00,0x00,0x01,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x13,0x00,0x32,0x40,0x2f,0x00,0x04,0x01,0x03,0x01,0x04,0x03,0x80,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04, -0x00,0x13,0x01,0x13,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x60,0x58,0x67,0xa6,0x01,0x00,0x36,0x2f,0x2f,0x36,0x5a,0x66,0x0a,0x66,0x57,0x01,0xd5,0x52,0xfd,0xd9,0x31,0x3c,0x3c,0x31,0x4b,0x4b,0x57,0x66,0x00,0x00,0x00,0xff,0xff,0xff,0xfb, -0xff,0xf6,0x02,0x1f,0x03,0xb6,0x02,0x26,0x01,0x93,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x30,0x00,0x00,0xff,0xff,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x27,0x06,0x6d,0x02,0x58,0x00,0x00,0x02,0x06,0x01,0x93,0x00,0x00,0xff,0xff,0xff,0xfb,0xff,0x10,0x02,0x1f,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x5d,0x00,0x00,0x02,0x06, -0x01,0x93,0x00,0x00,0x00,0x02,0xff,0xfb,0xff,0xf6,0x02,0x4d,0x02,0xda,0x00,0x13,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x04,0x05,0x03,0x05,0x04,0x03,0x80,0x00,0x06,0x08,0x01,0x05,0x04,0x06,0x05,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x15,0x14,0x01, -0x00,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x61,0x58,0x68,0xa6,0x01,0x00,0x37,0x2f, -0x2f,0x37,0x5a,0x67,0x41,0x25,0x2d,0x2d,0x25,0x25,0x2d,0x2d,0x0a,0x66,0x57,0x01,0xd5,0x52,0xfd,0xd9,0x31,0x3a,0x3a,0x31,0x29,0x29,0x57,0x66,0x01,0x23,0x2c,0x23,0x25,0x2e,0x2e,0x25,0x23,0x2c,0x00,0x00,0x00,0x01,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x1b,0x00,0x38,0x40,0x35,0x1b,0x0a,0x09,0x08,0x07,0x02,0x01,0x07, -0x03,0x00,0x00,0x01,0x02,0x03,0x02,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x3f,0x04,0x4e,0x23,0x13,0x27,0x11,0x13,0x05,0x09,0x1b,0x2b,0x37,0x35,0x37,0x35,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0x35, -0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x23,0x7e,0xa6,0x01,0x00,0x9a,0x9a,0x36,0x2f,0x2f,0x36,0x5a,0x66,0x59,0x58,0x67,0xe6,0x50,0x55,0xfd,0x52,0xfe,0xee,0x68,0x50,0x68,0xc5,0x31,0x3c,0x3c,0x31,0x4b,0x4b,0x57,0x66,0x66,0x57,0x88,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x30,0x00,0x23,0x00,0x64,0xb6,0x0a, -0x03,0x02,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x06,0x01,0x04,0x04,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x08,0x07,0x02,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x21,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x00,0x00,0x00,0x3b,0x4d,0x06,0x01,0x04,0x04,0x01,0x61, -0x02,0x01,0x01,0x01,0x41,0x4d,0x08,0x07,0x02,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x10,0x00,0x00,0x00,0x23,0x00,0x23,0x23,0x13,0x23,0x13,0x24,0x24,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x33,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34, -0x26,0x23,0x22,0x06,0x15,0x11,0x3c,0x51,0x02,0x01,0x05,0x2e,0x25,0x24,0x32,0x0b,0x07,0x31,0x26,0x35,0x40,0x56,0x1d,0x1a,0x1b,0x20,0x50,0x1f,0x1a,0x1a,0x1f,0x02,0x26,0x49,0x26,0x2d,0x29,0x23,0x23,0x29,0x4f,0x3f,0xfe,0x5e,0x01,0xa3,0x21,0x27,0x26,0x21,0xcd,0xcc,0x21,0x27,0x26,0x21,0xfe,0x5c,0x00,0x00,0x00,0x01,0x00,0x22, -0x00,0x00,0x02,0x36,0x02,0x26,0x00,0x18,0x00,0x2e,0x40,0x2b,0x17,0x0f,0x06,0x03,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x02,0x01,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36, -0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x03,0x6c,0x4a,0x52,0x2f,0x03,0x06,0x01,0x02,0x08,0x06,0x45,0x58,0x43,0x05,0x0c,0x01,0x02,0x06,0x03,0x2e,0x4e,0x4b,0x67,0x57,0x5a,0x02,0x26,0xfe,0x84,0x16,0x39,0x0b,0x0b,0x39,0x16,0x01,0x0f,0xfe,0xf1,0x16,0x37,0x0c,0x0c,0x37,0x16,0x01,0x7c, -0xfd,0xda,0x01,0x5f,0xfe,0xa1,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36, -0x03,0x09,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0xda,0x00,0x03,0x00,0x09,0x00,0x2f,0x40,0x2c,0x08,0x05,0x02,0x01,0x02,0x01, -0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x05,0x03,0x04,0x03,0x01,0x01,0x39,0x01,0x4e,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x33,0x11,0x33,0x11,0x21,0x03,0x13,0x33,0x03,0x13,0x64,0x5a,0x01,0x04,0xf6,0xe6,0x71,0xe5,0xf9,0x02,0xda,0xfd,0x26,0x01,0x22, -0x01,0x04,0xfe,0xfd,0xfe,0xdd,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x10,0x02,0x37,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x58,0x00,0x00,0x02,0x06,0x01,0x9f,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x02,0x06,0x02,0x4b,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x09,0x02,0xda,0x00,0x16,0x00,0x35,0x40,0x32, -0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x07,0x01,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x11,0x11,0x12,0x21,0x23,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15, -0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x41,0x9b,0x9b,0x9b,0x52,0x48,0x93,0x93,0x40,0xd3,0xd3,0xd3,0x52,0x01,0x39,0x50,0x75,0x41,0x49,0x50,0x3a,0x75,0x50,0xfe,0xc7,0x52,0x00,0x01,0x00,0x46,0x00,0x00,0x02,0x23,0x02,0x27,0x00,0x14,0x00,0x6e,0x4b,0xb0,0x1e,0x50,0x58,0xb5,0x07,0x01,0x00,0x01,0x01,0x4c,0x1b,0xb5, -0x07,0x01,0x00,0x04,0x01,0x4c,0x59,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x19,0x04,0x01,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d,0x05,0x01,0x00,0x00,0x06,0x5f,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x40,0x23,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d,0x00,0x04,0x04,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d, -0x05,0x01,0x00,0x00,0x06,0x5f,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x59,0x40,0x0f,0x00,0x00,0x00,0x14,0x00,0x14,0x13,0x21,0x24,0x11,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x15,0x33,0x36,0x36,0x37,0x37,0x15,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x46,0x91,0x87,0xda,0x01,0x0d,0x4e,0x39,0x64,0x63,0x42, -0x4d,0xd3,0x52,0x01,0x82,0x52,0x88,0x3e,0x49,0x01,0x01,0x5b,0x43,0x3a,0xfd,0x52,0xff,0xff,0x00,0x46,0x00,0x00,0x02,0x23,0x03,0x11,0x00,0x27,0x06,0x6b,0x02,0x76,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00,0xff,0xff,0x00,0x46,0x00,0x00,0x02,0x23,0x03,0x11,0x00,0x27,0x06,0x6f,0x02,0x6c,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00, -0xff,0xff,0x00,0x46,0xff,0x10,0x02,0x23,0x02,0x27,0x00,0x27,0x06,0x7a,0x02,0x1c,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x15,0x00,0x22,0x40,0x1f,0x0b,0x05,0x02,0x00,0x01,0x01,0x4c,0x02,0x01,0x01,0x01,0x3b,0x4d,0x00,0x00,0x00,0x03,0x60,0x00,0x03,0x03,0x3d,0x03,0x4e, -0x23,0x18,0x14,0x20,0x04,0x09,0x1a,0x2b,0x17,0x33,0x32,0x36,0x37,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x06,0x06,0x23,0x23,0x42,0x66,0x19,0x25,0x0b,0x12,0xcd,0x61,0x82,0x07,0x0f,0x03,0x03,0x0e,0x07,0x79,0x5f,0xdb,0x13,0x4c,0x31,0x75,0x61,0x1e,0x19,0x2a,0x02,0x26,0xfe,0x8a,0x14,0x2c,0x10,0x10, -0x2c,0x14,0x01,0x76,0xfd,0x9a,0x37,0x3d,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22, -0x03,0x09,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x2b,0x02,0x22,0x02,0x26,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0xf8,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00, -0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x39,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0xe9,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x0c,0x02,0x26,0x01,0xa7,0x00,0x00, -0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x02,0x26,0x00,0x14,0x00,0x4c,0xb5,0x03,0x01,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x13,0x05,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x39,0x00,0x4e,0x1b,0x40,0x17,0x05,0x04,0x02,0x02,0x02,0x3b, -0x4d,0x00,0x00,0x00,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x01,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0xfc,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63, -0x5a,0x3f,0x36,0x38,0x41,0x02,0x26,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x14,0x00,0x18,0x00,0x6a,0xb5,0x03,0x01,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x00,0x05,0x06,0x05,0x85,0x08,0x01,0x06,0x02,0x06, -0x85,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x39,0x00,0x4e,0x1b,0x40,0x22,0x00,0x05,0x06,0x05,0x85,0x08,0x01,0x06,0x02,0x06,0x85,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x00,0x00,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x15,0x15,0x15,0x00,0x00, -0x15,0x18,0x15,0x18,0x17,0x16,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x09,0x09,0x1a,0x2b,0x01,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x27,0x37,0x33,0x07,0x01,0xfc,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0xb0,0x6a,0x61,0x6f,0x02,0x26,0xfd, -0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x5f,0x8c,0x8c,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x0d,0x00,0x22,0x00,0x7a,0xb5,0x11,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x22,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x09,0x01,0x00,0x06,0x02,0x00, -0x69,0x0a,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x62,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x0a,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x62,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x1d, -0x0e,0x0e,0x01,0x00,0x0e,0x22,0x0e,0x22,0x1f,0x1d,0x1a,0x19,0x16,0x14,0x10,0x0f,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x0b,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35, -0x11,0x01,0x2c,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x88,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x80,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x5a,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc, -0x03,0x11,0x00,0x06,0x00,0x1b,0x00,0x75,0x40,0x0a,0x05,0x01,0x01,0x00,0x0a,0x01,0x06,0x05,0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x00,0x00,0x01,0x00,0x85,0x08,0x02,0x02,0x01,0x05,0x01,0x85,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x62,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x23,0x00,0x00,0x01, -0x00,0x85,0x08,0x02,0x02,0x01,0x05,0x01,0x85,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x03,0x03,0x39,0x4d,0x00,0x06,0x06,0x04,0x62,0x00,0x04,0x04,0x3f,0x04,0x4e,0x59,0x40,0x19,0x07,0x07,0x00,0x00,0x07,0x1b,0x07,0x1b,0x18,0x16,0x13,0x12,0x0f,0x0d,0x09,0x08,0x00,0x06,0x00,0x06,0x11,0x11,0x0a,0x09,0x18,0x2b,0x13,0x37,0x33, -0x17,0x23,0x27,0x07,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x77,0x8b,0x53,0x8c,0x63,0x52,0x50,0x01,0x20,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x4e,0x4e,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e, -0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x2c,0x00,0xa2,0xb5,0x1b,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x21,0x0a,0x02,0x09,0x03,0x00,0x00,0x01,0x61,0x03,0x01,0x01,0x01,0x40,0x4d,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07, -0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x03,0x01,0x01,0x0a,0x02,0x09,0x03,0x00,0x06,0x01,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x23,0x03,0x01,0x01,0x0a,0x02,0x09,0x03,0x00,0x06,0x01,0x00,0x69,0x0b, -0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x2c,0x18,0x2c,0x29,0x27,0x24,0x23,0x20,0x1e,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35, -0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x01,0x22,0x5a,0x01,0x07,0x4c, -0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x63,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x02,0x00,0x5a,0xff,0x2b,0x01,0xfc,0x02,0x26,0x00,0x0b,0x00,0x20,0x00,0x68,0xb5,0x0f,0x01,0x05, -0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1b,0x00,0x01,0x07,0x01,0x00,0x01,0x00,0x65,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x61,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x1f,0x00,0x01,0x07,0x01,0x00,0x01,0x00,0x65,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03, -0x61,0x00,0x03,0x03,0x3f,0x03,0x4e,0x59,0x40,0x19,0x0c,0x0c,0x01,0x00,0x0c,0x20,0x0c,0x20,0x1d,0x1b,0x18,0x17,0x14,0x12,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16, -0x33,0x32,0x36,0x35,0x11,0x01,0x2c,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xaf,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x02,0xfb,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc, -0x03,0x11,0x00,0x03,0x00,0x18,0x00,0x6d,0xb5,0x07,0x01,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x04,0x01,0x85,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x62,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x22,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x04, -0x01,0x85,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x62,0x00,0x03,0x03,0x3f,0x03,0x4e,0x59,0x40,0x18,0x04,0x04,0x00,0x00,0x04,0x18,0x04,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x17,0x11,0x23,0x35,0x23,0x06,0x06, -0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x0b,0x73,0x64,0x6e,0x92,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc, -0x03,0x39,0x00,0x0e,0x00,0x23,0x00,0xa6,0xb5,0x12,0x01,0x06,0x05,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x23,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x72,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x61,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40, -0x24,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x61,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x28,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d, -0x00,0x03,0x03,0x39,0x4d,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3f,0x04,0x4e,0x59,0x59,0x40,0x19,0x0f,0x0f,0x00,0x00,0x0f,0x23,0x0f,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x0a,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x17,0x11,0x23, -0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x02,0x32,0x0e,0x20,0x50,0x69,0x26,0x2f,0x11,0x28,0xa5,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x3f,0x13,0x0d,0x14,0x41,0x27,0x23,0x20,0x16,0x34,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72, -0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x01,0x00,0x5a,0xff,0xf6,0x02,0x58,0x02,0x94,0x00,0x1c,0x00,0x8f,0xb5,0x19,0x01,0x02,0x05,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1e,0x00,0x04,0x01,0x01,0x04,0x70,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x07,0x02,0x00,0x00,0x3f, -0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x04,0x01,0x04,0x85,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x07,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x04,0x01,0x04,0x85,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00, -0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x15,0x01,0x00,0x18,0x17,0x16,0x15,0x12,0x11,0x0f,0x0d,0x0a,0x08,0x05,0x04,0x00,0x1c,0x01,0x1c,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x11,0x23,0x35,0x23, -0x06,0x06,0x01,0x0f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x48,0x23,0x4b,0x2d,0x2f,0x5a,0x01,0x07,0x4c,0x0a,0x66,0x58,0x01,0x72,0xfe,0x98,0x3a,0x40,0x44,0x40,0x01,0x5e,0x23,0x4b,0x50,0x2b,0x34,0xfe,0x1b,0x69,0x37,0x3c,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x6b, -0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x58,0x02,0x94,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x57,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x39,0x02,0x26, -0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x0c,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0x11,0x00,0x03,0x00,0x07,0x00,0x1c,0x00,0x77,0xb5,0x0b,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18, -0x50,0x58,0x40,0x1f,0x02,0x01,0x00,0x0a,0x03,0x09,0x03,0x01,0x06,0x00,0x01,0x67,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x23,0x02,0x01,0x00,0x0a,0x03,0x09,0x03,0x01,0x06,0x00,0x01,0x67,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07, -0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x20,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x1c,0x08,0x1c,0x19,0x17,0x14,0x13,0x10,0x0e,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35, -0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x46,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x01,0x12,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x8c,0x8c,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a, -0xff,0xf6,0x01,0xfc,0x02,0xe9,0x00,0x03,0x00,0x18,0x00,0x96,0xb5,0x07,0x01,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x61,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x22, -0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3f,0x03,0x4e,0x1b,0x40,0x20,0x00,0x00,0x07,0x01,0x01,0x04,0x00,0x01,0x67,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x61,0x00, -0x03,0x03,0x3f,0x03,0x4e,0x59,0x59,0x40,0x18,0x04,0x04,0x00,0x00,0x04,0x18,0x04,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x8c,0x01,0x40,0x30,0x5a, -0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x9e,0x4b,0x4b,0x78,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x35,0x02,0x20,0x02,0x26,0x00,0x23,0x00,0xa0,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0a,0x07,0x01,0x03,0x02,0x06,0x01,0x01, -0x03,0x02,0x4c,0x1b,0x40,0x0a,0x07,0x01,0x03,0x02,0x06,0x01,0x05,0x03,0x02,0x4c,0x59,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1d,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x05,0x01,0x01,0x01,0x3f,0x4d,0x00,0x06,0x06,0x00,0x5f,0x07,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x00,0x06,0x07, -0x01,0x00,0x06,0x00,0x63,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x05,0x01,0x01,0x01,0x3f,0x01,0x4e,0x1b,0x40,0x1e,0x00,0x06,0x07,0x01,0x00,0x06,0x00,0x63,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x05,0x05,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x59,0x40,0x15,0x01,0x00,0x22,0x20, -0x1b,0x1a,0x19,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x00,0x23,0x01,0x23,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0xd2,0x37,0x43,0x21,0x29,0x01,0x07,0x4c,0x3f, -0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x5a,0x10,0x21,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1b,0x37,0x1e,0x67,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0xfd,0xda,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x44,0x00,0x0b,0x00,0x17,0x00,0x2c,0x00,0x84,0xb5,0x1b, -0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x25,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x29,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09, -0x01,0x00,0x06,0x02,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x2c,0x18,0x2c,0x29,0x27,0x24,0x23,0x20,0x1e,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09, -0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x2c,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21, -0xeb,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x60,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x6f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x0c,0x00,0x19, -0x00,0x2e,0x00,0xfc,0xb5,0x1d,0x01,0x09,0x08,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2a,0x00,0x01,0x01,0x03,0x61,0x05,0x01,0x03,0x03,0x40,0x4d,0x02,0x0b,0x02,0x00,0x00,0x04,0x61,0x00,0x04,0x04,0x38,0x4d,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x09,0x09,0x06,0x61,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x4b,0xb0,0x18, -0x50,0x58,0x40,0x28,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x02,0x0b,0x02,0x00,0x00,0x04,0x61,0x00,0x04,0x04,0x38,0x4d,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x09,0x09,0x06,0x61,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2a,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02, -0x0b,0x02,0x00,0x08,0x04,0x00,0x6a,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00,0x09,0x09,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x40,0x38,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x0b,0x01,0x00,0x08,0x04, -0x00,0x6a,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00,0x09,0x09,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x59,0x59,0x40,0x21,0x1a,0x1a,0x01,0x00,0x1a,0x2e,0x1a,0x2e,0x2b,0x29,0x26,0x25,0x22,0x20,0x1c,0x1b,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0d,0x09,0x16,0x2b, -0x01,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31, -0x61,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x8a,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x64,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x2e,0x02,0xe4,0x00,0x17, -0x00,0x3d,0x40,0x3a,0x00,0x01,0x02,0x03,0x02,0x01,0x03,0x80,0x07,0x01,0x03,0x06,0x01,0x04,0x05,0x03,0x04,0x67,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x3e,0x4d,0x00,0x05,0x05,0x39,0x05,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x08,0x06,0x04,0x03,0x00,0x17,0x01,0x17,0x09,0x09,0x16,0x2b,0x01, -0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x01,0x75,0x53,0x66,0x58,0x36,0x2b,0x2b,0x37,0xe1,0xe1,0x5a,0x96,0x96,0x68,0x02,0xe4,0x62,0x54,0x2f,0x37,0x37,0x2f,0x8f,0x52,0xfe,0xb3,0x01,0x4d,0x52,0x8f,0x54,0x62,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x09, -0x02,0xda,0x00,0x16,0x00,0x37,0x40,0x34,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x06,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x3b,0x4d,0x07,0x01,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x11,0x11,0x12,0x21,0x23,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33, -0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x41,0x9b,0x9b,0x9b,0x52,0x48,0x93,0x93,0x40,0xd3,0xd3,0xd3,0x52,0x01,0x84,0x50,0x2a,0x41,0x49,0x50,0x3a,0x2a,0x50,0xfe,0x7c,0x52,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x12,0x00,0x2f,0x40,0x2c, -0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x05,0x01,0x00,0x00,0x01,0x5f,0x04,0x01,0x01,0x01,0x3b,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x12,0x21,0x23,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11, -0xd7,0xa0,0xa0,0x52,0x48,0xa1,0xa1,0x40,0xe1,0xe1,0x01,0xd4,0x52,0x28,0x41,0x4b,0x52,0x3a,0x28,0x52,0xfe,0x2c,0x00,0x00,0x00,0x02,0x00,0xaf,0x01,0xc2,0x01,0xa4,0x02,0xe4,0x00,0x1b,0x00,0x25,0x00,0x8f,0xb5,0x18,0x01,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x04, -0x00,0x02,0x03,0x04,0x02,0x69,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x09,0x01,0x06,0x00,0x00,0x06,0x59,0x09,0x01,0x06,0x06,0x00,0x61,0x05,0x08,0x02,0x00,0x06,0x00,0x51,0x1b,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x05,0x06,0x00,0x06,0x05,0x00,0x80,0x00,0x04,0x00,0x02,0x03,0x04,0x02,0x69,0x00,0x01,0x00, -0x07,0x06,0x01,0x07,0x67,0x09,0x01,0x06,0x05,0x00,0x06,0x59,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x06,0x00,0x51,0x59,0x40,0x1b,0x1d,0x1c,0x01,0x00,0x22,0x20,0x1c,0x25,0x1d,0x25,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x1b,0x01,0x1b,0x0a,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35, -0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x15,0x14,0x16,0x01,0x12,0x2d,0x36,0x38,0x31,0x5a,0x23,0x1e,0x1a,0x24,0x03,0x32,0x05,0x3d,0x31,0x35,0x3e,0x2f,0x03,0x0a,0x33,0x16,0x27,0x2c,0x5a,0x37,0x22,0x01,0xc2,0x2f,0x27,0x27,0x2e,0x1d, -0x17,0x1b,0x16,0x12,0x26,0x2a,0x30,0x2a,0xc3,0x37,0x1c,0x20,0x26,0x24,0x1f,0x1a,0x2d,0x16,0x1a,0x00,0x00,0x02,0x00,0xb9,0x01,0xbd,0x01,0x9f,0x02,0xdf,0x00,0x0d,0x00,0x1b,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00, -0x51,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x34,0x3f,0x3f,0x34,0x34,0x3f,0x3f,0x34,0x1d,0x24,0x24,0x1d,0x1d, -0x24,0x24,0x01,0xbd,0x3a,0x2f,0x50,0x2f,0x3a,0x3a,0x2f,0x50,0x2f,0x3a,0x28,0x24,0x1d,0x50,0x1d,0x24,0x24,0x1d,0x50,0x1d,0x24,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x0c,0x00,0x15,0x00,0x31,0x40,0x2e,0x00,0x02, -0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x15,0x13,0x0f,0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x11,0x07,0x07,0x19,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34, -0x26,0x23,0x23,0x5e,0x01,0x96,0xfe,0xc4,0x79,0x68,0x79,0x79,0x68,0x79,0x79,0x3e,0x46,0x46,0x3e,0x79,0x02,0xda,0x52,0xd8,0x76,0x62,0x61,0x77,0x52,0x49,0x3d,0x3e,0x48,0x00,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x12,0x02,0xda,0x02,0x06,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x05, -0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x07,0x18,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x82,0x01,0xa9,0xfe,0xb1,0x02,0xda,0x52,0xfd,0x78,0x00,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x2b,0x03,0xb6,0x02,0x26, -0x01,0xcb,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x76,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x2b,0x03,0x39,0x00,0x07,0x00,0x47,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85, -0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x35,0x33,0x15,0x21,0x11,0x82,0x01,0x54,0x55,0xfe,0xb1,0x02,0xda,0x5f,0xb1,0xfd,0x78,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0xff,0x74,0x02,0x3f, -0x02,0xda,0x00,0x0e,0x00,0x15,0x00,0x33,0x40,0x30,0x08,0x05,0x02,0x03,0x00,0x03,0x53,0x00,0x07,0x07,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x02,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x00,0x0e,0x00,0x0e,0x11,0x11,0x11,0x14,0x11,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x36,0x36, -0x37,0x13,0x21,0x11,0x33,0x15,0x23,0x35,0x21,0x15,0x37,0x33,0x11,0x23,0x03,0x06,0x06,0x19,0x2d,0x11,0x24,0x01,0x07,0x01,0x76,0x46,0x50,0xfe,0x7a,0x3b,0xfb,0xc6,0x05,0x01,0x20,0x8c,0xd9,0x1e,0x79,0x46,0x01,0xb0,0xfd,0x73,0xd9,0x8c,0x8c,0xd9,0x02,0x3d,0xfe,0xa0,0x4d,0x76,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08, -0x02,0xda,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x02,0x52,0x02,0xda,0x00,0x15,0x00,0x36,0x40,0x33,0x0c,0x01,0x02,0x06,0x01,0x01,0x4c,0x03,0x01,0x01,0x08,0x01,0x06,0x05,0x01,0x06, -0x67,0x04,0x02,0x02,0x00,0x00,0x1a,0x4d,0x0a,0x09,0x07,0x03,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x15,0x00,0x15,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x0b,0x07,0x1f,0x2b,0x33,0x13,0x03,0x33,0x13,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x23,0x03,0x23,0x11,0x23,0x11,0x23,0x03,0x06,0x86,0x7c,0x5e,0x6a,0x2e, -0x4c,0x30,0x68,0x5e,0x7d,0x87,0x5d,0x75,0x2e,0x4c,0x30,0x74,0x01,0x7b,0x01,0x5f,0xfe,0xc1,0x01,0x3f,0xfe,0xc1,0x01,0x3f,0xfe,0xa0,0xfe,0x86,0x01,0x57,0xfe,0xa9,0x01,0x57,0xfe,0xa9,0x00,0x01,0x00,0x34,0xff,0xf6,0x02,0x16,0x02,0xe4,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x26,0x01,0x03,0x04,0x01,0x4c,0x00,0x06,0x05,0x04,0x05,0x06, -0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x1f,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x20,0x1e,0x1b,0x1a,0x18,0x16,0x12,0x10,0x0f,0x0d,0x09,0x07,0x05,0x04,0x00,0x2d,0x01,0x2d,0x09,0x07,0x16,0x2b, -0x05,0x22,0x26,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x23,0x46,0x6b,0x3d,0x01,0x5a,0x02,0x53,0x41,0x43,0x53,0x53,0x43,0x56,0x57,0x39,0x47, -0x46,0x38,0x3b,0x4a,0x5a,0x39,0x64,0x42,0x40,0x61,0x37,0x41,0x34,0x3e,0x4e,0x3d,0x6e,0x0a,0x35,0x5f,0x3e,0x3a,0x48,0x4b,0x3c,0x3c,0x4b,0x50,0x44,0x36,0x35,0x41,0x48,0x3a,0x3f,0x5e,0x35,0x30,0x55,0x38,0x3c,0x5b,0x0d,0x03,0x0b,0x67,0x47,0x3e,0x5e,0x35,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x11, -0x00,0x24,0x40,0x21,0x10,0x07,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1a,0x4d,0x04,0x03,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x06,0x07,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x36,0x37,0x03,0x5a,0x57,0x03,0x04,0x02,0xde,0x78,0x57, -0x03,0x05,0x02,0xdf,0x02,0xda,0xfe,0x66,0x24,0x51,0x49,0x19,0x02,0x71,0xfd,0x26,0x01,0x9a,0x25,0x51,0x49,0x18,0xfd,0x8f,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x01,0xd3,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0x51,0x00,0x00, -0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x03,0xb6,0x02,0x26,0x00,0x51,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x14,0xff,0xfb,0x01,0xfa,0x02,0xda,0x00,0x0f,0x00,0x4d,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x17,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x00,0x00,0x02,0x61,0x05,0x04,0x02,0x02, -0x02,0x1b,0x02,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x22,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x0f,0x00,0x0e,0x11,0x11,0x13,0x21,0x06,0x07,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x23,0x11,0x23,0x03, -0x06,0x06,0x23,0x14,0x12,0x2c,0x27,0x01,0x08,0x01,0x78,0x5a,0xc5,0x07,0x02,0x51,0x56,0x05,0x54,0x4f,0x60,0x01,0xdc,0xfd,0x26,0x02,0x88,0xfe,0x76,0x86,0x7d,0x00,0xff,0xff,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0xda,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x02,0x06,0x00,0x40,0x00,0x00, -0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x02,0x06,0x00,0x60,0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x01,0xfa,0x02,0xda,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33, -0x11,0x21,0x11,0x23,0x11,0x23,0x11,0x5e,0x01,0x9c,0x5a,0xe8,0x02,0xda,0xfd,0x26,0x02,0x88,0xfd,0x78,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x7a,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x02,0x06,0x00,0x1b,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x02,0xda,0x02,0x06, -0x00,0x89,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x22,0x40,0x1f,0x07,0x01,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1a,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x18,0x12,0x04,0x07,0x18,0x2b,0x33,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13, -0x33,0x01,0xbf,0x4a,0xd7,0x62,0x83,0x0d,0x10,0x02,0x02,0x0e,0x0b,0x73,0x62,0xfe,0xf9,0xbd,0x02,0x1d,0xfe,0x9b,0x22,0x3d,0x0f,0x0f,0x3d,0x22,0x01,0x65,0xfd,0x26,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x01,0xdf,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x2e,0xff,0xe7,0x02,0x2a, -0x03,0x02,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0xb2,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x2c,0x00,0x02,0x01,0x01,0x02,0x70,0x0a,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x1b,0x4b,0xb0, -0x11,0x50,0x58,0x40,0x2b,0x00,0x02,0x01,0x01,0x02,0x70,0x0a,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x1b,0x40,0x2a,0x00,0x02,0x01,0x02,0x85,0x0a,0x01,0x05,0x00,0x05,0x86,0x03,0x01, -0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x59,0x59,0x40,0x1a,0x18,0x18,0x00,0x00,0x27,0x26,0x21,0x20,0x18,0x1f,0x18,0x1f,0x1a,0x19,0x00,0x17,0x00,0x17,0x17,0x11,0x11,0x17,0x11,0x0c,0x07,0x1b,0x2b,0x17,0x35,0x22,0x26, -0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x35,0x33,0x15,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x15,0x27,0x11,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0xff,0x3c,0x5e,0x37,0x36,0x5f,0x3c,0x5a,0x3d,0x5e,0x36,0x37,0x5e,0x3c,0x56,0x38,0x49,0x49,0x8a,0x38,0x49,0x49,0x38,0x19,0x50,0x34,0x5d,0x3f, -0xdb,0x41,0x5f,0x35,0x4b,0x4b,0x35,0x5f,0x41,0xdb,0x3f,0x5d,0x34,0x50,0x9c,0x01,0xe8,0x49,0x40,0xdb,0x3d,0x47,0x47,0x3d,0xdb,0x40,0x49,0x00,0xff,0xff,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xa7,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x01,0xf9,0x02,0xda,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x02,0x00,0x00, -0x04,0x02,0x00,0x67,0x03,0x01,0x01,0x01,0x1a,0x4d,0x05,0x01,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x21,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x01,0x9f,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x01,0x0f,0x60,0x54,0x01,0x17,0xfe, -0xe9,0x30,0x34,0x01,0x7b,0xfd,0x26,0x00,0x00,0x01,0x00,0x5e,0xff,0x74,0x02,0x35,0x02,0xda,0x00,0x0b,0x00,0x29,0x40,0x26,0x06,0x01,0x05,0x02,0x05,0x54,0x03,0x01,0x01,0x01,0x1a,0x4d,0x04,0x01,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x05, -0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0xe5,0xfe,0x79,0x5a,0xd8,0x5a,0x4b,0x8c,0x8c,0x02,0xda,0xfd,0x76,0x02,0x8a,0xfd,0x76,0xdc,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x25,0x40,0x22,0x04,0x02,0x02,0x00,0x00,0x1a,0x4d,0x03,0x01,0x01,0x01,0x05,0x60,0x06,0x01,0x05, -0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x03,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x3e,0x02,0x55,0x77,0x4a,0x76,0x54,0x02,0xda,0xfd,0x74,0x02,0x8c,0xfd,0x74,0x02,0x8c,0xfd,0x26,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x74,0x02,0x53,0x02,0xda,0x00,0x0f, -0x00,0x2d,0x40,0x2a,0x08,0x01,0x07,0x02,0x07,0x54,0x05,0x03,0x02,0x01,0x01,0x1a,0x4d,0x06,0x04,0x02,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x02, -0x03,0xfe,0x39,0x51,0x78,0x46,0x78,0x51,0x3f,0x8c,0x8c,0x02,0xda,0xfd,0x74,0x02,0x8c,0xfd,0x74,0x02,0x8c,0xfd,0x74,0xda,0x00,0x01,0x00,0x5e,0xff,0x83,0x01,0xfa,0x02,0xda,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x19,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x00,0x60,0x04, -0x01,0x00,0x00,0x1b,0x00,0x4e,0x1b,0x40,0x18,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x00,0x60,0x04,0x01,0x00,0x00,0x1b,0x00,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x17,0x35,0x23,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x15,0xff, -0xa1,0x5a,0xe8,0x5a,0xa1,0x7d,0x7d,0x02,0xda,0xfd,0x78,0x02,0x88,0xfd,0x26,0x7d,0x00,0x02,0x00,0x5e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x15,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x1a,0x4d,0x00,0x03,0x03,0x02,0x60,0x05,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x15,0x13,0x0f, -0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x06,0x07,0x18,0x2b,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5e,0x5a,0x92,0x42,0x63,0x37,0x37,0x63,0x42,0x92,0x8d,0x3b,0x49,0x49,0x3b,0x8d,0x02,0xda,0xfe,0xd4,0x36,0x60,0x41,0x40,0x61,0x36,0x52,0x49,0x3c,0x3c,0x49, -0x00,0x02,0xff,0xfb,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x17,0x15,0x11,0x0f,0x00,0x0e,0x00,0x0d,0x21,0x11,0x11,0x07,0x07,0x19, -0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x87,0x8c,0xe6,0x69,0x42,0x63,0x37,0x37,0x63,0x42,0x69,0x64,0x3b,0x49,0x49,0x3b,0x64,0x02,0x88,0x52,0xfe,0xd4,0x36,0x60,0x41,0x40,0x61,0x36,0x52,0x49,0x3c,0x3c,0x49,0x00,0x00,0x00,0x03,0x00,0x3c, -0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x19,0x00,0x36,0x40,0x33,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x03,0x01,0x00,0x00,0x1a,0x4d,0x00,0x05,0x05,0x02,0x60,0x08,0x04,0x07,0x03,0x02,0x02,0x1b,0x02,0x4e,0x0c,0x0c,0x00,0x00,0x19,0x17,0x12,0x10,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0a,0x21,0x11, -0x09,0x07,0x18,0x2b,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x3c,0x54,0x2e,0x5a,0x6a,0x6a,0x5a,0x01,0x0a,0x54,0xfe,0x74,0x2e,0x33,0x3d,0x3d,0x33,0x2e,0x02,0xda,0xfe,0xd4,0x66,0x58,0x33,0x57,0x66,0x02,0xda,0xfd,0x26,0x4f,0x3c,0x33, -0x32,0x33,0x3c,0x00,0x00,0x02,0xff,0xfb,0xff,0xfb,0x02,0x44,0x02,0xda,0x00,0x17,0x00,0x21,0x00,0x6a,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x20,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x01,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x2a,0x00,0x02, -0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x1b,0x4d,0x06,0x01,0x00,0x00,0x05,0x61,0x08,0x01,0x05,0x05,0x22,0x05,0x4e,0x59,0x40,0x12,0x00,0x00,0x21,0x1f,0x1a,0x18,0x00,0x17,0x00,0x16,0x11,0x25,0x21,0x13,0x21,0x09,0x07,0x1b,0x2b,0x07,0x35, -0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x03,0x06,0x06,0x23,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x05,0x12,0x1d,0x1a,0x01,0x05,0x01,0x1e,0x3c,0x48,0x58,0x58,0x48,0x8c,0x7b,0x04,0x01,0x46,0x48,0x01,0x5e,0x3c,0x24,0x28,0x28,0x24,0x3c,0x05,0x50,0x39,0x3e,0x02, -0x18,0xfe,0xd4,0x55,0x46,0x78,0x46,0x55,0x02,0x8f,0xfe,0x33,0x68,0x5f,0x50,0x2c,0x24,0x78,0x24,0x2c,0x00,0x02,0x00,0x35,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x13,0x00,0x1d,0x00,0x33,0x40,0x30,0x03,0x01,0x01,0x08,0x01,0x05,0x07,0x01,0x05,0x69,0x02,0x01,0x00,0x00,0x1a,0x4d,0x00,0x07,0x07,0x04,0x60,0x09,0x06,0x02,0x04,0x04, -0x1b,0x04,0x4e,0x00,0x00,0x1d,0x1b,0x16,0x14,0x00,0x13,0x00,0x13,0x11,0x25,0x21,0x11,0x11,0x11,0x0a,0x07,0x1c,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x37,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x35,0x50,0x93,0x50,0x3c,0x4a,0x56,0x56,0x4a,0x8c,0x93, -0xe3,0x3c,0x26,0x2a,0x2a,0x26,0x3c,0x02,0xda,0xfe,0xd4,0x01,0x2c,0xfe,0xd4,0x54,0x47,0x78,0x47,0x54,0x01,0x63,0xfe,0x9d,0x4b,0x2b,0x25,0x78,0x26,0x2a,0x00,0x00,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x02,0xe4,0x02,0x06,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x1f,0x00,0x48,0x40,0x45, -0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x1f,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x13,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f, -0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0xdf,0xdf,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62,0x01,0x4a, -0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0x6f,0x52,0x89,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x00,0x00,0x00,0x01,0x00,0x4e,0xff,0xf6,0x01,0xfc,0x02,0xe4,0x00,0x1f,0x00,0x3b,0x40,0x38,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x00,0x00,0x02,0x01,0x02,0x00,0x01,0x80,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x04,0x04,0x06, -0x61,0x00,0x06,0x06,0x1f,0x4d,0x00,0x01,0x01,0x07,0x61,0x00,0x07,0x07,0x20,0x07,0x4e,0x25,0x22,0x12,0x23,0x11,0x13,0x22,0x10,0x08,0x07,0x1e,0x2b,0x37,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x4e,0x5a,0x42, -0x3a,0x3b,0x43,0xdf,0xdf,0x43,0x3b,0x3a,0x42,0x5a,0x74,0x62,0x64,0x74,0x74,0x64,0x62,0x74,0xc8,0x3e,0x43,0x43,0x3e,0x89,0x52,0x6f,0x3e,0x43,0x43,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x62,0x70,0x71,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef, -0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x2d,0xff,0xf6,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x4f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x16,0x00,0x34,0x40,0x31,0x15,0x07,0x02,0x04,0x05,0x01,0x4c,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x02, -0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x07,0x06,0x02,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x22,0x13,0x23,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x07,0x11,0x6e,0x6e,0x01,0x40,0x78,0x10,0x4c, -0x57,0x47,0x55,0x5a,0x57,0x31,0x3a,0x33,0x02,0x8b,0x4f,0x4f,0xfa,0x11,0x52,0x61,0x52,0xfe,0xbf,0x01,0x2d,0x77,0x3d,0x36,0xfe,0xcf,0x00,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x3a,0x02,0xe4,0x00,0x15,0x00,0x23,0x00,0x73,0x4b,0xb0,0x18,0x50,0x58,0x40,0x21,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x07,0x07,0x03,0x61, -0x05,0x01,0x03,0x03,0x1a,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x02,0x08,0x02,0x00,0x00,0x20,0x00,0x4e,0x1b,0x40,0x29,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x03,0x03,0x1a,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x1f,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e, -0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x15,0x01,0x15,0x0a,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15, -0x11,0x14,0x16,0x01,0x90,0x4b,0x58,0x5e,0x53,0x53,0x5e,0x58,0x4b,0x4e,0x5c,0x5c,0x4e,0x29,0x2e,0x2e,0x29,0x29,0x2e,0x2e,0x0a,0x64,0x55,0xa2,0xfe,0xaf,0x02,0xda,0xfe,0xc7,0x8a,0x56,0x63,0x63,0x56,0xfe,0x84,0x55,0x64,0x4a,0x3a,0x35,0x01,0x7c,0x35,0x3a,0x3a,0x35,0xfe,0x84,0x35,0x3a,0x00,0x02,0x00,0x38,0x00,0x00,0x01,0xf9, -0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x38,0x40,0x35,0x01,0x01,0x02,0x04,0x01,0x4c,0x07,0x01,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x06,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x10,0x0f,0x00,0x00,0x13,0x11,0x0f,0x17,0x10,0x17,0x00,0x0e,0x00,0x0e,0x11,0x11,0x27,0x08,0x07,0x19,0x2b, -0x33,0x13,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x11,0x23,0x11,0x23,0x03,0x13,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x38,0x96,0x42,0x4c,0x36,0x62,0x41,0xe0,0x5a,0x74,0x8b,0x79,0x86,0x86,0x37,0x45,0x44,0x01,0x40,0x14,0x6a,0x4a,0x3f,0x5e,0x35,0xfd,0x26,0x01,0x36,0xfe,0xca,0x01,0x86,0x01,0x04,0x47,0x3b,0x3a,0x48,0x00, -0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x1e,0x00,0x3e,0x40,0x3b,0x14,0x0b,0x02,0x02,0x01,0x01,0x4c,0x00,0x06,0x00,0x01,0x02,0x06,0x01,0x69,0x05,0x01,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x07,0x61,0x08,0x01,0x07,0x07,0x1e,0x07,0x4e,0x00,0x00,0x00,0x1e,0x00, -0x1d,0x23,0x11,0x11,0x11,0x13,0x24,0x21,0x09,0x07,0x1d,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x23,0x22,0x07,0x07,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x04,0x46,0x35,0x3e,0x57,0x31,0x3a,0x33,0x5a,0x6e,0x01,0x40,0x78,0x10,0x4c,0x57,0x47,0x55,0x70,0x5d, -0xb4,0x52,0x3d,0x34,0x01,0x1e,0x77,0x3d,0x36,0xfe,0xcf,0x02,0x8b,0x4f,0x4f,0xfa,0x11,0x52,0x61,0x52,0xfe,0xce,0x58,0x6b,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x04,0x01,0x01,0x05,0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x1a,0x4d,0x07,0x01,0x06,0x06, -0x1b,0x06,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x15,0x33,0x15,0x23,0x11,0x82,0x64,0x64,0x01,0xa9,0xfe,0xb1,0xa0,0xa0,0x01,0x46,0x50,0x01,0x44,0x52,0xf2,0x50,0xfe,0xba,0x00,0x01,0x00,0x51,0xff,0x74,0x02,0x49,0x02,0xda,0x00,0x10, -0x00,0x36,0x40,0x33,0x07,0x01,0x06,0x01,0x01,0x4c,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1a,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x10,0x00,0x10,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03, -0x13,0x33,0x15,0x23,0x35,0x23,0x03,0x23,0x11,0x51,0x5a,0x6c,0xa2,0x62,0xb5,0x97,0x4c,0x50,0x3b,0xaa,0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0xd6,0xdc,0x8c,0x01,0x51,0xfe,0xaf,0x00,0x00,0x00,0x00,0x01,0x00,0x59,0xff,0x74,0x02,0x26,0x02,0xda,0x00,0x0f,0x00,0x30,0x40,0x2d,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67, -0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1a,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x23,0x11,0x23,0x11,0x59,0x5a,0xea,0x5a,0x2f,0x50,0x39,0xea,0x02,0xda, -0xfe,0xc8,0x01,0x38,0xfd,0x76,0xdc,0x8c,0x01,0x50,0xfe,0xb0,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x02,0x06,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x14,0x00,0x2f,0x40,0x2c,0x08,0x01,0x00,0x01,0x01,0x4c,0x03,0x01,0x00,0x07,0x06,0x02,0x04,0x05,0x00,0x04,0x68,0x02,0x01,0x01, -0x01,0x1a,0x4d,0x00,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x18,0x11,0x11,0x08,0x07,0x1c,0x2b,0x37,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x23,0x35,0x7d,0x82,0xdc,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xdc,0x82,0x82,0x5a,0xc6, -0x4b,0x01,0xc9,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x37,0x4b,0xc6,0xc6,0x00,0x00,0x00,0x01,0x00,0x41,0xff,0x74,0x02,0x1e,0x02,0xda,0x00,0x13,0x00,0x2e,0x40,0x2b,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x00,0x05,0x04,0x05,0x63,0x03,0x01,0x01,0x01,0x1a,0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e, -0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x23,0x13,0x21,0x08,0x07,0x1c,0x2b,0x21,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x01,0x95,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x2f,0x50,0x01,0x0f,0x60,0x54,0x01,0x17,0xfe,0xe9,0x30,0x34,0x01,0x7b,0xfd,0x76,0xdc,0x8c, -0x00,0x01,0x00,0x5f,0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x67,0x05,0x01,0x04,0x04,0x1a,0x4d,0x03,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23, -0x11,0x23,0x11,0xb9,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x02,0xda,0xfe,0xf1,0x60,0x54,0xfe,0xe9,0x01,0x17,0x30,0x34,0xfe,0x85,0x02,0xda,0x00,0x02,0x00,0x54,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x16,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02, -0x02,0x04,0x61,0x00,0x04,0x04,0x1f,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x11,0x0f,0x0d,0x0c,0x0a,0x08,0x05,0x04,0x00,0x16,0x01,0x16,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33, -0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x29,0x62,0x73,0x01,0x50,0x42,0x39,0x39,0x42,0x5a,0x73,0x62,0x62,0x73,0x73,0x62,0x39,0x42,0xf6,0x42,0x0a,0x71,0x61,0xd1,0x7a,0x3b,0x46,0x46,0x3c,0x61,0x71,0x71,0x61,0xfe,0xb6,0x61,0x71,0x50,0x46,0x3c,0x7f,0x7f,0x3c,0x46,0xff,0xff,0x00,0x06, -0x00,0x00,0x02,0x52,0x03,0xb1,0x02,0x26,0x01,0xd1,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xf6,0x02,0x16,0x03,0xb1,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb1,0x02,0x26,0x01,0xd3,0x00,0x00,0x00,0x07,0x06,0x8e, -0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01, -0x1f,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00,0x0d,0x01,0x0d,0x08,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32, -0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x62,0x70,0x70,0x62,0x62,0x70,0x70,0xdb,0xf2,0x3e,0x3b,0x3b,0x3e,0x79,0x3b,0x3e,0xf2,0x3f,0x0a,0x71,0x62,0x01,0x49,0x62,0x70,0x70,0x62,0xfe,0xb7,0x61,0x72,0x01,0xa8,0x74,0x40,0x43,0x43,0x40,0xfe,0x33,0x44,0x40,0x85,0x85,0x40,0x44,0x00,0xff,0xff,0x00,0x4b,0x00,0x00,0x01,0xf9, -0x03,0xb1,0x02,0x26,0x01,0xe3,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x38,0x40,0x35,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x04,0x02,0x02,0x00,0x00,0x38,0x4d,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x39,0x01,0x4e,0x0c, -0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x09,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x13,0x03,0x33,0x13,0x03,0x33,0x11,0x33,0x11,0x01,0xf1,0x8b,0x8b,0x53,0x88,0x92,0xfd,0xbc,0x92,0x88,0x54,0x8a,0x8b,0x9f,0x4c,0x01,0x7c,0x01,0x5e,0xfe,0xa2, -0xfe,0x84,0x01,0x7e,0x01,0x5c,0xfe,0xa2,0xfe,0x84,0x02,0xda,0xfd,0x26,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xba,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x03,0xb6,0x00,0x27,0x06,0x91,0x02,0x62,0x00,0x00,0x02,0x06,0x00,0xba,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x74,0x02,0x47, -0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x34,0x40,0x31,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x38,0x4d,0x07,0x05,0x06,0x03,0x03,0x03,0x39,0x03,0x4e,0x0b,0x0b,0x00,0x00,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x0a,0x11,0x22,0x12,0x08,0x09,0x19,0x2b,0x21,0x03,0x13,0x33, -0x03,0x13,0x35,0x33,0x15,0x23,0x35,0x21,0x11,0x33,0x11,0x01,0xba,0xf9,0xf9,0x67,0xf0,0xc6,0x50,0x50,0xfe,0x61,0x5a,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0xd3,0x01,0xdc,0x8c,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x14,0x00,0x28,0x40,0x25,0x0b,0x05,0x02,0x00,0x01,0x01,0x4c,0x02, -0x01,0x01,0x01,0x38,0x4d,0x00,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x14,0x00,0x13,0x18,0x13,0x21,0x05,0x09,0x19,0x2b,0x33,0x35,0x33,0x32,0x37,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x06,0x06,0x23,0x42,0x6a,0x33,0x16,0x14,0xd7,0x62,0x83,0x0d,0x10,0x02,0x02,0x0e, -0x0b,0x73,0x62,0xda,0x13,0x4d,0x31,0x53,0x37,0x33,0x02,0x1d,0xfe,0x9b,0x22,0x3d,0x0f,0x0f,0x3d,0x22,0x01,0x65,0xfd,0x9a,0x37,0x3d,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x02,0x09,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03, -0x00,0x1f,0x00,0x77,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x08,0x01,0x01,0x02,0x01,0x63,0x00,0x03,0x03,0x06,0x5f,0x00,0x06,0x06,0x3b,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x06,0x00,0x03,0x04,0x06, -0x03,0x67,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x01,0x01,0x02,0x59,0x09,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x59,0x40,0x1a,0x05,0x04,0x00,0x00,0x1a,0x18,0x16,0x15,0x13,0x11,0x0c,0x0a,0x08,0x07,0x04,0x1f,0x05,0x1f,0x00,0x03,0x00,0x03,0x11,0x0a,0x09,0x17,0x2b,0x11,0x11,0x21,0x11,0x01, -0x32,0x36,0x35,0x23,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x33,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x02,0x58,0xfe,0xdc,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x62,0x64,0x74,0x74,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x01,0x22,0x71,0x61,0x3e,0x43,0x43,0x3e,0x01,0x4a, -0x3e,0x43,0x43,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x62,0x70,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0x30,0x02,0x06,0x00,0xbd,0x00,0x00,0x00,0x02,0x00,0x56,0xff,0xf6,0x02,0x02,0x02,0xe4,0x00,0x16,0x00,0x24,0x00,0x36,0x40,0x33,0x0d,0x01,0x02,0x03,0x01,0x4c,0x09,0x08,0x02,0x01,0x4a,0x00,0x01,0x00,0x03,0x02,0x01,0x03, -0x69,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1f,0x1d,0x17,0x24,0x18,0x24,0x11,0x0f,0x00,0x16,0x01,0x16,0x06,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x37,0x15,0x07,0x06,0x15,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26, -0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x63,0x73,0x6d,0x6a,0xb6,0xa8,0x9a,0x0c,0x51,0x3e,0x5f,0x67,0x73,0x63,0x3a,0x42,0x42,0x3a,0x3a,0x42,0x42,0x0a,0x74,0x63,0xfd,0x79,0x86,0x0a,0x11,0x59,0x0f,0x0e,0xa4,0x2d,0x30,0x37,0x74,0x61,0x62,0x63,0x74,0x50,0x49,0x3e,0x62,0x3e,0x49,0x49,0x3e,0x62,0x3e,0x49,0x00,0x00,0x00, -0x00,0x03,0x00,0x5c,0x00,0x00,0x02,0x0d,0x02,0x26,0x00,0x0f,0x00,0x18,0x00,0x21,0x00,0x39,0x40,0x36,0x08,0x01,0x05,0x02,0x01,0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x00,0x04,0x04,0x01,0x5f,0x06,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x21,0x1f,0x1b,0x19,0x18,0x16, -0x12,0x10,0x00,0x0f,0x00,0x0e,0x21,0x07,0x07,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5c,0xf1,0x53,0x60,0x3f,0x32,0x3c,0x42,0x66,0x57,0x9c,0x99,0x2a,0x30,0x30,0x2a,0x99,0x9c,0x2f, -0x35,0x35,0x2f,0x9c,0x02,0x26,0x4a,0x40,0x2e,0x3f,0x04,0x04,0x04,0x4c,0x3c,0x47,0x54,0x01,0x40,0x28,0x24,0x23,0x28,0xfe,0x78,0x2c,0x28,0x27,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x87,0x00,0x00,0x02,0x12,0x02,0x26,0x00,0x05,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02, -0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x07,0x18,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x87,0x01,0x8b,0xfe,0xcf,0x02,0x26,0x52,0xfe,0x2c,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x02,0x0f,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x80,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x0d, -0x02,0x8f,0x00,0x07,0x00,0x47,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x59,0x40,0x0c, -0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x35,0x33,0x15,0x21,0x11,0x82,0x01,0x36,0x55,0xfe,0xcf,0x02,0x26,0x69,0xbb,0xfe,0x2c,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x0f,0x00,0x17,0x00,0x33,0x40,0x30,0x08,0x05,0x02,0x03,0x00,0x03,0x53,0x00,0x07,0x07, -0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x06,0x02,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x13,0x12,0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x15,0x11,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x3e,0x02,0x37,0x37,0x21,0x11,0x33,0x15,0x23,0x35,0x21,0x15,0x37,0x33,0x11,0x23,0x07,0x0e,0x02,0x1b,0x2a,0x0d, -0x19,0x12,0x01,0x04,0x01,0x6d,0x4b,0x50,0xfe,0x81,0x34,0xf6,0xbe,0x02,0x01,0x10,0x17,0x8c,0xdc,0x0c,0x31,0x58,0x48,0xf9,0xfe,0x2a,0xdc,0x8c,0x8c,0xdc,0x01,0x88,0xad,0x47,0x58,0x31,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x02,0x06,0x00,0xe1,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x09,0x02,0x26, -0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0x26,0x00,0x15,0x00,0x36,0x40,0x33,0x0c,0x01,0x02,0x06,0x01,0x01,0x4c,0x03,0x01,0x01,0x08,0x01,0x06,0x05,0x01,0x06,0x67,0x04,0x02,0x02,0x00,0x00,0x1c,0x4d,0x0a,0x09,0x07,0x03,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00, -0x15,0x00,0x15,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x0b,0x07,0x1f,0x2b,0x33,0x13,0x03,0x33,0x17,0x33,0x35,0x33,0x15,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x23,0x35,0x23,0x07,0x0f,0x7b,0x73,0x56,0x65,0x35,0x4a,0x33,0x68,0x55,0x73,0x7b,0x59,0x69,0x36,0x4a,0x36,0x6a,0x01,0x1c,0x01,0x0a,0xed,0xed,0xed,0xed, -0xfe,0xf9,0xfe,0xe1,0xfb,0xfb,0xfb,0xfb,0x00,0x01,0x00,0x46,0xff,0xf9,0x02,0x0d,0x02,0x2d,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x26,0x01,0x03,0x04,0x01,0x4c,0x00,0x06,0x05,0x04,0x05,0x06,0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x21,0x4d, -0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x22,0x00,0x4e,0x01,0x00,0x21,0x1e,0x1c,0x1b,0x19,0x16,0x12,0x10,0x0f,0x0d,0x09,0x06,0x04,0x03,0x00,0x2d,0x01,0x2c,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x22,0x06,0x07, -0x23,0x36,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x01,0x0a,0x5a,0x6a,0x5a,0x39,0x31,0x35,0x34,0x3c,0x3c,0x34,0x78,0x75,0x2f,0x37,0x36,0x2f,0x2f,0x2c,0x35,0x02,0x5a,0x02,0x66,0x55,0x2f,0x5a,0x69,0x3f,0x32,0x3c,0x42,0x6f,0x5f,0x07,0x55,0x49,0x23,0x2a,0x2d,0x27,0x29,0x2f,0x4e,0x2a, -0x24,0x23,0x29,0x22,0x1d,0x41,0x4d,0x4a,0x45,0x2e,0x3f,0x04,0x04,0x04,0x4c,0x3c,0x4b,0x59,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x0f,0x00,0x24,0x40,0x21,0x0e,0x06,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1c,0x4d,0x04,0x03,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11, -0x15,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x07,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x37,0x03,0x5c,0x56,0x03,0x08,0xe5,0x70,0x56,0x03,0x08,0xe5,0x02,0x26,0xfe,0xd8,0x2b,0x5c,0x1d,0x01,0xcc,0xfd,0xda,0x01,0x29,0x2c,0x5c,0x1d,0xfe,0x32,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfc,0x03,0x11,0x02,0x26, -0x02,0x17,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x00,0x0c,0x00,0x2d,0x40,0x2a,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x1c,0x4d,0x06,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x12, -0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x11,0x33,0x15,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x67,0x5a,0x6b,0x98,0x67,0xb2,0xbc,0x69,0x9f,0x6c,0x02,0x26,0xe3,0xe3,0xfe,0xf8,0xfe,0xe2,0xf1,0xf1,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x03,0x11,0x02,0x26,0x02,0x19,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x65,0x00,0x00, -0x00,0x01,0x00,0x19,0xff,0xf9,0x01,0xfc,0x02,0x26,0x00,0x0f,0x00,0x4d,0x4b,0xb0,0x21,0x50,0x58,0x40,0x17,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x00,0x00,0x02,0x61,0x05,0x04,0x02,0x02,0x02,0x1b,0x02,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00, -0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x22,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x0f,0x00,0x0e,0x11,0x11,0x13,0x21,0x06,0x07,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x23,0x11,0x23,0x07,0x06,0x06,0x23,0x19,0x0f,0x2e,0x25,0x01,0x06,0x01,0x7a,0x5a,0xc7,0x05,0x03,0x4e,0x58,0x07,0x54,0x48,0x5d,0x01,0x34,0xfd, -0xda,0x01,0xd4,0xe6,0x83,0x72,0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0x26,0x00,0x12,0x00,0x2e,0x40,0x2b,0x0e,0x0b,0x03,0x03,0x03,0x00,0x01,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x01,0x01,0x00,0x00,0x1c,0x4d,0x05,0x04,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x15,0x11,0x12,0x11, -0x06,0x07,0x1a,0x2b,0x33,0x11,0x33,0x13,0x13,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x03,0x23,0x03,0x16,0x16,0x15,0x15,0x48,0x76,0x6c,0x6d,0x79,0x56,0x03,0x0a,0x75,0x52,0x6e,0x09,0x03,0x02,0x26,0xfe,0xf3,0x01,0x0d,0xfd,0xda,0x55,0x8f,0xd0,0x46,0xfe,0xdd,0x01,0x13,0x3e,0xc0,0x97,0x55,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc, -0x02,0x26,0x00,0x0b,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x1c,0x4d,0x06,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x15,0x5c,0x5a,0xec,0x5a,0x5a,0xec,0x02, -0x26,0xe3,0xe3,0xfd,0xda,0xf1,0xf1,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x02,0x06,0x01,0x22,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x07,0x00,0x07, -0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x11,0x23,0x11,0x23,0x11,0x5c,0x01,0xa0,0x5a,0xec,0x02,0x26,0xfd,0xda,0x01,0xd4,0xfe,0x2c,0xff,0xff,0x00,0x5c,0xff,0x4c,0x02,0x01,0x02,0x30,0x02,0x06,0x01,0x3d,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x02,0x30,0x02,0x06,0x00,0xd7,0x00,0x00,0x00,0x01,0x00,0x37, -0x00,0x00,0x02,0x21,0x02,0x26,0x00,0x07,0x00,0x21,0x40,0x1e,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xc8,0x01,0xea,0xc8,0x01,0xd4,0x52,0x52,0xfe,0x2c,0x00,0x00, -0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0x70,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x30,0xff,0x4c,0x02,0x28,0x02,0xda,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x42,0x40,0x3f,0x00,0x02,0x02,0x1a, -0x4d,0x09,0x01,0x06,0x06,0x01,0x61,0x03,0x01,0x01,0x01,0x1c,0x4d,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x00,0x1b,0x4d,0x0a,0x01,0x05,0x05,0x1e,0x05,0x4e,0x18,0x18,0x00,0x00,0x27,0x26,0x21,0x20,0x18,0x1f,0x18,0x1f,0x1a,0x19,0x00,0x17,0x00,0x17,0x17,0x11,0x11,0x17,0x11,0x0c,0x07,0x1b,0x2b,0x17,0x35,0x2e,0x02, -0x35,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x1e,0x02,0x15,0x15,0x14,0x06,0x06,0x07,0x15,0x27,0x11,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0xff,0x3d,0x5e,0x34,0x34,0x5e,0x3d,0x5a,0x3e,0x5d,0x34,0x34,0x5d,0x3e,0x53,0x3c,0x45,0x45,0x88,0x3c,0x45,0x45,0x3c,0xb4,0xb4,0x02,0x36,0x5f,0x3d,0x80, -0x3d,0x5e,0x36,0x01,0xb4,0xb4,0x01,0x36,0x5e,0x3d,0x80,0x3d,0x5f,0x36,0x02,0xb4,0xfb,0x01,0x98,0x46,0x3b,0x94,0x3c,0x47,0x47,0x3c,0x94,0x3b,0x46,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x01,0xf4,0x02,0x26,0x00,0x0f,0x00,0x25,0x40,0x22, -0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x03,0x01,0x01,0x01,0x1c,0x4d,0x05,0x01,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x21,0x35,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x01,0x9a,0x93,0x55,0x64,0x5a,0x35,0x2d,0x90,0x5a,0xbf,0x5a,0x4c, -0xc1,0xc1,0x27,0x2e,0x01,0x16,0xfd,0xda,0x00,0x01,0x00,0x5c,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x0b,0x00,0x29,0x40,0x26,0x06,0x01,0x05,0x02,0x05,0x54,0x03,0x01,0x01,0x01,0x1c,0x4d,0x04,0x01,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x05, -0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0xea,0xfe,0x72,0x5a,0xdf,0x5a,0x4b,0x8c,0x8c,0x02,0x26,0xfe,0x2a,0x01,0xd6,0xfe,0x2a,0xdc,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x26,0x00,0x0b,0x00,0x25,0x40,0x22,0x04,0x02,0x02,0x00,0x00,0x1c,0x4d,0x03,0x01,0x01,0x01,0x05,0x60,0x06,0x01,0x05, -0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x03,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x3e,0x02,0x55,0x77,0x4a,0x76,0x54,0x02,0x26,0xfe,0x26,0x01,0xda,0xfe,0x26,0x01,0xda,0xfd,0xda,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x74,0x02,0x53,0x02,0x26,0x00,0x0f, -0x00,0x2d,0x40,0x2a,0x08,0x01,0x07,0x02,0x07,0x54,0x05,0x03,0x02,0x01,0x01,0x1c,0x4d,0x06,0x04,0x02,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x02, -0x03,0xfe,0x39,0x51,0x76,0x46,0x76,0x51,0x43,0x8c,0x8c,0x02,0x26,0xfe,0x26,0x01,0xda,0xfe,0x26,0x01,0xda,0xfe,0x26,0xd8,0x00,0x01,0x00,0x5c,0xff,0x83,0x01,0xfc,0x02,0x26,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x19,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x00,0x60,0x04, -0x01,0x00,0x00,0x1b,0x00,0x4e,0x1b,0x40,0x18,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x00,0x60,0x04,0x01,0x00,0x00,0x1b,0x00,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x17,0x35,0x23,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x15,0xff, -0xa3,0x5a,0xec,0x5a,0xa3,0x7d,0x7d,0x02,0x26,0xfe,0x2c,0x01,0xd4,0xfd,0xda,0x7d,0x00,0x02,0x00,0x69,0x00,0x00,0x02,0x28,0x02,0x26,0x00,0x0a,0x00,0x13,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x1c,0x4d,0x00,0x03,0x03,0x02,0x60,0x05,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x13,0x11,0x0d, -0x0b,0x00,0x0a,0x00,0x09,0x21,0x11,0x06,0x07,0x18,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x69,0x5a,0x9d,0x5d,0x6b,0x6c,0x5c,0x9d,0x9d,0x34,0x37,0x37,0x34,0x9d,0x02,0x26,0xca,0x5d,0x51,0x50,0x5e,0x52,0x2f,0x2d,0x2d,0x2f,0x00,0x00,0x00,0x00,0x02,0x00,0x19, -0x00,0x00,0x02,0x3a,0x02,0x26,0x00,0x0c,0x00,0x15,0x00,0x31,0x40,0x2e,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x15,0x13,0x0f,0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x11,0x07,0x07,0x19,0x2b,0x33,0x11,0x23, -0x35,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xa5,0x8c,0xe6,0x73,0x5d,0x6b,0x6c,0x5c,0x73,0x73,0x34,0x37,0x37,0x34,0x73,0x01,0xd6,0x50,0xca,0x5d,0x51,0x50,0x5e,0x52,0x2f,0x2d,0x2d,0x2f,0x00,0x00,0x03,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x26,0x00,0x0a,0x00,0x0e,0x00,0x17, -0x00,0x36,0x40,0x33,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x03,0x01,0x00,0x00,0x1c,0x4d,0x00,0x05,0x05,0x02,0x60,0x08,0x04,0x07,0x03,0x02,0x02,0x1b,0x02,0x4e,0x0b,0x0b,0x00,0x00,0x17,0x15,0x11,0x0f,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x09,0x21,0x11,0x09,0x07,0x18,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15, -0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x3c,0x54,0x37,0x59,0x67,0x67,0x59,0x01,0x01,0x54,0xfe,0x74,0x37,0x34,0x3c,0x3c,0x34,0x37,0x02,0x26,0xca,0x5e,0x50,0x50,0x5e,0x02,0x26,0xfd,0xda,0x48,0x37,0x2f,0x2f,0x37,0x00,0x00,0x00,0x02,0x00,0x05,0xff,0xfb,0x02,0x42,0x02,0x26,0x00,0x17, -0x00,0x21,0x00,0x9c,0x4b,0xb0,0x27,0x50,0x58,0x40,0x20,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x06,0x01,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2b,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f, -0x00,0x01,0x01,0x1c,0x4d,0x00,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x4d,0x00,0x06,0x06,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x28,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x06,0x06,0x03,0x5f,0x00,0x03,0x03,0x1b,0x4d,0x00,0x00,0x00, -0x05,0x61,0x08,0x01,0x05,0x05,0x22,0x05,0x4e,0x59,0x59,0x40,0x12,0x00,0x00,0x21,0x1f,0x1a,0x18,0x00,0x17,0x00,0x16,0x11,0x25,0x21,0x13,0x21,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x15,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x03,0x06,0x06,0x23,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26, -0x23,0x23,0x05,0x12,0x19,0x1e,0x01,0x04,0x01,0x11,0x3e,0x48,0x58,0x58,0x48,0x8b,0x71,0x03,0x01,0x4d,0x41,0x01,0x50,0x3e,0x24,0x27,0x27,0x24,0x3e,0x05,0x55,0x3e,0x34,0x01,0x64,0xc8,0x55,0x45,0x2a,0x45,0x55,0x01,0xd9,0xfe,0xe9,0x5b,0x6c,0x4f,0x2c,0x24,0x2a,0x24,0x2c,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x02,0x42, -0x02,0x26,0x00,0x13,0x00,0x1d,0x00,0x33,0x40,0x30,0x03,0x01,0x01,0x08,0x01,0x05,0x07,0x01,0x05,0x69,0x02,0x01,0x00,0x00,0x1c,0x4d,0x00,0x07,0x07,0x04,0x60,0x09,0x06,0x02,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x1d,0x1b,0x16,0x14,0x00,0x13,0x00,0x13,0x11,0x25,0x21,0x11,0x11,0x11,0x0a,0x07,0x1c,0x2b,0x33,0x11,0x33,0x15,0x33, -0x35,0x33,0x15,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x37,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x3e,0x53,0x8b,0x49,0x3d,0x48,0x58,0x58,0x48,0x86,0x8b,0xd4,0x3d,0x24,0x29,0x29,0x24,0x3d,0x02,0x26,0xc8,0xc8,0xc8,0x55,0x46,0x28,0x46,0x55,0x01,0x13,0xfe,0xed,0x4b,0x2c,0x24,0x28,0x24,0x2c,0x00, -0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x02,0x2e,0x02,0x06,0x01,0x44,0x00,0x00,0x00,0x01,0x00,0x57,0xff,0xf6,0x02,0x08,0x02,0x30,0x00,0x1f,0x00,0x48,0x40,0x45,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01, -0x21,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x13,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f,0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33, -0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x32,0x64,0x77,0x77,0x64,0x5f,0x74,0x03,0x5a,0x03,0x41,0x38,0x3b,0x46,0xb7,0xb7,0x46,0x3b,0x38,0x41,0x03,0x5a,0x03,0x74,0x0a,0x70,0x62,0x96,0x62,0x70,0x65,0x54,0x31,0x38,0x44,0x3e,0x1e,0x50,0x29,0x3d,0x44,0x39,0x31,0x55,0x65,0x00,0x01,0x00,0x50,0xff,0xf6,0x02,0x01,0x02,0x30,0x00,0x1f, -0x00,0x48,0x40,0x45,0x00,0x06,0x05,0x04,0x05,0x06,0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x21,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1a,0x18,0x16,0x15,0x13,0x11,0x0e,0x0d,0x0c,0x0b,0x08,0x06, -0x04,0x03,0x00,0x1f,0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x26,0x5f,0x74,0x03,0x5a,0x03,0x42,0x37,0x3b,0x46,0xb7,0xb7,0x46,0x3b,0x37,0x42,0x03,0x5a,0x03,0x74,0x5f, -0x64,0x77,0x77,0x0a,0x65,0x55,0x31,0x39,0x44,0x3d,0x29,0x50,0x1e,0x3e,0x44,0x38,0x31,0x54,0x65,0x70,0x62,0x96,0x62,0x70,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00, -0x00,0x07,0x06,0x68,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x4c,0x01,0xc3,0x03,0x09,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x1c,0x00,0x39,0x40,0x36,0x09,0x01,0x05,0x06,0x01,0x4c,0x02,0x01,0x00,0x09,0x08,0x02,0x03,0x04,0x00,0x03, -0x67,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x00,0x01,0x01,0x1a,0x4d,0x07,0x01,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x1c,0x00,0x1c,0x13,0x23,0x13,0x24,0x11,0x11,0x11,0x11,0x0a,0x07,0x1e,0x2b,0x11,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06, -0x15,0x11,0x23,0x11,0x5c,0x5a,0xa8,0xa8,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x5a,0x02,0x3a,0x4b,0x55,0x55,0x4b,0xb9,0x37,0x3c,0x66,0x58,0xfe,0xca,0x01,0x2c,0x3b,0x41,0x46,0x40,0xfe,0xde,0x02,0x3a,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x30,0x02,0x30,0x00,0x15,0x00,0x23,0x00,0x73,0x4b,0xb0,0x18,0x50, -0x58,0x40,0x21,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x07,0x07,0x03,0x61,0x05,0x01,0x03,0x03,0x1c,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x02,0x08,0x02,0x00,0x00,0x20,0x00,0x4e,0x1b,0x40,0x29,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x03,0x03,0x1c,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x21,0x4d,0x00,0x02, -0x02,0x1b,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x15,0x01,0x15,0x0a,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x35,0x34,0x36,0x33,0x32, -0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x8b,0x47,0x53,0x62,0x53,0x53,0x62,0x53,0x47,0x4c,0x59,0x59,0x4b,0x26,0x2b,0x2b,0x26,0x25,0x2a,0x2a,0x0a,0x5c,0x4e,0x53,0xf3,0x02,0x26,0xeb,0x4b,0x4e,0x5c,0x5c,0x4e,0xe6,0x4e,0x5c,0x46,0x36,0x2e,0xe6,0x2e,0x36,0x36,0x2e, -0xe6,0x2e,0x36,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x0d,0x00,0x16,0x00,0x38,0x40,0x35,0x01,0x01,0x02,0x04,0x01,0x4c,0x07,0x01,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x06,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x0f,0x0e,0x00,0x00,0x12,0x10,0x0e,0x16,0x0f, -0x16,0x00,0x0d,0x00,0x0d,0x11,0x11,0x26,0x08,0x07,0x19,0x2b,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x23,0x35,0x23,0x07,0x13,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x3f,0x8d,0x3a,0x46,0x6c,0x5c,0xe8,0x5a,0x74,0x82,0x68,0x8e,0x8e,0x31,0x3b,0x3b,0xd6,0x0e,0x59,0x3d,0x50,0x5c,0xfd,0xda,0xd0,0xd0,0x01,0x1e,0xb9, -0x31,0x2c,0x2b,0x31,0x00,0x01,0x00,0x00,0xff,0x4c,0x01,0xfc,0x02,0xda,0x00,0x24,0x00,0x43,0x40,0x40,0x19,0x01,0x02,0x01,0x01,0x4c,0x06,0x01,0x04,0x07,0x01,0x03,0x08,0x04,0x03,0x67,0x00,0x08,0x00,0x01,0x02,0x08,0x01,0x69,0x00,0x05,0x05,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x09,0x61,0x0a,0x01,0x09,0x09,0x1e, -0x09,0x4e,0x00,0x00,0x00,0x24,0x00,0x23,0x24,0x11,0x11,0x11,0x11,0x11,0x13,0x25,0x21,0x0b,0x07,0x1f,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0xfa,0x25,0x3e,0x45,0x3d,0x36, -0x38,0x3f,0x5a,0x5e,0x5e,0x5a,0xa6,0xa6,0x01,0x06,0x4b,0x3f,0x53,0x60,0x78,0x65,0xb4,0x53,0x43,0x3d,0x01,0x0d,0x3b,0x41,0x46,0x40,0xfe,0xde,0x02,0x3a,0x4b,0x55,0x55,0x4b,0xb9,0x37,0x3c,0x66,0x58,0xfe,0xe9,0x61,0x72,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x21,0x02,0x26,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x04,0x01,0x01,0x05, -0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x1c,0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x35,0x23,0x35,0x33,0x35,0x21,0x15,0x21,0x15,0x33,0x15,0x23,0x15,0x96,0x64,0x64,0x01,0x8b,0xfe,0xcf,0xaf,0xaf,0xeb,0x52, -0xe9,0x52,0x97,0x52,0xeb,0x00,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x10,0x00,0x36,0x40,0x33,0x07,0x01,0x06,0x01,0x01,0x4c,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1c,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x10,0x00, -0x10,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x37,0x33,0x03,0x17,0x33,0x15,0x23,0x35,0x23,0x27,0x23,0x15,0x5c,0x5a,0x62,0xa0,0x67,0xb9,0x88,0x4c,0x50,0x31,0xa0,0x63,0x02,0x26,0xe3,0xe3,0xfe,0xfa,0xd0,0xdc,0x8c,0xf5,0xf5,0x00,0x01,0x00,0x5b,0xff,0x74,0x02,0x26,0x02,0x26,0x00,0x0f, -0x00,0x30,0x40,0x2d,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1c,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x33,0x15,0x23,0x35,0x23,0x35, -0x23,0x15,0x5b,0x5a,0xe8,0x5a,0x2f,0x50,0x39,0xe8,0x02,0x26,0xe5,0xe5,0xfe,0x2a,0xdc,0x8c,0xef,0xef,0xff,0xff,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x02,0x06,0x02,0x77,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x00,0x14,0x00,0x2f,0x40,0x2c,0x08,0x01,0x00,0x01,0x01,0x4c,0x03,0x01,0x00,0x07,0x06,0x02, -0x04,0x05,0x00,0x04,0x68,0x02,0x01,0x01,0x01,0x1c,0x4d,0x00,0x05,0x05,0x1e,0x05,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x18,0x11,0x11,0x08,0x07,0x1c,0x2b,0x17,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x23,0x35,0x7d,0x82,0xc3,0x5f,0x7c,0x0c,0x0a,0x03,0x03,0x09, -0x0b,0x79,0x5c,0xc3,0x82,0x82,0x5a,0x4b,0x4b,0x02,0x26,0xfe,0x93,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0x4b,0x69,0x69,0x00,0x00,0x00,0x01,0x00,0x49,0xff,0x74,0x02,0x1c,0x02,0x26,0x00,0x13,0x00,0x2e,0x40,0x2b,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x00,0x05,0x04,0x05,0x63,0x03,0x01,0x01,0x01,0x1c, -0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x23,0x13,0x21,0x08,0x07,0x1c,0x2b,0x21,0x35,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x01,0x95,0x93,0x55,0x64,0x5a,0x35,0x2d,0x90,0x5a,0x2d,0x50,0xbf,0x5a,0x4c,0xc1,0xc1,0x27,0x2e,0x01, -0x16,0xfe,0x2a,0xdc,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x02,0x0a,0x02,0x26,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x67,0x05,0x01,0x04,0x04,0x1c,0x4d,0x03,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x13,0x15,0x33,0x32,0x16, -0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0xbe,0x93,0x56,0x63,0x5a,0x35,0x2d,0x90,0x5a,0x02,0x26,0xbf,0x59,0x4d,0xc1,0xc1,0x27,0x2e,0xfe,0xea,0x02,0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x00,0x17,0x00,0x20,0x00,0x3e,0x40,0x3b,0x00,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x02, -0x00,0x05,0x06,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x21,0x4d,0x00,0x06,0x06,0x01,0x61,0x00,0x01,0x01,0x20,0x01,0x4e,0x01,0x00,0x1e,0x1c,0x19,0x18,0x15,0x14,0x12,0x10,0x0d,0x0c,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x07,0x16,0x2b,0x01,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x35,0x21, -0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x13,0x21,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x01,0x2c,0x62,0x76,0x76,0x62,0x41,0x61,0x36,0x01,0x58,0x45,0x3b,0x32,0x41,0x07,0x5a,0x09,0x74,0xd7,0xff,0x00,0x43,0x3d,0x3d,0x43,0x02,0x30,0x75,0x67,0x82,0x67,0x75,0x34,0x5f,0x3f,0x62,0x34,0x3d,0x47,0x27,0x21,0x45,0x51,0xfe, -0xb4,0x1c,0x41,0x47,0x47,0x41,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x00,0x02,0x49,0x03,0x09,0x02,0x26,0x02,0x15,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x46,0xff,0xf9,0x02,0x0d,0x03,0x09,0x02,0x26,0x02,0x16,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfc, -0x03,0x09,0x02,0x26,0x02,0x17,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x09,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x30,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05, -0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x21,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00,0x0d,0x01,0x0d,0x08,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14, -0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x61,0x71,0x71,0x61,0x60,0x72,0x72,0xda,0xf4,0x3f,0x3b,0x3a,0x40,0x7a,0x3b,0x3f,0xf4,0x40,0x0a,0x72,0x61,0x95,0x62,0x70,0x72,0x5f,0x96,0x61,0x72,0x01,0x45,0x23,0x3f,0x44,0x44,0x3f,0xfe,0xe7,0x44,0x40,0x27,0x27,0x40, -0x44,0x00,0x00,0x00,0xff,0xff,0x00,0x4e,0x00,0x00,0x01,0xf4,0x03,0x09,0x02,0x26,0x02,0x27,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x91,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xe3,0x00,0x00,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0x26,0x00,0x05, -0x00,0x0b,0x00,0x0f,0x00,0x38,0x40,0x35,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x04,0x02,0x02,0x00,0x00,0x3b,0x4d,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x39,0x01,0x4e,0x0c,0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x09,0x09,0x17,0x2b,0x21,0x03, -0x13,0x33,0x03,0x13,0x21,0x13,0x03,0x33,0x13,0x03,0x33,0x11,0x33,0x11,0x01,0xf7,0x97,0x87,0x53,0x86,0x9a,0xfd,0xbc,0x9a,0x86,0x53,0x87,0x97,0xa5,0x4c,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xfe,0xe5,0x01,0x1b,0x01,0x0b,0xfe,0xf4,0xfe,0xe6,0x02,0x26,0xfd,0xda,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x00,0x05, -0x00,0x09,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x3b,0x4d,0x05,0x03,0x04,0x03,0x01,0x01,0x39,0x01,0x4e,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x11,0x33,0x11,0x01,0xc2,0xf6,0xe6,0x71,0xe5,0xf9, -0xfe,0x2d,0x5a,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xfe,0xe5,0x02,0x26,0xfd,0xda,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x03,0x11,0x02,0x26,0x02,0x4b,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0x00,0x02,0x00,0x64,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x09,0x00,0x0d,0x00,0x34,0x40,0x31,0x04,0x01,0x02,0x01,0x00,0x01, -0x4c,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x3b,0x4d,0x07,0x05,0x06,0x03,0x03,0x03,0x39,0x03,0x4e,0x0a,0x0a,0x00,0x00,0x0a,0x0d,0x0a,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x11,0x12,0x12,0x08,0x09,0x19,0x2b,0x21,0x03,0x13,0x33,0x03,0x17,0x33,0x15,0x23,0x35,0x21,0x11,0x33,0x11,0x01,0xc2,0xf6,0xe6,0x71,0xe5, -0xb3,0x49,0x50,0xfe,0x7a,0x5a,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xcb,0xdc,0x8c,0x02,0x26,0xfd,0xda,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0xa7,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x00, -0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x1f,0x00,0x48,0x40,0x45,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x06,0x00,0x03,0x04,0x06,0x03,0x67,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x01,0x01,0x02,0x59,0x09,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x05,0x04,0x00,0x00,0x1a,0x18,0x16, -0x15,0x13,0x11,0x0c,0x0a,0x08,0x07,0x04,0x1f,0x05,0x1f,0x00,0x03,0x00,0x03,0x11,0x0a,0x09,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x32,0x36,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x02,0x58,0xfe,0xdc,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b, -0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x5f,0x64,0x78,0x78,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x01,0x22,0x66,0x58,0x34,0x3a,0x44,0x3e,0x97,0x3e,0x43,0x39,0x35,0x58,0x66,0x70,0x62,0x96,0x62,0x70,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x01,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x12, -0x02,0xda,0x02,0x06,0x00,0x1a,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x2b,0x02,0xda,0x02,0x06,0x01,0xcb,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x03,0x00,0x0c,0x00,0x26,0x40,0x23,0x0a,0x01,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x28,0x4d,0x00,0x02,0x02,0x01,0x60,0x03,0x01,0x01,0x01,0x29,0x01, -0x4e,0x00,0x00,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x04,0x08,0x17,0x2b,0x33,0x13,0x33,0x13,0x01,0x03,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x32,0xbe,0x79,0xbd,0xfe,0xe2,0x66,0x01,0x15,0x67,0x0d,0x12,0x05,0x04,0x13,0x02,0xda,0xfd,0x26,0x01,0xf0,0xfe,0x60,0x01,0x9f,0x34,0x5b,0x16,0x16,0x5a,0x00,0x00,0x00,0xff,0xff,0x00,0x64, -0x00,0x00,0x02,0x08,0x02,0xda,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xda,0x02,0x06,0x00,0xb1,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x02,0x06,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1b,0x00,0x1f,0x00,0x3e,0x40,0x3b, -0x00,0x04,0x08,0x01,0x05,0x02,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x1c,0x1c,0x0f,0x0e,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x09,0x08,0x16,0x2b,0x05,0x22,0x26,0x35, -0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x27,0x35,0x33,0x15,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x20,0xb4,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x6f,0x62,0xfe,0xb5,0x62,0x70,0x51,0x43,0x3e,0x01, -0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xfe,0x52,0x52,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x1b,0x40,0x18,0x00,0x00,0x00,0x28, -0x4d,0x03,0x02,0x02,0x01,0x01,0x29,0x01,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x08,0x18,0x2b,0x33,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x31,0x30,0x06,0x07,0x03,0x32,0xbe,0x79,0xbd,0x5b,0x7b,0x11,0x13,0x13,0x11,0x7a,0x02,0xda,0xfd,0x26,0x01,0xef,0x47,0x5e,0x5d,0x47,0xfe,0x10,0x00,0x00,0x00,0xff,0xff,0x00,0x48, -0x00,0x00,0x02,0x10,0x02,0xda,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x02,0x06,0x00,0x5a,0x00,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x06,0x01,0x01,0x01,0x00,0x5f,0x00, -0x00,0x00,0x28,0x4d,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x05,0x29,0x05,0x4e,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x08,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x35,0x21,0x15,0x01,0x35,0x21,0x15,0x50,0x01,0xb8,0xfe,0x66,0x01,0x7c,0xfe,0x66, -0x01,0xb8,0x02,0x88,0x52,0x52,0xfe,0xc1,0x52,0x52,0xfe,0xb7,0x52,0x52,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x02,0x06,0x00,0x60,0x00,0x00,0xff,0xff,0x00,0x5e,0x00,0x00,0x01,0xfa,0x02,0xda,0x02,0x06,0x01,0xdb,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x7a,0x00,0x00, -0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0b,0x00,0x34,0x40,0x31,0x08,0x02,0x02,0x02,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x01,0x02,0x02,0x4b,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x28,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x29,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x05,0x08, -0x19,0x2b,0x33,0x35,0x13,0x03,0x35,0x21,0x15,0x21,0x13,0x03,0x21,0x15,0x4b,0xe8,0xe8,0x01,0xdb,0xfe,0x8f,0xeb,0xec,0x01,0x72,0x50,0x01,0x23,0x01,0x17,0x50,0x50,0xfe,0xed,0xfe,0xd9,0x50,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x02,0xda,0x02,0x06,0x00,0x89,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35, -0x02,0xda,0x02,0x06,0x00,0xa8,0x00,0x00,0xff,0xff,0x00,0x2e,0xff,0xe7,0x02,0x2a,0x03,0x02,0x02,0x06,0x01,0xe1,0x00,0x00,0xff,0xff,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xa7,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0xda,0x00,0x19,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x06,0x01,0x00,0x07,0x02, -0x00,0x6a,0x05,0x03,0x02,0x01,0x01,0x28,0x4d,0x08,0x01,0x07,0x07,0x29,0x07,0x4e,0x00,0x00,0x00,0x19,0x00,0x19,0x14,0x13,0x11,0x11,0x13,0x14,0x11,0x09,0x08,0x1d,0x2b,0x33,0x35,0x22,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x11,0x33,0x11,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x15,0xff,0x3c,0x5a,0x33,0x54, -0x43,0x38,0x4e,0x38,0x43,0x54,0x32,0x5b,0x3c,0xaa,0x34,0x5d,0x3f,0x01,0x60,0xfe,0xa0,0x3d,0x45,0x01,0xe2,0xfe,0x1e,0x45,0x3d,0x01,0x60,0xfe,0xa0,0x3f,0x5d,0x34,0xaa,0x00,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x27,0x02,0xe4,0x00,0x27,0x00,0x5f,0x4b,0xb0,0x2a,0x50,0x58,0x40,0x20,0x06,0x01,0x04,0x05,0x00,0x00,0x04, -0x72,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x08,0x07,0x02,0x03,0x03,0x29,0x03,0x4e,0x1b,0x40,0x21,0x06,0x01,0x04,0x05,0x00,0x05,0x04,0x00,0x80,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x08,0x07,0x02,0x03,0x03,0x29,0x03,0x4e,0x59,0x40,0x10, -0x00,0x00,0x00,0x27,0x00,0x27,0x15,0x25,0x11,0x11,0x27,0x28,0x11,0x09,0x08,0x1d,0x2b,0x33,0x35,0x33,0x35,0x2e,0x02,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x07,0x15,0x33,0x15,0x23,0x35,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x15,0x32,0x91,0x18,0x36,0x25,0x77,0x65,0x65, -0x77,0x25,0x35,0x19,0x92,0xd3,0x28,0x32,0x47,0x3b,0x3b,0x47,0x32,0x28,0x50,0x05,0x03,0x23,0x45,0x35,0x01,0x18,0x62,0x75,0x75,0x62,0xfe,0xe8,0x35,0x44,0x23,0x03,0x06,0x50,0x6e,0x49,0x39,0x01,0x1d,0x3e,0x49,0x49,0x3e,0xfe,0xe3,0x39,0x49,0x6e,0xff,0xff,0x00,0x0a,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x01,0x00,0x00, -0x00,0x07,0x06,0xb1,0xff,0x29,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x02,0x08,0x02,0xda,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xb1,0xfe,0xac,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x01,0xfb,0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xac,0x00,0x00,0x02,0x06,0x00,0x40,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x01,0xef, -0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xac,0x00,0x00,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0xff,0xb0,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x27,0x06,0xb1,0xfe,0xcf,0x00,0x00,0x02,0x06,0x00,0x60,0x00,0x00,0xff,0xff,0xff,0x83,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xa2,0x00,0x00,0x02,0x06,0x00,0xa8,0x00,0x00, -0xff,0xff,0xff,0xb0,0x00,0x00,0x02,0x27,0x02,0xe4,0x02,0x26,0x02,0x68,0x00,0x00,0x00,0x07,0x06,0xb1,0xfe,0xcf,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb1,0x00,0x27,0x06,0x8e,0x02,0x58,0x00,0x00,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb1,0x00,0x27,0x06,0x8e,0x02,0x58, -0x00,0x00,0x02,0x06,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x4c,0x02,0x44,0x02,0xda,0x00,0x17,0x00,0x42,0x40,0x3f,0x07,0x01,0x07,0x01,0x01,0x4c,0x00,0x03,0x07,0x06,0x07,0x03,0x06,0x80,0x00,0x01,0x00,0x07,0x03,0x01,0x07,0x67,0x02,0x01,0x00,0x00,0x28,0x4d,0x09,0x08,0x02,0x06,0x06,0x29,0x4d,0x00,0x05,0x05,0x04,0x61, -0x00,0x04,0x04,0x2d,0x04,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x12,0x21,0x23,0x12,0x11,0x11,0x11,0x0a,0x08,0x1e,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x33,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x23,0x03,0x23,0x11,0x5c,0x5a,0x6c,0xa2,0x62,0xb5,0x9b,0x38,0x5f,0x5c,0x1d,0x1d,0x2d,0x38,0x25,0xaa, -0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0xcd,0x47,0x58,0x5c,0x4f,0x37,0x2e,0x01,0x51,0xfe,0xaf,0x00,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xba,0x00,0x00,0x00,0x02,0x00,0x5d,0xff,0x4c,0x02,0x44,0x02,0xda,0x00,0x10,0x00,0x14,0x00,0x40,0x40,0x3d,0x0a,0x07,0x02,0x03,0x02,0x01, -0x4c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x05,0x01,0x02,0x02,0x38,0x4d,0x08,0x06,0x02,0x01,0x01,0x39,0x4d,0x00,0x00,0x00,0x04,0x61,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x11,0x11,0x00,0x00,0x11,0x14,0x11,0x14,0x13,0x12,0x00,0x10,0x00,0x0f,0x12,0x12,0x12,0x21,0x09,0x09,0x1a,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x23,0x03, -0x13,0x33,0x03,0x13,0x33,0x15,0x14,0x06,0x23,0x25,0x11,0x33,0x11,0x01,0x6c,0x1d,0x2d,0x38,0x2f,0xf9,0xf9,0x67,0xf0,0xcb,0x43,0x5f,0x5c,0xfe,0xd4,0x5a,0xb4,0x4f,0x37,0x2e,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0xcb,0x47,0x58,0x5c,0xb4,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xf6,0x01,0xfc,0x02,0x30,0x00,0x13, -0x00,0x21,0x00,0x67,0xb6,0x10,0x0a,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x19,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x31,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x03,0x06,0x02,0x00,0x00,0x2f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x2b,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x31,0x4d,0x00,0x03, -0x03,0x29,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x59,0x40,0x17,0x15,0x14,0x01,0x00,0x1c,0x1a,0x14,0x21,0x15,0x21,0x0f,0x0e,0x0d,0x0c,0x08,0x06,0x00,0x13,0x01,0x13,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27, -0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x65,0x64,0x53,0x3e,0x50,0x07,0x03,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x42,0x42,0x0a,0x6e,0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x69,0xfd,0xda,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46,0x44,0x40,0x96,0x40,0x44,0x00,0x00, -0x00,0x02,0x00,0x5c,0xff,0x4c,0x02,0x1a,0x02,0xe4,0x00,0x1b,0x00,0x31,0x00,0x48,0x40,0x45,0x0c,0x01,0x04,0x05,0x18,0x01,0x03,0x04,0x02,0x4c,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x69,0x00,0x06,0x06,0x00,0x61,0x00,0x00,0x00,0x2e,0x4d,0x08,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2f,0x4d,0x07,0x01,0x02,0x02,0x2d,0x02,0x4e, -0x1d,0x1c,0x00,0x00,0x2c,0x2a,0x26,0x24,0x23,0x21,0x1c,0x31,0x1d,0x31,0x00,0x1b,0x00,0x1b,0x2e,0x24,0x09,0x08,0x18,0x2b,0x17,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35, -0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x5c,0x34,0x5e,0x3d,0x3d,0x5b,0x34,0x40,0x33,0x2d,0x43,0x26,0x35,0x60,0x3f,0x3c,0x4d,0x07,0x03,0x03,0x86,0x3a,0x48,0x48,0x3b,0x37,0x27,0x34,0x40,0x40,0x34,0x34,0x41,0x4b,0xb4,0x02,0xc5,0x3f,0x5f,0x35,0x2d,0x51,0x35,0x38,0x56,0x0d,0x03,0x06,0x36,0x53,0x33,0x41,0x63,0x37,0x3c, -0x34,0x7a,0xa0,0xfc,0x4f,0x3f,0x3f,0x4f,0x4c,0x3f,0x33,0x33,0x3f,0x48,0x3b,0xfe,0xc5,0x3f,0x4f,0x00,0x00,0x01,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x00,0x0e,0x00,0x23,0x40,0x20,0x0d,0x07,0x01,0x03,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x2b,0x4d,0x03,0x01,0x02,0x02,0x2d,0x02,0x4e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x18, -0x12,0x04,0x08,0x18,0x2b,0x17,0x35,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x15,0xff,0xc3,0x5f,0x7c,0x0c,0x0a,0x03,0x03,0x09,0x0b,0x79,0x5c,0xc3,0xb4,0xb4,0x02,0x26,0xfe,0x93,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0xb4,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0xda,0x00,0x16, -0x00,0x24,0x00,0x3f,0x40,0x3c,0x0c,0x01,0x01,0x03,0x01,0x4c,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x28,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1f,0x1d,0x17,0x24,0x18,0x24,0x10,0x0f,0x0e,0x0d,0x08,0x07,0x00,0x16,0x01,0x16,0x08, -0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x26,0x26,0x27,0x35,0x21,0x15,0x21,0x1e,0x02,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x61,0x77,0x31,0x58,0x3a,0x06,0x22,0x57,0x38,0x01,0x89,0xfe,0xdc,0x61,0x89,0x49,0x76,0x62,0x39,0x43,0x1b,0x23,0x3f, -0x37,0x46,0x45,0x0a,0x73,0x64,0x61,0x3f,0x5e,0x35,0x1c,0x42,0x2a,0x52,0x4b,0x43,0x78,0x86,0x59,0x82,0x7d,0x50,0x51,0x5e,0x3f,0x58,0x29,0x4b,0x3c,0x61,0x40,0x47,0x00,0x01,0x00,0x4b,0xff,0xf9,0x02,0x12,0x02,0x2d,0x00,0x2d,0x00,0x52,0x40,0x4f,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80, -0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x09,0x01,0x00,0x00,0x32,0x00,0x4e,0x02,0x00,0x2b,0x2a,0x28,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x15,0x13,0x12,0x10,0x0d,0x07,0x06,0x00,0x2d,0x02,0x2d,0x0a,0x08,0x16,0x2b, -0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x4e,0x35,0x5f,0x6f,0x42,0x3c,0x32,0x3f,0x69,0x5a,0x2f,0x56,0x66,0x01,0x5a,0x01,0x36, -0x2c,0x2f,0x2e,0x37,0x37,0x2f,0x75,0x78,0x34,0x3c,0x3c,0x34,0x35,0x31,0x39,0x5a,0x6a,0x07,0x59,0x4b,0x3c,0x4c,0x04,0x04,0x04,0x3f,0x2e,0x45,0x4a,0x4d,0x41,0x1d,0x22,0x29,0x23,0x24,0x2a,0x4e,0x2f,0x29,0x27,0x2d,0x2a,0x23,0x49,0x55,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x47,0x02,0x30,0x02,0xda,0x00,0x1e,0x00,0x18,0x40,0x15, -0x12,0x01,0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x28,0x00,0x4e,0x11,0x1e,0x02,0x08,0x18,0x2b,0x05,0x27,0x37,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x21,0x35,0x21,0x15,0x07,0x06,0x06,0x15,0x14,0x17,0x17,0x16,0x16,0x15,0x14,0x07,0x01,0xe4,0x46,0x2e,0x0a,0x22,0x84,0x65,0x62,0x62,0x6d, -0x86,0xfe,0xba,0x01,0xb3,0xba,0x5a,0x52,0x89,0x81,0x2f,0x32,0x1b,0xb9,0x2a,0x49,0x10,0x0e,0x1a,0x0b,0x26,0x1d,0x62,0x49,0x43,0x8d,0x5c,0x71,0x52,0x5a,0xa6,0x50,0x6f,0x2f,0x4d,0x28,0x25,0x0d,0x3c,0x26,0x27,0x29,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0x30,0x02,0x06,0x01,0x1b,0x00,0x00,0x00,0x03,0x00,0x58, -0xff,0xf6,0x02,0x00,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x28,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00, -0x0d,0x01,0x0d,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0xdc,0xf4,0x3f,0x3b,0x3a,0x40,0x7a,0x3b,0x3f,0xf4,0x40,0x0a,0x70,0x62,0x01,0x40, -0x62,0x70,0x6f,0x62,0xfe,0xbf,0x62,0x70,0x01,0x9d,0x75,0x40,0x42,0x42,0x40,0xfe,0x3e,0x42,0x40,0x7d,0x7d,0x40,0x42,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x26,0x02,0x26,0x00,0x0d,0x00,0x28,0x40,0x25,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x00,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x00,0x29,0x00,0x4e,0x01,0x00, -0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x05,0x08,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x9a,0x49,0x57,0xc3,0x01,0x1d,0x26,0x20,0x8c,0x55,0x46,0x01,0x39,0x52,0xfe,0x75,0x22,0x27,0x52,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x02,0x06,0x02,0x19,0x00,0x00, -0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x22,0x40,0x1f,0x09,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x28,0x4d,0x03,0x02,0x02,0x01,0x01,0x29,0x01,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x04,0x08,0x18,0x2b,0x33,0x13,0x27,0x33,0x01,0x23,0x03,0x26,0x26,0x27,0x14,0x06,0x07,0x03,0x32,0xcc, -0x4a,0x60,0x01,0x12,0x60,0x83,0x0d,0x0c,0x05,0x08,0x0c,0x7e,0x02,0x1d,0xbd,0xfd,0x26,0x01,0x65,0x23,0x36,0x0f,0x0f,0x36,0x23,0xfe,0x9b,0x00,0x00,0x01,0x00,0x5d,0xff,0x4c,0x01,0xfb,0x02,0x26,0x00,0x18,0x00,0x57,0xb5,0x0e,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x18,0x02,0x01,0x00,0x00,0x2b,0x4d,0x00,0x01, -0x01,0x03,0x61,0x04,0x01,0x03,0x03,0x29,0x4d,0x06,0x01,0x05,0x05,0x2d,0x05,0x4e,0x1b,0x40,0x1c,0x02,0x01,0x00,0x00,0x2b,0x4d,0x00,0x03,0x03,0x29,0x4d,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x2f,0x4d,0x06,0x01,0x05,0x05,0x2d,0x05,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x18,0x00,0x18,0x24,0x11,0x13,0x23,0x11,0x07,0x08,0x1b, -0x2b,0x17,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x5d,0x5a,0x3c,0x37,0x38,0x3f,0x5a,0x58,0x03,0x03,0x36,0x3e,0x3e,0x30,0x03,0x03,0x02,0xb4,0x02,0xda,0xfe,0xa2,0x3e,0x46,0x46,0x3e,0x01,0x5e,0xfd,0xda,0x69,0x35,0x3e,0x3e,0x35,0x7d,0xa0,0x00, -0xff,0xff,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0x69,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x47,0x02,0x1f,0x02,0xe4,0x00,0x2e,0x00,0x3a,0x40,0x37,0x1f,0x01,0x02,0x01,0x01,0x4c,0x14,0x13,0x02,0x02,0x49,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x80,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x05,0x01,0x00,0x00,0x03,0x61, -0x00,0x03,0x03,0x2e,0x00,0x4e,0x01,0x00,0x2c,0x2b,0x28,0x26,0x0a,0x08,0x07,0x05,0x00,0x2e,0x01,0x2e,0x06,0x08,0x16,0x2b,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x16,0x07,0x07,0x27,0x37,0x36,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33, -0x32,0x16,0x16,0x17,0x23,0x26,0x26,0x01,0x45,0x37,0x44,0x44,0x37,0x92,0x8e,0x42,0x53,0x74,0x8f,0x4a,0x1e,0x2a,0x29,0x46,0x2b,0x0e,0x0a,0x1c,0x8b,0x5e,0x5b,0x4e,0x3e,0x34,0x41,0x37,0x62,0x40,0x40,0x5e,0x36,0x02,0x5a,0x04,0x40,0x02,0x92,0x42,0x32,0x31,0x39,0x50,0x46,0x38,0x4e,0x23,0x2c,0x17,0x65,0x44,0x42,0x27,0x46,0x18, -0x24,0x09,0x2c,0x1e,0x5e,0x45,0x42,0x60,0x0b,0x03,0x0d,0x51,0x39,0x35,0x53,0x2f,0x2d,0x4e,0x33,0x29,0x33,0x00,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x02,0x06,0x01,0x22,0x00,0x00,0x00,0x01,0x00,0x19,0xff,0xfb,0x02,0x2b,0x02,0x26,0x00,0x13,0x00,0x59,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x19,0x05,0x03,0x02, -0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x2b,0x4d,0x00,0x06,0x06,0x00,0x61,0x02,0x07,0x02,0x00,0x00,0x32,0x00,0x4e,0x1b,0x40,0x1d,0x05,0x03,0x02,0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x2b,0x4d,0x00,0x02,0x02,0x29,0x4d,0x00,0x06,0x06,0x00,0x61,0x07,0x01,0x00,0x00,0x32,0x00,0x4e,0x59,0x40,0x15,0x01,0x00,0x12,0x10,0x0d,0x0c,0x0b, -0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x02,0x18,0x4c,0x5b,0xad,0x57,0x54,0x02,0x11,0x63,0x29,0x23,0x18,0x05,0x60,0x4f,0x01,0x2c,0xfe,0x2a,0x01,0xd6,0x50,0x50,0xfe,0xce,0x29,0x2c,0x54, -0x00,0x02,0x00,0x5e,0xff,0x4c,0x01,0xfe,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x38,0x40,0x35,0x0e,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x31,0x4d,0x06,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2f,0x4d,0x05,0x01,0x02,0x02,0x2d,0x02,0x4e,0x13,0x12,0x00,0x00,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11, -0x00,0x11,0x25,0x23,0x07,0x08,0x18,0x2b,0x17,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5e,0x70,0x61,0x61,0x6e,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x76,0x39,0x3d,0x3d,0x39,0x39,0x3d,0x3f,0xb4,0x02,0x18,0x5f, -0x6d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x44,0x40,0x96,0x40,0x44,0x44,0x40,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x47,0x02,0x0b,0x02,0x30,0x00,0x1f,0x00,0x1d,0x40,0x1a,0x1f,0x01,0x01,0x49,0x00,0x01,0x02,0x01,0x86,0x00,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x31,0x02,0x4e,0x22,0x12,0x2b,0x03, -0x08,0x19,0x2b,0x05,0x37,0x36,0x26,0x27,0x27,0x26,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x07,0x07,0x01,0x59,0x2b,0x0e,0x0a,0x1c,0x76,0x4a,0x52,0x77,0x64,0x5f,0x74,0x03,0x5a,0x03,0x41,0x38,0x3b,0x46,0x31,0x2b,0x7a,0x4a,0x1e,0x2a,0x29,0x92,0x46, -0x18,0x24,0x09,0x25,0x17,0x63,0x44,0x82,0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x83,0x25,0x3a,0x0e,0x26,0x17,0x65,0x44,0x42,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xf6,0x02,0x3a,0x02,0x26,0x00,0x14,0x00,0x22,0x00,0x30,0x40,0x2d,0x04,0x01,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x2b,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05, -0x01,0x00,0x00,0x2f,0x00,0x4e,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x0c,0x0b,0x0a,0x08,0x00,0x14,0x01,0x14,0x07,0x08,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x23,0x15,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01, -0x29,0x40,0x5f,0x35,0x35,0x5f,0x40,0x01,0x11,0xa9,0x32,0x3a,0x35,0x5f,0x40,0x39,0x41,0x41,0x39,0x39,0x41,0x41,0x0a,0x35,0x5e,0x3f,0x8c,0x3f,0x5f,0x34,0x52,0x03,0x04,0x43,0x36,0x8c,0x3f,0x5e,0x35,0x50,0x46,0x3c,0x8c,0x3c,0x46,0x46,0x3c,0x8c,0x3c,0x46,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08,0x02,0x26,0x00,0x0f, -0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x00,0x04,0x04,0x00,0x5f,0x05,0x01,0x00,0x00,0x29,0x00,0x4e,0x01,0x00,0x0e,0x0c,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x0f,0x01,0x0f,0x06,0x08,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x6d,0x44, -0x52,0xa8,0x01,0xd9,0xd7,0x21,0x1b,0x96,0x4f,0x42,0x01,0x43,0x52,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x26,0x02,0x06,0x01,0x51,0x00,0x00,0x00,0x02,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x2b,0x00,0x1e,0x00,0x27,0x00,0x3b,0x40,0x38,0x0b,0x01,0x01,0x06,0x01,0x4c,0x0a,0x01,0x02,0x4a, -0x00,0x06,0x06,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x05,0x01,0x01,0x01,0x00,0x61,0x03,0x01,0x00,0x00,0x29,0x4d,0x07,0x01,0x04,0x04,0x2d,0x04,0x4e,0x00,0x00,0x26,0x25,0x20,0x1f,0x00,0x1e,0x00,0x1e,0x17,0x21,0x1f,0x11,0x08,0x08,0x1a,0x2b,0x17,0x35,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x15,0x06,0x06,0x15,0x07,0x06, -0x16,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x15,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0xff,0x3b,0x5b,0x33,0x22,0x3e,0x28,0x16,0x1d,0x01,0x01,0x46,0x38,0x50,0x3c,0x5b,0x34,0x33,0x5a,0x3c,0x08,0x38,0x45,0x42,0x35,0x06,0xb4,0xb4,0x34,0x5e,0x3d,0x92,0x34,0x56,0x39,0x07,0x5f,0x05,0x3b,0x26,0x9c, -0x3a,0x49,0x01,0xdf,0x32,0x58,0x3b,0x92,0x3d,0x5e,0x34,0xb4,0xfb,0x49,0x3a,0x9c,0x36,0x44,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x17,0x00,0x2d,0x40,0x2a,0x05,0x03,0x02,0x01,0x01,0x2b,0x4d,0x04,0x01,0x02,0x02,0x00, -0x62,0x06,0x01,0x00,0x00,0x29,0x4d,0x08,0x01,0x07,0x07,0x2d,0x07,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x13,0x13,0x11,0x11,0x13,0x13,0x11,0x09,0x08,0x1d,0x2b,0x17,0x35,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x11,0x33,0x11,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x15,0xff,0x5c,0x6d,0x54,0x3e,0x3d,0x4e,0x3d,0x3e, -0x54,0x6d,0x5c,0xb4,0xb4,0x6c,0x5e,0x01,0x5c,0xfe,0xa4,0x3d,0x44,0x01,0xdd,0xfe,0x23,0x44,0x3d,0x01,0x5c,0xfe,0xa4,0x5e,0x6c,0xb4,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0xf6,0x02,0x22,0x02,0x30,0x00,0x2d,0x00,0x34,0x40,0x31,0x2a,0x01,0x01,0x02,0x01,0x4c,0x20,0x1f,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01, -0x01,0x01,0x00,0x61,0x04,0x05,0x02,0x00,0x00,0x2f,0x00,0x4e,0x01,0x00,0x28,0x26,0x19,0x17,0x14,0x13,0x10,0x0e,0x00,0x2d,0x01,0x2d,0x06,0x08,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x27,0x35,0x16, -0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0xb5,0x3a,0x45,0x4c,0x41,0x19,0x1f,0x22,0x1c,0x1c,0x20,0x4e,0x20,0x1c,0x1d,0x21,0x21,0x1c,0x44,0x4e,0x44,0x3b,0x31,0x41,0x05,0x02,0x04,0x40,0x0a,0x5c,0x4f,0xbb,0x57,0x73,0x0a,0x5f,0x05,0x3c,0x2e,0xc7,0x29,0x30,0x30,0x29,0xbe,0xbe,0x29,0x30,0x30,0x29,0xc7,0x2b, -0x39,0x06,0x5f,0x0a,0x70,0x55,0xbb,0x4f,0x5c,0x3f,0x35,0x35,0x3f,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x11,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x06,0x06,0xb0,0x19,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x09,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x53,0x00,0x00, -0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x84,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x06,0x06,0xb2,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x06,0x06,0xb0,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x51,0x00,0x00, -0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x84,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x06,0x06,0xb2,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x06,0x06,0xb0,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0xf6,0x02,0x22, -0x03,0x11,0x02,0x26,0x02,0x8d,0x00,0x00,0x00,0x06,0x06,0xb0,0x14,0x00,0x00,0x00,0x00,0x03,0x00,0x55,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x03,0x00,0x17,0x00,0x25,0x00,0x84,0xb6,0x14,0x0e,0x02,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x00,0x01,0x00,0x85,0x08,0x01,0x01,0x03,0x01,0x85,0x00,0x07,0x07,0x03, -0x61,0x04,0x01,0x03,0x03,0x31,0x4d,0x0a,0x01,0x06,0x06,0x02,0x61,0x05,0x09,0x02,0x02,0x02,0x2f,0x02,0x4e,0x1b,0x40,0x2c,0x00,0x00,0x01,0x00,0x85,0x08,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x04,0x2b,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x31,0x4d,0x00,0x05,0x05,0x29,0x4d,0x0a,0x01,0x06,0x06,0x02,0x61,0x09,0x01,0x02, -0x02,0x2f,0x02,0x4e,0x59,0x40,0x1e,0x19,0x18,0x05,0x04,0x00,0x00,0x20,0x1e,0x18,0x25,0x19,0x25,0x13,0x12,0x11,0x10,0x0c,0x0a,0x04,0x17,0x05,0x17,0x00,0x03,0x00,0x03,0x11,0x0b,0x08,0x17,0x2b,0x13,0x37,0x33,0x07,0x03,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32, -0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xea,0x6a,0x64,0x6f,0x3d,0x52,0x65,0x64,0x53,0x3e,0x50,0x07,0x03,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x42,0x42,0x02,0x85,0x8c,0x8c,0xfd,0x71,0x6e,0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x69,0xfd,0xda,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46, -0x44,0x40,0x96,0x40,0x44,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0xff,0xf9,0x02,0x12,0x03,0x11,0x00,0x2d,0x00,0x31,0x01,0x43,0x4b,0xb0,0x13,0x50,0x58,0x40,0x40,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04,0x03,0x72,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07, -0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x4b,0xb0,0x14,0x50,0x58,0x40,0x41,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01, -0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x40,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04, -0x03,0x72,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x40,0x41,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03, -0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x59,0x59,0x59,0x40,0x21,0x2e,0x2e,0x02,0x00,0x2e,0x31,0x2e, -0x31,0x30,0x2f,0x2b,0x2a,0x28,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x15,0x13,0x12,0x10,0x0d,0x07,0x06,0x00,0x2d,0x02,0x2d,0x0d,0x08,0x16,0x2b,0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14, -0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x03,0x37,0x33,0x07,0x01,0x4e,0x35,0x5f,0x6f,0x42,0x3c,0x32,0x3f,0x69,0x5a,0x2f,0x56,0x66,0x01,0x5a,0x01,0x36,0x2c,0x2f,0x2e,0x37,0x37,0x2f,0x75,0x78,0x34,0x3c,0x3c,0x34,0x35,0x31,0x39,0x5a,0x6a,0xb8,0x6a,0x64,0x6f,0x07,0x59,0x4b,0x3c,0x4c,0x04,0x04,0x04,0x3f,0x2e,0x45,0x4a, -0x4d,0x41,0x1d,0x22,0x29,0x23,0x24,0x2a,0x4e,0x2f,0x29,0x27,0x2d,0x2a,0x23,0x49,0x55,0x02,0x8c,0x8c,0x8c,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x06,0x06,0xb0,0x23,0x00,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x4c,0x02,0x26,0x02,0x26,0x00,0x1a,0x00,0x39,0x40,0x36, -0x19,0x06,0x02,0x02,0x00,0x01,0x4c,0x00,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x01,0x01,0x00,0x00,0x2b,0x4d,0x07,0x06,0x02,0x05,0x05,0x29,0x4d,0x00,0x04,0x04,0x03,0x61,0x00,0x03,0x03,0x2d,0x03,0x4e,0x00,0x00,0x00,0x1a,0x00,0x1a,0x12,0x21,0x23,0x11,0x15,0x11,0x08,0x08,0x1c,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x07,0x13,0x33, -0x11,0x33,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x23,0x11,0x34,0x36,0x37,0x03,0x5c,0x56,0x03,0x08,0xe5,0x70,0x2a,0x5f,0x5c,0x1d,0x1d,0x2d,0x38,0x2a,0x03,0x08,0xe5,0x02,0x26,0xfe,0xd8,0x2b,0x5c,0x1d,0x01,0xcc,0xfe,0x21,0x47,0x58,0x5c,0x4f,0x37,0x2e,0x01,0x29,0x2c,0x5c,0x1d,0xfe,0x32,0x00,0xff,0xff,0x00,0x30, -0xff,0x4c,0x02,0x28,0x02,0xda,0x02,0x06,0x02,0x25,0x00,0x00,0x00,0x02,0x00,0x0f,0xff,0xf6,0x02,0x49,0x02,0x26,0x00,0x18,0x00,0x2c,0x00,0x49,0x40,0x46,0x16,0x01,0x05,0x06,0x01,0x4c,0x00,0x06,0x01,0x05,0x01,0x06,0x05,0x80,0x08,0x03,0x02,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x07,0x0a,0x02,0x05,0x05,0x00,0x61,0x04, -0x09,0x02,0x00,0x00,0x2f,0x00,0x4e,0x1a,0x19,0x01,0x00,0x29,0x26,0x23,0x21,0x1e,0x1d,0x19,0x2c,0x1a,0x2c,0x14,0x12,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x00,0x18,0x01,0x18,0x0b,0x08,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x23,0x35,0x21,0x15,0x23,0x16,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x27,0x32, -0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x23,0x23,0x22,0x15,0x15,0x14,0xb5,0x3a,0x44,0x27,0x24,0x73,0x02,0x3a,0x73,0x24,0x27,0x43,0x3b,0x31,0x3e,0x08,0x07,0x3e,0x1e,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x3d,0xc6,0x3d,0x0a,0x56,0x4b,0xbc,0x2e,0x42,0x11,0x52,0x52,0x11,0x42,0x2e,0xbc,0x4b,0x56,0x39,0x32,0x32, -0x39,0x4c,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xea,0x54,0x54,0xea,0x54,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x02,0x06,0x02,0x4b,0x00,0x00,0x00,0x01,0x00,0x1a,0xff,0x4c,0x02,0x21,0x02,0x2a,0x00,0x15,0x00,0x29,0x40,0x26,0x14,0x0e,0x01,0x03,0x03,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x61,0x02,0x01,0x01, -0x01,0x3b,0x4d,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x00,0x15,0x00,0x15,0x1a,0x21,0x23,0x05,0x09,0x19,0x2b,0x05,0x35,0x03,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x15,0x01,0x09,0x8b,0x11,0x35,0x1e,0x1e,0x3a,0x51,0x10,0x4e,0x0b,0x09,0x03,0x03,0x0b,0x0b,0x74,0x5c, -0xbe,0xb4,0xb4,0x01,0xa7,0x31,0x52,0x36,0x35,0xfe,0xfa,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0xb4,0x00,0x00,0x00,0x01,0x00,0x2f,0xff,0xfb,0x02,0x44,0x02,0xdf,0x00,0x1a,0x00,0x59,0xb6,0x0d,0x07,0x02,0x04,0x02,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x17,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00, -0x04,0x04,0x00,0x61,0x01,0x05,0x02,0x00,0x00,0x42,0x00,0x4e,0x1b,0x40,0x1b,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00,0x01,0x01,0x39,0x4d,0x00,0x04,0x04,0x00,0x61,0x05,0x01,0x00,0x00,0x42,0x00,0x4e,0x59,0x40,0x11,0x01,0x00,0x19,0x17,0x14,0x12,0x11,0x0f,0x0c,0x0b,0x00,0x1a,0x01,0x1a,0x06,0x09,0x16,0x2b,0x05, -0x22,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x23,0x13,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x17,0x13,0x16,0x33,0x33,0x15,0x02,0x1c,0x3a,0x50,0x11,0x48,0x07,0x0b,0x03,0x03,0x0c,0x08,0x7d,0x61,0xca,0x23,0x12,0x30,0x3c,0x4b,0x66,0x24,0xa9,0x11,0x35,0x28,0x05,0x37,0x34,0xea,0x19,0x2b,0x10,0x10,0x2c,0x14,0xfe,0xac, -0x02,0x04,0x5b,0x2d,0x53,0x6a,0xfe,0x09,0x31,0x52,0x00,0x00,0x00,0x03,0x00,0x2e,0x00,0x00,0x02,0x2a,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x14,0x00,0x3a,0x40,0x37,0x11,0x01,0x06,0x05,0x01,0x4c,0x00,0x06,0x00,0x02,0x04,0x06,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x01,0x5f,0x07,0x03,0x02, -0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x33,0x13,0x33,0x13,0x23,0x27,0x23,0x07,0x25,0x33,0x03,0x23,0x03,0x33,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x2e,0xaa,0xa8,0xaa,0x98,0x32,0xd4,0x32,0x01,0x5c,0x3e,0x98,0x3d,0x8a,0xc1,0x43,0x0c,0x0e,0x02, -0x02,0x10,0x0c,0x02,0xda,0xfd,0x26,0xd5,0xd5,0x28,0x02,0x8a,0xfe,0x4b,0x01,0x29,0x37,0x46,0x0d,0x0b,0x49,0x36,0x00,0x00,0x00,0x06,0x00,0x4b,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x0e,0x00,0x12,0x00,0x1c,0x00,0x23,0x00,0x2b,0x00,0x32,0x00,0x4d,0x40,0x4a,0x23,0x1d,0x18,0x17,0x04,0x04,0x03,0x08,0x01,0x07,0x04,0x32,0x2c,0x28, -0x27,0x04,0x02,0x07,0x03,0x4c,0x00,0x04,0x00,0x07,0x02,0x04,0x07,0x67,0x05,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x2b,0x29,0x26,0x24,0x1c,0x1a,0x15,0x13,0x12,0x11,0x10,0x0f,0x00,0x0e,0x00,0x0d,0x21,0x09,0x09,0x17,0x2b,0x33,0x11,0x33, -0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x4b,0xf2,0x5c,0x6c,0x3c,0x35,0x3e,0x45,0x74,0x63,0xcb,0x3c,0x3c,0x66,0x67,0x0d, -0x18,0x0a,0x0a,0x18,0x0d,0x67,0xbf,0x1f,0x22,0x22,0x1f,0xbf,0x6a,0x19,0x13,0x13,0x19,0x6a,0xbf,0x27,0x2c,0x2c,0x27,0x02,0xda,0x64,0x56,0x43,0x58,0x0e,0x0d,0x5c,0x47,0x5b,0x6c,0x28,0x02,0x8a,0xfe,0xd9,0x03,0x02,0x01,0x1d,0x02,0x03,0xfe,0xef,0x12,0x41,0x2b,0x2b,0x40,0x12,0xfd,0x8c,0x04,0x01,0x33,0x04,0xfe,0xd6,0x13,0x48, -0x32,0x32,0x47,0x13,0x00,0x02,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x19,0x00,0x21,0x00,0x4a,0x40,0x47,0x1b,0x10,0x02,0x02,0x03,0x1a,0x11,0x02,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00, -0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x04,0x00,0x51,0x01,0x00,0x17,0x16,0x14,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x19,0x01,0x19,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16, -0x01,0x2c,0x67,0x7b,0x7b,0x67,0x69,0x79,0x2a,0x62,0x56,0x2e,0x24,0x24,0x2e,0x56,0x62,0x2a,0x79,0xe5,0x1c,0x20,0x20,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0x53,0x61,0x0f,0xfd,0x80,0x0f,0x61,0x53,0x65,0x77,0x4f,0x02,0x50,0x18,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x00,0x04,0x00,0x4b,0x00,0x00,0x02,0x0e,0x02,0xda,0x00,0x09, -0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x36,0x40,0x33,0x1f,0x18,0x13,0x12,0x04,0x02,0x03,0x01,0x4c,0x05,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x04,0x01,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x17,0x15,0x10,0x0e,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x08,0x21,0x07,0x09,0x17,0x2b,0x33,0x11, -0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x4b,0xdb,0x6b,0x7d,0x7d,0x6b,0xb1,0x3c,0x3c,0x66,0x4b,0x19,0x2c,0x13,0x13,0x2c,0x19,0x4b,0xcd,0x1d,0x1f,0x1f,0x1d,0x02,0xda,0x77,0x65,0xfe,0xde,0x65,0x77,0x28,0x02,0x8a, -0xfd,0x76,0x09,0x07,0x02,0x6a,0x08,0x08,0xfd,0x9f,0x17,0x47,0x2d,0x01,0x22,0x2d,0x47,0x17,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x35,0x40,0x32,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x04,0x04,0x05,0x5f,0x08, -0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1b,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x25,0x33,0x11,0x23,0x55,0x01,0xbd,0xfe,0xd5,0x01,0x08,0xfe,0xf8,0x01,0x2b,0xfe,0x6e,0x3c,0x3c,0x02,0xda,0x28,0xfe,0xdf,0x28,0xfe,0xbf, -0x28,0x28,0x02,0x8a,0x00,0x02,0x00,0x5a,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x09,0x00,0x0d,0x00,0x33,0x40,0x30,0x00,0x02,0x00,0x03,0x05,0x02,0x03,0x67,0x06,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x04,0x5f,0x07,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x09,0x11, -0x11,0x11,0x11,0x08,0x09,0x1a,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x27,0x33,0x11,0x23,0x5a,0x01,0xbd,0xfe,0xd5,0x01,0x08,0xfe,0xf8,0x67,0x3c,0x3c,0x02,0xda,0x28,0xfe,0xdf,0x28,0xfe,0x97,0x28,0x02,0x8a,0x00,0x03,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x1c,0x00,0x24,0x00,0x2a,0x00,0x4f,0x40,0x4c, -0x1e,0x10,0x02,0x02,0x03,0x25,0x1d,0x15,0x11,0x04,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x06,0x03,0x02,0x06,0x80,0x00,0x06,0x07,0x01,0x05,0x04,0x06,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x2a,0x29,0x19,0x18,0x17,0x16,0x14,0x12,0x0f, -0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1c,0x01,0x1c,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x33,0x15,0x14,0x06,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x35,0x23,0x01,0x2c,0x67,0x7b,0x7b,0x67,0x69,0x79, -0x2a,0x62,0x56,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x50,0xe0,0x7a,0xe4,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x3c,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0x53,0x61,0x0f,0xfd,0x80,0x0f,0x0f,0x01,0x1d,0x28,0xa0,0x65,0x77,0x4f,0x02,0x50,0x18,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x18,0x18,0x47,0x2e,0x78,0x00,0x00,0x00,0x03,0x00,0x4b, -0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x3f,0x40,0x3c,0x02,0x01,0x00,0x09,0x01,0x07,0x01,0x00,0x07,0x67,0x00,0x01,0x00,0x04,0x06,0x01,0x04,0x67,0x08,0x01,0x06,0x03,0x03,0x06,0x57,0x08,0x01,0x06,0x06,0x03,0x5f,0x0a,0x05,0x02,0x03,0x06,0x03,0x4f,0x00,0x00,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c, -0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x23,0x4b,0x90,0xa2,0x90,0x90,0xa2,0x66,0x3c,0x3c,0x01,0x32,0x3c,0x3c,0x02,0xda,0xfe,0xb5,0x01,0x4b,0xfd,0x26,0x01,0x67,0xfe,0x99,0x28,0x02,0x8a,0xfd,0x76,0x02, -0x8a,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x07,0x03,0x02,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x06,0x04,0x02,0x00,0x00,0x05,0x5f,0x08,0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09, -0x09,0x1b,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x27,0x33,0x11,0x23,0x50,0x95,0x95,0x01,0xb8,0x93,0x93,0xf9,0x3c,0x3c,0x28,0x02,0x8a,0x28,0x28,0xfd,0x76,0x28,0x28,0x02,0x8a,0x00,0x02,0x00,0x1b,0xff,0xf6,0x02,0x49,0x02,0xda,0x00,0x12,0x00,0x18,0x00,0x3f,0x40,0x3c,0x13,0x09,0x02,0x02,0x01,0x01, -0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x06,0x05,0x02,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x18,0x17,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x12,0x01,0x12,0x08,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32, -0x37,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x06,0x37,0x36,0x36,0x35,0x11,0x23,0xff,0x69,0x7b,0x2a,0x65,0x55,0x30,0x24,0xa1,0x01,0x97,0x66,0x7b,0x15,0x1d,0x1f,0x3c,0x0a,0x77,0x65,0x53,0x61,0x0f,0x02,0x85,0x28,0x28,0xfe,0x20,0x65,0x77,0x50,0x17,0x47,0x2e,0x01,0xe0,0x00,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x45, -0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x43,0x40,0x40,0x13,0x07,0x02,0x01,0x07,0x14,0x01,0x04,0x01,0x02,0x4c,0x00,0x01,0x00,0x04,0x06,0x01,0x04,0x67,0x00,0x07,0x07,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x4d,0x08,0x01,0x06,0x06,0x03,0x60,0x09,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x0e,0x0d, -0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x07,0x13,0x23,0x03,0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x03,0x07,0x4b,0x90,0x3a,0xe3,0x33,0xa1,0xbb,0xa0,0x7e,0x4c,0x66,0x3c,0x3c,0x01,0x50,0x42,0x99,0x29,0x02,0xda,0xfe,0xad,0x01,0x53,0xf0,0xfe,0x16,0x01,0x5f,0xfe, -0xa1,0x28,0x02,0x8a,0xfd,0x76,0x01,0x98,0x3d,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x29,0x40,0x26,0x00,0x04,0x04,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x03,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x09,0x08,0x07,0x06,0x00,0x05,0x00,0x05,0x11, -0x11,0x06,0x09,0x18,0x2b,0x33,0x11,0x33,0x11,0x21,0x15,0x25,0x33,0x11,0x23,0x64,0x90,0x01,0x32,0xfe,0x68,0x3c,0x3c,0x02,0xda,0xfd,0x4e,0x28,0x28,0x02,0x8a,0x00,0x00,0x03,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x1c,0x00,0x43,0x40,0x40,0x0f,0x0c,0x02,0x05,0x00,0x16,0x03,0x02,0x03,0x05,0x02,0x4c, -0x00,0x03,0x05,0x06,0x05,0x03,0x06,0x80,0x07,0x01,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x00,0x14,0x00,0x14,0x16,0x11,0x12,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x17,0x37,0x33,0x11,0x23,0x11,0x34,0x36, -0x36,0x37,0x03,0x23,0x03,0x1e,0x02,0x15,0x11,0x13,0x37,0x27,0x23,0x01,0x33,0x11,0x23,0x32,0xad,0x50,0x4f,0xa8,0x90,0x02,0x02,0x01,0x88,0x32,0x8b,0x02,0x02,0x02,0x9f,0x20,0x57,0x40,0x01,0x3c,0x3c,0x3c,0x02,0xda,0xdf,0xdf,0xfd,0x26,0x01,0xb8,0x33,0x65,0x56,0x1b,0xfe,0x84,0x01,0x7c,0x1b,0x56,0x65,0x33,0xfe,0x48,0x01,0x68, -0x59,0xf1,0xfd,0x76,0x02,0x8a,0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x01,0xf9,0x02,0xda,0x00,0x0f,0x00,0x13,0x00,0x35,0x40,0x32,0x0b,0x03,0x02,0x04,0x05,0x01,0x4c,0x01,0x01,0x00,0x00,0x05,0x04,0x00,0x05,0x67,0x00,0x04,0x02,0x02,0x04,0x57,0x00,0x04,0x04,0x02,0x5f,0x06,0x03,0x02,0x02,0x04,0x02,0x4f,0x00,0x00,0x13,0x12, -0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x15,0x11,0x07,0x06,0x19,0x2b,0x33,0x11,0x33,0x13,0x26,0x26,0x35,0x11,0x33,0x11,0x23,0x03,0x16,0x16,0x15,0x11,0x25,0x33,0x01,0x23,0x5f,0x7c,0xf9,0x03,0x02,0x2a,0x7e,0xf7,0x02,0x02,0x01,0x10,0x43,0xfe,0xe4,0x42,0x02,0xda,0xfd,0xc7,0x20,0x50,0x1b,0x01,0xae,0xfd,0x26,0x02,0x3a,0x21,0x4f, -0x1c,0xfe,0x52,0x27,0x02,0x8c,0x00,0x00,0x00,0x04,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x3a,0x40,0x37,0x27,0x20,0x19,0x18,0x16,0x15,0x11,0x10,0x08,0x02,0x03,0x01,0x4c,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f, -0x00,0x4e,0x0f,0x0e,0x01,0x00,0x14,0x12,0x0e,0x17,0x0f,0x17,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x2c, -0x68,0x7a,0x7a,0x68,0x68,0x7a,0x7a,0x68,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x4e,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x1f,0x1d,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0xfe,0xca,0x65,0x77,0x28,0x0f,0x02,0x80,0x0f,0x0f,0xfd,0x80,0x0f,0x27,0x02,0x50,0x17,0x48,0x2e,0xfe,0xca,0x2e,0x48,0x17,0x17,0x48,0x2e,0x01,0x36,0x2e, -0x48,0x17,0x00,0x00,0x00,0x04,0x00,0x4b,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x16,0x00,0x1b,0x00,0x41,0x40,0x3e,0x1b,0x17,0x13,0x12,0x04,0x05,0x04,0x01,0x4c,0x00,0x00,0x06,0x01,0x04,0x05,0x00,0x04,0x67,0x00,0x05,0x00,0x01,0x03,0x05,0x01,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x07, -0x01,0x02,0x03,0x02,0x4f,0x00,0x00,0x16,0x14,0x11,0x0f,0x0e,0x0d,0x0c,0x0b,0x00,0x0a,0x00,0x0a,0x24,0x21,0x08,0x06,0x18,0x2b,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x13,0x36,0x35,0x34,0x27,0x4b,0x01,0x09,0x60,0x72,0x73,0x5f,0x79,0x66,0x3c,0x3c, -0x66,0x79,0x1e,0x16,0x16,0x1e,0x79,0xd7,0x42,0x42,0x02,0xda,0x6e,0x5c,0x5c,0x6e,0xfe,0xba,0x28,0x02,0x8a,0xfe,0xbc,0x07,0x01,0x36,0x07,0xfe,0xd6,0x2c,0x5c,0x5e,0x2a,0x00,0x00,0x00,0x00,0x04,0x00,0x4a,0xff,0x4c,0x02,0x0e,0x02,0xe4,0x00,0x12,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x47,0x40,0x44,0x2c,0x25,0x1e,0x1d,0x1b,0x1a, -0x16,0x15,0x08,0x03,0x04,0x11,0x01,0x00,0x03,0x02,0x4c,0x05,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x00,0x00,0x03,0x00,0x51,0x14,0x13,0x00,0x00,0x19,0x17,0x13,0x1c,0x14,0x1c,0x00,0x12,0x00,0x12,0x25,0x22,0x07,0x06,0x18,0x2b,0x05, -0x27,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x17,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0xc1,0x6a,0x13,0x18,0x67,0x7b,0x7b,0x67,0x67,0x7b,0x43,0x3e,0x71,0xd2,0x2e,0x24,0x24,0x2e,0x2e, -0x24,0x24,0x4e,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x1f,0x1d,0xb4,0xad,0x03,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0xfe,0xca,0x4b,0x6a,0x17,0xba,0xd2,0x0f,0x02,0x80,0x0f,0x0f,0xfd,0x80,0x0f,0x28,0x02,0x4e,0x17,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x17,0x17,0x47,0x2e,0x01,0x36,0x2e,0x47,0x17,0x00,0x00,0x00,0x00,0x05,0x00,0x4b, -0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0d,0x00,0x11,0x00,0x19,0x00,0x20,0x00,0x26,0x00,0x4e,0x40,0x4b,0x1e,0x1d,0x16,0x15,0x04,0x06,0x05,0x08,0x01,0x02,0x06,0x02,0x4c,0x00,0x00,0x07,0x01,0x05,0x06,0x00,0x05,0x67,0x00,0x06,0x09,0x01,0x02,0x04,0x06,0x02,0x69,0x08,0x01,0x04,0x01,0x01,0x04,0x57,0x08,0x01,0x04,0x04,0x01,0x5f, -0x0a,0x03,0x02,0x01,0x04,0x01,0x4f,0x00,0x00,0x26,0x24,0x22,0x21,0x19,0x17,0x14,0x12,0x11,0x10,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x16,0x21,0x0b,0x06,0x19,0x2b,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x13,0x23,0x03,0x23,0x11,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x05,0x34,0x26,0x27,0x11,0x36, -0x36,0x03,0x33,0x03,0x06,0x23,0x23,0x4b,0x01,0x04,0x60,0x72,0x4e,0x44,0xab,0xa7,0x9e,0x1a,0x66,0x3c,0x3c,0x66,0x74,0x1e,0x1a,0x1a,0x1e,0x74,0x01,0x1c,0x25,0x21,0x20,0x26,0x46,0x43,0x8f,0x0b,0x0b,0x2d,0x02,0xda,0x6e,0x5c,0x4c,0x66,0x11,0xfe,0xb3,0x01,0x46,0xfe,0xba,0x28,0x02,0x8a,0xfe,0xbc,0x08,0x01,0x34,0x08,0xa2,0x2d, -0x45,0x15,0xfe,0xf2,0x15,0x46,0xfe,0x44,0x01,0x1f,0x01,0x00,0x00,0x02,0x00,0x41,0xff,0xf6,0x02,0x17,0x02,0xe4,0x00,0x27,0x00,0x41,0x00,0x3a,0x40,0x37,0x3f,0x01,0x03,0x04,0x32,0x01,0x01,0x00,0x02,0x4c,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x00,0x01,0x04,0x00,0x01,0x7e,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e, -0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x2b,0x22,0x12,0x2b,0x22,0x10,0x06,0x09,0x1c,0x2b,0x37,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x13,0x14, -0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x06,0x06,0x41,0x2a,0x61,0x52,0x3a,0x44,0x31,0x2b,0x6d,0x3e,0x49,0x81,0x6d,0x5c,0x6b,0x2a,0x57,0x4a,0x37,0x40,0x32,0x2b,0x6e,0x41,0x4c,0x86,0x73,0x66,0x77,0x35,0x3b,0x33,0x6d,0x36,0x3f,0x23,0x1f,0x31,0x39,0x3f, -0x35,0x6c,0x38,0x41,0x27,0x20,0x2f,0x37,0xc0,0x4a,0x57,0x4c,0x40,0x24,0x40,0x13,0x31,0x1c,0x67,0x3d,0x60,0x71,0x65,0x56,0x44,0x4f,0x3f,0x36,0x1f,0x39,0x13,0x31,0x1d,0x72,0x46,0x67,0x79,0x6d,0x01,0xb5,0x31,0x55,0x17,0x32,0x19,0x53,0x2f,0x2b,0x4a,0x14,0x12,0x5e,0x3e,0x3a,0x5f,0x17,0x30,0x19,0x4e,0x2a,0x29,0x3d,0x0b,0x0b, -0x54,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x2b,0x40,0x28,0x05,0x02,0x02,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x07,0x09,0x19,0x2b,0x33, -0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x27,0x33,0x11,0x23,0xe5,0xb3,0x01,0xf4,0xb1,0x66,0x3c,0x3c,0x02,0xb2,0x28,0x28,0xfd,0x4e,0x28,0x02,0x8a,0x00,0x02,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xda,0x00,0x10,0x00,0x16,0x00,0x32,0x40,0x2f,0x11,0x06,0x02,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d, -0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x13,0x12,0x0d,0x0c,0x09,0x07,0x05,0x04,0x00,0x10,0x01,0x10,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x27,0x11,0x23,0x11,0x14,0x16,0x01,0x2c,0x67,0x7b,0x90,0x24,0x2e,0x56,0x62,0x2a,0x7a, -0xe4,0x3c,0x20,0x0a,0x77,0x65,0x02,0x08,0xfd,0x53,0x0f,0x61,0x53,0x02,0x08,0xfd,0xf8,0x65,0x77,0x4f,0x02,0x6d,0xfe,0x20,0x2e,0x47,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x02,0x2a,0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x2f,0x40,0x2c,0x06,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00, -0x03,0x03,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x18,0x11,0x06,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x27,0x33,0x03,0x23,0xdd,0xaf,0x98,0x7f,0x0d,0x0e,0x01,0x02,0x0f,0x0d,0x7f,0x2c,0xaf,0x7b,0x3d,0x9a,0x3e,0x02,0xda,0xfd, -0xe4,0x37,0x42,0x11,0x11,0x43,0x36,0x02,0x1c,0xfd,0x26,0x28,0x02,0x8a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x1f,0x00,0x23,0x00,0x2d,0x00,0x3a,0x40,0x37,0x2d,0x29,0x1a,0x0f,0x06,0x05,0x05,0x06,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x02,0x01,0x02,0x00,0x00,0x38,0x4d,0x07,0x01,0x05,0x05,0x03,0x60, -0x08,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x11,0x18,0x18,0x11,0x09,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x27,0x26,0x26,0x35,0x23,0x06,0x06,0x07,0x07,0x27,0x33,0x03,0x23, -0x01,0x33,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x59,0x59,0x92,0x45,0x04,0x01,0x03,0x05,0x04,0x04,0x56,0x38,0x5f,0x05,0x04,0x03,0x04,0x02,0x03,0x40,0x2a,0x5d,0x8e,0x28,0x08,0x0d,0x02,0x02,0x0b,0x08,0x30,0x69,0x3c,0x51,0x3c,0x01,0x5f,0x3e,0x59,0x07,0x09,0x04,0x04,0x0b,0x05,0x08,0x02,0xda,0xfd,0xe4,0x1b,0x25,0x22,0x22, -0x25,0x1b,0x02,0x1c,0xfd,0xe4,0x1b,0x25,0x22,0x22,0x25,0x1b,0x02,0x1c,0xfd,0x26,0xd5,0x2e,0x65,0x21,0x28,0x66,0x26,0xd5,0x27,0x02,0x8c,0xfd,0x74,0x01,0xeb,0x27,0x46,0x1e,0x1c,0x48,0x27,0x3b,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x34,0x40,0x31,0x0a,0x07,0x04,0x01,0x04,0x04, -0x05,0x01,0x4c,0x00,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x02,0x60,0x06,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x07,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x13,0x13,0x33,0x03,0x13,0x23,0x03,0x03,0x25,0x33,0x01,0x23,0x22,0xcb,0xcf,0xa9, -0x85,0xa2,0x31,0xbd,0xd8,0xa9,0x8e,0xb1,0x01,0x5c,0x46,0xfe,0xb6,0x45,0x01,0x43,0x01,0x97,0xfe,0xfb,0x01,0x05,0xfe,0xcf,0xfe,0x57,0x01,0x17,0xfe,0xe9,0x28,0x02,0x8a,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x0e,0x00,0x14,0x00,0x33,0x40,0x30,0x14,0x11,0x0d,0x07,0x01,0x05,0x03,0x04,0x01,0x4c, -0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x13,0x12,0x10,0x0f,0x00,0x0e,0x00,0x0e,0x18,0x12,0x06,0x09,0x18,0x2b,0x33,0x11,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x11,0x27,0x33,0x35,0x03,0x23,0x13,0xe6,0xd2,0xa2,0x92, -0x0a,0x0f,0x03,0x03,0x12,0x0a,0x92,0x2f,0xce,0x66,0x3c,0xb4,0x42,0xba,0x01,0x04,0x01,0xd6,0xfe,0xba,0x16,0x2a,0x0a,0x0b,0x2c,0x16,0x01,0x43,0xfe,0x45,0xfe,0xe1,0x28,0xf7,0x01,0x93,0xfe,0x60,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x09,0x00,0x0d,0x00,0x3c,0x40,0x39,0x06,0x01,0x02,0x02,0x00,0x01, -0x4c,0x00,0x01,0x04,0x01,0x00,0x02,0x01,0x00,0x67,0x07,0x05,0x02,0x02,0x03,0x03,0x02,0x57,0x07,0x05,0x02,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x0a,0x0a,0x00,0x00,0x0a,0x0d,0x0a,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x12,0x11,0x12,0x08,0x06,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x25,0x01, -0x23,0x01,0x46,0x01,0x2e,0xfe,0xdc,0x01,0xbd,0xfe,0xd2,0x01,0x33,0xfe,0xa0,0x01,0x30,0x41,0xfe,0xd0,0x2c,0x02,0x86,0x28,0x2c,0xfd,0x7a,0x28,0x28,0x02,0x8a,0xfd,0x76,0x00,0x00,0x00,0x00,0x04,0x00,0x36,0xff,0xf6,0x02,0x10,0x02,0x30,0x00,0x1a,0x00,0x23,0x00,0x2d,0x00,0x32,0x00,0xb2,0x4b,0xb0,0x18,0x50,0x58,0x40,0x11,0x20, -0x01,0x02,0x04,0x2f,0x2e,0x2b,0x18,0x04,0x06,0x08,0x2c,0x01,0x00,0x06,0x03,0x4c,0x1b,0x40,0x11,0x20,0x01,0x02,0x04,0x2f,0x2e,0x2b,0x18,0x04,0x06,0x08,0x2c,0x01,0x07,0x06,0x03,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x29,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x06,0x01,0x08,0x67,0x00,0x02,0x02,0x04, -0x61,0x00,0x04,0x04,0x41,0x4d,0x0a,0x07,0x02,0x06,0x06,0x00,0x61,0x05,0x09,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x31,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x06,0x01,0x08,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x06,0x06,0x05,0x5f,0x00,0x05,0x05,0x39,0x4d,0x0a,0x01,0x07,0x07, -0x00,0x61,0x09,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1d,0x25,0x24,0x01,0x00,0x2a,0x28,0x24,0x2d,0x25,0x2d,0x1c,0x1b,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x1a,0x01,0x1a,0x0b,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15, -0x11,0x23,0x35,0x06,0x06,0x37,0x33,0x11,0x34,0x26,0x27,0x16,0x16,0x15,0x03,0x32,0x36,0x35,0x35,0x23,0x22,0x07,0x15,0x16,0x27,0x35,0x06,0x15,0x14,0xe7,0x52,0x5f,0x5e,0x52,0x9a,0x44,0x3b,0x39,0x49,0x03,0x2a,0x03,0x68,0x67,0x73,0x79,0x90,0x10,0x50,0x8a,0x3c,0x4a,0x44,0x26,0x2c,0xc0,0x45,0x51,0x9a,0x11,0x0f,0x11,0x3b,0x3c, -0x0a,0x5a,0x4d,0x4b,0x57,0x38,0x44,0x4a,0x45,0x3a,0x4a,0x60,0x5f,0x5a,0xfe,0x89,0x53,0x2b,0x32,0x32,0x01,0x4f,0x3e,0x4e,0x0a,0x10,0x51,0x35,0xfe,0xa7,0x4a,0x3f,0x70,0x03,0xf3,0x03,0x11,0xd8,0x20,0x4a,0x4e,0x00,0x00,0x00,0x00,0x04,0x00,0x4b,0xff,0xf6,0x02,0x17,0x02,0xda,0x00,0x11,0x00,0x15,0x00,0x23,0x00,0x2a,0x00,0x9e, -0x4b,0xb0,0x18,0x50,0x58,0x40,0x0e,0x2a,0x24,0x1a,0x08,0x03,0x05,0x04,0x07,0x19,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0e,0x2a,0x24,0x1a,0x08,0x03,0x05,0x04,0x07,0x19,0x01,0x06,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03, -0x41,0x4d,0x09,0x06,0x02,0x04,0x04,0x00,0x61,0x01,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59, -0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x15,0x14,0x13,0x12,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x11,0x01,0x11,0x0a,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x25,0x33,0x11,0x23,0x13,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x06,0x15,0x15, -0x14,0x16,0x37,0x36,0x35,0x35,0x34,0x26,0x27,0x01,0x6e,0x37,0x4c,0x10,0x90,0x90,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0xfe,0xb9,0x3c,0x3c,0xef,0x09,0x12,0x08,0x08,0x12,0x09,0x3f,0x4a,0x4a,0x8c,0x3c,0x1f,0x1d,0x0a,0x30,0x2a,0x50,0x02,0xda,0xfe,0xfc,0x2a,0x30,0x6c,0x5c,0xab,0x5b,0x6c,0x32,0x02,0x8a,0xfd,0x6c,0x02,0x02,0x01,0xe2, -0x02,0x02,0x56,0x4a,0xab,0x49,0x56,0x16,0x29,0x60,0xab,0x2f,0x47,0x14,0x00,0x00,0x00,0x02,0x00,0x4b,0xff,0xf6,0x02,0x0d,0x02,0x30,0x00,0x19,0x00,0x21,0x00,0x47,0x40,0x44,0x1b,0x10,0x02,0x02,0x03,0x1a,0x11,0x02,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03, -0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x17,0x16,0x14,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x33,0x14, -0x06,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x01,0x2f,0x69,0x7b,0x7b,0x69,0x66,0x78,0x2a,0x61,0x53,0x2f,0x25,0x25,0x2f,0x53,0x61,0x2a,0x78,0xe4,0x1c,0x20,0x20,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x4e,0x5c,0x0e,0xfe,0x32,0x0e,0x5b,0x4e,0x60,0x71,0x4d,0x01,0x9f,0x16,0x43,0x2b,0x97,0x2b,0x42,0x00,0x00,0x04,0x00,0x41, -0xff,0xf6,0x02,0x0d,0x02,0xda,0x00,0x11,0x00,0x15,0x00,0x23,0x00,0x2a,0x00,0x9e,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0e,0x25,0x24,0x20,0x0f,0x0a,0x05,0x04,0x07,0x21,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0e,0x25,0x24,0x20,0x0f,0x0a,0x05,0x04,0x07,0x21,0x01,0x06,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x05, -0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x09,0x06,0x02,0x04,0x04,0x00,0x61,0x03,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03, -0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x15,0x14,0x13,0x12,0x0e,0x0d,0x0c,0x0b,0x08,0x06,0x00,0x11,0x01,0x11,0x0a,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x23,0x35,0x06,0x06, -0x37,0x33,0x11,0x23,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x16,0x16,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0xea,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x90,0x90,0x10,0x4c,0x86,0x3c,0x3c,0xb3,0x3f,0x4a,0x4a,0x3f,0x09,0x12,0x08,0x08,0x12,0x44,0x1c,0x20,0x0a,0x6c,0x5b,0xab,0x5c,0x6c,0x30,0x2a,0x01,0x04,0xfd, -0x26,0x50,0x2a,0x30,0x32,0x02,0x8a,0xfd,0x6c,0x56,0x49,0xab,0x4a,0x56,0x02,0x02,0xfe,0x1e,0x02,0x02,0x16,0x01,0xbe,0x14,0x47,0x2f,0xab,0x60,0x00,0x04,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0x30,0x00,0x15,0x00,0x1c,0x00,0x22,0x00,0x2a,0x00,0x4f,0x40,0x4c,0x24,0x22,0x1c,0x18,0x04,0x05,0x06,0x23,0x0d,0x02,0x03,0x04,0x02,0x4c, -0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x07,0x01,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x06,0x06,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1d,0x1b,0x19,0x17,0x16,0x13,0x12,0x10,0x0e,0x0c,0x0b,0x08,0x06,0x00,0x15,0x01,0x15,0x09,0x09,0x16,0x2b,0x05, -0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x33,0x35,0x26,0x23,0x22,0x07,0x17,0x33,0x35,0x34,0x26,0x27,0x01,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x01,0x2e,0x6b,0x7d,0x7d,0x6b,0x69,0x7b,0xfe,0xc4,0x26,0x32,0x53,0x64,0x03,0x2a,0x03,0x7b,0xbe,0xac,0x25,0x2f, -0x32,0x26,0xd6,0x3c,0x1f,0x1d,0xff,0x00,0x1c,0x20,0x20,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x5a,0xd7,0x0f,0x56,0x49,0x5b,0x6c,0x01,0x36,0xce,0x0e,0x0f,0xcd,0x32,0x2b,0x43,0x16,0xfe,0x62,0x01,0x9d,0x16,0x42,0x2b,0x97,0x2b,0x42,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x14,0x00,0x1a,0x00,0x40, -0x40,0x3d,0x17,0x01,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x06,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x3b,0x4d,0x09,0x07,0x02,0x00,0x00,0x08,0x5f,0x0a,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x16,0x15,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x11,0x23,0x11,0x11,0x11,0x0b,0x09,0x1e,0x2b, -0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x25,0x33,0x11,0x06,0x06,0x15,0x41,0x8d,0x8d,0x8d,0x3d,0x3d,0xca,0xb4,0xb4,0xb4,0xb4,0xfe,0xe6,0x3c,0x1d,0x1f,0x28,0x01,0xd6,0x28,0x37,0x3b,0x42,0x28,0x8c,0x28,0xfe,0x2a,0x28,0x28,0x02,0x89,0x04,0x2f,0x21,0x00,0x00, -0x00,0x04,0x00,0x41,0xff,0x4c,0x02,0x0d,0x02,0x30,0x00,0x19,0x00,0x25,0x00,0x2a,0x00,0x32,0x00,0x9f,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x2c,0x2b,0x24,0x23,0x13,0x06,0x06,0x05,0x06,0x26,0x01,0x00,0x01,0x02,0x4c,0x1b,0x40,0x12,0x23,0x01,0x07,0x06,0x2c,0x2b,0x24,0x13,0x06,0x05,0x05,0x07,0x26,0x01,0x00,0x01,0x03,0x4c,0x59, -0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x06,0x06,0x02,0x61,0x03,0x01,0x02,0x02,0x41,0x4d,0x09,0x01,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x00,0x00,0x04,0x5f,0x08,0x01,0x04,0x04,0x3d,0x04,0x4e,0x1b,0x40,0x2b,0x00,0x06,0x06,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x07,0x07,0x03,0x5f,0x00,0x03,0x03,0x3b, -0x4d,0x09,0x01,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x00,0x00,0x04,0x5f,0x08,0x01,0x04,0x04,0x3d,0x04,0x4e,0x59,0x40,0x17,0x1b,0x1a,0x00,0x00,0x2a,0x29,0x22,0x20,0x1a,0x25,0x1b,0x25,0x00,0x19,0x00,0x18,0x13,0x25,0x24,0x31,0x0a,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x32,0x37,0x35,0x06,0x06,0x23,0x22,0x26,0x35, -0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x11,0x14,0x06,0x23,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x17,0x36,0x35,0x11,0x23,0x01,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x6d,0xfd,0x05,0x0a,0x04,0x10,0x4a,0x37,0x4f,0x5c,0x5c,0x4f,0x37,0x4a,0x10,0x90,0x58,0x4b,0x74,0x40,0x47,0x47,0x40,0x15,0x10,0x10, -0xc6,0x3c,0x3c,0xff,0x00,0x1c,0x20,0x20,0xb4,0x28,0x01,0xd8,0x29,0x2e,0x6c,0x5b,0xab,0x5c,0x6c,0x2e,0x29,0x4d,0xfd,0xcb,0x4c,0x59,0xd2,0x56,0x49,0xab,0x4a,0x56,0x04,0xfe,0x1e,0x04,0x9c,0x1e,0x51,0x02,0x0d,0xfe,0x37,0x01,0xbc,0x14,0x46,0x2f,0xab,0x2f,0x45,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x10,0x02,0xda,0x00,0x12, -0x00,0x16,0x00,0x1b,0x00,0x40,0x40,0x3d,0x1b,0x0c,0x03,0x03,0x05,0x03,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x12,0x00,0x12,0x22,0x13, -0x23,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x26,0x23,0x22,0x06,0x15,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x34,0x27,0x4b,0x90,0x11,0x48,0x34,0x4d,0x5b,0x90,0x0f,0x13,0x3d,0x46,0x66,0x3c,0x3c,0x01,0x35,0x3c,0x3c,0x02,0xda,0xfe,0xfe,0x2a,0x2e,0x6c,0x5c,0xfe,0x98,0x02, -0x04,0x04,0x56,0x4a,0xfe,0x98,0x28,0x02,0x8a,0xfd,0x76,0x01,0x40,0x60,0x29,0x00,0x00,0x04,0x00,0x41,0x00,0x00,0x02,0x26,0x03,0x19,0x00,0x0b,0x00,0x17,0x00,0x21,0x00,0x25,0x00,0x8b,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2d,0x0c,0x01,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x0a, -0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x09,0x07,0x02,0x04,0x04,0x08,0x5f,0x0d,0x01,0x08,0x08,0x39,0x08,0x4e,0x1b,0x40,0x2b,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0c,0x01,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x0a,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x09,0x07,0x02,0x04,0x04,0x08,0x5f,0x0d, -0x01,0x08,0x08,0x39,0x08,0x4e,0x59,0x40,0x25,0x18,0x18,0x0d,0x0c,0x01,0x00,0x25,0x24,0x23,0x22,0x18,0x21,0x18,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0e,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34, -0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x25,0x33,0x11,0x23,0x01,0x3b,0x29,0x31,0x31,0x29,0x29,0x31,0x31,0x29,0x17,0x1b,0x1b,0x17,0x17,0x1b,0x1b,0xe3,0xb3,0x9a,0x01,0x2a,0xa2,0xfe,0xf8,0x3c,0x3c,0x02,0x7d,0x2a,0x24,0x24,0x2a,0x2a,0x24,0x24,0x2a,0x23,0x18,0x13,0x14,0x17,0x17, -0x14,0x13,0x18,0xfd,0x60,0x28,0x01,0xd6,0x28,0xfe,0x02,0x28,0x28,0x01,0xd6,0x00,0x00,0x04,0x00,0x4b,0xff,0x4c,0x01,0xbd,0x03,0x19,0x00,0x0b,0x00,0x17,0x00,0x24,0x00,0x29,0x00,0x8b,0xb6,0x25,0x1c,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2b,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x03,0x03, -0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x08,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x07,0x5f,0x0b,0x01,0x07,0x07,0x3d,0x07,0x4e,0x1b,0x40,0x29,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x08,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x00,0x04, -0x04,0x07,0x5f,0x0b,0x01,0x07,0x07,0x3d,0x07,0x4e,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x29,0x28,0x18,0x24,0x18,0x23,0x20,0x1f,0x1e,0x1d,0x1b,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34, -0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x35,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x11,0x14,0x06,0x23,0x37,0x36,0x35,0x11,0x23,0x01,0x63,0x29,0x31,0x31,0x29,0x29,0x31,0x31,0x29,0x17,0x1b,0x1b,0x17,0x17,0x1b,0x1b,0xfe,0xff,0x9f,0x1c,0x16,0xbd,0x01,0x4d,0x66,0x5c,0x5c,0x3c,0x3c,0x02,0x7d,0x2a,0x24,0x24,0x2a,0x2a,0x24,0x24, -0x2a,0x23,0x18,0x13,0x14,0x17,0x17,0x14,0x13,0x18,0xfc,0xac,0x28,0x06,0x02,0x84,0x28,0xfd,0xe4,0x59,0x65,0x40,0x26,0x58,0x01,0xf4,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x32,0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x47,0x40,0x44,0x13,0x07,0x02,0x01,0x02,0x14,0x01,0x04,0x01,0x02,0x4c,0x00,0x01,0x00,0x04,0x06, -0x01,0x04,0x67,0x00,0x07,0x07,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x08,0x01,0x06,0x06,0x03,0x60,0x09,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x07,0x13,0x23,0x03, -0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x03,0x07,0x4b,0x90,0x37,0xd6,0x3e,0x99,0xa5,0xa8,0x67,0x48,0x66,0x3c,0x3c,0x01,0x36,0x44,0x82,0x2a,0x02,0xda,0xfe,0x51,0xfb,0xaf,0xfe,0x89,0x01,0x03,0xfe,0xfd,0x28,0x02,0x8a,0xfd,0x76,0x01,0x2a,0x2f,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x0f,0x00,0x31, -0x40,0x2e,0x0b,0x01,0x03,0x01,0x01,0x4c,0x04,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x5f,0x05,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x0d,0x0c,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x0a,0x01,0x0a,0x06,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x27,0x11,0x23,0x11, -0x14,0x01,0x6a,0x43,0x49,0xac,0x01,0x3d,0xb7,0xe1,0x3c,0x47,0x40,0x02,0x26,0x2d,0xfd,0x53,0x2d,0x30,0x02,0x7d,0xfd,0xda,0x48,0x00,0x00,0x00,0x00,0x04,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0x30,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x2c,0x00,0xc1,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x0e,0x28,0x22,0x09,0x03,0x04,0x07,0x05,0x01,0x4c, -0x12,0x01,0x05,0x01,0x4b,0x1b,0x40,0x11,0x28,0x22,0x02,0x0a,0x05,0x09,0x03,0x02,0x07,0x0a,0x02,0x4c,0x12,0x01,0x05,0x01,0x4b,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x0a,0x01,0x05,0x05,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x4b, -0xb0,0x1a,0x50,0x58,0x40,0x27,0x0a,0x01,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0a,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x25,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x00,0x0a,0x0a,0x00,0x5f, -0x00,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x59,0x59,0x40,0x17,0x00,0x00,0x2c,0x2b,0x2a,0x29,0x24,0x23,0x1e,0x1d,0x00,0x1c,0x00,0x1c,0x11,0x15,0x13,0x24,0x23,0x11,0x0c,0x09,0x1c,0x2b,0x33,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16, -0x15,0x11,0x23,0x11,0x06,0x06,0x15,0x11,0x23,0x11,0x06,0x06,0x15,0x11,0x25,0x33,0x11,0x34,0x26,0x27,0x03,0x33,0x11,0x34,0x26,0x27,0x03,0x33,0x11,0x23,0x0f,0x8c,0x07,0x34,0x29,0x26,0x38,0x0a,0x06,0x39,0x2d,0x36,0x40,0x8e,0x24,0x2a,0x82,0x24,0x2a,0x01,0x46,0x3c,0x20,0x1c,0xd0,0x32,0x1b,0x17,0xda,0x3c,0x3c,0x02,0x26,0x42, -0x23,0x29,0x2a,0x24,0x24,0x2a,0x46,0x3b,0xfe,0x51,0x02,0x07,0x04,0x32,0x28,0xfe,0x57,0x02,0x08,0x02,0x34,0x29,0xfe,0x57,0x28,0x01,0x81,0x23,0x31,0x07,0xfe,0x24,0x01,0x81,0x21,0x2e,0x0a,0xfe,0x26,0x01,0xd6,0x00,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x10,0x02,0x30,0x00,0x12,0x00,0x16,0x00,0x1b,0x00,0x7a,0x4b,0xb0, -0x18,0x50,0x58,0xb7,0x1b,0x0c,0x03,0x03,0x05,0x03,0x01,0x4c,0x1b,0x40,0x0b,0x0c,0x01,0x06,0x03,0x1b,0x03,0x02,0x05,0x06,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x06,0x01,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x22,0x00, -0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x06,0x06,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x13,0x00,0x00,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x12,0x00,0x12,0x22,0x13,0x23,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x36,0x36,0x33,0x32, -0x16,0x15,0x11,0x23,0x11,0x26,0x23,0x22,0x06,0x15,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x34,0x27,0x4b,0x90,0x11,0x48,0x34,0x4d,0x5b,0x90,0x0f,0x13,0x3d,0x46,0x66,0x3c,0x3c,0x01,0x35,0x3c,0x3c,0x02,0x26,0x4b,0x29,0x2c,0x6c,0x5c,0xfe,0x98,0x02,0x04,0x04,0x56,0x4a,0xfe,0x98,0x28,0x01,0xd6,0xfe,0x2a,0x01,0x40,0x60,0x29, -0x00,0x04,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0x30,0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x3a,0x40,0x37,0x27,0x20,0x19,0x18,0x16,0x15,0x11,0x10,0x08,0x02,0x03,0x01,0x4c,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x14,0x12, -0x0e,0x17,0x0f,0x17,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x05,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x01,0x2c,0x6a,0x7c,0x7c,0x6a,0x6a,0x7c,0x7c,0x6a, -0x31,0x25,0x25,0x31,0x30,0x26,0x26,0x50,0x1c,0x20,0x20,0x01,0x1c,0x1d,0x1f,0x1f,0x1d,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x97,0x60,0x71,0x28,0x0f,0x01,0xcc,0x0f,0x0f,0xfe,0x34,0x0f,0x26,0x01,0x9e,0x16,0x43,0x2b,0x97,0x2b,0x42,0x16,0x16,0x42,0x2b,0x97,0x2b,0x43,0x16,0x00,0x00,0x00,0x04,0x00,0x4b,0xff,0x4c,0x02,0x17, -0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x23,0x00,0x2a,0x00,0x98,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x2a,0x24,0x16,0x15,0x10,0x03,0x06,0x04,0x05,0x01,0x4c,0x1b,0x40,0x0e,0x16,0x01,0x07,0x05,0x2a,0x24,0x15,0x10,0x03,0x05,0x04,0x07,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x05,0x05,0x00,0x61,0x01,0x01,0x00, -0x00,0x3b,0x4d,0x09,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x07,0x07,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x09,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x00,0x06,0x06,0x03, -0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x18,0x13,0x12,0x00,0x00,0x23,0x22,0x21,0x20,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11,0x00,0x11,0x25,0x23,0x11,0x0a,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x37,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x06, -0x15,0x15,0x14,0x16,0x07,0x33,0x11,0x23,0x01,0x36,0x36,0x35,0x35,0x34,0x27,0x4b,0x90,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x89,0x09,0x12,0x08,0x08,0x12,0x09,0x3f,0x4a,0x4a,0xb0,0x3c,0x3c,0x01,0x3c,0x1d,0x1f,0x3c,0xb4,0x02,0xda,0x50,0x2a,0x30,0x6b,0x5c,0xab,0x5c,0x6c,0x30,0x2a,0xfe,0xfc,0xd2,0x02,0x02,0x01, -0xe2,0x02,0x02,0x55,0x4a,0xab,0x49,0x57,0xaa,0x02,0x8a,0xfe,0x36,0x14,0x47,0x2f,0xab,0x60,0x29,0x00,0x00,0x04,0x00,0x41,0xff,0x4c,0x02,0x0d,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x23,0x00,0x2a,0x00,0x98,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x25,0x24,0x1d,0x1c,0x0e,0x01,0x06,0x04,0x05,0x01,0x4c,0x1b,0x40,0x0e,0x1c,0x01,0x07, -0x05,0x25,0x24,0x1d,0x0e,0x01,0x05,0x04,0x07,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x09,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x01,0x61,0x00,0x01, -0x01,0x41,0x4d,0x00,0x07,0x07,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x09,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x18,0x13,0x12,0x00,0x00,0x23,0x22,0x21,0x20,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11,0x00,0x11,0x13,0x25,0x23,0x0a,0x09,0x19,0x2b, -0x05,0x11,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x11,0x25,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x16,0x16,0x17,0x33,0x11,0x23,0x01,0x11,0x06,0x15,0x15,0x14,0x16,0x01,0x7d,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x90,0xfe,0xe7,0x3f,0x4a,0x4a,0x3f,0x09,0x12, -0x08,0x08,0x12,0xbc,0x3c,0x3c,0xff,0x00,0x3c,0x20,0xb4,0x01,0x04,0x2a,0x30,0x6c,0x5c,0xab,0x5c,0x6b,0x30,0x2a,0x50,0xfd,0x26,0xd2,0x57,0x49,0xab,0x4a,0x55,0x02,0x02,0xfe,0x1e,0x02,0x02,0xaa,0x02,0x8a,0xfe,0x36,0x01,0xbe,0x29,0x60,0xab,0x2f,0x47,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x30,0x02,0x30,0x00,0x19, -0x00,0x1d,0x00,0x77,0xb5,0x07,0x01,0x04,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x04,0x01,0x00,0x01,0x04,0x00,0x80,0x09,0x05,0x02,0x01,0x01,0x02,0x61,0x03,0x01,0x02,0x02,0x3b,0x4d,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x0a,0x01,0x07,0x07,0x39,0x07,0x4e,0x1b,0x40,0x2b,0x00,0x04,0x01,0x00,0x01,0x04,0x00,0x80, -0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x09,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x0a,0x01,0x07,0x07,0x39,0x07,0x4e,0x59,0x40,0x14,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x00,0x19,0x00,0x19,0x13,0x23,0x13,0x23,0x11,0x11,0x11,0x0b,0x09,0x1d,0x2b,0x33,0x35,0x33,0x11,0x23, -0x35,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x33,0x15,0x27,0x33,0x11,0x23,0x2d,0x5f,0x5f,0xef,0x0f,0x40,0x2f,0x4e,0x48,0x2a,0x35,0x3f,0x3b,0x3b,0x78,0xde,0x3c,0x3c,0x28,0x01,0xd6,0x28,0x48,0x27,0x2b,0x6c,0x5c,0x23,0x23,0x4a,0x56,0x56,0x4a,0xfe,0xc0,0x28,0x28,0x01,0xd6, -0x00,0x02,0x00,0x4b,0xff,0xf6,0x02,0x0d,0x02,0x30,0x00,0x27,0x00,0x41,0x00,0x3b,0x40,0x38,0x3f,0x01,0x04,0x02,0x01,0x4c,0x32,0x01,0x01,0x01,0x4b,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x00,0x01,0x04,0x00,0x01,0x7e,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05, -0x4e,0x2b,0x22,0x12,0x2b,0x22,0x10,0x06,0x09,0x1c,0x2b,0x37,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x13,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x36,0x36, -0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x06,0x06,0x4b,0x2a,0x05,0x5b,0x48,0x34,0x3c,0x22,0x1d,0x8f,0x33,0x3b,0x77,0x65,0x56,0x6f,0x0a,0x2a,0x09,0x4f,0x39,0x34,0x3c,0x1e,0x19,0x86,0x3b,0x44,0x7c,0x6b,0x60,0x76,0x2b,0x2b,0x25,0x90,0x2b,0x31,0x1d,0x17,0x2c,0x34,0x35,0x2d,0x85,0x27,0x2e,0x21,0x1a,0x2e,0x39, -0x8f,0x34,0x3c,0x2d,0x26,0x1c,0x2a,0x09,0x2b,0x0f,0x52,0x37,0x50,0x5c,0x4b,0x41,0x2f,0x35,0x2d,0x26,0x18,0x25,0x08,0x27,0x11,0x5c,0x3d,0x4e,0x5b,0x53,0x01,0x42,0x2b,0x3f,0x0b,0x2b,0x0d,0x3c,0x26,0x1f,0x32,0x0c,0x09,0x42,0x2f,0x30,0x49,0x0d,0x27,0x0b,0x37,0x24,0x1d,0x34,0x0d,0x0a,0x44,0x00,0x00,0x00,0x00,0x03,0x00,0x37, -0x00,0x00,0x02,0x12,0x02,0xc1,0x00,0x10,0x00,0x14,0x00,0x1a,0x00,0x46,0x40,0x43,0x15,0x01,0x06,0x01,0x01,0x4c,0x00,0x03,0x00,0x08,0x02,0x03,0x08,0x67,0x09,0x05,0x02,0x01,0x01,0x02,0x5f,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x5f,0x0a,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x17,0x16,0x14,0x13,0x12,0x11, -0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x10,0x01,0x10,0x0b,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x01,0x33,0x35,0x23,0x13,0x11,0x23,0x11,0x14,0x16,0x01,0x3b,0x3f,0x3b,0x8a,0x8a,0x90,0xc1,0xc1,0xbc,0xfe,0xde,0x3c,0x3c,0x3c,0x3c,0x1f, -0x40,0x3d,0x01,0x81,0x28,0x9b,0x9b,0x28,0xfe,0x2a,0x28,0x02,0x26,0x73,0xfd,0x91,0x01,0xd4,0xfe,0x7f,0x22,0x2c,0x00,0x00,0x00,0x02,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0x26,0x00,0x10,0x00,0x16,0x00,0x32,0x40,0x2f,0x11,0x06,0x02,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00, -0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x13,0x12,0x0d,0x0c,0x09,0x07,0x05,0x04,0x00,0x10,0x01,0x10,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x27,0x11,0x23,0x11,0x14,0x16,0x01,0x2d,0x66,0x77,0x90,0x24,0x29,0x52,0x5f,0x2a,0x76,0xdc,0x3c,0x20,0x0a, -0x77,0x65,0x01,0x54,0xfe,0x06,0x0e,0x61,0x53,0x01,0x54,0xfe,0xac,0x65,0x77,0x4e,0x01,0xba,0xfe,0xd4,0x2e,0x49,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0x26,0x00,0x0c,0x00,0x10,0x00,0x2f,0x40,0x2c,0x06,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x02,0x5f, -0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x18,0x11,0x06,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x27,0x33,0x03,0x23,0xdc,0xaf,0x99,0x76,0x11,0x14,0x02,0x02,0x15,0x10,0x75,0x2c,0xae,0x81,0x3e,0x94,0x3f,0x02,0x26,0xfe,0x8e,0x35,0x48,0x0b, -0x0b,0x49,0x34,0x01,0x72,0xfd,0xda,0x28,0x01,0xd6,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x26,0x00,0x21,0x00,0x25,0x00,0x30,0x00,0x39,0x40,0x36,0x30,0x2b,0x10,0x06,0x04,0x05,0x06,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x03,0x60,0x08,0x04,0x02,0x03,0x03, -0x39,0x03,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x00,0x21,0x00,0x21,0x11,0x1a,0x19,0x11,0x09,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x3e,0x02,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x26,0x36,0x37,0x13,0x33,0x03,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x27,0x33,0x03,0x23,0x01,0x33,0x03,0x26, -0x26,0x27,0x23,0x06,0x06,0x07,0x07,0x62,0x62,0x92,0x49,0x04,0x05,0x02,0x01,0x03,0x06,0x04,0x4c,0x34,0x5f,0x05,0x06,0x02,0x03,0x01,0x02,0x01,0x03,0x44,0x2e,0x61,0x98,0x24,0x04,0x0b,0x02,0x01,0x09,0x05,0x20,0x75,0x3d,0x55,0x3d,0x01,0x50,0x3d,0x50,0x06,0x0b,0x02,0x02,0x02,0x0c,0x05,0x0b,0x02,0x26,0xfe,0x71,0x16,0x21,0x15, -0x0e,0x10,0x17,0x16,0x01,0x90,0xfe,0x70,0x16,0x20,0x15,0x14,0x10,0x09,0x0e,0x11,0x01,0x8f,0xfd,0xda,0xa2,0x12,0x41,0x1e,0x16,0x43,0x18,0xa2,0x28,0x01,0xd6,0xfe,0x2a,0x01,0x5f,0x1b,0x43,0x16,0x16,0x43,0x1b,0x3a,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0x26,0x00,0x0b,0x00,0x0f,0x00,0x34,0x40,0x31,0x0a,0x07, -0x04,0x01,0x04,0x04,0x05,0x01,0x4c,0x00,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x3b,0x4d,0x00,0x04,0x04,0x02,0x60,0x06,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x07,0x09,0x19,0x2b,0x33,0x37,0x03,0x33,0x17,0x37,0x33,0x07,0x13,0x23,0x27,0x07,0x25,0x33,0x01,0x23, -0x3a,0xb2,0xce,0xb2,0x7e,0x8b,0x35,0xa9,0xd5,0xb2,0x84,0x94,0x01,0x30,0x4a,0xfe,0xcc,0x48,0xed,0x01,0x39,0xbf,0xbf,0xe3,0xfe,0xbd,0xc8,0xc8,0x28,0x01,0xd6,0x00,0x00,0x02,0x00,0x2d,0xff,0x4c,0x02,0x2b,0x02,0x26,0x00,0x0f,0x00,0x19,0x00,0x31,0x40,0x2e,0x13,0x10,0x09,0x06,0x04,0x00,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f, -0x02,0x01,0x01,0x01,0x3b,0x4d,0x00,0x00,0x00,0x03,0x61,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x15,0x14,0x00,0x0f,0x00,0x0e,0x12,0x14,0x21,0x06,0x09,0x19,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x37,0x03,0x33,0x13,0x13,0x33,0x01,0x06,0x06,0x23,0x37,0x36,0x36,0x37,0x03,0x23,0x13,0x1e,0x02,0x4f,0x2b,0x2f,0x3d,0x13,0x1e, -0xea,0x9f,0x99,0x98,0x2e,0xfe,0xf1,0x18,0x54,0x36,0xb4,0x05,0x10,0x0a,0x9e,0x42,0x8e,0x08,0x14,0x13,0xb4,0x28,0x31,0x2b,0x44,0x02,0x12,0xfe,0xa5,0x01,0x5b,0xfd,0x9b,0x36,0x3f,0xf9,0x0c,0x2c,0x18,0x01,0x69,0xfe,0xb7,0x12,0x2c,0x27,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0x26,0x00,0x09,0x00,0x0d,0x00,0x32, -0x40,0x2f,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x05,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x3b,0x4d,0x04,0x01,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x09,0x12,0x11,0x12,0x07,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x25,0x33,0x01,0x23, -0x46,0x01,0x1e,0xfe,0xeb,0x01,0xb6,0xfe,0xe4,0x01,0x29,0xfe,0x62,0x47,0x01,0x1d,0x46,0x29,0x01,0xd5,0x28,0x2a,0xfe,0x2c,0x28,0x28,0x01,0xd6,0x00,0x03,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0xe4,0x00,0x0e,0x00,0x1c,0x00,0x28,0x00,0x3e,0x40,0x3b,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01, -0x01,0x3e,0x4d,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1e,0x1d,0x10,0x0f,0x01,0x00,0x24,0x22,0x1d,0x28,0x1e,0x28,0x17,0x15,0x0f,0x1c,0x10,0x1c,0x08,0x06,0x00,0x0e,0x01,0x0e,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x11, -0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x65,0x77,0x77,0x65,0x65,0x77,0x36,0x63,0x43,0x3c,0x49,0x49,0x3c,0x3c,0x49,0x49,0x3c,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0x0a,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x41,0x61,0x35,0x4d,0x4d,0x3d, -0x01,0x40,0x3d,0x4d,0x4d,0x3d,0xfe,0xc0,0x3d,0x4d,0xf3,0x1e,0x1c,0x1b,0x1d,0x1d,0x1b,0x1c,0x1e,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0a,0x00,0x29,0x40,0x26,0x05,0x04,0x03,0x03,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x38,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00, -0x00,0x0a,0x00,0x0a,0x11,0x14,0x11,0x05,0x09,0x19,0x2b,0x33,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x5a,0xc6,0xc6,0xa5,0x7b,0xa2,0x52,0x02,0x3a,0x94,0x67,0x7b,0xfd,0x78,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x02,0x0f,0x02,0xe4,0x00,0x18,0x00,0x34,0x40,0x31,0x01,0x01,0x03,0x01,0x01,0x4c,0x00,0x01, -0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x16,0x22,0x12,0x27,0x06,0x09,0x1a,0x2b,0x33,0x35,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07, -0x07,0x21,0x15,0x56,0xf3,0x35,0x2c,0x45,0x3b,0x3d,0x47,0x5a,0x03,0x78,0x63,0x65,0x77,0x39,0x45,0xc5,0x01,0x4c,0x53,0x01,0x04,0x38,0x58,0x2a,0x3c,0x47,0x49,0x3e,0x63,0x74,0x72,0x62,0x34,0x74,0x48,0xce,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x46,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x1c,0x00,0x43,0x40,0x40,0x16,0x15,0x10,0x03, -0x03,0x04,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x02,0x04,0x01,0x02,0x7e,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1c,0x01,0x1c,0x07,0x09,0x16,0x2b,0x05,0x22,0x26, -0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x21,0x35,0x21,0x15,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x01,0x21,0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x46,0x3c,0x4f,0xb3,0xfe,0xd4,0x01,0x92,0xb0,0x5a,0x68,0x77,0x0a,0x71,0x61,0x3c,0x46,0x46,0x3c,0x32,0x3c,0x46,0x4e,0xbe,0x52,0x54,0xbb,0x07,0x6f, -0x5b,0x32,0x61,0x71,0x00,0x01,0x00,0x46,0x00,0x00,0x01,0xea,0x02,0xda,0x00,0x0b,0x00,0x30,0x40,0x2d,0x06,0x03,0x02,0x02,0x03,0x01,0x4c,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x68,0x00,0x01,0x01,0x38,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x12,0x12,0x11,0x06,0x09, -0x1a,0x2b,0x21,0x35,0x21,0x35,0x01,0x33,0x01,0x15,0x33,0x35,0x33,0x11,0x01,0x90,0xfe,0xb6,0x01,0x0a,0x66,0xfe,0xea,0xf0,0x5a,0xa0,0x8d,0x01,0xad,0xfe,0x3f,0x27,0xb2,0xfe,0x5c,0x00,0x00,0x01,0x00,0x4b,0xff,0xf6,0x02,0x03,0x02,0xda,0x00,0x1b,0x00,0x3e,0x40,0x3b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x06,0x00,0x03, -0x01,0x06,0x03,0x67,0x00,0x05,0x05,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x16,0x14,0x13,0x12,0x11,0x10,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1b,0x01,0x1b,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23, -0x11,0x21,0x15,0x21,0x17,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x26,0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x44,0x3a,0xc7,0x01,0x85,0xfe,0xcf,0x02,0x76,0x65,0x6e,0x77,0x0a,0x71,0x61,0x3c,0x46,0x46,0x3c,0x2d,0x3c,0x46,0x01,0x63,0x52,0xbf,0x6f,0x65,0x2d,0x61,0x71,0x00,0x02,0x00,0x40,0xff,0xf6,0x02,0x18,0x02,0xda,0x00,0x15, -0x00,0x21,0x00,0x38,0x40,0x35,0x0a,0x01,0x04,0x02,0x01,0x4c,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x6a,0x00,0x01,0x01,0x38,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1d,0x1b,0x16,0x21,0x17,0x21,0x0f,0x0d,0x09,0x08,0x00,0x15,0x01,0x15,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x26, -0x35,0x34,0x36,0x37,0x13,0x33,0x03,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2d,0x46,0x6b,0x3c,0x24,0x1f,0xa9,0x64,0xb4,0x03,0x0d,0x34,0x1f,0x41,0x61,0x37,0x3c,0x69,0x47,0x41,0x51,0x51,0x41,0x41,0x51,0x51,0x0a,0x3b,0x69,0x45,0x30,0x65,0x37, -0x01,0x2f,0xfe,0xc7,0x02,0x11,0x12,0x39,0x64,0x42,0x46,0x6b,0x3c,0x50,0x56,0x45,0x45,0x56,0x56,0x45,0x45,0x56,0x00,0x00,0x00,0x01,0x00,0x52,0x00,0x00,0x02,0x22,0x02,0xda,0x00,0x08,0x00,0x52,0xb5,0x07,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x18,0x00,0x01,0x00,0x03,0x00,0x01,0x72,0x00,0x00,0x00,0x02,0x5f, -0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x19,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x0c,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x33,0x01,0x21,0x15,0x23,0x35,0x21,0x15, -0x01,0xbe,0x01,0x04,0xfe,0xea,0x5a,0x01,0xd0,0xfe,0xfe,0x02,0x88,0x76,0xc8,0x54,0xfd,0x7a,0x00,0x00,0x00,0x03,0x00,0x42,0xff,0xf6,0x02,0x16,0x02,0xe4,0x00,0x1d,0x00,0x29,0x00,0x35,0x00,0x45,0x40,0x42,0x16,0x07,0x02,0x05,0x02,0x01,0x4c,0x07,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01, -0x3e,0x4d,0x08,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x2b,0x2a,0x1f,0x1e,0x01,0x00,0x31,0x2f,0x2a,0x35,0x2b,0x35,0x25,0x23,0x1e,0x29,0x1f,0x29,0x10,0x0e,0x00,0x1d,0x01,0x1d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14, -0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x45,0x6a,0x3b,0x4f,0x42,0x39,0x44,0x36,0x61,0x3f,0x40,0x60,0x36,0x44,0x39,0x42,0x4f,0x3b,0x69,0x46,0x38,0x44,0x44,0x38,0x37,0x45,0x45,0x37,0x40, -0x50,0x50,0x40,0x40,0x50,0x50,0x0a,0x36,0x61,0x3f,0x45,0x64,0x0b,0x03,0x0d,0x59,0x3a,0x39,0x57,0x31,0x31,0x57,0x39,0x3a,0x59,0x0d,0x03,0x0b,0x64,0x45,0x3f,0x61,0x36,0x01,0xb0,0x42,0x35,0x35,0x42,0x42,0x35,0x35,0x42,0xfe,0xa1,0x4b,0x3c,0x3d,0x4b,0x4b,0x3d,0x3c,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x02,0x18, -0x02,0xe4,0x00,0x15,0x00,0x21,0x00,0x36,0x40,0x33,0x01,0x01,0x00,0x03,0x01,0x4c,0x06,0x01,0x03,0x00,0x00,0x02,0x03,0x00,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x17,0x16,0x00,0x00,0x1d,0x1b,0x16,0x21,0x17,0x21,0x00,0x15,0x00,0x15,0x26,0x24,0x07,0x09,0x18,0x2b,0x33,0x13, -0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x03,0x11,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xc3,0xb4,0x03,0x0a,0x36,0x20,0x3f,0x5f,0x36,0x3c,0x6a,0x45,0x47,0x6a,0x3c,0x24,0x1f,0xa9,0x41,0x51,0x51,0x41,0x41,0x51,0x51,0x01,0x39,0x02,0x10,0x13,0x39,0x64, -0x42,0x47,0x6a,0x3c,0x3b,0x69,0x45,0x30,0x65,0x37,0xfe,0xd1,0x01,0x5e,0x56,0x45,0x45,0x56,0x56,0x45,0x45,0x56,0x00,0x00,0x00,0x03,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0xe4,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x36,0x40,0x33,0x1c,0x1b,0x11,0x10,0x04,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05, -0x01,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x18,0x17,0x01,0x00,0x17,0x1e,0x18,0x1e,0x15,0x13,0x08,0x06,0x00,0x0e,0x01,0x0e,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x03,0x11,0x01,0x26,0x26,0x23,0x22,0x06,0x13,0x32,0x36,0x35,0x11,0x01,0x16,0x16,0x01, -0x2c,0x65,0x77,0x77,0x65,0x65,0x77,0x36,0x63,0xc8,0x01,0x05,0x0b,0x44,0x31,0x3c,0x49,0x85,0x3c,0x49,0xfe,0xfb,0x0b,0x44,0x0a,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x41,0x61,0x35,0x02,0x17,0xfe,0xec,0x01,0x3c,0x2d,0x35,0x4d,0xfd,0xf9,0x4d,0x3d,0x01,0x14,0xfe,0xc4,0x2d,0x35,0x00,0x00,0x00,0x00,0x01,0x00,0x58, -0x00,0x00,0x02,0x13,0x02,0xe4,0x00,0x22,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x22,0x00,0x22,0x1b,0x23,0x12,0x2b,0x06,0x09,0x1a,0x2b,0x33,0x35,0x34,0x36,0x36,0x37,0x37,0x36, -0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x3e,0x02,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x15,0x21,0x15,0x59,0x2b,0x4a,0x2d,0x64,0x28,0x2f,0x48,0x3a,0x3a,0x48,0x5a,0x02,0x39,0x62,0x3f,0x42,0x64,0x38,0x4a,0x40,0x66,0x2b,0x44,0x01,0x60,0x80,0x34,0x57,0x42,0x13,0x2b,0x11,0x48,0x29,0x3c,0x4b,0x4b, -0x3c,0x40,0x60,0x37,0x37,0x60,0x40,0x44,0x72,0x1c,0x2c,0x13,0x4c,0x35,0x29,0x52,0x00,0x02,0x00,0x55,0xff,0xf6,0x02,0x11,0x02,0xe4,0x00,0x1b,0x00,0x29,0x00,0x49,0x40,0x46,0x12,0x01,0x05,0x06,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01, -0x3e,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x36,0x33,0x32, -0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x34,0x67,0x78,0x76,0x65,0x5b,0x72,0x07,0x5a,0x05,0x43,0x33,0x3b,0x45,0x0b,0x4f,0x3d,0x5e,0x6d,0x77,0x67,0x3d,0x47,0x47,0x3d,0x3d,0x47,0x47,0x0a,0x74,0x63,0x01,0x40,0x63,0x74,0x59,0x47,0x22,0x2e,0x49,0x3e,0xa5,0x30,0x37, -0x74,0x63,0x2b,0x63,0x74,0x50,0x49,0x3e,0x2b,0x3e,0x49,0x49,0x3e,0x2b,0x3e,0x49,0x00,0x02,0x00,0x49,0xff,0xf6,0x02,0x03,0x02,0xe4,0x00,0x1b,0x00,0x29,0x00,0x49,0x40,0x46,0x0b,0x01,0x05,0x06,0x01,0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x08,0x01,0x05,0x00,0x03,0x01,0x05,0x03,0x69,0x00,0x06,0x06,0x04,0x61,0x00,0x04, -0x04,0x3e,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32, -0x16,0x15,0x11,0x14,0x06,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x28,0x5b,0x72,0x07,0x5a,0x05,0x43,0x33,0x3b,0x45,0x0a,0x4e,0x3e,0x5e,0x6c,0x76,0x66,0x67,0x77,0x76,0x67,0x3d,0x46,0x46,0x3d,0x3d,0x46,0x46,0x0a,0x5b,0x4a,0x25,0x30,0x49,0x3e,0xb8,0x32,0x39,0x74,0x63,0x1c,0x63,0x74,0x74, -0x63,0xfe,0xc0,0x63,0x74,0x01,0x74,0x49,0x3e,0x1c,0x3e,0x49,0x49,0x3e,0x1c,0x3e,0x49,0x00,0x00,0x00,0x00,0x03,0x00,0x42,0xff,0xf6,0x02,0x16,0x02,0xe5,0x00,0x1b,0x00,0x29,0x00,0x37,0x00,0x36,0x40,0x33,0x31,0x1d,0x15,0x07,0x04,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x03,0x03,0x00, -0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x2b,0x2a,0x01,0x00,0x2a,0x37,0x2b,0x37,0x25,0x23,0x0f,0x0d,0x00,0x1b,0x01,0x1b,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x17,0x37,0x36,0x36,0x35,0x34,0x26, -0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x01,0x2c,0x46,0x6a,0x3a,0x4f,0x42,0x41,0x40,0x39,0x62,0x3f,0x3f,0x63,0x38,0x40,0x41,0x42,0x4f,0x3a,0x69,0x64,0x1d,0x19,0x2f,0x3a,0x48,0x3a,0x3a,0x48,0x38,0x4a,0x42,0x50,0x36,0x31,0x2b,0x2e,0x30,0x34,0x50,0x0a,0x31,0x57, -0x39,0x3e,0x6b,0x1e,0x20,0x59,0x33,0x37,0x54,0x30,0x30,0x54,0x37,0x32,0x59,0x21,0x1e,0x6b,0x3e,0x39,0x57,0x31,0x01,0xb5,0x0b,0x0a,0x12,0x43,0x28,0x31,0x3d,0x3e,0x30,0x29,0x42,0xfe,0x8a,0x45,0x38,0x2c,0x47,0x13,0x11,0x12,0x13,0x47,0x2b,0x38,0x45,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xf6,0x02,0x03,0x02,0xda,0x00,0x20, -0x00,0x4d,0x40,0x4a,0x17,0x01,0x03,0x07,0x01,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x07,0x00,0x03,0x04,0x07,0x03,0x69,0x00,0x06,0x06,0x05,0x5f,0x00,0x05,0x05,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1b,0x19,0x16,0x15,0x14,0x13,0x12, -0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x20,0x01,0x20,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x11,0x21,0x15,0x21,0x17,0x36,0x36,0x33,0x36,0x16,0x15,0x15,0x14,0x06,0x01,0x2a,0x5b,0x73,0x07,0x5a,0x05,0x43,0x34,0x3a,0x44,0x44,0x3a,0x27,0x39,0x0d, -0x5a,0x01,0x85,0xfe,0xcf,0x02,0x0d,0x48,0x35,0x5b,0x64,0x75,0x0a,0x5c,0x4e,0x29,0x31,0x46,0x3c,0x47,0x3c,0x46,0x28,0x1e,0x01,0x8f,0x52,0xf5,0x24,0x29,0x01,0x6f,0x63,0x47,0x61,0x71,0xff,0xff,0x00,0x89,0xff,0x76,0x01,0xcf,0x01,0x40,0x03,0x07,0x03,0x02,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0x7b,0x01,0xe0,0x01,0x3b,0x03,0x07,0x03,0x03,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0xff,0x7b,0x01,0xc9,0x01,0x40,0x03,0x07,0x03,0x04,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x76,0x01,0xce,0x01,0x3b,0x03,0x07,0x03,0x05,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8f,0xff,0x7b,0x01,0xbd,0x01,0x3b,0x03,0x07,0x03,0x06,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8d,0xff,0x76,0x01,0xcf,0x01,0x3b,0x03,0x07,0x03,0x07,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x86,0xff,0x76,0x01,0xd2,0x01,0x3b,0x03,0x07,0x03,0x08,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x94,0xff,0x7b,0x01,0xce,0x01,0x3b,0x03,0x07,0x03,0x09,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0x6c,0x01,0xd1,0x01,0x36,0x03,0x07,0x03,0x0a,0x00,0x00,0xfd,0xf3,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfd,0xf3,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x7b,0x01,0xcd,0x01,0x40,0x03,0x07,0x03,0x0b,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0xfb,0x01,0xcf,0x01,0xc5,0x03,0x07,0x03,0x02,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x96,0x00,0x00,0x01,0xe0,0x01,0xc0,0x03,0x07,0x03,0x03,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x00,0x00,0x01,0xc9,0x01,0xc5,0x03,0x07,0x03,0x04,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0xfb,0x01,0xce,0x01,0xc0,0x03,0x07,0x03,0x05,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8f,0x00,0x00,0x01,0xbd,0x01,0xc0,0x03,0x07,0x03,0x06,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8d,0xff,0xfb,0x01,0xcf,0x01,0xc0,0x03,0x07,0x03,0x07,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x86,0xff,0xfb,0x01,0xd2,0x01,0xc0,0x03,0x07,0x03,0x08,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x94,0x00,0x00,0x01,0xce,0x01,0xc0,0x03,0x07,0x03,0x09,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xfb,0x01,0xd1,0x01,0xc5,0x03,0x07,0x03,0x0a,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfe,0x82,0xb0,0x35, -0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0x00,0x00,0x01,0xcd,0x01,0xc5,0x03,0x07,0x03,0x0b,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0x01,0x15,0x01,0xcf,0x02,0xdf,0x03,0x06,0x03,0x02,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00, -0xff,0xff,0x00,0x96,0x01,0x1a,0x01,0xe0,0x02,0xda,0x03,0x06,0x03,0x03,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x93,0x01,0x1a,0x01,0xc9,0x02,0xdf,0x03,0x06,0x03,0x04,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8b,0x01,0x15,0x01,0xce, -0x02,0xda,0x03,0x06,0x03,0x05,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8f,0x01,0x1a,0x01,0xbd,0x02,0xda,0x03,0x06,0x03,0x06,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8d,0x01,0x15,0x01,0xcf,0x02,0xda,0x03,0x06,0x03,0x07,0x00,0x9c, -0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x86,0x01,0x15,0x01,0xd2,0x02,0xda,0x03,0x06,0x03,0x08,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x94,0x01,0x1a,0x01,0xce,0x02,0xda,0x03,0x06,0x03,0x09,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c, -0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x87,0x01,0x15,0x01,0xd1,0x02,0xdf,0x03,0x06,0x03,0x0a,0x00,0x9c,0x00,0x09,0xb1,0x00,0x03,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8b,0x01,0x1a,0x01,0xcd,0x02,0xdf,0x03,0x06,0x03,0x0b,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0x00,0x02,0x00,0x89, -0x01,0x79,0x01,0xcf,0x03,0x43,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x53,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36, -0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x49,0x5a,0x5a,0x49,0x49,0x5a,0x5a,0x49,0x29,0x33,0x33,0x29,0x29,0x33,0x33,0x01,0x79,0x5c,0x49,0x81,0x49,0x5b,0x5b,0x49,0x81,0x49,0x5c,0x40,0x38,0x2d,0x81,0x2c,0x38,0x38,0x2c,0x81,0x2d,0x38,0x00,0x00,0x00, -0x00,0x01,0x00,0x96,0x01,0x7e,0x01,0xe0,0x03,0x3e,0x00,0x0a,0x00,0x29,0x40,0x26,0x05,0x04,0x03,0x03,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x50,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x51,0x03,0x4e,0x00,0x00,0x00,0x0a,0x00,0x0a,0x11,0x14,0x11,0x05,0x0b,0x19,0x2b,0x13,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x11, -0x33,0x15,0x96,0x90,0x8d,0x74,0x60,0x73,0x01,0x7e,0x41,0x01,0x44,0x55,0x49,0x47,0xfe,0x81,0x41,0x00,0x00,0x01,0x00,0x93,0x01,0x7e,0x01,0xc9,0x03,0x43,0x00,0x1a,0x00,0x34,0x40,0x31,0x01,0x01,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x52,0x4d,0x00,0x03,0x03,0x04, -0x5f,0x05,0x01,0x04,0x04,0x51,0x04,0x4e,0x00,0x00,0x00,0x1a,0x00,0x1a,0x17,0x23,0x12,0x27,0x06,0x0b,0x1a,0x2b,0x13,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x3e,0x02,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x9c,0xb7,0x14,0x18,0x2f,0x23,0x22,0x31,0x47,0x02,0x2a,0x45,0x29,0x2c,0x45,0x29, -0x2a,0x24,0x8c,0xdc,0x01,0x7e,0x4d,0x9e,0x11,0x25,0x16,0x23,0x2b,0x2c,0x24,0x2b,0x40,0x25,0x23,0x3f,0x2a,0x24,0x3e,0x1f,0x77,0x41,0x00,0x00,0x00,0x01,0x00,0x8b,0x01,0x79,0x01,0xce,0x03,0x3e,0x00,0x1a,0x00,0x43,0x40,0x40,0x15,0x14,0x0f,0x03,0x03,0x04,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x02,0x04, -0x01,0x02,0x7e,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x50,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x53,0x00,0x4e,0x01,0x00,0x13,0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x07,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35, -0x21,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x01,0x2c,0x47,0x5a,0x47,0x32,0x28,0x28,0x32,0x32,0x28,0x29,0x73,0xd5,0x01,0x1d,0x75,0x3c,0x49,0x5a,0x01,0x79,0x52,0x42,0x25,0x2f,0x2f,0x25,0x25,0x2e,0x45,0x58,0x41,0x48,0x5c,0x07,0x4c,0x3a,0x42,0x52,0x00,0x01,0x00,0x8f,0x01,0x7e,0x01,0xbd,0x03,0x3e,0x00,0x0b,0x00,0x30,0x40,0x2d, -0x06,0x03,0x02,0x02,0x03,0x01,0x4c,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x68,0x00,0x01,0x01,0x50,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x51,0x04,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x12,0x12,0x11,0x06,0x0b,0x1a,0x2b,0x01,0x35,0x23,0x35,0x37,0x33,0x03,0x15,0x33,0x35,0x33,0x11,0x01,0x76,0xe7,0xae,0x50,0xb8, -0xa1,0x47,0x01,0x7e,0x69,0x5d,0xfa,0xfe,0xf6,0x0d,0x72,0xfe,0xe5,0x00,0x00,0x00,0x00,0x01,0x00,0x8d,0x01,0x79,0x01,0xcf,0x03,0x3e,0x00,0x19,0x00,0x3e,0x40,0x3b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x06,0x00,0x03,0x01,0x06,0x03,0x67,0x00,0x05,0x05,0x04,0x5f,0x00,0x04,0x04,0x50,0x4d,0x00,0x02,0x02,0x00,0x61,0x07, -0x01,0x00,0x00,0x53,0x00,0x4e,0x01,0x00,0x15,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x19,0x01,0x19,0x08,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2f,0x49,0x59,0x46,0x32,0x2a,0x28,0x30,0x30, -0x28,0x8b,0x01,0x1a,0xd7,0x48,0x4a,0x56,0x58,0x01,0x79,0x50,0x44,0x28,0x2c,0x2f,0x25,0x26,0x2e,0xdd,0x3f,0x62,0x4e,0x42,0x42,0x52,0x00,0x00,0x00,0x02,0x00,0x86,0x01,0x79,0x01,0xd2,0x03,0x3e,0x00,0x10,0x00,0x1c,0x00,0x38,0x40,0x35,0x08,0x01,0x04,0x02,0x01,0x4c,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x6a,0x00,0x01,0x01,0x50, -0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x53,0x00,0x4e,0x12,0x11,0x01,0x00,0x18,0x16,0x11,0x1c,0x12,0x1c,0x0c,0x0a,0x07,0x06,0x00,0x10,0x01,0x10,0x07,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x37,0x37,0x33,0x07,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14, -0x16,0x01,0x2d,0x4b,0x5c,0x24,0x7e,0x4d,0x81,0x04,0x1b,0x31,0x40,0x4e,0x5b,0x4b,0x2a,0x34,0x34,0x2a,0x29,0x35,0x34,0x01,0x79,0x55,0x43,0x32,0x39,0xc2,0xc5,0x25,0x4e,0x3f,0x43,0x55,0x40,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x94,0x01,0x7e,0x01,0xce,0x03,0x3e,0x00,0x08,0x00,0x52,0xb5,0x07, -0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x18,0x00,0x01,0x00,0x03,0x00,0x01,0x72,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x50,0x4d,0x04,0x01,0x03,0x03,0x51,0x03,0x4e,0x1b,0x40,0x19,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x50,0x4d,0x04,0x01,0x03,0x03,0x51,0x03,0x4e, -0x59,0x40,0x0c,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x11,0x05,0x0b,0x19,0x2b,0x13,0x13,0x23,0x15,0x23,0x35,0x21,0x15,0x03,0xd8,0xb1,0xaf,0x46,0x01,0x3a,0xa8,0x01,0x7e,0x01,0x80,0x4e,0x8e,0x4c,0xfe,0x8c,0x00,0x00,0x00,0x00,0x03,0x00,0x87,0x01,0x79,0x01,0xd1,0x03,0x43,0x00,0x19,0x00,0x25,0x00,0x31,0x00,0x45,0x40,0x42, -0x13,0x06,0x02,0x05,0x02,0x01,0x4c,0x07,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x08,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x53,0x00,0x4e,0x27,0x26,0x1b,0x1a,0x01,0x00,0x2d,0x2b,0x26,0x31,0x27,0x31,0x21,0x1f,0x1a,0x25,0x1b,0x25,0x0e,0x0c,0x00,0x19,0x01,0x19,0x09, -0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x49,0x5c,0x3a,0x2e,0x2a,0x33,0x55,0x45,0x46, -0x56,0x34,0x2c,0x2f,0x3a,0x5b,0x4a,0x27,0x30,0x30,0x27,0x26,0x2f,0x2f,0x26,0x2a,0x36,0x36,0x2a,0x2a,0x36,0x36,0x01,0x79,0x49,0x3a,0x2e,0x3d,0x04,0x04,0x08,0x34,0x22,0x35,0x41,0x41,0x35,0x22,0x34,0x08,0x04,0x04,0x3d,0x2e,0x3a,0x49,0x01,0x0b,0x24,0x1d,0x1d,0x25,0x25,0x1d,0x1d,0x24,0xce,0x29,0x21,0x21,0x29,0x29,0x21,0x21, -0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x7e,0x01,0xcd,0x03,0x43,0x00,0x12,0x00,0x1e,0x00,0x36,0x40,0x33,0x01,0x01,0x00,0x03,0x01,0x4c,0x06,0x01,0x03,0x00,0x00,0x02,0x03,0x00,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x05,0x01,0x02,0x02,0x51,0x02,0x4e,0x14,0x13,0x00,0x00,0x1a,0x18,0x13,0x1e,0x14,0x1e, -0x00,0x12,0x00,0x12,0x24,0x24,0x07,0x0b,0x18,0x2b,0x13,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xe7,0x7e,0x04,0x0a,0x26,0x1d,0x3f,0x4a,0x57,0x49,0x4a,0x58,0x16,0x16,0x6d,0x08,0x26,0x33,0x30,0x29,0x29,0x30,0x30, -0x01,0x7e,0xc5,0x10,0x15,0x4f,0x3e,0x44,0x54,0x54,0x44,0x21,0x3c,0x23,0xad,0xd5,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0xff,0xff,0x00,0x9a,0xff,0x7b,0x01,0xce,0x01,0x40,0x03,0x07,0x03,0x15,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0x76,0x01,0xd4, -0x01,0x40,0x03,0x07,0x03,0x16,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x84,0xff,0x76,0x01,0xc8,0x01,0x40,0x03,0x07,0x03,0x17,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x9a,0x00,0x00,0x01,0xce, -0x01,0xc5,0x03,0x07,0x03,0x15,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0xfb,0x01,0xd4,0x01,0xc5,0x03,0x07,0x03,0x16,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x84,0xff,0xfb,0x01,0xc8, -0x01,0xc5,0x03,0x07,0x03,0x17,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x9a,0x01,0x1a,0x01,0xce,0x02,0xdf,0x03,0x06,0x03,0x15,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x90,0x01,0x15,0x01,0xd4,0x02,0xdf,0x03,0x06, -0x03,0x16,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x84,0x01,0x15,0x01,0xc8,0x02,0xdf,0x03,0x06,0x03,0x17,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x9a,0x01,0x7e,0x01,0xce,0x03,0x43,0x00,0x1e,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03, -0x00,0x01,0x03,0x80,0x00,0x02,0x00,0x00,0x01,0x02,0x00,0x69,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x1e,0x00,0x1e,0x19,0x22,0x12,0x2a,0x06,0x09,0x1a,0x2b,0x13,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e, -0x04,0x15,0x33,0x15,0xa0,0x21,0x35,0x3a,0x35,0x21,0x2d,0x23,0x26,0x2e,0x48,0x56,0x46,0x43,0x55,0x22,0x34,0x3c,0x34,0x22,0xe7,0x01,0x7e,0x39,0x2f,0x3b,0x26,0x1b,0x1a,0x24,0x1c,0x20,0x27,0x2d,0x23,0x40,0x50,0x4a,0x3d,0x29,0x34,0x22,0x1a,0x1c,0x28,0x20,0x41,0x00,0x00,0x02,0x00,0x90,0x01,0x79,0x01,0xd4,0x03,0x43,0x00,0x1a, -0x00,0x26,0x00,0x4d,0x40,0x4a,0x12,0x01,0x05,0x06,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x08,0x01,0x05,0x00,0x00,0x05,0x59,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x05,0x00,0x51,0x1c,0x1b,0x01,0x00,0x22,0x20,0x1b,0x26,0x1c, -0x26,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x32,0x49,0x59,0x56,0x4c,0x44,0x56, -0x04,0x45,0x04,0x31,0x24,0x2b,0x32,0x01,0x16,0x54,0x41,0x53,0x59,0x49,0x29,0x32,0x32,0x2a,0x2a,0x32,0x33,0x01,0x79,0x54,0x43,0x94,0x4a,0x55,0x45,0x37,0x1b,0x23,0x34,0x2d,0x50,0x4c,0x4f,0x41,0x43,0x54,0x3f,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x79,0x01,0xc8,0x03,0x43,0x00,0x1a, -0x00,0x26,0x00,0x4c,0x40,0x49,0x0b,0x01,0x05,0x06,0x01,0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x08,0x01,0x05,0x00,0x03,0x01,0x05,0x03,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x02,0x00,0x51,0x1c,0x1b,0x01,0x00,0x22,0x20,0x1b,0x26,0x1c,0x26, -0x15,0x13,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x31,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x26,0x43,0x57,0x04,0x45,0x05,0x30,0x24, -0x2c,0x31,0x16,0x55,0x41,0x53,0x59,0x49,0x49,0x59,0x56,0x4b,0x2a,0x32,0x33,0x2a,0x29,0x32,0x32,0x01,0x79,0x44,0x34,0x18,0x21,0x34,0x2c,0x55,0x4c,0x4e,0x40,0x42,0x52,0x52,0x42,0x97,0x49,0x56,0xe0,0x2f,0x27,0x26,0x30,0x30,0x26,0x26,0x30,0x00,0xff,0xff,0x00,0x87,0xff,0x6c,0x01,0xd1,0x01,0x36,0x03,0x07,0x03,0x1b,0x00,0x00, -0xfd,0xf3,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfd,0xf3,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xfb,0x01,0xd1,0x01,0xc5,0x03,0x07,0x03,0x1b,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0x01,0x10,0x01,0xd1,0x02,0xda,0x03,0x06,0x03,0x1b,0x00,0x97, -0x00,0x09,0xb1,0x00,0x03,0xb8,0xff,0x97,0xb0,0x35,0x2b,0x00,0x00,0x03,0x00,0x87,0x01,0x79,0x01,0xd1,0x03,0x43,0x00,0x1b,0x00,0x29,0x00,0x37,0x00,0x3a,0x40,0x37,0x31,0x1d,0x15,0x07,0x04,0x03,0x02,0x01,0x4c,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x69,0x05,0x01,0x03,0x00,0x00,0x03,0x59,0x05,0x01,0x03,0x03,0x00,0x61,0x04,0x01, -0x00,0x03,0x00,0x51,0x2b,0x2a,0x01,0x00,0x2a,0x37,0x2b,0x37,0x25,0x23,0x0f,0x0d,0x00,0x1b,0x01,0x1b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x37,0x37,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x03,0x17,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15, -0x14,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x01,0x2c,0x49,0x5c,0x28,0x20,0x26,0x1a,0x1f,0x2a,0x56,0x44,0x44,0x56,0x25,0x1d,0x1c,0x20,0x22,0x27,0x5b,0x72,0x2a,0x2b,0x11,0x17,0x2f,0x26,0x25,0x30,0x1a,0x3b,0x2b,0x35,0x19,0x14,0x31,0x35,0x14,0x19,0x35,0x01,0x79,0x49,0x3a,0x1f,0x2d,0x0e, -0x10,0x0c,0x0e,0x2f,0x1b,0x36,0x43,0x43,0x36,0x1e,0x2e,0x0d,0x0c,0x0f,0x0f,0x2d,0x1e,0x3a,0x49,0x01,0x19,0x13,0x12,0x08,0x1c,0x13,0x1c,0x23,0x23,0x1c,0x12,0x1b,0xe4,0x25,0x1e,0x14,0x1e,0x09,0x17,0x17,0x08,0x1e,0x14,0x1e,0x26,0x00,0x00,0x00,0xff,0xff,0x00,0x8a,0xff,0x76,0x01,0xcc,0x01,0x3b,0x03,0x07,0x03,0x1f,0x00,0x00, -0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8a,0x01,0x15,0x01,0xcc,0x02,0xda,0x03,0x06,0x03,0x1f,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8a,0x01,0x10,0x01,0xcc,0x02,0xd5,0x03,0x06,0x03,0x1f,0x00,0x97,0x00,0x09,0xb1,0x00, -0x01,0xb8,0xff,0x97,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x8a,0x01,0x79,0x01,0xcc,0x03,0x3e,0x00,0x1e,0x00,0x50,0x40,0x4d,0x16,0x01,0x03,0x07,0x01,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x00,0x03,0x04,0x07,0x03,0x69,0x00,0x02,0x00, -0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x1a,0x18,0x15,0x14,0x13,0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1e,0x01,0x1e,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x11,0x21,0x15,0x23,0x15,0x36,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x01,0x2a,0x40,0x59,0x07,0x48,0x05,0x31,0x22,0x28,0x32,0x32,0x28,0x1b,0x29,0x0b,0x41,0x01,0x1c,0xd9,0x0d,0x34,0x22,0x3e,0x4e,0x5a,0x01,0x79,0x43,0x35,0x19,0x1f,0x33,0x25,0x26,0x32,0x1a,0x12,0x01,0x01,0x40,0x88,0x14,0x1a,0x53,0x40,0x42,0x56,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x02,0x53, -0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x00,0x00,0x00,0x38,0x4d,0x02,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x33,0x01,0x33,0x01,0x05,0x01,0xf9,0x55,0xfe,0x07,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x12,0x00,0x2e,0x00,0x6a, -0xb1,0x06,0x64,0x44,0x40,0x5f,0x0a,0x09,0x05,0x03,0x01,0x02,0x28,0x14,0x02,0x09,0x07,0x29,0x01,0x05,0x09,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85,0x00,0x07,0x06,0x09,0x06,0x07,0x09,0x80,0x03,0x01,0x01,0x00,0x00,0x08,0x01,0x00,0x68,0x00,0x08,0x00,0x06,0x07,0x08,0x06,0x69,0x00,0x09,0x05,0x05,0x09,0x57,0x00,0x09,0x09,0x05, -0x5f,0x0c,0x0a,0x0b,0x03,0x05,0x09,0x05,0x4f,0x13,0x13,0x00,0x00,0x13,0x2e,0x13,0x2e,0x2d,0x2b,0x22,0x20,0x1e,0x1d,0x1b,0x19,0x00,0x12,0x00,0x12,0x12,0x11,0x17,0x11,0x11,0x0d,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x33,0x01,0x23,0x35,0x33,0x35,0x06,0x06,0x07,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x13,0x33,0x01,0x33,0x35,0x37, -0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x15,0x36,0x36,0x33,0x33,0x15,0x05,0x01,0x18,0xff,0x76,0x04,0x12,0x0b,0x3e,0x46,0x55,0x6b,0xc3,0x55,0xfe,0x07,0xe1,0x78,0x46,0x24,0x1d,0x1d,0x24,0x3c,0x02,0x45,0x36,0x38,0x45,0x2d,0x29,0x5d,0x0b,0x2a,0x16,0x6d,0x01,0x95,0x32, -0xec,0x07,0x15,0x0a,0x36,0x46,0x3d,0xfe,0xed,0x07,0x01,0x1a,0xfd,0x26,0x40,0x45,0x28,0x2b,0x1d,0x23,0x23,0x1d,0x34,0x3e,0x3e,0x32,0x1f,0x3c,0x17,0x34,0x0a,0x02,0x06,0x32,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x12,0x00,0x1e,0x00,0x6a,0xb1,0x06,0x64,0x44,0x40,0x5f,0x0a,0x09,0x05,0x03,0x01,0x02, -0x0f,0x01,0x00,0x01,0x19,0x16,0x02,0x08,0x09,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85,0x00,0x07,0x00,0x09,0x00,0x07,0x09,0x80,0x03,0x01,0x01,0x00,0x00,0x07,0x01,0x00,0x68,0x00,0x09,0x08,0x05,0x09,0x57,0x00,0x08,0x00,0x06,0x05,0x08,0x06,0x68,0x00,0x09,0x09,0x05,0x5f,0x0c,0x0a,0x0b,0x03,0x05,0x09,0x05,0x4f,0x13,0x13,0x00, -0x00,0x13,0x1e,0x13,0x1e,0x1d,0x1c,0x1b,0x1a,0x18,0x17,0x15,0x14,0x00,0x12,0x00,0x12,0x12,0x11,0x17,0x11,0x11,0x0d,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x33,0x01,0x23,0x35,0x33,0x35,0x06,0x06,0x07,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x13,0x33,0x01,0x21,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15,0x05,0x01,0x18, -0xff,0x76,0x04,0x12,0x0b,0x3e,0x46,0x55,0x61,0xcd,0x55,0xfe,0x07,0x01,0x86,0xaf,0x7e,0x45,0x87,0x73,0x3c,0x01,0x95,0x32,0xec,0x07,0x15,0x0a,0x36,0x46,0x3d,0xfe,0xed,0x15,0x01,0x28,0xfd,0x26,0x46,0x50,0xaf,0xbd,0x10,0x59,0xd1,0x00,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x1a,0x00,0x1e,0x00,0x2a, -0x00,0xd3,0xb1,0x06,0x64,0x44,0x40,0x0d,0x15,0x14,0x0f,0x03,0x03,0x04,0x25,0x22,0x02,0x0a,0x0b,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x42,0x00,0x03,0x04,0x01,0x04,0x03,0x72,0x00,0x09,0x00,0x0b,0x00,0x09,0x0b,0x80,0x06,0x01,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x01,0x02,0x07,0x01,0x57,0x00,0x02,0x0d,0x01,0x00,0x09, -0x02,0x00,0x69,0x00,0x0b,0x0a,0x07,0x0b,0x57,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x68,0x00,0x0b,0x0b,0x07,0x60,0x0f,0x0c,0x0e,0x03,0x07,0x0b,0x07,0x50,0x1b,0x40,0x43,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x09,0x00,0x0b,0x00,0x09,0x0b,0x80,0x06,0x01,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x01,0x02,0x07,0x01,0x57, -0x00,0x02,0x0d,0x01,0x00,0x09,0x02,0x00,0x69,0x00,0x0b,0x0a,0x07,0x0b,0x57,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x68,0x00,0x0b,0x0b,0x07,0x60,0x0f,0x0c,0x0e,0x03,0x07,0x0b,0x07,0x50,0x59,0x40,0x29,0x1f,0x1f,0x1b,0x1b,0x01,0x00,0x1f,0x2a,0x1f,0x2a,0x29,0x28,0x27,0x26,0x24,0x23,0x21,0x20,0x1b,0x1e,0x1b,0x1e,0x1d,0x1c,0x13, -0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x10,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x13,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x21,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15, -0x9a,0x3a,0x46,0x3c,0x25,0x1f,0x1e,0x25,0x25,0x1d,0x1e,0x51,0x9c,0xd7,0x55,0x2d,0x38,0x46,0xce,0x01,0xf9,0x55,0xfe,0x07,0x01,0x86,0xaf,0x7e,0x45,0x87,0x73,0x3c,0x01,0x90,0x3a,0x2f,0x19,0x1e,0x1e,0x19,0x19,0x1e,0x39,0x3f,0x32,0x37,0x42,0x06,0x38,0x2a,0x2f,0x3a,0xfe,0x70,0x02,0xda,0xfd,0x26,0x46,0x50,0xaf,0xbd,0x10,0x59, -0xd1,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0x76,0x01,0xcf,0x01,0x40,0x03,0x07,0x03,0x02,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0x01,0x79,0x01,0xcf,0x03,0x43,0x02,0x06,0x03,0x02,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0xe4,0x01,0xcf,0x01,0xae,0x03,0x07, -0x03,0x02,0x00,0x00,0xfe,0x6b,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x6b,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x01,0x8b,0x01,0xc7,0x03,0x48,0x00,0x0d,0x00,0x1b,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00, -0x51,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x48,0x53,0x53,0x48,0x48,0x53,0x53,0x48,0x28,0x2d,0x2d,0x28,0x28, -0x2d,0x2d,0x01,0x8b,0x4f,0x46,0x94,0x45,0x4f,0x4f,0x45,0x94,0x46,0x4f,0x3f,0x2e,0x28,0x94,0x28,0x2d,0x2d,0x28,0x94,0x28,0x2e,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0xff,0xf6,0x02,0x0c,0x02,0x8a,0x00,0x15,0x00,0x22,0x00,0x32,0x40,0x2f,0x1f,0x0e,0x0b,0x08,0x04,0x03,0x01,0x01,0x4c,0x02,0x01,0x01,0x03,0x01,0x85,0x00,0x03,0x00, -0x00,0x03,0x59,0x00,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x03,0x00,0x51,0x01,0x00,0x1a,0x18,0x0d,0x0c,0x0a,0x09,0x00,0x15,0x01,0x15,0x05,0x06,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x27,0x33,0x17,0x37,0x33,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x07,0x06, -0x06,0x01,0x2c,0x43,0x63,0x36,0x2b,0x22,0x5b,0xac,0x68,0x79,0x79,0x66,0xac,0x5d,0x23,0x28,0x36,0x62,0xc6,0x46,0x3c,0x3c,0x46,0x30,0x52,0x53,0x16,0x19,0x0a,0x32,0x56,0x34,0x2e,0x51,0x28,0x69,0xc8,0x8b,0x8b,0xc7,0x6b,0x29,0x51,0x2c,0x34,0x56,0x32,0xc4,0x30,0x44,0x44,0x30,0x37,0x36,0x60,0x60,0x19,0x37,0x00,0x01,0x00,0xda, -0xff,0xf6,0x01,0x7e,0x00,0x98,0x00,0x0b,0x00,0x1a,0x40,0x17,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2d,0x2d,0x25,0x25,0x2d,0x2d,0x0a,0x2c,0x23,0x25,0x2e,0x2e,0x25, -0x23,0x2c,0x00,0x00,0x00,0x01,0x00,0xd2,0xff,0x60,0x01,0x75,0x00,0x92,0x00,0x03,0x00,0x35,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x3d,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x03, -0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x17,0x13,0x33,0x03,0xd2,0x37,0x6c,0x46,0xa0,0x01,0x32,0xfe,0xce,0x00,0x02,0x00,0xd9,0xff,0xf6,0x01,0x7f,0x02,0x30,0x00,0x0b,0x00,0x17,0x00,0x2d,0x40,0x2a,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x02,0x3f,0x02,0x4e,0x0d,0x0c,0x01, -0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x01,0x9c,0x28,0x22,0x22,0x28, -0x28,0x22,0x22,0x28,0xfe,0x5a,0x28,0x22,0x22,0x28,0x28,0x22,0x22,0x28,0x00,0x00,0x00,0x02,0x00,0xcd,0xff,0x60,0x01,0x81,0x02,0x30,0x00,0x0d,0x00,0x11,0x00,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x17,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40, -0x14,0x00,0x02,0x05,0x01,0x03,0x02,0x03,0x63,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x13,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x13,0x33,0x03,0x01,0x22, -0x21,0x2a,0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x69,0x37,0x6c,0x46,0x01,0x9a,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfd,0xc6,0x01,0x32,0xfe,0xce,0x00,0x00,0x00,0x00,0x03,0x00,0x3c,0xff,0xf6,0x02,0x1c,0x00,0xaa,0x00,0x0d,0x00,0x1b,0x00,0x29,0x00,0x30,0x40,0x2d,0x05,0x03,0x02,0x01,0x01,0x00,0x61,0x08,0x04,0x07,0x02,0x06, -0x05,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x0f,0x0e,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x33,0x22, -0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0xea,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0xfe,0x6d,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0xa7,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0x0a,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e, -0x1e,0x19,0x46,0x19,0x1e,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0xff,0xfb,0x01,0x77,0x02,0xda,0x00,0x03,0x00,0x11,0x00,0x2c,0x40,0x29,0x04,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x02,0x42,0x02,0x4e,0x05,0x04,0x00,0x00,0x0c,0x09,0x04,0x11,0x05,0x10,0x00,0x03,0x00,0x03,0x11, -0x06,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x03,0x0c,0x6a,0x0c,0x38,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xdc,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0xe1,0xff,0x4c,0x01,0x77,0x02,0x2b,0x00,0x0d, -0x00,0x11,0x00,0x2d,0x40,0x2a,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03, -0x13,0x33,0x13,0x01,0x1d,0x1a,0x22,0x22,0x1a,0x1e,0x1a,0x22,0x1f,0x1d,0x44,0x0c,0x52,0x0c,0x01,0xb3,0x22,0x1a,0x1a,0x22,0x23,0x1a,0x19,0x22,0xfd,0x99,0x02,0x03,0xfd,0xfd,0x00,0x00,0x00,0x02,0x00,0x82,0xff,0xfb,0x01,0xe5,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x70,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x26,0x07,0x01,0x04,0x03,0x06, -0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x06,0x06,0x05,0x61,0x08,0x01,0x05,0x05,0x42,0x05,0x4e,0x1b,0x40,0x27,0x07,0x01,0x04,0x03,0x06,0x03,0x04,0x06,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00, -0x06,0x06,0x05,0x61,0x08,0x01,0x05,0x05,0x42,0x05,0x4e,0x59,0x40,0x15,0x16,0x15,0x00,0x00,0x1d,0x1a,0x15,0x22,0x16,0x21,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x09,0x09,0x1a,0x2b,0x37,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33, -0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xce,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x3d,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0xdc,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0x73,0xff,0x4c,0x01,0xd6, -0x02,0x2b,0x00,0x0d,0x00,0x22,0x00,0x74,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x26,0x00,0x04,0x00,0x03,0x03,0x04,0x72,0x00,0x03,0x00,0x05,0x06,0x03,0x05,0x6a,0x07,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x01,0x02,0x02,0x3d,0x02,0x4e,0x1b,0x40,0x27,0x00,0x04,0x00,0x03,0x00,0x04,0x03,0x80, -0x00,0x03,0x00,0x05,0x06,0x03,0x05,0x6a,0x07,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x01,0x02,0x02,0x3d,0x02,0x4e,0x59,0x40,0x19,0x0f,0x0e,0x01,0x00,0x21,0x1f,0x1b,0x19,0x18,0x17,0x16,0x15,0x0e,0x22,0x0f,0x22,0x08,0x05,0x00,0x0d,0x01,0x0c,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35, -0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x4f,0x1c,0x20,0x22,0x1a,0x1e,0x1a,0x22,0x22,0x1a,0x14,0x46,0x67,0x39,0x30,0x55,0x38,0x5a,0x32,0x40,0x4b,0x4c,0x40,0x7d,0x01,0xb3,0x22,0x19,0x1a,0x23,0x22,0x1a, -0x1a,0x22,0xfd,0x99,0x35,0x61,0x41,0x3a,0x5a,0x36,0x03,0x5f,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x00,0x00,0xff,0xff,0x00,0xda,0x01,0x04,0x01,0x7e,0x01,0xa6,0x03,0x07,0x03,0x29,0x00,0x00,0x01,0x0e,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x0e,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0xf5,0x01,0xa4,0x01,0xe5,0x00,0x0b, -0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0xf5,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x00, -0x00,0x01,0x00,0x24,0x00,0x67,0x02,0x34,0x02,0x6c,0x00,0x2c,0x00,0x1b,0x40,0x18,0x29,0x25,0x24,0x20,0x1c,0x1b,0x17,0x0e,0x0a,0x09,0x05,0x01,0x0c,0x00,0x49,0x00,0x00,0x00,0x76,0x13,0x12,0x01,0x09,0x16,0x2b,0x37,0x27,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x37,0x17,0x16,0x16,0x17,0x26,0x26,0x35,0x35,0x33,0x15,0x14,0x06, -0x07,0x36,0x36,0x37,0x37,0x17,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x07,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0xb1,0x45,0x41,0x0d,0x2d,0x14,0x1c,0x3e,0x12,0x6b,0x1c,0x6c,0x11,0x38,0x17,0x05,0x05,0x54,0x06,0x05,0x18,0x37,0x12,0x6c,0x1c,0x6b,0x12,0x3e,0x1c,0x14,0x2e,0x0c,0x41,0x45,0x41,0x0c,0x22,0x0c,0x0c,0x22,0x0c,0x67, -0x31,0x5d,0x12,0x34,0x14,0x04,0x10,0x07,0x28,0x4f,0x28,0x06,0x1a,0x0e,0x1a,0x37,0x13,0x7d,0x7d,0x13,0x37,0x1a,0x0e,0x1a,0x06,0x28,0x4f,0x28,0x07,0x10,0x04,0x14,0x35,0x11,0x5d,0x31,0x5e,0x11,0x3c,0x1a,0x1a,0x3b,0x12,0x00,0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x0b,0x00,0x32,0x40,0x2f,0x00,0x00,0x00,0x01, -0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x06,0x01,0x05,0x04,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x17,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0xcd,0xf5,0x9b,0x9b,0x9b,0x96,0x6e,0x03, -0xac,0x50,0xfe,0xb1,0x50,0xfe,0x93,0x50,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x0b,0x00,0x2c,0x40,0x29,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x11,0x11,0x10,0x06,0x09, -0x1c,0x2b,0x05,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x8b,0xf0,0x96,0x9b,0x9b,0x9b,0xf5,0x6e,0x50,0x01,0x6d,0x50,0x01,0x4f,0x50,0x00,0x00,0x00,0x02,0x00,0x7d,0xff,0x92,0x01,0xdb,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04, -0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x7d,0x5a,0xaa,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x00,0xff,0xff,0x00,0x69,0xff,0xfb,0x01,0xef,0x02,0xda,0x00,0x26,0x03,0x2e,0x88,0x00,0x00,0x06,0x03,0x2e,0x78,0x00,0x00,0x00, -0x00,0x02,0x00,0x87,0xff,0xfb,0x01,0xea,0x02,0xda,0x00,0x16,0x00,0x24,0x00,0x3f,0x40,0x3c,0x15,0x05,0x02,0x03,0x00,0x01,0x4c,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x06,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x00,0x05,0x05,0x04,0x61,0x07,0x01,0x04,0x04,0x42,0x04,0x4e,0x18,0x17,0x00,0x00,0x1f,0x1c, -0x17,0x24,0x18,0x23,0x00,0x16,0x00,0x16,0x21,0x27,0x12,0x08,0x09,0x19,0x2b,0x37,0x27,0x35,0x33,0x15,0x07,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xdf,0x0d,0x5a,0x03,0x30,0x37,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39, -0x6a,0x5b,0x06,0x2f,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xcd,0xf5,0x64,0x64,0x3e,0x0a,0x43,0x32,0x3b,0x47,0x55,0x35,0x60,0x42,0x57,0x6e,0x07,0x6a,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x1b,0x00,0x1f,0x00,0x47,0x40,0x44,0x07,0x05,0x02,0x03,0x0f,0x08, -0x02,0x02,0x01,0x03,0x02,0x68,0x0e,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x0b,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x10,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x00,0x00,0x1f,0x1e,0x1d,0x1c,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x1f,0x2b,0x33, -0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x53,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xd2,0x41,0xb4,0x41,0xd2, -0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xff,0xff,0x00,0xda,0xff,0xf6,0x01,0x7e,0x00,0x98,0x02,0x06,0x03,0x29,0x00,0x00,0x00,0x01,0xff,0xf6,0x02,0xee,0x02,0x62,0x03,0x3e,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01, -0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x03,0x35,0x21,0x15,0x0a,0x02,0x6c,0x02,0xee,0x50,0x50,0x00,0x00,0x01,0x00,0x4b,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17, -0x2b,0x17,0x01,0x33,0x01,0x4b,0x01,0x63,0x5f,0xfe,0x9d,0x6e,0x03,0xac,0xfc,0x54,0x00,0x01,0x00,0x4b,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x01,0x33,0x01,0x01,0xae,0xfe,0x9d,0x5f,0x01,0x63, -0x6e,0x03,0xac,0xfc,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0xff,0x4c,0x02,0x4e,0x00,0x00,0x00,0x0f,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x02,0x00,0x5f,0x04,0x01,0x00,0x00,0x3d,0x00,0x4e,0x01,0x00,0x0c,0x0b,0x09,0x06,0x04,0x03,0x00,0x0f,0x01,0x0e,0x05,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x33,0x14, -0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xb4,0x4e,0x5c,0x5a,0x31,0x29,0xdc,0x29,0x31,0x5a,0x5c,0x4e,0xb4,0x61,0x53,0x2e,0x36,0x36,0x2e,0x53,0x61,0x00,0x00,0x02,0x00,0xd9,0x00,0x46,0x01,0x7f,0x02,0x80,0x00,0x0b,0x00,0x17,0x00,0x30,0x40,0x2d,0x00,0x01,0x04,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x02,0x02,0x03, -0x59,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x03,0x02,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d, -0x2d,0x26,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x01,0xea,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xfe,0x5c,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0xff,0xff,0xff,0x1a,0x01,0x09,0xff,0xbe,0x01,0xab,0x01,0x07,0x03,0x29,0xfe,0x40,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00, -0xff,0xff,0xff,0x79,0x01,0x09,0x00,0x1d,0x01,0xab,0x01,0x07,0x03,0x29,0xfe,0x9f,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xb9,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x11,0x00,0x06,0xb3,0x07,0x00,0x01,0x32,0x2b,0x05,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x0e,0x02,0x15, -0x15,0x14,0x16,0x16,0x17,0x01,0xe5,0x8f,0x9d,0x9d,0x8f,0x40,0x5f,0x33,0x33,0x5f,0x40,0x78,0x20,0xcc,0x9a,0xb4,0x9a,0xcc,0x20,0x57,0x0f,0x54,0x7d,0x4f,0xb4,0x4e,0x7e,0x54,0x0f,0x00,0x00,0x01,0x00,0x73,0xff,0x88,0x01,0x9f,0x03,0x48,0x00,0x11,0x00,0x06,0xb3,0x0b,0x00,0x01,0x32,0x2b,0x17,0x35,0x3e,0x02,0x35,0x35,0x34,0x26, -0x26,0x27,0x35,0x16,0x16,0x15,0x15,0x14,0x06,0x73,0x41,0x5e,0x33,0x33,0x5e,0x41,0x8f,0x9d,0x9d,0x78,0x57,0x0f,0x54,0x7e,0x4e,0xb4,0x4f,0x7d,0x54,0x0f,0x57,0x20,0xcc,0x9a,0xb4,0x9a,0xcc,0x00,0x00,0x00,0x00,0x01,0x00,0x4b,0xff,0x92,0x01,0xf9,0x03,0x3e,0x00,0x24,0x00,0x3d,0x40,0x3a,0x1b,0x01,0x01,0x02,0x01,0x4c,0x00,0x03, -0x00,0x04,0x02,0x03,0x04,0x69,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x00,0x05,0x59,0x00,0x05,0x05,0x00,0x61,0x06,0x01,0x00,0x05,0x00,0x51,0x01,0x00,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36, -0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0xcc,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x05,0x42,0x4b,0x4b,0x42,0x05,0x0f,0x04,0x34,0x2f,0x2d,0x6e,0x57,0x4f,0xa4,0x35, -0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x3b,0x47,0x07,0x07,0x4e,0x3a,0xa4,0x2b,0x2b,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x5f,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x26,0x00,0x38,0x40,0x35,0x09,0x01,0x04,0x03,0x01,0x4c,0x00,0x02,0x00,0x01,0x03,0x02,0x01,0x69,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x00, -0x05,0x05,0x00,0x59,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05,0x00,0x05,0x51,0x00,0x00,0x00,0x26,0x00,0x25,0x21,0x26,0x21,0x2c,0x21,0x07,0x09,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17, -0x17,0x16,0x06,0x06,0x23,0x5f,0x2d,0x2f,0x37,0x07,0x19,0x09,0x3a,0x33,0x33,0x3a,0x09,0x19,0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x6e,0x50,0x2b,0x2b,0xa4,0x39,0x4f,0x09,0x08,0x46,0x39,0xa4,0x2b,0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f, -0x35,0xa4,0x34,0x4b,0x27,0x00,0x00,0x00,0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x17,0x11, -0x33,0x15,0x23,0x11,0x33,0x15,0xcd,0xf5,0x9b,0x9b,0x6e,0x03,0xac,0x50,0xfc,0xf4,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00, -0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x17,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x96,0x9b,0x9b,0xf5,0x6e,0x50,0x03,0x0c,0x50,0xfc,0x54,0x00,0x00,0x00,0xff,0xff,0x00,0x4b,0xff,0x92,0x01,0xf9,0x03,0x3e,0x02,0x06,0x03,0x45,0x00,0x00,0xff,0xff,0x00,0x5f,0xff,0x92,0x02,0x0d,0x03,0x3e,0x02,0x06,0x03,0x46,0x00,0x00, -0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xef,0x02,0xda,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x33,0x03,0x13,0x33,0x03,0x13,0xf3,0x85,0x85,0xfc,0x85,0x85,0x01,0x6b,0x01,0x6f,0xfe,0x93,0xfe,0x93, -0x00,0x01,0x00,0x96,0x00,0x00,0x01,0xc5,0x02,0xda,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x01,0x1d,0x87,0x87,0xa8,0x87,0x87,0x01,0x6b,0x01,0x6f,0xfe,0x93,0xfe, -0x93,0x00,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x01,0xea,0x02,0xda,0x00,0x05,0x00,0x18,0x40,0x15,0x05,0x02,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x12,0x10,0x02,0x06,0x18,0x2b,0x21,0x23,0x13,0x03,0x33,0x13,0x01,0x65,0xfc,0x85,0x85,0xfc,0x85,0x01,0x6d,0x01,0x6d,0xfe,0x91,0x00,0x00,0x00, -0x00,0x01,0x00,0x93,0x00,0x00,0x01,0xc2,0x02,0xda,0x00,0x05,0x00,0x18,0x40,0x15,0x05,0x02,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x12,0x10,0x02,0x06,0x18,0x2b,0x21,0x23,0x13,0x03,0x33,0x13,0x01,0x3b,0xa8,0x87,0x87,0xa8,0x87,0x01,0x6d,0x01,0x6d,0xfe,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0xcd, -0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x15,0x23,0x11,0xcd,0xf5,0x9b,0x6e,0x03,0xac,0x50,0xfc,0xa4,0x00,0x00,0x00, -0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x11,0x33,0x15,0xcd,0x5a,0x9b,0x6e,0x03,0xac,0xfc,0xa4, -0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x87,0xff,0x92,0x01,0xea,0x03,0x48,0x00,0x26,0x00,0x5c,0x4b,0xb0,0x0e,0x50,0x58,0x40,0x20,0x05,0x01,0x04,0x03,0x01,0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x1b,0x40,0x21,0x05,0x01,0x04,0x03, -0x01,0x03,0x04,0x01,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x59,0x40,0x0d,0x00,0x00,0x00,0x26,0x00,0x26,0x2c,0x21,0x2b,0x23,0x06,0x06,0x1a,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33, -0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0xb9,0x54,0x46,0x45,0x52,0x22,0x14,0x79,0x36,0x24,0x41,0x37,0x87,0x87,0x5f,0x73,0x09,0x21,0x25,0x85,0x21,0x14,0x1e,0x1f,0x1c,0x24,0x02,0x9c,0x1b,0x42,0x4f,0x4e,0x41,0x2b,0x53,0x21,0xca,0x5a,0x6e,0x25,0x3c,0x45,0x50, -0x70,0x5f,0x10,0x43,0x61,0x3b,0xd6,0x35,0x49,0x13,0x1a,0x27,0x24,0x1d,0x1b,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06, -0x18,0x2b,0x05,0x11,0x23,0x35,0x33,0x11,0x01,0x31,0x9b,0xf5,0x6e,0x03,0x5c,0x50,0xfc,0x54,0x00,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05, -0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x35,0x33,0x11,0x33,0x11,0x96,0x9b,0x5a,0x6e,0x50,0x03,0x5c,0xfc,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x78,0xff,0x92,0x01,0xdb,0x03,0x48,0x00,0x26,0x00,0x54,0x4b,0xb0,0x0e,0x50,0x58,0x40,0x1f,0x00,0x00,0x01,0x03,0x01,0x00,0x72,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x69,0x00,0x03,0x02,0x02, -0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x1b,0x40,0x20,0x00,0x00,0x01,0x03,0x01,0x00,0x03,0x80,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x69,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x59,0xb7,0x2b,0x21,0x2c,0x23,0x10,0x05,0x06,0x1b,0x2b,0x01,0x23,0x35,0x34,0x26,0x23, -0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x01,0xa9,0x5a,0x23,0x1d,0x1f,0x1e,0x14,0x21,0x85,0x25,0x21,0x09,0x73,0x5f,0x87,0x87,0x37,0x41,0x24,0x36,0x79,0x14,0x22,0x52,0x45,0x46,0x54,0x02,0x9c,0x1b,0x1d, -0x24,0x27,0x1a,0x13,0x49,0x35,0xd6,0x3b,0x61,0x43,0x10,0x5f,0x70,0x50,0x45,0x3c,0x25,0x6e,0x5a,0xca,0x21,0x53,0x2b,0x41,0x4e,0x4f,0x42,0x00,0x00,0x02,0x00,0xa0,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x09,0x00,0x11,0x00,0x08,0xb5,0x0b,0x0a,0x09,0x00,0x02,0x32,0x2b,0x05,0x2e,0x02,0x35,0x35,0x34,0x36,0x36,0x37,0x03,0x11,0x06, -0x06,0x15,0x15,0x14,0x16,0x01,0xe5,0x62,0x93,0x50,0x50,0x93,0x62,0x55,0x46,0x50,0x50,0x78,0x10,0x6b,0xa5,0x66,0xb4,0x67,0xa4,0x6b,0x10,0xfc,0xb3,0x02,0xde,0x24,0x92,0x61,0xb4,0x5f,0x91,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0xff,0x88,0x01,0xb8,0x03,0x48,0x00,0x09,0x00,0x11,0x00,0x08,0xb5,0x11,0x0a,0x01,0x00,0x02,0x32,0x2b, -0x17,0x11,0x1e,0x02,0x15,0x15,0x14,0x06,0x06,0x27,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x73,0x63,0x92,0x50,0x50,0x92,0x0e,0x46,0x50,0x50,0x46,0x78,0x03,0xc0,0x10,0x6b,0xa4,0x67,0xb4,0x66,0xa5,0x6b,0x63,0x23,0x91,0x5f,0xb4,0x61,0x92,0x24,0x00,0x00,0x01,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b, -0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x8c,0x01,0x40,0x01,0x22,0x50,0x50,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x50,0x01,0x22,0x02,0x08, -0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x50,0x01,0xb8,0x01,0x22,0x50,0x50,0x00,0x00,0x01,0x00,0x00,0x01,0x22,0x02,0x58,0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b, -0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0x01,0x22,0x50,0x50,0x00,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x9c,0x02,0x1c, -0xff,0xe7,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x17,0x35,0x21,0x15,0x3c,0x01,0xe0,0x64,0x4b,0x4b,0x00,0x00,0x00,0x01,0x00,0xdc,0xff,0x60,0x01,0x86, -0x00,0x91,0x00,0x0f,0x00,0x35,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x3d,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x0f,0x00,0x0f,0x17,0x03,0x09,0x17,0x2b,0x17,0x37,0x36,0x36,0x35, -0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0xdc,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0xa0,0x7b,0x14,0x2a,0x0f,0x1d,0x39,0x13,0x14,0x38,0x1d,0x14,0x38,0x19,0x63,0x00,0x00,0xff,0xff,0x00,0x69,0xff,0x60,0x02,0x05,0x00,0x91,0x00,0x26,0x03,0x5d,0x8d,0x00,0x00,0x06,0x03,0x5d,0x7f,0x00,0x00,0x00, -0x00,0x02,0x00,0x69,0x01,0xa9,0x01,0xed,0x02,0xda,0x00,0x0f,0x00,0x1f,0x00,0x24,0x40,0x21,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x01,0x38,0x00,0x4e,0x10,0x10,0x00,0x00,0x10,0x1f,0x10,0x1f,0x18,0x17,0x00,0x0f,0x00,0x0f,0x17,0x06,0x09,0x17,0x2b,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35, -0x34,0x36,0x37,0x37,0x23,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0xed,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0x76,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0x02,0xda,0x7b,0x13,0x2b,0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0x7b,0x13,0x2b, -0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0x00,0xff,0xff,0x00,0x69,0x01,0xaf,0x01,0xef,0x02,0xe0,0x00,0x27,0x03,0x5d,0xff,0x8d,0x02,0x4f,0x01,0x07,0x03,0x5d,0x00,0x69,0x02,0x4f,0x00,0x12,0xb1,0x00,0x01,0xb8,0x02,0x4f,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x4f,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0xd2, -0x01,0xa9,0x01,0x7c,0x02,0xda,0x00,0x0f,0x00,0x19,0x40,0x16,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x38,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x17,0x03,0x09,0x17,0x2b,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0x7c,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d, -0x02,0xda,0x7b,0x13,0x2b,0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0xff,0xff,0x00,0xdc,0x01,0xa9,0x01,0x86,0x02,0xda,0x03,0x07,0x03,0x5d,0x00,0x00,0x02,0x49,0x00,0x09,0xb1,0x00,0x01,0xb8,0x02,0x49,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xd2,0x01,0xa9,0x01,0x7c,0x02,0xda,0x00,0x0f,0x00,0x13,0x40,0x10, -0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x00,0x4e,0x17,0x10,0x02,0x09,0x18,0x2b,0x01,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x7c,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0x01,0xa9,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x00,0x00,0x00, -0x00,0x02,0x00,0x69,0x01,0xa9,0x01,0xef,0x02,0xda,0x00,0x0f,0x00,0x1f,0x00,0x17,0x40,0x14,0x02,0x01,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x00,0x4e,0x17,0x17,0x17,0x10,0x04,0x09,0x1a,0x2b,0x01,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37, -0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0xef,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0xa4,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0x01,0xa9,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x7b,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x00,0x00,0x00, -0x00,0x02,0x00,0x1e,0x00,0x28,0x02,0x33,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x33,0x40,0x30,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x06, -0x09,0x17,0x2b,0x25,0x27,0x37,0x33,0x07,0x17,0x21,0x27,0x37,0x33,0x07,0x17,0x01,0xcc,0xc0,0xbf,0x68,0xc4,0xc4,0xfe,0xab,0xc0,0xbf,0x6a,0xc4,0xc4,0x28,0xf0,0xf0,0xee,0xf2,0xf0,0xf0,0xee,0xf2,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x28,0x02,0x3a,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x33,0x40,0x30,0x0a,0x07,0x04,0x01,0x04,0x01, -0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x25,0x37,0x27,0x33,0x17,0x07,0x21,0x37,0x27,0x33,0x17,0x07,0x01,0x12,0xc0,0xc1,0x69,0xc0,0xbf,0xfe,0xab, -0xc0,0xc1,0x67,0xc0,0xbf,0x28,0xf1,0xef,0xf0,0xf0,0xf1,0xef,0xf0,0xf0,0x00,0x00,0x00,0x01,0x00,0x93,0x00,0x28,0x01,0xc6,0x02,0x08,0x00,0x05,0x00,0x25,0x40,0x22,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03, -0x09,0x17,0x2b,0x25,0x27,0x37,0x33,0x07,0x17,0x01,0x5d,0xca,0xca,0x66,0xcc,0xcf,0x28,0xf0,0xf0,0xee,0xf2,0x00,0x00,0x00,0x00,0x01,0x00,0x93,0x00,0x28,0x01,0xc6,0x02,0x08,0x00,0x05,0x00,0x25,0x40,0x22,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f, -0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x09,0x17,0x2b,0x37,0x37,0x27,0x33,0x17,0x07,0x96,0xcc,0xcf,0x69,0xca,0xca,0x28,0xee,0xf2,0xf0,0xf0,0xff,0xff,0x00,0x14,0x01,0xa3,0x02,0x44,0x02,0xd5,0x00,0x27,0x03,0x2a,0xff,0x42,0x02,0x43,0x00,0x27,0x03,0x2a,0x00,0x09,0x02,0x43,0x01,0x07,0x03,0x2a,0x00,0xcf,0x02,0x43,0x00,0x1b, -0xb1,0x00,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0xb1,0x02,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8f,0x01,0xae,0x01,0xc9,0x02,0xda,0x00,0x26,0x03,0x6b,0x96,0x00,0x00,0x06,0x03,0x6b,0x6a,0x00,0x00,0x00,0x00,0x01,0x00,0xf9,0x01,0xae,0x01,0x5f,0x02,0xda,0x00,0x03, -0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x03,0x33,0x03,0x01,0x01,0x08,0x66,0x07,0x01,0xae,0x01,0x2c,0xfe,0xd4,0x00,0x00,0x00,0x02,0xfe,0x34,0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01, -0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x2d,0x01,0x9f,0xfc,0x68,0x01,0x9f,0x01,0x22,0x50,0x50,0x50,0x50,0x00,0x00,0x03,0xfb,0xdc, -0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11, -0x09,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x0f,0x01,0xbd,0xfa,0x10,0x01,0xbd,0x5f,0x01,0xb8,0x01,0x22,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x02,0xf9,0x4d,0xff,0x74,0x01,0xf4,0x03,0x20,0x00,0x29,0x00,0x50,0x00,0x84,0xb5,0x33,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58, -0x40,0x24,0x0b,0x05,0x02,0x02,0x0c,0x06,0x02,0x01,0x00,0x02,0x01,0x67,0x08,0x01,0x00,0x0f,0x0d,0x0e,0x03,0x07,0x00,0x07,0x65,0x09,0x01,0x03,0x03,0x04,0x61,0x0a,0x01,0x04,0x04,0x40,0x03,0x4e,0x1b,0x40,0x2b,0x0a,0x01,0x04,0x09,0x01,0x03,0x02,0x04,0x03,0x69,0x0b,0x05,0x02,0x02,0x0c,0x06,0x02,0x01,0x00,0x02,0x01,0x67,0x08, -0x01,0x00,0x07,0x07,0x00,0x59,0x08,0x01,0x00,0x00,0x07,0x61,0x0f,0x0d,0x0e,0x03,0x07,0x00,0x07,0x51,0x59,0x40,0x20,0x2a,0x2a,0x00,0x00,0x2a,0x50,0x2a,0x4f,0x49,0x47,0x46,0x44,0x3e,0x3c,0x3b,0x39,0x2d,0x2b,0x00,0x29,0x00,0x28,0x21,0x26,0x21,0x26,0x11,0x16,0x21,0x10,0x09,0x1d,0x2b,0x05,0x35,0x33,0x32,0x36,0x27,0x27,0x26, -0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x06,0x23,0x21,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15, -0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x06,0x23,0xfe,0x34,0x2d,0x2f,0x37,0x07,0x19,0x04,0x0c,0x0f,0xfa,0x8f,0x05,0x75,0x11,0x0f,0x05,0x19,0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x01,0xe5,0x2d,0x2f,0x37,0x07,0x19,0x09,0x3a,0x33,0x33,0x3a,0x09,0x19, -0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x8c,0x50,0x2b,0x2b,0xa4,0x1e,0x33,0x13,0x50,0x11,0x33,0x20,0xa4,0x2b,0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x34,0x4b,0x27,0x50,0x2b,0x2b,0xa4,0x39,0x4f,0x09,0x08,0x46,0x39,0xa4,0x2b, -0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x34,0x4b,0x27,0x00,0x00,0x01,0xfb,0xa6,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0c,0x00,0x2a,0x40,0x27,0x02,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x03,0x00,0x85,0x00,0x01,0x02,0x01,0x86,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x60,0x00,0x02,0x03,0x02,0x50, -0x11,0x13,0x12,0x10,0x04,0x09,0x1a,0x2b,0x13,0x33,0x13,0x03,0x23,0x37,0x36,0x37,0x21,0x35,0x21,0x26,0x27,0xbc,0x6a,0xe7,0xe8,0x69,0xbe,0x08,0x08,0xfa,0x1c,0x05,0xe4,0x0a,0x0a,0x02,0x71,0xfe,0xd9,0xfe,0xd9,0xef,0x0a,0x06,0x50,0x08,0x0c,0x00,0x00,0x01,0xfe,0x5c,0xff,0xab,0x01,0x59,0x02,0xee,0x00,0x07,0x00,0x47,0x4b,0xb0, -0x18,0x50,0x58,0x40,0x14,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x04,0x01,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x03,0x4e,0x1b,0x40,0x19,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11, -0x11,0x05,0x09,0x19,0x2b,0x17,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xff,0xfd,0x5d,0x02,0xa3,0x5a,0x55,0x01,0x77,0x50,0x01,0x7c,0xfc,0xbd,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0e,0x00,0x2a,0x40,0x27,0x02,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x03,0x00,0x85,0x00,0x01,0x02,0x01,0x86,0x00,0x03,0x02,0x02, -0x03,0x57,0x00,0x03,0x03,0x02,0x60,0x00,0x02,0x03,0x02,0x50,0x11,0x23,0x12,0x10,0x04,0x09,0x1a,0x2b,0x13,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0xbc,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfc,0x76,0x03,0x8a,0x04,0x08,0x05,0x02,0x71,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0x50,0x05,0x0a, -0x05,0x00,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0e,0x00,0x1a,0x00,0x3c,0x40,0x39,0x19,0x13,0x0d,0x03,0x00,0x01,0x01,0x4c,0x04,0x01,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x68,0x04,0x01,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x0f,0x0f,0x00,0x00,0x0f, -0x1a,0x0f,0x1a,0x18,0x17,0x00,0x0e,0x00,0x0e,0x14,0x11,0x23,0x08,0x09,0x19,0x2b,0x27,0x37,0x36,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x33,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x70,0xbe,0x03,0x07,0x03,0xfb,0x4a,0x04,0xb6,0x04,0x08,0x05,0xba,0x6a,0xe7,0xe8,0xc3,0xbe,0x13,0x1a,0x05, -0x05,0x1c,0x15,0xba,0x6a,0xe7,0xe8,0x23,0xef,0x04,0x08,0x04,0x50,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0a,0x00,0x2e,0x40,0x2b,0x08,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x03,0x02,0x57, -0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x0a,0x00,0x0a,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x25,0x27,0x21,0x35,0x21,0x37,0x33,0x07,0x07,0x17,0x17,0x01,0x8a,0xc8,0xfd,0x3b,0x02,0xc5,0xc9,0x69,0xbe,0x2e,0x32,0xba,0x23,0xff,0x50,0xff,0xef,0x37,0x3d,0xeb, -0x00,0x02,0xfb,0xa5,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0a,0x00,0x12,0x00,0x3c,0x40,0x39,0x10,0x0c,0x08,0x03,0x00,0x01,0x01,0x4c,0x04,0x01,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x0b,0x0b,0x00,0x00,0x0b,0x12,0x0b,0x12,0x0e, -0x0d,0x00,0x0a,0x00,0x0a,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x37,0x27,0x21,0x35,0x21,0x37,0x33,0x07,0x07,0x17,0x17,0x33,0x03,0x13,0x33,0x07,0x07,0x17,0x17,0x5e,0xc8,0xfc,0x0f,0x03,0xf1,0xc9,0x69,0xbe,0x2e,0x32,0xba,0xc2,0xe7,0xe8,0x69,0xbe,0x2e,0x32,0xba,0x23,0xff,0x50,0xff,0xef,0x37,0x3d,0xeb,0x01,0x27,0x01,0x27,0xef, -0x37,0x3d,0xeb,0x00,0x00,0x01,0xfe,0x11,0x00,0xdc,0x01,0xef,0x01,0xb8,0x00,0x1d,0x00,0x6e,0x4b,0xb0,0x11,0x50,0x58,0x40,0x22,0x00,0x04,0x00,0x06,0x03,0x04,0x06,0x69,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x03,0x03,0x00,0x61,0x05,0x07,0x02,0x00,0x03,0x00,0x51,0x1b,0x40,0x29,0x00,0x05, -0x01,0x00,0x01,0x05,0x00,0x80,0x00,0x04,0x00,0x06,0x03,0x04,0x06,0x69,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x59,0x40,0x15,0x01,0x00,0x19,0x17,0x14,0x13,0x10,0x0e,0x0a,0x08,0x05,0x04,0x03,0x02,0x00,0x1d,0x01,0x1d,0x08,0x09,0x16,0x2b, -0x37,0x22,0x27,0x21,0x35,0x21,0x15,0x14,0x16,0x33,0x32,0x3e,0x03,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x03,0x64,0x62,0x27,0xfe,0x36,0x02,0x0d,0x27,0x1f,0x1a,0x27,0x23,0x29,0x39,0x2a,0x46,0x55,0x55,0x26,0x20,0x1b,0x27,0x24,0x29,0x38,0xdc,0x46,0x50,0x05,0x22,0x24,0x1d,0x2b,0x2c,0x1d,0x50,0x41,0x3c, -0x3c,0x20,0x26,0x1d,0x2b,0x2c,0x1d,0x00,0xff,0xff,0xfe,0x0c,0xff,0x92,0x01,0xcc,0x03,0x3e,0x00,0x27,0x03,0x45,0xfd,0xc1,0x00,0x00,0x00,0x06,0x03,0x45,0xd3,0x00,0x00,0x03,0xf9,0x7f,0xff,0x74,0x02,0x03,0x03,0x20,0x00,0x24,0x00,0x4a,0x00,0x4f,0x00,0x8d,0xb7,0x4e,0x4d,0x1b,0x03,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58, -0x40,0x24,0x0b,0x08,0x02,0x02,0x0c,0x07,0x02,0x01,0x05,0x02,0x01,0x67,0x0d,0x01,0x05,0x0f,0x06,0x0e,0x03,0x00,0x05,0x00,0x65,0x0a,0x01,0x04,0x04,0x03,0x61,0x09,0x01,0x03,0x03,0x40,0x04,0x4e,0x1b,0x40,0x2b,0x09,0x01,0x03,0x0a,0x01,0x04,0x02,0x03,0x04,0x69,0x0b,0x08,0x02,0x02,0x0c,0x07,0x02,0x01,0x05,0x02,0x01,0x67,0x0d, -0x01,0x05,0x00,0x00,0x05,0x59,0x0d,0x01,0x05,0x05,0x00,0x61,0x0f,0x06,0x0e,0x03,0x00,0x05,0x00,0x51,0x59,0x40,0x27,0x26,0x25,0x01,0x00,0x49,0x47,0x42,0x41,0x40,0x3f,0x3a,0x38,0x37,0x35,0x30,0x2e,0x2d,0x2b,0x25,0x4a,0x26,0x4a,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x10,0x09,0x16,0x2b,0x05, -0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x21,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x07,0x21, -0x15,0x21,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0x16,0x17,0x35,0x06,0xfb,0x00,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x05,0x42,0x4b,0x4b,0x42,0x05,0x0f,0x04,0x34,0x2f,0x2d,0x01,0xe8,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05, -0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x06,0x27,0x05,0x5f,0xfa,0xa3,0x25,0x06,0x0f,0x04,0x34,0x2f,0x2d,0xfe,0xfb,0x17,0x14,0x14,0x8c,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x3b,0x47,0x07,0x07,0x4e,0x3a,0xa4,0x2b,0x2b,0x50,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f, -0x57,0x50,0x2b,0x2b,0xa4,0x41,0x23,0x50,0x25,0x3f,0xa4,0x2b,0x2b,0x50,0x01,0xd9,0x02,0x06,0x0f,0x05,0x00,0x05,0xf9,0x7f,0xff,0x74,0x02,0x03,0x03,0x20,0x00,0x25,0x00,0x29,0x00,0x2d,0x00,0x32,0x00,0x40,0x00,0xaf,0xb6,0x30,0x2e,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x36,0x0a,0x05,0x02,0x02,0x10,0x0b,0x06, -0x03,0x01,0x09,0x02,0x01,0x67,0x00,0x07,0x0e,0x01,0x00,0x07,0x00,0x65,0x00,0x04,0x04,0x03,0x61,0x00,0x03,0x03,0x40,0x4d,0x0f,0x01,0x09,0x09,0x08,0x5f,0x00,0x08,0x08,0x38,0x4d,0x00,0x0d,0x0d,0x0c,0x61,0x11,0x01,0x0c,0x0c,0x42,0x0c,0x4e,0x1b,0x40,0x34,0x00,0x03,0x00,0x04,0x02,0x03,0x04,0x69,0x0a,0x05,0x02,0x02,0x10,0x0b, -0x06,0x03,0x01,0x09,0x02,0x01,0x67,0x00,0x07,0x0e,0x01,0x00,0x07,0x00,0x65,0x0f,0x01,0x09,0x09,0x08,0x5f,0x00,0x08,0x08,0x38,0x4d,0x00,0x0d,0x0d,0x0c,0x61,0x11,0x01,0x0c,0x0c,0x42,0x0c,0x4e,0x59,0x40,0x2f,0x34,0x33,0x2a,0x2a,0x26,0x26,0x01,0x00,0x3b,0x38,0x33,0x40,0x34,0x3f,0x2a,0x2d,0x2a,0x2d,0x2c,0x2b,0x26,0x29,0x26, -0x29,0x28,0x27,0x24,0x22,0x1d,0x1c,0x1b,0x1a,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x25,0x01,0x25,0x12,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x07,0x21,0x15,0x21,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01, -0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x25,0x16,0x17,0x35,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfb,0x00,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x06,0x27,0x01,0x25,0xfe,0xdd,0x25,0x06,0x0f,0x04,0x34,0x2f,0x2d,0x01, -0x28,0x0c,0x6a,0x0c,0x9d,0x04,0xbf,0xf8,0x25,0x0e,0x0c,0x0c,0x02,0x39,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0x8c,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x41,0x23,0x50,0x25,0x3f,0xa4,0x2b,0x2b,0x50,0x01,0x63,0x02,0x03,0xfd,0xfd,0x4b,0x50,0x50,0x2b,0x01,0x03,0x08,0x02,0xfe,0xac, -0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0xff,0xff,0xfc,0x09,0xff,0x92,0x01,0x40,0x03,0x3e,0x00,0x27,0x03,0x45,0xfb,0xbe,0x00,0x00,0x00,0x27,0x03,0x2e,0xfd,0xf3,0x00,0x00,0x00,0x06,0x03,0x2e,0xc9,0x00,0x00,0x02,0xfe,0x43,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x24,0x00,0x28,0x00,0x48,0x40,0x45,0x1b,0x01,0x01,0x02,0x01,0x4c, -0x06,0x01,0x03,0x00,0x04,0x02,0x03,0x04,0x67,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x09,0x07,0x08,0x03,0x00,0x05,0x00,0x4f,0x25,0x25,0x01,0x00,0x25,0x28,0x25,0x28,0x27,0x26,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x0a,0x09,0x16,0x2b, -0x07,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x33,0x11,0x33,0x11,0x3c,0x58,0x65,0x04,0x0a,0x03,0x26,0x41,0x6e,0x6e,0x41,0x26,0x03,0x0a,0x04,0x65,0x58,0x73,0x73,0x2f,0x32,0x02,0x0a, -0x03,0x35,0x32,0x31,0x36,0x03,0x0a,0x02,0x32,0x2f,0x73,0xb4,0x5a,0x6e,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x39,0x4a,0x09,0x09,0x4a,0x39,0xa4,0x2b,0x2b,0x50,0x03,0xac,0xfc,0x54,0x00,0xff,0xff,0xfe,0x34,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x27,0x03,0x46,0xfd,0xd5,0x00,0x00,0x00,0x06, -0x03,0x46,0xe7,0x00,0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07, -0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x05,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x33,0x11,0x33,0x11,0xfe,0xbb,0x01,0x81,0xfe,0xd9,0x01,0x27,0xaf,0x5a,0x6e,0x03,0xac,0x50,0xfc,0xf4,0x50,0x03,0xac,0xfc,0x54,0xff,0xff,0xfe,0x8e,0xff,0x92,0x01,0x9f,0x03,0x3e,0x00,0x27,0x03,0x47,0xfd,0xc1,0x00,0x00,0x01,0x06,0x04,0x1c,0x9c,0x0f, -0x00,0x08,0xb1,0x01,0x01,0xb0,0x0f,0xb0,0x35,0x2b,0x00,0x00,0x00,0x03,0xfe,0x3e,0xff,0x92,0x02,0x35,0x03,0x3e,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x5e,0x40,0x5b,0x00,0x04,0x00,0x03,0x06,0x04,0x03,0x67,0x09,0x07,0x02,0x05,0x13,0x10,0x02,0x0a,0x0b,0x05,0x0a,0x68,0x12,0x11,0x02,0x0b,0x0e,0x0c,0x02,0x00,0x0d,0x0b,0x00,0x67, -0x00,0x02,0x00,0x01,0x02,0x01,0x63,0x08,0x01,0x06,0x06,0x38,0x4d,0x14,0x0f,0x02,0x0d,0x0d,0x39,0x0d,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x15,0x09,0x1f,0x2b,0x33,0x37,0x21,0x11, -0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x21,0x15,0x21,0x33,0x33,0x37,0x23,0x53,0x27,0xfe,0xb9,0xf5,0x9b,0x9b,0xf5,0x01,0x7f,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x0e, -0xfe,0x8c,0x01,0x52,0x46,0xa0,0x22,0xa0,0xd2,0xfe,0xc0,0x50,0x03,0x0c,0x50,0xfe,0xca,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0xc7,0xb4,0xb4,0x00,0xff,0xff,0xfe,0xd4,0xff,0xf6,0x01,0x2e,0x00,0x98,0x00,0x27,0x03,0x29,0xfd,0xfa,0x00,0x00,0x00,0x06,0x03,0x29,0xb0,0x00,0xff,0xff,0xfc,0x90,0xff,0xf6,0x01,0x1a, -0x00,0x98,0x00,0x27,0x03,0x29,0xfb,0xb6,0x00,0x00,0x00,0x27,0x03,0x29,0xfd,0xa9,0x00,0x00,0x00,0x06,0x03,0x29,0x9c,0x00,0xff,0xff,0xfc,0x71,0xff,0xf6,0x01,0x45,0x02,0x53,0x00,0x27,0x04,0x1c,0xff,0x42,0x00,0x00,0x00,0x27,0x03,0x29,0xfb,0x97,0x00,0x00,0x00,0x07,0x03,0x29,0xfd,0x4d,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0x82, -0xff,0xf6,0x01,0x81,0x02,0xda,0x00,0x27,0x03,0x29,0xfd,0xa8,0x00,0x00,0x00,0x06,0x03,0x30,0x9c,0x00,0xff,0xff,0xfe,0x5c,0x00,0xaa,0x02,0x03,0x01,0xea,0x00,0x27,0x03,0x33,0xfd,0xa8,0xff,0xdd,0x03,0x06,0x04,0x19,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0xdd,0xb0,0x35,0x2b,0x00,0xff,0xff,0xfe,0xd1,0xff,0xf6,0x01,0x2f, -0x02,0x30,0x00,0x27,0x03,0x2b,0xfd,0xf8,0x00,0x00,0x00,0x06,0x03,0x2b,0xb0,0x00,0xff,0xff,0xfc,0xc9,0xff,0xf6,0x00,0xdf,0x02,0x30,0x00,0x27,0x03,0x2b,0xfb,0xf0,0x00,0x00,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x00,0x00,0x07,0x03,0x2b,0xff,0x60,0x00,0x00,0x00,0x00,0xff,0xff,0xfc,0x44,0x00,0x2d,0x01,0x81,0x02,0x67,0x00,0x27, -0x03,0x2b,0xfb,0x6b,0x00,0x37,0x00,0x27,0x03,0x2b,0xfd,0x2f,0x00,0x37,0x01,0x07,0x04,0x19,0xff,0x7e,0x00,0x00,0x00,0x10,0xb1,0x00,0x02,0xb0,0x37,0xb0,0x35,0x2b,0xb1,0x02,0x02,0xb0,0x37,0xb0,0x35,0x2b,0xff,0xff,0xfe,0xb3,0xff,0xf6,0x01,0x81,0x02,0xda,0x00,0x26,0x03,0x30,0x9c,0x00,0x00,0x07,0x03,0x2b,0xfd,0xda,0x00,0x00, -0x00,0x05,0xfc,0x2c,0xff,0xf6,0x01,0xae,0x02,0xda,0x00,0x14,0x00,0x21,0x00,0x2f,0x00,0x3d,0x00,0x4b,0x01,0x3b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x1f,0x01,0x06,0x01,0x1e,0x01,0x05,0x06,0x20,0x1a,0x02,0x03,0x00,0x21,0x01,0x04,0x03,0x16,0x01,0x08,0x04,0x15,0x01,0x07,0x0a,0x06,0x4c,0x1b,0x40,0x1b,0x1f,0x01,0x06,0x01,0x1e, -0x01,0x05,0x06,0x20,0x1a,0x02,0x03,0x00,0x21,0x01,0x04,0x03,0x16,0x01,0x08,0x04,0x15,0x01,0x09,0x0a,0x06,0x4c,0x59,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x40,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06, -0x06,0x41,0x4d,0x00,0x08,0x08,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x4d,0x00,0x0a,0x0a,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x41,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38, -0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06,0x06,0x41,0x4d,0x00,0x08,0x08,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x4d,0x00,0x0a,0x0a,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x40,0x3d,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f, -0x00,0x02,0x02,0x38,0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06,0x06,0x41,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x4d,0x00,0x08,0x08,0x07,0x61,0x0d,0x01,0x07,0x07,0x3f,0x07,0x4e,0x59,0x59,0x40,0x25,0x3f,0x3e,0x31,0x30,0x23,0x22,0x00,0x00,0x46,0x43,0x3e,0x4b,0x3f,0x4a,0x38,0x35,0x30,0x3d,0x31,0x3c,0x2a, -0x27,0x22,0x2f,0x23,0x2e,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x0f,0x09,0x1a,0x2b,0x25,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06, -0x23,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0x09,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x01,0x9d,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfa,0xc9,0x21,0x2a,0x2b,0x20, -0x14,0x20,0x2b,0x2a,0x21,0x14,0x21,0x2a,0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x01,0x9b,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0x96,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0xd7,0x64,0x82,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfe, -0x5c,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0x05,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x00,0x04,0xfe,0x52,0x00,0x64,0x01,0xd6,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x7b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x02,0x00,0x00,0x02,0x57,0x0b,0x01,0x07,0x04,0x05,0x07,0x57,0x06,0x01,0x05,0x0a, -0x01,0x04,0x05,0x04,0x65,0x09,0x03,0x08,0x03,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01,0x4e,0x1b,0x40,0x26,0x00,0x02,0x09,0x01,0x03,0x00,0x02,0x03,0x67,0x00,0x06,0x0b,0x01,0x07,0x04,0x06,0x07,0x67,0x00,0x05,0x0a,0x01,0x04,0x05,0x04,0x65,0x08,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x23,0x1c, -0x1c,0x11,0x10,0x0c,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37, -0x35,0x21,0x15,0xfe,0xa2,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xea,0x02,0x26,0xfc,0xcc,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xea,0x02,0x26,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0x50,0xfe,0xca,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x46,0x50,0x50,0x00,0x00,0x00,0xff,0xff,0xfe,0x81,0x00,0x2d,0x01,0x9f, -0x02,0x67,0x00,0x26,0x04,0x1b,0x9c,0x00,0x01,0x07,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfe,0x81,0x00,0x2d,0x01,0x77,0x02,0x67,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x01,0x07,0x04,0x1c,0xff,0x74,0x00,0x00,0x00,0x08,0xb1,0x00,0x02,0xb0,0x37,0xb0,0x35,0x2b, -0xff,0xff,0xfe,0xc5,0xff,0x60,0x01,0x31,0x02,0x30,0x00,0x27,0x03,0x2c,0xfd,0xf8,0x00,0x00,0x00,0x06,0x03,0x2c,0xb0,0x00,0xff,0xff,0xfc,0xbd,0xff,0x60,0x00,0xe1,0x02,0x30,0x00,0x27,0x03,0x2c,0xfd,0xa8,0x00,0x00,0x00,0x27,0x03,0x2c,0xff,0x60,0x00,0x00,0x00,0x07,0x03,0x2c,0xfb,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0xc5, -0xff,0xfb,0x01,0x3b,0x02,0xda,0x00,0x27,0x03,0x2e,0xfd,0xe4,0x00,0x00,0x00,0x06,0x03,0x2e,0xc4,0x00,0xff,0xff,0xfc,0x68,0xff,0x92,0x01,0x9f,0x03,0x3e,0x00,0x27,0x03,0x2e,0xfb,0x87,0x00,0x00,0x00,0x27,0x03,0x2e,0xfd,0x5d,0x00,0x00,0x00,0x06,0x03,0x46,0x92,0x00,0x00,0x01,0xfd,0xf8,0x00,0x00,0x02,0x08,0x02,0x99,0x00,0x13, -0x00,0x35,0x40,0x32,0x00,0x04,0x03,0x04,0x85,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x68,0x07,0x01,0x01,0x08,0x01,0x00,0x09,0x01,0x00,0x67,0x0a,0x01,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x23,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21, -0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x98,0x3e,0xfe,0x52,0x01,0xcc,0x3a,0xfd,0xfa,0x02,0x24,0x40,0x46,0x40,0x01,0xa6,0xfe,0x3c,0x3a,0x01,0xfe,0xfd,0xe4,0x3e,0xaa,0x50,0xa0,0x50,0xaf,0xaf,0x50,0xa0,0x50,0xaa,0x00,0x00,0x00,0x00,0x01,0xfb,0xa5,0xff,0x92,0x02,0x03,0x03,0x3e,0x00,0x1b,0x00,0x4f,0x40,0x4c, -0x00,0x06,0x05,0x06,0x85,0x0e,0x01,0x0d,0x00,0x0d,0x86,0x07,0x01,0x05,0x08,0x01,0x04,0x03,0x05,0x04,0x68,0x09,0x01,0x03,0x0a,0x01,0x02,0x01,0x03,0x02,0x67,0x0b,0x01,0x01,0x00,0x00,0x01,0x57,0x0b,0x01,0x01,0x01,0x00,0x5f,0x0c,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x09,0x1f,0x2b,0x05,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0xfe,0x1f,0x44,0xfd,0x42,0x02,0xda,0x34,0xfc,0xf2,0x03,0x29,0x34,0xfc,0xa3,0x03,0x79,0x5a,0x46,0x5a,0x02,0x9f,0xfd, -0x45,0x34,0x02,0xef,0xfc,0xf6,0x34,0x03,0x3e,0xfc,0xa6,0x44,0x6e,0xba,0x4c,0x8c,0x4c,0x8c,0x4c,0xf6,0xf6,0x4c,0x8c,0x4c,0x8c,0x4c,0xba,0x00,0xff,0xff,0xfe,0x90,0xff,0xf6,0x01,0x2d,0x02,0xda,0x00,0x27,0x03,0x30,0xfe,0x0e,0x00,0x00,0x00,0x06,0x03,0x29,0xaf,0x00,0xff,0xff,0xfe,0x90,0xff,0xf6,0x01,0x4d,0x02,0xda,0x00,0x27, -0x03,0x30,0xfe,0x0e,0x00,0x00,0x00,0x06,0x03,0x2b,0xce,0x00,0xff,0xff,0xfe,0x5c,0xff,0xfb,0x01,0xb8,0x02,0xda,0x00,0x27,0x03,0x30,0xfd,0xda,0x00,0x00,0x00,0x06,0x03,0x30,0xd3,0x00,0xff,0xff,0xfb,0xfa,0xff,0xfb,0x01,0xbd,0x02,0xda,0x00,0x27,0x03,0x30,0xfb,0x78,0x00,0x00,0x00,0x27,0x03,0x30,0xfd,0xa8,0x00,0x00,0x00,0x06, -0x03,0x30,0xd8,0x00,0x00,0x04,0xfe,0x52,0xff,0xfb,0x01,0xcc,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x1e,0x00,0x2c,0x00,0xa5,0xb5,0x1a,0x01,0x04,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x32,0x00,0x05,0x0c,0x01,0x06,0x00,0x05,0x06,0x67,0x00,0x00,0x00,0x03,0x07,0x00,0x03,0x69,0x00,0x07,0x0d,0x08,0x0b,0x03,0x04,0x0a,0x07, -0x04,0x67,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x09,0x4e,0x1b,0x40,0x39,0x0b,0x01,0x04,0x07,0x08,0x07,0x04,0x08,0x80,0x00,0x05,0x0c,0x01,0x06,0x00,0x05,0x06,0x67,0x00,0x00,0x00,0x03,0x07,0x00,0x03,0x69,0x00,0x07,0x0d,0x01,0x08,0x0a,0x07,0x08,0x67,0x00,0x01, -0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x09,0x4e,0x59,0x40,0x25,0x20,0x1f,0x19,0x19,0x15,0x15,0x00,0x00,0x27,0x24,0x1f,0x2c,0x20,0x2b,0x19,0x1e,0x19,0x1e,0x1d,0x1c,0x15,0x18,0x15,0x18,0x17,0x16,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x0f,0x09,0x1a,0x2b,0x25,0x35,0x33, -0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x25,0x35,0x21,0x15,0x05,0x35,0x36,0x37,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0x9e,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x01,0x1c,0x01,0xb8,0xfd,0xa8,0x27, -0x09,0x02,0x28,0xfc,0xef,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0xe6,0x50,0x50,0xf0,0x24,0x13,0x19,0x50,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0xff,0xff,0xfb,0x9c,0x00,0x67,0x02,0x0c,0x03,0x0c,0x00,0x27,0x03,0x34,0xfb,0x78, -0x00,0x00,0x00,0x27,0x03,0x34,0xfd,0xa8,0x00,0xa0,0x01,0x06,0x03,0x34,0xd8,0x00,0x00,0x08,0xb1,0x01,0x01,0xb0,0xa0,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfd,0xe5,0x00,0x41,0x02,0x12,0x02,0x6c,0x00,0x26,0x04,0x1b,0x0f,0x00,0x00,0x07,0x03,0x34,0xfd,0xc1,0x00,0x00,0xff,0xff,0xfd,0xcc,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x27, -0x03,0x34,0xfd,0xa8,0xff,0xb0,0x03,0x06,0x03,0x3d,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0xb0,0xb0,0x35,0x2b,0x00,0x00,0x03,0xfd,0xcb,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x27,0x00,0x2d,0x00,0x31,0x00,0x4c,0x40,0x49,0x1e,0x1d,0x02,0x08,0x4a,0x27,0x00,0x02,0x01,0x49,0x0b,0x09,0x02,0x07,0x0f,0x0d,0x02,0x06,0x05,0x07, -0x06,0x68,0x0e,0x0c,0x02,0x05,0x04,0x02,0x02,0x00,0x01,0x05,0x00,0x67,0x0a,0x01,0x08,0x08,0x38,0x4d,0x03,0x01,0x01,0x01,0x39,0x01,0x4e,0x31,0x30,0x2f,0x2e,0x2d,0x2a,0x29,0x28,0x1a,0x19,0x18,0x17,0x16,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x10,0x09,0x1f,0x2b,0x05,0x26,0x26,0x27,0x21,0x07,0x23,0x37,0x23,0x07, -0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x36,0x36,0x37,0x15,0x0e,0x02,0x15,0x15,0x14,0x16,0x16,0x17,0x01,0x21,0x35,0x34,0x35,0x21,0x05,0x33,0x37,0x23,0x01,0xe5,0x81,0x99,0x0f,0xfe,0x92,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46, -0x27,0x01,0x38,0x10,0x99,0x7e,0x40,0x5f,0x33,0x33,0x5f,0x40,0xfd,0x74,0x01,0x60,0xfe,0xc2,0xfe,0xf8,0xa0,0x22,0xa0,0x78,0x1d,0xac,0x81,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x7d,0xa7,0x1c,0x57,0x0f,0x54,0x7d,0x4f,0xb4,0x4e,0x7e,0x54,0x0f,0x01,0x34,0xaf,0x03,0x02,0xb4,0xb4,0x00,0x00,0x00,0x03,0xfd,0xcb, -0xff,0x92,0x02,0x03,0x03,0x3e,0x00,0x33,0x00,0x3f,0x00,0x43,0x00,0xd3,0xb5,0x26,0x01,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x44,0x00,0x0f,0x13,0x12,0x07,0x0f,0x72,0x00,0x0d,0x00,0x0e,0x09,0x0d,0x0e,0x69,0x0c,0x0a,0x02,0x08,0x16,0x14,0x02,0x07,0x13,0x08,0x07,0x68,0x00,0x13,0x00,0x12,0x06,0x13,0x12,0x67,0x15, -0x11,0x02,0x06,0x05,0x03,0x02,0x01,0x02,0x06,0x01,0x67,0x00,0x10,0x17,0x01,0x00,0x10,0x00,0x65,0x0b,0x01,0x09,0x09,0x38,0x4d,0x04,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x45,0x00,0x0f,0x13,0x12,0x13,0x0f,0x12,0x80,0x00,0x0d,0x00,0x0e,0x09,0x0d,0x0e,0x69,0x0c,0x0a,0x02,0x08,0x16,0x14,0x02,0x07,0x13,0x08,0x07,0x68,0x00, -0x13,0x00,0x12,0x06,0x13,0x12,0x67,0x15,0x11,0x02,0x06,0x05,0x03,0x02,0x01,0x02,0x06,0x01,0x67,0x00,0x10,0x17,0x01,0x00,0x10,0x00,0x65,0x0b,0x01,0x09,0x09,0x38,0x4d,0x04,0x01,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x35,0x01,0x00,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3c,0x3a,0x39,0x37,0x35,0x34,0x32,0x30,0x29,0x28,0x23,0x21,0x20, -0x1e,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x33,0x01,0x33,0x18,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x27,0x26,0x36, -0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x15,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0x21,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x37,0x21,0x05,0x33,0x37,0x23,0x01,0xd6,0x58,0x65,0x04,0x09,0xfe,0x28,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27, -0x01,0xa0,0x09,0x05,0x66,0x58,0x2d,0x2d,0x2f,0x33,0x03,0x0a,0x04,0x3c,0x3b,0x3c,0x3a,0x03,0x0a,0x02,0x32,0x2f,0x2d,0xfd,0x56,0x01,0xcb,0x06,0x2c,0x2f,0x4b,0x4b,0x2e,0x2d,0x06,0xfe,0x57,0xfe,0xf8,0xa0,0x22,0xa0,0x6e,0x57,0x4f,0x9a,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x90,0x4f,0x57,0x50,0x2b,0x2b,0x9f, -0x37,0x4f,0x02,0x05,0x02,0x52,0x37,0xa9,0x2b,0x2b,0x50,0x01,0x81,0x1a,0x18,0x50,0x18,0x1a,0xb4,0xb4,0x00,0x03,0xfd,0xcb,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x5e,0x40,0x5b,0x00,0x0c,0x00,0x0d,0x08,0x0c,0x0d,0x67,0x0b,0x09,0x02,0x07,0x13,0x11,0x02,0x06,0x05,0x07,0x06,0x68,0x12,0x10,0x02,0x05, -0x04,0x02,0x02,0x00,0x01,0x05,0x00,0x67,0x00,0x0e,0x14,0x01,0x0f,0x0e,0x0f,0x63,0x0a,0x01,0x08,0x08,0x38,0x4d,0x03,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x15,0x09,0x1f,0x2b,0x17,0x11,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x01,0x21,0x35,0x21,0x05,0x33,0x37,0x23,0xcd,0xfe,0x81,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27, -0x46,0x27,0x01,0x47,0xf5,0x9b,0x9b,0xfd,0x97,0x01,0x74,0xfe,0xae,0xfe,0xf8,0xa0,0x22,0xa0,0x6e,0x01,0x40,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x01,0x36,0x50,0xfc,0xf4,0x50,0x01,0x81,0xb4,0xb4,0xb4,0x00,0x00,0x04,0xfd,0xcb,0x00,0x00,0x01,0x7c,0x02,0xda,0x00,0x1b,0x00,0x27,0x00,0x2b,0x00,0x37,0x00,0xab, -0x4b,0xb0,0x11,0x50,0x58,0x40,0x37,0x07,0x05,0x02,0x03,0x11,0x08,0x02,0x02,0x0e,0x03,0x02,0x68,0x00,0x0f,0x15,0x01,0x0e,0x01,0x0f,0x0e,0x69,0x0c,0x0a,0x02,0x00,0x12,0x01,0x00,0x57,0x13,0x10,0x09,0x03,0x01,0x16,0x01,0x12,0x0b,0x01,0x12,0x69,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x40, -0x38,0x07,0x05,0x02,0x03,0x11,0x08,0x02,0x02,0x0e,0x03,0x02,0x68,0x00,0x0f,0x15,0x01,0x0e,0x13,0x0f,0x0e,0x69,0x10,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x12,0x01,0x00,0x67,0x00,0x13,0x16,0x01,0x12,0x0b,0x13,0x12,0x69,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x59,0x40,0x2e,0x2d,0x2c,0x1d,0x1c, -0x00,0x00,0x33,0x31,0x2c,0x37,0x2d,0x37,0x2b,0x2a,0x29,0x28,0x23,0x21,0x1c,0x27,0x1d,0x27,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33, -0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x33,0x37,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x02,0xeb,0x24,0x2c, -0x2c,0x24,0x24,0x2c,0x2c,0xfd,0x23,0xa0,0x22,0xa0,0x02,0x97,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0xae,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x9b,0xb4,0xfe,0xbb,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x00,0x00,0x04,0xfd,0xcb,0xff,0xfb,0x01,0x8b, -0x02,0xda,0x00,0x03,0x00,0x1f,0x00,0x23,0x00,0x31,0x00,0xaf,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x30,0x09,0x07,0x02,0x05,0x11,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x10,0x0b,0x02,0x03,0x0e,0x0c,0x02,0x14,0x04,0x01,0x13,0x03,0x01,0x67,0x08,0x06,0x02,0x00,0x00,0x38,0x4d,0x00,0x13,0x13,0x0d,0x5f,0x16,0x12,0x15,0x0f,0x04,0x0d,0x0d, -0x39,0x0d,0x4e,0x1b,0x40,0x3b,0x14,0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x09,0x07,0x02,0x05,0x11,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x10,0x0b,0x02,0x03,0x0e,0x0c,0x02,0x02,0x13,0x03,0x02,0x67,0x08,0x06,0x02,0x00,0x00,0x38,0x4d,0x15,0x0f,0x02,0x0d,0x0d,0x39,0x4d,0x00,0x13,0x13,0x12,0x61,0x16,0x01,0x12,0x12,0x42,0x12, -0x4e,0x59,0x40,0x36,0x25,0x24,0x04,0x04,0x00,0x00,0x2c,0x29,0x24,0x31,0x25,0x30,0x23,0x22,0x21,0x20,0x04,0x1f,0x04,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x17,0x09,0x17,0x2b,0x37,0x13,0x33,0x03,0x05, -0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x01,0x22,0x26,0x37,0x36,0x36,0x33,0x33,0x32,0x16,0x07,0x06,0x06,0x23,0xc9,0x58,0x6a,0x70,0xfc,0xe0,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27, -0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0x02,0x23,0x1a,0x1b,0x05,0x05,0x28,0x1a,0x1e,0x1d,0x19,0x05,0x05,0x29,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xd7,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xfe,0x34,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00, -0x00,0x03,0xfd,0xcb,0xff,0xfb,0x02,0x08,0x02,0xe4,0x00,0x34,0x00,0x38,0x00,0x46,0x01,0x0e,0x4b,0xb0,0x18,0x50,0x58,0x40,0x3c,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01,0x11,0x0f,0x0a,0x03,0x00,0x16,0x01,0x00,0x67,0x00,0x0c,0x0c,0x04,0x5f,0x08, -0x06,0x02,0x04,0x04,0x38,0x4d,0x00,0x16,0x16,0x10,0x5f,0x18,0x15,0x17,0x12,0x04,0x10,0x10,0x39,0x10,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x40,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01,0x11,0x0f,0x0a,0x03,0x00,0x16,0x01,0x00,0x67,0x06,0x01, -0x04,0x04,0x38,0x4d,0x00,0x0c,0x0c,0x08,0x61,0x00,0x08,0x08,0x3e,0x4d,0x00,0x16,0x16,0x10,0x5f,0x18,0x15,0x17,0x12,0x04,0x10,0x10,0x39,0x10,0x4e,0x1b,0x40,0x4b,0x00,0x0a,0x00,0x16,0x00,0x0a,0x16,0x80,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01, -0x11,0x0f,0x02,0x00,0x0a,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x00,0x0c,0x0c,0x08,0x61,0x00,0x08,0x08,0x3e,0x4d,0x17,0x12,0x02,0x10,0x10,0x39,0x4d,0x00,0x16,0x16,0x15,0x61,0x18,0x01,0x15,0x15,0x42,0x15,0x4e,0x59,0x59,0x40,0x30,0x3a,0x39,0x00,0x00,0x41,0x3e,0x39,0x46,0x3a,0x45,0x38,0x37,0x36,0x35,0x00,0x34,0x00, -0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x27,0x25,0x21,0x1f,0x1e,0x1d,0x1c,0x1b,0x24,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35, -0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xa2,0x3d,0x6c,0x47,0x49,0x6c,0x3b,0x67,0x56,0x5a, -0x32,0x41,0x48,0x50,0x44,0x45,0x51,0xfe,0xf9,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0x02,0x7e,0x1d,0x24,0x24,0x1d,0x14,0x1d,0x24,0x24,0x1d,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x01,0x41,0x63,0x37,0x36,0x63,0x43,0x5b,0x76,0x06,0x64,0xaf,0x4a,0x42,0x41,0x4b,0x4b,0x41,0x41,0xb4,0x41,0xd2,0xd2,0xd2, -0x01,0x13,0xb4,0xfe,0x34,0x1f,0x1c,0x1b,0x22,0x22,0x1b,0x1b,0x20,0x00,0x00,0x00,0x00,0x04,0xfd,0xe9,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6b,0x40,0x68,0x0b,0x09,0x07,0x05,0x04,0x03,0x1b,0x19,0x17,0x0c,0x04,0x02,0x01,0x03,0x02,0x68,0x1a,0x18,0x16,0x0d,0x04,0x01,0x14,0x12,0x10,0x0e, -0x04,0x00,0x0f,0x01,0x00,0x67,0x0a,0x08,0x06,0x03,0x04,0x04,0x38,0x4d,0x1c,0x15,0x13,0x11,0x04,0x0f,0x0f,0x39,0x0f,0x4e,0x00,0x00,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x00,0x2b,0x00,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15, -0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1d,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x17, -0x33,0x37,0x23,0x05,0x33,0x37,0x23,0xfe,0x19,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xf0,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xf0,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0xf0,0x22,0xf0,0x01,0x14,0xa0,0x22,0xa0,0xd2,0x41,0xb4, -0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x00,0x06,0xfb,0x91,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x8f,0x40,0x8c,0x0f,0x0d,0x0b,0x09,0x07,0x05,0x06,0x03,0x27,0x25, -0x23,0x21,0x1f,0x10,0x06,0x02,0x01,0x03,0x02,0x68,0x26,0x24,0x22,0x20,0x1e,0x11,0x06,0x01,0x1c,0x1a,0x18,0x16,0x14,0x12,0x06,0x00,0x13,0x01,0x00,0x67,0x0e,0x0c,0x0a,0x08,0x06,0x05,0x04,0x04,0x38,0x4d,0x28,0x1d,0x1b,0x19,0x17,0x15,0x06,0x13,0x13,0x39,0x13,0x4e,0x00,0x00,0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46, -0x45,0x44,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x00,0x3b,0x00,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x29, -0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x13, -0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0xfb,0xc1,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x0e,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x0e,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27, -0xfe,0xf2,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xf2,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x0e,0x22,0xfe,0xf2,0x01,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x0e,0x22,0xfe,0xf2,0x01,0x32,0xa0,0x22,0xa0,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2, -0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x08,0xf9,0x39,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b,0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0xb3,0x40,0xb0,0x13,0x11,0x0f,0x0d,0x0b,0x09,0x07,0x05,0x08,0x03,0x33,0x31,0x2f,0x2d, -0x2b,0x29,0x27,0x14,0x08,0x02,0x01,0x03,0x02,0x68,0x32,0x30,0x2e,0x2c,0x2a,0x28,0x26,0x15,0x08,0x01,0x24,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x08,0x00,0x17,0x01,0x00,0x67,0x12,0x10,0x0e,0x0c,0x0a,0x08,0x06,0x07,0x04,0x04,0x38,0x4d,0x34,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x08,0x17,0x17,0x39,0x17,0x4e,0x00,0x00,0x67,0x66, -0x65,0x64,0x63,0x62,0x61,0x60,0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x58,0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,0x4f,0x4e,0x4d,0x4c,0x00,0x4b,0x00,0x4b,0x4a,0x49,0x48,0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29, -0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x35,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33, -0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05, -0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0xf9,0x69,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46, -0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xd2, -0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x04,0xfd,0xcb,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x1b, -0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0xdf,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2c,0x0e,0x07,0x05,0x03,0x03,0x11,0x15,0x0f,0x08,0x04,0x02,0x01,0x03,0x02,0x68,0x12,0x10,0x09,0x03,0x01,0x16,0x13,0x0c,0x0a,0x04,0x00,0x0b,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x4b,0xb0,0x2e,0x50, -0x58,0x40,0x36,0x00,0x0e,0x03,0x02,0x0e,0x57,0x07,0x05,0x02,0x03,0x11,0x15,0x0f,0x08,0x04,0x02,0x01,0x03,0x02,0x68,0x0c,0x0a,0x02,0x00,0x13,0x01,0x00,0x57,0x12,0x10,0x09,0x03,0x01,0x16,0x01,0x13,0x0b,0x01,0x13,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x40,0x38,0x07,0x05,0x02,0x03, -0x11,0x08,0x02,0x02,0x0f,0x03,0x02,0x68,0x00,0x0e,0x15,0x01,0x0f,0x12,0x0e,0x0f,0x67,0x10,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x13,0x01,0x00,0x67,0x00,0x12,0x16,0x01,0x13,0x0b,0x12,0x13,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x59,0x59,0x40,0x2e,0x24,0x24,0x1c,0x1c,0x00,0x00,0x24,0x27, -0x24,0x27,0x26,0x25,0x23,0x22,0x21,0x20,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23, -0x37,0x23,0x07,0x01,0x35,0x21,0x15,0x05,0x33,0x37,0x23,0x05,0x35,0x21,0x15,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x02,0x0f,0x01,0xb8,0xfc,0x6b,0xa0,0x22,0xa0,0x01,0xbb,0x01,0xb8,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41, -0xd2,0xd2,0xd2,0x01,0xc2,0x50,0x50,0xaf,0xb4,0xff,0x50,0x50,0x00,0x02,0xfd,0xcb,0xff,0x9c,0x02,0x1c,0x02,0xda,0x00,0x1d,0x00,0x21,0x00,0x4f,0x40,0x4c,0x09,0x07,0x02,0x05,0x10,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x0f,0x0b,0x02,0x03,0x0c,0x02,0x02,0x00,0x01,0x03,0x00,0x67,0x00,0x0d,0x11,0x01,0x0e,0x0d,0x0e,0x63,0x08,0x01, -0x06,0x06,0x38,0x4d,0x00,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x21,0x20,0x1f,0x1e,0x00,0x1d,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x09,0x1f,0x2b,0x05,0x13,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33, -0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x21,0x15,0x01,0x33,0x37,0x23,0xfe,0xce,0x3a,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x2c,0x02,0xfa,0xfc,0x57,0xa0,0x22,0xa0,0x64,0x01,0x36,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xeb,0x4b,0x01,0x77, -0xb4,0x00,0x00,0x00,0x00,0x02,0xfb,0x73,0xff,0x9c,0x01,0xdb,0x03,0x43,0x00,0x2f,0x00,0x33,0x00,0x59,0x40,0x56,0x2e,0x01,0x0d,0x01,0x4b,0x25,0x24,0x02,0x06,0x4a,0x09,0x07,0x02,0x05,0x10,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x0f,0x0b,0x02,0x03,0x0c,0x02,0x02,0x00,0x01,0x03,0x00,0x67,0x00,0x0d,0x11,0x01,0x0e,0x0d,0x0e,0x63, -0x08,0x01,0x06,0x06,0x38,0x4d,0x00,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x33,0x32,0x31,0x30,0x00,0x2f,0x00,0x2f,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x09,0x1f,0x2b,0x05,0x13,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33, -0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x21,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x15,0x0e,0x02,0x15,0x15,0x14,0x16,0x16,0x17,0x15,0x01,0x33,0x37,0x23,0xfc,0x76,0x3a,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x2c,0x04,0x73,0x42,0x4c,0x49,0x87,0x5c, -0x40,0x5e,0x34,0x32,0x5d,0x3f,0xfa,0x44,0xa0,0x22,0xa0,0x64,0x01,0x36,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xeb,0x2a,0x9f,0x63,0xaa,0x62,0x9f,0x6e,0x17,0x55,0x0f,0x55,0x7e,0x4f,0xaa,0x4c,0x7c,0x54,0x10,0x4b,0x01,0x77,0xb4,0x00,0x00,0x00,0xff,0xff,0xfd,0xf3,0xff,0x92,0x02,0x34,0x03,0x3e,0x00,0x27, -0x03,0x3d,0xfd,0xa8,0x00,0x00,0x03,0x07,0x03,0x34,0x00,0x00,0x00,0x82,0x00,0x08,0xb1,0x01,0x01,0xb0,0x82,0xb0,0x35,0x2b,0xff,0xff,0xfb,0x9b,0xff,0x92,0x02,0x34,0x03,0x3e,0x00,0x27,0x03,0x3d,0xfb,0x50,0x00,0x00,0x00,0x27,0x03,0x34,0xfd,0xa8,0x00,0x82,0x03,0x07,0x03,0x34,0x00,0x00,0x00,0x82,0x00,0x10,0xb1,0x01,0x01,0xb0, -0x82,0xb0,0x35,0x2b,0xb1,0x02,0x01,0xb0,0x82,0xb0,0x35,0x2b,0x00,0x01,0xfe,0x11,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00, -0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x03,0xfe,0x11,0x01,0x63,0x5f,0x80,0x02,0x97,0xfd,0x4a,0x3c,0x02,0xf2,0xfc,0xf0,0x6a,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x00,0x01,0xfb,0xa0,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x0b, -0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15, -0x21,0x03,0xfb,0xa0,0x01,0x63,0x5f,0x80,0x05,0x08,0xfa,0xd9,0x3c,0x05,0x63,0xfa,0x7f,0x6a,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x00,0x01,0xfe,0x16,0xff,0x92,0x01,0xd6,0x03,0x3e,0x00,0x10,0x00,0x23,0x40,0x20,0x0f,0x0b,0x07,0x06,0x05,0x04,0x03,0x07,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, -0x01,0x76,0x00,0x00,0x00,0x10,0x00,0x10,0x11,0x03,0x09,0x17,0x2b,0x05,0x01,0x33,0x07,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x01,0xfe,0x16,0x01,0x63,0x5f,0x41,0x02,0x3f,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x21,0x12,0xfe,0x1d,0xfe,0xfa,0x6e,0x03,0xac,0xad,0xfe,0xeb,0x64,0xd7,0x5a,0x97,0x09,0x0b, -0x02,0x02,0x0b,0x09,0xe9,0xfd,0x4b,0x00,0xff,0xff,0xfe,0x3e,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x26,0x03,0x3d,0xb5,0x00,0x00,0x07,0x03,0x3d,0xfd,0xf3,0x00,0x00,0x00,0x02,0xfb,0xfa,0xff,0x92,0x01,0xd6,0x03,0x3e,0x00,0x0b,0x00,0x0f,0x00,0x3f,0x40,0x3c,0x06,0x01,0x00,0x01,0x00,0x85,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x86, -0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x03,0x21,0x01,0x33,0x01,0xfd, -0xbd,0x01,0x63,0x5f,0x80,0x02,0xd7,0xfd,0x0a,0x3c,0x03,0x32,0xfc,0xb0,0x6a,0xfd,0xde,0x01,0x63,0x5f,0xfe,0x9d,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x03,0xac,0xfc,0x54,0xff,0xff,0xfc,0x13,0xff,0x92,0x01,0x95,0x03,0x3e,0x00,0x27,0x03,0x3d,0xfb,0xc8,0x00,0x00,0x00,0x27,0x03,0x3d,0xfd,0xa8,0x00,0x00,0x00,0x06, -0x03,0x3d,0x88,0x00,0x00,0x01,0xfe,0x66,0xff,0x92,0x01,0x9a,0x03,0x3e,0x00,0x08,0x00,0x1f,0x40,0x1c,0x06,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x04,0x09,0x18,0x2b,0x05,0x01,0x33,0x01,0x23,0x01,0x27,0x07,0x01,0xfe,0x66,0x01,0x63,0x6e,0x01, -0x63,0x5f,0xfe,0xdc,0x17,0x16,0xfe,0xdc,0x6e,0x03,0xac,0xfc,0x54,0x03,0x0a,0x44,0x44,0xfc,0xf6,0x00,0x00,0x01,0xfe,0x66,0xff,0x92,0x01,0x9a,0x03,0x3e,0x00,0x08,0x00,0x1f,0x40,0x1c,0x04,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x08,0x00,0x08,0x14,0x11,0x04,0x09,0x18, -0x2b,0x07,0x01,0x33,0x01,0x17,0x37,0x01,0x33,0x01,0x37,0xfe,0x9d,0x5f,0x01,0x24,0x17,0x16,0x01,0x24,0x60,0xfe,0x9d,0x6e,0x03,0xac,0xfc,0xf6,0x44,0x44,0x03,0x0a,0xfc,0x54,0x00,0x00,0x00,0x01,0xfc,0x22,0xff,0x9c,0x01,0x86,0x02,0xee,0x00,0x07,0x00,0x41,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x02,0x01,0x00,0x04,0x01,0x03,0x00, -0x03,0x63,0x00,0x01,0x01,0x38,0x01,0x4e,0x1b,0x40,0x18,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0xfc,0x22,0x02,0x85,0x5a, -0x02,0x85,0x64,0x4b,0x03,0x07,0xfc,0xf9,0x4b,0x00,0x00,0x00,0x00,0x01,0xfd,0xe4,0xff,0x9c,0x02,0x1c,0xff,0xe7,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x35,0x21,0x15,0xfd,0xe4,0x04,0x38, -0x64,0x4b,0x4b,0x00,0x00,0x04,0xfe,0x5c,0xff,0xfb,0x01,0x90,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x19,0x00,0x4e,0x40,0x4b,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x07,0x04,0x05,0x67,0x08,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x07,0x07,0x06,0x61,0x0b,0x01,0x06,0x06, -0x42,0x06,0x4e,0x0d,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x14,0x11,0x0c,0x19,0x0d,0x18,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23, -0xfe,0x7e,0x0c,0x6a,0x0c,0xcc,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfd,0x08,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0xf0,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x06,0xfc,0x0e,0xff,0xfb,0x01,0x90,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13, -0x00,0x21,0x00,0x64,0x40,0x61,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x06,0x02,0x03,0x67,0x08,0x01,0x06,0x10,0x09,0x0f,0x03,0x07,0x0b,0x06,0x07,0x67,0x0c,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x0b,0x0b,0x0a,0x61,0x11,0x01,0x0a,0x0a,0x42,0x0a,0x4e,0x15,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00, -0x00,0x1c,0x19,0x14,0x21,0x15,0x20,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x22,0x26,0x35, -0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfc,0x30,0x0c,0x6a,0x0c,0xcc,0x01,0xe5,0x78,0x01,0xe5,0xfb,0xbe,0x01,0xe5,0x78,0x01,0xe5,0xfa,0xba,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00, -0x00,0x01,0x00,0x7d,0xff,0x8d,0x01,0xe5,0x03,0x2f,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x02,0x01,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x13,0x03,0x06,0x17,0x2b,0x05,0x03,0x35,0x13,0x33,0x01,0x01,0x01,0x79,0xfc,0xfc,0x66,0xfe,0xe8,0x01,0x1e,0x73,0x01,0x95, -0x7a,0x01,0x93,0xfe,0x2d,0xfe,0x31,0x00,0x00,0x02,0x00,0x64,0xff,0x92,0x02,0x2a,0x03,0x3e,0x00,0x06,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x0c,0x09,0x08,0x05,0x02,0x01,0x06,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x07,0x07,0x00,0x00,0x07,0x0d,0x07,0x0d,0x0b,0x0a,0x00,0x06,0x00,0x06, -0x13,0x06,0x06,0x17,0x2b,0x05,0x01,0x35,0x01,0x33,0x01,0x01,0x33,0x01,0x35,0x01,0x33,0x01,0x01,0x01,0x75,0xfe,0xef,0x01,0x11,0x37,0xfe,0xe2,0x01,0x1e,0x47,0xfe,0xef,0x01,0x11,0x37,0xfe,0xe2,0x01,0x1e,0x6e,0x01,0xbc,0x33,0x01,0xbd,0xfe,0x2a,0xfe,0x2a,0x01,0xbc,0x33,0x01,0xbd,0xfe,0x2a,0xfe,0x2a,0x00,0x00,0x02,0x00,0xa0, -0xff,0x92,0x01,0xef,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x00,0x01,0x06,0x05,0x02,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x00,0x00,0x03,0x57,0x04,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x08,0x08,0x08,0x0b,0x08,0x0b,0x12,0x11,0x11,0x11,0x10,0x07,0x06,0x1b,0x2b,0x05,0x21,0x11,0x21,0x15,0x23,0x11, -0x33,0x01,0x11,0x33,0x11,0x01,0xef,0xfe,0xb1,0x01,0x4f,0xaf,0xaf,0xfe,0xe3,0x3c,0x6e,0x03,0xac,0x2d,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x00,0x01,0x00,0x73,0xff,0x8d,0x01,0xdb,0x03,0x2f,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x04,0x01,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, -0x00,0x06,0x00,0x06,0x12,0x03,0x06,0x17,0x2b,0x17,0x01,0x01,0x33,0x13,0x15,0x03,0x73,0x01,0x1e,0xfe,0xe8,0x66,0xfc,0xfc,0x73,0x01,0xcf,0x01,0xd3,0xfe,0x6d,0x7a,0xfe,0x6b,0x00,0x00,0x00,0x02,0x00,0x2e,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x06,0x00,0x0d,0x00,0x20,0x40,0x1d,0x0d,0x0c,0x09,0x06,0x05,0x02,0x06,0x00,0x01,0x01, -0x4c,0x03,0x01,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x12,0x13,0x12,0x10,0x04,0x06,0x1a,0x2b,0x17,0x23,0x01,0x01,0x33,0x01,0x15,0x01,0x23,0x01,0x01,0x33,0x01,0x15,0xe3,0x37,0x01,0x1e,0xfe,0xe2,0x37,0x01,0x11,0xfe,0x71,0x37,0x01,0x1e,0xfe,0xe2,0x37,0x01,0x11,0x6e,0x01,0xd6,0x01,0xd6,0xfe,0x43,0x33,0xfe,0x44,0x01, -0xd6,0x01,0xd6,0xfe,0x43,0x33,0x00,0x00,0x00,0x02,0x00,0x69,0xff,0x92,0x01,0xb8,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x04,0x01,0x01,0x00,0x02,0x01,0x67,0x05,0x01,0x00,0x03,0x03,0x00,0x57,0x05,0x01,0x00,0x00,0x03,0x5f,0x06,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07, -0x11,0x11,0x11,0x07,0x06,0x19,0x2b,0x17,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x03,0x23,0x11,0x33,0x69,0xaf,0xaf,0x01,0x4f,0x32,0x3c,0x3c,0x6e,0x2d,0x03,0x52,0x2d,0xfc,0x54,0x03,0x7f,0xfc,0xae,0x00,0x00,0xff,0xff,0x00,0xda,0x01,0x09,0x01,0x7e,0x01,0xab,0x03,0x07,0x03,0x29,0x00,0x00,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8, -0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0xcd,0xff,0x60,0x01,0x81,0x02,0x30,0x02,0x06,0x03,0x2c,0x00,0x00,0x00,0x03,0x00,0x5d,0xff,0x74,0x02,0x12,0x03,0x67,0x00,0x1c,0x00,0x25,0x00,0x2e,0x00,0x55,0x40,0x52,0x0b,0x01,0x09,0x01,0x11,0x01,0x0b,0x08,0x17,0x01,0x00,0x0a,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85, -0x0c,0x07,0x02,0x05,0x00,0x05,0x86,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x09,0x09,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x0a,0x0a,0x00,0x5f,0x06,0x01,0x00,0x00,0x39,0x00,0x4e,0x00,0x00,0x2e,0x2c,0x28,0x26,0x25,0x23,0x1f,0x1d,0x00,0x1c,0x00,0x1c,0x11,0x1e,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1d,0x2b,0x17, -0x35,0x23,0x11,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x23,0x15,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xb3,0x56,0x56,0x3c,0x46,0x3c,0x44,0x4c,0x3a,0x34,0x3b,0x44,0x55,0x4c,0x3c,0x46,0x3a,0x76, -0x3a,0x43,0x42,0x3a,0x77,0x7c,0x3f,0x49,0x49,0x3f,0x7c,0x8c,0x8c,0x02,0xda,0x8d,0x8d,0x8d,0x94,0x10,0x5e,0x48,0x3b,0x52,0x0e,0x10,0x60,0x47,0x50,0x68,0x0e,0x91,0x8c,0x8c,0x02,0x2f,0x3e,0x35,0x35,0x3e,0xfd,0xc8,0x43,0x3a,0x3c,0x4b,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x74,0x02,0x0b,0x02,0xb2,0x00,0x1b,0x00,0x23,0x00,0x3f, -0x40,0x3c,0x20,0x12,0x0b,0x08,0x04,0x01,0x00,0x1f,0x1a,0x13,0x01,0x04,0x03,0x02,0x02,0x4c,0x00,0x01,0x00,0x02,0x00,0x01,0x02,0x80,0x00,0x02,0x03,0x00,0x02,0x03,0x7e,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1b,0x17,0x14,0x19,0x05,0x09,0x19,0x2b,0x05, -0x35,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x26,0x26,0x27,0x11,0x36,0x36,0x37,0x33,0x06,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x11,0x06,0x06,0x15,0x01,0x11,0x55,0x64,0x64,0x55,0x3c,0x55,0x66,0x03,0x5a,0x03,0x34,0x2d,0x2d,0x34,0x03,0x5a,0x03,0x66,0x55,0x9b,0x33,0x2c,0x2c,0x33,0x8c,0x84,0x0a, -0x6d,0x59,0x96,0x59,0x6d,0x0a,0x84,0x83,0x07,0x64,0x52,0x2e,0x38,0x06,0xfe,0x6a,0x06,0x38,0x2e,0x52,0x64,0x07,0x83,0x01,0x54,0x34,0x41,0x0a,0x01,0x94,0x0a,0x40,0x34,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x71,0x02,0x2e,0x02,0x7b,0x00,0x1c,0x00,0x2a,0x00,0x6a,0x40,0x20,0x15,0x13,0x0f,0x0d,0x04,0x03,0x01,0x1b,0x16,0x0c, -0x08,0x04,0x02,0x03,0x1c,0x07,0x05,0x01,0x04,0x00,0x02,0x03,0x4c,0x14,0x0e,0x02,0x01,0x4a,0x06,0x01,0x00,0x49,0x4b,0xb0,0x21,0x50,0x58,0x40,0x13,0x04,0x01,0x02,0x00,0x00,0x02,0x00,0x65,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x03,0x4e,0x1b,0x40,0x1a,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x04,0x01,0x02,0x00,0x00, -0x02,0x59,0x04,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x02,0x00,0x51,0x59,0x40,0x0d,0x1e,0x1d,0x24,0x22,0x1d,0x2a,0x1e,0x2a,0x2c,0x22,0x05,0x09,0x18,0x2b,0x25,0x27,0x06,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x17,0x37,0x17,0x07,0x16,0x15,0x14,0x06,0x07,0x17,0x25,0x32,0x36,0x35,0x34, -0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0xef,0x57,0x2e,0x3d,0x3e,0x2f,0x55,0x3e,0x53,0x21,0x22,0x56,0x3f,0x58,0x30,0x3b,0x3f,0x30,0x54,0x3d,0x53,0x1f,0x11,0x0f,0x55,0xfe,0xff,0x38,0x4a,0x4a,0x38,0x25,0x3c,0x23,0x23,0x3c,0x71,0x57,0x1d,0x1d,0x55,0x3e,0x54,0x31,0x3f,0x40,0x31,0x56,0x3f,0x58,0x1c,0x1f,0x54,0x3d, -0x53,0x32,0x3d,0x1f,0x39,0x18,0x55,0x40,0x4c,0x39,0x39,0x4c,0x23,0x3c,0x26,0x26,0x3c,0x23,0x00,0x00,0x00,0x03,0x00,0x48,0xff,0x74,0x02,0x10,0x03,0x66,0x00,0x23,0x00,0x2a,0x00,0x32,0x00,0x3a,0x40,0x37,0x28,0x1a,0x13,0x10,0x04,0x02,0x01,0x32,0x27,0x1b,0x09,0x04,0x00,0x02,0x2b,0x22,0x08,0x01,0x04,0x03,0x00,0x03,0x4c,0x00, -0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x02,0x85,0x00,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x23,0x00,0x23,0x14,0x1c,0x14,0x05,0x09,0x19,0x2b,0x05,0x35,0x26,0x26,0x27,0x33,0x14,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x34,0x26,0x27,0x15,0x17,0x16,0x16,0x15, -0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x01,0x13,0x5e,0x6b,0x02,0x5a,0x3b,0x36,0x1b,0x4b,0x51,0x63,0x54,0x3c,0x53,0x64,0x01,0x5a,0x31,0x2d,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x2f,0x2c,0x0c,0x8c,0x83,0x08,0x69,0x56,0x31,0x3e,0x07,0x01, -0x06,0x08,0x17,0x6c,0x49,0x50,0x68,0x08,0x84,0x83,0x08,0x68,0x52,0x2f,0x3b,0x07,0xf8,0x0d,0x17,0x6e,0x4a,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x41,0x0e,0x04,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xb0,0x02,0x58,0x02,0xda,0x00,0x1c,0x00,0x2a,0x00,0x2e,0x00,0x9a,0xb6,0x19, -0x0a,0x02,0x08,0x09,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2e,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x0d,0x01,0x08,0x00,0x00,0x08,0x59,0x00,0x0a,0x0e,0x01,0x0b,0x0a,0x0b,0x63,0x07,0x0c,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x38,0x04,0x4e,0x1b,0x40,0x2f,0x05,0x01, -0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x0d,0x01,0x08,0x0c,0x01,0x00,0x0a,0x08,0x00,0x69,0x00,0x0a,0x0e,0x01,0x0b,0x0a,0x0b,0x63,0x00,0x07,0x07,0x04,0x5f,0x00,0x04,0x04,0x38,0x07,0x4e,0x59,0x40,0x27,0x2b,0x2b,0x1e,0x1d,0x01,0x00,0x2b,0x2e,0x2b,0x2e,0x2d,0x2c,0x25,0x23,0x1d,0x2a, -0x1e,0x2a,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1c,0x01,0x1c,0x0f,0x09,0x16,0x2b,0x25,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15, -0x15,0x14,0x16,0x07,0x35,0x21,0x15,0x01,0x0c,0x52,0x60,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x74,0x74,0x5a,0x5e,0x5e,0x5a,0x01,0x07,0x4e,0x20,0x38,0x3e,0x3e,0x38,0x39,0x3d,0x3d,0x97,0x01,0xa4,0x32,0x6e,0x5e,0x29,0x5f,0x6e,0x3e,0x35,0x7d,0x3c,0x4b,0x55,0x55,0x4b,0xfe,0x02,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x1e,0x3e,0x46,0x44, -0x40,0x1e,0x40,0x44,0xd0,0x50,0x50,0x00,0x00,0x01,0x00,0x13,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x2b,0x00,0x60,0x40,0x5d,0x00,0x06,0x07,0x04,0x07,0x06,0x04,0x80,0x00,0x0d,0x01,0x0c,0x01,0x0d,0x0c,0x80,0x08,0x01,0x04,0x09,0x01,0x03,0x02,0x04,0x03,0x67,0x0a,0x01,0x02,0x0b,0x01,0x01,0x0d,0x02,0x01,0x67,0x00,0x07,0x07,0x05, -0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x0c,0x0c,0x00,0x61,0x0e,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x29,0x28,0x26,0x24,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x17,0x15,0x13,0x12,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x2b,0x01,0x2b,0x0f,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x35,0x33,0x35,0x23, -0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x49,0x49,0x49,0x49,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0xad,0xad,0xad,0xad,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62, -0x2d,0x41,0x64,0x41,0x37,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0x37,0x41,0x64,0x41,0x2d,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x1a,0x00,0x33,0x40,0x30,0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00,0x00,0x00,0x07, -0x5f,0x08,0x01,0x07,0x07,0x3d,0x07,0x4e,0x00,0x00,0x00,0x1a,0x00,0x19,0x11,0x12,0x21,0x23,0x11,0x13,0x21,0x09,0x09,0x1d,0x2b,0x15,0x35,0x33,0x32,0x36,0x35,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x14,0x06,0x23,0x69,0x35,0x3e,0xa0,0xa0,0x51,0x49,0xa1,0xa1,0x40,0xe1,0xe1, -0x70,0x5d,0xb4,0x52,0x3d,0x34,0x01,0x2a,0x52,0xc4,0x42,0x49,0x50,0x3c,0xc3,0x52,0xfe,0xd6,0x58,0x6b,0x00,0x02,0x00,0x32,0xff,0xf6,0x02,0x26,0x02,0xe4,0x00,0x19,0x00,0x31,0x00,0x5a,0x40,0x57,0x00,0x02,0x01,0x00,0x01,0x02,0x00,0x80,0x00,0x09,0x07,0x08,0x07,0x09,0x08,0x80,0x04,0x01,0x00,0x0c,0x01,0x05,0x06,0x00,0x05,0x67, -0x00,0x06,0x0d,0x0b,0x02,0x07,0x09,0x06,0x07,0x67,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x03,0x3e,0x4d,0x00,0x08,0x08,0x0a,0x61,0x00,0x0a,0x0a,0x3f,0x0a,0x4e,0x1a,0x1a,0x00,0x00,0x1a,0x31,0x1a,0x31,0x2d,0x2b,0x29,0x28,0x26,0x24,0x1e,0x1d,0x1c,0x1b,0x00,0x19,0x00,0x19,0x16,0x22,0x12,0x26,0x11,0x0e,0x09,0x1b,0x2b,0x13,0x35, -0x21,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x05,0x35,0x21,0x15,0x21,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x32,0x01,0x17,0x25,0x15,0x1c,0x38,0x31,0x38,0x41,0x59,0x02,0x6e,0x61,0x59,0x69, -0x25,0x1e,0x09,0x7b,0xfe,0x0c,0x01,0xf4,0xfe,0xd2,0x10,0x16,0x1b,0x3b,0x31,0x38,0x44,0x59,0x01,0x72,0x61,0x59,0x6c,0x33,0x01,0x8e,0x46,0x20,0x12,0x2b,0x18,0x26,0x27,0x35,0x31,0x55,0x5f,0x4e,0x48,0x22,0x35,0x1b,0x08,0x46,0x92,0x46,0x46,0x0c,0x10,0x2d,0x18,0x25,0x32,0x3f,0x31,0x55,0x69,0x58,0x48,0x3b,0x2b,0x00,0x00,0x00, -0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x18,0x00,0x21,0x00,0x3d,0x40,0x3a,0x09,0x01,0x03,0x05,0x01,0x02,0x01,0x03,0x02,0x67,0x06,0x01,0x01,0x07,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x0a,0x0a,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x0b,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x21,0x1f,0x1b,0x19,0x00,0x18,0x00, -0x18,0x11,0x11,0x26,0x21,0x11,0x11,0x11,0x11,0x0c,0x09,0x1e,0x2b,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x15,0x33,0x15,0x23,0x15,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x6e,0x50,0x50,0x50,0x50,0xdf,0x42,0x61,0x36,0x36,0x61,0x42,0x85,0xe6,0xe6,0x85,0x39, -0x43,0x43,0x39,0x85,0x9b,0x50,0x55,0x50,0x01,0x4a,0x33,0x5c,0x3e,0x3d,0x5d,0x33,0x55,0x50,0x9b,0x01,0x90,0x44,0x39,0x39,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x17,0x02,0xe4,0x00,0x2a,0x00,0x42,0x40,0x3f,0x01,0x01,0x07,0x00,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x05,0x01,0x01,0x06,0x01,0x00, -0x07,0x01,0x00,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x07,0x07,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x2a,0x00,0x2a,0x16,0x11,0x16,0x22,0x12,0x26,0x11,0x17,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x3e,0x02,0x35,0x34,0x27,0x23,0x35,0x33,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23, -0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x06,0x07,0x21,0x15,0x4b,0x18,0x32,0x23,0x05,0x68,0x4b,0x0e,0x1e,0x14,0x74,0x62,0x63,0x73,0x01,0x5f,0x42,0x37,0x3a,0x40,0x18,0x22,0x0f,0xb9,0xa3,0x03,0x23,0x33,0x18,0x01,0x72,0x64,0x13,0x35,0x39,0x19,0x1b,0x18,0x50,0x1a,0x31,0x39,0x26, -0x55,0x64,0x65,0x59,0x32,0x3c,0x39,0x35,0x23,0x33,0x30,0x1f,0x50,0x14,0x16,0x2b,0x49,0x35,0x0e,0x50,0x00,0x01,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x17,0x00,0x36,0x40,0x33,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x10,0x03,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x01,0x5f,0x00, -0x01,0x01,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x19,0x05,0x09,0x19,0x2b,0x21,0x35,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x15,0x07,0x15,0x37,0x15,0x07,0x15,0x01,0x00,0xb0,0xb0,0xb0,0xb0,0xd3,0x01,0xfe,0xd3,0xb0,0xb0,0xb0,0xb0,0xb7,0x30, -0x4b,0x30,0x64,0x30,0x4b,0x30,0xda,0x4f,0x4f,0xc2,0x30,0x4b,0x30,0x64,0x30,0x4b,0x30,0xcf,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x1c,0x00,0x3e,0x40,0x3b,0x0c,0x01,0x02,0x03,0x01,0x4c,0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x68,0x07,0x01,0x00,0x0b,0x0a,0x02,0x08,0x09,0x00,0x08,0x67,0x04, -0x01,0x03,0x03,0x38,0x4d,0x00,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x1c,0x00,0x1c,0x1b,0x1a,0x11,0x11,0x11,0x11,0x18,0x11,0x11,0x11,0x11,0x0c,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x3c,0xc3,0xc3, -0xa0,0xb9,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xb9,0xa0,0xc3,0xc3,0xc3,0x5a,0x78,0x4b,0x4b,0x4b,0x01,0x81,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x7f,0x4b,0x4b,0x4b,0x78,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x58,0xff,0x4c,0x02,0x0b,0x02,0xda,0x00,0x21,0x00,0x42,0x40,0x3f,0x0b,0x08,0x02,0x02, -0x00,0x20,0x01,0x02,0x05,0x03,0x02,0x4c,0x00,0x01,0x02,0x04,0x02,0x01,0x04,0x80,0x00,0x04,0x03,0x02,0x04,0x03,0x7e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x05,0x5f,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x00,0x00,0x00,0x21,0x00,0x21,0x12,0x25,0x22,0x14,0x19,0x07,0x09,0x1b,0x2b,0x05,0x35,0x26,0x26, -0x35,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x07,0x15,0x01,0x02,0x4e,0x5c,0x5c,0x4e,0x5a,0x4e,0x5e,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x5e,0x4e,0xb4,0xae,0x0d,0x6c,0x55,0x96,0x55,0x6c,0x0d, -0xae,0xad,0x0a,0x63,0x4e,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x4e,0x63,0x0a,0xad,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0x4c,0x02,0x10,0x03,0x84,0x00,0x2d,0x00,0x3a,0x40,0x37,0x2d,0x02,0x02,0x02,0x00,0x19,0x16,0x02,0x03,0x05,0x02,0x4c,0x00,0x01,0x02,0x04,0x02,0x01,0x04,0x80,0x00,0x04,0x05,0x02,0x04,0x05,0x7e,0x00, -0x00,0x00,0x02,0x01,0x00,0x02,0x69,0x00,0x05,0x05,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x22,0x14,0x1d,0x22,0x14,0x10,0x06,0x09,0x1c,0x2b,0x01,0x33,0x15,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35, -0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x05,0x5a,0x47,0x56,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49,0x51,0x5f,0x52,0x5a,0x57,0x66,0x5a,0x4e,0x40,0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x5e,0x4d,0x03,0x84,0xa5,0x0f,0x65,0x48,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x54,0x6e,0x0c,0xae,0xad, -0x0b,0x6c,0x58,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0xaa,0x02,0x12,0x02,0x39,0x00,0x1b,0x00,0x1f,0x00,0x86,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x08,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00, -0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x1b,0x40,0x32,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x08,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00, -0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x59,0x40,0x16,0x1c,0x1c,0x00,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x0a,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22, -0x15,0x15,0x07,0x35,0x21,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x01,0xcc,0x01,0x71,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0xc7,0x50,0x50,0x00,0x03,0x00,0x1d,0xff,0xf6,0x02,0x3b,0x02,0x30,0x00,0x0b, -0x00,0x17,0x00,0x23,0x00,0x3b,0x40,0x38,0x03,0x01,0x01,0x07,0x02,0x06,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16, -0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x64,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0x6f,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xe9,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0xb0, -0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0x46,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x02,0x00,0x9e,0xff,0xc9,0x01,0xc6,0x02,0x5d,0x00,0x21,0x00,0x2f,0x00,0x08,0xb5,0x2c,0x25,0x0d,0x00,0x02,0x32,0x2b,0x17,0x35,0x36,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x26, -0x27,0x35,0x16,0x17,0x36,0x37,0x15,0x06,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x07,0x16,0x17,0x15,0x26,0x27,0x06,0x03,0x14,0x16,0x17,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0xa8,0x34,0x29,0x38,0x2f,0x2f,0x38,0x29,0x34,0x50,0x3a,0x3a,0x50,0x34,0x29,0x38,0x2f,0x2f,0x38,0x29,0x34,0x50,0x3a,0x3a,0x28,0x2b,0x37,0x37, -0x2b,0x2b,0x37,0x37,0x2b,0x37,0x2d,0x0b,0x12,0x2d,0x7e,0x4b,0x14,0x4b,0x7e,0x2d,0x12,0x0b,0x2d,0x0e,0x1f,0x1f,0x0e,0x2d,0x0b,0x12,0x2d,0x7e,0x4b,0x14,0x4b,0x7e,0x2d,0x12,0x0b,0x2d,0x0e,0x1f,0x1f,0x01,0x32,0x43,0x71,0x28,0x28,0x71,0x43,0x14,0x43,0x71,0x28,0x28,0x71,0x43,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x32,0x02,0x58, -0x02,0x9b,0x00,0x05,0x00,0x08,0x00,0x0b,0x00,0x0a,0xb7,0x0b,0x09,0x07,0x06,0x01,0x00,0x03,0x32,0x2b,0x35,0x11,0x01,0x01,0x11,0x01,0x17,0x11,0x07,0x05,0x37,0x27,0x01,0x2c,0x01,0x2c,0xfe,0xd3,0xfb,0xd6,0xfe,0xe2,0xd5,0xd5,0x32,0x02,0x69,0xfe,0xef,0x01,0x11,0xfd,0x97,0x01,0x13,0xa0,0x01,0x86,0xc3,0xc5,0xc4,0xc2,0x00,0x00, -0xff,0xff,0x00,0xda,0x00,0xf0,0x01,0x7e,0x01,0x92,0x03,0x07,0x03,0x29,0x00,0x00,0x00,0xfa,0x00,0x08,0xb1,0x00,0x01,0xb0,0xfa,0xb0,0x35,0x2b,0x00,0x04,0x00,0x00,0x00,0x64,0x02,0x58,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x52,0x40,0x4f,0x00,0x02,0x09,0x01,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x08,0x01,0x00, -0x05,0x01,0x00,0x69,0x00,0x05,0x06,0x04,0x05,0x59,0x00,0x06,0x0b,0x01,0x07,0x04,0x06,0x07,0x67,0x00,0x05,0x05,0x04,0x61,0x0a,0x01,0x04,0x05,0x04,0x51,0x1c,0x1c,0x11,0x10,0x0c,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06, -0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x50,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x86,0x01,0x5e,0xfd,0xf8,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x86,0x01,0x5e,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c, -0x24,0x25,0x2b,0x0a,0x50,0x50,0xfe,0xca,0x2c,0x24,0x25,0x2b,0x2b,0x25,0x24,0x2c,0x46,0x50,0x50,0x00,0x00,0x01,0x00,0x9b,0xff,0xf6,0x01,0xc7,0x02,0x30,0x00,0x1f,0x00,0x6f,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x26,0x00,0x02,0x03,0x05,0x03,0x02,0x72,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04, -0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x1b,0x40,0x28,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x1c, -0x1b,0x18,0x16,0x11,0x0f,0x0c,0x0b,0x08,0x06,0x00,0x1f,0x01,0x1f,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x31,0x44,0x52,0x52,0x44,0x44,0x52,0x5a,0x21,0x1b,0x1b,0x21,0x21,0x1b, -0x1b,0x21,0x5a,0x52,0x0a,0x52,0x44,0x01,0x0e,0x44,0x52,0x52,0x44,0x28,0x32,0x1b,0x21,0x21,0x1b,0xfe,0xde,0x1b,0x21,0x21,0x1b,0x32,0x28,0x44,0x52,0x00,0x00,0x00,0x00,0x03,0x00,0x46,0x00,0x4c,0x02,0x12,0x02,0x9e,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0xa0,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x39,0x00,0x02,0x00,0x04,0x01,0x02,0x72, -0x0a,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x0b,0x01,0x07,0x08,0x06,0x07,0x67,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0c,0x01,0x09,0x08,0x09,0x4f,0x1b,0x40,0x3b,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x0a,0x01,0x05, -0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x0b,0x01,0x07,0x08,0x06,0x07,0x67,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0c,0x01,0x09,0x08,0x09,0x4f,0x59,0x40,0x1e,0x20,0x20,0x1c,0x1c,0x00,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x1c, -0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x0d,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25, -0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x01,0xcc,0xfe,0x34,0x01,0xcc,0x01,0xd6,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0xb2,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x02,0xda,0x00,0x0b,0x00,0x2c,0x40,0x29,0x03,0x01,0x01,0x00,0x01,0x85,0x04,0x02, -0x02,0x00,0x05,0x05,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x17,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x28,0x41,0x5a,0xd2,0x5a,0x41,0xb4,0x52,0x03,0x3c,0xfc,0xc4,0x03,0x3c,0xfc,0xc4,0x52,0x00, -0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x02,0x3c,0x02,0x2a,0x00,0x14, -0x00,0x13,0x40,0x10,0x14,0x10,0x0c,0x0b,0x00,0x05,0x00,0x4a,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x01,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x26,0x26,0x27,0x35,0x1e,0x02,0x17,0x3e,0x02,0x37,0x02,0x3c,0x44,0x66,0x37,0x64,0x36,0x63,0x43,0x4d,0x76,0x45,0x06,0x07,0x47,0x78,0x4d,0x01,0xd0,0x08,0x63,0xa2,0x69,0x5a,0x5a, -0x69,0xa2,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x00,0xbe,0x01,0xb9,0x01,0xd8,0x00,0x03,0x00,0x07,0x00,0x08,0xb5,0x06,0x04,0x02,0x00,0x02,0x32,0x2b,0x25,0x27,0x37,0x17,0x07,0x37,0x27,0x07,0x01,0x2c,0x8d,0x8d,0x8d,0x8d,0x54,0x54,0x54,0xbe,0x8d,0x8d,0x8d,0x54,0x54,0x54, -0x54,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0x00,0x00,0x01,0x59,0x02,0xda,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x33,0x11,0x33,0x11,0xff,0x5a,0x02,0xda,0xfd,0x26,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x02,0x06, -0x03,0x20,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x01,0xdb,0x02,0xda,0x00,0x0b,0x00,0x2c,0x40,0x29,0x0a,0x07,0x04,0x01,0x04,0x03,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x01,0x85,0x04,0x01,0x03,0x02,0x03,0x85,0x00,0x02,0x02,0x76,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x05,0x06,0x19,0x2b,0x37,0x37, -0x11,0x33,0x15,0x37,0x33,0x07,0x11,0x23,0x35,0x07,0x7d,0x82,0x5a,0x3c,0x46,0x82,0x5a,0x3c,0x8c,0xd1,0x01,0x7d,0xec,0x60,0xd1,0xfe,0x83,0xec,0x60,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0xaa,0x01,0xcc,0x01,0xea,0x00,0x0b,0x00,0x0f,0x00,0x30,0x40,0x2d,0x00,0x01,0x04,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x03,0x03,0x02, -0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x0c,0x0c,0x01,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xc6,0x01,0x40,0x01,0x54,0x29,0x22, -0x22,0x29,0x29,0x22,0x22,0x29,0xaa,0x50,0x50,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x46,0x02,0x35,0x02,0x8a,0x00,0x15,0x00,0x29,0x00,0x48,0x40,0x45,0x00,0x01,0x00,0x02,0x05,0x01,0x02,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x09,0x01,0x04,0x03,0x07,0x04,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03, -0x00,0x5f,0x08,0x01,0x00,0x03,0x00,0x4f,0x17,0x16,0x01,0x00,0x28,0x26,0x21,0x1f,0x1e,0x1c,0x16,0x29,0x17,0x29,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x0a,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x27,0x22,0x26,0x35,0x35,0x34, -0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x18,0x4a,0x6f,0x3c,0x3c,0x6f,0x4a,0x01,0x1d,0xfe,0xe3,0x4b,0x5a,0x5a,0x4b,0x01,0x1d,0xf4,0x38,0x40,0x40,0x38,0xf4,0xea,0x17,0x1b,0x1b,0x17,0xea,0x46,0x3c,0x6c,0x48,0x64,0x49,0x6b,0x3c,0x46,0x5d,0x4d,0x64,0x4d,0x5d,0x46,0x9b,0x3d,0x36,0x28,0x36, -0x3d,0x46,0x1b,0x17,0x1e,0x17,0x1b,0x46,0x00,0x03,0xff,0xf6,0x00,0x19,0x02,0x62,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19, -0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x3d, -0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xd0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xcf,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x01,0x00,0x23,0x00,0x46,0x02,0x3a,0x02,0x8a,0x00,0x1b, -0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x05,0x00,0x4f,0x01,0x00,0x1a,0x18,0x14,0x13,0x12,0x11,0x0d,0x0b,0x0a,0x08,0x00,0x1b,0x01,0x1b,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34, -0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x06,0x15,0x15,0x21,0x15,0x21,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x01,0x09,0x3e,0x69,0x3f,0x3f,0x69,0x3e,0x01,0x31,0xfe,0xcf,0x27,0x40,0x25,0x01,0xbd,0xfe,0x43,0x25,0x40,0x27,0x01,0x31,0x46,0x39,0x63,0x3e,0x90,0x3e,0x63,0x39,0x50,0x27,0x40,0x25,0x1e,0x50,0x1e,0x25,0x40,0x27,0x50, -0x00,0x01,0x00,0xa5,0x00,0xb6,0x01,0xbd,0x01,0xe2,0x00,0x17,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x05,0x00,0x4f,0x01,0x00,0x16,0x14,0x11,0x10,0x0f,0x0e,0x0b,0x09,0x08,0x06,0x00,0x17,0x01, -0x17,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x1a,0x36,0x3f,0x3f,0x36,0xa3,0xa3,0x1f,0x24,0xe6,0xe6,0x24,0x1f,0xa3,0xb6,0x3f,0x36,0x42,0x36,0x3f,0x2d,0x24,0x1f,0x11,0x2a,0x11,0x1f,0x24,0x2d,0x00,0x00,0x03,0x00,0xe6, -0x00,0x19,0x01,0x73,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13, -0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2d,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x20,0x20,0x27,0x27, -0x20,0x20,0x26,0x26,0x20,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x01,0x00,0x78,0x00,0x00,0x01,0xe0,0x01,0xfe,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, -0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x33,0x11,0x21,0x11,0x78,0x01,0x68,0x01,0xfe,0xfe,0x02,0x00,0x02,0x00,0x97,0x01,0xd2,0x01,0xc4,0x02,0xb2,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01, -0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x0b,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x97,0x01,0x2d,0xfe,0xd3,0x01,0x2d,0x02,0x7a,0x38,0x38,0xa8,0x38,0x38,0x00,0x00,0x00,0x00,0x03,0x00,0x55,0x00,0x4c,0x02,0x03,0x02,0x48,0x00,0x03,0x00,0x07,0x00,0x0b, -0x00,0x40,0x40,0x3d,0x00,0x00,0x06,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06, -0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0x01,0xfc,0x4c,0x4c,0xd8,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x02,0x00,0x2d,0x00,0x73,0x02,0x2b,0x02,0x21,0x00,0x0f,0x00,0x1f,0x00,0x44,0x40,0x41,0x03,0x01,0x01,0x02,0x01,0x85,0x09,0x07,0x02,0x05, -0x06,0x05,0x86,0x00,0x02,0x08,0x01,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x00,0x06,0x04,0x06,0x4f,0x10,0x10,0x01,0x00,0x10,0x1f,0x10,0x1f,0x1d,0x1a,0x18,0x17,0x15,0x12,0x0c,0x0b,0x09,0x06,0x04,0x03,0x00,0x0f,0x01,0x0e,0x0a,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x33,0x14,0x16,0x33, -0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x01,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0xf5,0x5c,0x6c,0x5a,0x3b,0x33,0x6e,0x33,0x3b,0x5a,0x6c,0x5c,0xfe,0xca,0x6c,0x5c,0x6e,0x5c,0x6c,0x5a,0x3b,0x33,0x6e,0x33,0x3b,0x01,0x77,0x5c,0x4e,0x29,0x31,0x31,0x29,0x4e,0x5c,0xfe,0xfc,0x4e,0x5c,0x5c, -0x4e,0x29,0x31,0x31,0x29,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x69,0x02,0x58,0x02,0x2b,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x07,0x01,0x03,0x05,0x02,0x03,0x67,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x11, -0x10,0x0c,0x0c,0x01,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x35,0x21,0x15,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x08,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c, -0xfd,0xd4,0x01,0x5e,0xaa,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x01,0x95,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x73,0x50,0x50,0xb9,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x01,0xf4,0x02,0xda,0x00,0x0b,0x00,0x32,0x40,0x2f,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x00,0x02,0x00,0x01, -0x00,0x02,0x01,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x21,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x50,0x01,0x4a,0xfe,0xd9,0x01,0x27,0xfe,0xb6,0x01,0xa4,0x52,0x01,0x02,0x52,0xe2, -0x52,0xfd,0x26,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x03,0x00,0x0c,0x00,0x2a,0x40,0x27,0x08,0x01,0x01,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x04,0x04,0x04,0x0c,0x04,0x0c,0x11,0x10,0x04,0x06,0x18,0x2b,0x13,0x21, -0x03,0x23,0x03,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x32,0x01,0xf4,0xbd,0x7b,0x4c,0x69,0x0d,0x11,0x04,0x04,0x13,0x0d,0x65,0x02,0xda,0xfd,0x26,0x02,0x8a,0xfe,0x5f,0x34,0x58,0x17,0x17,0x59,0x34,0x01,0xa0,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0xff,0xfb,0x02,0x08,0x02,0xd0,0x00,0x0c,0x00,0x28,0x00,0x7d,0x40,0x0a,0x0c,0x0b, -0x0a,0x09,0x05,0x01,0x00,0x07,0x00,0x4a,0x4b,0xb0,0x11,0x50,0x58,0x40,0x27,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x06,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x1b,0x40,0x29,0x00,0x02,0x00,0x04,0x00,0x02,0x04, -0x80,0x06,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x59,0x40,0x13,0x0d,0x0d,0x0d,0x28,0x0d,0x28,0x25,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x12,0x10,0x07,0x06,0x16,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26, -0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfe,0x4d,0x47,0x3b,0x23,0x30,0x26,0x23,0x16,0x16,0x19,0x55,0x47,0x3b,0x23,0x31,0x25,0x24,0x15, -0x16,0x19,0xbe,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0xfe,0x6b,0x14,0x3b,0x47,0x18,0x20,0x18,0x19,0x16,0x1c,0x14,0x3b,0x47,0x18,0x20,0x18,0x19,0x16,0x1c,0x00,0x00,0x01,0x00,0x23,0x00,0xb5,0x02,0x34,0x01,0xdf,0x00,0x25,0x00,0x2b,0x40,0x28,0x04,0x01,0x01,0x06,0x01,0x03,0x02,0x01,0x03,0x69,0x07,0x01, -0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x02,0x00,0x51,0x14,0x24,0x24,0x11,0x14,0x24,0x24,0x10,0x08,0x06,0x1e,0x2b,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x23,0x22,0x06,0x15, -0x14,0x16,0x33,0xb1,0x43,0x4b,0x4a,0x43,0x35,0x4d,0x13,0x16,0x16,0x36,0x20,0x22,0x23,0x20,0x44,0x4a,0x49,0x44,0x37,0x50,0x12,0x17,0x14,0x33,0x1f,0x23,0x23,0x20,0xb5,0x4e,0x46,0x47,0x4f,0x39,0x34,0x3d,0x3d,0x2b,0x28,0x26,0x2a,0x44,0x4d,0x47,0x47,0x4f,0x3a,0x34,0x42,0x38,0x2c,0x28,0x26,0x2a,0x00,0x00,0x00,0x01,0xff,0xb0, -0x00,0x71,0x02,0xa8,0x02,0x24,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x01,0x02,0x01,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x60,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x25,0x37,0x21,0x37,0x33,0x07,0x21,0x07,0x01,0x7f,0xbd,0xfd, -0x74,0xe9,0x40,0xbd,0x02,0x8c,0xe9,0x71,0xc3,0xf0,0xc3,0xf0,0x00,0x02,0x00,0x0a,0x00,0xeb,0x02,0x44,0x01,0xa9,0x00,0x0e,0x00,0x1a,0x00,0x34,0x40,0x31,0x00,0x02,0x00,0x05,0x03,0x02,0x05,0x69,0x00,0x03,0x00,0x00,0x04,0x03,0x00,0x67,0x06,0x01,0x04,0x01,0x01,0x04,0x59,0x06,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x04,0x01,0x51, -0x10,0x0f,0x16,0x14,0x0f,0x1a,0x10,0x1a,0x12,0x24,0x22,0x10,0x07,0x06,0x1a,0x2b,0x01,0x21,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x21,0x05,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x44,0xfe,0x82,0x07,0x33,0x23,0x28,0x37,0x37,0x28,0x23,0x33,0x07,0x01,0x7e,0xfe,0x25,0x18,0x1f,0x1f, -0x18,0x18,0x1f,0x1f,0x01,0x35,0x21,0x29,0x37,0x28,0x29,0x36,0x29,0x21,0x4c,0x1f,0x18,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0xe5,0x03,0xfc,0x00,0x0a,0x00,0x26,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x01,0x00, -0x09,0x07,0x05,0x04,0x00,0x0a,0x01,0x0a,0x04,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x33,0x15,0x01,0xb8,0x58,0x61,0x5a,0x5f,0x2d,0x6e,0x57,0x4f,0x03,0xc4,0xfc,0x3c,0x56,0x50,0x00,0x00,0x01,0x00,0x2d,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x16,0x00,0x30,0x40,0x2d,0x12,0x01,0x00,0x01,0x01,0x4c,0x00,0x02, -0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x14,0x21,0x24,0x05,0x06,0x19,0x2b,0x13,0x11,0x34,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x07,0x16,0x16,0x15,0x11,0xff,0x0e,0x2b, -0x2b,0x6e,0x6e,0x2c,0x2a,0x0e,0x5a,0x33,0x32,0x31,0x34,0xfe,0xd4,0x02,0x08,0x24,0x2c,0x14,0x50,0x14,0x2d,0x23,0x02,0x08,0xfd,0xf8,0x39,0x4a,0x09,0x09,0x4a,0x39,0xfd,0xf8,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0xe5,0x03,0x3e,0x00,0x0a,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x59, -0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x00,0x00,0x00,0x0a,0x00,0x0a,0x21,0x23,0x04,0x06,0x18,0x2b,0x13,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x11,0xff,0x61,0x58,0x2d,0x2d,0x5f,0xfe,0xd4,0x03,0xc4,0x4f,0x57,0x50,0x56,0xfc,0x3c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x58,0x02,0x9b,0x00,0x08, -0x00,0x0b,0x00,0x08,0xb5,0x0b,0x09,0x04,0x03,0x02,0x32,0x2b,0x25,0x07,0x25,0x01,0x11,0x01,0x25,0x17,0x05,0x05,0x37,0x27,0x02,0x58,0x22,0xfe,0xf5,0xfe,0xd5,0x01,0x2c,0x01,0x0b,0x21,0xfe,0xf8,0xfe,0xe2,0xd5,0xd5,0x75,0x26,0xf6,0xfe,0xed,0x02,0x69,0xfe,0xef,0xf2,0x24,0xf0,0xc5,0xc4,0xc2,0x00,0x00,0x00,0x00,0x01,0x00,0xff, -0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0xf4,0x03,0xfc,0x00,0x05,0x00,0x24,0x40,0x21, -0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x11,0x33,0x15,0xff,0x5a,0x9b,0x6e,0x04,0x6a,0xfb,0xe6,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0xf4,0x03,0x3e,0x00,0x05, -0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x15,0x23,0x11,0xff,0xf5,0x9b,0xfe,0xd4,0x04,0x6a,0x50,0xfb,0xe6,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x17, -0x02,0xd0,0x00,0x0c,0x00,0x28,0x00,0x3b,0x40,0x38,0x0c,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x01,0x04,0x03,0x01,0x59,0x02,0x01,0x00,0x00,0x04,0x03,0x00,0x04,0x69,0x00,0x01,0x01,0x03,0x62,0x06,0x05,0x02,0x03,0x01,0x03,0x52,0x0d,0x0d,0x0d,0x28,0x0d,0x28,0x25,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x12,0x10,0x07, -0x06,0x16,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0xfe,0x3e,0x47,0x3b,0x23,0x39, -0x32,0x2c,0x16,0x16,0x19,0x55,0x47,0x3b,0x23,0x3a,0x31,0x2d,0x15,0x16,0x19,0xbe,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0xfe,0xe8,0x0f,0x3b,0x47,0x15,0x1c,0x15,0x19,0x16,0x17,0x0f,0x3b,0x47,0x15,0x1c,0x15,0x19,0x16,0x17,0x00,0x03,0xff,0xf6,0x01,0x08,0x02,0x62,0x01,0x94,0x00,0x0b,0x00,0x17,0x00,0x23, -0x00,0x37,0x40,0x34,0x05,0x03,0x02,0x01,0x00,0x00,0x01,0x59,0x05,0x03,0x02,0x01,0x01,0x00,0x61,0x08,0x04,0x07,0x02,0x06,0x05,0x00,0x01,0x00,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x3d,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xd0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xcf,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0x08,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x27, -0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x01,0x00,0x41,0xff,0xec,0x02,0x17,0x02,0x26,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x00,0x04,0x03,0x04,0x86,0x00,0x00,0x07,0x01,0x01,0x02,0x00,0x01,0x67,0x06,0x01,0x02,0x03,0x03,0x02,0x57,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03, -0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x08,0x06,0x1e,0x2b,0x13,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x23,0x46,0x01,0xcc,0xba,0xbf,0xbf,0x58,0xbf,0xbf,0xba,0x02,0x26,0x46,0xe1,0x50,0xc3,0xc3,0x50,0xe1,0x00,0x02,0x00,0x00,0x00,0x41,0x02,0x58,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x08, -0xb5,0x17,0x0d,0x0a,0x00,0x02,0x32,0x2b,0x25,0x35,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x35,0x05,0x15,0x05,0x35,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x35,0x05,0x15,0x01,0x0e,0xd2,0x11,0x21,0x0a,0x0a,0x21,0x11,0xd2,0x01,0x4a,0xfd,0xa8,0xd2,0x11,0x21,0x0a,0x0a,0x21,0x11,0xd2,0x01,0x4a,0x41,0x53,0x96,0x0c,0x11,0x04, -0x04,0x14,0x0b,0x8f,0x56,0xe0,0x4e,0xe4,0x53,0x96,0x0c,0x11,0x04,0x04,0x14,0x0b,0x8f,0x56,0xe0,0x4e,0x00,0x02,0x00,0x00,0x00,0x41,0x02,0x58,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x08,0xb5,0x10,0x0d,0x03,0x00,0x02,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x05,0x25,0x35,0x25,0x15,0x07,0x06, -0x06,0x07,0x16,0x16,0x17,0x17,0x02,0x58,0xfe,0xb6,0x01,0x4a,0xd2,0x10,0x22,0x0a,0x0a,0x21,0x11,0xd2,0xfe,0xf2,0xfe,0xb6,0x01,0x4a,0xd2,0x10,0x22,0x0a,0x0a,0x21,0x11,0xd2,0x41,0xe4,0x4e,0xe0,0x56,0x8f,0x0b,0x14,0x04,0x04,0x11,0x0c,0x96,0x53,0xe4,0x4e,0xe0,0x56,0x8f,0x0b,0x14,0x04,0x04,0x11,0x0c,0x96,0x00,0x02,0x00,0x14, -0x00,0xeb,0x02,0x4e,0x01,0xa9,0x00,0x0e,0x00,0x1a,0x00,0x3a,0x40,0x37,0x00,0x01,0x00,0x05,0x00,0x01,0x05,0x69,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x07,0x01,0x04,0x02,0x02,0x04,0x59,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x04,0x02,0x51,0x10,0x0f,0x00,0x00,0x16,0x14,0x0f,0x1a,0x10,0x1a,0x00,0x0e,0x00,0x0e,0x24, -0x22,0x11,0x08,0x06,0x19,0x2b,0x13,0x35,0x21,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x14,0x01,0x7e,0x07,0x33,0x23,0x29,0x36,0x36,0x29,0x23,0x33,0x07,0x5d,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x1f,0x01,0x35,0x2a,0x21,0x29,0x36,0x29,0x28,0x37,0x29, -0x21,0x22,0x1f,0x18,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x13,0x00,0x1f,0x00,0x43,0x40,0x40,0x02,0x01,0x00,0x06,0x00,0x85,0x00,0x06,0x05,0x06,0x85,0x0a,0x01,0x09,0x04,0x01,0x04,0x09,0x01,0x80,0x07,0x01,0x05,0x08,0x01,0x04,0x09,0x05,0x04,0x67,0x00,0x01,0x03,0x03, -0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x14,0x14,0x14,0x1f,0x14,0x1f,0x11,0x11,0x11,0x11,0x14,0x33,0x13,0x33,0x10,0x0b,0x06,0x1f,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x17,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x46, -0x32,0x51,0x4a,0x32,0x4a,0x51,0x32,0x68,0x63,0x36,0x63,0x68,0xd2,0x78,0x78,0x28,0x78,0x78,0x02,0xda,0xfd,0xee,0x4a,0x51,0x51,0x4a,0x02,0x12,0xfd,0xee,0x61,0x67,0x67,0x61,0x73,0x79,0x26,0x79,0x79,0x26,0x79,0x00,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x42,0x40,0x3f, -0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b, -0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a, -0x4a,0x76,0x44,0x44,0x76,0x4a,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xcc,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x07,0x00,0x20,0x40,0x1d, -0x03,0x01,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x00,0x02,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x2b,0x02,0x02,0x5a,0xfe,0xb2,0x5a,0x02,0xda,0xfd,0x26,0x02,0x88,0xfd,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d, -0x02,0xda,0x00,0x07,0x00,0x26,0x40,0x23,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x5f,0x04,0x01,0x03,0x01,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x2b,0x5a,0x01,0x4e,0x5a,0x02,0xda,0xfd,0x78,0x02,0x88,0xfd, -0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x50,0x02,0x2b,0x02,0xf0,0x00,0x03,0x00,0x10,0x00,0x3c,0x40,0x39,0x0c,0x01,0x03,0x02,0x01,0x4c,0x00,0x02,0x01,0x03,0x01,0x02,0x03,0x80,0x06,0x04,0x02,0x03,0x03,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x05,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04, -0x10,0x04,0x10,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x2d,0x01,0xfe,0xfe,0x11,0xb3,0x7a,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x02,0xa5,0x4b,0x4b,0xfd,0xab,0x01,0xf4,0xfe,0x0c,0x01,0x40,0x20,0x3f, -0x10,0x10,0x3f,0x20,0xfe,0xc0,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x13,0x00,0x13,0x33,0x13,0x33,0x05,0x06,0x19,0x2b,0x33,0x11,0x34,0x36, -0x33,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x11,0x2b,0x75,0x6f,0x3a,0x6f,0x75,0x5a,0x48,0x44,0x36,0x44,0x48,0x01,0xfe,0x6b,0x71,0x71,0x6b,0xfe,0x02,0x01,0xfe,0x44,0x48,0x48,0x44,0xfe,0x02,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01, -0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x33,0x13,0x33,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x2b,0x5a,0x48,0x44,0x36,0x44,0x48,0x5a,0x75,0x6f,0x3a,0x6f,0x75,0x02,0xda,0xfe,0x02,0x44, -0x48,0x48,0x44,0x01,0xfe,0xfe,0x02,0x6b,0x71,0x71,0x6b,0x00,0x00,0x01,0x00,0x46,0xff,0x9c,0x02,0x12,0x03,0x0c,0x00,0x2f,0x00,0xc6,0x40,0x0a,0x17,0x01,0x07,0x03,0x07,0x01,0x04,0x07,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x46,0x00,0x06,0x05,0x06,0x85,0x00,0x08,0x05,0x03,0x07,0x08,0x72,0x00,0x04,0x07,0x09,0x03,0x04,0x72, -0x00,0x0e,0x0d,0x0e,0x86,0x00,0x05,0x00,0x03,0x07,0x05,0x03,0x69,0x00,0x07,0x00,0x09,0x02,0x07,0x09,0x6a,0x0a,0x01,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x0d,0x0d,0x00,0x57,0x0c,0x01,0x00,0x00,0x0d,0x5f,0x10,0x0f,0x02,0x0d,0x00,0x0d,0x4f,0x1b,0x40,0x48,0x00,0x06,0x05,0x06,0x85,0x00,0x08,0x05,0x03,0x05, -0x08,0x03,0x80,0x00,0x04,0x07,0x09,0x07,0x04,0x09,0x80,0x00,0x0e,0x0d,0x0e,0x86,0x00,0x05,0x00,0x03,0x07,0x05,0x03,0x69,0x00,0x07,0x00,0x09,0x02,0x07,0x09,0x6a,0x0a,0x01,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x0d,0x0d,0x00,0x57,0x0c,0x01,0x00,0x00,0x0d,0x5f,0x10,0x0f,0x02,0x0d,0x00,0x0d,0x4f,0x59,0x40, -0x1e,0x00,0x00,0x00,0x2f,0x00,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x23,0x21,0x12,0x11,0x14,0x23,0x12,0x24,0x11,0x11,0x11,0x11,0x06,0x1f,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x37,0x33,0x07,0x36,0x35,0x35,0x33,0x15,0x14, -0x06,0x23,0x22,0x27,0x07,0x33,0x15,0x23,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x46,0x87,0x2f,0xb6,0xd0,0x29,0x1a,0x22,0x21,0x18,0x2f,0x55,0x47,0x3b,0x2b,0x35,0x23,0x0f,0x47,0x3f,0x51,0x2e,0x55,0x47,0x3b,0x0e,0x0c,0x21,0xbd,0xd7,0x2f,0x01,0x06,0xfe,0xe0,0x3b,0x3f,0x3b,0x4c,0x4c,0x8c,0x4c,0x7a,0x13,0x31,0x25,0x37,0x46,0x46, -0x3b,0x47,0x21,0x2f,0x13,0xd1,0xf0,0x01,0x36,0x46,0x46,0x3a,0x48,0x02,0x63,0x4c,0x8c,0x4c,0xb0,0xb0,0x00,0x02,0x00,0x23,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x1d,0x00,0x26,0x00,0xcc,0x40,0x0a,0x21,0x01,0x06,0x05,0x05,0x01,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x32,0x00,0x03,0x02,0x02,0x03,0x70,0x0c,0x01,0x0a, -0x00,0x00,0x0a,0x71,0x04,0x01,0x02,0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06,0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x1b,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x31,0x00,0x03,0x02,0x03,0x85,0x0c,0x01,0x0a,0x00,0x00,0x0a,0x71,0x04,0x01,0x02, -0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06,0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x1b,0x40,0x30,0x00,0x03,0x02,0x03,0x85,0x0c,0x01,0x0a,0x00,0x0a,0x86,0x04,0x01,0x02,0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06, -0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x59,0x59,0x40,0x16,0x00,0x00,0x24,0x22,0x00,0x1d,0x00,0x1d,0x1c,0x1b,0x11,0x11,0x11,0x11,0x11,0x11,0x28,0x11,0x11,0x0d,0x06,0x1f,0x2b,0x17,0x37,0x23,0x35,0x33,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37, -0x33,0x07,0x33,0x15,0x23,0x03,0x33,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x03,0x14,0x16,0x17,0x13,0x23,0x22,0x06,0x15,0x66,0x28,0x5c,0x7a,0x2d,0x53,0x63,0x3a,0x67,0x45,0x7f,0x37,0x46,0x37,0x6c,0x8a,0x74,0xfe,0xfe,0xe4,0x2c,0x01,0x48,0xfe,0x9a,0x28,0x2f,0x3f,0x3a,0x74,0x61,0x43,0x49,0x6e,0x6e,0x52,0x7a,0x0d,0x73,0x56,0x2c, -0x42,0x62,0x36,0x96,0x96,0x52,0xfe,0xc4,0x52,0x76,0x52,0x6e,0x02,0x12,0x3d,0x47,0x05,0x01,0x3b,0x48,0x42,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0xff,0x92,0x02,0x35,0x03,0x3e,0x00,0x21,0x00,0x29,0x00,0x91,0x40,0x0a,0x11,0x01,0x03,0x04,0x24,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x31,0x00,0x05,0x04,0x05,0x85, -0x00,0x09,0x08,0x08,0x09,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0b,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x69,0x07,0x01,0x00,0x08,0x08,0x00,0x57,0x07,0x01,0x00,0x00,0x08,0x5f,0x0c,0x0a,0x02,0x08,0x00,0x08,0x4f,0x1b,0x40,0x30,0x00,0x05,0x04,0x05,0x85,0x00,0x09,0x08,0x09,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03, -0x67,0x0b,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x69,0x07,0x01,0x00,0x08,0x08,0x00,0x57,0x07,0x01,0x00,0x00,0x08,0x5f,0x0c,0x0a,0x02,0x08,0x00,0x08,0x4f,0x59,0x40,0x16,0x00,0x00,0x27,0x25,0x00,0x21,0x00,0x21,0x20,0x1f,0x11,0x11,0x28,0x12,0x21,0x22,0x11,0x11,0x11,0x0d,0x06,0x1f,0x2b,0x33,0x35,0x33,0x37,0x23,0x35,0x33, -0x13,0x26,0x23,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x01,0x34,0x27,0x03,0x33,0x32,0x36,0x35,0x1e,0x8e,0x2c,0xba,0xd8,0x73,0x0c,0x0e,0xfe,0xcf,0x01,0x31,0x1d,0x1a,0x39,0x46,0x40,0x34,0x3c,0x3a,0x67,0x45,0x31,0x2c,0x01,0x34,0xfe,0xae,0x28, -0x46,0x28,0x01,0x4d,0x34,0x6b,0x13,0x43,0x49,0x52,0x76,0x52,0x01,0x3a,0x02,0x52,0x05,0x9b,0xb0,0x1a,0x63,0x43,0x2c,0x41,0x63,0x36,0x76,0x52,0x6e,0x6e,0x01,0xcc,0x4f,0x23,0xfe,0xdc,0x48,0x42,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x50,0x02,0x2b,0x02,0xf0,0x00,0x03,0x00,0x10,0x00,0x3c,0x40,0x39,0x0a,0x01,0x04,0x02,0x01,0x4c, -0x03,0x01,0x02,0x01,0x04,0x01,0x02,0x04,0x80,0x06,0x01,0x04,0x04,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x05,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x10,0x04,0x10,0x0f,0x0e,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x03,0x33,0x13,0x16,0x16,0x17,0x36, -0x36,0x37,0x13,0x33,0x03,0x2d,0x01,0xfe,0xfe,0xc4,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x5b,0xb3,0x02,0xa5,0x4b,0x4b,0xfd,0xab,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0x00,0x00,0x00,0x03,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x03,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25, -0x09,0x05,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x25,0x25,0x35,0x25,0x03,0x11,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x03,0x35,0x21,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0x4c,0xea,0x13, -0x21,0x08,0x09,0x22,0x11,0x78,0x01,0xae,0xbe,0xd7,0x64,0xd7,0xfe,0x6f,0x01,0x13,0x72,0x09,0x0c,0x02,0x02,0x0e,0x08,0xfe,0x4f,0x50,0x50,0x00,0x00,0x01,0x00,0x46,0xff,0xc4,0x02,0x12,0x03,0x0c,0x00,0x3f,0x00,0xe4,0x40,0x18,0x15,0x01,0x01,0x06,0x18,0x01,0x05,0x01,0x26,0x07,0x02,0x02,0x05,0x27,0x06,0x02,0x0c,0x09,0x37,0x01, -0x08,0x0c,0x05,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x4f,0x00,0x04,0x03,0x04,0x85,0x00,0x06,0x03,0x01,0x05,0x06,0x72,0x00,0x02,0x05,0x07,0x01,0x02,0x72,0x00,0x09,0x00,0x0c,0x08,0x09,0x72,0x0e,0x01,0x0d,0x08,0x0a,0x0c,0x0d,0x72,0x00,0x0b,0x0a,0x0b,0x86,0x00,0x03,0x00,0x01,0x05,0x03,0x01,0x69,0x00,0x05,0x00,0x07,0x00,0x05, -0x07,0x6a,0x00,0x00,0x00,0x0c,0x08,0x00,0x0c,0x69,0x00,0x08,0x0d,0x0a,0x08,0x59,0x00,0x08,0x08,0x0a,0x62,0x00,0x0a,0x08,0x0a,0x52,0x1b,0x40,0x53,0x00,0x04,0x03,0x04,0x85,0x00,0x06,0x03,0x01,0x03,0x06,0x01,0x80,0x00,0x02,0x05,0x07,0x05,0x02,0x07,0x80,0x00,0x09,0x00,0x0c,0x00,0x09,0x0c,0x80,0x0e,0x01,0x0d,0x08,0x0a,0x08, -0x0d,0x0a,0x80,0x00,0x0b,0x0a,0x0b,0x86,0x00,0x03,0x00,0x01,0x05,0x03,0x01,0x69,0x00,0x05,0x00,0x07,0x00,0x05,0x07,0x6a,0x00,0x00,0x00,0x0c,0x08,0x00,0x0c,0x69,0x00,0x08,0x0d,0x0a,0x08,0x59,0x00,0x08,0x08,0x0a,0x62,0x00,0x0a,0x08,0x0a,0x52,0x59,0x40,0x1a,0x00,0x00,0x00,0x3f,0x00,0x3f,0x3d,0x3b,0x39,0x38,0x34,0x32,0x2f, -0x2e,0x26,0x23,0x12,0x23,0x13,0x23,0x12,0x24,0x23,0x0f,0x06,0x1f,0x2b,0x37,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x26,0x26,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x13,0x33,0x03,0x16,0x16,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x07,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06, -0x23,0x22,0x26,0x26,0x27,0x07,0x23,0x13,0x26,0x23,0x22,0x15,0x15,0x46,0x48,0x3a,0x1a,0x16,0x25,0x15,0x23,0x1b,0x2f,0x55,0x48,0x3a,0x2c,0x36,0x12,0x65,0x3f,0x78,0x08,0x13,0x0b,0x2f,0x55,0x47,0x3b,0x14,0x21,0x0d,0x23,0x13,0x1d,0x1e,0x15,0x2f,0x55,0x47,0x3b,0x24,0x30,0x21,0x0e,0x56,0x3f,0x67,0x0a,0x0b,0x2f,0x6e,0x46,0x3b, -0x47,0x08,0x6a,0x1a,0x2e,0x37,0x46,0x46,0x3b,0x47,0x25,0x17,0x01,0x1d,0xfe,0xad,0x07,0x09,0x37,0x46,0x46,0x3a,0x48,0x09,0x07,0x61,0x13,0x29,0x1d,0x37,0x46,0x46,0x3a,0x48,0x18,0x25,0x12,0xf4,0x01,0x22,0x05,0x37,0x46,0x00,0x00,0x03,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x1c,0x00,0x22,0x00,0x2a,0x00,0x92,0x40,0x0a, -0x10,0x01,0x03,0x04,0x20,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x31,0x00,0x05,0x04,0x05,0x85,0x00,0x07,0x06,0x06,0x07,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x09,0x01,0x02,0x0a,0x01,0x01,0x00,0x02,0x01,0x67,0x0b,0x01,0x00,0x06,0x06,0x00,0x57,0x0b,0x01,0x00,0x00,0x06,0x5f,0x0c,0x08,0x02,0x06,0x00, -0x06,0x4f,0x1b,0x40,0x30,0x00,0x05,0x04,0x05,0x85,0x00,0x07,0x06,0x07,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x09,0x01,0x02,0x0a,0x01,0x01,0x00,0x02,0x01,0x67,0x0b,0x01,0x00,0x06,0x06,0x00,0x57,0x0b,0x01,0x00,0x00,0x06,0x5f,0x0c,0x08,0x02,0x06,0x00,0x06,0x4f,0x59,0x40,0x17,0x00,0x00,0x27,0x25,0x24,0x23,0x22,0x21, -0x00,0x1c,0x00,0x1c,0x11,0x28,0x12,0x21,0x21,0x11,0x11,0x11,0x0d,0x06,0x1e,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x23,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x01,0x34,0x26,0x27,0x07,0x33,0x15,0x23,0x07,0x33,0x32,0x36,0x36,0x35,0x23,0x9f,0x3c,0xdb,0xf8, -0x3c,0x03,0xfe,0xcf,0x01,0x31,0x0f,0x0f,0x2f,0x3f,0x34,0x3e,0x50,0x3f,0x68,0x3f,0x6f,0x2e,0x3f,0x2e,0x01,0x3a,0x2c,0x23,0x37,0x86,0xa3,0x3c,0x53,0x28,0x3f,0x25,0x46,0x50,0xaa,0x50,0xaa,0x50,0x02,0x84,0x92,0x19,0x6b,0x46,0x90,0x3e,0x63,0x39,0x82,0x82,0x01,0x68,0x28,0x45,0x11,0x9c,0x50,0xaa,0x27,0x40,0x25,0x00,0x00,0x00, -0x00,0x03,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x1d,0x00,0x25,0x00,0x2b,0x00,0x90,0x40,0x0a,0x29,0x01,0x06,0x05,0x01,0x01,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x00,0x01,0x00,0x00,0x01,0x70,0x0c,0x01,0x08,0x07,0x08,0x86,0x02,0x01,0x00,0x0a,0x01,0x03,0x04,0x00,0x03,0x68,0x09,0x01,0x04,0x0b,0x01, -0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x06,0x07,0x4f,0x1b,0x40,0x2f,0x00,0x01,0x00,0x01,0x85,0x0c,0x01,0x08,0x07,0x08,0x86,0x02,0x01,0x00,0x0a,0x01,0x03,0x04,0x00,0x03,0x68,0x09,0x01,0x04,0x0b,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06, -0x07,0x5f,0x00,0x07,0x06,0x07,0x4f,0x59,0x40,0x17,0x00,0x00,0x2b,0x2a,0x22,0x20,0x1f,0x1e,0x00,0x1d,0x00,0x1d,0x21,0x31,0x11,0x11,0x11,0x11,0x11,0x28,0x0d,0x06,0x1e,0x2b,0x17,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x32,0x33,0x21,0x15,0x21,0x22,0x27,0x07, -0x03,0x33,0x37,0x23,0x22,0x06,0x06,0x15,0x15,0x14,0x16,0x17,0x37,0x23,0x78,0x34,0x3c,0x4d,0x3f,0x69,0x3e,0x6a,0x2e,0x3f,0x2e,0x88,0xa4,0x3c,0xe0,0xfd,0x3c,0x04,0x04,0x01,0x31,0xfe,0xcf,0x12,0x11,0x2f,0x3a,0x9e,0x3c,0x4e,0x27,0x40,0x25,0x29,0x22,0x36,0x81,0x3c,0x94,0x19,0x6a,0x45,0x90,0x3e,0x63,0x39,0x82,0x82,0x50,0xaa, -0x50,0xaa,0x50,0x03,0x85,0x01,0xcc,0xaa,0x27,0x40,0x25,0x8c,0x27,0x43,0x12,0x9a,0x00,0x01,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0x99,0x00,0x29,0x00,0x57,0x40,0x54,0x11,0x01,0x03,0x02,0x26,0x01,0x08,0x09,0x02,0x4c,0x00,0x04,0x02,0x04,0x85,0x05,0x01,0x02,0x03,0x02,0x85,0x0c,0x0b,0x02,0x08,0x09,0x0a,0x09,0x08,0x0a,0x80,0x00, -0x0a,0x0a,0x84,0x00,0x03,0x06,0x01,0x01,0x00,0x03,0x01,0x69,0x07,0x01,0x00,0x09,0x09,0x00,0x59,0x07,0x01,0x00,0x00,0x09,0x61,0x00,0x09,0x00,0x09,0x51,0x00,0x00,0x00,0x29,0x00,0x29,0x25,0x24,0x23,0x21,0x12,0x22,0x12,0x14,0x11,0x22,0x12,0x22,0x12,0x0d,0x06,0x1f,0x2b,0x37,0x34,0x36,0x33,0x33,0x37,0x23,0x22,0x26,0x35,0x33, -0x14,0x16,0x33,0x33,0x37,0x33,0x07,0x36,0x36,0x35,0x33,0x14,0x06,0x23,0x23,0x07,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x23,0x07,0x23,0x37,0x06,0x06,0x15,0x2d,0x6c,0x5c,0x04,0x21,0x25,0x5c,0x6c,0x5a,0x3b,0x33,0x42,0x4d,0x46,0x4c,0x27,0x2c,0x5a,0x6c,0x5c,0x03,0x21,0x24,0x5c,0x6c,0x5a,0x3b,0x33,0x42,0x4b,0x46,0x4b,0x28, -0x2c,0x73,0x4e,0x5c,0x5a,0x5c,0x4e,0x29,0x31,0xd2,0xd0,0x06,0x2e,0x24,0x4e,0x5c,0x5a,0x5c,0x4e,0x29,0x31,0xcd,0xcb,0x06,0x2e,0x24,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xba,0x02,0x03,0x02,0xda,0x00,0x0f,0x00,0x18,0x00,0x23,0x40,0x20,0x16,0x12,0x11,0x0f,0x0b,0x0a,0x09,0x06,0x05,0x04,0x03,0x01,0x00,0x0d,0x01,0x00,0x01,0x4c, -0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x15,0x17,0x02,0x06,0x18,0x2b,0x37,0x35,0x37,0x37,0x27,0x35,0x17,0x37,0x33,0x03,0x17,0x15,0x07,0x07,0x23,0x37,0x37,0x27,0x07,0x37,0x36,0x36,0x37,0x26,0x26,0x55,0x87,0x41,0xc8,0xe2,0x56,0x3f,0x5f,0x96,0xff,0x4d,0x3f,0x40,0xd3,0x38,0x2b,0x63,0x13,0x21,0x08,0x09,0x22,0x41,0x57, -0x42,0xbc,0x63,0x5a,0x71,0xf8,0xfe,0xed,0x4b,0x64,0x7f,0xdf,0xb8,0xee,0x1c,0x7d,0x31,0x09,0x0d,0x02,0x02,0x0e,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0x92,0x02,0x03,0x03,0x0c,0x00,0x17,0x00,0x20,0x00,0x6d,0x40,0x12,0x1e,0x1a,0x19,0x0f,0x0e,0x0d,0x0a,0x09,0x08,0x07,0x05,0x04,0x03,0x0d,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x0c,0x50, -0x58,0x40,0x1f,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x03,0x04,0x71,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x1b,0x40,0x1e,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03, -0x00,0x03,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x15,0x19,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x33,0x37,0x07,0x35,0x37,0x37,0x27,0x35,0x05,0x37,0x33,0x07,0x17,0x15,0x07,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x13,0x27,0x07,0x37,0x36,0x36,0x37,0x26,0x26,0x55,0x63,0x40,0xa3,0xc5,0x2d,0xf2,0x01,0x0c,0x40, -0x3f,0x49,0x6c,0xc0,0x4c,0x01,0x0c,0xfe,0xd9,0x25,0x3f,0x25,0xee,0x0e,0x18,0x26,0x13,0x21,0x08,0x09,0x22,0x52,0xbe,0x51,0x57,0x60,0x89,0x78,0x5a,0x86,0xc1,0xdc,0x36,0x64,0x60,0xe4,0x52,0x6e,0x6e,0x01,0xde,0x07,0x4a,0x13,0x09,0x0d,0x02,0x02,0x0e,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xc4,0x02,0x03,0x02,0xd9,0x00,0x1b, -0x00,0xca,0x4b,0xb0,0x09,0x50,0x58,0x40,0x34,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x0c,0x0b,0x0b,0x0c,0x71,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x1b,0x4b,0xb0, -0x0a,0x50,0x58,0x40,0x33,0x00,0x05,0x04,0x05,0x85,0x00,0x0c,0x0b,0x0b,0x0c,0x71,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x1b,0x40,0x32,0x00,0x05,0x04,0x05,0x85, -0x00,0x0c,0x0b,0x0c,0x86,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x59,0x59,0x40,0x1a,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x21,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x21,0x07,0x23,0x37,0x55,0x7c,0x2e,0xaa,0xc2,0x2e,0xf0,0x01,0x09,0x2f,0x3f,0x2f,0x66,0x7f,0x2e,0xad,0xc5,0x2e,0xf3,0xfe,0xf4,0x2c,0x3f,0x2c, -0x4c,0x4c,0x8c,0x4c,0x8c,0x4c,0x91,0x91,0x4c,0x8c,0x4c,0x8c,0x4c,0x88,0x88,0x00,0x00,0x02,0x00,0x55,0xff,0xba,0x02,0x03,0x02,0xda,0x00,0x0f,0x00,0x18,0x00,0x29,0x40,0x26,0x16,0x12,0x11,0x0e,0x0d,0x0c,0x0b,0x09,0x08,0x07,0x03,0x02,0x01,0x0d,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, -0x00,0x0f,0x00,0x0f,0x15,0x03,0x06,0x17,0x2b,0x17,0x13,0x27,0x35,0x37,0x37,0x33,0x07,0x37,0x15,0x07,0x07,0x17,0x15,0x27,0x03,0x13,0x17,0x37,0x07,0x06,0x06,0x07,0x16,0x16,0x78,0x62,0x85,0xe7,0x51,0x3f,0x44,0x7b,0x9f,0x3a,0xd9,0xf3,0x59,0x16,0x27,0x24,0x4b,0x13,0x21,0x08,0x09,0x22,0x46,0x01,0x1b,0x43,0x64,0x73,0xeb,0xc5, -0x3e,0x57,0x4e,0xa8,0x6b,0x5a,0x7a,0xfe,0xff,0x01,0x7a,0x13,0x68,0x25,0x09,0x0d,0x02,0x02,0x0d,0x00,0x00,0x02,0x00,0x55,0xff,0x92,0x02,0x03,0x03,0x0c,0x00,0x17,0x00,0x20,0x00,0x6d,0x40,0x12,0x1e,0x1a,0x19,0x10,0x0f,0x0e,0x0d,0x0b,0x0a,0x09,0x05,0x04,0x03,0x0d,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1f,0x00, -0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x03,0x04,0x71,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x1b,0x40,0x1e,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x59, -0x40,0x0e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x19,0x15,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x33,0x37,0x27,0x35,0x25,0x37,0x33,0x07,0x37,0x15,0x07,0x07,0x17,0x15,0x27,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x13,0x17,0x37,0x07,0x06,0x06,0x07,0x16,0x16,0x55,0x63,0x4e,0xb1,0x01,0x20,0x2c,0x3f,0x1f,0x42,0x64,0x49,0xad,0xc7, -0x45,0x01,0x0c,0xfe,0xd9,0x25,0x3f,0x25,0x30,0x53,0x33,0x86,0x13,0x21,0x08,0x09,0x22,0x52,0xea,0x59,0x64,0x90,0x83,0x5d,0x21,0x57,0x31,0xda,0x56,0x5a,0x63,0xcf,0x52,0x6e,0x6e,0x01,0xb1,0x29,0x9b,0x42,0x09,0x0d,0x02,0x02,0x0d,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x17,0x00,0x1b,0x00,0xca, -0x4b,0xb0,0x09,0x50,0x58,0x40,0x34,0x00,0x03,0x02,0x02,0x03,0x70,0x00,0x0a,0x09,0x09,0x0a,0x71,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x1b,0x4b,0xb0,0x0c,0x50, -0x58,0x40,0x33,0x00,0x03,0x02,0x03,0x85,0x00,0x0a,0x09,0x09,0x0a,0x71,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x1b,0x40,0x32,0x00,0x03,0x02,0x03,0x85,0x00,0x0a, -0x09,0x0a,0x86,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x59,0x59,0x40,0x1a,0x00,0x00,0x1b,0x1a,0x19,0x18,0x00,0x17,0x00,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x33,0x35,0x33,0x37,0x23,0x11,0x21,0x37,0x33,0x07,0x33,0x15,0x23,0x03,0x33,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x03,0x33,0x13,0x23,0x23,0x88,0x2c,0xb4,0x01,0x64,0x37,0x46,0x37,0x6d,0x8b,0x74,0xff,0xfe,0xe3,0x2c,0x01,0x49,0xfe,0x99,0x28,0x46,0x28,0x10,0x78,0x74, -0xec,0x52,0x76,0x01,0xe0,0x96,0x96,0x52,0xfe,0xc4,0x52,0x76,0x52,0x6e,0x6e,0x01,0x1a,0x01,0x3c,0x00,0x00,0x02,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x17,0x00,0x1f,0x00,0x43,0x40,0x40,0x1a,0x01,0x04,0x03,0x01,0x01,0x05,0x04,0x02,0x4c,0x00,0x01,0x00,0x01,0x85,0x08,0x01,0x06,0x05,0x06,0x86,0x02,0x01,0x00,0x07,0x01, -0x03,0x04,0x00,0x03,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x00,0x00,0x1d,0x1b,0x00,0x17,0x00,0x17,0x21,0x11,0x11,0x11,0x11,0x28,0x09,0x06,0x1c,0x2b,0x17,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x03,0x21,0x15,0x21,0x22,0x27,0x07,0x03, -0x14,0x17,0x13,0x23,0x22,0x06,0x15,0x78,0x43,0x46,0x52,0x3a,0x67,0x45,0x58,0x40,0x3f,0x40,0x9a,0xb7,0x6f,0x01,0x26,0xfe,0xcf,0x09,0x09,0x40,0x3a,0x5a,0x6d,0x3b,0x43,0x49,0x3c,0xbe,0x14,0x6e,0x4e,0x2c,0x42,0x62,0x36,0xb4,0xb4,0x52,0xfe,0xc4,0x52,0x01,0xb5,0x01,0x90,0x6b,0x19,0x01,0x36,0x48,0x42,0x00,0x00,0x02,0x00,0x1e, -0xff,0xc4,0x02,0x35,0x03,0x0c,0x00,0x17,0x00,0x1f,0x00,0x44,0x40,0x41,0x0b,0x01,0x01,0x02,0x1a,0x01,0x00,0x01,0x02,0x4c,0x00,0x03,0x02,0x03,0x85,0x00,0x05,0x04,0x05,0x86,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x07,0x01,0x00,0x04,0x04,0x00,0x59,0x07,0x01,0x00,0x00,0x04,0x5f,0x08,0x06,0x02,0x04,0x00,0x04,0x4f,0x00,0x00, -0x1d,0x1b,0x00,0x17,0x00,0x17,0x11,0x28,0x12,0x21,0x11,0x11,0x09,0x06,0x1c,0x2b,0x37,0x35,0x33,0x13,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x01,0x34,0x27,0x03,0x33,0x32,0x36,0x35,0x1e,0xb7,0x6f,0xfe,0xda,0x01,0x31,0x09,0x09,0x40,0x3f,0x43,0x46,0x52,0x3a,0x67, -0x45,0x58,0x40,0x3f,0x40,0x01,0x23,0x5a,0x6d,0x3b,0x43,0x49,0x78,0x52,0x01,0x3c,0x52,0x01,0xb5,0xbe,0x14,0x6e,0x4e,0x2c,0x41,0x63,0x36,0xb4,0xb4,0x01,0x04,0x6b,0x19,0xfe,0xca,0x48,0x42,0x00,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x5f,0x02,0x17,0x02,0x35,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x21,0x50,0x58,0x40,0x16,0x03,0x01,0x01, -0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x3b,0x05,0x4e,0x1b,0x40,0x1b,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07, -0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x00,0xbf,0xbf,0x58,0xbf,0xbf,0x5f,0xc3,0x50,0xc3,0xc3,0x50,0xc3,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x88,0x01,0xee,0x02,0x0e,0x00,0x0b,0x00,0x06,0xb3,0x06, -0x00,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x9c,0x33,0x8d,0x8d,0x33,0x8e,0x91,0x33,0x91,0x8e,0x34,0x8d,0x88,0x34,0x8d,0x8e,0x33,0x8d,0x91,0x34,0x91,0x8d,0x34,0x8e,0x00,0x03,0x00,0x64,0x00,0x37,0x01,0xf4,0x02,0x62,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01, -0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x07,0x01,0x03,0x05,0x02,0x03,0x67,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x11,0x10,0x0c,0x0c,0x01,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34, -0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xee,0x01,0x90,0xc8,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x01,0xcc,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xa5,0x4b,0x4b,0xf0,0x29,0x22,0x22,0x29,0x29,0x22,0x22, -0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0xaa,0x02,0x03,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06, -0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0x01,0x9a,0x50,0x50,0xf0,0x50,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xc4,0x02,0x03,0x03,0x0c,0x00,0x13,0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02, -0x67,0x07,0x01,0x01,0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x17,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x78,0x51,0x74,0x91,0x38, -0xc9,0xe5,0x67,0x3f,0x67,0x8a,0xa6,0x38,0xde,0xfb,0x51,0x3c,0xe6,0x50,0xa0,0x50,0x01,0x22,0xfe,0xde,0x50,0xa0,0x50,0xe6,0x00,0x01,0x00,0x55,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x0c,0x00,0x06,0xb3,0x0a,0x00,0x01,0x32,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09, -0x22,0x11,0xfe,0xca,0x01,0xae,0x41,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x00,0x01,0x00,0x55,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x0c,0x00,0x06,0xb3,0x03,0x00,0x01,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08, -0x09,0x22,0x11,0x01,0x36,0x41,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25,0x0c,0x0b,0x0a,0x09,0x05,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01, -0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x21,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfe,0x52,0x01,0xae,0xbe,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0xfe,0x6b,0x50,0x50,0x00, -0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25,0x0c,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06, -0x07,0x16,0x16,0x17,0x05,0x01,0x35,0x21,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0xfe,0x52,0x01,0xae,0xbe,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0xfe,0xe8,0x50,0x50,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x17,0x02,0x3a,0x00,0x0f,0x00,0x56,0x4b,0xb0, -0x18,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x03,0x03,0x3b,0x4d,0x06,0x01,0x00,0x00,0x07,0x60,0x08,0x01,0x07,0x07,0x39,0x07,0x4e,0x1b,0x40,0x1c,0x00,0x03,0x02,0x03,0x85,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x06,0x01,0x00,0x00,0x07,0x60,0x08,0x01,0x07,0x07,0x39,0x07,0x4e, -0x59,0x40,0x10,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x46,0xba,0xbf,0xbf,0x58,0xbf,0xbf,0xba,0x46,0xe1,0x50,0xc3,0xc3,0x50,0xe1,0x46,0xff,0xff,0x00,0x46,0x00,0x69,0x02,0x12,0x02,0x2b,0x02,0x26, -0x04,0x22,0x00,0x64,0x01,0x07,0x04,0x22,0x00,0x00,0xff,0x6f,0x00,0x11,0xb1,0x00,0x01,0xb0,0x64,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0xff,0x6f,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x64,0x00,0xb9,0x01,0xf4,0x01,0x8b,0x00,0x05,0x00,0x46,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00, -0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x09,0x18,0x2b,0x25,0x35,0x21,0x35,0x21,0x15,0x01,0x9f,0xfe,0xc5,0x01,0x90, -0xb9,0x82,0x50,0xd2,0x00,0x01,0x00,0x46,0x00,0xfa,0x02,0x12,0x01,0xc7,0x00,0x1b,0x00,0x68,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x02,0x01,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x06,0x05,0x02,0x03,0x01,0x03,0x52,0x1b,0x40,0x29,0x00,0x02,0x00,0x04,0x00, -0x02,0x04,0x80,0x06,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x59,0x40,0x0e,0x00,0x00,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x07,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x37,0x35,0x34,0x36,0x33,0x32, -0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0xff,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x50, -0x01,0x54,0x02,0x08,0x02,0xda,0x00,0x0c,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x08,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x50,0xb3, -0x54,0xb1,0x51,0x70,0x08,0x0d,0x03,0x04,0x0e,0x09,0x73,0x01,0x54,0x01,0x86,0xfe,0x7a,0x01,0x02,0x14,0x25,0x0a,0x0a,0x25,0x14,0xfe,0xfe,0x00,0x00,0x03,0x00,0x23,0x00,0xa0,0x02,0x35,0x01,0xf9,0x00,0x1b,0x00,0x2a,0x00,0x39,0x00,0x4b,0x40,0x48,0x17,0x09,0x02,0x04,0x05,0x01,0x4c,0x02,0x01,0x01,0x07,0x01,0x05,0x04,0x01,0x05, -0x69,0x0a,0x06,0x09,0x03,0x04,0x00,0x00,0x04,0x59,0x0a,0x06,0x09,0x03,0x04,0x04,0x00,0x61,0x03,0x08,0x02,0x00,0x04,0x00,0x51,0x2c,0x2b,0x1d,0x1c,0x01,0x00,0x33,0x31,0x2b,0x39,0x2c,0x39,0x25,0x23,0x1c,0x2a,0x1d,0x2a,0x16,0x14,0x0f,0x0d,0x08,0x06,0x00,0x1b,0x01,0x1b,0x0b,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x35,0x34,0x36, -0x33,0x32,0x17,0x33,0x3e,0x02,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x0e,0x02,0x27,0x32,0x3e,0x02,0x37,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x17,0x16,0xa6,0x3b,0x48,0x4c,0x3d,0x66,0x24,0x03,0x05,0x1d,0x33,0x24,0x3b,0x48,0x4b,0x3e,0x66, -0x24,0x03,0x04,0x1e,0x32,0x1c,0x1d,0x24,0x15,0x0a,0x01,0x1f,0x16,0x2c,0x1f,0x27,0x27,0x01,0x19,0x20,0x26,0x26,0x20,0x1c,0x25,0x15,0x0a,0x01,0x1f,0x16,0xa0,0x4a,0x3d,0x4b,0x3d,0x4a,0x63,0x16,0x2d,0x20,0x4a,0x3d,0x4b,0x3d,0x4a,0x63,0x15,0x2e,0x20,0x3c,0x17,0x20,0x1c,0x06,0x54,0x34,0x29,0x22,0x4b,0x22,0x29,0x29,0x22,0x4b, -0x22,0x29,0x17,0x20,0x1c,0x06,0x54,0x34,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x18,0x00,0x22,0x00,0x2c,0x00,0x4f,0x40,0x4c,0x0d,0x0a,0x02,0x04,0x00,0x2b,0x2a,0x1d,0x1c,0x04,0x05,0x04,0x17,0x01,0x02,0x02,0x05,0x03,0x4c,0x00,0x01,0x00,0x01,0x85,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x00,0x00,0x04,0x05,0x00, -0x04,0x69,0x07,0x01,0x05,0x02,0x02,0x05,0x59,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x05,0x02,0x51,0x24,0x23,0x00,0x00,0x23,0x2c,0x24,0x2c,0x20,0x1e,0x00,0x18,0x00,0x18,0x27,0x12,0x27,0x08,0x06,0x19,0x2b,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26, -0x27,0x07,0x03,0x14,0x16,0x17,0x13,0x26,0x23,0x22,0x06,0x06,0x13,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x16,0x14,0x50,0x33,0x3b,0x51,0x8d,0x58,0x4f,0x43,0x3f,0x47,0x54,0x35,0x3d,0x51,0x8c,0x59,0x2a,0x4c,0x21,0x3a,0x0b,0x24,0x20,0xfc,0x2e,0x36,0x3f,0x63,0x3a,0xdc,0x3f,0x63,0x3a,0x27,0x21,0xfd,0x30,0x77,0x2a,0x7d,0x4a, -0x59,0x8c,0x51,0x22,0x5e,0x7e,0x2a,0x7e,0x4c,0x58,0x8d,0x51,0x13,0x12,0x57,0x01,0x68,0x33,0x57,0x1f,0x01,0x78,0x17,0x3c,0x68,0xfe,0xd8,0x3c,0x69,0x41,0x35,0x59,0x1f,0xfe,0x87,0x1a,0x00,0x01,0x00,0x3c,0x00,0x32,0x02,0x1c,0x02,0x26,0x00,0x0c,0x00,0x1f,0x40,0x1c,0x08,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03, -0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x06,0x18,0x2b,0x37,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x3c,0xb3,0x7a,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x32,0x01,0xf4,0xfe,0x0c,0x01,0x40,0x20,0x3f,0x10,0x10,0x3f,0x20,0xfe,0xc0,0x00,0x00,0x00,0x01,0x00,0x3c, -0x00,0x32,0x02,0x1c,0x02,0x26,0x00,0x0c,0x00,0x1f,0x40,0x1c,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x06,0x18,0x2b,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xef,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b, -0x72,0x5b,0xb3,0x32,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x13,0x00, -0x13,0x33,0x13,0x33,0x05,0x06,0x19,0x2b,0x33,0x11,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x11,0x2b,0x75,0x6f,0x3a,0x6f,0x75,0x5a,0x48,0x44,0x36,0x44,0x48,0x01,0xfe,0x6b,0x71,0x71,0x6b,0xfe,0x02,0x01,0xfe,0x44,0x48,0x48,0x44,0xfe,0x02,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d, -0x02,0xda,0x00,0x13,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x33,0x13,0x33,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x2b,0x5a,0x48,0x44,0x36,0x44, -0x48,0x5a,0x75,0x6f,0x3a,0x6f,0x75,0x02,0xda,0xfe,0x02,0x44,0x48,0x48,0x44,0x01,0xfe,0xfe,0x02,0x6b,0x71,0x71,0x6b,0x00,0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x12,0x00,0x28,0x40,0x25,0x00,0x01,0x00,0x02,0x00,0x01,0x02,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03, -0x4f,0x00,0x00,0x00,0x12,0x00,0x11,0x21,0x25,0x21,0x05,0x06,0x19,0x2b,0x15,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x69,0x35,0x3e,0x51,0x49,0xa1,0xa1,0x40,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x02,0x40,0x42,0x49,0x50,0x3c,0xfd,0xc1,0x58,0x6b,0x00,0x00,0x00,0xff,0xff,0x00,0x32, -0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x02,0x54,0x00,0x00,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x02,0xda,0x00,0x0b,0x00,0x2a,0x40,0x27,0x06,0x05,0x02,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11, -0x07,0x06,0x1b,0x2b,0x17,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x6e,0x46,0x02,0x08,0x46,0x5a,0xc8,0xb4,0x03,0x3c,0x52,0x52,0xfc,0xc4,0x03,0x3c,0xfc,0xc4,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0x4c,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x37,0x40,0x34,0x08,0x02,0x02,0x02,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x01, -0x02,0x02,0x4b,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x05,0x06,0x19,0x2b,0x17,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x15,0x37,0x01,0x13,0xfe,0xed,0x01,0xe5,0xfe,0x89,0x01,0x12, -0xfe,0xec,0x01,0x79,0xb4,0x52,0x01,0x75,0x01,0x75,0x52,0x52,0xfe,0x8b,0xfe,0x8b,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0f,0x00,0x2e,0x40,0x2b,0x00,0x03,0x01,0x03,0x85,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x00,0x02,0x04,0x04,0x02,0x57,0x00,0x02,0x02,0x04,0x5f,0x05,0x01,0x04,0x02, -0x04,0x4f,0x00,0x00,0x00,0x0f,0x00,0x0f,0x14,0x14,0x11,0x11,0x06,0x06,0x1a,0x2b,0x21,0x03,0x23,0x35,0x33,0x13,0x16,0x16,0x07,0x33,0x26,0x36,0x37,0x13,0x33,0x03,0x01,0x0c,0x7f,0x6f,0xaf,0x63,0x08,0x06,0x01,0x09,0x01,0x07,0x09,0xa0,0x54,0xd4,0x01,0xd6,0x50,0xfe,0x7b,0x22,0x33,0x0b,0x0b,0x34,0x21,0x02,0x39,0xfd,0x26,0x00, -0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x1b,0x00,0x29,0x00,0x3f,0x40,0x3c,0x0c,0x0a,0x02,0x03,0x04,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x03,0x00,0x51,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c, -0x29,0x1d,0x29,0x12,0x11,0x08,0x06,0x00,0x1b,0x01,0x1b,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x2e,0x02,0x27,0x33,0x30,0x1e,0x03,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x62,0x70,0x61,0x57,0x3e,0x4b,0x07,0x02, -0x31,0x4e,0x5a,0x2a,0x87,0x2b,0x40,0x40,0x2b,0x70,0x62,0x3a,0x3e,0x3d,0x3b,0x3a,0x3e,0x3e,0x0a,0x73,0x64,0x50,0x62,0x70,0x37,0x32,0x19,0x36,0x62,0x52,0x3e,0x13,0x1b,0x36,0x4e,0x67,0x3f,0xc8,0x64,0x73,0x50,0x46,0x41,0x50,0x42,0x45,0x46,0x41,0x50,0x41,0x46,0x00,0xff,0xff,0x00,0x5d,0xff,0x4c,0x01,0xfb,0x02,0x26,0x02,0x06, -0x02,0x80,0x00,0x00,0x00,0x02,0x00,0x9b,0x00,0x00,0x01,0xbd,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x63, -0x5a,0xfe,0xde,0x5a,0x02,0xda,0xfd,0x26,0x02,0xda,0xfd,0x26,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00, -0x00,0x01,0x00,0xff,0xff,0x88,0x02,0x2b,0x03,0xfc,0x00,0x0a,0x00,0x10,0x40,0x0d,0x0a,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x05,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x02,0x2b,0x5d,0x86,0x49,0x5a,0x71,0x61,0x78,0x17,0x6e,0xa0,0x61,0x02,0xee,0xfd,0x12,0x75,0xa2,0x17,0x00,0x01,0x00,0xff, -0xfe,0xd4,0x02,0x2b,0x03,0x48,0x00,0x0a,0x00,0x16,0x40,0x13,0x06,0x05,0x02,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x0a,0x00,0x0a,0x02,0x06,0x16,0x2b,0x13,0x11,0x34,0x36,0x36,0x37,0x15,0x06,0x06,0x15,0x11,0xff,0x49,0x86,0x5d,0x61,0x71,0xfe,0xd4,0x02,0xee,0x62,0x9f,0x6e,0x17,0x58,0x17,0xa2,0x75,0xfd,0x12,0x00, -0xff,0xff,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x02,0x06,0x04,0x32,0x00,0x00,0x00,0x01,0x00,0x2d,0xff,0x88,0x01,0x59,0x03,0xfc,0x00,0x0a,0x00,0x10,0x40,0x0d,0x01,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x17,0x35,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x2d,0x62,0x70,0x5a,0x48,0x87,0x78, -0x58,0x17,0xa2,0x75,0x02,0xee,0xfd,0x12,0x61,0xa0,0x6e,0x00,0x00,0x01,0x00,0x2d,0xfe,0xd4,0x01,0x59,0x03,0x48,0x00,0x0a,0x00,0x10,0x40,0x0d,0x06,0x05,0x02,0x00,0x4a,0x00,0x00,0x00,0x76,0x10,0x01,0x06,0x17,0x2b,0x01,0x23,0x11,0x34,0x26,0x27,0x35,0x1e,0x02,0x15,0x01,0x59,0x5a,0x70,0x62,0x5d,0x87,0x48,0xfe,0xd4,0x02,0xee, -0x75,0xa2,0x17,0x58,0x17,0x6e,0x9f,0x62,0x00,0x05,0x00,0x0e,0xff,0xfb,0x02,0x4a,0x02,0xdf,0x00,0x0d,0x00,0x11,0x00,0x1f,0x00,0x2d,0x00,0x3b,0x00,0x99,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2c,0x0c,0x01,0x04,0x0a,0x01,0x00,0x07,0x04,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01, -0x38,0x4d,0x0e,0x01,0x08,0x08,0x03,0x61,0x0d,0x06,0x0b,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x34,0x0c,0x01,0x04,0x0a,0x01,0x00,0x07,0x04,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x38,0x4d,0x0b,0x01,0x03,0x03,0x39,0x4d,0x0e,0x01,0x08,0x08,0x06, -0x61,0x0d,0x01,0x06,0x06,0x42,0x06,0x4e,0x59,0x40,0x2b,0x2f,0x2e,0x21,0x20,0x13,0x12,0x0e,0x0e,0x01,0x00,0x36,0x34,0x2e,0x3b,0x2f,0x3b,0x28,0x26,0x20,0x2d,0x21,0x2d,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x0f,0x09,0x16,0x2b,0x13,0x22,0x26,0x37,0x35,0x26,0x36,0x33,0x32, -0x16,0x17,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x13,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x22,0x26,0x35,0x35,0x26,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x99,0x40,0x4b,0x01,0x01,0x4b,0x40,0x40,0x4b,0x01,0x4b,0xcc,0x01, -0xf2,0x4a,0xfe,0x0e,0x42,0x1e,0x23,0x23,0x1e,0x1e,0x23,0x23,0x01,0x42,0x40,0x4b,0x01,0x4c,0x40,0x40,0x4b,0x4b,0x40,0x1e,0x23,0x23,0x1f,0x1d,0x23,0x01,0x23,0x01,0x90,0x49,0x3e,0x41,0x3e,0x49,0x49,0x3e,0x41,0x3e,0x49,0xfe,0x70,0x02,0xda,0xfd,0x26,0x01,0xd4,0x24,0x1f,0x41,0x1f,0x24,0x24,0x1f,0x41,0x1f,0x24,0xfe,0x27,0x49, -0x3e,0x41,0x3e,0x49,0x49,0x3e,0x41,0x3e,0x49,0x45,0x23,0x1f,0x41,0x1f,0x24,0x24,0x1f,0x41,0x1f,0x23,0x00,0x06,0xff,0xfb,0xff,0xfb,0x02,0x72,0x02,0xdf,0x00,0x0d,0x00,0x11,0x00,0x1f,0x00,0x39,0x00,0x47,0x00,0x55,0x00,0xb7,0xb6,0x37,0x2a,0x02,0x0a,0x0b,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x31,0x10,0x01,0x04,0x0e,0x01, -0x00,0x07,0x04,0x00,0x69,0x08,0x01,0x07,0x0d,0x01,0x0b,0x0a,0x07,0x0b,0x6a,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x38,0x4d,0x13,0x0c,0x12,0x03,0x0a,0x0a,0x03,0x61,0x09,0x11,0x06,0x0f,0x04,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x39,0x10,0x01,0x04,0x0e,0x01,0x00,0x07,0x04,0x00,0x69,0x08,0x01,0x07,0x0d,0x01,0x0b,0x0a, -0x07,0x0b,0x6a,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x38,0x4d,0x0f,0x01,0x03,0x03,0x39,0x4d,0x13,0x0c,0x12,0x03,0x0a,0x0a,0x06,0x61,0x09,0x11,0x02,0x06,0x06,0x42,0x06,0x4e,0x59,0x40,0x37,0x49,0x48,0x3b,0x3a,0x21,0x20,0x13,0x12,0x0e,0x0e,0x01,0x00,0x50,0x4e,0x48,0x55,0x49,0x55,0x42,0x40,0x3a, -0x47,0x3b,0x47,0x35,0x33,0x2e,0x2c,0x28,0x26,0x20,0x39,0x21,0x39,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x14,0x09,0x16,0x2b,0x13,0x22,0x26,0x27,0x35,0x26,0x36,0x33,0x32,0x16,0x17,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x13,0x32,0x36,0x35,0x35,0x26,0x26,0x23,0x22,0x06,0x15, -0x15,0x14,0x16,0x13,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x27,0x32,0x36,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x33,0x32,0x36,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x7d,0x37,0x40,0x01,0x01,0x41,0x37, -0x37,0x41,0x01,0x40,0xba,0x01,0xb6,0x43,0xfe,0x4a,0x3f,0x1a,0x1f,0x01,0x1e,0x1a,0x1a,0x1f,0x1f,0xf6,0x32,0x3b,0x01,0x3b,0x31,0x26,0x2e,0x02,0x03,0x2f,0x25,0x32,0x3a,0x3a,0x32,0x26,0x2e,0x02,0x04,0x2f,0x1f,0x17,0x1b,0x01,0x1c,0x17,0x17,0x1c,0x01,0x1c,0xbb,0x17,0x1b,0x01,0x1c,0x17,0x17,0x1c,0x01,0x1c,0x01,0xb8,0x3e,0x35, -0x41,0x35,0x3e,0x3e,0x35,0x41,0x35,0x3e,0xfe,0x48,0x02,0xda,0xfd,0x26,0x01,0xf3,0x1f,0x19,0x41,0x1a,0x1e,0x1e,0x1a,0x41,0x19,0x1f,0xfe,0x08,0x40,0x37,0x38,0x38,0x40,0x26,0x20,0x20,0x26,0x40,0x38,0x38,0x37,0x40,0x26,0x20,0x20,0x26,0x35,0x23,0x1f,0x38,0x1f,0x24,0x24,0x1f,0x38,0x1f,0x23,0x23,0x1f,0x38,0x1f,0x24,0x24,0x1f, -0x38,0x1f,0x23,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x01,0xe0,0x01,0x65,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b, -0x2b,0x21,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x07,0x8f,0x8f,0x4a,0x8f,0x8f,0x93,0x40,0x92,0x92,0x40,0x93,0x00,0x00,0x00,0x01,0x00,0xa0,0x01,0x31,0x01,0xb8,0x02,0x49,0x00,0x0b,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05, -0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x0b,0x1b,0x2b,0x01,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x04,0x64,0x64,0x50,0x64,0x64,0x01,0x31,0x69,0x46,0x69,0x69,0x46,0x69,0x00,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x37,0x02,0x08,0x02,0x58,0x00,0x12, -0x00,0x33,0x40,0x30,0x00,0x02,0x01,0x02,0x85,0x00,0x03,0x01,0x00,0x01,0x03,0x00,0x80,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x03,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x00,0x00,0x00,0x12,0x00,0x12,0x13,0x13,0x11,0x13,0x06,0x06,0x1a,0x2b,0x25,0x2e,0x02,0x23,0x35,0x32,0x36,0x36,0x37,0x33,0x0e, -0x02,0x07,0x1e,0x02,0x17,0x01,0xae,0x08,0x63,0xa3,0x69,0x69,0xa3,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x37,0x45,0x65,0x37,0x64,0x36,0x63,0x43,0x4c,0x73,0x45,0x05,0x07,0x48,0x7a,0x4f,0x00,0x02,0x00,0x37,0x00,0x00,0x02,0x08,0x02,0xd5,0x00,0x12,0x00,0x16,0x00,0x47,0x40,0x44,0x00,0x02,0x01,0x02,0x85,0x00, -0x03,0x01,0x00,0x01,0x03,0x00,0x80,0x07,0x01,0x04,0x00,0x05,0x00,0x04,0x05,0x80,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x13,0x13,0x00,0x00,0x13,0x16,0x13,0x16,0x15,0x14,0x00,0x12,0x00,0x12,0x13,0x13,0x11,0x13,0x09,0x06,0x1a,0x2b,0x25, -0x2e,0x02,0x23,0x35,0x32,0x36,0x36,0x37,0x33,0x0e,0x02,0x07,0x1e,0x02,0x17,0x05,0x35,0x21,0x15,0x01,0xae,0x08,0x63,0xa3,0x69,0x69,0xa3,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0xfe,0x2f,0x01,0xcc,0xb4,0x45,0x65,0x37,0x64,0x36,0x63,0x43,0x4c,0x73,0x45,0x05,0x07,0x48,0x7a,0x4f,0xb4,0x50,0x50,0x00,0x00,0x00, -0x00,0x04,0x00,0x37,0xff,0xf6,0x02,0x20,0x01,0xfe,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x47,0x40,0x44,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x07,0x01,0x05,0x04,0x04,0x05,0x59,0x07,0x01,0x05,0x05,0x04,0x61,0x0b,0x06,0x0a,0x03,0x04,0x05,0x04,0x51,0x25,0x24,0x19,0x18,0x0d,0x0c,0x01,0x00,0x2b, -0x29,0x24,0x2f,0x25,0x2f,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21, -0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xce,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0xfe,0x97,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x01,0x21,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x01,0x5c,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d, -0xfe,0x9a,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x00,0x00,0x00,0x04,0x00,0x55,0x00,0x4c,0x02,0x03,0x03,0x17,0x00,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0xaa,0x4b,0xb0,0x24,0x50,0x58,0x40,0x3b,0x0b,0x01,0x04,0x03,0x06,0x03,0x04,0x72,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00, -0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x06,0x0c,0x01,0x05,0x07,0x06,0x05,0x69,0x00,0x07,0x0d,0x01,0x08,0x09,0x07,0x08,0x67,0x00,0x09,0x0a,0x0a,0x09,0x57,0x00,0x09,0x09,0x0a,0x5f,0x0e,0x01,0x0a,0x09,0x0a,0x4f,0x1b,0x40,0x3c,0x0b,0x01,0x04,0x03,0x06,0x03,0x04,0x06,0x80,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00, -0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x06,0x0c,0x01,0x05,0x07,0x06,0x05,0x69,0x00,0x07,0x0d,0x01,0x08,0x09,0x07,0x08,0x67,0x00,0x09,0x0a,0x0a,0x09,0x57,0x00,0x09,0x09,0x0a,0x5f,0x0e,0x01,0x0a,0x09,0x0a,0x4f,0x59,0x40,0x25,0x24,0x24,0x20,0x20,0x15,0x14,0x00,0x00,0x24,0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x22,0x21, -0x1b,0x19,0x14,0x1f,0x15,0x1f,0x00,0x13,0x00,0x13,0x24,0x21,0x24,0x21,0x0f,0x06,0x1a,0x2b,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xff,0x49,0x18,0x1d,0x1d,0x18, -0x86,0x87,0x33,0x3d,0x3d,0x33,0x13,0x1c,0x12,0x15,0x15,0x12,0x12,0x15,0x15,0xd7,0x01,0xae,0xfe,0x52,0x01,0xae,0x02,0x21,0x55,0x1d,0x18,0x18,0x1d,0x37,0x3a,0x32,0x2f,0x38,0x23,0x73,0x14,0x10,0x11,0x13,0x13,0x11,0x10,0x14,0x8a,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0xff,0xff,0x00,0xd9,0xff,0xf6,0x01,0x7f,0x02,0x30,0x02,0x06, -0x03,0x2b,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x3a,0x02,0xa8,0x00,0x15,0x00,0x19,0x00,0x3c,0x40,0x39,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x06,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x16,0x16,0x01,0x00,0x16,0x19,0x16,0x19, -0x18,0x17,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x08,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x05,0x35,0x21,0x15,0x01,0x09,0x45,0x67,0x3a,0x3a,0x67,0x45,0x01,0x31,0xfe,0xcf,0x43,0x49,0x49,0x43,0x01,0x31,0xfd,0xf8,0x02,0x08, -0xc8,0x36,0x63,0x41,0x2c,0x42,0x62,0x36,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0xc8,0x52,0x52,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x35,0x02,0xa8,0x00,0x15,0x00,0x19,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04, -0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x16,0x16,0x00,0x00,0x16,0x19,0x16,0x19,0x18,0x17,0x00,0x15,0x00,0x14,0x21,0x25,0x21,0x08,0x06,0x19,0x2b,0x37,0x35,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x05,0x35,0x21,0x15,0x1e,0x01,0x31,0x43,0x49,0x49,0x43,0xfe,0xcf, -0x01,0x31,0x45,0x67,0x3a,0x3a,0x67,0x45,0xfe,0xcf,0x02,0x08,0xc8,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x36,0x62,0x42,0x2c,0x41,0x63,0x36,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x4b,0x02,0xa8,0x01,0xdb,0x00,0x31,0x00,0x4c,0x40,0x49,0x14,0x09,0x02,0x01,0x00,0x2c,0x21,0x1a,0x13,0x08,0x01,0x06,0x06,0x01,0x2b,0x20, -0x02,0x05,0x06,0x03,0x4c,0x04,0x02,0x02,0x00,0x01,0x00,0x85,0x0a,0x09,0x07,0x03,0x05,0x06,0x05,0x86,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06,0x01,0x06,0x52,0x00,0x00,0x00,0x31,0x00,0x31,0x27,0x11,0x27,0x12,0x17,0x21,0x17,0x21,0x12,0x0b,0x06,0x1f,0x2b,0x27,0x37,0x27,0x33,0x17,0x33, -0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x33,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x07,0x50,0x9f,0x9f,0x6a,0x7d,0x88,0x11,0x28,0x0d,0x07,0x19,0x0d,0x57,0x6a,0x7d,0x18,0x11,0x28,0x0d,0x07, -0x19,0x0d,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0x18,0x7d,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0x88,0x7d,0x4b,0xc8,0xc8,0xa0,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xa0,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xc8,0xc8,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0xa0,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0xa0,0x00, -0x00,0x01,0x00,0x73,0xff,0x92,0x01,0x59,0x03,0xfc,0x00,0x0a,0x00,0x26,0x40,0x23,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x03,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x06,0x04,0x02,0x00,0x0a,0x01,0x0a,0x04,0x06,0x16,0x2b,0x17,0x23,0x35,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x06,0xa0, -0x2d,0x2d,0x5f,0x5a,0x60,0x6e,0x50,0x56,0x03,0xc4,0xfc,0x3c,0x4f,0x57,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x02,0x2b,0x03,0xfc,0x00,0x16,0x00,0x2a,0x40,0x27,0x05,0x01,0x03,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x03,0x00,0x86,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f, -0x21,0x24,0x18,0x10,0x04,0x06,0x1a,0x2b,0x01,0x23,0x11,0x34,0x36,0x37,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x01,0x59,0x5a,0x34,0x31,0x32,0x33,0x5a,0x0e,0x2b,0x2b,0x6e,0x6e,0x2b,0x2b,0x0e,0xfe,0xd4,0x02,0x08,0x39,0x4a,0x09,0x09,0x4a,0x39,0x02,0x08,0xfd,0xf8,0x23,0x2d,0x14, -0x50,0x14,0x2c,0x24,0x00,0x01,0x00,0x73,0xfe,0xd4,0x01,0x59,0x03,0x3e,0x00,0x0a,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x59,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x02,0x01,0x51,0x21,0x22,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x11,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x01,0x59,0x5a,0x5f,0x2d, -0x2d,0x59,0x60,0xfe,0xd4,0x03,0xc4,0x56,0x50,0x57,0x4f,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x58,0x02,0x9b,0x00,0x08,0x00,0x0b,0x00,0x08,0xb5,0x0a,0x09,0x04,0x03,0x02,0x32,0x2b,0x11,0x37,0x05,0x01,0x11,0x01,0x05,0x27,0x25,0x05,0x11,0x07,0x23,0x01,0x09,0x01,0x2c,0xfe,0xd3,0xfe,0xf7,0x22,0x01,0x07,0x01,0x1f,0xd6,0x02, -0x58,0x25,0xf3,0x01,0x11,0xfd,0x97,0x01,0x13,0xf1,0x23,0xf0,0xc2,0x01,0x86,0xc3,0xff,0xff,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x02,0x06,0x03,0xf4,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0x92,0x01,0x59,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f, -0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x05,0x23,0x35,0x33,0x11,0x33,0x01,0x59,0xf5,0x9b,0x5a,0x6e,0x50,0x04,0x1a,0x00,0x00,0x01,0x00,0x64,0xfe,0xd4,0x01,0x59,0x03,0x3e,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01, -0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x11,0x23,0x35,0x33,0x01,0x59,0x5a,0x9b,0xf5,0xfe,0xd4,0x04,0x1a,0x50,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02, -0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x31,0x11,0x33,0x15,0x21,0x15,0x21,0x11,0x5a,0x01,0xfe,0xfe,0x02,0x02,0x58,0xff,0x50,0xfe,0xf7,0x00,0x00,0x04,0x00,0x55,0x00,0x4c,0x02,0x03,0x02,0xd1,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x52,0x40,0x4f,0x00,0x01,0x00,0x03,0x02,0x01, -0x03,0x69,0x09,0x01,0x02,0x08,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x1c,0x1c,0x18,0x18,0x0d,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17, -0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x01,0x2c,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0xbc,0x01,0xae,0xfe,0x52, -0x01,0xae,0x01,0xed,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0xfe,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x02,0x00,0xb4,0x00,0xd2,0x01,0xa4,0x01,0xc2,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02, -0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23, -0x2d,0x2d,0x23,0x23,0x2d,0x2d,0xd2,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0xff,0xff,0x00,0x46,0x00,0xfa,0x02,0x12,0x01,0xc7,0x02,0x06,0x04,0x22,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x17,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00, -0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x3c,0x01,0xe0,0x5a,0xfe,0xd4,0x02,0x17,0xfd,0xe9,0x01,0xc5,0xfe,0x3b,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x17,0x00,0x07, -0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x5f,0x00,0x03,0x01,0x03,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x3c,0x5a,0x01,0x2c,0x5a,0xfe,0x20,0x02,0x17,0xfe,0x3b,0x01,0xc5,0xfd,0xe9,0x00,0x00,0x00,0x00,0x03,0x00,0x00, -0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x07,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x09,0x08,0x00,0x00,0x0f,0x0d,0x08,0x13,0x09,0x13,0x07,0x06,0x05,0x04, -0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xfa,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x1e,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0xce,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00, -0x00,0x03,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3b,0x40,0x38,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x07,0x01,0x05,0x02,0x04,0x05,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09, -0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x35,0x21,0x15,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x5a,0x01,0x40,0x1e,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0xde,0x50,0x50,0x00,0x05,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x06,0x00,0x09, -0x00,0x0c,0x00,0x0f,0x00,0x33,0x40,0x30,0x0c,0x0b,0x09,0x08,0x04,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x0f,0x0e,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x01,0x37,0x21, -0x17,0x17,0x11,0x05,0x27,0x11,0x37,0x07,0x21,0x02,0x58,0xfe,0xd2,0xc2,0xfe,0x7a,0xf7,0xc9,0xfe,0xd0,0xc4,0xf8,0xcb,0x01,0x94,0x1e,0x02,0x58,0xfd,0xa8,0x01,0x64,0xc2,0xf6,0xc7,0x01,0x90,0xc9,0xc6,0xfe,0x76,0x91,0xcb,0x00,0x00,0x05,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13, -0x00,0x4e,0x40,0x4b,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x04,0x0b,0x02,0x03,0x09,0x01,0x06,0x07,0x03,0x06,0x67,0x08,0x0c,0x02,0x07,0x01,0x01,0x07,0x57,0x08,0x0c,0x02,0x07,0x07,0x01,0x5f,0x0a,0x01,0x01,0x07,0x01,0x4f,0x0c,0x0c,0x04,0x04,0x00,0x00,0x13,0x12,0x11,0x10,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x0b,0x0a,0x09, -0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0d,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x01,0x35,0x23,0x15,0x21,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x21,0x33,0x35,0x23,0x02,0x58,0xfe,0xa8,0xce,0x01,0x26,0xce,0xce,0xce,0xce,0xfe,0xda,0xce,0xce,0x1e,0x02,0x58,0xfd,0xa8,0x01,0x54,0xd2,0xd2,0xd2,0xfe,0x0c,0xd2, -0xd2,0xd2,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x5a,0x02,0x3a,0x02,0x3a,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x37,0x11,0x21,0x15,0x21,0x11, -0x21,0x15,0x23,0x02,0x17,0xfe,0x43,0x01,0xbd,0x5a,0x01,0xe0,0x52,0xfe,0xc4,0x52,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x3a,0x02,0xa8,0x00,0x07,0x00,0x0b,0x00,0x39,0x40,0x36,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x06,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01, -0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x37,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x05,0x35,0x21,0x15,0x23,0x02,0x17,0xfe,0x43,0x01,0xbd,0xfd,0xe9,0x02,0x17,0xc8,0x01,0xe0,0x52,0xfe,0xc4,0x52,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0x00,0x1e, -0x00,0x5a,0x02,0x35,0x02,0x3a,0x00,0x07,0x00,0x22,0x40,0x1f,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x25,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x02,0x35,0xfd,0xe9,0x01,0xbd,0xfe,0x43,0x02,0x17,0x5a,0x52, -0x01,0x3c,0x52,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x35,0x02,0xa8,0x00,0x07,0x00,0x0b,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b, -0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x37,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x05,0x35,0x21,0x15,0x1e,0x01,0xbd,0xfe,0x43,0x02,0x17,0xfd,0xe9,0x02,0x17,0xc8,0x52,0x01,0x3c,0x52,0xfe,0x20,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0xda,0x01,0xa4,0x01,0xd0,0x00,0x09,0x00,0x18,0x40,0x15, -0x04,0x01,0x00,0x4a,0x09,0x08,0x07,0x01,0x04,0x00,0x49,0x01,0x01,0x00,0x00,0x76,0x12,0x12,0x02,0x06,0x18,0x2b,0x37,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0xe3,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0xda,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43,0x00,0x00,0x00,0x04,0x00,0x55,0x00,0x54,0x02,0x03,0x02,0x40,0x00,0x03, -0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00,0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f, -0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0x02,0x04,0x3c,0x3c,0x90,0x3c,0x3c,0x90, -0x3c,0x3c,0x90,0x3c,0x3c,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x78,0x02,0x3a,0x02,0x58,0x00,0x15,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x03,0x00,0x4f,0x01,0x00,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x05,0x06,0x16, -0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x09,0x45,0x67,0x3a,0x3a,0x67,0x45,0x01,0x31,0xfe,0xcf,0x43,0x49,0x49,0x43,0x01,0x31,0x78,0x36,0x63,0x41,0x2c,0x42,0x62,0x36,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x00,0x01,0x00,0x50,0x00,0x37,0x02,0x21, -0x02,0x58,0x00,0x12,0x00,0x33,0x40,0x30,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x02,0x03,0x02,0x00,0x03,0x80,0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x00,0x03,0x02,0x59,0x00,0x02,0x02,0x03,0x61,0x00,0x03,0x02,0x03,0x51,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x13,0x13,0x14,0x06,0x06,0x1a,0x2b,0x37,0x3e,0x02,0x37,0x2e,0x02,0x27, -0x33,0x1e,0x02,0x33,0x15,0x22,0x06,0x06,0x07,0x50,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x5a,0x09,0x62,0xa3,0x69,0x69,0xa3,0x62,0x09,0x37,0x4f,0x7a,0x48,0x07,0x05,0x45,0x73,0x4c,0x43,0x63,0x36,0x64,0x37,0x65,0x45,0x00,0x00,0x01,0x00,0x23,0x00,0x46,0x02,0x3a,0x02,0x8a,0x00,0x1b,0x00,0x32,0x40,0x2f,0x00,0x04,0x00,0x03, -0x02,0x04,0x03,0x67,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1a,0x21,0x24,0x11,0x14,0x21,0x07,0x06,0x1b,0x2b,0x37,0x35,0x21,0x32,0x36,0x36,0x35,0x35,0x21,0x35,0x21,0x35,0x34,0x26,0x26,0x23,0x21,0x35,0x21,0x32, -0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x01,0x31,0x28,0x3f,0x25,0xfe,0x43,0x01,0xbd,0x25,0x3f,0x28,0xfe,0xcf,0x01,0x31,0x3f,0x68,0x3f,0x3f,0x68,0x3f,0x46,0x50,0x27,0x40,0x25,0x1e,0x50,0x1e,0x25,0x40,0x27,0x50,0x39,0x63,0x3e,0x90,0x3e,0x63,0x39,0x00,0x00,0x00,0x02,0x00,0x37,0xff,0x4c,0x02,0x1c,0x02,0xda,0x00,0x0b, -0x00,0x11,0x00,0x3a,0x40,0x37,0x11,0x0e,0x08,0x03,0x02,0x01,0x06,0x02,0x01,0x01,0x4c,0x00,0x00,0x05,0x01,0x01,0x02,0x00,0x01,0x67,0x04,0x01,0x02,0x03,0x03,0x02,0x57,0x04,0x01,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x10,0x0f,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x07,0x06,0x19,0x2b,0x17,0x35, -0x13,0x03,0x35,0x21,0x15,0x21,0x13,0x03,0x21,0x15,0x25,0x33,0x13,0x03,0x23,0x13,0x37,0xfa,0xfa,0x01,0xe5,0xfe,0xb4,0xfa,0xfa,0x01,0x4c,0xfe,0x46,0x41,0xfd,0xfd,0x41,0xfc,0xb4,0x32,0x01,0x94,0x01,0x96,0x32,0x2e,0xfe,0x62,0xfe,0x6c,0x2e,0x2e,0x01,0x98,0x01,0x9a,0xfe,0x66,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x78,0x02,0x35, -0x02,0x58,0x00,0x15,0x00,0x28,0x40,0x25,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x15,0x00,0x14,0x21,0x25,0x21,0x05,0x06,0x19,0x2b,0x37,0x35,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x15, -0x14,0x06,0x06,0x23,0x1e,0x01,0x31,0x43,0x49,0x49,0x43,0xfe,0xcf,0x01,0x31,0x45,0x67,0x3a,0x3a,0x67,0x45,0x78,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x36,0x62,0x42,0x2c,0x41,0x63,0x36,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57, -0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xff,0x02,0x58,0xff,0x02,0x08,0x50,0x50,0xfd,0xf8,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x24,0x40,0x21,0x00,0x03,0x02,0x03, -0x85,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x21,0x23,0x11,0x21,0x35,0x21,0x35,0x33,0x02,0x58,0x5a,0xfe,0x02,0x01,0xfe,0x5a,0x01,0x09,0x50,0xff,0x00,0x00,0x00,0x03,0x00,0x43,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x13, -0x00,0x16,0x00,0x1a,0x00,0x96,0xb5,0x15,0x01,0x02,0x03,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x33,0x00,0x05,0x04,0x05,0x85,0x00,0x08,0x07,0x07,0x08,0x71,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0e,0x0a,0x02,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x07,0x07,0x00,0x57,0x0c,0x01,0x00,0x00,0x07,0x5f, -0x0d,0x09,0x02,0x07,0x00,0x07,0x4f,0x1b,0x40,0x32,0x00,0x05,0x04,0x05,0x85,0x00,0x08,0x07,0x08,0x86,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0e,0x0a,0x02,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x07,0x07,0x00,0x57,0x0c,0x01,0x00,0x00,0x07,0x5f,0x0d,0x09,0x02,0x07,0x00,0x07,0x4f,0x59,0x40,0x1c,0x14, -0x14,0x00,0x00,0x1a,0x19,0x18,0x17,0x14,0x16,0x14,0x16,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x33,0x35,0x33,0x13,0x23,0x35,0x33,0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x33,0x11,0x21,0x07,0x23,0x37,0x01,0x35,0x07,0x17,0x23,0x03,0x33,0x50,0x39,0x5f,0x75,0x93,0x53,0xfe,0xf7,0x01, -0x27,0x25,0x46,0x25,0x37,0xfe,0xbd,0x28,0x46,0x28,0x01,0x2f,0x4e,0x4e,0x6c,0x5f,0xcb,0x52,0x01,0x02,0x52,0xe2,0x52,0x64,0x64,0xfd,0x26,0x6e,0x6e,0x01,0xa6,0xd4,0xd4,0x52,0xfe,0xfe,0x00,0x03,0x00,0x1d,0xff,0xf6,0x02,0x3b,0x02,0x30,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3c,0x40,0x39,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00, -0x69,0x05,0x01,0x03,0x02,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x61,0x08,0x04,0x07,0x03,0x02,0x03,0x02,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22, -0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xe9,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0x6f,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0xb0,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0xfe,0x46,0x23,0x1e,0x1d,0x22, -0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x00,0x03,0x00,0x41,0x00,0x26,0x02,0x17,0x02,0x6f,0x00,0x1b,0x00,0x37,0x00,0x53,0x01,0x0c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x65,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x12,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x08,0x06,0x0a,0x07,0x08,0x72,0x13,0x01,0x0b,0x07,0x09, -0x0a,0x0b,0x72,0x00,0x0e,0x0c,0x10,0x0d,0x0e,0x72,0x14,0x01,0x11,0x0d,0x0f,0x10,0x11,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x00,0x0a,0x07,0x06,0x0a,0x69,0x00,0x07,0x00,0x09,0x0c,0x07,0x09,0x6a,0x00,0x0c,0x00,0x10,0x0d,0x0c,0x10,0x69,0x00,0x0d,0x11,0x0f,0x0d,0x59, -0x00,0x0d,0x0d,0x0f,0x62,0x00,0x0f,0x0d,0x0f,0x52,0x1b,0x40,0x6b,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x12,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x08,0x06,0x0a,0x06,0x08,0x0a,0x80,0x13,0x01,0x0b,0x07,0x09,0x07,0x0b,0x09,0x80,0x00,0x0e,0x0c,0x10,0x0c,0x0e,0x10,0x80,0x14,0x01,0x11,0x0d,0x0f,0x0d,0x11,0x0f,0x80, -0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x00,0x0a,0x07,0x06,0x0a,0x69,0x00,0x07,0x00,0x09,0x0c,0x07,0x09,0x6a,0x00,0x0c,0x00,0x10,0x0d,0x0c,0x10,0x69,0x00,0x0d,0x11,0x0f,0x0d,0x59,0x00,0x0d,0x0d,0x0f,0x62,0x00,0x0f,0x0d,0x0f,0x52,0x59,0x40,0x2e,0x38,0x38,0x1c,0x1c,0x00, -0x00,0x38,0x53,0x38,0x53,0x50,0x4e,0x4b,0x49,0x46,0x45,0x42,0x40,0x3d,0x3b,0x1c,0x37,0x1c,0x37,0x34,0x32,0x2f,0x2d,0x2a,0x29,0x26,0x24,0x21,0x1f,0x00,0x1b,0x00,0x1b,0x23,0x23,0x13,0x23,0x23,0x15,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23, -0x22,0x06,0x15,0x15,0x07,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x07,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x41,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18, -0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x01,0xd9,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f, -0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0xd7,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0xd7,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x33, -0x40,0x30,0x0b,0x01,0x03,0x04,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x01,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x01,0x04,0x4f,0x00,0x00,0x10,0x0f,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x06,0x06,0x19,0x2b,0x33,0x03,0x33,0x17,0x33,0x37,0x33,0x03,0x27,0x16,0x16,0x17,0x36, -0x36,0x37,0x37,0x23,0xef,0xbd,0x5b,0x32,0xd9,0x32,0x5c,0xbe,0x60,0x0d,0x13,0x04,0x05,0x12,0x0d,0x36,0xb4,0x02,0xda,0xca,0xca,0xfd,0x26,0xeb,0x34,0x5a,0x17,0x17,0x59,0x34,0xda,0x00,0x00,0x03,0xff,0xf6,0x00,0x19,0x02,0x62,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00, -0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16, -0x15,0x14,0x06,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x1c,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xfe,0xf1,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xfe,0xf0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27, -0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x02,0x02,0x01,0x57,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x11,0x11,0x11,0x10,0x04, -0x06,0x1a,0x2b,0x13,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0xff,0x5a,0xff,0xfd,0xa8,0xff,0x02,0x58,0xfd,0xf8,0x50,0x50,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xbc,0x00,0x0c,0x00,0x10,0x00,0x39,0x40,0x36,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x05,0x01,0x02,0x03,0x02,0x85,0x00,0x03,0x04,0x04, -0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x06,0x01,0x04,0x03,0x04,0x4f,0x0d,0x0d,0x00,0x00,0x0d,0x10,0x0d,0x10,0x0f,0x0e,0x00,0x0c,0x00,0x0c,0x18,0x11,0x07,0x06,0x18,0x2b,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x05,0x35,0x21,0x15,0xef,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x5b,0xb3,0xfe, -0xec,0x01,0xae,0xc8,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0xc8,0x50,0x50,0x00,0x00,0x00,0x00,0x06,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x1a,0x00,0x25,0x00,0x32,0x00,0x3f,0x00,0x4b,0x00,0x40,0x40,0x3d,0x4a,0x46,0x42,0x3e,0x3a,0x36,0x30,0x2c,0x27,0x25,0x22,0x1e,0x1a,0x17, -0x13,0x0f,0x02,0x01,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x04,0x01,0x02,0x00,0x00,0x02,0x59,0x04,0x01,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x41,0x40,0x01,0x00,0x40,0x4b,0x41,0x4b,0x09,0x07,0x00,0x0f,0x01,0x0f,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06, -0x03,0x16,0x16,0x17,0x26,0x26,0x35,0x35,0x06,0x06,0x07,0x25,0x14,0x06,0x07,0x36,0x36,0x37,0x37,0x26,0x26,0x27,0x13,0x17,0x36,0x36,0x35,0x34,0x27,0x07,0x06,0x06,0x07,0x16,0x16,0x25,0x14,0x16,0x17,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x06,0x01,0x32,0x37,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x16,0x01,0x2c,0x58,0x8d, -0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xd9,0x11,0x38,0x17,0x05,0x05,0x3c,0x60,0x1c,0x01,0x0c,0x06,0x05,0x18,0x37,0x12,0x62,0x1c,0x60,0x3c,0x55,0x3b,0x23,0x27,0x05,0x62,0x12,0x3e,0x1c,0x14,0x2e,0xfe,0x89,0x27,0x23,0x3b,0x0d,0x2d,0x14,0x1c,0x3e,0x12,0x62,0x05,0x01,0x04,0x3f,0x36,0x3b,0x0c,0x22,0x0c,0x0c,0x22,0x0c, -0x3b,0x36,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x96,0x06,0x1a,0x0e,0x1a,0x37,0x13,0x6b,0x09,0x42,0x32,0x12,0x13,0x37,0x1a,0x0e,0x1a,0x06,0x24,0x32,0x42,0x09,0xfe,0x9b,0x55,0x23,0x5f,0x37,0x1b,0x1b,0x25,0x07,0x10,0x04,0x14,0x35,0x53,0x37,0x5f,0x23,0x55,0x12,0x34,0x14,0x04,0x10,0x07,0x25, -0x1b,0xfe,0xe1,0x1a,0x56,0x11,0x3c,0x1a,0x1a,0x3b,0x12,0x56,0x1a,0x00,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x18,0x00,0x21,0x00,0x42,0x40,0x3f,0x00,0x01,0x07,0x01,0x02,0x03,0x01,0x02,0x69,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x67,0x08,0x01,0x04,0x00,0x00,0x04,0x59,0x08,0x01,0x04,0x04, -0x00,0x61,0x06,0x01,0x00,0x04,0x00,0x51,0x1a,0x19,0x11,0x10,0x01,0x00,0x1e,0x1d,0x19,0x21,0x1a,0x21,0x15,0x14,0x10,0x18,0x11,0x18,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x06,0x07,0x21,0x2e,0x02,0x03,0x32,0x36,0x36, -0x37,0x21,0x1e,0x02,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x43,0x6e,0x47,0x09,0x02,0x02,0x09,0x47,0x6e,0x43,0x43,0x6e,0x47,0x09,0xfd,0xfe,0x09,0x47,0x6e,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x39,0x63,0x40,0x40,0x63,0x39,0xfd,0xf8,0x39,0x63,0x40,0x40, -0x63,0x39,0x00,0x00,0x00,0x04,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x16,0x00,0x20,0x00,0x27,0x00,0x4e,0x40,0x4b,0x00,0x01,0x09,0x01,0x02,0x03,0x01,0x02,0x69,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x67,0x0a,0x01,0x06,0x00,0x00,0x06,0x59,0x0a,0x01,0x06,0x06,0x00,0x61, -0x08,0x01,0x00,0x06,0x00,0x51,0x22,0x21,0x11,0x10,0x01,0x00,0x25,0x24,0x21,0x27,0x22,0x27,0x1f,0x1e,0x1a,0x19,0x14,0x13,0x10,0x16,0x11,0x16,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0b,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x21,0x26,0x26,0x01,0x14,0x17, -0x21,0x36,0x35,0x34,0x27,0x21,0x06,0x01,0x32,0x36,0x37,0x21,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4b,0x78,0x20,0x01,0xc6,0x20,0x78,0xfe,0xb1,0x04,0x02,0x00,0x04,0x04,0xfe,0x00,0x04,0x01,0x04,0x4b,0x78,0x20,0xfe,0x3a,0x20,0x78,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59, -0x58,0x8d,0x51,0x02,0x3a,0x47,0x3b,0x3b,0x47,0xfe,0xfc,0x1a,0x18,0x18,0x1a,0x1a,0x18,0x18,0xfe,0xe2,0x47,0x3b,0x3b,0x47,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x19,0x00,0x23,0x00,0x3a,0x40,0x37,0x22,0x21,0x14,0x13,0x04,0x03,0x02,0x01,0x4c,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x69,0x05,0x01,0x03, -0x00,0x00,0x03,0x59,0x05,0x01,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x03,0x00,0x51,0x1b,0x1a,0x01,0x00,0x1a,0x23,0x1b,0x23,0x17,0x15,0x09,0x07,0x00,0x0f,0x01,0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x14,0x16,0x17,0x01,0x26,0x23,0x22,0x06,0x06,0x01,0x32, -0x36,0x36,0x35,0x34,0x26,0x27,0x01,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xfe,0xa3,0x2f,0x28,0x01,0x21,0x36,0x3e,0x4a,0x76,0x44,0x01,0x04,0x4a,0x76,0x44,0x33,0x2b,0xfe,0xde,0x39,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36,0x3c,0x66,0x23,0x01,0xaf,0x1a,0x44, -0x76,0xfe,0xb2,0x44,0x76,0x4a,0x3f,0x69,0x23,0xfe,0x4f,0x1e,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x42,0x40,0x3f,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x00,0x04,0x08,0x01,0x05,0x02,0x04,0x05,0x67,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01, -0x00,0x02,0x00,0x51,0x20,0x20,0x11,0x10,0x01,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16, -0x27,0x35,0x21,0x15,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x56,0x01,0x40,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xdc,0x50,0x50,0x00,0x00,0x00, -0x00,0x05,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x2f,0x00,0x46,0x40,0x43,0x2d,0x2c,0x2b,0x25,0x24,0x23,0x1f,0x19,0x15,0x14,0x13,0x0b,0x03,0x02,0x01,0x4c,0x00,0x01,0x05,0x01,0x02,0x03,0x01,0x02,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x04,0x01, -0x00,0x03,0x00,0x51,0x29,0x28,0x11,0x10,0x01,0x00,0x28,0x2f,0x29,0x2f,0x10,0x17,0x11,0x17,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x17,0x37,0x26,0x26,0x13,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x05,0x14,0x16,0x17, -0x37,0x27,0x06,0x06,0x01,0x32,0x36,0x37,0x27,0x07,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x2e,0x51,0x21,0x9e,0x9f,0x20,0x50,0x04,0x9f,0x19,0x1b,0x1b,0x18,0xfe,0x2b,0x1a,0x18,0x9c,0x9c,0x18,0x1a,0x01,0x04,0x2d,0x4f,0x20,0x9e,0x9d,0x21,0x50,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51, -0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x1b,0x19,0x9d,0x9f,0x18,0x1a,0xfe,0xfb,0x9e,0x20,0x51,0x2e,0x2e,0x50,0x21,0x9f,0x2d,0x50,0x20,0x9c,0x9d,0x20,0x4f,0xfe,0xcf,0x1a,0x17,0x9f,0x9d,0x18,0x1b,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0x6c,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x42,0x40,0x3f,0x00,0x01,0x00,0x03, -0x05,0x01,0x03,0x69,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x21,0x22,0x26,0x26, -0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44, -0x76,0x4a,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xcc,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x00,0x05,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x15,0x00,0x1b,0x00,0x21,0x00,0x27, -0x00,0x4b,0x40,0x48,0x17,0x15,0x02,0x02,0x01,0x27,0x1d,0x02,0x00,0x04,0x02,0x4c,0x00,0x01,0x02,0x01,0x85,0x06,0x01,0x00,0x04,0x00,0x86,0x07,0x03,0x02,0x02,0x04,0x04,0x02,0x57,0x07,0x03,0x02,0x02,0x02,0x04,0x5f,0x05,0x08,0x02,0x04,0x02,0x04,0x4f,0x1c,0x1c,0x16,0x16,0x01,0x00,0x23,0x22,0x1c,0x21,0x1c,0x21,0x16,0x1b,0x16, -0x1b,0x11,0x10,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x33,0x2e,0x02,0x27,0x07,0x35,0x0e,0x02,0x07,0x05,0x15,0x3e,0x02,0x37,0x21,0x23,0x1e,0x02,0x17,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x2d,0xd5, -0x08,0x3a,0x5b,0x38,0x58,0x38,0x5b,0x3a,0x08,0x01,0x2d,0x38,0x5b,0x3a,0x08,0xfe,0xd3,0xd5,0x08,0x3a,0x5b,0x38,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x5e,0x39,0x5b,0x3c,0x09,0xd9,0xd9,0x09,0x3c,0x5b,0x39,0x50,0xd9,0x09,0x3c,0x5b,0x39,0x39,0x5b,0x3c,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x28, -0x00,0x00,0x02,0x30,0x02,0xe4,0x00,0x0e,0x00,0x15,0x40,0x12,0x0e,0x0d,0x0c,0x0b,0x07,0x04,0x00,0x07,0x00,0x4a,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x01,0x27,0x26,0x26,0x27,0x11,0x23,0x11,0x06,0x06,0x07,0x07,0x35,0x25,0x05,0x02,0x30,0xb4,0x10,0x16,0x02,0x50,0x04,0x14,0x0e,0xb6,0x01,0x03,0x01,0x05,0x01,0x99,0xa0, -0x0e,0x1c,0x07,0xfd,0x96,0x02,0x6a,0x09,0x1c,0x0c,0xa2,0x6b,0xe2,0xe1,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0xed,0x02,0x1c,0x02,0xda,0x00,0x0e,0x00,0x26,0x40,0x23,0x0a,0x09,0x08,0x04,0x03,0x05,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0c,0x11, -0x03,0x06,0x17,0x2b,0x13,0x37,0x21,0x11,0x07,0x11,0x34,0x36,0x37,0x01,0x27,0x01,0x06,0x06,0x23,0x4c,0x4f,0x01,0x81,0x53,0x05,0x05,0xfe,0x95,0x39,0x01,0x6e,0x0a,0x24,0x14,0x02,0x8b,0x4f,0xfe,0x7b,0x53,0x01,0x1a,0x10,0x22,0x0b,0xfe,0x94,0x39,0x01,0x6e,0x07,0x02,0x00,0x01,0x00,0x14,0x00,0x32,0x02,0x4e,0x02,0x62,0x00,0x0d, -0x00,0x30,0x40,0x2d,0x0c,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x14,0x11,0x13,0x05,0x06,0x19,0x2b,0x25,0x37,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03, -0x01,0x0a,0x9e,0x1a,0x1a,0xfe,0x38,0x01,0xc3,0x0c,0x19,0x0a,0x9e,0x69,0xdb,0xdc,0x32,0xc9,0x22,0x05,0x50,0x05,0x14,0x0d,0xca,0xfe,0xe9,0xfe,0xe7,0x00,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x1c,0x01,0xed,0x00,0x0e,0x00,0x20,0x40,0x1d,0x0c,0x0b,0x07,0x06,0x05,0x05,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, -0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x1a,0x30,0x02,0x06,0x18,0x2b,0x37,0x21,0x32,0x16,0x17,0x01,0x37,0x01,0x26,0x26,0x35,0x11,0x17,0x11,0x21,0x4c,0x01,0x0f,0x14,0x24,0x0a,0xfe,0x92,0x39,0x01,0x6b,0x05,0x05,0x53,0xfe,0x7f,0x4f,0x02,0x07,0x01,0x6e,0x39,0xfe,0x94,0x0b,0x22,0x10,0x01,0x1a,0x53,0xfe,0x7b,0x00,0x00,0x00, -0x00,0x01,0x00,0x28,0xff,0xf6,0x02,0x30,0x02,0xda,0x00,0x0e,0x00,0x15,0x40,0x12,0x0b,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x49,0x00,0x00,0x00,0x76,0x19,0x01,0x06,0x17,0x2b,0x01,0x15,0x05,0x25,0x35,0x17,0x16,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x37,0x02,0x30,0xfe,0xfb,0xfe,0xfd,0xb6,0x0e,0x14,0x04,0x50,0x02,0x16,0x10, -0x01,0x41,0x6a,0xe1,0xe2,0x6b,0xa2,0x0c,0x1c,0x09,0x02,0x6a,0xfd,0x96,0x08,0x1b,0x0e,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x29,0x01,0xed,0x00,0x0e,0x00,0x27,0x40,0x24,0x0a,0x09,0x08,0x04,0x03,0x05,0x01,0x4a,0x02,0x01,0x01,0x00,0x00,0x01,0x57,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00, -0x00,0x0e,0x00,0x0c,0x11,0x03,0x06,0x17,0x2b,0x25,0x07,0x21,0x11,0x37,0x11,0x14,0x06,0x07,0x01,0x17,0x01,0x36,0x36,0x33,0x02,0x0c,0x4f,0xfe,0x7f,0x53,0x05,0x05,0x01,0x6b,0x39,0xfe,0x92,0x0b,0x23,0x14,0x4f,0x4f,0x01,0x85,0x53,0xfe,0xe6,0x10,0x22,0x0b,0x01,0x6c,0x39,0xfe,0x92,0x07,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x0a, -0x00,0x32,0x02,0x44,0x02,0x62,0x00,0x0d,0x00,0x2a,0x40,0x27,0x02,0x01,0x03,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x03,0x00,0x86,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x11,0x14,0x12,0x10,0x04,0x06,0x1a,0x2b,0x25,0x23,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21, -0x16,0x17,0x01,0x4e,0x68,0xdc,0xdb,0x69,0x9e,0x0a,0x19,0x0c,0x01,0xc3,0xfe,0x38,0x1a,0x1a,0x32,0x01,0x19,0x01,0x17,0xca,0x0d,0x14,0x05,0x50,0x05,0x22,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0xed,0x02,0x29,0x02,0xda,0x00,0x0e,0x00,0x20,0x40,0x1d,0x0c,0x0b,0x07,0x06,0x05,0x05,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01, -0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1a,0x30,0x02,0x06,0x18,0x2b,0x01,0x21,0x22,0x26,0x27,0x01,0x07,0x01,0x16,0x16,0x15,0x11,0x27,0x11,0x21,0x02,0x0c,0xfe,0xf1,0x14,0x23,0x0b,0x01,0x6e,0x39,0xfe,0x95,0x05,0x05,0x53,0x01,0x81,0x02,0x8b,0x02,0x07,0xfe,0x92,0x39,0x01,0x6c,0x0b,0x22,0x10,0xfe,0xe6,0x53,0x01,0x85,0x00, -0x00,0x01,0xff,0xb0,0x00,0x32,0x02,0xa8,0x02,0x62,0x00,0x17,0x00,0x35,0x40,0x32,0x12,0x05,0x02,0x05,0x02,0x01,0x4c,0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x14,0x14,0x12,0x13,0x07, -0x06,0x1b,0x2b,0x13,0x16,0x17,0x17,0x23,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x37,0x22,0x1a,0x1a,0x9e,0x68,0xdc,0xdb,0x69,0x9e,0x0a,0x19,0x0c,0x02,0x0a,0x0c,0x19,0x0a,0x9e,0x69,0xdb,0xdc,0x68,0x9e,0x1a,0x1a,0x01,0x22,0x05,0x22,0xc9,0x01,0x19,0x01,0x17,0xca,0x0d,0x14, -0x05,0x05,0x14,0x0d,0xca,0xfe,0xe9,0xfe,0xe7,0xc9,0x22,0x05,0x00,0x01,0x00,0x28,0xff,0x56,0x02,0x30,0x03,0x84,0x00,0x19,0x00,0x06,0xb3,0x19,0x0c,0x01,0x32,0x2b,0x37,0x35,0x17,0x16,0x16,0x17,0x11,0x06,0x06,0x07,0x07,0x35,0x25,0x05,0x15,0x27,0x26,0x26,0x27,0x11,0x36,0x36,0x37,0x37,0x15,0x05,0x28,0xb6,0x0e,0x14,0x04,0x04, -0x14,0x0e,0xb6,0x01,0x03,0x01,0x05,0xb4,0x10,0x16,0x02,0x02,0x16,0x10,0xb4,0xfe,0xfb,0x38,0x6b,0xa2,0x0c,0x1c,0x09,0x03,0x3a,0x09,0x1c,0x0c,0xa2,0x6b,0xe2,0xe1,0x6a,0xa0,0x0e,0x1c,0x07,0xfc,0xc6,0x08,0x1b,0x0e,0xa0,0x6a,0xe1,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0xa0,0x02,0x4e,0x01,0xbd,0x00,0x21,0x00,0x7d,0x40,0x0a, -0x11,0x01,0x02,0x03,0x14,0x01,0x06,0x00,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x29,0x08,0x01,0x07,0x01,0x04,0x06,0x07,0x72,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x00,0x00,0x06,0x01,0x00,0x06,0x69,0x00,0x01,0x07,0x04,0x01,0x59,0x00,0x01,0x01,0x04,0x61,0x05,0x01,0x04,0x01,0x04,0x51,0x1b,0x40,0x2a,0x08,0x01,0x07, -0x01,0x04,0x01,0x07,0x04,0x80,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x00,0x00,0x06,0x01,0x00,0x06,0x69,0x00,0x01,0x07,0x04,0x01,0x59,0x00,0x01,0x01,0x04,0x61,0x05,0x01,0x04,0x01,0x04,0x51,0x59,0x40,0x10,0x00,0x00,0x00,0x21,0x00,0x21,0x24,0x23,0x12,0x11,0x12,0x24,0x23,0x09,0x06,0x1d,0x2b,0x37,0x35,0x34,0x36,0x33, -0x32,0x1e,0x03,0x33,0x32,0x37,0x37,0x23,0x35,0x33,0x17,0x15,0x23,0x35,0x07,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x0a,0x4c,0x3a,0x23,0x2c,0x1d,0x15,0x17,0x11,0x1d,0x1c,0x55,0x8c,0xcd,0x46,0x50,0x4d,0x33,0x47,0x22,0x2c,0x1c,0x16,0x18,0x12,0x14,0x1f,0xa5,0x31,0x3d,0x4b,0x17,0x21,0x21,0x17,0x21,0x60,0x4e,0x46, -0xd7,0xa1,0x60,0x41,0x17,0x21,0x21,0x17,0x20,0x1a,0x31,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x25,0x00,0x7f,0x40,0x0c,0x14,0x02,0x02,0x01,0x07,0x15,0x01,0x02,0x06,0x01,0x02,0x4c,0x4b,0xb0,0x0b,0x50,0x58,0x40,0x29,0x04,0x01,0x00,0x02,0x00,0x85,0x0a,0x09,0x02,0x05,0x06,0x06,0x05,0x71,0x00,0x02,0x00, -0x07,0x01,0x02,0x07,0x69,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06,0x01,0x06,0x52,0x1b,0x40,0x28,0x04,0x01,0x00,0x02,0x00,0x85,0x0a,0x09,0x02,0x05,0x06,0x05,0x86,0x00,0x02,0x00,0x07,0x01,0x02,0x07,0x69,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06, -0x01,0x06,0x52,0x59,0x40,0x12,0x00,0x00,0x00,0x25,0x00,0x25,0x23,0x23,0x21,0x13,0x11,0x23,0x23,0x21,0x13,0x0b,0x06,0x1f,0x2b,0x37,0x27,0x35,0x37,0x33,0x07,0x33,0x32,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x33,0x27,0x33,0x17,0x15,0x07,0x23,0x37,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x23,0x17,0x8d,0x83,0x83,0x5e,0x98, -0x34,0x11,0x1e,0x22,0x2b,0x1f,0x1f,0x2b,0x22,0x1e,0x11,0x47,0x98,0x69,0x79,0x79,0x68,0x6e,0x1e,0x24,0x2b,0x1c,0x1b,0x15,0x15,0x1b,0x1b,0x29,0x23,0x0d,0x6e,0x5f,0x91,0x46,0x91,0xa5,0x20,0x2b,0x20,0x20,0x2b,0x20,0xa5,0x91,0x46,0x91,0x74,0x20,0x29,0x20,0x20,0x29,0x20,0x74,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e, -0x01,0xc7,0x00,0x11,0x00,0x68,0xb6,0x04,0x03,0x02,0x05,0x02,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x22,0x03,0x01,0x01,0x02,0x02,0x01,0x70,0x06,0x01,0x00,0x05,0x05,0x00,0x71,0x04,0x01,0x02,0x05,0x05,0x02,0x57,0x04,0x01,0x02,0x02,0x05,0x60,0x08,0x07,0x02,0x05,0x02,0x05,0x50,0x1b,0x40,0x20,0x03,0x01,0x01,0x02,0x01,0x85, -0x06,0x01,0x00,0x05,0x00,0x86,0x04,0x01,0x02,0x05,0x05,0x02,0x57,0x04,0x01,0x02,0x02,0x05,0x60,0x08,0x07,0x02,0x05,0x02,0x05,0x50,0x59,0x40,0x10,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x11,0x09,0x06,0x1d,0x2b,0x37,0x17,0x23,0x27,0x35,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x15,0x21,0x17,0x23,0x27, -0x69,0x82,0x5e,0x83,0x83,0x5f,0x83,0x81,0x81,0x61,0x88,0x01,0x0a,0xfe,0xf5,0x88,0x60,0x81,0xeb,0x8c,0x91,0x46,0x91,0x8c,0x8c,0x8c,0x50,0x8c,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x11,0x00,0x61,0xb6,0x0f,0x0e,0x02,0x00,0x03,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x21,0x06,0x01,0x04, -0x03,0x03,0x04,0x70,0x07,0x01,0x01,0x00,0x00,0x01,0x71,0x05,0x01,0x03,0x00,0x00,0x03,0x57,0x05,0x01,0x03,0x03,0x00,0x60,0x02,0x01,0x00,0x03,0x00,0x50,0x1b,0x40,0x1f,0x06,0x01,0x04,0x03,0x04,0x85,0x07,0x01,0x01,0x00,0x01,0x86,0x05,0x01,0x03,0x00,0x00,0x03,0x57,0x05,0x01,0x03,0x03,0x00,0x60,0x02,0x01,0x00,0x03,0x00,0x50, -0x59,0x40,0x0b,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x08,0x06,0x1e,0x2b,0x25,0x23,0x07,0x23,0x37,0x21,0x35,0x21,0x27,0x33,0x17,0x33,0x27,0x33,0x17,0x15,0x07,0x23,0x01,0xef,0x81,0x81,0x60,0x88,0xfe,0xf5,0x01,0x0a,0x88,0x61,0x81,0x81,0x83,0x5f,0x83,0x83,0x5e,0xeb,0x8c,0x8c,0x50,0x8c,0x8c,0x8c,0x91,0x46,0x91,0x00,0x00, -0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0e,0x00,0x61,0xb7,0x0b,0x04,0x03,0x03,0x05,0x02,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1f,0x03,0x01,0x01,0x02,0x02,0x01,0x70,0x04,0x01,0x00,0x05,0x05,0x00,0x71,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x06,0x01,0x05,0x02,0x05,0x50,0x1b,0x40,0x1d, -0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x06,0x01,0x05,0x02,0x05,0x50,0x59,0x40,0x0e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x12,0x11,0x11,0x13,0x11,0x07,0x06,0x1b,0x2b,0x37,0x17,0x23,0x27,0x35,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x17,0x23,0x27,0x69,0x82, -0x5e,0x83,0x83,0x5f,0x83,0x01,0x00,0x7d,0x68,0x9c,0x9c,0x67,0x7d,0xeb,0x8c,0x91,0x46,0x91,0x8c,0x8c,0xb3,0xb5,0x8c,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0e,0x00,0x5a,0xb7,0x0c,0x0b,0x04,0x03,0x00,0x03,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1e,0x04,0x01,0x02,0x03,0x03,0x02,0x70,0x05,0x01,0x01, -0x00,0x00,0x01,0x71,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x60,0x00,0x00,0x03,0x00,0x50,0x1b,0x40,0x1c,0x04,0x01,0x02,0x03,0x02,0x85,0x05,0x01,0x01,0x00,0x01,0x86,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x60,0x00,0x00,0x03,0x00,0x50,0x59,0x40,0x09,0x13,0x11,0x11,0x12,0x11,0x10,0x06,0x06,0x1c,0x2b, -0x25,0x21,0x07,0x23,0x37,0x27,0x33,0x17,0x21,0x27,0x33,0x17,0x15,0x07,0x23,0x01,0xef,0xfe,0xff,0x7d,0x67,0x9c,0x9c,0x68,0x7d,0x01,0x00,0x83,0x5f,0x83,0x83,0x5e,0xeb,0x8c,0xb5,0xb3,0x8c,0x8c,0x91,0x46,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xea,0x02,0x26,0x00,0x0d,0x00,0x32,0x40,0x2f,0x0a,0x09,0x08,0x05, -0x04,0x03,0x06,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x14,0x14,0x11,0x05,0x06,0x19,0x2b,0x33,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x17,0x15,0x27,0x11,0x33,0x15,0x6e,0x92,0x92,0x9c,0x46,0x9a, -0x92,0x92,0x50,0x01,0x6a,0x84,0x65,0x8b,0x8a,0x66,0x83,0xfe,0x97,0x50,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0d,0x00,0x60,0xb6,0x08,0x07,0x02,0x04,0x01,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1f,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x06,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x04,0x04, -0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x1b,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x13,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x37,0x11, -0x33,0x15,0x21,0x27,0x33,0x17,0x15,0x07,0x23,0x37,0x21,0x15,0x0a,0x52,0x01,0x93,0x83,0x5f,0x83,0x83,0x5e,0x82,0xfe,0x6d,0x5f,0x01,0x68,0x8c,0x8c,0x91,0x46,0x91,0x8c,0x8c,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xea,0x02,0x26,0x00,0x0d,0x00,0x2b,0x40,0x28,0x0b,0x0a,0x09,0x06,0x05,0x04,0x06,0x02,0x01,0x01,0x4c,0x00, -0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x14,0x14,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x21,0x15,0x23,0x11,0x37,0x15,0x07,0x23,0x27,0x35,0x17,0x11,0x23,0x6e,0x01,0x7c,0x92,0x92,0x9a,0x46,0x9c,0x92,0x92,0x02,0x26,0x50,0xfe,0x97,0x83,0x66,0x8a,0x8b,0x65,0x84, -0x01,0x6a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x82,0x02,0x44,0x02,0x12,0x00,0x03,0x00,0x12,0x00,0x2e,0x40,0x2b,0x0b,0x01,0x05,0x02,0x01,0x4c,0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x00,0x05,0x02,0x05,0x50,0x14,0x12,0x14,0x11,0x11,0x10,0x06,0x06, -0x1c,0x2b,0x25,0x23,0x11,0x33,0x05,0x21,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x21,0x02,0x44,0x55,0x55,0xfd,0xbc,0x01,0x57,0x05,0x15,0x0b,0x65,0x61,0xa0,0xa0,0x61,0x66,0x08,0x14,0x08,0xfe,0xa9,0x82,0x01,0x90,0xa0,0x02,0x14,0x0d,0x7d,0xc8,0xc8,0x80,0x0a,0x12,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x0a, -0x00,0x6e,0x02,0x4e,0x02,0xda,0x00,0x1e,0x00,0x3d,0x40,0x3a,0x01,0x01,0x04,0x01,0x01,0x4c,0x00,0x00,0x02,0x01,0x02,0x00,0x01,0x80,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x69,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x00,0x00,0x00,0x1e,0x00,0x1e,0x26,0x21, -0x24,0x33,0x12,0x07,0x06,0x1b,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x16,0x16,0x17,0x17,0xaa,0xa0,0xa0,0x61,0x65,0x0a,0x16,0x05,0xcb,0x4b,0x5d,0x5d,0x4b,0x1e,0x1e,0x4d,0x74,0x41,0x41,0x74,0x4d,0xcb,0x08,0x14,0x08,0x66, -0x6e,0xc8,0xc8,0x7d,0x0d,0x14,0x02,0x50,0x46,0x45,0x51,0x50,0x3f,0x69,0x3e,0x46,0x68,0x38,0x04,0x12,0x0a,0x80,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x6e,0x02,0x4e,0x02,0xda,0x00,0x1e,0x00,0x37,0x40,0x34,0x1e,0x01,0x01,0x04,0x01,0x4c,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x00,0x03,0x05, -0x02,0x03,0x69,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x60,0x00,0x01,0x04,0x01,0x50,0x14,0x24,0x21,0x26,0x24,0x10,0x06,0x06,0x1c,0x2b,0x25,0x23,0x37,0x36,0x36,0x37,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x27,0x27,0x33,0x17,0x01,0xae,0x61,0x66, -0x08,0x14,0x08,0xcb,0x4c,0x75,0x41,0x41,0x75,0x4c,0x1e,0x1e,0x4b,0x5d,0x5d,0x4b,0xcb,0x05,0x15,0x0b,0x65,0x61,0xa0,0x6e,0x80,0x0a,0x12,0x04,0x38,0x68,0x46,0x3e,0x69,0x3f,0x50,0x51,0x45,0x46,0x50,0x02,0x14,0x0d,0x7d,0xc8,0x00,0x01,0x00,0xff,0xff,0x4c,0x01,0xf4,0x03,0x47,0x00,0x05,0x00,0x18,0x40,0x15,0x04,0x03,0x02,0x01, -0x04,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x02,0x06,0x16,0x2b,0x17,0x11,0x17,0x15,0x27,0x11,0xff,0xf5,0xc3,0xb4,0x03,0xfb,0xee,0x41,0xbd,0xfc,0x77,0x00,0x00,0x01,0x00,0x0a,0xff,0xd9,0x02,0x4e,0x02,0x52,0x00,0x11,0x00,0x77,0x40,0x11,0x0d,0x0c,0x02,0x02,0x03,0x0e,0x05,0x02,0x01,0x02,0x10,0x0f, -0x02,0x00,0x01,0x03,0x4c,0x4b,0xb0,0x0b,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00, -0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x12,0x11,0x11,0x07,0x06,0x1b,0x2b,0x05,0x37,0x21,0x35,0x21,0x27,0x37,0x21,0x35,0x21,0x27,0x33,0x17,0x15,0x07,0x17,0x15,0x07,0x01,0x8b,0x62,0xfe,0x1d, -0x01,0xe3,0x62,0x62,0xfe,0x1d,0x01,0xe3,0x62,0x62,0x61,0x61,0x61,0x61,0x27,0x77,0x50,0x77,0x74,0x50,0x77,0x7d,0x44,0x7a,0x7d,0x44,0x7d,0x00,0x00,0x02,0xff,0xf6,0xff,0x4c,0x02,0x62,0x03,0x47,0x00,0x05,0x00,0x0b,0x00,0x24,0x40,0x21,0x0a,0x09,0x08,0x07,0x04,0x03,0x02,0x01,0x08,0x00,0x4a,0x03,0x01,0x02,0x03,0x00,0x00,0x76, -0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x00,0x05,0x00,0x05,0x04,0x06,0x16,0x2b,0x05,0x11,0x17,0x15,0x27,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x01,0x6d,0xf5,0xc3,0xe6,0xc3,0xf5,0xb4,0x03,0xfb,0xee,0x41,0xbd,0xfc,0x77,0x03,0x89,0xbd,0x41,0xee,0xfc,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x0d, -0x00,0x6c,0xb6,0x0c,0x05,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01, -0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x12,0x11,0x11,0x07,0x06,0x1b,0x2b,0x25,0x37,0x21,0x35,0x21,0x37,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x01,0x07,0x6a,0xfe, -0x8f,0x01,0xb0,0x3f,0x3f,0xfe,0x50,0x01,0x71,0x6a,0x69,0xe8,0xe7,0x23,0x87,0x50,0x50,0x50,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x02,0xff,0xf6,0xff,0x42,0x02,0x62,0x03,0x3d,0x00,0x05,0x00,0x0b,0x00,0x18,0x40,0x15,0x0b,0x0a,0x09,0x08,0x05,0x04,0x03,0x02,0x08,0x00,0x49,0x01,0x01,0x00,0x00,0x76,0x15,0x10,0x02,0x06,0x18,0x2b, -0x01,0x33,0x11,0x37,0x15,0x07,0x03,0x33,0x11,0x27,0x35,0x17,0x01,0x6d,0x32,0xc3,0xf5,0xb4,0x32,0xf5,0xc3,0x03,0x3d,0xfc,0x77,0xbd,0x41,0xee,0x03,0xfb,0xfc,0x05,0xee,0x41,0xbd,0x00,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x0d,0x00,0x65,0xb6,0x09,0x02,0x02,0x04,0x03,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40, -0x24,0x00,0x01,0x02,0x02,0x01,0x70,0x00,0x00,0x05,0x05,0x00,0x71,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x68,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x1b,0x40,0x22,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x05,0x00,0x86,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x68,0x00,0x04,0x05,0x05,0x04,0x57, -0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x59,0x40,0x09,0x11,0x12,0x11,0x11,0x12,0x10,0x06,0x06,0x1c,0x2b,0x25,0x23,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x01,0x51,0x6a,0xe7,0xe8,0x69,0x6a,0x01,0x71,0xfe,0x50,0x3f,0x3f,0x01,0xb0,0xfe,0x8f,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x50,0x50,0x50, -0x00,0x02,0xff,0xb0,0x00,0x23,0x02,0xa8,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00, -0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12, -0x11,0x11,0x12,0x09,0x06,0x1b,0x2b,0x37,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0x97,0xe7,0xe8,0x69,0x6a,0x01,0x2a,0x6a,0x69,0xe8,0xe7,0x6a,0x6a,0xfe,0xd6,0x6a,0xa9,0x01,0xa8,0x3f,0x3f,0xfe,0x58,0x3f,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87, -0xd7,0x50,0x50,0x50,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x10,0x00,0x7d,0xb5,0x0d,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x2d,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x06,0x07,0x07,0x06,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x68,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x07,0x07, -0x00,0x57,0x00,0x00,0x00,0x07,0x5f,0x08,0x01,0x07,0x00,0x07,0x4f,0x1b,0x40,0x2b,0x00,0x05,0x04,0x05,0x85,0x00,0x06,0x07,0x06,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x68,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x07,0x07,0x00,0x57,0x00,0x00,0x00,0x07,0x5f,0x08,0x01,0x07,0x00,0x07,0x4f,0x59,0x40,0x10,0x00,0x00, -0x00,0x10,0x00,0x10,0x12,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x06,0x1d,0x2b,0x35,0x35,0x21,0x37,0x21,0x35,0x21,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x01,0x87,0x49,0xfe,0x30,0x01,0xd0,0x49,0xfe,0x79,0x01,0x4a,0x43,0x69,0xe8,0xe7,0x6a,0x43,0x78,0x4e,0x5d,0x4e,0x5d,0x4e,0x55,0xfe,0xd9,0xfe,0xd9,0x55,0x00,0x00, -0x00,0x02,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0x16,0x00,0x0c,0x00,0x13,0x00,0x31,0x40,0x2e,0x0e,0x0c,0x02,0x03,0x4a,0x06,0x05,0x02,0x03,0x02,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x04,0x01,0x4f,0x0d,0x0d,0x0d,0x13,0x0d,0x13,0x11,0x14,0x13,0x33,0x10,0x07,0x06,0x1b, -0x2b,0x01,0x23,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x11,0x23,0x01,0x13,0x27,0x07,0x33,0x11,0x33,0x11,0x02,0x44,0x9b,0x21,0x1b,0x82,0x1b,0x21,0x9b,0x01,0x18,0xc0,0xbf,0xbf,0x70,0x9c,0x01,0xe5,0xfe,0x57,0x1b,0x21,0x21,0x1b,0x01,0xa9,0x01,0x31,0xfe,0xf4,0xcf,0xcf,0xfe,0x21,0x01,0xdf,0x00,0x00,0x00,0x00,0x02,0x00,0x00, -0x00,0x32,0x02,0x58,0x02,0x6c,0x00,0x0c,0x00,0x13,0x00,0x33,0x40,0x30,0x0e,0x0c,0x02,0x03,0x02,0x01,0x4c,0x0f,0x0b,0x02,0x01,0x4a,0x0d,0x00,0x02,0x00,0x49,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x11,0x16,0x25,0x21,0x04,0x06,0x1a,0x2b,0x25, -0x35,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x35,0x01,0x05,0x37,0x27,0x15,0x21,0x15,0x21,0x01,0x27,0xeb,0x1b,0x21,0x21,0x1b,0xeb,0x01,0x31,0xfe,0xfb,0xc7,0xc7,0xfe,0xdc,0x01,0x24,0x32,0xa4,0x21,0x1b,0x7a,0x1b,0x21,0xa4,0xfe,0xe3,0xbb,0xbb,0xba,0x6c,0x9c,0x00,0x01,0x00,0x0a,0xff,0xf6,0x02,0x4e,0x01,0x56,0x00,0x05, -0x00,0x06,0xb3,0x04,0x00,0x01,0x32,0x2b,0x05,0x25,0x35,0x05,0x25,0x15,0x01,0x2b,0xfe,0xdf,0x01,0x27,0x01,0x1d,0x0a,0xf6,0x69,0xf9,0xfa,0x69,0x00,0x03,0xff,0xf6,0x01,0xae,0x02,0x62,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x3e,0x40,0x3b,0x0c,0x01,0x04,0x01,0x01,0x4c,0x09,0x01,0x00,0x4a,0x07,0x05,0x02,0x04,0x01,0x04, -0x86,0x03,0x01,0x00,0x01,0x01,0x00,0x57,0x03,0x01,0x00,0x00,0x01,0x5f,0x02,0x06,0x02,0x01,0x00,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0b,0x0a,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x03,0x35,0x33,0x15,0x21,0x23,0x35,0x33,0x01,0x13,0x13,0x23,0x27,0x07,0x0a,0xb4,0x01,0xb8,0xb4,0xb4, -0xfd,0xd5,0xf5,0xf5,0x5f,0x96,0x96,0x02,0x8a,0x50,0x50,0x50,0xfe,0xd4,0x01,0x2c,0xfe,0xd4,0xb9,0xb9,0x00,0x01,0x00,0x0a,0x00,0x78,0x02,0x4e,0x02,0x1c,0x00,0x16,0x00,0x2f,0x40,0x2c,0x16,0x01,0x01,0x02,0x01,0x4c,0x05,0x01,0x01,0x01,0x4b,0x00,0x03,0x02,0x03,0x85,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00, -0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x16,0x31,0x27,0x10,0x04,0x06,0x1a,0x2b,0x25,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x01,0x9e,0x95,0x56,0x0c,0x1c,0x0c,0x13,0x26,0x0b,0xfe,0xbb,0x01,0x41,0x1a,0x26,0x06,0x05,0x18,0x10,0x57,0x91,0xb0,0x78, -0x68,0x0f,0x1c,0x08,0x04,0x01,0x03,0x6e,0x01,0x02,0x04,0x05,0x19,0x13,0x69,0xd2,0x00,0x01,0x00,0x05,0x00,0x64,0x02,0x4e,0x02,0x30,0x00,0x27,0x00,0x39,0x40,0x36,0x25,0x18,0x02,0x01,0x02,0x01,0x4c,0x09,0x01,0x01,0x01,0x4b,0x00,0x03,0x02,0x03,0x85,0x04,0x01,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02, -0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x01,0x00,0x23,0x21,0x17,0x13,0x0f,0x0c,0x00,0x27,0x01,0x27,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x17,0x07,0x06,0x01, -0x75,0x17,0x22,0x0e,0x08,0x1a,0x26,0x06,0x13,0x28,0x11,0xfe,0xf5,0x19,0x23,0x23,0x19,0x01,0x07,0x1a,0x2a,0x0c,0x0a,0x23,0x14,0x11,0x0d,0x22,0x17,0x1d,0x11,0xae,0xad,0x10,0x64,0x22,0x17,0x14,0x10,0x09,0x1e,0x27,0x04,0x04,0x01,0x03,0x20,0x17,0x17,0x20,0x02,0x02,0x04,0x09,0x23,0x15,0x13,0x10,0x14,0x17,0x20,0x19,0xcd,0xcf, -0x17,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x69,0x02,0x4e,0x02,0x2b,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x00,0x01,0x01,0x4c,0x05,0x01,0x01,0x4a,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x02,0x06,0x18,0x2b,0x25,0x35,0x21,0x35,0x21,0x35,0x17,0x01, -0x8f,0xfe,0x7b,0x01,0x85,0xbf,0x69,0xbe,0x46,0xbe,0xe1,0x00,0x00,0x01,0x00,0x0a,0x00,0x69,0x02,0x4e,0x02,0x2b,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x00,0x01,0x01,0x4c,0x05,0x01,0x01,0x4a,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x02,0x06,0x18,0x2b, -0x25,0x35,0x21,0x35,0x21,0x35,0x17,0x01,0x8f,0xfe,0x7b,0x01,0x85,0xbf,0x69,0xaa,0x6e,0xaa,0xe1,0x00,0x00,0x01,0xff,0xd8,0x00,0x4b,0x02,0x80,0x02,0x49,0x00,0x16,0x00,0x3a,0x40,0x37,0x07,0x01,0x01,0x00,0x11,0x08,0x01,0x03,0x02,0x01,0x12,0x01,0x03,0x02,0x03,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00, -0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x21,0x36,0x12,0x05,0x06,0x19,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x26,0x27,0x15,0x16,0x16,0x17,0x17,0xa7,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x29,0x10,0x01,0xe0, -0xfe,0x20,0x10,0x29,0x0d,0x07,0x19,0x0d,0x89,0x4b,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x02,0x02,0x50,0x04,0x01,0x09,0x06,0x1a,0x0f,0xa4,0x00,0x00,0x01,0xff,0xd8,0x00,0x4b,0x02,0x80,0x02,0x49,0x00,0x16,0x00,0x3a,0x40,0x37,0x0f,0x01,0x01,0x02,0x15,0x0e,0x05,0x03,0x00,0x01,0x04,0x01,0x03,0x00,0x03,0x4c,0x00,0x02,0x01,0x02, -0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x17,0x21,0x27,0x05,0x06,0x19,0x2b,0x25,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x01,0x4b,0x86,0x0a,0x1a, -0x09,0x0d,0x28,0x11,0xfe,0x20,0x01,0xe0,0x11,0x28,0x0d,0x07,0x19,0x0d,0x89,0x69,0xcf,0xce,0x4b,0xa5,0x0c,0x1a,0x07,0x09,0x01,0x03,0x50,0x03,0x02,0x09,0x06,0x1a,0x0f,0xa4,0xff,0xff,0x00,0x01,0xff,0xb0,0x00,0x4b,0x02,0xa8,0x02,0x49,0x00,0x29,0x00,0x43,0x40,0x40,0x10,0x07,0x02,0x01,0x00,0x24,0x1d,0x16,0x0f,0x08,0x01,0x06, -0x04,0x01,0x25,0x1c,0x02,0x03,0x04,0x03,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x01,0x04,0x4f,0x00,0x00,0x00,0x29,0x00,0x29,0x37,0x12,0x17,0x46,0x12,0x07,0x06,0x1b,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36, -0x33,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x22,0x26,0x27,0x15,0x16,0x16,0x17,0x17,0x7f,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x29,0x10,0x01,0x68,0x11,0x28,0x0d,0x07,0x19,0x0d,0x89,0x69,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x28,0x11,0xfe,0x98, -0x10,0x29,0x0d,0x07,0x19,0x0d,0x89,0x4b,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x02,0x02,0x03,0x02,0x09,0x06,0x1a,0x0f,0xa4,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x01,0x03,0x04,0x01,0x09,0x06,0x1a,0x0f,0xa4,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0xff,0x79,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, -0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0xfe,0xd4,0xa5,0xa5,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x00,0x1e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03, -0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x01,0x4a,0xfe,0xb6,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x00,0xc3,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe, -0xd4,0x01,0xef,0xfe,0x11,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x01,0x68,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00, -0xfe,0xd4,0x02,0x58,0x02,0x0d,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x03,0x39,0xfc,0xc7,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x02,0xb2,0x00,0x03,0x00,0x17,0x40,0x14, -0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x03,0xde,0xfc,0x22,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0x57,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, -0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x04,0x83,0xfb,0x7d,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21, -0x11,0x02,0x58,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x68,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00, -0x00,0x01,0x00,0x00,0x03,0x57,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0x03,0x57,0xa5,0xa5,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x4b, -0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33,0x11,0x4b,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x96,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, -0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33,0x11,0x96,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0xc8,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33, -0x11,0xc8,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0x2c,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00, -0xfe,0xd4,0x01,0x77,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x77,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0xc2,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14, -0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0xc2,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x0d,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, -0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x0d,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x01,0x2c,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21, -0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x01,0x02,0x0d,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x33,0x11,0x02,0x0d,0x4b,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00, -0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0x2c,0x01,0x68,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x01,0x2c,0xfe,0xd4,0x02,0x58,0x01,0x68,0x00,0x03, -0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x01,0x00,0x00,0x01,0x68,0x01,0x2c,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, -0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x01,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00, -0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01, -0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x11,0x11,0x21,0x19,0x02,0x21,0x11,0x01,0x2c,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0xfd,0x6c,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a, -0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x01,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a, -0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x01,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0xfe,0xca,0x02,0x62,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x01,0x01,0x2c,0x01,0x68,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14, -0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01, -0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfd,0xa8,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0xfd,0x6c,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x01,0x00,0x00, -0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x00,0x00,0x37,0x00,0x3c, -0xff,0x10,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b,0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73, -0x00,0x77,0x00,0x7b,0x00,0x7f,0x00,0x83,0x00,0x87,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xa3,0x00,0xa7,0x00,0xab,0x00,0xaf,0x00,0xb3,0x00,0xb7,0x00,0xbb,0x00,0xbf,0x00,0xc3,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0xd3,0x00,0xd7,0x00,0xdb,0x00,0x00,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35, -0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35, -0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35, -0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35, -0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x02,0x1c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x03,0xc0,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x6e,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b, -0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73,0x00,0x77,0x00,0x7b,0x00,0x7f,0x00,0x83,0x00,0x87,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xa3,0x00,0xa7,0x00,0xab,0x00,0xaf,0x00,0xb3,0x00,0xb7,0x00,0xbb,0x00,0xbf,0x00,0xc3,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0xd3,0x00,0xd7,0x00,0xdb, -0x00,0xdf,0x00,0xe3,0x00,0xe7,0x00,0xeb,0x00,0xef,0x00,0xf3,0x00,0xf7,0x00,0xfb,0x00,0xff,0x01,0x03,0x01,0x07,0x01,0x0b,0x01,0x0f,0x01,0x13,0x01,0x17,0x01,0x1b,0x01,0x1f,0x01,0x23,0x01,0x27,0x01,0x2b,0x01,0x2f,0x01,0x33,0x01,0x37,0x01,0x3b,0x01,0x3f,0x01,0x43,0x01,0x47,0x01,0x4b,0x01,0x4f,0x01,0x53,0x01,0x57,0x01,0x5b, -0x01,0x5f,0x01,0x63,0x01,0x67,0x01,0x6b,0x01,0x6f,0x01,0x73,0x01,0x77,0x01,0x7b,0x01,0x7f,0x01,0x83,0x01,0x87,0x01,0x8b,0x01,0x8f,0x01,0x93,0x01,0x97,0x01,0x9b,0x01,0x9f,0x01,0xa3,0x01,0xa7,0x01,0xab,0x01,0xaf,0x01,0xb3,0x01,0xb7,0x00,0x00,0x01,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15, -0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15, -0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15, -0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15, -0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15, -0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15, -0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15, -0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x02,0x1c,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x68,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0xe0, -0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xf0,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x78,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0x78,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0x3c, -0x3c,0xb4,0x3c,0xfd,0xe4,0x3c,0xf0,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0xfe,0x20,0x3c,0x01,0xa4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0xf0,0x3c,0x3c,0x3c,0xfe,0x5c,0x3c,0x3c,0x3c,0x01,0x2c,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0x01,0x2c, -0x3c,0xb4,0x3c,0x78,0x3c,0xfe,0xd4,0x3c,0x01,0x2c,0x3c,0xfe,0xd4,0x3c,0xfe,0xd4,0x3c,0x01,0x68,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0xb4,0x3c,0xfd,0xe4,0x3c,0x01,0x68,0x3c,0xfd,0xe4,0x3c,0xb4,0x3c,0x3c,0x3c,0xfe,0xd4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0x78,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c, -0xb4,0x3c,0x01,0x68,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x01,0xe0,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x78,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0x03,0xc0,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x3d,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x51,0x00,0x55, -0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99,0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0xad,0x00,0xb1,0x00,0xb5,0x00,0xb9,0x00,0xbd,0x00,0xc1,0x00,0xc5,0x00,0xc9,0x00,0xcd,0x00,0xd1,0x00,0xd5, -0x00,0xd9,0x00,0xdd,0x00,0x00,0x11,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15, -0x33,0x35,0x33,0x11,0x03,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x17,0x33,0x35,0x23, -0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23, -0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0xfe,0x98,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0xf0,0x3c,0x3c,0x78, -0x3c,0x3c,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0xfe,0x98,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0xfe,0xd4, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfa,0xd8,0x04,0x74,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f, -0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x09,0x07,0x00,0x0f,0x01,0x0f,0x03,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c, -0x59,0x58,0x8d,0x51,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01, -0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x32,0x51, -0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04, -0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d, -0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1d,0x00,0x3b,0x40,0x38,0x00,0x03, -0x04,0x02,0x04,0x03,0x02,0x80,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x02,0x00,0x00,0x02,0x59,0x06,0x01,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x17,0x16,0x15,0x14,0x10,0x1d,0x11,0x1d,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33, -0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x21,0x11,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0xfe,0xfc,0x4a,0x76,0x44,0x44,0x76,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x01,0x04, -0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x15,0x00,0x2f,0x40,0x2c,0x00,0x02,0x03,0x00,0x03,0x02,0x00,0x80,0x04,0x01,0x00,0x00,0x84,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x01,0x00,0x13,0x12,0x11,0x10,0x09,0x07,0x00, -0x0f,0x01,0x0f,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x21,0x11,0x22,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xfe,0xa3,0x01,0x04,0x4a,0x76,0x44,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36, -0x01,0x04,0x44,0x76,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1d,0x00,0x23,0x00,0x3e,0x40,0x3b,0x1f,0x14,0x02,0x00,0x04,0x01,0x4c,0x05,0x01,0x00,0x04,0x00,0x86,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x02,0x04,0x04,0x02,0x57,0x00,0x02,0x02,0x04,0x5f,0x06,0x01,0x04,0x02,0x04,0x4f,0x1e,0x1e, -0x01,0x00,0x1e,0x23,0x1e,0x23,0x1b,0x19,0x16,0x15,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x14,0x16,0x16,0x17,0x11,0x21,0x2e,0x02,0x23,0x22,0x06,0x06,0x05,0x15,0x3e,0x02,0x37,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c, -0x51,0x51,0x8c,0xfe,0xa3,0x3d,0x6a,0x44,0x01,0x1c,0x06,0x46,0x71,0x46,0x4a,0x76,0x44,0x01,0x1d,0x40,0x65,0x3f,0x06,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36,0x46,0x71,0x46,0x06,0x01,0x1c,0x44,0x6a,0x3d,0x44,0x76,0x63,0xea,0x06,0x3f,0x65,0x40,0x00,0x00,0x08,0xff,0xf6,0x00,0x32,0x02,0x62, -0x02,0x9e,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x35,0x00,0x3b,0x00,0x47,0x00,0x48,0x40,0x45,0x13,0x0e,0x04,0x03,0x01,0x00,0x43,0x3d,0x39,0x38,0x33,0x31,0x2f,0x2b,0x2a,0x22,0x21,0x1b,0x1a,0x16,0x15,0x11,0x0f,0x0b,0x05,0x13,0x02,0x01,0x44,0x3b,0x34,0x03,0x03,0x02,0x03,0x4c,0x00,0x00,0x00,0x01,0x02,0x00, -0x01,0x69,0x00,0x02,0x03,0x03,0x02,0x59,0x00,0x02,0x02,0x03,0x61,0x00,0x03,0x02,0x03,0x51,0x47,0x45,0x41,0x3f,0x24,0x21,0x04,0x06,0x18,0x2b,0x13,0x36,0x33,0x32,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x07,0x07,0x36,0x37,0x17,0x06,0x07,0x25,0x37,0x16,0x17,0x07,0x26,0x05,0x34,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26, -0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x15,0x14,0x07,0x05,0x37,0x16,0x17,0x07,0x26,0x25,0x36,0x37,0x17,0x06,0x07,0x07,0x37,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0xdb,0x25,0x2c,0x2c,0x25,0x0d,0x10,0x22,0x12,0x12,0x21,0x11,0xcb,0x29,0x4a,0x19,0x3d,0x23,0x01,0x66,0x19,0x4a,0x29,0x2c,0x23,0xfe,0x0a,0x0a, -0x30,0x04,0x04,0x04,0x04,0x30,0x0a,0x02,0x32,0x04,0x04,0x04,0x04,0x30,0x0a,0x0a,0xfd,0xc5,0x2c,0x23,0x3d,0x19,0x4a,0x01,0x69,0x3d,0x23,0x2c,0x29,0x4a,0xed,0x0d,0x11,0x21,0x12,0x12,0x22,0x10,0x0d,0x25,0x2c,0x2c,0x02,0x94,0x0a,0x0a,0x30,0x04,0x04,0x04,0x04,0x60,0x4a,0x29,0x2c,0x23,0x3d,0x60,0x2c,0x29,0x4a,0x19,0x3d,0xc0, -0x2c,0x25,0x0d,0x10,0x22,0x12,0x12,0x21,0x11,0x0d,0x25,0x18,0x11,0x21,0x12,0x12,0x22,0x10,0x0d,0x25,0x2c,0x2c,0x25,0x4b,0x19,0x3d,0x23,0x2c,0x29,0x03,0x23,0x3d,0x19,0x4a,0x29,0x1d,0x30,0x04,0x04,0x04,0x04,0x30,0x0a,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x49,0x40,0x46, -0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x08,0x01,0x04,0x02,0x03,0x04,0x02,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x29,0x27,0x20,0x2f,0x21,0x2f,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00, -0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59, -0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x37,0x59,0x35,0x35,0x59,0x37,0x39,0x59,0x33,0x35,0x59,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x3f,0x35,0x59,0x37,0x37,0x59,0x35,0x33,0x59,0x39, -0x37,0x59,0x35,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x53,0x40,0x50,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x0a,0x01,0x04,0x02,0x06,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00, -0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x31,0x30,0x21,0x20,0x11,0x10,0x01,0x00,0x39,0x37,0x30,0x3f,0x31,0x3f,0x29,0x27,0x20,0x2f,0x21,0x2f,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35, -0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a, -0x76,0x44,0x44,0x76,0x4a,0x37,0x59,0x35,0x35,0x59,0x37,0x39,0x59,0x33,0x35,0x59,0x37,0x2b,0x44,0x27,0x27,0x44,0x2b,0x2b,0x44,0x27,0x27,0x44,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x3f,0x35,0x59,0x37,0x37,0x59,0x35,0x33,0x59,0x39, -0x37,0x59,0x35,0x2f,0x27,0x44,0x2b,0x2b,0x44,0x27,0x27,0x44,0x2b,0x2b,0x44,0x27,0x00,0x02,0x00,0xb4,0x00,0xf5,0x01,0xa4,0x01,0xe5,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01, -0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0xf5,0x44,0x34,0x35,0x43,0x43, -0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x25,0x09,0x02,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03, -0x00,0x07,0x00,0x08,0xb5,0x06,0x04,0x02,0x00,0x02,0x32,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0a,0xb7,0x0a, -0x08,0x06,0x04,0x02,0x00,0x03,0x32,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x17,0x27,0x37,0x17,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0xe8,0x8d,0x8d,0x8d,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0x8d,0x8d,0x8d,0x8d,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xd0,0x00,0x07, -0x00,0x1b,0x00,0x25,0x40,0x22,0x18,0x17,0x12,0x0e,0x0d,0x06,0x05,0x02,0x01,0x09,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x13,0x03,0x06,0x17,0x2b,0x33,0x03,0x35,0x13,0x33,0x13,0x15,0x03,0x27,0x33,0x36,0x36,0x37,0x37,0x35,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07, -0x07,0x15,0x17,0x16,0x16,0xf0,0xb4,0xb4,0x7e,0xae,0xae,0x43,0x04,0x07,0x1b,0x0f,0x62,0x62,0x0f,0x1b,0x07,0x04,0x07,0x1c,0x0f,0x63,0x63,0x10,0x1b,0x01,0x44,0x47,0x01,0x45,0xfe,0xbb,0x47,0xfe,0xbc,0x3c,0x0e,0x36,0x1d,0xbb,0x1f,0xbc,0x1d,0x36,0x0e,0x0e,0x36,0x1d,0xbc,0x1f,0xbb,0x1e,0x35,0x00,0x00,0x00,0x00,0x01,0x00,0x00, -0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x02,0x58,0x3c,0x02,0x58,0xfd,0xa8,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00, -0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x00, -0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x37,0x11,0x21,0x11,0x96,0x01,0x2c,0xd2,0x01,0x2c,0xfe,0xd4,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x03, -0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x37,0x11,0x21,0x11,0x27,0x33,0x35,0x23,0x96,0x01,0x2c,0xfa,0xc8,0xc8,0xd2,0x01,0x2c,0xfe, -0xd4,0x32,0xc8,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x29,0x40,0x26,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x00,0x00,0x03,0x57,0x04,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x04,0x04,0x04,0x07,0x04,0x07,0x12,0x11,0x10,0x05,0x06,0x19,0x2b,0x25,0x21,0x11, -0x21,0x03,0x11,0x21,0x11,0x02,0x58,0xfd,0xa8,0x02,0x58,0x32,0xfe,0xfc,0x3c,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01, -0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0x04,0xfe,0xfc,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x06,0x00,0x2b,0x40,0x28,0x06,0x01, -0x02,0x00,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x03,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x04,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x02,0x58,0xfd,0xda,0x01,0xf4,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x02,0x00,0x00, -0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x06,0x00,0x2c,0x40,0x29,0x06,0x01,0x00,0x02,0x01,0x4c,0x00,0x00,0x02,0x00,0x86,0x03,0x01,0x01,0x02,0x02,0x01,0x57,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x04,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x05,0x21,0x11,0x02, -0x58,0xfd,0xa8,0x02,0x26,0xfe,0x0c,0x02,0x94,0xfd,0xa8,0x02,0x58,0x32,0xfe,0x0c,0x00,0x03,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x31,0x40,0x2e,0x00,0x00,0x04,0x01,0x03,0x02,0x00,0x03,0x67,0x05,0x01,0x02,0x01,0x01,0x02,0x57,0x05,0x01,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f, -0x00,0x00,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x33,0x11,0x23,0x21,0x23,0x11,0x33,0x02,0x58,0xfd,0xda,0xe1,0xe1,0x01,0xf4,0xe1,0xe1,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x01,0xff,0xf6,0x00,0x3c,0x02,0x62,0x02,0x9e,0x00,0x02, -0x00,0x15,0x40,0x12,0x01,0x01,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x06,0x16,0x2b,0x27,0x01,0x01,0x0a,0x01,0x36,0x01,0x36,0x3c,0x02,0x62,0xfd,0x9e,0x00,0x01,0x00,0x00,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x35,0x11,0x01,0x02,0x62,0x32,0x02,0x6c, -0xfe,0xca,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x94,0x00,0x02,0x00,0x0a,0xb7,0x00,0x00,0x00,0x76,0x11,0x01,0x06,0x17,0x2b,0x25,0x01,0x21,0x01,0x2c,0xfe,0xca,0x02,0x6c,0x32,0x02,0x62,0x00,0x01,0xff,0xf6,0x00,0x31,0x02,0x58,0x02,0x9e,0x00,0x02,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x25,0x01,0x01,0x02, -0x58,0xfd,0x9e,0x02,0x62,0x31,0x01,0x37,0x01,0x36,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x3c,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x24,0x40,0x21,0x05,0x01,0x02,0x01,0x4a,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x04,0x03,0x00,0x02,0x00,0x02,0x03,0x06,0x16,0x2b, -0x27,0x01,0x01,0x25,0x21,0x03,0x0a,0x01,0x36,0x01,0x36,0xfd,0xe7,0x01,0xc6,0xe3,0x3c,0x02,0x62,0xfd,0x9e,0x32,0x01,0xbf,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x35,0x11,0x01,0x05,0x25,0x25,0x02,0x62,0xfd,0xd0,0x01,0xc0,0xfe,0x40,0x32,0x02, -0x6c,0xfe,0xca,0xe3,0xe3,0xe3,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x94,0x00,0x02,0x00,0x05,0x00,0x18,0x40,0x15,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x25,0x01,0x21,0x01,0x13,0x21,0x01,0x2c,0xfe,0xca,0x02,0x6c,0xfe,0xca,0xe3,0xfe, -0x3a,0x32,0x02,0x62,0xfe,0x0f,0x01,0xbf,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x58,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02,0x00,0x02,0x32,0x2b,0x25,0x01,0x01,0x03,0x11,0x05,0x02,0x58,0xfd,0x9e,0x02,0x62,0x32,0xfe,0x40,0x32,0x01,0x36,0x01,0x36,0xfd,0xe7,0x01,0xc6,0xe3,0x00,0x00,0x00,0x00,0x01,0x00,0x00, -0x00,0xd2,0x02,0x62,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x35,0x11,0x05,0x02,0x62,0xd2,0x01,0x2c,0x96,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0xd2,0x02,0x58,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x2d,0x02,0x02,0x58,0xfd,0x9e,0x02,0x62,0xd2,0x96,0x96,0x00,0x00,0x02,0x00,0x00, -0x00,0xd2,0x02,0x62,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x35,0x11,0x05,0x05,0x25,0x25,0x02,0x62,0xfd,0xd0,0x01,0x8e,0xfe,0x72,0xd2,0x01,0x2c,0x96,0x56,0x56,0x56,0x00,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0xd2,0x02,0x58,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02, -0x00,0x02,0x32,0x2b,0x2d,0x02,0x07,0x35,0x05,0x02,0x58,0xfd,0x9e,0x02,0x62,0x32,0xfe,0x72,0xd2,0x96,0x96,0xec,0xac,0x56,0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xc2,0x02,0x08,0x00,0x02,0x00,0x15,0x40,0x12,0x01,0x01,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x06,0x16,0x2b,0x37,0x13,0x13,0x96,0x96, -0x96,0xd2,0x01,0x36,0xfe,0xca,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xcc,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x37,0x11,0x05,0x96,0x01,0x36,0xd2,0x01,0x2c,0x96,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0xc8,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x0f,0x40,0x0c,0x02,0x01,0x00,0x49,0x00,0x00,0x00,0x76, -0x10,0x01,0x06,0x17,0x2b,0x13,0x21,0x03,0x96,0x01,0x2c,0x96,0x01,0xfe,0xfe,0xca,0x00,0x01,0x00,0x8c,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x01,0x11,0x25,0x01,0xc2,0xfe,0xca,0x01,0xfe,0xfe,0xd4,0x96,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xc2,0x02,0x08,0x00,0x02,0x00,0x05,0x00,0x24, -0x40,0x21,0x05,0x01,0x02,0x01,0x4a,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x04,0x03,0x00,0x02,0x00,0x02,0x03,0x06,0x16,0x2b,0x37,0x13,0x13,0x27,0x33,0x27,0x96,0x96,0x96,0xec,0xac,0x56,0xd2,0x01,0x36,0xfe,0xca,0x28,0xb2,0x00,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xcc, -0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x37,0x11,0x05,0x05,0x37,0x27,0x96,0x01,0x36,0xfe,0xf2,0xb2,0xb2,0xd2,0x01,0x2c,0x96,0x56,0x56,0x56,0x00,0x02,0x00,0x96,0x00,0xc8,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x18,0x40,0x15,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01, -0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x25,0x03,0x21,0x07,0x37,0x23,0x01,0x2c,0x96,0x01,0x2c,0x96,0x56,0xac,0xc8,0x01,0x36,0xda,0xb2,0x00,0x00,0x02,0x00,0x8c,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02,0x00,0x02,0x32,0x2b,0x2d,0x02,0x07,0x35,0x07,0x01,0xc2,0xfe, -0xca,0x01,0x36,0x28,0xb2,0xd2,0x96,0x96,0xec,0xac,0x56,0x00,0x00,0x03,0xff,0xec,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x45,0x40,0x42,0x0a,0x07,0x09,0x03,0x04,0x03,0x04,0x86,0x00,0x00,0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x06,0x01,0x02,0x03,0x03,0x02,0x57,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01, -0x03,0x02,0x03,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x01,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x14,0x02,0x80,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0xd4,0xaa,0x01,0x0e, -0x01,0xa4,0x64,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x02,0x6c,0x64,0xfd,0x30,0x00,0x02,0xff,0xec,0xfe,0x70,0x01,0xc2,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x07,0x05,0x06,0x03,0x02,0x03,0x02,0x86,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x04,0x03,0x03,0x04,0x57,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x04, -0x03,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x01,0x11,0x21,0x35,0x21,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x01,0x5e,0xfe,0x8e,0x01,0xd6,0xfe,0xd4,0xaa,0x01,0x0e,0xfe,0x70,0x03,0x34,0x64,0xfc,0x68,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x02,0x00,0x96, -0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x07,0x05,0x06,0x03,0x02,0x04,0x02,0x86,0x00,0x00,0x00,0x01,0x03,0x00,0x01,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11, -0x08,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0x96,0x01,0xd6,0xfe,0x8e,0x64,0x01,0x0e,0xaa,0xfe,0x70,0x03,0x98,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0x00,0xdc,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02, -0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x14,0x02,0x80,0xfd,0x80,0x02,0x80,0x01,0xa4,0x64,0x64,0xc8,0x64,0x64,0x00,0x00,0x00, -0x00,0x03,0xff,0xec,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x43,0x40,0x40,0x04,0x01,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x09,0x05,0x08,0x03,0x02,0x06,0x01,0x02,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0a,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c, -0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0b,0x06,0x18,0x2b,0x01,0x11,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x33,0x11,0x05,0x35,0x21,0x15,0x01,0x5e,0x64,0xaa,0xfd,0x80,0xaa,0x64,0xfe,0xf2,0x02,0x80,0x01,0xa4,0x02,0xbc,0xfd,0xa8,0x64,0x64,0x02,0x58,0xfd,0x44,0xc8,0x64,0x64, -0x00,0x02,0xff,0xec,0x00,0xdc,0x01,0xc2,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x04,0x01,0x01,0x03,0x01,0x85,0x00,0x03,0x07,0x01,0x05,0x00,0x03,0x05,0x67,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x06,0x01,0x02,0x00,0x02,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05, -0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x27,0x35,0x21,0x11,0x33,0x11,0x25,0x35,0x33,0x11,0x33,0x11,0x14,0x01,0x72,0x64,0xfe,0x2a,0xaa,0x64,0xdc,0x64,0x03,0x20,0xfc,0x7c,0xc8,0x64,0x02,0x58,0xfd,0x44,0x00,0x02,0x00,0x96,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x03,0x01,0x00,0x04,0x00,0x85, -0x00,0x04,0x07,0x01,0x05,0x01,0x04,0x05,0x67,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x06,0x01,0x02,0x01,0x02,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x37,0x11,0x33,0x11,0x21,0x15,0x25,0x11,0x33,0x11,0x33,0x15,0x96,0x64,0x01,0x72, -0xfe,0xf2,0x64,0xaa,0xdc,0x03,0x84,0xfc,0xe0,0x64,0xc8,0x02,0xbc,0xfd,0xa8,0x64,0x00,0x02,0x00,0x96,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06, -0x17,0x2b,0x01,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x5e,0x64,0xfe,0xd4,0x64,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x04,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x59,0x40,0x56,0x03,0x01,0x01,0x00,0x01,0x85,0x0f,0x0b,0x0e,0x03,0x08,0x07,0x08,0x86, -0x04,0x01,0x00,0x0d,0x05,0x0c,0x03,0x02,0x06,0x00,0x02,0x67,0x0a,0x01,0x06,0x07,0x07,0x06,0x57,0x0a,0x01,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x12,0x12,0x0c,0x0c,0x06,0x06,0x00,0x00,0x12,0x17,0x12,0x17,0x16,0x15,0x14,0x13,0x0c,0x11,0x0c,0x11,0x10,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00, -0x05,0x00,0x05,0x11,0x11,0x10,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x14,0xaa,0x64,0x64,0x64,0xaa,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0xd4,0xaa,0x01,0x0e,0x01,0xa4,0x64,0x02,0x58,0xfd,0x44,0x02,0xbc,0xfd,0xa8,0x64,0xfc,0xcc,0x02, -0xd0,0x64,0xfd,0x94,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x03,0xff,0xec,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x48,0x40,0x45,0x03,0x01,0x00,0x02,0x00,0x85,0x0a,0x07,0x08,0x03,0x01,0x05,0x01,0x86,0x00,0x02,0x09,0x01,0x04,0x06,0x02,0x04,0x67,0x00,0x06,0x05,0x05,0x06,0x57,0x00,0x06,0x06, -0x05,0x5f,0x00,0x05,0x06,0x05,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x01,0x11,0x33,0x11,0x01,0x35,0x33,0x11,0x33,0x11,0x03,0x11,0x23,0x35,0x21,0x11,0x01,0x5e,0x64,0xfe,0x2a,0xaa,0x64,0x64,0xaa,0x01, -0x0e,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x03,0x34,0x64,0x02,0x58,0xfd,0x44,0xfc,0xcc,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x03,0x00,0x96,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x48,0x40,0x45,0x02,0x01,0x00,0x03,0x00,0x85,0x0a,0x07,0x08,0x03,0x01,0x06,0x01,0x86,0x00,0x03,0x09,0x01,0x04,0x05, -0x03,0x04,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x05,0x06,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x13,0x11,0x33,0x11,0x33,0x15,0x01,0x11,0x21,0x15, -0x23,0x11,0x96,0x64,0x64,0x64,0xaa,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x03,0x34,0x02,0xbc,0xfd,0xa8,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x0b,0x00,0x2a,0x40,0x27,0x06,0x05,0x02,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01, -0x00,0x5f,0x04,0x02,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0x02,0x80,0xaa,0x64,0x64,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0xc2, -0x01,0xa4,0x00,0x09,0x00,0x28,0x40,0x25,0x05,0x04,0x02,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0x01,0xd6,0x64,0x64,0xfe,0x70, -0x02,0xd0,0x64,0xfc,0xcc,0x02,0xd0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x09,0x00,0x28,0x40,0x25,0x05,0x04,0x02,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06, -0x1a,0x2b,0x13,0x11,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0x01,0xd6,0xaa,0x64,0x64,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00, -0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0x02,0x80,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00, -0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0xc8,0xdc,0x01,0xa4,0xfe,0x70,0x02,0xd0,0x64,0xfc,0xcc,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x03,0xfc,0x00,0x09,0x00,0x2d,0x40,0x2a, -0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xfe,0x70,0x02,0xd0,0x64, -0x02,0x58,0xfd,0xa8,0xfc,0xcc,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x11, -0xc8,0x01,0xa4,0xdc,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x01,0x00,0x01,0x85,0x05,0x01,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11, -0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x03,0x34,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03, -0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd, -0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x11, -0xfa,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06, -0x18,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0x9e,0xc8,0xfc,0x9a,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f, -0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfc,0xae,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01, -0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0xfe,0x70,0x03,0x66,0xc8,0xfd,0x62,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29, -0x00,0x01,0x02,0x01,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x5f,0x03,0x01,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0x32,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0x03,0x52, -0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11, -0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x0b,0x00,0x39,0x40,0x36,0x07,0x01,0x05,0x02,0x05,0x86, -0x00,0x00,0x06,0x01,0x01,0x03,0x00,0x01,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x04,0x01,0x02,0x03,0x02,0x4f,0x04,0x04,0x00,0x00,0x04,0x0b,0x04,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x01,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x02,0x80, -0xfe,0x8e,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0x01,0xa4,0x64,0x64,0xfc,0xcc,0x02,0x6c,0x64,0x64,0xfd,0x94,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x02,0x08,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01, -0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0xfc,0x68,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x03, -0x04,0x86,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x03,0x98,0x64, -0x64,0x64,0xfd,0x94,0x00,0x02,0x00,0x4b,0x01,0x0e,0x02,0x0d,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x35, -0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x77,0x96,0xfe,0x3e,0x96,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0x00,0x00,0x00,0x02,0x00,0xc8,0xff,0x6f,0x01,0x90,0x03,0x69,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04, -0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xc8,0xc8,0xc8,0xc8,0x01,0xcc,0x01,0x9d,0xfe,0x63,0xfd,0xa3,0x01,0x9f,0xfe,0x61,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x01,0xa4,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, -0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0xfe,0x70,0x03,0x34,0xfc,0xcc,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00, -0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0x02,0x80,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01, -0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0xc8,0xdc,0x01,0xa4,0xfe,0x70,0x02,0x9e,0xc8,0xfc,0x9a,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01, -0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x11,0xc8,0x01,0xa4,0xdc,0xfe,0x70,0x03,0x66,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b, -0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x02,0x80,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x5e,0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, -0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x01,0x72,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00, -0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x15,0x21,0x15,0x21,0x15,0x14,0x01,0x72,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xc8,0x32,0x64,0x32,0x00,0x00,0x04,0x00,0x19,0x01,0x0e,0x02,0x3f,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x42, -0x40,0x3f,0x06,0x04,0x02,0x03,0x00,0x01,0x01,0x00,0x57,0x06,0x04,0x02,0x03,0x00,0x00,0x01,0x5f,0x0b,0x07,0x0a,0x05,0x09,0x03,0x08,0x07,0x01,0x00,0x01,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06, -0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0xdb,0x64,0xfd,0xda,0x64,0x32,0x64,0x32,0x64,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x00,0x00,0x00,0x04,0x00,0xc8,0xff,0x3d,0x01,0x90,0x03,0xa7,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00, -0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07, -0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x02,0xd0,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0x01,0x0e,0x02,0x6c, -0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0xfa,0x01,0x72,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x03,0x00,0x25,0x01,0x0e,0x02,0x33,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x0b, -0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15, -0x33,0x35,0x33,0x15,0x01,0xb5,0x7e,0xfd,0xf2,0x7e,0x4a,0x7e,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x00,0x03,0x00,0xc8,0xff,0x25,0x01,0x90,0x03,0xaa,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x07,0x01,0x03,0x04,0x03,0x85,0x00,0x04, -0x05,0x04,0x85,0x08,0x01,0x05,0x05,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x02,0x64,0x01,0x46,0xfe,0xba,0xfe,0x52,0x01,0x65,0xfe, -0x9b,0xfe,0x6f,0x01,0x46,0xfe,0xba,0x00,0x00,0x01,0x00,0xc8,0x01,0x40,0x01,0x90,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0x01,0x40,0x03,0x20,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0xff,0xec, -0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xdc,0xc8,0xdc,0x01,0x0e,0xc8, -0x02,0x8a,0xfd,0x76,0xc8,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x90,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11, -0x14,0xdc,0xc8,0x01,0x0e,0xc8,0x02,0x8a,0xfc,0xae,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x11,0x33,0x11,0x23, -0x11,0xfa,0x32,0xc8,0x32,0xfe,0x70,0x02,0xd0,0x03,0x20,0xfc,0xe0,0xfd,0x30,0x00,0x00,0x01,0x00,0xc8,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06, -0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0xc8,0xc8,0xdc,0x01,0x0e,0x03,0x52,0xfd,0x76,0xc8,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0xfe, -0x70,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11, -0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00, -0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0xc8,0xdc,0xdc,0xc8,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07, -0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xc8,0xdc,0xdc,0xfe,0x70,0x05,0xf0,0xfd,0x76,0xc8,0xfd, -0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x37,0x40,0x34,0x00,0x02,0x01,0x02,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x03,0x01,0x01,0x04,0x00,0x01,0x57,0x00,0x04,0x00,0x05,0x00,0x04,0x05,0x67,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11, -0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x15,0x33,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0x32,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00, -0x04,0x86,0x00,0x01,0x02,0x00,0x01,0x57,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8, -0x32,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x04,0x00,0x57,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b, -0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00, -0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0xfd,0x30, -0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35, -0x33,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0xdc,0x01,0xa4,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x32,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f, -0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xc8,0xdc,0xdc,0xc8,0xdc,0x01,0x0e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x03,0x02, -0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc, -0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x36,0x40,0x33,0x00,0x02,0x01,0x02,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x05,0x01,0x00,0x01,0x00,0x4f, -0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xdc,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x0d, -0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x21,0x24,0x04,0x06,0x18,0x2b,0x13,0x11,0x34,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x11,0xfa,0x3a,0x69,0x48,0x23,0x23,0x66,0x96,0x53,0xfe,0x70,0x01, -0xe0,0x49,0x6c,0x3b,0x64,0x54,0x99,0x67,0xfe,0x20,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x0d,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x59,0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x21,0x24,0x04,0x06,0x18,0x2b,0x13,0x11, -0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x11,0xfa,0x53,0x97,0x65,0x23,0x23,0x47,0x6a,0x3a,0xfe,0x70,0x01,0xe0,0x67,0x99,0x54,0x64,0x3b,0x6c,0x49,0xfe,0x20,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x0d,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x59,0x00, -0x00,0x00,0x02,0x61,0x03,0x01,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x0d,0x00,0x0c,0x14,0x21,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x32,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x14,0x23,0x48,0x69,0x3a,0x64,0x53,0x96,0x66,0x01,0x40,0x64,0x3b,0x6c,0x49,0x01,0xcc,0xfe,0x34,0x67,0x99,0x54,0x00,0x00,0x00,0x01,0x00,0xfa, -0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x26,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0c,0x0a,0x06,0x05,0x00,0x0d,0x01,0x0d,0x04,0x06,0x16,0x2b,0x01,0x22,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x16,0x33,0x33,0x15,0x02,0x49, -0x65,0x97,0x53,0x64,0x3a,0x6a,0x47,0x23,0x01,0x40,0x54,0x99,0x67,0x01,0xcc,0xfe,0x34,0x49,0x6c,0x3b,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x0f,0x00,0x28,0x40,0x25,0x0e,0x0b,0x0a,0x09,0x06,0x03,0x02,0x01,0x08,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x04,0x03,0x02,0x02,0x02, -0x76,0x00,0x00,0x00,0x0f,0x00,0x0f,0x14,0x12,0x14,0x05,0x06,0x19,0x2b,0x07,0x35,0x01,0x01,0x35,0x33,0x13,0x13,0x33,0x15,0x01,0x01,0x15,0x23,0x03,0x03,0x14,0x01,0x0d,0xfe,0xf3,0x50,0xf0,0xf0,0x50,0xfe,0xf3,0x01,0x0d,0x50,0xf0,0xf0,0xa0,0x28,0x01,0xe0,0x01,0xe0,0x28,0xfe,0x57,0x01,0xa9,0x28,0xfe,0x20,0xfe,0x20,0x28,0x01, -0xa9,0xfe,0x57,0x00,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x05,0x01,0x35,0x33,0x01,0x15,0x02,0x1c,0xfd,0xd0,0x50,0x02,0x30,0xa0,0x03,0xe8, -0x28,0xfc,0x18,0x28,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x07,0x35,0x01,0x33,0x15,0x01,0x14,0x02,0x30,0x50,0xfd,0xd0,0xa0,0x28,0x03,0xe8, -0x28,0xfc,0x18,0x00,0x00,0x02,0x00,0x46,0x01,0x40,0x02,0x12,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x35, -0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x72,0xa0,0xfe,0x34,0xa0,0x01,0x40,0x64,0x64,0x64,0x64,0x00,0x00,0x00,0x02,0x00,0xfa,0xff,0x5b,0x01,0x5e,0x03,0x7d,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04, -0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xfa,0x64,0x64,0x64,0x01,0xb8,0x01,0xc5,0xfe,0x3b,0xfd,0xa3,0x01,0xc7,0xfe,0x39,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, -0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0xfe,0x70,0x03,0x34,0xfc,0xcc,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00, -0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01, -0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0xd0,0x64,0xfc,0xcc,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01, -0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b, -0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x02,0x80,0x01,0x40,0x64,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, -0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x01,0x72,0x01,0x40,0x64,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02, -0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x35,0x21,0x35,0x21,0x35,0x21,0x15,0xfa,0xfe,0xf2,0x01,0x0e,0x01,0x72,0x01,0x0e,0x32,0x64,0x32,0xc8,0x00,0x00,0x04,0x00,0x19,0x01,0x40,0x02,0x3f,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x42, -0x40,0x3f,0x06,0x04,0x02,0x03,0x00,0x01,0x01,0x00,0x57,0x06,0x04,0x02,0x03,0x00,0x00,0x01,0x5f,0x0b,0x07,0x0a,0x05,0x09,0x03,0x08,0x07,0x01,0x00,0x01,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06, -0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0xdb,0x64,0xfd,0xda,0x64,0x32,0x64,0x32,0x64,0x01,0x40,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x00,0x00,0x00,0x04,0x00,0xfa,0xff,0x3d,0x01,0x5e,0x03,0xa7,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00, -0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07, -0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0xfa,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x02,0xd0,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x02,0x6c, -0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0xfa,0x01,0x72,0x01,0x40,0x64,0x64,0x00,0x00,0x03,0x00,0x25,0x01,0x40,0x02,0x33,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x0b, -0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15, -0x33,0x35,0x33,0x15,0x01,0xb5,0x7e,0xfd,0xf2,0x7e,0x4a,0x7e,0x01,0x40,0x64,0x64,0x64,0x64,0x64,0x64,0x00,0x03,0x00,0xfa,0xff,0x25,0x01,0x5e,0x03,0xaa,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x07,0x01,0x03,0x04,0x03,0x85,0x00,0x04, -0x05,0x04,0x85,0x08,0x01,0x05,0x05,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xfa,0x64,0x64,0x64,0x64,0x64,0x02,0x58,0x01,0x52,0xfe,0xae,0xfe,0x69,0x01,0x4e,0xfe, -0xb2,0xfe,0x64,0x01,0x51,0xfe,0xaf,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0x01,0x40,0x03,0x20,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0x00,0xc8, -0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0xc8,0x32,0x64,0x32,0xfe,0x70,0x03,0x34,0x02,0xbc,0xfd,0x44,0xfc,0xcc,0x00, -0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x14,0x01,0x0e, -0x64,0x01,0x0e,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35, -0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0x64,0x01,0x40,0x64,0x02,0xbc,0xfc,0xe0,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06, -0x18,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0xfa,0x64,0x01,0x0e,0x01,0x40,0x03,0x20,0xfd,0x44,0x64,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0xfe, -0x70,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11, -0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03, -0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfa,0x10,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c, -0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70, -0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x37,0x40,0x34,0x00,0x03,0x02,0x03,0x85,0x07,0x01,0x06,0x05,0x06,0x86,0x04,0x01,0x02,0x01,0x05,0x02,0x57,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x05,0x5f,0x00,0x05,0x02,0x05,0x4f,0x00,0x00,0x00, -0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x33,0x35,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0xdc,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x32,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b, -0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x01,0x72,0xfe,0xf2,0xfe, -0x70,0x02,0xd0,0x64,0x32,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11, -0x06,0x06,0x1a,0x2b,0x13,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0x01,0x0e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x03,0x02,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x01,0x04,0x03, -0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd, -0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x02,0x00,0x01,0x57,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b, -0x13,0x11,0x23,0x35,0x21,0x15,0x33,0x15,0x23,0x11,0xc8,0xdc,0x01,0xa4,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x32,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x04,0x00,0x57,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00, -0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x14,0xdc,0xc8,0xdc,0xdc,0x01,0x0e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31, -0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc, -0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x36,0x40,0x33,0x00,0x03,0x04,0x03,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x00,0x04,0x02,0x00,0x04,0x57,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x00,0x5f,0x05,0x01, -0x00,0x04,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0x32,0xdc,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c, -0x04,0x60,0x00,0x0b,0x00,0x2c,0x40,0x29,0x03,0x01,0x01,0x00,0x01,0x85,0x04,0x02,0x02,0x00,0x05,0x05,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xaa, -0x64,0x64,0x64,0xaa,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0xc2,0x04,0x60,0x00,0x09,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x04,0x04,0x00,0x57,0x02,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11, -0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x14,0xaa,0x64,0x64,0x64,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x29,0x40,0x26,0x02,0x01,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x04,0x04,0x01, -0x57,0x03,0x01,0x01,0x01,0x04,0x5f,0x05,0x01,0x04,0x01,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x96,0x64,0x64,0x64,0xaa,0x01,0x40,0x03,0x20,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c, -0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21, -0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f, -0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xdc,0xc8,0xdc,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00, -0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0x32,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfc,0xe0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec, -0x01,0x40,0x01,0x90,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x14,0xdc,0xc8,0x01,0x40,0x64,0x02,0xbc,0xfc,0xe0,0x00,0x00, -0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x01,0x02,0x01,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x5f,0x03,0x01,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x11,0x33,0x11, -0x33,0x15,0x21,0x11,0xfa,0x32,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x03,0x20,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00, -0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0xc8,0xc8,0xdc,0x01,0x40,0x03,0x20,0xfd,0x44,0x64,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01, -0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec, -0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0x01, -0x0e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06, -0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xfc,0x9a,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x5e,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f, -0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0x64,0x01,0x0e,0xc8,0x02,0x8a,0xfc,0xae,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x01,0x00,0x01,0x85,0x05,0x01,0x04,0x03,0x04,0x86,0x02, -0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x03,0x66,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x01,0x00,0xfa, -0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0xfa,0x64,0x01,0x0e,0x01,0x0e,0x03,0x52,0xfd,0x76,0xc8,0x00, -0x00,0x02,0xff,0xec,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x0b,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07, -0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x05,0x35,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0xfd,0x80,0x02,0x80,0x01,0xa4,0x64,0x02,0x58,0xfd,0xa8,0x64,0xc8,0x64,0x64,0x00,0x01,0xff,0xec,0x00,0xdc,0x01,0x5e,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x03,0x02,0x03,0x85,0x00,0x02,0x00, -0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x04,0x04,0x00,0x57,0x00,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x27,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0x64,0xdc,0x64,0x64,0x64,0x02,0x58,0xfc,0x7c,0x00,0x00, -0x00,0x01,0x00,0xfa,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x37,0x11,0x33,0x11, -0x21,0x15,0x21,0x15,0x21,0x15,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xdc,0x03,0x84,0xfd,0xa8,0x64,0x64,0x64,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x13,0x00,0x38,0x40,0x35,0x04,0x01,0x02,0x01,0x02,0x85,0x0a,0x09,0x02,0x07,0x00,0x07,0x86,0x05,0x03,0x02,0x01,0x00,0x00,0x01,0x57,0x05,0x03,0x02, -0x01,0x01,0x00,0x5f,0x08,0x06,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0xaa,0x64,0x64,0x64,0xaa,0xaa,0x64,0x64,0xfe,0x70,0x02,0xd0, -0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x02,0xff,0xec,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x07,0x00,0x0b,0x00,0x35,0x40,0x32,0x04,0x01,0x02,0x01,0x02,0x85,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f, -0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x96,0xaa,0xaa,0x64,0x64,0x64,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfa,0x10,0x05,0xf0,0xfa,0x10,0x00,0x02,0x00,0x96,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07, -0x00,0x0b,0x00,0x35,0x40,0x32,0x04,0x01,0x00,0x01,0x00,0x85,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x01,0x11,0x33,0x11,0x33,0x15,0x23, -0x11,0x21,0x11,0x33,0x11,0x01,0x5e,0x64,0xaa,0xaa,0xfe,0xd4,0x64,0xfe,0x70,0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01, -0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90, -0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0xc8,0xdc,0xdc,0xc8,0xfe,0x70,0x02,0xd0, -0x64,0x02,0xbc,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b, -0x13,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xc8,0xdc,0xdc,0xfe,0x70,0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f, -0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e, -0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70, -0x02,0x9e,0xc8,0x02,0x8a,0xfa,0x10,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b, -0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x05,0xf0,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x13,0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01, -0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x0e, -0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0x02,0x58,0xfd,0xa8,0x64,0x64,0x64,0xfd,0x94,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00, -0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0x02,0x58,0xfa,0x10,0x00, -0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06, -0x1b,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x05,0xf0,0xfd,0xa8,0x64,0x64,0x64,0xfd,0x94,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x00,0x02,0x03,0x01,0x01,0x00,0x02,0x01,0x67,0x04,0x01,0x00, -0x05,0x05,0x00,0x57,0x04,0x01,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x31,0x35,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x15,0x01,0x13,0xfe,0xed,0x02,0x58,0xfe,0xed,0x01,0x13,0x2d,0x02,0x80,0x2d,0x2d,0xfd,0x80,0x2d,0x00,0x00,0x00, -0x00,0x02,0x00,0x44,0xff,0xf5,0x02,0x2e,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x4d,0x40,0x4a,0x11,0x0e,0x0a,0x03,0x04,0x05,0x01,0x4c,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x07,0x01,0x04,0x03,0x00,0x04,0x59,0x07,0x01,0x04,0x04,0x00,0x61,0x06, -0x01,0x00,0x04,0x00,0x51,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0d,0x0c,0x08,0x06,0x00,0x14,0x01,0x14,0x08,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16, -0xf9,0x50,0x65,0x65,0x50,0x45,0x59,0x05,0x02,0x36,0x53,0x65,0x6c,0x55,0x3c,0x01,0x06,0x59,0x3f,0x2c,0x34,0x34,0x2c,0x2c,0x34,0x34,0x0b,0x67,0x57,0xbf,0x57,0x67,0x58,0x48,0x96,0xfe,0xf5,0xfe,0xe5,0xa6,0x50,0x61,0x4e,0x3c,0x34,0xbf,0x34,0x3c,0x3c,0x34,0xbf,0x34,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x44,0xff,0x5b,0x02,0x2e, -0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x26,0x00,0x5d,0x40,0x5a,0x11,0x0e,0x0a,0x03,0x04,0x05,0x01,0x4c,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x09,0x01,0x04,0x08,0x01,0x00,0x06,0x04,0x00,0x69,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07, -0x5f,0x0a,0x01,0x07,0x06,0x07,0x4f,0x23,0x23,0x16,0x15,0x01,0x00,0x23,0x26,0x23,0x26,0x25,0x24,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0d,0x0c,0x08,0x06,0x00,0x14,0x01,0x14,0x0b,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x06,0x06,0x27,0x32,0x36,0x35, -0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x07,0x35,0x21,0x15,0xf9,0x50,0x65,0x65,0x50,0x45,0x59,0x05,0x02,0x36,0x53,0x65,0x6c,0x55,0x3c,0x01,0x06,0x59,0x3f,0x2c,0x34,0x34,0x2c,0x2c,0x34,0x34,0x87,0x01,0xe0,0x0b,0x67,0x57,0xbf,0x57,0x67,0x58,0x48,0x96,0xfe,0xf5,0xfe,0xe5,0xa6,0x50,0x61,0x4e,0x3c,0x34,0xbf,0x34, -0x3c,0x3c,0x34,0xbf,0x34,0x3c,0xe8,0x4b,0x4b,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x92,0x02,0x1c,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b, -0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x35,0x33,0x03,0x33,0x13,0x33,0x15,0x23,0x13,0x23,0x03,0x3c,0xbd,0xae,0x5f,0xae,0xc4,0xa6,0x97,0x5f,0x97,0x01,0x22,0x50,0x01,0xcc,0xfe,0x34,0x50,0xfe,0x70,0x01,0x90,0x00,0xff,0xff,0xff,0xf6,0xff,0x92,0x02,0x62,0x03,0x3e,0x02,0x26,0x03,0x3e,0x00,0x00,0x00,0x06,0x04,0xbb, -0x00,0x00,0x00,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x27,0x00,0x37,0x00,0x4d,0x40,0x4a,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x04,0x04,0x06,0x59,0x0b,0x01,0x06,0x06,0x04,0x61,0x0a,0x01,0x04,0x06,0x04, -0x51,0x29,0x28,0x19,0x18,0x0d,0x0c,0x01,0x00,0x31,0x2f,0x28,0x37,0x29,0x37,0x21,0x1f,0x18,0x27,0x19,0x27,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26, -0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x52,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76, -0x4a,0x4a,0x76,0x44,0x44,0x76,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x01,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f, -0x00,0x1f,0x00,0x2b,0x00,0x37,0x00,0x53,0x40,0x50,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x0a,0x01,0x04,0x02,0x06,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x2d,0x2c,0x21,0x20,0x11,0x10,0x01,0x00,0x33, -0x31,0x2c,0x37,0x2d,0x37,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34, -0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x36,0x49,0x49,0x36,0x36,0x49,0x49,0x36,0x23,0x2e,0x2e,0x23,0x22,0x2f,0x2f,0x32,0x51,0x8d,0x58, -0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x85,0x49,0x36,0x36,0x49,0x49,0x36,0x36,0x49,0x2e,0x2f,0x22,0x23,0x2e,0x2e,0x23,0x22,0x2f,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x29,0x00,0x4b,0x40,0x48,0x24,0x01,0x04,0x03, -0x29,0x28,0x27,0x21,0x04,0x02,0x04,0x02,0x4c,0x05,0x01,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x26,0x25,0x23,0x22,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01, -0x0f,0x08,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44, -0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x01,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x95,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43,0x00,0x03,0xff,0xf6,0xff,0x92,0x02,0x62,0x03,0x3e,0x00,0x15, -0x00,0x1e,0x00,0x27,0x00,0x24,0x40,0x21,0x24,0x23,0x1b,0x1a,0x14,0x0c,0x09,0x01,0x08,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x15,0x00,0x15,0x1a,0x03,0x06,0x17,0x2b,0x05,0x35,0x2e,0x02,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x1e,0x02,0x15,0x14,0x06,0x06,0x07,0x15,0x01,0x14, -0x16,0x16,0x17,0x11,0x0e,0x02,0x05,0x34,0x26,0x26,0x27,0x11,0x3e,0x02,0x01,0x13,0x52,0x81,0x4a,0x4a,0x81,0x52,0x32,0x52,0x81,0x4a,0x4a,0x81,0x52,0xfe,0xe3,0x3d,0x6a,0x44,0x44,0x6a,0x3d,0x02,0x08,0x3d,0x6a,0x44,0x44,0x6a,0x3d,0x6e,0xa1,0x06,0x53,0x88,0x54,0x54,0x88,0x53,0x06,0xa1,0xa1,0x06,0x53,0x88,0x54,0x54,0x88,0x53, -0x06,0xa1,0x01,0xd6,0x46,0x71,0x46,0x06,0x02,0x06,0x06,0x46,0x71,0x46,0x46,0x71,0x46,0x06,0xfd,0xfa,0x06,0x46,0x71,0x00,0x00,0x03,0xff,0xf6,0xff,0x5b,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x07,0x01,0x02,0x06,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04, -0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x20,0x20,0x11,0x10,0x01,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35, -0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x03,0x35,0x21,0x15,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0xce,0x02,0x30,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44, -0x76,0x4a,0x4a,0x76,0x44,0xfe,0xf7,0x4b,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x68,0x01,0xcc,0x02,0x26,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x30,0x00,0x02,0x01,0x03,0x01,0x02,0x03,0x80,0x05,0x01,0x03,0x03,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x04,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00, -0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x13,0x33,0x03,0x8c,0x01,0x40,0xfe,0xd9,0x50,0x82,0x82,0x01,0xdb,0x4b,0x4b,0xfe,0x8d,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0x00,0x04,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x24,0x00,0x42, -0x40,0x3f,0x09,0x01,0x05,0x06,0x05,0x86,0x03,0x01,0x01,0x08,0x02,0x07,0x03,0x00,0x04,0x01,0x00,0x69,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x00,0x06,0x04,0x06,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x21,0x20,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0a,0x06, -0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x03,0x21,0x03,0x27,0x36,0x36,0x37,0x13,0x21,0x13,0x16,0x16,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xc1,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xca,0xbc,0x01,0xf4,0xbd,0x3c,0x04,0x13,0x0d, -0x65,0xfe,0xec,0x69,0x0d,0x11,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfc,0xcf,0x02,0xda,0xfd,0x26,0x46,0x17,0x59,0x34,0x01,0xa0,0xfe,0x5f,0x34,0x58,0x00,0x03,0x00,0x32,0xff,0x92,0x02,0x26,0x03,0x3e,0x00,0x0b,0x00,0x0e,0x00,0x11,0x00,0x42,0x40,0x3f,0x0f,0x0c,0x02,0x00, -0x06,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x00,0x06,0x05,0x06,0x00,0x05,0x80,0x08,0x01,0x05,0x05,0x84,0x03,0x01,0x01,0x06,0x06,0x01,0x57,0x03,0x01,0x01,0x01,0x06,0x5f,0x07,0x01,0x06,0x01,0x06,0x4f,0x00,0x00,0x11,0x10,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x06,0x1b,0x2b,0x05,0x35,0x23,0x03, -0x33,0x35,0x33,0x15,0x33,0x03,0x23,0x15,0x03,0x03,0x23,0x13,0x13,0x23,0x01,0x13,0x25,0xbc,0xe1,0x32,0xe1,0xbd,0x24,0x2d,0x04,0x72,0xa2,0x72,0x72,0x6e,0x6e,0x02,0xda,0x64,0x64,0xfd,0x26,0x6e,0x01,0x21,0x01,0xd7,0xfe,0x29,0x01,0xd7,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0x92,0x02,0x26,0x03,0x3e,0x00,0x0b,0x00,0x0e,0x00,0x11, -0x00,0x40,0x40,0x3d,0x11,0x0e,0x02,0x06,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x06,0x01,0x85,0x08,0x01,0x05,0x00,0x05,0x86,0x07,0x01,0x06,0x00,0x00,0x06,0x57,0x07,0x01,0x06,0x06,0x00,0x5f,0x04,0x01,0x00,0x06,0x00,0x4f,0x00,0x00,0x10,0x0f,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x06, -0x1b,0x2b,0x05,0x35,0x23,0x13,0x33,0x35,0x33,0x15,0x33,0x13,0x23,0x15,0x27,0x33,0x11,0x13,0x33,0x03,0x01,0x13,0xe1,0xbe,0x23,0x32,0x24,0xbd,0xe1,0xa3,0x72,0x30,0x73,0x73,0x6e,0x6e,0x02,0xda,0x64,0x64,0xfd,0x26,0x6e,0xbe,0x01,0xd3,0xfe,0x2d,0x01,0xd2,0x00,0x00,0x00,0x03,0x00,0x2d,0xff,0x5b,0x02,0x2b,0x02,0xda,0x00,0x03, -0x00,0x0c,0x00,0x10,0x00,0x3c,0x40,0x39,0x09,0x01,0x02,0x00,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x05,0x01,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x06,0x01,0x04,0x03,0x04,0x4f,0x0d,0x0d,0x00,0x00,0x0d,0x10,0x0d,0x10,0x0f,0x0e,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x07,0x06, -0x17,0x2b,0x33,0x13,0x33,0x13,0x25,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x35,0x21,0x15,0x32,0xbe,0x79,0xbd,0xfe,0x7c,0x01,0x15,0x67,0x0d,0x12,0x05,0x04,0x13,0x0d,0xdb,0x01,0xfe,0x02,0xda,0xfd,0x26,0x50,0x01,0x9f,0x34,0x5a,0x17,0x16,0x5a,0x34,0xfd,0x6b,0x4b,0x4b,0x00,0x00,0x00,0x03,0x00,0x32,0x00,0x00,0x02,0x26, -0x03,0xb1,0x00,0x19,0x00,0x1d,0x00,0x26,0x00,0x97,0x4b,0xb0,0x14,0x50,0x58,0x40,0x35,0x00,0x05,0x03,0x01,0x04,0x05,0x72,0x00,0x02,0x04,0x00,0x01,0x02,0x72,0x0a,0x01,0x07,0x08,0x07,0x86,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x09,0x01,0x00,0x06,0x04,0x00,0x6a,0x00,0x06,0x08,0x08,0x06,0x57,0x00,0x06,0x06,0x08, -0x5f,0x00,0x08,0x06,0x08,0x4f,0x1b,0x40,0x37,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x0a,0x01,0x07,0x08,0x07,0x86,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x09,0x01,0x00,0x06,0x04,0x00,0x6a,0x00,0x06,0x08,0x08,0x06,0x57,0x00,0x06,0x06,0x08,0x5f,0x00,0x08,0x06,0x08,0x4f, -0x59,0x40,0x1d,0x1a,0x1a,0x01,0x00,0x23,0x22,0x1a,0x1d,0x1a,0x1d,0x1c,0x1b,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0b,0x06,0x16,0x2b,0x01,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x03,0x03,0x21,0x03,0x27,0x36,0x36, -0x37,0x13,0x21,0x13,0x16,0x16,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0xad,0xbc,0x01,0xf4,0xbd,0x3c,0x04,0x13,0x0d,0x65,0xfe,0xec,0x69,0x0d,0x11,0x03,0x2f,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0xfc,0xd1,0x02,0xda,0xfd,0x26, -0x46,0x17,0x59,0x34,0x01,0xa0,0xfe,0x5f,0x34,0x58,0x00,0x00,0x00,0x03,0xff,0xf6,0xff,0x5b,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x27,0x40,0x24,0x07,0x06,0x05,0x03,0x02,0x01,0x06,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x08,0x08,0x08,0x0b,0x08,0x0b, -0x19,0x03,0x06,0x17,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x03,0x35,0x21,0x15,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0x30,0x02,0x30,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0xfd,0xf3,0x4b,0x4b,0x00,0xff,0xff,0x00,0x3c,0x00,0x32,0x02,0x1c,0x03,0x0c,0x00,0x27,0x06,0x72,0x02,0x58, -0x00,0x00,0x02,0x06,0x04,0x27,0x00,0x00,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x17,0x00,0x28,0x40,0x25,0x16,0x0d,0x0a,0x01,0x04,0x03,0x00,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x17,0x00,0x17,0x15,0x15,0x15,0x05,0x06,0x19,0x2b,0x05,0x35, -0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x07,0x15,0x01,0x13,0x5a,0x69,0x32,0x4e,0x43,0x32,0x43,0x4e,0x32,0x69,0x5a,0x6e,0xc9,0x08,0x75,0x5e,0x01,0x40,0xfe,0xbb,0x47,0x5a,0x08,0x02,0xb6,0xfd,0x4a,0x08,0x5a,0x47,0x01,0x45,0xfe,0xc0,0x5e,0x75,0x08,0xc9,0x00,0x00, -0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x4b,0x40,0x48,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x0b,0x0c,0x02,0x08,0x09,0x01,0x08,0x69,0x0d,0x0a,0x02,0x09,0x06,0x01,0x02,0x03,0x09,0x02,0x69,0x05,0x01,0x03,0x04,0x04,0x03,0x57,0x05,0x01,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04, -0x4f,0x24,0x23,0x1b,0x1a,0x29,0x28,0x23,0x2b,0x24,0x2b,0x20,0x1f,0x1a,0x22,0x1b,0x22,0x14,0x21,0x11,0x11,0x12,0x14,0x21,0x10,0x0e,0x06,0x1e,0x2b,0x13,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x07,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x35, -0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0xff,0x5a,0x05,0x35,0x43,0x43,0x35,0x05,0xff,0xfd,0xa8,0xff,0x05,0x34,0x44,0x44,0x34,0x05,0x05,0x23,0x2d,0x2d,0x23,0x05,0x5f,0x23,0x2d,0x2d,0x23,0x05,0x02,0x58,0x91,0x43,0x35,0x34,0x44,0x87,0x50,0x50,0x87,0x44,0x34,0x35,0x43,0x28,0x2d,0x23,0x23,0x2d,0xa0,0xa0,0x2d,0x23,0x23, -0x2d,0xa0,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x5b,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x0b,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09, -0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x31,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x05,0x35,0x21,0x15,0xff,0x5a,0xff,0xfd,0xa8,0x02,0x58,0x50,0x02,0x08,0xfd,0xf8,0x50,0xa5,0x4b,0x4b,0x00,0x00,0x01,0x00,0x00,0xff,0xf6,0x02,0x58,0x02,0xda,0x00,0x0e,0x00,0x2b,0x40,0x28,0x00,0x03,0x02,0x03,0x85,0x06,0x01,0x00, -0x01,0x00,0x86,0x04,0x01,0x02,0x01,0x01,0x02,0x57,0x04,0x01,0x02,0x02,0x01,0x5f,0x05,0x01,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1d,0x2b,0x05,0x27,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x01,0x2d,0xc9,0x9b,0xff,0xff,0x5a,0xff,0xff,0x9b,0x0a,0xa9,0xa6,0x50,0x01,0x45, -0xfe,0xbb,0x50,0xa6,0x00,0x02,0x00,0x50,0xff,0x5b,0x02,0x17,0x02,0x2d,0x00,0x2c,0x00,0x30,0x00,0x62,0x40,0x5f,0x07,0x01,0x05,0x04,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x06,0x0a,0x01, -0x00,0x08,0x06,0x00,0x69,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0b,0x01,0x09,0x08,0x09,0x4f,0x2d,0x2d,0x02,0x00,0x2d,0x30,0x2d,0x30,0x2f,0x2e,0x2a,0x29,0x27,0x24,0x20,0x1e,0x1d,0x1b,0x18,0x15,0x13,0x12,0x10,0x0d,0x00,0x2c,0x02,0x2c,0x0c,0x06,0x16,0x2b,0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26, -0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x05,0x35,0x21,0x15,0x01,0x4b,0x34,0x5b,0x6c,0x41,0x46,0x3a,0x3b,0x64,0x58,0x2e,0x53,0x6b,0x09,0x5f,0x05,0x38,0x2b,0x2e,0x5d,0x30,0x2e,0x7b,0x83, -0x33,0x35,0x37,0x31,0x34,0x2e,0x3b,0x04,0x5f,0x0a,0x6d,0xfe,0xc2,0x01,0x9e,0x07,0x58,0x49,0x3e,0x47,0x05,0x04,0x04,0x3a,0x31,0x47,0x4f,0x4c,0x42,0x1d,0x21,0x4b,0x24,0x2a,0x4e,0x30,0x28,0x25,0x30,0x1f,0x1a,0x40,0x49,0x9e,0x4b,0x4b,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x41,0x02,0x03,0x03,0x09,0x02,0x26,0x04,0x1b,0x00,0x00, -0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x02,0x7d,0x00,0x00,0x00,0x02,0x00,0x37,0xff,0x5b,0x02,0x26,0x02,0x26,0x00,0x0d,0x00,0x11,0x00,0x3c,0x40,0x39,0x00,0x02,0x00,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x06,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x05,0x05,0x04, -0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x08,0x06,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x05,0x35,0x21,0x15,0x01,0x9f,0x49,0x57,0xc8,0x01,0x22,0x26,0x20,0x87, -0xfe,0x16,0x01,0xea,0x55,0x46,0x01,0x39,0x52,0xfe,0x75,0x22,0x27,0x52,0xa5,0x4b,0x4b,0x00,0x00,0x00,0x00,0x04,0x00,0x7d,0x00,0xd2,0x01,0xdb,0x02,0xaf,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x4d,0x40,0x4a,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01, -0x06,0x04,0x04,0x06,0x59,0x0b,0x01,0x06,0x06,0x04,0x61,0x0a,0x01,0x04,0x06,0x04,0x51,0x25,0x24,0x19,0x18,0x0d,0x0c,0x01,0x00,0x2b,0x29,0x24,0x2f,0x25,0x2f,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14, -0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x52,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23, -0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x02,0x2f,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0xa3,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x00,0x03,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x01,0xc2,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x41,0x40,0x3e, -0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x07,0x01,0x02,0x06,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x25, -0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x35,0x21,0x15,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x7d,0x01,0x40,0xd2,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23, -0x2d,0xfe,0x61,0x4b,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x14,0x00,0x1d,0x00,0x45,0x40,0x42,0x00,0x02,0x01,0x02,0x85,0x0a,0x01,0x07,0x00,0x07,0x86,0x03,0x01,0x01,0x09,0x01,0x04,0x05,0x01,0x04,0x69,0x0b,0x08,0x02,0x05,0x00,0x00,0x05,0x59,0x0b,0x08,0x02,0x05,0x05,0x00,0x61,0x06,0x01, -0x00,0x05,0x00,0x51,0x16,0x15,0x00,0x00,0x19,0x17,0x15,0x1d,0x16,0x1d,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x11,0x11,0x24,0x21,0x0c,0x06,0x1d,0x2b,0x05,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x03,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2a,0x30,0x65,0x77, -0x77,0x65,0x30,0x32,0xde,0xde,0xde,0xde,0x67,0x35,0x35,0x4c,0x59,0x59,0x6e,0x01,0x04,0x75,0x62,0x62,0x75,0xfa,0xfa,0x2d,0xfe,0xac,0x2d,0xfe,0xfc,0x01,0x31,0x01,0x54,0x5c,0x4e,0x4e,0x5c,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x0e,0x00,0x37,0x40,0x34,0x06,0x01,0x02,0x03,0x05,0x01,0x01,0x02, -0x04,0x01,0x00,0x01,0x03,0x4c,0x00,0x03,0x02,0x03,0x85,0x00,0x00,0x01,0x00,0x86,0x04,0x01,0x02,0x01,0x01,0x02,0x57,0x04,0x01,0x02,0x02,0x01,0x5f,0x05,0x01,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x14,0x11,0x10,0x06,0x06,0x1c,0x2b,0x21,0x23,0x11,0x23,0x15,0x27,0x37,0x15,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x01,0x59,0x5a,0x77, -0x9c,0x9c,0x77,0x5a,0xff,0xff,0x01,0x45,0xa0,0xc8,0xc8,0xa0,0x01,0x45,0xfe,0xbb,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0xf6,0x02,0x21,0x02,0x30,0x00,0x2a,0x00,0x3a,0x40,0x37,0x28,0x01,0x01,0x02,0x01,0x4c,0x1e,0x1d,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01, -0x01,0x00,0x61,0x04,0x05,0x02,0x00,0x01,0x00,0x51,0x01,0x00,0x26,0x24,0x18,0x16,0x13,0x12,0x0f,0x0d,0x00,0x2a,0x01,0x2a,0x06,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x26,0x27,0x35,0x16,0x16,0x15,0x15,0x14, -0x06,0x23,0x22,0x26,0x27,0x06,0x06,0xb5,0x3a,0x44,0x4b,0x41,0x1a,0x1d,0x3d,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x1f,0x1d,0x44,0x4d,0x43,0x3b,0x31,0x3f,0x07,0x07,0x3f,0x0a,0x56,0x4b,0xcf,0x53,0x6d,0x0a,0x5f,0x05,0x3a,0x2c,0xd0,0x54,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xd0,0x29,0x37,0x06,0x5f,0x0a,0x6a,0x51,0xcf,0x4b,0x56,0x39, -0x32,0x32,0x39,0x00,0x00,0x02,0x00,0x37,0xff,0x5b,0x02,0x21,0x02,0x30,0x00,0x2a,0x00,0x2e,0x00,0x4a,0x40,0x47,0x28,0x01,0x01,0x02,0x01,0x4c,0x1e,0x1d,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x04,0x07,0x02,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01, -0x06,0x05,0x06,0x4f,0x2b,0x2b,0x01,0x00,0x2b,0x2e,0x2b,0x2e,0x2d,0x2c,0x26,0x24,0x18,0x16,0x13,0x12,0x0f,0x0d,0x00,0x2a,0x01,0x2a,0x09,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x26,0x27,0x35,0x16,0x16,0x15, -0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x07,0x35,0x21,0x15,0xb5,0x3a,0x44,0x4b,0x41,0x1a,0x1d,0x3d,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x1f,0x1d,0x44,0x4d,0x43,0x3b,0x31,0x3f,0x07,0x07,0x3f,0xaf,0x01,0xea,0x0a,0x56,0x4b,0xcf,0x53,0x6d,0x0a,0x5f,0x05,0x3a,0x2c,0xd0,0x54,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xd0,0x29,0x37, -0x06,0x5f,0x0a,0x6a,0x51,0xcf,0x4b,0x56,0x39,0x32,0x32,0x39,0x9b,0x4b,0x4b,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05, -0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x31,0x40,0x2e,0x09,0x06,0x02,0x03,0x02,0x01,0x4c,0x00, -0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x08,0x07,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x03,0x21,0x01,0x05,0x21,0x01,0x02,0x58,0x32,0xfe,0x2a,0x01,0xd6,0xfe,0x0c,0x01,0xd8,0xfe,0x28,0x6f,0x03, -0xad,0xfc,0x53,0x03,0x80,0xfc,0xda,0x2d,0x03,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x0c,0x00,0x1c,0x00,0x25,0x00,0x55,0x40,0x52,0x25,0x1f,0x0a,0x07,0x04,0x04,0x05,0x01,0x4c,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x09,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x0a,0x01,0x04,0x00, -0x07,0x06,0x04,0x07,0x69,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x08,0x01,0x01,0x06,0x01,0x4f,0x0e,0x0d,0x05,0x04,0x00,0x00,0x23,0x21,0x1e,0x1d,0x16,0x14,0x0d,0x1c,0x0e,0x1c,0x09,0x08,0x04,0x0c,0x05,0x0c,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x32,0x16,0x17,0x35,0x21,0x15, -0x36,0x36,0x13,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x07,0x21,0x35,0x06,0x06,0x23,0x22,0x26,0x27,0x02,0x58,0xfe,0xd4,0x50,0x83,0x27,0xfe,0x0c,0x28,0x82,0x50,0x48,0x71,0x41,0x41,0x71,0x48,0x47,0x71,0x42,0x42,0x71,0xb3,0x01,0xf4,0x27,0x83,0x50,0x50,0x82,0x28,0x6f,0x03,0xad,0xfc,0x53, -0x03,0x04,0x46,0x3b,0xfd,0xfd,0x3c,0x45,0xfd,0xd9,0x42,0x71,0x47,0x47,0x71,0x42,0x42,0x71,0x47,0x47,0x71,0x42,0xb0,0xfe,0x3b,0x46,0x45,0x3c,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x13,0x00,0x1f,0x00,0x4c,0x40,0x49,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x09,0x01,0x04,0x07, -0x05,0x04,0x69,0x00,0x07,0x0a,0x01,0x06,0x02,0x07,0x06,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x15,0x14,0x09,0x08,0x00,0x00,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x0f,0x0d,0x08,0x13,0x09,0x13,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x15,0x11,0x21,0x11, -0x25,0x21,0x11,0x21,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x26,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfe,0xde,0x29,0x22, -0x22,0x29,0x29,0x22,0x22,0x29,0xfe,0x5c,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x4c,0x40,0x49,0x0d,0x0a,0x02,0x06,0x02,0x01,0x4c,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x00,0x00,0x08,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x02, -0x00,0x06,0x05,0x02,0x06,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x07,0x01,0x01,0x04,0x01,0x4f,0x04,0x04,0x00,0x00,0x13,0x12,0x0c,0x0b,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x21,0x35,0x01,0x21,0x11,0x03,0x23,0x03,0x13,0x36, -0x36,0x37,0x13,0x21,0x13,0x16,0x16,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xbd,0x79,0xbe,0xfe,0x05,0x0f,0x0e,0x70,0xfe,0xd9,0x6f,0x0e,0x14,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0x37,0x37,0xfc,0xad,0x02,0xf7,0xfd,0x4b,0x02,0xb6,0xfd,0x90,0x17,0x5a,0x34,0x01,0x9f,0xfe,0x60,0x34,0x59,0x00,0x00,0x00,0x04,0x00,0x00, -0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x16,0x00,0x50,0x40,0x4d,0x0f,0x01,0x04,0x02,0x08,0x05,0x02,0x06,0x04,0x02,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x00,0x08,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x67,0x00,0x05,0x01,0x01,0x05,0x57,0x00,0x05,0x05,0x01, -0x5f,0x07,0x01,0x01,0x05,0x01,0x4f,0x04,0x04,0x00,0x00,0x16,0x15,0x14,0x13,0x0b,0x0a,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x13,0x33,0x13,0x11,0x01,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x21,0x35,0x21,0x02,0x58,0xfd,0xda,0xbe,0x79,0xbd,0xfe,0x73, -0x01,0x27,0x70,0x0d,0x12,0x05,0x04,0x12,0x0e,0xd6,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfd,0x14,0x02,0xb5,0xfd,0x4b,0x02,0xec,0xfd,0x3f,0x01,0x9f,0x34,0x5b,0x16,0x16,0x5a,0x34,0xfd,0xce,0x42,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x08,0x00,0x0c,0x00,0x11,0x00,0x37, -0x40,0x34,0x11,0x10,0x0f,0x0c,0x0b,0x0a,0x08,0x05,0x08,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x0e,0x0d,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x17,0x11,0x21,0x11, -0x13,0x37,0x27,0x07,0x03,0x21,0x11,0x07,0x27,0x02,0x58,0xfe,0xd4,0xfa,0xfe,0x0c,0xfa,0xe8,0xe8,0xe8,0x12,0x01,0xf4,0xfa,0xfa,0x6f,0x03,0xad,0xfc,0x53,0x03,0x0e,0xfb,0x01,0x6d,0xfe,0x93,0xfe,0xdc,0xe8,0xe9,0xe9,0xfe,0x56,0x01,0x6e,0xfa,0xfa,0x00,0x05,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x13, -0x00,0x17,0x00,0x23,0x00,0x5d,0x40,0x5a,0x00,0x00,0x0b,0x01,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x0c,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x02,0x00,0x07,0x09,0x02,0x07,0x67,0x00,0x09,0x0d,0x01,0x08,0x06,0x09,0x08,0x69,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x0a,0x01,0x01,0x06,0x01,0x4f,0x19,0x18,0x09,0x08, -0x04,0x04,0x00,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x17,0x16,0x15,0x14,0x0f,0x0d,0x08,0x13,0x09,0x13,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0e,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x21,0x11,0x21,0x17,0x22,0x26,0x35,0x34, -0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xfe,0xe0,0x01,0xf4,0xfe,0x0c,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0x7c,0x01,0x84,0xfe,0xd4,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xfd,0xd9,0x01,0x84,0xf2,0x29,0x22,0x22, -0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x47,0x40,0x44,0x14,0x13,0x11,0x10,0x04,0x04,0x03,0x12,0x01,0x02,0x04,0x02,0x4c,0x05,0x01,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00, -0x02,0x02,0x01,0x60,0x07,0x01,0x01,0x02,0x01,0x50,0x00,0x00,0x1e,0x1d,0x19,0x18,0x0c,0x0b,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x23,0x11,0x14,0x06,0x07,0x33,0x36,0x36,0x37,0x37,0x15,0x07,0x27,0x35,0x17,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x23,0x02,0x58, -0xfd,0xda,0x01,0xf4,0xcd,0x03,0x02,0x0a,0x05,0x1b,0x16,0x60,0xc7,0xc9,0x5f,0x16,0x1d,0x04,0x0a,0x01,0x04,0xcd,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfd,0xc1,0x16,0x2d,0x0d,0x06,0x1d,0x12,0x51,0x69,0xa9,0xa9,0x69,0x50,0x12,0x1d,0x07,0x0d,0x2d,0x16,0x02,0x3f,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03, -0x00,0x0e,0x00,0x14,0x00,0x3e,0x40,0x3b,0x14,0x11,0x0e,0x0b,0x07,0x05,0x04,0x02,0x01,0x4c,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x00,0x00,0x02,0x04,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x05,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x00,0x03,0x00,0x03,0x11, -0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x35,0x21,0x15,0x11,0x21,0x11,0x03,0x23,0x03,0x02,0x58,0xfe,0xb4,0x0b,0x12,0x04,0x05,0x13,0x0a,0xd7,0xfe,0x0c,0x01,0xf4,0xdb,0x3e,0xdb,0x6f,0x03,0xad,0xfc,0x53,0xf0,0x1c,0x3a,0x11,0x11,0x3b,0x1b,0x02,0x49,0x47,0x3c,0xfc,0xe9,0x02,0x8f,0xfd, -0xa8,0x02,0x58,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x47,0x40,0x44,0x00,0x00,0x09,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x67,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x08,0x01, -0x01,0x06,0x01,0x4f,0x04,0x04,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0a,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x01,0x21,0x35,0x21,0x11,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfe,0x0c,0x6f, -0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0xf7,0x01,0x09,0xfe,0x07,0xa0,0xfe,0x06,0x01,0x0a,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x10,0x00,0x14,0x00,0x3b,0x40,0x38,0x14,0x13,0x0e,0x0a,0x09,0x06,0x05,0x07,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x00, -0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x04,0x04,0x00,0x00,0x12,0x11,0x04,0x07,0x04,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x05,0x11,0x03,0x25,0x11,0x25,0x36,0x36,0x37,0x26,0x26,0x01,0x21,0x11,0x05,0x02,0x58,0xfd,0xda,0x01,0xf4,0x78,0xfe, -0x84,0x01,0x7c,0x13,0x21,0x08,0x09,0x22,0xfe,0x73,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0x7c,0xfa,0x01,0x76,0xfe,0x6e,0xbc,0xfe,0x59,0xbb,0x09,0x0d,0x02,0x02,0x0e,0xfe,0x47,0x01,0x79,0xfa,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x02,0x26,0x04,0x4d,0x00,0x28,0x01,0x06,0x05,0x85, -0x00,0x00,0x00,0x08,0xb1,0x00,0x02,0xb0,0x28,0xb0,0x35,0x2b,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x5a,0x40,0x57,0x17,0x01,0x06,0x05,0x18,0x11,0x0a,0x03,0x03,0x06,0x0b,0x01,0x04,0x03,0x03,0x4c,0x00,0x05,0x07,0x06,0x07,0x05,0x06,0x80,0x00,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x00, -0x00,0x07,0x05,0x00,0x07,0x67,0x00,0x06,0x00,0x03,0x04,0x06,0x03,0x68,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1d,0x1c,0x1a,0x13,0x12,0x10,0x0f,0x08,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x23,0x22,0x26, -0x27,0x15,0x16,0x16,0x17,0x17,0x23,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36,0x33,0x33,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xf4,0x10,0x29,0x0d,0x09,0x1a,0x0a,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0d,0x19,0x07,0x0d,0x29,0x10,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x01,0x82,0x03,0x01,0x09,0x07,0x19,0x0d,0x6e, -0xc8,0xc8,0x6d,0x10,0x19,0x06,0x09,0x02,0x03,0x01,0x81,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x10,0x00,0x14,0x00,0x3b,0x40,0x38,0x14,0x13,0x0e,0x0a,0x09,0x06,0x05,0x07,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03, -0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x04,0x04,0x00,0x00,0x12,0x11,0x04,0x07,0x04,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x25,0x35,0x01,0x05,0x11,0x05,0x06,0x06,0x07,0x16,0x16,0x03,0x21,0x35,0x25,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x84,0x01,0x7c,0xfe,0x84,0x13,0x21,0x08,0x09, -0x22,0x67,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0x89,0xfa,0x7d,0xfe,0x41,0xbc,0x01,0xa7,0xbb,0x09,0x0d,0x02,0x02,0x0e,0xfe,0x64,0x7e,0xfa,0x00,0x05,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x1b,0x00,0x67,0x40,0x64,0x0f,0x01,0x05,0x03,0x02,0x03,0x05,0x02, -0x80,0x00,0x0c,0x0b,0x0a,0x0b,0x0c,0x0a,0x80,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x04,0x01,0x02,0x09,0x01,0x07,0x06,0x02,0x07,0x67,0x08,0x01,0x06,0x0d,0x01,0x0b,0x0c,0x06,0x0b,0x67,0x00,0x0a,0x01,0x01,0x0a,0x57,0x00,0x0a,0x0a,0x01,0x5f,0x0e,0x01,0x01,0x0a,0x01,0x4f,0x04,0x04,0x00,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16, -0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x04,0x0b,0x04,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x10,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x03,0x07,0x33,0x11,0x21,0x11,0x21,0x37,0x01,0x33,0x37,0x23,0x05,0x33,0x35,0x23,0x01,0x21,0x11,0x21,0x07,0x23,0x37,0x23,0x02,0x58,0x8e,0x40,0x9c,0xfe,0x0c, -0x01,0x12,0x40,0xfe,0xae,0xba,0x3a,0xf4,0x01,0x00,0xf4,0xba,0xfe,0xc6,0x01,0xf4,0xfe,0xee,0x3e,0x46,0x3e,0x9c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x26,0xaf,0x01,0x09,0xfe,0xf7,0xaf,0xfe,0x61,0xa0,0xa0,0xa0,0xfe,0x06,0x01,0x0a,0xaa,0xaa,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x1c, -0x00,0x2a,0x00,0xa7,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x3a,0x0c,0x01,0x08,0x07,0x0a,0x07,0x08,0x72,0x00,0x00,0x00,0x03,0x06,0x00,0x03,0x67,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x04,0x00,0x07,0x08,0x04,0x07,0x69,0x00,0x0a,0x0d,0x01,0x09,0x02,0x0a,0x09,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x0b, -0x01,0x01,0x02,0x01,0x4f,0x1b,0x40,0x3b,0x0c,0x01,0x08,0x07,0x0a,0x07,0x08,0x0a,0x80,0x00,0x00,0x00,0x03,0x06,0x00,0x03,0x67,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x04,0x00,0x07,0x08,0x04,0x07,0x69,0x00,0x0a,0x0d,0x01,0x09,0x02,0x0a,0x09,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x0b,0x01,0x01, -0x02,0x01,0x4f,0x59,0x40,0x24,0x1e,0x1d,0x08,0x08,0x00,0x00,0x25,0x22,0x1d,0x2a,0x1e,0x29,0x08,0x1c,0x08,0x1c,0x1b,0x1a,0x14,0x12,0x11,0x0f,0x0b,0x09,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x0e,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32, -0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x95,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x3d,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfd,0xbc, -0xb4,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x69,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x5a,0x40,0x57,0x0d,0x01,0x04,0x05,0x1a,0x13,0x0c,0x03,0x07,0x04,0x19,0x01,0x06,0x07,0x03,0x4c,0x00,0x05,0x03,0x04,0x03,0x05, -0x04,0x80,0x00,0x06,0x07,0x02,0x07,0x06,0x02,0x80,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x68,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1c,0x15,0x14,0x12,0x11,0x0a,0x08,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x09,0x06, -0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x11,0x33,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xf4,0x11,0x28,0x0d,0x07,0x19,0x0d,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0xf4,0x6f,0x03,0xad, -0xfc,0x53,0x2d,0x03,0x53,0xfe,0x7f,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xc8,0xc8,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x3c,0x40,0x39,0x08,0x05,0x02,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x06,0x01,0x03,0x01, -0x01,0x03,0x57,0x06,0x01,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x07,0x07,0x04,0x04,0x00,0x00,0x07,0x09,0x07,0x09,0x04,0x06,0x04,0x06,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x01,0x13,0x11,0x01,0x02,0x58,0xfd,0xda,0x01,0xd8,0x1c,0xfe,0x28,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80, -0xfc,0xd6,0x03,0x2a,0xfc,0xad,0x03,0x29,0xfc,0xd7,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x48,0x40,0x45,0x10,0x01,0x03,0x06,0x12,0x11,0x0f,0x0e,0x04,0x02,0x03,0x02,0x4c,0x04,0x01,0x03,0x06,0x02,0x06,0x03,0x02,0x80,0x00,0x00,0x00,0x06,0x03,0x00,0x06,0x67,0x05,0x01,0x02,0x01, -0x01,0x02,0x57,0x05,0x01,0x02,0x02,0x01,0x5f,0x07,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1d,0x1c,0x1b,0x17,0x16,0x0a,0x09,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x33,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x35,0x37,0x17,0x15,0x27,0x26,0x26,0x27,0x23,0x16,0x16,0x15,0x11, -0x33,0x11,0x21,0x02,0x58,0xfd,0xda,0xcd,0x04,0x01,0x0a,0x04,0x1d,0x16,0x5f,0xc9,0xc7,0x60,0x16,0x1b,0x05,0x0a,0x02,0x03,0xcd,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x02,0x40,0x16,0x2d,0x0d,0x07,0x1d,0x12,0x50,0x69,0xa9,0xa9,0x69,0x51,0x12,0x1d,0x06,0x0d,0x2d,0x16,0xfd,0xc0,0x03,0x53,0x00,0x00,0x00,0x00,0x03,0x00,0x00, -0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x09,0x00,0x14,0x00,0x43,0x40,0x40,0x14,0x10,0x0c,0x08,0x05,0x05,0x04,0x03,0x01,0x4c,0x06,0x01,0x03,0x02,0x04,0x02,0x03,0x04,0x80,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x05,0x01,0x01,0x04,0x01,0x4f,0x04,0x04,0x00,0x00, -0x0b,0x0a,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x13,0x11,0x21,0x11,0x13,0x03,0x21,0x35,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x02,0x58,0xfe,0xf3,0xdb,0xfe,0x0c,0xdb,0xdb,0x01,0xf4,0xd9,0x0a,0x13,0x05,0x04,0x12,0x0b,0xd8,0x6f,0x03,0xad,0xfc,0x53,0x03,0x49, -0xfd,0xa8,0x02,0x8f,0xfd,0x71,0x02,0x58,0xfc,0xe4,0x42,0x02,0x4e,0x1b,0x3b,0x11,0x11,0x3a,0x1c,0xfd,0xb2,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x49,0x40,0x46,0x0c,0x09,0x02,0x05,0x04,0x01,0x4c,0x00,0x04,0x03,0x05,0x03,0x04,0x05,0x80,0x07,0x01,0x05,0x02,0x03, -0x05,0x02,0x7e,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0b,0x0a,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x27,0x35,0x33,0x15, -0x07,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xd6,0x0c,0x60,0x0b,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfe,0x9d,0x96,0x96,0x96,0x96,0x00,0x00,0x02,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x38,0x40,0x35,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85, -0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x06,0x17,0x2b,0x01,0x27,0x35,0x33,0x15,0x07,0x03,0x35,0x21,0x15,0x01,0x08,0x0c,0x60,0x0b,0xc5,0x01,0x40,0x01,0xae,0x96,0x96,0x96,0x96,0xfd,0xad,0x4b,0x4b, -0x00,0x02,0x00,0x5e,0xff,0x4c,0x01,0xfe,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x3c,0x40,0x39,0x0e,0x01,0x03,0x04,0x01,0x4c,0x05,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x00,0x04,0x03,0x00,0x04,0x69,0x06,0x01,0x03,0x01,0x01,0x03,0x59,0x06,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x03,0x01,0x51,0x13,0x12,0x00,0x00,0x1a,0x18,0x12,0x1f, -0x13,0x1f,0x00,0x11,0x00,0x11,0x25,0x23,0x07,0x06,0x18,0x2b,0x17,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5e,0x70,0x61,0x61,0x6e,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x76,0x39,0x3d,0x3d,0x39,0x39,0x3d,0x3f, -0xb4,0x02,0x18,0x5f,0x6d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x44,0x40,0x96,0x40,0x44,0x44,0x40,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x6c,0x02,0xda,0x00,0x0e,0x00,0x3d,0x40,0x3a,0x09,0x01,0x01,0x02,0x0a,0x01,0x00,0x01,0x0b,0x01,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x02,0x85,0x06, -0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0e,0x14,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x35,0x17,0x07,0x35,0x23,0x11,0xff,0xff,0xff,0x5a,0x77,0x9c,0x9c,0x77,0x01,0x45, -0x50,0x01,0x45,0xfe,0xbb,0xa0,0xc8,0xc8,0xa0,0xfe,0xbb,0x00,0x00,0x03,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x02,0xe4,0x00,0x0d,0x00,0x11,0x00,0x15,0x00,0x48,0x40,0x45,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x80,0x07,0x01,0x03,0x04,0x00,0x03,0x04,0x7e,0x00,0x01,0x06,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00, -0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x12,0x12,0x0e,0x0e,0x01,0x00,0x12,0x15,0x12,0x15,0x14,0x13,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x13,0x33,0x03,0x07,0x35,0x21,0x15,0x01,0x22,0x21,0x2a, -0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x8c,0x50,0x82,0x82,0x6e,0x01,0x40,0x02,0x4e,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfd,0xc6,0x01,0x37,0xfe,0xc9,0xb9,0x4b,0x4b,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x92,0x02,0x1c,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03, -0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x17,0x13,0x23,0x35,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x03,0x4b,0x97,0xa6,0xc4,0xae,0x5f,0xae,0xbd,0xdb,0x97,0x6e,0x01,0x90,0x50,0x01,0xcc,0xfe,0x34,0x50, -0xfe,0x70,0x00,0x00,0x00,0x02,0x00,0xaa,0xff,0x91,0x01,0xae,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x17,0x11, -0x21,0x11,0x27,0x33,0x11,0x23,0xaa,0x01,0x04,0xd2,0xa0,0xa0,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0x00,0x03,0x00,0x7d,0x00,0xda,0x01,0xdb,0x02,0xaf,0x00,0x0b,0x00,0x17,0x00,0x21,0x00,0x42,0x40,0x3f,0x1c,0x01,0x04,0x00,0x01,0x4c,0x21,0x20,0x1f,0x19,0x04,0x04,0x49,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00, -0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x07,0x02,0x06,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x1e,0x1d,0x1b,0x1a,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x08,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06, -0x13,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x09,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0x02,0x2f,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0xab,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43, -0x00,0x01,0x00,0x41,0xff,0x92,0x02,0x17,0x03,0x3e,0x00,0x23,0x00,0x90,0x40,0x0c,0x0a,0x07,0x02,0x06,0x03,0x1c,0x19,0x02,0x07,0x02,0x02,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x31,0x00,0x01,0x00,0x01,0x85,0x00,0x03,0x00,0x06,0x02,0x03,0x72,0x08,0x01,0x07,0x02,0x04,0x06,0x07,0x72,0x00,0x05,0x04,0x05,0x86,0x00,0x00,0x00,0x06, -0x02,0x00,0x06,0x69,0x00,0x02,0x07,0x04,0x02,0x59,0x00,0x02,0x02,0x04,0x62,0x00,0x04,0x02,0x04,0x52,0x1b,0x40,0x33,0x00,0x01,0x00,0x01,0x85,0x00,0x03,0x00,0x06,0x00,0x03,0x06,0x80,0x08,0x01,0x07,0x02,0x04,0x02,0x07,0x04,0x80,0x00,0x05,0x04,0x05,0x86,0x00,0x00,0x00,0x06,0x02,0x00,0x06,0x69,0x00,0x02,0x07,0x04,0x02,0x59, -0x00,0x02,0x02,0x04,0x62,0x00,0x04,0x02,0x04,0x52,0x59,0x40,0x10,0x00,0x00,0x00,0x23,0x00,0x23,0x23,0x13,0x23,0x13,0x23,0x13,0x23,0x09,0x06,0x1d,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x23,0x11,0x26,0x26,0x23,0x22,0x06, -0x15,0x15,0x41,0x46,0x3c,0x17,0x28,0x11,0x32,0x14,0x25,0x15,0x16,0x19,0x55,0x46,0x3c,0x17,0x28,0x11,0x32,0x14,0x26,0x14,0x16,0x19,0x01,0x02,0x0f,0x3e,0x49,0x0b,0x08,0x01,0xb9,0xfe,0x2a,0x0d,0x13,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x0a,0x08,0xfe,0x83,0x01,0x9a,0x0d,0x14,0x18,0x15,0x1e,0xff,0xff,0x00,0x46,0x00,0xfa,0x02,0x12, -0x02,0xaf,0x02,0x26,0x04,0x22,0x00,0x00,0x01,0x07,0x06,0x68,0x02,0x58,0xff,0xa6,0x00,0x09,0xb1,0x01,0x02,0xb8,0xff,0xa6,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x3c,0x00,0x32,0x02,0x1c,0x03,0x0c,0x00,0x27,0x06,0x72,0x02,0x58,0x00,0x00,0x02,0x06,0x04,0x26,0x00,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0x30,0x00,0x11, -0x00,0x1d,0x00,0x29,0x00,0x49,0x40,0x46,0x08,0x03,0x02,0x01,0x04,0x01,0x86,0x00,0x00,0x00,0x02,0x05,0x00,0x02,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0a,0x01,0x06,0x04,0x04,0x06,0x59,0x0a,0x01,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04,0x51,0x1f,0x1e,0x13,0x12,0x00,0x00,0x25,0x23,0x1e,0x29,0x1f,0x29,0x19,0x17, -0x12,0x1d,0x13,0x1d,0x00,0x11,0x00,0x11,0x23,0x13,0x23,0x0b,0x06,0x19,0x2b,0x33,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x50,0x77,0x65,0x65,0x77,0x32,0x5c, -0x4e,0x4e,0x5c,0xaa,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x01,0x54,0x65,0x77,0x77,0x65,0xfe,0xac,0x01,0x59,0x4e,0x5c,0x5c,0x4e,0xfe,0xa7,0xe6,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58, -0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x1f,0x00,0x45,0x40,0x42,0x0a,0x01,0x07,0x04,0x07,0x86,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x04,0x04,0x05,0x57,0x00,0x05,0x05,0x04,0x5f,0x06,0x01,0x04,0x05,0x04,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x1f,0x18,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x13, -0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0b,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23, -0x25,0xff,0x02,0x58,0xff,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x77,0x02,0x08,0x50,0x50,0xfd,0xf8,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x52,0x40,0x4f,0x0c,0x01,0x07,0x00,0x07,0x86,0x00,0x03,0x04,0x01,0x02,0x01, -0x03,0x02,0x67,0x05,0x01,0x01,0x0e,0x0b,0x02,0x08,0x09,0x01,0x08,0x69,0x0a,0x0d,0x02,0x09,0x00,0x00,0x09,0x59,0x0a,0x0d,0x02,0x09,0x09,0x00,0x61,0x06,0x01,0x00,0x09,0x00,0x51,0x23,0x23,0x1a,0x1a,0x00,0x00,0x23,0x2b,0x23,0x2b,0x27,0x25,0x1a,0x22,0x1a,0x22,0x1e,0x1c,0x00,0x19,0x00,0x19,0x14,0x21,0x11,0x11,0x12,0x14,0x21, -0x0f,0x06,0x1d,0x2b,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x27,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x37,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0xff,0x05,0x34,0x44,0x44,0x34,0x05,0xff,0x02,0x58,0xff,0x05,0x35,0x43,0x43,0x35, -0x05,0x5f,0x05,0x05,0x23,0x2d,0x2d,0x87,0x05,0x05,0x23,0x2d,0x2d,0x91,0x44,0x34,0x35,0x43,0x87,0x50,0x50,0x87,0x43,0x35,0x34,0x44,0x91,0xb9,0xa0,0x2d,0x23,0x23,0x2d,0xa0,0xa0,0x2d,0x23,0x23,0x2d,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xfd,0x00,0x07,0x00,0x0b,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x86,0x00, -0x04,0x00,0x05,0x00,0x04,0x05,0x67,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x11,0x11,0x11,0x11,0x11,0x10,0x06,0x06,0x1c,0x2b,0x11,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x21,0x02,0x58,0xff,0x5a,0xff,0x02,0x58,0xfd,0xa8,0x02,0x58,0x50,0xfd,0xf8,0x02,0x08,0xf5,0x4b, -0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xe4,0x00,0x0e,0x00,0x2b,0x40,0x28,0x06,0x01,0x00,0x01,0x00,0x85,0x00,0x03,0x02,0x03,0x86,0x05,0x01,0x01,0x02,0x02,0x01,0x57,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x01,0x02,0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1d,0x2b,0x01,0x17,0x23,0x15,0x33,0x15,0x23, -0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x01,0x2d,0xc7,0x9b,0xff,0xff,0x5a,0xff,0xff,0x9b,0x02,0xe4,0xa9,0xa6,0x50,0xfe,0xbb,0x01,0x45,0x50,0xa6,0x00,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1e,0x00,0x2f,0x00,0x58,0x40,0x55,0x1d,0x01,0x07,0x02,0x23,0x01,0x06,0x03,0x02,0x4c,0x00,0x01, -0x00,0x04,0x02,0x01,0x04,0x69,0x09,0x01,0x02,0x00,0x07,0x03,0x02,0x07,0x69,0x00,0x03,0x00,0x06,0x05,0x03,0x06,0x69,0x0a,0x01,0x05,0x00,0x00,0x05,0x59,0x0a,0x01,0x05,0x05,0x00,0x61,0x08,0x01,0x00,0x05,0x00,0x51,0x20,0x1f,0x0f,0x0e,0x01,0x00,0x2b,0x29,0x26,0x24,0x1f,0x2f,0x20,0x2f,0x1a,0x18,0x14,0x12,0x0e,0x1e,0x0f,0x1e, -0x08,0x06,0x00,0x0d,0x01,0x0d,0x0b,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x13,0x32,0x36,0x35,0x35,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72, -0x72,0x9a,0x1a,0x23,0x1b,0x1e,0x14,0x28,0x3f,0x3b,0x3a,0x40,0x0e,0x6c,0x3b,0x3f,0x0e,0x34,0x1a,0x23,0x1b,0x1e,0x14,0x28,0x40,0x0a,0x72,0x6a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe,0xc9,0x6a,0x72,0x01,0xd3,0x1d,0x25,0x1d,0x2d,0x7b,0x3e,0x43,0x43,0x3e,0x8c,0x43,0xfe,0x7e,0x43,0x3e,0x9a,0x43,0x1d,0x25,0x1d,0x2d,0x89,0x3e,0x43, -0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x37,0x00,0x4d,0x40,0x4a,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x05,0x0b,0x06,0x0a,0x03,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x2d,0x2c,0x21, -0x20,0x11,0x10,0x01,0x00,0x33,0x31,0x2c,0x37,0x2d,0x37,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16, -0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0xda,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0xfe,0xc8,0x18,0x20,0x20,0x18, -0x18,0x20,0x20,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xd1,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0xe4,0x00,0x0e,0x00,0x14,0x00,0x1c, -0x00,0x3d,0x40,0x3a,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x07,0x01,0x04,0x00,0x00,0x04,0x59,0x07,0x01,0x04,0x04,0x00,0x5f,0x06,0x01,0x00,0x04,0x00,0x4f,0x16,0x15,0x01,0x00,0x1a,0x18,0x15,0x1c,0x16,0x1c,0x13,0x12,0x10,0x0f,0x08,0x06,0x00,0x0e,0x01,0x0d,0x08,0x06,0x16,0x2b,0x33, -0x22,0x35,0x34,0x37,0x13,0x36,0x33,0x32,0x17,0x13,0x16,0x15,0x14,0x23,0x25,0x33,0x13,0x35,0x23,0x15,0x13,0x32,0x35,0x34,0x23,0x22,0x15,0x14,0x3b,0x45,0x13,0xf2,0x10,0x21,0x21,0x10,0xf1,0x14,0x45,0xfe,0xf6,0x31,0x0a,0x44,0x21,0x2c,0x2c,0x2c,0x38,0x1a,0x2e,0x02,0x3e,0x26,0x26,0xfd,0xc2,0x2e,0x1a,0x38,0xc8,0x01,0x17,0x47, -0x47,0xfe,0x5e,0x2a,0x2a,0x2a,0x2a,0x00,0x00,0x01,0x00,0x14,0xff,0x92,0x02,0x44,0x03,0x48,0x00,0x05,0x00,0x1c,0x40,0x19,0x03,0x01,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x01,0x03,0x21,0x01,0x13,0x21,0x01,0xd6,0xb4,0x01,0x22,0xfd,0xee,0xf5, -0xfe,0xed,0x03,0x48,0xfe,0x70,0xfd,0xda,0x01,0xa4,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x73,0x02,0x34,0x02,0x6e,0x00,0x05,0x00,0x06,0xb3,0x05,0x03,0x01,0x32,0x2b,0x13,0x37,0x17,0x13,0x17,0x01,0x25,0x3f,0x90,0xfb,0x45,0xfe,0xc9,0x01,0x48,0x42,0x8e,0x01,0x72,0x30,0xfe,0x35,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x64,0x02,0x16, -0x02,0x38,0x00,0x0b,0x00,0x06,0xb3,0x0a,0x04,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x7b,0x38,0xb0,0xb1,0x3a,0xb1,0xb0,0x38,0xb0,0xb1,0x3a,0xb1,0x65,0x38,0xb0,0xb1,0x3a,0xb1,0xb0,0x38,0xb0,0xb1,0x3a,0xb1,0x00,0x01,0x00,0x1f,0x00,0x5b,0x02,0x39,0x02,0x75,0x00,0x0b,0x00,0x06,0xb3,0x0a, -0x04,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x59,0x39,0xd3,0xd4,0x3a,0xd4,0xd2,0x39,0xd3,0xd4,0x3a,0xd4,0x5c,0x39,0xd2,0xd4,0x3a,0xd4,0xd3,0x39,0xd2,0xd4,0x3a,0xd4,0x00,0x01,0x00,0x27,0x00,0x3c,0x02,0x30,0x02,0x94,0x00,0x0b,0x00,0x06,0xb3,0x0a,0x04,0x01,0x32,0x2b,0x37,0x37,0x27,0x17, -0x37,0x17,0x37,0x07,0x17,0x27,0x07,0x27,0x27,0xab,0xaa,0xd7,0x2d,0x2c,0xd7,0xaa,0xab,0xd7,0x2d,0x2d,0xd2,0x96,0x96,0x49,0xdf,0xde,0x48,0x96,0x96,0x49,0xdf,0xdf,0x00,0x03,0x00,0x0f,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x1d,0x00,0x61,0x40,0x5e,0x0b,0x01,0x04,0x02,0x18,0x01,0x09,0x06,0x02,0x4c,0x00,0x02, -0x04,0x02,0x85,0x0b,0x03,0x02,0x01,0x00,0x05,0x00,0x01,0x05,0x80,0x07,0x01,0x05,0x06,0x00,0x05,0x06,0x7e,0x0c,0x0a,0x02,0x08,0x09,0x08,0x86,0x00,0x04,0x00,0x00,0x01,0x04,0x00,0x67,0x00,0x06,0x09,0x09,0x06,0x57,0x00,0x06,0x06,0x09,0x5f,0x00,0x09,0x06,0x09,0x4f,0x11,0x11,0x00,0x00,0x11,0x1d,0x11,0x1d,0x1c,0x1b,0x1a,0x19, -0x17,0x16,0x15,0x14,0x13,0x12,0x10,0x0f,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x0d,0x06,0x19,0x2b,0x01,0x27,0x23,0x07,0x23,0x13,0x33,0x13,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x33,0x03,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x17,0x23,0x27,0x23,0x15,0x01,0x3c,0x1c,0xb0,0x1b,0x46,0x94,0x4a,0x94,0x9e,0x08,0x12,0x02,0x02,0x12, -0x08,0x22,0x7d,0x11,0x42,0x4f,0x60,0x4a,0x71,0x7b,0x4e,0x66,0x4f,0x01,0x8b,0x41,0x41,0x01,0x4f,0xfe,0xb1,0xce,0x13,0x2a,0x0d,0x0d,0x2a,0x13,0x52,0xfd,0xf9,0x01,0x4f,0x86,0x86,0xa1,0xae,0x8f,0x8f,0x00,0x00,0x04,0x00,0x2d,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x4b,0x00,0x6c,0x40,0x69,0x07,0x01, -0x05,0x02,0x01,0x4c,0x00,0x0a,0x0b,0x07,0x0b,0x0a,0x07,0x80,0x00,0x07,0x08,0x0b,0x07,0x08,0x7e,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x0c,0x01,0x01,0x09,0x04,0x01,0x67,0x00,0x09,0x00,0x0b,0x0a,0x09,0x0b,0x69,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0d, -0x01,0x06,0x08,0x06,0x51,0x21,0x20,0x00,0x00,0x3f,0x3c,0x3a,0x39,0x37,0x34,0x29,0x26,0x24,0x23,0x20,0x4b,0x21,0x4a,0x1f,0x1d,0x19,0x17,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0c,0x21,0x0e,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15, -0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x2d,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14, -0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0x15,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13, -0x19,0xdb,0x19,0x13,0x13,0x17,0xfd,0xe1,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x2d,0xff,0x4c,0x02,0x30,0x02,0xe4,0x00,0x27,0x00,0x35,0x00,0x4b,0x40,0x48,0x19,0x01,0x07,0x03,0x01,0x4c, -0x00,0x03,0x00,0x07,0x06,0x03,0x07,0x69,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x05,0x05,0x00,0x5f,0x08,0x01,0x00,0x00,0x3d,0x00,0x4e,0x29,0x28,0x01,0x00,0x30,0x2e,0x28,0x35,0x29,0x35,0x26,0x24,0x1f,0x1d,0x17,0x15,0x10,0x0e,0x09,0x07,0x00,0x27,0x01,0x27,0x0a, -0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x45,0x55,0x7e,0x45,0x90,0x7e, -0x72,0x83,0x56,0x4a,0x49,0x57,0x46,0x40,0x29,0x36,0x09,0x02,0x55,0x50,0x5a,0x64,0x6b,0x5d,0x6e,0x23,0x26,0x2a,0x2a,0x26,0x26,0x2a,0x2a,0xb4,0x47,0x83,0x58,0x01,0x54,0x87,0x9b,0x83,0x72,0xfe,0xf1,0x4e,0x5b,0x58,0x47,0x74,0x4a,0x51,0x20,0x1c,0x46,0x55,0x5a,0x74,0x68,0xfe,0xac,0x64,0x73,0x4b,0x01,0x2e,0x31,0x2b,0x75,0x2c, -0x2f,0x30,0x2c,0x74,0x2b,0x31,0x00,0x00,0x00,0x02,0x00,0x19,0xff,0xf7,0x02,0x67,0x02,0xe4,0x00,0x24,0x00,0x30,0x00,0x9b,0x40,0x09,0x28,0x21,0x1e,0x1b,0x04,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x34,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x07,0x01,0x08,0x69,0x00,0x04,0x04,0x02,0x61,0x00, -0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x00,0x61,0x06,0x09,0x02,0x00,0x00,0x3f,0x4d,0x0a,0x01,0x07,0x07,0x00,0x61,0x06,0x09,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x31,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x07,0x01,0x08,0x69,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f, -0x00,0x06,0x06,0x39,0x4d,0x0a,0x01,0x07,0x07,0x00,0x61,0x09,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1d,0x26,0x25,0x01,0x00,0x2b,0x29,0x25,0x30,0x26,0x30,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x0b,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36, -0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x27,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xd7,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63,0x61,0x2b,0x22,0x53, -0x26,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x00,0x00,0x02,0x00,0x41,0xff,0x4c,0x01,0xf9,0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x2a, -0x40,0x27,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d,0x06,0x04,0x05,0x03,0x02,0x02,0x3d,0x02,0x4e,0x0b,0x0b,0x00,0x00,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x0a,0x25,0x11,0x07,0x09,0x18,0x2b,0x17,0x11,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x11,0x33,0x11,0x33,0x11,0xff,0x55,0x69,0x69,0x55,0x50,0x5a, -0x50,0xb4,0x01,0xea,0x5e,0x4c,0x50,0x4d,0x5d,0xfc,0x72,0x03,0x8e,0xfc,0x72,0x00,0x00,0x02,0x00,0x4d,0xff,0x66,0x02,0x0b,0x02,0xe4,0x00,0x3b,0x00,0x49,0x00,0x47,0x40,0x44,0x16,0x01,0x06,0x04,0x01,0x4c,0x00,0x04,0x05,0x06,0x05,0x04,0x06,0x80,0x00,0x06,0x01,0x05,0x06,0x01,0x7e,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x02, -0x07,0x01,0x00,0x02,0x00,0x65,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3e,0x05,0x4e,0x01,0x00,0x33,0x32,0x27,0x24,0x22,0x21,0x1f,0x1c,0x09,0x06,0x04,0x03,0x00,0x3b,0x01,0x3a,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02,0x35,0x34,0x36,0x37,0x35,0x26,0x26, -0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x13,0x16,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x06,0x15,0x14,0x16,0x17,0x01,0x13,0x5b,0x6b,0x5f,0x38,0x2f,0x32,0x32,0x39,0x33,0x32,0x5c,0x2e,0x44,0x26,0x3b, -0x34,0x34,0x38,0x66,0x57,0x32,0x4f,0x66,0x07,0x5f,0x04,0x32,0x27,0x32,0x2e,0x35,0x24,0x20,0x78,0x47,0x51,0x44,0x2f,0x15,0x37,0x2a,0x6a,0x5c,0x05,0x2c,0x38,0x2c,0x23,0x4a,0x2c,0x38,0x2b,0x22,0x9a,0x53,0x47,0x22,0x28,0x2e,0x28,0x24,0x33,0x08,0x0f,0x08,0x34,0x4a,0x28,0x3a,0x48,0x07,0x02,0x0c,0x4c,0x38,0x4a,0x57,0x4e,0x43, -0x1e,0x23,0x2c,0x26,0x21,0x2e,0x06,0x17,0x0d,0x62,0x3d,0x3a,0x45,0x03,0x02,0x02,0x21,0x41,0x33,0x4e,0x5b,0x01,0x55,0x07,0x42,0x35,0x23,0x36,0x06,0x0d,0x08,0x40,0x33,0x26,0x38,0x06,0x00,0x03,0x00,0x2d,0x00,0x6e,0x02,0x2b,0x02,0xe4,0x00,0x11,0x00,0x23,0x00,0x3f,0x00,0x69,0xb1,0x06,0x64,0x44,0x40,0x5e,0x00,0x06,0x07,0x09, -0x07,0x06,0x09,0x80,0x00,0x09,0x08,0x07,0x09,0x08,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x00,0x08,0x0c,0x01,0x04,0x02,0x08,0x04,0x69,0x0b,0x01,0x02,0x00,0x00,0x02,0x59,0x0b,0x01,0x02,0x02,0x00,0x62,0x0a,0x01,0x00,0x02,0x00,0x52,0x25,0x24,0x13,0x12,0x01,0x00,0x3d,0x3c,0x3a, -0x38,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x24,0x3f,0x25,0x3f,0x1c,0x1a,0x12,0x23,0x13,0x23,0x0a,0x08,0x00,0x11,0x01,0x11,0x0d,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x15, -0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x2c,0x4c,0x73,0x40,0x40,0x73,0x4c,0x4d,0x72,0x40,0x40,0x72,0x4d,0x3c,0x5a,0x32,0x32,0x5a,0x3c,0x3c,0x5a,0x32,0x32,0x5a,0x41,0x38,0x45,0x45,0x38,0x38,0x44,0x41, -0x21,0x1a,0x1b,0x21,0x21,0x1b,0x1a,0x21,0x41,0x44,0x6e,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x32,0x2f,0x56,0x39,0x96,0x39,0x55,0x30,0x30,0x55,0x39,0x96,0x39,0x56,0x2f,0x55,0x3f,0x34,0x82,0x34,0x3f,0x3f,0x34,0x1b,0x21,0x21,0x1b,0x82,0x1b,0x21,0x21,0x1b,0x34,0x3f,0x00,0x00,0x04,0x00,0x2d, -0x00,0x6e,0x02,0x2b,0x02,0xe4,0x00,0x11,0x00,0x23,0x00,0x30,0x00,0x39,0x00,0x63,0xb1,0x06,0x64,0x44,0x40,0x58,0x2b,0x01,0x06,0x08,0x01,0x4c,0x0b,0x07,0x02,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x00,0x04,0x00,0x09,0x08,0x04,0x09,0x69,0x00,0x08,0x00,0x06,0x05,0x08,0x06,0x67,0x00,0x02, -0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x24,0x24,0x01,0x00,0x39,0x37,0x33,0x31,0x24,0x30,0x24,0x30,0x2f,0x2e,0x2d,0x2c,0x27,0x25,0x20,0x1e,0x17,0x15,0x0a,0x08,0x00,0x11,0x01,0x11,0x0c,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16, -0x15,0x15,0x14,0x06,0x06,0x25,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x17,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x2c,0x4c,0x73,0x40,0x40,0x73,0x4c,0x4d,0x72,0x40,0x40,0x72,0xfe,0xeb,0x32,0x5a,0x3c,0x3c, -0x5a,0x32,0x32,0x5a,0x3c,0x3c,0x5a,0x32,0x5a,0x72,0x36,0x3f,0x3c,0x42,0x40,0x3b,0x36,0x36,0x1a,0x1e,0x1e,0x1a,0x36,0x6e,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0xf0,0x39,0x56,0x2f,0x2f,0x56,0x39,0x96,0x39,0x55,0x30,0x30,0x55,0x39,0xfa,0x01,0x5e,0x39,0x30,0x45,0x1a,0x96,0x8c,0x8c,0xbe,0x1d, -0x1a,0x1a,0x1d,0x00,0x00,0x02,0x00,0x0f,0x01,0x72,0x02,0x35,0x02,0xda,0x00,0x07,0x00,0x26,0x00,0x4d,0x40,0x4a,0x22,0x19,0x02,0x00,0x01,0x0e,0x01,0x07,0x00,0x02,0x4c,0x00,0x07,0x00,0x03,0x00,0x07,0x03,0x80,0x0a,0x08,0x06,0x09,0x04,0x03,0x03,0x84,0x05,0x04,0x02,0x01,0x00,0x00,0x01,0x57,0x05,0x04,0x02,0x01,0x01,0x00,0x5f, -0x02,0x01,0x00,0x01,0x00,0x4f,0x08,0x08,0x00,0x00,0x08,0x26,0x08,0x26,0x1e,0x1d,0x15,0x14,0x13,0x12,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x0b,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x11,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x06,0x06,0x07,0x07,0x23, -0x27,0x26,0x26,0x27,0x16,0x16,0x15,0x15,0x73,0x64,0x01,0x04,0x64,0x87,0x50,0x22,0x05,0x09,0x02,0x02,0x07,0x05,0x21,0x4e,0x37,0x05,0x02,0x06,0x0e,0x03,0x1e,0x33,0x21,0x03,0x0e,0x06,0x02,0x06,0x01,0x72,0x01,0x36,0x32,0x32,0xfe,0xca,0x01,0x68,0x66,0x0e,0x2b,0x0e,0x0e,0x2b,0x0e,0x66,0xfe,0x98,0xdd,0x1c,0x3e,0x13,0x14,0x33, -0x09,0x67,0x68,0x09,0x32,0x14,0x13,0x3e,0x1c,0xdd,0x00,0x00,0x00,0x02,0x00,0x96,0x01,0xc2,0x01,0xc2,0x02,0xe4,0x00,0x0b,0x00,0x17,0x00,0x39,0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01, -0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x43,0x53,0x53,0x43,0x43,0x53,0x53,0x43,0x26,0x2f,0x2f,0x26,0x25,0x30,0x30,0x01,0xc2, -0x51,0x40,0x41,0x50,0x50,0x41,0x40,0x51,0x38,0x31,0x28,0x28,0x32,0x32,0x28,0x28,0x31,0x00,0x00,0x00,0xff,0xff,0x00,0xd2,0x01,0xa3,0x01,0x75,0x02,0xd5,0x03,0x07,0x03,0x2a,0x00,0x00,0x02,0x43,0x00,0x09,0xb1,0x00,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x69,0x01,0xa4,0x01,0xef,0x02,0xd6,0x00,0x27, -0x03,0x2a,0xff,0x97,0x02,0x44,0x01,0x07,0x03,0x2a,0x00,0x7a,0x02,0x44,0x00,0x12,0xb1,0x00,0x01,0xb8,0x02,0x44,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x44,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, -0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0xff,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x00,0x02,0x00,0xff,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f, -0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xff,0x5a,0x5a,0x5a,0x01,0xc2,0x01,0x7c,0xfe,0x84,0xfd,0xd0,0x01,0x7c,0xfe,0x84,0x00,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02, -0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x17,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0xff,0xaf,0xaf,0x5a,0xaf,0xaf,0x6e,0x02,0x76,0x50,0xe6, -0xe6,0x50,0xfd,0x8a,0x00,0x02,0x00,0x46,0x00,0x00,0x01,0xf4,0x02,0xe4,0x00,0x1e,0x00,0x28,0x00,0x38,0x40,0x35,0x20,0x1b,0x1a,0x13,0x07,0x06,0x05,0x04,0x08,0x02,0x03,0x01,0x4c,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x27,0x25, -0x18,0x16,0x0c,0x0a,0x00,0x1e,0x01,0x1e,0x05,0x06,0x16,0x2b,0x21,0x22,0x26,0x35,0x35,0x07,0x27,0x37,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x0e,0x02,0x03,0x15,0x37,0x36,0x35,0x35,0x34,0x23,0x22,0x06,0x01,0x51,0x4d,0x5a,0x46,0x1e,0x64,0x58,0x48,0x49,0x57,0x4f, -0x46,0x51,0x29,0x24,0x22,0x32,0x0b,0x44,0x09,0x2d,0x42,0x78,0x35,0x57,0x46,0x21,0x25,0x57,0x49,0x4a,0x1b,0x51,0x25,0x01,0x04,0x46,0x55,0x54,0x47,0x55,0x43,0x6c,0x1a,0x1f,0x6c,0x25,0x29,0x2a,0x13,0x2a,0x15,0x2f,0x21,0x02,0x49,0xe3,0x13,0x21,0x5a,0x55,0x49,0x26,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x13, -0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01,0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x17, -0x35,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x15,0xff,0xaf,0xaf,0xaf,0xaf,0x5a,0xaf,0xaf,0xaf,0xaf,0x6e,0xfa,0x50,0x01,0x22,0x50,0xf0,0xf0,0x50,0xfe,0xde,0x50,0xfa,0x00,0x00,0x00,0x03,0x00,0x1e,0x00,0x00,0x02,0x58,0x02,0xe4,0x00,0x0d,0x00,0x27,0x00,0x35,0x00,0x79,0x40,0x0a, -0x22,0x01,0x06,0x07,0x15,0x01,0x04,0x00,0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x0a,0x01,0x06,0x08,0x01,0x00,0x04,0x06,0x00,0x69,0x00,0x07,0x07,0x01,0x5f,0x03,0x02,0x02,0x01,0x01,0x38,0x4d,0x09,0x05,0x02,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x22,0x0a,0x01,0x06,0x08,0x01,0x00,0x04,0x06,0x00,0x69,0x03,0x01,0x02,0x02, -0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x09,0x05,0x02,0x04,0x04,0x39,0x04,0x4e,0x59,0x40,0x1f,0x29,0x28,0x0e,0x0e,0x01,0x00,0x30,0x2e,0x28,0x35,0x29,0x35,0x0e,0x27,0x0e,0x27,0x1d,0x1c,0x1b,0x1a,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x0b,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32, -0x16,0x15,0x15,0x14,0x06,0x01,0x11,0x33,0x13,0x1e,0x02,0x17,0x2e,0x02,0x35,0x11,0x33,0x11,0x23,0x03,0x2e,0x02,0x27,0x1e,0x02,0x15,0x11,0x01,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0xf9,0x28,0x37,0x37,0x28,0x29,0x36,0x36,0xfd,0xfc,0x5f,0x75,0x06,0x10,0x11,0x06,0x02,0x06,0x04,0x46,0x5f,0x72, -0x05,0x11,0x11,0x07,0x02,0x05,0x03,0x01,0x95,0x0e,0x15,0x15,0x0e,0x0d,0x16,0x16,0x01,0x2c,0x3a,0x2f,0xe6,0x2f,0x3a,0x3a,0x2f,0xe6,0x2f,0x3a,0xfe,0xd4,0x02,0xda,0xfe,0x3b,0x15,0x44,0x4a,0x1d,0x1d,0x4c,0x4b,0x19,0x01,0xb8,0xfd,0x26,0x01,0xc6,0x17,0x44,0x49,0x1c,0x1c,0x4b,0x4b,0x1c,0xfe,0x48,0x01,0x63,0x12,0x16,0xfa,0x12, -0x16,0x16,0x12,0xfa,0x16,0x12,0x00,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x1c,0x02,0xe4,0x00,0x1a,0x00,0x23,0x00,0x4c,0x40,0x49,0x1e,0x1b,0x02,0x05,0x06,0x10,0x01,0x03,0x04,0x02,0x4c,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x00,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x03,0x00, -0x00,0x03,0x59,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x01,0x00,0x22,0x20,0x1d,0x1c,0x17,0x16,0x14,0x12,0x0f,0x0e,0x0a,0x08,0x00,0x1a,0x01,0x1a,0x08,0x06,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x21,0x11,0x16,0x16,0x33,0x32,0x36,0x37,0x33,0x0e,0x02,0x03,0x15, -0x21,0x35,0x26,0x26,0x23,0x22,0x06,0x01,0x2c,0x47,0x6d,0x3c,0x3c,0x6d,0x47,0x49,0x6b,0x3c,0xfe,0x84,0x0c,0x49,0x37,0x3b,0x62,0x14,0x32,0x10,0x44,0x5b,0xc0,0x01,0x18,0x0c,0x48,0x38,0x37,0x49,0x0a,0x41,0x76,0x4d,0xe6,0x4e,0x75,0x41,0x41,0x74,0x4f,0x79,0xfe,0xfd,0x15,0x2c,0x3d,0x31,0x2e,0x46,0x27,0x02,0x80,0xdd,0xdd,0x15, -0x2c,0x2c,0x00,0x00,0x00,0x04,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x25,0x00,0x57,0x40,0x54,0x07,0x01,0x05,0x02,0x01,0x4c,0x00,0x06,0x01,0x07,0x01,0x06,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x09,0x01,0x01,0x06,0x04,0x01, -0x67,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01,0x08,0x07,0x08,0x4f,0x20,0x20,0x00,0x00,0x20,0x25,0x20,0x25,0x24,0x23,0x22,0x21,0x1f,0x1d,0x19,0x17,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0c,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32, -0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0xab,0x42,0xde,0x01,0x8b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19, -0xdb,0x19,0x13,0x13,0x17,0xfd,0xe5,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x00,0x00,0x00,0x07,0x00,0x49,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x18,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x60,0x04,0x01,0x03,0x01,0x03,0x50,0x1b,0x40,0x17,0x02,0x01,0x00,0x01, -0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x60,0x04,0x01,0x03,0x01,0x03,0x50,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x28,0x5a,0x01,0x54,0x5a,0xb4,0xb4,0x64,0x64,0xb4,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,0x56,0x02,0x4e, -0x02,0x89,0x00,0x06,0x00,0x20,0x00,0x47,0x40,0x44,0x05,0x02,0x01,0x03,0x02,0x04,0x06,0x01,0x03,0x02,0x02,0x4c,0x00,0x00,0x05,0x00,0x85,0x00,0x02,0x04,0x03,0x04,0x02,0x03,0x80,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x00,0x03,0x01,0x01,0x03,0x59,0x00,0x03,0x03,0x01,0x61,0x06,0x01,0x01,0x03,0x01,0x51,0x08,0x07,0x1a,0x19, -0x18,0x17,0x11,0x0f,0x0c,0x0b,0x07,0x20,0x08,0x20,0x13,0x07,0x06,0x17,0x2b,0x01,0x27,0x07,0x35,0x33,0x07,0x17,0x07,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x55,0xe1,0x60,0xf9,0x65,0xe2,0x4f,0x4e,0x7d,0x48,0x4e,0x33,0x5a,0x38,0x39, -0x59,0x33,0x33,0x59,0x39,0x4f,0x7c,0x48,0x48,0x7c,0x01,0x18,0xd8,0x60,0xf9,0x65,0xd8,0xf6,0x47,0x7c,0x4d,0x39,0x5a,0x35,0x35,0x5a,0x39,0x39,0x5b,0x34,0x47,0x47,0x7a,0x4e,0x4d,0x7c,0x47,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x02,0x2b,0x02,0xdf,0x00,0x1b,0x00,0x2d,0x00,0x60,0x40,0x5d,0x28,0x1f,0x02,0x08,0x06,0x01, -0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x61,0x0a,0x01,0x00,0x04,0x00,0x51,0x1c,0x1c,0x01,0x00,0x1c,0x2d,0x1c,0x2d, -0x27,0x26,0x25,0x24,0x1e,0x1d,0x19,0x18,0x16,0x14,0x10,0x0e,0x0c,0x0b,0x09,0x07,0x00,0x1b,0x01,0x1b,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03, -0x1e,0x02,0x15,0x15,0xcf,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a,0x13,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x86,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0xfe,0x7a,0x01,0x4f, -0xfe,0xf7,0x1e,0x26,0x30,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0x00,0x03,0x00,0x20,0x00,0x00,0x02,0x3f,0x02,0xdf,0x00,0x1b,0x00,0x29,0x00,0x32,0x00,0x6b,0x40,0x68,0x24,0x01,0x08,0x0a,0x01,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x0d,0x09,0x02,0x07,0x08,0x07,0x86, -0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x0c,0x01,0x00,0x06,0x04,0x00,0x69,0x00,0x06,0x00,0x0b,0x0a,0x06,0x0b,0x68,0x00,0x0a,0x08,0x08,0x0a,0x57,0x00,0x0a,0x0a,0x08,0x5f,0x00,0x08,0x0a,0x08,0x4f,0x1c,0x1c,0x01,0x00,0x32,0x30,0x2c,0x2a,0x1c,0x29,0x1c,0x29,0x28,0x27,0x26,0x25,0x1f,0x1d,0x19,0x18,0x16,0x14,0x10, -0x0e,0x0c,0x0b,0x09,0x07,0x00,0x1b,0x01,0x1b,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23, -0xcf,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a,0x13,0xc6,0x38,0x44,0x34,0x2b,0x67,0x50,0x64,0x54,0x85,0x19,0x1f,0x1e,0x19,0x86,0x01,0x86,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0xfe,0x7a,0x01,0x4f, -0x3d,0x2f,0x28,0x32,0x06,0x83,0x81,0x81,0xb3,0x1b,0x15,0x16,0x1c,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0xd6,0x02,0x35,0x02,0xe4,0x00,0x05,0x00,0x18,0x40,0x15,0x04,0x01,0x02,0x00,0x4a,0x02,0x01,0x02,0x00,0x00,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x13,0x01,0x01,0x23,0x27,0x07,0x23,0x01,0x09,0x01, -0x09,0x6e,0x9a,0x9e,0x01,0xd6,0x01,0x0e,0xfe,0xf2,0xa2,0xa2,0x00,0x01,0x00,0xc3,0xff,0x92,0x01,0xef,0x00,0xbe,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x37,0x33,0x15,0x33,0x15,0x21,0xc3,0x5a, -0xd2,0xfe,0xd4,0xbe,0xdc,0x50,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x92,0x01,0x95,0x00,0xbe,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x25,0x11,0x21,0x35,0x33,0x35, -0x01,0x95,0xfe,0xd4,0xd2,0xbe,0xfe,0xd4,0x50,0xdc,0x00,0x00,0x00,0x01,0x00,0x69,0x02,0x12,0x01,0x95,0x03,0x3e,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x35,0x23,0x35,0x21,0x01,0x95, -0x5a,0xd2,0x01,0x2c,0x02,0x12,0xdc,0x50,0x00,0x01,0x00,0xc3,0x02,0x12,0x01,0xef,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x15, -0xc3,0x01,0x2c,0xd2,0x02,0x12,0x01,0x2c,0x50,0xdc,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1f,0x00,0x54,0x40,0x51,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x0a,0x01,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x00,0x08,0x09,0x07,0x08, -0x67,0x0b,0x01,0x09,0x04,0x04,0x09,0x57,0x0b,0x01,0x09,0x09,0x04,0x5f,0x00,0x04,0x09,0x04,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0c,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32, -0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x01,0xb7,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x9a,0x3a,0x01,0x4f,0x3a,0x56, -0x2f,0x56,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x19,0x00,0x45,0x40,0x42,0x00,0x04,0x01,0x05,0x01,0x04,0x05,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x07,0x01,0x01,0x04,0x02,0x01,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01,0x06,0x05, -0x06,0x4f,0x14,0x14,0x00,0x00,0x14,0x19,0x14,0x19,0x18,0x17,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d, -0x3e,0x3e,0x2d,0x54,0xab,0x42,0xde,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x0e,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1f,0x00,0x58,0x40,0x55,0x1a,0x17,0x02,0x06,0x07,0x01,0x4c,0x00,0x05,0x01,0x07,0x01, -0x05,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x09,0x01,0x01,0x05,0x02,0x01,0x67,0x00,0x07,0x06,0x08,0x07,0x57,0x00,0x06,0x00,0x04,0x08,0x06,0x04,0x67,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01,0x08,0x07,0x08,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1e,0x1d,0x1c,0x1b,0x19,0x18,0x16,0x15,0x13,0x11,0x0d, -0x0b,0x00,0x0a,0x00,0x09,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x01,0x5f,0xcd,0xa3,0x4e,0xb2,0x8e, -0x40,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60,0x42,0x59,0xb4,0xc7,0x0a,0x63,0xe1,0x00,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1e,0x00,0x51,0x40,0x4e,0x19,0x18,0x17,0x03,0x04,0x05,0x01,0x4c,0x00,0x05,0x01,0x04,0x01,0x05,0x04,0x80, -0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x08,0x01,0x01,0x05,0x02,0x01,0x67,0x06,0x01,0x04,0x07,0x07,0x04,0x57,0x06,0x01,0x04,0x04,0x07,0x5f,0x09,0x01,0x07,0x04,0x07,0x4f,0x14,0x14,0x00,0x00,0x14,0x1e,0x14,0x1e,0x1d,0x1c,0x1b,0x1a,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0a,0x06,0x17,0x2b,0x13, -0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x35,0x33,0x35,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x94,0x83,0x7a,0x61,0x5b,0x68,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31, -0x31,0x3d,0xfd,0x60,0x3c,0xd8,0x57,0x4b,0x47,0xfe,0xed,0x3c,0x00,0x03,0x00,0x2d,0xff,0xfb,0x02,0x15,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2e,0x00,0xa6,0xb7,0x29,0x28,0x23,0x03,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x38,0x00,0x07,0x08,0x05,0x08,0x07,0x72,0x00,0x05,0x06,0x08,0x05,0x06,0x7e,0x00,0x00,0x00,0x03, -0x02,0x00,0x03,0x67,0x00,0x02,0x0a,0x01,0x01,0x09,0x02,0x01,0x67,0x00,0x09,0x00,0x08,0x07,0x09,0x08,0x67,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x1b,0x40,0x39,0x00,0x07,0x08,0x05,0x08,0x07,0x05,0x80,0x00,0x05,0x06,0x08,0x05,0x06,0x7e,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67, -0x00,0x02,0x0a,0x01,0x01,0x09,0x02,0x01,0x67,0x00,0x09,0x00,0x08,0x07,0x09,0x08,0x67,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x59,0x40,0x1e,0x15,0x14,0x00,0x00,0x27,0x26,0x25,0x24,0x22,0x20,0x1c,0x1a,0x18,0x17,0x14,0x2e,0x15,0x2e,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21, -0x0c,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e, -0x2d,0x54,0x01,0x11,0x42,0x52,0x42,0x2d,0x25,0x25,0x2e,0x2d,0x25,0x1e,0x56,0xba,0xfa,0x4c,0x2f,0x39,0x53,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x5b,0x4a,0x3a,0x21,0x29,0x20,0x19,0x19,0x1e,0x35,0x39,0x3c,0x46,0x34,0x08,0x37,0x28,0x32,0x41,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x22, -0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2c,0x00,0x57,0x40,0x54,0x15,0x01,0x07,0x05,0x01,0x4c,0x00,0x05,0x04,0x07,0x04,0x05,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x09,0x01,0x01,0x06,0x02,0x01,0x67,0x00,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01, -0x08,0x07,0x08,0x4f,0x14,0x14,0x00,0x00,0x14,0x2c,0x14,0x2c,0x2b,0x2a,0x24,0x22,0x20,0x1f,0x1d,0x1b,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06, -0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x9b,0x9a,0x17,0x1c,0x26,0x23,0x25,0x2c,0x42,0x03,0x50,0x40,0x41,0x4a,0x2c,0x24,0x54,0xad,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60, -0x3e,0x5b,0x0e,0x20,0x11,0x1e,0x23,0x2a,0x24,0x3f,0x4a,0x42,0x38,0x23,0x3a,0x14,0x2d,0x3c,0x00,0x00,0x00,0x05,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x16,0x00,0x1f,0x00,0x26,0x00,0x2d,0x00,0x40,0x40,0x3d,0x2c,0x2b,0x23,0x22,0x04,0x00,0x04,0x01,0x4c,0x05,0x01,0x00,0x04,0x00,0x86,0x00,0x01,0x06,0x01,0x02, -0x03,0x01,0x02,0x69,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x11,0x10,0x01,0x00,0x1c,0x1b,0x14,0x13,0x10,0x16,0x11,0x16,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x21,0x26, -0x26,0x03,0x36,0x36,0x37,0x37,0x21,0x17,0x16,0x16,0x25,0x34,0x27,0x03,0x3e,0x02,0x25,0x14,0x16,0x16,0x17,0x03,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x45,0x70,0x23,0x01,0xb0,0x23,0x70,0x45,0x0c,0x1b,0x0d,0x88,0xfe,0x89,0x88,0x0d,0x1a,0x01,0x10,0x14,0xd6,0x43,0x6a,0x3d,0xfd,0xf8,0x3c, -0x68,0x42,0xd3,0x13,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x3c,0x33,0x33,0x3c,0xfe,0x20,0x17,0x2f,0x16,0xe8,0xe8,0x16,0x2f,0xc5,0x37,0x30,0xfe,0x96,0x06,0x47,0x70,0x46,0x45,0x70,0x46,0x07,0x01,0x67,0x2f,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x25,0x00,0x5f, -0x40,0x5c,0x20,0x1d,0x12,0x03,0x09,0x06,0x01,0x4c,0x07,0x01,0x06,0x00,0x09,0x00,0x06,0x09,0x80,0x00,0x09,0x08,0x00,0x09,0x08,0x7e,0x0c,0x0a,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0b,0x01,0x05,0x00,0x00,0x05,0x57,0x0b,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05, -0x00,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x25,0x0c,0x25,0x1f,0x1e,0x19,0x18,0x17,0x16,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0d,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x07,0x23,0x27, -0x1e,0x02,0x15,0x15,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x70,0x5b,0x37,0x0a,0x0b,0x04,0x04,0x0c,0x0a,0x35,0x5a,0x40,0x04,0x0a,0x56,0x43,0x58,0x05,0x07,0x04,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x4f,0x7b,0x16,0x1b,0x11,0x11,0x1a,0x18,0x7a,0xfe,0xb1,0x5f,0x44,0x61,0x26,0xca,0xc7,0x19,0x35, -0x46,0x34,0x5f,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x23,0x00,0x57,0x40,0x54,0x1f,0x19,0x13,0x0d,0x04,0x08,0x06,0x01,0x4c,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0a,0x01, -0x05,0x00,0x00,0x05,0x57,0x0a,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05,0x00,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x23,0x0c,0x23,0x1b,0x1a,0x18,0x17,0x0f,0x0e,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x37,0x27,0x33,0x17,0x16,0x16,0x17,0x36, -0x36,0x37,0x37,0x33,0x07,0x17,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x70,0x7e,0x7d,0x4e,0x42,0x0d,0x08,0x07,0x05,0x09,0x0c,0x40,0x4d,0x7d,0x7d,0x4f,0x41,0x0d,0x0a,0x06,0x05,0x06,0x0d,0x42,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0xa9,0xa6,0x56,0x10,0x18, -0x0e,0x0e,0x18,0x10,0x56,0xa8,0xa7,0x55,0x11,0x1a,0x0d,0x0d,0x19,0x11,0x56,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0b,0x00,0x13,0x00,0x4d,0x40,0x4a,0x0b,0x01,0x09,0x06,0x09,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0a,0x01,0x05,0x00,0x00,0x07,0x05,0x00, -0x67,0x00,0x07,0x06,0x06,0x07,0x57,0x00,0x07,0x07,0x06,0x5f,0x08,0x01,0x06,0x07,0x06,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x13,0x0c,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x23,0x35,0x21,0x15,0x23, -0x11,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0xf9,0x98,0x01,0x72,0x98,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x04,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x61,0x40,0x5e,0x13,0x01,0x0b,0x08,0x01,0x4c,0x00,0x01,0x00,0x02, -0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x06,0x05,0x00,0x67,0x00,0x06,0x00,0x09,0x08,0x06,0x09,0x67,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x0a,0x07,0x07,0x0a,0x57,0x00,0x0a,0x0a,0x07,0x5f,0x0d,0x01,0x07,0x0a,0x07,0x4f,0x0c,0x0c,0x00,0x00,0x2b,0x29,0x25,0x23,0x22,0x20, -0x1c,0x1a,0x0c,0x19,0x0c,0x18,0x0f,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23, -0x23,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x7f,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19,0xdb,0x19,0x13,0x13,0x17, -0x00,0x02,0x00,0x34,0xff,0xc6,0x02,0x46,0x02,0xda,0x00,0x0b,0x00,0x2f,0x00,0xb7,0x40,0x0c,0x29,0x1b,0x1a,0x03,0x09,0x0a,0x2e,0x01,0x06,0x09,0x02,0x4c,0x4b,0xb0,0x12,0x50,0x58,0x40,0x3e,0x00,0x0a,0x08,0x09,0x09,0x0a,0x72,0x00,0x0b,0x06,0x0b,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04, -0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07,0x00,0x08,0x0a,0x07,0x08,0x69,0x00,0x09,0x06,0x06,0x09,0x59,0x00,0x09,0x09,0x06,0x62,0x0d,0x01,0x06,0x09,0x06,0x52,0x1b,0x40,0x3f,0x00,0x0a,0x08,0x09,0x08,0x0a,0x09,0x80,0x00,0x0b,0x06,0x0b,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05, -0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07,0x00,0x08,0x0a,0x07,0x08,0x69,0x00,0x09,0x06,0x06,0x09,0x59,0x00,0x09,0x09,0x06,0x62,0x0d,0x01,0x06,0x09,0x06,0x52,0x59,0x40,0x1e,0x0d,0x0c,0x00,0x00,0x2d,0x2c,0x2b,0x2a,0x28,0x26,0x22,0x20,0x15,0x13,0x0c,0x2f,0x0d,0x2f,0x00,0x0b,0x00,0x0b,0x11,0x11, -0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x27,0x33,0x17,0x23,0x27,0x06,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca, -0x01,0x1a,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x32,0x4f,0x2e,0x21,0x2d,0x05,0x05,0x3e,0x2d,0x2d,0x3e,0x3e,0x2d,0x0a,0x09,0x36,0x4b,0x8e,0x4b,0x30,0x1c,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x36,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x2d,0x4e,0x32,0x3a,0x2e,0x36,0x0b,0x1a,0x0d,0x31,0x41,0x41,0x31,0x31,0x41,0x02,0x46,0xb7, -0x3e,0x09,0x00,0x00,0x00,0x02,0x00,0x34,0xff,0xfb,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x27,0x00,0x62,0x40,0x5f,0x00,0x08,0x09,0x0b,0x09,0x08,0x0b,0x80,0x00,0x0b,0x0a,0x09,0x0b,0x0a,0x7e,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07, -0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x0a,0x06,0x06,0x0a,0x59,0x00,0x0a,0x0a,0x06,0x61,0x0d,0x01,0x06,0x0a,0x06,0x51,0x0d,0x0c,0x00,0x00,0x25,0x24,0x22,0x20,0x1c,0x1a,0x18,0x17,0x15,0x13,0x0c,0x27,0x0d,0x27,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15, -0x23,0x15,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x01,0x21,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a, -0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x36,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x09,0x00,0x35,0x00,0x61,0x40,0x5e,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x09,0x0a,0x06,0x0a, -0x09,0x06,0x80,0x00,0x06,0x07,0x0a,0x06,0x07,0x7e,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x08,0x00,0x0a,0x09,0x08,0x0a,0x69,0x00,0x07,0x05,0x05,0x07,0x59,0x00,0x07,0x07,0x05,0x61,0x0c,0x01,0x05,0x07,0x05,0x51,0x0b,0x0a,0x00,0x00,0x29,0x26,0x24,0x23,0x21,0x1e,0x13,0x10,0x0e, -0x0d,0x0a,0x35,0x0b,0x34,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x0d,0x06,0x1a,0x2b,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17, -0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x3e,0x01,0x2a,0xe8,0xca,0xca,0x01,0x04,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x3a,0x56,0x3a,0x85,0xfe,0x71,0x3a,0x31,0x16,0x1b, -0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x09,0x00,0x13,0x00,0x55,0x40,0x52,0x0a,0x01,0x04,0x03,0x05,0x03,0x04,0x05,0x80,0x0b,0x01,0x09,0x08,0x09,0x86,0x00,0x00,0x00, -0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x07,0x08,0x4f,0x0a,0x0a,0x00,0x00,0x0a,0x13,0x0a,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x0c,0x06,0x1a, -0x2b,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x3e,0x01,0x2a,0xe8,0xca,0xca,0x86,0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0x3a,0x56,0x3a,0x85,0xfe,0x75,0x01,0x4f,0x3a,0x56,0x3a,0x85,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0xff,0xfc,0x02,0x2f,0x02,0xdf,0x00,0x1f, -0x00,0x4b,0x00,0x65,0x40,0x62,0x00,0x01,0x02,0x05,0x02,0x01,0x05,0x80,0x00,0x0b,0x0c,0x08,0x0c,0x0b,0x08,0x80,0x00,0x08,0x09,0x0c,0x08,0x09,0x7e,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x69,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x03,0x00,0x06,0x0a,0x03,0x06,0x69,0x00,0x0a,0x00,0x0c,0x0b,0x0a,0x0c,0x69,0x00,0x09,0x07, -0x07,0x09,0x59,0x00,0x09,0x09,0x07,0x61,0x0d,0x01,0x07,0x09,0x07,0x51,0x21,0x20,0x3f,0x3c,0x3a,0x39,0x37,0x34,0x29,0x26,0x24,0x23,0x20,0x4b,0x21,0x4a,0x24,0x11,0x12,0x24,0x22,0x12,0x23,0x0e,0x06,0x1d,0x2b,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x23,0x35, -0x33,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x2e,0x4f,0x32,0x39,0x59,0x10,0x44,0x0b,0x34,0x1f, -0x2e,0x3d,0x3d,0x2e,0x20,0x36,0x0d,0x63,0xa7,0x2c,0x4b,0x30,0x32,0x4f,0x2e,0x01,0x64,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x02,0x32,0x32,0x4e,0x2d,0x3d,0x2d,0x14,0x1c,0x41,0x32,0x31, -0x41,0x20,0x27,0x39,0x0e,0x33,0x4d,0x2c,0x2d,0x4e,0xfd,0xfb,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0b,0x00,0x13,0x00,0x4c,0x40,0x49,0x02,0x01, -0x00,0x01,0x00,0x85,0x0a,0x05,0x02,0x03,0x04,0x07,0x04,0x03,0x07,0x80,0x0b,0x01,0x09,0x06,0x09,0x86,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x07,0x06,0x06,0x07,0x57,0x00,0x07,0x07,0x06,0x5f,0x08,0x01,0x06,0x07,0x06,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x13,0x0c,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11, -0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x13,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x15,0x01,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x2d,0x42,0xb2,0x42,0x42,0xb2,0x01,0x00,0x98,0x01,0x72,0x98,0x01,0x8b,0x01,0x4f,0x84,0x84,0xfe,0xb1,0x8f,0x8f,0xfe,0x75,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x00,0x00,0x04,0xff,0xf6, -0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x21,0x00,0x27,0x00,0x2d,0x00,0x50,0x40,0x4d,0x2c,0x23,0x19,0x03,0x00,0x05,0x01,0x4c,0x07,0x01,0x00,0x05,0x00,0x86,0x00,0x01,0x08,0x01,0x02,0x03,0x01,0x02,0x69,0x04,0x01,0x03,0x05,0x05,0x03,0x57,0x04,0x01,0x03,0x03,0x05,0x5f,0x0a,0x06,0x09,0x03,0x05,0x03,0x05,0x4f,0x28,0x28, -0x22,0x22,0x11,0x10,0x01,0x00,0x28,0x2d,0x28,0x2d,0x22,0x27,0x22,0x27,0x1e,0x1d,0x15,0x14,0x10,0x21,0x11,0x21,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0b,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x06,0x07,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x2e, -0x02,0x13,0x07,0x3e,0x02,0x37,0x21,0x1e,0x02,0x17,0x27,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x46,0x71,0x47,0x05,0x77,0x59,0x0e,0x19,0x0c,0x0c,0x1b,0x0d,0x59,0x76,0x05,0x47,0x71,0x60,0x8c,0x40,0x66,0x3e,0x05,0xfd,0xfa,0x05,0x3d,0x64,0x3f,0x8b,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c, -0x59,0x58,0x8d,0x51,0x02,0x3a,0x3e,0x6b,0x44,0x97,0x16,0x2f,0x17,0x17,0x2f,0x16,0x97,0x44,0x6b,0x3e,0xfe,0xe6,0xed,0x06,0x40,0x67,0x40,0x40,0x66,0x40,0x06,0xec,0x00,0x02,0x00,0x51,0x00,0x00,0x02,0x07,0x02,0x30,0x00,0x04,0x00,0x09,0x00,0x28,0x40,0x25,0x09,0x08,0x07,0x03,0x02,0x01,0x06,0x01,0x4a,0x00,0x01,0x00,0x00,0x01, -0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x06,0x05,0x00,0x04,0x00,0x04,0x03,0x06,0x16,0x2b,0x33,0x11,0x37,0x17,0x11,0x25,0x21,0x11,0x27,0x07,0x51,0xdb,0xdb,0xfe,0x7c,0x01,0x52,0xa9,0xa9,0x01,0x5b,0xd5,0xd5,0xfe,0xa5,0x32,0x01,0x11,0xa5,0xa5,0x00,0x00,0x00,0x04,0x00,0x14,0x00,0x00,0x02,0x44, -0x03,0x16,0x00,0x06,0x00,0x0d,0x00,0x17,0x00,0x1b,0x00,0x53,0x40,0x50,0x08,0x06,0x02,0x03,0x4a,0x0a,0x05,0x02,0x03,0x02,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x00,0x01,0x07,0x04,0x01,0x67,0x0b,0x01,0x07,0x0c,0x01,0x09,0x08,0x07,0x09,0x67,0x00,0x08,0x06,0x06,0x08,0x57,0x00,0x08,0x08,0x06,0x5f,0x00,0x06,0x08,0x06,0x4f, -0x18,0x18,0x0e,0x0e,0x07,0x07,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x0e,0x17,0x0e,0x17,0x14,0x11,0x07,0x0d,0x07,0x0d,0x11,0x14,0x11,0x11,0x10,0x0d,0x06,0x1b,0x2b,0x01,0x23,0x15,0x23,0x35,0x23,0x01,0x13,0x27,0x07,0x33,0x15,0x33,0x35,0x13,0x15,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x35,0x17,0x15,0x33,0x35,0x02,0x44,0x9b,0xfa,0x9b, -0x01,0x18,0xba,0xba,0xba,0x6c,0x9c,0x2f,0x21,0x1b,0x82,0x1b,0x21,0x2f,0x9c,0x01,0xe5,0xd6,0xd6,0x01,0x31,0xfe,0xf5,0xcd,0xcd,0xd6,0xd6,0xfe,0xb4,0x83,0x1b,0x21,0x21,0x1b,0x83,0x26,0x71,0x71,0x00,0x00,0x00,0x02,0xff,0x5b,0x00,0x41,0x02,0x8f,0x02,0xa3,0x00,0x0a,0x00,0x16,0x00,0x29,0x40,0x26,0x16,0x15,0x14,0x13,0x12,0x11, -0x10,0x0f,0x0e,0x0d,0x0c,0x02,0x0c,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x05,0x03,0x00,0x0a,0x01,0x0a,0x03,0x06,0x16,0x2b,0x25,0x21,0x01,0x01,0x21,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x27,0x37,0x27,0x07,0x27,0x07,0x17,0x07,0x17,0x37,0x17,0x02,0x2e,0xfe,0x5c,0xfe,0xd1,0x01,0x33, -0x01,0xa0,0x2c,0x35,0x35,0x17,0x9e,0x9b,0x43,0x9b,0x9a,0x48,0x9c,0x99,0x45,0x98,0x9b,0x41,0x01,0x2c,0x01,0x36,0x36,0x2c,0xfe,0x62,0x2b,0x37,0x96,0x9c,0x9c,0x43,0x9b,0x9b,0x47,0x9c,0x99,0x44,0x99,0x9b,0x00,0x02,0xff,0xc9,0x00,0x41,0x02,0xfd,0x02,0xa3,0x00,0x0a,0x00,0x16,0x00,0x29,0x40,0x26,0x16,0x15,0x14,0x13,0x12,0x11, -0x10,0x0f,0x0e,0x0d,0x0c,0x09,0x0c,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x08,0x06,0x00,0x0a,0x01,0x0a,0x03,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x01,0x01,0x25,0x17,0x37,0x17,0x37,0x27,0x37,0x27,0x07,0x27,0x07,0x17,0x2a,0x2b,0x36,0x36,0x2b,0x01,0xa0,0x01, -0x33,0xfe,0xd1,0xfe,0x47,0x48,0x9b,0x98,0x45,0x99,0x9c,0x48,0x9a,0x9b,0x43,0x9b,0x41,0x37,0x2b,0x01,0x9e,0x2c,0x36,0xfe,0xca,0xfe,0xd4,0x96,0x47,0x9b,0x99,0x44,0x99,0x9c,0x47,0x9b,0x9b,0x43,0x9c,0x00,0x00,0x09,0xff,0xa9,0x00,0x41,0x02,0xaf,0x02,0xa3,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1d,0x00,0x21,0x00,0x25,0x00,0x29, -0x00,0x2d,0x00,0x31,0x00,0x64,0x40,0x61,0x00,0x01,0x0a,0x07,0x05,0x03,0x03,0x02,0x01,0x03,0x67,0x09,0x08,0x04,0x03,0x02,0x10,0x0e,0x02,0x0c,0x06,0x02,0x0c,0x67,0x0f,0x0d,0x0b,0x03,0x06,0x00,0x12,0x11,0x06,0x12,0x67,0x00,0x11,0x00,0x00,0x11,0x57,0x00,0x11,0x11,0x00,0x60,0x13,0x01,0x00,0x11,0x00,0x50,0x01,0x00,0x31,0x30, -0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x09,0x06,0x00,0x0f,0x01,0x0e,0x14,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x33,0x35,0x23,0x17,0x33, -0x35,0x23,0x01,0x33,0x11,0x23,0x15,0x33,0x23,0x33,0x35,0x23,0x03,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x01,0x21,0x35,0x21,0x14,0x2f,0x3c,0x36,0x2b,0x02,0x44,0x2c,0x35,0x35,0x2c,0xfd,0x9f,0x6c,0x6c,0x98,0x6c,0x6c,0x01,0x7a,0x6c,0xb6,0x4a,0xe2,0x6c,0x6c,0xe6,0x6c,0x6c,0x98,0x6c,0x6c,0x98,0x6c,0x6c,0xfe, -0x86,0x01,0xe6,0xfe,0x1a,0x41,0x3c,0x2f,0x01,0x95,0x2c,0x36,0x36,0x2c,0xfe,0x61,0x2b,0x36,0x01,0x9e,0x80,0x80,0x80,0xfe,0xd4,0x01,0x2c,0x80,0x80,0xfe,0xd4,0x80,0x80,0x80,0x80,0x80,0xfe,0xd4,0x80,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x01,0x07,0x05,0x02, -0x00,0x02,0x01,0x00,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x21,0x03,0x23,0x35,0x33,0x13,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x69,0xbc,0xa3,0xe5,0xbd,0xa2,0xcc,0xcc, -0x02,0x8a,0x50,0xfd,0x76,0x50,0x02,0x8a,0x50,0x50,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0xe2,0x01,0xf4,0x02,0xdb,0x00,0x16,0x00,0x3f,0x40,0x3c,0x12,0x01,0x08,0x49,0x00,0x03,0x02,0x03,0x85,0x09,0x01,0x08,0x07,0x08,0x86,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x06,0x01,0x00,0x07,0x07,0x00,0x57,0x06,0x01,0x00,0x00, -0x07,0x5f,0x0a,0x01,0x07,0x00,0x07,0x4f,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x0b,0x06,0x1f,0x2b,0x13,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x07,0x27,0x33,0x35,0x23,0x6e,0x93,0x93,0x93,0x56,0x93,0x93,0x93,0x93,0x9d,0xc2,0xce,0x9d,0x93,0x01,0x94, -0x59,0x50,0x9e,0x9e,0x50,0x59,0x50,0x7e,0xe4,0xe4,0x7e,0x00,0x00,0x01,0x00,0x64,0xff,0xff,0x01,0xf4,0x02,0xf8,0x00,0x16,0x00,0x44,0x40,0x41,0x05,0x01,0x01,0x4a,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x07,0x06,0x07,0x86,0x03,0x01,0x00,0x0b,0x0a,0x02,0x04,0x05,0x00,0x04,0x67,0x09,0x01,0x05,0x06,0x06,0x05,0x57,0x09,0x01,0x05, -0x05,0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x15,0x14,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x0c,0x06,0x1f,0x2b,0x13,0x35,0x33,0x35,0x23,0x37,0x17,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x6e,0x93,0x9d,0xce,0xc2,0x9d,0x93,0x93,0x93,0x93,0x56, -0x93,0x93,0x01,0x46,0x50,0x7e,0xe4,0xe4,0x7e,0x50,0x59,0x50,0x9e,0x9e,0x50,0x59,0x00,0x06,0x00,0x00,0x00,0x48,0x02,0x58,0x02,0x9c,0x00,0x0a,0x00,0x0e,0x00,0x19,0x00,0x24,0x00,0x2f,0x00,0x5f,0x00,0x6e,0x40,0x6b,0x0f,0x01,0x0d,0x05,0x01,0x01,0x00,0x0d,0x01,0x69,0x0e,0x14,0x04,0x03,0x00,0x10,0x0c,0x02,0x03,0x02,0x00,0x03, -0x69,0x11,0x0b,0x02,0x02,0x13,0x08,0x15,0x03,0x06,0x07,0x02,0x06,0x69,0x09,0x01,0x07,0x0a,0x0a,0x07,0x59,0x09,0x01,0x07,0x07,0x0a,0x61,0x12,0x16,0x02,0x0a,0x07,0x0a,0x51,0x31,0x30,0x1b,0x1a,0x10,0x0f,0x5c,0x5b,0x58,0x56,0x52,0x50,0x4f,0x4d,0x49,0x47,0x44,0x43,0x40,0x3e,0x3a,0x38,0x37,0x35,0x30,0x5f,0x31,0x5f,0x2e,0x2c, -0x28,0x26,0x20,0x1e,0x1a,0x24,0x1b,0x24,0x15,0x13,0x0f,0x19,0x10,0x19,0x11,0x12,0x24,0x21,0x17,0x06,0x1a,0x2b,0x01,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x33,0x35,0x23,0x27,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x35,0x23,0x22,0x06, -0x15,0x14,0x16,0x33,0x32,0x36,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x23,0x15,0x14,0x06,0x01,0x9c,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0xa6, -0x6c,0x6c,0x7b,0x41,0x25,0x1c,0x1c,0x25,0x25,0x01,0x7e,0x41,0x25,0x1c,0x1c,0x25,0x25,0xfe,0xc3,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0x41,0x34,0x47,0x47,0x34,0x41,0x41,0x34,0x47,0x47,0x34,0x35,0x46,0x6c,0x47,0x34,0x35,0x46,0x46,0x35,0x41,0x41,0x35,0x46,0x46,0x35,0x34,0x47,0x6c,0x46,0x02,0x24,0x41,0x25,0x1c,0x1c,0x25,0x25, -0xfe,0xf8,0x74,0x37,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0xe2,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0x41,0x41,0x25,0x1c,0x1c,0x25,0x25,0x5c,0x44,0x34,0x34,0x44,0x74,0x44,0x34,0x34,0x44,0x44,0x34,0x41,0x41,0x34,0x44,0x44,0x34,0x34,0x44,0x74,0x44,0x34,0x34,0x44,0x44,0x34,0x41,0x41,0x34,0x44,0x00,0x00,0x00,0x00,0x02,0xff,0xec, -0x00,0x32,0x02,0x67,0x02,0xda,0x00,0x11,0x00,0x1a,0x00,0x3d,0x40,0x3a,0x19,0x02,0x02,0x00,0x04,0x1a,0x01,0x02,0x03,0x05,0x02,0x4c,0x12,0x00,0x02,0x02,0x49,0x00,0x01,0x00,0x04,0x00,0x01,0x04,0x67,0x00,0x00,0x00,0x05,0x03,0x00,0x05,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x11, -0x11,0x12,0x25,0x33,0x13,0x06,0x06,0x1c,0x2b,0x25,0x01,0x01,0x15,0x33,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x21,0x07,0x35,0x21,0x11,0x23,0x11,0x23,0x35,0x07,0x01,0x1d,0xfe,0xcf,0x01,0x31,0x4c,0x21,0x1b,0x86,0x1b,0x21,0x21,0x1b,0xfe,0xf2,0x2c,0x01,0x47,0xa0,0xa7,0xc5,0x32,0x01,0x1d,0x01,0x1d,0xa5, -0xd7,0x1b,0x21,0x21,0x1b,0xfe,0x76,0x1b,0x21,0x40,0x6b,0x01,0xaa,0xfe,0xee,0x6c,0xb8,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x05,0x00,0x0f,0x00,0x48,0x40,0x45,0x00,0x00,0x01,0x00,0x85,0x09,0x01,0x07,0x06,0x07,0x86,0x00,0x01,0x08,0x01,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03, -0x04,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x05,0x06,0x4f,0x06,0x06,0x00,0x00,0x06,0x0f,0x06,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0a,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x03,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x52,0x42,0xde,0x6c, -0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0xfe,0xed,0x3c,0xfe,0x75,0x01,0x4f,0x3a,0x56,0x3a,0x85,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x11,0x00,0x1e,0x00,0x54,0x40,0x51,0x0c,0x03,0x02,0x02,0x00,0x19,0x01,0x08,0x05,0x02,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x0a,0x03,0x02,0x02,0x04,0x02,0x85,0x06,0x01, -0x04,0x05,0x04,0x85,0x0b,0x09,0x02,0x07,0x08,0x07,0x86,0x00,0x05,0x08,0x08,0x05,0x57,0x00,0x05,0x05,0x08,0x5f,0x00,0x08,0x05,0x08,0x4f,0x12,0x12,0x00,0x00,0x12,0x1e,0x12,0x1e,0x1d,0x1c,0x1b,0x1a,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x0c,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35, -0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0x13,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x17,0x23,0x27,0x23,0x15,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x87,0x42,0x4f,0x60,0x4a,0x71,0x7b,0x4e,0x66,0x4f,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0xfe, -0x75,0x01,0x4f,0x86,0x86,0xa1,0xae,0x8f,0x8f,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x11,0x00,0x17,0x00,0x43,0x40,0x40,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x07,0x03,0x02,0x02,0x04,0x02,0x85,0x00,0x04,0x05,0x04,0x85,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05, -0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x12,0x12,0x00,0x00,0x12,0x17,0x12,0x17,0x16,0x15,0x14,0x13,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x09,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05, -0x02,0xac,0x42,0xde,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0xfe,0x75,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x00,0x02,0x00,0x2d,0xff,0xf6,0x02,0x2b,0x02,0xda,0x00,0x11,0x00,0x23,0x00,0x46,0x40,0x43,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x08, -0x03,0x02,0x02,0x05,0x02,0x85,0x07,0x01,0x05,0x06,0x05,0x85,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04,0x51,0x13,0x12,0x00,0x00,0x20,0x1f,0x1c,0x1a,0x17,0x16,0x12,0x23,0x13,0x23,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x0a,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11, -0x23,0x03,0x1e,0x02,0x15,0x15,0x01,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x22,0x45,0x56,0x42,0x31,0x28,0x28,0x31,0x42,0x56,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26, -0x31,0x2d,0x69,0xfe,0x6b,0x53,0x47,0xbf,0xbf,0x2c,0x32,0x32,0x2c,0xbf,0xbf,0x47,0x53,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0xd5,0x00,0x0d,0x00,0x37,0x00,0x32,0x40,0x2f,0x00,0x01,0x00,0x01,0x85,0x04,0x01,0x00,0x03,0x00,0x85,0x00,0x03,0x02,0x02,0x03,0x59,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x03, -0x02,0x51,0x0f,0x0e,0x01,0x00,0x24,0x22,0x0e,0x37,0x0f,0x37,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x36,0x17,0x16,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27, -0x26,0x26,0x37,0x36,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x01,0x2c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x17,0x43,0x74,0x58,0x31,0x32,0x2a,0x15,0x33,0x10,0x10,0x07,0x14,0x19,0x1d,0x34,0x5d,0x3c,0x3c,0x5d,0x34,0x1c,0x1a,0x14,0x07,0x10,0x11,0x32,0x15,0x2b,0x31,0x31,0x58,0x74,0xe1,0x23,0x19,0x01,0x7c,0x19,0x23,0x23,0x19, -0xfe,0x84,0x19,0x23,0xeb,0x30,0x57,0x72,0x42,0x41,0x72,0x2b,0x16,0x07,0x11,0x10,0x30,0x17,0x1c,0x4b,0x2c,0x3d,0x5f,0x36,0x36,0x5f,0x3d,0x2c,0x4b,0x1c,0x17,0x30,0x10,0x11,0x07,0x16,0x2a,0x73,0x41,0x42,0x72,0x57,0x30,0x00,0x00,0x03,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0x6c,0x00,0x13,0x00,0x23,0x00,0x31,0x00,0x49,0x40,0x46, -0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x08,0x01,0x04,0x02,0x03,0x04,0x02,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x25,0x24,0x15,0x14,0x01,0x00,0x2c,0x2a,0x24,0x31,0x25,0x31,0x1d,0x1b,0x14,0x23,0x15,0x23,0x0b,0x09,0x00, -0x13,0x01,0x13,0x09,0x06,0x16,0x2b,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x2c,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x43, -0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x3c,0x62,0x39,0x39,0x62,0x3c,0x3c,0x61,0x3a,0x3a,0x61,0x3c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x0a,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x5f,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x46,0x23,0x19,0xb4,0x19,0x23,0x23,0x19, -0xb4,0x19,0x23,0x00,0x00,0x02,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0x6c,0x00,0x13,0x00,0x23,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x15,0x14,0x01,0x00,0x1d,0x1b,0x14,0x23,0x15,0x23,0x0b,0x09,0x00,0x13,0x01, -0x13,0x06,0x06,0x16,0x2b,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x3c,0x62,0x39,0x39,0x62,0x3c,0x3c,0x61,0x3a, -0x3a,0x61,0x0a,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x5f,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x00,0x01,0x00,0xf5,0xff,0xfb,0x01,0x63,0x02,0x67,0x00,0x0d,0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x08,0x06,0x00,0x0d, -0x01,0x0d,0x03,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x01,0x2c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x05,0x23,0x19,0x01,0xf4,0x19,0x23,0x23,0x19,0xfe,0x0c,0x19,0x23,0x00,0x00,0x00,0x01,0x00,0x06,0xff,0xf7,0x02,0x66,0x02,0x57,0x00,0x15,0x00,0x16,0x40,0x13,0x0f,0x07,0x02,0x00, -0x4a,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x15,0x1d,0x02,0x06,0x18,0x2b,0x37,0x26,0x26,0x36,0x36,0x37,0x36,0x37,0x06,0x06,0x16,0x17,0x16,0x16,0x36,0x37,0x06,0x07,0x0e,0x02,0x26,0x64,0x2f,0x2f,0x01,0x30,0x30,0x27,0x2b,0x1e,0x05,0x2e,0x2e,0x2f,0x82,0x89,0x3a,0x16,0x27,0x30,0x75,0x7c,0x75,0x55,0x2f,0x75,0x7c,0x75, -0x30,0x27,0x16,0x39,0x8a,0x82,0x2e,0x2f,0x2e,0x05,0x1e,0x2b,0x27,0x30,0x30,0x01,0x2f,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x4a,0x02,0x35,0x02,0xda,0x00,0x03,0x00,0x09,0x00,0x34,0x40,0x31,0x08,0x05,0x02,0x02,0x01,0x01,0x4c,0x05,0x03,0x02,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x04, -0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x09,0x02,0x23,0x27,0x07,0x37,0x01,0xea,0xfe,0x02,0x01,0x09,0x01,0x09,0x6e,0x9a,0x9e,0x02,0x8a,0x50,0x50,0xfe,0xc0,0x01,0x0e,0xfe,0xf2,0xa2,0xa2,0x00,0x00,0x00,0x00,0x03,0x00,0x2d, -0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x42,0x00,0x6b,0x40,0x68,0x08,0x01,0x02,0x04,0x01,0x4c,0x0c,0x03,0x02,0x01,0x02,0x09,0x02,0x01,0x09,0x80,0x00,0x0a,0x0b,0x07,0x0b,0x0a,0x07,0x80,0x00,0x07,0x08,0x0b,0x07,0x08,0x7e,0x00,0x00,0x00,0x05,0x04,0x00,0x05,0x67,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00, -0x09,0x00,0x0b,0x0a,0x09,0x0b,0x69,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0d,0x01,0x06,0x08,0x06,0x51,0x18,0x17,0x00,0x00,0x36,0x33,0x31,0x30,0x2e,0x2b,0x20,0x1d,0x1b,0x1a,0x17,0x42,0x18,0x41,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x16,0x21,0x0e,0x06,0x19,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14, -0x06,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x2d,0xc6,0x38,0x44, -0x34,0x2b,0x67,0x50,0x64,0x54,0x85,0x19,0x1f,0x1e,0x19,0x86,0x01,0x15,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x3d,0x2f,0x28,0x32,0x06,0x83,0x81,0x81,0xb3,0x1b,0x15, -0x16,0x1c,0xfd,0x5c,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x03,0xff,0xf6,0xff,0xf5,0x02,0x62,0x02,0xe4,0x00,0x14,0x00,0x27,0x00,0x35,0x00,0x53,0x40,0x50,0x00,0x03,0x06,0x02,0x06,0x03,0x02,0x80, -0x00,0x01,0x00,0x04,0x05,0x01,0x04,0x69,0x00,0x05,0x00,0x06,0x03,0x05,0x06,0x69,0x00,0x02,0x00,0x08,0x07,0x02,0x08,0x69,0x0a,0x01,0x07,0x00,0x00,0x07,0x59,0x0a,0x01,0x07,0x07,0x00,0x61,0x09,0x01,0x00,0x07,0x00,0x51,0x2a,0x28,0x01,0x00,0x31,0x2e,0x28,0x35,0x2a,0x35,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x17,0x16,0x15,0x0b, -0x09,0x00,0x14,0x01,0x14,0x0b,0x06,0x16,0x2b,0x05,0x22,0x27,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x33,0x32,0x17,0x13,0x16,0x16,0x15,0x14,0x07,0x03,0x06,0x03,0x33,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x01, -0x2c,0x23,0x23,0xd4,0x1c,0x1b,0xd5,0x23,0x23,0x23,0x23,0xd5,0x0e,0x0d,0x1c,0xd4,0x22,0x48,0x35,0x2c,0x33,0x3e,0x35,0x3f,0x3f,0x1c,0x21,0x21,0x1c,0x21,0x13,0x12,0x0e,0x11,0x11,0x0e,0x12,0x0d,0x11,0x11,0x0b,0x2a,0x01,0x03,0x23,0x23,0x24,0x22,0x01,0x0b,0x2b,0x2b,0xfe,0xf5,0x11,0x24,0x11,0x23,0x23,0xfe,0xfd,0x2a,0x01,0x20, -0x35,0x02,0x38,0x2d,0x32,0x3a,0x32,0x20,0x1d,0x1c,0x23,0xc5,0x13,0x0d,0x0e,0x12,0x12,0x0e,0x0d,0x13,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2e,0x02,0xde,0x00,0x2b,0x00,0x37,0x00,0x62,0x40,0x5f,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c, -0x01,0x00,0x08,0x02,0x00,0x69,0x00,0x08,0x09,0x01,0x07,0x06,0x08,0x07,0x67,0x0a,0x01,0x06,0x0b,0x0b,0x06,0x57,0x0a,0x01,0x06,0x06,0x0b,0x5f,0x0d,0x01,0x0b,0x06,0x0b,0x4f,0x2c,0x2c,0x01,0x00,0x2c,0x37,0x2c,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b, -0x01,0x2a,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x35,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x15,0xbc,0x40, -0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x1d,0x7d,0x7d,0x01,0x3c,0x7d,0x7d,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11, -0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x3c,0xd7,0x3c,0x3c,0xd7,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x25,0xff,0xfb,0x02,0x3f,0x02,0xde,0x00,0x2b,0x00,0x3b,0x00,0x47,0x00,0x61,0x40,0x5e,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00, -0x02,0x0a,0x01,0x00,0x07,0x02,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x0c,0x01,0x08,0x06,0x06,0x08,0x59,0x0c,0x01,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x3d,0x3c,0x2d,0x2c,0x01,0x00,0x43,0x41,0x3c,0x47,0x3d,0x47,0x35,0x33,0x2c,0x3b,0x2d,0x3b,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00, -0x2b,0x01,0x2a,0x0d,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15, -0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0xbb,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x32,0x4f,0x2e,0x2e,0x4f,0x32, -0x2d,0x3e,0x3e,0x2d,0x2d,0x3e,0x3e,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x74,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x2d,0x4e,0x32,0x31,0x4e,0x2d,0x3a,0x41,0x31,0x31,0x42,0x42,0x31,0x31,0x41,0x00,0x00, -0x00,0x03,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x36,0x00,0x3f,0x00,0x62,0x40,0x5f,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x0c,0x01,0x08,0x07,0x08,0x86,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x06,0x00,0x0a,0x09,0x06, -0x0a,0x67,0x00,0x09,0x07,0x07,0x09,0x57,0x00,0x09,0x09,0x07,0x5f,0x00,0x07,0x09,0x07,0x4f,0x2c,0x2c,0x01,0x00,0x3f,0x3d,0x39,0x37,0x2c,0x36,0x2c,0x36,0x35,0x33,0x2f,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0d,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35, -0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c, -0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x2a,0xbf,0x38,0x44,0x44,0x38,0x7d,0x7e,0x19,0x1f,0x1e,0x19,0x7f,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a, -0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x3f,0x2f,0x2e,0x3e,0x75,0xaf,0x1d,0x15,0x16,0x1e,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2b,0x02,0xde,0x00,0x2b,0x00,0x37,0x00,0x66,0x40,0x63,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x08,0x01,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0d,0x0b, -0x02,0x09,0x0a,0x09,0x86,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x07,0x0a,0x0a,0x07,0x57,0x00,0x07,0x07,0x0a,0x5f,0x00,0x0a,0x07,0x0a,0x4f,0x2c,0x2c,0x01,0x00,0x2c,0x37,0x2c,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06, -0x04,0x03,0x00,0x2b,0x01,0x2a,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35, -0x23,0x15,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0x42,0xb2,0x42,0x42,0xb2,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11, -0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x84,0x84,0xfe,0xb1,0x8f,0x8f,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x43,0x00,0x62,0x40,0x5f,0x3f,0x39,0x33,0x2d,0x04,0x08,0x06,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01, -0x02,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x2c,0x2c,0x01,0x00,0x2c,0x43,0x2c,0x43,0x3b,0x3a,0x38,0x37,0x2f,0x2e,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06, -0x04,0x03,0x00,0x2b,0x01,0x2a,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x37,0x27,0x33,0x17,0x16,0x16,0x17,0x36,0x36, -0x37,0x37,0x33,0x07,0x17,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x11,0x7e,0x7d,0x4e,0x42,0x0d,0x08,0x07,0x05,0x09,0x0c,0x40,0x4d,0x7d, -0x7d,0x4f,0x41,0x0d,0x0a,0x06,0x05,0x06,0x0d,0x42,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0xa9,0xa6,0x56,0x10,0x18,0x0e,0x0e,0x18,0x10,0x56,0xa8,0xa7,0x55,0x11,0x1a,0x0d,0x0d,0x19,0x11,0x56, -0x00,0x04,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x39,0x00,0x42,0x00,0x4b,0x00,0x6d,0x40,0x6a,0x33,0x01,0x0b,0x08,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x06,0x00,0x09, -0x08,0x06,0x09,0x67,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x0a,0x07,0x07,0x0a,0x57,0x00,0x0a,0x0a,0x07,0x5f,0x0d,0x01,0x07,0x0a,0x07,0x4f,0x2c,0x2c,0x01,0x00,0x4b,0x49,0x45,0x43,0x42,0x40,0x3c,0x3a,0x2c,0x39,0x2c,0x38,0x2f,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0e,0x06,0x16, -0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35, -0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14, -0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19,0xdb,0x19,0x13,0x13,0x17,0x00,0x00, -0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2b,0x02,0xde,0x00,0x2b,0x00,0x3d,0x00,0x60,0x40,0x5d,0x38,0x2f,0x02,0x08,0x06,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00, -0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x2c,0x2c,0x01,0x00,0x2c,0x3d,0x2c,0x3d,0x37,0x36,0x35,0x34,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27, -0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d, -0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f, -0xfe,0xf7,0x1e,0x26,0x30,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0x12,0x02,0xe4,0x00,0x1c,0x00,0x43,0x40,0x40,0x16,0x15,0x10,0x03,0x04,0x03,0x01,0x4c,0x00,0x01,0x02,0x03,0x02,0x01,0x03,0x80,0x00,0x03,0x04,0x02,0x03,0x04,0x7e,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00, -0x3e,0x4d,0x00,0x04,0x04,0x05,0x60,0x00,0x05,0x05,0x39,0x05,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1c,0x01,0x1c,0x07,0x09,0x16,0x2b,0x01,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x33,0x15,0x07,0x21,0x15,0x21,0x35,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x01,0x37, -0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x46,0x3c,0x4f,0xb3,0x01,0x2c,0xfe,0x6e,0xb0,0x5a,0x68,0x77,0x02,0xe4,0x71,0x61,0x3c,0x46,0x46,0x3c,0x32,0x3c,0x46,0x4e,0xbe,0x52,0x54,0xbb,0x07,0x6f,0x5b,0x32,0x61,0x71,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0xff,0xf6,0x02,0x0c,0x02,0xda,0x00,0x18,0x00,0x34,0x40,0x31,0x01,0x01,0x01,0x03, -0x01,0x4c,0x00,0x01,0x03,0x00,0x03,0x01,0x00,0x80,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x38,0x4d,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x16,0x22,0x12,0x27,0x06,0x09,0x1a,0x2b,0x01,0x15,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x26, -0x35,0x34,0x36,0x37,0x37,0x21,0x35,0x02,0x02,0xf3,0x34,0x2d,0x45,0x3b,0x3d,0x47,0x5a,0x03,0x78,0x63,0x65,0x77,0x39,0x45,0xc5,0xfe,0xb4,0x02,0xda,0x53,0xfe,0xfc,0x37,0x59,0x2a,0x3c,0x47,0x49,0x3e,0x63,0x74,0x73,0x61,0x35,0x73,0x48,0xce,0x52,0x00,0x02,0x00,0x2d,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x11,0x00,0x3d,0x00,0x59, -0x40,0x56,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x08,0x09,0x05,0x09,0x08,0x05,0x80,0x00,0x05,0x06,0x09,0x05,0x06,0x7e,0x00,0x02,0x0a,0x01,0x00,0x07,0x02,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x13,0x12,0x01,0x00,0x31,0x2e,0x2c, -0x2b,0x29,0x26,0x1b,0x18,0x16,0x15,0x12,0x3d,0x13,0x3c,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36, -0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0xc8,0x45,0x56,0x42,0x31,0x28,0x28,0x31,0x42,0x56,0x77,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16, -0x58,0x33,0x3b,0x4e,0x44,0x01,0x81,0x53,0x47,0xbf,0xbf,0x2c,0x32,0x32,0x2c,0xbf,0xbf,0x47,0x53,0xfe,0x7b,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x02,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0c, -0x00,0x14,0x00,0x3a,0x40,0x37,0x03,0x01,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x04,0x01,0x85,0x07,0x01,0x06,0x03,0x06,0x86,0x00,0x04,0x03,0x03,0x04,0x57,0x00,0x04,0x04,0x03,0x5f,0x05,0x01,0x03,0x04,0x03,0x4f,0x0d,0x0d,0x0d,0x14,0x0d,0x14,0x11,0x11,0x12,0x11,0x11,0x17,0x08,0x06,0x1c,0x2b,0x13,0x16, -0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x23,0x03,0x33,0x01,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xad,0x08,0x12,0x02,0x02,0x10,0x07,0x57,0x48,0x94,0x4a,0x94,0x45,0x01,0x1b,0x98,0x01,0x72,0x98,0x02,0x0c,0x13,0x29,0x0e,0x0e,0x29,0x13,0xce,0xfe,0xb1,0x01,0x4f,0xfd,0x26,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x00,0x02,0x00,0x37, -0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x1a,0x00,0x23,0x00,0x42,0x40,0x3f,0x06,0x01,0x04,0x03,0x01,0x4c,0x00,0x03,0x06,0x01,0x04,0x05,0x03,0x04,0x67,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x08,0x01,0x05,0x05,0x00,0x5f,0x07,0x01,0x00,0x00,0x39,0x00,0x4e,0x1c,0x1b,0x01,0x00,0x1f,0x1d,0x1b,0x23,0x1c,0x23,0x19,0x18, -0x17,0x15,0x11,0x0f,0x0e,0x0c,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23,0x11,0x27,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x17,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xad,0xad,0x35,0x3e, -0x3f,0x36,0x01,0x3c,0x73,0xca,0x70,0x70,0x3c,0x47,0x47,0x70,0x5f,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x56,0x66,0x52,0x3d,0x35,0x34,0x3e,0x50,0xfe,0xac,0x52,0x01,0x02,0x46,0x3b,0x3b,0x46,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0xff,0x06,0x01,0xa4,0xff,0xce,0x00,0x07,0x06,0x79,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x8c, -0xff,0x2e,0x01,0xcc,0xff,0xb0,0x00,0x19,0x00,0x6d,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04, -0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23, -0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0xd2,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x13,0xff,0x4c,0x01,0xf9,0x03,0x84,0x00,0x36, -0x00,0x41,0x40,0x3e,0x36,0x02,0x02,0x01,0x00,0x0c,0x06,0x05,0x03,0x03,0x01,0x08,0x01,0x04,0x03,0x22,0x1f,0x07,0x03,0x02,0x04,0x04,0x4c,0x00,0x03,0x01,0x04,0x01,0x03,0x04,0x80,0x00,0x00,0x00,0x01,0x03,0x00,0x01,0x69,0x00,0x04,0x04,0x02,0x5f,0x00,0x02,0x02,0x3d,0x02,0x4e,0x2a,0x28,0x26,0x25,0x21,0x20,0x13,0x11,0x10,0x05, -0x09,0x17,0x2b,0x01,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0xfe,0xd0,0x5a,0x40,0x41,0x02, -0x4e,0xfe,0x61,0x01,0x27,0x13,0x20,0x08,0x09,0x21,0x11,0xfe,0x08,0x4c,0x49,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5f,0x52,0x5a,0x57,0x66,0x5a,0x4e,0x40,0x3e,0x4a,0x31,0x2a,0x6f,0x45,0x4f,0x5e,0x4d,0x03,0x84,0xa4,0x0b,0x23,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09,0x01,0x0a,0x2a,0x3f,0x32,0x28,0x39,0x0b, -0x20,0x14,0x71,0x4d,0x52,0x6d,0x0c,0xae,0xad,0x0b,0x6c,0x58,0x3d,0x45,0x47,0x38,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0x00,0x00,0x00,0x01,0xfe,0x07,0xff,0x4c,0x02,0x01,0x03,0x84,0x00,0x36,0x00,0x48,0x40,0x45,0x21,0x1e,0x02,0x04,0x02,0x06,0x01,0x03,0x04,0x0b,0x07,0x05,0x04,0x04,0x01,0x03,0x35,0x01,0x00,0x01, -0x04,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x69,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x4d,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x00,0x00,0x00,0x36,0x00,0x36,0x22,0x14,0x1d,0x2e,0x11,0x07,0x09,0x1b,0x2b,0x17,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16, -0x17,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0xf6,0x6d,0x90,0xfe,0x0e,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0x9b,0x8e,0x65,0x48,0x54,0x31,0x2a, -0x6f,0x45,0x4f,0x5e,0x4d,0x5a,0x47,0x56,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5e,0x53,0xb4,0xab,0x06,0x3f,0xdc,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0a,0x08,0xb3,0x3e,0x45,0x3a,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0xa2,0xa5,0x0f,0x65,0x48,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x71, -0x4d,0x50,0x6a,0x0f,0xb0,0x00,0x00,0x00,0x00,0x01,0xfb,0xc8,0xff,0x4c,0x01,0xe0,0x03,0x84,0x00,0x40,0x00,0x42,0x40,0x3f,0x21,0x1e,0x02,0x03,0x02,0x2b,0x27,0x25,0x24,0x0b,0x07,0x06,0x05,0x04,0x09,0x01,0x03,0x3f,0x26,0x02,0x00,0x01,0x03,0x4c,0x00,0x02,0x00,0x03,0x01,0x02,0x03,0x69,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00, -0x42,0x4d,0x05,0x01,0x04,0x04,0x3d,0x04,0x4e,0x00,0x00,0x00,0x40,0x00,0x40,0x33,0x31,0x1d,0x2e,0x11,0x06,0x09,0x19,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35, -0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0xfe,0xb7,0x6d,0x90,0xfe,0x0e,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0x9b,0x8e,0x65,0x4d,0x4f,0x31,0x2a,0x6f,0x45,0x4f,0x5e,0x4d,0x5a,0x3f,0x42,0x02,0x4e,0xfe,0x61,0x01,0x27,0x13, -0x20,0x08,0x09,0x21,0x11,0xfe,0x08,0x26,0x4c,0x23,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5c,0x55,0xb4,0xab,0x06,0x3f,0xdc,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0a,0x08,0xb3,0x3e,0x47,0x38,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0xa2,0xa5,0x0a,0x23,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09, -0x01,0x0a,0x14,0x16,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x71,0x4d,0x4f,0x6b,0x0f,0xb0,0x00,0x00,0x00,0x00,0x03,0xfd,0xda,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x32,0x00,0x3b,0x00,0x44,0x00,0x5c,0x40,0x59,0x0e,0x01,0x01,0x05,0x01,0x4c,0x08,0x01,0x05,0x0d,0x0b,0x09,0x03,0x01,0x0a,0x05,0x01,0x67,0x07,0x01,0x04,0x04,0x03,0x5f, -0x06,0x01,0x03,0x03,0x38,0x4d,0x10,0x0c,0x0f,0x03,0x0a,0x0a,0x00,0x5f,0x02,0x0e,0x02,0x00,0x00,0x39,0x00,0x4e,0x3d,0x3c,0x34,0x33,0x01,0x00,0x40,0x3e,0x3c,0x44,0x3d,0x44,0x37,0x35,0x33,0x3b,0x34,0x3b,0x31,0x30,0x2f,0x2d,0x29,0x27,0x26,0x24,0x1f,0x1d,0x19,0x17,0x16,0x14,0x09,0x07,0x06,0x05,0x00,0x32,0x01,0x32,0x11,0x09, -0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23,0x11,0x25,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33, -0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x12,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xaa,0xaa,0x35,0x3e,0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e,0x41,0x34,0x01,0x50,0x74,0xfc,0xcb,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e, -0x61,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x50,0xfe,0xac,0x50,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x00,0x00,0x00,0x00,0x04,0xfb,0x82,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x4a,0x00,0x53,0x00,0x5c,0x00,0x65,0x00,0x76, -0x40,0x73,0x16,0x01,0x01,0x07,0x01,0x4c,0x0d,0x0a,0x02,0x07,0x14,0x12,0x10,0x0e,0x03,0x05,0x01,0x0f,0x07,0x01,0x67,0x0c,0x09,0x02,0x06,0x06,0x05,0x5f,0x0b,0x08,0x02,0x05,0x05,0x38,0x4d,0x18,0x13,0x17,0x11,0x16,0x05,0x0f,0x0f,0x00,0x5f,0x04,0x02,0x15,0x03,0x00,0x00,0x39,0x00,0x4e,0x5e,0x5d,0x55,0x54,0x4c,0x4b,0x01,0x00, -0x61,0x5f,0x5d,0x65,0x5e,0x65,0x58,0x56,0x54,0x5c,0x55,0x5c,0x4f,0x4d,0x4b,0x53,0x4c,0x53,0x49,0x48,0x47,0x45,0x41,0x3f,0x3e,0x3c,0x37,0x35,0x31,0x2f,0x2e,0x2c,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x11,0x0f,0x0e,0x0d,0x09,0x07,0x06,0x05,0x00,0x4a,0x01,0x4a,0x19,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22, -0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23, -0x11,0x25,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x12,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xaa,0xaa,0x35,0x3e,0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e, -0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e,0x41,0x34,0x01,0x50,0x74,0xfa,0x73,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e,0x61,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x59,0x63,0x50,0x3b,0x38, -0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x50,0xfe,0xac,0x50,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x00,0x03,0xfd,0xdf,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x1a,0x00,0x23,0x00,0x27,0x00,0x53,0x40,0x50, -0x06,0x01,0x04,0x03,0x01,0x4c,0x00,0x03,0x06,0x01,0x04,0x07,0x03,0x04,0x67,0x00,0x07,0x0b,0x01,0x08,0x05,0x07,0x08,0x67,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x0a,0x01,0x05,0x05,0x00,0x5f,0x09,0x01,0x00,0x00,0x39,0x00,0x4e,0x24,0x24,0x1c,0x1b,0x01,0x00,0x24,0x27,0x24,0x27,0x26,0x25,0x1f,0x1d,0x1b,0x23,0x1c, -0x23,0x19,0x18,0x17,0x15,0x11,0x0f,0x0e,0x0c,0x00,0x1a,0x01,0x1a,0x0c,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x11,0x27,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x25,0x35,0x21,0x15,0xfe,0xbf,0x67,0x79,0x51,0x40,0x39, -0x47,0x6f,0x5e,0xad,0xad,0x35,0x3e,0x3f,0x36,0x03,0x49,0xfd,0x80,0xca,0x70,0x70,0x3c,0x47,0x47,0x01,0xab,0x01,0xdb,0x70,0x5f,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x56,0x66,0x52,0x3d,0x35,0x34,0x3e,0x50,0xfe,0xac,0x52,0x01,0x02,0x46,0x3b,0x3b,0x46,0x12,0x50,0x50,0x00,0x02,0xfd,0xd5,0xff,0x9c,0x02,0x1c,0x02,0xe4,0x00,0x27, -0x00,0x31,0x00,0x7a,0xb5,0x19,0x01,0x07,0x03,0x01,0x4c,0x4b,0xb0,0x21,0x50,0x58,0x40,0x26,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x05,0x08,0x01,0x00,0x05,0x00,0x63,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x3b,0x07,0x4e,0x1b,0x40,0x24,0x00,0x03,0x00,0x07,0x06, -0x03,0x07,0x69,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x05,0x08,0x01,0x00,0x05,0x00,0x63,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x04,0x4e,0x59,0x40,0x1b,0x29,0x28,0x01,0x00,0x2e,0x2c,0x28,0x31,0x29,0x31,0x26,0x24,0x1f,0x1d,0x17,0x15,0x10,0x0e,0x09,0x07,0x00,0x27,0x01,0x27,0x0a,0x09,0x16,0x2b,0x05,0x22, -0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x15,0x01,0x32,0x35,0x35,0x34,0x23,0x22,0x15,0x15,0x14,0xfe,0xed,0x55,0x7e,0x45,0x90,0x7e,0x75,0x80,0x56,0x4a,0x49,0x57,0x46,0x40,0x29, -0x36,0x09,0x02,0x56,0x4f,0x5a,0x64,0x6b,0x5d,0x03,0x2f,0xfd,0x1c,0x50,0x50,0x50,0x64,0x47,0x83,0x58,0x01,0x04,0x87,0x9b,0x7d,0x73,0xe2,0x4e,0x5b,0x56,0x49,0x74,0x4a,0x51,0x20,0x1c,0x23,0x4d,0x53,0x74,0x68,0xfe,0xfc,0x64,0x73,0x4b,0x01,0x10,0x5c,0x75,0x5b,0x5c,0x74,0x5c,0x00,0x00,0x00,0x04,0xfd,0xc6,0xff,0xf7,0x02,0x62, -0x02,0xe4,0x00,0x24,0x00,0x45,0x00,0x51,0x00,0x5d,0x00,0xcc,0x40,0x0b,0x55,0x49,0x42,0x21,0x1e,0x1b,0x06,0x0d,0x0e,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x41,0x0a,0x01,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x08,0x01,0x01,0x10,0x01,0x0e,0x0d,0x01,0x0e,0x69,0x0b,0x01,0x04,0x04,0x02,0x61,0x09,0x01,0x02,0x02,0x3e,0x4d,0x00, -0x05,0x05,0x00,0x61,0x0c,0x12,0x07,0x06,0x11,0x05,0x00,0x00,0x3f,0x4d,0x14,0x0f,0x13,0x03,0x0d,0x0d,0x00,0x61,0x0c,0x12,0x07,0x06,0x11,0x05,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x3b,0x0a,0x01,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x08,0x01,0x01,0x10,0x01,0x0e,0x0d,0x01,0x0e,0x69,0x0b,0x01,0x04,0x04,0x02,0x61,0x09,0x01,0x02, -0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f,0x0c,0x01,0x06,0x06,0x39,0x4d,0x14,0x0f,0x13,0x03,0x0d,0x0d,0x00,0x61,0x12,0x07,0x11,0x03,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x35,0x53,0x52,0x47,0x46,0x26,0x25,0x01,0x00,0x58,0x56,0x52,0x5d,0x53,0x5d,0x4c,0x4a,0x46,0x51,0x47,0x51,0x41,0x40,0x3b,0x39,0x37,0x36,0x33,0x31,0x2c,0x2b, -0x25,0x45,0x26,0x45,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x15,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x21,0x22,0x26, -0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23,0x27,0x07,0x06,0x06,0x25,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xd2,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37, -0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63,0x61,0x2b,0x22,0x53,0xfd,0x86,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0x02,0x28,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0xfd,0xe3,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b, -0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b, -0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x00,0x06,0xfb,0x73,0xff,0xf7,0x02,0x5d,0x02,0xe4,0x00,0x24,0x00,0x45,0x00,0x66,0x00,0x72,0x00,0x7e,0x00,0x8a,0x00,0xfd,0x40,0x0d,0x82,0x76,0x6a,0x63,0x42,0x21,0x1e,0x1b,0x08,0x13,0x14,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x4e,0x10,0x0a,0x02,0x03,0x04,0x01,0x04,0x03,0x01,0x80, -0x0e,0x08,0x02,0x01,0x18,0x16,0x02,0x14,0x13,0x01,0x14,0x69,0x11,0x0b,0x02,0x04,0x04,0x02,0x61,0x0f,0x09,0x02,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x00,0x61,0x12,0x1b,0x0d,0x0c,0x1a,0x07,0x06,0x19,0x08,0x00,0x00,0x3f,0x4d,0x1e,0x17,0x1d,0x15,0x1c,0x05,0x13,0x13,0x00,0x61,0x12,0x1b,0x0d,0x0c,0x1a,0x07,0x06,0x19,0x08,0x00, -0x00,0x3f,0x00,0x4e,0x1b,0x40,0x45,0x10,0x0a,0x02,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x0e,0x08,0x02,0x01,0x18,0x16,0x02,0x14,0x13,0x01,0x14,0x69,0x11,0x0b,0x02,0x04,0x04,0x02,0x61,0x0f,0x09,0x02,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f,0x12,0x0c,0x02,0x06,0x06,0x39,0x4d,0x1e,0x17,0x1d,0x15,0x1c,0x05,0x13,0x13,0x00, -0x61,0x1b,0x0d,0x1a,0x07,0x19,0x05,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x4d,0x80,0x7f,0x74,0x73,0x68,0x67,0x47,0x46,0x26,0x25,0x01,0x00,0x85,0x83,0x7f,0x8a,0x80,0x8a,0x79,0x77,0x73,0x7e,0x74,0x7e,0x6d,0x6b,0x67,0x72,0x68,0x72,0x62,0x61,0x5c,0x5a,0x58,0x57,0x54,0x52,0x4d,0x4c,0x46,0x66,0x47,0x66,0x41,0x40,0x3b,0x39,0x37, -0x36,0x33,0x31,0x2c,0x2b,0x25,0x45,0x26,0x45,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x1f,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07, -0x06,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23,0x27,0x07,0x06,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23, -0x27,0x07,0x06,0x06,0x25,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xcd,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63, -0x61,0x2b,0x22,0x53,0xfb,0x38,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0x02,0x22,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0xfd,0x8c,0x39,0x28,0x34,0x7d,0x1e,0x2f, -0x37,0x3b,0x02,0x7f,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x02,0x7f,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55, -0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b, -0x00,0x03,0xfd,0xd5,0xff,0xf7,0x02,0x1c,0x02,0xe4,0x00,0x26,0x00,0x32,0x00,0x36,0x00,0xbc,0x40,0x0f,0x1b,0x01,0x0a,0x09,0x2a,0x20,0x02,0x0b,0x0a,0x23,0x01,0x08,0x0b,0x03,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x39,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x05,0x00,0x06,0x09,0x05,0x06,0x67,0x00,0x01,0x00,0x09,0x0a,0x01, -0x09,0x69,0x00,0x0a,0x0e,0x01,0x0b,0x08,0x0a,0x0b,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x0d,0x01,0x08,0x08,0x00,0x61,0x07,0x0c,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x3d,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x05,0x00,0x06,0x09,0x05,0x06,0x67,0x00,0x01,0x00,0x09,0x0a,0x01,0x09,0x69,0x00,0x0a, -0x0e,0x01,0x0b,0x08,0x0a,0x0b,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0d,0x01,0x08,0x08,0x00,0x61,0x0c,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x27,0x33,0x33,0x28,0x27,0x01,0x00,0x33,0x36,0x33,0x36,0x35,0x34,0x2d,0x2b,0x27,0x32,0x28,0x32,0x22,0x21,0x1f,0x1e,0x1d,0x1c,0x16,0x14, -0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x26,0x01,0x26,0x0f,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x21,0x15,0x21,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x27,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14, -0x16,0x25,0x35,0x21,0x15,0xfe,0x93,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0xbf,0x01,0xfb,0xfe,0x2a,0xb4,0x91,0x63,0x61,0x2b,0x22,0x53,0x26,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x01,0xd9,0x01,0xdb,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55, -0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0xef,0x50,0xdd,0xbd,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x62,0x50,0x50,0x00,0x01,0xfe,0xa7,0xff,0xab,0x01,0xa4,0x02,0xee,0x00,0x07,0x00,0x47,0x4b,0xb0,0x18,0x50,0x58,0x40,0x14,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x03,0x00,0x5f,0x00, -0x00,0x00,0x38,0x03,0x4e,0x1b,0x40,0x19,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfe,0xa7,0x5a,0x02,0xa3,0xfd,0x5d, -0x55,0x03,0x43,0xfe,0x84,0x50,0xfe,0x89,0x00,0x01,0xfb,0xd2,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x12,0x00,0x33,0x40,0x30,0x0a,0x01,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x12,0x00,0x12, -0x23,0x12,0x14,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x11,0x33,0x15,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x15,0xfb,0xd2,0x5a,0x05,0x5b,0x04,0x08,0x05,0xba,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfa,0xa5,0x23,0x02,0x4e,0xff,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0xff, -0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0xbd,0x03,0x3e,0x00,0x24,0x00,0x28,0x00,0x43,0x40,0x40,0x09,0x01,0x04,0x03,0x01,0x4c,0x06,0x01,0x02,0x00,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x25,0x25,0x00,0x00, -0x25,0x28,0x25,0x28,0x27,0x26,0x00,0x24,0x00,0x23,0x21,0x25,0x21,0x2c,0x21,0x0a,0x09,0x1b,0x2b,0x07,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x23,0x21,0x11,0x33,0x11,0x37,0x73,0x2f,0x32, -0x02,0x0a,0x03,0x36,0x31,0x32,0x35,0x03,0x0a,0x02,0x32,0x2f,0x73,0x73,0x59,0x65,0x05,0x0a,0x03,0x26,0x41,0x6e,0x6e,0x40,0x27,0x03,0x0a,0x05,0x65,0x59,0xfe,0x7f,0x5a,0x6e,0x50,0x2b,0x2b,0xa4,0x39,0x4a,0x09,0x09,0x4a,0x39,0xa4,0x2b,0x2b,0x50,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x03,0xac,0xfc,0x54,0x00, -0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08, -0x09,0x19,0x2b,0x07,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x11,0x33,0x11,0x3c,0x01,0x27,0xfe,0xd9,0x01,0x81,0xfd,0x76,0x5a,0x6e,0x50,0x03,0x0c,0x50,0xfc,0x54,0x03,0xac,0xfc,0x54,0xff,0xff,0xfe,0xe3,0xff,0x92,0x01,0x1d,0x03,0x3e,0x00,0x26,0x05,0xbe,0xc4,0x00,0x00,0x07,0x05,0xbe,0xfd,0xe4,0x00,0x00,0x00,0x02,0xfc,0xa4, -0xff,0xab,0x01,0x72,0x02,0xee,0x00,0x07,0x00,0x0b,0x00,0x56,0x4b,0xb0,0x18,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x07,0x05,0x06,0x03,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x00,0x38,0x03,0x4e,0x1b,0x40,0x1d,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x00,0x00, -0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x59,0x40,0x14,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0xfe,0x52,0x5a,0x02,0xc6,0xfd,0x3a,0xfd,0xf8,0x5a,0x55,0x03,0x43,0xfe,0x84,0x50,0xfe,0x89, -0x03,0x43,0xfc,0xbd,0x00,0x03,0xfc,0xc7,0xff,0x92,0x00,0xe1,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x04,0x02,0x02,0x00,0x01,0x00,0x85,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09, -0x06,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x87,0x5a,0xfb,0xe6,0x5a,0x01,0x86,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x00,0x04,0xfa,0xc9,0xff,0xab,0x00,0xd2,0x02,0xee,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x5f,0x40,0x0a,0x16,0x12,0x0e,0x0c,0x0b,0x05, -0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x12,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x19,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x59,0x40,0x1a,0x08,0x08,0x04,0x04, -0x00,0x00,0x08,0x0d,0x08,0x0d,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfc,0x77,0x5a,0xfd,0xf8,0x5a,0x03,0x02,0x5a,0x02,0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a, -0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e,0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x02,0xfc,0xa4,0xff,0xab,0x01,0x72,0x02,0xee,0x00,0x0b,0x00,0x0f,0x00,0x68,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00, -0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x09,0x07,0x08,0x03,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x00,0x38,0x05,0x4e,0x1b,0x40,0x25,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x59,0x40, -0x16,0x0c,0x0c,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x33,0x11,0xfe,0x52,0x5a,0x02,0xc6,0xfd,0x3a,0x02,0xc6,0xfd,0x3a,0xfd,0xf8,0x5a,0x55,0x03,0x43,0xfe,0xfc,0x50,0xa0,0x50,0xff,0x03, -0x43,0xfc,0xbd,0x00,0x00,0x03,0xfc,0xd6,0xff,0xab,0x01,0x31,0x02,0xee,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x50,0x40,0x0a,0x12,0x0e,0x0a,0x08,0x07,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x05,0x03,0x04,0x03,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x15,0x02,0x01,0x00,0x01,0x01, -0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x59,0x40,0x12,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x21,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfc,0xd6,0x5a,0x01,0x54,0x5a,0x02, -0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a,0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e,0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x01,0xfe,0xa7,0xff,0xab,0x01,0xa4,0x02,0xee,0x00,0x0b,0x00,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1c,0x00,0x01,0x00,0x02,0x03,0x01,0x02, -0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x05,0x4e,0x1b,0x40,0x21,0x00,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b, -0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0xfe,0xa7,0x5a,0x02,0xa3,0xfd,0x5d,0x02,0xa3,0xfd,0x5d,0x55,0x03,0x43,0xfe,0xfc,0x50,0xa0,0x50,0xff,0x00,0x00,0x02,0xfb,0xd2,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0c,0x00,0x17,0x00,0x40,0x40,0x3d,0x12,0x07, -0x02,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x17,0x16,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x09,0x09,0x1b,0x2b,0x25,0x11,0x33,0x15, -0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x15,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0xfb,0xd2,0x5a,0x04,0xfb,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x05,0x05,0x3b,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfa,0xc6,0x23,0x02,0x4e,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19, -0x14,0x00,0x00,0x00,0x00,0x02,0xfe,0xbb,0xff,0xab,0x01,0x68,0x02,0xee,0x00,0x05,0x00,0x0e,0x00,0x41,0x40,0x0a,0x0e,0x0a,0x06,0x04,0x03,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01, -0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x03,0x09,0x17,0x2b,0x05,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfe,0xbb,0x5a,0x02,0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a,0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e, -0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x03,0xfe,0x13,0xff,0x74,0x01,0xf9,0x03,0x66,0x00,0x2d,0x00,0x34,0x00,0x3c,0x00,0x36,0x40,0x33,0x3c,0x32,0x31,0x25,0x24,0x1d,0x17,0x16,0x13,0x10,0x09,0x0b,0x00,0x01,0x35,0x2c,0x19,0x18,0x08,0x01,0x06,0x02,0x00,0x02,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03, -0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x2d,0x00,0x2d,0x1c,0x14,0x04,0x09,0x18,0x2b,0x05,0x35,0x26,0x26,0x27,0x33,0x14,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14, -0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0xfe,0xde,0x5e,0x6b,0x02,0x5a,0x3b,0x36,0x1b,0x4b,0x51,0x63,0x54,0x3c,0x44,0x4d,0x02,0x4e,0xfe,0x61,0x01,0x27,0x13,0x20,0x08,0x09,0x21,0x11,0xfe,0x0d,0x26,0x35,0x19,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x2f,0x2c,0x0c,0x8c,0x83, -0x08,0x69,0x56,0x31,0x3e,0x07,0x01,0x06,0x08,0x17,0x6c,0x49,0x50,0x68,0x08,0x84,0x84,0x08,0x28,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09,0x01,0x08,0x14,0x14,0x02,0xf8,0x0d,0x17,0x6e,0x4a,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x42,0x0d,0x04,0x00,0x00, -0x00,0x01,0xfe,0x20,0x00,0x5f,0x01,0xe0,0x02,0x35,0x00,0x13,0x00,0x5a,0x4b,0xb0,0x21,0x50,0x58,0x40,0x1a,0x05,0x03,0x02,0x01,0x08,0x06,0x02,0x00,0x07,0x01,0x00,0x67,0x0a,0x09,0x02,0x07,0x07,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x07,0x4e,0x1b,0x40,0x20,0x04,0x01,0x02,0x01,0x07,0x02,0x57,0x05,0x03,0x02,0x01,0x08,0x06,0x02, -0x00,0x07,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x07,0x5f,0x0a,0x09,0x02,0x07,0x02,0x07,0x4f,0x59,0x40,0x12,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x21,0x15,0xfe,0xdf,0xbf,0xbf, -0x58,0x01,0x92,0x58,0xbf,0xbf,0x58,0xfe,0x6e,0x5f,0xc3,0x50,0xc3,0xc3,0xc3,0xc3,0x50,0xc3,0xc3,0xc3,0x00,0x01,0xfb,0xff,0x00,0x5f,0x01,0xa9,0x02,0x35,0x00,0x1b,0x00,0x6b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x1e,0x07,0x05,0x03,0x03,0x01,0x0c,0x0a,0x08,0x03,0x00,0x09,0x01,0x00,0x67,0x0e,0x0d,0x0b,0x03,0x09,0x09,0x02,0x5f,0x06, -0x04,0x02,0x02,0x02,0x3b,0x09,0x4e,0x1b,0x40,0x25,0x06,0x04,0x02,0x02,0x01,0x09,0x02,0x57,0x07,0x05,0x03,0x03,0x01,0x0c,0x0a,0x08,0x03,0x00,0x09,0x01,0x00,0x67,0x06,0x04,0x02,0x02,0x02,0x09,0x5f,0x0e,0x0d,0x0b,0x03,0x09,0x02,0x09,0x4f,0x59,0x40,0x1a,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x09,0x1f,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x21,0x15,0x23,0x35,0x21,0x15,0xfc,0xbe,0xbf,0xbf,0x58,0x01,0x92,0x58,0x01,0x92,0x58,0xbf,0xbf,0x58,0xfe,0x6e,0x58,0xfe,0x6e,0x5f,0xc3,0x50,0xc3, -0xc3,0xc3,0xc3,0xc3,0xc3,0x50,0xc3,0xc3,0xc3,0xc3,0xc3,0x00,0x00,0x02,0xfd,0xda,0x00,0x2d,0x02,0x12,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x3e,0x40,0x3b,0x17,0x16,0x15,0x03,0x01,0x02,0x11,0x01,0x00,0x01,0x18,0x0d,0x0c,0x03,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67, -0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0xfe,0xcb,0xf1,0xf1,0x58,0xf1,0xf1,0x01,0x41,0x01,0x36,0x13,0x21, -0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0x2d,0xf5,0x50,0xf5,0xf5,0x50,0xf5,0x14,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x04,0xfe,0x2a,0x00,0x64,0x01,0xae,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x6f,0x4b,0xb0,0x18,0x50,0x58,0x40,0x22,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x06,0x04, -0x05,0x06,0x57,0x07,0x01,0x05,0x09,0x01,0x04,0x05,0x04,0x65,0x02,0x08,0x02,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01,0x4e,0x1b,0x40,0x24,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x07,0x00,0x06,0x04,0x07,0x06,0x67,0x00,0x05,0x09,0x01,0x04,0x05,0x04,0x65,0x08,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e, -0x59,0x40,0x1b,0x11,0x10,0x01,0x00,0x1f,0x1e,0x1d,0x1c,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0f,0x0e,0x0d,0x0c,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0a,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x21,0x35,0x21,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x21,0x35,0x21,0x01, -0x5e,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfe,0xce,0xfd,0xda,0x02,0x26,0x01,0x0e,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfe,0xce,0xfd,0xda,0x02,0x26,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0xfe,0x7a,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x46,0x50,0x00,0x00,0x00,0x00,0x06,0xfb,0xa0,0x00,0x64,0x02,0x08, -0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x97,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2a,0x04,0x01,0x02,0x00,0x00,0x02,0x57,0x11,0x0b,0x10,0x03,0x09,0x06,0x07,0x09,0x57,0x0a,0x08,0x02,0x07,0x0f,0x01,0x06,0x07,0x06,0x65,0x0e,0x05,0x0d,0x03,0x0c,0x05,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01, -0x4e,0x1b,0x40,0x2c,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x00,0x02,0x03,0x67,0x0a,0x01,0x08,0x11,0x0b,0x10,0x03,0x09,0x06,0x08,0x09,0x67,0x00,0x07,0x0f,0x01,0x06,0x07,0x06,0x65,0x0c,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x33,0x24,0x24,0x20,0x20,0x15,0x14,0x10,0x10,0x0c,0x0c,0x01,0x00,0x24, -0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x22,0x21,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x12,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34, -0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0xfe,0xd4,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xef,0x02,0x21,0xf9,0x98,0x02,0x21,0x01,0x13,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfc,0xa8,0x02,0x21,0x02,0x26,0x02,0x21,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0x50,0x50,0x50,0xfe, -0xca,0x2c,0x24,0x25,0x2b,0x2b,0x25,0x24,0x2c,0x46,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x06,0xfb,0xa0,0xff,0xfb,0x02,0x08,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x21,0x00,0x64,0x40,0x61,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x06,0x02,0x03,0x67,0x08,0x01,0x06,0x10,0x09,0x0f,0x03,0x07,0x0b,0x06, -0x07,0x67,0x0c,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x0b,0x0b,0x0a,0x61,0x11,0x01,0x0a,0x0a,0x42,0x0a,0x4e,0x15,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x1c,0x19,0x14,0x21,0x15,0x20,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04, -0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0xab,0x0c,0x6a,0x0c,0xea,0x02,0x21,0xf9,0x98,0x02,0x21,0xfd,0xdf,0x02,0x21,0x02,0x26, -0x02,0x21,0xfc,0xbd,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x00,0x00,0x02,0xfd,0xf8,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02, -0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xfd,0xf8,0x04,0x10,0xfb,0xf0,0x04,0x10,0x01,0x9a,0x50,0x50,0xf0,0x50,0x50,0x00,0x00, -0x00,0x03,0xfb,0xa5,0x00,0x4c,0x02,0x03,0x02,0x48,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x40,0x40,0x3d,0x00,0x00,0x06,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08, -0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xfb,0xa5,0x06,0x5e,0xf9,0xa2,0x06,0x5e,0xf9,0xa2,0x06,0x5e,0x01,0xfc,0x4c,0x4c,0xd8,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x01,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13, -0x00,0x6c,0xb6,0x12,0x08,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01, -0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x37,0x21,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33, -0x13,0x03,0xbc,0x6b,0xfa,0x7e,0x05,0xc2,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfa,0x3f,0x05,0x82,0x6b,0x6a,0xe7,0xe8,0x23,0x87,0x50,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13,0x00,0x6c,0xb6,0x12,0x08,0x02,0x01,0x02, -0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02, -0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x37,0x21,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0xbc,0x6b,0xfc,0xd6,0x03,0x6a, -0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfc,0x97,0x03,0x2a,0x6b,0x6a,0xe7,0xe8,0x23,0x87,0x50,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13,0x00,0x1f,0x00,0x47,0x40,0x44,0x1e,0x18,0x12,0x08,0x04,0x01,0x02,0x01,0x4c,0x06, -0x01,0x04,0x03,0x05,0x04,0x57,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1d,0x1c,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x27,0x37,0x21,0x35,0x21, -0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x33,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x70,0x6b,0xfb,0xaa,0x04,0x96,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfb,0x6b,0x04,0x56,0x6b,0x6a,0xe7,0xe8,0xc3,0xbe,0x13,0x1a,0x05,0x05,0x1c,0x15,0xba,0x6a,0xe7,0xe8,0x23,0x87,0x50, -0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0f,0x00,0x17,0x00,0x47,0x40,0x44,0x15,0x11,0x0d,0x05,0x04,0x01,0x02,0x01,0x4c,0x06,0x01,0x04,0x03,0x05,0x04,0x57,0x00,0x03, -0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x4f,0x10,0x10,0x00,0x00,0x10,0x17,0x10,0x17,0x13,0x12,0x00,0x0f,0x00,0x0f,0x11,0x11,0x12,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x37,0x27,0x21,0x35,0x21,0x27,0x37,0x21,0x35,0x21,0x37,0x33,0x07, -0x07,0x17,0x17,0x33,0x03,0x13,0x33,0x07,0x07,0x17,0x17,0x72,0x6a,0xfb,0x9d,0x04,0x25,0x3f,0x3f,0xfb,0xdb,0x04,0x64,0x6a,0x69,0xbe,0x2e,0x32,0xba,0xae,0xe7,0xe8,0x69,0xbe,0x2e,0x32,0xba,0x23,0x87,0x50,0x50,0x50,0x50,0x87,0xef,0x37,0x3d,0xeb,0x01,0x27,0x01,0x27,0xef,0x37,0x3d,0xeb,0x00,0x01,0xfb,0xa1,0x00,0x00,0x02,0x09, -0x02,0x99,0x00,0x13,0x00,0x35,0x40,0x32,0x00,0x04,0x03,0x04,0x85,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x68,0x07,0x01,0x01,0x08,0x01,0x00,0x09,0x01,0x00,0x67,0x0a,0x01,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x21,0x37,0x21,0x35,0x21, -0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0xfe,0x53,0x3e,0xfd,0x10,0x03,0x0e,0x3a,0xfc,0xb8,0x03,0x66,0x40,0x48,0x40,0x02,0xba,0xfd,0x28,0x3a,0x03,0x12,0xfc,0xd0,0x3e,0xaa,0x50,0xa0,0x50,0xaf,0xaf,0x50,0xa0,0x50,0xaa,0x00,0x00,0x00,0x01,0xfe,0x0c,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0e, -0x00,0x2e,0x40,0x2b,0x04,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x11,0x18,0x05,0x09,0x19,0x2b,0x25,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x17,0x21,0x15,0x21,0x07,0xfe, -0x0c,0xbe,0x13,0x1a,0x05,0x05,0x1c,0x15,0xba,0x6a,0xc8,0x02,0xc5,0xfd,0x3b,0xc9,0x23,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xff,0x50,0xff,0x00,0x01,0xfb,0xb3,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x19,0x00,0x34,0x40,0x31,0x11,0x04,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01, -0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x19,0x00,0x19,0x23,0x12,0x14,0x11,0x18,0x07,0x09,0x1b,0x2b,0x25,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x17,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x07,0xfb,0xb3,0xbe,0x13,0x1a,0x05,0x05,0x1d, -0x14,0xba,0x6a,0xc8,0x04,0xa1,0x04,0x07,0x05,0xba,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfb,0x5e,0xc9,0x23,0xef,0x17,0x1c,0x04,0x05,0x1e,0x1a,0xeb,0xff,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0xff,0xff,0xff,0xfe,0x61,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x27,0x04,0x1b,0xfe,0x0c,0x00,0x0f,0x01,0x06, -0x03,0x48,0xce,0x00,0x00,0x08,0xb1,0x00,0x01,0xb0,0x0f,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfe,0x89,0x00,0x2d,0x01,0x7f,0x02,0x67,0x00,0x27,0x04,0x1b,0xfe,0x34,0x00,0x00,0x03,0x06,0x03,0x2b,0x00,0x37,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0x00,0x02,0xfe,0xcf,0xff,0xb6,0x01,0x31,0x02,0xbc,0x00,0x0d, -0x00,0x11,0x00,0x08,0xb5,0x10,0x0e,0x0b,0x00,0x02,0x32,0x2b,0x25,0x35,0x25,0x36,0x36,0x37,0x35,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x25,0x15,0xfe,0xcf,0x01,0xea,0x11,0x1f,0x07,0x07,0x1f,0x11,0xfe,0x16,0x02,0x62,0xfd,0x9e,0x02,0x62,0x96,0x5a,0xa8,0x06,0x06,0x01,0x07,0x01,0x06,0x06,0xab,0x58,0xe1,0x64,0xfe,0x3f, -0x5a,0xe1,0x5a,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x19,0x00,0x42,0x40,0x3f,0x19,0x13,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03, -0x00,0x03,0x4f,0x00,0x00,0x18,0x17,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x07,0x37,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x17,0xfb,0xb3,0xeb,0xeb,0x6a,0x6a,0x04,0xa0,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x5f, -0x6a,0xa9,0x04,0xa2,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfb,0x5f,0x3f,0x23,0x01,0x26,0x01,0x28,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x00,0x00,0xff,0xff,0xfe,0x2a,0x00,0x40,0x01,0xd7,0x02,0x53,0x00,0x26,0x04,0x1b,0xd4,0x00,0x01,0x07,0x04,0x1b,0xfd,0xd5,0xff,0xff, -0x00,0x09,0xb1,0x01,0x01,0xb8,0xff,0xff,0xb0,0x35,0x2b,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x08,0x00,0x0e,0x00,0x3c,0x40,0x39,0x0d,0x0a,0x01,0x03,0x02,0x01,0x01,0x4c,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03, -0x00,0x03,0x4f,0x09,0x09,0x00,0x00,0x09,0x0e,0x09,0x0e,0x0c,0x0b,0x00,0x08,0x00,0x08,0x11,0x11,0x12,0x08,0x09,0x19,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x15,0x21,0x07,0x21,0x13,0x03,0x33,0x13,0x03,0xfc,0xdf,0xeb,0xeb,0x6a,0xc8,0x03,0xf2,0xfc,0x0e,0xc9,0xfe,0x6b,0xeb,0xeb,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x01,0x28,0xff,0x50, -0xff,0x01,0x26,0x01,0x28,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x47,0x40,0x44,0x12,0x0f,0x08,0x01,0x04,0x03,0x02,0x01,0x4c,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01, -0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x0e,0x0e,0x00,0x00,0x0e,0x13,0x0e,0x13,0x11,0x10,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x0a,0x09,0x1b,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x15,0x21,0x17,0x07,0x21,0x15,0x21,0x07,0x21,0x13,0x03,0x33,0x13,0x03,0xfc,0xdf,0xeb,0xeb,0x6a,0x6a,0x04,0x50,0xfb, -0xee,0x3f,0x3f,0x04,0x12,0xfb,0xaf,0x6a,0xfe,0x6b,0xeb,0xeb,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x01,0x28,0x87,0x50,0x50,0x50,0x50,0x87,0x01,0x26,0x01,0x28,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0xff,0xff,0xfc,0x6d,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x27,0x04,0x1b,0xfc,0x18,0x00,0x00,0x00,0x27,0x04,0x1b,0xfe,0x0c,0x00,0x00,0x02,0x06, -0x04,0x1b,0x00,0x00,0x00,0x01,0xfd,0xf3,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0e,0x00,0x30,0x40,0x2d,0x01,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x23,0x12,0x05,0x09, -0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x17,0x17,0xfe,0xda,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0x03,0x7b,0xfc,0x86,0x04,0x08,0x04,0xba,0x23,0x01,0x27,0x01,0x27,0xef,0x04,0x08,0x04,0x50,0x04,0x0b,0x05,0xeb,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0e,0x00,0x30,0x40,0x2d, -0x01,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x23,0x12,0x05,0x09,0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x17,0x17,0xfc,0x82,0xe7, -0xe8,0x69,0xbe,0x03,0x07,0x03,0x05,0xe2,0xfa,0x1a,0x05,0x0a,0x06,0xba,0x23,0x01,0x27,0x01,0x27,0xef,0x04,0x08,0x04,0x4b,0x05,0x0d,0x07,0xeb,0x00,0x01,0xfb,0x9b,0x00,0x23,0x01,0xd6,0x02,0x71,0x00,0x0c,0x00,0x33,0x40,0x30,0x09,0x01,0x02,0x05,0x01,0x4c,0x04,0x01,0x00,0x05,0x01,0x00,0x57,0x06,0x01,0x05,0x00,0x02,0x01,0x05, -0x02,0x68,0x04,0x01,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x0c,0x00,0x0c,0x12,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x01,0x35,0x33,0x11,0x23,0x35,0x21,0x17,0x23,0x03,0x13,0x33,0x07,0x01,0x7c,0x5a,0x5a,0xfa,0xa6,0xca,0x6a,0xe7,0xe8,0x69,0xcb,0x01,0x72,0xff,0xfd,0xb2,0xff,0xff,0x01,0x27,0x01, -0x27,0xff,0x00,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x35,0x40,0x32,0x08,0x01,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12, -0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0xfc,0x82,0xe7,0xe8,0x69,0xcb,0x05,0x66,0xcb,0x6a,0xe7,0xe8,0x69,0xcb,0xfa,0x9b,0xca,0x23,0x01,0x27,0x01,0x27,0xff,0xff,0xfe,0xd9,0xfe,0xd9,0xff,0xff,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0d, -0x00,0x34,0x40,0x31,0x08,0x01,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x37,0x33,0x03,0x13, -0x23,0x27,0x21,0x17,0xfc,0x82,0xe7,0xe8,0x69,0xcb,0x04,0xa1,0xc9,0x69,0xe7,0xe7,0x6a,0xc8,0xfb,0x60,0xca,0x23,0x01,0x27,0x01,0x27,0xff,0xff,0xfe,0xda,0xfe,0xd8,0xff,0xff,0x00,0x00,0xff,0xff,0xfe,0x89,0x00,0x2d,0x01,0x7f,0x02,0x67,0x00,0x27,0x04,0x1c,0xfe,0x34,0x00,0x00,0x03,0x06,0x03,0x2b,0x00,0x37,0x00,0x08,0xb1,0x01, -0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfb,0xcd,0x00,0x2d,0x01,0xa9,0x02,0x67,0x00,0x27,0x04,0x1c,0xfb,0x78,0x00,0x00,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x01,0x06,0x04,0x1c,0xa6,0x00,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0x00,0x04,0xf9,0x43,0xff,0xfb,0x02,0x03,0x02,0xda,0x00,0x03, -0x00,0x10,0x00,0x14,0x00,0x22,0x00,0x62,0x40,0x5f,0x05,0x01,0x04,0x03,0x01,0x4c,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x80,0x0b,0x01,0x05,0x09,0x08,0x09,0x05,0x08,0x80,0x06,0x01,0x03,0x0c,0x07,0x02,0x04,0x01,0x03,0x04,0x68,0x0a,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x09,0x09,0x08,0x61,0x0d,0x01,0x08,0x08, -0x42,0x08,0x4e,0x16,0x15,0x11,0x11,0x04,0x04,0x00,0x00,0x1d,0x1a,0x15,0x22,0x16,0x21,0x11,0x14,0x11,0x14,0x13,0x12,0x04,0x10,0x04,0x10,0x0d,0x0c,0x0b,0x0a,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x0e,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x05,0x03,0x13,0x33,0x07,0x06,0x07,0x21,0x15,0x21,0x16,0x17,0x17,0x25,0x35,0x21,0x15,0x01, -0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfc,0x53,0x0c,0x6a,0x0c,0xfd,0x85,0xe7,0xe8,0x69,0xbe,0x07,0x06,0x01,0xeb,0xfe,0x16,0x08,0x08,0xba,0x02,0xb0,0x04,0xbf,0xfa,0x6a,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xb4,0x01,0x27,0x01,0x27,0xef,0x08,0x08,0x50,0x0a,0x0a, -0xeb,0xff,0x50,0x50,0xfe,0xd9,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0xff,0xff,0xfd,0xee,0x00,0x41,0x02,0x20,0x02,0x6c,0x00,0x27,0x04,0x1c,0xfd,0x99,0x00,0x00,0x00,0x06,0x03,0x34,0xec,0x00,0xff,0xff,0xfb,0xb4,0x00,0x41,0x01,0xf4,0x02,0x6c,0x00,0x27,0x04,0x1c,0xfb,0x5f,0x00,0x00,0x00,0x26,0x04,0x1b,0xf1,0x00, -0x00,0x07,0x03,0x34,0xfd,0xa8,0x00,0x00,0x00,0x02,0xfe,0x98,0xff,0xab,0x01,0x45,0x02,0xee,0x00,0x05,0x00,0x0e,0x00,0x41,0x40,0x0a,0x0b,0x07,0x06,0x02,0x01,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57, -0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x05,0x00,0x05,0x13,0x03,0x09,0x17,0x2b,0x17,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16,0x17,0xeb,0xfd,0xad,0x02,0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68, -0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x03,0xfc,0x77,0xff,0xab,0x00,0xd2,0x02,0xee,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x50,0x40,0x0a,0x0f,0x0b,0x0a,0x06,0x05,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x05,0x03,0x04,0x03,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x01,0x4e, -0x1b,0x40,0x15,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x59,0x40,0x12,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x08,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16, -0x17,0x78,0x5a,0xfd,0xf8,0xfd,0xad,0x02,0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x03,0x43,0xfc,0xbd,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68,0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x04,0xfa,0x7e,0xff,0xab,0x00,0x87,0x02,0xee,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x5f, -0x40,0x0a,0x13,0x0f,0x0e,0x0a,0x09,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x12,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x19,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01, -0x4f,0x59,0x40,0x1a,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0c,0x0b,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16,0x17,0x2d,0x5a,0xfd,0xf8,0x5a,0xfd,0xf8,0xfd,0xad,0x02, -0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfc,0xbd,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68,0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x03,0xfb,0xe6,0xff,0x92,0x01,0xc2,0x03,0x0c,0x00,0x03,0x00,0x10,0x00,0x1d,0x00,0x2a,0x40,0x27,0x1d,0x19,0x15,0x14, -0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x09,0x05,0x04,0x0e,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x37,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x35,0x01,0x15,0x01,0x01,0x35,0x01,0x15,0x01,0x06,0x06,0x07,0x16,0x16, -0x17,0x01,0xfe,0xa7,0x5a,0x6e,0x01,0xbd,0x14,0x27,0x0a,0x0a,0x27,0x14,0xfe,0x43,0x02,0x53,0xfc,0x77,0xfd,0xad,0x02,0x53,0xfe,0x43,0x13,0x26,0x0b,0x0b,0x26,0x13,0x01,0xbd,0x6e,0x03,0x7a,0xfc,0x86,0x18,0x6b,0x01,0x10,0x0c,0x15,0x04,0x05,0x16,0x0c,0x01,0x16,0x67,0xfe,0x8e,0x64,0xfe,0x91,0x01,0x6f,0x64,0x01,0x72,0x6b,0xfe, -0xeb,0x0c,0x16,0x05,0x05,0x15,0x0b,0xfe,0xee,0x00,0x00,0x00,0x00,0x03,0xfe,0x07,0xff,0x74,0x02,0x01,0x03,0x66,0x00,0x2d,0x00,0x34,0x00,0x3c,0x00,0x49,0x40,0x46,0x32,0x24,0x1d,0x1a,0x06,0x05,0x03,0x02,0x3c,0x31,0x25,0x13,0x0b,0x07,0x05,0x04,0x08,0x01,0x03,0x2c,0x01,0x04,0x00,0x03,0x4c,0x35,0x01,0x01,0x01,0x4b,0x00,0x02, -0x03,0x02,0x85,0x00,0x03,0x01,0x03,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x00,0x4e,0x00,0x00,0x00,0x2d,0x00,0x2d,0x14,0x19,0x1f,0x11,0x06,0x09,0x1a,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34, -0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x34,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x01,0x04,0x79,0x69,0xfd,0xe5,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0xc5,0x2c,0x5d,0x37,0x1b,0x4a,0x52,0x63,0x54,0x3c,0x53, -0x64,0x01,0x5a,0x31,0x2d,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x30,0x2b,0x0c,0x8c,0x83,0x04,0x2f,0xee,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0c,0x08,0xc4,0x13,0x15,0x02,0x01,0x07,0x08,0x17,0x6b,0x4a,0x50,0x68,0x08,0x84,0x83,0x08,0x68,0x52,0x2f,0x3b,0x07,0xf8,0x0d,0x17,0x6d,0x4b,0x52,0x6c, -0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x42,0x0d,0x04,0x00,0x00,0x03,0xfb,0xbe,0xff,0x74,0x01,0xea,0x03,0x66,0x00,0x37,0x00,0x3e,0x00,0x46,0x00,0x48,0x40,0x45,0x46,0x3c,0x3b,0x2f,0x2e,0x28,0x24,0x22,0x21,0x1d,0x1a,0x13,0x0b,0x07,0x06,0x05,0x04,0x11,0x01,0x02,0x23,0x01,0x00,0x01, -0x36,0x01,0x03,0x00,0x03,0x4c,0x3f,0x01,0x01,0x01,0x4b,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x00,0x4e,0x00,0x00,0x00,0x37,0x00,0x37,0x19,0x1f,0x11,0x05,0x09,0x19,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x16, -0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0xfe,0xbb,0x79,0x69,0xfd,0xe5,0x01,0xae,0xfe,0xca,0x13, -0x21,0x08,0x09,0x21,0x12,0x01,0xc5,0x2c,0x5d,0x37,0x1b,0x4a,0x52,0x63,0x54,0x3c,0x23,0x50,0x25,0x02,0x5b,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfd,0xf8,0x3f,0x34,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x30,0x2b,0x0c,0x8c,0x83,0x04,0x2f,0xee,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03, -0x0c,0x08,0xc4,0x13,0x15,0x02,0x01,0x07,0x08,0x16,0x6c,0x4a,0x50,0x67,0x08,0x85,0x85,0x04,0x19,0x13,0xfe,0xcb,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x01,0x0a,0x20,0x08,0xf8,0x0d,0x17,0x6d,0x4b,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x41,0x0e,0x04,0x00,0x00, -0x00,0x04,0xf9,0x43,0x00,0x00,0x02,0x03,0x02,0xda,0x00,0x1b,0x00,0x24,0x00,0x28,0x00,0x2c,0x00,0x7d,0x40,0x7a,0x1d,0x01,0x10,0x0f,0x01,0x4c,0x00,0x0e,0x04,0x03,0x04,0x0e,0x03,0x80,0x17,0x01,0x11,0x00,0x0b,0x00,0x11,0x0b,0x80,0x07,0x05,0x02,0x03,0x13,0x08,0x02,0x02,0x0f,0x03,0x02,0x68,0x14,0x01,0x0f,0x18,0x15,0x02,0x10, -0x01,0x0f,0x10,0x68,0x12,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x11,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x16,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x29,0x29,0x1c,0x1c,0x00,0x00,0x29,0x2c,0x29,0x2c,0x2b,0x2a,0x28,0x27,0x26,0x25,0x1c,0x24,0x1c,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17, -0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x17,0x25,0x33,0x37,0x23,0x05,0x35,0x21,0x15,0xfb,0xa3, -0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0xfe,0x41,0xe7,0xe8,0x69,0xcb,0x01,0x69,0xfe,0x98,0xca,0x01,0x87,0xa0,0x22,0xa0,0x01,0x93,0x04,0x33,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x23,0x01,0x27,0x01,0x27,0xff,0x50, -0xff,0xf0,0xb4,0xa5,0x50,0x50,0x00,0x00,0x00,0x02,0xfd,0xee,0x00,0x2d,0x02,0x26,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x3e,0x40,0x3b,0x10,0x0f,0x0e,0x03,0x01,0x02,0x14,0x01,0x00,0x01,0x18,0x0d,0x0c,0x03,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05, -0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0xdd,0xf1,0xf1,0x58,0xf1,0xf1,0xfe,0x67,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08, -0x09,0x22,0x11,0x01,0x36,0x2d,0xf5,0x50,0xf5,0xf5,0x50,0xf5,0x14,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x00,0x00,0x00,0x00,0x03,0xfb,0xb4,0x00,0x2d,0x01,0xf4,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x25,0x00,0x45,0x40,0x42,0x24,0x23,0x22,0x10,0x0f,0x0e,0x06,0x01,0x02,0x1e,0x14,0x02,0x00,0x01,0x25,0x1a, -0x19,0x18,0x0d,0x0c,0x06,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25, -0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0xfe,0xa8,0xf1,0xf1,0x58,0xf1,0xf1,0xfe,0x62,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0x02,0xe4,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0x2d,0xf5, -0x50,0xf5,0xf5,0x50,0xf5,0x14,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x00,0x02,0xfe,0xcf,0xff,0xb6,0x01,0x31,0x02,0xbc,0x00,0x0d,0x00,0x11,0x00,0x08,0xb5,0x10,0x0e,0x03,0x00,0x02,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06, -0x07,0x15,0x32,0x16,0x17,0x05,0x11,0x25,0x35,0x05,0x01,0x31,0xfd,0x9e,0x02,0x62,0xfe,0x16,0x11,0x1e,0x08,0x08,0x1e,0x11,0x01,0xea,0xfd,0x9e,0x02,0x62,0x96,0xe1,0x64,0xe1,0x5a,0xa8,0x06,0x06,0x01,0x07,0x06,0x06,0xab,0xfe,0xc7,0xe2,0x58,0xe2,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xd6,0x02,0x71,0x00,0x0c,0x00,0x11,0x00,0x40, -0x40,0x3d,0x11,0x01,0x02,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x11,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b, -0x25,0x03,0x13,0x33,0x07,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x17,0x27,0x21,0x35,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69,0x6b,0x04,0xfb,0x5a,0x5a,0xfb,0x05,0x6b,0xaa,0x05,0x3a,0xfa,0xc5,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfd,0xb2,0x87,0x87,0xd7,0xa0,0x4f,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0d, -0x00,0x6c,0xb6,0x08,0x01,0x02,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x00,0x01,0x01,0x00,0x70,0x06,0x01,0x05,0x04,0x04,0x05,0x71,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x1b,0x40,0x23,0x00,0x00,0x01,0x00,0x85,0x06,0x01, -0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x17,0xfc,0x82,0xe7,0xe8, -0x69,0x6b,0x05,0x82,0xfa,0x3e,0x3d,0x3e,0x05,0xc1,0xfa,0x7e,0x6b,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x4f,0x51,0x50,0x87,0x00,0x02,0xf9,0x43,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00, -0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00, -0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0xfa,0x2a,0xe7,0xe8,0x69,0x6b,0x06,0xfe,0x6b,0x6a,0xe7,0xe8,0x69, -0x6b,0xf9,0x02,0x6b,0xaa,0x07,0x7d,0x41,0x42,0xf8,0x83,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x4f,0x51,0x4f,0x00,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58, -0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07, -0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69, -0x6b,0x04,0xa6,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x5a,0x6b,0xaa,0x05,0x25,0x41,0x42,0xfa,0xdb,0x3e,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x4f,0x51,0x4f,0x00,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x42,0x40,0x3f,0x13,0x10,0x08,0x01,0x04,0x06, -0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21, -0x37,0x33,0x03,0x13,0x23,0x27,0x21,0x17,0x27,0x21,0x27,0x37,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69,0x6b,0x04,0xa0,0x6a,0x69,0xe8,0xe8,0x6a,0x6a,0xfb,0x61,0x6b,0xaa,0x04,0xa0,0x3f,0x3f,0xfb,0x5f,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xda,0xfe,0xd8,0x87,0x87,0xd7,0x50,0x50,0x4f,0x00,0x02,0xfe,0x34,0x00,0x28,0x01,0xcc, -0x02,0x6c,0x00,0x05,0x00,0x13,0x00,0x08,0xb5,0x0e,0x06,0x03,0x00,0x02,0x32,0x2b,0x35,0x25,0x35,0x25,0x05,0x15,0x05,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x05,0x06,0x07,0x16,0x17,0xfe,0x34,0x01,0xcc,0x01,0xcc,0xfe,0x38,0x01,0x4e,0x14,0x17,0x04,0x04,0x18,0x11,0xfe,0xab,0xfe,0xb7,0x25,0x0c,0x0c,0x25,0x28,0xf0,0x64,0xf0, -0xf0,0x64,0x91,0xaa,0x0a,0x0c,0x02,0x02,0x0a,0x09,0xb0,0xac,0x13,0x03,0x03,0x13,0xff,0xff,0xfe,0x47,0x00,0x41,0x01,0xd6,0x02,0x53,0x00,0x27,0x04,0x1c,0xfd,0xf2,0x00,0x00,0x00,0x06,0x04,0x1c,0xd3,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x08,0x00,0x0e,0x00,0x3c,0x40,0x39,0x0d,0x0a,0x01,0x03,0x02,0x01, -0x01,0x4c,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x04,0x01,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x09,0x09,0x00,0x00,0x09,0x0e,0x09,0x0e,0x0c,0x0b,0x00,0x08,0x00,0x08,0x11,0x11,0x12,0x08,0x09,0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x13,0x21,0x03,0x13, -0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0xcb,0x04,0xb6,0xfb,0x46,0xcf,0xfe,0x6a,0xe7,0xe8,0x69,0xea,0xea,0x23,0x01,0x27,0x01,0x27,0xff,0x4b,0xfe,0xfc,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xdb,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x47,0x40,0x44,0x12,0x0f,0x08,0x01,0x04,0x03, -0x02,0x01,0x4c,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x0e,0x0e,0x00,0x00,0x0e,0x13,0x0e,0x13,0x11,0x10,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x0a,0x09,0x1b,0x2b,0x25, -0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x17,0x21,0x03,0x13,0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0x6b,0x04,0x2e,0xfb,0x92,0x3f,0x40,0x04,0x6d,0xfb,0xd2,0x6b,0xfe,0x6a,0xe7,0xe8,0x69,0xe9,0xe9,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x4f,0x51,0x50,0x87,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x00, -0xff,0xff,0xfb,0xf5,0x00,0x41,0x01,0xbd,0x02,0x53,0x00,0x27,0x04,0x1c,0xfb,0xa0,0x00,0x00,0x00,0x27,0x04,0x1c,0xfd,0xad,0x00,0x00,0x00,0x06,0x04,0x1c,0xba,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x4c,0x00,0x52,0x00,0xa6,0x40,0x09,0x51,0x4e,0x4b,0x01,0x04,0x02,0x09,0x01,0x4c,0x4b,0xb0,0x0d,0x50,0x58, -0x40,0x34,0x00,0x07,0x01,0x09,0x02,0x07,0x72,0x0f,0x01,0x00,0x01,0x0e,0x00,0x57,0x05,0x03,0x02,0x01,0x0d,0x0b,0x02,0x09,0x02,0x01,0x09,0x6a,0x06,0x04,0x02,0x02,0x0c,0x0a,0x02,0x08,0x0e,0x02,0x08,0x6a,0x0f,0x01,0x00,0x00,0x0e,0x5f,0x12,0x10,0x11,0x03,0x0e,0x00,0x0e,0x4f,0x1b,0x40,0x35,0x00,0x07,0x01,0x09,0x01,0x07,0x09, -0x80,0x0f,0x01,0x00,0x01,0x0e,0x00,0x57,0x05,0x03,0x02,0x01,0x0d,0x0b,0x02,0x09,0x02,0x01,0x09,0x6a,0x06,0x04,0x02,0x02,0x0c,0x0a,0x02,0x08,0x0e,0x02,0x08,0x6a,0x0f,0x01,0x00,0x00,0x0e,0x5f,0x12,0x10,0x11,0x03,0x0e,0x00,0x0e,0x4f,0x59,0x40,0x24,0x4d,0x4d,0x00,0x00,0x4d,0x52,0x4d,0x52,0x50,0x4f,0x00,0x4c,0x00,0x4c,0x4a, -0x48,0x44,0x42,0x3e,0x3c,0x38,0x36,0x32,0x30,0x23,0x12,0x24,0x24,0x24,0x24,0x24,0x21,0x12,0x13,0x09,0x1f,0x2b,0x25,0x03,0x13,0x33,0x07,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23, -0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x23,0x07,0x13,0x21,0x03,0x13,0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0x98,0x1e,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32, -0x21,0x1b,0x1e,0x15,0x15,0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x26,0x31,0x22,0x1c,0x1e,0x15,0x5a,0x16,0xea,0xfe,0x6a,0xe7,0xe8,0x69,0xe9,0xe9,0x23,0x01,0x27,0x01,0x27,0xbf,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a, -0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1c,0xfe,0xd8,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x01,0xfd,0xf3,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x3d,0x00,0xa0,0x40,0x0b,0x3c,0x01,0x07,0x03,0x01,0x4c,0x01,0x01,0x01,0x01,0x4b,0x4b, -0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x00,0x02,0x00,0x85,0x00,0x06,0x02,0x08,0x03,0x06,0x72,0x00,0x01,0x08,0x03,0x08,0x01,0x03,0x80,0x0c,0x01,0x0b,0x07,0x0b,0x86,0x04,0x01,0x02,0x0a,0x01,0x08,0x01,0x02,0x08,0x6a,0x05,0x01,0x03,0x07,0x07,0x03,0x59,0x05,0x01,0x03,0x03,0x07,0x62,0x09,0x01,0x07,0x03,0x07,0x52,0x1b,0x40,0x38, -0x00,0x00,0x02,0x00,0x85,0x00,0x06,0x02,0x08,0x02,0x06,0x08,0x80,0x00,0x01,0x08,0x03,0x08,0x01,0x03,0x80,0x0c,0x01,0x0b,0x07,0x0b,0x86,0x04,0x01,0x02,0x0a,0x01,0x08,0x01,0x02,0x08,0x6a,0x05,0x01,0x03,0x07,0x07,0x03,0x59,0x05,0x01,0x03,0x03,0x07,0x62,0x09,0x01,0x07,0x03,0x07,0x52,0x59,0x40,0x16,0x00,0x00,0x00,0x3d,0x00, -0x3d,0x38,0x36,0x32,0x30,0x24,0x23,0x12,0x24,0x24,0x24,0x24,0x21,0x12,0x0d,0x09,0x1f,0x2b,0x25,0x03,0x13,0x33,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x02,0x07, -0x17,0xfe,0xda,0xe7,0xe8,0x69,0xeb,0x0d,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15,0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x17,0x22,0x20,0x29,0x1e,0xb6,0x23,0x01,0x27,0x01, -0x27,0xfe,0xd9,0x15,0x1f,0x1f,0x15,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x38,0x28,0x28,0x3a,0x49,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x17,0x21,0x1f,0x07,0xe6,0x00,0x00,0x00,0x00,0x03,0xfb,0xb4,0x00,0x41,0x01,0xf4,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x4d,0x00,0xa4,0x40,0x1f, -0x18,0x02,0x02,0x01,0x07,0x12,0x08,0x02,0x04,0x01,0x19,0x01,0x02,0x02,0x04,0x03,0x4c,0x17,0x16,0x04,0x03,0x04,0x03,0x4a,0x0e,0x0d,0x0c,0x00,0x04,0x00,0x49,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x2c,0x00,0x07,0x03,0x01,0x04,0x07,0x72,0x00,0x02,0x04,0x00,0x01,0x02,0x72,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01, -0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x2e,0x00,0x07,0x03,0x01,0x03,0x07,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01,0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00, -0x04,0x00,0x52,0x59,0x40,0x1b,0x1b,0x1a,0x49,0x47,0x43,0x41,0x3e,0x3d,0x3b,0x39,0x35,0x33,0x2f,0x2d,0x29,0x27,0x24,0x23,0x21,0x1f,0x1a,0x4d,0x1b,0x4d,0x0b,0x09,0x16,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x05,0x22,0x2e,0x03, -0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0xfd,0x62,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0x02,0xe4,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca, -0x01,0xae,0xfc,0x81,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x48,0x3a,0x25,0x31,0x22,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x32,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x31,0x41,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0x57,0x98,0x09, -0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x33,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x66,0x00,0xb3,0x40,0x0b,0x12,0x01,0x0a,0x04, -0x0f,0x06,0x02,0x03,0x0c,0x02,0x4c,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x02,0x04,0x02,0x85,0x00,0x0a,0x04,0x0c,0x03,0x0a,0x72,0x00,0x01,0x00,0x01,0x86,0x08,0x06,0x02,0x04,0x10,0x0e,0x02,0x0c,0x03,0x04,0x0c,0x69,0x09,0x07,0x05,0x03,0x03,0x00,0x00,0x03,0x59,0x09,0x07,0x05,0x03,0x03,0x03,0x00,0x62,0x0f,0x0d,0x0b,0x11, -0x04,0x00,0x03,0x00,0x52,0x1b,0x40,0x38,0x00,0x02,0x04,0x02,0x85,0x00,0x0a,0x04,0x0c,0x04,0x0a,0x0c,0x80,0x00,0x01,0x00,0x01,0x86,0x08,0x06,0x02,0x04,0x10,0x0e,0x02,0x0c,0x03,0x04,0x0c,0x69,0x09,0x07,0x05,0x03,0x03,0x00,0x00,0x03,0x59,0x09,0x07,0x05,0x03,0x03,0x03,0x00,0x62,0x0f,0x0d,0x0b,0x11,0x04,0x00,0x03,0x00,0x52, -0x59,0x40,0x29,0x01,0x00,0x62,0x60,0x5c,0x5a,0x56,0x54,0x50,0x4e,0x4a,0x48,0x44,0x42,0x3f,0x3e,0x3c,0x3a,0x36,0x34,0x30,0x2e,0x2a,0x28,0x24,0x22,0x1e,0x1c,0x18,0x16,0x11,0x10,0x0e,0x0d,0x00,0x66,0x01,0x66,0x12,0x09,0x16,0x2b,0x25,0x22,0x2e,0x03,0x27,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x23,0x03,0x13,0x33,0x07,0x1e,0x03, -0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0xfc,0xd6,0x24,0x30,0x22,0x1b,0x1b,0x13, -0x09,0x0c,0x02,0x04,0x19,0x15,0xba,0x6a,0xe7,0xe8,0x69,0xa2,0x1a,0x23,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15, -0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x31,0xe5,0x18,0x24,0x26,0x1c,0x03,0x0b,0x0d,0x03,0x04,0x1f,0x1a,0xeb,0x01,0x27,0x01,0x27,0xcc,0x0c,0x27,0x27,0x1b,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27, -0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x00,0x01,0xfe,0x2a,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x10,0x00,0x23,0x40,0x20,0x0d,0x09,0x05,0x04,0x03,0x02,0x01,0x07, -0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x10,0x00,0x10,0x1e,0x03,0x09,0x17,0x2b,0x17,0x37,0x01,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x33,0x01,0x28,0x2b,0xfd,0xd7,0x01,0xae,0xfe,0xca,0x11,0x1c,0x07,0x07,0x1c,0x11,0x01,0xcd,0x01,0x1c,0x5f,0xfe,0x9d,0x6e, -0x71,0x01,0x15,0x64,0xd7,0x5a,0x97,0x09,0x0c,0x02,0x02,0x0c,0x09,0xe6,0x02,0xf0,0xfc,0x54,0x00,0x00,0x00,0x01,0xfb,0xf5,0xff,0x92,0x01,0xb3,0x03,0x3e,0x00,0x1d,0x00,0x2a,0x40,0x27,0x1c,0x18,0x14,0x13,0x12,0x11,0x10,0x0d,0x09,0x05,0x04,0x03,0x02,0x01,0x0e,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01, -0x76,0x00,0x00,0x00,0x1d,0x00,0x1d,0x1e,0x03,0x09,0x17,0x2b,0x05,0x37,0x01,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x33,0x07,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x01,0xfd,0xf3,0x2b,0xfd,0xd7,0x01,0xae,0xfe,0xca,0x11,0x1c,0x07,0x07,0x1c,0x11,0x01,0xcd,0x01,0x1c,0x5f,0x3d,0x02, -0x3b,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0x20,0xfe,0xf7,0x6e,0x71,0x01,0x15,0x64,0xd7,0x5a,0x97,0x09,0x0c,0x02,0x02,0x0c,0x09,0xe6,0x02,0xf0,0xa3,0xfe,0xe1,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0xf0,0xfd,0x42,0x00,0x01,0xfe,0x11,0x00,0xdc,0x01,0xf4,0x01,0xb8,0x00,0x1e,0x00,0x6e,0x4b,0xb0, -0x11,0x50,0x58,0x40,0x22,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x06,0x00,0x04,0x59,0x00,0x05,0x00,0x06,0x00,0x05,0x06,0x67,0x00,0x04,0x04,0x00,0x61,0x02,0x07,0x02,0x00,0x04,0x00,0x51,0x1b,0x40,0x29,0x00,0x02,0x06,0x00,0x06,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x06,0x00,0x04,0x59, -0x00,0x05,0x00,0x06,0x02,0x05,0x06,0x67,0x00,0x04,0x04,0x00,0x61,0x07,0x01,0x00,0x04,0x00,0x51,0x59,0x40,0x15,0x01,0x00,0x1c,0x1b,0x1a,0x18,0x16,0x14,0x10,0x0e,0x0b,0x0a,0x07,0x05,0x00,0x1e,0x01,0x1e,0x08,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x36, -0x35,0x35,0x21,0x15,0x21,0x06,0x06,0x64,0x29,0x38,0x29,0x24,0x27,0x1b,0x1f,0x27,0x55,0x55,0x46,0x2a,0x39,0x29,0x23,0x27,0x1a,0x20,0x26,0x02,0x12,0xfe,0x2f,0x13,0x46,0xdc,0x1d,0x2b,0x2c,0x1d,0x26,0x20,0x3c,0x3c,0x41,0x50,0x1d,0x2b,0x2c,0x1d,0x28,0x1e,0x05,0x50,0x21,0x25,0x00,0x00,0x00,0x02,0xfd,0xee,0xff,0x4c,0x02,0x30, -0x02,0xe4,0x00,0x44,0x00,0x52,0x00,0xcb,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x0b,0x2e,0x19,0x02,0x0c,0x03,0x42,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0b,0x2e,0x19,0x02,0x0c,0x03,0x42,0x01,0x02,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x38,0x00,0x07,0x00,0x0c,0x01,0x07,0x0c,0x69,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69, -0x00,0x04,0x02,0x0d,0x02,0x00,0x0b,0x04,0x00,0x69,0x0e,0x01,0x0b,0x00,0x06,0x09,0x0b,0x06,0x69,0x00,0x08,0x08,0x05,0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x09,0x09,0x0a,0x5f,0x00,0x0a,0x0a,0x3d,0x0a,0x4e,0x1b,0x40,0x3f,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x07,0x00,0x0c,0x01,0x07,0x0c,0x69,0x00,0x03,0x00,0x01,0x04, -0x03,0x01,0x69,0x00,0x04,0x0d,0x01,0x00,0x0b,0x04,0x00,0x69,0x0e,0x01,0x0b,0x00,0x06,0x09,0x0b,0x06,0x69,0x00,0x08,0x08,0x05,0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x09,0x09,0x0a,0x5f,0x00,0x0a,0x0a,0x3d,0x0a,0x4e,0x59,0x40,0x25,0x46,0x45,0x01,0x00,0x4d,0x4b,0x45,0x52,0x46,0x52,0x3e,0x3c,0x3b,0x39,0x34,0x32,0x2c,0x2a,0x25, -0x23,0x1e,0x1c,0x17,0x15,0x11,0x0f,0x0b,0x0a,0x07,0x05,0x00,0x44,0x01,0x44,0x0f,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x36,0x37,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35, -0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x35,0x06,0x06,0x05,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x62,0x31,0x45,0x32,0x29,0x2a,0x1a,0x1e,0x28,0x55,0x28,0x46,0x2b,0x2c,0x3c,0x2e,0x2a,0x33,0x24,0x39,0x4c,0x0a,0x90,0x7e,0x72,0x83,0x56,0x4a,0x49,0x57, -0x46,0x40,0x29,0x36,0x09,0x02,0x55,0x50,0x5a,0x64,0x6b,0x5d,0x6e,0x6e,0x55,0x7e,0x45,0x19,0x49,0x01,0xc5,0x26,0x2a,0x2a,0x26,0x26,0x2a,0x2a,0xfa,0x1a,0x27,0x27,0x1a,0x25,0x1c,0x3c,0x3c,0x28,0x3f,0x25,0x1a,0x27,0x27,0x1a,0x3e,0x33,0x0c,0x87,0x9b,0x83,0x72,0xfe,0xf1,0x4e,0x5b,0x58,0x47,0x74,0x4a,0x51,0x20,0x1c,0x46,0x55, -0x5a,0x74,0x68,0xfe,0xac,0x64,0x73,0x4b,0x47,0x83,0x58,0xcf,0x20,0x23,0x80,0x31,0x2b,0x75,0x2c,0x2f,0x30,0x2c,0x74,0x2b,0x31,0x00,0x00,0x00,0x00,0x01,0xfd,0xee,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x3d,0x00,0xa0,0x40,0x0b,0x01,0x01,0x01,0x05,0x01,0x4c,0x3c,0x01,0x09,0x01,0x4b,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x0a, -0x06,0x0a,0x85,0x00,0x04,0x06,0x00,0x05,0x04,0x72,0x00,0x09,0x00,0x05,0x00,0x09,0x05,0x80,0x0c,0x01,0x0b,0x01,0x0b,0x86,0x08,0x01,0x06,0x02,0x01,0x00,0x09,0x06,0x00,0x6a,0x07,0x01,0x05,0x01,0x01,0x05,0x59,0x07,0x01,0x05,0x05,0x01,0x62,0x03,0x01,0x01,0x05,0x01,0x52,0x1b,0x40,0x38,0x00,0x0a,0x06,0x0a,0x85,0x00,0x04,0x06, -0x00,0x06,0x04,0x00,0x80,0x00,0x09,0x00,0x05,0x00,0x09,0x05,0x80,0x0c,0x01,0x0b,0x01,0x0b,0x86,0x08,0x01,0x06,0x02,0x01,0x00,0x09,0x06,0x00,0x6a,0x07,0x01,0x05,0x01,0x01,0x05,0x59,0x07,0x01,0x05,0x05,0x01,0x62,0x03,0x01,0x01,0x05,0x01,0x52,0x59,0x40,0x16,0x00,0x00,0x00,0x3d,0x00,0x3d,0x3b,0x3a,0x39,0x37,0x24,0x24,0x24, -0x22,0x13,0x24,0x24,0x24,0x25,0x0d,0x09,0x1f,0x2b,0x37,0x37,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x33,0x03,0x33,0x13,0x03,0xbc,0xb6,0x1e,0x29,0x20,0x22,0x17,0x15, -0x1f,0x1d,0x24,0x32,0x26,0x25,0x34,0x24,0x1e,0x1f,0x15,0x15,0x1e,0x1b,0x21,0x31,0x26,0x3a,0x48,0x55,0x2f,0x14,0x1e,0x1b,0x22,0x32,0x25,0x25,0x33,0x24,0x1d,0x1f,0x15,0x14,0x1f,0x1d,0x24,0x34,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x10,0xee,0x6a,0xe7,0xe8,0x23,0xe5,0x08,0x1e,0x22,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a, -0x1a,0x27,0x27,0x1a,0x48,0x3a,0x28,0x28,0x37,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x15,0x1f,0x1f,0x15,0x01,0x27,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x01,0xfe,0x57,0x00,0xe6,0x01,0xae,0x01,0xb3,0x00,0x33,0x00,0x83,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x2c,0x00,0x07,0x03,0x01,0x04,0x07,0x72,0x00,0x02,0x04,0x00, -0x01,0x02,0x72,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01,0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x2e,0x00,0x07,0x03,0x01,0x03,0x07,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01, -0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x59,0x40,0x1b,0x01,0x00,0x2f,0x2d,0x29,0x27,0x24,0x23,0x21,0x1f,0x1b,0x19,0x15,0x13,0x0f,0x0d,0x0a,0x09,0x07,0x05,0x00,0x33,0x01,0x33,0x0b,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e, -0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x5f,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x48,0x3a,0x25,0x31,0x22,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x32,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15, -0x15,0x1d,0x1b,0x21,0x31,0xe6,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x01,0xfb,0x96,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x61,0x00,0xf7,0x40,0x0b,0x5d,0x01,0x08,0x0a,0x60,0x01,0x02,0x09, -0x00,0x02,0x4c,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x38,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x00,0x09,0x08,0x72,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x03,0x00,0x09,0x0a,0x00,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05,0x03,0x03,0x01,0x09, -0x01,0x52,0x1b,0x4b,0xb0,0x17,0x50,0x58,0x40,0x39,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x00,0x0a,0x08,0x00,0x80,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x03,0x00,0x09,0x0a,0x00,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05,0x03,0x03,0x01, -0x09,0x01,0x52,0x1b,0x40,0x40,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x02,0x0a,0x08,0x02,0x80,0x00,0x00,0x02,0x09,0x02,0x00,0x09,0x80,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x02,0x00,0x0a,0x02,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05, -0x03,0x03,0x01,0x09,0x01,0x52,0x59,0x59,0x40,0x22,0x00,0x00,0x00,0x61,0x00,0x61,0x5f,0x5e,0x59,0x57,0x53,0x51,0x4d,0x4b,0x47,0x45,0x41,0x3f,0x3b,0x39,0x35,0x33,0x13,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x12,0x13,0x09,0x1f,0x2b,0x37,0x13,0x27,0x0e,0x04,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22, -0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x27,0x33,0x13,0x03,0xbc,0xee,0x12,0x14,0x1e,0x1b,0x22,0x32,0x25,0x25,0x32,0x22,0x1c, -0x1e,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x25,0x32,0x22,0x1c,0x1e,0x15,0x15,0x1f,0x1d,0x24,0x32,0x26,0x25,0x34,0x24,0x1e,0x1f,0x15,0x15,0x1e,0x1b,0x21,0x31,0x26,0x3a,0x48,0x55,0x2f,0x14,0x1e,0x1b,0x22,0x32,0x25,0x26,0x32,0x24,0x1d,0x1f,0x15,0x14,0x1f,0x1d,0x24,0x34,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22, -0x32,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x16,0x1e,0x1d,0x24,0x1c,0xa7,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x14,0x01,0x18,0x24,0x23,0x18,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x48,0x3a,0x28,0x28,0x37,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a, -0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x25,0x25,0x0a,0xd3,0xfe,0xd9,0xfe,0xd9,0x00,0x02,0xfe,0x39,0x00,0xaa,0x01,0x9f,0x02,0xf8,0x00,0x0e,0x00,0x12,0x00,0x3d,0x40,0x3a,0x0a,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x06,0x03,0x02,0x02,0x04,0x01,0x02,0x67,0x00, -0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x0f,0x0f,0x00,0x00,0x0f,0x12,0x0f,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x01,0x13,0x33,0x13,0x21,0x15,0x21,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x05,0x35,0x21,0x15,0xfe,0x39,0xc8,0x54,0x9b,0x01,0xaf,0xfe, -0x1b,0x77,0x0a,0x0b,0x02,0x02,0x0d,0x0b,0x7c,0x01,0x24,0x01,0xe5,0x01,0x9a,0x01,0x5e,0xfe,0xf2,0x50,0xe1,0x14,0x1e,0x07,0x07,0x1e,0x14,0xe1,0xf0,0x50,0x50,0x00,0x00,0x04,0xfd,0xf8,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x46,0x40,0x43,0x02,0x01,0x00,0x09,0x03,0x08,0x03,0x01,0x04,0x00, -0x01,0x67,0x06,0x01,0x04,0x05,0x05,0x04,0x57,0x06,0x01,0x04,0x04,0x05,0x5f,0x0b,0x07,0x0a,0x03,0x05,0x04,0x05,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x33,0x35, -0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0xfd,0xf8,0x01,0xcc,0x78,0x01,0xcc,0xfb,0xf0,0x01,0xcc,0x78,0x01,0xcc,0x01,0x9a,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0x00,0x00,0x06,0xfb,0xa0,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x5d,0x40,0x5a,0x04,0x02, -0x02,0x00,0x0e,0x05,0x0d,0x03,0x0c,0x05,0x01,0x06,0x00,0x01,0x67,0x0a,0x08,0x02,0x06,0x07,0x07,0x06,0x57,0x0a,0x08,0x02,0x06,0x06,0x07,0x5f,0x11,0x0b,0x10,0x09,0x0f,0x05,0x07,0x06,0x07,0x4f,0x14,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x14,0x17,0x14,0x17,0x16,0x15,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f, -0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x3c,0x01,0xcc,0xf9,0x98,0x01,0xcc,0x8c,0x01,0xcc,0xfb,0xdc,0x01,0xcc,0x8c, -0x01,0xcc,0x78,0x01,0xcc,0x01,0x9a,0x50,0x50,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x02,0x00,0x8c,0xff,0xf6,0x01,0xcc,0x02,0xda,0x00,0x0e,0x00,0x1a,0x00,0x24,0x40,0x21,0x0f,0x03,0x00,0x03,0x02,0x49,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x59,0x00,0x01,0x01,0x02,0x61,0x00,0x02,0x01,0x02, -0x51,0x2e,0x24,0x11,0x03,0x06,0x19,0x2b,0x17,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x8c,0x5a,0x01,0x06,0x36,0x29,0x3a,0x46,0x4f,0x46,0x51,0x35,0x29,0x2e,0x25,0x21,0x21,0x25,0x0a,0x02,0xe4,0xfe,0xc0,0x27,0x2f,0x54,0x47,0x55,0x43, -0x6c,0x1a,0x3a,0x14,0x10,0x40,0x2b,0x55,0x23,0x26,0x26,0x23,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x1b,0x00,0x1f,0x00,0x40,0x40,0x3d,0x0e,0x01,0x00,0x01,0x1f,0x1e,0x1d,0x1c,0x1b,0x18,0x17,0x14,0x13,0x12,0x11,0x10,0x0f,0x0d,0x0a,0x09,0x06,0x05,0x04,0x03,0x02,0x01,0x16,0x02,0x00,0x00,0x01,0x03,0x02,0x03, -0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x03,0x76,0x13,0x19,0x13,0x17,0x04,0x06,0x1a,0x2b,0x37,0x35,0x37,0x35,0x07,0x35,0x37,0x35,0x33,0x15,0x37,0x35,0x33,0x15,0x37,0x15,0x07,0x15,0x37,0x15,0x07,0x15,0x23,0x35,0x07,0x15,0x23,0x35,0x13,0x15,0x37,0x35,0x41,0x69,0x69,0x69, -0x3c,0x8c,0x3c,0x69,0x69,0x69,0x69,0x3c,0x8c,0x3c,0x3c,0x8c,0x50,0x41,0x37,0xc1,0x37,0x41,0x37,0xb6,0x96,0x49,0xa7,0x87,0x37,0x41,0x37,0xc1,0x37,0x41,0x37,0xb6,0x96,0x49,0xa7,0x87,0x01,0x22,0xc1,0x49,0xc1,0x00,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0x9a,0x01,0x77,0x02,0xd1,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x00, -0x01,0x86,0x00,0x00,0x00,0x28,0x00,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x08,0x17,0x2b,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0x9a,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0xff,0xff,0x00,0xd2,0xff,0x60,0x01,0x75,0x00,0x92,0x02,0x06,0x03,0x2a,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0xd1,0x01,0x77,0x03,0x08,0x00,0x03, -0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0xd1,0x01,0x37,0xfe,0xc9,0x00,0x00,0x02,0x00,0x37,0x01,0x99,0x02,0x1c,0x02,0xd0,0x00,0x03,0x00,0x07,0x00,0x2a, -0xb1,0x06,0x64,0x44,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x13,0x33,0x03,0x21,0x13,0x33,0x03,0x01,0x4a,0x50,0x82,0x82,0xfe,0x9d,0x50,0x82,0x82,0x01,0x99,0x01,0x37, -0xfe,0xc9,0x01,0x37,0xfe,0xc9,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x9e,0x01,0xcc,0x02,0xe9,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0x9a,0x01,0x77,0x02,0xd1,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03, -0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0x9a,0x01,0x37,0xfe,0xc9,0x00,0x00,0x02,0xfe,0x25,0x02,0x89,0xff,0x83,0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x33,0xb1,0x06,0x64,0x44,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00, -0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d, -0x1d,0x23,0x23,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0x02,0x89,0xff,0x1b,0x03,0x09,0x00,0x0b,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07, -0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x01,0xfe,0x4a,0x02,0x85,0xff,0x1c,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14, -0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x27,0x33,0x17,0xfe,0xbd,0x73,0x64,0x6e,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x90,0x02,0x85,0xff,0x5b,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00, -0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0xfe,0x90,0x6a,0x61,0x6f,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x02,0xfe,0x3b,0x02,0x85,0xff,0xb8,0x03,0x11,0x00,0x03,0x00,0x07,0x00,0x32,0xb1,0x06,0x64,0x44,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00, -0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0xfe,0xee,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x02,0x85,0x8c,0x8c,0x8c,0x8c,0x00,0x00, -0x00,0x01,0xff,0x60,0x02,0x26,0xff,0xc3,0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0xa0,0x0f,0x54,0x18,0x02,0x26,0xb4,0xb4,0x00,0x00,0x01,0xfe,0x1f,0x02,0x85,0xff,0x89,0x03,0x11,0x00,0x06, -0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x05,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x17,0x23,0x27,0x07,0xfe,0x1f,0x8b,0x53,0x8c,0x63,0x52,0x50,0x02,0x85,0x8c,0x8c,0x4e,0x4e,0x00,0x00, -0x00,0x01,0xfe,0x1f,0x02,0x85,0xff,0x89,0x03,0x11,0x00,0x06,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x03,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x12,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x27,0x33,0x17,0x37,0x33,0x07,0xfe,0xab,0x8c,0x63, -0x52,0x50,0x65,0x8b,0x02,0x85,0x8c,0x4e,0x4e,0x8c,0x00,0x00,0x00,0x01,0xfe,0x34,0x02,0x80,0xff,0x74,0x03,0x11,0x00,0x0d,0x00,0x31,0xb1,0x06,0x64,0x44,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00, -0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x02,0x80,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x5c,0x02,0x60,0xff,0x4c,0x03,0x44,0x00,0x0b,0x00,0x17,0x00,0x39, -0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33, -0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0x02,0x60,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0x02,0x8a,0xff,0x74, -0x03,0x0c,0x00,0x19,0x00,0x6d,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00, -0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33, -0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0xe6,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0x02,0x8a,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x34,0x02,0x9e,0xff,0x74,0x02,0xe9,0x00,0x03,0x00,0x26,0xb1,0x06, -0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x35,0x21,0x15,0xfe,0x34,0x01,0x40,0x02,0x9e,0x4b,0x4b,0x00,0x01,0xfe,0x7a,0x02,0x85,0xff,0x38,0x03,0x39,0x00,0x0e,0x00,0x4e,0xb1,0x06, -0x64,0x44,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x0e, -0x00,0x0e,0x21,0x24,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0xfe,0xaa,0x32,0x0e,0x20,0x50,0x69,0x26,0x2f,0x11,0x28,0x02,0x85,0x3f,0x13,0x0d,0x14,0x41,0x27,0x23,0x20,0x16,0x34,0x00,0x00,0x00,0x02,0xfd,0xf0,0x02,0x85,0xff,0x6d,0x03,0x11,0x00,0x03, -0x00,0x07,0x00,0x25,0xb1,0x06,0x64,0x44,0x40,0x1a,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x09,0x1a,0x2b,0xb1,0x06,0x00,0x44,0x01,0x23,0x27,0x33,0x05,0x23,0x27,0x33,0xfe,0xba,0x57,0x73,0x5c,0x01,0x21,0x57,0x73,0x5c,0x02,0x85,0x8c,0x8c,0x8c, -0x00,0x01,0xfe,0x7a,0x02,0x85,0xff,0x47,0x03,0x70,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x03,0x07,0x23,0x37,0xb9,0x50,0x7d,0x82,0x03,0x70,0xeb,0xeb,0x00,0x00,0x00,0x00,0x01,0xff,0x18, -0x01,0xe5,0xff,0xa0,0x02,0x94,0x00,0x0a,0x00,0x4e,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x62,0x03,0x01,0x02,0x00,0x02,0x52,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x62,0x03, -0x01,0x02,0x00,0x02,0x52,0x59,0x40,0x0b,0x00,0x00,0x00,0x0a,0x00,0x09,0x12,0x21,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x03,0x35,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0xe8,0x1a,0x23,0x4b,0x3a,0x2f,0x01,0xe5,0x41,0x23,0x4b,0x50,0x2b,0x34,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0xff,0x2b,0xff,0x1b,0xff,0xab,0x00,0x0b, -0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xd5,0x22, -0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x02,0xfe,0x5c,0xff,0x06,0xff,0x4c,0xff,0xce,0x00,0x0b,0x00,0x17,0x00,0x39,0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c, -0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x37,0x1c,0x21,0x20,0x1d,0x1a,0x21,0x21,0xfa,0x37,0x2d,0x2d,0x37,0x37, -0x2d,0x2d,0x37,0x33,0x1b,0x16,0x1a,0x18,0x1b,0x17,0x16,0x1b,0x00,0x01,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x37,0x33,0x07,0xfe,0x66,0x5f, -0x69,0x69,0xf0,0x91,0x91,0x00,0x00,0x00,0x00,0x01,0xfe,0x75,0xff,0x35,0xff,0x42,0x00,0x1a,0x00,0x12,0x00,0x36,0xb1,0x06,0x64,0x44,0x40,0x2b,0x0b,0x01,0x01,0x02,0x01,0x4c,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x03,0x03,0x00,0x59,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x12,0x00, -0x11,0x11,0x14,0x21,0x05,0x09,0x19,0x2b,0xb1,0x06,0x00,0x44,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x33,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xfe,0x75,0x46,0x16,0x1b,0x37,0x32,0x23,0x39,0x15,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x5f,0x3d,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0x01,0xfe,0x61, -0xff,0x35,0xff,0x29,0x00,0x0a,0x00,0x10,0x00,0x2e,0xb1,0x06,0x64,0x44,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x02,0x00,0x50,0x01,0x00,0x0f,0x0d,0x07,0x06,0x00,0x10,0x01,0x10,0x04,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x33, -0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0xfe,0xdb,0x37,0x43,0x26,0x2f,0x4b,0x0b,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1d,0x3a,0x21,0x09,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x01,0xfd,0x8a,0x01,0x22,0x00,0x1e,0x01,0x68,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, -0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x35,0x21,0x15,0xfd,0x8a,0x02,0x94,0x01,0x22,0x46,0x46,0x00,0x01,0xfd,0xcb,0xff,0xe2,0xff,0xdd,0x02,0x4e,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, -0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x01,0x33,0x01,0xfd,0xcb,0x01,0xb7,0x5b,0xfe,0x48,0x1e,0x02,0x6c,0xfd,0x94,0x00,0x00,0x00,0x00,0x01,0xfe,0x16,0xff,0x92,0xff,0x92,0x02,0x94,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, -0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x01,0x33,0x01,0xfe,0x16,0x01,0x3d,0x3f,0xfe,0xc3,0x6e,0x03,0x02,0xfc,0xfe,0x00,0x00,0x00,0xff,0xff,0x00,0x7d,0x02,0x89,0x01,0xdb,0x03,0x09,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe5,0x02,0x89,0x01,0x73, -0x03,0x09,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa2,0x02,0x85,0x01,0x74,0x03,0x11,0x00,0x07,0x06,0x6a,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe8,0x02,0x85,0x01,0xb3,0x03,0x11,0x00,0x07,0x06,0x6b,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x02,0x85,0x02,0x10,0x03,0x11,0x00,0x07, -0x06,0x6c,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x02,0x85,0x01,0xe1,0x03,0x11,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x02,0x85,0x01,0xe1,0x03,0x11,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x80,0x01,0xcc,0x03,0x11,0x00,0x07,0x06,0x70,0x02,0x58, -0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0x02,0x60,0x01,0xa4,0x03,0x44,0x00,0x07,0x06,0x71,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x8a,0x01,0xcc,0x03,0x0c,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x9e,0x01,0xcc,0x02,0xe9,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x00, -0xff,0xff,0x00,0xcd,0xff,0x35,0x01,0x9a,0x00,0x1a,0x00,0x07,0x06,0x7b,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb9,0xff,0x35,0x01,0x81,0x00,0x0a,0x00,0x07,0x06,0x7c,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x02,0x06,0x06,0x7a,0x00,0x00,0x00,0x02,0xfe,0x25,0x03,0x31,0xff,0x83, -0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23, -0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0x03,0x30,0xff,0x1b,0x03,0xb0,0x00,0x0b,0x00,0x1f,0x40,0x1c, -0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x03,0x30,0x23,0x1d,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x00,0x01,0xfe,0x4a, -0x03,0x2a,0xff,0x1c,0x03,0xb6,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0xfe,0xbd,0x73,0x64,0x6e,0x03,0x2a,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x90,0x03,0x2a,0xff,0x5b,0x03,0xb6,0x00,0x03,0x00,0x17,0x40,0x14, -0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0xfe,0x90,0x6a,0x61,0x6f,0x03,0x2a,0x8c,0x8c,0x00,0x00,0x00,0x02,0xfe,0x3b,0x03,0x2a,0xff,0xb8,0x03,0xb6,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00, -0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0xfe,0xee,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x03,0x2a,0x8c,0x8c,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x1f,0x03,0x2a,0xff,0x89, -0x03,0xb6,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x11,0x04,0x09,0x18,0x2b,0x01,0x37,0x33,0x17,0x23,0x27,0x07,0xfe,0x1f,0x8b,0x53,0x8c,0x63,0x52,0x50,0x03,0x2a,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x01,0xfe,0x1f, -0x03,0x2a,0xff,0x89,0x03,0xb6,0x00,0x06,0x00,0x1f,0x40,0x1c,0x03,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x12,0x11,0x04,0x09,0x18,0x2b,0x01,0x27,0x33,0x17,0x37,0x33,0x07,0xfe,0xab,0x8c,0x63,0x52,0x50,0x65,0x8b,0x03,0x2a,0x8c,0x4e,0x4e,0x8c,0x00,0x00, -0x00,0x01,0xfe,0x34,0x03,0x25,0xff,0x74,0x03,0xb6,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32, -0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x03,0x25,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x5c,0x02,0xfe,0xff,0x4c,0x03,0xe2,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02, -0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b, -0x21,0x21,0x1b,0x1b,0x21,0x21,0x02,0xfe,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0x03,0x2f,0xff,0x74,0x03,0xb1,0x00,0x19,0x00,0x65,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59, -0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13, -0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0xe6,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0x03,0x2f,0x15,0x1c,0x15,0x23,0x1e, -0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x34,0x03,0x48,0xff,0x74,0x03,0x93,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0xfe,0x34,0x01,0x40, -0x03,0x48,0x4b,0x4b,0x00,0x01,0xfe,0x7a,0x03,0x20,0xff,0x33,0x03,0xd4,0x00,0x0e,0x00,0x46,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00, -0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x0e,0x00,0x0e,0x21,0x24,0x04,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0xfe,0xaa,0x2d,0x0e,0x20,0x4b,0x50,0x2f,0x3a,0x11,0x23,0x03,0x20,0x3f,0x14,0x0c,0x14,0x41,0x29,0x22,0x1c,0x19,0x34,0x00,0x00, -0x00,0x02,0xfd,0xf0,0x03,0x2a,0xff,0x6d,0x03,0xb6,0x00,0x03,0x00,0x07,0x00,0x1d,0x40,0x1a,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x09,0x1a,0x2b,0x01,0x23,0x27,0x33,0x05,0x23,0x27,0x33,0xfe,0xba,0x57,0x73,0x5c,0x01,0x21,0x57,0x73,0x5c,0x03, -0x2a,0x8c,0x8c,0x8c,0x00,0x01,0xfe,0x34,0x03,0x25,0xff,0x74,0x03,0xb6,0x00,0x0d,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x22,0x12,0x22,0x05,0x06,0x19,0x2b,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x23, -0x34,0x26,0x23,0x22,0x06,0x15,0xfe,0x34,0x58,0x48,0x48,0x58,0x47,0x31,0x29,0x28,0x30,0x03,0x25,0x41,0x50,0x50,0x41,0x27,0x30,0x30,0x27,0x00,0x00,0x01,0xfe,0x7a,0x03,0x2a,0xff,0x38,0x03,0xfc,0x00,0x03,0x00,0x1f,0x40,0x1c,0x02,0x01,0x01,0x00,0x00,0x01,0x57,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00, -0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x03,0x07,0x23,0x37,0xc8,0x41,0x7d,0x73,0x03,0xfc,0xd2,0xd2,0x00,0x00,0x00,0x00,0x01,0xff,0x1b,0x02,0x99,0xff,0xa6,0x03,0x48,0x00,0x0b,0x00,0x3c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x12,0x00,0x01,0x00,0x00,0x01,0x70,0x03,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x38,0x02,0x4e,0x1b, -0x40,0x11,0x00,0x01,0x00,0x01,0x85,0x03,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x38,0x02,0x4e,0x59,0x40,0x0b,0x00,0x00,0x00,0x0b,0x00,0x0a,0x13,0x21,0x04,0x09,0x18,0x2b,0x03,0x35,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0xe5,0x1d,0x10,0x13,0x4b,0x39,0x30,0x02,0x99,0x41,0x13,0x10,0x4b,0x50,0x2b,0x34,0x00,0x00, -0x00,0x01,0xfe,0x8d,0xff,0x2b,0xff,0x1b,0xff,0xab,0x00,0x0b,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21, -0x26,0x26,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x02,0xfe,0x25,0xff,0x2b,0xff,0x83,0xff,0xab,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00, -0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22, -0x00,0x01,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x37,0x33,0x07,0xfe,0x66,0x5f,0x69,0x69,0xf0,0x91,0x91,0x00,0x00,0x00,0x00,0x01,0xfe,0x75,0xff,0x35,0xff,0x42,0x00,0x1a,0x00,0x12, -0x00,0x4e,0xb5,0x0b,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x14,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x19,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x03,0x03,0x00,0x59,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f, -0x59,0x40,0x0c,0x00,0x00,0x00,0x12,0x00,0x11,0x11,0x14,0x21,0x05,0x09,0x19,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x33,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xfe,0x75,0x46,0x16,0x1b,0x37,0x32,0x23,0x39,0x15,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x5f,0x3d,0x03,0x14,0x24,0x1a,0x22,0x31,0x00, -0x00,0x01,0xfe,0x61,0xff,0x35,0xff,0x29,0x00,0x0a,0x00,0x10,0x00,0x42,0x4b,0xb0,0x15,0x50,0x58,0x40,0x11,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x16,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x02,0x00,0x50,0x59, -0x40,0x0d,0x01,0x00,0x0f,0x0d,0x07,0x06,0x00,0x10,0x01,0x10,0x04,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x33,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0xfe,0xdb,0x37,0x43,0x26,0x2f,0x4b,0x0b,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1d,0x3a,0x21,0x09,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x01,0xfe,0x34, -0xff,0x10,0xff,0x74,0xff,0xa1,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14, -0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0xf0,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0xff,0x3d,0xff,0x74,0xff,0x88,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11, -0x03,0x06,0x17,0x2b,0x05,0x35,0x21,0x15,0xfe,0x34,0x01,0x40,0xc3,0x4b,0x4b,0x00,0xff,0xff,0x00,0x7d,0x03,0x31,0x01,0xdb,0x03,0xb1,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe5,0x03,0x30,0x01,0x73,0x03,0xb0,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa2,0x03,0x2a,0x01,0x74, -0x03,0xb6,0x00,0x07,0x06,0x90,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe8,0x03,0x2a,0x01,0xb3,0x03,0xb6,0x00,0x07,0x06,0x91,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x03,0x2a,0x02,0x10,0x03,0xb6,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x03,0x2a,0x01,0xe1,0x03,0xb6,0x00,0x07, -0x06,0x93,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x03,0x2a,0x01,0xe1,0x03,0xb6,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x25,0x01,0xcc,0x03,0xb6,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0x02,0xfe,0x01,0xa4,0x03,0xe2,0x00,0x07,0x06,0x96,0x02,0x58, -0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x2f,0x01,0xcc,0x03,0xb1,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x48,0x01,0xcc,0x03,0x93,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xd2,0x02,0x85,0x01,0xa0,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14, -0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x08,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x37,0x33,0x07,0xd2,0x6a,0x64,0x6f,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0xe1,0x02,0x3a,0x01,0x77,0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00, -0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x37,0x33,0x07,0xe1,0x38,0x5e,0x40,0x02,0x3a,0xa0,0xa0,0x00,0x00,0x03,0x00,0x7d,0x02,0x89,0x01,0xdb,0x03,0x84,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x77,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x24,0x00,0x00,0x03,0x03,0x00,0x70,0x06, -0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x05,0x01,0x03,0x01,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x62,0x08,0x04,0x07,0x03,0x02,0x03,0x02,0x52,0x1b,0x40,0x23,0x00,0x00,0x03,0x00,0x85,0x06,0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x05,0x01,0x03,0x01,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x62,0x08,0x04,0x07,0x03,0x02, -0x03,0x02,0x52,0x59,0x40,0x1a,0x11,0x10,0x05,0x04,0x00,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0b,0x09,0x04,0x0f,0x05,0x0f,0x00,0x03,0x00,0x03,0x11,0x09,0x08,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14, -0x06,0x01,0x03,0x4e,0x50,0x58,0x52,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x03,0x01,0x83,0x83,0x78,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x01,0xfe,0x34,0x02,0x80,0xff,0x74,0x03,0x11,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02, -0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x02,0x80,0x50,0x41, -0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0x7a,0x00,0x03,0x00,0x11,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01,0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00, -0x0f,0x0e,0x0c,0x0a,0x08,0x07,0x04,0x11,0x05,0x11,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0x95,0x73,0x60,0x78,0x1c,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x82,0x82,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a, -0x48,0x00,0x00,0x00,0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0x7a,0x00,0x03,0x00,0x11,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01,0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x0f,0x0e,0x0c,0x0a, -0x08,0x07,0x04,0x11,0x05,0x11,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xb8,0x78,0x60,0x73,0x3f,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x82,0x82,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a,0x48,0x00,0x00,0x00, -0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0xa2,0x00,0x0f,0x00,0x1d,0x00,0x78,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x29,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x70,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51, -0x1b,0x40,0x2a,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x05,0x7e,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x59,0x40,0x17,0x11,0x10,0x00,0x00,0x1b,0x1a,0x18,0x16,0x14,0x13,0x10,0x1d,0x11,0x1d,0x00,0x0f, -0x00,0x0f,0x21,0x24,0x09,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xa5,0x2d,0x09,0x1b,0x37,0x41,0x2b,0x33,0x09,0x08,0x23,0x20,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x3d,0x0c,0x0d, -0x18,0x3c,0x27,0x20,0x0d,0x19,0x0b,0x32,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a,0x48,0x00,0x00,0x00,0x00,0x02,0xfe,0x34,0x02,0x85,0xff,0x74,0x03,0xa0,0x00,0x19,0x00,0x27,0x00,0x95,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x2d,0x09,0x01,0x07,0x00,0x08,0x00,0x07,0x08,0x80,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02, -0x0a,0x02,0x00,0x07,0x04,0x00,0x6a,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x1b,0x40,0x3b,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x09,0x01,0x07,0x00,0x08,0x00,0x07,0x08,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x0a,0x01, -0x00,0x07,0x04,0x00,0x6a,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x59,0x40,0x1f,0x1b,0x1a,0x01,0x00,0x25,0x24,0x22,0x20,0x1e,0x1d,0x1a,0x27,0x1b,0x27,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0c,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15, -0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xea,0x1f,0x25,0x18,0x16,0x11,0x1e,0x41,0x34,0x2a,0x20,0x25,0x17,0x16,0x11,0x1e,0x41,0x34,0x6c,0x48,0x58,0x41,0x34,0x2a,0x2b,0x35,0x41,0x58,0x03,0x2c,0x13,0x19,0x13, -0x1e,0x19,0x14,0x28,0x30,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0xa7,0x48,0x3a,0x1f,0x28,0x28,0x1f,0x3a,0x48,0x00,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0x00,0x19,0x03,0x84,0x00,0x03,0x00,0x0a,0x00,0x33,0x40,0x30,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x01,0x03,0x01,0x85, -0x06,0x04,0x02,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xbe,0x73,0x64,0x78,0xfe,0x7f,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x8c,0x8c,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20, -0x02,0x85,0xff,0xc9,0x03,0x84,0x00,0x03,0x00,0x0a,0x00,0x3f,0x40,0x3c,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x80,0x05,0x01,0x01,0x03,0x00,0x01,0x03,0x7e,0x00,0x00,0x02,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x06,0x04,0x02,0x03,0x00,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07, -0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x27,0x33,0x17,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0x96,0x82,0x64,0x7d,0xfe,0x57,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x8c,0x8c,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0xff,0xce,0x03,0xa2,0x00,0x0e,0x00,0x15,0x00,0x75,0xb5,0x14,0x01,0x04, -0x02,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x25,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02,0x70,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1b,0x40,0x26,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02, -0x04,0x7e,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x59,0x40,0x15,0x0f,0x0f,0x00,0x00,0x0f,0x15,0x0f,0x15,0x13,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x08,0x09,0x18,0x2b,0x03,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07, -0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xb1,0x2d,0x09,0x20,0x32,0x37,0x2e,0x36,0x11,0x23,0xfe,0x86,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x3d,0x0e,0x0a,0x19,0x3c,0x28,0x23,0x15,0x18,0x32,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0xff,0x89,0x03,0xa0,0x00,0x19,0x00,0x20,0x00,0x92,0xb5,0x1f,0x01,0x07, -0x06,0x01,0x4c,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x29,0x00,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0a,0x08,0x02,0x07,0x07,0x84,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x09,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x37,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02, -0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0a,0x08,0x02,0x07,0x07,0x84,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x09,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x1d,0x1a,0x1a,0x01,0x00,0x1a,0x20,0x1a,0x20,0x1e,0x1d,0x1c,0x1b,0x16,0x15,0x13,0x11, -0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0b,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xea,0x1f,0x25,0x18,0x16,0x11,0x1e,0x41,0x34,0x2a,0x20,0x25,0x17,0x16,0x11,0x1e,0x41,0x34,0xfe, -0xe0,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x2c,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0xa7,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x03,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01, -0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x10,0x0f,0x0d,0x0a,0x08,0x07,0x04,0x13,0x05,0x12,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe, -0x95,0x69,0x60,0x6e,0x35,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x84,0x78,0x78,0x78,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x03,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01, -0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x10,0x0f,0x0d,0x0a,0x08,0x07,0x04,0x13,0x05,0x12,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe, -0xb8,0x64,0x60,0x5f,0x58,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x84,0x78,0x78,0x78,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x0f,0x00,0x1f,0x00,0x78,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x29,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80, -0x07,0x01,0x02,0x05,0x00,0x02,0x70,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x1b,0x40,0x2a,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x05,0x7e,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x03,0x03, -0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x59,0x40,0x17,0x11,0x10,0x00,0x00,0x1c,0x1b,0x19,0x16,0x14,0x13,0x10,0x1f,0x11,0x1e,0x00,0x0f,0x00,0x0f,0x21,0x24,0x09,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33, -0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe,0xa6,0x2f,0x07,0x0a,0x49,0x61,0x1a,0x1d,0x08,0x08,0x20,0x36,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x70,0x38,0x08,0x08,0x08,0x3c,0x19,0x17,0x0d,0x1c,0x0b,0x28,0x64,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79, -0x03,0xfc,0x00,0x1b,0x00,0x2b,0x00,0x55,0x40,0x52,0x18,0x16,0x02,0x03,0x02,0x0a,0x08,0x02,0x00,0x01,0x02,0x4c,0x07,0x01,0x05,0x00,0x06,0x00,0x05,0x06,0x80,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x03,0x08,0x01,0x00,0x05,0x03,0x00,0x69,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04, -0x51,0x1d,0x1c,0x01,0x00,0x28,0x27,0x25,0x22,0x20,0x1f,0x1c,0x2b,0x1d,0x2a,0x14,0x12,0x0f,0x0d,0x06,0x04,0x00,0x1b,0x01,0x1b,0x0a,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33, -0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xdf,0x1f,0x2a,0x1e,0x1b,0x11,0x0d,0x11,0x41,0x31,0x29,0x20,0x29,0x1d,0x1a,0x11,0x0e,0x10,0x41,0x2f,0x8f,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x98,0x0e,0x13,0x0e,0x10,0x0e,0x07,0x07,0x26,0x2d,0x0e,0x13,0x0e,0x11,0x0d,0x07,0x07,0x26,0x2d,0x8c,0x3c,0x3c,0x20,0x1c, -0x1c,0x20,0x3c,0x3c,0x00,0x02,0xfe,0x20,0x03,0x0c,0x00,0x0f,0x03,0xfc,0x00,0x03,0x00,0x0a,0x00,0x33,0x40,0x30,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x01,0x03,0x01,0x85,0x06,0x04,0x02,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03, -0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xc0,0x69,0x66,0x6e,0xfe,0x7f,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x84,0x78,0x78,0x78,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0xc4,0x03,0xfc,0x00,0x03,0x00,0x0a,0x00,0x3f,0x40,0x3c,0x09,0x01,0x03,0x01,0x01,0x4c, -0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x80,0x05,0x01,0x01,0x03,0x00,0x01,0x03,0x7e,0x00,0x00,0x02,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x06,0x04,0x02,0x03,0x00,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x27,0x33,0x17,0x05,0x37,0x33,0x17,0x23, -0x27,0x07,0x9b,0x78,0x64,0x73,0xfe,0x5c,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x84,0x78,0x78,0x78,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0xce,0x03,0xfc,0x00,0x0e,0x00,0x15,0x00,0x75,0xb5,0x14,0x01,0x04,0x02,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x25,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01, -0x02,0x04,0x00,0x02,0x70,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1b,0x40,0x26,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02,0x04,0x7e,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00, -0x00,0x01,0x00,0x51,0x59,0x40,0x15,0x0f,0x0f,0x00,0x00,0x0f,0x15,0x0f,0x15,0x13,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x08,0x09,0x18,0x2b,0x03,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xb4,0x30,0x08,0x0f,0x42,0x55,0x20,0x26,0x10,0x24,0xfe,0x86,0x8a, -0x54,0x8b,0x65,0x50,0x51,0x03,0x70,0x2f,0x08,0x0b,0x10,0x3a,0x22,0x1c,0x1c,0x10,0x22,0x64,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0x88,0x03,0xfc,0x00,0x1b,0x00,0x22,0x00,0x53,0x40,0x50,0x18,0x16,0x02,0x03,0x02,0x0a,0x08,0x02,0x00,0x01,0x21,0x01,0x05,0x04,0x03,0x4c,0x00,0x04,0x00,0x05,0x00,0x04, -0x05,0x80,0x08,0x06,0x02,0x05,0x05,0x84,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x1c,0x1c,0x01,0x00,0x1c,0x22,0x1c,0x22,0x20,0x1f,0x1e,0x1d,0x14,0x12,0x0f,0x0d,0x06,0x04,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23, -0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xdf,0x1f,0x2a,0x1e,0x1b,0x11,0x0d,0x11,0x41,0x31,0x29,0x20,0x29,0x1d,0x1a,0x11,0x0e,0x10,0x41,0x2f,0xfe,0xd6,0x74,0x80,0x74,0x65,0x4f,0x51,0x03,0x98,0x0e,0x13,0x0e,0x10,0x0e,0x07, -0x07,0x26,0x2d,0x0e,0x13,0x0e,0x11,0x0d,0x07,0x07,0x26,0x2d,0x8c,0x6e,0x6e,0x49,0x49,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xfe,0xf2,0x02,0x58,0x03,0xca,0x00,0x03,0x00,0x1a,0x00,0x2a,0x40,0x27,0x0f,0x01,0x01,0x00,0x03,0x00,0x02,0x03,0x01,0x02,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x03,0x01,0x85,0x04,0x01,0x03,0x03, -0x76,0x04,0x04,0x04,0x1a,0x04,0x1a,0x12,0x1b,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x34,0x36,0x37,0x37,0x36,0x36,0x35,0x35,0x23,0x37,0x17,0x23,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x11,0x5a,0x78,0x78,0x2c,0x25,0x91,0x19,0x1d,0x6e,0xaa,0xaa,0x6e,0x28,0x20,0x9b,0x19,0x1c,0x01,0x6c,0x02,0x5e,0xfd,0xfb, -0xfd,0x2d,0x01,0x7d,0x2c,0x59,0x1b,0x6c,0x12,0x2d,0x13,0xaa,0xaa,0xaa,0xb4,0x25,0x4b,0x18,0x73,0x13,0x34,0x1d,0xfe,0x8e,0x00,0x02,0x00,0x69,0xff,0x42,0x01,0xef,0x03,0x7a,0x00,0x05,0x00,0x1e,0x00,0x47,0x40,0x44,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x09,0x01,0x02,0x03,0x01,0x02,0x67,0x05,0x01,0x03,0x00,0x07,0x04,0x03,0x07, -0x67,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x0a,0x08,0x02,0x06,0x04,0x06,0x4f,0x06,0x06,0x00,0x00,0x06,0x1e,0x06,0x1e,0x1a,0x19,0x15,0x14,0x13,0x12,0x0d,0x0c,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0b,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x03,0x11,0x33,0x13,0x16,0x16,0x17,0x33,0x32,0x26,0x26, -0x35,0x11,0x33,0x11,0x23,0x03,0x26,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0x69,0x50,0xdd,0xf1,0x5d,0x81,0x0c,0x15,0x05,0x0a,0x01,0x08,0x08,0x4b,0x5c,0x80,0x0c,0x17,0x06,0x0a,0x05,0x0b,0x01,0x90,0x01,0xea,0xfe,0x61,0x4b,0xfd,0xb2,0x01,0xea,0xfe,0xdb,0x1c,0x47,0x17,0x30,0x41,0x1b,0x01,0x13,0xfe,0x16,0x01,0x25,0x1c,0x47,0x17, -0x1b,0x51,0x20,0xfe,0xed,0x00,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0xb0,0x02,0x26,0x03,0x6b,0x00,0x1a,0x00,0x23,0x00,0x32,0x00,0x44,0x40,0x41,0x32,0x26,0x02,0x06,0x07,0x01,0x4c,0x00,0x02,0x00,0x05,0x01,0x02,0x05,0x69,0x04,0x03,0x02,0x01,0x00,0x07,0x06,0x01,0x07,0x69,0x00,0x06,0x00,0x00,0x06,0x57,0x00,0x06,0x06,0x00,0x5f, -0x08,0x01,0x00,0x06,0x00,0x4f,0x01,0x00,0x2d,0x2b,0x25,0x24,0x21,0x1f,0x1c,0x1b,0x14,0x12,0x0e,0x0c,0x08,0x06,0x00,0x1a,0x01,0x19,0x09,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x33,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x33,0x35,0x34,0x26,0x23,0x22, -0x06,0x15,0x13,0x33,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x6e,0x19,0x23,0x23,0x19,0x0a,0x30,0x51,0x33,0x35,0x51,0x2e,0x0a,0x19,0x23,0x23,0x19,0xfe,0xde,0xc8,0x37,0x2d,0x2d,0x37,0x37,0x59,0x12,0x26,0x37,0x2d,0x2d,0x37,0x25,0x12,0x50,0x23,0x19,0x01,0xb2,0x19,0x23,0xe7,0x33,0x4d,0x2a,0x2c,0x4c, -0x32,0xe7,0x23,0x19,0xfe,0x4e,0x19,0x23,0x02,0x2b,0xe6,0x2d,0x37,0x37,0x2d,0xfd,0x71,0xa0,0x07,0x28,0x22,0x28,0x31,0x31,0x28,0x22,0x28,0x07,0x00,0x01,0xff,0xd8,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x04,0x00,0x17,0x40,0x14,0x04,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x11,0x10,0x02,0x06,0x18, -0x2b,0x13,0x23,0x11,0x33,0x01,0x0a,0x32,0x32,0x02,0x4e,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b, -0x11,0x01,0x01,0x33,0x01,0x01,0x01,0xe2,0xfe,0x24,0x70,0x01,0xe2,0xfe,0x1e,0xfe,0xd4,0x02,0x92,0x02,0x96,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x80,0x03,0xfc,0x00,0x04,0x00,0x1d,0x40,0x1a,0x01,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x04, -0x00,0x04,0x12,0x03,0x06,0x17,0x2b,0x09,0x02,0x33,0x11,0x02,0x4e,0xfd,0xb2,0x02,0x4e,0x32,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00, -0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x09,0x02,0x33,0x01,0x01,0x01,0xe2,0xfe,0x1e,0x01,0xe2,0x70,0xfe,0x24,0x01,0xe2,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfd,0x6a,0xfd,0x6e,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x35,0x02,0x2b,0x02,0x26,0x00,0x19,0x00,0x5f,0x4b,0xb0,0x15,0x50,0x58,0x40,0x22,0x00,0x01,0x01,0x02,0x5f,0x00,0x02, -0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x08,0x07,0x02,0x04,0x04,0x39,0x4d,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3d,0x06,0x4e,0x1b,0x40,0x1f,0x00,0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x08,0x07,0x02,0x04,0x04,0x39,0x04,0x4e,0x59,0x40,0x10, -0x00,0x00,0x00,0x19,0x00,0x19,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x55,0xc3,0xaf,0x01,0x09,0xb9,0xcf,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x52,0x01,0x82,0x52, -0xfe,0x2c,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x2b,0x02,0x2b,0x02,0x26,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x67,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x0e,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, -0x01,0x01,0x00,0x13,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x17,0x00,0x27,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x0b,0x00,0x3e,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x00,0x00,0xbc,0x00,0x49,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x1c,0x01,0x05,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e, -0x01,0x21,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x3c,0x01,0x2f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x2c,0x01,0x6b,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x54,0x01,0x97,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x2a,0x01,0xeb,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x07,0x00,0x62,0x02,0x15,0x00,0x03, -0x00,0x01,0x04,0x09,0x00,0x08,0x00,0x12,0x02,0x77,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x09,0x00,0x4a,0x02,0x89,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x32,0x02,0xd3,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0c,0x00,0x32,0x03,0x05,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0d,0x01,0x22,0x03,0x37,0x00,0x03,0x00,0x01,0x04,0x09, -0x00,0x0e,0x00,0x36,0x04,0x59,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x00,0x00,0x28,0x04,0x8f,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x01,0x00,0x26,0x04,0xb7,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x02,0x00,0x2e,0x04,0xdd,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x03,0x00,0x16,0x05,0x0b,0x43,0x6c,0x61,0x73,0x73,0x69,0x63,0x20,0x63,0x6f, -0x6e,0x73,0x74,0x72,0x75,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6c,0x6f,0x73,0x65,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x72,0x75,0x63,0x74,0x69,0x6f,0x6e,0x42,0x72,0x6f,0x6b,0x65,0x6e,0x20,0x65,0x71,0x75,0x61,0x6c,0x73,0x20,0x6c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x73,0x52,0x61,0x73,0x65,0x64,0x20,0x62,0x61,0x72,0x20,0x66,0x00, -0x43,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x32,0x00,0x30,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00, -0x6f,0x00,0x20,0x00,0x50,0x00,0x72,0x00,0x6f,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x20,0x00,0x41,0x00,0x75,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x72,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x67,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x75,0x00, -0x62,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x2f,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2f,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x29,0x00,0x4a,0x00,0x65,0x00, -0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x32,0x00,0x2e,0x00,0x33,0x00,0x30,0x00,0x34,0x00,0x3b,0x00,0x4a,0x00,0x42,0x00,0x3b,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00, -0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x2d,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x20,0x00, -0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x32,0x00,0x2e,0x00,0x33,0x00,0x30,0x00,0x34,0x00,0x3b,0x00,0x20,0x00,0x74,0x00,0x74,0x00,0x66,0x00,0x61,0x00,0x75,0x00,0x74,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x6e,0x00, -0x74,0x00,0x20,0x00,0x28,0x00,0x76,0x00,0x31,0x00,0x2e,0x00,0x38,0x00,0x2e,0x00,0x34,0x00,0x2e,0x00,0x37,0x00,0x2d,0x00,0x35,0x00,0x64,0x00,0x35,0x00,0x62,0x00,0x29,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x2d,0x00,0x52,0x00, -0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x74,0x00,0x72,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x6d,0x00, -0x61,0x00,0x72,0x00,0x6b,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x73,0x00,0x2e,0x00,0x72,0x00,0x2e,0x00,0x6f,0x00,0x2e,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00, -0x50,0x00,0x68,0x00,0x69,0x00,0x6c,0x00,0x69,0x00,0x70,0x00,0x70,0x00,0x20,0x00,0x4e,0x00,0x75,0x00,0x72,0x00,0x75,0x00,0x6c,0x00,0x6c,0x00,0x69,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x4b,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x42,0x00,0x75,0x00,0x6c,0x00, -0x65,0x00,0x6e,0x00,0x6b,0x00,0x6f,0x00,0x76,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,0x77,0x00,0x77,0x00,0x2e,0x00,0x6a,0x00,0x65,0x00,0x74,0x00,0x62,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x68,0x00,0x74,0x00, -0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,0x77,0x00,0x77,0x00,0x2e,0x00,0x6a,0x00,0x65,0x00,0x74,0x00,0x62,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00, -0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00, -0x53,0x00,0x49,0x00,0x4c,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x31,0x00, -0x2e,0x00,0x31,0x00,0x2e,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x76,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x61,0x00,0x62,0x00,0x6c,0x00,0x65,0x00,0x20,0x00,0x77,0x00,0x69,0x00, -0x74,0x00,0x68,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x46,0x00,0x41,0x00,0x51,0x00,0x20,0x00,0x61,0x00,0x74,0x00,0x3a,0x00,0x20,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x73,0x00,0x2e,0x00,0x73,0x00,0x69,0x00,0x6c,0x00, -0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x4f,0x00,0x46,0x00,0x4c,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x73,0x00,0x2e,0x00,0x73,0x00,0x69,0x00,0x6c,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00, -0x4f,0x00,0x46,0x00,0x4c,0x00,0x43,0x00,0x6c,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x43,0x00,0x6c,0x00,0x6f,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x63,0x00,0x6f,0x00, -0x6e,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x42,0x00,0x72,0x00,0x6f,0x00,0x6b,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x65,0x00,0x71,0x00,0x75,0x00,0x61,0x00,0x6c,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x67,0x00,0x61,0x00,0x74,0x00,0x75,0x00,0x72,0x00,0x65,0x00, -0x73,0x00,0x52,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x72,0x00,0x20,0x00,0x66,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x65,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xcf,0x00,0x00,0x00,0x24,0x00,0xc9, -0x01,0x02,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x01,0x07,0x01,0x08,0x00,0xc7,0x01,0x09,0x01,0x0a,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x00,0x62,0x01,0x0e,0x00,0xad,0x01,0x0f,0x01,0x10,0x01,0x11,0x00,0x63,0x00,0xae,0x00,0x90,0x01,0x12,0x00,0x25,0x00,0x26,0x00,0xfd,0x00,0xff,0x00,0x64,0x01,0x13,0x01,0x14,0x00,0x27,0x00,0xe9, -0x01,0x15,0x01,0x16,0x00,0x28,0x00,0x65,0x01,0x17,0x01,0x18,0x00,0xc8,0x01,0x19,0x01,0x1a,0x01,0x1b,0x01,0x1c,0x01,0x1d,0x00,0xca,0x01,0x1e,0x01,0x1f,0x00,0xcb,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x24,0x00,0x29,0x00,0x2a,0x01,0x25,0x00,0xf8,0x01,0x26,0x01,0x27,0x01,0x28,0x01,0x29,0x00,0x2b,0x01,0x2a,0x01,0x2b, -0x00,0x2c,0x00,0xcc,0x01,0x2c,0x00,0xcd,0x00,0xce,0x00,0xfa,0x01,0x2d,0x00,0xcf,0x01,0x2e,0x01,0x2f,0x01,0x30,0x01,0x31,0x00,0x2d,0x01,0x32,0x00,0x2e,0x01,0x33,0x00,0x2f,0x01,0x34,0x01,0x35,0x01,0x36,0x01,0x37,0x00,0xe2,0x00,0x30,0x00,0x31,0x01,0x38,0x01,0x39,0x01,0x3a,0x01,0x3b,0x00,0x66,0x00,0x32,0x00,0xd0,0x01,0x3c, -0x00,0xd1,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01,0x40,0x01,0x41,0x00,0x67,0x01,0x42,0x00,0xd3,0x01,0x43,0x01,0x44,0x01,0x45,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x01,0x4b,0x01,0x4c,0x00,0x91,0x01,0x4d,0x00,0xaf,0x00,0xb0,0x00,0x33,0x00,0xed,0x00,0x34,0x00,0x35,0x01,0x4e,0x01,0x4f,0x01,0x50,0x00,0x36,0x01,0x51, -0x00,0xe4,0x00,0xfb,0x01,0x52,0x01,0x53,0x01,0x54,0x01,0x55,0x00,0x37,0x01,0x56,0x01,0x57,0x01,0x58,0x01,0x59,0x00,0x38,0x00,0xd4,0x01,0x5a,0x00,0xd5,0x00,0x68,0x01,0x5b,0x00,0xd6,0x01,0x5c,0x01,0x5d,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x61,0x01,0x62,0x01,0x63,0x01,0x64,0x01,0x65,0x01,0x66,0x01,0x67,0x00,0x39,0x00,0x3a, -0x01,0x68,0x01,0x69,0x01,0x6a,0x01,0x6b,0x00,0x3b,0x00,0x3c,0x00,0xeb,0x01,0x6c,0x00,0xbb,0x01,0x6d,0x01,0x6e,0x01,0x6f,0x01,0x70,0x01,0x71,0x00,0x3d,0x01,0x72,0x00,0xe6,0x01,0x73,0x01,0x74,0x01,0x75,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0x79,0x01,0x7a,0x01,0x7b,0x00,0x44,0x00,0x69,0x01,0x7c,0x01,0x7d,0x01,0x7e,0x01,0x7f, -0x01,0x80,0x01,0x81,0x01,0x82,0x00,0x6b,0x01,0x83,0x01,0x84,0x01,0x85,0x01,0x86,0x01,0x87,0x00,0x6c,0x01,0x88,0x00,0x6a,0x01,0x89,0x01,0x8a,0x01,0x8b,0x00,0x6e,0x00,0x6d,0x00,0xa0,0x01,0x8c,0x00,0x45,0x00,0x46,0x00,0xfe,0x01,0x00,0x00,0x6f,0x01,0x8d,0x01,0x8e,0x00,0x47,0x00,0xea,0x01,0x8f,0x01,0x01,0x00,0x48,0x00,0x70, -0x01,0x90,0x01,0x91,0x00,0x72,0x01,0x92,0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x00,0x73,0x01,0x97,0x01,0x98,0x00,0x71,0x01,0x99,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x00,0x49,0x00,0x4a,0x01,0x9e,0x00,0xf9,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0xa2,0x00,0x4b,0x01,0xa3,0x01,0xa4,0x00,0x4c,0x00,0xd7,0x00,0x74,0x01,0xa5, -0x01,0xa6,0x00,0x76,0x00,0x77,0x01,0xa7,0x01,0xa8,0x00,0x75,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x00,0x4d,0x01,0xad,0x01,0xae,0x00,0x4e,0x01,0xaf,0x01,0xb0,0x00,0x4f,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4,0x01,0xb5,0x00,0xe3,0x00,0x50,0x00,0x51,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x00,0x78,0x00,0x52, -0x00,0x79,0x01,0xbb,0x01,0xbc,0x00,0x7b,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x00,0x7c,0x01,0xc2,0x00,0x7a,0x01,0xc3,0x01,0xc4,0x01,0xc5,0x01,0xc6,0x01,0xc7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xcc,0x00,0xa1,0x01,0xcd,0x00,0x7d,0x00,0xb1,0x00,0x53,0x00,0xee,0x00,0x54,0x00,0x55,0x01,0xce,0x01,0xcf, -0x01,0xd0,0x00,0x56,0x01,0xd1,0x00,0xe5,0x00,0xfc,0x01,0xd2,0x01,0xd3,0x00,0x89,0x01,0xd4,0x00,0x57,0x01,0xd5,0x01,0xd6,0x01,0xd7,0x01,0xd8,0x00,0x58,0x00,0x7e,0x01,0xd9,0x01,0xda,0x00,0x80,0x00,0x81,0x01,0xdb,0x01,0xdc,0x01,0xdd,0x01,0xde,0x01,0xdf,0x00,0x7f,0x01,0xe0,0x01,0xe1,0x01,0xe2,0x01,0xe3,0x01,0xe4,0x01,0xe5, -0x01,0xe6,0x01,0xe7,0x01,0xe8,0x01,0xe9,0x01,0xea,0x01,0xeb,0x00,0x59,0x00,0x5a,0x01,0xec,0x01,0xed,0x01,0xee,0x01,0xef,0x00,0x5b,0x00,0x5c,0x00,0xec,0x01,0xf0,0x00,0xba,0x01,0xf1,0x01,0xf2,0x01,0xf3,0x01,0xf4,0x01,0xf5,0x00,0x5d,0x01,0xf6,0x00,0xe7,0x01,0xf7,0x01,0xf8,0x01,0xf9,0x01,0xfa,0x01,0xfb,0x01,0xfc,0x01,0xfd, -0x01,0xfe,0x01,0xff,0x02,0x00,0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x04,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x09,0x02,0x0a,0x02,0x0b,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x10,0x02,0x11,0x02,0x12,0x02,0x13,0x02,0x14,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x1a,0x02,0x1b,0x02,0x1c,0x02,0x1d, -0x02,0x1e,0x02,0x1f,0x02,0x20,0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x24,0x02,0x25,0x02,0x26,0x02,0x27,0x02,0x28,0x02,0x29,0x02,0x2a,0x02,0x2b,0x02,0x2c,0x02,0x2d,0x02,0x2e,0x02,0x2f,0x02,0x30,0x02,0x31,0x02,0x32,0x02,0x33,0x02,0x34,0x02,0x35,0x02,0x36,0x02,0x37,0x02,0x38,0x02,0x39,0x02,0x3a,0x02,0x3b,0x02,0x3c,0x02,0x3d, -0x02,0x3e,0x02,0x3f,0x02,0x40,0x00,0x9d,0x00,0x9e,0x02,0x41,0x02,0x42,0x02,0x43,0x02,0x44,0x02,0x45,0x02,0x46,0x02,0x47,0x02,0x48,0x02,0x49,0x02,0x4a,0x02,0x4b,0x02,0x4c,0x02,0x4d,0x02,0x4e,0x02,0x4f,0x02,0x50,0x02,0x51,0x02,0x52,0x02,0x53,0x02,0x54,0x02,0x55,0x02,0x56,0x02,0x57,0x02,0x58,0x02,0x59,0x02,0x5a,0x02,0x5b, -0x02,0x5c,0x02,0x5d,0x02,0x5e,0x02,0x5f,0x02,0x60,0x02,0x61,0x02,0x62,0x02,0x63,0x02,0x64,0x02,0x65,0x02,0x66,0x02,0x67,0x02,0x68,0x02,0x69,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6d,0x02,0x6e,0x02,0x6f,0x02,0x70,0x02,0x71,0x02,0x72,0x02,0x73,0x02,0x74,0x02,0x75,0x02,0x76,0x02,0x77,0x02,0x78,0x02,0x79,0x02,0x7a,0x02,0x7b, -0x02,0x7c,0x02,0x7d,0x02,0x7e,0x02,0x7f,0x02,0x80,0x02,0x81,0x02,0x82,0x02,0x83,0x02,0x84,0x02,0x85,0x02,0x86,0x02,0x87,0x02,0x88,0x02,0x89,0x02,0x8a,0x02,0x8b,0x02,0x8c,0x02,0x8d,0x02,0x8e,0x02,0x8f,0x02,0x90,0x02,0x91,0x02,0x92,0x02,0x93,0x02,0x94,0x02,0x95,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x99,0x02,0x9a,0x02,0x9b, -0x02,0x9c,0x02,0x9d,0x02,0x9e,0x02,0x9f,0x02,0xa0,0x02,0xa1,0x02,0xa2,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x02,0xa6,0x02,0xa7,0x02,0xa8,0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xac,0x02,0xad,0x02,0xae,0x02,0xaf,0x02,0xb0,0x02,0xb1,0x02,0xb2,0x02,0xb3,0x02,0xb4,0x02,0xb5,0x02,0xb6,0x02,0xb7,0x02,0xb8,0x02,0xb9,0x02,0xba,0x02,0xbb, -0x02,0xbc,0x02,0xbd,0x02,0xbe,0x02,0xbf,0x02,0xc0,0x02,0xc1,0x02,0xc2,0x02,0xc3,0x02,0xc4,0x02,0xc5,0x02,0xc6,0x02,0xc7,0x02,0xc8,0x02,0xc9,0x02,0xca,0x02,0xcb,0x02,0xcc,0x02,0xcd,0x02,0xce,0x02,0xcf,0x02,0xd0,0x02,0xd1,0x02,0xd2,0x02,0xd3,0x02,0xd4,0x02,0xd5,0x02,0xd6,0x02,0xd7,0x02,0xd8,0x02,0xd9,0x02,0xda,0x02,0xdb, -0x02,0xdc,0x02,0xdd,0x02,0xde,0x02,0xdf,0x02,0xe0,0x02,0xe1,0x02,0xe2,0x02,0xe3,0x02,0xe4,0x02,0xe5,0x02,0xe6,0x02,0xe7,0x02,0xe8,0x02,0xe9,0x02,0xea,0x02,0xeb,0x02,0xec,0x02,0xed,0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x02,0xf8,0x02,0xf9,0x02,0xfa,0x02,0xfb, -0x02,0xfc,0x00,0x9b,0x02,0xfd,0x02,0xfe,0x02,0xff,0x03,0x00,0x03,0x01,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,0x03,0x0a,0x03,0x0b,0x03,0x0c,0x03,0x0d,0x03,0x0e,0x03,0x0f,0x03,0x10,0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x1a, -0x03,0x1b,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x03,0x20,0x03,0x21,0x03,0x22,0x03,0x23,0x03,0x24,0x03,0x25,0x03,0x26,0x03,0x27,0x03,0x28,0x03,0x29,0x03,0x2a,0x03,0x2b,0x03,0x2c,0x03,0x2d,0x03,0x2e,0x03,0x2f,0x03,0x30,0x03,0x31,0x03,0x32,0x03,0x33,0x03,0x34,0x03,0x35,0x03,0x36,0x03,0x37,0x03,0x38,0x03,0x39,0x03,0x3a, -0x03,0x3b,0x03,0x3c,0x03,0x3d,0x03,0x3e,0x03,0x3f,0x03,0x40,0x03,0x41,0x03,0x42,0x03,0x43,0x03,0x44,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x49,0x03,0x4a,0x03,0x4b,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x03,0x4c,0x03,0x4d,0x03,0x4e,0x03,0x4f,0x03,0x50, -0x03,0x51,0x03,0x52,0x03,0x53,0x03,0x54,0x03,0x55,0x03,0x56,0x03,0x57,0x03,0x58,0x03,0x59,0x03,0x5a,0x03,0x5b,0x03,0x5c,0x03,0x5d,0x03,0x5e,0x03,0x5f,0x03,0x60,0x03,0x61,0x03,0x62,0x03,0x63,0x03,0x64,0x03,0x65,0x03,0x66,0x03,0x67,0x03,0x68,0x03,0x69,0x03,0x6a,0x03,0x6b,0x03,0x6c,0x03,0x6d,0x03,0x6e,0x03,0x6f,0x03,0x70, -0x03,0x71,0x03,0x72,0x03,0x73,0x03,0x74,0x03,0x75,0x03,0x76,0x03,0x77,0x03,0x78,0x03,0x79,0x03,0x7a,0x03,0x7b,0x03,0x7c,0x03,0x7d,0x03,0x7e,0x03,0x7f,0x03,0x80,0x03,0x81,0x03,0x82,0x03,0x83,0x03,0x84,0x03,0x85,0x03,0x86,0x03,0x87,0x03,0x88,0x03,0x89,0x03,0x8a,0x03,0x8b,0x03,0x8c,0x03,0x8d,0x00,0xbc,0x00,0xf4,0x00,0xf5, -0x00,0xf6,0x03,0x8e,0x03,0x8f,0x03,0x90,0x03,0x91,0x03,0x92,0x00,0x11,0x00,0x0f,0x00,0x1d,0x00,0x1e,0x00,0xab,0x00,0x04,0x00,0xa3,0x00,0x22,0x00,0xa2,0x00,0xc3,0x00,0x87,0x00,0x0d,0x03,0x93,0x03,0x94,0x03,0x95,0x03,0x96,0x03,0x97,0x00,0x06,0x03,0x98,0x03,0x99,0x00,0x12,0x00,0x3f,0x03,0x9a,0x03,0x9b,0x03,0x9c,0x03,0x9d, -0x00,0x0b,0x00,0x0c,0x00,0x5e,0x00,0x60,0x00,0x3e,0x00,0x40,0x03,0x9e,0x03,0x9f,0x03,0xa0,0x03,0xa1,0x03,0xa2,0x03,0xa3,0x03,0xa4,0x03,0xa5,0x03,0xa6,0x03,0xa7,0x03,0xa8,0x03,0xa9,0x03,0xaa,0x03,0xab,0x00,0x10,0x03,0xac,0x00,0xb2,0x00,0xb3,0x03,0xad,0x00,0x42,0x00,0xc4,0x00,0xc5,0x00,0xb4,0x00,0xb5,0x00,0xb6,0x00,0xb7, -0x03,0xae,0x03,0xaf,0x00,0xa9,0x00,0xaa,0x00,0xbe,0x00,0xbf,0x03,0xb0,0x00,0x05,0x00,0x0a,0x03,0xb1,0x03,0xb2,0x03,0xb3,0x03,0xb4,0x03,0xb5,0x03,0xb6,0x03,0xb7,0x03,0xb8,0x03,0xb9,0x03,0xba,0x03,0xbb,0x03,0xbc,0x03,0xbd,0x03,0xbe,0x03,0xbf,0x03,0xc0,0x03,0xc1,0x03,0xc2,0x03,0xc3,0x03,0xc4,0x03,0xc5,0x03,0xc6,0x03,0xc7, -0x03,0xc8,0x03,0xc9,0x03,0xca,0x03,0xcb,0x03,0xcc,0x03,0xcd,0x03,0xce,0x03,0xcf,0x03,0xd0,0x03,0xd1,0x03,0xd2,0x03,0xd3,0x03,0xd4,0x03,0xd5,0x03,0xd6,0x03,0xd7,0x03,0xd8,0x03,0xd9,0x03,0xda,0x03,0xdb,0x03,0xdc,0x03,0xdd,0x03,0xde,0x03,0xdf,0x03,0xe0,0x03,0xe1,0x03,0xe2,0x03,0xe3,0x03,0xe4,0x03,0xe5,0x03,0xe6,0x03,0xe7, -0x03,0xe8,0x03,0xe9,0x03,0xea,0x03,0xeb,0x03,0xec,0x03,0xed,0x03,0xee,0x03,0xef,0x03,0xf0,0x03,0xf1,0x03,0xf2,0x03,0xf3,0x03,0xf4,0x03,0xf5,0x03,0xf6,0x03,0xf7,0x03,0xf8,0x03,0xf9,0x03,0xfa,0x03,0xfb,0x03,0xfc,0x03,0xfd,0x03,0xfe,0x03,0xff,0x04,0x00,0x04,0x01,0x04,0x02,0x00,0x03,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x06, -0x00,0x84,0x00,0xbd,0x00,0x07,0x04,0x07,0x04,0x08,0x00,0xa6,0x04,0x09,0x04,0x0a,0x00,0x85,0x04,0x0b,0x00,0x96,0x04,0x0c,0x04,0x0d,0x04,0x0e,0x04,0x0f,0x04,0x10,0x04,0x11,0x04,0x12,0x04,0x13,0x04,0x14,0x04,0x15,0x04,0x16,0x04,0x17,0x04,0x18,0x04,0x19,0x04,0x1a,0x04,0x1b,0x04,0x1c,0x04,0x1d,0x04,0x1e,0x04,0x1f,0x04,0x20, -0x04,0x21,0x04,0x22,0x04,0x23,0x04,0x24,0x04,0x25,0x04,0x26,0x04,0x27,0x04,0x28,0x04,0x29,0x04,0x2a,0x04,0x2b,0x04,0x2c,0x04,0x2d,0x04,0x2e,0x04,0x2f,0x04,0x30,0x04,0x31,0x04,0x32,0x04,0x33,0x04,0x34,0x04,0x35,0x04,0x36,0x04,0x37,0x04,0x38,0x04,0x39,0x04,0x3a,0x04,0x3b,0x04,0x3c,0x04,0x3d,0x04,0x3e,0x04,0x3f,0x04,0x40, -0x04,0x41,0x04,0x42,0x04,0x43,0x04,0x44,0x04,0x45,0x04,0x46,0x04,0x47,0x04,0x48,0x04,0x49,0x04,0x4a,0x04,0x4b,0x04,0x4c,0x04,0x4d,0x04,0x4e,0x04,0x4f,0x04,0x50,0x04,0x51,0x04,0x52,0x00,0x0e,0x00,0xef,0x00,0xf0,0x00,0xb8,0x00,0x20,0x00,0x8f,0x00,0x21,0x00,0x1f,0x00,0x95,0x00,0x94,0x00,0x93,0x00,0xa7,0x00,0xa4,0x00,0x61, -0x00,0x41,0x00,0x92,0x04,0x53,0x04,0x54,0x04,0x55,0x04,0x56,0x04,0x57,0x00,0x9c,0x04,0x58,0x00,0x9a,0x00,0x99,0x00,0xa5,0x00,0x98,0x04,0x59,0x04,0x5a,0x04,0x5b,0x04,0x5c,0x04,0x5d,0x04,0x5e,0x04,0x5f,0x04,0x60,0x00,0x08,0x00,0xc6,0x04,0x61,0x04,0x62,0x04,0x63,0x04,0x64,0x04,0x65,0x04,0x66,0x04,0x67,0x04,0x68,0x04,0x69, -0x04,0x6a,0x04,0x6b,0x04,0x6c,0x04,0x6d,0x04,0x6e,0x04,0x6f,0x04,0x70,0x04,0x71,0x04,0x72,0x04,0x73,0x04,0x74,0x04,0x75,0x04,0x76,0x04,0x77,0x04,0x78,0x04,0x79,0x04,0x7a,0x04,0x7b,0x04,0x7c,0x04,0x7d,0x04,0x7e,0x04,0x7f,0x04,0x80,0x04,0x81,0x04,0x82,0x04,0x83,0x04,0x84,0x04,0x85,0x04,0x86,0x04,0x87,0x04,0x88,0x04,0x89, -0x04,0x8a,0x04,0x8b,0x04,0x8c,0x04,0x8d,0x04,0x8e,0x04,0x8f,0x04,0x90,0x04,0x91,0x04,0x92,0x04,0x93,0x04,0x94,0x04,0x95,0x04,0x96,0x04,0x97,0x04,0x98,0x04,0x99,0x04,0x9a,0x04,0x9b,0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xa2,0x04,0xa3,0x04,0xa4,0x04,0xa5,0x04,0xa6,0x04,0xa7,0x04,0xa8,0x04,0xa9, -0x04,0xaa,0x04,0xab,0x04,0xac,0x04,0xad,0x04,0xae,0x04,0xaf,0x04,0xb0,0x04,0xb1,0x04,0xb2,0x04,0xb3,0x04,0xb4,0x04,0xb5,0x04,0xb6,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xba,0x04,0xbb,0x04,0xbc,0x04,0xbd,0x04,0xbe,0x04,0xbf,0x04,0xc0,0x04,0xc1,0x04,0xc2,0x04,0xc3,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc7,0x04,0xc8,0x04,0xc9, -0x04,0xca,0x04,0xcb,0x04,0xcc,0x04,0xcd,0x04,0xce,0x04,0xcf,0x04,0xd0,0x04,0xd1,0x04,0xd2,0x04,0xd3,0x04,0xd4,0x04,0xd5,0x04,0xd6,0x04,0xd7,0x04,0xd8,0x04,0xd9,0x04,0xda,0x04,0xdb,0x04,0xdc,0x04,0xdd,0x04,0xde,0x04,0xdf,0x04,0xe0,0x04,0xe1,0x04,0xe2,0x04,0xe3,0x04,0xe4,0x04,0xe5,0x04,0xe6,0x04,0xe7,0x04,0xe8,0x04,0xe9, -0x04,0xea,0x04,0xeb,0x04,0xec,0x04,0xed,0x00,0xb9,0x04,0xee,0x04,0xef,0x04,0xf0,0x04,0xf1,0x04,0xf2,0x04,0xf3,0x04,0xf4,0x04,0xf5,0x04,0xf6,0x04,0xf7,0x04,0xf8,0x04,0xf9,0x04,0xfa,0x04,0xfb,0x04,0xfc,0x04,0xfd,0x04,0xfe,0x04,0xff,0x05,0x00,0x05,0x01,0x05,0x02,0x05,0x03,0x05,0x04,0x05,0x05,0x05,0x06,0x05,0x07,0x05,0x08, -0x05,0x09,0x05,0x0a,0x05,0x0b,0x05,0x0c,0x05,0x0d,0x05,0x0e,0x05,0x0f,0x05,0x10,0x05,0x11,0x05,0x12,0x05,0x13,0x05,0x14,0x05,0x15,0x05,0x16,0x05,0x17,0x05,0x18,0x05,0x19,0x05,0x1a,0x05,0x1b,0x05,0x1c,0x05,0x1d,0x05,0x1e,0x05,0x1f,0x05,0x20,0x05,0x21,0x05,0x22,0x05,0x23,0x05,0x24,0x05,0x25,0x05,0x26,0x05,0x27,0x05,0x28, -0x05,0x29,0x05,0x2a,0x05,0x2b,0x05,0x2c,0x05,0x2d,0x05,0x2e,0x05,0x2f,0x05,0x30,0x05,0x31,0x05,0x32,0x05,0x33,0x05,0x34,0x05,0x35,0x05,0x36,0x05,0x37,0x05,0x38,0x05,0x39,0x05,0x3a,0x05,0x3b,0x05,0x3c,0x05,0x3d,0x05,0x3e,0x05,0x3f,0x05,0x40,0x05,0x41,0x05,0x42,0x05,0x43,0x05,0x44,0x05,0x45,0x05,0x46,0x05,0x47,0x05,0x48, -0x05,0x49,0x05,0x4a,0x05,0x4b,0x05,0x4c,0x05,0x4d,0x05,0x4e,0x05,0x4f,0x05,0x50,0x05,0x51,0x05,0x52,0x05,0x53,0x05,0x54,0x05,0x55,0x05,0x56,0x05,0x57,0x05,0x58,0x05,0x59,0x05,0x5a,0x05,0x5b,0x05,0x5c,0x05,0x5d,0x05,0x5e,0x05,0x5f,0x05,0x60,0x05,0x61,0x05,0x62,0x05,0x63,0x05,0x64,0x05,0x65,0x05,0x66,0x05,0x67,0x05,0x68, -0x05,0x69,0x05,0x6a,0x05,0x6b,0x05,0x6c,0x05,0x6d,0x05,0x6e,0x05,0x6f,0x05,0x70,0x05,0x71,0x05,0x72,0x05,0x73,0x05,0x74,0x05,0x75,0x05,0x76,0x05,0x77,0x05,0x78,0x05,0x79,0x05,0x7a,0x05,0x7b,0x05,0x7c,0x05,0x7d,0x05,0x7e,0x05,0x7f,0x05,0x80,0x05,0x81,0x05,0x82,0x05,0x83,0x05,0x84,0x05,0x85,0x05,0x86,0x05,0x87,0x05,0x88, -0x05,0x89,0x05,0x8a,0x05,0x8b,0x05,0x8c,0x05,0x8d,0x05,0x8e,0x05,0x8f,0x05,0x90,0x05,0x91,0x05,0x92,0x05,0x93,0x05,0x94,0x05,0x95,0x05,0x96,0x05,0x97,0x05,0x98,0x05,0x99,0x05,0x9a,0x05,0x9b,0x05,0x9c,0x05,0x9d,0x05,0x9e,0x05,0x9f,0x05,0xa0,0x05,0xa1,0x05,0xa2,0x05,0xa3,0x05,0xa4,0x05,0xa5,0x05,0xa6,0x05,0xa7,0x05,0xa8, -0x05,0xa9,0x05,0xaa,0x05,0xab,0x05,0xac,0x05,0xad,0x05,0xae,0x05,0xaf,0x05,0xb0,0x05,0xb1,0x05,0xb2,0x05,0xb3,0x05,0xb4,0x05,0xb5,0x05,0xb6,0x05,0xb7,0x05,0xb8,0x05,0xb9,0x05,0xba,0x05,0xbb,0x05,0xbc,0x05,0xbd,0x05,0xbe,0x05,0xbf,0x05,0xc0,0x05,0xc1,0x05,0xc2,0x05,0xc3,0x05,0xc4,0x05,0xc5,0x05,0xc6,0x05,0xc7,0x05,0xc8, -0x05,0xc9,0x05,0xca,0x05,0xcb,0x05,0xcc,0x05,0xcd,0x05,0xce,0x05,0xcf,0x05,0xd0,0x05,0xd1,0x05,0xd2,0x05,0xd3,0x05,0xd4,0x05,0xd5,0x05,0xd6,0x05,0xd7,0x05,0xd8,0x05,0xd9,0x00,0x23,0x00,0x09,0x00,0x88,0x00,0x86,0x00,0x8b,0x00,0x8a,0x00,0x8c,0x00,0x83,0x05,0xda,0x05,0xdb,0x00,0x5f,0x00,0xe8,0x00,0x82,0x05,0xdc,0x00,0xc2, -0x05,0xdd,0x05,0xde,0x05,0xdf,0x05,0xe0,0x05,0xe1,0x05,0xe2,0x05,0xe3,0x05,0xe4,0x05,0xe5,0x05,0xe6,0x05,0xe7,0x05,0xe8,0x05,0xe9,0x05,0xea,0x05,0xeb,0x05,0xec,0x05,0xed,0x05,0xee,0x05,0xef,0x05,0xf0,0x05,0xf1,0x05,0xf2,0x05,0xf3,0x05,0xf4,0x05,0xf5,0x05,0xf6,0x05,0xf7,0x05,0xf8,0x05,0xf9,0x05,0xfa,0x05,0xfb,0x05,0xfc, -0x05,0xfd,0x05,0xfe,0x05,0xff,0x06,0x00,0x06,0x01,0x06,0x02,0x06,0x03,0x06,0x04,0x06,0x05,0x06,0x06,0x06,0x07,0x06,0x08,0x06,0x09,0x06,0x0a,0x06,0x0b,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x06,0x0f,0x06,0x10,0x06,0x11,0x06,0x12,0x06,0x13,0x06,0x14,0x06,0x15,0x06,0x16,0x06,0x17,0x06,0x18,0x06,0x19,0x06,0x1a,0x06,0x1b,0x06,0x1c, -0x06,0x1d,0x06,0x1e,0x06,0x1f,0x06,0x20,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x25,0x06,0x26,0x06,0x27,0x06,0x28,0x06,0x29,0x06,0x2a,0x06,0x2b,0x06,0x2c,0x06,0x2d,0x06,0x2e,0x06,0x2f,0x06,0x30,0x06,0x31,0x06,0x32,0x06,0x33,0x06,0x34,0x06,0x35,0x06,0x36,0x06,0x37,0x06,0x38,0x06,0x39,0x06,0x3a,0x06,0x3b,0x06,0x3c, -0x06,0x3d,0x06,0x3e,0x06,0x3f,0x06,0x40,0x06,0x41,0x06,0x42,0x06,0x43,0x06,0x44,0x06,0x45,0x06,0x46,0x06,0x47,0x06,0x48,0x06,0x49,0x06,0x4a,0x06,0x4b,0x06,0x4c,0x06,0x4d,0x06,0x4e,0x06,0x4f,0x06,0x50,0x06,0x51,0x06,0x52,0x06,0x53,0x06,0x54,0x06,0x55,0x06,0x56,0x06,0x57,0x06,0x58,0x06,0x59,0x06,0x5a,0x06,0x5b,0x06,0x5c, -0x06,0x5d,0x06,0x5e,0x06,0x5f,0x06,0x60,0x06,0x61,0x06,0x62,0x06,0x63,0x06,0x64,0x06,0x65,0x06,0x66,0x06,0x67,0x06,0x68,0x06,0x69,0x06,0x6a,0x06,0x6b,0x06,0x6c,0x06,0x6d,0x06,0x6e,0x06,0x6f,0x06,0x70,0x06,0x71,0x06,0x72,0x06,0x73,0x06,0x74,0x06,0x75,0x06,0x76,0x06,0x77,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x7c, -0x06,0x7d,0x06,0x7e,0x06,0x7f,0x06,0x80,0x06,0x81,0x06,0x82,0x06,0x83,0x06,0x84,0x06,0x85,0x06,0x86,0x06,0x87,0x06,0x88,0x06,0x89,0x06,0x8a,0x06,0x8b,0x06,0x8c,0x06,0x8d,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x00,0x8e,0x00,0xdc,0x00,0x43, -0x00,0x8d,0x00,0xdf,0x00,0xd8,0x00,0xe1,0x00,0xdb,0x00,0xdd,0x00,0xd9,0x00,0xda,0x00,0xde,0x00,0xe0,0x06,0x9a,0x06,0x9b,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa3,0x06,0xa4,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf, -0x06,0xb0,0x06,0xb1,0x06,0xb2,0x06,0xb3,0x06,0xb4,0x06,0xb5,0x06,0xb6,0x06,0xb7,0x06,0xb8,0x06,0xb9,0x06,0xba,0x06,0xbb,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x06,0xc4,0x06,0xc5,0x06,0xc6,0x06,0xc7,0x06,0xc8,0x06,0xc9,0x06,0xca,0x06,0xcb,0x06,0xcc,0x06,0xcd,0x06,0xce,0x06,0xcf, -0x06,0xd0,0x06,0xd1,0x06,0xd2,0x06,0xd3,0x06,0xd4,0x06,0xd5,0x06,0xd6,0x06,0xd7,0x06,0xd8,0x06,0xd9,0x06,0xda,0x06,0xdb,0x06,0x41,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x32,0x07, -0x75,0x6e,0x69,0x31,0x45,0x42,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x30,0x07, -0x75,0x6e,0x69,0x31,0x45,0x41,0x32,0x07,0x41,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x41,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x41,0x45,0x61,0x63,0x75,0x74,0x65,0x0b,0x43,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0a,0x43,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x44,0x63,0x61,0x72,0x6f,0x6e,0x06,0x44,0x63, -0x72,0x6f,0x61,0x74,0x06,0x45,0x62,0x72,0x65,0x76,0x65,0x06,0x45,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x34,0x0a,0x45,0x64,0x6f,0x74,0x61, -0x63,0x63,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x41,0x07,0x45,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x45,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x34,0x06,0x47,0x63, -0x61,0x72,0x6f,0x6e,0x0b,0x47,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x32,0x32,0x0a,0x47,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x04,0x48,0x62,0x61,0x72,0x0b,0x48,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x06,0x49,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31, -0x45,0x43,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x38,0x07,0x49,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x49,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x06,0x49,0x74,0x69,0x6c,0x64,0x65,0x0b,0x4a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x36,0x06,0x4c,0x61,0x63,0x75,0x74,0x65,0x06,0x4c,0x63, -0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x42,0x04,0x4c,0x64,0x6f,0x74,0x06,0x4e,0x61,0x63,0x75,0x74,0x65,0x06,0x4e,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x34,0x35,0x03,0x45,0x6e,0x67,0x06,0x4f,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x30,0x07,0x75,0x6e,0x69,0x31,0x45, -0x44,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x45,0x05,0x4f,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x32, -0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x30,0x0d,0x4f,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x4f,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x41,0x0b,0x4f,0x73,0x6c,0x61,0x73,0x68,0x61,0x63,0x75, -0x74,0x65,0x06,0x52,0x61,0x63,0x75,0x74,0x65,0x06,0x52,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x35,0x36,0x06,0x53,0x61,0x63,0x75,0x74,0x65,0x0b,0x53,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x45,0x07,0x75,0x6e,0x69,0x30, -0x31,0x38,0x46,0x04,0x54,0x62,0x61,0x72,0x06,0x54,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x36,0x32,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x41,0x06,0x55,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x36,0x05,0x55,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69, -0x31,0x45,0x45,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x45,0x0d,0x55,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x55,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x55,0x6f,0x67,0x6f,0x6e, -0x65,0x6b,0x05,0x55,0x72,0x69,0x6e,0x67,0x06,0x55,0x74,0x69,0x6c,0x64,0x65,0x06,0x57,0x61,0x63,0x75,0x74,0x65,0x0b,0x57,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x09,0x57,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x06,0x57,0x67,0x72,0x61,0x76,0x65,0x0b,0x59,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07, -0x75,0x6e,0x69,0x31,0x45,0x46,0x34,0x06,0x59,0x67,0x72,0x61,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x36,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x38,0x06,0x5a,0x61,0x63,0x75,0x74,0x65,0x0a,0x5a,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x57,0x2e,0x63,0x76,0x30,0x37,0x0b, -0x57,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x37,0x10,0x57,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x37,0x0e,0x57,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x30,0x37,0x0b,0x57,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x30,0x37,0x06,0x4b,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75, -0x6e,0x69,0x30,0x31,0x33,0x36,0x2e,0x63,0x76,0x30,0x38,0x06,0x51,0x2e,0x63,0x76,0x31,0x36,0x06,0x61,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x42, -0x35,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x41, -0x33,0x07,0x61,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x61,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x61,0x65,0x61,0x63,0x75,0x74,0x65,0x0b,0x63,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0a,0x63,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x64,0x63,0x61,0x72,0x6f,0x6e,0x06,0x65,0x62,0x72,0x65,0x76,0x65,0x06,0x65, -0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x35,0x0a,0x65,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x39, -0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x42,0x07,0x65,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x65,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x39,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x35,0x06,0x67,0x63,0x61,0x72,0x6f,0x6e,0x0b,0x67,0x63,0x69,0x72,0x63,0x75,0x6d,0x66, -0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x32,0x33,0x0a,0x67,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x04,0x68,0x62,0x61,0x72,0x0b,0x68,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x06,0x69,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x30,0x09,0x69,0x2e,0x6c,0x6f,0x63,0x6c,0x54,0x52,0x4b, -0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x39,0x07,0x69,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x69,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x06,0x69,0x74,0x69,0x6c,0x64,0x65,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x37,0x0b,0x6a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30, -0x31,0x33,0x37,0x0c,0x6b,0x67,0x72,0x65,0x65,0x6e,0x6c,0x61,0x6e,0x64,0x69,0x63,0x06,0x6c,0x61,0x63,0x75,0x74,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x42,0x06,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x43,0x04,0x6c,0x64,0x6f,0x74,0x06,0x6e,0x61,0x63,0x75,0x74,0x65,0x0b,0x6e,0x61,0x70,0x6f,0x73, -0x74,0x72,0x6f,0x70,0x68,0x65,0x06,0x6e,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x34,0x36,0x03,0x65,0x6e,0x67,0x06,0x6f,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x33, -0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x46,0x05,0x6f,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x44,0x07,0x75, -0x6e,0x69,0x31,0x45,0x44,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x31,0x0d,0x6f,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x6f,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x42,0x0b,0x6f,0x73,0x6c,0x61,0x73,0x68,0x61,0x63,0x75,0x74,0x65,0x06,0x72,0x61,0x63,0x75,0x74,0x65,0x06, -0x72,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x35,0x37,0x06,0x73,0x61,0x63,0x75,0x74,0x65,0x0b,0x73,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x39,0x05,0x6c,0x6f,0x6e,0x67,0x73,0x04,0x74,0x62,0x61,0x72,0x06,0x74,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30, -0x31,0x36,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x42,0x06,0x75,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x41,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x36,0x07,0x75,0x6e,0x69,0x31,0x45, -0x45,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x37,0x05,0x75,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x46,0x0d,0x75,0x68,0x75,0x6e,0x67,0x61,0x72, -0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x75,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x05,0x75,0x72,0x69,0x6e,0x67,0x06,0x75,0x74,0x69,0x6c,0x64,0x65,0x06,0x77,0x61,0x63,0x75,0x74,0x65,0x0b,0x77,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x09,0x77,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73, -0x06,0x77,0x67,0x72,0x61,0x76,0x65,0x0b,0x79,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x35,0x06,0x79,0x67,0x72,0x61,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x39,0x06,0x7a,0x61,0x63,0x75,0x74, -0x65,0x0a,0x7a,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x0f,0x67,0x65,0x72,0x6d,0x61,0x6e,0x64,0x62,0x6c,0x73,0x2e,0x63,0x61,0x6c,0x74,0x06,0x6c,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x31,0x0c,0x75,0x6e,0x69,0x30, -0x31,0x33,0x43,0x2e,0x63,0x76,0x30,0x31,0x09,0x6c,0x64,0x6f,0x74,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x73,0x6c,0x61,0x73,0x68,0x2e,0x63,0x76,0x30,0x31,0x06,0x74,0x2e,0x63,0x76,0x30,0x32,0x09,0x74,0x62,0x61,0x72,0x2e,0x63,0x76,0x30,0x32,0x0b,0x74,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x32,0x0c,0x75,0x6e,0x69,0x30, -0x31,0x36,0x33,0x2e,0x63,0x76,0x30,0x32,0x0c,0x75,0x6e,0x69,0x30,0x32,0x31,0x42,0x2e,0x63,0x76,0x30,0x32,0x06,0x67,0x2e,0x63,0x76,0x30,0x33,0x0c,0x75,0x6e,0x69,0x30,0x31,0x46,0x35,0x2e,0x63,0x76,0x30,0x33,0x0b,0x67,0x62,0x72,0x65,0x76,0x65,0x2e,0x63,0x76,0x30,0x33,0x0b,0x67,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30, -0x33,0x10,0x67,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x33,0x0c,0x75,0x6e,0x69,0x30,0x31,0x32,0x33,0x2e,0x63,0x76,0x30,0x33,0x0f,0x67,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x2e,0x63,0x76,0x30,0x33,0x06,0x6a,0x2e,0x63,0x76,0x30,0x34,0x0c,0x75,0x6e,0x69,0x30,0x32,0x33,0x37,0x2e,0x63, -0x76,0x30,0x34,0x10,0x6a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x34,0x06,0x6c,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x35,0x0c,0x75,0x6e,0x69,0x30,0x31,0x33,0x43,0x2e,0x63,0x76,0x30,0x35, -0x09,0x6c,0x64,0x6f,0x74,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x73,0x6c,0x61,0x73,0x68,0x2e,0x63,0x76,0x30,0x35,0x06,0x6d,0x2e,0x63,0x76,0x30,0x36,0x06,0x77,0x2e,0x63,0x76,0x30,0x37,0x0b,0x77,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x37,0x10,0x77,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30, -0x37,0x0e,0x77,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x30,0x37,0x0b,0x77,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x30,0x37,0x06,0x6b,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x31,0x33,0x37,0x2e,0x63,0x76,0x30,0x38,0x11,0x6b,0x67,0x72,0x65,0x65,0x6e,0x6c,0x61,0x6e,0x64,0x69,0x63,0x2e,0x63,0x76, -0x30,0x38,0x06,0x66,0x2e,0x63,0x76,0x30,0x39,0x06,0x72,0x2e,0x63,0x76,0x31,0x30,0x0b,0x72,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x30,0x0b,0x72,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x31,0x30,0x0c,0x75,0x6e,0x69,0x30,0x31,0x35,0x37,0x2e,0x63,0x76,0x31,0x30,0x06,0x79,0x2e,0x63,0x76,0x31,0x31,0x0b,0x79,0x61,0x63, -0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x31,0x10,0x79,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x31,0x31,0x0e,0x79,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x35,0x2e,0x63,0x76,0x31,0x31,0x0b,0x79,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x31, -0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x37,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x32,0x33,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x39,0x2e,0x63,0x76,0x31,0x31,0x06,0x75,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x62,0x72,0x65, -0x76,0x65,0x2e,0x63,0x76,0x31,0x32,0x10,0x75,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x31,0x32,0x0e,0x75,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x35,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x31,0x32, -0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x37,0x2e,0x63,0x76,0x31,0x32,0x0a,0x75,0x68,0x6f,0x72,0x6e,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x39,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x31,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x42,0x2e,0x63,0x76,0x31,0x32,0x0c, -0x75,0x6e,0x69,0x31,0x45,0x45,0x44,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x46,0x2e,0x63,0x76,0x31,0x32,0x12,0x75,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6f,0x67,0x6f,0x6e,0x65, -0x6b,0x2e,0x63,0x76,0x31,0x32,0x0a,0x75,0x72,0x69,0x6e,0x67,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x74,0x69,0x6c,0x64,0x65,0x2e,0x63,0x76,0x31,0x32,0x06,0x66,0x2e,0x63,0x76,0x31,0x37,0x0b,0x66,0x2e,0x63,0x76,0x30,0x39,0x2e,0x73,0x73,0x32,0x30,0x06,0x66,0x2e,0x73,0x73,0x32,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x30,0x07, -0x75,0x6e,0x69,0x30,0x34,0x31,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x31,0x07, -0x75,0x6e,0x69,0x30,0x34,0x31,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x43,0x07, -0x75,0x6e,0x69,0x30,0x34,0x31,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x45,0x07, -0x75,0x6e,0x69,0x30,0x34,0x32,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x43,0x07, -0x75,0x6e,0x69,0x30,0x34,0x32,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x36,0x07, -0x75,0x6e,0x69,0x30,0x34,0x30,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x41,0x07, -0x75,0x6e,0x69,0x30,0x34,0x41,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x45,0x07, -0x75,0x6e,0x69,0x30,0x34,0x45,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x34,0x0c,0x75,0x6e,0x69,0x30,0x34,0x31,0x36,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x31,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x30, -0x43,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x39,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x32,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x30,0x45,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x32,0x31,0x2e,0x63,0x76,0x39,0x39,0x07,0x75,0x6e,0x69,0x30,0x34, -0x33,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x35,0x07,0x75,0x6e,0x69,0x30,0x34, -0x35,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x42,0x07,0x75,0x6e,0x69,0x30,0x34, -0x33,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x33,0x07,0x75,0x6e,0x69,0x30,0x34, -0x35,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x46,0x07,0x75,0x6e,0x69,0x30,0x34, -0x34,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x44,0x07,0x75,0x6e,0x69,0x30,0x34, -0x35,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x33,0x07,0x75,0x6e,0x69,0x30,0x34, -0x39,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x44,0x07,0x75,0x6e,0x69,0x30,0x34, -0x44,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x35,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x38,0x2e,0x63,0x76,0x30,0x34,0x0c,0x75,0x6e,0x69,0x30,0x34,0x33,0x36,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69, -0x30,0x34,0x33,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x43,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x39,0x42,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x34,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x45,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e, -0x69,0x30,0x34,0x34,0x31,0x2e,0x63,0x76,0x39,0x39,0x05,0x41,0x6c,0x70,0x68,0x61,0x04,0x42,0x65,0x74,0x61,0x05,0x47,0x61,0x6d,0x6d,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x39,0x34,0x07,0x45,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x04,0x5a,0x65,0x74,0x61,0x03,0x45,0x74,0x61,0x05,0x54,0x68,0x65,0x74,0x61,0x04,0x49,0x6f,0x74,0x61,0x05, -0x4b,0x61,0x70,0x70,0x61,0x06,0x4c,0x61,0x6d,0x62,0x64,0x61,0x02,0x4d,0x75,0x02,0x4e,0x75,0x02,0x58,0x69,0x07,0x4f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x02,0x50,0x69,0x03,0x52,0x68,0x6f,0x05,0x53,0x69,0x67,0x6d,0x61,0x03,0x54,0x61,0x75,0x07,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x03,0x50,0x68,0x69,0x03,0x43,0x68,0x69,0x03,0x50, -0x73,0x69,0x07,0x75,0x6e,0x69,0x30,0x33,0x41,0x39,0x0a,0x41,0x6c,0x70,0x68,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x45,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x08,0x45,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x09,0x49,0x6f,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x4f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x74,0x6f,0x6e, -0x6f,0x73,0x0c,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x4f,0x6d,0x65,0x67,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x49,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x0f,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x07,0x75,0x6e,0x69,0x30,0x33,0x43,0x46,0x0a, -0x4b,0x61,0x70,0x70,0x61,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x33,0x43,0x46,0x2e,0x63,0x76,0x30,0x38,0x05,0x61,0x6c,0x70,0x68,0x61,0x04,0x62,0x65,0x74,0x61,0x05,0x67,0x61,0x6d,0x6d,0x61,0x05,0x64,0x65,0x6c,0x74,0x61,0x07,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x04,0x7a,0x65,0x74,0x61,0x03,0x65,0x74,0x61,0x05, -0x74,0x68,0x65,0x74,0x61,0x04,0x69,0x6f,0x74,0x61,0x05,0x6b,0x61,0x70,0x70,0x61,0x06,0x6c,0x61,0x6d,0x62,0x64,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x42,0x43,0x02,0x6e,0x75,0x02,0x78,0x69,0x07,0x6f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x03,0x72,0x68,0x6f,0x07,0x75,0x6e,0x69,0x30,0x33,0x43,0x32,0x05,0x73,0x69,0x67,0x6d,0x61,0x03, -0x74,0x61,0x75,0x07,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x03,0x70,0x68,0x69,0x03,0x63,0x68,0x69,0x03,0x70,0x73,0x69,0x05,0x6f,0x6d,0x65,0x67,0x61,0x09,0x69,0x6f,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x69,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x11,0x69,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69, -0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x0f,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x14,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x6f,0x6d,0x69,0x63,0x72,0x6f,0x6e, -0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x6f,0x6d,0x65,0x67,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x61,0x6c,0x70,0x68,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x08,0x65,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x44, -0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x36,0x0a,0x6b,0x61,0x70,0x70,0x61,0x2e,0x63,0x76,0x30,0x38,0x0a,0x67,0x61,0x6d,0x6d,0x61,0x2e,0x63,0x76,0x31,0x31,0x0b,0x6c,0x61,0x6d,0x62,0x64,0x61,0x2e,0x63,0x76,0x31,0x31,0x06,0x75,0x31,0x36,0x39,0x31,0x30,0x06,0x75,0x31,0x44,0x35,0x33,0x38,0x06,0x75,0x31,0x44,0x35,0x33,0x39, -0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x32,0x06,0x75,0x31,0x44,0x35,0x33,0x42,0x06,0x75,0x31,0x44,0x35,0x33,0x43,0x06,0x75,0x31,0x44,0x35,0x33,0x44,0x06,0x75,0x31,0x44,0x35,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x30,0x06,0x75,0x31,0x44,0x35,0x34,0x31,0x06,0x75,0x31,0x44,0x35,0x34, -0x32,0x06,0x75,0x31,0x44,0x35,0x34,0x33,0x06,0x75,0x31,0x44,0x35,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x35,0x06,0x75,0x31,0x44,0x35,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x41,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x41,0x06,0x75,0x31, -0x44,0x35,0x34,0x42,0x06,0x75,0x31,0x44,0x35,0x34,0x43,0x06,0x75,0x31,0x44,0x35,0x34,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x45,0x06,0x75,0x31,0x44,0x35,0x34,0x46,0x06,0x75,0x31,0x44,0x35,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x32,0x34,0x06,0x75,0x31,0x44,0x35,0x35,0x32,0x06,0x75,0x31,0x44,0x35,0x35,0x33,0x06,0x75,0x31, -0x44,0x35,0x35,0x34,0x06,0x75,0x31,0x44,0x35,0x35,0x35,0x06,0x75,0x31,0x44,0x35,0x35,0x36,0x06,0x75,0x31,0x44,0x35,0x35,0x37,0x06,0x75,0x31,0x44,0x35,0x35,0x38,0x06,0x75,0x31,0x44,0x35,0x35,0x39,0x06,0x75,0x31,0x44,0x35,0x35,0x41,0x06,0x75,0x31,0x44,0x35,0x35,0x42,0x06,0x75,0x31,0x44,0x35,0x35,0x43,0x06,0x75,0x31,0x44, -0x35,0x35,0x44,0x06,0x75,0x31,0x44,0x35,0x35,0x45,0x06,0x75,0x31,0x44,0x35,0x35,0x46,0x06,0x75,0x31,0x44,0x35,0x36,0x30,0x06,0x75,0x31,0x44,0x35,0x36,0x31,0x06,0x75,0x31,0x44,0x35,0x36,0x32,0x06,0x75,0x31,0x44,0x35,0x36,0x33,0x06,0x75,0x31,0x44,0x35,0x36,0x34,0x06,0x75,0x31,0x44,0x35,0x36,0x35,0x06,0x75,0x31,0x44,0x35, -0x36,0x36,0x06,0x75,0x31,0x44,0x35,0x36,0x37,0x06,0x75,0x31,0x44,0x35,0x36,0x38,0x06,0x75,0x31,0x44,0x35,0x36,0x39,0x06,0x75,0x31,0x44,0x35,0x36,0x41,0x06,0x75,0x31,0x44,0x35,0x36,0x42,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x7a,0x65,0x72,0x6f,0x08,0x74,0x77,0x6f,0x2e,0x63,0x76,0x31,0x38,0x08,0x73,0x69,0x78,0x2e,0x63,0x76,0x31, -0x38,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x63,0x76,0x31,0x38,0x0a,0x65,0x69,0x67,0x68,0x74,0x2e,0x63,0x76,0x31,0x39,0x09,0x66,0x69,0x76,0x65,0x2e,0x63,0x76,0x32,0x30,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x30,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x33, -0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x39,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x08,0x6f,0x6e,0x65,0x2e,0x64, -0x6e,0x6f,0x6d,0x08,0x74,0x77,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x0a,0x74,0x68,0x72,0x65,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x66,0x6f,0x75,0x72,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x66,0x69,0x76,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x08,0x73,0x69,0x78,0x2e,0x64,0x6e,0x6f,0x6d,0x0a,0x73,0x65,0x76,0x65,0x6e,0x2e,0x64,0x6e,0x6f,0x6d,0x0a, -0x65,0x69,0x67,0x68,0x74,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x6f,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x74,0x77,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x74,0x68,0x72,0x65,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x09,0x66,0x6f,0x75,0x72, -0x2e,0x6e,0x75,0x6d,0x72,0x09,0x66,0x69,0x76,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x73,0x69,0x78,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x73,0x65,0x76,0x65,0x6e,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x65,0x69,0x67,0x68,0x74,0x2e,0x6e,0x75,0x6d,0x72,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x30, -0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x39,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x32,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x33,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x38, -0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x32,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x36,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x39,0x2e,0x63,0x76,0x31,0x38,0x0d,0x74,0x77,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0d,0x73,0x69, -0x78,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0e,0x6e,0x69,0x6e,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0d,0x74,0x77,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x38,0x0d,0x73,0x69,0x78,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x38,0x0e,0x6e,0x69,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72, -0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x30,0x30,0x42,0x32,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x36,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x39,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x38,0x2e,0x63,0x76,0x31,0x39,0x0f,0x65,0x69,0x67,0x68,0x74,0x2e, -0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x39,0x0f,0x65,0x69,0x67,0x68,0x74,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x38,0x2e,0x63,0x76,0x31,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x35,0x2e,0x63,0x76,0x32,0x30,0x0e,0x66,0x69,0x76,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76, -0x32,0x30,0x0e,0x66,0x69,0x76,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x32,0x30,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x35,0x2e,0x63,0x76,0x32,0x30,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x30,0x2e,0x7a,0x65,0x72,0x6f,0x0e,0x7a,0x65,0x72,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x7a,0x65,0x72,0x6f,0x0e,0x7a,0x65,0x72,0x6f,0x2e, -0x6e,0x75,0x6d,0x72,0x2e,0x7a,0x65,0x72,0x6f,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x30,0x2e,0x7a,0x65,0x72,0x6f,0x07,0x75,0x6e,0x69,0x30,0x41,0x45,0x41,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x36,0x09,0x65,0x78,0x63,0x6c,0x61,0x6d,0x64,0x62,0x6c, -0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x44,0x0e,0x6f,0x6e,0x65,0x64,0x6f,0x74,0x65,0x6e,0x6c,0x65,0x61,0x64,0x65,0x72,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x46,0x0a,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x1b,0x70,0x65,0x72,0x69,0x6f,0x64,0x63,0x65,0x6e,0x74,0x65,0x72,0x65, -0x64,0x2e,0x6c,0x6f,0x63,0x6c,0x43,0x41,0x54,0x2e,0x63,0x61,0x73,0x65,0x16,0x70,0x65,0x72,0x69,0x6f,0x64,0x63,0x65,0x6e,0x74,0x65,0x72,0x65,0x64,0x2e,0x6c,0x6f,0x63,0x6c,0x43,0x41,0x54,0x07,0x75,0x6e,0x69,0x46,0x46,0x35,0x42,0x07,0x75,0x6e,0x69,0x46,0x46,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x30,0x07,0x75,0x6e, -0x69,0x32,0x37,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x43,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x42,0x07,0x75,0x6e, -0x69,0x32,0x37,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x39,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x39,0x38,0x38,0x07,0x75,0x6e,0x69,0x30,0x30,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x30,0x0d,0x71,0x75,0x6f,0x74,0x65,0x72,0x65,0x76,0x65,0x72,0x73,0x65,0x64,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x46,0x07,0x75,0x6e,0x69,0x32, -0x30,0x33,0x34,0x12,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x19,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x28,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x62, -0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x62,0x61,0x72,0x2e, -0x6c,0x69,0x67,0x61,0x13,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73, -0x2e,0x6c,0x69,0x67,0x61,0x15,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x16,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x18,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x72,0x61, -0x63,0x65,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x26,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x23,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x65,0x78,0x63, -0x6c,0x61,0x6d,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x12,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x61, -0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65,0x66,0x74,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65, -0x66,0x74,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x19,0x70,0x65,0x72, -0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x17,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x14,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c, -0x69,0x67,0x61,0x11,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x10,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x63,0x6f, -0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e, -0x6c,0x69,0x67,0x61,0x10,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x12,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x18,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c, -0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x22,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c, -0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x1d,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x11,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x17,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65, -0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x14,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x13,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x71,0x75,0x65,0x73,0x74,0x69,0x6f, -0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x13,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c, -0x69,0x67,0x61,0x1f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x15,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x61,0x73,0x74,0x65,0x72,0x69, -0x73,0x6b,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x70,0x61,0x72,0x65,0x6e,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67, -0x61,0x1b,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x65, -0x78,0x63,0x6c,0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x25,0x6e, -0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x30,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65, -0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72, -0x65,0x2e,0x6c,0x69,0x67,0x61,0x24,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x70,0x61,0x72,0x65,0x6e,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x13,0x73,0x6c,0x61,0x73,0x68,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x1c, -0x73,0x6c,0x61,0x73,0x68,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x10,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e, -0x6c,0x69,0x67,0x61,0x12,0x73,0x6c,0x61,0x73,0x68,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x16,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16, -0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x14,0x73,0x6c,0x61,0x73,0x68,0x5f,0x62,0x61,0x63,0x6b,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x61,0x63,0x6b,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61, -0x1e,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x62,0x61,0x72,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x78,0x63,0x6c,0x61, -0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x1c,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x41,0x07,0x75, -0x6e,0x69,0x32,0x37,0x45,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x37,0x09,0x61,0x6e,0x6f,0x74,0x65,0x6c,0x65,0x69,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x37,0x45,0x06,0x45,0x4d,0x71,0x75,0x61,0x64,0x0e,0x5a,0x45,0x52,0x4f,0x57,0x49,0x44,0x54, -0x48,0x53,0x50,0x41,0x43,0x45,0x07,0x75,0x6e,0x69,0x30,0x30,0x41,0x30,0x02,0x43,0x52,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x46,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x46,0x04,0x64,0x6f,0x6e,0x67,0x04,0x45,0x75,0x72,0x6f,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x44,0x07,0x75,0x6e,0x69,0x32, -0x30,0x41,0x45,0x09,0x63,0x65,0x6e,0x74,0x2e,0x63,0x76,0x31,0x34,0x0b,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x63,0x76,0x31,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x31, -0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x31,0x09,0x63,0x6f,0x6e,0x67,0x72,0x75,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x34,0x07,0x75,0x6e,0x69,0x32, -0x32,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x44,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x46,0x31,0x07,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x41,0x07,0x75,0x6e,0x69,0x32, -0x32,0x45,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x43,0x0b,0x65,0x71,0x75,0x69,0x76,0x61,0x6c,0x65,0x6e,0x63,0x65,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x39,0x0b,0x65,0x78,0x69,0x73,0x74,0x65,0x6e,0x74,0x69,0x61,0x6c,0x08,0x67,0x72,0x61,0x64, -0x69,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x39,0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x44,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x37,0x07,0x75,0x6e,0x69, -0x32,0x32,0x43,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x45,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x42,0x07,0x75,0x6e,0x69, -0x32,0x32,0x36,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x30,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x35,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x32,0x07,0x75,0x6e,0x69, -0x32,0x32,0x43,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x43,0x0a,0x6e,0x6f,0x74, -0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x45,0x32,0x09, -0x6e,0x6f,0x74,0x73,0x75,0x62,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x35,0x08,0x65,0x6d,0x70,0x74,0x79,0x73,0x65,0x74,0x0a,0x6c,0x6f,0x67,0x69,0x63,0x61,0x6c,0x61,0x6e,0x64,0x09,0x6c,0x6f,0x67,0x69,0x63,0x61,0x6c,0x6f,0x72,0x0c,0x69,0x6e,0x74,0x65,0x72,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x05,0x75,0x6e,0x69, -0x6f,0x6e,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x36,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x46,0x07,0x75,0x6e,0x69,0x32,0x33, -0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x32, -0x33,0x36,0x0c,0x72,0x65,0x66,0x6c,0x65,0x78,0x73,0x75,0x62,0x73,0x65,0x74,0x0e,0x72,0x65,0x66,0x6c,0x65,0x78,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x39,0x31,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x42,0x07,0x75, -0x6e,0x69,0x32,0x32,0x43,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x38,0x07,0x73,0x69,0x6d,0x69,0x6c,0x61,0x72,0x07,0x75, -0x6e,0x69,0x32,0x32,0x39,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x31,0x07,0x75, -0x6e,0x69,0x32,0x32,0x39,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x33,0x0c,0x70,0x72,0x6f,0x70,0x65,0x72,0x73,0x75,0x62,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x42,0x08,0x73,0x75,0x63,0x68,0x74,0x68,0x61,0x74,0x07,0x75,0x6e,0x69, -0x32,0x31,0x34,0x30,0x0e,0x70,0x72,0x6f,0x70,0x65,0x72,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x34,0x09,0x74,0x68,0x65,0x72,0x65,0x66,0x6f,0x72,0x65,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x42,0x09,0x75,0x6e, -0x69,0x76,0x65,0x72,0x73,0x61,0x6c,0x07,0x75,0x6e,0x69,0x32,0x32,0x46,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x42,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x38,0x07, -0x75,0x6e,0x69,0x32,0x32,0x39,0x36,0x0e,0x63,0x69,0x72,0x63,0x6c,0x65,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x39,0x0a,0x63,0x69,0x72,0x63,0x6c,0x65,0x70,0x6c,0x75,0x73,0x07,0x61,0x72,0x72,0x6f,0x77,0x75,0x70,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x37,0x0a,0x61,0x72,0x72,0x6f,0x77,0x72, -0x69,0x67,0x68,0x74,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x38,0x09,0x61,0x72,0x72,0x6f,0x77,0x64,0x6f,0x77,0x6e,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x39,0x09,0x61,0x72,0x72,0x6f,0x77,0x6c,0x65,0x66,0x74,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x36,0x09,0x61,0x72,0x72,0x6f,0x77,0x62,0x6f,0x74,0x68,0x09,0x61,0x72,0x72,0x6f,0x77, -0x75,0x70,0x64,0x6e,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x35,0x07,0x75,0x6e,0x69, -0x32,0x31,0x41,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x39,0x0a,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x75,0x70,0x0d, -0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x72,0x69,0x67,0x68,0x74,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x64,0x6f,0x77,0x6e,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x6c,0x65,0x66,0x74,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x62,0x6f,0x74,0x68,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x42,0x07,0x75,0x6e,0x69, -0x32,0x31,0x45,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x45,0x07,0x75,0x6e,0x69, -0x32,0x37,0x46,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,0x46,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x46,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x33,0x07,0x64,0x6e,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x35,0x07,0x75,0x6e,0x69, -0x32,0x35,0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x37,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x70,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x44,0x07,0x6c,0x66,0x62,0x6c,0x6f, -0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x39,0x07,0x72,0x74,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x37,0x07,0x75,0x6e,0x69,0x32,0x35, -0x39,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x46,0x07,0x6c,0x74,0x73,0x68,0x61, -0x64,0x65,0x05,0x73,0x68,0x61,0x64,0x65,0x07,0x64,0x6b,0x73,0x68,0x61,0x64,0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x46,0x06,0x63,0x69,0x72,0x63,0x6c,0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x36,0x07, -0x75,0x6e,0x69,0x32,0x35,0x43,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x45,0x0a,0x6f,0x70,0x65,0x6e,0x62,0x75,0x6c,0x6c,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x38,0x09,0x66,0x69,0x6c,0x6c,0x65, -0x64,0x62,0x6f,0x78,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x41,0x07,0x75,0x6e,0x69, -0x32,0x35,0x45,0x42,0x07,0x74,0x72,0x69,0x61,0x67,0x75,0x70,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x36,0x07,0x74,0x72,0x69,0x61,0x67,0x64,0x6e,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x44,0x07,0x75,0x6e,0x69, -0x32,0x35,0x43,0x31,0x07,0x74,0x72,0x69,0x61,0x67,0x72,0x74,0x07,0x74,0x72,0x69,0x61,0x67,0x6c,0x66,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x45,0x07,0x75,0x6e,0x69, -0x32,0x35,0x43,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x34,0x07,0x75,0x6e,0x69, -0x32,0x35,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x30,0x07,0x75,0x6e,0x69, -0x32,0x35,0x36,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x46,0x07,0x75,0x6e,0x69, -0x32,0x35,0x34,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x34,0x07,0x75,0x6e,0x69, -0x32,0x35,0x35,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x46,0x07,0x75,0x6e,0x69, -0x32,0x35,0x30,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x37,0x07,0x75,0x6e,0x69, -0x32,0x35,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x42,0x07,0x75,0x6e,0x69, -0x32,0x35,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x41,0x07,0x75,0x6e,0x69, -0x32,0x35,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x31,0x07,0x75,0x6e,0x69, -0x32,0x35,0x34,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x34,0x07,0x75,0x6e,0x69, -0x32,0x35,0x37,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x44,0x07,0x75,0x6e,0x69, -0x32,0x35,0x33,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x36,0x07,0x75,0x6e,0x69, -0x32,0x35,0x32,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x38,0x07,0x75,0x6e,0x69, -0x32,0x35,0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x36,0x07,0x75,0x6e,0x69, -0x32,0x35,0x34,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x42,0x07,0x75,0x6e,0x69, -0x32,0x35,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x46,0x07,0x75,0x6e,0x69, -0x32,0x35,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x36,0x07,0x75,0x6e,0x69, -0x32,0x33,0x34,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x41,0x07,0x75,0x6e,0x69, -0x32,0x33,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x36,0x07,0x75,0x6e,0x69, -0x32,0x33,0x34,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x34,0x07,0x75,0x6e,0x69, -0x32,0x33,0x35,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x43,0x07,0x75,0x6e,0x69, -0x32,0x33,0x36,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x38,0x07,0x75,0x6e,0x69, -0x32,0x33,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x31,0x07,0x75,0x6e,0x69, -0x32,0x33,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x46,0x07,0x75,0x6e,0x69, -0x32,0x33,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x35,0x07,0x75,0x6e,0x69, -0x32,0x33,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x36,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x35,0x07,0x75,0x6e,0x69, -0x32,0x37,0x31,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x36,0x12,0x61,0x63,0x6b,0x6e,0x6f,0x77,0x6c,0x65,0x64,0x67,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x10,0x62,0x61,0x63,0x6b,0x73,0x70,0x61,0x63,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x06,0x6d,0x69,0x6e,0x75,0x74,0x65,0x06,0x73,0x65,0x63,0x6f,0x6e,0x64,0x07,0x75, -0x6e,0x69,0x32,0x31,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x36,0x09,0x65,0x73,0x74,0x69,0x6d,0x61,0x74,0x65,0x64,0x0b,0x62,0x65,0x6c,0x6c,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x34,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x42,0x0d,0x63,0x61,0x6e,0x63,0x65,0x6c,0x63,0x6f,0x6e,0x74,0x72, -0x6f,0x6c,0x15,0x63,0x61,0x72,0x72,0x69,0x61,0x67,0x65,0x52,0x65,0x74,0x75,0x72,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x43, -0x15,0x64,0x61,0x74,0x61,0x4c,0x69,0x6e,0x6b,0x45,0x73,0x63,0x61,0x70,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0d,0x64,0x65,0x6c,0x65,0x74,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x18,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x46,0x6f,0x75,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x17,0x64,0x65, -0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x4f,0x6e,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x19,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x54,0x68,0x72,0x65,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x17,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x54,0x77,0x6f, -0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x41,0x12,0x65,0x6e,0x64,0x4f,0x66,0x4d,0x65,0x64,0x69,0x75,0x6d,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x10,0x65,0x6e,0x64,0x4f,0x66,0x54,0x65,0x78,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x18,0x65,0x6e,0x64,0x4f,0x66,0x54,0x72,0x61,0x6e,0x73,0x6d,0x69, -0x73,0x73,0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x1d,0x65,0x6e,0x64,0x4f,0x66,0x54,0x72,0x61,0x6e,0x73,0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0x42,0x6c,0x6f,0x63,0x6b,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x65,0x6e,0x71,0x75,0x69,0x72,0x79,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0d,0x65,0x73,0x63,0x61,0x70,0x65, -0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x14,0x66,0x69,0x6c,0x65,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0f,0x66,0x6f,0x72,0x6d,0x46,0x65,0x65,0x64,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x15,0x67,0x72,0x6f,0x75,0x70,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72, -0x6f,0x6c,0x1b,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x54,0x61,0x62,0x75,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x39,0x05,0x68,0x6f,0x75,0x73,0x65,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x42,0x07,0x75,0x6e,0x69, -0x32,0x33,0x32,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x46,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x43,0x45,0x0f,0x6c,0x69,0x6e,0x65,0x46,0x65,0x65,0x64,0x63,0x6f,0x6e, -0x74,0x72,0x6f,0x6c,0x1a,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,0x41,0x63,0x6b,0x6e,0x6f,0x77,0x6c,0x65,0x64,0x67,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x6e,0x65,0x77,0x6c,0x69,0x6e,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0b,0x6e,0x75,0x6c,0x6c,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33, -0x46,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x43,0x07,0x75,0x6e,0x69,0x32,0x42,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x35,0x16,0x72,0x65,0x63,0x6f,0x72,0x64,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f, -0x6c,0x0b,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x6d,0x65,0x6e,0x74,0x0e,0x73,0x68,0x69,0x66,0x74,0x49,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0f,0x73,0x68,0x69,0x66,0x74,0x4f,0x75,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0c,0x73,0x70,0x61,0x63,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x15,0x73,0x74,0x61,0x72,0x74,0x4f, -0x66,0x48,0x65,0x61,0x64,0x69,0x6e,0x67,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x12,0x73,0x74,0x61,0x72,0x74,0x4f,0x66,0x54,0x65,0x78,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x11,0x73,0x75,0x62,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x16,0x73,0x79,0x6e,0x63,0x68,0x72,0x6f,0x6e,0x6f,0x75,0x73, -0x49,0x64,0x6c,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x31,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x31,0x38,0x41,0x14,0x75,0x6e,0x69,0x74,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x19,0x76,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x54,0x61,0x62,0x75,0x6c,0x61,0x74, -0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x63,0x76,0x31,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x46,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x46,0x37,0x18,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76, -0x31,0x34,0x15,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x34,0x1d,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x34,0x1d,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64, -0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x27,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x19,0x61,0x6d,0x70, -0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x12,0x61,0x74,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x18,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69, -0x67,0x61,0x22,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x14,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x62,0x61,0x72,0x5f,0x68, -0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x17,0x62,0x61,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x62,0x61,0x72,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x15,0x62,0x61,0x72,0x5f,0x62,0x72,0x61,0x63,0x6b, -0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x0c,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x10,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x62, -0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x12,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0e, -0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72, -0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0e,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x13,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x11,0x70,0x6c,0x75,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10, -0x65,0x71,0x75,0x61,0x6c,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x17,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x10, -0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x18,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61, -0x12,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x65,0x71,0x75,0x61,0x6c,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c, -0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72, -0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x19,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x12,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f, -0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x67,0x72,0x65,0x61,0x74, -0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65, -0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70, -0x68,0x65,0x6e,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65,0x73,0x73, -0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x1e,0x6c,0x65,0x73,0x73,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12, -0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0d,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x11,0x6c,0x65,0x73,0x73, -0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x6c,0x65,0x73,0x73,0x5f,0x64, -0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x22,0x6c,0x65,0x73,0x73,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65, -0x6e,0x2e,0x6c,0x69,0x67,0x61,0x0e,0x6c,0x65,0x73,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x16,0x6c,0x65,0x73,0x73,0x5f,0x70,0x6c,0x75,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x6c,0x65,0x73, -0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1d,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e, -0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x11,0x6c,0x65,0x73,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c, -0x69,0x67,0x61,0x0e,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x6c,0x65, -0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61, -0x1c,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1f,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65, -0x73,0x73,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x16,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x61,0x73,0x63, -0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x74,0x2e,0x6c,0x69,0x67,0x61,0x17,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69, -0x67,0x61,0x22,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x16,0x61,0x73,0x63,0x69,0x69,0x63,0x69,0x72,0x63,0x75,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x15,0x65,0x71,0x75, -0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x1b,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x46,0x07,0x75, -0x6e,0x69,0x30,0x33,0x37,0x34,0x07,0x75,0x6e,0x69,0x30,0x33,0x37,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x43,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x41,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x38,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x37,0x09,0x67, -0x72,0x61,0x76,0x65,0x63,0x6f,0x6d,0x62,0x09,0x61,0x63,0x75,0x74,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x42,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x2e,0x61,0x6c,0x74,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x07,0x75, -0x6e,0x69,0x30,0x33,0x30,0x41,0x09,0x74,0x69,0x6c,0x64,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x0d,0x68,0x6f,0x6f,0x6b,0x61,0x62,0x6f,0x76,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x46,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x32,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x42,0x0c,0x64, -0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x38,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x36,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x37,0x07,0x75,0x6e,0x69,0x30, -0x33,0x33,0x38,0x0b,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x2e,0x61,0x6c,0x74,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x38,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x37,0x2e,0x63,0x61,0x73,0x65,0x0e,0x67,0x72,0x61,0x76,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0e,0x61,0x63,0x75,0x74,0x65,0x63,0x6f, -0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x42,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30, -0x33,0x30,0x41,0x2e,0x63,0x61,0x73,0x65,0x0e,0x74,0x69,0x6c,0x64,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x2e,0x63,0x61,0x73,0x65,0x12,0x68,0x6f,0x6f,0x6b,0x61,0x62,0x6f,0x76,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x46,0x2e, -0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x31,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x32,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x42,0x2e,0x63,0x61,0x73,0x65,0x11,0x64,0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e, -0x69,0x30,0x33,0x32,0x34,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x37,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x38,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x45,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75, -0x6e,0x69,0x30,0x33,0x33,0x31,0x2e,0x63,0x61,0x73,0x65,0x0d,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x61,0x73,0x65,0x0e,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x2e,0x63,0x61,0x73,0x65,0x0a,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x61,0x73,0x65,0x0a,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x61,0x73,0x65,0x11,0x68, -0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x2e,0x63,0x61,0x73,0x65,0x0f,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x61,0x73,0x65,0x0a,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x0a,0x62,0x72,0x65,0x76,0x65,0x2e,0x63,0x61,0x73,0x65,0x09,0x72,0x69,0x6e,0x67,0x2e,0x63,0x61,0x73,0x65, -0x0a,0x74,0x69,0x6c,0x64,0x65,0x2e,0x63,0x61,0x73,0x65,0x0b,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x05,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x74,0x6f,0x6e,0x6f,0x73,0x2e,0x63,0x61,0x73,0x65,0x0d,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0b,0x62,0x72,0x65,0x76,0x65,0x63,0x6f,0x6d,0x62, -0x63,0x79,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x31,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x39,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x33,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x31,0x0b,0x75, -0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x39,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x33,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x31,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x30,0x2e, -0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x39,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x33,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x31,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30, -0x33,0x30,0x30,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x39,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x33,0x2e,0x63,0x61,0x73,0x65,0x07,0x75,0x6e,0x69,0x45,0x30,0x41,0x30,0x07,0x75,0x6e,0x69,0x45,0x30,0x41,0x31,0x07,0x75,0x6e,0x69,0x45,0x30, -0x41,0x32,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x30,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x31,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x32,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x33,0x0e,0x69,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x64,0x6f,0x74,0x6c,0x65,0x73,0x73,0x10,0x69,0x64,0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x64,0x6f,0x74,0x6c,0x65, -0x73,0x73,0x04,0x4e,0x55,0x4c,0x4c,0x03,0x53,0x50,0x43,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x0f,0x00,0x01,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x02,0x00,0x4d,0x00,0x01,0x00,0x5d,0x00,0x01,0x00,0x5f,0x00,0x78,0x00,0x01,0x00,0x7a,0x00,0x7a,0x00,0x01,0x00,0x7c,0x00,0x86,0x00,0x01,0x00,0x89, -0x00,0xdd,0x00,0x01,0x00,0xe1,0x00,0xf2,0x00,0x01,0x00,0xf4,0x00,0xfc,0x00,0x01,0x00,0xfe,0x01,0x14,0x00,0x01,0x01,0x16,0x01,0x1f,0x00,0x01,0x01,0x21,0x01,0x3b,0x00,0x01,0x01,0x3d,0x01,0x49,0x00,0x01,0x01,0x4c,0x01,0x7c,0x00,0x01,0x01,0x7e,0x01,0xc2,0x00,0x01,0x01,0xc4,0x01,0xc5,0x00,0x01,0x01,0xc8,0x01,0xc8,0x00,0x01, -0x01,0xca,0x01,0xcc,0x00,0x01,0x01,0xcf,0x01,0xd6,0x00,0x01,0x01,0xd8,0x01,0xda,0x00,0x01,0x01,0xdc,0x01,0xe0,0x00,0x01,0x01,0xe2,0x01,0xe3,0x00,0x01,0x01,0xe9,0x01,0xea,0x00,0x01,0x01,0xed,0x01,0xf2,0x00,0x01,0x01,0xf4,0x01,0xf5,0x00,0x01,0x01,0xf7,0x01,0xfd,0x00,0x01,0x01,0xff,0x02,0x02,0x00,0x01,0x02,0x04,0x02,0x04, -0x00,0x01,0x02,0x06,0x02,0x0a,0x00,0x01,0x02,0x0c,0x02,0x0c,0x00,0x01,0x02,0x0f,0x02,0x10,0x00,0x01,0x02,0x13,0x02,0x1a,0x00,0x01,0x02,0x1e,0x02,0x1e,0x00,0x01,0x02,0x20,0x02,0x24,0x00,0x01,0x02,0x26,0x02,0x27,0x00,0x01,0x02,0x2e,0x02,0x2e,0x00,0x01,0x02,0x31,0x02,0x36,0x00,0x01,0x02,0x38,0x02,0x39,0x00,0x01,0x02,0x3b, -0x02,0x3b,0x00,0x01,0x02,0x3d,0x02,0x3d,0x00,0x01,0x02,0x40,0x02,0x46,0x00,0x01,0x02,0x48,0x02,0x49,0x00,0x01,0x02,0x4b,0x02,0x4f,0x00,0x01,0x02,0x51,0x02,0x53,0x00,0x01,0x02,0x55,0x02,0x57,0x00,0x01,0x02,0x59,0x02,0x5a,0x00,0x01,0x02,0x5c,0x02,0x5d,0x00,0x01,0x02,0x5f,0x02,0x5f,0x00,0x01,0x02,0x61,0x02,0x61,0x00,0x01, -0x02,0x63,0x02,0x64,0x00,0x01,0x02,0x66,0x02,0x66,0x00,0x01,0x02,0x69,0x02,0x6e,0x00,0x01,0x02,0x70,0x02,0x75,0x00,0x01,0x02,0x79,0x02,0x79,0x00,0x01,0x02,0x7b,0x02,0x7b,0x00,0x01,0x02,0x7d,0x02,0x7e,0x00,0x01,0x02,0x81,0x02,0x81,0x00,0x01,0x02,0x83,0x02,0x83,0x00,0x01,0x02,0x89,0x02,0x89,0x00,0x01,0x02,0x8b,0x02,0x8b, -0x00,0x01,0x02,0x8e,0x02,0x94,0x00,0x01,0x02,0x96,0x02,0x99,0x00,0x01,0x02,0x9c,0x02,0x9c,0x00,0x01,0x02,0xb0,0x02,0xb0,0x00,0x01,0x02,0xcc,0x02,0xcc,0x00,0x01,0x03,0xc3,0x03,0xc3,0x00,0x01,0x03,0xc7,0x03,0xc7,0x00,0x01,0x03,0xcd,0x03,0xcf,0x00,0x01,0x05,0x7d,0x05,0x7e,0x00,0x01,0x05,0xaa,0x05,0xaa,0x00,0x01,0x05,0xc5, -0x05,0xc5,0x00,0x01,0x05,0xd0,0x05,0xd0,0x00,0x01,0x05,0xeb,0x05,0xeb,0x00,0x01,0x05,0xed,0x05,0xed,0x00,0x01,0x06,0x05,0x06,0x06,0x00,0x02,0x06,0x68,0x06,0x7f,0x00,0x03,0x06,0x8d,0x06,0xa4,0x00,0x03,0x06,0xb3,0x06,0xc3,0x00,0x03,0x06,0xcb,0x06,0xcc,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x2a, -0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x0b,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x8d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa3,0x06,0xa4,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x76,0x00,0x00,0x06,0x8e,0x06,0x9c,0x00,0x0f,0x06,0xb3,0x06,0xc3,0x00,0x1e,0x00,0x01,0x00,0x03,0x06,0x6d,0x06,0x77,0x06,0x9d,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x24,0x00,0x0a,0x00,0x05,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x46,0x00,0x50,0x00,0x02,0x44,0x46,0x4c,0x54,0x00,0x1c,0x6c,0x61,0x74,0x6e,0x00,0x60,0x00,0x02,0x6d,0x61,0x72,0x6b,0x00,0x40,0x6d,0x6b,0x6d,0x6b,0x00,0x48,0x00,0x78,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x7e,0x00,0x04, -0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x86,0x00,0x00,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x88,0x00,0x01,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x8a,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x34,0x00,0x08,0x41,0x5a,0x45,0x20,0x00,0x34, -0x43,0x41,0x54,0x20,0x00,0x34,0x43,0x52,0x54,0x20,0x00,0x34,0x4b,0x41,0x5a,0x20,0x00,0x34,0x4d,0x4f,0x4c,0x20,0x00,0x34,0x52,0x4f,0x4d,0x20,0x00,0x34,0x54,0x41,0x54,0x20,0x00,0x34,0x54,0x52,0x4b,0x20,0x00,0x34,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x42,0x01,0x66,0x00,0x01,0x00,0x54,0x02,0xca, -0x00,0x01,0x00,0x56,0x04,0xc6,0x00,0x05,0x03,0xc0,0x06,0x68,0x00,0x01,0x00,0x8e,0x00,0x8e,0x00,0x01,0x00,0xc4,0x00,0x76,0x00,0x01,0x00,0x54,0x00,0x9c,0x00,0x01,0x01,0xe8,0x00,0xe6,0x00,0x01,0x00,0x12,0x00,0x1c,0x00,0x01,0x00,0x24,0x00,0x0c,0x00,0x02,0x1d,0x1e,0x1d,0x24,0x00,0x01,0x00,0x03,0x06,0x6d,0x06,0x77,0x06,0x9d, -0x00,0x01,0x00,0x02,0x06,0x77,0x06,0x9d,0x00,0x03,0x00,0x00,0x1d,0x12,0x00,0x00,0x1d,0x18,0x00,0x00,0x1d,0x1e,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x7f,0x00,0x00,0x06,0x8d,0x06,0xa4,0x00,0x18,0x06,0xb3,0x06,0xc3,0x00,0x30,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x76,0x00,0x00,0x06,0x8e,0x06,0x9c,0x00,0x0f,0x06,0xb3,0x06,0xc3, -0x00,0x1e,0x00,0x0b,0x1c,0xf0,0x1c,0xea,0x1c,0xf6,0x1c,0xfc,0x1c,0xf6,0x1c,0xf0,0x1c,0xf0,0x1c,0xf6,0x1c,0xfc,0x1d,0x02,0x1d,0x08,0x00,0x01,0x00,0x0b,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x8d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa3,0x06,0xa4,0x00,0x02,0x00,0x04,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e, -0x06,0x76,0x00,0x05,0x06,0x8e,0x06,0x9c,0x00,0x0e,0x06,0xb4,0x06,0xc3,0x00,0x1d,0x00,0x0b,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc0,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x2d, -0x1c,0x9e,0x1c,0x9e,0x1c,0xa4,0x1c,0xaa,0x1c,0xb0,0x1c,0xb6,0x1c,0xb6,0x1c,0xb6,0x1c,0xbc,0x1c,0xc2,0x1c,0xc8,0x1c,0xce,0x1c,0xd4,0x1c,0xda,0x1c,0xfe,0x1c,0xe0,0x1c,0xe6,0x1c,0xec,0x1c,0xf2,0x1d,0x16,0x1d,0x16,0x1d,0x16,0x1c,0xf8,0x1c,0xfe,0x1d,0x04,0x1d,0x0a,0x1d,0x10,0x1d,0x16,0x1d,0x1c,0x1d,0x22,0x1d,0x22,0x1d,0x28, -0x1d,0x40,0x1d,0x2e,0x1d,0x34,0x1d,0x3a,0x1d,0x40,0x1d,0x58,0x1d,0x58,0x1d,0x58,0x1d,0x58,0x1d,0x46,0x1d,0x4c,0x1d,0x52,0x1d,0x58,0x00,0x02,0x00,0x1b,0x00,0x60,0x00,0x74,0x00,0x00,0x00,0x78,0x00,0x78,0x00,0x15,0x00,0x8e,0x00,0x9d,0x00,0x16,0x00,0x9f,0x00,0xa0,0x00,0x26,0x00,0xbc,0x00,0xbc,0x00,0x28,0x00,0xdd,0x00,0xdd, -0x00,0x29,0x01,0x22,0x01,0x37,0x00,0x2a,0x01,0x3b,0x01,0x3b,0x00,0x40,0x01,0x4c,0x01,0x5d,0x00,0x41,0x01,0x64,0x01,0x65,0x00,0x53,0x01,0x67,0x01,0x68,0x00,0x55,0x01,0x84,0x01,0x88,0x00,0x57,0x01,0xb0,0x01,0xc2,0x00,0x5c,0x01,0xda,0x01,0xda,0x00,0x6f,0x02,0x02,0x02,0x02,0x00,0x70,0x02,0x1e,0x02,0x1e,0x00,0x71,0x02,0x46, -0x02,0x46,0x00,0x72,0x02,0x5f,0x02,0x5f,0x00,0x73,0x02,0x6d,0x02,0x6d,0x00,0x74,0x02,0x83,0x02,0x83,0x00,0x75,0x02,0x89,0x02,0x89,0x00,0x76,0x02,0x91,0x02,0x94,0x00,0x77,0x05,0xaa,0x05,0xaa,0x00,0x7b,0x05,0xc5,0x05,0xc5,0x00,0x7c,0x05,0xd0,0x05,0xd0,0x00,0x7d,0x05,0xeb,0x05,0xeb,0x00,0x7e,0x05,0xed,0x05,0xed,0x00,0x7f, -0x00,0x2f,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x5c,0x00,0x00,0x1c,0x62,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x68,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00, -0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x6e,0x00,0x00,0x1c,0x74,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x7a,0x00,0x00, -0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x80, -0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4, -0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce, -0x1b,0xce,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce, -0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xe0,0x1b,0xe0,0x1b,0xda,0x1b,0xe0, -0x00,0x41,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0x9c,0x00,0x00,0x1a,0xa2,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xa8,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x01, -0x1a,0xe4,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x03,0x19,0xd6,0x00,0x04,0x1a,0xea,0x00,0x04,0x1a,0xf0,0x00,0x04,0x1a,0xf6,0x00,0x02,0x19,0xd0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xae,0x00,0x00,0x1a,0xb4,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00, -0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x01,0x1a,0xc0,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x03,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02, -0x19,0xd6,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00, -0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x02,0x00,0x45,0x00,0x01,0x00,0x5d,0x00,0x00,0x00,0x5f,0x00,0x78,0x00,0x5d,0x00,0x7a,0x00,0x7a,0x00,0x77,0x00,0x7c,0x00,0x86,0x00,0x78,0x00,0x89,0x00,0xdd,0x00,0x83,0x00,0xe1,0x00,0xf2,0x00,0xd8,0x00,0xf4,0x00,0xfc,0x00,0xea,0x00,0xfe,0x01,0x14,0x00,0xf3,0x01,0x16,0x01,0x1f,0x01,0x0a, -0x01,0x21,0x01,0x3b,0x01,0x14,0x01,0x3d,0x01,0x49,0x01,0x2f,0x01,0x4c,0x01,0x7c,0x01,0x3c,0x01,0x7e,0x01,0xc2,0x01,0x6d,0x01,0xc4,0x01,0xc5,0x01,0xb2,0x01,0xc8,0x01,0xc8,0x01,0xb4,0x01,0xca,0x01,0xcc,0x01,0xb5,0x01,0xcf,0x01,0xd6,0x01,0xb8,0x01,0xd8,0x01,0xda,0x01,0xc0,0x01,0xdc,0x01,0xe0,0x01,0xc3,0x01,0xe2,0x01,0xe3, -0x01,0xc8,0x01,0xe9,0x01,0xea,0x01,0xca,0x01,0xed,0x01,0xf2,0x01,0xcc,0x01,0xf4,0x01,0xf5,0x01,0xd2,0x01,0xf7,0x01,0xfd,0x01,0xd4,0x01,0xff,0x02,0x02,0x01,0xdb,0x02,0x04,0x02,0x04,0x01,0xdf,0x02,0x06,0x02,0x0a,0x01,0xe0,0x02,0x0c,0x02,0x0c,0x01,0xe5,0x02,0x0f,0x02,0x10,0x01,0xe6,0x02,0x13,0x02,0x1a,0x01,0xe8,0x02,0x1e, -0x02,0x1e,0x01,0xf0,0x02,0x20,0x02,0x21,0x01,0xf1,0x02,0x23,0x02,0x24,0x01,0xf3,0x02,0x26,0x02,0x27,0x01,0xf5,0x02,0x2e,0x02,0x2e,0x01,0xf7,0x02,0x31,0x02,0x36,0x01,0xf8,0x02,0x38,0x02,0x39,0x01,0xfe,0x02,0x3b,0x02,0x3b,0x02,0x00,0x02,0x40,0x02,0x46,0x02,0x01,0x02,0x48,0x02,0x49,0x02,0x08,0x02,0x4b,0x02,0x4f,0x02,0x0a, -0x02,0x51,0x02,0x53,0x02,0x0f,0x02,0x55,0x02,0x57,0x02,0x12,0x02,0x59,0x02,0x5a,0x02,0x15,0x02,0x5c,0x02,0x5d,0x02,0x17,0x02,0x5f,0x02,0x5f,0x02,0x19,0x02,0x61,0x02,0x61,0x02,0x1a,0x02,0x63,0x02,0x64,0x02,0x1b,0x02,0x66,0x02,0x66,0x02,0x1d,0x02,0x69,0x02,0x6e,0x02,0x1e,0x02,0x70,0x02,0x75,0x02,0x24,0x02,0x79,0x02,0x79, -0x02,0x2a,0x02,0x7b,0x02,0x7b,0x02,0x2b,0x02,0x7d,0x02,0x7e,0x02,0x2c,0x02,0x81,0x02,0x81,0x02,0x2e,0x02,0x83,0x02,0x83,0x02,0x2f,0x02,0x89,0x02,0x89,0x02,0x30,0x02,0x8b,0x02,0x8b,0x02,0x31,0x02,0x8e,0x02,0x94,0x02,0x32,0x02,0x96,0x02,0x99,0x02,0x39,0x02,0x9c,0x02,0x9c,0x02,0x3d,0x02,0xb0,0x02,0xb0,0x02,0x3e,0x02,0xcc, -0x02,0xcc,0x02,0x3f,0x03,0xc3,0x03,0xc3,0x02,0x40,0x03,0xc7,0x03,0xc7,0x02,0x41,0x03,0xcd,0x03,0xcf,0x02,0x42,0x05,0x7d,0x05,0x7e,0x02,0x45,0x05,0xaa,0x05,0xaa,0x02,0x47,0x06,0xcb,0x06,0xcc,0x02,0x48,0x02,0x4a,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66, -0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44, -0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xd2,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x18,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xde,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00, -0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x08,0x00,0x00, -0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x54,0x00,0x00,0x1c,0x1a,0x00,0x00, -0x00,0x00,0x18,0x5a,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x5a,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x60,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66, -0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x66,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6, -0x1b,0xcc,0x00,0x00,0x18,0x6c,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x18,0x90,0x1b,0xcc,0x00,0x00,0x18,0x78,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x7e,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x84,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00, -0x18,0x8a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0xc0,0x00,0x00,0x18,0x90,0x1b,0xcc,0x00,0x00,0x18,0x96,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x9c,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0xa2,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00, -0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00, -0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x18,0xa8,0x00,0x00,0x00,0x00,0x19,0x20,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38, -0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x20,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8, -0x1b,0xd2,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x30,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, -0x18,0xb4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xba,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00, -0x18,0xc0,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00, -0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x54,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xd2, -0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1a,0xe8,0x1c,0x4a,0x1c,0x50,0x18,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xde,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xe4,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x1c,0x3e,0x1a,0xe8, -0x1c,0x4a,0x1c,0x50,0x19,0x26,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x14,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x4e,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xea,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x4e,0x1c,0x3e,0x1a,0xe8,0x1c,0x4a,0x1c,0x50,0x18,0xf0,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50, -0x18,0xf6,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xfc,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x02,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x1a,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x1c,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x1b,0xb4,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x1b,0xb4, -0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00, -0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38, -0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x1c,0x50,0x1c,0x38,0x19,0x0e,0x1c,0x44, -0x1c,0x4a,0x00,0x00,0x1b,0x54,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x66,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x66,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x19,0x26,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00, -0x19,0x14,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x54,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x19,0x26,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x14,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e, -0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x02,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x1a,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00, -0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38, -0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44, -0x00,0x00,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x19,0x20,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50, -0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00, -0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0xfe,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x2c,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x19,0x56,0x1b,0x6c, -0x00,0x00,0x19,0x2c,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x32,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x4a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x38,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a, -0x00,0x00,0x19,0x56,0x1b,0x6c,0x00,0x00,0x19,0x3e,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x44,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x4a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x50,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x02,0x00,0x00,0x19,0x56,0x1b,0x6c,0x00,0x00,0x19,0x5c,0x00,0x00,0x1c,0x1a, -0x1b,0x6c,0x00,0x00,0x19,0x62,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x68,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x6e,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x10,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x1b,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x74,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x7a,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x7a,0x00,0x00, -0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x80,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a, -0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x16,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0x1c,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x22,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x28,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea, -0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x86,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x8c,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00, -0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x98,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x9e,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0xa4,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x19,0xaa,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x84,0x00,0x00,0x1c,0x44,0x1c,0x68,0x00,0x00,0x1c,0x5c,0x00,0x00, -0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb0,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68, -0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x62,0x1c,0x68,0x00,0x00,0x19,0xbc,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xc2,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xc8,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xce,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x8a, -0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x19,0xd4,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x19,0xda,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xf8,0x00,0x00,0x1b,0xd2, -0x00,0x00,0x1c,0x50,0x19,0xe0,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x19,0xf8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x19,0xf8,0x00,0x00,0x19,0xe6,0x00,0x00,0x1c,0x50,0x19,0xec,0x00,0x00,0x1c,0x44,0x00,0x00,0x19,0xf2,0x19,0xf8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, -0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0xfe,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1a,0x04,0x00,0x00,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1a,0x10,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6, -0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xa8,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x16,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a, -0x1b,0xfc,0x1a,0x1c,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x22,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x28,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xea,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a,0x1b,0xfc,0x1a,0xf4,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0xfa, -0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x34,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x2e,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x34,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a,0x1b,0xfc,0x1a,0x3a,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x40,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x46,0x1b,0xf6,0x1c,0x44, -0x1c,0x4a,0x1b,0xfc,0x1b,0x06,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0x0c,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x1b,0xf6,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc, -0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x5a,0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xc4,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xca,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00, -0x1a,0x52,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xbe,0x00,0x00, -0x00,0x00,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x88,0x00,0x00,0x1b,0xfc,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xa8, -0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x5e,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x64,0x1b,0xf0,0x1c,0x44, -0x1c,0x4a,0x00,0x00,0x1a,0x6a,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x70,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00, -0x1b,0xa8,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xee,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1b,0x06,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x0c,0x1b,0xf0, -0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x12,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00, -0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae, -0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe2,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44, -0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x76,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00, -0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1a,0xb2,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00, -0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x88,0x00,0x00,0x1a,0x8e,0x1c,0x32,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00, -0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1a,0x94,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0x9c,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xa0,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xa6,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xb8, -0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xac,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1a,0xb2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44, -0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, -0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xc4,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xca,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00, -0x1a,0xdc,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe2,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00, -0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xa8,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xae, -0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xe8,0x1b,0x1e,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0xa8,0x1b,0xf0,0x1b,0x00, -0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xee,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0x06,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x0c,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00, -0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x12,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00, -0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00, -0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38, -0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44, -0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1b,0x5a,0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00, -0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x30,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x36,0x00,0x00, -0x1b,0x3c,0x00,0x00,0x00,0x00,0x1b,0x42,0x00,0x00,0x1c,0x0e,0x00,0x00,0x1b,0x48,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x5a, -0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1b,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44, -0x1c,0x4a,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x1b,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00, -0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68, -0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x8a,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x32,0x1b,0x96,0x00,0x00,0x1b,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xea,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xea,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x1b,0x9c,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, -0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00, -0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00, -0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38, -0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44, -0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, -0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf0, -0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00, -0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x1c,0x0e,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38, -0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x5c,0x00,0x00,0x1c,0x56, -0x1c,0x68,0x00,0x00,0x1c,0x5c,0x00,0x00,0x1c,0x62,0x1c,0x68,0x00,0x00,0x00,0x01,0xff,0xb4,0x02,0x94,0x00,0x01,0xff,0xba,0x03,0x48,0x00,0x01,0xff,0x51,0x02,0x26,0x00,0x01,0xff,0x04,0x02,0x26,0x00,0x01,0xff,0x07,0x02,0xda,0x00,0x01,0xfe,0xd4,0xff,0x06,0x00,0x01,0xfe,0xd4,0xff,0x2b,0x00,0x01,0xfe,0xca,0xff,0x10,0x00,0x01, -0xfe,0xdb,0xff,0x35,0x00,0x01,0xfe,0xd4,0xff,0x10,0x00,0x01,0xfe,0xd4,0xff,0x3d,0x00,0x01,0xfe,0xca,0x00,0x00,0x00,0x01,0xfe,0xd4,0x00,0x00,0x00,0x01,0xfe,0xd4,0x03,0x09,0x00,0x01,0xfe,0xb3,0x03,0x11,0x00,0x01,0xfe,0xf5,0x03,0x11,0x00,0x01,0xfe,0xf9,0x03,0x11,0x00,0x01,0xfe,0xd4,0x03,0x11,0x00,0x01,0xfe,0xd4,0x03,0x44, -0x00,0x01,0xfe,0xd4,0x03,0x0c,0x00,0x01,0xfe,0xd4,0x02,0xe9,0x00,0x01,0xfe,0xd9,0x03,0x39,0x00,0x01,0xfe,0xae,0x03,0x11,0x00,0x01,0xfe,0xe0,0x03,0x70,0x00,0x01,0xfe,0xd4,0x03,0xb0,0x00,0x01,0xfe,0xb3,0x03,0xb6,0x00,0x01,0xfe,0xf5,0x03,0xb6,0x00,0x01,0xfe,0xf9,0x03,0xb6,0x00,0x01,0xfe,0xd4,0x03,0xe2,0x00,0x01,0xfe,0xd4, -0x03,0xb1,0x00,0x01,0xfe,0xd4,0x03,0x93,0x00,0x01,0xfe,0xd6,0x03,0xd4,0x00,0x01,0xfe,0xae,0x03,0xb6,0x00,0x01,0xfe,0xd4,0x03,0xb6,0x00,0x01,0xfe,0xd9,0x03,0xfc,0x00,0x01,0xfe,0xd4,0x03,0x7a,0x00,0x01,0xfe,0xd4,0x03,0xa2,0x00,0x01,0xff,0x1c,0x03,0x84,0x00,0x01,0xfe,0xf4,0x03,0x84,0x00,0x01,0xfe,0xf7,0x03,0xa2,0x00,0x01, -0xfe,0xd4,0x03,0xa0,0x00,0x01,0xff,0x17,0x03,0xfc,0x00,0x01,0xfe,0xf2,0x03,0xfc,0x00,0x01,0xfe,0xf7,0x03,0xfc,0x00,0x01,0xfe,0xd4,0x03,0xfc,0x00,0x01,0xfe,0xde,0x02,0x26,0x00,0x01,0xfe,0xca,0x02,0x26,0x00,0x01,0xfe,0xb6,0x02,0xda,0x00,0x01,0xfe,0xde,0x02,0xda,0x00,0x01,0xfe,0xca,0x02,0xda,0x00,0x01,0xfe,0xd4,0x02,0x26, -0x00,0x01,0xfe,0xd4,0x02,0xda,0x00,0x01,0x01,0x63,0x02,0x6d,0x00,0x01,0x02,0x44,0x02,0x26,0x00,0x01,0x02,0x44,0x02,0xda,0x00,0x01,0x02,0x44,0x04,0x65,0x00,0x01,0x03,0x0c,0x02,0xda,0x00,0x01,0xfe,0xec,0x02,0x26,0x00,0x01,0xfe,0xd4,0x01,0x45,0x00,0x01,0xfe,0xd4,0x01,0x18,0x00,0x01,0xfe,0xd4,0x01,0x13,0x00,0x01,0x01,0x5c, -0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0xb0,0x00,0x01,0x01,0x61,0x03,0xb6,0x00,0x01,0x01,0x79,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xb6,0x00,0x01,0x01,0x54,0x03,0xfc,0x00,0x01,0x01,0x59,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xb0,0x00,0x01,0x01,0x36,0xff,0x2b,0x00,0x01, -0x01,0x0b,0x03,0xb6,0x00,0x01,0x01,0x38,0x03,0xd4,0x00,0x01,0x01,0x36,0x03,0x93,0x00,0x01,0x01,0x26,0xff,0x10,0x00,0x01,0x01,0x30,0x00,0x00,0x00,0x01,0x01,0xc2,0x03,0xb6,0x00,0x01,0x00,0xda,0x03,0xb6,0x00,0x01,0x01,0x4a,0xff,0x10,0x00,0x01,0x00,0xaf,0x02,0xda,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x01,0x6f,0x03,0xfc, -0x00,0x01,0x01,0x4a,0x03,0xfc,0x00,0x01,0x01,0x4f,0x03,0xfc,0x00,0x01,0x01,0x2c,0x03,0xfc,0x00,0x01,0x01,0x4d,0x03,0xb6,0x00,0x01,0x00,0xf7,0x03,0xb6,0x00,0x01,0x01,0x24,0x03,0xd4,0x00,0x01,0x01,0x22,0x03,0xb1,0x00,0x01,0x01,0x51,0x03,0xb6,0x00,0x01,0x01,0x2c,0x03,0xe2,0x00,0x01,0x01,0x81,0x02,0xda,0x00,0x01,0x01,0x2e, -0x03,0xd4,0x00,0x01,0x01,0x2c,0x03,0x93,0x00,0x01,0x01,0x2c,0x03,0xb0,0x00,0x01,0x01,0x01,0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0x7a,0x00,0x01,0x01,0x31,0x03,0xa2,0x00,0x01,0x01,0x79,0x03,0x84,0x00,0x01,0x01,0x51,0x03,0x84,0x00,0x01,0x01,0x54,0x03,0xa2,0x00,0x01,0x01,0x31,0x03,0xa0,0x00,0x01,0x01,0x31,0x03,0x09,0x00,0x01, -0x01,0x31,0xff,0x2b,0x00,0x01,0x01,0x06,0x03,0x11,0x00,0x01,0x01,0x36,0x03,0x39,0x00,0x01,0x01,0x31,0x02,0xe9,0x00,0x01,0x01,0x31,0x03,0x44,0x00,0x01,0x01,0x5f,0x03,0x11,0x00,0x01,0x01,0x34,0x03,0x11,0x00,0x01,0x01,0x34,0x03,0x09,0x00,0x01,0x01,0x29,0x02,0x26,0x00,0x01,0x01,0x54,0x03,0x11,0x00,0x01,0x01,0x29,0x03,0x11, -0x00,0x01,0x01,0x35,0x03,0x70,0x00,0x01,0x01,0x29,0x03,0x09,0x00,0x01,0x00,0x89,0x02,0xda,0x00,0x01,0x00,0x89,0x03,0xc5,0x00,0x01,0x01,0x66,0x03,0x11,0x00,0x01,0x01,0x3b,0x03,0x11,0x00,0x01,0x01,0x10,0x03,0x11,0x00,0x01,0x01,0x40,0x03,0x39,0x00,0x01,0x01,0x3b,0x02,0xe9,0x00,0x01,0x01,0x3b,0x03,0x0c,0x00,0x01,0x01,0x7c, -0x02,0x26,0x00,0x01,0x01,0x7c,0x03,0x11,0x00,0x01,0x01,0x1b,0x03,0xb6,0x00,0x01,0x01,0x36,0xff,0x10,0x00,0x01,0x00,0xdc,0x02,0xda,0x00,0x01,0x01,0x18,0x01,0x6d,0x00,0x01,0x00,0xf0,0x02,0xda,0x00,0x01,0x01,0x5c,0x03,0x11,0x00,0x01,0x00,0x5a,0x02,0x85,0x00,0x01,0x01,0x31,0x03,0x11,0x00,0x01,0x01,0x31,0x03,0x0c,0x00,0x01, -0x01,0x74,0x03,0x84,0x00,0x01,0x01,0x4c,0x03,0x84,0x00,0x01,0x01,0x4f,0x03,0xa2,0x00,0x01,0x01,0x2c,0x03,0xa0,0x00,0x01,0x01,0x4d,0x03,0x11,0x00,0x01,0x01,0x22,0x02,0x26,0x00,0x01,0x00,0xf7,0x03,0x11,0x00,0x01,0x01,0x27,0x03,0x39,0x00,0x01,0x01,0x22,0x03,0x0c,0x00,0x01,0x00,0x91,0x00,0x00,0x00,0x01,0x00,0x87,0xff,0x10, -0x00,0x01,0x00,0xfa,0x02,0xc1,0x00,0x01,0x01,0x57,0x03,0xf4,0x00,0x01,0x01,0x2c,0x03,0xf4,0x00,0x01,0x01,0x01,0x03,0xf4,0x00,0x01,0x01,0x2c,0x03,0xcc,0x00,0x01,0x01,0x48,0x03,0xb6,0x00,0x01,0x01,0x1d,0x02,0xda,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x01,0x5e,0xff,0x10,0x00,0x01,0x01,0x13,0x01,0x13,0x00,0x01,0x01,0x38, -0x03,0x70,0x00,0x01,0x01,0x2c,0xfe,0xf2,0x00,0x01,0x01,0xb7,0x02,0x26,0x00,0x01,0x01,0xb7,0x03,0x11,0x00,0x01,0x01,0x25,0x03,0xb6,0x00,0x01,0x01,0x27,0xff,0x10,0x00,0x01,0x00,0xfa,0x02,0xda,0x00,0x01,0x01,0x22,0xff,0x10,0x00,0x01,0x01,0x6b,0x03,0x11,0x00,0x01,0x01,0x40,0x03,0x11,0x00,0x01,0x00,0xf5,0x00,0x00,0x00,0x01, -0x01,0x40,0x02,0x26,0x00,0x01,0x00,0xe6,0xff,0x10,0x00,0x01,0x01,0xcc,0xff,0x2b,0x00,0x01,0x01,0x2c,0xff,0x2b,0x00,0x01,0x01,0x2b,0xff,0x2b,0x00,0x01,0x01,0x01,0x03,0x11,0x00,0x01,0x01,0x31,0x03,0x39,0x00,0x01,0x01,0x2b,0x00,0x00,0x00,0x01,0x01,0x51,0x03,0x11,0x00,0x01,0x01,0x2c,0x02,0xe9,0x00,0x01,0x01,0x2c,0x03,0x44, -0x00,0x01,0x01,0x2c,0x03,0x0c,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01,0x01,0x6b,0x03,0xb6,0x00,0x01,0x01,0x36,0x03,0xb1,0x00,0x01,0x01,0xc2,0x02,0xda,0x00,0x01,0x01,0x21,0x02,0xda,0x00,0x01,0x01,0x21,0x00,0x00,0x00,0x01,0x01,0x28,0x02,0xda,0x00,0x01,0x01,0x28,0x01,0x6d,0x00,0x01,0x01,0x22,0x02,0xda,0x00,0x01,0x01,0x57, -0x03,0xb6,0x00,0x01,0x01,0x27,0x02,0xda,0x00,0x01,0x01,0x27,0x00,0x00,0x00,0x01,0x01,0x2c,0x03,0xb6,0x00,0x01,0x01,0xd1,0x00,0x00,0x00,0x01,0x01,0x4a,0x02,0x26,0x00,0x01,0x01,0x75,0x03,0x11,0x00,0x01,0x01,0x5a,0x03,0x11,0x00,0x01,0x01,0x3b,0x03,0x09,0x00,0x01,0x01,0x7c,0x03,0x09,0x00,0x01,0x01,0x4f,0x02,0x26,0x00,0x01, -0x00,0xfa,0x02,0x26,0x00,0x01,0x01,0xb7,0x03,0x09,0x00,0x01,0x01,0x27,0xfe,0xf2,0x00,0x01,0x01,0x57,0x03,0x11,0x00,0x01,0x01,0x2c,0x03,0x11,0x00,0x01,0x01,0x40,0x02,0xda,0x00,0x01,0x01,0xf4,0x00,0x00,0x00,0x01,0x01,0x36,0x02,0xda,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0x40,0x00,0x00, -0x00,0x01,0x01,0x2c,0x03,0xb1,0x00,0x01,0x01,0x2f,0x02,0x26,0x00,0x01,0x01,0x27,0x03,0x09,0x00,0x01,0x01,0x2c,0x03,0x09,0x00,0x01,0x01,0xa4,0x02,0x26,0x00,0x01,0x01,0x4c,0x02,0x26,0x00,0x01,0x01,0x2c,0x01,0x13,0x00,0x01,0x01,0x31,0x02,0x26,0x00,0x01,0x01,0x28,0x02,0x26,0x00,0x01,0x01,0x28,0x00,0x00,0x00,0x01,0x01,0x31, -0x02,0xda,0x00,0x01,0x01,0x31,0x00,0x00,0x00,0x01,0x01,0x34,0x02,0x26,0x00,0x01,0x01,0x34,0x00,0x00,0x00,0x01,0x01,0x27,0x02,0x26,0x00,0x01,0x01,0x2c,0x02,0x26,0x00,0x01,0x01,0x2c,0x02,0xda,0x00,0x01,0x01,0x40,0x02,0xbc,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x01,0x5e,0x00,0x00,0x00,0x01,0x01,0x2c,0x01,0x6d,0x00,0x01, -0x01,0x3b,0x00,0x00,0x00,0x01,0x01,0x3b,0x02,0x26,0x00,0x01,0x01,0x3b,0xff,0x2b,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x18,0x01,0x1c,0x00,0x02,0x44,0x46,0x4c,0x54,0x04,0xac,0x6c,0x61,0x74,0x6e,0x04,0xb0,0x00,0x2b,0x61,0x61,0x6c,0x74,0x05,0xb4,0x63,0x61,0x6c,0x74,0x05,0xe4,0x63,0x61, -0x73,0x65,0x04,0xd6,0x63,0x63,0x6d,0x70,0x05,0xc4,0x63,0x63,0x6d,0x70,0x05,0xd8,0x63,0x76,0x30,0x31,0x04,0xdc,0x63,0x76,0x30,0x32,0x04,0xe2,0x63,0x76,0x30,0x33,0x04,0xe8,0x63,0x76,0x30,0x34,0x04,0xee,0x63,0x76,0x30,0x35,0x04,0xf4,0x63,0x76,0x30,0x36,0x04,0xfa,0x63,0x76,0x30,0x37,0x05,0x00,0x63,0x76,0x30,0x38,0x05,0x06, -0x63,0x76,0x30,0x39,0x05,0x0c,0x63,0x76,0x31,0x30,0x05,0x12,0x63,0x76,0x31,0x31,0x05,0x18,0x63,0x76,0x31,0x32,0x05,0x1e,0x63,0x76,0x31,0x34,0x05,0x24,0x63,0x76,0x31,0x35,0x05,0x2a,0x63,0x76,0x31,0x36,0x05,0x30,0x63,0x76,0x31,0x37,0x05,0x36,0x63,0x76,0x31,0x38,0x05,0x3c,0x63,0x76,0x31,0x39,0x05,0x42,0x63,0x76,0x32,0x30, -0x05,0x48,0x63,0x76,0x39,0x39,0x05,0x4e,0x66,0x72,0x61,0x63,0x05,0xce,0x6c,0x6f,0x63,0x6c,0x05,0x54,0x6c,0x6f,0x63,0x6c,0x05,0x5a,0x6c,0x6f,0x63,0x6c,0x05,0x60,0x6c,0x6f,0x63,0x6c,0x05,0x66,0x6c,0x6f,0x63,0x6c,0x05,0x6c,0x6c,0x6f,0x63,0x6c,0x05,0x72,0x6c,0x6f,0x63,0x6c,0x05,0x78,0x6c,0x6f,0x63,0x6c,0x05,0x7e,0x6f,0x72, -0x64,0x6e,0x05,0xbc,0x73,0x69,0x6e,0x66,0x05,0x84,0x73,0x73,0x30,0x31,0x05,0x8a,0x73,0x73,0x30,0x32,0x05,0x90,0x73,0x73,0x31,0x39,0x05,0x96,0x73,0x73,0x32,0x30,0x05,0x9c,0x73,0x75,0x62,0x73,0x05,0xa2,0x73,0x75,0x70,0x73,0x05,0xa8,0x7a,0x65,0x72,0x6f,0x05,0xae,0x01,0xcc,0x06,0x18,0x06,0x20,0x06,0x28,0x06,0x30,0x06,0x38, -0x06,0x40,0x06,0x40,0x06,0x48,0x06,0x50,0x06,0x58,0x06,0x60,0x06,0x68,0x06,0x70,0x06,0x78,0x06,0x80,0x06,0x88,0x06,0x90,0x06,0x98,0x06,0xa0,0x06,0xa8,0x06,0xb0,0x0a,0x90,0x06,0xb8,0x06,0xc0,0x0a,0x90,0x06,0xc8,0x06,0xd0,0x0c,0x60,0x06,0xd8,0x06,0xe0,0x06,0xe8,0x06,0xf0,0x06,0xf8,0x07,0x00,0x07,0x28,0x07,0x08,0x07,0x10, -0x07,0x28,0x07,0x28,0x07,0x18,0x07,0x20,0x07,0x28,0x07,0x28,0x07,0x28,0x07,0x30,0x07,0x38,0x07,0x40,0x07,0x48,0x07,0x50,0x07,0x58,0x07,0x60,0x07,0x68,0x07,0x70,0x07,0x78,0x11,0xb0,0x07,0x80,0x11,0xba,0x07,0x88,0x07,0x90,0x07,0x98,0x07,0xd0,0x07,0xa0,0x07,0xa8,0x07,0xd0,0x07,0xd0,0x07,0xb0,0x07,0xb8,0x07,0xc0,0x07,0xc8, -0x07,0xd0,0x07,0xd8,0x07,0xe0,0x0d,0x70,0x07,0xe8,0x07,0xf0,0x07,0xf8,0x08,0x00,0x08,0x28,0x08,0x08,0x08,0x10,0x08,0x18,0x08,0x20,0x08,0x28,0x08,0x28,0x08,0x30,0x08,0x38,0x08,0x50,0x08,0x40,0x08,0x48,0x08,0x50,0x08,0x50,0x08,0x58,0x08,0x60,0x08,0x68,0x08,0x70,0x08,0x98,0x08,0x78,0x08,0x80,0x08,0x98,0x08,0x98,0x08,0x88, -0x08,0x90,0x08,0x98,0x08,0xa0,0x08,0xa8,0x0c,0x60,0x08,0xb0,0x08,0xb8,0x0e,0x40,0x08,0xc0,0x08,0xc8,0x08,0xd0,0x08,0xd8,0x0c,0x60,0x08,0xe0,0x08,0xe8,0x08,0xf0,0x08,0xf8,0x09,0x00,0x09,0x08,0x0e,0x40,0x09,0x10,0x09,0x18,0x0e,0x40,0x09,0x20,0x09,0x28,0x0e,0x40,0x0e,0x40,0x09,0x30,0x09,0x38,0x0e,0x40,0x09,0x40,0x09,0x48, -0x09,0x50,0x09,0x58,0x09,0x60,0x09,0x68,0x0c,0x28,0x0c,0x28,0x09,0x70,0x09,0x78,0x0c,0x28,0x09,0x80,0x09,0x88,0x09,0x90,0x09,0x98,0x09,0xa0,0x09,0xa8,0x0d,0xd8,0x09,0xb0,0x09,0xb8,0x0c,0x60,0x09,0xc0,0x09,0xc8,0x09,0xd0,0x09,0xd8,0x0d,0xd8,0x09,0xe0,0x09,0xe8,0x0d,0xd8,0x0d,0xd8,0x09,0xf0,0x09,0xf8,0x0a,0x00,0x0a,0x08, -0x0a,0x10,0x0a,0x18,0x0a,0x20,0x0a,0x28,0x0a,0x30,0x0a,0x38,0x0e,0x40,0x0a,0x40,0x0a,0x48,0x0d,0x70,0x0a,0x50,0x0a,0x58,0x0a,0x60,0x0a,0x68,0x0d,0x18,0x0a,0x70,0x0a,0x78,0x0a,0x80,0x0a,0x88,0x0a,0x90,0x0a,0x98,0x0a,0xa0,0x0d,0x70,0x0a,0xa8,0x0a,0xb0,0x0d,0x70,0x0a,0xb8,0x0a,0xc0,0x0a,0xc8,0x0a,0xd0,0x0d,0x70,0x0a,0xd8, -0x0a,0xe0,0x0d,0x70,0x0d,0x70,0x0a,0xe8,0x0a,0xf0,0x0d,0x70,0x0a,0xf8,0x0b,0x00,0x0b,0x08,0x0b,0x10,0x0b,0x18,0x0b,0x20,0x0b,0x28,0x0b,0x30,0x0b,0xa0,0x0b,0x38,0x0b,0x40,0x0b,0x58,0x0b,0x48,0x0b,0x50,0x0b,0x58,0x0b,0x58,0x0b,0x60,0x0b,0x68,0x0b,0xa0,0x0b,0xa0,0x0b,0x70,0x0b,0x78,0x0b,0x80,0x0b,0x88,0x0b,0x90,0x0b,0x98, -0x0b,0xa0,0x0b,0xa8,0x0b,0xb0,0x0c,0x28,0x0c,0x28,0x0b,0xb8,0x0b,0xc0,0x0c,0x28,0x0b,0xc8,0x0b,0xd0,0x0b,0xd8,0x0b,0xe0,0x0c,0x28,0x0b,0xe8,0x0b,0xf0,0x0c,0x28,0x0b,0xf8,0x0c,0x00,0x0c,0x08,0x0c,0x10,0x0c,0x18,0x0c,0x20,0x0c,0x28,0x0c,0x30,0x0c,0x38,0x0c,0x60,0x0c,0x40,0x0c,0x48,0x0c,0x60,0x0c,0x50,0x0c,0x58,0x0c,0x60, -0x0c,0x60,0x0c,0x68,0x0c,0x70,0x0c,0x88,0x0c,0x78,0x0c,0x80,0x0c,0x88,0x0c,0x88,0x0c,0x90,0x0c,0x98,0x0c,0xa0,0x0c,0xa8,0x0c,0xb0,0x0c,0xb8,0x0c,0xc0,0x0c,0xc8,0x0c,0xf0,0x0c,0xd0,0x0c,0xd8,0x0c,0xe0,0x0c,0xe8,0x0c,0xf0,0x0c,0xf0,0x0c,0xf8,0x0d,0x00,0x0d,0x08,0x0d,0x10,0x0d,0x18,0x0d,0x20,0x0d,0x28,0x0d,0x70,0x0d,0x30, -0x0d,0x38,0x0e,0x40,0x0d,0x40,0x0d,0x48,0x0e,0x40,0x0d,0x50,0x0d,0x58,0x0d,0x70,0x0d,0x60,0x0d,0x68,0x0d,0x70,0x0d,0x78,0x0d,0x80,0x0d,0xd8,0x0d,0x88,0x0d,0x90,0x0d,0xd8,0x0d,0x98,0x0d,0xa0,0x0d,0xd8,0x0d,0xa8,0x0d,0xb0,0x0d,0xd8,0x0d,0xb8,0x0d,0xc0,0x0d,0xc8,0x0d,0xd0,0x0d,0xd8,0x0d,0xe0,0x0d,0xe8,0x0d,0xf0,0x0d,0xf8, -0x0e,0xb8,0x0e,0x00,0x0e,0x08,0x0e,0x10,0x0e,0x18,0x0e,0x20,0x0e,0x28,0x0e,0x40,0x0e,0x30,0x0e,0x38,0x0e,0x40,0x0e,0x48,0x0e,0x50,0x0e,0x58,0x0e,0x60,0x0e,0x68,0x0e,0x70,0x0e,0x78,0x0e,0x80,0x0e,0x88,0x0e,0x90,0x0e,0xb8,0x0e,0x98,0x0e,0xa0,0x0e,0xa8,0x0e,0xb0,0x0e,0xb8,0x0e,0xc0,0x0e,0xc8,0x0e,0xd0,0x0e,0xd8,0x0e,0xe0, -0x0e,0xe8,0x0e,0xf0,0x0e,0xf8,0x0f,0x00,0x0f,0x08,0x0f,0x10,0x0f,0x18,0x0f,0x20,0x0f,0x28,0x0f,0x30,0x0f,0x38,0x0f,0x40,0x0f,0x48,0x0f,0x50,0x0f,0x58,0x0f,0x60,0x0f,0x68,0x0f,0x70,0x0f,0x78,0x0f,0x80,0x0f,0x88,0x0f,0x90,0x0f,0x98,0x0f,0xa0,0x0f,0xa8,0x0f,0xb0,0x0f,0xb8,0x0f,0xc0,0x0f,0xc8,0x0f,0xd0,0x0f,0xd8,0x0f,0xe0, -0x0f,0xe8,0x0f,0xf0,0x0f,0xf8,0x10,0x00,0x10,0x08,0x10,0x10,0x10,0x18,0x10,0x20,0x10,0x28,0x10,0x30,0x10,0x38,0x10,0x40,0x10,0x48,0x10,0x50,0x10,0x58,0x11,0xd8,0x10,0x60,0x10,0x60,0x10,0x68,0x10,0x70,0x10,0x70,0x10,0x78,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x88,0x10,0x88,0x10,0x90,0x10,0xa0,0x10,0x98, -0x10,0xa0,0x10,0xa0,0x10,0xa8,0x10,0xa8,0x10,0xb0,0x10,0xb8,0x10,0xc0,0x11,0xc4,0x10,0xc8,0x10,0xc8,0x11,0xce,0x10,0xd0,0x10,0xd8,0x10,0xe0,0x10,0xe8,0x10,0xf0,0x10,0xf8,0x11,0x00,0x11,0x08,0x11,0x10,0x11,0x18,0x11,0x20,0x11,0x28,0x11,0x30,0x11,0x38,0x11,0x40,0x11,0x48,0x11,0x50,0x11,0x58,0x11,0x60,0x11,0x68,0x11,0x70, -0x11,0x78,0x11,0x80,0x11,0x88,0x11,0x90,0x11,0x98,0x11,0xa0,0x11,0xa8,0x0e,0x4c,0x00,0x00,0x0e,0x92,0x00,0x08,0x41,0x5a,0x45,0x20,0x0e,0xdc,0x43,0x41,0x54,0x20,0x0f,0x28,0x43,0x52,0x54,0x20,0x0f,0x74,0x4b,0x41,0x5a,0x20,0x0f,0xc0,0x4d,0x4f,0x4c,0x20,0x10,0x0c,0x52,0x4f,0x4d,0x20,0x10,0x58,0x54,0x41,0x54,0x20,0x10,0xa4, -0x54,0x52,0x4b,0x20,0x10,0xf0,0x00,0x00,0x00,0x01,0x01,0xb2,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0xb9,0x00,0x00,0x00,0x01,0x01,0xba,0x00,0x00,0x00,0x01,0x01,0xbb,0x00,0x00,0x00,0x01,0x01,0xbc,0x00,0x00,0x00,0x01,0x01,0xbd,0x00,0x00,0x00,0x01,0x01,0xbe,0x00,0x00,0x00,0x01,0x01,0xbf,0x00,0x00,0x00,0x01, -0x01,0xc0,0x00,0x00,0x00,0x01,0x01,0xc1,0x00,0x00,0x00,0x01,0x01,0xc2,0x00,0x00,0x00,0x01,0x01,0xc3,0x00,0x00,0x00,0x01,0x01,0xc4,0x00,0x00,0x00,0x01,0x01,0xc5,0x00,0x00,0x00,0x01,0x01,0xc6,0x00,0x00,0x00,0x01,0x01,0xc7,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x01,0xc9,0x00,0x00,0x00,0x01,0x01,0xca,0x00,0x00, -0x00,0x01,0x01,0xcb,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x01,0xa2,0x00,0x00,0x00,0x01,0x01,0x9c,0x00,0x00,0x00,0x01,0x01,0x9d,0x00,0x00,0x00,0x01,0x01,0xa1,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x01,0x9e,0x00,0x00,0x00,0x01,0x01,0x9f,0x00,0x00,0x00,0x01,0x01,0xa8,0x10,0x54,0x00,0x01,0x01,0xb4, -0x10,0x52,0x00,0x01,0x01,0xb5,0x10,0x50,0x00,0x01,0x01,0xb6,0x10,0x4e,0x00,0x01,0x01,0xb7,0x00,0x00,0x00,0x01,0x01,0xa7,0x00,0x00,0x00,0x01,0x01,0xa9,0x00,0x00,0x00,0x01,0x01,0xb3,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x01,0xaf,0x01,0xb1,0x00,0x00,0x00,0x03,0x01,0x94,0x01,0x97,0x01,0x9a,0x00,0x00, -0x00,0x03,0x01,0xaa,0x01,0xab,0x01,0xac,0x00,0x00,0x00,0x04,0x01,0x94,0x01,0x97,0x01,0x9a,0x01,0x9a,0x00,0x00,0x00,0x9a,0x00,0x02,0x00,0x04,0x00,0x07,0x00,0x0a,0x00,0x0d,0x00,0x10,0x00,0x13,0x00,0x16,0x00,0x19,0x00,0x1c,0x00,0x1e,0x00,0x20,0x00,0x23,0x00,0x27,0x00,0x2c,0x00,0x2e,0x00,0x30,0x00,0x32,0x00,0x34,0x00,0x36, -0x00,0x38,0x00,0x3a,0x00,0x3d,0x00,0x41,0x00,0x43,0x00,0x46,0x00,0x49,0x00,0x4b,0x00,0x4e,0x00,0x50,0x00,0x54,0x00,0x57,0x00,0x5b,0x00,0x5d,0x00,0x60,0x00,0x64,0x00,0x67,0x00,0x6a,0x00,0x6d,0x00,0x6f,0x00,0x72,0x00,0x74,0x00,0x76,0x00,0x79,0x00,0x7c,0x00,0x80,0x00,0x83,0x00,0x85,0x00,0x87,0x00,0x8b,0x00,0x8e,0x00,0x90, -0x00,0x92,0x00,0x95,0x00,0x98,0x00,0x9a,0x00,0x9d,0x00,0xa1,0x00,0xa3,0x00,0xa5,0x00,0xa7,0x00,0xa9,0x00,0xac,0x00,0xaf,0x00,0xb1,0x00,0xb4,0x00,0xb6,0x00,0xb9,0x00,0xbc,0x00,0xbf,0x00,0xc1,0x00,0xc4,0x00,0xc8,0x00,0xcb,0x00,0xcd,0x00,0xcf,0x00,0xd1,0x00,0xd4,0x00,0xd7,0x00,0xdb,0x00,0xdf,0x00,0xe1,0x00,0xe3,0x00,0xe6, -0x00,0xea,0x00,0xed,0x00,0xef,0x00,0xf2,0x00,0xf5,0x00,0xf7,0x00,0xf9,0x00,0xfc,0x00,0xff,0x01,0x02,0x01,0x06,0x01,0x09,0x01,0x0d,0x01,0x0f,0x01,0x11,0x01,0x13,0x01,0x16,0x01,0x18,0x01,0x1c,0x01,0x1e,0x01,0x21,0x01,0x24,0x01,0x27,0x01,0x2a,0x01,0x2d,0x01,0x30,0x01,0x33,0x01,0x36,0x01,0x39,0x01,0x3c,0x01,0x3e,0x01,0x41, -0x01,0x43,0x01,0x46,0x01,0x48,0x01,0x4a,0x01,0x4d,0x01,0x50,0x01,0x52,0x01,0x54,0x01,0x56,0x01,0x58,0x01,0x5b,0x01,0x5d,0x01,0x60,0x01,0x62,0x01,0x64,0x01,0x66,0x01,0x68,0x01,0x6a,0x01,0x6c,0x01,0x6e,0x01,0x70,0x01,0x72,0x01,0x74,0x01,0x76,0x01,0x78,0x01,0x7a,0x01,0x7c,0x01,0x7e,0x01,0x80,0x01,0x82,0x01,0x84,0x01,0x86, -0x01,0x88,0x01,0x8a,0x01,0x8c,0x01,0x8e,0x01,0x90,0x01,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x1d,0xcc,0x00,0x06,0x00,0x00,0x00,0x01,0x1b,0xf6,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xba,0x00,0x06,0x00,0x00,0x00,0x01,0x1b,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xb0,0x00,0x06,0x00,0x00, -0x00,0x01,0x10,0x3a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xa6,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xa4,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x2a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x98,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x1c,0x00,0x01,0x00,0x00, -0x00,0x01,0x11,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x26,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x28,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x2a,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x2c,0x00,0x06,0x00,0x00, -0x00,0x01,0x18,0xcc,0x00,0x01,0x00,0x00,0x00,0x01,0x18,0xd0,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x1e,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x20,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x0e,0x00,0x06,0x00,0x00, -0x00,0x01,0x0f,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x04,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xf2,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0xf4,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xf6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xfc,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xfe,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x02,0x00,0x01,0x00,0x00, -0x00,0x01,0x11,0x04,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x8e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x84,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xe8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x62,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xe8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xec,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00, -0x00,0x01,0x10,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf4,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0xa2,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x0c,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x8a,0x00,0x01,0x00,0x00, -0x00,0x01,0x0d,0x02,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xb6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xb8,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xe6,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x62,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xdc,0x00,0x06,0x00,0x00, -0x00,0x01,0x10,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xca,0x00,0x06,0x00,0x00,0x00,0x01,0x17,0x0c,0x00,0x01,0x00,0x00,0x00,0x01,0x17,0x10,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x86,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x88,0x00,0x06,0x00,0x00,0x00,0x01,0x19,0x28,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0x82,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x16,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x74,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x76,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x78,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x7a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x7c,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0x7e,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0xd2,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0x50,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0xca,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x62,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0x9c,0x00,0x01,0x00,0x00, -0x00,0x01,0x16,0xa0,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0xa4,0x00,0x01,0x00,0x00,0x00,0x01,0x16,0xa8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x44,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x50,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x5a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x5c,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0x5e,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x0b,0x9c,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x0b,0x92,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x42,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x44,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x50,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x15,0xbc,0x00,0x01,0x00,0x00,0x00,0x01,0x15,0xc0,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x0c,0x82,0x00,0x01,0x00,0x00, -0x00,0x01,0x0a,0xf8,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xf6,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x38,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x3a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x3c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x3e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x42,0x00,0x06,0x00,0x00, -0x00,0x01,0x0c,0x42,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xbc,0x00,0x06,0x00,0x00,0x00,0x01,0x0c,0x3a,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xb2,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x2a,0x00,0x06,0x00,0x00, -0x00,0x01,0x10,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x2e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x30,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x32,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x68,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x5e,0x00,0x06,0x00,0x00, -0x00,0x01,0x0b,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xd2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x48,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xee,0x00,0x06,0x00,0x00,0x00,0x01,0x14,0xa4,0x00,0x01,0x00,0x00, -0x00,0x01,0x14,0xa8,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xdc,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xde,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe2,0x00,0x06,0x00,0x00, -0x00,0x01,0x0f,0xe4,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe6,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe8,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xea,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xee,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xf0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xf2,0x00,0x06,0x00,0x00, -0x00,0x01,0x0f,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xf6,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x90,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xd0,0x00,0x01,0x00,0x00, -0x00,0x01,0x0f,0xd2,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x76,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x74,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x60,0x00,0x01,0x00,0x00, -0x00,0x01,0x09,0x5e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x94,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x96,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x98,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x9e,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xa2,0x00,0x01,0x00,0x00, -0x00,0x01,0x09,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x90,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x92,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x0a,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x08,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x7c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x7e,0x00,0x06,0x00,0x00, -0x00,0x01,0x0a,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0xec,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x68,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x6c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00, -0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x64,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x66,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x62,0x00,0x06,0x00,0x00, -0x00,0x01,0x0f,0x64,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x66,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x68,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x6c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00, -0x00,0x01,0x0f,0x74,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x76,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x38,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00,0x00,0x01,0x09,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x54,0x00,0x01,0x00,0x00, -0x00,0x01,0x12,0x58,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x5a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x5c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x5e,0x00,0x01,0x00,0x00,0x00,0x01,0x07,0xdc,0x00,0x06,0x00,0x00, -0x00,0x01,0x12,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x28,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x30,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x34,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x38,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x3c,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x40,0x00,0x06,0x00,0x00, -0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x07,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00, -0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x2a,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0xcc,0x00,0x01,0x00,0x00, -0x00,0x01,0x11,0xd0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0xb4,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xb8,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x14,0x00,0x01,0x00,0x00, -0x00,0x01,0x0f,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xa0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x0c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x0e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x10,0x00,0x01,0x00,0x00, -0x00,0x01,0x0f,0x12,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x84,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x88,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x04,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x06,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x08,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x0a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x0c,0x00,0x01,0x00,0x00, -0x00,0x01,0x0f,0x0e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x10,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x12,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x14,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00, -0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x2a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xec,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0xd8,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0x1c,0x00,0x04,0x00,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0xa8,0x00,0x01,0x00,0x00, -0x00,0x01,0x10,0xca,0x00,0x06,0x00,0x00,0x00,0x01,0x06,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x96,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x94,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x86,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x88,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x86,0x00,0x01,0x00,0x00, -0x00,0x01,0x05,0x84,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x90,0x00,0x04,0x00,0x00,0x00,0x01,0x06,0xb2,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0xac,0x00,0x01,0x00,0x00,0x00,0x01,0x13,0x42,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x6e,0x00,0x01,0x00,0x00, -0x00,0x01,0x0e,0x78,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x3e,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xdc,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xc8,0x00,0x01,0x00,0x00, -0x00,0x01,0x12,0x52,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x04,0xf6,0x00,0x01,0x00,0x00, -0x00,0x01,0x04,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x30,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x38,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xe2,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0xca,0x10,0xe0,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0xec,0x11,0x02,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0x6e, -0x10,0x80,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0x88,0x10,0x9a,0x00,0x06,0x00,0x00,0x00,0x04,0x10,0xfa,0x11,0x4a,0x11,0x0c,0x11,0x1e,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10, -0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b, -0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06, -0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23, -0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1b,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27, -0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1c, -0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14, -0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1d,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e, -0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1e,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08, -0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1f,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01, -0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x20,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29, -0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x21,0x00,0x22,0x00,0x23, -0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x03,0x00,0x01,0x12,0x42,0x00,0x15,0x00,0x01,0x12,0x36,0x00,0x33,0x00,0x01,0x11,0xc0,0x00,0x31,0x00,0x01,0x11,0xba,0x03,0x89,0x00,0x01,0x11,0xba,0x00,0x35,0x00,0x01,0x11,0xb4, -0x03,0x88,0x00,0x01,0x11,0xb4,0x00,0x66,0x00,0x01,0x11,0xae,0x00,0x67,0x00,0x01,0x11,0xa8,0x00,0x68,0x00,0x01,0x11,0xa2,0x03,0x94,0x00,0x01,0x12,0x0c,0x00,0x6e,0x00,0x01,0x12,0x06,0x00,0x70,0x00,0x01,0x12,0x00,0x03,0x91,0x00,0x01,0x11,0x90,0x00,0x63,0x00,0x01,0x11,0x8a,0x03,0x9a,0x00,0x01,0x11,0x8a,0x02,0x08,0x00,0x01, -0x11,0x84,0x02,0x09,0x00,0x01,0x11,0x7e,0x02,0xb9,0x00,0x01,0x11,0x7e,0x00,0x56,0x00,0x01,0x11,0x78,0x00,0x57,0x00,0x01,0x11,0x72,0x03,0xa5,0x00,0x01,0x11,0x72,0x02,0x32,0x00,0x01,0x11,0x6c,0x02,0x35,0x00,0x01,0x11,0x6c,0x02,0x15,0x00,0x01,0x11,0x66,0x02,0x18,0x00,0x01,0x11,0x66,0x00,0x60,0x00,0x01,0x11,0x60,0x03,0xa0, -0x00,0x01,0x11,0x60,0x02,0x0a,0x00,0x01,0x11,0x5a,0x02,0x0b,0x00,0x01,0x11,0x94,0x00,0x59,0x00,0x01,0x11,0x54,0x00,0x60,0x00,0x01,0x11,0x4e,0x00,0x61,0x00,0x01,0x11,0x48,0x03,0xa2,0x00,0x01,0x11,0x7c,0x00,0x5a,0x00,0x01,0x11,0x76,0x03,0xa3,0x00,0x01,0x11,0x3c,0x00,0x55,0x00,0x01,0x11,0x36,0x01,0x10,0x00,0x01,0x11,0x36, -0x00,0x15,0x00,0x01,0x11,0x30,0x00,0x16,0x00,0x01,0x11,0x2a,0x03,0x77,0x00,0x01,0x11,0x2a,0x00,0x64,0x00,0x01,0x11,0x24,0x00,0x65,0x00,0x01,0x11,0x1e,0x03,0x9e,0x00,0x01,0x11,0x1e,0x00,0x57,0x00,0x01,0x11,0x18,0x00,0x58,0x00,0x01,0x11,0x12,0x01,0x19,0x00,0x01,0x11,0x12,0x00,0x55,0x00,0x01,0x11,0x0c,0x03,0x72,0x00,0x01, -0x10,0xe2,0x02,0xb5,0x00,0x01,0x10,0xd0,0x02,0xb3,0x00,0x01,0x11,0x00,0x02,0x39,0x00,0x01,0x10,0xbe,0x02,0xb2,0x00,0x01,0x10,0xf4,0x02,0xac,0x00,0x01,0x10,0x70,0x00,0x07,0x00,0x01,0x10,0xee,0x00,0x0f,0x00,0x01,0x10,0xe8,0x00,0x10,0x00,0x01,0x13,0x50,0x00,0x10,0x00,0x01,0x10,0xf2,0xff,0xe3,0x00,0x01,0x13,0x44,0x00,0x24, -0x00,0x01,0x13,0x34,0xff,0xf6,0x00,0x01,0x10,0x4c,0x00,0x0a,0x00,0x01,0x12,0x30,0x00,0x38,0x00,0x01,0x12,0x34,0x00,0x94,0x00,0x01,0x10,0x40,0x00,0x7f,0x00,0x01,0x10,0x46,0x00,0xae,0x00,0x01,0x12,0x2c,0x00,0x63,0x00,0x01,0x10,0x34,0x00,0x40,0x00,0x01,0x10,0x34,0x00,0xcf,0x00,0x01,0x10,0x34,0x00,0x01,0x13,0x12,0x00,0x01, -0x10,0x32,0x00,0x01,0x13,0x14,0x00,0x01,0x10,0x30,0x00,0x01,0x13,0x16,0x00,0x01,0x10,0x28,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x20,0x00,0x01,0x18,0xee,0x00,0x01,0x10,0x88,0x00,0x01,0x16,0x72,0x00,0x01,0x10,0x80,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x0e,0x00,0x01,0x16,0x7a,0x00,0x01,0x10,0x0c,0x00,0x01,0x12,0xf0,0x00,0x01, -0x10,0x04,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x02,0x00,0x01,0x16,0x7a,0x00,0x01,0x0f,0xfa,0x00,0x01,0x16,0x7e,0x00,0x01,0x0f,0xf8,0x00,0x01,0x1b,0x08,0x00,0x01,0x0f,0xf0,0x00,0x01,0x16,0x7a,0x00,0x01,0x0f,0xee,0x00,0x01,0x1b,0x0a,0x00,0x01,0x0f,0xe6,0x00,0x01,0x16,0x76,0x00,0x01,0x0f,0xe4,0x00,0x01,0x18,0x9c,0x00,0x01, -0x0f,0xe2,0x00,0x01,0x1a,0x4a,0x00,0x01,0x0f,0xda,0x00,0x01,0x1a,0xfc,0x00,0x01,0x10,0x12,0x00,0x01,0x16,0x62,0x00,0x01,0x0f,0xd0,0x00,0x01,0x12,0x9a,0x00,0x01,0x0f,0xc8,0x00,0x01,0x16,0x5e,0x00,0x01,0x0f,0xfa,0x00,0x01,0x16,0x62,0x00,0x01,0x0f,0xbe,0x00,0x01,0x18,0x72,0x00,0x01,0x0f,0xbc,0x00,0x01,0x1a,0x22,0x00,0x01, -0x0f,0xb4,0x00,0x01,0x18,0x70,0x00,0x01,0x0f,0xb2,0x00,0x01,0x12,0x74,0x00,0x01,0x0f,0xaa,0x00,0x01,0x16,0x46,0x00,0x01,0x0f,0xa8,0x00,0x01,0x12,0x6e,0x00,0x01,0x0f,0xa0,0x00,0x01,0x16,0x42,0x00,0x01,0x0f,0x9e,0x00,0x01,0x12,0x68,0x00,0x01,0x0f,0x9c,0x00,0x01,0x18,0x4e,0x00,0x01,0x0f,0x9a,0x00,0x01,0x12,0x62,0x00,0x01, -0x21,0xd0,0x00,0x01,0x0f,0x98,0x00,0x01,0x12,0x6c,0x00,0x02,0x12,0x5c,0x12,0x64,0x00,0x02,0x12,0x62,0x00,0x02,0x06,0xce,0x03,0x77,0x00,0x02,0x12,0x58,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x12,0x56,0x00,0x02,0x10,0xf6,0x16,0x08,0x00,0x02,0x12,0x4c,0x00,0x02,0x03,0x6e,0x06,0xce,0x00,0x02,0x12,0x42,0x00,0x02,0x06,0xce, -0x06,0xce,0x00,0x01,0x12,0x48,0x00,0x02,0x10,0xde,0x12,0x40,0x00,0x02,0x12,0x3e,0x00,0x02,0x03,0x79,0x06,0xce,0x00,0x01,0x12,0x3c,0x00,0x02,0x15,0xe0,0x0f,0x56,0x00,0x02,0x12,0x32,0x00,0x02,0x06,0xce,0x03,0x8f,0x00,0x01,0x13,0x08,0x00,0x02,0x0f,0x46,0x15,0xd6,0x00,0x02,0x12,0xfe,0x00,0x02,0x06,0x20,0x06,0xce,0x00,0x01, -0x12,0x24,0x00,0x02,0x0f,0x36,0x12,0x1c,0x00,0x02,0x12,0x1a,0x00,0x02,0x06,0x0b,0x06,0xce,0x00,0x01,0x12,0x20,0x00,0x02,0x0f,0x26,0x12,0x18,0x00,0x02,0x12,0x16,0x00,0x02,0x06,0x11,0x06,0xce,0x00,0x01,0x12,0x14,0x00,0x02,0x10,0x80,0x0f,0x16,0x00,0x02,0x12,0x0a,0x00,0x02,0x06,0xce,0x03,0x7c,0x00,0x01,0x12,0x08,0x00,0x02, -0x0f,0x06,0x10,0x72,0x00,0x02,0x11,0xfe,0x00,0x02,0x06,0x12,0x06,0xce,0x00,0x01,0x11,0xfc,0x00,0x02,0x1a,0x28,0x0e,0xf6,0x00,0x02,0x11,0xf2,0x00,0x02,0x06,0xce,0x03,0x7d,0x00,0x01,0x11,0xf8,0x00,0x02,0x11,0xf0,0x0e,0xe6,0x00,0x02,0x11,0xee,0x00,0x02,0x06,0xce,0x03,0x7a,0x00,0x02,0x11,0xec,0x00,0x02,0x03,0xaf,0x06,0xce, -0x00,0x02,0x11,0xe2,0x00,0x02,0x06,0xce,0x03,0xae,0x00,0x01,0x12,0xd0,0x00,0x02,0x15,0x40,0x0e,0xc2,0x00,0x02,0x12,0xc6,0x00,0x02,0x06,0xce,0x03,0xa8,0x00,0x01,0x12,0xbc,0x00,0x02,0x17,0x2c,0x0e,0xb2,0x00,0x02,0x12,0xb2,0x00,0x02,0x06,0xce,0x03,0xac,0x00,0x01,0x12,0xa8,0x00,0x02,0x11,0xb8,0x10,0x00,0x00,0x02,0x12,0x9e, -0x00,0x02,0x06,0xce,0x03,0xa9,0x00,0x01,0x11,0xac,0x00,0x02,0x0e,0x8e,0x18,0xa2,0x00,0x02,0x11,0xa2,0x00,0x02,0x03,0xa6,0x06,0xce,0x00,0x01,0x11,0x98,0x00,0x02,0x0f,0xde,0x18,0x9c,0x00,0x02,0x11,0x8e,0x00,0x02,0x03,0xa7,0x06,0xce,0x00,0x01,0x11,0x84,0x00,0x02,0x18,0x96,0x0e,0x6a,0x00,0x02,0x11,0x7a,0x00,0x02,0x06,0xce, -0x03,0x99,0x00,0x01,0x12,0x38,0x00,0x02,0x11,0x78,0x0e,0x5a,0x00,0x02,0x12,0x2e,0x00,0x02,0x06,0xce,0x03,0x82,0x00,0x01,0x11,0x6c,0x00,0x02,0x14,0xbe,0x0e,0x4a,0x00,0x02,0x11,0x62,0x00,0x02,0x06,0xce,0x03,0x81,0x00,0x01,0x13,0xd0,0x00,0x02,0x0e,0x3a,0x14,0xb4,0x00,0x02,0x13,0xc6,0x00,0x02,0x06,0x4f,0x06,0xce,0x00,0x02, -0x13,0xbc,0x00,0x02,0x06,0x34,0x06,0xce,0x00,0x01,0x11,0x4a,0x00,0x02,0x0e,0x20,0x11,0x42,0x00,0x02,0x11,0x40,0x00,0x02,0x06,0x4d,0x06,0xce,0x00,0x01,0x11,0x8e,0x00,0x02,0x0e,0x10,0x14,0x8c,0x00,0x02,0x11,0x84,0x00,0x02,0x06,0x39,0x06,0xce,0x00,0x01,0x11,0x7a,0x00,0x02,0x0e,0x00,0x14,0x82,0x00,0x02,0x11,0x70,0x00,0x02, -0x06,0xce,0x06,0x3a,0x00,0x01,0x11,0xfe,0x00,0x02,0x14,0x78,0x0d,0xf0,0x00,0x02,0x11,0xf4,0x00,0x02,0x06,0xce,0x06,0x52,0x00,0x01,0x11,0x12,0x00,0x02,0x11,0x02,0x11,0x0a,0x00,0x02,0x11,0x08,0x00,0x02,0x06,0xce,0x06,0x40,0x00,0x01,0x10,0xfe,0x00,0x02,0x14,0x5a,0x0f,0x12,0x00,0x02,0x10,0xf4,0x00,0x02,0x06,0xce,0x06,0x3f, -0x00,0x01,0x10,0xea,0x00,0x02,0x14,0x50,0x0d,0xb8,0x00,0x02,0x10,0xe0,0x00,0x02,0x06,0xce,0x06,0x3e,0x00,0x01,0x11,0x36,0x00,0x02,0x14,0x46,0x0d,0xa8,0x00,0x02,0x11,0x2c,0x00,0x02,0x06,0xce,0x03,0x70,0x00,0x01,0x11,0x82,0x00,0x02,0x10,0xca,0x0e,0xdc,0x00,0x02,0x11,0x78,0x00,0x02,0x06,0xce,0x03,0x72,0x00,0x01,0x11,0x6e, -0x00,0x02,0x15,0xda,0x0d,0x84,0x00,0x02,0x11,0x64,0x00,0x02,0x06,0xce,0x03,0x6f,0x00,0x01,0x11,0x5a,0x00,0x02,0x18,0x04,0x0d,0x74,0x00,0x02,0x11,0x50,0x00,0x02,0x06,0xce,0x03,0x71,0x00,0x01,0x11,0x3e,0x00,0x02,0x0d,0x64,0x15,0xbe,0x00,0x02,0x11,0x34,0x00,0x02,0x06,0x2e,0x06,0xce,0x00,0x01,0x10,0xaa,0x00,0x02,0x0d,0x54, -0x10,0x82,0x00,0x02,0x10,0xa0,0x00,0x02,0x06,0x2d,0x06,0xce,0x00,0x01,0x10,0x76,0x00,0x02,0x0d,0x44,0x18,0x3c,0x00,0x02,0x10,0x6c,0x00,0x02,0x06,0x2c,0x06,0xce,0x00,0x01,0x11,0x1a,0x00,0x02,0x0d,0x34,0x17,0x32,0x00,0x02,0x11,0x10,0x00,0x02,0x06,0x47,0x06,0xce,0x00,0x01,0x11,0x06,0x00,0x02,0x0d,0x24,0x13,0xb0,0x00,0x02, -0x10,0xfc,0x00,0x02,0x06,0x50,0x06,0xce,0x00,0x01,0x10,0xf2,0x00,0x02,0x0e,0x42,0x15,0x66,0x00,0x02,0x10,0xe8,0x00,0x02,0x06,0x49,0x06,0xce,0x00,0x01,0x10,0x2e,0x00,0x02,0x13,0x92,0x0d,0x00,0x00,0x02,0x10,0x24,0x00,0x02,0x03,0xb0,0x06,0xce,0x00,0x01,0x10,0x22,0x00,0x02,0x16,0xf0,0x0c,0xf0,0x00,0x02,0x10,0x18,0x00,0x02, -0x06,0xce,0x03,0x90,0x00,0x01,0x10,0x0e,0x00,0x02,0x15,0x36,0x0e,0x0c,0x00,0x02,0x10,0x04,0x00,0x02,0x06,0xce,0x03,0x91,0x00,0x01,0x0f,0xfa,0x00,0x02,0x0c,0xcc,0x15,0x2e,0x00,0x02,0x0f,0xf0,0x00,0x02,0x06,0xce,0x06,0x22,0x00,0x01,0x10,0x76,0x00,0x02,0x17,0xd0,0x0c,0xbc,0x00,0x02,0x10,0x6c,0x00,0x02,0x06,0xce,0x06,0x26, -0x00,0x01,0x0f,0xf2,0x00,0x02,0x0c,0xac,0x15,0x12,0x00,0x02,0x0f,0xe8,0x00,0x02,0x06,0xce,0x06,0x21,0x00,0x01,0x0f,0xde,0x00,0x02,0x13,0x24,0x0c,0x9c,0x00,0x02,0x0f,0xd4,0x00,0x02,0x06,0xce,0x03,0x89,0x00,0x01,0x0f,0xba,0x00,0x02,0x0f,0xb2,0x0c,0x8c,0x00,0x02,0x0f,0xb0,0x00,0x02,0x06,0xce,0x03,0x8a,0x00,0x01,0x0f,0xae, -0x00,0x02,0x13,0x06,0x0c,0x7c,0x00,0x02,0x0f,0xa4,0x00,0x02,0x06,0xce,0x03,0x8b,0x00,0x01,0x0f,0xd2,0x00,0x02,0x12,0xfc,0x0c,0x6c,0x00,0x02,0x0f,0xc8,0x00,0x02,0x06,0xce,0x03,0x87,0x00,0x01,0x0f,0x8e,0x00,0x02,0x12,0xf2,0x0c,0x5c,0x00,0x02,0x0f,0x84,0x00,0x02,0x06,0xce,0x03,0x86,0x00,0x01,0x0f,0x8a,0x00,0x02,0x0c,0x4c, -0x14,0xa6,0x00,0x02,0x0f,0x80,0x00,0x02,0x06,0x16,0x06,0xce,0x00,0x01,0x0f,0x76,0x00,0x02,0x0c,0x3c,0x14,0x9e,0x00,0x02,0x0f,0x6c,0x00,0x02,0x06,0x18,0x06,0xce,0x00,0x01,0x0f,0x62,0x00,0x02,0x0c,0x2c,0x0f,0x5a,0x00,0x02,0x0f,0x58,0x00,0x02,0x06,0x1b,0x06,0xce,0x00,0x01,0x0f,0x56,0x00,0x02,0x0c,0x1c,0x12,0xac,0x00,0x02, -0x0f,0x4c,0x00,0x02,0x06,0x14,0x06,0xce,0x00,0x01,0x0f,0x4a,0x00,0x02,0x0c,0x0c,0x12,0xa2,0x00,0x02,0x0f,0x40,0x00,0x02,0x06,0x17,0x06,0xce,0x00,0x01,0x0f,0x2e,0x00,0x02,0x0b,0xfc,0x12,0x98,0x00,0x02,0x0f,0x24,0x00,0x02,0x06,0x0f,0x06,0xce,0x00,0x01,0x0f,0x22,0x00,0x02,0x0b,0xec,0x12,0x8e,0x00,0x02,0x0f,0x18,0x00,0x02, -0x06,0x19,0x06,0xce,0x00,0x01,0x10,0xf6,0x00,0x02,0x0c,0xd2,0x0f,0x16,0x00,0x02,0x10,0xec,0x00,0x02,0x06,0x35,0x06,0xce,0x00,0x01,0x0f,0x0a,0x00,0x02,0x0b,0xc8,0x12,0x70,0x00,0x02,0x0f,0x00,0x00,0x02,0x03,0x93,0x06,0xce,0x00,0x01,0x0e,0xfe,0x00,0x02,0x16,0x6e,0x0b,0xb8,0x00,0x02,0x0e,0xf4,0x00,0x02,0x06,0xce,0x03,0x96, -0x00,0x01,0x0e,0xfa,0x00,0x02,0x0b,0xa8,0x0e,0xf2,0x00,0x02,0x0e,0xf0,0x00,0x02,0x03,0x92,0x06,0xce,0x00,0x01,0x0e,0xee,0x00,0x02,0x0b,0x98,0x12,0x3e,0x00,0x02,0x0e,0xe4,0x00,0x02,0x06,0x0e,0x06,0xce,0x00,0x01,0x0e,0xea,0x00,0x02,0x0e,0xe2,0x0b,0x88,0x00,0x02,0x0e,0xe0,0x00,0x02,0x06,0xce,0x03,0x83,0x00,0x01,0x0e,0xde, -0x00,0x02,0x0b,0x78,0x13,0xba,0x00,0x02,0x0e,0xd4,0x00,0x02,0x06,0xce,0x06,0x29,0x00,0x01,0x10,0x6a,0x00,0x02,0x0b,0x68,0x12,0x0c,0x00,0x02,0x10,0x60,0x00,0x02,0x06,0xce,0x06,0x38,0x00,0x01,0x0e,0xd6,0x00,0x02,0x0b,0x58,0x13,0x9e,0x00,0x02,0x0e,0xcc,0x00,0x02,0x06,0xce,0x06,0x4c,0x00,0x01,0x0e,0xaa,0x00,0x02,0x15,0x6c, -0x0b,0x48,0x00,0x02,0x0e,0xa0,0x00,0x02,0x06,0xce,0x06,0x25,0x00,0x01,0x0e,0x96,0x00,0x02,0x11,0xda,0x0c,0x10,0x00,0x02,0x0e,0x8c,0x00,0x02,0x06,0xce,0x06,0x27,0x00,0x01,0x0e,0x82,0x00,0x02,0x0b,0x24,0x11,0xd0,0x00,0x02,0x0e,0x78,0x00,0x02,0x06,0xce,0x06,0x2f,0x00,0x01,0x0e,0x6e,0x00,0x02,0x0b,0x14,0x11,0xc6,0x00,0x02, -0x0e,0x64,0x00,0x02,0x06,0x32,0x06,0xce,0x00,0x01,0x0e,0x62,0x00,0x02,0x0b,0x04,0x11,0xbc,0x00,0x02,0x0e,0x58,0x00,0x02,0x06,0x31,0x06,0xce,0x00,0x01,0x0e,0x4e,0x00,0x02,0x0a,0xf4,0x13,0x32,0x00,0x02,0x0e,0x44,0x00,0x02,0x06,0x2a,0x06,0xce,0x00,0x01,0x0e,0x3a,0x00,0x02,0x0a,0xe4,0x11,0x9e,0x00,0x02,0x0e,0x30,0x00,0x02, -0x06,0xce,0x06,0x2b,0x00,0x01,0x0e,0x3e,0x00,0x02,0x11,0x94,0x0a,0xd4,0x00,0x02,0x0e,0x34,0x00,0x02,0x06,0xce,0x06,0x53,0x00,0x01,0x0f,0xa2,0x00,0x02,0x13,0x02,0x0a,0xc4,0x00,0x02,0x0f,0x98,0x00,0x02,0x06,0xce,0x03,0x73,0x00,0x01,0x0f,0x8e,0x00,0x02,0x0e,0x06,0x0b,0x76,0x00,0x02,0x0f,0x84,0x00,0x02,0x06,0xce,0x03,0x74, -0x00,0x01,0x0d,0xfa,0x00,0x02,0x11,0x62,0x0b,0x68,0x00,0x02,0x0d,0xf0,0x00,0x02,0x06,0xce,0x06,0x28,0x00,0x01,0x0d,0xee,0x00,0x02,0x11,0x58,0x0b,0x5a,0x00,0x02,0x0d,0xe4,0x00,0x02,0x06,0xce,0x06,0x55,0x00,0x01,0x0d,0xfa,0x00,0x02,0x11,0x4e,0x0a,0x78,0x00,0x02,0x0d,0xf0,0x00,0x02,0x06,0xce,0x03,0x75,0x00,0x01,0x0d,0xd6, -0x00,0x02,0x0a,0x68,0x11,0x44,0x00,0x02,0x0d,0xcc,0x00,0x02,0x06,0x5c,0x06,0xce,0x00,0x01,0x0d,0xc2,0x00,0x02,0x0a,0x58,0x0d,0xba,0x00,0x02,0x0d,0xb8,0x00,0x02,0x06,0x5a,0x06,0xce,0x00,0x01,0x0d,0xbe,0x00,0x02,0x0a,0x48,0x0d,0xb6,0x00,0x02,0x0d,0xb4,0x00,0x02,0x06,0x58,0x06,0xce,0x00,0x01,0x0d,0xba,0x00,0x02,0x0d,0xb2, -0x0a,0x38,0x00,0x02,0x0d,0xb0,0x00,0x02,0x06,0xce,0x06,0x59,0x00,0x01,0x0d,0xb6,0x00,0x02,0x0a,0x28,0x0d,0xae,0x00,0x02,0x0d,0xac,0x00,0x02,0x06,0x5d,0x06,0xce,0x00,0x01,0x0d,0xb2,0x00,0x02,0x0a,0x18,0x0d,0xaa,0x00,0x02,0x0d,0xa8,0x00,0x02,0x06,0x42,0x06,0xce,0x00,0x01,0x0d,0xae,0x00,0x02,0x0d,0xa6,0x0a,0x08,0x00,0x02, -0x0d,0xa4,0x00,0x02,0x06,0xce,0x06,0x1c,0x00,0x01,0x0d,0xaa,0x00,0x02,0x09,0xf8,0x0d,0xa2,0x00,0x02,0x0d,0xa0,0x00,0x02,0x06,0x45,0x06,0xce,0x00,0x01,0x0d,0xa6,0x00,0x02,0x0d,0x9e,0x09,0xe8,0x00,0x02,0x0d,0x9c,0x00,0x02,0x06,0xce,0x06,0x1f,0x00,0x01,0x0d,0xa2,0x00,0x02,0x09,0xd8,0x0d,0x9a,0x00,0x02,0x0d,0x98,0x00,0x02, -0x06,0x3c,0x06,0xce,0x00,0x01,0x0d,0x9e,0x00,0x02,0x0d,0x96,0x09,0xc8,0x00,0x02,0x0d,0x94,0x00,0x02,0x06,0xce,0x03,0x98,0x00,0x01,0x0d,0x9a,0x00,0x02,0x09,0xb8,0x0d,0x92,0x00,0x02,0x0d,0x90,0x00,0x02,0x06,0x56,0x06,0xce,0x00,0x01,0x0d,0x96,0x00,0x02,0x0d,0x8e,0x09,0xa8,0x00,0x02,0x0d,0x8c,0x00,0x02,0x06,0xce,0x03,0xaa, -0x00,0x01,0x0d,0x92,0x00,0x02,0x0d,0x8a,0x09,0x98,0x00,0x02,0x0d,0x88,0x00,0x02,0x06,0xce,0x03,0x9b,0x00,0x01,0x0d,0x8e,0x00,0x02,0x0d,0x86,0x09,0x88,0x00,0x02,0x0d,0x84,0x00,0x02,0x06,0xce,0x03,0x9c,0x00,0x01,0x0d,0x8a,0x00,0x02,0x0d,0x82,0x09,0x78,0x00,0x02,0x0d,0x80,0x00,0x02,0x06,0xce,0x03,0x9a,0x00,0x01,0x0d,0x86, -0x00,0x02,0x09,0x68,0x0d,0x7e,0x00,0x02,0x0d,0x7c,0x00,0x02,0x03,0x9f,0x06,0xce,0x00,0x01,0x0d,0x7a,0x00,0x02,0x0f,0xfa,0x09,0x58,0x00,0x02,0x0d,0x70,0x00,0x02,0x06,0xce,0x03,0xa4,0x00,0x01,0x0d,0x76,0x00,0x02,0x09,0x48,0x0d,0x6e,0x00,0x02,0x0d,0x6c,0x00,0x02,0x03,0x9e,0x06,0xce,0x00,0x01,0x0d,0x72,0x00,0x02,0x09,0x38, -0x0d,0x6a,0x00,0x02,0x0d,0x68,0x00,0x02,0x03,0x9d,0x06,0xce,0x00,0x01,0x0d,0x6e,0x00,0x02,0x0d,0x66,0x09,0x28,0x00,0x02,0x0d,0x64,0x00,0x02,0x06,0xce,0x03,0xa3,0x00,0x01,0x0d,0x6a,0x00,0x02,0x09,0x18,0x0d,0x62,0x00,0x02,0x0d,0x60,0x00,0x02,0x03,0x7e,0x06,0xce,0x00,0x02,0x0d,0x5e,0x00,0x02,0x01,0xc5,0x01,0xc4,0x00,0x02, -0x0d,0x5c,0x00,0x02,0x02,0x0b,0x02,0x50,0x00,0x01,0x10,0xde,0x00,0x03,0x09,0x6c,0x0f,0x8c,0x0d,0x5a,0x00,0x02,0x10,0xd2,0x00,0x03,0x06,0xce,0x06,0xce,0x03,0x78,0x00,0x01,0x10,0xda,0x00,0x03,0x09,0x58,0x0d,0x48,0x10,0xd0,0x00,0x02,0x10,0xce,0x00,0x03,0x06,0xce,0x06,0x3b,0x06,0xce,0x00,0x01,0x10,0xcc,0x00,0x03,0x09,0x44, -0x0d,0x36,0x0f,0x64,0x00,0x02,0x10,0xc0,0x00,0x03,0x06,0xce,0x06,0x44,0x06,0xce,0x00,0x01,0x10,0xf0,0x00,0x03,0x09,0x30,0x09,0x34,0x10,0xbe,0x00,0x02,0x10,0xe4,0x00,0x03,0x06,0xce,0x06,0x4b,0x06,0xce,0x00,0x01,0x10,0xb0,0x00,0x03,0x09,0x20,0x09,0x24,0x0f,0x3c,0x00,0x02,0x10,0xa4,0x00,0x03,0x06,0xce,0x06,0x37,0x06,0xce, -0x00,0x01,0x10,0xa2,0x00,0x03,0x09,0x10,0x0f,0x2c,0x09,0x14,0x00,0x02,0x10,0x96,0x00,0x03,0x06,0x41,0x06,0xce,0x06,0xce,0x00,0x01,0x10,0x94,0x00,0x03,0x0f,0x1c,0x09,0x00,0x09,0x04,0x00,0x02,0x10,0x88,0x00,0x03,0x06,0xce,0x06,0xce,0x03,0x88,0x00,0x01,0x10,0x90,0x00,0x03,0x0c,0xc4,0x08,0xf0,0x10,0x86,0x00,0x02,0x10,0x84, -0x00,0x03,0x06,0xce,0x06,0x4a,0x06,0xce,0x00,0x01,0x10,0x82,0x00,0x03,0x08,0xdc,0x0e,0xf4,0x08,0xe0,0x00,0x02,0x10,0x76,0x00,0x03,0x06,0x54,0x06,0xce,0x06,0xce,0x00,0x01,0x10,0x74,0x00,0x03,0x08,0xcc,0x0e,0xe4,0x08,0xd0,0x00,0x02,0x10,0x68,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0x36,0x00,0x01,0x10,0x70,0x00,0x03,0x08,0xbc, -0x10,0x66,0x08,0xc0,0x00,0x02,0x10,0x64,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0x48,0x00,0x01,0x10,0x62,0x00,0x03,0x08,0xac,0x08,0xb0,0x0e,0xbc,0x00,0x02,0x10,0x56,0x00,0x03,0x06,0xce,0x06,0x1a,0x06,0xce,0x00,0x01,0x10,0x54,0x00,0x03,0x08,0x9c,0x08,0xa0,0x0e,0xac,0x00,0x02,0x10,0x48,0x00,0x03,0x06,0xce,0x06,0x10,0x06,0xce, -0x00,0x01,0x10,0x46,0x00,0x03,0x08,0x8c,0x08,0x90,0x0e,0x9c,0x00,0x02,0x10,0x3a,0x00,0x03,0x06,0xce,0x06,0x43,0x06,0xce,0x00,0x01,0x10,0x38,0x00,0x03,0x08,0x7c,0x08,0x80,0x0e,0x8c,0x00,0x02,0x10,0x2c,0x00,0x03,0x06,0xce,0x06,0x46,0x06,0xce,0x00,0x01,0x10,0x2a,0x00,0x03,0x08,0x6c,0x08,0x70,0x0e,0x7c,0x00,0x02,0x10,0x1e, -0x00,0x03,0x06,0xce,0x06,0x3d,0x06,0xce,0x00,0x01,0x10,0x1c,0x00,0x03,0x08,0x5c,0x08,0x60,0x0e,0x6c,0x00,0x02,0x10,0x10,0x00,0x03,0x06,0xce,0x06,0x57,0x06,0xce,0x00,0x01,0x10,0x0e,0x00,0x03,0x0e,0x5c,0x08,0x4c,0x08,0x50,0x00,0x02,0x10,0x02,0x00,0x03,0x06,0xce,0x03,0xa5,0x06,0xce,0x00,0x01,0x20,0x08,0x00,0x04,0x10,0x76, -0x10,0x80,0x10,0x8a,0x10,0x94,0x00,0x02,0x10,0xee,0x00,0x04,0x00,0x86,0x00,0x8d,0x01,0x49,0x01,0x50,0x00,0x02,0x10,0xec,0x00,0x04,0x01,0xc6,0x01,0xc7,0x01,0xc6,0x01,0xc7,0x00,0x02,0x10,0xea,0x00,0x04,0x03,0xb2,0x03,0xb3,0x06,0x5e,0x06,0x5f,0x00,0x02,0x10,0xe8,0x00,0x04,0x01,0x90,0x01,0x91,0x01,0x92,0x02,0x49,0x00,0x02, -0x10,0xe6,0x00,0x04,0x06,0x02,0x06,0x08,0x06,0x09,0x06,0x0a,0x00,0x02,0x05,0x8e,0x12,0x4c,0x10,0x4a,0x12,0x4c,0x00,0x02,0x0b,0x76,0x0f,0xac,0x00,0x02,0x12,0xb4,0x12,0x8c,0x12,0x64,0x12,0x8c,0x00,0x02,0x0b,0x66,0x0f,0xa2,0x00,0x02,0x11,0x24,0x00,0x05,0x03,0xce,0x03,0xcf,0x06,0x05,0x06,0x06,0x06,0x07,0x00,0x02,0x11,0x22, -0x00,0x05,0x02,0xe2,0x03,0x18,0x03,0x19,0x03,0x1a,0x03,0x1b,0x00,0x02,0x11,0x20,0x00,0x05,0x02,0xe3,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x00,0x02,0x0b,0x1e,0x11,0x34,0x11,0x44,0x11,0xda,0x00,0x03,0x0b,0x26,0x11,0x64,0x0f,0x68,0x00,0x02,0x11,0x42,0x00,0x06,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83, -0x00,0x02,0x11,0x30,0x00,0x06,0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x01,0x97,0x01,0x98,0x00,0x03,0x00,0x01,0x12,0x8e,0x00,0x01,0x05,0x0e,0x00,0x01,0x12,0x8e,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x01,0x10,0x4a,0x00,0x01,0x07,0x4e,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xad,0x00,0x03,0x00,0x01,0x10,0xc2,0x00,0x01, -0x07,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xae,0x00,0x03,0x00,0x01,0x07,0x34,0x00,0x01,0x10,0x62,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xb0,0x00,0x03,0x00,0x01,0x07,0x22,0x00,0x01,0x10,0x58,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xb0,0x00,0x03,0x00,0x02,0x10,0x96,0x10,0xe6,0x00,0x01,0x04,0xb8,0x00,0x01,0x10,0xe6,0x00,0x01, -0x00,0x00,0x00,0x37,0x00,0x03,0x00,0x01,0x10,0xd0,0x00,0x01,0x10,0x86,0x00,0x02,0x04,0xa2,0x10,0xd0,0x00,0x01,0x00,0x00,0x00,0x37,0x00,0x03,0x00,0x02,0x10,0x6a,0x10,0xba,0x00,0x01,0x10,0x70,0x00,0x01,0x10,0xba,0x00,0x01,0x00,0x00,0x00,0x39,0x00,0x03,0x00,0x01,0x10,0xa4,0x00,0x01,0x04,0x76,0x00,0x02,0x10,0x5a,0x10,0xa4, -0x00,0x01,0x00,0x00,0x00,0x39,0x00,0x03,0x00,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x10,0x9c,0x00,0x01,0x00,0x00,0x01,0x95,0x00,0x03,0x00,0x01,0x11,0x78,0x00,0x01,0x11,0x78,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x95,0x00,0x03,0x00,0x01,0x11,0x8e,0x00,0x01,0x11,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x96,0x00,0x02,0x10,0x76, -0x00,0x0a,0x00,0xb5,0x00,0xb6,0x00,0xb7,0x00,0xb8,0x00,0xb9,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x01,0x9e,0x00,0x03,0x00,0x00,0x00,0x01,0x10,0x7c,0x00,0x02,0x10,0x6c,0x10,0x4c,0x00,0x01,0x00,0x00,0x01,0x96,0x00,0x02,0x10,0x7c,0x00,0x0b,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09, -0x03,0x0a,0x03,0x0b,0x04,0x3b,0x00,0x02,0x11,0x9e,0x00,0x0f,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x09,0x02,0x0a,0x02,0x4e,0x02,0x4f,0x02,0x9d,0x02,0x9e,0x00,0x02,0x11,0x9c,0x00,0x0f,0x02,0xdf,0x02,0xe0,0x02,0xe1,0x03,0x0c,0x03,0x0d,0x03,0x0e,0x03,0x0f,0x03,0x10, -0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x00,0x02,0x11,0x9a,0x00,0x10,0x00,0xba,0x00,0xbb,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x4a,0x02,0x4b,0x02,0x4c,0x02,0x4d,0x02,0x73,0x02,0x74,0x02,0x9c,0x00,0x02,0x11,0x1a,0x00,0x13,0x01,0xb0,0x01,0xb1,0x01,0xb2, -0x01,0xb3,0x01,0xb4,0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x00,0x01,0x13,0xd6,0x00,0x24,0x11,0xf8,0x11,0x90,0x11,0x98,0x11,0xa0,0x11,0xa8,0x11,0xb0,0x11,0xb8,0x11,0xc0,0x11,0xc8,0x11,0xd0,0x12,0x02,0x12,0x7e,0x11,0xd8, -0x12,0x0c,0x12,0x52,0x11,0x6c,0x12,0x16,0x12,0x22,0x12,0x6e,0x11,0x72,0x11,0x78,0x11,0xe0,0x12,0x2e,0x11,0x7e,0x11,0xe8,0x12,0xc2,0x12,0x3a,0x11,0x84,0x12,0x46,0x12,0xe2,0x13,0x4a,0x12,0xa8,0x12,0x60,0x11,0x8a,0x11,0xf0,0x12,0x92,0x00,0x02,0x13,0x42,0x00,0x26,0x00,0xb5,0x00,0xb6,0x00,0xb7,0x00,0xb8,0x00,0xb9,0x01,0xc3, -0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x01,0x97,0x01,0x98,0x01,0x99,0x01,0x84,0x01,0x85,0x01,0x86,0x01,0x87,0x01,0x88,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x01,0x9e,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x09,0x02,0x0a,0x02,0x4e,0x02,0x4f,0x02,0x9d,0x02,0x9e, -0x00,0x02,0x0f,0xd0,0x00,0x27,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae, -0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0x22,0x00,0x29,0x03,0x40,0x03,0x41,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0, -0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0xd6,0x00,0x2f,0x01,0x00,0x06,0xcc,0x06,0xcb,0x01,0x0e,0x01,0x91,0x01,0x00,0x01,0x0e, -0x01,0x91,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1, -0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0xca,0x00,0x3b,0x00,0xba,0x00,0xbb,0x01,0xa2,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x01,0xa3,0x01,0xa4,0x01,0xa5,0x01,0xa6,0x01,0xb0,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4, -0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x09,0x02,0x0a,0x02,0x08,0x02,0x4a,0x02,0x4b,0x02,0x4c, -0x02,0x4e,0x02,0x4f,0x02,0x4d,0x02,0x9d,0x02,0x9c,0x02,0x9e,0x00,0x02,0x12,0xc4,0x00,0x3d,0x01,0xc6,0x01,0xc7,0x00,0x86,0x00,0x8d,0x01,0xc6,0x01,0x06,0x01,0xc7,0x01,0x49,0x01,0x7d,0x01,0x50,0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x03,0x41,0x06,0xce,0x06,0x8e, -0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd, -0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x01,0x00,0x01,0x00,0xff,0x00,0x01,0x00,0x01,0x02,0xd4,0x00,0x01,0x00,0x01,0x01,0x1a,0x00,0x01,0x00,0x01,0x00,0x7c,0x00,0x01,0x00,0x01,0x00,0xf4,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01, -0x03,0x34,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01, -0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x03,0x32,0x00,0x01,0x12,0x30,0x00,0x01,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x15,0x88,0x00,0x01,0x12,0x24,0x00,0x01,0x12,0x2e,0x00,0x01,0x12,0x38,0x00,0x01,0x12,0x42, -0x00,0x01,0x12,0x4c,0x00,0x01,0x12,0x56,0x00,0x01,0x12,0x60,0x00,0x01,0x12,0x6a,0x00,0x01,0x15,0x74,0x00,0x01,0x12,0x70,0x00,0x01,0x12,0x7a,0x00,0x01,0x12,0x84,0x00,0x01,0x15,0x74,0x00,0x01,0x15,0x80,0x00,0x01,0x12,0x86,0x00,0x01,0x12,0x90,0x00,0x01,0x15,0x84,0x00,0x01,0x15,0x90,0x00,0x01,0x12,0x92,0x00,0x01,0x12,0x9c, -0x00,0x01,0x15,0x94,0x00,0x01,0x12,0xa2,0x00,0x01,0x12,0xac,0x00,0x01,0x12,0xb6,0x00,0x01,0x12,0xc0,0x00,0x01,0x12,0xca,0x00,0x01,0x12,0xd4,0x00,0x01,0x15,0x88,0x00,0x01,0x12,0xda,0x00,0x01,0x15,0x90,0x00,0x01,0x12,0xe0,0x00,0x01,0x15,0x98,0x00,0x01,0x12,0xe6,0x00,0x01,0x12,0xf0,0x00,0x01,0x12,0xfa,0x00,0x01,0x13,0x04, -0x00,0x01,0x15,0x94,0x00,0x01,0x19,0xc4,0x00,0x01,0x15,0x9c,0x00,0x01,0x13,0x02,0x00,0x01,0x15,0xa4,0x00,0x01,0x15,0xb0,0x00,0x01,0x13,0x04,0x00,0x01,0x13,0x0e,0x00,0x01,0x13,0x18,0x00,0x01,0x13,0x22,0x00,0x01,0x13,0x2c,0x00,0x01,0x13,0x36,0x00,0x01,0x13,0x40,0x00,0x01,0x15,0xa0,0x00,0x01,0x15,0xac,0x00,0x01,0x15,0xb8, -0x00,0x01,0x15,0xc4,0x00,0x01,0x15,0xd0,0x00,0x01,0x15,0xdc,0x00,0x01,0x15,0xe8,0x00,0x01,0x13,0x2e,0x00,0x01,0x15,0xf0,0x00,0x01,0x13,0x34,0x00,0x01,0x13,0x3e,0x00,0x01,0x13,0x48,0x00,0x01,0x15,0xf0,0x00,0x01,0x13,0x4e,0x00,0x01,0x13,0x58,0x00,0x01,0x13,0x62,0x00,0x01,0x13,0x6c,0x00,0x01,0x13,0x76,0x00,0x01,0x13,0x80, -0x00,0x01,0x13,0x8a,0x00,0x01,0x13,0x94,0x00,0x01,0x13,0x9e,0x00,0x01,0x13,0xa8,0x00,0x01,0x13,0xb2,0x00,0x01,0x13,0xbc,0x00,0x01,0x13,0xc6,0x00,0x01,0x13,0xd0,0x00,0x01,0x13,0xda,0x00,0x01,0x13,0xe4,0x00,0x01,0x13,0xee,0x00,0x01,0x13,0xf8,0x00,0x01,0x14,0x02,0x00,0x01,0x14,0x0c,0x00,0x01,0x14,0x16,0x00,0x02,0x00,0x01, -0x01,0x4c,0x01,0x50,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0xf5,0x00,0xfb,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0x40,0x01,0x43,0x00,0x00,0x00,0x02,0x20,0xe0,0x20,0xf2,0x00,0x02,0x18,0xfa,0x19,0x0a,0x00,0x02,0x13,0xf6,0x15,0x7e,0x00,0x02,0x13,0xfc,0x15,0x86,0x00,0x02,0x19,0x08,0x19,0x18,0x00,0x02,0x19,0x22,0x19,0x32,0x00,0x02, -0x19,0x3c,0x19,0x4c,0x00,0x02,0x19,0x56,0x19,0x66,0x00,0x02,0x19,0x70,0x19,0x80,0x00,0x02,0x19,0x8a,0x19,0x9a,0x00,0x02,0x19,0xa4,0x19,0xb4,0x00,0x02,0x19,0xbe,0x19,0xce,0x00,0x02,0x19,0xd8,0x19,0xe8,0x00,0x02,0x19,0xf2,0x1a,0x02,0x00,0x02,0x1a,0x0c,0x1a,0x1c,0x00,0x01,0x20,0xaa,0x00,0x01,0x20,0xb8,0x00,0x01,0x20,0xc6, -0x00,0x01,0x1a,0x1a,0x00,0x01,0x1a,0x26,0x00,0x01,0x1a,0x32,0x00,0x01,0x1a,0x3e,0x00,0x01,0x1a,0x4a,0x00,0x01,0x1a,0x56,0x00,0x01,0x1a,0x62,0x00,0x01,0x1a,0x6e,0x00,0x01,0x1a,0x7a,0x00,0x01,0x1a,0x86,0x00,0x01,0x1a,0x92,0x00,0x01,0x1a,0x9e,0x00,0x01,0x1a,0xaa,0x00,0x01,0x1a,0xb6,0x00,0x01,0x1a,0xc2,0x00,0x01,0x1a,0xce, -0x00,0x01,0x1a,0xda,0x00,0x01,0x1a,0xe6,0x00,0x01,0x1a,0xf2,0x00,0x01,0x1a,0xfe,0x00,0x01,0x1b,0x0a,0x00,0x01,0x1b,0x16,0x00,0x01,0x1b,0x22,0x00,0x01,0x1b,0x2e,0x00,0x01,0x1b,0x3a,0x00,0x01,0x1b,0x46,0x00,0x01,0x1b,0x52,0x00,0x01,0x1b,0x5e,0x00,0x01,0x1b,0x6a,0x00,0x02,0x00,0x01,0x02,0xf8,0x03,0x01,0x00,0x00,0x00,0x02, -0x00,0x01,0x02,0xd4,0x02,0xdd,0x00,0x00,0x00,0x04,0x14,0xb8,0x14,0xc4,0x1b,0x62,0x1b,0x70,0x00,0x04,0x14,0xc6,0x14,0xd2,0x1b,0x74,0x1b,0x82,0x00,0x04,0x14,0xd4,0x16,0xcc,0x1b,0x86,0x1b,0x94,0x00,0x04,0x14,0xd6,0x16,0x0e,0x1b,0x98,0x1b,0xa6,0x00,0x04,0x14,0xd8,0x14,0xe4,0x1b,0xaa,0x1b,0xb8,0x00,0x04,0x14,0xe6,0x16,0xc6, -0x1b,0xbc,0x1b,0xca,0x00,0x04,0x14,0xe8,0x14,0xf4,0x1b,0xce,0x1b,0xdc,0x00,0x04,0x14,0xf6,0x16,0xca,0x1b,0xe0,0x1b,0xee,0x00,0x04,0x1f,0xfc,0x20,0x0c,0x20,0x1c,0x20,0x2c,0x00,0x03,0x20,0x32,0x26,0xa4,0x26,0xb6,0x00,0x03,0x20,0x3a,0x26,0xc0,0x26,0xd2,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x46, -0x03,0x57,0x00,0x03,0x1b,0xc8,0x1b,0xd6,0x20,0x32,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x45,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x03,0x14,0xb6,0x16,0x7e,0x1b,0xcc,0x00,0x01,0x00,0x02,0x03,0x5c,0x05,0xb4,0x00,0x03,0x14,0xb2,0x14,0xbe,0x1b,0xca,0x00,0x01,0x00,0x02,0x03,0x46,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x47, -0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x48,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x47,0x04,0x1c,0x00,0x03,0x14,0xa2,0x16,0x5e,0x1b,0xb0,0x00,0x01,0x00,0x02,0x03,0x45,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3e,0x00,0x03,0x1b,0xa6,0x1e,0xf6,0x1f,0xda,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x3d,0x00,0x03,0x14,0x86,0x16,0x06, -0x1b,0xa4,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x03,0x14,0x82,0x16,0xf2,0x1b,0xa2,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1c,0x00,0x03,0x1f,0xba,0x1f,0xca,0x26,0x34,0x00,0x03,0x26,0x3e,0x26,0x50,0x26,0x62,0x00,0x01,0x00,0x02,0x04,0x1c,0x05,0xbe,0x00,0x03,0x1b,0x88,0x1e,0x00,0x1f,0xc2,0x00,0x03,0x14,0x5e,0x15,0xd2, -0x1b,0x8e,0x00,0x01,0x00,0x02,0x03,0x48,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x5c,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x03,0x14,0x4a,0x16,0xa2,0x1b,0x7c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x03,0x16,0x76,0x16,0x82, -0x1b,0x6a,0x00,0x01,0x00,0x02,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x03,0x1b,0x58,0x1d,0xd8,0x1f,0x6a,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x30,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x19,0x00,0x03,0x13,0xfe,0x15,0x42,0x1b,0x4e,0x00,0x01,0x00,0x02,0x03,0x29, -0x03,0x30,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xb5,0x00,0x03,0x13,0xf2,0x16,0x1a,0x1b,0x44,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x03,0x1b,0x2a,0x1d,0x4e,0x1f,0x22,0x00,0x01,0x00,0x02,0x04,0x19, -0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x03,0x13,0xbe,0x15,0xf2,0x1b,0x20,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x22,0x00,0x03,0x13,0xba,0x15,0x22,0x1b,0x1e,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x22,0x00,0x03,0x13,0xb6,0x13,0xc2,0x1b,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x05,0xb4,0x00,0x03,0x13,0xbe,0x15,0xaa, -0x1b,0x1a,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x23,0x00,0x03,0x13,0xba,0x13,0xc6,0x1b,0x18,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1c,0x00,0x03,0x13,0xc2,0x15,0xa2,0x1b,0x16,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b,0x00,0x03,0x13,0xbe,0x13,0xca,0x1b,0x14,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1c,0x00,0x03,0x15,0x5e,0x15,0x82, -0x1b,0x12,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x03,0x13,0xb6,0x14,0xbe,0x1b,0x10,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1c,0x00,0x03,0x13,0xb2,0x15,0x62,0x1b,0x0e,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x03,0x13,0xae,0x14,0xaa,0x1b,0x0c,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1c,0x00,0x03,0x15,0x12,0x15,0x42, -0x1b,0x0a,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b,0x00,0x03,0x13,0x9a,0x13,0xa6,0x1b,0x08,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x45,0x00,0x03,0x13,0xa2,0x13,0xae,0x1b,0x06,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x47,0x00,0x03,0x13,0xaa,0x13,0xb6,0x1b,0x04,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x43,0x00,0x03,0x13,0xb2,0x14,0x06, -0x1b,0x02,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x5c,0x00,0x03,0x13,0xa6,0x14,0x12,0x1a,0xf8,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x3a,0x00,0x03,0x13,0xa2,0x13,0xea,0x1a,0xf6,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x3a,0x00,0x03,0x13,0x9e,0x14,0xb2,0x1a,0xf4,0x00,0x01,0x00,0x02,0x03,0x3a, -0x04,0x19,0x00,0x03,0x13,0x9a,0x13,0xa6,0x1a,0xf2,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x48,0x00,0x01,0x00,0x02,0x00,0xf4,0x01,0xa2,0x00,0x01,0x00,0x02,0x01,0xdd,0x02,0x21,0x00,0x02,0x24,0x34,0x24,0x46,0x00,0x02,0x24,0x52,0x24,0x64,0x00,0x02,0x24,0x70,0x24,0x82,0x00,0x02,0x24,0x8e,0x24,0xa0,0x00,0x01,0x00,0x02,0x03,0x57, -0x04,0x1c,0x00,0x00,0x00,0x05,0x1d,0xa0,0x1d,0xae,0x24,0xa2,0x24,0xb2,0x24,0xc2,0x00,0x05,0x1c,0x2c,0x13,0xc4,0x1a,0xb2,0x1d,0xb0,0x1d,0xbe,0x00,0x05,0x1d,0xc0,0x1d,0xce,0x24,0xba,0x24,0xca,0x24,0xda,0x00,0x05,0x23,0x1c,0x23,0x2a,0x24,0xde,0x24,0xee,0x24,0xfe,0x00,0x05,0x1d,0xc4,0x1d,0xd2,0x25,0x02,0x25,0x12,0x25,0x22, -0x00,0x05,0x1a,0x8e,0x13,0x34,0x1a,0x9a,0x1d,0xd4,0x1d,0xe2,0x00,0x05,0x1d,0xe4,0x1d,0xf2,0x25,0x1a,0x25,0x2a,0x25,0x3a,0x00,0x05,0x1d,0xf4,0x1b,0x68,0x25,0x3e,0x25,0x4e,0x25,0x5e,0x00,0x05,0x1d,0xf6,0x1b,0x4e,0x25,0x62,0x25,0x72,0x25,0x82,0x00,0x05,0x1a,0x76,0x13,0x1c,0x1b,0x2a,0x1d,0xf8,0x1e,0x06,0x00,0x05,0x1e,0x08, -0x1e,0x16,0x25,0x7a,0x25,0x8a,0x25,0x9a,0x00,0x05,0x1e,0x18,0x1e,0x26,0x25,0x9e,0x25,0xae,0x25,0xbe,0x00,0x05,0x1e,0x28,0x1e,0x36,0x25,0xc2,0x25,0xd2,0x25,0xe2,0x00,0x05,0x1e,0x38,0x1e,0x46,0x25,0xe6,0x25,0xf6,0x26,0x06,0x00,0x04,0x26,0x0a,0x26,0x1a,0x2b,0xfa,0x2c,0x0c,0x00,0x04,0x1e,0x3e,0x1e,0x4c,0x26,0x20,0x26,0x30, -0x00,0x04,0x1a,0x32,0x12,0xcc,0x1a,0xda,0x1e,0x50,0x00,0x04,0x1a,0x34,0x1b,0x7e,0x13,0x9a,0x1e,0x54,0x00,0x04,0x1e,0x58,0x1e,0x66,0x26,0x22,0x26,0x32,0x00,0x04,0x1e,0x6a,0x1e,0x78,0x26,0x38,0x26,0x48,0x00,0x04,0x1a,0x22,0x1a,0x2e,0x12,0xa4,0x1e,0x7c,0x00,0x04,0x1e,0x80,0x1e,0x8e,0x26,0x44,0x26,0x54,0x00,0x04,0x1e,0x92, -0x1e,0xa0,0x26,0x5a,0x26,0x6a,0x00,0x04,0x1e,0xa4,0x1e,0xc0,0x1e,0xb2,0x26,0x70,0x00,0x04,0x1a,0x2a,0x1e,0xb6,0x1a,0x12,0x1e,0xc4,0x00,0x04,0x1a,0x14,0x1a,0x20,0x12,0x96,0x1e,0xc8,0x00,0x04,0x1e,0xcc,0x1e,0xda,0x26,0x62,0x26,0x72,0x00,0x04,0x1e,0xde,0x1e,0xec,0x26,0x78,0x26,0x88,0x00,0x04,0x1b,0x10,0x1a,0x0e,0x13,0x2c, -0x1e,0xf0,0x00,0x04,0x1a,0x10,0x1b,0x12,0x1b,0x2c,0x1e,0xf4,0x00,0x04,0x1a,0x12,0x12,0x34,0x1a,0x1e,0x1e,0xf8,0x00,0x04,0x1e,0xfc,0x21,0xa0,0x26,0x70,0x26,0x80,0x00,0x04,0x26,0x86,0x1f,0x00,0x26,0x96,0x26,0xa6,0x00,0x04,0x26,0xac,0x1f,0x04,0x26,0xbc,0x26,0xcc,0x00,0x04,0x1a,0x02,0x12,0x48,0x1a,0xb0,0x1f,0x08,0x00,0x04, -0x1a,0x04,0x1a,0xb2,0x12,0xe6,0x1f,0x0c,0x00,0x04,0x1a,0x06,0x12,0x04,0x1a,0x12,0x1f,0x10,0x00,0x04,0x1a,0x14,0x12,0xd2,0x1a,0x9e,0x1f,0x14,0x00,0x04,0x1f,0x18,0x1f,0x26,0x26,0xaa,0x26,0xba,0x00,0x04,0x1f,0x2a,0x26,0xc0,0x1a,0x0c,0x26,0xd0,0x00,0x04,0x1f,0x2e,0x21,0xc8,0x26,0xd6,0x26,0xe6,0x00,0x04,0x1f,0x32,0x1f,0x40, -0x26,0xec,0x26,0xfc,0x00,0x04,0x1f,0x44,0x1f,0x52,0x27,0x02,0x27,0x12,0x00,0x04,0x1f,0x56,0x21,0x0e,0x27,0x18,0x27,0x28,0x00,0x04,0x1a,0x28,0x1a,0x34,0x1a,0x40,0x1f,0x5a,0x00,0x04,0x1f,0x5e,0x27,0x24,0x19,0xde,0x27,0x34,0x00,0x04,0x1f,0x62,0x1f,0x70,0x1f,0x7e,0x27,0x3a,0x00,0x04,0x19,0xd8,0x1a,0x16,0x1a,0x22,0x1f,0x82, -0x00,0x04,0x1f,0x86,0x1f,0xda,0x27,0x36,0x27,0x46,0x00,0x04,0x19,0xd0,0x11,0x8e,0x19,0xdc,0x1f,0x8a,0x00,0x03,0x27,0x42,0x29,0x66,0x2a,0xb6,0x00,0x03,0x27,0x4a,0x27,0x5a,0x2a,0xc0,0x00,0x03,0x1f,0x7e,0x20,0xb8,0x27,0x62,0x00,0x03,0x20,0xd8,0x20,0xe6,0x27,0x6a,0x00,0x03,0x1f,0x7c,0x1f,0x8a,0x27,0x72,0x00,0x03,0x1f,0x90, -0x1f,0x9e,0x27,0x7a,0x00,0x03,0x1f,0xa4,0x1f,0xb2,0x27,0x82,0x00,0x03,0x1f,0xb8,0x21,0x2c,0x27,0x8a,0x00,0x03,0x1f,0xbe,0x20,0x88,0x27,0x92,0x00,0x03,0x1f,0xc4,0x1f,0xd2,0x27,0x9a,0x00,0x03,0x1f,0xd8,0x1f,0xe6,0x27,0xa2,0x00,0x03,0x1f,0xec,0x1f,0xfa,0x27,0xaa,0x00,0x03,0x20,0x00,0x20,0x0e,0x27,0xb2,0x00,0x03,0x20,0x14, -0x20,0x22,0x27,0xba,0x00,0x06,0x2a,0x6a,0x2a,0x7a,0x2d,0xde,0x2d,0xf0,0x2e,0x02,0x2e,0x14,0x00,0x06,0x20,0x1a,0x27,0xb4,0x2a,0x7c,0x11,0x12,0x27,0xc2,0x27,0xd0,0x00,0x06,0x20,0x18,0x11,0x10,0x0c,0xfc,0x20,0x24,0x27,0xd0,0x27,0xde,0x00,0x06,0x2a,0x70,0x27,0xde,0x19,0x44,0x2a,0x80,0x2a,0x90,0x2a,0xa0,0x00,0x06,0x20,0x14, -0x19,0x44,0x19,0x50,0x19,0x5c,0x27,0xde,0x27,0xec,0x00,0x05,0x27,0xec,0x28,0x5c,0x28,0x6a,0x2a,0x94,0x2a,0xa4,0x00,0x05,0x29,0x16,0x27,0xee,0x20,0x06,0x2a,0xa8,0x2a,0xb8,0x00,0x05,0x20,0x08,0x11,0x82,0x19,0x4e,0x20,0x7e,0x27,0xf0,0x00,0x05,0x29,0x9c,0x2d,0x0c,0x19,0x72,0x29,0xaa,0x2a,0xb0,0x00,0x05,0x27,0xe6,0x2d,0x00, -0x2d,0xb0,0x19,0x66,0x2a,0xb4,0x00,0x05,0x27,0xe8,0x2a,0xb8,0x27,0xf6,0x2a,0xc8,0x2a,0xd8,0x00,0x05,0x27,0xf8,0x2a,0xdc,0x1f,0xe4,0x2a,0xec,0x2a,0xfc,0x00,0x05,0x2b,0x00,0x2b,0x10,0x2d,0x9e,0x2d,0xb0,0x2d,0xc2,0x00,0x05,0x27,0xee,0x1f,0xda,0x1f,0xe8,0x2b,0x14,0x2b,0x24,0x00,0x05,0x27,0xf0,0x2b,0x28,0x27,0xfe,0x2b,0x38, -0x2b,0x48,0x00,0x05,0x28,0x00,0x2b,0x4c,0x28,0x0e,0x2b,0x5c,0x2b,0x6c,0x00,0x05,0x1f,0xd2,0x10,0x6e,0x18,0xd6,0x1f,0xde,0x28,0x10,0x00,0x05,0x20,0x12,0x18,0xfa,0x1f,0xde,0x19,0x14,0x28,0x12,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x45,0x03,0x57,0x00,0x04,0x2b,0x4e,0x2d,0x82,0x28,0x0a,0x2d,0x94,0x00,0x01,0x00,0x03,0x03,0x2e, -0x03,0x57,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x04,0x1c,0x00,0x04,0x27,0xfc,0x2c,0x88,0x1f,0xea,0x2b,0x40,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1c,0x05,0xbe,0x00,0x01,0x00,0x03,0x03,0x2b,0x03,0x30,0x04,0x1b,0x00,0x04,0x2b,0x28,0x2d,0x60,0x2b,0x38,0x2d,0x72, -0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1c,0x04,0x22,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1c,0x05,0xbe,0x00,0x04,0x27,0xba,0x2b,0x20,0x27,0xc8,0x2b,0x30,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x05,0xbe,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x03, -0x03,0x57,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x03,0x03,0xc5,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x34,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x43,0x03,0x5c,0x00,0x02,0x2a,0xe6,0x27,0x7c,0x00,0x02, -0x27,0x84,0x27,0x92,0x00,0x01,0x27,0x9a,0x00,0x07,0x18,0x00,0x2d,0x02,0x2b,0x72,0x10,0x1c,0x17,0xe8,0x2a,0xe6,0x2a,0xf4,0x00,0x07,0x27,0x94,0x2e,0x02,0x27,0xa2,0x27,0xae,0x0f,0x64,0x2a,0xf2,0x2b,0x00,0x00,0x06,0x27,0xaa,0x27,0xb6,0x0f,0x60,0x27,0xc2,0x27,0xce,0x2a,0xfe,0x00,0x06,0x2a,0xfe,0x1e,0xce,0x1e,0xdc,0x2b,0x0c, -0x2b,0x1a,0x2c,0xc4,0x00,0x06,0x27,0xbe,0x17,0xb8,0x27,0xca,0x0f,0x50,0x27,0xd6,0x2b,0x1a,0x00,0x06,0x1e,0xce,0x27,0xd4,0x27,0xe0,0x2b,0x28,0x0f,0xd2,0x2b,0x1a,0x00,0x06,0x27,0xde,0x2b,0x1a,0x2c,0xaa,0x17,0xa8,0x0f,0xc4,0x2b,0x28,0x00,0x04,0x0f,0x32,0x0f,0x38,0x0f,0x3e,0x0f,0x44,0x00,0x04,0x0f,0x40,0x0f,0x46,0x0f,0x4c, -0x0f,0x52,0x00,0x04,0x0f,0x4e,0x0f,0x54,0x0f,0x5a,0x0f,0x60,0x00,0x04,0x0f,0x5c,0x0f,0x62,0x0f,0x68,0x0f,0x6e,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x01,0x00,0x08,0x17,0x76,0x1e,0x8e,0x2a,0xf8,0x17,0x90,0x2b,0x48,0x2b,0x04,0x2c,0x7c,0x2c,0x8a,0x00,0x08,0x2b,0x5a,0x0f,0x8c,0x2b,0x66,0x2a,0xfe,0x2b,0x4e,0x0f,0x5c,0x2c,0x86, -0x2c,0x94,0x00,0x08,0x2c,0x90,0x2a,0xf8,0x27,0x88,0x17,0x5e,0x27,0x96,0x2d,0x6a,0x2d,0x7a,0x2d,0x8a,0x00,0x07,0x2b,0x1e,0x2a,0xf6,0x2b,0x36,0x0f,0x5c,0x0f,0x68,0x0f,0x44,0x2c,0x8c,0x00,0x07,0x2c,0x8a,0x2c,0x98,0x2d,0xd0,0x2a,0xf2,0x1e,0x54,0x2d,0x78,0x2d,0x88,0x00,0x01,0x00,0x04,0x00,0x84,0x00,0x8c,0x01,0x47,0x01,0x4f, -0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x60,0x00,0xbd,0x01,0x22,0x00,0x01,0x00,0x04,0x03,0x90,0x03,0x91,0x06,0x23,0x06,0x24,0x00,0x01,0x00,0x04,0x01,0x0d,0x01,0x0e,0x01,0x0f,0x02,0x36,0x00,0x01,0x00,0x04,0x05,0xb5,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x00,0x01,0x00,0x01,0x03,0x20,0x00,0x08,0x2c,0x54,0x16,0xf8,0x2c,0x60,0x2c,0x6c, -0x2c,0x78,0x2c,0x84,0x2a,0xb0,0x2d,0x46,0x00,0x08,0x2c,0x7e,0x2c,0x8a,0x2c,0x96,0x2c,0xa2,0x2c,0xae,0x2c,0xba,0x0a,0x20,0x2d,0x42,0x00,0x08,0x2c,0xb4,0x0e,0xca,0x2d,0x6c,0x2d,0x7c,0x2d,0x8c,0x2d,0x9c,0x2d,0x3e,0x2d,0x4c,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0xbd,0x00,0x01,0x00,0x02,0x00,0x60,0x01,0x22,0x00,0x09,0x2a,0x76, -0x2a,0x82,0x2a,0x8e,0x0e,0xb4,0x2d,0xa6,0x2d,0x8a,0x2a,0x9a,0x0e,0xc0,0x2d,0x98,0x00,0x01,0x00,0x05,0x03,0xc3,0x03,0xc5,0x06,0x1c,0x06,0x42,0x06,0x43,0x00,0x01,0x00,0x05,0x02,0xdc,0x02,0xec,0x02,0xf6,0x03,0x00,0x03,0x0a,0x00,0x01,0x00,0x05,0x02,0xd9,0x02,0xe9,0x02,0xf3,0x02,0xfd,0x03,0x07,0x00,0x02,0x00,0x01,0x02,0xee, -0x02,0xf7,0x00,0x00,0x00,0x01,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3e,0x00,0x02,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x06,0xce,0x06,0xce,0x00,0x02,0x00,0x02,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x01,0x00,0x06,0x01,0x13,0x01,0x14,0x01,0x16,0x01,0x17,0x01,0x18,0x01,0x19, -0x00,0x09,0x2d,0x32,0x2d,0x3e,0x2d,0x6e,0x2d,0x8a,0x2d,0x9a,0x2d,0x4a,0x2d,0x56,0x2d,0x62,0x2d,0x7c,0x00,0x01,0x00,0x05,0x03,0x29,0x03,0x32,0x03,0x33,0x03,0xbe,0x05,0xc6,0x00,0x02,0x00,0x02,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e,0x06,0x76,0x00,0x05,0x00,0x02,0x00,0x02,0x00,0xa2,0x00,0xa6,0x00,0x00,0x01,0x6a,0x01,0x6e, -0x00,0x05,0x00,0x02,0x00,0x02,0x06,0x77,0x06,0x79,0x00,0x00,0x06,0x7b,0x06,0x7f,0x00,0x03,0x00,0x01,0x00,0x08,0x00,0xff,0x01,0x07,0x01,0x0b,0x01,0x0d,0x01,0x90,0x02,0x34,0x02,0x36,0x02,0x49,0x00,0x02,0x00,0x02,0x02,0xd4,0x02,0xdd,0x00,0x00,0x04,0x15,0x04,0x15,0x00,0x0a,0x00,0x02,0x00,0x05,0x02,0xd4,0x02,0xde,0x00,0x01, -0x03,0x57,0x03,0x57,0x00,0x03,0x04,0x1b,0x04,0x1b,0x00,0x04,0x04,0x1c,0x04,0x1c,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x05,0x00,0x02,0x00,0x06,0x00,0x01,0x00,0xbc,0x00,0x01,0x01,0xc8,0x01,0xfe,0x00,0x01,0x02,0x03,0x02,0x03,0x00,0x01,0x02,0x05,0x02,0x0a,0x00,0x01,0x02,0x51,0x02,0x74,0x00,0x01,0x02,0xa0,0x02,0xb9,0x00,0x01, -0x00,0x02,0x00,0x06,0x06,0x68,0x06,0x6c,0x00,0x01,0x06,0x6e,0x06,0x78,0x00,0x01,0x06,0x7a,0x06,0x7c,0x00,0x01,0x06,0x80,0x06,0x8a,0x00,0x01,0x06,0xb0,0x06,0xb0,0x00,0x01,0x06,0xb4,0x06,0xbb,0x00,0x01,0x00,0x02,0x00,0x06,0x06,0x8e,0x06,0x9a,0x00,0x01,0x06,0x9c,0x06,0x9e,0x00,0x01,0x06,0xa0,0x06,0xa2,0x00,0x01,0x06,0xa5, -0x06,0xaf,0x00,0x01,0x06,0xb1,0x06,0xb1,0x00,0x01,0x06,0xbc,0x06,0xc3,0x00,0x01,0x00,0x02,0x00,0x06,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e,0x06,0x78,0x00,0x05,0x06,0x7a,0x06,0x7c,0x00,0x10,0x06,0x80,0x06,0x8a,0x00,0x13,0x06,0xb0,0x06,0xb0,0x00,0x1e,0x06,0xb4,0x06,0xbb,0x00,0x1f,0x00,0x02,0x00,0x06,0x00,0x01,0x00,0xbc, -0x00,0x00,0x01,0xc8,0x01,0xfe,0x00,0xbc,0x02,0x03,0x02,0x03,0x00,0xf3,0x02,0x05,0x02,0x0a,0x00,0xf4,0x02,0x51,0x02,0x74,0x00,0xfa,0x02,0xa0,0x02,0xb9,0x01,0x1e,0x00,0x02,0x00,0x07,0x00,0x01,0x00,0xbc,0x00,0x00,0x01,0xc8,0x01,0xfe,0x00,0xbc,0x02,0x03,0x02,0x03,0x00,0xf3,0x02,0x05,0x02,0x0a,0x00,0xf4,0x02,0x51,0x02,0x74, -0x00,0xfa,0x02,0xa0,0x02,0xb9,0x01,0x1e,0x02,0xd4,0x02,0xde,0x01,0x38,0x00,0x02,0x00,0x03,0x01,0x51,0x01,0x53,0x00,0x00,0x01,0x55,0x01,0x56,0x00,0x03,0x01,0x5b,0x01,0x68,0x00,0x05,0x00,0x01,0x00,0x0f,0x01,0x70,0x01,0x71,0x01,0x72,0x01,0x73,0x01,0x74,0x01,0x75,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0xdf,0x01,0xe0,0x02,0x23, -0x02,0x24,0x02,0x77,0x02,0x7f,0x00,0x01,0x00,0x0f,0x02,0xd6,0x02,0xda,0x02,0xdd,0x02,0xe6,0x02,0xea,0x02,0xed,0x02,0xf0,0x02,0xf4,0x02,0xf7,0x02,0xfa,0x02,0xfe,0x03,0x01,0x03,0x04,0x03,0x08,0x03,0x0b,0x00,0x01,0x00,0x10,0x00,0x51,0x00,0x52,0x01,0x10,0x01,0x11,0x01,0x12,0x01,0xd1,0x01,0xd5,0x01,0xd6,0x01,0xf8,0x02,0x15, -0x02,0x19,0x02,0x1a,0x02,0x3c,0x02,0x5a,0x02,0x72,0x02,0x7e,0x00,0x02,0x03,0x41,0x03,0x42,0x00,0x02,0x03,0xae,0x06,0xce,0x00,0x02,0x03,0x9a,0x03,0xa5,0x00,0x02,0x03,0x9c,0x06,0xce,0x00,0x02,0x06,0x42,0x06,0xce,0x00,0x02,0x06,0x59,0x06,0xce,0x00,0x03,0x02,0xe5,0x02,0xf9,0x03,0x03,0x00,0x03,0x02,0xe6,0x02,0xfa,0x03,0x04, -0x00,0x03,0x02,0xe7,0x02,0xfb,0x03,0x05,0x00,0x03,0x02,0xe8,0x02,0xfc,0x03,0x06,0x00,0x03,0x02,0xe9,0x02,0xfd,0x03,0x07,0x00,0x03,0x02,0xea,0x02,0xfe,0x03,0x08,0x00,0x03,0x02,0xeb,0x02,0xff,0x03,0x09,0x00,0x03,0x02,0xec,0x03,0x00,0x03,0x0a,0x00,0x03,0x02,0xed,0x03,0x01,0x03,0x0b,0x00,0x03,0x03,0x8c,0x03,0x8d,0x06,0xce, -0x00,0x03,0x03,0x76,0x03,0x9b,0x06,0xce,0x00,0x03,0x06,0x12,0x06,0x2c,0x06,0xce,0x00,0x03,0x06,0x0c,0x06,0x0d,0x06,0xce,0x00,0x04,0x02,0xde,0x02,0xe4,0x02,0xf8,0x03,0x02,0x00,0x04,0x03,0x7f,0x03,0x80,0x03,0x92,0x06,0xce,0x00,0x04,0x03,0x79,0x03,0x8e,0x03,0x9e,0x06,0xce,0x00,0x05,0x03,0x97,0x03,0xa6,0x03,0xa7,0x06,0x3c, -0x06,0xce,0x00,0x05,0x03,0x7e,0x03,0xa0,0x03,0xa1,0x03,0xa2,0x06,0xce,0x00,0x05,0x03,0x6e,0x03,0x7b,0x03,0x8f,0x06,0x11,0x06,0xce,0x00,0x05,0x03,0xa4,0x03,0xb0,0x03,0xb1,0x06,0x0b,0x06,0xce,0x00,0x05,0x04,0x3b,0x06,0x1d,0x06,0x1e,0x06,0x45,0x06,0xce,0x00,0x06,0x03,0x82,0x03,0x87,0x03,0x94,0x03,0x95,0x03,0x9f,0x06,0xce, -0x00,0x06,0x03,0x75,0x06,0x52,0x06,0x53,0x06,0x55,0x06,0x5b,0x06,0xce,0x00,0x07,0x03,0x20,0x03,0x99,0x03,0xab,0x03,0xad,0x03,0xaf,0x06,0x56,0x06,0xce,0x00,0x09,0x03,0x40,0x03,0x84,0x03,0x85,0x03,0x93,0x03,0x9d,0x06,0x20,0x06,0x2d,0x06,0x39,0x06,0xce,0x00,0x0a,0x03,0x70,0x03,0x7a,0x03,0x7c,0x06,0x13,0x06,0x36,0x06,0x3e, -0x06,0x3f,0x06,0x40,0x06,0x48,0x06,0xce,0x00,0x0c,0x03,0x73,0x03,0x74,0x03,0x7d,0x03,0x81,0x03,0x8b,0x06,0x28,0x06,0x38,0x06,0x3a,0x06,0x4c,0x06,0x4e,0x06,0x51,0x06,0xce,0x00,0x0f,0x03,0x6c,0x03,0x6d,0x03,0x77,0x03,0x78,0x06,0x0f,0x06,0x14,0x06,0x2a,0x06,0x31,0x06,0x34,0x06,0x35,0x06,0x3b,0x06,0x44,0x06,0x4f,0x06,0x58, -0x06,0xce,0x00,0x19,0x03,0x83,0x03,0x86,0x03,0x89,0x03,0x90,0x03,0x91,0x03,0x96,0x03,0xa3,0x03,0xa8,0x03,0xa9,0x03,0xac,0x06,0x0e,0x06,0x17,0x06,0x19,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x29,0x06,0x2e,0x06,0x32,0x06,0x47,0x06,0x49,0x06,0x50,0x06,0x5d,0x06,0xce,0x00,0x02,0x00,0x08,0x03,0x2b,0x03,0x2b,0x00,0x00, -0x03,0x42,0x03,0x42,0x00,0x01,0x06,0x68,0x06,0x6c,0x00,0x02,0x06,0x6e,0x06,0x78,0x00,0x07,0x06,0x7a,0x06,0x7c,0x00,0x12,0x06,0x80,0x06,0x8a,0x00,0x15,0x06,0xb0,0x06,0xb0,0x00,0x20,0x06,0xb4,0x06,0xbb,0x00,0x21,0x00,0x22,0x03,0x6f,0x03,0x71,0x03,0x72,0x03,0x88,0x03,0x8a,0x03,0x98,0x03,0xaa,0x06,0x10,0x06,0x16,0x06,0x18, -0x06,0x1a,0x06,0x1b,0x06,0x1c,0x06,0x1f,0x06,0x25,0x06,0x26,0x06,0x27,0x06,0x2b,0x06,0x2f,0x06,0x30,0x06,0x33,0x06,0x37,0x06,0x3d,0x06,0x41,0x06,0x43,0x06,0x46,0x06,0x4a,0x06,0x4b,0x06,0x4d,0x06,0x54,0x06,0x57,0x06,0x5a,0x06,0x5c,0x06,0xce,0x00,0x02,0x00,0x0b,0x00,0xa2,0x00,0xa6,0x00,0x00,0x00,0xf4,0x00,0xf4,0x00,0x05, -0x01,0x13,0x01,0x14,0x00,0x06,0x01,0x16,0x01,0x1a,0x00,0x08,0x01,0x4c,0x01,0x50,0x00,0x0d,0x01,0x6a,0x01,0x6e,0x00,0x12,0x01,0x70,0x01,0x78,0x00,0x17,0x01,0xdf,0x01,0xe0,0x00,0x20,0x02,0x23,0x02,0x24,0x00,0x22,0x02,0x77,0x02,0x77,0x00,0x24,0x02,0x7f,0x02,0x7f,0x00,0x25,0x00,0x01,0x00,0x24,0x02,0xd4,0x02,0xd5,0x02,0xd6, -0x02,0xd7,0x02,0xd8,0x02,0xd9,0x02,0xda,0x02,0xdb,0x02,0xdc,0x02,0xdd,0x03,0x29,0x03,0x2b,0x03,0x2c,0x03,0x2e,0x03,0x30,0x03,0x32,0x03,0x34,0x03,0x3a,0x03,0x3d,0x03,0x3e,0x03,0x43,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x57,0x03,0x5c,0x03,0xc5,0x04,0x15,0x04,0x19,0x04,0x1b,0x04,0x1c,0x04,0x22,0x05,0xb4,0x05,0xb5, -0x05,0xbe,0x00,0x02,0x00,0x0e,0x00,0xff,0x00,0xff,0x00,0x00,0x01,0x07,0x01,0x07,0x00,0x01,0x01,0x0b,0x01,0x0b,0x00,0x02,0x01,0x0d,0x01,0x0d,0x00,0x03,0x01,0x90,0x01,0x90,0x00,0x04,0x02,0x34,0x02,0x34,0x00,0x05,0x02,0x36,0x02,0x36,0x00,0x06,0x02,0x49,0x02,0x49,0x00,0x07,0x06,0x68,0x06,0x6c,0x00,0x08,0x06,0x6e,0x06,0x78, -0x00,0x0d,0x06,0x7a,0x06,0x7c,0x00,0x18,0x06,0x80,0x06,0x8a,0x00,0x1b,0x06,0xb0,0x06,0xb0,0x00,0x26,0x06,0xb4,0x06,0xbb,0x00,0x27,0x00,0x02,0x00,0x13,0x00,0x51,0x00,0x52,0x00,0x00,0x00,0xf4,0x00,0xf4,0x00,0x02,0x01,0x10,0x01,0x14,0x00,0x03,0x01,0x16,0x01,0x19,0x00,0x08,0x01,0x40,0x01,0x43,0x00,0x0c,0x01,0x51,0x01,0x53, -0x00,0x10,0x01,0x55,0x01,0x56,0x00,0x13,0x01,0x5b,0x01,0x68,0x00,0x15,0x01,0x70,0x01,0x78,0x00,0x23,0x01,0xd1,0x01,0xd1,0x00,0x2c,0x01,0xd5,0x01,0xd6,0x00,0x2d,0x01,0xdf,0x01,0xe0,0x00,0x2f,0x01,0xf8,0x01,0xf8,0x00,0x31,0x02,0x15,0x02,0x15,0x00,0x32,0x02,0x19,0x02,0x1a,0x00,0x33,0x02,0x23,0x02,0x24,0x00,0x35,0x02,0x3c, -0x02,0x3c,0x00,0x37,0x02,0x77,0x02,0x77,0x00,0x38,0x02,0x7e,0x02,0x7f,0x00,0x39,0x00,0x02,0x00,0x13,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x01,0x00,0x84,0x00,0x84,0x00,0x02,0x00,0x8c,0x00,0x8c,0x00,0x03,0x00,0xbd,0x00,0xbd,0x00,0x04,0x00,0xff,0x00,0xff,0x00,0x05,0x01,0x22,0x01,0x22,0x00,0x06,0x01,0x47, -0x01,0x47,0x00,0x07,0x01,0x4a,0x01,0x4a,0x00,0x08,0x01,0x4f,0x01,0x4f,0x00,0x09,0x02,0xf8,0x03,0x01,0x00,0x0a,0x03,0x42,0x03,0x42,0x00,0x14,0x04,0x23,0x04,0x23,0x00,0x15,0x06,0x68,0x06,0x6c,0x00,0x16,0x06,0x6e,0x06,0x78,0x00,0x1b,0x06,0x7a,0x06,0x7c,0x00,0x26,0x06,0x80,0x06,0x8a,0x00,0x29,0x06,0xb0,0x06,0xb0,0x00,0x34, -0x06,0xb4,0x06,0xbb,0x00,0x35,0x05,0xc3,0x00,0x03,0x01,0x22,0x03,0x29,0x00,0x01,0x00,0x01,0x00,0x5a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2d,0x00,0x01, -0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x31,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, -0x00,0x00,0x00,0x42,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x99,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00, -0x00,0xa2,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa4,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xaa,0x00,0x01,0x06,0xce,0x00,0x01, -0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb5,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xcc,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xce,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd0, -0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xee,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00, -0x00,0x01,0x00,0x00,0x01,0x0e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x10,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x12,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x17,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x1d,0x00,0x01, -0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x3d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x42,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x49,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x5c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, -0x00,0x00,0x01,0x61,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x63,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x65,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x67,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6b,0x00,0x01,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x71,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x73,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x77,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00, -0x01,0x79,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x81,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x83,0x00,0x01,0x06,0xce,0x00,0x01, -0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x85,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x87,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x89,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8d, -0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x93,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x48,0x03,0x48,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, -0x00,0x00,0x00,0x17,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x44,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01, -0x00,0x00,0x00,0x77,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x96,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x00,0xb2,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01, -0x00,0x00,0x00,0xbd,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc9,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe4,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xeb,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, -0x00,0x00,0x00,0xf0,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x22,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x25,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01, -0x00,0x00,0x01,0x28,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x2e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x34,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x37,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, -0x00,0x00,0x01,0x3a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x3f,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x00,0x00,0x31, -0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x57,0x00,0x00,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x01,0x04,0x15, -0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb5, -0x05,0xb5,0x00,0x00,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x01,0x05,0xb4,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00, -0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x01,0x03,0x29, -0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x05,0xb4,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb4,0x05,0xb4,0x00,0x00,0x00,0x01,0x04,0x23,0x00,0x01,0x00,0x01, -0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0xc5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0xc5,0x03,0xc5,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x15,0x00,0x00, -0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x45,0x00,0x00,0x00,0x01,0x03,0x3a, -0x00,0x01,0x00,0x01,0x03,0x47,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x47,0x03,0x47,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x43,0x03,0x43,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01, -0x03,0x2e,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d,0x00,0x00,0x06,0xb8,0x00,0x02,0x06,0x6b,0x06,0xb9,0x00,0x02,0x06,0x6a,0x06,0xba,0x00,0x02,0x06,0x74,0x06,0xbb,0x00,0x02,0x06,0x72,0x06,0xb4,0x00,0x02,0x06,0x6b,0x06,0xb5, -0x00,0x02,0x06,0x6a,0x06,0xb6,0x00,0x02,0x06,0x74,0x06,0xb7,0x00,0x02,0x06,0x72,0x06,0xc0,0x00,0x02,0x06,0x91,0x06,0xc1,0x00,0x02,0x06,0x90,0x06,0xc2,0x00,0x02,0x06,0x99,0x06,0xc3,0x00,0x02,0x06,0x97,0x06,0xbc,0x00,0x02,0x06,0x91,0x06,0xbd,0x00,0x02,0x06,0x90,0x06,0xbe,0x00,0x02,0x06,0x99,0x06,0xbf,0x00,0x02,0x06,0x97, -0x00,0x01,0x00,0x04,0x06,0x6e,0x06,0x70,0x06,0x93,0x06,0x95,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe7,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x47,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x48,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4d,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8d,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x93,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x94,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xad,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xae,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xba,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xbb,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x01,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x31,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x32,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x4b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x4e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4f,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x5a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x01,0x06,0xce,0x00,0x01, -0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x01,0x06,0xce,0x00,0x01, -0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x01,0x06,0xce,0x00,0x01, -0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x02,0x06,0xce,0x06,0xce, -0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x45, -0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x01, -0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xd6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, -0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x08,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x15,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x1f,0x00,0x00,0x00,0x01, -0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x01,0x20,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00, -0x00,0x2d,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x03,0x57,0x00,0x01, -0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xee,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x00,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x1d,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x61,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57, -0x00,0x01,0x00,0x00,0x01,0x63,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xb4,0x00,0x01,0x00,0x00,0x01,0x65,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x00,0x01,0x6b,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6d,0x00,0x00, -0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x01,0x71,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x73,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x01,0x77,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01, -0x00,0x00,0x01,0x7d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x00,0x01,0x81,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x00,0x01,0x85,0x00,0x00,0x00,0x01, -0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x01,0x8b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x01,0x8d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x8f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x00, -0x01,0x93,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01, -0x03,0x3d,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01, -0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x57, -0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1b,0x04,0x1b,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x03,0x57,0x03,0x57,0x00,0x00, -0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x3d, -0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce, -0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00, -0x00,0x68,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x01,0x01,0x13,0x00,0x01,0x00,0x01,0x01,0x13,0x00,0x01,0x00,0x00,0x01,0xa3,0x00,0x01,0x00,0x53,0x00,0x01,0x00,0x01,0x00,0x53,0x00,0x01,0x00,0x00,0x01,0xa4,0x00,0x01,0x01,0x7e,0x00,0x01,0x00,0x01,0x01,0x7e,0x00,0x01, -0x00,0x00,0x01,0xa5,0x00,0x01,0x01,0x93,0x00,0x01,0x00,0x01,0x01,0x93,0x00,0x01,0x00,0x00,0x01,0xa6,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x03,0x03,0x45,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x03,0x03,0x57,0x03,0x45,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x01, -0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x47,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x01, -0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4b,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00, -0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x03,0x3d,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x02, -0x04,0x15,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x15,0x04,0x15,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x00,0x00,0x5f,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x00,0x00,0x00, -0x00,0x01,0x00,0x03,0x03,0x29,0x03,0x29,0x03,0x29,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01, -0x00,0x00,0x00,0xd3,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2c,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x30, -0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x30,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x02,0x05,0xb5,0x05,0xb5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xb5,0x05,0xb5,0x05,0xb5,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x03,0x46,0x03,0x46, -0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x42,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03, -0x03,0x29,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x00, -0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe, -0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01, -0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x03,0x5c,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01, -0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x00,0xe0,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x01,0x0e,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x17,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03, -0x04,0x1b,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1b,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x42, -0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22, -0x00,0x01,0x00,0x00,0x01,0x5c,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x01,0x89,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x00,0x00,0x00, -0x00,0x01,0x00,0x03,0x03,0x30,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x05,0xbe, -0x05,0xbe,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0xc5,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c, -0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x5c,0x03,0x43,0x03,0x43,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01, -0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x48,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x04,0x19, -0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01, -0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19, -0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x45,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x02,0x06,0xce, -0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x88,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x88,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01, -0x00,0x00,0x00,0x89,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8a,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1b,0x00,0x03,0x06,0xce,0x06,0xce, -0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00, -0x00,0x71,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3a, -0x00,0x01,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d, -0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0x58,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x5a,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x61,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x29, -0x00,0x01,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x01,0x00,0x00,0x00,0x63,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c, -0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xa0,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0xd8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xda,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xdc,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2b, -0x00,0x01,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0xde,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x0a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x0b,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30, -0x00,0x01,0x00,0x00,0x01,0x0c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x19,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb5,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x1b,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x03,0x03,0x57, -0x03,0x46,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x57,0x03,0x46,0x03,0x46,0x03,0x46,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c, -0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00, -0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x01,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe, -0x00,0x01,0x00,0x00,0x00,0x8c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xab,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x5c, -0x00,0x01,0x00,0x00,0x00,0xb3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xe5,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57, -0x00,0x01,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xf1,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x19, -0x00,0x01,0x00,0x00,0x00,0xf4,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x25,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x26,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b, -0x00,0x01,0x00,0x00,0x01,0x31,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x34,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x35,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x37,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19, -0x00,0x01,0x00,0x00,0x01,0x38,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3a,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b, -0x00,0x01,0x00,0x00,0x01,0x40,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b, -0x00,0x01,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x3a,0x03,0x57, -0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b, -0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b, -0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43, -0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0xb8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfa,0x00,0x00, -0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0xfb,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x44,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x45,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x3d, -0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xa2,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x03,0x03,0x2e,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x19,0x04,0x19, -0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x49,0x00,0x00,0x00,0x01,0x00,0x04, -0x03,0x2e,0x03,0x57,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00, -0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x01,0x98,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x99,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01, -0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x29, -0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01, -0x03,0x2e,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x46,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57, -0x03,0x46,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00, -0x00,0x01,0x00,0x04,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x03,0x03,0x57,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x03,0x00,0x01, -0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x05,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x45,0x00,0x01, -0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xba,0x00,0x02, -0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xbe,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x02, -0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xca,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01, -0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xec,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x22,0x00,0x00, -0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x23,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x28,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x29,0x00,0x01, -0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x19,0x04,0x19,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x02, -0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x01, -0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34, -0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xa8,0x00,0x02,0x03,0x30,0x03,0x43, -0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xb5,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43, -0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01, -0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3a, -0x00,0x01,0x00,0x00,0x00,0x29,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x2b,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce, -0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe7,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe9,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57, -0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x01,0x00,0x02, -0x03,0x34,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, -0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x9c,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x99,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x19, -0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0xc5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02, -0x04,0x1c,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x03,0x48, -0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x04,0x03,0x2e,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc5,0x00,0x01,0x06,0xce, -0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc7,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2f,0x00,0x00,0x00,0x01, -0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x00,0x00,0xa6,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x10,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02, -0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19, -0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00, -0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01, -0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x04,0x00,0x00, -}; - -read_only global String8 rd_default_code_font_bytes = {rd_default_code_font_bytes__data, sizeof(rd_default_code_font_bytes__data)}; -read_only global U8 rd_icon_file_bytes__data[] = -{ -0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x00,0x02,0x1e,0x00,0x00,0x16,0x00,0x00,0x00,0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x00,0x00,0x5c,0x72,0xa8,0x66,0x00,0x00,0x1d,0xc9,0x49,0x44,0x41,0x54,0x78, -0x9c,0xed,0xdd,0x7b,0x7c,0x14,0xe5,0xbd,0xc7,0xf1,0xcf,0x6e,0xb2,0x9b,0x04,0x12,0x20,0x10,0xae,0xe2,0x25,0x52,0x06,0x05,0xe5,0x12,0x14,0x6f,0xc7,0x56,0x99,0x5a,0xd4,0xaa,0xd5,0xda,0x8b,0xb7,0xa2,0x55,0x4f,0x6d,0x6b,0xab,0xb5,0xf6,0x72,0x7a,0xb1,0xb5,0x1e,0x41,0xce,0xd1,0xb6,0x5a,0x4f,0xeb,0xa9,0x56,0x8b,0x37,0xb4,0x5a, -0xfb,0xaa,0x56,0x5a,0xa4,0x1d,0xb5,0x20,0x2d,0x95,0x8a,0x8a,0xf5,0xa0,0x83,0x8a,0x37,0x10,0x08,0x90,0x70,0x0b,0xe4,0xb6,0x7b,0xfe,0x98,0x8d,0x44,0x48,0x42,0x36,0xf3,0xcc,0xfc,0x66,0x77,0x7e,0xef,0xd7,0x8b,0x57,0xbc,0x24,0xcf,0xf3,0xcb,0x32,0xcf,0x77,0x9f,0x99,0x9d,0x79,0x1e,0x50,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5, -0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x54,0xe1,0x4a,0x48,0x17,0xa0,0x82,0xe5,0x58,0x54,0x01,0xd5,0xc0,0xa0,0x4e,0x5f,0x3b,0xff,0x33,0x40,0x23,0xd0,0x90,0xfb,0xda,0xf9,0x9f,0x1b,0x6c,0x97,0x6d,0x61,0xd7,0xac,0xc2,0xa3,0x01,0x50,0xa0,0x1c,0x8b,0xa1,0xc0,0x54,0x60,0x0a,0x70,0x30,0x7b, -0x0f,0xec,0x6a,0x60,0x20,0x50,0xe2,0xb3,0xab,0x76,0x60,0x0b,0x9d,0x42,0x81,0xdd,0x41,0xf1,0x06,0xf0,0x3c,0xf0,0x9c,0xed,0x52,0xef,0xb3,0x1f,0x25,0x40,0x03,0xa0,0x00,0x38,0x16,0xfb,0x03,0x75,0x78,0x83,0xbd,0x2e,0xf7,0x67,0x3f,0xd1,0xa2,0xf6,0xb6,0x06,0x58,0xde,0xf9,0x8f,0xed,0xf2,0xae,0x6c,0x49,0x6a,0x5f,0x34,0x00,0x22, -0xc4,0xb1,0x48,0xe0,0xbd,0x9b,0xd7,0x75,0xfa,0x33,0x05,0x18,0x2a,0x59,0x97,0x0f,0xf5,0x78,0x33,0x84,0xce,0xa1,0xf0,0xba,0x6c,0x49,0xaa,0x33,0x0d,0x80,0x88,0x70,0x2c,0x7e,0x0f,0x9c,0x80,0x37,0x6d,0x2f,0x66,0x5b,0x80,0xa7,0x6d,0x97,0x33,0xa5,0x0b,0x51,0x1a,0x00,0x91,0xe0,0x58,0xd4,0xe2,0x9d,0x4f,0xc7,0x49,0xad,0xed,0xf2, -0xa6,0x74,0x11,0x71,0x97,0x94,0x2e,0x40,0x01,0x30,0x5d,0xba,0x00,0x01,0x71,0xfc,0x9d,0x23,0x47,0x03,0x20,0x1a,0xe2,0x38,0x18,0xe2,0xf8,0x3b,0x47,0x8e,0x06,0x40,0x34,0x9c,0x28,0x5d,0x80,0x80,0x38,0xfe,0xce,0x91,0xa3,0x01,0x20,0xcc,0xb1,0x38,0x04,0x18,0x29,0x5d,0x87,0x80,0x51,0x8e,0xc5,0x38,0xe9,0x22,0xe2,0x4e,0x03,0x40, -0x5e,0x9c,0xa7,0xc2,0x71,0xfe,0xdd,0x23,0x41,0x03,0x40,0x5e,0x9c,0x07,0x41,0x9c,0x7f,0xf7,0x48,0xd0,0x8f,0x01,0x05,0xe5,0x6e,0xfc,0xa9,0x07,0x86,0x48,0xd7,0x22,0x64,0x23,0x30,0xcc,0x76,0xc9,0x4a,0x17,0x12,0x57,0x3a,0x03,0x90,0x35,0x91,0xf8,0x0e,0x7e,0x80,0x1a,0xe0,0x70,0xe9,0x22,0xe2,0x4c,0x03,0x40,0x96,0x4e,0x81,0xf5, -0x35,0x10,0xa5,0x01,0x20,0x4b,0x0f,0x7e,0x7d,0x0d,0x44,0xe9,0x35,0x00,0x21,0x8e,0x45,0x09,0xb0,0x19,0x18,0x20,0x5d,0x8b,0xb0,0x2d,0xc0,0x10,0xdb,0xa5,0x5d,0xba,0x90,0x38,0xd2,0x19,0x80,0x9c,0xa9,0xe8,0xe0,0x07,0xef,0xe1,0xa7,0x3a,0xe9,0x22,0xe2,0x4a,0x03,0x40,0x8e,0x4e,0x7d,0x77,0xd3,0xd7,0x42,0x88,0x06,0x80,0x1c,0x3d, -0xe8,0x77,0xd3,0xd7,0x42,0x88,0x5e,0x03,0x10,0xe0,0x58,0xa4,0xf1,0x96,0xd6,0xea,0x27,0x5d,0x4b,0x44,0x34,0x01,0x83,0x6c,0x97,0x56,0xe9,0x42,0xe2,0x46,0x67,0x00,0x32,0x8e,0x42,0x07,0x7f,0x67,0xfd,0xf0,0x5e,0x13,0x15,0x32,0x0d,0x00,0x19,0x3a,0xe5,0xdd,0x9b,0xbe,0x26,0x02,0x34,0x00,0x64,0xe8,0xc1,0xbe,0x37,0x7d,0x4d,0x04, -0xe8,0x35,0x80,0x90,0x39,0x16,0x15,0x78,0x4b,0x6a,0xa7,0xa5,0x6b,0x89,0x98,0x66,0xa0,0xda,0x76,0xd9,0x29,0x5d,0x48,0x9c,0xe8,0x0c,0x20,0x7c,0xc7,0xa1,0x83,0xbf,0x2b,0x65,0xc0,0xb1,0xd2,0x45,0xc4,0x8d,0x06,0x40,0xf8,0x74,0xaa,0xdb,0x3d,0x7d,0x6d,0x42,0xa6,0x01,0x10,0x3e,0x3d,0xc8,0xbb,0xa7,0xaf,0x4d,0xc8,0xf4,0x1a,0x40, -0x88,0x1c,0x8b,0x01,0x78,0xf7,0xff,0xfb,0xdd,0xae,0xab,0x58,0xb5,0x01,0x83,0x75,0x3f,0xc2,0xf0,0xe8,0x0c,0x20,0x5c,0xc7,0xa3,0x83,0xbf,0x27,0xa5,0x78,0xaf,0x91,0x0a,0x89,0xce,0x00,0x42,0xe0,0x58,0x94,0x03,0x5f,0x00,0xbe,0x0d,0x8c,0x12,0x2e,0x27,0xea,0xd6,0x02,0x73,0x80,0x3b,0x6c,0x97,0x5d,0xd2,0xc5,0x14,0x3b,0x0d,0x80, -0x00,0xe5,0x3e,0xf2,0xfb,0x22,0xf0,0x2d,0x60,0x84,0x70,0x39,0x85,0xe6,0x3d,0xe0,0x46,0xe0,0x7f,0xf5,0xa3,0xc1,0xe0,0x68,0x00,0x04,0xc0,0xb1,0xe8,0x0f,0x7c,0x19,0xb8,0x1a,0x18,0x2e,0x5c,0x4e,0xa1,0x5b,0x0f,0xdc,0x04,0xdc,0x66,0xbb,0xec,0x90,0x2e,0xa6,0xd8,0x68,0x00,0x18,0xe4,0x58,0x54,0x02,0x5f,0x01,0xbe,0x4e,0xe1,0xee, -0xe8,0x1b,0x55,0xf5,0xc0,0x4f,0x80,0xff,0xb1,0x5d,0xb6,0x4b,0x17,0x53,0x2c,0x34,0x00,0x0c,0xc8,0x5d,0xdd,0xbf,0x02,0xf8,0x1a,0xf1,0x5e,0xe4,0x33,0x0c,0x9b,0x80,0x9b,0x81,0x9f,0xd9,0x2e,0x5b,0xa5,0x8b,0x29,0x74,0x05,0x15,0x00,0x8e,0x45,0x12,0xf8,0x11,0xb0,0x1a,0x58,0x60,0xbb,0xac,0x15,0xae,0x27,0x0d,0x7c,0x13,0xf8,0x06, -0x30,0x48,0xb2,0x96,0x18,0x6a,0x00,0x7e,0x0c,0xdc,0x68,0xbb,0xb4,0x48,0x16,0xe2,0x58,0x8c,0x02,0x4e,0x06,0x0e,0x02,0xae,0xb5,0x5d,0x32,0x92,0xf5,0xe4,0xa3,0xd0,0x02,0xe0,0x66,0xe0,0xca,0x4e,0xff,0xe9,0x5f,0xc0,0x02,0xe0,0x09,0x60,0xb1,0xed,0xd2,0x1c,0x62,0x2d,0x75,0xc0,0x5c,0x74,0x59,0x6b,0x69,0x2f,0x01,0x17,0xda,0x2e, -0xcf,0x87,0xd5,0xa1,0x63,0x51,0x86,0xf7,0x71,0xe5,0x0c,0xbc,0x81,0x7f,0x58,0xa7,0xff,0x7d,0xb3,0xed,0x72,0x55,0x58,0xb5,0xf8,0x55,0x30,0x01,0xe0,0x58,0x5c,0x89,0x37,0xf5,0xeb,0x4e,0x13,0xf0,0x34,0xb9,0x40,0xb0,0x5d,0xdc,0x80,0xea,0x48,0x01,0xd7,0x00,0xdf,0xc1,0xfb,0xdc,0x5a,0xc9,0x6b,0x03,0x6e,0x00,0xfe,0x33,0xa8,0x45, -0x45,0x1c,0x0b,0x8b,0xdd,0x03,0xfe,0x04,0x7a,0x5e,0xcf,0xe1,0x4a,0xdb,0xe5,0x67,0x41,0xd4,0x61,0x5a,0x41,0x04,0x80,0x63,0x71,0x26,0xf0,0x08,0xf9,0xdd,0xb8,0xb4,0x1a,0x6f,0x66,0xb0,0x00,0x78,0xd2,0xc4,0xdd,0x65,0x8e,0xc5,0x14,0xbc,0x77,0xfd,0x89,0x7e,0xdb,0x52,0x81,0x58,0x01,0x5c,0x64,0x62,0x36,0xe0,0x58,0x54,0x01,0x36, -0xde,0xa0,0x9f,0x01,0xd4,0xe6,0xf1,0xe3,0x19,0xe0,0x93,0xb6,0xcb,0xa3,0x7e,0xeb,0x08,0x5a,0xe4,0x03,0xc0,0xb1,0x98,0x86,0xf7,0xce,0x5e,0xe1,0xa3,0x99,0x56,0xe0,0x6f,0xec,0x0e,0x84,0x17,0xf2,0xd9,0x8e,0x2a,0xf7,0xae,0xff,0x7d,0xe0,0xbb,0xe8,0xbb,0x7e,0xd4,0xb5,0x02,0xb3,0x81,0x59,0xf9,0xcc,0x06,0x72,0xdb,0xb4,0x4d,0x61, -0xf7,0xbb,0xfc,0x31,0x40,0xca,0x47,0x1d,0x4d,0xc0,0x09,0xb6,0xcb,0x32,0x1f,0x6d,0x04,0x2e,0xd2,0x01,0xe0,0x58,0xd4,0x02,0x4b,0x81,0x61,0x86,0x9b,0x5e,0x0f,0x2c,0xc4,0x0b,0x84,0x85,0xb6,0x4b,0x7d,0x0f,0x35,0x4c,0xc6,0x7b,0xd7,0x9f,0x64,0xb8,0x06,0x15,0xac,0x17,0xf1,0xae,0x0d,0xbc,0xd8,0xdd,0x37,0x38,0x16,0x43,0x81,0x8f, -0xe1,0x0d,0xf8,0x93,0x30,0x7f,0xcf,0xc6,0x06,0xe0,0x68,0xdb,0x65,0xb5,0xe1,0x76,0x8d,0x89,0x6c,0x00,0x38,0x16,0xd5,0x78,0xef,0xda,0x87,0x04,0xdc,0x55,0x16,0x58,0xce,0xee,0xd9,0xc1,0xdf,0x6d,0x97,0xb6,0xdc,0xbb,0xfe,0xf7,0xf0,0xde,0xf5,0xfd,0xbc,0x13,0x28,0x39,0xad,0xc0,0x2c,0x60,0xb6,0xed,0xd2,0xea,0x58,0x94,0xe2,0xbd, -0xb3,0x9f,0x8c,0xf7,0x4e,0x5f,0x47,0xf0,0x63,0xe0,0x15,0xe0,0x58,0xdb,0xa5,0x21,0xe0,0x7e,0xfa,0x24,0x92,0x01,0x90,0xbb,0xca,0xba,0x10,0xf8,0xb0,0x40,0xf7,0x5b,0x01,0x07,0xef,0x9c,0x6f,0xb2,0x40,0xff,0xca,0xbc,0x17,0xf0,0xae,0x09,0xd9,0xc8,0x6c,0xc6,0xb2,0x08,0x38,0x49,0xfa,0xe3,0xca,0xae,0x44,0x2e,0x00,0x72,0xe7,0x62, -0xf7,0x03,0xe7,0x4a,0xd7,0xa2,0x94,0x41,0xf3,0x80,0x0b,0xa2,0xb6,0x15,0x7a,0x14,0x1f,0x07,0xbe,0x1e,0x1d,0xfc,0xaa,0xf8,0x9c,0x07,0xfc,0xa7,0x74,0x11,0x7b,0x8a,0xd4,0x0c,0xc0,0xb1,0xb8,0x14,0xb8,0x43,0xba,0x0e,0xa5,0x02,0x74,0xa9,0xed,0x72,0xa7,0x74,0x11,0x1d,0x22,0x13,0x00,0x8e,0xc5,0x47,0x81,0x3f,0xa1,0x1f,0xb3,0xa9, -0xe2,0xd6,0x06,0x9c,0x62,0xbb,0xfc,0x45,0xba,0x10,0x88,0x48,0x00,0xe4,0xae,0xf8,0xbf,0x0c,0x8c,0x94,0xae,0x45,0xa9,0x10,0xbc,0x07,0x4c,0x88,0xc2,0x27,0x03,0x51,0xb9,0x06,0xf0,0x33,0x74,0xf0,0xab,0xf8,0x18,0x09,0xdc,0x22,0x5d,0x04,0x44,0x60,0x06,0xe0,0x58,0x9c,0x0e,0x3c,0x26,0x5d,0x87,0x52,0x02,0x4e,0xb7,0x5d,0x1e,0x97, -0x2c,0x40,0x34,0x00,0x74,0xea,0xaf,0x62,0x4e,0xfc,0x54,0x40,0xfa,0x14,0xe0,0x16,0x74,0xf0,0xab,0xf8,0x1a,0x49,0xcf,0x4f,0xb8,0x06,0x4e,0x6c,0x06,0xa0,0x53,0x7f,0xa5,0xde,0x27,0x76,0x2a,0x20,0x12,0x00,0x3a,0xf5,0x57,0xea,0x03,0xd6,0xe2,0x9d,0x0a,0x34,0x86,0xdd,0xb1,0xd4,0x29,0x80,0x4e,0xfd,0x95,0xda,0x6d,0x14,0x42,0x9f, -0x0a,0x84,0x3e,0x03,0xd0,0xa9,0xbf,0x52,0xdd,0x0a,0xfd,0x54,0x20,0xd4,0x00,0xd0,0xa9,0xbf,0x52,0x3d,0x0a,0xfd,0x54,0x20,0xec,0x53,0x00,0x9d,0xfa,0x2b,0xd5,0xbd,0xd0,0x4f,0x05,0x42,0x9b,0x01,0x38,0x16,0xa7,0x01,0x7f,0x08,0xab,0x3f,0xa5,0x0a,0x58,0x68,0xa7,0x02,0xa1,0x04,0x40,0x6e,0x81,0x8f,0x55,0xc0,0xfe,0x61,0xf4,0xa7, -0x54,0x81,0x7b,0x07,0xf8,0x50,0x18,0x0b,0x88,0x84,0x75,0x0a,0x70,0x09,0x3a,0xf8,0x95,0xea,0xad,0xfd,0xf1,0xc6,0x4c,0xe0,0x02,0x9f,0x01,0xe4,0x76,0xcf,0x79,0x0d,0x0d,0x00,0xa5,0xf2,0xf1,0x36,0x30,0x36,0xe8,0x59,0x40,0x18,0x33,0x80,0xcf,0xa3,0x83,0x5f,0xa9,0x7c,0x1d,0x00,0x5c,0x14,0x74,0x27,0x81,0xce,0x00,0x72,0x2b,0xeb, -0xae,0x02,0x0e,0x0c,0xb2,0x1f,0xa5,0x8a,0xd4,0x5b,0x78,0xb3,0x80,0x40,0x76,0x3b,0x82,0xe0,0x67,0x00,0x17,0xa2,0x83,0x5f,0xa9,0xbe,0x3a,0x10,0x98,0x19,0x64,0x07,0x81,0xcd,0x00,0x72,0x6b,0xb0,0xbb,0xe4,0xb7,0xa5,0x92,0x52,0xea,0x83,0x56,0x03,0x96,0xed,0xd2,0x16,0x44,0xe3,0x41,0xce,0x00,0x66,0xa2,0x83,0x5f,0x29,0xbf,0x6a, -0x81,0xcf,0x05,0xd5,0x78,0x20,0x33,0x80,0xdc,0xbb,0xff,0xab,0xc0,0xc1,0x41,0xb4,0xaf,0x54,0xcc,0xbc,0x0e,0x8c,0xb3,0x5d,0xda,0x4d,0x37,0x1c,0xd4,0x0c,0xe0,0x7c,0x74,0xf0,0x2b,0x65,0xca,0x18,0xbc,0x31,0x65,0x9c,0xf1,0x19,0x80,0x63,0x51,0x82,0xb7,0x1f,0xda,0x87,0x4c,0xb7,0xad,0x54,0x8c,0xad,0x02,0x0e,0x35,0x3d,0x0b,0x08, -0x62,0x0d,0xfe,0xf3,0xd0,0xc1,0xdf,0xa3,0x64,0x2a,0xcd,0x90,0xe9,0xa7,0x33,0xea,0xd3,0x97,0x52,0x7d,0xe4,0x47,0x00,0xc8,0x66,0xb3,0x40,0x16,0x32,0x19,0xef,0x9f,0x73,0x7f,0xb2,0xd9,0xcc,0xfb,0xff,0x4c,0x36,0x4b,0x36,0x93,0xf1,0xbe,0x2f,0x9b,0xf5,0xbe,0xaf,0xf3,0xf7,0x93,0xfb,0xff,0xdd,0xfc,0x7c,0xc7,0xf7,0x43,0x76,0xf7, -0xcf,0x7c,0xa0,0xbf,0x3d,0xfa,0xee,0xa2,0x2f,0xb2,0x59,0xb2,0x74,0xf5,0xb3,0xbd,0xab,0xb5,0xf3,0xcf,0xaf,0x7b,0xf4,0x3e,0x36,0x3e,0xa9,0x4f,0x86,0xf7,0xd2,0x58,0xbc,0x1d,0xb3,0xee,0x33,0xd9,0xa8,0xd1,0x19,0x80,0x63,0x91,0x04,0x56,0x02,0x96,0xc9,0x76,0x8b,0x59,0xbf,0x03,0xc7,0x32,0xf2,0x33,0x97,0x32,0xf2,0xac,0x8b,0x48, -0x0f,0x31,0xbd,0x0b,0x7a,0xb4,0x65,0xdb,0x5a,0x59,0xf1,0xc5,0x33,0xd8,0xb4,0x78,0x81,0x74,0x29,0x85,0xe2,0x55,0x60,0xbc,0xed,0x92,0x31,0xd5,0xa0,0xe9,0x00,0x38,0x07,0x78,0xc0,0x64,0x9b,0x71,0x91,0x4c,0xa5,0x19,0x72,0xe2,0x69,0x1c,0x70,0xf1,0x37,0x18,0x38,0xe5,0x18,0xe9,0x72,0x42,0x93,0x69,0xde,0xc5,0x8b,0x97,0x9e,0x42, -0xc3,0xb3,0x4f,0x4b,0x97,0x52,0x28,0xce,0xb5,0x5d,0x1e,0x34,0xd5,0x98,0xe9,0x8b,0x80,0xa1,0x3c,0xc0,0x50,0x8c,0x32,0xad,0x2d,0xd4,0x2f,0xfc,0x1d,0xcb,0xcf,0x3f,0x9e,0x55,0x37,0x7c,0x9d,0x4c,0xf3,0x2e,0xe9,0x92,0x42,0x91,0x2c,0x2b,0x67,0xe2,0xed,0x8f,0x33,0x60,0xf2,0xd1,0xd2,0xa5,0x14,0x8a,0x8b,0x4d,0x36,0x66,0x6c,0x06, -0xe0,0x58,0x0c,0xc3,0x5b,0xd1,0xa4,0xc4,0x54,0x9b,0x71,0xd6,0xef,0xe0,0x43,0x18,0x3f,0x67,0x2e,0x03,0x26,0x1d,0x25,0x5d,0x4a,0x28,0xda,0xb6,0x36,0xb2,0x7c,0xe6,0x89,0x6c,0x5f,0xf9,0x82,0x74,0x29,0x51,0xd7,0x0e,0x8c,0xb4,0x5d,0xea,0x4d,0x34,0x66,0x72,0x06,0xf0,0x69,0x74,0xf0,0x1b,0xd3,0xf4,0xc6,0x2b,0x3c,0x77,0xee,0xbf, -0xf1,0xfa,0x8f,0xbf,0x43,0xa6,0x35,0xf0,0xc7,0xc2,0xc5,0x95,0x0e,0x18,0xc4,0x94,0x5f,0xff,0x99,0xfe,0x1f,0x1a,0x2f,0x5d,0x4a,0xd4,0x95,0xe0,0x8d,0x35,0x23,0x4c,0x06,0xc0,0x39,0x06,0xdb,0x52,0x40,0xb6,0xbd,0x8d,0xb7,0x6e,0x9f,0xc3,0xb2,0xb3,0xa6,0xd2,0xb4,0xfa,0x55,0xe9,0x72,0x02,0x97,0xaa,0xae,0x61,0xca,0xdc,0xbf,0x50, -0x71,0xc0,0x18,0xe9,0x52,0xa2,0xce,0xd8,0x58,0x33,0x72,0x0a,0xe0,0x58,0x8c,0xc6,0x7b,0x7e,0x59,0x7c,0xaf,0xc1,0x62,0x55,0x36,0x7c,0x3f,0xea,0xe6,0x2d,0xa6,0x62,0x74,0xf1,0xdf,0x5d,0xbd,0x6b,0xed,0x5b,0x2c,0x3f,0xff,0xc3,0xec,0x5a,0xfb,0xb6,0x74,0x29,0x51,0x95,0x05,0xf6,0xb7,0x5d,0xd6,0xf8,0x6d,0xc8,0x54,0x00,0x5c,0x0d, -0xdc,0x64,0xa2,0xad,0x42,0x52,0x5a,0x99,0xa0,0xfa,0xb0,0x34,0xe5,0x43,0x4b,0x28,0xab,0x4e,0x92,0xae,0x4e,0x52,0x36,0x38,0x49,0x32,0x95,0xa0,0x79,0x73,0x86,0x96,0xcd,0x19,0x9a,0x1b,0xda,0x69,0xde,0x94,0xa1,0x71,0x65,0x2b,0xbb,0xea,0xfd,0xdd,0xc3,0x51,0x31,0xba,0x96,0xba,0x79,0x8b,0x29,0x1b,0xbe,0x9f,0xa1,0xdf,0x20,0xba, -0x9a,0xde,0x5a,0xc5,0xf2,0xf3,0x3e,0x4c,0xcb,0xc6,0x75,0xd2,0xa5,0x44,0xd5,0xd5,0xb6,0xcb,0x4f,0xfc,0x36,0x62,0x2a,0x00,0x96,0x01,0x47,0x98,0x68,0x2b,0xea,0xca,0x6b,0x4a,0xa8,0x99,0x96,0x66,0xe8,0xb4,0x32,0x06,0x8d,0x4f,0x93,0xc8,0xe3,0xaa,0xc7,0xf6,0xd5,0x6d,0xd4,0x3f,0xdb,0x4c,0xfd,0xb2,0x66,0xb6,0xbf,0xd9,0xe6,0xe5, -0x78,0x9e,0xfa,0xd5,0x8e,0xa3,0xee,0xfe,0x45,0xb1,0xb8,0x67,0x60,0xc7,0xaa,0x97,0x59,0xfe,0xb9,0x13,0x68,0x6d,0xd8,0x28,0x5d,0x4a,0x14,0x2d,0xb3,0x5d,0xa6,0xf9,0x6d,0xc4,0x77,0x00,0x38,0x16,0x63,0xf0,0x96,0xfc,0x2a,0x6a,0xfd,0x46,0x95,0x30,0xe6,0x82,0x4a,0x86,0x1e,0x55,0x66,0xa4,0xbd,0x6d,0xaf,0xb7,0xf1,0xda,0xbd,0xdb, -0x69,0x78,0x29,0xff,0x0b,0x7c,0x95,0xe3,0x26,0x52,0x77,0xdf,0xd3,0x94,0x0e,0xa8,0x36,0x52,0x4b,0x94,0x6d,0x7b,0x79,0x39,0xcf,0x5f,0x38,0x9d,0xb6,0x6d,0x5b,0xa4,0x4b,0x89,0xa2,0x31,0xb6,0xcb,0x1b,0x7e,0x1a,0x30,0x71,0x11,0xb0,0xa8,0x2f,0xfe,0xa5,0xab,0x93,0x8c,0xbb,0xac,0x8a,0xa3,0x6e,0x19,0x62,0x6c,0xf0,0x03,0x54,0x8d, -0x29,0x65,0xca,0xb5,0x83,0x98,0x7c,0xcd,0x20,0x2a,0x0f,0xca,0xef,0x8e,0xec,0xed,0xaf,0xae,0xe0,0x85,0x4b,0x4e,0x8e,0xc5,0xbd,0x02,0x55,0x13,0xea,0x98,0x74,0xc7,0x1f,0x29,0xe9,0x57,0x29,0x5d,0x4a,0x14,0xf9,0x1e,0x7b,0xbe,0x3f,0xb6,0xbb,0x70,0x08,0xbf,0x00,0x8a,0x72,0x3e,0x3a,0xfc,0xdf,0xca,0x99,0x72,0xed,0x20,0x06,0x8e, -0x4b,0x91,0x08,0xe8,0xf2,0x66,0xc5,0x88,0x12,0xf6,0xfb,0x58,0x05,0xc9,0x74,0x82,0xc6,0x7f,0xb5,0xf4,0xfa,0xb4,0xa0,0x79,0xfd,0x1a,0x48,0x24,0xa8,0x3e,0x7a,0x7a,0x30,0x85,0x45,0x48,0xf9,0xc8,0xfd,0x19,0x38,0xf9,0x68,0x36,0x2c,0x78,0x98,0x6c,0x5b,0x20,0xeb,0x62,0x14,0xaa,0x61,0xf7,0x6c,0xe2,0x36,0x3f,0x0d,0xf8,0x3a,0xac, -0x1d,0x8b,0x09,0xc0,0xbf,0xfc,0xb4,0x11,0x45,0x89,0x04,0xd4,0x9e,0xdb,0x9f,0x83,0xce,0xee,0x1f,0x6a,0xbf,0x9b,0x9e,0x6b,0xe1,0xe5,0x9f,0x6e,0xa1,0x6d,0x67,0xef,0x52,0x20,0x99,0x2e,0x63,0xda,0xe3,0x2f,0xd1,0xef,0xc0,0xb1,0x01,0x57,0x16,0x0d,0x9b,0xfe,0xfa,0x47,0x5e,0xba,0xfc,0xac,0x58,0xdc,0x17,0x91,0x87,0x09,0xb6,0xcb, -0xff,0xf5,0xf5,0x87,0xfd,0x9e,0x02,0x14,0xdd,0xf4,0xbf,0xa4,0x3c,0xc1,0x61,0xdf,0x1a,0x18,0xfa,0xe0,0x07,0x18,0x32,0x35,0xcd,0xd4,0x39,0xd5,0x54,0x0c,0xef,0xdd,0xc4,0x2c,0xd3,0xd2,0x8c,0x7b,0xdd,0x57,0x02,0xae,0x2a,0x3a,0x86,0x7c,0xe4,0x54,0xc6,0xff,0xf8,0x7e,0x12,0x25,0x41,0x3c,0xc4,0x5a,0xb0,0x7c,0x8d,0x41,0xbf,0x01, -0xf0,0x59,0x9f,0x3f,0x1f,0x29,0x89,0x12,0x98,0xf8,0x9d,0x81,0x0c,0x9d,0x66,0xee,0x5c,0x3f,0x5f,0xfd,0x47,0x97,0x52,0x77,0x7d,0x35,0x65,0x83,0x7b,0xf7,0x57,0xb3,0xf9,0x99,0x85,0x6c,0x58,0xf0,0x70,0xc0,0x55,0x45,0xc7,0xb0,0x19,0x9f,0xe2,0xd0,0x1b,0xee,0x22,0x91,0x94,0xda,0xd9,0x3e,0x72,0x7c,0x8d,0xc1,0x3e,0xbf,0x8a,0x8e, -0x45,0x1d,0xde,0x33,0xca,0x45,0xc3,0xba,0xa4,0x8a,0xea,0xc3,0xd2,0xd2,0x65,0x50,0x36,0x38,0xc9,0xe1,0xdf,0x1e,0x48,0x32,0xdd,0xbb,0x33,0xb4,0x55,0xb3,0xaf,0xa2,0xbd,0x69,0x7b,0xc0,0x55,0x45,0xc7,0x88,0x4f,0x7c,0x0e,0xeb,0x07,0x3f,0x27,0xb0,0x0b,0x33,0x85,0xc5,0xca,0x8d,0xc5,0x3e,0xe9,0xf3,0x45,0xc0,0x0b,0x87,0xd0,0x04, -0x9c,0x08,0x8c,0xee,0x6b,0x1b,0x51,0xb2,0xdf,0xc9,0x15,0xd4,0x7e,0x26,0xfc,0x69,0x7f,0x77,0xca,0x06,0x97,0x50,0x31,0xbc,0x84,0xfa,0x7f,0x34,0xef,0xf3,0x7b,0xdb,0x77,0x6c,0xa3,0x75,0xd3,0x06,0x4a,0xaa,0x06,0xd0,0xb2,0x61,0x2d,0xad,0x9b,0xd6,0xd3,0xda,0xb0,0x91,0xb6,0xad,0x0d,0xb4,0x6d,0xdf,0x4a,0x66,0xe7,0x0e,0x32,0xcd, -0xbb,0xc8,0xb6,0xb5,0x92,0xcd,0x64,0x48,0x24,0x13,0x05,0xff,0x0e,0x3a,0xe0,0xf0,0x23,0x28,0xe9,0x5f,0xc5,0xe6,0x25,0x7f,0x96,0x2e,0x45,0xda,0x52,0xe0,0xd6,0x7b,0x36,0xb1,0xef,0x03,0xa5,0x0b,0x7e,0x2f,0x02,0x0e,0x00,0xfe,0x04,0x1c,0xeb,0xa7,0x1d,0x69,0x03,0xac,0x14,0x53,0x67,0x55,0x93,0x88,0xe0,0x98,0x58,0x75,0xd7,0x76, -0xde,0x99,0xdf,0x64,0xbc,0xdd,0x44,0x32,0x49,0xa2,0x34,0x45,0x22,0x95,0x26,0x99,0x4a,0xbf,0xff,0x35,0x99,0x4a,0x93,0x48,0x7f,0xf0,0xbf,0x75,0xf7,0x3d,0x89,0xd2,0xd4,0xee,0x7f,0xcf,0x7d,0x4d,0x0d,0x1a,0xc2,0x7e,0xe7,0x5f,0x4e,0xa2,0x24,0x9c,0xe7,0xc2,0x56,0x7c,0xf1,0x74,0x36,0x3e,0x15,0xca,0x46,0xba,0x51,0xb4,0x04,0x38, -0xc5,0x76,0xd9,0xd6,0xd7,0x06,0x7c,0x5d,0x4d,0xb1,0x5d,0xb6,0x3a,0x16,0x33,0x80,0xf9,0xc0,0x87,0xfd,0xb4,0x25,0x26,0x01,0x63,0x2f,0xaa,0x8c,0xe4,0xe0,0x07,0xa8,0x3d,0xa7,0x3f,0xeb,0x16,0xed,0xa2,0x75,0x9b,0xb1,0x45,0x60,0x00,0xc8,0x66,0x32,0x64,0x5b,0x9a,0xa1,0xa5,0xd9,0xd8,0x22,0x73,0x65,0xc3,0x46,0x31,0xe9,0xf6,0xf9, -0xa1,0x0d,0xfe,0x77,0xef,0xbd,0x95,0x8d,0x4f,0xcf,0x0f,0xa5,0xaf,0x08,0xfa,0x2b,0x70,0x9a,0xed,0xe2,0xeb,0xdc,0xcf,0xf7,0x61,0x9f,0x2b,0xe0,0x14,0xe0,0x49,0xbf,0x6d,0x49,0x18,0x3a,0xad,0x8c,0x81,0xe3,0x52,0xd2,0x65,0x74,0xab,0xb4,0x5f,0x82,0x03,0xcf,0xee,0x27,0x5d,0xc6,0x3e,0xf5,0x1f,0x7b,0x18,0x53,0x1f,0x5a,0x4a,0xe5, -0xa1,0x93,0x43,0xe9,0xef,0xdd,0x7b,0x6f,0xc5,0x9d,0x75,0x65,0x6e,0x2d,0xc4,0xd8,0x71,0x80,0x53,0xfd,0x0e,0x7e,0x30,0xf4,0x38,0xb0,0xed,0xd2,0x04,0x9c,0x06,0x2c,0x34,0xd1,0x5e,0x58,0x12,0x25,0x30,0xe6,0x82,0xe8,0xdf,0x61,0x36,0xfa,0x94,0x0a,0xca,0x87,0x45,0x77,0xa9,0x85,0xea,0x63,0x6c,0xa6,0x3e,0xb8,0x84,0xf2,0x91,0xe1, -0xec,0x01,0x1b,0xf3,0xc1,0xff,0x04,0x70,0x7a,0x6e,0xcc,0xf9,0x66,0x6c,0xe2,0x6b,0xbb,0xec,0x04,0xce,0x00,0xfe,0x68,0xaa,0xcd,0xa0,0x0d,0x3f,0xbe,0x9c,0x7e,0xa3,0xa2,0x3b,0xb0,0x3a,0x24,0x4b,0x13,0x1c,0xf4,0xc9,0x68,0xce,0x02,0x46,0x9c,0x39,0x93,0xc9,0x77,0x2e,0xa0,0xb4,0x72,0x40,0x28,0xfd,0xc5,0x7c,0xf0,0xcf,0x07,0x3e, -0x91,0x1b,0x6b,0x46,0x18,0x3d,0xf3,0xb5,0x5d,0x9a,0x81,0xb3,0x80,0x82,0x58,0xeb,0x79,0xd8,0x31,0x72,0x9f,0xf7,0xe7,0x6b,0xe8,0xd1,0x65,0x79,0x3d,0x79,0x18,0xb8,0x44,0x82,0xda,0xcb,0x7f,0xc0,0xf8,0xff,0xba,0x3b,0xb4,0x1b,0x73,0x62,0x3e,0xf8,0x1f,0x05,0x3e,0x99,0x1b,0x63,0xc6,0x18,0xbf,0xf4,0x65,0xbb,0xb4,0x00,0x9f,0x02, -0x1e,0x31,0xdd,0xb6,0x49,0x25,0xe5,0x09,0x06,0x4f,0x92,0xff,0xcc,0xbf,0xb7,0x52,0x55,0xc9,0xc8,0x5c,0xab,0x48,0x94,0xa6,0x38,0x74,0xd6,0x9d,0xd4,0x5e,0xf1,0xa3,0xd0,0xfa,0x8c,0xf9,0xe0,0x7f,0x04,0xf8,0x74,0x6e,0x6c,0x19,0x15,0xc8,0xb5,0xef,0xdc,0x7e,0xe6,0xe7,0x00,0x0f,0x05,0xd1,0xbe,0x09,0x83,0x27,0xa7,0x49,0xa6,0x0a, -0xeb,0x46,0x12,0xc9,0x3b,0x14,0x3b,0x94,0x56,0x0e,0x60,0xd2,0xed,0xf3,0x19,0x79,0xf6,0xe7,0x43,0xeb,0x33,0xe6,0x83,0xff,0x37,0xc0,0x39,0xb9,0x31,0x65,0x5c,0x60,0x1f,0x7e,0xe5,0xb6,0x33,0x3e,0x0f,0xb8,0x3f,0xa8,0x3e,0xfc,0xa8,0x39,0x52,0x7e,0x30,0xe5,0xab,0x46,0x38,0x00,0xca,0x46,0x8c,0xa6,0x6e,0xde,0x62,0x06,0x1f,0x77, -0x52,0x68,0x7d,0xc6,0x7c,0xf0,0xdf,0x07,0x9c,0x1f,0xd4,0xd6,0xe0,0x10,0xec,0xf6,0xe0,0xe4,0xf6,0x31,0x9b,0x09,0xcc,0x0d,0xb2,0x9f,0xbe,0xa8,0xdc,0xbf,0xf0,0x1e,0x28,0xa9,0x18,0x5e,0xd2,0xeb,0xdb,0x83,0x4d,0xab,0x1c,0x37,0x91,0x23,0x1e,0x5a,0x4a,0xe5,0xb8,0x89,0xa1,0xf5,0x19,0xf3,0xc1,0xff,0x6b,0xe0,0xc2,0x20,0x76,0x04, -0xee,0x2c,0xf0,0xdb,0x5f,0x72,0xdb,0x18,0x5d,0x0c,0xdc,0x11,0x74,0x5f,0xf9,0xe8,0xed,0xc3,0x36,0x51,0x53,0x56,0x1d,0x7e,0xdd,0x83,0x8f,0x3b,0x89,0xa9,0x0f,0x3c,0x13,0xea,0x5a,0x84,0x31,0x1f,0xfc,0x77,0x00,0x97,0x98,0xdc,0x02,0xac,0x3b,0xa1,0x1c,0x4d,0xb6,0x4b,0x16,0xb8,0x0c,0xf8,0x45,0x18,0xfd,0xed,0x4b,0xa2,0x04,0x52, -0x83,0x0a,0x34,0x00,0x42,0x0e,0xae,0x91,0x67,0x7f,0xde,0x5b,0x91,0xa7,0x7f,0x55,0x68,0x7d,0xc6,0x7c,0xf0,0xff,0x02,0xb8,0x2c,0x37,0x66,0x02,0x17,0xda,0x3c,0x38,0xf7,0x0b,0x5d,0xee,0x58,0xb4,0x02,0x57,0x86,0xd5,0x6f,0x57,0xd2,0x03,0x93,0x05,0xfb,0x20,0x59,0x3a,0xac,0x19,0x40,0x22,0x41,0xed,0x57,0xaf,0xa5,0xf6,0xf2,0x1f, -0x84,0xd3,0x5f,0x4e,0xcc,0x07,0xff,0xcd,0xb6,0xcb,0x55,0x61,0x76,0x18,0xfa,0xdb,0xa0,0xed,0xf2,0x35,0x84,0x97,0x10,0x4f,0x55,0x15,0xe6,0xbb,0x3f,0x40,0x6a,0x40,0xf0,0xb5,0x27,0x53,0x69,0xc6,0xcf,0x99,0xab,0x83,0x3f,0x5c,0x37,0x86,0x3d,0xf8,0x41,0x20,0x00,0x00,0x6c,0x97,0x6f,0x02,0x37,0x48,0xf4,0x0d,0x18,0x7f,0xb0,0x26, -0x4c,0xad,0x5b,0x83,0xad,0xbd,0xb4,0x6a,0x20,0x93,0x7e,0xf5,0x27,0x46,0x9c,0x39,0x33,0xd0,0x7e,0xf6,0x14,0xf3,0xc1,0x3f,0xdb,0x76,0xf9,0x96,0x44,0xc7,0x62,0x6f,0x85,0xb6,0xcb,0x77,0x81,0xeb,0x24,0xfa,0x6e,0xd9,0x92,0xe9,0xd3,0x9a,0xfc,0x51,0xd0,0xd2,0x10,0x5c,0x00,0x94,0x8f,0xdc,0x9f,0xa9,0x0f,0x3c,0x13,0xfa,0x42,0xa3, -0x31,0x1f,0xfc,0x3f,0xb2,0x5d,0xbe,0x27,0xd5,0xb9,0xe8,0x5c,0xd8,0x76,0xf9,0x21,0x70,0x4d,0xd8,0xfd,0x66,0xdb,0x73,0x21,0x50,0x80,0x9a,0x03,0x0a,0x80,0xca,0x43,0x27,0x33,0xf5,0xa1,0xa5,0xf4,0x1f,0x7b,0x58,0x20,0xed,0x77,0x27,0xe6,0x83,0xff,0xfb,0xb6,0xcb,0xb5,0x92,0x05,0x88,0x9f,0x0c,0xdb,0x2e,0xd7,0x03,0xb7,0x84,0xdd, -0x6f,0xf3,0xe6,0xc2,0x0c,0x80,0x20,0x66,0x00,0x43,0x8e,0x3f,0x99,0xa9,0xf3,0x16,0x53,0x36,0x6c,0x94,0xf1,0xb6,0x7b,0x12,0xf3,0xc1,0x7f,0xb3,0xed,0x32,0x4b,0xba,0x08,0xf1,0x00,0xc8,0x79,0x27,0xec,0x0e,0x77,0xbc,0x5b,0x78,0xeb,0xcb,0xef,0xda,0xd0,0x4e,0x7b,0xb3,0xd9,0xc1,0x32,0xea,0xd3,0x97,0x32,0xf1,0x97,0x8f,0x87,0xbe, -0xf1,0x46,0xcc,0x07,0x3f,0x08,0x1c,0xf3,0x5d,0x89,0x4a,0x00,0x0c,0x0a,0xbb,0xc3,0x8d,0xcb,0x8c,0x3e,0x54,0x15,0x8a,0x8d,0xcb,0x0c,0x3e,0x0b,0x92,0x48,0x70,0xf0,0xd7,0xae,0xe7,0x90,0xeb,0xef,0x08,0x6d,0x05,0x9f,0x0e,0x3a,0xf8,0x01,0x81,0x63,0xbe,0x2b,0x51,0xb9,0x1f,0x36,0xf4,0x4d,0xee,0x36,0x3d,0xdf,0x42,0xa6,0x2d,0x4b, -0xb2,0xb4,0x70,0x6e,0x08,0xa8,0x7f,0xd6,0x4c,0x68,0x25,0x53,0x69,0x0e,0x99,0x7d,0x27,0x23,0xce,0xb8,0xc0,0x48,0x7b,0xf9,0xd0,0xc1,0xff,0xbe,0x48,0x6c,0xec,0x18,0x95,0x19,0x40,0xe8,0x2f,0x46,0xfb,0xce,0x2c,0x0d,0x2b,0x02,0x79,0xc0,0x2a,0x10,0x6d,0xdb,0xb3,0x34,0xae,0xf4,0x3f,0x03,0x28,0x1d,0x30,0x88,0x49,0x77,0x2e,0xd0, -0xc1,0x2f,0x4f,0x03,0xa0,0x13,0x91,0x17,0x63,0xc3,0xdf,0x0b,0x67,0x73,0xcd,0xfa,0x67,0x9b,0xc9,0xfa,0x7c,0x2c,0xa4,0x7c,0xd4,0x81,0x4c,0x7d,0x60,0x09,0xd5,0x47,0x9d,0x68,0xa6,0xa8,0x3c,0xe8,0xe0,0xdf,0x8b,0x06,0x40,0x27,0x22,0xe7,0x43,0xeb,0x17,0x35,0xb3,0x73,0x5d,0xa0,0x0f,0x5b,0x19,0x91,0x6d,0x87,0x37,0x7f,0xbb,0xc3, -0x57,0x1b,0x55,0x13,0xea,0x38,0xe2,0xe1,0xa5,0xf4,0xff,0xd0,0x78,0x43,0x55,0xf5,0x9e,0x0e,0xfe,0x2e,0x45,0xe2,0x1a,0x40,0x54,0x02,0x40,0x24,0x0d,0x33,0x6d,0x59,0x5e,0xbf,0x3f,0xfa,0x3b,0xea,0xac,0x59,0xb0,0x93,0x9d,0xeb,0xfb,0x1e,0x54,0x43,0x3e,0x72,0x2a,0x75,0xf7,0x2f,0x22,0x5d,0x33,0xc2,0x60,0x55,0xbd,0xa3,0x83,0xbf, -0x5b,0x3a,0x03,0xe8,0x44,0xec,0xc5,0xd8,0xf0,0xf7,0x66,0xb6,0xbe,0x16,0xdd,0x6b,0x01,0xed,0x3b,0xb3,0xac,0xf6,0xf1,0xee,0x3f,0xea,0xb3,0x5f,0x60,0xe2,0x6d,0x8f,0x51,0x52,0x11,0xfe,0xae,0x47,0x3a,0xf8,0x7b,0xa4,0x01,0xd0,0x89,0xdc,0x74,0x28,0x0b,0xaf,0xcd,0xdd,0x1e,0xd9,0x63,0x74,0xf5,0xc3,0x3b,0xfa,0x74,0xff,0x7f,0x22, -0x99,0x64,0xcc,0xd7,0x67,0x73,0xc8,0x75,0xbf,0x0c,0xfd,0x63,0x3e,0xd0,0xc1,0xdf,0x0b,0x1a,0x00,0x00,0x8e,0x45,0x05,0x20,0xba,0xd6,0x55,0xe3,0xca,0x56,0x5e,0x9b,0x1b,0xbd,0x53,0x81,0x0d,0x7f,0x6f,0xe6,0x9d,0xc7,0xf2,0x5f,0xfe,0x3d,0x99,0x2e,0x63,0xfc,0x8d,0xf7,0x71,0xe0,0x65,0xdf,0x09,0xa0,0xaa,0x7d,0xd3,0xc1,0xdf,0x2b, -0x65,0x8e,0x45,0xb9,0x74,0x11,0xe2,0x01,0x40,0x44,0x92,0xf0,0x9d,0xf9,0x4d,0xbc,0xf7,0x64,0x74,0x3e,0x15,0xd8,0xb6,0xba,0x8d,0x95,0xb7,0x6e,0xcd,0x7b,0x0c,0xa5,0x06,0x0e,0x66,0xf2,0x5d,0x0b,0x19,0x7e,0xda,0xb9,0xc1,0x14,0xb6,0x0f,0x3a,0xf8,0xf3,0x22,0x7e,0xec,0x6b,0x00,0x74,0xc8,0xc2,0xab,0xb7,0x6f,0xa3,0x71,0xa5,0xfc, -0xf5,0x80,0x96,0xc6,0x0c,0x2f,0xcd,0xd9,0x92,0xf7,0x6d,0xbf,0x15,0xa3,0x6b,0x99,0xfa,0xe0,0x12,0x06,0x1d,0x29,0xb3,0x4d,0xa3,0x0e,0xfe,0xbc,0x89,0x1f,0xfb,0x51,0x08,0x80,0xc8,0xc8,0xb4,0x66,0x59,0x31,0xbb,0x91,0x4d,0xcb,0x8d,0x2f,0xbf,0xde,0x6b,0x4d,0xef,0xb5,0xb3,0xfc,0x07,0x0d,0xec,0xda,0x98,0xdf,0x55,0xff,0xaa,0xc3, -0x8e,0x60,0xea,0x43,0x4b,0xe9,0x77,0xf0,0x21,0x01,0x55,0xd6,0x33,0x1d,0xfc,0x85,0x29,0x0a,0x01,0xd0,0x20,0x5d,0x40,0x67,0x6d,0x4d,0x59,0x56,0xdc,0xd0,0xc8,0xdb,0x7d,0x38,0xf7,0xf6,0x6b,0xf3,0x8b,0x2d,0xfc,0xf3,0x3f,0x36,0xd3,0xb4,0x26,0xbf,0xc1,0x5f,0x33,0xfd,0x74,0xea,0xee,0xfb,0x2b,0xe9,0x21,0xc3,0x02,0xaa,0xac,0x67, -0x3a,0xf8,0xfb,0x4c,0xfc,0xd8,0xd7,0x00,0xe8,0x42,0x36,0x03,0xaf,0xdd,0xbd,0x9d,0x95,0xff,0xb3,0x95,0x4c,0x6b,0x38,0x07,0xf5,0x3b,0xf3,0x9b,0x78,0x71,0x56,0x23,0x6d,0xdb,0xf3,0xeb,0x6f,0xbf,0xf3,0xbe,0xcc,0xe1,0x3f,0xff,0x3d,0x25,0x15,0x32,0x7b,0x07,0xae,0xfb,0xfd,0x3d,0x3a,0xf8,0xfb,0x4e,0xfc,0xd8,0x8f,0xc4,0x93,0x30, -0x8e,0xc5,0x2e,0x84,0x3f,0x09,0xe8,0x4e,0x79,0x4d,0x09,0xb5,0xe7,0xf4,0x67,0xe4,0x09,0xe5,0x81,0xbc,0x5a,0x8d,0x2f,0xb7,0xf2,0xda,0xbd,0xdb,0xd9,0xba,0x2a,0xbf,0x6b,0x0f,0x89,0x64,0x92,0x31,0x57,0xcf,0xe1,0x80,0x4b,0xbf,0x69,0xbe,0xa8,0x3c,0xb4,0x6c,0x5c,0xc7,0xf2,0xcf,0x9d,0x48,0xd3,0x1b,0xaf,0x88,0xd6,0x51,0x80,0x9a, -0x6d,0x57,0xfe,0x53,0x80,0xa8,0x04,0xc0,0x3a,0x60,0xb8,0x74,0x1d,0x3d,0xa9,0x3c,0xb0,0x94,0x31,0x17,0x54,0x32,0xa4,0xce,0xcc,0x7e,0x82,0x3b,0xde,0x6e,0xe3,0xb5,0x7b,0xb7,0xb3,0xe9,0xf9,0x96,0xbc,0x97,0x27,0x4b,0x96,0x95,0x33,0xfe,0xbf,0xee,0x66,0xd8,0x29,0x9f,0x31,0x52,0x8b,0x5f,0x1a,0x02,0x7d,0xb2,0xce,0x76,0x19,0x29, -0x5d,0x44,0x54,0x02,0x60,0x25,0x20,0x73,0xf5,0x2a,0x4f,0xfd,0x46,0x95,0x50,0x73,0x64,0x19,0x43,0xa7,0x95,0x79,0x9b,0x75,0xe6,0xf1,0x0a,0x36,0xad,0x69,0xa7,0xfe,0xd9,0x66,0xea,0x9f,0x6d,0x66,0xdb,0xaa,0xd6,0x3e,0xcd,0x9a,0x4b,0xab,0x06,0x32,0xf1,0xb6,0xc7,0xc4,0xae,0xf4,0x77,0x47,0x43,0x20,0x6f,0x2b,0x6d,0x97,0xf0,0x1f, -0xcc,0xd8,0x43,0x54,0x02,0xe0,0x6f,0xc0,0x31,0xd2,0x75,0xe4,0x2b,0x3d,0x28,0xc9,0xe0,0x89,0x69,0xca,0x6a,0x92,0x94,0x0d,0x2e,0xa1,0xac,0x3a,0x49,0xba,0x3a,0x49,0x32,0x95,0xa0,0x79,0x73,0x3b,0x2d,0x0d,0x19,0x9a,0x37,0x67,0x68,0x6e,0xc8,0xd0,0xf8,0x72,0x0b,0x4d,0x6b,0xfd,0x3d,0x78,0x94,0xaa,0xae,0x61,0xf2,0x9d,0x4f,0x50, -0x35,0xa1,0xce,0xd0,0x6f,0x60,0x96,0x86,0x40,0x5e,0xfe,0x66,0xbb,0x1c,0x27,0x5d,0x44,0x54,0x16,0x04,0x69,0x94,0x2e,0xa0,0x2f,0x5a,0x1a,0x33,0xac,0x5b,0x14,0xce,0xcd,0x43,0x65,0xc3,0x46,0x31,0xf9,0xd7,0x7f,0x16,0x79,0x9a,0xaf,0xb7,0xd2,0x35,0x23,0xa8,0xbb,0xf7,0x29,0x0d,0x81,0xde,0x89,0xc4,0x31,0x1f,0x85,0x4f,0x01,0x20, -0x02,0x57,0x43,0xa3,0xac,0x62,0x74,0x2d,0x75,0xf3,0x16,0x47,0x7a,0xf0,0x77,0xe8,0x08,0x01,0xa9,0xfb,0x11,0x0a,0x48,0x24,0x8e,0x79,0x0d,0x80,0x28,0x4b,0x24,0x18,0x7e,0xea,0x67,0x39,0xe2,0x91,0x65,0x54,0xec,0x7f,0xb0,0x74,0x35,0xbd,0xa6,0x21,0xd0,0x2b,0x91,0x38,0xe6,0x35,0x00,0x22,0x2a,0x35,0x78,0x28,0x87,0xdd,0xf2,0x10, -0x13,0x7e,0xfa,0x20,0xa9,0x41,0x43,0xa4,0xcb,0xc9,0x9b,0x86,0xc0,0x3e,0x45,0xe2,0x98,0x8f,0x4a,0x00,0x44,0xe2,0x7c,0x28,0x2a,0x86,0xce,0x38,0x9b,0xa3,0xe7,0xbf,0xcc,0xb0,0x19,0x9f,0x92,0x2e,0xc5,0x17,0x0d,0x81,0x1e,0x45,0xe2,0x98,0x8f,0x4a,0x00,0xec,0x2f,0x5d,0x80,0xb4,0x44,0x32,0x49,0xcd,0xf4,0x33,0xa8,0x9b,0xb7,0x98, -0xc3,0x7f,0xf6,0x5b,0x52,0x83,0x87,0x4a,0x97,0x64,0x84,0x86,0x40,0xb7,0x22,0x71,0xcc,0x8b,0x7f,0x0c,0xe8,0x58,0x5c,0x83,0xd0,0x1e,0x81,0x51,0x90,0x2c,0x2b,0x67,0xc4,0x99,0x33,0x39,0xe0,0xe2,0xab,0xe9,0x77,0x90,0x25,0x5d,0x4e,0x60,0xf4,0x23,0xc2,0x2e,0x5d,0x93,0xdb,0x19,0x4b,0x8c,0x68,0x00,0x38,0x16,0xd7,0x21,0xb0,0x37, -0xa0,0xb4,0x54,0x75,0x0d,0xd5,0x47,0x9d,0xc8,0xe0,0x63,0x3f,0x4a,0xcd,0x47,0xcf,0x14,0x7b,0x88,0x27,0x6c,0x1a,0x02,0x5d,0xba,0x2e,0xb7,0x47,0xa6,0x08,0xb1,0x00,0x70,0x2c,0x66,0x03,0x32,0x4b,0xd6,0x98,0x92,0x48,0xf4,0xfa,0x21,0x98,0x44,0x49,0x09,0x55,0xe3,0xeb,0xa8,0x3e,0xf6,0xa3,0x54,0x1d,0x3a,0xd9,0xfb,0xd9,0x8e,0x36, -0xf6,0xfc,0xde,0xae,0xfe,0x5a,0xba,0xf8,0x3e,0x12,0x09,0x12,0x25,0x25,0x24,0x52,0x69,0x92,0xa5,0x29,0xef,0x6b,0x2a,0x9d,0xfb,0xba,0xc7,0xbf,0xef,0xf1,0xff,0x25,0x96,0x09,0x03,0x0d,0x81,0x6e,0xcc,0x96,0xda,0x21,0x58,0x24,0x00,0x1c,0x8b,0x9b,0x80,0xab,0x25,0xfa,0x56,0x9e,0x44,0x32,0x49,0xa2,0x53,0x28,0x54,0x1f,0x3d,0x9d, -0x09,0x3f,0x99,0x47,0xa2,0x24,0xf8,0x7b,0xc3,0x34,0x04,0xba,0x74,0x93,0xed,0x12,0xfa,0x93,0x5d,0xa1,0x07,0x80,0x63,0x71,0x0b,0x70,0x45,0xd8,0xfd,0xaa,0x7d,0xab,0xb1,0x3f,0xc1,0xe1,0xb7,0xfe,0x56,0x43,0x40,0xce,0x2d,0xb6,0xcb,0xd7,0xc2,0xec,0x30,0xb4,0x00,0x70,0x2c,0x12,0xc0,0xcf,0x81,0x2f,0x85,0xd5,0xa7,0xca,0x9f,0x86, -0x80,0xb8,0x5f,0x00,0x5f,0xb1,0xdd,0x7c,0x9f,0x11,0xed,0x9b,0x50,0x02,0xc0,0xb1,0x48,0x02,0xbf,0x04,0x2e,0x0d,0xa3,0x3f,0xe5,0x8f,0x86,0x80,0xb8,0x3b,0x80,0xcb,0xc2,0x08,0x81,0xc0,0x03,0x20,0x37,0xf8,0xef,0x02,0x2e,0x0c,0xba,0x2f,0x65,0x8e,0x86,0x80,0xb8,0xb9,0xc0,0x25,0xb6,0x4b,0xfe,0x9b,0x42,0xe4,0x21,0xd0,0x00,0x70, -0x2c,0x4a,0x80,0xbb,0x81,0xf3,0x83,0xec,0x47,0x05,0x43,0x43,0x40,0xdc,0xfd,0xc0,0x85,0xb6,0x4b,0x60,0x1b,0x58,0x06,0x16,0x00,0x8e,0x45,0x29,0xde,0x2f,0x10,0x8d,0x65,0x6b,0x54,0x9f,0x68,0x08,0x88,0xfb,0x0d,0x70,0x81,0xed,0xd2,0x16,0x44,0xe3,0x81,0x04,0x80,0x63,0x91,0x02,0x1e,0x04,0x3e,0x19,0x44,0xfb,0x2a,0x5c,0x1a,0x02, -0xe2,0x1e,0x01,0xce,0xb5,0x5d,0x8c,0x6f,0x5a,0x61,0x3c,0x00,0x1c,0x8b,0x34,0xf0,0x30,0x70,0x86,0xe9,0xb6,0x95,0x1c,0x0d,0x01,0x71,0x8f,0x02,0x9f,0xb1,0x5d,0x8c,0x6e,0x5a,0x61,0x34,0x00,0x1c,0x8b,0x32,0xe0,0x77,0xc0,0xa9,0x26,0xdb,0x55,0xd1,0xa0,0x21,0x20,0x6e,0x3e,0x70,0xb6,0xed,0xd2,0x6c,0xaa,0x41,0x63,0x01,0x90,0xdb, -0xe4,0xf3,0xf7,0xc0,0xc7,0x4c,0xb5,0xa9,0xa2,0x47,0x43,0x40,0xdc,0x42,0xe0,0x4c,0xdb,0x65,0xa7,0x89,0xc6,0x8c,0x04,0x80,0x63,0xd1,0x0f,0xf8,0x03,0x30,0xdd,0x44,0x7b,0x2a,0xda,0x34,0x04,0xc4,0x3d,0x09,0x9c,0x6e,0xbb,0xf8,0xde,0xbe,0xca,0x77,0x00,0x38,0x16,0x95,0x78,0x53,0x93,0x68,0xad,0x53,0xad,0x02,0xa5,0x21,0x20,0x6e, -0x11,0xf0,0x71,0xdb,0xc5,0xd7,0xbe,0xf6,0xbe,0x02,0xc0,0xb1,0x18,0x00,0xfc,0x09,0x38,0xd6,0x4f,0x3b,0xaa,0x30,0x69,0x08,0x88,0x5b,0x02,0x9c,0x62,0xbb,0x6c,0xeb,0x6b,0x03,0x7d,0x0e,0x00,0xc7,0x62,0x20,0xf0,0x04,0x70,0x54,0x5f,0xdb,0x50,0x85,0x4f,0x43,0x40,0xdc,0x3f,0x80,0x19,0xb6,0xcb,0x96,0xbe,0xfc,0xb0,0x9f,0x25,0xc1, -0xc6,0xa0,0x83,0x3f,0xf6,0x36,0x3a,0x8f,0xf2,0xd2,0x57,0x3f,0x45,0xb6,0x3d,0x90,0xfb,0x54,0x3e,0x40,0x97,0x17,0xeb,0xd2,0x51,0x78,0x63,0xb1,0x4f,0xfc,0x9e,0x02,0xb8,0xc0,0x58,0x3f,0x6d,0xa8,0xe2,0xa0,0x33,0x01,0x31,0xae,0xed,0x32,0xae,0xaf,0x3f,0xec,0x77,0x51,0xd0,0xdf,0xf8,0xfc,0x79,0x55,0x24,0x74,0x26,0x20,0xc6,0xd7, -0x18,0xf4,0x1b,0x00,0x0f,0xf8,0xfc,0x79,0x55,0x44,0x34,0x04,0x44,0xf8,0x1a,0x83,0xbe,0x02,0xc0,0x76,0xf9,0x3f,0xe0,0x5f,0x7e,0xda,0x50,0xc5,0x25,0xec,0x10,0x18,0x79,0x56,0xac,0x9f,0x32,0x7f,0xc9,0x76,0x59,0xe9,0xa7,0x01,0x13,0xfb,0x02,0x3c,0x68,0xa0,0x0d,0x55,0x44,0xc2,0x0c,0x81,0x4c,0xab,0xd1,0x5b,0xe3,0x0b,0x8d,0xef, -0xb1,0xa7,0x01,0xa0,0x02,0x11,0x56,0x08,0x64,0x35,0x00,0x7c,0xf1,0x1d,0x00,0xb6,0xcb,0xeb,0xc0,0x3f,0xfd,0xb6,0xa3,0x8a,0x4f,0x18,0x21,0x10,0xe3,0x19,0xc0,0x32,0xdb,0xe5,0x0d,0xbf,0x8d,0x98,0xda,0x1a,0x4c,0x67,0x01,0xaa,0x4b,0x41,0x87,0x40,0xb6,0xd5,0xf8,0x23,0xf2,0x85,0xc2,0xc8,0x98,0x33,0x15,0x00,0xbf,0x81,0x70,0x56, -0x31,0x55,0x85,0x27,0xc8,0x10,0x88,0xe9,0x0c,0x20,0x8b,0xa1,0x8f,0xe0,0x8d,0x04,0x80,0xed,0xf2,0x2e,0xde,0x7d,0xc9,0x4a,0x75,0x29,0xa8,0x10,0x88,0xe9,0x35,0x80,0x67,0x6c,0x97,0x35,0x26,0x1a,0x32,0xb9,0x3b,0xb0,0x9e,0x06,0xa8,0x1e,0x05,0x11,0x02,0x31,0x9d,0x01,0x18,0x1b,0x6b,0x26,0x03,0xe0,0x61,0x08,0x6e,0xf5,0x52,0x55, -0x1c,0x4c,0x87,0x40,0xb6,0x2d,0x76,0xd7,0x00,0xda,0xf1,0xc6,0x9a,0x11,0xc6,0x02,0xc0,0x76,0xd9,0x00,0x3c,0x65,0xaa,0x3d,0x55,0xbc,0x4c,0x86,0x40,0x0c,0x67,0x00,0x4f,0xda,0x2e,0xf5,0xa6,0x1a,0x33,0x39,0x03,0x00,0xb8,0xd3,0x70,0x7b,0xaa,0x48,0x99,0x0a,0x81,0x18,0x5e,0x03,0xb8,0xcb,0x64,0x63,0xa6,0x03,0xe0,0x21,0xe0,0x55, -0xc3,0x6d,0xaa,0x22,0x65,0x22,0x04,0x32,0x2d,0xb1,0x0a,0x80,0x57,0xf1,0xc6,0x98,0x31,0x46,0x03,0x20,0xb7,0x8d,0xd1,0x2c,0x93,0x6d,0xaa,0xe2,0xe6,0x37,0x04,0x62,0x76,0x0d,0xe0,0x7a,0xd3,0x5b,0x85,0x99,0x9e,0x01,0x00,0xcc,0x03,0x56,0x05,0xd0,0xae,0x2a,0x52,0x7e,0x42,0x20,0x46,0xa7,0x00,0xab,0x08,0xe0,0xe9,0x5b,0xe3,0x01, -0x90,0xdb,0xc7,0x4c,0x67,0x01,0x2a,0x2f,0x7d,0x0d,0x81,0x18,0x5d,0x04,0xbc,0x3e,0x88,0x3d,0x02,0x83,0x98,0x01,0x80,0xb7,0x27,0xe0,0xeb,0x01,0xb5,0xad,0x8a,0x54,0x5f,0x42,0x20,0x26,0x01,0xf0,0x3a,0xde,0x98,0x32,0x2e,0x90,0x00,0xc8,0x6d,0x64,0x38,0x3b,0x88,0xb6,0x55,0x71,0xcb,0x37,0x04,0x62,0x72,0x0a,0x30,0x2b,0xa8,0x1d, -0x82,0x83,0x9a,0x01,0x00,0xdc,0x03,0xac,0x0e,0xb0,0x7d,0x55,0xa4,0xf2,0x09,0x81,0x18,0x3c,0x0c,0xf4,0x06,0x70,0x6f,0x50,0x8d,0x07,0x16,0x00,0x3a,0x0b,0x50,0x7e,0xf4,0x36,0x04,0x62,0x70,0x0a,0x30,0x3b,0xa8,0xad,0xc1,0x21,0xd8,0x19,0x00,0xc0,0xdd,0xc0,0x5b,0x01,0xf7,0xa1,0x8a,0x54,0x6f,0x42,0xa0,0xc8,0x03,0xe0,0x4d,0xbc, -0x99,0x74,0x60,0x02,0x0d,0x80,0xdc,0x7e,0xe6,0x37,0x04,0xd9,0x87,0x2a,0x6e,0xfb,0x0a,0x81,0x22,0xbf,0x06,0x70,0x43,0x6e,0x0c,0x05,0x26,0xe8,0x19,0x00,0xc0,0xaf,0x81,0x77,0x42,0xe8,0x47,0x15,0xa9,0x9e,0x42,0xa0,0x88,0x6f,0x04,0x7a,0x1b,0x6f,0xec,0x04,0x2a,0xf0,0x00,0xb0,0x5d,0x5a,0x80,0x39,0x41,0xf7,0xa3,0x8a,0x5b,0x77, -0x21,0x50,0xc4,0xa7,0x00,0x73,0x82,0x7e,0xf7,0x87,0x70,0x66,0x00,0xe0,0x3d,0x24,0xa4,0xb3,0x00,0xe5,0x4b,0x57,0x21,0x50,0xa4,0x33,0x80,0x77,0x08,0xe9,0xc1,0xba,0x50,0x02,0xc0,0x76,0x69,0x06,0xbe,0x1c,0x46,0x5f,0xaa,0xb8,0x75,0x0e,0x81,0x6c,0x7b,0x3b,0xd9,0xf6,0xa2,0x5c,0x82,0xe2,0x4b,0xb9,0x99,0x73,0xe0,0xc2,0x9a,0x01, -0x60,0xbb,0x3c,0x4e,0x80,0x9f,0x67,0xaa,0xf8,0xe8,0x08,0x81,0xf6,0x9d,0x3b,0xa4,0x4b,0x09,0xc2,0x3d,0xb6,0xcb,0xfc,0xb0,0x3a,0xf3,0xb5,0x39,0x68,0xbe,0x1c,0x8b,0x6a,0xe0,0x65,0x60,0x64,0x98,0xfd,0xaa,0xe2,0x34,0xf8,0xb8,0x93,0xd8,0xbc,0xe4,0xcf,0xd2,0x65,0x98,0xb4,0x16,0x98,0x60,0xbb,0x34,0x86,0xd5,0x61,0xa8,0x01,0x00, -0xe0,0x58,0x9c,0x06,0xfc,0x21,0xec,0x7e,0x95,0x2a,0x00,0xa7,0xe7,0x66,0xca,0xa1,0x09,0xed,0x14,0xa0,0x83,0x9e,0x0a,0x28,0xd5,0xa5,0x7b,0xc2,0x1e,0xfc,0x20,0x10,0x00,0x39,0x57,0x02,0xef,0x09,0xf5,0xad,0x54,0xd4,0xac,0xc5,0x1b,0x13,0xa1,0x13,0x09,0x00,0xdb,0xa5,0x01,0xf8,0x82,0x44,0xdf,0x4a,0x45,0xd0,0x65,0x61,0x9e,0xf7, -0x77,0x26,0x35,0x03,0xd0,0x53,0x01,0xa5,0x3c,0x22,0x53,0xff,0x0e,0x62,0x01,0x90,0xa3,0xa7,0x02,0x2a,0xce,0xc4,0xa6,0xfe,0x1d,0x44,0x03,0x20,0x77,0x2a,0x70,0x99,0x64,0x0d,0x4a,0x09,0x12,0x9b,0xfa,0x77,0x90,0x9e,0x01,0x60,0xbb,0xfc,0x01,0xb8,0x4f,0xba,0x0e,0xa5,0x42,0x76,0xaf,0xe4,0xd4,0xbf,0x83,0x78,0x00,0xe4,0x5c,0x81, -0x9e,0x0a,0xa8,0xf8,0x78,0x0f,0xe1,0xa9,0x7f,0x87,0x48,0x04,0x40,0xee,0x54,0x60,0x26,0x04,0xb7,0xf2,0x89,0x52,0x11,0xd1,0x06,0xcc,0xcc,0x1d,0xf3,0xe2,0x22,0x11,0x00,0x00,0xb6,0xcb,0x5f,0x80,0x2f,0x49,0xd7,0xa1,0x54,0xc0,0xbe,0x98,0x3b,0xd6,0x23,0x21,0x32,0x01,0x00,0x60,0xbb,0xfc,0x0a,0x5d,0x47,0x50,0x15,0xaf,0x59,0xb6, -0x1b,0xad,0xfd,0x33,0x23,0x15,0x00,0x39,0xdf,0xc7,0xdb,0x5d,0x48,0xa9,0x62,0x72,0xbf,0xed,0xf2,0x7d,0xe9,0x22,0xf6,0x14,0xb9,0x00,0xb0,0x5d,0xb2,0xc0,0xc5,0xc0,0x22,0xa1,0x12,0xb6,0x00,0xbf,0x03,0x5e,0x10,0xea,0x5f,0x99,0xf7,0x02,0xde,0xdf,0xe9,0x16,0xa1,0xfe,0xff,0x8a,0x77,0x4c,0x47,0x4e,0xe4,0x02,0x00,0xde,0x5f,0x40, -0xe4,0x4c,0xe0,0x95,0x10,0xba,0xcb,0x02,0xff,0xc4,0xdb,0xce,0xec,0x78,0xa0,0xc6,0x76,0x39,0x1b,0x98,0x06,0x5c,0x0b,0xc1,0x2f,0xcb,0xa4,0x02,0xd3,0x0a,0xfc,0x10,0x38,0x32,0xf7,0x77,0x5a,0x83,0xf7,0x77,0x3c,0x0b,0xef,0xef,0x3c,0x1b,0x42,0x0d,0xaf,0x00,0x67,0x85,0xb5,0xc0,0x47,0xbe,0x42,0x7f,0x1c,0x38,0x1f,0x8e,0x45,0x2d, -0xb0,0x14,0x18,0x66,0xb8,0xe9,0xf5,0xc0,0x13,0xb9,0x3f,0x0b,0x6d,0x97,0x8d,0x3d,0xd4,0x30,0x19,0x98,0x0b,0x4c,0x32,0x5c,0x83,0x0a,0xd6,0x0b,0xc0,0x45,0xb6,0xcb,0x8b,0xdd,0x7d,0x83,0x63,0x31,0x14,0x38,0x09,0x38,0x19,0xf8,0x18,0x30,0xdc,0x70,0x0d,0xeb,0x81,0xa3,0x6d,0x97,0x37,0x0d,0xb7,0x6b,0x4c,0xa4,0x03,0x00,0xc0,0xb1, -0x98,0x06,0x3c,0x05,0xf4,0xf3,0xd1,0x4c,0x2b,0xb0,0x04,0x6f,0xc0,0x2f,0x00,0x5e,0xcc,0x9d,0x6a,0xf4,0xb6,0x86,0x14,0xf0,0x3d,0xe0,0xbb,0x40,0xca,0x47,0x1d,0x2a,0x78,0xad,0x78,0xef,0xf0,0xb3,0xf3,0x59,0x54,0xd3,0xb1,0x48,0x00,0x93,0x81,0x19,0x78,0x81,0x70,0x2c,0xfe,0xfe,0xae,0x9b,0x80,0x13,0x6c,0x97,0x65,0x3e,0xda,0x08, -0x5c,0xe4,0x03,0x00,0xc0,0xb1,0xf8,0x04,0xde,0x39,0x5c,0x3e,0xa7,0x2c,0x6f,0xb0,0x7b,0xc0,0x3f,0x65,0xbb,0x6c,0x33,0x50,0xc7,0x64,0xbc,0xcd,0x4e,0x26,0xfa,0x6d,0x4b,0x05,0xe2,0x45,0xbc,0x77,0x7d,0xdf,0xd7,0x6f,0x1c,0x8b,0x2a,0x60,0x3a,0x5e,0x20,0xcc,0x00,0x0e,0xce,0xe3,0xc7,0x33,0x78,0xd3,0xfe,0xc7,0xfc,0xd6,0x11,0xb4, -0x82,0x08,0x00,0x00,0xc7,0xe2,0x4a,0xe0,0xe6,0x1e,0xbe,0x65,0x07,0xf0,0x34,0xde,0x80,0x7f,0xc2,0x76,0x59,0x15,0x50,0x1d,0x29,0xbc,0x4f,0x2a,0xbe,0x0b,0x94,0x06,0xd1,0x87,0xca,0x5b,0xc7,0x36,0x74,0xd7,0x07,0xb5,0x94,0xb6,0x63,0x31,0x96,0xdd,0xb3,0x83,0x13,0x80,0xfe,0x3d,0x7c,0xfb,0x15,0xb6,0xcb,0xad,0x41,0xd4,0x61,0x5a, -0xc1,0x04,0x00,0x80,0x63,0x71,0x33,0x1f,0xbc,0x85,0xf2,0x25,0x72,0x03,0x1e,0x58,0x1c,0xe6,0x85,0x16,0xc7,0xa2,0x0e,0xef,0xda,0xc0,0xe1,0x61,0xf5,0xa9,0xba,0xb4,0x02,0xef,0x5d,0xff,0xf9,0xb0,0x3a,0x74,0x2c,0xd2,0x78,0x17,0x13,0x3b,0x02,0xa1,0xf3,0x31,0x70,0xb3,0xed,0x72,0x55,0x58,0xb5,0xf8,0x55,0x68,0x01,0x90,0xc4,0xbb, -0x32,0xbf,0x1a,0xef,0x5d,0x7e,0xad,0x70,0x3d,0x69,0xe0,0x9b,0xc0,0xd5,0x40,0xb5,0x64,0x2d,0x31,0xd4,0x00,0xdc,0x04,0xdc,0x18,0xc6,0x06,0x1a,0x3d,0x71,0x2c,0x46,0xe1,0x85,0x41,0x2d,0x70,0xad,0xed,0x92,0x91,0xac,0x27,0x1f,0x05,0x15,0x00,0x51,0xe5,0x58,0x0c,0x00,0xbe,0x0a,0x5c,0x05,0x0c,0x11,0x2e,0xa7,0xd8,0x6d,0x02,0x7e, -0x0a,0xdc,0x6a,0xbb,0x6c,0x95,0x2e,0xa6,0xd0,0x69,0x00,0x18,0xe4,0x58,0x54,0x02,0x97,0xe3,0xcd,0x08,0x86,0x0a,0x97,0x53,0x6c,0xea,0x81,0x1f,0x03,0x3f,0xb7,0x5d,0xb6,0x4b,0x17,0x53,0x2c,0x34,0x00,0x02,0xe0,0x58,0xf4,0xc7,0x7b,0xb0,0xe9,0x1b,0x98,0xff,0x6c,0x39,0x6e,0xd6,0x03,0x37,0x02,0xb7,0xd9,0x2e,0x4d,0xd2,0xc5,0x14, -0x1b,0x0d,0x80,0x00,0x39,0x16,0x15,0x78,0x2b,0x1e,0x7d,0x0b,0xdd,0x0c,0x25,0x5f,0xef,0x01,0xff,0x0d,0xfc,0xd2,0x76,0xd9,0x29,0x5d,0x4c,0xb1,0xd2,0x00,0x08,0x81,0x63,0x51,0x0e,0xfc,0x3b,0xf0,0x6d,0x60,0x3f,0xe1,0x72,0xa2,0x6e,0x0d,0xde,0x6e,0xd2,0xbf,0xb2,0x5d,0x76,0x49,0x17,0x53,0xec,0x34,0x00,0x42,0xe4,0x58,0x7c,0x1c, -0xe4,0x97,0x81,0x8a,0xb8,0x8f,0xdb,0x2e,0x7f,0x94,0x2e,0x22,0x2e,0x22,0xf9,0x30,0x50,0x11,0x5b,0x84,0xae,0x7a,0xd4,0x93,0x36,0x60,0xb1,0x74,0x11,0x71,0xa2,0x01,0x10,0xa2,0xdc,0xed,0xc8,0xcf,0x49,0xd7,0x11,0x61,0xff,0x34,0x71,0xcb,0xb6,0xea,0x3d,0x0d,0x80,0xf0,0x3d,0x29,0x5d,0x40,0x84,0xe9,0x6b,0x13,0x32,0x0d,0x80,0xf0, -0xe9,0x41,0xde,0x3d,0x7d,0x6d,0x42,0xa6,0x01,0x10,0xbe,0x25,0x10,0xcd,0xc5,0x21,0x84,0x35,0x03,0x7f,0x93,0x2e,0x22,0x6e,0x34,0x00,0x42,0x96,0xfb,0x4c,0x7b,0xa9,0x74,0x1d,0x11,0xb4,0x54,0x3f,0xef,0x0f,0x9f,0x06,0x80,0x0c,0x9d,0xea,0xee,0x4d,0x5f,0x13,0x01,0x1a,0x00,0x32,0xf4,0x60,0xdf,0x9b,0xbe,0x26,0x02,0x34,0x00,0x64, -0xfc,0x03,0xf4,0xbe,0xf6,0x4e,0x9a,0xf0,0x5e,0x13,0x15,0x32,0x0d,0x00,0x01,0xb9,0x85,0x4b,0x96,0x48,0xd7,0x11,0x21,0xcf,0x48,0x3f,0xd3,0x1f,0x57,0x1a,0x00,0x72,0x74,0xca,0xbb,0x9b,0xbe,0x16,0x42,0x34,0x00,0xe4,0xe8,0x41,0xbf,0x9b,0xbe,0x16,0x42,0x34,0x00,0xe4,0x3c,0x07,0xba,0xa2,0x0d,0xde,0x6e,0x3d,0xcb,0xa5,0x8b,0x88, -0x2b,0x0d,0x00,0x21,0xb6,0x4b,0x3b,0x72,0xdb,0x9f,0x45,0xc9,0xa2,0xdc,0x6b,0xa1,0x04,0x68,0x00,0xc8,0xd2,0xa9,0xaf,0xbe,0x06,0xa2,0x34,0x00,0x64,0xe9,0xc1,0xaf,0xaf,0x81,0x28,0x0d,0x00,0x59,0x2b,0xf0,0x56,0xb9,0x8d,0xab,0x8d,0x78,0x7b,0x3b,0x28,0x21,0x1a,0x00,0x82,0x72,0xfb,0x13,0x3e,0x2d,0x5d,0x87,0xa0,0xa7,0xf3,0xd9, -0xa3,0x51,0x99,0xa7,0x01,0x20,0x2f,0xce,0x53,0xe0,0x38,0xff,0xee,0x91,0xa0,0x01,0x20,0x2f,0xce,0x83,0x20,0xce,0xbf,0x7b,0x24,0xe8,0xa2,0xa0,0x11,0xe0,0x58,0xac,0x25,0x7e,0xcb,0x86,0xaf,0xb5,0x5d,0x5d,0x21,0x59,0x9a,0xce,0x00,0xa2,0xe1,0x29,0xe9,0x02,0x04,0xc4,0xf1,0x77,0x8e,0x1c,0x0d,0x80,0x68,0x88,0xe3,0x54,0x38,0x8e, -0xbf,0x73,0xe4,0x68,0x00,0x44,0x43,0x1c,0x07,0x83,0x23,0x5d,0x80,0xd2,0x00,0x88,0x04,0xdb,0x65,0x35,0xf0,0x28,0xde,0x7d,0xf1,0xc5,0xae,0x11,0x78,0xd4,0x76,0x79,0x4b,0xba,0x10,0xa5,0x17,0x01,0x23,0xc5,0xb1,0x48,0xe0,0xed,0x31,0x5f,0xb7,0xc7,0x9f,0x42,0xdd,0x69,0x78,0x03,0xf0,0x3c,0xde,0xc3,0x3e,0xcb,0x81,0xe5,0xb6,0xcb, -0x1b,0xb2,0x25,0xa9,0xce,0x34,0x00,0x0a,0x80,0x63,0x31,0x1a,0x2f,0x08,0xa6,0xb0,0x3b,0x14,0x46,0x8b,0x16,0xb5,0xb7,0x77,0xe9,0x34,0xd0,0xf1,0x06,0xfb,0x1a,0xd9,0x92,0xd4,0xbe,0x68,0x00,0x14,0x28,0xc7,0x62,0x28,0xbb,0xc3,0xa0,0x16,0x18,0x94,0xfb,0x53,0xdd,0xe9,0xeb,0x40,0xa0,0xd4,0x67,0x57,0x6d,0x78,0xa7,0x26,0x0d,0x78, -0xd3,0xf7,0x8e,0xaf,0x8d,0xc0,0x6a,0x76,0x0f,0xf6,0x7a,0x9f,0xfd,0x28,0x01,0x1a,0x00,0x45,0xce,0xb1,0xa8,0xe4,0x83,0xa1,0xb0,0x67,0x50,0xc0,0xde,0x03,0xfb,0xfd,0xc1,0x6e,0xbb,0x6c,0x0f,0xbb,0x66,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29, -0xd5,0x1b,0xff,0x0f,0x5c,0x56,0xd9,0x0b,0x64,0x90,0x3b,0x82,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, -}; - -read_only global String8 rd_icon_file_bytes = {rd_icon_file_bytes__data, sizeof(rd_icon_file_bytes__data)}; - -C_LINKAGE_END - -#endif // RADDBG_META_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef RADDBG_META_H +#define RADDBG_META_H + +typedef enum RD_RegSlot +{ +RD_RegSlot_Null, +RD_RegSlot_Machine, +RD_RegSlot_Module, +RD_RegSlot_Process, +RD_RegSlot_Thread, +RD_RegSlot_CtrlEntity, +RD_RegSlot_Window, +RD_RegSlot_Panel, +RD_RegSlot_Tab, +RD_RegSlot_View, +RD_RegSlot_PrevTab, +RD_RegSlot_DstPanel, +RD_RegSlot_Cfg, +RD_RegSlot_CfgList, +RD_RegSlot_EvalSpace, +RD_RegSlot_UnwindCount, +RD_RegSlot_InlineDepth, +RD_RegSlot_FilePath, +RD_RegSlot_Cursor, +RD_RegSlot_Mark, +RD_RegSlot_TextKey, +RD_RegSlot_LangKind, +RD_RegSlot_Lines, +RD_RegSlot_DbgiKey, +RD_RegSlot_Vaddr, +RD_RegSlot_Voff, +RD_RegSlot_VaddrRange, +RD_RegSlot_VoffRange, +RD_RegSlot_Expr, +RD_RegSlot_UIKey, +RD_RegSlot_SrcUIKey, +RD_RegSlot_OffPx, +RD_RegSlot_RegSlot, +RD_RegSlot_PID, +RD_RegSlot_ForceConfirm, +RD_RegSlot_ForceFocus, +RD_RegSlot_PreferDisasm, +RD_RegSlot_NoRichTooltip, +RD_RegSlot_DoImplicitRoot, +RD_RegSlot_DoLister, +RD_RegSlot_DoBigRows, +RD_RegSlot_AllWindows, +RD_RegSlot_NonGraphical, +RD_RegSlot_PreferNewTab, +RD_RegSlot_ActivateWithSingleClick, +RD_RegSlot_Dir2, +RD_RegSlot_String, +RD_RegSlot_CmdName, +RD_RegSlot_WMEvent, +RD_RegSlot_COUNT, +} RD_RegSlot; + +typedef enum RD_CmdKind +{ +RD_CmdKind_Null, +RD_CmdKind_LaunchAndRun, +RD_CmdKind_LaunchAndStepInto, +RD_CmdKind_Kill, +RD_CmdKind_KillAll, +RD_CmdKind_Detach, +RD_CmdKind_Continue, +RD_CmdKind_StepIntoInst, +RD_CmdKind_StepOverInst, +RD_CmdKind_StepIntoLine, +RD_CmdKind_StepOverLine, +RD_CmdKind_StepOut, +RD_CmdKind_Halt, +RD_CmdKind_SoftHaltRefresh, +RD_CmdKind_SetThreadIP, +RD_CmdKind_RunToLine, +RD_CmdKind_Run, +RD_CmdKind_Restart, +RD_CmdKind_StepInto, +RD_CmdKind_StepOver, +RD_CmdKind_FreezeThread, +RD_CmdKind_ThawThread, +RD_CmdKind_FreezeProcess, +RD_CmdKind_ThawProcess, +RD_CmdKind_FreezeMachine, +RD_CmdKind_ThawMachine, +RD_CmdKind_FreezeLocalMachine, +RD_CmdKind_ThawLocalMachine, +RD_CmdKind_FreezeEntity, +RD_CmdKind_ThawEntity, +RD_CmdKind_SetEntityColor, +RD_CmdKind_SetEntityName, +RD_CmdKind_Attach, +RD_CmdKind_OpenCrashDump, +RD_CmdKind_Exit, +RD_CmdKind_OpenPalette, +RD_CmdKind_RunCommand, +RD_CmdKind_RunExternalDriverTextCommand, +RD_CmdKind_WMEvent, +RD_CmdKind_SelectThread, +RD_CmdKind_SelectUnwind, +RD_CmdKind_UpOneFrame, +RD_CmdKind_DownOneFrame, +RD_CmdKind_SelectEntity, +RD_CmdKind_DeselectEntity, +RD_CmdKind_IncWindowFontSize, +RD_CmdKind_DecWindowFontSize, +RD_CmdKind_IncViewFontSize, +RD_CmdKind_DecViewFontSize, +RD_CmdKind_OpenWindow, +RD_CmdKind_WindowSettings, +RD_CmdKind_CloseWindow, +RD_CmdKind_ToggleFullscreen, +RD_CmdKind_BringToFront, +RD_CmdKind_PopupAccept, +RD_CmdKind_PopupCancel, +RD_CmdKind_ResetToDefaultBindings, +RD_CmdKind_ResetToDefaultPanels, +RD_CmdKind_ResetToCompactPanels, +RD_CmdKind_ResetToSimplePanels, +RD_CmdKind_NewPanelLeft, +RD_CmdKind_NewPanelUp, +RD_CmdKind_NewPanelRight, +RD_CmdKind_NewPanelDown, +RD_CmdKind_SplitPanel, +RD_CmdKind_RotatePanelColumns, +RD_CmdKind_NextPanel, +RD_CmdKind_PrevPanel, +RD_CmdKind_FocusPanel, +RD_CmdKind_FocusPanelRight, +RD_CmdKind_FocusPanelLeft, +RD_CmdKind_FocusPanelUp, +RD_CmdKind_FocusPanelDown, +RD_CmdKind_Undo, +RD_CmdKind_Redo, +RD_CmdKind_GoBack, +RD_CmdKind_GoForward, +RD_CmdKind_ClosePanel, +RD_CmdKind_FocusTab, +RD_CmdKind_NextTab, +RD_CmdKind_PrevTab, +RD_CmdKind_MoveTabRight, +RD_CmdKind_MoveTabLeft, +RD_CmdKind_OpenTab, +RD_CmdKind_BuildTab, +RD_CmdKind_DuplicateTab, +RD_CmdKind_CopyTabFullPath, +RD_CmdKind_CloseTab, +RD_CmdKind_MoveView, +RD_CmdKind_TabBarTop, +RD_CmdKind_TabBarBottom, +RD_CmdKind_TabSettings, +RD_CmdKind_SetCurrentPath, +RD_CmdKind_Open, +RD_CmdKind_OpenSourceFileFromDebugInfo, +RD_CmdKind_SwitchToPartnerFile, +RD_CmdKind_ShowFileInExplorer, +RD_CmdKind_GoToDisassembly, +RD_CmdKind_GoToSource, +RD_CmdKind_SetFileReplacementPath, +RD_CmdKind_NewUser, +RD_CmdKind_NewProject, +RD_CmdKind_OpenUser, +RD_CmdKind_OpenProject, +RD_CmdKind_OpenRecentProject, +RD_CmdKind_SaveUser, +RD_CmdKind_SaveProject, +RD_CmdKind_RecordUserAsLastOpened, +RD_CmdKind_RecordProjectInUser, +RD_CmdKind_WriteUserData, +RD_CmdKind_WriteProjectData, +RD_CmdKind_UserSettings, +RD_CmdKind_ProjectSettings, +RD_CmdKind_Edit, +RD_CmdKind_Accept, +RD_CmdKind_Cancel, +RD_CmdKind_FocusMenu, +RD_CmdKind_MoveLeft, +RD_CmdKind_MoveRight, +RD_CmdKind_MoveUp, +RD_CmdKind_MoveDown, +RD_CmdKind_MoveLeftSelect, +RD_CmdKind_MoveRightSelect, +RD_CmdKind_MoveUpSelect, +RD_CmdKind_MoveDownSelect, +RD_CmdKind_MoveLeftChunk, +RD_CmdKind_MoveRightChunk, +RD_CmdKind_MoveUpChunk, +RD_CmdKind_MoveDownChunk, +RD_CmdKind_MoveUpPage, +RD_CmdKind_MoveDownPage, +RD_CmdKind_MoveUpWhole, +RD_CmdKind_MoveDownWhole, +RD_CmdKind_MoveLeftChunkSelect, +RD_CmdKind_MoveRightChunkSelect, +RD_CmdKind_MoveUpChunkSelect, +RD_CmdKind_MoveDownChunkSelect, +RD_CmdKind_MoveUpPageSelect, +RD_CmdKind_MoveDownPageSelect, +RD_CmdKind_MoveUpWholeSelect, +RD_CmdKind_MoveDownWholeSelect, +RD_CmdKind_MoveUpReorder, +RD_CmdKind_MoveDownReorder, +RD_CmdKind_MoveHome, +RD_CmdKind_MoveEnd, +RD_CmdKind_MoveHomeSelect, +RD_CmdKind_MoveEndSelect, +RD_CmdKind_SelectAll, +RD_CmdKind_DeleteSingle, +RD_CmdKind_DeleteChunk, +RD_CmdKind_BackspaceSingle, +RD_CmdKind_BackspaceChunk, +RD_CmdKind_Copy, +RD_CmdKind_Cut, +RD_CmdKind_Paste, +RD_CmdKind_InsertText, +RD_CmdKind_MoveNext, +RD_CmdKind_MovePrev, +RD_CmdKind_GoToLine, +RD_CmdKind_GoToAddress, +RD_CmdKind_CenterCursor, +RD_CmdKind_ContainCursor, +RD_CmdKind_FindNext, +RD_CmdKind_FindPrev, +RD_CmdKind_FindThread, +RD_CmdKind_FindSelectedThread, +RD_CmdKind_GoToName, +RD_CmdKind_GoToNameAtCursor, +RD_CmdKind_ToggleWatchExpression, +RD_CmdKind_ToggleWatchExpressionAtCursor, +RD_CmdKind_ToggleWatchExpressionAtMouse, +RD_CmdKind_EnableCfg, +RD_CmdKind_DisableCfg, +RD_CmdKind_SelectCfg, +RD_CmdKind_DeselectCfg, +RD_CmdKind_RemoveCfg, +RD_CmdKind_NameCfg, +RD_CmdKind_ConditionCfg, +RD_CmdKind_DuplicateCfg, +RD_CmdKind_RelocateCfg, +RD_CmdKind_SaveToProject, +RD_CmdKind_AddBreakpoint, +RD_CmdKind_AddAddressBreakpoint, +RD_CmdKind_AddFunctionBreakpoint, +RD_CmdKind_ToggleBreakpoint, +RD_CmdKind_RemoveBreakpoint, +RD_CmdKind_EnableBreakpoint, +RD_CmdKind_DisableBreakpoint, +RD_CmdKind_ClearBreakpoints, +RD_CmdKind_ListBreakpoints, +RD_CmdKind_ClearOutput, +RD_CmdKind_AddWatchPin, +RD_CmdKind_ToggleWatchPin, +RD_CmdKind_LoadDebugInfo, +RD_CmdKind_UnloadDebugInfo, +RD_CmdKind_AddTypeView, +RD_CmdKind_AddFilePathMap, +RD_CmdKind_EditUserTheme, +RD_CmdKind_EditProjectTheme, +RD_CmdKind_AddThemeColor, +RD_CmdKind_ForkTheme, +RD_CmdKind_SaveTheme, +RD_CmdKind_SaveAndSetTheme, +RD_CmdKind_SetNextStatement, +RD_CmdKind_AddTarget, +RD_CmdKind_SelectTarget, +RD_CmdKind_EnableTarget, +RD_CmdKind_DisableTarget, +RD_CmdKind_RemoveTarget, +RD_CmdKind_RegisterAsJITDebugger, +RD_CmdKind_FindCodeLocation, +RD_CmdKind_Search, +RD_CmdKind_SearchBackwards, +RD_CmdKind_PickFile, +RD_CmdKind_PickFolder, +RD_CmdKind_PickFileOrFolder, +RD_CmdKind_PushQuery, +RD_CmdKind_CompleteQuery, +RD_CmdKind_CancelQuery, +RD_CmdKind_UpdateQuery, +RD_CmdKind_OpenEventBuffer, +RD_CmdKind_CloseEventBuffer, +RD_CmdKind_ToggleDevMenu, +RD_CmdKind_LogMarker, +RD_CmdKind_OpenWatch, +RD_CmdKind_OpenLocals, +RD_CmdKind_OpenRegisters, +RD_CmdKind_OpenGlobals, +RD_CmdKind_OpenThreadLocals, +RD_CmdKind_OpenTypes, +RD_CmdKind_OpenProcedures, +RD_CmdKind_OpenCallStack, +RD_CmdKind_OpenTargets, +RD_CmdKind_OpenBreakpoints, +RD_CmdKind_OpenWatchPins, +RD_CmdKind_OpenDebugInfos, +RD_CmdKind_OpenThreads, +RD_CmdKind_OpenProcesses, +RD_CmdKind_OpenMachines, +RD_CmdKind_OpenModules, +RD_CmdKind_OpenFilePathMaps, +RD_CmdKind_OpenTypeViews, +RD_CmdKind_OpenOutput, +RD_CmdKind_OpenText, +RD_CmdKind_OpenDisasm, +RD_CmdKind_OpenMemory, +RD_CmdKind_OpenBitmap, +RD_CmdKind_OpenColor, +RD_CmdKind_OpenGeo3D, +RD_CmdKind_COUNT, +RD_CmdKind_FirstTabFastPathCmd = RD_CmdKind_OpenWatch, +} RD_CmdKind; + +typedef enum RD_IconKind +{ +RD_IconKind_Null, +RD_IconKind_FolderOpenOutline, +RD_IconKind_FolderClosedOutline, +RD_IconKind_FolderOpenFilled, +RD_IconKind_FolderClosedFilled, +RD_IconKind_FileOutline, +RD_IconKind_FileFilled, +RD_IconKind_Play, +RD_IconKind_PlayStepForward, +RD_IconKind_Pause, +RD_IconKind_Stop, +RD_IconKind_Info, +RD_IconKind_WarningSmall, +RD_IconKind_WarningBig, +RD_IconKind_Unlocked, +RD_IconKind_Locked, +RD_IconKind_LeftArrow, +RD_IconKind_RightArrow, +RD_IconKind_UpArrow, +RD_IconKind_DownArrow, +RD_IconKind_Gear, +RD_IconKind_Pencil, +RD_IconKind_Trash, +RD_IconKind_Pin, +RD_IconKind_RadioHollow, +RD_IconKind_RadioFilled, +RD_IconKind_CheckHollow, +RD_IconKind_CheckFilled, +RD_IconKind_Check, +RD_IconKind_LeftCaret, +RD_IconKind_RightCaret, +RD_IconKind_UpCaret, +RD_IconKind_DownCaret, +RD_IconKind_UpScroll, +RD_IconKind_DownScroll, +RD_IconKind_LeftScroll, +RD_IconKind_RightScroll, +RD_IconKind_Add, +RD_IconKind_Minus, +RD_IconKind_Thread, +RD_IconKind_Threads, +RD_IconKind_Machine, +RD_IconKind_CircleFilled, +RD_IconKind_X, +RD_IconKind_Refresh, +RD_IconKind_Undo, +RD_IconKind_Redo, +RD_IconKind_Save, +RD_IconKind_Window, +RD_IconKind_Target, +RD_IconKind_Clipboard, +RD_IconKind_Scheduler, +RD_IconKind_Module, +RD_IconKind_XSplit, +RD_IconKind_YSplit, +RD_IconKind_ClosePanel, +RD_IconKind_StepInto, +RD_IconKind_StepOver, +RD_IconKind_StepOut, +RD_IconKind_Find, +RD_IconKind_Palette, +RD_IconKind_Thumbnails, +RD_IconKind_Glasses, +RD_IconKind_Binoculars, +RD_IconKind_List, +RD_IconKind_Grid, +RD_IconKind_QuestionMark, +RD_IconKind_Person, +RD_IconKind_Briefcase, +RD_IconKind_Dot, +RD_IconKind_Bitmap, +RD_IconKind_Cube, +RD_IconKind_WindowRestore, +RD_IconKind_WindowMinimize, +RD_IconKind_Duplicate, +RD_IconKind_COUNT, +} RD_IconKind; + +typedef enum RD_CodeColorSlot +{ +RD_CodeColorSlot_CodeDefault, +RD_CodeColorSlot_CodeSymbol, +RD_CodeColorSlot_CodeType, +RD_CodeColorSlot_CodeLocal, +RD_CodeColorSlot_CodeRegister, +RD_CodeColorSlot_CodeKeyword, +RD_CodeColorSlot_CodeDelimiterOperator, +RD_CodeColorSlot_CodeNumeric, +RD_CodeColorSlot_CodeNumericAltDigitGroup, +RD_CodeColorSlot_CodeString, +RD_CodeColorSlot_CodeMeta, +RD_CodeColorSlot_CodeComment, +RD_CodeColorSlot_CodeLineNumbers, +RD_CodeColorSlot_CodeLineNumbersSelected, +RD_CodeColorSlot_COUNT, +} RD_CodeColorSlot; + +typedef enum RD_ThemePreset +{ +RD_ThemePreset_DefaultDark, +RD_ThemePreset_DefaultLight, +RD_ThemePreset_VSDark, +RD_ThemePreset_VSLight, +RD_ThemePreset_SolarizedDark, +RD_ThemePreset_SolarizedLight, +RD_ThemePreset_HandmadeHero, +RD_ThemePreset_Naysayer, +RD_ThemePreset_FourCoder, +RD_ThemePreset_Grove, +RD_ThemePreset_FarManager, +RD_ThemePreset_COUNT, +} RD_ThemePreset; + +typedef struct RD_VocabInfo RD_VocabInfo; +struct RD_VocabInfo +{ +String8 code_name; +String8 code_name_plural; +String8 display_name; +String8 display_name_plural; +RD_IconKind icon_kind; +}; + +typedef struct RD_NameSchemaInfo RD_NameSchemaInfo; +struct RD_NameSchemaInfo +{ +String8 name; +B32 is_view; +String8 schema; +}; + +typedef struct RD_Regs RD_Regs; +struct RD_Regs +{ +D_Handle machine; +D_Handle module; +D_Handle process; +D_Handle thread; +D_Handle ctrl_entity; +CFG_ID window; +CFG_ID panel; +CFG_ID tab; +CFG_ID view; +CFG_ID prev_tab; +CFG_ID dst_panel; +CFG_ID cfg; +CFG_IDList cfg_list; +E_Space eval_space; +U64 unwind_count; +U64 inline_depth; +String8 file_path; +TxtPt cursor; +TxtPt mark; +C_Key text_key; +TXT_LangKind lang_kind; +D_LineList lines; +DI_Key dbgi_key; +U64 vaddr; +U64 voff; +Rng1U64 vaddr_range; +Rng1U64 voff_range; +String8 expr; +UI_Key ui_key; +UI_Key src_ui_key; +Vec2F32 off_px; +RD_RegSlot reg_slot; +U32 pid; +B32 force_confirm; +B32 force_focus; +B32 prefer_disasm; +B32 no_rich_tooltip; +B32 do_implicit_root; +B32 do_lister; +B32 do_big_rows; +B32 all_windows; +B32 non_graphical; +B32 prefer_new_tab; +B32 activate_with_single_click; +Dir2 dir2; +String8 string; +String8 cmd_name; +WM_Event * wm_event; +}; + +typedef struct RD_Query RD_Query; +struct RD_Query +{ +RD_QueryFlags flags; +RD_RegSlot slot; +String8 expr; +String8 view_name; +D_EntityKind ctrl_entity_kind; +}; + +typedef struct RD_CmdKindInfo RD_CmdKindInfo; +struct RD_CmdKindInfo +{ +String8 string; +String8 description; +String8 search_tags; +String8 ctx_filter; +RD_CmdKindFlags flags; +RD_Query query; +}; + +#define RD_FixedTabXList \ +Y(watches, watch, "")\ +X(locals) \ +X(registers) \ +X(globals) \ +X(thread_locals) \ +X(types) \ +X(procedures) \ +X(call_stack) \ +X(targets) \ +X(breakpoints) \ +X(watch_pins) \ +X(debug_infos) \ +X(threads) \ +X(processes) \ +X(machines) \ +X(modules) \ +X(file_path_maps) \ +X(type_views) \ +Y(output, text, "query:output")\ +Y(text, text, "")\ +Y(disasm, disasm, "")\ +Y(memory, memory, "")\ +Y(bitmap, bitmap, "")\ +Y(color, color, "")\ +Y(geo3d, geo3d, "")\ +Z(getting_started)\ + +#define rd_regs_lit_init_top \ +.machine = rd_regs()->machine,\ +.module = rd_regs()->module,\ +.process = rd_regs()->process,\ +.thread = rd_regs()->thread,\ +.ctrl_entity = rd_regs()->ctrl_entity,\ +.window = rd_regs()->window,\ +.panel = rd_regs()->panel,\ +.tab = rd_regs()->tab,\ +.view = rd_regs()->view,\ +.prev_tab = rd_regs()->prev_tab,\ +.dst_panel = rd_regs()->dst_panel,\ +.cfg = rd_regs()->cfg,\ +.cfg_list = rd_regs()->cfg_list,\ +.eval_space = rd_regs()->eval_space,\ +.unwind_count = rd_regs()->unwind_count,\ +.inline_depth = rd_regs()->inline_depth,\ +.file_path = rd_regs()->file_path,\ +.cursor = rd_regs()->cursor,\ +.mark = rd_regs()->mark,\ +.text_key = rd_regs()->text_key,\ +.lang_kind = rd_regs()->lang_kind,\ +.lines = rd_regs()->lines,\ +.dbgi_key = rd_regs()->dbgi_key,\ +.vaddr = rd_regs()->vaddr,\ +.voff = rd_regs()->voff,\ +.vaddr_range = rd_regs()->vaddr_range,\ +.voff_range = rd_regs()->voff_range,\ +.expr = rd_regs()->expr,\ +.ui_key = rd_regs()->ui_key,\ +.src_ui_key = rd_regs()->src_ui_key,\ +.off_px = rd_regs()->off_px,\ +.reg_slot = rd_regs()->reg_slot,\ +.pid = rd_regs()->pid,\ +.force_confirm = rd_regs()->force_confirm,\ +.force_focus = rd_regs()->force_focus,\ +.prefer_disasm = rd_regs()->prefer_disasm,\ +.no_rich_tooltip = rd_regs()->no_rich_tooltip,\ +.do_implicit_root = rd_regs()->do_implicit_root,\ +.do_lister = rd_regs()->do_lister,\ +.do_big_rows = rd_regs()->do_big_rows,\ +.all_windows = rd_regs()->all_windows,\ +.non_graphical = rd_regs()->non_graphical,\ +.prefer_new_tab = rd_regs()->prefer_new_tab,\ +.activate_with_single_click = rd_regs()->activate_with_single_click,\ +.dir2 = rd_regs()->dir2,\ +.string = rd_regs()->string,\ +.cmd_name = rd_regs()->cmd_name,\ +.wm_event = rd_regs()->wm_event,\ + +C_LINKAGE_BEGIN +extern String8 rd_tab_fast_path_view_name_table[25]; +extern String8 rd_tab_fast_path_query_name_table[25]; +extern RD_VocabInfo rd_vocab_info_table[360]; +extern RD_NameSchemaInfo rd_name_schema_info_table[39]; +extern String8 rd_reg_slot_code_name_table[49]; +extern Rng1U64 rd_reg_slot_range_table[49]; +extern String8 rd_binding_version_remap_old_name_table[9]; +extern String8 rd_binding_version_remap_new_name_table[9]; +extern String8 rd_icon_kind_text_table[75]; +extern String8 rd_code_color_slot_name_table[14]; +extern String8 rd_theme_preset_display_string_table[11]; +extern String8 rd_theme_preset_code_string_table[11]; +extern String8 rd_theme_preset_cfg_string_table[11]; +read_only global U8 rd_icon_font_bytes__data[] = +{ +0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x80,0x00,0x03,0x00,0x70,0x47,0x53,0x55,0x42,0x20,0x8b,0x25,0x7a,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x4f,0x53,0x2f,0x32,0x56,0x43,0x62,0x25,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0xa3,0x60,0xa4,0x23,0x00,0x00,0x01,0xb0,0x00,0x00,0x06,0x12,0x63,0x76,0x74,0x20, +0x0e,0x1f,0x06,0xf3,0x00,0x00,0x51,0x34,0x00,0x00,0x00,0x38,0x66,0x70,0x67,0x6d,0x62,0x31,0xfb,0x7b,0x00,0x00,0x51,0x6c,0x00,0x00,0x0e,0x0c,0x67,0x61,0x73,0x70,0x00,0x00,0x00,0x10,0x00,0x00,0x51,0x2c,0x00,0x00,0x00,0x08,0x67,0x6c,0x79,0x66,0x71,0xda,0x4c,0xc8,0x00,0x00,0x07,0xc4,0x00,0x00,0x40,0x90,0x68,0x65,0x61,0x64, +0x2b,0xeb,0xd3,0xaf,0x00,0x00,0x48,0x54,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,0x07,0xc2,0x04,0x27,0x00,0x00,0x48,0x8c,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,0x06,0x4b,0xff,0xca,0x00,0x00,0x48,0xb0,0x00,0x00,0x01,0x44,0x6c,0x6f,0x63,0x61,0x71,0xa6,0x82,0xac,0x00,0x00,0x49,0xf4,0x00,0x00,0x00,0xa4,0x6d,0x61,0x78,0x70, +0x01,0xe8,0x0f,0x19,0x00,0x00,0x4a,0x98,0x00,0x00,0x00,0x20,0x6e,0x61,0x6d,0x65,0xcd,0x9d,0x1c,0x1d,0x00,0x00,0x4a,0xb8,0x00,0x00,0x02,0xcd,0x70,0x6f,0x73,0x74,0x77,0x9e,0x36,0x3b,0x00,0x00,0x4d,0x88,0x00,0x00,0x03,0xa2,0x70,0x72,0x65,0x70,0xeb,0x48,0xca,0x9d,0x00,0x00,0x5f,0x78,0x00,0x00,0x00,0xa7,0x00,0x01,0x00,0x00, +0x00,0x0a,0x00,0x30,0x00,0x3e,0x00,0x02,0x44,0x46,0x4c,0x54,0x00,0x0e,0x6c,0x61,0x74,0x6e,0x00,0x1a,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x6c,0x69,0x67,0x61,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x04, +0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x03,0x3d,0x01,0x90,0x00,0x05,0x00,0x00,0x02,0x7a,0x02,0xbc,0x00,0x00,0x00,0x8c,0x02,0x7a,0x02,0xbc,0x00,0x00,0x01,0xe0,0x00,0x31,0x01,0x02,0x00,0x00,0x02,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x66,0x45,0x64,0x00,0xc0,0x00,0x21,0x00,0x7d,0x03,0x52,0xff,0x6a,0x00,0x5a,0x03,0xac,0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x04, +0x00,0x00,0x02,0x42,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x3c,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x2c,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x42,0x00,0x04,0x01,0x10,0x00,0x00,0x00,0x18,0x00,0x10,0x00,0x03,0x00,0x08,0x00,0x23,0x00,0x2b,0x00,0x2e,0x00,0x31,0x00,0x39,0x00,0x3c,0x00,0x5b,0x00,0x5e,0x00,0x73,0x00,0x7b,0x00,0x7d, +0xff,0xff,0x00,0x00,0x00,0x21,0x00,0x26,0x00,0x2d,0x00,0x30,0x00,0x33,0x00,0x3c,0x00,0x3e,0x00,0x5d,0x00,0x61,0x00,0x75,0x00,0x7d,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x1c,0x00,0x26,0x00,0x28,0x00,0x2a,0x00,0x36, +0x00,0x36,0x00,0x70,0x00,0x72,0x00,0x96,0x00,0xa2,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a, +0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20,0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2c,0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x39,0x00,0x3a, +0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x4a,0x00,0x4b,0x00,0x4c,0x00,0x4d,0x00,0x4e,0x00,0x4f,0x00,0x50,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x00,0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x0a,0x0b,0x00,0x0c,0x0d,0x00,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x00,0x00,0x15,0x00,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25, +0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x00,0x34,0x35,0x00,0x00,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x00,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x03,0xd0,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x50,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x05,0x00,0x00, +0x00,0x28,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x2e,0x00,0x00, +0x00,0x2e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x35,0x00,0x00, +0x00,0x10,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x15,0x00,0x00, +0x00,0x3e,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x43,0x00,0x00, +0x00,0x43,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00, +0x00,0x20,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x25,0x00,0x00, +0x00,0x4e,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x53,0x00,0x00, +0x00,0x53,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x58,0x00,0x00, +0x00,0x30,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x35,0x00,0x00, +0x00,0x61,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x66,0x00,0x00, +0x00,0x66,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x6b,0x00,0x00, +0x00,0x40,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x45,0x00,0x00, +0x00,0x71,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x77,0x00,0x00, +0x00,0x77,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x7d,0x00,0x00, +0x00,0x50,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x25,0x40,0x22,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x13,0x00,0x4e,0x02,0x00,0x1e,0x1b,0x16,0x13,0x0a,0x07,0x00,0x0f,0x02,0x0f,0x05,0x07,0x16,0x2b,0x01,0x21,0x22,0x06,0x07,0x11,0x14, +0x16,0x17,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x17,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x71,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x34,0x7c,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x02,0xc3,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01, +0xd0,0x25,0x34,0x59,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x5e,0x01,0x60,0x00,0x06,0x00,0x00,0xff,0xba,0x02,0x80,0x03,0x02,0x00,0x13,0x00,0x1c,0x00,0x25,0x00,0x39,0x00,0x42,0x00,0x4b,0x00,0x54,0x40,0x51,0x39,0x30,0x2f,0x26,0x0d,0x0c,0x03,0x02,0x08,0x02,0x04,0x01,0x4c,0x08,0x0c,0x02,0x04,0x0b,0x01,0x02,0x03,0x04, +0x02,0x69,0x09,0x01,0x05,0x05,0x01,0x61,0x07,0x01,0x01,0x01,0x13,0x4d,0x0d,0x0a,0x02,0x03,0x03,0x00,0x61,0x06,0x01,0x00,0x00,0x11,0x00,0x4e,0x44,0x43,0x1e,0x1d,0x48,0x47,0x43,0x4b,0x44,0x4b,0x41,0x40,0x3d,0x3c,0x35,0x34,0x2b,0x2a,0x22,0x21,0x1d,0x25,0x1e,0x25,0x13,0x14,0x19,0x17,0x0e,0x07,0x1a,0x2b,0x13,0x14,0x07,0x11, +0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16,0x03,0x34,0x26,0x22,0x06,0x14,0x16,0x32,0x36,0x03,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x01,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16,0x15,0x14,0x07,0x27,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13, +0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0xf0,0x48,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x32,0x2a,0x38,0x28,0x28,0x38,0x2a,0x46,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x01,0xdc,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x48,0x74,0x28,0x38,0x2a,0x2a,0x38,0x28,0x44,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x02,0x8a,0x4c,0x22,0xfe, +0x86,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0xfd,0x76,0x1e,0x28,0x28,0x3a,0x28,0x28,0x02,0x30,0x28,0x3a,0x28,0x28,0x3a,0x28,0xfe,0x5c,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c,0x22,0x6e,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x46,0x28,0x3a,0x28, +0x28,0x3a,0x28,0x00,0x00,0x05,0x00,0x00,0xff,0x6a,0x03,0xe8,0x03,0x52,0x00,0x1f,0x00,0x22,0x00,0x25,0x00,0x33,0x00,0x3c,0x00,0x70,0x40,0x6d,0x23,0x01,0x00,0x06,0x1d,0x01,0x09,0x00,0x27,0x20,0x02,0x07,0x05,0x03,0x4c,0x00,0x03,0x00,0x06,0x00,0x03,0x06,0x67,0x0c,0x01,0x00,0x00,0x09,0x05,0x00,0x09,0x67,0x00,0x05,0x00,0x07, +0x04,0x05,0x07,0x67,0x00,0x04,0x00,0x0a,0x08,0x04,0x0a,0x67,0x00,0x08,0x00,0x02,0x0b,0x08,0x02,0x67,0x0d,0x01,0x0b,0x01,0x01,0x0b,0x57,0x0d,0x01,0x0b,0x0b,0x01,0x5f,0x00,0x01,0x0b,0x01,0x4f,0x34,0x34,0x01,0x00,0x34,0x3c,0x34,0x3c,0x3b,0x39,0x36,0x35,0x30,0x2f,0x2e,0x2c,0x29,0x28,0x25,0x24,0x22,0x21,0x1a,0x17,0x0e,0x0c, +0x09,0x06,0x00,0x1f,0x01,0x1e,0x0e,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x35,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x3f,0x01,0x3e,0x01,0x3b,0x01,0x32,0x16,0x17,0x15,0x36,0x33,0x0f,0x01,0x33,0x01,0x07,0x33,0x17,0x37,0x35,0x23,0x15,0x14,0x06,0x07,0x23,0x11,0x21,0x35,0x34,0x36,0x01,0x11, +0x23,0x15,0x14,0x06,0x27,0x23,0x11,0x03,0xb2,0x17,0x1e,0x01,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0xfe,0xd1,0x17,0x1e,0x01,0x16,0x10,0xe4,0x0f,0x36,0x16,0xe8,0x17,0x1e,0x01,0x26,0x21,0x47,0xa7,0xa7,0xfe,0x9b,0xa7,0xa7,0x6d,0xb0,0xd6,0x1e,0x17,0xe9,0x01,0x1e,0x16,0x02,0x26,0xd7,0x1e,0x17,0xe8,0x02,0x7c,0x20,0x16,0xfd,0x5a, +0x17,0x1e,0x01,0x20,0x16,0xa0,0x20,0x16,0x01,0x77,0x16,0x36,0x0f,0xe4,0x10,0x16,0x20,0x16,0xb7,0x17,0x77,0xa7,0x01,0x7d,0xa7,0xc2,0xb0,0xe9,0xe9,0x16,0x1e,0x01,0xfe,0x9b,0x8f,0x16,0x36,0xfe,0x4e,0x02,0x83,0xe8,0x16,0x20,0x01,0xfe,0x9a,0x00,0x00,0x04,0xff,0xff,0xff,0xb1,0x04,0x2f,0x03,0x0b,0x00,0x08,0x00,0x0f,0x00,0x1f, +0x00,0x2f,0x00,0x52,0x40,0x4f,0x1d,0x14,0x02,0x01,0x03,0x0f,0x01,0x00,0x01,0x0e,0x0d,0x0c,0x09,0x04,0x02,0x00,0x1c,0x15,0x02,0x04,0x02,0x04,0x4c,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x69,0x07,0x01,0x03,0x03,0x06,0x5f,0x00,0x06,0x06,0x13,0x4d,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05, +0x11,0x05,0x4e,0x11,0x10,0x2e,0x2b,0x26,0x23,0x19,0x17,0x10,0x1f,0x11,0x1f,0x13,0x13,0x12,0x08,0x07,0x19,0x2b,0x01,0x14,0x0e,0x01,0x26,0x34,0x36,0x1e,0x01,0x01,0x15,0x21,0x35,0x37,0x17,0x01,0x25,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x37,0x21,0x32,0x36,0x27,0x11,0x34,0x26,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x11, +0x34,0x36,0x37,0x21,0x32,0x16,0x01,0x65,0x3e,0x5a,0x3e,0x3e,0x5a,0x3e,0x02,0x3c,0xfc,0xee,0xb2,0x5a,0x01,0x1d,0x01,0x1e,0xfc,0x83,0x07,0x0a,0x01,0x0c,0x06,0x03,0x7d,0x07,0x0c,0x01,0x0a,0x51,0x34,0x25,0xfc,0x83,0x24,0x36,0x01,0x34,0x25,0x03,0x7d,0x25,0x34,0x02,0x11,0x2d,0x3e,0x02,0x42,0x56,0x42,0x04,0x3a,0xfe,0xfa,0xfa, +0x6b,0xb3,0x59,0x01,0x1d,0xa1,0x0a,0x08,0xfd,0x5a,0x07,0x0c,0x01,0x0a,0x08,0x02,0xa6,0x08,0x0a,0x12,0xfd,0x5a,0x25,0x34,0x01,0x36,0x24,0x02,0xa6,0x25,0x34,0x01,0x36,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xba,0x00,0xf0,0x03,0x02,0x00,0x13,0x00,0x1c,0x00,0x25,0x00,0x39,0x40,0x36,0x13,0x0a,0x09,0x00,0x04,0x05,0x02,0x01, +0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x13,0x4d,0x06,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x11,0x00,0x4e,0x1e,0x1d,0x22,0x21,0x1d,0x25,0x1e,0x25,0x13,0x17,0x19,0x14,0x07,0x07,0x1a,0x2b,0x37,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16, +0x15,0x14,0x07,0x27,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0xa8,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x48,0x74,0x28,0x38,0x2a,0x2a,0x38,0x28,0x44,0x1c,0x2a,0x2a,0x38,0x28,0x28,0xa2,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c, +0x22,0x6e,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x46,0x28,0x3a,0x28,0x28,0x3a,0x28,0x00,0x03,0xff,0xff,0xff,0x6a,0x04,0x78,0x03,0x52,0x00,0x03,0x00,0x0c,0x00,0x26,0x00,0x38,0x40,0x35,0x00,0x08,0x00,0x03,0x04,0x08,0x03,0x67,0x07,0x01,0x04,0x00,0x01,0x02,0x04,0x01,0x67,0x00,0x02,0x00,0x05,0x00,0x02,0x05,0x67,0x00,0x00,0x06, +0x06,0x00,0x57,0x00,0x00,0x00,0x06,0x60,0x00,0x06,0x00,0x06,0x50,0x33,0x25,0x33,0x26,0x21,0x11,0x11,0x11,0x10,0x09,0x07,0x1f,0x2b,0x17,0x21,0x11,0x29,0x02,0x11,0x21,0x15,0x33,0x32,0x16,0x15,0x01,0x11,0x14,0x06,0x23,0x21,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x33,0x21,0x35,0x34,0x36,0x33,0x21,0x32,0x16, +0x8f,0x01,0xac,0xfe,0x54,0x02,0x3b,0x01,0x1e,0xfe,0x53,0x36,0x25,0x34,0x01,0xad,0x34,0x25,0xfe,0xac,0x34,0x25,0xfd,0xe8,0x24,0x36,0x01,0x34,0x25,0x01,0x54,0x34,0x25,0x02,0x18,0x24,0x36,0x07,0x01,0x1e,0x01,0xac,0x8f,0x34,0x25,0x01,0x1e,0xfd,0xe8,0x25,0x34,0xc5,0x25,0x34,0x34,0x25,0x02,0x18,0x25,0x34,0xc5,0x25,0x34,0x34, +0x00,0x01,0xff,0xff,0xff,0xb1,0x03,0xe8,0x00,0xcf,0x00,0x0f,0x00,0x13,0x40,0x10,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x11,0x00,0x4e,0x35,0x33,0x02,0x07,0x18,0x2b,0x25,0x15,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0xe8,0x34,0x25,0xfc,0xca,0x24,0x36,0x01,0x34,0x25,0x03,0x36,0x25,0x34, +0x76,0x6b,0x25,0x34,0x01,0x36,0x24,0x6b,0x25,0x34,0x34,0x00,0x00,0x03,0x00,0x00,0xff,0x6a,0x03,0xa1,0x03,0x0b,0x00,0x03,0x00,0x07,0x00,0x1f,0x00,0x1f,0x40,0x1c,0x07,0x06,0x05,0x03,0x02,0x01,0x00,0x07,0x00,0x01,0x01,0x4c,0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x13,0x00,0x4e,0x1b,0x1e,0x02,0x07,0x18,0x2b,0x05,0x25,0x11, +0x05,0x27,0x2d,0x01,0x0d,0x01,0x11,0x14,0x06,0x07,0x05,0x06,0x22,0x27,0x25,0x2e,0x01,0x35,0x11,0x34,0x36,0x37,0x25,0x36,0x32,0x17,0x05,0x1e,0x01,0x01,0xf4,0x01,0x65,0xfe,0x9b,0x24,0x01,0x86,0xfe,0x7a,0xfe,0x7b,0x03,0x56,0x14,0x12,0xfe,0x77,0x0f,0x26,0x0f,0xfe,0x77,0x11,0x14,0x1a,0x15,0x01,0x89,0x0c,0x18,0x0d,0x01,0x89, +0x15,0x1a,0x3b,0xc3,0x01,0x63,0x82,0x3f,0x8d,0x8e,0x8e,0x01,0xfe,0x54,0x14,0x22,0x09,0xd6,0x09,0x09,0xd6,0x0a,0x20,0x15,0x01,0xac,0x17,0x24,0x08,0x8f,0x05,0x05,0x8f,0x08,0x24,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x44,0x02,0x80,0x00,0x13,0x00,0x31,0x40,0x2e,0x00,0x05,0x00,0x02,0x05,0x59,0x04,0x06,0x02,0x00,0x03,0x01, +0x01,0x02,0x00,0x01,0x67,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x05,0x02,0x51,0x01,0x00,0x11,0x10,0x0e,0x0c,0x0b,0x09,0x07,0x06,0x04,0x02,0x00,0x13,0x01,0x13,0x07,0x07,0x16,0x2b,0x01,0x32,0x14,0x2b,0x01,0x15,0x14,0x22,0x3d,0x01,0x23,0x22,0x34,0x3b,0x01,0x35,0x34,0x32,0x1d,0x01,0x02,0x26,0x1e,0x1e,0xd2,0x64,0xd2,0x1e,0x1e, +0xd2,0x64,0x01,0x90,0x64,0xd2,0x1e,0x1e,0xd2,0x64,0xd2,0x1e,0x1e,0xd2,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x44,0x01,0x90,0x00,0x07,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x01,0x00,0x05,0x02,0x00,0x07,0x01,0x06,0x03,0x07,0x16,0x2b,0x01,0x32, +0x14,0x23,0x21,0x22,0x34,0x33,0x02,0x26,0x1e,0x1e,0xfd,0xf8,0x1e,0x1e,0x01,0x90,0x64,0x64,0x00,0x00,0x00,0x01,0xff,0xfd,0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x0c,0x00,0x13,0x40,0x10,0x00,0x01,0x01,0x13,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x15,0x13,0x02,0x07,0x18,0x2b,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e, +0x01,0x03,0x59,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xf4,0xba,0x7e,0x01,0x5e,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x3c,0x01,0xed,0x00,0x0e,0x00,0x1e,0x40,0x1b,0x00,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01, +0x00,0x51,0x35,0x14,0x02,0x07,0x18,0x2b,0x01,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x26,0x34,0x36,0x33,0x21,0x32,0x16,0x02,0x3b,0x0a,0xfa,0x0b,0x1c,0x0b,0xfa,0x0b,0x16,0x0e,0x01,0xf4,0x0e,0x16,0x01,0xc9,0x0e,0x0b,0xfa,0x0b,0x0b,0xfa,0x0b,0x1c,0x16,0x16,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0xa0,0x03,0x0b,0x00,0x2d, +0x00,0x42,0x00,0x48,0x40,0x45,0x3b,0x01,0x04,0x06,0x25,0x01,0x05,0x04,0x02,0x4c,0x00,0x07,0x01,0x02,0x01,0x07,0x02,0x80,0x00,0x06,0x02,0x04,0x02,0x06,0x04,0x80,0x00,0x04,0x05,0x02,0x04,0x05,0x7e,0x00,0x05,0x03,0x02,0x05,0x03,0x7e,0x00,0x03,0x00,0x00,0x03,0x00,0x64,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x13,0x02,0x4e, +0x14,0x17,0x15,0x27,0x35,0x39,0x35,0x33,0x08,0x07,0x1e,0x2b,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x17,0x1e,0x01,0x0f,0x01,0x06,0x23,0x27,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x3d,0x01,0x34,0x3f,0x01,0x36,0x33,0x32,0x17,0x16,0x13,0x01,0x06,0x22,0x2f,0x01, +0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x01,0x36,0x32,0x1f,0x01,0x16,0x14,0x03,0x12,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x23,0x1e,0x09,0x03,0x07,0x1b,0x06,0x07,0x05,0x0d,0x0c,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x05,0x24,0x06,0x07,0x03,0x04,0x0b,0x81,0xfe,0x39,0x0d,0x24,0x0e,0xf0,0x0e, +0x0e,0x3d,0x0e,0x24,0x0e,0x93,0x01,0x69,0x0d,0x24,0x0e,0x3e,0x0d,0x01,0x4b,0xb1,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x5e,0x01,0x0e,0x04,0x13,0x06,0x1c,0x05,0x01,0x03,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x8d,0x08,0x05,0x23,0x06,0x02,0x04,0x01,0x05,0xfe,0x3a,0x0e,0x0e,0xf0,0x0d,0x24,0x0e,0x3e,0x0d,0x0d,0x93,0x01, +0x69,0x0d,0x0d,0x3d,0x0e,0x24,0x00,0x00,0x00,0x06,0x00,0x00,0xff,0xb1,0x03,0x12,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3b,0x00,0x43,0x00,0x67,0x00,0x5d,0x40,0x5a,0x57,0x45,0x02,0x06,0x08,0x29,0x21,0x19,0x11,0x09,0x01,0x06,0x00,0x01,0x02,0x4c,0x00,0x09,0x0e,0x08,0x0e,0x09,0x08,0x80,0x0f,0x0d,0x02,0x08,0x0c,0x0a, +0x02,0x06,0x01,0x08,0x06,0x68,0x05,0x03,0x02,0x01,0x04,0x02,0x02,0x00,0x07,0x01,0x00,0x69,0x00,0x0e,0x0e,0x13,0x4d,0x00,0x07,0x07,0x0b,0x5f,0x00,0x0b,0x0b,0x11,0x0b,0x4e,0x65,0x64,0x61,0x5e,0x5b,0x59,0x53,0x52,0x4f,0x4c,0x49,0x47,0x41,0x3f,0x14,0x24,0x14,0x26,0x26,0x26,0x26,0x26,0x23,0x10,0x07,0x1f,0x2b,0x01,0x11,0x14, +0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x13,0x11,0x21,0x11,0x14,0x1e,0x01,0x33,0x21,0x32,0x3e,0x01,0x01,0x33,0x27,0x26,0x27,0x23,0x06, +0x07,0x05,0x15,0x14,0x06,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x37,0x3e,0x01,0x37,0x33,0x32,0x16,0x1f,0x01,0x33,0x32,0x16,0x01,0x1e,0x0a,0x08,0x24,0x08,0x0a,0x0a,0x08,0x24,0x08,0x0a,0x8f,0x0a,0x08,0x24,0x08,0x0a,0x0a,0x08,0x24,0x08,0x0a,0x8e,0x0a,0x07,0x24, +0x08,0x0a,0x0a,0x08,0x24,0x07,0x0a,0x48,0xfe,0x0c,0x08,0x08,0x02,0x01,0xd0,0x02,0x08,0x08,0xfe,0x89,0xfa,0x1b,0x04,0x05,0xb1,0x06,0x04,0x01,0xeb,0x0a,0x08,0x36,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x35,0x08,0x0a,0x0a,0x08,0xac,0x27,0x09,0x2c,0x16,0xb2,0x17,0x2a,0x09,0x27,0xad,0x08,0x0a,0x01,0xb7,0xfe,0xbf,0x08,0x0a,0x0a, +0x08,0x01,0x41,0x08,0x0a,0x0a,0x08,0xfe,0xbf,0x08,0x0a,0x0a,0x08,0x01,0x41,0x08,0x0a,0x0a,0x08,0xfe,0xbf,0x08,0x0a,0x0a,0x08,0x01,0x41,0x08,0x0a,0x0a,0xfe,0x64,0x02,0x11,0xfd,0xef,0x0c,0x14,0x0a,0x0a,0x14,0x02,0x65,0x41,0x05,0x01,0x01,0x05,0x53,0x24,0x08,0x0a,0xfd,0xef,0x2e,0x44,0x42,0x2e,0x02,0x13,0x0a,0x08,0x24,0x08, +0x0a,0x5d,0x15,0x1c,0x01,0x1e,0x14,0x5d,0x0a,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0x9c,0x03,0xac,0x03,0x20,0x00,0x2a,0x00,0x34,0x40,0x09,0x20,0x1e,0x16,0x12,0x04,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x00,0x01,0x01,0x10,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x1b,0x40,0x0b,0x00,0x00,0x00,0x01,0x61,0x00, +0x01,0x01,0x10,0x00,0x4e,0x59,0xb5,0x1b,0x1a,0x13,0x02,0x07,0x17,0x2b,0x25,0x16,0x1d,0x01,0x21,0x35,0x34,0x37,0x3e,0x01,0x35,0x34,0x26,0x27,0x2e,0x03,0x27,0x34,0x36,0x3f,0x01,0x26,0x27,0x26,0x36,0x32,0x16,0x0f,0x01,0x16,0x15,0x0e,0x03,0x07,0x0e,0x01,0x15,0x14,0x16,0x02,0xe0,0xcc,0xfc,0x54,0xcc,0x5e,0x44,0x2c,0x0a,0x02, +0x0e,0x0e,0x0e,0x02,0x0a,0x04,0x04,0x08,0x04,0x04,0x5a,0xe0,0x5c,0x06,0x0c,0x12,0x02,0x0e,0x0e,0x0e,0x02,0x08,0x2e,0x46,0x80,0x48,0x32,0x6a,0x6a,0x32,0x48,0x22,0x46,0x3c,0x16,0x36,0x2e,0x0c,0x0c,0x04,0x1e,0x1c,0x10,0x14,0x02,0x04,0x32,0x26,0x36,0x74,0x74,0x36,0x58,0x08,0x22,0x1c,0x1e,0x04,0x0c,0x0c,0x30,0x34,0x16,0x3c, +0x46,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xb6,0x03,0xe8,0x03,0x08,0x00,0x18,0x00,0x20,0x00,0x2d,0x00,0x94,0xb5,0x25,0x01,0x09,0x0b,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x30,0x0d,0x01,0x0b,0x08,0x09,0x08,0x0b,0x72,0x0c,0x01,0x05,0x00,0x01,0x05,0x57,0x06,0x03,0x02,0x01,0x04,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x07, +0x07,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x0a,0x01,0x08,0x08,0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x1b,0x40,0x31,0x0d,0x01,0x0b,0x08,0x09,0x08,0x0b,0x09,0x80,0x0c,0x01,0x05,0x00,0x01,0x05,0x57,0x06,0x03,0x02,0x01,0x04,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x07,0x07,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x0a,0x01,0x08,0x08, +0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x59,0x40,0x1e,0x21,0x21,0x00,0x00,0x21,0x2d,0x21,0x2d,0x2c,0x2b,0x29,0x26,0x23,0x22,0x20,0x1d,0x1b,0x1a,0x00,0x18,0x00,0x18,0x12,0x24,0x35,0x22,0x11,0x0e,0x07,0x1b,0x2b,0x01,0x15,0x21,0x13,0x36,0x3b,0x01,0x36,0x3f,0x01,0x3e,0x01,0x3b,0x01,0x32,0x16,0x17,0x16,0x17,0x33,0x32,0x17, +0x13,0x21,0x35,0x03,0x07,0x21,0x27,0x26,0x2b,0x01,0x22,0x13,0x35,0x21,0x06,0x07,0x06,0x23,0x21,0x22,0x35,0x27,0x21,0x15,0x01,0xc8,0xfe,0x38,0x0a,0x04,0x60,0xa0,0x10,0x15,0x17,0x0e,0x12,0x1c,0xde,0x1a,0x14,0x0c,0x12,0x2a,0xa0,0x60,0x04,0x0a,0xfe,0x3a,0xa4,0x1c,0x01,0x24,0x1c,0x0e,0x1c,0x98,0x1c,0x96,0x01,0xae,0x06,0x04, +0x06,0x54,0xfd,0x12,0x5a,0x0a,0x01,0xae,0x01,0x46,0x64,0x01,0x24,0x6c,0x1a,0x29,0x2d,0x1a,0x0c,0x0e,0x18,0x20,0x50,0x6c,0xfe,0xdc,0x64,0x01,0x62,0x36,0x36,0x1a,0xfd,0x8a,0x64,0x58,0x4e,0x54,0x54,0xa6,0x64,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0xcc,0x00,0x08,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01, +0x01,0x00,0x59,0x02,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x01,0x00,0x05,0x04,0x00,0x08,0x01,0x08,0x03,0x07,0x16,0x2b,0x13,0x32,0x16,0x14,0x06,0x22,0x26,0x34,0x36,0x6e,0x2e,0x40,0x40,0x5c,0x40,0x40,0x01,0xcc,0x40,0x5a,0x42,0x42,0x5a,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x67,0x02,0x7c,0x00,0x0d, +0x00,0x1e,0x40,0x1b,0x00,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x17,0x13,0x02,0x07,0x18,0x2b,0x01,0x11,0x14,0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x16,0x01,0x65,0x14,0x20,0x09,0xfa,0x0a,0x0a,0xfa,0x0b,0x1c,0x18,0x02,0x58,0xfe,0x0c,0x0e,0x16, +0x0b,0xfa,0x0b,0x1c,0x0b,0xfa,0x0b,0x16,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x41,0x02,0x7d,0x00,0x0e,0x00,0x0a,0xb7,0x00,0x00,0x00,0x76,0x14,0x01,0x07,0x17,0x2b,0x01,0x14,0x0f,0x01,0x06,0x22,0x26,0x35,0x11,0x34,0x3e,0x01,0x1f,0x01,0x16,0x01,0x41,0x0a,0xfa,0x0b,0x1c,0x16,0x16,0x1c,0x0b,0xfa,0x0a,0x01,0x5e,0x0e,0x0b,0xfa, +0x0b,0x16,0x0e,0x01,0xf4,0x0f,0x14,0x02,0x0c,0xfa,0x0a,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x02,0x3b,0x01,0xc9,0x00,0x0e,0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x15,0x32,0x02,0x07,0x18,0x2b,0x25,0x14,0x06,0x27,0x21,0x22,0x2e,0x01,0x3f,0x01,0x36,0x32,0x1f,0x01, +0x16,0x02,0x3b,0x14,0x0f,0xfe,0x0c,0x0f,0x14,0x02,0x0c,0xfa,0x0a,0x1e,0x0a,0xfa,0x0a,0xab,0x0e,0x16,0x01,0x14,0x1e,0x0b,0xfa,0x0a,0x0a,0xfa,0x0b,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x5e,0x02,0x51,0x00,0x15,0x00,0x1e,0x40,0x1b,0x03,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00, +0x61,0x00,0x00,0x01,0x00,0x51,0x17,0x19,0x02,0x07,0x18,0x2b,0x01,0x14,0x0f,0x01,0x17,0x16,0x14,0x0f,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x37,0x01,0x36,0x32,0x1f,0x01,0x16,0x01,0x5e,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x0e,0x06,0xfe,0xfc,0x06,0x06,0x01,0x04,0x05,0x10,0x04,0x1c,0x06,0x02,0x22,0x07,0x05,0xdc,0xdb,0x06,0x0e, +0x06,0x1c,0x05,0x05,0x01,0x05,0x05,0x0e,0x06,0x01,0x04,0x06,0x06,0x1c,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x4c,0x02,0x51,0x00,0x15,0x00,0x1e,0x40,0x1b,0x0b,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1c,0x14,0x02,0x07,0x18,0x2b,0x01,0x14,0x07,0x01, +0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x27,0x26,0x34,0x3f,0x01,0x36,0x32,0x17,0x01,0x16,0x01,0x4c,0x05,0xfe,0xfb,0x05,0x0e,0x06,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x10,0x04,0x01,0x05,0x05,0x01,0x3a,0x07,0x05,0xfe,0xfb,0x05,0x05,0x1c,0x06,0x0e,0x06,0xdb,0xdc,0x05,0x0e,0x06,0x1c,0x06,0x06,0xfe,0xfc,0x05,0x00, +0x00,0x03,0xff,0xfc,0xff,0x90,0x03,0x9a,0x03,0x2c,0x00,0x08,0x00,0x16,0x00,0x3f,0x00,0x83,0x40,0x0b,0x38,0x36,0x02,0x03,0x05,0x13,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x24,0x50,0x58,0x40,0x24,0x00,0x05,0x06,0x03,0x06,0x05,0x03,0x80,0x00,0x06,0x00,0x03,0x02,0x06,0x03,0x69,0x08,0x01,0x02,0x00,0x01,0x02,0x01,0x66,0x00,0x04, +0x04,0x00,0x61,0x07,0x01,0x00,0x00,0x12,0x04,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x06,0x03,0x06,0x05,0x03,0x80,0x07,0x01,0x00,0x00,0x04,0x06,0x00,0x04,0x69,0x00,0x06,0x00,0x03,0x02,0x06,0x03,0x69,0x08,0x01,0x02,0x01,0x01,0x02,0x59,0x08,0x01,0x02,0x02,0x01,0x62,0x00,0x01,0x02,0x01,0x52,0x59,0x40,0x19,0x0a,0x09,0x01,0x00,0x27, +0x26,0x22,0x20,0x1d,0x1b,0x11,0x0e,0x09,0x16,0x0a,0x16,0x05,0x04,0x00,0x08,0x01,0x08,0x09,0x07,0x16,0x2b,0x01,0x36,0x00,0x12,0x00,0x04,0x00,0x02,0x00,0x13,0x32,0x36,0x35,0x36,0x26,0x2b,0x01,0x22,0x06,0x07,0x14,0x16,0x17,0x13,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x07,0x15,0x33,0x35,0x34,0x37,0x36,0x32,0x17,0x16,0x15, +0x14,0x07,0x06,0x0f,0x01,0x06,0x0f,0x01,0x06,0x07,0x06,0x07,0x15,0x33,0x35,0x34,0x37,0x36,0x3f,0x01,0x36,0x01,0xc6,0xbe,0x01,0x10,0x06,0xfe,0xf6,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0c,0xbc,0x1e,0x26,0x02,0x26,0x1e,0x02,0x1c,0x26,0x02,0x26,0x1c,0xa8,0x1a,0x6a,0x52,0x40,0x28,0x44,0x04,0x6e,0x10,0x10,0x4e,0x0c,0x10,0x10,0x08, +0x0c,0x16,0x0a,0x0a,0x15,0x0b,0x06,0x0e,0x04,0x6c,0x04,0x06,0x16,0x1c,0x2e,0x03,0x2a,0x02,0xfe,0xf8,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0a,0x01,0x7c,0x01,0x12,0xfd,0x1e,0x26,0x1c,0x1e,0x26,0x24,0x1c,0x1e,0x26,0x02,0x01,0x48,0x22,0x2c,0x4e,0x4c,0x1a,0x2a,0x68,0x04,0x04,0x1a,0x1c,0x18,0x14,0x14,0x18,0x12,0x16,0x0c,0x08,0x0f, +0x07,0x08,0x11,0x09,0x08,0x14,0x3a,0x08,0x04,0x0c,0x10,0x14,0x10,0x12,0x22,0x00,0x00,0x02,0x00,0x00,0xff,0xbd,0x03,0x4d,0x03,0x0b,0x00,0x08,0x00,0x1d,0x00,0x3a,0xb5,0x00,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x29,0x50,0x58,0x40,0x10,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x00,0x01,0x01,0x11,0x01,0x4e,0x1b,0x40, +0x10,0x00,0x01,0x00,0x01,0x86,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x13,0x00,0x4e,0x59,0xb5,0x38,0x1a,0x12,0x03,0x07,0x19,0x2b,0x13,0x34,0x26,0x0e,0x01,0x1e,0x02,0x36,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x2e,0x01,0x3d,0x01,0x34,0x36,0x37,0x33,0x32,0x16,0x17,0x01,0x16,0xfa,0x2a,0x3a,0x2c,0x02,0x28,0x3e,0x26,0x02, +0x55,0x14,0xfe,0xee,0x16,0x3b,0x14,0xfe,0x71,0x15,0x1e,0x2a,0x1d,0xe9,0x1d,0x48,0x15,0x01,0x8f,0x14,0x02,0x58,0x1e,0x2a,0x02,0x26,0x40,0x24,0x06,0x30,0xfe,0xd9,0x1e,0x15,0xfe,0xee,0x15,0x15,0x01,0x8f,0x15,0x48,0x1d,0xe8,0x1d,0x2a,0x01,0x1e,0x15,0xfe,0x71,0x15,0x00,0x0d,0x00,0x00,0xff,0xea,0x03,0xca,0x02,0xd2,0x00,0x03, +0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0xa9,0x40,0xa6,0x18,0x12,0x0c,0x03,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x20,0x19,0x13,0x1d,0x0d,0x05,0x07,0x03,0x00,0x07,0x03,0x7e,0x17,0x11,0x0b,0x03,0x05,0x02,0x04,0x02,0x05,0x04,0x80,0x16,0x10, +0x0a,0x03,0x04,0x01,0x02,0x04,0x01,0x7e,0x00,0x00,0x14,0x1e,0x0f,0x08,0x1b,0x05,0x03,0x02,0x00,0x03,0x67,0x1f,0x15,0x0e,0x1c,0x09,0x05,0x02,0x05,0x01,0x02,0x58,0x1f,0x15,0x0e,0x1c,0x09,0x05,0x02,0x02,0x01,0x5f,0x1a,0x01,0x01,0x02,0x01,0x4f,0x30,0x30,0x28,0x28,0x1c,0x1c,0x18,0x18,0x10,0x10,0x04,0x04,0x00,0x00,0x30,0x33, +0x30,0x33,0x32,0x31,0x2f,0x2e,0x2d,0x2c,0x28,0x2b,0x28,0x2b,0x2a,0x29,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x17,0x16,0x15,0x14,0x10,0x13,0x10,0x13,0x12,0x11,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x21, +0x07,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x33,0x35,0x03,0x33,0x35,0x23,0x13,0x23,0x15,0x33,0x17,0x35,0x23,0x1d,0x01,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x05,0x15,0x33,0x35,0x03,0x33,0x35,0x23,0x13,0x23,0x15,0x33,0x17,0x35,0x23,0x1d,0x01,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x03,0xca,0xfe,0x3d,0x9f,0x9f,0x9f,0x9f,0x9f, +0x9f,0x9f,0xe1,0x9e,0x9e,0x9e,0x9e,0x9e,0xfd,0x5b,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0xe1,0x9d,0x9d,0x9d,0x9d,0x9d,0x16,0x02,0xe8,0xfd,0x18,0x01,0xc4,0x9f,0x9f,0xfe,0x80,0x9d,0x01,0xc4,0x9e,0xe2,0x9f,0x9f,0xe1,0x9d,0x01,0x26,0x9e,0x9e,0x43,0x9f,0x9f,0xfe,0x80,0x9d,0x01,0xc4,0x9e,0xe2,0x9f,0x9f,0xe1,0x9d,0x01,0x26,0x9e, +0x9e,0x00,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0xf9,0x04,0x19,0x03,0x0b,0x00,0x12,0x00,0x29,0x00,0x20,0x40,0x1d,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x00,0x63,0x00,0x03,0x03,0x13,0x03,0x4e,0x23,0x3a,0x23,0x36,0x35,0x05,0x07,0x1b,0x2b,0x01,0x14,0x0f,0x01,0x0e,0x01,0x23,0x21,0x22,0x2e,0x01,0x3f, +0x01,0x3e,0x01,0x33,0x21,0x32,0x16,0x27,0x15,0x21,0x22,0x06,0x0f,0x02,0x27,0x26,0x37,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x04,0x19,0x12,0xbb,0x18,0x56,0x26,0xfd,0xa1,0x13,0x1c,0x01,0x11,0xbc,0x18,0x56,0x25,0x02,0x5f,0x13,0x1e,0xc0,0xfe,0x30,0x35,0x72,0x23,0xbc,0x02,0x01,0x01,0x01,0x4a,0x33,0xb3, +0x33,0x4a,0x01,0x2f,0x34,0x48,0x01,0x3f,0x11,0x14,0xdd,0x1c,0x28,0x0e,0x22,0x14,0xdd,0x1c,0x28,0x0e,0xaf,0x5a,0x34,0x29,0xdd,0x03,0x07,0x05,0x02,0x02,0x18,0x33,0x4a,0x4a,0x33,0x12,0x4a,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf9,0x03,0xa1,0x03,0x0b,0x00,0x14,0x00,0x16,0x40,0x13,0x00,0x02,0x00,0x00,0x02,0x00,0x64,0x00, +0x01,0x01,0x13,0x01,0x4e,0x23,0x35,0x33,0x03,0x07,0x19,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x03,0xa1,0x4a,0x33,0xfd,0x59,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x77,0x33,0x4a,0x01,0xff,0xfe,0x77,0x33,0x4a,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33, +0x12,0x4a,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf2,0x02,0xf8,0x02,0xcc,0x00,0x06,0x00,0x1d,0x40,0x1a,0x01,0x01,0x00,0x49,0x00,0x01,0x00,0x01,0x85,0x03,0x02,0x02,0x00,0x00,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x12,0x04,0x07,0x18,0x2b,0x09,0x02,0x33,0x11,0x21,0x11,0x02,0xf8,0xfe,0x84,0xfe,0x84,0xc0,0x01,0x78,0x01,0x6e, +0xfe,0x84,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0x00,0x02,0xff,0xf7,0xff,0xe2,0x03,0xdb,0x03,0x12,0x00,0x17,0x00,0x20,0x00,0x26,0x40,0x23,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x19,0x18,0x1d,0x1c,0x18,0x20,0x19,0x20,0x2f,0x04,0x07,0x17,0x2b,0x01,0x1e, +0x01,0x06,0x07,0x06,0x26,0x06,0x07,0x06,0x1e,0x01,0x07,0x0e,0x02,0x23,0x22,0x26,0x37,0x3e,0x01,0x37,0x24,0x03,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x03,0x59,0x48,0x3a,0x12,0x1a,0x10,0x4c,0x54,0x26,0x1e,0x12,0x32,0x02,0x02,0x44,0xb8,0x7c,0xba,0xd2,0x0a,0x08,0xc0,0x78,0x01,0x22,0x48,0x1e,0x2c,0x2c,0x3e,0x2c,0x2c,0x02, +0x6e,0x30,0x7c,0x54,0x06,0x04,0x1c,0x08,0x2a,0x2e,0x3a,0x48,0x0e,0x1a,0x4a,0x4a,0xca,0x90,0x76,0xea,0x22,0x54,0xfd,0x8a,0x2c,0x40,0x2a,0x2a,0x40,0x2c,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x6a,0x03,0x59,0x03,0x52,0x00,0x06,0x00,0x18,0x00,0x33,0x40,0x30,0x01,0x01,0x00,0x03,0x01,0x4c,0x00,0x03,0x00,0x03,0x85,0x04,0x01,0x00, +0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x18,0x16,0x11,0x0e,0x0b,0x09,0x00,0x06,0x00,0x06,0x05,0x07,0x16,0x2b,0x01,0x11,0x16,0x1f,0x01,0x16,0x17,0x05,0x14,0x16,0x17,0x21,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x21,0x02,0x3b,0x0d,0x08, +0xe3,0x08,0x08,0xfe,0xb1,0x20,0x16,0x01,0x2f,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x01,0xbe,0x02,0x34,0x01,0x08,0x08,0x08,0xe4,0x07,0x0d,0x12,0x16,0x1e,0x01,0xfd,0xb3,0x17,0x1e,0x01,0x20,0x16,0x03,0x7c,0x17,0x1e,0x01,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x08,0x00,0x6a,0x00,0x45, +0x40,0x42,0x65,0x59,0x4c,0x41,0x04,0x00,0x04,0x3b,0x0a,0x02,0x01,0x00,0x34,0x28,0x1b,0x10,0x04,0x03,0x01,0x03,0x4c,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x69,0x00,0x00,0x00,0x05,0x5f,0x00,0x05,0x05,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x5c,0x5b,0x53,0x51,0x49,0x48,0x2b,0x2a,0x22,0x20,0x13, +0x12,0x07,0x07,0x18,0x2b,0x01,0x34,0x26,0x22,0x0e,0x01,0x16,0x32,0x36,0x25,0x15,0x14,0x06,0x0f,0x01,0x06,0x07,0x16,0x17,0x16,0x14,0x07,0x0e,0x01,0x27,0x22,0x2f,0x01,0x06,0x07,0x06,0x07,0x06,0x2b,0x01,0x22,0x26,0x35,0x27,0x26,0x27,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x34,0x37,0x3e,0x01,0x37,0x26,0x2f,0x01,0x2e,0x01,0x27, +0x35,0x34,0x36,0x3f,0x01,0x36,0x37,0x26,0x27,0x26,0x34,0x37,0x3e,0x01,0x33,0x32,0x1f,0x01,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x32,0x16,0x1f,0x01,0x16,0x17,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x14,0x07,0x0e,0x01,0x07,0x16,0x1f,0x01,0x1e,0x01,0x02,0x3b,0x52,0x78,0x52,0x02,0x56,0x74,0x56,0x01,0x1c,0x08,0x07,0x68,0x0a,0x0b, +0x13,0x28,0x06,0x05,0x0f,0x50,0x0d,0x07,0x07,0x4d,0x19,0x1a,0x09,0x07,0x04,0x10,0x7c,0x08,0x0c,0x10,0x1b,0x17,0x4f,0x06,0x10,0x06,0x46,0x16,0x04,0x05,0x08,0x28,0x0a,0x0f,0x08,0x66,0x07,0x08,0x01,0x0a,0x05,0x68,0x08,0x0e,0x17,0x25,0x06,0x05,0x0f,0x50,0x0d,0x07,0x08,0x4d,0x18,0x1a,0x09,0x08,0x03,0x11,0x7c,0x07,0x0c,0x01, +0x0f,0x1c,0x17,0x4f,0x05,0x0f,0x07,0x48,0x14,0x04,0x04,0x09,0x28,0x0a,0x0f,0x08,0x66,0x07,0x0a,0x01,0x5e,0x3b,0x54,0x54,0x76,0x54,0x54,0x78,0x7c,0x07,0x0c,0x01,0x10,0x1e,0x15,0x1b,0x32,0x06,0x0e,0x06,0x15,0x50,0x01,0x05,0x3c,0x0d,0x08,0x4c,0x1c,0x10,0x0a,0x07,0x67,0x09,0x0c,0x3c,0x05,0x06,0x40,0x1e,0x05,0x0e,0x06,0x0c, +0x32,0x0f,0x1c,0x1b,0x0f,0x01,0x0c,0x07,0x7c,0x07,0x0c,0x01,0x10,0x19,0x1a,0x20,0x2d,0x07,0x0c,0x07,0x14,0x50,0x05,0x3c,0x0d,0x08,0x4c,0x1c,0x10,0x0a,0x07,0x67,0x09,0x0b,0x3b,0x05,0x05,0x43,0x1c,0x05,0x0e,0x06,0x0c,0x32,0x0f,0x1c,0x1a,0x10,0x01,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0xff,0xf9,0x03,0xe8,0x03,0x0b,0x00,0x0f, +0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x5f,0x00,0x6f,0x00,0x7f,0x00,0x8f,0x00,0x47,0x40,0x44,0x0f,0x09,0x02,0x03,0x0e,0x08,0x02,0x02,0x01,0x03,0x02,0x67,0x0b,0x05,0x02,0x01,0x0a,0x04,0x02,0x00,0x01,0x00,0x63,0x10,0x0c,0x02,0x06,0x06,0x07,0x5f,0x11,0x0d,0x02,0x07,0x07,0x13,0x06,0x4e,0x8e,0x8b,0x86,0x83,0x7e,0x7b, +0x76,0x73,0x6e,0x6b,0x66,0x63,0x5e,0x5b,0x56,0x53,0x4e,0x4b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x12,0x07,0x1f,0x2b,0x25,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x13,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x07,0x23,0x22, +0x26,0x27,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x27,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x17,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22, +0x26,0x27,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x37,0x33,0x32,0x16,0x13,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x1e,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2, +0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0xfe,0x9c,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0xfe,0x9c,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2, +0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0x9a,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x01,0x06,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0xfe,0xcd,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x02, +0x24,0x6b,0x16,0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0xfe,0xcc,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0xfe,0xcd,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x02,0x24,0x6b,0x16,0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0xfe,0xcc,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0x01,0x08,0x6b,0x16, +0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0x00,0x00,0x05,0x00,0x00,0xff,0x6a,0x03,0xe8,0x03,0x52,0x00,0x10,0x00,0x14,0x00,0x25,0x00,0x2f,0x00,0x39,0x00,0x65,0x40,0x62,0x33,0x29,0x02,0x07,0x08,0x21,0x01,0x05,0x02,0x1d,0x15,0x0d,0x0c,0x04,0x00,0x05,0x03,0x4c,0x04,0x01,0x05,0x01,0x4b,0x0a,0x01,0x08,0x09,0x01,0x07,0x01,0x08,0x07, +0x67,0x00,0x02,0x05,0x01,0x02,0x57,0x06,0x0c,0x03,0x0b,0x04,0x01,0x00,0x05,0x00,0x01,0x05,0x69,0x06,0x0c,0x03,0x0b,0x04,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x00,0x00,0x37,0x35,0x32,0x31,0x2d,0x2b,0x28,0x27,0x24,0x22,0x1f,0x1e,0x1b,0x19,0x11,0x14,0x11,0x14,0x13,0x12,0x00,0x10,0x00,0x0f,0x37,0x0d, +0x07,0x17,0x2b,0x01,0x11,0x14,0x06,0x07,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x13,0x36,0x33,0x21,0x11,0x23,0x11,0x01,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x22,0x26,0x27,0x11,0x33,0x32,0x17,0x25,0x15,0x23,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x05,0x15,0x23,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x89,0x16, +0x0e,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x8b,0x04,0x0d,0x01,0x9f,0x8e,0x02,0x3b,0x16,0x0e,0xfe,0xe3,0x0f,0x14,0x01,0x0f,0x14,0x01,0xed,0x0d,0x04,0xfe,0x3e,0xc5,0x0a,0x08,0xa1,0x08,0x0a,0x01,0x77,0xc5,0x0a,0x08,0xa1,0x08,0x0a,0x02,0x9f,0xfe,0x54,0x0f,0x14,0x01,0xfe,0xbf,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x01,0xe8,0x0c, +0xfe,0x78,0x01,0x88,0xfe,0x0c,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x41,0x16,0x0e,0x01,0xac,0x0c,0xad,0x7d,0x7d,0x08,0x0a,0x0a,0x08,0x7d,0x7d,0x08,0x0a,0x0a,0x00,0x08,0xff,0xff,0xff,0xf8,0x03,0xe9,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x5f,0x00,0x6f,0x00,0x7f,0x00,0x6f,0x40,0x6c,0x79,0x78, +0x71,0x49,0x48,0x41,0x06,0x08,0x09,0x69,0x61,0x60,0x29,0x21,0x20,0x06,0x04,0x05,0x59,0x58,0x51,0x50,0x19,0x18,0x11,0x10,0x08,0x02,0x03,0x39,0x38,0x31,0x09,0x08,0x01,0x06,0x00,0x01,0x04,0x4c,0x0d,0x01,0x05,0x0c,0x01,0x04,0x03,0x05,0x04,0x67,0x0b,0x01,0x03,0x0a,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01,0x06,0x01,0x00, +0x01,0x00,0x63,0x0e,0x01,0x08,0x08,0x09,0x5f,0x0f,0x01,0x09,0x09,0x13,0x08,0x4e,0x7d,0x7b,0x75,0x73,0x6d,0x6b,0x65,0x64,0x5d,0x5b,0x55,0x54,0x4d,0x4c,0x26,0x26,0x17,0x26,0x17,0x17,0x17,0x17,0x14,0x10,0x07,0x1f,0x2b,0x37,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x27,0x15,0x14,0x06,0x27, +0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x27,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x37,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x27, +0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x17,0x21,0x32,0x16,0x27,0x15,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x27,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x8f,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08, +0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x03,0x58,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0xfc,0xa6,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x03,0x58,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x01,0x0a,0x08,0xfd,0x12,0x07, +0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x01,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x76,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0xd0,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0xce,0x6b,0x07,0x0a,0x01,0x0c,0x06,0x6b,0x08,0x0a,0x0a,0xfe,0x4c,0x6b,0x07,0x0c,0x01,0x0a, +0x08,0x6b,0x07,0x0a,0x01,0x0c,0x02,0x7d,0x6b,0x08,0x0a,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0xfe,0x4d,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0xce,0x6b,0x07,0x0a,0x01,0x0c,0x06,0x6b,0x08,0x0a,0x0a,0xcf,0x6b,0x08,0x0a,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x02,0x83, +0x03,0x0b,0x00,0x07,0x00,0x1f,0x00,0x20,0x40,0x1d,0x05,0x03,0x02,0x00,0x00,0x02,0x00,0x02,0x63,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x13,0x01,0x4e,0x23,0x13,0x25,0x36,0x13,0x10,0x06,0x07,0x1c,0x2b,0x13,0x21,0x35,0x34,0x26,0x0e,0x01,0x17,0x05,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x17,0x33,0x35,0x34, +0x36,0x32,0x16,0x07,0x15,0x33,0x32,0x16,0xb3,0x01,0x1d,0x54,0x76,0x54,0x01,0x01,0xd0,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0x20,0x16,0x11,0x94,0xcc,0x96,0x02,0x12,0x17,0x1e,0x01,0xa5,0x6c,0x3b,0x54,0x02,0x50,0x3d,0xa1,0xfe,0xbe,0x16,0x1e,0x01,0x20,0x15,0x01,0x42,0x16,0x20,0x01,0x6c,0x66,0x94,0x94,0x66,0x6c,0x1e,0x00,0x00, +0x00,0x01,0x00,0x00,0xff,0xe2,0x02,0xda,0x02,0xda,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x01,0x00,0x01,0x4c,0x00,0x01,0x00,0x4a,0x05,0x01,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x11,0x11,0x02,0x07,0x18,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x01,0x01,0x7a,0x01,0x60,0xfe, +0xa0,0xfe,0x86,0x02,0xda,0xbe,0xfe,0x86,0xc0,0x01,0x7c,0x00,0x00,0x02,0xff,0xff,0xff,0xb1,0x04,0x2f,0x03,0x52,0x00,0x0f,0x00,0x2f,0x00,0x2e,0x40,0x2b,0x09,0x01,0x02,0x01,0x00,0x20,0x01,0x03,0x02,0x02,0x4c,0x00,0x05,0x00,0x00,0x01,0x05,0x00,0x67,0x00,0x01,0x04,0x01,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x03,0x11,0x03,0x4e, +0x35,0x26,0x36,0x26,0x26,0x14,0x06,0x07,0x1c,0x2b,0x01,0x11,0x34,0x26,0x27,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x14,0x1e,0x01,0x17,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x34,0x3e,0x01,0x35,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0xe8,0x0a,0x08,0xfc,0x83, +0x07,0x0a,0x01,0x0c,0x06,0x03,0x7d,0x07,0x0c,0x46,0x34,0x25,0xfe,0xd1,0x12,0x10,0x01,0x14,0x0f,0xfe,0xe2,0x0f,0x14,0x01,0x12,0x12,0xfe,0xd0,0x24,0x36,0x01,0x34,0x25,0x03,0x7d,0x25,0x34,0x01,0x28,0x01,0xd1,0x07,0x0a,0x01,0x0c,0x06,0xfe,0x2f,0x07,0x0a,0x0a,0x01,0xd8,0xfd,0xa1,0x25,0x34,0x01,0x14,0x2e,0x22,0x07,0x0e,0x16, +0x16,0x0e,0x08,0x22,0x2c,0x15,0x36,0x24,0x02,0x5f,0x25,0x34,0x34,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xe1,0x02,0xf8,0x02,0xdb,0x00,0x21,0x00,0x31,0x00,0x2f,0x40,0x2c,0x11,0x06,0x02,0x00,0x03,0x01,0x4c,0x00,0x01,0x00,0x01,0x86,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x69,0x00,0x03,0x00,0x00,0x03,0x59,0x00,0x03,0x03,0x00, +0x61,0x00,0x00,0x03,0x00,0x51,0x15,0x2b,0x1d,0x25,0x22,0x05,0x07,0x1b,0x2b,0x01,0x0e,0x01,0x23,0x22,0x26,0x27,0x0f,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x3f,0x02,0x2e,0x01,0x35,0x34,0x37,0x3e,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x25,0x1e,0x01,0x33,0x32,0x3e,0x01,0x34,0x2e,0x01,0x22,0x0e,0x01,0x15,0x14,0x16, +0x02,0xa8,0x29,0x66,0x36,0x31,0x5d,0x28,0x33,0x82,0x15,0x18,0x1e,0x2d,0x0f,0x81,0x7e,0x20,0x22,0x27,0x25,0x80,0x95,0x40,0x3f,0x26,0x26,0x14,0x14,0xfe,0x99,0x19,0x40,0x21,0x2d,0x4f,0x2e,0x2f,0x4e,0x5b,0x4f,0x2f,0x1a,0x01,0x00,0x29,0x2a,0x22,0x20,0x7d,0x82,0x0f,0x2f,0x1e,0x1a,0x13,0x82,0x33,0x26,0x5e,0x32,0x4b,0x40,0x3f, +0x4b,0x27,0x25,0x3f,0x41,0x4a,0x38,0x32,0x34,0x24,0x18,0x1a,0x2e,0x4f,0x5d,0x4e,0x2e,0x2f,0x4e,0x2d,0x22,0x40,0x00,0x00,0x00,0x02,0xff,0xfd,0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x0c,0x00,0x19,0x00,0x28,0x40,0x25,0x04,0x01,0x00,0x00,0x03,0x61,0x00,0x03,0x03,0x13,0x4d,0x00,0x01,0x01,0x02,0x61,0x00,0x02,0x02,0x11,0x02,0x4e, +0x01,0x00,0x17,0x16,0x11,0x10,0x07,0x06,0x00,0x0c,0x01,0x0c,0x05,0x07,0x16,0x2b,0x01,0x22,0x0e,0x02,0x1e,0x01,0x32,0x3e,0x01,0x2e,0x02,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e,0x01,0x01,0xad,0x53,0x8c,0x50,0x02,0x54,0x88,0xaa,0x86,0x56,0x04,0x4e,0x8e,0x01,0x5b,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xf4, +0xba,0x7e,0x02,0x8e,0x52,0x8c,0xa4,0x8c,0x52,0x52,0x8c,0xa4,0x8c,0x52,0xfe,0xd0,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0xb1,0x03,0x4d,0x02,0xff,0x00,0x06,0x00,0x14,0x00,0x19,0x00,0x24,0x00,0xe3,0x40,0x17,0x1e,0x01,0x02,0x05,0x1d,0x16,0x0e,0x07,0x04,0x03,0x02,0x19,0x03,0x02, +0x03,0x00,0x03,0x01,0x01,0x01,0x00,0x04,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x26,0x00,0x02,0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x00,0x03,0x70,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x72,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x4b,0xb0,0x12,0x50,0x58,0x40,0x27,0x00,0x02, +0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x05,0x03,0x00,0x7e,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x72,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x4b,0xb0,0x29,0x50,0x58,0x40,0x28,0x00,0x02,0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x05,0x03,0x00,0x7e,0x06,0x01,0x01,0x00, +0x04,0x00,0x01,0x04,0x80,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x40,0x23,0x00,0x05,0x02,0x05,0x85,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x00,0x03,0x85,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x04,0x80,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x59,0x59,0x59,0x40,0x12, +0x00,0x00,0x21,0x20,0x18,0x17,0x10,0x0f,0x09,0x08,0x00,0x06,0x00,0x06,0x14,0x07,0x07,0x17,0x2b,0x17,0x37,0x27,0x07,0x15,0x33,0x15,0x01,0x34,0x23,0x22,0x07,0x01,0x06,0x15,0x14,0x33,0x32,0x37,0x01,0x36,0x27,0x17,0x01,0x23,0x35,0x01,0x14,0x0f,0x01,0x27,0x37,0x36,0x32,0x1f,0x01,0x16,0xcb,0x32,0x83,0x33,0x48,0x01,0x5f,0x0c, +0x05,0x04,0xfe,0xd1,0x04,0x0d,0x05,0x04,0x01,0x2f,0x03,0x1e,0xe8,0xfe,0x30,0xe8,0x03,0x4d,0x14,0x5d,0xe8,0x5d,0x14,0x3b,0x16,0x83,0x14,0x07,0x33,0x83,0x33,0x3c,0x47,0x02,0x06,0x0c,0x04,0xfe,0xd2,0x04,0x06,0x0c,0x04,0x01,0x2e,0x04,0x71,0xe8,0xfe,0x2f,0xe9,0x01,0x9a,0x1d,0x15,0x5d,0xe9,0x5c,0x15,0x15,0x83,0x16,0x00,0x00, +0x00,0x05,0xff,0xff,0xff,0xf9,0x03,0x59,0x02,0xc4,0x00,0x08,0x00,0x11,0x00,0x21,0x00,0x2b,0x00,0x41,0x00,0x8e,0x40,0x0f,0x13,0x01,0x01,0x04,0x09,0x00,0x02,0x00,0x01,0x1b,0x01,0x05,0x00,0x03,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x03,0x01,0x01,0x04,0x00,0x04,0x01,0x00,0x80,0x02,0x01,0x00,0x05,0x08,0x00,0x70,0x00,0x09, +0x00,0x07,0x06,0x09,0x07,0x67,0x00,0x06,0x00,0x04,0x01,0x06,0x04,0x67,0x00,0x05,0x08,0x08,0x05,0x58,0x00,0x05,0x05,0x08,0x60,0x00,0x08,0x05,0x08,0x50,0x1b,0x40,0x31,0x03,0x01,0x01,0x04,0x00,0x04,0x01,0x00,0x80,0x02,0x01,0x00,0x05,0x04,0x00,0x05,0x7e,0x00,0x09,0x00,0x07,0x06,0x09,0x07,0x67,0x00,0x06,0x00,0x04,0x01,0x06, +0x04,0x67,0x00,0x05,0x08,0x08,0x05,0x58,0x00,0x05,0x05,0x08,0x60,0x00,0x08,0x05,0x08,0x50,0x59,0x40,0x0e,0x3d,0x3a,0x37,0x23,0x13,0x26,0x25,0x13,0x14,0x13,0x12,0x0a,0x07,0x1f,0x2b,0x25,0x14,0x06,0x22,0x26,0x3e,0x01,0x1e,0x01,0x17,0x14,0x06,0x22,0x26,0x3e,0x01,0x1e,0x01,0x17,0x35,0x34,0x26,0x27,0x21,0x22,0x06,0x07,0x15, +0x14,0x16,0x17,0x21,0x32,0x36,0x01,0x21,0x03,0x2e,0x01,0x23,0x21,0x22,0x06,0x07,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x35,0x34,0x37,0x13,0x3e,0x01,0x17,0x21,0x32,0x16,0x17,0x13,0x16,0x02,0x44,0x1a,0x24,0x1c,0x02,0x18,0x28,0x16,0x91,0x1a,0x24,0x1c,0x02,0x18,0x28,0x16,0x41,0x0c,0x06,0xfd,0x59,0x07,0x0a,0x01,0x0c, +0x06,0x02,0xa7,0x07,0x0a,0xfd,0x52,0x02,0x93,0x58,0x02,0x0e,0x07,0xfe,0x4b,0x07,0x0e,0x02,0x02,0x9e,0x34,0x25,0xfd,0x59,0x24,0x36,0x01,0x09,0x6e,0x09,0x34,0x1e,0x01,0xb5,0x1f,0x32,0x0a,0x6e,0x09,0xab,0x12,0x1a,0x1a,0x24,0x1c,0x02,0x18,0x14,0x12,0x1a,0x1a,0x24,0x1c,0x02,0x18,0x6d,0xb3,0x07,0x0a,0x01,0x0c,0x06,0xb3,0x07, +0x0a,0x01,0x0c,0x01,0x12,0x01,0x0d,0x07,0x0a,0x0a,0x07,0xfe,0x9a,0xb3,0x25,0x34,0x34,0x25,0xb3,0x0e,0x1c,0x01,0x52,0x1d,0x26,0x01,0x24,0x1e,0xfe,0xae,0x1c,0x00,0x00,0x01,0x00,0x00,0xff,0xe2,0x02,0xda,0x02,0xda,0x00,0x06,0x00,0x26,0x40,0x23,0x01,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x4a,0x02,0x01,0x00,0x49,0x00,0x01, +0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x13,0x02,0x07,0x18,0x2b,0x09,0x02,0x35,0x21,0x11,0x21,0x01,0x5e,0x01,0x7c,0xfe,0x84,0xfe,0xa2,0x01,0x5e,0x02,0xda,0xfe,0x84,0xfe,0x84,0xc0,0x01,0x7a,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xab,0x03,0x6b,0x03,0x20,0x00,0x0f,0x00,0x13,0x00,0x1f, +0x00,0x38,0x40,0x35,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x0b,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x00,0x5f,0x04,0x01,0x00,0x00,0x10,0x4d,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x11,0x01,0x4e,0x01,0x00,0x13,0x12,0x11,0x10,0x09,0x06,0x00,0x0f,0x01,0x0e,0x05,0x07,0x16,0x2b,0x13,0x22,0x06,0x15,0x11,0x14, +0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x05,0x21,0x11,0x21,0x01,0x07,0x17,0x07,0x17,0x37,0x17,0x37,0x27,0x37,0x27,0x07,0x87,0x0c,0x11,0x11,0x0c,0x02,0xc6,0x0c,0x11,0x11,0x0c,0xfd,0x58,0x02,0x8b,0xfd,0x75,0x01,0x87,0x2d,0x52,0x52,0x2d,0x53,0x52,0x2e,0x53,0x53,0x2e,0x52,0x03,0x1f,0x12,0x0c,0xfc,0xc8,0x0c,0x11, +0x11,0x0c,0x03,0x38,0x0c,0x12,0x3b,0xfd,0x02,0x02,0xcb,0x2e,0x52,0x53,0x2d,0x52,0x52,0x2d,0x53,0x52,0x2e,0x52,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x84,0x03,0x8f,0x03,0x33,0x00,0x02,0x00,0x10,0x00,0x3c,0x00,0x68,0x01,0x4d,0x40,0x0b,0x01,0x01,0x0a,0x02,0x62,0x36,0x02,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x36, +0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x72,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b,0x4b,0xb0,0x13,0x50,0x58,0x40,0x3c,0x12,0x01, +0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x70,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b,0x4b,0xb0,0x16,0x50,0x58, +0x40,0x3d,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b, +0x40,0x44,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x00,0x03,0x04,0x0a,0x03,0x57,0x0e,0x05,0x02,0x02,0x0f,0x01,0x0a,0x06,0x02,0x0a,0x69,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61, +0x0b,0x01,0x08,0x09,0x08,0x51,0x59,0x59,0x59,0x40,0x2d,0x04,0x03,0x00,0x00,0x68,0x66,0x5e,0x5c,0x5b,0x59,0x4d,0x4b,0x4a,0x48,0x3f,0x3d,0x3c,0x3a,0x32,0x30,0x2f,0x2d,0x21,0x1f,0x1e,0x1c,0x13,0x11,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x03,0x10,0x04,0x0f,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x01,0x07,0x27,0x25,0x22,0x06,0x1d, +0x01,0x33,0x35,0x21,0x15,0x33,0x35,0x34,0x26,0x23,0x13,0x33,0x32,0x16,0x1d,0x01,0x14,0x16,0x17,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x1d,0x01,0x14,0x0e,0x02,0x2b,0x01,0x35,0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e, +0x01,0x2b,0x01,0x35,0x33,0x32,0x36,0x37,0x36,0x37,0x36,0x3d,0x01,0x34,0x37,0x3e,0x02,0x3b,0x01,0x15,0x23,0x22,0x1d,0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x02,0x90,0x63,0x64,0xfe,0xcd,0x0d,0x13,0x3f,0x01,0x58,0x3f,0x12,0x0d,0x55,0x1b,0x47,0x45,0x07,0x0b,0x09,0x12,0x0e,0x1c,0x0f,0x0f,0x1a,0x12,0x0f,0x0c,0x08,0x05, +0x03,0x0f,0x22,0x34,0x27,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa8,0x1b,0x47,0x44,0x04,0x04,0x0b,0x09,0x23,0x18,0x10,0x10,0x1c,0x20,0x0a,0x08,0x05,0x04,0x07,0x07,0x23,0x33,0x27,0x1b,0x15,0x55,0x4e,0x4e,0x55,0x15,0x02,0xb1,0xac,0xac,0x82,0x12,0x0d,0xe7,0xc7,0x2e,0x4e,0x0d,0x12,0xfe,0xfa,0x42,0x44,0x54,0x14,0x1b,0x09,0x0a, +0x05,0x05,0x33,0x05,0x03,0x0a,0x08,0x0f,0x0d,0x14,0x80,0x1d,0x33,0x23,0x13,0x34,0x52,0x7f,0x5a,0x0a,0x09,0x5c,0x54,0x54,0xfd,0x8a,0x43,0x43,0x7e,0x0e,0x12,0x0e,0x0a,0x09,0x0b,0x33,0x08,0x09,0x08,0x0f,0x14,0x0d,0x57,0x21,0x16,0x19,0x24,0x12,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x00, +0xff,0xf2,0x02,0xf8,0x02,0xcc,0x00,0x06,0x00,0x17,0x40,0x14,0x06,0x01,0x00,0x4a,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x11,0x11,0x10,0x03,0x07,0x19,0x2b,0x01,0x23,0x11,0x21,0x11,0x23,0x01,0x02,0xf8,0xc0,0xfe,0x88,0xc0,0x01,0x7c,0x01,0x50,0xfe,0xa2,0x01,0x5e,0x01,0x7c,0x00,0x01,0x00,0x00,0x00,0x00,0x03,0xa5, +0x02,0x98,0x00,0x15,0x00,0x1d,0x40,0x1a,0x0f,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x14,0x17,0x14,0x03,0x07,0x19,0x2b,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x01,0x36,0x32,0x1f,0x01,0x16,0x03,0xa5,0x10,0xfe,0x20,0x10,0x2c, +0x10,0xfe,0xea,0x0f,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0x01,0x6e,0x10,0x2c,0x10,0x4c,0x10,0x02,0x16,0x16,0x10,0xfe,0x20,0x0f,0x0f,0x01,0x16,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa5,0x01,0x6f,0x10,0x10,0x4c,0x0f,0x00,0x03,0xff,0xf5,0xff,0xb1,0x03,0xf3,0x03,0x52,0x00,0x0f,0x00,0x21,0x00,0x33,0x00,0x33,0x40,0x30,0x1b,0x11,0x02,0x03, +0x02,0x09,0x01,0x02,0x01,0x00,0x02,0x4c,0x00,0x05,0x00,0x02,0x03,0x05,0x02,0x67,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x67,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x11,0x04,0x4e,0x17,0x38,0x27,0x27,0x26,0x23,0x06,0x07,0x1c,0x2b,0x25,0x35,0x34,0x26,0x2b,0x01,0x22,0x06,0x1d,0x01,0x14,0x16,0x17,0x33,0x32,0x36,0x27,0x13,0x34, +0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x15,0x17,0x14,0x16,0x37,0x33,0x32,0x36,0x03,0x01,0x16,0x07,0x0e,0x01,0x07,0x21,0x22,0x26,0x27,0x26,0x37,0x01,0x3e,0x01,0x32,0x16,0x02,0x3b,0x0a,0x07,0x6c,0x07,0x0a,0x0a,0x07,0x6c,0x07,0x0a,0x01,0x0a,0x05,0x07,0x07,0x7a,0x06,0x08,0x05,0x09,0x0c,0x07,0x67,0x08,0x0c,0x08,0x01,0xac,0x14, +0x15,0x09,0x22,0x12,0xfc,0xa6,0x12,0x22,0x09,0x15,0x14,0x01,0xad,0x09,0x22,0x26,0x22,0x53,0x6a,0x08,0x0a,0x0a,0x08,0x6a,0x08,0x0a,0x01,0x0c,0xd7,0x01,0x01,0x06,0x04,0x06,0x06,0x04,0x08,0xff,0x05,0x08,0x01,0x06,0x02,0x10,0xfc,0xee,0x23,0x23,0x11,0x12,0x01,0x14,0x10,0x23,0x23,0x03,0x12,0x11,0x14,0x14,0x00,0x04,0x00,0x00, +0xff,0x79,0x03,0xd1,0x03,0x3c,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x36,0x40,0x33,0x07,0x01,0x05,0x03,0x01,0x01,0x05,0x01,0x63,0x06,0x01,0x04,0x04,0x00,0x5f,0x09,0x02,0x08,0x03,0x00,0x00,0x12,0x04,0x4e,0x11,0x10,0x01,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x19,0x16,0x10,0x1f,0x11,0x1e,0x09,0x06,0x00,0x0f, +0x01,0x0e,0x0a,0x07,0x16,0x2b,0x13,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x33,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x05,0x21,0x11,0x21,0x01,0x21,0x11,0x21,0x38,0x0d,0x13,0x13,0x0d,0x01,0x7c,0x0d,0x12,0x12,0x0d,0x80,0x0d,0x12,0x12,0x0d,0x01,0x7d, +0x0d,0x12,0x12,0x0d,0xfc,0xa6,0x01,0x3e,0xfe,0xc2,0x01,0xfc,0x01,0x3e,0xfe,0xc2,0x03,0x3b,0x12,0x0d,0xfc,0x7d,0x0d,0x12,0x12,0x0d,0x03,0x83,0x0d,0x12,0x12,0x0d,0xfc,0x7d,0x0d,0x12,0x12,0x0d,0x03,0x83,0x0d,0x12,0x3e,0xfc,0xbb,0x03,0x45,0xfc,0xbb,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x7e,0x03,0xd6,0x03,0x37,0x00,0x0f, +0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x3d,0x40,0x3a,0x00,0x04,0x00,0x01,0x02,0x04,0x01,0x67,0x00,0x02,0x09,0x01,0x07,0x06,0x02,0x07,0x67,0x00,0x06,0x00,0x03,0x06,0x03,0x63,0x08,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x12,0x05,0x4e,0x24,0x24,0x20,0x20,0x24,0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x14,0x35,0x35,0x35, +0x32,0x0a,0x07,0x1b,0x2b,0x01,0x34,0x26,0x23,0x21,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x15,0x34,0x26,0x23,0x21,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x03,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x03,0xd5,0x12,0x0d,0xfc,0x7d,0x0d,0x13,0x13,0x0d,0x03,0x83,0x0d,0x12,0x12,0x0d,0xfc,0x7d,0x0d, +0x13,0x13,0x0d,0x03,0x83,0x0d,0x12,0x3f,0xfc,0xbc,0x03,0x44,0xfc,0xbc,0x03,0x17,0x0d,0x12,0x12,0x0d,0xfe,0x84,0x0d,0x12,0x12,0x0d,0x80,0x0d,0x12,0x12,0x0d,0xfe,0x83,0x0d,0x12,0x12,0x0d,0x03,0x5a,0xfe,0xc2,0x01,0x3e,0xfe,0x04,0xfe,0xc1,0x01,0x3f,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x89,0x03,0xdc,0x03,0x38,0x00,0x02, +0x00,0x10,0x00,0x39,0x00,0x62,0x01,0x0d,0x40,0x0b,0x01,0x01,0x06,0x0a,0x5c,0x33,0x02,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x1c,0x50,0x58,0x40,0x38,0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x02,0x80,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10, +0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x0a,0x4e,0x1b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x3f,0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x02,0x80,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x00,0x03,0x0f,0x01,0x0a,0x06,0x03,0x0a,0x69,0x0d,0x01, +0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61,0x0b,0x01,0x08,0x09,0x08,0x51,0x1b,0x40,0x45,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x00,0x03,0x0f, +0x01,0x0a,0x06,0x03,0x0a,0x69,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61,0x0b,0x01,0x08,0x09,0x08,0x51,0x59,0x59,0x40,0x2d,0x04,0x03,0x00,0x00,0x62,0x60,0x58,0x56,0x55,0x53,0x4a,0x48,0x47,0x45,0x3c,0x3a,0x39,0x37,0x2f,0x2d,0x2c,0x2a,0x1f,0x1d,0x1c, +0x1a,0x13,0x11,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x03,0x10,0x04,0x0f,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x01,0x07,0x27,0x25,0x22,0x06,0x1d,0x01,0x33,0x35,0x21,0x15,0x33,0x35,0x34,0x26,0x23,0x01,0x33,0x32,0x16,0x1d,0x01,0x14,0x1e,0x02,0x3b,0x01,0x15,0x23,0x22,0x07,0x0e,0x02,0x1d,0x01,0x14,0x07,0x0e,0x02,0x2b,0x01,0x35, +0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e,0x01,0x2b,0x01,0x35,0x33,0x32,0x3e,0x02,0x3d,0x01,0x34,0x3e,0x02,0x3b,0x01,0x15,0x23,0x22,0x1d,0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x03,0xdc,0x63,0x64,0xfd,0x31,0x0d,0x13,0x3f,0x02,0xf4,0x3f,0x12, +0x0d,0xfe,0xb9,0x1b,0x47,0x45,0x07,0x16,0x22,0x18,0x10,0x10,0x16,0x16,0x10,0x14,0x07,0x08,0x06,0x21,0x38,0x25,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa8,0x1b,0x47,0x44,0x04,0x04,0x0b,0x09,0x23,0x18,0x10,0x10,0x1c,0x1f,0x15,0x07,0x0f,0x21,0x34,0x27,0x1b,0x15,0x55,0x4d,0x4e,0x54,0x15,0x02,0x85,0xad,0xad,0xb3,0x12,0x0d,0xe7, +0xc7,0x6d,0x8d,0x0d,0x12,0xfe,0xfa,0x42,0x44,0x54,0x14,0x1b,0x13,0x0a,0x33,0x04,0x04,0x12,0x1c,0x14,0x80,0x1d,0x1a,0x19,0x23,0x13,0x34,0x52,0x7f,0x5a,0x0a,0x09,0x5c,0x54,0x54,0xfd,0x8a,0x43,0x43,0x7e,0x0e,0x12,0x0e,0x0a,0x09,0x0b,0x33,0x08,0x13,0x1a,0x14,0x57,0x20,0x30,0x23,0x13,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d, +0x54,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x23,0x00,0x33,0x00,0x43,0x00,0x44,0x40,0x41,0x18,0x01,0x03,0x04,0x13,0x01,0x02,0x00,0x03,0x06,0x01,0x01,0x00,0x03,0x4c,0x05,0x01,0x03,0x02,0x01,0x00,0x01,0x03,0x00,0x67,0x00,0x04,0x00,0x01,0x07,0x04,0x01,0x69,0x00,0x07,0x00,0x08,0x07,0x08,0x63, +0x00,0x06,0x06,0x09,0x5f,0x00,0x09,0x09,0x13,0x06,0x4e,0x42,0x3f,0x35,0x35,0x36,0x14,0x23,0x26,0x14,0x23,0x23,0x0a,0x07,0x1f,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3d,0x01,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x33,0x32,0x16,0x13,0x11, +0x34,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x83,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x47,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24, +0x01,0xd0,0x25,0x34,0x48,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x01,0x94,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x07,0x0a,0xc5,0x08,0x0a,0x0a,0x08,0xc5,0x0a,0xfe,0xff,0x01,0xd0,0x25,0x34,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x01,0xf4,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0, +0x42,0x5e,0x01,0x60,0x00,0x03,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x2d,0x40,0x2a,0x09,0x01,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x00,0x02,0x02,0x05,0x5f,0x00,0x05,0x05,0x13,0x02,0x4e,0x35,0x35,0x35,0x36,0x26,0x23,0x06, +0x07,0x1c,0x2b,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x3d,0x01,0x34,0x36,0x33,0x21,0x32,0x16,0x13,0x11,0x34,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x83,0x0a,0x08,0xfe,0x30,0x08,0x0a,0x0a,0x08,0x01,0xd0,0x08, +0x0a,0x47,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x48,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x01,0x94,0x24,0x08,0x0a,0x0a,0x08,0x24,0x07,0x0a,0x0a,0xfe,0xff,0x01,0xd0,0x25,0x34,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x01,0xf4,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42, +0x5e,0x01,0x60,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x01,0xd4,0x00,0x15,0x00,0x21,0xb1,0x06,0x64,0x44,0x40,0x16,0x07,0x01,0x00,0x02,0x01,0x4c,0x00,0x02,0x00,0x02,0x85,0x01,0x01,0x00,0x00,0x76,0x17,0x14,0x14,0x03,0x07,0x19,0x2b,0xb1,0x06,0x00,0x44,0x25,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x07,0x06,0x22,0x2f,0x01, +0x26,0x34,0x37,0x01,0x36,0x32,0x17,0x01,0x16,0x02,0x58,0x06,0x1c,0x05,0x0e,0x06,0xdc,0xdb,0x05,0x10,0x04,0x1c,0x06,0x06,0x01,0x04,0x05,0x0e,0x06,0x01,0x04,0x06,0xbd,0x07,0x05,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x0e,0x06,0x01,0x04,0x06,0x06,0xfe,0xfc,0x05,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xff,0x89,0x03,0x42, +0x03,0x33,0x00,0x0f,0x00,0x19,0x00,0x33,0x00,0x3f,0x00,0x4b,0x00,0x57,0x00,0x8c,0x40,0x89,0x56,0x01,0x0c,0x0d,0x44,0x01,0x0a,0x0b,0x3e,0x01,0x08,0x09,0x03,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x0d,0x03,0x05,0x0d,0x7e,0x00,0x0b,0x0c,0x0a,0x0c,0x0b,0x0a,0x80,0x00,0x0a,0x09,0x0c,0x0a,0x09,0x7e,0x00,0x09, +0x08,0x0c,0x09,0x08,0x7e,0x10,0x01,0x08,0x07,0x0c,0x08,0x07,0x7e,0x00,0x0d,0x11,0x01,0x0c,0x0b,0x0d,0x0c,0x67,0x00,0x07,0x00,0x01,0x07,0x01,0x64,0x06,0x04,0x0f,0x03,0x03,0x03,0x00,0x5f,0x0e,0x01,0x00,0x00,0x12,0x03,0x4e,0x4e,0x4c,0x36,0x34,0x10,0x10,0x01,0x00,0x54,0x52,0x4c,0x57,0x4e,0x57,0x48,0x45,0x42,0x40,0x3c,0x3a, +0x34,0x3f,0x36,0x3f,0x32,0x2f,0x2a,0x28,0x25,0x22,0x1f,0x1d,0x10,0x19,0x10,0x19,0x16,0x13,0x09,0x06,0x00,0x0f,0x01,0x0e,0x12,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x17,0x15,0x14,0x16,0x3b,0x01,0x32,0x36,0x3d,0x01,0x13,0x11,0x34,0x26,0x07,0x23,0x15,0x14,0x06,0x07, +0x23,0x22,0x26,0x37,0x35,0x23,0x22,0x06,0x17,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x27,0x21,0x22,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x07,0x14,0x27,0x21,0x22,0x26,0x37,0x34,0x33,0x21,0x32,0x15,0x14,0x06,0x27,0x21,0x22,0x35,0x34,0x36,0x17,0x21,0x32,0x16,0x07,0x14,0x02,0xa6,0x41,0x5a,0x01,0x5c,0x40,0xfd,0xf6,0x41,0x5a,0x01, +0x5c,0x40,0x68,0x20,0x15,0xd0,0x16,0x1e,0x9c,0x1e,0x15,0x35,0x3c,0x2c,0xd0,0x2b,0x3e,0x01,0x35,0x15,0x20,0x01,0x1e,0x16,0x02,0x0a,0x15,0x1e,0x68,0xfe,0x60,0x1a,0x0e,0x0c,0x01,0xa0,0x0b,0x10,0x01,0x1a,0xfe,0x60,0x0b,0x10,0x01,0x1a,0x01,0xa0,0x1a,0x0e,0x0c,0xfe,0x60,0x1a,0x0e,0x0c,0x01,0xa0,0x0b,0x10,0x01,0x03,0x33,0x5c, +0x40,0xfd,0x8f,0x41,0x5c,0x5c,0x41,0x02,0x71,0x41,0x5a,0x01,0x68,0x34,0x15,0x20,0x20,0x15,0x34,0xfd,0x5b,0x02,0x71,0x15,0x20,0x01,0x34,0x2b,0x3c,0x01,0x3e,0x2a,0x34,0x1e,0x16,0xfd,0x8f,0x15,0x20,0x20,0x49,0x19,0x0c,0x0e,0x01,0x10,0x0b,0x19,0x9d,0x0e,0x0c,0x19,0x19,0x0b,0x10,0x9d,0x19,0x0b,0x10,0x01,0x0e,0x0c,0x19,0x00, +0x00,0x03,0x00,0x00,0xff,0xf9,0x04,0x29,0x03,0x0b,0x00,0x11,0x00,0x27,0x00,0x45,0x00,0x4b,0x40,0x48,0x24,0x01,0x01,0x00,0x01,0x4c,0x00,0x07,0x04,0x03,0x04,0x07,0x03,0x80,0x00,0x03,0x02,0x04,0x03,0x02,0x7e,0x08,0x09,0x02,0x02,0x00,0x00,0x01,0x02,0x00,0x68,0x00,0x01,0x00,0x05,0x01,0x05,0x63,0x00,0x04,0x04,0x06,0x5f,0x00, +0x06,0x06,0x13,0x04,0x4e,0x13,0x12,0x42,0x40,0x3d,0x3b,0x38,0x35,0x30,0x2d,0x21,0x1e,0x19,0x16,0x12,0x27,0x13,0x27,0x36,0x31,0x0a,0x07,0x18,0x2b,0x01,0x34,0x23,0x21,0x22,0x06,0x0f,0x01,0x06,0x15,0x14,0x33,0x21,0x32,0x36,0x3f,0x01,0x36,0x25,0x21,0x35,0x34,0x26,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x26,0x07,0x23,0x22,0x06, +0x15,0x11,0x37,0x3e,0x01,0x05,0x14,0x0f,0x01,0x0e,0x01,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x17,0x15,0x33,0x32,0x16,0x17,0x16,0x03,0xe2,0x1e,0xfd,0xa1,0x16,0x34,0x0d,0xa4,0x0b,0x1e,0x02,0x5f,0x17,0x32,0x0f,0xa4,0x0a,0xfd,0x83,0x01,0xad,0x20,0x16,0xfe,0xbf,0x17,0x1e,0x01, +0x1e,0x17,0xb3,0x16,0x20,0x8f,0x19,0x50,0x02,0xea,0x19,0xa5,0x18,0x52,0x25,0xfd,0xa1,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x2f,0x34,0x48,0x01,0x6b,0x1e,0x34,0x0b,0x08,0x01,0x4b,0x13,0x18,0x11,0xcb,0x0d,0x09,0x14,0x1a,0x10,0xcb,0x0c,0x64,0x5a,0x16,0x20,0x01,0x20,0x16,0x24,0x16,0x20,0x01,0x1e,0x17,0xfe,0x24,0xaf,0x1e, +0x26,0x5a,0x23,0x20,0xcb,0x1e,0x26,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33,0x12,0x4a,0x33,0x5a,0x1a,0x1b,0x11,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0xa1,0x03,0x0b,0x00,0x17,0x00,0x2c,0x00,0x26,0x40,0x23,0x00,0x05,0x00,0x00,0x02,0x05,0x00,0x67,0x00,0x02,0x00,0x03,0x02,0x03,0x63,0x00,0x01,0x01,0x04,0x5f,0x00,0x04, +0x04,0x13,0x01,0x4e,0x23,0x35,0x35,0x35,0x35,0x33,0x06,0x07,0x1c,0x2b,0x25,0x11,0x34,0x26,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x26,0x07,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x03,0x59,0x1e,0x17,0xfe, +0x77,0x17,0x1e,0x01,0x1e,0x17,0xb3,0x16,0x20,0x20,0x16,0x02,0xa7,0x16,0x20,0x47,0x4a,0x33,0xfd,0x59,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x77,0x33,0x4a,0x76,0x01,0x89,0x16,0x20,0x01,0x20,0x16,0x24,0x16,0x20,0x01,0x1e,0x17,0xfd,0xe8,0x16,0x20,0x20,0x01,0x9f,0xfe,0x77,0x33,0x4a,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33, +0x12,0x4a,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0xb8,0x03,0x94,0x03,0x1f,0x00,0x02,0x00,0x10,0x00,0x39,0x00,0x66,0x01,0x0d,0x40,0x0b,0x60,0x33,0x02,0x07,0x06,0x01,0x01,0x02,0x07,0x02,0x4c,0x4b,0xb0,0x13,0x50,0x58,0x40,0x38,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x00,0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02, +0x06,0x07,0x69,0x0b,0x08,0x12,0x04,0x11,0x05,0x00,0x01,0x09,0x00,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x1b,0x4b,0xb0,0x1b,0x50,0x58,0x40,0x3f,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x12,0x04,0x11,0x03,0x00,0x08,0x01,0x08,0x00,0x01,0x80,0x00, +0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02,0x06,0x07,0x69,0x0b,0x01,0x08,0x00,0x09,0x08,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x1b,0x40,0x45,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x11,0x01,0x00,0x08,0x04,0x08,0x00,0x04,0x80,0x12, +0x01,0x04,0x01,0x08,0x04,0x01,0x7e,0x00,0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02,0x06,0x07,0x69,0x0b,0x01,0x08,0x00,0x09,0x08,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x59,0x59,0x40,0x2d,0x03,0x03,0x00,0x00,0x66,0x64,0x5c,0x5a,0x59, +0x57,0x4a,0x48,0x47,0x45,0x3c,0x3a,0x39,0x37,0x2f,0x2d,0x2c,0x2a,0x20,0x1e,0x1d,0x1b,0x13,0x11,0x03,0x10,0x03,0x10,0x0d,0x0a,0x07,0x06,0x05,0x04,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x25,0x37,0x17,0x07,0x15,0x21,0x35,0x23,0x15,0x14,0x16,0x33,0x21,0x32,0x36,0x3d,0x01,0x01,0x33,0x32,0x16,0x1d,0x01,0x14,0x17,0x1e,0x02, +0x3b,0x01,0x15,0x23,0x22,0x0e,0x02,0x1d,0x01,0x14,0x07,0x0e,0x02,0x2b,0x01,0x35,0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e,0x01,0x2b,0x01,0x35,0x33,0x32,0x3e,0x01,0x37,0x36,0x3d,0x01,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x1d, +0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x02,0xcd,0x64,0x63,0x82,0xfe,0xa7,0x3e,0x12,0x0d,0x01,0x97,0x0d,0x13,0xfe,0xa0,0x1c,0x47,0x44,0x04,0x05,0x11,0x25,0x18,0x10,0x10,0x1c,0x20,0x14,0x07,0x07,0x07,0x22,0x35,0x26,0x1c,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa7,0x1b,0x48,0x44,0x04,0x05,0x09,0x0a,0x23,0x18,0x0f,0x0f,0x1d, +0x20,0x13,0x03,0x04,0x07,0x08,0x10,0x10,0x1b,0x1b,0x27,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0x6a,0xac,0xac,0x09,0x6a,0xb3,0xd3,0x0d,0x12,0x12,0x0d,0x8a,0x02,0xbe,0x42,0x44,0x54,0x14,0x0c,0x10,0x10,0x0c,0x33,0x08,0x14,0x19,0x15,0x80,0x21,0x16,0x19,0x23,0x12,0x33,0x52,0x7f,0x59,0x0b,0x09,0x5c,0x54,0x54,0xfd,0x8b,0x42,0x43, +0x7e,0x14,0x0c,0x10,0x08,0x0b,0x09,0x33,0x09,0x12,0x0e,0x0c,0x15,0x56,0x1a,0x1e,0x18,0x12,0x10,0x0b,0x09,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d,0x54,0x00,0x00,0x00,0x03,0xff,0xfe,0x00,0x00,0x03,0xe8,0x02,0x60,0x00,0x20,0x00,0x24,0x00,0x28,0x00,0x36,0x40,0x33,0x00,0x00,0x08,0x06,0x07,0x03,0x04,0x03,0x00,0x04,0x67,0x05, +0x01,0x03,0x01,0x01,0x03,0x57,0x05,0x01,0x03,0x03,0x01,0x5f,0x02,0x01,0x01,0x03,0x01,0x4f,0x25,0x25,0x21,0x21,0x25,0x28,0x25,0x28,0x27,0x26,0x21,0x24,0x21,0x24,0x14,0x27,0x2a,0x18,0x09,0x07,0x1a,0x2b,0x11,0x26,0x37,0x25,0x36,0x17,0x16,0x0f,0x01,0x21,0x27,0x26,0x37,0x36,0x17,0x05,0x16,0x07,0x03,0x06,0x23,0x21,0x26,0x2f, +0x01,0x26,0x0f,0x01,0x06,0x23,0x21,0x26,0x27,0x37,0x17,0x21,0x37,0x33,0x17,0x21,0x37,0x02,0x0a,0x01,0x68,0x1d,0x0c,0x0b,0x19,0xe3,0x02,0x92,0xe4,0x19,0x0b,0x0e,0x1d,0x01,0x6a,0x0b,0x02,0x1b,0x08,0x19,0xfe,0xc7,0x19,0x06,0x31,0x27,0x35,0x32,0x06,0x1a,0xfe,0xc8,0x1b,0x04,0x27,0x13,0x01,0x04,0x2b,0xdd,0x29,0x01,0x03,0x14, +0x01,0x82,0x0d,0x0c,0xba,0x0b,0x1b,0x21,0x0c,0x68,0x68,0x10,0x1d,0x1b,0x0b,0xba,0x0c,0x0d,0xff,0x00,0x1e,0x02,0x18,0xdf,0x19,0x18,0xe0,0x1a,0x02,0x1c,0xe2,0xbd,0xbd,0xbd,0xbd,0x00,0x00,0x03,0x00,0x00,0xff,0x6a,0x03,0x59,0x03,0x52,0x00,0x13,0x00,0x1a,0x00,0x23,0x00,0x39,0x40,0x36,0x14,0x01,0x02,0x04,0x01,0x4c,0x00,0x01, +0x00,0x04,0x02,0x01,0x04,0x67,0x00,0x02,0x00,0x03,0x05,0x02,0x03,0x67,0x06,0x01,0x05,0x00,0x00,0x05,0x57,0x06,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05,0x00,0x4f,0x1b,0x1b,0x1b,0x23,0x1b,0x23,0x13,0x26,0x14,0x35,0x36,0x07,0x07,0x1b,0x2b,0x01,0x1e,0x01,0x15,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x21, +0x32,0x16,0x17,0x07,0x15,0x33,0x26,0x2f,0x01,0x26,0x13,0x11,0x23,0x22,0x26,0x27,0x35,0x21,0x11,0x03,0x33,0x10,0x16,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x01,0xf4,0x16,0x36,0x0f,0x4a,0xd2,0x05,0x07,0xaf,0x06,0xc6,0xe8,0x17,0x1e,0x01,0xfe,0x53,0x02,0x7e,0x10,0x34,0x18,0xfd,0x7e,0x17,0x1e,0x01,0x20,0x16,0x03,0x7c, +0x17,0x1e,0x01,0x16,0x10,0x26,0xd2,0x11,0x06,0xaf,0x07,0xfc,0xb0,0x02,0x3c,0x20,0x15,0xe9,0xfc,0xa6,0x00,0x01,0x00,0x00,0xff,0xaa,0x03,0x11,0x03,0x13,0x00,0x0b,0x00,0x06,0xb3,0x07,0x02,0x01,0x32,0x2b,0x09,0x01,0x06,0x26,0x35,0x11,0x34,0x36,0x17,0x01,0x16,0x14,0x03,0x04,0xfd,0x1b,0x0d,0x12,0x12,0x0d,0x02,0xe5,0x0d,0x01, +0x4d,0xfe,0x64,0x07,0x0a,0x0f,0x03,0x36,0x0e,0x0c,0x08,0xfe,0x64,0x07,0x14,0x00,0x00,0x01,0xff,0xff,0xff,0xae,0x02,0x3c,0x03,0x0f,0x00,0x1d,0x00,0x1b,0x40,0x18,0x1b,0x1a,0x12,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x13,0x4d,0x00,0x01,0x01,0x11,0x01,0x4e,0x35,0x3d,0x02,0x07,0x18,0x2b,0x17,0x06,0x26,0x37,0x11,0x34,0x36, +0x17,0x01,0x16,0x17,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x07,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x37,0x11,0x06,0x07,0x19,0x0a,0x10,0x01,0x0e,0x0b,0x01,0x8c,0x05,0x03,0x14,0x0f,0x48,0x0e,0x16,0x01,0x14,0x0f,0x48,0x0e,0x16,0x01,0x03,0x05,0x47,0x0b,0x06,0x0f,0x03,0x36,0x0e,0x08,0x0c,0xfe,0x74,0x05,0x05,0x01,0x7a,0x0e,0x16, +0x16,0x0e,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x01,0x7b,0x06,0x05,0x00,0x03,0xff,0xfc,0xff,0x90,0x03,0x9a,0x03,0x2c,0x00,0x08,0x00,0x13,0x00,0x29,0x00,0xa7,0x40,0x0d,0x0c,0x01,0x03,0x02,0x23,0x22,0x18,0x17,0x04,0x05,0x07,0x02,0x4c,0x4b,0xb0,0x24,0x50,0x58,0x40,0x32,0x00,0x03,0x02,0x06,0x02,0x03,0x06,0x80,0x00,0x06,0x07,0x02, +0x06,0x07,0x7e,0x00,0x07,0x05,0x02,0x07,0x05,0x7e,0x00,0x05,0x04,0x02,0x05,0x04,0x7e,0x0a,0x01,0x04,0x00,0x01,0x04,0x01,0x66,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x12,0x02,0x4e,0x1b,0x40,0x39,0x00,0x03,0x02,0x06,0x02,0x03,0x06,0x80,0x00,0x06,0x07,0x02,0x06,0x07,0x7e,0x00,0x07,0x05,0x02,0x07,0x05,0x7e,0x00, +0x05,0x04,0x02,0x05,0x04,0x7e,0x08,0x01,0x00,0x09,0x01,0x02,0x03,0x00,0x02,0x69,0x0a,0x01,0x04,0x01,0x01,0x04,0x59,0x0a,0x01,0x04,0x04,0x01,0x62,0x00,0x01,0x04,0x01,0x52,0x59,0x40,0x1f,0x15,0x14,0x0a,0x09,0x01,0x00,0x26,0x24,0x20,0x1e,0x1b,0x19,0x14,0x29,0x15,0x29,0x10,0x0e,0x09,0x13,0x0a,0x13,0x05,0x04,0x00,0x08,0x01, +0x08,0x0b,0x07,0x16,0x2b,0x01,0x36,0x00,0x12,0x00,0x04,0x00,0x02,0x00,0x17,0x22,0x06,0x15,0x06,0x16,0x33,0x32,0x36,0x35,0x34,0x03,0x32,0x36,0x37,0x27,0x06,0x23,0x22,0x3f,0x01,0x36,0x23,0x22,0x06,0x07,0x17,0x36,0x33,0x32,0x0f,0x01,0x06,0x01,0xc6,0xbe,0x01,0x10,0x06,0xfe,0xf6,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0c,0xf2,0x2a, +0x2e,0x02,0x22,0x20,0x26,0x2e,0xb4,0x1e,0x6c,0x34,0x12,0x30,0x18,0x0e,0x0a,0x2a,0x1a,0x30,0x1e,0x76,0x38,0x10,0x34,0x16,0x0c,0x0c,0x24,0x1a,0x03,0x2a,0x02,0xfe,0xf8,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0a,0x01,0x7c,0x01,0x12,0x96,0x30,0x1a,0x1c,0x20,0x2c,0x20,0x3a,0xfd,0xae,0x34,0x34,0x18,0x24,0x26,0xa0,0x60,0x3a,0x2e,0x1a, +0x22,0x22,0x98,0x68,0x00,0x01,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x31,0x00,0x3b,0x40,0x38,0x2a,0x01,0x03,0x05,0x25,0x1d,0x02,0x04,0x03,0x02,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x03,0x03,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x02,0x02,0x00,0x61,0x00,0x00,0x00, +0x11,0x00,0x4e,0x29,0x35,0x17,0x23,0x17,0x24,0x06,0x07,0x1c,0x2b,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x34,0x3f,0x01,0x36,0x16,0x17,0x1e,0x01,0x33,0x32,0x3e,0x03,0x2e,0x02,0x22,0x06,0x07,0x17,0x16,0x06,0x2b,0x01,0x22,0x26,0x27,0x35,0x34,0x36,0x1f,0x01,0x3e,0x01,0x33,0x32,0x1e,0x02,0x03,0x59,0x44,0x72,0xa0,0x56, +0x60,0xae,0x3c,0x04,0x05,0x4c,0x06,0x11,0x04,0x29,0x76,0x43,0x3a,0x68,0x50,0x2a,0x02,0x2e,0x4c,0x6c,0x6f,0x64,0x28,0x4d,0x11,0x13,0x17,0xfa,0x0f,0x14,0x01,0x2c,0x11,0x48,0x3c,0x9a,0x52,0x57,0x9e,0x74,0x42,0x01,0x5e,0x57,0x9e,0x74,0x44,0x52,0x49,0x06,0x0e,0x04,0x4d,0x05,0x01,0x06,0x35,0x3a,0x2e,0x4c,0x6a,0x74,0x6a,0x4c, +0x2e,0x28,0x25,0x4d,0x10,0x2d,0x16,0x0e,0xfa,0x18,0x13,0x12,0x48,0x39,0x3e,0x44,0x74,0x9e,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf9,0x02,0x83,0x03,0x53,0x00,0x23,0x00,0x3a,0x40,0x37,0x00,0x04,0x05,0x00,0x05,0x04,0x00,0x80,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x02,0x06,0x02,0x00,0x01,0x01,0x00,0x59,0x02,0x06,0x02,0x00, +0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x01,0x00,0x20,0x1f,0x1b,0x18,0x14,0x13,0x10,0x0e,0x09,0x06,0x00,0x23,0x01,0x23,0x07,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x17,0x33,0x35,0x34,0x36,0x1e,0x01,0x07,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x34,0x26,0x22,0x06,0x17,0x15, +0x02,0x4d,0x17,0x1e,0x01,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0x20,0x16,0x11,0x94,0xcc,0x96,0x02,0x14,0x0f,0x24,0x0e,0x16,0x54,0x76,0x54,0x01,0x01,0xa5,0x1e,0x17,0xfe,0xbe,0x16,0x1e,0x01,0x20,0x15,0x01,0x42,0x16,0x20,0x01,0xb3,0x67,0x94,0x02,0x90,0x69,0x0e,0x16,0x16,0x0e,0x3b,0x54,0x54,0x3b,0xb3,0x00,0x00,0x08,0x00,0x00, +0xff,0x9f,0x03,0x8f,0x03,0x1d,0x00,0x04,0x00,0x09,0x00,0x0e,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x2b,0x00,0x33,0x00,0x41,0x40,0x3e,0x21,0x20,0x15,0x14,0x0e,0x01,0x06,0x00,0x4a,0x31,0x30,0x25,0x24,0x10,0x09,0x06,0x01,0x49,0x05,0x04,0x02,0x08,0x04,0x00,0x01,0x00,0x85,0x07,0x06,0x09,0x03,0x04,0x01,0x01,0x76,0x0f,0x0f,0x00, +0x00,0x2d,0x2c,0x29,0x28,0x1d,0x1c,0x19,0x18,0x0f,0x13,0x0f,0x13,0x0b,0x0a,0x06,0x05,0x00,0x04,0x00,0x04,0x0a,0x07,0x16,0x2b,0x01,0x35,0x1e,0x01,0x17,0x07,0x33,0x0e,0x01,0x07,0x03,0x23,0x3e,0x01,0x37,0x11,0x15,0x2e,0x01,0x27,0x01,0x35,0x1e,0x01,0x17,0x23,0x2e,0x01,0x01,0x23,0x3e,0x01,0x37,0x15,0x0e,0x01,0x01,0x15,0x2e, +0x01,0x27,0x33,0x1e,0x01,0x01,0x33,0x0e,0x01,0x07,0x35,0x3e,0x01,0x02,0x09,0x3c,0x56,0x10,0xa2,0xa2,0x10,0x56,0x3c,0x71,0xa2,0x10,0x56,0x3c,0x3c,0x56,0x10,0x01,0x13,0x98,0xda,0x14,0x71,0x12,0x9a,0xfe,0x11,0x71,0x13,0xda,0x99,0x6a,0x98,0x01,0x02,0x9a,0xd8,0x14,0x71,0x12,0x9a,0x01,0xef,0x71,0x15,0xd8,0x99,0x69,0x9a,0x01, +0x97,0xa2,0x10,0x58,0x3a,0x71,0x3b,0x58,0x0f,0x01,0x13,0x3b,0x56,0x11,0xfe,0xed,0xa2,0x10,0x56,0x3c,0x01,0x86,0x71,0x13,0xda,0x99,0x6b,0x98,0xfe,0xfd,0x98,0xda,0x14,0x71,0x12,0x98,0xfe,0x0f,0x72,0x13,0xdc,0x98,0x6b,0x98,0x01,0x03,0x99,0xda,0x14,0x72,0x12,0x98,0x00,0x04,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x03, +0x00,0x21,0x00,0x31,0x00,0x45,0x00,0x53,0x40,0x50,0x2b,0x2a,0x23,0x22,0x04,0x08,0x04,0x01,0x4c,0x0d,0x01,0x04,0x06,0x01,0x08,0x02,0x4b,0x00,0x08,0x04,0x03,0x04,0x08,0x03,0x80,0x00,0x03,0x06,0x04,0x03,0x06,0x7e,0x00,0x06,0x00,0x01,0x00,0x06,0x01,0x68,0x07,0x01,0x04,0x04,0x0a,0x5f,0x00,0x0a,0x0a,0x13,0x4d,0x05,0x02,0x02, +0x00,0x00,0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x40,0x3d,0x38,0x35,0x17,0x26,0x33,0x11,0x13,0x3b,0x11,0x11,0x10,0x0b,0x07,0x1f,0x2b,0x17,0x21,0x35,0x21,0x05,0x33,0x11,0x34,0x26,0x2f,0x01,0x2e,0x01,0x07,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x35,0x23,0x11,0x33,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x07,0x03,0x35,0x34, +0x26,0x2b,0x01,0x22,0x06,0x17,0x15,0x14,0x16,0x37,0x33,0x32,0x36,0x05,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x1f,0x01,0x1e,0x01,0xd6,0x01,0xad,0xfe,0x53,0x01,0xf4,0x48,0x0c,0x05,0x9d,0x05,0x1c,0x08,0x1e,0x17,0xfe,0xbe,0x16,0x1e,0x01,0x48,0x48,0x20,0x15,0x01,0xd1,0x16,0x20,0x01,0xd6, +0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x64,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x02,0x05,0x17,0x36,0x0f,0x9c,0x10,0x16,0x07,0xd6,0xd6,0x01,0xf4,0x08,0x1a,0x07,0x9c,0x06,0x0c,0x01,0xe8,0x16,0x20,0x20,0x16,0xe8,0xfd,0x36,0xe8,0x16,0x20,0x20,0x16,0x01,0x1e,0xb2,0x08,0x0a,0x0a,0x08,0xb2,0x07, +0x0c,0x01,0x0a,0x0a,0xfd,0xfa,0x16,0x20,0x20,0x16,0x02,0xee,0x16,0x20,0x18,0x0e,0x9d,0x0f,0x36,0x00,0x00,0x02,0xff,0xff,0xff,0xb1,0x03,0xe8,0x03,0x0b,0x00,0x03,0x00,0x13,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x03,0x5f,0x00,0x03,0x03,0x13,0x4d,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x35,0x34,0x11,0x10,0x04, +0x07,0x1a,0x2b,0x37,0x21,0x11,0x21,0x25,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x8f,0x02,0xca,0xfd,0x36,0x03,0x59,0x34,0x25,0xfc,0xca,0x24,0x36,0x01,0x34,0x25,0x03,0x36,0x25,0x34,0x40,0x01,0xad,0xc4,0xfd,0x5a,0x25,0x34,0x01,0x36,0x24,0x02,0xa6,0x25,0x34,0x01,0x36,0x00,0x03,0xff,0xfd, +0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x08,0x00,0x15,0x00,0x22,0x00,0x32,0x40,0x2f,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x69,0x06,0x01,0x02,0x02,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x03,0x03,0x04,0x61,0x00,0x04,0x04,0x11,0x04,0x4e,0x0a,0x09,0x20,0x1f,0x1a,0x19,0x10,0x0f,0x09,0x15,0x0a,0x15,0x13,0x12,0x07,0x07,0x18,0x2b, +0x01,0x14,0x06,0x22,0x2e,0x01,0x36,0x32,0x16,0x27,0x22,0x0e,0x02,0x1e,0x01,0x32,0x3e,0x01,0x2e,0x02,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e,0x01,0x02,0x3b,0x52,0x78,0x52,0x02,0x56,0x74,0x56,0x90,0x53,0x8c,0x50,0x02,0x54,0x88,0xaa,0x86,0x56,0x04,0x4e,0x8e,0x01,0x5b,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc, +0xf4,0xba,0x7e,0x01,0x5e,0x3b,0x54,0x54,0x76,0x54,0x54,0xf5,0x52,0x8c,0xa4,0x8c,0x52,0x52,0x8c,0xa4,0x8c,0x52,0xfe,0xd0,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x6a,0x02,0x83,0x03,0x0b,0x00,0x0b,0x00,0x2e,0x00,0x35,0x40,0x32,0x07,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x03,0x02, +0x03,0x86,0x09,0x05,0x02,0x01,0x04,0x01,0x02,0x03,0x01,0x02,0x67,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x00,0x07,0x07,0x13,0x00,0x4e,0x2d,0x2c,0x13,0x33,0x11,0x14,0x22,0x33,0x15,0x15,0x13,0x0a,0x07,0x1f,0x2b,0x01,0x35,0x34,0x26,0x22,0x06,0x1d,0x01,0x14,0x16,0x32,0x36,0x05,0x14,0x06,0x27,0x23,0x03,0x0e,0x01,0x07,0x23,0x22, +0x27,0x03,0x23,0x22,0x26,0x27,0x34,0x36,0x33,0x11,0x22,0x2e,0x01,0x36,0x37,0x21,0x32,0x16,0x14,0x06,0x27,0x11,0x32,0x16,0x01,0x0c,0x0a,0x10,0x0a,0x0a,0x10,0x0a,0x01,0x77,0x16,0x0e,0xef,0x1d,0x01,0x0a,0x06,0x01,0x0f,0x02,0x2b,0xe1,0x0f,0x14,0x01,0x58,0x37,0x1d,0x2a,0x02,0x2e,0x1b,0x01,0x65,0x1d,0x2a,0x2a,0x1d,0x37,0x58, +0x01,0x70,0xfa,0x08,0x0a,0x0a,0x08,0xfa,0x08,0x0a,0x0a,0xbd,0x0e,0x16,0x01,0xfe,0xf2,0x07,0x08,0x01,0x0f,0x01,0x0f,0x14,0x0f,0x45,0x6e,0x01,0x1e,0x2a,0x3a,0x2a,0x01,0x2c,0x38,0x2c,0x01,0xfe,0xe2,0x6e,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5b,0x03,0x0b,0x00,0x24,0x00,0x47,0x00,0x4b,0x40,0x48,0x43,0x25,0x02,0x06,0x09,0x2f, +0x01,0x05,0x06,0x17,0x01,0x03,0x02,0x08,0x01,0x01,0x03,0x04,0x4c,0x00,0x09,0x07,0x01,0x05,0x02,0x09,0x05,0x67,0x04,0x01,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x06,0x06,0x08,0x61,0x00,0x08,0x08,0x13,0x4d,0x00,0x03,0x03,0x00,0x61,0x00,0x00,0x00,0x11,0x00,0x4e,0x46,0x45,0x26,0x25,0x25,0x36,0x25,0x26,0x35,0x14,0x24,0x0a, +0x07,0x1f,0x2b,0x01,0x14,0x15,0x0e,0x01,0x23,0x22,0x26,0x27,0x07,0x06,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x32,0x16,0x06,0x0f,0x01,0x1e,0x01,0x37,0x32,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x32,0x16,0x13,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x36,0x3f,0x01,0x26,0x23,0x22,0x06,0x07,0x06,0x07,0x06,0x2b,0x01,0x22,0x26,0x37, +0x35,0x3e,0x01,0x33,0x32,0x16,0x17,0x37,0x36,0x32,0x16,0x03,0x4b,0x24,0xe4,0x99,0x51,0x98,0x3c,0x48,0x0b,0x1c,0x16,0x16,0x0e,0xfa,0x0e,0x16,0x02,0x09,0x4d,0x28,0x64,0x37,0x4a,0x82,0x27,0x06,0x18,0x04,0x0c,0x6b,0x08,0x0a,0x0e,0x14,0x10,0xfa,0x0e,0x16,0x02,0x09,0x4d,0x52,0x70,0x4b,0x82,0x27,0x06,0x17,0x05,0x0c,0x6f,0x07, +0x0c,0x01,0x24,0xe6,0x99,0x51,0x9a,0x3c,0x48,0x0b,0x1c,0x18,0x01,0x05,0x03,0x01,0x96,0xba,0x3e,0x39,0x48,0x0b,0x16,0x0e,0xfa,0x0e,0x16,0x16,0x1c,0x0b,0x4d,0x24,0x2a,0x01,0x4a,0x3e,0x0a,0x38,0x0d,0x0c,0x01,0xb8,0xfa,0x0e,0x16,0x16,0x1c,0x0b,0x4d,0x4d,0x4a,0x3e,0x0a,0x38,0x0d,0x0c,0x06,0x04,0x96,0xba,0x3e,0x39,0x48,0x0b, +0x16,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x20,0x40,0x1d,0x18,0x10,0x08,0x00,0x04,0x00,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x13,0x4d,0x02,0x01,0x00,0x00,0x11,0x00,0x4e,0x35,0x35,0x35,0x33,0x04,0x07,0x1a,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36, +0x33,0x21,0x32,0x16,0x05,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0x59,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x0f,0x16,0xfe,0x0b,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x0f,0x16,0x02,0xe7,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x0e, +0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x00,0x00,0x01,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x0f,0x00,0x1a,0x40,0x17,0x08,0x00,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x13,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x35,0x33,0x02,0x07,0x18,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36, +0x33,0x21,0x32,0x16,0x03,0x59,0x14,0x10,0xfc,0xef,0x0f,0x14,0x01,0x16,0x0e,0x03,0x11,0x0f,0x16,0x02,0xe7,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x00,0x01,0xff,0xfe,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x30,0x00,0x3a,0x40,0x37,0x2d,0x01,0x01,0x05,0x09,0x01,0x00,0x01,0x02,0x4c,0x00,0x00,0x01,0x03,0x01,0x00, +0x03,0x80,0x00,0x03,0x02,0x01,0x03,0x02,0x7e,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x11,0x04,0x4e,0x27,0x27,0x13,0x27,0x24,0x33,0x06,0x07,0x1c,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3f,0x01,0x26,0x23,0x22,0x0e,0x02,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x3e,0x01, +0x1f,0x01,0x1e,0x01,0x07,0x0e,0x01,0x07,0x22,0x2e,0x02,0x3e,0x03,0x33,0x32,0x16,0x17,0x37,0x36,0x16,0x03,0x59,0x14,0x10,0xfa,0x17,0x13,0x11,0x4d,0x52,0x70,0x3a,0x6a,0x4c,0x2e,0x2e,0x4c,0x6a,0x3a,0x42,0x76,0x29,0x04,0x11,0x06,0x4c,0x05,0x02,0x06,0x3c,0xae,0x5f,0x57,0xa0,0x70,0x48,0x04,0x40,0x78,0x98,0x5b,0x52,0x98,0x3d, +0x48,0x11,0x2c,0x02,0xc3,0xfa,0x0e,0x16,0x2d,0x10,0x4d,0x4d,0x2e,0x4c,0x6a,0x74,0x6a,0x4c,0x2e,0x3a,0x35,0x06,0x01,0x05,0x4d,0x04,0x0e,0x06,0x4a,0x50,0x01,0x44,0x74,0x9e,0xae,0x9e,0x74,0x44,0x3e,0x39,0x48,0x12,0x13,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x01,0xe6,0x00,0x15,0x00,0x19,0x40,0x16,0x0f,0x01,0x00,0x01, +0x01,0x4c,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x14,0x17,0x14,0x03,0x07,0x19,0x2b,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x37,0x36,0x32,0x1f,0x01,0x16,0x02,0x58,0x06,0xfe,0xfc,0x05,0x10,0x04,0xfe,0xfc,0x06,0x06,0x1c,0x05,0x0e,0x06,0xdb,0xdc,0x05,0x10,0x04,0x1c,0x06, +0x01,0xb7,0x07,0x05,0xfe,0xfb,0x05,0x05,0x01,0x05,0x05,0x0e,0x06,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x00,0x00,0x00,0x03,0xff,0xfd,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x0c,0x00,0x1c,0x00,0x2e,0x00,0x41,0x40,0x3e,0x28,0x1e,0x02,0x05,0x04,0x16,0x15,0x0e,0x03,0x03,0x02,0x02,0x4c,0x00,0x05,0x00,0x02,0x03,0x05,0x02, +0x67,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x13,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x11,0x01,0x4e,0x01,0x00,0x2c,0x2a,0x23,0x21,0x1a,0x18,0x12,0x10,0x07,0x06,0x00,0x0c,0x01,0x0c,0x07,0x07,0x16,0x2b,0x01,0x32,0x1e,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x13,0x35,0x34,0x26,0x2b,0x01,0x22,0x06,0x07, +0x15,0x14,0x16,0x17,0x33,0x32,0x36,0x27,0x13,0x34,0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x15,0x13,0x14,0x16,0x3b,0x01,0x32,0x36,0x01,0xad,0x74,0xc6,0x72,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xc1,0x0a,0x07,0x6b,0x08,0x0a,0x01,0x0c,0x07,0x6b,0x07,0x0a,0x01,0x0a,0x06,0x05,0x08,0x7b,0x08,0x05,0x06,0x0a,0x0a,0x09,0x67,0x08, +0x0a,0x03,0x0b,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0xfd,0x48,0x6a,0x08,0x0a,0x0a,0x08,0x6a,0x08,0x0a,0x01,0x0c,0xc7,0x01,0x5a,0x07,0x03,0x05,0x05,0x03,0x07,0xfe,0xa6,0x06,0x08,0x08,0x00,0x00,0x01,0x00,0x00,0xff,0xef,0x02,0xd4,0x02,0x86,0x00,0x24,0x00,0x26,0x40,0x23,0x22,0x19,0x10,0x07,0x04,0x00,0x02,0x01, +0x4c,0x03,0x01,0x02,0x00,0x00,0x02,0x59,0x03,0x01,0x02,0x02,0x00,0x61,0x01,0x01,0x00,0x02,0x00,0x51,0x14,0x1c,0x14,0x14,0x04,0x07,0x1a,0x2b,0x25,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x07,0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x27,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x37,0x36,0x32,0x1f,0x01,0x16,0x14,0x0f,0x01,0x17, +0x16,0x02,0xd4,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa4,0xa4,0x10,0x10,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x0f,0x0f,0xa4,0xa4,0x0f,0x70,0x16,0x10,0x4c,0x0f,0x0f,0xa5,0xa5,0x0f,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa4,0xa4,0x10,0x10,0x4c,0x0f,0x2e, +0x0f,0xa4,0xa4,0x0f,0x00,0x03,0x00,0x00,0xff,0xb1,0x03,0xc5,0x03,0x0b,0x00,0x0c,0x00,0x1c,0x00,0x2c,0x00,0x34,0x40,0x31,0x25,0x1d,0x02,0x04,0x05,0x00,0x01,0x01,0x00,0x02,0x4c,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x67,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e, +0x35,0x35,0x35,0x35,0x24,0x32,0x06,0x07,0x1c,0x2b,0x01,0x34,0x26,0x07,0x23,0x22,0x0e,0x01,0x16,0x17,0x33,0x32,0x36,0x25,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x37,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x02,0x5f,0x14,0x10,0x8e,0x0f,0x14,0x02,0x18, +0x0d,0x8e,0x0f,0x16,0x01,0x41,0x16,0x0e,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x23,0x14,0x0f,0xfc,0xa6,0x0e,0x16,0x01,0x14,0x0f,0x03,0x5a,0x0e,0x16,0x01,0x82,0x0e,0x16,0x01,0x14,0x1e,0x14,0x01,0x16,0x79,0xfd,0xe8,0x0e,0x16,0x16,0x0e,0x02,0x18,0x0e,0x16,0x16,0xec,0x8f,0x0e,0x16,0x16,0x0e,0x8f,0x0e,0x16,0x16, +0x00,0x05,0x00,0x00,0xff,0x88,0x03,0xac,0x03,0x34,0x00,0x43,0x00,0x4c,0x00,0x55,0x00,0x5e,0x00,0x67,0x00,0x61,0x40,0x5e,0x3c,0x33,0x02,0x05,0x0a,0x1a,0x0f,0x02,0x01,0x05,0x2b,0x22,0x19,0x10,0x09,0x00,0x06,0x08,0x01,0x03,0x4c,0x07,0x01,0x05,0x03,0x01,0x01,0x08,0x05,0x01,0x67,0x00,0x0a,0x0f,0x0c,0x02,0x08,0x09,0x0a,0x08, +0x69,0x10,0x0e,0x0d,0x03,0x09,0x04,0x02,0x02,0x00,0x09,0x00,0x65,0x00,0x0b,0x0b,0x06,0x61,0x00,0x06,0x06,0x12,0x0b,0x4e,0x60,0x5f,0x64,0x63,0x5f,0x67,0x60,0x67,0x5d,0x5c,0x59,0x58,0x54,0x53,0x50,0x4f,0x4b,0x4a,0x15,0x36,0x16,0x37,0x18,0x36,0x16,0x36,0x14,0x11,0x07,0x1f,0x2b,0x25,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34, +0x37,0x35,0x34,0x2b,0x01,0x22,0x27,0x15,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x35,0x06,0x2b,0x01,0x22,0x0e,0x01,0x1d,0x01,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x35,0x34,0x36,0x3b,0x01,0x32,0x3d,0x01,0x26,0x35,0x34,0x36,0x32,0x16,0x15,0x14,0x07,0x15,0x14,0x3b,0x01,0x32,0x16,0x15,0x05,0x34,0x26,0x22,0x06, +0x14,0x16,0x32,0x36,0x13,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13,0x34,0x26,0x22,0x06,0x14,0x16,0x32,0x36,0x05,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x03,0x64,0x48,0x46,0x64,0x46,0x48,0x4c,0x64,0x2c,0x22,0x48,0x46,0x64,0x46,0x48,0x1e,0x2e,0x64,0x22,0x26,0x06,0x48,0x46,0x64,0x46,0x48,0x56,0x58,0x64,0x4c,0x48,0x46, +0x64,0x46,0x48,0x4e,0x64,0x56,0x56,0xfd,0x5a,0x2a,0x38,0x28,0x28,0x38,0x2a,0xd4,0x28,0x38,0x2a,0x2a,0x38,0x28,0x8a,0x2a,0x38,0x28,0x28,0x38,0x2a,0x01,0x18,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x70,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x72,0x4e,0x0c,0xcc,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0xcc,0x0c,0x26,0x1c,0x0c,0x72, +0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x72,0x40,0x6c,0x34,0x8c,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c,0x22,0x8c,0x34,0x6c,0x40,0xe2,0x1e,0x28,0x28,0x3a,0x28,0x28,0x02,0xd8,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x26,0x1e,0x28,0x28,0x3a,0x28,0x28,0x28,0x28,0x3a,0x28,0x28,0x3a,0x28,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x59, +0x03,0x0b,0x00,0x23,0x00,0x33,0x00,0x3e,0x40,0x3b,0x0d,0x01,0x00,0x01,0x1f,0x01,0x04,0x03,0x02,0x4c,0x02,0x01,0x00,0x01,0x03,0x01,0x00,0x03,0x80,0x05,0x01,0x03,0x04,0x01,0x03,0x04,0x7e,0x00,0x01,0x01,0x07,0x5f,0x00,0x07,0x07,0x13,0x4d,0x00,0x04,0x04,0x06,0x60,0x00,0x06,0x06,0x11,0x06,0x4e,0x35,0x35,0x23,0x33,0x16,0x23, +0x24,0x23,0x08,0x07,0x1e,0x2b,0x01,0x35,0x34,0x26,0x07,0x23,0x35,0x34,0x26,0x27,0x23,0x22,0x06,0x07,0x15,0x23,0x22,0x06,0x07,0x15,0x14,0x16,0x37,0x33,0x15,0x14,0x16,0x3b,0x01,0x32,0x36,0x37,0x35,0x33,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0xca,0x14,0x0f,0xb3,0x16, +0x0e,0x47,0x0f,0x14,0x01,0xb2,0x0f,0x14,0x01,0x16,0x0e,0xb2,0x16,0x0e,0x47,0x0f,0x14,0x01,0xb3,0x0e,0x16,0x8e,0x5e,0x43,0xfd,0xe9,0x43,0x5e,0x5e,0x43,0x02,0x17,0x43,0x5e,0x01,0x3a,0x48,0x0e,0x16,0x01,0xb3,0x0f,0x14,0x01,0x16,0x0e,0xb3,0x14,0x0f,0x48,0x0e,0x16,0x01,0xb3,0x0e,0x16,0x16,0x0e,0xb3,0x14,0x01,0x3f,0xfd,0xe8, +0x42,0x5e,0x01,0x60,0x41,0x02,0x18,0x42,0x5e,0x01,0x60,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x1f,0x40,0x1c,0x00,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x35,0x35,0x26,0x33,0x04,0x07,0x1a,0x2b,0x01,0x35,0x34,0x26,0x07, +0x21,0x22,0x06,0x07,0x15,0x14,0x16,0x37,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0xca,0x14,0x0f,0xfe,0x0c,0x0f,0x14,0x01,0x16,0x0e,0x01,0xf4,0x0e,0x16,0x8e,0x5e,0x43,0xfd,0xe9,0x43,0x5e,0x5e,0x43,0x02,0x17,0x43,0x5e,0x01,0x3a,0x48,0x0e,0x16,0x01,0x14,0x0f,0x48, +0x0e,0x16,0x01,0x14,0x01,0x3f,0xfd,0xe8,0x42,0x5e,0x01,0x60,0x41,0x02,0x18,0x42,0x5e,0x01,0x60,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x07,0xb3,0xdb,0xee,0x5f,0x0f,0x3c,0xf5,0x00,0x0f,0x03,0xe8,0x00,0x00,0x00,0x00,0xe4,0x2d,0xc8,0x06,0x00,0x00,0x00,0x00,0xe4,0x2d,0xc8,0x07,0xff,0xf5,0xff,0x6a,0x04,0x78,0x03,0x53, +0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x52,0xff,0x6a,0x00,0x00,0x04,0x76,0xff,0xf5,0xff,0xf5,0x04,0x78,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x03,0xe8,0x00,0x00,0x03,0x11,0x00,0x00,0x02,0x80,0x00,0x00,0x03,0xe8,0x00,0x00, +0x04,0x2f,0xff,0xff,0x00,0xf0,0x00,0x00,0x04,0x76,0xff,0xff,0x03,0xe8,0xff,0xff,0x03,0xe8,0x00,0x00,0x02,0x44,0x00,0x00,0x02,0x44,0x00,0x00,0x03,0x59,0xff,0xfd,0x02,0x3b,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0x11,0x00,0x00,0x03,0xac,0x00,0x00,0x03,0xe8,0x00,0x00,0x00,0xdc,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00, +0x02,0x3b,0xff,0xff,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00,0x03,0x98,0xff,0xfc,0x03,0x59,0x00,0x00,0x03,0xca,0x00,0x00,0x04,0x2f,0xff,0xff,0x03,0xa0,0x00,0x00,0x02,0xf8,0x00,0x00,0x03,0xd4,0xff,0xf7,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0xff,0xff,0x02,0x82,0x00,0x00, +0x02,0xda,0x00,0x00,0x04,0x2f,0xff,0xff,0x02,0xf8,0x00,0x00,0x03,0x59,0xff,0xfd,0x03,0x59,0x00,0x00,0x03,0x59,0xff,0xff,0x02,0xda,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x02,0xf8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0xff,0xf5,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0x11,0x00,0x00, +0x03,0x11,0x00,0x00,0x02,0x82,0x00,0x00,0x03,0x42,0x00,0x00,0x04,0x2f,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe7,0xff,0xfe,0x03,0x59,0x00,0x00,0x03,0x11,0x00,0x00,0x02,0x3b,0xff,0xff,0x03,0x98,0xff,0xfc,0x03,0x59,0x00,0x00,0x02,0x82,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0xe8,0xff,0xff, +0x03,0x59,0xff,0xfd,0x02,0x82,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0xff,0xfe,0x02,0x82,0x00,0x00,0x03,0x59,0xff,0xfd,0x03,0x11,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xac,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0xe0,0x01,0x76,0x01,0xf0, +0x02,0x46,0x02,0x9e,0x02,0xc4,0x03,0x10,0x03,0x46,0x03,0x68,0x03,0x8c,0x03,0xb8,0x04,0x42,0x05,0x04,0x05,0x60,0x05,0xf4,0x06,0x18,0x06,0x42,0x06,0x64,0x06,0x8e,0x06,0xc6,0x06,0xfe,0x07,0xa6,0x07,0xf8,0x08,0xa0,0x08,0xf2,0x09,0x20,0x09,0x42,0x09,0x8e,0x09,0xd6,0x0a,0x98,0x0b,0x82,0x0c,0x0e,0x0c,0xfa,0x0d,0x3e,0x0d,0x64, +0x0d,0xc6,0x0e,0x2a,0x0e,0x6c,0x0f,0x1e,0x0f,0xce,0x0f,0xf6,0x10,0x4a,0x11,0x7c,0x11,0x9a,0x11,0xd2,0x12,0x3c,0x12,0x98,0x12,0xf8,0x14,0x00,0x14,0x80,0x14,0xe0,0x15,0x1a,0x15,0xde,0x16,0x6a,0x16,0xc0,0x17,0xce,0x18,0x30,0x18,0x88,0x18,0xa6,0x18,0xe4,0x19,0x80,0x19,0xe8,0x1a,0x3c,0x1a,0xb8,0x1b,0x48,0x1b,0x7c,0x1b,0xd0, +0x1c,0x32,0x1c,0xc0,0x1d,0x04,0x1d,0x2e,0x1d,0x94,0x1d,0xca,0x1e,0x32,0x1e,0x80,0x1e,0xde,0x1f,0x9a,0x20,0x04,0x20,0x48,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x90,0x00,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x7b,0x00,0x8d,0x00,0x00,0x00,0xba,0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0xde,0x00,0x01, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x35,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x00,0x3d,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x08,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x4c,0x00,0x01,0x00,0x00,0x00,0x00, +0x00,0x05,0x00,0x0b,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x08,0x00,0x5f,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x2b,0x00,0x67,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x13,0x00,0x92,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x00,0x00,0x6a,0x00,0xa5,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x10, +0x01,0x0f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e,0x01,0x1f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x10,0x01,0x2d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x10,0x01,0x3d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x16,0x01,0x4d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x10,0x01,0x63,0x00,0x03, +0x00,0x01,0x04,0x09,0x00,0x0a,0x00,0x56,0x01,0x73,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x26,0x01,0xc9,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x43,0x29,0x20,0x32,0x30,0x32,0x35,0x20,0x62,0x79,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x73,0x20,0x40,0x20,0x66, +0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x2e,0x63,0x6f,0x6d,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x52,0x65,0x67,0x75,0x6c,0x61,0x72,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x31,0x2e,0x30,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x47,0x65,0x6e, +0x65,0x72,0x61,0x74,0x65,0x64,0x20,0x62,0x79,0x20,0x73,0x76,0x67,0x32,0x74,0x74,0x66,0x20,0x66,0x72,0x6f,0x6d,0x20,0x46,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x20,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x2e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x2e,0x63,0x6f,0x6d,0x00,0x43,0x00,0x6f,0x00, +0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x28,0x00,0x43,0x00,0x29,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x32,0x00,0x35,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x69,0x00,0x6e,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x61,0x00,0x75,0x00,0x74,0x00, +0x68,0x00,0x6f,0x00,0x72,0x00,0x73,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00, +0x61,0x00,0x72,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x31,0x00,0x2e,0x00,0x30,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00, +0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x47,0x00,0x65,0x00,0x6e,0x00,0x65,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x73,0x00,0x76,0x00,0x67,0x00,0x32,0x00,0x74,0x00,0x74,0x00,0x66,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x46,0x00, +0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x2e,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x2e,0x00, +0x63,0x00,0x6f,0x00,0x6d,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x02,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x01,0x07,0x01,0x08,0x01,0x09,0x01,0x0a,0x01,0x0b,0x01,0x0c, +0x01,0x0d,0x01,0x0e,0x01,0x0f,0x01,0x10,0x01,0x11,0x01,0x12,0x01,0x13,0x01,0x14,0x01,0x15,0x01,0x16,0x01,0x17,0x01,0x18,0x01,0x19,0x01,0x1a,0x01,0x1b,0x01,0x1c,0x01,0x1d,0x01,0x1e,0x01,0x1f,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x24,0x01,0x25,0x01,0x26,0x01,0x27,0x01,0x28,0x01,0x29,0x01,0x2a,0x01,0x2b,0x01,0x2c, +0x01,0x2d,0x01,0x2e,0x01,0x2f,0x01,0x30,0x01,0x31,0x01,0x32,0x01,0x33,0x01,0x34,0x01,0x35,0x01,0x36,0x01,0x37,0x01,0x38,0x01,0x39,0x01,0x3a,0x01,0x3b,0x01,0x3c,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01,0x40,0x01,0x41,0x01,0x42,0x01,0x43,0x01,0x44,0x01,0x45,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x01,0x4b,0x01,0x4c, +0x01,0x4d,0x01,0x4e,0x01,0x4f,0x01,0x50,0x01,0x51,0x01,0x52,0x00,0x0b,0x63,0x68,0x65,0x63,0x6b,0x2d,0x65,0x6d,0x70,0x74,0x79,0x0d,0x66,0x6c,0x6f,0x77,0x2d,0x70,0x61,0x72,0x61,0x6c,0x6c,0x65,0x6c,0x04,0x64,0x6f,0x63,0x73,0x07,0x70,0x69,0x63,0x74,0x75,0x72,0x65,0x09,0x66,0x6c,0x6f,0x77,0x2d,0x6c,0x69,0x6e,0x65,0x0e,0x77, +0x69,0x6e,0x64,0x6f,0x77,0x2d,0x72,0x65,0x73,0x74,0x6f,0x72,0x65,0x0f,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2d,0x6d,0x69,0x6e,0x69,0x6d,0x69,0x7a,0x65,0x04,0x63,0x75,0x62,0x65,0x04,0x70,0x6c,0x75,0x73,0x05,0x6d,0x69,0x6e,0x75,0x73,0x06,0x63,0x69,0x72,0x63,0x6c,0x65,0x08,0x64,0x6f,0x77,0x6e,0x2d,0x64,0x69,0x72,0x05,0x63,0x68, +0x65,0x63,0x6b,0x0b,0x74,0x72,0x61,0x73,0x68,0x2d,0x65,0x6d,0x70,0x74,0x79,0x04,0x75,0x73,0x65,0x72,0x09,0x62,0x72,0x69,0x65,0x66,0x63,0x61,0x73,0x65,0x03,0x64,0x6f,0x74,0x08,0x6c,0x65,0x66,0x74,0x2d,0x64,0x69,0x72,0x09,0x72,0x69,0x67,0x68,0x74,0x2d,0x64,0x69,0x72,0x06,0x75,0x70,0x2d,0x64,0x69,0x72,0x0a,0x61,0x6e,0x67, +0x6c,0x65,0x2d,0x6c,0x65,0x66,0x74,0x0b,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x72,0x69,0x67,0x68,0x74,0x0c,0x68,0x65,0x6c,0x70,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x03,0x74,0x61,0x67,0x04,0x67,0x72,0x69,0x64,0x0b,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x6f,0x70,0x65,0x6e,0x06,0x66,0x6f,0x6c,0x64,0x65,0x72,0x09,0x64,0x6f,0x77, +0x6e,0x2d,0x62,0x6f,0x6c,0x64,0x07,0x70,0x61,0x6c,0x65,0x74,0x74,0x65,0x07,0x64,0x6f,0x63,0x2d,0x69,0x6e,0x76,0x03,0x63,0x6f,0x67,0x02,0x74,0x68,0x0a,0x62,0x69,0x6e,0x6f,0x63,0x75,0x6c,0x61,0x72,0x73,0x04,0x6c,0x69,0x73,0x74,0x04,0x6c,0x6f,0x63,0x6b,0x09,0x6c,0x65,0x66,0x74,0x2d,0x62,0x6f,0x6c,0x64,0x07,0x64,0x65,0x73, +0x6b,0x74,0x6f,0x70,0x06,0x73,0x65,0x61,0x72,0x63,0x68,0x0c,0x63,0x69,0x72,0x63,0x6c,0x65,0x2d,0x65,0x6d,0x70,0x74,0x79,0x06,0x70,0x65,0x6e,0x63,0x69,0x6c,0x03,0x68,0x64,0x64,0x0a,0x72,0x69,0x67,0x68,0x74,0x2d,0x62,0x6f,0x6c,0x64,0x0b,0x63,0x6c,0x6f,0x73,0x65,0x5f,0x70,0x61,0x6e,0x65,0x6c,0x08,0x73,0x74,0x65,0x70,0x69, +0x6e,0x74,0x6f,0x07,0x75,0x70,0x2d,0x62,0x6f,0x6c,0x64,0x02,0x6f,0x6b,0x09,0x61,0x74,0x74,0x65,0x6e,0x74,0x69,0x6f,0x6e,0x10,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x5f,0x73,0x70,0x6c,0x69,0x74,0x0e,0x76,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x5f,0x73,0x70,0x6c,0x69,0x74,0x08,0x73,0x74,0x65,0x70,0x6f,0x76,0x65, +0x72,0x10,0x70,0x6c,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x2d,0x61,0x6c,0x74,0x11,0x6d,0x69,0x6e,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x2d,0x61,0x6c,0x74,0x08,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x75,0x70,0x09,0x63,0x6c,0x69,0x70,0x62,0x6f,0x61,0x72,0x64,0x11,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x6f, +0x70,0x65,0x6e,0x2d,0x65,0x6d,0x70,0x74,0x79,0x0c,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x65,0x6d,0x70,0x74,0x79,0x07,0x73,0x74,0x65,0x70,0x6f,0x75,0x74,0x07,0x67,0x6c,0x61,0x73,0x73,0x65,0x73,0x03,0x64,0x6f,0x63,0x04,0x70,0x6c,0x61,0x79,0x06,0x74,0x6f,0x2d,0x65,0x6e,0x64,0x0c,0x69,0x6e,0x66,0x6f,0x2d,0x63,0x69,0x72,0x63, +0x6c,0x65,0x64,0x03,0x63,0x63,0x77,0x0d,0x6c,0x6f,0x63,0x6b,0x2d,0x6f,0x70,0x65,0x6e,0x2d,0x61,0x6c,0x74,0x06,0x74,0x61,0x72,0x67,0x65,0x74,0x06,0x66,0x6c,0x6f,0x70,0x70,0x79,0x0f,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2d,0x6d,0x61,0x78,0x69,0x6d,0x69,0x7a,0x65,0x0b,0x64,0x6f,0x74,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x03, +0x70,0x69,0x6e,0x09,0x61,0x72,0x72,0x6f,0x77,0x73,0x2d,0x63,0x77,0x05,0x70,0x61,0x75,0x73,0x65,0x04,0x73,0x74,0x6f,0x70,0x02,0x63,0x77,0x0a,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x64,0x6f,0x77,0x6e,0x11,0x61,0x74,0x74,0x65,0x6e,0x74,0x69,0x6f,0x6e,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x06,0x63,0x61,0x6e,0x63,0x65,0x6c,0x03, +0x62,0x6f,0x78,0x09,0x66,0x6c,0x6f,0x77,0x2d,0x74,0x72,0x65,0x65,0x0c,0x70,0x6c,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x0d,0x6d,0x69,0x6e,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x7e,0x01,0x1e,0x00,0x7d,0x00,0x7d,0x01,0x1e,0x03,0x18,0xff,0xb1,0x03,0x38,0x03,0x0b,0xff,0xb1,0xff,0xb1,0x03,0x18,0xff,0xb1,0x03,0x38,0x03,0x0b,0xff,0xb1,0xff,0xb1,0xb0,0x00,0x2c,0x20,0xb0,0x00,0x55,0x58,0x45,0x59,0x20,0x20,0x4b,0xb8,0x00,0x0e,0x51,0x4b,0xb0,0x06, +0x53,0x5a,0x58,0xb0,0x34,0x1b,0xb0,0x28,0x59,0x60,0x66,0x20,0x8a,0x55,0x58,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x62,0x1b,0x21,0x21,0xb0,0x00,0x59,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x01,0x2c,0xb0,0x20,0x60,0x66,0x2d,0xb0,0x02,0x2c,0x23,0x21,0x23,0x21,0x2d,0xb0, +0x03,0x2c,0x20,0x64,0xb3,0x03,0x14,0x15,0x00,0x42,0x43,0xb0,0x13,0x43,0x20,0x60,0x60,0x42,0xb1,0x02,0x14,0x43,0x42,0xb1,0x25,0x03,0x43,0xb0,0x02,0x43,0x54,0x78,0x20,0xb0,0x0c,0x23,0xb0,0x02,0x43,0x43,0x61,0x64,0xb0,0x04,0x50,0x78,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb0,0x21,0x65,0x1c,0x21,0xb0,0x02,0x43,0x43,0xb2,0x0e, +0x15,0x01,0x42,0x1c,0x20,0xb0,0x02,0x43,0x23,0x42,0xb2,0x13,0x01,0x13,0x43,0x60,0x42,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb2,0x16,0x01,0x02,0x43,0x60,0x42,0x2d,0xb0,0x04,0x2c,0xb0,0x03,0x2b,0xb0,0x15,0x43,0x58,0x23,0x21,0x23,0x21,0xb0,0x16,0x43,0x43,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x1b,0x20,0x64,0x20,0xb0,0xc0,0x50, +0xb0,0x04,0x26,0x5a,0xb2,0x28,0x01,0x0d,0x43,0x45,0x63,0x45,0xb0,0x06,0x45,0x58,0x21,0xb0,0x03,0x25,0x59,0x52,0x5b,0x58,0x21,0x23,0x21,0x1b,0x8a,0x58,0x20,0xb0,0x50,0x50,0x58,0x21,0xb0,0x40,0x59,0x1b,0x20,0xb0,0x38,0x50,0x58,0x21,0xb0,0x38,0x59,0x59,0x20,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x61,0x64,0xb0,0x28,0x50,0x58, +0x21,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x20,0xb0,0x30,0x50,0x58,0x21,0xb0,0x30,0x59,0x1b,0x20,0xb0,0xc0,0x50,0x58,0x20,0x66,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x0a,0x50,0x58,0x60,0x1b,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x0a,0x60,0x1b,0x20,0xb0,0x36,0x50,0x58,0x21,0xb0,0x36,0x60,0x1b,0x60,0x59,0x59,0x59,0x1b,0xb0,0x02,0x25, +0xb0,0x0c,0x43,0x63,0xb0,0x00,0x52,0x58,0xb0,0x00,0x4b,0xb0,0x0a,0x50,0x58,0x21,0xb0,0x0c,0x43,0x1b,0x4b,0xb0,0x1e,0x50,0x58,0x21,0xb0,0x1e,0x4b,0x61,0xb8,0x10,0x00,0x63,0xb0,0x0c,0x43,0x63,0xb8,0x05,0x00,0x62,0x59,0x59,0x64,0x61,0x59,0xb0,0x01,0x2b,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x59,0x20,0x64,0xb0,0x16, +0x43,0x23,0x42,0x59,0x2d,0xb0,0x05,0x2c,0x20,0x45,0x20,0xb0,0x04,0x25,0x61,0x64,0x20,0xb0,0x07,0x43,0x50,0x58,0xb0,0x07,0x23,0x42,0xb0,0x08,0x23,0x42,0x1b,0x21,0x21,0x59,0xb0,0x01,0x60,0x2d,0xb0,0x06,0x2c,0x23,0x21,0x23,0x21,0xb0,0x03,0x2b,0x20,0x64,0xb1,0x07,0x62,0x42,0x20,0xb0,0x08,0x23,0x42,0xb0,0x06,0x45,0x58,0x1b, +0xb1,0x01,0x0d,0x43,0x45,0x63,0xb1,0x01,0x0d,0x43,0xb0,0x01,0x60,0x45,0x63,0xb0,0x05,0x2a,0x21,0x20,0xb0,0x08,0x43,0x20,0x8a,0x20,0x8a,0xb0,0x01,0x2b,0xb1,0x30,0x05,0x25,0xb0,0x04,0x26,0x51,0x58,0x60,0x50,0x1b,0x61,0x52,0x59,0x58,0x23,0x59,0x21,0x59,0x20,0xb0,0x40,0x53,0x58,0xb0,0x01,0x2b,0x1b,0x21,0xb0,0x40,0x59,0x23, +0xb0,0x00,0x50,0x58,0x65,0x59,0x2d,0xb0,0x07,0x2c,0xb0,0x09,0x43,0x2b,0xb2,0x00,0x02,0x00,0x43,0x60,0x42,0x2d,0xb0,0x08,0x2c,0xb0,0x09,0x23,0x42,0x23,0x20,0xb0,0x00,0x23,0x42,0x61,0xb0,0x02,0x62,0x66,0xb0,0x01,0x63,0xb0,0x01,0x60,0xb0,0x07,0x2a,0x2d,0xb0,0x09,0x2c,0x20,0x20,0x45,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00, +0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0a,0x2c,0xb2,0x09,0x0e,0x00,0x43,0x45,0x42,0x2a,0x21,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0b,0x2c,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0c,0x2c,0x20,0x20,0x45,0x20,0xb0, +0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a,0x23,0x61,0x20,0x64,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x00,0x1b,0xb0,0x30,0x50,0x58,0xb0,0x20,0x1b,0xb0,0x40,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0d,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01, +0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a,0x23,0x61,0x20,0x64,0xb0,0x24,0x50,0x58,0xb0,0x00,0x1b,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0e,0x2c,0x20,0xb0,0x00,0x23,0x42,0xb3,0x0d,0x0c,0x00,0x03,0x45,0x50,0x58,0x21,0x1b,0x23,0x21, +0x59,0x2a,0x21,0x2d,0xb0,0x0f,0x2c,0xb1,0x02,0x02,0x45,0xb0,0x64,0x61,0x44,0x2d,0xb0,0x10,0x2c,0xb0,0x01,0x60,0x20,0x20,0xb0,0x0f,0x43,0x4a,0xb0,0x00,0x50,0x58,0x20,0xb0,0x0f,0x23,0x42,0x59,0xb0,0x10,0x43,0x4a,0xb0,0x00,0x52,0x58,0x20,0xb0,0x10,0x23,0x42,0x59,0x2d,0xb0,0x11,0x2c,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63, +0x20,0xb8,0x04,0x00,0x63,0x8a,0x23,0x61,0xb0,0x11,0x43,0x60,0x20,0x8a,0x60,0x20,0xb0,0x11,0x23,0x42,0x23,0x2d,0xb0,0x12,0x2c,0x4b,0x54,0x58,0xb1,0x04,0x64,0x44,0x59,0x24,0xb0,0x0d,0x65,0x23,0x78,0x2d,0xb0,0x13,0x2c,0x4b,0x51,0x58,0x4b,0x53,0x58,0xb1,0x04,0x64,0x44,0x59,0x1b,0x21,0x59,0x24,0xb0,0x13,0x65,0x23,0x78,0x2d, +0xb0,0x14,0x2c,0xb1,0x00,0x12,0x43,0x55,0x58,0xb1,0x12,0x12,0x43,0xb0,0x01,0x61,0x42,0xb0,0x11,0x2b,0x59,0xb0,0x00,0x43,0xb0,0x02,0x25,0x42,0xb1,0x0f,0x02,0x25,0x42,0xb1,0x10,0x02,0x25,0x42,0xb0,0x01,0x16,0x23,0x20,0xb0,0x03,0x25,0x50,0x58,0xb1,0x01,0x00,0x43,0x60,0xb0,0x04,0x25,0x42,0x8a,0x8a,0x20,0x8a,0x23,0x61,0xb0, +0x10,0x2a,0x21,0x23,0xb0,0x01,0x61,0x20,0x8a,0x23,0x61,0xb0,0x10,0x2a,0x21,0x1b,0xb1,0x01,0x00,0x43,0x60,0xb0,0x02,0x25,0x42,0xb0,0x02,0x25,0x61,0xb0,0x10,0x2a,0x21,0x59,0xb0,0x0f,0x43,0x47,0xb0,0x10,0x43,0x47,0x60,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x20,0xb0,0x0e,0x43,0x63, +0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb1,0x00,0x00,0x13,0x23,0x44,0xb0,0x01,0x43,0xb0,0x00,0x3e,0xb2,0x01,0x01,0x01,0x43,0x60,0x42,0x2d,0xb0,0x15,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x01,0x60, +0x42,0x20,0x60,0xb7,0x18,0x18,0x01,0x00,0x11,0x00,0x13,0x00,0x42,0x42,0x42,0x8a,0x60,0x20,0xb0,0x14,0x23,0x42,0xb0,0x01,0x61,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x16,0x2c,0xb1,0x00,0x15,0x2b,0x2d,0xb0,0x17,0x2c,0xb1,0x01,0x15,0x2b,0x2d,0xb0,0x18,0x2c,0xb1,0x02,0x15,0x2b,0x2d,0xb0,0x19,0x2c,0xb1, +0x03,0x15,0x2b,0x2d,0xb0,0x1a,0x2c,0xb1,0x04,0x15,0x2b,0x2d,0xb0,0x1b,0x2c,0xb1,0x05,0x15,0x2b,0x2d,0xb0,0x1c,0x2c,0xb1,0x06,0x15,0x2b,0x2d,0xb0,0x1d,0x2c,0xb1,0x07,0x15,0x2b,0x2d,0xb0,0x1e,0x2c,0xb1,0x08,0x15,0x2b,0x2d,0xb0,0x1f,0x2c,0xb1,0x09,0x15,0x2b,0x2d,0xb0,0x2b,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63, +0xb0,0x06,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x5d,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2c,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x16,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x71,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2d,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x26,0x60,0x4b,0x54,0x58, +0x23,0x20,0x2e,0xb0,0x01,0x72,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x20,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x01,0x60,0x42,0x20,0x60,0xb0,0x01,0x61,0xb5,0x18,0x18,0x01,0x00,0x11,0x00,0x42,0x42,0x8a,0x60,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b, +0x1b,0x22,0x59,0x2d,0xb0,0x21,0x2c,0xb1,0x00,0x20,0x2b,0x2d,0xb0,0x22,0x2c,0xb1,0x01,0x20,0x2b,0x2d,0xb0,0x23,0x2c,0xb1,0x02,0x20,0x2b,0x2d,0xb0,0x24,0x2c,0xb1,0x03,0x20,0x2b,0x2d,0xb0,0x25,0x2c,0xb1,0x04,0x20,0x2b,0x2d,0xb0,0x26,0x2c,0xb1,0x05,0x20,0x2b,0x2d,0xb0,0x27,0x2c,0xb1,0x06,0x20,0x2b,0x2d,0xb0,0x28,0x2c,0xb1, +0x07,0x20,0x2b,0x2d,0xb0,0x29,0x2c,0xb1,0x08,0x20,0x2b,0x2d,0xb0,0x2a,0x2c,0xb1,0x09,0x20,0x2b,0x2d,0xb0,0x2e,0x2c,0x20,0x3c,0xb0,0x01,0x60,0x2d,0xb0,0x2f,0x2c,0x20,0x60,0xb0,0x18,0x60,0x20,0x43,0x23,0xb0,0x01,0x60,0x43,0xb0,0x02,0x25,0x61,0xb0,0x01,0x60,0xb0,0x2e,0x2a,0x21,0x2d,0xb0,0x30,0x2c,0xb0,0x2f,0x2b,0xb0,0x2f, +0x2a,0x2d,0xb0,0x31,0x2c,0x20,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x23,0x20,0x8a,0x55,0x58,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01, +0x63,0x60,0x23,0x61,0x38,0x1b,0x21,0x59,0x2d,0xb0,0x32,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x33,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x16,0xb0, +0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x34,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0xb0,0x35,0x2c,0x00,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x45,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62, +0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x00,0x16,0xb4,0x00,0x00,0x00,0x00,0x00,0x44,0x3e,0x23,0x38,0xb1,0x34,0x01,0x15,0x2a,0x21,0x2d,0xb0,0x36,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01, +0x63,0x60,0xb0,0x00,0x43,0x61,0x38,0x2d,0xb0,0x37,0x2c,0x2e,0x17,0x3c,0x2d,0xb0,0x38,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0xb0,0x01,0x43,0x63,0x38,0x2d,0xb0,0x39,0x2c,0xb1,0x02,0x00,0x16,0x25,0x20, +0x2e,0x20,0x47,0xb0,0x00,0x23,0x42,0xb0,0x02,0x25,0x49,0x8a,0x8a,0x47,0x23,0x47,0x23,0x61,0x20,0x58,0x62,0x1b,0x21,0x59,0xb0,0x01,0x23,0x42,0xb2,0x38,0x01,0x01,0x15,0x14,0x2a,0x2d,0xb0,0x3a,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43, +0x2b,0x65,0x8a,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x3b,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3, +0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0xb0,0x0a,0x43,0x20,0x8a,0x23,0x47,0x23,0x47,0x23,0x61,0x23,0x46,0x60,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50, +0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x1b,0x23,0xb0,0x0a,0x43,0x46,0xb0,0x02,0x25,0xb0,0x0a,0x43,0x47,0x23,0x47,0x23,0x61,0x60,0x20,0xb0,0x06,0x43,0xb0, +0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x06,0x43,0x60,0xb0,0x01,0x2b,0xb0,0x05,0x25,0x61,0xb0,0x05,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x04,0x26,0x61,0x20,0xb0,0x04,0x25,0x60,0x64,0x23,0xb0, +0x03,0x25,0x60,0x64,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x59,0x2d,0xb0,0x3c,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0x20,0x20,0xb0,0x05,0x26,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x23,0x3c,0x38,0x2d,0xb0,0x3d,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x23, +0x42,0x20,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x2d,0xb0,0x3e,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x03,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x00,0x54,0x58,0x2e,0x20,0x3c,0x23,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x05,0x25,0xb0,0x04,0x25,0x47, +0x23,0x47,0x23,0x61,0xb0,0x06,0x25,0xb0,0x05,0x25,0x49,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x20,0x58,0x62,0x1b,0x21,0x59,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x23,0x21,0x59,0x2d,0xb0,0x3f,0x2c,0xb0, +0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x43,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0x60,0xb0,0x20,0x60,0x66,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x40,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52, +0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x41,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x42,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c, +0x59,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x43,0x2c,0xb0,0x3a,0x2b,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x44,0x2c, +0xb0,0x3b,0x2b,0x8a,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x8a,0x38,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x45,0x2c,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x26,0x20,0x20,0x20,0x46,0x23, +0x47,0x61,0xb0,0x0c,0x23,0x42,0x2e,0x47,0x23,0x47,0x23,0x61,0xb0,0x0b,0x43,0x2b,0x23,0x20,0x3c,0x20,0x2e,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x46,0x2c,0xb1,0x0a,0x04,0x25,0x42,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b, +0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0x47,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23, +0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0xb0,0x02,0x25,0x46,0x61,0x38,0x23,0x20,0x3c,0x23,0x38,0x1b,0x21,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x21,0x59,0xb1, +0x30,0x01,0x14,0x2b,0x2d,0xb0,0x47,0x2c,0xb1,0x00,0x3a,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x48,0x2c,0xb1,0x00,0x3b,0x2b,0x21,0x23,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x49,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00, +0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4a,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4b,0x2c,0xb1,0x00,0x01,0x14,0x13,0xb0,0x37,0x2a,0x2d,0xb0,0x4c,0x2c,0xb0,0x39,0x2a,0x2d,0xb0,0x4d,0x2c,0xb0,0x00,0x16,0x45,0x23,0x20,0x2e,0x20, +0x46,0x8a,0x23,0x61,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x4e,0x2c,0xb0,0x0a,0x23,0x42,0xb0,0x4d,0x2b,0x2d,0xb0,0x4f,0x2c,0xb2,0x00,0x00,0x46,0x2b,0x2d,0xb0,0x50,0x2c,0xb2,0x00,0x01,0x46,0x2b,0x2d,0xb0,0x51,0x2c,0xb2,0x01,0x00,0x46,0x2b,0x2d,0xb0,0x52,0x2c,0xb2,0x01,0x01,0x46,0x2b,0x2d,0xb0,0x53,0x2c,0xb2,0x00,0x00, +0x47,0x2b,0x2d,0xb0,0x54,0x2c,0xb2,0x00,0x01,0x47,0x2b,0x2d,0xb0,0x55,0x2c,0xb2,0x01,0x00,0x47,0x2b,0x2d,0xb0,0x56,0x2c,0xb2,0x01,0x01,0x47,0x2b,0x2d,0xb0,0x57,0x2c,0xb3,0x00,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x58,0x2c,0xb3,0x00,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x59,0x2c,0xb3,0x01,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x5a,0x2c,0xb3, +0x01,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x5b,0x2c,0xb3,0x00,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5c,0x2c,0xb3,0x00,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5d,0x2c,0xb3,0x01,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5e,0x2c,0xb3,0x01,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5f,0x2c,0xb2,0x00,0x00,0x45,0x2b,0x2d,0xb0,0x60,0x2c,0xb2,0x00,0x01,0x45,0x2b,0x2d, +0xb0,0x61,0x2c,0xb2,0x01,0x00,0x45,0x2b,0x2d,0xb0,0x62,0x2c,0xb2,0x01,0x01,0x45,0x2b,0x2d,0xb0,0x63,0x2c,0xb2,0x00,0x00,0x48,0x2b,0x2d,0xb0,0x64,0x2c,0xb2,0x00,0x01,0x48,0x2b,0x2d,0xb0,0x65,0x2c,0xb2,0x01,0x00,0x48,0x2b,0x2d,0xb0,0x66,0x2c,0xb2,0x01,0x01,0x48,0x2b,0x2d,0xb0,0x67,0x2c,0xb3,0x00,0x00,0x00,0x44,0x2b,0x2d, +0xb0,0x68,0x2c,0xb3,0x00,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x69,0x2c,0xb3,0x01,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x6a,0x2c,0xb3,0x01,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x6b,0x2c,0xb3,0x00,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6c,0x2c,0xb3,0x00,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6d,0x2c,0xb3,0x01,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6e,0x2c,0xb3, +0x01,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6f,0x2c,0xb1,0x00,0x3c,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x70,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x71,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x72,0x2c,0xb0,0x00,0x16,0xb1,0x00,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x73,0x2c,0xb1,0x01,0x3c,0x2b,0xb0, +0x40,0x2b,0x2d,0xb0,0x74,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x75,0x2c,0xb0,0x00,0x16,0xb1,0x01,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x76,0x2c,0xb1,0x00,0x3d,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x77,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x78,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x41,0x2b,0x2d, +0xb0,0x79,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7a,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7b,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x7c,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7d,0x2c,0xb1,0x00,0x3e,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x7e,0x2c,0xb1,0x00,0x3e, +0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7f,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x80,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x81,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x82,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x83,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x84,0x2c,0xb1, +0x00,0x3f,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x85,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x86,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x87,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x88,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x89,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x41,0x2b, +0x2d,0xb0,0x8a,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x8b,0x2c,0xb2,0x0b,0x00,0x03,0x45,0x50,0x58,0xb0,0x06,0x1b,0xb2,0x04,0x02,0x03,0x45,0x58,0x23,0x21,0x1b,0x21,0x59,0x59,0x42,0x2b,0xb0,0x08,0x65,0xb0,0x03,0x24,0x50,0x78,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x2d,0x00,0x4b,0xb8,0x00,0xc8,0x52,0x58,0xb1, +0x01,0x01,0x8e,0x59,0xb0,0x01,0xb9,0x08,0x00,0x08,0x00,0x63,0x70,0xb1,0x00,0x07,0x42,0xb2,0x19,0x01,0x00,0x2a,0xb1,0x00,0x07,0x42,0xb3,0x0d,0x09,0x01,0x0a,0x2a,0xb1,0x00,0x07,0x42,0xb3,0x16,0x06,0x01,0x0a,0x2a,0xb1,0x00,0x08,0x42,0xba,0x03,0x80,0x00,0x01,0x00,0x0b,0x2a,0xb1,0x00,0x09,0x42,0xba,0x00,0x80,0x00,0x01,0x00, +0x0b,0x2a,0xb9,0x00,0x03,0x00,0x00,0x44,0xb1,0x24,0x01,0x88,0x51,0x58,0xb0,0x40,0x88,0x58,0xb9,0x00,0x03,0x00,0x64,0x44,0xb1,0x28,0x01,0x88,0x51,0x58,0xb8,0x08,0x00,0x88,0x58,0xb9,0x00,0x03,0x00,0x00,0x44,0x59,0x1b,0xb1,0x27,0x01,0x88,0x51,0x58,0xba,0x08,0x80,0x00,0x01,0x04,0x40,0x88,0x63,0x54,0x58,0xb9,0x00,0x03,0x00, +0x00,0x44,0x59,0x59,0x59,0x59,0x59,0xb3,0x10,0x06,0x01,0x0e,0x2a,0xb8,0x01,0xff,0x85,0xb0,0x04,0x8d,0xb1,0x02,0x00,0x44,0xb3,0x05,0x64,0x06,0x00,0x44,0x44,0x00, +}; + +read_only global String8 rd_icon_font_bytes = {rd_icon_font_bytes__data, sizeof(rd_icon_font_bytes__data)}; +read_only global U8 rd_default_main_font_bytes__data[] = +{ +0x00,0x01,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x04,0x00,0x80,0x44,0x53,0x49,0x47,0x63,0xbc,0x04,0x48,0x00,0x0c,0x94,0x20,0x00,0x00,0x23,0xa0,0x47,0x44,0x45,0x46,0xb9,0xab,0xc5,0xc1,0x00,0x0c,0xb7,0xc0,0x00,0x00,0x03,0x58,0x47,0x50,0x4f,0x53,0x5b,0xad,0x7e,0xc2,0x00,0x0c,0xbb,0x18,0x00,0x01,0x4c,0xc8,0x47,0x53,0x55,0x42, +0x62,0x6c,0x1b,0xf3,0x00,0x0e,0x07,0xe0,0x00,0x00,0x8d,0x2e,0x4c,0x54,0x53,0x48,0x69,0x2b,0xe4,0xa7,0x00,0x00,0x55,0xe8,0x00,0x00,0x14,0xe4,0x4d,0x45,0x52,0x47,0x00,0x16,0x00,0x01,0x00,0x0e,0x95,0x10,0x00,0x00,0x00,0x0c,0x4f,0x53,0x2f,0x32,0x5f,0x62,0x3d,0x91,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x60,0x56,0x44,0x4d,0x58, +0x76,0x58,0x7d,0xd3,0x00,0x00,0x6a,0xcc,0x00,0x00,0x05,0xe0,0x63,0x6d,0x61,0x70,0x33,0x66,0x8a,0xbf,0x00,0x01,0xd3,0xd8,0x00,0x00,0x1c,0xe4,0x63,0x76,0x74,0x20,0x82,0x03,0x5d,0xdb,0x00,0x02,0x03,0x58,0x00,0x00,0x0a,0x22,0x66,0x70,0x67,0x6d,0x49,0x44,0xd8,0x67,0x00,0x01,0xf0,0xbc,0x00,0x00,0x0a,0x5c,0x67,0x61,0x73,0x70, +0x00,0x1b,0x00,0x23,0x00,0x0c,0x94,0x10,0x00,0x00,0x00,0x10,0x67,0x6c,0x79,0x66,0x2b,0xa3,0xa5,0xc9,0x00,0x02,0x61,0x00,0x00,0x09,0x4b,0xfc,0x68,0x64,0x6d,0x78,0xf0,0x92,0x4d,0xb8,0x00,0x00,0x70,0xac,0x00,0x01,0x63,0x2c,0x68,0x65,0x61,0x64,0xf3,0x00,0x6d,0x9b,0x00,0x00,0x01,0x8c,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61, +0x14,0x0e,0x1d,0xa4,0x00,0x00,0x01,0xc4,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,0x5e,0x06,0x4f,0x2c,0x00,0x00,0x02,0x68,0x00,0x00,0x53,0x80,0x6b,0x65,0x72,0x6e,0xcc,0xce,0xe6,0xda,0x00,0x0b,0xac,0xfc,0x00,0x00,0xc2,0x6a,0x6c,0x6f,0x63,0x61,0x5a,0x85,0x46,0xd0,0x00,0x02,0x0d,0x7c,0x00,0x00,0x53,0x84,0x6d,0x61,0x78,0x70, +0x1a,0xb0,0x0d,0xea,0x00,0x00,0x01,0xe8,0x00,0x00,0x00,0x20,0x6d,0x65,0x74,0x61,0x4d,0x44,0xb7,0xb7,0x00,0x0e,0x95,0x1c,0x00,0x00,0x00,0x80,0x6e,0x61,0x6d,0x65,0x4e,0xc3,0x16,0xb3,0x00,0x0c,0x6f,0x68,0x00,0x00,0x24,0x88,0x70,0x6f,0x73,0x74,0xff,0x51,0x00,0x77,0x00,0x0c,0x93,0xf0,0x00,0x00,0x00,0x20,0x70,0x72,0x65,0x70, +0x93,0xee,0x1e,0xb9,0x00,0x01,0xfb,0x18,0x00,0x00,0x08,0x40,0x00,0x01,0x00,0x00,0x00,0x05,0x9e,0xb8,0xa0,0x2c,0x85,0x86,0x5f,0x0f,0x3c,0xf5,0x00,0x1b,0x08,0x00,0x00,0x00,0x00,0x00,0xaf,0xf5,0x3c,0xaf,0x00,0x00,0x00,0x00,0xd8,0x6f,0x46,0x1c,0xfb,0x6b,0xfc,0xb6,0x0f,0xfe,0x0a,0x63,0x00,0x00,0x00,0x09,0x00,0x01,0x00,0x01, +0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x08,0xa2,0xfd,0xfe,0x00,0x00,0x0f,0xf4,0xfb,0x6b,0xfa,0xd1,0x0f,0xfe,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xe0,0x00,0x01,0x00,0x00,0x14,0xe0,0x02,0xb9,0x00,0x20,0x00,0xa3,0x00,0x07,0x00,0x02,0x00,0x10,0x00,0x2f,0x00,0x86,0x00,0x00, +0x05,0x0e,0x0a,0x5c,0x00,0x04,0x00,0x01,0x00,0x03,0x04,0x4f,0x01,0x90,0x00,0x05,0x00,0x08,0x05,0x9a,0x05,0x33,0x00,0x00,0x01,0x1b,0x05,0x9a,0x05,0x33,0x00,0x00,0x03,0xd1,0x00,0x66,0x02,0x12,0x08,0x05,0x02,0x0b,0x05,0x02,0x04,0x02,0x04,0x02,0x02,0x03,0xe4,0x00,0x2e,0xff,0xc0,0x00,0xe4,0x7f,0x00,0x00,0x00,0x09,0x00,0x00, +0x00,0x00,0x4d,0x53,0x20,0x20,0x00,0x40,0x00,0x0d,0xff,0xfd,0x05,0xd3,0xfe,0x51,0x01,0x0d,0x08,0xa2,0x02,0x02,0x20,0x00,0x01,0xff,0x00,0x00,0x00,0x00,0x04,0x00,0x05,0x9a,0x00,0x00,0x00,0x20,0x00,0x17,0x05,0x2a,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x46,0x00,0xb4,0x03,0x23,0x00,0xa3, +0x04,0xba,0x00,0x21,0x04,0x50,0x00,0xa2,0x06,0x8c,0x00,0x50,0x06,0x67,0x00,0x77,0x01,0xd7,0x00,0xa3,0x02,0x6a,0x00,0x8c,0x02,0x6a,0x00,0x16,0x03,0x56,0x00,0x4c,0x05,0x79,0x00,0xe8,0x01,0xbc,0x00,0x27,0x03,0x33,0x00,0x90,0x01,0xbc,0x00,0x70,0x03,0x1e,0xff,0xe4,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0xe4,0x04,0x50,0x00,0x6d, +0x04,0x50,0x00,0x7b,0x04,0x50,0x00,0x0e,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x50,0x00,0x62,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x01,0xbc,0x00,0x70,0x01,0xbc,0x00,0x27,0x05,0x79,0x01,0x10,0x05,0x79,0x00,0xe8,0x05,0x79,0x01,0x10,0x03,0x96,0x00,0x83,0x07,0xa4,0x00,0xac,0x05,0x29,0x00,0x16,0x04,0x96,0x00,0xbc, +0x04,0xf4,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x03,0xe8,0x00,0xbc,0x05,0x7d,0x00,0x5e,0x05,0xae,0x00,0xbc,0x02,0x21,0x00,0xbc,0x02,0xdb,0x00,0x14,0x04,0xa4,0x00,0xbc,0x03,0xc4,0x00,0xbc,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x06,0x08,0x00,0x5e,0x04,0x7b,0x00,0xbc,0x06,0x08,0x00,0x5e,0x04,0xc9,0x00,0xbc, +0x04,0x40,0x00,0x79,0x04,0x31,0x00,0x29,0x05,0x7f,0x00,0xaa,0x04,0xf8,0x00,0x12,0x07,0x79,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x04,0x6c,0x00,0x12,0x04,0x90,0x00,0x21,0x02,0x6a,0x00,0xc8,0x03,0x08,0xff,0xe6,0x02,0x6a,0x00,0x35,0x05,0x79,0x00,0xe6,0x03,0x52,0x00,0x00,0x02,0x25,0x00,0x52,0x04,0x12,0x00,0x5a,0x04,0xb4,0x00,0xa6, +0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x60,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x04,0x87,0x00,0xa6,0x01,0xf0,0x00,0x90,0x01,0xf0,0xff,0x3a,0x03,0xfa,0x00,0xa6,0x01,0xf0,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xb0,0x00,0x60,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0x60,0x02,0xc8,0x00,0xa6, +0x03,0x65,0x00,0x68,0x02,0xb6,0x00,0x2b,0x04,0x87,0x00,0x90,0x03,0xd5,0x00,0x0e,0x05,0xc8,0x00,0x18,0x03,0xac,0x00,0x1a,0x03,0xdf,0x00,0x0e,0x03,0x9e,0x00,0x21,0x02,0x6a,0x00,0x5c,0x01,0xea,0x00,0xac,0x02,0x6a,0x00,0x42,0x05,0x79,0x00,0xd1,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x04,0xf4,0x00,0x5e,0x04,0x0c,0x00,0xbc, +0x05,0xfc,0x00,0xbc,0x06,0x08,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x03,0xb2,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x01,0xf0,0x00,0x58,0x01,0xf0,0xff,0xec, +0x01,0xf0,0xff,0xd3,0x01,0xf0,0xff,0xc9,0x04,0x87,0x00,0xa6,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x03,0x00,0x00,0x30,0x03,0x04,0x00,0x6c,0x04,0x50,0x00,0xb8,0x04,0x50,0x00,0x6a, +0x03,0x96,0x00,0x83,0x03,0x40,0x00,0xa4,0x03,0xaa,0x00,0x54,0x04,0x5a,0x00,0xa6,0x03,0x33,0x00,0x90,0x07,0x1f,0x01,0x38,0x07,0x1f,0x00,0xa2,0x06,0x2f,0x00,0x4c,0x02,0x42,0x00,0x87,0x03,0x50,0x00,0x7d,0x05,0x7b,0x00,0xe8,0x06,0xe2,0x00,0x0a,0x06,0x08,0x00,0x5e,0x06,0x89,0x00,0x52,0x05,0x79,0x00,0xe8,0x05,0x7b,0x00,0xe8, +0x05,0x7b,0x00,0xe8,0x04,0x50,0x00,0x44,0x04,0x9e,0x00,0xa6,0x04,0x48,0x00,0x4e,0x04,0xef,0x00,0x33,0x06,0x08,0x00,0xbc,0x04,0x51,0x00,0xbe,0x03,0x23,0x00,0x52,0x03,0x72,0x00,0x4e,0x06,0x0a,0x00,0x64,0x06,0xa8,0x00,0x5a,0x04,0xb0,0x00,0x31,0x03,0x96,0x00,0x8f,0x02,0x31,0x00,0x00,0x02,0x46,0x00,0xb4,0x05,0x79,0x00,0xe8, +0x05,0x33,0x00,0x7b,0x04,0x50,0x00,0x5e,0x05,0x7b,0x00,0xd1,0x05,0x28,0x00,0x33,0x04,0x0c,0x00,0x5c,0x04,0x0c,0x00,0x5a,0x05,0xdd,0x00,0x8c,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x06,0x08,0x00,0x5e,0x07,0x72,0x00,0x5e,0x07,0x6c,0x00,0x60,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x04,0x00,0x6a,0x03,0x04,0x00,0x6e, +0x01,0xd5,0x00,0x6a,0x01,0xd5,0x00,0x6e,0x05,0x79,0x00,0xe8,0x04,0xab,0x00,0x6c,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x01,0x62,0xfe,0xc8,0x04,0x50,0x00,0x66,0x02,0x87,0x00,0x5c,0x02,0x87,0x00,0x5c,0x04,0x70,0x00,0x35,0x04,0x70,0x00,0x35,0x03,0x00,0x00,0x30,0x01,0xbc,0x00,0x70,0x01,0xd5,0x00,0x58,0x03,0x04,0x00,0x58, +0x09,0xae,0x00,0x50,0x05,0x29,0x00,0x16,0x04,0x0c,0x00,0xbc,0x05,0x29,0x00,0x16,0x04,0x0c,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x02,0x21,0x00,0x78,0x02,0x21,0xff,0xfc,0x02,0x21,0xff,0xf1,0x02,0x21,0x00,0x1b,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa, +0x01,0xf0,0x00,0xa6,0x02,0xf8,0x00,0x5c,0x02,0xb2,0x00,0x23,0x02,0x7b,0x00,0x3e,0x02,0x6e,0x00,0x25,0x01,0x9c,0x00,0x6c,0x02,0x3e,0x00,0x52,0x01,0xa4,0x00,0x33,0x02,0x98,0x00,0x40,0x01,0x7b,0x00,0x3e,0x02,0xf8,0x00,0x66,0x03,0xc4,0x00,0x21,0x02,0x31,0x00,0x16,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x90,0x00,0x21, +0x03,0x9e,0x00,0x21,0x01,0xea,0x00,0xac,0x05,0x9c,0x00,0x1c,0x04,0x79,0x00,0x60,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x05,0x79,0x00,0xe8,0x05,0x79,0x01,0x0c,0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x07,0x72,0x00,0x50,0x07,0x40,0x00,0x50,0x07,0x9e,0x00,0x81, +0x03,0xe8,0x00,0x1c,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x02,0x21,0x00,0xad,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x03,0x52,0x00,0x00,0x01,0xbc,0x00,0x70,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16, +0x04,0x12,0x00,0x5a,0x05,0x9c,0x00,0xbc,0x05,0x65,0x00,0x60,0x05,0x9c,0x00,0x1c,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x8e,0x03,0xc4,0x00,0xbc,0x02,0x75,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x02,0x85,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6, +0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0x97,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x03,0x85,0x00,0x2b,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90, +0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x03,0xc6,0x00,0xbc,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x60,0x04,0xea,0x00,0x5a,0x04,0xac,0x00,0x5c,0x03,0x81,0x00,0x52,0x04,0x99,0x00,0x61,0x03,0xe6,0x00,0x22,0x05,0x98,0x00,0x60,0x03,0x52,0x00,0x00, +0x03,0xd7,0x00,0xb4,0x03,0x23,0x00,0x6e,0x08,0xe2,0x00,0xbc,0x04,0xfc,0x00,0xbc,0x03,0xf6,0x00,0x90,0x04,0xd9,0xff,0xd7,0x01,0xd5,0x00,0x82,0x03,0x04,0x00,0x8d,0x06,0x6e,0x00,0x96,0x02,0x96,0x00,0x0e,0x04,0xd5,0x00,0x92,0x02,0xd5,0x00,0x83,0x02,0xd5,0x00,0x83,0x04,0xd5,0x00,0xb2,0x02,0xd5,0x00,0x70,0x05,0x29,0x00,0x16, +0x04,0x12,0x00,0x5a,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e, +0x04,0xb6,0x00,0x60,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0x1c,0x04,0x87,0x00,0x1e,0x02,0x21,0xff,0xd0,0x01,0xf0,0xff,0xad,0x02,0x21,0x00,0x13,0x01,0xf0,0xff,0xef,0x02,0x21,0xff,0xfe,0x01,0xf0,0xff,0xdb,0x02,0x21,0x00,0x50,0x01,0xf0,0x00,0x37,0x02,0xdb,0x00,0x14,0x01,0xf0,0xff,0x3a,0x04,0xa4,0x00,0xbc, +0x03,0xfa,0x00,0xa6,0x03,0xfa,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x27,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68, +0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x01,0xee,0x00,0xa6,0x05,0x29,0x00,0x16, +0x04,0x12,0x00,0x5a,0x06,0xe2,0x00,0x0a,0x06,0xa8,0x00,0x5a,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x31,0x01,0xbc,0x00,0x70,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x01,0xd5,0x00,0x6e,0x03,0x52,0x00,0x00, +0x04,0x50,0x00,0x6a,0x04,0xcd,0x00,0x55,0x07,0x60,0x00,0x50,0x07,0x60,0x00,0x81,0x07,0x6e,0x00,0x8c,0x07,0x23,0x00,0xa2,0x03,0x1e,0x00,0xdb,0x03,0x1e,0x00,0xdb,0x01,0xbc,0x00,0x27,0x02,0x2e,0x00,0xce,0x02,0x2e,0xff,0xda,0x05,0x29,0x00,0x16,0x04,0x90,0xff,0xc5,0x06,0x31,0xff,0xc5,0x03,0x07,0xff,0xc6,0x06,0x68,0xff,0xd1, +0x05,0x56,0xff,0xb3,0x06,0x9c,0xff,0xd1,0x02,0x22,0xff,0xb2,0x05,0x29,0x00,0x16,0x04,0x96,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x04,0x90,0x00,0x21,0x05,0xae,0x00,0xbc,0x02,0x21,0x00,0xbc,0x04,0xa4,0x00,0xbc,0x05,0x08,0x00,0x18,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x04,0x14,0x00,0x3a,0x06,0x08,0x00,0x5e,0x05,0xb4,0x00,0xbc, +0x04,0x7b,0x00,0xbc,0x04,0x21,0x00,0x2e,0x04,0x31,0x00,0x29,0x04,0x6c,0x00,0x12,0x04,0xb8,0x00,0x1a,0x06,0x35,0x00,0x88,0x06,0x0a,0x00,0x64,0x02,0x21,0xff,0xf1,0x04,0x6c,0x00,0x12,0x04,0xea,0x00,0x5a,0x03,0x81,0x00,0x52,0x04,0x9a,0x00,0x82,0x02,0x22,0x00,0xa6,0x04,0x6c,0x00,0x14,0x04,0x62,0x00,0xa7,0x04,0x27,0x00,0x05, +0x03,0x89,0x00,0x4c,0x04,0x9a,0x00,0x82,0x04,0xb1,0x00,0x61,0x02,0x22,0x00,0xa6,0x04,0x31,0x00,0xa6,0x03,0xfc,0xff,0xfe,0x04,0x9e,0x00,0xa7,0x04,0x35,0x00,0x0c,0x03,0x8f,0x00,0x4d,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0xa1,0x03,0xaf,0x00,0x57,0x04,0x6c,0x00,0x14,0x04,0x4e,0x00,0x0c,0x06,0x00,0x00,0x98,0x06,0x77,0x00,0x77, +0x02,0x22,0xff,0xed,0x04,0x6c,0x00,0x14,0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x14,0x06,0x77,0x00,0x77,0x04,0x0c,0x00,0xbc,0x05,0x9a,0x00,0x29,0x03,0xc6,0x00,0xbc,0x04,0xf0,0x00,0x5e,0x04,0x40,0x00,0x79,0x02,0x21,0xff,0xf1,0x07,0xd9,0x00,0x10,0x07,0xde,0x00,0xbc,0x05,0xc8,0x00,0x29,0x04,0xa4,0x00,0xbc,0x04,0x8a,0x00,0x3c, +0x05,0xab,0x00,0xbc,0x05,0x29,0x00,0x16,0x04,0x93,0x00,0xbc,0x04,0x96,0x00,0xbc,0x03,0xc6,0x00,0xbc,0x05,0x8c,0x00,0x0f,0x04,0x0c,0x00,0xbc,0x06,0xef,0xff,0xea,0x04,0x52,0x00,0x60,0x05,0xfe,0x00,0xbc,0x05,0xfe,0x00,0xbc,0x04,0xa4,0x00,0xbc,0x05,0x62,0x00,0x10,0x07,0x2f,0x00,0xbc,0x05,0xae,0x00,0xbc,0x06,0x08,0x00,0x5e, +0x05,0xb4,0x00,0xbc,0x04,0x7b,0x00,0xbc,0x04,0xf4,0x00,0x5e,0x04,0x31,0x00,0x29,0x04,0x8a,0x00,0x3c,0x05,0xd0,0x00,0x5e,0x04,0xb8,0x00,0x1a,0x05,0xf0,0x00,0xbc,0x05,0x4a,0x00,0xa6,0x07,0x98,0x00,0xbc,0x07,0xd7,0x00,0xbc,0x05,0xa5,0x00,0x29,0x06,0x44,0x00,0xbc,0x04,0x9c,0x00,0xbc,0x04,0xee,0x00,0x68,0x08,0x26,0x00,0xbc, +0x04,0xba,0x00,0x3d,0x04,0x12,0x00,0x5a,0x04,0xa2,0x00,0x77,0x04,0x3d,0x00,0xa6,0x03,0x10,0x00,0xa6,0x04,0x60,0x00,0x12,0x04,0x2f,0x00,0x60,0x05,0xf8,0x00,0x04,0x03,0x91,0x00,0x50,0x04,0xa6,0x00,0xa6,0x04,0xa6,0x00,0xa6,0x03,0xfa,0x00,0xa6,0x04,0x37,0x00,0x10,0x05,0x9e,0x00,0xa6,0x04,0x9e,0x00,0xa6,0x04,0xb0,0x00,0x60, +0x04,0x9e,0x00,0xa6,0x04,0xb4,0x00,0xa6,0x03,0xb2,0x00,0x60,0x03,0x48,0x00,0x1e,0x03,0xdf,0x00,0x0e,0x05,0x7d,0x00,0x60,0x03,0xac,0x00,0x1a,0x04,0xcd,0x00,0xa6,0x04,0x85,0x00,0x98,0x06,0x66,0x00,0xa6,0x06,0x98,0x00,0xa6,0x04,0xba,0x00,0x1e,0x05,0xad,0x00,0xa6,0x04,0x08,0x00,0xa6,0x03,0xb2,0x00,0x5a,0x06,0x81,0x00,0xa6, +0x04,0x06,0x00,0x3e,0x04,0x2f,0x00,0x60,0x04,0x9e,0x00,0x27,0x03,0x10,0x00,0xa6,0x03,0xb2,0x00,0x60,0x03,0x65,0x00,0x68,0x01,0xf0,0xff,0xd3,0x06,0x52,0x00,0x10,0x06,0x74,0x00,0xa6,0x04,0x8a,0x00,0x27,0x03,0xfa,0x00,0xa6,0x03,0xdf,0x00,0x0e,0x04,0x9e,0x00,0xa6,0x03,0xc0,0x00,0xbc,0x03,0x20,0x00,0xa6,0x08,0x00,0x00,0x00, +0x08,0xfa,0x00,0xbc,0x05,0x04,0x00,0x11,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x01,0xf0,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x72,0x00,0x64,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x02,0x6e,0x00,0xab,0x02,0xaa,0x00,0xf2, +0x02,0x25,0x00,0x66,0x02,0x25,0x00,0x64,0x03,0xd3,0x00,0x42,0x03,0xd3,0x00,0x42,0x03,0xd3,0x00,0x6c,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0x25,0x02,0x6e,0x00,0x38,0x02,0x6e,0x00,0x25,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0xab,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0x25,0x02,0x6e,0x00,0x38,0x02,0x6e,0x00,0x25,0x03,0xd3,0x00,0xa9, +0x03,0xd3,0x00,0x6c,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0xff,0xe8,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16, +0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc, +0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0x0e,0x04,0x2f,0x00,0x0c,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x02,0x21,0x00,0x9a,0x01,0xf0,0x00,0x88,0x02,0x21,0x00,0xb2,0x01,0xf0,0x00,0x90,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e, +0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x30,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e, +0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa, +0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x02,0x21,0x00,0xbc, +0x02,0xdb,0x00,0x14,0x01,0xf0,0x00,0x90,0x01,0xf0,0xff,0x3a,0x04,0x1e,0x00,0x29,0x03,0x48,0x00,0x1e,0x07,0x48,0xff,0xea,0x06,0x3e,0x00,0x04,0x04,0xe6,0x00,0xbc,0x04,0x3e,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x03,0xf6,0x00,0xa6,0x05,0xf0,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12, +0x03,0xdf,0x00,0x0e,0x05,0x04,0x00,0x1a,0x03,0xf2,0x00,0x1a,0x05,0x3e,0x00,0xa6,0x04,0x85,0x00,0x98,0x05,0x4a,0x00,0xa6,0x04,0x87,0x00,0xa6,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x03,0x50,0x00,0x7d, +0x03,0x50,0x00,0x7d,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x02,0x25,0x00,0x14,0x02,0x25,0x00,0x14,0x02,0x6e,0x00,0x1e,0x02,0x6e,0x00,0x1e,0x02,0x6e,0x00,0x14,0x02,0x6e,0x00,0x14,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x04,0x96,0x00,0xbc, +0x04,0xb4,0x00,0xa6,0x04,0x96,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x96,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc, +0x04,0xb6,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x03,0xe8,0x00,0xbc,0x02,0x81,0x00,0x35,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0xae,0x00,0xbc, +0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xa0,0x04,0x87,0x00,0x8c,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x02,0x21,0xff,0xcf,0x01,0xf0,0xff,0xb9,0x02,0x21,0xff,0xf2,0x01,0xf0,0xff,0xd4,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0xbc, +0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x95,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xfa,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xfc,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xdf,0x07,0x2f,0x00,0xbc,0x06,0xe4,0x00,0xa6,0x07,0x2f,0x00,0xbc,0x06,0xe4,0x00,0xa6,0x07,0x2f,0x00,0xbc, +0x06,0xe4,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e, +0x04,0xb0,0x00,0x60,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79, +0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x7f,0x00,0xaa, +0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0xf8,0x00,0x12,0x03,0xd5,0x00,0x0e,0x04,0xf8,0x00,0x12,0x03,0xd5,0x00,0x0e,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a, +0x05,0xc8,0x00,0x18,0x04,0xb8,0x00,0x1a,0x03,0xac,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x03,0xac,0x00,0x1a,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x87,0x00,0xa6,0x02,0xb6,0x00,0x2b,0x05,0xc8,0x00,0x18, +0x03,0xdf,0x00,0x0e,0x04,0x12,0x00,0x5a,0x01,0xee,0x00,0x4e,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0xee,0xff,0xbc,0x05,0xee,0xff,0xbe,0x05,0xee,0xff,0xbc, +0x05,0xee,0xff,0xbe,0x05,0xee,0xff,0xbc,0x05,0xee,0xff,0xbc,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x04,0x90,0xff,0xbd,0x04,0x90,0xff,0xbe,0x05,0xb2,0xff,0xbc,0x05,0xb2,0xff,0xc0,0x05,0xb2,0xff,0xbd,0x05,0xb2,0xff,0xbf,0x04,0x9a,0x00,0x82, +0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x06,0x30,0xff,0xbd,0x06,0x30,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xc0,0x07,0x56,0xff,0xbd,0x07,0x56,0xff,0xbf,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbc,0x02,0x22,0x00,0x94, +0x02,0x22,0x00,0x6e,0x02,0x22,0xff,0xdd,0x02,0x22,0xff,0xb3,0x02,0x22,0x00,0x1b,0x02,0x22,0xff,0xea,0x02,0x22,0xff,0xc0,0x02,0x22,0xff,0xc0,0x03,0x06,0xff,0xbd,0x03,0x06,0xff,0xbe,0x03,0xf8,0xff,0xbd,0x03,0xf8,0xff,0xc0,0x04,0x2a,0xff,0xbc,0x04,0x34,0xff,0xbf,0x04,0x2a,0xff,0xbd,0x04,0x2a,0xff,0xbd,0x04,0xb0,0x00,0x60, +0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x06,0x6e,0xff,0xbd,0x06,0x6e,0xff,0xbe,0x07,0xa0,0xff,0xbc,0x07,0xa0,0xff,0xbe,0x07,0xa0,0xff,0xbc,0x07,0xa0,0xff,0xbe,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14, +0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x05,0x56,0xff,0xbe,0x06,0x8c,0xff,0xc0,0x06,0x8c,0xff,0xbf,0x06,0x8c,0xff,0xbc,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xbd, +0x06,0x9c,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xc0,0x07,0xa6,0xff,0xbd,0x07,0xa6,0xff,0xbf,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbc,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x02,0x22,0x00,0x34,0x02,0x22,0x00,0xa6,0x04,0xb0,0x00,0x60, +0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0xee,0xff,0xbd, +0x05,0xee,0xff,0xc1,0x05,0xee,0xff,0xbd,0x05,0xee,0xff,0xbf,0x05,0xee,0xff,0xbd,0x05,0xee,0xff,0xbc,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x06,0x31,0xff,0xbc,0x06,0x30,0xff,0xbe,0x07,0x56,0xff,0xbc, +0x07,0x56,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbc,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xbc,0x06,0x9c,0xff,0xbe,0x07,0xa6,0xff,0xbc, +0x07,0xa6,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbc,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0x29,0xff,0xfb,0x05,0x29,0x00,0x16, +0x05,0x29,0x00,0x16,0x04,0xb0,0x01,0xe4,0x04,0xb0,0x01,0xba,0x04,0xb0,0x01,0xe4,0x04,0xb0,0x01,0x40,0x04,0xb0,0x01,0x33,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x90,0xff,0xac,0x04,0x90,0xff,0xc4,0x06,0x31,0xff,0xac,0x06,0x31,0xff,0xc4,0x05,0xae,0x00,0xbc, +0x04,0xb0,0x01,0x4a,0x04,0xb0,0x01,0x42,0x04,0xb0,0x01,0x33,0x02,0x22,0xff,0xec,0x02,0x22,0xff,0xfa,0x02,0x22,0xff,0xb2,0x02,0x22,0xff,0xb2,0x02,0x22,0xff,0xdf,0x02,0x22,0xff,0xd5,0x02,0x21,0xff,0xfe,0x02,0x21,0x00,0x12,0x02,0xe8,0xff,0xae,0x03,0x07,0xff,0xc6,0x04,0xb0,0x01,0x44,0x04,0xb0,0x01,0x38,0x04,0xb0,0x01,0x33, +0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0xb0,0x00,0xa1,0x04,0xb0,0x00,0xa1,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x12,0x04,0x6c,0x00,0x12,0x05,0x56,0xff,0x96,0x05,0x56,0xff,0xb2,0x05,0x04,0xff,0xbe,0x04,0xb0,0x01,0x02,0x04,0xb0,0x01,0x02,0x04,0xb0,0x01,0xd1, +0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xac,0x06,0x9c,0xff,0xd1,0x06,0xb3,0xff,0xac,0x06,0x9c,0xff,0xd1,0x06,0x0a,0x00,0x64,0x04,0xb0,0x01,0xd1,0x04,0xb0,0x01,0xe2,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x02,0x00,0x00,0xfe,0x58, +0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x9e,0x00,0x00,0xfe,0xdd,0x00,0x00,0xff,0x33,0x00,0x00,0xfe,0xdd,0x00,0x00,0xfe,0xe8,0x00,0x00,0xff,0xcb,0x00,0x00,0xff,0x58,0x00,0x00,0xfe,0xdd,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x8c,0x00,0x00,0xff,0x8c,0x00,0x00,0xff,0x8c,0x00,0x00,0x00,0x2f,0x00,0x00,0xff,0x3e, +0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x48,0x00,0x00,0xff,0x48,0x00,0x00,0xff,0x16,0x00,0x00,0xff,0x52,0x00,0x00,0xff,0xa6,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x03,0x00,0x00,0xff,0x1a,0x00,0x00,0xff,0x1a,0x00,0x00,0xfe,0xdd,0x00,0x00,0xff,0x35,0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x56, +0x00,0x00,0xff,0x5d,0x00,0x00,0xff,0xcb,0x00,0x00,0xfe,0x9c,0x00,0x00,0xfe,0xb1,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xe9,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x05,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x02,0x00,0x00,0xfe,0x58,0x00,0x00,0xfe,0x66, +0x00,0x00,0xfe,0x70,0x00,0x00,0xff,0xa6,0x00,0x00,0xfe,0x9c,0x00,0x00,0xff,0x44,0x00,0x00,0xfe,0xa5,0x00,0x00,0xff,0x30,0x00,0x00,0xff,0x9e,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0x70,0x00,0x00,0x00,0x0a,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xaa,0x00,0x00,0xff,0x64,0x00,0x00,0xfe,0x9c,0x00,0x00,0xfe,0x2a, +0x00,0x00,0xff,0x58,0x00,0x00,0xff,0x4c,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xa8,0x00,0x00,0xff,0x5c,0x00,0x00,0xfd,0x0e,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfd,0xaf,0x04,0xb4,0x00,0x21,0x04,0xe8,0xff,0xac,0x04,0x93,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x9e,0x00,0x33,0x04,0xb4,0x00,0x21, +0x04,0xf6,0x00,0x6a,0x04,0xf6,0x00,0x5e,0x03,0xba,0x00,0x60,0x05,0x9c,0x00,0x1c,0x05,0xee,0xff,0xac,0x04,0x94,0x00,0x5c,0x04,0xb4,0x00,0x60,0x04,0xbc,0x00,0x60,0x04,0x0e,0x00,0x5a,0x04,0x54,0x00,0x70,0x03,0xe8,0xff,0x9a,0x05,0x89,0x00,0x5e,0x04,0xf8,0x00,0x12,0x06,0xfe,0x00,0xa6,0x02,0x4e,0x00,0xb8,0x02,0x3a,0x00,0x29, +0x04,0xa4,0x00,0xbc,0x03,0xfc,0x00,0xa6,0x01,0xf0,0x00,0x14,0x03,0xfc,0xff,0xfe,0x07,0x23,0x00,0xb8,0x05,0xfc,0xff,0x9a,0x04,0x9a,0x00,0x83,0x06,0x08,0x00,0x5e,0x07,0xc0,0x00,0x5e,0x06,0x52,0x00,0x60,0x04,0xcf,0xff,0xac,0x04,0xb4,0x00,0xa6,0x04,0x9c,0x00,0xbc,0x04,0x40,0x00,0x62,0x03,0x65,0x00,0x56,0x04,0x21,0x00,0x2d, +0x02,0x5e,0xff,0x83,0x02,0xb8,0x00,0x2b,0x04,0x33,0xff,0xcd,0x02,0xb8,0x00,0x2b,0x04,0x33,0x00,0x27,0x06,0x0a,0x00,0x62,0x05,0xb2,0x00,0xb8,0x04,0x8e,0x00,0x0f,0x04,0x23,0x00,0x0e,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0xe2,0x00,0x0a,0x04,0xe2,0x00,0x5e,0x03,0x89,0x00,0x1e,0x03,0x46,0x00,0x0a,0x04,0x50,0x00,0x60, +0x04,0x50,0x00,0x74,0x03,0x0a,0x00,0x48,0x03,0x27,0x00,0x1e,0x04,0x5e,0x00,0xa6,0x01,0xea,0x00,0xac,0x03,0x10,0x00,0xac,0x03,0xa6,0x00,0x33,0x02,0x46,0x00,0xb4,0x09,0xe8,0x00,0xbc,0x09,0x1c,0x00,0xbc,0x08,0x33,0x00,0x60,0x06,0xd9,0x00,0xbc,0x05,0xc2,0x00,0xbc,0x04,0x01,0x00,0xa6,0x08,0x94,0x00,0xbc,0x07,0xbe,0x00,0xbc, +0x06,0x77,0x00,0xa6,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x02,0x21,0xff,0xf7,0x01,0xf0,0xff,0xdf,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa, +0x04,0x87,0x00,0x90,0x04,0x2f,0x00,0x52,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x06,0xe2,0x00,0x0a,0x06,0xa0,0x00,0x52,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60, +0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xe2,0x00,0x0a,0x03,0x89,0xff,0xdd,0x01,0xf0,0xff,0x3a,0x09,0xe8,0x00,0xbc,0x09,0x1c,0x00,0xbc,0x08,0x33,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0xfe,0x00,0xbc,0x05,0x83,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52, +0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x04,0x0c,0x00,0x9e,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x02,0x21,0xff,0x86,0x01,0xf0,0xff,0x6e,0x02,0x21,0xff,0xf8,0x01,0xf0,0xff,0xe6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x9a,0x00,0xa0,0x02,0xc8,0x00,0x04, +0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0x9a,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0x08,0x00,0x10,0x03,0x70,0x00,0x1e,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xdf,0x00,0xbc,0x04,0xb8,0x00,0x3e,0x04,0x89,0x00,0x48,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x05,0x29,0x00,0x16, +0x04,0x0a,0x00,0x52,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0xb0,0x01,0x33,0x04,0x0a,0x01,0x08,0x04,0x87,0x01,0x1c,0x04,0x87,0x01,0x1c,0x04,0xb0,0x01,0x23, +0x04,0x0a,0x00,0x90,0x04,0xb6,0x00,0x60,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0xa6,0x03,0xba,0x00,0x5a,0x03,0xba,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x52,0x04,0xe6,0x00,0x50,0x03,0x4e,0x00,0x60,0x03,0x4e,0x00,0x5a,0x04,0x0e,0x00,0x5a,0x04,0x68,0x00,0x60,0x02,0x38,0xff,0x81,0x04,0xb6,0x00,0x60, +0x04,0xb6,0x00,0x60,0x04,0x3c,0x00,0x60,0x03,0xd5,0x00,0x0e,0x03,0xa8,0x00,0x0a,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0xa6,0x02,0x18,0x00,0x0a,0x02,0x3a,0x00,0x94,0x02,0x90,0x00,0x4c,0x02,0x3e,0xff,0xec,0x03,0x02,0xff,0xec,0x01,0xee,0x00,0xa6,0x04,0xd3,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x06,0xe4,0x00,0xa6, +0x06,0xe4,0x00,0xa6,0x04,0x72,0xff,0x96,0x04,0x72,0x00,0xa6,0x04,0xb0,0x00,0xa6,0x04,0xb0,0x00,0x60,0x05,0x96,0x00,0x60,0x05,0xc4,0x00,0x60,0x05,0x1a,0x00,0x60,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0xa6,0x02,0xc8,0x00,0xa6,0x02,0xae,0x00,0x90,0x02,0xae,0x00,0x0c,0x03,0xa2,0x00,0xa6, +0x03,0xa2,0x00,0xa6,0x03,0x2f,0x00,0x68,0x01,0xfa,0xff,0x92,0x02,0x10,0xff,0x9e,0x02,0x4e,0xff,0xa6,0x02,0x44,0xff,0x44,0x02,0xb8,0x00,0x38,0x02,0xb8,0x00,0x2b,0x04,0xcb,0x00,0x21,0x04,0xc2,0x00,0x60,0x04,0x77,0x00,0x90,0x03,0xd5,0x00,0x0c,0x05,0xc8,0x00,0x18,0x03,0xdf,0x00,0x0c,0x03,0x56,0x00,0x0a,0x03,0x9e,0x00,0x21, +0x04,0x18,0x00,0x21,0x03,0x89,0xff,0xdd,0x03,0x89,0xff,0xea,0x02,0xec,0x00,0x1c,0x02,0xec,0x00,0x04,0x02,0xec,0x00,0x00,0x03,0xba,0x00,0x60,0x04,0xf2,0x00,0x60,0x03,0xdf,0x00,0xa6,0x04,0x62,0x00,0x5c,0x04,0x3c,0x00,0x60,0x04,0x87,0x00,0xa6,0x01,0xee,0xff,0x18,0x03,0xfc,0x00,0x04,0x03,0x14,0x00,0xa6,0x04,0xb6,0x00,0x60, +0x02,0xec,0x00,0x1c,0x02,0xec,0x00,0x04,0x07,0x54,0x00,0x60,0x07,0x98,0x00,0x60,0x07,0xcf,0x00,0x60,0x04,0xe8,0x00,0x2b,0x03,0xcf,0x00,0x2b,0x05,0xbe,0x00,0x2b,0x06,0x58,0x00,0x35,0x04,0xa4,0x00,0x98,0x04,0x8e,0x00,0xa6,0x03,0xf4,0x00,0x31,0x03,0xf4,0x00,0x74,0x04,0x62,0x00,0xa6,0x04,0xba,0x00,0x14,0x04,0x85,0x00,0x12, +0x05,0x6c,0xff,0xb1,0x04,0x85,0x00,0x12,0x05,0x1a,0x00,0x60,0x06,0x6a,0x00,0x00,0x04,0x90,0x00,0x00,0x05,0x9e,0x00,0x56,0x04,0xb0,0x00,0x60,0x04,0xa8,0x00,0x5e,0x03,0xa4,0x00,0x60,0x03,0xfc,0x00,0xbc,0x03,0x9c,0x00,0x90,0x04,0xc4,0x00,0x48,0x04,0x04,0x00,0x33,0x04,0xe4,0x00,0x00,0x03,0xf2,0xff,0x7b,0x07,0x23,0x00,0xb8, +0x06,0xe4,0x00,0xa6,0x04,0xd5,0x00,0x33,0x04,0x14,0x00,0x33,0x05,0x16,0x00,0x00,0x04,0x44,0xff,0xec,0x04,0xe2,0x00,0x48,0x03,0xae,0x00,0x3e,0x04,0xc4,0x00,0x14,0x03,0xe2,0x00,0x14,0x05,0x4c,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x85,0x00,0x0a,0x03,0x44,0x00,0x00,0x04,0x90,0x00,0x00,0x04,0xa8,0x00,0xa2,0x03,0xb2,0x00,0x60, +0x01,0xf0,0xff,0x3a,0x06,0x08,0x00,0x5e,0x03,0xbc,0x00,0x60,0x03,0xbc,0x00,0x60,0x06,0xe8,0x00,0x1e,0x05,0x6c,0x00,0x1e,0x05,0x2b,0x00,0x29,0x04,0xa4,0x00,0x29,0x07,0x44,0x00,0xbc,0x05,0xb8,0x00,0xa6,0x05,0x52,0x00,0x16,0x03,0xfe,0x00,0x0c,0x06,0xfc,0x00,0xbc,0x05,0x87,0x00,0xa6,0x05,0xd3,0x00,0x29,0x04,0x85,0x00,0x1e, +0x07,0x70,0x00,0xbc,0x05,0xfe,0x00,0xa6,0x04,0x52,0x00,0x31,0x03,0x99,0x00,0x21,0x06,0x44,0x00,0x66,0x06,0x14,0x00,0x66,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x05,0xc2,0x00,0x12,0x04,0xa0,0x00,0x0e,0x05,0xc2,0x00,0x12,0x04,0xa0,0x00,0x0e,0x0a,0x7f,0x00,0x5e,0x08,0xf2,0x00,0x58,0x06,0x9c,0x00,0x5e,0x05,0x33,0x00,0x60, +0x09,0x08,0x00,0x5e,0x07,0x27,0x00,0x60,0x06,0xe8,0x00,0x1e,0x05,0x6c,0x00,0x1e,0x04,0xb4,0x00,0x5e,0x03,0x81,0x00,0x60,0x04,0x00,0x00,0x2d,0x03,0x27,0x00,0x52,0x03,0x4c,0x00,0x5e,0x00,0x00,0xff,0x90,0x00,0x00,0xff,0x86,0x07,0xe2,0x00,0x21,0x07,0x98,0x00,0x35,0x04,0x9c,0x00,0x29,0x04,0x0c,0x00,0x2d,0x04,0x7c,0x00,0xbc, +0x04,0xb5,0x00,0xa6,0x04,0x8c,0x00,0xbc,0x04,0x04,0x00,0xa6,0x04,0x52,0x00,0x60,0x03,0xa2,0x00,0x58,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x27,0x05,0xae,0x00,0x29,0x04,0xa6,0x00,0x1e,0x06,0xb8,0x00,0xbc,0x05,0x4e,0x00,0xa6,0x08,0x16,0x00,0xbc,0x06,0xb0,0x00,0xa6,0x05,0xc6,0x00,0x5e,0x04,0x74,0x00,0x60,0x04,0xf4,0x00,0x5e, +0x03,0xb2,0x00,0x60,0x04,0x35,0x00,0x29,0x03,0x48,0x00,0x1e,0x06,0xfa,0x00,0x29,0x05,0x79,0x00,0x1e,0x05,0x7f,0x00,0xa6,0x04,0xb4,0x00,0x98,0x06,0xae,0x00,0x29,0x05,0x10,0x00,0x29,0x06,0xae,0x00,0x29,0x05,0x10,0x00,0x29,0x02,0x21,0x00,0xbc,0x06,0xef,0xff,0xea,0x05,0xf8,0x00,0x04,0x04,0xa4,0x00,0xbe,0x04,0x0c,0x00,0xa6, +0x05,0xae,0x00,0xbc,0x04,0x9e,0x00,0xa6,0x05,0x3e,0x00,0xa6,0x04,0x85,0x00,0x98,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x06,0xe2,0x00,0x0a,0x06,0xa8,0x00,0x5a,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52, +0x06,0xef,0xff,0xea,0x05,0xf8,0x00,0x04,0x04,0x52,0x00,0x60,0x03,0x91,0x00,0x50,0x04,0x2f,0x00,0x52,0x03,0x89,0xff,0xdd,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xee,0x00,0x68,0x03,0xb2,0x00,0x5a, +0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x05,0x4a,0x00,0xa6,0x04,0x85,0x00,0x98,0x06,0x44,0x00,0xbc,0x05,0xad,0x00,0xa6,0x04,0x8e,0x00,0x56,0x04,0xb6,0x00,0x60,0x06,0xd3,0x00,0x64,0x06,0xe2,0x00,0x60,0x06,0x70,0x00,0x29,0x05,0xc6,0x00,0x1e, +0x04,0x77,0x00,0x29,0x03,0xcb,0x00,0x1e,0x07,0x3e,0x00,0x18,0x06,0x5e,0x00,0x14,0x07,0xea,0x00,0xbc,0x06,0xcb,0x00,0xa6,0x05,0xb8,0x00,0x5e,0x04,0x3e,0x00,0x60,0x05,0x66,0x00,0x29,0x04,0xc8,0x00,0x1e,0x04,0xb0,0x01,0x33,0x04,0x87,0x01,0x1c,0x04,0x87,0x01,0x1c,0x04,0x0a,0x01,0x08,0x04,0xb0,0x01,0x23,0x02,0xaa,0xff,0x8c, +0x00,0x00,0xff,0x27,0x00,0x00,0xff,0x21,0x00,0x00,0xff,0xcb,0x00,0x00,0xff,0x04,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0x14,0x00,0x00,0xff,0x2b,0x00,0x00,0xfe,0x96,0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x6a,0x00,0x00,0xff,0x10,0x00,0x00,0xff,0x23,0x01,0xd5,0x00,0x72,0x01,0xd5,0x00,0x72,0x04,0xb0,0x01,0xba, +0x02,0xb0,0x00,0x66,0x02,0xb0,0x00,0x66,0x01,0x4e,0xff,0xbe,0x01,0xb2,0x00,0x66,0x01,0xb2,0x00,0x0a,0x01,0xb2,0x00,0x0a,0x02,0x3e,0x00,0x66,0x03,0x2d,0x00,0x14,0x02,0x3a,0x00,0x0a,0x01,0xd5,0x00,0x82,0x03,0x04,0x00,0x8d,0x01,0xc7,0x00,0x6a,0x01,0xc7,0x00,0x6e,0x01,0xc7,0x00,0x6e,0x02,0xaa,0x00,0xfb,0x02,0xaa,0x00,0xfb, +0x01,0xba,0x00,0x14,0x01,0xba,0x00,0x0a,0x04,0xac,0x00,0x72,0x04,0xac,0x00,0x70,0x04,0xac,0x00,0x66,0x04,0xac,0x00,0x66,0x02,0xaa,0x01,0x20,0x02,0x42,0x00,0x87,0x02,0x25,0x00,0x52,0x02,0xaa,0x01,0x20,0x02,0x7b,0x00,0x3e,0x02,0x25,0x00,0x52,0x02,0x42,0x00,0x87,0x02,0x39,0x00,0xb6,0x02,0x39,0x00,0xb6,0x02,0xaa,0x00,0xfb, +0x02,0xaa,0x00,0xfb,0x02,0xaa,0x00,0xa0,0x02,0xaa,0x00,0xa0,0x02,0xaa,0x00,0xa0,0x02,0x7b,0x00,0x3e,0x02,0xaa,0x00,0x79,0x02,0xb0,0x00,0x48,0x02,0x56,0x00,0x0a,0x01,0x4c,0x00,0x66,0x01,0xf0,0x00,0x3e,0x02,0x42,0x00,0x14,0x01,0xba,0x00,0x0a,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96, +0x03,0x10,0x00,0x96,0x02,0xaa,0x00,0x62,0x02,0xaa,0x00,0x62,0x02,0xaa,0x00,0x3c,0x03,0x52,0x00,0x00,0x02,0xaa,0x00,0x6e,0x01,0xf0,0xff,0x3a,0x02,0x18,0x00,0x0a,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43, +0x04,0x57,0x00,0x43,0x03,0x10,0x00,0x43,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a, +0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x03,0x10,0x00,0x1a,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42, +0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f, +0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x03,0x10,0x00,0x26,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42, +0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x03,0x10,0x00,0x26,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23, +0x03,0x10,0x00,0x23,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x03,0x10,0x00,0x4b,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96, +0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x03,0x10,0x00,0x1a,0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24, +0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24,0x03,0x10,0x00,0x24,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x03,0x10,0x00,0x4e,0x04,0x57,0x00,0x96, +0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x54,0x00,0x00,0xff,0x54,0x00,0x00,0xfd,0xa7,0x00,0x00,0xff,0x68,0x05,0x27,0x00,0x60,0x02,0x60,0x00,0xa6,0x05,0x0e,0x00,0xa6,0x02,0xb6,0x00,0x2b,0x04,0xbc,0xff,0xdb,0x04,0xbc,0xff,0xdb,0x02,0xaa,0x00,0x85,0x02,0xaa,0x00,0x85, +0x02,0xaa,0x00,0xc8,0x02,0xaa,0x00,0xc8,0x02,0xaa,0x00,0x87,0x02,0x25,0x00,0x52,0x02,0x98,0x00,0x28,0x02,0x98,0x00,0x28,0x02,0xb2,0x00,0x23,0x02,0x39,0x00,0xad,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0xff,0xf0,0x02,0xaa,0xff,0xf2,0x02,0xaa,0x00,0x3a,0x00,0x00,0xff,0x74, +0x00,0x00,0xff,0xa6,0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x30,0x00,0x00,0xff,0x74,0x00,0x00,0xff,0x74,0x00,0x00,0xfe,0xa1,0x00,0x00,0xff,0xa6,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfc,0xe6,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x03,0xc0,0x00,0x0a,0x05,0x4a,0x00,0x00,0x06,0xa2,0x00,0x52,0x03,0xdf,0x00,0x3e, +0x03,0xb2,0x00,0x60,0x04,0x66,0x00,0xa6,0x04,0x70,0x00,0x3c,0x03,0x56,0x00,0xa6,0x03,0x4c,0x00,0x5a,0x01,0xee,0x00,0x8e,0x02,0x62,0x00,0x14,0x03,0xfa,0x00,0xa6,0x03,0x23,0x00,0x42,0x05,0x9e,0x00,0xa6,0x04,0xa6,0x00,0xa6,0x04,0xb0,0x00,0x60,0x03,0xcd,0x00,0x5a,0x04,0xf2,0x00,0x60,0x04,0xf2,0x00,0x60,0x04,0xf2,0x00,0x4c, +0x07,0x70,0x00,0x52,0x04,0x4a,0x00,0x60,0x04,0xc2,0x00,0x60,0x04,0xc2,0x00,0x60,0x03,0xb2,0x00,0xa6,0x03,0xa2,0x00,0x1e,0x03,0xa2,0x00,0x1e,0x03,0x48,0x00,0x1e,0x04,0x46,0x00,0x90,0x04,0x89,0x00,0x66,0x05,0xbe,0x00,0x3e,0x04,0x89,0x00,0x66,0x03,0xd5,0x00,0x0e,0x05,0xc8,0x00,0x18,0x03,0x9e,0x00,0x21,0x03,0x58,0x00,0x50, +0x03,0x4a,0x00,0x50,0x04,0x3a,0x00,0x14,0x03,0x10,0x00,0xa6,0x03,0xc0,0x00,0x0a,0x04,0x9e,0x00,0xa6,0x03,0xb2,0x00,0xa6,0x04,0xba,0x00,0x60,0x04,0x7d,0x00,0x0a,0x02,0xe2,0x00,0x0a,0x03,0xe6,0xff,0xf6,0x02,0xc6,0x00,0x7b,0x02,0xdb,0x00,0x23,0x03,0x46,0x00,0x7b,0x02,0x72,0x00,0x7b,0x02,0x72,0x00,0x48,0x03,0x46,0x00,0x3e, +0x03,0x64,0x00,0x7b,0x01,0x79,0x00,0x7b,0x01,0xd3,0x00,0x0a,0x02,0xd5,0x00,0x7b,0x02,0x44,0x00,0x7b,0x04,0x31,0x00,0x7b,0x03,0x81,0x00,0x7b,0x03,0x81,0x00,0x7b,0x03,0x68,0x00,0x3e,0x03,0x0c,0x00,0x3e,0x02,0xb6,0x00,0x7b,0x02,0xc2,0x00,0x7b,0x02,0x52,0x00,0x0a,0x03,0x50,0x00,0x74,0x04,0x35,0x00,0x10,0x02,0x85,0x00,0x3e, +0x02,0x85,0x00,0x66,0x02,0xc6,0x00,0x3e,0x03,0xdf,0x00,0x48,0x02,0xc6,0x00,0x66,0x02,0xc6,0x00,0x3e,0x02,0x7d,0x00,0x3e,0x02,0x7d,0x00,0x48,0x02,0x1c,0x00,0x3e,0x02,0x1c,0x00,0x42,0x02,0xc6,0x00,0x3e,0x01,0x4e,0x00,0x58,0x02,0x6a,0x00,0x66,0x03,0xfa,0x00,0x66,0x02,0xb0,0x00,0x66,0x02,0xbc,0x00,0x3e,0x02,0x29,0x00,0x3e, +0x02,0xbc,0x00,0x3e,0x02,0xbc,0x00,0x3e,0x02,0xbe,0x00,0x66,0x01,0x9c,0x00,0x0a,0x02,0xa6,0x00,0x5c,0x02,0x9c,0x00,0x3e,0x03,0xfa,0x00,0x60,0x02,0x40,0x00,0x0a,0x02,0x8e,0x00,0x14,0x02,0xac,0x00,0x60,0x02,0x56,0xff,0xec,0x02,0xbc,0x00,0x3e,0x03,0x44,0x00,0x3e,0x02,0x62,0xff,0xf6,0x01,0x4e,0x00,0x58,0x01,0xb2,0x00,0x66, +0x02,0xa6,0x00,0x5c,0x02,0x40,0x00,0x0a,0x02,0xac,0x00,0x60,0x02,0x56,0xff,0xec,0x02,0xc6,0x00,0x66,0x03,0x44,0x00,0x3e,0x02,0x62,0xff,0xf6,0x04,0xa6,0x00,0xfc,0x01,0x4e,0x00,0x58,0x02,0xc6,0x00,0x66,0x04,0x57,0x00,0x42,0x07,0x04,0x00,0x8f,0x04,0xfe,0x00,0x74,0x04,0x50,0x00,0x76,0x04,0x50,0x00,0x76,0x06,0xe4,0x00,0xa6, +0x05,0x2a,0x00,0x23,0x06,0xda,0x00,0xbc,0x05,0xf4,0x00,0x14,0x04,0x37,0x00,0x64,0x04,0xb6,0x00,0x60,0x04,0x00,0x00,0x2a,0x03,0x96,0x00,0x29,0x09,0x00,0x00,0x2c,0x03,0xa4,0x00,0x30,0x04,0xb5,0x00,0x26,0x07,0x1f,0x00,0xa2,0x07,0x7a,0x00,0x60,0x07,0x7a,0x00,0x60,0x05,0x06,0x00,0x16,0x05,0x29,0x00,0x16,0x04,0xf4,0x00,0x16, +0x03,0xb2,0x00,0x21,0x03,0xc4,0x00,0x12,0x04,0x31,0xff,0xef,0x03,0x65,0x00,0x68,0x03,0x9e,0x00,0x21,0x04,0x16,0x00,0x30,0x01,0x9c,0x00,0x6c,0x00,0x00,0xff,0x2b,0x00,0x00,0xfe,0xbd,0x00,0x00,0xff,0x60,0x00,0x00,0xfc,0xe6,0x04,0xb0,0x00,0x21,0x04,0xf4,0x00,0x68,0x04,0xf4,0x00,0x5e,0x04,0xf4,0x00,0x68,0x03,0xc6,0x00,0xbc, +0x03,0x10,0x00,0xa6,0x04,0xb4,0xff,0xbb,0x04,0xb6,0x00,0x60,0x02,0x81,0xff,0xf8,0x06,0xe4,0xff,0xc0,0x04,0x87,0xff,0xc0,0x04,0xb4,0xff,0xbb,0x02,0xc8,0xff,0xbb,0x02,0xae,0xff,0xa5,0x03,0xb5,0x00,0x27,0x02,0xb6,0xff,0xef,0x03,0x9e,0x00,0x21,0x04,0xb6,0x00,0xa6,0x03,0xb1,0x00,0x7a,0x04,0x9f,0x00,0x60,0x07,0x3d,0x00,0x16, +0x05,0x2e,0x00,0x16,0x02,0x90,0x00,0x4a,0x02,0x22,0xff,0xfb,0x04,0xb4,0x00,0x22,0x04,0x46,0x00,0x22,0x04,0xc2,0x00,0x14,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0x60,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x03,0xfa,0x00,0xa6,0x01,0xf0,0x00,0x5c,0x06,0xe4,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xb4,0x00,0xa6,0x02,0xc8,0x00,0x5c, +0x03,0x65,0x00,0x68,0x03,0x76,0xff,0x92,0x03,0xd5,0x00,0x0e,0x03,0xac,0x00,0x1a,0x03,0x9e,0x00,0x21,0x04,0x12,0x00,0x5a,0x04,0xb6,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x60,0x03,0x81,0x00,0x52,0x03,0x91,0x00,0x50,0x05,0xe0,0x00,0x52,0x01,0xf0,0x00,0x90,0x03,0xba,0x00,0x5a,0x01,0xfa,0xff,0x92,0x04,0x87,0x00,0x90, +0x03,0x89,0xff,0xdd,0x02,0xc6,0x00,0x66,0x02,0x22,0x00,0x3e,0x02,0x26,0x00,0x3d,0x02,0xbd,0x00,0x3e,0x02,0x1c,0x00,0x42,0x01,0x77,0x00,0x0a,0x01,0x4e,0xff,0xdd,0x02,0xc6,0x00,0x3e,0x02,0xa6,0x00,0x5c,0x01,0x4e,0x00,0x0f,0x01,0x74,0x00,0x66,0x01,0x62,0x00,0x11,0x01,0x62,0x00,0x11,0x01,0x4e,0xff,0x87,0x01,0x74,0x00,0x66, +0x01,0x4c,0x00,0x31,0x01,0xcb,0x00,0x66,0x03,0xfa,0x00,0x66,0x03,0xfa,0x00,0x60,0x02,0xb0,0xff,0xbc,0x02,0xb0,0x00,0x66,0x02,0xd0,0x00,0x66,0x02,0xb0,0x00,0x3e,0x02,0xef,0x00,0x3e,0x01,0xd8,0x00,0x42,0x01,0x4e,0xff,0xc9,0x01,0x9c,0x00,0x0a,0x02,0xa6,0x00,0x05,0x02,0xbd,0x00,0x3e,0x02,0xa2,0x00,0x5c,0x02,0x93,0x00,0x5c, +0x02,0x40,0x00,0x0b,0x02,0x17,0x00,0x1a,0x02,0x17,0x00,0x1a,0x02,0x5b,0x00,0x1a,0x02,0x12,0xff,0xfb,0x02,0xbd,0x00,0x3e,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xdd,0x01,0xbc,0x00,0x70,0x02,0x85,0x00,0x3e,0x02,0x7d,0x00,0x3e,0x02,0xbc,0x00,0x3e,0x02,0x23,0x00,0x12,0x02,0x7d,0x00,0x48, +0x04,0x51,0x00,0x54,0x04,0x51,0x00,0x0c,0x04,0x51,0x00,0x69,0x04,0x51,0x00,0x56,0x02,0xaa,0x00,0x42,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x29,0x03,0xb5,0x00,0x27,0x02,0x7b,0x00,0x3e,0x02,0x23,0x00,0x12,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a, +0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x02,0x22,0xff,0xf9,0x02,0x22,0x00,0x02,0x02,0x22,0xff,0xfc,0x02,0x22,0xff,0xe5,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14, +0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4, +0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x04,0x51,0x00,0xbc,0x02,0xee,0x00,0x48,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x01,0x60,0x00,0x5b, +0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x48,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x02,0xee,0x00,0x48, +0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x06,0x46,0x00,0xbc,0x05,0x0d,0x00,0xa6, +0x05,0xaa,0x00,0x10,0x04,0x9f,0x00,0x10,0x05,0xf8,0x00,0xbc,0x05,0x06,0x00,0xa6,0x07,0x78,0x00,0xbc,0x06,0x06,0x00,0xa6,0x04,0x50,0x00,0x5a,0x03,0x04,0x00,0x6e,0x04,0x1d,0x00,0x8d,0x05,0x79,0x00,0xe8,0x04,0x47,0x00,0x5e,0x06,0x8e,0x00,0xbc,0x05,0x9e,0x00,0xa6,0x00,0x00,0xff,0xdc,0x00,0x00,0xff,0x25,0x00,0x00,0xff,0xdc, +0x00,0x00,0xfe,0x51,0x02,0x01,0x00,0xab,0x02,0x01,0x00,0x49,0x02,0x01,0xff,0xa2,0x02,0x01,0x00,0x49,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba, +0x08,0x04,0xff,0xba,0x03,0x56,0x00,0xb9,0x02,0x01,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xad,0x00,0x2b,0x03,0x57,0x00,0x62,0x04,0x02,0x00,0x4f,0x04,0x02,0xff,0xef,0x04,0xad,0xff,0xf4,0x04,0xad,0x00,0x49,0x04,0x02,0x00,0x22,0x08,0x04,0xff,0xba,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba, +0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x65,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x05,0x2a,0x00,0xa6,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xae,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x53,0x05,0x58,0x00,0x67,0x04,0x02,0x00,0xa1,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x9a, +0x04,0x02,0x00,0xa1,0x06,0xae,0x00,0x9a,0x02,0x01,0x00,0x6f,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x04,0xad,0x00,0x49,0x04,0xad,0x00,0x49,0x04,0xad,0xff,0xa2,0x06,0xae,0x00,0x82,0x02,0x01,0x00,0x00,0x04,0xad,0xff,0xa2,0x02,0x01,0x00,0x6f, +0x04,0x02,0x00,0xab,0x03,0x57,0x00,0x5a,0x02,0x01,0xff,0xa2,0x02,0x01,0x00,0x49,0x04,0x02,0x00,0x00,0x02,0x01,0x00,0x49,0x06,0x03,0x00,0x82,0x02,0x01,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0x02,0x00,0x52, +0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x0a,0xb1,0x00,0x9b,0x0a,0xb1,0x00,0x9b,0x06,0xae,0x00,0x19,0x06,0xae,0x00,0x19,0x04,0x02,0x00,0x65,0x04,0x02,0x00,0x65,0x01,0x56,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x06,0xae,0x00,0xab,0x05,0x58,0x00,0x9b, +0x04,0xad,0x00,0x39,0x05,0x58,0x00,0x9b,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0x00,0x06,0x03,0x00,0x9a,0x06,0x03,0x00,0x9a,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0x33,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xd4,0x00,0x00,0x00,0x45,0x04,0xad,0x00,0x52,0x02,0x01,0x00,0x52, +0x05,0x2a,0x00,0xa6,0x00,0x00,0xff,0xa2,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x02,0xac,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x03,0x57,0x00,0x00, +0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0xa1,0x04,0x02,0x00,0xab,0x03,0x56,0x00,0xb9,0x02,0x01,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xad,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xae,0x00,0x72,0x04,0x02,0x00,0x2f, +0x04,0xad,0xff,0xf4,0x04,0xad,0x00,0x49,0x04,0x02,0x00,0x22,0x05,0x58,0x00,0x9b,0x05,0x2a,0x00,0xa6,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x05,0x58,0x00,0x9b,0x04,0x02,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xab,0x07,0x59,0x00,0x72, +0x02,0xac,0x00,0x72,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x02,0x01,0x00,0x2d,0x04,0xae,0x00,0x7c,0x03,0x1d,0x00,0x42,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x08,0x04,0x00,0xa1,0x04,0x02,0x00,0x57,0x00,0x00,0x00,0xc4,0x00,0x00,0xff,0x17,0x00,0x00,0x00,0x10, +0x05,0x2a,0x00,0xa6,0x00,0x00,0xff,0xc2,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x06,0x03,0x00,0x9b,0x05,0x2a,0x00,0xa6,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x02,0x01,0xff,0x97,0x02,0x01,0xff,0x97,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2, +0x03,0x57,0x00,0xab,0x03,0x57,0x00,0xab,0x04,0x02,0x00,0x00,0x04,0x02,0xff,0xe7,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, +0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e, +0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0x02,0x00,0x00, +0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65, +0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b, +0x06,0x03,0x00,0x9b,0x08,0xaf,0x00,0x19,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab, +0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b, +0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x04,0x58,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x06,0xae,0x00,0x32, +0x07,0x58,0x00,0x1e,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x00,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x00,0x00,0xff,0xa8,0x00,0x00,0xff,0xb7,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x1d,0x00,0x00,0xff,0x2b,0x08,0xfc,0x00,0x2d,0x08,0xad,0x01,0x46, +0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x16,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0xc9,0x02,0x01,0x00,0x4d,0x03,0x57,0x00,0x21,0x00,0x00,0xff,0x82,0x00,0x00,0x00,0x32,0x04,0xcd,0x00,0x64,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x16,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba, +0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x03,0x57,0x00,0x5a,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xc2,0x04,0xad,0xff,0xc2,0x04,0xad,0x00,0x34,0x04,0xad,0x00,0x34,0x04,0xad,0x00,0x3a,0x04,0xad,0x00,0x3a,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52, +0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x65,0x04,0x02,0x00,0x52,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x02,0xfe,0x00,0x00,0x04,0xad,0xff,0x97,0x04,0xad,0xff,0x97,0x04,0xc1,0x00,0x66,0x09,0xd0,0x00,0x73,0x06,0xa8,0x00,0x73, +0x04,0x40,0x00,0x49,0x0c,0x2d,0x00,0x73,0x08,0xaf,0x00,0x49,0x02,0xac,0x00,0x46,0x04,0xad,0x00,0x32,0x00,0x00,0xff,0xc9,0x00,0x00,0xff,0xe9,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x88,0x00,0x00,0xff,0xc4,0x00,0x00,0x00,0xc4,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x32,0x00,0x00,0xff,0xc6,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52, +0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x06,0x03,0x00,0x53,0x05,0x58,0x00,0x67,0x05,0x58,0xff,0xba,0x04,0x02,0xff,0xba,0x00,0x00,0xfe,0x93,0x00,0x00,0xfe,0xa9,0x00,0x00,0xfe,0x91,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x0a,0x05,0x00,0xa1,0x0c,0x06,0x00,0x9b,0x00,0x00,0xff,0xd4, +0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0x6c,0x00,0x00,0xff,0xd4,0x04,0xad,0x00,0x35,0x04,0x02,0x00,0x65,0x00,0x00,0xff,0xe7,0x00,0x00,0xff,0xdf,0x00,0x00,0xff,0xdf,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x05,0x07,0x59,0x00,0xab,0x03,0x56,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, +0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba, +0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba, +0x04,0xad,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba, +0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00, +0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x05,0x2a,0x00,0xa6,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x00,0x00,0xff,0x1a,0x04,0x00,0xff,0x1a,0x04,0x00,0x01,0x9f,0x04,0x00,0x01,0xb3,0x02,0xf4,0x00,0x14,0x04,0x96,0x00,0x1c,0x05,0x7f,0x00,0x1e,0x05,0x07,0x00,0x18,0x04,0x0c,0x00,0x8b,0x04,0x2f,0x00,0x60,0x02,0xdb,0x00,0x14, +0x01,0xf0,0xff,0x3a,0x06,0x01,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xc9,0x00,0x1c,0x02,0xc8,0x00,0x1c,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x03,0xcd,0x00,0x5a,0x03,0xb2,0x00,0x60,0x03,0xcd,0x00,0x5a,0x01,0xf0,0x00,0xa6,0x04,0x1e,0x00,0x29,0x03,0x48,0x00,0x1e,0x04,0xf4,0x00,0x1a,0x03,0xe0,0x00,0x1a,0x04,0xb8,0x00,0x1a, +0x03,0xac,0x00,0x1a,0x04,0x54,0x00,0x70,0x03,0x81,0x00,0x52,0x05,0x62,0x00,0x10,0x04,0x37,0x00,0x10,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xdb,0x05,0xed,0x00,0x35,0x03,0x9c,0x00,0x48, +0x03,0xcd,0x00,0x5a,0x03,0xc4,0x00,0x1c,0x02,0x4a,0x00,0x14,0x04,0x19,0x00,0x27,0x04,0x7b,0x00,0x1c,0x04,0xc9,0x00,0xbc,0x04,0x12,0x00,0x5a,0x02,0xb6,0xff,0xb5,0x05,0xf0,0x00,0xbc,0x04,0xb3,0x00,0xa6,0x05,0x1c,0x00,0xbc,0x04,0x4a,0x00,0xa6,0x04,0xf5,0x00,0x21,0x03,0xfb,0x00,0x21,0x04,0x8d,0x00,0x4b,0x04,0x1f,0x00,0xbc, +0x03,0x2b,0x00,0xa6,0x05,0x98,0x00,0x60,0x02,0xf7,0x00,0xaf,0x03,0x4f,0x00,0xaf,0x03,0x5a,0x00,0xaf,0x03,0xde,0x00,0x75,0x04,0xc9,0x00,0x75,0x04,0xc9,0x00,0x75,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x55,0x00,0x00,0x04,0x50,0x00,0x00, +0x01,0xbc,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00, +0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xa1,0x07,0x6c,0x00,0x79,0x03,0x64,0x00,0x3f,0x06,0x08,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0xf5,0x00,0xb0,0x00,0x00,0xfc,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x60,0x00,0x4a,0x07,0x60,0x00,0x8d,0x06,0xe7,0x00,0x96,0x03,0xc7,0x00,0x96,0x06,0xe7,0x00,0xe7,0x03,0xc7,0x00,0x96,0x06,0xe5,0x00,0x96,0x05,0x28,0x00,0x33,0x05,0x78,0x00,0xe6,0x05,0x9d,0x00,0xe6,0x05,0x92,0x00,0xe6,0x06,0x1e,0x00,0xe6, +0x06,0xe4,0x00,0xa5,0x08,0x00,0x00,0xa5,0x06,0xe4,0x00,0x50,0x06,0xe4,0x00,0xa5,0x06,0xe4,0x00,0x50,0x06,0xe4,0x00,0xa5,0x06,0xe4,0x00,0x8c,0x06,0xe4,0x02,0x0d,0x06,0xe4,0x00,0xa5,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0xcd,0x05,0xe8,0x00,0x5e,0x04,0xa0,0x00,0x0e,0x08,0x7e,0x00,0x1a, +0x06,0x9d,0x00,0x18,0x03,0xc7,0x00,0x96,0x03,0xc7,0x00,0x96,0x02,0x46,0x00,0xb4,0x02,0x46,0x00,0xb4,0x02,0x46,0x00,0xb4,0x02,0xf8,0x00,0x63,0x01,0xbc,0x00,0x70,0x04,0x82,0x00,0xe8,0x01,0xd7,0x00,0x94,0x01,0xd7,0x00,0xa3,0x06,0xae,0x03,0x9b,0x05,0x10,0x02,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xa5,0x00,0x00,0xff,0xcd,0x03,0x33,0x00,0x4b,0x00,0x00,0xfe,0xd2,0x01,0x9d,0x00,0x94,0x00,0x00,0x02,0x00,0x00,0x00,0xfd,0x3c,0x01,0xbc,0x00,0x70, +0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x9c,0x05,0x18,0x00,0xa5,0x04,0x90,0x00,0x50,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x02,0x25,0x00,0xbe,0x02,0xb2,0x00,0x31,0x05,0x65,0x00,0xbe,0x05,0x72,0x00,0xa0,0x02,0x25,0x00,0xbe,0x04,0x78,0x00,0x2f,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x8d,0x00,0xbe, +0x05,0x65,0x00,0xa4,0x02,0x25,0x00,0xbe,0x03,0x32,0x00,0x67,0x05,0x68,0x00,0x96,0x04,0xd6,0x00,0x59,0x04,0xe4,0x00,0x6c,0x05,0x0c,0x00,0x96,0x04,0x85,0x00,0x1e,0x04,0xaf,0x00,0x4b,0x05,0x4f,0x00,0x42,0x04,0x79,0x00,0x2f,0x06,0x47,0x00,0x6e,0x05,0xcf,0x00,0x34,0x04,0x2e,0x00,0xbe,0x04,0x2e,0x00,0xbe,0x04,0x2e,0x00,0xbe, +0x01,0xd5,0x00,0x6e,0x03,0x04,0x00,0x6e,0x04,0x78,0x00,0x2f,0x04,0x78,0x00,0x2f,0x04,0x68,0xff,0x51,0x04,0x68,0xff,0x51,0x04,0x53,0x00,0xbe,0x04,0xd6,0x00,0x59,0x05,0x18,0x00,0xa5,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x8d,0x00,0xbe,0x04,0x79,0x00,0x2f,0x05,0xcf,0x00,0x34, +0x04,0x6a,0x00,0x5f,0x06,0x47,0x00,0x6e,0x06,0x47,0x00,0x61,0x06,0x47,0x00,0x6e,0x06,0x47,0x00,0x61,0x05,0x18,0x00,0xa5,0x05,0x18,0x00,0xa5,0x05,0x18,0x00,0xa5,0x04,0x90,0x00,0x50,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x02,0x6b,0xff,0xfb,0x02,0xda,0xff,0xfa,0x05,0x72,0x00,0xa0,0x02,0x6b,0xff,0xfb, +0x04,0x78,0x00,0x2f,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x65,0x00,0xa4,0x03,0x32,0x00,0x67,0x05,0x68,0x00,0x96,0x04,0xe4,0x00,0x6c,0x05,0x0c,0x00,0x96,0x04,0xaf,0x00,0x4b,0x05,0x4f,0x00,0x42,0x04,0x79,0x00,0x2f,0x06,0x47,0x00,0x6e,0x05,0xcf,0x00,0x34,0x02,0x25,0x00,0xb5,0x04,0x90,0x00,0x50,0x04,0x5c,0x00,0x4e, +0x05,0x0c,0x00,0x96,0x05,0x38,0x00,0x59,0x09,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x18,0x00,0xa5,0x04,0x68,0x00,0x59,0x05,0x38,0x00,0x59,0x05,0x52,0x00,0x59,0x05,0x38,0x00,0x59,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x15,0x00,0x00,0xff,0x73,0x00,0x00,0xff,0xa1,0x00,0x00,0xff,0x49,0x00,0x00,0xff,0x45,0x00,0x00,0xff,0x61, +0x00,0x00,0xfe,0xab,0x00,0x00,0xfe,0x26,0x00,0x00,0x00,0x64,0x00,0x00,0xff,0x42,0x00,0x00,0xff,0x45,0x00,0x00,0x00,0x64,0x00,0x00,0xfe,0xe1,0x00,0x00,0xfe,0x06,0x00,0x00,0xff,0x17,0x00,0x00,0xff,0x5b,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x6a,0x00,0x00,0xff,0x4b,0x00,0x00,0xff,0x45,0x00,0x00,0xfe,0xe1,0x00,0x00,0xff,0x68, +0x00,0x00,0xff,0x45,0x00,0x00,0xff,0x17,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x4b,0x00,0x00,0xff,0x6a,0x00,0x00,0x00,0x64,0x00,0x00,0xfd,0x87,0x00,0x00,0xff,0x29,0x00,0x00,0xff,0xa4,0x03,0x32,0x00,0xab,0x02,0x25,0x00,0xb6,0x00,0x00,0xfe,0xb2,0x06,0x08,0x00,0x5e,0x05,0x22,0x00,0x33,0x05,0x55,0x00,0x64,0x05,0xa6,0x00,0x5a, +0x04,0x68,0x00,0x64,0x05,0x55,0x00,0x64,0x05,0xf6,0x00,0x32,0x06,0x19,0x00,0x5e,0x03,0xc4,0x00,0x20,0x05,0x08,0x00,0x8c,0x05,0xf6,0x00,0x32,0x05,0xe2,0x00,0x5c,0x05,0x4a,0x00,0xc9,0x06,0x08,0x00,0x5e,0x06,0x7f,0x00,0x32,0x06,0x36,0x00,0x32,0x05,0x55,0x00,0x64,0x04,0x68,0x00,0xb0,0x04,0x7b,0x00,0xbc,0x06,0x08,0x00,0x5e, +0x05,0xa6,0x00,0x5a,0x04,0x94,0x00,0x32,0x05,0x7f,0x00,0xaa,0x05,0x6b,0x00,0xa6,0x05,0x4a,0x00,0xa6,0x05,0x6b,0x00,0xc9,0x05,0x7d,0x00,0x5e,0x05,0xe2,0x00,0x5c,0x04,0x9c,0x00,0xbc,0x05,0x19,0x00,0x64,0x05,0x6b,0x00,0xc9,0x05,0x3b,0x00,0x32,0x06,0x31,0x00,0x32,0x05,0x0e,0x00,0xc9,0x04,0xf4,0x00,0x5e,0x05,0x22,0x00,0x33, +0x05,0x5a,0x00,0x96,0x06,0x8c,0x00,0x52,0x03,0xf8,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x07,0x00,0x00,0x60,0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x60,0x06,0x2c,0x00,0x3c,0x07,0x21,0x00,0x60,0x04,0xe1,0x00,0x60,0x04,0x51,0x00,0x60,0x08,0x66,0x00,0x60,0x04,0x88,0x00,0x60,0x04,0x88,0x00,0x60,0x06,0x0e,0x00,0x60, +0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x3f,0x06,0x0e,0x00,0x60,0x04,0x7d,0x00,0x9a,0x06,0x08,0x00,0x5e,0x06,0x82,0x00,0x60,0x06,0xff,0x00,0x40,0x04,0x51,0x00,0x60,0x06,0x2e,0x00,0x60,0x04,0x51,0x00,0x60,0x05,0x3b,0x00,0x32,0x04,0x58,0x00,0xa6,0x04,0xeb,0x00,0x60,0x04,0x88,0x00,0x60,0x05,0x0d,0x00,0x32,0x04,0x50,0x00,0x50, +0x04,0xd6,0x00,0xae,0x06,0x27,0x00,0x21,0x04,0x53,0x00,0x60,0x04,0xf5,0x00,0x60,0x05,0x4f,0x00,0x32,0x04,0x51,0x00,0x5e,0x04,0x51,0x00,0x60,0x04,0xc4,0x00,0x52,0x07,0xa8,0x00,0x60,0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x5f,0x04,0xb0,0x00,0x60,0x04,0xb1,0x00,0x40,0x03,0x64,0x00,0x70,0x02,0xa8,0x00,0x32,0x04,0x75,0x00,0x28, +0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x28,0x04,0x48,0x00,0x30,0x04,0x75,0x00,0x28,0x07,0x10,0x00,0x28,0x04,0x75,0xff,0x3f,0x07,0x13,0x00,0x5b,0x03,0xf4,0x00,0x28,0x04,0x75,0x00,0x59,0x07,0x17,0x00,0x31,0x05,0x51,0x00,0x30,0x04,0x75,0x00,0x31,0x07,0x13,0x00,0x5b,0x05,0xf2,0x00,0x28,0x05,0xf2,0x00,0x28,0x07,0x0c,0x00,0x59, +0x04,0x9c,0x00,0x59,0x04,0x75,0x00,0x42,0x07,0x13,0x00,0x5b,0x07,0x13,0x00,0x5b,0x04,0x72,0x00,0x71,0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x5b,0x04,0x75,0x00,0x2f,0x04,0x75,0x00,0x42,0x07,0x0c,0x00,0x59,0x07,0x10,0x00,0x3f,0x04,0xb0,0x00,0x21,0x04,0x75,0x00,0x42,0x04,0x89,0xff,0x8a,0x07,0x17,0x00,0x31, +0x04,0xc5,0x00,0x2f,0x04,0x56,0x00,0x35,0x04,0x75,0x00,0x46,0x04,0x75,0x00,0x28,0x07,0x0c,0x00,0x59,0x06,0x3a,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x05,0x86,0x00,0x5e,0x05,0x94,0x00,0x78,0x05,0x7f,0x00,0xaa,0x05,0xa8,0x00,0x64,0x04,0xff,0x00,0xbc,0x05,0x7f,0x00,0xaa,0x06,0x3f,0x00,0xaa,0x05,0x86,0x00,0x5e,0x05,0x33,0x00,0xaa, +0x04,0x58,0x00,0xbc,0x06,0x53,0x00,0xbc,0x05,0x62,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x04,0x90,0x00,0x21,0x05,0x54,0x00,0x5e,0x05,0x94,0x00,0x78,0x05,0xf6,0x00,0x62,0x05,0xc6,0x00,0xaa,0x04,0xab,0x00,0x5e,0x05,0x94,0xff,0xf6,0x05,0x54,0x00,0x5e,0x05,0xcf,0x00,0xaa,0x05,0x54,0x00,0x5e,0x06,0x33,0x00,0x82,0x05,0x9a,0x00,0x64, +0x05,0xc6,0x00,0xaa,0x05,0xcf,0x00,0xaa,0x05,0x7a,0x00,0x5e,0x05,0x19,0x00,0x64,0x05,0x9d,0x00,0xaa,0x05,0x6f,0x00,0x90,0x05,0xc6,0x00,0xaa,0x06,0x56,0x00,0x5e,0x05,0x3f,0x00,0x14,0x06,0x08,0x00,0x5e,0x05,0xcb,0x00,0x86,0x00,0xca,0x00,0x00,0x00,0xe1,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x92,0x00,0x00,0x01,0x35,0x00,0x00, +0x02,0x29,0x00,0x00,0x02,0xce,0x00,0x00,0x06,0xe4,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0xf2,0x00,0x60,0x04,0xc3,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xec,0x00,0x60,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0xa6,0x05,0x2b,0x00,0xa6,0x04,0xca,0x00,0x5e,0x04,0x87,0x00,0xa6,0x02,0x76,0x00,0xa6,0x06,0xb1,0x00,0xa6,0x04,0xb0,0x00,0x60, +0x04,0x87,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0x57,0x00,0x60,0x04,0xd4,0x00,0xa6,0x04,0x18,0x00,0x60,0x04,0xa5,0x00,0x90,0x02,0x26,0xff,0x70,0x04,0xb0,0xff,0xf6,0x04,0x26,0x00,0x60,0x04,0x87,0x00,0xa6,0x03,0x4c,0x00,0x60,0x06,0xe4,0x00,0x90,0x04,0x64,0x00,0x60,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0x90,0x04,0xbe,0x00,0x90, +0x06,0xa6,0x00,0x8f,0x04,0x87,0x00,0xa6,0x04,0xb6,0x00,0x60,0x03,0x26,0x00,0xa6,0x06,0xa6,0x00,0x8f,0x04,0xb4,0x00,0x00,0x04,0xb0,0x00,0x60,0x05,0x7f,0x00,0x60,0x05,0x72,0x00,0x90,0x01,0xbc,0x00,0x70,0x02,0x42,0x00,0x2a,0x09,0x0e,0x00,0x90,0x08,0xf8,0x00,0x90,0x08,0xf8,0x00,0x90,0x09,0x0e,0x00,0x90,0x0b,0x67,0x00,0x90, +0x04,0x50,0x00,0x83,0x04,0x50,0x00,0x37,0x01,0xf0,0x00,0x90,0x04,0x50,0x00,0x5c,0x03,0x1e,0x00,0x79,0x04,0x50,0x00,0x99,0x04,0x50,0x00,0x7b,0x04,0x7d,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x1e,0x00,0x45,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x5c,0x04,0x50,0x00,0xe8,0x04,0x50,0x00,0x99, +0x04,0x50,0x00,0x7b,0x04,0x50,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x50,0x00,0x60,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x56,0x03,0x1e,0x00,0x53,0x04,0x50,0x00,0x6d,0x04,0x50,0x00,0x7b,0x04,0x7d,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x1e,0x00,0x45,0x04,0x50,0x00,0x5a, +0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0xa8,0x04,0x50,0x00,0x60,0x04,0x50,0x00,0x83,0x04,0x50,0x00,0x0e,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6e,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0x64,0x04,0x50,0x00,0x5e,0x02,0xee,0x00,0x48,0x02,0xee,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xee,0x00,0x2f, +0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x04,0x04,0x00,0x00,0x03,0xec,0x00,0xb0,0x04,0x0f,0x00,0x58,0x04,0xac,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x5b,0x00,0xb0,0x04,0x94,0x00,0x58,0x04,0xe9,0x00,0xb0,0x02,0x04,0x00,0xb0,0x02,0x81,0x00,0x11,0x03,0xec,0x00,0xb0, +0x03,0x4c,0x00,0xb0,0x06,0x12,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x04,0xed,0x00,0x58,0x03,0xe0,0x00,0xb0,0x04,0xed,0x00,0x58,0x03,0xf8,0x00,0xb0,0x03,0x5d,0x00,0x68,0x03,0x85,0x00,0x19,0x04,0xc2,0x00,0x9c,0x04,0x15,0x00,0x00,0x06,0x69,0x00,0x05,0x04,0x02,0x00,0x1e,0x03,0xbb,0x00,0x14,0x03,0xdb,0x00,0x29,0x05,0x9f,0xff,0xf8, +0x06,0x31,0x00,0x58,0x03,0x4c,0x00,0x38,0x05,0x01,0x00,0x41,0x03,0xe0,0x00,0xb0,0x04,0xac,0x00,0x2d,0x04,0x33,0x00,0xa6,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x0f,0x00,0x58,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0, +0x03,0x70,0x00,0xb0,0x02,0x04,0xff,0xfc,0x02,0x04,0x00,0x87,0x02,0x04,0xff,0xe9,0x02,0x04,0xff,0xe0,0x05,0x2a,0x00,0xb0,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x03,0xbb,0x00,0x14, +0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x0f,0x00,0x58,0x04,0x0f,0x00,0x58,0x04,0x94,0x00,0x58,0x04,0xac,0x00,0xb0,0x04,0xac,0x00,0x2d,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x04,0x94,0x00,0x58,0x04,0x94,0x00,0x58,0x04,0x0f,0x00,0x58, +0x04,0xe9,0x00,0xb0,0x04,0xe9,0x00,0x2d,0x02,0x04,0xff,0xc3,0x02,0x04,0x00,0x04,0x02,0x04,0xff,0xf1,0x02,0x04,0x00,0x3f,0x02,0x04,0x00,0xa0,0x04,0x85,0x00,0xb0,0x02,0x81,0x00,0x11,0x03,0xec,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x05,0x2a,0x00,0xb0, +0x05,0x2a,0x00,0xb0,0x05,0x38,0x00,0xb0,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x03,0xf8,0x00,0xb0,0x03,0xf8,0x00,0xb0,0x03,0xf8,0x00,0xb0,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19, +0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x03,0xbb,0x00,0x14,0x03,0xbb,0x00,0x14,0x03,0xbb,0x00,0x14,0x03,0xdb,0x00,0x29,0x03,0xdb,0x00,0x29,0x03,0xdb,0x00,0x29, +0x04,0x04,0x00,0x00,0x05,0x9f,0xff,0xf8,0x05,0x01,0x00,0x41,0x04,0x04,0x00,0x00,0x03,0xec,0x00,0xb0,0x03,0x22,0x00,0x9c,0x04,0x4a,0x00,0x2a,0x03,0x70,0x00,0xb0,0x03,0xdb,0x00,0x29,0x04,0xe9,0x00,0xb0,0x04,0xed,0x00,0x58,0x02,0x04,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x15,0x00,0x00,0x06,0x12,0x00,0xb0,0x05,0x2a,0x00,0xb0, +0x03,0x95,0x00,0x49,0x04,0xed,0x00,0x58,0x04,0xe7,0x00,0xb0,0x03,0xe0,0x00,0xb0,0x03,0xac,0x00,0x30,0x03,0x85,0x00,0x19,0x03,0xbb,0x00,0x14,0x05,0x02,0x00,0x50,0x04,0x02,0x00,0x1e,0x05,0x40,0x00,0x7d,0x05,0x10,0x00,0x58,0x04,0x04,0x00,0x00,0x03,0x70,0x00,0xb0,0x04,0xe9,0x00,0xb0,0x02,0x04,0x00,0x87,0x04,0xed,0x00,0x58, +0x03,0xbb,0x00,0x14,0x05,0x10,0x00,0x58,0x02,0x04,0xff,0xe0,0x03,0xbb,0x00,0x14,0x03,0x70,0x00,0xb0,0x04,0x8d,0x00,0x22,0x03,0x36,0x00,0xb0,0x04,0x19,0x00,0x58,0x03,0x5d,0x00,0x68,0x02,0x04,0x00,0xb0,0x02,0x04,0xff,0xe0,0x02,0x81,0x00,0x11,0x06,0x80,0x00,0x0d,0x06,0x94,0x00,0xb0,0x04,0xe1,0x00,0x22,0x03,0xec,0x00,0xb0, +0x03,0xf4,0x00,0x36,0x04,0xdf,0x00,0xb0,0x04,0x04,0x00,0x00,0x03,0xe7,0x00,0xb0,0x03,0xec,0x00,0xb0,0x03,0x36,0x00,0xb0,0x04,0xaf,0x00,0x12,0x03,0x70,0x00,0xb0,0x05,0xe7,0x00,0x00,0x03,0x88,0x00,0x50,0x05,0x2a,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x8a,0x00,0x0d,0x06,0x12,0x00,0xb0,0x04,0xe9,0x00,0xb0, +0x04,0xed,0x00,0x58,0x04,0xe7,0x00,0xb0,0x03,0xe0,0x00,0xb0,0x04,0x0f,0x00,0x58,0x03,0x85,0x00,0x19,0x03,0xf4,0x00,0x36,0x05,0x02,0x00,0x50,0x04,0x02,0x00,0x1e,0x05,0x11,0x00,0xb0,0x04,0x60,0x00,0x7d,0x06,0x73,0x00,0xb0,0x06,0xa4,0x00,0xb0,0x04,0x89,0x00,0x22,0x05,0xa1,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x1e,0x00,0x54, +0x06,0xe0,0x00,0xb0,0x03,0xe9,0x00,0x12,0x03,0x31,0x00,0xb0,0x04,0xa5,0x00,0x35,0x04,0xa7,0x00,0x35,0x04,0xfa,0x00,0x35,0x07,0x1e,0x00,0x35,0x07,0x1e,0x00,0x35,0x05,0x45,0x00,0x57,0x04,0x0f,0x00,0x58,0x04,0x94,0x00,0x58,0x03,0x5d,0x00,0x68,0x04,0x96,0x00,0xbc,0x04,0x7b,0x00,0xbc,0x04,0x7b,0x00,0x52,0x05,0x9c,0x00,0xbc, +0x04,0x31,0x00,0x29,0x04,0x31,0x00,0x27,0x05,0x7d,0x00,0x5e,0x04,0xa4,0x00,0xbc,0x04,0xa4,0x00,0x02,0x02,0xdb,0x00,0x14,0x04,0xf4,0x00,0x5e,0x04,0xf4,0x00,0x68,0x04,0x90,0x00,0x21,0x03,0xe8,0x00,0xbc,0x03,0xe8,0x00,0x54,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x03,0xc4,0x00,0xbc,0x04,0x40,0x00,0x79,0x04,0xc9,0x00,0xbc, +0x04,0xc9,0x00,0x09,0x04,0xf8,0x00,0x12,0x04,0xf8,0x00,0x12,0x05,0xae,0x00,0xbc,0x05,0x7d,0x00,0x91,0x02,0xdb,0x00,0xb0,0x07,0x79,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x04,0x6c,0x00,0x12,0x04,0x96,0x00,0x67,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x17,0x04,0x0c,0x00,0xbc,0x04,0x0c,0x00,0x58,0x02,0x21,0x00,0xbc,0x06,0x08,0x00,0x5e, +0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x03,0xc4,0x00,0x20,0x05,0x9c,0x00,0x5e,0x01,0xbc,0x00,0x70,0x01,0xbc,0x00,0x27,0x03,0x78,0x00,0x70,0x03,0x78,0x00,0x70,0x01,0xbc,0x00,0x27,0x01,0xbc,0x00,0x70,0x04,0xef,0x00,0x90,0x03,0x33,0x00,0x90,0x02,0x21,0x00,0x30,0x06,0x08,0x00,0x5e,0x05,0xa6,0x00,0x77,0x02,0x46,0x00,0xb4, +0x01,0xbc,0x00,0x5c,0x01,0xbc,0x00,0x5e,0x03,0x96,0x00,0x83,0x03,0x04,0x00,0x6f,0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x6f,0x01,0xd5,0x00,0x74,0x01,0xd5,0x00,0x62,0x03,0x04,0x00,0x68,0x05,0x65,0x00,0x60,0x03,0xc4,0x00,0xbc,0x02,0x75,0x00,0xa6,0x04,0xd9,0xff,0xe4,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xa4,0x00,0xbc, +0x03,0xfa,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x03,0x85,0x00,0x2b,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x01,0xbc,0x00,0x5e,0x01,0xd5,0x00,0x74,0x03,0x1f,0x01,0x3d,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x58,0xff,0xba,0x05,0x58,0xff,0xba,0x05,0x58,0xff,0xba, +0x07,0x59,0x00,0x1e,0x06,0x03,0x00,0x7c,0x07,0x59,0x00,0x7c,0x02,0x01,0x00,0x76,0x00,0x00,0xff,0xc8,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x37,0x02,0x01,0x00,0x70,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba, +0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb0,0x00,0x9b, +0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba, +0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x06,0xae,0x00,0xab, +0x04,0x02,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0xff,0xba,0x06,0x03,0x00,0x53,0x04,0x02,0xff,0xba,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd8,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd4, +0x00,0x00,0xff,0x6c,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xf8,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x01,0x00,0x4f,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0x01,0x00,0x49,0x04,0x02,0x00,0x00,0x04,0x02,0xff,0xe7, +0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, +0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52, +0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x08,0x04,0x00,0xab, +0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x08,0xaf,0x00,0x19,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab, +0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab, +0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b, +0x02,0xac,0xff,0xba,0x05,0x58,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x57,0x04,0x02,0x00,0x57,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba, +0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x00,0x00,0x00,0x81,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, +0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x08,0x04,0x00,0xab, +0x08,0x04,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba, +0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e, +0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x02,0xac,0x00,0x17,0x02,0xac,0x00,0x17,0x02,0xac,0x00,0x16,0x02,0xac,0x00,0x16,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a, +0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x17,0x04,0xad,0x00,0x17,0x04,0xad,0x00,0x16,0x04,0xad,0x00,0x16,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b, +0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0xab,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0x01,0x00,0xa4,0x02,0x01,0x00,0x03,0x02,0x01,0x00,0xa4,0x02,0x01,0x00,0x03,0x02,0x01,0x00,0x03,0x02,0x01,0xff,0x62, +0x02,0x01,0x00,0x03,0x02,0x01,0xff,0xc6,0x00,0x00,0xff,0x97,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x89,0x02,0x01,0x00,0x60,0x02,0xac,0x00,0x1e,0x02,0x01,0x00,0x3c,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x30,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xa2,0x02,0xac,0x00,0x49,0x02,0xac,0x00,0x72,0x02,0xac,0x00,0x72, +0x02,0xac,0xff,0x97,0x02,0xac,0xff,0xc2,0x02,0xac,0x00,0x34,0x02,0xac,0x00,0x3a,0x03,0x57,0x00,0x17,0x03,0x57,0x00,0x16,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8, +0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8, +0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6, +0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39, +0x03,0x57,0x00,0x39,0x05,0x58,0x00,0x82,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x06,0x03,0x00,0x1e,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x04,0xad,0x00,0x72, +0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x02,0x01,0xff,0xf1,0x02,0x01,0xff,0xea,0x04,0x02,0x00,0xa1,0x03,0x57,0x00,0x39,0x04,0xa9,0x00,0x64,0x05,0x19,0x00,0x65, +0x04,0x90,0x00,0x21,0x04,0x51,0x00,0x5f,0x04,0x70,0x00,0x0a,0x04,0xb0,0x00,0x60,0x04,0x51,0xff,0xe6,0x04,0x55,0x00,0x2d,0x04,0x50,0x00,0x72,0x04,0x50,0x00,0xa1,0x04,0x50,0x00,0xc2,0x04,0x50,0x01,0x1f,0x04,0x50,0x00,0xf7,0x04,0x50,0x01,0x08,0x04,0x50,0x00,0xe1,0x04,0x50,0x00,0xa1,0x04,0x50,0x00,0xa9,0x04,0x50,0x00,0xbc, +0x04,0x26,0x00,0x76,0x03,0xb0,0x00,0x8a,0x04,0x61,0x00,0x6d,0x04,0x32,0x00,0x76,0x04,0xb4,0x00,0x6c,0x04,0xe2,0x00,0x97,0x04,0xe7,0x00,0x90,0x05,0x40,0x00,0x76,0x04,0xa3,0x00,0x80,0x04,0x87,0x00,0x76,0x05,0x35,0x00,0x96,0x04,0x1e,0x00,0x64,0x05,0x59,0x00,0x78,0x06,0x0d,0x00,0x82,0x05,0x1d,0x00,0x8c,0x05,0xfa,0x00,0x96, +0x06,0xa1,0x00,0x64,0x05,0x18,0x00,0x87,0x06,0x1c,0x00,0x78,0x05,0x81,0x00,0x96,0x04,0x84,0x00,0x98,0x04,0x84,0x01,0x00,0x04,0x84,0x00,0x5d,0x04,0x84,0x00,0x6b,0x04,0x84,0x00,0x94,0x04,0x84,0x00,0x59,0x04,0x84,0x00,0x7d,0x04,0x84,0x00,0xbf,0x04,0x84,0x00,0x2b,0x04,0x84,0x00,0x2b,0x04,0x3e,0x00,0x76,0x03,0xb2,0x00,0x2d, +0x04,0x52,0x00,0x7c,0x04,0xd7,0x00,0x0f,0x04,0xce,0x00,0x0a,0x05,0x44,0x00,0x16,0x04,0x94,0x00,0x41,0x05,0x2c,0x00,0x36,0x04,0x99,0x00,0x80,0x04,0xc2,0x00,0x7d,0x04,0xd1,0x00,0x82,0x04,0x15,0x00,0x82,0x04,0x15,0x00,0x96,0x06,0x00,0x00,0x82,0x05,0x6f,0x00,0x64,0x05,0x87,0x00,0x64,0x05,0x64,0x00,0x64,0x05,0x6f,0x00,0x64, +0x04,0xbe,0x00,0xb4,0x04,0xa6,0x00,0x82,0x04,0xa5,0x00,0x77,0x05,0xe4,0x00,0x50,0x06,0x2c,0x00,0x50,0x06,0x03,0x00,0x8c,0x06,0x1b,0x00,0x50,0x07,0x62,0x00,0x8c,0x07,0x62,0x00,0x50,0x05,0x9b,0x00,0x50,0x07,0x62,0x00,0x32,0x07,0x62,0x00,0x50,0x05,0xde,0x00,0x72,0x06,0xfc,0x00,0x74,0x06,0xc4,0x00,0x60,0x04,0x74,0x00,0x58, +0x06,0x24,0x00,0x73,0x06,0xcc,0x00,0x5d,0x06,0x1a,0x00,0x73,0x04,0xc0,0x00,0x70,0x06,0xce,0x00,0x74,0x05,0xe8,0x00,0x73,0x05,0x87,0x00,0x82,0x05,0x9d,0x00,0x82,0x04,0xd6,0x00,0x64,0x05,0x25,0x00,0x82,0x05,0xf8,0x00,0x6e,0x06,0x5a,0x00,0x82,0x05,0x93,0x00,0x64,0x04,0xee,0x00,0x6e,0x05,0xa7,0x00,0x82,0x04,0xa8,0x00,0x82, +0x04,0x46,0x00,0x5d,0x07,0x60,0x00,0x00,0x07,0x58,0x00,0x64,0x07,0x5d,0x00,0x64,0x06,0x96,0x00,0x61,0x07,0x62,0x00,0x61,0x07,0x62,0x00,0x64,0x05,0x78,0x00,0x46,0x07,0x62,0x00,0x64,0x07,0x62,0x00,0x61,0x05,0xad,0x00,0x82,0x06,0x25,0x00,0x82,0x06,0x44,0x00,0xb4,0x05,0xf5,0x00,0x82,0x05,0xcd,0x00,0x82,0x05,0xcd,0x00,0x82, +0x05,0x29,0x00,0x50,0x07,0x0c,0x00,0x82,0x06,0x1e,0x00,0x82,0x06,0x9d,0x00,0x82,0x05,0xb7,0x00,0x78,0x05,0xb3,0x00,0x78,0x04,0xa2,0x00,0x78,0x05,0xe9,0x00,0x50,0x05,0x89,0x00,0x78,0x05,0x89,0x00,0x78,0x06,0xd0,0x00,0x78,0x06,0x10,0x00,0x64,0x05,0xcb,0x00,0x70,0x07,0x2d,0x00,0x78,0x04,0x56,0x00,0x78,0x04,0x10,0x00,0x64, +0x04,0x78,0x00,0x78,0x04,0x4b,0x00,0x78,0x04,0xe5,0x00,0x78,0x04,0xff,0x00,0x78,0x05,0x94,0x00,0x78,0x05,0xde,0x00,0x64,0x04,0xa0,0x00,0x78,0x04,0x8e,0x00,0x78,0x04,0x84,0x00,0x80,0x04,0x5d,0x00,0x7f,0x04,0x8b,0x00,0x3a,0x04,0x5d,0x00,0x7f,0x04,0x5d,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x9f,0x00,0x80, +0x04,0x84,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x11,0x00,0x66,0x04,0x3c,0x00,0x80,0x04,0xb8,0x00,0x66,0x04,0xf5,0x00,0x66,0x04,0xd3,0x00,0x80,0x04,0xd3,0x00,0x80,0x03,0xaa,0x00,0x67,0x04,0x84,0x00,0x80,0x04,0x84,0x00,0x80,0x04,0xb4,0x00,0xa0,0x04,0xd9,0x00,0x8c,0x06,0x1f,0x00,0x64,0x06,0xbe,0x00,0xa0, +0x05,0x3c,0x00,0xa0,0x05,0x3c,0x00,0xa0,0x05,0x01,0x00,0x7b,0x06,0x25,0x00,0xa0,0x05,0x1a,0x00,0xa0,0x05,0x78,0x00,0xe9,0x04,0x1a,0x00,0x84,0x03,0xcc,0x00,0x69,0x04,0xb5,0x00,0x84,0x04,0x80,0x00,0x84,0x03,0xc9,0x00,0x84,0x03,0xf3,0x00,0x84,0x04,0x61,0x00,0x84,0x04,0x6c,0x00,0x84,0x03,0xdb,0x00,0x70,0x03,0xb7,0x00,0x84, +0x05,0x02,0x00,0x60,0x03,0xa4,0x00,0x50,0x04,0x5c,0x00,0x2d,0x03,0xf6,0x00,0x50,0x04,0x62,0x00,0x60,0x06,0x3f,0x00,0x60,0x04,0x81,0x00,0x77,0x06,0x9e,0x00,0x60,0x04,0x4a,0x00,0x0a,0x04,0x85,0x00,0x60,0x04,0x8f,0x00,0x60,0x05,0xf2,0x00,0x82,0x02,0x81,0x00,0xf0,0x06,0x51,0x00,0x64,0x05,0x7c,0x00,0x64,0x05,0xbe,0x00,0xb4, +0x05,0x48,0x00,0xb4,0x04,0x7c,0x00,0x64,0x06,0x01,0x00,0x00,0x04,0xd0,0x00,0x82,0x06,0x41,0x00,0x64,0x04,0xd5,0x00,0x67,0x04,0xd5,0x00,0x84,0x04,0xd5,0x00,0x67,0x04,0xd5,0x00,0x3f,0x04,0xd5,0x00,0x6b,0x04,0xd5,0x00,0x5c,0x04,0x9f,0x00,0xd6,0x04,0xd5,0x00,0x59,0x04,0xd5,0x00,0x7b,0x04,0xd5,0x00,0x8b,0x02,0x21,0x00,0x30, +0x02,0x21,0xff,0xd0,0x02,0x21,0xff,0xf9,0x02,0x21,0xff,0x86,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0xff,0xfd,0x03,0x89,0xff,0xbe,0x03,0x9f,0xff,0xbd,0x03,0x98,0xff,0xc1,0x03,0x9f,0xff,0xbe,0x03,0xb9,0xff,0xc0,0x03,0x9f,0xff,0xbe,0x02,0x79,0xff,0xbf,0x02,0x7b,0xff,0xbe,0x02,0x21,0xff,0xfe,0x02,0x21,0xff,0xf2, +0x02,0x21,0xff,0xf2,0x02,0x21,0xff,0xf2,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x04,0xfc,0x00,0x30,0x02,0x21,0xff,0xd1,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x1c,0x02,0x7b,0xff,0xc7,0x02,0x7b,0xff,0xc7,0x02,0x21,0xff,0xf3,0x02,0x21,0xff,0xf8,0x02,0x21,0x00,0x12,0x02,0x5d,0xff,0xaf, +0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x14,0x02,0x21,0xff,0xff,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x03,0xe8,0x00,0x93,0x05,0xee,0x00,0x48,0x05,0xcd,0x00,0x6c,0x03,0xe8,0x00,0x60,0x03,0x40,0x00,0x77,0x03,0xe8,0x00,0x3e,0x04,0x2f,0x00,0x96,0x04,0x78,0x00,0x2e,0x03,0xe8,0x00,0x5c, +0x06,0xbf,0x00,0x73,0x06,0x92,0x00,0x73,0x06,0xe7,0x00,0x75,0x03,0x8a,0x00,0x19,0x08,0x0c,0x00,0xaa,0x03,0xe8,0x00,0x60,0x06,0xaf,0x00,0x73,0x06,0xaf,0x00,0x75,0x06,0xbb,0x00,0x82,0x06,0x77,0x00,0x93,0x04,0x86,0x00,0x69,0x03,0xe8,0x00,0x6b,0x03,0xe8,0x00,0x6b,0x06,0x3e,0x00,0x96,0x04,0xae,0x00,0x20,0x06,0x35,0x00,0xaa, +0x05,0x65,0x00,0x12,0x04,0x45,0x00,0x57,0x03,0xa0,0x00,0x26,0x03,0x40,0x00,0x25,0x08,0x27,0x00,0x28,0x03,0x4c,0x00,0x2b,0x04,0x44,0x00,0x22,0x03,0xe9,0x00,0x4c,0x03,0xe9,0x00,0x0b,0x03,0xe9,0x00,0x5f,0x03,0xe9,0x00,0x4e,0x03,0xe9,0x00,0xaa,0x0a,0xe5,0x00,0x8c,0x06,0xaf,0x00,0x6e,0x06,0xaf,0x00,0x80,0x03,0x6e,0x00,0xb2, +0x02,0x03,0x00,0xb2,0x03,0xa5,0x00,0x53,0x01,0xe5,0x00,0x2b,0x03,0xb3,0x00,0xa6,0x01,0xe5,0x00,0x7a,0x01,0xe5,0x00,0x7a,0x01,0xe5,0x00,0x2b,0x03,0xd7,0x00,0x00,0x04,0xae,0x00,0x6a,0x04,0xae,0x00,0x68,0x04,0x5f,0x00,0x00,0x03,0x04,0x00,0x6f,0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x6f,0x01,0xd5,0x00,0x74,0x01,0xd5,0x00,0x62, +0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x74,0x03,0x4c,0x00,0x90,0x06,0xe4,0x00,0x8d,0x01,0xbc,0x00,0x70,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x04,0xad,0x00,0xab,0x04,0xad,0x00,0xab,0x06,0xae,0x00,0xa1,0x06,0xae,0x00,0xa1,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00, +0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x09,0x5a,0x00,0x9a,0x09,0x5a,0x00,0x9a,0x05,0x58,0xff,0xba,0x09,0x5a,0x00,0x9a,0x09,0x5a,0x00,0x9a,0x05,0x58,0xff,0xba,0x00,0x00,0xff,0x0e,0x00,0x00,0xff,0x36,0x00,0x00,0xff,0x72,0x00,0x00,0xfe,0xfc,0x00,0x00,0xfe,0x84,0x00,0x00,0xff,0x46, +0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x20,0x00,0x00,0xfe,0xec,0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x04,0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x15,0x00,0x00,0xff,0x40,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x23,0x00,0x00,0xff,0x06,0x00,0x00,0xff,0x2f,0x00,0x00,0xfe,0xba,0x00,0x00,0xfe,0x93,0x00,0x00,0xff,0x04,0x00,0x00,0xfe,0x94, +0x00,0x00,0xff,0x36,0x00,0x00,0xff,0x21,0x00,0x00,0xff,0x27,0x00,0x00,0xff,0x18,0x00,0x00,0xfe,0xf7,0x00,0x00,0xfe,0xa2,0x00,0x00,0xfe,0xc2,0x00,0x00,0xff,0x07,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xb2,0x04,0xa9,0x00,0x21,0x03,0xc1,0x00,0x21,0x04,0xa9,0x00,0x21,0x03,0xc1,0x00,0x21,0x04,0x40,0x00,0x77,0x03,0x65,0x00,0x70, +0x02,0xd9,0x00,0xbc,0x02,0xc9,0x00,0xa6,0x05,0x7f,0x00,0xaa,0x04,0x61,0x00,0x7d,0x05,0xbb,0x00,0x48,0x03,0x72,0x00,0x19,0x09,0x08,0x00,0x5e,0x07,0x26,0x00,0x60,0x04,0xbe,0xff,0xf3,0x04,0x6d,0x00,0x32,0x07,0x5f,0x00,0x33,0x06,0x55,0x00,0x1c,0x06,0xc1,0x00,0xbb,0x05,0xfe,0x00,0xa6,0x08,0x26,0x00,0x60,0x06,0x81,0x00,0x63, +0x07,0x67,0x00,0xbc,0x06,0x30,0x00,0xa6,0x05,0x29,0x00,0x16,0x03,0xd1,0x00,0x0a,0x05,0xd3,0x00,0x29,0x04,0xb1,0x00,0x1e,0x07,0x67,0x00,0xbc,0x05,0xda,0x00,0xa6,0x06,0x03,0x00,0x1e,0x04,0xdf,0x00,0x05,0x05,0xf0,0x00,0x3e,0x04,0xcd,0x00,0x3e,0x06,0xe8,0x00,0x0f,0x05,0x51,0x00,0x12,0x07,0x05,0x00,0x10,0x05,0x57,0x00,0x10, +0x08,0xd3,0x00,0xbc,0x06,0xbe,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x09,0xb6,0x00,0x5e,0x07,0x1e,0x00,0x60,0x06,0x55,0x00,0x7e,0x00,0x00,0xfe,0xc2,0x07,0xe2,0x00,0x6f,0x07,0xe2,0x01,0x13,0x07,0xe2,0x00,0x26,0x03,0xd1,0x00,0x7d,0x00,0x00,0xfe,0x9c,0x00,0x00,0xff,0x33, +0x04,0xa6,0x00,0xfc,0x04,0x01,0x01,0x33,0x05,0x98,0x00,0x0f,0x04,0x76,0x00,0x12,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x67,0x08,0x9c,0x00,0x60,0x07,0x3b,0x00,0x50,0x07,0x8f,0x00,0xa6,0x06,0xe1,0x00,0x98,0x05,0xbe,0x00,0x0f,0x04,0xa4,0x00,0x12,0x05,0x96,0x00,0x29,0x04,0xb0,0x00,0x1e,0x04,0x31,0x00,0x29,0x03,0x48,0x00,0x1e, +0x05,0xeb,0x00,0xae,0x04,0xc7,0x00,0x8f,0x04,0x31,0x00,0x29,0x03,0x48,0x00,0x1e,0x06,0x8e,0x00,0x29,0x05,0x54,0x00,0x1e,0x05,0x4a,0x00,0xa6,0x04,0x87,0x00,0xa6,0x07,0xd1,0x00,0xbc,0x06,0x8f,0x00,0xa6,0x04,0x50,0x00,0x2b,0x04,0x99,0x00,0x32,0x05,0xdc,0x00,0xe7,0x05,0xdc,0x00,0xe7,0x06,0x78,0x00,0x00,0x03,0x96,0x00,0x83, +0x01,0x9a,0x00,0x00,0x03,0xac,0x00,0xac,0x05,0x7a,0x00,0x5e,0x03,0x73,0x00,0x30,0x08,0x00,0x00,0xe6,0x08,0x00,0x00,0xe6,0x01,0xf0,0x00,0x37,0x00,0x00,0xfd,0x33,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00, +0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x03,0x33,0x00,0x90,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x04,0x50,0x00,0x53,0x04,0xb0,0x00,0xbb,0x04,0xb0,0x01,0x01, +0x04,0xb0,0x00,0xaf,0x04,0xb0,0x00,0xc2,0x04,0xb0,0x00,0x6a,0x04,0xb0,0x00,0x64,0x04,0xb0,0x00,0x39,0x04,0xb0,0x00,0x2e,0x04,0xb0,0x00,0x79,0x04,0xb0,0x00,0x81,0x06,0x04,0x00,0xfd,0x06,0x04,0x01,0x70,0x06,0x04,0x00,0xb9,0x06,0x04,0x00,0x7d,0x06,0x04,0x00,0xff,0x06,0x04,0x00,0x8c,0x06,0x04,0x00,0x1f,0x06,0x04,0x00,0xf5, +0x06,0x04,0x00,0x3a,0x06,0x04,0x00,0xaf,0x04,0xc4,0x00,0xb7,0x04,0xc4,0x01,0x2a,0x04,0xc4,0x00,0x7d,0x04,0xc4,0x00,0x8b,0x04,0xc4,0x00,0xb4,0x04,0xc4,0x00,0x79,0x04,0xc4,0x00,0x9d,0x04,0xc4,0x00,0xdf,0x04,0xc4,0x00,0x4b,0x04,0xc4,0x00,0x4b,0x05,0x14,0x00,0xe1,0x05,0x14,0x00,0xdc,0x05,0x14,0x00,0xa6,0x05,0x14,0x00,0x68, +0x05,0x14,0x00,0x2d,0x05,0x14,0x00,0x0c,0x05,0x14,0x00,0x68,0x05,0x14,0x00,0x4d,0x05,0x14,0x00,0xab,0x05,0x14,0x00,0x7d,0x05,0x28,0x00,0xad,0x05,0x28,0x01,0x15,0x05,0x28,0x01,0x15,0x05,0x28,0x00,0x2f,0x05,0x28,0x00,0x40,0x05,0x28,0x00,0x34,0x05,0x28,0x00,0x55,0x05,0x28,0x00,0x4f,0x05,0x28,0x00,0xc1,0x05,0x28,0x00,0xdc, +0x07,0x44,0x01,0xbd,0x07,0x44,0x01,0x00,0x07,0x44,0x00,0xd2,0x07,0x44,0x00,0xff,0x07,0x44,0x00,0xf8,0x07,0x44,0x00,0x5c,0x07,0x44,0x00,0x27,0x07,0x44,0x01,0x1a,0x07,0x44,0x00,0x48,0x07,0x44,0x00,0x23,0x06,0x68,0x00,0xbf,0x06,0x68,0x00,0x34,0x06,0x68,0x00,0x45,0x06,0x68,0x01,0x78,0x06,0x68,0x00,0x9e,0x06,0x68,0x00,0x36, +0x06,0x68,0x00,0x99,0x06,0x68,0x01,0x4a,0x06,0x68,0x00,0x28,0x06,0x68,0x00,0x99,0x05,0xdc,0x00,0xac,0x05,0xdc,0x00,0xa1,0x05,0xdc,0x00,0xf6,0x05,0xdc,0x00,0xdd,0x05,0xdc,0x00,0x60,0x05,0xdc,0x00,0x43,0x05,0xdc,0x00,0x7e,0x05,0xdc,0x00,0xd6,0x05,0xdc,0x00,0x8d,0x05,0xdc,0x01,0x0d,0x07,0x1c,0x01,0xc8,0x07,0x1c,0x00,0x24, +0x07,0x1c,0x00,0x37,0x07,0x1c,0x00,0x32,0x07,0x1c,0x00,0x7e,0x07,0x1c,0x00,0x37,0x07,0x1c,0x00,0x46,0x07,0x1c,0x01,0x25,0x07,0x1c,0x00,0x4b,0x07,0x1c,0x00,0x3d,0x06,0x68,0x00,0xdf,0x06,0x68,0x00,0xa3,0x06,0x68,0x00,0xc6,0x06,0x68,0x00,0xbb,0x06,0x68,0x00,0xcf,0x06,0x68,0x00,0xcf,0x06,0x68,0x01,0x08,0x06,0x68,0x00,0x35, +0x06,0x68,0x00,0xa7,0x06,0x68,0x00,0x67,0x06,0x68,0x00,0xd0,0x06,0x68,0x00,0xd2,0x06,0x68,0x01,0x47,0x06,0x68,0x00,0xa3,0x06,0x68,0x00,0xdd,0x06,0x68,0x00,0xdd,0x06,0x68,0x00,0x44,0x06,0x68,0x00,0x9a,0x06,0x68,0x00,0xb9,0x06,0x68,0x00,0x15,0x05,0x78,0x01,0x09,0x05,0x78,0x01,0x22,0x05,0x78,0x00,0xf8,0x05,0x78,0x01,0x0e, +0x05,0x78,0x00,0xb7,0x05,0x78,0x00,0x78,0x05,0x78,0x00,0x6c,0x05,0x78,0x00,0x3b,0x05,0x78,0x00,0xcb,0x05,0x78,0x00,0xe3,0x04,0x10,0x00,0x47,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x30,0x04,0x10,0x00,0x47,0x04,0x10,0x00,0x44, +0x04,0x88,0x00,0x80,0x04,0x88,0x00,0xa3,0x04,0x88,0x00,0x9b,0x04,0x88,0x00,0x5d,0x04,0x88,0x00,0x31,0x04,0x88,0x00,0x57,0x04,0x88,0x00,0x57,0x04,0x88,0x00,0xd7,0x04,0x88,0x00,0x83,0x04,0x88,0x00,0x83,0x06,0x04,0x01,0x48,0x06,0x04,0x01,0x21,0x06,0x04,0x00,0x74,0x06,0x04,0x00,0x43,0x06,0x04,0x00,0xf0,0x06,0x04,0x00,0xd6, +0x06,0x04,0x01,0x0f,0x06,0x04,0x00,0x8f,0x06,0x04,0x01,0x0b,0x06,0x04,0x01,0x20,0x04,0x4c,0x00,0x9d,0x04,0x4c,0x00,0xb6,0x04,0x4c,0x00,0x36,0x04,0x4c,0x00,0x5a,0x04,0x4c,0x00,0xc5,0x04,0x4c,0x00,0xab,0x04,0x4c,0x00,0x79,0x04,0x4c,0x00,0x74,0x04,0x4c,0x00,0xa8,0x04,0x4c,0x00,0xce,0x05,0xc8,0x00,0xc3,0x05,0xc8,0x01,0x6a, +0x05,0xc8,0x01,0x08,0x05,0xc8,0x01,0x20,0x05,0xc8,0x01,0x21,0x05,0xc8,0x00,0x3c,0x05,0xc8,0x01,0x05,0x05,0xc8,0x00,0x50,0x05,0xc8,0x00,0xc9,0x05,0xc8,0x01,0x01,0x05,0xc8,0x00,0xd6,0x06,0x04,0x00,0x8b,0x06,0x04,0x02,0xb1,0x06,0x04,0x00,0x1f,0x06,0x04,0x00,0xb7,0x06,0x04,0x00,0xd7,0x06,0x04,0x00,0xf9,0x06,0x04,0x01,0x37, +0x06,0x04,0x00,0x33,0x06,0x04,0x01,0x1c,0x06,0x04,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xe6,0x00,0x00,0xff,0x9c,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x05,0xcf,0x00,0x34,0x02,0x39,0x00,0x6d,0x01,0xac,0x00,0x5a,0x02,0x39,0x00,0x5b, +0x01,0xac,0x00,0x4e,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xf1,0x00,0x29,0x05,0x05,0x00,0x2b,0x04,0x6b,0x00,0x66,0x03,0xc5,0x00,0x26,0x04,0x45,0x00,0x51,0x03,0xda,0x00,0x21,0x04,0xba,0x00,0x51,0x04,0x90,0x00,0x21,0x03,0x5b,0x00,0xb0,0x03,0x5d,0x00,0x68,0x09,0x08,0x00,0x16,0x06,0x8b,0x00,0x5a,0x09,0x39,0x00,0x16, +0x07,0x16,0x00,0x5a,0x07,0xe4,0x00,0x16,0x06,0xc3,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x04,0xf4,0x00,0x68,0x03,0xb2,0x00,0x50,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x27,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0x12, +0x03,0xfa,0x00,0x27,0x04,0x5b,0x00,0xbc,0x02,0x82,0x00,0xa6,0x03,0xc4,0x00,0x12,0x01,0xf0,0x00,0x1e,0x06,0x08,0x00,0x00,0x04,0xb0,0x00,0x00,0x06,0xdf,0x00,0x5e,0x05,0x64,0x00,0x60,0x0a,0xa5,0x00,0x5e,0x07,0xf8,0x00,0x60,0x04,0x7b,0x00,0x19,0x04,0xb4,0x00,0x1e,0x05,0x83,0x00,0x1e,0x05,0xa6,0x00,0x05,0x06,0x79,0x00,0x0a, +0x06,0xe5,0x00,0x05,0x06,0x08,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0xd4,0x00,0x5e,0x06,0x42,0x00,0x60,0x04,0x5c,0x00,0x1e,0x03,0x2e,0x00,0x0f,0x04,0x79,0x00,0x3d,0x03,0xee,0x00,0x0f,0x04,0xf8,0x00,0x12,0x03,0xd5,0xff,0xe8,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0xea,0x00,0x55,0x04,0x2d,0x00,0x3e,0x04,0x7b,0x00,0x12, +0x04,0xb4,0x00,0x27,0x04,0x7b,0x00,0x12,0x04,0xb4,0x00,0x27,0x03,0xd9,0x00,0xbc,0x03,0x32,0x00,0xa6,0x03,0xcd,0x00,0x60,0x03,0x19,0x00,0x1e,0x03,0xc8,0x00,0x14,0x02,0xf2,0xff,0x76,0x04,0x24,0x00,0x38,0x04,0x2a,0x00,0x43,0x02,0x69,0x00,0x28,0x05,0x65,0x00,0x60,0x02,0x9f,0x00,0xa6,0x07,0xa9,0x00,0xa6,0x05,0x4d,0x00,0xa6, +0x02,0xc8,0x00,0xa6,0x04,0xa7,0x00,0xa6,0x04,0xea,0x00,0x2b,0x03,0xb0,0xff,0xec,0x06,0x08,0x00,0x0f,0x04,0x79,0x00,0x60,0x03,0x08,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xa4,0x00,0x5a,0x04,0xa4,0x00,0x59,0x04,0x9f,0x00,0x60,0x03,0xc4,0x00,0x20,0x01,0xf0,0x00,0xa6,0x06,0x15,0x00,0xbc,0x04,0xc9,0x00,0xa6,0x02,0xf4,0x00,0xbc, +0x02,0xc8,0x00,0xa6,0x04,0xfa,0x00,0x5e,0x03,0xac,0x00,0x60,0x05,0xae,0x00,0xbc,0x03,0x17,0xff,0xe5,0x06,0x3d,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x04,0xf4,0x00,0x00,0x03,0xb2,0x00,0x00,0x05,0x7d,0x00,0x01,0x04,0xb6,0x00,0x00,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x26,0x05,0xfc,0x00,0x12,0x04,0x87,0x00,0x19,0x04,0xc9,0x00,0x12, +0x02,0xc8,0x00,0x23,0x04,0x40,0x00,0x45,0x03,0x65,0x00,0x60,0x06,0x00,0xff,0xac,0x03,0x64,0x00,0x19,0x04,0x3e,0x00,0x3e,0x06,0xe4,0x00,0x90,0x03,0xe8,0x00,0x54,0x04,0x7b,0x00,0x52,0x07,0x2f,0x00,0xbd,0x02,0x21,0x00,0xbc,0x09,0x2b,0x00,0x1a,0x07,0x25,0x00,0x50,0x07,0x31,0x00,0x50,0x09,0x76,0x00,0x4a,0x07,0x11,0x00,0x50, +0x07,0x53,0x00,0x8d,0x07,0x53,0x00,0x81,0x07,0x07,0x00,0x2f,0x07,0x17,0x00,0x50,0x07,0x60,0x00,0x7b,0x04,0x21,0x00,0x50,0x03,0xc4,0x00,0xbc,0x04,0xf4,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x07,0x2f,0x00,0xbc,0x05,0x9c,0x00,0x1a,0x07,0x8c,0x00,0x1a,0x01,0xf0,0x00,0xa6,0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x06,0xe4,0x00,0xa6, +0x08,0x3c,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x08,0x3c,0x00,0x5e,0x04,0xf4,0x00,0x68,0x04,0xf4,0x00,0x5e,0x06,0x5c,0x01,0x05,0x05,0x9c,0x00,0xbc,0x09,0x18,0x00,0x5e,0x07,0x60,0x00,0x48,0x04,0x27,0x00,0x00,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e, +0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0x19,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba, +0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x39,0x06,0x03,0x00,0x82,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x82,0x06,0x03,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x9a,0x03,0x57,0xff,0xa6,0x03,0x57,0xff,0xa6, +0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x1c,0x00,0x02,0x04,0x1c,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x0c,0x66,0x00,0x73, +0x04,0x1f,0x00,0xbc,0x03,0x2b,0x00,0xa6,0x04,0x83,0x00,0x50,0x04,0x38,0x00,0x50,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x07,0x02,0x00,0x10,0x05,0x5a,0x00,0x10,0x05,0xfe,0x00,0xbc,0x06,0x04,0x00,0xa6,0x06,0xa5,0x00,0x3d,0x06,0x8a,0x00,0x3e,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x08,0x09,0x00,0x10, +0x06,0x73,0x00,0x10,0x08,0x57,0x00,0xbc,0x06,0xda,0x00,0xa6,0x05,0x7d,0x00,0xa6,0x04,0xb4,0x00,0x98,0x02,0x81,0x00,0x35,0x02,0x81,0x00,0x35,0x04,0xac,0x00,0x5c,0x05,0x2c,0x00,0xbc,0x03,0x44,0x00,0x1e,0x04,0xcc,0x00,0x81,0x04,0x21,0x00,0x77,0x04,0xa2,0x00,0x06,0x03,0xdf,0xff,0xbd,0x05,0xea,0x00,0xbc,0x06,0x68,0x00,0x60, +0x03,0x34,0x00,0x78,0x04,0xb0,0x00,0x60,0x03,0x70,0x00,0x49,0x01,0xae,0x00,0x06,0x02,0xf7,0x00,0x1c,0x04,0x40,0x00,0x79,0x04,0x68,0x00,0x21,0x01,0xbb,0x00,0x70,0x01,0xbc,0x00,0x70,0x01,0x78,0x00,0x27,0x01,0xbc,0x00,0x6f,0x03,0x00,0x00,0x30,0x03,0x00,0x01,0x2e,0x03,0x00,0x00,0x30,0x03,0x96,0x00,0x83,0x0b,0xe8,0x00,0x00, +0x0f,0xf4,0x00,0x00,0x02,0xb7,0x00,0x25,0x03,0x4c,0x00,0x5b,0x01,0x11,0xff,0xda,0x02,0x21,0xff,0xf7,0x03,0x1b,0x00,0x0c,0x03,0x72,0x00,0x5b,0x02,0x89,0x00,0x5a,0x03,0xf3,0x00,0x1e,0x04,0x38,0x00,0x5c,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x96, +0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x0a,0xa0,0x00,0xb4,0x04,0x50,0x00,0x40,0x06,0x18,0x00,0x32,0x07,0x57,0x00,0x26,0x07,0x2f,0x00,0xbc,0x05,0x29,0x00,0x16,0x03,0xb2,0x00,0x60, +0x04,0x87,0x00,0xa6,0x05,0xc2,0x00,0x6e,0x05,0xe0,0x00,0x75,0x03,0xe8,0xff,0x9a,0x02,0x81,0x00,0x35,0x05,0x4a,0x00,0x5e,0x04,0x26,0x00,0x60,0x05,0x72,0x00,0x5e,0x04,0x70,0x00,0x60,0x05,0x4a,0x00,0x5e,0x04,0x43,0x00,0x60,0x04,0x52,0x00,0x60,0x05,0xf3,0x00,0x5e,0x04,0xbd,0x00,0x28,0x04,0xa4,0x00,0x02,0x04,0x31,0x00,0x29, +0x05,0xfe,0x00,0x32,0x04,0xea,0xff,0xf9,0x06,0xa8,0x00,0x5a,0x03,0xa4,0x00,0x64,0x04,0x2f,0x00,0x13,0x05,0x10,0x00,0x29,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x02,0xb7,0x00,0x00,0x02,0xc7,0x00,0x23,0x01,0xf0,0xff,0xf6,0x07,0x04,0x00,0xa6,0x04,0xa8,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0x2d,0x00,0x64,0x04,0x2d,0x00,0x54, +0x04,0xb0,0x00,0x80,0x07,0x6c,0x00,0x60,0x07,0x6c,0x00,0x60,0x07,0x8d,0x00,0x60,0x07,0xf8,0x00,0x60,0x07,0xf8,0x00,0x60,0x04,0x61,0x00,0x7d,0x03,0xff,0x00,0xb0,0x02,0x42,0x00,0xa6,0x04,0x01,0x00,0xa6,0x03,0xaa,0x00,0x1c,0x04,0xde,0x00,0x1c,0x03,0xa3,0x00,0x3c,0x05,0x57,0x00,0x3c,0x01,0xfa,0xff,0x92,0x04,0x87,0x00,0x90, +0x04,0xcb,0x00,0x21,0x06,0xe4,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x04,0xeb,0x00,0x0e,0x04,0x4e,0x00,0x0c,0x04,0x9c,0x00,0x0c,0x04,0x4e,0x00,0x0c,0x04,0x2c,0x00,0x1a,0x03,0xac,0xff,0x1f,0x04,0x2c,0xff,0x1f,0x03,0xac,0xfe,0xc8,0x03,0xdf,0x00,0x0e,0x02,0x6e,0x00,0x25,0x02,0xb2,0x00,0x64,0x01,0xf4,0x00,0x00,0x01,0xbf,0x00,0x00, +0x02,0xe4,0x00,0x00,0x04,0xa0,0x00,0x60,0x05,0x10,0x00,0x58,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0xcf, +0x02,0x58,0x00,0x8b,0x02,0x8a,0x00,0x0c,0x02,0x8a,0x00,0x0c,0x00,0x00,0xff,0xd4,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x02,0x01,0x00,0x05,0x02,0x01,0x00,0x05,0x0d,0x74,0x00,0x52,0x07,0xf5,0x00,0x32,0x06,0xf9,0x00,0x32,0x08,0x63,0x00,0x32,0x02,0x4e,0x00,0x29,0x02,0x4e,0xff,0xba,0x02,0x9e,0x00,0x05, +0x03,0x2a,0x00,0x9a,0x02,0x0c,0x00,0x05,0x02,0x26,0x00,0x15,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x21,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x29,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xf8,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x69,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x00,0x00,0xff,0xe7,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba, +0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0x12,0x00,0xc4,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xab,0x03,0x57,0x00,0x00, +0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0xfe,0x45,0x02,0xdb,0x00,0x14,0x05,0xfa,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x05,0xae,0xff,0x98,0x04,0x9e,0xff,0x5c,0x0a,0x08,0x00,0x0f,0x08,0x46,0x00,0x12,0x05,0x8c,0x00,0x0f,0x04,0x60,0x00,0x12,0x05,0x9e,0x00,0x10,0x04,0x65,0x00,0x10,0x0a,0xa5,0x00,0x5e,0x07,0xf8,0x00,0x60, +0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x03,0x1b,0x00,0x0c,0x02,0x89,0x00,0x5a,0x04,0xf2,0x00,0x28,0x00,0x00,0xff,0x38,0x05,0x76,0x00,0x50,0x04,0x50,0x00,0xbc,0x02,0xb0,0x00,0x66,0x02,0x6a,0x00,0x66,0x01,0x4c,0x00,0x66,0x03,0xfa,0x00,0x66,0x02,0xb0,0x00,0x66,0x02,0xbe,0x00,0x66,0x02,0x09,0x00,0x3c,0x01,0x9c,0x00,0x0a, +0x03,0xb1,0x00,0x1e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x01,0xbc,0x00,0x70,0x04,0x31,0x00,0x29,0x03,0x68,0x00,0x20,0x04,0xb8,0x00,0x1a,0x04,0x96,0x00,0xbc,0x04,0x62,0x00,0xa7,0x07,0xb2,0x00,0x5a, +0x06,0x77,0x00,0x77,0x06,0x74,0x00,0xa6,0x06,0x50,0x00,0xa6,0x06,0x89,0x00,0x60,0x07,0x8a,0x00,0x90,0x05,0x03,0x00,0x35,0x05,0x7c,0x00,0x68,0x04,0xcf,0x00,0x50,0x03,0x25,0x00,0x50,0x07,0x6e,0x00,0x3c,0x09,0x01,0x00,0x54,0x03,0x85,0x00,0x74,0x09,0x3d,0xff,0xf8,0x04,0x02,0x00,0x65,0x06,0xae,0x00,0xab,0x07,0x59,0x00,0xab, +0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x03,0x57,0x00,0x00,0x06,0x03,0x00,0x9a,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x05,0x58,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x32,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfb,0x6b,0x00,0x00,0xfb,0x9b, +0x00,0x00,0xfc,0x00,0x00,0x00,0xfd,0x71,0x00,0x00,0xfd,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xfe,0x04,0x64,0x00,0xdc,0x00,0x00,0xfe,0xd4,0x04,0xad,0x00,0x65,0x04,0xad,0xff,0xba,0x04,0xae,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba, +0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x03,0xf1,0xff,0xba,0x03,0xf1,0xff,0xba,0x00,0x00,0xfe,0x84,0x03,0x57,0x00,0x00,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba, +0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0x58,0x00,0xab,0x02,0x58,0x00,0xd4,0x02,0x58,0x00,0x66,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x7f,0x02,0x58,0x00,0x4f,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x53,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x59,0x02,0x58,0x00,0x2b, +0x02,0x58,0x00,0x4d,0x0c,0x05,0x00,0xa1,0x0c,0x05,0x00,0xa1,0x07,0x0a,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0a,0x00,0x73,0x07,0x0a,0x00,0x73,0x03,0x4d,0x00,0xf2,0x03,0x4d,0x01,0x2f,0x03,0x4d,0x00,0x76,0x03,0x4d,0x00,0x25,0x03,0x4d,0x00,0xab,0x03,0x4d,0x00,0x62,0x03,0x4d,0x00,0x42,0x03,0x4d,0x00,0x1c, +0x03,0x4d,0x00,0x1d,0x03,0x4d,0x00,0x3c,0x03,0x4d,0x00,0x69,0x03,0x4d,0x00,0x3c,0x03,0x4d,0x00,0x6f,0x03,0x4d,0x00,0x41,0x03,0x4d,0x00,0x6b,0x03,0x57,0x00,0x39,0x05,0x58,0x00,0x9a,0x04,0xf1,0x00,0x55,0x05,0x26,0x00,0x78,0x05,0x30,0x00,0x78,0x07,0x1a,0x00,0x82,0x05,0x27,0x00,0x64,0x05,0x0b,0x00,0x6e,0x06,0x62,0x00,0x28, +0x07,0xce,0x00,0x82,0x05,0x34,0x00,0x82,0x05,0x0b,0x00,0x6e,0x08,0x8a,0x00,0x82,0x05,0x14,0x00,0x82,0x05,0x14,0x00,0xa0,0x07,0x7a,0x00,0x82,0x05,0x0b,0x00,0x6e,0x05,0x63,0x00,0x64,0x06,0x52,0x00,0x82,0x05,0x1a,0x00,0xa0,0x06,0x28,0x00,0x6e,0x06,0xc3,0x00,0x0a,0x07,0x4d,0x00,0x55,0x05,0x1d,0x00,0x5a,0x06,0x24,0x00,0x82, +0x05,0x31,0x00,0x6e,0x05,0x93,0x00,0x32,0x04,0xf8,0x00,0xa0,0x05,0x95,0x00,0x82,0x05,0x00,0x00,0x6e,0x05,0x45,0x00,0x50,0x05,0x7b,0x00,0x32,0x05,0x00,0x00,0xa0,0x06,0x3a,0x00,0x50,0x04,0xc8,0x00,0x50,0x05,0x4e,0x00,0x82,0x06,0x48,0x00,0x64,0x04,0xf2,0x00,0x64,0x05,0x01,0x00,0x64,0x04,0x8d,0x00,0x6e,0x06,0x47,0x00,0x6e, +0x05,0x23,0x00,0x76,0x05,0x31,0x00,0xa0,0x05,0x30,0x00,0x78,0x05,0x96,0x00,0x82,0x03,0x93,0x00,0x00,0x04,0x39,0x00,0x00,0x05,0x23,0x00,0x62,0x06,0x48,0x00,0x64,0x06,0x36,0x00,0x78,0x04,0x56,0x00,0xbe,0x00,0x00,0x14,0xe0,0x19,0x01,0x25,0x01,0x01,0x01,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0c,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x01,0x0c,0x2c,0x01,0x01,0x24,0x01,0x01,0x01,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x09,0x22,0x27,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x2e,0x01,0x0c,0x2e,0x0c,0x01,0x01,0x0c,0x01,0x0d,0x0c,0x0c,0x0c, +0x2e,0x01,0x01,0x01,0x0c,0x19,0x0c,0x01,0x01,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x03,0x0c,0x09,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x23,0x01,0x2a,0x2a,0x01,0x01,0x24,0x1c,0x01,0x0c,0x2a, +0x01,0x1c,0x1c,0x01,0x0c,0x0f,0x01,0x01,0x01,0x01,0x01,0x0c,0x04,0x0c,0x01,0x01,0x01,0x01,0x1f,0x01,0x1c,0x27,0x01,0x01,0x0e,0x01,0x01,0x0c,0x01,0x08,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x0c,0x1b,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x09, +0x09,0x09,0x01,0x01,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0e,0x01,0x01,0x01,0x16,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x01,0x01,0x01,0x10,0x10,0x01,0x01,0x01,0x01,0x2c,0x2e,0x01,0x01,0x01,0x0d,0x01,0x0d,0x01,0x2e,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x01,0x16,0x01,0x16,0x01,0x01,0x0e,0x24,0x0c,0x01,0x15,0x29,0x0d,0x01,0x01,0x01,0x01,0x05,0x0c,0x01,0x19,0x01,0x01,0x12,0x19,0x19,0x19,0x19,0x19,0x01,0x01,0x0d,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x2c, +0x2e,0x2c,0x2e,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x0c,0x0c,0x01,0x01,0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x27,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x04,0x0c,0x0c,0x0c,0x27,0x0c,0x27,0x0c,0x27,0x0c,0x0c,0x01, +0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x03,0x01,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x0e,0x0c,0x01,0x0c,0x24,0x01,0x0c,0x01,0x0c,0x01,0x1b,0x01,0x0c,0x0c,0x01,0x01,0x04,0x0e,0x01,0x01,0x0c,0x0c,0x27,0x0c,0x01, +0x0e,0x0d,0x01,0x0c,0x0c,0x0c,0x0d,0x01,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x0d,0x0d,0x07,0x07,0x01,0x1b,0x01,0x01,0x0c,0x01,0x01,0x0d,0x01,0x01,0x0c,0x01,0x22,0x20,0x0e,0x1a,0x01,0x1f,0x01,0x2c,0x01,0x22,0x01,0x0c,0x01,0x0c,0x0d,0x01,0x0e,0x26,0x26,0x26,0x0c,0x26,0x0d, +0x0e,0x0c,0x0e,0x0c,0x01,0x01,0x01,0x2c,0x01,0x0e,0x0c,0x0e,0x26,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x0e,0x0c,0x01,0x01,0x01,0x0e,0x2d,0x0c,0x0c,0x01,0x0e,0x01,0x01,0x01,0x2e,0x01,0x01,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x0c,0x25,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x25,0x0c, +0x25,0x0c,0x25,0x0c,0x25,0x0c,0x25,0x09,0x0c,0x09,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x07,0x26,0x01,0x24,0x01,0x01,0x23,0x01,0x28,0x01,0x29,0x22,0x01,0x02,0x22,0x0e,0x0c,0x0e,0x0c,0x0e,0x01,0x02,0x01,0x0c,0x20,0x0c,0x01,0x01,0x01,0x0c,0x01,0x01,0x01, +0x01,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x0d,0x01,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x2c,0x2e,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01, +0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x0d,0x01,0x0d,0x03,0x0c,0x03,0x0c,0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x22,0x19,0x22,0x19,0x27,0x0c,0x27,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x16,0x01,0x16,0x01,0x16,0x0c,0x01,0x0c,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x22,0x22, +0x22,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x2a,0x02,0x02,0x19,0x01,0x19,0x19,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, +0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01, +0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x01,0x01,0x29,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x1e,0x01,0x01,0x01,0x01,0x0d,0x01,0x01,0x22,0x05,0x01,0x01,0x01,0x04,0x01,0x04,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x32,0x1a,0x15,0x1a,0x15,0x01,0x22,0x25,0x01,0x01,0x16,0x0a,0x0a,0x01,0x01,0x01,0x01,0x1a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x13,0x15,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x2c,0x2e,0x01,0x0c, +0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x01,0x13,0x15,0x2c,0x2e,0x01,0x01,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x01,0x01,0x01,0x0c,0x30,0x01,0x01,0x01,0x16,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x2e,0x01,0x2e,0x2d,0x2d,0x2e,0x2e,0x01,0x29,0x01,0x01,0x01,0x01,0x0a,0x2e,0x2e,0x01,0x19,0x01,0x01,0x01,0x01,0x16,0x01,0x28,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x03,0x01,0x01,0x1f,0x1a,0x1a,0x01,0x01,0x01,0x19,0x01,0x01, +0x01,0x16,0x2b,0x01,0x01,0x1b,0x1b,0x1b,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x04,0x01,0x2e,0x1b,0x1b,0x07,0x0b,0x16,0x17,0x01,0x01,0x01,0x01,0x25,0x02,0x02,0x01,0x22,0x01,0x2e,0x01,0x1e,0x01,0x01,0x01,0x01,0x07,0x01,0x04,0x2a,0x01,0x01,0x01,0x02,0x01,0x01,0x19,0x01,0x01,0x01,0x0a,0x1a,0x01,0x01,0x26,0x01,0x01,0x01,0x01, +0x07,0x01,0x01,0x01,0x01,0x01,0x0c,0x2e,0x01,0x01,0x01,0x01,0x01,0x08,0x05,0x01,0x01,0x01,0x01,0x07,0x01,0x0b,0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x01,0x1f,0x01,0x01,0x0c,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0b,0x01,0x01,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x26,0x01,0x01,0x2f,0x01,0x0a, +0x2d,0x01,0x01,0x01,0x01,0x2c,0x01,0x09,0x01,0x01,0x10,0x01,0x10,0x01,0x0d,0x0e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x0e,0x0d,0x26,0x01,0x01,0x07,0x26,0x07,0x26,0x0c,0x0c,0x01,0x0c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x0c,0x1f,0x01,0x25,0x2e,0x01,0x01, +0x01,0x0a,0x01,0x01,0x26,0x01,0x30,0x01,0x01,0x22,0x15,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30, +0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30, +0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0d,0x26,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x0c,0x16,0x01,0x01,0x01,0x0c,0x01,0x0e,0x01,0x22,0x01,0x2c,0x29,0x01,0x24,0x01,0x01, +0x01,0x01,0x2f,0x14,0x01,0x19,0x1f,0x01,0x01,0x01,0x1c,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x25,0x01,0x01,0x01,0x02,0x01,0x14,0x01,0x14,0x14,0x01,0x01,0x01,0x01,0x02,0x01,0x25,0x01,0x01,0x14,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x26,0x01,0x01,0x30,0x01,0x05,0x01, +0x01,0x01,0x19,0x01,0x01,0x26,0x2e,0x01,0x01,0x01,0x01,0x01,0x2a,0x18,0x18,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x16,0x2f,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0d,0x01,0x01,0x01,0x0c,0x2e,0x0c,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x16,0x2e,0x01,0x01,0x01,0x01,0x28,0x01,0x01,0x01,0x01,0x0c,0x2e,0x0c,0x2e,0x0c,0x01,0x0d,0x0c, +0x0c,0x01,0x01,0x01,0x19,0x01,0x16,0x01,0x2e,0x2e,0x01,0x01,0x26,0x01,0x01,0x2d,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x25,0x1f,0x01,0x01,0x01,0x01,0x01,0x1b,0x1b,0x01,0x01,0x01,0x1e,0x02,0x02,0x01,0x01,0x1c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x2d,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x14, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x01, +0x01,0x01,0x10,0x10,0x01,0x10,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x10,0x01,0x10,0x10,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x2c,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x30,0x01,0x01,0x01,0x01,0x01,0x19,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x19,0x19,0x19,0x19,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01, +0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x05,0x01,0x01,0x01,0x0c,0x04,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x30,0x01,0x01, +0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x01,0x30,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x01,0x01,0x24,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01, +0x01,0x01,0x01,0x0d,0x01,0x1b,0x26,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x29,0x13,0x01,0x01,0x04,0x1e,0x01,0x01,0x06,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x08,0x2f,0x01,0x2e,0x27,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x13,0x01,0x13,0x01,0x27,0x32,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x1b,0x13,0x13,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x10,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x2f,0x01,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x01,0x08,0x2b,0x17,0x17,0x17,0x19,0x01,0x12,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01, +0x01,0x2b,0x01,0x08,0x08,0x08,0x08,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x08,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x08,0x2b,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0xfd,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x20,0x01,0x09,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x20,0x01,0x2c,0x01,0x01,0x01,0x01,0x28,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x18,0x01,0x01,0x1f,0x10, +0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x0c,0x01,0x28,0x01,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x2f,0x01,0x24,0x24,0x24,0x0f,0x24,0x30,0x24,0x0e,0x02,0x24,0x17,0x01,0x24,0x0e,0x26,0x26,0x16,0x01,0x24,0x0e,0x0e,0x01,0x24,0x24,0x24,0x24,0x24,0x16,0x30,0x01,0x24, +0x01,0x17,0x01,0x01,0x24,0x24,0x16,0x01,0x09,0x16,0x27,0x09,0x01,0x0d,0x09,0x11,0x16,0x1f,0x01,0x01,0x1b,0x09,0x01,0x01,0x27,0x01,0x0a,0x01,0x27,0x01,0x2b,0x01,0x15,0x01,0x0a,0x2b,0x01,0x01,0x01,0x01,0x0a,0x01,0x11,0x01,0x01,0x06,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x0c,0x30,0x01,0x2b,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x04,0x01,0x2e,0x30,0x04,0x01,0x0c,0x09,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x02,0x2d,0x01,0x01,0x31,0x01,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x2d,0x2d,0x2d,0x2d,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x1d,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x31,0x01,0x19,0x31,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x01,0x01,0x01,0x1e,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01,0x01,0x01,0x32,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x24,0x0d,0x01,0x01,0x0c,0x01,0x01,0x03,0x01, +0x01,0x01,0x01,0x22,0x22,0x01,0x2c,0x24,0x27,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x09,0x09,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x0c,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x01,0x0c,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01, +0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x01,0x01,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x30,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,0x01,0x01,0x01,0x01,0x0c,0x01,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x16,0x01,0x01,0x0a,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x28,0x01,0x03,0x01,0x01,0x25,0x01,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x01,0x01,0x14,0x01,0x01,0x01,0x01,0x15,0x01,0x01,0x31,0x31,0x01,0x01,0x01,0x18,0x01,0x01,0x26,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x05, +0x01,0x2d,0x1d,0x0b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x12,0x01,0x2c,0x01,0x07,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x32,0x01,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x01,0x16,0x01,0x1b,0x01,0x29,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x23,0x01,0x01,0x12,0x01,0x01,0x0d,0x27,0x01,0x01,0x25,0x20,0x01,0x17,0x01,0x01,0x17, +0x17,0x01,0x20,0x17,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x20,0x20,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x1e,0x32,0x01,0x15,0x01,0x01,0x01,0x02,0x16,0x01,0x1d,0x01,0x01,0x01,0x01,0x02,0x01,0x11,0x01,0x01,0x01,0x01,0x01,0x26,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x01,0x01,0x19,0x19,0x19,0x19,0x19,0x19,0x01,0x19,0x19, +0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0b,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x12,0x01,0x11,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x01,0x01,0x01, +0x30,0x01,0x01,0x01,0x01,0x01,0x1b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x14,0x29,0x14,0x14,0x14,0x01,0x30,0x30,0x2c,0x01,0x01,0x19,0x19,0x19,0x01,0x19,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,0x01,0x07,0x01,0x01,0x01,0x01,0x01,0x09,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x01,0x07,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x0c,0x01, +0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x08,0x01,0x25,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x26,0x01,0x06,0x1b,0x01,0x01,0x01,0x1b,0x01,0x1a,0x01,0x01,0x01,0x01,0x01,0x01,0x1a,0x25,0x01,0x01,0x25,0x01,0x20,0x01,0x17,0x1a,0x01,0x15,0x2c,0x2c,0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x01,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, +0x27,0x27,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x32, +0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x14,0x01,0x01,0x01,0x22,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x26,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x02,0x01,0x02,0x2e,0x01,0x01,0x01,0x01,0x01,0x28,0x18,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x19,0x27,0x01,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x31,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x1a,0x01,0x01,0x01,0x2c,0x2e,0x01,0x02,0x03, +0x01,0x01,0x01,0x01,0x01,0x01,0x2f,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x06,0x01,0x1f,0x07,0x07,0x01,0x17,0x01,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x0d,0x12,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x1b,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x13,0x07,0x26,0x01,0x01,0x01,0x07,0x01,0x01,0x01,0x01, +0x02,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x02,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x01,0x20,0x01,0x0d,0x01,0x01,0x01,0x01,0x07,0x24,0x04,0x01,0x01,0x10,0x0c,0x2e,0x01,0x25,0x01,0x01,0x07,0x01,0x01,0x01,0x01,0x08,0x08,0x0a,0x01,0x01,0x16,0x10,0x01,0x01,0x0d,0x01,0x01,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2f, +0x2c,0x11,0x01,0x01,0x10,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x01,0x20,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01, +0x01,0x01,0x01,0x01,0x01,0x24,0x03,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x0b,0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x1c,0x01,0x01,0x01,0x01,0x0d,0x2d,0x01,0x2a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x01,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x2c,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x01,0x18,0x30,0x01,0x01,0x18,0x26,0x01,0x01,0x18,0x18,0x01,0x01,0x1e,0x01,0x2b,0x01,0x01,0x1d,0x30,0x01,0x22,0x31,0x01,0x01,0x1c,0x01,0x01,0x2f,0x01,0x08,0x01,0x01, +0x1e,0x08,0x08,0x30,0x01,0x01,0x01,0x01,0x08,0x08,0x01,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x0c,0x00,0xf8,0x08,0xff,0x00,0x08,0x00,0x09,0xff,0xfe,0x00,0x09,0x00,0x0a,0xff,0xfe,0x00,0x0a,0x00,0x0a,0xff,0xfe,0x00,0x0b,0x00,0x0b,0xff,0xfe,0x00,0x0c,0x00,0x0c,0xff,0xfd,0x00,0x0d,0x00,0x0e,0xff,0xfd, +0x00,0x0e,0x00,0x0f,0xff,0xfc,0x00,0x0f,0x00,0x10,0xff,0xfc,0x00,0x10,0x00,0x11,0xff,0xfc,0x00,0x11,0x00,0x12,0xff,0xfb,0x00,0x12,0x00,0x14,0xff,0xfb,0x00,0x13,0x00,0x14,0xff,0xfb,0x00,0x14,0x00,0x17,0xff,0xfb,0x00,0x15,0x00,0x18,0xff,0xfa,0x00,0x16,0x00,0x18,0xff,0xfa,0x00,0x17,0x00,0x19,0xff,0xfa,0x00,0x18,0x00,0x1a, +0xff,0xfa,0x00,0x19,0x00,0x1c,0xff,0xf9,0x00,0x1a,0x00,0x1d,0xff,0xf9,0x00,0x1b,0x00,0x1e,0xff,0xf9,0x00,0x1c,0x00,0x1f,0xff,0xf9,0x00,0x1d,0x00,0x20,0xff,0xf8,0x00,0x1e,0x00,0x21,0xff,0xf8,0x00,0x1f,0x00,0x22,0xff,0xf8,0x00,0x20,0x00,0x24,0xff,0xf7,0x00,0x21,0x00,0x24,0xff,0xf7,0x00,0x22,0x00,0x25,0xff,0xf7,0x00,0x23, +0x00,0x26,0xff,0xf7,0x00,0x24,0x00,0x27,0xff,0xf7,0x00,0x25,0x00,0x28,0xff,0xf6,0x00,0x26,0x00,0x29,0xff,0xf6,0x00,0x27,0x00,0x2a,0xff,0xf6,0x00,0x28,0x00,0x2b,0xff,0xf5,0x00,0x29,0x00,0x2c,0xff,0xf5,0x00,0x2a,0x00,0x2e,0xff,0xf5,0x00,0x2b,0x00,0x2f,0xff,0xf4,0x00,0x2c,0x00,0x30,0xff,0xf4,0x00,0x2d,0x00,0x31,0xff,0xf4, +0x00,0x2e,0x00,0x32,0xff,0xf4,0x00,0x2f,0x00,0x32,0xff,0xf4,0x00,0x30,0x00,0x34,0xff,0xf3,0x00,0x31,0x00,0x35,0xff,0xf3,0x00,0x32,0x00,0x36,0xff,0xf3,0x00,0x33,0x00,0x37,0xff,0xf3,0x00,0x34,0x00,0x38,0xff,0xf2,0x00,0x35,0x00,0x39,0xff,0xf2,0x00,0x36,0x00,0x3a,0xff,0xf2,0x00,0x37,0x00,0x3c,0xff,0xf2,0x00,0x38,0x00,0x3c, +0xff,0xf2,0x00,0x39,0x00,0x3d,0xff,0xf1,0x00,0x3a,0x00,0x3e,0xff,0xf1,0x00,0x3b,0x00,0x3f,0xff,0xf1,0x00,0x3c,0x00,0x41,0xff,0xf0,0x00,0x3d,0x00,0x42,0xff,0xf0,0x00,0x3e,0x00,0x44,0xff,0xf0,0x00,0x3f,0x00,0x45,0xff,0xf0,0x00,0x40,0x00,0x45,0xff,0xef,0x00,0x41,0x00,0x46,0xff,0xef,0x00,0x42,0x00,0x47,0xff,0xef,0x00,0x43, +0x00,0x48,0xff,0xef,0x00,0x44,0x00,0x49,0xff,0xee,0x00,0x45,0x00,0x4a,0xff,0xee,0x00,0x46,0x00,0x4b,0xff,0xee,0x00,0x47,0x00,0x4c,0xff,0xee,0x00,0x48,0x00,0x4d,0xff,0xed,0x00,0x49,0x00,0x4f,0xff,0xed,0x00,0x4a,0x00,0x50,0xff,0xed,0x00,0x4b,0x00,0x51,0xff,0xed,0x00,0x4c,0x00,0x51,0xff,0xec,0x00,0x4d,0x00,0x52,0xff,0xec, +0x00,0x4e,0x00,0x54,0xff,0xec,0x00,0x4f,0x00,0x55,0xff,0xec,0x00,0x50,0x00,0x56,0xff,0xec,0x00,0x51,0x00,0x57,0xff,0xeb,0x00,0x52,0x00,0x58,0xff,0xeb,0x00,0x53,0x00,0x59,0xff,0xeb,0x00,0x54,0x00,0x5a,0xff,0xea,0x00,0x55,0x00,0x5b,0xff,0xea,0x00,0x56,0x00,0x5c,0xff,0xea,0x00,0x57,0x00,0x5e,0xff,0xea,0x00,0x58,0x00,0x5e, +0xff,0xea,0x00,0x59,0x00,0x5f,0xff,0xe9,0x00,0x5a,0x00,0x61,0xff,0xe9,0x00,0x5b,0x00,0x61,0xff,0xe9,0x00,0x5c,0x00,0x63,0xff,0xe8,0x00,0x5d,0x00,0x64,0xff,0xe8,0x00,0x5e,0x00,0x65,0xff,0xe8,0x00,0x5f,0x00,0x66,0xff,0xe7,0x00,0x60,0x00,0x67,0xff,0xe7,0x00,0x61,0x00,0x69,0xff,0xe7,0x00,0x62,0x00,0x69,0xff,0xe7,0x00,0x63, +0x00,0x6a,0xff,0xe7,0x00,0x64,0x00,0x6b,0xff,0xe6,0x00,0x65,0x00,0x6d,0xff,0xe6,0x00,0x66,0x00,0x6e,0xff,0xe6,0x00,0x67,0x00,0x6f,0xff,0xe6,0x00,0x68,0x00,0x70,0xff,0xe5,0x00,0x69,0x00,0x71,0xff,0xe5,0x00,0x6a,0x00,0x72,0xff,0xe5,0x00,0x6b,0x00,0x73,0xff,0xe5,0x00,0x6c,0x00,0x75,0xff,0xe4,0x00,0x6d,0x00,0x76,0xff,0xe4, +0x00,0x6e,0x00,0x76,0xff,0xe4,0x00,0x6f,0x00,0x77,0xff,0xe4,0x00,0x70,0x00,0x79,0xff,0xe4,0x00,0x71,0x00,0x79,0xff,0xe3,0x00,0x72,0x00,0x7b,0xff,0xe3,0x00,0x73,0x00,0x7b,0xff,0xe3,0x00,0x74,0x00,0x7c,0xff,0xe3,0x00,0x75,0x00,0x7d,0xff,0xe2,0x00,0x76,0x00,0x7e,0xff,0xe2,0x00,0x77,0x00,0x80,0xff,0xe2,0x00,0x78,0x00,0x80, +0xff,0xe1,0x00,0x79,0x00,0x82,0xff,0xe1,0x00,0x7a,0x00,0x82,0xff,0xe1,0x00,0x7b,0x00,0x84,0xff,0xe1,0x00,0x7c,0x00,0x85,0xff,0xe1,0x00,0x7d,0x00,0x86,0xff,0xe0,0x00,0x7e,0x00,0x87,0xff,0xe0,0x00,0x7f,0x00,0x88,0xff,0xe0,0x00,0x80,0x00,0x89,0xff,0xdf,0x00,0x81,0x00,0x8a,0xff,0xdf,0x00,0x82,0x00,0x8c,0xff,0xdf,0x00,0x83, +0x00,0x8d,0xff,0xdf,0x00,0x84,0x00,0x8e,0xff,0xde,0x00,0x85,0x00,0x8e,0xff,0xdf,0x00,0x86,0x00,0x8f,0xff,0xde,0x00,0x87,0x00,0x90,0xff,0xde,0x00,0x88,0x00,0x92,0xff,0xde,0x00,0x89,0x00,0x93,0xff,0xdd,0x00,0x8a,0x00,0x94,0xff,0xdd,0x00,0x8b,0x00,0x95,0xff,0xdd,0x00,0x8c,0x00,0x96,0xff,0xdc,0x00,0x8d,0x00,0x97,0xff,0xdc, +0x00,0x8e,0x00,0x99,0xff,0xdc,0x00,0x8f,0x00,0x9a,0xff,0xdc,0x00,0x90,0x00,0x9a,0xff,0xdb,0x00,0x91,0x00,0x9b,0xff,0xdb,0x00,0x92,0x00,0x9c,0xff,0xdb,0x00,0x93,0x00,0x9e,0xff,0xdb,0x00,0x94,0x00,0x9f,0xff,0xda,0x00,0x95,0x00,0xa0,0xff,0xda,0x00,0x96,0x00,0xa1,0xff,0xda,0x00,0x97,0x00,0xa2,0xff,0xda,0x00,0x98,0x00,0xa3, +0xff,0xd9,0x00,0x99,0x00,0xa4,0xff,0xd9,0x00,0x9a,0x00,0xa5,0xff,0xd9,0x00,0x9b,0x00,0xa6,0xff,0xd9,0x00,0x9c,0x00,0xa7,0xff,0xd8,0x00,0x9d,0x00,0xa8,0xff,0xd8,0x00,0x9e,0x00,0xa9,0xff,0xd8,0x00,0x9f,0x00,0xab,0xff,0xd8,0x00,0xa0,0x00,0xab,0xff,0xd7,0x00,0xa1,0x00,0xad,0xff,0xd7,0x00,0xa2,0x00,0xae,0xff,0xd7,0x00,0xa3, +0x00,0xaf,0xff,0xd7,0x00,0xa4,0x00,0xb1,0xff,0xd6,0x00,0xa5,0x00,0xb1,0xff,0xd6,0x00,0xa6,0x00,0xb2,0xff,0xd6,0x00,0xa7,0x00,0xb3,0xff,0xd6,0x00,0xa8,0x00,0xb3,0xff,0xd5,0x00,0xa9,0x00,0xb6,0xff,0xd5,0x00,0xaa,0x00,0xb7,0xff,0xd5,0x00,0xab,0x00,0xb8,0xff,0xd5,0x00,0xac,0x00,0xb8,0xff,0xd4,0x00,0xad,0x00,0xb9,0xff,0xd4, +0x00,0xae,0x00,0xba,0xff,0xd4,0x00,0xaf,0x00,0xbb,0xff,0xd3,0x00,0xb0,0x00,0xbe,0xff,0xd3,0x00,0xb1,0x00,0xbe,0xff,0xd3,0x00,0xb2,0x00,0xbf,0xff,0xd3,0x00,0xb3,0x00,0xc0,0xff,0xd3,0x00,0xb4,0x00,0xc1,0xff,0xd2,0x00,0xb5,0x00,0xc2,0xff,0xd2,0x00,0xb6,0x00,0xc3,0xff,0xd2,0x00,0xb7,0x00,0xc5,0xff,0xd2,0x00,0xb8,0x00,0xc5, +0xff,0xd1,0x00,0xb9,0x00,0xc6,0xff,0xd1,0x00,0xba,0x00,0xc8,0xff,0xd1,0x00,0xbb,0x00,0xc9,0xff,0xd1,0x00,0xbc,0x00,0xca,0xff,0xd0,0x00,0xbd,0x00,0xcb,0xff,0xd0,0x00,0xbe,0x00,0xcb,0xff,0xd0,0x00,0xbf,0x00,0xcd,0xff,0xd0,0x00,0xc0,0x00,0xcd,0xff,0xcf,0x00,0xc1,0x00,0xcf,0xff,0xcf,0x00,0xc2,0x00,0xd0,0xff,0xcf,0x00,0xc3, +0x00,0xd0,0xff,0xcf,0x00,0xc4,0x00,0xd1,0xff,0xce,0x00,0xc5,0x00,0xd3,0xff,0xce,0x00,0xc6,0x00,0xd4,0xff,0xce,0x00,0xc7,0x00,0xd5,0xff,0xce,0x00,0xc8,0x00,0xd6,0xff,0xcd,0x00,0xc9,0x00,0xd7,0xff,0xcd,0x00,0xca,0x00,0xd8,0xff,0xcd,0x00,0xcb,0x00,0xd9,0xff,0xcd,0x00,0xcc,0x00,0xda,0xff,0xcc,0x00,0xcd,0x00,0xdc,0xff,0xcc, +0x00,0xce,0x00,0xdc,0xff,0xcc,0x00,0xcf,0x00,0xdd,0xff,0xcc,0x00,0xd0,0x00,0xde,0xff,0xcb,0x00,0xd1,0x00,0xe0,0xff,0xcb,0x00,0xd2,0x00,0xe1,0xff,0xcb,0x00,0xd3,0x00,0xe2,0xff,0xcb,0x00,0xd4,0x00,0xe3,0xff,0xca,0x00,0xd5,0x00,0xe4,0xff,0xca,0x00,0xd6,0x00,0xe5,0xff,0xca,0x00,0xd7,0x00,0xe6,0xff,0xca,0x00,0xd8,0x00,0xe7, +0xff,0xc9,0x00,0xd9,0x00,0xe8,0xff,0xc9,0x00,0xda,0x00,0xea,0xff,0xc9,0x00,0xdb,0x00,0xeb,0xff,0xc9,0x00,0xdc,0x00,0xeb,0xff,0xc8,0x00,0xdd,0x00,0xed,0xff,0xc8,0x00,0xde,0x00,0xee,0xff,0xc8,0x00,0xdf,0x00,0xee,0xff,0xc8,0x00,0xe0,0x00,0xf0,0xff,0xc7,0x00,0xe1,0x00,0xf1,0xff,0xc7,0x00,0xe2,0x00,0xf3,0xff,0xc6,0x00,0xe3, +0x00,0xf3,0xff,0xc6,0x00,0xe4,0x00,0xf4,0xff,0xc6,0x00,0xe5,0x00,0xf5,0xff,0xc6,0x00,0xe6,0x00,0xf6,0xff,0xc6,0x00,0xe7,0x00,0xf8,0xff,0xc6,0x00,0xe8,0x00,0xf8,0xff,0xc5,0x00,0xe9,0x00,0xfa,0xff,0xc5,0x00,0xea,0x00,0xfb,0xff,0xc5,0x00,0xeb,0x00,0xfb,0xff,0xc5,0x00,0xec,0x00,0xfd,0xff,0xc4,0x00,0xed,0x00,0xfd,0xff,0xc4, +0x00,0xee,0x00,0xff,0xff,0xc4,0x00,0xef,0x01,0x01,0xff,0xc4,0x00,0xf0,0x01,0x01,0xff,0xc3,0x00,0xf1,0x01,0x03,0xff,0xc3,0x00,0xf2,0x01,0x03,0xff,0xc3,0x00,0xf3,0x01,0x04,0xff,0xc3,0x00,0xf4,0x01,0x05,0xff,0xc2,0x00,0xf5,0x01,0x07,0xff,0xc2,0x00,0xf6,0x01,0x08,0xff,0xc2,0x00,0xf7,0x01,0x09,0xff,0xc2,0x00,0xf8,0x01,0x0a, +0xff,0xc1,0x00,0xf9,0x01,0x0b,0xff,0xc1,0x00,0xfa,0x01,0x0c,0xff,0xc1,0x00,0xfb,0x01,0x0d,0xff,0xc1,0x00,0xfc,0x01,0x0f,0xff,0xc0,0x00,0xfd,0x01,0x10,0xff,0xc0,0x00,0xfe,0x01,0x10,0xff,0xc0,0x00,0xff,0x01,0x11,0xff,0xc0,0x00,0x00,0x00,0x11,0x00,0x00,0x14,0xe4,0x0b,0x16,0x07,0x00,0x01,0x03,0x03,0x04,0x07,0x06,0x09,0x09, +0x03,0x03,0x03,0x05,0x08,0x03,0x04,0x03,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x08,0x08,0x08,0x05,0x0b,0x07,0x06,0x07,0x08,0x06,0x06,0x08,0x08,0x03,0x04,0x06,0x05,0x0a,0x08,0x09,0x06,0x08,0x07,0x06,0x06,0x08,0x07,0x0b,0x06,0x05,0x06,0x03,0x04,0x03,0x08,0x05,0x03,0x06,0x07,0x05,0x07,0x06,0x04, +0x07,0x07,0x03,0x03,0x06,0x03,0x09,0x07,0x07,0x07,0x07,0x04,0x05,0x04,0x07,0x05,0x09,0x05,0x05,0x05,0x03,0x03,0x03,0x08,0x07,0x07,0x07,0x06,0x08,0x09,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x04,0x06,0x06,0x05,0x04,0x05,0x06, +0x04,0x0a,0x0a,0x09,0x03,0x05,0x08,0x09,0x09,0x09,0x08,0x08,0x08,0x06,0x07,0x06,0x07,0x08,0x06,0x04,0x05,0x09,0x09,0x07,0x05,0x03,0x03,0x08,0x07,0x06,0x08,0x07,0x06,0x06,0x09,0x07,0x07,0x09,0x0a,0x0a,0x06,0x0b,0x04,0x04,0x03,0x03,0x08,0x06,0x05,0x05,0x02,0x06,0x03,0x03,0x06,0x06,0x04,0x03,0x03,0x04,0x0d,0x07,0x06,0x07, +0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x09,0x09,0x08,0x08,0x08,0x03,0x04,0x04,0x03,0x03,0x02,0x03,0x02,0x04,0x02,0x04,0x05,0x03,0x06,0x05,0x06,0x05,0x03,0x08,0x07,0x05,0x05,0x06,0x07,0x08,0x08,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x05,0x08,0x07,0x03,0x06,0x05,0x07,0x05,0x07,0x05,0x07,0x05,0x03,0x07,0x06,0x07,0x06,0x08,0x07,0x08, +0x06,0x06,0x06,0x06,0x05,0x03,0x05,0x03,0x05,0x03,0x08,0x07,0x08,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x04,0x06,0x05,0x08,0x07,0x08,0x07,0x06,0x05,0x06,0x05,0x05,0x08,0x07,0x07,0x07,0x05,0x07,0x05,0x09,0x05,0x05,0x04,0x0c,0x07,0x06,0x07,0x03,0x04,0x09,0x04,0x07,0x04,0x04,0x07,0x04,0x07,0x06,0x07,0x05,0x07, +0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x06,0x06,0x06,0x05,0x03,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x06,0x05,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x0b,0x09,0x05,0x05,0x03,0x07,0x06,0x09,0x09,0x09, +0x07,0x03,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x05,0x05,0x03,0x05,0x06,0x07,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x03,0x03,0x03,0x07,0x06,0x09,0x04,0x09,0x07,0x09,0x03,0x07,0x06,0x06,0x06,0x08,0x03,0x06,0x07,0x0a,0x08,0x06,0x09,0x08,0x06,0x06,0x06,0x05,0x06,0x09,0x09,0x03,0x05,0x07,0x05,0x07,0x03,0x07,0x06,0x06,0x05,0x07,0x07,0x03, +0x06,0x05,0x07,0x06,0x05,0x07,0x07,0x05,0x07,0x06,0x09,0x09,0x03,0x07,0x07,0x07,0x09,0x06,0x08,0x05,0x07,0x06,0x03,0x0b,0x0b,0x08,0x06,0x06,0x08,0x07,0x06,0x06,0x05,0x08,0x06,0x0b,0x06,0x08,0x08,0x06,0x07,0x0a,0x08,0x09,0x08,0x06,0x07,0x06,0x06,0x07,0x06,0x08,0x07,0x0b,0x0b,0x08,0x09,0x06,0x07,0x0b,0x07,0x06,0x07,0x06, +0x05,0x06,0x06,0x09,0x05,0x07,0x07,0x06,0x06,0x08,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x09,0x05,0x07,0x07,0x09,0x09,0x07,0x08,0x06,0x05,0x09,0x06,0x06,0x07,0x05,0x05,0x05,0x03,0x09,0x09,0x07,0x06,0x05,0x07,0x05,0x04,0x0b,0x0c,0x07,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x06,0x09,0x07,0x08,0x07,0x03,0x04,0x03,0x03,0x05,0x05, +0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x03,0x03,0x03,0x05,0x05,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09, +0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x04,0x06,0x06,0x08,0x07,0x03,0x04,0x03,0x03,0x06,0x05,0x0b,0x09,0x07,0x06,0x06,0x05,0x08,0x07,0x05,0x05,0x05,0x05,0x07,0x05,0x07, +0x07,0x07,0x07,0x08,0x06,0x08,0x07,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x06,0x07,0x07,0x05,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08, +0x07,0x08,0x07,0x08,0x07,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x05,0x03,0x05,0x03,0x05,0x03,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x06,0x07,0x06,0x07,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x05,0x06,0x05,0x06, +0x05,0x06,0x05,0x06,0x04,0x06,0x04,0x06,0x04,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x05,0x07,0x05,0x0b,0x09,0x0b,0x09,0x06,0x05,0x06,0x05,0x05,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x07,0x04,0x09,0x05,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x05, +0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x05,0x05,0x07,0x07,0x03,0x03,0x07,0x07,0x07,0x07,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a, +0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x09,0x09,0x08,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x06,0x06,0x06,0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07,0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x05,0x08,0x08,0x06,0x06,0x07,0x06,0x06,0x05,0x08,0x07,0x0a,0x03,0x03,0x06,0x05,0x03,0x05, +0x0a,0x08,0x06,0x08,0x0b,0x09,0x07,0x06,0x06,0x06,0x05,0x06,0x03,0x04,0x06,0x04,0x06,0x08,0x08,0x06,0x06,0x06,0x05,0x07,0x07,0x05,0x05,0x06,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x0e,0x0d,0x0b,0x09,0x08,0x06,0x0c,0x0b,0x09,0x07,0x06,0x03,0x03,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x07,0x06, +0x07,0x06,0x09,0x09,0x08,0x06,0x08,0x07,0x06,0x06,0x08,0x06,0x08,0x06,0x07,0x05,0x03,0x0e,0x0d,0x0b,0x08,0x07,0x0b,0x08,0x08,0x07,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x06,0x04,0x07,0x04,0x08,0x07,0x08,0x07,0x06,0x05,0x08,0x07,0x08,0x06,0x06,0x06,0x05,0x07,0x06,0x09,0x07,0x09, +0x07,0x09,0x07,0x09,0x07,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x05,0x05,0x06,0x06,0x03,0x06,0x07,0x06,0x05,0x05,0x06,0x06,0x06,0x03,0x03,0x04,0x03,0x04,0x03,0x07,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x08,0x08,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x03,0x03, +0x03,0x03,0x04,0x04,0x07,0x07,0x06,0x05,0x08,0x05,0x05,0x05,0x06,0x05,0x05,0x04,0x04,0x04,0x05,0x07,0x05,0x06,0x06,0x06,0x03,0x05,0x04,0x06,0x04,0x04,0x0a,0x0a,0x0b,0x07,0x05,0x08,0x09,0x06,0x06,0x05,0x05,0x06,0x07,0x06,0x07,0x06,0x07,0x09,0x06,0x08,0x06,0x06,0x05,0x05,0x05,0x07,0x06,0x07,0x05,0x0a,0x09,0x07,0x06,0x07, +0x06,0x07,0x05,0x07,0x05,0x07,0x06,0x06,0x04,0x06,0x06,0x05,0x03,0x08,0x05,0x05,0x0a,0x07,0x07,0x06,0x0a,0x08,0x07,0x05,0x0a,0x08,0x08,0x06,0x0a,0x08,0x06,0x05,0x09,0x08,0x08,0x06,0x08,0x06,0x08,0x06,0x0e,0x0c,0x09,0x07,0x0c,0x0a,0x0a,0x07,0x06,0x05,0x06,0x04,0x05,0x00,0x00,0x0b,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x06, +0x05,0x06,0x05,0x08,0x06,0x09,0x07,0x0b,0x09,0x08,0x06,0x07,0x05,0x06,0x05,0x0a,0x08,0x08,0x06,0x09,0x07,0x09,0x07,0x03,0x0b,0x09,0x06,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x09,0x09,0x06,0x06,0x08,0x06,0x08,0x06,0x0b,0x09,0x06,0x05,0x06,0x05,0x08,0x07,0x08,0x07,0x09,0x07,0x08,0x07,0x07,0x05,0x06,0x05,0x06,0x05, +0x06,0x05,0x07,0x07,0x09,0x08,0x06,0x07,0x09,0x09,0x09,0x08,0x06,0x05,0x0a,0x09,0x0b,0x09,0x08,0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x06,0x04,0x04,0x02,0x02,0x02,0x02,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x02,0x04,0x04,0x02,0x02,0x06,0x06, +0x06,0x06,0x04,0x03,0x03,0x04,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x03,0x02,0x03,0x03,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04, +0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06, +0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x07,0x04,0x07,0x07,0x04,0x04,0x04,0x04,0x04,0x03, +0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x07,0x09,0x05,0x05,0x06,0x06,0x05,0x05,0x03,0x03,0x06,0x04,0x08,0x07,0x07,0x05,0x07,0x07,0x07,0x0a,0x06,0x07,0x07,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x06,0x05,0x09,0x05,0x05,0x05,0x06,0x05,0x05, +0x07,0x05,0x07,0x06,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x05,0x05,0x02,0x03,0x04,0x03,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x03,0x05,0x06,0x03,0x03,0x04,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x02,0x03,0x05,0x04,0x04,0x03,0x04,0x04,0x04,0x02,0x04,0x04,0x05,0x03,0x04,0x04,0x03,0x04,0x04,0x03,0x02,0x02,0x04,0x03,0x04,0x03, +0x04,0x04,0x03,0x06,0x02,0x04,0x06,0x0a,0x07,0x06,0x06,0x09,0x07,0x09,0x08,0x06,0x06,0x06,0x05,0x0c,0x05,0x06,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x02,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x05,0x04,0x07,0x07,0x04,0x09,0x06,0x07,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x06,0x0a,0x07,0x04,0x03,0x06, +0x06,0x07,0x07,0x07,0x04,0x07,0x06,0x03,0x09,0x07,0x07,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x05,0x05,0x08,0x03,0x05,0x03,0x07,0x05,0x04,0x03,0x03,0x04,0x03,0x02,0x02,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03, +0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x05,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, +0x0f,0x0f,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x09,0x07,0x08,0x06,0x08,0x07,0x0a,0x08,0x06,0x04,0x06,0x08,0x06,0x09,0x08,0x00,0x00,0x00,0x00,0x03,0x03,0x03, +0x03,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x0b,0x05,0x03,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x0b,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x04,0x06,0x04,0x08,0x07,0x06,0x04,0x09,0x06,0x09,0x03,0x04,0x06,0x06,0x07,0x07,0x07,0x06,0x06,0x06,0x09,0x03,0x06,0x03,0x06,0x05,0x03,0x03, +0x06,0x03,0x08,0x03,0x0a,0x06,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0d,0x0f,0x0f,0x09,0x09,0x06,0x06,0x02,0x0b,0x08,0x09,0x07,0x06,0x07,0x06,0x06,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x07,0x00,0x07,0x07,0x07,0x04,0x06,0x06,0x0a,0x04,0x0a,0x04,0x06,0x07,0x06,0x05,0x0a,0x06,0x0a,0x06, +0x08,0x09,0x04,0x06,0x06,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x0a,0x04,0x06,0x05,0x07,0x06,0x04,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x03,0x06,0x04,0x0b,0x06,0x06,0x07,0x07,0x0b,0x06,0x00,0x00,0x00,0x07,0x00,0x07,0x07,0x07,0x07,0x08,0x07,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06, +0x08,0x09,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x06,0x06,0x06,0x06,0x0b,0x0b, +0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x08,0x08,0x0c,0x0b,0x0a,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x07,0x04,0x07,0x04,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x0a,0x08,0x09,0x04, +0x06,0x08,0x09,0x08,0x09,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x09,0x0f,0x0b,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x04,0x06,0x06,0x07,0x0e,0x09,0x06,0x11,0x0c,0x04, +0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x05,0x08,0x07,0x07,0x06,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x0e,0x11,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x05,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x0d, +0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0a,0x06,0x06,0x0a,0x06,0x06,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x07,0x04,0x04,0x05,0x05,0x0d,0x09,0x07,0x06,0x06,0x00,0x06,0x06,0x06,0x04,0x06,0x08,0x07,0x06,0x06,0x04,0x03,0x08,0x06,0x07, +0x04,0x06,0x05,0x05,0x05,0x05,0x03,0x06,0x05,0x07,0x05,0x06,0x05,0x06,0x05,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x05,0x05,0x03,0x06,0x06,0x07,0x06,0x04,0x08,0x06,0x07,0x06,0x07,0x05,0x06,0x06,0x04,0x08,0x04,0x05,0x05,0x05,0x07,0x07,0x06,0x0b,0x06,0x0b,0x04,0x03,0x02,0x06,0x02,0x01,0x00,0x02, +0x02,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0a,0x05,0x08,0x07,0x0b,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x09,0x05,0x09,0x05,0x09,0x07,0x08,0x08,0x08,0x08,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x06,0x0c,0x09,0x05,0x05,0x03, +0x03,0x03,0x04,0x03,0x06,0x03,0x03,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x07,0x06,0x05,0x05,0x07,0x03,0x04,0x07,0x07,0x03,0x06,0x06,0x06,0x08,0x07,0x03,0x04,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x06,0x09,0x08,0x06,0x06,0x06,0x03,0x04,0x06,0x06, +0x06,0x06,0x06,0x07,0x07,0x05,0x07,0x06,0x06,0x08,0x06,0x08,0x06,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x06,0x05,0x05,0x07,0x03,0x04,0x07,0x03,0x06,0x06,0x06,0x07,0x04,0x07,0x07,0x07,0x06,0x07,0x06,0x09,0x08,0x03,0x06,0x06,0x07,0x07,0x0d,0x00,0x07,0x06,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x08,0x07,0x07,0x08,0x06,0x07,0x08,0x08,0x05,0x07,0x08,0x08,0x07,0x08,0x09,0x09,0x07,0x06,0x06,0x08,0x08,0x06,0x08,0x07,0x07,0x07,0x08,0x08,0x06,0x07,0x07,0x07,0x09,0x07,0x07,0x07,0x07,0x09,0x05,0x06, +0x06,0x0a,0x06,0x06,0x08,0x0a,0x07,0x06,0x0c,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x08,0x09,0x0a,0x06,0x09,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x08,0x06,0x07,0x07,0x06,0x06,0x07,0x0b,0x06,0x06,0x06,0x06,0x05,0x04,0x06,0x06,0x06,0x06,0x06,0x0a,0x06,0x0a,0x05,0x06,0x0a,0x07,0x06,0x0a,0x08,0x08,0x0a,0x06,0x06,0x0a,0x0a, +0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x07,0x06,0x06,0x06,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x09,0x08,0x07,0x06,0x09,0x07,0x08,0x06,0x07,0x08,0x08,0x08,0x06,0x08,0x07,0x08,0x07,0x09,0x08,0x08,0x08,0x08,0x07,0x08,0x07,0x08,0x09,0x07,0x08,0x08,0x01,0x01,0x02,0x02,0x02,0x03,0x04,0x09,0x06, +0x07,0x07,0x06,0x07,0x06,0x06,0x07,0x07,0x06,0x03,0x09,0x06,0x06,0x07,0x06,0x07,0x06,0x06,0x03,0x06,0x06,0x07,0x05,0x09,0x06,0x06,0x07,0x07,0x09,0x06,0x06,0x04,0x09,0x06,0x07,0x08,0x07,0x03,0x03,0x0c,0x0c,0x0c,0x0c,0x10,0x06,0x06,0x03,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x07,0x03,0x03,0x05,0x05,0x08,0x07,0x07,0x05,0x07,0x05,0x05,0x05,0x07,0x06,0x09,0x06,0x05,0x05,0x08,0x09,0x05,0x07,0x05, +0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x06,0x03,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07, +0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x08,0x07,0x06,0x05,0x04,0x06,0x05,0x05,0x07,0x07,0x03,0x05,0x06,0x08,0x07,0x05,0x07,0x07,0x05,0x05,0x05,0x05,0x07,0x06,0x07,0x07,0x06,0x05,0x07,0x03,0x07,0x05,0x07,0x03,0x05, +0x05,0x06,0x04,0x06,0x05,0x03,0x03,0x03,0x09,0x09,0x07,0x05,0x05,0x07,0x06,0x05,0x05,0x04,0x06,0x05,0x08,0x05,0x07,0x07,0x05,0x06,0x08,0x07,0x07,0x07,0x05,0x06,0x05,0x05,0x07,0x06,0x07,0x06,0x09,0x09,0x06,0x08,0x05,0x06,0x09,0x05,0x04,0x06,0x06,0x07,0x0a,0x0a,0x07,0x06,0x06,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x06, +0x06,0x04,0x07,0x07,0x06,0x06,0x05,0x0a,0x08,0x05,0x06,0x07,0x07,0x07,0x07,0x08,0x08,0x04,0x0b,0x06,0x05,0x06,0x07,0x07,0x06,0x06,0x03,0x09,0x08,0x08,0x05,0x08,0x03,0x03,0x05,0x05,0x03,0x03,0x07,0x04,0x03,0x09,0x08,0x03,0x02,0x02,0x05,0x04,0x04,0x03,0x03,0x03,0x04,0x07,0x05,0x03,0x07,0x08,0x07,0x06,0x06,0x08,0x07,0x07, +0x04,0x05,0x06,0x05,0x02,0x03,0x04,0x06,0x04,0x07,0x07,0x07,0x0a,0x08,0x0a,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x08,0x09,0x04,0x04,0x06,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x06,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x06,0x06,0x0a,0x0a,0x06,0x06,0x08,0x09,0x04, +0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x0b,0x08,0x09,0x06,0x06,0x06,0x07,0x04,0x07,0x08,0x06,0x06,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0a,0x04,0x08,0x06,0x06,0x03,0x06,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06, +0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x06,0x06,0x08,0x06,0x06,0x0a,0x06,0x0c,0x0b,0x0a,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x07, +0x07,0x07,0x07,0x07,0x04,0x07,0x07,0x04,0x04,0x07,0x04,0x07,0x04,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x00,0x0d,0x09,0x0f,0x0b,0x0a,0x06,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x05,0x0d,0x09,0x0b,0x0b,0x0a,0x0a,0x0a, +0x06,0x06,0x06,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x0d,0x09,0x06,0x07,0x06,0x06,0x06,0x07,0x06,0x06,0x0d,0x0d,0x09,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x06,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x06,0x07,0x06,0x06,0x0d,0x0d,0x09,0x09,0x0d,0x0d, +0x09,0x09,0x09,0x09,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, +0x0a,0x0a,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x09,0x07,0x07,0x07,0x03,0x03,0x06,0x05,0x06,0x07,0x06,0x06,0x06,0x07, +0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x07,0x08,0x09,0x07,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x07,0x07,0x07,0x06,0x07,0x06,0x07,0x07,0x06,0x06,0x08,0x07,0x08,0x07,0x07,0x07,0x06,0x06,0x08, +0x08,0x08,0x08,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x0a,0x09,0x06,0x08,0x09,0x08,0x07,0x09,0x08,0x08,0x08,0x07,0x07,0x08,0x09,0x08,0x07,0x08,0x06,0x06,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x08,0x09,0x08,0x08,0x08,0x07,0x0a,0x08,0x09,0x08,0x08,0x06,0x08,0x08,0x08,0x09,0x08,0x08,0x0a,0x06,0x06,0x06,0x06,0x07,0x07, +0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x05,0x06,0x06,0x06,0x07,0x08,0x09,0x07,0x07,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x06,0x05,0x05,0x07,0x05,0x06,0x05,0x06,0x09,0x06,0x09,0x06,0x06,0x06,0x08,0x03,0x09,0x08,0x08,0x07,0x06,0x08,0x07, +0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x0a,0x0a,0x0a,0x0a,0x05,0x08,0x08,0x05,0x04,0x05,0x06,0x06,0x05,0x09,0x09,0x09,0x05, +0x0b,0x05,0x09,0x09,0x09,0x09,0x06,0x05,0x05,0x09,0x06,0x09,0x07,0x06,0x05,0x04,0x0b,0x05,0x06,0x05,0x05,0x05,0x05,0x05,0x0f,0x09,0x09,0x05,0x03,0x05,0x03,0x05,0x03,0x03,0x03,0x05,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x05,0x09,0x03,0x0a,0x0a,0x0a,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x0d,0x0d,0x07,0x0d,0x0d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x06,0x05,0x06,0x05,0x04,0x04,0x08,0x06,0x08,0x05,0x0c,0x0a,0x07,0x06,0x0a,0x09,0x09,0x08,0x0b,0x09,0x0a,0x09,0x07,0x05, +0x08,0x06,0x0a,0x08,0x08,0x07,0x08,0x07,0x0a,0x07,0x0a,0x07,0x0c,0x09,0x08,0x06,0x08,0x06,0x0d,0x0a,0x09,0x00,0x0b,0x0b,0x0b,0x05,0x00,0x00,0x06,0x06,0x08,0x06,0x06,0x05,0x0c,0x0a,0x0a,0x09,0x08,0x06,0x08,0x06,0x06,0x05,0x08,0x07,0x06,0x05,0x09,0x07,0x07,0x06,0x0b,0x09,0x06,0x06,0x08,0x08,0x09,0x05,0x02,0x05,0x08,0x05, +0x0b,0x0b,0x03,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x04,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x07,0x08,0x03,0x02,0x03,0x02,0x08,0x06,0x08,0x07,0x06,0x05,0x06,0x05,0x07,0x06,0x05,0x05,0x0c,0x09,0x0d,0x0a,0x0b,0x09,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x07,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x03,0x05, +0x03,0x08,0x06,0x09,0x07,0x0f,0x0b,0x06,0x06,0x08,0x08,0x09,0x09,0x08,0x06,0x0b,0x09,0x06,0x04,0x06,0x05,0x07,0x05,0x0a,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x05,0x04,0x05,0x04,0x05,0x04,0x06,0x06,0x03,0x07,0x04,0x0b,0x07,0x04,0x06,0x07,0x05,0x08,0x06,0x04,0x04,0x06,0x06,0x06,0x05,0x03,0x08,0x07,0x04,0x04,0x07,0x05,0x08, +0x04,0x09,0x07,0x07,0x05,0x08,0x06,0x06,0x05,0x08,0x06,0x07,0x04,0x06,0x05,0x08,0x05,0x06,0x09,0x05,0x06,0x0a,0x03,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x05,0x07,0x08,0x0a,0x08,0x0a,0x03,0x05,0x07,0x09,0x0b,0x08,0x0b,0x07,0x07,0x09,0x08,0x0d,0x0a,0x06,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x09,0x09, +0x09,0x09,0x0b,0x06,0x06,0x0b,0x08,0x06,0x06,0x08,0x07,0x04,0x04,0x07,0x06,0x06,0x06,0x06,0x08,0x04,0x04,0x09,0x08,0x04,0x04,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x06,0x04,0x06,0x06, +0x08,0x07,0x06,0x0a,0x07,0x08,0x08,0x09,0x09,0x06,0x05,0x0b,0x09,0x0b,0x09,0x08,0x06,0x03,0x03,0x06,0x07,0x04,0x07,0x06,0x06,0x05,0x08,0x09,0x04,0x06,0x05,0x02,0x04,0x06,0x06,0x02,0x02,0x02,0x02,0x04,0x04,0x04,0x05,0x10,0x16,0x04,0x05,0x01,0x03,0x04,0x05,0x03,0x05,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, +0x05,0x05,0x05,0x05,0x05,0x0f,0x06,0x08,0x0a,0x0a,0x07,0x05,0x07,0x08,0x08,0x05,0x03,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x08,0x07,0x06,0x06,0x08,0x07,0x09,0x05,0x06,0x07,0x04,0x06,0x04,0x04,0x03,0x0a,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x06,0x03,0x06,0x05,0x07,0x05,0x07,0x03,0x06,0x07,0x09,0x09,0x07, +0x06,0x06,0x06,0x06,0x05,0x06,0x05,0x05,0x03,0x04,0x03,0x02,0x04,0x06,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x03,0x03,0x03,0x03,0x03,0x13,0x0b,0x0a,0x0c,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x0a,0x04,0x04,0x0a,0x03,0x06, +0x06,0x0f,0x0b,0x0b,0x0f,0x0a,0x06,0x06,0x0a,0x06,0x06,0x05,0x05,0x00,0x00,0x04,0x08,0x07,0x08,0x06,0x0e,0x0b,0x08,0x06,0x08,0x06,0x0f,0x0b,0x08,0x06,0x04,0x03,0x07,0x00,0x08,0x06,0x04,0x03,0x02,0x05,0x04,0x04,0x03,0x02,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x06,0x06,0x06,0x0b,0x09,0x09,0x09,0x09, +0x0a,0x07,0x08,0x07,0x04,0x0a,0x0c,0x05,0x0d,0x06,0x09,0x0a,0x0a,0x0a,0x05,0x08,0x0b,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x06,0x06,0x09,0x06,0x06,0x0a,0x04,0x04,0x0a,0x04,0x04,0x0a,0x05,0x05,0x00,0x05,0x09,0x04,0x04,0x0b,0x06,0x06,0x08,0x06,0x06,0x07,0x03,0x03, +0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x11,0x11,0x0a,0x00,0x00,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x0a,0x07,0x07,0x09,0x0b,0x07,0x07,0x0c,0x07,0x07,0x0a,0x07,0x07,0x09,0x07,0x08,0x09,0x0a,0x07,0x08,0x07,0x08,0x07,0x08, +0x07,0x07,0x08,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x06,0x09,0x07,0x07,0x07,0x08,0x05,0x06,0x07,0x09,0x09,0x06,0x00,0x00,0x0c,0x18,0x08,0x00,0x01,0x03,0x03,0x05,0x07,0x06,0x0a,0x0a,0x03,0x04,0x04,0x05,0x08,0x03,0x05,0x03,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x08,0x08,0x08,0x05,0x0b,0x08,0x07, +0x08,0x08,0x06,0x06,0x08,0x09,0x03,0x04,0x07,0x06,0x0b,0x09,0x09,0x07,0x09,0x07,0x06,0x06,0x08,0x07,0x0b,0x07,0x07,0x07,0x04,0x05,0x04,0x08,0x05,0x03,0x06,0x07,0x06,0x07,0x06,0x04,0x07,0x07,0x03,0x03,0x06,0x03,0x0b,0x07,0x07,0x07,0x07,0x04,0x05,0x04,0x07,0x06,0x09,0x06,0x06,0x05,0x04,0x03,0x04,0x08,0x08,0x08,0x08,0x06, +0x09,0x09,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x06,0x06,0x05,0x05,0x06,0x07,0x05,0x0b,0x0b,0x09,0x03,0x05,0x08,0x0a,0x09,0x0a,0x08,0x08,0x08,0x06,0x07,0x06,0x07,0x09,0x06,0x05,0x05,0x09,0x0a,0x07,0x05,0x03,0x03,0x08, +0x08,0x06,0x08,0x08,0x06,0x06,0x09,0x08,0x08,0x09,0x0b,0x0b,0x06,0x0c,0x05,0x05,0x03,0x03,0x08,0x07,0x06,0x07,0x02,0x06,0x04,0x04,0x07,0x07,0x05,0x03,0x03,0x05,0x0f,0x08,0x06,0x08,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x09,0x09,0x08,0x08,0x08,0x03,0x04,0x04,0x04,0x04,0x02,0x03,0x02,0x04,0x02,0x04,0x06,0x03,0x06,0x05,0x07, +0x05,0x03,0x08,0x07,0x07,0x06,0x07,0x07,0x08,0x08,0x04,0x04,0x04,0x0b,0x0b,0x0b,0x06,0x08,0x07,0x03,0x06,0x05,0x08,0x06,0x08,0x06,0x07,0x05,0x03,0x08,0x06,0x08,0x06,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x03,0x06,0x04,0x06,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x04,0x06,0x05,0x08,0x07, +0x08,0x07,0x07,0x05,0x07,0x05,0x06,0x09,0x09,0x07,0x07,0x05,0x07,0x06,0x09,0x05,0x06,0x05,0x0d,0x07,0x06,0x07,0x03,0x05,0x0a,0x04,0x07,0x04,0x04,0x07,0x04,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x07, +0x06,0x06,0x06,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x06,0x05,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x0b,0x09,0x07,0x06,0x03,0x08,0x06,0x0a,0x0a,0x09,0x07,0x03,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x07,0x06,0x03,0x05,0x06,0x07,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x03,0x03,0x03,0x08,0x07,0x09,0x05,0x0a, +0x08,0x0a,0x03,0x08,0x07,0x06,0x07,0x09,0x03,0x07,0x08,0x0b,0x09,0x06,0x09,0x09,0x07,0x06,0x06,0x07,0x07,0x09,0x09,0x03,0x07,0x07,0x05,0x07,0x03,0x07,0x07,0x06,0x05,0x07,0x07,0x03,0x06,0x06,0x07,0x06,0x05,0x07,0x07,0x06,0x07,0x06,0x09,0x0b,0x03,0x07,0x07,0x07,0x0b,0x06,0x08,0x06,0x07,0x06,0x03,0x0c,0x0c,0x09,0x07,0x07, +0x09,0x08,0x07,0x07,0x06,0x08,0x06,0x0b,0x07,0x09,0x09,0x07,0x08,0x0b,0x09,0x09,0x09,0x07,0x08,0x06,0x07,0x09,0x07,0x09,0x08,0x0b,0x0c,0x08,0x09,0x07,0x07,0x0c,0x07,0x06,0x07,0x06,0x05,0x06,0x06,0x09,0x05,0x07,0x07,0x06,0x07,0x09,0x07,0x07,0x07,0x07,0x06,0x05,0x06,0x09,0x06,0x07,0x07,0x0b,0x0b,0x07,0x09,0x06,0x06,0x0a, +0x06,0x06,0x07,0x05,0x06,0x05,0x03,0x09,0x0a,0x07,0x06,0x06,0x07,0x06,0x05,0x0c,0x0d,0x08,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x07,0x09,0x07,0x08,0x07,0x04,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08, +0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08, +0x07,0x08,0x07,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x04,0x06,0x06,0x09,0x07,0x03,0x04,0x03,0x03,0x06,0x05,0x0c,0x09,0x07,0x06,0x07,0x06,0x09,0x07,0x07,0x06,0x07,0x06,0x08,0x06,0x08,0x07,0x08,0x07,0x09,0x06,0x09,0x07,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x06,0x07, +0x07,0x07,0x07,0x07,0x07,0x08,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x0b,0x0b,0x0b,0x0b,0x0b, +0x0b,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x04,0x06,0x04,0x06,0x04,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x06,0x07,0x06,0x0b,0x09,0x0b, +0x09,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x05,0x07,0x05,0x07,0x05,0x07,0x04,0x09,0x06,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x03, +0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x05,0x05,0x07,0x07,0x03,0x03,0x07, +0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08, +0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x07,0x07,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x08,0x09,0x07,0x07,0x07,0x06,0x07,0x06,0x08,0x07,0x0a,0x03,0x03,0x07,0x06,0x03,0x06,0x0b,0x09,0x07,0x09,0x0c,0x09,0x07,0x07,0x07,0x06,0x05,0x06,0x04,0x04,0x06,0x04,0x06,0x09,0x09,0x07,0x06,0x07,0x05,0x07,0x07,0x05,0x05,0x06, +0x06,0x05,0x05,0x07,0x03,0x05,0x05,0x03,0x0f,0x0e,0x0c,0x0a,0x09,0x06,0x0d,0x0c,0x0a,0x08,0x06,0x03,0x03,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x08,0x06,0x08,0x06,0x0a,0x0a,0x08,0x07,0x08,0x07,0x07,0x06,0x09,0x07,0x09,0x07,0x07,0x05,0x03,0x0f,0x0e,0x0c,0x08,0x07,0x0c,0x08,0x09,0x07,0x08,0x06, +0x08,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x08,0x07,0x08,0x07,0x06,0x05,0x09,0x07,0x09,0x07,0x07,0x07,0x05,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x06,0x07,0x05,0x05,0x06,0x07,0x03,0x07, +0x07,0x06,0x06,0x05,0x07,0x07,0x07,0x03,0x03,0x04,0x03,0x05,0x03,0x07,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x08,0x09,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x04,0x04,0x07,0x07,0x07,0x06,0x09,0x06,0x05,0x05,0x06,0x05,0x05,0x04,0x04,0x04,0x06,0x07,0x06,0x07,0x06,0x07,0x03,0x06,0x05,0x07, +0x04,0x04,0x0b,0x0b,0x0c,0x07,0x06,0x09,0x0a,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x08,0x07,0x08,0x0a,0x07,0x08,0x07,0x07,0x05,0x06,0x05,0x07,0x06,0x07,0x06,0x0b,0x0a,0x07,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x08,0x07,0x07,0x05,0x07,0x07,0x06,0x03,0x09,0x06,0x06,0x0a,0x08,0x08,0x07,0x0b,0x09,0x08,0x06,0x0a,0x08,0x09,0x07, +0x0b,0x09,0x06,0x05,0x09,0x09,0x09,0x07,0x09,0x07,0x09,0x07,0x10,0x0d,0x0a,0x08,0x0e,0x0b,0x0a,0x08,0x07,0x05,0x06,0x05,0x05,0x00,0x00,0x0c,0x0b,0x07,0x06,0x07,0x07,0x07,0x06,0x06,0x05,0x07,0x06,0x09,0x07,0x0a,0x08,0x0c,0x0a,0x09,0x07,0x07,0x06,0x06,0x05,0x0a,0x08,0x08,0x07,0x0a,0x08,0x0a,0x08,0x03,0x0b,0x09,0x07,0x06, +0x09,0x07,0x08,0x07,0x08,0x06,0x08,0x06,0x0a,0x0a,0x06,0x06,0x09,0x06,0x09,0x06,0x0b,0x09,0x07,0x05,0x06,0x05,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x08,0x07,0x09,0x09,0x07,0x07,0x0a,0x0a,0x0a,0x09,0x07,0x06,0x0b,0x0a,0x0c,0x0a,0x09,0x06,0x08,0x07,0x07,0x07,0x07,0x06,0x07,0x04, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x07,0x04,0x04,0x02,0x03,0x03,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x04,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x03,0x03,0x03,0x05,0x05,0x05,0x05, +0x05,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05, +0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07, +0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x08,0x04,0x07,0x07,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x06,0x08,0x0a,0x06, +0x06,0x07,0x07,0x05,0x05,0x03,0x04,0x06,0x05,0x09,0x07,0x07,0x06,0x07,0x07,0x07,0x0b,0x06,0x07,0x07,0x06,0x05,0x05,0x05,0x06,0x07,0x09,0x07,0x06,0x09,0x05,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x07,0x07,0x04,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x05,0x02,0x03,0x04,0x03,0x06,0x05,0x05,0x05,0x05,0x04,0x04,0x03,0x05,0x06,0x04, +0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x02,0x04,0x06,0x04,0x04,0x03,0x04,0x04,0x04,0x02,0x04,0x04,0x06,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0x03,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x07,0x02,0x04,0x07,0x0b,0x07,0x06,0x06,0x0a,0x08,0x0a,0x09,0x06,0x07,0x06,0x05,0x0e,0x05,0x07,0x0b,0x0b,0x0b,0x08,0x08,0x08, +0x06,0x06,0x06,0x05,0x05,0x06,0x02,0x00,0x00,0x00,0x00,0x07,0x07,0x08,0x07,0x06,0x05,0x07,0x07,0x04,0x0a,0x07,0x07,0x04,0x04,0x06,0x04,0x05,0x07,0x06,0x07,0x0b,0x08,0x04,0x03,0x07,0x06,0x07,0x07,0x07,0x04,0x07,0x06,0x03,0x0b,0x07,0x07,0x04,0x05,0x05,0x06,0x06,0x05,0x06,0x07,0x07,0x06,0x05,0x05,0x09,0x03,0x06,0x03,0x07, +0x05,0x04,0x03,0x03,0x04,0x03,0x02,0x02,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x06,0x06,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x04,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x06,0x04,0x03,0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x08,0x09,0x07,0x09,0x08,0x0b,0x09,0x06,0x05,0x06,0x08,0x06,0x0a,0x08,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x05,0x03,0x06,0x07,0x05,0x06,0x06,0x07,0x07,0x06,0x0c,0x07,0x07,0x07,0x07, +0x07,0x07,0x06,0x06,0x08,0x06,0x06,0x06,0x04,0x07,0x04,0x09,0x08,0x06,0x04,0x0a,0x06,0x0a,0x03,0x04,0x07,0x07,0x08,0x08,0x08,0x07,0x07,0x07,0x0a,0x03,0x07,0x03,0x06,0x05,0x03,0x03,0x06,0x03,0x09,0x03,0x0b,0x06,0x0b,0x0b,0x07,0x07,0x07,0x06,0x06,0x05,0x05,0x0e,0x0e,0x10,0x10,0x0a,0x0a,0x06,0x06,0x02,0x0c,0x09,0x0a,0x08, +0x07,0x08,0x06,0x06,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x08,0x00,0x08,0x08,0x08,0x04,0x06,0x06,0x0b,0x04,0x0b,0x04,0x07,0x08,0x07,0x05,0x0b,0x06,0x0b,0x06,0x09,0x0a,0x04,0x06,0x06,0x05,0x03,0x06,0x07,0x06,0x07,0x06,0x07,0x07,0x06,0x08,0x08,0x0b,0x04,0x06,0x05,0x08,0x06,0x04,0x06,0x06,0x06,0x0b, +0x04,0x0b,0x04,0x03,0x07,0x05,0x0c,0x06,0x06,0x08,0x08,0x0c,0x06,0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x09,0x08,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x09,0x0a,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x07,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x06,0x07,0x07,0x07,0x0c,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0c,0x06,0x06,0x09,0x09,0x0d,0x0c,0x0b,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0b,0x06,0x0b,0x06,0x0b, +0x06,0x0b,0x06,0x0b,0x06,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x08,0x04,0x08,0x04,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0b,0x09,0x0a,0x04,0x06,0x09,0x0a,0x09,0x0a,0x00,0x00,0x00,0x00,0x00,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x0a, +0x10,0x0c,0x06,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x0b,0x0b,0x04,0x07,0x07,0x07,0x0f,0x0a,0x06,0x12,0x0d,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x05,0x09,0x08,0x08,0x06,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x0f,0x12,0x00, +0x00,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x08,0x07,0x06,0x06,0x05,0x0e,0x0a,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06, +0x07,0x07,0x07,0x07,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x08,0x04,0x04,0x05,0x05,0x0e,0x0a,0x08,0x07,0x07,0x00,0x06,0x06,0x06,0x04,0x07,0x08,0x08,0x06,0x06,0x04,0x03,0x09,0x07,0x07,0x04,0x07,0x06,0x06,0x06,0x06,0x03,0x06,0x05,0x07,0x06,0x07,0x06,0x07,0x05,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x05, +0x06,0x06,0x03,0x06,0x07,0x07,0x06,0x04,0x09,0x07,0x08,0x06,0x07,0x06,0x07,0x06,0x05,0x08,0x04,0x05,0x05,0x06,0x07,0x07,0x06,0x0c,0x06,0x0c,0x04,0x03,0x02,0x06,0x03,0x02,0x00,0x02,0x03,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x05,0x09,0x07,0x0b,0x09,0x07,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x0b,0x0b,0x0a,0x06,0x0a,0x06,0x0a,0x08,0x08,0x08,0x08,0x09,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x09,0x07,0x0d,0x0a,0x06,0x06,0x03,0x03,0x03,0x04,0x03,0x07,0x03,0x03,0x0a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x00,0x03, +0x00,0x00,0x08,0x07,0x05,0x06,0x08,0x03,0x04,0x08,0x08,0x03,0x07,0x07,0x07,0x08,0x08,0x03,0x05,0x08,0x07,0x07,0x08,0x07,0x07,0x08,0x07,0x09,0x09,0x06,0x06,0x06,0x03,0x05,0x07,0x07,0x07,0x07,0x06,0x07,0x08,0x06,0x08,0x07,0x07,0x08,0x07,0x09,0x07,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x07,0x05,0x06,0x08,0x04,0x04,0x08,0x04, +0x07,0x07,0x07,0x08,0x05,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x09,0x03,0x07,0x07,0x08,0x08,0x0e,0x00,0x08,0x07,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x09,0x08,0x08,0x08, +0x07,0x08,0x09,0x09,0x06,0x08,0x09,0x09,0x08,0x09,0x0a,0x09,0x08,0x07,0x07,0x09,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x08,0x08,0x08,0x09,0x08,0x07,0x08,0x08,0x0a,0x06,0x07,0x07,0x0b,0x06,0x06,0x09,0x0b,0x07,0x06,0x0d,0x07,0x07,0x09,0x06,0x06,0x09,0x07,0x09,0x0a,0x0b,0x06,0x09,0x06,0x08,0x07,0x07,0x07,0x08,0x06, +0x07,0x09,0x06,0x07,0x08,0x06,0x06,0x07,0x0b,0x06,0x06,0x07,0x07,0x05,0x04,0x07,0x07,0x07,0x06,0x07,0x0b,0x07,0x0b,0x06,0x07,0x0b,0x08,0x07,0x0b,0x09,0x09,0x0b,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x07,0x07,0x07,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x08, +0x07,0x09,0x08,0x08,0x07,0x08,0x08,0x09,0x09,0x07,0x08,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x08,0x08,0x08,0x09,0x0a,0x08,0x09,0x09,0x01,0x01,0x02,0x02,0x02,0x03,0x04,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x04,0x0a,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x03,0x07,0x06,0x07,0x05,0x0a,0x07,0x07,0x07,0x07, +0x0a,0x07,0x07,0x05,0x0a,0x07,0x07,0x08,0x08,0x03,0x03,0x0e,0x0d,0x0d,0x0e,0x11,0x06,0x06,0x03,0x06,0x05,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x07,0x05,0x05,0x07,0x07,0x03,0x04,0x06,0x05,0x09,0x08,0x07,0x06,0x07,0x06,0x05,0x05,0x07,0x06,0x0a,0x06,0x06,0x06,0x08,0x09,0x05,0x08,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06, +0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x06,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x07,0x04,0x06,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06, +0x06,0x08,0x08,0x06,0x06,0x05,0x06,0x05,0x06,0x07,0x07,0x03,0x06,0x06,0x09,0x08,0x05,0x07,0x07,0x06,0x06,0x05,0x06,0x08,0x06,0x08,0x08,0x06,0x05,0x07,0x03,0x07,0x06,0x08,0x03,0x06,0x05,0x07,0x05,0x06,0x05,0x03,0x03,0x04,0x0a,0x0a,0x07,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x07,0x05,0x09,0x05,0x08,0x08,0x06,0x07,0x09,0x07, +0x07,0x07,0x06,0x06,0x05,0x06,0x08,0x06,0x08,0x07,0x0a,0x0a,0x07,0x08,0x06,0x06,0x0a,0x06,0x05,0x07,0x07,0x07,0x0b,0x0b,0x08,0x06,0x07,0x05,0x07,0x07,0x07,0x08,0x06,0x06,0x08,0x07,0x07,0x04,0x08,0x07,0x07,0x06,0x06,0x0b,0x09,0x06,0x06,0x07,0x07,0x07,0x07,0x09,0x08,0x04,0x0b,0x07,0x07,0x07,0x08,0x08,0x06,0x06,0x03,0x09, +0x08,0x08,0x06,0x08,0x03,0x03,0x05,0x05,0x03,0x03,0x07,0x05,0x03,0x09,0x08,0x03,0x03,0x03,0x05,0x05,0x05,0x03,0x03,0x03,0x05,0x08,0x06,0x04,0x07,0x08,0x07,0x07,0x06,0x09,0x07,0x07,0x04,0x05,0x06,0x05,0x03,0x03,0x05,0x06,0x04,0x08,0x08,0x08,0x0b,0x09,0x0b,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x09,0x0a,0x04,0x04,0x06,0x04, +0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x06,0x06,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x06,0x0b,0x0b,0x06,0x06,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x0c,0x09,0x0a,0x06,0x07,0x07,0x08,0x04,0x08,0x09,0x06,0x06,0x04,0x04,0x04,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0b,0x04,0x09,0x06,0x06,0x03,0x06,0x06,0x06,0x06,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x0a,0x0a,0x0c, +0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x06,0x06,0x09,0x06,0x06,0x0b,0x06,0x0d,0x0c,0x0b,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x08,0x08,0x08,0x08,0x08,0x04,0x08,0x08,0x04,0x04,0x08,0x04,0x08,0x04,0x08,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04, +0x06,0x04,0x04,0x04,0x04,0x00,0x0e,0x0a,0x10,0x0c,0x0b,0x06,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x06,0x06,0x05,0x0e,0x0a,0x0c,0x0c,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x08,0x04,0x08,0x04,0x08,0x04,0x0e,0x0a,0x07,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x0e,0x0e,0x0a,0x0a,0x05,0x05,0x07,0x07, +0x07,0x07,0x04,0x04,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x07,0x07,0x07,0x07,0x0b,0x04,0x0b,0x04,0x07,0x08,0x07,0x07,0x0e,0x0e,0x0a,0x0a,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x0a,0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x04,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, +0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x08,0x08,0x03,0x03,0x06,0x05,0x07,0x08,0x07,0x06,0x07,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x07,0x07,0x08,0x07,0x07,0x08,0x06,0x08,0x09,0x08,0x09, +0x0a,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x06,0x06,0x09,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x0a,0x0a,0x07,0x09,0x0a,0x09,0x07,0x0a,0x09,0x08,0x08,0x07,0x08,0x09,0x0a,0x08,0x07,0x08,0x07, +0x06,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0b,0x09,0x0a,0x09,0x09,0x07,0x09,0x08,0x08,0x0a,0x09,0x09,0x0b,0x07,0x06,0x07,0x06,0x07,0x08,0x08,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x07,0x09,0x0a, +0x08,0x08,0x08,0x09,0x08,0x08,0x06,0x06,0x07,0x07,0x06,0x06,0x07,0x07,0x06,0x06,0x08,0x05,0x07,0x06,0x07,0x09,0x07,0x0a,0x06,0x07,0x07,0x09,0x04,0x09,0x08,0x09,0x08,0x07,0x09,0x07,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x06,0x05,0x04,0x04,0x03,0x03, +0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x0b,0x0b,0x0b,0x0b,0x06,0x09,0x09,0x06,0x05,0x06,0x06,0x07,0x06,0x0a,0x0a,0x0a,0x05,0x0c,0x06,0x0a,0x0a,0x0a,0x0a,0x07,0x06,0x06,0x09,0x07,0x09,0x08,0x06,0x05,0x05,0x0c,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x10,0x0a,0x0a,0x05, +0x03,0x05,0x03,0x06,0x03,0x03,0x03,0x06,0x07,0x07,0x07,0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x0a,0x03,0x0b,0x0b,0x0b,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x08,0x0e,0x0e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x07,0x06,0x06,0x05,0x04,0x04,0x08,0x07,0x09,0x05,0x0e,0x0b,0x07,0x07,0x0b,0x0a,0x0a,0x09,0x0c,0x0a,0x0b,0x09,0x08,0x06,0x09,0x07,0x0b,0x09,0x09,0x07,0x09,0x07,0x0a,0x08,0x0b,0x08,0x0d,0x0a,0x09,0x07,0x09,0x07,0x0f,0x0b,0x0a,0x00,0x0c,0x0c,0x0c,0x06,0x00,0x00, +0x07,0x06,0x08,0x07,0x06,0x05,0x0d,0x0b,0x0b,0x0a,0x09,0x07,0x08,0x07,0x06,0x05,0x09,0x07,0x06,0x05,0x0a,0x08,0x08,0x07,0x0c,0x0a,0x06,0x07,0x09,0x09,0x0a,0x05,0x02,0x06,0x08,0x05,0x0c,0x0c,0x03,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x05,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x07,0x07, +0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, +0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, +0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x08,0x09,0x03,0x03,0x03, +0x03,0x09,0x07,0x09,0x08,0x07,0x06,0x06,0x06,0x07,0x07,0x05,0x05,0x0e,0x0a,0x0e,0x0b,0x0c,0x0a,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x06,0x03,0x09,0x07,0x0a,0x08,0x10,0x0c,0x07,0x07,0x08,0x08,0x0a,0x0a,0x09,0x07,0x0c,0x09,0x07,0x05,0x07,0x06,0x07,0x06,0x0b,0x09,0x07,0x06,0x07, +0x07,0x07,0x07,0x06,0x05,0x06,0x05,0x06,0x04,0x06,0x06,0x04,0x08,0x04,0x0b,0x08,0x04,0x07,0x07,0x06,0x09,0x07,0x05,0x04,0x07,0x07,0x07,0x06,0x03,0x09,0x07,0x04,0x04,0x07,0x06,0x09,0x05,0x09,0x07,0x07,0x06,0x08,0x07,0x07,0x06,0x09,0x07,0x07,0x04,0x06,0x05,0x09,0x05,0x06,0x0a,0x06,0x07,0x0b,0x03,0x0e,0x0b,0x0b,0x0e,0x0b, +0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x08,0x08,0x0b,0x08,0x0b,0x03,0x06,0x07,0x0b,0x0c,0x08,0x0c,0x07,0x07,0x0a,0x08,0x0e,0x0b,0x06,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0c,0x06,0x06,0x0c,0x09,0x06,0x06,0x09,0x08,0x04,0x04,0x08,0x07,0x07,0x07,0x07,0x09,0x04,0x04,0x0a,0x09,0x04,0x04,0x0a,0x05,0x05, +0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x06,0x05,0x07,0x06,0x09,0x07,0x07,0x0b,0x08,0x09,0x09,0x0a,0x0a,0x07,0x06,0x0c,0x0a,0x0d,0x0a,0x08,0x07,0x04,0x04,0x07,0x08,0x05,0x07,0x06,0x07,0x06,0x09,0x0a, +0x05,0x07,0x05,0x03,0x04,0x06,0x07,0x03,0x03,0x02,0x03,0x05,0x05,0x05,0x05,0x12,0x18,0x04,0x05,0x02,0x03,0x05,0x05,0x04,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x10,0x06,0x09,0x0b,0x0b,0x08,0x06,0x07,0x09,0x09,0x06,0x04,0x08,0x06,0x08,0x07,0x08,0x06,0x07,0x09,0x07,0x07,0x06, +0x09,0x07,0x0a,0x05,0x06,0x08,0x04,0x07,0x04,0x04,0x03,0x0b,0x07,0x07,0x06,0x06,0x07,0x0b,0x0b,0x0b,0x0c,0x0c,0x07,0x06,0x03,0x06,0x06,0x07,0x05,0x08,0x03,0x07,0x07,0x0a,0x0a,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x04,0x07,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x00,0x03,0x03,0x03,0x03,0x03,0x14,0x0c,0x0a,0x0d,0x03,0x03,0x04,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x0b,0x04,0x04,0x0b,0x03,0x06,0x06,0x10,0x0c,0x0c,0x10,0x0b,0x06,0x06,0x0b,0x06,0x06,0x05,0x05,0x00,0x00,0x04,0x09,0x07,0x09,0x07,0x0f,0x0c,0x08,0x07,0x08,0x07,0x10,0x0c, +0x09,0x07,0x05,0x04,0x07,0x00,0x08,0x06,0x04,0x04,0x02,0x06,0x04,0x04,0x03,0x02,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x07,0x07,0x07,0x0c,0x0b,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x07,0x05,0x0b,0x0e,0x05,0x0e,0x06,0x0a,0x0b,0x0b,0x0b,0x05,0x09,0x0c,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x07,0x07,0x0a,0x06,0x06,0x0b,0x04,0x04,0x0b,0x04,0x04,0x0b,0x06,0x06,0x00,0x05,0x0a,0x04,0x04,0x0c,0x06,0x06,0x09,0x06,0x06,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x12,0x12,0x0b,0x00,0x00,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, +0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x07,0x08,0x08,0x0b,0x08,0x08,0x0a,0x0c,0x08,0x08,0x0d,0x08,0x08,0x0b,0x08,0x08,0x09,0x08,0x09,0x0a,0x0b,0x08,0x09,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x08,0x09,0x07,0x08,0x07,0x09,0x08,0x08,0x08,0x08,0x05,0x06,0x08,0x09,0x09,0x07,0x00,0x00,0x0d,0x1a,0x08,0x00, +0x01,0x04,0x04,0x05,0x08,0x07,0x0b,0x0a,0x03,0x04,0x04,0x05,0x09,0x03,0x05,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x09,0x09,0x09,0x06,0x0c,0x08,0x07,0x08,0x09,0x07,0x06,0x09,0x09,0x03,0x05,0x08,0x06,0x0c,0x0a,0x0a,0x07,0x0a,0x08,0x07,0x07,0x09,0x08,0x0c,0x08,0x07,0x07,0x04,0x05,0x04,0x09, +0x05,0x03,0x07,0x08,0x06,0x08,0x07,0x04,0x08,0x07,0x03,0x03,0x06,0x03,0x0b,0x07,0x08,0x08,0x08,0x05,0x06,0x04,0x07,0x06,0x09,0x06,0x06,0x06,0x04,0x03,0x04,0x09,0x08,0x08,0x08,0x07,0x0a,0x0a,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07, +0x05,0x05,0x07,0x07,0x06,0x05,0x06,0x07,0x05,0x0c,0x0c,0x0a,0x04,0x05,0x09,0x0b,0x0a,0x0b,0x09,0x09,0x09,0x07,0x08,0x07,0x08,0x0a,0x07,0x05,0x06,0x0a,0x0b,0x08,0x06,0x04,0x04,0x09,0x08,0x07,0x09,0x08,0x07,0x07,0x09,0x08,0x08,0x0a,0x0c,0x0c,0x07,0x0d,0x05,0x05,0x03,0x03,0x09,0x08,0x06,0x07,0x02,0x07,0x04,0x04,0x07,0x07, +0x05,0x03,0x03,0x05,0x10,0x08,0x07,0x08,0x07,0x07,0x03,0x03,0x03,0x03,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x03,0x05,0x04,0x04,0x04,0x03,0x04,0x03,0x04,0x02,0x05,0x06,0x03,0x07,0x06,0x07,0x06,0x03,0x09,0x07,0x07,0x06,0x07,0x08,0x09,0x09,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x06,0x09,0x08,0x03,0x07,0x06,0x08,0x06,0x08,0x06,0x08,0x05, +0x03,0x08,0x07,0x08,0x07,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x06,0x03,0x06,0x04,0x06,0x04,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x08,0x05,0x08,0x05,0x07,0x06,0x07,0x04,0x07,0x06,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x06,0x0a,0x09,0x08,0x08,0x06,0x07,0x06,0x09,0x05,0x06,0x05,0x0e,0x08,0x06,0x08,0x03,0x05,0x0a,0x04,0x08,0x05, +0x05,0x08,0x05,0x08,0x07,0x08,0x06,0x08,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x03,0x08,0x06,0x06,0x06,0x03,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x0a,0x08,0x08,0x05,0x07,0x06,0x07,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x0c,0x09, +0x07,0x06,0x03,0x08,0x07,0x0b,0x0b,0x0a,0x08,0x03,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x07,0x06,0x03,0x05,0x07,0x08,0x0c,0x0c,0x0c,0x0c,0x05,0x05,0x03,0x04,0x04,0x08,0x07,0x0a,0x05,0x0a,0x09,0x0b,0x03,0x08,0x07,0x07,0x07,0x09,0x03,0x08,0x08,0x0c,0x0a,0x07,0x0a,0x09,0x07,0x07,0x07,0x07,0x08,0x0b,0x0a,0x03,0x07,0x08,0x06,0x07, +0x03,0x07,0x07,0x07,0x06,0x07,0x08,0x03,0x07,0x06,0x07,0x07,0x06,0x08,0x08,0x06,0x07,0x07,0x09,0x0b,0x03,0x07,0x08,0x07,0x0b,0x07,0x09,0x06,0x08,0x07,0x03,0x0d,0x0d,0x09,0x08,0x07,0x09,0x08,0x07,0x07,0x06,0x09,0x07,0x0b,0x07,0x0a,0x0a,0x08,0x09,0x0c,0x09,0x0a,0x09,0x07,0x08,0x07,0x07,0x09,0x08,0x0a,0x09,0x0d,0x0e,0x09, +0x0a,0x07,0x08,0x0d,0x08,0x07,0x08,0x07,0x05,0x07,0x07,0x09,0x06,0x07,0x07,0x06,0x07,0x09,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x09,0x06,0x07,0x07,0x0b,0x0b,0x08,0x09,0x07,0x06,0x0b,0x07,0x07,0x07,0x05,0x06,0x06,0x03,0x0b,0x0b,0x07,0x06,0x06,0x07,0x06,0x05,0x0d,0x0f,0x08,0x05,0x05,0x05,0x05,0x03,0x07,0x06,0x07,0x0a,0x08, +0x09,0x08,0x04,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03, +0x03,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x07,0x07,0x0a,0x07,0x03,0x05,0x03,0x03,0x07,0x05,0x0c,0x0a,0x08,0x07,0x08,0x06,0x0a, +0x07,0x07,0x07,0x07,0x07,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x0a,0x08,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x04,0x04,0x04,0x04,0x07,0x07,0x08,0x07,0x07,0x08,0x07,0x08,0x07,0x08,0x08,0x06,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06, +0x04,0x09,0x08,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x07,0x08,0x07,0x08,0x08,0x05,0x08,0x05,0x08,0x05,0x08, +0x05,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x06,0x08,0x06,0x0c,0x09,0x0c,0x09,0x08,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x09,0x06,0x07,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x07, +0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x06,0x06,0x07,0x07,0x03,0x03,0x08,0x08,0x07,0x07,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x09,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05, +0x05,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x08,0x08,0x07,0x07,0x07,0x07,0x09,0x09,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x06,0x09,0x0a,0x07,0x08,0x08,0x07,0x07,0x06,0x09, +0x08,0x0b,0x04,0x04,0x08,0x06,0x03,0x06,0x0c,0x0a,0x07,0x0a,0x0d,0x0a,0x08,0x08,0x07,0x07,0x06,0x07,0x04,0x04,0x07,0x04,0x07,0x0a,0x09,0x07,0x07,0x07,0x06,0x08,0x08,0x06,0x05,0x07,0x07,0x05,0x05,0x07,0x03,0x05,0x06,0x04,0x10,0x0f,0x0d,0x0b,0x09,0x07,0x0e,0x0d,0x0b,0x08,0x07,0x03,0x03,0x0a,0x08,0x09,0x07,0x09,0x07,0x09, +0x07,0x09,0x07,0x09,0x07,0x07,0x08,0x07,0x08,0x07,0x0b,0x0b,0x09,0x08,0x09,0x08,0x08,0x06,0x0a,0x08,0x0a,0x08,0x08,0x06,0x03,0x10,0x0f,0x0d,0x09,0x08,0x0d,0x09,0x0a,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x0a,0x08,0x0a,0x08,0x07,0x05,0x08,0x05,0x09,0x07,0x09,0x07,0x07,0x06,0x09,0x07,0x0a,0x08, +0x07,0x07,0x06,0x08,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x07,0x06,0x08,0x07,0x07,0x07,0x08,0x07,0x08,0x08,0x08,0x06,0x06,0x08,0x08,0x07,0x08,0x05,0x05,0x07,0x07,0x04,0x08,0x08,0x07,0x06,0x06,0x07,0x07,0x07,0x03,0x04,0x04,0x04,0x05,0x03,0x08,0x0b,0x0b,0x0b,0x07,0x07,0x08,0x08,0x09,0x09,0x08,0x05,0x05,0x05,0x05, +0x05,0x04,0x04,0x06,0x06,0x05,0x03,0x03,0x04,0x04,0x04,0x04,0x08,0x08,0x07,0x06,0x09,0x06,0x05,0x06,0x07,0x06,0x06,0x05,0x05,0x05,0x06,0x08,0x06,0x07,0x07,0x07,0x03,0x06,0x05,0x08,0x05,0x05,0x0c,0x0c,0x0d,0x08,0x06,0x09,0x0a,0x08,0x07,0x06,0x06,0x07,0x08,0x07,0x09,0x07,0x08,0x0a,0x07,0x09,0x08,0x08,0x06,0x06,0x06,0x08, +0x07,0x08,0x06,0x0c,0x0b,0x08,0x07,0x08,0x07,0x08,0x06,0x08,0x06,0x09,0x08,0x07,0x05,0x07,0x08,0x06,0x03,0x0a,0x06,0x06,0x0b,0x09,0x08,0x08,0x0c,0x09,0x09,0x06,0x0b,0x09,0x09,0x07,0x0c,0x0a,0x07,0x06,0x0a,0x0a,0x0a,0x08,0x09,0x08,0x09,0x08,0x11,0x0f,0x0b,0x08,0x0f,0x0c,0x0b,0x09,0x08,0x06,0x07,0x05,0x05,0x00,0x00,0x0d, +0x0c,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x06,0x08,0x06,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x09,0x07,0x08,0x06,0x07,0x05,0x0b,0x09,0x09,0x08,0x0b,0x08,0x0b,0x08,0x03,0x0b,0x09,0x08,0x07,0x09,0x08,0x09,0x07,0x08,0x07,0x08,0x07,0x0b,0x0b,0x07,0x07,0x09,0x07,0x09,0x07,0x0b,0x09,0x07,0x06,0x07,0x06,0x0a,0x07,0x0a,0x07,0x0a,0x08, +0x0a,0x08,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x09,0x07,0x0a,0x09,0x07,0x08,0x0b,0x0b,0x0a,0x09,0x07,0x06,0x0c,0x0a,0x0d,0x0b,0x09,0x07,0x09,0x08,0x08,0x07,0x07,0x07,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x08,0x04,0x04,0x02,0x03,0x03,0x03,0x04,0x05,0x04,0x03,0x05,0x03, +0x03,0x03,0x04,0x04,0x03,0x03,0x08,0x08,0x08,0x08,0x04,0x04,0x03,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x03,0x04,0x03,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07, +0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07, +0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x08,0x04, +0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x06,0x09,0x0b,0x06,0x06,0x07,0x07,0x05,0x05,0x03,0x04,0x06,0x05,0x09,0x07,0x08,0x06,0x08,0x08,0x08,0x0c,0x07,0x08,0x08,0x06,0x06,0x06,0x05,0x07,0x07,0x09,0x07, +0x06,0x09,0x06,0x05,0x05,0x07,0x05,0x06,0x07,0x06,0x08,0x07,0x05,0x06,0x05,0x05,0x05,0x04,0x04,0x05,0x06,0x02,0x03,0x05,0x04,0x07,0x06,0x06,0x06,0x05,0x04,0x04,0x04,0x05,0x07,0x04,0x04,0x05,0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x05,0x02,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x04, +0x05,0x04,0x02,0x03,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x08,0x02,0x05,0x07,0x0b,0x08,0x07,0x07,0x0b,0x08,0x0b,0x0a,0x07,0x08,0x07,0x06,0x0f,0x06,0x08,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x03,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x06,0x05,0x08,0x08,0x04,0x0b,0x07,0x08,0x05,0x04,0x06,0x04,0x06, +0x08,0x06,0x08,0x0c,0x08,0x04,0x03,0x08,0x07,0x08,0x08,0x08,0x04,0x08,0x06,0x03,0x0b,0x07,0x08,0x05,0x06,0x06,0x06,0x06,0x06,0x07,0x08,0x08,0x07,0x06,0x06,0x0a,0x03,0x06,0x03,0x07,0x06,0x05,0x03,0x03,0x04,0x03,0x02,0x02,0x05,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x06,0x06,0x04,0x04,0x05,0x04,0x05,0x03,0x02,0x03, +0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x04,0x07,0x07,0x07,0x07,0x04,0x00,0x00,0x00,0x00,0x06,0x04,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x02,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x0a,0x08,0x09,0x08,0x0a,0x08,0x0c,0x0a,0x07,0x05,0x07,0x09,0x07,0x0b, +0x09,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0d,0x05,0x03,0x07,0x08,0x05,0x07,0x07,0x08,0x08,0x07,0x0d,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x08,0x07,0x07,0x07,0x04,0x08,0x04,0x0a,0x09,0x07,0x04,0x0b,0x07,0x0b,0x03,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x0b,0x03,0x08,0x03,0x07,0x05,0x03,0x03,0x07,0x03,0x0a,0x03,0x0c,0x07,0x0c,0x0c,0x08,0x08,0x08,0x07,0x07,0x05,0x05,0x0f,0x0f,0x11,0x11,0x0b,0x0b,0x07,0x07,0x02,0x0d,0x0a,0x0b,0x09,0x08,0x09,0x07,0x07,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x08,0x00,0x08,0x08,0x08,0x04,0x07,0x07,0x0c,0x04,0x0c,0x04, +0x08,0x09,0x08,0x05,0x0c,0x07,0x0c,0x07,0x0a,0x0b,0x04,0x07,0x07,0x05,0x03,0x07,0x08,0x07,0x08,0x07,0x08,0x08,0x07,0x09,0x08,0x0c,0x04,0x07,0x05,0x09,0x07,0x04,0x07,0x07,0x07,0x0c,0x04,0x0c,0x04,0x03,0x08,0x05,0x0d,0x07,0x07,0x08,0x08,0x0d,0x07,0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x0a,0x08,0x00,0x00,0x03,0x03, +0x03,0x03,0x03,0x03,0x05,0x05,0x07,0x07,0x0a,0x0b,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x07,0x05,0x05,0x05,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11, +0x0d,0x0b,0x07,0x08,0x08,0x08,0x0d,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0a,0x0a,0x0e,0x0d,0x0c,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x09,0x04,0x09,0x04,0x07,0x09,0x08,0x07,0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x0b,0x0c,0x0a,0x0b,0x04,0x07,0x0a,0x0b,0x0a,0x0b,0x00,0x00,0x00,0x00,0x00,0x0f,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x08,0x00,0x00,0x00,0x0f,0x0b,0x11,0x0d,0x07,0x08,0x08,0x08,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0c,0x0c,0x05,0x08, +0x08,0x08,0x10,0x0b,0x07,0x14,0x0e,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x05,0x05,0x0a,0x09,0x09,0x07,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x10,0x14,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08, +0x08,0x08,0x09,0x08,0x07,0x07,0x05,0x0f,0x0b,0x07,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0c,0x07,0x07,0x0c,0x07,0x07,0x0c,0x07,0x07,0x08,0x08,0x08,0x08,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x09,0x04,0x04,0x05,0x05,0x0f,0x0b,0x08,0x08,0x08,0x00,0x07,0x07,0x07,0x05,0x07,0x09, +0x08,0x07,0x07,0x05,0x03,0x0a,0x08,0x08,0x05,0x07,0x06,0x06,0x06,0x06,0x03,0x07,0x05,0x08,0x06,0x08,0x06,0x07,0x06,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x06,0x06,0x04,0x07,0x07,0x08,0x07,0x04,0x0a,0x08,0x08,0x07,0x08,0x06,0x07,0x07,0x05,0x09,0x05,0x05,0x05,0x06,0x08,0x08,0x07,0x0d,0x07,0x0d, +0x04,0x03,0x02,0x07,0x03,0x02,0x00,0x02,0x03,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0c,0x06,0x0a,0x08,0x0c,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0b,0x06,0x0b,0x06,0x0b,0x08,0x09,0x09,0x09,0x0a,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09, +0x09,0x0a,0x08,0x0e,0x0b,0x06,0x06,0x04,0x04,0x04,0x05,0x03,0x07,0x03,0x03,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x08,0x07,0x06,0x06,0x09,0x03,0x04,0x09,0x09,0x03,0x07,0x07,0x07,0x09,0x09,0x03,0x05,0x09,0x08,0x08,0x08,0x07,0x08,0x09,0x07,0x0a, +0x09,0x07,0x07,0x07,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x06,0x09,0x07,0x07,0x09,0x07,0x09,0x07,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x06,0x06,0x09,0x04,0x05,0x09,0x04,0x07,0x07,0x07,0x09,0x05,0x09,0x08,0x08,0x08,0x09,0x07,0x0a,0x09,0x03,0x07,0x07,0x08,0x08,0x10,0x00,0x08,0x07,0x08,0x08,0x08,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x0a,0x08,0x09,0x09,0x07,0x09,0x0a,0x0a,0x06,0x08,0x0a,0x0a,0x09,0x0a,0x0b,0x0a,0x09,0x07,0x07,0x0a,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x0a,0x07,0x08,0x09,0x09, +0x0a,0x08,0x08,0x08,0x09,0x0b,0x06,0x08,0x08,0x0b,0x07,0x07,0x0a,0x0c,0x08,0x07,0x0e,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x0a,0x0b,0x0b,0x07,0x0a,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x0a,0x07,0x08,0x09,0x07,0x07,0x08,0x0c,0x07,0x07,0x08,0x08,0x06,0x04,0x07,0x07,0x07,0x07,0x07,0x0b,0x07,0x0c,0x06,0x07,0x0c,0x09,0x07, +0x0c,0x0a,0x0a,0x0b,0x07,0x07,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x08,0x07,0x07,0x0c,0x08,0x07,0x07,0x07,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x0a,0x09,0x08,0x07,0x0a,0x09,0x09,0x07,0x09,0x09,0x0a,0x09,0x08,0x09,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x0a,0x09,0x0a,0x09,0x01, +0x01,0x02,0x03,0x02,0x04,0x05,0x0b,0x07,0x08,0x08,0x07,0x08,0x07,0x07,0x08,0x08,0x07,0x04,0x0b,0x08,0x07,0x07,0x07,0x08,0x07,0x08,0x03,0x08,0x07,0x07,0x05,0x0b,0x07,0x07,0x07,0x08,0x0b,0x07,0x08,0x05,0x0b,0x08,0x08,0x09,0x09,0x03,0x04,0x0f,0x0f,0x0f,0x0f,0x13,0x07,0x07,0x03,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x06,0x07,0x08,0x06,0x05,0x07,0x08,0x03,0x04,0x06,0x05,0x0a,0x08,0x08,0x06,0x08,0x06,0x05,0x06,0x08,0x07,0x0a, +0x07,0x06,0x06,0x09,0x0a,0x05,0x08,0x06,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x07,0x04,0x06,0x05,0x05, +0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x09,0x08,0x07,0x06,0x05,0x07,0x06,0x06,0x08,0x08,0x03,0x06,0x07,0x0a,0x08,0x06,0x08,0x08,0x06,0x06,0x06,0x06,0x08,0x07,0x09,0x08,0x07, +0x06,0x08,0x03,0x08,0x06,0x08,0x03,0x06,0x06,0x07,0x05,0x07,0x05,0x03,0x03,0x04,0x0b,0x0b,0x08,0x06,0x06,0x08,0x07,0x06,0x06,0x05,0x08,0x06,0x0a,0x06,0x08,0x08,0x06,0x07,0x0a,0x08,0x08,0x08,0x06,0x07,0x06,0x06,0x08,0x07,0x08,0x07,0x0a,0x0b,0x07,0x09,0x06,0x07,0x0b,0x06,0x05,0x08,0x08,0x08,0x0c,0x0c,0x09,0x07,0x07,0x05, +0x07,0x07,0x07,0x09,0x07,0x07,0x09,0x08,0x08,0x05,0x08,0x08,0x07,0x06,0x06,0x0c,0x0a,0x06,0x07,0x08,0x08,0x08,0x08,0x09,0x09,0x05,0x0c,0x08,0x07,0x07,0x08,0x08,0x07,0x07,0x03,0x0a,0x09,0x09,0x06,0x09,0x03,0x03,0x06,0x06,0x03,0x03,0x08,0x05,0x03,0x0a,0x09,0x04,0x03,0x03,0x06,0x05,0x05,0x03,0x03,0x03,0x05,0x09,0x06,0x04, +0x08,0x09,0x08,0x08,0x06,0x0a,0x07,0x08,0x05,0x06,0x07,0x06,0x03,0x03,0x05,0x07,0x04,0x09,0x09,0x09,0x0c,0x0a,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x0a,0x0b,0x04,0x04,0x07,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x07,0x07,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x07, +0x07,0x0c,0x0c,0x07,0x07,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0d,0x0a,0x0b,0x07,0x08,0x08,0x09,0x04,0x09,0x0a,0x07,0x07,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0c,0x04,0x0a,0x07,0x07,0x03,0x07,0x07,0x07,0x07,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04, +0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11,0x0d,0x0b,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0c,0x07,0x0e,0x0d,0x0c,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0c,0x07,0x0c,0x07,0x0c, +0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x09,0x09,0x09,0x09,0x09,0x04,0x09,0x09,0x04,0x04,0x09,0x04,0x09,0x04,0x09,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x00,0x0f,0x0b,0x11,0x0d,0x0c,0x07,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x07,0x07, +0x05,0x0f,0x0b,0x0d,0x0d,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x08,0x09,0x04,0x09,0x04,0x09,0x04,0x0f,0x0b,0x08,0x09,0x08,0x08,0x08,0x09,0x08,0x08,0x0f,0x0f,0x0b,0x0b,0x05,0x05,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x08,0x08,0x08,0x08,0x0c,0x04,0x0c,0x04,0x08,0x09, +0x08,0x08,0x0f,0x0f,0x0b,0x0b,0x0f,0x0f,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x0b,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, +0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x09,0x09,0x03,0x03, +0x07,0x05,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x08,0x08,0x08,0x09,0x08,0x07,0x08,0x07,0x09,0x0a,0x08,0x0a,0x0b,0x08,0x0a,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x08,0x08,0x09,0x07,0x08,0x07,0x08,0x08,0x07,0x07,0x0a, +0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x09,0x0c,0x0c,0x0a,0x0b,0x0b,0x07,0x0a,0x0b,0x0a,0x08,0x0b,0x0a,0x09,0x09,0x08,0x08,0x0a,0x0a,0x09,0x08,0x09,0x08,0x07,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x09,0x0c,0x0c,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0b,0x0a,0x0b,0x09,0x09,0x08,0x0a,0x09,0x09,0x0b,0x0a, +0x09,0x0c,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x0a,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x06,0x07,0x07,0x08,0x08,0x0a,0x0b,0x09,0x09,0x08,0x0a,0x08,0x09,0x07,0x06,0x08,0x07,0x06,0x06,0x07,0x07,0x06,0x06,0x08,0x06,0x07,0x06,0x07,0x0a,0x07,0x0b,0x07,0x07,0x07,0x0a, +0x04,0x0a,0x09,0x09,0x09,0x07,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x08,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x0c,0x0c,0x0c,0x0c,0x06,0x0a,0x09,0x06,0x05, +0x06,0x07,0x07,0x06,0x0b,0x0b,0x0b,0x06,0x0d,0x06,0x0b,0x0b,0x0b,0x0b,0x07,0x06,0x06,0x0a,0x08,0x0a,0x09,0x07,0x06,0x05,0x0d,0x05,0x07,0x06,0x06,0x06,0x06,0x06,0x12,0x0b,0x0b,0x06,0x03,0x06,0x03,0x06,0x03,0x03,0x03,0x06,0x08,0x08,0x07,0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x0b,0x03,0x0c,0x0c,0x0c,0x08,0x08,0x0b,0x0b, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x09,0x0f,0x0f,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x08,0x06,0x07,0x06,0x05,0x05,0x09,0x07,0x09,0x06,0x0f,0x0c,0x08,0x07,0x0c,0x0a, +0x0b,0x0a,0x0d,0x0b,0x0c,0x0a,0x08,0x06,0x09,0x08,0x0c,0x0a,0x0a,0x08,0x0a,0x08,0x0b,0x09,0x0b,0x09,0x0e,0x0b,0x0a,0x08,0x0a,0x08,0x10,0x0c,0x0a,0x00,0x0d,0x0d,0x0d,0x06,0x00,0x00,0x08,0x07,0x09,0x07,0x07,0x06,0x0e,0x0c,0x0c,0x0b,0x09,0x08,0x09,0x08,0x07,0x05,0x0a,0x08,0x07,0x05,0x0b,0x09,0x09,0x07,0x0d,0x0b,0x07,0x07, +0x0a,0x0a,0x0b,0x06,0x03,0x06,0x09,0x06,0x0d,0x0d,0x03,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x05,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x09,0x09,0x04,0x03,0x04,0x03,0x09,0x07,0x0a,0x08,0x07,0x06,0x07,0x06,0x08,0x07,0x05,0x05,0x0f,0x0b,0x0f,0x0c,0x0d,0x0b,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x08,0x06,0x08, +0x06,0x08,0x06,0x08,0x06,0x07,0x04,0x06,0x03,0x0a,0x08,0x0b,0x09,0x11,0x0d,0x07,0x08,0x09,0x09,0x0b,0x0b,0x0a,0x08,0x0d,0x0a,0x07,0x05,0x07,0x06,0x08,0x06,0x0c,0x09,0x08,0x07,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x05,0x06,0x05,0x07,0x07,0x04,0x09,0x04,0x0c,0x09,0x05,0x08,0x08,0x06,0x0a,0x07,0x05,0x05,0x08,0x08,0x08,0x06, +0x03,0x0a,0x08,0x05,0x05,0x08,0x06,0x09,0x05,0x0a,0x08,0x08,0x06,0x09,0x08,0x08,0x06,0x0a,0x07,0x08,0x05,0x07,0x06,0x0a,0x06,0x07,0x0b,0x06,0x07,0x0c,0x03,0x0f,0x0c,0x0c,0x0f,0x0b,0x0c,0x0c,0x0b,0x0c,0x0c,0x07,0x06,0x08,0x09,0x0c,0x09,0x0c,0x03,0x06,0x08,0x0b,0x0d,0x09,0x0d,0x08,0x08,0x0a,0x09,0x0f,0x0c,0x07,0x0c,0x04, +0x0c,0x04,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0d,0x07,0x07,0x0d,0x0a,0x07,0x07,0x0a,0x09,0x04,0x04,0x09,0x08,0x08,0x08,0x08,0x0a,0x04,0x04,0x0b,0x0a,0x04,0x04,0x0b,0x05,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x14,0x07,0x05,0x07,0x07,0x0a,0x07,0x08,0x0b,0x09,0x0a,0x0a,0x0b,0x0b,0x08,0x06,0x0d,0x0a,0x0e,0x0b,0x09,0x08,0x04,0x04,0x08,0x08,0x05,0x08,0x07,0x08,0x06,0x0a,0x0a,0x05,0x08,0x06,0x03,0x05,0x07,0x07,0x03,0x03,0x02,0x03,0x05,0x05,0x05,0x06,0x13,0x1a,0x04,0x05,0x02,0x03,0x05,0x06,0x04,0x06,0x07,0x05,0x05, +0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x11,0x07,0x0a,0x0c,0x0c,0x08,0x06,0x07,0x09,0x0a,0x06,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x0a,0x08,0x08,0x07,0x0a,0x08,0x0b,0x06,0x07,0x08,0x04,0x08,0x04,0x05,0x03,0x0b,0x08,0x07,0x07,0x07,0x08,0x0c,0x0c,0x0c,0x0d,0x0d,0x07,0x07,0x04,0x07,0x06,0x08, +0x06,0x09,0x03,0x07,0x08,0x0b,0x0b,0x08,0x07,0x07,0x07,0x07,0x06,0x07,0x06,0x06,0x04,0x04,0x03,0x03,0x05,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x04,0x04,0x04,0x03,0x03,0x16,0x0d,0x0b,0x0e,0x04,0x04,0x04,0x05,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, +0x04,0x00,0x0c,0x04,0x04,0x0c,0x03,0x07,0x07,0x11,0x0d,0x0d,0x11,0x0c,0x07,0x07,0x0c,0x07,0x07,0x05,0x05,0x00,0x00,0x05,0x0a,0x08,0x09,0x08,0x10,0x0d,0x09,0x07,0x09,0x07,0x11,0x0d,0x0a,0x08,0x05,0x04,0x08,0x00,0x09,0x07,0x04,0x04,0x02,0x06,0x04,0x04,0x03,0x03,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x07,0x06, +0x08,0x07,0x07,0x0d,0x0b,0x0a,0x0a,0x0b,0x0c,0x08,0x09,0x08,0x05,0x0c,0x0f,0x06,0x0f,0x07,0x0b,0x0c,0x0c,0x0c,0x05,0x0a,0x0d,0x0a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x08,0x08,0x0b,0x07,0x07,0x0c,0x04,0x04,0x0c,0x04,0x04,0x0c,0x06,0x06,0x00,0x05,0x0b,0x04,0x04,0x0d, +0x07,0x07,0x0a,0x07,0x07,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x14,0x14,0x0b,0x00,0x00,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x08,0x08,0x08,0x0c,0x08,0x08,0x0a,0x0d,0x08,0x08,0x0e,0x08,0x08,0x0c,0x08,0x09,0x0a,0x08,0x0a, +0x0b,0x0c,0x08,0x0a,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0a,0x08,0x09,0x0a,0x08,0x08,0x07,0x0a,0x08,0x08,0x08,0x09,0x06,0x07,0x08,0x0a,0x0a,0x07,0x00,0x00,0x0f,0x1e,0x0a,0x00,0x01,0x04,0x04,0x06,0x09,0x08,0x0c,0x0c,0x03,0x05,0x05,0x06,0x0a,0x03,0x06,0x03,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03, +0x03,0x0a,0x0a,0x0a,0x07,0x0e,0x0a,0x09,0x09,0x0b,0x08,0x07,0x0a,0x0b,0x04,0x05,0x09,0x07,0x0d,0x0b,0x0b,0x08,0x0b,0x09,0x08,0x08,0x0a,0x09,0x0e,0x09,0x08,0x09,0x05,0x06,0x05,0x0a,0x06,0x04,0x08,0x09,0x07,0x09,0x08,0x05,0x09,0x08,0x04,0x04,0x07,0x04,0x0d,0x08,0x09,0x09,0x09,0x05,0x06,0x05,0x08,0x07,0x0b,0x07,0x07,0x07, +0x05,0x04,0x05,0x0a,0x0a,0x0a,0x09,0x08,0x0b,0x0b,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x08,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x06,0x06,0x08,0x08,0x07,0x06,0x07,0x08,0x06,0x0d,0x0d,0x0c,0x04,0x06,0x0a,0x0d,0x0b,0x0c,0x0a,0x0a,0x0a,0x08,0x09,0x08,0x09,0x0b,0x08,0x06, +0x06,0x0b,0x0c,0x09,0x07,0x04,0x04,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x08,0x0b,0x0a,0x0a,0x0b,0x0e,0x0e,0x08,0x0f,0x06,0x06,0x03,0x03,0x0a,0x09,0x07,0x08,0x03,0x08,0x05,0x05,0x08,0x08,0x06,0x03,0x03,0x06,0x12,0x0a,0x08,0x0a,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x04,0x06,0x05,0x05,0x05,0x03,0x04,0x03, +0x05,0x03,0x06,0x07,0x04,0x08,0x06,0x09,0x07,0x04,0x0b,0x08,0x08,0x07,0x08,0x09,0x0a,0x0a,0x05,0x06,0x06,0x0e,0x0e,0x0e,0x07,0x0a,0x09,0x04,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x06,0x03,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0b,0x08,0x08,0x08,0x08,0x07,0x04,0x07,0x05,0x07,0x05,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x09,0x05,0x09,0x05, +0x08,0x06,0x08,0x05,0x08,0x07,0x0a,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x07,0x0b,0x0b,0x09,0x09,0x07,0x09,0x07,0x0a,0x06,0x07,0x06,0x11,0x09,0x07,0x09,0x03,0x06,0x0c,0x05,0x09,0x05,0x05,0x09,0x05,0x0a,0x08,0x09,0x07,0x09,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0b,0x08,0x0b,0x08,0x04,0x04,0x04, +0x04,0x04,0x04,0x04,0x04,0x05,0x04,0x09,0x07,0x07,0x07,0x04,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x09,0x05,0x08,0x06,0x08,0x05,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0e,0x0b,0x08,0x07,0x04,0x0a,0x08,0x0d,0x0c,0x0b,0x09,0x03,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x08,0x07,0x03,0x06,0x08,0x09,0x0e,0x0e,0x0e,0x0d,0x06,0x06, +0x03,0x04,0x04,0x0a,0x09,0x0c,0x06,0x0c,0x0a,0x0c,0x04,0x0a,0x09,0x08,0x09,0x0b,0x04,0x09,0x09,0x0d,0x0b,0x08,0x0b,0x0b,0x08,0x08,0x08,0x08,0x09,0x0c,0x0b,0x04,0x08,0x09,0x07,0x09,0x04,0x08,0x08,0x08,0x07,0x09,0x09,0x04,0x08,0x07,0x09,0x08,0x07,0x09,0x09,0x07,0x08,0x08,0x0b,0x0c,0x04,0x08,0x09,0x08,0x0c,0x08,0x0b,0x07, +0x09,0x08,0x04,0x0f,0x0f,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x07,0x0a,0x08,0x0d,0x08,0x0b,0x0b,0x09,0x0a,0x0d,0x0b,0x0b,0x0b,0x08,0x09,0x08,0x09,0x0b,0x09,0x0b,0x0a,0x0e,0x0f,0x0b,0x0c,0x09,0x09,0x0f,0x09,0x08,0x09,0x08,0x06,0x08,0x08,0x0b,0x07,0x09,0x09,0x07,0x08,0x0b,0x09,0x09,0x09,0x09,0x07,0x06,0x07,0x0a,0x07,0x09, +0x08,0x0c,0x0c,0x09,0x0b,0x08,0x07,0x0c,0x08,0x08,0x09,0x06,0x07,0x06,0x04,0x0c,0x0c,0x09,0x07,0x07,0x09,0x07,0x06,0x0f,0x11,0x09,0x05,0x06,0x06,0x06,0x04,0x08,0x06,0x08,0x0b,0x09,0x0b,0x09,0x05,0x05,0x04,0x04,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x07,0x05,0x07,0x05,0x05,0x05,0x07,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a, +0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x08,0x0a, +0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x05,0x08,0x08,0x0b,0x09,0x04,0x05,0x04,0x04,0x08,0x06,0x0e,0x0c,0x09,0x08,0x09,0x07,0x0b,0x09,0x08,0x07,0x08,0x07,0x09,0x07,0x0a,0x08,0x0a,0x08,0x0b,0x08,0x0b,0x09,0x05,0x05,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x04,0x04,0x05, +0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x05,0x0a,0x09,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x04,0x04,0x04,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x07, +0x04,0x07,0x04,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x09,0x08,0x09,0x09,0x05,0x09,0x05,0x09,0x05,0x09,0x05,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x05,0x08,0x05,0x08,0x05,0x08,0x05,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a, +0x08,0x09,0x07,0x09,0x07,0x0e,0x0b,0x0e,0x0b,0x09,0x07,0x09,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x0b,0x07,0x08,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c, +0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x07,0x07,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09, +0x09,0x07,0x07,0x09,0x09,0x04,0x04,0x09,0x09,0x08,0x08,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x09, +0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x06,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x09,0x09,0x08,0x08,0x08,0x08,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d, +0x0c,0x0b,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x0b,0x0b,0x09,0x09,0x09,0x08,0x08,0x07,0x0a,0x09,0x0d,0x04,0x04,0x09,0x07,0x04,0x07,0x0d,0x0b,0x09,0x0b,0x0f,0x0c,0x09,0x09,0x09,0x08,0x06,0x08,0x04,0x05,0x08,0x05,0x08,0x0b,0x0b,0x09, +0x08,0x09,0x07,0x09,0x09,0x07,0x06,0x08,0x08,0x06,0x06,0x08,0x04,0x06,0x07,0x04,0x13,0x11,0x0f,0x0d,0x0b,0x08,0x10,0x0f,0x0c,0x0a,0x08,0x04,0x04,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x0a,0x08,0x0a,0x08,0x0d,0x0c,0x0a,0x09,0x0a,0x09,0x09,0x07,0x0b,0x09,0x0b,0x09,0x09,0x07,0x04,0x13,0x11,0x0f, +0x0a,0x09,0x0f,0x0a,0x0b,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x09,0x0b,0x09,0x09,0x05,0x09,0x05,0x0a,0x08,0x0a,0x08,0x08,0x06,0x0b,0x08,0x0b,0x09,0x09,0x09,0x07,0x0a,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x07,0x09,0x08,0x08,0x08,0x09,0x08,0x09,0x09,0x09,0x07,0x07,0x09,0x09, +0x08,0x09,0x06,0x06,0x08,0x08,0x04,0x09,0x09,0x08,0x07,0x07,0x08,0x08,0x08,0x04,0x04,0x05,0x04,0x06,0x04,0x09,0x0d,0x0d,0x0d,0x08,0x08,0x09,0x09,0x0a,0x0b,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x06,0x04,0x04,0x04,0x04,0x05,0x05,0x09,0x09,0x08,0x07,0x0b,0x07,0x06,0x07,0x08,0x07,0x07,0x05,0x05,0x05,0x07,0x09, +0x07,0x08,0x08,0x08,0x04,0x07,0x06,0x09,0x05,0x05,0x0e,0x0e,0x0f,0x09,0x07,0x0b,0x0c,0x09,0x09,0x07,0x07,0x08,0x09,0x08,0x0a,0x08,0x0a,0x0c,0x09,0x0b,0x09,0x09,0x07,0x07,0x07,0x09,0x08,0x09,0x07,0x0d,0x0d,0x09,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x0a,0x09,0x08,0x06,0x09,0x09,0x07,0x04,0x0b,0x07,0x07,0x0d,0x0a,0x0a,0x09, +0x0e,0x0b,0x0a,0x07,0x0d,0x0a,0x0b,0x08,0x0e,0x0b,0x08,0x07,0x0c,0x0b,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x14,0x11,0x0c,0x0a,0x11,0x0d,0x0d,0x0a,0x09,0x07,0x08,0x06,0x06,0x00,0x00,0x0f,0x0e,0x09,0x08,0x08,0x09,0x09,0x08,0x08,0x07,0x09,0x07,0x0b,0x09,0x0d,0x0a,0x0f,0x0d,0x0b,0x08,0x09,0x07,0x08,0x06,0x0d,0x0a,0x0a,0x09,0x0d, +0x0a,0x0d,0x0a,0x04,0x0d,0x0b,0x09,0x08,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0d,0x0c,0x08,0x08,0x0b,0x08,0x0b,0x08,0x0d,0x0b,0x08,0x07,0x08,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x0a,0x08,0x0c,0x0b,0x09,0x09,0x0d,0x0d,0x0c,0x0b,0x08,0x07,0x0e,0x0c,0x0f,0x0d,0x0b,0x08, +0x0a,0x09,0x09,0x08,0x08,0x08,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x09,0x05,0x05,0x02,0x03,0x03,0x03,0x04,0x06,0x04,0x03,0x06,0x03,0x03,0x03,0x05,0x05,0x03,0x03,0x09,0x09,0x09,0x09,0x05,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04, +0x02,0x04,0x04,0x03,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08, +0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08, +0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x09,0x05,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x08,0x09,0x07,0x0a,0x0c,0x07,0x07,0x08,0x08,0x06,0x06,0x04,0x04,0x07,0x06,0x0b,0x09,0x09,0x07,0x09,0x09,0x09,0x0e,0x08,0x09,0x09,0x07,0x07,0x07,0x06,0x08,0x09,0x0b,0x09,0x07,0x0b,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x09,0x08,0x05,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x03,0x03,0x05,0x04,0x08,0x07,0x07, +0x06,0x06,0x05,0x05,0x04,0x06,0x08,0x05,0x05,0x05,0x07,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x02,0x05,0x07,0x05,0x05,0x04,0x05,0x05,0x05,0x03,0x05,0x05,0x07,0x04,0x05,0x05,0x04,0x05,0x06,0x04,0x02,0x03,0x05,0x04,0x05,0x04,0x05,0x06,0x04,0x09,0x02,0x05,0x08,0x0d,0x09,0x08,0x08,0x0d,0x0a,0x0d,0x0b,0x08,0x09,0x08,0x07,0x11, +0x07,0x09,0x0d,0x0e,0x0e,0x09,0x0a,0x09,0x07,0x07,0x08,0x06,0x07,0x08,0x03,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x07,0x06,0x09,0x09,0x05,0x0d,0x08,0x09,0x05,0x05,0x07,0x05,0x07,0x09,0x07,0x09,0x0e,0x0a,0x05,0x04,0x09,0x08,0x09,0x09,0x09,0x05,0x09,0x07,0x04,0x0d,0x08,0x09,0x05,0x06,0x06,0x07,0x07,0x07,0x08,0x09,0x09, +0x08,0x07,0x07,0x0b,0x04,0x07,0x04,0x08,0x07,0x05,0x04,0x04,0x05,0x04,0x03,0x02,0x05,0x05,0x02,0x03,0x03,0x03,0x02,0x03,0x02,0x03,0x07,0x07,0x05,0x05,0x05,0x05,0x06,0x03,0x02,0x03,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x05,0x00,0x00,0x00,0x00,0x03,0x05,0x05,0x05,0x04,0x05,0x08,0x08,0x08,0x08,0x05,0x00,0x00,0x00, +0x00,0x07,0x05,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,0x06,0x06,0x05,0x06,0x05,0x06,0x06,0x06, +0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0e,0x0b,0x08,0x06,0x08,0x0a,0x08,0x0c,0x0b,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0f,0x06,0x04,0x08,0x09,0x06,0x08,0x08, +0x09,0x09,0x08,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x0a,0x08,0x08,0x08,0x05,0x09,0x05,0x0b,0x0a,0x08,0x05,0x0d,0x08,0x0d,0x04,0x05,0x09,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0d,0x04,0x09,0x04,0x08,0x06,0x04,0x04,0x08,0x04,0x0b,0x04,0x0e,0x08,0x0e,0x0e,0x09,0x09,0x09,0x08,0x08,0x06,0x06,0x12,0x12,0x14,0x14,0x0d, +0x0d,0x08,0x08,0x03,0x0f,0x0b,0x0d,0x0a,0x09,0x0a,0x08,0x08,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x0a,0x00,0x0a,0x0a,0x0a,0x05,0x08,0x08,0x0e,0x05,0x0e,0x05,0x09,0x0a,0x09,0x06,0x0e,0x08,0x0e,0x08,0x0b,0x0d,0x05,0x08,0x08,0x06,0x04,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0a,0x0a,0x0e,0x05,0x08, +0x06,0x0a,0x08,0x05,0x08,0x08,0x08,0x0e,0x05,0x0e,0x05,0x04,0x09,0x06,0x0f,0x08,0x08,0x0a,0x0a,0x0f,0x08,0x00,0x00,0x00,0x0a,0x00,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x08,0x0b,0x0d,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x08,0x06,0x06,0x06,0x12,0x0d,0x12,0x0d,0x12,0x0d,0x14,0x0f,0x14,0x0f,0x0d,0x08,0x09,0x09,0x09,0x0f,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0b,0x0b,0x10,0x0f,0x0e,0x08,0x0d,0x08,0x0d, +0x08,0x0d,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x0a,0x05,0x0a,0x05,0x08,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0e,0x0b,0x0d,0x05,0x08,0x0b,0x0d,0x0b,0x0d,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x06, +0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x0d,0x14,0x0f,0x08,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0e,0x0e,0x06,0x09,0x09,0x09,0x12,0x0c,0x08,0x17,0x10,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x06,0x06,0x0b,0x0a,0x0a,0x08,0x00,0x00, +0x00,0x05,0x05,0x05,0x05,0x13,0x17,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x0a,0x09,0x08,0x08,0x06,0x12,0x0d,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0e, +0x08,0x08,0x0e,0x08,0x08,0x0e,0x08,0x08,0x09,0x09,0x09,0x09,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x0a,0x05,0x05,0x06,0x06,0x12,0x0d,0x0a,0x09,0x09,0x00,0x08,0x08,0x08,0x06,0x09,0x0a,0x09,0x08,0x08,0x05,0x04,0x0b,0x09,0x09,0x05,0x08,0x07,0x07,0x07,0x07,0x04,0x08,0x06,0x09,0x07,0x09,0x07,0x08,0x07,0x0a,0x08,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x07,0x07,0x04,0x08,0x08,0x09,0x08,0x05,0x0b,0x09,0x0a,0x08,0x09,0x07,0x09,0x08,0x06,0x0a,0x06,0x06,0x06,0x07,0x09,0x09,0x08,0x0f,0x08,0x0f,0x05,0x04,0x03,0x08,0x03,0x02,0x00,0x02,0x03,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0e,0x06,0x0b, +0x09,0x0e,0x0b,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0d,0x07,0x0d,0x07,0x0d,0x0a,0x0a,0x0b,0x0a,0x0b,0x0d,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0b,0x09,0x10,0x0c,0x07,0x07,0x04,0x04,0x04,0x06,0x03,0x08,0x03,0x03,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x0a,0x09,0x07,0x07,0x0a,0x04,0x05,0x0a,0x0a,0x04,0x08,0x08,0x08,0x0a,0x0a,0x04,0x06,0x0a,0x09,0x09,0x09,0x08,0x09,0x0a,0x08,0x0c,0x0b,0x08,0x08,0x08,0x03,0x06,0x08,0x08,0x08,0x08,0x08,0x09,0x0a,0x07,0x0a,0x08,0x08,0x0a,0x08,0x0b,0x08,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a, +0x09,0x07,0x07,0x0a,0x05,0x05,0x0a,0x05,0x08,0x08,0x08,0x0a,0x06,0x0a,0x09,0x09,0x09,0x0a,0x08,0x0c,0x0b,0x04,0x09,0x08,0x09,0x0a,0x12,0x00,0x0a,0x08,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x06,0x04,0x00,0x0b,0x0a,0x0a,0x0b,0x08,0x0a,0x0b,0x0b,0x07,0x09,0x0b,0x0b,0x0a,0x0b,0x0c,0x0c,0x0a,0x08,0x08,0x0b,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x09,0x0a,0x0a,0x0a,0x0c,0x09,0x09,0x0a,0x0a,0x0c,0x07,0x09,0x09,0x0d,0x08,0x08,0x0c,0x0d,0x09,0x08,0x10,0x09,0x09,0x0b,0x08,0x08,0x0b,0x08,0x0b,0x0c,0x0d,0x08, +0x0c,0x08,0x0a,0x08,0x09,0x09,0x09,0x08,0x09,0x0c,0x08,0x09,0x0a,0x08,0x08,0x09,0x0e,0x08,0x08,0x09,0x09,0x06,0x05,0x08,0x08,0x08,0x08,0x08,0x0d,0x08,0x0d,0x07,0x08,0x0d,0x0a,0x08,0x0d,0x0b,0x0b,0x0d,0x09,0x08,0x0d,0x0d,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x09,0x08,0x09,0x0d,0x09,0x08,0x08,0x08,0x0d,0x0c,0x0a,0x0a, +0x0a,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x08,0x0c,0x0a,0x0a,0x09,0x0a,0x0a,0x0b,0x0b,0x09,0x0a,0x0a,0x0b,0x0a,0x0c,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0a,0x0b,0x0c,0x0a,0x0b,0x0b,0x01,0x02,0x02,0x03,0x02,0x04,0x05,0x0d,0x08,0x09,0x09,0x08,0x09,0x08,0x08,0x0a,0x09,0x08,0x05,0x0d,0x09,0x08,0x08,0x08,0x09,0x08,0x09,0x04,0x09, +0x08,0x08,0x06,0x0d,0x08,0x08,0x08,0x09,0x0c,0x08,0x09,0x06,0x0c,0x09,0x09,0x0a,0x0a,0x03,0x04,0x11,0x11,0x11,0x11,0x15,0x08,0x08,0x04,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x09,0x06,0x06,0x09,0x09,0x04,0x05,0x07,0x06,0x0b,0x0a,0x09,0x07,0x09,0x07,0x06,0x07,0x09,0x08,0x0c,0x08,0x07,0x07,0x0b,0x0c,0x06,0x09,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x0a,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x08,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x08,0x05,0x07,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c, +0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x0b,0x09,0x08,0x07,0x06,0x08,0x06,0x07,0x09,0x09,0x04,0x07,0x08,0x0b,0x0a,0x07,0x09,0x09,0x07,0x07,0x07,0x07,0x09,0x08,0x0a,0x0a,0x08,0x06,0x09,0x04,0x09,0x07,0x0a,0x04,0x07,0x06,0x09,0x06,0x08,0x06,0x04,0x04,0x05,0x0c,0x0c,0x09,0x07,0x07,0x09,0x08,0x07,0x07,0x06,0x09,0x06, +0x0b,0x07,0x0a,0x0a,0x07,0x09,0x0b,0x09,0x09,0x09,0x07,0x08,0x07,0x07,0x09,0x08,0x0a,0x08,0x0c,0x0c,0x09,0x0b,0x07,0x08,0x0d,0x07,0x06,0x09,0x09,0x09,0x0d,0x0d,0x0a,0x08,0x09,0x06,0x09,0x08,0x08,0x0b,0x08,0x08,0x0a,0x09,0x09,0x05,0x09,0x09,0x09,0x07,0x07,0x0d,0x0b,0x07,0x08,0x09,0x09,0x09,0x09,0x0b,0x0a,0x05,0x0e,0x09, +0x08,0x09,0x0a,0x0a,0x08,0x08,0x04,0x0b,0x0a,0x0a,0x07,0x0b,0x03,0x03,0x07,0x07,0x03,0x03,0x09,0x06,0x04,0x0b,0x0b,0x04,0x03,0x03,0x07,0x06,0x06,0x03,0x03,0x03,0x06,0x0a,0x07,0x05,0x09,0x0a,0x09,0x09,0x07,0x0b,0x08,0x09,0x05,0x07,0x08,0x06,0x03,0x03,0x06,0x08,0x05,0x0a,0x0a,0x0a,0x0e,0x0b,0x0e,0x04,0x00,0x00,0x00,0x00, +0x00,0x04,0x0b,0x0d,0x05,0x05,0x08,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x08,0x08,0x12,0x0d,0x12,0x0d,0x14,0x0f,0x14,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x08,0x08,0x0e,0x0e,0x08,0x08,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0f,0x0b,0x0d,0x08,0x09,0x09,0x0a,0x05,0x0a,0x0b,0x08, +0x08,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0e,0x05,0x0b,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x12,0x0d,0x12,0x0d,0x12,0x0d, +0x14,0x0f,0x14,0x0f,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0e,0x08,0x10,0x0f,0x0e,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x0a,0x0a,0x05,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x08,0x09,0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x00,0x12,0x0d,0x14,0x0f,0x0e,0x08,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x08,0x08,0x06,0x12,0x0d,0x0f,0x0f,0x0e,0x0e,0x0e,0x09,0x09,0x09,0x09,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x12,0x0d,0x09,0x0a,0x09,0x09,0x09,0x0a,0x09,0x09, +0x12,0x12,0x0d,0x0d,0x06,0x06,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x09,0x09,0x09,0x09,0x0e,0x05,0x0e,0x05,0x09,0x0a,0x09,0x09,0x12,0x12,0x0d,0x0d,0x12,0x12,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x04,0x05,0x04, +0x00,0x00,0x00,0x0d,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0d,0x0a,0x0a,0x0a,0x04,0x04,0x08,0x06,0x09,0x0a,0x09,0x08,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x09,0x09,0x09,0x0a, +0x09,0x08,0x0a,0x08,0x0a,0x0b,0x0a,0x0b,0x0c,0x0a,0x0b,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x09,0x09,0x0a,0x09,0x0a,0x09,0x09,0x09,0x08,0x08,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0b,0x0c,0x0b,0x0b,0x0e,0x0e,0x0b,0x0e,0x0e,0x0b,0x0d,0x0d,0x08,0x0c,0x0d,0x0b,0x09,0x0d,0x0b,0x0a,0x0b, +0x09,0x0a,0x0b,0x0c,0x0a,0x09,0x0b,0x09,0x08,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0a,0x0e,0x0e,0x0b,0x0c,0x0c,0x0b,0x0b,0x0b,0x0a,0x0d,0x0b,0x0c,0x0b,0x0b,0x09,0x0b,0x0a,0x0a,0x0d,0x0b,0x0b,0x0d,0x08,0x08,0x08,0x08,0x09,0x09,0x0a,0x0b,0x09,0x09,0x08,0x08,0x09,0x08,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x08,0x08,0x09,0x09,0x09, +0x09,0x07,0x08,0x08,0x09,0x09,0x0b,0x0d,0x0a,0x0a,0x09,0x0c,0x0a,0x0a,0x08,0x07,0x09,0x08,0x07,0x07,0x08,0x08,0x07,0x07,0x09,0x07,0x08,0x07,0x08,0x0c,0x08,0x0c,0x08,0x08,0x09,0x0b,0x05,0x0c,0x0a,0x0b,0x0a,0x08,0x0b,0x09,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07, +0x07,0x07,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x04,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x0e,0x0e,0x0e,0x0e,0x07,0x0b,0x0b,0x07,0x06,0x07,0x08,0x08,0x07,0x0d,0x0c,0x0d,0x07,0x0f,0x07,0x0d,0x0d,0x0d,0x0c,0x08,0x07,0x07,0x0c,0x09,0x0c,0x0a,0x08,0x07,0x06,0x0f,0x06,0x08,0x07, +0x07,0x07,0x07,0x07,0x14,0x0d,0x0d,0x06,0x04,0x07,0x04,0x07,0x04,0x04,0x04,0x07,0x09,0x09,0x08,0x06,0x06,0x03,0x03,0x03,0x06,0x03,0x06,0x0d,0x03,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x12,0x12,0x0a,0x12,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x07,0x09,0x07,0x08,0x06,0x05,0x05,0x0a,0x08,0x0b,0x06,0x11,0x0d,0x09,0x08,0x0e,0x0c,0x0d,0x0b,0x0f,0x0c,0x0e,0x0c,0x0a,0x07,0x0b,0x09,0x0e,0x0b,0x0b,0x09,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x11,0x0d,0x0b,0x09,0x0b,0x09,0x12,0x0d, +0x0c,0x00,0x0f,0x0f,0x0f,0x07,0x00,0x00,0x09,0x08,0x0a,0x08,0x08,0x06,0x10,0x0e,0x0e,0x0d,0x0b,0x09,0x0a,0x09,0x08,0x06,0x0b,0x09,0x08,0x06,0x0c,0x0a,0x0a,0x08,0x0f,0x0c,0x08,0x09,0x0b,0x0b,0x0c,0x07,0x03,0x07,0x0a,0x06,0x0f,0x0f,0x04,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x06,0x11,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00, +0x00,0x07,0x07,0x0a,0x0b,0x04,0x03,0x04,0x03,0x0b,0x08,0x0b,0x09,0x08,0x07,0x08,0x07,0x09,0x09,0x06,0x06,0x11,0x0c,0x11,0x0d,0x0f,0x0d,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x07,0x04,0x0b,0x09,0x0d,0x0a,0x14,0x0f,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0b,0x09,0x0f,0x0c,0x08,0x06,0x08, +0x07,0x09,0x07,0x0e,0x0b,0x09,0x08,0x08,0x09,0x08,0x09,0x07,0x06,0x07,0x06,0x07,0x06,0x08,0x08,0x05,0x0a,0x05,0x0e,0x0a,0x05,0x09,0x09,0x07,0x0b,0x08,0x06,0x05,0x09,0x09,0x09,0x07,0x04,0x0b,0x09,0x06,0x05,0x09,0x07,0x0b,0x06,0x0c,0x09,0x09,0x07,0x0a,0x09,0x09,0x07,0x0b,0x08,0x09,0x05,0x08,0x06,0x0b,0x06,0x08,0x0d,0x07, +0x08,0x0d,0x04,0x11,0x0d,0x0d,0x12,0x0d,0x0e,0x0e,0x0d,0x0d,0x0e,0x08,0x07,0x09,0x0b,0x0d,0x0b,0x0e,0x04,0x07,0x09,0x0d,0x0f,0x0b,0x0f,0x09,0x09,0x0c,0x0b,0x11,0x0e,0x08,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0f,0x08,0x08,0x0f,0x0b,0x08,0x08,0x0b,0x0a,0x05,0x05,0x0a,0x09,0x09,0x09,0x09,0x0b,0x05, +0x05,0x0d,0x0b,0x05,0x05,0x0d,0x06,0x06,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x08,0x06,0x08,0x08,0x0b,0x09,0x09,0x0d,0x0a,0x0b,0x0b,0x0c,0x0c,0x09,0x07,0x0f,0x0c,0x10,0x0d,0x0a,0x09,0x05,0x05,0x09, +0x0a,0x06,0x09,0x08,0x09,0x07,0x0b,0x0c,0x06,0x09,0x06,0x03,0x06,0x08,0x08,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x07,0x16,0x1e,0x05,0x06,0x02,0x04,0x06,0x06,0x05,0x07,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x14,0x08,0x0b,0x0e,0x0d,0x0a,0x07,0x08,0x0b,0x0b,0x07,0x05,0x0a,0x08,0x0a, +0x08,0x0a,0x08,0x08,0x0b,0x09,0x09,0x08,0x0b,0x09,0x0c,0x07,0x08,0x0a,0x05,0x09,0x05,0x05,0x04,0x0d,0x09,0x08,0x08,0x08,0x09,0x0e,0x0e,0x0e,0x0f,0x0f,0x08,0x08,0x04,0x08,0x07,0x09,0x07,0x0a,0x04,0x08,0x09,0x0d,0x0d,0x09,0x08,0x09,0x08,0x08,0x07,0x08,0x07,0x07,0x05,0x05,0x04,0x03,0x05,0x09,0x0a,0x04,0x04,0x04,0x04,0x04, +0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x00,0x04,0x04,0x04,0x04,0x04,0x19,0x0f,0x0d,0x10,0x04,0x04,0x05,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x0e,0x05,0x05,0x0e,0x04,0x08,0x08,0x14,0x0f,0x0f,0x14,0x0e,0x08,0x08,0x0e,0x08,0x08,0x06,0x06,0x00,0x00,0x05,0x0b,0x09,0x0b,0x09, +0x13,0x10,0x0a,0x08,0x0b,0x08,0x14,0x0f,0x0b,0x09,0x06,0x05,0x09,0x00,0x0a,0x08,0x05,0x05,0x02,0x07,0x05,0x05,0x04,0x03,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x08,0x06,0x09,0x09,0x08,0x0e,0x0c,0x0c,0x0c,0x0c,0x0e,0x09,0x0a,0x09,0x06,0x0e,0x11,0x07,0x11,0x08,0x0d,0x0e,0x0e,0x0e,0x06,0x0b,0x0f,0x0b,0x0a,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,0x09,0x09,0x0d,0x08,0x08,0x0e,0x05,0x05,0x0e,0x05,0x05,0x0e,0x07,0x07,0x00,0x06,0x0d,0x05,0x05,0x0f,0x08,0x08,0x0b,0x08,0x08,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x17,0x17,0x0d,0x00,0x00,0x0d,0x0d, +0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x09,0x0a,0x0a,0x0d,0x0a,0x09,0x0c,0x0f,0x0a,0x09,0x10,0x0a,0x0a,0x0e,0x09,0x0a,0x0c,0x0a,0x0c,0x0d,0x0e,0x0a,0x0c,0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x0a,0x09,0x0c,0x09,0x0a,0x0c,0x09,0x09,0x09,0x0c,0x0a,0x0a,0x0a,0x0a,0x07,0x08,0x0a,0x0c, +0x0c,0x08,0x00,0x00,0x10,0x20,0x0a,0x00,0x02,0x04,0x05,0x06,0x09,0x09,0x0d,0x0d,0x04,0x05,0x05,0x07,0x0b,0x03,0x06,0x03,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x03,0x03,0x0b,0x0b,0x0b,0x07,0x0f,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x0b,0x0b,0x04,0x06,0x09,0x08,0x0e,0x0c,0x0c,0x09,0x0c,0x0a,0x09,0x08,0x0b,0x0a, +0x0f,0x09,0x09,0x09,0x05,0x06,0x05,0x0b,0x07,0x04,0x08,0x09,0x07,0x09,0x08,0x05,0x09,0x09,0x04,0x04,0x08,0x04,0x0e,0x09,0x09,0x09,0x09,0x06,0x07,0x05,0x09,0x08,0x0c,0x07,0x08,0x07,0x05,0x04,0x05,0x0b,0x0a,0x0a,0x0a,0x08,0x0c,0x0c,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x09,0x09,0x07,0x07,0x07,0x09,0x06,0x0e,0x0e,0x0c,0x05,0x07,0x0b,0x0e,0x0c,0x0d,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0a,0x0c,0x09,0x06,0x07,0x0c,0x0d,0x09,0x07,0x04,0x05,0x0b,0x0a,0x09,0x0b,0x0a,0x08,0x08,0x0c,0x0a,0x0a,0x0c,0x0f,0x0f,0x08,0x10,0x06,0x06,0x04,0x04,0x0b,0x09, +0x08,0x09,0x03,0x09,0x05,0x05,0x09,0x09,0x06,0x03,0x04,0x06,0x13,0x0a,0x08,0x0a,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x04,0x06,0x05,0x05,0x05,0x03,0x04,0x03,0x05,0x03,0x06,0x08,0x04,0x09,0x07,0x09,0x07,0x04,0x0b,0x09,0x09,0x08,0x09,0x09,0x0b,0x0b,0x06,0x06,0x06,0x0f,0x0f,0x0f,0x08,0x0b,0x09,0x04, +0x09,0x07,0x0a,0x07,0x0a,0x07,0x09,0x07,0x03,0x0a,0x08,0x0a,0x08,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x04,0x08,0x05,0x08,0x05,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x06,0x0a,0x06,0x09,0x07,0x08,0x05,0x08,0x07,0x0b,0x09,0x0b,0x09,0x09,0x07,0x09,0x07,0x08,0x0c,0x0c,0x0a,0x09,0x07,0x09,0x08,0x0b,0x07,0x08,0x06,0x12,0x0a, +0x08,0x0a,0x04,0x06,0x0d,0x05,0x0a,0x06,0x06,0x0a,0x06,0x0a,0x08,0x0a,0x07,0x0a,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x09,0x08,0x08,0x08,0x04,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x06,0x09,0x07,0x08,0x05,0x0b,0x09, +0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0f,0x0c,0x09,0x08,0x04,0x0a,0x08,0x0e,0x0d,0x0c,0x09,0x03,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x09,0x08,0x04,0x07,0x09,0x0a,0x0f,0x0f,0x0f,0x0e,0x06,0x06,0x03,0x04,0x04,0x0a,0x09,0x0c,0x06,0x0d,0x0b,0x0d,0x04,0x0a,0x09,0x08,0x09,0x0b,0x04,0x09,0x0a,0x0e,0x0c,0x08,0x0c,0x0b,0x09,0x08,0x08,0x09, +0x09,0x0c,0x0c,0x04,0x09,0x0a,0x07,0x09,0x04,0x09,0x09,0x08,0x07,0x09,0x09,0x04,0x08,0x08,0x09,0x08,0x07,0x09,0x09,0x07,0x09,0x09,0x0c,0x0d,0x04,0x09,0x09,0x09,0x0d,0x08,0x0b,0x08,0x0a,0x09,0x04,0x10,0x10,0x0c,0x09,0x09,0x0b,0x0a,0x09,0x09,0x08,0x0b,0x08,0x0e,0x09,0x0c,0x0c,0x09,0x0b,0x0e,0x0b,0x0c,0x0b,0x09,0x0a,0x08, +0x09,0x0c,0x09,0x0c,0x0b,0x0f,0x10,0x0b,0x0d,0x09,0x0a,0x10,0x09,0x08,0x09,0x08,0x06,0x09,0x08,0x0c,0x07,0x09,0x09,0x08,0x08,0x0b,0x09,0x09,0x09,0x09,0x07,0x07,0x08,0x0b,0x07,0x0a,0x09,0x0d,0x0d,0x09,0x0b,0x08,0x07,0x0d,0x08,0x08,0x09,0x06,0x07,0x07,0x04,0x0d,0x0d,0x09,0x08,0x08,0x09,0x08,0x06,0x10,0x12,0x0a,0x06,0x06, +0x06,0x06,0x04,0x09,0x07,0x09,0x0c,0x0a,0x0b,0x09,0x05,0x05,0x04,0x04,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x08,0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x08,0x09,0x08,0x09,0x08,0x08,0x05,0x08,0x08,0x0c,0x09,0x04,0x06,0x04,0x04,0x08, +0x07,0x0f,0x0c,0x0a,0x08,0x09,0x08,0x0c,0x0a,0x09,0x08,0x09,0x08,0x0a,0x08,0x0a,0x09,0x0b,0x09,0x0c,0x08,0x0c,0x09,0x05,0x05,0x05,0x05,0x07,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x05,0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x08,0x08, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x04,0x04,0x04,0x04,0x09,0x08,0x09,0x08,0x09,0x08,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x09,0x09,0x09, +0x09,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x08,0x05,0x08,0x05,0x08,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0f,0x0c,0x0f,0x0c,0x09,0x07,0x09,0x07,0x09,0x08,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x05,0x0c,0x08,0x08,0x04,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09, +0x09,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x07,0x07,0x09,0x09,0x04,0x04,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x09,0x09,0x09,0x04, +0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0a,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x09,0x09,0x09,0x09,0x0a,0x0a,0x07,0x0b, +0x0c,0x09,0x09,0x09,0x08,0x09,0x08,0x0b,0x0a,0x0e,0x05,0x04,0x09,0x08,0x04,0x08,0x0e,0x0c,0x09,0x0c,0x10,0x0d,0x0a,0x09,0x09,0x09,0x07,0x08,0x05,0x05,0x08,0x05,0x08,0x0c,0x0b,0x09,0x08,0x09,0x07,0x0a,0x0a,0x07,0x07,0x09,0x09,0x06,0x06,0x09,0x04,0x06,0x07,0x05,0x14,0x12,0x10,0x0e,0x0c,0x08,0x11,0x0f,0x0d,0x0a,0x08,0x04, +0x04,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x0a,0x08,0x0a,0x08,0x0e,0x0d,0x0b,0x09,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0c,0x09,0x0a,0x07,0x04,0x14,0x12,0x10,0x0b,0x09,0x10,0x0b,0x0c,0x09,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x09,0x0c,0x09,0x09,0x06,0x0a,0x06,0x0b,0x09, +0x0b,0x09,0x08,0x07,0x0b,0x09,0x0c,0x09,0x09,0x09,0x07,0x0a,0x08,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x09,0x08,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x07,0x07,0x09,0x09,0x08,0x0a,0x07,0x07,0x08,0x09,0x04,0x09,0x09,0x08,0x08,0x07,0x09,0x09,0x09,0x04,0x04,0x05,0x04,0x06,0x04,0x0a,0x0e,0x0e,0x0e,0x09,0x09,0x09, +0x09,0x0b,0x0c,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x07,0x07,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x0a,0x0a,0x09,0x08,0x0c,0x08,0x07,0x07,0x08,0x07,0x07,0x06,0x06,0x06,0x07,0x0a,0x08,0x09,0x08,0x09,0x04,0x08,0x06,0x09,0x06,0x06,0x0f,0x0f,0x10,0x0a,0x08,0x0b,0x0d,0x09,0x09,0x08,0x08,0x09,0x09,0x09,0x0b,0x09,0x0a,0x0d, +0x09,0x0b,0x09,0x09,0x07,0x08,0x07,0x0a,0x08,0x0a,0x08,0x0e,0x0e,0x0a,0x08,0x0a,0x09,0x0a,0x07,0x0a,0x08,0x0b,0x09,0x09,0x07,0x09,0x09,0x07,0x04,0x0c,0x07,0x07,0x0e,0x0b,0x0a,0x09,0x0f,0x0b,0x0b,0x08,0x0e,0x0b,0x0c,0x09,0x0f,0x0c,0x09,0x07,0x0d,0x0c,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x15,0x12,0x0d,0x0a,0x12,0x0e,0x0e,0x0b, +0x09,0x07,0x08,0x06,0x07,0x00,0x00,0x10,0x0f,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x07,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x10,0x0d,0x0c,0x09,0x0a,0x07,0x08,0x07,0x0e,0x0b,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x04,0x0e,0x0c,0x09,0x08,0x0b,0x09,0x0a,0x09,0x0a,0x08,0x0a,0x08,0x0e,0x0d,0x08,0x08,0x0c,0x08,0x0c,0x08,0x0e,0x0c,0x09,0x07, +0x08,0x07,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x09,0x09,0x0e,0x0e,0x0d,0x0c,0x09,0x08,0x0e,0x0d,0x10,0x0e,0x0b,0x08,0x0b,0x0a,0x09,0x09,0x09,0x08,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x09,0x05,0x05,0x03,0x03, +0x03,0x03,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x04,0x05,0x05,0x03,0x03,0x09,0x09,0x09,0x09,0x05,0x05,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x04,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x07,0x05,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09, +0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x00, +0x00,0x00,0x00,0x00,0x0a,0x05,0x0a,0x05,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x08,0x0b,0x0d,0x08,0x07,0x09,0x09,0x07,0x07,0x04,0x05,0x08,0x06,0x0b,0x09,0x09,0x08,0x0a,0x0a,0x0a,0x0f,0x09,0x0a,0x0a, +0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x09,0x08,0x0c,0x07,0x07,0x07,0x08,0x06,0x08,0x09,0x07,0x09,0x09,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x07,0x07,0x03,0x04,0x06,0x05,0x08,0x07,0x07,0x07,0x06,0x05,0x06,0x05,0x07,0x08,0x05,0x05,0x06,0x08,0x06,0x06,0x05,0x05,0x04,0x04,0x06,0x03,0x05,0x08,0x05,0x05,0x04,0x05,0x05,0x05,0x03, +0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x05,0x07,0x05,0x03,0x03,0x05,0x05,0x05,0x05,0x06,0x07,0x05,0x09,0x03,0x06,0x09,0x0e,0x0a,0x09,0x09,0x0e,0x0a,0x0e,0x0c,0x08,0x09,0x08,0x07,0x12,0x07,0x09,0x0e,0x0f,0x0f,0x0a,0x0a,0x0a,0x07,0x08,0x08,0x07,0x07,0x08,0x03,0x00,0x00,0x00,0x00,0x09,0x0a,0x0a,0x0a,0x08,0x06,0x09,0x09,0x05, +0x0e,0x09,0x09,0x06,0x05,0x07,0x05,0x07,0x09,0x07,0x09,0x0e,0x0a,0x05,0x04,0x09,0x09,0x0a,0x09,0x09,0x05,0x09,0x08,0x04,0x0e,0x09,0x09,0x06,0x07,0x07,0x08,0x07,0x07,0x08,0x09,0x09,0x08,0x07,0x07,0x0c,0x04,0x07,0x04,0x09,0x07,0x06,0x04,0x04,0x05,0x04,0x03,0x03,0x06,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x08,0x08, +0x05,0x05,0x06,0x05,0x06,0x04,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x04,0x05,0x00,0x00,0x00,0x00,0x03,0x05,0x05,0x05,0x04,0x05,0x09,0x09,0x09,0x09,0x05,0x00,0x00,0x00,0x00,0x07,0x05,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x04,0x04,0x04,0x04,0x09,0x09,0x09,0x09,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0a,0x0b,0x09,0x0c,0x0a, +0x0f,0x0c,0x09,0x06,0x08,0x0b,0x09,0x0d,0x0b,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x0d,0x0d,0x10,0x07,0x04,0x08,0x09,0x07,0x08,0x08,0x09,0x09,0x08,0x10,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x0a,0x08,0x08,0x08,0x05,0x09,0x05,0x0c,0x0b,0x08,0x05,0x0d,0x08,0x0d,0x04,0x05, +0x09,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0d,0x04,0x09,0x04,0x08,0x07,0x04,0x04,0x08,0x04,0x0c,0x04,0x0f,0x08,0x0f,0x0f,0x09,0x09,0x09,0x08,0x08,0x07,0x07,0x13,0x13,0x15,0x15,0x0d,0x0d,0x08,0x08,0x03,0x10,0x0c,0x0d,0x0b,0x09,0x0b,0x08,0x08,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x0a,0x00,0x0a,0x0a, +0x0a,0x05,0x08,0x08,0x0f,0x05,0x0f,0x05,0x09,0x0b,0x09,0x07,0x0f,0x08,0x0f,0x08,0x0c,0x0d,0x05,0x08,0x08,0x07,0x04,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0b,0x0a,0x0f,0x05,0x08,0x07,0x0b,0x08,0x05,0x08,0x08,0x08,0x0f,0x05,0x0f,0x05,0x04,0x09,0x06,0x10,0x08,0x08,0x0a,0x0a,0x10,0x08,0x00,0x00,0x00,0x0a,0x00,0x0a,0x0a, +0x0a,0x0a,0x0c,0x0a,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x08,0x08,0x0c,0x0d,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x13, +0x0d,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d,0x08,0x09,0x09,0x09,0x10,0x10,0x08,0x08,0x10,0x08,0x08,0x10,0x08,0x08,0x10,0x08,0x08,0x0c,0x0c,0x11,0x10,0x0f,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x0b,0x05,0x0b,0x05, +0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0f,0x0c,0x0d,0x05,0x08,0x0c,0x0d,0x0c,0x0d,0x00,0x00,0x00,0x00,0x00,0x12,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x0a,0x00,0x00,0x00,0x13,0x0d,0x15,0x10,0x08,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x09,0x08,0x0f,0x0f,0x06,0x09,0x09,0x0a,0x14,0x0d,0x09,0x18,0x11,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x07,0x07,0x0c,0x0b,0x0b,0x08,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x14,0x18,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x07,0x0f,0x05,0x0f,0x05,0x0f,0x05, +0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x0b,0x09,0x08,0x08,0x07,0x13,0x0d,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x10,0x08,0x08,0x10,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x09,0x09,0x09,0x09,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x0b,0x05,0x05,0x07,0x07,0x13,0x0d,0x0a,0x09, +0x09,0x00,0x08,0x08,0x08,0x06,0x09,0x0b,0x0a,0x08,0x08,0x06,0x04,0x0c,0x09,0x0a,0x06,0x09,0x08,0x08,0x07,0x08,0x04,0x08,0x07,0x0a,0x08,0x09,0x07,0x09,0x07,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x07,0x08,0x08,0x05,0x08,0x09,0x0a,0x08,0x05,0x0c,0x09,0x0a,0x09,0x0a,0x08,0x09,0x08,0x06,0x0b,0x06,0x07, +0x07,0x08,0x0a,0x0a,0x08,0x10,0x08,0x10,0x05,0x04,0x03,0x09,0x03,0x02,0x00,0x02,0x04,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x0f,0x07,0x0c,0x09,0x0f,0x0c,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0e,0x08,0x0e,0x08,0x0e,0x0a,0x0b,0x0b,0x0b,0x0c,0x0e,0x10,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0c,0x09,0x11,0x0d,0x08,0x08,0x05,0x05,0x05,0x06,0x03,0x09,0x04,0x04,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x0a,0x09,0x07,0x08,0x0b,0x04,0x05,0x0b,0x0b,0x04,0x09,0x09,0x09,0x0b,0x0b,0x04,0x06,0x0b, +0x0a,0x0a,0x0a,0x09,0x09,0x0b,0x09,0x0d,0x0c,0x08,0x08,0x08,0x04,0x06,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x08,0x0b,0x09,0x09,0x0b,0x09,0x0c,0x09,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x09,0x07,0x08,0x0b,0x05,0x06,0x0b,0x05,0x09,0x09,0x09,0x0b,0x06,0x0b,0x0a,0x0a,0x09,0x0b,0x09,0x0d,0x0c,0x04,0x09,0x09,0x0a,0x0a,0x13,0x00, +0x0a,0x09,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x0c,0x0a,0x0b,0x0b,0x09,0x0b,0x0c,0x0c,0x08,0x0a,0x0c,0x0c,0x0b,0x0c,0x0d,0x0c,0x0b,0x09,0x09,0x0c,0x0b,0x09,0x0b,0x0b, +0x0b,0x0b,0x0b,0x0c,0x09,0x0a,0x0b,0x0a,0x0c,0x0a,0x0a,0x0a,0x0b,0x0d,0x08,0x09,0x09,0x0e,0x09,0x09,0x0c,0x0e,0x0a,0x09,0x11,0x09,0x09,0x0c,0x09,0x09,0x0c,0x09,0x0c,0x0d,0x0e,0x09,0x0c,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09,0x0a,0x0f,0x09,0x09,0x09,0x09,0x07,0x05,0x09,0x09,0x09,0x09,0x09, +0x0e,0x09,0x0e,0x08,0x09,0x0e,0x0b,0x09,0x0e,0x0c,0x0c,0x0e,0x09,0x09,0x0e,0x0e,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x09,0x09,0x09,0x0e,0x0a,0x09,0x09,0x09,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0d,0x0b,0x0a,0x09,0x0d,0x0b,0x0b,0x09,0x0b,0x0b,0x0c,0x0c,0x09,0x0b,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0b,0x0a, +0x0b,0x0b,0x0c,0x0d,0x0b,0x0c,0x0c,0x02,0x02,0x02,0x03,0x02,0x04,0x06,0x0e,0x09,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x0a,0x0a,0x09,0x05,0x0d,0x09,0x09,0x09,0x09,0x0a,0x08,0x09,0x04,0x09,0x08,0x09,0x07,0x0e,0x09,0x09,0x09,0x09,0x0d,0x09,0x09,0x06,0x0d,0x09,0x09,0x0b,0x0b,0x03,0x05,0x12,0x12,0x12,0x12,0x17,0x09,0x09,0x04,0x09, +0x06,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x09,0x07,0x07,0x09,0x0a,0x04,0x05,0x08,0x07,0x0c,0x0a,0x0a, +0x08,0x0a,0x08,0x07,0x07,0x0a,0x08,0x0d,0x08,0x07,0x08,0x0b,0x0c,0x07,0x0a,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x04,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x08,0x0a,0x0a,0x04,0x04, +0x04,0x04,0x04,0x09,0x05,0x08,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x0b,0x0a,0x08,0x08,0x06,0x09,0x07,0x08,0x0a,0x0a,0x04,0x08,0x08,0x0c,0x0a,0x07,0x0a,0x0a,0x08, +0x07,0x07,0x07,0x0a,0x08,0x0b,0x0a,0x08,0x07,0x0a,0x04,0x0a,0x07,0x0a,0x04,0x07,0x07,0x09,0x06,0x08,0x07,0x04,0x04,0x05,0x0d,0x0d,0x0a,0x08,0x08,0x0a,0x08,0x08,0x08,0x06,0x09,0x07,0x0c,0x07,0x0a,0x0a,0x08,0x09,0x0c,0x0a,0x0a,0x0a,0x08,0x08,0x07,0x08,0x0a,0x08,0x0a,0x09,0x0d,0x0d,0x09,0x0b,0x08,0x08,0x0e,0x08,0x06,0x09, +0x09,0x0a,0x0e,0x0e,0x0b,0x08,0x09,0x07,0x09,0x09,0x09,0x0b,0x08,0x08,0x0b,0x09,0x09,0x06,0x0a,0x0a,0x09,0x08,0x08,0x0e,0x0c,0x08,0x09,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x0f,0x09,0x09,0x09,0x0a,0x0a,0x08,0x08,0x04,0x0c,0x0b,0x0b,0x08,0x0b,0x03,0x03,0x07,0x07,0x03,0x03,0x0a,0x06,0x04,0x0c,0x0b,0x05,0x03,0x03,0x07,0x06, +0x06,0x04,0x04,0x04,0x06,0x0b,0x08,0x05,0x0a,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0a,0x06,0x07,0x09,0x07,0x03,0x04,0x06,0x08,0x05,0x0b,0x0b,0x0b,0x0f,0x0c,0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x0d,0x05,0x05,0x08,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x08,0x08,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d, +0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x08,0x08,0x0f,0x0f,0x08,0x08,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x10,0x0c,0x0d,0x08,0x09,0x09,0x0b,0x05,0x0b,0x0c,0x08,0x08,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0f,0x05,0x0c,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x0f,0x05, +0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x08,0x08,0x0c,0x08,0x08,0x0f,0x08,0x11,0x10,0x0f,0x08,0x0d,0x08,0x0d, +0x08,0x0d,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x0b,0x0b,0x05,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x00,0x13,0x0d,0x15,0x10,0x0f,0x08,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05, +0x0f,0x05,0x0f,0x05,0x09,0x09,0x08,0x08,0x07,0x13,0x0d,0x10,0x10,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x13,0x0d,0x09,0x0b,0x09,0x09,0x09,0x0b,0x09,0x09,0x13,0x13,0x0d,0x0d,0x07,0x07,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x09,0x09, +0x09,0x09,0x0f,0x05,0x0f,0x05,0x09,0x0b,0x09,0x09,0x13,0x13,0x0d,0x0d,0x13,0x13,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x04,0x05,0x04,0x00,0x00,0x00,0x0d,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0d,0x09,0x0d,0x09, +0x0d,0x09,0x0d,0x0b,0x0b,0x0b,0x04,0x04,0x08,0x07,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x07,0x09,0x08,0x09,0x0a,0x0a,0x0b,0x09,0x09,0x0a,0x08,0x0b,0x0c,0x0a,0x0c,0x0d,0x0a,0x0c,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x07,0x09,0x0a,0x0a,0x0b, +0x09,0x0a,0x09,0x0a,0x0a,0x08,0x08,0x0c,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0b,0x0f,0x0f,0x0c,0x0e,0x0e,0x09,0x0c,0x0e,0x0c,0x0a,0x0e,0x0c,0x0b,0x0b,0x0a,0x0a,0x0c,0x0d,0x0b,0x0a,0x0b,0x09,0x09,0x0f,0x0f,0x0f,0x0d,0x0f,0x0f,0x0b,0x0f,0x0f,0x0b,0x0c,0x0d,0x0c,0x0c,0x0c,0x0a,0x0e,0x0c,0x0d, +0x0b,0x0b,0x09,0x0c,0x0b,0x0b,0x0e,0x0c,0x0c,0x0e,0x09,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x09,0x0a,0x0a,0x0a,0x07,0x09,0x09,0x09,0x0a,0x0c,0x0d,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x08,0x08,0x09,0x09,0x08,0x08,0x09,0x09,0x08,0x07,0x0a,0x07,0x09,0x08, +0x09,0x0d,0x09,0x0d,0x09,0x09,0x09,0x0c,0x05,0x0d,0x0b,0x0b,0x0b,0x09,0x0c,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x0a,0x04,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x0e, +0x0e,0x0e,0x0e,0x08,0x0c,0x0c,0x08,0x07,0x08,0x08,0x09,0x08,0x0e,0x0d,0x0e,0x07,0x10,0x08,0x0d,0x0d,0x0d,0x0d,0x09,0x08,0x08,0x0c,0x09,0x0c,0x0b,0x09,0x07,0x07,0x10,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x16,0x0d,0x0d,0x07,0x04,0x07,0x04,0x07,0x04,0x04,0x04,0x08,0x09,0x09,0x09,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x07,0x0e, +0x03,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x13,0x13,0x0b,0x13,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x09,0x08,0x09,0x07,0x06,0x06,0x0b,0x09, +0x0b,0x07,0x12,0x0e,0x09,0x09,0x0f,0x0d,0x0e,0x0c,0x10,0x0d,0x0f,0x0c,0x0a,0x08,0x0c,0x09,0x0f,0x0c,0x0c,0x0a,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x12,0x0d,0x0c,0x09,0x0c,0x09,0x13,0x0e,0x0d,0x00,0x10,0x10,0x10,0x08,0x00,0x00,0x09,0x08,0x0b,0x09,0x09,0x07,0x11,0x0e,0x0f,0x0e,0x0b,0x09,0x0b,0x09,0x08,0x07,0x0c,0x0a,0x08,0x07, +0x0d,0x0b,0x0b,0x09,0x10,0x0d,0x09,0x09,0x0c,0x0c,0x0d,0x07,0x03,0x07,0x0b,0x07,0x10,0x10,0x04,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x0b,0x0c,0x04,0x03,0x04,0x03,0x0b,0x09,0x0c,0x0a,0x09,0x08,0x09,0x08,0x09,0x09,0x07,0x07,0x12,0x0d,0x12,0x0e,0x10,0x0e,0x0e, +0x0b,0x0e,0x0b,0x0e,0x0b,0x0a,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x05,0x08,0x04,0x0c,0x09,0x0e,0x0b,0x15,0x10,0x09,0x09,0x0b,0x0b,0x0d,0x0e,0x0c,0x09,0x10,0x0d,0x09,0x06,0x09,0x08,0x0a,0x08,0x0f,0x0c,0x0a,0x08,0x09,0x09,0x09,0x09,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x08,0x05,0x0b,0x05,0x0f,0x0b,0x06,0x09,0x0a,0x07, +0x0c,0x09,0x06,0x06,0x09,0x09,0x09,0x08,0x04,0x0c,0x0a,0x06,0x06,0x0a,0x07,0x0b,0x06,0x0c,0x0a,0x0a,0x07,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0a,0x06,0x09,0x07,0x0c,0x07,0x08,0x0e,0x08,0x09,0x0e,0x04,0x12,0x0e,0x0e,0x13,0x0e,0x0f,0x0f,0x0e,0x0e,0x0f,0x08,0x08,0x0a,0x0b,0x0e,0x0b,0x0f,0x04,0x07,0x09,0x0e,0x10,0x0b,0x10,0x0a, +0x0a,0x0d,0x0b,0x12,0x0f,0x08,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x10,0x08,0x08,0x10,0x0c,0x08,0x08,0x0c,0x0b,0x05,0x05,0x0b,0x09,0x09,0x09,0x09,0x0c,0x05,0x05,0x0d,0x0c,0x05,0x05,0x0d,0x07,0x07,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x06,0x09,0x08,0x0c,0x09,0x09,0x0e,0x0b,0x0c,0x0c,0x0d,0x0d,0x09,0x08,0x10,0x0d,0x11,0x0e,0x0b,0x09,0x05,0x05,0x09,0x0a,0x07,0x0a,0x08,0x09,0x08,0x0c,0x0d,0x06,0x09,0x07,0x03,0x06,0x09,0x09,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x07,0x18,0x20,0x05,0x07,0x02, +0x04,0x06,0x07,0x05,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x15,0x09,0x0c,0x0f,0x0e,0x0a,0x07,0x09,0x0c,0x0c,0x08,0x05,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x09,0x0c,0x09,0x09,0x08,0x0c,0x0a,0x0d,0x07,0x08,0x0a,0x05,0x09,0x05,0x06,0x04,0x0e,0x09,0x09,0x08,0x08,0x09,0x0f,0x0f,0x0f, +0x10,0x10,0x09,0x08,0x05,0x08,0x07,0x0a,0x07,0x0b,0x04,0x09,0x0a,0x0e,0x0e,0x0a,0x09,0x09,0x09,0x08,0x07,0x08,0x07,0x08,0x05,0x05,0x04,0x04,0x06,0x09,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x05,0x05,0x05,0x04,0x04,0x1b,0x10,0x0e,0x11,0x05,0x05,0x05,0x06,0x04,0x04,0x05, +0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x0f,0x05,0x05,0x0f,0x04,0x08,0x08,0x15,0x10,0x10,0x15,0x0f,0x08,0x08,0x0f,0x08,0x08,0x07,0x07,0x00,0x00,0x06,0x0c,0x0a,0x0b,0x09,0x14,0x11,0x0b,0x09,0x0b,0x09,0x15,0x10,0x0c,0x09,0x06,0x05,0x0a,0x00,0x0b,0x09,0x05,0x05,0x03,0x08,0x05,0x05,0x04,0x03,0x07,0x06,0x06,0x06, +0x06,0x06,0x06,0x06,0x06,0x03,0x08,0x07,0x09,0x09,0x09,0x0f,0x0d,0x0d,0x0d,0x0d,0x0f,0x0a,0x0b,0x0a,0x06,0x0f,0x12,0x07,0x12,0x08,0x0d,0x0f,0x0f,0x0f,0x07,0x0c,0x10,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x09,0x09,0x0d,0x08,0x08,0x0f,0x05,0x05,0x0f,0x05,0x05,0x0f, +0x08,0x08,0x00,0x07,0x0d,0x05,0x05,0x10,0x08,0x08,0x0c,0x08,0x08,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x18,0x18,0x0e,0x00,0x00,0x0e,0x0e,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0a,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x10,0x0a,0x0a,0x11, +0x0a,0x0a,0x0f,0x0a,0x0b,0x0d,0x0a,0x0c,0x0e,0x0f,0x0a,0x0c,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0c,0x0a,0x0b,0x0d,0x0a,0x0a,0x09,0x0d,0x0a,0x0a,0x0a,0x0b,0x07,0x08,0x0a,0x0d,0x0c,0x09,0x00,0x00,0x11,0x22,0x0b,0x00,0x02,0x05,0x05,0x07,0x0a,0x09,0x0e,0x0e,0x04,0x05,0x05,0x07,0x0c,0x04,0x07,0x04,0x07,0x09,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x0c,0x0c,0x0c,0x08,0x10,0x0b,0x0a,0x0b,0x0c,0x09,0x08,0x0c,0x0c,0x05,0x06,0x0a,0x08,0x0f,0x0d,0x0d,0x0a,0x0d,0x0a,0x09,0x09,0x0c,0x0b,0x10,0x0a,0x09,0x0a,0x05,0x06,0x05,0x0c,0x07,0x05,0x09,0x0a,0x08,0x0a,0x09,0x05,0x0a,0x0a,0x04,0x04,0x08,0x04,0x0f,0x0a,0x0a,0x0a,0x0a,0x06, +0x07,0x06,0x0a,0x08,0x0c,0x08,0x08,0x08,0x05,0x04,0x05,0x0c,0x0b,0x0b,0x0b,0x09,0x0d,0x0d,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x09,0x09,0x08,0x07,0x08,0x09,0x07,0x0f,0x0f,0x0d,0x05,0x07,0x0c,0x0f,0x0d,0x0e,0x0c,0x0c, +0x0c,0x09,0x0a,0x09,0x0a,0x0d,0x09,0x07,0x07,0x0d,0x0e,0x0a,0x08,0x05,0x05,0x0c,0x0b,0x09,0x0c,0x0b,0x09,0x09,0x0c,0x0b,0x0b,0x0d,0x10,0x10,0x09,0x11,0x06,0x06,0x04,0x04,0x0c,0x0a,0x08,0x09,0x03,0x09,0x05,0x05,0x09,0x09,0x06,0x04,0x04,0x06,0x15,0x0b,0x09,0x0b,0x09,0x09,0x05,0x05,0x05,0x05,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c, +0x04,0x06,0x06,0x05,0x05,0x03,0x05,0x03,0x06,0x03,0x06,0x08,0x05,0x09,0x07,0x0a,0x08,0x04,0x0c,0x0a,0x09,0x08,0x0a,0x0a,0x0c,0x0c,0x06,0x06,0x06,0x10,0x0f,0x10,0x08,0x0c,0x0a,0x05,0x09,0x07,0x0b,0x08,0x0b,0x08,0x0a,0x07,0x04,0x0b,0x09,0x0b,0x09,0x0c,0x0b,0x0c,0x09,0x09,0x09,0x09,0x08,0x04,0x08,0x05,0x08,0x05,0x0d,0x0a, +0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x06,0x09,0x07,0x0c,0x0a,0x0c,0x0a,0x0a,0x08,0x0a,0x08,0x08,0x0d,0x0d,0x0a,0x0a,0x07,0x0a,0x08,0x0c,0x07,0x08,0x07,0x13,0x0b,0x08,0x0a,0x04,0x06,0x0e,0x06,0x0a,0x06,0x06,0x0a,0x06,0x0b,0x09,0x0b,0x08,0x0b,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0a,0x0c,0x0a,0x0c, +0x0a,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x0a,0x08,0x08,0x08,0x04,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x09,0x07,0x09,0x06,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x10,0x0c,0x09,0x08,0x04,0x0b,0x09,0x0f,0x0e,0x0d,0x0a,0x04,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x09,0x08,0x04,0x07, +0x09,0x0a,0x10,0x10,0x10,0x0f,0x07,0x07,0x04,0x05,0x05,0x0b,0x0a,0x0d,0x06,0x0e,0x0b,0x0e,0x05,0x0b,0x0a,0x09,0x0a,0x0c,0x05,0x0a,0x0b,0x0f,0x0d,0x09,0x0d,0x0c,0x0a,0x09,0x09,0x09,0x0a,0x0d,0x0d,0x05,0x09,0x0a,0x07,0x0a,0x05,0x09,0x09,0x09,0x08,0x0a,0x0a,0x05,0x09,0x08,0x0a,0x09,0x08,0x0a,0x0a,0x08,0x09,0x09,0x0d,0x0e, +0x05,0x09,0x0a,0x09,0x0e,0x09,0x0c,0x08,0x0b,0x09,0x05,0x11,0x11,0x0c,0x0a,0x0a,0x0c,0x0b,0x0a,0x0a,0x08,0x0c,0x09,0x0f,0x09,0x0d,0x0d,0x0a,0x0b,0x0f,0x0c,0x0d,0x0c,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0d,0x0b,0x10,0x11,0x0c,0x0d,0x0a,0x0a,0x11,0x0a,0x09,0x0a,0x09,0x07,0x09,0x09,0x0d,0x08,0x0a,0x0a,0x08,0x09,0x0c,0x0a,0x0a, +0x0a,0x0a,0x08,0x07,0x08,0x0c,0x08,0x0a,0x0a,0x0e,0x0e,0x0a,0x0c,0x09,0x08,0x0e,0x09,0x09,0x0a,0x07,0x08,0x07,0x04,0x0d,0x0e,0x0a,0x08,0x08,0x0a,0x08,0x07,0x11,0x13,0x0b,0x06,0x06,0x06,0x06,0x04,0x09,0x07,0x09,0x0d,0x0a,0x0c,0x0a,0x05,0x06,0x05,0x05,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x08,0x05,0x05,0x05,0x08, +0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x04,0x05,0x04,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d, +0x0a,0x0d,0x0a,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x06,0x09,0x09,0x0d,0x0a,0x05,0x06,0x04,0x04,0x09,0x07,0x0f,0x0d,0x0a,0x09,0x0a,0x08,0x0d,0x0a,0x09,0x08,0x09,0x08,0x0b,0x08,0x0b,0x0a,0x0b,0x0a,0x0c,0x09,0x0d,0x0a,0x05,0x05,0x05,0x05,0x07, +0x07,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x08,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x05,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x04,0x0a,0x08,0x0a, +0x08,0x0a,0x08,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0c, +0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x08,0x0b,0x08,0x10,0x0c,0x10,0x0c,0x0a,0x08,0x0a,0x08,0x09,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x06,0x0c,0x08,0x09,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x08,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, +0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x0a,0x0a,0x07,0x07,0x0a,0x0a,0x05,0x05,0x0a,0x0a,0x09,0x09,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10, +0x10,0x10,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0c,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x08,0x0c,0x0d,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0c,0x0b,0x0f,0x05,0x05,0x0a,0x08,0x04,0x08,0x0f,0x0d,0x0a,0x0d,0x10,0x0d,0x0a,0x0a,0x0a,0x09,0x07,0x09, +0x05,0x06,0x09,0x06,0x09,0x0d,0x0c,0x0a,0x09,0x0a,0x08,0x0a,0x0a,0x08,0x07,0x09,0x09,0x06,0x07,0x09,0x04,0x07,0x08,0x05,0x15,0x13,0x11,0x0f,0x0c,0x09,0x12,0x10,0x0e,0x0b,0x09,0x05,0x04,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x0b,0x09,0x0b,0x09,0x0f,0x0e,0x0c,0x0a,0x0c,0x0a,0x0a,0x08,0x0d,0x0a, +0x0d,0x0a,0x0a,0x08,0x04,0x15,0x13,0x11,0x0c,0x0a,0x11,0x0c,0x0d,0x0a,0x0b,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x05,0x04,0x05,0x04,0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x0a,0x06,0x0c,0x0a,0x0c,0x0a,0x09,0x07,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x08,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x09,0x08,0x0a,0x09,0x0a,0x0a,0x0a, +0x09,0x0a,0x0a,0x0a,0x08,0x08,0x0a,0x0a,0x09,0x0a,0x07,0x07,0x09,0x09,0x05,0x0a,0x0a,0x09,0x08,0x08,0x0a,0x0a,0x0a,0x04,0x05,0x05,0x05,0x06,0x04,0x0a,0x0f,0x0f,0x0f,0x09,0x09,0x0a,0x0a,0x0c,0x0c,0x0b,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x07,0x04,0x04,0x05,0x05,0x06,0x06,0x0a,0x0a,0x09,0x08,0x0c,0x08,0x07,0x08, +0x09,0x08,0x08,0x06,0x06,0x06,0x08,0x0b,0x08,0x09,0x09,0x0a,0x04,0x08,0x07,0x0a,0x06,0x06,0x10,0x10,0x11,0x0a,0x08,0x0c,0x0d,0x0a,0x0a,0x08,0x08,0x09,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0a,0x0c,0x0a,0x0a,0x08,0x08,0x08,0x0a,0x09,0x0a,0x08,0x0f,0x0f,0x0a,0x09,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0a,0x07,0x0a,0x0a,0x08, +0x04,0x0d,0x08,0x08,0x0f,0x0c,0x0b,0x0a,0x0f,0x0c,0x0b,0x08,0x0f,0x0c,0x0c,0x0a,0x10,0x0d,0x09,0x08,0x0d,0x0d,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x16,0x13,0x0e,0x0b,0x13,0x0f,0x0f,0x0c,0x0a,0x07,0x09,0x07,0x07,0x00,0x00,0x11,0x10,0x0a,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0a,0x08,0x0c,0x0a,0x0e,0x0b,0x11,0x0e,0x0c,0x09,0x0b, +0x08,0x09,0x07,0x0f,0x0c,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x05,0x0f,0x0d,0x0a,0x09,0x0c,0x0a,0x0b,0x0a,0x0b,0x09,0x0b,0x09,0x0f,0x0e,0x09,0x09,0x0c,0x09,0x0c,0x09,0x0f,0x0d,0x09,0x08,0x09,0x08,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0d,0x0c,0x0a,0x0a,0x0f,0x0f,0x0e,0x0c, +0x09,0x08,0x0f,0x0e,0x11,0x0e,0x0c,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x0a,0x06,0x06,0x03,0x04,0x04,0x04,0x05,0x07,0x05,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x06,0x05,0x05,0x06,0x05,0x05,0x05,0x05,0x05,0x06, +0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x03,0x04,0x05,0x04,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x06,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x0b,0x06,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x08,0x0b,0x0e,0x08,0x08,0x09,0x09,0x07,0x07,0x04,0x05,0x08,0x07,0x0c,0x0a,0x0a,0x08,0x0b,0x0b,0x0b,0x10,0x09,0x0a,0x0a,0x08,0x08,0x08,0x07,0x09,0x0a,0x0c,0x0a,0x08,0x0c,0x08,0x07,0x07,0x09,0x07,0x08,0x0a,0x08,0x0a,0x0a,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x07, +0x07,0x03,0x04,0x06,0x05,0x09,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x07,0x09,0x05,0x05,0x06,0x08,0x06,0x06,0x05,0x05,0x04,0x04,0x06,0x03,0x05,0x08,0x06,0x06,0x05,0x06,0x06,0x06,0x03,0x06,0x06,0x08,0x05,0x05,0x06,0x05,0x06,0x07,0x05,0x03,0x04,0x06,0x05,0x06,0x05,0x06,0x07,0x05,0x0a,0x03,0x06,0x09,0x0f,0x0b,0x09,0x09,0x0f, +0x0b,0x0f,0x0d,0x09,0x0a,0x09,0x08,0x13,0x08,0x0a,0x0f,0x10,0x10,0x0b,0x0b,0x0b,0x08,0x08,0x09,0x07,0x08,0x09,0x03,0x00,0x00,0x00,0x00,0x0a,0x0b,0x0b,0x0b,0x08,0x07,0x0a,0x0a,0x05,0x0f,0x0a,0x0a,0x06,0x06,0x08,0x06,0x08,0x0a,0x08,0x0a,0x0f,0x0b,0x05,0x05,0x0a,0x09,0x0a,0x0a,0x0a,0x05,0x0a,0x08,0x04,0x0f,0x0a,0x0a,0x06, +0x07,0x07,0x08,0x08,0x08,0x09,0x0a,0x0a,0x09,0x07,0x08,0x0c,0x04,0x08,0x04,0x0a,0x08,0x06,0x05,0x05,0x06,0x04,0x03,0x03,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x04,0x03,0x03,0x06,0x06,0x06,0x05,0x05,0x04,0x04,0x05,0x04,0x06,0x00,0x00,0x00,0x00,0x04,0x05,0x05,0x06,0x05,0x05, +0x09,0x09,0x09,0x09,0x06,0x00,0x00,0x00,0x00,0x08,0x05,0x05,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03, +0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0b,0x0c,0x0a,0x0d,0x0b,0x10,0x0d,0x09,0x06,0x09,0x0c,0x09,0x0e,0x0c,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e, +0x11,0x07,0x04,0x09,0x0a,0x07,0x09,0x09,0x0a,0x0a,0x09,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x0b,0x09,0x09,0x09,0x06,0x0a,0x06,0x0d,0x0b,0x09,0x06,0x0e,0x09,0x0e,0x04,0x06,0x0a,0x0a,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0e,0x04,0x0a,0x04,0x09,0x07,0x04,0x04,0x09,0x04,0x0d,0x04,0x10,0x09,0x10,0x10,0x0a,0x0a,0x0a,0x09, +0x09,0x07,0x07,0x14,0x14,0x17,0x17,0x0e,0x0e,0x09,0x09,0x03,0x11,0x0d,0x0e,0x0b,0x0a,0x0b,0x09,0x09,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x0b,0x00,0x0b,0x0b,0x0b,0x06,0x09,0x09,0x10,0x06,0x10,0x06,0x0a,0x0b,0x0a,0x07,0x10,0x09,0x10,0x09,0x0d,0x0e,0x06,0x09,0x09,0x07,0x04,0x09,0x0a,0x09,0x0a,0x09, +0x0a,0x0a,0x09,0x0b,0x0b,0x10,0x06,0x09,0x07,0x0b,0x09,0x06,0x09,0x09,0x09,0x10,0x06,0x10,0x06,0x04,0x0a,0x07,0x11,0x09,0x09,0x0b,0x0b,0x11,0x09,0x00,0x00,0x00,0x0b,0x00,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x09,0x09,0x0d,0x0e,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06, +0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x09,0x07,0x07,0x07,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x09,0x0a,0x0a,0x0a,0x11,0x11,0x09,0x09,0x11,0x09,0x09,0x11,0x09,0x09,0x11,0x09,0x09,0x0d, +0x0d,0x12,0x11,0x10,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x0b,0x06,0x0b,0x06,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x10,0x0d,0x0e,0x06,0x09,0x0d,0x0e,0x0d,0x0e,0x00,0x00,0x00,0x00,0x00,0x13,0x12, +0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x0e,0x17,0x11,0x09,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x10,0x10,0x06,0x0a,0x0a,0x0a,0x15,0x0e,0x09,0x1a,0x12,0x06,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09, +0x07,0x07,0x0d,0x0b,0x0b,0x09,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x15,0x1a,0x00,0x00,0x00,0x00,0x00,0x0a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x09,0x09,0x07,0x14,0x0e,0x09,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x09,0x0a,0x0a, +0x0a,0x11,0x09,0x09,0x11,0x09,0x09,0x10,0x09,0x09,0x10,0x09,0x09,0x10,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x0b,0x06,0x06,0x07,0x07,0x14,0x0e,0x0b,0x0a,0x0a,0x00,0x09,0x09,0x09,0x06,0x0a,0x0c,0x0b,0x09,0x09,0x06,0x04,0x0d,0x0a,0x0a,0x06,0x09,0x08,0x08,0x08,0x08,0x04,0x09,0x07,0x0b,0x08,0x0a, +0x08,0x09,0x07,0x0b,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x08,0x08,0x08,0x05,0x09,0x0a,0x0a,0x09,0x06,0x0d,0x0a,0x0b,0x09,0x0b,0x08,0x0a,0x09,0x07,0x0c,0x06,0x07,0x07,0x08,0x0a,0x0a,0x09,0x11,0x09,0x11,0x06,0x04,0x03,0x09,0x04,0x02,0x00,0x02,0x04,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x07,0x07,0x07,0x09,0x09,0x10,0x07,0x0d,0x0a,0x10,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x0f,0x08,0x0f,0x08,0x0f,0x0b,0x0c,0x0c,0x0c,0x0d,0x0f,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0d,0x0a,0x12,0x0e,0x08,0x08,0x05,0x05,0x05,0x06,0x04,0x0a,0x04,0x04,0x0e,0x0b,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x03,0x00,0x00,0x04,0x00,0x00,0x0b,0x0a,0x07,0x08,0x0c,0x05,0x06,0x0b,0x0c,0x05,0x0a,0x09,0x09,0x0c,0x0b,0x05,0x07,0x0b,0x0a,0x0a,0x0b,0x0a,0x0a,0x0b,0x0a,0x0d,0x0c,0x09,0x09,0x09,0x04,0x06,0x0a,0x0a,0x09,0x09,0x09,0x0a,0x0b,0x08,0x0c,0x09,0x09,0x0c,0x0a,0x0c, +0x09,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0a,0x07,0x08,0x0c,0x05,0x06,0x0c,0x05,0x0a,0x09,0x09,0x0b,0x07,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0d,0x0c,0x05,0x0a,0x09,0x0b,0x0b,0x14,0x00,0x0b,0x09,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x05,0x00,0x0d,0x0b,0x0b,0x0c,0x09,0x0b,0x0d,0x0d,0x08,0x0b,0x0d,0x0d,0x0b,0x0d,0x0e,0x0d,0x0b,0x09,0x0a,0x0d,0x0c,0x0a,0x0c,0x0c,0x0b,0x0c,0x0c,0x0d,0x0a,0x0b,0x0c,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0e,0x08,0x0a,0x0a,0x0f,0x09,0x09,0x0d,0x0f,0x0a,0x09,0x12,0x0a,0x0a,0x0d, +0x09,0x09,0x0d,0x0a,0x0d,0x0e,0x0f,0x09,0x0d,0x09,0x0b,0x09,0x0a,0x0a,0x0b,0x09,0x0a,0x0d,0x09,0x0b,0x0b,0x09,0x09,0x0a,0x10,0x09,0x09,0x0a,0x0a,0x07,0x06,0x09,0x09,0x09,0x09,0x09,0x0f,0x09,0x0f,0x08,0x09,0x0f,0x0b,0x09,0x0f,0x0d,0x0d,0x0f,0x0a,0x09,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x0a,0x09,0x0a,0x0f, +0x0a,0x09,0x09,0x09,0x0f,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0d,0x0c,0x0b,0x09,0x0d,0x0b,0x0c,0x0a,0x0b,0x0c,0x0d,0x0c,0x0a,0x0c,0x0b,0x0c,0x0b,0x0d,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0d,0x0b,0x0d,0x0c,0x02,0x02,0x03,0x03,0x03,0x05,0x06,0x0f,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x05,0x0e,0x0a, +0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x05,0x0a,0x09,0x0a,0x07,0x0f,0x09,0x0a,0x0a,0x0a,0x0e,0x0a,0x0a,0x07,0x0e,0x0a,0x0a,0x0c,0x0c,0x04,0x05,0x13,0x13,0x13,0x13,0x18,0x09,0x09,0x04,0x09,0x07,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x0a,0x09,0x09,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x08,0x09,0x0a,0x07,0x07,0x0a,0x0a,0x04,0x05,0x08,0x07,0x0d,0x0b,0x0a,0x08,0x0a,0x08,0x07,0x07,0x0a,0x09,0x0e,0x09,0x08,0x08,0x0c,0x0d,0x07,0x0b,0x08,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07, +0x07,0x04,0x04,0x04,0x04,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x09,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x0a,0x05,0x08,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x0c,0x0b,0x09,0x08,0x07,0x09,0x07,0x08,0x0a,0x0a,0x04,0x08,0x09,0x0d,0x0b,0x08,0x0a,0x0a,0x08,0x08,0x07,0x08,0x0b,0x09,0x0b,0x0b,0x09,0x07,0x0a,0x04,0x0a,0x08,0x0b,0x04,0x08,0x07,0x0a,0x07,0x09,0x07,0x04,0x04,0x05,0x0e,0x0e,0x0a,0x08, +0x08,0x0a,0x09,0x08,0x08,0x07,0x0a,0x07,0x0d,0x08,0x0b,0x0b,0x08,0x0a,0x0d,0x0a,0x0a,0x0a,0x08,0x09,0x07,0x08,0x0b,0x09,0x0b,0x09,0x0e,0x0e,0x0a,0x0c,0x08,0x09,0x0f,0x08,0x07,0x0a,0x0a,0x0b,0x0f,0x0f,0x0b,0x09,0x0a,0x07,0x0a,0x0a,0x0a,0x0c,0x09,0x09,0x0c,0x0a,0x0a,0x06,0x0b,0x0b,0x0a,0x08,0x08,0x0f,0x0d,0x08,0x09,0x0a, +0x0a,0x0b,0x0b,0x0c,0x0c,0x06,0x10,0x0a,0x09,0x0a,0x0b,0x0b,0x09,0x09,0x05,0x0d,0x0c,0x0c,0x08,0x0c,0x04,0x04,0x07,0x07,0x04,0x04,0x0a,0x07,0x05,0x0d,0x0c,0x05,0x04,0x04,0x08,0x06,0x06,0x04,0x04,0x04,0x06,0x0b,0x08,0x05,0x0a,0x0c,0x0a,0x0a,0x08,0x0d,0x0a,0x0a,0x06,0x07,0x09,0x07,0x04,0x04,0x07,0x09,0x06,0x0b,0x0b,0x0b, +0x10,0x0d,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x0d,0x0e,0x06,0x06,0x09,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x09,0x09,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x10,0x09,0x09,0x10,0x10,0x09,0x09,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x11,0x0d,0x0e, +0x09,0x0a,0x0a,0x0b,0x06,0x0b,0x0d,0x09,0x09,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x06,0x0d,0x09,0x09,0x04,0x09,0x09,0x09,0x09,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x09,0x0d,0x09,0x09,0x10,0x09,0x12,0x11,0x10,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x0b,0x0b,0x06,0x06,0x0b,0x06,0x0b, +0x06,0x0b,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x09,0x06,0x06,0x06,0x06,0x00,0x14,0x0e,0x17,0x11,0x10,0x09,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x09,0x09,0x07,0x14,0x0e,0x11,0x11,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x0a,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x14,0x0e, +0x0a,0x0b,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x14,0x14,0x0e,0x0e,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x10,0x06,0x10,0x06,0x0a,0x0b,0x0a,0x0a,0x14,0x14,0x0e,0x0e,0x14,0x14,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04, +0x04,0x04,0x00,0x00,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04, +0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x0e,0x0b,0x0b,0x0b,0x04,0x04,0x09,0x07,0x0a,0x0b,0x0a,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x08,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x0b,0x09,0x0b,0x0d,0x0b,0x0d,0x0e,0x0b,0x0d,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x08,0x09,0x0a,0x0a,0x0b,0x0a,0x0b,0x0a,0x0a,0x0a,0x09,0x09,0x0d,0x0c,0x0c,0x0b,0x0c,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x0c,0x10,0x10,0x0c,0x0f,0x0e,0x09, +0x0d,0x0e,0x0d,0x0a,0x0e,0x0d,0x0c,0x0c,0x0a,0x0b,0x0d,0x0e,0x0c,0x0a,0x0c,0x0a,0x09,0x10,0x10,0x10,0x0e,0x10,0x10,0x0c,0x10,0x10,0x0c,0x0d,0x0d,0x0d,0x0c,0x0c,0x0b,0x0f,0x0d,0x0e,0x0c,0x0c,0x0a,0x0d,0x0c,0x0c,0x0e,0x0d,0x0c,0x0f,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0c,0x0c,0x0a,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x0a,0x0a,0x0a, +0x0a,0x0a,0x0a,0x09,0x09,0x0a,0x0b,0x0a,0x0a,0x08,0x0a,0x0a,0x0a,0x0a,0x0d,0x0e,0x0b,0x0b,0x0b,0x0d,0x0b,0x0c,0x09,0x08,0x0a,0x0a,0x08,0x08,0x09,0x09,0x08,0x08,0x0b,0x08,0x09,0x08,0x09,0x0d,0x0a,0x0e,0x09,0x0a,0x0a,0x0d,0x05,0x0d,0x0c,0x0c,0x0b,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05, +0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0f,0x0f,0x0f,0x0f,0x08,0x0d,0x0c,0x08,0x07,0x08,0x09,0x0a,0x08,0x0e,0x0e,0x0f,0x08,0x11,0x08,0x0e,0x0e,0x0e,0x0e,0x0a,0x08,0x08,0x0d,0x0a,0x0d, +0x0b,0x09,0x08,0x07,0x11,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x17,0x0e,0x0e,0x07,0x04,0x08,0x04,0x08,0x04,0x04,0x04,0x08,0x0a,0x0a,0x09,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x07,0x0f,0x04,0x0f,0x0f,0x0f,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x0b,0x14,0x14,0x0b,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x0a,0x08,0x09,0x07,0x06,0x06,0x0c,0x09,0x0c,0x07,0x13,0x0f,0x0a,0x09,0x10,0x0d,0x0e,0x0d,0x11,0x0e,0x10,0x0d,0x0b,0x08,0x0c,0x0a,0x10,0x0c,0x0d,0x0a,0x0d,0x0a,0x0f,0x0b,0x0f,0x0b, +0x13,0x0e,0x0d,0x0a,0x0d,0x0a,0x15,0x0f,0x0d,0x00,0x11,0x11,0x11,0x08,0x00,0x00,0x0a,0x09,0x0c,0x09,0x09,0x07,0x12,0x0f,0x10,0x0f,0x0c,0x0a,0x0c,0x0a,0x09,0x07,0x0d,0x0a,0x09,0x07,0x0e,0x0b,0x0b,0x0a,0x11,0x0e,0x09,0x0a,0x0c,0x0c,0x0e,0x08,0x03,0x08,0x0c,0x07,0x11,0x11,0x04,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +0x11,0x11,0x11,0x07,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, +0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d, +0x0d,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x0c,0x0c,0x05,0x04,0x05,0x04,0x0c,0x0a,0x0d,0x0b,0x09,0x08,0x09,0x08,0x0a,0x0a,0x07,0x07,0x13,0x0e,0x14,0x0f,0x11,0x0e,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x0b,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x09,0x05,0x08,0x04,0x0d,0x0a,0x0f,0x0b,0x17,0x11,0x0a,0x0a,0x0c,0x0c,0x0e, +0x0f,0x0d,0x0a,0x11,0x0d,0x09,0x07,0x0a,0x08,0x0b,0x08,0x10,0x0c,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x08,0x07,0x08,0x07,0x08,0x06,0x09,0x09,0x05,0x0b,0x06,0x10,0x0b,0x06,0x0a,0x0a,0x08,0x0d,0x0a,0x06,0x06,0x0a,0x0a,0x0a,0x08,0x04,0x0d,0x0a,0x06,0x06,0x0b,0x08,0x0c,0x07,0x0d,0x0a,0x0b,0x08,0x0c,0x0a,0x0a,0x08,0x0d,0x0a,0x0a, +0x06,0x09,0x07,0x0d,0x07,0x09,0x0f,0x08,0x0a,0x0f,0x05,0x13,0x0f,0x0f,0x14,0x0f,0x10,0x10,0x0f,0x0f,0x10,0x09,0x08,0x0b,0x0c,0x0f,0x0c,0x10,0x04,0x08,0x0a,0x0f,0x12,0x0c,0x12,0x0b,0x0b,0x0e,0x0c,0x13,0x10,0x09,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x11,0x09,0x09,0x11,0x0d,0x09,0x09,0x0d,0x0b,0x06, +0x06,0x0b,0x0a,0x0a,0x0a,0x0a,0x0d,0x06,0x06,0x0e,0x0d,0x06,0x06,0x0e,0x07,0x07,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x09,0x07,0x0a,0x09,0x0d,0x0a,0x0a,0x0f,0x0b,0x0d,0x0d,0x0e,0x0e,0x0a,0x08,0x11, +0x0e,0x12,0x0f,0x0c,0x0a,0x05,0x05,0x0a,0x0b,0x07,0x0a,0x09,0x0a,0x08,0x0d,0x0e,0x07,0x0a,0x07,0x04,0x06,0x09,0x09,0x04,0x04,0x03,0x04,0x06,0x06,0x06,0x08,0x19,0x22,0x06,0x07,0x02,0x05,0x07,0x07,0x05,0x08,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x17,0x09,0x0d,0x10,0x0f,0x0b,0x08, +0x0a,0x0c,0x0c,0x08,0x05,0x0b,0x09,0x0c,0x09,0x0b,0x09,0x09,0x0d,0x0a,0x0a,0x09,0x0d,0x0a,0x0e,0x08,0x09,0x0b,0x05,0x0a,0x06,0x06,0x04,0x0f,0x0a,0x0a,0x09,0x09,0x0a,0x10,0x10,0x10,0x11,0x11,0x09,0x08,0x05,0x09,0x08,0x0a,0x08,0x0b,0x04,0x0a,0x0a,0x0f,0x0f,0x0a,0x09,0x0a,0x09,0x09,0x08,0x09,0x08,0x08,0x05,0x06,0x04,0x04, +0x06,0x0a,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x05,0x05,0x05,0x04,0x04,0x1d,0x11,0x0f,0x12,0x05,0x05,0x06,0x07,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x10,0x06,0x06,0x10,0x04,0x09,0x09,0x17,0x11,0x11,0x17,0x10,0x09,0x09,0x10,0x09,0x09,0x07, +0x07,0x00,0x00,0x06,0x0d,0x0a,0x0c,0x0a,0x15,0x12,0x0c,0x09,0x0c,0x09,0x17,0x11,0x0d,0x0a,0x07,0x05,0x0b,0x00,0x0c,0x09,0x06,0x05,0x03,0x08,0x06,0x06,0x04,0x03,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x09,0x07,0x0a,0x0a,0x09,0x10,0x0e,0x0e,0x0d,0x0e,0x10,0x0b,0x0c,0x0a,0x07,0x10,0x13,0x07,0x14,0x09,0x0e,0x10, +0x10,0x10,0x07,0x0d,0x11,0x0d,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x0a,0x0a,0x0a,0x0e,0x09,0x09,0x10,0x06,0x06,0x10,0x06,0x06,0x10,0x08,0x08,0x00,0x07,0x0e,0x06,0x06,0x11,0x09,0x09,0x0d,0x09,0x09,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, +0x05,0x1a,0x1a,0x0f,0x00,0x00,0x0f,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0f,0x0b,0x0b,0x0e,0x11,0x0b,0x0b,0x12,0x0b,0x0b,0x10,0x0b,0x0b,0x0d,0x0b,0x0d,0x0e,0x10,0x0b,0x0d,0x0b,0x0c,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0d,0x0a,0x0b,0x0d,0x0b,0x0b,0x0a,0x0d, +0x0b,0x0b,0x0b,0x0c,0x08,0x09,0x0b,0x0d,0x0d,0x09,0x00,0x00,0x13,0x26,0x0c,0x00,0x02,0x05,0x05,0x07,0x0b,0x0a,0x10,0x0f,0x04,0x06,0x06,0x08,0x0d,0x04,0x08,0x04,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x0d,0x0d,0x0d,0x09,0x12,0x0c,0x0b,0x0c,0x0d,0x0a,0x09,0x0d,0x0d,0x05,0x07,0x0b,0x09,0x11,0x0e, +0x0e,0x0b,0x0e,0x0b,0x0a,0x0a,0x0d,0x0c,0x12,0x0b,0x0b,0x0b,0x06,0x07,0x06,0x0d,0x08,0x05,0x0a,0x0b,0x09,0x0b,0x0a,0x06,0x0b,0x0b,0x05,0x05,0x09,0x05,0x10,0x0b,0x0b,0x0b,0x0b,0x07,0x08,0x06,0x0b,0x09,0x0e,0x09,0x09,0x09,0x06,0x05,0x06,0x0d,0x0c,0x0c,0x0c,0x0a,0x0e,0x0e,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a, +0x0a,0x0a,0x05,0x05,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x0a,0x0a,0x09,0x08,0x09,0x0a,0x08,0x11,0x11,0x0f,0x05,0x08,0x0d,0x10,0x0e,0x10,0x0d,0x0d,0x0d,0x0a,0x0b,0x0a,0x0c,0x0e,0x0a,0x07,0x08,0x0e,0x10,0x0b,0x09,0x05,0x05,0x0d,0x0c,0x0a,0x0d,0x0c,0x0a,0x0a,0x0e,0x0c,0x0c,0x0e,0x12,0x12, +0x0a,0x13,0x07,0x07,0x04,0x04,0x0d,0x0b,0x09,0x0b,0x03,0x0a,0x06,0x06,0x0b,0x0b,0x07,0x04,0x04,0x07,0x17,0x0c,0x0a,0x0c,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x05,0x07,0x06,0x06,0x06,0x04,0x05,0x04,0x06,0x04,0x07,0x09,0x05,0x0a,0x08,0x0b,0x09,0x05,0x0d,0x0b,0x0b,0x09,0x0b,0x0b,0x0d,0x0d,0x07,0x07, +0x07,0x12,0x11,0x12,0x09,0x0d,0x0b,0x05,0x0a,0x08,0x0c,0x09,0x0c,0x09,0x0b,0x08,0x04,0x0c,0x0a,0x0c,0x0a,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x09,0x05,0x09,0x06,0x09,0x06,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x07,0x0b,0x07,0x0a,0x08,0x0a,0x06,0x0a,0x08,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0b,0x09,0x09,0x0e,0x0e,0x0c,0x0b,0x08, +0x0b,0x09,0x0d,0x08,0x09,0x07,0x15,0x0c,0x09,0x0c,0x04,0x07,0x0f,0x06,0x0b,0x07,0x07,0x0b,0x07,0x0c,0x0a,0x0c,0x09,0x0c,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x05,0x0b,0x09,0x09,0x09,0x05,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b, +0x0b,0x07,0x0a,0x08,0x0a,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x12,0x0e,0x0b,0x09,0x05,0x0c,0x0a,0x10,0x10,0x0e,0x0b,0x04,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0b,0x09,0x04,0x08,0x0a,0x0b,0x12,0x12,0x12,0x11,0x07,0x07,0x04,0x05,0x05,0x0c,0x0b,0x0f,0x07,0x0f,0x0d,0x10,0x05,0x0c,0x0b,0x0a,0x0b,0x0d,0x05,0x0b,0x0c,0x11, +0x0e,0x0a,0x0e,0x0e,0x0b,0x0a,0x0a,0x0b,0x0b,0x0f,0x0e,0x05,0x0b,0x0c,0x08,0x0b,0x05,0x0b,0x0a,0x0a,0x08,0x0b,0x0b,0x05,0x0a,0x09,0x0b,0x0a,0x08,0x0b,0x0b,0x09,0x0b,0x0a,0x0e,0x0f,0x05,0x0b,0x0b,0x0b,0x0f,0x0a,0x0d,0x09,0x0c,0x0a,0x05,0x13,0x13,0x0e,0x0b,0x0b,0x0d,0x0c,0x0b,0x0b,0x09,0x0d,0x0a,0x10,0x0a,0x0e,0x0e,0x0b, +0x0d,0x11,0x0d,0x0e,0x0e,0x0b,0x0c,0x0a,0x0b,0x0e,0x0b,0x0e,0x0d,0x12,0x13,0x0d,0x0f,0x0b,0x0c,0x13,0x0b,0x0a,0x0b,0x0a,0x07,0x0a,0x0a,0x0e,0x08,0x0b,0x0b,0x09,0x0a,0x0d,0x0b,0x0b,0x0b,0x0b,0x09,0x08,0x09,0x0d,0x09,0x0b,0x0b,0x0f,0x10,0x0b,0x0d,0x0a,0x09,0x0f,0x0a,0x0a,0x0b,0x07,0x09,0x08,0x05,0x0f,0x0f,0x0b,0x09,0x09, +0x0b,0x09,0x07,0x13,0x15,0x0c,0x07,0x07,0x07,0x07,0x05,0x0a,0x08,0x0b,0x0e,0x0b,0x0d,0x0b,0x06,0x06,0x05,0x05,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x09,0x06,0x09,0x06,0x06,0x06,0x09,0x09,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x06,0x0a, +0x0a,0x0e,0x0b,0x05,0x07,0x05,0x05,0x0a,0x08,0x11,0x0f,0x0c,0x0a,0x0b,0x09,0x0e,0x0b,0x0b,0x09,0x0b,0x09,0x0c,0x09,0x0c,0x0b,0x0d,0x0b,0x0e,0x0a,0x0e,0x0b,0x06,0x06,0x06,0x06,0x08,0x08,0x09,0x09,0x09,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x09,0x0d,0x0b,0x0d,0x0b,0x0d, +0x0b,0x0d,0x0b,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x05,0x05,0x05,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x05,0x09,0x05,0x09,0x05,0x09,0x05,0x11,0x10,0x11,0x10,0x11,0x10,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e, +0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0c,0x09,0x0c,0x09,0x12,0x0e,0x12,0x0e,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b, +0x09,0x0b,0x06,0x0e,0x09,0x0a,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x09,0x09,0x0a, +0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x08,0x08,0x0b,0x0b,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, +0x0b,0x0f,0x0f,0x0d,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x0c,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x10,0x0e,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c, +0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x09,0x0d,0x0e,0x0b,0x0b,0x0b,0x0a,0x0a,0x09,0x0d,0x0c,0x11,0x05,0x05,0x0b,0x09,0x05,0x09,0x11,0x0e,0x0b,0x0e,0x12,0x0f,0x0b,0x0b,0x0b,0x0a,0x08,0x0a,0x06,0x06,0x0a,0x06,0x0a,0x0e,0x0e,0x0b,0x0a,0x0b,0x09,0x0c,0x0c,0x08,0x08,0x0a,0x0a,0x07,0x07,0x0a,0x05,0x07,0x09,0x05,0x18,0x16,0x13,0x10, +0x0e,0x0a,0x14,0x12,0x0f,0x0c,0x0a,0x05,0x05,0x0e,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0a,0x0c,0x0a,0x0c,0x0a,0x10,0x10,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0e,0x0b,0x0c,0x08,0x05,0x18,0x16,0x13,0x0d,0x0b,0x13,0x0d,0x0e,0x0b,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0b, +0x0e,0x0b,0x0b,0x07,0x0b,0x07,0x0d,0x0b,0x0d,0x0b,0x0a,0x08,0x0d,0x0b,0x0e,0x0b,0x0b,0x0b,0x09,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x09,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x09,0x09,0x0b,0x0b,0x0a,0x0c,0x08,0x08,0x0a,0x0a,0x05,0x0b,0x0b,0x0a,0x09,0x09,0x0b,0x0b,0x0b,0x05,0x05,0x06,0x05,0x07, +0x05,0x0b,0x10,0x10,0x10,0x0b,0x0b,0x0b,0x0b,0x0d,0x0e,0x0c,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x09,0x09,0x08,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x0b,0x0b,0x09,0x0e,0x09,0x08,0x09,0x0a,0x08,0x08,0x07,0x07,0x07,0x09,0x0c,0x09,0x0a,0x0a,0x0b,0x05,0x09,0x07,0x0b,0x07,0x07,0x11,0x12,0x13,0x0c,0x09,0x0e,0x0f,0x0b,0x0b,0x09, +0x09,0x0a,0x0b,0x0b,0x0d,0x0b,0x0c,0x0f,0x0b,0x0d,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x0a,0x0c,0x09,0x11,0x10,0x0b,0x0a,0x0c,0x0a,0x0c,0x09,0x0b,0x09,0x0d,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x05,0x0e,0x09,0x09,0x10,0x0d,0x0c,0x0b,0x11,0x0e,0x0d,0x09,0x11,0x0d,0x0e,0x0b,0x12,0x0e,0x0a,0x09,0x0f,0x0e,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b, +0x19,0x15,0x10,0x0c,0x15,0x11,0x10,0x0d,0x0b,0x08,0x0a,0x07,0x08,0x00,0x00,0x13,0x12,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0a,0x09,0x0b,0x09,0x0d,0x0b,0x10,0x0d,0x13,0x10,0x0e,0x0b,0x0c,0x09,0x0a,0x08,0x11,0x0d,0x0d,0x0b,0x10,0x0c,0x10,0x0c,0x05,0x10,0x0e,0x0b,0x0a,0x0d,0x0b,0x0c,0x0b,0x0c,0x0a,0x0c,0x0a,0x10,0x10,0x0a,0x0a, +0x0e,0x0a,0x0e,0x0a,0x10,0x0e,0x0a,0x08,0x0a,0x08,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0d,0x0b,0x0f,0x0d,0x0b,0x0b,0x10,0x10,0x0f,0x0e,0x0b,0x09,0x11,0x0f,0x13,0x10,0x0e,0x0a,0x0d,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x04,0x04,0x0b,0x06,0x06,0x03,0x04,0x04,0x04,0x05,0x08,0x05,0x04,0x07,0x04,0x04,0x04,0x06,0x06,0x04,0x04,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x05,0x06,0x06,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x05,0x05,0x04,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x08,0x06,0x05,0x05,0x0a,0x0a,0x0a,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x07,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a, +0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x0c,0x06,0x0b,0x0b,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x09,0x0d,0x10,0x09,0x09,0x0a,0x0b,0x08,0x08,0x05,0x06,0x09,0x07,0x0d,0x0b,0x0b, +0x09,0x0c,0x0c,0x0c,0x12,0x0a,0x0b,0x0b,0x09,0x09,0x09,0x08,0x0a,0x0b,0x0e,0x0b,0x09,0x0e,0x09,0x08,0x08,0x0a,0x07,0x09,0x0b,0x09,0x0b,0x0b,0x07,0x09,0x07,0x07,0x08,0x06,0x06,0x08,0x08,0x04,0x04,0x07,0x05,0x0a,0x08,0x08,0x08,0x07,0x06,0x07,0x06,0x08,0x0a,0x06,0x06,0x07,0x09,0x07,0x07,0x06,0x06,0x05,0x05,0x07,0x03,0x06, +0x09,0x06,0x07,0x05,0x07,0x07,0x07,0x04,0x06,0x06,0x09,0x05,0x06,0x06,0x06,0x07,0x08,0x06,0x03,0x04,0x06,0x05,0x06,0x06,0x07,0x08,0x06,0x0b,0x03,0x07,0x0a,0x11,0x0c,0x0a,0x0a,0x10,0x0c,0x10,0x0e,0x0a,0x0b,0x0a,0x09,0x15,0x09,0x0b,0x11,0x12,0x12,0x0c,0x0c,0x0c,0x09,0x09,0x0a,0x08,0x09,0x0a,0x04,0x00,0x00,0x00,0x00,0x0b, +0x0c,0x0c,0x0c,0x09,0x07,0x0b,0x0b,0x06,0x10,0x0b,0x0b,0x07,0x06,0x09,0x06,0x09,0x0b,0x09,0x0b,0x11,0x0c,0x06,0x05,0x0b,0x0a,0x0b,0x0b,0x0b,0x06,0x0b,0x09,0x05,0x10,0x0b,0x0b,0x07,0x08,0x08,0x09,0x09,0x09,0x0a,0x0b,0x0b,0x0a,0x08,0x08,0x0e,0x05,0x09,0x05,0x0b,0x08,0x07,0x05,0x05,0x07,0x05,0x03,0x03,0x07,0x06,0x03,0x03, +0x03,0x03,0x03,0x03,0x03,0x04,0x09,0x09,0x06,0x06,0x07,0x06,0x07,0x04,0x03,0x04,0x06,0x07,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x07,0x00,0x00,0x00,0x00,0x04,0x06,0x06,0x07,0x05,0x06,0x0a,0x0a,0x0a,0x0a,0x06,0x00,0x00,0x00,0x00,0x09,0x06,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07, +0x06,0x06,0x0f,0x0c,0x0d,0x0b,0x0e,0x0c,0x12,0x0e,0x0a,0x07,0x0a,0x0d,0x0a,0x10,0x0d,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x13,0x08,0x05,0x0a,0x0b,0x08,0x0a,0x0a,0x0b,0x0b,0x0a,0x13,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0a,0x06,0x0b,0x06,0x0e, +0x0d,0x0a,0x06,0x10,0x0a,0x10,0x05,0x06,0x0b,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x10,0x05,0x0b,0x05,0x0a,0x08,0x05,0x05,0x0a,0x05,0x0e,0x05,0x11,0x0a,0x11,0x11,0x0b,0x0b,0x0b,0x0a,0x0a,0x08,0x08,0x16,0x16,0x19,0x19,0x10,0x10,0x0a,0x0a,0x03,0x13,0x0e,0x10,0x0d,0x0b,0x0d,0x0a,0x0a,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x0b,0x05,0x0c,0x00,0x0c,0x0c,0x0c,0x06,0x0a,0x0a,0x11,0x06,0x11,0x06,0x0b,0x0d,0x0b,0x08,0x11,0x0a,0x11,0x0a,0x0e,0x10,0x06,0x0a,0x0a,0x08,0x05,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0d,0x0c,0x11,0x06,0x0a,0x08,0x0d,0x0a,0x06,0x0a,0x0a,0x0a,0x11,0x06,0x11,0x06,0x05,0x0b,0x07,0x13,0x0a,0x0a,0x0c,0x0c,0x13, +0x0a,0x00,0x00,0x00,0x0c,0x00,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x0a,0x0a,0x0e,0x10,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, +0x08,0x08,0x08,0x0a,0x08,0x08,0x08,0x16,0x10,0x16,0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x0a,0x0b,0x0b,0x0b,0x13,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x0e,0x0e,0x15,0x13,0x11,0x0a,0x10,0x0a,0x10,0x0a,0x10,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x0d, +0x06,0x0d,0x06,0x0d,0x0d,0x06,0x0d,0x06,0x0a,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x0e,0x10,0x06,0x0a,0x0e,0x10,0x0e,0x10,0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x08,0x00,0x00,0x0b,0x00,0x00,0x00,0x16,0x10,0x19,0x13,0x0a,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x11,0x11,0x07,0x0b,0x0b,0x0b,0x17,0x10,0x0a,0x1d,0x15,0x06,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x08,0x08,0x0e,0x0d,0x0d,0x0a,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x18,0x1d,0x00,0x00,0x00,0x00,0x00,0x0b,0x0a,0x00,0x00,0x00,0x00,0x00,0x00, +0x11,0x08,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0a,0x0a,0x08,0x16,0x10,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x0d,0x0d, +0x06,0x06,0x08,0x08,0x16,0x10,0x0c,0x0b,0x0b,0x00,0x0a,0x0a,0x0a,0x07,0x0b,0x0d,0x0c,0x0a,0x0a,0x07,0x05,0x0e,0x0b,0x0b,0x07,0x0b,0x09,0x09,0x09,0x09,0x05,0x0a,0x08,0x0c,0x09,0x0b,0x09,0x0a,0x08,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x09,0x09,0x09,0x05,0x0a,0x0b,0x0b,0x0a,0x06,0x0e,0x0b,0x0c,0x0a, +0x0c,0x09,0x0b,0x0a,0x08,0x0d,0x07,0x08,0x08,0x09,0x0b,0x0b,0x0a,0x13,0x0a,0x13,0x06,0x05,0x03,0x0a,0x04,0x02,0x00,0x03,0x04,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x12,0x08,0x0e,0x0b,0x12,0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x10,0x09,0x10,0x09,0x10,0x0c, +0x0d,0x0d,0x0d,0x0f,0x10,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0e,0x0b,0x14,0x10,0x09,0x09,0x05,0x05,0x05,0x07,0x04,0x0b,0x04,0x04,0x10,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x0c,0x0b,0x08,0x09,0x0d,0x05,0x06,0x0d,0x0d,0x05, +0x0b,0x0a,0x0a,0x0d,0x0d,0x05,0x08,0x0d,0x0b,0x0c,0x0c,0x0b,0x0b,0x0d,0x0b,0x0f,0x0e,0x0a,0x0a,0x0a,0x04,0x07,0x0b,0x0b,0x0a,0x0a,0x0a,0x0b,0x0c,0x09,0x0d,0x0a,0x0a,0x0d,0x0b,0x0e,0x0a,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0b,0x08,0x09,0x0d,0x06,0x07,0x0d,0x06,0x0b,0x0a,0x0a,0x0d,0x08,0x0d,0x0c,0x0c,0x0b,0x0d,0x0b,0x0f, +0x0e,0x05,0x0b,0x0a,0x0c,0x0c,0x17,0x00,0x0c,0x0a,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x0e,0x0c,0x0d,0x0d,0x0a,0x0d,0x0e,0x0e,0x09,0x0c,0x0e,0x0e,0x0d,0x0e,0x0f,0x0f, +0x0d,0x0a,0x0b,0x0e,0x0d,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0b,0x0c,0x0d,0x0c,0x0f,0x0c,0x0c,0x0c,0x0d,0x10,0x09,0x0b,0x0b,0x11,0x0a,0x0a,0x0f,0x11,0x0c,0x0a,0x14,0x0b,0x0b,0x0e,0x0a,0x0a,0x0e,0x0b,0x0e,0x0f,0x11,0x0a,0x0f,0x0a,0x0c,0x0a,0x0c,0x0b,0x0c,0x0a,0x0b,0x0f,0x0a,0x0c,0x0d,0x0a,0x0a,0x0b,0x12,0x0a,0x0a,0x0b, +0x0b,0x08,0x06,0x0b,0x0b,0x0b,0x0a,0x0b,0x11,0x0b,0x11,0x09,0x0b,0x11,0x0d,0x0b,0x11,0x0e,0x0e,0x11,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x0b,0x0a,0x0b,0x0b,0x11,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0f,0x0d,0x0c,0x0a,0x0f,0x0d,0x0d,0x0b,0x0d,0x0d,0x0e,0x0e,0x0b,0x0d,0x0d, +0x0e,0x0d,0x0f,0x0d,0x0e,0x0e,0x0d,0x0c,0x0d,0x0d,0x0e,0x0f,0x0c,0x0e,0x0e,0x02,0x02,0x03,0x04,0x03,0x05,0x07,0x10,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0b,0x06,0x10,0x0b,0x0b,0x0b,0x0a,0x0b,0x0a,0x0b,0x05,0x0b,0x0a,0x0b,0x08,0x10,0x0a,0x0b,0x0b,0x0b,0x10,0x0b,0x0b,0x07,0x10,0x0b,0x0b,0x0d,0x0d,0x04,0x05,0x16, +0x15,0x15,0x16,0x1b,0x0a,0x0a,0x05,0x0a,0x07,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x0b, +0x0c,0x05,0x06,0x09,0x08,0x0e,0x0c,0x0c,0x09,0x0c,0x09,0x08,0x08,0x0b,0x0a,0x0f,0x0a,0x09,0x09,0x0d,0x0f,0x08,0x0c,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08, +0x08,0x0b,0x0b,0x0a,0x0c,0x0c,0x05,0x05,0x05,0x05,0x05,0x0b,0x06,0x09,0x08,0x08,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0d,0x0c,0x0a,0x09,0x07,0x0a,0x08,0x09,0x0c,0x0c,0x05, +0x09,0x0a,0x0e,0x0c,0x09,0x0c,0x0c,0x09,0x09,0x08,0x09,0x0c,0x0a,0x0c,0x0c,0x0a,0x08,0x0c,0x05,0x0c,0x09,0x0c,0x05,0x09,0x08,0x0b,0x08,0x0a,0x08,0x05,0x05,0x06,0x0f,0x10,0x0c,0x09,0x09,0x0c,0x0a,0x09,0x09,0x08,0x0b,0x08,0x0e,0x08,0x0c,0x0c,0x09,0x0b,0x0e,0x0c,0x0c,0x0c,0x09,0x0a,0x08,0x09,0x0c,0x0a,0x0c,0x0a,0x0f,0x10, +0x0b,0x0d,0x09,0x0a,0x10,0x09,0x08,0x0b,0x0b,0x0c,0x11,0x11,0x0d,0x0a,0x0b,0x08,0x0b,0x0b,0x0b,0x0d,0x0a,0x0a,0x0d,0x0b,0x0b,0x07,0x0c,0x0c,0x0b,0x09,0x09,0x11,0x0e,0x09,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x07,0x12,0x0b,0x0b,0x0b,0x0c,0x0c,0x0a,0x0a,0x05,0x0e,0x0d,0x0d,0x09,0x0d,0x04,0x04,0x08,0x08,0x04,0x04,0x0c,0x08, +0x05,0x0e,0x0d,0x05,0x04,0x04,0x09,0x07,0x07,0x04,0x04,0x04,0x07,0x0d,0x09,0x06,0x0c,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0b,0x07,0x08,0x0a,0x08,0x04,0x04,0x07,0x0a,0x06,0x0d,0x0d,0x0d,0x11,0x0e,0x11,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x0e,0x10,0x06,0x06,0x0a,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0a,0x0a,0x16, +0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x11,0x0a,0x0a,0x11,0x11,0x0a,0x0a,0x0e,0x10,0x06,0x06,0x0e,0x10,0x06,0x06,0x0e,0x10,0x06,0x06,0x13,0x0e,0x10,0x0a,0x0b,0x0b,0x0d,0x06,0x0d,0x0e,0x0a,0x0a,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x11,0x06,0x0e,0x0a, +0x0a,0x05,0x0a,0x0a,0x0a,0x0a,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x16,0x10,0x16,0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x11, +0x0a,0x15,0x13,0x11,0x0a,0x10,0x0a,0x10,0x0a,0x10,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x0d,0x0d,0x06,0x06,0x0d,0x06,0x0d,0x06,0x0d,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x0a,0x06,0x06,0x06,0x06,0x00,0x16,0x10,0x19,0x13,0x11,0x0a, +0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0a,0x0a,0x08,0x16,0x10,0x13,0x13,0x11,0x11,0x11,0x0b,0x0b,0x0b,0x0b,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x16,0x10,0x0b,0x0d,0x0b,0x0b,0x0b,0x0d,0x0b,0x0b,0x16,0x16,0x10,0x10,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x06,0x06,0x0e,0x10,0x06,0x06,0x0e,0x10, +0x06,0x06,0x0e,0x10,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x11,0x06,0x11,0x06,0x0b,0x0d,0x0b,0x0b,0x16,0x16,0x10,0x10,0x16,0x16,0x10,0x10,0x10,0x10,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x05,0x05,0x06,0x05,0x00,0x00,0x00,0x10,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0d,0x0d,0x0d, +0x0d,0x0d,0x0d,0x0b,0x10,0x0b,0x10,0x0b,0x10,0x0b,0x10,0x0d,0x0d,0x0d,0x05,0x05,0x0a,0x08,0x0b,0x0c,0x0b,0x0a,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0c,0x0a,0x0d,0x0e,0x0c,0x0e,0x10,0x0c,0x0f,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, +0x0b,0x0b,0x0a,0x09,0x0a,0x0c,0x0b,0x0d,0x0b,0x0c,0x0b,0x0b,0x0b,0x0a,0x0a,0x0e,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x0f,0x0e,0x0f,0x12,0x12,0x0d,0x12,0x12,0x0e,0x11,0x10,0x0b,0x0f,0x10,0x0e,0x0b,0x10,0x0e,0x0d,0x0d,0x0b,0x0c,0x0e,0x0f,0x0d,0x0c,0x0d,0x0b,0x0a,0x12,0x11,0x11,0x10,0x12,0x12,0x0d,0x12,0x12,0x0d,0x0f, +0x0f,0x0e,0x0e,0x0e,0x0c,0x11,0x0f,0x10,0x0e,0x0e,0x0b,0x0e,0x0d,0x0d,0x10,0x0e,0x0e,0x11,0x0a,0x0a,0x0b,0x0a,0x0c,0x0c,0x0d,0x0e,0x0b,0x0b,0x0b,0x0a,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0c,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x0c,0x0f,0x10,0x0c,0x0c,0x0c,0x0f,0x0c,0x0d,0x0a,0x09,0x0b,0x0b,0x09,0x09, +0x0a,0x0b,0x09,0x09,0x0c,0x09,0x0a,0x09,0x0a,0x0f,0x0b,0x10,0x0a,0x0b,0x0b,0x0e,0x06,0x0f,0x0d,0x0e,0x0d,0x0b,0x0e,0x0b,0x0f,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0c,0x05,0x05,0x05,0x06,0x06, +0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x11,0x11,0x11,0x11,0x09,0x0e,0x0e,0x09,0x08,0x09,0x0a,0x0b,0x09,0x10,0x10,0x10,0x08,0x13,0x09,0x10,0x10,0x10,0x0f,0x0b,0x09,0x09,0x0f,0x0b,0x0f,0x0d,0x0a,0x09,0x08,0x13,0x08,0x0a,0x09,0x09,0x09,0x09,0x09,0x1a,0x10,0x10,0x08,0x05,0x09,0x05,0x09,0x05,0x05,0x05,0x09,0x0b,0x0b,0x0a,0x07, +0x07,0x04,0x04,0x04,0x07,0x04,0x08,0x10,0x04,0x11,0x11,0x11,0x0b,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x0d,0x16,0x16,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x09, +0x0b,0x09,0x0a,0x08,0x07,0x07,0x0d,0x0a,0x0e,0x08,0x15,0x11,0x0b,0x0b,0x12,0x0f,0x10,0x0e,0x13,0x0f,0x12,0x0f,0x0c,0x09,0x0e,0x0b,0x12,0x0e,0x0e,0x0c,0x0e,0x0b,0x10,0x0d,0x11,0x0d,0x15,0x10,0x0e,0x0b,0x0e,0x0b,0x17,0x11,0x0f,0x00,0x13,0x13,0x13,0x09,0x00,0x00,0x0b,0x0a,0x0d,0x0b,0x0a,0x08,0x14,0x11,0x12,0x10,0x0e,0x0b, +0x0d,0x0b,0x0a,0x08,0x0e,0x0b,0x0a,0x08,0x10,0x0d,0x0d,0x0b,0x13,0x10,0x0a,0x0b,0x0e,0x0e,0x0f,0x09,0x04,0x09,0x0d,0x08,0x13,0x13,0x05,0x00,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x08,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x09,0x0d,0x0e,0x05,0x04,0x05,0x04,0x0d,0x0b,0x0e,0x0c,0x0b,0x09,0x0a,0x09,0x0b,0x0b,0x08, +0x08,0x15,0x10,0x16,0x11,0x13,0x10,0x11,0x0d,0x11,0x0d,0x11,0x0d,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x06,0x09,0x05,0x0e,0x0b,0x10,0x0d,0x19,0x13,0x0b,0x0b,0x0d,0x0d,0x0f,0x10,0x0e,0x0b,0x13,0x0f,0x0a,0x08,0x0b,0x09,0x0c,0x09,0x12,0x0e,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x09,0x08,0x09,0x07,0x09,0x07,0x0a,0x0a,0x06, +0x0d,0x06,0x12,0x0d,0x07,0x0b,0x0c,0x09,0x0e,0x0b,0x07,0x07,0x0b,0x0b,0x0b,0x09,0x05,0x0e,0x0b,0x07,0x07,0x0c,0x09,0x0d,0x07,0x0f,0x0b,0x0c,0x09,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0b,0x07,0x0a,0x08,0x0e,0x08,0x0a,0x10,0x09,0x0b,0x11,0x05,0x16,0x11,0x11,0x16,0x11,0x11,0x11,0x11,0x11,0x12,0x0a,0x09,0x0c,0x0d,0x11,0x0d,0x12, +0x05,0x09,0x0b,0x10,0x14,0x0d,0x14,0x0c,0x0c,0x0f,0x0d,0x16,0x12,0x0a,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x10,0x10,0x13,0x0a,0x0a,0x13,0x0e,0x0a,0x0a,0x0e,0x0d,0x06,0x06,0x0d,0x0b,0x0b,0x0b,0x0b,0x0e,0x06,0x06,0x10,0x0e,0x06,0x06,0x10,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0a,0x08,0x0b,0x0a,0x0e,0x0b,0x0b,0x11,0x0d,0x0e,0x0e,0x10,0x10,0x0b,0x09,0x13,0x0f,0x14,0x10,0x0d,0x0b,0x06,0x06,0x0b,0x0c,0x08,0x0b,0x0a,0x0b,0x09,0x0e,0x0f,0x08,0x0b,0x08,0x04,0x07,0x0a,0x0a,0x04,0x04,0x03,0x04,0x07, +0x07,0x07,0x09,0x1c,0x26,0x06,0x08,0x03,0x05,0x07,0x08,0x06,0x09,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x19,0x0a,0x0e,0x11,0x11,0x0c,0x09,0x0b,0x0e,0x0e,0x09,0x06,0x0d,0x0a,0x0d,0x0b,0x0d,0x0a,0x0a,0x0e,0x0b,0x0b,0x0a,0x0e,0x0c,0x10,0x09,0x0a,0x0c,0x06,0x0b,0x06,0x07,0x05,0x11, +0x0b,0x0b,0x0a,0x0a,0x0b,0x12,0x12,0x12,0x13,0x13,0x0a,0x09,0x05,0x0a,0x09,0x0c,0x09,0x0d,0x05,0x0b,0x0b,0x10,0x10,0x0c,0x0a,0x0b,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x06,0x06,0x05,0x04,0x07,0x0b,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x05,0x05,0x05,0x05,0x05,0x20,0x13,0x11, +0x14,0x05,0x05,0x06,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x11,0x06,0x06,0x11,0x05,0x0a,0x0a,0x19,0x13,0x13,0x19,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x08,0x08,0x00,0x00,0x07,0x0e,0x0b,0x0d,0x0b,0x18,0x14,0x0d,0x0a,0x0d,0x0a,0x19,0x13,0x0e,0x0b,0x07,0x06,0x0c,0x00,0x0d,0x0a,0x06,0x06,0x03,0x09, +0x06,0x07,0x05,0x04,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x0a,0x08,0x0b,0x0b,0x0a,0x12,0x0f,0x0f,0x0f,0x10,0x12,0x0c,0x0d,0x0b,0x07,0x12,0x15,0x08,0x16,0x0a,0x10,0x11,0x11,0x11,0x08,0x0e,0x13,0x0e,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0b,0x0b,0x0b,0x10,0x0a, +0x0a,0x11,0x06,0x06,0x11,0x06,0x06,0x11,0x09,0x09,0x00,0x08,0x10,0x06,0x06,0x13,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x1d,0x1d,0x11,0x00,0x00,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0c,0x0c,0x0c, +0x11,0x0c,0x0c,0x0f,0x13,0x0c,0x0c,0x14,0x0c,0x0c,0x12,0x0c,0x0d,0x0f,0x0c,0x0f,0x10,0x11,0x0c,0x0f,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0d,0x0c,0x0f,0x0b,0x0d,0x0f,0x0c,0x0c,0x0b,0x0f,0x0c,0x0c,0x0c,0x0d,0x08,0x0a,0x0c,0x0f,0x0f,0x0a,0x00,0x00,0x15,0x2a,0x0e,0x00,0x02,0x06,0x06,0x08,0x0c,0x0b,0x11,0x11,0x05,0x06,0x06,0x09, +0x0e,0x05,0x08,0x05,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x0e,0x0e,0x0e,0x09,0x14,0x0e,0x0c,0x0d,0x0f,0x0b,0x0a,0x0e,0x0f,0x06,0x08,0x0c,0x0a,0x13,0x10,0x10,0x0c,0x10,0x0d,0x0b,0x0b,0x0e,0x0d,0x14,0x0c,0x0c,0x0c,0x06,0x08,0x06,0x0e,0x09,0x06,0x0b,0x0c,0x0a,0x0c,0x0b,0x07,0x0c,0x0c,0x05,0x05, +0x0a,0x05,0x12,0x0c,0x0c,0x0c,0x0c,0x07,0x09,0x07,0x0c,0x0a,0x0f,0x0a,0x0a,0x0a,0x06,0x05,0x06,0x0e,0x0e,0x0e,0x0d,0x0b,0x10,0x10,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x0b,0x0b,0x09,0x09,0x0a,0x0b,0x08,0x13,0x13,0x10, +0x06,0x09,0x0e,0x12,0x10,0x11,0x0e,0x0e,0x0e,0x0b,0x0c,0x0b,0x0d,0x10,0x0b,0x08,0x09,0x10,0x11,0x0c,0x09,0x06,0x06,0x0e,0x0e,0x0b,0x0e,0x0e,0x0b,0x0b,0x0f,0x0e,0x0e,0x10,0x14,0x13,0x0b,0x15,0x08,0x08,0x05,0x05,0x0e,0x0c,0x0a,0x0c,0x04,0x0b,0x07,0x07,0x0c,0x0c,0x08,0x05,0x05,0x08,0x19,0x0e,0x0b,0x0e,0x0b,0x0b,0x06,0x06, +0x06,0x06,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x05,0x08,0x07,0x07,0x06,0x04,0x06,0x04,0x07,0x04,0x08,0x0a,0x06,0x0b,0x09,0x0c,0x0a,0x05,0x0f,0x0c,0x0c,0x0a,0x0c,0x0c,0x0e,0x0e,0x07,0x08,0x08,0x14,0x13,0x14,0x0a,0x0e,0x0c,0x06,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x0c,0x09,0x05,0x0e,0x0b,0x0e,0x0b,0x0f,0x0e,0x0f,0x0b,0x0b,0x0b,0x0b, +0x0a,0x05,0x0a,0x06,0x0a,0x07,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x07,0x0d,0x07,0x0b,0x09,0x0b,0x07,0x0b,0x09,0x0e,0x0c,0x0e,0x0c,0x0c,0x0a,0x0c,0x0a,0x0a,0x10,0x10,0x0d,0x0c,0x09,0x0c,0x0a,0x0f,0x09,0x0a,0x08,0x17,0x0d,0x0a,0x0d,0x05,0x08,0x11,0x07,0x0d,0x07,0x07,0x0d,0x07,0x0e,0x0b,0x0d,0x0a,0x0d,0x0a,0x0b,0x0b,0x0b, +0x0b,0x0b,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x08,0x05,0x0c,0x0a,0x0a,0x0a,0x05,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x07,0x0b,0x09,0x0b,0x07,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x14,0x0f,0x0c,0x0a,0x05,0x0e,0x0b,0x12,0x11,0x10,0x0c,0x05,0x14,0x0f, +0x14,0x0f,0x14,0x0f,0x0c,0x0a,0x05,0x09,0x0b,0x0d,0x13,0x13,0x14,0x13,0x08,0x08,0x05,0x06,0x06,0x0e,0x0c,0x10,0x08,0x11,0x0e,0x11,0x06,0x0e,0x0c,0x0b,0x0c,0x0f,0x06,0x0c,0x0d,0x13,0x10,0x0b,0x10,0x0f,0x0c,0x0b,0x0b,0x0c,0x0c,0x10,0x10,0x06,0x0c,0x0d,0x09,0x0c,0x06,0x0c,0x0c,0x0b,0x09,0x0c,0x0c,0x06,0x0b,0x0a,0x0c,0x0b, +0x09,0x0c,0x0c,0x0a,0x0c,0x0b,0x10,0x11,0x06,0x0c,0x0c,0x0c,0x11,0x0b,0x0f,0x0a,0x0d,0x0b,0x06,0x15,0x15,0x0f,0x0c,0x0c,0x0f,0x0e,0x0c,0x0c,0x0a,0x0f,0x0b,0x12,0x0b,0x10,0x10,0x0c,0x0e,0x13,0x0f,0x10,0x0f,0x0c,0x0d,0x0b,0x0c,0x0f,0x0c,0x10,0x0e,0x14,0x15,0x0f,0x10,0x0c,0x0d,0x15,0x0c,0x0b,0x0c,0x0b,0x08,0x0b,0x0b,0x10, +0x09,0x0c,0x0c,0x0a,0x0b,0x0f,0x0c,0x0c,0x0c,0x0c,0x0a,0x09,0x0a,0x0e,0x0a,0x0d,0x0c,0x11,0x11,0x0c,0x0f,0x0b,0x0a,0x11,0x0b,0x0b,0x0c,0x08,0x0a,0x09,0x05,0x11,0x11,0x0c,0x0a,0x0a,0x0c,0x0a,0x08,0x15,0x18,0x0d,0x07,0x08,0x08,0x08,0x05,0x0b,0x09,0x0c,0x10,0x0d,0x0f,0x0c,0x06,0x07,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x06,0x06, +0x06,0x0a,0x06,0x0a,0x06,0x06,0x06,0x0a,0x0a,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x06,0x05,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10, +0x0c,0x10,0x0c,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x0e,0x0c,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x07,0x0b,0x0b,0x10,0x0c,0x06,0x08,0x05,0x05,0x0b,0x09,0x13,0x10,0x0d,0x0b,0x0c,0x0a,0x10,0x0d,0x0c,0x0a,0x0c,0x0a,0x0d,0x0a,0x0e,0x0c,0x0e,0x0c,0x0f, +0x0b,0x10,0x0c,0x06,0x06,0x06,0x06,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x0b,0x0e,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0a,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x07,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f, +0x0c,0x06,0x05,0x06,0x05,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x13,0x12,0x13,0x12,0x13,0x12,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b, +0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0d,0x0a,0x0d,0x0a,0x14,0x0f,0x14,0x0f,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x07,0x0f,0x0a,0x0b,0x05,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x09, +0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x14,0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x11,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x0d,0x0d,0x09,0x09,0x0c,0x0c,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x0f,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0e,0x0e,0x0d,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x11,0x10,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0d,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0a,0x0f,0x10,0x0c,0x0c,0x0c,0x0b,0x0b,0x0a,0x0f,0x0d,0x12,0x06,0x06,0x0c,0x0a,0x05,0x0a,0x13,0x10,0x0c,0x10, +0x14,0x11,0x0d,0x0c,0x0c,0x0b,0x09,0x0b,0x06,0x07,0x0b,0x07,0x0b,0x10,0x0f,0x0c,0x0b,0x0c,0x0a,0x0d,0x0d,0x09,0x09,0x0b,0x0b,0x08,0x08,0x0b,0x05,0x08,0x0a,0x06,0x1a,0x18,0x16,0x12,0x0f,0x0b,0x17,0x14,0x11,0x0e,0x0b,0x06,0x05,0x10,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0b,0x0e,0x0b,0x0e,0x0b,0x12,0x11, +0x0e,0x0c,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x10,0x0c,0x0d,0x09,0x05,0x1a,0x18,0x16,0x0e,0x0c,0x15,0x0e,0x10,0x0c,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x06,0x05,0x10,0x0c,0x10,0x0c,0x0c,0x07,0x0d,0x07,0x0e,0x0c,0x0e,0x0c,0x0b,0x09,0x0f,0x0c,0x0f,0x0c,0x0c,0x0c,0x0a,0x0e,0x0b,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10, +0x0c,0x0c,0x0a,0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0b,0x0d,0x09,0x09,0x0b,0x0c,0x06,0x0c,0x0c,0x0b,0x0a,0x0a,0x0c,0x0c,0x0c,0x06,0x06,0x07,0x06,0x08,0x05,0x0d,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0d,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x08,0x05,0x05,0x06,0x06,0x07,0x07, +0x0d,0x0c,0x0c,0x0a,0x0f,0x0a,0x09,0x0a,0x0b,0x09,0x09,0x08,0x08,0x08,0x0a,0x0d,0x0a,0x0c,0x0b,0x0c,0x05,0x0a,0x08,0x0c,0x08,0x08,0x13,0x14,0x15,0x0d,0x0a,0x0f,0x11,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0c,0x0e,0x0c,0x0d,0x11,0x0c,0x0f,0x0c,0x0c,0x0a,0x0a,0x09,0x0d,0x0b,0x0d,0x0a,0x13,0x12,0x0d,0x0b,0x0d,0x0b,0x0d,0x0a,0x0d, +0x0a,0x0e,0x0c,0x0c,0x09,0x0c,0x0c,0x0a,0x05,0x10,0x0a,0x0a,0x12,0x0e,0x0e,0x0c,0x13,0x0f,0x0e,0x0a,0x12,0x0f,0x0f,0x0c,0x14,0x10,0x0b,0x09,0x10,0x10,0x10,0x0c,0x0f,0x0c,0x0f,0x0c,0x1c,0x17,0x11,0x0e,0x18,0x13,0x12,0x0e,0x0c,0x09,0x0b,0x08,0x09,0x00,0x00,0x15,0x14,0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0a,0x0c,0x0a,0x0f, +0x0c,0x12,0x0e,0x15,0x12,0x0f,0x0c,0x0d,0x0a,0x0b,0x09,0x12,0x0e,0x0e,0x0c,0x12,0x0d,0x12,0x0d,0x06,0x12,0x10,0x0c,0x0b,0x0f,0x0c,0x0e,0x0c,0x0e,0x0b,0x0e,0x0b,0x12,0x11,0x0b,0x0b,0x0f,0x0b,0x0f,0x0b,0x12,0x10,0x0b,0x09,0x0b,0x09,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0e,0x0c, +0x10,0x0f,0x0c,0x0c,0x12,0x12,0x11,0x0f,0x0c,0x0a,0x13,0x11,0x15,0x12,0x0f,0x0b,0x0e,0x0d,0x0c,0x0c,0x0c,0x0b,0x0c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x0c,0x07,0x07,0x03,0x04,0x04,0x04,0x06,0x08,0x06,0x05,0x08,0x05,0x05,0x05,0x07,0x07,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x07,0x06, +0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0x05,0x06,0x05,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x09,0x07,0x05,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b, +0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b, +0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x0d,0x07,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06, +0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0a,0x0e,0x11,0x0a,0x0a,0x0c,0x0c,0x09,0x09,0x05,0x06,0x0a,0x08,0x0f,0x0c,0x0c,0x0a,0x0d,0x0d,0x0d,0x14,0x0b,0x0c,0x0c,0x0a,0x0a,0x0a,0x09,0x0b,0x0c,0x0f,0x0c,0x0a,0x0f,0x0a,0x09,0x09,0x0b,0x08,0x0a,0x0c,0x0a,0x0c,0x0c, +0x08,0x0a,0x07,0x08,0x09,0x06,0x06,0x09,0x09,0x04,0x05,0x07,0x06,0x0b,0x09,0x09,0x09,0x08,0x07,0x07,0x06,0x09,0x0b,0x07,0x07,0x07,0x0a,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x03,0x06,0x0a,0x07,0x07,0x06,0x07,0x07,0x07,0x04,0x07,0x07,0x0a,0x06,0x07,0x07,0x06,0x07,0x09,0x06,0x03,0x04,0x07,0x06,0x07,0x06,0x07,0x09,0x06,0x0c, +0x03,0x07,0x0b,0x12,0x0d,0x0b,0x0b,0x12,0x0e,0x12,0x10,0x0b,0x0c,0x0b,0x09,0x18,0x0a,0x0c,0x13,0x14,0x14,0x0d,0x0e,0x0d,0x0a,0x0a,0x0b,0x09,0x0a,0x0b,0x04,0x00,0x00,0x00,0x00,0x0c,0x0d,0x0d,0x0d,0x0a,0x08,0x0c,0x0c,0x07,0x12,0x0c,0x0c,0x07,0x07,0x0a,0x07,0x0a,0x0c,0x0a,0x0c,0x13,0x0e,0x07,0x06,0x0c,0x0b,0x0c,0x0c,0x0c, +0x07,0x0c,0x0a,0x05,0x12,0x0c,0x0c,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0c,0x0c,0x0b,0x09,0x09,0x0f,0x05,0x0a,0x05,0x0c,0x09,0x07,0x06,0x06,0x07,0x06,0x04,0x03,0x07,0x07,0x03,0x04,0x04,0x04,0x03,0x04,0x03,0x05,0x0a,0x0a,0x07,0x07,0x07,0x07,0x08,0x05,0x03,0x04,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x06,0x05,0x07,0x00,0x00, +0x00,0x00,0x05,0x07,0x07,0x07,0x06,0x07,0x0b,0x0b,0x0b,0x0b,0x07,0x00,0x00,0x00,0x00,0x0a,0x07,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0b,0x08, +0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x04,0x08,0x08,0x07,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x08,0x07,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x10,0x0d,0x0f,0x0c,0x10,0x0d,0x14,0x10,0x0b,0x08,0x0b,0x0e,0x0b,0x11,0x0f,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x07,0x07,0x07, +0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x12,0x12,0x15,0x09,0x05,0x0b,0x0c,0x09,0x0b,0x0b,0x0c,0x0c,0x0b,0x15,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0e,0x0b,0x0b,0x0b,0x07,0x0c,0x07,0x10,0x0e,0x0b,0x07,0x12,0x0b,0x12,0x05,0x07,0x0c,0x0c,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x12,0x05,0x0c,0x05,0x0b,0x09,0x05,0x05,0x0b,0x05,0x10,0x05, +0x13,0x0b,0x13,0x13,0x0c,0x0c,0x0c,0x0b,0x0b,0x09,0x09,0x19,0x19,0x1c,0x1c,0x12,0x12,0x0b,0x0b,0x04,0x15,0x10,0x12,0x0e,0x0c,0x0e,0x0b,0x0b,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x0e,0x00,0x0e,0x0e,0x0e,0x07,0x0b,0x0b,0x13,0x07,0x13,0x07,0x0c,0x0e,0x0c,0x09,0x13,0x0b,0x13,0x0b,0x10,0x12,0x07,0x0b, +0x0b,0x09,0x05,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0b,0x0e,0x0e,0x13,0x07,0x0b,0x09,0x0e,0x0b,0x07,0x0b,0x0b,0x0b,0x13,0x07,0x13,0x07,0x05,0x0c,0x08,0x15,0x0b,0x0b,0x0e,0x0e,0x15,0x0b,0x00,0x00,0x00,0x0e,0x00,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x0b,0x0b,0x10,0x12,0x13,0x07, +0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x09,0x09,0x09,0x19,0x12,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x0b,0x0c,0x0c,0x0c,0x15,0x15,0x0b,0x0b,0x15,0x0b, +0x0b,0x15,0x0b,0x0b,0x15,0x0b,0x0b,0x10,0x10,0x17,0x15,0x13,0x0b,0x12,0x0b,0x12,0x0b,0x12,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0e,0x07,0x0e,0x07,0x0b,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x13,0x10,0x12,0x07,0x0b,0x10,0x12,0x10, +0x12,0x00,0x00,0x00,0x00,0x00,0x18,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x09,0x00,0x00,0x0d,0x00,0x00,0x00,0x19,0x12,0x1c,0x15,0x0b,0x0c,0x0c,0x0c,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x13,0x13,0x08,0x0c,0x0c,0x0c,0x1a,0x11,0x0b,0x20,0x17,0x07,0x0c,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x09,0x09,0x10,0x0e,0x0e,0x0b,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x09,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x0b,0x0b,0x09,0x19,0x12,0x0b,0x0c,0x0c, +0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x15,0x0b,0x0b,0x15,0x0b,0x0b,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0e,0x07,0x07,0x09,0x09,0x19,0x12,0x0e,0x0c,0x0c,0x00,0x0b,0x0b,0x0b,0x08,0x0c,0x0e,0x0d,0x0b,0x0b,0x08,0x05,0x10,0x0c,0x0d,0x07,0x0c,0x0a,0x0a, +0x0a,0x0a,0x05,0x0b,0x09,0x0d,0x0a,0x0c,0x0a,0x0b,0x09,0x0e,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x09,0x0a,0x0a,0x06,0x0b,0x0c,0x0d,0x0b,0x07,0x10,0x0c,0x0d,0x0b,0x0d,0x0a,0x0c,0x0b,0x08,0x0f,0x08,0x09,0x09,0x0a,0x0d,0x0d,0x0b,0x15,0x0b,0x15,0x07,0x05,0x04,0x0b,0x05,0x03,0x00,0x03,0x05,0x00,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x13,0x09,0x10,0x0c,0x14,0x0f,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x13,0x12,0x0a,0x12,0x0a,0x12,0x0e,0x0e,0x0f,0x0f,0x10,0x12,0x15,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x10,0x0c,0x16,0x11,0x0a,0x0a,0x06,0x06,0x06,0x08,0x05, +0x0c,0x05,0x05,0x12,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x00,0x05,0x00,0x00,0x0d,0x0c,0x09,0x0a,0x0e,0x06,0x07,0x0e,0x0e,0x06,0x0c,0x0b,0x0c,0x0f,0x0e,0x06,0x08,0x0e,0x0d,0x0d,0x0d,0x0c,0x0c,0x0e,0x0c,0x10,0x0f,0x0b,0x0b,0x0b,0x05,0x08,0x0c,0x0c,0x0c,0x0c,0x0b,0x0d, +0x0d,0x0a,0x0e,0x0b,0x0c,0x0f,0x0c,0x0f,0x0c,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0c,0x09,0x0a,0x0e,0x06,0x07,0x0e,0x06,0x0c,0x0b,0x0c,0x0e,0x08,0x0e,0x0d,0x0d,0x0c,0x0e,0x0c,0x10,0x0f,0x06,0x0c,0x0b,0x0d,0x0e,0x19,0x00,0x0d,0x0c,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x10,0x0d,0x0e,0x0f,0x0c,0x0e,0x10,0x10,0x0a,0x0d,0x10,0x0f,0x0e,0x10,0x11,0x10,0x0e,0x0c,0x0c,0x10,0x0f,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0c,0x0d,0x0e,0x0e,0x10,0x0d,0x0d,0x0d,0x0e,0x11,0x0a,0x0c,0x0c,0x12,0x0b,0x0b, +0x10,0x13,0x0d,0x0b,0x16,0x0c,0x0c,0x10,0x0b,0x0b,0x10,0x0c,0x10,0x11,0x12,0x0b,0x10,0x0b,0x0e,0x0b,0x0d,0x0c,0x0d,0x0b,0x0d,0x10,0x0b,0x0d,0x0e,0x0b,0x0b,0x0d,0x14,0x0b,0x0b,0x0c,0x0c,0x09,0x07,0x0c,0x0c,0x0c,0x0b,0x0c,0x13,0x0c,0x13,0x0a,0x0c,0x13,0x0e,0x0c,0x13,0x10,0x10,0x13,0x0c,0x0c,0x13,0x13,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x13,0x13,0x0c,0x0c,0x0c,0x13,0x0d,0x0b,0x0c,0x0c,0x13,0x10,0x0e,0x0f,0x0f,0x0e,0x0f,0x0d,0x0e,0x10,0x0f,0x0e,0x0b,0x11,0x0e,0x0e,0x0c,0x0e,0x0f,0x10,0x0f,0x0c,0x0f,0x0e,0x0f,0x0e,0x10,0x0f,0x0f,0x0f,0x0e,0x0d,0x0f,0x0e,0x0f,0x11,0x0e,0x10,0x0f,0x02,0x02,0x03,0x04,0x03,0x06,0x07,0x12,0x0c,0x0d,0x0d,0x0c,0x0d, +0x0c,0x0c,0x0e,0x0d,0x0c,0x06,0x12,0x0c,0x0c,0x0c,0x0b,0x0d,0x0b,0x0c,0x06,0x0c,0x0b,0x0c,0x09,0x12,0x0c,0x0c,0x0c,0x0c,0x11,0x0c,0x0c,0x08,0x11,0x0c,0x0c,0x0e,0x0e,0x05,0x06,0x18,0x18,0x18,0x18,0x1e,0x0b,0x0b,0x05,0x0b,0x08,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, +0x08,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0a,0x0b,0x0c,0x09,0x09,0x0c,0x0d,0x05,0x07,0x0a,0x09,0x10,0x0e,0x0d,0x0a,0x0d,0x0a,0x09,0x09,0x0c,0x0b,0x11,0x0b,0x0a,0x0a,0x0f,0x10,0x09,0x0d,0x0a,0x0c,0x0b,0x0b,0x0b, +0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x0d,0x0d,0x05,0x05,0x05,0x05,0x05,0x0c,0x07,0x0a,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0f,0x0d,0x0b,0x0a,0x08,0x0b,0x09,0x0a,0x0d,0x0d,0x05,0x0a,0x0b,0x10,0x0e,0x09,0x0d,0x0d,0x0a,0x0a,0x09,0x0a,0x0d,0x0b,0x0e,0x0d,0x0b,0x09,0x0d,0x05,0x0d,0x0a,0x0d,0x05,0x0a,0x09,0x0c,0x08,0x0b, +0x09,0x05,0x05,0x07,0x11,0x11,0x0d,0x0a,0x0a,0x0d,0x0b,0x0a,0x0a,0x08,0x0c,0x09,0x10,0x09,0x0e,0x0e,0x0a,0x0c,0x10,0x0d,0x0d,0x0d,0x0a,0x0b,0x09,0x0a,0x0d,0x0b,0x0d,0x0b,0x11,0x11,0x0c,0x0f,0x0a,0x0b,0x12,0x0a,0x08,0x0c,0x0c,0x0d,0x13,0x13,0x0e,0x0b,0x0c,0x09,0x0c,0x0c,0x0c,0x0f,0x0b,0x0b,0x0e,0x0c,0x0c,0x08,0x0d,0x0d, +0x0c,0x0a,0x0a,0x13,0x10,0x0a,0x0b,0x0d,0x0d,0x0d,0x0d,0x0f,0x0e,0x08,0x14,0x0c,0x0c,0x0c,0x0e,0x0e,0x0b,0x0b,0x06,0x10,0x0e,0x0e,0x0a,0x0f,0x05,0x05,0x09,0x09,0x05,0x05,0x0d,0x08,0x06,0x10,0x0f,0x06,0x05,0x05,0x09,0x08,0x08,0x05,0x05,0x05,0x08,0x0e,0x0a,0x06,0x0d,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x0d,0x07,0x09,0x0b,0x09, +0x05,0x05,0x08,0x0b,0x07,0x0e,0x0e,0x0e,0x13,0x10,0x13,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x10,0x12,0x07,0x07,0x0b,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0b,0x0b,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x0b,0x0b,0x13,0x13,0x0b,0x0b,0x10,0x12,0x07,0x07,0x10,0x12,0x07, +0x07,0x10,0x12,0x07,0x07,0x15,0x10,0x12,0x0b,0x0c,0x0c,0x0e,0x07,0x0e,0x10,0x0b,0x0b,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x13,0x07,0x10,0x0b,0x0b,0x05,0x0b,0x0b,0x0b,0x0b,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x19,0x12,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x12,0x12,0x15,0x15,0x15,0x15,0x15,0x15,0x10,0x0b,0x0b,0x10,0x0b,0x0b,0x13,0x0b,0x17,0x15,0x13,0x0b,0x12,0x0b,0x12,0x0b,0x12,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e, +0x07,0x0e,0x0e,0x07,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x0b,0x07,0x07,0x07,0x07,0x00,0x19,0x12,0x1c,0x15,0x13,0x0b,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0b,0x0b,0x09,0x19,0x12,0x15,0x15,0x13,0x13,0x13,0x0c,0x0c,0x0c,0x0c, +0x0e,0x07,0x0e,0x07,0x0e,0x07,0x19,0x12,0x0c,0x0e,0x0c,0x0c,0x0c,0x0e,0x0c,0x0c,0x19,0x19,0x12,0x12,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x10,0x12,0x07,0x07,0x10,0x12,0x07,0x07,0x10,0x12,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x13,0x07,0x13,0x07,0x0c,0x0e,0x0c,0x0c,0x19,0x19,0x12,0x12,0x19,0x19,0x12,0x12,0x12,0x12, +0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x05,0x05,0x07,0x05,0x00,0x00,0x00,0x12,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x05,0x05, +0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x12,0x0c,0x12,0x0c,0x12,0x0c,0x12,0x0e,0x0e,0x0e,0x05,0x05,0x0b,0x09,0x0c,0x0d,0x0c,0x0b,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0c,0x0b,0x0c,0x0d,0x0d,0x0e,0x0c,0x0c,0x0e,0x0b,0x0e,0x10,0x0d,0x10,0x11,0x0d,0x10,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0a,0x0b,0x0d,0x0d,0x0e,0x0c,0x0e,0x0c,0x0c,0x0d,0x0b,0x0b,0x10,0x0e,0x0f,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x10,0x10,0x10,0x13, +0x13,0x0f,0x13,0x13,0x0f,0x12,0x12,0x0c,0x10,0x12,0x10,0x0c,0x12,0x10,0x0f,0x0f,0x0d,0x0e,0x10,0x11,0x0f,0x0d,0x0f,0x0c,0x0b,0x13,0x13,0x13,0x11,0x13,0x13,0x0e,0x13,0x13,0x0f,0x10,0x10,0x10,0x0f,0x0f,0x0e,0x13,0x10,0x11,0x0f,0x0f,0x0c,0x10,0x0f,0x0f,0x12,0x10,0x0f,0x13,0x0b,0x0b,0x0c,0x0b,0x0d,0x0d,0x0f,0x0f,0x0c,0x0c, +0x0c,0x0b,0x0c,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0c,0x0d,0x0d,0x0d,0x0a,0x0c,0x0c,0x0c,0x0d,0x10,0x12,0x0e,0x0e,0x0d,0x10,0x0d,0x0e,0x0b,0x0a,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0a,0x0c,0x10,0x0c,0x11,0x0b,0x0c,0x0c,0x10,0x07,0x11,0x0e,0x0f,0x0e,0x0c,0x10,0x0d,0x10,0x0d,0x0d,0x0d, +0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x0a,0x09,0x0a,0x0a,0x0a,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x06,0x06,0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x13,0x13,0x13,0x13,0x0a,0x10,0x0f,0x0a,0x09,0x0a,0x0b,0x0c,0x0a,0x12,0x11,0x12,0x09,0x15,0x0a,0x12,0x12, +0x12,0x11,0x0c,0x0a,0x0a,0x10,0x0c,0x10,0x0e,0x0b,0x0a,0x09,0x15,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x1d,0x12,0x12,0x09,0x05,0x0a,0x05,0x0a,0x05,0x05,0x05,0x0a,0x0c,0x0c,0x0b,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x09,0x12,0x05,0x13,0x13,0x13,0x0c,0x0c,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x0e,0x19, +0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0a,0x0c,0x0a,0x0b,0x09,0x07,0x07,0x0e,0x0c,0x0f,0x09,0x18,0x13,0x0c,0x0c,0x13,0x11,0x12,0x10,0x15,0x11,0x13,0x10,0x0e,0x0a,0x0f,0x0c,0x13,0x0f, +0x10,0x0d,0x10,0x0d,0x12,0x0e,0x12,0x0e,0x17,0x12,0x10,0x0c,0x10,0x0c,0x19,0x13,0x11,0x00,0x15,0x15,0x15,0x0a,0x00,0x00,0x0c,0x0b,0x0f,0x0c,0x0b,0x09,0x17,0x13,0x14,0x12,0x0f,0x0c,0x0f,0x0c,0x0b,0x09,0x10,0x0d,0x0b,0x09,0x11,0x0e,0x0e,0x0c,0x15,0x11,0x0b,0x0c,0x0f,0x0f,0x11,0x09,0x04,0x0a,0x0e,0x09,0x15,0x15,0x05,0x00, +0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x08,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, +0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x0e,0x0f,0x06,0x04,0x06,0x04,0x0f,0x0c,0x10,0x0d,0x0c,0x0a,0x0b,0x0a,0x0c,0x0c,0x09,0x09,0x18,0x11,0x18,0x13,0x15,0x12,0x13,0x0e,0x13,0x0e,0x13,0x0e,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x07,0x0a,0x05,0x10,0x0c,0x12, +0x0e,0x1c,0x15,0x0c,0x0c,0x0e,0x0f,0x11,0x12,0x10,0x0c,0x15,0x10,0x0b,0x08,0x0c,0x0a,0x0d,0x0a,0x14,0x0f,0x0d,0x0b,0x0c,0x0c,0x0c,0x0c,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0b,0x0b,0x06,0x0e,0x07,0x14,0x0e,0x07,0x0c,0x0d,0x0a,0x10,0x0c,0x08,0x07,0x0c,0x0c,0x0c,0x0a,0x05,0x10,0x0d,0x08,0x07,0x0d,0x0a,0x0f,0x08,0x10,0x0d,0x0d, +0x0a,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x0d,0x07,0x0b,0x09,0x10,0x09,0x0b,0x12,0x0a,0x0c,0x13,0x06,0x18,0x13,0x13,0x19,0x13,0x13,0x13,0x12,0x13,0x13,0x0b,0x0a,0x0d,0x0f,0x13,0x0f,0x14,0x05,0x0a,0x0c,0x12,0x16,0x0f,0x16,0x0d,0x0d,0x11,0x0f,0x18,0x13,0x0b,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x12,0x12,0x12,0x12,0x15,0x0b, +0x0b,0x15,0x10,0x0b,0x0b,0x10,0x0e,0x07,0x07,0x0e,0x0c,0x0c,0x0c,0x0c,0x10,0x07,0x07,0x12,0x10,0x07,0x07,0x12,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x0b,0x08,0x0c,0x0b,0x10,0x0c,0x0c,0x12, +0x0e,0x10,0x10,0x11,0x11,0x0c,0x0a,0x15,0x11,0x16,0x12,0x0e,0x0c,0x07,0x07,0x0c,0x0e,0x09,0x0d,0x0b,0x0c,0x0a,0x10,0x11,0x08,0x0c,0x09,0x04,0x08,0x0b,0x0c,0x05,0x05,0x04,0x05,0x08,0x08,0x08,0x09,0x1f,0x2a,0x07,0x09,0x03,0x06,0x08,0x09,0x07,0x0a,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a, +0x0a,0x1c,0x0b,0x10,0x13,0x13,0x0e,0x0a,0x0c,0x0f,0x0f,0x0a,0x07,0x0e,0x0b,0x0e,0x0c,0x0e,0x0b,0x0b,0x10,0x0c,0x0c,0x0b,0x10,0x0d,0x11,0x0a,0x0b,0x0d,0x07,0x0c,0x07,0x07,0x05,0x12,0x0c,0x0c,0x0b,0x0b,0x0c,0x13,0x13,0x14,0x15,0x15,0x0c,0x0a,0x06,0x0b,0x0a,0x0d,0x0a,0x0e,0x05,0x0c,0x0d,0x12,0x12,0x0d,0x0b,0x0c,0x0b,0x0b, +0x0a,0x0b,0x0a,0x0a,0x06,0x07,0x05,0x05,0x08,0x0c,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x00,0x06,0x06,0x06,0x05,0x05,0x23,0x15,0x12,0x16,0x06,0x06,0x07,0x08,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x13,0x07,0x07,0x13,0x05,0x0b,0x0b,0x1c,0x15,0x15, +0x1c,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x09,0x09,0x00,0x00,0x08,0x10,0x0d,0x0f,0x0c,0x1a,0x16,0x0f,0x0b,0x0f,0x0c,0x1c,0x15,0x10,0x0c,0x08,0x07,0x0d,0x00,0x0e,0x0b,0x07,0x06,0x03,0x0a,0x07,0x07,0x05,0x04,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x0b,0x09,0x0c,0x0c,0x0c,0x14,0x11,0x11,0x11,0x11,0x14,0x0d,0x0e,0x0d, +0x08,0x14,0x18,0x09,0x18,0x0b,0x12,0x13,0x13,0x13,0x09,0x10,0x15,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x0c,0x0c,0x0c,0x12,0x0b,0x0b,0x13,0x07,0x07,0x13,0x07,0x07,0x13,0x0a,0x0a,0x00,0x09,0x12,0x07,0x07,0x15,0x0b,0x0b,0x10,0x0b,0x0b,0x0e,0x06,0x06,0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x20,0x20,0x12,0x00,0x00,0x12,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0d,0x0e,0x0e,0x13,0x0e,0x0d,0x11,0x14,0x0e,0x0d,0x16,0x0d,0x0d,0x14,0x0d,0x0e,0x11,0x0d,0x10,0x12,0x13,0x0d,0x10,0x0e,0x0f,0x0d,0x0f,0x0d,0x0e,0x0e,0x0d, +0x10,0x0d,0x0e,0x10,0x0d,0x0d,0x0c,0x10,0x0d,0x0e,0x0e,0x0f,0x09,0x0b,0x0d,0x10,0x10,0x0b,0x00,0x00,0x18,0x30,0x10,0x00,0x02,0x07,0x07,0x09,0x0e,0x0d,0x14,0x13,0x06,0x07,0x07,0x0a,0x10,0x05,0x0a,0x05,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x05,0x05,0x10,0x10,0x10,0x0b,0x17,0x0f,0x0e,0x0f,0x11,0x0c,0x0c, +0x10,0x11,0x06,0x09,0x0e,0x0b,0x16,0x12,0x12,0x0d,0x12,0x0e,0x0d,0x0d,0x10,0x0f,0x16,0x0e,0x0d,0x0e,0x07,0x09,0x07,0x10,0x0a,0x06,0x0c,0x0e,0x0b,0x0e,0x0d,0x08,0x0e,0x0e,0x06,0x06,0x0c,0x06,0x15,0x0e,0x0e,0x0e,0x0e,0x08,0x0a,0x08,0x0e,0x0c,0x11,0x0b,0x0c,0x0b,0x07,0x06,0x07,0x10,0x0f,0x0f,0x0f,0x0c,0x12,0x12,0x10,0x0c, +0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0b,0x0a,0x0b,0x0d,0x0a,0x15,0x15,0x13,0x07,0x0a,0x10,0x15,0x12,0x14,0x10,0x10,0x10,0x0d,0x0e,0x0d,0x0f,0x12,0x0d,0x09,0x0a,0x12,0x14,0x0e,0x0b,0x07,0x07,0x10,0x10,0x0d,0x10,0x0f, +0x0c,0x0c,0x12,0x0f,0x0f,0x12,0x16,0x16,0x0c,0x18,0x09,0x09,0x06,0x06,0x10,0x0e,0x0c,0x0d,0x04,0x0d,0x08,0x08,0x0d,0x0d,0x09,0x05,0x06,0x09,0x1d,0x0f,0x0c,0x0f,0x0c,0x0c,0x06,0x06,0x06,0x06,0x12,0x12,0x12,0x10,0x10,0x10,0x06,0x09,0x08,0x07,0x07,0x05,0x07,0x05,0x08,0x04,0x09,0x0b,0x07,0x0d,0x0a,0x0e,0x0b,0x06,0x11,0x0d, +0x0d,0x0c,0x0d,0x0e,0x10,0x10,0x08,0x09,0x09,0x16,0x16,0x17,0x0c,0x10,0x0e,0x06,0x0d,0x0a,0x0f,0x0b,0x0f,0x0b,0x0e,0x0a,0x05,0x0f,0x0c,0x0f,0x0c,0x11,0x10,0x11,0x0c,0x0d,0x0c,0x0d,0x0b,0x06,0x0b,0x07,0x0b,0x08,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0e,0x08,0x0d,0x0a,0x0d,0x08,0x0d,0x0b,0x10,0x0e,0x10,0x0e,0x0e,0x0b, +0x0e,0x0b,0x0b,0x12,0x12,0x0f,0x0e,0x0b,0x0e,0x0c,0x11,0x0a,0x0c,0x09,0x1b,0x0f,0x0c,0x0f,0x06,0x09,0x13,0x08,0x0f,0x09,0x09,0x0f,0x09,0x0f,0x0c,0x0f,0x0b,0x0f,0x0b,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x06,0x0e,0x0c,0x0c,0x0b,0x06, +0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0d,0x0a,0x0d,0x08,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x16,0x11,0x0d,0x0c,0x06,0x0f,0x0c,0x15,0x14,0x12,0x0e,0x05,0x16,0x11,0x16,0x11,0x16,0x11,0x0d,0x0c,0x06,0x0a,0x0d,0x0e,0x16,0x16,0x16,0x15,0x09,0x09,0x05,0x07,0x07,0x0f,0x0e,0x13,0x09,0x13,0x10,0x14,0x06,0x0f, +0x0e,0x0c,0x0e,0x11,0x06,0x0e,0x0f,0x16,0x12,0x0c,0x12,0x11,0x0d,0x0c,0x0d,0x0d,0x0e,0x13,0x12,0x06,0x0d,0x0f,0x0b,0x0e,0x06,0x0d,0x0d,0x0c,0x0b,0x0e,0x0e,0x06,0x0d,0x0c,0x0e,0x0d,0x0b,0x0e,0x0e,0x0b,0x0d,0x0d,0x12,0x13,0x06,0x0d,0x0e,0x0d,0x13,0x0c,0x11,0x0b,0x0f,0x0d,0x06,0x18,0x18,0x11,0x0e,0x0e,0x11,0x0f,0x0e,0x0e, +0x0b,0x11,0x0c,0x15,0x0d,0x12,0x12,0x0e,0x10,0x16,0x11,0x12,0x11,0x0d,0x0f,0x0d,0x0e,0x11,0x0e,0x12,0x10,0x17,0x18,0x11,0x13,0x0e,0x0f,0x18,0x0e,0x0c,0x0e,0x0d,0x09,0x0d,0x0d,0x12,0x0b,0x0e,0x0e,0x0c,0x0d,0x11,0x0e,0x0e,0x0e,0x0e,0x0b,0x0a,0x0c,0x10,0x0b,0x0e,0x0e,0x13,0x14,0x0e,0x11,0x0c,0x0b,0x14,0x0c,0x0d,0x0e,0x09, +0x0b,0x0a,0x06,0x13,0x13,0x0e,0x0c,0x0c,0x0e,0x0b,0x09,0x18,0x1b,0x0f,0x08,0x09,0x09,0x09,0x06,0x0d,0x0a,0x0d,0x12,0x0e,0x11,0x0e,0x07,0x08,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x0b,0x07,0x07,0x07,0x0b,0x0b,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f, +0x0c,0x0f,0x0c,0x0f,0x0c,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x06,0x06,0x06,0x06,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x10,0x0e,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0d, +0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x08,0x0c,0x0d,0x12,0x0e,0x06,0x09,0x06,0x06,0x0c,0x0a,0x16,0x13,0x0f,0x0d,0x0e,0x0c,0x12,0x0e,0x0d,0x0c,0x0d,0x0c,0x0f,0x0c,0x10,0x0e,0x10,0x0e,0x11,0x0d,0x12,0x0e,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x07,0x07,0x07,0x07,0x0c,0x0d,0x0f,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0f,0x0b,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x08,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x06,0x06,0x06,0x06,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x16,0x15,0x16,0x15,0x16,0x15,0x12,0x0e,0x12, +0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0d,0x0e,0x0d,0x0e,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0f,0x0c,0x0f,0x0c,0x16,0x11,0x16,0x11,0x0e,0x0b,0x0e, +0x0b,0x0d,0x0c,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x08,0x11,0x0c,0x0c,0x06,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x06,0x06,0x06,0x06,0x06, +0x06,0x06,0x06,0x09,0x09,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x17,0x17,0x17,0x17,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x14,0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0b,0x0b,0x0e,0x0e,0x06,0x06,0x0e,0x0e,0x0d,0x0d,0x13, +0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x11,0x0e,0x0e,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x0f,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x12,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0f,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0b,0x11,0x12,0x0e,0x0e,0x0e,0x0c,0x0d,0x0c,0x11,0x0f,0x15,0x07,0x07,0x0e,0x0c,0x06,0x0c,0x15,0x12,0x0e,0x12,0x17,0x13,0x0e,0x0e,0x0e,0x0d,0x0a,0x0c,0x07,0x08,0x0d,0x08,0x0d,0x12,0x11,0x0e,0x0c,0x0e,0x0b,0x0f,0x0f,0x0b,0x0a,0x0d,0x0d,0x09,0x09,0x0d, +0x06,0x09,0x0b,0x07,0x1e,0x1b,0x19,0x15,0x11,0x0c,0x1a,0x17,0x13,0x0f,0x0c,0x06,0x06,0x12,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0d,0x0f,0x0c,0x0f,0x0c,0x15,0x14,0x10,0x0e,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x12,0x0e,0x0f,0x0b,0x06,0x1e,0x1b,0x19,0x10,0x0e,0x18,0x11,0x12,0x0e,0x0f,0x0c,0x0f,0x0c,0x0c,0x0d, +0x0c,0x0d,0x06,0x06,0x06,0x06,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0e,0x08,0x10,0x0e,0x10,0x0e,0x0c,0x0a,0x11,0x0e,0x12,0x0e,0x0e,0x0e,0x0b,0x0f,0x0c,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0d,0x0c,0x0e,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0b,0x0b,0x0e,0x0e,0x0d,0x0f,0x0a,0x0a,0x0c,0x0d,0x07,0x0e,0x0e,0x0d,0x0c,0x0b, +0x0e,0x0e,0x0e,0x06,0x07,0x08,0x07,0x09,0x06,0x0e,0x15,0x15,0x15,0x0d,0x0d,0x0e,0x0e,0x11,0x11,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0a,0x06,0x06,0x07,0x07,0x08,0x08,0x0e,0x0e,0x0d,0x0c,0x11,0x0c,0x0a,0x0b,0x0c,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x0f,0x0c,0x0d,0x0d,0x0e,0x06,0x0c,0x09,0x0e,0x09,0x09,0x16,0x17, +0x17,0x0f,0x0b,0x11,0x13,0x0e,0x0e,0x0c,0x0c,0x0d,0x0e,0x0e,0x10,0x0e,0x0f,0x13,0x0e,0x11,0x0e,0x0e,0x0b,0x0c,0x0b,0x0e,0x0c,0x0f,0x0c,0x15,0x15,0x0f,0x0c,0x0f,0x0d,0x0f,0x0b,0x0e,0x0c,0x10,0x0e,0x0e,0x0a,0x0e,0x0e,0x0b,0x06,0x12,0x0b,0x0b,0x15,0x10,0x10,0x0e,0x16,0x11,0x10,0x0c,0x15,0x11,0x11,0x0e,0x16,0x12,0x0d,0x0b, +0x13,0x12,0x12,0x0e,0x11,0x0e,0x11,0x0e,0x1f,0x1b,0x14,0x10,0x1b,0x15,0x15,0x10,0x0e,0x0b,0x0c,0x09,0x0a,0x00,0x00,0x18,0x17,0x0e,0x0c,0x0d,0x0e,0x0e,0x0c,0x0d,0x0b,0x0e,0x0c,0x11,0x0e,0x14,0x10,0x18,0x14,0x11,0x0d,0x0f,0x0b,0x0d,0x0a,0x15,0x10,0x10,0x0e,0x14,0x0f,0x14,0x0f,0x06,0x15,0x12,0x0e,0x0c,0x11,0x0e,0x10,0x0e, +0x0f,0x0c,0x0f,0x0c,0x15,0x14,0x0c,0x0d,0x11,0x0d,0x11,0x0d,0x15,0x12,0x0d,0x0b,0x0d,0x0b,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0f,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x10,0x0e,0x13,0x11,0x0e,0x0e,0x14,0x15,0x13,0x11,0x0d,0x0b,0x16,0x13,0x18,0x14,0x11,0x0d,0x10,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x08,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x0e,0x08,0x08,0x04,0x05,0x05,0x05,0x07,0x0a,0x07,0x06,0x09,0x05,0x05,0x05,0x08,0x08,0x05,0x05,0x0e,0x0e,0x0e,0x0e,0x08,0x07,0x06,0x08,0x07,0x06,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x07,0x04,0x06,0x07,0x05,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08, +0x0a,0x08,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d, +0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d, +0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x0f,0x07,0x0f,0x08,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0e,0x0b,0x10,0x14,0x0c,0x0b,0x0d,0x0d,0x0a, +0x0a,0x06,0x07,0x0c,0x09,0x11,0x0e,0x0e,0x0b,0x0f,0x0f,0x0f,0x16,0x0d,0x0e,0x0e,0x0b,0x0b,0x0b,0x0a,0x0d,0x0e,0x11,0x0e,0x0c,0x11,0x0b,0x0a,0x0a,0x0d,0x09,0x0b,0x0e,0x0b,0x0e,0x0d,0x09,0x0c,0x08,0x09,0x0a,0x07,0x07,0x0a,0x0a,0x04,0x05,0x09,0x07,0x0d,0x0b,0x0b,0x0a,0x09,0x08,0x08,0x07,0x0a,0x0d,0x08,0x08,0x08,0x0c,0x08, +0x08,0x07,0x07,0x06,0x06,0x08,0x04,0x07,0x0c,0x08,0x08,0x06,0x08,0x08,0x08,0x05,0x08,0x08,0x0c,0x07,0x08,0x08,0x07,0x08,0x0a,0x07,0x04,0x05,0x08,0x07,0x08,0x07,0x08,0x0a,0x07,0x0e,0x04,0x08,0x0d,0x15,0x0f,0x0d,0x0d,0x15,0x10,0x15,0x12,0x0d,0x0e,0x0c,0x0b,0x1b,0x0b,0x0e,0x15,0x16,0x16,0x0f,0x0f,0x0f,0x0b,0x0b,0x0d,0x0a, +0x0b,0x0c,0x05,0x00,0x00,0x00,0x00,0x0e,0x0f,0x0f,0x0f,0x0b,0x09,0x0e,0x0e,0x08,0x15,0x0e,0x0e,0x08,0x08,0x0b,0x08,0x0b,0x0e,0x0b,0x0e,0x16,0x10,0x08,0x06,0x0e,0x0d,0x0e,0x0e,0x0e,0x08,0x0e,0x0c,0x06,0x15,0x0e,0x0e,0x08,0x0a,0x0a,0x0c,0x0b,0x0b,0x0c,0x0e,0x0e,0x0d,0x0b,0x0b,0x12,0x06,0x0b,0x06,0x0e,0x0b,0x08,0x06,0x06, +0x08,0x06,0x04,0x04,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x0c,0x0c,0x08,0x08,0x08,0x08,0x09,0x06,0x04,0x05,0x08,0x08,0x08,0x08,0x07,0x06,0x06,0x07,0x06,0x08,0x00,0x00,0x00,0x00,0x05,0x08,0x07,0x08,0x06,0x07,0x0d,0x0d,0x0d,0x0d,0x08,0x00,0x00,0x00,0x00,0x0b,0x07,0x06,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, +0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x04,0x09,0x09,0x08,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x09,0x08,0x09,0x09,0x08, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x13,0x0f,0x11,0x0e,0x12,0x0f,0x16,0x12,0x0d,0x09,0x0c,0x10,0x0d,0x14,0x11,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x18,0x0a,0x06,0x0c,0x0e,0x0a,0x0c,0x0c,0x0e,0x0e,0x0c,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c, +0x10,0x0c,0x0c,0x0c,0x08,0x0e,0x08,0x12,0x10,0x0c,0x08,0x14,0x0c,0x14,0x06,0x08,0x0e,0x0e,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x14,0x06,0x0e,0x06,0x0c,0x0a,0x06,0x06,0x0c,0x06,0x12,0x06,0x16,0x0c,0x16,0x16,0x0e,0x0e,0x0e,0x0c,0x0c,0x0a,0x0a,0x1c,0x1c,0x20,0x20,0x14,0x14,0x0c,0x0c,0x04,0x18,0x12,0x14,0x10,0x0e,0x10,0x0c,0x0c, +0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x10,0x00,0x10,0x10,0x10,0x08,0x0c,0x0c,0x16,0x08,0x16,0x08,0x0e,0x10,0x0e,0x0a,0x16,0x0c,0x16,0x0c,0x12,0x14,0x08,0x0c,0x0c,0x0a,0x06,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0e,0x0c,0x10,0x10,0x16,0x08,0x0c,0x0a,0x10,0x0c,0x08,0x0c,0x0c,0x0c,0x16,0x08,0x16,0x08,0x06, +0x0e,0x09,0x18,0x0c,0x0c,0x10,0x10,0x18,0x0c,0x00,0x00,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x12,0x10,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0c,0x0c,0x12,0x14,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x0e, +0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a,0x0a,0x1c,0x14,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x0c,0x0e,0x0e,0x0e,0x18,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x12,0x12,0x1a,0x18,0x16,0x0c,0x14,0x0c,0x14,0x0c,0x14,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16, +0x0c,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x08,0x10,0x08,0x0d,0x10,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x14,0x16,0x12,0x14,0x08,0x0c,0x12,0x14,0x12,0x14,0x00,0x00,0x00,0x00,0x00,0x1b,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0a,0x00,0x00,0x0e,0x00,0x00,0x00,0x1c,0x14,0x20,0x18,0x0c,0x0e, +0x0e,0x0e,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x16,0x16,0x09,0x0e,0x0e,0x0e,0x1d,0x14,0x0d,0x25,0x1a,0x08,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0a,0x0a,0x12,0x10,0x10,0x0c,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x1e,0x24,0x00,0x00,0x00,0x00,0x00, +0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0a,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x0c,0x0c,0x0a,0x1c,0x14,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e, +0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x08,0x08,0x0a,0x0a,0x1c,0x14,0x10,0x0e,0x0e,0x00,0x0c,0x0c,0x0c,0x09,0x0e,0x10,0x0f,0x0c,0x0d,0x09,0x06,0x12,0x0e,0x0e,0x08,0x0d,0x0c,0x0b,0x0b,0x0b,0x06,0x0c,0x0a,0x0f,0x0c,0x0e,0x0b,0x0d,0x0b,0x10,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x0b,0x0b,0x0b,0x07,0x0c, +0x0d,0x0e,0x0c,0x08,0x12,0x0e,0x0f,0x0d,0x0f,0x0c,0x0e,0x0c,0x0a,0x11,0x09,0x0a,0x0a,0x0c,0x0e,0x0e,0x0c,0x18,0x0c,0x18,0x08,0x06,0x04,0x0d,0x05,0x03,0x00,0x03,0x05,0x00,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x16,0x0a,0x12,0x0e,0x16,0x11,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x16,0x16,0x15,0x0b,0x15,0x0b,0x15,0x0f,0x10,0x11,0x11,0x12,0x15,0x18,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x10,0x10,0x10,0x10,0x12,0x0e,0x19,0x14,0x0b,0x0b,0x07,0x07,0x07,0x09,0x05,0x0e,0x06,0x06,0x14,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x05,0x00,0x00,0x05,0x00,0x00,0x0f,0x0e, +0x0b,0x0c,0x10,0x06,0x08,0x10,0x10,0x06,0x0d,0x0d,0x0d,0x11,0x10,0x06,0x0a,0x10,0x0f,0x0f,0x0f,0x0e,0x0e,0x10,0x0d,0x13,0x11,0x0d,0x0d,0x0d,0x06,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0c,0x10,0x0d,0x0d,0x11,0x0d,0x11,0x0d,0x13,0x13,0x13,0x13,0x0f,0x0f,0x0f,0x0e,0x0b,0x0c,0x10,0x07,0x09,0x10,0x07,0x0d,0x0d,0x0d,0x10, +0x0a,0x10,0x0f,0x0f,0x0e,0x10,0x0d,0x13,0x11,0x06,0x0e,0x0d,0x0f,0x10,0x1d,0x00,0x0f,0x0d,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x12,0x0f,0x10,0x11,0x0d,0x10,0x12,0x12, +0x0b,0x0f,0x12,0x12,0x10,0x12,0x13,0x13,0x10,0x0d,0x0d,0x12,0x11,0x0e,0x10,0x10,0x10,0x10,0x10,0x12,0x0e,0x0f,0x10,0x10,0x13,0x0f,0x0f,0x0f,0x10,0x14,0x0c,0x0e,0x0e,0x15,0x0d,0x0d,0x13,0x15,0x0f,0x0d,0x19,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0d,0x12,0x14,0x15,0x0d,0x13,0x0d,0x10,0x0d,0x0f,0x0e,0x0f,0x0d,0x0f,0x12,0x0d,0x0f, +0x10,0x0d,0x0d,0x0e,0x17,0x0d,0x0d,0x0e,0x0e,0x0a,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x0d,0x15,0x0c,0x0d,0x15,0x10,0x0d,0x15,0x12,0x12,0x15,0x0e,0x0d,0x15,0x15,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x0e,0x0d,0x0e,0x15,0x0e,0x0d,0x0d,0x0d,0x15,0x13,0x10,0x11,0x11,0x10,0x11,0x0f,0x10,0x13,0x11,0x10,0x0d,0x13,0x10,0x10, +0x0e,0x10,0x11,0x12,0x11,0x0e,0x11,0x10,0x11,0x10,0x13,0x11,0x11,0x11,0x10,0x0f,0x11,0x10,0x11,0x13,0x10,0x12,0x11,0x02,0x03,0x04,0x05,0x04,0x06,0x08,0x15,0x0e,0x0f,0x0e,0x0e,0x0f,0x0e,0x0e,0x10,0x0e,0x0e,0x07,0x14,0x0e,0x0e,0x0e,0x0d,0x0e,0x0c,0x0e,0x06,0x0e,0x0c,0x0e,0x0a,0x15,0x0d,0x0e,0x0e,0x0e,0x14,0x0e,0x0e,0x09, +0x14,0x0e,0x0e,0x10,0x10,0x05,0x07,0x1b,0x1b,0x1b,0x1b,0x22,0x0d,0x0d,0x06,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x0c,0x0c,0x0c,0x0e,0x0a,0x0a,0x0e,0x0f,0x06,0x08,0x0c,0x0a,0x12,0x10,0x0f,0x0c,0x0f,0x0c,0x0a,0x0b,0x0e,0x0c,0x13,0x0c,0x0b,0x0c,0x11,0x13,0x0a,0x0f,0x0c,0x0e,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0b,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0e,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0c,0x0f,0x0f,0x06,0x06,0x06,0x06,0x06,0x0e,0x08,0x0c,0x0a,0x0a,0x0a,0x0a,0x10,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x11,0x0f,0x0c, +0x0c,0x09,0x0d,0x0a,0x0c,0x0f,0x0f,0x06,0x0c,0x0c,0x12,0x10,0x0b,0x0f,0x0f,0x0c,0x0b,0x0b,0x0b,0x0f,0x0c,0x10,0x0f,0x0c,0x0a,0x0f,0x06,0x0f,0x0b,0x0f,0x06,0x0b,0x0a,0x0e,0x0a,0x0c,0x0a,0x06,0x06,0x08,0x14,0x14,0x0f,0x0c,0x0c,0x0f,0x0c,0x0c,0x0c,0x0a,0x0e,0x0a,0x12,0x0b,0x10,0x10,0x0c,0x0e,0x12,0x0f,0x0f,0x0f,0x0c,0x0c, +0x0b,0x0c,0x0f,0x0c,0x0f,0x0d,0x13,0x14,0x0e,0x11,0x0c,0x0c,0x15,0x0c,0x0a,0x0e,0x0e,0x0f,0x15,0x15,0x10,0x0c,0x0e,0x0a,0x0e,0x0d,0x0d,0x11,0x0d,0x0d,0x10,0x0e,0x0e,0x09,0x0f,0x0f,0x0e,0x0c,0x0c,0x16,0x12,0x0b,0x0d,0x0e,0x0e,0x0f,0x0f,0x11,0x10,0x09,0x16,0x0e,0x0d,0x0e,0x0f,0x0f,0x0c,0x0c,0x06,0x12,0x10,0x10,0x0b,0x11, +0x05,0x05,0x0a,0x0a,0x05,0x05,0x0f,0x0a,0x06,0x12,0x11,0x07,0x05,0x05,0x0b,0x09,0x09,0x06,0x06,0x06,0x09,0x10,0x0b,0x07,0x0f,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x0e,0x08,0x0b,0x0d,0x0a,0x05,0x06,0x09,0x0d,0x08,0x10,0x10,0x10,0x16,0x12,0x16,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x12,0x14,0x08,0x08,0x0c,0x08,0x16,0x08,0x16,0x08, +0x16,0x08,0x0e,0x0e,0x0e,0x0c,0x0c,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x14,0x14,0x14,0x14,0x14,0x16,0x16,0x0c,0x0c,0x16,0x16,0x0c,0x0c,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x18,0x12,0x14,0x0c,0x0e,0x0e,0x10,0x08,0x10,0x12,0x0c,0x0c,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x06,0x16,0x08,0x12,0x0c,0x0c,0x06,0x0c,0x0c,0x0c,0x0c,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1c,0x14,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x14,0x14,0x18,0x18,0x18,0x18,0x18, +0x18,0x12,0x0c,0x0c,0x12,0x0c,0x0c,0x16,0x0c,0x1a,0x18,0x16,0x0c,0x14,0x0c,0x14,0x0c,0x14,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x10,0x10,0x10,0x10,0x10,0x08,0x10,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x0c,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x0c,0x08,0x08,0x08, +0x08,0x00,0x1c,0x14,0x20,0x18,0x16,0x0c,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0c,0x0c,0x0a,0x1c,0x14,0x18,0x18,0x16,0x16,0x16,0x0e,0x0e,0x0e,0x0e,0x10,0x08,0x10,0x08,0x10,0x08,0x1c,0x14,0x0e,0x10,0x0e,0x0e,0x0e,0x10,0x0e,0x0e,0x1c,0x1c,0x14,0x14,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x08,0x08, +0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x16,0x08,0x16,0x08,0x0e,0x10,0x0e,0x0e,0x1c,0x1c,0x14,0x14,0x1c,0x1c,0x14,0x14,0x14,0x14,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x08,0x06,0x00,0x00,0x00,0x14,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x0a,0x0a,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x10,0x10, +0x10,0x10,0x10,0x10,0x12,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x14,0x10,0x10,0x10,0x06,0x06,0x0c,0x0a,0x0e,0x0f,0x0e,0x0d,0x0d,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0b,0x0d,0x0d,0x0e,0x0f,0x0f,0x10,0x0e,0x0e,0x10,0x0c,0x10,0x12,0x0f,0x12,0x14,0x0f,0x12,0x11, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0b,0x0d,0x0f,0x0e,0x10,0x0e,0x10,0x0e,0x0e,0x0e,0x0c,0x0c,0x12,0x10,0x11,0x10,0x10,0x0e,0x0e,0x0e,0x12,0x13,0x12,0x12,0x16,0x16,0x11,0x16,0x16,0x12,0x15,0x14,0x0d,0x12,0x14,0x12,0x0e,0x14,0x12,0x11,0x11,0x0f,0x0f,0x12,0x13,0x11,0x0f,0x11,0x0e,0x0d,0x16,0x16,0x16, +0x14,0x16,0x16,0x10,0x16,0x16,0x11,0x12,0x13,0x12,0x11,0x11,0x0f,0x15,0x12,0x14,0x11,0x11,0x0e,0x12,0x11,0x11,0x14,0x12,0x11,0x16,0x0d,0x0c,0x0d,0x0d,0x0f,0x0f,0x11,0x12,0x0e,0x0e,0x0e,0x0d,0x0e,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0d,0x0e,0x0f,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x0f,0x12,0x14,0x10,0x10,0x0f,0x12, +0x0f,0x10,0x0c,0x0b,0x0e,0x0e,0x0b,0x0c,0x0d,0x0d,0x0c,0x0b,0x0f,0x0b,0x0d,0x0c,0x0d,0x13,0x0e,0x14,0x0d,0x0e,0x0e,0x12,0x08,0x13,0x10,0x11,0x10,0x0d,0x12,0x0e,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06, +0x06,0x06,0x0f,0x06,0x06,0x06,0x07,0x07,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x16,0x16,0x16,0x16,0x0c,0x12,0x11,0x0c,0x0a,0x0c,0x0d,0x0d,0x0c,0x14,0x14,0x15,0x0b,0x18,0x0c,0x14,0x14,0x14,0x13,0x0e,0x0c,0x0c,0x13,0x0e,0x13,0x10,0x0d,0x0b,0x0a,0x18,0x0a,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x21,0x14,0x14,0x0a,0x06,0x0b,0x06,0x0b, +0x06,0x06,0x06,0x0c,0x0e,0x0e,0x0d,0x09,0x09,0x06,0x06,0x06,0x09,0x06,0x0a,0x15,0x05,0x16,0x16,0x16,0x0e,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x1c,0x1c,0x10,0x1c,0x1c,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0b,0x0e,0x0b,0x0d,0x0a,0x09,0x08,0x10,0x0d,0x11,0x0a,0x1b,0x15,0x0e,0x0d,0x16,0x13,0x14,0x12,0x18,0x14,0x16,0x13,0x0f,0x0b,0x11,0x0e,0x16,0x12,0x12,0x0f,0x12,0x0e,0x15,0x10,0x15,0x10,0x1a,0x14,0x12,0x0e,0x12,0x0e,0x1d,0x15,0x13,0x00,0x18,0x18,0x18,0x0b,0x00,0x00,0x0e,0x0c,0x11,0x0d, +0x0d,0x0a,0x1a,0x16,0x17,0x15,0x11,0x0e,0x11,0x0e,0x0d,0x0a,0x12,0x0e,0x0d,0x0a,0x14,0x10,0x10,0x0e,0x17,0x14,0x0d,0x0e,0x12,0x12,0x13,0x0b,0x05,0x0b,0x10,0x0a,0x18,0x18,0x06,0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x10,0x11,0x07,0x05,0x07,0x05,0x11,0x0e,0x12, +0x0f,0x0d,0x0b,0x0d,0x0c,0x0e,0x0e,0x0a,0x0a,0x1b,0x14,0x1c,0x15,0x18,0x14,0x16,0x10,0x16,0x10,0x16,0x10,0x0f,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0d,0x08,0x0b,0x06,0x12,0x0e,0x15,0x10,0x20,0x18,0x0d,0x0e,0x11,0x11,0x13,0x15,0x12,0x0e,0x17,0x13,0x0d,0x0a,0x0d,0x0c,0x0f,0x0c,0x16,0x11,0x0f,0x0d,0x0d,0x0e,0x0d,0x0e,0x0c, +0x0a,0x0b,0x09,0x0b,0x09,0x0c,0x0d,0x07,0x10,0x08,0x17,0x10,0x08,0x0e,0x0f,0x0b,0x12,0x0d,0x09,0x08,0x0e,0x0e,0x0e,0x0b,0x06,0x12,0x0e,0x09,0x08,0x0f,0x0b,0x11,0x09,0x13,0x0e,0x0f,0x0b,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x0e,0x08,0x0d,0x0a,0x12,0x0a,0x0d,0x15,0x0c,0x0d,0x16,0x06,0x1c,0x15,0x16,0x1c,0x15,0x16,0x16,0x15,0x15, +0x16,0x0c,0x0b,0x0f,0x11,0x16,0x11,0x17,0x06,0x0b,0x0e,0x15,0x19,0x11,0x19,0x0f,0x0f,0x13,0x11,0x1b,0x16,0x0c,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x14,0x14,0x18,0x0c,0x0c,0x18,0x12,0x0c,0x0c,0x12,0x10,0x08,0x08,0x10,0x0e,0x0e,0x0e,0x0e,0x12,0x08,0x08,0x14,0x12,0x08,0x08,0x14,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0c,0x0a,0x0e,0x0d,0x12,0x0e,0x0e,0x15,0x10,0x12,0x12,0x14,0x14,0x0e,0x0c,0x18,0x13,0x19,0x15,0x10,0x0e,0x08,0x08,0x0e,0x10,0x0a,0x0e,0x0c,0x0e,0x0c,0x12,0x13,0x0a,0x0e,0x0a,0x05, +0x09,0x0d,0x0d,0x05,0x05,0x04,0x05,0x09,0x09,0x09,0x0b,0x24,0x30,0x08,0x0a,0x03,0x06,0x09,0x0a,0x08,0x0c,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x20,0x0d,0x12,0x16,0x16,0x0f,0x0b,0x0e,0x11,0x12,0x0c,0x08,0x10,0x0c,0x10,0x0d,0x10,0x0d,0x0d,0x12,0x0e,0x0e,0x0d,0x12,0x0f,0x14,0x0b, +0x0d,0x0f,0x08,0x0e,0x08,0x08,0x06,0x15,0x0e,0x0e,0x0d,0x0d,0x0e,0x16,0x16,0x17,0x18,0x18,0x0d,0x0c,0x07,0x0c,0x0b,0x0f,0x0b,0x10,0x06,0x0e,0x0e,0x15,0x15,0x0f,0x0d,0x0e,0x0d,0x0d,0x0b,0x0d,0x0b,0x0c,0x07,0x08,0x06,0x05,0x09,0x0e,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x00, +0x07,0x07,0x07,0x06,0x06,0x28,0x18,0x15,0x19,0x07,0x07,0x08,0x0a,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x16,0x08,0x08,0x16,0x06,0x0c,0x0c,0x20,0x18,0x18,0x20,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x0a,0x0a,0x00,0x00,0x09,0x12,0x0e,0x11,0x0e,0x1e,0x19,0x11,0x0d,0x11,0x0d,0x20,0x18,0x12,0x0e,0x09,0x08, +0x0f,0x00,0x10,0x0d,0x08,0x07,0x04,0x0c,0x08,0x08,0x06,0x05,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x0d,0x0a,0x0e,0x0e,0x0d,0x17,0x13,0x13,0x13,0x14,0x17,0x0f,0x10,0x0e,0x09,0x16,0x1b,0x0b,0x1c,0x0c,0x14,0x16,0x16,0x16,0x0a,0x12,0x18,0x12,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x0d,0x00,0x0e,0x0e,0x0e,0x14,0x0c,0x0c,0x16,0x08,0x08,0x16,0x08,0x08,0x16,0x0c,0x0c,0x00,0x0a,0x14,0x08,0x08,0x18,0x0c,0x0c,0x12,0x0c,0x0c,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x24,0x24,0x15,0x00,0x00,0x15,0x15,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, +0x0a,0x0a,0x0a,0x0a,0x10,0x0f,0x0f,0x10,0x15,0x0f,0x0f,0x13,0x17,0x10,0x0f,0x1a,0x0f,0x0f,0x16,0x0f,0x10,0x13,0x0f,0x12,0x14,0x16,0x0f,0x12,0x10,0x11,0x0f,0x11,0x0f,0x10,0x10,0x0f,0x13,0x0e,0x10,0x13,0x0f,0x0f,0x0e,0x13,0x0f,0x10,0x10,0x11,0x0b,0x0d,0x0f,0x13,0x13,0x0d,0x00,0x00,0x1b,0x36,0x11,0x00,0x03,0x07,0x08,0x0b, +0x10,0x0f,0x16,0x16,0x06,0x08,0x08,0x0b,0x12,0x06,0x0b,0x06,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x06,0x06,0x12,0x12,0x12,0x0c,0x1a,0x11,0x0f,0x11,0x13,0x0e,0x0d,0x13,0x13,0x07,0x0a,0x10,0x0d,0x18,0x14,0x14,0x0f,0x14,0x10,0x0e,0x0e,0x13,0x11,0x19,0x10,0x0f,0x0f,0x08,0x0a,0x08,0x12,0x0b,0x07,0x0e,0x10, +0x0c,0x10,0x0e,0x08,0x10,0x0f,0x07,0x07,0x0d,0x07,0x17,0x0f,0x10,0x10,0x10,0x09,0x0b,0x09,0x0f,0x0d,0x14,0x0c,0x0d,0x0c,0x08,0x06,0x08,0x12,0x11,0x11,0x11,0x0e,0x14,0x14,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x0f,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0f,0x0f, +0x0c,0x0b,0x0c,0x0f,0x0b,0x18,0x18,0x15,0x08,0x0b,0x13,0x17,0x14,0x16,0x12,0x13,0x13,0x0f,0x10,0x0e,0x11,0x14,0x0f,0x0b,0x0c,0x14,0x16,0x10,0x0c,0x07,0x08,0x12,0x12,0x0f,0x13,0x11,0x0e,0x0e,0x14,0x11,0x11,0x14,0x19,0x19,0x0e,0x1b,0x0a,0x0a,0x06,0x06,0x12,0x10,0x0d,0x0f,0x05,0x0f,0x09,0x09,0x0f,0x0f,0x0a,0x06,0x06,0x0a, +0x21,0x11,0x0e,0x11,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x14,0x14,0x13,0x13,0x13,0x07,0x0a,0x09,0x08,0x08,0x05,0x08,0x06,0x09,0x05,0x0a,0x0d,0x07,0x0e,0x0b,0x0f,0x0c,0x06,0x13,0x0f,0x0f,0x0d,0x0f,0x10,0x12,0x12,0x09,0x0a,0x0a,0x19,0x18,0x1a,0x0d,0x13,0x10,0x07,0x0e,0x0b,0x11,0x0c,0x11,0x0c,0x10,0x0b,0x06,0x11,0x0e,0x11, +0x0e,0x13,0x12,0x13,0x0e,0x0e,0x0e,0x0e,0x0d,0x07,0x0d,0x08,0x0d,0x09,0x14,0x0f,0x14,0x0f,0x14,0x10,0x10,0x09,0x10,0x09,0x0e,0x0b,0x0e,0x09,0x0e,0x0c,0x13,0x0f,0x13,0x0f,0x0f,0x0c,0x0f,0x0c,0x0d,0x14,0x14,0x11,0x10,0x0c,0x10,0x0d,0x13,0x0b,0x0d,0x0b,0x1e,0x11,0x0d,0x10,0x06,0x0a,0x16,0x09,0x10,0x0a,0x0a,0x10,0x0a,0x11, +0x0e,0x11,0x0c,0x11,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x0f,0x13,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x07,0x10,0x0d,0x0d,0x0d,0x07,0x14,0x0f,0x14,0x0f,0x14,0x10,0x14,0x10,0x10,0x09,0x0e,0x0b,0x0e,0x09,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x19,0x14,0x0f,0x0d,0x07,0x11, +0x0e,0x17,0x16,0x14,0x10,0x06,0x19,0x14,0x19,0x14,0x19,0x14,0x0f,0x0d,0x06,0x0b,0x0f,0x10,0x19,0x19,0x19,0x18,0x0b,0x0b,0x06,0x07,0x07,0x11,0x0f,0x15,0x0a,0x16,0x12,0x16,0x07,0x11,0x0f,0x0e,0x0f,0x13,0x07,0x10,0x11,0x18,0x14,0x0e,0x14,0x13,0x0f,0x0e,0x0e,0x0f,0x10,0x15,0x14,0x07,0x0f,0x11,0x0c,0x10,0x07,0x0f,0x0f,0x0e, +0x0c,0x10,0x10,0x07,0x0e,0x0d,0x10,0x0e,0x0c,0x10,0x10,0x0c,0x0f,0x0f,0x14,0x16,0x07,0x0f,0x10,0x0f,0x16,0x0e,0x13,0x0d,0x11,0x0e,0x07,0x1a,0x1b,0x14,0x10,0x0f,0x13,0x11,0x0f,0x0f,0x0d,0x13,0x0e,0x17,0x0f,0x14,0x14,0x10,0x12,0x18,0x13,0x14,0x13,0x0f,0x11,0x0e,0x0f,0x14,0x10,0x14,0x12,0x1a,0x1a,0x13,0x15,0x10,0x11,0x1c, +0x10,0x0e,0x10,0x0e,0x0a,0x0f,0x0e,0x14,0x0c,0x10,0x10,0x0d,0x0e,0x13,0x10,0x10,0x10,0x10,0x0c,0x0b,0x0d,0x13,0x0c,0x10,0x0f,0x16,0x16,0x10,0x13,0x0e,0x0c,0x16,0x0e,0x0e,0x10,0x0a,0x0c,0x0b,0x07,0x15,0x16,0x0f,0x0d,0x0d,0x10,0x0d,0x0b,0x1b,0x1e,0x11,0x09,0x0a,0x0a,0x0a,0x07,0x0e,0x0b,0x0f,0x15,0x10,0x13,0x10,0x08,0x09, +0x07,0x07,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x08,0x0d,0x08,0x0d,0x08,0x08,0x08,0x0d,0x0d,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x10,0x14, +0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x13,0x0f,0x13,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x0f,0x0d,0x0f,0x0d,0x0f,0x0d,0x0e,0x09,0x0e,0x0e,0x14,0x10,0x07,0x0a,0x07,0x07,0x0e,0x0b,0x19,0x15,0x11,0x0e,0x10,0x0d,0x14,0x10,0x0f,0x0d,0x0f, +0x0d,0x11,0x0d,0x12,0x0f,0x12,0x0f,0x13,0x0e,0x14,0x10,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x08,0x08,0x08,0x08,0x0e,0x0e,0x11,0x0e,0x0f,0x10,0x0f,0x10,0x0f,0x10,0x11,0x0c,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x08,0x13,0x10,0x13, +0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x07,0x07,0x07,0x07,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x18,0x17,0x18,0x17,0x18,0x17,0x14,0x0f,0x14,0x0f,0x14,0x0f,0x14,0x0f,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x10,0x0f,0x10,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0e,0x0b,0x0e, +0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x11,0x0d,0x11,0x0d,0x19,0x14,0x19,0x14,0x10,0x0c,0x10,0x0c,0x0f,0x0d,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x09,0x14,0x0d,0x0e,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14, +0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x19,0x19,0x19,0x19,0x19,0x19,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x0f,0x0f, +0x0f,0x0f,0x0f,0x12,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x0c,0x0c,0x10,0x10,0x07,0x07,0x10,0x10,0x0f,0x0f,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x19, +0x19,0x19,0x19,0x19,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x15,0x15,0x13,0x10,0x10,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x10,0x10,0x10, +0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x11,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x17,0x16,0x14,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x11,0x0f,0x10,0x10,0x10,0x11,0x11,0x0d,0x13,0x14,0x0f,0x10,0x10,0x0e,0x0f,0x0d,0x13,0x11,0x18,0x08,0x08, +0x10,0x0d,0x07,0x0d,0x18,0x14,0x10,0x14,0x1a,0x15,0x10,0x10,0x10,0x0e,0x0b,0x0e,0x08,0x09,0x0e,0x09,0x0e,0x14,0x13,0x0f,0x0e,0x0f,0x0c,0x10,0x10,0x0c,0x0b,0x0f,0x0f,0x0a,0x0b,0x0f,0x06,0x0a,0x0c,0x08,0x21,0x1f,0x1c,0x17,0x13,0x0e,0x1d,0x1a,0x16,0x11,0x0e,0x07,0x07,0x14,0x10,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13, +0x0f,0x0e,0x11,0x0e,0x11,0x0e,0x17,0x16,0x13,0x10,0x13,0x10,0x10,0x0d,0x14,0x10,0x14,0x10,0x10,0x0c,0x07,0x21,0x1f,0x1c,0x13,0x10,0x1b,0x13,0x14,0x0f,0x11,0x0e,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x10,0x14,0x10,0x10,0x09,0x10,0x09,0x13,0x0f,0x13,0x0f,0x0e,0x0c,0x13,0x0f,0x14,0x10,0x0f,0x0f,0x0c,0x11, +0x0e,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x0d,0x10,0x0e,0x0f,0x0f,0x10,0x0e,0x10,0x10,0x10,0x0d,0x0d,0x10,0x10,0x0e,0x11,0x0b,0x0b,0x0e,0x0f,0x07,0x10,0x10,0x0e,0x0d,0x0c,0x0f,0x0f,0x0f,0x07,0x08,0x09,0x08,0x0a,0x07,0x10,0x17,0x17,0x17,0x0f,0x0f,0x10,0x10,0x13,0x13,0x11,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c, +0x0c,0x0b,0x07,0x07,0x08,0x08,0x09,0x09,0x10,0x10,0x0f,0x0d,0x14,0x0d,0x0b,0x0c,0x0e,0x0c,0x0c,0x0a,0x0a,0x0a,0x0d,0x11,0x0d,0x0f,0x0e,0x0f,0x07,0x0d,0x0a,0x10,0x0a,0x0a,0x19,0x1a,0x1a,0x11,0x0d,0x13,0x15,0x10,0x0f,0x0d,0x0d,0x0f,0x10,0x0f,0x12,0x0f,0x11,0x16,0x0f,0x13,0x10,0x10,0x0c,0x0d,0x0c,0x10,0x0e,0x11,0x0d,0x18, +0x17,0x10,0x0e,0x11,0x0e,0x10,0x0c,0x10,0x0d,0x12,0x10,0x0f,0x0b,0x0f,0x10,0x0c,0x07,0x14,0x0d,0x0d,0x17,0x12,0x11,0x10,0x19,0x13,0x12,0x0d,0x18,0x13,0x14,0x0f,0x19,0x14,0x0f,0x0c,0x15,0x15,0x14,0x10,0x13,0x10,0x13,0x10,0x23,0x1e,0x16,0x12,0x1e,0x18,0x17,0x12,0x10,0x0c,0x0e,0x0b,0x0b,0x00,0x00,0x1b,0x1a,0x10,0x0e,0x0f, +0x10,0x0f,0x0e,0x0f,0x0c,0x10,0x0d,0x13,0x10,0x17,0x12,0x1b,0x17,0x13,0x0f,0x11,0x0c,0x0e,0x0b,0x18,0x12,0x13,0x10,0x17,0x11,0x17,0x11,0x07,0x17,0x14,0x10,0x0e,0x13,0x10,0x12,0x0f,0x11,0x0e,0x11,0x0e,0x17,0x16,0x0e,0x0e,0x13,0x0e,0x13,0x0e,0x17,0x14,0x0f,0x0c,0x0e,0x0c,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x11,0x0c, +0x0f,0x0d,0x0f,0x0d,0x0f,0x0d,0x12,0x0f,0x15,0x13,0x0f,0x10,0x17,0x17,0x16,0x13,0x0f,0x0d,0x18,0x15,0x1b,0x17,0x13,0x0e,0x12,0x10,0x10,0x0f,0x0f,0x0e,0x10,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x10,0x09,0x09,0x04,0x06,0x06,0x06,0x08,0x0b,0x08,0x06,0x0a,0x06,0x06,0x06,0x09,0x09, +0x06,0x06,0x10,0x10,0x10,0x10,0x09,0x08,0x07,0x09,0x08,0x07,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x08,0x04,0x07,0x08,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0b,0x09,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f, +0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f, +0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x11,0x08,0x11,0x09,0x10,0x10,0x09,0x09, +0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x10,0x0d,0x12,0x16,0x0d,0x0c,0x0f,0x0f,0x0b,0x0b,0x07,0x08,0x0d,0x0b,0x13,0x10,0x10,0x0d,0x11,0x11,0x11,0x19,0x0e,0x10,0x10,0x0c,0x0c,0x0c,0x0b,0x0e,0x0f,0x13,0x0f,0x0d,0x14,0x0c,0x0b, +0x0b,0x0e,0x0a,0x0d,0x10,0x0c,0x10,0x0f,0x0a,0x0d,0x09,0x0a,0x0b,0x08,0x08,0x0b,0x0b,0x05,0x06,0x0a,0x08,0x0e,0x0c,0x0c,0x0c,0x0a,0x09,0x09,0x08,0x0b,0x0e,0x09,0x09,0x09,0x0d,0x09,0x09,0x08,0x08,0x07,0x07,0x09,0x04,0x08,0x0d,0x09,0x09,0x07,0x09,0x09,0x09,0x05,0x09,0x09,0x0d,0x08,0x09,0x09,0x08,0x09,0x0b,0x08,0x04,0x06, +0x09,0x08,0x09,0x08,0x09,0x0b,0x08,0x10,0x04,0x09,0x0f,0x18,0x11,0x0f,0x0f,0x17,0x11,0x17,0x14,0x0e,0x10,0x0e,0x0c,0x1e,0x0c,0x10,0x18,0x19,0x19,0x11,0x11,0x11,0x0c,0x0d,0x0e,0x0b,0x0c,0x0e,0x05,0x00,0x00,0x00,0x00,0x10,0x11,0x11,0x11,0x0d,0x0a,0x10,0x10,0x08,0x17,0x0f,0x10,0x09,0x09,0x0d,0x09,0x0c,0x10,0x0c,0x10,0x18, +0x11,0x09,0x07,0x10,0x0e,0x10,0x10,0x10,0x08,0x10,0x0d,0x07,0x17,0x0f,0x10,0x09,0x0b,0x0c,0x0d,0x0c,0x0c,0x0e,0x10,0x10,0x0e,0x0c,0x0c,0x14,0x07,0x0d,0x07,0x0f,0x0c,0x09,0x07,0x07,0x09,0x07,0x05,0x04,0x09,0x09,0x04,0x05,0x05,0x05,0x04,0x05,0x04,0x06,0x0d,0x0d,0x09,0x09,0x0a,0x09,0x0a,0x06,0x04,0x05,0x09,0x09,0x09,0x09, +0x08,0x07,0x07,0x08,0x07,0x09,0x00,0x00,0x00,0x00,0x06,0x09,0x08,0x09,0x07,0x08,0x0f,0x0f,0x0f,0x0f,0x09,0x00,0x00,0x00,0x00,0x0d,0x08,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x05,0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x0a,0x09,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x15,0x11,0x13,0x10,0x14,0x11,0x19,0x14,0x0f,0x0a,0x0e,0x12,0x0e,0x16,0x13,0x00,0x00,0x00, +0x00,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x17,0x17,0x1b,0x0b,0x07,0x0e,0x10,0x0b,0x0e,0x0e,0x10,0x10,0x0e,0x1b,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x11,0x0e,0x0e,0x0e,0x09,0x10,0x09,0x14,0x12,0x0e,0x09,0x17,0x0e,0x17,0x07,0x09,0x10,0x10,0x11,0x11,0x11,0x10,0x10,0x10,0x17,0x07,0x10,0x07, +0x0e,0x0b,0x07,0x07,0x0e,0x07,0x14,0x07,0x19,0x0e,0x19,0x19,0x10,0x10,0x10,0x0e,0x0e,0x0b,0x0b,0x20,0x20,0x24,0x24,0x17,0x17,0x0e,0x0e,0x05,0x1b,0x14,0x17,0x12,0x10,0x12,0x0e,0x0e,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07,0x11,0x00,0x11,0x11,0x11,0x09,0x0e,0x0e,0x19,0x09,0x19,0x09,0x10,0x12,0x10,0x0b, +0x19,0x0e,0x19,0x0e,0x14,0x17,0x09,0x0e,0x0e,0x0b,0x07,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x10,0x0e,0x12,0x11,0x19,0x09,0x0e,0x0b,0x12,0x0e,0x09,0x0e,0x0e,0x0e,0x19,0x09,0x19,0x09,0x07,0x10,0x0b,0x1b,0x0e,0x0e,0x11,0x11,0x1b,0x0e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x11,0x14,0x11,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07, +0x0b,0x0b,0x0e,0x0e,0x14,0x17,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0e,0x0b,0x0b,0x0b,0x20,0x17,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x0e,0x10, +0x10,0x10,0x1b,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x14,0x14,0x1d,0x1b,0x19,0x0e,0x17,0x0e,0x17,0x0e,0x17,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x12,0x09,0x12,0x09,0x0f,0x12,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x17, +0x19,0x14,0x17,0x09,0x0e,0x14,0x17,0x14,0x17,0x00,0x00,0x00,0x00,0x00,0x1e,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0b,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x17,0x24,0x1b,0x0e,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x19,0x19,0x0a,0x10,0x10,0x10,0x21,0x16, +0x0e,0x29,0x1d,0x09,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0b,0x0b,0x14,0x12,0x12,0x0e,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x22,0x29,0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x10,0x12,0x10, +0x0e,0x0e,0x0b,0x20,0x17,0x0e,0x10,0x10,0x10,0x0e,0x10,0x10,0x10,0x0e,0x10,0x10,0x10,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x10,0x10,0x10,0x10,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x12,0x09,0x09,0x0b,0x0b,0x20,0x17,0x11,0x10,0x10,0x00,0x0e,0x0e,0x0e,0x0a,0x0f,0x13,0x11,0x0e,0x0e,0x0a, +0x07,0x14,0x10,0x10,0x09,0x0f,0x0d,0x0d,0x0c,0x0d,0x07,0x0e,0x0b,0x11,0x0d,0x10,0x0c,0x0f,0x0c,0x12,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0x0d,0x0d,0x08,0x0e,0x0f,0x10,0x0e,0x09,0x14,0x10,0x11,0x0e,0x11,0x0d,0x0f,0x0e,0x0b,0x13,0x0a,0x0b,0x0b,0x0d,0x10,0x10,0x0e,0x1b,0x0e,0x1b,0x09,0x07,0x05,0x0f, +0x06,0x03,0x00,0x04,0x06,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x19,0x0b,0x14,0x10,0x19,0x14,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x19,0x17,0x0d,0x17,0x0d,0x17,0x11,0x12,0x13,0x13,0x15,0x17,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x12,0x14,0x10,0x1d, +0x16,0x0d,0x0d,0x08,0x08,0x08,0x0a,0x06,0x0f,0x06,0x06,0x17,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x05,0x00,0x00,0x06,0x00,0x00,0x11,0x0f,0x0c,0x0d,0x12,0x07,0x09,0x12,0x12,0x07,0x0f,0x0f,0x0f,0x13,0x12,0x07,0x0b,0x12,0x10,0x11,0x11,0x0f,0x10,0x12,0x0f,0x15,0x14,0x0e,0x0e,0x0e, +0x06,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x11,0x0d,0x12,0x0f,0x0f,0x13,0x0f,0x14,0x0f,0x15,0x15,0x15,0x15,0x11,0x11,0x11,0x0f,0x0c,0x0d,0x12,0x08,0x0a,0x12,0x08,0x0f,0x0f,0x0f,0x12,0x0b,0x12,0x11,0x11,0x10,0x12,0x0f,0x15,0x14,0x07,0x0f,0x0f,0x11,0x12,0x20,0x00,0x11,0x0f,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x00,0x14,0x11,0x12,0x13,0x0f,0x12,0x14,0x15,0x0d,0x11,0x14,0x14,0x12,0x14,0x16,0x15,0x12,0x0f,0x0f,0x14,0x13,0x0f,0x13,0x12,0x12,0x12,0x13,0x14,0x10,0x11,0x12,0x12,0x15,0x11,0x11,0x11, +0x12,0x16,0x0d,0x10,0x10,0x18,0x0f,0x0f,0x15,0x18,0x10,0x0f,0x1c,0x0f,0x0f,0x14,0x0f,0x0f,0x14,0x0f,0x14,0x16,0x18,0x0f,0x15,0x0f,0x12,0x0f,0x11,0x0f,0x11,0x0f,0x10,0x15,0x0f,0x11,0x12,0x0f,0x0f,0x10,0x1a,0x0f,0x0f,0x10,0x10,0x0b,0x09,0x0f,0x0f,0x0f,0x0e,0x0f,0x18,0x0f,0x18,0x0d,0x0f,0x18,0x12,0x0f,0x18,0x14,0x14,0x18, +0x10,0x0f,0x18,0x18,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x18,0x18,0x10,0x0f,0x0f,0x18,0x10,0x0f,0x0f,0x0f,0x18,0x15,0x13,0x13,0x13,0x13,0x13,0x11,0x13,0x15,0x13,0x12,0x0f,0x15,0x12,0x13,0x0f,0x12,0x13,0x14,0x13,0x10,0x13,0x12,0x14,0x12,0x15,0x13,0x13,0x14,0x12,0x11,0x13,0x12,0x13,0x15,0x12,0x14,0x14,0x03,0x03,0x04,0x05,0x04, +0x07,0x09,0x17,0x0f,0x11,0x10,0x0f,0x11,0x0f,0x0f,0x11,0x10,0x0f,0x08,0x17,0x10,0x0f,0x0f,0x0f,0x10,0x0e,0x10,0x07,0x10,0x0e,0x0f,0x0b,0x17,0x0f,0x0f,0x0f,0x10,0x16,0x0f,0x10,0x0b,0x16,0x10,0x10,0x13,0x12,0x06,0x08,0x1f,0x1e,0x1e,0x1f,0x26,0x0f,0x0f,0x07,0x0f,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f, +0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0d,0x0e,0x10,0x0c,0x0b,0x0f,0x11,0x07,0x08,0x0d,0x0b,0x14,0x11,0x11,0x0d,0x11,0x0d,0x0b,0x0c,0x10,0x0e,0x16,0x0e,0x0d,0x0d,0x13, +0x15,0x0b,0x11,0x0d,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0e,0x11,0x11,0x07,0x07,0x07,0x07,0x07,0x0f,0x08,0x0d,0x0b,0x0b,0x0b,0x0b,0x11,0x11, +0x11,0x12,0x11,0x11,0x11,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x13,0x11,0x0e,0x0d,0x0b,0x0e,0x0c,0x0d,0x11,0x11,0x07,0x0d,0x0e,0x14,0x11,0x0c,0x11,0x11,0x0d,0x0c,0x0c,0x0d,0x11,0x0e,0x12,0x11,0x0e,0x0c,0x11,0x07,0x11, +0x0d,0x11,0x07,0x0d,0x0c,0x0f,0x0b,0x0e,0x0b,0x07,0x07,0x08,0x16,0x16,0x10,0x0d,0x0d,0x10,0x0e,0x0d,0x0d,0x0b,0x10,0x0c,0x14,0x0c,0x11,0x11,0x0d,0x0f,0x14,0x11,0x11,0x11,0x0d,0x0e,0x0c,0x0d,0x11,0x0e,0x11,0x0f,0x16,0x16,0x0f,0x13,0x0d,0x0e,0x17,0x0d,0x0b,0x10,0x10,0x11,0x18,0x18,0x12,0x0e,0x0f,0x0b,0x0f,0x0f,0x0f,0x13, +0x0e,0x0e,0x13,0x10,0x10,0x0a,0x11,0x11,0x0f,0x0d,0x0d,0x18,0x14,0x0d,0x0e,0x10,0x10,0x11,0x11,0x13,0x13,0x0a,0x19,0x10,0x0f,0x0f,0x11,0x11,0x0e,0x0e,0x07,0x14,0x13,0x13,0x0d,0x13,0x06,0x06,0x0c,0x0c,0x06,0x06,0x11,0x0b,0x07,0x14,0x13,0x08,0x06,0x06,0x0c,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x12,0x0d,0x08,0x10,0x13,0x10,0x10, +0x0d,0x14,0x0f,0x10,0x09,0x0c,0x0e,0x0b,0x06,0x06,0x0b,0x0e,0x09,0x12,0x12,0x12,0x19,0x14,0x19,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x14,0x17,0x09,0x09,0x0e,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x0e,0x0e,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x19,0x19,0x0e,0x0e,0x19,0x19,0x0e, +0x0e,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x1b,0x14,0x17,0x0e,0x10,0x10,0x12,0x09,0x12,0x14,0x0e,0x0e,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x19,0x09,0x14,0x0e,0x0e,0x07,0x0e,0x0e,0x0e,0x0e,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09, +0x19,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x20,0x17,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x0e,0x0e,0x14,0x0e,0x0e,0x19,0x0e,0x1d,0x1b,0x19,0x0e,0x17,0x0e,0x17,0x0e,0x17,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19, +0x0e,0x19,0x0e,0x12,0x12,0x12,0x12,0x12,0x09,0x12,0x12,0x09,0x09,0x12,0x09,0x12,0x09,0x12,0x0e,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x0e,0x09,0x09,0x09,0x09,0x00,0x20,0x17,0x24,0x1b,0x19,0x0e,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x0e,0x0e,0x0b,0x20,0x17,0x1b, +0x1b,0x19,0x19,0x19,0x10,0x10,0x10,0x10,0x12,0x09,0x12,0x09,0x12,0x09,0x20,0x17,0x10,0x12,0x10,0x10,0x10,0x12,0x10,0x10,0x20,0x20,0x17,0x17,0x0b,0x0b,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x10,0x10,0x10,0x10,0x19,0x09,0x19,0x09,0x10,0x12,0x10,0x10,0x20,0x20, +0x17,0x17,0x20,0x20,0x17,0x17,0x17,0x17,0x0e,0x0e,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x07,0x07,0x09,0x07,0x00,0x00,0x00,0x17,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x19,0x19,0x19,0x19, +0x19,0x19,0x19,0x19,0x19,0x19,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x14,0x12,0x12,0x12,0x12,0x12,0x12,0x10,0x17,0x10,0x17,0x10,0x17,0x10,0x17,0x12,0x12,0x12,0x07,0x07,0x0e,0x0b,0x10,0x11, +0x0f,0x0f,0x0f,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0c,0x0f,0x0e,0x10,0x10,0x11,0x12,0x10,0x0f,0x12,0x0e,0x12,0x14,0x11,0x14,0x16,0x11,0x15,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0c,0x0f,0x10,0x10,0x12,0x0f,0x11,0x10,0x10,0x10,0x0e,0x0e,0x14,0x12,0x13,0x12,0x12, +0x10,0x10,0x10,0x14,0x15,0x14,0x15,0x19,0x19,0x13,0x19,0x19,0x14,0x18,0x17,0x0f,0x15,0x17,0x15,0x10,0x17,0x14,0x13,0x13,0x10,0x11,0x14,0x15,0x13,0x11,0x13,0x10,0x0e,0x19,0x19,0x19,0x16,0x19,0x19,0x12,0x19,0x19,0x13,0x15,0x15,0x14,0x14,0x14,0x11,0x18,0x15,0x16,0x13,0x13,0x10,0x14,0x13,0x13,0x17,0x14,0x14,0x18,0x0f,0x0e, +0x0f,0x0e,0x11,0x11,0x13,0x14,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x0f,0x0f,0x0f,0x0e,0x0e,0x10,0x11,0x10,0x10,0x0c,0x0f,0x0f,0x10,0x10,0x15,0x17,0x12,0x12,0x11,0x15,0x11,0x12,0x0e,0x0d,0x10,0x0f,0x0d,0x0d,0x0f,0x0f,0x0d,0x0d,0x11,0x0c,0x0f,0x0d,0x0f,0x15,0x0f,0x16,0x0e,0x0f,0x0f,0x14,0x08,0x15,0x13,0x13, +0x12,0x0f,0x14,0x10,0x15,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0d,0x0c,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x11,0x07,0x07,0x07,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x18,0x18,0x18,0x18,0x0d,0x14,0x14,0x0d,0x0b,0x0d,0x0e,0x0f,0x0d, +0x17,0x16,0x17,0x0c,0x1b,0x0d,0x17,0x17,0x17,0x16,0x0f,0x0d,0x0d,0x15,0x10,0x15,0x12,0x0e,0x0c,0x0b,0x1c,0x0b,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x25,0x17,0x17,0x0c,0x07,0x0c,0x06,0x0c,0x06,0x06,0x06,0x0d,0x10,0x10,0x0f,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x06,0x0b,0x17,0x06,0x18,0x18,0x18,0x10,0x10,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x20,0x20,0x12,0x20,0x20,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0d,0x10,0x0d,0x0e,0x0b,0x0a,0x09,0x13,0x0f,0x13,0x0c,0x1e,0x18,0x10,0x0f,0x19,0x15,0x17,0x14,0x1c,0x16, +0x19,0x15,0x11,0x0d,0x14,0x10,0x19,0x14,0x14,0x10,0x14,0x10,0x17,0x12,0x18,0x12,0x1e,0x17,0x14,0x10,0x14,0x10,0x21,0x18,0x15,0x00,0x1b,0x1b,0x1b,0x0d,0x00,0x00,0x10,0x0e,0x13,0x0f,0x0e,0x0b,0x1d,0x18,0x1a,0x17,0x13,0x10,0x13,0x10,0x0e,0x0b,0x14,0x10,0x0e,0x0b,0x16,0x12,0x12,0x0f,0x1a,0x16,0x0f,0x10,0x14,0x14,0x16,0x0c, +0x05,0x0c,0x12,0x0c,0x1b,0x1b,0x07,0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x0b,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, +0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x14, +0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0d,0x12,0x14,0x08,0x06,0x08,0x06,0x13,0x0f,0x14,0x11,0x0f,0x0d,0x0e,0x0d,0x10,0x0f,0x0b,0x0b,0x1e,0x16,0x1f,0x18,0x1b,0x17,0x18,0x12,0x18,0x12,0x18,0x12,0x11,0x0c,0x10,0x0d,0x10,0x0d,0x10, +0x0d,0x0f,0x08,0x0d,0x07,0x14,0x10,0x17,0x12,0x24,0x1b,0x0f,0x10,0x13,0x13,0x16,0x17,0x14,0x10,0x1a,0x15,0x0f,0x0b,0x0f,0x0d,0x11,0x0d,0x19,0x14,0x11,0x0e,0x0f,0x10,0x0f,0x10,0x0d,0x0b,0x0d,0x0a,0x0d,0x0a,0x0e,0x0e,0x08,0x12,0x09,0x1a,0x12,0x09,0x10,0x11,0x0c,0x14,0x0f,0x0a,0x09,0x10,0x10,0x10,0x0d,0x07,0x15,0x10,0x0a, +0x09,0x11,0x0c,0x13,0x0a,0x15,0x10,0x11,0x0c,0x13,0x10,0x10,0x0d,0x14,0x0f,0x10,0x09,0x0e,0x0b,0x14,0x0b,0x0e,0x17,0x0d,0x0f,0x18,0x07,0x1f,0x18,0x18,0x20,0x18,0x19,0x19,0x18,0x18,0x19,0x0e,0x0d,0x11,0x13,0x18,0x13,0x19,0x07,0x0c,0x10,0x17,0x1c,0x13,0x1c,0x11,0x11,0x15,0x13,0x1f,0x19,0x0e,0x19,0x09,0x19,0x09,0x10,0x10, +0x10,0x10,0x17,0x17,0x17,0x17,0x1b,0x0e,0x0e,0x1b,0x14,0x0e,0x0e,0x14,0x12,0x09,0x09,0x12,0x10,0x10,0x10,0x10,0x14,0x09,0x09,0x17,0x14,0x09,0x09,0x17,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a, +0x0e,0x0b,0x0f,0x0e,0x14,0x10,0x10,0x18,0x12,0x14,0x14,0x16,0x16,0x10,0x0d,0x1b,0x16,0x1c,0x17,0x13,0x10,0x08,0x08,0x10,0x11,0x0b,0x10,0x0e,0x10,0x0d,0x14,0x16,0x0b,0x10,0x0c,0x06,0x0a,0x0e,0x0f,0x06,0x06,0x05,0x06,0x0a,0x0a,0x0a,0x0c,0x28,0x36,0x09,0x0b,0x04,0x07,0x0a,0x0c,0x09,0x0d,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x24,0x0f,0x15,0x19,0x18,0x11,0x0c,0x0f,0x13,0x14,0x0d,0x08,0x12,0x0e,0x12,0x0f,0x12,0x0e,0x0f,0x14,0x10,0x10,0x0e,0x14,0x11,0x16,0x0c,0x0e,0x11,0x08,0x10,0x09,0x09,0x07,0x18,0x10,0x0f,0x0e,0x0e,0x10,0x19,0x19,0x19,0x1b,0x1b,0x0f,0x0d,0x08,0x0e,0x0c,0x10,0x0c,0x12,0x07,0x0f, +0x10,0x17,0x17,0x11,0x0f,0x10,0x0f,0x0e,0x0c,0x0e,0x0c,0x0d,0x08,0x09,0x07,0x06,0x0a,0x10,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x00,0x08,0x08,0x08,0x07,0x07,0x2d,0x1b,0x18,0x1c,0x08,0x08,0x09,0x0b,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x19,0x09, +0x09,0x19,0x07,0x0e,0x0e,0x24,0x1b,0x1b,0x24,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x0b,0x0b,0x00,0x00,0x0a,0x14,0x10,0x13,0x10,0x22,0x1c,0x13,0x0f,0x13,0x0f,0x24,0x1b,0x14,0x10,0x0a,0x09,0x11,0x00,0x12,0x0f,0x09,0x08,0x04,0x0d,0x09,0x09,0x07,0x05,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x0e,0x0c,0x10,0x0f,0x0f,0x1a, +0x16,0x16,0x15,0x16,0x19,0x11,0x13,0x10,0x0b,0x19,0x1e,0x0c,0x1f,0x0e,0x17,0x19,0x19,0x19,0x0b,0x14,0x1b,0x14,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x10,0x10,0x10,0x17,0x0e,0x0e,0x19,0x09,0x09,0x19,0x09,0x09,0x19,0x0d,0x0d,0x00,0x0b,0x17,0x09,0x09,0x1b,0x0e,0x0e,0x14,0x0e, +0x0e,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x29,0x29,0x18,0x00,0x00,0x18,0x18,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x11,0x11,0x12,0x18,0x11,0x11,0x16,0x1a,0x12,0x11,0x1d,0x11,0x11,0x19,0x11,0x12,0x15,0x11,0x15,0x17,0x19,0x11,0x15, +0x12,0x13,0x11,0x13,0x11,0x12,0x13,0x11,0x15,0x10,0x12,0x15,0x11,0x11,0x0f,0x15,0x11,0x12,0x12,0x13,0x0c,0x0e,0x11,0x15,0x15,0x0f,0x00,0x00,0x1d,0x3a,0x13,0x00,0x03,0x08,0x08,0x0b,0x11,0x10,0x18,0x17,0x07,0x09,0x09,0x0c,0x14,0x06,0x0c,0x06,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x06,0x14,0x14,0x14, +0x0d,0x1c,0x13,0x11,0x12,0x14,0x0f,0x0e,0x14,0x15,0x08,0x0a,0x11,0x0e,0x1a,0x16,0x16,0x10,0x16,0x11,0x0f,0x0f,0x14,0x12,0x1b,0x11,0x10,0x11,0x09,0x0b,0x09,0x14,0x0c,0x08,0x0f,0x11,0x0d,0x11,0x0f,0x09,0x11,0x10,0x07,0x07,0x0e,0x07,0x19,0x10,0x11,0x11,0x11,0x0a,0x0c,0x0a,0x10,0x0e,0x15,0x0d,0x0e,0x0d,0x09,0x07,0x09,0x14, +0x13,0x13,0x12,0x0f,0x16,0x16,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0f,0x0f,0x0f,0x0f,0x07,0x07,0x07,0x07,0x10,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x0b,0x0b,0x10,0x10,0x0d,0x0c,0x0d,0x10,0x0c,0x1a,0x1a,0x16,0x08,0x0c,0x14,0x19,0x16,0x18,0x14,0x14,0x14,0x10,0x11,0x10,0x12,0x16,0x10,0x0b,0x0c,0x16,0x18,0x11, +0x0d,0x08,0x08,0x14,0x13,0x10,0x14,0x13,0x0f,0x0f,0x15,0x13,0x13,0x16,0x1b,0x1b,0x0f,0x1d,0x0b,0x0b,0x07,0x07,0x14,0x11,0x0e,0x10,0x05,0x10,0x09,0x09,0x10,0x10,0x0b,0x06,0x07,0x0b,0x23,0x13,0x0f,0x13,0x0f,0x0f,0x08,0x08,0x08,0x08,0x16,0x16,0x16,0x14,0x14,0x14,0x07,0x0b,0x0a,0x09,0x09,0x06,0x08,0x06,0x09,0x05,0x0b,0x0e, +0x08,0x0f,0x0c,0x11,0x0d,0x07,0x14,0x10,0x10,0x0e,0x10,0x11,0x14,0x14,0x0a,0x0b,0x0b,0x1b,0x1a,0x1c,0x0e,0x14,0x11,0x08,0x0f,0x0c,0x12,0x0d,0x12,0x0d,0x11,0x0c,0x06,0x13,0x0f,0x13,0x0f,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0e,0x07,0x0e,0x09,0x0e,0x09,0x16,0x10,0x16,0x10,0x16,0x11,0x11,0x0a,0x11,0x0a,0x0f,0x0c,0x0f,0x0a, +0x0f,0x0d,0x14,0x10,0x14,0x10,0x11,0x0d,0x11,0x0d,0x0e,0x16,0x16,0x12,0x11,0x0d,0x11,0x0e,0x14,0x0c,0x0e,0x0b,0x20,0x12,0x0e,0x12,0x07,0x0b,0x17,0x09,0x12,0x0a,0x0a,0x12,0x0a,0x13,0x0f,0x12,0x0d,0x12,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x11,0x14,0x11,0x14,0x11,0x15,0x10,0x15,0x10,0x08,0x07,0x08,0x07,0x08,0x07,0x08, +0x07,0x0a,0x07,0x11,0x0e,0x0e,0x0e,0x07,0x16,0x10,0x16,0x10,0x16,0x11,0x16,0x11,0x11,0x0a,0x0f,0x0c,0x0f,0x0a,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x1b,0x15,0x10,0x0e,0x07,0x13,0x0f,0x19,0x18,0x16,0x11,0x06,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x10,0x0e,0x07,0x0c,0x10,0x11,0x1b,0x1b,0x1b,0x1a,0x0b,0x0b,0x06,0x08,0x08,0x13, +0x11,0x16,0x0b,0x17,0x13,0x18,0x08,0x13,0x11,0x0f,0x11,0x15,0x08,0x11,0x12,0x1a,0x16,0x0f,0x16,0x15,0x10,0x0f,0x0f,0x10,0x11,0x17,0x16,0x08,0x10,0x12,0x0d,0x11,0x08,0x10,0x10,0x0f,0x0d,0x11,0x11,0x08,0x0f,0x0e,0x11,0x0f,0x0d,0x11,0x11,0x0d,0x10,0x10,0x16,0x17,0x08,0x10,0x11,0x10,0x17,0x0f,0x14,0x0e,0x12,0x0f,0x08,0x1c, +0x1d,0x15,0x11,0x10,0x15,0x13,0x11,0x11,0x0e,0x14,0x0f,0x19,0x10,0x16,0x16,0x11,0x14,0x1a,0x15,0x16,0x15,0x10,0x12,0x0f,0x10,0x15,0x11,0x16,0x13,0x1c,0x1c,0x14,0x17,0x11,0x12,0x1e,0x11,0x0f,0x11,0x0f,0x0b,0x10,0x0f,0x16,0x0d,0x11,0x11,0x0e,0x0f,0x14,0x11,0x11,0x11,0x11,0x0d,0x0c,0x0e,0x14,0x0d,0x11,0x10,0x17,0x18,0x11, +0x15,0x0f,0x0d,0x18,0x0f,0x0f,0x11,0x0b,0x0d,0x0c,0x07,0x17,0x17,0x10,0x0e,0x0e,0x11,0x0e,0x0b,0x1d,0x21,0x12,0x0a,0x0b,0x0b,0x0b,0x07,0x0f,0x0c,0x10,0x16,0x11,0x15,0x11,0x09,0x0a,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x09,0x0e,0x09,0x0e,0x09,0x09,0x09,0x0e,0x0e,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13, +0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x08,0x07,0x08,0x07,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x14,0x10,0x14,0x10,0x15,0x11,0x15, +0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0f,0x0a,0x0f,0x0f,0x16,0x11,0x08,0x0a,0x07,0x07,0x0f,0x0c,0x1a,0x17,0x12,0x0f,0x11,0x0e,0x16,0x11,0x10,0x0e,0x10,0x0e,0x12,0x0e,0x13,0x10,0x13,0x10,0x15,0x0f,0x16,0x11,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x09,0x09,0x09,0x09,0x0f, +0x0f,0x13,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x0d,0x14,0x11,0x14,0x11,0x14,0x11,0x14,0x11,0x14,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x09,0x14,0x11,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x08,0x07,0x08,0x07,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x1a, +0x19,0x1a,0x19,0x1a,0x19,0x16,0x10,0x16,0x10,0x16,0x10,0x16,0x10,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x10,0x11,0x10,0x11,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0a,0x0f,0x0a,0x0f,0x0a,0x0f,0x0a,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x12,0x0e,0x12, +0x0e,0x1b,0x15,0x1b,0x15,0x11,0x0d,0x11,0x0d,0x10,0x0e,0x11,0x0d,0x11,0x0d,0x11,0x0d,0x10,0x0a,0x15,0x0e,0x0f,0x07,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x15,0x15,0x15,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x1c,0x1c,0x1c,0x1c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x13,0x18,0x18,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x12,0x12,0x0d,0x0d,0x11, +0x11,0x08,0x08,0x11,0x11,0x10,0x10,0x17,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x15,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x11,0x11,0x10,0x10,0x10,0x10,0x13,0x13,0x12,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x16,0x11,0x11, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x12,0x0e,0x14,0x16,0x11,0x11,0x11,0x0f,0x10,0x0e,0x14,0x12,0x19,0x08,0x08,0x11,0x0e,0x07,0x0e,0x1a,0x16,0x11,0x16,0x1c,0x17,0x11,0x11,0x11,0x0f,0x0c,0x0f,0x09,0x0a,0x0f,0x0a,0x0f,0x16,0x15,0x11,0x0f,0x11,0x0d,0x12, +0x12,0x0d,0x0c,0x10,0x10,0x0b,0x0b,0x10,0x07,0x0b,0x0d,0x08,0x24,0x21,0x1e,0x19,0x15,0x0f,0x1f,0x1c,0x17,0x13,0x0f,0x08,0x07,0x16,0x11,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x13,0x0f,0x13,0x0f,0x19,0x18,0x14,0x11,0x14,0x11,0x11,0x0e,0x16,0x11,0x16,0x11,0x12,0x0d,0x07,0x24,0x21,0x1e,0x14,0x11,0x1d,0x14, +0x16,0x10,0x13,0x0f,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x08,0x07,0x08,0x07,0x16,0x11,0x16,0x11,0x11,0x0a,0x11,0x0a,0x14,0x10,0x14,0x10,0x0f,0x0c,0x15,0x10,0x15,0x11,0x10,0x11,0x0d,0x13,0x0f,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x10,0x0e,0x11,0x0f,0x10,0x10,0x11,0x0f,0x11,0x11,0x11,0x0e,0x0e,0x11,0x11,0x0f,0x12,0x0c,0x0c, +0x0f,0x10,0x08,0x11,0x11,0x0f,0x0e,0x0d,0x10,0x10,0x10,0x08,0x08,0x09,0x08,0x0b,0x07,0x11,0x19,0x19,0x19,0x10,0x10,0x11,0x11,0x14,0x15,0x13,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0c,0x07,0x07,0x08,0x08,0x0a,0x0a,0x11,0x11,0x10,0x0e,0x15,0x0e,0x0c,0x0d,0x0f,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x12,0x0e,0x10,0x0f,0x10, +0x07,0x0e,0x0b,0x11,0x0b,0x0b,0x1b,0x1c,0x1c,0x12,0x0e,0x15,0x17,0x11,0x11,0x0e,0x0e,0x10,0x11,0x10,0x14,0x10,0x13,0x17,0x11,0x14,0x11,0x11,0x0d,0x0e,0x0d,0x11,0x0f,0x12,0x0e,0x1a,0x19,0x12,0x0f,0x12,0x0f,0x12,0x0d,0x11,0x0e,0x13,0x11,0x10,0x0c,0x11,0x11,0x0d,0x07,0x16,0x0e,0x0e,0x19,0x14,0x13,0x11,0x1a,0x15,0x13,0x0e, +0x19,0x14,0x15,0x10,0x1b,0x16,0x10,0x0d,0x17,0x16,0x16,0x11,0x15,0x11,0x15,0x11,0x26,0x20,0x18,0x13,0x21,0x1a,0x19,0x14,0x11,0x0d,0x0f,0x0b,0x0c,0x00,0x00,0x1d,0x1c,0x11,0x0f,0x10,0x11,0x10,0x0f,0x10,0x0d,0x11,0x0e,0x15,0x11,0x18,0x13,0x1d,0x18,0x15,0x10,0x12,0x0d,0x0f,0x0c,0x19,0x14,0x14,0x11,0x18,0x12,0x18,0x12,0x08, +0x19,0x16,0x11,0x0f,0x15,0x11,0x13,0x10,0x13,0x0f,0x13,0x0f,0x19,0x18,0x0f,0x0f,0x15,0x0f,0x15,0x0f,0x19,0x16,0x10,0x0d,0x0f,0x0d,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x12,0x0d,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x13,0x10,0x17,0x15,0x11,0x11,0x19,0x19,0x17,0x15,0x10,0x0e,0x1a,0x17,0x1d,0x19,0x15,0x0f,0x14,0x11,0x11,0x10, +0x10,0x0f,0x11,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x11,0x0a,0x0a,0x05,0x06,0x06,0x06,0x08,0x0c,0x08,0x07,0x0b,0x06,0x06,0x06,0x0a,0x0a,0x06,0x06,0x11,0x11,0x11,0x11,0x0a,0x08,0x08,0x0a,0x09,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x08,0x05,0x07,0x08,0x06, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0c,0x0a,0x07,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10, +0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10, +0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x13,0x09,0x12,0x0a,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x09,0x09,0x0a,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x11, +0x0e,0x13,0x18,0x0e,0x0d,0x10,0x10,0x0c,0x0c,0x07,0x09,0x0e,0x0b,0x14,0x11,0x11,0x0e,0x12,0x12,0x12,0x1b,0x10,0x11,0x11,0x0d,0x0d,0x0d,0x0c,0x0f,0x10,0x15,0x10,0x0e,0x15,0x0d,0x0c,0x0c,0x0f,0x0b,0x0e,0x11,0x0d,0x11,0x10,0x0a,0x0e,0x0a,0x0a,0x0c,0x09,0x09,0x0c,0x0c,0x05,0x07,0x0a,0x08,0x0f,0x0d,0x0d,0x0c,0x0b,0x0a,0x0a, +0x08,0x0c,0x0f,0x09,0x09,0x0a,0x0e,0x0a,0x0a,0x09,0x09,0x08,0x08,0x0a,0x05,0x09,0x0e,0x0a,0x0a,0x08,0x0a,0x0a,0x0a,0x06,0x0a,0x09,0x0e,0x08,0x09,0x0a,0x08,0x0a,0x0c,0x09,0x05,0x06,0x0a,0x08,0x0a,0x08,0x0a,0x0c,0x09,0x11,0x05,0x0a,0x10,0x19,0x12,0x10,0x10,0x19,0x13,0x19,0x16,0x0f,0x11,0x0f,0x0d,0x21,0x0d,0x11,0x1a,0x1b, +0x1b,0x12,0x13,0x12,0x0d,0x0e,0x0f,0x0c,0x0d,0x0f,0x06,0x00,0x00,0x00,0x00,0x11,0x12,0x12,0x12,0x0e,0x0b,0x11,0x11,0x09,0x19,0x10,0x11,0x0a,0x0a,0x0d,0x0a,0x0d,0x11,0x0d,0x11,0x1a,0x13,0x09,0x08,0x11,0x0f,0x11,0x11,0x11,0x09,0x11,0x0e,0x07,0x19,0x10,0x11,0x0a,0x0c,0x0d,0x0e,0x0d,0x0d,0x0f,0x11,0x11,0x0f,0x0d,0x0d,0x15, +0x07,0x0e,0x07,0x10,0x0d,0x0a,0x08,0x08,0x0a,0x08,0x05,0x05,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0b,0x07,0x05,0x06,0x0a,0x0a,0x0a,0x09,0x08,0x08,0x08,0x09,0x08,0x0a,0x00,0x00,0x00,0x00,0x06,0x09,0x09,0x0a,0x08,0x09,0x10,0x10,0x10,0x10,0x0a,0x00,0x00,0x00,0x00,0x0d,0x09,0x08, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x10,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x05,0x0b,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, +0x0b,0x09,0x09,0x0b,0x0a,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x17,0x12,0x15,0x11,0x16,0x12,0x1b,0x16,0x10,0x0b,0x0f,0x14,0x10,0x18,0x14,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18,0x1d,0x0c,0x07,0x0f,0x11,0x0c,0x0f,0x0f,0x11,0x11,0x0f,0x1d, +0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x13,0x0f,0x0f,0x0f,0x0a,0x11,0x0a,0x16,0x13,0x0f,0x0a,0x18,0x0f,0x18,0x07,0x0a,0x11,0x11,0x13,0x13,0x13,0x11,0x11,0x11,0x18,0x07,0x11,0x07,0x0f,0x0c,0x07,0x07,0x0f,0x07,0x16,0x07,0x1b,0x0f,0x1b,0x1b,0x11,0x11,0x11,0x0f,0x0f,0x0c,0x0c,0x22,0x22,0x27,0x27,0x18,0x18,0x0f,0x0f,0x05, +0x1d,0x16,0x18,0x13,0x11,0x13,0x0f,0x0f,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x07,0x13,0x00,0x13,0x13,0x13,0x0a,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x11,0x13,0x11,0x0c,0x1b,0x0f,0x1b,0x0f,0x16,0x18,0x0a,0x0f,0x0f,0x0c,0x07,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x11,0x0f,0x13,0x13,0x1b,0x0a,0x0f,0x0c,0x13,0x0f,0x0a, +0x0f,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x07,0x11,0x0b,0x1d,0x0f,0x0f,0x13,0x13,0x1d,0x0f,0x00,0x00,0x00,0x13,0x00,0x13,0x13,0x13,0x13,0x16,0x13,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0f,0x0f,0x16,0x18,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0f,0x0c,0x0c,0x0c,0x22,0x18,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d,0x18,0x0f,0x11,0x11,0x11,0x1d,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x16,0x16,0x1f,0x1d,0x1b,0x0f,0x18,0x0f,0x18,0x0f,0x18,0x0f,0x1b, +0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x13,0x0a,0x13,0x0a,0x10,0x13,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x18,0x1b,0x16,0x18,0x0a,0x0f,0x16,0x18,0x16,0x18,0x00,0x00,0x00,0x00,0x00,0x21,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x11,0x00, +0x00,0x00,0x22,0x18,0x27,0x1d,0x0f,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x1b,0x1b,0x0b,0x11,0x11,0x11,0x24,0x18,0x0f,0x2c,0x1f,0x0a,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0c,0x0c,0x16,0x13,0x13,0x0f,0x00,0x00,0x00,0x0a,0x0a,0x0a, +0x0a,0x24,0x2c,0x00,0x00,0x00,0x00,0x00,0x11,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x13,0x11,0x0f,0x0f,0x0c,0x22,0x18,0x0f,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1b,0x0f,0x0f,0x1b,0x0f, +0x0f,0x1b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x13,0x0a,0x0a,0x0c,0x0c,0x22,0x18,0x13,0x11,0x11,0x00,0x0f,0x0f,0x0f,0x0b,0x11,0x14,0x12,0x0f,0x0f,0x0a,0x07,0x16,0x11,0x11,0x0a,0x10,0x0e,0x0e,0x0d,0x0e,0x07,0x0f,0x0c,0x12,0x0e,0x11,0x0d,0x10,0x0d,0x14,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x15,0x0d,0x0e,0x0e,0x08,0x0f,0x10,0x11,0x0f,0x0a,0x16,0x11,0x13,0x10,0x12,0x0e,0x11,0x0f,0x0b,0x14,0x0b,0x0c,0x0c,0x0e,0x11,0x11,0x0f,0x1d,0x0f,0x1d,0x0a,0x07,0x05,0x10,0x06,0x04,0x00,0x04,0x06,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x1b,0x0c,0x16,0x11,0x1b,0x15,0x12, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x1b,0x19,0x0e,0x19,0x0e,0x19,0x13,0x14,0x14,0x14,0x16,0x19,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x14,0x15,0x11,0x1f,0x18,0x0e,0x0e,0x08,0x08,0x08,0x0b,0x06,0x10,0x07,0x07,0x18,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00, +0x06,0x00,0x00,0x06,0x00,0x00,0x12,0x11,0x0d,0x0e,0x14,0x08,0x0a,0x14,0x14,0x08,0x10,0x10,0x10,0x14,0x14,0x08,0x0c,0x14,0x12,0x12,0x12,0x10,0x11,0x13,0x10,0x17,0x15,0x0f,0x0f,0x0f,0x07,0x0b,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x0e,0x14,0x10,0x10,0x14,0x10,0x15,0x10,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x11,0x0d,0x0e,0x14, +0x09,0x0a,0x14,0x09,0x10,0x10,0x10,0x14,0x0c,0x14,0x12,0x12,0x11,0x13,0x10,0x17,0x15,0x08,0x11,0x10,0x12,0x13,0x23,0x00,0x12,0x10,0x13,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x08,0x00, +0x16,0x13,0x13,0x14,0x10,0x13,0x16,0x16,0x0e,0x12,0x16,0x15,0x13,0x16,0x18,0x17,0x13,0x10,0x10,0x16,0x14,0x11,0x14,0x14,0x13,0x14,0x14,0x15,0x11,0x12,0x14,0x13,0x16,0x12,0x12,0x13,0x13,0x18,0x0e,0x11,0x11,0x19,0x10,0x10,0x16,0x1a,0x12,0x10,0x1e,0x10,0x10,0x16,0x10,0x10,0x16,0x10,0x16,0x18,0x19,0x10,0x16,0x10,0x13,0x10, +0x12,0x10,0x12,0x10,0x12,0x16,0x10,0x12,0x13,0x10,0x10,0x11,0x1c,0x10,0x10,0x11,0x11,0x0c,0x0a,0x10,0x10,0x10,0x10,0x10,0x1a,0x10,0x1a,0x0e,0x10,0x1a,0x13,0x10,0x1a,0x16,0x16,0x1a,0x11,0x10,0x1a,0x1a,0x10,0x10,0x10,0x10,0x10,0x10,0x1a,0x1a,0x11,0x10,0x10,0x1a,0x11,0x10,0x10,0x10,0x1a,0x17,0x14,0x14,0x14,0x14,0x15,0x12, +0x14,0x17,0x14,0x13,0x10,0x17,0x14,0x14,0x11,0x13,0x14,0x16,0x15,0x11,0x14,0x13,0x15,0x13,0x16,0x14,0x15,0x15,0x14,0x12,0x14,0x14,0x15,0x17,0x13,0x16,0x15,0x03,0x03,0x04,0x06,0x04,0x08,0x0a,0x19,0x10,0x12,0x11,0x10,0x12,0x10,0x10,0x13,0x11,0x10,0x09,0x18,0x11,0x10,0x10,0x10,0x12,0x0f,0x11,0x08,0x11,0x0f,0x10,0x0c,0x19, +0x10,0x10,0x10,0x11,0x18,0x10,0x11,0x0b,0x18,0x11,0x11,0x14,0x14,0x06,0x08,0x21,0x21,0x21,0x21,0x29,0x10,0x10,0x07,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0e,0x0f,0x11,0x0c,0x0c,0x11,0x12,0x07,0x09,0x0e,0x0c,0x16,0x13,0x12,0x0e,0x12,0x0e,0x0c,0x0d,0x11,0x0f,0x17,0x0f,0x0e,0x0e,0x14,0x16,0x0c,0x12,0x0e,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x13,0x12,0x12,0x12,0x12,0x12,0x11, +0x11,0x11,0x11,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x11,0x11,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x0f,0x12,0x12,0x07,0x07,0x07,0x07,0x07,0x10,0x09,0x0e,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0f,0x14,0x12,0x0f,0x0e,0x0b,0x10,0x0c,0x0e,0x12,0x12,0x07,0x0e,0x0f,0x16,0x13,0x0d,0x12,0x12,0x0e,0x0d,0x0d,0x0e,0x12,0x0f,0x13,0x12,0x0f,0x0c,0x12,0x07,0x12,0x0e,0x12,0x07,0x0e,0x0c,0x11,0x0c,0x0f,0x0c,0x07,0x07,0x09,0x18,0x18,0x12,0x0e,0x0e,0x12,0x0f,0x0e,0x0e,0x0c,0x11,0x0c,0x15,0x0d,0x13,0x13, +0x0e,0x10,0x16,0x12,0x12,0x12,0x0e,0x0f,0x0d,0x0e,0x12,0x0f,0x12,0x10,0x17,0x18,0x10,0x14,0x0e,0x0f,0x19,0x0e,0x0c,0x11,0x11,0x12,0x1a,0x1a,0x13,0x0f,0x11,0x0c,0x11,0x10,0x10,0x14,0x0f,0x0f,0x14,0x11,0x11,0x0a,0x12,0x12,0x11,0x0e,0x0e,0x1a,0x16,0x0e,0x0f,0x11,0x11,0x12,0x12,0x15,0x14,0x0a,0x1b,0x11,0x10,0x11,0x13,0x13, +0x0f,0x0f,0x08,0x16,0x14,0x14,0x0e,0x14,0x06,0x06,0x0d,0x0d,0x06,0x06,0x12,0x0c,0x08,0x16,0x14,0x08,0x06,0x06,0x0d,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x14,0x0e,0x09,0x12,0x14,0x11,0x11,0x0e,0x16,0x10,0x11,0x0a,0x0d,0x0f,0x0c,0x06,0x07,0x0b,0x0f,0x0a,0x13,0x13,0x13,0x1b,0x16,0x1b,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x16,0x18, +0x0a,0x0a,0x0f,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x0f,0x0f,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x0f,0x0f,0x1b,0x1b,0x0f,0x0f,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x1d,0x16,0x18,0x0f,0x11,0x11,0x13,0x0a,0x13,0x16,0x0f,0x0f,0x0a,0x0a,0x0a, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1b,0x0a,0x16,0x0f,0x0f,0x07,0x0f,0x0f,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x22,0x18,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d, +0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x16,0x0f,0x0f,0x16,0x0f,0x0f,0x1b,0x0f,0x1f,0x1d,0x1b,0x0f,0x18,0x0f,0x18,0x0f,0x18,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x13,0x13,0x13,0x13,0x13,0x0a,0x13,0x13,0x0a,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0f,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, +0x0f,0x0f,0x0a,0x0a,0x0f,0x0a,0x0a,0x0a,0x0a,0x00,0x22,0x18,0x27,0x1d,0x1b,0x0f,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x0f,0x0f,0x0c,0x22,0x18,0x1d,0x1d,0x1b,0x1b,0x1b,0x11,0x11,0x11,0x11,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x22,0x18,0x11,0x13,0x11,0x11,0x11,0x13,0x11,0x11,0x22,0x22,0x18,0x18, +0x0c,0x0c,0x11,0x11,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x11,0x11,0x11,0x11,0x1b,0x0a,0x1b,0x0a,0x11,0x13,0x11,0x11,0x22,0x22,0x18,0x18,0x22,0x22,0x18,0x18,0x18,0x18,0x0f,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x07,0x07,0x0a,0x07,0x00,0x00,0x00,0x18, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x18,0x11,0x18,0x11,0x18,0x11,0x18,0x13,0x13,0x13,0x07,0x07,0x0f,0x0c,0x11,0x12,0x11,0x10,0x10,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0d,0x10,0x0f,0x11,0x12,0x12,0x13,0x11,0x10,0x13,0x0f, +0x13,0x16,0x13,0x16,0x18,0x12,0x16,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0d,0x10,0x12,0x11,0x13,0x11,0x13,0x11,0x11,0x11,0x0f,0x0f,0x16,0x14,0x14,0x14,0x14,0x11,0x11,0x11,0x15,0x16,0x16,0x16,0x1b,0x1b,0x14,0x1b,0x1b,0x15,0x19,0x19,0x10,0x16,0x19,0x16,0x11,0x19,0x15,0x14,0x14,0x12,0x13,0x16,0x17, +0x14,0x12,0x14,0x11,0x0f,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x14,0x1b,0x1b,0x15,0x16,0x17,0x16,0x15,0x15,0x13,0x1a,0x16,0x18,0x15,0x15,0x11,0x15,0x14,0x14,0x19,0x16,0x15,0x1a,0x10,0x0f,0x10,0x10,0x12,0x12,0x14,0x15,0x11,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x0f,0x0f,0x11,0x12,0x11,0x11,0x0d,0x10,0x10, +0x11,0x12,0x16,0x18,0x13,0x13,0x12,0x16,0x13,0x14,0x0f,0x0e,0x11,0x10,0x0e,0x0e,0x10,0x10,0x0e,0x0d,0x12,0x0d,0x10,0x0e,0x10,0x17,0x10,0x18,0x10,0x10,0x11,0x16,0x09,0x17,0x14,0x15,0x13,0x10,0x16,0x11,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x12,0x12,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0e,0x0d, +0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x12,0x08,0x08,0x08,0x09,0x09,0x08,0x08,0x08,0x09,0x08,0x08,0x08,0x1a,0x1a,0x1a,0x1a,0x0e,0x16,0x15,0x0e,0x0c,0x0e,0x0f,0x10,0x0e,0x18,0x18,0x19,0x0d,0x1d,0x0e,0x18,0x18,0x18,0x17,0x10,0x0e,0x0e,0x17,0x11,0x17,0x14,0x0f,0x0d,0x0c,0x1e,0x0c,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e, +0x28,0x18,0x18,0x0c,0x07,0x0d,0x07,0x0d,0x07,0x07,0x07,0x0e,0x11,0x11,0x10,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x0c,0x19,0x06,0x1a,0x1a,0x1a,0x11,0x11,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x22,0x22,0x13,0x22,0x22,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x0e,0x11,0x0e,0x0f,0x0c,0x0a,0x0a,0x14,0x10,0x15,0x0c,0x21,0x1a,0x11,0x10,0x1b,0x17,0x18,0x16,0x1e,0x18,0x1b,0x16,0x13,0x0e,0x15,0x11,0x1b,0x15,0x16,0x12,0x16,0x11,0x19,0x13,0x19,0x13,0x20,0x18,0x16,0x11,0x16,0x11,0x23,0x1a,0x17,0x00,0x1d,0x1d, +0x1d,0x0e,0x00,0x00,0x11,0x0f,0x14,0x10,0x0f,0x0c,0x1f,0x1a,0x1b,0x19,0x15,0x11,0x14,0x11,0x0f,0x0c,0x15,0x11,0x0f,0x0c,0x18,0x13,0x13,0x10,0x1c,0x18,0x10,0x11,0x15,0x15,0x17,0x0d,0x06,0x0d,0x14,0x0d,0x1d,0x1d,0x07,0x00,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0c,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, +0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0e,0x14, +0x15,0x08,0x06,0x08,0x06,0x15,0x10,0x16,0x12,0x10,0x0e,0x0f,0x0e,0x11,0x11,0x0c,0x0c,0x21,0x18,0x21,0x1a,0x1d,0x19,0x1a,0x13,0x1a,0x13,0x1a,0x13,0x12,0x0d,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x10,0x09,0x0e,0x07,0x16,0x11,0x19,0x14,0x27,0x1d,0x10,0x11,0x14,0x14,0x17,0x19,0x16,0x11,0x1c,0x17,0x10,0x0c,0x10,0x0e,0x12,0x0e,0x1b, +0x15,0x12,0x0f,0x10,0x11,0x10,0x11,0x0e,0x0c,0x0e,0x0b,0x0e,0x0b,0x0f,0x0f,0x09,0x14,0x0a,0x1c,0x13,0x0a,0x11,0x12,0x0d,0x16,0x10,0x0b,0x0a,0x11,0x11,0x11,0x0e,0x07,0x16,0x11,0x0b,0x0a,0x12,0x0d,0x15,0x0b,0x17,0x11,0x12,0x0d,0x14,0x11,0x11,0x0e,0x16,0x10,0x11,0x0a,0x0f,0x0c,0x16,0x0c,0x0f,0x19,0x0e,0x10,0x1a,0x08,0x21, +0x1a,0x1a,0x22,0x1a,0x1b,0x1b,0x19,0x1a,0x1b,0x0f,0x0e,0x12,0x14,0x1a,0x14,0x1b,0x07,0x0d,0x11,0x19,0x1e,0x14,0x1e,0x12,0x12,0x17,0x14,0x21,0x1b,0x0f,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x18,0x18,0x18,0x18,0x1d,0x0f,0x0f,0x1d,0x16,0x0f,0x0f,0x16,0x13,0x0a,0x0a,0x13,0x11,0x11,0x11,0x11,0x16,0x0a,0x0a,0x18,0x16,0x0a, +0x0a,0x18,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0f,0x0b,0x10,0x0f,0x16,0x11,0x11,0x19,0x13,0x16,0x16,0x18,0x18,0x11,0x0e,0x1d,0x17,0x1e,0x19,0x14,0x11,0x09,0x09,0x11,0x13,0x0c,0x11,0x0f, +0x11,0x0e,0x15,0x17,0x0c,0x11,0x0c,0x06,0x0b,0x0f,0x10,0x06,0x06,0x05,0x06,0x0b,0x0b,0x0b,0x0d,0x2b,0x3a,0x0a,0x0c,0x04,0x08,0x0b,0x0c,0x09,0x0e,0x0f,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x27,0x10,0x16,0x1b,0x1a,0x13,0x0d,0x10,0x15,0x15,0x0e,0x09,0x13,0x0f,0x14,0x10,0x13,0x0f,0x10, +0x16,0x11,0x11,0x0f,0x16,0x12,0x18,0x0d,0x0f,0x12,0x09,0x11,0x0a,0x0a,0x07,0x19,0x11,0x10,0x0f,0x0f,0x11,0x1b,0x1b,0x1b,0x1d,0x1d,0x10,0x0e,0x08,0x0f,0x0d,0x12,0x0d,0x13,0x07,0x10,0x11,0x19,0x19,0x12,0x10,0x11,0x10,0x0f,0x0d,0x0f,0x0d,0x0e,0x09,0x0a,0x07,0x06,0x0a,0x11,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x08,0x08,0x08,0x07,0x07,0x31,0x1d,0x19,0x1e,0x08,0x08,0x09,0x0b,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x1b,0x0a,0x0a,0x1b,0x08,0x0f,0x0f,0x27,0x1d,0x1d,0x27,0x1b,0x0f,0x0f,0x1b,0x0f,0x0f,0x0c,0x0c,0x00,0x00,0x0a,0x16,0x11,0x15,0x11,0x24,0x1e,0x14,0x10, +0x14,0x10,0x27,0x1d,0x16,0x11,0x0b,0x09,0x12,0x00,0x14,0x10,0x0a,0x09,0x05,0x0e,0x0a,0x0a,0x07,0x06,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x0f,0x0c,0x11,0x11,0x10,0x1c,0x17,0x17,0x17,0x18,0x1b,0x12,0x14,0x11,0x0b,0x1b,0x21,0x0d,0x21,0x0f,0x18,0x1b,0x1b,0x1b,0x0c,0x16,0x1d,0x16,0x13,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x11,0x11,0x11,0x18,0x0f,0x0f,0x1b,0x0a,0x0a,0x1b,0x0a,0x0a,0x1b,0x0e,0x0e,0x00,0x0c,0x18,0x0a,0x0a,0x1d,0x0f,0x0f,0x16,0x0f,0x0f,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x2c,0x2c,0x1a,0x00,0x00,0x1a,0x1a,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x12,0x13,0x13,0x1a,0x13,0x12,0x17,0x1c,0x13,0x12,0x1f,0x12,0x12,0x1b,0x12,0x14,0x17,0x13,0x16,0x19,0x1a,0x13,0x16,0x13,0x14,0x12,0x14,0x12,0x13,0x14,0x12,0x17,0x11,0x13,0x17,0x12,0x12,0x11,0x17,0x13,0x13,0x13,0x14,0x0d,0x0f,0x13,0x17,0x17,0x10,0x00,0x00, +0x20,0x40,0x15,0x00,0x03,0x09,0x09,0x0d,0x13,0x11,0x1a,0x1a,0x07,0x0a,0x0a,0x0d,0x16,0x07,0x0d,0x07,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x16,0x16,0x16,0x0e,0x1f,0x15,0x12,0x14,0x16,0x10,0x10,0x16,0x17,0x09,0x0b,0x13,0x0f,0x1d,0x18,0x18,0x12,0x18,0x13,0x11,0x11,0x16,0x14,0x1e,0x13,0x12,0x12, +0x0a,0x0c,0x0a,0x16,0x0d,0x09,0x10,0x13,0x0f,0x13,0x11,0x0a,0x13,0x12,0x08,0x08,0x10,0x08,0x1c,0x12,0x13,0x13,0x13,0x0b,0x0e,0x0b,0x12,0x0f,0x17,0x0f,0x0f,0x0e,0x0a,0x08,0x0a,0x16,0x15,0x15,0x14,0x10,0x18,0x18,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x11,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x12,0x13,0x13,0x13,0x13,0x13, +0x12,0x12,0x12,0x12,0x0c,0x0c,0x11,0x11,0x0e,0x0d,0x0f,0x11,0x0d,0x1c,0x1c,0x19,0x09,0x0d,0x16,0x1c,0x18,0x1a,0x16,0x16,0x16,0x11,0x12,0x11,0x14,0x18,0x11,0x0d,0x0e,0x18,0x1b,0x13,0x0e,0x09,0x09,0x16,0x15,0x11,0x16,0x15,0x10,0x10,0x17,0x15,0x15,0x18,0x1e,0x1e,0x10,0x20,0x0c,0x0c,0x07,0x07,0x16,0x13,0x0f,0x12,0x06,0x11, +0x0a,0x0a,0x12,0x12,0x0c,0x07,0x07,0x0c,0x27,0x15,0x10,0x15,0x10,0x10,0x09,0x09,0x09,0x09,0x18,0x18,0x18,0x16,0x16,0x16,0x08,0x0c,0x0b,0x0a,0x0a,0x06,0x09,0x07,0x0a,0x06,0x0c,0x0f,0x09,0x11,0x0e,0x12,0x0e,0x08,0x16,0x12,0x12,0x0f,0x12,0x13,0x16,0x16,0x0b,0x0c,0x0c,0x1e,0x1d,0x1e,0x10,0x16,0x13,0x09,0x11,0x0e,0x14,0x0f, +0x14,0x0f,0x13,0x0d,0x07,0x15,0x10,0x15,0x10,0x16,0x16,0x16,0x10,0x11,0x10,0x11,0x0f,0x08,0x0f,0x0a,0x0f,0x0a,0x18,0x12,0x18,0x12,0x18,0x13,0x13,0x0b,0x13,0x0b,0x11,0x0e,0x11,0x0b,0x11,0x0e,0x16,0x12,0x16,0x12,0x12,0x0e,0x12,0x0e,0x0f,0x18,0x18,0x14,0x13,0x0e,0x12,0x10,0x16,0x0d,0x0f,0x0d,0x24,0x14,0x10,0x13,0x07,0x0c, +0x1a,0x0a,0x13,0x0b,0x0b,0x13,0x0b,0x15,0x10,0x14,0x0f,0x14,0x0f,0x10,0x11,0x10,0x11,0x10,0x11,0x16,0x13,0x16,0x13,0x16,0x13,0x17,0x12,0x17,0x12,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x0b,0x08,0x13,0x10,0x10,0x0f,0x08,0x18,0x12,0x18,0x12,0x18,0x13,0x18,0x13,0x13,0x0b,0x11,0x0e,0x11,0x0b,0x16,0x12,0x16,0x12,0x16,0x12, +0x16,0x12,0x1e,0x17,0x12,0x0f,0x08,0x15,0x10,0x1c,0x1b,0x18,0x13,0x07,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x12,0x0f,0x07,0x0d,0x11,0x13,0x1e,0x1e,0x1e,0x1d,0x0c,0x0c,0x07,0x09,0x09,0x15,0x12,0x19,0x0c,0x1a,0x15,0x1a,0x09,0x15,0x12,0x10,0x12,0x17,0x09,0x13,0x14,0x1d,0x18,0x10,0x18,0x17,0x12,0x11,0x11,0x12,0x13,0x19,0x18,0x09, +0x12,0x14,0x0e,0x12,0x09,0x12,0x12,0x11,0x0e,0x12,0x13,0x09,0x11,0x10,0x12,0x11,0x0e,0x13,0x13,0x0f,0x12,0x11,0x18,0x1a,0x09,0x12,0x13,0x12,0x1a,0x10,0x16,0x0f,0x14,0x11,0x09,0x1f,0x1f,0x17,0x13,0x12,0x17,0x15,0x12,0x12,0x0f,0x16,0x10,0x1c,0x11,0x18,0x18,0x13,0x16,0x1d,0x17,0x18,0x17,0x12,0x14,0x11,0x12,0x17,0x13,0x18, +0x15,0x1e,0x1f,0x17,0x19,0x12,0x14,0x21,0x13,0x10,0x13,0x11,0x0c,0x12,0x11,0x18,0x0e,0x13,0x13,0x10,0x11,0x16,0x12,0x13,0x12,0x13,0x0f,0x0d,0x0f,0x16,0x0f,0x13,0x12,0x1a,0x1a,0x13,0x17,0x10,0x0f,0x1a,0x10,0x11,0x12,0x0c,0x0f,0x0e,0x08,0x19,0x1a,0x12,0x10,0x0f,0x12,0x0f,0x0d,0x20,0x24,0x14,0x0b,0x0c,0x0c,0x0c,0x08,0x11, +0x0e,0x12,0x18,0x13,0x17,0x13,0x0a,0x0b,0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0f,0x0a,0x0f,0x0a,0x0a,0x0a,0x0f,0x0f,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10, +0x11,0x09,0x08,0x09,0x08,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x16,0x12,0x16,0x12,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x12,0x0f,0x12,0x0f,0x12,0x0f,0x11,0x0b,0x10,0x11,0x18,0x13,0x09,0x0b,0x08,0x08,0x10,0x0d,0x1d,0x19,0x14, +0x11,0x13,0x10,0x18,0x13,0x12,0x0f,0x12,0x0f,0x14,0x10,0x15,0x12,0x15,0x12,0x17,0x11,0x18,0x13,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x15,0x10,0x12,0x13,0x12,0x13,0x12,0x13,0x14,0x0f,0x16,0x13,0x16,0x13,0x16,0x13,0x16,0x13,0x16,0x13,0x10,0x11,0x10,0x11,0x10,0x11,0x10, +0x11,0x10,0x11,0x10,0x0a,0x16,0x13,0x17,0x12,0x17,0x12,0x17,0x12,0x17,0x12,0x17,0x12,0x09,0x08,0x09,0x08,0x13,0x10,0x13,0x10,0x13,0x10,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x1d,0x1c,0x1d,0x1c,0x1d,0x1c,0x18,0x12,0x18,0x12,0x18,0x12,0x18,0x12,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x12,0x13,0x12,0x13,0x13,0x0b,0x13, +0x0b,0x13,0x0b,0x13,0x0b,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x14,0x0f,0x14,0x0f,0x1e,0x17,0x1e,0x17,0x13,0x0f,0x13,0x0f,0x12,0x0f,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0b,0x17,0x0f,0x10,0x08,0x14,0x14,0x14,0x14,0x14, +0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x10,0x10,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1f, +0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x14,0x14,0x0e,0x0e,0x12,0x12,0x09,0x09,0x13,0x13,0x12,0x12,0x1a,0x1a,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x17,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x09,0x0c,0x0c,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x13,0x13,0x12,0x12,0x12,0x12,0x15,0x15,0x14,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1a,0x18,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x14,0x12,0x13,0x12,0x13,0x14,0x14,0x0f,0x16,0x18,0x12,0x13,0x13, +0x10,0x11,0x10,0x16,0x14,0x1c,0x09,0x09,0x13,0x10,0x08,0x10,0x1d,0x18,0x12,0x18,0x1f,0x19,0x13,0x13,0x12,0x11,0x0e,0x11,0x09,0x0b,0x11,0x0b,0x11,0x18,0x17,0x12,0x11,0x12,0x0e,0x14,0x14,0x0e,0x0d,0x11,0x11,0x0c,0x0d,0x11,0x08,0x0c,0x0f,0x09,0x28,0x24,0x21,0x1b,0x17,0x10,0x22,0x1f,0x1a,0x15,0x10,0x09,0x08,0x18,0x13,0x16, +0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x11,0x15,0x10,0x15,0x10,0x1c,0x1b,0x16,0x13,0x16,0x13,0x13,0x10,0x18,0x13,0x18,0x13,0x14,0x0e,0x08,0x28,0x24,0x21,0x16,0x13,0x20,0x16,0x18,0x12,0x15,0x10,0x15,0x10,0x10,0x11,0x10,0x11,0x09,0x08,0x09,0x08,0x18,0x13,0x18,0x13,0x12,0x0b,0x13,0x0b,0x16,0x12,0x16,0x12,0x10,0x0e, +0x17,0x12,0x17,0x13,0x12,0x12,0x0e,0x15,0x10,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x12,0x0f,0x13,0x10,0x12,0x12,0x13,0x10,0x13,0x13,0x13,0x0f,0x0f,0x13,0x13,0x11,0x14,0x0d,0x0d,0x10,0x12,0x09,0x13,0x13,0x11,0x0f,0x0f,0x12,0x12,0x12,0x08,0x09,0x0a,0x09,0x0c,0x08,0x13,0x1c,0x1c,0x1c,0x12,0x12,0x13,0x13,0x16,0x17,0x14, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0d,0x08,0x08,0x09,0x09,0x0b,0x0b,0x13,0x13,0x12,0x0f,0x17,0x0f,0x0d,0x0e,0x10,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x14,0x0f,0x12,0x11,0x12,0x08,0x10,0x0c,0x13,0x0c,0x0c,0x1d,0x1e,0x1f,0x14,0x0f,0x17,0x19,0x13,0x12,0x10,0x10,0x12,0x13,0x12,0x16,0x12,0x14,0x1a,0x12,0x16,0x13,0x13, +0x0f,0x10,0x0e,0x13,0x10,0x14,0x10,0x1d,0x1c,0x13,0x10,0x14,0x11,0x14,0x0f,0x13,0x10,0x15,0x13,0x12,0x0d,0x12,0x13,0x0f,0x08,0x18,0x0f,0x0f,0x1c,0x16,0x15,0x13,0x1d,0x17,0x15,0x10,0x1c,0x16,0x17,0x12,0x1e,0x18,0x11,0x0e,0x19,0x18,0x18,0x13,0x17,0x13,0x17,0x13,0x2a,0x24,0x1a,0x15,0x24,0x1d,0x1c,0x16,0x13,0x0e,0x10,0x0d, +0x0d,0x00,0x00,0x20,0x1e,0x12,0x10,0x12,0x13,0x12,0x10,0x11,0x0f,0x13,0x10,0x17,0x13,0x1b,0x15,0x20,0x1b,0x17,0x12,0x14,0x0f,0x11,0x0d,0x1c,0x16,0x16,0x13,0x1b,0x14,0x1b,0x14,0x09,0x1c,0x18,0x13,0x10,0x17,0x12,0x15,0x12,0x15,0x10,0x15,0x10,0x1c,0x1b,0x10,0x11,0x17,0x11,0x17,0x11,0x1c,0x18,0x11,0x0e,0x11,0x0e,0x18,0x13, +0x18,0x13,0x18,0x13,0x18,0x13,0x14,0x0f,0x12,0x0f,0x12,0x0f,0x12,0x0f,0x15,0x12,0x19,0x17,0x12,0x13,0x1b,0x1c,0x1a,0x17,0x12,0x0f,0x1d,0x19,0x20,0x1b,0x17,0x11,0x16,0x13,0x13,0x12,0x12,0x10,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x13,0x0b,0x0b,0x05,0x07,0x07,0x07,0x09,0x0d, +0x09,0x07,0x0c,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x13,0x13,0x13,0x13,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x09,0x05,0x08,0x09,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0d,0x0b,0x08,0x08,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c, +0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11, +0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00, +0x15,0x0a,0x14,0x0b,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0a,0x0a,0x0b,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x13,0x0f,0x15,0x1b,0x0f,0x0f,0x12,0x12,0x0d,0x0d,0x08,0x0a,0x10,0x0d,0x16,0x13,0x13,0x0f,0x14,0x14,0x14,0x1e,0x11,0x13,0x13,0x0f,0x0f,0x0f,0x0d, +0x11,0x12,0x17,0x12,0x0f,0x17,0x0e,0x0d,0x0d,0x11,0x0c,0x0f,0x12,0x0f,0x13,0x12,0x0c,0x10,0x0b,0x0b,0x0d,0x0a,0x0a,0x0d,0x0e,0x06,0x07,0x0b,0x09,0x11,0x0e,0x0e,0x0e,0x0c,0x0b,0x0b,0x09,0x0d,0x11,0x0a,0x0a,0x0b,0x0f,0x0b,0x0b,0x0a,0x0a,0x08,0x08,0x0b,0x05,0x0a,0x10,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x06,0x0b,0x0a,0x10,0x09, +0x0a,0x0b,0x09,0x0b,0x0d,0x0a,0x05,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x0d,0x0a,0x13,0x05,0x0b,0x11,0x1c,0x14,0x11,0x11,0x1c,0x15,0x1b,0x18,0x11,0x13,0x10,0x0e,0x24,0x0f,0x13,0x1c,0x1e,0x1e,0x14,0x15,0x14,0x0f,0x0f,0x11,0x0e,0x0e,0x10,0x06,0x00,0x00,0x00,0x00,0x13,0x14,0x14,0x14,0x0f,0x0c,0x13,0x13,0x0a,0x1c,0x12,0x13,0x0b, +0x0b,0x0f,0x0b,0x0e,0x13,0x0f,0x12,0x1d,0x15,0x0a,0x09,0x13,0x11,0x13,0x13,0x13,0x0a,0x13,0x10,0x08,0x1c,0x12,0x13,0x0b,0x0e,0x0e,0x0f,0x0f,0x0e,0x10,0x13,0x13,0x11,0x0e,0x0e,0x18,0x08,0x0f,0x08,0x12,0x0e,0x0b,0x09,0x09,0x0b,0x08,0x06,0x05,0x0b,0x0b,0x05,0x06,0x06,0x06,0x05,0x06,0x05,0x07,0x10,0x10,0x0b,0x0b,0x0b,0x0b, +0x0c,0x07,0x05,0x06,0x0b,0x0b,0x0b,0x0a,0x09,0x08,0x08,0x09,0x08,0x0b,0x00,0x00,0x00,0x00,0x07,0x0a,0x0a,0x0b,0x09,0x0a,0x11,0x11,0x11,0x11,0x0b,0x00,0x00,0x00,0x00,0x0f,0x0a,0x09,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09, +0x12,0x12,0x12,0x12,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x06,0x0c,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0b,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x19,0x14,0x17,0x12,0x18,0x14,0x1e,0x18,0x11,0x0c, +0x10,0x16,0x11,0x1a,0x16,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x1b,0x1b,0x20,0x0d,0x08,0x10,0x13,0x0d,0x10,0x10,0x13,0x13,0x10,0x20,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x15,0x10,0x10,0x10,0x0b,0x13,0x0b,0x18,0x15,0x10,0x0b,0x1b,0x10,0x1b,0x08,0x0b,0x13,0x13,0x15,0x15, +0x15,0x13,0x13,0x13,0x1b,0x08,0x13,0x08,0x10,0x0d,0x08,0x08,0x10,0x08,0x18,0x08,0x1d,0x10,0x1d,0x1d,0x13,0x13,0x13,0x10,0x10,0x0d,0x0d,0x25,0x25,0x2b,0x2b,0x1b,0x1b,0x10,0x10,0x05,0x20,0x18,0x1b,0x15,0x13,0x15,0x10,0x10,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x08,0x15,0x00,0x15,0x15,0x15,0x0b,0x10,0x10, +0x1d,0x0b,0x1d,0x0b,0x13,0x15,0x13,0x0d,0x1d,0x10,0x1d,0x10,0x18,0x1b,0x0b,0x10,0x10,0x0d,0x08,0x10,0x13,0x10,0x13,0x10,0x13,0x13,0x10,0x15,0x15,0x1d,0x0b,0x10,0x0d,0x15,0x10,0x0b,0x10,0x10,0x10,0x1d,0x0b,0x1d,0x0b,0x08,0x13,0x0c,0x20,0x10,0x10,0x15,0x15,0x20,0x10,0x00,0x00,0x00,0x15,0x00,0x15,0x15,0x15,0x15,0x18,0x15, +0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x10,0x10,0x18,0x1b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x15,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x10,0x0d,0x0d,0x0d,0x25,0x1b,0x25,0x1b,0x25, +0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x10,0x13,0x13,0x13,0x20,0x20,0x10,0x10,0x20,0x10,0x10,0x20,0x10,0x10,0x20,0x10,0x10,0x18,0x18,0x23,0x20,0x1d,0x10,0x1b,0x10,0x1b,0x10,0x1b,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x15,0x0b,0x15,0x0b,0x11,0x15,0x13,0x10, +0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1b,0x1d,0x18,0x1b,0x0b,0x10,0x18,0x1b,0x18,0x1b,0x00,0x00,0x00,0x00,0x00,0x24,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0d,0x00,0x00,0x13,0x00,0x00,0x00,0x25,0x1b,0x2b,0x20,0x10,0x13,0x13,0x13,0x0d,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10, +0x1d,0x1d,0x0c,0x13,0x13,0x13,0x27,0x1b,0x11,0x31,0x23,0x0b,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x0d,0x0d,0x18,0x15,0x15,0x10,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x13,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0d,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b, +0x1d,0x0b,0x13,0x13,0x13,0x13,0x15,0x13,0x10,0x10,0x0d,0x25,0x1b,0x10,0x13,0x13,0x13,0x10,0x13,0x13,0x13,0x10,0x13,0x13,0x13,0x20,0x10,0x10,0x20,0x10,0x10,0x1d,0x10,0x10,0x1d,0x10,0x10,0x1d,0x10,0x10,0x13,0x13,0x13,0x13,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x15,0x0b,0x0b,0x0d,0x0d,0x25,0x1b,0x15,0x13,0x13,0x00,0x10,0x10, +0x10,0x0c,0x12,0x16,0x14,0x10,0x11,0x0b,0x08,0x18,0x13,0x13,0x0b,0x12,0x0f,0x0f,0x0f,0x0f,0x08,0x10,0x0d,0x14,0x10,0x13,0x0f,0x11,0x0e,0x16,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0e,0x0f,0x0f,0x09,0x10,0x12,0x13,0x10,0x0b,0x18,0x13,0x14,0x11,0x14,0x10,0x12,0x10,0x0d,0x16,0x0c,0x0d,0x0d,0x0f,0x13,0x13, +0x10,0x20,0x10,0x20,0x0b,0x08,0x05,0x11,0x07,0x04,0x00,0x04,0x07,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x1e,0x0e,0x18,0x13,0x1e,0x17,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x1e,0x1c,0x0f,0x1c,0x0f,0x1c,0x15,0x16,0x16,0x16,0x18,0x1c,0x20,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, +0x1c,0x16,0x16,0x16,0x16,0x18,0x13,0x22,0x1a,0x0f,0x0f,0x09,0x09,0x09,0x0c,0x07,0x12,0x07,0x07,0x1b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x14,0x12,0x0e,0x0f,0x16,0x09,0x0b,0x16,0x16,0x09,0x12,0x11,0x12,0x16,0x16,0x09,0x0d,0x16,0x13,0x14,0x14,0x12, +0x13,0x15,0x12,0x19,0x17,0x11,0x11,0x11,0x07,0x0c,0x12,0x12,0x12,0x12,0x11,0x13,0x14,0x0f,0x16,0x11,0x12,0x16,0x12,0x17,0x12,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x12,0x0e,0x0f,0x16,0x0a,0x0b,0x16,0x0a,0x12,0x11,0x12,0x16,0x0d,0x16,0x14,0x14,0x13,0x15,0x12,0x19,0x17,0x09,0x12,0x11,0x14,0x15,0x26,0x00,0x14,0x12,0x15,0x15, +0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x18,0x15,0x15,0x17,0x12,0x15,0x18,0x18,0x0f,0x14,0x18,0x18,0x15,0x18,0x1a,0x19,0x15,0x12,0x12,0x18,0x17,0x12,0x16,0x16,0x15,0x16,0x16,0x18, +0x12,0x14,0x16,0x15,0x19,0x14,0x14,0x15,0x15,0x1a,0x10,0x13,0x13,0x1c,0x11,0x11,0x19,0x1d,0x14,0x11,0x22,0x12,0x12,0x18,0x11,0x11,0x18,0x12,0x18,0x1a,0x1c,0x11,0x19,0x11,0x15,0x11,0x14,0x12,0x14,0x11,0x13,0x19,0x11,0x14,0x15,0x11,0x11,0x13,0x1f,0x11,0x11,0x13,0x13,0x0e,0x0b,0x12,0x12,0x12,0x11,0x12,0x1c,0x12,0x1c,0x10, +0x12,0x1c,0x15,0x12,0x1c,0x18,0x18,0x1c,0x12,0x12,0x1c,0x1c,0x12,0x12,0x12,0x12,0x12,0x12,0x1c,0x1c,0x13,0x12,0x12,0x1c,0x13,0x11,0x12,0x12,0x1c,0x19,0x16,0x16,0x16,0x16,0x17,0x14,0x16,0x19,0x16,0x15,0x11,0x19,0x16,0x16,0x12,0x15,0x16,0x18,0x17,0x13,0x16,0x15,0x17,0x15,0x19,0x16,0x17,0x17,0x16,0x14,0x16,0x16,0x17,0x19, +0x15,0x18,0x17,0x03,0x04,0x05,0x06,0x05,0x09,0x0b,0x1c,0x12,0x14,0x13,0x12,0x14,0x12,0x12,0x15,0x13,0x12,0x0a,0x1b,0x13,0x12,0x12,0x11,0x13,0x10,0x13,0x09,0x13,0x11,0x12,0x0d,0x1c,0x12,0x12,0x12,0x13,0x1b,0x12,0x13,0x0d,0x1b,0x13,0x13,0x16,0x16,0x07,0x09,0x24,0x24,0x24,0x24,0x2e,0x11,0x11,0x08,0x11,0x0c,0x11,0x11,0x12, +0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x12,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x13,0x0e,0x0d,0x12,0x14,0x08,0x0a,0x10,0x0d,0x18,0x15,0x14,0x10,0x14,0x10,0x0d, +0x0e,0x13,0x10,0x1a,0x10,0x0f,0x0f,0x16,0x19,0x0d,0x14,0x10,0x13,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x15,0x14,0x14,0x14,0x14,0x14,0x13,0x13,0x13,0x13,0x0f,0x10,0x10,0x10,0x10,0x10,0x12,0x13,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x10,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x12, +0x0a,0x10,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x14,0x14,0x14,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x16,0x14,0x10,0x10,0x0d,0x11,0x0e,0x0f,0x14,0x14,0x08,0x10,0x10,0x18,0x15,0x0e,0x14,0x14,0x10,0x0f,0x0e,0x0f,0x14, +0x10,0x15,0x14,0x10,0x0e,0x14,0x08,0x14,0x0f,0x14,0x08,0x0f,0x0e,0x12,0x0d,0x10,0x0d,0x08,0x08,0x0a,0x1a,0x1a,0x14,0x10,0x10,0x13,0x10,0x10,0x10,0x0d,0x13,0x0e,0x18,0x0e,0x15,0x15,0x10,0x12,0x18,0x14,0x14,0x14,0x10,0x10,0x0e,0x10,0x14,0x10,0x14,0x12,0x1a,0x1b,0x12,0x17,0x10,0x10,0x1c,0x10,0x0d,0x13,0x13,0x14,0x1c,0x1c, +0x15,0x10,0x12,0x0d,0x12,0x12,0x12,0x16,0x11,0x11,0x16,0x13,0x13,0x0b,0x14,0x14,0x12,0x10,0x10,0x1d,0x18,0x0f,0x11,0x13,0x13,0x14,0x14,0x17,0x16,0x0b,0x1e,0x13,0x12,0x12,0x15,0x15,0x10,0x10,0x09,0x18,0x16,0x16,0x0f,0x16,0x07,0x07,0x0e,0x0e,0x07,0x07,0x14,0x0d,0x09,0x18,0x17,0x09,0x07,0x07,0x0e,0x0c,0x0c,0x07,0x07,0x07, +0x0c,0x16,0x0f,0x0a,0x13,0x16,0x13,0x13,0x10,0x18,0x12,0x13,0x0b,0x0e,0x11,0x0e,0x07,0x07,0x0c,0x11,0x0b,0x15,0x15,0x15,0x1d,0x18,0x1d,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x1b,0x0b,0x0b,0x10,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x10,0x10,0x25,0x1b,0x25,0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1d,0x1d,0x10,0x10,0x1d,0x1d,0x10,0x10,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x20,0x18,0x1b,0x10,0x13,0x13,0x15,0x0b,0x15,0x18,0x10,0x10,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1d,0x0b,0x18,0x10,0x10,0x08,0x10,0x10,0x10,0x10,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b, +0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x25,0x1b,0x25,0x1b,0x25,0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x18,0x10,0x10,0x18,0x10,0x10,0x1d,0x10,0x23,0x20,0x1d,0x10,0x1b,0x10,0x1b,0x10,0x1b,0x10,0x1d, +0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x15,0x15,0x15,0x15,0x15,0x0b,0x15,0x15,0x0b,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x10,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x0b,0x10,0x0b,0x0b,0x0b,0x0b,0x00,0x25,0x1b,0x2b,0x20,0x1d,0x10,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b, +0x13,0x13,0x10,0x10,0x0d,0x25,0x1b,0x20,0x20,0x1d,0x1d,0x1d,0x13,0x13,0x13,0x13,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x25,0x1b,0x13,0x15,0x13,0x13,0x13,0x15,0x13,0x13,0x25,0x25,0x1b,0x1b,0x0d,0x0d,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x1d,0x0b, +0x1d,0x0b,0x13,0x15,0x13,0x13,0x25,0x25,0x1b,0x1b,0x25,0x25,0x1b,0x1b,0x1b,0x1b,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x08,0x08,0x0b,0x08,0x00,0x00,0x00,0x1b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x1b,0x13,0x1b,0x13,0x1b,0x13,0x1b,0x15, +0x15,0x15,0x08,0x08,0x10,0x0d,0x13,0x14,0x12,0x11,0x12,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x12,0x11,0x13,0x14,0x14,0x15,0x13,0x12,0x15,0x10,0x15,0x18,0x14,0x18,0x1b,0x14,0x18,0x16,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x0f,0x11,0x13,0x13,0x15,0x12,0x15,0x12,0x13, +0x13,0x10,0x10,0x18,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x18,0x19,0x18,0x18,0x1e,0x1e,0x16,0x1e,0x1e,0x17,0x1c,0x1b,0x12,0x19,0x1b,0x18,0x13,0x1b,0x18,0x16,0x16,0x13,0x15,0x18,0x19,0x16,0x14,0x17,0x13,0x11,0x1e,0x1d,0x1d,0x1a,0x1e,0x1e,0x16,0x1e,0x1e,0x17,0x19,0x19,0x18,0x17,0x17,0x15,0x1c,0x18,0x1a,0x17,0x17,0x13,0x18, +0x16,0x16,0x1b,0x18,0x17,0x1d,0x11,0x10,0x12,0x11,0x14,0x14,0x16,0x17,0x13,0x12,0x12,0x11,0x12,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x10,0x11,0x13,0x14,0x13,0x13,0x0f,0x12,0x12,0x13,0x13,0x18,0x1b,0x15,0x15,0x14,0x19,0x14,0x16,0x10,0x0f,0x13,0x12,0x0f,0x10,0x12,0x12,0x0f,0x0f,0x14,0x0f,0x11,0x10,0x12,0x19,0x12,0x1a, +0x11,0x12,0x12,0x18,0x0a,0x19,0x16,0x17,0x15,0x12,0x18,0x13,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0f,0x0e,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x14,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x1d,0x1d,0x1d,0x1d,0x10, +0x18,0x17,0x10,0x0d,0x10,0x11,0x12,0x10,0x1b,0x1a,0x1c,0x0e,0x20,0x10,0x1b,0x1b,0x1b,0x1a,0x12,0x10,0x10,0x19,0x13,0x19,0x16,0x11,0x0f,0x0d,0x21,0x0d,0x11,0x10,0x10,0x10,0x10,0x10,0x2c,0x1b,0x1b,0x0e,0x08,0x0f,0x08,0x0f,0x08,0x08,0x08,0x0f,0x13,0x13,0x11,0x0c,0x0c,0x07,0x07,0x07,0x0c,0x07,0x0d,0x1c,0x07,0x1d,0x1d,0x1d, +0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x15,0x25,0x25,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0f,0x13,0x0f,0x11,0x0e,0x0b,0x0b,0x16,0x12,0x17,0x0e,0x24,0x1d, +0x13,0x12,0x1d,0x19,0x1b,0x18,0x21,0x1a,0x1e,0x19,0x15,0x0f,0x17,0x13,0x1e,0x17,0x18,0x13,0x18,0x13,0x1c,0x15,0x1c,0x15,0x23,0x1b,0x18,0x13,0x18,0x13,0x27,0x1c,0x19,0x00,0x20,0x20,0x20,0x0f,0x00,0x00,0x13,0x10,0x16,0x12,0x11,0x0e,0x22,0x1d,0x1e,0x1c,0x17,0x13,0x16,0x13,0x11,0x0d,0x18,0x13,0x11,0x0d,0x1a,0x15,0x15,0x12, +0x1f,0x1a,0x11,0x12,0x17,0x17,0x1a,0x0e,0x06,0x0f,0x16,0x0e,0x20,0x20,0x08,0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0d,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13,0x13, +0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x11,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0f,0x16,0x17,0x09,0x07,0x09,0x07,0x17,0x12,0x18,0x14,0x12,0x0f,0x11,0x0f,0x13,0x12,0x0d,0x0d,0x24,0x1a,0x25,0x1c,0x20,0x1b,0x1d,0x15,0x1d,0x15,0x1d, +0x15,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x11,0x0a,0x0f,0x08,0x18,0x13,0x1b,0x16,0x2b,0x20,0x12,0x13,0x16,0x17,0x1a,0x1c,0x18,0x13,0x1f,0x19,0x11,0x0d,0x12,0x10,0x14,0x0f,0x1e,0x17,0x14,0x11,0x12,0x13,0x12,0x13,0x0f,0x0d,0x0f,0x0c,0x0f,0x0c,0x11,0x11,0x0a,0x16,0x0a,0x1f,0x15,0x0b,0x13,0x14,0x0f,0x18,0x12,0x0c,0x0b, +0x13,0x13,0x12,0x0f,0x08,0x18,0x13,0x0c,0x0b,0x14,0x0f,0x17,0x0c,0x19,0x13,0x14,0x0f,0x16,0x13,0x13,0x10,0x18,0x12,0x13,0x0b,0x11,0x0e,0x18,0x0e,0x11,0x1c,0x10,0x12,0x1d,0x09,0x25,0x1d,0x1d,0x26,0x1c,0x1d,0x1d,0x1c,0x1c,0x1e,0x11,0x0f,0x14,0x16,0x1d,0x16,0x1e,0x08,0x0f,0x13,0x1c,0x21,0x16,0x21,0x14,0x14,0x19,0x16,0x24, +0x1e,0x11,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x20,0x10,0x10,0x20,0x18,0x10,0x10,0x18,0x15,0x0b,0x0b,0x15,0x13,0x13,0x13,0x13,0x18,0x0b,0x0b,0x1b,0x18,0x0b,0x0b,0x1b,0x0d,0x0d,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x10,0x0d,0x12,0x11,0x18,0x13,0x13,0x1c,0x15,0x18,0x18,0x1b,0x1a,0x13,0x10,0x20,0x1a,0x21,0x1b,0x16,0x13,0x0a,0x0a,0x13,0x15,0x0d,0x13,0x11,0x13,0x0f,0x18,0x1a,0x0d,0x13,0x0e,0x07,0x0c,0x11,0x12,0x07,0x07,0x06,0x07,0x0c,0x0c,0x0c,0x0e,0x30,0x40,0x0b,0x0d,0x04,0x09,0x0c,0x0e,0x0a, +0x10,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x2b,0x11,0x18,0x1d,0x1d,0x15,0x0f,0x12,0x17,0x18,0x10,0x0a,0x15,0x11,0x16,0x12,0x15,0x11,0x11,0x18,0x13,0x13,0x11,0x18,0x14,0x1b,0x0f,0x11,0x14,0x0a,0x13,0x0b,0x0b,0x08,0x1c,0x13,0x12,0x11,0x11,0x13,0x1e,0x1e,0x1e,0x20,0x20,0x12,0x10, +0x09,0x10,0x0f,0x13,0x0f,0x15,0x08,0x12,0x13,0x1c,0x1c,0x14,0x11,0x12,0x11,0x11,0x0f,0x11,0x0f,0x0f,0x0a,0x0b,0x08,0x07,0x0c,0x13,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x00,0x09,0x09,0x09,0x08,0x08,0x36,0x20,0x1c,0x22,0x09,0x09,0x0a,0x0d,0x08,0x09,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x09,0x09,0x09,0x00,0x1d,0x0b,0x0b,0x1d,0x08,0x10,0x10,0x2b,0x20,0x20,0x2b,0x1d,0x10,0x10,0x1d,0x10,0x10,0x0d,0x0d,0x00,0x00,0x0b,0x18,0x13,0x17,0x12,0x28,0x21,0x16,0x12,0x16,0x12,0x2b,0x20,0x18,0x13,0x0c,0x0a,0x14,0x00,0x16,0x11,0x0b,0x0a,0x05,0x10,0x0b,0x0b,0x08,0x06,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x07,0x11,0x0e,0x13,0x12,0x12,0x1f,0x1a,0x1a,0x19,0x1a,0x1e,0x14,0x16,0x13,0x0d,0x1e,0x24,0x0e,0x25,0x10,0x1b,0x1d,0x1d,0x1d,0x0d,0x18,0x20,0x18,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x13,0x13,0x13,0x1b,0x10,0x10,0x1d,0x0b,0x0b,0x1d,0x0b,0x0b,0x1d,0x10,0x10,0x00,0x0d, +0x1b,0x0b,0x0b,0x20,0x10,0x10,0x18,0x10,0x10,0x15,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x30,0x30,0x1c,0x00,0x00,0x1c,0x1c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x14,0x15,0x15,0x1c,0x15,0x14,0x1a,0x1f,0x15,0x14,0x22,0x14,0x14,0x1e,0x14, +0x16,0x19,0x14,0x19,0x1b,0x1d,0x14,0x19,0x15,0x16,0x14,0x16,0x14,0x15,0x16,0x14,0x19,0x13,0x15,0x19,0x14,0x14,0x12,0x19,0x15,0x15,0x15,0x16,0x0e,0x11,0x15,0x19,0x19,0x11,0x00,0x00,0x21,0x42,0x15,0x00,0x03,0x09,0x09,0x0d,0x14,0x12,0x1b,0x1a,0x08,0x0a,0x0a,0x0e,0x17,0x07,0x0d,0x07,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x07,0x07,0x17,0x17,0x17,0x0f,0x20,0x15,0x13,0x14,0x17,0x11,0x10,0x17,0x17,0x09,0x0c,0x13,0x10,0x1e,0x19,0x19,0x12,0x19,0x14,0x12,0x11,0x17,0x15,0x1f,0x13,0x12,0x13,0x0a,0x0d,0x0a,0x17,0x0e,0x09,0x11,0x13,0x0f,0x13,0x11,0x0a,0x13,0x13,0x08,0x08,0x10,0x08,0x1c,0x13,0x13,0x13,0x13,0x0b,0x0e,0x0b,0x13,0x10, +0x18,0x0f,0x10,0x0f,0x0a,0x08,0x0a,0x17,0x15,0x15,0x14,0x11,0x19,0x19,0x17,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0c,0x0c,0x12,0x12,0x0f,0x0d,0x0f,0x12,0x0d,0x1d,0x1d,0x1a,0x09,0x0e,0x17,0x1c,0x19,0x1b,0x17,0x17,0x17,0x12,0x13,0x12, +0x14,0x19,0x12,0x0d,0x0e,0x19,0x1b,0x13,0x0f,0x09,0x09,0x17,0x15,0x12,0x17,0x15,0x11,0x11,0x18,0x15,0x15,0x19,0x1f,0x1f,0x11,0x21,0x0c,0x0c,0x08,0x08,0x17,0x13,0x10,0x12,0x06,0x12,0x0a,0x0a,0x12,0x12,0x0c,0x07,0x08,0x0c,0x28,0x15,0x11,0x15,0x11,0x11,0x09,0x09,0x09,0x09,0x19,0x19,0x19,0x17,0x17,0x17,0x08,0x0c,0x0b,0x0a, +0x0a,0x07,0x09,0x07,0x0b,0x06,0x0c,0x10,0x09,0x12,0x0e,0x13,0x0f,0x08,0x17,0x12,0x12,0x10,0x12,0x13,0x17,0x17,0x0c,0x0c,0x0c,0x1f,0x1e,0x1f,0x10,0x17,0x13,0x09,0x12,0x0e,0x14,0x0f,0x14,0x0f,0x13,0x0e,0x07,0x15,0x11,0x15,0x11,0x17,0x16,0x17,0x11,0x11,0x11,0x11,0x10,0x08,0x10,0x0a,0x10,0x0a,0x19,0x13,0x19,0x13,0x19,0x13, +0x14,0x0b,0x14,0x0b,0x12,0x0e,0x11,0x0b,0x11,0x0f,0x17,0x13,0x17,0x13,0x13,0x0f,0x13,0x0f,0x10,0x19,0x19,0x14,0x13,0x0e,0x13,0x10,0x17,0x0e,0x10,0x0d,0x25,0x15,0x10,0x14,0x08,0x0c,0x1b,0x0b,0x14,0x0c,0x0c,0x14,0x0c,0x15,0x11,0x14,0x0f,0x14,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17, +0x13,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x0c,0x08,0x13,0x10,0x10,0x10,0x08,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x14,0x0b,0x12,0x0e,0x11,0x0b,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x1f,0x18,0x12,0x10,0x08,0x15,0x11,0x1c,0x1b,0x19,0x13,0x07,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x12,0x10,0x08,0x0e,0x12,0x14,0x1e,0x1e, +0x1f,0x1d,0x0d,0x0d,0x07,0x09,0x09,0x15,0x13,0x1a,0x0c,0x1a,0x16,0x1b,0x09,0x15,0x13,0x11,0x13,0x17,0x09,0x13,0x15,0x1e,0x19,0x11,0x19,0x18,0x12,0x11,0x11,0x12,0x13,0x1a,0x19,0x09,0x12,0x14,0x0e,0x13,0x09,0x12,0x12,0x11,0x0f,0x13,0x13,0x09,0x11,0x10,0x13,0x11,0x0f,0x13,0x13,0x0f,0x12,0x12,0x19,0x1b,0x09,0x12,0x13,0x12, +0x1b,0x11,0x17,0x10,0x14,0x12,0x09,0x20,0x20,0x18,0x13,0x13,0x17,0x15,0x13,0x13,0x10,0x17,0x11,0x1d,0x12,0x19,0x19,0x13,0x16,0x1e,0x17,0x19,0x18,0x12,0x14,0x11,0x13,0x18,0x13,0x19,0x16,0x1f,0x20,0x17,0x1a,0x13,0x14,0x22,0x14,0x11,0x13,0x11,0x0d,0x12,0x11,0x19,0x0f,0x13,0x13,0x10,0x11,0x17,0x13,0x13,0x13,0x13,0x0f,0x0e, +0x10,0x17,0x0f,0x14,0x13,0x1a,0x1b,0x14,0x17,0x11,0x0f,0x1b,0x11,0x11,0x13,0x0d,0x0f,0x0e,0x08,0x1a,0x1b,0x13,0x10,0x10,0x13,0x0f,0x0d,0x21,0x25,0x15,0x0c,0x0c,0x0c,0x0c,0x08,0x12,0x0e,0x12,0x19,0x14,0x17,0x13,0x0a,0x0b,0x09,0x09,0x10,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x0a,0x10,0x0a,0x0a,0x0a,0x10,0x10,0x15,0x11,0x15, +0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x08,0x09,0x08,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x14,0x19,0x14,0x19,0x14,0x19,0x14,0x19, +0x14,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x12,0x10,0x12,0x10,0x12,0x10,0x11,0x0b,0x11,0x11,0x19,0x13,0x09,0x0c,0x08,0x08,0x11,0x0e,0x1e,0x1a,0x14,0x12,0x13,0x10,0x19,0x14,0x12,0x10,0x12,0x10,0x15,0x10,0x16,0x13,0x16,0x13,0x18,0x11,0x19,0x13,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x10,0x10,0x10, +0x10,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x11,0x11,0x15,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x0f,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x0a,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x09,0x08,0x09,0x08,0x13,0x10,0x13,0x10,0x13,0x10,0x10, +0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x1e,0x1c,0x1e,0x1c,0x1e,0x1c,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x12,0x13,0x12,0x13,0x14,0x0b,0x14,0x0b,0x14,0x0b,0x14,0x0b,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x17,0x13,0x17,0x13,0x17, +0x13,0x17,0x13,0x17,0x13,0x15,0x10,0x15,0x10,0x1f,0x18,0x1f,0x18,0x13,0x0f,0x13,0x0f,0x12,0x10,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0b,0x18,0x10,0x11,0x08,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13, +0x13,0x13,0x13,0x1a,0x1a,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x10,0x10,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20, +0x20,0x20,0x20,0x14,0x14,0x0e,0x0e,0x13,0x13,0x09,0x09,0x13,0x13,0x12,0x12,0x1b,0x1b,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20, +0x20,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x17,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x13,0x13,0x12,0x12,0x12,0x12,0x16,0x16,0x15,0x13,0x13,0x13,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1c,0x1b,0x19,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x14,0x13,0x13,0x13,0x13,0x14,0x14,0x0f,0x17,0x18,0x13,0x13,0x14,0x11,0x12,0x10,0x17,0x15,0x1d,0x0a,0x09,0x13,0x10,0x08,0x10,0x1d,0x19,0x13,0x19,0x20,0x1a,0x14,0x13,0x13,0x12,0x0e,0x11,0x0a,0x0b,0x11,0x0b, +0x11,0x19,0x18,0x13,0x11,0x13,0x0f,0x14,0x14,0x0f,0x0e,0x12,0x12,0x0d,0x0d,0x12,0x08,0x0d,0x0f,0x09,0x29,0x26,0x22,0x1c,0x18,0x11,0x23,0x20,0x1b,0x15,0x11,0x09,0x08,0x19,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x11,0x15,0x11,0x15,0x11,0x1c,0x1b,0x17,0x13,0x17,0x13,0x13,0x10,0x19,0x13,0x19,0x13,0x14,0x0f, +0x08,0x29,0x26,0x22,0x17,0x13,0x21,0x17,0x19,0x13,0x15,0x11,0x15,0x11,0x11,0x11,0x11,0x11,0x09,0x08,0x09,0x08,0x19,0x13,0x19,0x13,0x13,0x0b,0x14,0x0b,0x17,0x13,0x17,0x13,0x11,0x0e,0x17,0x13,0x18,0x13,0x13,0x13,0x0f,0x15,0x11,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x12,0x10,0x13,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13, +0x0f,0x0f,0x13,0x13,0x11,0x14,0x0e,0x0e,0x11,0x12,0x09,0x13,0x13,0x11,0x10,0x0f,0x13,0x13,0x13,0x09,0x09,0x0b,0x09,0x0c,0x08,0x14,0x1c,0x1c,0x1c,0x12,0x12,0x13,0x13,0x17,0x18,0x15,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0d,0x08,0x09,0x0a,0x09,0x0b,0x0b,0x14,0x14,0x12,0x10,0x18,0x10,0x0e,0x0f,0x11,0x0f,0x0f,0x0c, +0x0c,0x0c,0x0f,0x14,0x10,0x12,0x11,0x13,0x08,0x10,0x0d,0x13,0x0c,0x0c,0x1e,0x1f,0x20,0x14,0x10,0x18,0x1a,0x13,0x13,0x10,0x10,0x12,0x14,0x13,0x16,0x13,0x15,0x1a,0x13,0x17,0x13,0x13,0x0f,0x10,0x0f,0x14,0x11,0x14,0x10,0x1d,0x1c,0x14,0x11,0x15,0x12,0x14,0x0f,0x14,0x10,0x16,0x13,0x13,0x0d,0x13,0x13,0x0f,0x08,0x19,0x0f,0x0f, +0x1c,0x16,0x15,0x13,0x1e,0x18,0x16,0x10,0x1d,0x17,0x18,0x13,0x1f,0x19,0x12,0x0f,0x1a,0x19,0x19,0x13,0x18,0x13,0x18,0x13,0x2b,0x25,0x1b,0x15,0x25,0x1e,0x1c,0x16,0x13,0x0e,0x11,0x0d,0x0e,0x00,0x00,0x21,0x1f,0x13,0x11,0x13,0x13,0x13,0x11,0x12,0x0f,0x13,0x10,0x17,0x13,0x1c,0x16,0x21,0x1c,0x18,0x12,0x14,0x0f,0x11,0x0e,0x1d, +0x17,0x17,0x13,0x1c,0x15,0x1c,0x15,0x09,0x1d,0x19,0x13,0x11,0x17,0x13,0x16,0x13,0x15,0x11,0x15,0x11,0x1c,0x1b,0x11,0x11,0x18,0x11,0x18,0x11,0x1d,0x19,0x12,0x0f,0x11,0x0f,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x16,0x13,0x1a,0x17,0x13,0x13,0x1c,0x1c,0x1b,0x18,0x12,0x10,0x1e,0x1a, +0x21,0x1c,0x18,0x12,0x16,0x14,0x13,0x13,0x13,0x11,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x13,0x0b,0x0b,0x05,0x07,0x07,0x07,0x09,0x0d,0x09,0x08,0x0c,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x13,0x13,0x13,0x13,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b, +0x0a,0x0b,0x0b,0x0a,0x05,0x08,0x09,0x07,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x0b,0x08,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d, +0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x15,0x0a,0x15,0x0b,0x14,0x14,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x13,0x0f,0x16,0x1b,0x10,0x0f,0x12,0x12,0x0e,0x0e,0x08,0x0a,0x10,0x0d,0x17,0x13,0x13,0x10,0x14,0x14,0x14,0x1f,0x12,0x14,0x14,0x0f,0x0f,0x0f,0x0e,0x12,0x13,0x18,0x13,0x10,0x18,0x0f,0x0e,0x0e,0x11,0x0d,0x0f,0x13,0x0f,0x14,0x13,0x0c,0x10,0x0b,0x0c,0x0e,0x0a,0x0a,0x0e,0x0e,0x06,0x08,0x0c, +0x09,0x11,0x0e,0x0e,0x0e,0x0d,0x0b,0x0b,0x0a,0x0e,0x11,0x0a,0x0a,0x0b,0x10,0x0b,0x0b,0x0a,0x0a,0x09,0x09,0x0b,0x05,0x0a,0x10,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x07,0x0b,0x0b,0x10,0x09,0x0b,0x0b,0x0a,0x0b,0x0d,0x0a,0x05,0x07,0x0b,0x09,0x0b,0x0a,0x0b,0x0d,0x0a,0x13,0x05,0x0b,0x12,0x1d,0x15,0x12,0x12,0x1c,0x15,0x1c,0x19,0x11, +0x13,0x11,0x0f,0x25,0x0f,0x13,0x1d,0x1f,0x1f,0x15,0x15,0x14,0x0f,0x10,0x11,0x0e,0x0f,0x11,0x07,0x00,0x00,0x00,0x00,0x13,0x14,0x14,0x14,0x10,0x0d,0x13,0x13,0x0a,0x1c,0x13,0x13,0x0b,0x0b,0x0f,0x0b,0x0f,0x13,0x0f,0x13,0x1e,0x15,0x0b,0x09,0x13,0x12,0x14,0x13,0x13,0x0a,0x13,0x10,0x08,0x1c,0x13,0x13,0x0b,0x0e,0x0e,0x10,0x0f, +0x0f,0x11,0x13,0x13,0x11,0x0e,0x0f,0x18,0x08,0x0f,0x08,0x13,0x0f,0x0b,0x09,0x09,0x0b,0x09,0x06,0x05,0x0b,0x0b,0x05,0x06,0x06,0x06,0x05,0x06,0x05,0x07,0x10,0x10,0x0b,0x0b,0x0c,0x0b,0x0c,0x08,0x05,0x07,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0a,0x09,0x0b,0x00,0x00,0x00,0x00,0x07,0x0a,0x0a,0x0b,0x09,0x0a,0x12,0x12,0x12,0x12, +0x0b,0x00,0x00,0x00,0x00,0x0f,0x0a,0x09,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x06,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x1a,0x15,0x17,0x13,0x19,0x15,0x1f,0x19,0x12,0x0c,0x11,0x17,0x12,0x1b,0x17,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x1c,0x1c,0x21,0x0e,0x08,0x11, +0x13,0x0e,0x11,0x11,0x13,0x13,0x11,0x21,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x15,0x11,0x11,0x11,0x0b,0x13,0x0b,0x19,0x16,0x11,0x0b,0x1c,0x11,0x1c,0x08,0x0b,0x13,0x13,0x15,0x15,0x15,0x13,0x13,0x13,0x1c,0x08,0x13,0x08,0x11,0x0e,0x08,0x08,0x11,0x08,0x19,0x08,0x1e,0x11,0x1e,0x1e,0x13,0x13,0x13,0x11,0x11,0x0e,0x0e,0x27, +0x27,0x2c,0x2c,0x1c,0x1c,0x11,0x11,0x06,0x21,0x19,0x1c,0x16,0x13,0x16,0x11,0x11,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x08,0x15,0x00,0x15,0x15,0x15,0x0b,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x13,0x16,0x13,0x0e,0x1e,0x11,0x1e,0x11,0x19,0x1c,0x0b,0x11,0x11,0x0e,0x08,0x11,0x13,0x11,0x13,0x11,0x13,0x13,0x11,0x16, +0x15,0x1e,0x0b,0x11,0x0e,0x16,0x11,0x0b,0x11,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x08,0x13,0x0d,0x21,0x11,0x11,0x15,0x15,0x21,0x11,0x00,0x00,0x00,0x15,0x00,0x15,0x15,0x15,0x15,0x19,0x15,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0e,0x0e,0x11,0x11,0x19,0x1c,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13, +0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x11,0x0e,0x0e,0x0e,0x27,0x1c,0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x11,0x13,0x13,0x13,0x21,0x21,0x11,0x11,0x21,0x11,0x11,0x21,0x11,0x11,0x21,0x11,0x11,0x19,0x19,0x24,0x21,0x1e, +0x11,0x1c,0x11,0x1c,0x11,0x1c,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x16,0x0b,0x16,0x0b,0x12,0x16,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1c,0x1e,0x19,0x1c,0x0b,0x11,0x19,0x1c,0x19,0x1c,0x00,0x00,0x00,0x00,0x00,0x25,0x24,0x00,0x00,0x00,0x00, +0x00,0x00,0x08,0x0e,0x00,0x00,0x14,0x00,0x00,0x00,0x27,0x1c,0x2c,0x21,0x11,0x13,0x13,0x13,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x1e,0x1e,0x0c,0x13,0x13,0x14,0x28,0x1b,0x12,0x32,0x24,0x0b,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x0e,0x19,0x16, +0x16,0x11,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x29,0x32,0x00,0x00,0x00,0x00,0x00,0x13,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x0e,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x16,0x13,0x11,0x11,0x0e,0x27,0x1c,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x21,0x11,0x11, +0x21,0x11,0x11,0x1e,0x11,0x11,0x1e,0x11,0x11,0x1e,0x11,0x11,0x13,0x13,0x13,0x13,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x16,0x0b,0x0b,0x0e,0x0e,0x27,0x1c,0x15,0x13,0x13,0x00,0x11,0x11,0x11,0x0c,0x13,0x17,0x15,0x11,0x11,0x0c,0x08,0x19,0x13,0x14,0x0b,0x12,0x10,0x10,0x0f,0x10,0x08,0x11,0x0e,0x14,0x10,0x13,0x0f,0x12,0x0e,0x16, +0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0f,0x10,0x10,0x09,0x11,0x12,0x14,0x11,0x0b,0x19,0x13,0x15,0x12,0x14,0x10,0x13,0x11,0x0d,0x17,0x0c,0x0e,0x0e,0x10,0x14,0x14,0x11,0x21,0x11,0x21,0x0b,0x08,0x06,0x12,0x07,0x04,0x00,0x05,0x07,0x00,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11, +0x11,0x1f,0x0e,0x19,0x13,0x1f,0x18,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x1e,0x1c,0x10,0x1c,0x10,0x1c,0x15,0x17,0x17,0x17,0x19,0x1c,0x21,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x17,0x17,0x17,0x17,0x18,0x13,0x23,0x1b,0x10,0x10,0x09,0x09,0x09,0x0c,0x07,0x13,0x08,0x08,0x1c,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x15,0x13,0x0e,0x10,0x16,0x09,0x0b,0x16,0x16,0x09,0x12,0x12,0x12,0x17,0x16,0x09,0x0d,0x16,0x14,0x14,0x15,0x13,0x13,0x16,0x12,0x1a,0x18,0x11,0x11,0x11,0x08,0x0c,0x12,0x12,0x12,0x12,0x12,0x14,0x15,0x10,0x16,0x12,0x12,0x17,0x12,0x18,0x12,0x1a,0x1a,0x1a, +0x1a,0x15,0x15,0x15,0x13,0x0e,0x10,0x16,0x0a,0x0c,0x16,0x0a,0x12,0x12,0x12,0x16,0x0d,0x16,0x14,0x15,0x13,0x16,0x12,0x1a,0x18,0x09,0x13,0x12,0x15,0x16,0x28,0x00,0x15,0x12,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x19,0x15,0x16,0x17,0x12,0x16,0x19,0x19,0x10,0x15,0x19,0x18,0x16,0x19,0x1b,0x1a,0x16,0x12,0x12,0x19,0x17,0x13,0x17,0x16,0x16,0x16,0x17,0x18,0x13,0x15,0x16,0x16,0x1a,0x15,0x14,0x15,0x16,0x1b,0x10,0x13,0x13,0x1d,0x12,0x12,0x19,0x1d,0x14,0x12,0x23,0x13,0x13,0x19,0x12,0x12,0x19,0x13, +0x19,0x1b,0x1d,0x12,0x19,0x12,0x16,0x12,0x14,0x13,0x15,0x12,0x14,0x19,0x12,0x14,0x16,0x12,0x12,0x14,0x20,0x12,0x12,0x13,0x13,0x0e,0x0b,0x12,0x12,0x12,0x12,0x12,0x1d,0x12,0x1d,0x10,0x12,0x1d,0x16,0x12,0x1d,0x19,0x19,0x1d,0x13,0x12,0x1d,0x1d,0x12,0x12,0x12,0x12,0x12,0x12,0x1d,0x1d,0x13,0x12,0x13,0x1d,0x14,0x12,0x12,0x12, +0x1d,0x1a,0x17,0x17,0x17,0x17,0x17,0x15,0x17,0x1a,0x17,0x15,0x12,0x1a,0x16,0x17,0x13,0x16,0x17,0x19,0x18,0x13,0x17,0x16,0x18,0x16,0x1a,0x17,0x18,0x18,0x17,0x15,0x17,0x16,0x18,0x1a,0x16,0x19,0x18,0x03,0x04,0x05,0x06,0x05,0x09,0x0c,0x1c,0x13,0x14,0x14,0x13,0x14,0x13,0x13,0x15,0x14,0x13,0x0a,0x1c,0x13,0x13,0x13,0x12,0x14, +0x11,0x13,0x09,0x13,0x11,0x13,0x0e,0x1c,0x12,0x13,0x13,0x14,0x1b,0x13,0x13,0x0d,0x1b,0x13,0x13,0x17,0x16,0x07,0x09,0x25,0x25,0x25,0x25,0x2f,0x12,0x12,0x08,0x12,0x0d,0x12,0x12,0x13,0x12,0x12,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x13,0x12,0x12,0x11,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x10,0x11,0x13,0x0e,0x0e,0x13,0x14,0x08,0x0a,0x10,0x0e,0x19,0x15,0x14,0x10,0x14,0x10,0x0e,0x0f,0x14,0x11,0x1a,0x11,0x0f,0x10,0x17,0x1a,0x0e,0x15,0x10,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08, +0x08,0x15,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x11,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x11,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x13,0x0a,0x10,0x0e,0x0e,0x0e,0x0e,0x15,0x15,0x15,0x16,0x14,0x14,0x14,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x14,0x14,0x14,0x14, +0x14,0x14,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x11,0x17,0x15,0x11,0x10,0x0d,0x12,0x0e,0x10,0x14,0x14,0x08,0x10,0x11,0x19,0x15,0x0f,0x14,0x14,0x10,0x0f,0x0f,0x0f,0x15,0x11,0x16,0x15,0x11,0x0e,0x14,0x08,0x14,0x0f,0x15,0x08,0x0f,0x0e,0x13,0x0d,0x11,0x0e,0x08,0x08,0x0a,0x1b,0x1b,0x14,0x10,0x10,0x14,0x11,0x10, +0x10,0x0d,0x13,0x0e,0x18,0x0f,0x15,0x15,0x10,0x13,0x19,0x14,0x14,0x14,0x10,0x11,0x0f,0x10,0x15,0x11,0x15,0x12,0x1b,0x1b,0x13,0x17,0x10,0x11,0x1c,0x10,0x0d,0x13,0x13,0x15,0x1d,0x1d,0x16,0x11,0x13,0x0e,0x13,0x12,0x12,0x17,0x11,0x11,0x17,0x13,0x13,0x0c,0x14,0x14,0x13,0x10,0x10,0x1e,0x19,0x10,0x12,0x14,0x14,0x15,0x15,0x17, +0x17,0x0c,0x1f,0x13,0x12,0x13,0x15,0x15,0x11,0x11,0x09,0x19,0x17,0x17,0x10,0x17,0x07,0x07,0x0e,0x0e,0x07,0x07,0x14,0x0d,0x09,0x19,0x17,0x09,0x07,0x07,0x0f,0x0c,0x0c,0x08,0x08,0x08,0x0c,0x16,0x10,0x0a,0x14,0x17,0x13,0x13,0x10,0x19,0x13,0x14,0x0b,0x0f,0x12,0x0e,0x07,0x08,0x0d,0x11,0x0b,0x16,0x16,0x16,0x1e,0x19,0x1e,0x08, +0x00,0x00,0x00,0x00,0x00,0x08,0x19,0x1c,0x0b,0x0b,0x11,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x11,0x11,0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x11,0x11,0x1e,0x1e,0x11,0x11,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x21,0x19,0x1c,0x11,0x13,0x13,0x16, +0x0b,0x16,0x19,0x11,0x11,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1e,0x0b,0x19,0x11,0x11,0x08,0x11,0x11,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x27,0x1c, +0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x1c,0x1c,0x21,0x21,0x21,0x21,0x21,0x21,0x19,0x11,0x11,0x19,0x11,0x11,0x1e,0x11,0x24,0x21,0x1e,0x11,0x1c,0x11,0x1c,0x11,0x1c,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x16,0x16,0x16,0x16,0x16,0x0b,0x16,0x16,0x0b,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x11,0x13, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x0b,0x11,0x0b,0x0b,0x0b,0x0b,0x00,0x27,0x1c,0x2c,0x21,0x1e,0x11,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x11,0x11,0x0e,0x27,0x1c,0x21,0x21,0x1e,0x1e,0x1e,0x13,0x13,0x13,0x13,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x27,0x1c,0x13,0x16,0x13,0x13, +0x13,0x16,0x13,0x13,0x27,0x27,0x1c,0x1c,0x0e,0x0e,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x13,0x13,0x13,0x13,0x1e,0x0b,0x1e,0x0b,0x13,0x16,0x13,0x13,0x27,0x27,0x1c,0x1c,0x27,0x27,0x1c,0x1c,0x1c,0x1c,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, +0x08,0x08,0x0b,0x08,0x00,0x00,0x00,0x1c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0e,0x0e, +0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x1c,0x13,0x1c,0x13,0x1c,0x13,0x1c,0x16,0x16,0x16,0x08,0x08,0x11,0x0e,0x13,0x15,0x13,0x12,0x12,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x0f,0x12,0x11, +0x13,0x14,0x14,0x16,0x13,0x13,0x15,0x11,0x16,0x19,0x15,0x19,0x1b,0x15,0x19,0x17,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x0f,0x12,0x14,0x14,0x16,0x13,0x15,0x13,0x14,0x14,0x11,0x11,0x19,0x16,0x17,0x16,0x16,0x14,0x13,0x13,0x18,0x19,0x19,0x19,0x1e,0x1e,0x17,0x1e,0x1e,0x18,0x1d,0x1c,0x12,0x19,0x1c,0x19,0x14, +0x1c,0x18,0x17,0x17,0x14,0x15,0x19,0x1a,0x17,0x14,0x17,0x13,0x12,0x1e,0x1e,0x1e,0x1b,0x1e,0x1e,0x17,0x1e,0x1e,0x17,0x19,0x1a,0x19,0x18,0x18,0x15,0x1d,0x19,0x1b,0x18,0x18,0x13,0x18,0x17,0x17,0x1c,0x19,0x18,0x1e,0x12,0x11,0x12,0x12,0x14,0x15,0x17,0x18,0x13,0x13,0x13,0x12,0x13,0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x11, +0x11,0x13,0x14,0x14,0x14,0x0f,0x13,0x13,0x13,0x14,0x19,0x1c,0x16,0x16,0x15,0x19,0x15,0x17,0x11,0x10,0x13,0x13,0x10,0x10,0x12,0x12,0x10,0x0f,0x15,0x0f,0x12,0x10,0x12,0x1a,0x13,0x1b,0x12,0x13,0x13,0x19,0x0a,0x1a,0x17,0x18,0x16,0x13,0x19,0x14,0x1a,0x14,0x14,0x14,0x14,0x14,0x14,0x13,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09, +0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x15,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x1e,0x1e,0x1e,0x1e,0x10,0x18,0x18,0x10,0x0d,0x10,0x11,0x12,0x10,0x1c,0x1b,0x1c,0x0f,0x21,0x10,0x1c,0x1c,0x1c,0x1b,0x13,0x10,0x10,0x1a,0x13,0x1a,0x16,0x12,0x0f,0x0d, +0x22,0x0e,0x12,0x10,0x10,0x10,0x10,0x10,0x2d,0x1c,0x1c,0x0e,0x08,0x0f,0x08,0x0f,0x08,0x08,0x08,0x10,0x13,0x13,0x12,0x0c,0x0c,0x08,0x08,0x08,0x0c,0x08,0x0e,0x1c,0x07,0x1e,0x1e,0x1e,0x13,0x13,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x27,0x27,0x16,0x27,0x27,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0f,0x13,0x0f,0x12,0x0e,0x0c,0x0b,0x17,0x12,0x18,0x0e,0x25,0x1d,0x14,0x12,0x1e,0x1a,0x1c,0x19,0x22,0x1b,0x1f,0x1a,0x15,0x10,0x18,0x13,0x1f,0x18,0x19,0x14,0x19,0x14,0x1c,0x16,0x1d,0x16,0x24,0x1c,0x19,0x13, +0x19,0x13,0x28,0x1d,0x1a,0x00,0x21,0x21,0x21,0x10,0x00,0x00,0x13,0x11,0x17,0x12,0x12,0x0e,0x24,0x1e,0x1f,0x1c,0x18,0x13,0x17,0x13,0x11,0x0e,0x18,0x14,0x11,0x0e,0x1b,0x16,0x16,0x13,0x20,0x1b,0x12,0x13,0x18,0x18,0x1b,0x0f,0x07,0x0f,0x17,0x0e,0x21,0x21,0x08,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d, +0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x00, +0x00,0x00,0x00,0x00,0x00,0x0e,0x10,0x16,0x18,0x09,0x07,0x09,0x07,0x17,0x13,0x19,0x15,0x12,0x10,0x12,0x10,0x14,0x13,0x0e,0x0e,0x25,0x1b,0x26,0x1d,0x21,0x1c,0x1e,0x16,0x1e,0x16,0x1e,0x16,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x12,0x0a,0x10,0x08,0x19,0x13,0x1c,0x16,0x2c,0x21,0x12,0x13,0x17,0x17,0x1b,0x1c,0x19,0x13,0x20, +0x1a,0x12,0x0d,0x12,0x10,0x15,0x10,0x1f,0x18,0x14,0x11,0x12,0x13,0x12,0x13,0x10,0x0d,0x10,0x0d,0x10,0x0c,0x11,0x11,0x0a,0x16,0x0b,0x20,0x16,0x0b,0x13,0x14,0x0f,0x19,0x12,0x0d,0x0b,0x13,0x13,0x13,0x10,0x08,0x19,0x14,0x0c,0x0b,0x15,0x0f,0x17,0x0d,0x1a,0x14,0x14,0x0f,0x17,0x13,0x13,0x10,0x19,0x13,0x14,0x0b,0x12,0x0e,0x19, +0x0e,0x12,0x1c,0x10,0x12,0x1e,0x09,0x26,0x1d,0x1e,0x27,0x1d,0x1e,0x1e,0x1d,0x1d,0x1e,0x11,0x10,0x14,0x17,0x1e,0x17,0x1f,0x08,0x0f,0x13,0x1c,0x22,0x17,0x22,0x14,0x14,0x1a,0x17,0x26,0x1e,0x11,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x1c,0x1c,0x1c,0x1c,0x21,0x11,0x11,0x21,0x19,0x11,0x11,0x19,0x16,0x0b,0x0b,0x16,0x13,0x13, +0x13,0x13,0x19,0x0b,0x0b,0x1c,0x19,0x0b,0x0b,0x1c,0x0e,0x0e,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x11,0x0d,0x13,0x11,0x19,0x13,0x13,0x1d,0x16,0x19,0x19,0x1b,0x1b,0x13,0x10,0x21,0x1b,0x22,0x1c,0x17, +0x13,0x0a,0x0a,0x13,0x15,0x0d,0x14,0x11,0x13,0x10,0x18,0x1a,0x0d,0x13,0x0e,0x07,0x0c,0x12,0x12,0x07,0x07,0x06,0x07,0x0c,0x0c,0x0c,0x0f,0x31,0x42,0x0b,0x0e,0x04,0x09,0x0d,0x0e,0x0a,0x10,0x11,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x2c,0x12,0x19,0x1e,0x1e,0x15,0x0f,0x13,0x18,0x18,0x10, +0x0a,0x16,0x11,0x16,0x12,0x16,0x12,0x12,0x19,0x14,0x13,0x11,0x19,0x14,0x1b,0x0f,0x11,0x15,0x0a,0x13,0x0b,0x0b,0x08,0x1d,0x13,0x13,0x11,0x11,0x13,0x1f,0x1f,0x1f,0x21,0x21,0x12,0x10,0x09,0x11,0x0f,0x14,0x0f,0x16,0x08,0x13,0x14,0x1c,0x1c,0x14,0x12,0x13,0x12,0x11,0x0f,0x11,0x0f,0x10,0x0a,0x0b,0x08,0x07,0x0c,0x13,0x15,0x0a, +0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x0a,0x0a,0x0a,0x08,0x08,0x38,0x21,0x1d,0x23,0x0a,0x0a,0x0b,0x0d,0x08,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x1e,0x0b,0x0b,0x1e,0x09,0x11,0x11,0x2c,0x21,0x21,0x2c,0x1e,0x11,0x11,0x1e,0x11,0x11,0x0e,0x0e,0x00,0x00,0x0c, +0x19,0x14,0x17,0x13,0x29,0x22,0x17,0x12,0x17,0x12,0x2c,0x21,0x19,0x13,0x0d,0x0a,0x14,0x00,0x17,0x12,0x0b,0x0a,0x05,0x10,0x0b,0x0b,0x08,0x07,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x07,0x11,0x0e,0x13,0x13,0x12,0x20,0x1b,0x1b,0x1a,0x1b,0x1f,0x15,0x17,0x14,0x0d,0x1f,0x25,0x0f,0x26,0x11,0x1c,0x1e,0x1e,0x1e,0x0e,0x19, +0x21,0x19,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x13,0x13,0x13,0x1c,0x11,0x11,0x1e,0x0b,0x0b,0x1e,0x0b,0x0b,0x1e,0x10,0x10,0x00,0x0e,0x1c,0x0b,0x0b,0x21,0x11,0x11,0x19,0x11,0x11,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x32,0x32,0x1d, +0x00,0x00,0x1d,0x1d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x16,0x14,0x15,0x15,0x1d,0x15,0x15,0x1a,0x20,0x15,0x15,0x23,0x15,0x15,0x1f,0x15,0x16,0x1a,0x15,0x19,0x1c,0x1e,0x15,0x19,0x15,0x17,0x15,0x17,0x15,0x16,0x17,0x15,0x1a,0x14,0x16,0x1a,0x14,0x15,0x13,0x1a,0x15,0x15,0x15,0x17, +0x0f,0x11,0x15,0x1a,0x1a,0x12,0x00,0x00,0x25,0x4a,0x18,0x00,0x04,0x0a,0x0b,0x0f,0x16,0x14,0x1e,0x1e,0x09,0x0b,0x0b,0x0f,0x19,0x08,0x0f,0x08,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x08,0x08,0x19,0x19,0x19,0x11,0x23,0x18,0x15,0x17,0x1a,0x13,0x12,0x19,0x1a,0x0a,0x0d,0x15,0x11,0x21,0x1c,0x1c,0x15,0x1c,0x16, +0x14,0x13,0x19,0x17,0x23,0x16,0x14,0x15,0x0b,0x0e,0x0b,0x19,0x0f,0x0a,0x13,0x16,0x11,0x16,0x13,0x0c,0x16,0x15,0x09,0x09,0x12,0x09,0x20,0x15,0x16,0x16,0x16,0x0d,0x10,0x0d,0x15,0x12,0x1b,0x11,0x12,0x11,0x0b,0x09,0x0b,0x19,0x18,0x18,0x17,0x13,0x1c,0x1c,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x13,0x09,0x09, +0x09,0x09,0x15,0x16,0x16,0x16,0x16,0x16,0x15,0x15,0x15,0x15,0x0e,0x0e,0x14,0x14,0x11,0x0f,0x11,0x14,0x0f,0x21,0x21,0x1d,0x0a,0x0f,0x19,0x20,0x1c,0x1e,0x19,0x19,0x19,0x14,0x15,0x14,0x17,0x1c,0x14,0x0f,0x10,0x1c,0x1f,0x16,0x11,0x0a,0x0b,0x19,0x18,0x14,0x19,0x18,0x13,0x13,0x1b,0x18,0x18,0x1c,0x22,0x22,0x13,0x25,0x0e,0x0e, +0x08,0x08,0x19,0x16,0x12,0x14,0x06,0x14,0x0c,0x0c,0x15,0x15,0x0e,0x08,0x08,0x0e,0x2d,0x18,0x13,0x18,0x13,0x13,0x0a,0x0a,0x0a,0x0a,0x1c,0x1c,0x1c,0x19,0x19,0x19,0x09,0x0e,0x0c,0x0b,0x0b,0x07,0x0a,0x08,0x0c,0x07,0x0e,0x11,0x0a,0x14,0x10,0x15,0x11,0x09,0x1a,0x15,0x14,0x12,0x15,0x16,0x19,0x19,0x0d,0x0e,0x0e,0x22,0x22,0x23, +0x12,0x19,0x16,0x0a,0x14,0x10,0x17,0x11,0x17,0x11,0x16,0x0f,0x08,0x18,0x13,0x18,0x13,0x1a,0x19,0x1a,0x13,0x13,0x13,0x13,0x11,0x09,0x11,0x0b,0x11,0x0c,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x16,0x0d,0x16,0x0d,0x14,0x10,0x13,0x0d,0x13,0x10,0x19,0x15,0x19,0x15,0x15,0x11,0x15,0x11,0x11,0x1c,0x1c,0x17,0x16,0x10,0x15,0x12,0x1a,0x0f, +0x12,0x0f,0x29,0x17,0x12,0x16,0x08,0x0e,0x1e,0x0c,0x16,0x0d,0x0d,0x16,0x0d,0x18,0x13,0x17,0x11,0x17,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x16,0x19,0x16,0x19,0x16,0x1a,0x15,0x1a,0x15,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0d,0x09,0x15,0x12,0x12,0x11,0x09,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x1c,0x16,0x16,0x0d,0x14,0x10, +0x13,0x0d,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x23,0x1b,0x14,0x12,0x09,0x18,0x13,0x20,0x1f,0x1c,0x16,0x08,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x14,0x12,0x08,0x0f,0x14,0x16,0x22,0x22,0x22,0x21,0x0e,0x0e,0x08,0x0a,0x0a,0x18,0x15,0x1d,0x0e,0x1e,0x19,0x1f,0x0a,0x18,0x15,0x13,0x15,0x1a,0x0a,0x15,0x17,0x21,0x1c,0x13,0x1c,0x1a, +0x15,0x13,0x13,0x14,0x16,0x1d,0x1c,0x0a,0x14,0x17,0x10,0x15,0x0a,0x14,0x14,0x13,0x10,0x15,0x16,0x0a,0x13,0x12,0x15,0x13,0x10,0x16,0x16,0x11,0x14,0x14,0x1c,0x1e,0x0a,0x14,0x16,0x14,0x1e,0x13,0x1a,0x11,0x17,0x14,0x0a,0x24,0x24,0x1b,0x15,0x15,0x1a,0x18,0x15,0x15,0x11,0x1a,0x13,0x20,0x14,0x1c,0x1c,0x15,0x19,0x21,0x1a,0x1c, +0x1a,0x15,0x17,0x13,0x15,0x1b,0x16,0x1b,0x18,0x23,0x24,0x1a,0x1d,0x15,0x17,0x26,0x16,0x13,0x15,0x14,0x0e,0x14,0x13,0x1c,0x11,0x16,0x16,0x12,0x14,0x1a,0x15,0x16,0x15,0x16,0x11,0x0f,0x12,0x19,0x11,0x16,0x15,0x1e,0x1f,0x16,0x1a,0x13,0x11,0x1e,0x13,0x13,0x15,0x0e,0x11,0x10,0x09,0x1d,0x1e,0x15,0x12,0x12,0x15,0x11,0x0e,0x25, +0x2a,0x17,0x0d,0x0e,0x0e,0x0e,0x09,0x14,0x10,0x15,0x1c,0x16,0x1a,0x16,0x0b,0x0c,0x0a,0x0a,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x12,0x0b,0x12,0x0b,0x0b,0x0b,0x12,0x12,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, +0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0a,0x09,0x0a,0x09,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x19,0x15,0x19,0x15,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x14,0x12,0x14,0x12,0x14,0x12,0x13,0x0d,0x13,0x13,0x1c,0x16,0x0a, +0x0d,0x09,0x09,0x13,0x0f,0x22,0x1d,0x17,0x14,0x15,0x12,0x1b,0x16,0x14,0x12,0x14,0x12,0x17,0x12,0x18,0x15,0x18,0x15,0x1b,0x13,0x1c,0x16,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x12,0x12,0x12,0x12,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x13,0x13,0x18,0x13,0x15,0x16,0x15,0x16,0x15,0x16,0x17,0x11,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a, +0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x0c,0x19,0x16,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x0a,0x09,0x0a,0x09,0x15,0x12,0x15,0x12,0x15,0x12,0x11,0x09,0x11,0x09,0x11,0x09,0x11,0x09,0x21,0x20,0x21,0x20,0x21,0x20,0x1c,0x15,0x1c,0x15,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c, +0x16,0x15,0x16,0x15,0x16,0x16,0x0d,0x16,0x0d,0x16,0x0d,0x16,0x0d,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x17,0x12,0x17,0x12,0x23,0x1b,0x23,0x1b,0x16,0x11,0x16,0x11,0x14,0x12,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x0d,0x1b, +0x12,0x13,0x09,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x1a,0x1a,0x1a,0x1a,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x22,0x22,0x22,0x22,0x22,0x22,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x12,0x12,0x13,0x13,0x13,0x13,0x16, +0x16,0x16,0x16,0x16,0x16,0x1e,0x1e,0x23,0x23,0x23,0x23,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x19,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x23,0x23,0x23,0x23,0x23,0x23,0x17,0x17,0x10,0x10,0x15,0x15,0x0a,0x0a,0x16,0x16,0x14,0x14,0x1e,0x1e,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x22,0x22,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x23,0x23,0x23,0x23,0x23,0x23,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x16,0x16,0x16,0x16,0x16,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x1a, +0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0e,0x16,0x16,0x16,0x14,0x14,0x14,0x14,0x16,0x16,0x14,0x14,0x14,0x14,0x19,0x19,0x17,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x1f,0x1c,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x17,0x15,0x16,0x15,0x16, +0x17,0x17,0x11,0x1a,0x1b,0x15,0x16,0x16,0x13,0x14,0x12,0x1a,0x17,0x20,0x0b,0x0a,0x15,0x12,0x09,0x12,0x21,0x1c,0x15,0x1c,0x24,0x1d,0x16,0x16,0x15,0x14,0x10,0x13,0x0b,0x0d,0x13,0x0d,0x13,0x1c,0x1a,0x15,0x13,0x15,0x11,0x17,0x17,0x10,0x0f,0x14,0x14,0x0e,0x0f,0x14,0x09,0x0e,0x11,0x0b,0x2e,0x2a,0x26,0x20,0x1b,0x13,0x28,0x24, +0x1e,0x18,0x13,0x0a,0x09,0x1c,0x16,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x13,0x18,0x13,0x18,0x13,0x20,0x1f,0x19,0x16,0x19,0x16,0x15,0x12,0x1c,0x16,0x1c,0x16,0x17,0x10,0x09,0x2e,0x2a,0x26,0x19,0x16,0x25,0x19,0x1c,0x15,0x18,0x13,0x18,0x13,0x13,0x13,0x13,0x13,0x0a,0x09,0x0a,0x09,0x1c,0x16,0x1c,0x16,0x15,0x0d, +0x16,0x0d,0x19,0x15,0x19,0x15,0x13,0x10,0x1a,0x15,0x1b,0x16,0x15,0x15,0x11,0x18,0x13,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x14,0x12,0x16,0x13,0x15,0x15,0x16,0x13,0x16,0x16,0x16,0x11,0x11,0x16,0x16,0x13,0x17,0x0f,0x0f,0x13,0x14,0x0a,0x16,0x16,0x14,0x12,0x11,0x15,0x15,0x15,0x0a,0x0a,0x0c,0x0a,0x0e,0x09,0x16,0x20,0x20, +0x20,0x15,0x15,0x16,0x16,0x1a,0x1b,0x18,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x11,0x11,0x0f,0x09,0x0a,0x0b,0x0a,0x0d,0x0d,0x16,0x16,0x15,0x12,0x1b,0x12,0x0f,0x11,0x13,0x10,0x10,0x0e,0x0e,0x0e,0x11,0x17,0x12,0x14,0x14,0x15,0x09,0x12,0x0e,0x16,0x0e,0x0e,0x22,0x23,0x24,0x17,0x12,0x1b,0x1d,0x15,0x15,0x12,0x12,0x14,0x16,0x15, +0x19,0x15,0x18,0x1e,0x15,0x1a,0x16,0x16,0x11,0x12,0x11,0x16,0x13,0x17,0x12,0x21,0x20,0x16,0x13,0x18,0x14,0x17,0x11,0x16,0x12,0x19,0x16,0x15,0x0f,0x15,0x16,0x11,0x09,0x1c,0x11,0x11,0x20,0x19,0x18,0x15,0x22,0x1a,0x19,0x12,0x20,0x1a,0x1b,0x15,0x22,0x1c,0x14,0x11,0x1d,0x1c,0x1c,0x16,0x1b,0x15,0x1b,0x15,0x31,0x29,0x1f,0x18, +0x2a,0x21,0x20,0x19,0x16,0x10,0x13,0x0f,0x0f,0x00,0x00,0x24,0x23,0x15,0x13,0x15,0x16,0x15,0x13,0x14,0x11,0x15,0x12,0x1a,0x16,0x1f,0x19,0x25,0x1f,0x1b,0x15,0x17,0x11,0x13,0x0f,0x20,0x19,0x19,0x16,0x1f,0x17,0x1f,0x17,0x0a,0x20,0x1c,0x15,0x13,0x1a,0x15,0x18,0x15,0x18,0x13,0x18,0x13,0x20,0x1f,0x13,0x13,0x1b,0x13,0x1b,0x13, +0x20,0x1c,0x14,0x11,0x13,0x10,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x17,0x11,0x15,0x12,0x15,0x12,0x15,0x12,0x18,0x15,0x1d,0x1a,0x15,0x16,0x20,0x20,0x1e,0x1b,0x15,0x12,0x22,0x1d,0x25,0x1f,0x1a,0x14,0x19,0x16,0x16,0x15,0x15,0x13,0x16,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x16, +0x0c,0x0c,0x06,0x08,0x08,0x08,0x0a,0x0f,0x0a,0x08,0x0e,0x08,0x08,0x08,0x0c,0x0c,0x08,0x08,0x16,0x16,0x16,0x16,0x0c,0x0a,0x0a,0x0c,0x0b,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0b,0x06,0x09,0x0a,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x0c,0x09,0x0a,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14, +0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14, +0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14, +0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x18,0x0b,0x17,0x0d,0x16,0x16,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0c,0x0c,0x0c,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x16,0x11,0x18,0x1f,0x12,0x11,0x14,0x15,0x0f,0x0f,0x09,0x0b,0x12,0x0f,0x1a,0x16,0x16,0x12,0x17,0x17,0x17, +0x22,0x14,0x16,0x16,0x11,0x11,0x11,0x0f,0x14,0x15,0x1b,0x15,0x12,0x1b,0x11,0x0f,0x0f,0x14,0x0e,0x11,0x15,0x11,0x16,0x15,0x0d,0x12,0x0d,0x0d,0x0f,0x0b,0x0b,0x0f,0x10,0x07,0x08,0x0d,0x0a,0x13,0x10,0x10,0x10,0x0e,0x0d,0x0d,0x0b,0x0f,0x13,0x0c,0x0c,0x0d,0x12,0x0d,0x0d,0x0c,0x0c,0x0a,0x0a,0x0d,0x06,0x0b,0x12,0x0c,0x0d,0x0a, +0x0d,0x0d,0x0d,0x07,0x0c,0x0c,0x12,0x0a,0x0c,0x0c,0x0b,0x0d,0x0f,0x0b,0x06,0x08,0x0c,0x0a,0x0c,0x0b,0x0d,0x0f,0x0b,0x16,0x06,0x0d,0x14,0x20,0x17,0x14,0x14,0x20,0x18,0x20,0x1c,0x14,0x16,0x13,0x11,0x2a,0x11,0x16,0x21,0x23,0x23,0x17,0x18,0x17,0x11,0x11,0x13,0x10,0x11,0x13,0x07,0x00,0x00,0x00,0x00,0x16,0x17,0x17,0x17,0x11, +0x0e,0x16,0x16,0x0c,0x20,0x15,0x16,0x0d,0x0c,0x11,0x0d,0x11,0x16,0x11,0x15,0x21,0x18,0x0c,0x0a,0x16,0x14,0x16,0x16,0x16,0x0c,0x16,0x12,0x09,0x20,0x15,0x16,0x0d,0x10,0x10,0x12,0x11,0x11,0x13,0x16,0x16,0x13,0x10,0x11,0x1b,0x09,0x11,0x09,0x15,0x10,0x0d,0x0a,0x0a,0x0d,0x0a,0x07,0x06,0x0d,0x0c,0x06,0x07,0x06,0x06,0x06,0x07, +0x06,0x08,0x12,0x12,0x0c,0x0c,0x0d,0x0c,0x0e,0x09,0x06,0x07,0x0c,0x0d,0x0c,0x0c,0x0a,0x0a,0x0a,0x0b,0x0a,0x0d,0x00,0x00,0x00,0x00,0x08,0x0c,0x0c,0x0d,0x0a,0x0c,0x14,0x14,0x14,0x14,0x0c,0x00,0x00,0x00,0x00,0x11,0x0b,0x0a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x14,0x14,0x14,0x14, +0x14,0x14,0x14,0x14,0x0a,0x0a,0x0a,0x0a,0x14,0x14,0x14,0x14,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x06,0x0e,0x0e,0x0d,0x0e,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0e,0x0d,0x0e,0x0e,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x1d,0x17, +0x1a,0x15,0x1c,0x17,0x23,0x1c,0x14,0x0e,0x13,0x19,0x14,0x1e,0x1a,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x1f,0x1f,0x25,0x0f,0x09,0x13,0x16,0x0f,0x13,0x13,0x16,0x16,0x13,0x25,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x18,0x13,0x13,0x13,0x0c,0x16,0x0c,0x1c,0x19,0x13,0x0c,0x1f, +0x13,0x1f,0x09,0x0c,0x16,0x16,0x18,0x18,0x18,0x16,0x16,0x16,0x1f,0x09,0x16,0x09,0x13,0x0f,0x09,0x09,0x13,0x09,0x1c,0x09,0x22,0x13,0x22,0x22,0x16,0x16,0x16,0x13,0x13,0x0f,0x0f,0x2b,0x2b,0x31,0x31,0x1f,0x1f,0x13,0x13,0x06,0x25,0x1c,0x1f,0x19,0x16,0x19,0x13,0x13,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x09, +0x18,0x00,0x18,0x18,0x18,0x0c,0x13,0x13,0x22,0x0c,0x22,0x0c,0x16,0x19,0x16,0x0f,0x22,0x13,0x22,0x13,0x1c,0x1f,0x0c,0x13,0x13,0x0f,0x09,0x13,0x16,0x13,0x16,0x13,0x16,0x16,0x13,0x19,0x18,0x22,0x0c,0x13,0x0f,0x19,0x13,0x0c,0x13,0x13,0x13,0x22,0x0c,0x22,0x0c,0x09,0x16,0x0e,0x25,0x13,0x13,0x18,0x18,0x25,0x13,0x00,0x00,0x00, +0x18,0x00,0x18,0x18,0x18,0x18,0x1c,0x18,0x00,0x00,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x13,0x13,0x1c,0x1f,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x19,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0f,0x0f,0x0f,0x13, +0x0f,0x0f,0x0f,0x2b,0x1f,0x2b,0x1f,0x2b,0x1f,0x31,0x25,0x31,0x25,0x1f,0x13,0x16,0x16,0x16,0x25,0x25,0x13,0x13,0x25,0x13,0x13,0x25,0x13,0x13,0x25,0x13,0x13,0x1c,0x1c,0x28,0x25,0x22,0x13,0x1f,0x13,0x1f,0x13,0x1f,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19, +0x19,0x0c,0x19,0x0c,0x14,0x19,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1f,0x22,0x1c,0x1f,0x0c,0x13,0x1c,0x1f,0x1c,0x1f,0x00,0x00,0x00,0x00,0x00,0x2a,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0f,0x00,0x00,0x16,0x00,0x00,0x00,0x2b,0x1f,0x31,0x25,0x13,0x16,0x16,0x16,0x0f,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16, +0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x22,0x22,0x0e,0x16,0x16,0x16,0x2d,0x1f,0x14,0x38,0x28,0x0c,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x13,0x0f,0x0f,0x1c,0x19,0x19,0x13,0x00,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x2e,0x38,0x00,0x00,0x00,0x00,0x00,0x16,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x0f,0x22,0x0c, +0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x19,0x16,0x13,0x13,0x0f,0x2b,0x1f,0x13,0x16,0x16,0x16,0x13,0x16,0x16,0x16,0x13,0x16,0x16,0x16,0x25,0x13,0x13,0x25,0x13,0x13,0x22,0x13,0x13,0x22,0x13,0x13,0x22,0x13,0x13,0x16,0x16,0x16,0x16,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x19,0x0c,0x0c,0x0f,0x0f, +0x2b,0x1f,0x18,0x16,0x16,0x00,0x13,0x13,0x13,0x0e,0x15,0x19,0x17,0x13,0x13,0x0d,0x09,0x1c,0x16,0x16,0x0d,0x14,0x12,0x12,0x11,0x12,0x09,0x13,0x0f,0x17,0x12,0x16,0x11,0x14,0x10,0x19,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x11,0x12,0x11,0x0b,0x13,0x15,0x16,0x13,0x0d,0x1b,0x16,0x18,0x14,0x17,0x12,0x15,0x13, +0x0f,0x1a,0x0e,0x0f,0x10,0x12,0x16,0x16,0x13,0x25,0x13,0x25,0x0c,0x09,0x06,0x14,0x08,0x05,0x00,0x05,0x08,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x22,0x10,0x1c,0x16,0x23,0x1b,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x20,0x11,0x20,0x11,0x20,0x18,0x19,0x1a,0x1a,0x1c, +0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x19,0x19,0x19,0x19,0x1b,0x15,0x27,0x1f,0x11,0x11,0x0b,0x0b,0x0b,0x0e,0x08,0x15,0x09,0x09,0x1f,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x07,0x00,0x00,0x08,0x00,0x00,0x18,0x15,0x10,0x12,0x19,0x0a,0x0c,0x19,0x19,0x0a,0x15,0x14,0x14,0x1a, +0x19,0x0a,0x0f,0x19,0x16,0x17,0x17,0x15,0x16,0x19,0x15,0x1d,0x1b,0x13,0x13,0x13,0x08,0x0e,0x15,0x15,0x14,0x14,0x14,0x16,0x18,0x12,0x19,0x14,0x14,0x1a,0x15,0x1b,0x14,0x1d,0x1d,0x1d,0x1d,0x18,0x18,0x18,0x15,0x10,0x12,0x19,0x0b,0x0d,0x19,0x0b,0x15,0x14,0x14,0x19,0x0f,0x19,0x17,0x17,0x16,0x19,0x15,0x1d,0x1b,0x0a,0x15,0x14, +0x17,0x18,0x2c,0x00,0x18,0x14,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0a,0x00,0x1c,0x18,0x19,0x1a,0x14,0x19,0x1c,0x1c,0x11,0x17,0x1c,0x1b,0x18,0x1c,0x1e,0x1d,0x19,0x14,0x15,0x1c, +0x1a,0x15,0x19,0x19,0x18,0x19,0x19,0x1b,0x15,0x18,0x19,0x18,0x1d,0x17,0x17,0x18,0x19,0x1e,0x12,0x16,0x16,0x20,0x14,0x14,0x1d,0x21,0x17,0x14,0x27,0x15,0x15,0x1c,0x14,0x14,0x1c,0x15,0x1c,0x1e,0x20,0x14,0x1d,0x14,0x18,0x14,0x17,0x15,0x17,0x14,0x16,0x1c,0x14,0x17,0x19,0x14,0x14,0x16,0x23,0x14,0x14,0x16,0x16,0x10,0x0c,0x15, +0x15,0x15,0x14,0x15,0x21,0x15,0x21,0x12,0x15,0x21,0x19,0x15,0x21,0x1c,0x1c,0x21,0x15,0x15,0x21,0x21,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x21,0x16,0x15,0x15,0x21,0x16,0x14,0x15,0x15,0x21,0x1d,0x19,0x1a,0x1a,0x19,0x1a,0x17,0x19,0x1d,0x1a,0x18,0x14,0x1d,0x19,0x19,0x15,0x19,0x1a,0x1c,0x1b,0x16,0x1a,0x19,0x1b,0x19,0x1d,0x1a, +0x1b,0x1b,0x19,0x18,0x1a,0x19,0x1b,0x1d,0x18,0x1c,0x1b,0x04,0x04,0x06,0x07,0x06,0x0a,0x0d,0x20,0x15,0x17,0x16,0x15,0x17,0x15,0x15,0x18,0x16,0x15,0x0b,0x1f,0x16,0x15,0x15,0x14,0x16,0x13,0x15,0x0a,0x16,0x13,0x15,0x0f,0x20,0x14,0x15,0x15,0x16,0x1f,0x15,0x16,0x0f,0x1f,0x16,0x16,0x19,0x19,0x08,0x0a,0x2a,0x29,0x29,0x2a,0x35, +0x14,0x14,0x09,0x14,0x0e,0x14,0x14,0x15,0x14,0x14,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x15,0x14,0x14,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x12,0x13,0x16,0x10,0x10,0x15,0x17,0x09,0x0c,0x12, +0x0f,0x1c,0x18,0x17,0x12,0x17,0x12,0x10,0x10,0x16,0x13,0x1e,0x13,0x11,0x12,0x1a,0x1d,0x0f,0x17,0x12,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x18,0x17,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16,0x11,0x13,0x13,0x13,0x13,0x13,0x15,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x13, +0x17,0x17,0x09,0x09,0x09,0x09,0x09,0x15,0x0c,0x12,0x0f,0x0f,0x0f,0x0f,0x18,0x18,0x18,0x18,0x17,0x17,0x17,0x12,0x12,0x12,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x1a,0x17,0x13,0x12,0x0e,0x14,0x10,0x12,0x17,0x17,0x09,0x12,0x13,0x1c,0x18, +0x11,0x17,0x17,0x12,0x11,0x10,0x11,0x17,0x13,0x18,0x17,0x13,0x10,0x17,0x09,0x17,0x11,0x17,0x09,0x11,0x10,0x15,0x0f,0x13,0x10,0x09,0x09,0x0c,0x1e,0x1e,0x17,0x12,0x12,0x17,0x13,0x12,0x12,0x0f,0x16,0x10,0x1b,0x10,0x18,0x18,0x12,0x15,0x1c,0x17,0x17,0x17,0x12,0x13,0x10,0x12,0x17,0x13,0x17,0x14,0x1e,0x1f,0x15,0x1a,0x12,0x13, +0x20,0x12,0x0f,0x15,0x16,0x17,0x21,0x21,0x18,0x13,0x15,0x10,0x15,0x15,0x15,0x1a,0x13,0x13,0x19,0x15,0x15,0x0d,0x17,0x17,0x15,0x12,0x12,0x21,0x1c,0x11,0x14,0x16,0x16,0x17,0x17,0x1a,0x19,0x0d,0x23,0x16,0x14,0x15,0x18,0x18,0x13,0x13,0x0a,0x1c,0x19,0x19,0x11,0x1a,0x08,0x08,0x10,0x10,0x08,0x08,0x17,0x0f,0x0a,0x1c,0x1a,0x0b, +0x08,0x08,0x11,0x0e,0x0e,0x08,0x08,0x08,0x0e,0x19,0x11,0x0b,0x16,0x19,0x16,0x15,0x12,0x1c,0x15,0x16,0x0d,0x10,0x14,0x10,0x08,0x08,0x0e,0x13,0x0d,0x19,0x19,0x19,0x22,0x1c,0x22,0x09,0x00,0x00,0x00,0x00,0x00,0x09,0x1c,0x1f,0x0c,0x0c,0x13,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x13,0x13,0x2b,0x1f,0x2b,0x1f,0x31, +0x25,0x31,0x25,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x22,0x22,0x13,0x13,0x22,0x22,0x13,0x13,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x25,0x1c,0x1f,0x13,0x16,0x16,0x19,0x0c,0x19,0x1c,0x13,0x13,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x22,0x0c,0x1c,0x13,0x13,0x09,0x13,0x13, +0x13,0x13,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x2b,0x1f,0x2b,0x1f,0x2b,0x1f,0x31,0x25,0x31,0x25,0x1f,0x1f,0x1f,0x25,0x25,0x25,0x25,0x25,0x25,0x1c,0x13,0x13,0x1c,0x13,0x13,0x22,0x13,0x28,0x25,0x22, +0x13,0x1f,0x13,0x1f,0x13,0x1f,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x19,0x19,0x19,0x19,0x19,0x0c,0x19,0x19,0x0c,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x13,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0c,0x0c,0x13,0x0c,0x0c,0x0c,0x0c,0x00,0x2b,0x1f,0x31,0x25,0x22,0x13,0x22,0x0c,0x22,0x0c, +0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x13,0x13,0x0f,0x2b,0x1f,0x25,0x25,0x22,0x22,0x22,0x16,0x16,0x16,0x16,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x2b,0x1f,0x16,0x19,0x16,0x16,0x16,0x19,0x16,0x16,0x2b,0x2b,0x1f,0x1f,0x0f,0x0f,0x16,0x16,0x16,0x16,0x0c,0x0c,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f, +0x0c,0x0c,0x16,0x16,0x16,0x16,0x22,0x0c,0x22,0x0c,0x16,0x19,0x16,0x16,0x2b,0x2b,0x1f,0x1f,0x2b,0x2b,0x1f,0x1f,0x1f,0x1f,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x09,0x09,0x0c,0x09,0x00,0x00,0x00,0x1f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, +0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x19,0x19,0x19,0x19,0x19,0x19,0x16, +0x1f,0x16,0x1f,0x16,0x1f,0x16,0x1f,0x19,0x19,0x19,0x09,0x09,0x13,0x0f,0x16,0x18,0x15,0x14,0x15,0x16,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x13,0x11,0x14,0x13,0x16,0x17,0x17,0x18,0x15,0x15,0x18,0x13,0x19,0x1c,0x18,0x1c,0x1f,0x18,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x14,0x11, +0x14,0x16,0x16,0x18,0x15,0x18,0x15,0x16,0x16,0x13,0x13,0x1c,0x19,0x1a,0x19,0x19,0x16,0x16,0x15,0x1b,0x1d,0x1c,0x1c,0x22,0x22,0x1a,0x22,0x22,0x1b,0x20,0x1f,0x15,0x1c,0x1f,0x1c,0x16,0x1f,0x1b,0x1a,0x1a,0x16,0x18,0x1c,0x1d,0x1a,0x17,0x1a,0x16,0x14,0x22,0x22,0x22,0x1e,0x22,0x22,0x19,0x22,0x22,0x1a,0x1c,0x1d,0x1c,0x1b,0x1b, +0x18,0x21,0x1c,0x1f,0x1a,0x1a,0x15,0x1b,0x1a,0x1a,0x20,0x1c,0x1b,0x21,0x14,0x13,0x15,0x14,0x17,0x17,0x1a,0x1b,0x15,0x15,0x15,0x14,0x15,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x14,0x16,0x17,0x16,0x16,0x11,0x15,0x15,0x16,0x16,0x1c,0x1f,0x18,0x18,0x17,0x1c,0x18,0x19,0x13,0x12,0x16,0x15,0x12,0x12,0x14,0x14,0x12,0x11, +0x17,0x11,0x14,0x12,0x14,0x1d,0x15,0x1f,0x14,0x15,0x15,0x1c,0x0c,0x1d,0x19,0x1b,0x18,0x15,0x1c,0x16,0x1d,0x16,0x16,0x16,0x16,0x16,0x16,0x15,0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x11,0x11,0x11,0x11,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x17,0x0a,0x0a,0x0a,0x0b,0x0b,0x0a,0x0a,0x0a,0x0b, +0x0a,0x0a,0x0a,0x21,0x21,0x21,0x21,0x12,0x1b,0x1b,0x12,0x0f,0x12,0x13,0x15,0x12,0x1f,0x1e,0x20,0x10,0x25,0x12,0x1f,0x1f,0x1f,0x1e,0x15,0x12,0x12,0x1d,0x16,0x1d,0x19,0x14,0x11,0x0f,0x26,0x0f,0x14,0x12,0x12,0x12,0x12,0x12,0x32,0x1f,0x1f,0x10,0x09,0x11,0x09,0x11,0x09,0x09,0x09,0x12,0x16,0x16,0x14,0x0e,0x0e,0x08,0x08,0x08, +0x0e,0x08,0x0f,0x20,0x08,0x21,0x21,0x21,0x16,0x16,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x2b,0x2b,0x19,0x2b,0x2b,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x11,0x16,0x11,0x14,0x10, +0x0d,0x0d,0x19,0x14,0x1b,0x10,0x2a,0x21,0x16,0x14,0x22,0x1d,0x1f,0x1c,0x26,0x1e,0x22,0x1d,0x18,0x12,0x1b,0x16,0x22,0x1b,0x1c,0x17,0x1b,0x16,0x20,0x19,0x20,0x19,0x29,0x1f,0x1c,0x16,0x1c,0x16,0x2d,0x21,0x1d,0x00,0x24,0x24,0x24,0x12,0x00,0x00,0x16,0x13,0x1a,0x15,0x14,0x10,0x28,0x21,0x23,0x20,0x1b,0x15,0x1a,0x16,0x13,0x0f, +0x1b,0x16,0x13,0x0f,0x1e,0x19,0x18,0x15,0x24,0x1e,0x14,0x15,0x1b,0x1b,0x1e,0x11,0x07,0x11,0x19,0x10,0x25,0x25,0x09,0x00,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x0f,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x14,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, +0x1c,0x1c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, +0x1c,0x1c,0x1c,0x1c,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x12,0x19,0x1b,0x0a,0x08,0x0a,0x08,0x1a,0x15,0x1b,0x17,0x14,0x11,0x14,0x12,0x16,0x15,0x10,0x10,0x2a,0x1e,0x2b, +0x21,0x25,0x1f,0x21,0x18,0x21,0x18,0x21,0x18,0x17,0x11,0x15,0x12,0x15,0x12,0x15,0x12,0x14,0x0c,0x11,0x09,0x1c,0x16,0x20,0x19,0x31,0x25,0x15,0x16,0x19,0x1a,0x1e,0x20,0x1c,0x16,0x24,0x1d,0x14,0x0f,0x15,0x12,0x17,0x12,0x23,0x1b,0x17,0x13,0x15,0x16,0x15,0x16,0x12,0x0f,0x12,0x0e,0x11,0x0e,0x13,0x13,0x0b,0x19,0x0c,0x23,0x19, +0x0d,0x16,0x17,0x11,0x1c,0x15,0x0e,0x0d,0x15,0x15,0x15,0x11,0x09,0x1c,0x16,0x0e,0x0d,0x17,0x11,0x1a,0x0e,0x1d,0x16,0x17,0x11,0x19,0x16,0x15,0x12,0x1c,0x15,0x16,0x0d,0x14,0x10,0x1c,0x10,0x14,0x20,0x12,0x15,0x21,0x0a,0x2a,0x21,0x21,0x2c,0x21,0x22,0x22,0x21,0x21,0x22,0x13,0x11,0x17,0x1a,0x21,0x1a,0x23,0x09,0x11,0x16,0x20, +0x26,0x1a,0x26,0x17,0x17,0x1d,0x1a,0x2a,0x22,0x13,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x1f,0x1f,0x1f,0x1f,0x25,0x13,0x13,0x25,0x1c,0x13,0x13,0x1c,0x19,0x0c,0x0c,0x19,0x16,0x16,0x16,0x16,0x1c,0x0c,0x0c,0x1f,0x1c,0x0c,0x0c,0x1f,0x0f,0x0f,0x13,0x13,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x13,0x0f,0x15,0x14,0x1c,0x16,0x15,0x20,0x19,0x1c,0x1c,0x1f,0x1e,0x15,0x12,0x25,0x1e,0x27,0x20,0x19,0x16,0x0c,0x0c,0x16,0x18,0x0f,0x16,0x13,0x15,0x12,0x1b,0x1e,0x0f,0x16,0x10,0x08,0x0e,0x14,0x14,0x08,0x08,0x07,0x08,0x0e,0x0e,0x0e,0x11,0x37, +0x4a,0x0d,0x0f,0x05,0x0a,0x0e,0x10,0x0c,0x12,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x31,0x14,0x1c,0x22,0x21,0x18,0x11,0x15,0x1b,0x1b,0x12,0x0c,0x18,0x13,0x19,0x15,0x18,0x14,0x14,0x1c,0x16,0x15,0x13,0x1c,0x17,0x1f,0x11,0x13,0x17,0x0c,0x16,0x0d,0x0d,0x09,0x20,0x16,0x15,0x13,0x13, +0x16,0x22,0x22,0x23,0x25,0x25,0x14,0x12,0x0a,0x13,0x11,0x17,0x11,0x19,0x09,0x15,0x16,0x20,0x20,0x17,0x14,0x15,0x14,0x13,0x11,0x13,0x11,0x12,0x0b,0x0c,0x09,0x08,0x0d,0x15,0x17,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x00,0x0b,0x0b,0x0b,0x09,0x09,0x3e,0x25,0x20,0x27,0x0b,0x0b,0x0c, +0x0f,0x09,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x22,0x0c,0x0c,0x22,0x0a,0x13,0x13,0x31,0x25,0x25,0x31,0x22,0x13,0x13,0x22,0x13,0x13,0x0f,0x0f,0x00,0x00,0x0d,0x1c,0x16,0x1a,0x15,0x2e,0x26,0x1a,0x14,0x1a,0x14,0x31,0x25,0x1c,0x16,0x0e,0x0c,0x17,0x00,0x19,0x14,0x0c,0x0b,0x06,0x12,0x0c,0x0d,0x09,0x07, +0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x08,0x13,0x10,0x16,0x15,0x14,0x24,0x1e,0x1e,0x1d,0x1e,0x23,0x17,0x19,0x16,0x0f,0x22,0x2a,0x10,0x2b,0x13,0x1f,0x22,0x22,0x22,0x0f,0x1c,0x25,0x1c,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x16,0x16,0x16,0x1f,0x13,0x13,0x22,0x0c,0x0c, +0x22,0x0c,0x0c,0x22,0x12,0x12,0x00,0x0f,0x1f,0x0c,0x0c,0x25,0x13,0x13,0x1c,0x13,0x13,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x38,0x38,0x21,0x00,0x00,0x21,0x21,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x19,0x17,0x18,0x18,0x21,0x18,0x17,0x1e, +0x24,0x18,0x17,0x28,0x17,0x17,0x23,0x17,0x19,0x1d,0x18,0x1c,0x1f,0x22,0x18,0x1c,0x18,0x1a,0x17,0x1a,0x17,0x18,0x19,0x17,0x1d,0x16,0x19,0x1d,0x17,0x17,0x15,0x1d,0x18,0x18,0x18,0x1a,0x11,0x14,0x18,0x1d,0x1d,0x14,0x00,0x00,0x2a,0x54,0x1b,0x00,0x04,0x0c,0x0c,0x10,0x19,0x17,0x22,0x22,0x0a,0x0d,0x0d,0x12,0x1d,0x09,0x11,0x09, +0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x09,0x09,0x1d,0x1d,0x1d,0x13,0x28,0x1b,0x18,0x1a,0x1d,0x15,0x15,0x1d,0x1e,0x0b,0x0f,0x18,0x14,0x26,0x1f,0x20,0x18,0x20,0x19,0x16,0x16,0x1d,0x1a,0x27,0x19,0x17,0x18,0x0d,0x10,0x0d,0x1d,0x11,0x0b,0x15,0x19,0x13,0x19,0x16,0x0d,0x19,0x18,0x0a,0x0a,0x15,0x0a,0x24,0x18, +0x19,0x19,0x19,0x0f,0x12,0x0e,0x18,0x14,0x1e,0x13,0x14,0x13,0x0d,0x0a,0x0d,0x1d,0x1b,0x1b,0x1a,0x15,0x1f,0x20,0x1d,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x16,0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x18,0x19,0x19,0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x10,0x10,0x17,0x17,0x13,0x11,0x13,0x17,0x11,0x25,0x25,0x20,0x0c,0x11,0x1d,0x24, +0x20,0x22,0x1d,0x1d,0x1d,0x17,0x18,0x16,0x1a,0x20,0x17,0x10,0x12,0x20,0x23,0x19,0x13,0x0c,0x0c,0x1d,0x1b,0x17,0x1d,0x1b,0x15,0x15,0x1f,0x1b,0x1b,0x20,0x27,0x27,0x15,0x2a,0x10,0x10,0x0a,0x0a,0x1d,0x19,0x14,0x17,0x07,0x17,0x0d,0x0d,0x17,0x17,0x10,0x09,0x0a,0x10,0x33,0x1b,0x15,0x1b,0x15,0x15,0x0b,0x0b,0x0b,0x0b,0x20,0x20, +0x20,0x1d,0x1d,0x1d,0x0a,0x10,0x0e,0x0d,0x0d,0x08,0x0c,0x09,0x0e,0x08,0x10,0x14,0x0c,0x16,0x12,0x18,0x13,0x0a,0x1d,0x17,0x17,0x14,0x18,0x19,0x1d,0x1d,0x0f,0x0f,0x0f,0x27,0x26,0x28,0x15,0x1d,0x19,0x0b,0x16,0x12,0x1a,0x13,0x1a,0x13,0x19,0x11,0x09,0x1b,0x15,0x1b,0x15,0x1d,0x1c,0x1d,0x15,0x16,0x15,0x16,0x14,0x0a,0x14,0x0d, +0x14,0x0d,0x1f,0x18,0x1f,0x18,0x20,0x19,0x19,0x0f,0x19,0x0f,0x16,0x12,0x16,0x0e,0x16,0x12,0x1d,0x18,0x1d,0x18,0x18,0x13,0x18,0x13,0x14,0x20,0x20,0x1a,0x19,0x12,0x18,0x14,0x1d,0x11,0x14,0x10,0x2f,0x1a,0x15,0x19,0x0a,0x10,0x22,0x0e,0x19,0x0f,0x0f,0x19,0x0f,0x1b,0x15,0x1a,0x13,0x1a,0x13,0x15,0x16,0x15,0x16,0x15,0x16,0x1d, +0x19,0x1d,0x19,0x1d,0x19,0x1e,0x18,0x1e,0x18,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0f,0x0a,0x18,0x15,0x15,0x14,0x0a,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x19,0x0f,0x16,0x12,0x16,0x0e,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x27,0x1e,0x17,0x14,0x0a,0x1b,0x15,0x24,0x23,0x20,0x19,0x09,0x27,0x1e,0x27,0x1e,0x27,0x1e, +0x17,0x14,0x0a,0x11,0x17,0x19,0x27,0x27,0x27,0x25,0x10,0x10,0x09,0x0b,0x0b,0x1b,0x18,0x21,0x10,0x22,0x1c,0x23,0x0b,0x1b,0x18,0x15,0x18,0x1e,0x0b,0x18,0x1a,0x26,0x1f,0x15,0x20,0x1e,0x18,0x16,0x16,0x17,0x19,0x21,0x20,0x0b,0x17,0x1a,0x12,0x18,0x0b,0x17,0x17,0x16,0x13,0x18,0x19,0x0b,0x16,0x15,0x18,0x16,0x13,0x19,0x19,0x13, +0x17,0x17,0x20,0x22,0x0b,0x17,0x19,0x17,0x22,0x15,0x1d,0x14,0x1a,0x16,0x0b,0x29,0x29,0x1e,0x18,0x18,0x1e,0x1b,0x18,0x18,0x14,0x1d,0x15,0x24,0x17,0x1f,0x1f,0x18,0x1c,0x26,0x1e,0x20,0x1e,0x18,0x1a,0x16,0x18,0x1f,0x19,0x1f,0x1c,0x28,0x29,0x1e,0x21,0x18,0x1a,0x2b,0x19,0x15,0x18,0x16,0x10,0x17,0x16,0x1f,0x13,0x18,0x18,0x15, +0x16,0x1d,0x18,0x19,0x18,0x19,0x13,0x11,0x14,0x1d,0x13,0x19,0x18,0x22,0x23,0x19,0x1e,0x15,0x13,0x22,0x15,0x16,0x18,0x10,0x13,0x12,0x0a,0x21,0x22,0x18,0x15,0x14,0x18,0x14,0x10,0x2a,0x2f,0x1a,0x0f,0x0f,0x0f,0x0f,0x0a,0x16,0x12,0x17,0x20,0x19,0x1e,0x19,0x0d,0x0e,0x0b,0x0b,0x14,0x14,0x14,0x14,0x0d,0x0d,0x0d,0x14,0x0d,0x14, +0x0d,0x0d,0x0d,0x14,0x14,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x0b,0x0a,0x0b,0x0a,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20, +0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x1d,0x18,0x1d,0x18,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x17,0x14,0x17,0x14,0x17,0x14,0x16,0x0e,0x15,0x16,0x1f,0x18,0x0b,0x0f,0x0a,0x0a,0x16,0x11,0x26,0x21,0x1a,0x16,0x18,0x15,0x1f,0x19,0x17,0x14,0x17,0x14,0x1a,0x15,0x1c,0x18,0x1c,0x18,0x1e,0x16,0x20,0x19,0x0d, +0x0d,0x0d,0x0d,0x11,0x11,0x14,0x14,0x14,0x14,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x15,0x16,0x1b,0x15,0x18,0x19,0x18,0x19,0x18,0x19,0x1a,0x13,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x0d,0x1d,0x19,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x0b,0x0a,0x0b, +0x0a,0x18,0x15,0x18,0x15,0x18,0x15,0x14,0x0a,0x14,0x0a,0x14,0x0a,0x14,0x0a,0x26,0x24,0x26,0x24,0x26,0x24,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x18,0x19,0x18,0x19,0x19,0x0f,0x19,0x0f,0x19,0x0f,0x19,0x0f,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x0e,0x16,0x0e,0x16, +0x0e,0x16,0x0e,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1a,0x14,0x1a,0x14,0x27,0x1e,0x27,0x1e,0x19,0x13,0x19,0x13,0x17,0x14,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x0e,0x1e,0x14,0x15,0x0a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x1e, +0x1e,0x1e,0x1e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x15,0x15,0x16,0x16,0x16,0x16,0x19,0x19,0x19,0x19,0x19,0x19,0x22,0x22,0x28,0x28,0x28,0x28,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, +0x22,0x22,0x22,0x23,0x23,0x28,0x28,0x28,0x28,0x28,0x28,0x1a,0x1a,0x12,0x12,0x18,0x18,0x0b,0x0b,0x19,0x19,0x17,0x17,0x22,0x22,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x21,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x22,0x22,0x22,0x22,0x22,0x22,0x22, +0x22,0x23,0x23,0x28,0x28,0x28,0x28,0x28,0x28,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x21,0x21,0x1e,0x19,0x19,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x10,0x19,0x19,0x19,0x17,0x17,0x17,0x17,0x19,0x19,0x17,0x17,0x17,0x17,0x1c,0x1c, +0x1a,0x19,0x19,0x19,0x22,0x22,0x22,0x22,0x22,0x23,0x23,0x23,0x23,0x20,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x1a,0x18,0x19,0x18,0x19,0x1a,0x1a,0x14,0x1d,0x1f,0x18,0x19,0x19,0x15,0x17,0x15,0x1d,0x1a,0x25,0x0c,0x0c,0x18,0x15,0x0a,0x15,0x25,0x1f,0x18,0x20,0x29,0x21,0x19,0x19, +0x18,0x16,0x12,0x16,0x0c,0x0e,0x16,0x0e,0x16,0x20,0x1e,0x18,0x16,0x18,0x13,0x1a,0x1a,0x13,0x11,0x17,0x17,0x10,0x11,0x17,0x0a,0x10,0x13,0x0c,0x34,0x30,0x2b,0x24,0x1e,0x15,0x2d,0x29,0x22,0x1b,0x15,0x0b,0x0a,0x20,0x19,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x16,0x1b,0x15,0x1b,0x15,0x24,0x23,0x1d,0x19,0x1d,0x19, +0x18,0x15,0x20,0x19,0x20,0x19,0x1a,0x13,0x0a,0x34,0x30,0x2b,0x1d,0x19,0x2a,0x1d,0x1f,0x18,0x1b,0x15,0x1b,0x15,0x15,0x16,0x15,0x16,0x0b,0x0a,0x0b,0x0a,0x20,0x19,0x20,0x19,0x18,0x0f,0x19,0x0f,0x1d,0x18,0x1d,0x18,0x15,0x12,0x1e,0x18,0x1f,0x19,0x18,0x18,0x13,0x1b,0x15,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x17,0x14,0x19, +0x15,0x18,0x18,0x19,0x15,0x19,0x19,0x19,0x14,0x14,0x19,0x19,0x16,0x1a,0x11,0x11,0x15,0x17,0x0c,0x19,0x19,0x16,0x14,0x13,0x18,0x18,0x18,0x0b,0x0c,0x0d,0x0c,0x10,0x0a,0x19,0x24,0x24,0x24,0x17,0x17,0x19,0x19,0x1d,0x1e,0x1b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x13,0x13,0x11,0x0a,0x0b,0x0c,0x0c,0x0e,0x0e,0x19,0x19,0x17,0x14, +0x1e,0x14,0x12,0x13,0x16,0x13,0x13,0x0f,0x0f,0x0f,0x14,0x1a,0x14,0x17,0x16,0x18,0x0a,0x15,0x10,0x19,0x0f,0x0f,0x26,0x28,0x29,0x1a,0x14,0x1e,0x21,0x18,0x18,0x15,0x15,0x17,0x19,0x18,0x1c,0x18,0x1b,0x22,0x18,0x1d,0x19,0x18,0x13,0x15,0x13,0x19,0x15,0x1a,0x15,0x25,0x24,0x19,0x15,0x1b,0x16,0x1a,0x13,0x19,0x14,0x1c,0x19,0x18, +0x11,0x18,0x18,0x13,0x0a,0x20,0x14,0x14,0x24,0x1c,0x1b,0x18,0x26,0x1e,0x1c,0x15,0x25,0x1d,0x1f,0x18,0x27,0x1f,0x17,0x13,0x21,0x20,0x20,0x19,0x1e,0x18,0x1e,0x18,0x37,0x2f,0x23,0x1b,0x2f,0x26,0x24,0x1c,0x19,0x12,0x15,0x11,0x11,0x00,0x00,0x29,0x28,0x18,0x15,0x18,0x19,0x18,0x15,0x17,0x13,0x18,0x15,0x1e,0x18,0x23,0x1c,0x2a, +0x23,0x1e,0x17,0x1a,0x13,0x16,0x11,0x25,0x1d,0x1d,0x19,0x23,0x1b,0x23,0x1b,0x0b,0x24,0x1f,0x18,0x15,0x1e,0x18,0x1c,0x18,0x1b,0x15,0x1b,0x15,0x24,0x23,0x15,0x16,0x1e,0x16,0x1e,0x16,0x24,0x1f,0x17,0x13,0x16,0x13,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x1a,0x13,0x18,0x14,0x18,0x14,0x18,0x14,0x1c,0x18,0x21,0x1e,0x18,0x19, +0x24,0x24,0x22,0x1e,0x17,0x14,0x26,0x21,0x2a,0x24,0x1e,0x16,0x1c,0x19,0x19,0x18,0x18,0x15,0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x19,0x0e,0x0e,0x07,0x09,0x09,0x09,0x0c,0x11,0x0c,0x0a,0x10,0x09,0x09,0x09,0x0e,0x0e,0x09,0x09,0x19,0x19,0x19,0x19,0x0e,0x0c,0x0b,0x0e,0x0d,0x0b, +0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0e,0x0e,0x0c,0x07,0x0a,0x0c,0x09,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x11,0x0e,0x0a,0x0b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17, +0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1b,0x0e,0x19,0x19,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0e, +0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x19,0x14,0x1c,0x23,0x14,0x13,0x17,0x17,0x12,0x11,0x0a,0x0d,0x15,0x10,0x1d,0x18,0x19,0x14,0x1a,0x1a,0x1a,0x27,0x17,0x19,0x19,0x13,0x13,0x13,0x11,0x16,0x18,0x1e,0x18,0x14,0x1e,0x13,0x12,0x11,0x16,0x10,0x14,0x18,0x13,0x19,0x18,0x0f,0x14,0x0f,0x0f, +0x11,0x0d,0x0d,0x11,0x12,0x08,0x0a,0x0f,0x0c,0x16,0x12,0x12,0x12,0x10,0x0e,0x0e,0x0c,0x11,0x16,0x0d,0x0d,0x0f,0x14,0x0f,0x0f,0x0d,0x0d,0x0b,0x0b,0x0f,0x07,0x0d,0x15,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x08,0x0e,0x0e,0x15,0x0c,0x0d,0x0e,0x0c,0x0e,0x11,0x0d,0x07,0x09,0x0e,0x0c,0x0e,0x0c,0x0f,0x11,0x0d,0x18,0x07,0x0f,0x17,0x25, +0x1a,0x17,0x17,0x24,0x1b,0x24,0x1f,0x16,0x19,0x15,0x13,0x2f,0x13,0x19,0x25,0x27,0x27,0x1a,0x1b,0x1a,0x13,0x14,0x16,0x12,0x13,0x15,0x08,0x00,0x00,0x00,0x00,0x19,0x1a,0x1a,0x1a,0x14,0x10,0x19,0x19,0x0d,0x24,0x18,0x19,0x0f,0x0e,0x13,0x0e,0x13,0x19,0x13,0x18,0x26,0x1b,0x0d,0x0b,0x19,0x16,0x19,0x19,0x19,0x0d,0x19,0x15,0x0a, +0x24,0x18,0x19,0x0f,0x12,0x12,0x14,0x13,0x13,0x15,0x19,0x19,0x16,0x12,0x13,0x1f,0x0a,0x14,0x0a,0x18,0x13,0x0f,0x0b,0x0b,0x0e,0x0b,0x08,0x07,0x0f,0x0e,0x07,0x08,0x07,0x07,0x07,0x08,0x07,0x09,0x15,0x15,0x0e,0x0e,0x0f,0x0e,0x0f,0x0a,0x07,0x08,0x0e,0x0e,0x0e,0x0e,0x0c,0x0b,0x0b,0x0c,0x0b,0x0e,0x00,0x00,0x00,0x00,0x09,0x0d, +0x0d,0x0e,0x0b,0x0d,0x17,0x17,0x17,0x17,0x0e,0x00,0x00,0x00,0x00,0x13,0x0d,0x0b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0b,0x0b,0x0b,0x0b,0x17,0x17,0x17,0x17,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x17,0x0f,0x0f,0x0f,0x0f,0x0f, +0x0f,0x0d,0x0d,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x21,0x1b,0x1e,0x18,0x1f,0x1a,0x27,0x20,0x17,0x10,0x16,0x1d,0x16,0x22,0x1d,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x19,0x19,0x19,0x19, +0x19,0x19,0x23,0x23,0x2a,0x12,0x0b,0x15,0x19,0x12,0x15,0x15,0x19,0x19,0x15,0x2a,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x1b,0x15,0x15,0x15,0x0e,0x19,0x0e,0x20,0x1c,0x15,0x0e,0x23,0x15,0x23,0x0b,0x0e,0x19,0x19,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x23,0x0b,0x19,0x0b,0x15,0x12,0x0b,0x0b,0x15,0x0b,0x20,0x0b,0x27,0x15,0x27,0x27, +0x19,0x19,0x19,0x15,0x15,0x12,0x12,0x31,0x31,0x38,0x38,0x23,0x23,0x15,0x15,0x07,0x2a,0x20,0x23,0x1c,0x19,0x1c,0x15,0x15,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x1b,0x00,0x1b,0x1b,0x1b,0x0e,0x15,0x15,0x27,0x0e,0x27,0x0e,0x19,0x1c,0x19,0x12,0x27,0x15,0x27,0x15,0x20,0x23,0x0e,0x15,0x15,0x12,0x0b,0x15, +0x19,0x15,0x19,0x15,0x19,0x19,0x15,0x1c,0x1b,0x27,0x0e,0x15,0x12,0x1c,0x15,0x0e,0x15,0x15,0x15,0x27,0x0e,0x27,0x0e,0x0b,0x19,0x10,0x2a,0x15,0x15,0x1b,0x1b,0x2a,0x15,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1b,0x1b,0x1b,0x20,0x1b,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x15,0x15,0x20,0x23,0x27,0x0e,0x27,0x0e,0x27,0x0e, +0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x12,0x12,0x12,0x15,0x12,0x12,0x12,0x31,0x23,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x15,0x19,0x19,0x19,0x2a,0x2a,0x15,0x15,0x2a,0x15,0x15,0x2a,0x15,0x15, +0x2a,0x15,0x15,0x20,0x20,0x2e,0x2a,0x27,0x15,0x23,0x15,0x23,0x15,0x23,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x1c,0x0e,0x1c,0x0e,0x17,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x23,0x27,0x20,0x23,0x0e,0x15,0x20,0x23,0x20,0x23,0x00,0x00,0x00, +0x00,0x00,0x2f,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x12,0x00,0x00,0x19,0x00,0x00,0x00,0x31,0x23,0x38,0x2a,0x15,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x27,0x27,0x10,0x19,0x19,0x19,0x34,0x23,0x16,0x40,0x2e,0x0e,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x15,0x15,0x12,0x12,0x20,0x1c,0x1c,0x15,0x00,0x00,0x00,0x0e,0x0e,0x0e,0x0e,0x35,0x3f,0x00,0x00,0x00,0x00,0x00,0x19,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x12,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x1c,0x19,0x15,0x15,0x12,0x31,0x23,0x15,0x19,0x19,0x19,0x15,0x19,0x19, +0x19,0x15,0x19,0x19,0x19,0x2a,0x15,0x15,0x2a,0x15,0x15,0x27,0x15,0x15,0x27,0x15,0x15,0x27,0x15,0x15,0x19,0x19,0x19,0x19,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x1c,0x0e,0x0e,0x12,0x12,0x31,0x23,0x1b,0x19,0x19,0x00,0x15,0x15,0x15,0x10,0x18,0x1d,0x1a,0x15,0x16,0x0f,0x0a,0x20,0x19,0x19,0x0f,0x17,0x14,0x14,0x13,0x14,0x0a,0x16, +0x11,0x1a,0x14,0x19,0x13,0x17,0x12,0x1c,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x13,0x14,0x14,0x0c,0x16,0x18,0x19,0x15,0x0e,0x1f,0x19,0x1b,0x17,0x1a,0x15,0x18,0x16,0x11,0x1d,0x10,0x11,0x12,0x14,0x19,0x19,0x15,0x2a,0x15,0x2a,0x0e,0x0b,0x07,0x17,0x09,0x05,0x00,0x06,0x09,0x00,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x15,0x27,0x12,0x20,0x19,0x27,0x1e,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x27,0x24,0x14,0x24,0x14,0x24,0x1b,0x1d,0x1d,0x1d,0x20,0x24,0x2a,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1d,0x1f,0x18,0x2d,0x23,0x14,0x14,0x0c,0x0c,0x0c,0x10,0x09,0x18,0x0a,0x0a,0x23, +0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x08,0x00,0x00,0x09,0x00,0x00,0x1b,0x18,0x12,0x14,0x1c,0x0b,0x0e,0x1c,0x1d,0x0b,0x17,0x17,0x17,0x1d,0x1c,0x0b,0x11,0x1c,0x19,0x1a,0x1b,0x18,0x19,0x1c,0x17,0x21,0x1f,0x16,0x16,0x16,0x0a,0x10,0x17,0x17,0x17,0x17,0x17,0x19,0x1b,0x14,0x1c,0x17, +0x17,0x1d,0x17,0x1f,0x17,0x21,0x21,0x21,0x21,0x1b,0x1b,0x1b,0x18,0x12,0x14,0x1c,0x0d,0x0f,0x1d,0x0d,0x17,0x17,0x17,0x1c,0x11,0x1c,0x1a,0x1b,0x19,0x1c,0x17,0x21,0x1f,0x0b,0x18,0x17,0x1b,0x1b,0x32,0x00,0x1b,0x17,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x0b,0x00,0x20,0x1b,0x1c,0x1e,0x17,0x1c,0x1f,0x20,0x14,0x1a,0x1f,0x1f,0x1c,0x20,0x22,0x21,0x1c,0x17,0x18,0x20,0x1e,0x18,0x1d,0x1c,0x1c,0x1c,0x1d,0x1f,0x18,0x1b,0x1c,0x1b,0x21,0x1b,0x1a,0x1b,0x1c,0x22,0x15,0x19,0x19,0x25,0x17,0x17,0x20,0x25,0x1a,0x17, +0x2c,0x18,0x18,0x20,0x17,0x17,0x20,0x18,0x20,0x22,0x25,0x17,0x20,0x17,0x1b,0x17,0x1a,0x18,0x1b,0x17,0x19,0x20,0x17,0x1a,0x1c,0x17,0x17,0x19,0x28,0x17,0x17,0x19,0x19,0x12,0x0e,0x17,0x17,0x17,0x16,0x17,0x25,0x17,0x25,0x15,0x17,0x25,0x1c,0x17,0x25,0x1f,0x1f,0x25,0x18,0x17,0x25,0x25,0x17,0x17,0x17,0x17,0x17,0x17,0x25,0x25, +0x19,0x17,0x18,0x25,0x19,0x17,0x17,0x17,0x25,0x21,0x1d,0x1d,0x1d,0x1d,0x1e,0x1a,0x1d,0x21,0x1d,0x1b,0x17,0x21,0x1c,0x1d,0x18,0x1c,0x1d,0x1f,0x1e,0x19,0x1d,0x1c,0x1f,0x1c,0x21,0x1d,0x1e,0x1f,0x1d,0x1b,0x1d,0x1d,0x1e,0x21,0x1c,0x20,0x1e,0x04,0x05,0x06,0x08,0x06,0x0b,0x0f,0x24,0x18,0x1a,0x19,0x18,0x1a,0x18,0x18,0x1b,0x19, +0x18,0x0d,0x23,0x19,0x18,0x18,0x17,0x19,0x16,0x18,0x0b,0x19,0x16,0x18,0x11,0x24,0x17,0x18,0x18,0x19,0x23,0x18,0x19,0x11,0x23,0x19,0x19,0x1d,0x1d,0x09,0x0c,0x30,0x2f,0x2f,0x30,0x3c,0x17,0x17,0x0a,0x17,0x10,0x17,0x17,0x18,0x17,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x18, +0x17,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x15,0x15,0x15,0x19,0x12,0x12,0x18,0x1a,0x0b,0x0d,0x15,0x11,0x20,0x1b,0x1a,0x14,0x1a,0x15,0x12,0x12,0x19,0x15,0x22,0x15,0x14,0x14,0x1e,0x21,0x11,0x1a,0x14,0x19,0x16,0x15,0x15,0x15,0x15,0x15,0x15, +0x15,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x19,0x19,0x19,0x19,0x14,0x15,0x15,0x15,0x15,0x15,0x18,0x19,0x19,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x15,0x1a,0x1a,0x0b,0x0b,0x0b,0x0b,0x0b,0x18,0x0d,0x15,0x11,0x11,0x11,0x11,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x15,0x15,0x15,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x22,0x22,0x22,0x22,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x1e,0x1a,0x15,0x15,0x10,0x17,0x12,0x14,0x1a,0x1a,0x0b,0x15,0x15,0x20,0x1b,0x13,0x1a,0x1a,0x14,0x13,0x12,0x14,0x1a,0x15,0x1c,0x1b,0x15,0x12,0x1a,0x0b,0x1a,0x14,0x1b,0x0b,0x14,0x12,0x18,0x11,0x16,0x12,0x0b,0x0b,0x0d, +0x22,0x23,0x1a,0x15,0x15,0x1a,0x15,0x14,0x15,0x11,0x19,0x12,0x1f,0x13,0x1b,0x1b,0x15,0x18,0x20,0x1a,0x1a,0x1a,0x14,0x15,0x12,0x15,0x1a,0x15,0x1b,0x17,0x22,0x23,0x18,0x1e,0x15,0x16,0x24,0x15,0x11,0x18,0x18,0x1a,0x25,0x25,0x1c,0x15,0x18,0x12,0x18,0x18,0x18,0x1d,0x16,0x16,0x1d,0x18,0x18,0x0f,0x1a,0x1a,0x18,0x15,0x15,0x26, +0x1f,0x14,0x16,0x19,0x19,0x1a,0x1a,0x1e,0x1d,0x0f,0x27,0x19,0x17,0x18,0x1b,0x1b,0x15,0x15,0x0b,0x20,0x1d,0x1d,0x14,0x1d,0x09,0x09,0x12,0x12,0x09,0x09,0x1a,0x11,0x0b,0x20,0x1e,0x0c,0x09,0x09,0x13,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x1c,0x14,0x0d,0x19,0x1d,0x19,0x18,0x15,0x1f,0x18,0x19,0x0f,0x12,0x16,0x12,0x09,0x0a,0x10,0x16, +0x0e,0x1c,0x1c,0x1c,0x27,0x20,0x27,0x0b,0x00,0x00,0x00,0x00,0x00,0x0b,0x20,0x23,0x0e,0x0e,0x15,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x15,0x15,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x27,0x15,0x15,0x27,0x27,0x15,0x15,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e, +0x0e,0x2a,0x20,0x23,0x15,0x19,0x19,0x1c,0x0e,0x1c,0x20,0x15,0x15,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x27,0x0e,0x20,0x15,0x15,0x0b,0x15,0x15,0x15,0x15,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15, +0x15,0x15,0x15,0x15,0x15,0x15,0x31,0x23,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x23,0x23,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x20,0x15,0x15,0x20,0x15,0x15,0x27,0x15,0x2e,0x2a,0x27,0x15,0x23,0x15,0x23,0x15,0x23,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x1c,0x1c,0x1c,0x1c,0x1c,0x0e,0x1c,0x1c,0x0e, +0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x15,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x0e,0x0e,0x15,0x0e,0x0e,0x0e,0x0e,0x00,0x31,0x23,0x38,0x2a,0x27,0x15,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x15,0x15,0x12,0x31,0x23,0x2a,0x2a,0x27,0x27,0x27,0x19,0x19,0x19,0x19,0x1c,0x0e,0x1c,0x0e, +0x1c,0x0e,0x31,0x23,0x19,0x1c,0x19,0x19,0x19,0x1c,0x19,0x19,0x31,0x31,0x23,0x23,0x12,0x12,0x19,0x19,0x19,0x19,0x0e,0x0e,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x19,0x19,0x19,0x19,0x27,0x0e,0x27,0x0e,0x19,0x1c,0x19,0x19,0x31,0x31,0x23,0x23,0x31,0x31,0x23,0x23,0x23,0x23,0x15,0x15,0x0b,0x0b, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x0b,0x0b,0x0e,0x0b,0x00,0x00,0x00,0x23,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b, +0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x20,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x19,0x23,0x19,0x23,0x19,0x23,0x19,0x23,0x1c,0x1c,0x1c,0x0b,0x0b,0x15,0x12,0x18,0x1b,0x18,0x17,0x17,0x19,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x16,0x13,0x17,0x16,0x19,0x1a,0x1a,0x1c,0x18,0x18,0x1b,0x16,0x1c,0x20,0x1b,0x1f,0x23,0x1b,0x20,0x1d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x16,0x13,0x17,0x19,0x19,0x1c,0x18,0x1b,0x18,0x19,0x19,0x15,0x15,0x20,0x1d,0x1d,0x1c,0x1d,0x19,0x18,0x18,0x1f,0x20,0x20,0x20,0x27,0x27,0x1d,0x27,0x27, +0x1f,0x25,0x24,0x17,0x20,0x24,0x20,0x19,0x24,0x1f,0x1d,0x1d,0x19,0x1b,0x1f,0x21,0x1d,0x1a,0x1e,0x18,0x16,0x27,0x27,0x27,0x23,0x27,0x27,0x1d,0x27,0x27,0x1e,0x20,0x21,0x1f,0x1e,0x1e,0x1b,0x25,0x20,0x23,0x1e,0x1e,0x18,0x1f,0x1d,0x1d,0x24,0x20,0x1e,0x26,0x17,0x15,0x17,0x17,0x1a,0x1a,0x1d,0x1f,0x18,0x18,0x18,0x17,0x18,0x17, +0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x15,0x16,0x19,0x1a,0x19,0x19,0x13,0x18,0x18,0x19,0x19,0x20,0x23,0x1b,0x1b,0x1a,0x20,0x1b,0x1d,0x16,0x14,0x19,0x18,0x14,0x15,0x17,0x17,0x14,0x14,0x1a,0x13,0x17,0x15,0x17,0x21,0x18,0x23,0x17,0x18,0x18,0x1f,0x0d,0x21,0x1d,0x1e,0x1c,0x18,0x20,0x19,0x21,0x19,0x19,0x19,0x19,0x19,0x19,0x18, +0x19,0x19,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x14,0x13,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x1a,0x0b,0x0b,0x0b,0x0d,0x0d,0x0b,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x26,0x26,0x26,0x26,0x15,0x1f,0x1e,0x15,0x11,0x15,0x16,0x17,0x15,0x23,0x23,0x24,0x13,0x2a,0x15,0x23,0x23,0x23,0x22,0x18,0x15, +0x15,0x21,0x19,0x21,0x1c,0x16,0x13,0x11,0x2b,0x11,0x16,0x15,0x15,0x15,0x15,0x15,0x39,0x23,0x23,0x12,0x0b,0x13,0x0a,0x13,0x0a,0x0a,0x0a,0x14,0x19,0x19,0x17,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x0a,0x11,0x24,0x09,0x26,0x26,0x26,0x19,0x19,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x31,0x31,0x1c,0x31,0x31,0x1c,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x14,0x18,0x14,0x16,0x12,0x0f,0x0f,0x1d,0x17,0x1e,0x12,0x2f,0x26,0x19,0x17,0x27,0x21,0x23,0x1f,0x2b,0x22,0x27,0x20,0x1b,0x14,0x1f,0x19,0x27,0x1f,0x20,0x1a,0x1f,0x19, +0x24,0x1c,0x25,0x1c,0x2e,0x23,0x20,0x19,0x20,0x19,0x33,0x25,0x21,0x00,0x29,0x29,0x29,0x14,0x00,0x00,0x18,0x15,0x1d,0x17,0x16,0x12,0x2d,0x26,0x28,0x24,0x1e,0x18,0x1d,0x19,0x16,0x11,0x1f,0x19,0x16,0x11,0x22,0x1c,0x1c,0x18,0x29,0x22,0x17,0x18,0x1f,0x1f,0x22,0x13,0x08,0x13,0x1d,0x12,0x2a,0x2a,0x0a,0x00,0x29,0x29,0x29,0x29, +0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x11,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x17,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, +0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x1c,0x1f,0x0c,0x09,0x0c,0x09,0x1e,0x18,0x1f,0x1a,0x17,0x14,0x16,0x14,0x19,0x18,0x12,0x12,0x2f,0x22,0x30,0x25,0x29,0x24,0x26,0x1c,0x26,0x1c,0x26,0x1c,0x1a,0x13,0x18,0x15,0x18,0x15,0x18,0x15,0x17,0x0d,0x14,0x0a,0x20,0x19,0x24,0x1c,0x38,0x2a,0x18, +0x19,0x1d,0x1e,0x22,0x24,0x20,0x19,0x29,0x21,0x17,0x11,0x17,0x15,0x1a,0x14,0x27,0x1e,0x1a,0x16,0x18,0x19,0x18,0x19,0x14,0x11,0x14,0x10,0x14,0x0f,0x16,0x16,0x0d,0x1c,0x0e,0x28,0x1c,0x0f,0x18,0x1a,0x13,0x20,0x17,0x10,0x0f,0x18,0x18,0x18,0x14,0x0a,0x20,0x19,0x10,0x0f,0x1a,0x13,0x1e,0x10,0x21,0x19,0x1a,0x13,0x1d,0x19,0x18, +0x15,0x1f,0x18,0x19,0x0f,0x16,0x12,0x20,0x12,0x16,0x24,0x15,0x18,0x26,0x0b,0x30,0x26,0x26,0x32,0x25,0x26,0x26,0x25,0x25,0x27,0x16,0x14,0x1a,0x1d,0x26,0x1d,0x28,0x0a,0x13,0x19,0x24,0x2b,0x1d,0x2b,0x1a,0x1a,0x21,0x1d,0x30,0x27,0x16,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x23,0x23,0x23,0x23,0x2a,0x15,0x15,0x2a,0x20,0x15, +0x15,0x20,0x1c,0x0e,0x0e,0x1c,0x19,0x19,0x19,0x19,0x20,0x0e,0x0e,0x23,0x20,0x0e,0x0e,0x23,0x12,0x12,0x15,0x15,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x16,0x11,0x18,0x16,0x1f,0x18,0x18,0x25,0x1c,0x1f,0x20,0x23, +0x22,0x18,0x15,0x2a,0x22,0x2c,0x24,0x1d,0x19,0x0d,0x0d,0x19,0x1b,0x11,0x19,0x16,0x18,0x14,0x1f,0x22,0x11,0x19,0x12,0x09,0x10,0x16,0x17,0x09,0x09,0x08,0x09,0x10,0x10,0x10,0x13,0x3f,0x54,0x0e,0x11,0x06,0x0b,0x10,0x12,0x0d,0x15,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x38,0x17,0x20, +0x27,0x26,0x1b,0x13,0x18,0x1e,0x1f,0x15,0x0d,0x1c,0x16,0x1d,0x17,0x1c,0x16,0x17,0x1f,0x19,0x18,0x16,0x1f,0x1a,0x23,0x13,0x16,0x1b,0x0d,0x19,0x0e,0x0f,0x0a,0x25,0x18,0x18,0x16,0x16,0x19,0x27,0x27,0x28,0x2a,0x2a,0x17,0x15,0x0c,0x15,0x13,0x1a,0x13,0x1c,0x0a,0x18,0x19,0x24,0x24,0x1a,0x17,0x18,0x17,0x16,0x13,0x16,0x13,0x14, +0x0d,0x0e,0x0a,0x09,0x0f,0x18,0x1b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x00,0x0c,0x0c,0x0c,0x0b,0x0b,0x47,0x2a,0x25,0x2c,0x0c,0x0c,0x0e,0x11,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x27,0x0e,0x0e,0x27,0x0b,0x15,0x15,0x38,0x2a,0x2a,0x38,0x27,0x15,0x15, +0x27,0x15,0x15,0x12,0x12,0x00,0x00,0x0f,0x1f,0x19,0x1e,0x18,0x35,0x2b,0x1d,0x17,0x1d,0x17,0x38,0x2a,0x20,0x19,0x10,0x0d,0x1a,0x00,0x1d,0x17,0x0e,0x0d,0x07,0x15,0x0e,0x0e,0x0b,0x08,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x09,0x16,0x12,0x19,0x18,0x17,0x28,0x22,0x22,0x21,0x22,0x28,0x1a,0x1d,0x19,0x11,0x27,0x2f,0x12, +0x31,0x15,0x23,0x27,0x27,0x27,0x12,0x20,0x2a,0x20,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x19,0x19,0x19,0x23,0x15,0x15,0x27,0x0e,0x0e,0x27,0x0e,0x0e,0x27,0x15,0x15,0x00,0x12,0x23,0x0e,0x0e,0x2a,0x15,0x15,0x20,0x15,0x15,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0c,0x0c,0x0c,0x3f,0x3f,0x25,0x00,0x00,0x25,0x25,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x1c,0x1a,0x1b,0x1b,0x25,0x1b,0x1a,0x22,0x29,0x1b,0x1a,0x2d,0x1b,0x1b,0x27,0x1a,0x1c,0x21,0x1b,0x20,0x24,0x26,0x1b,0x20,0x1b,0x1d,0x1a,0x1d,0x1a,0x1c,0x1d,0x1a,0x21,0x19,0x1c,0x21, +0x1a,0x1a,0x18,0x21,0x1b,0x1b,0x1b,0x1d,0x13,0x16,0x1b,0x21,0x21,0x17,0x00,0x00,0x2e,0x5c,0x1e,0x00,0x04,0x0d,0x0d,0x12,0x1b,0x19,0x26,0x25,0x0b,0x0e,0x0e,0x13,0x1f,0x0a,0x12,0x0a,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0a,0x0a,0x1f,0x1f,0x1f,0x15,0x2c,0x1e,0x1a,0x1c,0x20,0x17,0x16,0x20,0x21,0x0c,0x10, +0x1b,0x16,0x29,0x22,0x23,0x1a,0x23,0x1c,0x18,0x18,0x20,0x1d,0x2b,0x1b,0x19,0x1a,0x0e,0x11,0x0e,0x1f,0x13,0x0c,0x17,0x1b,0x15,0x1b,0x18,0x0e,0x1b,0x1a,0x0b,0x0b,0x17,0x0b,0x28,0x1a,0x1b,0x1b,0x1b,0x10,0x14,0x10,0x1a,0x16,0x21,0x15,0x16,0x15,0x0e,0x0b,0x0e,0x1f,0x1e,0x1e,0x1c,0x17,0x22,0x23,0x20,0x17,0x17,0x17,0x17,0x17, +0x17,0x15,0x18,0x18,0x18,0x18,0x0b,0x0b,0x0b,0x0b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x19,0x19,0x15,0x13,0x15,0x19,0x12,0x29,0x29,0x24,0x0d,0x13,0x20,0x28,0x23,0x26,0x1f,0x20,0x20,0x19,0x1b,0x19,0x1c,0x23,0x19,0x12,0x14,0x23,0x26,0x1b,0x15,0x0d,0x0d,0x1f,0x1e,0x19,0x20,0x1e,0x17,0x17,0x22,0x1e, +0x1e,0x23,0x2b,0x2b,0x17,0x2e,0x11,0x11,0x0b,0x0b,0x1f,0x1b,0x16,0x19,0x08,0x19,0x0f,0x0f,0x1a,0x1a,0x11,0x0a,0x0b,0x11,0x38,0x1e,0x17,0x1e,0x17,0x17,0x0c,0x0c,0x0c,0x0c,0x23,0x23,0x23,0x20,0x20,0x20,0x0b,0x11,0x10,0x0e,0x0e,0x09,0x0d,0x09,0x0f,0x09,0x11,0x16,0x0d,0x18,0x14,0x1a,0x15,0x0b,0x20,0x1a,0x19,0x16,0x1a,0x1b, +0x1f,0x1f,0x10,0x11,0x11,0x2b,0x2a,0x2c,0x16,0x20,0x1b,0x0c,0x18,0x14,0x1c,0x15,0x1c,0x15,0x1b,0x13,0x0a,0x1e,0x17,0x1e,0x17,0x20,0x1f,0x20,0x17,0x18,0x17,0x18,0x16,0x0b,0x16,0x0e,0x16,0x0e,0x22,0x1a,0x22,0x1a,0x23,0x1b,0x1c,0x10,0x1c,0x10,0x18,0x14,0x18,0x10,0x18,0x14,0x20,0x1a,0x20,0x1a,0x1a,0x15,0x1a,0x15,0x16,0x23, +0x23,0x1c,0x1b,0x14,0x1a,0x16,0x20,0x13,0x16,0x12,0x33,0x1d,0x17,0x1c,0x0b,0x11,0x25,0x0f,0x1c,0x10,0x10,0x1c,0x10,0x1e,0x17,0x1c,0x15,0x1c,0x15,0x17,0x18,0x17,0x18,0x17,0x18,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x21,0x1a,0x21,0x1a,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x10,0x0b,0x1b,0x17,0x17,0x16,0x0b,0x22,0x1a,0x22,0x1a, +0x23,0x1b,0x23,0x1b,0x1c,0x10,0x18,0x14,0x18,0x10,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x2b,0x21,0x19,0x16,0x0b,0x1e,0x17,0x28,0x26,0x23,0x1b,0x0a,0x2b,0x21,0x2b,0x21,0x2b,0x21,0x19,0x16,0x0b,0x13,0x19,0x1c,0x2a,0x2a,0x2b,0x29,0x12,0x12,0x0a,0x0d,0x0d,0x1e,0x1a,0x24,0x11,0x25,0x1f,0x26,0x0c,0x1e,0x1a,0x17,0x1a,0x21, +0x0c,0x1b,0x1d,0x29,0x22,0x17,0x23,0x21,0x1a,0x18,0x18,0x19,0x1b,0x24,0x23,0x0c,0x19,0x1c,0x14,0x1a,0x0c,0x19,0x19,0x18,0x14,0x1a,0x1b,0x0c,0x18,0x17,0x1b,0x18,0x14,0x1b,0x1b,0x15,0x19,0x19,0x23,0x25,0x0c,0x19,0x1b,0x19,0x25,0x17,0x20,0x16,0x1c,0x18,0x0c,0x2d,0x2d,0x21,0x1b,0x1a,0x21,0x1e,0x1a,0x1a,0x16,0x20,0x17,0x28, +0x19,0x22,0x22,0x1b,0x1f,0x29,0x21,0x23,0x21,0x1a,0x1c,0x18,0x1a,0x21,0x1b,0x22,0x1e,0x2c,0x2d,0x20,0x24,0x1b,0x1c,0x2f,0x1b,0x17,0x1b,0x18,0x12,0x19,0x18,0x22,0x15,0x1b,0x1b,0x17,0x18,0x20,0x1b,0x1b,0x1b,0x1b,0x15,0x13,0x16,0x20,0x15,0x1c,0x1a,0x25,0x26,0x1b,0x21,0x17,0x15,0x25,0x17,0x18,0x1b,0x12,0x15,0x14,0x0b,0x24, +0x25,0x1a,0x17,0x16,0x1b,0x16,0x12,0x2e,0x34,0x1d,0x10,0x11,0x11,0x11,0x0b,0x18,0x14,0x1a,0x23,0x1b,0x21,0x1b,0x0e,0x0f,0x0c,0x0c,0x16,0x16,0x16,0x16,0x0e,0x0e,0x0e,0x16,0x0e,0x16,0x0e,0x0e,0x0e,0x16,0x16,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e, +0x17,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x0c,0x0b,0x0c,0x0b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x20,0x1a,0x20,0x1a,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x19,0x16,0x19,0x16,0x19, +0x16,0x18,0x10,0x17,0x18,0x22,0x1b,0x0c,0x10,0x0b,0x0b,0x18,0x13,0x2a,0x24,0x1c,0x18,0x1b,0x17,0x22,0x1c,0x19,0x16,0x19,0x16,0x1d,0x17,0x1e,0x1a,0x1e,0x1a,0x21,0x18,0x23,0x1b,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x17,0x18,0x1e,0x17,0x1a,0x1b,0x1a,0x1b,0x1a,0x1b,0x1c,0x15,0x20, +0x1b,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x16,0x0e,0x20,0x1b,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x0c,0x0b,0x0c,0x0b,0x1b,0x17,0x1b,0x17,0x1b,0x17,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x29,0x28,0x29,0x28,0x29,0x28,0x22,0x1a,0x22,0x1a,0x22,0x1a,0x22, +0x1a,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x1a,0x1b,0x1a,0x1b,0x1c,0x10,0x1c,0x10,0x1c,0x10,0x1c,0x10,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x10,0x18,0x10,0x18,0x10,0x18,0x10,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x1d,0x16,0x1d,0x16,0x2b,0x21,0x2b,0x21,0x1b,0x15,0x1b,0x15,0x19,0x16,0x1a, +0x15,0x1a,0x15,0x1a,0x15,0x1a,0x10,0x21,0x16,0x17,0x0b,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x22,0x22,0x22,0x22,0x22,0x22,0x14,0x14,0x14,0x14,0x14,0x14,0x1a,0x1a,0x21,0x21,0x21,0x21,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11, +0x11,0x17,0x17,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x2c,0x2c,0x2c,0x2c,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1f,0x26,0x26,0x26,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x1c,0x1c,0x14,0x14,0x1a,0x1a,0x0c,0x0c,0x1b,0x1b,0x19,0x19,0x25,0x25,0x1c,0x1c,0x1c, +0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x21,0x1b,0x1b,0x1b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x19,0x1b,0x1b,0x19,0x19,0x19,0x19,0x1f,0x1f,0x1d,0x1b,0x1b,0x1b,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x27,0x26,0x23,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x1b,0x1c,0x1a,0x1b,0x1b,0x1b,0x1d,0x1d,0x15,0x20,0x22,0x1a,0x1b,0x1b,0x17,0x19,0x16,0x20,0x1d,0x28,0x0d,0x0d,0x1b,0x17,0x0b,0x17,0x29,0x22,0x1a,0x23,0x2d,0x24,0x1c,0x1b,0x1b,0x18,0x14,0x18,0x0e,0x10,0x18,0x10,0x18,0x23,0x21,0x1a,0x18,0x1a,0x15,0x1c,0x1c,0x14,0x13,0x19,0x19,0x11,0x12,0x19,0x0b,0x12,0x15,0x0d, +0x39,0x34,0x2f,0x27,0x21,0x17,0x31,0x2d,0x25,0x1e,0x17,0x0c,0x0b,0x23,0x1b,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x18,0x1e,0x17,0x1e,0x17,0x28,0x26,0x20,0x1b,0x20,0x1b,0x1b,0x17,0x23,0x1b,0x23,0x1b,0x1c,0x14,0x0b,0x39,0x34,0x2f,0x20,0x1b,0x2e,0x20,0x22,0x1a,0x1e,0x17,0x1e,0x17,0x17,0x18,0x17,0x18,0x0c,0x0b, +0x0c,0x0b,0x23,0x1b,0x23,0x1b,0x1a,0x10,0x1c,0x10,0x20,0x1a,0x20,0x1a,0x17,0x14,0x21,0x1a,0x22,0x1b,0x1a,0x1a,0x15,0x1e,0x17,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x19,0x16,0x1b,0x17,0x1a,0x1a,0x1b,0x17,0x1b,0x1b,0x1b,0x15,0x15,0x1b,0x1b,0x18,0x1c,0x13,0x13,0x17,0x19,0x0d,0x1b,0x1b,0x18,0x16,0x15,0x1a,0x1a,0x1a,0x0c, +0x0d,0x0f,0x0d,0x11,0x0b,0x1c,0x28,0x28,0x28,0x1a,0x1a,0x1b,0x1b,0x20,0x21,0x1d,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x15,0x15,0x12,0x0b,0x0c,0x0d,0x0d,0x10,0x10,0x1c,0x1b,0x1a,0x16,0x21,0x16,0x13,0x15,0x18,0x14,0x14,0x11,0x11,0x11,0x15,0x1c,0x16,0x19,0x18,0x1a,0x0b,0x17,0x12,0x1b,0x11,0x11,0x2a,0x2c,0x2d,0x1c,0x16,0x21, +0x24,0x1b,0x1a,0x17,0x17,0x19,0x1b,0x1a,0x1f,0x1a,0x1d,0x25,0x1a,0x20,0x1b,0x1b,0x15,0x17,0x15,0x1b,0x17,0x1c,0x17,0x29,0x28,0x1c,0x17,0x1d,0x19,0x1c,0x15,0x1b,0x16,0x1e,0x1b,0x1a,0x13,0x1a,0x1b,0x15,0x0b,0x23,0x15,0x15,0x28,0x1f,0x1e,0x1b,0x2a,0x21,0x1f,0x17,0x28,0x20,0x21,0x1a,0x2b,0x22,0x19,0x15,0x24,0x23,0x23,0x1b, +0x21,0x1b,0x21,0x1b,0x3c,0x33,0x26,0x1e,0x34,0x29,0x28,0x1f,0x1b,0x14,0x17,0x12,0x13,0x00,0x00,0x2d,0x2c,0x1b,0x17,0x1a,0x1b,0x1a,0x17,0x19,0x15,0x1b,0x17,0x21,0x1b,0x27,0x1f,0x2f,0x26,0x21,0x1a,0x1c,0x15,0x18,0x13,0x28,0x1f,0x20,0x1b,0x26,0x1d,0x26,0x1d,0x0c,0x28,0x22,0x1b,0x17,0x21,0x1b,0x1e,0x1a,0x1e,0x17,0x1e,0x17, +0x28,0x26,0x17,0x18,0x21,0x18,0x21,0x18,0x28,0x22,0x19,0x15,0x18,0x14,0x22,0x1b,0x22,0x1b,0x23,0x1b,0x23,0x1b,0x1c,0x15,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1e,0x1a,0x24,0x21,0x1a,0x1b,0x27,0x28,0x25,0x21,0x1a,0x16,0x2a,0x25,0x2e,0x27,0x21,0x18,0x1f,0x1c,0x1b,0x1a,0x1a,0x17,0x1b,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x1b,0x0f,0x0f,0x08,0x0a,0x0a,0x0a,0x0d,0x12,0x0d,0x0b,0x11,0x0a,0x0a,0x0a,0x0f,0x0f,0x0a,0x0a,0x1b,0x1b,0x1b,0x1b,0x0f,0x0d,0x0c,0x0f,0x0e,0x0c,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0d,0x07,0x0b,0x0d,0x0a,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x0f,0x13,0x0f,0x0b,0x0c, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19, +0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19, +0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x1e,0x0e,0x1d,0x10,0x1b,0x1b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0f,0x0f,0x10,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1b,0x16,0x1e,0x26,0x16,0x15,0x19,0x1a,0x13,0x13,0x0b,0x0e,0x17, +0x12,0x20,0x1b,0x1b,0x16,0x1c,0x1c,0x1c,0x2b,0x19,0x1b,0x1b,0x15,0x15,0x15,0x13,0x19,0x1a,0x21,0x1a,0x16,0x21,0x15,0x13,0x13,0x18,0x12,0x16,0x1b,0x15,0x1b,0x1a,0x11,0x16,0x10,0x10,0x13,0x0e,0x0e,0x13,0x14,0x08,0x0a,0x10,0x0d,0x18,0x14,0x14,0x14,0x12,0x10,0x10,0x0d,0x13,0x18,0x0e,0x0e,0x10,0x16,0x10,0x10,0x0e,0x0e,0x0c, +0x0c,0x10,0x08,0x0e,0x17,0x0f,0x10,0x0c,0x10,0x10,0x10,0x09,0x0f,0x0f,0x17,0x0d,0x0f,0x0f,0x0d,0x10,0x13,0x0e,0x08,0x0a,0x0f,0x0d,0x0f,0x0d,0x10,0x13,0x0e,0x1b,0x08,0x10,0x19,0x28,0x1d,0x19,0x19,0x28,0x1e,0x27,0x22,0x18,0x1b,0x17,0x15,0x34,0x15,0x1b,0x29,0x2b,0x2b,0x1d,0x1e,0x1c,0x15,0x16,0x18,0x14,0x15,0x18,0x09,0x00, +0x00,0x00,0x00,0x1b,0x1c,0x1c,0x1c,0x16,0x12,0x1b,0x1b,0x0e,0x28,0x1a,0x1b,0x10,0x0f,0x15,0x10,0x15,0x1b,0x15,0x1b,0x2a,0x1e,0x0f,0x0c,0x1b,0x19,0x1b,0x1b,0x1b,0x0e,0x1b,0x17,0x0b,0x28,0x1a,0x1b,0x10,0x14,0x14,0x16,0x15,0x15,0x17,0x1b,0x1b,0x18,0x14,0x15,0x22,0x0b,0x15,0x0b,0x1a,0x14,0x10,0x0c,0x0c,0x10,0x0c,0x08,0x08, +0x10,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0a,0x17,0x17,0x0f,0x0f,0x10,0x0f,0x11,0x0b,0x08,0x09,0x0f,0x10,0x0f,0x0f,0x0d,0x0c,0x0c,0x0e,0x0c,0x10,0x00,0x00,0x00,0x00,0x0a,0x0e,0x0e,0x10,0x0c,0x0e,0x19,0x19,0x19,0x19,0x0f,0x00,0x00,0x00,0x00,0x15,0x0e,0x0c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c, +0x0c,0x0c,0x0c,0x0c,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0c,0x0c,0x0c,0x0c,0x19,0x19,0x19,0x19,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x19,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x08,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x0e,0x0e,0x24,0x1d,0x21,0x1b,0x22,0x1d,0x2b,0x23,0x19,0x11,0x18,0x1f,0x19,0x26,0x20,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x2e,0x13,0x0c,0x17,0x1b,0x13,0x17,0x17,0x1b,0x1b,0x17,0x2e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x1e,0x17,0x17,0x17, +0x0f,0x1b,0x0f,0x23,0x1f,0x17,0x0f,0x26,0x17,0x26,0x0c,0x0f,0x1b,0x1b,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x26,0x0c,0x1b,0x0c,0x17,0x13,0x0c,0x0c,0x17,0x0c,0x23,0x0c,0x2a,0x17,0x2a,0x2a,0x1b,0x1b,0x1b,0x17,0x17,0x13,0x13,0x36,0x36,0x3d,0x3d,0x26,0x26,0x17,0x17,0x08,0x2e,0x23,0x26,0x1f,0x1b,0x1f,0x17,0x17,0x23,0x23,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1e,0x00,0x1e,0x1e,0x1e,0x0f,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x1b,0x1f,0x1b,0x13,0x2a,0x17,0x2a,0x17,0x23,0x26,0x0f,0x17,0x17,0x13,0x0c,0x17,0x1b,0x17,0x1b,0x17,0x1b,0x1b,0x17,0x1f,0x1e,0x2a,0x0f,0x17,0x13,0x1f,0x17,0x0f,0x17,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x0c,0x1b,0x12,0x2e,0x17, +0x17,0x1e,0x1e,0x2e,0x17,0x00,0x00,0x00,0x1e,0x00,0x1e,0x1e,0x1e,0x1e,0x23,0x1e,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x17,0x17,0x23,0x26,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1f,0x1b,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x13,0x13,0x13,0x17,0x13,0x13,0x13,0x36,0x26,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x17,0x1b,0x1b,0x1b,0x2e,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2e,0x17,0x17,0x23,0x23,0x32,0x2e,0x2a,0x17,0x26,0x17,0x26,0x17,0x26,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x1f,0x0f,0x1f, +0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x1f,0x0f,0x1f,0x0f,0x19,0x1f,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x26,0x2a,0x23,0x26,0x0f,0x17,0x23,0x26,0x23,0x26,0x00,0x00,0x00,0x00,0x00,0x34,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x13,0x00,0x00,0x1c,0x00,0x00,0x00,0x36,0x26,0x3d,0x2e,0x17,0x1b,0x1b,0x1b,0x13,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x2a,0x2a,0x11,0x1b,0x1b,0x1b,0x38,0x26,0x18,0x46,0x32,0x0f,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x17,0x13,0x13,0x23,0x1f,0x1f,0x17,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x3a,0x45,0x00,0x00,0x00,0x00,0x00,0x1b,0x17,0x00,0x00, +0x00,0x00,0x00,0x00,0x2a,0x13,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1f,0x1b,0x17,0x17,0x13,0x36,0x26,0x17,0x1b,0x1b,0x1b,0x17,0x1b,0x1b,0x1b,0x17,0x1b,0x1b,0x1b,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2a,0x17,0x17,0x2a,0x17,0x17,0x2a,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1f,0x0f,0x1f,0x0f, +0x1f,0x0f,0x1f,0x1f,0x0f,0x0f,0x13,0x13,0x36,0x26,0x1e,0x1b,0x1b,0x00,0x17,0x17,0x17,0x11,0x1a,0x20,0x1d,0x17,0x18,0x10,0x0b,0x23,0x1b,0x1c,0x10,0x19,0x16,0x16,0x15,0x16,0x0b,0x18,0x13,0x1c,0x16,0x1b,0x15,0x19,0x14,0x1f,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x15,0x16,0x16,0x0d,0x18,0x1a,0x1c,0x17,0x10, +0x22,0x1b,0x1d,0x19,0x1d,0x17,0x1a,0x18,0x12,0x20,0x11,0x13,0x13,0x16,0x1c,0x1c,0x17,0x2e,0x17,0x2e,0x0f,0x0c,0x08,0x19,0x0a,0x06,0x00,0x06,0x0a,0x00,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x2b,0x14,0x23,0x1b,0x2b,0x21,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x2a,0x28,0x16, +0x28,0x16,0x28,0x1e,0x1f,0x20,0x20,0x23,0x28,0x2e,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x1f,0x1f,0x1f,0x1f,0x22,0x1b,0x31,0x26,0x16,0x16,0x0d,0x0d,0x0d,0x11,0x0a,0x1a,0x0b,0x0b,0x26,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x09,0x00,0x00,0x0a,0x00,0x00,0x1d,0x1a,0x14,0x16,0x1f,0x0c, +0x10,0x1f,0x1f,0x0c,0x1a,0x19,0x19,0x20,0x1f,0x0c,0x12,0x1f,0x1c,0x1c,0x1d,0x1a,0x1b,0x1f,0x1a,0x24,0x21,0x18,0x18,0x18,0x0b,0x11,0x1a,0x1a,0x19,0x19,0x19,0x1c,0x1d,0x16,0x1f,0x19,0x19,0x20,0x1a,0x21,0x19,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1a,0x14,0x16,0x1f,0x0e,0x10,0x1f,0x0e,0x1a,0x19,0x19,0x1f,0x12,0x1f,0x1c,0x1d, +0x1b,0x1f,0x1a,0x24,0x21,0x0c,0x1a,0x19,0x1d,0x1e,0x37,0x00,0x1d,0x19,0x1e,0x1e,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x0c,0x00,0x23,0x1e,0x1f,0x20,0x19,0x1f,0x22,0x23,0x16,0x1d,0x22,0x22, +0x1e,0x23,0x25,0x24,0x1f,0x19,0x1a,0x23,0x20,0x1a,0x20,0x1f,0x1e,0x1f,0x20,0x22,0x1b,0x1d,0x1f,0x1e,0x24,0x1d,0x1c,0x1e,0x1f,0x26,0x17,0x1b,0x1b,0x28,0x19,0x19,0x23,0x29,0x1c,0x19,0x30,0x1a,0x1a,0x23,0x19,0x19,0x23,0x1a,0x23,0x25,0x28,0x19,0x24,0x19,0x1e,0x19,0x1c,0x1a,0x1d,0x19,0x1c,0x23,0x19,0x1d,0x1f,0x19,0x19,0x1b, +0x2c,0x19,0x19,0x1b,0x1b,0x14,0x0f,0x1a,0x1a,0x1a,0x19,0x1a,0x29,0x1a,0x29,0x17,0x1a,0x29,0x1f,0x1a,0x29,0x22,0x22,0x29,0x1b,0x1a,0x29,0x29,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x29,0x29,0x1b,0x1a,0x1a,0x29,0x1b,0x19,0x1a,0x1a,0x29,0x24,0x20,0x20,0x20,0x20,0x21,0x1d,0x20,0x24,0x20,0x1e,0x19,0x24,0x1f,0x20,0x1a,0x1f,0x20,0x22, +0x21,0x1b,0x20,0x1f,0x21,0x1f,0x24,0x20,0x21,0x21,0x1f,0x1d,0x20,0x1f,0x21,0x24,0x1e,0x23,0x21,0x05,0x05,0x07,0x09,0x07,0x0c,0x10,0x28,0x1a,0x1c,0x1b,0x1a,0x1c,0x1a,0x1a,0x1e,0x1c,0x1a,0x0e,0x26,0x1b,0x1a,0x1a,0x19,0x1c,0x18,0x1b,0x0c,0x1b,0x18,0x1a,0x13,0x28,0x19,0x1a,0x1a,0x1b,0x26,0x1a,0x1b,0x12,0x26,0x1b,0x1b,0x20, +0x1f,0x0a,0x0d,0x34,0x34,0x34,0x34,0x42,0x19,0x19,0x0b,0x19,0x12,0x19,0x19,0x1a,0x19,0x19,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x1a,0x19,0x19,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17, +0x1b,0x14,0x13,0x1a,0x1c,0x0c,0x0e,0x17,0x13,0x23,0x1e,0x1c,0x16,0x1c,0x17,0x13,0x14,0x1b,0x17,0x25,0x17,0x15,0x16,0x20,0x24,0x13,0x1d,0x16,0x1b,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x1e,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b,0x1b,0x1b,0x15,0x17,0x17,0x17,0x17,0x17,0x1a,0x1b,0x1b, +0x14,0x14,0x14,0x14,0x14,0x1a,0x1a,0x17,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1a,0x0e,0x17,0x13,0x13,0x13,0x13,0x1e,0x1e,0x1e,0x1e,0x1c,0x1c,0x1c,0x17,0x17,0x17,0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x25,0x25,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x20,0x1d,0x17,0x17,0x12,0x19,0x14, +0x16,0x1c,0x1c,0x0c,0x17,0x17,0x23,0x1e,0x15,0x1c,0x1c,0x16,0x15,0x14,0x15,0x1d,0x17,0x1e,0x1d,0x17,0x14,0x1c,0x0c,0x1c,0x15,0x1d,0x0c,0x15,0x14,0x1a,0x12,0x18,0x13,0x0c,0x0c,0x0e,0x25,0x26,0x1c,0x17,0x17,0x1c,0x17,0x16,0x17,0x12,0x1b,0x14,0x22,0x14,0x1e,0x1e,0x17,0x1a,0x23,0x1c,0x1c,0x1c,0x16,0x17,0x14,0x17,0x1d,0x17, +0x1d,0x19,0x25,0x26,0x1a,0x20,0x17,0x18,0x28,0x16,0x12,0x1b,0x1b,0x1d,0x29,0x29,0x1e,0x17,0x1a,0x13,0x1a,0x1a,0x1a,0x20,0x18,0x18,0x20,0x1b,0x1b,0x10,0x1c,0x1c,0x1a,0x16,0x16,0x29,0x22,0x16,0x18,0x1c,0x1c,0x1d,0x1d,0x21,0x20,0x10,0x2b,0x1b,0x19,0x1a,0x1e,0x1e,0x17,0x17,0x0c,0x23,0x20,0x20,0x16,0x20,0x0a,0x0a,0x14,0x14, +0x0a,0x0a,0x1c,0x12,0x0c,0x23,0x20,0x0d,0x0a,0x0a,0x15,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x1f,0x16,0x0e,0x1c,0x20,0x1b,0x1b,0x17,0x22,0x1a,0x1c,0x10,0x14,0x18,0x14,0x0a,0x0b,0x12,0x18,0x10,0x1f,0x1f,0x1f,0x2a,0x23,0x2a,0x0c,0x00,0x00,0x00,0x00,0x00,0x0c,0x23,0x26,0x0f,0x0f,0x17,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b, +0x1b,0x17,0x17,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x26,0x26,0x26,0x26,0x26,0x2a,0x2a,0x17,0x17,0x2a,0x2a,0x17,0x17,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x2e,0x23,0x26,0x17,0x1b,0x1b,0x1f,0x0f,0x1f,0x23,0x17,0x17,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c, +0x2a,0x0f,0x23,0x17,0x17,0x0c,0x17,0x17,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x36,0x26,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x26,0x26,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x23,0x17,0x17, +0x23,0x17,0x17,0x2a,0x17,0x32,0x2e,0x2a,0x17,0x26,0x17,0x26,0x17,0x26,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x1f,0x1f,0x0f,0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x17,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x17,0x0f,0x0f,0x0f,0x0f,0x00,0x36,0x26, +0x3d,0x2e,0x2a,0x17,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x17,0x17,0x13,0x36,0x26,0x2e,0x2e,0x2a,0x2a,0x2a,0x1b,0x1b,0x1b,0x1b,0x1f,0x0f,0x1f,0x0f,0x1f,0x0f,0x36,0x26,0x1b,0x1f,0x1b,0x1b,0x1b,0x1f,0x1b,0x1b,0x36,0x36,0x26,0x26,0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x0f,0x0f,0x0f,0x0f,0x23,0x26, +0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x1b,0x1b,0x1b,0x1b,0x2a,0x0f,0x2a,0x0f,0x1b,0x1f,0x1b,0x1b,0x36,0x36,0x26,0x26,0x36,0x36,0x26,0x26,0x26,0x26,0x17,0x17,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x0c,0x0c,0x0f,0x0c,0x00,0x00,0x00,0x26,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x23,0x23, +0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, +0x23,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1b,0x26,0x1b,0x26,0x1b,0x26,0x1b,0x26,0x1f,0x1f,0x1f,0x0c,0x0c,0x17,0x13,0x1b,0x1d,0x1a,0x19,0x1a,0x1b,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x18,0x15,0x19,0x18,0x1b,0x1c,0x1c,0x1e,0x1b,0x1a,0x1e,0x18,0x1f,0x23,0x1d,0x22,0x26,0x1d,0x23,0x20,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x18,0x15,0x19,0x1c,0x1c,0x1e,0x1a,0x1e,0x1a,0x1b,0x1c,0x17,0x17,0x23,0x1f,0x20,0x1f,0x1f,0x1b,0x1b,0x1b,0x22,0x23,0x23,0x23,0x2a,0x2a,0x20,0x2a,0x2a,0x22,0x28,0x27,0x1a,0x23,0x27,0x23,0x1b,0x27,0x22,0x20,0x20,0x1c,0x1e,0x22,0x25,0x20,0x1c,0x21,0x1b,0x19,0x2a,0x2a,0x2a,0x26,0x2a,0x2a,0x1f, +0x2a,0x2a,0x21,0x23,0x24,0x22,0x21,0x21,0x1e,0x29,0x23,0x26,0x21,0x21,0x1b,0x22,0x20,0x20,0x27,0x23,0x21,0x29,0x19,0x17,0x1a,0x19,0x1c,0x1d,0x20,0x22,0x1b,0x1a,0x1a,0x19,0x1a,0x19,0x19,0x1a,0x1a,0x1b,0x1a,0x1a,0x1a,0x17,0x18,0x1b,0x1d,0x1c,0x1c,0x15,0x1a,0x1a,0x1b,0x1c,0x23,0x27,0x1e,0x1e,0x1d,0x23,0x1d,0x1f,0x18,0x16, +0x1b,0x1a,0x16,0x17,0x19,0x19,0x16,0x15,0x1d,0x15,0x19,0x17,0x19,0x24,0x1a,0x26,0x19,0x1a,0x1a,0x22,0x0e,0x24,0x20,0x21,0x1e,0x1a,0x23,0x1c,0x24,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x1c,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x14,0x15,0x15,0x15,0x15,0x15,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1d,0x0c, +0x0c,0x0c,0x0e,0x0e,0x0c,0x0c,0x0c,0x0e,0x0c,0x0c,0x0c,0x2a,0x2a,0x2a,0x2a,0x16,0x22,0x21,0x16,0x13,0x16,0x18,0x1a,0x16,0x27,0x26,0x28,0x14,0x2e,0x16,0x26,0x26,0x27,0x25,0x1a,0x16,0x16,0x24,0x1b,0x24,0x1f,0x19,0x15,0x13,0x2f,0x13,0x19,0x16,0x16,0x16,0x16,0x16,0x3f,0x26,0x26,0x14,0x0c,0x15,0x0b,0x15,0x0b,0x0b,0x0b,0x16, +0x1b,0x1b,0x19,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x0b,0x13,0x28,0x0a,0x2a,0x2a,0x2a,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x36,0x36,0x1f,0x36,0x36,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x1b,0x16,0x1b,0x16,0x18,0x14,0x10,0x10,0x20,0x19,0x21,0x14,0x34,0x29,0x1b,0x19,0x2a,0x24,0x27,0x22,0x2f,0x25,0x2b,0x24,0x1e,0x16,0x21,0x1b,0x2b,0x22,0x23,0x1c,0x22,0x1c,0x28,0x1f,0x28,0x1f,0x33,0x27,0x23,0x1b,0x23,0x1b,0x38,0x29,0x24,0x00,0x2d,0x2d,0x2d,0x16,0x00,0x00,0x1b,0x17,0x20,0x1a,0x18,0x14,0x32,0x2a, +0x2b,0x28,0x21,0x1b,0x20,0x1b,0x18,0x13,0x22,0x1b,0x18,0x13,0x26,0x1f,0x1e,0x1a,0x2d,0x26,0x19,0x1a,0x22,0x22,0x25,0x15,0x09,0x15,0x1f,0x14,0x2e,0x2e,0x0b,0x00,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x19,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x22,0x22,0x22,0x22, +0x22,0x22,0x22,0x22,0x22,0x22,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x16,0x1f,0x21,0x0d,0x0a,0x0d,0x0a,0x21,0x1a,0x22,0x1d,0x19,0x16,0x19, +0x16,0x1b,0x1a,0x13,0x13,0x34,0x26,0x35,0x29,0x2d,0x27,0x29,0x1e,0x29,0x1e,0x29,0x1e,0x1c,0x15,0x1b,0x17,0x1b,0x17,0x1b,0x17,0x19,0x0e,0x16,0x0b,0x23,0x1b,0x28,0x1f,0x3d,0x2e,0x1a,0x1b,0x20,0x20,0x25,0x28,0x23,0x1b,0x2d,0x24,0x19,0x12,0x1a,0x17,0x1d,0x16,0x2b,0x21,0x1c,0x18,0x1a,0x1b,0x1a,0x1b,0x16,0x12,0x16,0x12,0x16, +0x11,0x18,0x18,0x0e,0x1f,0x0f,0x2c,0x1e,0x10,0x1b,0x1c,0x15,0x23,0x1a,0x11,0x10,0x1b,0x1b,0x1b,0x16,0x0b,0x23,0x1c,0x11,0x10,0x1d,0x15,0x21,0x12,0x24,0x1c,0x1c,0x15,0x20,0x1b,0x1b,0x17,0x22,0x1a,0x1c,0x10,0x18,0x14,0x23,0x14,0x18,0x28,0x16,0x1a,0x29,0x0c,0x35,0x29,0x29,0x36,0x29,0x2a,0x2a,0x28,0x29,0x2a,0x18,0x16,0x1c, +0x20,0x29,0x20,0x2b,0x0b,0x15,0x1b,0x28,0x2f,0x20,0x2f,0x1c,0x1c,0x25,0x20,0x34,0x2a,0x18,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x2e,0x17,0x17,0x2e,0x23,0x17,0x17,0x23,0x1f,0x0f,0x0f,0x1f,0x1b,0x1b,0x1b,0x1b,0x23,0x0f,0x0f,0x26,0x23,0x0f,0x0f,0x26,0x13,0x13,0x17,0x17,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x18,0x12,0x1a,0x18,0x22,0x1b,0x1b,0x28,0x1f,0x22,0x23,0x26,0x26,0x1b,0x17,0x2e,0x25,0x30,0x27,0x20,0x1b,0x0e,0x0e,0x1b,0x1e,0x13,0x1c,0x18,0x1b,0x16,0x22,0x25,0x12,0x1b,0x14,0x0a,0x11,0x18,0x19,0x0a, +0x0a,0x08,0x0a,0x11,0x11,0x11,0x15,0x44,0x5c,0x10,0x13,0x06,0x0c,0x12,0x14,0x0f,0x17,0x18,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x16,0x16,0x16,0x16,0x3d,0x19,0x23,0x2a,0x29,0x1e,0x15,0x1a,0x21,0x22,0x16,0x0e,0x1e,0x18,0x1f,0x1a,0x1e,0x19,0x19,0x22,0x1b,0x1b,0x18,0x22,0x1c,0x26,0x15,0x18,0x1d,0x0e,0x1b, +0x10,0x10,0x0b,0x28,0x1b,0x1a,0x18,0x18,0x1b,0x2b,0x2b,0x2b,0x2e,0x2e,0x19,0x17,0x0d,0x17,0x15,0x1c,0x15,0x1f,0x0b,0x1a,0x1c,0x28,0x28,0x1c,0x19,0x1b,0x19,0x18,0x15,0x18,0x15,0x16,0x0e,0x10,0x0b,0x0a,0x11,0x1b,0x1d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x00,0x0d,0x0d,0x0d,0x0c, +0x0c,0x4d,0x2e,0x28,0x30,0x0d,0x0d,0x0f,0x12,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x00,0x2a,0x0f,0x0f,0x2a,0x0c,0x17,0x17,0x3d,0x2e,0x2e,0x3d,0x2a,0x17,0x17,0x2a,0x17,0x17,0x13,0x13,0x00,0x00,0x10,0x22,0x1c,0x21,0x1b,0x3a,0x30,0x20,0x19,0x20,0x19,0x3d,0x2e,0x23,0x1b,0x12,0x0f,0x1c,0x00,0x1f,0x19, +0x0f,0x0e,0x07,0x17,0x0f,0x10,0x0c,0x09,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0a,0x18,0x14,0x1b,0x1a,0x19,0x2c,0x25,0x25,0x24,0x26,0x2b,0x1d,0x20,0x1c,0x12,0x2b,0x34,0x14,0x35,0x17,0x26,0x2a,0x2a,0x2a,0x13,0x23,0x2e,0x23,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x1b, +0x1b,0x1b,0x26,0x17,0x17,0x2a,0x0f,0x0f,0x2a,0x0f,0x0f,0x2a,0x17,0x17,0x00,0x13,0x26,0x0f,0x0f,0x2e,0x17,0x17,0x23,0x17,0x17,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x45,0x45,0x28,0x00,0x00,0x28,0x28,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, +0x1f,0x1c,0x1e,0x1e,0x29,0x1e,0x1d,0x25,0x2d,0x1e,0x1d,0x31,0x1d,0x1d,0x2b,0x1d,0x1f,0x24,0x1d,0x23,0x27,0x2a,0x1d,0x23,0x1e,0x20,0x1d,0x20,0x1d,0x1e,0x20,0x1d,0x24,0x1c,0x1f,0x24,0x1c,0x1d,0x1a,0x24,0x1e,0x1e,0x1e,0x20,0x15,0x18,0x1e,0x24,0x24,0x19,0x00,0x00,0x32,0x64,0x20,0x00,0x05,0x0e,0x0e,0x14,0x1e,0x1b,0x29,0x28, +0x0c,0x0f,0x0f,0x15,0x22,0x0b,0x14,0x0b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x0b,0x0b,0x22,0x22,0x22,0x16,0x30,0x20,0x1d,0x1f,0x23,0x19,0x18,0x22,0x24,0x0d,0x12,0x1d,0x18,0x2d,0x25,0x26,0x1c,0x26,0x1e,0x1b,0x1a,0x22,0x1f,0x2f,0x1e,0x1c,0x1d,0x0f,0x13,0x0f,0x22,0x15,0x0d,0x19,0x1d,0x17,0x1d,0x1a,0x10, +0x1d,0x1c,0x0c,0x0c,0x19,0x0c,0x2b,0x1c,0x1d,0x1d,0x1d,0x11,0x15,0x11,0x1c,0x18,0x24,0x17,0x18,0x17,0x0f,0x0c,0x0f,0x22,0x20,0x20,0x1f,0x19,0x25,0x26,0x22,0x19,0x19,0x19,0x19,0x19,0x19,0x17,0x1a,0x1a,0x1a,0x1a,0x0c,0x0c,0x0c,0x0c,0x1c,0x1d,0x1d,0x1d,0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x13,0x13,0x1b,0x1b,0x16,0x14,0x17,0x1b, +0x14,0x2d,0x2d,0x27,0x0e,0x15,0x22,0x2b,0x26,0x29,0x22,0x22,0x22,0x1b,0x1d,0x1b,0x1f,0x26,0x1b,0x14,0x16,0x26,0x2a,0x1d,0x16,0x0e,0x0e,0x22,0x21,0x1b,0x22,0x20,0x19,0x19,0x25,0x20,0x20,0x26,0x2f,0x2e,0x19,0x32,0x13,0x13,0x0b,0x0b,0x22,0x1d,0x18,0x1c,0x09,0x1b,0x10,0x10,0x1c,0x1c,0x13,0x0b,0x0b,0x13,0x3d,0x20,0x19,0x20, +0x19,0x19,0x0d,0x0d,0x0d,0x0d,0x26,0x26,0x26,0x22,0x22,0x22,0x0c,0x13,0x11,0x10,0x0f,0x0a,0x0e,0x0a,0x10,0x09,0x13,0x18,0x0e,0x1b,0x15,0x1d,0x17,0x0c,0x23,0x1c,0x1c,0x18,0x1c,0x1d,0x22,0x22,0x12,0x12,0x12,0x2f,0x2d,0x30,0x18,0x22,0x1d,0x0d,0x1b,0x15,0x1f,0x17,0x1f,0x17,0x1d,0x15,0x0b,0x20,0x19,0x20,0x19,0x23,0x22,0x23, +0x19,0x1a,0x19,0x1a,0x18,0x0c,0x18,0x0f,0x18,0x10,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x1e,0x11,0x1e,0x11,0x1b,0x15,0x1a,0x11,0x1a,0x16,0x22,0x1c,0x22,0x1c,0x1d,0x17,0x1d,0x17,0x18,0x26,0x26,0x1f,0x1d,0x16,0x1d,0x18,0x23,0x15,0x18,0x14,0x38,0x1f,0x19,0x1e,0x0b,0x13,0x28,0x10,0x1e,0x12,0x12,0x1e,0x12,0x20,0x19,0x1f,0x17,0x1f, +0x17,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x22,0x1d,0x22,0x1d,0x22,0x1d,0x24,0x1c,0x24,0x1c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x12,0x0c,0x1d,0x19,0x19,0x18,0x0c,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x26,0x1d,0x1e,0x11,0x1b,0x15,0x1a,0x11,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x2f,0x24,0x1c,0x18,0x0c,0x20,0x19,0x2b,0x2a,0x26, +0x1d,0x0b,0x2f,0x24,0x2f,0x24,0x2f,0x24,0x1c,0x18,0x0b,0x15,0x1b,0x1e,0x2e,0x2e,0x2e,0x2d,0x13,0x13,0x0b,0x0e,0x0e,0x20,0x1d,0x27,0x13,0x28,0x21,0x29,0x0d,0x20,0x1d,0x19,0x1d,0x24,0x0d,0x1d,0x1f,0x2d,0x25,0x19,0x26,0x24,0x1c,0x1a,0x1a,0x1c,0x1e,0x27,0x26,0x0d,0x1c,0x1f,0x16,0x1d,0x0d,0x1c,0x1b,0x1a,0x16,0x1d,0x1d,0x0d, +0x1a,0x19,0x1d,0x1a,0x16,0x1d,0x1d,0x17,0x1c,0x1b,0x26,0x28,0x0d,0x1c,0x1d,0x1c,0x28,0x19,0x23,0x18,0x1f,0x1b,0x0d,0x31,0x31,0x24,0x1d,0x1c,0x23,0x20,0x1d,0x1d,0x18,0x23,0x19,0x2b,0x1b,0x25,0x25,0x1d,0x22,0x2d,0x24,0x26,0x24,0x1c,0x1f,0x1a,0x1c,0x24,0x1e,0x25,0x21,0x2f,0x31,0x23,0x27,0x1d,0x1f,0x33,0x1e,0x19,0x1d,0x1a, +0x13,0x1b,0x1a,0x25,0x16,0x1d,0x1d,0x19,0x1a,0x23,0x1d,0x1d,0x1d,0x1d,0x17,0x15,0x18,0x22,0x17,0x1e,0x1c,0x28,0x29,0x1e,0x23,0x19,0x17,0x29,0x19,0x1a,0x1d,0x13,0x17,0x15,0x0c,0x28,0x28,0x1c,0x19,0x18,0x1d,0x17,0x14,0x32,0x38,0x1f,0x12,0x12,0x12,0x12,0x0c,0x1b,0x15,0x1c,0x26,0x1e,0x23,0x1d,0x0f,0x11,0x0d,0x0d,0x18,0x18, +0x18,0x18,0x0f,0x0f,0x0f,0x18,0x0f,0x18,0x0f,0x0f,0x0f,0x18,0x18,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x0d,0x0c,0x0d,0x0c,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26, +0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x22,0x1c,0x22,0x1c,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x1c,0x18,0x1c,0x18,0x1c,0x18,0x1a,0x11,0x19,0x1a,0x25,0x1d,0x0d,0x12,0x0c,0x0c,0x1a,0x15,0x2e,0x27,0x1f,0x1b,0x1d,0x19,0x25,0x1e,0x1c,0x18,0x1c,0x18,0x1f,0x19,0x21, +0x1c,0x21,0x1c,0x24,0x1a,0x26,0x1d,0x0f,0x0f,0x0f,0x0f,0x15,0x15,0x18,0x18,0x18,0x18,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x19,0x1a,0x20,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1f,0x17,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x18,0x10,0x22,0x1d,0x24,0x1c,0x24,0x1c,0x24, +0x1c,0x24,0x1c,0x24,0x1c,0x0d,0x0c,0x0d,0x0c,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x18,0x0c,0x18,0x0c,0x18,0x0c,0x18,0x0c,0x2d,0x2b,0x2d,0x2b,0x2d,0x2b,0x25,0x1c,0x25,0x1c,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x1c,0x1d,0x1c,0x1d,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b, +0x15,0x1b,0x15,0x1a,0x11,0x1a,0x11,0x1a,0x11,0x1a,0x11,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x1f,0x18,0x1f,0x18,0x2f,0x24,0x2f,0x24,0x1e,0x17,0x1e,0x17,0x1c,0x18,0x1d,0x17,0x1d,0x17,0x1d,0x17,0x1c,0x11,0x24,0x18,0x19,0x0c,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x25,0x25,0x25,0x25,0x25,0x25,0x16, +0x16,0x16,0x16,0x16,0x16,0x1d,0x1d,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x13,0x13,0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x28,0x28,0x30,0x30,0x30,0x30,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x21, +0x29,0x29,0x29,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x30,0x30,0x30,0x30,0x30,0x30,0x1f,0x1f,0x16,0x16,0x1d,0x1d,0x0d,0x0d,0x1d,0x1d,0x1c,0x1c,0x28,0x28,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x25,0x25,0x25,0x25,0x25,0x25,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x2e,0x2e,0x2e,0x2e,0x2e, +0x2e,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x30,0x30,0x30,0x30,0x30,0x30,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x20,0x20,0x20,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x24,0x1d,0x1d,0x1d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x12,0x13,0x1d,0x1d,0x1d,0x1c,0x1c,0x1c,0x1c, +0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x21,0x21,0x1f,0x1d,0x1d,0x1d,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x2a,0x29,0x26,0x1d,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1f,0x1d,0x1d,0x1d,0x1d,0x1f,0x1f,0x17,0x23,0x25,0x1d,0x1d,0x1e,0x19,0x1b,0x18,0x23,0x1f,0x2c,0x0e,0x0e,0x1d,0x19,0x0c,0x19, +0x2d,0x25,0x1d,0x26,0x30,0x28,0x1e,0x1d,0x1d,0x1b,0x15,0x1a,0x0f,0x11,0x1a,0x11,0x1a,0x26,0x24,0x1c,0x1a,0x1d,0x17,0x1f,0x1f,0x16,0x14,0x1b,0x1b,0x13,0x14,0x1b,0x0c,0x13,0x17,0x0e,0x3e,0x39,0x33,0x2b,0x24,0x19,0x36,0x30,0x28,0x20,0x19,0x0d,0x0c,0x26,0x1d,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x1a,0x20,0x19, +0x20,0x19,0x2b,0x29,0x22,0x1d,0x22,0x1d,0x1d,0x19,0x26,0x1d,0x26,0x1d,0x1f,0x16,0x0c,0x3e,0x39,0x33,0x22,0x1d,0x32,0x22,0x25,0x1c,0x20,0x19,0x20,0x19,0x19,0x1a,0x19,0x1a,0x0d,0x0c,0x0d,0x0c,0x26,0x1d,0x26,0x1d,0x1d,0x11,0x1e,0x11,0x22,0x1c,0x22,0x1c,0x19,0x15,0x24,0x1c,0x25,0x1e,0x1c,0x1d,0x17,0x20,0x19,0x26,0x1d,0x26, +0x1d,0x26,0x1d,0x26,0x1d,0x1c,0x18,0x1d,0x19,0x1c,0x1c,0x1d,0x19,0x1d,0x1d,0x1d,0x17,0x17,0x1d,0x1d,0x1a,0x1f,0x15,0x15,0x19,0x1c,0x0e,0x1d,0x1d,0x1a,0x18,0x17,0x1c,0x1c,0x1c,0x0d,0x0e,0x10,0x0e,0x13,0x0c,0x1e,0x2b,0x2b,0x2b,0x1c,0x1c,0x1d,0x1d,0x23,0x24,0x20,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x14,0x0c,0x0d, +0x0e,0x0e,0x11,0x11,0x1e,0x1e,0x1c,0x18,0x24,0x18,0x15,0x17,0x1a,0x16,0x16,0x12,0x12,0x12,0x17,0x1f,0x18,0x1b,0x1a,0x1c,0x0c,0x19,0x13,0x1d,0x12,0x12,0x2e,0x2f,0x31,0x1f,0x18,0x24,0x28,0x1d,0x1c,0x19,0x19,0x1b,0x1e,0x1c,0x22,0x1c,0x20,0x28,0x1d,0x23,0x1d,0x1d,0x17,0x19,0x17,0x1e,0x19,0x1f,0x19,0x2d,0x2b,0x1e,0x19,0x20, +0x1b,0x1f,0x17,0x1e,0x18,0x21,0x1d,0x1c,0x14,0x1d,0x1d,0x17,0x0c,0x26,0x17,0x17,0x2b,0x22,0x20,0x1d,0x2d,0x24,0x21,0x19,0x2c,0x23,0x24,0x1c,0x2e,0x25,0x1b,0x16,0x27,0x26,0x26,0x1d,0x24,0x1d,0x24,0x1d,0x42,0x38,0x29,0x21,0x38,0x2d,0x2b,0x22,0x1d,0x16,0x19,0x14,0x15,0x00,0x00,0x31,0x2f,0x1d,0x19,0x1c,0x1d,0x1c,0x19,0x1b, +0x17,0x1d,0x19,0x24,0x1d,0x2a,0x21,0x33,0x2a,0x24,0x1c,0x1f,0x17,0x1a,0x15,0x2c,0x22,0x22,0x1d,0x2a,0x20,0x2a,0x20,0x0d,0x2b,0x25,0x1d,0x19,0x24,0x1d,0x21,0x1c,0x20,0x19,0x20,0x19,0x2b,0x2a,0x19,0x1a,0x24,0x1a,0x24,0x1a,0x2b,0x25,0x1b,0x16,0x1a,0x16,0x25,0x1d,0x25,0x1d,0x26,0x1d,0x26,0x1d,0x1f,0x17,0x1c,0x18,0x1c,0x18, +0x1c,0x18,0x21,0x1c,0x27,0x23,0x1c,0x1d,0x2b,0x2b,0x28,0x24,0x1c,0x18,0x2d,0x28,0x31,0x2a,0x24,0x1b,0x22,0x1e,0x1d,0x1c,0x1c,0x19,0x1d,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x1d,0x11,0x11,0x08,0x0b,0x0b,0x0b,0x0e,0x14,0x0e,0x0b,0x13,0x0b,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x1d,0x1d, +0x1d,0x1d,0x11,0x0e,0x0d,0x11,0x10,0x0d,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x11,0x0f,0x08,0x0c,0x0e,0x0b,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x15,0x11,0x0c,0x0d,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13, +0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b, +0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x20,0x0f,0x20,0x11,0x1e,0x1e,0x11,0x11,0x11,0x11,0x11,0x0d, +0x10,0x10,0x11,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x1d,0x17,0x21,0x29,0x18,0x17,0x1b,0x1c,0x15,0x15,0x0c,0x0f,0x19,0x14,0x23,0x1d,0x1d,0x18,0x1f,0x1f,0x1f,0x2e,0x1b,0x1e,0x1e,0x17,0x17,0x17,0x15,0x1b,0x1c,0x24,0x1c,0x18,0x24,0x17,0x15,0x15,0x1a,0x13,0x17, +0x1d,0x17,0x1e,0x1c,0x12,0x18,0x11,0x12,0x14,0x0f,0x0f,0x14,0x15,0x09,0x0b,0x12,0x0e,0x1a,0x16,0x16,0x15,0x13,0x11,0x11,0x0f,0x15,0x1a,0x10,0x10,0x11,0x18,0x11,0x11,0x10,0x10,0x0d,0x0d,0x11,0x08,0x0f,0x19,0x11,0x11,0x0e,0x11,0x11,0x11,0x0a,0x11,0x10,0x19,0x0e,0x10,0x11,0x0f,0x11,0x14,0x0f,0x08,0x0b,0x11,0x0e,0x11,0x0f, +0x11,0x14,0x0f,0x1d,0x08,0x11,0x1b,0x2c,0x1f,0x1b,0x1b,0x2b,0x20,0x2b,0x25,0x1a,0x1d,0x19,0x16,0x38,0x17,0x1d,0x2d,0x2f,0x2f,0x1f,0x20,0x1f,0x17,0x18,0x1a,0x15,0x17,0x1a,0x0a,0x00,0x00,0x00,0x00,0x1d,0x1f,0x1f,0x1f,0x18,0x13,0x1d,0x1d,0x10,0x2b,0x1c,0x1d,0x11,0x11,0x17,0x11,0x17,0x1d,0x17,0x1d,0x2d,0x20,0x10,0x0d,0x1d, +0x1b,0x1e,0x1d,0x1d,0x10,0x1d,0x19,0x0c,0x2b,0x1c,0x1d,0x11,0x15,0x16,0x18,0x17,0x17,0x19,0x1d,0x1d,0x1a,0x16,0x16,0x25,0x0c,0x17,0x0c,0x1c,0x16,0x11,0x0d,0x0d,0x11,0x0d,0x09,0x08,0x11,0x11,0x08,0x09,0x09,0x09,0x08,0x09,0x08,0x0b,0x19,0x19,0x11,0x11,0x12,0x11,0x12,0x0c,0x08,0x0a,0x11,0x11,0x10,0x10,0x0e,0x0d,0x0d,0x0f, +0x0d,0x11,0x00,0x00,0x00,0x00,0x0b,0x10,0x10,0x11,0x0d,0x10,0x1b,0x1b,0x1b,0x1b,0x11,0x00,0x00,0x00,0x00,0x17,0x10,0x0d,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0d,0x0d,0x0d,0x0d,0x1c,0x1c,0x1c,0x1c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, +0x42,0x42,0x1b,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x27,0x20,0x23,0x1d,0x25,0x1f,0x2f,0x26,0x1b,0x13,0x1a,0x22,0x1b,0x29,0x23,0x00,0x00,0x00,0x00,0x0d,0x0d,0x0d, +0x0d,0x11,0x11,0x11,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x2a,0x2a,0x32,0x15,0x0d,0x19,0x1d,0x15,0x19,0x19,0x1d,0x1d,0x19,0x32,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x19,0x20,0x19,0x19,0x19,0x11,0x1d,0x11,0x26,0x21,0x19,0x11,0x2a,0x19,0x2a,0x0d,0x11,0x1d,0x1d,0x20,0x20,0x20,0x1d,0x1d,0x1d,0x2a,0x0d,0x1d,0x0d,0x19,0x15,0x0d,0x0d, +0x19,0x0d,0x26,0x0d,0x2e,0x19,0x2e,0x2e,0x1d,0x1d,0x1d,0x19,0x19,0x15,0x15,0x3a,0x3a,0x43,0x43,0x2a,0x2a,0x19,0x19,0x08,0x32,0x26,0x2a,0x21,0x1d,0x21,0x19,0x19,0x26,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0d,0x20,0x00,0x20,0x20,0x20,0x11,0x19,0x19,0x2e,0x11,0x2e,0x11,0x1d,0x21,0x1d,0x15,0x2e,0x19,0x2e,0x19, +0x26,0x2a,0x11,0x19,0x19,0x15,0x0d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x1d,0x19,0x21,0x20,0x2e,0x11,0x19,0x15,0x21,0x19,0x11,0x19,0x19,0x19,0x2e,0x11,0x2e,0x11,0x0d,0x1d,0x13,0x32,0x19,0x19,0x20,0x20,0x32,0x19,0x00,0x00,0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x26,0x20,0x00,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x19,0x19, +0x26,0x2a,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x21,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15,0x19,0x15,0x15,0x15,0x3a,0x2a,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x19,0x1d,0x1d,0x1d,0x32,0x32, +0x19,0x19,0x32,0x19,0x19,0x32,0x19,0x19,0x32,0x19,0x19,0x26,0x26,0x36,0x32,0x2e,0x19,0x2a,0x19,0x2a,0x19,0x2a,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x21,0x11,0x21,0x11,0x1b,0x21,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x2a,0x2e,0x26,0x2a,0x11, +0x19,0x26,0x2a,0x26,0x2a,0x00,0x00,0x00,0x00,0x00,0x38,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x15,0x00,0x00,0x1e,0x00,0x00,0x00,0x3a,0x2a,0x43,0x32,0x19,0x1d,0x1d,0x1d,0x15,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x2e,0x2e,0x13,0x1d,0x1d,0x1e,0x3d,0x2a,0x1b,0x4c,0x36,0x11, +0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x19,0x15,0x15,0x26,0x21,0x21,0x19,0x00,0x00,0x00,0x11,0x11,0x11,0x11,0x3f,0x4b,0x00,0x00,0x00,0x00,0x00,0x1d,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x15,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x21,0x1d,0x19,0x19,0x15,0x3a, +0x2a,0x19,0x1d,0x1d,0x1d,0x19,0x1d,0x1d,0x1d,0x19,0x1d,0x1d,0x1d,0x32,0x19,0x19,0x32,0x19,0x19,0x2e,0x19,0x19,0x2e,0x19,0x19,0x2e,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x21,0x11,0x11,0x15,0x15,0x3a,0x2a,0x20,0x1d,0x1d,0x00,0x19,0x19,0x19,0x12,0x1d,0x22,0x1f,0x19,0x1a,0x12,0x0c,0x26,0x1d,0x1e, +0x11,0x1c,0x18,0x18,0x17,0x18,0x0c,0x1a,0x15,0x1f,0x18,0x1e,0x17,0x1b,0x16,0x22,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x17,0x18,0x18,0x0e,0x1a,0x1c,0x1e,0x19,0x11,0x25,0x1d,0x20,0x1b,0x1f,0x19,0x1c,0x1a,0x14,0x23,0x13,0x15,0x15,0x18,0x1e,0x1e,0x19,0x32,0x19,0x32,0x11,0x0d,0x08,0x1b,0x0b,0x06,0x00,0x07, +0x0b,0x00,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x19,0x19,0x2e,0x15,0x26,0x1d,0x2f,0x24,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x2e,0x2b,0x18,0x2b,0x18,0x2b,0x20,0x22,0x23,0x23,0x26,0x2b,0x32,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x22,0x22,0x22,0x22,0x25,0x1d,0x35,0x29,0x18,0x18,0x0e, +0x0e,0x0e,0x13,0x0b,0x1c,0x0c,0x0c,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x0a,0x00,0x00,0x0b,0x00,0x00,0x20,0x1d,0x16,0x18,0x22,0x0d,0x11,0x22,0x22,0x0d,0x1c,0x1b,0x1c,0x23,0x22,0x0d,0x14,0x22,0x1e,0x1f,0x20,0x1c,0x1d,0x21,0x1c,0x27,0x24,0x1a,0x1a,0x1a,0x0b,0x13,0x1c,0x1c, +0x1c,0x1c,0x1b,0x1e,0x20,0x18,0x22,0x1b,0x1c,0x23,0x1c,0x24,0x1c,0x27,0x27,0x27,0x27,0x20,0x20,0x20,0x1d,0x16,0x18,0x22,0x0f,0x12,0x22,0x0f,0x1c,0x1b,0x1c,0x22,0x14,0x22,0x1f,0x20,0x1d,0x21,0x1c,0x27,0x24,0x0d,0x1d,0x1b,0x20,0x21,0x3c,0x00,0x20,0x1c,0x21,0x21,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0d,0x00,0x26,0x20,0x21,0x23,0x1c,0x21,0x25,0x26,0x18,0x1f,0x25,0x25,0x21,0x26,0x29,0x27,0x21,0x1c,0x1c,0x26,0x23,0x1d,0x22,0x22,0x21,0x22,0x22,0x25,0x1d,0x20,0x22,0x21,0x27,0x20,0x1f,0x20,0x21,0x29,0x19,0x1d, +0x1d,0x2c,0x1b,0x1b,0x27,0x2d,0x1f,0x1b,0x34,0x1c,0x1c,0x26,0x1b,0x1b,0x26,0x1c,0x26,0x29,0x2c,0x1b,0x27,0x1b,0x21,0x1b,0x1f,0x1c,0x20,0x1b,0x1e,0x26,0x1b,0x1f,0x21,0x1b,0x1b,0x1e,0x30,0x1b,0x1b,0x1d,0x1d,0x15,0x11,0x1c,0x1c,0x1c,0x1b,0x1c,0x2c,0x1c,0x2c,0x19,0x1c,0x2c,0x21,0x1c,0x2c,0x25,0x25,0x2c,0x1d,0x1c,0x2c,0x2c, +0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x2c,0x2c,0x1d,0x1c,0x1c,0x2c,0x1e,0x1b,0x1c,0x1c,0x2c,0x27,0x22,0x23,0x23,0x22,0x23,0x1f,0x22,0x27,0x23,0x21,0x1b,0x28,0x22,0x22,0x1d,0x21,0x23,0x25,0x24,0x1d,0x23,0x21,0x24,0x21,0x27,0x23,0x24,0x24,0x22,0x20,0x23,0x22,0x24,0x28,0x21,0x26,0x24,0x05,0x06,0x08,0x0a,0x08,0x0e,0x12,0x2b,0x1c, +0x1f,0x1e,0x1c,0x1f,0x1c,0x1c,0x20,0x1e,0x1c,0x0f,0x2a,0x1d,0x1c,0x1c,0x1b,0x1e,0x1a,0x1d,0x0d,0x1d,0x1a,0x1c,0x15,0x2b,0x1b,0x1c,0x1c,0x1e,0x2a,0x1c,0x1d,0x14,0x2a,0x1d,0x1d,0x22,0x22,0x0b,0x0e,0x39,0x38,0x38,0x39,0x47,0x1b,0x1b,0x0c,0x1b,0x13,0x1b,0x1b,0x1c,0x1b,0x1b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1c,0x1b,0x1b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x19,0x1d,0x15,0x15,0x1d,0x1f,0x0d,0x10,0x19,0x15,0x26,0x20,0x1f,0x18,0x1f,0x19,0x15,0x16,0x1e,0x1a,0x28,0x19,0x17,0x18,0x23,0x27,0x15,0x1f,0x18, +0x1d,0x1a,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15,0x15,0x0d,0x0d,0x0d,0x0d,0x20,0x1f,0x1f,0x1f,0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x17,0x19,0x19,0x19,0x19,0x19,0x1d,0x1d,0x1d,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x19,0x1f,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x1c,0x10,0x19,0x15,0x15,0x15,0x15,0x20,0x20,0x20,0x21,0x1f,0x1f, +0x1f,0x19,0x19,0x19,0x15,0x15,0x15,0x15,0x16,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x28,0x28,0x28,0x28,0x17,0x17,0x17,0x18,0x18,0x18,0x19,0x23,0x1f,0x19,0x19,0x14,0x1b,0x15,0x18,0x1f,0x1f,0x0d,0x19,0x1a,0x26,0x20,0x16,0x1f,0x1f,0x18,0x17,0x16,0x17,0x1f,0x19,0x21,0x20,0x19,0x15,0x1f,0x0d,0x1f,0x17,0x20,0x0d,0x17, +0x15,0x1c,0x14,0x1a,0x15,0x0d,0x0d,0x10,0x29,0x29,0x1f,0x19,0x19,0x1e,0x19,0x18,0x19,0x14,0x1d,0x15,0x25,0x16,0x20,0x20,0x19,0x1c,0x26,0x1f,0x1f,0x1f,0x18,0x19,0x16,0x19,0x1f,0x19,0x20,0x1b,0x28,0x2a,0x1c,0x23,0x19,0x1a,0x2b,0x18,0x14,0x1d,0x1d,0x1f,0x2c,0x2c,0x21,0x19,0x1d,0x15,0x1d,0x1c,0x1c,0x23,0x1a,0x1a,0x22,0x1d, +0x1d,0x12,0x1f,0x1f,0x1d,0x18,0x18,0x2d,0x25,0x18,0x1b,0x1e,0x1e,0x1f,0x1f,0x24,0x22,0x12,0x2f,0x1e,0x1c,0x1d,0x20,0x20,0x19,0x19,0x0d,0x26,0x22,0x22,0x18,0x23,0x0b,0x0b,0x16,0x16,0x0b,0x0b,0x1f,0x14,0x0d,0x26,0x23,0x0e,0x0b,0x0b,0x16,0x13,0x13,0x0b,0x0b,0x0b,0x13,0x22,0x18,0x0f,0x1e,0x22,0x1d,0x1d,0x19,0x25,0x1c,0x1e, +0x11,0x16,0x1b,0x15,0x0b,0x0b,0x14,0x1a,0x11,0x21,0x21,0x21,0x2e,0x26,0x2e,0x0d,0x00,0x00,0x00,0x00,0x00,0x0d,0x26,0x2a,0x11,0x11,0x19,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x19,0x19,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2e,0x2e,0x19,0x19,0x2e,0x2e,0x19,0x19,0x26,0x2a,0x11, +0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x32,0x26,0x2a,0x19,0x1d,0x1d,0x21,0x11,0x21,0x26,0x19,0x19,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x2e,0x11,0x26,0x19,0x19,0x0d,0x19,0x19,0x19,0x19,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d, +0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x3a,0x2a,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x2a,0x2a,0x32,0x32,0x32,0x32,0x32,0x32,0x26,0x19,0x19,0x26,0x19,0x19,0x2e,0x19,0x36,0x32,0x2e,0x19,0x2a,0x19,0x2a,0x19,0x2a,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x21, +0x21,0x21,0x21,0x21,0x11,0x21,0x21,0x11,0x11,0x21,0x11,0x21,0x11,0x21,0x19,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x11,0x11,0x19,0x11,0x11,0x11,0x11,0x00,0x3a,0x2a,0x43,0x32,0x2e,0x19,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x19,0x19,0x15,0x3a,0x2a,0x32,0x32,0x2e,0x2e,0x2e, +0x1d,0x1d,0x1d,0x1d,0x21,0x11,0x21,0x11,0x21,0x11,0x3a,0x2a,0x1d,0x21,0x1d,0x1d,0x1d,0x21,0x1d,0x1d,0x3a,0x3a,0x2a,0x2a,0x15,0x15,0x1d,0x1d,0x1d,0x1d,0x11,0x11,0x11,0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x1d,0x1d,0x1d,0x1d,0x2e,0x11,0x2e,0x11,0x1d,0x21,0x1d,0x1d,0x3a,0x3a,0x2a,0x2a,0x3a,0x3a, +0x2a,0x2a,0x2a,0x2a,0x19,0x19,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x00,0x00,0x0d,0x0d,0x11,0x0d,0x00,0x00,0x00,0x2a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x15,0x15,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, +0x2e,0x2e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x26,0x21,0x21,0x21,0x21,0x21,0x21,0x1d,0x2a,0x1d,0x2a,0x1d,0x2a,0x1d,0x2a,0x21,0x21,0x21,0x0d,0x0d,0x19,0x15,0x1d,0x20,0x1d,0x1b,0x1c,0x1d, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x17,0x1b,0x1a,0x1d,0x1f,0x1f,0x21,0x1d,0x1c,0x21,0x1a,0x21,0x26,0x20,0x25,0x29,0x20,0x26,0x22,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x17,0x1b,0x1e,0x1e,0x21,0x1d,0x20,0x1d,0x1e,0x1e,0x1a,0x1a,0x26,0x22,0x23,0x22,0x22,0x1e,0x1d,0x1d,0x25, +0x27,0x26,0x26,0x2e,0x2e,0x23,0x2e,0x2e,0x25,0x2c,0x2a,0x1c,0x26,0x2a,0x26,0x1e,0x2b,0x25,0x23,0x23,0x1e,0x20,0x25,0x28,0x23,0x1f,0x23,0x1d,0x1b,0x2e,0x2e,0x2e,0x29,0x2e,0x2e,0x22,0x2e,0x2e,0x23,0x26,0x27,0x25,0x24,0x24,0x20,0x2c,0x26,0x29,0x24,0x24,0x1d,0x25,0x23,0x23,0x2b,0x26,0x24,0x2d,0x1b,0x19,0x1c,0x1b,0x1f,0x1f, +0x23,0x25,0x1d,0x1c,0x1c,0x1b,0x1c,0x1b,0x1b,0x1c,0x1c,0x1d,0x1c,0x1c,0x1c,0x19,0x1a,0x1e,0x1f,0x1e,0x1e,0x17,0x1c,0x1c,0x1d,0x1e,0x26,0x2a,0x21,0x21,0x1f,0x26,0x20,0x22,0x1a,0x18,0x1d,0x1c,0x18,0x19,0x1b,0x1c,0x18,0x17,0x1f,0x17,0x1b,0x19,0x1b,0x27,0x1c,0x29,0x1b,0x1c,0x1c,0x25,0x10,0x27,0x22,0x24,0x21,0x1c,0x26,0x1e, +0x27,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1d,0x1e,0x1e,0x1e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x16,0x17,0x16,0x17,0x17,0x17,0x0f,0x10,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x1f,0x0d,0x0d,0x0d,0x10,0x10,0x0d,0x0d,0x0d,0x0f,0x0d,0x0d,0x0d,0x2d,0x2d,0x2d,0x2d,0x18,0x25,0x24,0x18,0x14,0x18,0x1a,0x1c,0x18,0x2a,0x29,0x2b,0x16, +0x32,0x18,0x2a,0x2a,0x2a,0x28,0x1c,0x18,0x18,0x27,0x1d,0x27,0x22,0x1b,0x17,0x14,0x33,0x15,0x1b,0x18,0x18,0x18,0x18,0x18,0x44,0x2a,0x2a,0x15,0x0d,0x17,0x0c,0x17,0x0c,0x0c,0x0c,0x18,0x1d,0x1d,0x1b,0x13,0x13,0x0b,0x0b,0x0b,0x13,0x0b,0x15,0x2b,0x0b,0x2d,0x2d,0x2d,0x1d,0x1d,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, +0x3a,0x3a,0x21,0x3a,0x3a,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x17,0x1d,0x17,0x1b,0x15,0x12,0x11,0x22,0x1b,0x24,0x16,0x38,0x2d,0x1e,0x1c,0x2e,0x28,0x2a,0x25,0x33,0x29,0x2e,0x27,0x20,0x18, +0x24,0x1d,0x2e,0x25,0x26,0x1e,0x25,0x1e,0x2b,0x21,0x2c,0x21,0x37,0x2a,0x26,0x1d,0x26,0x1d,0x3d,0x2c,0x28,0x00,0x31,0x31,0x31,0x18,0x00,0x00,0x1d,0x19,0x23,0x1c,0x1b,0x15,0x36,0x2d,0x2f,0x2b,0x24,0x1d,0x23,0x1d,0x1a,0x15,0x25,0x1e,0x1a,0x15,0x29,0x21,0x21,0x1c,0x31,0x29,0x1b,0x1d,0x25,0x25,0x28,0x16,0x0a,0x17,0x22,0x16, +0x32,0x32,0x0c,0x00,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x14,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x1b,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, +0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x18,0x22,0x24,0x0e,0x0a,0x0e,0x0a,0x24,0x1c,0x25,0x1f,0x1c,0x18,0x1b,0x18,0x1e,0x1d,0x15,0x15,0x38,0x29,0x3a,0x2c,0x31,0x2a,0x2d,0x21,0x2d,0x21,0x2d,0x21,0x1f,0x17,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1b,0x10,0x18, +0x0c,0x26,0x1d,0x2b,0x22,0x43,0x32,0x1c,0x1d,0x22,0x23,0x28,0x2b,0x26,0x1d,0x31,0x27,0x1b,0x14,0x1c,0x19,0x1f,0x18,0x2f,0x24,0x1f,0x1a,0x1c,0x1d,0x1c,0x1d,0x18,0x14,0x18,0x13,0x18,0x12,0x1a,0x1a,0x0f,0x22,0x10,0x30,0x21,0x11,0x1d,0x1f,0x17,0x26,0x1c,0x13,0x11,0x1d,0x1d,0x1d,0x18,0x0c,0x26,0x1e,0x12,0x11,0x1f,0x17,0x24, +0x13,0x27,0x1e,0x1f,0x17,0x22,0x1d,0x1d,0x19,0x25,0x1c,0x1e,0x11,0x1b,0x15,0x26,0x15,0x1b,0x2b,0x18,0x1c,0x2d,0x0d,0x39,0x2d,0x2d,0x3b,0x2c,0x2e,0x2e,0x2c,0x2c,0x2e,0x1a,0x18,0x1f,0x23,0x2d,0x23,0x2f,0x0c,0x17,0x1d,0x2b,0x33,0x23,0x33,0x1f,0x1f,0x28,0x23,0x39,0x2e,0x1a,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x2a,0x2a, +0x2a,0x2a,0x32,0x19,0x19,0x32,0x26,0x19,0x19,0x26,0x21,0x11,0x11,0x21,0x1d,0x1d,0x1d,0x1d,0x26,0x11,0x11,0x2a,0x26,0x11,0x11,0x2a,0x15,0x15,0x19,0x19,0x1a,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x1a,0x14,0x1c,0x1a, +0x25,0x1d,0x1d,0x2c,0x21,0x25,0x26,0x2a,0x29,0x1d,0x19,0x32,0x28,0x34,0x2b,0x22,0x1d,0x10,0x10,0x1d,0x20,0x14,0x1e,0x1a,0x1d,0x18,0x25,0x28,0x14,0x1d,0x15,0x0b,0x13,0x1b,0x1c,0x0b,0x0b,0x09,0x0b,0x13,0x13,0x13,0x16,0x4a,0x64,0x11,0x15,0x07,0x0d,0x13,0x16,0x10,0x19,0x1a,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, +0x18,0x18,0x18,0x18,0x18,0x42,0x1b,0x26,0x2e,0x2d,0x20,0x17,0x1c,0x24,0x25,0x18,0x10,0x21,0x1a,0x22,0x1c,0x21,0x1b,0x1b,0x25,0x1e,0x1d,0x1a,0x25,0x1f,0x2a,0x17,0x1a,0x20,0x10,0x1d,0x11,0x11,0x0c,0x2c,0x1d,0x1c,0x1a,0x1a,0x1d,0x2e,0x2e,0x2f,0x32,0x32,0x1b,0x19,0x0e,0x19,0x17,0x1e,0x17,0x21,0x0c,0x1c,0x1e,0x2b,0x2b,0x1f, +0x1b,0x1d,0x1b,0x1a,0x17,0x1a,0x17,0x18,0x0f,0x11,0x0c,0x0b,0x12,0x1d,0x20,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x00,0x0e,0x0e,0x0e,0x0d,0x0d,0x54,0x32,0x2c,0x34,0x0e,0x0e,0x10,0x14,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x00,0x2e,0x11,0x11,0x2e,0x0d,0x19, +0x19,0x43,0x32,0x32,0x43,0x2e,0x19,0x19,0x2e,0x19,0x19,0x15,0x15,0x00,0x00,0x12,0x25,0x1e,0x24,0x1d,0x3f,0x34,0x23,0x1b,0x23,0x1b,0x43,0x32,0x26,0x1d,0x13,0x10,0x1f,0x00,0x22,0x1b,0x11,0x0f,0x08,0x19,0x11,0x11,0x0d,0x0a,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0b,0x1a,0x15,0x1e,0x1d,0x1b,0x30,0x28,0x28,0x27,0x29, +0x2f,0x1f,0x22,0x1e,0x14,0x2e,0x38,0x16,0x3a,0x19,0x2a,0x2e,0x2e,0x2e,0x15,0x26,0x32,0x26,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x1d,0x1d,0x1d,0x2a,0x19,0x19,0x2e,0x11,0x11,0x2e,0x11,0x11,0x2e,0x19,0x19,0x00,0x15,0x2a,0x11,0x11,0x32,0x19,0x19,0x26,0x19,0x19,0x21,0x0f,0x0f, +0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x4b,0x4b,0x2c,0x00,0x00,0x2c,0x2c,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x1f,0x20,0x20,0x2c,0x20,0x20,0x28,0x31,0x21,0x20,0x35,0x20,0x20,0x2f,0x20,0x22,0x28,0x20,0x26,0x2a,0x2e,0x20,0x26,0x20,0x23,0x1f,0x23, +0x1f,0x21,0x22,0x1f,0x27,0x1e,0x21,0x27,0x1f,0x1f,0x1c,0x27,0x20,0x20,0x20,0x23,0x16,0x1a,0x20,0x27,0x27,0x1b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x14,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x04,0x1c,0xd0,0x00,0x00,0x01,0x42,0x01,0x00,0x00,0x07,0x00,0x42,0x00,0x0d,0x00,0x7e,0x03,0x77, +0x03,0x7f,0x03,0x8a,0x03,0x8c,0x03,0xa1,0x05,0x2f,0x05,0x56,0x05,0x5f,0x05,0x87,0x05,0x8a,0x05,0x8f,0x05,0xc7,0x05,0xea,0x05,0xf4,0x06,0x1c,0x06,0xff,0x07,0x7f,0x07,0xc9,0x08,0xb4,0x08,0xbd,0x08,0xff,0x09,0x6f,0x09,0xef,0x09,0xf3,0x0a,0x6f,0x0a,0xef,0x0a,0xf1,0x0b,0x6f,0x0b,0xef,0x0b,0xf9,0x0c,0x6f,0x0c,0xef,0x0d,0x6f, +0x0e,0x3f,0x0e,0x59,0x0e,0xd9,0x0f,0x29,0x10,0x49,0x10,0xc5,0x10,0xc7,0x10,0xcd,0x10,0xff,0x17,0xdb,0x17,0xe9,0x18,0x19,0x19,0xda,0x1c,0xbf,0x1d,0xca,0x1f,0x15,0x1f,0x1d,0x1f,0x45,0x1f,0x4d,0x1f,0x57,0x1f,0x59,0x1f,0x5b,0x1f,0x5d,0x1f,0x7d,0x1f,0xb4,0x1f,0xc4,0x1f,0xd3,0x1f,0xdb,0x1f,0xef,0x1f,0xf4,0x1f,0xfe,0x20,0x22, +0x20,0x26,0x20,0x30,0x20,0x34,0x20,0x3a,0x20,0x3e,0x20,0x44,0x20,0x5f,0x20,0x71,0x20,0x8e,0x20,0x9c,0x20,0xbf,0x20,0xe3,0x20,0xf0,0x21,0x05,0x21,0x13,0x21,0x17,0x21,0x22,0x21,0x26,0x21,0x2e,0x21,0x33,0x21,0x4e,0x21,0x5f,0x21,0x6f,0x21,0x89,0x21,0x94,0x21,0x97,0x21,0x99,0x22,0x02,0x22,0x06,0x22,0x0f,0x22,0x12,0x22,0x15, +0x22,0x1a,0x22,0x1f,0x22,0x29,0x22,0x2b,0x22,0x34,0x22,0x36,0x22,0x48,0x22,0x61,0x22,0x65,0x22,0xf2,0x24,0xff,0x25,0xa1,0x25,0xac,0x25,0xb2,0x25,0xba,0x25,0xbc,0x25,0xc4,0x25,0xcc,0x25,0xcf,0x25,0xd9,0x25,0xe6,0x26,0x61,0x26,0x63,0x26,0x66,0x26,0x6f,0x27,0x7f,0x2c,0x7f,0x2d,0x25,0x2d,0x27,0x2d,0x2d,0x2d,0xff,0x2e,0x17, +0x2e,0x3b,0xa4,0xff,0xa6,0x29,0xa6,0x9f,0xa7,0xae,0xa7,0xb7,0xa7,0xff,0xab,0x65,0xfb,0x06,0xfb,0x17,0xfb,0x36,0xfb,0x3c,0xfb,0x3e,0xfb,0x41,0xfb,0x44,0xfb,0xc1,0xfb,0xff,0xfc,0x63,0xfc,0xf4,0xfd,0x3f,0xfd,0xf2,0xfd,0xf4,0xfd,0xfd,0xfe,0x23,0xfe,0x58,0xfe,0x74,0xfe,0xfc,0xfe,0xff,0xff,0xfd,0xff,0xff,0x00,0x00,0x00,0x0d, +0x00,0x20,0x00,0xa0,0x03,0x7a,0x03,0x84,0x03,0x8c,0x03,0x8e,0x03,0xa3,0x05,0x31,0x05,0x59,0x05,0x61,0x05,0x89,0x05,0x8d,0x05,0x91,0x05,0xd0,0x05,0xef,0x06,0x00,0x06,0x1e,0x07,0x50,0x07,0xc0,0x08,0xa0,0x08,0xb6,0x08,0xd4,0x09,0x66,0x09,0xe6,0x09,0xf2,0x0a,0x66,0x0a,0xe6,0x0a,0xf1,0x0b,0x66,0x0b,0xe6,0x0b,0xf9,0x0c,0x66, +0x0c,0xe6,0x0d,0x66,0x0e,0x3f,0x0e,0x50,0x0e,0xd0,0x0f,0x20,0x10,0x40,0x10,0xa0,0x10,0xc7,0x10,0xcd,0x10,0xd0,0x17,0xdb,0x17,0xe0,0x18,0x10,0x19,0xd0,0x1c,0x90,0x1d,0x00,0x1d,0xfe,0x1f,0x18,0x1f,0x20,0x1f,0x48,0x1f,0x50,0x1f,0x59,0x1f,0x5b,0x1f,0x5d,0x1f,0x5f,0x1f,0x80,0x1f,0xb6,0x1f,0xc6,0x1f,0xd6,0x1f,0xdd,0x1f,0xf2, +0x1f,0xf6,0x20,0x00,0x20,0x26,0x20,0x28,0x20,0x32,0x20,0x39,0x20,0x3c,0x20,0x44,0x20,0x5e,0x20,0x70,0x20,0x74,0x20,0x90,0x20,0xa0,0x20,0xe3,0x20,0xf0,0x21,0x05,0x21,0x13,0x21,0x16,0x21,0x22,0x21,0x26,0x21,0x2e,0x21,0x33,0x21,0x4d,0x21,0x50,0x21,0x6c,0x21,0x7a,0x21,0x90,0x21,0x97,0x21,0x99,0x22,0x02,0x22,0x06,0x22,0x0f, +0x22,0x11,0x22,0x15,0x22,0x19,0x22,0x1e,0x22,0x29,0x22,0x2b,0x22,0x34,0x22,0x36,0x22,0x48,0x22,0x60,0x22,0x64,0x22,0xf2,0x24,0xff,0x25,0xa0,0x25,0xaa,0x25,0xb2,0x25,0xba,0x25,0xbc,0x25,0xc4,0x25,0xca,0x25,0xcf,0x25,0xd8,0x25,0xe6,0x26,0x60,0x26,0x63,0x26,0x65,0x26,0x6f,0x27,0x76,0x2c,0x60,0x2d,0x00,0x2d,0x27,0x2d,0x2d, +0x2d,0xe0,0x2e,0x17,0x2e,0x32,0xa4,0xd0,0xa6,0x20,0xa6,0x40,0xa7,0x00,0xa7,0xb0,0xa7,0xf7,0xab,0x30,0xfb,0x00,0xfb,0x13,0xfb,0x1d,0xfb,0x38,0xfb,0x3e,0xfb,0x40,0xfb,0x43,0xfb,0x46,0xfb,0xd3,0xfc,0x5e,0xfc,0xf2,0xfd,0x3c,0xfd,0xf2,0xfd,0xf4,0xfd,0xfa,0xfe,0x20,0xfe,0x58,0xfe,0x70,0xfe,0x76,0xfe,0xff,0xff,0xfc,0xff,0xff, +0xff,0xf5,0xff,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x19,0x00,0x00,0x00,0x00,0x07,0x2a,0x07,0x28,0x07,0x27,0x07,0x26,0x00,0x00,0x00,0x00,0x05,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0c,0x00,0x00,0x0b,0x9f,0x00,0x00,0x06,0x70,0x05,0xfa,0x0a,0x5b,0x05,0x84,0x05,0x0e,0x09,0x5e,0x04,0x98,0x04,0x22,0x08,0x57, +0x03,0xac,0x03,0x36,0x02,0xc0,0xfa,0x4d,0x01,0xe0,0x01,0x6a,0x01,0x24,0x00,0x0e,0xfb,0x42,0xfe,0xfe,0xfe,0xf9,0x00,0x00,0xfc,0x76,0xf8,0x82,0xf8,0x5c,0xf6,0xa6,0xf8,0x1f,0x00,0x00,0x00,0x00,0xe4,0x77,0xe4,0x75,0xe4,0x73,0xe4,0x71,0xe4,0x70,0xe4,0x6f,0xe4,0x6e,0xe4,0x6d,0xe4,0x6b,0xe4,0x6a,0xe4,0x69,0xe4,0x67,0xe4,0x66, +0xe4,0x64,0xe4,0x63,0x00,0x00,0xe0,0x86,0x00,0x00,0x00,0x00,0xe0,0x85,0x00,0x00,0xe0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xaa,0xea,0x32,0xe0,0x39,0xe0,0x2c,0x00,0x00,0xdf,0x6b,0xdf,0x79,0xe0,0x69,0xf3,0x1f,0xe9,0x97,0x00,0x00,0xf1,0x80,0x00,0x00,0xe9,0x9c,0xef,0xeb,0xef,0xea,0xde,0x97,0xe9,0x2b, +0xde,0x8c,0x00,0x00,0xde,0xa7,0x00,0x00,0x00,0x00,0xe9,0x0a,0xde,0x71,0xe9,0x00,0xee,0xc4,0xde,0x60,0x00,0x00,0xde,0x31,0xe8,0x43,0xe3,0x83,0x00,0x00,0x00,0x00,0xe5,0x86,0xe5,0x7f,0xe5,0x7e,0xe5,0x77,0x00,0x00,0xdb,0x74,0xe5,0x65,0xdb,0x5e,0x00,0x00,0xe4,0xdd,0xe4,0xdc,0xeb,0x1a,0x00,0x00,0x00,0x00,0xdf,0x35,0xe2,0xa3, +0xe2,0x9e,0xe3,0x30,0xda,0x43,0xe5,0x3b,0x68,0xf2,0x6a,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x9e,0x00,0x00,0x10,0x6c,0x10,0x6b,0x10,0x6a,0x10,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xf8,0x00,0x00,0x0c,0x71,0x15,0xfb,0x00,0x00,0x09,0x1a,0x14,0xa7,0x15,0x83,0x00,0x00,0x0c,0x0c,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x3e,0x06,0xec,0x06,0xf6,0x00,0x00,0x07,0x00,0x07,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x36,0x0a,0x3a,0x00,0x00,0x0a,0xa4,0x0a,0xae,0x0a,0xe6,0x0c,0xa8,0x00,0x00,0x0d,0x04,0x00,0x00,0x0d,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0xac,0x0f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x50,0x00,0x00,0x11,0x92,0x11,0xa2,0x00,0x00,0x11,0xa4,0x00,0x00,0x11,0xa6,0x11,0xa8,0x11,0xaa,0x11,0xde,0x11,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x24,0x00,0x00,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x12,0x52,0x00,0x00,0x12,0x52,0x12,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x48,0x12,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x40,0x12,0x52,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x80,0x13,0x3e,0x14,0x9a,0x14,0xa8,0x14,0xb8,0x15,0x22,0x00,0x00,0x15,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x56,0x16,0x4c,0x16,0xa4,0x00,0x00,0x16,0xac,0x00,0x00,0x00,0x00,0x16,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xae,0x00,0x00, +0x17,0xb8,0x00,0x00,0x00,0xa3,0x00,0xa4,0x00,0x84,0x00,0x85,0x02,0x3f,0x00,0x97,0x00,0xe7,0x00,0x86,0x00,0x8f,0x00,0x8c,0x00,0x9d,0x00,0xaa,0x00,0xa5,0x00,0x8a,0x00,0x8b,0x01,0x01,0x00,0x83,0x00,0x94,0x08,0x96,0x08,0x97,0x00,0x8e,0x00,0x98,0x00,0x88,0x00,0xc3,0x00,0xdd,0x08,0x98,0x00,0x9e,0x00,0xab,0x00,0xf4,0x00,0xf3, +0x00,0xf5,0x00,0xa2,0x00,0xad,0x00,0xc9,0x00,0xc7,0x00,0xae,0x00,0x62,0x00,0x63,0x00,0x91,0x00,0x64,0x00,0xcb,0x00,0x65,0x00,0xc8,0x00,0xca,0x00,0xcf,0x00,0xcc,0x00,0xcd,0x00,0xce,0x00,0xe8,0x00,0x66,0x00,0xd2,0x00,0xd0,0x00,0xd1,0x00,0xaf,0x00,0x67,0x00,0xef,0x00,0x92,0x00,0xd5,0x00,0xd3,0x00,0xd4,0x00,0x68,0x00,0xea, +0x00,0xec,0x00,0x89,0x00,0x6a,0x00,0x69,0x00,0x6b,0x00,0x6d,0x00,0x6c,0x00,0x6e,0x00,0xa0,0x00,0x6f,0x00,0x71,0x00,0x70,0x00,0x72,0x00,0x73,0x00,0x75,0x00,0x74,0x00,0x76,0x00,0x77,0x00,0xe9,0x00,0x78,0x00,0x7a,0x00,0x79,0x00,0x7b,0x00,0x7d,0x00,0x7c,0x00,0xb8,0x00,0xa1,0x00,0x7f,0x00,0x7e,0x00,0x80,0x00,0x81,0x00,0xeb, +0x00,0xed,0x00,0xba,0x01,0x45,0x01,0x46,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x00,0xfc,0x00,0xfd,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x00,0xfe,0x00,0xff,0x01,0x07,0x01,0x08,0x01,0x09,0x01,0x00,0x01,0x4b,0x01,0x4c,0x01,0x4d,0x01,0x4e,0x01,0x4f,0x01,0x50,0x01,0x0a,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x01,0x51,0x01,0x52, +0x00,0xf7,0x00,0xf8,0x01,0x53,0x01,0x54,0x01,0x55,0x01,0x56,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x5a,0x01,0x5b,0x01,0x5c,0x01,0x5d,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x61,0x01,0x62,0x00,0xf9,0x00,0xd6,0x01,0x39,0x01,0x3a,0x01,0x63,0x01,0x64,0x01,0x65,0x01,0x66,0x01,0x67,0x01,0x0e,0x01,0x0f,0x01,0x68,0x01,0x69,0x01,0x10, +0x01,0x11,0x01,0x12,0x01,0x13,0x00,0xe1,0x00,0xe2,0x01,0x14,0x01,0x15,0x01,0x6a,0x01,0x6b,0x01,0x16,0x01,0x17,0x01,0x3b,0x01,0x6c,0x01,0x6d,0x01,0x6e,0x01,0x6f,0x01,0x70,0x01,0x71,0x01,0x18,0x01,0x19,0x00,0xb0,0x00,0xb1,0x01,0x1a,0x01,0x1b,0x01,0x72,0x01,0x73,0x01,0x1c,0x01,0x1d,0x01,0x1e,0x01,0x1f,0x01,0x74,0x01,0x75, +0x00,0xfa,0x00,0xfb,0x00,0xe3,0x00,0xe4,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0x79,0x01,0x7a,0x01,0x7b,0x01,0x7c,0x01,0x7d,0x01,0x24,0x01,0x25,0x01,0x26,0x01,0x27,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x00,0xbb,0x01,0x28,0x01,0x29,0x01,0x2a,0x01,0x2b,0x00,0xe5, +0x00,0xe6,0x01,0x84,0x04,0xb0,0x04,0xb1,0x04,0xb2,0x04,0xb3,0x04,0xb4,0x04,0xb5,0x04,0xb6,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xba,0x04,0xbb,0x04,0xbc,0x04,0xbd,0x04,0xbe,0x02,0xcd,0x04,0xbf,0x04,0xc0,0x00,0xa7,0x04,0xc1,0x04,0xc2,0x04,0xc3,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc7,0x04,0xc8,0x04,0xc9,0x04,0xca,0x04,0xcb, +0x04,0xcc,0x04,0xcd,0x02,0x40,0x02,0x41,0x04,0xce,0x04,0xcf,0x04,0xd0,0x04,0xd1,0x04,0xd2,0x04,0xd3,0x04,0xd4,0x04,0xd5,0x04,0xd6,0x04,0xd7,0x04,0xd8,0x04,0xd9,0x04,0xda,0x02,0x42,0x02,0x43,0x04,0xdb,0x04,0xdc,0x04,0xdd,0x04,0xde,0x04,0xdf,0x04,0xe0,0x04,0xe1,0x04,0xe2,0x04,0xe3,0x04,0xe4,0x04,0xe5,0x04,0xe6,0x04,0xe7, +0x04,0xe8,0x04,0xe9,0x04,0xea,0x04,0xeb,0x04,0xec,0x04,0xed,0x04,0xee,0x04,0xef,0x04,0xf0,0x04,0xf1,0x04,0xf2,0x04,0xf3,0x04,0xf4,0x04,0xf5,0x04,0xf6,0x04,0xf7,0x04,0xf8,0x04,0xf9,0x04,0xfa,0x04,0xfb,0x04,0xfc,0x04,0xfd,0x04,0xfe,0x04,0xff,0x05,0x00,0x05,0x01,0x05,0x02,0x05,0x03,0x05,0x04,0x05,0x05,0x05,0x06,0x05,0x07, +0x05,0x08,0x05,0x09,0x05,0x0a,0x05,0x0b,0x05,0x0c,0x05,0x0d,0x05,0x0e,0x05,0x0f,0x05,0x10,0x05,0x11,0x05,0x12,0x05,0x13,0x05,0x14,0x05,0x15,0x05,0x16,0x05,0x17,0x05,0x18,0x05,0x19,0x05,0x1a,0x05,0x1b,0x05,0x1c,0x05,0x1d,0x05,0x1e,0x05,0x1f,0x05,0x20,0x05,0x21,0x05,0x22,0x05,0x23,0x01,0x85,0x01,0x86,0x01,0x87,0x01,0x88, +0x01,0x89,0x01,0x8a,0x05,0x24,0x05,0x25,0x05,0x26,0x05,0x27,0x05,0x28,0x05,0x29,0x05,0x2a,0x05,0x2b,0x05,0x2c,0x05,0x2d,0x05,0x2e,0x05,0x2f,0x05,0x30,0x05,0x31,0x05,0x32,0x05,0x33,0x05,0x34,0x05,0x35,0x05,0x36,0x05,0x37,0x05,0x38,0x05,0x39,0x05,0x3a,0x05,0x3b,0x02,0x3d,0x02,0x3e,0x02,0xaf,0x02,0xb0,0x05,0x3c,0x05,0x3d, +0x05,0x3e,0x05,0x3f,0x05,0x40,0x07,0x3e,0x05,0x41,0x05,0x42,0x05,0x43,0x05,0x44,0x05,0x45,0x05,0x46,0x02,0xe1,0x02,0xe2,0x05,0x47,0x05,0x48,0x05,0x49,0x05,0x4a,0x05,0x4b,0x05,0x4c,0x05,0x4d,0x05,0x4e,0x05,0x4f,0x05,0x50,0x07,0x3f,0x07,0x40,0x07,0x41,0x06,0xac,0x07,0xe1,0x07,0xe2,0x07,0xe4,0x07,0xe5,0x07,0xe6,0x07,0xe7, +0x07,0xe8,0x07,0xe9,0x07,0xea,0x07,0xeb,0x0a,0xbf,0x0a,0xc0,0x0a,0xc1,0x0a,0xc2,0x0a,0xc3,0x0a,0xc4,0x0a,0xc5,0x0a,0xc6,0x0a,0xc7,0x0a,0xc8,0x0a,0xc9,0x0a,0xca,0x0a,0xcb,0x0a,0xcc,0x05,0x56,0x05,0x57,0x05,0x58,0x05,0x59,0x05,0x5a,0x05,0x5b,0x05,0x5c,0x05,0x5d,0x05,0x5e,0x02,0xce,0x05,0x5f,0x05,0x60,0x05,0x61,0x05,0x62, +0x05,0x63,0x05,0x64,0x05,0x65,0x05,0x66,0x05,0x67,0x05,0x68,0x05,0x69,0x05,0x6a,0x05,0x6b,0x05,0x6c,0x05,0x6d,0x05,0x6e,0x05,0x6f,0x05,0x70,0x05,0x71,0x05,0x72,0x05,0x73,0x05,0x74,0x05,0x75,0x05,0x76,0x05,0x77,0x05,0x78,0x05,0x79,0x05,0x7a,0x05,0x7b,0x05,0x7c,0x05,0x7d,0x05,0x7e,0x05,0x7f,0x05,0x80,0x05,0x81,0x05,0x82, +0x05,0x83,0x05,0x84,0x05,0x85,0x05,0x86,0x05,0x87,0x05,0x88,0x05,0x89,0x05,0x8a,0x05,0x8b,0x05,0x8c,0x05,0x8d,0x05,0x8e,0x05,0x8f,0x05,0x90,0x05,0x91,0x05,0x92,0x05,0x93,0x05,0x94,0x05,0x95,0x05,0x96,0x05,0x97,0x05,0x98,0x05,0x99,0x05,0x9a,0x05,0x9b,0x05,0x9c,0x05,0x9d,0x05,0x9e,0x05,0x9f,0x05,0xa0,0x05,0xa1,0x05,0xa2, +0x05,0xa3,0x05,0xa4,0x05,0xa5,0x05,0xa6,0x05,0xa7,0x05,0xa8,0x05,0xa9,0x05,0xaa,0x05,0xab,0x05,0xac,0x05,0xad,0x05,0xae,0x05,0xaf,0x05,0xb0,0x05,0xb1,0x05,0xb2,0x07,0x42,0x07,0x43,0x06,0x76,0x06,0x77,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x7c,0x06,0x7d,0x06,0x7e,0x06,0x7f,0x06,0x80,0x06,0x81,0x06,0x82,0x06,0x83, +0x06,0x84,0x06,0x85,0x06,0x86,0x06,0x87,0x06,0x88,0x06,0x89,0x06,0x8a,0x06,0x8b,0x00,0xd7,0x00,0xe0,0x06,0x8c,0x00,0xd9,0x06,0x8d,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x00,0xda,0x00,0xdb,0x00,0xdc,0x00,0xdf,0x00,0xd8,0x00,0xde, +0x06,0x9b,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa3,0x06,0xa4,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x07,0x44,0x07,0x45,0x07,0x46,0x07,0x47,0x07,0x48,0x07,0x49,0x07,0x4a,0x07,0x4b,0x07,0x4c,0x07,0x4d,0x07,0x4e,0x07,0x4f,0x07,0x50,0x07,0x51,0x07,0x52, +0x07,0x53,0x07,0x54,0x02,0x46,0x02,0x47,0x04,0x62,0x04,0x63,0x04,0x64,0x04,0x65,0x04,0x66,0x04,0x67,0x04,0x68,0x02,0x44,0x04,0x69,0x04,0x6a,0x04,0x6b,0x04,0x6c,0x04,0x6d,0x04,0x6e,0x04,0x6f,0x04,0x70,0x04,0x71,0x04,0x72,0x04,0x73,0x04,0x74,0x04,0x75,0x04,0x76,0x04,0x77,0x04,0x78,0x04,0x79,0x04,0x7a,0x04,0x7b,0x04,0x7c, +0x04,0x7d,0x04,0x7e,0x04,0x7f,0x04,0x80,0x04,0x81,0x02,0x45,0x04,0x82,0x04,0x83,0x04,0x84,0x04,0x85,0x04,0x86,0x04,0x87,0x04,0x88,0x04,0x89,0x04,0x8a,0x04,0x8b,0x04,0x8c,0x04,0x8d,0x04,0x8e,0x04,0x8f,0x04,0x90,0x04,0x91,0x04,0x92,0x04,0x93,0x04,0x94,0x04,0x95,0x04,0x96,0x04,0x97,0x04,0x98,0x04,0x99,0x04,0x9a,0x04,0x9b, +0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xa2,0x04,0xa3,0x04,0xa4,0x04,0xa5,0x04,0xa6,0x04,0xa7,0x04,0xa8,0x04,0xa9,0x04,0xaa,0x04,0xab,0x04,0xac,0x07,0x39,0x07,0x55,0x07,0x56,0x07,0x57,0x07,0x58,0x07,0x59,0x07,0x5a,0x07,0x5b,0x07,0x5c,0x07,0xec,0x07,0xed,0x07,0xee,0x07,0xef,0x07,0xf0,0x07,0x5d, +0x07,0x5e,0x07,0x5f,0x04,0xad,0x04,0xae,0x04,0xaf,0x06,0x66,0x06,0x67,0x06,0x68,0x06,0x69,0x06,0x6a,0x06,0x6b,0x06,0x6c,0x06,0x6d,0x06,0x6e,0x06,0x6f,0x06,0x70,0x06,0x71,0x06,0x72,0x13,0x46,0x13,0x47,0x13,0x48,0x13,0x49,0x06,0x73,0x06,0x74,0x13,0x4a,0x13,0x4b,0x06,0x75,0x0a,0xcd,0x0a,0xce,0x0a,0xcf,0x01,0x9e,0x14,0x19, +0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0x8b,0x01,0xa2,0x01,0xa3,0x01,0xa4,0x01,0xa6,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0x2c,0x00,0xa9,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0x2d,0x01,0xae,0x01,0xaf,0x01,0xb0,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4,0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0x2e,0x01,0xba, +0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x01,0xc3,0x01,0x2f,0x01,0xc4,0x01,0xc5,0x01,0x30,0x01,0x31,0x01,0xc6,0x01,0xc7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xcc,0x01,0xcd,0x01,0xce,0x01,0xcf,0x02,0x37,0x01,0xd0,0x01,0xd1,0x01,0x32,0x01,0x33,0x01,0xd2,0x01,0x34,0x01,0xd3, +0x01,0xd4,0x01,0xd5,0x01,0xd6,0x01,0xd7,0x01,0xd8,0x01,0xd9,0x01,0xda,0x13,0x4c,0x05,0xb3,0x05,0xb4,0x05,0xb5,0x05,0xb6,0x05,0xb7,0x05,0xb8,0x05,0xb9,0x05,0xba,0x05,0xbb,0x05,0xbc,0x05,0xbd,0x05,0xbe,0x05,0xbf,0x05,0xc0,0x05,0xc1,0x05,0xc2,0x05,0xc3,0x05,0xc4,0x05,0xc5,0x05,0xc6,0x05,0xc7,0x05,0xc8,0x05,0xc9,0x05,0xca, +0x05,0xcb,0x05,0xcc,0x05,0xcd,0x05,0xce,0x05,0xcf,0x05,0xd0,0x05,0xd1,0x05,0xd2,0x05,0xd3,0x05,0xd4,0x05,0xd5,0x05,0xd6,0x05,0xd7,0x05,0xd8,0x05,0xd9,0x07,0x60,0x07,0x61,0x08,0xc0,0x08,0xc1,0x08,0xc2,0x07,0xf1,0x07,0xf2,0x07,0xf3,0x07,0xf4,0x02,0xb1,0x01,0xdb,0x01,0xdc,0x01,0xdd,0x01,0xde,0x01,0xdf,0x02,0xb5,0x01,0xe0, +0x02,0xb6,0x01,0xe1,0x01,0xe2,0x01,0xe3,0x01,0xe4,0x02,0xb3,0x01,0xe5,0x01,0xe6,0x01,0xe7,0x01,0xe8,0x01,0xe9,0x01,0xea,0x01,0xeb,0x01,0xec,0x01,0xed,0x01,0xee,0x01,0xef,0x01,0xf0,0x01,0xf1,0x01,0xf2,0x01,0xf3,0x01,0xf4,0x01,0xf5,0x01,0xf6,0x01,0xf7,0x01,0xf8,0x01,0xf9,0x01,0xfa,0x01,0xfb,0x01,0xfc,0x01,0xfd,0x01,0xfe, +0x01,0xff,0x02,0x00,0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x04,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x09,0x02,0x0a,0x02,0x0b,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x10,0x02,0x11,0x02,0x12,0x02,0x13,0x02,0x14,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x1a,0x02,0x1b,0x02,0x1c,0x02,0x1d,0x02,0x1e, +0x02,0x1f,0x02,0x20,0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x24,0x02,0x25,0x02,0x26,0x02,0xb2,0x02,0x27,0x02,0x28,0x02,0x29,0x02,0x2a,0x02,0x2b,0x02,0xb7,0x02,0x2c,0x02,0xb8,0x02,0x2d,0x02,0x2e,0x02,0x2f,0x02,0x30,0x02,0xb4,0x02,0x31,0x02,0x32,0x05,0xda,0x05,0xdb,0x05,0xdc,0x05,0xdd,0x05,0xde,0x05,0xdf,0x05,0xe0,0x05,0xe1, +0x05,0xe2,0x05,0xe3,0x05,0xe4,0x05,0xe5,0x05,0xe6,0x05,0xe7,0x05,0xe8,0x05,0xe9,0x05,0xea,0x05,0xeb,0x05,0xec,0x05,0xed,0x05,0xee,0x05,0xef,0x05,0xf0,0x05,0xf1,0x05,0xf2,0x05,0xf3,0x05,0xf4,0x05,0xf5,0x05,0xf6,0x05,0xf7,0x05,0xf8,0x05,0xf9,0x05,0xfa,0x05,0xfb,0x05,0xfc,0x05,0xfd,0x05,0xfe,0x05,0xff,0x06,0x00,0x0b,0x1c, +0x06,0x01,0x06,0x02,0x08,0xb4,0x08,0xb5,0x06,0x03,0x06,0x04,0x06,0x05,0x06,0x06,0x02,0x33,0x02,0x34,0x02,0xb9,0x02,0xba,0x06,0x07,0x06,0x08,0x02,0xbb,0x02,0xbc,0x06,0x09,0x06,0x0a,0x02,0xbd,0x02,0xbe,0x02,0xbf,0x02,0xc0,0x06,0x0b,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x02,0xc1,0x02,0xc2,0x06,0x0f,0x06,0x10,0x06,0x11,0x06,0x12, +0x06,0x13,0x06,0x14,0x06,0x15,0x06,0x16,0x06,0x17,0x06,0x18,0x02,0xc3,0x02,0xc4,0x02,0xc5,0x02,0xc6,0x02,0xc7,0x02,0xc8,0x06,0x19,0x06,0x1a,0x06,0x1b,0x06,0x1c,0x02,0xc9,0x02,0xca,0x02,0xcb,0x02,0xcc,0x06,0x1d,0x06,0x1e,0x06,0x1f,0x06,0x20,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x25,0x08,0xb6,0x08,0xb7,0x06,0x26, +0x06,0x27,0x08,0xb8,0x08,0xb9,0x06,0x28,0x06,0x29,0x08,0xba,0x08,0xbb,0x0a,0xd0,0x06,0x2a,0x06,0x2b,0x06,0x2c,0x06,0x2d,0x06,0x2e,0x06,0x2f,0x06,0x30,0x06,0x31,0x06,0x32,0x06,0x33,0x06,0x34,0x06,0x35,0x06,0x36,0x06,0x37,0x06,0x38,0x06,0x39,0x06,0x3a,0x06,0x3b,0x06,0x3c,0x06,0x3d,0x06,0x3e,0x06,0x3f,0x06,0x40,0x06,0x41, +0x02,0xcf,0x02,0xd0,0x06,0x42,0x06,0x43,0x06,0x44,0x06,0x45,0x06,0x46,0x06,0x47,0x06,0x48,0x06,0x49,0x06,0x4a,0x06,0x4b,0x06,0x4c,0x06,0x4d,0x07,0xf5,0x07,0xf6,0x06,0x4e,0x06,0x4f,0x0a,0xd1,0x0a,0xd2,0x0a,0xd3,0x0a,0xd4,0x0a,0xd5,0x0a,0xd6,0x06,0x50,0x06,0x51,0x06,0x52,0x06,0x53,0x06,0x54,0x06,0x55,0x06,0x56,0x06,0x57, +0x06,0x58,0x06,0x59,0x06,0x5a,0x06,0x5b,0x06,0x5c,0x06,0x5d,0x06,0x5e,0x06,0x5f,0x0a,0xd7,0x0a,0xd8,0x0a,0xd9,0x0a,0xda,0x13,0x4d,0x13,0x4e,0x13,0x4f,0x13,0x50,0x13,0x51,0x13,0x52,0x0b,0x1d,0x0b,0x1e,0x0b,0x1f,0x0b,0x20,0x13,0x53,0x13,0x54,0x13,0x55,0x13,0x56,0x13,0x57,0x13,0x58,0x14,0x1a,0x14,0x1b,0x13,0x59,0x13,0x5a, +0x14,0x1c,0x14,0x1d,0x14,0x1e,0x14,0x1f,0x14,0x20,0x14,0x21,0x14,0x22,0x14,0x23,0x11,0x8a,0x11,0x8b,0x0f,0xc4,0x0b,0xbf,0x0b,0xc0,0x0b,0xc1,0x0b,0xc2,0x0b,0xc3,0x0b,0xc4,0x0b,0xc5,0x0b,0xc6,0x0b,0xc7,0x0b,0xc8,0x0b,0xc9,0x0b,0xca,0x0b,0xcb,0x0b,0xcc,0x0b,0xcd,0x0b,0xce,0x0b,0xcf,0x0b,0xd0,0x0b,0xd1,0x0b,0xd2,0x0b,0xd3, +0x0b,0xd4,0x0b,0xd5,0x0b,0xd6,0x0b,0xd7,0x0b,0xd8,0x0b,0xd9,0x0b,0xda,0x0b,0xdb,0x0b,0xdc,0x0b,0xdd,0x0b,0x53,0x0b,0x54,0x0b,0x55,0x0b,0x56,0x0b,0x57,0x0b,0x58,0x0b,0x59,0x0b,0x5a,0x0b,0x5b,0x0b,0x5c,0x0b,0xde,0x0b,0x5d,0x0b,0x5e,0x0b,0x5f,0x0b,0x60,0x0b,0x61,0x0b,0x62,0x0b,0x63,0x0b,0x64,0x0b,0x65,0x0b,0x66,0x0b,0x67, +0x0b,0xdf,0x0b,0xb9,0x14,0xdf,0x0b,0x83,0x0b,0x84,0x0b,0x85,0x0b,0x86,0x0b,0x87,0x0a,0x44,0x0a,0x45,0x0a,0x46,0x0a,0x47,0x13,0x45,0x14,0x03,0x0e,0x13,0x0e,0x14,0x0e,0x16,0x0e,0x17,0x0e,0x18,0x0a,0x6a,0x08,0xf8,0x0a,0x49,0x0a,0x48,0x0a,0x4a,0x0a,0x4b,0x0a,0x4c,0x0a,0x4d,0x0a,0x4e,0x0a,0x4f,0x0a,0x53,0x0e,0x1a,0x0e,0x1b, +0x0e,0x1c,0x0e,0x1d,0x0e,0x1e,0x09,0x05,0x13,0x92,0x0a,0x6b,0x09,0x06,0x0e,0x20,0x09,0x07,0x09,0x08,0x09,0x09,0x09,0x0a,0x09,0x0b,0x09,0x0c,0x09,0x0d,0x09,0x0e,0x09,0x0f,0x09,0x10,0x09,0x11,0x09,0x12,0x09,0x13,0x09,0x14,0x09,0x15,0x09,0x16,0x09,0x17,0x09,0x18,0x09,0x19,0x09,0x1a,0x09,0x1b,0x09,0x1c,0x09,0x1d,0x09,0x1e, +0x09,0x1f,0x09,0x20,0x0e,0x3f,0x0e,0x43,0x0e,0x47,0x0e,0x4b,0x0e,0x4f,0x09,0x21,0x09,0x22,0x09,0x23,0x09,0x24,0x09,0x25,0x09,0x26,0x09,0x27,0x09,0x28,0x09,0x29,0x09,0x2a,0x09,0x2b,0x09,0x2c,0x09,0x2d,0x09,0x2e,0x09,0x2f,0x09,0x30,0x09,0x31,0x09,0x32,0x09,0x33,0x09,0x37,0x09,0x7e,0x09,0x7f,0x0a,0x50,0x0a,0x51,0x0a,0x52, +0x0a,0x6c,0x0a,0x6d,0x0a,0x6e,0x0a,0x6f,0x0a,0x70,0x0a,0x71,0x09,0x77,0x08,0xd7,0x08,0xd8,0x08,0xd9,0x08,0xda,0x08,0xdb,0x08,0xdc,0x08,0xdd,0x08,0xde,0x08,0xdf,0x08,0xe0,0x09,0x6a,0x09,0x03,0x0e,0x6d,0x09,0x6b,0x09,0x3e,0x09,0x7c,0x09,0x73,0x09,0x80,0x09,0x82,0x09,0x84,0x0e,0x73,0x09,0x86,0x09,0x88,0x09,0x89,0x09,0x8a, +0x09,0x5b,0x09,0x8c,0x09,0x8e,0x09,0x90,0x09,0x92,0x09,0x40,0x09,0x94,0x09,0x96,0x09,0x98,0x09,0x9b,0x09,0x9e,0x09,0xa1,0x09,0xa4,0x09,0x42,0x09,0xa7,0x09,0x5d,0x09,0xaa,0x09,0xab,0x09,0xac,0x09,0xad,0x09,0xae,0x09,0xaf,0x09,0xb0,0x09,0xb1,0x09,0x5e,0x09,0xb2,0x09,0xb3,0x09,0xb4,0x09,0xb5,0x09,0xb6,0x09,0xb7,0x09,0x45, +0x09,0xb8,0x09,0xb9,0x09,0xbb,0x09,0xbd,0x09,0xbf,0x09,0xc1,0x09,0xc3,0x09,0xc4,0x09,0xc8,0x09,0xc9,0x09,0xcc,0x09,0x6c,0x09,0xcf,0x09,0xd2,0x09,0xd5,0x09,0xd6,0x09,0x46,0x09,0xd7,0x09,0xd9,0x09,0xdb,0x09,0xdd,0x09,0xdf,0x09,0x48,0x09,0xe1,0x09,0xe3,0x09,0xe5,0x09,0xe7,0x09,0xe9,0x09,0xeb,0x09,0xed,0x09,0xef,0x09,0xf1, +0x09,0xf3,0x09,0x5f,0x09,0xf5,0x09,0xf6,0x09,0xf8,0x08,0xf1,0x09,0xfa,0x09,0x4e,0x09,0x60,0x09,0x63,0x09,0x64,0x09,0xfd,0x09,0xfe,0x09,0xff,0x0a,0x00,0x0a,0x01,0x0a,0x02,0x0a,0x03,0x0a,0x04,0x09,0x4a,0x0a,0x05,0x0a,0x07,0x0a,0x0a,0x0a,0x0b,0x0a,0x0d,0x09,0x65,0x09,0x67,0x09,0x69,0x0b,0x19,0x09,0x74,0x0a,0x0f,0x0a,0x10, +0x09,0x75,0x0a,0x11,0x0a,0x12,0x0a,0x13,0x0a,0x14,0x0a,0x15,0x0a,0x16,0x0a,0x17,0x0a,0x18,0x0a,0x19,0x0a,0x1a,0x0a,0x1b,0x0a,0x1c,0x0a,0x1d,0x0a,0x1e,0x0a,0x1f,0x0a,0x20,0x0a,0x21,0x0a,0x22,0x0e,0xeb,0x0a,0x23,0x0a,0x54,0x0a,0x56,0x09,0x4f,0x09,0x50,0x09,0x51,0x09,0x52,0x09,0x53,0x09,0x54,0x09,0x55,0x09,0x56,0x09,0x57, +0x09,0x58,0x0a,0x24,0x0a,0x26,0x0a,0x28,0x0a,0x2c,0x0a,0x2d,0x0a,0x58,0x0a,0x72,0x0a,0x74,0x0a,0x76,0x0a,0x78,0x0a,0x7a,0x0a,0x7c,0x0a,0x7e,0x0a,0x80,0x0a,0x83,0x0a,0x86,0x0a,0x87,0x0a,0x88,0x0a,0x89,0x0a,0x8b,0x0a,0x8f,0x0a,0x93,0x0a,0x97,0x0a,0x9a,0x0a,0x9d,0x0a,0xa0,0x0a,0xa3,0x0a,0xa6,0x0a,0xa8,0x0a,0xaa,0x0a,0xac, +0x0a,0xae,0x0a,0xb0,0x0a,0xb4,0x0a,0xb5,0x0a,0xb6,0x0f,0x16,0x0f,0x1a,0x0f,0x1e,0x0f,0x22,0x0f,0x24,0x0f,0x28,0x0f,0x2a,0x0f,0x2c,0x0f,0x30,0x0f,0x34,0x0f,0x38,0x0f,0x3a,0x0f,0x3c,0x0f,0x3e,0x0f,0x40,0x0f,0x44,0x0f,0x48,0x0f,0x4c,0x13,0x02,0x14,0x04,0x13,0x04,0x13,0x08,0x13,0x0c,0x13,0x10,0x13,0x14,0x13,0x18,0x13,0x1c, +0x13,0x20,0x13,0x24,0x13,0x26,0x13,0x28,0x14,0x08,0x14,0x09,0x14,0x0b,0x14,0x0f,0x14,0x13,0x14,0x15,0x14,0x53,0x14,0x54,0x14,0x5d,0x14,0x5e,0x14,0x5f,0x14,0x60,0x14,0x61,0x14,0x62,0x14,0x63,0x14,0x64,0x14,0x65,0x14,0x66,0x14,0x67,0x14,0x68,0x14,0x69,0x14,0x6a,0x14,0x6b,0x14,0x6c,0x13,0x2a,0x13,0x2b,0x13,0x2c,0x13,0x2d, +0x13,0x2e,0x13,0x2f,0x13,0x30,0x13,0x31,0x13,0x32,0x13,0x33,0x13,0x34,0x13,0x35,0x13,0x36,0x13,0x37,0x13,0x38,0x13,0x39,0x13,0x3a,0x13,0x3b,0x13,0x3c,0x13,0x3d,0x13,0x3e,0x13,0x3f,0x13,0x40,0x13,0x41,0x13,0x42,0x13,0x43,0x13,0x44,0x14,0x17,0x0c,0x08,0x0c,0x09,0x0c,0x0a,0x0c,0x0b,0x0c,0x0c,0x0c,0x0d,0x0c,0x0e,0x0c,0x0f, +0x0c,0x10,0x0c,0x11,0x0c,0x12,0x0c,0x13,0x0c,0x14,0x0c,0x15,0x0c,0x16,0x0c,0x17,0x0c,0x18,0x0c,0x19,0x0c,0x1a,0x0c,0x1b,0x0c,0x1c,0x0c,0x1d,0x0c,0x1e,0x0c,0x1f,0x0c,0x20,0x0c,0x21,0x0c,0x22,0x0c,0x23,0x0c,0x24,0x0c,0x25,0x0c,0x26,0x0c,0x27,0x0c,0x28,0x0c,0x29,0x0c,0x2a,0x0c,0x2b,0x0c,0x2c,0x0c,0x2d,0x0c,0x2e,0x0c,0x2f, +0x0c,0x30,0x0c,0x31,0x0c,0x32,0x0c,0x33,0x0c,0x34,0x0f,0xc7,0x0f,0xc8,0x0f,0xc9,0x07,0x62,0x07,0x63,0x07,0x64,0x07,0x65,0x07,0x66,0x07,0x67,0x07,0x68,0x07,0x69,0x07,0x6a,0x07,0x6b,0x07,0x6c,0x07,0x6d,0x07,0x6e,0x07,0x6f,0x07,0x70,0x07,0x71,0x07,0x72,0x07,0x73,0x07,0x74,0x07,0x75,0x07,0x76,0x07,0x77,0x07,0x78,0x07,0x79, +0x07,0x7a,0x07,0x7b,0x07,0x7c,0x07,0x7d,0x07,0x7e,0x07,0x7f,0x07,0x80,0x07,0x81,0x07,0x82,0x07,0x83,0x07,0x84,0x07,0x85,0x07,0x86,0x07,0x87,0x07,0x88,0x07,0x89,0x07,0x8a,0x07,0x8b,0x07,0x8c,0x07,0x8d,0x07,0x8e,0x07,0x8f,0x07,0x90,0x07,0x91,0x07,0x92,0x07,0x93,0x07,0x94,0x07,0x95,0x07,0x96,0x07,0x97,0x07,0x98,0x07,0x99, +0x07,0x9a,0x07,0x9b,0x07,0x9c,0x07,0x9d,0x07,0x9e,0x07,0x9f,0x07,0xa0,0x07,0xa1,0x07,0xa2,0x07,0xa3,0x07,0xa4,0x07,0xa5,0x07,0xa6,0x07,0xa7,0x07,0xa8,0x07,0xa9,0x07,0xaa,0x07,0xab,0x07,0xac,0x07,0xad,0x07,0xae,0x07,0xaf,0x07,0xb0,0x07,0xb1,0x07,0xb2,0x07,0xb3,0x07,0xb4,0x07,0xb5,0x07,0xb6,0x07,0xb7,0x07,0xb8,0x07,0xb9, +0x07,0xba,0x07,0xbb,0x07,0xbc,0x07,0xbd,0x07,0xbe,0x07,0xbf,0x07,0xc0,0x07,0xc1,0x07,0xc2,0x07,0xc3,0x07,0xc4,0x07,0xc5,0x07,0xc6,0x07,0xc7,0x07,0xc8,0x07,0xc9,0x07,0xca,0x07,0xcb,0x07,0xcc,0x07,0xd1,0x07,0xf7,0x07,0xf8,0x07,0xf9,0x07,0xfa,0x07,0xfb,0x07,0xfc,0x07,0xfd,0x07,0xfe,0x07,0xff,0x08,0x00,0x08,0x01,0x08,0x02, +0x08,0x03,0x08,0x04,0x08,0x05,0x08,0x07,0x08,0x08,0x08,0x09,0x08,0x0a,0x08,0x0b,0x08,0x0c,0x08,0x0d,0x08,0x0e,0x08,0x0f,0x08,0x10,0x08,0x11,0x08,0x12,0x08,0x13,0x08,0x14,0x08,0x15,0x08,0x16,0x08,0x17,0x08,0x18,0x08,0x19,0x08,0x1a,0x08,0x1b,0x08,0x1c,0x08,0x1d,0x08,0x1e,0x08,0x1f,0x08,0x20,0x08,0x21,0x08,0x22,0x08,0x23, +0x08,0x24,0x08,0x25,0x08,0x26,0x08,0x27,0x08,0x28,0x08,0x29,0x08,0x2a,0x08,0x2b,0x08,0x2c,0x08,0x2d,0x08,0x2e,0x08,0x2f,0x08,0x30,0x08,0x31,0x08,0x32,0x08,0x33,0x08,0x34,0x08,0x35,0x08,0x36,0x08,0x37,0x08,0x38,0x08,0x39,0x08,0x3a,0x08,0x3b,0x08,0x3c,0x08,0x3d,0x08,0x3e,0x08,0x3f,0x08,0x40,0x08,0x41,0x08,0x42,0x08,0x43, +0x08,0x44,0x08,0x45,0x08,0x46,0x08,0x47,0x08,0x48,0x08,0x49,0x08,0x4a,0x08,0x4b,0x08,0x4c,0x08,0x4d,0x08,0x4e,0x08,0x4f,0x0a,0xdb,0x0a,0xdc,0x0a,0xdd,0x0a,0xde,0x0a,0xdf,0x0a,0xe0,0x0a,0xe1,0x0a,0xe2,0x0a,0xe3,0x02,0xe3,0x02,0xe4,0x02,0xe5,0x02,0xe6,0x02,0xe7,0x02,0xe8,0x02,0xe9,0x02,0xea,0x02,0xeb,0x02,0xec,0x02,0xed, +0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x02,0xf8,0x02,0xf9,0x02,0xfa,0x02,0xfb,0x02,0xfc,0x02,0xfd,0x02,0xfe,0x02,0xff,0x03,0x00,0x03,0x01,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,0x03,0x0a,0x03,0x0b,0x03,0x0c,0x03,0x0d, +0x03,0x0e,0x03,0x0f,0x03,0x10,0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x1a,0x03,0x1b,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x03,0x20,0x03,0x21,0x03,0x22,0x03,0x23,0x03,0x24,0x03,0x25,0x03,0x26,0x03,0x27,0x03,0x28,0x03,0x29,0x03,0x2a,0x03,0x2b,0x03,0x2c,0x03,0x2d, +0x03,0x2e,0x03,0x2f,0x03,0x30,0x03,0x31,0x03,0x32,0x03,0x33,0x03,0x34,0x03,0x35,0x03,0x36,0x03,0x37,0x03,0x38,0x03,0x39,0x03,0x3a,0x03,0x3b,0x03,0x3c,0x03,0x3d,0x03,0x3e,0x03,0x3f,0x03,0x40,0x03,0x41,0x03,0x42,0x03,0x43,0x03,0x44,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x49,0x03,0x4a,0x03,0x4b,0x03,0x4c,0x03,0x4d, +0x03,0x4e,0x03,0x4f,0x03,0x50,0x03,0x51,0x03,0x52,0x03,0x53,0x03,0x54,0x03,0x55,0x03,0x56,0x03,0x57,0x03,0x58,0x03,0x59,0x03,0x5a,0x03,0x5b,0x03,0x5c,0x03,0x5d,0x03,0x5e,0x03,0x5f,0x03,0x60,0x03,0x61,0x03,0x62,0x01,0x8c,0x01,0x8d,0x01,0x8e,0x01,0x8f,0x01,0x90,0x01,0x91,0x03,0x63,0x03,0x64,0x03,0x65,0x03,0x66,0x03,0x67, +0x03,0x68,0x03,0x69,0x03,0x6a,0x03,0x6b,0x03,0x6c,0x03,0x6d,0x03,0x6e,0x03,0x6f,0x03,0x70,0x03,0x71,0x03,0x72,0x03,0x73,0x03,0x74,0x03,0x75,0x03,0x76,0x03,0x77,0x03,0x78,0x13,0x5b,0x13,0x5c,0x0b,0x21,0x13,0x5d,0x02,0x57,0x02,0x58,0x02,0x59,0x02,0x5a,0x02,0x5b,0x02,0x5c,0x02,0x5d,0x02,0x5e,0x02,0x5f,0x02,0x60,0x02,0x61, +0x02,0x62,0x02,0x63,0x02,0x64,0x02,0x65,0x02,0x66,0x02,0x67,0x02,0x68,0x02,0x69,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6d,0x02,0x6e,0x02,0x6f,0x02,0x70,0x02,0x71,0x02,0x72,0x02,0x73,0x02,0x74,0x02,0x75,0x02,0x76,0x02,0x77,0x02,0x78,0x02,0x79,0x02,0x7a,0x02,0x7b,0x02,0x7c,0x02,0x7d,0x02,0x7e,0x02,0x7f,0x02,0x80,0x02,0x81, +0x02,0x82,0x02,0x83,0x02,0x84,0x02,0x85,0x02,0x86,0x02,0x87,0x02,0x88,0x02,0x89,0x02,0x8a,0x02,0x8b,0x02,0x8c,0x02,0x8d,0x02,0x8e,0x02,0x8f,0x02,0x90,0x02,0x91,0x02,0x92,0x02,0x93,0x02,0x94,0x02,0x95,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x99,0x02,0x9a,0x02,0x9b,0x02,0x9c,0x02,0x9d,0x02,0x9e,0x02,0x9f,0x02,0xa0,0x02,0xa1, +0x02,0xa2,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x02,0xa6,0x02,0xa7,0x02,0xa8,0x01,0x92,0x01,0x93,0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xac,0x02,0xad,0x02,0xae,0x13,0x5e,0x13,0x5f,0x13,0x60,0x13,0x61,0x13,0x62,0x13,0x63,0x03,0x79,0x03,0x7a,0x03,0x7b,0x03,0x7c,0x03,0x7d,0x03,0x7e,0x03,0x7f,0x03,0x80,0x03,0x81,0x03,0x82,0x03,0x83, +0x03,0x84,0x03,0x85,0x03,0x86,0x03,0x87,0x03,0x88,0x03,0x89,0x03,0x8a,0x03,0x8b,0x03,0x8c,0x03,0x8d,0x03,0x8e,0x0a,0xfe,0x0a,0xff,0x0b,0x00,0x0b,0x01,0x0b,0x02,0x0b,0x03,0x0b,0x04,0x0b,0x05,0x0b,0x06,0x11,0x86,0x0b,0x07,0x0b,0x08,0x08,0xc3,0x08,0xc4,0x08,0xc5,0x08,0xc6,0x00,0x10,0x11,0x99,0x08,0xbc,0x00,0xb2,0x00,0xb3, +0x02,0x35,0x11,0x87,0x01,0x35,0x00,0xb6,0x00,0xb7,0x00,0xc4,0x01,0x94,0x00,0xb4,0x00,0xb5,0x00,0xc5,0x08,0xbd,0x00,0x82,0x00,0xc2,0x00,0x87,0x0b,0x23,0x0b,0x24,0x0b,0x25,0x0b,0x26,0x0b,0x27,0x0b,0x28,0x0b,0x29,0x0b,0x09,0x00,0xc6,0x01,0x3c,0x01,0x3d,0x08,0xbe,0x01,0x36,0x11,0x85,0x01,0x95,0x08,0x50,0x0b,0x0a,0x08,0x99, +0x08,0x95,0x08,0x9a,0x08,0x9b,0x08,0x9c,0x08,0x9d,0x08,0x9e,0x08,0x9f,0x08,0xa0,0x08,0xa1,0x08,0xa2,0x08,0xa3,0x08,0xa4,0x01,0x37,0x08,0xa5,0x08,0xa6,0x08,0xa7,0x08,0xa8,0x08,0xa9,0x08,0xaa,0x08,0xab,0x08,0xac,0x08,0xad,0x08,0xae,0x08,0xaf,0x08,0xb0,0x08,0xb1,0x08,0xb2,0x08,0xb3,0x08,0x51,0x08,0x52,0x08,0x53,0x08,0x54, +0x08,0x55,0x14,0x2e,0x14,0x2f,0x14,0x30,0x14,0x31,0x14,0x32,0x14,0x33,0x14,0x34,0x14,0x35,0x07,0xd2,0x07,0xd3,0x07,0xd4,0x00,0xf6,0x01,0x96,0x07,0xd5,0x07,0xd6,0x01,0x38,0x07,0xd7,0x07,0xd8,0x07,0xd9,0x07,0xda,0x00,0xbd,0x07,0xdb,0x07,0xdc,0x07,0xdd,0x07,0xde,0x07,0xdf,0x08,0x56,0x08,0x57,0x08,0x58,0x08,0x59,0x11,0x80, +0x11,0x81,0x0c,0xb7,0x0c,0xb6,0x11,0xa3,0x14,0x2a,0x13,0x91,0x13,0x90,0x14,0x2c,0x14,0x2d,0x02,0x36,0x07,0xe0,0x12,0xe2,0x12,0xe3,0x12,0xe4,0x0b,0x2a,0x0b,0x2b,0x12,0xe5,0x12,0xe6,0x12,0xe7,0x12,0xe8,0x12,0xe9,0x12,0xea,0x01,0x98,0x01,0x99,0x01,0x9a,0x01,0x9b,0x12,0xeb,0x12,0xf0,0x12,0xf1,0x12,0xf2,0x12,0xf3,0x12,0xf4, +0x12,0xf5,0x12,0xf6,0x12,0xf7,0x12,0xf8,0x12,0xf9,0x0a,0xe6,0x12,0xfa,0x12,0xfb,0x12,0xfc,0x12,0xfd,0x12,0xfe,0x00,0x9a,0x00,0xee,0x01,0x02,0x00,0xa6,0x00,0x93,0x0b,0x32,0x00,0x90,0x08,0xbf,0x0b,0x36,0x01,0x40,0x01,0x41,0x01,0x42,0x0b,0x37,0x00,0xb9,0x0b,0x3c,0x0a,0x43,0x0b,0x3f,0x11,0x88,0x08,0x83,0x08,0x84,0x08,0x85, +0x08,0x86,0x08,0x87,0x08,0x88,0x08,0x89,0x08,0x8a,0x08,0x8b,0x13,0x8f,0x0a,0xe7,0x0a,0xe8,0x0a,0xe9,0x0a,0xea,0x0a,0xeb,0x0a,0xec,0x0a,0xed,0x0a,0xee,0x0a,0xef,0x0a,0xf0,0x0a,0xf1,0x0a,0xf2,0x0a,0xf3,0x0b,0x43,0x13,0x93,0x13,0x94,0x13,0x64,0x0b,0x44,0x0b,0x45,0x0b,0x46,0x0a,0xf4,0x0a,0xf5,0x0a,0xf6,0x0a,0xf7,0x13,0x65, +0x13,0x66,0x13,0x67,0x13,0x68,0x13,0x69,0x13,0x6a,0x13,0x6b,0x13,0x6c,0x11,0x30,0x11,0x31,0x11,0x32,0x11,0x33,0x11,0x34,0x11,0x35,0x11,0x36,0x11,0x37,0x11,0x38,0x11,0x39,0x11,0x3a,0x11,0x3b,0x11,0x3c,0x11,0x3d,0x11,0x3e,0x11,0x3f,0x11,0x40,0x11,0x41,0x11,0x42,0x11,0x43,0x11,0x44,0x11,0x45,0x11,0x46,0x11,0x47,0x11,0x48, +0x11,0x49,0x11,0x4a,0x11,0x4b,0x11,0x4c,0x11,0x4d,0x11,0x4e,0x11,0x4f,0x11,0x50,0x11,0x51,0x11,0x52,0x11,0x53,0x11,0x54,0x11,0x55,0x11,0x56,0x11,0x57,0x11,0x58,0x11,0x59,0x11,0x5a,0x11,0x5b,0x11,0x5c,0x11,0x5d,0x11,0x5e,0x11,0x5f,0x11,0x60,0x11,0x61,0x11,0x62,0x11,0x63,0x13,0x77,0x13,0x78,0x13,0x79,0x13,0x7a,0x13,0x7b, +0x13,0x7c,0x13,0x7d,0x13,0x7e,0x11,0x64,0x11,0x65,0x11,0x66,0x11,0x67,0x11,0x68,0x11,0x69,0x11,0x6a,0x11,0x6b,0x11,0x6c,0x11,0x6d,0x11,0x6e,0x11,0x6f,0x11,0x70,0x11,0x71,0x11,0x72,0x11,0x73,0x11,0x74,0x11,0x75,0x11,0x76,0x11,0x77,0x11,0x78,0x11,0x79,0x11,0x7a,0x11,0x7b,0x11,0x7c,0x11,0x7d,0x11,0x7e,0x11,0x7f,0x14,0x24, +0x14,0x25,0x14,0x26,0x14,0x27,0x14,0x28,0x14,0x29,0x14,0x36,0x13,0x7f,0x14,0x37,0x14,0x38,0x14,0x39,0x14,0x3a,0x14,0x3b,0x14,0x3c,0x14,0x3d,0x14,0x3e,0x13,0x80,0x13,0x81,0x13,0x82,0x13,0x83,0x13,0x84,0x13,0x85,0x13,0x86,0x13,0x87,0x13,0x88,0x13,0x89,0x13,0x8a,0x13,0x8b,0x13,0x8c,0x13,0x8d,0x13,0x8e,0x0a,0xf8,0x0a,0xf9, +0x0a,0xfa,0x0a,0xfb,0x0b,0x47,0x0b,0x48,0x0b,0x49,0x0b,0x4a,0x0b,0x4b,0x0a,0xfc,0x0a,0xfd,0x12,0x63,0x12,0x64,0x12,0x65,0x12,0x66,0x12,0x67,0x12,0x68,0x12,0x69,0x12,0x6a,0x12,0x6b,0x12,0x6c,0x12,0x6d,0x12,0x6e,0x12,0x6f,0x12,0x70,0x12,0x71,0x12,0x72,0x12,0x73,0x12,0x74,0x12,0x75,0x12,0x76,0x12,0x77,0x12,0x78,0x12,0x79, +0x12,0x7a,0x12,0x7b,0x12,0x7c,0x12,0x7d,0x12,0x7e,0x12,0x7f,0x12,0x80,0x12,0x81,0x12,0x82,0x12,0x83,0x12,0x84,0x12,0x85,0x12,0x86,0x12,0x87,0x12,0x88,0x12,0x89,0x12,0x8a,0x12,0x8b,0x12,0x8c,0x12,0x8d,0x12,0x8e,0x12,0x8f,0x12,0x90,0x12,0x91,0x12,0x92,0x12,0x93,0x12,0x94,0x12,0x95,0x12,0x96,0x12,0x97,0x12,0x98,0x12,0x99, +0x12,0x9a,0x12,0x9b,0x12,0x9c,0x12,0x9d,0x12,0x9e,0x12,0x9f,0x12,0xa0,0x12,0xa1,0x12,0xa2,0x12,0xa3,0x12,0xa4,0x12,0xa5,0x12,0xa6,0x12,0xa7,0x12,0xa8,0x12,0xa9,0x12,0xaa,0x12,0xab,0x12,0xac,0x12,0xad,0x12,0xae,0x12,0xaf,0x12,0xb0,0x12,0xb1,0x12,0xb2,0x12,0xb3,0x12,0xb4,0x12,0xb5,0x12,0xb6,0x12,0xb7,0x12,0xb8,0x12,0xb9, +0x12,0xba,0x12,0xbb,0x12,0xbc,0x12,0xbd,0x12,0xbe,0x12,0xbf,0x12,0xc0,0x12,0xc1,0x12,0xc2,0x12,0xc3,0x12,0xc4,0x12,0xc5,0x12,0xc6,0x12,0xc7,0x12,0xc8,0x0b,0x4c,0x0b,0x4d,0x0b,0x4e,0x0b,0x4f,0x0b,0x50,0x12,0xc9,0x12,0xca,0x14,0x3f,0x12,0xcb,0x12,0xcc,0x12,0xcd,0x12,0xce,0x13,0x95,0x13,0x96,0x13,0x97,0x13,0x98,0x13,0x99, +0x13,0x9a,0x13,0x9b,0x13,0x9c,0x13,0x9d,0x13,0x9e,0x13,0x9f,0x13,0xa0,0x12,0xcf,0x12,0xd0,0x12,0xd1,0x12,0xd2,0x12,0xd3,0x12,0xd4,0x12,0xd5,0x12,0xd6,0x12,0xd7,0x12,0xd8,0x12,0xd9,0x13,0xa1,0x13,0xa2,0x13,0xa3,0x14,0x40,0x13,0xa4,0x13,0xa5,0x14,0x41,0x14,0x42,0x14,0x43,0x14,0x44,0x14,0x45,0x14,0x46,0x13,0xa6,0x12,0xda, +0x12,0xdb,0x12,0xdc,0x12,0xdd,0x12,0xde,0x12,0xdf,0x12,0xe0,0x12,0xe1,0x13,0xa7,0x13,0xa8,0x13,0xa9,0x13,0xaa,0x13,0xab,0x13,0xac,0x13,0xad,0x13,0xae,0x13,0xaf,0x13,0xb0,0x13,0xb1,0x13,0xb2,0x13,0xb3,0x13,0xb4,0x13,0xb5,0x13,0xb6,0x13,0xb7,0x13,0xb8,0x13,0xb9,0x13,0xba,0x13,0xbb,0x13,0xbc,0x13,0xbd,0x13,0xbe,0x13,0xbf, +0x13,0xc0,0x13,0xc1,0x13,0xc2,0x13,0xc3,0x13,0xc4,0x13,0xc5,0x13,0xc6,0x13,0xc7,0x13,0xc8,0x13,0xc9,0x13,0xca,0x13,0xcb,0x13,0xcc,0x13,0xcd,0x13,0xce,0x13,0xcf,0x13,0xd0,0x13,0xd1,0x13,0xd2,0x13,0xd3,0x13,0xd4,0x13,0xd5,0x13,0xd6,0x14,0x47,0x14,0x48,0x14,0x49,0x14,0x4a,0x13,0xd7,0x13,0xd8,0x0d,0xbb,0x00,0xc0,0x00,0xc1, +0x0d,0xbc,0x0d,0xbd,0x14,0x4b,0x14,0x4c,0x0b,0xe0,0x0b,0xe1,0x0b,0x8c,0x0b,0x8d,0x0b,0x8e,0x0b,0x8f,0x0b,0x90,0x0b,0x91,0x0b,0x92,0x0b,0x93,0x0b,0x94,0x0b,0x95,0x0b,0x96,0x0b,0x97,0x0b,0x98,0x0b,0x99,0x0b,0x9a,0x0b,0x9b,0x0b,0x9c,0x0b,0x9d,0x0b,0x9e,0x0b,0x9f,0x0b,0xa0,0x0b,0xa1,0x0b,0xa2,0x0b,0xa3,0x0b,0xae,0x0b,0xaf, +0x0b,0xb0,0x0b,0xb1,0x0b,0xb2,0x0b,0xb3,0x0b,0xb4,0x0b,0xb5,0x0b,0xb6,0x0b,0xb7,0x09,0x80,0x09,0x81,0x09,0x8e,0x0e,0x7c,0x09,0x8f,0x0e,0x7d,0x09,0x40,0x0e,0x82,0x09,0x41,0x0e,0x83,0x09,0x96,0x0e,0x86,0x09,0x97,0x0e,0x87,0x09,0x8c,0x0e,0x7a,0x09,0x8d,0x0e,0x7b,0x09,0x94,0x0e,0x84,0x09,0x95,0x0e,0x85,0x09,0x5b,0x0e,0x78, +0x09,0x5c,0x0e,0x79,0x09,0x6c,0x0e,0xa8,0x09,0x6d,0x09,0x6e,0x09,0xd2,0x0e,0xaa,0x09,0xd3,0x09,0xd4,0x09,0xa1,0x09,0xa2,0x09,0xa3,0x0e,0x8b,0x09,0x9e,0x09,0x9f,0x09,0xa0,0x0e,0x8a,0x09,0x42,0x09,0x43,0x09,0x44,0x0e,0x8d,0x09,0xa7,0x09,0xa8,0x09,0xa9,0x0e,0x8e,0x09,0xae,0x0e,0x94,0x09,0xad,0x0e,0x93,0x09,0xaf,0x0e,0x95, +0x09,0x5d,0x0e,0x8f,0x09,0x45,0x0b,0x0e,0x09,0x5e,0x0b,0x0f,0x09,0x46,0x0e,0xb1,0x09,0x47,0x0e,0xb2,0x09,0x48,0x0e,0xbd,0x09,0x49,0x0e,0xbe,0x09,0xe7,0x0e,0xc5,0x09,0xe8,0x0e,0xc6,0x09,0xe3,0x0e,0xc1,0x09,0xe4,0x0e,0xc2,0x09,0x5f,0x0e,0xcf,0x09,0xf5,0x0e,0xd0,0x0e,0xd1,0x0e,0xd2,0x09,0x4e,0x09,0x4d,0x09,0x60,0x09,0x72, +0x09,0x61,0x09,0x62,0x08,0xf1,0x08,0xf2,0x0e,0xd7,0x0e,0xd8,0x09,0x65,0x09,0x66,0x09,0x67,0x09,0x68,0x13,0xd9,0x13,0xda,0x13,0xdb,0x13,0xdc,0x13,0xdd,0x13,0xde,0x13,0xdf,0x13,0xe0,0x13,0xe1,0x13,0xe2,0x13,0xe3,0x13,0xe4,0x13,0xe5,0x13,0xe6,0x13,0xe7,0x13,0xe8,0x09,0xdd,0x0e,0xb9,0x09,0xde,0x0e,0xba,0x0a,0x00,0x0e,0xdf, +0x09,0xff,0x0e,0xde,0x0a,0x01,0x0e,0xe0,0x09,0x89,0x0a,0x04,0x0e,0xe3,0x09,0xfe,0x0e,0xdd,0x0a,0x02,0x0e,0xe1,0x0a,0x0b,0x0a,0x0c,0x0e,0xe7,0x0e,0xe8,0x0e,0x5f,0x0e,0x60,0x10,0xfe,0x10,0xff,0x11,0x00,0x11,0x01,0x11,0x02,0x11,0x03,0x11,0x04,0x11,0x05,0x11,0x06,0x11,0x07,0x11,0x08,0x11,0x09,0x11,0x0a,0x11,0x0b,0x11,0x0c, +0x11,0x0d,0x11,0x0e,0x11,0x0f,0x09,0x4a,0x09,0x4b,0x09,0x4c,0x0e,0xe4,0x0a,0x68,0x0a,0x69,0x0a,0x65,0x0a,0x66,0x0a,0x67,0x13,0xe9,0x13,0xed,0x13,0xee,0x00,0x0b,0x00,0x0c,0x13,0xf0,0x13,0xf1,0x0a,0x64,0x13,0xf2,0x13,0xf8,0x13,0xf9,0x13,0xfa,0x13,0xfb,0x13,0xfc,0x13,0xfd,0x13,0xfe,0x13,0xff,0x14,0x00,0x14,0x01,0x09,0x07, +0x09,0x08,0x08,0xc9,0x09,0x09,0x08,0xc8,0x09,0x0a,0x0e,0x24,0x09,0x0b,0x08,0xca,0x09,0x0c,0x09,0x02,0x08,0xf9,0x0e,0x25,0x09,0x0d,0x08,0xc7,0x09,0x0e,0x0e,0x26,0x08,0xcb,0x0e,0x27,0x09,0x0f,0x08,0xf6,0x09,0x10,0x0e,0x28,0x08,0xcc,0x0e,0x29,0x09,0x11,0x0e,0x2a,0x08,0xcd,0x0e,0x2b,0x09,0x12,0x08,0xcf,0x08,0xce,0x0e,0x2c, +0x09,0x13,0x08,0xd1,0x08,0xd0,0x0e,0x2d,0x09,0x14,0x08,0xd3,0x08,0xd2,0x0e,0x2e,0x09,0x15,0x0e,0x2f,0x09,0x16,0x0e,0x30,0x09,0x17,0x0b,0x0c,0x09,0x18,0x0b,0x0d,0x09,0x19,0x0e,0x31,0x08,0xd4,0x0e,0x32,0x09,0x1a,0x0e,0x33,0x08,0xd5,0x0e,0x34,0x09,0x1b,0x0e,0x35,0x08,0xd6,0x0e,0x36,0x09,0x1c,0x0e,0x37,0x08,0xe1,0x0e,0x38, +0x09,0x1d,0x0e,0x39,0x0e,0x3a,0x0e,0x3b,0x09,0x1e,0x0e,0x3c,0x0e,0x3d,0x0e,0x3e,0x09,0x1f,0x08,0xe4,0x08,0xe2,0x08,0xe3,0x09,0x20,0x08,0xe7,0x08,0xe5,0x08,0xe6,0x09,0x22,0x0e,0x53,0x08,0xe8,0x08,0xe9,0x09,0x23,0x0e,0x54,0x08,0xeb,0x08,0xec,0x09,0x24,0x0e,0x55,0x08,0xed,0x0e,0x56,0x09,0x25,0x09,0x59,0x08,0xee,0x09,0x3f, +0x09,0x26,0x0e,0x57,0x08,0xef,0x0e,0x58,0x09,0x27,0x0e,0x59,0x08,0xf0,0x0e,0x5a,0x09,0x28,0x08,0xf3,0x0e,0x5b,0x0e,0x5d,0x09,0x29,0x0e,0x5e,0x09,0x2a,0x08,0xf7,0x09,0x2b,0x08,0xf5,0x08,0xf4,0x0e,0x61,0x09,0x01,0x09,0x04,0x08,0xff,0x09,0x00,0x09,0x34,0x09,0x35,0x08,0xfa,0x08,0xfb,0x0b,0xb8,0x0b,0x1b,0x40,0x55,0x85,0x64, +0x5b,0x5a,0x59,0x54,0x52,0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13, +0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x45,0x6a,0xb0,0x19,0x43,0x60,0xb0,0x0c,0x23,0x44,0x23,0x10,0x20,0xb0,0x0c,0x4e,0xf0,0x4d,0x2f,0xb0,0x00,0x12,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58, +0xb0,0x05,0x2b,0xb0,0x00,0x13,0x4b,0xb0,0x14,0x50,0x58,0xb1,0x00,0x40,0x38,0x59,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x4e,0xb0,0x03,0x25,0x10,0xf2,0x21,0xb0,0x00,0x12,0x4d,0x1b,0x20,0x45,0xb0,0x04,0x25,0xb0,0x04,0x25,0x23,0x4a,0x61,0x64,0xb0,0x28,0x52,0x58,0x21, +0x23,0x10,0xd6,0x1b,0xb0,0x03,0x25,0x10,0xf2,0x21,0xb0,0x00,0x12,0x59,0x59,0x2d,0x2c,0xb0,0x1a,0x43,0x58,0x21,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x49,0xb0,0x03,0x25,0xb0,0x03,0x25,0x4a,0x61,0x20,0x64,0xb0,0x10,0x50,0x58,0x21,0x21,0x21,0x1b,0xb0,0x03,0x25,0xb0,0x03,0x25,0x49,0xb0,0x00,0x50,0x58,0xb0,0x00,0x50,0x58, +0xb8,0xff,0xe2,0x38,0x21,0x1b,0xb0,0x00,0x38,0x21,0x59,0x1b,0xb0,0x00,0x52,0x58,0xb0,0x1e,0x38,0x21,0x1b,0xb0,0x00,0x38,0x21,0x59,0x59,0x59,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x2b,0xb0,0x00,0x13,0x4b,0xb0,0x14,0x50,0x58,0xb9,0x00,0x00,0xff,0xc0,0x38,0x59,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33, +0x2f,0x59,0x2d,0x2c,0x4e,0x01,0x8a,0x10,0xb1,0x0c,0x19,0x43,0x44,0xb0,0x00,0x14,0xb1,0x00,0x0c,0xe2,0xb0,0x00,0x15,0xb9,0x00,0x00,0xff,0xf0,0x38,0x00,0xb0,0x00,0x3c,0xb0,0x28,0x2b,0xb0,0x02,0x25,0x10,0xb0,0x00,0x3c,0x2d,0x2c,0x01,0x18,0xb0,0x00,0x2f,0xb0,0x01,0x14,0xf2,0xb0,0x01,0x13,0xb0,0x01,0x15,0x4d,0xb0,0x00,0x12, +0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x2b,0xb0,0x00,0x13,0xb9,0x00,0x00,0xff,0xe0,0x38,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x45,0x64,0x6a,0x23,0x45,0x64,0x69,0xb0,0x19,0x43,0x64,0x60,0x60,0xb0,0x0c,0x23,0x44,0x23,0x10,0x20,0xb0,0x0c,0xf0,0x2f,0xb0, +0x00,0x12,0x1b,0x21,0x21,0x20,0x8a,0x20,0x8a,0x52,0x58,0x11,0x33,0x1b,0x21,0x21,0x59,0x59,0x2d,0x2c,0x01,0x4b,0xb0,0xc8,0x51,0x58,0xb1,0x0b,0x0a,0x43,0x23,0x43,0x65,0x0a,0x59,0x2d,0x2c,0x00,0x4b,0xb0,0xc8,0x51,0x58,0x00,0xb1,0x0a,0x0b,0x43,0x23,0x43,0x0b,0x59,0x2d,0x2c,0x00,0xb0,0x0c,0x23,0x70,0xb1,0x01,0x0c,0x3e,0x01, +0xb0,0x0c,0x23,0x70,0xb1,0x02,0x0c,0x45,0x3a,0xb1,0x02,0x00,0x08,0x0d,0x2d,0x2c,0xb0,0x12,0x2b,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x6a,0xb0,0x40,0x8b,0x60,0xb0,0x02,0x25,0x23,0x44,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x13,0x2b,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x6a,0xb8,0xff,0xc0,0x8c,0x60,0xb0,0x02,0x25,0x23,0x44, +0x21,0x21,0x21,0x2d,0x2c,0xb0,0x00,0xb0,0x12,0x2b,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x00,0xb0,0x13,0x2b,0x21,0x21,0x21,0x2d,0x2c,0x01,0x4b,0xb0,0xc8,0x51,0x58,0xb0,0x06,0x43,0xb0,0x07,0x43,0x65,0x0a,0x59,0x2d,0x2c,0x20,0x69,0xb0,0x40,0x61,0xb0,0x00,0x8b,0x20,0xb1,0x2c,0xc0,0x8a,0x8c,0xb8,0x10,0x00,0x62,0x60,0x2b,0x0c,0x64, +0x23,0x64,0x61,0x5c,0x58,0xb0,0x03,0x61,0x59,0x2d,0x2c,0xb1,0x00,0x03,0x25,0x45,0x68,0x54,0xb0,0x1c,0x4b,0x50,0x5a,0x58,0xb0,0x03,0x25,0x45,0xb0,0x03,0x25,0x45,0x60,0x68,0x20,0xb0,0x04,0x25,0x23,0x44,0xb0,0x04,0x25,0x23,0x44,0x1b,0xb0,0x03,0x25,0x20,0x45,0x68,0x20,0x8a,0x23,0x44,0xb0,0x03,0x25,0x45,0x68,0x60,0xb0,0x03, +0x25,0x23,0x44,0x59,0x2d,0x2c,0xb0,0x03,0x25,0x20,0x45,0x68,0x20,0x8a,0x23,0x44,0xb0,0x03,0x25,0x45,0x64,0x68,0x65,0x60,0xb0,0x04,0x25,0xb0,0x01,0x60,0x23,0x44,0x2d,0x2c,0xb0,0x09,0x43,0x58,0x87,0x21,0xc0,0x1b,0xb0,0x12,0x43,0x58,0x87,0x45,0xb0,0x11,0x2b,0xb0,0x0d,0x23,0x44,0xb0,0x0d,0x7a,0xe4,0x1b,0x03,0x8a,0x45,0x18, +0x69,0x20,0xb0,0x0d,0x23,0x44,0x8a,0x8a,0x87,0x20,0xb0,0xa0,0x51,0x58,0xb0,0x11,0x2b,0xb0,0x0d,0x23,0x44,0xb0,0x0d,0x7a,0xe4,0x1b,0x21,0xb0,0x0d,0x7a,0xe4,0x59,0x59,0x59,0x18,0x2d,0x2c,0x20,0x8a,0x45,0x23,0x45,0x68,0x60,0x44,0x2d,0x2c,0x45,0x6a,0x42,0x2d,0x2c,0x01,0x18,0x2f,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0, +0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0x23,0x45,0x64,0x69,0xb0,0x40,0x8b,0x61,0x20,0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x19,0x43,0x60,0xb0,0x0c,0x23,0x44,0x21,0x8a,0x10,0xb0,0x0c,0xf6,0x21,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x01,0xb0,0x18,0x43,0x58,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45, +0x64,0x60,0x6a,0xb0,0x03,0x25,0x45,0x6a,0x61,0x20,0xb0,0x04,0x25,0x45,0x6a,0x20,0x8a,0x8b,0x65,0xb0,0x04,0x25,0x23,0x44,0x8c,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x1b,0x20,0x45,0x6a,0x44,0x20,0x45,0x6a,0x44,0x59,0x2d,0x2c,0x01,0x20,0x45,0xb0,0x00,0x55,0xb0,0x18,0x43,0x5a,0x58,0x45,0x68,0x23,0x45,0x69,0xb0,0x40,0x8b,0x61, +0x20,0xb0,0x80,0x62,0x6a,0x20,0x8a,0x23,0x61,0x20,0xb0,0x03,0x25,0x8b,0x65,0xb0,0x04,0x25,0x23,0x44,0x8c,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x1b,0x21,0x21,0xb0,0x19,0x2b,0x59,0x2d,0x2c,0x01,0x8a,0x8a,0x45,0x64,0x23,0x45,0x64,0x61,0x64,0x42,0x2d,0x2c,0xb0,0x04,0x25,0xb0,0x04,0x25,0xb0,0x19,0x2b,0xb0,0x18,0x43,0x58,0xb0, +0x04,0x25,0xb0,0x04,0x25,0xb0,0x03,0x25,0xb0,0x1b,0x2b,0x01,0xb0,0x02,0x25,0x43,0xb0,0x40,0x54,0xb0,0x02,0x25,0x43,0xb0,0x00,0x54,0x5a,0x58,0xb0,0x03,0x25,0x20,0x45,0xb0,0x40,0x61,0x44,0x59,0xb0,0x02,0x25,0x43,0xb0,0x00,0x54,0xb0,0x02,0x25,0x43,0xb0,0x40,0x54,0x5a,0x58,0xb0,0x04,0x25,0x20,0x45,0xb0,0x40,0x60,0x44,0x59, +0x59,0x21,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x03,0x25,0x20,0xb0,0x07,0x25,0x87,0x05,0x2e,0x23,0x20,0x8a,0xb0,0x04,0x25,0xb0,0x07,0x25,0xb0,0x14,0x2b,0x10,0x21,0xc4,0x21,0x2d,0x2c,0xc0,0x2d,0x2c,0x4b,0x52,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x58,0x3d,0xed,0x18,0x1b,0xed,0x59,0x2d,0x2c,0x4b,0x50,0x58, +0x45,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x01,0x18,0x4b,0x52,0x58,0x8a,0x2f,0xed,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0xb0,0x03,0x25,0x45,0x68,0xb0,0x03,0x25,0x45,0x68,0xb0,0x03,0x25,0x60,0x54,0x58,0x21,0x21,0x21,0x1b,0xb0,0x02,0x25,0x45,0x68,0x60,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x59, +0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x58,0x3d,0xcd,0x18,0x1b,0xcd,0x59,0x2d,0x2c,0x46,0x23,0x46,0x60,0x8a,0x8a,0x46,0x23,0x20,0x46,0x8a,0x60,0x8a,0x61,0xb8,0xff,0x80,0x62,0x23,0x20,0x10,0x23,0x8a,0xb1,0x0c,0x0c,0x8a,0x70,0x45,0x60,0x20,0xb0,0x00,0x50,0x58,0xb0,0x01,0x61,0xb8,0xff,0xba,0x8b,0x1b,0xb0,0x46, +0x8c,0x59,0xb0,0x10,0x60,0x68,0x01,0x3a,0x2d,0x2c,0x20,0x45,0xb0,0x03,0x25,0x46,0x52,0x4b,0xb0,0x13,0x51,0x5b,0x58,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25,0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x1b,0x21,0x11,0x59,0x2d,0x2c,0x20,0x45,0xb0,0x03,0x25,0x46,0x50,0x58,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25, +0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x1b,0x21,0x11,0x59,0x2d,0x2c,0x00,0x4b,0xb0,0xc8,0x51,0x58,0x00,0xb0,0x07,0x43,0xb0,0x06,0x43,0x0b,0x59,0x2d,0x2c,0x8a,0x10,0xec,0x2d,0x2c,0xb0,0x0c,0x43,0x58,0x21,0x1b,0x20,0x46,0xb0,0x00,0x52,0x58,0xb8,0xff,0xf0,0x38,0x1b,0xb0,0x10,0x38,0x59,0x59,0x2d,0x2c,0x20,0xb0,0x00,0x55,0x58, +0xb8,0x10,0x00,0x63,0xb0,0x03,0x25,0x45,0x64,0xb0,0x03,0x25,0x45,0x64,0x61,0xb0,0x00,0x53,0x58,0xb0,0x02,0x1b,0xb0,0x40,0x61,0xb0,0x03,0x59,0x25,0x45,0x69,0x53,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x1b,0x21,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x61,0x64,0xb0,0x28,0x51,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x59,0x2d,0x2c, +0x21,0x21,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x40,0x00,0x62,0x2d,0x2c,0x21,0xb0,0x80,0x51,0x58,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x20,0x00,0x62,0x1b,0xb2,0x00,0x40,0x2f,0x2b,0x59,0xb0,0x02,0x60,0x2d,0x2c,0x21,0xb0,0xc0,0x51,0x58,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x15,0x55,0x62,0x1b,0xb2,0x00,0x80,0x2f,0x2b,0x59,0xb0,0x02,0x60,0x2d, +0x2c,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x40,0x00,0x62,0x60,0x23,0x21,0x2d,0x2c,0x18,0x4b,0x53,0x58,0xb0,0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0x23,0x45,0x64,0x69,0xb0,0x40,0x8b,0x61,0x20,0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x0c,0x23,0x44,0x21,0x8a,0x10,0xb0,0x0c,0xf6,0x21,0x1b,0x21,0x8a,0x11,0x23, +0x12,0x20,0x39,0x2f,0x59,0x2d,0x2c,0xb0,0x02,0x25,0xb0,0x02,0x25,0x49,0x64,0xb0,0xc0,0x54,0x58,0xb8,0xff,0xf8,0x38,0xb0,0x08,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x13,0x43,0x58,0x03,0x1b,0x02,0x59,0x2d,0x2c,0xb0,0x13,0x43,0x58,0x02,0x1b,0x03,0x59,0x2d,0x2c,0xb0,0x0a,0x2b,0x23,0x10,0x20,0x3c,0xb0,0x17,0x2b,0x2d,0x2c, +0xb0,0x02,0x25,0xb8,0xff,0xf0,0x38,0xb0,0x28,0x2b,0x8a,0x10,0x23,0x20,0xd0,0x23,0xb0,0x10,0x2b,0xb0,0x05,0x43,0x58,0xc0,0x1b,0x3c,0x59,0x20,0x10,0x11,0xb0,0x00,0x12,0x01,0x2d,0x2c,0xb0,0x48,0x2b,0x2d,0x2c,0x01,0xb0,0x02,0x25,0x10,0xd0,0x23,0xc9,0x01,0xb0,0x01,0x13,0xb0,0x00,0x14,0x10,0xb0,0x01,0x3c,0xb0,0x01,0x16,0x2d, +0x2c,0x01,0xb0,0x00,0x13,0xb0,0x01,0xb0,0x03,0x25,0x49,0xb0,0x03,0x17,0x38,0xb0,0x01,0x13,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x18,0x4b,0x53,0x58,0xb0,0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0xb0,0x03,0x25,0xb0,0x03,0x25,0x49,0x64,0x68,0xb0,0x40,0x8b,0x61,0x20, +0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x0c,0x23,0x44,0x21,0xb0,0x04,0x25,0x10,0x23,0xb0,0x0c,0xf6,0x1b,0xb0,0x04,0x25,0xb0,0x04,0x25,0x11,0x12,0x23,0x20,0x39,0x2f,0x59,0xcc,0x21,0x21,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x25,0x46,0x23,0x45,0x64,0x61,0x1b,0x21,0xb0,0x04,0x25,0xb0, +0x04,0x25,0x4a,0x59,0xb0,0x0e,0x23,0x44,0x23,0x10,0xb0,0x0e,0xec,0x23,0x10,0xb0,0x0e,0xec,0x2d,0x2c,0xb0,0x1b,0x43,0x58,0x20,0xb0,0x01,0x60,0x45,0xb0,0x00,0x51,0x58,0x20,0xb0,0x01,0x60,0x20,0x45,0x20,0x68,0xb0,0x00,0x55,0x58,0xb0,0x20,0x60,0x44,0x21,0x1b,0x21,0x21,0x21,0x59,0x1b,0x20,0xb0,0x01,0x60,0x20,0x45,0x20,0x68, +0xb0,0x00,0x55,0x58,0xb8,0xff,0xe0,0x60,0x44,0xb0,0x1c,0x4b,0x50,0x58,0x20,0x45,0xb0,0x20,0x60,0x44,0x1b,0x21,0x59,0x1b,0x21,0x21,0x21,0x59,0x59,0x1b,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25,0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x2d,0x2c,0x46,0x23,0x46,0x60,0x8a,0x8a,0x46,0x23,0x20,0x46,0x8a, +0x60,0x8a,0x61,0xb8,0xff,0x80,0x62,0x23,0x20,0x10,0x23,0x8a,0xb1,0x0c,0x0c,0x8a,0x70,0x45,0x60,0x20,0xb0,0x00,0x50,0x58,0xb0,0x01,0x61,0xb8,0xff,0x80,0x8b,0x1b,0xb0,0x81,0x8c,0x59,0x68,0x3a,0x2d,0x2c,0xb0,0x40,0x2a,0x21,0x2d,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0x4b,0x53,0x23,0x4b,0x51,0x5a, +0x58,0x38,0x1b,0x21,0x21,0x59,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x49,0xb0,0x0e,0x23,0x44,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21, +0x21,0x59,0x2d,0x2c,0x4b,0x54,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x00,0x21,0x4b,0x54,0x58,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x46,0x2b,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43, +0x54,0x58,0xb0,0x47,0x2b,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x48,0x2b,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x49,0x2b,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0x00,0xb0,0x02,0x25,0x20,0x11,0x49,0xb0,0x00,0x51,0x58,0xb8,0xff,0xc0,0x38,0x1b,0x21,0x59,0x2d,0x2c,0x00, +0xb0,0x02,0x25,0x20,0x11,0x49,0xb0,0x00,0x53,0x58,0xb0,0x40,0x38,0x1b,0x21,0x59,0x2d,0x2c,0x4b,0x52,0x58,0x7d,0x1b,0x7a,0x59,0x2d,0x2c,0xb1,0x02,0x01,0x42,0xb1,0x23,0x01,0x88,0x51,0xb1,0x40,0x01,0x88,0x53,0x5a,0x58,0xb1,0x02,0x00,0x42,0xb9,0x10,0x00,0x00,0x20,0x88,0x54,0x58,0xb2,0x02,0x01,0x02,0x43,0x60,0x42,0x59,0xb1, +0x24,0x01,0x88,0x51,0x58,0xb9,0x20,0x00,0x00,0x40,0x88,0x54,0x58,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb1,0x24,0x01,0x88,0x54,0x58,0xb2,0x02,0x20,0x02,0x43,0x60,0x42,0x00,0x4b,0x01,0x4b,0x52,0x58,0xb2,0x02,0x08,0x02,0x43,0x60,0x42,0x59,0x1b,0xb9,0x40,0x00,0x00,0x80,0x88,0x54,0x58,0xb2,0x02,0x04,0x02,0x43,0x60,0x42,0x59, +0xb9,0x40,0x00,0x00,0x80,0x63,0xb8,0x01,0x00,0x88,0x54,0x58,0xb2,0x02,0x08,0x02,0x43,0x60,0x42,0x59,0xb9,0x40,0x00,0x01,0x00,0x63,0xb8,0x02,0x00,0x88,0x54,0x58,0xb2,0x02,0x10,0x02,0x43,0x60,0x42,0x59,0xb1,0x26,0x01,0x88,0x51,0x58,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x54,0x58,0xb2,0x02,0x40,0x02,0x43,0x60, +0x42,0x59,0xb9,0x40,0x00,0x04,0x00,0x63,0xb8,0x08,0x00,0x88,0x54,0x58,0xb2,0x02,0x80,0x02,0x43,0x60,0x42,0x59,0x59,0x59,0x59,0x59,0x59,0xb1,0x00,0x02,0x43,0x54,0x58,0x40,0x0a,0x05,0x40,0x08,0x40,0x09,0x40,0x0c,0x02,0x0d,0x02,0x1b,0xb1,0x01,0x02,0x43,0x54,0x58,0xb2,0x05,0x40,0x08,0xba,0x01,0x00,0x00,0x09,0x01,0x00,0xb3, +0x0c,0x01,0x0d,0x01,0x1b,0xb1,0x80,0x02,0x43,0x52,0x58,0xb2,0x05,0x40,0x08,0xb8,0x01,0x80,0xb1,0x09,0x40,0x1b,0xb2,0x05,0x40,0x08,0xba,0x01,0x80,0x00,0x09,0x01,0x40,0x59,0xb9,0x40,0x00,0x00,0x80,0x88,0x55,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x55,0x5a,0x58,0xb3,0x0c,0x00,0x0d,0x01,0x1b,0xb3,0x0c,0x00,0x0d, +0x01,0x59,0x59,0x59,0x42,0x42,0x42,0x42,0x42,0x2d,0x2c,0xb0,0x80,0xb0,0x02,0x43,0x50,0xb0,0x01,0xb0,0x02,0x43,0x54,0x5b,0xb0,0x10,0x4b,0x51,0x5a,0x58,0x21,0x23,0x10,0xb0,0x20,0x1a,0xc9,0x1b,0x8a,0x10,0xed,0x59,0x2d,0x2c,0xb0,0x59,0x2b,0x2d,0x2c,0x8a,0x10,0xe5,0x2d,0x2c,0x20,0x45,0x69,0x44,0x2d,0x2c,0xb1,0x25,0x01,0x88, +0x50,0x58,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x54,0x5c,0xb0,0x14,0x4b,0x52,0x5b,0x1b,0xb0,0x01,0x59,0x2d,0xb9,0x00,0x20,0x01,0x3e,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x3c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x34,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x32,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01, +0x2f,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x2e,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x2c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x0c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x04,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x03,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x01,0x40,0xfb,0x09,0x18,0x01,0x4a,0x20,0xff,0x09, +0x18,0x01,0x4a,0x20,0xfe,0x09,0x18,0x01,0x4a,0x20,0xfc,0x09,0x18,0x01,0x4a,0x20,0xf3,0x09,0x18,0x01,0x4a,0x20,0xf1,0x09,0x18,0x01,0x4a,0x20,0xf0,0x09,0x18,0x01,0x4a,0x20,0xef,0x09,0x18,0x01,0x4a,0x20,0xed,0x09,0x18,0x01,0x4a,0x20,0xea,0x09,0x18,0x01,0x4a,0x20,0xdc,0x09,0x18,0x01,0x4a,0x20,0xda,0x09,0x18,0x01,0x4a,0x20, +0xd8,0x09,0x18,0x01,0x4a,0x20,0xd3,0x09,0x18,0x01,0x4a,0x20,0xcd,0x09,0x18,0x01,0x4a,0x20,0xcc,0x09,0x18,0x01,0x4a,0x20,0xca,0x09,0x18,0x01,0x4a,0x20,0xc9,0x09,0x18,0x01,0x4a,0x20,0xc8,0x09,0x18,0x01,0x4a,0x20,0xc6,0x09,0x18,0x01,0x4a,0x20,0xc4,0x09,0x18,0x01,0x4a,0x20,0xc2,0x09,0x18,0x01,0x4a,0x20,0xc0,0x09,0x18,0x01, +0x4a,0x20,0xbd,0x09,0x18,0x01,0x4a,0x20,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb1,0x09,0x18,0x01,0x4a,0x20,0xaf,0x09,0x18,0x01,0x4a,0x20,0x8c,0x09,0x18,0x01,0x4a,0x20,0x8b,0x09,0x18,0x01,0x4a,0x20,0x8a,0x09,0x18,0x01,0x4a,0x20,0x89,0x09,0x18,0x01,0x4a,0x20,0x38,0x09,0x18,0x01,0x4a,0x20,0x37,0x09,0x18,0x01,0x4a,0x20,0x84,0x09, +0x18,0x01,0x4a,0x20,0x83,0x09,0x18,0x01,0x4a,0x20,0x7f,0x09,0x18,0x01,0x4a,0x20,0x7e,0x09,0x18,0x01,0x4a,0x20,0x7d,0x09,0x18,0x01,0x4a,0x20,0x62,0x09,0x18,0x01,0x4a,0x20,0x50,0x09,0x18,0x01,0x4a,0x20,0x48,0x09,0x18,0x01,0x4a,0x20,0x0e,0x09,0x18,0x01,0x4a,0x2f,0xbe,0x04,0xed,0x00,0x01,0x00,0x4f,0x04,0xec,0x00,0x01,0x00, +0x40,0x04,0xeb,0x40,0x61,0x09,0x0d,0x39,0xdf,0xe0,0x16,0x17,0x1c,0xd4,0xd5,0x16,0x17,0x1c,0x7b,0x7c,0x16,0x1b,0x7b,0x7c,0x19,0xd1,0xd2,0x16,0x17,0x1c,0x76,0x77,0x16,0x17,0x1c,0x6d,0x70,0x16,0x17,0x1c,0x6c,0x6f,0x16,0x17,0x1c,0x6b,0x6e,0x16,0x1b,0x6b,0x6e,0x7f,0x72,0x1a,0x74,0x75,0x14,0x15,0x1c,0x67,0x6a,0x14,0x15,0x1c, +0x66,0x69,0x14,0x15,0x1c,0x65,0x68,0x14,0x1b,0x65,0x68,0x85,0x71,0x1a,0x19,0x73,0x16,0x7a,0x43,0x19,0x21,0x79,0x43,0x19,0x21,0x3b,0x39,0x00,0x2b,0x3a,0x39,0x00,0x2b,0x39,0x95,0x48,0x1f,0x2f,0xbc,0x04,0xe6,0x00,0x2f,0x05,0x03,0x00,0x02,0x05,0x03,0xb3,0x13,0xff,0x1f,0xe0,0xbe,0x04,0xf7,0x00,0x01,0x00,0xe0,0x04,0xf7,0x00, +0x01,0x00,0x20,0x04,0xf0,0xb3,0x0d,0x11,0x39,0x40,0xb8,0x04,0xea,0xb2,0x0b,0x14,0x39,0xb9,0xff,0xc0,0x04,0xef,0xb3,0x1b,0x22,0x39,0x3f,0x41,0x0d,0x04,0xf4,0x00,0x01,0x00,0x8f,0x04,0xf3,0x00,0x01,0x00,0x30,0x04,0xf3,0x00,0x01,0x00,0x30,0x04,0xef,0x00,0x01,0x00,0x40,0x04,0xe8,0xb3,0x0b,0x10,0x39,0x30,0xbd,0x01,0x55,0x00, +0x01,0x00,0x80,0x01,0x55,0x00,0x01,0x01,0x54,0xb3,0x95,0x24,0x1f,0x3f,0xbf,0x01,0x42,0x00,0x01,0x00,0x0f,0x01,0x41,0x00,0xa0,0x01,0x41,0x00,0x02,0xff,0xe0,0xb4,0xf1,0x29,0x2b,0x39,0x40,0xb8,0x01,0x40,0xb3,0x3d,0x43,0x39,0x40,0xb8,0x01,0x40,0xb3,0x24,0x28,0x39,0x40,0xb8,0x01,0x3f,0xb3,0x2c,0x2f,0x39,0x40,0xb8,0x01,0x3f, +0xb3,0x17,0x1c,0x39,0x40,0xb8,0x01,0x3d,0x40,0x16,0x26,0x2b,0x39,0xe6,0xe7,0x03,0x2b,0x40,0xe7,0x2c,0x2e,0x39,0x40,0xe7,0x1b,0x1c,0x39,0x40,0x54,0x1f,0x1f,0x39,0xb8,0xff,0xc0,0x40,0x16,0xcb,0x23,0x23,0x39,0x40,0xd9,0x29,0x2a,0x39,0x53,0x52,0x02,0x2b,0x52,0xe2,0x02,0x2b,0x20,0xb0,0x0b,0x0d,0x39,0xb9,0x01,0x02,0x01,0x01, +0x40,0x1b,0x02,0x2b,0xfd,0xfc,0x0a,0x2b,0xfb,0xaf,0x05,0x2b,0xf2,0xe2,0x02,0x2b,0xc3,0xc5,0x02,0x2b,0x40,0xda,0x17,0x19,0x39,0xdb,0xe2,0x02,0x2b,0xb8,0xff,0xc0,0xb3,0xe2,0x30,0x31,0x39,0xb8,0xff,0xc0,0x40,0x11,0xe2,0x1d,0x1e,0x39,0x40,0xd6,0x17,0x17,0x39,0xeb,0xbe,0x02,0x2b,0xbe,0x9a,0x02,0x2b,0xb8,0x01,0x84,0xb2,0x99, +0x0a,0x2b,0xb8,0x01,0x81,0xb2,0x99,0x0a,0x2b,0xb8,0x01,0x80,0xb2,0x99,0x0a,0x2b,0xb8,0x01,0x7f,0x40,0x0f,0x99,0x0a,0x2b,0x9b,0x99,0x0a,0x2b,0x99,0x9a,0x02,0x2b,0x9a,0x95,0x05,0x2b,0xb8,0xff,0xe0,0xb7,0xee,0x14,0x16,0x39,0x92,0x91,0x03,0x2b,0xb8,0xff,0xe0,0x40,0x0c,0xf4,0x13,0x16,0x39,0xec,0x95,0x04,0x2b,0x91,0x95,0x24, +0x1f,0xb8,0xff,0xe0,0x40,0x0b,0x63,0x18,0x19,0x39,0x66,0x63,0x01,0x96,0x95,0x02,0x2b,0xb8,0xff,0xe0,0x40,0x0c,0x95,0x25,0x28,0x39,0x38,0x37,0x00,0x2b,0x37,0x84,0xff,0x1f,0xb8,0x01,0x01,0xb6,0x7d,0x02,0x2b,0xfc,0xdb,0x0a,0x2b,0xb9,0x01,0x3e,0x01,0x3c,0xb2,0x02,0x2b,0x40,0xb8,0x01,0x3c,0xb2,0x1f,0x24,0x39,0xb8,0x01,0x2f, +0xb2,0x7d,0x03,0x2b,0xb8,0x01,0x2e,0xb3,0x84,0x03,0x2b,0xd0,0xb8,0x01,0x2c,0xb5,0x01,0x40,0xd8,0x17,0x19,0x39,0xb8,0xff,0xc0,0x40,0x09,0xc4,0x22,0x25,0x39,0x40,0xc2,0x17,0x17,0x39,0xb8,0xff,0xc0,0xb3,0xc0,0x1a,0x1b,0x39,0xb8,0xff,0xc0,0xb7,0xc0,0x10,0x12,0x39,0xcd,0xcc,0x03,0x2b,0xb8,0xff,0xc0,0xb7,0xc9,0x23,0x23,0x39, +0xca,0xc8,0x03,0x2b,0xb8,0xff,0xc0,0x40,0x16,0xf0,0x0b,0x0d,0x39,0xea,0x7e,0x02,0x2b,0x30,0x62,0x0c,0x0c,0x06,0x43,0xb1,0xaf,0x02,0x2b,0xaf,0x7e,0x02,0x2b,0xb8,0xff,0xc0,0xb3,0xd3,0x0f,0x12,0x39,0xb8,0xff,0xc0,0xb3,0xbd,0x27,0x28,0x39,0xbc,0x01,0x86,0x00,0x89,0x01,0x00,0x00,0x2b,0x01,0x85,0xb2,0x8a,0x0a,0x2b,0xb8,0xff, +0xc0,0x40,0x1c,0x8c,0x1e,0x1e,0x39,0x89,0x8a,0x04,0x2b,0x8a,0x84,0x0a,0x2b,0x8b,0x84,0x03,0x2b,0x81,0x7f,0x01,0x2b,0x7d,0x7e,0x04,0x2b,0x7e,0x84,0x03,0x2b,0xb8,0xff,0xe0,0x40,0x41,0x62,0x18,0x19,0x39,0x62,0x84,0x01,0x2b,0x88,0x84,0x01,0x2b,0x87,0x84,0x01,0x2b,0x85,0x84,0x01,0x2b,0x83,0x84,0x04,0x2b,0xe9,0x84,0xf9,0x84, +0x02,0x69,0x84,0x01,0x27,0x84,0x01,0x1b,0x37,0x15,0x18,0x36,0x15,0x15,0x35,0x15,0x12,0x34,0x15,0x0f,0x33,0x15,0x0c,0x32,0x15,0x09,0x31,0x15,0x06,0x30,0x15,0x03,0x2f,0x15,0x00,0x2e,0x15,0x41,0x26,0x01,0x4a,0x01,0x4b,0x00,0x15,0x00,0x50,0x01,0x4c,0x00,0x01,0x00,0x70,0x01,0x4a,0x00,0x01,0x01,0x3a,0x01,0x3b,0x00,0x0f,0x01, +0x38,0x01,0x39,0x00,0x0e,0x01,0x36,0x01,0x37,0x00,0x0e,0x00,0x0b,0x01,0x38,0x00,0x3b,0x01,0x38,0x00,0x4b,0x01,0x38,0x00,0xcb,0x01,0x38,0x00,0x04,0x00,0x0b,0x01,0x36,0x00,0x3b,0x01,0x36,0x00,0x5b,0x01,0x36,0x00,0x03,0x00,0x10,0x01,0x3a,0x00,0x01,0x01,0x06,0xb2,0x03,0xff,0x1f,0x41,0x21,0x01,0x0a,0x01,0x0b,0x00,0x0f,0x01, +0x08,0x01,0x09,0x00,0x0e,0x01,0x06,0x01,0x07,0x00,0x0e,0x00,0x6b,0x01,0x08,0x00,0x01,0x00,0x0b,0x01,0x08,0x00,0x3b,0x01,0x08,0x00,0x4b,0x01,0x08,0x00,0xbb,0x01,0x08,0x00,0xeb,0x01,0x08,0x00,0xfb,0x01,0x08,0x00,0x06,0x00,0x0b,0x01,0x0a,0x00,0x5b,0x01,0x0a,0x00,0x8b,0x01,0x0a,0x00,0x03,0x01,0x06,0x40,0x22,0x03,0xff,0x1f, +0x26,0x27,0x0e,0x28,0x27,0x0f,0x35,0x36,0x0e,0x33,0x36,0x0f,0x2a,0x2b,0x0e,0x2c,0x2b,0x0f,0x22,0x23,0x0e,0x24,0x23,0x0f,0x1e,0x1f,0x0e,0x20,0x1f,0x0f,0x00,0xbf,0x01,0x31,0x00,0x10,0x01,0x31,0x00,0x20,0x01,0x31,0x00,0x03,0x00,0x00,0x01,0x30,0x40,0x80,0x01,0x70,0x2a,0xe0,0x2a,0x02,0x00,0x3c,0x01,0x10,0x24,0x40,0x24,0x70, +0x24,0xa0,0x24,0x04,0x0f,0x10,0x11,0x0c,0x09,0x0a,0x0b,0x0c,0x06,0x07,0x08,0x0c,0x03,0x04,0x05,0x0c,0x00,0x01,0x02,0x0c,0x26,0x06,0x1c,0x1f,0x06,0x03,0x18,0x1f,0x0f,0x03,0x3f,0x03,0xdf,0x03,0x03,0x9f,0x00,0xdf,0x00,0x02,0x0f,0x17,0x1f,0x17,0x2f,0x17,0x03,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x1b,0x01,0x1d,0x0d,0x18,0x07, +0x1a,0x0d,0x15,0x10,0x17,0x0d,0x12,0x04,0x14,0x0d,0x2f,0x1b,0x01,0x2c,0x3c,0x2a,0x3c,0x28,0x3c,0x26,0x3c,0x24,0x3c,0x22,0x3c,0x20,0x3c,0x1e,0x3c,0x1b,0x3c,0x18,0x3c,0x15,0x3c,0x12,0x3c,0x0f,0x3c,0x09,0x3c,0x06,0x3c,0x03,0x3c,0x00,0x3c,0x50,0x33,0x54,0x01,0xb0,0x12,0x4b,0x00,0x4b,0x54,0x42,0xb0,0x13,0x01,0x4b,0x00,0x4b, +0x53,0x42,0xb0,0x33,0x2b,0x4b,0xb8,0x03,0x20,0x52,0xb0,0x32,0x2b,0x4b,0xb0,0x09,0x50,0x5b,0x58,0xb1,0x01,0x01,0x8e,0x59,0xb0,0x33,0x2b,0xb0,0x02,0x88,0xb8,0x01,0x00,0x54,0xb0,0x04,0x88,0xb8,0x02,0x00,0x54,0xb0,0x12,0x43,0x5a,0x5b,0x58,0xb8,0x01,0x19,0xb1,0x01,0x01,0x8e,0x85,0x1b,0xb9,0x00,0x01,0x01,0x00,0xb0,0x4b,0x60, +0x85,0x8d,0x59,0x2b,0x2b,0x1d,0xb0,0x64,0x4b,0x53,0x58,0xb0,0x80,0x1d,0x59,0xb0,0x32,0x4b,0x53,0x58,0xb0,0x90,0x1d,0x59,0x00,0x4b,0xb0,0x32,0x51,0xb0,0x1b,0x23,0x42,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b, +0x2b,0x2b,0x73,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0xb1,0x28,0x26,0x45,0xb0,0x2a,0x45,0x61,0xb0,0x2c,0x45,0x60,0x44,0x2b,0x2b,0x2b,0x73,0x73,0x74,0xb8,0x01,0x06,0x45,0x69,0xb8,0x01,0x0a,0x45,0x69,0x61,0xb8,0x01,0x0a,0x23,0x44,0xb8,0x01,0x08,0x45,0x69,0xb8,0x01,0x0a,0x45,0x60,0xb8,0x01,0x08,0x23, +0x44,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x73,0xb8,0x01,0x3a,0x45,0x69,0xb8,0x01,0x38,0x45,0x69,0x60,0xb8,0x01,0x38,0x23,0x44,0xb8,0x01,0x3a,0x45,0x69,0xb8,0x01,0x36,0x45,0x69,0x60,0xb8,0x01,0x36,0x23,0x44,0x2b,0x2b,0x2b,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x01,0x73,0x74,0x75,0x2b,0x2b,0x2b,0x2b, +0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, +0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x2b,0x73,0x74,0x2b,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x73,0x74,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0xb0,0x18,0xb0,0x3f,0x4b,0x53,0x42,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0xb1, +0x09,0x32,0x2b,0x4b,0xb0,0x50,0x52,0x42,0x4b,0xb0,0x08,0x52,0x4b,0xb0,0x08,0x50,0x5b,0xb0,0x1a,0x23,0x42,0x4b,0xb0,0xc8,0x52,0x4b,0xb0,0x36,0x50,0x5b,0xb0,0x0c,0x23,0x42,0xb1,0x00,0x02,0x43,0x54,0xb1,0x02,0x02,0x43,0x54,0xb1,0x06,0x02,0x43,0x54,0x5b,0x5b,0x58,0x41,0x15,0x01,0x3e,0x00,0x64,0x01,0x3c,0x00,0x64,0x01,0x34, +0x00,0x64,0x01,0x32,0x00,0x64,0x01,0x2f,0x00,0x64,0x01,0x2e,0x00,0x64,0x01,0x2c,0x00,0x64,0x01,0x0c,0x00,0x64,0x01,0x04,0x00,0x64,0x01,0x03,0x00,0x64,0x01,0x01,0x40,0x4f,0x64,0xff,0x64,0xfe,0x64,0xfc,0x64,0xf3,0x64,0xf1,0x64,0xf0,0x64,0xef,0x64,0xed,0x64,0xea,0x64,0xdc,0x64,0xda,0x64,0xd8,0x64,0xd3,0x64,0xcd,0x64,0xcc, +0x64,0xca,0x64,0xc9,0x64,0xc8,0x64,0xc6,0x64,0xc4,0x64,0xc2,0x64,0xc0,0x64,0xbd,0x64,0xb4,0x64,0xb1,0x64,0xaf,0x64,0x8c,0x64,0x8b,0x64,0x8a,0x64,0x89,0x64,0x84,0x64,0x83,0x64,0x7f,0x64,0x7e,0x64,0x7d,0x64,0x62,0x64,0x50,0x64,0x48,0x64,0x0e,0x64,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, +0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x59,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, +0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x05,0xec,0x00,0x16,0x00,0x00,0x05,0x9a,0x00,0x18,0x00,0x00,0x05,0x9a,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0xff,0xe8, +0xff,0x89,0x00,0x00,0xff,0xe8,0xff,0x89,0x00,0x00,0xff,0xe8,0xfe,0x4e,0xfe,0x29,0xff,0xf5,0x00,0x00,0x05,0x9a,0x00,0x00,0xfe,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xcd,0xff,0xed,0x05,0xa1,0x00,0x0d,0x02,0x48,0xff,0xeb,0x03,0x59,0x00,0x0d,0x00,0x00,0xff,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xff,0xed,0x04,0x33,0x00,0x12,0x00,0xa4,0x00,0xab,0x00,0x8b,0x00,0x81,0x00,0x77,0xfe,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x71,0x00,0x80, +0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0xa8,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0xa4,0x00,0x9b,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x8c,0x00,0x00, +0x00,0x00,0x00,0x8a,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x8a,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0xe0,0x00,0xa0,0x00,0xe4,0x01,0xbe, +0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x86,0x00,0x00,0x00,0xc5,0x00,0xc3,0x00,0x81,0x00,0x4a,0x00,0x5a,0x00,0x51,0x05,0xdb,0x05,0xdb,0x00,0x86,0x00,0x58,0x00,0x90,0x00,0x58,0x00,0x8a,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf, +0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x78,0x00,0x77,0x00,0x7a,0x00,0x61,0x00,0x7a,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x81,0x00,0x92,0x00,0x8b,0x00,0xa0,0x00,0x97,0x01,0xd3,0x00,0x4c,0x00,0x74,0x00,0x64, +0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x23,0x00,0xc9,0x00,0x6a,0x00,0x6d,0x00,0x4c,0x00,0x61,0x00,0x69,0x00,0xc8,0x00,0xa2,0x00,0x80,0x00,0x7e,0x00,0x6b,0x05,0x9a,0x00,0x11,0x02,0x24,0x00,0x11,0x03,0x00,0xff,0xef,0x00,0x81,0x00,0x67,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x63,0x00,0x96,0x00,0xc0,0xfe,0xbc,0xfe,0xf2,0x00,0x64,0x00,0x64, +0x00,0x76,0x00,0x7c,0x02,0xf6,0x00,0x0d,0x02,0x00,0x00,0x0d,0x04,0x96,0xff,0xf3,0x00,0x54,0x00,0x46,0x00,0x6a,0x00,0x6b,0x00,0x4c,0x07,0x69,0xfe,0x31,0x00,0xe4,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xcd,0x00,0x11,0x06,0xa0,0x00,0x00,0xff,0xed,0xfe,0x00,0x00,0xaa,0x00,0xb6,0x00,0x6c,0x00,0x00, +0x00,0xaa,0x00,0xb8,0x00,0x6c,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xfe,0x63,0xfd,0x6d, +0xfd,0x76,0xff,0x82,0xff,0x83,0x05,0xe9,0x05,0xe3,0x04,0xbe,0x04,0xec,0x03,0x64,0x04,0x19,0x00,0x6e,0x00,0x7f,0x00,0x8c,0x00,0x9b,0x00,0xa7,0x00,0x6e,0x00,0x7f,0x00,0x91,0x00,0xa0,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0xbc,0x00,0x94,0x00,0x94,0xff,0x85,0xff,0xae,0x00,0x52,0x00,0x29,0x06,0x14,0x00,0xae,0x00,0x46,0x00,0x46,0xfe,0x58, +0x05,0x60,0x00,0x8f,0x00,0x85,0x00,0x85,0x00,0x5c,0x00,0x54,0x00,0x46,0x00,0xa7,0x00,0x98,0x00,0x58,0x00,0xe1,0x00,0x9e,0x00,0x4b,0x00,0x69,0x00,0xb4,0xff,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x64,0x00,0xe1,0x00,0x5a,0x00,0x4b,0x00,0x00,0x05,0x4e,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0xbe,0x00,0x00,0x01,0x0a,0x00,0x00,0x02,0x3e,0x00,0x00,0x03,0x84,0x00,0x00,0x04,0xd2,0x00,0x00,0x06,0xca,0x00,0x00,0x06,0xf2,0x00,0x00,0x07,0x66,0x00,0x00,0x07,0xe2,0x00,0x00,0x08,0x8e,0x00,0x00,0x09,0x08,0x00,0x00,0x09,0x6a, +0x00,0x00,0x09,0xa2,0x00,0x00,0x09,0xea,0x00,0x00,0x0a,0x22,0x00,0x00,0x0a,0xa6,0x00,0x00,0x0a,0xf8,0x00,0x00,0x0b,0xb0,0x00,0x00,0x0c,0x9c,0x00,0x00,0x0d,0x28,0x00,0x00,0x0d,0xe8,0x00,0x00,0x0e,0xc4,0x00,0x00,0x0f,0x3a,0x00,0x00,0x10,0x66,0x00,0x00,0x11,0x42,0x00,0x00,0x11,0xca,0x00,0x00,0x12,0x6a,0x00,0x00,0x12,0xda, +0x00,0x00,0x13,0x36,0x00,0x00,0x13,0xa6,0x00,0x00,0x14,0x80,0x00,0x00,0x15,0xfc,0x00,0x00,0x17,0x10,0x00,0x00,0x18,0x52,0x00,0x00,0x19,0x3e,0x00,0x00,0x1a,0x18,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0x4c,0x00,0x00,0x1c,0x58,0x00,0x00,0x1d,0x00,0x00,0x00,0x1d,0x28,0x00,0x00,0x1d,0xc6,0x00,0x00,0x1e,0xa4,0x00,0x00,0x1f,0x4a, +0x00,0x00,0x20,0x64,0x00,0x00,0x21,0x58,0x00,0x00,0x22,0x42,0x00,0x00,0x23,0x18,0x00,0x00,0x23,0xd0,0x00,0x00,0x25,0x02,0x00,0x00,0x26,0x66,0x00,0x00,0x27,0x0a,0x00,0x00,0x27,0xbc,0x00,0x00,0x28,0xbe,0x00,0x00,0x2a,0x6c,0x00,0x00,0x2b,0x84,0x00,0x00,0x2c,0x28,0x00,0x00,0x2c,0xfe,0x00,0x00,0x2d,0x5c,0x00,0x00,0x2d,0x90, +0x00,0x00,0x2d,0xea,0x00,0x00,0x2e,0x3a,0x00,0x00,0x2e,0x64,0x00,0x00,0x2e,0x9c,0x00,0x00,0x2f,0xaa,0x00,0x00,0x30,0xa2,0x00,0x00,0x31,0x70,0x00,0x00,0x32,0x66,0x00,0x00,0x33,0x6e,0x00,0x00,0x34,0x38,0x00,0x00,0x35,0x74,0x00,0x00,0x36,0x46,0x00,0x00,0x36,0xce,0x00,0x00,0x37,0x8a,0x00,0x00,0x38,0x5a,0x00,0x00,0x38,0xac, +0x00,0x00,0x39,0xe8,0x00,0x00,0x3a,0xba,0x00,0x00,0x3b,0x98,0x00,0x00,0x3c,0x90,0x00,0x00,0x3d,0x82,0x00,0x00,0x3e,0x16,0x00,0x00,0x3f,0x38,0x00,0x00,0x3f,0xfa,0x00,0x00,0x40,0xd6,0x00,0x00,0x41,0x8a,0x00,0x00,0x42,0xc4,0x00,0x00,0x43,0xf8,0x00,0x00,0x44,0xe4,0x00,0x00,0x45,0xb8,0x00,0x00,0x46,0x6c,0x00,0x00,0x46,0x9a, +0x00,0x00,0x47,0x54,0x00,0x00,0x47,0xde,0x00,0x00,0x48,0x1a,0x00,0x00,0x49,0xee,0x00,0x00,0x4a,0x06,0x00,0x00,0x4a,0x34,0x00,0x00,0x4a,0x62,0x00,0x00,0x4a,0x98,0x00,0x00,0x4a,0xca,0x00,0x00,0x4a,0xf8,0x00,0x00,0x4b,0x26,0x00,0x00,0x4b,0x56,0x00,0x00,0x4b,0x88,0x00,0x00,0x4b,0xb8,0x00,0x00,0x4b,0xec,0x00,0x00,0x4c,0x04, +0x00,0x00,0x4c,0x32,0x00,0x00,0x4c,0x60,0x00,0x00,0x4c,0x90,0x00,0x00,0x4c,0xc2,0x00,0x00,0x4c,0xee,0x00,0x00,0x4d,0x1a,0x00,0x00,0x4d,0x4a,0x00,0x00,0x4d,0x7e,0x00,0x00,0x4d,0xae,0x00,0x00,0x4d,0xde,0x00,0x00,0x4e,0x0c,0x00,0x00,0x4e,0x3a,0x00,0x00,0x4e,0x6c,0x00,0x00,0x4e,0x9a,0x00,0x00,0x4e,0xca,0x00,0x00,0x4e,0xf8, +0x00,0x00,0x4f,0x26,0x00,0x00,0x4f,0x58,0x00,0x00,0x4f,0xc8,0x00,0x00,0x50,0x4e,0x00,0x00,0x51,0x30,0x00,0x00,0x51,0xec,0x00,0x00,0x53,0x48,0x00,0x00,0x53,0x8e,0x00,0x00,0x54,0x42,0x00,0x00,0x55,0x52,0x00,0x00,0x55,0x62,0x00,0x00,0x56,0x80,0x00,0x00,0x57,0xa2,0x00,0x00,0x58,0x6e,0x00,0x00,0x58,0xa0,0x00,0x00,0x59,0x16, +0x00,0x00,0x59,0xec,0x00,0x00,0x5a,0xee,0x00,0x00,0x5c,0x78,0x00,0x00,0x5d,0x82,0x00,0x00,0x5e,0x1e,0x00,0x00,0x5e,0xb4,0x00,0x00,0x5f,0x4c,0x00,0x00,0x60,0x4a,0x00,0x00,0x60,0xf2,0x00,0x00,0x61,0xd2,0x00,0x00,0x62,0x52,0x00,0x00,0x62,0xb4,0x00,0x00,0x63,0x3c,0x00,0x00,0x64,0x0a,0x00,0x00,0x64,0x82,0x00,0x00,0x65,0xb6, +0x00,0x00,0x67,0x24,0x00,0x00,0x68,0x74,0x00,0x00,0x69,0x4c,0x00,0x00,0x69,0x4c,0x00,0x00,0x69,0xc4,0x00,0x00,0x6a,0x10,0x00,0x00,0x6a,0x82,0x00,0x00,0x6b,0x68,0x00,0x00,0x6c,0x7e,0x00,0x00,0x6c,0xfc,0x00,0x00,0x6d,0x66,0x00,0x00,0x6d,0xd0,0x00,0x00,0x6e,0x90,0x00,0x00,0x6e,0xbe,0x00,0x00,0x6e,0xee,0x00,0x00,0x6f,0x1c, +0x00,0x00,0x70,0x4e,0x00,0x00,0x71,0xe0,0x00,0x00,0x72,0x0a,0x00,0x00,0x72,0x34,0x00,0x00,0x72,0x82,0x00,0x00,0x72,0xd0,0x00,0x00,0x73,0x06,0x00,0x00,0x73,0x38,0x00,0x00,0x73,0xda,0x00,0x00,0x74,0x3c,0x00,0x00,0x74,0x6c,0x00,0x00,0x74,0xa0,0x00,0x00,0x74,0xce,0x00,0x00,0x76,0x0e,0x00,0x00,0x76,0x50,0x00,0x00,0x76,0x92, +0x00,0x00,0x77,0xae,0x00,0x00,0x78,0xa0,0x00,0x00,0x79,0x54,0x00,0x00,0x79,0x96,0x00,0x00,0x79,0xde,0x00,0x00,0x7a,0x56,0x00,0x00,0x7c,0x38,0x00,0x00,0x7c,0x68,0x00,0x00,0x7c,0x98,0x00,0x00,0x7c,0xc8,0x00,0x00,0x7c,0xfa,0x00,0x00,0x7d,0x2a,0x00,0x00,0x7d,0x58,0x00,0x00,0x7d,0x86,0x00,0x00,0x7d,0xb8,0x00,0x00,0x7d,0xe6, +0x00,0x00,0x7e,0x14,0x00,0x00,0x7e,0x42,0x00,0x00,0x7e,0x70,0x00,0x00,0x7e,0x9e,0x00,0x00,0x7e,0xcc,0x00,0x00,0x7e,0xfc,0x00,0x00,0x7f,0x46,0x00,0x00,0x7f,0x86,0x00,0x00,0x80,0x16,0x00,0x00,0x80,0x42,0x00,0x00,0x80,0xa4,0x00,0x00,0x80,0xe2,0x00,0x00,0x81,0x7c,0x00,0x00,0x82,0x16,0x00,0x00,0x82,0x8e,0x00,0x00,0x82,0xe4, +0x00,0x00,0x83,0x26,0x00,0x00,0x84,0x22,0x00,0x00,0x84,0xb6,0x00,0x00,0x84,0xe4,0x00,0x00,0x85,0x10,0x00,0x00,0x85,0x3e,0x00,0x00,0x85,0x6a,0x00,0x00,0x85,0xb2,0x00,0x00,0x86,0xb4,0x00,0x00,0x88,0x30,0x00,0x00,0x88,0x5e,0x00,0x00,0x88,0x8c,0x00,0x00,0x89,0x50,0x00,0x00,0x8a,0x4a,0x00,0x00,0x8a,0x96,0x00,0x00,0x8a,0xf6, +0x00,0x00,0x8b,0x40,0x00,0x00,0x8b,0xd8,0x00,0x00,0x8c,0x94,0x00,0x00,0x8c,0xbe,0x00,0x00,0x8c,0xea,0x00,0x00,0x8d,0x16,0x00,0x00,0x8d,0xd4,0x00,0x00,0x8e,0x04,0x00,0x00,0x8e,0x32,0x00,0x00,0x8e,0x60,0x00,0x00,0x8e,0x78,0x00,0x00,0x8e,0x90,0x00,0x00,0x8e,0xbe,0x00,0x00,0x8e,0xec,0x00,0x00,0x8f,0x1a,0x00,0x00,0x8f,0x48, +0x00,0x00,0x90,0x80,0x00,0x00,0x90,0xac,0x00,0x00,0x90,0xbc,0x00,0x00,0x90,0xec,0x00,0x00,0x91,0x1c,0x00,0x00,0x91,0x34,0x00,0x00,0x91,0x4c,0x00,0x00,0x91,0x7a,0x00,0x00,0x91,0xa6,0x00,0x00,0x91,0xb6,0x00,0x00,0x91,0xce,0x00,0x00,0x91,0xe6,0x00,0x00,0x92,0x16,0x00,0x00,0x92,0x44,0x00,0x00,0x92,0x72,0x00,0x00,0x92,0xa2, +0x00,0x00,0x92,0xd0,0x00,0x00,0x92,0xfc,0x00,0x00,0x93,0x24,0x00,0x00,0x93,0x4a,0x00,0x00,0x93,0x78,0x00,0x00,0x93,0xa8,0x00,0x00,0x93,0xd8,0x00,0x00,0x94,0x06,0x00,0x00,0x94,0x3a,0x00,0x00,0x94,0x6c,0x00,0x00,0x94,0x8e,0x00,0x00,0x94,0xbc,0x00,0x00,0x94,0xde,0x00,0x00,0x95,0x0a,0x00,0x00,0x95,0x2c,0x00,0x00,0x95,0x4e, +0x00,0x00,0x95,0x74,0x00,0x00,0x95,0x8c,0x00,0x00,0x95,0xba,0x00,0x00,0x96,0x82,0x00,0x00,0x96,0xc0,0x00,0x00,0x96,0xf2,0x00,0x00,0x97,0x52,0x00,0x00,0x97,0x86,0x00,0x00,0x97,0xb6,0x00,0x00,0x97,0xe4,0x00,0x00,0x98,0x14,0x00,0x00,0x98,0x42,0x00,0x00,0x98,0xb0,0x00,0x00,0x99,0xd6,0x00,0x00,0x9b,0x46,0x00,0x00,0x9c,0xc6, +0x00,0x00,0x9e,0x22,0x00,0x00,0x9f,0x28,0x00,0x00,0x9f,0xf6,0x00,0x00,0xa0,0xb2,0x00,0x00,0xa2,0x28,0x00,0x00,0xa2,0x7c,0x00,0x00,0xa2,0x94,0x00,0x00,0xa2,0xfc,0x00,0x00,0xa4,0x9a,0x00,0x00,0xa4,0xc2,0x00,0x00,0xa5,0x12,0x00,0x00,0xa5,0x44,0x00,0x00,0xa5,0x7a,0x00,0x00,0xa5,0xe0,0x00,0x00,0xa6,0xd6,0x00,0x00,0xa7,0x86, +0x00,0x00,0xa7,0xea,0x00,0x00,0xa8,0x2c,0x00,0x00,0xa8,0x98,0x00,0x00,0xa8,0xf2,0x00,0x00,0xa9,0x86,0x00,0x00,0xa9,0xb4,0x00,0x00,0xa9,0xe2,0x00,0x00,0xaa,0x10,0x00,0x00,0xaa,0x40,0x00,0x00,0xaa,0x6e,0x00,0x00,0xaa,0x9c,0x00,0x00,0xaa,0xca,0x00,0x00,0xaa,0xf8,0x00,0x00,0xab,0x26,0x00,0x00,0xab,0x56,0x00,0x00,0xab,0x86, +0x00,0x00,0xab,0xb4,0x00,0x00,0xab,0xe2,0x00,0x00,0xac,0x10,0x00,0x00,0xac,0x3e,0x00,0x00,0xac,0x6c,0x00,0x00,0xac,0x92,0x00,0x00,0xad,0xd0,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x30,0x00,0x00,0xaf,0x18,0x00,0x00,0xb0,0x24,0x00,0x00,0xb0,0x52,0x00,0x00,0xb0,0x80,0x00,0x00,0xb0,0xae,0x00,0x00,0xb0,0xdc,0x00,0x00,0xb1,0x0a, +0x00,0x00,0xb1,0x38,0x00,0x00,0xb1,0x5c,0x00,0x00,0xb1,0x80,0x00,0x00,0xb1,0xae,0x00,0x00,0xb1,0xd0,0x00,0x00,0xb1,0xf6,0x00,0x00,0xb2,0x1c,0x00,0x00,0xb2,0xb8,0x00,0x00,0xb2,0xd0,0x00,0x00,0xb2,0xe8,0x00,0x00,0xb3,0x10,0x00,0x00,0xb3,0x36,0x00,0x00,0xb4,0x4a,0x00,0x00,0xb5,0x38,0x00,0x00,0xb5,0x66,0x00,0x00,0xb5,0x94, +0x00,0x00,0xb5,0xc2,0x00,0x00,0xb5,0xf0,0x00,0x00,0xb6,0x08,0x00,0x00,0xb6,0x2c,0x00,0x00,0xb6,0x4e,0x00,0x00,0xb6,0x6e,0x00,0x00,0xb7,0x4a,0x00,0x00,0xb8,0x38,0x00,0x00,0xb8,0x66,0x00,0x00,0xb8,0x94,0x00,0x00,0xb8,0xc2,0x00,0x00,0xb8,0xf2,0x00,0x00,0xb9,0x22,0x00,0x00,0xb9,0x52,0x00,0x00,0xb9,0x6a,0x00,0x00,0xb9,0x82, +0x00,0x00,0xb9,0xb0,0x00,0x00,0xb9,0xe0,0x00,0x00,0xba,0x0e,0x00,0x00,0xba,0x3c,0x00,0x00,0xba,0xa6,0x00,0x00,0xbc,0x2c,0x00,0x00,0xbc,0x82,0x00,0x00,0xbc,0xb0,0x00,0x00,0xbc,0xde,0x00,0x00,0xbd,0x0c,0x00,0x00,0xbd,0x3c,0x00,0x00,0xbd,0x7e,0x00,0x00,0xbd,0xae,0x00,0x00,0xbd,0xde,0x00,0x00,0xbe,0x10,0x00,0x00,0xbe,0x3e, +0x00,0x00,0xbe,0x72,0x00,0x00,0xbe,0xa6,0x00,0x00,0xbe,0xda,0x00,0x00,0xbf,0x0a,0x00,0x00,0xbf,0x42,0x00,0x00,0xbf,0x6e,0x00,0x00,0xc0,0x66,0x00,0x00,0xc1,0x16,0x00,0x00,0xc1,0x44,0x00,0x00,0xc1,0x72,0x00,0x00,0xc1,0xa0,0x00,0x00,0xc1,0xce,0x00,0x00,0xc2,0x02,0x00,0x00,0xc2,0x36,0x00,0x00,0xc2,0x46,0x00,0x00,0xc2,0x72, +0x00,0x00,0xc2,0xf8,0x00,0x00,0xc3,0x24,0x00,0x00,0xc3,0x54,0x00,0x00,0xc3,0x84,0x00,0x00,0xc3,0xa8,0x00,0x00,0xc3,0xd4,0x00,0x00,0xc4,0x04,0x00,0x00,0xc4,0x34,0x00,0x00,0xc4,0x6a,0x00,0x00,0xc4,0x7a,0x00,0x00,0xc4,0x8a,0x00,0x00,0xc4,0x9a,0x00,0x00,0xc4,0xaa,0x00,0x00,0xc4,0xba,0x00,0x00,0xc4,0xca,0x00,0x00,0xc4,0xda, +0x00,0x00,0xc5,0x6e,0x00,0x00,0xc5,0x7e,0x00,0x00,0xc5,0x8e,0x00,0x00,0xc6,0x18,0x00,0x00,0xc6,0x28,0x00,0x00,0xc6,0xbc,0x00,0x00,0xc6,0xcc,0x00,0x00,0xc7,0x62,0x00,0x00,0xc7,0x72,0x00,0x00,0xc7,0x82,0x00,0x00,0xc7,0x92,0x00,0x00,0xc8,0xb4,0x00,0x00,0xc8,0xc4,0x00,0x00,0xc8,0xf6,0x00,0x00,0xc9,0x2a,0x00,0x00,0xc9,0x58, +0x00,0x00,0xc9,0x86,0x00,0x00,0xc9,0xb4,0x00,0x00,0xc9,0xe2,0x00,0x00,0xca,0x1a,0x00,0x00,0xcb,0x52,0x00,0x00,0xcc,0x3e,0x00,0x00,0xcc,0xfc,0x00,0x00,0xcd,0xc0,0x00,0x00,0xce,0xea,0x00,0x00,0xcf,0x60,0x00,0x00,0xd0,0x4a,0x00,0x00,0xd0,0xe6,0x00,0x00,0xd1,0xde,0x00,0x00,0xd2,0x80,0x00,0x00,0xd3,0xbe,0x00,0x00,0xd3,0xce, +0x00,0x00,0xd4,0xac,0x00,0x00,0xd5,0x98,0x00,0x00,0xd6,0x96,0x00,0x00,0xd7,0x8e,0x00,0x00,0xd8,0xd4,0x00,0x00,0xda,0x1e,0x00,0x00,0xda,0x50,0x00,0x00,0xda,0x84,0x00,0x00,0xda,0xb4,0x00,0x00,0xda,0xe2,0x00,0x00,0xdb,0x10,0x00,0x00,0xdb,0x42,0x00,0x00,0xdc,0x4c,0x00,0x00,0xdc,0x7e,0x00,0x00,0xdd,0x70,0x00,0x00,0xdd,0x80, +0x00,0x00,0xdd,0xb2,0x00,0x00,0xde,0xe2,0x00,0x00,0xdf,0xf2,0x00,0x00,0xe0,0xf8,0x00,0x00,0xe1,0x2a,0x00,0x00,0xe1,0x58,0x00,0x00,0xe2,0x3a,0x00,0x00,0xe2,0x4a,0x00,0x00,0xe3,0x32,0x00,0x00,0xe3,0x42,0x00,0x00,0xe3,0x52,0x00,0x00,0xe4,0x70,0x00,0x00,0xe4,0x80,0x00,0x00,0xe5,0x9e,0x00,0x00,0xe6,0xdc,0x00,0x00,0xe7,0xc4, +0x00,0x00,0xe7,0xf2,0x00,0x00,0xe8,0x02,0x00,0x00,0xe8,0xbc,0x00,0x00,0xe8,0xcc,0x00,0x00,0xe8,0xdc,0x00,0x00,0xe8,0xec,0x00,0x00,0xe8,0xfc,0x00,0x00,0xe9,0x0c,0x00,0x00,0xe9,0x1c,0x00,0x00,0xe9,0x2c,0x00,0x00,0xe9,0xd4,0x00,0x00,0xeb,0x50,0x00,0x00,0xeb,0x60,0x00,0x00,0xec,0x44,0x00,0x00,0xed,0x02,0x00,0x00,0xed,0xd8, +0x00,0x00,0xef,0x12,0x00,0x00,0xef,0xf4,0x00,0x00,0xf0,0xf6,0x00,0x00,0xf1,0xc0,0x00,0x00,0xf2,0xd2,0x00,0x00,0xf4,0x1c,0x00,0x00,0xf5,0x22,0x00,0x00,0xf5,0x32,0x00,0x00,0xf6,0x46,0x00,0x00,0xf7,0x42,0x00,0x00,0xf7,0xaa,0x00,0x00,0xf8,0xac,0x00,0x00,0xf8,0xbc,0x00,0x00,0xf9,0xd6,0x00,0x00,0xfa,0xde,0x00,0x00,0xfb,0xa8, +0x00,0x00,0xfb,0xd4,0x00,0x00,0xfb,0xe4,0x00,0x00,0xfc,0xb2,0x00,0x00,0xfd,0xac,0x00,0x00,0xfe,0x44,0x00,0x00,0xfe,0x54,0x00,0x00,0xfe,0xd8,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xf8,0x00,0x00,0xff,0x66,0x00,0x00,0xff,0x76,0x00,0x01,0x00,0xd8,0x00,0x01,0x00,0xe8,0x00,0x01,0x01,0xac,0x00,0x01,0x02,0x4a,0x00,0x01,0x03,0x26, +0x00,0x01,0x04,0x54,0x00,0x01,0x05,0x16,0x00,0x01,0x06,0x12,0x00,0x01,0x06,0xc4,0x00,0x01,0x07,0xae,0x00,0x01,0x08,0xc8,0x00,0x01,0x09,0xc8,0x00,0x01,0x09,0xf8,0x00,0x01,0x0b,0x1c,0x00,0x01,0x0b,0x4a,0x00,0x01,0x0c,0x24,0x00,0x01,0x0c,0x34,0x00,0x01,0x0c,0x66,0x00,0x01,0x0d,0x98,0x00,0x01,0x0e,0xa4,0x00,0x01,0x0f,0xa6, +0x00,0x01,0x0f,0xd4,0x00,0x01,0x10,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x11,0x68,0x00,0x01,0x11,0xf0,0x00,0x01,0x12,0x00,0x00,0x01,0x13,0x64,0x00,0x01,0x14,0x6c,0x00,0x01,0x14,0xf8,0x00,0x01,0x15,0x9a,0x00,0x01,0x15,0xf4,0x00,0x01,0x17,0x08,0x00,0x01,0x17,0x18,0x00,0x01,0x17,0x2e,0x00,0x01,0x17,0x44,0x00,0x01,0x18,0x2a, +0x00,0x01,0x19,0x62,0x00,0x01,0x1a,0x6c,0x00,0x01,0x1b,0x42,0x00,0x01,0x1c,0x28,0x00,0x01,0x1c,0x8c,0x00,0x01,0x1c,0xce,0x00,0x01,0x1c,0xf6,0x00,0x01,0x1d,0x1e,0x00,0x01,0x1d,0x7c,0x00,0x01,0x1d,0xe2,0x00,0x01,0x1e,0x76,0x00,0x01,0x1f,0x08,0x00,0x01,0x1f,0x78,0x00,0x01,0x1f,0xe8,0x00,0x01,0x20,0xa2,0x00,0x01,0x21,0x50, +0x00,0x01,0x21,0xc6,0x00,0x01,0x22,0x68,0x00,0x01,0x22,0xde,0x00,0x01,0x23,0x56,0x00,0x01,0x24,0x1a,0x00,0x01,0x24,0xd4,0x00,0x01,0x25,0x82,0x00,0x01,0x25,0xa8,0x00,0x01,0x25,0xd0,0x00,0x01,0x26,0x00,0x00,0x01,0x26,0x2e,0x00,0x01,0x26,0x62,0x00,0x01,0x26,0x94,0x00,0x01,0x26,0xc8,0x00,0x01,0x26,0xf8,0x00,0x01,0x27,0x2c, +0x00,0x01,0x27,0x60,0x00,0x01,0x27,0x94,0x00,0x01,0x27,0xc4,0x00,0x01,0x28,0x04,0x00,0x01,0x28,0x42,0x00,0x01,0x28,0x76,0x00,0x01,0x28,0xa8,0x00,0x01,0x28,0xdc,0x00,0x01,0x29,0x0e,0x00,0x01,0x29,0x54,0x00,0x01,0x29,0x88,0x00,0x01,0x29,0xba,0x00,0x01,0x29,0xea,0x00,0x01,0x2a,0x28,0x00,0x01,0x2a,0x66,0x00,0x01,0x2a,0x8c, +0x00,0x01,0x2a,0xb2,0x00,0x01,0x2a,0xe0,0x00,0x01,0x2b,0x0e,0x00,0x01,0x2b,0x40,0x00,0x01,0x2b,0x6e,0x00,0x01,0x2b,0xa0,0x00,0x01,0x2b,0xd4,0x00,0x01,0x2c,0x06,0x00,0x01,0x2c,0x36,0x00,0x01,0x2c,0x68,0x00,0x01,0x2c,0x9a,0x00,0x01,0x2c,0xcc,0x00,0x01,0x2c,0xfc,0x00,0x01,0x2d,0x3c,0x00,0x01,0x2d,0x7a,0x00,0x01,0x2d,0xa8, +0x00,0x01,0x2d,0xd4,0x00,0x01,0x2d,0xf8,0x00,0x01,0x2e,0x1e,0x00,0x01,0x2e,0x46,0x00,0x01,0x2e,0x6c,0x00,0x01,0x2e,0x9c,0x00,0x01,0x2e,0xcc,0x00,0x01,0x2e,0xfe,0x00,0x01,0x2f,0x30,0x00,0x01,0x2f,0x62,0x00,0x01,0x2f,0x94,0x00,0x01,0x2f,0xc8,0x00,0x01,0x2f,0xfc,0x00,0x01,0x30,0x2e,0x00,0x01,0x30,0x60,0x00,0x01,0x30,0x9e, +0x00,0x01,0x30,0xde,0x00,0x01,0x31,0x0c,0x00,0x01,0x31,0x3c,0x00,0x01,0x31,0x6a,0x00,0x01,0x31,0x9a,0x00,0x01,0x31,0xc8,0x00,0x01,0x31,0xf8,0x00,0x01,0x32,0x26,0x00,0x01,0x32,0x54,0x00,0x01,0x32,0x7a,0x00,0x01,0x32,0xa0,0x00,0x01,0x32,0xc6,0x00,0x01,0x32,0xee,0x00,0x01,0x33,0x1c,0x00,0x01,0x33,0x4a,0x00,0x01,0x33,0x78, +0x00,0x01,0x33,0xa6,0x00,0x01,0x33,0xd4,0x00,0x01,0x34,0x02,0x00,0x01,0x34,0x32,0x00,0x01,0x34,0x62,0x00,0x01,0x34,0x90,0x00,0x01,0x34,0xbe,0x00,0x01,0x34,0xe4,0x00,0x01,0x35,0x0a,0x00,0x01,0x35,0x30,0x00,0x01,0x35,0x58,0x00,0x01,0x35,0x86,0x00,0x01,0x35,0xb4,0x00,0x01,0x35,0xe2,0x00,0x01,0x36,0x12,0x00,0x01,0x36,0x38, +0x00,0x01,0x36,0x5e,0x00,0x01,0x36,0x8e,0x00,0x01,0x36,0xbe,0x00,0x01,0x36,0xee,0x00,0x01,0x37,0x1e,0x00,0x01,0x37,0x2e,0x00,0x01,0x37,0x3e,0x00,0x01,0x37,0x4e,0x00,0x01,0x37,0x5e,0x00,0x01,0x37,0xee,0x00,0x01,0x38,0x82,0x00,0x01,0x39,0xaa,0x00,0x01,0x3a,0xb0,0x00,0x01,0x3b,0x86,0x00,0x01,0x3c,0x44,0x00,0x01,0x3d,0x44, +0x00,0x01,0x3e,0x0e,0x00,0x01,0x3f,0x00,0x00,0x01,0x3f,0xd6,0x00,0x01,0x3f,0xe6,0x00,0x01,0x40,0x8a,0x00,0x01,0x41,0x58,0x00,0x01,0x42,0x02,0x00,0x01,0x42,0xc8,0x00,0x01,0x43,0x84,0x00,0x01,0x44,0x72,0x00,0x01,0x45,0x4a,0x00,0x01,0x45,0xf6,0x00,0x01,0x46,0x06,0x00,0x01,0x46,0xe0,0x00,0x01,0x47,0x8e,0x00,0x01,0x48,0x60, +0x00,0x01,0x49,0x2a,0x00,0x01,0x49,0x80,0x00,0x01,0x49,0xce,0x00,0x01,0x4a,0x22,0x00,0x01,0x4a,0x6e,0x00,0x01,0x4b,0x0c,0x00,0x01,0x4b,0xa0,0x00,0x01,0x4c,0x3e,0x00,0x01,0x4c,0xc6,0x00,0x01,0x4d,0xa8,0x00,0x01,0x4e,0x62,0x00,0x01,0x4e,0xba,0x00,0x01,0x4f,0x12,0x00,0x01,0x4f,0x88,0x00,0x01,0x4f,0xf4,0x00,0x01,0x50,0x88, +0x00,0x01,0x51,0x12,0x00,0x01,0x51,0x2a,0x00,0x01,0x51,0x42,0x00,0x01,0x51,0x84,0x00,0x01,0x51,0xc6,0x00,0x01,0x51,0xf6,0x00,0x01,0x52,0x24,0x00,0x01,0x52,0x58,0x00,0x01,0x52,0x8c,0x00,0x01,0x52,0xc0,0x00,0x01,0x52,0xf2,0x00,0x01,0x53,0x1c,0x00,0x01,0x53,0x46,0x00,0x01,0x53,0x76,0x00,0x01,0x53,0xa6,0x00,0x01,0x53,0xda, +0x00,0x01,0x54,0x0c,0x00,0x01,0x54,0x40,0x00,0x01,0x54,0x72,0x00,0x01,0x54,0xa2,0x00,0x01,0x54,0xd0,0x00,0x01,0x55,0x00,0x00,0x01,0x55,0x2e,0x00,0x01,0x55,0x60,0x00,0x01,0x55,0x92,0x00,0x01,0x55,0xc4,0x00,0x01,0x55,0xf6,0x00,0x01,0x56,0x24,0x00,0x01,0x56,0x52,0x00,0x01,0x56,0x82,0x00,0x01,0x56,0xb0,0x00,0x01,0x56,0xe8, +0x00,0x01,0x57,0x1e,0x00,0x01,0x57,0x4e,0x00,0x01,0x57,0x7c,0x00,0x01,0x57,0xaa,0x00,0x01,0x57,0xd8,0x00,0x01,0x58,0x08,0x00,0x01,0x58,0x36,0x00,0x01,0x58,0x68,0x00,0x01,0x58,0x9c,0x00,0x01,0x58,0xce,0x00,0x01,0x59,0x00,0x00,0x01,0x59,0x16,0x00,0x01,0x59,0x2c,0x00,0x01,0x59,0x5a,0x00,0x01,0x59,0x88,0x00,0x01,0x59,0xae, +0x00,0x01,0x59,0xd4,0x00,0x01,0x5a,0x0a,0x00,0x01,0x5a,0x40,0x00,0x01,0x5a,0x70,0x00,0x01,0x5a,0x9e,0x00,0x01,0x5a,0xd2,0x00,0x01,0x5b,0x06,0x00,0x01,0x5b,0x3a,0x00,0x01,0x5b,0x6e,0x00,0x01,0x5b,0xa2,0x00,0x01,0x5b,0xd2,0x00,0x01,0x5c,0x20,0x00,0x01,0x5c,0x6a,0x00,0x01,0x5c,0x9c,0x00,0x01,0x5c,0xce,0x00,0x01,0x5c,0xfc, +0x00,0x01,0x5d,0x2a,0x00,0x01,0x5d,0x42,0x00,0x01,0x5d,0x70,0x00,0x01,0x5d,0x88,0x00,0x01,0x5d,0xb8,0x00,0x01,0x5d,0xd0,0x00,0x01,0x5d,0xf6,0x00,0x01,0x5e,0x26,0x00,0x01,0x5e,0x54,0x00,0x01,0x5e,0x7c,0x00,0x01,0x5e,0xa2,0x00,0x01,0x5e,0xda,0x00,0x01,0x5f,0x10,0x00,0x01,0x5f,0x3e,0x00,0x01,0x5f,0x6c,0x00,0x01,0x5f,0x9e, +0x00,0x01,0x5f,0xce,0x00,0x01,0x60,0x04,0x00,0x01,0x60,0x38,0x00,0x01,0x60,0x6a,0x00,0x01,0x60,0x9c,0x00,0x01,0x60,0xce,0x00,0x01,0x61,0x02,0x00,0x01,0x61,0x32,0x00,0x01,0x61,0x62,0x00,0x01,0x61,0x92,0x00,0x01,0x61,0xc2,0x00,0x01,0x61,0xe4,0x00,0x01,0x62,0x14,0x00,0x01,0x62,0x2c,0x00,0x01,0x62,0x42,0x00,0x01,0x62,0x6c, +0x00,0x01,0x62,0xac,0x00,0x01,0x62,0xd8,0x00,0x01,0x63,0x0e,0x00,0x01,0x63,0x30,0x00,0x01,0x63,0x52,0x00,0x01,0x63,0x6a,0x00,0x01,0x63,0x80,0x00,0x01,0x63,0xa4,0x00,0x01,0x63,0xc8,0x00,0x01,0x63,0xec,0x00,0x01,0x64,0x10,0x00,0x01,0x64,0x3a,0x00,0x01,0x64,0x64,0x00,0x01,0x64,0x92,0x00,0x01,0x64,0xc6,0x00,0x01,0x64,0xec, +0x00,0x01,0x65,0x10,0x00,0x01,0x65,0x46,0x00,0x01,0x65,0x7c,0x00,0x01,0x65,0xaa,0x00,0x01,0x65,0xd8,0x00,0x01,0x66,0x14,0x00,0x01,0x66,0x50,0x00,0x01,0x66,0x80,0x00,0x01,0x66,0xb0,0x00,0x01,0x66,0xe0,0x00,0x01,0x67,0x10,0x00,0x01,0x67,0x42,0x00,0x01,0x67,0x72,0x00,0x01,0x67,0xa8,0x00,0x01,0x67,0xe0,0x00,0x01,0x68,0x0e, +0x00,0x01,0x68,0x3c,0x00,0x01,0x68,0x62,0x00,0x01,0x68,0x8a,0x00,0x01,0x68,0xb8,0x00,0x01,0x68,0xe6,0x00,0x01,0x69,0x0c,0x00,0x01,0x69,0x32,0x00,0x01,0x69,0x60,0x00,0x01,0x69,0x8e,0x00,0x01,0x69,0xc0,0x00,0x01,0x69,0xf0,0x00,0x01,0x6a,0x20,0x00,0x01,0x6a,0x50,0x00,0x01,0x6a,0x7e,0x00,0x01,0x6a,0xaa,0x00,0x01,0x6a,0xd0, +0x00,0x01,0x6a,0xf6,0x00,0x01,0x6b,0x2c,0x00,0x01,0x6b,0x62,0x00,0x01,0x6b,0x98,0x00,0x01,0x6b,0xce,0x00,0x01,0x6c,0x00,0x00,0x01,0x6c,0x34,0x00,0x01,0x6c,0x62,0x00,0x01,0x6c,0x92,0x00,0x01,0x6c,0xbe,0x00,0x01,0x6c,0xec,0x00,0x01,0x6d,0x1e,0x00,0x01,0x6d,0x50,0x00,0x01,0x6d,0x80,0x00,0x01,0x6d,0xb2,0x00,0x01,0x6d,0xe4, +0x00,0x01,0x6e,0x16,0x00,0x01,0x6e,0x46,0x00,0x01,0x6e,0x76,0x00,0x01,0x6e,0xac,0x00,0x01,0x6e,0xe2,0x00,0x01,0x6f,0x18,0x00,0x01,0x6f,0x4e,0x00,0x01,0x6f,0x84,0x00,0x01,0x6f,0xba,0x00,0x01,0x6f,0xe6,0x00,0x01,0x70,0x12,0x00,0x01,0x70,0x42,0x00,0x01,0x70,0x74,0x00,0x01,0x70,0xa4,0x00,0x01,0x70,0xd4,0x00,0x01,0x71,0x06, +0x00,0x01,0x71,0x38,0x00,0x01,0x71,0x6e,0x00,0x01,0x71,0xa4,0x00,0x01,0x71,0xda,0x00,0x01,0x72,0x10,0x00,0x01,0x72,0x3c,0x00,0x01,0x72,0x6a,0x00,0x01,0x72,0x9c,0x00,0x01,0x72,0xce,0x00,0x01,0x72,0xfe,0x00,0x01,0x73,0x2e,0x00,0x01,0x73,0x60,0x00,0x01,0x73,0x92,0x00,0x01,0x73,0xc4,0x00,0x01,0x73,0xf6,0x00,0x01,0x74,0x2c, +0x00,0x01,0x74,0x62,0x00,0x01,0x74,0x98,0x00,0x01,0x74,0xce,0x00,0x01,0x75,0x04,0x00,0x01,0x75,0x3a,0x00,0x01,0x75,0x6a,0x00,0x01,0x75,0x9a,0x00,0x01,0x75,0xce,0x00,0x01,0x76,0x02,0x00,0x01,0x76,0x36,0x00,0x01,0x76,0x6a,0x00,0x01,0x76,0x9e,0x00,0x01,0x76,0xd2,0x00,0x01,0x76,0xf6,0x00,0x01,0x77,0x1a,0x00,0x01,0x77,0x40, +0x00,0x01,0x77,0x66,0x00,0x01,0x77,0x8c,0x00,0x01,0x77,0xb2,0x00,0x01,0x77,0xd8,0x00,0x01,0x77,0xfe,0x00,0x01,0x78,0x2a,0x00,0x01,0x78,0x58,0x00,0x01,0x78,0x8a,0x00,0x01,0x78,0xbc,0x00,0x01,0x78,0xec,0x00,0x01,0x79,0x1e,0x00,0x01,0x79,0x4e,0x00,0x01,0x79,0x7e,0x00,0x01,0x79,0xb4,0x00,0x01,0x79,0xea,0x00,0x01,0x7a,0x20, +0x00,0x01,0x7a,0x54,0x00,0x01,0x7a,0x82,0x00,0x01,0x7a,0xb0,0x00,0x01,0x7a,0xe2,0x00,0x01,0x7b,0x14,0x00,0x01,0x7b,0x46,0x00,0x01,0x7b,0x78,0x00,0x01,0x7b,0xaa,0x00,0x01,0x7b,0xdc,0x00,0x01,0x7c,0x0e,0x00,0x01,0x7c,0x44,0x00,0x01,0x7c,0x7a,0x00,0x01,0x7c,0xb0,0x00,0x01,0x7c,0xde,0x00,0x01,0x7d,0x0e,0x00,0x01,0x7d,0x42, +0x00,0x01,0x7d,0x76,0x00,0x01,0x7d,0xa8,0x00,0x01,0x7d,0xda,0x00,0x01,0x7e,0x0e,0x00,0x01,0x7e,0x42,0x00,0x01,0x7e,0x74,0x00,0x01,0x7e,0xa6,0x00,0x01,0x7e,0xdc,0x00,0x01,0x7f,0x12,0x00,0x01,0x7f,0x48,0x00,0x01,0x7f,0x7c,0x00,0x01,0x7f,0xb0,0x00,0x01,0x7f,0xe4,0x00,0x01,0x80,0x12,0x00,0x01,0x80,0x3e,0x00,0x01,0x80,0x6c, +0x00,0x01,0x80,0x98,0x00,0x01,0x80,0xc6,0x00,0x01,0x80,0xf2,0x00,0x01,0x81,0x22,0x00,0x01,0x81,0x52,0x00,0x01,0x81,0x80,0x00,0x01,0x81,0xac,0x00,0x01,0x81,0xda,0x00,0x01,0x82,0x08,0x00,0x01,0x82,0x38,0x00,0x01,0x82,0x66,0x00,0x01,0x82,0xa0,0x00,0x01,0x82,0xdc,0x00,0x01,0x83,0x1c,0x00,0x01,0x83,0x5c,0x00,0x01,0x83,0x9a, +0x00,0x01,0x83,0xda,0x00,0x01,0x84,0x1a,0x00,0x01,0x84,0x5a,0x00,0x01,0x84,0x9c,0x00,0x01,0x84,0xde,0x00,0x01,0x85,0x26,0x00,0x01,0x85,0x6e,0x00,0x01,0x85,0xb8,0x00,0x01,0x86,0x00,0x00,0x01,0x86,0x48,0x00,0x01,0x86,0x90,0x00,0x01,0x86,0xcc,0x00,0x01,0x87,0x0a,0x00,0x01,0x87,0x4c,0x00,0x01,0x87,0x8e,0x00,0x01,0x87,0xce, +0x00,0x01,0x88,0x0e,0x00,0x01,0x88,0x50,0x00,0x01,0x88,0x92,0x00,0x01,0x88,0xd8,0x00,0x01,0x89,0x1e,0x00,0x01,0x89,0x68,0x00,0x01,0x89,0xb2,0x00,0x01,0x89,0xfc,0x00,0x01,0x8a,0x46,0x00,0x01,0x8a,0x90,0x00,0x01,0x8a,0xda,0x00,0x01,0x8b,0x18,0x00,0x01,0x8b,0x58,0x00,0x01,0x8b,0x9c,0x00,0x01,0x8b,0xe0,0x00,0x01,0x8c,0x22, +0x00,0x01,0x8c,0x64,0x00,0x01,0x8c,0xa8,0x00,0x01,0x8c,0xec,0x00,0x01,0x8d,0x32,0x00,0x01,0x8d,0x78,0x00,0x01,0x8d,0xc2,0x00,0x01,0x8e,0x0c,0x00,0x01,0x8e,0x56,0x00,0x01,0x8e,0x9e,0x00,0x01,0x8e,0xe6,0x00,0x01,0x8f,0x2e,0x00,0x01,0x8f,0x5e,0x00,0x01,0x8f,0x8e,0x00,0x01,0x8f,0xca,0x00,0x01,0x8f,0xee,0x00,0x01,0x90,0x28, +0x00,0x01,0x90,0x56,0x00,0x01,0x90,0x92,0x00,0x01,0x90,0xc0,0x00,0x01,0x90,0xee,0x00,0x01,0x91,0x1e,0x00,0x01,0x91,0x4e,0x00,0x01,0x91,0x74,0x00,0x01,0x91,0xca,0x00,0x01,0x92,0x1c,0x00,0x01,0x92,0x78,0x00,0x01,0x92,0xc2,0x00,0x01,0x93,0x64,0x00,0x01,0x93,0xa4,0x00,0x01,0x93,0xcc,0x00,0x01,0x94,0x0a,0x00,0x01,0x94,0x36, +0x00,0x01,0x94,0x76,0x00,0x01,0x94,0xa8,0x00,0x01,0x94,0xda,0x00,0x01,0x95,0x0c,0x00,0x01,0x95,0x3e,0x00,0x01,0x95,0x64,0x00,0x01,0x95,0xd2,0x00,0x01,0x96,0x4a,0x00,0x01,0x96,0xec,0x00,0x01,0x97,0x1c,0x00,0x01,0x97,0x4c,0x00,0x01,0x97,0x84,0x00,0x01,0x97,0xbc,0x00,0x01,0x97,0xec,0x00,0x01,0x98,0x24,0x00,0x01,0x98,0x52, +0x00,0x01,0x98,0x80,0x00,0x01,0x98,0xb0,0x00,0x01,0x98,0xe0,0x00,0x01,0x99,0x54,0x00,0x01,0x99,0xca,0x00,0x01,0x9a,0x6c,0x00,0x01,0x9a,0x9c,0x00,0x01,0x9a,0xcc,0x00,0x01,0x9b,0x02,0x00,0x01,0x9b,0x38,0x00,0x01,0x9b,0x66,0x00,0x01,0x9b,0x94,0x00,0x01,0x9b,0xc2,0x00,0x01,0x9b,0xf8,0x00,0x01,0x9c,0x26,0x00,0x01,0x9c,0x54, +0x00,0x01,0x9c,0x86,0x00,0x01,0x9c,0xb8,0x00,0x01,0x9c,0xea,0x00,0x01,0x9d,0x70,0x00,0x01,0x9d,0xf8,0x00,0x01,0x9e,0x24,0x00,0x01,0x9e,0x64,0x00,0x01,0x9e,0x8a,0x00,0x01,0x9e,0xc8,0x00,0x01,0x9e,0xf6,0x00,0x01,0x9f,0x34,0x00,0x01,0x9f,0x64,0x00,0x01,0x9f,0x94,0x00,0x01,0x9f,0xc6,0x00,0x01,0x9f,0xf8,0x00,0x01,0xa0,0x1e, +0x00,0x01,0xa0,0x4c,0x00,0x01,0xa0,0xa6,0x00,0x01,0xa0,0xde,0x00,0x01,0xa1,0x3c,0x00,0x01,0xa1,0x64,0x00,0x01,0xa1,0x8c,0x00,0x01,0xa1,0xdc,0x00,0x01,0xa2,0x16,0x00,0x01,0xa2,0x7c,0x00,0x01,0xa2,0xf0,0x00,0x01,0xa3,0x46,0x00,0x01,0xa3,0x7c,0x00,0x01,0xa3,0xa4,0x00,0x01,0xa3,0xe4,0x00,0x01,0xa4,0x3c,0x00,0x01,0xa4,0xb2, +0x00,0x01,0xa4,0xfc,0x00,0x01,0xa5,0x56,0x00,0x01,0xa5,0xb2,0x00,0x01,0xa6,0x0c,0x00,0x01,0xa6,0x68,0x00,0x01,0xa6,0x9a,0x00,0x01,0xa6,0xce,0x00,0x01,0xa7,0x1a,0x00,0x01,0xa7,0x6a,0x00,0x01,0xa7,0x9e,0x00,0x01,0xa7,0xdc,0x00,0x01,0xa8,0x2e,0x00,0x01,0xa8,0x72,0x00,0x01,0xa8,0xb6,0x00,0x01,0xa9,0x16,0x00,0x01,0xa9,0x28, +0x00,0x01,0xa9,0x64,0x00,0x01,0xa9,0xa2,0x00,0x01,0xaa,0x08,0x00,0x01,0xaa,0x1a,0x00,0x01,0xaa,0x82,0x00,0x01,0xaa,0x94,0x00,0x01,0xaa,0xa6,0x00,0x01,0xaa,0xd6,0x00,0x01,0xab,0x1c,0x00,0x01,0xab,0x9e,0x00,0x01,0xab,0xdc,0x00,0x01,0xac,0x1a,0x00,0x01,0xac,0x74,0x00,0x01,0xac,0x86,0x00,0x01,0xac,0xe6,0x00,0x01,0xac,0xf8, +0x00,0x01,0xad,0x20,0x00,0x01,0xad,0x32,0x00,0x01,0xad,0x90,0x00,0x01,0xad,0xb8,0x00,0x01,0xad,0xca,0x00,0x01,0xae,0x14,0x00,0x01,0xae,0x5e,0x00,0x01,0xae,0xb2,0x00,0x01,0xae,0xfa,0x00,0x01,0xaf,0x44,0x00,0x01,0xaf,0xd2,0x00,0x01,0xb0,0x0e,0x00,0x01,0xb0,0x6e,0x00,0x01,0xb0,0xb0,0x00,0x01,0xb0,0xda,0x00,0x01,0xb1,0x06, +0x00,0x01,0xb1,0x18,0x00,0x01,0xb1,0x78,0x00,0x01,0xb2,0x00,0x00,0x01,0xb2,0x50,0x00,0x01,0xb2,0x90,0x00,0x01,0xb2,0xc8,0x00,0x01,0xb3,0x10,0x00,0x01,0xb3,0x40,0x00,0x01,0xb3,0xcc,0x00,0x01,0xb4,0x80,0x00,0x01,0xb5,0x20,0x00,0x01,0xb5,0x80,0x00,0x01,0xb5,0xb8,0x00,0x01,0xb6,0x20,0x00,0x01,0xb6,0x66,0x00,0x01,0xb6,0xaa, +0x00,0x01,0xb7,0x62,0x00,0x01,0xb8,0x2c,0x00,0x01,0xb8,0xa2,0x00,0x01,0xb9,0x3a,0x00,0x01,0xb9,0xb0,0x00,0x01,0xba,0x48,0x00,0x01,0xba,0xba,0x00,0x01,0xbb,0x6e,0x00,0x01,0xbc,0x1e,0x00,0x01,0xbc,0xb8,0x00,0x01,0xbd,0x46,0x00,0x01,0xbd,0xba,0x00,0x01,0xbe,0x50,0x00,0x01,0xbf,0x0c,0x00,0x01,0xbf,0x6e,0x00,0x01,0xc0,0x20, +0x00,0x01,0xc0,0x94,0x00,0x01,0xc1,0x76,0x00,0x01,0xc1,0xfa,0x00,0x01,0xc2,0xa4,0x00,0x01,0xc2,0xec,0x00,0x01,0xc3,0x54,0x00,0x01,0xc3,0xd4,0x00,0x01,0xc4,0x50,0x00,0x01,0xc4,0xb8,0x00,0x01,0xc5,0x8a,0x00,0x01,0xc6,0x2a,0x00,0x01,0xc6,0xb6,0x00,0x01,0xc7,0x30,0x00,0x01,0xc7,0xd8,0x00,0x01,0xc8,0x88,0x00,0x01,0xc9,0x2e, +0x00,0x01,0xc9,0xcc,0x00,0x01,0xca,0x7a,0x00,0x01,0xcb,0x16,0x00,0x01,0xcb,0xe8,0x00,0x01,0xcc,0xae,0x00,0x01,0xcd,0x1e,0x00,0x01,0xcd,0xbc,0x00,0x01,0xce,0x56,0x00,0x01,0xce,0xc0,0x00,0x01,0xcf,0x4a,0x00,0x01,0xcf,0xb8,0x00,0x01,0xd0,0x62,0x00,0x01,0xd0,0xe0,0x00,0x01,0xd1,0x5c,0x00,0x01,0xd1,0xf0,0x00,0x01,0xd2,0x92, +0x00,0x01,0xd3,0x32,0x00,0x01,0xd3,0xd0,0x00,0x01,0xd4,0x6c,0x00,0x01,0xd4,0xfe,0x00,0x01,0xd5,0xc2,0x00,0x01,0xd6,0x8a,0x00,0x01,0xd7,0x26,0x00,0x01,0xd7,0xbc,0x00,0x01,0xd8,0x5c,0x00,0x01,0xd8,0xd6,0x00,0x01,0xd9,0x00,0x00,0x01,0xd9,0x4e,0x00,0x01,0xd9,0xe4,0x00,0x01,0xd9,0xf4,0x00,0x01,0xda,0x2a,0x00,0x01,0xda,0x60, +0x00,0x01,0xda,0x96,0x00,0x01,0xda,0xbe,0x00,0x01,0xda,0xe8,0x00,0x01,0xdb,0x00,0x00,0x01,0xdb,0x28,0x00,0x01,0xdb,0x52,0x00,0x01,0xdb,0x7c,0x00,0x01,0xdb,0xac,0x00,0x01,0xdb,0xd8,0x00,0x01,0xdc,0x06,0x00,0x01,0xdc,0x34,0x00,0x01,0xdc,0x62,0x00,0x01,0xdc,0x90,0x00,0x01,0xdc,0xbe,0x00,0x01,0xdc,0xec,0x00,0x01,0xdd,0x22, +0x00,0x01,0xdd,0x56,0x00,0x01,0xdd,0x8c,0x00,0x01,0xdd,0xc0,0x00,0x01,0xdd,0xfa,0x00,0x01,0xde,0x2e,0x00,0x01,0xde,0x66,0x00,0x01,0xde,0x9a,0x00,0x01,0xdf,0x3a,0x00,0x01,0xdf,0x72,0x00,0x01,0xdf,0xa6,0x00,0x01,0xdf,0xd8,0x00,0x01,0xe0,0x08,0x00,0x01,0xe0,0x38,0x00,0x01,0xe0,0x66,0x00,0x01,0xe1,0x38,0x00,0x01,0xe2,0x3a, +0x00,0x01,0xe2,0x68,0x00,0x01,0xe2,0x96,0x00,0x01,0xe2,0xc6,0x00,0x01,0xe2,0xf6,0x00,0x01,0xe3,0xd0,0x00,0x01,0xe4,0x92,0x00,0x01,0xe4,0xc0,0x00,0x01,0xe4,0xee,0x00,0x01,0xe5,0x1e,0x00,0x01,0xe5,0x4c,0x00,0x01,0xe5,0x7a,0x00,0x01,0xe5,0xa2,0x00,0x01,0xe5,0xca,0x00,0x01,0xe5,0xf2,0x00,0x01,0xe6,0x20,0x00,0x01,0xe6,0x4e, +0x00,0x01,0xe6,0xe0,0x00,0x01,0xe7,0x62,0x00,0x01,0xe7,0x92,0x00,0x01,0xe7,0xc2,0x00,0x01,0xe7,0xf6,0x00,0x01,0xe8,0x2a,0x00,0x01,0xe8,0x58,0x00,0x01,0xe8,0x84,0x00,0x01,0xe8,0xb8,0x00,0x01,0xe8,0xec,0x00,0x01,0xe9,0x1c,0x00,0x01,0xe9,0x4a,0x00,0x01,0xe9,0x7e,0x00,0x01,0xe9,0xb2,0x00,0x01,0xe9,0xe0,0x00,0x01,0xea,0x0e, +0x00,0x01,0xea,0x42,0x00,0x01,0xea,0x76,0x00,0x01,0xea,0xa4,0x00,0x01,0xea,0xd0,0x00,0x01,0xea,0xf4,0x00,0x01,0xeb,0x28,0x00,0x01,0xeb,0x4a,0x00,0x01,0xeb,0x78,0x00,0x01,0xeb,0xac,0x00,0x01,0xeb,0xe0,0x00,0x01,0xec,0x0e,0x00,0x01,0xec,0x3a,0x00,0x01,0xed,0x02,0x00,0x01,0xed,0xc2,0x00,0x01,0xed,0xf0,0x00,0x01,0xee,0x20, +0x00,0x01,0xee,0x90,0x00,0x01,0xef,0x72,0x00,0x01,0xf0,0x48,0x00,0x01,0xf0,0xb8,0x00,0x01,0xf1,0x2c,0x00,0x01,0xf1,0x5a,0x00,0x01,0xf1,0x88,0x00,0x01,0xf1,0xbe,0x00,0x01,0xf1,0xf2,0x00,0x01,0xf2,0x24,0x00,0x01,0xf2,0x54,0x00,0x01,0xf2,0x82,0x00,0x01,0xf2,0xb0,0x00,0x01,0xf2,0xe2,0x00,0x01,0xf3,0x12,0x00,0x01,0xf3,0x40, +0x00,0x01,0xf3,0x6e,0x00,0x01,0xf3,0xfa,0x00,0x01,0xf4,0x5a,0x00,0x01,0xf4,0xf6,0x00,0x01,0xf5,0x88,0x00,0x01,0xf6,0x10,0x00,0x01,0xf6,0xbe,0x00,0x01,0xf7,0x62,0x00,0x01,0xf8,0x06,0x00,0x01,0xf8,0xb4,0x00,0x01,0xf9,0x20,0x00,0x01,0xf9,0xea,0x00,0x01,0xfa,0x98,0x00,0x01,0xfb,0x46,0x00,0x01,0xfb,0xe6,0x00,0x01,0xfc,0xda, +0x00,0x01,0xfd,0x82,0x00,0x01,0xfe,0x2c,0x00,0x01,0xff,0x1e,0x00,0x01,0xff,0xce,0x00,0x02,0x00,0x5c,0x00,0x02,0x01,0x30,0x00,0x02,0x01,0x40,0x00,0x02,0x01,0xd4,0x00,0x02,0x02,0x46,0x00,0x02,0x02,0xdc,0x00,0x02,0x03,0x42,0x00,0x02,0x03,0xca,0x00,0x02,0x04,0x76,0x00,0x02,0x05,0x16,0x00,0x02,0x05,0x5e,0x00,0x02,0x05,0xbc, +0x00,0x02,0x06,0x66,0x00,0x02,0x07,0x04,0x00,0x02,0x07,0x58,0x00,0x02,0x08,0x0e,0x00,0x02,0x08,0xb2,0x00,0x02,0x09,0x5a,0x00,0x02,0x0a,0x22,0x00,0x02,0x0a,0xa8,0x00,0x02,0x0b,0x2c,0x00,0x02,0x0b,0x98,0x00,0x02,0x0c,0x2a,0x00,0x02,0x0c,0xd6,0x00,0x02,0x0d,0x8a,0x00,0x02,0x0e,0x44,0x00,0x02,0x0e,0x98,0x00,0x02,0x0e,0xec, +0x00,0x02,0x0f,0x68,0x00,0x02,0x0f,0xc2,0x00,0x02,0x10,0x3e,0x00,0x02,0x10,0x8a,0x00,0x02,0x10,0xd6,0x00,0x02,0x11,0x66,0x00,0x02,0x12,0x04,0x00,0x02,0x12,0xda,0x00,0x02,0x13,0x4c,0x00,0x02,0x13,0xf6,0x00,0x02,0x14,0x5c,0x00,0x02,0x15,0x32,0x00,0x02,0x15,0xa6,0x00,0x02,0x16,0x1a,0x00,0x02,0x16,0xc4,0x00,0x02,0x17,0x56, +0x00,0x02,0x17,0xce,0x00,0x02,0x18,0x20,0x00,0x02,0x18,0xbe,0x00,0x02,0x19,0x36,0x00,0x02,0x19,0xa4,0x00,0x02,0x1a,0x28,0x00,0x02,0x1b,0x06,0x00,0x02,0x1b,0x9c,0x00,0x02,0x1c,0xbe,0x00,0x02,0x1d,0x38,0x00,0x02,0x1d,0xba,0x00,0x02,0x1e,0x3a,0x00,0x02,0x1e,0xb0,0x00,0x02,0x1f,0x6c,0x00,0x02,0x20,0x02,0x00,0x02,0x20,0xb2, +0x00,0x02,0x21,0x80,0x00,0x02,0x21,0xe4,0x00,0x02,0x22,0xca,0x00,0x02,0x23,0x2e,0x00,0x02,0x23,0x66,0x00,0x02,0x24,0x14,0x00,0x02,0x24,0xc4,0x00,0x02,0x25,0x72,0x00,0x02,0x26,0x3a,0x00,0x02,0x27,0x50,0x00,0x02,0x28,0xca,0x00,0x02,0x29,0xa0,0x00,0x02,0x2a,0x68,0x00,0x02,0x2b,0x74,0x00,0x02,0x2c,0x4c,0x00,0x02,0x2c,0xf4, +0x00,0x02,0x2d,0x56,0x00,0x02,0x2e,0x36,0x00,0x02,0x2e,0xac,0x00,0x02,0x2f,0x56,0x00,0x02,0x30,0x5e,0x00,0x02,0x31,0x02,0x00,0x02,0x31,0x32,0x00,0x02,0x31,0x66,0x00,0x02,0x32,0x1e,0x00,0x02,0x32,0xfe,0x00,0x02,0x34,0x18,0x00,0x02,0x34,0xb6,0x00,0x02,0x35,0x4e,0x00,0x02,0x36,0x10,0x00,0x02,0x36,0xc8,0x00,0x02,0x37,0x3e, +0x00,0x02,0x37,0xa0,0x00,0x02,0x38,0x02,0x00,0x02,0x38,0xd0,0x00,0x02,0x39,0xc4,0x00,0x02,0x3a,0xa8,0x00,0x02,0x3b,0xba,0x00,0x02,0x3c,0xc8,0x00,0x02,0x3d,0x58,0x00,0x02,0x3d,0xea,0x00,0x02,0x3e,0xb2,0x00,0x02,0x40,0x00,0x00,0x02,0x40,0xd4,0x00,0x02,0x41,0xb8,0x00,0x02,0x42,0xf4,0x00,0x02,0x43,0xd0,0x00,0x02,0x44,0xce, +0x00,0x02,0x45,0xd2,0x00,0x02,0x46,0x4c,0x00,0x02,0x46,0xd6,0x00,0x02,0x47,0xba,0x00,0x02,0x48,0x70,0x00,0x02,0x48,0x80,0x00,0x02,0x48,0x90,0x00,0x02,0x48,0xa0,0x00,0x02,0x49,0x1c,0x00,0x02,0x49,0x96,0x00,0x02,0x4a,0x52,0x00,0x02,0x4a,0xf6,0x00,0x02,0x4b,0x92,0x00,0x02,0x4c,0x2c,0x00,0x02,0x4c,0xfa,0x00,0x02,0x4d,0xc8, +0x00,0x02,0x4e,0x80,0x00,0x02,0x4f,0x38,0x00,0x02,0x50,0x42,0x00,0x02,0x51,0x58,0x00,0x02,0x52,0x78,0x00,0x02,0x53,0x64,0x00,0x02,0x54,0x86,0x00,0x02,0x55,0xb0,0x00,0x02,0x56,0xe0,0x00,0x02,0x58,0x0e,0x00,0x02,0x58,0xa4,0x00,0x02,0x59,0x40,0x00,0x02,0x5a,0x18,0x00,0x02,0x5a,0xee,0x00,0x02,0x5b,0x6c,0x00,0x02,0x5b,0xec, +0x00,0x02,0x5c,0x20,0x00,0x02,0x5c,0x54,0x00,0x02,0x5d,0x9c,0x00,0x02,0x5e,0xbc,0x00,0x02,0x5f,0xa4,0x00,0x02,0x60,0x72,0x00,0x02,0x61,0xbc,0x00,0x02,0x62,0xf2,0x00,0x02,0x63,0x14,0x00,0x02,0x63,0x44,0x00,0x02,0x63,0xca,0x00,0x02,0x64,0x42,0x00,0x02,0x65,0x62,0x00,0x02,0x65,0xb6,0x00,0x02,0x66,0x08,0x00,0x02,0x66,0x1a, +0x00,0x02,0x66,0x2c,0x00,0x02,0x68,0x1a,0x00,0x02,0x69,0x42,0x00,0x02,0x69,0xda,0x00,0x02,0x6a,0x6e,0x00,0x02,0x6b,0x40,0x00,0x02,0x6c,0x2e,0x00,0x02,0x6c,0xc4,0x00,0x02,0x6d,0x56,0x00,0x02,0x6e,0x58,0x00,0x02,0x6f,0x4a,0x00,0x02,0x6f,0xee,0x00,0x02,0x70,0x82,0x00,0x02,0x71,0x0c,0x00,0x02,0x71,0x8a,0x00,0x02,0x71,0xfc, +0x00,0x02,0x72,0x6e,0x00,0x02,0x73,0x12,0x00,0x02,0x73,0xb0,0x00,0x02,0x74,0xda,0x00,0x02,0x75,0xf8,0x00,0x02,0x76,0xc0,0x00,0x02,0x77,0x78,0x00,0x02,0x77,0xea,0x00,0x02,0x78,0x5c,0x00,0x02,0x78,0xe8,0x00,0x02,0x79,0x74,0x00,0x02,0x79,0xf6,0x00,0x02,0x7a,0x76,0x00,0x02,0x7b,0x4a,0x00,0x02,0x7c,0x1e,0x00,0x02,0x7c,0x34, +0x00,0x02,0x7c,0x4a,0x00,0x02,0x7c,0x5a,0x00,0x02,0x7c,0x88,0x00,0x02,0x7c,0xb6,0x00,0x02,0x7d,0x56,0x00,0x02,0x7d,0xf2,0x00,0x02,0x7e,0x84,0x00,0x02,0x7f,0x12,0x00,0x02,0x7f,0x8c,0x00,0x02,0x80,0x0a,0x00,0x02,0x80,0x2c,0x00,0x02,0x80,0x4e,0x00,0x02,0x80,0x82,0x00,0x02,0x80,0xb2,0x00,0x02,0x80,0xc2,0x00,0x02,0x80,0xd2, +0x00,0x02,0x81,0x00,0x00,0x02,0x81,0x2e,0x00,0x02,0x81,0xd0,0x00,0x02,0x81,0xe0,0x00,0x02,0x82,0x14,0x00,0x02,0x82,0x44,0x00,0x02,0x82,0x76,0x00,0x02,0x82,0xaa,0x00,0x02,0x82,0xde,0x00,0x02,0x83,0x10,0x00,0x02,0x83,0x9c,0x00,0x02,0x83,0xac,0x00,0x02,0x83,0xda,0x00,0x02,0x84,0x08,0x00,0x02,0x84,0x3a,0x00,0x02,0x84,0x6c, +0x00,0x02,0x84,0x9e,0x00,0x02,0x84,0xd0,0x00,0x02,0x85,0x02,0x00,0x02,0x85,0x34,0x00,0x02,0x85,0x68,0x00,0x02,0x85,0x9a,0x00,0x02,0x85,0xc8,0x00,0x02,0x85,0xf6,0x00,0x02,0x86,0x28,0x00,0x02,0x86,0x58,0x00,0x02,0x86,0x8a,0x00,0x02,0x86,0xbc,0x00,0x02,0x86,0xee,0x00,0x02,0x87,0x22,0x00,0x02,0x87,0x54,0x00,0x02,0x87,0x88, +0x00,0x02,0x87,0xee,0x00,0x02,0x87,0xfe,0x00,0x02,0x88,0xa6,0x00,0x02,0x89,0x5c,0x00,0x02,0x8a,0x18,0x00,0x02,0x8a,0xcc,0x00,0x02,0x8b,0x7a,0x00,0x02,0x8c,0x22,0x00,0x02,0x8c,0xba,0x00,0x02,0x8d,0x5a,0x00,0x02,0x8d,0xea,0x00,0x02,0x8e,0x7c,0x00,0x02,0x8f,0x20,0x00,0x02,0x8f,0xb8,0x00,0x02,0x90,0x38,0x00,0x02,0x90,0xb6, +0x00,0x02,0x91,0x46,0x00,0x02,0x92,0x10,0x00,0x02,0x92,0xb0,0x00,0x02,0x93,0x1e,0x00,0x02,0x93,0xa6,0x00,0x02,0x94,0x08,0x00,0x02,0x94,0xc8,0x00,0x02,0x95,0x7e,0x00,0x02,0x95,0xec,0x00,0x02,0x96,0x5c,0x00,0x02,0x96,0xc6,0x00,0x02,0x97,0x34,0x00,0x02,0x97,0xc8,0x00,0x02,0x98,0x34,0x00,0x02,0x98,0xdc,0x00,0x02,0x99,0x40, +0x00,0x02,0x99,0xb8,0x00,0x02,0x9a,0x48,0x00,0x02,0x9a,0xb0,0x00,0x02,0x9a,0xda,0x00,0x02,0x9b,0x16,0x00,0x02,0x9b,0x66,0x00,0x02,0x9b,0xd8,0x00,0x02,0x9c,0x74,0x00,0x02,0x9c,0xec,0x00,0x02,0x9d,0x4e,0x00,0x02,0x9d,0xb2,0x00,0x02,0x9e,0x36,0x00,0x02,0x9e,0xd0,0x00,0x02,0x9f,0x4c,0x00,0x02,0x9f,0xbe,0x00,0x02,0x9f,0xf4, +0x00,0x02,0xa0,0x48,0x00,0x02,0xa0,0x7c,0x00,0x02,0xa0,0x8c,0x00,0x02,0xa0,0xbe,0x00,0x02,0xa1,0x0a,0x00,0x02,0xa1,0x56,0x00,0x02,0xa1,0xca,0x00,0x02,0xa2,0x40,0x00,0x02,0xa2,0x9e,0x00,0x02,0xa2,0xfc,0x00,0x02,0xa3,0x46,0x00,0x02,0xa3,0x94,0x00,0x02,0xa3,0xc0,0x00,0x02,0xa3,0xd0,0x00,0x02,0xa3,0xe0,0x00,0x02,0xa4,0x10, +0x00,0x02,0xa4,0x3e,0x00,0x02,0xa4,0x50,0x00,0x02,0xa4,0x62,0x00,0x02,0xa4,0xaa,0x00,0x02,0xa4,0xda,0x00,0x02,0xa4,0xec,0x00,0x02,0xa4,0xfe,0x00,0x02,0xa5,0x42,0x00,0x02,0xa5,0x84,0x00,0x02,0xa5,0xd6,0x00,0x02,0xa6,0x02,0x00,0x02,0xa6,0x70,0x00,0x02,0xa6,0xee,0x00,0x02,0xa7,0x96,0x00,0x02,0xa7,0xc6,0x00,0x02,0xa8,0x7a, +0x00,0x02,0xa8,0xdc,0x00,0x02,0xa8,0xec,0x00,0x02,0xa9,0x24,0x00,0x02,0xa9,0x66,0x00,0x02,0xa9,0xa8,0x00,0x02,0xa9,0xea,0x00,0x02,0xaa,0x22,0x00,0x02,0xaa,0x52,0x00,0x02,0xaa,0x92,0x00,0x02,0xaa,0xd2,0x00,0x02,0xab,0x1c,0x00,0x02,0xab,0x7a,0x00,0x02,0xab,0xe4,0x00,0x02,0xac,0x3e,0x00,0x02,0xac,0xb6,0x00,0x02,0xad,0x3c, +0x00,0x02,0xad,0xac,0x00,0x02,0xae,0x0e,0x00,0x02,0xae,0x94,0x00,0x02,0xae,0xf4,0x00,0x02,0xaf,0x5e,0x00,0x02,0xaf,0xd2,0x00,0x02,0xb0,0x42,0x00,0x02,0xb0,0xa0,0x00,0x02,0xb1,0x46,0x00,0x02,0xb1,0xde,0x00,0x02,0xb2,0x4a,0x00,0x02,0xb2,0xd8,0x00,0x02,0xb3,0x32,0x00,0x02,0xb3,0xa0,0x00,0x02,0xb4,0x4a,0x00,0x02,0xb4,0xf0, +0x00,0x02,0xb5,0x86,0x00,0x02,0xb5,0xf6,0x00,0x02,0xb6,0x78,0x00,0x02,0xb6,0xdc,0x00,0x02,0xb7,0x88,0x00,0x02,0xb8,0x46,0x00,0x02,0xb8,0xf2,0x00,0x02,0xb9,0x84,0x00,0x02,0xb9,0xe2,0x00,0x02,0xba,0x4e,0x00,0x02,0xba,0xa4,0x00,0x02,0xbb,0x26,0x00,0x02,0xbb,0xa4,0x00,0x02,0xbc,0x2a,0x00,0x02,0xbc,0xb6,0x00,0x02,0xbd,0x10, +0x00,0x02,0xbd,0x7c,0x00,0x02,0xbd,0xec,0x00,0x02,0xbe,0x5a,0x00,0x02,0xbe,0xca,0x00,0x02,0xbf,0x4e,0x00,0x02,0xbf,0xde,0x00,0x02,0xc0,0x44,0x00,0x02,0xc0,0xbe,0x00,0x02,0xc1,0x3a,0x00,0x02,0xc1,0xb2,0x00,0x02,0xc2,0x58,0x00,0x02,0xc2,0xf0,0x00,0x02,0xc3,0x80,0x00,0x02,0xc3,0xde,0x00,0x02,0xc4,0x7c,0x00,0x02,0xc4,0xf8, +0x00,0x02,0xc5,0x8a,0x00,0x02,0xc6,0x2e,0x00,0x02,0xc6,0xd8,0x00,0x02,0xc7,0x70,0x00,0x02,0xc7,0xcc,0x00,0x02,0xc8,0x20,0x00,0x02,0xc8,0x88,0x00,0x02,0xc9,0x2e,0x00,0x02,0xc9,0xd8,0x00,0x02,0xca,0xa2,0x00,0x02,0xcb,0x48,0x00,0x02,0xcb,0xaa,0x00,0x02,0xcc,0x0a,0x00,0x02,0xcc,0x98,0x00,0x02,0xcd,0x1e,0x00,0x02,0xcd,0xac, +0x00,0x02,0xce,0x0c,0x00,0x02,0xce,0x70,0x00,0x02,0xce,0xda,0x00,0x02,0xcf,0x42,0x00,0x02,0xcf,0xaa,0x00,0x02,0xd0,0x22,0x00,0x02,0xd0,0xaa,0x00,0x02,0xd1,0x3e,0x00,0x02,0xd1,0xaa,0x00,0x02,0xd2,0x12,0x00,0x02,0xd2,0x76,0x00,0x02,0xd3,0x22,0x00,0x02,0xd3,0xe2,0x00,0x02,0xd4,0x90,0x00,0x02,0xd5,0x1e,0x00,0x02,0xd5,0x7c, +0x00,0x02,0xd5,0xe8,0x00,0x02,0xd6,0x58,0x00,0x02,0xd6,0xfc,0x00,0x02,0xd7,0xa2,0x00,0x02,0xd8,0x66,0x00,0x02,0xd9,0x08,0x00,0x02,0xd9,0x6c,0x00,0x02,0xd9,0xfc,0x00,0x02,0xda,0x6e,0x00,0x02,0xdb,0x06,0x00,0x02,0xdb,0x84,0x00,0x02,0xdb,0xfe,0x00,0x02,0xdc,0x6a,0x00,0x02,0xdc,0xf8,0x00,0x02,0xdd,0x54,0x00,0x02,0xdd,0xb2, +0x00,0x02,0xde,0x38,0x00,0x02,0xde,0xb4,0x00,0x02,0xdf,0x1c,0x00,0x02,0xdf,0x80,0x00,0x02,0xdf,0xd4,0x00,0x02,0xe0,0x42,0x00,0x02,0xe0,0xaa,0x00,0x02,0xe1,0x28,0x00,0x02,0xe1,0x9e,0x00,0x02,0xe2,0x18,0x00,0x02,0xe2,0x98,0x00,0x02,0xe2,0xf4,0x00,0x02,0xe3,0x5a,0x00,0x02,0xe3,0xbe,0x00,0x02,0xe4,0x5e,0x00,0x02,0xe5,0x00, +0x00,0x02,0xe5,0xbe,0x00,0x02,0xe6,0x6e,0x00,0x02,0xe6,0xca,0x00,0x02,0xe7,0x42,0x00,0x02,0xe7,0xa0,0x00,0x02,0xe8,0x2a,0x00,0x02,0xe8,0xc2,0x00,0x02,0xe9,0x50,0x00,0x02,0xe9,0xb6,0x00,0x02,0xea,0x14,0x00,0x02,0xea,0xa2,0x00,0x02,0xeb,0x14,0x00,0x02,0xeb,0xae,0x00,0x02,0xec,0x42,0x00,0x02,0xec,0xb2,0x00,0x02,0xed,0x22, +0x00,0x02,0xed,0x9a,0x00,0x02,0xed,0xf8,0x00,0x02,0xee,0x58,0x00,0x02,0xee,0xd2,0x00,0x02,0xef,0x2c,0x00,0x02,0xef,0x8c,0x00,0x02,0xef,0xe6,0x00,0x02,0xf0,0x42,0x00,0x02,0xf0,0xaa,0x00,0x02,0xf0,0xaa,0x00,0x02,0xf0,0xfa,0x00,0x02,0xf1,0x4e,0x00,0x02,0xf1,0xa0,0x00,0x02,0xf1,0xf0,0x00,0x02,0xf3,0xf0,0x00,0x02,0xf5,0x5c, +0x00,0x02,0xf7,0x10,0x00,0x02,0xf8,0xba,0x00,0x02,0xf9,0x3e,0x00,0x02,0xf9,0xde,0x00,0x02,0xfa,0x1a,0x00,0x02,0xfa,0x56,0x00,0x02,0xfa,0x8c,0x00,0x02,0xfa,0xc2,0x00,0x02,0xfb,0x3c,0x00,0x02,0xfb,0x4e,0x00,0x02,0xfb,0x60,0x00,0x02,0xfb,0x72,0x00,0x02,0xfb,0x84,0x00,0x02,0xfb,0x96,0x00,0x02,0xfb,0xd2,0x00,0x02,0xfc,0x0a, +0x00,0x02,0xfc,0x44,0x00,0x02,0xfc,0x7c,0x00,0x02,0xfc,0xd2,0x00,0x02,0xfd,0x1a,0x00,0x02,0xfd,0x92,0x00,0x02,0xfd,0xd0,0x00,0x02,0xfe,0x1a,0x00,0x02,0xfe,0x9a,0x00,0x02,0xff,0x72,0x00,0x02,0xff,0x84,0x00,0x02,0xff,0x96,0x00,0x03,0x00,0x08,0x00,0x03,0x00,0x54,0x00,0x03,0x00,0xa8,0x00,0x03,0x00,0xdc,0x00,0x03,0x01,0x10, +0x00,0x03,0x01,0x20,0x00,0x03,0x01,0x30,0x00,0x03,0x01,0xb0,0x00,0x03,0x02,0x5c,0x00,0x03,0x03,0x6e,0x00,0x03,0x04,0x24,0x00,0x03,0x04,0x34,0x00,0x03,0x04,0x90,0x00,0x03,0x05,0x1e,0x00,0x03,0x05,0x80,0x00,0x03,0x06,0x20,0x00,0x03,0x06,0x7c,0x00,0x03,0x06,0xc6,0x00,0x03,0x06,0xd6,0x00,0x03,0x07,0x50,0x00,0x03,0x07,0x60, +0x00,0x03,0x07,0x70,0x00,0x03,0x07,0x80,0x00,0x03,0x07,0xfa,0x00,0x03,0x08,0x6e,0x00,0x03,0x08,0xde,0x00,0x03,0x09,0xd6,0x00,0x03,0x0a,0xc6,0x00,0x03,0x0b,0x84,0x00,0x03,0x0b,0xd6,0x00,0x03,0x0c,0x28,0x00,0x03,0x0c,0x8e,0x00,0x03,0x0d,0x20,0x00,0x03,0x0d,0xac,0x00,0x03,0x0d,0xbc,0x00,0x03,0x0e,0x10,0x00,0x03,0x0e,0x76, +0x00,0x03,0x0f,0x3e,0x00,0x03,0x0f,0xda,0x00,0x03,0x0f,0xea,0x00,0x03,0x0f,0xfa,0x00,0x03,0x10,0x0a,0x00,0x03,0x10,0x94,0x00,0x03,0x11,0x44,0x00,0x03,0x11,0xd4,0x00,0x03,0x11,0xe4,0x00,0x03,0x12,0x30,0x00,0x03,0x12,0x40,0x00,0x03,0x12,0x50,0x00,0x03,0x12,0xe6,0x00,0x03,0x13,0x4e,0x00,0x03,0x13,0xe0,0x00,0x03,0x14,0xa2, +0x00,0x03,0x15,0x4c,0x00,0x03,0x16,0x12,0x00,0x03,0x16,0x7c,0x00,0x03,0x16,0xf0,0x00,0x03,0x17,0x62,0x00,0x03,0x18,0x00,0x00,0x03,0x18,0x7a,0x00,0x03,0x18,0xaa,0x00,0x03,0x18,0xfc,0x00,0x03,0x19,0x5e,0x00,0x03,0x19,0xa2,0x00,0x03,0x1a,0x28,0x00,0x03,0x1a,0x96,0x00,0x03,0x1b,0x04,0x00,0x03,0x1b,0x7e,0x00,0x03,0x1c,0x4c, +0x00,0x03,0x1c,0xbc,0x00,0x03,0x1d,0x50,0x00,0x03,0x1d,0xa2,0x00,0x03,0x1e,0x02,0x00,0x03,0x1e,0x7c,0x00,0x03,0x1f,0x36,0x00,0x03,0x1f,0xf0,0x00,0x03,0x20,0x84,0x00,0x03,0x21,0xb8,0x00,0x03,0x22,0x4c,0x00,0x03,0x22,0xe2,0x00,0x03,0x23,0x7c,0x00,0x03,0x24,0x12,0x00,0x03,0x24,0xc4,0x00,0x03,0x25,0x6e,0x00,0x03,0x26,0x24, +0x00,0x03,0x26,0x74,0x00,0x03,0x26,0xd6,0x00,0x03,0x27,0x86,0x00,0x03,0x28,0x14,0x00,0x03,0x28,0x8e,0x00,0x03,0x29,0x00,0x00,0x03,0x29,0x58,0x00,0x03,0x29,0xb0,0x00,0x03,0x2a,0x42,0x00,0x03,0x2a,0xc4,0x00,0x03,0x2b,0x34,0x00,0x03,0x2b,0x9e,0x00,0x03,0x2c,0x5c,0x00,0x03,0x2c,0xac,0x00,0x03,0x2d,0x4c,0x00,0x03,0x2e,0x1c, +0x00,0x03,0x2e,0x96,0x00,0x03,0x2f,0x46,0x00,0x03,0x30,0x04,0x00,0x03,0x30,0xa0,0x00,0x03,0x30,0xb2,0x00,0x03,0x30,0xc4,0x00,0x03,0x30,0xd6,0x00,0x03,0x30,0xe8,0x00,0x03,0x30,0xfa,0x00,0x03,0x31,0x0c,0x00,0x03,0x31,0x1e,0x00,0x03,0x31,0x30,0x00,0x03,0x31,0x42,0x00,0x03,0x31,0x8a,0x00,0x03,0x31,0xdc,0x00,0x03,0x32,0x5c, +0x00,0x03,0x32,0xb4,0x00,0x03,0x34,0x10,0x00,0x03,0x34,0xde,0x00,0x03,0x36,0x48,0x00,0x03,0x37,0x56,0x00,0x03,0x38,0x70,0x00,0x03,0x39,0xa2,0x00,0x03,0x3b,0x12,0x00,0x03,0x3d,0x2e,0x00,0x03,0x3d,0xe0,0x00,0x03,0x3e,0xd2,0x00,0x03,0x3f,0x6e,0x00,0x03,0x40,0x32,0x00,0x03,0x42,0x44,0x00,0x03,0x43,0x82,0x00,0x03,0x44,0x9e, +0x00,0x03,0x45,0xc8,0x00,0x03,0x46,0xb0,0x00,0x03,0x47,0x98,0x00,0x03,0x47,0xd0,0x00,0x03,0x47,0xe6,0x00,0x03,0x47,0xfc,0x00,0x03,0x48,0x14,0x00,0x03,0x48,0x2c,0x00,0x03,0x48,0x42,0x00,0x03,0x49,0x44,0x00,0x03,0x49,0xbe,0x00,0x03,0x4a,0x3a,0x00,0x03,0x4a,0x4a,0x00,0x03,0x4a,0x90,0x00,0x03,0x4b,0x58,0x00,0x03,0x4b,0x92, +0x00,0x03,0x4b,0xa4,0x00,0x03,0x4b,0xce,0x00,0x03,0x4c,0x4c,0x00,0x03,0x4c,0x7c,0x00,0x03,0x4c,0xac,0x00,0x03,0x4c,0xfe,0x00,0x03,0x4d,0x50,0x00,0x03,0x4d,0x7a,0x00,0x03,0x4d,0xa6,0x00,0x03,0x4d,0xca,0x00,0x03,0x4f,0x2c,0x00,0x03,0x50,0x20,0x00,0x03,0x50,0x4c,0x00,0x03,0x50,0x78,0x00,0x03,0x50,0xa4,0x00,0x03,0x50,0xba, +0x00,0x03,0x50,0xe8,0x00,0x03,0x51,0x16,0x00,0x03,0x51,0xcc,0x00,0x03,0x52,0x38,0x00,0x03,0x53,0x38,0x00,0x03,0x53,0x56,0x00,0x03,0x53,0x7e,0x00,0x03,0x53,0xae,0x00,0x03,0x53,0xde,0x00,0x03,0x54,0xb0,0x00,0x03,0x55,0x42,0x00,0x03,0x56,0x1c,0x00,0x03,0x56,0x34,0x00,0x03,0x56,0x58,0x00,0x03,0x56,0x7c,0x00,0x03,0x56,0xba, +0x00,0x03,0x56,0xde,0x00,0x03,0x57,0x02,0x00,0x03,0x57,0x26,0x00,0x03,0x57,0x4a,0x00,0x03,0x57,0x62,0x00,0x03,0x57,0x86,0x00,0x03,0x57,0xba,0x00,0x03,0x57,0xf8,0x00,0x03,0x58,0x2c,0x00,0x03,0x58,0x50,0x00,0x03,0x58,0x74,0x00,0x03,0x58,0x98,0x00,0x03,0x58,0xbc,0x00,0x03,0x58,0xe0,0x00,0x03,0x59,0x04,0x00,0x03,0x59,0x28, +0x00,0x03,0x59,0x4c,0x00,0x03,0x59,0x80,0x00,0x03,0x59,0xa4,0x00,0x03,0x59,0xc8,0x00,0x03,0x5a,0x4e,0x00,0x03,0x5a,0x72,0x00,0x03,0x5b,0x30,0x00,0x03,0x5b,0xca,0x00,0x03,0x5c,0x42,0x00,0x03,0x5d,0x0e,0x00,0x03,0x5d,0xec,0x00,0x03,0x5e,0x96,0x00,0x03,0x5f,0x0a,0x00,0x03,0x5f,0x92,0x00,0x03,0x5f,0xa2,0x00,0x03,0x60,0x0e, +0x00,0x03,0x60,0x94,0x00,0x03,0x60,0xe0,0x00,0x03,0x61,0x3a,0x00,0x03,0x61,0xba,0x00,0x03,0x62,0x74,0x00,0x03,0x62,0xbc,0x00,0x03,0x63,0x28,0x00,0x03,0x63,0x6a,0x00,0x03,0x64,0x3c,0x00,0x03,0x64,0xea,0x00,0x03,0x65,0x74,0x00,0x03,0x66,0x00,0x00,0x03,0x66,0x6c,0x00,0x03,0x67,0x10,0x00,0x03,0x67,0xe6,0x00,0x03,0x68,0xae, +0x00,0x03,0x69,0x20,0x00,0x03,0x69,0xc6,0x00,0x03,0x6a,0x72,0x00,0x03,0x6b,0x10,0x00,0x03,0x6b,0x6a,0x00,0x03,0x6b,0xe4,0x00,0x03,0x6c,0x30,0x00,0x03,0x6c,0x92,0x00,0x03,0x6d,0x26,0x00,0x03,0x6d,0xda,0x00,0x03,0x6e,0x74,0x00,0x03,0x6f,0x0a,0x00,0x03,0x6f,0x8e,0x00,0x03,0x70,0x12,0x00,0x03,0x70,0xd6,0x00,0x03,0x71,0x3c, +0x00,0x03,0x71,0x66,0x00,0x03,0x71,0x78,0x00,0x03,0x71,0x8a,0x00,0x03,0x71,0x9c,0x00,0x03,0x71,0xae,0x00,0x03,0x71,0xc0,0x00,0x03,0x72,0x78,0x00,0x03,0x73,0x84,0x00,0x03,0x74,0xd6,0x00,0x03,0x75,0x98,0x00,0x03,0x75,0xe6,0x00,0x03,0x76,0x26,0x00,0x03,0x76,0x64,0x00,0x03,0x76,0xa2,0x00,0x03,0x76,0xe0,0x00,0x03,0x77,0x42, +0x00,0x03,0x77,0x6a,0x00,0x03,0x77,0xb6,0x00,0x03,0x77,0xe8,0x00,0x03,0x78,0x1a,0x00,0x03,0x78,0x4c,0x00,0x03,0x78,0x7e,0x00,0x03,0x78,0xbc,0x00,0x03,0x78,0xfa,0x00,0x03,0x79,0x38,0x00,0x03,0x79,0x76,0x00,0x03,0x79,0xa8,0x00,0x03,0x79,0xda,0x00,0x03,0x7a,0x0c,0x00,0x03,0x7a,0x3e,0x00,0x03,0x7a,0x7c,0x00,0x03,0x7a,0xba, +0x00,0x03,0x7a,0xf8,0x00,0x03,0x7b,0x36,0x00,0x03,0x7b,0x68,0x00,0x03,0x7b,0x9a,0x00,0x03,0x7b,0xcc,0x00,0x03,0x7b,0xfe,0x00,0x03,0x7c,0x3c,0x00,0x03,0x7c,0x7a,0x00,0x03,0x7c,0xb8,0x00,0x03,0x7c,0xf6,0x00,0x03,0x7d,0x4a,0x00,0x03,0x7d,0x9e,0x00,0x03,0x7d,0xfc,0x00,0x03,0x7e,0x5a,0x00,0x03,0x7e,0xb0,0x00,0x03,0x7f,0x06, +0x00,0x03,0x7f,0x62,0x00,0x03,0x7f,0xbe,0x00,0x03,0x80,0x70,0x00,0x03,0x81,0x08,0x00,0x03,0x81,0xfa,0x00,0x03,0x83,0x00,0x00,0x03,0x83,0xe8,0x00,0x03,0x84,0xea,0x00,0x03,0x85,0xe4,0x00,0x03,0x86,0x8c,0x00,0x03,0x88,0x02,0x00,0x03,0x88,0xfc,0x00,0x03,0x89,0xec,0x00,0x03,0x8a,0x50,0x00,0x03,0x8b,0x26,0x00,0x03,0x8c,0x02, +0x00,0x03,0x8c,0x46,0x00,0x03,0x8c,0x7c,0x00,0x03,0x8c,0xc4,0x00,0x03,0x8d,0x0a,0x00,0x03,0x8d,0x50,0x00,0x03,0x8d,0xa6,0x00,0x03,0x8d,0xb8,0x00,0x03,0x8d,0xca,0x00,0x03,0x8d,0xdc,0x00,0x03,0x8d,0xee,0x00,0x03,0x8e,0x00,0x00,0x03,0x8e,0x12,0x00,0x03,0x8e,0x24,0x00,0x03,0x8e,0x36,0x00,0x03,0x8e,0x48,0x00,0x03,0x8e,0x5a, +0x00,0x03,0x8e,0x6c,0x00,0x03,0x8e,0x7e,0x00,0x03,0x8e,0x90,0x00,0x03,0x8e,0xa2,0x00,0x03,0x8e,0xb4,0x00,0x03,0x8e,0xd6,0x00,0x03,0x8e,0xf6,0x00,0x03,0x8f,0x16,0x00,0x03,0x8f,0x36,0x00,0x03,0x8f,0x58,0x00,0x03,0x8f,0x78,0x00,0x03,0x8f,0x9a,0x00,0x03,0x8f,0xba,0x00,0x03,0x8f,0xe0,0x00,0x03,0x90,0x02,0x00,0x03,0x90,0x22, +0x00,0x03,0x90,0x42,0x00,0x03,0x90,0x64,0x00,0x03,0x90,0x84,0x00,0x03,0x90,0xa4,0x00,0x03,0x91,0x94,0x00,0x03,0x92,0x46,0x00,0x03,0x92,0xfa,0x00,0x03,0x93,0x74,0x00,0x03,0x93,0xfc,0x00,0x03,0x94,0x82,0x00,0x03,0x95,0x1a,0x00,0x03,0x95,0x9e,0x00,0x03,0x95,0xc8,0x00,0x03,0x96,0x10,0x00,0x03,0x96,0x6a,0x00,0x03,0x96,0xe2, +0x00,0x03,0x97,0x52,0x00,0x03,0x98,0x02,0x00,0x03,0x98,0x82,0x00,0x03,0x98,0xae,0x00,0x03,0x99,0x2e,0x00,0x03,0x99,0x8e,0x00,0x03,0x99,0xf0,0x00,0x03,0x9a,0x40,0x00,0x03,0x9a,0x56,0x00,0x03,0x9a,0x6c,0x00,0x03,0x9a,0x82,0x00,0x03,0x9a,0x9a,0x00,0x03,0x9a,0xb2,0x00,0x03,0x9a,0xca,0x00,0x03,0x9a,0xe2,0x00,0x03,0x9a,0xfa, +0x00,0x03,0x9b,0x98,0x00,0x03,0x9c,0xa6,0x00,0x03,0x9c,0xbe,0x00,0x03,0x9c,0xd6,0x00,0x03,0x9d,0xe8,0x00,0x03,0x9e,0x00,0x00,0x03,0x9f,0x24,0x00,0x03,0x9f,0x78,0x00,0x03,0x9f,0xca,0x00,0x03,0xa0,0x2c,0x00,0x03,0xa1,0x2a,0x00,0x03,0xa1,0xf4,0x00,0x03,0xa2,0x9e,0x00,0x03,0xa3,0x06,0x00,0x03,0xa3,0x68,0x00,0x03,0xa3,0xd6, +0x00,0x03,0xa4,0xa6,0x00,0x03,0xa4,0xbe,0x00,0x03,0xa5,0x74,0x00,0x03,0xa6,0x5e,0x00,0x03,0xa7,0x8e,0x00,0x03,0xa7,0xa6,0x00,0x03,0xa7,0xbe,0x00,0x03,0xa7,0xd6,0x00,0x03,0xa7,0xee,0x00,0x03,0xa8,0x06,0x00,0x03,0xa8,0x16,0x00,0x03,0xa8,0x2e,0x00,0x03,0xa8,0x46,0x00,0x03,0xa8,0xde,0x00,0x03,0xa9,0x44,0x00,0x03,0xaa,0x10, +0x00,0x03,0xaa,0x28,0x00,0x03,0xaa,0x38,0x00,0x03,0xab,0x76,0x00,0x03,0xac,0x34,0x00,0x03,0xac,0x4c,0x00,0x03,0xac,0x64,0x00,0x03,0xac,0x7c,0x00,0x03,0xad,0x7e,0x00,0x03,0xad,0xdc,0x00,0x03,0xae,0x00,0x00,0x03,0xae,0x18,0x00,0x03,0xae,0x30,0x00,0x03,0xae,0x40,0x00,0x03,0xae,0x50,0x00,0x03,0xae,0x60,0x00,0x03,0xae,0x7e, +0x00,0x03,0xae,0x9c,0x00,0x03,0xae,0xc6,0x00,0x03,0xae,0xea,0x00,0x03,0xaf,0x28,0x00,0x03,0xaf,0x52,0x00,0x03,0xaf,0x6a,0x00,0x03,0xb0,0x52,0x00,0x03,0xb0,0xea,0x00,0x03,0xb1,0x00,0x00,0x03,0xb1,0x16,0x00,0x03,0xb1,0x3a,0x00,0x03,0xb1,0x50,0x00,0x03,0xb1,0x68,0x00,0x03,0xb1,0x96,0x00,0x03,0xb1,0xae,0x00,0x03,0xb1,0xc6, +0x00,0x03,0xb1,0xde,0x00,0x03,0xb1,0xf6,0x00,0x03,0xb2,0x0e,0x00,0x03,0xb2,0xdc,0x00,0x03,0xb2,0xf4,0x00,0x03,0xb3,0x6a,0x00,0x03,0xb3,0x82,0x00,0x03,0xb3,0xfa,0x00,0x03,0xb4,0x12,0x00,0x03,0xb5,0x5a,0x00,0x03,0xb5,0x72,0x00,0x03,0xb6,0xb4,0x00,0x03,0xb6,0xcc,0x00,0x03,0xb7,0xa2,0x00,0x03,0xb7,0xba,0x00,0x03,0xb8,0xaa, +0x00,0x03,0xb8,0xc2,0x00,0x03,0xb8,0xfc,0x00,0x03,0xb9,0x14,0x00,0x03,0xb9,0x2c,0x00,0x03,0xba,0x64,0x00,0x03,0xba,0xe4,0x00,0x03,0xbb,0xc6,0x00,0x03,0xbb,0xde,0x00,0x03,0xbc,0x92,0x00,0x03,0xbd,0x74,0x00,0x03,0xbe,0x48,0x00,0x03,0xbe,0x60,0x00,0x03,0xbe,0xa4,0x00,0x03,0xbf,0x76,0x00,0x03,0xbf,0xba,0x00,0x03,0xbf,0xe6, +0x00,0x03,0xc0,0xae,0x00,0x03,0xc0,0xd8,0x00,0x03,0xc1,0xba,0x00,0x03,0xc2,0x42,0x00,0x03,0xc2,0x60,0x00,0x03,0xc2,0x7e,0x00,0x03,0xc2,0x8e,0x00,0x03,0xc3,0x04,0x00,0x03,0xc3,0x14,0x00,0x03,0xc3,0x24,0x00,0x03,0xc3,0x34,0x00,0x03,0xc3,0xb6,0x00,0x03,0xc4,0x84,0x00,0x03,0xc5,0x7c,0x00,0x03,0xc6,0x18,0x00,0x03,0xc6,0x9a, +0x00,0x03,0xc6,0xb2,0x00,0x03,0xc6,0xca,0x00,0x03,0xc7,0xf2,0x00,0x03,0xc9,0x62,0x00,0x03,0xc9,0x7a,0x00,0x03,0xc9,0x92,0x00,0x03,0xca,0x66,0x00,0x03,0xca,0x76,0x00,0x03,0xca,0x8e,0x00,0x03,0xca,0xa4,0x00,0x03,0xca,0xb4,0x00,0x03,0xca,0xc4,0x00,0x03,0xca,0xdc,0x00,0x03,0xca,0xf4,0x00,0x03,0xcb,0x18,0x00,0x03,0xcb,0x28, +0x00,0x03,0xcb,0x38,0x00,0x03,0xcb,0x48,0x00,0x03,0xcb,0x58,0x00,0x03,0xcc,0x3e,0x00,0x03,0xcd,0x2e,0x00,0x03,0xcd,0xea,0x00,0x03,0xcd,0xfa,0x00,0x03,0xce,0x0a,0x00,0x03,0xce,0x1a,0x00,0x03,0xce,0xc6,0x00,0x03,0xce,0xd6,0x00,0x03,0xce,0xee,0x00,0x03,0xcf,0x06,0x00,0x03,0xcf,0x1e,0x00,0x03,0xcf,0x36,0x00,0x03,0xcf,0xcc, +0x00,0x03,0xcf,0xdc,0x00,0x03,0xcf,0xf2,0x00,0x03,0xd0,0xc6,0x00,0x03,0xd0,0xea,0x00,0x03,0xd1,0x02,0x00,0x03,0xd1,0x9e,0x00,0x03,0xd2,0x2a,0x00,0x03,0xd2,0x4e,0x00,0x03,0xd2,0x66,0x00,0x03,0xd2,0x94,0x00,0x03,0xd3,0x00,0x00,0x03,0xd3,0x48,0x00,0x03,0xd3,0x60,0x00,0x03,0xd3,0x78,0x00,0x03,0xd3,0x90,0x00,0x03,0xd3,0xa0, +0x00,0x03,0xd3,0xb0,0x00,0x03,0xd5,0xda,0x00,0x03,0xd6,0x5c,0x00,0x03,0xd6,0x8c,0x00,0x03,0xd8,0x0e,0x00,0x03,0xd8,0x7e,0x00,0x03,0xd8,0x8e,0x00,0x03,0xd9,0x40,0x00,0x03,0xd9,0x50,0x00,0x03,0xd9,0x60,0x00,0x03,0xd9,0x70,0x00,0x03,0xd9,0x80,0x00,0x03,0xda,0x94,0x00,0x03,0xda,0xa4,0x00,0x03,0xdb,0x20,0x00,0x03,0xdb,0xa2, +0x00,0x03,0xdb,0xb8,0x00,0x03,0xdb,0xce,0x00,0x03,0xdb,0xf2,0x00,0x03,0xdc,0x16,0x00,0x03,0xdc,0x2c,0x00,0x03,0xdc,0x42,0x00,0x03,0xdc,0x66,0x00,0x03,0xdc,0x92,0x00,0x03,0xdc,0xaa,0x00,0x03,0xdc,0xca,0x00,0x03,0xdc,0xe2,0x00,0x03,0xdc,0xfa,0x00,0x03,0xdd,0x12,0x00,0x03,0xdd,0x2a,0x00,0x03,0xdd,0x42,0x00,0x03,0xdd,0x5a, +0x00,0x03,0xdd,0x88,0x00,0x03,0xdd,0xb6,0x00,0x03,0xdd,0xce,0x00,0x03,0xdd,0xe6,0x00,0x03,0xdd,0xfe,0x00,0x03,0xde,0x16,0x00,0x03,0xde,0x2e,0x00,0x03,0xde,0x46,0x00,0x03,0xde,0x5e,0x00,0x03,0xde,0x76,0x00,0x03,0xde,0x9a,0x00,0x03,0xde,0xb2,0x00,0x03,0xde,0xca,0x00,0x03,0xde,0xe2,0x00,0x03,0xde,0xfa,0x00,0x03,0xdf,0x12, +0x00,0x03,0xdf,0x2a,0x00,0x03,0xdf,0x50,0x00,0x03,0xdf,0x76,0x00,0x03,0xdf,0x8e,0x00,0x03,0xdf,0xa6,0x00,0x03,0xdf,0xbe,0x00,0x03,0xdf,0xd6,0x00,0x03,0xe1,0x1a,0x00,0x03,0xe2,0x80,0x00,0x03,0xe2,0x98,0x00,0x03,0xe2,0xbe,0x00,0x03,0xe2,0xd6,0x00,0x03,0xe2,0xf6,0x00,0x03,0xe3,0x0e,0x00,0x03,0xe3,0x26,0x00,0x03,0xe3,0x3e, +0x00,0x03,0xe3,0x56,0x00,0x03,0xe3,0x6e,0x00,0x03,0xe3,0x86,0x00,0x03,0xe3,0x9e,0x00,0x03,0xe3,0xb6,0x00,0x03,0xe3,0xda,0x00,0x03,0xe3,0xf8,0x00,0x03,0xe4,0x10,0x00,0x03,0xe4,0x28,0x00,0x03,0xe4,0x48,0x00,0x03,0xe4,0x68,0x00,0x03,0xe4,0x80,0x00,0x03,0xe4,0x98,0x00,0x03,0xe4,0xb8,0x00,0x03,0xe4,0xd8,0x00,0x03,0xe4,0xf0, +0x00,0x03,0xe5,0x08,0x00,0x03,0xe5,0x20,0x00,0x03,0xe5,0x38,0x00,0x03,0xe5,0x50,0x00,0x03,0xe5,0x68,0x00,0x03,0xe5,0x80,0x00,0x03,0xe5,0x98,0x00,0x03,0xe5,0xb0,0x00,0x03,0xe6,0xca,0x00,0x03,0xe6,0xe2,0x00,0x03,0xe6,0xfa,0x00,0x03,0xe7,0x12,0x00,0x03,0xe7,0x32,0x00,0x03,0xe7,0x52,0x00,0x03,0xe7,0x72,0x00,0x03,0xe7,0x8a, +0x00,0x03,0xe7,0xa2,0x00,0x03,0xe7,0xba,0x00,0x03,0xe7,0xd2,0x00,0x03,0xe7,0xea,0x00,0x03,0xe8,0x02,0x00,0x03,0xe8,0x1a,0x00,0x03,0xe8,0x32,0x00,0x03,0xe9,0x24,0x00,0x03,0xea,0x2a,0x00,0x03,0xea,0x42,0x00,0x03,0xea,0x5a,0x00,0x03,0xea,0x72,0x00,0x03,0xea,0x8a,0x00,0x03,0xea,0xa2,0x00,0x03,0xea,0xba,0x00,0x03,0xea,0xd2, +0x00,0x03,0xea,0xea,0x00,0x03,0xeb,0x0a,0x00,0x03,0xeb,0x28,0x00,0x03,0xeb,0x56,0x00,0x03,0xeb,0x82,0x00,0x03,0xeb,0xa2,0x00,0x03,0xeb,0xc0,0x00,0x03,0xeb,0xe0,0x00,0x03,0xeb,0xfe,0x00,0x03,0xec,0x34,0x00,0x03,0xec,0x68,0x00,0x03,0xec,0x80,0x00,0x03,0xec,0x98,0x00,0x03,0xec,0xb0,0x00,0x03,0xec,0xc8,0x00,0x03,0xec,0xf0, +0x00,0x03,0xed,0x18,0x00,0x03,0xed,0xfe,0x00,0x03,0xee,0x16,0x00,0x03,0xee,0x38,0x00,0x03,0xee,0x58,0x00,0x03,0xee,0x70,0x00,0x03,0xee,0x92,0x00,0x03,0xee,0xb2,0x00,0x03,0xee,0xca,0x00,0x03,0xee,0xe2,0x00,0x03,0xee,0xfa,0x00,0x03,0xef,0x12,0x00,0x03,0xef,0x32,0x00,0x03,0xef,0x48,0x00,0x03,0xf0,0x5e,0x00,0x03,0xf0,0x82, +0x00,0x03,0xf0,0xa8,0x00,0x03,0xf0,0xc0,0x00,0x03,0xf0,0xe4,0x00,0x03,0xf0,0xfc,0x00,0x03,0xf1,0x14,0x00,0x03,0xf1,0xe8,0x00,0x03,0xf2,0xfc,0x00,0x03,0xf3,0x14,0x00,0x03,0xf3,0x2c,0x00,0x03,0xf3,0x4c,0x00,0x03,0xf3,0x64,0x00,0x03,0xf3,0x7e,0x00,0x03,0xf3,0xa0,0x00,0x03,0xf3,0xba,0x00,0x03,0xf3,0xd2,0x00,0x03,0xf5,0x4e, +0x00,0x03,0xf6,0x0e,0x00,0x03,0xf6,0xd0,0x00,0x03,0xf7,0x2c,0x00,0x03,0xf8,0x42,0x00,0x03,0xf9,0xc4,0x00,0x03,0xfb,0x5e,0x00,0x03,0xfb,0xd0,0x00,0x03,0xfc,0x46,0x00,0x03,0xfc,0xc8,0x00,0x03,0xfd,0x94,0x00,0x03,0xfe,0xae,0x00,0x03,0xff,0x2c,0x00,0x03,0xff,0xf8,0x00,0x04,0x00,0x0a,0x00,0x04,0x00,0x92,0x00,0x04,0x01,0x2c, +0x00,0x04,0x02,0x62,0x00,0x04,0x02,0xb4,0x00,0x04,0x02,0xfe,0x00,0x04,0x03,0xca,0x00,0x04,0x03,0xea,0x00,0x04,0x04,0x0a,0x00,0x04,0x04,0x2a,0x00,0x04,0x04,0x4a,0x00,0x04,0x04,0x6a,0x00,0x04,0x04,0x8a,0x00,0x04,0x04,0xaa,0x00,0x04,0x04,0xca,0x00,0x04,0x04,0xe2,0x00,0x04,0x04,0xfa,0x00,0x04,0x05,0x26,0x00,0x04,0x05,0x52, +0x00,0x04,0x05,0x70,0x00,0x04,0x05,0x8e,0x00,0x04,0x05,0xae,0x00,0x04,0x05,0xce,0x00,0x04,0x05,0xee,0x00,0x04,0x06,0x0e,0x00,0x04,0x06,0x2e,0x00,0x04,0x06,0x4e,0x00,0x04,0x06,0x7e,0x00,0x04,0x06,0xae,0x00,0x04,0x06,0xce,0x00,0x04,0x06,0xee,0x00,0x04,0x07,0xb0,0x00,0x04,0x08,0x12,0x00,0x04,0x08,0x2a,0x00,0x04,0x08,0x42, +0x00,0x04,0x08,0x6e,0x00,0x04,0x08,0x8c,0x00,0x04,0x08,0xaa,0x00,0x04,0x0b,0x1c,0x00,0x04,0x0b,0x66,0x00,0x04,0x0c,0x5e,0x00,0x04,0x0c,0xf4,0x00,0x04,0x0d,0xd6,0x00,0x04,0x0e,0x96,0x00,0x04,0x0e,0xda,0x00,0x04,0x10,0x3e,0x00,0x04,0x11,0x0a,0x00,0x04,0x11,0xda,0x00,0x04,0x12,0xa4,0x00,0x04,0x13,0xdc,0x00,0x04,0x14,0x86, +0x00,0x04,0x14,0xb6,0x00,0x04,0x15,0x7c,0x00,0x04,0x15,0xfe,0x00,0x04,0x16,0x28,0x00,0x04,0x16,0x4c,0x00,0x04,0x16,0x70,0x00,0x04,0x16,0x88,0x00,0x04,0x16,0xa0,0x00,0x04,0x16,0xb8,0x00,0x04,0x16,0xdc,0x00,0x04,0x17,0x00,0x00,0x04,0x17,0x24,0x00,0x04,0x18,0x08,0x00,0x04,0x18,0xa0,0x00,0x04,0x19,0x52,0x00,0x04,0x19,0x6a, +0x00,0x04,0x19,0x82,0x00,0x04,0x19,0xaa,0x00,0x04,0x19,0xc2,0x00,0x04,0x19,0xda,0x00,0x04,0x1b,0x8a,0x00,0x04,0x1c,0x82,0x00,0x04,0x1e,0x16,0x00,0x04,0x1f,0x10,0x00,0x04,0x20,0xae,0x00,0x04,0x21,0xbc,0x00,0x04,0x22,0xd0,0x00,0x04,0x23,0x76,0x00,0x04,0x23,0xa6,0x00,0x04,0x23,0xe0,0x00,0x04,0x24,0x1a,0x00,0x04,0x24,0x5c, +0x00,0x04,0x25,0x26,0x00,0x04,0x25,0x90,0x00,0x04,0x25,0xa8,0x00,0x04,0x25,0xc0,0x00,0x04,0x25,0xe0,0x00,0x04,0x26,0x00,0x00,0x04,0x26,0x18,0x00,0x04,0x26,0x30,0x00,0x04,0x26,0x50,0x00,0x04,0x26,0x70,0x00,0x04,0x26,0x90,0x00,0x04,0x26,0xb0,0x00,0x04,0x26,0xd4,0x00,0x04,0x26,0xf8,0x00,0x04,0x27,0x10,0x00,0x04,0x27,0x28, +0x00,0x04,0x27,0x40,0x00,0x04,0x27,0x58,0x00,0x04,0x27,0x70,0x00,0x04,0x28,0x98,0x00,0x04,0x29,0xfc,0x00,0x04,0x2a,0x14,0x00,0x04,0x2a,0x34,0x00,0x04,0x2a,0x58,0x00,0x04,0x2a,0x70,0x00,0x04,0x2a,0x88,0x00,0x04,0x2a,0xa0,0x00,0x04,0x2a,0xb8,0x00,0x04,0x2a,0xd0,0x00,0x04,0x2a,0xe8,0x00,0x04,0x2b,0x00,0x00,0x04,0x2b,0x18, +0x00,0x04,0x2b,0x30,0x00,0x04,0x2b,0x48,0x00,0x04,0x2b,0x60,0x00,0x04,0x2b,0x78,0x00,0x04,0x2b,0x90,0x00,0x04,0x2b,0xa8,0x00,0x04,0x2b,0xc0,0x00,0x04,0x2b,0xd8,0x00,0x04,0x2b,0xf0,0x00,0x04,0x2c,0x08,0x00,0x04,0x2c,0x20,0x00,0x04,0x2c,0x38,0x00,0x04,0x2c,0x50,0x00,0x04,0x2c,0x68,0x00,0x04,0x2c,0x80,0x00,0x04,0x2c,0x98, +0x00,0x04,0x2c,0xb0,0x00,0x04,0x2c,0xc8,0x00,0x04,0x2c,0xe0,0x00,0x04,0x2c,0xf8,0x00,0x04,0x2d,0x10,0x00,0x04,0x2d,0x28,0x00,0x04,0x2d,0x40,0x00,0x04,0x2d,0x58,0x00,0x04,0x2d,0x70,0x00,0x04,0x2d,0x88,0x00,0x04,0x2d,0xaa,0x00,0x04,0x2d,0xca,0x00,0x04,0x2d,0xea,0x00,0x04,0x2e,0x16,0x00,0x04,0x2e,0x42,0x00,0x04,0x2e,0x78, +0x00,0x04,0x2e,0x90,0x00,0x04,0x2e,0xa8,0x00,0x04,0x2e,0xbe,0x00,0x04,0x2e,0xd4,0x00,0x04,0x2e,0xec,0x00,0x04,0x2f,0x04,0x00,0x04,0x2f,0x1c,0x00,0x04,0x2f,0x34,0x00,0x04,0x2f,0x44,0x00,0x04,0x2f,0x64,0x00,0x04,0x2f,0x84,0x00,0x04,0x2f,0xc0,0x00,0x04,0x2f,0xfc,0x00,0x04,0x30,0x32,0x00,0x04,0x30,0x68,0x00,0x04,0x30,0xf6, +0x00,0x04,0x31,0xf0,0x00,0x04,0x32,0x88,0x00,0x04,0x32,0x98,0x00,0x04,0x32,0xce,0x00,0x04,0x32,0xf2,0x00,0x04,0x33,0xaa,0x00,0x04,0x34,0x86,0x00,0x04,0x35,0x44,0x00,0x04,0x35,0xf8,0x00,0x04,0x37,0x28,0x00,0x04,0x37,0xb4,0x00,0x04,0x38,0x7c,0x00,0x04,0x39,0x56,0x00,0x04,0x39,0x66,0x00,0x04,0x39,0x9c,0x00,0x04,0x39,0xd2, +0x00,0x04,0x39,0xe2,0x00,0x04,0x3a,0x06,0x00,0x04,0x3a,0x2a,0x00,0x04,0x3a,0x42,0x00,0x04,0x3a,0x5a,0x00,0x04,0x3b,0x5e,0x00,0x04,0x3c,0x10,0x00,0x04,0x3c,0x20,0x00,0x04,0x3c,0x30,0x00,0x04,0x3c,0x54,0x00,0x04,0x3c,0x78,0x00,0x04,0x3c,0x90,0x00,0x04,0x3c,0xa8,0x00,0x04,0x3c,0xcc,0x00,0x04,0x3c,0xf2,0x00,0x04,0x3d,0x12, +0x00,0x04,0x3d,0x32,0x00,0x04,0x3d,0x44,0x00,0x04,0x3d,0x78,0x00,0x04,0x3d,0xe2,0x00,0x04,0x3f,0x42,0x00,0x04,0x3f,0x9a,0x00,0x04,0x3f,0xaa,0x00,0x04,0x40,0x76,0x00,0x04,0x41,0x02,0x00,0x04,0x41,0x1a,0x00,0x04,0x41,0xc4,0x00,0x04,0x41,0xe8,0x00,0x04,0x42,0x0c,0x00,0x04,0x42,0x30,0x00,0x04,0x42,0x40,0x00,0x04,0x42,0x64, +0x00,0x04,0x42,0x7c,0x00,0x04,0x42,0x94,0x00,0x04,0x42,0xac,0x00,0x04,0x42,0xc4,0x00,0x04,0x43,0xb4,0x00,0x04,0x43,0xfc,0x00,0x04,0x44,0x44,0x00,0x04,0x44,0xe0,0x00,0x04,0x45,0x3e,0x00,0x04,0x45,0xba,0x00,0x04,0x46,0x1c,0x00,0x04,0x46,0x54,0x00,0x04,0x46,0xa6,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa, +0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x47,0x98,0x00,0x04,0x47,0xb0,0x00,0x04,0x47,0xc8,0x00,0x04,0x47,0xe0, +0x00,0x04,0x47,0xf8,0x00,0x04,0x48,0x10,0x00,0x04,0x48,0x28,0x00,0x04,0x48,0x4c,0x00,0x04,0x48,0x6a,0x00,0x04,0x48,0x82,0x00,0x04,0x48,0x9a,0x00,0x04,0x48,0xb2,0x00,0x04,0x48,0xca,0x00,0x04,0x48,0xda,0x00,0x04,0x48,0xea,0x00,0x04,0x49,0xb8,0x00,0x04,0x4a,0x20,0x00,0x04,0x4a,0x30,0x00,0x04,0x4a,0x40,0x00,0x04,0x4a,0x50, +0x00,0x04,0x4a,0x60,0x00,0x04,0x4b,0x4e,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x8a,0x00,0x04,0x4b,0xb4,0x00,0x04,0x4b,0xfe,0x00,0x04,0x4c,0x3c,0x00,0x04,0x4c,0x82,0x00,0x04,0x4c,0xc2, +0x00,0x04,0x4d,0x24,0x00,0x04,0x4d,0x34,0x00,0x04,0x4d,0x66,0x00,0x04,0x4d,0xd6,0x00,0x04,0x4e,0xac,0x00,0x04,0x4f,0x30,0x00,0x04,0x4f,0x58,0x00,0x04,0x4f,0x80,0x00,0x04,0x4f,0xa8,0x00,0x04,0x4f,0xd0,0x00,0x04,0x4f,0xf8,0x00,0x04,0x50,0x20,0x00,0x04,0x50,0xc0,0x00,0x04,0x51,0x2a,0x00,0x04,0x51,0xd8,0x00,0x04,0x52,0x74, +0x00,0x04,0x53,0x2a,0x00,0x04,0x53,0x9e,0x00,0x04,0x53,0xcc,0x00,0x04,0x54,0x80,0x00,0x04,0x54,0x90,0x00,0x04,0x55,0x78,0x00,0x04,0x56,0x5c,0x00,0x04,0x56,0x98,0x00,0x04,0x56,0xd4,0x00,0x04,0x57,0x32,0x00,0x04,0x57,0x8e,0x00,0x04,0x57,0xee,0x00,0x04,0x58,0x2a,0x00,0x04,0x58,0x3a,0x00,0x04,0x58,0x7c,0x00,0x04,0x58,0xb6, +0x00,0x04,0x58,0xc6,0x00,0x04,0x58,0xec,0x00,0x04,0x59,0x12,0x00,0x04,0x59,0x8c,0x00,0x04,0x5a,0x38,0x00,0x04,0x5a,0xca,0x00,0x04,0x5b,0x6c,0x00,0x04,0x5b,0xb4,0x00,0x04,0x5c,0x30,0x00,0x04,0x5c,0xe2,0x00,0x04,0x5d,0x0e,0x00,0x04,0x5d,0x4a,0x00,0x04,0x5d,0x8e,0x00,0x04,0x5e,0x34,0x00,0x04,0x5e,0x76,0x00,0x04,0x5e,0xa0, +0x00,0x04,0x5e,0xd0,0x00,0x04,0x5e,0xf8,0x00,0x04,0x5f,0x26,0x00,0x04,0x5f,0x6a,0x00,0x04,0x5f,0xae,0x00,0x04,0x60,0x30,0x00,0x04,0x60,0x74,0x00,0x04,0x60,0xba,0x00,0x04,0x61,0x84,0x00,0x04,0x62,0x2a,0x00,0x04,0x62,0xe0,0x00,0x04,0x63,0x52,0x00,0x04,0x63,0xe4,0x00,0x04,0x64,0x14,0x00,0x04,0x64,0xa4,0x00,0x04,0x65,0x1e, +0x00,0x04,0x65,0xd4,0x00,0x04,0x66,0x02,0x00,0x04,0x66,0x6c,0x00,0x04,0x67,0x16,0x00,0x04,0x67,0xd6,0x00,0x04,0x68,0x5c,0x00,0x04,0x69,0x3c,0x00,0x04,0x69,0x6e,0x00,0x04,0x69,0xf2,0x00,0x04,0x6a,0x9a,0x00,0x04,0x6b,0x26,0x00,0x04,0x6b,0xbc,0x00,0x04,0x6c,0x86,0x00,0x04,0x6d,0x3e,0x00,0x04,0x6d,0xda,0x00,0x04,0x6e,0xaa, +0x00,0x04,0x6f,0x12,0x00,0x04,0x70,0x04,0x00,0x04,0x70,0xce,0x00,0x04,0x70,0xe6,0x00,0x04,0x70,0xfe,0x00,0x04,0x71,0x16,0x00,0x04,0x71,0x44,0x00,0x04,0x71,0x90,0x00,0x04,0x71,0xa8,0x00,0x04,0x71,0xc0,0x00,0x04,0x71,0xd6,0x00,0x04,0x71,0xf4,0x00,0x04,0x72,0x5a,0x00,0x04,0x72,0xe0,0x00,0x04,0x72,0xf0,0x00,0x04,0x73,0x00, +0x00,0x04,0x73,0x10,0x00,0x04,0x73,0x20,0x00,0x04,0x73,0x30,0x00,0x04,0x73,0x40,0x00,0x04,0x73,0x50,0x00,0x04,0x73,0x60,0x00,0x04,0x73,0xa0,0x00,0x04,0x73,0xb8,0x00,0x04,0x73,0xd0,0x00,0x04,0x73,0xf0,0x00,0x04,0x74,0x10,0x00,0x04,0x74,0x28,0x00,0x04,0x74,0x40,0x00,0x04,0x74,0x58,0x00,0x04,0x74,0x70,0x00,0x04,0x74,0x88, +0x00,0x04,0x74,0xa0,0x00,0x04,0x74,0xb8,0x00,0x04,0x74,0xce,0x00,0x04,0x74,0xe4,0x00,0x04,0x74,0xfc,0x00,0x04,0x75,0x14,0x00,0x04,0x75,0x2c,0x00,0x04,0x75,0x44,0x00,0x04,0x75,0x5c,0x00,0x04,0x75,0x74,0x00,0x04,0x75,0x8c,0x00,0x04,0x75,0xa4,0x00,0x04,0x75,0xbc,0x00,0x04,0x75,0xd4,0x00,0x04,0x75,0xec,0x00,0x04,0x76,0x04, +0x00,0x04,0x76,0x1c,0x00,0x04,0x76,0x34,0x00,0x04,0x76,0x4c,0x00,0x04,0x76,0x64,0x00,0x04,0x76,0x7c,0x00,0x04,0x76,0x94,0x00,0x04,0x76,0xac,0x00,0x04,0x77,0x4e,0x00,0x04,0x79,0x8e,0x00,0x04,0x79,0xcc,0x00,0x04,0x79,0xf6,0x00,0x04,0x7a,0x06,0x00,0x04,0x7a,0x1e,0x00,0x04,0x7a,0x36,0x00,0x04,0x7a,0x4e,0x00,0x04,0x7a,0xc2, +0x00,0x04,0x7b,0x6c,0x00,0x04,0x7b,0xc2,0x00,0x04,0x7c,0x38,0x00,0x04,0x7c,0xc4,0x00,0x04,0x7d,0x04,0x00,0x04,0x7d,0x30,0x00,0x04,0x7d,0xea,0x00,0x04,0x7e,0x2a,0x00,0x04,0x7e,0x8a,0x00,0x04,0x7e,0xfc,0x00,0x04,0x7f,0x3c,0x00,0x04,0x7f,0x7c,0x00,0x04,0x7f,0xee,0x00,0x04,0x80,0xd4,0x00,0x04,0x81,0x50,0x00,0x04,0x81,0xb8, +0x00,0x04,0x82,0x30,0x00,0x04,0x82,0x64,0x00,0x04,0x82,0xc4,0x00,0x04,0x83,0x04,0x00,0x04,0x83,0x76,0x00,0x04,0x83,0xcc,0x00,0x04,0x84,0x0c,0x00,0x04,0x84,0x86,0x00,0x04,0x84,0x96,0x00,0x04,0x84,0xe6,0x00,0x04,0x85,0x18,0x00,0x04,0x85,0x58,0x00,0x04,0x86,0x14,0x00,0x04,0x86,0x78,0x00,0x04,0x86,0x88,0x00,0x04,0x87,0x06, +0x00,0x04,0x87,0x1e,0x00,0x04,0x87,0x66,0x00,0x04,0x88,0x4c,0x00,0x04,0x88,0xf0,0x00,0x04,0x89,0x9a,0x00,0x04,0x8a,0x92,0x00,0x04,0x8b,0x26,0x00,0x04,0x8b,0xe8,0x00,0x04,0x8c,0xa6,0x00,0x04,0x8d,0x6a,0x00,0x04,0x8d,0xa2,0x00,0x04,0x8e,0x72,0x00,0x04,0x8f,0x44,0x00,0x04,0x90,0x30,0x00,0x04,0x90,0xbc,0x00,0x04,0x92,0x1a, +0x00,0x04,0x92,0x9e,0x00,0x04,0x93,0x30,0x00,0x04,0x93,0xe4,0x00,0x04,0x94,0x76,0x00,0x04,0x95,0x16,0x00,0x04,0x96,0x70,0x00,0x04,0x97,0x68,0x00,0x04,0x97,0xe8,0x00,0x04,0x98,0x56,0x00,0x04,0x98,0xd0,0x00,0x04,0x99,0x92,0x00,0x04,0x9a,0x12,0x00,0x04,0x9a,0xfa,0x00,0x04,0x9b,0xd6,0x00,0x04,0x9c,0x8a,0x00,0x04,0x9d,0xc4, +0x00,0x04,0x9e,0x52,0x00,0x04,0x9f,0x02,0x00,0x04,0x9f,0x98,0x00,0x04,0xa0,0x2e,0x00,0x04,0xa0,0xe4,0x00,0x04,0xa1,0x66,0x00,0x04,0xa1,0xea,0x00,0x04,0xa2,0xe4,0x00,0x04,0xa3,0xc0,0x00,0x04,0xa4,0xbe,0x00,0x04,0xa6,0x06,0x00,0x04,0xa7,0xe6,0x00,0x04,0xa8,0xd0,0x00,0x04,0xaa,0x1e,0x00,0x04,0xab,0x34,0x00,0x04,0xac,0xb0, +0x00,0x04,0xad,0x90,0x00,0x04,0xae,0x9e,0x00,0x04,0xb1,0x10,0x00,0x04,0xb2,0x16,0x00,0x04,0xb3,0x1a,0x00,0x04,0xb4,0x7e,0x00,0x04,0xb5,0xc2,0x00,0x04,0xb6,0xd6,0x00,0x04,0xb8,0xb0,0x00,0x04,0xb9,0x70,0x00,0x04,0xbb,0x5c,0x00,0x04,0xbd,0x34,0x00,0x04,0xbf,0x22,0x00,0x04,0xc0,0x4c,0x00,0x04,0xc1,0xf0,0x00,0x04,0xc3,0x60, +0x00,0x04,0xc4,0xa0,0x00,0x04,0xc5,0x9a,0x00,0x04,0xc6,0xf4,0x00,0x04,0xc7,0xcc,0x00,0x04,0xc9,0x6e,0x00,0x04,0xcb,0x30,0x00,0x04,0xcc,0x28,0x00,0x04,0xce,0x26,0x00,0x04,0xcf,0x78,0x00,0x04,0xd1,0x0a,0x00,0x04,0xd2,0x8c,0x00,0x04,0xd3,0xa4,0x00,0x04,0xd5,0x42,0x00,0x04,0xd6,0x64,0x00,0x04,0xd7,0xf0,0x00,0x04,0xd9,0x3c, +0x00,0x04,0xda,0x58,0x00,0x04,0xdb,0xb2,0x00,0x04,0xdc,0xda,0x00,0x04,0xdd,0x7c,0x00,0x04,0xde,0x6a,0x00,0x04,0xdf,0x8c,0x00,0x04,0xe0,0xb2,0x00,0x04,0xe2,0x08,0x00,0x04,0xe3,0xbe,0x00,0x04,0xe4,0xbe,0x00,0x04,0xe6,0x0e,0x00,0x04,0xe7,0x6e,0x00,0x04,0xe9,0x48,0x00,0x04,0xe9,0xfc,0x00,0x04,0xeb,0x40,0x00,0x04,0xec,0xe8, +0x00,0x04,0xee,0x6c,0x00,0x04,0xef,0xaa,0x00,0x04,0xf1,0x0c,0x00,0x04,0xf2,0x3a,0x00,0x04,0xf3,0x6a,0x00,0x04,0xf4,0xe6,0x00,0x04,0xf5,0xe2,0x00,0x04,0xf7,0x42,0x00,0x04,0xf8,0xc6,0x00,0x04,0xfa,0xc8,0x00,0x04,0xfc,0x22,0x00,0x04,0xfd,0x16,0x00,0x04,0xfe,0x04,0x00,0x04,0xff,0x1c,0x00,0x05,0x00,0x54,0x00,0x05,0x01,0x9c, +0x00,0x05,0x03,0x02,0x00,0x05,0x04,0x58,0x00,0x05,0x05,0xf8,0x00,0x05,0x07,0x50,0x00,0x05,0x08,0x46,0x00,0x05,0x09,0xaa,0x00,0x05,0x0a,0xb2,0x00,0x05,0x0b,0x62,0x00,0x05,0x0c,0x98,0x00,0x05,0x0d,0x88,0x00,0x05,0x0f,0x2a,0x00,0x05,0x10,0x08,0x00,0x05,0x10,0xc4,0x00,0x05,0x11,0xa0,0x00,0x05,0x12,0x42,0x00,0x05,0x12,0xe8, +0x00,0x05,0x13,0xee,0x00,0x05,0x14,0x5e,0x00,0x05,0x14,0xe0,0x00,0x05,0x16,0x2a,0x00,0x05,0x16,0xfe,0x00,0x05,0x17,0xb0,0x00,0x05,0x18,0x04,0x00,0x05,0x18,0xc0,0x00,0x05,0x1a,0x34,0x00,0x05,0x1a,0xca,0x00,0x05,0x1b,0xa8,0x00,0x05,0x1d,0x26,0x00,0x05,0x1d,0xb8,0x00,0x05,0x1e,0x9a,0x00,0x05,0x1f,0x2e,0x00,0x05,0x20,0x76, +0x00,0x05,0x21,0x06,0x00,0x05,0x22,0x18,0x00,0x05,0x22,0xa6,0x00,0x05,0x23,0xae,0x00,0x05,0x24,0x5e,0x00,0x05,0x25,0xc4,0x00,0x05,0x26,0x6e,0x00,0x05,0x26,0xfe,0x00,0x05,0x27,0x96,0x00,0x05,0x28,0xf2,0x00,0x05,0x29,0x78,0x00,0x05,0x2a,0xd4,0x00,0x05,0x2b,0x7e,0x00,0x05,0x2c,0x88,0x00,0x05,0x2d,0xae,0x00,0x05,0x2e,0x98, +0x00,0x05,0x2f,0xba,0x00,0x05,0x30,0x3a,0x00,0x05,0x30,0x94,0x00,0x05,0x30,0xd4,0x00,0x05,0x31,0x44,0x00,0x05,0x31,0x90,0x00,0x05,0x32,0xae,0x00,0x05,0x32,0xfe,0x00,0x05,0x33,0xee,0x00,0x05,0x34,0x92,0x00,0x05,0x35,0x6a,0x00,0x05,0x36,0x0e,0x00,0x05,0x36,0xb8,0x00,0x05,0x37,0x80,0x00,0x05,0x37,0xd0,0x00,0x05,0x38,0x6e, +0x00,0x05,0x39,0x96,0x00,0x05,0x3a,0x5a,0x00,0x05,0x3a,0xe4,0x00,0x05,0x3b,0x1e,0x00,0x05,0x3b,0xf6,0x00,0x05,0x3d,0x38,0x00,0x05,0x3d,0xae,0x00,0x05,0x3e,0x82,0x00,0x05,0x3f,0xa2,0x00,0x05,0x40,0x3e,0x00,0x05,0x41,0x46,0x00,0x05,0x41,0xc8,0x00,0x05,0x42,0x08,0x00,0x05,0x42,0x88,0x00,0x05,0x43,0x7a,0x00,0x05,0x44,0x4e, +0x00,0x05,0x45,0x3a,0x00,0x05,0x45,0xf6,0x00,0x05,0x47,0x36,0x00,0x05,0x47,0xda,0x00,0x05,0x48,0xba,0x00,0x05,0x49,0x40,0x00,0x05,0x4a,0x02,0x00,0x05,0x4a,0x92,0x00,0x05,0x4b,0xaa,0x00,0x05,0x4b,0xe4,0x00,0x05,0x4c,0xaa,0x00,0x05,0x4d,0x7a,0x00,0x05,0x4e,0x54,0x00,0x05,0x4f,0x90,0x00,0x05,0x50,0x14,0x00,0x05,0x50,0x96, +0x00,0x05,0x50,0xf4,0x00,0x05,0x51,0xd8,0x00,0x05,0x52,0xde,0x00,0x05,0x53,0xca,0x00,0x05,0x54,0xbe,0x00,0x05,0x55,0xda,0x00,0x05,0x56,0xb6,0x00,0x05,0x57,0x24,0x00,0x05,0x57,0x34,0x00,0x05,0x57,0xac,0x00,0x05,0x58,0x04,0x00,0x05,0x58,0xa2,0x00,0x05,0x59,0x60,0x00,0x05,0x59,0xde,0x00,0x05,0x5a,0x80,0x00,0x05,0x5b,0x4c, +0x00,0x05,0x5b,0xb6,0x00,0x05,0x5c,0xce,0x00,0x05,0x5d,0x96,0x00,0x05,0x5d,0xa6,0x00,0x05,0x5d,0xfe,0x00,0x05,0x5e,0x0e,0x00,0x05,0x5e,0x1e,0x00,0x05,0x5e,0x2e,0x00,0x05,0x5e,0x3e,0x00,0x05,0x5e,0x4e,0x00,0x05,0x5e,0x5e,0x00,0x05,0x5e,0x6e,0x00,0x05,0x5e,0x7e,0x00,0x05,0x5e,0xfa,0x00,0x05,0x5f,0x58,0x00,0x05,0x60,0x02, +0x00,0x05,0x60,0xd0,0x00,0x05,0x61,0x4c,0x00,0x05,0x61,0xf6,0x00,0x05,0x62,0xc2,0x00,0x05,0x63,0x2e,0x00,0x05,0x64,0x46,0x00,0x05,0x65,0x10,0x00,0x05,0x65,0xe4,0x00,0x05,0x66,0x8e,0x00,0x05,0x67,0x82,0x00,0x05,0x68,0xcc,0x00,0x05,0x69,0x9e,0x00,0x05,0x6a,0x9e,0x00,0x05,0x6b,0xbc,0x00,0x05,0x6c,0xa0,0x00,0x05,0x6e,0x1c, +0x00,0x05,0x6f,0x50,0x00,0x05,0x6f,0xb4,0x00,0x05,0x6f,0xd0,0x00,0x05,0x6f,0xec,0x00,0x05,0x70,0x08,0x00,0x05,0x70,0x26,0x00,0x05,0x70,0x42,0x00,0x05,0x71,0x0c,0x00,0x05,0x71,0x28,0x00,0x05,0x71,0x48,0x00,0x05,0x72,0x18,0x00,0x05,0x72,0x90,0x00,0x05,0x73,0x46,0x00,0x05,0x73,0xba,0x00,0x05,0x74,0x2a,0x00,0x05,0x74,0x96, +0x00,0x05,0x74,0xec,0x00,0x05,0x75,0x82,0x00,0x05,0x75,0xd8,0x00,0x05,0x76,0x00,0x00,0x05,0x76,0x52,0x00,0x05,0x76,0xcc,0x00,0x05,0x77,0x02,0x00,0x05,0x77,0x94,0x00,0x05,0x78,0x02,0x00,0x05,0x78,0x88,0x00,0x05,0x78,0xfa,0x00,0x05,0x79,0x98,0x00,0x05,0x7a,0x36,0x00,0x05,0x7a,0xf6,0x00,0x05,0x7b,0x3a,0x00,0x05,0x7b,0x9c, +0x00,0x05,0x7b,0xee,0x00,0x05,0x7c,0x80,0x00,0x05,0x7c,0xf0,0x00,0x05,0x7d,0x50,0x00,0x05,0x7d,0xa6,0x00,0x05,0x7e,0x4c,0x00,0x05,0x7f,0x26,0x00,0x05,0x7f,0x92,0x00,0x05,0x80,0x5c,0x00,0x05,0x80,0xda,0x00,0x05,0x81,0x74,0x00,0x05,0x82,0x50,0x00,0x05,0x82,0x74,0x00,0x05,0x82,0x98,0x00,0x05,0x82,0xbc,0x00,0x05,0x82,0xe0, +0x00,0x05,0x83,0x04,0x00,0x05,0x83,0x28,0x00,0x05,0x83,0x40,0x00,0x05,0x83,0x62,0x00,0x05,0x83,0x86,0x00,0x05,0x83,0xa8,0x00,0x05,0x83,0xcc,0x00,0x05,0x83,0xee,0x00,0x05,0x84,0x10,0x00,0x05,0x84,0x32,0x00,0x05,0x84,0x58,0x00,0x05,0x84,0x7c,0x00,0x05,0x84,0xa0,0x00,0x05,0x84,0xc4,0x00,0x05,0x84,0xe8,0x00,0x05,0x85,0x0c, +0x00,0x05,0x85,0x32,0x00,0x05,0x85,0x56,0x00,0x05,0x85,0x7a,0x00,0x05,0x85,0x9e,0x00,0x05,0x85,0xc4,0x00,0x05,0x85,0xe8,0x00,0x05,0x86,0x0c,0x00,0x05,0x86,0x30,0x00,0x05,0x86,0x48,0x00,0x05,0x86,0x6c,0x00,0x05,0x86,0x90,0x00,0x05,0x86,0xb4,0x00,0x05,0x86,0xd8,0x00,0x05,0x86,0xe8,0x00,0x05,0x87,0x0c,0x00,0x05,0x87,0x30, +0x00,0x05,0x87,0x54,0x00,0x05,0x87,0x6c,0x00,0x05,0x87,0x8e,0x00,0x05,0x87,0xb2,0x00,0x05,0x87,0xca,0x00,0x05,0x87,0xee,0x00,0x05,0x88,0x12,0x00,0x05,0x88,0xa4,0x00,0x05,0x88,0xc6,0x00,0x05,0x88,0xe8,0x00,0x05,0x89,0x0a,0x00,0x05,0x89,0x20,0x00,0x05,0x89,0x42,0x00,0x05,0x89,0x5a,0x00,0x05,0x89,0x7c,0x00,0x05,0x89,0x94, +0x00,0x05,0x89,0xb6,0x00,0x05,0x89,0xcc,0x00,0x05,0x89,0xe4,0x00,0x05,0x89,0xfc,0x00,0x05,0x8a,0x20,0x00,0x05,0x8a,0x38,0x00,0x05,0x8a,0x5c,0x00,0x05,0x8b,0x04,0x00,0x05,0x8b,0x28,0x00,0x05,0x8b,0x4c,0x00,0x05,0x8b,0x72,0x00,0x05,0x8b,0x96,0x00,0x05,0x8b,0xae,0x00,0x05,0x8b,0xd2,0x00,0x05,0x8b,0xf6,0x00,0x05,0x8c,0x18, +0x00,0x05,0x8c,0x30,0x00,0x05,0x8c,0x52,0x00,0x05,0x8c,0x6a,0x00,0x05,0x8c,0x80,0x00,0x05,0x8c,0xa2,0x00,0x05,0x8d,0x1c,0x00,0x05,0x8d,0x40,0x00,0x05,0x8d,0x64,0x00,0x05,0x8d,0x88,0x00,0x05,0x8d,0xae,0x00,0x05,0x8d,0xd4,0x00,0x05,0x8d,0xec,0x00,0x05,0x8e,0x10,0x00,0x05,0x8e,0x34,0x00,0x05,0x8e,0x58,0x00,0x05,0x8e,0x7e, +0x00,0x05,0x8e,0xa0,0x00,0x05,0x8e,0xc4,0x00,0x05,0x8e,0xe6,0x00,0x05,0x8f,0x0a,0x00,0x05,0x8f,0x2e,0x00,0x05,0x8f,0x52,0x00,0x05,0x8f,0x9e,0x00,0x05,0x8f,0xc2,0x00,0x05,0x8f,0xe6,0x00,0x05,0x8f,0xf6,0x00,0x05,0x90,0x06,0x00,0x05,0x90,0x40,0x00,0x05,0x90,0xa6,0x00,0x05,0x90,0xb6,0x00,0x05,0x90,0xc6,0x00,0x05,0x90,0xd6, +0x00,0x05,0x91,0x7c,0x00,0x05,0x91,0x8c,0x00,0x05,0x91,0x9c,0x00,0x05,0x91,0xfa,0x00,0x05,0x92,0x0a,0x00,0x05,0x92,0x1a,0x00,0x05,0x92,0x82,0x00,0x05,0x92,0x92,0x00,0x05,0x92,0xd2,0x00,0x05,0x92,0xe2,0x00,0x05,0x93,0x4e,0x00,0x05,0x93,0x5e,0x00,0x05,0x93,0x6e,0x00,0x05,0x94,0x4e,0x00,0x05,0x94,0x5e,0x00,0x05,0x94,0xe8, +0x00,0x05,0x95,0x8e,0x00,0x05,0x95,0xb2,0x00,0x05,0x95,0xd6,0x00,0x05,0x95,0xfa,0x00,0x05,0x96,0x1c,0x00,0x05,0x96,0x40,0x00,0x05,0x96,0x64,0x00,0x05,0x96,0x88,0x00,0x05,0x96,0xae,0x00,0x05,0x96,0xd2,0x00,0x05,0x96,0xf6,0x00,0x05,0x97,0x8c,0x00,0x05,0x97,0xb0,0x00,0x05,0x98,0x36,0x00,0x05,0x98,0x46,0x00,0x05,0x98,0x56, +0x00,0x05,0x98,0x7c,0x00,0x05,0x98,0x8c,0x00,0x05,0x99,0x5c,0x00,0x05,0x9a,0x0a,0x00,0x05,0x9a,0x7e,0x00,0x05,0x9a,0xa2,0x00,0x05,0x9a,0xc6,0x00,0x05,0x9b,0x24,0x00,0x05,0x9b,0x34,0x00,0x05,0x9b,0xba,0x00,0x05,0x9b,0xca,0x00,0x05,0x9b,0xda,0x00,0x05,0x9c,0x78,0x00,0x05,0x9c,0x88,0x00,0x05,0x9d,0x0c,0x00,0x05,0x9d,0xc6, +0x00,0x05,0x9e,0x38,0x00,0x05,0x9e,0x5c,0x00,0x05,0x9e,0x6c,0x00,0x05,0x9e,0xf0,0x00,0x05,0x9f,0x00,0x00,0x05,0x9f,0x10,0x00,0x05,0x9f,0x20,0x00,0x05,0x9f,0x30,0x00,0x05,0x9f,0x40,0x00,0x05,0x9f,0x50,0x00,0x05,0x9f,0x60,0x00,0x05,0x9f,0xdc,0x00,0x05,0x9f,0xec,0x00,0x05,0x9f,0xfc,0x00,0x05,0xa0,0x56,0x00,0x05,0xa0,0xc8, +0x00,0x05,0xa1,0x26,0x00,0x05,0xa1,0x9a,0x00,0x05,0xa2,0x20,0x00,0x05,0xa2,0xae,0x00,0x05,0xa3,0x20,0x00,0x05,0xa3,0xa6,0x00,0x05,0xa4,0x66,0x00,0x05,0xa5,0x1a,0x00,0x05,0xa5,0x5e,0x00,0x05,0xa5,0xee,0x00,0x05,0xa6,0x78,0x00,0x05,0xa7,0x4c,0x00,0x05,0xa8,0x3e,0x00,0x05,0xa9,0x24,0x00,0x05,0xaa,0xb0,0x00,0x05,0xaa,0xd4, +0x00,0x05,0xaa,0xf8,0x00,0x05,0xab,0x0e,0x00,0x05,0xab,0x1e,0x00,0x05,0xab,0x2e,0x00,0x05,0xab,0x4e,0x00,0x05,0xab,0x5e,0x00,0x05,0xab,0x6e,0x00,0x05,0xab,0x8e,0x00,0x05,0xab,0x9e,0x00,0x05,0xab,0xae,0x00,0x05,0xab,0xcc,0x00,0x05,0xab,0xdc,0x00,0x05,0xab,0xec,0x00,0x05,0xac,0x0a,0x00,0x05,0xac,0x1a,0x00,0x05,0xac,0x2a, +0x00,0x05,0xac,0x48,0x00,0x05,0xac,0x58,0x00,0x05,0xac,0x68,0x00,0x05,0xac,0x78,0x00,0x05,0xac,0x88,0x00,0x05,0xac,0x98,0x00,0x05,0xac,0xb8,0x00,0x05,0xac,0xd6,0x00,0x05,0xac,0xe6,0x00,0x05,0xac,0xf6,0x00,0x05,0xad,0x14,0x00,0x05,0xad,0x32,0x00,0x05,0xad,0x42,0x00,0x05,0xad,0x52,0x00,0x05,0xad,0x62,0x00,0x05,0xad,0x84, +0x00,0x05,0xad,0x94,0x00,0x05,0xad,0xb4,0x00,0x05,0xad,0xc4,0x00,0x05,0xad,0xe2,0x00,0x05,0xad,0xf2,0x00,0x05,0xae,0x02,0x00,0x05,0xae,0x12,0x00,0x05,0xae,0x30,0x00,0x05,0xae,0x4e,0x00,0x05,0xae,0x6e,0x00,0x05,0xae,0x7e,0x00,0x05,0xae,0x8e,0x00,0x05,0xae,0xa6,0x00,0x05,0xae,0xbe,0x00,0x05,0xae,0xce,0x00,0x05,0xae,0xde, +0x00,0x05,0xae,0xf6,0x00,0x05,0xaf,0x0e,0x00,0x05,0xaf,0x9c,0x00,0x05,0xb0,0xde,0x00,0x05,0xb2,0x14,0x00,0x05,0xb2,0x84,0x00,0x05,0xb2,0xe0,0x00,0x05,0xb3,0x7c,0x00,0x05,0xb4,0x44,0x00,0x05,0xb4,0xf6,0x00,0x05,0xb5,0xa2,0x00,0x05,0xb6,0x02,0x00,0x05,0xb6,0x5c,0x00,0x05,0xb6,0xbc,0x00,0x05,0xb7,0x64,0x00,0x05,0xb7,0x92, +0x00,0x05,0xb7,0xc2,0x00,0x05,0xb7,0xf0,0x00,0x05,0xb8,0x20,0x00,0x05,0xb8,0x38,0x00,0x05,0xb8,0x6a,0x00,0x05,0xb8,0x82,0x00,0x05,0xb8,0x9a,0x00,0x05,0xb8,0xb2,0x00,0x05,0xb8,0xca,0x00,0x05,0xb8,0xe2,0x00,0x05,0xb8,0xf8,0x00,0x05,0xb9,0x28,0x00,0x05,0xb9,0x3e,0x00,0x05,0xb9,0x54,0x00,0x05,0xb9,0x64,0x00,0x05,0xb9,0xc2, +0x00,0x05,0xba,0x16,0x00,0x05,0xba,0x2c,0x00,0x05,0xba,0x42,0x00,0x05,0xbb,0x5c,0x00,0x05,0xbc,0x64,0x00,0x05,0xbd,0x4c,0x00,0x05,0xbe,0x84,0x00,0x05,0xbf,0x26,0x00,0x05,0xbf,0xe0,0x00,0x05,0xc0,0x0c,0x00,0x05,0xc0,0xc2,0x00,0x05,0xc1,0x3a,0x00,0x05,0xc1,0x60,0x00,0x05,0xc2,0x26,0x00,0x05,0xc2,0x4c,0x00,0x05,0xc2,0x64, +0x00,0x05,0xc2,0x7c,0x00,0x05,0xc2,0x94,0x00,0x05,0xc2,0xac,0x00,0x05,0xc2,0xc4,0x00,0x05,0xc2,0xe8,0x00,0x05,0xc3,0x0c,0x00,0x05,0xc3,0x24,0x00,0x05,0xc3,0x3c,0x00,0x05,0xc3,0x54,0x00,0x05,0xc3,0x6c,0x00,0x05,0xc3,0x84,0x00,0x05,0xc3,0x9c,0x00,0x05,0xc3,0xb4,0x00,0x05,0xc4,0x88,0x00,0x05,0xc4,0xa0,0x00,0x05,0xc5,0x36, +0x00,0x05,0xc5,0x4e,0x00,0x05,0xc6,0xbe,0x00,0x05,0xc7,0xf2,0x00,0x05,0xc8,0x0a,0x00,0x05,0xc8,0x22,0x00,0x05,0xc9,0xa0,0x00,0x05,0xca,0xec,0x00,0x05,0xcb,0x04,0x00,0x05,0xcb,0x1c,0x00,0x05,0xcc,0x1c,0x00,0x05,0xcd,0x00,0x00,0x05,0xce,0x08,0x00,0x05,0xce,0x20,0x00,0x05,0xce,0x38,0x00,0x05,0xce,0x50,0x00,0x05,0xce,0x68, +0x00,0x05,0xce,0x80,0x00,0x05,0xce,0x98,0x00,0x05,0xce,0xb0,0x00,0x05,0xce,0xc8,0x00,0x05,0xce,0xe0,0x00,0x05,0xce,0xf8,0x00,0x05,0xcf,0x10,0x00,0x05,0xcf,0x28,0x00,0x05,0xcf,0x4c,0x00,0x05,0xcf,0x6c,0x00,0x05,0xcf,0x8c,0x00,0x05,0xcf,0xa4,0x00,0x05,0xcf,0xbc,0x00,0x05,0xcf,0xdc,0x00,0x05,0xcf,0xfc,0x00,0x05,0xd0,0x14, +0x00,0x05,0xd0,0x2c,0x00,0x05,0xd0,0x4c,0x00,0x05,0xd0,0x6c,0x00,0x05,0xd0,0x84,0x00,0x05,0xd0,0x9c,0x00,0x05,0xd1,0xe0,0x00,0x05,0xd2,0x8e,0x00,0x05,0xd3,0x98,0x00,0x05,0xd4,0x7c,0x00,0x05,0xd4,0x94,0x00,0x05,0xd4,0xac,0x00,0x05,0xd5,0xf4,0x00,0x05,0xd7,0x38,0x00,0x05,0xd8,0x62,0x00,0x05,0xd9,0x5a,0x00,0x05,0xd9,0x6a, +0x00,0x05,0xd9,0x7a,0x00,0x05,0xd9,0x92,0x00,0x05,0xda,0x94,0x00,0x05,0xdb,0xa4,0x00,0x05,0xdd,0x8c,0x00,0x05,0xde,0x7e,0x00,0x05,0xdf,0xc0,0x00,0x05,0xe0,0x5a,0x00,0x05,0xe1,0x94,0x00,0x05,0xe2,0x3e,0x00,0x05,0xe3,0x32,0x00,0x05,0xe3,0xd8,0x00,0x05,0xe4,0x68,0x00,0x05,0xe4,0x78,0x00,0x05,0xe5,0x3a,0x00,0x05,0xe5,0x9e, +0x00,0x05,0xe6,0xb8,0x00,0x05,0xe6,0xc8,0x00,0x05,0xe6,0xd8,0x00,0x05,0xe6,0xea,0x00,0x05,0xe7,0x0e,0x00,0x05,0xe7,0x3e,0x00,0x05,0xe7,0x62,0x00,0x05,0xe7,0x8e,0x00,0x05,0xe7,0xa6,0x00,0x05,0xe7,0xbe,0x00,0x05,0xe7,0xd6,0x00,0x05,0xe7,0xee,0x00,0x05,0xe8,0x06,0x00,0x05,0xe8,0x1e,0x00,0x05,0xe8,0x3e,0x00,0x05,0xe8,0x5e, +0x00,0x05,0xe8,0x76,0x00,0x05,0xe8,0x8e,0x00,0x05,0xe8,0xa6,0x00,0x05,0xe8,0xbe,0x00,0x05,0xe8,0xd6,0x00,0x05,0xe8,0xee,0x00,0x05,0xe9,0x06,0x00,0x05,0xe9,0x1e,0x00,0x05,0xe9,0x42,0x00,0x05,0xe9,0x5a,0x00,0x05,0xe9,0x72,0x00,0x05,0xe9,0x8a,0x00,0x05,0xe9,0xa2,0x00,0x05,0xe9,0xba,0x00,0x05,0xe9,0xd2,0x00,0x05,0xe9,0xea, +0x00,0x05,0xea,0x02,0x00,0x05,0xea,0x1a,0x00,0x05,0xea,0x3a,0x00,0x05,0xea,0x52,0x00,0x05,0xea,0x6a,0x00,0x05,0xea,0x82,0x00,0x05,0xea,0x9a,0x00,0x05,0xea,0xb2,0x00,0x05,0xea,0xd2,0x00,0x05,0xea,0xf2,0x00,0x05,0xeb,0x0a,0x00,0x05,0xeb,0x22,0x00,0x05,0xeb,0x42,0x00,0x05,0xeb,0x62,0x00,0x05,0xeb,0x7a,0x00,0x05,0xeb,0x92, +0x00,0x05,0xeb,0xaa,0x00,0x05,0xeb,0xc2,0x00,0x05,0xeb,0xda,0x00,0x05,0xeb,0xf2,0x00,0x05,0xec,0x0a,0x00,0x05,0xed,0x52,0x00,0x05,0xed,0x6a,0x00,0x05,0xed,0x8a,0x00,0x05,0xed,0xa2,0x00,0x05,0xed,0xba,0x00,0x05,0xed,0xd2,0x00,0x05,0xed,0xea,0x00,0x05,0xee,0x02,0x00,0x05,0xee,0x1a,0x00,0x05,0xee,0x32,0x00,0x05,0xee,0x4a, +0x00,0x05,0xee,0x62,0x00,0x05,0xef,0x6a,0x00,0x05,0xef,0x7a,0x00,0x05,0xf0,0x94,0x00,0x05,0xf1,0xca,0x00,0x05,0xf1,0xe2,0x00,0x05,0xf1,0xfa,0x00,0x05,0xf2,0x12,0x00,0x05,0xf2,0x2a,0x00,0x05,0xf2,0x42,0x00,0x05,0xf2,0x5a,0x00,0x05,0xf2,0x72,0x00,0x05,0xf2,0x8a,0x00,0x05,0xf2,0xa2,0x00,0x05,0xf2,0xb8,0x00,0x05,0xf2,0xd8, +0x00,0x05,0xf2,0xf6,0x00,0x05,0xf3,0x24,0x00,0x05,0xf3,0x50,0x00,0x05,0xf3,0x70,0x00,0x05,0xf3,0x8e,0x00,0x05,0xf3,0xae,0x00,0x05,0xf3,0xcc,0x00,0x05,0xf4,0x02,0x00,0x05,0xf4,0x36,0x00,0x05,0xf4,0x4e,0x00,0x05,0xf4,0x66,0x00,0x05,0xf4,0x8e,0x00,0x05,0xf5,0x9a,0x00,0x05,0xf6,0xa4,0x00,0x05,0xf6,0xc4,0x00,0x05,0xf7,0x8c, +0x00,0x05,0xf7,0xa4,0x00,0x05,0xf7,0xbc,0x00,0x05,0xf7,0xd4,0x00,0x05,0xf9,0x26,0x00,0x05,0xf9,0x46,0x00,0x05,0xf9,0x5e,0x00,0x05,0xf9,0x76,0x00,0x05,0xf9,0x86,0x00,0x05,0xf9,0x96,0x00,0x05,0xf9,0xb6,0x00,0x05,0xf9,0xce,0x00,0x05,0xf9,0xe6,0x00,0x05,0xf9,0xfc,0x00,0x05,0xfb,0x1e,0x00,0x05,0xfb,0x42,0x00,0x05,0xfb,0x68, +0x00,0x05,0xfb,0x80,0x00,0x05,0xfb,0xa4,0x00,0x05,0xfb,0xbc,0x00,0x05,0xfb,0xd4,0x00,0x05,0xfb,0xec,0x00,0x05,0xfc,0x0c,0x00,0x05,0xfc,0x24,0x00,0x05,0xfc,0x3c,0x00,0x05,0xfc,0x54,0x00,0x05,0xfc,0x6c,0x00,0x05,0xfc,0x84,0x00,0x05,0xfc,0xde,0x00,0x05,0xfc,0xfe,0x00,0x05,0xfd,0x1e,0x00,0x05,0xfd,0x3e,0x00,0x05,0xfd,0x5e, +0x00,0x05,0xfd,0x76,0x00,0x05,0xfd,0x96,0x00,0x05,0xfd,0xb6,0x00,0x05,0xfd,0xd6,0x00,0x05,0xfd,0xee,0x00,0x05,0xfe,0x06,0x00,0x05,0xfe,0x26,0x00,0x05,0xfe,0x46,0x00,0x05,0xfe,0x66,0x00,0x05,0xfe,0x86,0x00,0x05,0xfe,0xaa,0x00,0x05,0xfe,0xce,0x00,0x05,0xfe,0xe6,0x00,0x05,0xfe,0xfe,0x00,0x05,0xff,0x16,0x00,0x05,0xff,0x2e, +0x00,0x05,0xff,0x4e,0x00,0x05,0xff,0x72,0x00,0x05,0xff,0x8a,0x00,0x05,0xff,0xa2,0x00,0x05,0xff,0xba,0x00,0x05,0xff,0xd2,0x00,0x05,0xff,0xea,0x00,0x06,0x00,0x02,0x00,0x06,0x00,0x1a,0x00,0x06,0x00,0x32,0x00,0x06,0x00,0x4a,0x00,0x06,0x00,0x62,0x00,0x06,0x00,0x7a,0x00,0x06,0x00,0x92,0x00,0x06,0x01,0xbe,0x00,0x06,0x01,0xde, +0x00,0x06,0x01,0xfe,0x00,0x06,0x02,0x2a,0x00,0x06,0x02,0x56,0x00,0x06,0x02,0x8c,0x00,0x06,0x02,0xa4,0x00,0x06,0x02,0xbc,0x00,0x06,0x04,0x04,0x00,0x06,0x05,0x88,0x00,0x06,0x05,0xa0,0x00,0x06,0x05,0xb8,0x00,0x06,0x07,0x4a,0x00,0x06,0x09,0x18,0x00,0x06,0x0a,0x9e,0x00,0x06,0x0c,0x5c,0x00,0x06,0x0c,0x8a,0x00,0x06,0x0c,0xb8, +0x00,0x06,0x0c,0xe6,0x00,0x06,0x0d,0x14,0x00,0x06,0x0d,0x42,0x00,0x06,0x0d,0x70,0x00,0x06,0x0d,0x88,0x00,0x06,0x0d,0xa0,0x00,0x06,0x0d,0xb8,0x00,0x06,0x0d,0xd0,0x00,0x06,0x0d,0xe8,0x00,0x06,0x0e,0x00,0x00,0x06,0x0e,0x18,0x00,0x06,0x0e,0x30,0x00,0x06,0x0e,0x54,0x00,0x06,0x0e,0x7c,0x00,0x06,0x0e,0xa8,0x00,0x06,0x0e,0xd4, +0x00,0x06,0x0e,0xf8,0x00,0x06,0x0f,0x20,0x00,0x06,0x0f,0x4c,0x00,0x06,0x0f,0x78,0x00,0x06,0x0f,0x9e,0x00,0x06,0x0f,0xc2,0x00,0x06,0x0f,0xe6,0x00,0x06,0x10,0x0a,0x00,0x06,0x10,0x24,0x00,0x06,0x10,0x3e,0x00,0x06,0x10,0x58,0x00,0x06,0x10,0x72,0x00,0x06,0x10,0x9a,0x00,0x06,0x10,0xbe,0x00,0x06,0x10,0xe6,0x00,0x06,0x11,0x0a, +0x00,0x06,0x12,0x42,0x00,0x06,0x13,0xbc,0x00,0x06,0x13,0xe0,0x00,0x06,0x14,0x04,0x00,0x06,0x14,0x28,0x00,0x06,0x14,0x4c,0x00,0x06,0x14,0x70,0x00,0x06,0x14,0x94,0x00,0x06,0x14,0xac,0x00,0x06,0x14,0xc4,0x00,0x06,0x14,0xdc,0x00,0x06,0x14,0xf4,0x00,0x06,0x15,0x0c,0x00,0x06,0x15,0x24,0x00,0x06,0x15,0x3c,0x00,0x06,0x15,0x54, +0x00,0x06,0x15,0x86,0x00,0x06,0x15,0xd2,0x00,0x06,0x16,0x1a,0x00,0x06,0x16,0x8a,0x00,0x06,0x16,0xf2,0x00,0x06,0x17,0x56,0x00,0x06,0x17,0xd0,0x00,0x06,0x18,0x8c,0x00,0x06,0x19,0x34,0x00,0x06,0x19,0x60,0x00,0x06,0x19,0xd0,0x00,0x06,0x1a,0x48,0x00,0x06,0x1a,0x74,0x00,0x06,0x1a,0xbc,0x00,0x06,0x1b,0x08,0x00,0x06,0x1b,0xde, +0x00,0x06,0x1c,0x78,0x00,0x06,0x1d,0x76,0x00,0x06,0x1d,0x98,0x00,0x06,0x1d,0xae,0x00,0x06,0x1d,0xc4,0x00,0x06,0x1d,0xee,0x00,0x06,0x1e,0x04,0x00,0x06,0x1e,0x28,0x00,0x06,0x1e,0x3e,0x00,0x06,0x1e,0x56,0x00,0x06,0x1e,0x7a,0x00,0x06,0x1e,0x9e,0x00,0x06,0x1f,0x82,0x00,0x06,0x20,0x96,0x00,0x06,0x20,0xae,0x00,0x06,0x20,0xc6, +0x00,0x06,0x20,0xe6,0x00,0x06,0x21,0x06,0x00,0x06,0x21,0x1e,0x00,0x06,0x21,0x36,0x00,0x06,0x21,0x56,0x00,0x06,0x21,0x76,0x00,0x06,0x21,0x96,0x00,0x06,0x21,0xb6,0x00,0x06,0x21,0xce,0x00,0x06,0x21,0xe6,0x00,0x06,0x21,0xfe,0x00,0x06,0x22,0x16,0x00,0x06,0x22,0x44,0x00,0x06,0x22,0x72,0x00,0x06,0x22,0x96,0x00,0x06,0x22,0xba, +0x00,0x06,0x22,0xd2,0x00,0x06,0x22,0xea,0x00,0x06,0x23,0xec,0x00,0x06,0x25,0x12,0x00,0x06,0x25,0x2a,0x00,0x06,0x25,0x42,0x00,0x06,0x25,0x5a,0x00,0x06,0x25,0x72,0x00,0x06,0x25,0x8a,0x00,0x06,0x25,0xa2,0x00,0x06,0x25,0xc2,0x00,0x06,0x25,0xe2,0x00,0x06,0x26,0x42,0x00,0x06,0x26,0xc8,0x00,0x06,0x26,0xde,0x00,0x06,0x26,0xf4, +0x00,0x06,0x27,0x0c,0x00,0x06,0x27,0x24,0x00,0x06,0x27,0x4c,0x00,0x06,0x27,0x74,0x00,0x06,0x27,0x8c,0x00,0x06,0x27,0xa4,0x00,0x06,0x27,0xbc,0x00,0x06,0x27,0xd4,0x00,0x06,0x28,0x68,0x00,0x06,0x28,0x80,0x00,0x06,0x28,0x98,0x00,0x06,0x28,0xb0,0x00,0x06,0x28,0xc8,0x00,0x06,0x28,0xe0,0x00,0x06,0x29,0x04,0x00,0x06,0x29,0x24, +0x00,0x06,0x29,0x3c,0x00,0x06,0x29,0x54,0x00,0x06,0x29,0x6c,0x00,0x06,0x29,0x84,0x00,0x06,0x29,0x9c,0x00,0x06,0x29,0xb4,0x00,0x06,0x29,0xe2,0x00,0x06,0x2a,0x06,0x00,0x06,0x2a,0x2a,0x00,0x06,0x2a,0x42,0x00,0x06,0x2a,0x5a,0x00,0x06,0x2b,0x30,0x00,0x06,0x2b,0x48,0x00,0x06,0x2b,0x60,0x00,0x06,0x2c,0x54,0x00,0x06,0x2c,0x6c, +0x00,0x06,0x2c,0x84,0x00,0x06,0x2c,0xac,0x00,0x06,0x2c,0xd4,0x00,0x06,0x2c,0xf8,0x00,0x06,0x2d,0xc4,0x00,0x06,0x2e,0x52,0x00,0x06,0x2e,0xe0,0x00,0x06,0x2e,0xf8,0x00,0x06,0x2f,0x10,0x00,0x06,0x2f,0x34,0x00,0x06,0x2f,0x58,0x00,0x06,0x2f,0x7c,0x00,0x06,0x2f,0xa0,0x00,0x06,0x2f,0xb0,0x00,0x06,0x2f,0xc8,0x00,0x06,0x2f,0xe0, +0x00,0x06,0x30,0x2c,0x00,0x06,0x30,0xa6,0x00,0x06,0x31,0x7a,0x00,0x06,0x31,0x92,0x00,0x06,0x32,0x5e,0x00,0x06,0x33,0xde,0x00,0x06,0x34,0xa2,0x00,0x06,0x35,0xf2,0x00,0x06,0x37,0x50,0x00,0x06,0x38,0x28,0x00,0x06,0x39,0x6a,0x00,0x06,0x39,0xde,0x00,0x06,0x3a,0x5a,0x00,0x06,0x3a,0xe2,0x00,0x06,0x3b,0x60,0x00,0x06,0x3b,0xd8, +0x00,0x06,0x3c,0x58,0x00,0x06,0x3c,0xc0,0x00,0x06,0x3d,0x30,0x00,0x06,0x3d,0x9e,0x00,0x06,0x3e,0x18,0x00,0x06,0x3e,0xae,0x00,0x06,0x3f,0x26,0x00,0x06,0x3f,0xec,0x00,0x06,0x40,0x96,0x00,0x06,0x41,0x80,0x00,0x06,0x42,0x66,0x00,0x06,0x43,0x28,0x00,0x06,0x44,0x24,0x00,0x06,0x44,0xf2,0x00,0x06,0x45,0x76,0x00,0x06,0x46,0x2e, +0x00,0x06,0x46,0xb2,0x00,0x06,0x47,0x5a,0x00,0x06,0x48,0x2a,0x00,0x06,0x48,0xd6,0x00,0x06,0x49,0xc6,0x00,0x06,0x4a,0xc0,0x00,0x06,0x4b,0xa6,0x00,0x06,0x4c,0x7a,0x00,0x06,0x4d,0xa0,0x00,0x06,0x4e,0xb8,0x00,0x06,0x4f,0x2e,0x00,0x06,0x4f,0xc4,0x00,0x06,0x50,0x7a,0x00,0x06,0x51,0x64,0x00,0x06,0x52,0x40,0x00,0x06,0x52,0xde, +0x00,0x06,0x53,0xc8,0x00,0x06,0x54,0x5a,0x00,0x06,0x54,0xe8,0x00,0x06,0x55,0xa4,0x00,0x06,0x56,0x1e,0x00,0x06,0x56,0xc2,0x00,0x06,0x57,0x8e,0x00,0x06,0x58,0x6a,0x00,0x06,0x59,0x28,0x00,0x06,0x59,0xda,0x00,0x06,0x5a,0xe6,0x00,0x06,0x5b,0xbe,0x00,0x06,0x5c,0x3e,0x00,0x06,0x5c,0xf6,0x00,0x06,0x5d,0x74,0x00,0x06,0x5e,0x1c, +0x00,0x06,0x5e,0xce,0x00,0x06,0x5f,0xb8,0x00,0x06,0x60,0x86,0x00,0x06,0x61,0xae,0x00,0x06,0x62,0x92,0x00,0x06,0x63,0x7e,0x00,0x06,0x63,0xb4,0x00,0x06,0x64,0x46,0x00,0x06,0x64,0xc2,0x00,0x06,0x65,0xa8,0x00,0x06,0x66,0xae,0x00,0x06,0x67,0x64,0x00,0x06,0x68,0x2c,0x00,0x06,0x69,0x40,0x00,0x06,0x6a,0x72,0x00,0x06,0x6b,0x30, +0x00,0x06,0x6c,0x6a,0x00,0x06,0x6d,0xd4,0x00,0x06,0x6e,0x64,0x00,0x06,0x6f,0x08,0x00,0x06,0x6f,0xd2,0x00,0x06,0x70,0x9c,0x00,0x06,0x71,0xa0,0x00,0x06,0x72,0xde,0x00,0x06,0x73,0x72,0x00,0x06,0x74,0x4c,0x00,0x06,0x74,0xfa,0x00,0x06,0x75,0x8e,0x00,0x06,0x76,0x1e,0x00,0x06,0x76,0xbc,0x00,0x06,0x77,0x76,0x00,0x06,0x78,0x9c, +0x00,0x06,0x79,0xc0,0x00,0x06,0x7b,0x2a,0x00,0x06,0x7c,0x0c,0x00,0x06,0x7c,0xc2,0x00,0x06,0x7d,0xb2,0x00,0x06,0x7e,0xb4,0x00,0x06,0x7f,0x2e,0x00,0x06,0x7f,0xd4,0x00,0x06,0x80,0x7c,0x00,0x06,0x81,0x5a,0x00,0x06,0x82,0x82,0x00,0x06,0x83,0xce,0x00,0x06,0x84,0xf2,0x00,0x06,0x85,0xd2,0x00,0x06,0x86,0xc0,0x00,0x06,0x88,0x22, +0x00,0x06,0x88,0x9e,0x00,0x06,0x89,0x9e,0x00,0x06,0x8a,0xdc,0x00,0x06,0x8b,0xf4,0x00,0x06,0x8d,0x42,0x00,0x06,0x8e,0xea,0x00,0x06,0x8f,0xe6,0x00,0x06,0x91,0x2a,0x00,0x06,0x92,0x82,0x00,0x06,0x93,0xc2,0x00,0x06,0x94,0x4c,0x00,0x06,0x95,0x4e,0x00,0x06,0x96,0x3c,0x00,0x06,0x97,0xc8,0x00,0x06,0x99,0x3c,0x00,0x06,0x9b,0x16, +0x00,0x06,0x9c,0xdc,0x00,0x06,0x9e,0x20,0x00,0x06,0xa0,0x10,0x00,0x06,0xa1,0x2e,0x00,0x06,0xa1,0xa8,0x00,0x06,0xa2,0x44,0x00,0x06,0xa2,0xee,0x00,0x06,0xa3,0xe6,0x00,0x06,0xa4,0x90,0x00,0x06,0xa5,0x24,0x00,0x06,0xa5,0xec,0x00,0x06,0xa6,0xb8,0x00,0x06,0xa7,0x38,0x00,0x06,0xa7,0xec,0x00,0x06,0xa8,0x66,0x00,0x06,0xa8,0xf2, +0x00,0x06,0xa9,0x54,0x00,0x06,0xaa,0x04,0x00,0x06,0xaa,0xb0,0x00,0x06,0xab,0xa2,0x00,0x06,0xac,0xba,0x00,0x06,0xad,0x8e,0x00,0x06,0xae,0x4a,0x00,0x06,0xaf,0x66,0x00,0x06,0xaf,0xe4,0x00,0x06,0xb0,0x40,0x00,0x06,0xb0,0xd8,0x00,0x06,0xb1,0x46,0x00,0x06,0xb1,0xac,0x00,0x06,0xb2,0x40,0x00,0x06,0xb2,0xd6,0x00,0x06,0xb3,0x2a, +0x00,0x06,0xb4,0x1e,0x00,0x06,0xb5,0x10,0x00,0x06,0xb5,0x92,0x00,0x06,0xb6,0x6e,0x00,0x06,0xb7,0xdc,0x00,0x06,0xb8,0xc8,0x00,0x06,0xb9,0xe6,0x00,0x06,0xbb,0x7e,0x00,0x06,0xbc,0x9e,0x00,0x06,0xbd,0xca,0x00,0x06,0xbe,0xf6,0x00,0x06,0xc0,0x34,0x00,0x06,0xc0,0xb8,0x00,0x06,0xc1,0x84,0x00,0x06,0xc2,0x8a,0x00,0x06,0xc3,0xbe, +0x00,0x06,0xc4,0x62,0x00,0x06,0xc5,0x48,0x00,0x06,0xc6,0x4a,0x00,0x06,0xc7,0x48,0x00,0x06,0xc8,0x20,0x00,0x06,0xc9,0x02,0x00,0x06,0xc9,0x7c,0x00,0x06,0xc9,0xec,0x00,0x06,0xca,0xb6,0x00,0x06,0xcb,0x68,0x00,0x06,0xcc,0x1e,0x00,0x06,0xcd,0x0a,0x00,0x06,0xcd,0xf0,0x00,0x06,0xce,0xe0,0x00,0x06,0xcf,0x48,0x00,0x06,0xd0,0x06, +0x00,0x06,0xd0,0xbc,0x00,0x06,0xd1,0xc8,0x00,0x06,0xd1,0xf2,0x00,0x06,0xd3,0x3c,0x00,0x06,0xd4,0x46,0x00,0x06,0xd4,0xea,0x00,0x06,0xd5,0x96,0x00,0x06,0xd6,0x70,0x00,0x06,0xd7,0x4a,0x00,0x06,0xd8,0x6a,0x00,0x06,0xd9,0xb0,0x00,0x06,0xda,0x42,0x00,0x06,0xda,0xec,0x00,0x06,0xdb,0xc6,0x00,0x06,0xdc,0xaa,0x00,0x06,0xdd,0x6e, +0x00,0x06,0xde,0x6e,0x00,0x06,0xdf,0x10,0x00,0x06,0xdf,0xa8,0x00,0x06,0xe0,0x40,0x00,0x06,0xe0,0xb6,0x00,0x06,0xe0,0xc6,0x00,0x06,0xe0,0xec,0x00,0x06,0xe1,0x1a,0x00,0x06,0xe1,0x4e,0x00,0x06,0xe1,0x5e,0x00,0x06,0xe1,0x8e,0x00,0x06,0xe1,0xbc,0x00,0x06,0xe1,0xf2,0x00,0x06,0xe2,0x28,0x00,0x06,0xe2,0x5e,0x00,0x06,0xe2,0x94, +0x00,0x06,0xe2,0xca,0x00,0x06,0xe3,0x00,0x00,0x06,0xe3,0x2e,0x00,0x06,0xe3,0x5c,0x00,0x06,0xe3,0x8a,0x00,0x06,0xe3,0xbc,0x00,0x06,0xe3,0xee,0x00,0x06,0xe4,0x20,0x00,0x06,0xe4,0x30,0x00,0x06,0xe4,0x54,0x00,0x06,0xe4,0x64,0x00,0x06,0xe4,0x92,0x00,0x06,0xe4,0xaa,0x00,0x06,0xe4,0xd8,0x00,0x06,0xe4,0xfc,0x00,0x06,0xe5,0x2c, +0x00,0x06,0xe5,0x5a,0x00,0x06,0xe5,0x88,0x00,0x06,0xe5,0xbe,0x00,0x06,0xe5,0xec,0x00,0x06,0xe6,0x1a,0x00,0x06,0xe6,0x48,0x00,0x06,0xe6,0x76,0x00,0x06,0xe6,0xa4,0x00,0x06,0xe6,0xd2,0x00,0x06,0xe8,0x96,0x00,0x06,0xea,0x76,0x00,0x06,0xec,0x72,0x00,0x06,0xee,0x4e,0x00,0x06,0xef,0x2e,0x00,0x06,0xf0,0x3c,0x00,0x06,0xf1,0xda, +0x00,0x06,0xf2,0x78,0x00,0x06,0xf3,0x62,0x00,0x06,0xf4,0x36,0x00,0x06,0xf4,0xaa,0x00,0x06,0xf5,0x16,0x00,0x06,0xf5,0xe0,0x00,0x06,0xf6,0xcc,0x00,0x06,0xf7,0xc0,0x00,0x06,0xf9,0x00,0x00,0x06,0xf9,0x86,0x00,0x06,0xfa,0xe8,0x00,0x06,0xfb,0xce,0x00,0x06,0xfd,0x0c,0x00,0x06,0xfe,0xa2,0x00,0x07,0x00,0x16,0x00,0x07,0x01,0x4c, +0x00,0x07,0x02,0x24,0x00,0x07,0x03,0x26,0x00,0x07,0x04,0x1a,0x00,0x07,0x05,0x08,0x00,0x07,0x06,0x42,0x00,0x07,0x07,0xa8,0x00,0x07,0x08,0xea,0x00,0x07,0x09,0xe4,0x00,0x07,0x0a,0x7e,0x00,0x07,0x0b,0x2c,0x00,0x07,0x0d,0x52,0x00,0x07,0x0e,0x90,0x00,0x07,0x0f,0xa8,0x00,0x07,0x10,0xa4,0x00,0x07,0x11,0x64,0x00,0x07,0x12,0x8a, +0x00,0x07,0x13,0x32,0x00,0x07,0x14,0x3a,0x00,0x07,0x15,0xcc,0x00,0x07,0x16,0xda,0x00,0x07,0x18,0x22,0x00,0x07,0x18,0x6a,0x00,0x07,0x18,0x98,0x00,0x07,0x18,0xee,0x00,0x07,0x19,0x1a,0x00,0x07,0x19,0x44,0x00,0x07,0x19,0x7c,0x00,0x07,0x19,0xde,0x00,0x07,0x1a,0x34,0x00,0x07,0x1a,0x5e,0x00,0x07,0x1a,0xa6,0x00,0x07,0x1a,0xee, +0x00,0x07,0x1b,0x1a,0x00,0x07,0x1b,0xcc,0x00,0x07,0x1c,0x78,0x00,0x07,0x1c,0xd8,0x00,0x07,0x1d,0x32,0x00,0x07,0x1d,0x92,0x00,0x07,0x1e,0x3a,0x00,0x07,0x1e,0x98,0x00,0x07,0x1f,0x42,0x00,0x07,0x20,0x52,0x00,0x07,0x20,0x64,0x00,0x07,0x23,0xe8,0x00,0x07,0x27,0x46,0x00,0x07,0x2a,0xd6,0x00,0x07,0x2b,0x02,0x00,0x07,0x2b,0x2e, +0x00,0x07,0x2b,0x5a,0x00,0x07,0x2b,0x86,0x00,0x07,0x2b,0xb2,0x00,0x07,0x2b,0xde,0x00,0x07,0x2c,0x16,0x00,0x07,0x2c,0x4e,0x00,0x07,0x2c,0x84,0x00,0x07,0x2c,0xba,0x00,0x07,0x2c,0xee,0x00,0x07,0x2d,0x22,0x00,0x07,0x2d,0x56,0x00,0x07,0x2d,0x8a,0x00,0x07,0x2d,0xbe,0x00,0x07,0x2d,0xea,0x00,0x07,0x2e,0x16,0x00,0x07,0x2e,0x42, +0x00,0x07,0x2e,0xe0,0x00,0x07,0x2f,0x62,0x00,0x07,0x2f,0x98,0x00,0x07,0x30,0x0a,0x00,0x07,0x30,0x80,0x00,0x07,0x31,0x16,0x00,0x07,0x31,0x70,0x00,0x07,0x31,0xc4,0x00,0x07,0x32,0x1e,0x00,0x07,0x32,0x72,0x00,0x07,0x32,0xd4,0x00,0x07,0x33,0x16,0x00,0x07,0x33,0x9e,0x00,0x07,0x33,0xfe,0x00,0x07,0x34,0x3e,0x00,0x07,0x34,0x9a, +0x00,0x07,0x34,0xf2,0x00,0x07,0x35,0x4a,0x00,0x07,0x35,0xa2,0x00,0x07,0x36,0x12,0x00,0x07,0x36,0xd0,0x00,0x07,0x37,0x4a,0x00,0x07,0x37,0xe0,0x00,0x07,0x38,0x5a,0x00,0x07,0x38,0xee,0x00,0x07,0x39,0x88,0x00,0x07,0x3a,0x10,0x00,0x07,0x3a,0x9c,0x00,0x07,0x3b,0x6a,0x00,0x07,0x3b,0xfc,0x00,0x07,0x3c,0xa2,0x00,0x07,0x3d,0x6a, +0x00,0x07,0x3e,0x1c,0x00,0x07,0x3e,0xc6,0x00,0x07,0x3f,0xac,0x00,0x07,0x40,0x8c,0x00,0x07,0x41,0x2c,0x00,0x07,0x41,0xbc,0x00,0x07,0x42,0x16,0x00,0x07,0x42,0x72,0x00,0x07,0x43,0x16,0x00,0x07,0x43,0xae,0x00,0x07,0x44,0xac,0x00,0x07,0x45,0x58,0x00,0x07,0x46,0x46,0x00,0x07,0x47,0x0a,0x00,0x07,0x47,0x96,0x00,0x07,0x48,0x1a, +0x00,0x07,0x48,0xb2,0x00,0x07,0x49,0x48,0x00,0x07,0x49,0xf6,0x00,0x07,0x4a,0xa0,0x00,0x07,0x4b,0x50,0x00,0x07,0x4b,0xe8,0x00,0x07,0x4c,0x8e,0x00,0x07,0x4d,0x66,0x00,0x07,0x4d,0xe4,0x00,0x07,0x4e,0x5a,0x00,0x07,0x4f,0x4e,0x00,0x07,0x50,0x40,0x00,0x07,0x50,0xea,0x00,0x07,0x51,0x94,0x00,0x07,0x52,0x22,0x00,0x07,0x52,0xb0, +0x00,0x07,0x53,0x0a,0x00,0x07,0x53,0x64,0x00,0x07,0x53,0xf4,0x00,0x07,0x54,0x80,0x00,0x07,0x54,0xfa,0x00,0x07,0x55,0x60,0x00,0x07,0x56,0x0e,0x00,0x07,0x56,0x9c,0x00,0x07,0x57,0x4e,0x00,0x07,0x57,0xee,0x00,0x07,0x58,0xca,0x00,0x07,0x59,0x94,0x00,0x07,0x5a,0xd0,0x00,0x07,0x5b,0xf8,0x00,0x07,0x5f,0x70,0x00,0x07,0x5f,0xbc, +0x00,0x07,0x61,0x1e,0x00,0x07,0x61,0x9c,0x00,0x07,0x62,0xf2,0x00,0x07,0x63,0xa8,0x00,0x07,0x63,0xee,0x00,0x07,0x64,0x54,0x00,0x07,0x64,0x9a,0x00,0x07,0x65,0x00,0x00,0x07,0x65,0x9a,0x00,0x07,0x66,0x2e,0x00,0x07,0x66,0xbe,0x00,0x07,0x67,0x50,0x00,0x07,0x68,0x5e,0x00,0x07,0x69,0x64,0x00,0x07,0x69,0xfe,0x00,0x07,0x6a,0x9e, +0x00,0x07,0x6b,0x7c,0x00,0x07,0x6c,0x60,0x00,0x07,0x6c,0xfa,0x00,0x07,0x6d,0x90,0x00,0x07,0x6d,0xf0,0x00,0x07,0x6e,0x50,0x00,0x07,0x6f,0x04,0x00,0x07,0x6f,0xb4,0x00,0x07,0x70,0x26,0x00,0x07,0x70,0x94,0x00,0x07,0x71,0x10,0x00,0x07,0x71,0x88,0x00,0x07,0x72,0x04,0x00,0x07,0x72,0x88,0x00,0x07,0x73,0x5a,0x00,0x07,0x74,0x24, +0x00,0x07,0x74,0xc4,0x00,0x07,0x76,0x6c,0x00,0x07,0x76,0xaa,0x00,0x07,0x76,0xec,0x00,0x07,0x77,0x6e,0x00,0x07,0x78,0x3c,0x00,0x07,0x78,0x3c,0x00,0x07,0x78,0x54,0x00,0x07,0x79,0x28,0x00,0x07,0x79,0xb4,0x00,0x07,0x7b,0x6e,0x00,0x07,0x7d,0x2a,0x00,0x07,0x7d,0x4e,0x00,0x07,0x7d,0x78,0x00,0x07,0x7e,0x02,0x00,0x07,0x7e,0x74, +0x00,0x07,0x7e,0xf6,0x00,0x07,0x7f,0xaa,0x00,0x07,0x80,0x04,0x00,0x07,0x80,0x8e,0x00,0x07,0x81,0x4c,0x00,0x07,0x81,0x92,0x00,0x07,0x82,0x84,0x00,0x07,0x83,0x42,0x00,0x07,0x83,0xba,0x00,0x07,0x83,0xca,0x00,0x07,0x85,0x86,0x00,0x07,0x87,0x42,0x00,0x07,0x89,0x66,0x00,0x07,0x8b,0x76,0x00,0x07,0x8d,0x72,0x00,0x07,0x8f,0x3e, +0x00,0x07,0x91,0x0c,0x00,0x07,0x92,0xda,0x00,0x07,0x94,0xf4,0x00,0x07,0x95,0xc6,0x00,0x07,0x96,0x1e,0x00,0x07,0x96,0x9a,0x00,0x07,0x97,0x08,0x00,0x07,0x97,0x92,0x00,0x07,0x98,0x28,0x00,0x07,0x98,0xa0,0x00,0x07,0x99,0x3a,0x00,0x07,0x99,0xbc,0x00,0x07,0x9a,0x10,0x00,0x07,0x9a,0x86,0x00,0x07,0x9a,0xea,0x00,0x07,0x9b,0x5c, +0x00,0x07,0x9b,0xe8,0x00,0x07,0x9c,0x5c,0x00,0x07,0x9d,0x06,0x00,0x07,0x9d,0xa6,0x00,0x07,0x9e,0x32,0x00,0x07,0x9e,0xc2,0x00,0x07,0x9f,0x78,0x00,0x07,0xa0,0x2a,0x00,0x07,0xa0,0x76,0x00,0x07,0xa0,0xd6,0x00,0x07,0xa1,0x3e,0x00,0x07,0xa1,0xc0,0x00,0x07,0xa2,0x4a,0x00,0x07,0xa2,0xa0,0x00,0x07,0xa3,0x22,0x00,0x07,0xa3,0x74, +0x00,0x07,0xa3,0xc6,0x00,0x07,0xa4,0x38,0x00,0x07,0xa4,0x8c,0x00,0x07,0xa4,0xf4,0x00,0x07,0xa5,0x6a,0x00,0x07,0xa5,0xec,0x00,0x07,0xa6,0x52,0x00,0x07,0xa6,0xba,0x00,0x07,0xa7,0x56,0x00,0x07,0xa7,0xda,0x00,0x07,0xa8,0x28,0x00,0x07,0xa8,0x88,0x00,0x07,0xa8,0xe4,0x00,0x07,0xa9,0x52,0x00,0x07,0xa9,0xc6,0x00,0x07,0xaa,0x58, +0x00,0x07,0xaa,0xd2,0x00,0x07,0xab,0x8a,0x00,0x07,0xac,0x18,0x00,0x07,0xac,0xb4,0x00,0x07,0xac,0xd4,0x00,0x07,0xad,0x2a,0x00,0x07,0xad,0x86,0x00,0x07,0xae,0x14,0x00,0x07,0xae,0xb8,0x00,0x07,0xaf,0x1c,0x00,0x07,0xaf,0x94,0x00,0x07,0xb0,0x46,0x00,0x07,0xb0,0xfe,0x00,0x07,0xb1,0x7a,0x00,0x07,0xb2,0x3c,0x00,0x07,0xb3,0x16, +0x00,0x07,0xb3,0x82,0x00,0x07,0xb3,0xe8,0x00,0x07,0xb4,0x6c,0x00,0x07,0xb4,0xe4,0x00,0x07,0xb5,0x82,0x00,0x07,0xb6,0x42,0x00,0x07,0xb6,0x9e,0x00,0x07,0xb7,0x24,0x00,0x07,0xb7,0x90,0x00,0x07,0xb7,0xec,0x00,0x07,0xb8,0x58,0x00,0x07,0xb8,0xc0,0x00,0x07,0xb9,0x36,0x00,0x07,0xb9,0xe2,0x00,0x07,0xba,0x94,0x00,0x07,0xbb,0x66, +0x00,0x07,0xbb,0xe4,0x00,0x07,0xbc,0x58,0x00,0x07,0xbc,0xf0,0x00,0x07,0xbd,0x82,0x00,0x07,0xbd,0xda,0x00,0x07,0xbe,0x4a,0x00,0x07,0xbe,0xb4,0x00,0x07,0xbf,0x42,0x00,0x07,0xbf,0xfe,0x00,0x07,0xc0,0xda,0x00,0x07,0xc1,0x94,0x00,0x07,0xc2,0x2c,0x00,0x07,0xc2,0xc2,0x00,0x07,0xc3,0xa0,0x00,0x07,0xc3,0xfc,0x00,0x07,0xc4,0x9e, +0x00,0x07,0xc5,0x6c,0x00,0x07,0xc6,0x12,0x00,0x07,0xc6,0xdc,0x00,0x07,0xc7,0xda,0x00,0x07,0xc8,0x72,0x00,0x07,0xc9,0x3c,0x00,0x07,0xca,0x16,0x00,0x07,0xca,0xdc,0x00,0x07,0xcb,0x46,0x00,0x07,0xcb,0xe6,0x00,0x07,0xcc,0x7a,0x00,0x07,0xcd,0x7e,0x00,0x07,0xce,0x68,0x00,0x07,0xcf,0x88,0x00,0x07,0xd0,0xa2,0x00,0x07,0xd1,0x60, +0x00,0x07,0xd2,0xaa,0x00,0x07,0xd3,0x64,0x00,0x07,0xd3,0xc0,0x00,0x07,0xd4,0x26,0x00,0x07,0xd4,0x98,0x00,0x07,0xd5,0x2c,0x00,0x07,0xd5,0xa2,0x00,0x07,0xd5,0xfc,0x00,0x07,0xd6,0x86,0x00,0x07,0xd7,0x0c,0x00,0x07,0xd7,0x5c,0x00,0x07,0xd7,0xd2,0x00,0x07,0xd8,0x2a,0x00,0x07,0xd8,0x82,0x00,0x07,0xd8,0xc0,0x00,0x07,0xd9,0x28, +0x00,0x07,0xd9,0x90,0x00,0x07,0xda,0x26,0x00,0x07,0xda,0xce,0x00,0x07,0xdb,0x60,0x00,0x07,0xdb,0xd4,0x00,0x07,0xdc,0x7e,0x00,0x07,0xdc,0xd8,0x00,0x07,0xdd,0x08,0x00,0x07,0xdd,0x6e,0x00,0x07,0xdd,0xb0,0x00,0x07,0xdd,0xe0,0x00,0x07,0xde,0x3e,0x00,0x07,0xde,0x9e,0x00,0x07,0xde,0xc8,0x00,0x07,0xdf,0x64,0x00,0x07,0xdf,0xfc, +0x00,0x07,0xe0,0x58,0x00,0x07,0xe0,0xde,0x00,0x07,0xe1,0xc6,0x00,0x07,0xe2,0x54,0x00,0x07,0xe3,0x04,0x00,0x07,0xe3,0xfa,0x00,0x07,0xe4,0xa4,0x00,0x07,0xe5,0x5a,0x00,0x07,0xe6,0x1a,0x00,0x07,0xe6,0xd4,0x00,0x07,0xe7,0x38,0x00,0x07,0xe7,0xc6,0x00,0x07,0xe8,0x7e,0x00,0x07,0xe9,0x66,0x00,0x07,0xe9,0xde,0x00,0x07,0xea,0x7a, +0x00,0x07,0xeb,0x32,0x00,0x07,0xeb,0xe6,0x00,0x07,0xec,0x7e,0x00,0x07,0xed,0x20,0x00,0x07,0xed,0x76,0x00,0x07,0xed,0xc0,0x00,0x07,0xee,0x3a,0x00,0x07,0xee,0xac,0x00,0x07,0xef,0x1c,0x00,0x07,0xef,0xae,0x00,0x07,0xf0,0x44,0x00,0x07,0xf0,0xd6,0x00,0x07,0xf1,0x14,0x00,0x07,0xf1,0x86,0x00,0x07,0xf1,0xf0,0x00,0x07,0xf2,0xa0, +0x00,0x07,0xf2,0xb8,0x00,0x07,0xf3,0x82,0x00,0x07,0xf4,0x1e,0x00,0x07,0xf4,0x66,0x00,0x07,0xf4,0xc8,0x00,0x07,0xf5,0x44,0x00,0x07,0xf5,0xc6,0x00,0x07,0xf6,0x78,0x00,0x07,0xf7,0x3c,0x00,0x07,0xf7,0x5c,0x00,0x07,0xf7,0x80,0x00,0x07,0xf7,0xa4,0x00,0x07,0xf7,0xb4,0x00,0x07,0xf7,0xce,0x00,0x07,0xf7,0xde,0x00,0x07,0xf7,0xf6, +0x00,0x07,0xf8,0x0e,0x00,0x07,0xf8,0x26,0x00,0x07,0xf8,0x3e,0x00,0x07,0xf8,0xe2,0x00,0x07,0xf9,0x6e,0x00,0x07,0xf9,0xc0,0x00,0x07,0xfa,0x14,0x00,0x07,0xfa,0x96,0x00,0x07,0xfb,0x18,0x00,0x07,0xfb,0xe0,0x00,0x07,0xfc,0xb4,0x00,0x07,0xfd,0x74,0x00,0x07,0xfe,0x36,0x00,0x07,0xfe,0xd4,0x00,0x07,0xff,0x68,0x00,0x08,0x00,0x3e, +0x00,0x08,0x01,0x08,0x00,0x08,0x01,0x5a,0x00,0x08,0x01,0xf4,0x00,0x08,0x02,0xd2,0x00,0x08,0x03,0xf6,0x00,0x08,0x04,0xd6,0x00,0x08,0x05,0xce,0x00,0x08,0x06,0x6e,0x00,0x08,0x07,0x4e,0x00,0x08,0x07,0xe8,0x00,0x08,0x08,0xaa,0x00,0x08,0x09,0x68,0x00,0x08,0x0a,0x42,0x00,0x08,0x0b,0x0c,0x00,0x08,0x0b,0xf8,0x00,0x08,0x0c,0xa2, +0x00,0x08,0x0d,0x40,0x00,0x08,0x0d,0xda,0x00,0x08,0x0e,0x66,0x00,0x08,0x0f,0x06,0x00,0x08,0x0f,0x92,0x00,0x08,0x10,0x54,0x00,0x08,0x11,0x0c,0x00,0x08,0x11,0x62,0x00,0x08,0x11,0xb4,0x00,0x08,0x12,0x0e,0x00,0x08,0x12,0x62,0x00,0x08,0x13,0x1e,0x00,0x08,0x13,0xc4,0x00,0x08,0x14,0xa6,0x00,0x08,0x15,0x72,0x00,0x08,0x16,0x6a, +0x00,0x08,0x17,0x3c,0x00,0x08,0x17,0xdc,0x00,0x08,0x18,0x98,0x00,0x08,0x19,0x38,0x00,0x08,0x19,0xe8,0x00,0x08,0x1a,0xac,0x00,0x08,0x1b,0x86,0x00,0x08,0x1c,0x62,0x00,0x08,0x1d,0x20,0x00,0x08,0x1e,0x26,0x00,0x08,0x1f,0x12,0x00,0x08,0x1f,0xa2,0x00,0x08,0x20,0x2e,0x00,0x08,0x20,0xda,0x00,0x08,0x21,0x82,0x00,0x08,0x22,0x12, +0x00,0x08,0x22,0xaa,0x00,0x08,0x23,0x94,0x00,0x08,0x24,0x74,0x00,0x08,0x25,0x4c,0x00,0x08,0x26,0x24,0x00,0x08,0x26,0xd4,0x00,0x08,0x27,0x92,0x00,0x08,0x28,0x2e,0x00,0x08,0x28,0xe8,0x00,0x08,0x29,0x40,0x00,0x08,0x29,0x94,0x00,0x08,0x2a,0x4a,0x00,0x08,0x2b,0x04,0x00,0x08,0x2b,0xb2,0x00,0x08,0x2c,0x60,0x00,0x08,0x2d,0x0e, +0x00,0x08,0x2d,0xba,0x00,0x08,0x2e,0x68,0x00,0x08,0x2f,0x2a,0x00,0x08,0x2f,0x8a,0x00,0x08,0x30,0x60,0x00,0x08,0x30,0xfc,0x00,0x08,0x31,0x86,0x00,0x08,0x32,0x52,0x00,0x08,0x33,0x20,0x00,0x08,0x33,0xfa,0x00,0x08,0x34,0x8e,0x00,0x08,0x35,0x2c,0x00,0x08,0x35,0xa0,0x00,0x08,0x36,0x10,0x00,0x08,0x36,0xe6,0x00,0x08,0x37,0xba, +0x00,0x08,0x38,0x80,0x00,0x08,0x38,0xba,0x00,0x08,0x38,0xea,0x00,0x08,0x39,0x7c,0x00,0x08,0x3a,0x06,0x00,0x08,0x3a,0x64,0x00,0x08,0x3a,0xc0,0x00,0x08,0x3b,0x56,0x00,0x08,0x3b,0xd0,0x00,0x08,0x3c,0x20,0x00,0x08,0x3c,0xfa,0x00,0x08,0x3d,0x8c,0x00,0x08,0x3e,0x08,0x00,0x08,0x3e,0xaa,0x00,0x08,0x3f,0x34,0x00,0x08,0x40,0x22, +0x00,0x08,0x41,0x1a,0x00,0x08,0x41,0xe2,0x00,0x08,0x42,0x96,0x00,0x08,0x43,0x7a,0x00,0x08,0x44,0x30,0x00,0x08,0x45,0x20,0x00,0x08,0x45,0xb8,0x00,0x08,0x46,0x96,0x00,0x08,0x47,0x70,0x00,0x08,0x47,0xf4,0x00,0x08,0x48,0x9c,0x00,0x08,0x49,0xa6,0x00,0x08,0x4a,0x40,0x00,0x08,0x4a,0x94,0x00,0x08,0x4b,0x02,0x00,0x08,0x4b,0x9c, +0x00,0x08,0x4b,0xce,0x00,0x08,0x4c,0xa8,0x00,0x08,0x4c,0xd2,0x00,0x08,0x4c,0xfe,0x00,0x08,0x4d,0x36,0x00,0x08,0x4d,0x60,0x00,0x08,0x4d,0x8a,0x00,0x08,0x4d,0xb4,0x00,0x08,0x4d,0xde,0x00,0x08,0x4e,0x0a,0x00,0x08,0x4e,0x36,0x00,0x08,0x4e,0x4e,0x00,0x08,0x4e,0x5e,0x00,0x08,0x4e,0x6e,0x00,0x08,0x4e,0x7e,0x00,0x08,0x4e,0x8e, +0x00,0x08,0x4e,0xa6,0x00,0x08,0x4e,0xc6,0x00,0x08,0x4e,0xd6,0x00,0x08,0x4e,0xe6,0x00,0x08,0x4e,0xf6,0x00,0x08,0x4f,0x06,0x00,0x08,0x4f,0xaa,0x00,0x08,0x50,0x6e,0x00,0x08,0x51,0xc8,0x00,0x08,0x52,0x4e,0x00,0x08,0x52,0xec,0x00,0x08,0x53,0x44,0x00,0x08,0x54,0x5c,0x00,0x08,0x56,0x3a,0x00,0x08,0x56,0x64,0x00,0x08,0x56,0x8e, +0x00,0x08,0x57,0x2e,0x00,0x08,0x57,0xa2,0x00,0x08,0x58,0x2c,0x00,0x08,0x58,0x8a,0x00,0x08,0x59,0x3e,0x00,0x08,0x5a,0x14,0x00,0x08,0x5a,0xaa,0x00,0x08,0x5b,0x62,0x00,0x08,0x5c,0x16,0x00,0x08,0x5c,0xd0,0x00,0x08,0x5d,0xa0,0x00,0x08,0x5e,0x6c,0x00,0x08,0x5f,0x6c,0x00,0x08,0x60,0x3a,0x00,0x08,0x61,0x24,0x00,0x08,0x62,0x40, +0x00,0x08,0x63,0x1e,0x00,0x08,0x63,0xe0,0x00,0x08,0x64,0xc0,0x00,0x08,0x65,0x9c,0x00,0x08,0x66,0x1e,0x00,0x08,0x66,0x8c,0x00,0x08,0x67,0x10,0x00,0x08,0x67,0xac,0x00,0x08,0x68,0x70,0x00,0x08,0x69,0x26,0x00,0x08,0x69,0xfc,0x00,0x08,0x6a,0xd6,0x00,0x08,0x6b,0xc0,0x00,0x08,0x6c,0x5e,0x00,0x08,0x6d,0x12,0x00,0x08,0x6e,0x22, +0x00,0x08,0x6e,0xd8,0x00,0x08,0x6f,0x42,0x00,0x08,0x6f,0xc2,0x00,0x08,0x70,0x9e,0x00,0x08,0x71,0x44,0x00,0x08,0x72,0x00,0x00,0x08,0x72,0xa8,0x00,0x08,0x73,0x58,0x00,0x08,0x74,0x4c,0x00,0x08,0x75,0x34,0x00,0x08,0x75,0x88,0x00,0x08,0x76,0x2c,0x00,0x08,0x76,0x80,0x00,0x08,0x77,0x1a,0x00,0x08,0x78,0x46,0x00,0x08,0x78,0xe0, +0x00,0x08,0x78,0xfa,0x00,0x08,0x79,0x20,0x00,0x08,0x79,0xa8,0x00,0x08,0x79,0xc2,0x00,0x08,0x79,0xe8,0x00,0x08,0x7a,0x70,0x00,0x08,0x7a,0x9e,0x00,0x08,0x7b,0xb2,0x00,0x08,0x7b,0xe0,0x00,0x08,0x7c,0x7a,0x00,0x08,0x7c,0xe2,0x00,0x08,0x7d,0x08,0x00,0x08,0x7d,0x2e,0x00,0x08,0x7d,0x52,0x00,0x08,0x7d,0x78,0x00,0x08,0x7d,0x9c, +0x00,0x08,0x7d,0xc2,0x00,0x08,0x7d,0xfe,0x00,0x08,0x7e,0x46,0x00,0x08,0x7e,0x78,0x00,0x08,0x7f,0x14,0x00,0x08,0x7f,0xfc,0x00,0x08,0x80,0x22,0x00,0x08,0x80,0x48,0x00,0x08,0x80,0x78,0x00,0x08,0x80,0xa6,0x00,0x08,0x80,0xb6,0x00,0x08,0x80,0xc6,0x00,0x08,0x81,0x14,0x00,0x08,0x81,0xa4,0x00,0x08,0x82,0x1e,0x00,0x08,0x82,0x7e, +0x00,0x08,0x83,0x0e,0x00,0x08,0x83,0x9e,0x00,0x08,0x84,0x46,0x00,0x08,0x84,0xa4,0x00,0x08,0x84,0xf2,0x00,0x08,0x85,0x7c,0x00,0x08,0x85,0xfe,0x00,0x08,0x86,0x6c,0x00,0x08,0x86,0xe0,0x00,0x08,0x87,0x28,0x00,0x08,0x87,0x6a,0x00,0x08,0x87,0xbc,0x00,0x08,0x88,0x06,0x00,0x08,0x88,0xa8,0x00,0x08,0x88,0xd4,0x00,0x08,0x89,0x12, +0x00,0x08,0x89,0x84,0x00,0x08,0x89,0xf6,0x00,0x08,0x8a,0x7e,0x00,0x08,0x8b,0x08,0x00,0x08,0x8b,0x90,0x00,0x08,0x8c,0x38,0x00,0x08,0x8c,0xa4,0x00,0x08,0x8d,0x54,0x00,0x08,0x8d,0x84,0x00,0x08,0x8d,0xd4,0x00,0x08,0x8e,0x04,0x00,0x08,0x8e,0xd0,0x00,0x08,0x8f,0x2e,0x00,0x08,0x8f,0x7a,0x00,0x08,0x8f,0xba,0x00,0x08,0x8f,0xd8, +0x00,0x08,0x90,0x28,0x00,0x08,0x90,0x56,0x00,0x08,0x90,0x86,0x00,0x08,0x90,0xc0,0x00,0x08,0x91,0x4a,0x00,0x08,0x91,0x66,0x00,0x08,0x91,0x82,0x00,0x08,0x91,0xe2,0x00,0x08,0x92,0x10,0x00,0x08,0x92,0x66,0x00,0x08,0x92,0xb4,0x00,0x08,0x92,0xfe,0x00,0x08,0x93,0x52,0x00,0x08,0x93,0x98,0x00,0x08,0x94,0x1e,0x00,0x08,0x94,0x94, +0x00,0x08,0x94,0xe0,0x00,0x08,0x95,0x2e,0x00,0x08,0x95,0x7c,0x00,0x08,0x95,0xca,0x00,0x08,0x96,0x18,0x00,0x08,0x96,0x66,0x00,0x08,0x96,0xb4,0x00,0x08,0x97,0x02,0x00,0x08,0x97,0x50,0x00,0x08,0x97,0x9e,0x00,0x08,0x97,0xc0,0x00,0x08,0x97,0xe6,0x00,0x08,0x98,0x0c,0x00,0x08,0x98,0x32,0x00,0x08,0x98,0x52,0x00,0x08,0x99,0x8c, +0x00,0x08,0x9a,0x5c,0x00,0x08,0x9b,0x26,0x00,0x08,0x9c,0xa0,0x00,0x08,0x9d,0x40,0x00,0x08,0x9d,0xa4,0x00,0x08,0x9d,0xbc,0x00,0x08,0x9d,0xd4,0x00,0x08,0x9e,0xa8,0x00,0x08,0x9f,0x86,0x00,0x08,0x9f,0xf0,0x00,0x08,0xa0,0x76,0x00,0x08,0xa1,0x46,0x00,0x08,0xa2,0x16,0x00,0x08,0xa2,0xd6,0x00,0x08,0xa3,0x98,0x00,0x08,0xa4,0x34, +0x00,0x08,0xa4,0xd0,0x00,0x08,0xa4,0xe0,0x00,0x08,0xa5,0xa4,0x00,0x08,0xa6,0x5c,0x00,0x08,0xa6,0xb8,0x00,0x08,0xa6,0xec,0x00,0x08,0xa7,0x0e,0x00,0x08,0xa7,0xec,0x00,0x08,0xa8,0xee,0x00,0x08,0xa9,0x9a,0x00,0x08,0xaa,0x4c,0x00,0x08,0xaa,0xfc,0x00,0x08,0xab,0x0c,0x00,0x08,0xac,0x2e,0x00,0x08,0xac,0xda,0x00,0x08,0xac,0xfa, +0x00,0x08,0xad,0x92,0x00,0x08,0xae,0x8a,0x00,0x08,0xaf,0x44,0x00,0x08,0xb0,0x2e,0x00,0x08,0xb0,0xd0,0x00,0x08,0xb1,0x98,0x00,0x08,0xb2,0x50,0x00,0x08,0xb3,0x2c,0x00,0x08,0xb4,0x50,0x00,0x08,0xb5,0x4c,0x00,0x08,0xb6,0x22,0x00,0x08,0xb7,0x38,0x00,0x08,0xb7,0x90,0x00,0x08,0xb8,0x46,0x00,0x08,0xb8,0x8c,0x00,0x08,0xb9,0x06, +0x00,0x08,0xb9,0xbe,0x00,0x08,0xba,0x9e,0x00,0x08,0xbb,0x02,0x00,0x08,0xbb,0xb0,0x00,0x08,0xbb,0xc0,0x00,0x08,0xbc,0x18,0x00,0x08,0xbc,0xa0,0x00,0x08,0xbd,0x70,0x00,0x08,0xbe,0x40,0x00,0x08,0xbe,0xc0,0x00,0x08,0xbe,0xd0,0x00,0x08,0xbf,0xb4,0x00,0x08,0xc0,0x46,0x00,0x08,0xc1,0x26,0x00,0x08,0xc1,0x9a,0x00,0x08,0xc2,0x7e, +0x00,0x08,0xc3,0x1a,0x00,0x08,0xc3,0x82,0x00,0x08,0xc3,0xfe,0x00,0x08,0xc4,0x74,0x00,0x08,0xc5,0x16,0x00,0x08,0xc5,0xc2,0x00,0x08,0xc6,0x46,0x00,0x08,0xc6,0xd8,0x00,0x08,0xc6,0xe8,0x00,0x08,0xc6,0xfa,0x00,0x08,0xc7,0x0c,0x00,0x08,0xc7,0x1e,0x00,0x08,0xc7,0x30,0x00,0x08,0xc7,0x42,0x00,0x08,0xc7,0x54,0x00,0x08,0xc7,0x66, +0x00,0x08,0xc7,0x78,0x00,0x08,0xc7,0x8a,0x00,0x08,0xc7,0x9c,0x00,0x08,0xc7,0xac,0x00,0x08,0xc7,0xbe,0x00,0x08,0xc7,0xd0,0x00,0x08,0xc7,0xe0,0x00,0x08,0xc7,0xf2,0x00,0x08,0xc8,0x04,0x00,0x08,0xc8,0x16,0x00,0x08,0xc8,0x2e,0x00,0x08,0xc8,0x46,0x00,0x08,0xc8,0x5e,0x00,0x08,0xc8,0x74,0x00,0x08,0xc8,0x8a,0x00,0x08,0xca,0x64, +0x00,0x08,0xd0,0x7e,0x00,0x08,0xd2,0xb4,0x00,0x08,0xd9,0xd8,0x00,0x08,0xd9,0xea,0x00,0x08,0xda,0x02,0x00,0x08,0xda,0x14,0x00,0x08,0xda,0x64,0x00,0x08,0xda,0x74,0x00,0x08,0xda,0x86,0x00,0x08,0xda,0x9e,0x00,0x08,0xda,0xb0,0x00,0x08,0xda,0xc8,0x00,0x08,0xda,0xd8,0x00,0x08,0xda,0xee,0x00,0x08,0xdb,0x00,0x00,0x08,0xdb,0x18, +0x00,0x08,0xdb,0x2a,0x00,0x08,0xdb,0x42,0x00,0x08,0xdb,0x76,0x00,0x08,0xdb,0xe0,0x00,0x08,0xdc,0x00,0x00,0x08,0xdc,0x20,0x00,0x08,0xdc,0x40,0x00,0x08,0xdc,0x60,0x00,0x08,0xdc,0x72,0x00,0x08,0xdc,0x8a,0x00,0x08,0xdc,0xa2,0x00,0x08,0xdc,0xba,0x00,0x08,0xdc,0xd2,0x00,0x08,0xdc,0xea,0x00,0x08,0xdd,0x02,0x00,0x08,0xdd,0x1a, +0x00,0x08,0xdd,0x32,0x00,0x08,0xdd,0x4a,0x00,0x08,0xdd,0x62,0x00,0x08,0xdd,0xf4,0x00,0x08,0xde,0x98,0x00,0x08,0xde,0xb8,0x00,0x08,0xde,0xd8,0x00,0x08,0xdf,0x32,0x00,0x08,0xdf,0x5a,0x00,0x08,0xdf,0x6a,0x00,0x08,0xdf,0x82,0x00,0x08,0xdf,0x9a,0x00,0x08,0xdf,0xfe,0x00,0x08,0xe0,0x68,0x00,0x08,0xe1,0x3a,0x00,0x08,0xe1,0xe8, +0x00,0x08,0xe2,0x86,0x00,0x08,0xe3,0x22,0x00,0x08,0xe3,0x3a,0x00,0x08,0xe3,0x52,0x00,0x08,0xe3,0x62,0x00,0x08,0xe3,0x72,0x00,0x08,0xe4,0x36,0x00,0x08,0xe4,0xe0,0x00,0x08,0xe4,0xf0,0x00,0x08,0xe5,0x00,0x00,0x08,0xe6,0x9c,0x00,0x08,0xe6,0xc6,0x00,0x08,0xe7,0x9c,0x00,0x08,0xe8,0x80,0x00,0x08,0xe8,0xd2,0x00,0x08,0xe8,0xe4, +0x00,0x08,0xe9,0x06,0x00,0x08,0xe9,0x18,0x00,0x08,0xe9,0x6c,0x00,0x08,0xe9,0x7e,0x00,0x08,0xea,0x14,0x00,0x08,0xea,0x26,0x00,0x08,0xea,0xde,0x00,0x08,0xeb,0x30,0x00,0x08,0xeb,0x96,0x00,0x08,0xeb,0xea,0x00,0x08,0xec,0x50,0x00,0x08,0xec,0xa2,0x00,0x08,0xed,0x08,0x00,0x08,0xed,0x5a,0x00,0x08,0xed,0xc0,0x00,0x08,0xed,0xd0, +0x00,0x08,0xee,0x14,0x00,0x08,0xee,0xbe,0x00,0x08,0xee,0xce,0x00,0x08,0xef,0x72,0x00,0x08,0xef,0x82,0x00,0x08,0xf0,0x60,0x00,0x08,0xf0,0x70,0x00,0x08,0xf0,0xe0,0x00,0x08,0xf1,0x84,0x00,0x08,0xf2,0x52,0x00,0x08,0xf3,0x0a,0x00,0x08,0xf3,0xa2,0x00,0x08,0xf4,0x72,0x00,0x08,0xf4,0xb6,0x00,0x08,0xf5,0x92,0x00,0x08,0xf6,0xe4, +0x00,0x08,0xf8,0x9a,0x00,0x08,0xf9,0xc2,0x00,0x08,0xfb,0x6a,0x00,0x08,0xfb,0x82,0x00,0x08,0xfb,0x9a,0x00,0x08,0xfb,0xba,0x00,0x08,0xfb,0xda,0x00,0x08,0xfb,0xf2,0x00,0x08,0xfc,0x0a,0x00,0x08,0xfc,0x2a,0x00,0x08,0xfc,0x3a,0x00,0x08,0xfc,0x4a,0x00,0x08,0xfc,0x5a,0x00,0x08,0xfd,0xb0,0x00,0x08,0xfe,0x98,0x00,0x08,0xff,0x4a, +0x00,0x09,0x00,0x2a,0x00,0x09,0x00,0xb8,0x00,0x09,0x00,0xca,0x00,0x09,0x02,0x4a,0x00,0x09,0x04,0x28,0x00,0x09,0x05,0xf4,0x00,0x09,0x07,0x6a,0x00,0x09,0x08,0x98,0x00,0x09,0x0a,0x78,0x00,0x09,0x0b,0x12,0x00,0x09,0x0b,0xd4,0x00,0x09,0x0c,0x8e,0x00,0x09,0x0c,0xa0,0x00,0x09,0x0c,0xbc,0x00,0x09,0x0c,0xd4,0x00,0x09,0x0c,0xec, +0x00,0x09,0x0d,0x04,0x00,0x09,0x0d,0x1c,0x00,0x09,0x0d,0x34,0x00,0x09,0x0d,0x54,0x00,0x09,0x0d,0x74,0x00,0x09,0x0d,0x94,0x00,0x09,0x0d,0xb4,0x00,0x09,0x0d,0xd4,0x00,0x09,0x0d,0xf4,0x00,0x09,0x0e,0x0c,0x00,0x09,0x0f,0x08,0x00,0x09,0x0f,0xe2,0x00,0x09,0x10,0x80,0x00,0x09,0x10,0x98,0x00,0x09,0x10,0xb8,0x00,0x09,0x10,0xd8, +0x00,0x09,0x10,0xf8,0x00,0x09,0x11,0x08,0x00,0x09,0x11,0x20,0x00,0x09,0x11,0x38,0x00,0x09,0x11,0x48,0x00,0x09,0x11,0x60,0x00,0x09,0x11,0x78,0x00,0x09,0x11,0x88,0x00,0x09,0x11,0xd2,0x00,0x09,0x12,0x0c,0x00,0x09,0x12,0x4e,0x00,0x09,0x13,0x00,0x00,0x09,0x13,0x92,0x00,0x09,0x14,0x14,0x00,0x09,0x14,0x5e,0x00,0x09,0x14,0xb0, +0x00,0x09,0x15,0x02,0x00,0x09,0x15,0x9a,0x00,0x09,0x16,0x2a,0x00,0x09,0x16,0xd4,0x00,0x09,0x17,0x66,0x00,0x09,0x17,0xea,0x00,0x09,0x18,0x2e,0x00,0x09,0x1a,0x76,0x00,0x09,0x1c,0x24,0x00,0x09,0x1c,0x68,0x00,0x09,0x1c,0x98,0x00,0x09,0x1c,0xc8,0x00,0x09,0x1c,0xd8,0x00,0x09,0x1c,0xe8,0x00,0x09,0x1d,0x32,0x00,0x09,0x1d,0x6e, +0x00,0x09,0x1d,0xb2,0x00,0x09,0x1e,0x72,0x00,0x09,0x1f,0x06,0x00,0x09,0x1f,0x86,0x00,0x09,0x1f,0xd4,0x00,0x09,0x20,0x2e,0x00,0x09,0x20,0x8a,0x00,0x09,0x21,0x32,0x00,0x09,0x21,0xd2,0x00,0x09,0x22,0x8a,0x00,0x09,0x23,0x1c,0x00,0x09,0x23,0xa4,0x00,0x09,0x23,0xee,0x00,0x09,0x24,0x06,0x00,0x09,0x24,0x26,0x00,0x09,0x24,0xbe, +0x00,0x09,0x25,0x8e,0x00,0x09,0x26,0x66,0x00,0x09,0x27,0x7e,0x00,0x09,0x28,0x24,0x00,0x09,0x28,0xf6,0x00,0x09,0x29,0xdc,0x00,0x09,0x2a,0xa8,0x00,0x09,0x2b,0x2a,0x00,0x09,0x2b,0xe8,0x00,0x09,0x2d,0x1c,0x00,0x09,0x2d,0xde,0x00,0x09,0x2e,0xbc,0x00,0x09,0x2f,0x8a,0x00,0x09,0x30,0x5a,0x00,0x09,0x31,0x46,0x00,0x09,0x32,0x6a, +0x00,0x09,0x32,0xf4,0x00,0x09,0x34,0x44,0x00,0x09,0x35,0x52,0x00,0x09,0x36,0x94,0x00,0x09,0x37,0x42,0x00,0x09,0x38,0x46,0x00,0x09,0x39,0x0a,0x00,0x09,0x3a,0x26,0x00,0x09,0x3a,0xf8,0x00,0x09,0x3b,0xcc,0x00,0x09,0x3c,0x52,0x00,0x09,0x3d,0x76,0x00,0x09,0x3e,0x9e,0x00,0x09,0x3f,0x20,0x00,0x09,0x40,0x62,0x00,0x09,0x41,0x64, +0x00,0x09,0x42,0x74,0x00,0x09,0x43,0x46,0x00,0x09,0x44,0x02,0x00,0x09,0x44,0xe6,0x00,0x09,0x45,0xdc,0x00,0x09,0x46,0xa4,0x00,0x09,0x47,0x60,0x00,0x09,0x48,0x26,0x00,0x09,0x48,0xfe,0x00,0x09,0x49,0x8e,0x00,0x09,0x49,0x8e,0x00,0x09,0x49,0x8e,0x00,0x09,0x4a,0x4a,0x00,0x09,0x4b,0x1e,0x00,0x09,0x4b,0xac,0x00,0x09,0x4b,0xfc, +0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0b,0x07,0x01,0x03,0x04,0x00,0x03,0x05,0x05,0x09,0x04,0x00,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x00,0x2f,0xcd,0x3f,0xcd,0x31,0x30,0x33,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0xa6,0x03,0xde,0xfc,0xb6,0x02,0xb6,0xfd,0x4a,0x05,0x76,0xfa,0x8a,0x94, +0x04,0x4e,0x00,0x02,0x00,0xb4,0xff,0xee,0x01,0x92,0x05,0x9a,0x00,0x03,0x00,0x0f,0x00,0x3f,0x40,0x20,0x03,0x03,0x02,0x0a,0x40,0x04,0x0a,0xb0,0x5b,0x04,0x13,0x01,0x02,0x00,0x7d,0x1f,0x03,0x2f,0x03,0x02,0x03,0x0d,0xaf,0x7f,0x07,0x01,0x10,0x07,0x20,0x07,0x02,0x07,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x07,0x2f,0x2b,0x72,0x5d, +0xe1,0xd4,0x72,0xe1,0x39,0x39,0x00,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x77,0x13,0x87,0x12,0x58,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x05,0x9a,0xfb,0xfa,0x04,0x06,0xfa,0x54,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x02, +0x00,0xa3,0x03,0xdb,0x02,0x80,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x14,0x0f,0x04,0x1f,0x04,0x2f,0x04,0xbf,0x04,0xcf,0x04,0x05,0x04,0x04,0x09,0x03,0x06,0x02,0x07,0x03,0x03,0x00,0x3f,0x33,0xcd,0x32,0x01,0x2f,0x12,0x39,0x2f,0x5d,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x34,0x91,0x01,0xdd,0x91,0x05, +0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x00,0x02,0x00,0x21,0x00,0x7b,0x04,0x8e,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0xbf,0x40,0x6b,0x0f,0x17,0x01,0x00,0x06,0x01,0x10,0x06,0x1b,0x02,0x03,0x06,0x07,0x1a,0x07,0x18,0x1c,0x1f,0x09,0x08,0x19,0x08,0x17,0x1d,0x1e,0x0a,0x0b,0x16,0x0b,0x14,0x11,0x10,0x0d,0x0c,0x15,0x0c, +0x09,0x0d,0x10,0x1f,0x04,0x06,0x03,0x06,0x03,0xe2,0x59,0x11,0x14,0x17,0x1d,0x04,0x02,0x1b,0x1b,0x02,0xe2,0x59,0x1b,0x06,0x1b,0x06,0x1a,0x0b,0x00,0x07,0x10,0x07,0x02,0x09,0x07,0x07,0x21,0x16,0x1a,0x03,0x04,0x00,0x00,0x19,0x1a,0x0e,0x07,0x0f,0x08,0x01,0x0c,0x03,0x08,0x08,0x21,0x0c,0x0c,0x16,0x42,0x12,0x0e,0x0e,0x15,0x16, +0x0b,0x60,0x0c,0x70,0x0c,0x02,0x0c,0x2f,0x5d,0x33,0xcd,0x32,0x33,0x2f,0xc6,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0xe1,0x32,0x32,0x2f,0xc6,0x00,0x3f,0xc4,0x12,0x39,0x2f,0x5e,0x5d,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x17,0x39,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0, +0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x01,0x5f,0x5e,0x5d,0x5d,0x01,0x07,0x21,0x03,0x21,0x07,0x21,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x21,0x37,0x21,0x13,0x21,0x37,0x21,0x13,0x33,0x03,0x33,0x13,0x33,0x03,0x07,0x23,0x03,0x33,0x04,0x8e,0x17,0xfe,0xfb,0x3f,0x01, +0x19,0x1b,0xfe,0xed,0x58,0x7e,0x56,0xfa,0x54,0x7d,0x54,0xfe,0xfa,0x14,0x01,0x09,0x3d,0xfe,0xeb,0x15,0x01,0x15,0x54,0x7e,0x54,0xfc,0x56,0x7b,0x54,0x91,0xfc,0x42,0xfe,0x04,0x08,0x6a,0xfe,0xd4,0x6a,0xfe,0x73,0x01,0x8d,0xfe,0x73,0x01,0x8d,0x6a,0x01,0x2c,0x6a,0x01,0x92,0xfe,0x6e,0x01,0x92,0xfe,0x6e,0x6a,0xfe,0xd4,0x00,0x03, +0x00,0xa2,0xff,0x2f,0x03,0xd1,0x06,0x50,0x00,0x1e,0x00,0x25,0x00,0x2a,0x00,0xc1,0x40,0x1b,0x09,0x26,0x01,0x06,0x1f,0x01,0x0a,0x1d,0x01,0x05,0x15,0x01,0x03,0x00,0x0e,0x01,0x0f,0x05,0x01,0x10,0x05,0x2a,0x20,0x0c,0x00,0x4d,0x25,0xb8,0xff,0xe0,0xb3,0x0c,0x00,0x4d,0x15,0xb8,0xff,0xd0,0x40,0x56,0x0c,0x00,0x4d,0x05,0x30,0x0c, +0x00,0x4d,0x1f,0x19,0x09,0x26,0x0a,0x03,0x13,0x16,0x16,0x20,0x18,0x13,0x18,0x9a,0x59,0x10,0x12,0x40,0x13,0x06,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x09,0x03,0x06,0x06,0x27,0x09,0x03,0x09,0x9a,0x59,0x00,0x02,0x03,0x18,0x09,0x10,0x13,0x19,0x1f,0x27,0x06,0x01,0x8c,0x02,0x02,0x1c,0x0d,0x16,0x40,0x0c,0x11,0x00,0x4c,0x16,0x16, +0x1c,0x89,0x7f,0x29,0x01,0x2f,0x29,0x01,0x29,0x05,0x23,0x89,0x20,0x0d,0x01,0x0d,0x2f,0x5d,0xe1,0xc4,0xd4,0x5d,0x5d,0xf1,0xc0,0x2f,0x2b,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x00,0x3f,0xcd,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x1a,0xcd,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x11,0x12,0x39,0x39,0x12, +0x39,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x25,0x15,0x23,0x35,0x22,0x27,0x35,0x16,0x16,0x33,0x11,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x01,0x11,0x06,0x06,0x15,0x14,0x16,0x13,0x11,0x36,0x35,0x34,0x02,0x68,0x68,0xd5, +0x85,0x3a,0xc9,0x57,0xdc,0x82,0xc6,0x98,0x68,0xc4,0x4b,0x66,0xa9,0xd0,0x99,0xbf,0xfe,0xee,0x54,0x62,0x50,0xce,0xc1,0x08,0xd9,0xd1,0x56,0xae,0x33,0x45,0x02,0x00,0x6a,0xb3,0x7a,0x91,0xd3,0x15,0xb4,0xb0,0x06,0x32,0xaa,0x50,0x06,0xfd,0xf0,0x63,0xb9,0x76,0x8e,0xc1,0x03,0x19,0x01,0xd2,0x11,0x73,0x52,0x56,0x6e,0xfe,0xe4,0xfe, +0x3c,0x2a,0xa6,0x8a,0x00,0x05,0x00,0x50,0xff,0xea,0x06,0x40,0x05,0xb0,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27,0x00,0x33,0x00,0xaf,0x40,0x32,0x19,0x18,0x03,0x22,0x28,0x52,0x59,0x22,0x0e,0x1c,0x1c,0x2e,0x52,0x59,0x1c,0x13,0x06,0x00,0x42,0x00,0x12,0x52,0x59,0x00,0x06,0x06,0x0c,0x52,0x59,0x06,0x04,0x3f,0x18,0x4f,0x18,0x02, +0x1a,0x18,0x1a,0x18,0x25,0x03,0x1f,0xbd,0x2b,0x0c,0x0d,0x06,0x4d,0x2b,0xb8,0xff,0xf9,0xb6,0x0b,0x06,0x4d,0x2b,0x31,0xbd,0x25,0xb8,0xff,0xe0,0x40,0x14,0x0d,0x06,0x4d,0x25,0x18,0x0c,0x06,0x4d,0x25,0x09,0x0b,0x06,0x4d,0x25,0x25,0x35,0x03,0x09,0xbd,0x15,0xb8,0xff,0xec,0x40,0x16,0x0d,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15, +0x0f,0xbd,0x03,0x1c,0x0d,0x06,0x4d,0x03,0x1c,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18, +0x10,0xe4,0x2b,0x00,0x18,0x3f,0x2f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x94,0x94, +0xb0,0xba,0x9e,0x99,0xa9,0xbd,0x8b,0x5f,0x6e,0x6c,0x5d,0x5e,0x6a,0x69,0x03,0x57,0xfc,0x68,0x8f,0x03,0x97,0x26,0x94,0xb0,0xbc,0x9c,0x98,0xaa,0xbd,0x8b,0x60,0x6d,0x6c,0x5d,0x5e,0x6a,0x69,0x02,0xcb,0xc3,0xa3,0xb2,0xcd,0xbe,0xac,0xac,0xcf,0x02,0x77,0x8d,0x7b,0x79,0x87,0x8c,0x7c,0x79,0x87,0x58,0xfa,0x5c,0x05,0xa4,0xfa,0x50, +0xc4,0xa2,0xb2,0xcf,0xc0,0xad,0xab,0xcf,0x02,0x76,0x8c,0x7c,0x77,0x87,0x8d,0x7b,0x7a,0x84,0x00,0x03,0x00,0x77,0xff,0xe9,0x06,0x3e,0x05,0xb2,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0xd7,0x40,0x1c,0x58,0x4f,0x01,0x5c,0x4c,0x01,0x03,0x59,0x4b,0x01,0x5d,0x4a,0x01,0x50,0x37,0x01,0x52,0x36,0x01,0x5b,0x0d,0x01,0x4a,0x40,0x0b,0x00, +0x4d,0x51,0xb8,0xff,0xe8,0x40,0x0c,0x0b,0x00,0x4d,0x1d,0x4d,0x01,0x02,0x1f,0x01,0x0b,0x04,0x10,0xb8,0xff,0xe0,0x40,0x5c,0x0b,0x00,0x4d,0x05,0x49,0x4e,0x12,0x04,0x0a,0x2f,0x38,0x29,0x24,0x65,0x2f,0x05,0x1c,0x44,0x1c,0x5d,0x96,0x59,0x1c,0x04,0x0a,0x44,0x95,0x59,0x0a,0x13,0x00,0x3d,0xec,0x59,0x00,0x13,0x3a,0x49,0x01,0x38, +0x05,0x33,0x0f,0x29,0x49,0x2c,0x53,0x12,0x4e,0x65,0x24,0x04,0x21,0x17,0x33,0xef,0x2c,0x21,0xef,0x58,0x60,0xef,0x17,0x17,0x58,0x2c,0x03,0x0f,0x70,0x40,0x01,0x40,0x40,0x69,0x53,0x08,0x0d,0x06,0x4d,0x53,0x08,0x0c,0x06,0x4d,0x53,0x08,0x0b,0x06,0x4d,0x53,0x83,0x0f,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x12,0x17,0x39, +0x2f,0xe1,0x2f,0xe1,0x2f,0xe1,0x11,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x2f,0x11,0x17,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x2b,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5f,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x27, +0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x17,0x36,0x12,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02, +0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x05,0xa5,0x39,0x57,0x4a,0x45,0x26,0x28,0x69,0x80,0x98,0x59,0x6c,0xb4,0x80,0x47,0xae,0x9f,0x1e,0x3c,0x2f,0x1d,0x39,0x64,0x88,0x4f,0x4e,0x81,0x5d,0x34,0x89,0x89,0x45,0x70,0x5f,0x52,0x28,0x51,0x52,0x09,0x08,0x9f,0x08,0x03,0x02,0x26,0x40,0x55,0x2f,0x23, +0x3a,0x3b,0x3f,0x28,0x1e,0x3e,0x21,0x24,0x4f,0xfc,0x93,0x4c,0x80,0x6c,0x58,0x24,0x3d,0x67,0x69,0x77,0x4e,0x3f,0x6a,0x4d,0x2c,0x32,0x57,0x74,0x01,0x3d,0x25,0x39,0x46,0x22,0x62,0x75,0x01,0x19,0x2d,0x3c,0x22,0x7e,0x7c,0x17,0x1f,0x39,0x52,0x34,0x2b,0x50,0x3e,0x25,0x36,0x69,0x9a,0x64,0x99,0xd9,0x45,0x16,0x3b,0x4b,0x5b,0x36, +0x4f,0x7a,0x54,0x2b,0x2b,0x50,0x70,0x45,0x78,0x9f,0x38,0x1b,0x4e,0x60,0x6e,0x3b,0x71,0x01,0x10,0x95,0x26,0x43,0x21,0x21,0x3b,0x29,0x5b,0xb8,0xad,0x9c,0x41,0x30,0x47,0x30,0x17,0x10,0x0c,0x98,0x0e,0x0e,0x8e,0x21,0x37,0x49,0x28,0x5f,0x87,0x62,0x46,0x1e,0x19,0x3d,0x53,0x6e,0x4a,0x44,0x68,0x45,0x23,0x03,0xfd,0x32,0x46,0x2e, +0x15,0x6a,0x5b,0x29,0x48,0x3e,0x30,0x11,0x2c,0x75,0x00,0x01,0x00,0xa3,0x03,0xdb,0x01,0x34,0x05,0x9a,0x00,0x03,0x00,0x0c,0xb3,0x03,0x02,0x03,0x03,0x00,0x3f,0xcd,0x01,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x01,0x34,0x91,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x00,0x01,0x00,0x8c,0xfe,0xba,0x02,0x56,0x05,0x9a,0x00,0x09,0x00,0x41, +0x40,0x2b,0x05,0x10,0x0b,0x01,0x4d,0x01,0x10,0x0b,0x01,0x4d,0x38,0x02,0x01,0x06,0x03,0x00,0x20,0x05,0xea,0x06,0x01,0xea,0x00,0x00,0x0b,0x08,0x08,0x0c,0x06,0x4d,0x08,0x10,0x0b,0x06,0x4d,0x08,0xea,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x2b, +0x2b,0x01,0x23,0x00,0x11,0x10,0x01,0x33,0x00,0x11,0x10,0x02,0x54,0x92,0xfe,0xca,0x01,0x36,0x94,0xfe,0xc6,0xfe,0xba,0x01,0x62,0x02,0x07,0x02,0x09,0x01,0x6e,0xfe,0x84,0xfe,0x07,0xfe,0x0b,0x00,0x00,0x01,0x00,0x16,0xfe,0xba,0x01,0xe2,0x05,0x9a,0x00,0x09,0x00,0x4a,0xb9,0x00,0x06,0xff,0xf0,0xb3,0x0b,0x01,0x4d,0x00,0xb8,0xff, +0xf0,0x40,0x0b,0x0b,0x01,0x4d,0x37,0x09,0x01,0x06,0x03,0x00,0x20,0x03,0xb8,0xff,0xf0,0xb5,0x0b,0x06,0x4d,0x03,0xea,0x08,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x08,0x08,0x0b,0x01,0x06,0xea,0x05,0x00,0xea,0x01,0x2f,0xe1,0xd6,0xe1,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x2b,0x2b,0x13,0x23, +0x00,0x11,0x10,0x01,0x33,0x00,0x11,0x10,0xaa,0x92,0x01,0x38,0xfe,0xc6,0x94,0x01,0x38,0xfe,0xba,0x01,0x76,0x01,0xf5,0x01,0xf9,0x01,0x7c,0xfe,0x92,0xfd,0xf7,0xfd,0xf9,0x00,0x00,0x01,0x00,0x4c,0x02,0xd9,0x03,0x0c,0x05,0x9a,0x00,0x0e,0x00,0x67,0x40,0x31,0x03,0x04,0x01,0x10,0x03,0x03,0x05,0x08,0x0a,0x0d,0x0e,0x00,0x04,0x08, +0x09,0x09,0x08,0x53,0x59,0x0f,0x09,0x01,0x10,0x03,0x09,0x0c,0x03,0x02,0x02,0x00,0x0e,0x0c,0x06,0x06,0x0b,0x08,0x0b,0x08,0x42,0x08,0x04,0x0a,0x0d,0x03,0x01,0x0d,0x0c,0x48,0x0b,0xb8,0xff,0xf8,0xb5,0x0d,0x06,0x4d,0x07,0x0a,0x0b,0x2f,0x33,0x33,0x2b,0xed,0x32,0x32,0x17,0x39,0xc4,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x10,0xe4, +0x39,0x2f,0x00,0x3f,0xc4,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x10,0xd4,0xc4,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x05,0x17,0x07,0x03,0x03,0x27,0x37,0x25,0x37,0x05,0x03,0x33,0x03,0x25,0x03,0x0c,0xfe,0xee,0xbe,0x6e,0x9c,0x9e,0x6e,0xbe,0xfe,0xec,0x2d,0x01,0x06,0x17,0x8a,0x17,0x01,0x07,0x04,0x50,0x38,0xf3,0x4c,0x01, +0x09,0xfe,0xf7,0x4c,0xf3,0x38,0x7d,0x63,0x01,0x30,0xfe,0xd0,0x63,0x00,0x00,0x01,0x00,0xe8,0x00,0x7f,0x04,0x94,0x04,0x2b,0x00,0x0b,0x00,0x49,0x40,0x21,0x03,0x0e,0x04,0x08,0x0e,0x07,0x40,0x0a,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x0f,0x07,0x01,0x0d,0x03,0x07,0x00,0x0e,0x01,0x04,0x05,0x42,0x05,0x0a,0x07,0x01,0xbd,0x04,0xb8, +0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0xe1,0x39,0x39,0xcd,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x94,0xfe,0x6c,0x85,0xfe,0x6d,0x01,0x93,0x85,0x01,0x94,0x02,0x12,0xfe, +0x6d,0x01,0x93,0x86,0x01,0x93,0xfe,0x6d,0x00,0x01,0x00,0x27,0xfe,0xf8,0x01,0x3c,0x00,0xe4,0x00,0x03,0x00,0x45,0x40,0x1d,0x39,0x03,0x01,0x39,0x00,0x01,0x02,0x40,0x03,0xb2,0x04,0x00,0x20,0x0c,0x06,0x4d,0x00,0x28,0x0b,0x06,0x4d,0x00,0x80,0x02,0x40,0x11,0x19,0x48,0x02,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xea, +0xb6,0x0b,0x06,0x4d,0x02,0x2f,0x05,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0x1a,0xcd,0x2b,0x2b,0x00,0x10,0xf6,0x1a,0xcd,0x31,0x30,0x01,0x5d,0x5d,0x25,0x03,0x23,0x13,0x01,0x3c,0xa0,0x75,0x75,0xe4,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x00,0x90,0x01,0xfa,0x02,0xb2,0x02,0x7b,0x00,0x03,0x00,0x1c,0x40,0x10,0x02,0x01,0x53,0x59,0x4f,0x02, +0x01,0x02,0x20,0x00,0x01,0x00,0x20,0x01,0x01,0x01,0x2f,0x5d,0x2f,0x5d,0x00,0x2f,0x5d,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0xb2,0xfd,0xde,0x02,0x22,0x01,0xfa,0x81,0x00,0x00,0x01,0x00,0x70,0xff,0xea,0x01,0x50,0x00,0xcb,0x00,0x0b,0x00,0x1c,0x40,0x11,0x00,0x06,0xb0,0x5b,0x00,0x13,0x09,0xaf,0x1f,0x03,0x2f,0x03,0x02,0x03, +0x2f,0x0d,0x01,0x5d,0x2f,0x71,0xe1,0x00,0x3f,0x2b,0x31,0x30,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x16,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x00,0x01,0xff,0xe4,0xff,0x12,0x03,0x2d,0x05,0x9a,0x00,0x03,0x00,0x19,0x40,0x0d,0x77,0x01,0x01,0x00,0x10,0x0b, +0x00,0x4d,0x01,0x00,0x03,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x2f,0x31,0x30,0x01,0x2b,0x5d,0x01,0x01,0x23,0x01,0x03,0x2d,0xfd,0x50,0x99,0x02,0xae,0x05,0x9a,0xf9,0x78,0x06,0x88,0x00,0x02,0x00,0x56,0xff,0xe7,0x03,0xfc,0x05,0xb2,0x00,0x10,0x00,0x18,0x00,0x29,0x40,0x15,0x00,0x89,0x11,0x11,0x1a,0x15,0x89,0x40,0x0a,0x0f,0x13,0x9a, +0x59,0x0f,0x07,0x05,0x17,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x20,0x03,0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x03,0xfc,0x41,0x7b,0xb3,0x72,0x6c,0xa9,0x74,0x3c,0x3f,0x7a, +0xb5,0x75,0x01,0xc3,0xa8,0xfe,0xdd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x02,0xd3,0xb4,0xfe,0xea,0xbf,0x63,0x5f,0xb6,0x01,0x09,0xab,0xbc,0x01,0x20,0xc3,0x63,0xfd,0x11,0x02,0x64,0xfd,0x91,0xfd,0xbb,0x00,0x01,0x00,0xe4,0x00,0x00,0x02,0xd4,0x05,0xba,0x00,0x0e,0x00,0x1d,0x40,0x0d,0x0d,0x07,0x00,0x8a,0x01,0x08,0x07,0x07,0x01,0x0d, +0x07,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0xc6,0x33,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0xd4,0xa4,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x3e,0x04,0xd7,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x03,0xe2, +0x05,0xb2,0x00,0x2a,0x00,0x3c,0x40,0x1e,0x1e,0x13,0x89,0x0a,0x21,0x00,0x00,0x2c,0x1d,0x89,0x40,0x21,0x00,0x1d,0x0e,0x20,0x1d,0x99,0x59,0x20,0x18,0x0a,0x0a,0x05,0x0e,0x05,0x9a,0x59,0x0e,0x07,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x32, +0x31,0x30,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x21,0x15,0x21,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x03,0x04,0x29,0x47,0x60,0x38,0x30,0x5c,0x57,0x51,0x23,0x45,0xab,0x7b,0x58,0x96,0x6e,0x3f,0x27,0x4f,0x78,0x51,0x65,0x83,0x4d,0x1f,0x02,0xca, +0xfc,0x8b,0x28,0x5c,0x95,0x6c,0x4e,0x69,0x40,0x1b,0x04,0x22,0x42,0x62,0x41,0x20,0x1a,0x2e,0x40,0x27,0xb0,0x43,0x47,0x33,0x62,0x90,0x5d,0x55,0x8a,0x7a,0x70,0x3a,0x48,0x66,0x59,0x59,0x3a,0x93,0x47,0x5c,0x8c,0x7e,0x7e,0x4f,0x38,0x66,0x66,0x69,0x00,0x01,0x00,0x7b,0xff,0xe7,0x03,0xb9,0x05,0xb2,0x00,0x29,0x00,0x72,0x40,0x41, +0x16,0x89,0x1a,0x13,0x24,0x03,0x08,0x22,0x22,0x08,0x00,0x89,0x40,0x0f,0x0f,0x2b,0x08,0x19,0x1a,0x01,0x0f,0x1a,0x01,0x0b,0x03,0x1a,0x1a,0x18,0x1d,0x18,0x9a,0x59,0x24,0x12,0x13,0x13,0x12,0x9a,0x59,0x13,0x13,0x0a,0x1d,0x07,0x36,0x08,0x01,0x00,0x08,0x10,0x08,0x20,0x08,0x03,0x09,0x03,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05, +0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x3f,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x10,0x21, +0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb9,0x49,0x85,0xba,0x70,0xcd,0x79,0x91,0xbb,0x4b,0x79,0x57,0x2f,0xfe,0x70,0x77,0x71,0x01,0x62,0xfe,0xf2,0x98,0x85,0x89,0xbd,0x5a,0x92,0x68,0x39,0xfe,0xe2,0x49,0x7c,0x5a,0x33,0x01,0x96,0x61,0x9f,0x71,0x3e,0x4e, +0xb0,0x72,0x26,0x48,0x66,0x40,0x01,0x19,0x8b,0x01,0x08,0xf4,0x66,0x9f,0x52,0x32,0x5a,0x7e,0x4c,0xfe,0xe5,0x51,0x04,0x08,0x37,0x58,0x77,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x0e,0x00,0x15,0x00,0x3e,0x40,0x1e,0x03,0x01,0x05,0x8a,0x06,0x40,0x10,0x0e,0x06,0x06,0x0f,0x17,0x08,0x04,0x08,0x0f,0x08,0x9a, +0x59,0x09,0x01,0x11,0x0e,0x0f,0x0f,0x06,0x0e,0x06,0x06,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x12,0x39,0x39,0x11,0x33,0x33,0x1a,0x10,0xfd,0x32,0xc6,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x52,0xb8,0xb8, +0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe,0x24,0x01,0xe9,0x4b,0x86,0x79,0x6e,0x05,0x9a,0xfc,0x4d,0x96,0xfe,0xaf,0x01,0x51,0x8e,0x6a,0xf1,0xf8,0xf7,0x71,0xfc,0x4d,0x02,0xbe,0x83,0xce,0xa8,0x88,0x00,0x00,0x01,0x00,0xa4,0xff,0xe7,0x03,0xc9,0x05,0x9a,0x00,0x23,0x00,0x52,0x40,0x2c,0x1c,0x8a,0x1a,0x17,0x17,0x08,0x00,0x89, +0x40,0x0f,0x0f,0x25,0x08,0x1f,0x12,0x9a,0x59,0x1f,0x1f,0x0a,0x18,0x18,0x1b,0x99,0x59,0x18,0x06,0x12,0x08,0x01,0x00,0x08,0x01,0x0b,0x03,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x01,0x18,0x2f,0x12,0x39,0x2f,0x1a, +0xed,0x11,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e,0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92,0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97, +0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x01,0xb6,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00,0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x46,0x40,0x24,0x12,0x0a,0x00,0x89,0x21,0x21, +0x36,0x2b,0x19,0x89,0x40,0x0a,0x1c,0x26,0x9a,0x59,0x1a,0x1c,0x1c,0x30,0x0f,0x12,0x12,0x14,0x0f,0x14,0x9a,0x59,0x0f,0x07,0x05,0x30,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x11,0x12,0x39,0x2f,0x39,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14, +0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8,0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e, +0x3b,0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d,0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37, +0x2f,0x54,0x75,0x00,0x00,0x01,0x00,0x62,0x00,0x00,0x03,0xf2,0x05,0x9a,0x00,0x12,0x00,0x2d,0xb9,0x00,0x07,0x01,0x86,0x40,0x12,0x40,0x0f,0x08,0x08,0x00,0x10,0x00,0x00,0x10,0x11,0x11,0x10,0x99,0x59,0x11,0x06,0x08,0x18,0x00,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x2f,0x12,0x39,0x2f,0x39,0x1a,0xed,0x31,0x30,0x01, +0x0e,0x03,0x02,0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02,0x37,0x21,0x35,0x21,0x03,0xf2,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x05,0x3b,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x00,0x03,0x00,0x5a,0xff,0xe9, +0x03,0xfc,0x05,0xb2,0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x5b,0x40,0x2f,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x40,0x00,0x15,0x05,0x33,0x3d,0x3d,0x33,0x9a,0x59,0x3d,0x3d,0x29,0x0d,0x1f,0x29,0x99,0x59,0x1f,0x19,0x0d,0x47,0x9a,0x59,0x0d,0x07,0x00,0x3f,0x2b, +0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02, +0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c, +0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31,0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35,0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f, +0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57,0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58,0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xff,0xe7,0x03,0xec,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x46,0x40,0x24,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36, +0x2b,0x89,0x40,0x17,0x12,0x30,0x99,0x59,0x0f,0x12,0x12,0x26,0x05,0x1c,0x26,0x9a,0x59,0x1c,0x07,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x39,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06, +0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec,0x4e,0x96,0xd8,0x8a,0x8e,0x6c,0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b, +0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x03,0x23,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a,0xb0,0x7f,0x46,0x57,0xa7,0xf4,0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49, +0x63,0x00,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x3c,0x40,0x16,0x06,0x00,0xb0,0x5b,0x06,0x10,0x0c,0x12,0xb0,0x5b,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b, +0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42, +0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x02,0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16,0x00,0x0b,0x00,0x0f,0x00,0x63,0x40,0x16,0x0f,0x0f,0x01,0x0f,0x0c,0x01,0x0c,0x05,0x06,0x00,0xb0,0x5b,0x06,0x10,0x0e,0x40,0x0f,0xb2,0x10,0x09,0xaf,0x03,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xec,0x40,0x11,0x0b, +0x06,0x4d,0x03,0x0c,0x20,0x0c,0x06,0x4d,0x0c,0x28,0x0b,0x06,0x4d,0x0c,0x80,0x0e,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x0e,0xb8,0xff,0xea,0xb6,0x0b,0x06,0x4d,0x0e,0x2f,0x11,0x01,0x5d,0x2f,0x2b,0x2b,0x1a,0xcd,0x2b,0x2b,0x2f,0x2b,0x2b,0xe1,0x00,0x10,0xf6,0x1a,0xcd,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x13,0x22,0x26, +0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x03,0x23,0x13,0xe2,0x2f,0x41,0x41,0x2f,0x2e,0x42,0x42,0x2c,0xa0,0x75,0x75,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfd,0xac,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x01,0x10,0x00,0x7f,0x04,0x6c,0x04,0x4c,0x00,0x07,0x00,0x43,0x40,0x0c,0x78,0x01,0x01,0x07,0x10,0x0b, +0x00,0x4d,0x02,0x01,0x00,0x00,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x00,0x4d,0x70,0x03,0x01,0x03,0x03,0x00,0x04,0x00,0xb8,0xff,0xe0,0xb5,0x0c,0x06,0x4d,0x00,0x05,0x01,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x01,0x2f,0x2b,0x33,0x2f,0x2b,0xc4,0x00,0x2f,0x33,0x2f,0x5d,0x2b,0x12,0x39,0x39,0x31,0x30,0x2b,0x5d,0x25,0x01,0x35,0x01,0x15, +0x01,0x15,0x01,0x04,0x6c,0xfc,0xa4,0x03,0x5c,0xfd,0x7e,0x02,0x82,0x7f,0x01,0xb0,0x3b,0x01,0xe2,0x96,0xfe,0x9c,0x04,0xfe,0xc6,0x00,0x00,0x02,0x00,0xe8,0x01,0x3e,0x04,0x94,0x03,0x6c,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x0f,0x06,0x05,0xbe,0x59,0x06,0x02,0x02,0x01,0xbe,0x59,0x02,0x01,0x00,0x05,0x04,0xb8,0xff,0xe0,0xb4,0x0c, +0x06,0x4d,0x04,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2f,0x2b,0x12,0x39,0x39,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0x02,0xe8,0x84,0xfd,0xd2,0x84,0x00,0x00,0x01,0x01,0x10,0x00,0x7f,0x04,0x6c,0x04,0x4c, +0x00,0x07,0x00,0x43,0x40,0x0c,0x78,0x00,0x01,0x02,0x10,0x0b,0x00,0x4d,0x07,0x00,0x01,0x01,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x00,0x4d,0x70,0x06,0x01,0x06,0x06,0x01,0x04,0x00,0xb8,0xff,0xe0,0xb5,0x0c,0x06,0x4d,0x00,0x05,0x02,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x02,0x2f,0x2b,0xc4,0x2f,0x2b,0x33,0x00,0x2f,0x33,0x2f,0x5d,0x2b, +0x12,0x39,0x39,0x31,0x30,0x2b,0x5d,0x01,0x01,0x35,0x01,0x35,0x01,0x35,0x01,0x04,0x6c,0xfc,0xa4,0x02,0x84,0xfd,0x7c,0x03,0x5c,0x02,0x2f,0xfe,0x50,0x95,0x01,0x38,0x06,0x01,0x64,0x96,0xfe,0x1e,0x00,0x02,0x00,0x83,0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x23,0x00,0x33,0x00,0x46,0x40,0x26,0x00,0x12,0x01,0x10,0x05,0x11,0x0f,0x14, +0x0f,0x95,0x59,0x14,0x04,0x00,0x2c,0x24,0x2c,0xb0,0x5b,0x24,0x13,0x20,0xef,0x03,0x30,0xaf,0x7f,0x28,0x01,0x28,0x28,0x11,0x19,0x84,0x0a,0x0a,0x35,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0xe1,0xd4,0xe1,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x26,0x26,0x35, +0x34,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x15,0x14,0x16,0x17,0x03,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x01,0x4f,0x09,0x0e,0x33,0x4c,0x5a,0x4c,0x33,0x25,0x40,0x54,0x2f,0xa9,0x7c,0x99,0xa4,0x4c,0x86,0x65,0x3a,0x34,0x4f,0x5c, +0x4f,0x34,0x16,0x0b,0x47,0x2c,0x22,0x21,0x21,0x21,0x2d,0x2d,0x21,0x21,0x21,0x22,0x01,0x8e,0x1a,0x53,0x29,0x40,0x67,0x5a,0x53,0x55,0x5d,0x38,0x30,0x4a,0x32,0x19,0x85,0xb0,0x60,0x28,0x4f,0x76,0x4e,0x4a,0x74,0x61,0x54,0x53,0x5a,0x36,0x2e,0x4b,0x1a,0xfe,0x60,0x20,0x20,0x2e,0x2f,0x1f,0x21,0x21,0x1f,0x2f,0x2e,0x20,0x20,0x00, +0x00,0x02,0x00,0xac,0xff,0x44,0x06,0xfc,0x05,0xae,0x00,0x32,0x00,0x3d,0x00,0xb9,0x40,0x10,0x0a,0x27,0x01,0x0a,0x32,0x01,0x03,0x00,0x1b,0x01,0x0f,0x19,0x01,0x10,0x05,0x1e,0xb8,0xff,0xc0,0x40,0x0f,0x0b,0x0c,0x00,0x4c,0x1c,0x40,0x0b,0x00,0x4d,0x18,0x40,0x0c,0x00,0x4d,0x16,0xb8,0xff,0xc0,0x40,0x4b,0x0c,0x00,0x4d,0x04,0x18, +0x0b,0x00,0x4d,0x0d,0x00,0x03,0x09,0x09,0x33,0x4c,0x59,0x09,0x0f,0x31,0x14,0x03,0x39,0x03,0x39,0x4c,0x59,0x0f,0x03,0x0f,0x03,0x25,0x2b,0x2b,0x1a,0x4c,0x59,0x2b,0x04,0x00,0x22,0x10,0x22,0x02,0x0d,0x03,0x22,0x20,0x25,0x20,0x4c,0x59,0x25,0x00,0x0d,0x0f,0x10,0x12,0x05,0x3c,0x3c,0x2e,0x36,0x48,0x06,0x22,0x06,0x22,0x06,0x28, +0x17,0x48,0x2e,0x1d,0x48,0x28,0x2f,0xe1,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x12,0x39,0x2f,0x17,0x33,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x10,0xc4,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b, +0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x00,0x5d,0x01,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x37,0x33,0x02,0x15,0x14,0x33,0x32,0x36,0x35,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x37,0x15,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x02,0x23,0x22,0x03,0x22,0x06,0x15, +0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x8c,0x05,0x49,0xd6,0x89,0xa7,0xe7,0xbc,0x48,0x71,0x10,0x04,0x02,0x08,0x7d,0x2f,0x77,0x6c,0x8f,0xfe,0xa4,0xfe,0xcc,0xfe,0xd7,0xfe,0x7c,0x01,0x71,0x01,0x39,0xf7,0xaf,0xad,0xfe,0xfd,0xfe,0x94,0xfe,0x43,0x01,0xd3,0x01,0x6b,0x01,0x54,0x01,0xbe,0xeb,0xa9,0xdb,0xb4,0x7c,0x99,0x67,0x56, +0x7c,0x91,0x01,0xa4,0xee,0xca,0xab,0xe2,0x01,0x2b,0x4a,0x38,0x1c,0x57,0xfd,0xd9,0x0a,0xcf,0xea,0xba,0x01,0x13,0x01,0x5c,0xfe,0x60,0xfe,0xc8,0xfe,0xcd,0xfe,0x87,0x52,0x7c,0x4a,0x01,0xb7,0x01,0x63,0x01,0x6e,0x01,0xe2,0xfe,0x6c,0xfe,0xbb,0xee,0xfe,0xcf,0x03,0x0e,0xec,0xaf,0x76,0x88,0xf7,0xcc,0xd6,0x00,0x00,0x02,0x00,0x16, +0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0xd0,0x40,0x2c,0x07,0x07,0x01,0x08,0x06,0x01,0x09,0x10,0x0c,0x00,0x4d,0x02,0x08,0x09,0x0a,0x0b,0x01,0x0b,0x0d,0x0e,0x0f,0x03,0x04,0x0c,0x03,0x04,0x01,0x0c,0x01,0x01,0x10,0x03,0x01,0x10,0x0c,0x00,0x4d,0x04,0x18,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0xb4,0x0b,0x0d, +0x01,0x4c,0x0c,0xb8,0xff,0xc0,0xb4,0x0b,0x0d,0x01,0x4c,0x0b,0xb8,0xff,0xc0,0x40,0x39,0x0b,0x0d,0x01,0x4c,0x0e,0x0d,0x09,0x0a,0x04,0x05,0x0b,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x40,0x12,0x16,0x48,0x0c,0x06,0x40,0x08,0x0f,0x02,0x03,0x0f,0x03,0x91,0x59,0x0f,0x0f,0x06,0x03,0x01,0x05,0x08,0x0f,0x0c,0x0b,0x03,0x02,0x0e,0x09,0x0d, +0x0a,0x0a,0x05,0x77,0x05,0x01,0x78,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x00,0x2f,0x2f,0x3f,0x39,0x2f,0x2b,0x00,0x10,0x18,0xc4,0x10,0xc4,0x1a,0x10,0xdd,0x2b,0x2b,0xc4,0x12,0x17,0x39,0x31,0x30, +0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x87,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x05,0xc0,0xc0,0x01,0x2b,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x9f,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x01, +0x92,0xfe,0x6e,0x05,0x9a,0xfc,0x8f,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x00,0x00,0x03,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0xdc,0x40,0x0c,0x09,0x0d,0x01,0x06,0x0b,0x01,0x03,0x04,0x01,0x10,0x03,0x04,0xb8,0xff,0xe8,0x40,0x2e,0x0b,0x00,0x4d,0x08,0x18,0x11,0x11,0x18,0x91,0x59,0x11, +0x11,0x19,0x01,0x00,0x19,0x91,0x59,0x00,0x12,0x01,0x10,0x91,0x59,0x01,0x03,0x09,0x19,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x7d,0x1d,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x1d,0xb8,0xff,0xf0,0x40,0x2f,0x0b,0x06,0x4d,0x1d,0x1d,0x05,0x06,0x0c, +0x06,0x4d,0x05,0x7d,0x7f,0x15,0x01,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x15,0x21,0x11,0x19,0x08,0x0d,0x06,0x4d,0x19,0x08,0x0c,0x06,0x4d,0x19,0x08,0x0b,0x06,0x4d,0x19,0x7e,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x00, +0x21,0x40,0x0b,0x00,0x4d,0x2b,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x2b,0x00,0x5f,0x5e,0x5d,0x5d,0x5d,0x33,0x11, +0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0xbc,0x01,0x98,0xba,0xda,0x84,0x74,0x91,0xae,0xfe,0xf8,0xc9,0xfa,0xac,0x8a,0x9e,0xfe,0xed,0xc1,0xe4,0x94,0xa3,0xfe,0xa6,0x05,0x9a,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9, +0x94,0xb8,0xe4,0x05,0x02,0xfe,0x31,0x85,0x79,0xd1,0xfd,0x9a,0xfd,0xfc,0x8c,0x7a,0xfe,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x00,0x15,0x00,0x99,0x40,0x0f,0x45,0x0a,0x01,0x49,0x00,0x01,0x4a,0x03,0x01,0x0f,0x17,0x01,0x0c,0x03,0x09,0xb8,0xff,0xc0,0x40,0x0c,0x0c,0x00,0x4d,0x03,0x18,0x0b,0x00,0x4d,0x0a,0x0b, +0x00,0x15,0xb8,0xff,0xc0,0x40,0x43,0x0b,0x00,0x4d,0x15,0x15,0x13,0x02,0x13,0x91,0x59,0x02,0x13,0x00,0x0b,0x01,0x0c,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x00,0x0b,0x30,0x0b,0x0d,0x01,0x4c,0x3f,0x0b,0x01,0x0b,0x0b,0x17,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05, +0x08,0x0c,0x06,0x4d,0x05,0x13,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x33,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x33,0x11,0x33,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x00,0x11,0x10, +0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x04,0x8c,0x9f,0xed,0xfe,0xce,0xfe,0x90,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0xd8,0x9e,0x3c,0x54,0x01,0x8a,0x01,0x40,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00,0x00,0x02, +0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x97,0x40,0x26,0x00,0x03,0x01,0x00,0x03,0x01,0x10,0x05,0x00,0x09,0x91,0x59,0x00,0x12,0x01,0x08,0x91,0x59,0x01,0x03,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7d,0x0d,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff, +0xf0,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xea,0x40,0x18,0x0b,0x06,0x4d,0x0d,0x0d,0x11,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7e,0x00,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0b, +0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0xbc,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0xd6, +0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x05,0x9a,0xfd,0x45,0xfe,0xb4,0xfe,0x6d,0x05,0x02,0xfb,0x96,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x00,0x0b,0x00,0x70,0x40,0x34,0x06,0x09,0x91,0x59,0x06,0x02,0x01,0x06,0x91,0x2b,0x30,0x06,0x0a,0x02,0x01,0x0a,0x91,0x59,0x01,0x12,0x02,0x05,0x91,0x59, +0x02,0x03,0x04,0x08,0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x7e,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f, +0x33,0x33,0x2f,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x03,0xb4,0xfd,0x08,0x02,0xd8,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0x05,0x9a,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0x94, +0x05,0x9a,0x00,0x09,0x00,0x67,0x40,0x2c,0x02,0x05,0x91,0x59,0x0f,0x02,0x01,0x0b,0x03,0x02,0x02,0x08,0x07,0x12,0x08,0x01,0x91,0x59,0x08,0x03,0x04,0x04,0x00,0x00,0x0b,0x02,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf6,0xb3, +0x0c,0x06,0x4d,0x07,0xb8,0xff,0xf6,0xb6,0x0b,0x06,0x4d,0x07,0x2f,0x0b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x94,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0xa8, +0x02,0xd8,0x05,0x02,0xfe,0x10,0x97,0xfd,0x85,0x05,0x9a,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xec,0x05,0xb2,0x00,0x19,0x00,0xae,0x40,0x09,0x00,0x0a,0x01,0x0f,0x04,0x01,0x10,0x05,0x09,0xb8,0xff,0xc0,0x40,0x3b,0x0c,0x00,0x4d,0x18,0x17,0x91,0x59,0x18,0x18,0x08,0x00,0x15,0x13,0x02,0x13,0x91,0x59,0x02,0x13,0x0f,0x0b,0x1f, +0x0b,0x02,0x0a,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x17,0x17,0x15,0x10,0x0b,0x0b,0x00,0x04,0x0d,0x06,0x4d,0x00,0x04,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x15,0xb8,0xff,0xee,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xee,0x40,0x22,0x0b,0x06,0x4d,0x15,0x15,0x1b,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c, +0x06,0x4d,0x10,0x7d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x33,0x12,0x39,0x18,0x2f,0x2b, +0x31,0x30,0x00,0x2b,0x5f,0x5e,0x5d,0x5d,0x25,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x21,0x35,0x21,0x04,0xec,0xd8,0xfe,0xf8,0xfe,0xcd,0xfe,0x85,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc6,0x01,0xe2,0x62, +0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xf0,0xfe,0xc9,0x43,0x01,0x92,0x98,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x00,0x0b,0x00,0x79,0x40,0x48,0x08,0x03,0x91,0x59,0x08,0x06,0x05,0x08,0x91,0x2b,0x30,0x01,0x12,0x05,0x12,0x0a,0x03,0x06,0x03,0x09,0x00,0x06,0x0d,0x06, +0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x0d,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05, +0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xa8,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00, +0x00,0x01,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x00,0x03,0x00,0x10,0xb6,0x00,0x7e,0x01,0x01,0x12,0x02,0x03,0x00,0x3f,0x3f,0x01,0x2f,0xe1,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x64,0xa8,0xa8,0x05,0x9a,0x00,0x01,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x00,0x0c,0x00,0x6d,0x40,0x17,0x00,0x09,0x01,0x00,0x01,0x01,0x0f,0x09, +0x01,0x10,0x05,0x06,0x06,0x08,0x03,0x08,0x91,0x59,0x03,0x13,0x0b,0x03,0x05,0xb8,0xff,0xf0,0x40,0x1c,0x0d,0x06,0x4d,0x05,0x05,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x0a,0x18,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x0a, +0x0a,0x0e,0x0d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x02,0x2b,0xd8,0xb5,0x54,0x36,0x36,0x56,0xe3,0xa8,0x02,0x02,0xff,0xfe,0xe5,0x18, +0xa6,0x27,0x01,0x81,0x03,0x9a,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x10,0x00,0x9c,0x40,0x1c,0x7d,0x0e,0x01,0x29,0x0e,0x39,0x0e,0x02,0x7e,0x01,0x01,0x2a,0x01,0x3a,0x01,0x02,0x10,0x18,0x0c,0x0d,0x01,0x4c,0x10,0x10,0x0b,0x01,0x4d,0x0e,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x18, +0x0b,0x0d,0x01,0x4c,0x0a,0x0e,0x10,0x01,0x05,0x05,0x08,0x07,0x12,0x08,0x03,0x0e,0x0f,0x0f,0x01,0x10,0x70,0x00,0x01,0x00,0xb8,0xff,0xe8,0x40,0x19,0x0d,0x06,0x4d,0x00,0x00,0x12,0x0a,0x05,0x06,0x0d,0x06,0x4d,0x05,0x06,0x0c,0x06,0x4d,0x05,0x06,0x0b,0x06,0x4d,0x05,0x7e,0x07,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff, +0xf8,0x40,0x09,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x11,0x33,0x2f,0x2b,0x5d,0x39,0x33,0x33,0x2f,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33, +0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x05,0x00,0x86,0x40,0x09,0x01,0x04,0x91,0x59,0x01,0x12,0x02,0x03,0x05,0xb8,0xff,0xf0, +0xb3,0x10,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x05,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x05,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x05,0xb8,0xff,0xc0,0x40,0x18,0x0a,0x1f,0x48,0x05,0x05,0x07,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c, +0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf2,0x40,0x09,0x0c,0x06,0x4d,0x01,0x05,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x03,0xa4, +0xfd,0x18,0xa8,0x02,0x40,0x05,0x9a,0xfa,0xfe,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x00,0x1b,0x00,0xba,0x40,0x15,0x7a,0x1a,0x01,0x75,0x13,0x01,0x26,0x13,0x36,0x13,0x02,0x72,0x16,0x01,0x16,0x18,0x0b,0x0d,0x01,0x4c,0x0d,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xe8,0x40,0x37,0x0b,0x0d,0x01, +0x4c,0x16,0x1a,0x01,0x05,0x09,0x0d,0x06,0x12,0x11,0x12,0x12,0x03,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x1a,0x08,0x0d,0x06,0x4d,0x1a,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x01,0x06,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb5,0x0b,0x06,0x4d,0x01,0x1d,0x13,0xb8,0xff, +0xf8,0x40,0x17,0x0d,0x06,0x4d,0x13,0x0d,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x7e,0x11,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x11,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x2b,0x12,0x39,0x2b,0x2b,0x2f,0x2b,0x5d,0x33,0x2b,0xe9,0x2b,0x2b, +0x2b,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x06,0x72,0xa7,0x0e,0x04,0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x15,0x16,0x04,0x08,0xa2,0xde, +0x01,0xb8,0x33,0x0f,0x06,0x2b,0x1a,0x01,0xc1,0xd2,0x03,0xc2,0x72,0xa5,0x61,0x2a,0xfb,0xb2,0x04,0x46,0x30,0x63,0x56,0xc3,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x73,0x39,0x76,0x3a,0x03,0xe4,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x00,0x13,0x00,0xad,0x40,0x0d,0x77,0x0c,0x01,0x72,0x0b,0x01,0x78,0x02,0x01,0x7d,0x01,0x01, +0x0b,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x00,0x4d,0x0f,0x08,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xf8,0x40,0x2f,0x0b,0x0d,0x01,0x4c,0x0e,0x12,0x01,0x05,0x04,0x09,0x0a,0x03,0x09,0x01,0x0f,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x11,0x01,0x11,0x18,0x0d,0x06,0x4d,0x11,0x11,0x08, +0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x11,0x15,0x0b,0x05,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x7e,0x09,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b, +0x39,0x32,0x12,0x39,0x2b,0x2b,0x2f,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x39,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x05,0x40,0xce,0xfd,0x1e,0x1c,0x12,0x06,0x08,0xa8,0xda,0x02,0xce, +0x2d,0x0d,0x04,0x0a,0xa8,0x04,0x77,0x2b,0x2f,0x2e,0x97,0xfb,0xf4,0x05,0x9a,0xfb,0x9b,0x46,0x1a,0x3e,0x95,0x03,0xf2,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x81,0x40,0x1e,0x00,0x12,0x91,0x59,0x00,0x13,0x06,0x0c,0x91,0x59,0x06,0x04,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d, +0x09,0x06,0x0b,0x06,0x4d,0x09,0x7d,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xea,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x15,0x30,0x15,0x02,0x15,0x15,0x19,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10, +0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10, +0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xfe,0xd4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x05,0x32,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01, +0x36,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x90,0x40,0x29,0x46,0x06,0x01,0x02,0x0f,0x01,0x0c,0x04,0x0c,0x00,0x91,0x59,0x0c,0x0c,0x03,0x02,0x12,0x03,0x0b,0x91,0x59,0x03,0x03,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7d,0x10,0xb8,0xff,0xe8, +0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x10,0x10,0x0b,0x06,0x4d,0x10,0x10,0x14,0x0c,0x01,0x06,0x0d,0x06,0x4d,0x01,0x06,0x0c,0x06,0x4d,0x01,0x06,0x0b,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x02,0x04,0x0b,0x06,0x4d,0x02,0x2f,0x2b, +0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x01,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0x01,0x8a,0xe6,0xfd,0xfe,0xe7,0xef,0xbd, +0xb0,0xae,0xb7,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0xe0,0xcc,0xcc,0xfe,0xfc,0x02,0xe4,0xfd,0xb4,0x9f,0x91,0x01,0x1c,0x00,0x02,0x00,0x5e,0xff,0x3f,0x06,0x25,0x05,0xb2,0x00,0x14,0x00,0x24,0x00,0x36,0x40,0x1a,0x13,0x10,0x04,0x11,0x0c,0x0c,0x21,0x19,0x04,0x13,0x10,0x00,0x08,0x08,0x15,0x91,0x59,0x08,0x04,0x00,0x1d,0x91, +0x59,0x12,0x00,0x13,0x00,0x3f,0xc6,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x33,0x2f,0x33,0x10,0xc6,0x12,0x39,0x39,0x31,0x30,0x05,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x07,0x01,0x21,0x25,0x06,0x03,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x11, +0x10,0x27,0x26,0x02,0xfe,0xfe,0xd0,0xb9,0xb7,0xbb,0xbc,0x01,0x41,0x01,0x28,0xb6,0xb6,0xba,0x2c,0x32,0x01,0x93,0xfe,0xcf,0xfe,0xf2,0x6a,0x72,0xe2,0x8d,0x8d,0x89,0x8a,0xdd,0xec,0x88,0x88,0x84,0x84,0x18,0xc9,0xc9,0x01,0x42,0x01,0x5b,0xcd,0xce,0xc8,0xc8,0xfe,0xbd,0xfe,0xa1,0xcc,0x31,0x23,0xfe,0xdf,0xca,0x21,0x05,0x32,0xa3, +0xa3,0xfe,0xf7,0xfe,0xf8,0xa3,0xa1,0x9a,0x9a,0x01,0x15,0x01,0x1d,0x9a,0x9b,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0xc0,0x05,0x9a,0x00,0x1c,0x00,0x27,0x00,0xbb,0x40,0x3a,0x45,0x0f,0x01,0x03,0x40,0x0e,0x01,0x0f,0x02,0x01,0x0c,0x05,0x17,0x1e,0x08,0x08,0x1e,0x91,0x59,0x08,0x08,0x0a,0x1d,0x0b,0x1d,0x91,0x59,0x0b,0x03,0x01, +0x0a,0x17,0x09,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x24,0x7d,0x11,0x79,0x02,0x01,0x7a,0x01,0x01,0x02,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x26,0x0b,0x0d,0x01,0x4c,0x01,0x1c,0x02,0x11,0x04,0x70,0x00,0x01,0x00,0x08,0x0d,0x06,0x4d,0x00,0x29,0x1e,0x09,0x06, +0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7e,0x0a,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x10,0xc6,0x2b,0x5d,0x17,0x32,0x2b,0x2b,0x5d,0x5d,0x2f,0xe1,0x2b,0x2b,0x2b, +0x12,0x39,0x00,0x2f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x5d,0x5f,0x5d,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x04,0xc0,0xc8,0xf0, +0x21,0x3e,0x41,0x4b,0x2f,0x8a,0xa8,0x01,0xac,0x5e,0x9f,0x75,0x42,0x2d,0x53,0x75,0x49,0x24,0x35,0x30,0x2f,0x1d,0xfd,0xb1,0xe4,0x3f,0x6b,0x4e,0x2c,0x95,0x8d,0x01,0x92,0x38,0x4f,0x32,0x17,0xfd,0x9e,0x05,0x9a,0x2f,0x60,0x8f,0x60,0x4b,0x7d,0x62,0x45,0x13,0x04,0x10,0x29,0x38,0x47,0x2f,0x03,0x53,0xfd,0xf8,0x26,0x47,0x67,0x40, +0x73,0x81,0x00,0x01,0x00,0x79,0xff,0xe8,0x03,0xde,0x05,0xb2,0x00,0x35,0x00,0xd2,0x40,0x15,0x4b,0x35,0x01,0x4a,0x2e,0x01,0x46,0x25,0x01,0x44,0x1a,0x01,0x46,0x15,0x01,0x34,0x18,0x0c,0x00,0x4d,0x2a,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x28,0xb8,0xff,0xf0,0xb3,0x0c,0x00,0x4d,0x19,0xb8,0xff,0xe8,0x40,0x56,0x0c,0x00,0x4d,0x11, +0x18,0x0c,0x00,0x4d,0x09,0x2c,0x13,0x22,0x04,0x18,0x31,0x1a,0x00,0x01,0x00,0x1b,0x01,0x0c,0x03,0x1b,0x18,0x40,0x18,0x1d,0x91,0x59,0x18,0x04,0x00,0x01,0x01,0x0b,0x03,0x01,0x31,0x31,0x06,0x91,0x59,0x31,0x13,0x1b,0x1b,0x2c,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0x08,0x0b,0x06,0x4d,0x22,0x7d,0x13,0x13,0x01, +0x2c,0x08,0x0d,0x06,0x4d,0x2c,0x08,0x0c,0x06,0x4d,0x2c,0x08,0x0b,0x06,0x4d,0x2c,0x7d,0x09,0xb8,0xff,0xf0,0x40,0x0f,0x0b,0x06,0x4d,0x20,0x09,0x01,0x09,0x09,0x37,0x01,0x08,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18, +0x10,0xc4,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x11,0x33,0x32,0x11,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x37,0x35,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e, +0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x79,0x22,0x5f,0x69,0x6a,0x2d,0x9b,0x99,0x33,0x5a,0x7b,0x47,0x4b,0x82,0x60,0x37,0x56,0x8c,0xb3,0x5d,0xd4,0x61,0x7f,0xc7,0x37,0x6e,0x56,0x36,0x29,0x50,0x73,0x4b,0x4d,0x8a,0x68,0x3d,0x53,0x8d,0xb8,0x66,0x22,0x64,0x68,0x5d,0x3a,0xc6,0x1e,0x30,0x21,0x12,0x73,0x6c, +0x3a,0x56,0x47,0x41,0x24,0x26,0x4e,0x5e,0x77,0x50,0x62,0x91,0x5e,0x2e,0x33,0xbd,0x58,0x17,0x34,0x52,0x3b,0x37,0x50,0x42,0x3e,0x25,0x26,0x54,0x66,0x7c,0x50,0x6a,0x93,0x5c,0x29,0x0b,0x15,0x1f,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x07,0x00,0x7e,0x40,0x0b,0x03,0x12,0x01,0x05,0x06,0x05,0x91,0x59,0x06,0x03, +0x05,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x28,0x0b,0x06,0x4d,0x00,0x05,0x00,0x0e,0x02,0x03,0x05,0x42,0xcf,0x05,0x01,0x05,0x05,0x08,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0x04,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x03,0x03, +0x09,0x08,0x09,0x40,0x0c,0x00,0x4d,0x09,0xb8,0xff,0xc0,0xb2,0x0b,0x00,0x4d,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xe2,0x18,0x2f,0x2e,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xa8,0xfe, +0x63,0x03,0xe3,0x05,0x02,0xfa,0xfe,0x05,0x02,0x98,0x00,0x01,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x05,0x9a,0x00,0x0d,0x00,0x7a,0x40,0x31,0x02,0x0a,0x12,0x0a,0x02,0x02,0x08,0x12,0x08,0x02,0x0b,0x04,0x02,0x09,0x91,0x59,0x02,0x13,0x0c,0x03,0x05,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00, +0x7e,0x7f,0x0b,0x01,0x0b,0x0c,0x0d,0x06,0x4d,0x0b,0x0b,0xb8,0xff,0xfa,0x40,0x17,0x0c,0x06,0x4d,0x0b,0x0f,0x07,0x06,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x7e,0x04,0xb8,0xff,0xfe,0x40,0x09,0x0d,0x06,0x4d,0x04,0x04,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2b,0x2f, +0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x3f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x00,0x01,0x00,0x12, +0x00,0x00,0x04,0xe6,0x05,0x9a,0x00,0x0b,0x00,0xc8,0x40,0x0a,0x7b,0x0b,0x01,0x74,0x04,0x01,0x78,0x02,0x01,0x0b,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x0b,0xb8,0xff,0xe0,0xb3,0x0d,0x01,0x4d,0x0b,0xb8,0xff,0xe0,0x40,0x22,0x0b,0x01,0x4d,0x04,0x30,0x0c,0x01,0x4d,0x04,0x20,0x0d,0x01,0x4d,0x04,0x20,0x0b,0x01,0x4d,0x39,0x0b,0x01, +0x36,0x04,0x01,0x74,0x07,0x01,0x07,0x28,0x0b,0x0d,0x01,0x4c,0x07,0xb8,0xff,0xf0,0x40,0x19,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x0b,0x07,0x02,0x03,0x03,0x02,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0x40,0x11,0x0b,0x06,0x4d,0x0b,0x28,0x00,0x01,0x00, +0x08,0x0c,0x0d,0x01,0x4c,0x00,0x00,0x0d,0x04,0xb8,0xff,0xf8,0x40,0x0f,0x0d,0x06,0x4d,0x04,0x04,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x03,0xb8,0xff,0xf8,0xb7,0x0c,0x0d,0x01,0x4c,0x27,0x03,0x01,0x03,0x2f,0x5d,0x2b,0x33,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x2b,0x5d,0x32,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2b, +0x2b,0x2b,0x2b,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0xe6,0xfd,0xed,0xb9,0xfd,0xf8,0xbb,0x01,0x8d,0x13,0x0a,0x04,0x08,0x19,0x01,0x95,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfb,0x8f,0x37,0x48,0x3c,0x45,0x04,0x6f,0x00,0x00,0x01, +0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x00,0x1b,0x01,0x41,0x40,0x20,0x7b,0x1b,0x01,0x79,0x1a,0x01,0x76,0x14,0x01,0x76,0x0d,0x01,0x73,0x0c,0x01,0x75,0x09,0x01,0x7b,0x02,0x01,0x1b,0x20,0x0c,0x00,0x4d,0x1a,0x20,0x0c,0x00,0x4d,0x14,0xb8,0xff,0xe8,0x40,0x09,0x0b,0x00,0x4d,0x13,0x18,0x0b,0x00,0x4d,0x0d,0xb8,0xff,0xe0,0xb3, +0x0c,0x00,0x4d,0x0c,0xb8,0xff,0xe0,0x40,0x0a,0x0c,0x00,0x4d,0x0a,0x08,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x00,0x4d,0x08,0x10,0x0b,0x00,0x4d,0x02,0x10,0x0b,0x00,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x1b,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x1b,0xb8,0xff,0xe0,0xb3, +0x0d,0x01,0x4d,0x1b,0xb8,0xff,0xe8,0x40,0x13,0x0b,0x01,0x4d,0x0c,0x30,0x0c,0x01,0x4d,0x0c,0x20,0x0d,0x01,0x4d,0x0c,0x18,0x0b,0x01,0x4d,0x05,0xb8,0xff,0xc8,0x40,0x22,0x0b,0x0d,0x01,0x4c,0x17,0x38,0x0b,0x0d,0x01,0x4c,0x0f,0x38,0x0b,0x0d,0x01,0x4c,0x17,0x40,0x0b,0x0c,0x00,0x4c,0x0f,0x40,0x0b,0x0c,0x00,0x4c,0x05,0x10,0x0d, +0x06,0x4d,0x17,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xf0,0x40,0x1d,0x0d,0x06,0x4d,0x00,0x01,0x05,0x0f,0x13,0x17,0x06,0x0a,0x0b,0x03,0x0a,0x14,0x13,0x06,0x01,0x02,0x17,0x09,0x0a,0x0f,0x17,0x20,0x0b,0x00,0x4d,0x0f,0xb8,0xff,0xe0,0xb3,0x0b,0x00,0x4d,0x17,0xb8,0xff,0xe0,0x40,0x14,0x0c,0x00,0x4d,0x0f,0x20,0x0c, +0x00,0x4d,0x0f,0x06,0x17,0x03,0x0b,0x00,0x00,0x1d,0x0b,0x2f,0x1d,0x01,0x5d,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, +0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x07,0x60,0xfe,0x6b,0xc5,0xfe,0xd9,0x13,0x04,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x13,0x05,0x05, +0x05,0x1a,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x04,0x17,0x01,0x25,0x05,0x9a,0xfa,0x66,0x04,0x18,0x43,0x4f,0x4a,0x46,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x35,0x5b,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x34,0x56,0x04,0x50,0x00,0x01,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x00,0x15,0x00,0xc0,0x40,0x19,0x7b,0x13,0x01,0x7a, +0x12,0x01,0x75,0x0d,0x01,0x74,0x0c,0x01,0x74,0x08,0x01,0x75,0x07,0x01,0x79,0x02,0x01,0x7b,0x01,0x01,0x13,0xb8,0xff,0xe0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0c,0x20,0x0b,0x0d,0x01,0x4c,0x08,0x20,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x13,0x08,0x0c,0x00,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09,0x0c, +0x00,0x4d,0x0a,0x10,0x0b,0x00,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x0f,0x0c,0x00,0x4d,0x01,0x08,0x0c,0x00,0x4d,0x0f,0x18,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x0f,0xb8,0xff,0xf0,0x40,0x1f,0x0d,0x06,0x4d,0x05,0x10,0x0d,0x06,0x4d,0x01,0x05,0x0f,0x13,0x04,0x09,0x0b,0x03,0x09,0x15,0x0a,0x0b,0x14,0x00, +0x10,0x0b,0x00,0x4d,0x00,0x00,0x17,0x0b,0x09,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d,0x09,0x2f,0x2b,0xc6,0x11,0x33,0x2f,0x2b,0xc6,0x11,0x39,0x39,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23, +0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x04,0x9a,0xcd,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xe0,0xfe,0x46,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe,0x3d,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0xd1,0x02,0xc9,0xfe,0x08,0x32,0x32,0x42,0x26, +0x01,0xf4,0xfd,0x39,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x0d,0x00,0x65,0x40,0x21,0x73,0x06,0x01,0x04,0x09,0x01,0x01,0x05,0x03,0x12,0x0d,0x03,0x05,0x03,0x09,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xfe, +0x40,0x16,0x0b,0x06,0x4d,0x03,0x03,0x05,0x0d,0x7d,0x00,0x00,0x0f,0x06,0x18,0x0b,0x0d,0x01,0x4c,0x06,0x05,0x20,0x0f,0x01,0x5d,0x2f,0x33,0x2b,0x11,0x33,0x2f,0xe9,0x11,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x39,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xcd,0x33,0x31,0x30,0x01,0x5d,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x16, +0x17,0x33,0x36,0x37,0x01,0x04,0x60,0xfe,0x27,0xa8,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x0a,0x1c,0x01,0x50,0x05,0x9a,0xfc,0x78,0xfd,0xee,0x02,0x0e,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x22,0x36,0x02,0x88,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x09,0x00,0xa6,0x40,0x0e,0x0c,0x06,0x01,0x04,0x01,0x01,0x10,0x01, +0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xe0,0x40,0x31,0x0b,0x0d,0x01,0x4c,0x35,0x00,0x45,0x00,0x02,0x03,0x00,0x13,0x00,0x23,0x00,0x03,0x3a,0x05,0x4a,0x05,0x02,0x0c,0x05,0x1c,0x05,0x2c,0x05,0x03,0x17,0x03,0x05,0x01,0x04,0x04,0x01,0x91,0x59,0x04,0x12,0x00,0x08,0x07,0x08,0x07,0x91,0x59,0x08,0x03,0x06,0xb8,0xff,0xf8,0x40, +0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, +0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x2b,0x2b,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xb8,0x03,0x34,0xfb,0xd1,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x26,0x98,0x2f,0x04,0xd3,0x98,0x00,0x00,0x01, +0x00,0xc8,0xfe,0xba,0x02,0x38,0x05,0x9a,0x00,0x07,0x00,0x39,0x40,0x11,0x02,0x05,0xd9,0x59,0x02,0x03,0x01,0x06,0xd9,0x59,0x01,0x20,0x04,0x00,0x06,0xea,0x01,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xe8,0x40,0x09,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0xdd,0xc4,0x00,0x3f,0x2b,0x00, +0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x23,0x11,0x33,0x02,0x38,0xfe,0x90,0x01,0x70,0xde,0xde,0xfe,0xba,0x06,0xe0,0x77,0xfa,0x0e,0x00,0x01,0xff,0xe6,0xff,0x10,0x03,0x1e,0x05,0x9a,0x00,0x03,0x00,0x19,0x40,0x0d,0x78,0x01,0x01,0x00,0x08,0x0b,0x00,0x4d,0x00,0x02,0x03,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x2f,0x31,0x30, +0x01,0x2b,0x5d,0x05,0x23,0x01,0x33,0x03,0x1e,0x97,0xfd,0x5f,0x9b,0xf0,0x06,0x8a,0x00,0x01,0x00,0x35,0xfe,0xba,0x01,0xa4,0x05,0x9a,0x00,0x07,0x00,0x35,0x40,0x1b,0x06,0x05,0xd9,0x59,0x06,0x03,0x01,0x02,0xd9,0x59,0x01,0x20,0x05,0x01,0x00,0xea,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xee,0xb3,0x0b, +0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xdd,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x01,0xa4,0xfe,0x91,0xdd,0xdd,0x01,0x6f,0xfe,0xba,0x77,0x05,0xf2,0x77,0x00,0x00,0x01,0x00,0xe6,0x02,0x70,0x04,0x96,0x05,0xb2,0x00,0x07,0x00,0x26,0x40,0x16,0x79,0x06,0x01,0x79,0x01,0x01, +0x07,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x05,0x03,0x07,0x04,0x2f,0x00,0x01,0x00,0x05,0x2f,0x2f,0x5d,0x00,0x3f,0x33,0x2f,0xc4,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x01,0x23,0x01,0x23,0x01,0x23,0x01,0x33,0x04,0x96,0x96,0xfe,0xb4,0x06,0xfe,0xcb,0x93,0x01,0xa6,0x41,0x02,0x70,0x02,0x6b,0xfd,0x95,0x03,0x42,0x00,0x01,0x00,0x00,0xfe,0xd7, +0x03,0x52,0xff,0x4e,0x00,0x03,0x00,0x0f,0xb6,0x01,0x02,0xd9,0x59,0x01,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0xfe,0xd7,0x77,0x00,0x01,0x00,0x52,0x04,0xc2,0x01,0xd7,0x06,0x0a,0x00,0x03,0x00,0x1c,0xb7,0x77,0x03,0x01,0x03,0x80,0x01,0x00,0x02,0xb8,0xff,0xc0,0xb3,0x0d, +0x10,0x48,0x02,0x2f,0x2b,0xcd,0x00,0x2f,0x1a,0xcd,0x31,0x30,0x01,0x5d,0x01,0x23,0x01,0x33,0x01,0xd7,0x7f,0xfe,0xfa,0xa8,0x04,0xc2,0x01,0x48,0x00,0x02,0x00,0x5a,0xff,0xe8,0x03,0x83,0x04,0x18,0x00,0x14,0x00,0x1f,0x00,0xaa,0x40,0x52,0x06,0x10,0x01,0x00,0x09,0x01,0x10,0x04,0x06,0x18,0x0b,0x0c,0x00,0x4c,0x0b,0x15,0x96,0x59, +0x0b,0x10,0x0d,0x06,0x4d,0x0b,0x0b,0x1c,0x12,0x01,0x15,0x03,0x1c,0x05,0x1c,0x95,0x59,0x05,0x16,0x0f,0x40,0x09,0x0c,0x48,0x0f,0x0f,0x0d,0x12,0x0d,0x95,0x59,0x12,0x10,0x20,0x0f,0x30,0x0f,0x02,0x0f,0x0b,0x1f,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0x02,0x0d,0x06,0x4d,0x01, +0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xee,0x40,0x17,0x0b,0x06,0x4d,0x01,0x01,0x21,0x0f,0x19,0x83,0x08,0x0c,0x0c,0x06,0x4d,0x08,0x04,0x0b,0x06,0x4d,0x2f,0x08,0x01,0x08,0x2f,0x5d,0x2b,0x2b,0xe9,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x33,0x2f,0x5d,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f, +0x2b,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x31,0x30,0x00,0x2b,0x5f,0x5e,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x03,0x83,0xa4,0x04,0x6b,0xd0,0x99,0xad,0x01,0x52, +0x01,0x33,0xd3,0xb9,0x95,0x97,0xc5,0x01,0x69,0xa4,0xf7,0x72,0x74,0x6b,0x59,0x7a,0x9f,0xa0,0xb8,0xa2,0x86,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xfe,0x82,0x94,0x22,0x10,0x51,0x67,0x4b,0x5f,0xab,0x83,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10, +0x06,0x03,0x15,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x07,0x1b,0x09,0x1b,0x95,0x59,0x09,0x10,0x04,0x00,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18, +0x18,0x1f,0x06,0x02,0x12,0x06,0x0d,0x06,0x4d,0x12,0x06,0x0c,0x06,0x4d,0x12,0x06,0x0b,0x06,0x4d,0x12,0x84,0x03,0xb8,0xff,0xf8,0x40,0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b, +0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x15,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9, +0xcb,0x6c,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0x94,0x05,0xec,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x00,0x15,0x00,0x85,0x40,0x5b,0x58,0x03,0x01,0x09,0x0f,0x19,0x0f,0x02,0x0b,0x00,0x15,0x01,0x0c,0x03, +0x15,0x15,0x13,0x02,0x13,0x95,0x59,0x02,0x16,0x0b,0x0b,0x0d,0x08,0x0d,0x95,0x59,0x08,0x10,0x00,0x20,0x0c,0x01,0x4d,0x00,0x00,0x0b,0x0c,0x0c,0x06,0x4d,0x0b,0x02,0x0b,0x06,0x4d,0x70,0x0b,0x01,0x0b,0x20,0x0c,0x01,0x4d,0x0b,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x83,0x05,0x14,0x0d, +0x06,0x4d,0x05,0x0c,0x0c,0x06,0x4d,0x05,0x23,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x2f,0x2b,0x5d,0x2b,0x2b,0x33,0x2f,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x5e,0x5d,0x01,0x5d,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17, +0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x60,0x76,0xa2,0xdb,0xfe,0xf3,0x01,0x22,0xf2,0x87,0x67,0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x86,0x76,0x2f,0x47,0x01,0x1d,0xe3,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0xb4,0xd0,0x59,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9b, +0x40,0x38,0x0f,0x06,0x01,0x10,0x06,0x1c,0x18,0x0b,0x0c,0x00,0x4c,0x02,0x1b,0x05,0x1b,0x95,0x59,0x05,0x16,0x01,0x15,0x0e,0x15,0x0b,0x15,0x95,0x59,0x0b,0x10,0x0f,0x00,0x11,0x0d,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06, +0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x18,0x06,0x0d,0x06,0x4d,0x18,0x06,0x0c,0x06,0x4d,0x18,0x06,0x0b,0x06,0x4d,0x18,0x83,0x08,0x10,0x0d,0x06,0x4d,0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b, +0xe9,0x2b,0x2b,0x2b,0x33,0x33,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1, +0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfb,0xe3,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xdd,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0xaf,0xb5,0x0f,0x07,0x01,0x10,0x06,0x06,0xb8,0xff,0xc0, +0x40,0x2d,0x0b,0x0e,0x48,0x06,0x06,0x01,0x04,0x19,0x01,0x95,0x59,0x19,0x19,0x04,0x0f,0x09,0x04,0x95,0x59,0x09,0x16,0x0f,0x16,0x95,0x59,0x0f,0x10,0x7f,0x07,0x01,0x07,0x16,0x0c,0x06,0x4d,0x07,0x20,0x0c,0x01,0x4d,0x07,0x07,0x00,0x83,0x13,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x13,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x13, +0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x13,0xb8,0xff,0xe8,0x40,0x28,0x0b,0x06,0x4d,0x13,0x13,0x1b,0x19,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x83,0x0c,0x10,0x0d,0x06,0x4d,0x0c,0x10,0x0c,0x06,0x4d,0x0c,0x1d,0x0b,0x06,0x4d,0x0c,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39, +0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x32,0x2f,0x2b,0x2b,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x03, +0xdd,0xfd,0x2d,0x04,0xb0,0x9a,0xad,0x91,0x87,0xde,0xd9,0xf8,0x01,0x0f,0xc9,0xc9,0xdc,0xa8,0x01,0x87,0x78,0x74,0xa2,0x13,0x01,0xd7,0xab,0xba,0x72,0x9a,0x62,0x01,0x17,0xfd,0xef,0x01,0x2d,0xfe,0xfc,0xe7,0x35,0x8e,0x9e,0xa6,0x86,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x14,0x00,0x8a,0xb9,0x00,0x10,0xff, +0xc0,0x40,0x3a,0x0b,0x00,0x4d,0x0a,0x15,0x00,0x00,0x02,0x08,0x0c,0x05,0x0d,0x0d,0x0c,0x95,0x59,0x0d,0x0f,0x12,0x02,0x95,0x59,0x12,0x01,0x07,0x07,0x00,0x0c,0x0c,0x06,0x4d,0x2f,0x00,0x01,0x00,0x0c,0x00,0x0c,0x05,0x0e,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8, +0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xe6,0x40,0x0a,0x0b,0x06,0x4d,0x0a,0x0a,0x16,0x15,0x2f,0x16,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x33,0x2f,0x2f,0x5d,0x2b,0x33,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x11,0x33,0x12,0x39, +0x18,0x2f,0x3f,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x02,0xa0,0x30,0x3d,0xac,0xf0,0xf0,0xa3,0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x10, +0x04,0x18,0x00,0x18,0x00,0x25,0x00,0xca,0x40,0x10,0x0a,0x04,0x01,0x03,0x0f,0x0e,0x01,0x10,0x06,0x24,0x18,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe0,0xb4,0x0b,0x0c,0x00,0x4c,0x05,0xb8,0xff,0xc0,0x40,0x3a,0x0b,0x0f,0x48,0x05,0x05,0x07,0x02,0x07,0x95,0x59,0x02,0x1c,0x0a,0x23,0x0d,0x23,0x95,0x59,0x0d,0x16,0x17,0x0f,0x15,0x1d, +0x13,0x1d,0x95,0x59,0x13,0x10,0x04,0x15,0x19,0x16,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x09,0x05,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf0,0x40,0x2b,0x0b,0x06,0x4d,0x09,0x09,0x27,0x04,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d, +0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x10,0x10,0x0d,0x06,0x4d,0x10,0x0e,0x0c,0x06,0x4d,0x10,0x1a,0x0b,0x06,0x4d,0x10,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x17,0x33,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f, +0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5f,0x5d,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xfd,0xe4,0xbe,0x8e,0xad,0x9d, +0x01,0x7a,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xa4,0xa4,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x52,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x11,0xe6,0x01,0x05,0x01,0x34,0xa6,0x8e,0xfd,0xcf,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x11, +0x00,0x96,0x40,0x28,0x02,0x10,0x01,0x02,0x10,0x01,0x10,0x04,0x01,0x15,0x09,0x15,0x0c,0x04,0x0f,0x04,0x95,0x59,0x0f,0x10,0x0a,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40, +0x1e,0x0b,0x06,0x4d,0x01,0x01,0x13,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b, +0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x05, +0xec,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x02,0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x00,0x0b,0x00,0x0f,0x00,0x4e,0x40,0x23,0x00,0x06,0x63,0x5b,0x00,0x0e,0x0f,0x0d,0x09,0x62,0x03,0x0d,0x0c,0x03,0x62,0xff,0x30,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x84,0x0d,0xb8,0xff,0xfe,0xb3,0x0c, +0x06,0x4d,0x0d,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x0d,0x0d,0x11,0x10,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x3f,0xc6,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0xfa,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x23,0xa4,0xa4,0x05, +0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xfa,0xfc,0x04,0x00,0x00,0x00,0x02,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x00,0x0c,0x00,0x18,0x00,0x6b,0x40,0x34,0x02,0x02,0x01,0x10,0x04,0x0d,0x13,0x63,0x5b,0x0d,0x0b,0x0f,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03,0x1c,0x16,0x62,0x10,0x0a,0x00,0x10,0x62,0xff,0x30,0x06,0x00, +0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0a,0x01,0x0a,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x0a,0x0a,0x1a,0x19,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0xc6,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f, +0x3f,0xc6,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0xa4,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x03,0xf0,0x01, +0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x0c,0x00,0x9b,0x40,0x10,0x7a,0x0c,0x01,0x77,0x0b,0x01,0x79,0x02,0x01,0x7d,0x0a,0x01,0x7e,0x01,0x01,0x0c,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x00,0x4d,0x01,0x10,0x0b,0x00,0x4d,0x00,0xb8,0xff,0xf0,0x40,0x22,0x0c,0x00,0x4d, +0x09,0x02,0x0a,0x05,0x01,0x15,0x05,0x15,0x0a,0x0f,0x06,0x00,0x0a,0x0b,0x0b,0x01,0x70,0x00,0x01,0x00,0x14,0x0b,0x06,0x4d,0x00,0x40,0x0b,0x01,0x4d,0x00,0x0c,0xb8,0xff,0xe8,0x40,0x1c,0x0d,0x06,0x4d,0x0c,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05, +0xb8,0xff,0xff,0xb6,0x0b,0x06,0x4d,0x05,0x2f,0x0e,0x01,0x5d,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x2b,0x2f,0x2b,0x2b,0x5d,0x33,0x33,0x2f,0x33,0x00,0x3f,0x3f,0x3f,0x3f,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01, +0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x05,0xec,0xfc,0x3f,0x01,0xd5,0xfe,0x12,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x00,0x03,0x00,0x3a,0x40,0x16,0x01,0x15,0x02,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01, +0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x01,0x01,0x05,0x04,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x4a,0xa4,0xa4,0x05,0xec,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0x54,0x04,0x18,0x00,0x1f,0x00,0xdd,0xb6,0x49,0x0c,0x01,0x49,0x04, +0x01,0x1e,0xb8,0xff,0xe8,0xb7,0x0b,0x00,0x4d,0x0f,0x21,0x01,0x03,0x1c,0xb8,0xff,0xd0,0x40,0x2c,0x0c,0x00,0x4d,0x02,0x16,0x01,0x0c,0x04,0x05,0x15,0x16,0x1b,0x04,0x0d,0x18,0x0d,0x95,0x59,0x1d,0x18,0x10,0x13,0x0f,0x0a,0x01,0x12,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8, +0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xec,0x40,0x1c,0x0b,0x06,0x4d,0x01,0x0e,0x0a,0x12,0x0a,0x42,0x14,0x11,0x06,0x0d,0x06,0x4d,0x11,0x06,0x0c,0x06,0x4d,0x11,0x06,0x0b,0x06,0x4d,0x11,0x84,0x12,0xb8,0xff,0xfa,0x40,0x31,0x0c,0x06,0x4d,0x12,0x0e,0x0b,0x06,0x4d,0x12,0x1b,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06, +0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x84,0x0a,0x0a,0x04,0x0d,0x06,0x4d,0x0a,0x40,0x0d,0x01,0x4d,0x0f,0x0a,0x01,0x0c,0x03,0x20,0x21,0x0a,0x84,0x30,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x39,0x18,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18, +0x2f,0x33,0x33,0x3f,0x3f,0x33,0x2b,0x11,0x00,0x17,0x33,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x2b,0x5d,0x5d,0x21,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x06,0x54,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9, +0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0x02,0x4c,0xaa,0x98,0xc0,0x86,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb5,0x91,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x96,0x40,0x28,0x02,0x11,0x01,0x02,0x10,0x01,0x10,0x04, +0x01,0x15,0x09,0x15,0x0a,0x0f,0x0c,0x04,0x0f,0x04,0x95,0x59,0x0f,0x10,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0c,0x08,0x06,0x0d,0x06, +0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x14,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33, +0x18,0x3f,0x3f,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0x00,0x02,0x00,0x60,0xff,0xe8, +0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x89,0x40,0x23,0x19,0x40,0x0b,0x02,0x4d,0x00,0x12,0x95,0x59,0x00,0x16,0x06,0x0c,0x95,0x59,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x20, +0x15,0x30,0x15,0x02,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f, +0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab, +0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10,0x06,0x03,0x1b,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x04,0x0f,0x06,0x1b,0x09,0x1b,0x95, +0x59,0x09,0x10,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18,0x18,0x1f,0x06,0x12,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06, +0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30, +0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x70,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x05,0xd7,0xb4,0xcc,0xfe, +0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x10,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x95,0x40,0x35,0x1c,0x18,0x0b,0x0c,0x00,0x4c,0x01,0x1b,0x03,0x1b,0x05,0x1b,0x95,0x59,0x05,0x16,0x0f,0x0f,0x0d,0x15,0x0b,0x15,0x95,0x59,0x0b,0x10,0x0d,0x11,0x0e,0x03, +0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x18,0x06,0x0d,0x06,0x4d,0x18,0x06,0x0c,0x06,0x4d,0x18,0x06,0x0b,0x06,0x4d,0x18,0x83,0x08,0x10,0x0d,0x06,0x4d, +0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x17,0x33,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x2b,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00, +0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x6b,0xf3,0xc1,0xe9,0x01,0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xa4,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0xfe,0x29,0x02,0x87,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfd,0xcd,0x95,0x7e,0xae,0xdb,0xc7,0xb1, +0xc9,0xc5,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x10,0x00,0x59,0xb9,0x00,0x0c,0xff,0xe8,0x40,0x27,0x0b,0x0c,0x00,0x4c,0x07,0x15,0x08,0x0f,0x00,0x00,0x0a,0x02,0x0e,0x10,0x70,0x00,0x01,0x00,0x00,0x12,0x0a,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x84,0x07,0xb8,0xff, +0xf3,0x40,0x0e,0x0d,0x06,0x4d,0x07,0x04,0x0c,0x06,0x4d,0x07,0x05,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x2f,0x5d,0x00,0x3f,0xcd,0x32,0x32,0x2f,0x3f,0x3f,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d, +0xa4,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfd,0xf6,0x04,0x00,0xd3,0x6c,0x79,0x0e,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x03,0x0f,0x04,0x18,0x00,0x2e,0x00,0xa1,0x40,0x19,0x07,0x26,0x01,0x03,0x16,0x01,0x03,0x09,0x0c,0x01,0x09,0x09,0x01,0x0f,0x00,0x01,0x10,0x04,0x2b,0x10,0x0b,0x0c,0x00,0x4c,0x12,0xb8, +0xff,0xf0,0x40,0x35,0x0b,0x0c,0x00,0x4c,0x0a,0x38,0x0b,0x0c,0x00,0x4c,0x05,0x28,0x0f,0x1e,0x04,0x14,0x2d,0x17,0x19,0x14,0x19,0x95,0x59,0x14,0x10,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x0b,0x03,0x01,0x03,0x2d,0x03,0x95,0x59,0x2d,0x16,0x17,0x17,0x28,0x1e,0x83,0x0f,0x0f,0x00,0x28,0x83,0x05,0xb8,0xff,0xe0,0x40,0x16,0x0b,0x06, +0x4d,0x20,0x05,0x30,0x05,0x02,0x05,0x05,0x30,0x00,0x10,0x0d,0x06,0x4d,0x00,0x1c,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x11,0x39,0x2f,0x5d,0x2b,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x17,0x39,0x2b,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d, +0x5d,0x5d,0x5f,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x68,0x86,0xa1,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x42,0x6e,0x8d,0x4b,0x85,0x69,0x71,0x93,0x2e, +0x4a,0x35,0x1d,0x1d,0x38,0x50,0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x92,0x50,0x9e,0x25,0xb0,0x63,0x90,0x29,0x39,0x2c,0x23,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x6f,0x4b,0x26,0x2e,0xa6,0x4a,0x15,0x26,0x35,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5a,0x3e,0x4c,0x70,0x4a,0x24,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81, +0x05,0x2f,0x00,0x14,0x00,0x7c,0x40,0x3b,0x03,0x18,0x0b,0x0c,0x00,0x4c,0x14,0x14,0x12,0x02,0x12,0x95,0x59,0x02,0x16,0x0a,0x0a,0x07,0x0e,0x06,0x0b,0x07,0x07,0x06,0x95,0x59,0x07,0x0f,0x00,0x00,0x0d,0x40,0x0b,0x00,0x4d,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d, +0x0f,0x84,0x04,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xee,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x32,0x2f,0x2f,0x2b,0x33,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x11,0x33,0x11,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x31, +0x30,0x2b,0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3e,0x2d,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x00,0x01,0x00,0x90,0xff,0xe8, +0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0xa1,0x40,0x36,0x49,0x06,0x01,0x49,0x06,0x01,0x03,0x0d,0x10,0x0b,0x0c,0x00,0x4c,0x0f,0x03,0x01,0x0c,0x06,0x01,0x15,0x03,0x0c,0x05,0x0c,0x95,0x59,0x05,0x16,0x10,0x0f,0x08,0x0f,0x01,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0f,0x01,0x0f, +0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0x40,0x2a,0x0b,0x06,0x4d,0x0f,0x0f,0x13,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0a,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x02,0x0b,0x06,0x4d,0x07,0x2f,0x13,0x01,0x5d, +0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x00,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66, +0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x0e,0x00,0x00,0x03,0xcb,0x04,0x00,0x00,0x0b,0x00,0x7b,0x40,0x0d,0x79,0x0b,0x01,0x79,0x02,0x01,0x77,0x01,0x01,0x76,0x04,0x01,0x0b,0xb8,0xff,0xe0,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x04,0x20,0x0b,0x0d, +0x01,0x4c,0x02,0xb8,0xff,0xf4,0x40,0x19,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x76,0x07,0x01,0x07,0x30,0x0b,0x0d,0x01,0x4c,0x0b,0x07,0x03,0x02,0x15,0x03,0x0f,0x0b,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x0b,0x00,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x0d,0x04,0x0c,0x0b,0x06,0x4d,0x04,0x03,0xb8,0xff,0xf0,0xb3,0x0c,0x00, +0x4d,0x03,0x2f,0x2b,0x33,0x2b,0x11,0x33,0x2f,0x2b,0x32,0x2b,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x5d,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x03,0xcb,0xfe,0x68,0xa1,0xfe,0x7c,0xb4,0x01,0x04,0x1d,0x07,0x04,0x0a,0x16,0x01,0x10,0x04,0x00,0xfc,0x00, +0x04,0x00,0xfd,0x18,0x52,0x3d,0x4d,0x3e,0x02,0xec,0x00,0x01,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x00,0x1b,0x00,0xd2,0x40,0x16,0x78,0x1b,0x01,0x77,0x14,0x01,0x76,0x0c,0x01,0x7b,0x0a,0x01,0x74,0x01,0x01,0x38,0x09,0x01,0x37,0x0c,0x01,0x1b,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x13,0xb8,0xff,0xfe,0xb3,0x0b,0x06,0x4d,0x0a, +0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x02,0xb8,0xff,0xfa,0x40,0x18,0x0b,0x06,0x4d,0x14,0x02,0x0b,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x08,0xb8,0xff,0xc0,0xb3,0x0b,0x00,0x4d,0x14,0xb8,0xff,0xf0,0x40,0x09,0x0b,0x00,0x4d,0x13,0x18,0x0b,0x00,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09, +0x0b,0x00,0x4d,0x09,0x10,0x0b,0x00,0x4d,0x1b,0xb8,0xff,0xe0,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x0c,0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xd0,0x40,0x23,0x0b,0x0d,0x01,0x4c,0x17,0x30,0x0b,0x0d,0x01,0x4c,0x0f,0x30,0x0b,0x0d,0x01,0x4c,0x02,0x06,0x0f,0x17,0x13,0x1b,0x00,0x07,0x0a,0x0b,0x0f,0x0a,0x00,0x00,0x1d,0x0b,0x2f,0x1d, +0x01,0x5d,0x2f,0x11,0x33,0x2f,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13, +0x16,0x17,0x33,0x36,0x37,0x13,0x05,0xb0,0xfe,0xcd,0xaa,0xd3,0x0c,0x04,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x0a,0x04,0x08,0x03,0x0f,0xec,0x96,0xd4,0x0a,0x05,0x08,0x02,0x0f,0xd0,0x04,0x00,0xfc,0x00,0x02,0xdd,0x2a,0x35,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc,0xfe,0x23,0x39,0x2c,0x32,0x03,0x00,0xfc,0xfc,0x25,0x37,0x27, +0x35,0x03,0x04,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x13,0x00,0xe0,0x40,0x13,0x7b,0x13,0x01,0x73,0x0e,0x01,0x79,0x0c,0x01,0x74,0x0a,0x01,0x7b,0x03,0x01,0x75,0x01,0x01,0x13,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0a,0x08,0x0b, +0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0x40,0x13,0x0c,0x06,0x4d,0x02,0x10,0x0c,0x06,0x4d,0x01,0x10,0x0c,0x06,0x4d,0x00,0x10,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d, +0x13,0xb8,0xff,0xf0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0e,0x10,0x0b,0x0d,0x01,0x4c,0x0a,0x10,0x0b,0x0d,0x01,0x4c,0x03,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x11,0x18,0x0b,0x01,0x4d,0x06,0xb8,0xff,0xe8,0x40,0x15,0x0b,0x01,0x4d,0x03,0x06,0x11,0x13,0x04,0x0b,0x0d,0x0f,0x0b,0x00,0x02,0x0d,0x0b,0x02,0x02,0x15,0x0b,0x15, +0xb8,0xff,0xc0,0xb2,0x0c,0x00,0x4d,0x2b,0x2f,0x11,0x33,0x2f,0x11,0x33,0x11,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x01,0x33, +0x13,0x16,0x17,0x33,0x01,0x03,0x92,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x13,0x1a,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x16,0x15,0x04,0x01,0x00,0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x09,0x45,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x27,0x29,0x01,0xae,0x00,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x03,0xd5, +0x04,0x00,0x00,0x14,0x00,0x9b,0x40,0x0a,0x0d,0x14,0x01,0x00,0x0d,0x01,0x06,0x02,0x01,0x14,0xb8,0xff,0xe0,0x40,0x2c,0x0b,0x0d,0x01,0x4c,0x0d,0x20,0x0b,0x0d,0x01,0x4c,0x02,0x20,0x0b,0x00,0x4d,0x02,0x10,0x01,0x10,0x04,0x00,0x0f,0x0c,0x0f,0x10,0x30,0x0b,0x0d,0x01,0x4c,0x10,0x01,0x0b,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03, +0x1c,0x06,0x0b,0xb8,0xff,0xf4,0x40,0x0e,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01,0x06,0x0b,0x03,0x0c,0x14,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x14,0x00,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x16,0x0d,0x0c,0x0b,0x06,0x4d,0x0d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x00,0x4d,0x0c,0x2f,0x2b,0x33,0x2b,0x11,0x33,0x2f,0x2b,0x32, +0x2b,0x12,0x17,0x39,0x2b,0x2b,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2f,0x33,0x33,0x2b,0x3f,0x3f,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x2b,0x2b,0x5d,0x5d,0x5d,0x01,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x03,0xd5,0xfe,0x29,0x7e,0xe4,0x40,0x2b,0x35,0x2c, +0x7c,0x3e,0x52,0xfe,0x70,0xb6,0x01,0x15,0x05,0x10,0x06,0x05,0x0f,0x01,0x23,0x04,0x00,0xfb,0x5c,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x0f,0x3f,0x18,0x34,0x03,0x16,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x00,0x09,0x00,0xa5,0x40,0x0e,0x0a,0x06,0x01,0x06,0x01,0x01,0x10,0x01,0x18,0x0b,0x0d,0x01, +0x4c,0x06,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x40,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x35,0x00,0x45,0x00,0x02,0x03,0x00,0x13,0x00,0x23,0x00,0x03, +0x3a,0x05,0x4a,0x05,0x02,0x0c,0x05,0x1c,0x05,0x2c,0x05,0x03,0x17,0x03,0x05,0x01,0x04,0x04,0x01,0x95,0x59,0x04,0x15,0x00,0x08,0x07,0x08,0x07,0x95,0x59,0x08,0x0f,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11, +0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x03,0x70,0xfd,0xa2,0x02,0x58,0xfc,0xb7,0x02,0x5e,0xfd,0xdb,0x03,0x16,0x03,0xd1,0xfc,0xbb,0x8c,0x33,0x03,0x41,0x8c,0x00,0x01,0x00,0x5c,0xfe,0xba,0x02,0x2b, +0x05,0x9a,0x00,0x18,0x00,0x5f,0x40,0x2c,0x11,0x05,0x06,0x06,0x05,0x52,0x59,0x06,0x0b,0x00,0x06,0x4c,0x14,0x30,0x0b,0x0c,0x53,0x59,0x0b,0x03,0x00,0x18,0x53,0x59,0x00,0x20,0x12,0x15,0x05,0x0c,0x18,0x18,0x15,0x05,0x0f,0x08,0x15,0xea,0x02,0x18,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xdc,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf7,0xb3, +0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0x2b,0xe1,0x39,0x39,0xce,0x10,0xc2,0x2f,0x32,0x11,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x24,0x11,0x11,0x34,0x27,0x35,0x36,0x35,0x11,0x10,0x25,0x15,0x06,0x15,0x11,0x14,0x07,0x15,0x16,0x15,0x11,0x14,0x16,0x17,0x02,0x2b, +0xfe,0xcd,0x9c,0x9c,0x01,0x33,0x9f,0x96,0x96,0x47,0x58,0xfe,0xba,0x04,0x01,0x32,0x01,0x2c,0xca,0x0a,0x74,0x0a,0xce,0x01,0x24,0x01,0x36,0x04,0x80,0x04,0xc2,0xfe,0xdb,0xd2,0x30,0x04,0x2d,0xd3,0xfe,0xdf,0x6f,0x5f,0x02,0x00,0x00,0x01,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x13,0x40,0x09,0x03,0x00,0x1c,0x00, +0xea,0x90,0x01,0x01,0x01,0x2f,0x5d,0xe1,0x00,0x3f,0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0xfe,0x1e,0x08,0x00,0x00,0x00,0x01,0x00,0x42,0xfe,0xba,0x02,0x10,0x05,0x9a,0x00,0x18,0x00,0x66,0x40,0x26,0x0c,0x00,0x18,0x18,0x00,0x52,0x59,0x18,0x13,0x05,0x18,0x4c,0x14,0x30,0x13,0x12,0x53,0x59,0x13,0x03,0x05,0x06, +0x53,0x59,0x05,0x20,0x0c,0x09,0x00,0x00,0x03,0x12,0x06,0x16,0x0f,0x03,0xea,0x09,0xb8,0xff,0xe0,0x40,0x0f,0x0d,0x06,0x4d,0x50,0x09,0x01,0x3f,0x09,0x01,0x09,0x20,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x5d,0x5d,0x2b,0xe1,0x39,0x39,0xc6,0x32,0x10,0xca,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00, +0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x06,0x15,0x11,0x10,0x05,0x35,0x36,0x36,0x35,0x11,0x34,0x37,0x35,0x26,0x35,0x11,0x34,0x27,0x35,0x04,0x11,0x11,0x14,0x17,0x02,0x10,0x9c,0xfe,0xce,0x57,0x49,0x95,0x95,0xa0,0x01,0x32,0x9c,0x01,0xf0,0x0a,0xca,0xfe,0xd4,0xfe,0xce,0x04,0x7e,0x02,0x60, +0x6e,0x01,0x21,0xd3,0x2d,0x04,0x30,0xd2,0x01,0x25,0xc2,0x04,0x80,0x04,0xfe,0xca,0xfe,0xdc,0xce,0x0a,0x00,0x01,0x00,0xd1,0x01,0xb8,0x04,0xaa,0x02,0xee,0x00,0x14,0x00,0x44,0xb9,0x00,0x01,0xff,0xe0,0x40,0x23,0x09,0x0c,0x48,0x0b,0x20,0x09,0x0c,0x48,0x09,0x03,0x03,0x11,0xbe,0x59,0x03,0x07,0x40,0x0d,0x07,0xbe,0x59,0x14,0x0d, +0x14,0xbd,0x00,0x09,0xbd,0x0a,0x15,0x16,0x0a,0x00,0xff,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xc4,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x31,0x30,0x01,0x2b,0x2b,0x01,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x04,0xaa,0x07,0x93,0x7e, +0x6d,0x9c,0x61,0x3e,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x02,0xee,0x94,0xa2,0x6d,0x43,0xb0,0x8f,0xa7,0x58,0x5a,0x62,0x50,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xe2,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe6,0x01,0x5b,0x00,0x22,0xb7,0x03,0x70,0x1f,0x01,0x02,0x7f,0x1f, +0x01,0xb8,0xff,0xf3,0x40,0x0a,0x1f,0x19,0x06,0x07,0x3e,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x5d,0x35,0x5d,0x35,0x00,0x03,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xcd,0x00,0x10,0x00,0x1b,0x00,0x23,0x01,0x5d,0x40,0x18,0x76,0x22,0x01,0x79,0x1d,0x01,0x74,0x0c,0x01,0x7b,0x0a,0x01,0x7b,0x07,0x01,0x77,0x06,0x01, +0x10,0x06,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x09,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x09,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x2c,0x0b,0x06,0x4d,0x1d,0x08,0x0c,0x00,0x4d,0x02,0x08,0x0c,0x00,0x4d,0x1d,0x1c,0x02,0x01,0x20,0x01,0x22,0x23,0x03,0x04,0x20,0x04, +0x73,0x04,0x01,0x7c,0x01,0x01,0x10,0x08,0x0b,0x0c,0x00,0x4c,0x04,0x18,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x20,0xb8,0xff,0xc0,0xb4,0x0b,0x0d,0x01,0x4c,0x1f,0xb8,0xff,0xc0,0x40,0x1e,0x0b,0x0d,0x01,0x4c,0x10,0x20,0x0b,0x0d,0x01,0x4c,0x06,0x20,0x0b,0x0d,0x01,0x4c,0x00,0x16,0x01,0x09,0x03,0x1d, +0x1e,0x1f,0x21,0x22,0x05,0x05,0x20,0x20,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x20,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x20,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x20,0x20,0x12,0x16,0x48,0x20,0x00,0x16,0x1c,0x02,0x91,0x59,0x1c,0x1c,0x16,0x00,0x0b,0x11,0xc5,0x59,0x0b,0x10,0x06,0x16,0x03,0x04,0x00,0x12,0x19,0xc4,0x0e,0x40, +0x09,0x0c,0x48,0x0e,0x14,0xc4,0x08,0xb8,0xff,0xc0,0x40,0x12,0x0c,0x00,0x4d,0x08,0x08,0x1c,0x23,0x06,0x10,0x04,0x05,0x77,0x05,0x01,0x79,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x25,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x39,0x2f,0x2b,0xe9, +0xd4,0x2b,0xe9,0x00,0x3f,0xc4,0x3f,0xcd,0x39,0xc4,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x2b,0x2b,0x2b,0x11,0x12,0x17,0x39,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x0e,0xc0,0x10,0x87,0x05,0xc0,0xc0,0x0e,0xc0,0x01,0x2b,0x2b,0x2b,0x2b,0x2b, +0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x11,0x65,0x78,0x5c,0x58,0x70,0x60,0x6e,0x32,0x40, +0x72,0x30,0x42,0x42,0xc9,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x62,0x34,0x70,0x59,0x6e,0x6d,0x54,0x70,0x36,0x01,0x15,0x3f,0x30,0x72,0x42,0x30,0x31,0x3e,0xfb,0xae,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x00,0xff,0xff,0x00,0x5e,0xfe,0x50,0x04,0x8c,0x05,0xb2,0x02,0x26,0x00,0x26,0x00,0x00,0x00,0x07, +0x00,0xdd,0x02,0x39,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x65,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x17,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x38,0x0e,0x0c,0x02,0x03,0x3e,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x0b,0x02,0x26, +0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0xb5,0x01,0x59,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x14,0x0b,0x12,0x25,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe0,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x66,0x01,0x59,0x00,0x1b,0x40,0x10,0x03,0x70, +0x27,0x01,0x02,0x00,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x5d,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x06,0xe4,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x1d,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x1d,0x17,0x05,0x0d,0x25,0x02,0x01,0x1a,0x05, +0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe9,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x12,0x22,0x20,0x10,0x00,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83, +0x06,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xcb,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x11,0x22,0x20,0x10,0x0b,0x25,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x0e,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x96,0x00,0x00,0x00,0x16, +0xb9,0x00,0x02,0xff,0xec,0x40,0x09,0x24,0x20,0x0f,0x14,0x25,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x87,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe2,0x40,0x0a,0x2f,0x29,0x0f,0x14,0x25,0x03,0x02,0x2c,0x11,0x26, +0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xb2,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xa8,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xeb,0x40,0x09,0x2a,0x20,0x0f,0x14,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83, +0x06,0x1c,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xe9,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe9,0x40,0x0a,0x23,0x29,0x0f,0x14,0x25,0x03,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x00,0xdd, +0x01,0x83,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x0f,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x27,0x1b,0x1d,0x0c,0x12,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48, +0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xfe,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x09,0x1d,0x1b,0x0c,0x12,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0e,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xb8,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf7,0x40, +0x09,0x1f,0x20,0x16,0x0f,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x87,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x88,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x29,0x23,0x0c,0x12,0x25,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, +0x35,0x00,0xff,0xff,0x00,0x58,0x00,0x00,0x01,0xdd,0x06,0x0a,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0x8e,0xd1,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x01,0x71,0x06,0x0a,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06, +0x00,0x43,0x9a,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x05,0x04,0x02,0x03,0x25,0x01,0x05,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xd3,0x00,0x00,0x02,0x07,0x06,0x0e,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0x77,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x08,0x04,0x02,0x03,0x25, +0x01,0x08,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc9,0x00,0x00,0x02,0x10,0x05,0x87,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x4c,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf4,0x40,0x0a,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff, +0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xb2,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xe8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1d,0x13,0x0a,0x12,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07, +0x00,0x8e,0x01,0x42,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe4,0x40,0x09,0x19,0x19,0x0c,0x06,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x14,0x19,0x19,0x03,0x09, +0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0e,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1d,0x1e,0x03,0x09,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8, +0x04,0x50,0x05,0x87,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xb2,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd8, +0x00,0xff,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x22,0x18,0x03,0x09,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x3c,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfb,0x40,0x09,0x14,0x12,0x09,0x11,0x25, +0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xea,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x17,0x14,0x12,0x08,0x10,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2, +0x06,0x0e,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xc6,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x16,0x12,0x08,0x11,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0x87,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xa0,0x00,0x00,0x00,0x17, +0x40,0x0d,0x02,0x01,0x07,0x21,0x1b,0x08,0x11,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x0b,0x00,0x36,0x40,0x1b,0x0b,0x01,0x09,0x06,0x40,0x04,0x00,0x08,0x10,0x08,0x02,0x0a,0x03,0x08,0x00,0x05,0x06,0x05,0x91,0x59,0x0b,0x06,0x06,0x03, +0x08,0x03,0x03,0x00,0x2f,0x3f,0x12,0x39,0x2f,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x1a,0xce,0xdd,0x32,0xce,0x31,0x30,0x01,0x25,0x03,0x23,0x03,0x05,0x35,0x05,0x03,0x33,0x03,0x25,0x02,0xd8,0xfe,0xfa,0x28,0x4c,0x28,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x01,0x2e,0x03,0x7d,0x1e,0xfd,0x4a,0x02,0xb6,0x1e, +0x96,0x14,0x01,0x9a,0xfe,0x66,0x14,0x00,0x00,0x02,0x00,0x6c,0x03,0x81,0x02,0x96,0x05,0xaa,0x00,0x0b,0x00,0x17,0x00,0x38,0x40,0x21,0x00,0x12,0xd8,0x59,0x00,0x0e,0x06,0x06,0x0c,0xd8,0x59,0x06,0x04,0x03,0x09,0x42,0x15,0xd8,0x09,0x0f,0xd8,0x03,0x0f,0x09,0x01,0x17,0x03,0x18,0x19,0x03,0x09,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d, +0x10,0xe1,0x10,0xe1,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x81,0x73,0xa2,0xa0,0x73,0x74,0xa3,0xa2,0x73,0x41,0x5c,0x5a,0x41,0x41,0x5e,0x5c,0x03,0x81,0xa3,0x74,0x73,0x9f,0xa0, +0x72,0x74,0xa3,0x01,0xb4,0x5c,0x41,0x43,0x5f,0x60,0x42,0x42,0x5b,0x00,0x00,0x02,0x00,0xb8,0xff,0xcf,0x03,0xb8,0x05,0x85,0x00,0x16,0x00,0x1d,0x00,0x7f,0x40,0x42,0x05,0x10,0x01,0x03,0x0f,0x00,0x01,0x10,0x05,0x16,0x16,0x17,0x14,0x02,0x14,0x9a,0x59,0x05,0x02,0x02,0x11,0x12,0x11,0x02,0x0c,0x03,0x11,0x11,0x18,0x13,0x0e,0x13, +0x99,0x59,0x0b,0x0e,0x02,0x0e,0x02,0x0c,0x04,0x1e,0x0c,0x0b,0x0e,0x14,0x17,0x04,0x02,0xdc,0x70,0x05,0x01,0x02,0x05,0x01,0x05,0x05,0x08,0x11,0x00,0x00,0x1f,0x1b,0x89,0x08,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x08,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x5d,0xe1,0x17,0x39,0x00,0x2f,0x10,0xc6,0x11,0x39,0x39, +0x2f,0x2f,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x11,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x02,0x35,0x34,0x12,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x05,0x11,0x06,0x06,0x15,0x14,0x16,0x03,0xb8,0x60,0x7d,0x7d, +0xc1,0xe5,0xe5,0xc1,0x7d,0x7b,0x62,0x65,0x78,0x7a,0x63,0xfe,0xa6,0x77,0x87,0x88,0xd1,0x3b,0x0a,0xbd,0xbf,0x16,0x01,0x16,0xcf,0xdb,0x01,0x27,0x25,0xd5,0xcb,0x02,0x31,0xac,0x47,0x07,0xfc,0xef,0x0c,0x4a,0x4b,0x02,0xf9,0x1f,0xcd,0x96,0x96,0xc6,0x00,0x01,0x00,0x6a,0x00,0x00,0x03,0xee,0x05,0xb2,0x00,0x1b,0x00,0x6a,0x40,0x39, +0x02,0x0e,0x01,0x03,0x00,0x12,0x01,0x10,0x05,0x17,0x14,0x05,0x08,0x08,0x05,0x9a,0x59,0x08,0x08,0x1b,0x0f,0x0c,0x40,0x0c,0x11,0x9a,0x59,0x0c,0x04,0x02,0x00,0x1b,0x00,0x1b,0x9a,0x59,0x00,0x12,0x15,0x15,0x18,0x7f,0x0e,0x01,0x0e,0x00,0x1a,0x02,0x06,0x14,0x08,0x18,0x8a,0x20,0x04,0x01,0x04,0x2f,0x5d,0xe1,0x39,0x39,0xc6,0xc6, +0x32,0x2f,0xc4,0x5d,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5f,0x5d,0x21,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21, +0x15,0x14,0x07,0x21,0x03,0xee,0xfc,0x7c,0xda,0xc5,0xc5,0xda,0xad,0x75,0x60,0x64,0x6f,0xe5,0x01,0x28,0xfe,0xd8,0xc1,0x02,0xc7,0x87,0x45,0xf4,0xbb,0x8d,0xfe,0xbc,0xf0,0x29,0x9b,0x39,0xfe,0xcd,0xec,0x8d,0x9c,0xf2,0x61,0x00,0x00,0x02,0x00,0x83,0xff,0xbe,0x03,0x27,0x05,0xd3,0x00,0x26,0x00,0x30,0x00,0xcf,0x40,0x1b,0x24,0x22, +0x01,0x23,0x1b,0x01,0x2c,0x0f,0x01,0x2b,0x07,0x01,0x2c,0x30,0x01,0x25,0x2b,0x01,0x25,0x26,0x01,0x11,0x20,0x0c,0x00,0x4d,0x23,0xb8,0xff,0xe0,0xb3,0x0c,0x00,0x4d,0x17,0xb8,0xff,0xf0,0x40,0x5d,0x0b,0x0c,0x00,0x4c,0x03,0x10,0x0b,0x0c,0x00,0x4c,0x2c,0x00,0x0a,0x27,0x14,0x05,0x19,0x00,0x08,0x01,0x0e,0x03,0x08,0x08,0x0a,0x05, +0x0a,0x9a,0x59,0x05,0x00,0x1c,0x10,0x1c,0x02,0x0f,0x03,0x1c,0x1c,0x1e,0x19,0x1e,0x9a,0x59,0x19,0x2c,0x00,0x02,0x29,0x27,0x14,0x2e,0x16,0x0d,0x7e,0x02,0x1c,0x40,0x0b,0x10,0x01,0x4c,0x02,0x40,0x0c,0x10,0x01,0x4c,0x1c,0x02,0x1c,0x02,0x2e,0x7e,0x25,0x40,0x0b,0x0c,0x01,0x4c,0x25,0x25,0x32,0x12,0x20,0x7e,0x16,0x08,0x16,0x08, +0x29,0x7e,0x12,0x2f,0xe1,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x39,0x39,0x2f,0x2f,0x2b,0x2b,0x10,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x2b,0x2b, +0x2b,0x2b,0x01,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x01,0x06,0x15,0x14,0x16,0x17,0x36,0x35,0x34,0x26,0x02,0x92,0x5a,0xc8, +0x9b,0x83,0x6c,0x82,0x78,0x54,0x5c,0x47,0x91,0xe9,0x93,0x6a,0xbb,0x99,0x82,0x59,0x65,0x7a,0xa8,0x51,0xa3,0xdf,0xfe,0x67,0x65,0x71,0x8d,0x58,0x69,0x01,0xa0,0x4a,0x70,0x84,0xa4,0x38,0x9e,0x4a,0x4f,0x3c,0x35,0x49,0x4d,0x7a,0xc3,0xa3,0x51,0x53,0x8c,0x7f,0xa4,0x2b,0x9e,0x3e,0x90,0x37,0x5a,0x4e,0x6b,0xba,0xaa,0x01,0x7f,0x33, +0x6c,0x48,0x6d,0x3f,0x44,0x68,0x48,0x65,0x00,0x01,0x00,0xa4,0x01,0x98,0x02,0x9c,0x03,0x90,0x00,0x0b,0x00,0x19,0x40,0x0c,0x00,0x0e,0x40,0x06,0x03,0x09,0x42,0x09,0x20,0x03,0x01,0x03,0x2f,0x5d,0xcd,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xa2,0x68,0x96,0x96, +0x68,0x68,0x92,0x92,0x01,0x98,0x92,0x68,0x67,0x97,0x96,0x68,0x68,0x92,0x00,0x01,0x00,0x54,0x00,0x00,0x03,0x42,0x05,0x9a,0x00,0x0f,0x00,0x7c,0x40,0x38,0x08,0x08,0x0f,0x02,0x04,0x00,0x0f,0x00,0xe2,0x59,0x0f,0x03,0x06,0x02,0x12,0x00,0x00,0x02,0x10,0x0d,0x06,0x4d,0x02,0x8c,0x03,0x18,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d, +0x03,0x26,0x0b,0x06,0x4d,0x2f,0x03,0x01,0x03,0x06,0x10,0x0d,0x06,0x4d,0x06,0x8c,0x08,0x03,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x08,0xb8,0xff,0xec,0xb4,0x0b,0x06,0x4d,0x08,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x0b,0x2f,0x2b,0x2b,0xdd,0x2b,0x2b,0x2b,0xe1,0x2b, +0xd4,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0xca,0x2f,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x42,0x80,0x6a,0x9e,0x6c,0x6c,0x8e,0x95,0x6b,0x01,0xee,0x05,0x33,0xfa,0xcd,0x05,0x33,0xfa,0xcd,0x03,0x87,0x98,0x73, +0x75,0x93,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x14,0x06,0x02,0x00,0x25,0x00,0xa2,0x40,0x09,0x0f,0x22,0x01,0x00,0x11,0x01,0x10,0x05,0x20,0xb8,0xff,0xe0,0xb4,0x0b,0x0c,0x00,0x4c,0x1a,0xb8,0xff,0xe8,0x40,0x32,0x0b,0x00,0x4d,0x1f,0x09,0x0a,0x0a,0x09,0x96,0x59,0x18,0x24,0x0a,0x95,0x14,0x30,0x18,0x10,0x95,0x59,0x18,0x01,0x01, +0x03,0x24,0x03,0x95,0x59,0x24,0x16,0x14,0x15,0x1f,0x1b,0x09,0x00,0x00,0x13,0x0d,0x83,0x1b,0x10,0x0c,0x06,0x4d,0x1b,0x1b,0x06,0x83,0x21,0xb8,0xff,0xe8,0x40,0x16,0x0c,0x06,0x4d,0x21,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x84,0x14,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x14,0x06, +0x0b,0x06,0x4d,0x14,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2f,0x2b,0xe1,0x39,0x2f,0x2b,0xe1,0x11,0x39,0x2f,0xc4,0x11,0x39,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x2b,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x35,0x36,0x36,0x35, +0x34,0x26,0x23,0x22,0x11,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x04,0x11,0x14,0x06,0x23,0x22,0x01,0xcd,0x4b,0x5f,0x6d,0x88,0xc8,0xb2,0x76,0x98,0x6e,0x61,0xe7,0xa4,0xdc,0xba,0xa6,0xc6,0x96,0x78,0x01,0x7a,0xde,0xb7,0x65,0x02,0xa0,0x30,0x93,0x7c,0x96,0xbb,0x14,0x82,0x14,0xa6,0x72,0x6c,0x77,0xfe, +0xcb,0xfb,0xbe,0x04,0x5a,0xc0,0xe8,0xbe,0x9c,0x7f,0xca,0x27,0x05,0x4b,0xfe,0xa1,0xb1,0xf0,0xff,0xff,0x00,0x90,0x01,0xfa,0x02,0xb2,0x02,0x7b,0x02,0x06,0x00,0x10,0x00,0x00,0x00,0x04,0x01,0x38,0x00,0xff,0x05,0xe7,0x05,0xae,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x32,0x00,0x79,0x40,0x40,0x09,0xc6,0x15,0x2a,0x18,0x50,0x19,0x1a, +0x19,0x27,0x24,0x50,0x2f,0x2c,0x1e,0x50,0x1f,0x15,0x19,0x2f,0x1f,0x1f,0x2f,0x19,0x15,0x04,0x34,0x0f,0xc6,0x40,0x03,0x28,0x2c,0x1d,0x2c,0x1d,0x51,0x59,0x2c,0x2c,0x20,0x1f,0x20,0x2b,0x52,0x59,0x20,0x20,0x0c,0x06,0x0c,0xc7,0x59,0x06,0x28,0x19,0x1f,0x1f,0x12,0x00,0x12,0xc7,0x59,0x00,0x00,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f, +0x33,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x33,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x25,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x00,0x15,0x14, +0x00,0x33,0x32,0x00,0x35,0x34,0x00,0x13,0x23,0x27,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x17,0x01,0x15,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x90,0xf9,0xfe,0xa1,0x01,0x5f,0xf9,0xf8,0x01,0x5f,0xfe,0xa1,0xf7,0xd2,0xfe,0xd7,0x01,0x29,0xd2,0xd1,0x01,0x27,0xfe,0xd9,0x51,0x8a,0x53,0x3f,0x49, +0x34,0x75,0xd7,0x85,0x91,0x66,0x5b,0x3f,0x3f,0xfe,0xcb,0x5e,0x9e,0x55,0x5c,0xff,0x01,0x5e,0xf9,0xf9,0x01,0x5f,0xfe,0xa1,0xf9,0xf9,0xfe,0xa2,0x04,0x51,0xfe,0xd8,0xd2,0xd1,0xfe,0xd8,0x01,0x28,0xd1,0xd2,0x01,0x28,0xfc,0x8f,0xb7,0x8a,0xfe,0xbf,0x02,0xfb,0x70,0x60,0x4e,0x6f,0x13,0x03,0x0e,0x7f,0x01,0xcd,0xf5,0x7b,0x47,0x33, +0x00,0x03,0x00,0xa2,0xff,0xdf,0x06,0x7d,0x05,0xbb,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x7b,0xb9,0x00,0x12,0xff,0xe8,0x40,0x46,0x0c,0x00,0x4d,0x0c,0x18,0x0c,0x00,0x4d,0x22,0x0f,0x2d,0x01,0x0f,0x03,0x2d,0x2d,0x15,0x28,0xca,0x1d,0x1d,0x15,0x0f,0xc9,0x03,0x15,0xc9,0x40,0x09,0xc6,0x03,0x1a,0x2b,0x53,0x59,0x0f,0x1a,0x1f,0x1a, +0x2f,0x1a,0x03,0x0f,0x03,0x1a,0x1a,0x25,0x12,0x20,0x25,0x53,0x59,0x20,0x20,0x0c,0x12,0x06,0x0c,0xcb,0x59,0x00,0x12,0xcb,0x59,0x06,0x00,0xc7,0x59,0x06,0x04,0x00,0x3f,0x2b,0x2b,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x01,0x18,0x2f,0xf0,0x1a,0xe9,0x10,0xe9,0x11,0x39,0x2f, +0xe1,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0xc6,0x00,0x2b,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x03,0x06,0x23,0x22,0x24,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x90,0xfe,0xc9,0xfe, +0x49,0x01,0xb7,0x01,0x37,0x01,0x36,0x01,0xb7,0xfe,0x49,0xfe,0xca,0xfe,0xee,0xfe,0x7c,0x01,0x84,0x01,0x12,0x01,0x12,0x01,0x83,0xfe,0x7d,0x03,0x69,0x8f,0xc0,0xfe,0xfc,0x01,0x0a,0xd5,0x79,0x60,0x56,0x8f,0x8d,0xb7,0xbb,0x90,0x84,0x5e,0x21,0x01,0xb7,0x01,0x37,0x01,0x37,0x01,0xb7,0xfe,0x49,0xfe,0xc9,0xfe,0xc9,0xfe,0x49,0x05, +0x84,0xfe,0x7c,0xfe,0xee,0xfe,0xee,0xfe,0x7d,0x01,0x83,0x01,0x12,0x01,0x12,0x01,0x84,0xfb,0xe6,0x45,0xfa,0xbc,0xda,0x01,0x04,0x35,0x96,0x48,0xb4,0x98,0x94,0xb2,0x4e,0x00,0x00,0x02,0x00,0x4c,0x03,0x04,0x05,0x74,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x79,0x40,0x49,0x0f,0x0c,0x01,0x10,0x04,0x0d,0x28,0x0b,0x0c,0x00,0x4c,0x0c, +0x28,0x0b,0x0c,0x00,0x4c,0x02,0x07,0x0c,0x03,0x16,0x01,0x05,0x09,0x03,0x13,0x11,0x15,0x16,0x15,0x54,0x59,0x0e,0x0a,0x16,0x03,0x0e,0x00,0x50,0x50,0x01,0x01,0x0f,0x01,0x01,0x0b,0x01,0x01,0x0b,0x08,0x50,0x0f,0x09,0x01,0x10,0x03,0x09,0x09,0x13,0x10,0x0e,0x12,0x50,0x13,0x13,0x15,0x42,0x15,0x20,0x13,0x01,0x13,0x2f,0x5d,0xc6, +0x2b,0x01,0x10,0xf1,0xe2,0x11,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0xe1,0x32,0x33,0x2f,0x5e,0x5d,0x5d,0xe1,0x33,0x00,0x3f,0x33,0x33,0x2b,0x11,0x00,0x33,0x18,0x2f,0x17,0x33,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x01,0x23,0x11,0x23,0x03,0x23,0x03,0x23,0x11,0x23,0x11,0x33,0x13,0x33,0x13,0x33,0x05,0x23,0x11,0x23,0x11, +0x23,0x35,0x21,0x05,0x74,0x6c,0x04,0xdb,0x3b,0xd6,0x04,0x66,0x7f,0xe1,0x04,0xe4,0x7e,0xfc,0xe6,0xd1,0x6f,0xce,0x02,0x0e,0x03,0x04,0x01,0xde,0xfe,0x22,0x01,0xde,0xfe,0x22,0x02,0x96,0xfe,0x10,0x01,0xf0,0x62,0xfd,0xcc,0x02,0x34,0x62,0x00,0x01,0x00,0x87,0x04,0xc2,0x02,0x0c,0x06,0x0a,0x00,0x03,0x00,0x13,0xb7,0x78,0x03,0x01, +0x03,0x02,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x5d,0x01,0x01,0x23,0x13,0x02,0x0c,0xfe,0xfa,0x7f,0xdf,0x06,0x0a,0xfe,0xb8,0x01,0x48,0x00,0x00,0x02,0x00,0x7d,0x04,0xc2,0x02,0xc4,0x05,0x87,0x00,0x0b,0x00,0x17,0x00,0x2a,0x40,0x16,0x06,0x00,0x12,0xc1,0x0c,0x09,0xc0,0x03,0x0f,0xc0,0x10,0x15,0x01,0x0f, +0x03,0x01,0x15,0x03,0x15,0x03,0x19,0x18,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x62,0x28,0x3a,0x38,0x28,0x2a,0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x39, +0x29,0x29,0x3c,0x3a,0x04,0xc2,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x3b,0x28,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x01,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xa4,0x00,0x13,0x00,0x89,0x40,0x3b,0x0e,0x11,0x12,0x01,0x02,0x0d,0x02,0x0b,0x08,0x07,0x04,0x03,0x0c,0x03,0x04,0x40,0x12,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x07,0x0b, +0x40,0x11,0x0e,0x08,0x0b,0x0b,0x08,0xbe,0x59,0x0c,0x40,0x0b,0x01,0x02,0x04,0x07,0x08,0x0b,0x0c,0x0e,0x11,0x12,0x0a,0x03,0x0d,0x03,0x0d,0x03,0x10,0x09,0x00,0x05,0x00,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x14,0x15,0x05,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x2b,0x11,0x12,0x39,0x39,0x39, +0x39,0x18,0x2f,0x2f,0x12,0x17,0x39,0x00,0x2f,0x1a,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xdd,0x31,0x30,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x01,0x21,0x03,0x23,0x13,0x23,0x35,0x21,0x13,0x21,0x35,0x21,0x13,0x33,0x03,0x21,0x15,0x21,0x03, +0x21,0x04,0x94,0xfd,0xda,0xa3,0x8d,0xa4,0xfa,0x01,0x3f,0x95,0xfe,0x2c,0x02,0x1a,0x9e,0x8d,0x9f,0x01,0x06,0xfe,0xb6,0x98,0x01,0xe2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x84,0x01,0x26,0x84,0x01,0x38,0xfe,0xc8,0x84,0xfe,0xda,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x06,0x83,0x05,0x9a,0x00,0x0f,0x00,0x13,0x00,0xb3,0x40,0x0e,0x13,0x03, +0x04,0x12,0x04,0x02,0x12,0x01,0x00,0x04,0x01,0x10,0x04,0x12,0xb8,0xff,0xf0,0x40,0x21,0x0c,0x00,0x4d,0x0c,0x08,0x00,0x00,0x15,0x01,0x12,0x06,0x06,0x05,0x11,0x09,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x01,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06, +0x4d,0x01,0xb8,0xff,0xd6,0x40,0x2b,0x0b,0x06,0x4d,0x01,0x01,0x15,0x04,0x05,0x13,0x03,0x91,0x59,0x13,0x13,0x07,0x00,0x0b,0x0c,0x91,0x59,0x0b,0x07,0x00,0x0b,0x91,0x2b,0x30,0x12,0x08,0x07,0x08,0x91,0x59,0x07,0x03,0x05,0x00,0x00,0x0f,0x91,0x59,0x00,0x12,0x00,0x3f,0x2b,0x00,0x10,0x18,0xc4,0x3f,0x2b,0x11,0x00,0x33,0x2b,0x00, +0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x01,0x18,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xc4,0xc4,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01, +0x11,0x23,0x01,0x06,0x83,0xfd,0x09,0xfe,0x02,0xc1,0xc3,0x02,0xbc,0x03,0x9c,0xfd,0xd1,0x02,0x07,0xfd,0xf9,0x02,0x50,0xfd,0x09,0x5f,0xfe,0xa6,0x01,0x92,0xfe,0x6e,0x05,0x9a,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x01,0x91,0x02,0xd9,0xfd,0x27,0x00,0x03,0x00,0x5e,0xff,0xcd,0x05,0xaa,0x05,0xd3,0x00,0x13,0x00,0x1b,0x00,0x23,0x01,0x03, +0x40,0x0a,0x57,0x09,0x01,0x57,0x0e,0x01,0x58,0x0d,0x01,0x1d,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d,0x0c,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x0a,0xb8,0xff,0xf0,0x40,0x21,0x0b,0x00,0x4d,0x14,0x1d,0x22,0x19,0x01,0x02,0x0b,0x0c,0x02,0x0c,0x02,0x05,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06, +0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x22,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x22,0xb8,0xff,0xea,0x40,0x0b,0x0b,0x06,0x4d,0x00,0x22,0x10,0x22,0x02,0x0b,0x03,0x22,0xb8,0xff,0xf8,0x40,0x4b,0x0b,0x06,0x4d,0x22,0x22,0x25,0x19,0x06,0x0d,0x06,0x4d,0x19,0x06,0x0c,0x06,0x4d, +0x19,0x06,0x0b,0x06,0x4d,0x19,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x0c,0x0b,0x08,0x02,0x01,0x12,0x40,0x14,0x1b,0x1c,0x1d,0x04,0x1f,0x16,0x00,0x03,0x0a,0x0d,0x04,0x12,0x08,0x08,0x16,0x91,0x59,0x08,0x04,0x12,0x1f,0x91,0x59,0x12,0x13,0x2f,0x25,0x01,0x5d,0x00,0x3f,0x2b,0x00, +0x18,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x11,0x12,0x17,0x39,0x1a,0x18,0x10,0xce,0x32,0x10,0xce,0x32,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x2b,0x01,0x5d, +0x5d,0x00,0x5d,0x25,0x07,0x27,0x37,0x26,0x11,0x10,0x00,0x21,0x32,0x17,0x37,0x17,0x07,0x16,0x11,0x10,0x00,0x21,0x20,0x01,0x26,0x23,0x22,0x00,0x11,0x14,0x17,0x01,0x01,0x16,0x33,0x32,0x00,0x11,0x10,0x01,0x44,0x98,0x4e,0x9e,0x9e,0x01,0x75,0x01,0x43,0xea,0xa8,0x87,0x4e,0x8b,0xb8,0xfe,0x8c,0xfe,0xc8,0xfe,0xf6,0x02,0x4e,0x7e, +0xba,0xe3,0xfe,0xe7,0x62,0x03,0x15,0xfd,0x2b,0x83,0xcb,0xec,0x01,0x10,0x83,0xb6,0x41,0xbf,0xc3,0x01,0x2c,0x01,0x57,0x01,0x9f,0x81,0xa2,0x3f,0xa6,0xc8,0xfe,0xb9,0xfe,0xa1,0xfe,0x68,0x04,0xcc,0x66,0xfe,0xb8,0xfe,0xf9,0xdf,0x96,0x03,0x14,0xfc,0x9e,0x89,0x01,0x35,0x01,0x14,0x01,0x04,0x00,0x03,0x00,0x52,0x00,0xcf,0x06,0x3a, +0x03,0xd9,0x00,0x13,0x00,0x1d,0x00,0x27,0x00,0x8e,0x40,0x15,0x57,0x25,0x01,0x57,0x21,0x01,0x58,0x1b,0x01,0x58,0x17,0x01,0x14,0x00,0x23,0x1e,0x0a,0x05,0x19,0xbd,0x0f,0xb8,0xff,0xe0,0x40,0x0c,0x0c,0x06,0x4d,0x00,0x0f,0x01,0x0f,0x0f,0x29,0x23,0xbd,0x05,0xb8,0xff,0xe0,0x40,0x11,0x0c,0x06,0x4d,0x0f,0x05,0x1f,0x05,0x02,0x0b, +0x03,0x05,0x00,0x40,0x0c,0x00,0x4d,0x0a,0xb8,0xff,0xe0,0x40,0x1a,0x0c,0x00,0x4d,0x1e,0x26,0x14,0x00,0x0c,0x16,0x12,0x02,0x26,0x02,0x26,0xeb,0x59,0x02,0x1c,0x0c,0x20,0x08,0x08,0x20,0xeb,0x59,0x08,0x00,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x11,0x39,0x39,0x12,0x39,0x2b,0x2b,0x01,0x18, +0x2f,0x5f,0x5e,0x5d,0x2b,0xe1,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x13,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x12,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x01,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32, +0x03,0x44,0xa8,0xd6,0xa5,0xcf,0xd8,0x9c,0xec,0x96,0xa4,0xd8,0xa6,0xd0,0xd8,0x9e,0xe2,0x5d,0x83,0xbc,0x6d,0x83,0x88,0x68,0xad,0xfe,0xef,0x84,0xbc,0x6e,0x83,0x87,0x6a,0xb0,0x01,0xe2,0xfe,0xed,0xd5,0xac,0xa2,0xe7,0xfe,0xef,0x01,0x11,0xd5,0xac,0xa1,0xe8,0x01,0x85,0xfe,0xfc,0x91,0x77,0x70,0x94,0xfe,0xfa,0x01,0x06,0x96,0x76, +0x6e,0x92,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xa4,0x00,0x0b,0x00,0x0f,0x00,0x5d,0x40,0x2e,0x03,0x0e,0x04,0x08,0x0e,0x07,0x40,0x0a,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x0f,0x07,0x1f,0x07,0xaf,0x07,0x03,0x0d,0x03,0x07,0x0f,0x0c,0x0f,0xbe,0x59,0x0c,0x12,0x0f,0x00,0x0e,0x0a,0x07,0x01,0xbd,0x04,0x04,0x05,0x42,0x0e, +0x05,0x04,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0xcd,0x32,0x2b,0x01,0x10,0xf1,0x39,0x39,0xe1,0x32,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x11,0x21,0x35,0x21,0x04, +0x94,0xfe,0x6c,0x83,0xfe,0x6b,0x01,0x95,0x83,0x01,0x94,0xfc,0x54,0x03,0xac,0x02,0x8c,0xfe,0x6c,0x01,0x94,0x84,0x01,0x94,0xfe,0x6c,0xfc,0xf0,0x85,0x00,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xcb,0x00,0x07,0x00,0x0b,0x00,0x5c,0x40,0x0b,0x08,0x01,0x01,0x07,0x10,0x0b,0x00,0x4d,0x02,0x01,0x00,0xb8,0xff,0xc0,0x40,0x15, +0x0c,0x00,0x4d,0x00,0x03,0x01,0x10,0x03,0x03,0x03,0x00,0x0a,0x09,0x0a,0xbe,0x59,0x09,0x12,0x03,0x07,0x08,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x08,0x05,0x01,0x09,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x09,0x40,0x0c,0x00,0x4d,0x09,0x2f,0x2b,0x2b,0xc4,0x32,0x2f,0x2b,0xc4,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x32,0x2f, +0x5f,0x5e,0x5d,0x2b,0x39,0x39,0x31,0x30,0x2b,0x5d,0x25,0x01,0x35,0x01,0x15,0x01,0x15,0x01,0x13,0x21,0x35,0x21,0x04,0x6c,0xfc,0xa4,0x03,0x5c,0xfd,0x7e,0x02,0x82,0x28,0xfc,0x54,0x03,0xac,0xfe,0x01,0xb2,0x3a,0x01,0xe1,0x96,0xfe,0x9e,0x04,0xfe,0xc7,0xfe,0x6a,0x85,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xcd,0x00,0x07, +0x00,0x0b,0x00,0x5c,0x40,0x10,0x08,0x00,0x01,0x02,0x10,0x0b,0x00,0x4d,0x07,0x00,0x00,0x06,0x01,0x10,0x03,0x01,0xb8,0xff,0xc0,0x40,0x10,0x0c,0x00,0x4d,0x06,0x06,0x01,0x0a,0x09,0x0a,0xbe,0x59,0x09,0x12,0x04,0x00,0x08,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x08,0x05,0x01,0x09,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x09,0x40, +0x0c,0x00,0x4d,0x09,0x2f,0x2b,0x2b,0xd4,0xc4,0x2f,0x2b,0xc4,0x32,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x32,0x2f,0x2b,0x5f,0x5e,0x5d,0x39,0x39,0x31,0x30,0x2b,0x5d,0x01,0x01,0x35,0x01,0x35,0x01,0x35,0x01,0x13,0x21,0x35,0x21,0x04,0x6c,0xfc,0xa4,0x02,0x84,0xfd,0x7c,0x03,0x5c,0x28,0xfc,0x54,0x03,0xac,0x02,0xb2,0xfe,0x4e,0x98, +0x01,0x35,0x06,0x01,0x65,0x95,0xfe,0x1f,0xfd,0x14,0x85,0x00,0x00,0x01,0x00,0x44,0x00,0x00,0x04,0x12,0x05,0x9a,0x00,0x1b,0x00,0x9d,0x40,0x4f,0x0f,0x1b,0x01,0x00,0x14,0x01,0x10,0x05,0x01,0x08,0x0b,0x00,0x4d,0x01,0x04,0x00,0x04,0x12,0x0f,0x13,0x0f,0x04,0x01,0x0f,0x17,0x12,0x12,0x0f,0x9a,0x59,0x08,0x05,0x0b,0x0e,0x0e,0x0b, +0x9a,0x59,0x04,0x01,0x0f,0x12,0x0e,0x12,0x0e,0x09,0x14,0x00,0x03,0x09,0x12,0x03,0x03,0x07,0x0e,0x09,0x0a,0x0c,0x42,0x10,0x0c,0x0c,0x0a,0x13,0x00,0x0e,0x09,0x0a,0x13,0x42,0x13,0x13,0x05,0x0e,0x17,0x03,0x09,0x7e,0x0a,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x20,0x0a,0x01,0x0a,0x2f,0x5d,0x2b,0xe1,0x17,0x39,0x33,0x2f,0x2b,0x01, +0x10,0xe0,0x11,0x12,0x39,0x18,0x2f,0xc4,0x2b,0x01,0x10,0xf2,0xc2,0x18,0x2f,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x00,0x33,0x12,0x39,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x01,0x2b,0x5f,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21, +0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x04,0x12,0xfe,0x9c,0x01,0x1d,0xfe,0xb2,0x01,0x4e,0xfe,0xb2,0xa4,0xfe,0xa8,0x01,0x58,0xfe,0xa8,0x01,0x23,0xfe,0xa0,0xc0,0xfa,0x1c,0x13,0x04,0x0d,0x24,0xfc,0x05,0x9a,0xfd,0x70,0x8b,0xcf,0x8b,0xfe,0xdb,0x01,0x25,0x8b,0xcf,0x8b, +0x02,0x90,0xfd,0xfe,0x3a,0x35,0x2a,0x4b,0x01,0xfc,0x00,0x01,0x00,0xa6,0xfe,0x74,0x04,0x18,0x04,0x00,0x00,0x18,0x00,0x5d,0x40,0x13,0x0f,0x08,0x01,0x10,0x05,0x03,0x14,0x00,0x89,0x01,0x01,0x17,0x8a,0x14,0x10,0x0d,0x06,0x4d,0x14,0xb8,0xff,0xfa,0xb7,0x0b,0x06,0x4d,0x14,0x0e,0x0a,0x8a,0x0b,0xb8,0xff,0xf8,0x40,0x16,0x0d,0x06, +0x4d,0x0b,0x0c,0x16,0x0f,0x0b,0x08,0x04,0x11,0x06,0x11,0x99,0x59,0x06,0x16,0x00,0x15,0x2f,0x1a,0x01,0x5d,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x3f,0xc4,0x01,0x2f,0x2b,0xe1,0x32,0x2f,0x2b,0x2b,0xe1,0x39,0x2f,0xe1,0x12,0x39,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x21,0x23,0x26,0x35,0x23,0x06,0x23,0x22,0x27,0x23,0x11, +0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x04,0x18,0xaa,0x17,0x05,0x54,0xc3,0xa7,0x47,0x04,0xa3,0xa3,0x8a,0x6f,0x79,0x97,0xa6,0x48,0x60,0xbf,0x7b,0xfe,0x10,0x05,0x8c,0xfd,0x8e,0x7f,0x96,0xac,0x91,0x02,0x4a,0xfd,0x09,0xbc,0x00,0x02,0x00,0x4e,0xff,0xe8,0x04,0x04,0x05,0xd1,0x00,0x16,0x00,0x21, +0x00,0x6e,0x40,0x0f,0x06,0x1a,0x01,0x0f,0x02,0x01,0x10,0x04,0x05,0x05,0x12,0x17,0x0b,0x8a,0x01,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x01,0x01,0x23,0x1c,0x89,0x12,0xb8,0xff,0xe8,0x40,0x20,0x0c,0x06,0x4d,0x12,0x17,0x01,0x19,0x15,0x19,0x9a,0x59,0x15,0x10,0x0f,0x05,0x01,0x0d,0x03,0x05,0x05,0x03,0x08,0x03,0x9a,0x59,0x08, +0x0f,0x1f,0x9a,0x59,0x0f,0x13,0x00,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x33,0x01,0x18,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x33,0x12,0x39,0x19,0x2f,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x01,0x33,0x12,0x21,0x22,0x07,0x37,0x36,0x33,0x32,0x12,0x11,0x14,0x02,0x00,0x23, +0x22,0x26,0x35,0x10,0x00,0x33,0x32,0x13,0x26,0x23,0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x03,0x5e,0x04,0x1a,0xfe,0xdc,0x7b,0x7b,0x27,0x77,0x81,0xc2,0xc1,0x82,0xfe,0xf2,0xb8,0xa6,0xc8,0x01,0x27,0xe3,0xb2,0x48,0x3a,0xac,0xa0,0xd6,0x71,0x61,0x97,0xd8,0x03,0x68,0x01,0xdc,0x50,0x9c,0x41,0xfe,0xf8,0xfe,0xdd,0xdd,0xfe,0x20, +0xfe,0xff,0xd5,0xb5,0x01,0x10,0x01,0x8e,0xfe,0xa4,0xd1,0xfe,0xc6,0xd2,0x7a,0x8d,0x01,0x3f,0x00,0x01,0x00,0x33,0xfe,0x2b,0x04,0xba,0x05,0x9a,0x00,0x0b,0x00,0x46,0x40,0x25,0x03,0x0a,0x01,0x04,0x09,0x01,0x03,0x08,0x01,0x10,0x03,0x06,0x00,0x00,0x0d,0x08,0x04,0x0a,0x02,0x04,0x06,0x07,0x06,0x07,0x91,0x59,0x06,0x03,0x02,0x00, +0x0b,0x00,0x0b,0x91,0x59,0x00,0x1b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x33,0xc6,0x32,0x12,0x39,0x2f,0xc4,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x01,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x04,0xba,0xfb,0x79,0x02,0xa4,0xfd,0x81,0x04,0x3a,0xfc,0xbc,0x02,0x52, +0xfd,0x8f,0x03,0x8b,0xfe,0x2b,0x4e,0x03,0x73,0x03,0x54,0x5a,0x9a,0xfc,0xf0,0xfc,0xd4,0x00,0x00,0x01,0x00,0xbc,0xfe,0x2b,0x05,0x52,0x05,0x9a,0x00,0x07,0x00,0x3b,0x40,0x0d,0x00,0x7e,0x01,0x18,0x0d,0x06,0x4d,0x01,0x01,0x09,0x04,0x7e,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf8,0x40,0x0d,0x0c,0x06,0x4d,0x05, +0x07,0x02,0x91,0x59,0x07,0x03,0x04,0x00,0x1b,0x00,0x3f,0xc4,0x3f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x05,0x52,0xa8,0xfc,0xba,0xa8,0x04,0x96,0xfe,0x2b,0x06,0xd5,0xf9,0x2b,0x07,0x6f,0x00,0x00,0x01,0x00,0xbe,0xfe,0x1a,0x03,0x94,0x06,0x02,0x00,0x15, +0x00,0x43,0x40,0x0a,0x00,0x0e,0x05,0x8a,0x0f,0x0f,0x0b,0x42,0x0b,0x0f,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xe0,0x40,0x13,0x0b,0x06,0x4d,0x0f,0x0f,0x17,0x16,0x13,0x02,0x9a,0x59,0x13,0x01,0x08,0x0d,0x9a,0x59,0x08,0x1c,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x2b,0x2b,0xc6,0x2b,0x01, +0x10,0xf1,0xe2,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x03,0x94,0x30,0x3f,0xaa,0xbb,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0xbb,0x8a,0x4c,0x2c,0x05,0x5c,0x1b,0xd9,0xfa,0xd6,0x9e,0xbc,0x13,0x93,0x1a,0xd9,0x05,0x27,0xa0,0xbc,0x12,0x00,0x02,0x00,0x52, +0x02,0xba,0x02,0xb0,0x05,0xb0,0x00,0x15,0x00,0x1f,0x00,0x6e,0x40,0x42,0x00,0x13,0x01,0x0f,0x06,0x01,0x10,0x05,0x0b,0x16,0x54,0x59,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x09,0x03,0x0b,0x0b,0x12,0x1c,0x00,0x24,0x02,0x1c,0x05,0x1c,0x54,0x59,0x05,0x25,0x0f,0x30,0x0d,0x11,0x48,0x0f,0x0f,0x0d,0x12,0x0d,0x52,0x59,0x12,0x04,0x0b, +0x02,0x1f,0xc2,0xc0,0x00,0x01,0xd0,0x00,0x01,0x00,0x21,0x0f,0x0f,0x19,0xc2,0x08,0x2f,0xe1,0x39,0x2f,0x10,0xde,0x5d,0x71,0xe1,0x32,0x32,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x01,0x23,0x35,0x23,0x06,0x23, +0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x07,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x02,0xb0,0x81,0x04,0x4f,0x98,0x6d,0x85,0xf8,0xe5,0x97,0x88,0x76,0x6f,0x9b,0x7e,0x8e,0x81,0xb4,0xa8,0x4d,0x40,0x52,0x7d,0x02,0xcd,0x64,0x77,0x77,0x5d,0xca,0x21,0x1f,0xa8,0x56,0x80,0x46,0x90, +0x82,0x6b,0x19,0x17,0x6f,0x33,0x40,0x7a,0x55,0x00,0x00,0x02,0x00,0x4e,0x02,0xb8,0x03,0x23,0x05,0xae,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x1a,0x00,0x12,0x52,0x59,0x00,0x25,0x06,0x0c,0x52,0x59,0x06,0x04,0x15,0xc8,0x90,0x09,0xb0,0x09,0xc0,0x09,0x03,0x09,0x19,0x0f,0xc8,0x03,0x2f,0xe1,0x10,0xde,0x71,0xe1,0x00,0x3f,0x2b,0x00, +0x18,0x3f,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xb4,0xa7,0xbf,0xcd,0xa9,0xa3,0xbc,0xc7,0xa0,0x6a,0x7d,0x77,0x6e,0x69,0x7b,0x79,0x02,0xb8,0xc9,0xac,0xb5,0xcc,0xc7,0xab,0xb2,0xd2,0x02,0x88,0x90,0x7f,0x7c,0x8c,0x8f,0x7b, +0x7e,0x8f,0x00,0x01,0x00,0x64,0x00,0x00,0x05,0xa9,0x05,0xb2,0x00,0x1b,0x00,0xc9,0x40,0x0c,0x59,0x19,0x01,0x59,0x11,0x01,0x10,0x10,0x0c,0x00,0x4d,0x1a,0xb8,0xff,0xf0,0x40,0x27,0x0c,0x00,0x4d,0x0c,0x08,0x0c,0x00,0x4d,0x02,0x08,0x0c,0x00,0x4d,0x1a,0x18,0x02,0x10,0x12,0x0c,0x02,0x0c,0x02,0x04,0x0a,0x1b,0x1b,0x18,0x08,0x0d, +0x06,0x4d,0x18,0x08,0x0c,0x06,0x4d,0x18,0x7d,0x04,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xdc,0x40,0x40,0x0b,0x06,0x4d,0x00,0x04,0x10,0x04,0x02,0x0b,0x03,0x04,0x04,0x1d,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x7d,0x0f,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08, +0x0c,0x06,0x4d,0x12,0x12,0x0b,0x06,0x4d,0x12,0x15,0x07,0x99,0x59,0x15,0x04,0x02,0x0c,0x0e,0x10,0x04,0x00,0x1b,0x00,0x1b,0x99,0x59,0x00,0x12,0x2f,0x1d,0x01,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x3f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0x2b,0xc4,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b, +0x2b,0xc1,0x2f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x00,0x2b,0x2b,0x01,0x2b,0x2b,0x00,0x5d,0x5d,0x21,0x21,0x35,0x24,0x11,0x34,0x00,0x23,0x22,0x00,0x15,0x10,0x01,0x15,0x21,0x35,0x05,0x24,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x05,0x25,0x05,0xa9,0xfd,0xf9,0x01,0x59,0xfe,0xea,0xdb,0xde,0xfe, +0xe6,0x01,0x5a,0xfd,0xf8,0x01,0x5c,0xfe,0xa4,0x01,0x72,0x01,0x2e,0x01,0x35,0x01,0x70,0xfe,0xa5,0x01,0x5b,0x93,0xff,0x01,0x7a,0xf5,0x01,0x1d,0xfe,0xe4,0xf5,0xfe,0x86,0xff,0x00,0x93,0x94,0x01,0xeb,0x01,0x93,0x01,0x39,0x01,0x68,0xfe,0x9b,0xfe,0xc5,0xfe,0x6e,0xed,0x01,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0x56,0x04,0x18, +0x00,0x23,0x00,0x2a,0x00,0x35,0x00,0xcd,0x40,0x21,0x56,0x19,0x01,0x51,0x12,0x01,0x59,0x07,0x01,0x58,0x1f,0x01,0x58,0x0a,0x01,0x0f,0x40,0x0b,0x00,0x4d,0x5f,0x07,0x01,0x07,0x07,0x00,0x83,0x24,0x08,0x0c,0x06,0x4d,0x24,0xb8,0xff,0xc0,0x40,0x59,0x0b,0x0c,0x00,0x4c,0x24,0x24,0x37,0x0b,0x14,0x1d,0x2a,0x04,0x01,0x84,0x2b,0x2b, +0x37,0x11,0x00,0x18,0x01,0x18,0x18,0x30,0x83,0x11,0x10,0x0c,0x06,0x4d,0x0f,0x11,0x01,0x0b,0x03,0x11,0x2c,0x14,0x00,0x24,0x24,0x00,0x95,0x59,0x24,0x24,0x04,0x18,0x40,0x09,0x0c,0x48,0x18,0x18,0x16,0x1b,0x16,0x20,0x1e,0x27,0x20,0x27,0x95,0x59,0x20,0x10,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x0c,0x03,0x06,0x06,0x01,0x0b,0x33, +0x0e,0x09,0x04,0x09,0x04,0x95,0x59,0x09,0x16,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x12,0x39,0x39,0x18,0x2f,0x33,0x2f,0x2b,0x11,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0xe1,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0xe1,0x17, +0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x32,0x2f,0x5d,0x30,0x31,0x00,0x2b,0x01,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x33,0x36,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07, +0x07,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x56,0xfd,0x2b,0x03,0xb0,0x99,0xb1,0x90,0x84,0xe2,0xfe,0xf2,0x71,0x04,0x91,0xf2,0x99,0xaf,0x01,0x7f,0x01,0x06,0xd7,0xaf,0x9b,0x94,0xc8,0xe8,0x44,0x04,0x74,0xf0,0xca,0xde,0xa8,0x02,0x85,0x77,0x74,0xa6,0x13,0xa4,0xcb,0x8b,0x89,0x6a,0x5a,0x77,0xa4,0x01,0xd7,0xab, +0xba,0x72,0x9a,0x62,0xe5,0xe5,0xa1,0x87,0x01,0x2c,0x18,0x10,0x01,0x2a,0x7a,0xa4,0x60,0xc8,0xc8,0xfe,0xfb,0xe8,0x37,0x90,0x9c,0xa4,0x88,0xc8,0x3f,0x0c,0x08,0x52,0x5f,0x49,0x59,0xa9,0x00,0x03,0x00,0x31,0xff,0xae,0x04,0x96,0x04,0x66,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0xd4,0xb6,0x58,0x1c,0x01,0x57,0x1b,0x01,0x1d,0xb8,0xff, +0xf0,0x40,0x2b,0x0b,0x0c,0x00,0x4c,0x1d,0x14,0x22,0x19,0x0b,0x08,0x12,0x01,0x04,0x03,0x0d,0x13,0x00,0x00,0x03,0x06,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x06,0x0b,0x06,0x4d,0x03,0x83,0x00,0x22,0x10,0x22,0x02,0x0b,0x03,0x22,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x22,0xb8,0xff, +0xde,0x40,0x47,0x0b,0x06,0x4d,0x22,0x22,0x25,0x19,0x07,0x0d,0x06,0x4d,0x19,0x0a,0x0c,0x06,0x4d,0x19,0x83,0x09,0x0a,0x0d,0x11,0x0d,0x06,0x4d,0x0d,0x0c,0x0c,0x06,0x4d,0x0d,0x19,0x0b,0x06,0x4d,0x0d,0x14,0x1b,0x1c,0x1d,0x04,0x1f,0x16,0x01,0x08,0x0b,0x12,0x04,0x10,0x0a,0x09,0x06,0x00,0x13,0x10,0x40,0x10,0x16,0x95,0x59,0x10, +0x10,0x06,0x1f,0x95,0x59,0x06,0x16,0x2f,0x25,0x01,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x32,0x10,0xce,0x32,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x01,0x2f,0x2b,0x2b,0x2b,0xce,0x32,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0xf1,0x2b,0x2b,0x2b,0xca,0x2f,0x32,0x11,0x12,0x17,0x39, +0x11,0x12,0x39,0x39,0x31,0x30,0x00,0x2b,0x5d,0x5d,0x01,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x10,0x00,0x33,0x32,0x17,0x37,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x96,0xa8,0x62,0xfe,0xea,0xe8,0xc0,0x7e,0x91,0x52,0x95,0x66,0x01,0x1c,0xf0,0xb8,0x7c, +0xa2,0xfe,0xf3,0x4f,0x88,0x9f,0xb7,0x32,0x02,0x41,0xfe,0x04,0x57,0x86,0xa3,0xab,0x04,0x18,0xb4,0x8a,0xd0,0xfc,0xfe,0xda,0x66,0xa0,0x4e,0xa4,0x89,0xcb,0x01,0x02,0x01,0x22,0x62,0xb0,0xfe,0xde,0x4a,0xd7,0xbd,0x84,0x5c,0x01,0xcc,0xfd,0xd8,0x4c,0xd0,0xbe,0x86,0x00,0x00,0x02,0x00,0x8f,0xfe,0x52,0x03,0x3d,0x04,0x16,0x00,0x23, +0x00,0x33,0x00,0x45,0x40,0x25,0x0f,0x12,0x01,0x10,0x05,0x11,0x0f,0x14,0x0f,0x95,0x59,0x14,0x00,0x2c,0x24,0x2c,0xb0,0x5b,0x24,0x10,0x20,0xef,0x03,0x30,0xaf,0x70,0x28,0x01,0x28,0x28,0x11,0x19,0x84,0x0a,0x0a,0x34,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0xe1,0xd4,0xe1,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2f,0x2b, +0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x16,0x16,0x15,0x14,0x0e,0x04,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x27,0x13,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x02,0x71,0x09,0x0e,0x33,0x4c,0x5a,0x4c,0x33,0x25,0x40, +0x54,0x2f,0xa9,0x7c,0x99,0xa4,0x4c,0x86,0x64,0x3b,0x34,0x4f,0x5c,0x4f,0x34,0x16,0x0b,0x47,0x2c,0x22,0x21,0x21,0x21,0x2d,0x2d,0x21,0x21,0x21,0x22,0x02,0x76,0x1a,0x53,0x29,0x40,0x67,0x5a,0x53,0x55,0x5d,0x38,0x30,0x4a,0x32,0x19,0x85,0xb0,0x60,0x28,0x4f,0x76,0x4e,0x4a,0x74,0x61,0x54,0x53,0x5a,0x36,0x2e,0x4b,0x1a,0x01,0xa0, +0x20,0x1f,0x2f,0x2e,0x20,0x21,0x21,0x20,0x2e,0x2f,0x1f,0x20,0x00,0x02,0x00,0xb4,0xfe,0x6a,0x01,0x92,0x04,0x16,0x00,0x0b,0x00,0x0f,0x00,0x3d,0x40,0x12,0x0d,0x0c,0x0e,0x0f,0xff,0x3a,0x0c,0x7d,0x0d,0x0d,0x09,0xaf,0x0f,0x03,0x01,0x10,0x03,0x03,0xb8,0xff,0xe8,0x40,0x0e,0x0d,0x06,0x4d,0x03,0x0e,0x00,0x40,0x06,0x00,0xb0,0x5b, +0x06,0x10,0x0c,0x00,0x2f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x01,0x2f,0x2b,0x5f,0x5e,0x5d,0xe1,0x39,0x2f,0xe1,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x13,0x33,0x01,0x23,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x2b,0xac,0x13,0x86,0x03,0x3a,0x40,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x40, +0xfb,0x30,0x04,0x06,0x00,0x01,0x00,0xe8,0x00,0xfe,0x04,0x94,0x03,0x31,0x00,0x05,0x00,0x2c,0xb2,0x01,0xbd,0x00,0xb8,0xff,0xc8,0xb4,0x0c,0x06,0x4d,0x00,0x03,0xb8,0xff,0xe0,0x40,0x0b,0x0c,0x06,0x4d,0x03,0x00,0x03,0x04,0x03,0xbe,0x59,0x04,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x01,0x2f,0x2b,0x2f,0x2b,0xe1,0x31,0x30,0x25,0x23, +0x11,0x21,0x35,0x21,0x04,0x94,0x84,0xfc,0xd8,0x03,0xac,0xfe,0x01,0xae,0x85,0x00,0x00,0x01,0x00,0x7b,0x00,0x00,0x04,0x5a,0x05,0xec,0x00,0x08,0x00,0x41,0x40,0x22,0x0a,0x03,0x01,0x0b,0x02,0x01,0x03,0x0f,0x01,0x01,0x10,0x05,0x01,0x02,0x00,0x03,0x03,0x04,0x08,0x00,0x04,0x07,0x01,0x05,0x04,0xd9,0x59,0x05,0x05,0x01,0x00,0x00, +0x01,0x12,0x00,0x3f,0x3f,0x11,0x39,0x2f,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x5d,0x01,0x01,0x23,0x01,0x23,0x35,0x21,0x01,0x01,0x04,0x5a,0xfe,0x7b,0x71,0xfe,0xc1,0xaa,0x01,0x08,0x01,0x13,0x01,0x4e,0x05,0xec,0xfa,0x14,0x02,0xee,0x78,0xfd,0x6b,0x05, +0x1b,0x00,0x00,0x01,0x00,0x5e,0xfe,0xea,0x03,0xb8,0x05,0x9a,0x00,0x1c,0x00,0x89,0x40,0x12,0x79,0x13,0x01,0x79,0x11,0x01,0x77,0x09,0x01,0x77,0x03,0x01,0x0a,0x30,0x0c,0x00,0x4d,0x04,0xb8,0xff,0xf0,0x40,0x3c,0x0c,0x00,0x4d,0x0f,0x06,0x01,0x09,0x06,0x06,0x04,0x08,0x05,0x04,0x03,0x09,0x13,0x16,0x17,0x09,0x04,0x12,0x00,0x14, +0x20,0x14,0x30,0x14,0x03,0x0a,0x03,0x14,0x14,0x12,0x12,0x0d,0x1c,0x0d,0x08,0x05,0x13,0x16,0x16,0x13,0x95,0x59,0x16,0x16,0x1d,0x1a,0x1a,0x02,0x95,0x59,0x1a,0x03,0x0b,0x10,0x95,0x59,0x0b,0x00,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x2f,0x12,0x39,0x11,0x33, +0x2f,0x5f,0x5e,0x5d,0x11,0x17,0x33,0x11,0x17,0x33,0x11,0x33,0x2f,0x5e,0x5d,0x31,0x30,0x2b,0x00,0x2b,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x26,0x23,0x22,0x07,0x07,0x33,0x15,0x23,0x03,0x02,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x13,0x23,0x35,0x33,0x37,0x36,0x36,0x33,0x32,0x17,0x03,0xb8,0x30,0x3c,0x92,0x18,0x1f,0xa6,0xbb,0x5a, +0x3a,0xfe,0xde,0x1f,0x3b,0x24,0x32,0x96,0x28,0x5b,0x67,0x7c,0x1c,0x11,0xaf,0x86,0x40,0x34,0x04,0xf2,0x1c,0xa0,0xd0,0x8a,0xfd,0x78,0xfe,0x5e,0x10,0x8f,0x15,0x01,0x24,0x02,0x7c,0x8a,0xdb,0x83,0x9e,0x13,0x00,0x02,0x00,0xd1,0x00,0xf0,0x04,0xaa,0x03,0xc0,0x00,0x14,0x00,0x29,0x00,0x97,0xb9,0x00,0x16,0xff,0xe0,0xb3,0x09,0x0c, +0x48,0x01,0xb8,0xff,0xe0,0x40,0x3a,0x09,0x0c,0x48,0x20,0x20,0x09,0x0c,0x48,0x0b,0x20,0x09,0x0c,0x48,0x1e,0x18,0x18,0x26,0xbe,0x59,0x18,0x1c,0x40,0x22,0x1c,0xbe,0x59,0x15,0x00,0x22,0x01,0x0c,0x03,0x22,0x0d,0x09,0x03,0x03,0x11,0xbe,0x59,0x03,0x07,0x40,0x0d,0x07,0xbe,0x59,0x14,0x00,0x0d,0xa0,0x0d,0xb0,0x0d,0x03,0x0c,0x03, +0x0d,0xb8,0xff,0xc0,0x40,0x14,0x0e,0x11,0x48,0x0d,0x29,0x15,0x14,0xbd,0x00,0x1f,0x1e,0x09,0xbd,0x0a,0x2a,0x2b,0x0a,0x00,0xff,0x3a,0x2b,0x01,0x10,0xe1,0x39,0x39,0x10,0xe1,0x39,0x39,0x00,0x18,0x2f,0x2b,0x5f,0x5e,0x5d,0xc4,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x10,0xd4,0x5f,0x5e,0x5d,0xc4,0x2b,0x00,0x1a, +0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x01,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x13,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x04,0xaa,0x07,0x93,0x7e,0x6d,0x9c, +0x61,0x3e,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x87,0x07,0x93,0x7e,0x6d,0x9c,0x5e,0x41,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x03,0xc0,0x92,0xa2,0x6c,0x44,0xb0,0x90,0xa4,0x58,0x5a,0x62,0x50,0xfe,0x65,0x93,0xa2,0x6c,0x42,0xae,0x8f,0xa6,0x58,0x5b,0x64,0x4f,0x00,0x02, +0x00,0x33,0x00,0x00,0x04,0xf8,0x05,0x9a,0x00,0x05,0x00,0x0d,0x00,0x3f,0x40,0x22,0x00,0x0d,0x01,0x00,0x0c,0x01,0x0f,0x07,0x01,0x0f,0x06,0x01,0x10,0x04,0x0d,0x06,0x02,0x05,0x05,0x0f,0x02,0x09,0x03,0x03,0x05,0x02,0x01,0x0d,0x01,0x0d,0x99,0x59,0x01,0x12,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x01,0x2f,0x12, +0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x01,0x33,0x01,0x27,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x04,0xf8,0xfb,0x3b,0x02,0x09,0xae,0x02,0x0e,0xd7,0xfe,0x97,0x21,0x05,0x04,0x06,0x22,0xfe,0xa0,0x4c,0x05,0x4e,0xfa,0xb2,0x4c,0x03,0xc8,0x58,0x36,0x30,0x5e,0xfc,0x38,0x00,0x02,0x00,0x5c, +0x00,0xc8,0x03,0xb4,0x03,0x70,0x00,0x05,0x00,0x0b,0x00,0x2b,0x40,0x15,0x06,0x0a,0x00,0x04,0x00,0x00,0x04,0xf0,0x05,0x02,0x08,0x80,0x0a,0x0a,0x06,0xf0,0x0b,0x0f,0x08,0x01,0x08,0x2f,0x5d,0x33,0xf1,0xc0,0x2f,0x1a,0x10,0xdc,0x32,0xf1,0xc2,0x2f,0x00,0x2f,0xc6,0x39,0x39,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x03,0x23,0x01, +0x01,0x33,0x01,0x03,0xb2,0xa8,0xfe,0xd5,0x01,0x2b,0xaa,0xfe,0xcd,0x54,0xa6,0xfe,0xd5,0x01,0x2b,0xa6,0xfe,0xd1,0xc8,0x01,0x50,0x01,0x58,0xfe,0xa8,0xfe,0xb0,0x01,0x50,0x01,0x58,0xfe,0xa8,0x00,0x00,0x02,0x00,0x5a,0x00,0xc8,0x03,0xb4,0x03,0x70,0x00,0x05,0x00,0x0b,0x00,0x2b,0x40,0x17,0x07,0x0b,0x02,0x04,0x03,0x00,0xf0,0x04, +0x02,0x80,0x09,0x06,0xf0,0x0a,0x50,0x08,0x70,0x08,0x02,0x2f,0x08,0x01,0x08,0x2f,0x5d,0x5d,0xc4,0xe1,0x32,0x1a,0xdc,0xc4,0xe1,0x32,0x00,0x2f,0xc4,0x39,0x39,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33,0x03,0x01,0x23,0x01,0x01,0x33,0x03,0xb4,0xfe,0xd3,0xa5,0x01,0x2e,0xfe,0xd2,0xa5,0x58,0xfe,0xd5,0xaa,0x01,0x34,0xfe,0xcc,0xaa, +0x02,0x1a,0xfe,0xae,0x01,0x52,0x01,0x56,0xfe,0xaa,0xfe,0xae,0x01,0x52,0x01,0x56,0x00,0x03,0x00,0x8c,0xff,0xee,0x05,0x52,0x00,0xcd,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x56,0xb2,0x03,0xaf,0x09,0xb8,0xff,0xfd,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfb,0x40,0x27,0x0b,0x06,0x4d,0x09,0x0e,0x15,0x0f,0x1b,0x42,0x21,0xaf,0x1b,0x1b, +0x24,0x15,0xaf,0x0f,0x0f,0x25,0x24,0x0c,0x12,0x18,0x1e,0x04,0x00,0x06,0x00,0x06,0xb0,0x5b,0x00,0x13,0x40,0x25,0x01,0x2f,0x25,0x01,0x5d,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x11,0x12,0x01,0x39,0x18,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x31,0x30,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32, +0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x04,0xe4,0x2e,0x3f,0x3f,0x2e,0x2d,0x41,0x41,0xfd,0xdd,0x2e,0x41,0x41,0x2e,0x2d,0x41,0x41,0xfd,0xdd,0x2e,0x3e,0x3e,0x2e,0x2d,0x41,0x40,0x12,0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40, +0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x66,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x1f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x23,0x11,0x10,0x06,0x07,0x3e,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x0b,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x2d,0x01,0x59,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x1a,0x10,0x06,0x07,0x25,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x0a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07, +0x00,0xd8,0x01,0xab,0x01,0x58,0x00,0x13,0x40,0x0b,0x02,0x0a,0x22,0x18,0x03,0x09,0x25,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x07,0x12,0x05,0xb2,0x00,0x18,0x00,0x23,0x00,0xb7,0x40,0x1d,0x06,0x18,0x0b,0x00,0x4d,0x14,0x11,0x00,0x00,0x25,0x13,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08, +0x0c,0x06,0x4d,0x17,0x08,0x0b,0x06,0x4d,0x17,0x7e,0x19,0xb8,0xff,0xd0,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0xff,0xd8,0x40,0x4f,0x0b,0x06,0x4d,0x00,0x19,0x01,0x0b,0x03,0x19,0x19,0x25,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x7d,0x08,0x10,0x0d,0x06, +0x4d,0x08,0x10,0x0c,0x06,0x4d,0x08,0x18,0x0b,0x06,0x4d,0x08,0x14,0x15,0x91,0x59,0x14,0x10,0x00,0x14,0x91,0x2b,0x30,0x0b,0x1c,0x91,0x59,0x0b,0x04,0x10,0x11,0x91,0x59,0x10,0x03,0x05,0x22,0x91,0x59,0x05,0x13,0x00,0x18,0x91,0x59,0x00,0x12,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00, +0x18,0x2f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xc4,0xc4,0x31,0x30,0x2b,0x21,0x21,0x22,0x07,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x25,0x11,0x26,0x23, +0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x07,0x12,0xfd,0x30,0x10,0x7a,0x62,0x54,0xfe,0xc8,0xfe,0x94,0x01,0x7b,0x01,0x45,0x5a,0x58,0x70,0x02,0x02,0xb0,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0xfd,0x08,0xa0,0x6c,0xe5,0xfe,0xe5,0x01,0x17,0xe3,0x74,0x0e,0x0a,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0x0a,0x0e,0x98,0xfe,0x23,0x97, +0xfe,0x0a,0x08,0x04,0x5e,0x1c,0xfe,0xb4,0xfe,0xfd,0xfe,0xfe,0xfe,0xb6,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x21,0x04,0x18,0x00,0x1c,0x00,0x23,0x00,0x2f,0x00,0xfb,0xb3,0x58,0x07,0x01,0x0b,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x02,0xb8,0xff,0xe8,0x40,0x0d,0x0c,0x00,0x4d,0x06,0x40,0x0f,0x12,0x48,0x06,0x06,0x1c,0x83,0x1d,0xb8, +0xff,0xc0,0xb3,0x0c,0x00,0x4d,0x1d,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x1d,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1d,0xb8,0xff,0xee,0x40,0x1b,0x0b,0x06,0x4d,0x1d,0x40,0x0c,0x00,0x4d,0x00,0x1d,0x01,0x0b,0x1d,0x1d,0x31,0x0b,0x17,0x23,0x03,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x2d,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x2d,0xb8, +0xff,0xc0,0x40,0x51,0x0c,0x00,0x4d,0x2d,0x2d,0x31,0x27,0x0a,0x0d,0x06,0x4d,0x27,0x0a,0x0c,0x06,0x4d,0x27,0x0a,0x0b,0x06,0x4d,0x27,0x83,0x11,0x10,0x0d,0x06,0x4d,0x11,0x0d,0x0c,0x06,0x4d,0x11,0x1f,0x0b,0x06,0x4d,0x11,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x0c,0x03,0x06,0x06,0x01,0x04,0x1d,0x00,0x95,0x59,0x1d,0x1d,0x04,0x17, +0x24,0x14,0x20,0x19,0x19,0x20,0x95,0x59,0x19,0x10,0x0b,0x2a,0x0e,0x09,0x04,0x09,0x04,0x95,0x59,0x09,0x16,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x32,0x12,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39, +0x2f,0x2b,0x2b,0xe1,0x2b,0x17,0x39,0x12,0x39,0x2f,0x5e,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0xf1,0xc0,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x23,0x06,0x21,0x22,0x00,0x35,0x10,0x00,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01, +0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x07,0x21,0xfd,0x2b,0x03,0xb1,0x9a,0xaf,0x90,0x88,0xdd,0xfe,0xf2,0x70,0x04,0x83,0xfe,0xe3,0xe5,0xfe,0xf3,0x01,0x1c,0xf0,0x01,0x26,0x6c,0x04,0x77,0x01,0x0a,0xc4,0xda,0xa8,0x02,0x86,0x74,0x78,0xa7,0x10,0xfe,0x10,0x9e,0xb8,0xb8,0x9c,0x9f,0xad,0xad,0x01,0xd7,0xab,0xba, +0x72,0x9a,0x62,0xed,0xed,0x01,0x1e,0xec,0x01,0x02,0x01,0x24,0xeb,0xeb,0xfe,0xf9,0xe2,0x33,0x8e,0x9e,0xab,0x81,0x01,0x2c,0xd9,0xbf,0xb4,0xd0,0xcd,0xbd,0xc2,0xd0,0x00,0x01,0x00,0x00,0x01,0xfa,0x04,0x00,0x02,0x7b,0x00,0x03,0x00,0x0f,0xb6,0x02,0x01,0xeb,0x59,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35, +0x21,0x04,0x00,0xfc,0x00,0x04,0x00,0x01,0xfa,0x81,0x00,0x01,0x00,0x00,0x01,0xfa,0x08,0x00,0x02,0x7b,0x00,0x03,0x00,0x0f,0xb6,0x02,0x01,0xeb,0x59,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x08,0x00,0xf8,0x00,0x08,0x00,0x01,0xfa,0x81,0x00,0x02,0x00,0x6a,0x03,0xf4,0x02,0x9c,0x05,0xb2,0x00,0x03, +0x00,0x07,0x00,0x23,0x40,0x13,0x03,0x02,0x06,0xb3,0x40,0x07,0x04,0x00,0xb4,0x02,0x04,0xb4,0x80,0x10,0x06,0x20,0x06,0x02,0x06,0x2f,0x5d,0x1a,0xe9,0xdc,0xe9,0x00,0x3f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x9c,0x6f,0x93,0x8d,0xbb,0x6c,0x96,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42, +0x01,0xbe,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x13,0x03,0x02,0x06,0xb3,0x40,0x07,0x04,0x00,0xb4,0x02,0x04,0xb4,0x80,0x10,0x06,0x20,0x06,0x02,0x06,0x2f,0x5d,0x1a,0xe9,0xdc,0xe9,0x00,0x3f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c, +0x76,0x6c,0x9a,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x01,0x00,0x6a,0x03,0xf4,0x01,0x6c,0x05,0xb2,0x00,0x03,0x00,0x18,0x40,0x0c,0x02,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0xaf,0x02,0x01,0x02,0x2f,0x5d,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x6c,0x6c,0x96,0x8c,0x05, +0xb2,0xfe,0x42,0x01,0xbe,0x00,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x14,0x40,0x09,0x02,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0x02,0x2f,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x70,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0x00,0x00,0x03,0x00,0xe8,0x00,0x70,0x04,0x94, +0x04,0x3a,0x00,0x0a,0x00,0x0e,0x00,0x19,0x00,0x4b,0x40,0x25,0x15,0x0f,0xd6,0x5b,0x15,0x15,0x0c,0x0d,0x0c,0xbe,0x59,0x0d,0x00,0x42,0x00,0x06,0xd6,0x5b,0x00,0x0f,0x0d,0x01,0x0d,0x03,0x0d,0x0b,0x0e,0x17,0x12,0x0c,0x42,0x0c,0x08,0x03,0x17,0xd3,0x12,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x12,0x2f,0x2b,0xe1,0x39,0x39,0xc6,0x2b, +0x01,0x10,0xe2,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0xc6,0x2b,0x2b,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x06,0x01,0x21,0x35,0x21,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x06,0x02,0xc4,0x2c,0x3c,0x3a,0x2e,0x67,0x3d,0x01,0xa6,0xfc,0x54,0x03,0xac,0xfe,0x2c,0x2c, +0x3e,0x3c,0x2e,0x65,0x3a,0x03,0x64,0x3d,0x2c,0x2d,0x40,0x6b,0x2f,0x3c,0xfe,0xae,0x86,0xfd,0xd8,0x3c,0x2b,0x2d,0x42,0x6d,0x2d,0x3c,0x00,0x02,0x00,0x6c,0x00,0x00,0x04,0x40,0x05,0x9a,0x00,0x05,0x00,0x09,0x00,0x28,0x40,0x11,0x03,0x08,0x06,0x00,0x00,0x01,0x05,0x03,0x01,0x12,0x08,0x06,0x03,0x00,0x00,0x0b,0x03,0x2f,0x12,0x39, +0x2f,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x3d,0x2f,0x18,0xc4,0xc4,0x3d,0xc4,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33,0x09,0x03,0x04,0x40,0xfe,0x3b,0x4c,0xfe,0x3d,0x01,0xc3,0x4c,0x01,0x3f,0xfe,0x9c,0xfe,0x9c,0x01,0x64,0x02,0xcd,0xfd,0x33,0x02,0xcb,0x02,0xcf,0xfd,0x33,0x02,0x3f,0xfd,0xc1,0xfd,0xbf,0xff,0xff,0x00,0x0e, +0xfe,0x1e,0x03,0xd5,0x05,0x87,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x00,0x8f,0x4f,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x24,0x1e,0x0c,0x00,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x8f, +0x00,0x95,0x01,0x5b,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0a,0x1d,0x17,0x05,0x00,0x25,0x02,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x01,0xfe,0xc8,0x00,0x00,0x02,0xb2,0x05,0x9a,0x00,0x03,0x00,0x0e,0xb5,0x00,0x03,0x02,0x12,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x01,0x23,0x01, +0x02,0xb2,0xfc,0xa6,0x90,0x03,0x5b,0x05,0x9a,0xfa,0x66,0x05,0x9a,0x00,0x00,0x01,0x00,0x66,0xff,0xe8,0x03,0xf6,0x05,0xb2,0x00,0x25,0x00,0xcb,0x40,0x0c,0x02,0x13,0x01,0x0b,0x00,0x01,0x02,0x22,0x01,0x10,0x04,0x0f,0xb8,0xff,0xe8,0x40,0x65,0x0b,0x00,0x4d,0x03,0x10,0x0b,0x0c,0x00,0x4c,0x13,0x14,0x00,0x25,0x21,0x1e,0x04,0x07, +0x07,0x04,0x9a,0x59,0x07,0x0e,0x40,0x1c,0x19,0x0b,0x0e,0x0e,0x0b,0x9a,0x59,0x0f,0x0e,0x5f,0x0e,0x7f,0x0e,0x8f,0x0e,0x04,0x0b,0x03,0x0e,0x0e,0x11,0x23,0x00,0x14,0x10,0x14,0x02,0x0c,0x04,0x14,0x14,0x16,0x11,0x16,0x9a,0x59,0x11,0x07,0x00,0x25,0x10,0x25,0x02,0x0c,0x04,0x25,0x25,0x23,0x02,0x23,0x9a,0x59,0x02,0x19,0x1f,0x1a, +0x14,0x00,0x00,0x27,0x19,0x1c,0x1e,0x21,0x04,0x1d,0x8a,0x09,0x0c,0x06,0x04,0x07,0x0b,0x0e,0x04,0x09,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x17,0x33,0xde,0xc4,0x10,0xe1,0x17,0x32,0x12,0x39,0x2f,0xd4,0xd6,0xc4,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e, +0x5d,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x11,0x33,0x11,0x33,0x30,0x31,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x03,0x23,0x35,0x33,0x26,0x35,0x34,0x37,0x23,0x35,0x33,0x36,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06, +0x07,0x21,0x15,0x21,0x06,0x17,0x21,0x15,0x21,0x12,0x21,0x32,0x37,0x03,0xf6,0x85,0x95,0xfe,0x55,0x52,0x79,0x6c,0x04,0x06,0x6e,0x83,0x33,0x01,0x1b,0xca,0x89,0x6c,0x72,0x8e,0x7d,0xc3,0x27,0x01,0xf1,0xfd,0xf9,0x08,0x07,0x02,0x08,0xfe,0x08,0x48,0x01,0x16,0x83,0x8d,0x32,0x4a,0x01,0xfa,0x8c,0x1f,0x2e,0x30,0x3c,0x8c,0xf0,0x01, +0x0f,0x38,0xa2,0x4e,0xc9,0xaa,0x8c,0x63,0x56,0x8c,0xfe,0x92,0x57,0x00,0x00,0x01,0x00,0x5c,0x00,0xc8,0x02,0x2f,0x03,0x70,0x00,0x05,0x00,0x1c,0x40,0x0e,0x00,0x04,0x00,0x00,0x04,0xf0,0x05,0x20,0x02,0x01,0x0f,0x02,0x01,0x02,0x2f,0x5d,0x5d,0x33,0xf1,0xc2,0x2f,0x00,0x2f,0xc6,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x02,0x2d, +0xa6,0xfe,0xd5,0x01,0x2b,0xa8,0xfe,0xcf,0xc8,0x01,0x50,0x01,0x58,0xfe,0xa8,0x00,0x00,0x01,0x00,0x5c,0x00,0xc8,0x02,0x2f,0x03,0x70,0x00,0x05,0x00,0x1c,0x40,0x0f,0x02,0x04,0x03,0x00,0xf0,0x04,0x50,0x02,0x70,0x02,0x02,0x0f,0x02,0x01,0x02,0x2f,0x5d,0x5d,0xc4,0xe1,0x32,0x00,0x2f,0xc6,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33, +0x02,0x2f,0xfe,0xd3,0xa6,0x01,0x30,0xfe,0xd0,0xa6,0x02,0x1a,0xfe,0xae,0x01,0x52,0x01,0x56,0x00,0x03,0x00,0x35,0x00,0x00,0x03,0xea,0x06,0x02,0x00,0x14,0x00,0x20,0x00,0x24,0x00,0xaf,0xb9,0x00,0x11,0xff,0xe8,0x40,0x3d,0x0b,0x00,0x4d,0x15,0x1b,0x63,0x59,0x15,0x23,0x12,0x02,0x95,0x59,0x12,0x01,0x05,0x08,0x23,0x03,0x0b,0x0e, +0x0e,0x0b,0x95,0x59,0x0e,0x0f,0x09,0x21,0x15,0x1e,0x62,0x18,0x21,0x08,0x0d,0x06,0x4d,0x21,0x08,0x0c,0x06,0x4d,0x21,0x08,0x0b,0x06,0x4d,0x21,0x84,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0xb8,0xff,0xf1,0x40,0x1e,0x0b,0x06,0x4d,0x22,0x22,0x26,0x0a,0x06,0x00,0x0c,0x0e,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08, +0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xf4,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0xc6,0xd4,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xd4,0xe1,0x00,0x3f,0xc4, +0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x00,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0x02,0xa0,0x30,0x3d,0xac,0xf0,0xf0,0xa3, +0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0xdd,0x2d,0x3e,0x3e,0x2d,0x2d,0x40,0x40,0x23,0xa4,0xa4,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0xec,0x3c,0x2e,0x2d,0x3e,0x3d,0x2e,0x2c,0x3e,0xfa,0xfc,0x04,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x03,0xcf,0x06,0x02,0x00,0x14,0x00,0x18,0x00,0xa4,0xb9,0x00, +0x11,0xff,0xe8,0x40,0x37,0x0b,0x00,0x4d,0x08,0x05,0x0b,0x0e,0x0e,0x0b,0x95,0x59,0x0e,0x0f,0x12,0x02,0x95,0x59,0x12,0x01,0x18,0x00,0x09,0x15,0x15,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x84,0x70,0x16,0x01,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0xb8,0xff,0xf1,0x40, +0x1e,0x0b,0x06,0x4d,0x16,0x16,0x1a,0x0a,0x06,0x00,0x0c,0x0e,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xf4,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39, +0x39,0xc6,0xd4,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x23,0x11,0x33,0x02,0xa0,0x30,0x3d,0xac, +0xf0,0xf0,0xa3,0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0x01,0x2f,0xa2,0xa2,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0xfa,0x10,0x05,0xec,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x15,0x00,0x5a,0x40,0x2e,0x15,0x10,0x14,0x13,0x12,0x02,0x0e,0x06,0x0b,0x40,0x09,0x08,0x07,0x03,0x00,0x0d, +0x10,0x0d,0x02,0x0a,0x03,0x0d,0x15,0x06,0x05,0x06,0x91,0x59,0x00,0x05,0x11,0x0a,0x0b,0x0a,0x91,0x59,0x10,0x0b,0x05,0x0b,0x05,0x0b,0x03,0x0d,0x03,0x03,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x2b,0x11,0x00,0x33,0x11,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x33,0x33,0x33,0x1a,0xce,0x32,0xdd, +0x32,0x32,0x32,0x32,0xce,0x32,0x31,0x30,0x01,0x25,0x13,0x23,0x13,0x05,0x35,0x05,0x37,0x27,0x05,0x35,0x05,0x03,0x33,0x03,0x25,0x15,0x25,0x07,0x17,0x25,0x02,0xd8,0xfe,0xd2,0x28,0x9c,0x28,0xfe,0xd2,0x01,0x06,0x3a,0x3a,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x01,0x2e,0xfe,0xfa,0x3a,0x3a,0x01,0x06,0x02,0x07,0x14,0xfe,0xca,0x01, +0x36,0x14,0x96,0x1e,0xc0,0xc0,0x1e,0x96,0x14,0x01,0x36,0xfe,0xca,0x14,0x96,0x1e,0xc0,0xc0,0x1e,0x00,0x00,0x01,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x00,0x0b,0x00,0x15,0x40,0x0b,0x06,0x00,0xb0,0x5b,0x06,0x09,0xaf,0x03,0x2f,0x0d,0x01,0x5d,0x2f,0xe1,0x00,0x2f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16, +0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x01,0xfe,0x42,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x42,0x00,0x00,0x01,0x00,0x58,0xff,0x1c,0x01,0x5a,0x00,0xd9,0x00,0x03,0x00,0x2c,0x40,0x1c,0x00,0x10,0x10,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x03,0x10,0x10,0x00,0x4d,0x03,0x10,0x0c,0x00,0x4d,0x02,0xb3,0x40,0x03,0x00,0xb4, +0x80,0x02,0x2f,0x1a,0xe9,0x00,0x2f,0x1a,0xed,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x25,0x03,0x23,0x13,0x01,0x5a,0x8d,0x75,0x6e,0xd9,0xfe,0x43,0x01,0xbd,0x00,0x02,0x00,0x58,0xff,0x1c,0x02,0x89,0x00,0xd9,0x00,0x03,0x00,0x07,0x00,0x4d,0x40,0x35,0x04,0x10,0x10,0x00,0x4d,0x04,0x10,0x0c,0x00,0x4d,0x07,0x10,0x10,0x00,0x4d,0x07, +0x10,0x0c,0x00,0x4d,0x00,0x10,0x10,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x03,0x10,0x10,0x00,0x4d,0x03,0x10,0x0c,0x00,0x4d,0x03,0x02,0x06,0xb3,0x40,0x07,0x00,0xb4,0x02,0x04,0xb4,0x80,0x06,0x2f,0x1a,0xe9,0xdc,0xe9,0x00,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x25,0x03,0x23,0x13,0x23, +0x03,0x23,0x13,0x02,0x89,0x8b,0x77,0x6d,0x9a,0x8d,0x75,0x6e,0xd9,0xfe,0x43,0x01,0xbd,0xfe,0x43,0x01,0xbd,0x00,0x00,0x07,0x00,0x50,0xff,0xea,0x09,0x5e,0x05,0xb0,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27,0x00,0x33,0x00,0x3f,0x00,0x4b,0x01,0x01,0x40,0x3c,0x18,0x03,0x1a,0x3a,0x40,0x52,0x59,0x3a,0x0e,0x34,0x34,0x46,0x52,0x59, +0x34,0x1c,0x22,0x28,0x52,0x59,0x22,0x0e,0x1c,0x1c,0x2e,0x52,0x59,0x1c,0x13,0x1b,0x03,0x06,0x00,0x42,0x00,0x12,0x52,0x59,0x00,0x06,0x06,0x0c,0x52,0x59,0x06,0x04,0x1a,0x18,0x1a,0x18,0x3d,0x03,0x37,0xbd,0x43,0x10,0x0d,0x06,0x4d,0x43,0xb8,0xff,0xf4,0x40,0x0a,0x0b,0x06,0x4d,0x43,0x49,0xc8,0x1f,0x3d,0x01,0x3d,0xb8,0xff,0xf4, +0xb3,0x0d,0x06,0x4d,0x3d,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x3d,0xb8,0xff,0xee,0x40,0x0e,0x0b,0x06,0x4d,0x3d,0x3d,0x03,0x1f,0xbd,0x2b,0x10,0x0d,0x06,0x4d,0x2b,0xb8,0xff,0xf4,0xb6,0x0b,0x06,0x4d,0x2b,0x31,0xc2,0x25,0xb8,0xff,0xe0,0x40,0x14,0x0d,0x06,0x4d,0x25,0x1c,0x0c,0x06,0x4d,0x25,0x07,0x0b,0x06,0x4d,0x25,0x25,0x4d, +0x03,0x09,0xbd,0x15,0xb8,0xff,0xec,0x40,0x16,0x0d,0x06,0x4d,0x15,0x0c,0x0b,0x06,0x4d,0x15,0x0f,0xc8,0x03,0x1c,0x0d,0x06,0x4d,0x03,0x1c,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x39,0x2f,0x2b, +0x2b,0x2b,0x5d,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x10,0x18,0xc4,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x18,0x2f,0x3f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06, +0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x94,0x94, +0xb0,0xba,0x9e,0x99,0xa9,0xbd,0x8b,0x5f,0x6e,0x6c,0x5d,0x5e,0x6a,0x69,0x03,0x59,0xfc,0x66,0x8f,0x03,0x99,0x03,0x42,0x94,0xb0,0xbd,0x9b,0x99,0xa9,0xbc,0x8c,0x60,0x6c,0x6b,0x5d,0x5f,0x6a,0x6a,0xfc,0x79,0x94,0xb0,0xbc,0x9c,0x98,0xaa,0xbd,0x8b,0x60,0x6d,0x6c,0x5d,0x5e,0x6a,0x69,0x02,0xcb,0xc3,0xa3,0xb2,0xcd,0xbe,0xac,0xac, +0xcf,0x02,0x77,0x8d,0x7b,0x79,0x87,0x8c,0x7c,0x79,0x87,0x58,0xfa,0x5c,0x05,0xa4,0xfa,0x50,0xc4,0xa2,0xb1,0xd0,0xbf,0xae,0xab,0xcf,0x02,0x76,0x8d,0x7b,0x78,0x86,0x8d,0x7b,0x79,0x85,0xfd,0x8a,0xc4,0xa2,0xb2,0xcf,0xc0,0xad,0xab,0xcf,0x02,0x76,0x8c,0x7c,0x77,0x87,0x8d,0x7b,0x7a,0x84,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12, +0x07,0x69,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x0f,0x01,0x5b,0x00,0x16,0xb9,0x00,0x02,0xff,0xf1,0x40,0x09,0x12,0x12,0x0c,0x0b,0x25,0x02,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x6b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xab,0x01,0x5d, +0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0e,0x0e,0x02,0x03,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x66,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x57,0x01,0x5c,0x00,0x16,0xb9,0x00,0x02,0xff,0xfa,0x40,0x09,0x11,0x13,0x06,0x07,0x25,0x02,0x12, +0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe3,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x8b,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x21,0x0f,0x02,0x03,0x3e,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00, +0x03,0xb4,0x07,0x66,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xe8,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe9,0x40,0x09,0x0f,0x0d,0x02,0x03,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x78,0x00,0x00,0x01,0xfd,0x07,0x66,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xf1, +0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,0x02,0x30,0x07,0x6b,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xa0,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x06,0x08,0x04,0x02,0x03,0x25,0x01,0x08,0x05,0x26,0x00, +0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x1b,0x00,0x00,0x01,0xa0, +0x07,0x66,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x43,0xff,0xc9,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x05,0x04,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xf8,0x01,0x5c,0x00,0x13, +0x40,0x0b,0x02,0x1e,0x19,0x1b,0x0c,0x06,0x3e,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x6a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x97,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x05,0x1a,0x1a,0x03,0x09,0x25,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b, +0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x99,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x2c,0x19,0x18,0x03,0x09,0x25,0x02,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x65,0x02,0x26,0x00,0x38,0x00,0x00, +0x01,0x07,0x00,0x8e,0x01,0xb4,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x2b,0x0f,0x11,0x05,0x0d,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x6b,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x4b,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x10,0x05,0x0d, +0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x66,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x67,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xd1,0x40,0x09,0x11,0x0f,0x05,0x0d,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0xa6, +0x00,0x00,0x01,0x4a,0x04,0x00,0x00,0x03,0x00,0x31,0x40,0x16,0x03,0x0f,0x00,0x15,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xfe,0xb6,0x0c,0x06,0x4d,0x01,0x01,0x05,0x04,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x21,0x23,0x11,0x33,0x01, +0x4a,0xa4,0xa4,0x04,0x00,0x00,0x00,0x01,0x00,0x5c,0x04,0xc2,0x02,0x90,0x06,0x0e,0x00,0x06,0x00,0x1c,0xb3,0x00,0x00,0x08,0x04,0xb8,0xff,0xc0,0xb6,0x10,0x00,0x4d,0x04,0x05,0x80,0x03,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x2b,0x12,0x39,0x2f,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x02,0x90,0x7a,0xa4,0xa5,0x71,0xd7,0x85,0x04, +0xc2,0xe6,0xe6,0x01,0x4c,0x00,0x00,0x01,0x00,0x23,0x04,0xb2,0x02,0xa4,0x05,0xb2,0x00,0x13,0x00,0x50,0x40,0x0f,0x0a,0x0c,0x01,0x03,0x00,0x02,0x01,0x10,0x05,0x0c,0x40,0x0c,0x00,0x4d,0x02,0xb8,0xff,0xc0,0x40,0x1b,0x0c,0x00,0x4d,0x13,0xc4,0x00,0x00,0x15,0x09,0xc4,0x40,0x0a,0x13,0x0d,0x0d,0x07,0xda,0x59,0x0d,0x11,0x40,0x03, +0x11,0xda,0x59,0x09,0x03,0x00,0x2f,0xc6,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x18,0x10,0xc6,0x01,0x2f,0x1a,0xe9,0x12,0x39,0x2f,0xe9,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x5f,0x5d,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a, +0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x00,0x00,0x01,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x05,0x2f,0x00,0x03,0x00,0x11,0xb6,0x00,0x01,0x01,0x02,0xe2,0x59,0x01,0x00,0x2f,0x2b,0x01,0x18,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x04, +0xc2,0x6d,0x00,0x01,0x00,0x25,0x04,0xc2,0x02,0x4a,0x05,0xbe,0x00,0x0c,0x00,0x2f,0x40,0x17,0x0c,0xc4,0x0f,0x00,0x01,0x0b,0x03,0x00,0x00,0x0e,0x07,0xc4,0x40,0x06,0x0c,0x06,0x03,0x80,0x03,0x09,0xdb,0x59,0x03,0x00,0x2f,0x2b,0x00,0x1a,0x18,0x10,0xdc,0xc4,0x01,0x2f,0x1a,0xe9,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0xe9,0x31,0x30,0x01, +0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x02,0x4a,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0c,0xa0,0x44,0x61,0x0a,0x05,0xbe,0x71,0x8b,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0x00,0x6c,0x04,0xc2,0x01,0x31,0x05,0x85,0x00,0x0b,0x00,0x12,0xb7,0x09,0xc0,0x03,0x00,0x06,0xc1,0x5b,0x00,0x00,0x2f,0x2b,0x01,0x18, +0x2f,0xe1,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xcf,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x04,0xc2,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x00,0x02,0x00,0x52,0x04,0x98,0x01,0xee,0x06,0x1c,0x00,0x0b,0x00,0x16,0x00,0x4f,0x40,0x31,0x04,0x0b,0x01,0x04,0x07,0x01,0x0b,0x05,0x01,0x0b,0x01,0x01, +0x10,0x14,0xc4,0x40,0x00,0x09,0x50,0x09,0xa0,0x09,0xb0,0x09,0x04,0x1c,0x03,0x09,0xc0,0x0f,0xc4,0x40,0x03,0x06,0x0c,0xc5,0x59,0x06,0x40,0x09,0x0d,0x48,0x06,0x00,0x00,0x11,0xc5,0x59,0x00,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x01,0x18,0x2f,0x1a,0xe9,0x1a,0xdc,0x5f,0x5e,0x5d,0x1a,0xe9,0x31,0x30,0x5e,0x5d,0x5d,0x5d, +0x5d,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x1c,0x57,0x73,0x76,0x5b,0x59,0x72,0x7a,0x58,0x30,0x40,0x70,0x32,0x42,0x42,0x04,0x98,0x69,0x55,0x5a,0x6c,0x6c,0x54,0x54,0x70,0x01,0x33,0x41,0x30,0x70,0x40,0x30,0x31,0x40,0x00,0x00,0x01,0x00,0x33, +0xfe,0x50,0x01,0x87,0x00,0x00,0x00,0x12,0x00,0x5d,0x40,0x0c,0x03,0x12,0x01,0x03,0x00,0x01,0x01,0x10,0x05,0x09,0xc2,0x00,0xb8,0xff,0xc0,0x40,0x0d,0x0b,0x0f,0x48,0x00,0x10,0x05,0x40,0x0d,0x02,0x07,0xc5,0x59,0x02,0xb8,0xff,0xc0,0x40,0x1a,0x09,0x0f,0x48,0x02,0x10,0x0f,0x0b,0x1f,0x0b,0x2f,0x0b,0x03,0x09,0x03,0x10,0x0b,0xc3, +0x59,0x10,0x40,0x0a,0x0e,0x48,0x10,0x0e,0x12,0x00,0x3f,0xc5,0x2b,0x2b,0x00,0x5f,0x5e,0x5d,0x18,0x10,0xc4,0x2b,0x2b,0x01,0x18,0x2f,0x1a,0xce,0xcd,0xd4,0x2b,0xe1,0x30,0x31,0x5f,0x5e,0x5d,0x5f,0x5d,0x01,0x14,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x33,0x15,0x32,0x16,0x01,0x87,0xfe,0xed,0x26,0x1b, +0x2b,0x1b,0x8d,0x81,0x0a,0x1f,0x6c,0x58,0x67,0xff,0x00,0xb0,0x02,0x5a,0x06,0x5a,0x4e,0x04,0xb6,0x68,0x50,0x00,0x00,0x02,0x00,0x40,0x04,0xc2,0x02,0x87,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x4d,0x40,0x30,0x00,0x0e,0x02,0x28,0x0d,0x06,0x4d,0x02,0x18,0x0c,0x06,0x4d,0x02,0x18,0x0b,0x06,0x4d,0x02,0x30,0x0a,0x06,0x4d,0x02,0x30, +0x09,0x06,0x4d,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x70,0x06,0x01,0x06,0x03,0x02,0x07,0x80,0x06,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0x5d,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0xe9,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x87,0xf5,0x61,0xd1, +0x72,0xf0,0x60,0xce,0x06,0x00,0xfe,0xc2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x01,0x00,0x3e,0xfe,0x70,0x01,0x52,0x00,0x00,0x00,0x0e,0x00,0x24,0x40,0x12,0x0f,0x0b,0x01,0x10,0x04,0x00,0x06,0x06,0x02,0xc2,0x0c,0x09,0x04,0xe2,0x59,0x09,0x0e,0x12,0x00,0x3f,0x2f,0x2b,0x01,0x18,0x2f,0xf1,0xc2,0x2f,0xc6,0x31,0x30,0x5f,0x5e,0x5d, +0x21,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x52,0x96,0x44,0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x9d,0x8d,0x52,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x7a,0x80,0x00,0x01,0x00,0x66,0x04,0xc2,0x02,0x98,0x06,0x0c,0x00,0x06,0x00,0x1c,0xb3,0x00,0x00,0x08,0x03,0xb8,0xff,0xc0,0xb6,0x10,0x00,0x4d,0x03,0x03, +0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x2b,0x11,0x39,0x2f,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x02,0x98,0xd6,0x84,0xd8,0x73,0xa4,0xa4,0x06,0x0c,0xfe,0xb6,0x01,0x4a,0xe5,0xe5,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x0d,0x00,0xc5,0x40,0x16,0x0f,0x0a,0x01,0x00,0x04,0x01,0x10,0x05,0x0b,0x02, +0x03,0x0a,0x03,0x08,0x05,0x04,0x09,0x04,0x0a,0x0a,0x0c,0x00,0xb8,0xff,0xf0,0xb3,0x10,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x00,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x00,0xb8,0xff,0xc0,0x40, +0x1b,0x0a,0x1f,0x48,0x00,0x00,0x0f,0x03,0x08,0x05,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x7e,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf2,0x40,0x19,0x0c,0x06,0x4d,0x01,0x06,0x0b,0x06,0x4d,0x01,0x04,0x03,0x0a,0x09,0x03,0x09,0x03,0x00,0x06,0x03,0x00,0x0d,0x91,0x59, +0x00,0x12,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x31,0x30,0x10,0x87,0x04,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x21,0x11,0x07,0x35,0x37,0x11, +0x33,0x11,0x25,0x15,0x05,0x11,0x21,0x03,0xa4,0xfd,0x18,0x9b,0x9b,0xa8,0x01,0x48,0xfe,0xb8,0x02,0x40,0x02,0x23,0x61,0x98,0x60,0x02,0xe0,0xfd,0x89,0xcb,0x9a,0xc8,0xfe,0x0c,0x00,0x01,0x00,0x16,0x00,0x00,0x02,0x12,0x05,0xec,0x00,0x0b,0x00,0x62,0x40,0x3c,0x0a,0x07,0x06,0x0b,0x06,0x04,0x01,0x05,0x00,0x00,0x00,0x02,0x05,0x0a, +0x07,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x84,0x70,0x03,0x01,0x03,0x08,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x06,0x05,0x00,0x0b,0x0b,0x05,0x02,0x09,0x00,0x02,0x15,0x40,0x0d,0x01,0x5d,0x00,0x3f,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b, +0x2b,0x2b,0x39,0x39,0xc6,0x10,0xc2,0x2f,0x31,0x30,0x87,0x04,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x02,0x12,0xae,0xa4,0xaa,0xaa,0xa4,0xae,0x03,0x2b,0x7b,0xfd,0x50,0x02,0x42,0x77,0x9d,0x77,0x03,0x0d,0xfd,0x62,0x7a,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a, +0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xa2,0x01,0x5e,0x00,0x14,0xb4,0x01,0x38,0x05,0x26,0x01,0xb8,0xff,0xf4,0xb4,0x39,0x36,0x13,0x2c,0x25,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0c,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x06,0x00,0xe0,0x12,0x00,0x00,0x14,0xb4,0x01,0x31,0x11, +0x26,0x01,0xb8,0xff,0xec,0xb4,0x32,0x2f,0x0f,0x16,0x25,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x67,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xec,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x05,0x0f,0x0f,0x08,0x09,0x25,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0c,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x06,0x00,0xe0,0x76,0x00,0x00,0x13,0x40,0x0b,0x01,0x0e,0x0f,0x0f,0x08,0x09,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x0f,0x01,0x00,0x04,0xca, +0x05,0x00,0x0e,0x40,0x03,0x04,0x07,0x42,0x07,0x04,0x1c,0x00,0x3f,0xcd,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x01,0x2f,0xe1,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x33,0x11,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0x94,0x94,0x02,0xcb,0x03,0x53,0xf8,0x00,0x03,0x54,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x0b,0x00,0x17, +0x00,0xaa,0x40,0x38,0x00,0x07,0x01,0x00,0x07,0x01,0x10,0x05,0x10,0x0d,0x01,0x04,0x04,0x01,0x91,0x59,0x04,0x05,0x00,0x04,0x91,0x2b,0x30,0x05,0x0c,0x91,0x59,0x05,0x03,0x00,0x11,0x91,0x59,0x00,0x12,0x0f,0x0f,0x00,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7d,0x15,0xb8,0xff,0xf0,0xb3, +0x0d,0x06,0x4d,0x15,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xea,0x40,0x1b,0x0b,0x06,0x4d,0x15,0x15,0x19,0x02,0x0d,0x04,0x11,0x06,0x0d,0x06,0x4d,0x11,0x06,0x0c,0x06,0x4d,0x11,0x06,0x0b,0x06,0x4d,0x11,0x7e,0x00,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1, +0x2b,0x2b,0x2b,0x39,0x39,0xce,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x21,0x15,0x21,0x11,0x33,0x20, +0x00,0x11,0x10,0x21,0xbc,0xa0,0xa0,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0x01,0x50,0xfe,0xb0,0xd6,0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x02,0x81,0x9b,0x02,0x7e,0xfd,0x45,0xfe,0xb2,0xfe,0x6f,0x05,0x02,0xfe,0x1a,0x9b,0xfe,0x17,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x00,0x02,0x00,0x60,0xff,0xea,0x04,0x18,0x05,0xf4,0x00,0x1a, +0x00,0x25,0x00,0xfa,0x40,0x17,0x00,0x0e,0x01,0x10,0x06,0x0b,0x0b,0x0a,0x06,0x06,0x07,0x05,0x0c,0x05,0x0e,0x0e,0x0f,0x03,0x03,0x02,0x04,0x0d,0x06,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x03,0xb8,0xff,0xc0,0xb3,0x0b,0x06,0x4d,0x03,0xb8,0xff,0xc0,0xb3,0x0a,0x06,0x4d,0x03,0xb8,0xff,0xc0,0x40,0x46,0x09,0x06,0x4d,0x05,0x04,0x30, +0x09,0x12,0x48,0x04,0x04,0x19,0x0d,0x0c,0x09,0x00,0x01,0x1b,0x19,0x1b,0x95,0x59,0x19,0x10,0x13,0x21,0x95,0x59,0x13,0x16,0x0e,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0d,0x06,0x4d,0x0d,0x0d,0x10,0x05,0x01,0x24,0x0f,0x08,0x01,0x08,0x08,0x16,0x10,0x04,0x0d,0x06,0x4d,0x10,0x04,0x0c,0x06,0x4d,0x10,0x04,0x0b,0x06,0x4d,0x10,0x83,0x24, +0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xe3,0x40,0x2a,0x0b,0x06,0x4d,0x24,0x24,0x27,0x1e,0x0a,0x0d,0x06,0x4d,0x1e,0x0a,0x0c,0x06,0x4d,0x1e,0x0a,0x0b,0x06,0x4d,0x1e,0x83,0x16,0x10,0x0d,0x06,0x4d,0x16,0x0c,0x0c,0x06,0x4d,0x16,0x15,0x0b,0x06,0x4d,0x16,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b, +0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x12,0x39,0xc6,0x11,0x39,0x2f,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0xc6,0x32,0x12,0x39,0x2f,0x2b,0x33,0x01,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x5f,0x5e,0x5d,0x01,0x37, +0x26,0x27,0x05,0x27,0x25,0x26,0x27,0x33,0x16,0x17,0x25,0x17,0x05,0x00,0x11,0x14,0x00,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x07,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x12,0x04,0x5a,0x6c,0xfe,0xd5,0x33,0x01,0x0e,0x76,0x92,0xdd,0x4b,0x61,0x01,0x21,0x37,0xfe,0xf8,0x01,0x47,0xfe,0xfe,0xde,0xde,0xfa,0x01, +0x04,0xdc,0x7b,0x75,0x94,0xaa,0xa6,0x94,0x8b,0xa3,0x03,0xc8,0x03,0xa2,0x68,0x97,0x62,0x83,0x69,0x60,0x34,0x54,0x90,0x5e,0x82,0xfe,0xcd,0xfe,0x2d,0xf0,0xfe,0xcc,0x01,0x18,0xf2,0xf3,0x01,0x2f,0x88,0xd9,0xbb,0xb5,0xd3,0xd8,0xb4,0x01,0x90,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x66,0x02,0x26,0x00,0x3c,0x00,0x00, +0x01,0x07,0x00,0x8e,0x01,0x33,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x30,0x0f,0x11,0x05,0x00,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0a,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xee,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x33,0x16,0x18,0x0c,0x00, +0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x7b,0x40,0x20,0x00,0x08,0x01,0x10,0x06,0x05,0x0d,0x91,0x59,0x00,0x05,0x10,0x05,0x02,0x0c,0x03,0x05,0x0c,0x0e,0x91,0x59,0x0c,0x05,0x0c,0x03,0x02,0x12,0x03,0x03,0x09,0x7d,0x12,0xb8,0xff, +0xf0,0x40,0x1a,0x0d,0x06,0x4d,0x12,0x12,0x16,0x05,0x0e,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x02,0x04,0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f, +0x2b,0xe9,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2b,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x01,0x11,0x23,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xa8,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xad,0xb8,0xfe,0xb0,0x01,0x3e,0xfe,0xc2, +0x05,0x9a,0xe2,0xdf,0xcd,0xcc,0xfe,0xfe,0x02,0xe3,0xfd,0xb4,0x9c,0x91,0x01,0x1f,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10,0x06,0x03,0x1b,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x04,0x00,0x06,0x1b,0x09,0x1b,0x95,0x59,0x09,0x10,0x0c,0x06,0x0d,0x06,0x4d, +0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18,0x18,0x1f,0x06,0x12,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40, +0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23, +0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x70,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x07,0xc3,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02, +0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x00,0x01,0x00,0xe8,0x02,0x12,0x04,0x94,0x02,0x98,0x00,0x03,0x00,0x30,0x40,0x0b,0x02,0x01,0xbe,0x59,0x0f,0x02,0x01,0x0d,0x03,0x02,0x00,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x04,0x05,0x01,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x2b,0x00, +0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0x02,0x12,0x86,0x00,0x00,0x01,0x01,0x0c,0x00,0xa4,0x04,0x6e,0x04,0x06,0x00,0x0b,0x00,0x1d,0xb6,0x0b,0x4f,0x05,0x01,0x05,0x02,0x08,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x08,0x19,0x2f,0x2b,0x18,0xc4,0x00,0x19,0x2f,0x5d,0x18,0xc4,0x31, +0x30,0x01,0x07,0x01,0x01,0x27,0x01,0x01,0x37,0x01,0x01,0x17,0x01,0x04,0x6e,0x5e,0xfe,0xac,0xfe,0xae,0x5e,0x01,0x54,0xfe,0xac,0x5e,0x01,0x52,0x01,0x54,0x5e,0xfe,0xac,0x01,0x02,0x5e,0x01,0x54,0xfe,0xac,0x5e,0x01,0x52,0x01,0x54,0x5e,0xfe,0xac,0x01,0x54,0x5e,0xfe,0xac,0x00,0x00,0x01,0x00,0x50,0x02,0x48,0x01,0xc2,0x05,0xb0, +0x00,0x0c,0x00,0x17,0x40,0x0a,0x0c,0xcc,0x04,0x00,0x0c,0x28,0x05,0x04,0x0b,0x27,0x00,0x3f,0xdd,0xcd,0x3f,0x01,0x2f,0xce,0xed,0x30,0x31,0x01,0x11,0x06,0x06,0x07,0x35,0x3e,0x03,0x37,0x33,0x11,0x01,0x40,0x39,0x78,0x3f,0x26,0x46,0x48,0x4c,0x2c,0x46,0x02,0x48,0x02,0xc2,0x2e,0x47,0x1b,0x87,0x0d,0x22,0x2b,0x35,0x20,0xfc,0x98, +0x00,0x01,0x00,0x68,0x02,0x48,0x02,0x92,0x05,0xae,0x00,0x1f,0x00,0x3c,0x40,0x24,0x1f,0x16,0xcc,0x09,0x09,0x21,0x1d,0xcc,0x0e,0x02,0x0f,0x0e,0x2b,0x1d,0x3b,0x1d,0x4b,0x1d,0x9b,0x1d,0xab,0x1d,0xbb,0x1d,0x06,0x1d,0x09,0x01,0x0c,0xe6,0x11,0x27,0x1f,0xe6,0x01,0x28,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x5d,0xcc,0x32,0x01, +0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x01,0x21,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x15,0x15,0x21,0x02,0x92,0xfd,0xd6,0x3b,0x59,0x68,0x59,0x3b,0x4b,0x3f,0x77,0x61,0x53,0x98,0x38,0x5e,0x44,0x26,0x39,0x56,0x64,0x56,0x39,0x01,0x93,0x02,0x48,0x52, +0x3d,0x61,0x54,0x4b,0x50,0x5a,0x38,0x3a,0x40,0x66,0x95,0x4c,0x22,0x3f,0x58,0x37,0x4a,0x73,0x5c,0x48,0x3d,0x37,0x1c,0x0b,0x00,0x01,0x00,0x81,0x02,0x33,0x02,0x8e,0x05,0xae,0x00,0x20,0x00,0x61,0x40,0x35,0x00,0x16,0x01,0x10,0x05,0x19,0x09,0x0a,0x0a,0x09,0xe6,0x59,0x0a,0x0a,0x03,0x14,0x0f,0x11,0x1f,0x11,0x02,0x0f,0x03,0x11, +0x0f,0x14,0x0f,0xe6,0x59,0x14,0x27,0x01,0x03,0x1f,0x03,0xe6,0x59,0x1f,0x29,0x19,0x0a,0x0d,0xcd,0x17,0x17,0x1c,0xcc,0x06,0x06,0x22,0x0a,0x11,0x00,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12, +0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x81,0x67,0x72,0x50,0x5c,0xdb,0x54,0x50,0xc5,0x90,0x5e,0x5c,0x57,0x7e,0x71,0x86,0x91,0xb1,0xaa,0x8e,0x89,0x02,0x68,0x8e, +0x4c,0x4b,0x40,0x8d,0x76,0x86,0x77,0x45,0x8b,0x33,0x77,0x60,0x97,0x36,0x04,0x2a,0xa0,0x75,0x94,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x06,0xd4,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x00,0xf1,0x04,0x42,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x11,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff, +0x00,0x50,0x00,0x00,0x06,0xaa,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x38,0x04,0x00,0xfd,0xb8,0x00,0x09,0xb3,0x03,0x02,0x14,0x2c,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x81,0x00,0x00,0x06,0xeb,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x06, +0x00,0x00,0x01,0x07,0x02,0x38,0x04,0x41,0xfd,0xb8,0x00,0x09,0xb3,0x03,0x02,0x28,0x2c,0x00,0x3f,0x35,0x35,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x03,0x94,0x05,0x9a,0x00,0x11,0x00,0x80,0x40,0x3e,0x10,0x01,0x04,0x07,0x07,0x04,0x91,0x59,0x07,0x07,0x0c,0x02,0x0c,0x0f,0x91,0x59,0x0c,0x09,0x02,0x0c,0x91,0x2b,0x30,0x09,0x0a,0x91, +0x59,0x09,0x03,0x02,0x12,0x0d,0x0d,0x09,0x09,0x13,0x03,0x00,0x00,0x07,0x0c,0x10,0x03,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x05,0x03,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf6,0x40,0x09,0x0c,0x06,0x4d,0x03,0x0a,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xce,0xf1, +0x2b,0x2b,0x2b,0x17,0x39,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x58,0xf4,0xa8,0xa0,0xa0,0x02,0xd8,0xfd,0xd0, +0x02,0x06,0xfd,0xfa,0xf4,0x01,0x16,0xfe,0xea,0x01,0x16,0x9c,0x03,0xe8,0x98,0xfe,0x10,0x97,0xc9,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x19,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xe2,0x01,0x5b,0x00,0x16,0xb9,0x00,0x01,0xff,0xda,0x40,0x09,0x1d,0x23,0x0d,0x08,0x25,0x01,0x1d,0x05,0x26,0x00,0x2b, +0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0xbe,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x1a,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x17,0x2c,0x26,0x20,0x17,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xad,0x00,0x00,0x01,0x72,0x06,0xe2,0x02,0x26,0x00,0x2c, +0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x41,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x0d,0x02,0x03,0x25,0x01,0x04,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xfe,0x50,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x76,0x00,0x00,0xff,0xff,0x00,0x68,0xfe,0x50,0x03,0x0f, +0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x03,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x66,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xd5,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x3e,0x17,0x19,0x10,0x0b,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0a,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x23,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x24,0x17,0x19,0x10,0x0a,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x68,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xe0, +0x01,0x86,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x36,0x1b,0x1b,0x10,0x0b,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0c,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc2,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0a,0x1b,0x1b,0x10,0x0b,0x25,0x01,0x18,0x11, +0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x98,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0xcb,0x40,0x55,0x0f,0x06,0x01,0x10,0x05,0x24,0x18,0x0c,0x00,0x4d,0x18,0x15,0x0f,0x12,0x12,0x0f,0x96,0x59,0x0f,0x12,0x1f,0x12,0x2f,0x12,0x03,0x09,0x03,0x12,0x12,0x0b,0x14,0x00,0x0d,0x1d,0x0b,0x1d,0x95,0x59, +0x0b,0x10,0x02,0x23,0x05,0x23,0x95,0x59,0x05,0x16,0x00,0x15,0x10,0x10,0x01,0x08,0x17,0x17,0x0f,0x12,0x15,0x18,0x19,0x05,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01, +0x01,0x27,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d,0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x08,0x10,0x0d,0x06,0x4d,0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0x17,0x39,0xca,0x2f,0x11,0x12,0x39, +0x2f,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x26, +0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd0,0x63,0x04,0xfe,0xb5,0x01,0x4b,0xa4,0x88,0x88,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x88,0xac,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x01,0x40,0x86,0xb4,0xb4,0x86,0xfd,0x1d,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6, +0x00,0x01,0x00,0x00,0x05,0x74,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x10,0xb7,0x02,0x01,0xd9,0x59,0x02,0x00,0x00,0x01,0x2f,0x2f,0x00,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0xff,0xff,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x02,0x06,0x00,0xc3,0x00,0x00,0xff,0xff,0x00,0x16, +0x00,0x00,0x05,0x12,0x07,0x1b,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x5a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xfb,0x40,0x09,0x13,0x19,0x06,0x07,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xda, +0x00,0xdb,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf2,0x40,0x09,0x26,0x20,0x10,0x14,0x25,0x02,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0xfe,0x70,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x07,0x00,0xdf,0x03,0x79,0x00,0x00,0xff,0xff,0x00,0x5a,0xfe,0x70,0x03,0x83,0x04,0x18,0x02,0x26, +0x00,0x44,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x00,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x07,0x68,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x2a,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x04,0x13,0x10,0x01,0x0d,0x25,0x02,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8, +0x05,0xb3,0x05,0xec,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x01,0x9c,0x03,0xb7,0x06,0x63,0x00,0x12,0x40,0x0a,0x02,0x21,0x00,0x02,0x82,0x20,0x20,0x10,0x10,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0xe8,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x70,0x03,0xb4,0x05,0x9a, +0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x0f,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x70,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xa1,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x68,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xb1,0x01,0x5c,0x00,0x16, +0xb9,0x00,0x01,0xff,0xf8,0x40,0x09,0x0f,0x0c,0x02,0x0b,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0c,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xb4,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1c,0x1b,0x16,0x0f,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35, +0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x07,0x66,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x4c,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x11,0x08,0x06,0x03,0x05,0x3e,0x01,0x08,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x8e,0x00,0x00,0x02,0x13,0x07,0xbb,0x02,0x26,0x00,0x4f, +0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0x07,0x01,0xb1,0x00,0x16,0xb9,0x00,0x01,0xff,0xd5,0x40,0x09,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x01,0x9c,0x01,0x8d,0x06,0x11,0x00,0x14,0xb3,0x01,0x09,0x03, +0x01,0xb8,0xff,0xe5,0xb4,0x06,0x06,0x05,0x05,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xc3,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xc7,0x06,0x5d,0x00,0x12,0x40,0x0a,0x01,0x07,0x00,0x01,0x58,0x06,0x06,0x03,0x03,0x25,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0xbc, +0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x11,0xfd,0xd8,0x00,0x0e,0xb9,0x00,0x01,0xff,0x9e,0xb4,0x0f,0x0f,0x05,0x05,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0x87,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x56,0xfd,0xd8,0x00,0x0b,0xb6,0x01, +0x78,0x07,0x07,0x00,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x66,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xe2,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x15,0x17,0x0b,0x12,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8, +0x06,0x0a,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x38,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xec,0x40,0x09,0x14,0x16,0x04,0x0f,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x68,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x7e,0x01,0x5c, +0x00,0x16,0xb9,0x00,0x01,0xff,0xe4,0x40,0x09,0x19,0x19,0x0b,0x12,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0c,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xda,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x08,0x18,0x18,0x0b,0x02,0x25,0x01,0x15,0x11,0x26,0x00, +0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x5e,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0xe1,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfc,0x40,0x0a,0x1a,0x1a,0x06,0x06,0x25,0x03,0x02,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8, +0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x3f,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x06,0x1a,0x1a,0x06,0x06,0x25,0x03,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x07,0x66,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0x8e, +0x01,0x5f,0x01,0x5c,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xbc,0x06,0x0a,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xa4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x20,0x13,0x12,0x09,0x09,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc, +0x00,0x00,0x04,0xc0,0x07,0x68,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xe3,0x01,0x5c,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x97,0x00,0x00,0x02,0xc9,0x06,0x0c,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x06,0x00,0xe0,0x31,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x13,0x12,0x08,0x10,0x25,0x01, +0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x65,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x29,0x01,0x5b,0x00,0x08,0xb3,0x01,0x38,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0a,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x00,0x8e, +0x00,0xbe,0x00,0x00,0x00,0x08,0xb3,0x01,0x31,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x29,0xfe,0x50,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xdd,0x01,0x75,0x00,0x00,0x00,0x0b,0xb6,0x01,0x16,0x16,0x0c,0x06,0x4d,0x16,0x11,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x50,0x02,0x9a,0x05,0x2f,0x02,0x26, +0x00,0x57,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x13,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x07,0x68,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0x9d,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x03,0x0a,0x09,0x04,0x01,0x3e,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x2b,0xff,0xea, +0x03,0xd3,0x05,0x72,0x00,0x14,0x00,0x18,0x00,0x71,0x40,0x31,0x18,0x80,0x17,0x07,0x14,0x14,0x12,0x95,0x02,0x16,0x0a,0x0a,0x0e,0x0b,0x06,0x95,0x40,0x07,0x0f,0x15,0x80,0x17,0x0c,0x00,0x00,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x84,0x04,0xb8,0xff,0xe6, +0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xf2,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xd6,0x1a,0xcd,0x00,0x3f,0x1a,0xed,0x33,0x32,0x33,0x2f,0x3f,0xed,0x32,0x2f,0x10,0xd4,0x1a,0xcd,0x31,0x30,0x25,0x06,0x23,0x20,0x11, +0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x01,0x03,0x23,0x13,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3e,0x2d,0x01,0x52,0xa6,0x7b,0x75,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x04,0xdc,0xfe,0xfc,0x01, +0x04,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0xa3,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x8e,0x01,0x87,0x00,0x24,0xb1,0x02,0x01,0xb8,0xff,0xef,0x40,0x13,0x11,0x17,0x05,0x0d,0x25,0x02,0x01,0x00,0x0e,0x10,0x0e,0x20,0x0e,0x30,0x0e,0x04,0x0e,0x05,0x26,0x00,0x2b,0x5d,0x35,0x35,0x01,0x2b,0x35,0x35, +0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x1c,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x18,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x15,0x1b,0x08,0x11,0x25,0x02,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x5c,0x02,0x26,0x00,0x38, +0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x93,0x01,0x5c,0x00,0x45,0x40,0x12,0x01,0x10,0x0c,0x0d,0x06,0x4d,0x10,0x16,0x0c,0x06,0x4d,0x10,0x12,0x0b,0x06,0x4d,0x02,0x10,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x10,0xb8,0xff,0xf4,0x40,0x0e,0x0b,0x06,0x4d,0x05,0x10,0x10,0x05,0x0d,0x25,0x02,0x01, +0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x2b,0x2b,0x2b,0x35,0x2b,0x2b,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x05,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfd,0x40,0x0a,0x14,0x14,0x08,0x11,0x25,0x02,0x01,0x18,0x11,0x26,0x00,0x2b, +0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x67,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x58,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfa,0x40,0x09,0x0b,0x0b,0x08,0x09,0x3e,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0a, +0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xc7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x05,0x0b,0x0b,0x05,0x09,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x06,0xe1,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x83,0x01,0x5c,0x00,0x16,0xb9,0x00, +0x01,0xff,0xed,0x40,0x09,0x0d,0x13,0x08,0x09,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x05,0x85,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x17,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x0d,0x13,0x08,0x09,0x25,0x01,0x0a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b, +0x35,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x05,0x00,0x4c,0x40,0x20,0x02,0x12,0x05,0x00,0x91,0x59,0x05,0x03,0x70,0x00,0x01,0x00,0x00,0x07,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf2,0x40,0x09,0x0c, +0x06,0x4d,0x03,0x04,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0xa4,0xfd,0xc1,0xa9,0x02,0xe8,0x04,0xfe,0xfb,0x02,0x05,0x9a,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x1b, +0x00,0xb0,0x40,0x18,0x1a,0x19,0x91,0x59,0x1a,0x06,0x00,0x1a,0x91,0x2b,0x30,0x06,0x0c,0x91,0x59,0x06,0x04,0x00,0x12,0x91,0x59,0x00,0x13,0x18,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xd0,0xb3,0x0b,0x06,0x4d,0x19,0xb8,0xff,0xe8,0x40,0x1b,0x0b,0x06,0x4d,0x0f,0x15,0x19,0x18,0xff,0x3a,0x09,0x06,0x0d,0x06,0x4d,0x09, +0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7d,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xee,0xb6,0x0c,0x06,0x4d,0x30,0x15,0x01,0x15,0xb8,0xff,0xe0,0x40,0x27,0x0b,0x06,0x4d,0x15,0x15,0x1d,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x03,0x10,0x0d,0x06,0x4d, +0x03,0x10,0x0c,0x06,0x4d,0x03,0x18,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22, +0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x13,0x21,0x35,0x21,0x02,0xfe,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x29,0x01,0x6b,0xfe,0x8d,0xfe,0xd2,0xe1,0xfe,0xe7,0x01,0x12,0xdd,0xec,0x01,0x0f,0xfe,0xf9,0x1f,0xfd,0xe7,0x02,0x19,0x18,0x01,0x8f,0x01,0x45,0x01,0x57,0x01,0x9f,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe, +0x68,0x05,0x32,0xfe,0xba,0xfe,0xf8,0xfe,0xf6,0xfe,0xbd,0x01,0x34,0x01,0x16,0x01,0x18,0x01,0x39,0xfd,0x64,0x9c,0x00,0x03,0x00,0x60,0xff,0xf1,0x05,0xa7,0x05,0xa7,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0xf6,0x40,0x1a,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x91,0x59,0x1f,0x03,0x00,0x17,0x00,0x17,0x91,0x59,0x0e,0x00,0x0e,0x00,0x01,0x0d, +0x04,0x01,0x13,0x24,0xb8,0xff,0xe8,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1b,0x7e,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0x40,0x25,0x0c,0x06,0x4d,0x12,0x20, +0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x7e,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe8,0x40,0x1d,0x0b,0x06,0x4d,0x07,0x07,0x28,0x0b,0x0e,0x17,0x1f,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01, +0x7e,0x02,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xfd,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf8,0x40,0x0c,0x0b,0x06,0x4d,0x02,0x02,0x29,0x28,0x20,0x29,0x40,0x29,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b, +0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x25,0x15,0x23,0x35,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23, +0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x52,0x9c,0x2b,0xf9,0xfe,0xce,0x01,0x31,0xfc,0x29,0x9c,0x2a,0xfc,0x01,0x2f,0xfe,0xcc,0xf5,0x2c,0x2c,0xb6,0xcf,0xd3,0xb4,0xc6,0x29,0xb3,0xd6,0xcf,0xb8,0xba,0xc9,0xc9,0x01,0x3c,0xfc,0xf6,0x01,0x2a,0x95,0x95,0xfe,0xd5,0xf5,0xfd,0xfe,0xc5,0x03,0xca,0xfc,0xcc,0xdc,0xc4,0xb9,0xdb,0xfc,0xcc, +0x03,0x34,0xda,0xbb,0xc4,0xdb,0x00,0x02,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x04,0x18,0x00,0x19,0x00,0x26,0x01,0x02,0x40,0x0b,0x0d,0x14,0x01,0x10,0x04,0x25,0x10,0x10,0x00,0x4d,0x15,0xb8,0xff,0xf0,0xb3,0x10,0x00,0x4d,0x14,0xb8,0xff,0xd0,0xb3,0x10,0x00,0x4d,0x0e,0xb8,0xff,0xf0,0x40,0x0e,0x10,0x00,0x4d,0x08,0x10,0x10,0x00,0x4d, +0x03,0x28,0x10,0x00,0x4d,0x25,0xb8,0xff,0xe8,0x40,0x36,0x0b,0x0c,0x00,0x4c,0x1f,0x18,0x0b,0x0c,0x00,0x4c,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x10,0x18,0x0b,0x0c,0x00,0x4c,0x05,0x11,0x14,0x1a,0x04,0x07,0x0d,0x13,0x12,0x0f,0x0d,0x1d,0x95,0x59,0x0d,0x10,0x02,0x17,0xec,0x59,0x02,0x15,0x07,0x23,0xec,0x59,0x07,0x16,0x75,0x11,0x01, +0x1a,0xb8,0xff,0xe8,0xb4,0x09,0x15,0x01,0x4c,0x1a,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0x40,0x3d,0x0b,0x06,0x4d,0x14,0x11,0x0a,0x1a,0x05,0x00,0x1a,0x11,0x12,0x20,0x14,0x05,0x0a,0x12,0x83,0x13,0x70,0x00,0x01,0x00,0x00,0x28,0x20,0x08,0x0d,0x06,0x4d,0x20,0x08,0x0c,0x06,0x4d,0x20,0x08,0x0b,0x06,0x4d,0x20, +0x83,0x0a,0x10,0x0d,0x06,0x4d,0x0a,0x10,0x0c,0x06,0x4d,0x0a,0x10,0x0b,0x06,0x4d,0x2f,0x0a,0x01,0x0a,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0xd4,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x11,0x39,0x39,0x2b,0x2b,0x2b,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00, +0x18,0x3f,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x5f,0x5e,0x5d,0x25,0x06,0x23,0x22,0x03,0x23,0x02,0x21,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x16,0x17,0x33,0x13,0x33,0x03,0x16,0x16,0x33,0x32,0x37,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x04, +0xc5,0x35,0x2a,0x9a,0x36,0x04,0x94,0xfe,0xf6,0xba,0xe0,0x01,0x02,0xdc,0x7e,0xc6,0x33,0x04,0x55,0xac,0xc1,0x22,0x4c,0x3c,0x17,0x11,0xfe,0xa4,0x26,0x9c,0x6e,0x8e,0xa9,0x8f,0x79,0x6a,0xad,0x3a,0x05,0x0d,0x01,0x25,0xfe,0xcb,0x01,0x1f,0xdb,0xfa,0x01,0x3c,0x96,0x88,0x01,0x06,0xfe,0x0a,0xdb,0x9d,0x05,0x01,0x71,0xbe,0xca,0xf2, +0xb2,0x9e,0xd6,0xb5,0xb0,0x00,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x53,0x05,0xfe,0x00,0x1c,0x00,0x27,0x00,0xdf,0x40,0x0c,0x0d,0x27,0x01,0x0d,0x1e,0x01,0x02,0x00,0x01,0x10,0x04,0x19,0xb8,0xff,0xc0,0x40,0x0a,0x0b,0x0c,0x00,0x4c,0x17,0x30,0x0b,0x00,0x4d,0x00,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe0,0x40, +0x35,0x0c,0x00,0x4d,0x09,0x1b,0x22,0x1d,0x16,0x10,0x01,0x03,0x1b,0x03,0x95,0x59,0x1b,0x01,0x10,0x22,0x95,0x59,0x10,0x16,0x1d,0x16,0x25,0x18,0x01,0x01,0x0d,0x06,0x83,0x18,0x18,0x13,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x25,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x25,0xb8,0xff, +0xf0,0xb3,0x0c,0x06,0x4d,0x25,0xb8,0xff,0xe0,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x25,0x30,0x25,0x02,0x25,0x25,0x29,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x83,0x13,0x10,0x0d,0x06,0x4d,0x13,0x10,0x0c,0x06,0x4d,0x13,0x10,0x0b,0x06,0x4d,0x13,0x2f,0x29,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1, +0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x11,0x12,0x39,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x12,0x39,0x39,0x11,0x12,0x39,0x2b,0x31,0x30,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x01,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e, +0x02,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x03,0x04,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xe7,0xa8,0xac,0x64,0x79,0x68,0x78,0xa2,0xba,0x61,0xfe,0xe6,0xef,0xdb,0xfe,0xed,0xd4,0xcb,0xee,0xd0,0xb6,0xa4,0xbd,0xfe,0x92,0xb5,0x96,0x9d,0xba,0x8f,0x05,0xbe,0xb7,0x65,0x45, +0x3a,0x2f,0x69,0x49,0x63,0x9a,0xbf,0x6f,0xe9,0xfe,0xef,0x01,0x0b,0xd7,0x9b,0x01,0x02,0x58,0x93,0xa3,0x80,0x8a,0xfd,0x75,0x94,0xfe,0xeb,0x9d,0xb9,0xc0,0xa1,0x75,0xbf,0x00,0x00,0x01,0x00,0x52,0xff,0xe7,0x03,0x3b,0x04,0x19,0x00,0x25,0x00,0x9b,0x40,0x09,0x00,0x11,0x01,0x0f,0x00,0x01,0x10,0x04,0x0d,0xb8,0xff,0xe8,0x40,0x58, +0x0b,0x0c,0x00,0x4c,0x08,0x1e,0x19,0x19,0x1e,0xec,0x59,0x19,0x0f,0x02,0x19,0xec,0x0c,0x30,0x12,0x14,0x0f,0x14,0x95,0x59,0x0f,0x10,0x00,0x25,0x01,0x0e,0x03,0x25,0x23,0x02,0x23,0x95,0x59,0x02,0x16,0x08,0x0c,0x1b,0x12,0x00,0x00,0x27,0x05,0x16,0x83,0x0c,0x20,0x08,0x0d,0x06,0x4d,0x20,0x08,0x0c,0x06,0x4d,0x20,0x08,0x0b,0x06, +0x4d,0x20,0x83,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x10,0x0b,0x06,0x4d,0x2f,0x05,0x3f,0x05,0x02,0x05,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0xc4,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x00,0x18,0x2f,0x2b, +0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x26,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x3b,0x82,0xc3,0xc3,0xe1,0x8b,0x72,0x56,0x80,0xd5,0xb2,0x8f,0x7f,0x85, +0x93,0xd7,0xa2,0x7d,0x49,0x2d,0x49,0x43,0xfe,0xd0,0x8d,0x80,0xa7,0x8f,0x16,0x2f,0xa5,0x89,0x5d,0x88,0x15,0x04,0x12,0x81,0x53,0x88,0x98,0x2d,0xa5,0x47,0x93,0x4b,0x5c,0x04,0x92,0x04,0xb2,0x4b,0x5b,0x49,0x00,0x02,0x00,0x61,0xff,0xe8,0x04,0x82,0x04,0x00,0x00,0x0c,0x00,0x17,0x00,0x7b,0x40,0x22,0x01,0x0e,0x0b,0x0e,0x96,0x59, +0x0b,0x0f,0x06,0x13,0x95,0x59,0x06,0x16,0x00,0x00,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x83,0x16,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x16,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x16,0x16,0x19,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x83, +0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09,0x10,0x0b,0x06,0x4d,0x09,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xca,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x01,0x21,0x16,0x15,0x14,0x02,0x23,0x22,0x00,0x35,0x10,0x21,0x21, +0x05,0x23,0x20,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x82,0xff,0x00,0x8e,0xfc,0xd4,0xdb,0xfe,0xfc,0x02,0x09,0x02,0x18,0xfe,0x6c,0x76,0xfe,0x92,0xa9,0x8d,0x89,0x9f,0x03,0x7c,0xb6,0xdd,0xe3,0xfe,0xe2,0x01,0x1f,0xef,0x02,0x0a,0x84,0xfe,0x73,0xac,0xcf,0xd1,0xaf,0xdc,0x00,0x01,0x00,0x22,0xff,0xf4,0x03,0xc5,0x04,0x00, +0x00,0x13,0x00,0x7a,0x40,0x43,0x53,0x10,0x01,0x00,0x0f,0x01,0x0b,0x03,0x0f,0x0d,0x00,0x13,0x00,0x96,0x59,0x13,0x0f,0x06,0x04,0x09,0x04,0xec,0x59,0x09,0x30,0x00,0x70,0x00,0x02,0x00,0x00,0x15,0x02,0x0f,0x0f,0x0b,0x14,0x06,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x0b,0x08, +0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x0b,0x0b,0x15,0x14,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x5d,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x10,0x18,0xd4,0xc6,0x5f,0x5e,0x5d,0x31,0x30,0x5d,0x01,0x21, +0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x23,0x22,0x07,0x35,0x36,0x33,0x21,0x03,0xc5,0xfe,0x79,0x74,0x36,0x36,0x42,0x48,0xf9,0x8d,0x72,0x7a,0x4c,0xa4,0x02,0xb3,0x03,0x7c,0xfd,0x96,0x8e,0x14,0x8e,0x16,0x01,0x20,0x02,0x68,0x58,0x94,0x48,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x38,0x04,0x18,0x00,0x1b,0x00,0x25, +0x00,0xfe,0x40,0x0f,0x06,0x17,0x01,0x09,0x15,0x01,0x09,0x0e,0x01,0x0d,0x0c,0x01,0x10,0x03,0x1f,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x15,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x10,0xb8,0xff,0xc0,0x40,0x2a,0x0b,0x0c,0x00,0x4c,0x16,0x23,0x95,0x59,0x16,0x10,0x0d,0x0f,0x13,0x05,0x02,0x1c,0x02,0x1c,0x95,0x59,0x02,0x16, +0x03,0x1c,0x19,0x08,0x0d,0x06,0x4d,0x19,0x08,0x0c,0x06,0x4d,0x19,0x08,0x0b,0x06,0x4d,0x20,0x83,0x19,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0xff,0xe0,0x40,0x56,0x0b,0x06,0x4d,0x19,0x0e,0x02,0x05,0x0a,0x42,0x02,0x0d,0x01,0x0d,0x0d,0x05,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c, +0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x0f,0x83,0x50,0x0a,0x60,0x0a,0x02,0x0f,0x0a,0x01,0x0a,0x10,0x0d,0x06,0x4d,0x0a,0x10,0x0c,0x06,0x4d,0x0a,0x18,0x0b,0x06,0x4d,0x0a,0x0a,0x26,0x1c,0x13,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x10,0x0b,0x06,0x4d,0x02,0x84,0x05,0x05,0x27,0x26,0x2f,0x27,0x3f,0x27,0x02,0x5d, +0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0x5d,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x3f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d, +0x05,0x06,0x27,0x11,0x23,0x11,0x06,0x27,0x22,0x00,0x35,0x10,0x37,0x33,0x06,0x11,0x14,0x16,0x33,0x33,0x11,0x10,0x21,0x32,0x12,0x15,0x14,0x00,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x03,0x36,0x04,0x1e,0x94,0x18,0x04,0xec,0xfe,0xe8,0xd2,0xc2,0xec,0xbf,0x9b,0x1e,0x01,0x12,0xbc,0xea,0xfe,0xe7,0xfe,0xf5,0x22,0x98, +0xc2,0x93,0x67,0x82,0x18,0x04,0x04,0xfe,0x36,0x01,0xca,0x04,0x04,0x01,0x20,0xf6,0x01,0x3b,0xc7,0xd8,0xfe,0xd2,0xb8,0xce,0x02,0x95,0x01,0x0f,0xfe,0xd7,0xfb,0xe9,0xfe,0xdd,0x8c,0xd3,0xb5,0xb4,0xdc,0x81,0x00,0x02,0x00,0x00,0xfd,0xfe,0x03,0x52,0xff,0x62,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x1a,0x03,0x02,0xd9,0x59,0x0f,0x03, +0x01,0x0c,0x03,0x03,0x07,0x40,0x07,0x06,0xd9,0x59,0x1f,0x07,0x2f,0x07,0x02,0x07,0x07,0x03,0x04,0x00,0x2f,0x32,0x2f,0x33,0x00,0x2f,0x5d,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x11,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x03,0x52,0xfc,0xae,0x03,0x52,0xfe,0xeb,0x77,0x77,0xed,0x77,0x77,0xff,0xff,0x00,0xb4, +0xff,0xee,0x03,0x23,0x05,0x9a,0x00,0x26,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x04,0x01,0x91,0x00,0x00,0x00,0x01,0x00,0x6e,0x02,0xcd,0x02,0xc2,0x05,0xb0,0x00,0x12,0x00,0x2b,0x40,0x16,0x00,0x0b,0x24,0x04,0x0f,0x07,0x0f,0x52,0x59,0x07,0x04,0x03,0x03,0x0b,0xc2,0x0c,0x0c,0x14,0x04,0x00,0xc2,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f, +0xe1,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0xc4,0x31,0x30,0x13,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0xee,0x80,0x80,0x04,0x43,0x8f,0x78,0x86,0x82,0x97,0x4a,0x71,0x02,0xcd,0x02,0xcf,0x73,0x87,0x94,0x84,0xfe,0x35,0x01,0xc3,0xb0,0x79,0x55,0x00,0x00,0x04,0x00,0xbc, +0xff,0xe8,0x08,0xa0,0x05,0x9a,0x00,0x09,0x00,0x10,0x00,0x25,0x00,0x45,0x00,0xd6,0x40,0x1e,0x2b,0x41,0x30,0x3b,0x04,0x33,0x44,0x36,0x38,0x33,0x38,0x95,0x59,0x33,0x1c,0x1d,0x40,0x1a,0x17,0x20,0x1d,0x1d,0x20,0x95,0x59,0x1d,0x1d,0x03,0x13,0x27,0xb8,0xff,0xc0,0x40,0x3e,0x0b,0x0e,0x48,0x27,0x29,0x44,0x29,0x95,0x59,0x44,0x16, +0x25,0x23,0x13,0x23,0x95,0x59,0x13,0x16,0x0b,0x00,0x91,0x59,0x0b,0x0b,0x03,0x02,0x03,0x0a,0x91,0x59,0x03,0x03,0x02,0x12,0x36,0x36,0x41,0x83,0x2b,0x2b,0x47,0x27,0x3b,0x83,0x30,0x30,0x47,0x16,0x25,0x1f,0x1f,0x1d,0x1a,0x21,0x84,0x18,0x16,0x16,0x47,0x02,0x0e,0xb8,0xff,0xf8,0x40,0x11,0x0c,0x06,0x4d,0x06,0x7d,0x0e,0x0e,0x47, +0x0b,0x01,0x08,0x0c,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0x2f,0x2b,0xe1,0x2b,0x32,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x12,0x39,0x2f,0xce,0xf1,0x39,0x39,0xc2,0x2f,0xc4,0x11,0x12,0x39,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x3f, +0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0xc4,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x20,0x11,0x14,0x04,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x35, +0x33,0x35,0x37,0x11,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x17,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x01,0x64,0xa8,0x01,0x38,0x01,0xce,0xfe,0xf8,0xeb,0x6b,0x5e,0x01,0x50,0xfe,0xc5,0x04,0x39,0x3a,0x5f,0x83, +0x75,0x9b,0x9b,0xa4,0xed,0xed,0x83,0x3b,0x2f,0x44,0x79,0x89,0xa2,0x40,0xf6,0x6c,0xb8,0x92,0x82,0x4e,0x60,0x72,0x48,0x58,0x6c,0x5e,0x8d,0x4b,0xb0,0x9a,0xa2,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0xfe,0x54,0xd2,0xfe,0x02,0xe4,0xfd,0xb4,0x01,0x30,0x01,0x1c,0xfb,0x08,0x20,0x8e,0x9e,0x01,0xd0,0x8a,0xfa,0x36,0xfe,0xd0,0x8a,0xfe,0x4d, +0xbf,0x22,0x71,0xb0,0x63,0x72,0x28,0x50,0x5c,0x3e,0x74,0x79,0x91,0x2e,0xa0,0x44,0x3f,0x32,0x39,0x2c,0x27,0x3f,0x70,0x4a,0x7d,0x8f,0xff,0xff,0x00,0xbc,0xff,0xe8,0x04,0x4e,0x05,0x9a,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x2d,0x02,0x23,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x02,0x32,0xb4,0x0a,0x10,0x02,0x03,0x25,0x01, +0x2b,0x35,0xff,0xff,0x00,0x90,0xfe,0x1e,0x03,0x6c,0x05,0xd9,0x00,0x26,0x00,0x4c,0x00,0x00,0x01,0x07,0x00,0x4d,0x02,0x06,0x00,0x00,0x00,0x36,0xb3,0x03,0x02,0x1a,0x1a,0xb8,0xff,0xee,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xfe,0x40,0x18,0x0c,0x06,0x4d,0x1a,0x0e,0x0b,0x06,0x4d,0x01,0x00,0x0d,0x0d,0x02,0x0c,0x06,0x4d,0x0d,0x02, +0x0b,0x06,0x4d,0x2f,0x2a,0x01,0x5d,0x2b,0x2b,0x11,0x35,0x35,0x2b,0x2b,0x2b,0x11,0x35,0x35,0xff,0xff,0xff,0xd7,0x00,0x00,0x04,0x4a,0x05,0xb2,0x00,0x26,0x00,0x51,0x52,0x00,0x01,0x07,0x00,0xb7,0xff,0x69,0x00,0x00,0x00,0x17,0xb2,0x00,0x00,0x00,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xef,0xb2,0x0b,0x06,0x4d,0x2b, +0x2b,0x11,0x35,0x00,0x00,0x01,0x00,0x82,0x03,0xdb,0x01,0x5e,0x05,0x9a,0x00,0x03,0x00,0x19,0xb9,0x00,0x01,0xff,0xe8,0x40,0x09,0x0e,0x12,0x48,0x01,0xb3,0x03,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0xed,0x31,0x30,0x01,0x2b,0x01,0x03,0x23,0x13,0x01,0x5e,0x68,0x74,0x56,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x02,0x00,0x8d,0x03,0xdb, +0x02,0x84,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x3b,0xb9,0x00,0x01,0xff,0xe8,0xb3,0x0e,0x12,0x48,0x05,0xb8,0xff,0xe8,0x40,0x17,0x0e,0x12,0x48,0x05,0x01,0xb3,0x40,0x04,0x00,0x03,0x00,0x0e,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x00,0x06,0x01,0x06,0x2f,0x5d,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0xe1,0x00,0x3f,0xc4,0x1a,0xfd,0xc4, +0x31,0x30,0x01,0x2b,0x2b,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x84,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x04,0x00,0x96,0xff,0xec,0x06,0x0e,0x05,0xae,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x2e,0x00,0x63,0x40,0x35,0x15,0x03,0x09,0x07,0x0c,0x07,0xe6,0x59,0x0c,0x24, +0x00,0x02,0x12,0x02,0xe6,0x59,0x12,0x27,0x17,0x15,0x1f,0x25,0xe7,0x59,0x1f,0x19,0x19,0x2a,0xe7,0x59,0x19,0x2d,0x28,0xcc,0x1c,0x1c,0x15,0x15,0x22,0xcc,0x2d,0x2d,0x30,0x0f,0x17,0x17,0x0f,0x09,0x14,0x14,0x05,0xcc,0x0f,0x2f,0xe1,0x33,0x2f,0xc6,0x11,0x33,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x32,0x2f,0xe1,0x00,0x3f,0x2b, +0x00,0x18,0x10,0xc4,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x30,0x31,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x17,0x25,0x01,0x23,0x01,0x03,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x02,0x03,0x22,0x06,0x15, +0x14,0x33,0x32,0x36,0x35,0x34,0x02,0xf7,0x4f,0x5a,0x76,0x8f,0x9a,0x56,0x76,0x1f,0x66,0x5c,0x80,0x8e,0xe4,0xb8,0x72,0x49,0x02,0xdf,0xfb,0x33,0x93,0x04,0xcc,0xd6,0x8d,0x95,0xe0,0xa9,0x83,0x98,0xdd,0x41,0x6c,0x94,0xa0,0x68,0x8f,0x04,0xf7,0x43,0xc3,0x7f,0xbc,0x4f,0x8d,0x35,0x9f,0x87,0xbf,0x01,0x00,0x32,0x1e,0xfa,0x66,0x05, +0x9a,0xfa,0x52,0xa4,0x84,0xb2,0x01,0x0a,0x9c,0x88,0xb5,0xfe,0xf5,0x02,0x76,0xd2,0x7d,0xb8,0xc6,0x86,0xbb,0x00,0x00,0x02,0x00,0x0e,0xff,0xe8,0x02,0x85,0x05,0xd3,0x00,0x17,0x00,0x20,0x00,0x4b,0x40,0x25,0x18,0x01,0x00,0x16,0x0a,0x05,0x00,0x20,0x17,0x17,0x05,0x13,0x05,0x1d,0xda,0x59,0x05,0x10,0x0e,0x13,0x0e,0xec,0x59,0x13, +0x13,0x10,0x1b,0x48,0x08,0x08,0x22,0x00,0x18,0x01,0x0a,0x83,0x16,0x2f,0xe1,0x39,0x39,0xcd,0x12,0x39,0x2f,0xe1,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x1a,0x19,0xcd,0x12,0x39,0x39,0x11,0x39,0x39,0x31,0x30,0x13,0x37,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x01,0x11,0x14,0x16,0x33, +0x32,0x37,0x15,0x06,0x23,0x22,0x35,0x35,0x07,0x13,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x0e,0xb2,0x7b,0x6f,0x64,0x77,0xfe,0xe3,0x1c,0x1e,0x30,0x96,0x70,0x71,0xc7,0x50,0xf8,0x6d,0x25,0x4c,0x1d,0x29,0x01,0xa6,0xec,0x01,0xc6,0xe2,0x99,0x87,0x68,0xc3,0xfe,0x79,0xfe,0x60,0x5a,0x29,0x6b,0xa2,0x58,0xf1,0xe1,0x62,0x02,0x2b, +0xbb,0x71,0x35,0x76,0x3e,0xb6,0x00,0x02,0x00,0x92,0x00,0x00,0x04,0x42,0x03,0xb0,0x00,0x03,0x00,0x07,0x00,0x3a,0x40,0x0d,0x07,0xf1,0x01,0x0e,0x06,0xf1,0x40,0x02,0x12,0x03,0x02,0x42,0x06,0xb8,0xff,0xe0,0x40,0x14,0x0c,0x06,0x4d,0x06,0xf1,0x02,0x05,0x20,0x0c,0x06,0x4d,0x05,0xf1,0x03,0x08,0x09,0x03,0x02,0xff,0x3a,0x2b,0x01, +0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x2b,0x00,0x18,0x3f,0x1a,0xed,0xfd,0xed,0x31,0x30,0x13,0x21,0x11,0x21,0x13,0x11,0x21,0x11,0x92,0x03,0xb0,0xfc,0x50,0x4b,0x03,0x19,0x03,0xb0,0xfc,0x50,0x03,0x64,0xfc,0xe8,0x03,0x18,0x00,0x01,0x00,0x83,0x01,0xbc,0x02,0x52,0x03,0x8c,0x00,0x03,0x00,0x25,0x40,0x16,0x02,0x0e,0x40,0x03,0x02,0x01, +0x42,0x0f,0x01,0x1f,0x01,0x2f,0x01,0x03,0x09,0x03,0x04,0x05,0x02,0x01,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x11,0x21,0x11,0x02,0x52,0xfe,0x31,0x03,0x8c,0xfe,0x30,0x01,0xd0,0x00,0x00,0x02,0x00,0x83,0x01,0xbc,0x02,0x52,0x03,0x8c,0x00,0x03,0x00,0x07,0x00,0x41,0x40,0x2a,0x06,0xf1, +0x02,0x0e,0x07,0xf1,0x40,0x01,0x03,0x02,0x42,0x02,0x20,0x0c,0x06,0x4d,0x06,0xf1,0x02,0x05,0x20,0x0c,0x06,0x4d,0x05,0xf1,0x03,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x09,0x03,0x08,0x09,0x03,0x02,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x2b,0x00,0x18,0x2f,0x1a,0xed,0xfd,0xed,0x31,0x30,0x13,0x21,0x11, +0x21,0x13,0x11,0x21,0x11,0x83,0x01,0xcf,0xfe,0x31,0x4c,0x01,0x37,0x03,0x8c,0xfe,0x30,0x01,0x84,0xfe,0xc8,0x01,0x38,0x00,0x00,0x01,0x00,0xb2,0x00,0x89,0x04,0x23,0x03,0xfa,0x00,0x0b,0x00,0x25,0x40,0x15,0x03,0x0e,0x40,0x09,0x06,0x00,0x42,0x20,0x00,0x01,0x0f,0x06,0x01,0x09,0x03,0x0c,0x0d,0x06,0x00,0xff,0x3a,0x2b,0x01,0x5f, +0x5e,0x5d,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x34,0x24,0x33,0x32,0x00,0x04,0x23,0xfe,0xff,0xb6,0xb8,0xfe,0xfe,0x01,0x06,0xb2,0xb7,0x01,0x02,0x02,0x42,0xb8,0xfe,0xff,0x01,0x01,0xb8,0xb9,0xff,0xfe,0xfc,0x00,0x00,0x02,0x00,0x70,0x01,0xaa,0x02,0x66,0x03,0xa0,0x00,0x0b,0x00,0x17, +0x00,0x46,0x40,0x2d,0x0f,0xf1,0x03,0x0e,0x15,0xf1,0x40,0x09,0x00,0x20,0x0c,0x06,0x4d,0x06,0x00,0x42,0x12,0xf1,0x00,0x0c,0x20,0x0c,0x06,0x4d,0x0c,0xf1,0x06,0x0f,0x06,0x1f,0x06,0x02,0x0b,0x03,0x00,0x40,0x09,0x0c,0x48,0x18,0x19,0x06,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x5f,0x5e,0x5d,0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x01,0x2b,0x00, +0x18,0x2f,0x1a,0xed,0xf4,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x66,0x92,0x69,0x67,0x94,0x92,0x69,0x67,0x94,0xfe,0x56,0x67,0x49,0x4a,0x64,0x66,0x4a,0x48,0x66,0x02,0xa6,0x6a,0x92,0x94,0x68,0x66,0x94,0x94,0x66,0x4a,0x66, +0x66,0x4a,0x49,0x65,0x67,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0x8c,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x56,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x00,0x12,0x13,0x06,0x07,0x25,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x2f,0x02,0x26, +0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xe6,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x22,0x23,0x10,0x14,0x25,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x6c,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x87,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x30, +0x1a,0x16,0x10,0x0a,0x25,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0e,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xb8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf9,0x40,0x09,0x1a,0x16,0x10,0x0a,0x25,0x01,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x06,0xe2,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x31,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x32,0x19,0x1f,0x10,0x0a,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x05,0x85,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07, +0x00,0xdb,0x01,0x84,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1d,0x19,0x1f,0x10,0x0a,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0x8b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfe,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x12,0x0d,0x0c,0x02,0x03,0x25,0x01, +0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x2f,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfa,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x16,0x1c,0x1d,0x19,0x13,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4, +0x07,0x1c,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xf3,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x02,0x03,0x3e,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xf5,0x00,0x00,0x00,0x16, +0xb9,0x00,0x02,0x01,0x1f,0x40,0x09,0x1a,0x1a,0x19,0x13,0x3e,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe2,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x57,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x0f,0x15,0x02,0x03,0x3e,0x01,0x0c,0x05,0x26, +0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x85,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x71,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x08,0x1a,0x1a,0x0f,0x0f,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x6c,0x02,0x26, +0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x95,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x1d,0x1e,0x1a,0x10,0x0a,0x3e,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0e,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xd1,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0d, +0x2a,0x26,0x20,0x17,0x3e,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x06,0xe2,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x4f,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x2f,0x1d,0x23,0x10,0x0a,0x3e,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0x85,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x70,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x26,0x26,0x13,0x13,0x3e,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0x85,0x04,0xec,0x05,0xb2,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x01,0x9c, +0x01,0x79,0x00,0x00,0x00,0x0b,0xb6,0x01,0x3f,0x1c,0x1a,0x05,0x19,0x25,0x01,0x2b,0x35,0x00,0x00,0x03,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0xc6,0x00,0x18,0x00,0x25,0x00,0x29,0x00,0xbc,0xb6,0x24,0x18,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe0,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x28,0x26,0x26,0x19,0x10,0x28,0x80,0x26,0x13,0x05,0xb8, +0xff,0xc0,0x40,0x31,0x0b,0x0f,0x48,0x05,0x05,0x07,0x95,0x02,0x1c,0x0a,0x23,0x95,0x0d,0x16,0x17,0x0f,0x15,0x1d,0x95,0x13,0x10,0x04,0x15,0x19,0x16,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x09,0x05,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf0, +0x40,0x2b,0x0b,0x06,0x4d,0x09,0x09,0x2b,0x04,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d,0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x10,0x10,0x0d,0x06,0x4d,0x10,0x0e,0x0c,0x06,0x4d,0x10,0x1a,0x0b,0x06,0x4d,0x10,0x2f,0x2b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b, +0x2b,0x17,0x33,0x2f,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x2f,0x2b,0x10,0xde,0x1a,0xcd,0x11,0x12,0x01,0x39,0x2f,0xcd,0x31,0x30,0x00,0x2b,0x2b,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06, +0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x13,0x33,0x03,0x04,0x10,0xfd,0xe4,0xc1,0x8b,0xae,0x9c,0x01,0x7a,0x04,0x74,0xec,0xbe,0xea,0xfb,0xda,0xd1,0x62,0x04,0xa4,0xa4,0xa4,0x7c,0x9a,0xaa,0xa6,0x87,0x8b,0xac,0xfe,0x6b,0xa6,0x7b,0x75,0x52,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x13,0xe4,0x01,0x05,0x01,0x34,0xa6,0x8e, +0xfd,0xcf,0x97,0x79,0xaf,0xde,0xc6,0xaa,0xce,0xc3,0x03,0x8d,0x01,0x04,0xfe,0xfc,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x07,0x6a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x5e,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x10,0x0c,0x06,0x0b,0x3e,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0xbb,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x00,0x01,0xad,0x00,0x16,0xb9,0x00,0x01,0xff,0xf3,0x40,0x09,0x17,0x18,0x04,0x0f,0x3e,0x01,0x16,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x92,0x05,0x9a,0x00,0x13,0x00,0x17,0x00,0xa0, +0x40,0x5d,0x06,0x09,0x0d,0x17,0x04,0x13,0x10,0x10,0x13,0x91,0x59,0x10,0x10,0x0f,0x16,0x16,0x02,0x91,0x59,0x16,0x0f,0x00,0x16,0x91,0x2b,0x30,0x0b,0x0f,0x03,0x04,0x00,0x12,0x0d,0x10,0x16,0x03,0x00,0x01,0x12,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01,0x12,0x0d,0x06,0x4d, +0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x19,0x09,0x0c,0x14,0x03,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7e,0x07,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b, +0x2b,0x2b,0xca,0x2f,0x11,0x12,0x17,0x39,0x00,0x3f,0xc4,0x3f,0xc4,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x21,0x15,0x21,0x35,0x04,0xf2,0xa8,0xfd,0x1a,0xa8,0xa0,0xa0, +0xa8,0x02,0xe6,0xa8,0xa0,0xa0,0xfc,0x72,0x02,0xe6,0x02,0x8e,0xfd,0x72,0x04,0x04,0x98,0xfe,0xfe,0xfe,0xfe,0x98,0xdf,0xdf,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x1a,0x00,0xbd,0x40,0x40,0x00,0x19,0x01,0x03,0x02,0x18,0x01,0x10,0x04,0x0d,0x0a,0x13,0x10,0x10,0x13,0x96,0x59,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03, +0x09,0x03,0x10,0x10,0x0f,0x17,0x15,0x04,0x17,0x04,0x95,0x59,0x17,0x10,0x0f,0x00,0x08,0x00,0x15,0x12,0x12,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d, +0x01,0x01,0x1c,0x0d,0x10,0x13,0x03,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x0b,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x1c,0x01,0x5d,0x2f,0x2b,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b, +0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0xc4,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8, +0xa4,0xee,0x78,0xa4,0xa4,0x88,0x88,0xa4,0x01,0x4c,0xfe,0xb4,0x04,0x78,0xd8,0xa8,0xb2,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0xa4,0xc2,0xd6,0xcb,0xff,0xff,0xff,0xd0,0x00,0x00,0x02,0x51,0x07,0x0c,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xad,0x01,0x5a,0x00,0x13,0x40,0x0b, +0x01,0x00,0x0e,0x04,0x02,0x03,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xad,0x00,0x00,0x02,0x2e,0x05,0xb2,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xd8,0x8a,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0e,0x04,0x02,0x03,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0x13,0x00,0x00,0x02,0x0f,0x06,0x8b,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xd5,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xef,0x00,0x00,0x01,0xeb,0x05,0x2f,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06, +0x00,0xd9,0xb1,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x23,0x07,0x1a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xda,0xff,0xd9,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01, +0x07,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdb,0x00,0x00,0x02,0x00,0x05,0xbe,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xda,0xb6,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0a,0x04,0x02,0x03,0x25,0x01,0x07,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x50,0xfe,0x70,0x01,0x64, +0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x06,0x00,0xdf,0x12,0x00,0x00,0x0b,0xb6,0x01,0x00,0x04,0x04,0x00,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x37,0xfe,0x70,0x01,0x66,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x06,0x00,0xdf,0xf9,0x00,0x00,0x0b,0xb6,0x02,0x00,0x1e,0x10,0x0e,0x0f,0x25,0x01,0x2b,0x35,0x00, +0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0xf2,0x07,0x6a,0x02,0x26,0x00,0x2d,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x62,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x13,0x0b,0x0c,0x3e,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x02,0x0f,0x06,0x0e,0x02,0x26,0x06,0xac,0x00,0x00,0x01,0x07, +0x00,0xd7,0xff,0x7f,0x00,0x00,0x00,0x08,0xb3,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x85,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xea,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x14,0x11,0x06,0x01,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0x85,0x03,0xf8,0x05,0xec, +0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0x87,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x10,0x0d,0x04,0x01,0x3e,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x0c,0x00,0x66,0x40,0x45,0x7a,0x0c,0x01,0x77,0x0b,0x01,0x79,0x02,0x01,0x7d,0x0a,0x01,0x7e,0x01,0x01,0x36,0x0c,0x01,0x2a,0x01, +0x01,0x36,0x00,0x01,0x05,0x15,0x06,0x0f,0x0a,0x0b,0x0b,0x01,0x70,0x00,0x01,0x00,0x14,0x0b,0x06,0x4d,0x00,0x0c,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0x2f,0x0e,0x01,0x5d,0x2f,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x5d,0x33,0x33,0x2f, +0x33,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x04,0x00,0xfe,0x2b,0x01,0xd5,0xfe,0x12,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x03,0xa4, +0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0x96,0x00,0x00,0xff,0xff,0x00,0x27,0xfe,0x85,0x01,0x4a,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x01,0x9c,0xff,0x4c,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x01,0x9c,0x01,0x6a,0x00,0x00, +0x00,0x0e,0xb9,0x00,0x01,0xff,0xea,0xb4,0x16,0x14,0x08,0x01,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x85,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xb9,0x00,0x00,0x00,0x0b,0xb6,0x01,0x10,0x16,0x13,0x08,0x01,0x3e,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x5a,0x05,0x40,0x05,0x9a, +0x00,0x1b,0x00,0xb8,0xb5,0x02,0x09,0x01,0x10,0x04,0x0c,0xb8,0xff,0xc0,0xb3,0x10,0x00,0x4d,0x0c,0xb8,0xff,0xe8,0x40,0x3d,0x0c,0x00,0x4d,0x02,0x20,0x10,0x00,0x4d,0x17,0x19,0x14,0x19,0x91,0x59,0x14,0x02,0x0c,0x1b,0x10,0x08,0x03,0x1b,0x07,0x12,0x16,0x16,0x12,0x1b,0x1b,0x0c,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d, +0x12,0x08,0x0b,0x06,0x4d,0x12,0x7e,0x7f,0x0f,0x01,0x0f,0x18,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x1a,0x0b,0x06,0x4d,0x0f,0x0f,0x1d,0x09,0x03,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0x40, +0x09,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x39,0x33,0x2f,0x10,0xc0,0x2f,0x00,0x3f,0xc4,0x3f,0xc4,0x12,0x39,0x39,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x26,0x27,0x23, +0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x01,0x90,0x16,0x18,0x06,0x08,0xa8,0xda,0x02,0xce,0x02,0x38,0x04,0x0a,0xa8,0xfe,0x93,0x4c,0x3d,0x4e,0x3f,0xbd,0x04,0x77,0x20,0x3a,0x35,0x90,0xfb,0xf4,0x05,0x9a,0xfb,0xd6,0x02,0x66,0x48,0x94,0x03,0xb6, +0xfa,0xa6,0xfe,0x1a,0x1f,0xa5,0x2c,0x01,0x0e,0x00,0x00,0x01,0x00,0xa6,0xfe,0x5a,0x03,0xf8,0x04,0x18,0x00,0x19,0x00,0x9c,0x40,0x2b,0x00,0x18,0x01,0x10,0x03,0x05,0x07,0x02,0x07,0x91,0x59,0x02,0x14,0x0c,0x17,0x0c,0x95,0x59,0x17,0x10,0x12,0x0f,0x11,0x15,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b, +0x06,0x4d,0x00,0x84,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x09,0x09,0x1b,0x13,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x84,0x11,0x02,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x11, +0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x11,0x2f,0x1b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc4,0x00,0x3f,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10, +0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xfe,0x9a,0x4c,0x3e,0x4e,0x40,0xbe,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x75,0xdb,0x01,0x5a,0x1a,0xfe,0x40,0x1f,0xa5,0x2c,0x01,0x0e,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xfe,0x5a,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa, +0x06,0x8b,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xce,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x06,0x1a,0x1b,0x03,0x09,0x3e,0x02,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x2f,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x26,0x00,0x00,0x00,0x13, +0x40,0x0b,0x02,0x0a,0x1a,0x1b,0x03,0x09,0x3e,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x1c,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xd7,0x01,0x5e,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x1b,0x0c,0x0c,0x3e,0x02,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b, +0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xbe,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x35,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x21,0x21,0x06,0x06,0x3e,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00, +0x00,0x07,0x01,0x9c,0x00,0xe4,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x85,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x06,0x01,0x9c,0x19,0x00,0x00,0x0b,0xb6,0x01,0x1f,0x14,0x14,0x06,0x06,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xd7, +0x00,0xb1,0x01,0x5c,0x00,0x08,0xb3,0x01,0x3a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0e,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x06,0x00,0xd7,0x37,0x00,0x00,0x08,0xb3,0x01,0x30,0x11,0x26,0x00,0x2b,0x35,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x0f,0x00,0xa3,0x40,0x1a,0x0b,0x08, +0x05,0x02,0x02,0x05,0x91,0x59,0x02,0x0f,0x06,0x02,0x91,0x2b,0x30,0x0c,0x00,0x0f,0x00,0x91,0x59,0x0f,0x03,0x06,0x12,0x0d,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x2f,0x0b,0x06,0x4d,0x04,0x0e,0x06,0x07,0x09,0x42,0x09,0x07,0x00,0x0e,0x06,0x07,0x0d,0x42,0x2f,0x0d,0x3f,0x0d,0xcf,0x0d,0x03,0x0d,0x0d,0x10, +0x0b,0x02,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x7e,0x07,0x04,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x11,0x40,0x0c,0x00,0x4d,0x11,0xb8,0xff,0xc0,0xb2,0x0b,0x00,0x4d,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x5d,0x2b,0x01, +0x10,0xe0,0x18,0x10,0xc6,0x2b,0x01,0x10,0xe2,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xf6,0xf6,0xa8,0xf9,0xf9,0xfe,0x63,0x03,0xe3,0x05,0x02,0xfe,0x1a, +0x9b,0xfd,0x7f,0x02,0x81,0x9b,0x01,0xe6,0x98,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81,0x05,0x2f,0x00,0x1e,0x00,0x93,0x40,0x45,0x0b,0x18,0x0b,0x0c,0x00,0x4c,0x1d,0x01,0x0d,0x10,0x10,0x0d,0x96,0x59,0x10,0x18,0x14,0x40,0x1c,0x19,0x11,0x14,0x14,0x11,0x95,0x59,0x14,0x0f,0x07,0x05,0x0a,0x05,0x95,0x59,0x0a,0x16,0x07,0x1e, +0x2f,0x1b,0x01,0x1b,0x1b,0x02,0x0e,0x12,0x10,0x14,0x19,0x1d,0x04,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x0c,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xee,0xb6,0x0b,0x06,0x4d,0x0c,0x0c,0x20,0x1f,0x11,0x12,0x39,0x2f,0x2b,0x2b, +0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0xdc,0xc6,0x10,0xc0,0x2f,0x5d,0xc6,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0xc6,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x23,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33, +0x35,0x36,0x37,0x37,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x77,0xf8,0x45,0x52,0x3c,0x2f,0x3a,0x5f,0xfe,0xf3,0xa3,0xa3,0xb0,0xb0,0x04,0x4e,0x52,0x01,0x02,0xfe,0xfe,0xf8,0x02,0x23,0xf0,0x67,0x58,0x22,0x8c,0x20,0x01,0x2c,0x01,0x0d,0x85,0xcc,0x8c,0xfa,0x02,0x19,0x1a,0xfe,0xd1,0x8c,0xcc,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5, +0x07,0x0e,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x5f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x03,0x18,0x0e,0x05,0x0d,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd6,0x00,0x00,0x00,0x13, +0x40,0x0b,0x01,0x00,0x1c,0x12,0x08,0x11,0x25,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x06,0x8b,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x81,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x0d,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b, +0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0x2f,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xf9,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x14,0x15,0x08,0x11,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x1a,0x02,0x26,0x00,0x38, +0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x84,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x14,0x0e,0x05,0x0d,0x25,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xbe,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xfd,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff, +0xfb,0x40,0x09,0x18,0x12,0x08,0x11,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xfe,0x70,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x10,0x00,0x00,0xff,0xff,0x00,0x90,0xfe,0x70,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x90, +0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x6a,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0xd7,0x02,0x5b,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x1e,0x13,0x14,0x25,0x01,0x20,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0e,0x02,0x26,0x00,0x5a,0x00,0x00, +0x01,0x07,0x00,0xd7,0x01,0x80,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfb,0x40,0x09,0x1e,0x1e,0x13,0x14,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x69,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xc5,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x00,0x13,0x14, +0x05,0x00,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0e,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x10,0x1a,0x1b,0x0c,0x00,0x25,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xa6, +0x00,0x00,0x02,0x62,0x06,0x02,0x00,0x0c,0x00,0x39,0x40,0x23,0x00,0x02,0x0a,0x02,0x95,0x59,0x0a,0x01,0x05,0x15,0x2f,0x00,0x01,0x00,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x84,0x06,0x06,0x0e,0x0d,0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0xc4,0x5d,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10, +0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x62,0x2e,0x3e,0xac,0xa4,0xbd,0x89,0x4a,0x2c,0x05,0x5c,0x1b,0xd9,0xfb,0x62,0x04,0xa6,0xa1,0xbb,0x12,0x00,0x00,0x04,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x52,0x00,0x10,0x00,0x1b,0x00,0x23,0x00,0x27,0x00,0xfe,0x40,0x39,0x78,0x27,0x01,0x76, +0x22,0x01,0x79,0x1d,0x01,0x74,0x0c,0x01,0x7b,0x0a,0x01,0x7b,0x07,0x01,0x77,0x06,0x01,0x02,0x08,0x0c,0x00,0x4d,0x1c,0x02,0x01,0x20,0x01,0x23,0x03,0x04,0x20,0x04,0x73,0x04,0x01,0x7c,0x01,0x01,0x20,0x30,0x0c,0x00,0x4d,0x00,0x16,0x01,0x90,0x27,0x01,0xa0,0x27,0x01,0x27,0xb8,0xff,0xc0,0xb3,0x1d,0x21,0x48,0x27,0xb8,0xff,0xc0, +0x40,0x39,0x16,0x19,0x48,0x27,0xa0,0x26,0xd0,0x26,0xe0,0x26,0x03,0x10,0x26,0x20,0x26,0x30,0x26,0x80,0x26,0x90,0x26,0x05,0x26,0x0b,0x02,0x91,0x1c,0x1c,0x16,0x00,0x11,0xc5,0x0b,0x10,0x06,0x40,0x16,0x03,0x04,0x00,0x12,0x24,0x80,0x26,0x26,0x14,0x19,0xc4,0x0e,0x40,0x09,0x0c,0x48,0x0e,0x14,0xc4,0x08,0xb8,0xff,0xc0,0xb5,0x0c, +0x00,0x4d,0x08,0x08,0x06,0xb8,0xff,0xf8,0x40,0x15,0x0c,0x00,0x4d,0x10,0x08,0x0c,0x00,0x4d,0x1c,0x23,0x06,0x10,0x04,0x05,0x77,0x05,0x01,0x79,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0c,0x0c,0x00,0x4d,0x00,0x18,0x0c,0x00,0x4d,0x00,0x00,0x29,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x2b,0x2b,0x39,0x2f,0x2b, +0xe9,0xd4,0x2b,0xe9,0x10,0xc0,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0x3f,0x1a,0xcd,0x39,0xd4,0xed,0x11,0x12,0x39,0x2f,0xed,0x10,0xd6,0x5d,0x72,0xcd,0x2b,0x2b,0x71,0x72,0x5d,0x2b,0x31,0x30,0x01,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x26, +0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x01,0x01,0x23,0x13,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x11,0x65,0x78,0x5c,0x58,0x70,0x60,0x6e,0x32,0x40,0x72,0x30,0x42,0x42,0xc9,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x02, +0x04,0xfe,0xfa,0x7f,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x62,0x34,0x70,0x59,0x6e,0x6d,0x54,0x70,0x36,0x01,0x15,0x3f,0x30,0x72,0x42,0x30,0x31,0x3e,0xfb,0xae,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x06,0x29,0xfe,0xb8,0x01,0x48,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x07,0x66,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xdc, +0x00,0xe9,0xff,0xc2,0x01,0x07,0x00,0x8e,0x01,0x0c,0x01,0x5c,0x00,0x33,0x40,0x25,0x04,0x0f,0x39,0x1f,0x39,0x3f,0x39,0x5f,0x39,0x90,0x39,0x05,0x20,0x39,0x5f,0x39,0x02,0x39,0x26,0x03,0x02,0x20,0x40,0x11,0x15,0x48,0x0f,0x20,0x01,0x10,0x20,0x4f,0x20,0xef,0x20,0x03,0x20,0x00,0x11,0x5d,0x71,0x2b,0x35,0x35,0x10,0xde,0x5d,0x5d, +0x34,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x07,0x66,0x02,0x26,0x00,0x91,0x00,0x00,0x01,0x07,0x00,0x8e,0x03,0x30,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x17,0x16,0x15,0x11,0x09,0x25,0x02,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x06,0x56,0x06,0x0a,0x02,0x26,0x00,0xa0,0x00,0x00, +0x01,0x07,0x00,0x8e,0x02,0x55,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x11,0x37,0x37,0x1e,0x1e,0x25,0x03,0x38,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xcd,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x92,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xfa,0x01,0x5c,0x00,0x13,0x40,0x0b,0x03,0x20,0x25,0x27,0x16,0x08, +0x25,0x03,0x26,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x31,0xff,0xae,0x04,0x96,0x06,0x0a,0x02,0x26,0x00,0xa1,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x58,0x00,0x00,0x00,0x16,0xb9,0x00,0x03,0xff,0xf9,0x40,0x09,0x25,0x25,0x16,0x10,0x3e,0x03,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x70, +0x01,0xfe,0x01,0x50,0x02,0xdf,0x00,0x0b,0x00,0x15,0x40,0x0b,0x06,0x00,0xb0,0x5b,0x06,0x09,0xaf,0x03,0x2f,0x0d,0x01,0x5d,0x2f,0xe1,0x00,0x2f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x01,0xfe,0x42,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x42,0x00,0xff,0xff, +0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x66,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x43,0x02,0xa0,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1f,0x1d,0x13,0x14,0x25,0x01,0x1d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0a,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07, +0x00,0x43,0x01,0xb5,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe7,0x40,0x09,0x1f,0x1d,0x13,0x14,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x66,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x96,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x5f,0x1d,0x01,0x00,0x1d, +0x1f,0x13,0x14,0x25,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0a,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x1d,0x1f,0x13,0x14,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x1a,0x00,0x00,0x07,0x60,0x06,0xe4,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x8f,0x02,0x1c,0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf1,0x40,0x0a,0x31,0x1f,0x13,0x14,0x25,0x02,0x01,0x28,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x05,0x87,0x02,0x26,0x00,0x5a, +0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x44,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xef,0x40,0x0a,0x31,0x1f,0x13,0x14,0x25,0x02,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x66,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xf6,0x01,0x5c,0x00,0x1a, +0xb3,0x01,0x00,0x11,0x01,0xb8,0xff,0xe6,0x40,0x09,0x11,0x0f,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x5d,0x35,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0a,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0x9e,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd6,0x40,0x09,0x18,0x16,0x0c,0x00,0x25, +0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x1c,0x40,0x10,0x00,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0x10,0x02,0x50,0x02,0x60,0x02,0x03,0x02,0x2f,0x5d,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x23,0x03,0x33,0x01,0x70,0x74,0x8e,0x94,0x03,0xf4,0x01, +0xbe,0x00,0x00,0x01,0x00,0x00,0x05,0x74,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x10,0xb7,0x02,0x01,0xd9,0x59,0x02,0x00,0x03,0x02,0x2f,0x2f,0x00,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0x00,0x01,0x00,0x6a,0x00,0x00,0x03,0xee,0x05,0xb2,0x00,0x23,0x00,0x92,0x40,0x57,0x01,0x02, +0x22,0x03,0x0b,0x0e,0x0e,0x0b,0x9a,0x59,0x00,0x0e,0x10,0x0e,0x20,0x0e,0x03,0x09,0x03,0x0e,0x12,0x40,0x21,0x1e,0x0f,0x12,0x12,0x0f,0x9a,0x59,0x0f,0x12,0x1f,0x12,0x02,0x09,0x03,0x12,0x12,0x16,0x06,0x19,0x1b,0x16,0x1b,0x9a,0x59,0x16,0x04,0x06,0x05,0x9a,0x59,0x06,0x12,0x00,0x1f,0x4f,0x18,0x01,0x18,0x06,0x06,0x25,0x0f,0x12, +0x1e,0x21,0x04,0x01,0x08,0x0c,0x06,0x4d,0x01,0x8a,0x04,0x08,0x0b,0x10,0x0c,0x0b,0x10,0x0c,0x06,0x4d,0x0b,0x2f,0x2b,0xdd,0xc4,0x10,0xc6,0x32,0xe1,0x2b,0x17,0x39,0x12,0x39,0x2f,0xd4,0x5d,0xd4,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a, +0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x01,0x21,0x15,0x14,0x07,0x21,0x15,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x21,0x03,0x10,0xfe,0xd8,0xc1,0x02,0xc7,0xfc,0x7c,0xda,0xc5,0xc5,0xc5,0xc5, +0xda,0xad,0x76,0x5f,0x63,0x70,0xe5,0x01,0x28,0xfe,0xd8,0x01,0x28,0x01,0xe8,0x09,0xf3,0x60,0x8c,0x87,0x47,0xf2,0x28,0x8c,0x88,0x8d,0x7d,0xbc,0xf0,0x29,0x9b,0x39,0xfe,0xcd,0x6b,0x8d,0x88,0x00,0x00,0x02,0x00,0x55,0xff,0xdd,0x04,0x78,0x04,0x48,0x00,0x12,0x00,0x19,0x00,0x53,0x40,0x2e,0x00,0x06,0x10,0x06,0x02,0x09,0x03,0x06, +0x06,0x00,0x04,0x13,0x00,0xc3,0x59,0x13,0x13,0x10,0x04,0x10,0x16,0xc3,0x59,0x10,0x0a,0x04,0xc3,0x59,0x0a,0x19,0x07,0x40,0x10,0x1e,0x48,0x07,0x07,0x00,0xaf,0x13,0x13,0x1b,0x19,0x01,0xaf,0x0d,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12, +0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x01,0x21,0x13,0x16,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x07,0x11,0x26,0x23,0x22,0x07,0x11,0x04,0x78,0xfc,0xc4,0x01,0x78,0xb0,0xff,0x8c,0x48,0x68,0xdb,0x8f,0xee,0xfe,0xdd,0x01,0x29,0xe4,0xd8,0x01,0x30,0xda,0x82,0xad,0xaf,0x76,0x02,0x12, +0xfe,0x8e,0x79,0xf5,0x2a,0x98,0x7d,0x01,0x43,0xf2,0xfe,0x01,0x38,0xfe,0xe4,0xd0,0x01,0x29,0x7b,0x7b,0xfe,0xd7,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xe2,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x35,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x30,0x2d,0x00,0x3f, +0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x07,0x2a,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x07,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x7d,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x44,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x8c,0xff,0xec,0x07,0x2c,0x05,0x9e,0x00,0x26,0x02,0x39, +0x11,0x00,0x00,0x27,0x00,0xbc,0x03,0x09,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x7f,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x48,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xa2,0xff,0xec,0x06,0xa5,0x05,0xa4,0x00,0x26,0x02,0x3a,0x55,0x00,0x00,0x27,0x00,0xbc,0x02,0x82,0x00,0x00,0x01,0x07,0x02,0x3b,0x03,0xf8,0xfd,0xb8, +0x00,0x0b,0xb4,0x04,0x03,0x02,0x2e,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0x00,0x01,0x00,0xdb,0xfe,0x85,0x01,0xfc,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0xfc,0xa6,0x7b,0x75,0x77,0xfe,0xfc,0x01, +0x04,0x00,0x00,0x01,0x00,0xdb,0xfe,0x85,0x01,0xfc,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0xfc,0xa6,0x7b,0x75,0x77,0xfe,0xfc,0x01,0x04,0x00,0xff,0xff,0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16, +0x02,0x06,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0xce,0x04,0x96,0x01,0xdb,0x06,0x01,0x00,0x03,0x00,0x0f,0xb5,0x01,0x00,0x01,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0xdb,0xaf,0x5e,0x66,0x06,0x01,0xfe,0x95,0x01,0x6b,0x00,0x03,0xff,0xda,0x04,0xa4,0x02,0x84,0x06,0x0f,0x00,0x03,0x00,0x0f, +0x00,0x1b,0x00,0x2a,0x40,0x14,0x0a,0x04,0x16,0xc1,0x40,0x10,0x03,0x01,0x0d,0xc0,0x07,0x07,0x00,0x13,0xc0,0x19,0x19,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x33,0x2f,0xe1,0x11,0x33,0x2f,0xe1,0x00,0x2f,0xcd,0xd4,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22, +0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xd6,0xaf,0x5d,0x65,0xf2,0x28,0x39,0x39,0x27,0x2a,0x3a,0x3a,0xfd,0xf2,0x28,0x3a,0x3a,0x28,0x29,0x3b,0x3a,0x06,0x0f,0xfe,0x95,0x01,0x6b,0xfe,0xb9,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12, +0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x01,0x9f,0xff,0x5f,0xff,0x99,0x00,0x12,0x40,0x0a,0x02,0x13,0x03,0x02,0x17,0x12,0x12,0x05,0x05,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc5,0x00,0x00,0x04,0x36,0x05,0x9a,0x00,0x27,0x00,0x28,0x00,0x82,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf7,0xff,0x99,0x00,0x14, +0xb3,0x01,0x0f,0x03,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x02,0x02,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc5,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf7,0xff,0x99,0x00,0x14,0xb3,0x01,0x0f,0x03,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x06,0x06,0x3e,0x01,0x2b, +0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc6,0x00,0x00,0x02,0x4a,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xe6,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf8,0xff,0x99,0x00,0x07,0xb2,0x01,0x07,0x03,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xd1,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x01,0x9f,0xff,0x03,0xff,0x99, +0x00,0x12,0x40,0x0a,0x02,0x1b,0x03,0x02,0x1a,0x18,0x18,0x03,0x03,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xb3,0x00,0x00,0x05,0x48,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe8,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xe5,0xff,0x99,0x00,0x14,0xb3,0x01,0x11,0x03,0x01,0xb8,0xff,0xc6,0xb4,0x0e,0x0e,0x05,0x05,0x3e,0x01,0x2b, +0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xd1,0x00,0x00,0x06,0x3b,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x92,0x00,0x00,0x01,0x07,0x01,0x9f,0xff,0x03,0xff,0x99,0x00,0x14,0xb3,0x01,0x1f,0x03,0x01,0xb8,0xff,0xe8,0xb4,0x1c,0x1c,0x12,0x12,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5c,0x06,0x0f,0x02,0x26, +0x01,0xc9,0x00,0x00,0x01,0x06,0x01,0xa0,0xd8,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0b,0x0e,0x0e,0x05,0x05,0x3e,0x03,0x02,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00, +0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06,0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x02,0x06,0x00,0x3d,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00, +0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x04,0xef,0x05,0x9a,0x00,0x0b,0x00,0x5f,0x40,0x18,0x77,0x09,0x01,0x71,0x08,0x01,0x76,0x07,0x01,0x79,0x02,0x01,0x7e,0x01,0x01,0x78,0x00,0x01,0x0a,0x08,0x0c,0x00, +0x4d,0x07,0xb8,0xff,0xf0,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x02,0x10,0x0b,0x0c,0x00,0x4c,0x0b,0xb8,0xff,0xf8,0x40,0x0e,0x0c,0x00,0x4d,0x0b,0x03,0x00,0x12,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe8,0xb7,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x0d,0x09,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x01,0x2b,0x2b,0x2b, +0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x04,0xef,0xbb,0xfe,0x6c,0x10,0x0c,0x04,0x0a,0x14,0xfe,0x6a,0xb4,0x02,0x0e,0xbe,0x04,0x7e,0x2f,0x47,0x3e,0x39,0xfb,0x83,0x05,0x9a,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff, +0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x00,0x31,0x00,0x00,0x00,0x03,0x00,0x3a,0x00,0x00,0x03,0xdb,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x52,0x40,0x32,0x06,0x05,0x91,0x59,0x06,0x02,0x09,0x06,0x91,0x2b,0x30,0x02,0x01,0xee,0x59,0x02,0x03,0x09,0x0a,0xee,0x59,0x09,0x12,0x0f,0x04,0x5f,0x04,0x02,0x0b,0x03, +0x09,0x08,0x05,0x04,0xff,0x3a,0x30,0x01,0x70,0x01,0x02,0x00,0x01,0x00,0x01,0x0a,0x08,0x08,0x0d,0x09,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x21,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0xc0, +0xfc,0x94,0x03,0x6c,0x8a,0xfd,0xa9,0x02,0x57,0xa5,0xfc,0x5f,0x03,0xa1,0x04,0xfa,0xa0,0xfc,0xee,0x99,0xfc,0xdf,0xa2,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xfc,0x05,0x9a,0x00,0x07,0x00,0x6f,0x40,0x3c,0x07,0x02,0x91,0x59,0x07,0x03,0x04,0x00, +0x12,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x09,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3, +0x0c,0x06,0x4d,0x05,0xb8,0xff,0xfe,0xb3,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x04,0xfc,0xaa,0xfd,0x13,0xa9,0x04,0x40,0x04,0xfe,0xfb,0x02,0x05,0x9a,0x00,0xff,0xff,0x00,0xbc, +0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x00,0x03,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x5e,0x40,0x0c,0x05,0x0a,0x01,0x04,0x08,0x01,0x0c,0x03,0x01,0x10,0x03,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x08,0xb8,0xff,0xe8,0x40,0x22,0x0c,0x00,0x4d,0x03,0x18,0x0c,0x00,0x4d,0x04,0x07,0x06, +0x06,0x07,0x91,0x59,0x06,0x03,0x02,0x00,0x0b,0x00,0x0b,0x91,0x59,0x00,0x12,0x07,0x00,0x00,0x0d,0x08,0x04,0x0a,0x02,0x2f,0x33,0xc6,0x32,0x12,0x39,0x2f,0xc4,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15, +0x21,0x01,0x01,0x21,0x03,0xf0,0xfc,0x3e,0x01,0xd1,0xfe,0x59,0x03,0x5a,0xfd,0x9b,0x01,0x7b,0xfe,0x5c,0x02,0xcc,0x4e,0x02,0x94,0x02,0x5e,0x5a,0x9b,0xfd,0xe9,0xfd,0xac,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c, +0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x88,0x00,0x00,0x05,0xae,0x05,0x9a,0x00,0x19,0x00,0xca,0xb9,0x00,0x16,0xff,0xc0,0xb3,0x0c,0x00,0x4d,0x03,0xb8,0xff,0xc0,0x40,0x1a,0x0c,0x00,0x4d,0x18,0x0e,0x0b,0x01,0x0b,0x01,0x91,0x59,0x0b,0x0b,0x0c,0x14,0x00,0x06, +0x03,0x0c,0x12,0x07,0x08,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x04,0x7e,0x07,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xf4,0x40,0x40,0x0b,0x06,0x4d,0x07,0x0e,0x0c,0x0d,0x12,0x42,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d, +0x15,0x7e,0x12,0x0d,0x0c,0x06,0x4d,0x12,0x08,0x0d,0x06,0x4d,0x12,0x0d,0x0b,0x06,0x4d,0x12,0x12,0x1a,0x18,0x01,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x0d,0xb8,0xff,0xfb,0x40,0x0a,0x0b,0x06,0x4d,0x0d,0x0d,0x1b,0x1a,0x4f,0x1b,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b, +0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x2b,0x01,0x11,0x33,0x20,0x11,0x11,0x33,0x11,0x14,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x00,0x35,0x11,0x33,0x11, +0x10,0x21,0x33,0x11,0x03,0x68,0x39,0x01,0x6a,0xa3,0xfe,0xe2,0xef,0x39,0x9b,0x39,0xf0,0xfe,0xe4,0xa2,0x01,0x6a,0x39,0x05,0x9a,0xfc,0x80,0x01,0x6e,0x02,0x12,0xfd,0xee,0xe3,0xfe,0xe1,0xfe,0x7a,0x01,0x86,0x01,0x1f,0xe3,0x02,0x12,0xfd,0xee,0xfe,0x92,0x03,0x80,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x05,0xa9,0x05,0xb2,0x02,0x06, +0x00,0x9f,0x00,0x00,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2, +0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x95,0x01,0x5b,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0a,0x1d,0x17,0x05,0x00,0x25,0x02,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x01,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x41, +0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0e,0x29,0x27,0x0a,0x13,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x01,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x01,0x9f,0x00,0xe6,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x77,0x28,0x26,0x0c,0x11,0x25,0x01,0x28,0x11,0x26,0x00, +0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x01,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x44,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x4b,0x17,0x15,0x07,0x02,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xff,0xf4,0x02,0x08,0x06,0x01,0x02,0x26, +0x01,0xc9,0x00,0x00,0x01,0x06,0x01,0x9f,0xe1,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe7,0x40,0x09,0x0e,0x0d,0x05,0x06,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0f,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x01,0xa0,0x01,0x07,0x00,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01, +0xb8,0xff,0xd8,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0x02,0x00,0xa7,0xfe,0x1f,0x04,0x15,0x05,0xfc,0x00,0x14,0x00,0x25,0x00,0xc7,0xb5,0x02,0x1c,0x01,0x10,0x04,0x0f,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x07,0xb8,0xff,0xe8,0x40,0x3e,0x0b, +0x00,0x4d,0x0d,0x15,0x16,0x16,0x15,0x96,0x59,0x16,0x16,0x06,0x13,0x06,0x1b,0x95,0x59,0x06,0x01,0x00,0x1f,0x21,0x13,0x21,0x95,0x59,0x13,0x16,0x01,0x1c,0x0c,0x15,0x15,0x01,0x09,0x08,0x0c,0x06,0x4d,0x19,0x84,0x09,0x09,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x83,0x24,0xb8,0xff,0xf0, +0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x24,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x24,0x24,0x27,0x1f,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x02,0xb8,0xff,0xfa,0x40,0x09,0x0c,0x06,0x4d,0x02,0x0a,0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b, +0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0xe1,0x2b,0x11,0x39,0x2f,0x39,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x25,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16, +0x16,0x15,0x14,0x06,0x23,0x22,0x13,0x35,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x11,0x16,0x33,0x32,0x36,0x35,0x10,0x01,0x49,0xa2,0xdc,0xb9,0xad,0xc7,0x99,0x7a,0xb5,0xc3,0xf2,0xc5,0x98,0x2b,0x7b,0x9f,0xd2,0x74,0x7c,0x8c,0x86,0x81,0x91,0x2e,0xfd,0xf1,0x06,0x3c,0xbf,0xe2,0xb5,0xa0,0x78,0xd1,0x27,0x04,0x1d,0xd7,0xa6,0xc1, +0xf1,0x02,0xfe,0x83,0x11,0xad,0x6d,0xdd,0x9a,0x8c,0xfc,0x80,0x57,0x95,0x86,0x01,0x2f,0x00,0x00,0x01,0x00,0x05,0xfe,0x1f,0x03,0xe6,0x04,0x00,0x00,0x18,0x00,0x95,0xb3,0x7c,0x00,0x01,0x0c,0xb8,0xff,0xc0,0x40,0x1c,0x0b,0x0c,0x00,0x4c,0x00,0x05,0x0b,0x03,0x03,0x11,0x08,0x0f,0x03,0x1c,0x11,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08, +0x0b,0x06,0x4d,0x14,0x83,0x0f,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xe8,0x40,0x20,0x0b,0x06,0x4d,0x0f,0x0f,0x1a,0x05,0x09,0x08,0x08,0x19,0x0b,0x00,0x03,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x84,0x05,0x18,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c, +0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x05,0x05,0x1a,0x19,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0xc6,0x12,0x39,0x12,0x39,0x2f,0xcd,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0xc6,0x00,0x3f,0x3f,0xc4,0x12,0x17,0x39,0x31,0x30,0x2b,0x5d,0x05,0x10,0x07,0x23,0x36,0x11,0x26,0x02,0x27,0x33,0x12, +0x13,0x33,0x36,0x12,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x02,0x06,0x07,0x02,0x37,0x04,0xaf,0x0f,0x28,0xec,0x7a,0xbc,0xf9,0x5e,0x04,0xa6,0x7d,0x0a,0xab,0x06,0x3c,0x7f,0x31,0x45,0xfe,0xc0,0x5c,0xa9,0x01,0x46,0xd7,0x02,0x59,0xc2,0xfe,0x44,0xfe,0x4b,0xf4,0x01,0x57,0xa4,0x3e,0x44,0x35,0x20,0x86,0xfe,0xfe,0xfd,0x47,0x00,0x01, +0x00,0x4c,0xfe,0xcb,0x03,0x7f,0x05,0xec,0x00,0x17,0x00,0x69,0x40,0x41,0x0f,0x10,0x01,0x0f,0x07,0x01,0x10,0x06,0x13,0x06,0x0f,0x0b,0x0e,0x0b,0x96,0x59,0x0e,0x00,0x00,0x0c,0x0c,0x08,0x0b,0x0e,0x0e,0x16,0x01,0x16,0xed,0x03,0x03,0x19,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x11,0x83,0x08, +0x18,0x0d,0x06,0x4d,0x08,0x20,0x0c,0x06,0x4d,0x08,0x18,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0xc6,0x10,0xc0,0x2f,0x32,0x12,0x39,0x2f,0x00,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x24,0x11,0x10,0x01, +0x35,0x21,0x35,0x21,0x15,0x00,0x11,0x14,0x05,0x16,0x16,0x15,0x14,0x03,0x39,0xb3,0x62,0x7d,0x8a,0xfe,0x6b,0x02,0x54,0xfe,0x4c,0x02,0x5b,0xfd,0xaf,0x01,0x20,0xd3,0x96,0xfe,0xcb,0x4f,0x4d,0x44,0x3f,0x12,0x32,0x01,0x95,0x01,0xb2,0x01,0xee,0x04,0x85,0x87,0xfd,0xfb,0xfe,0x66,0xfa,0x2f,0x23,0x8b,0x6f,0x64,0x00,0x01,0x00,0x82, +0xfe,0x6c,0x03,0xf8,0x04,0x18,0x00,0x14,0x00,0x7f,0x40,0x2a,0x02,0x13,0x01,0x02,0x13,0x01,0x10,0x04,0x10,0x04,0x12,0x04,0xec,0x59,0x12,0x10,0x0c,0x0f,0x08,0x15,0x00,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x83,0x7f,0x01,0x01,0x01,0xb8,0xff,0xfc,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff, +0xfa,0x40,0x22,0x0c,0x06,0x4d,0x01,0x01,0x16,0x0c,0x0f,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x09,0x04,0x0d,0x06,0x4d,0x09,0x2f,0x16,0x01,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x3f,0x3f,0x2b,0x11,0x00, +0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x27,0x33,0x16,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa6,0xec,0x7c,0xa1,0xa3,0x24,0xa8,0x1c,0x04,0x6f,0xe5,0x01,0x5a,0xfe,0x6c,0x03,0xd0,0x01,0x47,0xb1,0x87,0xfd,0xb5,0x02,0xb6,0xea,0x60,0x4a,0x63,0xc5,0xfe,0x5e, +0x00,0x03,0x00,0x61,0xff,0xe8,0x04,0x50,0x05,0xfe,0x00,0x0a,0x00,0x10,0x00,0x17,0x00,0xc7,0x40,0x10,0x09,0x16,0x01,0x06,0x14,0x01,0x03,0x00,0x0e,0x01,0x0f,0x0a,0x01,0x10,0x06,0x09,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x15,0xb8,0xff,0xe8,0x40,0x33,0x0b,0x0c,0x00,0x4c,0x0d,0x18,0x0c,0x00,0x4d,0x0b,0x11,0x96,0x59,0x0b,0x06, +0x00,0x0b,0x96,0x2b,0x30,0x06,0x0d,0x95,0x59,0x06,0x01,0x00,0x15,0x95,0x59,0x00,0x16,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x83,0x0b,0x11,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf0,0x40,0x30,0x0b,0x06,0x4d,0x20,0x11,0x30,0x11, +0x02,0x11,0x11,0x19,0x10,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x00, +0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x00,0x2b,0x2b,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x05,0x22,0x00,0x11,0x10,0x00,0x33,0x20,0x11,0x10,0x00,0x13,0x02,0x21,0x22,0x02,0x07,0x05,0x21,0x12,0x12,0x33,0x32,0x12,0x02,0x4e,0xe9,0xfe,0xfc,0x01,0x0f,0xfe,0x01,0xe2,0xfe,0xf3,0x63,0x12,0xfe, +0xc9,0x96,0xb4,0x0a,0x02,0x9e,0xfd,0x61,0x05,0xb2,0x9d,0x99,0xad,0x18,0x01,0x92,0x01,0x6c,0x01,0x7f,0x01,0x99,0xfd,0x01,0xfe,0x86,0xfe,0x63,0x03,0x5c,0x02,0x2e,0xfe,0xd1,0xff,0x84,0xfe,0xe1,0xfe,0xd3,0x01,0x31,0x00,0x01,0x00,0xa6,0xff,0xf4,0x02,0x08,0x04,0x00,0x00,0x0b,0x00,0x49,0x40,0x32,0x03,0x40,0x0b,0x0c,0x00,0x4c, +0x05,0x0f,0x0b,0x09,0x02,0x09,0xec,0x59,0x02,0x0b,0x0b,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x84,0x04,0x0c,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x31,0x30, +0x2b,0x25,0x06,0x23,0x22,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x08,0x3e,0x3b,0xe9,0xa3,0x65,0x2a,0x30,0x0a,0x16,0x01,0x15,0x02,0xf7,0xfd,0x0e,0x8a,0x12,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x13,0x04,0x0e,0x00,0x14,0x00,0xa1,0x40,0x15,0x09,0x03,0x01,0x0d,0x02,0x01,0x06,0x13,0x01,0x0d,0x01,0x01,0x10,0x04,0x03,0x18, +0x0b,0x0c,0x00,0x4c,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x15,0x0b,0x06,0x4d,0x14,0x02,0x11,0x03,0x03,0x00,0x06,0x0c,0x11,0xec,0x59,0x0c,0x06,0x0f,0x04,0x00,0x15,0x14,0xb8,0xff,0xe0,0x40,0x21,0x0b,0x0c,0x00,0x4c,0x14,0x02,0x02,0x00,0x0e,0x0e,0x70,0x00,0x01,0x00,0x08,0x04,0x08,0x0d,0x06,0x4d, +0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0xb8,0xff,0xfa,0x40,0x0e,0x0d,0x06,0x4d,0x05,0x06,0x0c,0x06,0x4d,0x05,0x06,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0x5d,0x33,0x2f,0x11,0x39,0x2f,0x33,0x2b,0x00,0x3f,0x33,0x3f,0xc4,0x2b,0x11,0x12,0x00,0x39,0x11,0x12,0x39,0x39, +0x31,0x30,0x01,0x2b,0x2b,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x21,0x23,0x01,0x07,0x11,0x23,0x11,0x33,0x11,0x01,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x04,0x13,0xcb,0xfe,0x8e,0x8d,0xa3,0xa3,0x01,0x13,0x75,0x71,0x2e,0x48,0x22,0x1e,0x32,0x42,0x90,0x73,0x01,0xf4,0x98,0xfe,0xa4,0x04,0x00,0xfe, +0x0e,0x01,0x38,0x85,0x43,0x07,0x91,0x08,0x9c,0x7d,0x00,0x01,0xff,0xfe,0x00,0x00,0x03,0xdf,0x05,0xee,0x00,0x10,0x00,0x5b,0x40,0x23,0x0b,0x02,0x01,0x07,0x10,0x01,0x08,0x05,0x01,0x06,0x03,0x01,0x03,0x0f,0x01,0x01,0x10,0x06,0x02,0x05,0x05,0x00,0x0d,0x0a,0x08,0x0d,0x08,0xec,0x59,0x0d,0x00,0x03,0x00,0x15,0x10,0xb8,0xff,0xe0, +0x40,0x0e,0x0c,0x00,0x4d,0x0a,0x02,0x05,0x0a,0x10,0x04,0x11,0x00,0x00,0x12,0x04,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5f,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x01,0x01,0x23,0x01,0x27,0x26,0x23,0x22,0x07,0x35,0x36, +0x33,0x32,0x16,0x17,0x03,0xdf,0xb1,0xfe,0xe9,0xfe,0x9c,0xb5,0x01,0xcf,0x43,0x35,0x67,0x36,0x44,0x40,0x42,0x70,0x8b,0x3e,0x03,0x3b,0xfc,0xc5,0x03,0xf8,0xc5,0x9b,0x13,0x9d,0x0c,0x7f,0xb2,0x00,0x00,0x01,0x00,0xa7,0xfe,0x1f,0x04,0x78,0x04,0x00,0x00,0x1d,0x00,0x9f,0x40,0x6e,0x0f,0x03,0x01,0x10,0x05,0x0e,0x18,0x0b,0x0c,0x00, +0x4c,0x01,0x18,0x0b,0x0c,0x00,0x4c,0x11,0x08,0x0f,0x04,0x00,0x0d,0x02,0x0d,0x95,0x59,0x02,0x16,0x1a,0x15,0x95,0x59,0x1a,0x16,0x07,0x1c,0x17,0x17,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x84,0x00,0x7f,0x10,0x01,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06, +0x4d,0x10,0x10,0x1f,0x07,0x0a,0x0a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0x04,0x0d,0x06,0x4d,0x07,0x40,0x1f,0x01,0x2f,0x1f,0x01,0x5d,0x5d,0x2f,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0x33,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x3f,0x3f, +0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0xc4,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x25,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x03,0x48,0x58,0xc7,0x9b,0x40,0x04,0xa3,0xa3,0x83,0x6c,0x74,0x86,0xa3,0x7a, +0x17,0x11,0x35,0x2a,0x55,0x60,0x16,0xae,0xc6,0x7c,0xfd,0xbb,0x05,0xe1,0xfd,0x90,0x7a,0x9a,0xb0,0x8c,0x02,0x48,0xfd,0x2f,0xa6,0x05,0x89,0x0d,0x58,0x5e,0x00,0x01,0x00,0x0c,0x00,0x00,0x03,0xc6,0x04,0x00,0x00,0x0c,0x00,0x6b,0x40,0x0a,0x74,0x03,0x01,0x79,0x01,0x01,0x76,0x00,0x01,0x03,0xb8,0xff,0xf8,0x40,0x0c,0x0c,0x00,0x4d, +0x03,0x09,0x0f,0x04,0x00,0x15,0x08,0x08,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x06,0x83,0x0b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x0b,0x0b,0x0e,0x03,0x08,0x0b,0x06,0x4d,0x03,0x02,0x2f,0x33,0x2b, +0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x3f,0x33,0x3f,0x33,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x33,0x01,0x00,0x11,0x34,0x27,0x33,0x16,0x15,0x10,0x02,0x48,0xa4,0xfe,0x68,0xb5,0x01,0x4f,0x01,0x10,0x22,0xb1,0x17,0x04,0x00,0xfc,0x9c,0x01,0x57,0x01,0x3b,0x7a,0x58,0x46,0x74,0xfe,0x86,0x00, +0x00,0x01,0x00,0x4d,0xfe,0xc4,0x03,0x76,0x05,0xed,0x00,0x2f,0x00,0xb3,0x40,0x28,0x0f,0x08,0x01,0x10,0x05,0x28,0x18,0x0b,0x0c,0x00,0x4c,0x0b,0x18,0x0b,0x0c,0x00,0x4c,0x0c,0x26,0x1f,0x1f,0x26,0x95,0x59,0x1f,0x1f,0x16,0x06,0x18,0x15,0x13,0x16,0x15,0x16,0x15,0x95,0x59,0x16,0x00,0x2b,0xb8,0xff,0xf0,0x40,0x1e,0x0f,0x16,0x48, +0x2b,0x06,0x15,0x00,0x0c,0x23,0x12,0x18,0x15,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x83,0x0f,0x0f,0x09,0x23,0x18,0x18,0x2e,0x01,0x2e,0x84,0x03,0xb8,0xff,0xf8,0x40,0x27,0x0c,0x06,0x4d,0x03,0x03,0x31,0x29,0x08,0x0d,0x06,0x4d,0x29,0x08,0x0c,0x06,0x4d,0x29,0x08,0x0b,0x06,0x4d,0x29,0x83,0x09,0x18,0x0d,0x06,0x4d,0x09,0x20,0x0c,0x06, +0x4d,0x09,0x20,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0xe1,0xc6,0x10,0xc0,0x2f,0xc6,0x12,0x39,0x2f,0xe1,0x2b,0xc6,0x12,0x39,0x12,0x39,0x00,0x2f,0x3f,0x33,0x2b,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x10,0xc4,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e, +0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x04,0x23,0x35,0x21,0x15,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x36,0x33,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x05,0x16,0x16,0x15,0x14,0x03,0x30,0xb3,0x61,0x5d,0xa2,0xc1,0xd1,0xa3,0x96,0x6b,0x73,0xc0,0xa4,0xfe, +0xc0,0x26,0x02,0x5e,0xc7,0xee,0x58,0x89,0x2d,0x17,0x32,0x31,0x1d,0x30,0x41,0xaa,0xe3,0x01,0x1c,0xc9,0x9b,0xfe,0xc4,0x4e,0x53,0x3b,0x49,0x14,0x19,0xd7,0xad,0x84,0xce,0x37,0x1d,0x83,0x59,0x70,0xb2,0x27,0x07,0x05,0x86,0x89,0x1f,0xa5,0x73,0x47,0x62,0x28,0x03,0x03,0x96,0x03,0xa1,0x87,0xdb,0x2d,0x20,0x8b,0x76,0x69,0xff,0xff, +0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00,0x00,0x02,0x00,0xa1,0xfe,0x74,0x04,0x50,0x04,0x18,0x00,0x0e,0x00,0x1a,0x00,0x83,0x40,0x27,0x0f,0x06,0x01,0x10,0x06,0x07,0x17,0x95,0x59,0x07,0x10,0x0f,0x00,0x12,0x0d,0x12,0x95,0x59,0x0d,0x16,0x02,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a, +0x08,0x0b,0x06,0x4d,0x0a,0x83,0x14,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x14,0xb8,0xff,0xe8,0x40,0x19,0x0b,0x06,0x4d,0x14,0x14,0x1c,0x0f,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xfc,0x40,0x0c,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x2f,0x1c,0x01,0x5d,0x2f, +0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23,0x11,0x34,0x12,0x33,0x32,0x00,0x15,0x10,0x02,0x23,0x22,0x03,0x16,0x16,0x33,0x20,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x48,0x04,0xa3, +0xe6,0xde,0xdf,0x01,0x0c,0xf7,0xdd,0xc1,0x77,0x27,0xa4,0x59,0x01,0x3e,0xb2,0x8c,0x8f,0x95,0x63,0xfe,0x11,0x03,0x9a,0xf7,0x01,0x13,0xfe,0xda,0xe1,0xfe,0xfb,0xfe,0xdc,0x01,0x1b,0x3e,0x51,0x01,0x94,0xaa,0xda,0xc6,0xba,0x00,0x00,0x01,0x00,0x57,0xfe,0xc4,0x03,0x81,0x04,0x19,0x00,0x1c,0x00,0x8f,0x40,0x14,0x0f,0x07,0x01,0x10, +0x04,0x13,0x30,0x0b,0x0c,0x00,0x4c,0x0f,0x11,0x0c,0x11,0x95,0x59,0x0c,0x10,0x18,0xb8,0xff,0xf0,0x40,0x0a,0x10,0x16,0x48,0x18,0x06,0x15,0x00,0x01,0x01,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x37,0x0c,0x06,0x4d,0x03,0xef,0x1b,0x10,0x0d,0x06,0x4d,0x1b,0x10,0x0c,0x06,0x4d,0x1b,0x0e,0x0e,0x1e,0x14, +0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x83,0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09,0x18,0x0b,0x06,0x4d,0x2f,0x09,0x01,0x09,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xd4,0x2b,0x2b,0xf1,0x2b,0x2b,0xc2,0x2f,0x00,0x2f,0x3f,0x33,0x2b,0x3f,0x2b,0x00,0x18, +0x10,0xc6,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x10,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x15,0x14,0x1e,0x02,0x05,0x16,0x15,0x14,0x03,0x3b,0xb5,0x62,0x7b,0x84,0xc2,0xd0,0x01,0x2f,0xec,0x7f,0x65,0x72,0x81,0x99,0xc9,0x2e,0x58,0x3b,0x01,0x19,0xa6,0xfe,0xc4,0x4c,0x58, +0x46,0x3f,0x11,0x19,0xe6,0xb2,0x01,0x18,0x01,0x52,0x34,0xa7,0x4f,0xfe,0xfa,0xc5,0x47,0x6c,0x45,0x12,0x4b,0x3e,0xb1,0x69,0x00,0x01,0x00,0x14,0xff,0xe6,0x04,0x0e,0x04,0x07,0x00,0x1c,0x00,0xa4,0xb7,0x0a,0x1a,0x01,0x05,0x09,0x01,0x10,0x09,0xb8,0xff,0xe0,0x40,0x2d,0x0b,0x0c,0x00,0x4c,0x13,0x0f,0x0f,0x03,0x01,0x16,0x03,0x03, +0x40,0x24,0x28,0x48,0x03,0x40,0x08,0x0f,0x19,0x0e,0xec,0x59,0x19,0x16,0x13,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x84,0x11,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x11,0x11,0x1e,0x05,0x0c,0x08,0x0d, +0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x1c,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x1c,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x1c,0x2f,0x1e,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x1a,0xcd,0x2b,0x5f, +0x5e,0x5d,0x3f,0x31,0x30,0x2b,0x01,0x5e,0x5d,0x5d,0x13,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x10,0x03,0x33,0x16,0x11,0x14,0x02,0x23,0x22,0x26,0x35,0xae,0x29,0x38,0x1a,0x1f,0x30,0x2f,0x7c,0x61,0x01,0x0d,0x7f,0x8d,0x93,0xb7,0x81,0xe8,0xc9,0xd0,0xdf,0x02,0xc7,0x5b,0x55,0x07, +0x8a,0x0d,0x94,0xa5,0xfe,0xff,0xfe,0xab,0xb1,0xa1,0x01,0x2b,0x01,0x0b,0xfa,0xfe,0xcb,0xe3,0xfe,0xf8,0xec,0xde,0x00,0x01,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x00,0x1d,0x00,0x8c,0xb9,0x00,0x13,0xff,0xe8,0x40,0x4e,0x0b,0x0c,0x00,0x4c,0x09,0x08,0x10,0x00,0x4d,0x03,0x18,0x0b,0x0c,0x00,0x4c,0x18,0x18,0x19,0x06,0x06,0x05, +0x07,0x17,0x07,0x15,0x15,0x14,0x09,0x09,0x0a,0x08,0x16,0x08,0x0d,0x16,0x01,0x02,0x07,0x01,0x10,0x04,0x0e,0x0c,0x11,0x0c,0xec,0x59,0x11,0x10,0x17,0x0f,0x1d,0x1b,0x02,0x1b,0xec,0x59,0x02,0x1c,0x08,0x1b,0x19,0x05,0x14,0x0a,0x05,0x0a,0x0e,0x16,0x17,0x17,0x00,0x00,0x1f,0x0e,0x07,0x0e,0x08,0x2f,0x33,0x33,0x2f,0x11,0x33,0x2f, +0x32,0x2f,0x33,0x11,0x39,0x39,0x11,0x33,0x11,0x33,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x2b,0x2b,0x2b,0x01,0x06,0x23,0x22,0x26,0x27,0x03,0x01,0x23,0x01,0x03,0x26,0x23,0x22,0x07,0x35, +0x36,0x33,0x32,0x16,0x17,0x13,0x01,0x33,0x01,0x13,0x16,0x33,0x32,0x37,0x04,0x46,0x2b,0x31,0x5a,0x82,0x4b,0x9f,0xfe,0xa1,0xb9,0x01,0xc6,0xae,0x42,0x48,0x30,0x28,0x22,0x49,0x56,0x6b,0x33,0x8c,0x01,0x11,0xb9,0xfe,0x89,0xec,0x44,0x48,0x25,0x29,0xfe,0x2a,0x09,0x86,0xac,0x01,0x6b,0xfd,0x6f,0x03,0x38,0x01,0x89,0x94,0x0e,0x9a, +0x0a,0x5c,0x78,0xfe,0xb6,0x02,0x06,0xfd,0x58,0xfd,0xf4,0x96,0x10,0x00,0x00,0x01,0x00,0x98,0xfe,0x1e,0x05,0x68,0x05,0x33,0x00,0x1b,0x00,0xec,0xb9,0x00,0x18,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x0f,0xb8,0xff,0xc0,0x40,0x15,0x0b,0x0c,0x00,0x4c,0x0d,0x1b,0x0f,0x14,0x12,0x07,0x04,0x15,0x04,0x15,0xec,0x59,0x04,0x16,0x05,0x1c, +0x1a,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1a,0x83,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf0,0x40,0x40,0x0b,0x06,0x4d,0x1b,0x0e,0x04,0x07,0x0c,0x42,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08, +0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x0c,0x1c,0x15,0x12,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x18,0x0b,0x06,0x4d,0x04,0xef,0x07,0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x07, +0xb8,0xff,0xfc,0x40,0x0d,0x0b,0x06,0x4d,0x07,0x07,0x1d,0x1c,0x40,0x1d,0x01,0x2f,0x1d,0x01,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39, +0x18,0x2f,0x3f,0x33,0x31,0x30,0x2b,0x2b,0x01,0x10,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x00,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x05,0x68,0xfe,0xe3,0xe9,0x18,0x94,0x18,0xeb,0xfe,0xe5,0xa6,0xc8,0x98,0x18,0x94,0x18,0x96,0xca,0xa6,0x02,0x2c,0xfe,0xf4,0xfe,0xc9,0xfe,0x35, +0x01,0xcb,0x01,0x36,0x01,0x0d,0x01,0xd4,0xfe,0x2c,0xc4,0xef,0x04,0xba,0xfb,0x46,0xee,0xc5,0x01,0xd4,0x00,0x01,0x00,0x77,0xff,0xe9,0x06,0x00,0x04,0x00,0x00,0x21,0x00,0xe3,0x40,0x2a,0x0b,0x21,0x01,0x04,0x1f,0x01,0x0b,0x04,0x01,0x04,0x02,0x01,0x0d,0x00,0x01,0x10,0x04,0x12,0x12,0x20,0x09,0x1b,0x0f,0x00,0x0e,0x03,0x20,0x15, +0x20,0x15,0xec,0x59,0x20,0x16,0x0d,0x1a,0x01,0x09,0x03,0x1a,0x1a,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x18,0x83,0x1d,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1d,0xb8,0xff,0xe8,0x40,0x4f,0x0b,0x06,0x4d,0x1d,0x0e,0x12,0x11,0x06,0x42,0x02,0x09, +0x01,0x09,0x09,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x83,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x18,0x0b,0x06,0x4d,0x06,0x06,0x22,0x00,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x84,0x11,0x06,0x0c,0x06,0x4d,0x11,0x11,0x23, +0x22,0x3f,0x23,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x5d,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x18,0x2f,0x5f,0x5e,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x18,0x3f,0xc4,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x31,0x30, +0x01,0x5d,0x5d,0x5d,0x5d,0x25,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x13,0x33,0x02,0x15,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x34,0x03,0x33,0x12,0x11,0x14,0x06,0x23,0x22,0x03,0x3d,0x04,0x67,0xca,0xbd,0xd4,0x7e,0xb7,0x8f,0x7a,0x6d,0xe6,0xa4,0xe5,0x6b,0x7b,0x8e,0xb6,0x7f,0xd5,0xbf,0xca,0xa8,0xbf, +0xff,0xe0,0x01,0x02,0x01,0x36,0xfe,0xc1,0xff,0x9f,0xaa,0x01,0x5a,0x01,0x1b,0xfe,0xe5,0xfe,0xa6,0xaa,0x9f,0xff,0x01,0x3f,0xfe,0xc9,0xfe,0xff,0xe1,0xfe,0xff,0xff,0xff,0xed,0xff,0xf4,0x02,0x34,0x05,0x77,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x70,0xff,0xf0,0x00,0x17,0x40,0x0d,0x02,0x01,0x19,0x1b,0x15,0x05, +0x06,0x3e,0x02,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x77,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x96,0xff,0xf0,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd8,0x40,0x0a,0x2c,0x26,0x00,0x16,0x25,0x02,0x01,0x29,0x11,0x26,0x00,0x2b,0x35,0x35, +0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x01,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x28,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf6,0x40,0x09,0x19,0x19,0x0c,0x0c,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x01,0x02,0x26, +0x01,0xd2,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x0f,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x05,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xe9,0x06,0x00,0x06,0x01,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x01,0x9f,0x02,0x02,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1b, +0x24,0x22,0x06,0x1d,0x25,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe3,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x8b,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x21,0x0f,0x02,0x03,0x3e,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, +0x35,0x00,0x00,0x01,0x00,0x29,0xff,0xee,0x05,0x1e,0x05,0x9a,0x00,0x1b,0x00,0xb6,0x40,0x2f,0x00,0x16,0x01,0x10,0x05,0x13,0x0a,0x91,0x59,0x13,0x13,0x10,0x0b,0x0d,0x11,0x10,0x11,0x91,0x59,0x10,0x03,0x01,0x03,0x1a,0x03,0x91,0x59,0x1a,0x13,0x0b,0x12,0x00,0x00,0x0b,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08,0x0c,0x06,0x4d,0x17,0x7d, +0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d,0x06,0x06,0x1d,0x13,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x7e,0x0c,0x11,0x11,0x1d,0x0e,0xb8,0xff,0xe8,0x40,0x0a,0x0d,0x06,0x4d,0x0e,0x0c,0x20,0x0d,0x06, +0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x0c,0x2f,0x2b,0x2b,0x2b,0xc6,0x2b,0x12,0x39,0x2f,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x2b, +0x31,0x30,0x00,0x5f,0x5e,0x5d,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x04,0x15,0x14,0x06,0x23,0x22,0x02,0xfe,0x42,0x5e,0x61,0x73,0xa9,0x98,0xf9,0xa8,0xfe,0x99,0x03,0xe3,0xfe,0x2c,0xfd,0xe2,0x01,0x07,0xc7,0xb5,0x5c,0x06,0x9a,0x21,0x8b,0x77,0x8b,0x9a, +0xfd,0x5a,0x05,0x02,0x98,0x98,0xfe,0x38,0xe6,0xd1,0xc0,0xd5,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x07,0x66,0x02,0x26,0x01,0x2c,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x50,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x15,0x08,0x06,0x01,0x05,0x3e,0x01,0x00,0x08,0x01,0x08,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0x00,0x01, +0x00,0x5e,0xff,0xe8,0x04,0x85,0x05,0xb2,0x00,0x18,0x00,0x97,0x40,0x5f,0x55,0x0a,0x01,0x59,0x00,0x01,0x5a,0x03,0x01,0x03,0x0f,0x03,0x01,0x0b,0x05,0x10,0x13,0x91,0x59,0x10,0x08,0x02,0x10,0x91,0x2b,0x30,0x00,0x0b,0x01,0x0c,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x00,0x18,0x01,0x0b,0x03,0x18,0x18,0x16,0x02,0x16, +0x91,0x59,0x02,0x13,0x11,0x11,0x13,0x00,0x0a,0x0a,0x1a,0x10,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x18,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x00,0x3f,0x2b, +0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x01,0x5f,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x15,0x21,0x16,0x00,0x33,0x32,0x37,0x04,0x85,0x9e,0xeb, +0xfe,0xd1,0xfe,0x91,0x01,0x85,0x01,0x35,0xd6,0x97,0xa3,0xcc,0xd7,0xfe,0xeb,0x18,0x02,0x7a,0xfd,0x84,0x10,0x01,0x11,0xd7,0xe0,0x9d,0x3c,0x54,0x01,0x8b,0x01,0x3f,0x01,0x5b,0x01,0xa5,0x3b,0xb3,0x56,0xfe,0xed,0xf1,0x97,0xef,0xfe,0xef,0x60,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x05,0xb2,0x02,0x06,0x00,0x36,0x00,0x00, +0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x02,0x00,0x10,0xff,0xe9,0x07,0x77,0x05,0x9a,0x00,0x19,0x00,0x21, +0x00,0xc0,0x40,0x49,0x0d,0x05,0x01,0x00,0x03,0x01,0x0b,0x17,0x01,0x0b,0x16,0x01,0x02,0x0d,0x01,0x10,0x04,0x12,0x14,0x0f,0x14,0x91,0x59,0x0f,0x13,0x00,0x1a,0x91,0x59,0x00,0x00,0x18,0x1b,0x18,0x0a,0x91,0x59,0x18,0x03,0x08,0x1b,0x91,0x59,0x08,0x12,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x18,0x18,0x08,0x11,0x04,0x08,0x0d,0x06,0x4d, +0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7d,0x1f,0xb8,0xff,0xf0,0x40,0x23,0x0d,0x06,0x4d,0x1f,0x10,0x0b,0x06,0x4d,0x1f,0x1f,0x23,0x00,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x7e,0x08,0x18,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x0c,0x0c,0x06,0x4d,0x08,0x18,0x0b, +0x06,0x4d,0x08,0x08,0x23,0x11,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x00, +0x5d,0x5d,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x02,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x11,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x04,0xa4,0x01,0x10,0xd7,0xec,0xf8,0xd9,0xfe,0x56,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0xeb, +0x96,0xa2,0xfe,0xc8,0x03,0x39,0xce,0xbf,0xc4,0xe8,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0xfd,0x08,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x7d,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0xb7,0x40,0x2f,0x0d,0x10,0x01,0x00,0x0e,0x01,0x10,0x04,0x13,0x0b,0x01,0x08, +0x08,0x01,0x91,0x59,0x08,0x08,0x14,0x06,0x0a,0x03,0x00,0x14,0x91,0x59,0x03,0x00,0x12,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x18,0xb8,0xff,0xe8,0x40,0x3e,0x0d,0x06,0x4d,0x18,0x10,0x0b,0x06,0x4d,0x18,0x18,0x1c,0x0b,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14, +0x08,0x0b,0x06,0x4d,0x14,0x7e,0x00,0x20,0x0d,0x06,0x4d,0x00,0x18,0x0b,0x06,0x4d,0x00,0x00,0x1c,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x7e,0x04,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39, +0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0xc4,0x2b,0x00,0x18,0x3f,0xc4,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32, +0x36,0x35,0x10,0x21,0x04,0x02,0xfd,0x62,0xa8,0xa8,0x02,0x9e,0xa8,0x01,0x10,0xd5,0xee,0xf9,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x02,0xa0,0xfd,0x60,0x05,0x9a,0xfd,0x9e,0x02,0x62,0xfd,0xa0,0xce,0xc0,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0x4a,0x05,0x9a,0x00,0x11,0x00,0xc6, +0x40,0x1c,0x02,0x10,0x01,0x02,0x10,0x01,0x10,0x04,0x0e,0x05,0x91,0x59,0x0e,0x0e,0x00,0x0b,0x08,0x0c,0x0b,0x0c,0x91,0x59,0x0b,0x03,0x06,0x00,0x12,0x0c,0xb8,0xff,0xf9,0xb3,0x0b,0x06,0x4d,0x09,0xb8,0xff,0xf9,0x40,0x15,0x0b,0x06,0x4d,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01, +0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x32,0x0b,0x06,0x4d,0x00,0x01,0x01,0x09,0x03,0x01,0x01,0x13,0x07,0x0c,0x0e,0x0e,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0x07,0x09,0x42,0x09,0x09,0x12,0x07,0x12,0x0d,0x06, +0x4d,0x07,0x0d,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x01,0x10,0xf1,0x2b,0x2b,0x2b,0x32,0xe0,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xc4,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x2b,0x31,0x30, +0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x21,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x20,0x11,0x05,0x4a,0xa8,0xfe,0xe3,0xfe,0xe9,0xa8,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x19,0x01,0xc3,0x01,0x85,0x01,0x27,0xfd,0x54,0x05,0x02,0x98,0x98,0xfe,0x3e,0xfe,0x45,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2, +0x07,0x66,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x8e,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x0f,0x12,0x12,0x09,0x0e,0x25,0x01,0x00,0x13,0x01,0x13,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x07,0x4f,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x07,0xcd,0x00,0x16, +0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0d,0x1c,0x16,0x0d,0x00,0x25,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x04,0xf2,0x05,0x9a,0x00,0x0b,0x00,0xb2,0xb9,0x00,0x02,0x01,0x30,0x40,0x1b,0x07,0x0b,0x03,0x04,0x00,0x00,0x09,0x91,0x59,0x00,0x12,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c, +0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0xb8,0x01,0x2c,0xb6,0x04,0x04,0x10,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x08,0x09,0x04,0xb8,0x01,0x2c,0x40,0x1e,0xff,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09, +0xb8,0xff,0xf8,0x40,0x1b,0x0b,0x06,0x4d,0x7f,0x09,0x01,0x09,0x09,0x0d,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x05,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b, +0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x3f,0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xfe,0x30,0x9a,0xfe,0x34,0xa8,0x02,0xe6,0xa8,0xfe,0x80,0x01,0x80,0x05,0x9a,0xfa,0xfe,0x05,0x02,0x00,0xff,0xff,0x00,0x16,0x00,0x00, +0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x9f,0x40,0x31,0x0d,0x0a,0x01,0x00,0x08,0x01,0x10,0x04,0x05,0x0d,0x91,0x59,0x05,0x05,0x0e,0x02,0x02,0x03,0x91,0x59,0x02,0x03,0x00,0x0e,0x91,0x59,0x00,0x12,0x03,0x03,0x0e,0x09,0x08,0x0d,0x06,0x4d, +0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x7d,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x1e,0x0c,0x06,0x4d,0x12,0x10,0x0b,0x06,0x4d,0x12,0x12,0x16,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00, +0xb8,0xff,0xf6,0x40,0x09,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x33,0x11,0x21,0x15,0x21,0x11,0x21, +0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x02,0xfe,0xfd,0xaa,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0x98,0xfe,0x38,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25, +0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x01,0x2c,0x00,0x00,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x05,0x9a,0x00,0x0d,0x00,0x13,0x00,0xcf,0xb7,0x0b,0x0f,0x91,0x59,0x0b,0x03,0x04,0x01,0xb8,0x01,0x30,0x40,0x22,0x0e,0x07,0x02,0x0c,0x02,0x0c,0x91,0x59,0x02,0x12,0x75,0x13,0x01,0x10,0x0a,0x0a, +0x0e,0x07,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x18,0x0b,0x06,0x4d,0x0d,0xba,0x01,0x2c,0x00,0x02,0xff,0xee,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xe0,0x40,0x17,0x0b,0x06,0x4d,0x02,0x02,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c, +0x7e,0x0e,0xb8,0xff,0xf0,0x40,0x21,0x0d,0x06,0x4d,0x0e,0x18,0x0c,0x06,0x4d,0x0e,0x20,0x0b,0x06,0x4d,0x0e,0x0e,0x15,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x06,0xb8,0x01,0x2c,0xb2,0x03,0x13,0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x07,0x2f, +0x2b,0x2b,0x33,0xd5,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0xc4,0x3f,0x2b,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21,0x11,0x33,0x21, +0x11,0x21,0x06,0x02,0x07,0x05,0x48,0x9b,0xfb,0xfd,0x9b,0x6f,0x90,0xc9,0x0d,0x02,0xa3,0xc1,0xfe,0x97,0xfe,0x94,0x10,0xbc,0x73,0xfe,0x7f,0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x07,0x02,0xbf,0x01,0x3c,0xfa,0xfe,0x04,0x6a,0xf7,0xfd,0x6a,0xdd,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06,0x00,0x28,0x00,0x00, +0x00,0x01,0xff,0xea,0x00,0x00,0x07,0x02,0x05,0x9a,0x00,0x1d,0x00,0xb1,0xb9,0x00,0x1d,0xff,0xf0,0x40,0x72,0x0c,0x06,0x4d,0x0e,0x10,0x0c,0x06,0x4d,0x5c,0x1b,0x01,0x1a,0x1b,0x01,0x53,0x10,0x01,0x15,0x10,0x01,0x53,0x0c,0x01,0x05,0x0c,0x15,0x0c,0x02,0x5c,0x01,0x01,0x03,0x0d,0x01,0x1d,0x01,0x02,0x10,0x1a,0x01,0x10,0x11,0x01, +0x0f,0x0b,0x1f,0x0b,0x02,0x0f,0x02,0x1f,0x02,0x02,0x0b,0x04,0x1b,0x10,0x16,0x03,0x0c,0x01,0x06,0x12,0x1d,0x00,0x06,0x0e,0x0d,0x07,0x1c,0x1c,0x00,0x20,0x0b,0x06,0x4d,0x00,0x0e,0x06,0x07,0x0d,0x42,0x0f,0x0d,0x0d,0x1e,0x16,0x15,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0x07, +0x1f,0x1e,0x2f,0x1f,0x3f,0x1f,0x02,0x5d,0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x11,0x33,0x2f,0xc6,0x2b,0x01,0x10,0xf0,0x2b,0xc2,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x2b,0x21, +0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x07,0x02,0xe1,0xfd,0xcf,0x18,0x0d,0x05,0x9f,0x04,0x0f,0x16,0xfd,0xcf,0xe3,0x02,0x91,0xfd,0x9b,0xce,0x02,0x1a,0x16,0x0f,0x04,0x9f,0x05,0x0d,0x18,0x02,0x1a,0xcd,0xfd,0x9b,0x02, +0x90,0x1c,0x16,0xfd,0x3e,0x02,0xc2,0x19,0x19,0xfd,0x70,0x02,0xe8,0x02,0xb2,0xfd,0x93,0x19,0x18,0x02,0x9e,0xfd,0x62,0x16,0x1b,0x02,0x6d,0xfd,0x4e,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x00,0x23,0x00,0xd7,0x40,0x13,0x09,0x20,0x01,0x06,0x1e,0x01,0x04,0x18,0x01,0x03,0x00,0x14,0x01,0x0f,0x00,0x01,0x10,0x05, +0x14,0xb8,0xff,0xc0,0x40,0x3c,0x0c,0x00,0x4d,0x00,0x40,0x0c,0x00,0x4d,0x1c,0x09,0x0a,0x0a,0x09,0x92,0x59,0x0a,0x0a,0x03,0x16,0x0f,0x13,0x1f,0x13,0x2f,0x13,0x03,0x09,0x03,0x13,0x11,0x16,0x11,0x92,0x59,0x16,0x04,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x09,0x03,0x01,0x03,0x22,0x03,0x92,0x59,0x22,0x13,0x1b,0x1f,0x09,0x09,0x06, +0x00,0x0e,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0e,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x0e,0x7d,0x19,0x19,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x7d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x0e,0x0b,0x06,0x4d,0x20,0x06,0x01,0x06,0x06,0x25,0x13,0x00, +0x3f,0x25,0x01,0x5d,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5f, +0x5d,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x60,0xa8,0xd5,0x9b,0xb7,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x9e,0xce,0xcc,0xea,0xfe,0xf0,0x94,0xae,0xfe,0xe8, +0xf3,0xf3,0x3c,0xb6,0x7b,0x96,0x7f,0x01,0x14,0x8b,0x8a,0x7e,0x6c,0x82,0x71,0xaa,0x58,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xc5,0xe9,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x00,0x13,0x00,0xa1,0x40,0x12,0x7a,0x12,0x01,0x79,0x11,0x01,0x75,0x08,0x01,0x75,0x07,0x01,0x12,0x08,0x0b,0x00,0x4d,0x08,0xb8,0xff, +0xf8,0x40,0x2c,0x0b,0x00,0x4d,0x0e,0x04,0x0b,0x13,0x03,0x09,0x00,0x12,0x12,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0x40,0x1a,0x0b,0x06,0x4d,0x01,0x01,0x15,0x08,0x0e,0x0c,0x08,0x0d,0x06, +0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x09,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x09,0x04,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x39,0x33,0x00,0x3f,0x32,0x3f,0x33, +0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x14,0x07,0x33,0x36,0x37,0x01,0x33,0x05,0x40,0xa8,0x0a,0x06,0x13,0x1b,0xfd,0x1e,0xd0,0xa8,0x08,0x04,0x16,0x22,0x02,0xd0,0xd8,0x04,0x0c,0x8c,0x39,0x31,0x29,0xfb,0x89,0x05,0x9a,0xfc,0x0e,0xa2,0x31,0x2c, +0x34,0x04,0x65,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x4e,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x07,0xcd,0x00,0xa8,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0a,0x1a,0x14,0x0a,0x13,0x25,0x01,0x17,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e, +0x00,0x00,0x00,0x01,0x00,0x10,0xff,0xe9,0x04,0xa4,0x05,0x9a,0x00,0x12,0x00,0x74,0x40,0x43,0x0d,0x10,0x01,0x0b,0x0f,0x01,0x02,0x06,0x01,0x10,0x04,0x07,0x18,0x0b,0x00,0x4d,0x12,0x02,0x91,0x59,0x12,0x03,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x13,0x00,0x12,0x03,0x11,0x11,0x0b,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d, +0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x04,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0xb6,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0b,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x33,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x31,0x30,0x00,0x2b,0x01,0x5f, +0x5e,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x02,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x04,0xa4,0xa8,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0x00,0xff,0xff,0x00,0xbc, +0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xfc,0x05,0x9a,0x02,0x06,0x01,0xb5,0x00,0x00,0xff,0xff,0x00,0xbc, +0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0xe7,0x04,0x96,0x05,0x9a,0x00,0x15,0x00,0x53,0x40,0x2e,0x0a,0x15,0x01,0x05, +0x0e,0x01,0x03,0x03,0x10,0x0c,0x00,0x4d,0x00,0x10,0x01,0x10,0x05,0x10,0x0c,0x04,0x0e,0x00,0x03,0x07,0x09,0x04,0x09,0x91,0x59,0x04,0x13,0x76,0x11,0x01,0x11,0x0c,0x14,0x06,0x14,0x00,0x00,0x16,0x06,0x06,0x0e,0x0d,0x2f,0x33,0x33,0x2f,0x11,0x33,0x2f,0x32,0x11,0x12,0x39,0x39,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x33, +0x12,0x39,0x39,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x5d,0x01,0x01,0x02,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0x96,0xfe,0x45,0x76,0xdc,0x82,0x6b,0x48,0x56,0x50,0x51,0x88,0x4f,0xfe,0x1a,0xbf,0x01,0x58,0x09,0x1c,0x02,0x03,0x26,0x01,0x3f,0x05,0x9a,0xfc, +0x17,0xfe,0xf6,0xc0,0x1f,0xaa,0x33,0x7d,0x9e,0x04,0x02,0xfd,0x02,0x13,0x4a,0x09,0x58,0x02,0xfa,0x00,0x00,0x03,0x00,0x5e,0x00,0x00,0x05,0x81,0x05,0xc2,0x00,0x15,0x00,0x1e,0x00,0x27,0x01,0x02,0xb9,0x00,0x13,0xff,0xe8,0x40,0x23,0x0c,0x00,0x4d,0x1f,0x03,0x00,0x17,0x00,0x17,0x91,0x59,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x91,0x59, +0x0e,0x00,0x0e,0x00,0x01,0x0d,0x03,0x01,0x12,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x24,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1b,0x7d,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x2a, +0x0c,0x06,0x4d,0x12,0x20,0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x08,0x0b,0x06,0x4d,0x24,0x7d,0x07,0x18,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe0,0x40,0x1d,0x0b,0x06,0x4d,0x07,0x07,0x28,0x0b,0x0e,0x16,0x20,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01, +0x08,0x0c,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01,0xef,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf5,0x40,0x0a,0x0b,0x06,0x4d,0x02,0x02,0x29,0x28,0x20,0x29,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1, +0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x25,0x15,0x23,0x35,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x03,0x11, +0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x3e,0x9c,0x1b,0xf0,0xfe,0xc7,0x01,0x38,0xf3,0x19,0x9c,0x18,0xf6,0x01,0x35,0xfe,0xc7,0xf0,0x1a,0x1a,0xab,0xce,0xce,0xad,0xb4,0x19,0xaa,0xd1,0xce,0xab,0xbc,0xbc,0xbc,0x01,0x47,0xef,0xe4,0x01,0x38,0xb4,0xb4,0xfe,0xcd,0xe9,0xec,0xfe,0xb6, +0x03,0xc5,0xfc,0xcf,0xe3,0xbd,0xb4,0xdd,0xfc,0xcf,0x03,0x31,0xe0,0xb1,0xbe,0xe2,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0xbc,0xfe,0x7f,0x05,0xb2,0x05,0x9a,0x00,0x0b,0x00,0xb4,0xb9,0x00,0x00,0x01,0x30,0x40,0x1c,0x05,0x09,0x03,0x07,0x02,0x0a,0x02,0x0a,0x91,0x59,0x02, +0x12,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x10,0x0b,0x06,0x4d,0x0b,0xba,0x01,0x2c,0x00,0x02,0xff,0xe4,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xec,0x40,0x17,0x0b,0x06,0x4d,0x02,0x02,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x7e, +0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xe0,0x40,0x1d,0x0c,0x06,0x4d,0x07,0x10,0x0b,0x06,0x4d,0x07,0x07,0x0d,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x03,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0xe1,0x2b, +0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0xb2,0x9b,0xfb,0xa5,0xa8,0x02,0xe6,0xa8,0xc0,0xfe,0x7f,0x01,0x81,0x05,0x9a,0xfa,0xfe, +0x05,0x02,0xfa,0xfe,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x10,0x00,0x85,0x40,0x34,0x0f,0x06,0x01,0x10,0x04,0x0e,0x02,0x0c,0x04,0x0c,0x91,0x59,0x04,0x04,0x00,0x09,0x10,0x03,0x00,0x12,0x02,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x7e,0x7f,0x0f,0x01,0x0f,0x20,0x0d, +0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x18,0x0b,0x06,0x4d,0x0f,0x0f,0x12,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x7e,0x08,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x08,0x0c,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b, +0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x32,0x12,0x39,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0xa8,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0x02,0x85,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02, +0x8c,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0xd9,0x05,0x9a,0x00,0x0b,0x00,0xa7,0x40,0x0e,0x07,0x03,0x0b,0x03,0x05,0x00,0x09,0x00,0x09,0x91,0x59,0x00,0x12,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x22,0x0b,0x06,0x4d,0x09,0x7e,0x00,0x12,0x0d,0x06,0x4d,0x00, +0x0e,0x08,0x01,0x05,0x42,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7e,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x28,0x0c,0x06,0x4d,0x01,0x01,0x0c,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x05,0x06,0x0d,0x06,0x4d, +0x10,0x05,0x01,0x05,0x05,0x0d,0x0c,0x2f,0x0d,0x4f,0x0d,0x02,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf1,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x33,0x33,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11, +0x21,0x11,0x33,0x06,0xd9,0xf9,0xe3,0xa8,0x02,0x13,0xa7,0x02,0x13,0xa8,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0x00,0x01,0x00,0xbc,0xfe,0x7f,0x07,0x9a,0x05,0x9a,0x00,0x0f,0x00,0xff,0xb9,0x00,0x01,0x01,0x30,0x40,0x1e,0x09,0x05,0x0d,0x03,0x0b,0x07,0x02,0x0e,0x02,0x0e,0x91,0x59,0x02,0x12,0x0f,0x08,0x0d,0x06,0x4d, +0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x10,0x0b,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb5,0x0b,0x06,0x4d,0x02,0x02,0x0b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d, +0x0b,0x7e,0x0e,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x0e,0xb8,0xff,0xf8,0x40,0x23,0x0c,0x06,0x4d,0x0e,0x06,0x0b,0x06,0x4d,0x0e,0x0e,0x0a,0x07,0x03,0x42,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x6f,0x03,0x01,0x03,0xb8,0xff,0xf0,0x40,0x18,0x0d,0x06,0x4d,0x03,0x03,0x10,0x0a,0x08, +0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x7e,0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf0,0x40,0x0f,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x4f,0x11,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b, +0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc1,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x07,0x9a,0x9b,0xf9,0xbd,0xa8,0x02,0x13,0xa8,0x02,0x12, +0xa8,0xc1,0xfe,0x7f,0x01,0x81,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x00,0x02,0x00,0x29,0x00,0x00,0x05,0x42,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x98,0x40,0x29,0x0d,0x0a,0x01,0x00,0x08,0x01,0x10,0x04,0x05,0x0d,0x91,0x59,0x05,0x05,0x0e,0x04,0x04,0x01,0x91,0x59,0x04,0x03,0x00,0x0e,0x91,0x59,0x00,0x12, +0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x7d,0x12,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x25,0x0c,0x06,0x4d,0x12,0x12,0x16,0x00,0x02,0x02,0x15,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x70,0x00,0x01,0x00,0x10,0x0d,0x06,0x4d,0x00,0xb8, +0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xe0,0xb3,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x11,0x21,0x35,0x21,0x11, +0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0xc6,0xfe,0x63,0x02,0x45,0x01,0x11,0xd5,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa3,0xfe,0xc8,0x05,0x00,0x9a,0xfd,0xa0,0xce,0xc0,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x00,0x03,0x00,0xbc,0x00,0x00,0x05,0x87,0x05,0x9a,0x00,0x03, +0x00,0x0e,0x00,0x16,0x00,0xb0,0x40,0x44,0x0d,0x0c,0x01,0x00,0x0a,0x01,0x10,0x04,0x07,0x0f,0x91,0x59,0x07,0x07,0x10,0x02,0x05,0x03,0x01,0x04,0x04,0x10,0x91,0x59,0x04,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x01,0x18,0x04,0x0b, +0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x7d,0x14,0xb8,0xff,0xe8,0x40,0x1e,0x0d,0x06,0x4d,0x00,0x14,0x10,0x14,0x02,0x14,0x14,0x18,0x07,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x7e,0x04,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x04,0xb8, +0xff,0xfd,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x21,0x32, +0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x05,0x87,0xa8,0xa8,0xfb,0x35,0xa8,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfd,0xa0,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a, +0x00,0x0a,0x00,0x12,0x00,0x87,0x40,0x29,0x0d,0x08,0x01,0x00,0x06,0x01,0x10,0x04,0x03,0x0b,0x91,0x59,0x03,0x03,0x0c,0x01,0x03,0x00,0x0c,0x91,0x59,0x00,0x12,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7d,0x10,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xf8,0x40,0x1e,0x0c,0x06, +0x4d,0x10,0x18,0x0b,0x06,0x4d,0x10,0x10,0x14,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00, +0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x33,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0xa8,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0xfd,0xa0,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00, +0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x90,0x05,0xb2,0x00,0x18,0x00,0xb9,0x40,0x14,0x02,0x0f,0x01,0x0d,0x00,0x01,0x02,0x16,0x01,0x02,0x12,0x01,0x10,0x04,0x16,0x10,0x0b,0x00,0x4d,0x0f,0xb8,0xff,0xc0,0x40,0x45,0x0c,0x00,0x4d,0x00,0x40,0x0c,0x00,0x4d,0x08,0x07,0x91,0x59,0x08,0x11,0x17,0x08,0x91,0x2b,0x30,0x00,0x0e,0x01,0x0c, +0x03,0x0e,0x0e,0x0c,0x11,0x0c,0x91,0x59,0x11,0x04,0x00,0x01,0x01,0x0b,0x03,0x01,0x01,0x03,0x17,0x03,0x91,0x59,0x17,0x13,0x07,0x07,0x00,0x09,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x7d,0x06,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff, +0xe8,0x40,0x0b,0x0b,0x06,0x4d,0x20,0x06,0x01,0x06,0x06,0x1a,0x0e,0x00,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x01, +0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x00,0x37,0x21,0x35,0x21,0x26,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x68,0x9d,0xe1,0xd6,0x01,0x11,0x10,0xfd,0x85,0x02,0x79,0x1a,0xfe,0xf1,0xd9,0xcb,0xa6,0x9a,0xd7,0x01,0x35,0x01,0x82,0xfe,0x8d,0xfe,0xd1,0xe7,0x3c,0xa3,0x60,0x01, +0x0f,0xf1,0x97,0xf5,0x01,0x0f,0x56,0xb0,0x3e,0xfe,0x61,0xfe,0xa5,0xfe,0xc1,0xfe,0x6f,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x07,0xc6,0x05,0xb2,0x00,0x12,0x00,0x1e,0x00,0xcf,0x40,0x2d,0x0a,0x13,0x91,0x59,0x0a,0x04,0x06,0x01,0x91,0x59,0x06,0x04,0x02,0x06,0x91,0x2b,0x30,0x04,0x03,0x10,0x19,0x91,0x59,0x10,0x13,0x02,0x12,0x0d, +0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x7d,0x1c,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x1c,0xb8,0xff,0xe7,0x40,0x19,0x0b,0x06,0x4d,0x1c,0x1c,0x20,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x7d,0x07,0x00,0xb8, +0xff,0xf0,0x40,0x26,0x0d,0x06,0x4d,0x00,0x04,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x20,0x00,0x01,0x00,0x00,0x20,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x03,0x03,0x0b,0x06,0x4d,0x03, +0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x12,0x00,0x21,0x20,0x00,0x11,0x10, +0x00,0x21,0x20,0x00,0x01,0x22,0x00,0x11,0x10,0x12,0x33,0x32,0x12,0x11,0x10,0x02,0x02,0xb2,0xfe,0xb2,0xa8,0xa8,0x01,0x54,0x1e,0x01,0x5e,0x01,0x18,0x01,0x21,0x01,0x59,0xfe,0x9e,0xfe,0xcf,0xfe,0xe2,0xfe,0xa5,0x02,0x8c,0xe3,0xfe,0xff,0xf4,0xdd,0xe6,0xfd,0xf3,0x02,0x9e,0xfd,0x62,0x05,0x9a,0xfd,0x9b,0x01,0x2c,0x01,0x51,0xfe, +0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x01,0x7c,0x03,0xb6,0xfe,0xc8,0xfe,0xef,0xfe,0xe5,0xfe,0xc9,0x01,0x32,0x01,0x17,0x01,0x20,0x01,0x32,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x03,0xfd,0x05,0x9a,0x00,0x14,0x00,0x1d,0x00,0xa6,0x40,0x6d,0x04,0x11,0x01,0x0b,0x0f,0x01,0x0d,0x0a,0x01,0x0f,0x09,0x01,0x02,0x07,0x01,0x10,0x04,0x06, +0x18,0x0b,0x00,0x4d,0x0c,0x02,0x15,0x15,0x02,0x91,0x59,0x15,0x15,0x13,0x00,0x13,0x17,0x91,0x59,0x13,0x03,0x07,0x00,0x12,0x07,0x08,0x0b,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x09,0x0c,0x09,0x01,0x08,0x1a,0x08,0x0c,0x06,0x4d,0x1a,0x08,0x0b,0x06,0x4d,0x1a,0x7d,0x10,0x10,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06, +0x4d,0x00,0x08,0x0b,0x06,0x4d,0x15,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x07,0x08,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x33,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x39,0x11,0x33,0x2b,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18, +0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x21,0x23,0x11,0x23,0x22,0x06,0x07,0x03,0x23,0x13,0x36,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0xfd,0xa8,0xd1,0x3c,0x5b,0x34,0xb4,0xc8,0xda,0x15,0x57,0x3a,0x8f,0x9f,0xff, +0xcf,0x01,0xa0,0xa8,0xe9,0x8e,0x9d,0xa0,0x87,0x02,0x62,0x41,0x71,0xfe,0x50,0x01,0xdf,0x2f,0x69,0x16,0x04,0x1f,0xc8,0x8e,0xb7,0xdd,0xfd,0x60,0x02,0x08,0x86,0x7a,0x7a,0x8e,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x04,0x18,0x02,0x06,0x00,0x44,0x00,0x00,0x00,0x02,0x00,0x77,0xff,0xe8,0x04,0x40,0x05,0xf8,0x00,0x19,0x00,0x27, +0x00,0x96,0x40,0x2c,0x1a,0x07,0x26,0x0a,0x26,0x95,0x59,0x0a,0x0a,0x20,0x00,0x00,0x01,0xec,0x59,0x00,0x01,0x10,0x20,0x95,0x59,0x10,0x16,0x00,0x00,0x1b,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x23,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x23,0xb8,0xff,0xe8,0x40,0x30,0x0b,0x06,0x4d, +0x20,0x23,0x30,0x23,0x02,0x23,0x23,0x29,0x07,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x83,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x2f,0x29,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b, +0x2b,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x01,0x15,0x06,0x07,0x0e,0x02,0x07,0x33,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x02,0x11,0x34,0x12,0x36,0x36,0x37,0x36,0x01,0x15,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0xbe,0x29, +0x5b,0xe1,0xb3,0x73,0x10,0x04,0x78,0xde,0xcb,0xf8,0xfe,0xfd,0xdb,0xec,0xff,0x5c,0xa3,0xc7,0xf2,0x60,0xfd,0x92,0x01,0x2e,0x56,0x75,0x4b,0x89,0xa9,0xad,0x93,0xce,0x05,0xf8,0x9a,0x1e,0x0f,0x22,0x3f,0xce,0xc6,0xae,0xfe,0xea,0xe4,0xeb,0xfe,0xe3,0x01,0x4f,0x01,0x37,0xf2,0x01,0x51,0xaa,0x40,0x2b,0x16,0xfc,0xbe,0x8e,0x50,0x9a, +0x76,0x3a,0xcd,0xa0,0xb0,0xcf,0x00,0x03,0x00,0xa6,0x00,0x00,0x03,0xd1,0x04,0x00,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0xa5,0xb9,0x00,0x03,0xff,0xe8,0x40,0x33,0x0b,0x0c,0x00,0x4c,0x07,0x14,0x0e,0x0e,0x14,0x95,0x59,0x0e,0x0e,0x01,0x15,0x01,0x0d,0x95,0x59,0x01,0x0f,0x00,0x15,0x95,0x59,0x00,0x15,0x07,0x15,0x11,0x84,0x05,0x05, +0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x20,0x18,0x30,0x18,0x02,0x18,0x18,0x1c,0x0e,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x84,0x00,0xb8,0xff,0xfc, +0x40,0x0e,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc0,0x2f,0xe1,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x33,0x11,0x21, +0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x11,0x21,0x32,0x35,0x34,0x23,0xa6,0x01,0xbe,0x97,0xaf,0xc4,0xeb,0xc1,0x8f,0xfe,0xc9,0xf6,0xc6,0xb2,0xfe,0xf6,0x01,0x1c,0xc7,0xdf,0x04,0x00,0x86,0x74,0xc7,0x2b,0x1e,0xcf,0x7d,0xaa,0x03,0x74,0xfe,0xe0,0x9a,0x86,0xfe,0x54,0xfe,0xc4, +0xa1,0x9b,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xdf,0x04,0x00,0x00,0x05,0x00,0x47,0x40,0x20,0x05,0x00,0x95,0x59,0x05,0x0f,0x02,0x15,0x70,0x00,0x01,0x00,0x00,0x07,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xf8,0xb6,0x0b,0x06, +0x4d,0x03,0x2f,0x07,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x5d,0x00,0x3f,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x02,0xdf,0xfe,0x6b,0xa4,0x02,0x39,0x03,0x74,0xfc,0x8c,0x04,0x00,0x00,0x02,0x00,0x12,0xfe,0x8b,0x04,0x23,0x04,0x00,0x00,0x0c,0x00,0x11,0x00,0xba,0x40,0x0d,0x00,0x11,0x01,0x10, +0x05,0x0a,0x0e,0x95,0x59,0x0a,0x0f,0x04,0x00,0xb8,0x01,0x31,0x40,0x1c,0x0d,0x07,0x02,0x0b,0x02,0x0b,0x95,0x59,0x02,0x15,0x0f,0x09,0x09,0x0d,0x07,0x0c,0x0c,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0xed,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf8,0x40,0x20,0x0b, +0x06,0x4d,0x02,0x02,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0d,0x12,0x0d,0x06,0x4d,0x0d,0x0d,0x13,0x07,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x06,0xb8,0x01,0x2c,0x40,0x0d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x03,0x11,0x11,0x07,0x30,0x13, +0x01,0x5d,0x2f,0x33,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0xc4,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x00,0x13,0x21,0x11, +0x33,0x21,0x11,0x23,0x02,0x03,0x04,0x23,0x8b,0xfd,0x06,0x8c,0x5b,0x01,0x06,0x04,0x02,0x14,0x98,0xfe,0xc4,0xe3,0x1b,0xce,0xfe,0x8b,0x01,0x75,0xfe,0x8b,0x02,0x00,0x01,0x7a,0x01,0xfb,0xfc,0x8b,0x02,0xea,0xfe,0x62,0xfe,0xb4,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x04,0x18,0x02,0x06,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x04, +0x00,0x00,0x05,0xf6,0x04,0x00,0x00,0x15,0x00,0xc5,0x40,0x21,0x0a,0x15,0x01,0x07,0x14,0x01,0x07,0x0b,0x01,0x0a,0x0a,0x01,0x09,0x07,0x01,0x09,0x02,0x01,0x0d,0x13,0x01,0x02,0x0c,0x01,0x01,0x08,0x01,0x0e,0x01,0x01,0x10,0x03,0x15,0xb8,0xff,0xf8,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x0a,0x08,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe8, +0x40,0x45,0x0c,0x00,0x4d,0x01,0x18,0x0c,0x00,0x4d,0x02,0x10,0x0c,0x00,0x4d,0x14,0x0b,0x10,0x0f,0x09,0x00,0x04,0x15,0x15,0x00,0x04,0x0a,0x05,0x09,0x14,0x14,0x00,0x18,0x0b,0x06,0x4d,0x00,0x0e,0x04,0x05,0x09,0x42,0x0b,0x09,0x08,0x0c,0x00,0x4d,0x09,0x09,0x16,0x10,0x0f,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04, +0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0xb8,0xff,0xfc,0x40,0x0a,0x0b,0x06,0x4d,0x05,0x40,0x17,0x01,0x2f,0x17,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0xc6,0x2b,0x01,0x10,0xf0,0x2b,0xc2,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x31,0x30,0x2b,0x01,0x2b,0x2b, +0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x05,0xf6,0xde,0xfe,0x36,0x04,0x9c,0x04,0xfe,0x35,0xdb,0x01,0xfc,0xfe,0x23,0xd1,0x01,0xb6,0x04,0x9c,0x04,0x01,0xb6,0xd3,0xfe,0x21,0x01, +0xfa,0xfe,0x06,0x01,0xfa,0xfe,0x06,0x02,0x10,0x01,0xf0,0xfe,0x21,0x01,0xdf,0xfe,0x21,0x01,0xdf,0xfe,0x10,0x00,0x00,0x01,0x00,0x50,0xff,0xe7,0x03,0x3b,0x04,0x19,0x00,0x21,0x00,0xa7,0x40,0x09,0x05,0x12,0x01,0x0c,0x00,0x01,0x10,0x03,0x15,0xb8,0xff,0xe0,0x40,0x3a,0x0b,0x0c,0x00,0x4c,0x19,0x08,0x09,0x09,0x08,0x95,0x59,0x09, +0x09,0x14,0x03,0x11,0x0f,0x14,0x0f,0x95,0x59,0x14,0x10,0x01,0x03,0x20,0x03,0x95,0x59,0x20,0x16,0x19,0x16,0x08,0x08,0x11,0x0c,0x84,0x16,0x16,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d,0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x84,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff, +0xf0,0x40,0x0d,0x0b,0x06,0x4d,0x20,0x05,0x30,0x05,0x02,0x05,0x05,0x23,0x11,0x00,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc0,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x2b, +0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x37,0x35,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x50,0x86,0xb3,0x01,0x0f,0xfe,0xd7,0x65,0x60,0x01,0x05,0x78,0x68,0x95,0x96,0xaa,0x8e,0x01,0x76, +0x6f,0x64,0x72,0x8a,0xe2,0xc6,0xd3,0x1d,0xa1,0x4b,0xac,0xaa,0x8b,0xa2,0x45,0x52,0x4b,0x99,0x3e,0xfe,0xed,0x59,0x81,0x15,0x05,0x09,0x88,0x68,0x8c,0xa6,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x0d,0x00,0x92,0x40,0x2d,0x7c,0x0c,0x01,0x79,0x0b,0x01,0x73,0x05,0x01,0x76,0x04,0x01,0x46,0x09,0x01,0x4a,0x02,0x01, +0x09,0x02,0x08,0x0d,0x0f,0x05,0x00,0x15,0x0c,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x00,0xef,0x01,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0x40,0x29,0x0b,0x06,0x4d,0x01,0x01,0x0f,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06, +0x4d,0x09,0x10,0x0b,0x06,0x4d,0x09,0xef,0x06,0x05,0x0d,0x06,0x4d,0x06,0x01,0x0b,0x06,0x4d,0x06,0x40,0x0f,0x01,0x2f,0x0f,0x01,0x5d,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x3f,0x33,0x39,0x39,0x5d,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23, +0x11,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x36,0x37,0x01,0x33,0x04,0x00,0x94,0x16,0x2d,0xfe,0x27,0xaa,0x96,0x0c,0x28,0x01,0xe6,0xaa,0x03,0x31,0x2b,0x4e,0xfd,0x48,0x04,0x00,0xfc,0xd9,0x1d,0x46,0x02,0xc4,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x05,0xf2,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x06,0x07,0xcd,0x00,0x00,0x00,0x13, +0x40,0x0b,0x01,0x0d,0x14,0x0e,0x07,0x0d,0x25,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x10,0xff,0xf2,0x03,0x91,0x04,0x00,0x00,0x0e,0x00,0x96,0x40,0x27,0x00,0x04,0x01,0x10,0x06,0x05,0x20,0x0b,0x0c,0x00,0x4c,0x0e, +0x02,0x95,0x59,0x0e,0x0f,0x09,0x0b,0x06,0x0b,0x95,0x59,0x06,0x00,0x15,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0xed,0x0d,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0x40,0x22,0x0b,0x06,0x4d,0x0d,0x0d,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d, +0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x08,0x0d,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x0a,0x0b,0x06,0x4d,0x01,0x01,0x10,0x08,0x3f,0x10,0x01,0x5d,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b, +0x31,0x30,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x03,0x91,0xa3,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0xf8,0x04,0x00,0x00,0x13,0x00,0xad, +0x40,0x0a,0x79,0x12,0x01,0x77,0x0e,0x01,0x75,0x0d,0x01,0x0d,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x00,0x4d,0x06,0x10,0x0b,0x0c,0x00,0x4c,0x05,0xb8,0xff,0xf0,0x40,0x2f,0x0b,0x0c,0x00,0x4c,0x10,0x40,0x0c,0x00,0x4d,0x02,0x09,0x10,0x03,0x0d,0x13,0x0f,0x0a,0x05,0x00,0x15,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00, +0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x01,0x01,0x15,0x0d,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x12,0x0c,0x06,0x4d,0x0a,0x12,0x0b,0x06,0x4d,0x0a,0xed,0x0b,0xb8,0xff,0xfe,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0x40,0x0c,0x0c,0x06,0x4d,0x0b,0x07,0x0b, +0x06,0x4d,0x0b,0x3f,0x15,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x32,0x3f,0x33,0x17,0x39,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01, +0x33,0x04,0xf8,0xa2,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49,0x01,0x06,0xda,0x03,0x4c,0x40,0x7c,0xfd,0x70,0x02,0x90,0x35,0x87,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x49,0x81,0xc6,0x02,0xa0,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x0b,0x00,0x6a,0x40,0x22,0x09,0x02,0x95,0x59, +0x09,0x09,0x07,0x0b,0x0f,0x04,0x00,0x15,0x09,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0xb8,0xff,0xfb,0x40,0x24,0x0b,0x06,0x4d,0x01,0x01,0x0d,0x08,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d, +0x05,0x40,0x0d,0x01,0x2f,0x0d,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xf8,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x01,0xd1,0xfe,0x2f,0x04,0x00, +0xfe,0x5c,0x01,0xa4,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x07,0x00,0x60,0x40,0x1e,0x07,0x02,0x95,0x59,0x07,0x0f,0x04,0x00,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01, +0x01,0x01,0xb8,0xff,0xfb,0x40,0x23,0x0b,0x06,0x4d,0x01,0x01,0x09,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0x05,0x0d,0x06,0x4d,0x05,0x40,0x09,0x01,0x2f,0x09,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x2b, +0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x03,0xf8,0xa4,0xfd,0xf6,0xa4,0x03,0x52,0x03,0x74,0xfc,0x8c,0x04,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x06,0x00,0x53,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x29, +0x04,0x00,0x00,0x07,0x00,0x47,0x40,0x2d,0x04,0x00,0x07,0x00,0x95,0x59,0x07,0x0f,0x02,0x15,0x00,0x0e,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0x03,0x05,0x42,0x1f,0x05,0x01,0x05,0x05,0x08,0x03,0x04,0x0d,0x06,0x4d,0x03,0x2f,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xf1,0x2b, +0x2b,0x2b,0xe2,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x29,0xfe,0xcd,0xa4,0xfe,0xcc,0x03,0x0b,0x03,0x74,0xfc,0x8c,0x03,0x74,0x8c,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x02,0x06,0x00,0x5c,0x00,0x00,0x00,0x03,0x00,0x60,0xfe,0x1e,0x05,0x1c,0x05,0xb2, +0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0xe4,0x40,0x19,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x95,0x59,0x0e,0x10,0x1f,0x03,0x00,0x17,0x00,0x17,0x95,0x59,0x00,0x16,0x0d,0x04,0x01,0x1c,0x24,0xb8,0xff,0xf0,0x40,0x1c,0x0b,0x0c,0x00,0x4c,0x1b,0x10,0x0b,0x0c,0x00,0x4c,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06, +0x4d,0x1b,0x83,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x12,0xb8,0xff,0xe8,0x40,0x43,0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x08,0x0b,0x06,0x4d,0x24,0x83,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x18,0x0b, +0x06,0x4d,0x07,0x07,0x28,0x0c,0x0d,0x16,0x20,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0xed,0x02,0xb8,0xff,0xfb,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xfd,0x40,0x0c,0x0b,0x06,0x4d,0x2f,0x02,0x01,0x02,0x2f,0x29,0x3f,0x29,0x02,0x5d,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39, +0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x05,0x11,0x23,0x11,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x00,0x15,0x14, +0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x08,0x94,0x20,0xe0,0xfe,0xec,0x01,0x17,0xe5,0x18,0x94,0x16,0xe7,0x01,0x17,0xfe,0xee,0xdf,0x23,0x16,0x9c,0xba,0xb7,0x9a,0xaf,0x18,0x9a,0xba,0xbb,0x9d,0x18,0xfe,0x36,0x01,0xca,0x01,0x22,0xea,0xf9,0x01,0x2b,0x01,0x9a, +0xfe,0x66,0xfe,0xd7,0xfb,0xea,0xfe,0xde,0x03,0xa6,0xfc,0xe4,0xd3,0xb5,0xbe,0xd6,0xfc,0xe4,0x03,0x1c,0xd7,0xbd,0xb3,0xd5,0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x02,0x06,0x00,0x5b,0x00,0x00,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x8f,0x04,0x00,0x00,0x0b,0x00,0x93,0xb9,0x00,0x01,0x01,0x31,0x40,0x17,0x05,0x09,0x0f, +0x07,0x02,0x0a,0x02,0x0a,0x95,0x59,0x02,0x15,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x10,0x0b,0x06,0x4d,0x0b,0xba,0x01,0x2c,0x00,0x02,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf0,0x40,0x38,0x0b,0x06,0x4d,0x02,0x02,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x08, +0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x07,0x0d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x03,0x08,0x0d,0x06,0x4d,0x03,0x04,0x0c,0x06,0x4d,0x03,0x40,0x0d,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x11, +0x12,0x00,0x39,0x18,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x04,0x8f,0x8d,0xfc,0xa4,0xa4,0x02,0x0a,0xa4,0x97,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x03,0xdf,0x04,0x00,0x00,0x0f,0x00,0x67,0x40,0x46,0x0d,0x02,0x0b,0x04, +0x0b,0xec,0x59,0x04,0x04,0x00,0x08,0x0f,0x0f,0x00,0x15,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x02,0x0f,0x84,0x7f,0x0e,0x01,0x0e,0x0e,0x11,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x07,0x05,0x0d,0x06,0x4d,0x07,0x05,0x0c,0x06,0x4d,0x07,0x2f, +0x11,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0xe1,0x33,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x32,0x12,0x39,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x03,0xdf,0xa3,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0x01,0x9c,0x62, +0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0x00,0x01,0x00,0xa6,0x00,0x00,0x05,0xc0,0x04,0x00,0x00,0x0b,0x00,0xad,0x40,0x1f,0x07,0x03,0x0b,0x0f,0x05,0x00,0x09,0x00,0x09,0x95,0x59,0x00,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x09,0x84,0x00,0xb8,0xff,0xf8,0x40,0x1b,0x0b,0x06, +0x4d,0x00,0x0e,0x08,0x01,0x05,0x42,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x22,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x01,0x0c,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d, +0x08,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xfc,0x40,0x0c,0x0b,0x06,0x4d,0x05,0x05,0x0d,0x0c,0x3f,0x0d,0x4f,0x0d,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf1,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18, +0x3f,0x33,0x33,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x05,0xc0,0xfa,0xe6,0xa4,0x01,0x98,0xa3,0x01,0x97,0xa4,0x04,0x00,0xfc,0x8c,0x03,0x74,0xfc,0x8c,0x03,0x74,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x06,0x5a,0x04,0x00,0x00,0x0f,0x00,0xf2,0xb9,0x00,0x01,0x01,0x31,0x40,0x1e,0x09,0x05,0x0d,0x0f,0x0b, +0x07,0x02,0x0e,0x02,0x0e,0x95,0x59,0x02,0x15,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x10,0x0b,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf0,0x40,0x1c,0x0b,0x06,0x4d,0x02,0x02,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06, +0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0e,0x07,0x0d,0x06,0x4d,0x0e,0xb8,0xff,0xf9,0x40,0x1b,0x0b,0x06,0x4d,0x0e,0x0e,0x0a,0x07,0x03,0x42,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x32,0x0c,0x06,0x4d,0x03,0x08, +0x0b,0x06,0x4d,0x03,0x03,0x10,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0e,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x3f,0x11,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1, +0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc1,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x06,0x5a,0x8f,0xfa,0xdb,0xa4,0x01,0x97,0xa4,0x01, +0x98,0xa4,0x99,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x04,0x64,0x04,0x00,0x00,0x0c,0x00,0x13,0x00,0x7e,0x40,0x26,0x05,0x0d,0x95,0x59,0x05,0x05,0x04,0x0e,0x04,0x01,0x95,0x59,0x04,0x0f,0x00,0x0e,0x95,0x59,0x00,0x15,0x09,0x08,0x0d,0x06,0x4d,0x09, +0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x83,0x11,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x06,0x4d,0x11,0x11,0x15,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x00,0x02,0x02,0x14,0x00,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x00,0x2f,0x2b, +0x12,0x39,0x2f,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x56,0xfe,0xc8,0x01,0xdc,0x01,0x14,0x9d,0xb9, +0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x03,0x74,0x8c,0xfe,0x77,0xa3,0x94,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x03,0x00,0xa6,0x00,0x00,0x05,0x06,0x04,0x00,0x00,0x03,0x00,0x0e,0x00,0x15,0x00,0xb0,0xb9,0x00,0x09,0xff,0xe8,0x40,0x2f,0x0b,0x00,0x4d,0x07,0x0f,0x95,0x59,0x07,0x07,0x10,0x02,0x05,0x0f,0x01,0x04,0x04,0x10, +0x95,0x59,0x04,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0x04,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0x40,0x1c,0x0b,0x06,0x4d,0x01,0x01,0x17,0x04,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x83,0x10,0x13,0x01,0x13,0x08,0x0d,0x06,0x4d,0x13,0xb8, +0xff,0xf8,0x40,0x19,0x0c,0x06,0x4d,0x13,0x13,0x17,0x07,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x84,0x04,0xb8,0xff,0xfc,0x40,0x09,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f, +0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x21,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x05,0x06,0xa2,0xa2,0xfb,0xa0,0xa4,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce, +0x04,0x00,0xfc,0x00,0x04,0x00,0xfe,0x77,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0xb4,0x04,0x00,0x00,0x0a,0x00,0x11,0x00,0x74,0x40,0x21,0x03,0x0b,0x95,0x59,0x03,0x03,0x0c,0x01,0x0f,0x00,0x0c,0x95,0x59,0x00,0x15,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b, +0x06,0x4d,0x07,0x83,0x0f,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf0,0x40,0x19,0x0d,0x06,0x4d,0x0f,0x0f,0x13,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x00,0x02,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b, +0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x33,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0xa4,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x04,0x00,0xfe,0x77,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe, +0xa2,0xb4,0xaa,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x04,0x18,0x00,0x18,0x00,0x99,0x40,0x09,0x00,0x16,0x01,0x00,0x12,0x01,0x10,0x05,0x05,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xf0,0x40,0x36,0x0c,0x06,0x4d,0x09,0x06,0x95,0x59,0x09,0x09,0x03,0x11,0x0e,0x0c,0x11,0x0c,0x95,0x59,0x11,0x10,0x00,0x01, +0x01,0x0c,0x03,0x01,0x03,0x17,0x03,0x95,0x59,0x17,0x16,0x07,0x07,0x00,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x83,0x09,0x06,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x0d,0x0c,0x06,0x4d,0x20,0x06,0x30,0x06,0x02,0x06,0x06,0x1a,0x0e,0x00,0x2f,0xc4,0x12,0x39,0x2f, +0x5d,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x01,0x2b,0x31,0x30,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x11, +0x14,0x00,0x23,0x22,0x5a,0x74,0x96,0x91,0xb3,0x08,0xfe,0x4c,0x01,0xb4,0x0c,0xb2,0x94,0x8f,0x69,0x6a,0x90,0xf4,0x01,0x06,0xfe,0xf3,0xe3,0x9d,0x2d,0x9b,0x56,0xb3,0x99,0x8c,0x98,0xac,0x4e,0xa2,0x36,0xfe,0xe3,0xfe,0xfd,0xf1,0xfe,0xe1,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0x1e,0x04,0x18,0x00,0x12,0x00,0x1a,0x00,0xb7,0x40,0x33, +0x00,0x0b,0x01,0x10,0x06,0x0a,0x13,0x95,0x59,0x0a,0x10,0x10,0x17,0x95,0x59,0x10,0x16,0x06,0x01,0x95,0x59,0x06,0x06,0x03,0x04,0x0f,0x03,0x15,0x07,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x19,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xe0,0x40,0x19, +0x0b,0x06,0x4d,0x19,0x19,0x1c,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x83,0x07,0x00,0xb8,0xff,0xe0,0x40,0x19,0x0b,0x06,0x4d,0x00,0x00,0x1c,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x03, +0x08,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x36,0x24,0x33, +0x32,0x12,0x11,0x14,0x00,0x23,0x22,0x02,0x01,0x20,0x11,0x10,0x21,0x20,0x11,0x10,0x02,0x6c,0xfe,0xde,0xa4,0xa4,0x01,0x24,0x1a,0x01,0x01,0xc9,0xdb,0xf1,0xfe,0xfe,0xe2,0xd5,0xef,0x01,0xce,0xfe,0xce,0x01,0x36,0x01,0x2f,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0xd2,0xea,0xfe,0xec,0xff,0x00,0xf9,0xfe,0xdd,0x01,0x01,0x02,0xa5, +0xfe,0x70,0xfe,0x74,0x01,0x8c,0x01,0x90,0x00,0x02,0x00,0x3e,0x00,0x00,0x03,0x62,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0xae,0x40,0x5a,0x02,0x06,0x01,0x10,0x04,0x0a,0x02,0x12,0x02,0x12,0x95,0x59,0x02,0x02,0x11,0x00,0x11,0x13,0x95,0x59,0x11,0x0f,0x06,0x00,0x15,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x06,0x08,0x0b, +0x06,0x4d,0x05,0x08,0x0a,0x08,0x01,0x07,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x83,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x0d,0x07,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x0c,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb6, +0x0b,0x06,0x4d,0x01,0x01,0x1a,0x07,0xb8,0xff,0xf0,0xb5,0x0c,0x06,0x4d,0x06,0x07,0x19,0x10,0xce,0x32,0x2b,0x11,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x39,0x11,0x33,0x2b,0x2b,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39, +0x31,0x30,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x23,0x22,0x07,0x03,0x23,0x13,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x15,0x14,0x33,0x03,0x62,0xa4,0x89,0x63,0x51,0x85,0xbe,0xac,0x3c,0x55,0x78,0x7e,0xc5,0xb2,0x01,0x66,0xa4,0xc2,0xcf,0xc9,0x01,0xa8,0xa0,0xfe,0xf8,0x01,0x3c,0x6e,0x23,0x10,0x90,0x6c, +0x88,0x9f,0xfe,0x31,0x01,0x43,0x9d,0xa6,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x87,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x00,0x8f,0x7f,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x29,0x23,0x0c,0x12,0x3e,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x01,0x00,0x27,0xfe,0x62,0x04,0x14, +0x05,0xec,0x00,0x21,0x00,0xbc,0x40,0x40,0x11,0x0e,0x17,0x14,0x14,0x17,0x96,0x59,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x09,0x03,0x14,0x14,0x13,0x1b,0x18,0x08,0x1b,0x08,0x95,0x59,0x1b,0x0f,0x13,0x00,0x01,0x03,0x20,0x03,0xec,0x59,0x20,0x0c,0x15,0x15,0x15,0x0c,0x00,0x00,0x0d,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d, +0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x83,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0x40,0x1d,0x0b,0x06,0x4d,0x06,0x06,0x23,0x11,0x14,0x17,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x0f,0x0d,0xb8,0xff,0xfc,0x40,0x0a,0x0b, +0x06,0x4d,0x0d,0x40,0x23,0x01,0x2f,0x23,0x01,0x5d,0x5d,0x2f,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x10,0xc0,0x2f,0x00,0x3f,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39, +0x31,0x30,0x01,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x21,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x20,0x11,0x10,0x02,0x23,0x22,0x01,0xd5,0x43,0x3a,0x92,0x8a,0xfe,0xfa,0x76,0xa2,0xa4,0x85,0x85,0xa4,0x01,0x4e,0xfe,0xb2,0x04,0x69,0xd3,0x01,0x84,0xdb,0xe9,0x3a,0xfe,0x7b, +0x9d,0x24,0x01,0x2b,0x01,0x64,0x01,0xef,0xbb,0x8a,0xfd,0xd3,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x8a,0xc2,0xfd,0x87,0xfe,0x5a,0xfe,0x83,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xdf,0x06,0x0a,0x02,0x26,0x02,0x0a,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0x94,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1b,0x08,0x06,0x04,0x05,0x3e,0x01, +0x08,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x60,0x04,0x18,0x00,0x18,0x00,0x86,0xb9,0x00,0x14,0xff,0xf0,0x40,0x52,0x0b,0x0c,0x00,0x4c,0x03,0x08,0x10,0x00,0x4d,0x11,0x12,0x95,0x59,0x11,0x11,0x16,0x08,0x00,0x0b,0x01,0x0d,0x03,0x0b,0x0d,0x08,0x0d,0x95,0x59,0x08,0x10,0x00,0x18,0x01, +0x0c,0x03,0x18,0x16,0x02,0x16,0x95,0x59,0x02,0x16,0x12,0x12,0x13,0x0b,0x00,0x30,0x00,0x01,0x00,0x1a,0x10,0x10,0x0c,0x06,0x4d,0x10,0x13,0x08,0x0d,0x06,0x4d,0x13,0x83,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x32,0x2b,0x11,0x33,0x5d,0x2f,0xc4,0x12,0x39, +0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x25,0x06,0x23,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x03,0x60,0x73,0x9f,0xe5,0xfe,0xf7,0x01,0x14, +0xf2,0x89,0x67,0x64,0x92,0x93,0xb6,0x0d,0x01,0xb4,0xfe,0x4a,0x08,0xb2,0x94,0x92,0x78,0x2d,0x45,0x01,0x1b,0xef,0x01,0x02,0x01,0x24,0x32,0xa2,0x4a,0xb0,0x94,0x8c,0x97,0xb5,0x5b,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x04,0x18,0x02,0x06,0x00,0x56,0x00,0x00,0xff,0xff,0xff,0xd3,0x00,0x00,0x02,0x1a,0x05,0x87,0x02,0x26, +0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x56,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x02,0x00,0x10,0xff,0xf2,0x05,0xfc,0x04,0x00,0x00,0x15,0x00,0x1c,0x00,0xd5,0x40,0x34,0x00,0x03,0x01,0x10,0x06,0x04,0x18,0x0b, +0x0c,0x00,0x4c,0x08,0x0a,0x05,0x0a,0x95,0x59,0x05,0x00,0x0e,0x16,0x95,0x59,0x0e,0x0e,0x0c,0x17,0x0c,0x02,0x95,0x59,0x0c,0x0f,0x00,0x17,0x95,0x59,0x00,0x15,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0xed,0x0c,0xb8,0xff,0xe8,0x40,0x19,0x0d,0x06,0x4d,0x0c,0x0c,0x00,0x07,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c, +0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x83,0x1a,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xfc,0x40,0x19,0x0c,0x06,0x4d,0x1a,0x1a,0x1e,0x0e,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08,0x0c,0x06,0x4d,0x17,0x08,0x0b,0x06,0x4d,0x17,0x84,0x00,0xb8,0xff,0xfc,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00, +0xb8,0xff,0xf4,0x40,0x0a,0x0b,0x06,0x4d,0x00,0x00,0x1e,0x07,0x4f,0x1e,0x01,0x5d,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x2b, +0x00,0x18,0x10,0xc6,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x02,0xee,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x01,0x15,0x9d,0xb9,0xbb,0x8d,0xfe,0xdd,0xf6,0xcd, +0xcf,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0xfe,0x77,0xa4,0x94,0x92,0xad,0x01,0xe9,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xa6,0x00,0x00,0x06,0x14,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0xb7,0x40,0x28,0x08,0x01,0x13,0x0b,0x0b,0x13,0x95,0x59,0x0b,0x0b,0x14,0x06,0x0a,0x0f,0x03,0x00,0x00,0x14,0x95,0x59,0x00,0x15, +0x0f,0x04,0x0d,0x06,0x4d,0x0f,0x04,0x0c,0x06,0x4d,0x0f,0x04,0x0b,0x06,0x4d,0x0f,0x83,0x17,0xb8,0xff,0xf0,0x40,0x1a,0x0d,0x06,0x4d,0x17,0x17,0x1b,0x0b,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x84,0x00,0xb8,0xff,0xf9,0x40,0x09,0x0d,0x06,0x4d,0x00,0x14,0x0c,0x06,0x4d,0x00,0xb8, +0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x00,0x00,0x1b,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x84,0x04,0xb8,0xff,0xf8,0x40,0x0c,0x0d,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x4f,0x1b,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b, +0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x06,0xfe,0x44,0xa4,0xa4,0x01, +0xbc,0xa4,0x01,0x14,0xa1,0xb5,0xb8,0x8f,0xfe,0xdd,0xf6,0xcc,0xce,0x01,0xdd,0xfe,0x23,0x04,0x00,0xfe,0x6a,0x01,0x96,0xfe,0x6a,0x9e,0x92,0x93,0xa7,0x01,0xdd,0xfe,0xaf,0xae,0xa3,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xfe,0x05,0xec,0x00,0x19,0x00,0xb4,0x40,0x3f,0x02,0x18,0x01,0x02,0x18,0x01,0x10,0x04,0x0d,0x0a,0x13,0x10, +0x10,0x13,0x96,0x59,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x09,0x03,0x10,0x10,0x0f,0x17,0x15,0x04,0x17,0x04,0x95,0x59,0x17,0x0f,0x0f,0x00,0x08,0x00,0x15,0x12,0x12,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c, +0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d,0x01,0x01,0x1b,0x0d,0x10,0x13,0x03,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x0b,0x09,0xb8,0xff,0xfc,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x1b,0x01,0x5d,0x2f,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b, +0xe1,0x2b,0x2b,0x2b,0x10,0xc0,0x2f,0x00,0x3f,0x33,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x20,0x11, +0x03,0xfe,0xa4,0xec,0x7b,0xa3,0xa4,0x85,0x85,0xa4,0x01,0x4e,0xfe,0xb2,0x04,0x77,0xd9,0x01,0x5a,0x02,0x33,0x01,0x41,0xba,0x95,0xfd,0xdb,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x8c,0xc2,0xfe,0x5e,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0a,0x02,0x26,0x01,0x67,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1f,0x00,0x00,0x00,0x13, +0x40,0x0b,0x01,0x00,0x0e,0x0e,0x07,0x0a,0x3e,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0xf2,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x07,0xcd,0xa0,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1b,0x15,0x0c,0x00,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, +0x00,0x01,0x00,0xa6,0xfe,0x8b,0x03,0xf8,0x04,0x00,0x00,0x0b,0x00,0x9c,0xb3,0x07,0x0b,0x0f,0x02,0xb8,0x01,0x31,0x40,0x18,0x04,0x00,0x00,0x09,0x95,0x59,0x00,0x15,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0xbb,0x01,0x2c,0x00,0x04,0x00,0x04,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x08,0x09,0x04, +0xb8,0x01,0x2c,0x40,0x17,0xff,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x09,0x01,0x09,0xb8,0xff,0xf8,0x40,0x23,0x0b,0x06,0x4d,0x09,0x09,0x0d,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0x40,0x0d, +0x01,0x2f,0x0d,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x33,0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xf8,0xfe,0x9e,0x8e,0xfe,0x9e,0xa4,0x02,0x0a, +0xa4,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x06,0xa2,0x00,0x07,0x00,0x75,0x40,0x19,0x05,0x00,0x91,0x59,0x06,0x05,0x03,0x02,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x05,0xb8,0x01,0x2c,0x40,0x09,0x70,0x00,0x01,0x00,0x08,0x0d, +0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x18,0x0b,0x06,0x4d,0x00,0x00,0x09,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x03,0x04,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33, +0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xcd,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x03,0xa4,0xfd,0xc0,0xa8,0x02,0x58,0x90,0x05,0x02,0xfa,0xfe,0x05,0x9a,0x01,0x08,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xe6,0x05,0x0e,0x00,0x07,0x00,0x62,0x40,0x19,0x05,0x00,0x95,0x59,0x06,0x05,0x0f,0x02, +0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x05,0xb8,0x01,0x2c,0x40,0x1d,0x70,0x00,0x01,0x00,0x18,0x0d,0x06,0x4d,0x00,0x00,0x09,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x03,0x12,0x0b,0x06,0x4d, +0x03,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xcd,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x02,0xe6,0xfe,0x64,0xa4,0x01,0xb0,0x90,0x03,0x74,0xfc,0x8c,0x04,0x00,0x01,0x0e,0xff,0xff,0x00,0x00,0x01,0xfa,0x08,0x00,0x02,0x7b,0x02,0x06,0x00,0xb3,0x00,0x00, +0x00,0x04,0x00,0xbc,0x00,0x00,0x08,0x9a,0x05,0xae,0x00,0x0b,0x00,0x14,0x00,0x26,0x00,0x2a,0x00,0xd8,0x40,0x52,0x06,0x20,0x01,0x0a,0x16,0x01,0x04,0x0b,0x01,0x03,0x07,0x01,0x03,0x0f,0x05,0x01,0x0f,0x01,0x01,0x10,0x04,0x29,0x28,0x96,0x59,0x29,0x00,0x00,0x11,0x96,0x59,0x00,0x00,0x06,0x06,0x0c,0x96,0x59,0x06,0x04,0x20,0x26, +0x03,0x1d,0x15,0x12,0x2a,0x29,0x2a,0x29,0x03,0x09,0x8b,0x13,0x13,0x2c,0x0f,0x8b,0x03,0x03,0x2c,0x1e,0x16,0x22,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x7e,0x24,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xf0,0x40,0x1f,0x0c,0x06,0x4d,0x24,0x0a,0x0b,0x06,0x4d,0x24,0x24,0x2c, +0x20,0x1a,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d,0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x7e,0x1e,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1e,0xb8,0xff,0xfc,0x40,0x09,0x0c,0x06,0x4d,0x1e,0x04,0x0b,0x06,0x4d,0x1e,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x33, +0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0x33,0x3f,0x33,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x10,0x33,0x32,0x11, +0x10,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x33,0x26,0x35,0x11,0x33,0x01,0x21,0x35,0x21,0x07,0x1c,0xaf,0xc3,0xcb,0xba,0xb0,0xbb,0xcb,0xa8,0x6c,0x79,0xe1,0xdd,0xfd,0x02,0xd1,0xfd,0x5f,0x20,0x0e,0x06,0x08,0xa8,0xdc,0x02,0xc6,0x04,0x08,0xa8,0x03,0x79,0xfd,0x4d,0x02,0xb3,0x02,0x5c,0xde,0xc4,0xd1, +0xdf,0xda,0xc8,0xc6,0xea,0x02,0xcb,0x99,0x8c,0xfe,0xe2,0x01,0x20,0x01,0x23,0xfa,0xd9,0x04,0x70,0x37,0x21,0x2e,0x94,0xfb,0xfa,0x05,0x9a,0xfb,0x43,0x31,0xa0,0x03,0xec,0xfb,0xa4,0x84,0x00,0x01,0x00,0x11,0xff,0xf4,0x04,0xaf,0x04,0x00,0x00,0x1a,0x00,0xb2,0x40,0x36,0x00,0x18,0x01,0x0d,0x0a,0x01,0x10,0x04,0x16,0x00,0x14,0x0d, +0x00,0x1a,0x00,0x95,0x59,0x1a,0x0f,0x06,0x04,0x09,0x04,0xec,0x59,0x09,0x10,0x15,0x00,0x00,0x02,0x06,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x7f,0x0b,0x01,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0x40,0x27,0x0b, +0x06,0x4d,0x0b,0x0b,0x1c,0x13,0x16,0x16,0x1b,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x13,0x17,0x0d,0x06,0x4d,0x13,0x12,0x0c,0x06,0x4d,0x13,0xb8,0xff,0xe8,0xb3,0x0b,0x06,0x4d,0x13,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b, +0x2b,0x5d,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x10,0xc2,0x2f,0x00,0x3f,0xc4,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x10,0xc4,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x21,0x11,0x14,0x07,0x23,0x36,0x35,0x11,0x06,0x07,0x35,0x36,0x33,0x21,0x04, +0xaf,0xde,0x65,0x22,0x36,0x3d,0x3d,0xe8,0xfe,0x7b,0x20,0xa7,0x24,0x7b,0x78,0x4b,0xaa,0x03,0xa9,0x03,0x7b,0xfd,0x95,0x8c,0x13,0x8c,0x17,0x01,0x15,0x02,0x72,0xfd,0x9d,0xc0,0x58,0x57,0xc1,0x02,0x63,0x03,0x56,0x96,0x48,0x00,0x00,0x02,0x00,0x2f,0x02,0x48,0x02,0xaa,0x05,0x9a,0x00,0x0c,0x00,0x11,0x00,0x4a,0x40,0x18,0x0c,0x0b, +0x0b,0x02,0xcc,0x0d,0x06,0x09,0x16,0x09,0x02,0x09,0x03,0x03,0x13,0x11,0x4f,0x06,0x7f,0x06,0x02,0x06,0x04,0x01,0xb8,0x01,0x56,0x40,0x0f,0x0c,0x06,0x0f,0x0d,0x1f,0x0d,0x02,0x0d,0x0d,0x02,0x0e,0x0a,0x27,0x02,0x28,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x01,0x2f,0x5d,0x33,0x12,0x39,0x2f,0x33,0x5d,0x33, +0xed,0x32,0x11,0x33,0x30,0x31,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x36,0x12,0x37,0x33,0x11,0x33,0x23,0x11,0x06,0x06,0x07,0x02,0xaa,0x6e,0x84,0xfe,0x77,0x69,0xba,0x4e,0x9c,0x6e,0xf2,0x3e,0x80,0x42,0x03,0x14,0xcc,0xcc,0x5c,0x79,0x01,0x13,0x9e,0xfd,0xe7,0x01,0x73,0x71,0xb3,0x4f,0x00,0x00,0x01,0x00,0x7b,0x02,0x33,0x02,0x8a, +0x05,0x9e,0x00,0x24,0x00,0x37,0x40,0x1e,0x04,0x1c,0x14,0x1c,0x02,0x12,0x1e,0xcc,0x08,0x08,0x26,0x14,0xcc,0x01,0x0f,0x0a,0xe6,0x19,0x19,0x10,0x01,0x03,0xe6,0x00,0x23,0x29,0x12,0xe6,0x10,0x27,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x5d,0x13,0x35,0x16, +0x33,0x32,0x3e,0x02,0x35,0x34,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x07,0x32,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x7e,0x71,0x57,0x2a,0x45,0x31,0x1a,0xcc,0x14,0x30,0x31,0x31,0x13,0x30,0x01,0xb7,0xfe,0xb5,0x19,0x07,0x15,0x17,0x16,0x06,0x40,0x74,0x56,0x33,0x36,0x5b,0x76,0x3f,0x7d,0x02,0x5e, +0x92,0x46,0x18,0x2a,0x3b,0x23,0x98,0x01,0x03,0x03,0x01,0x01,0xc4,0x7c,0xc8,0x01,0x01,0x01,0x22,0x43,0x65,0x43,0x48,0x6b,0x47,0x23,0x00,0x01,0x00,0x4d,0x02,0x48,0x02,0xa0,0x05,0xa4,0x00,0x0a,0x00,0x2a,0x40,0x15,0x03,0x06,0x0a,0xcc,0x00,0x06,0x00,0x06,0x00,0x0c,0x1f,0x05,0x01,0x05,0x0a,0x28,0x07,0x03,0xe6,0x05,0x27,0x00, +0x3f,0xed,0x32,0x3f,0x01,0x2f,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x30,0x31,0x13,0x36,0x12,0x37,0x21,0x35,0x21,0x15,0x06,0x02,0x07,0xb3,0x38,0x99,0x70,0xfe,0x59,0x02,0x53,0x79,0xaf,0x33,0x02,0x48,0xc6,0x01,0x75,0xab,0x76,0x35,0xb9,0xfe,0x6e,0xdc,0x00,0x03,0x00,0x41,0x02,0x34,0x02,0xad,0x05,0xae,0x00,0x23, +0x00,0x31,0x00,0x45,0x00,0x53,0x40,0x30,0x15,0x05,0x08,0x3c,0xcc,0x12,0x12,0x1a,0xcc,0x60,0x2a,0x01,0x2a,0x2a,0x47,0x00,0x32,0xcc,0x08,0x08,0x24,0xcc,0x00,0x40,0x0a,0x0f,0x48,0x00,0x15,0x05,0x2f,0xe6,0x0f,0x37,0x1f,0x37,0x02,0x37,0x37,0x0d,0x27,0xe6,0x1f,0x29,0x41,0xe6,0x0d,0x27,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f, +0x5d,0xed,0x39,0x39,0x01,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x30,0x31,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02, +0x23,0x22,0x06,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x41,0x14,0x27,0x39,0x25,0x34,0x3c,0x27,0x47,0x63,0x3c,0x3d,0x63,0x46,0x27,0x3b,0x35,0x23,0x39,0x28,0x15,0x2c,0x51,0x73,0x46,0x46,0x72,0x51,0x2d,0x90,0x58,0x4e,0x4e,0x5c,0x17,0x2c,0x3f,0x28,0x4a,0x5c,0x20,0x14,0x24,0x31,0x1d, +0x1d,0x32,0x25,0x15,0x14,0x25,0x32,0x1e,0x1f,0x32,0x22,0x13,0x03,0x32,0x21,0x41,0x3b,0x32,0x11,0x21,0x5d,0x38,0x31,0x55,0x3d,0x23,0x23,0x3e,0x54,0x31,0x39,0x5d,0x20,0x11,0x33,0x3b,0x41,0x20,0x3b,0x5e,0x42,0x23,0x23,0x42,0x5e,0x47,0x48,0x49,0x4b,0x46,0x20,0x38,0x29,0x17,0x51,0x01,0x3b,0x1a,0x2e,0x22,0x14,0x14,0x22,0x2e, +0x1a,0x1b,0x2c,0x20,0x12,0x13,0x20,0x2d,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x04,0x00,0x02,0x06,0x00,0xd6,0x00,0x00,0xff,0xff,0x00,0x79,0xfe,0x85,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x06,0x01,0x9c,0x7b,0x00,0xff,0xff,0x00,0x68,0xfe,0x85,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06, +0x01,0x9c,0x09,0x00,0x00,0x02,0x00,0x64,0x01,0x02,0x04,0x0e,0x04,0xaa,0x00,0x1b,0x00,0x27,0x00,0x68,0x40,0x3b,0x02,0x06,0x09,0x0d,0x10,0x14,0x17,0x1b,0x08,0x04,0x12,0x01,0x07,0x04,0x40,0x22,0x04,0xbe,0x59,0x22,0x0e,0x12,0x12,0x1c,0xbe,0x59,0x15,0x0f,0x12,0x16,0x00,0x00,0x19,0x0e,0x08,0x0b,0x40,0x02,0x06,0x09,0x0d,0x10, +0x14,0x17,0x1b,0x08,0x0b,0x19,0xbd,0x25,0x0b,0x25,0x42,0x25,0x25,0x29,0x1f,0xbd,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x11,0x17,0x39,0x1a,0x18,0x10,0xde,0xc4,0x10,0xca,0x2f,0xc4,0x00,0x2f,0xde,0xc4,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x1a,0x18,0x10,0xde,0xc4,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x27,0x06, +0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x17,0x37,0x17,0x07,0x16,0x15,0x14,0x07,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04,0x0e,0x5c,0x89,0x69,0x86,0x88,0x68,0x8a,0x5c,0x8a,0x4c,0x4c,0x8a,0x5c,0x8a,0x6e,0x82,0x81,0x6c,0x8b,0x5c,0x89,0x4e,0x4e,0xfe,0xb5,0x74, +0x9f,0xa1,0x72,0x71,0xa3,0xa6,0x01,0x62,0x60,0x8a,0x4c,0x4c,0x8a,0x60,0x86,0x71,0x7c,0x81,0x6c,0x88,0x60,0x89,0x4d,0x4d,0x89,0x60,0x88,0x70,0x7d,0x79,0x74,0x02,0x02,0xa2,0x71,0x71,0xa2,0xa2,0x71,0x71,0xa2,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x06,0x3e,0x00,0x19,0x00,0x25,0x00,0xb2,0xb9,0x00,0x0d,0xff,0xf0,0xb3, +0x0b,0x00,0x4d,0x0a,0xb8,0xff,0xf0,0x40,0x14,0x0b,0x00,0x4d,0x06,0xc0,0x02,0xf2,0x0d,0x1a,0x91,0x0f,0x0d,0x12,0x18,0x04,0x20,0x91,0x12,0x13,0x0d,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x06,0x06,0x04,0xc2,0x09,0x09,0x0d,0x00,0x15,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x23, +0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x23,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x23,0xb8,0xff,0xf4,0x40,0x2a,0x0b,0x06,0x4d,0x23,0x23,0x27,0x1d,0x06,0x0d,0x06,0x4d,0x1d,0x06,0x0c,0x06,0x4d,0x1d,0x06,0x0b,0x06,0x4d,0x1d,0x7d,0x15,0x10,0x0d,0x06,0x4d,0x15,0x10,0x0c,0x06,0x4d,0x15,0x10,0x0b,0x06,0x4d,0x15,0x2f,0x27,0x01,0x5d, +0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x32,0x2f,0xf1,0xc2,0x2f,0x2b,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0xed,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x2b,0x2b,0x01,0x16,0x33,0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x23,0x16,0x11,0x10,0x00,0x21,0x20, +0x00,0x11,0x10,0x00,0x21,0x32,0x07,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x04,0x8f,0x30,0x20,0xd6,0x15,0x88,0x12,0x8c,0x7a,0x22,0x98,0xfe,0x8c,0xfe,0xc8,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0xd8,0xe4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x05,0x43,0x09,0x82,0x48,0x3a,0x36,0x50,0x6c, +0x86,0xc2,0xfe,0xdb,0xfe,0xa1,0xfe,0x68,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0x98,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0xa9,0x04,0xfc,0x00,0x18,0x00,0x24,0x00,0x95,0x40,0x2b,0x00,0x80,0x14,0xf2,0x05,0x19,0x95,0x07,0x05,0x0a,0x10,0x10, +0x1f,0x95,0x0a,0x16,0x00,0x00,0x17,0xc2,0x03,0x03,0x10,0x05,0x0d,0x07,0x06,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x83,0x22,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xf7,0xb6,0x0c,0x06,0x4d,0x30,0x22,0x01,0x22,0xb8,0xff,0xe4,0x40,0x27,0x0b,0x06,0x4d,0x22,0x22,0x26,0x1c,0x0a,0x0d, +0x06,0x4d,0x1c,0x0a,0x0c,0x06,0x4d,0x1c,0x0a,0x0b,0x06,0x4d,0x1c,0x83,0x0d,0x10,0x0d,0x06,0x4d,0x0d,0x0e,0x0c,0x06,0x4d,0x0d,0x19,0x0b,0x06,0x4d,0x0d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39, +0xed,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x33,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04,0x10,0x86,0x13,0xdb,0x82,0xfe,0xeb,0xe9,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0x30,0x56,0x3d,0x6d,0x3b, +0x4f,0xfe,0x3a,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x04,0xfc,0x38,0x50,0xc0,0x28,0x8d,0xfb,0xf5,0xfe,0xd9,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0x0e,0x0a,0x47,0x32,0x49,0xfe,0xcc,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x06,0x96,0x00,0x17,0x00,0x86,0x40,0x33,0x25,0x0a,0x35,0x0a, +0x02,0x25,0x08,0x35,0x08,0x02,0x12,0x80,0x17,0xda,0x0c,0x0c,0x05,0x03,0x09,0x91,0x02,0x13,0x12,0x12,0x10,0xc2,0x15,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x0b,0x18,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xd8,0x40,0x18,0x0c,0x06,0x4d,0x0b,0x0b,0x19,0x07,0x08,0x0d,0x06,0x4d,0x07, +0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7e,0x04,0xb8,0xff,0xfc,0x40,0x0c,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x30,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x33,0x10,0xfd,0x1a,0xcc,0x31,0x30,0x5d,0x5d, +0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0x93,0x3c,0x4f,0x15,0x88,0x12,0xfb,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x47,0x31,0x4a,0x3a,0x38,0x50, +0xd2,0x1f,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0xc7,0x04,0xfc,0x00,0x1b,0x00,0x92,0x40,0x32,0x06,0x40,0x10,0x00,0x4d,0x0d,0x10,0x0b,0x0c,0x00,0x4c,0x17,0x80,0x1b,0xf2,0x10,0x08,0x0f,0x02,0x0c,0x95,0x05,0x16,0x00,0x15,0x16,0x16,0x14,0xc2,0x19,0x19,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d, +0x00,0x84,0x02,0x0f,0xb8,0xff,0xe0,0x40,0x32,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x7f,0x0f,0x01,0x0f,0x0f,0x1d,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x09,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x2f,0x1d,0x01,0x5d,0x2f,0x2b,0x2b,0xe1, +0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xd4,0xfd,0x1a,0xcd,0x31,0x30,0x2b,0x2b,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x03,0xe2, +0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x7a,0x3b,0x4f,0x14,0x86,0x13,0xe5,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x47,0x32,0x49,0x3a,0x38,0x50,0xc6,0x24,0x00,0x00,0x01,0x00,0xab,0x04,0xc2,0x01,0xc4,0x06,0x27,0x00,0x11,0x00,0x2b,0x40,0x16,0x0f,0xe2,0x40,0x02,0xc0,0x0b,0x40,0x08, +0x09,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xd5,0x1a,0xcd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0xab,0x25,0x2b,0x58,0x71,0x4d,0x39,0x6c,0x70,0x5e,0x11,0x28,0x06, +0x23,0x04,0x54,0x47,0x3d,0x54,0x07,0x32,0x73,0x4c,0x3f,0x08,0x00,0x01,0x00,0xf2,0xfe,0xc6,0x01,0xb8,0xff,0x89,0x00,0x0b,0x00,0x15,0x40,0x09,0x00,0xc1,0x06,0x09,0xc0,0x03,0x03,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x55,0x29,0x3a,0x3c, +0x27,0x29,0x3a,0x3a,0xfe,0xc6,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x01,0x00,0x66,0x04,0xc2,0x01,0xc2,0x05,0xb8,0x00,0x03,0x00,0x0e,0xb4,0x03,0x01,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0xc2,0x7e,0xde,0xa8,0x04,0xc2,0xf6,0x00,0x01,0x00,0x64,0x04,0xc2,0x01,0xc0,0x05,0xb8, +0x00,0x03,0x00,0x0e,0xb4,0x01,0x03,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x64,0xb4,0xa8,0xdc,0x04,0xc2,0xf6,0xf6,0x00,0x02,0x00,0x42,0x04,0xc2,0x03,0x90,0x06,0x50,0x00,0x03,0x00,0x0a,0x00,0x2e,0xb1,0x01,0x00,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x00,0x00,0x0a,0x04,0x02,0x80,0x00, +0x00,0x80,0x04,0x90,0x04,0xa0,0x04,0x03,0x04,0xc0,0x08,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x39,0x2f,0x2b,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x07,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x34,0xb4,0xa8,0xdd,0x3d,0x79,0xa4,0xa6,0x71,0xd8,0x84,0x05,0x5a,0xf6,0xf6,0x98,0x94,0x94,0xfa,0x00,0x00,0x02,0x00,0x42, +0x04,0xc2,0x03,0x90,0x06,0x50,0x00,0x03,0x00,0x0a,0x00,0x36,0xb1,0x03,0x00,0xb8,0xff,0xc0,0x40,0x1b,0x09,0x0c,0x48,0x00,0x00,0x06,0x80,0x07,0x80,0x07,0x90,0x07,0xa0,0x07,0x03,0x07,0xc0,0x04,0x40,0x0f,0x13,0x48,0x04,0x04,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0x1a,0xcc,0x5d,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0xcd, +0x31,0x30,0x01,0x23,0x27,0x33,0x13,0x37,0x33,0x17,0x23,0x27,0x07,0x01,0x9e,0x7e,0xde,0xa8,0x73,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x05,0x5a,0xf6,0xfe,0x72,0xfa,0xfa,0x94,0x94,0x00,0x02,0x00,0x6c,0x04,0xc2,0x03,0x68,0x06,0xbe,0x00,0x11,0x00,0x18,0x00,0x45,0x40,0x26,0x0f,0xe2,0x40,0x02,0xc0,0x0b,0x40,0x08,0x09,0x09,0x17,0x16, +0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x40,0x11,0x11,0x0b,0x0b,0x80,0x12,0x90,0x12,0xa0,0x12,0x03,0x12,0xc0,0x16,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0xc6,0xc6,0x1a,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xcd,0x39,0x2f,0xd5,0x1a,0xcd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07, +0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x50,0x24,0x2c,0x59,0x6f,0x4b,0x39,0x6d,0x71,0x5f,0x11,0x28,0x4e,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x06,0xba,0x04,0x53,0x48,0x3c,0x54,0x07,0x32,0x73,0x4b,0x40,0x08,0xfe,0x72,0x94,0x94,0xfa,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4, +0x00,0x12,0x00,0x19,0x00,0x41,0x40,0x23,0x12,0x07,0xda,0x0c,0x10,0xda,0x40,0x03,0x09,0x40,0x0d,0x10,0x48,0x09,0x19,0x80,0x13,0x13,0x00,0x17,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x1b,0x1a,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x10,0xc6,0x10,0xc4,0x00,0x2f,0x1a,0xdd,0xd6,0x2b,0xd6, +0x1a,0xfd,0xdc,0xed,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x3b,0x79,0xa4,0xa6,0x70,0xd7,0x85,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7, +0x26,0x26,0x61,0xfd,0xde,0x94,0x94,0xfa,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x34,0x40,0x19,0x02,0x80,0x00,0x04,0x0a,0x0d,0xd9,0x40,0x07,0x02,0x80,0x00,0x00,0x0b,0x0f,0xf3,0x04,0x0b,0xf3,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x11,0x39,0x2f,0x1a, +0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0xc4,0xd4,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x37,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xd7,0xb5,0xa7,0xdd,0xf4,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x05,0xaa,0xf6,0xf6,0x14,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0x38,0x04,0xc2,0x02,0x5c, +0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x36,0x40,0x1a,0x03,0x80,0x01,0x0a,0x04,0x07,0xd9,0x40,0x0d,0x02,0x80,0x00,0x00,0x05,0x09,0xf3,0x0a,0x05,0xf3,0x04,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0xc4,0xd4,0x1a,0xcd,0x31,0x30,0x01,0x23, +0x27,0x33,0x07,0x33,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x01,0xaa,0x7f,0xdd,0xa8,0xbe,0x66,0x10,0x9e,0xa2,0x0a,0x64,0x04,0x96,0x74,0x70,0x9c,0x05,0xaa,0xf6,0xe2,0x86,0x86,0x72,0x8a,0x8c,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x07,0x0a,0x00,0x11,0x00,0x1d,0x00,0x5e,0x40,0x37,0x0f,0xe2,0x40,0x00,0x02,0x10, +0x02,0x20,0x02,0x03,0x02,0xc0,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x0b,0x08,0x09,0x09,0x1b,0x12,0x18,0x1b,0xd9,0x40,0x15,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x0b,0x18,0x1d,0xf3,0x12,0x19,0xf3,0x18,0x18,0x12,0x1f,0x1e,0x11,0x12,0x39,0x39,0x10,0xe1,0x10,0xe1,0x11,0x39,0x2f,0xc6,0xcd,0x1a,0xdc, +0x5d,0x71,0xe1,0x00,0x2f,0x1a,0xfd,0xd4,0xc4,0x12,0x39,0x2f,0xd5,0xcd,0x5d,0x1a,0xdc,0x5d,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xcd,0x25,0x2a,0x5b,0x6f,0x50,0x36,0x6c,0x70,0x5e,0x11,0x28, +0x01,0x7d,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x07,0x06,0x04,0x54,0x48,0x3c,0x54,0x07,0x31,0x72,0x4c,0x40,0x08,0xde,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x1e,0x00,0x50,0x40,0x2c,0x12,0x07,0xda,0x0c,0x10,0xda,0x03,0x0a,0x40,0x0d,0x11,0x48, +0x0a,0x1e,0x19,0x1c,0xd9,0x16,0x1e,0xf3,0x13,0x13,0x00,0x12,0x1a,0xf3,0x19,0x19,0x09,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x20,0x1f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xfd,0xdc,0xc4,0xd6,0x2b,0xd4,0xfd,0xdc,0xed,0xc6, +0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x34,0x0a,0x9d,0x6f,0x76,0x94,0x05,0x65,0x0a,0xa2,0x9c,0x12,0x06,0xe4,0x65, +0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfe,0xda,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x01,0x00,0xab,0x04,0xc2,0x01,0xc4,0x06,0x27,0x00,0x11,0x00,0x3d,0xb3,0x0f,0xe2,0x40,0x02,0xb8,0xff,0xc0,0xb5,0x09,0x0c,0x48,0x02,0xc0,0x0b,0xb8,0xff,0xe8,0x40,0x14,0x09,0x0c,0x48,0x0b,0x40,0x08,0x09,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05, +0x01,0x05,0x80,0x08,0x11,0x0b,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xd5,0x1a,0xcd,0x2b,0x1a,0xdc,0x2b,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0xab,0x25,0x2b,0x58,0x71,0x4d,0x39,0x6c,0x70,0x5e,0x11,0x28,0x06,0x23,0x04,0x54,0x47,0x3d,0x54, +0x07,0x32,0x73,0x4c,0x3f,0x08,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x19,0x00,0x50,0xb3,0x00,0x07,0xda,0x0c,0xb8,0xff,0xc0,0x40,0x09,0x09,0x0c,0x48,0x0c,0x10,0xda,0x40,0x03,0x09,0xb8,0xff,0xc0,0x40,0x1a,0x09,0x0c,0x48,0x09,0x19,0x80,0x17,0x13,0x13,0x00,0x17,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f, +0x00,0x01,0x0a,0x00,0x0a,0x00,0x1b,0x1a,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x10,0xc6,0x10,0xc4,0x00,0x2f,0xc4,0x1a,0xdd,0xd6,0x2b,0xd6,0x1a,0xfd,0xdc,0x2b,0xed,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x23,0x27,0x07,0x23,0x37,0x33, +0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x3b,0x79,0xa4,0xa6,0x70,0xd7,0x85,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfd,0xde,0x94,0x94,0xfa,0x00,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x3b,0xb3,0x02,0x00,0x04,0x0a,0xb8,0xff,0xc0, +0x40,0x18,0x09,0x0c,0x48,0x0a,0x0d,0xd9,0x40,0x07,0x02,0x80,0x00,0x00,0x0b,0x0f,0xf3,0x04,0x0b,0xf3,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x11,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0x2b,0xc4,0xd4,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x37,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16, +0x33,0x32,0x37,0xd7,0xb5,0xa7,0xdd,0xf4,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x05,0xaa,0xf6,0xf6,0x14,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x02,0x00,0x38,0x04,0xc2,0x02,0x5c,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x3d,0xb3,0x03,0x01,0x0a,0x04,0xb8,0xff,0xc0,0x40,0x19,0x09,0x0c,0x48,0x04,0x07,0xd9,0x40,0x0d, +0x02,0x80,0x00,0x00,0x05,0x09,0xf3,0x0a,0x05,0xf3,0x04,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0x2b,0xc4,0xd4,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x07,0x33,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x01,0xaa,0x7f,0xdd,0xa8, +0xbe,0x66,0x10,0x9e,0xa2,0x0a,0x64,0x04,0x96,0x74,0x70,0x9c,0x05,0xaa,0xf6,0xe2,0x86,0x86,0x72,0x8a,0x8c,0x00,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x07,0x0a,0x00,0x11,0x00,0x1d,0x00,0x68,0x40,0x0d,0x0f,0xe2,0x10,0x02,0x20,0x02,0x30,0x02,0xf0,0x02,0x04,0x02,0x0b,0xb8,0xff,0xd8,0x40,0x0a,0x0d,0x10,0x48,0x0b,0x08,0x09, +0x09,0x1b,0x12,0x18,0xb8,0xff,0xc0,0x40,0x21,0x09,0x0c,0x48,0x18,0x1b,0xd9,0x40,0x15,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x0b,0x18,0x1d,0xf3,0x12,0x19,0xf3,0x18,0x18,0x12,0x1f,0x1e,0x11,0x12,0x39,0x39,0x10,0xe1,0x10,0xe1,0x11,0x39,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0x1a,0xfd, +0xd4,0x2b,0xc4,0x12,0x39,0x2f,0xd5,0xcd,0x2b,0xd4,0x5d,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xcd,0x25,0x2a,0x5b,0x6f,0x50,0x36,0x6c,0x70,0x5e,0x11,0x28,0x01,0x7d,0x0a,0x9d,0x70,0x75,0x94,0x05, +0x64,0x0b,0xa1,0x9d,0x12,0x07,0x06,0x04,0x54,0x48,0x3c,0x54,0x07,0x31,0x72,0x4c,0x40,0x08,0xde,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x1e,0x00,0x5c,0xb3,0x12,0x07,0xda,0x0c,0xb8,0xff,0xc0,0xb7,0x09,0x0c,0x48,0x0c,0x10,0xda,0x03,0x0a,0xb8,0xff,0xc0,0x40,0x23, +0x09,0x0c,0x48,0x0a,0x1e,0x19,0x1c,0xd9,0x16,0x1e,0xf3,0x13,0x13,0x00,0x12,0x1a,0xf3,0x19,0x19,0x09,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x20,0x1f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xfd,0xdc,0xc4,0xd6,0x2b,0xd4,0xfd, +0xdc,0x2b,0xed,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x34,0x0a,0x9d,0x6f,0x76,0x94,0x05,0x65,0x0a,0xa2,0x9c, +0x12,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfe,0xda,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x02,0x00,0x6c,0x04,0xc2,0x03,0x68,0x06,0xbe,0x00,0x11,0x00,0x18,0x00,0x5e,0x40,0x0c,0x0f,0xe2,0x0f,0x02,0x01,0x02,0x40,0x0d,0x10,0x48,0x02,0x0b,0xb8,0xff,0xe8,0xb6,0x09,0x0c,0x48,0x0b,0x40,0x08,0x09,0xb8,0xff,0xc0, +0x40,0x21,0x09,0x0c,0x48,0x09,0x09,0x17,0x16,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x40,0x11,0x11,0x0b,0x0b,0x80,0x12,0x90,0x12,0xa0,0x12,0x03,0x12,0xc0,0x16,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0xc6,0xc6,0x1a,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xcd,0x39,0x2f,0x2b,0xd5,0x1a,0xcd,0x2b,0xdc,0x2b,0x5d,0xed, +0x31,0x30,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x50,0x24,0x2c,0x59,0x6f,0x4b,0x39,0x6d,0x71,0x5f,0x11,0x28,0x4e,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x06,0xba,0x04,0x53,0x48,0x3c,0x54,0x07,0x32,0x73,0x4b,0x40,0x08,0xfe,0x72,0x94,0x94, +0xfa,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x0b,0xb6,0x02,0x18,0x13,0x19,0x06,0x07,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x04,0x18,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00, +0x00,0x0e,0xb9,0x00,0x02,0xff,0xf7,0xb4,0x23,0x29,0x0f,0x00,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x85,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x7c,0x01,0x5e,0x00,0x16,0xb9,0x00,0x02,0xff,0xf2,0x40,0x09,0x1a,0x19,0x0b,0x0b,0x3e,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x27,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x44,0x00,0xf4,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0b,0x31,0x25,0x10,0x14,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xad,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07, +0x02,0x48,0x01,0x2e,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf4,0x40,0x0a,0x16,0x16,0x06,0x07,0x25,0x03,0x02,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0x52,0x06,0x50,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x48,0x00,0xc2,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02, +0x00,0x28,0x24,0x10,0x14,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xad,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x49,0x00,0x13,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf7,0x40,0x0a,0x15,0x16,0x06,0x07,0x25,0x03,0x02,0x1a,0x05,0x26, +0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xe8,0xff,0xe8,0x03,0x83,0x06,0x50,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x49,0xa6,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x25,0x26,0x0d,0x12,0x25,0x03,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12, +0x08,0x1c,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x56,0x01,0x07,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9,0x40,0x0a,0x27,0x28,0x06,0x07,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0xe9,0x06,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4a, +0x00,0x81,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf3,0x40,0x0a,0x37,0x38,0x0d,0x12,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x3f,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x51,0x00,0xa3,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9, +0x40,0x0a,0x28,0x29,0x06,0x07,0x25,0x03,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xe4,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x4b,0x2f,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x05,0x38,0x39,0x0d,0x12,0x25,0x03,0x02,0x37,0x11,0x26,0x00,0x2b,0x35,0x35,0x01, +0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x07,0x6b,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0xd7,0x01,0x11,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x1e,0x40,0x0c,0x02,0x14,0x05,0x26,0x03,0x17,0x1a,0x20,0x05,0x00,0x3e,0x02,0xb8,0xff,0xf4,0xb4,0x14,0x10,0x06,0x07,0x3e,0x2b,0x35,0x2b, +0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x06,0x0e,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0x97,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x24,0x11,0x26,0x03,0x29,0x2a,0x30,0x08,0x14,0x3e,0x02,0x1f,0x24,0x20,0x08,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b, +0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xfb,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x52,0x01,0x59,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x1a,0x14,0x06,0x07,0x25,0x03,0x02,0x17,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xa0, +0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4c,0x00,0xe5,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x06,0x27,0x2d,0x0d,0x12,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xfc,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x53,0x01,0x43,0x01,0x5c, +0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfa,0x40,0x0a,0x14,0x1a,0x06,0x07,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xa0,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4d,0x00,0xe5,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x1f,0x27,0x2d,0x0d,0x12,0x25, +0x03,0x02,0x2d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x65,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x54,0x01,0x64,0x01,0x5b,0x00,0x2c,0xb1,0x03,0x02,0xb8,0xff,0xfb,0x40,0x1a,0x1a,0x19,0x06,0x07,0x25,0x03,0x6f,0x25,0x8f,0x25,0x02,0x02,0x20,0x25,0x30,0x25, +0x50,0x25,0x60,0x25,0x80,0x25,0x05,0x25,0x05,0x26,0x00,0x2b,0x71,0x35,0x71,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x07,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4e,0x00,0xe5,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfc,0x40,0x0a,0x2a,0x29,0x0d,0x12,0x25,0x03,0x02,0x35,0x11,0x26, +0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x3f,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x55,0x00,0xad,0x01,0x5b,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x1a,0x10,0x06,0x07,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8, +0x03,0x83,0x06,0xe4,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x4f,0x35,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x36,0x3c,0x0d,0x12,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x07,0x1a,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0xda,0x01,0x5e, +0x01,0x5c,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x13,0x05,0x26,0x03,0x17,0x20,0x26,0x05,0x00,0x3e,0x02,0x02,0x16,0x10,0x06,0x07,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xda,0x00,0xdc,0x00,0x00, +0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x23,0x11,0x26,0x03,0x29,0x30,0x36,0x08,0x14,0x3e,0x02,0x25,0x26,0x20,0x08,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xf3,0x00,0x00,0x00,0x0b, +0xb6,0x01,0x10,0x0f,0x15,0x02,0x0b,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xf2,0x00,0x00,0x00,0x0b,0xb6,0x02,0x27,0x1d,0x23,0x19,0x13,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x83,0x02,0x26,0x00,0x28, +0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x0d,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0c,0x1d,0x11,0x02,0x0b,0x3e,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x27,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x19,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x30,0x2b,0x1f, +0x19,0x13,0x3e,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x0e,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xdc,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x07,0x16,0x0c,0x02,0x0b,0x3e,0x01,0x00,0x16,0x01,0x16,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00, +0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xb2,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xc8,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0d,0x24,0x1a,0x0c,0x12,0x25,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x6f,0x07,0xab,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07, +0x02,0x48,0x00,0xdf,0x01,0x5b,0x00,0x17,0x40,0x0d,0x02,0x01,0x13,0x14,0x10,0x02,0x03,0x25,0x02,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x5a,0x06,0x50,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x48,0x00,0xca,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf0, +0x40,0x0a,0x23,0x24,0x16,0x0f,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xb4,0x07,0xad,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x49,0xff,0xcc,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x19,0x10,0x13,0x02,0x03,0x25,0x02,0x01,0x16,0x05,0x26,0x00,0x2b,0x35, +0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0c,0xff,0xe8,0x03,0xdd,0x06,0x50,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x02,0x49,0xca,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x1f,0x20,0x16,0x0f,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x20,0x08,0x1a, +0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x56,0x00,0xb8,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x15,0x22,0x1e,0x02,0x03,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x32,0x06,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x4a,0x00,0xca,0x00,0x00, +0x00,0x17,0x40,0x0d,0x03,0x02,0x19,0x31,0x32,0x16,0x0f,0x25,0x03,0x02,0x30,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x08,0x40,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x51,0x00,0x4e,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x0f,0x23,0x1f,0x02,0x03,0x25,0x02,0x01, +0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0xe4,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x02,0x4b,0x47,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x10,0x31,0x2d,0x19,0x13,0x25,0x03,0x02,0x31,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc, +0xfe,0xc6,0x03,0xb4,0x07,0x6b,0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xbf,0x01,0x5d,0x01,0x07,0x02,0x45,0x00,0xea,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x10,0x05,0x26,0x02,0x07,0x16,0x1c,0x01,0x00,0x3e,0x01,0xb8,0xff,0xfd,0xb4,0x10,0x0c,0x01,0x00,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x60, +0xfe,0xc6,0x03,0xdd,0x06,0x0e,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xb4,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xef,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x1e,0x11,0x26,0x03,0x26,0x24,0x2a,0x0c,0x12,0x3e,0x02,0x0c,0x1e,0x1a,0x0c,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x9a,0x00,0x00, +0x01,0xb3,0x07,0x83,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x02,0x50,0xff,0xef,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0d,0x02,0x03,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x88,0x00,0x00,0x01,0xa1,0x06,0x27,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x02,0x44,0xdd,0x00,0x00,0x13, +0x40,0x0b,0x01,0x00,0x0e,0x0d,0x02,0x03,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xb2,0xfe,0xc6,0x01,0x78,0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x06,0x02,0x45,0xc0,0x00,0x00,0x0b,0xb6,0x01,0x05,0x07,0x0d,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x01,0x66, +0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x06,0x02,0x45,0xa3,0x00,0x00,0x0e,0xb9,0x00,0x02,0xff,0xfd,0xb4,0x13,0x19,0x03,0x09,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x05,0xaa,0x05,0xb2,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xa8,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0xff,0xf9,0xb4,0x1b,0x21, +0x03,0x09,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x50,0x04,0x18,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x06,0x00,0x00,0x00,0x0b,0xb6,0x02,0x03,0x1b,0x21,0x03,0x09,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x83,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x50, +0x01,0xf6,0x01,0x5c,0x00,0x16,0xb9,0x00,0x02,0xff,0xee,0x40,0x09,0x22,0x21,0x0c,0x06,0x3e,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x27,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x43,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe7,0x40,0x09,0x22,0x21,0x0c, +0x06,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xad,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x48,0x01,0xb3,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1e,0x1e,0x0c,0x0c,0x25,0x03,0x02,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff, +0x00,0x60,0xff,0xe8,0x04,0x98,0x06,0x50,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x48,0x01,0x08,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x1e,0x1e,0x0c,0x0c,0x25,0x03,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xad,0x02,0x26,0x00,0x32,0x00,0x00, +0x01,0x07,0x02,0x49,0x00,0x94,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x21,0x21,0x0c,0x06,0x25,0x03,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x30,0xff,0xe8,0x04,0x50,0x06,0x50,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0x49,0xee,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd, +0x40,0x0a,0x21,0x21,0x06,0x06,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x1a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x56,0x01,0x78,0x01,0x5c,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xed,0x40,0x0a,0x2f,0x30,0x0c,0x06,0x25,0x03,0x02,0x2e,0x05,0x26, +0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xbe,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x4a,0x00,0xe5,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x2c,0x2c,0x06,0x06,0x25,0x03,0x02,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e, +0xff,0xe8,0x05,0xaa,0x08,0x40,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x51,0x01,0x29,0x01,0x5c,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x2d,0x2d,0x0c,0x06,0x25,0x03,0x02,0x2f,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xe4,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06, +0x02,0x4b,0x70,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf5,0x40,0x0a,0x30,0x31,0x0c,0x06,0x25,0x03,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x05,0xaa,0x07,0x6b,0x02,0x26,0x00,0x32,0x00,0x00,0x00,0x27,0x00,0xd7,0x01,0xa4,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0xb0,0x00,0x00, +0x00,0x1b,0x40,0x12,0x02,0x1c,0x05,0x26,0x03,0x01,0x22,0x28,0x03,0x09,0x3e,0x02,0x16,0x1c,0x18,0x03,0x09,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x50,0x06,0x0e,0x02,0x26,0x00,0x52,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xf7,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xfe,0x00,0x00,0x00,0x1e, +0xb4,0x02,0x1c,0x11,0x26,0x03,0xb8,0xff,0xfb,0x40,0x0c,0x22,0x28,0x03,0x09,0x3e,0x02,0x15,0x1c,0x18,0x03,0x09,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x07,0x67,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x0e,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x00,0x27,0x27,0x18,0x18, +0x25,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x0a,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x61,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x26,0x26,0x10,0x10,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e, +0xff,0xe8,0x06,0x3a,0x07,0x67,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xc8,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x0a,0x27,0x27,0x18,0x18,0x25,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x0a,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x02, +0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xfc,0x40,0x09,0x26,0x26,0x19,0x19,0x25,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x07,0x83,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x02,0x50,0x02,0x0c,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x00,0x30,0x2f,0x18,0x18,0x25,0x02,0x2f,0x05, +0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x27,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x45,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe9,0x40,0x09,0x2f,0x2e,0x19,0x10,0x25,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a, +0x07,0x0e,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0xb0,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x0f,0x30,0x26,0x15,0x0f,0x25,0x02,0x30,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x05,0xb2,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xf8,0x00,0x00,0x00,0x13, +0x40,0x0b,0x02,0x03,0x2f,0x25,0x0d,0x07,0x3e,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x06,0x3a,0x06,0x3e,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xac,0x00,0x00,0x00,0x0b,0xb6,0x02,0x03,0x2c,0x2c,0x12,0x12,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6, +0x04,0xa9,0x04,0xfc,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x02,0x00,0x00,0x00,0x0b,0xb6,0x02,0x05,0x2b,0x2b,0x0a,0x0a,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xfe,0xc6,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x66,0x00,0x00,0x00,0x0b,0xb6,0x01,0x07,0x14,0x14,0x02, +0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xd1,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xfb,0xb4,0x18,0x18,0x0c,0x0c,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x83,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07, +0x02,0x50,0x01,0x97,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1f,0x13,0x05,0x0d,0x3e,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x27,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x22,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x20,0x23,0x17,0x08,0x11,0x3e,0x01, +0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x67,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xb8,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x19,0x19,0x06,0x0c,0x3e,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7, +0x06,0x0a,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x38,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x06,0x1d,0x1d,0x09,0x10,0x3e,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x67,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x7a,0x01,0x5d,0x00,0x13, +0x40,0x0b,0x01,0x13,0x19,0x19,0x06,0x0c,0x3e,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x06,0x0a,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x23,0x1d,0x1c,0x09,0x10,0x3e,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b, +0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x83,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x9d,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe6,0x40,0x09,0x22,0x21,0x06,0x0c,0x3e,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x06,0x27,0x02,0x26,0x02,0x43, +0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x27,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x26,0x25,0x09,0x10,0x3e,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x0e,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x66,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0a, +0x22,0x18,0x06,0x0c,0x3e,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x05,0xb2,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xdd,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x07,0x26,0x1c,0x08,0x1b,0x3e,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0xaa,0xfe,0xc6,0x05,0xd0,0x06,0x96,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x66,0x00,0x00,0x00,0x0b,0xb6,0x01,0x07,0x1e,0x1e,0x02,0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x04,0xc7,0x04,0xfc,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe5,0x00,0x00,0x00,0x0b,0xb6,0x01, +0x00,0x1f,0x25,0x0a,0x01,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0xfe,0xc6,0x04,0x60,0x05,0x9a,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xdf,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x11,0x17,0x03,0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x02,0x26,0x00,0x5c,0x00,0x00, +0x01,0x07,0x02,0x45,0x01,0xc2,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xec,0xb4,0x15,0x1b,0x14,0x14,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x83,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x1a,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x18,0x1f,0x13,0x05,0x00,0x3e,0x01,0x18,0x05,0x26,0x00, +0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x27,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x02,0x44,0x00,0xc9,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x26,0x1a,0x0c,0x00,0x3e,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x0e,0x02,0x26, +0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xde,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x08,0x18,0x0e,0x05,0x00,0x3e,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0xb2,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x8b,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff, +0xfd,0x40,0x09,0x1f,0x15,0x0c,0x00,0x3e,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x29,0xfe,0x85,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0x93,0x00,0x00,0x00,0x0b,0xb6,0x01,0x1d,0x0b,0x0b,0x03,0x03,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x85,0x02,0x81, +0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x06,0x01,0x9c,0x2a,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xe7,0xb4,0x17,0x15,0x04,0x00,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x67,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x0e, +0x0c,0x02,0x0b,0x3e,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xe5,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xd9,0x40,0x09,0x1c,0x1a,0x19,0x13,0x3e,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff, +0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x67,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xda,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x16,0x14,0x0b,0x01,0x3e,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x06,0x0a,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07, +0x00,0x43,0x00,0xde,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb4,0x40,0x09,0x11,0x0f,0x07,0x0d,0x3e,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff, +0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4c,0x00,0x00,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4d,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0xf6,0x05,0x9a,0x00,0x0d,0x00,0x5b,0x40,0x2c,0x05,0x08,0x91,0x02,0x0b,0x0b,0x07,0x01,0x91,0x0c,0x03,0x07,0x09,0x08,0x04,0x00,0x04,0x00, +0x0f,0x02,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x7e,0x0b,0x08,0x08,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x08,0xb8,0xff,0xe0,0xb3,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x00,0x2f,0x3f,0xed,0x12, +0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x03,0xf6,0xfd,0xc0,0x01,0x5a,0xfe,0xa6,0xa8,0xe5,0xe5,0x02,0xe8,0x05,0x02,0xfe,0x36,0x9a,0xfd,0x62,0x02,0x9e,0x9a,0x02,0x62,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x29,0x04,0x00,0x00,0x0d,0x00,0x5e,0x40,0x27,0x05,0x08, +0x96,0x02,0x0b,0x0b,0x07,0x01,0x95,0x0c,0x0f,0x07,0x09,0x07,0x04,0x00,0x04,0x00,0x0f,0x02,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x0b,0x07,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b, +0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xc6,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x03,0x29,0xfe,0x6b,0x01,0x02,0xfe,0xfe,0xa4,0xd2,0xd2,0x02,0x39,0x03,0x74,0xfe,0xe2,0x85,0xfe,0x2f,0x01,0xd1,0x85,0x01, +0xaa,0x00,0x00,0x01,0xff,0xea,0xfe,0x80,0x07,0x0a,0x05,0x9a,0x00,0x21,0x00,0xae,0x40,0x13,0x13,0x0d,0x1c,0x04,0x04,0x10,0x1f,0x10,0x0e,0x12,0x20,0x91,0x03,0x40,0x1d,0x17,0x12,0x03,0x01,0xb8,0x01,0x30,0xb3,0x09,0x03,0x0e,0x02,0xb8,0x01,0x2c,0x40,0x09,0x21,0x1d,0x1e,0x1e,0x08,0x20,0x03,0x02,0x21,0xb8,0xff,0xf8,0x40,0x26, +0x0c,0x06,0x4d,0x21,0x0e,0x08,0x12,0x11,0x11,0x09,0x0e,0x0f,0x0f,0x09,0x42,0x0f,0x1f,0x18,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x17,0x10,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf4,0x40,0x11,0x0c,0x06,0x4d,0x09,0x13,0x0b,0x06,0x4d,0x09,0x09,0x23,0x22,0x2f, +0x23,0x3f,0x23,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x33,0x10,0xe0,0x2b,0x11,0x33,0x33,0x11,0x39,0x2f,0x33,0x10,0xe1,0x00,0x2f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x1a,0x10,0xed,0x11,0x12,0x39,0x39,0x11,0x17,0x33,0x31,0x30,0x01,0x23, +0x11,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x07,0x0a,0x99,0x50,0xfd,0xcf,0x18,0x0d,0x05,0x9f,0x04,0x0f,0x16,0xfd,0xcf,0xe3,0x02,0x91,0xfd,0x9b,0xce,0x02,0x1a,0x17,0x0e,0x04,0x9f,0x05,0x0d,0x18,0x02,0x1a, +0xcd,0xfd,0x9b,0x02,0x0d,0x8b,0xfe,0x80,0x01,0x80,0x02,0x90,0x1c,0x16,0xfd,0x3e,0x02,0xc2,0x19,0x19,0xfd,0x70,0x02,0xe8,0x02,0xb2,0xfd,0x93,0x1b,0x16,0x02,0x9e,0xfd,0x62,0x16,0x1b,0x02,0x6d,0xfd,0x4e,0xfd,0xae,0x00,0x01,0x00,0x04,0xfe,0x8b,0x06,0x00,0x04,0x00,0x00,0x19,0x00,0xa4,0xb9,0x00,0x01,0x01,0x31,0x40,0x15,0x04, +0x09,0x0f,0x14,0x04,0x0c,0x17,0x0c,0x07,0x15,0x0e,0x11,0x0f,0x18,0x96,0x03,0x40,0x0a,0x03,0x07,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0x01,0x2c,0x40,0x2c,0x02,0x15,0x16,0x16,0x06,0x18,0x03,0x02,0x02,0x19,0x0e,0x06,0x0e,0x0d,0x0d,0x07,0x0a,0x0b,0x0b,0x07,0x42,0x0b,0x17,0x12,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08, +0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x11,0x0c,0x07,0xb8,0xff,0xf0,0x40,0x11,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x0c,0x0b,0x06,0x4d,0x07,0x07,0x1a,0x1b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x33,0x10,0xe0,0x32,0x2f, +0x33,0x33,0x11,0x39,0x2f,0x33,0x10,0xe1,0x2b,0x00,0x2f,0x33,0x33,0x1a,0x10,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x33,0x06,0x00,0x8c,0x5c,0xfe,0x36,0x04,0x9c,0x04,0xfe, +0x35,0xdb,0x01,0xfc,0xfe,0x23,0xd1,0x01,0xb6,0x04,0x9c,0x04,0x01,0xb6,0xd3,0xfe,0x21,0x01,0x81,0x87,0xfe,0x8b,0x01,0x75,0x01,0xfa,0xfe,0x06,0x01,0xfa,0xfe,0x06,0x02,0x10,0x01,0xf0,0xfe,0x21,0x01,0xdf,0xfe,0x21,0x01,0xdf,0xfe,0x10,0xfe,0x71,0x00,0x01,0x00,0xbc,0xfe,0x80,0x04,0xa8,0x05,0x9a,0x00,0x14,0x00,0x87,0xb9,0x00, +0x01,0x01,0x30,0x40,0x1c,0x0f,0x04,0x12,0x12,0x08,0x10,0x0b,0x03,0x13,0x91,0x02,0x02,0x08,0x10,0x11,0x11,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0xb8,0x01,0x2c,0xb2,0x13,0x03,0x02,0xb8,0xff,0xf8,0x40,0x1a,0x0d,0x06,0x4d,0x02,0x02,0x16,0x12,0x0b,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08, +0x08,0x0b,0x06,0x4d,0x08,0x7e,0x09,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x11,0x33,0x2f,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x33,0x00,0x2f,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11, +0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x04,0xa8,0x9a,0x50,0xfd,0xd0,0x1b,0x0b,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x0c,0x8c,0xfe,0x80,0x01,0x80,0x02,0x90,0x20,0x12,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b, +0x02,0x71,0xfd,0x4e,0xfd,0xae,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x00,0x04,0x00,0x00,0x10,0x00,0x7b,0xb9,0x00,0x01,0x01,0x31,0x40,0x1d,0x0f,0x96,0x03,0x0b,0x04,0x0e,0x0e,0x06,0x0c,0x09,0x0f,0x11,0x03,0x06,0x0c,0x0d,0x0d,0x06,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0xb8,0x01,0x2c,0x40,0x19,0x0f,0x03,0x02, +0x02,0x12,0x0e,0x09,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0xb8,0xff,0xf8,0x40,0x0e,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x11,0x39,0x2f,0x33,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x33,0x00, +0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x33,0x04,0x00,0x8c,0x64,0xfe,0x3e,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd9,0xfe,0x23,0x01,0x7f,0x89,0xfe,0x8b,0x01,0x75,0x01,0xea,0xfe,0x16,0x04,0x00,0xfe,0x2d,0x01,0xd3, +0xfe,0x10,0xfe,0x71,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x18,0x00,0xaa,0x40,0x51,0x00,0x03,0x10,0x03,0x20,0x03,0x03,0x03,0x03,0x02,0x0a,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x14,0x14,0x0d,0x15,0x12,0x11,0x0f,0x16,0x0f,0x11,0x16,0x0f,0x06,0x05,0x02,0x01,0x08,0x01,0x06,0x08,0x01,0x0f,0x08,0x18,0x18,0x0a, +0x16,0x0d,0x03,0x01,0x0a,0x15,0x02,0x12,0x0f,0x05,0x01,0x05,0x05,0x00,0x16,0x17,0x17,0x01,0x19,0x00,0x29,0x00,0x02,0x0f,0x00,0x01,0x00,0x00,0x1a,0x08,0x0d,0x0f,0x18,0x04,0x0a,0x7e,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x2f,0x2b,0x2b,0x2b,0xe1, +0x17,0x32,0x11,0x39,0x2f,0x5d,0x5d,0x33,0x39,0x2f,0x33,0x11,0x39,0x2f,0x5d,0x33,0xcd,0x32,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x11,0x12,0x01,0x39,0x10,0x87,0x04,0xc0,0xc0,0xc0,0x11,0x12,0x01,0x39,0x10,0x87,0x04,0xc0,0xc0,0xc0,0x11,0x00,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x31,0x30,0x21,0x23,0x01,0x11, +0x23,0x11,0x27,0x26,0x35,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x37,0x11,0x33,0x15,0x01,0x33,0x01,0x04,0xa2,0xea,0xfe,0x58,0x4c,0x36,0x26,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x36,0x4c,0x01,0x96,0xd1,0xfd,0x99,0x01,0xf4,0xfe,0xf2,0x01,0x68,0x42,0x2f,0x03,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x3f,0x01,0x52,0xf8,0x01, +0xd8,0xfd,0x50,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf4,0x04,0x00,0x00,0x14,0x00,0x81,0x40,0x4c,0x1f,0x04,0x01,0x50,0x04,0x60,0x04,0x02,0x04,0x04,0x02,0x08,0x5f,0x0f,0x6f,0x0f,0x02,0x0f,0x0f,0x0b,0x11,0x0e,0x0d,0x12,0x0d,0x05,0x02,0x01,0x06,0x01,0x0d,0x06,0x14,0x14,0x08,0x12,0x0b,0x0f,0x01,0x08,0x11,0x02,0x0e,0x05, +0x05,0x00,0x12,0x38,0x13,0x48,0x13,0x02,0x13,0x13,0x01,0x0f,0x00,0xaf,0x00,0x02,0x39,0x00,0x49,0x00,0x02,0x00,0x00,0x16,0x06,0x0b,0x0d,0x14,0x04,0x08,0x84,0x09,0x2f,0xe1,0x17,0x32,0x11,0x39,0x2f,0x5d,0x5d,0x33,0x39,0x2f,0x5d,0x33,0x11,0x39,0x2f,0x33,0xcd,0x32,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x10,0x87, +0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x11,0x00,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x5d,0x31,0x30,0x21,0x23,0x01,0x15,0x23,0x11,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x37,0x35,0x33,0x15,0x01,0x33,0x01,0x03,0xf4,0xe4,0xfe,0xe6,0x4c,0x5c,0x04,0xa4,0xa4,0x04,0x5c,0x4c,0x01,0x06,0xd9,0xfe,0x23,0x01,0x33,0xc1,0x01,0x13,0x65, +0xfe,0x16,0x04,0x00,0xfe,0x2d,0x65,0xed,0x9b,0x01,0x1c,0xfe,0x10,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x05,0xb2,0x05,0x9a,0x00,0x0f,0x00,0xb7,0x40,0x0b,0x05,0x91,0x40,0x0a,0x09,0x06,0x0a,0x91,0x2b,0x30,0x01,0xb8,0x01,0x30,0x40,0x13,0x0e,0x91,0x03,0x0c,0x09,0x03,0x03,0x06,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d, +0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0x40,0x19,0x0c,0x06,0x4d,0x02,0x02,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x0b,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xe0,0x40,0x1e,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d, +0x03,0x03,0x11,0x09,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf7,0xb3,0x0c,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x7d,0x2f,0x2b,0x2b,0xe1, +0x2b,0x2b,0x00,0x18,0x2f,0x33,0x3f,0x33,0x10,0xed,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0xb2,0x9b,0xcd,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0xc0,0xfe,0x80,0x01,0x80,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xfe,0x00, +0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x90,0x04,0x00,0x00,0x0f,0x00,0x9c,0xb9,0x00,0x01,0x01,0x31,0x40,0x13,0x0e,0x95,0x03,0x05,0x95,0x40,0x0a,0x09,0x06,0x0a,0x95,0x2b,0x30,0x0c,0x09,0x0f,0x03,0x06,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xf8,0x40, +0x40,0x0d,0x06,0x4d,0x02,0x02,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x0b,0x03,0x03,0x0d,0x06,0x4d,0x03,0x03,0x0b,0x06,0x4d,0x03,0x03,0x11,0x0a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0x08,0x0d,0x06,0x4d,0x07,0x40,0x11, +0x01,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x2f,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x00,0x2f,0x33,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x10,0xed,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x04,0x90,0x8e,0xae,0xfd,0xf6, +0xa4,0xa4,0x02,0x0a,0xa4,0x98,0xfe,0x8b,0x01,0x75,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfc,0x8c,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x0e,0xfe,0x29,0x03,0xd5,0x04,0x00,0x00,0x0c,0x00,0x68,0x40,0x0c,0x03,0x1b,0x04,0x42,0x01,0x01,0x0d,0x0c,0x06,0x0f, +0x0c,0x00,0xb8,0xff,0xf8,0x40,0x24,0x0c,0x06,0x4d,0x00,0x0e,0x01,0x06,0x05,0x04,0x05,0x42,0x05,0x08,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x04,0x07,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf4,0x40,0x0a,0x0c,0x06,0x4d,0x04,0x04,0x0e,0x0d,0x4f,0x0e,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b, +0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0x11,0x01,0x33,0x10,0xe1,0x2b,0x32,0x00,0x18,0x3f,0x33,0x12,0x39,0x7d,0x2f,0x18,0xe5,0x3f,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x17,0x33,0x36,0x37,0x01,0x03,0xd5,0xfe,0x69,0xa4,0xfe,0x74,0xb6,0x01,0x0d,0x1d,0x02,0x0a,0x16,0x01,0x1b,0x04,0x00,0xfc,0x06,0xfe,0x23,0x01, +0xdf,0x03,0xf8,0xfd,0x04,0x64,0x22,0x46,0x02,0xf8,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x14,0x00,0x7d,0x40,0x16,0x11,0x0d,0x07,0x04,0x97,0x40,0x0a,0x01,0x01,0x06,0x14,0x0d,0x03,0x06,0x11,0x10,0x05,0x06,0x03,0x03,0x14,0x00,0xb8,0xff,0xd8,0x40,0x23,0x0b,0x06,0x4d,0x00,0x0e,0x05,0x08,0x08,0x06,0x0d,0x0c, +0x06,0x0c,0x42,0x0c,0x01,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x7e,0x0b,0x06,0xb8,0xff,0xf8,0x40,0x0a,0x0b,0x06,0x4d,0x06,0x06,0x16,0x15,0x20,0x16,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x10,0xe0,0x2b,0x32, +0x39,0x2f,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0x33,0x1a,0xed,0x32,0x12,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0x60,0xfe,0x27,0x01,0x52,0xfe,0xae,0xa8,0xfe,0xb7,0x01,0x49,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x0a, +0x1c,0x01,0x50,0x05,0x9a,0xfc,0x72,0x85,0xfe,0x79,0x01,0x87,0x85,0x02,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x22,0x36,0x02,0x88,0x00,0x01,0x00,0x0e,0xfe,0x29,0x03,0xd5,0x04,0x00,0x00,0x12,0x00,0x60,0x40,0x35,0x04,0x1b,0x02,0x05,0x96,0x08,0x40,0x0c,0x0c,0x08,0x10,0x0a,0x0f,0x12,0x08,0x00,0x00,0x10,0x11,0x0e,0x02,0x07,0x07,0x05, +0x0a,0x09,0x09,0x05,0x42,0x09,0x0d,0x0c,0x12,0x02,0x08,0x0d,0x06,0x4d,0x02,0x84,0x08,0x05,0x07,0x0d,0x06,0x4d,0x05,0x05,0x14,0x13,0x4f,0x14,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x32,0x39,0x39,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x10,0xe0,0x32,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x1a, +0x10,0xed,0x32,0x3f,0x31,0x30,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x01,0x33,0x01,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x03,0x92,0xfe,0xac,0xa4,0xfe,0xb4,0x01,0x4c,0xfe,0x74,0xb6,0x01,0x0d,0x1d,0x02,0x0a,0x16,0x01,0x1b,0xaa,0xfe,0x69,0x85,0xfe,0xae,0x01,0x52,0x85,0x04,0x00,0xfd,0x04,0x64,0x22,0x46,0x02,0xf8,0xfc, +0x00,0x00,0x00,0x01,0x00,0x1a,0xfe,0x80,0x04,0xc6,0x05,0x9a,0x00,0x19,0x00,0x5f,0xb9,0x00,0x01,0x01,0x30,0x40,0x20,0x06,0x11,0x17,0x03,0x0c,0x0c,0x0a,0x15,0x0e,0x03,0x18,0x91,0x03,0x1a,0x03,0x0a,0x06,0x0c,0x11,0x17,0x04,0x0d,0x15,0x16,0x0e,0x0d,0x16,0x0d,0x16,0x0d,0x0b,0x19,0xb8,0x01,0x2c,0x40,0x0d,0x18,0x03,0x03,0x02, +0x10,0x0d,0x06,0x4d,0x02,0x02,0x1b,0x0a,0x0b,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x33,0x11,0x33,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x12,0x17,0x39,0x00,0x2f,0x33,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16, +0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x04,0xc6,0x98,0x61,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xe0,0xfe,0x46,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe,0x3d,0x01,0x6b,0x8a,0xfe,0x80,0x01,0x80,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0xd1,0x02,0xc9,0xfe,0x08,0x32,0x32,0x42, +0x26,0x01,0xf4,0xfd,0x39,0xfd,0xc3,0x00,0x00,0x01,0x00,0x1a,0xfe,0x8b,0x03,0xb4,0x04,0x00,0x00,0x17,0x00,0x5f,0xb9,0x00,0x01,0x01,0x31,0x40,0x20,0x06,0x11,0x15,0x03,0x0c,0x0c,0x0a,0x13,0x0e,0x0f,0x16,0x96,0x02,0x18,0x02,0x0a,0x06,0x0c,0x11,0x15,0x04,0x0d,0x13,0x14,0x0e,0x0d,0x14,0x0d,0x14,0x0d,0x0b,0x17,0xb8,0x01,0x2c, +0x40,0x0d,0x16,0x03,0x03,0x02,0x08,0x0d,0x06,0x4d,0x02,0x02,0x19,0x0a,0x0b,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x33,0x11,0x33,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x12,0x17,0x39,0x00,0x2f,0x33,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03, +0x23,0x01,0x01,0x33,0x13,0x16,0x17,0x33,0x01,0x33,0x01,0x13,0x33,0x03,0xb4,0x8b,0x5c,0xc9,0x15,0x18,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x15,0x16,0x04,0x01,0x00,0xb5,0xfe,0xa8,0xfb,0x7f,0xfe,0x8b,0x01,0x75,0x01,0x4c,0x23,0x2b,0x09,0x45,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x26,0x2a,0x01,0xae,0xfd, +0xfa,0xfe,0x87,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x17,0x00,0xa0,0x40,0x40,0x11,0x11,0x0c,0x0f,0x06,0x06,0x01,0x04,0x02,0x15,0x07,0x91,0x0f,0x15,0x15,0x13,0x16,0x0f,0x0f,0x01,0x16,0x0c,0x03,0x01,0x05,0x06,0x12,0x11,0x40,0x0c,0x15,0x11,0x7f,0x2b,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06, +0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x15,0x01,0x1e,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x18,0x0b,0x06,0x4d,0x01,0x01,0x19,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x0b,0x0c,0x0b,0x06,0x4d,0x0b,0x2f, +0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x1a,0x18,0x10,0xcd,0x33,0x32,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x10,0xed,0x11,0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x11,0x23,0x11,0x06,0x26,0x35,0x11,0x33,0x11, +0x14,0x33,0x33,0x11,0x33,0x11,0x36,0x37,0x11,0x33,0x04,0x81,0xa8,0xa7,0x88,0x4c,0xce,0xea,0xa8,0xf6,0x1a,0x4c,0x86,0xa9,0xa8,0x02,0x85,0x58,0x17,0xfe,0xae,0x01,0x4a,0x0f,0xc3,0xbd,0x02,0x1b,0xfd,0xed,0xe7,0x01,0x6a,0xfe,0x9e,0x14,0x52,0x02,0x8c,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x03,0xdf,0x04,0x00,0x00,0x16,0x00,0x8e, +0x40,0x5b,0x10,0x10,0x0b,0x0e,0x06,0x06,0x01,0x04,0x02,0x07,0x14,0x14,0x12,0x15,0x0e,0x95,0x07,0x07,0x01,0x15,0x0b,0x0f,0x01,0x05,0x06,0x11,0x10,0x40,0x0b,0x14,0x10,0x85,0x2b,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x14,0x01,0x01,0x18,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08, +0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0a,0x05,0x0d,0x06,0x4d,0x0a,0x05,0x0c,0x06,0x4d,0x0a,0x04,0x0b,0x06,0x4d,0x0a,0x2f,0x18,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x33,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x1a,0x18,0x10,0xcd,0x33,0x32,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x39, +0x39,0x2f,0x12,0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x15,0x23,0x35,0x04,0x11,0x11,0x33,0x11,0x14,0x33,0x33,0x11,0x33,0x11,0x36,0x37,0x11,0x33,0x03,0xdf,0xa3,0x76,0x66,0x4c,0xfe,0x84,0xa4,0xc2,0x16,0x4c,0x6e,0x6e,0xa3,0x01,0x9c,0x40,0x16,0xd4,0xca,0x1c,0x01,0x86,0x01,0x5a,0xfe, +0xae,0xe1,0x01,0x25,0xfe,0xe5,0x14,0x38,0x01,0xdd,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x10,0x00,0x73,0x40,0x27,0x0b,0x06,0x04,0x91,0x0d,0x0d,0x07,0x0a,0x03,0x01,0x07,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01,0x1e,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d, +0x01,0xb8,0xff,0xfc,0x40,0x19,0x0b,0x06,0x4d,0x01,0x01,0x12,0x0b,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7e,0x08,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x08,0x0c,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00, +0x2f,0x33,0x3f,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x16,0x15,0x04,0x81,0xa8,0xf5,0xb4,0xe2,0xa8,0xa8,0xe4,0xc6,0xba,0xcf,0x02,0x12,0xe8,0x6e,0xfd,0x74,0x05,0x9a,0xfd,0x7a,0x7a,0xc2,0xb2,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec, +0x02,0x06,0x00,0x4b,0x00,0x00,0x00,0x02,0x00,0x56,0xff,0xe8,0x05,0x66,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x77,0x40,0x29,0x12,0x91,0x01,0x20,0x01,0x50,0x01,0x02,0x01,0x09,0x16,0x2f,0x06,0x01,0x06,0x06,0x04,0x91,0x09,0x04,0x16,0x91,0x0f,0x13,0x06,0x06,0x00,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x7d,0x01, +0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x06,0x4d,0x12,0x12,0x1a,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x7d,0x00,0x10,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x00,0x3f,0xed, +0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x5d,0x2f,0xed,0x31,0x30,0x13,0x21,0x26,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x25,0x21,0x16,0x12,0x33,0x32,0x00,0x56,0x04,0x5e,0x11,0xfe,0xe5,0xda,0xd8,0x9c,0x9e,0xe2,0x01,0x3f,0x01,0x6d,0xfe,0x94,0xfe,0xd3,0xfe,0xd1,0xfe,0xb8,0x04,0x5e,0xfc, +0x56,0x04,0xf2,0xcf,0xcf,0x01,0x02,0x03,0x1a,0xed,0x01,0x13,0x60,0xa4,0x54,0xfe,0x76,0xfe,0xa5,0xfe,0xbe,0xfe,0x5d,0x01,0x9f,0xfc,0xeb,0xfe,0xe7,0x01,0x18,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0x56,0x40,0x23,0x06,0x40,0x0b,0x0e,0x48,0x06,0x06,0x04,0x13,0x95,0x01,0x01,0x17,0x04, +0x95,0x09,0x10,0x17,0x95,0x0f,0x16,0x80,0x06,0x90,0x06,0x02,0x06,0x06,0x0c,0x00,0x13,0x14,0x0c,0x83,0x01,0xb8,0xff,0xf8,0x40,0x0e,0x0d,0x06,0x4d,0x01,0x01,0x1b,0x14,0x83,0x00,0x10,0x0d,0x06,0x4d,0x00,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x12,0x39,0x11,0x12,0x39,0x2f,0x5d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed, +0x12,0x39,0x2f,0x2b,0x31,0x30,0x13,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x02,0x35,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x52,0x02,0xd3,0x04,0xb0,0x9a,0xae,0x90,0x86,0xdf,0xd9,0xf8,0xfe,0xf1,0xc8,0xcb,0xdb,0x02,0xd1,0xfd,0xd7,0x02,0x84,0x7a,0x74,0xa3,0x02,0x29,0xab,0xba,0x72,0x9a, +0x62,0xfe,0xea,0xfe,0xf2,0xfe,0xd6,0x01,0x06,0xe5,0x35,0x8d,0x9f,0xa6,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x12,0x00,0x19,0x00,0x63,0x40,0x18,0x14,0x91,0x40,0x12,0x06,0x00,0x12,0x91,0x2b,0x30,0x0f,0x91,0x06,0x04,0x17,0x91,0x00,0x13,0x09,0x7d,0x12,0x0c,0x14,0x13,0xb8,0xff,0xf0,0xb3,0x0d,0x06, +0x4d,0x13,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x13,0xb8,0xff,0xe0,0x40,0x18,0x0b,0x06,0x4d,0x13,0x13,0x1b,0x14,0x7d,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d,0x03,0x18,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x12,0x39,0x39,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a, +0xed,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x00,0x23,0x22,0x00,0x07,0x05,0x21,0x16,0x00,0x33,0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xc0,0x12,0xfe,0xfd,0xd7,0xd0,0xfe,0xee,0x16,0x03,0xe4,0xfc,0x1c,0x15,0x01,0x0c,0xcb,0xdc,0x01, +0x09,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x03,0x30,0xf5,0x01,0x0d,0xfe,0xe8,0xea,0x9b,0xea,0xfe,0xec,0x01,0x0b,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x6b,0x40,0x18,0x13,0x95,0x40,0x11,0x06,0x00,0x11,0x95,0x2b,0x30,0x0e,0x95, +0x06,0x10,0x16,0x95,0x00,0x16,0x11,0x0c,0x13,0x09,0x83,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0xb6,0x0c,0x06,0x4d,0x30,0x12,0x01,0x12,0xb8,0xff,0xde,0x40,0x1b,0x0b,0x06,0x4d,0x12,0x12,0x19,0x13,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d, +0x2f,0x2b,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x20,0x02,0x52,0xe4,0xfe,0xf2,0x01,0x1a,0xf0,0xe5,0x01,0x01, +0xfe,0xeb,0x67,0x29,0xfe,0xe5,0x88,0xb1,0x17,0x02,0x98,0xfd,0x64,0x0a,0xb7,0x93,0x01,0x33,0x18,0x01,0x20,0xec,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x74,0x01,0x32,0xa0,0x92,0x8b,0xa3,0xbc,0x00,0x00,0x02,0x00,0x3e,0x06,0x1e,0x02,0x3a,0x07,0xcf,0x00,0x03,0x00,0x07,0x00,0x2d,0xb2,0x02,0x80,0x01,0xb8,0xff, +0xc0,0x40,0x12,0x09,0x0c,0x48,0x01,0x06,0xe2,0x05,0x02,0x62,0x00,0x01,0x00,0x00,0x05,0x04,0x04,0x09,0x05,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0x21,0x35,0x21,0x01,0xaa,0x7f,0xdd,0xa8,0x01,0x44,0xfe,0x04,0x01,0xfc,0x06,0xd9,0xf6,0xfe,0x4f,0x6e, +0x00,0x02,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x06,0x72,0x00,0x03,0x00,0x07,0x00,0x24,0x40,0x11,0x02,0x80,0x01,0x06,0xe2,0x05,0x02,0x62,0x00,0x01,0x00,0x00,0x05,0x04,0x04,0x09,0x05,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xde,0x1a,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0x21,0x35,0x21,0x01,0xaa,0x7f,0xdd, +0xa8,0x01,0x44,0xfe,0x04,0x01,0xfc,0x05,0x7d,0xf5,0xfe,0x50,0x6d,0x00,0x00,0x02,0x00,0x3e,0x06,0x1e,0x02,0x3a,0x07,0xcf,0x00,0x03,0x00,0x07,0x00,0x2d,0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x12,0x09,0x0c,0x48,0x00,0x05,0xe2,0x04,0x02,0x6d,0x00,0x01,0x00,0x00,0x04,0x07,0x07,0x09,0x04,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f, +0x5d,0xcd,0x00,0x2f,0xfd,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x05,0x35,0x21,0x15,0xcd,0xb4,0xa8,0xdd,0xfe,0xf2,0x01,0xfc,0x06,0xd9,0xf6,0xf6,0xbb,0x6e,0x6e,0x00,0x02,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x06,0x72,0x00,0x03,0x00,0x07,0x00,0x24,0x40,0x11,0x01,0x80,0x00,0x05,0xe2,0x04,0x02,0x6d,0x00,0x01,0x00,0x00, +0x04,0x07,0x07,0x09,0x04,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xde,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x05,0x35,0x21,0x15,0xcd,0xb4,0xa8,0xdd,0xfe,0xf2,0x01,0xfc,0x05,0x7d,0xf5,0xf5,0xbb,0x6d,0x6d,0x00,0x00,0x03,0x00,0x7d,0x06,0x1e,0x02,0xc4,0x07,0xd1,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x44, +0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x20,0x09,0x0c,0x48,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x02,0x01,0x0f,0x03,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1c,0x1d,0x19,0x07,0x2b,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x5f,0x5e,0x5d,0x00,0x2f,0x33,0xed,0x32,0x39,0x2f,0x2b, +0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x50,0xb4,0xa8,0xdd,0x93,0x28,0x3a,0x38,0x28,0x2a,0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x3b,0x27,0x29,0x3c,0x3a,0x06,0xdb,0xf6,0xf6,0xbd,0x39,0x2a,0x2a,0x39,0x3a, +0x29,0x29,0x3a,0x3b,0x28,0x2a,0x39,0x3a,0x29,0x29,0x3a,0x00,0x00,0x03,0x00,0x7d,0x04,0xc2,0x02,0xc4,0x06,0x74,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x3b,0x40,0x1f,0x01,0x80,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x02,0x01,0x0f,0x03,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1c,0x1d,0x19,0x07,0x2b,0x3a,0x2b, +0x01,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x5f,0x5e,0x5d,0x00,0x2f,0x33,0xed,0x32,0x39,0x2f,0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x50,0xb4,0xa8,0xdd,0x93,0x28,0x3a,0x38,0x28,0x2a, +0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x39,0x29,0x29,0x3c,0x3a,0x05,0x7f,0xf5,0xf5,0xbd,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x3b,0x28,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x02,0x00,0xa9,0x06,0x0c,0x03,0x2a,0x08,0x08,0x00,0x03,0x00,0x16,0x00,0x54,0xb9,0x00,0x01,0xff,0xc0,0x40,0x0f,0x09,0x0d,0x48,0x01,0x80,0x03,0x40,0x10,0x15, +0x48,0x03,0x16,0x10,0xda,0x0b,0xb8,0xff,0xc0,0x40,0x1e,0x09,0x0c,0x48,0x0b,0x14,0xda,0x07,0x0d,0x02,0x20,0x0a,0x0d,0x48,0x02,0x5f,0x00,0x6f,0x00,0x02,0x00,0x00,0x0e,0x04,0xc4,0x16,0x16,0x18,0x0d,0xc4,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xcd,0x2b,0x00,0x2f,0xd6,0xed,0xdc,0x2b,0xfd,0xc6,0xd6,0x2b,0x1a, +0xcd,0x2b,0x31,0x30,0x01,0x37,0x33,0x07,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x62,0xb4,0xa8,0xdc,0x01,0x48,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x07,0x12,0xf6,0xf6,0x1a,0x65,0x75,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0x00,0x02, +0x00,0xa9,0x04,0xb2,0x03,0x2a,0x06,0xae,0x00,0x03,0x00,0x16,0x00,0x3e,0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x1d,0x09,0x0c,0x48,0x00,0x16,0x10,0xda,0x0b,0x14,0xda,0x07,0x0d,0x02,0x5f,0x00,0x6f,0x00,0x02,0x00,0x00,0x0e,0x04,0xc4,0x16,0x16,0x18,0x0d,0xc4,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xcd,0x00, +0x2f,0xd6,0xed,0xdc,0xfd,0xc6,0xde,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x62,0xb4,0xa8,0xdc,0x01,0x48,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x05,0xb8,0xf6,0xf6,0x1a,0x65,0x75,0x25, +0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x03,0x00,0xa9,0x06,0x0c,0x03,0x2a,0x08,0x02,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x66,0x40,0x10,0x06,0x12,0xc1,0x00,0x00,0x0c,0x10,0x0c,0x02,0x0c,0x03,0x0c,0x2a,0x24,0xda,0x1f,0xb8,0xff,0xc0,0x40,0x10,0x09,0x0c,0x48,0x1f,0x28,0xda,0x40,0x1b,0x21,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x03,0xb8, +0xff,0xc0,0xb3,0x0a,0x0d,0x48,0x15,0xb8,0xff,0xc0,0x40,0x11,0x0a,0x0d,0x48,0x18,0x22,0x03,0x15,0x2b,0x3a,0x18,0xc4,0x2a,0x2a,0x2c,0x21,0xc4,0x22,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x2b,0x2b,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xd6,0x1a,0xed,0xdc,0x2b,0xfd,0xc6,0xd6,0x5f,0x5e,0x5d,0x32,0xed,0x32,0x31,0x30,0x01,0x22, +0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xab,0x29,0x3a,0x39,0x28,0x29,0x3c,0x3a,0xfe,0x56,0x28,0x3c,0x3a,0x28,0x2a,0x3a,0x38,0x01,0xd6,0x5d,0x55,0x43, +0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x07,0x3e,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x46,0x65,0x75,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0x00,0x00,0x03,0x00,0xa9,0x04,0xb2,0x03,0x2a,0x06,0xa8,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x3f,0x40,0x22,0x06,0x12,0xc1,0x00, +0x0c,0x2a,0x24,0xda,0x1f,0x28,0xda,0x40,0x1b,0x21,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x22,0x03,0x15,0x2b,0x3a,0x18,0xc4,0x2a,0x2a,0x2c,0x21,0xc4,0x22,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xd6,0x1a,0xed,0xdc,0xfd,0xc6,0xde,0x32,0xed,0x32,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xab,0x29,0x3a,0x39,0x28,0x29,0x3c,0x3a,0xfe,0x56,0x28,0x3c,0x3a,0x28,0x2a,0x3a,0x38,0x01,0xd6,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e, +0xb6,0x3f,0x52,0x51,0x33,0x54,0x05,0xe4,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x46,0x65,0x75,0x25,0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x02,0x00,0x14,0x06,0x1e,0x02,0x12,0x07,0x6a,0x00,0x0b,0x00,0x0f,0x00,0x1f,0x40,0x0e,0x06,0xc1,0x40,0x00,0x00,0x0e,0x80,0x0c,0x03,0xc0,0x09,0x09, +0x0e,0x0c,0x2f,0xcd,0x39,0x2f,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x37,0x33,0x07,0x76,0x28,0x3a,0x39,0x29,0x28,0x3a,0x3a,0x17,0xb5,0xa8,0xde,0x06,0xa8,0x38,0x2a,0x29,0x37,0x37,0x29,0x28,0x3a,0x8a,0xf6,0xf6,0x00,0x02,0x00,0x14,0x04,0xc2, +0x02,0x12,0x06,0x0e,0x00,0x0b,0x00,0x0f,0x00,0x1f,0x40,0x0e,0x06,0xc1,0x40,0x00,0x00,0x0e,0x80,0x0c,0x03,0xc0,0x09,0x09,0x0e,0x0c,0x2f,0xcd,0x39,0x2f,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x37,0x33,0x07,0x76,0x28,0x3a,0x39,0x29,0x28,0x3a, +0x3a,0x17,0xb5,0xa8,0xde,0x05,0x4c,0x38,0x2a,0x29,0x37,0x37,0x29,0x29,0x39,0x8a,0xf6,0xf6,0x00,0x02,0x00,0x1e,0x06,0x1e,0x02,0x51,0x07,0xd7,0x00,0x0b,0x00,0x12,0x00,0x33,0xb3,0x06,0xc1,0x40,0x00,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x00,0x00,0x0f,0x80,0x0e,0x03,0xc0,0x09,0x0c,0x0f,0x09,0xc0,0x2b,0x30,0x0c,0x0c,0x14, +0x0f,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x07,0x23,0x27,0x33,0x17,0x37,0x01,0x34,0x28,0x3a,0x39,0x29,0x29,0x39,0x39,0xf4,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x07,0x14,0x39,0x2a,0x28,0x38,0x37,0x29, +0x29,0x3a,0x04,0xfa,0xfa,0x93,0x93,0x00,0x00,0x02,0x00,0x1e,0x04,0xc2,0x02,0x51,0x06,0x7b,0x00,0x0b,0x00,0x12,0x00,0x2a,0x40,0x15,0x06,0xc1,0x40,0x00,0x00,0x0f,0x80,0x0e,0x03,0xc0,0x09,0x0c,0x0f,0x09,0xc0,0x2b,0x30,0x0c,0x0c,0x14,0x0f,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed, +0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x07,0x23,0x27,0x33,0x17,0x37,0x01,0x34,0x28,0x3a,0x39,0x29,0x29,0x39,0x39,0xf4,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x05,0xb8,0x39,0x29,0x29,0x38,0x37,0x2a,0x28,0x3a,0x04,0xfa,0xfa,0x93,0x93,0x00,0x03,0x00,0x14,0x06,0x1e,0x02,0x5b,0x07,0x9e,0x00,0x0b, +0x00,0x17,0x00,0x1b,0x00,0x39,0xb4,0x06,0x12,0xc1,0x00,0x0c,0xb8,0xff,0xc0,0x40,0x18,0x09,0x0c,0x48,0x0c,0x1a,0xe2,0x40,0x19,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x19,0x03,0x15,0x2b,0x3a,0x18,0x18,0x1d,0x19,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xfd,0xde,0x2b,0x32,0xed,0x32,0x31,0x30,0x01, +0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x21,0x35,0x21,0x01,0xf9,0x29,0x3a,0x39,0x28,0x29,0x3b,0x39,0xfe,0x56,0x2b,0x39,0x39,0x29,0x29,0x3b,0x39,0x01,0x99,0xfe,0x04,0x01,0xfc,0x06,0xd9,0x38,0x2b,0x2a,0x38,0x3a,0x28,0x2a,0x39,0x39,0x2a,0x29, +0x39,0x3a,0x28,0x2a,0x39,0xbb,0x6e,0x00,0x00,0x03,0x00,0x14,0x04,0xc2,0x02,0x5b,0x06,0x42,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x30,0x40,0x19,0x06,0x12,0xc1,0x00,0x0c,0x1a,0xe2,0x40,0x19,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x19,0x03,0x15,0x2b,0x3a,0x18,0x18,0x1d,0x19,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00, +0x18,0x2f,0x1a,0xfd,0xde,0x32,0xed,0x32,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x21,0x35,0x21,0x01,0xf9,0x29,0x3a,0x39,0x28,0x29,0x3b,0x39,0xfe,0x56,0x2a,0x3a,0x3a,0x28,0x29,0x3b,0x39,0x01,0x99,0xfe,0x04,0x01,0xfc,0x05,0x7d, +0x38,0x2a,0x2a,0x39,0x3a,0x29,0x29,0x39,0x38,0x2a,0x2a,0x39,0x3a,0x29,0x29,0x39,0xbb,0x6d,0xff,0xff,0x00,0xbc,0xfe,0x50,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x8a,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x7d, +0x00,0x00,0xff,0xff,0x00,0x16,0xfe,0x04,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x75,0xf9,0x6c,0x00,0x27,0x40,0x1a,0x03,0x02,0x00,0x13,0x19,0x06,0x07,0x25,0x03,0x02,0x16,0x40,0x09,0x0d,0x36,0x16,0x40,0x0a,0x0b,0x36,0x20,0x16,0x01,0x16,0x14,0x26,0x00,0x2b,0x5d,0x2b,0x2b,0x35,0x35,0x01, +0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x05,0x03,0x83,0x04,0x18,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xe9,0xf9,0x6d,0x00,0x27,0x40,0x1a,0x03,0x02,0x1b,0x23,0x29,0x08,0x00,0x25,0x03,0x02,0x26,0x40,0x09,0x0d,0x36,0x26,0x40,0x0a,0x0b,0x36,0x20,0x26,0x01,0x26,0x17,0x26,0x00,0x2b,0x5d,0x2b,0x2b,0x35, +0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x06,0xe2,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x47,0x01,0x5d,0x00,0x16,0xb9,0x00,0x03,0xff,0xc3,0x40,0x09,0x23,0x29,0x01,0x05,0x25,0x03,0x20,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec, +0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8b,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0xad,0x21,0x21,0x05,0x05,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0x2f,0x05,0x9a,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe1,0x00,0x00,0x00,0x1a,0xb9,0x00, +0x03,0xff,0xc1,0x40,0x0c,0x23,0x29,0x00,0x0c,0x25,0x03,0x20,0x26,0x01,0x26,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x1a,0x00,0x00,0x00,0x1a,0xb9,0x00,0x02,0xff,0xf2,0x40,0x0c,0x21,0x27,0x03,0x0c,0x25,0x02,0x20, +0x24,0x01,0x24,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1e,0x04,0x2f,0x05,0x9a,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5c,0x00,0x1a,0xb9,0x00,0x03,0xff,0xe3,0x40,0x0c,0x21,0x20,0x00,0x0c,0x25,0x03,0x20,0x22,0x01,0x22,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0xa6,0xff,0x1e,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x3f,0xfa,0x5c,0x00,0x17,0x40,0x0e,0x02,0x00,0x1f,0x1e,0x03,0x0c,0x25,0x02,0x20,0x20,0x01,0x20,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0x50,0x04,0x8c,0x07,0x67,0x02,0x26,0x00,0x26, +0x00,0x00,0x00,0x27,0x00,0xdd,0x02,0x39,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xf5,0x01,0x5d,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0x62,0x06,0x0a,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x27,0x00,0xdd,0x01,0x83,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x2f,0x00,0x00,0x00,0x08,0xb3,0x02, +0x2a,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x06,0xe2,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xd2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xa3,0x40,0x09,0x13,0x19,0x01,0x04,0x25,0x02,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec, +0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x64,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0x29,0x40,0x09,0x27,0x27,0x0f,0x0f,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x54,0x00,0x00,0x00,0x1a, +0xb9,0x00,0x02,0xff,0xac,0x40,0x0c,0x13,0x19,0x00,0x04,0x25,0x02,0x20,0x16,0x01,0x16,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x02,0x00,0x00,0x00,0x17,0x40,0x0e,0x02,0x1f,0x21,0x27,0x08,0x00,0x25,0x02,0x20,0x24, +0x01,0x24,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1e,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x46,0xfa,0x5c,0x00,0x1a,0xb9,0x00,0x02,0xff,0x85,0x40,0x0c,0x11,0x10,0x00,0x04,0x25,0x02,0x20,0x12,0x01,0x12,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0x60,0xff,0x1e,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5c,0x00,0x17,0x40,0x0e,0x02,0x20,0x1f,0x1e,0x08,0x00,0x25,0x02,0x20,0x20,0x01,0x20,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27, +0x00,0x00,0x01,0x07,0x01,0x9d,0x01,0x4a,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xb8,0x40,0x09,0x12,0x10,0x00,0x04,0x25,0x02,0x13,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x85,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x01,0x9d,0x00,0xdd,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x4b, +0x21,0x1e,0x08,0x00,0x25,0x02,0x21,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3d,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x3f,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x02,0xff,0xb8,0x40,0x09,0x14,0x10,0x00,0x04,0x25,0x02,0x15,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0x60,0xfe,0x3e,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe0,0xf9,0x7c,0x00,0x13,0x40,0x0b,0x02,0x1e,0x22,0x1e,0x08,0x00,0x25,0x02,0x23,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0xcf,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07, +0x02,0xd1,0x00,0xec,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x11,0x10,0x02,0x03,0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x72,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0xd2,0x00,0xe4,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x20, +0x21,0x0c,0x12,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0xcf,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0xd3,0x00,0xfd,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x11,0x13,0x02,0x0b,0x25,0x02,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x35,0x01, +0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x72,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0xd4,0x00,0xe4,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1f,0x21,0x0c,0x12,0x25,0x03,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3c,0x03,0xb4,0x05,0x9a, +0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xd9,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x17,0x10,0x0c,0x01,0x00,0x25,0x01,0x11,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x3d,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xda,0xf9,0x7b,0x00,0x13,0x40,0x0b, +0x02,0x32,0x1e,0x1a,0x0c,0x00,0x25,0x02,0x1f,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x9a,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd1,0xf9,0xe8,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x16,0x0c,0x01,0x00,0x25,0x01,0x1f,0x14,0x26,0x00,0x2b,0x35,0x01, +0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x99,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xe1,0xf9,0xe7,0x00,0x13,0x40,0x0b,0x02,0x26,0x24,0x1a,0x0c,0x00,0x25,0x02,0x2d,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x50,0x03,0xb4,0x07,0x1c,0x02,0x26,0x00,0x28,0x00,0x00, +0x00,0x27,0x00,0xdd,0x01,0x8a,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xec,0x01,0x5e,0x00,0x16,0xb9,0x00,0x02,0xff,0xfb,0x40,0x09,0x25,0x1f,0x02,0x03,0x25,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x27,0x00,0xdd,0x01,0x7d,0x00,0x00, +0x01,0x07,0x00,0xda,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x06,0x33,0x2d,0x0c,0x12,0x25,0x03,0x30,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0x94,0x06,0xe2,0x02,0x26,0x00,0x29,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x4a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x0d, +0x13,0x08,0x09,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0xe2,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x03,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x1e,0x0a,0x09,0x25,0x01,0x15,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e, +0xff,0xe8,0x04,0xec,0x06,0x8c,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xda,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x80,0x1b,0x1a,0x05,0x0a,0x25,0x01,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0x2f,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x17, +0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x1b,0x27,0x26,0x10,0x18,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x06,0xe2,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x01,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf8,0x40,0x09,0x0f,0x15,0x06,0x0b,0x25,0x01,0x0c, +0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0xae,0x15,0x15,0x0b,0x0b,0x25,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xf2,0x05,0x9a, +0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x8f,0x00,0x00,0x00,0x17,0x40,0x0e,0x01,0x0d,0x0f,0x15,0x05,0x00,0x25,0x01,0x20,0x12,0x01,0x12,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe7,0x00,0x00, +0x00,0x1a,0xb9,0x00,0x01,0xff,0xed,0x40,0x0c,0x15,0x1b,0x09,0x00,0x25,0x01,0x20,0x18,0x01,0x18,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x06,0xe4,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x38,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x1b,0x15,0x06,0x0b,0x25, +0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0xe4,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe3,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x16,0x21,0x21,0x0b,0x0b,0x25,0x02,0x01,0x1e,0x02,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, +0xff,0xff,0x00,0xa0,0xfe,0x50,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x00,0x06,0x00,0xdd,0x6d,0x00,0xff,0xff,0x00,0x8c,0xfe,0x50,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x00,0x06,0x00,0xdd,0x59,0x00,0xff,0xff,0x00,0xbc,0xfe,0x8c,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xda, +0x01,0xa6,0xf9,0xca,0x00,0x13,0x40,0x0b,0x01,0x06,0x12,0x0c,0x05,0x00,0x25,0x01,0x12,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0x8c,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x27,0xf9,0xca,0x00,0x13,0x40,0x0b,0x01,0x0f,0x18,0x12,0x09,0x00,0x25,0x01,0x18,0x17, +0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xcf,0xfe,0x9c,0x02,0x50,0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xac,0xf9,0xea,0x00,0x0b,0xb6,0x01,0x00,0x0e,0x04,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xb9,0xfe,0x9c,0x02,0x3a,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x07, +0x00,0xd8,0xff,0x96,0xf9,0xea,0x00,0x0b,0xb6,0x02,0x00,0x1a,0x10,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x07,0xd1,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x02,0xd5,0xff,0x75,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x05,0x17,0x11,0x02,0x03,0x25,0x03,0x02,0x01,0x14,0x05,0x26,0x00, +0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0xff,0xd4,0x00,0x00,0x02,0x1b,0x06,0x74,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x02,0xd6,0xff,0x57,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x00,0x17,0x11,0x02,0x03,0x25,0x03,0x02,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00, +0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x07,0x65,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x62,0x01,0x5b,0x00,0x16,0xb9,0x00,0x01,0xff,0x8f,0x40,0x09,0x13,0x12,0x08,0x0f,0x25,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x67,0x02,0x26,0x00,0x4e,0x00,0x00, +0x01,0x07,0x00,0x8e,0x00,0xe2,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x1f,0x0f,0x0f,0x07,0x07,0x25,0x01,0x0f,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x29,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xcf,0x40,0x0c,0x14, +0x1a,0x07,0x00,0x25,0x01,0x20,0x17,0x01,0x17,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc8,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xce,0x40,0x0c,0x10,0x16,0x05,0x00,0x25,0x01,0x20,0x13,0x01,0x13,0x17,0x26,0x00, +0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1c,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x4f,0xfa,0x5a,0x00,0x1a,0xb9,0x00,0x01,0xff,0xdc,0x40,0x0c,0x13,0x14,0x07,0x00,0x25,0x01,0x20,0x13,0x01,0x13,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c, +0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x00,0xfa,0x5a,0x00,0x1a,0xb9,0x00,0x01,0xff,0xed,0x40,0x0c,0x0f,0x10,0x05,0x00,0x25,0x01,0x20,0x0f,0x01,0x0f,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07, +0x02,0x45,0x00,0xcd,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xf2,0x40,0x0c,0x09,0x0f,0x01,0x00,0x25,0x01,0x20,0x0c,0x01,0x0c,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x95,0xfe,0xc6,0x01,0x5b,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x06,0x02,0x45,0xa3,0x00,0x00,0x17,0x40,0x0e,0x01,0x00,0x07,0x0d, +0x01,0x00,0x25,0x01,0x20,0x0a,0x01,0x0a,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xa4,0x06,0x8c,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x27,0x00,0xd9,0x00,0xcf,0x01,0x5d,0x01,0x07,0x02,0x45,0x00,0xcd,0x00,0x00,0x00,0x2c,0xb9,0x00,0x02,0xff,0xf2,0xb5,0x0d,0x13,0x01,0x00,0x25,0x01, +0xb8,0xff,0xdb,0x40,0x10,0x07,0x06,0x02,0x00,0x25,0x02,0x20,0x10,0x01,0x10,0x14,0x26,0x01,0x07,0x05,0x26,0x00,0x2b,0x35,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x2b,0x35,0xff,0xff,0xff,0xfa,0xfe,0xc6,0x01,0xf6,0x06,0x8c,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x27,0x00,0xd9,0xff,0xbc,0x01,0x5d,0x01,0x06,0x02,0x45,0xa2,0x00,0x00,0x29, +0xb9,0x00,0x02,0xff,0xff,0x40,0x17,0x0b,0x11,0x01,0x00,0x3e,0x01,0x00,0x05,0x04,0x01,0x00,0x3e,0x02,0x20,0x0e,0x01,0x0e,0x17,0x26,0x01,0x05,0x02,0x26,0x00,0x2b,0x35,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1c,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfe, +0xfa,0x5a,0x00,0x17,0x40,0x0e,0x01,0x0a,0x08,0x09,0x01,0x00,0x25,0x01,0x20,0x08,0x01,0x08,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfc,0xff,0x1c,0x01,0xf8,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xbe,0xfa,0x5a,0x00,0x17,0x40,0x0e,0x01,0x00,0x06,0x07,0x01,0x00,0x25,0x01, +0x20,0x06,0x01,0x06,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3d,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xbb,0xf9,0x7b,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x06,0x01,0x00,0x25,0x01,0x0b,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdf, +0xfe,0x3e,0x02,0x13,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0x83,0xf9,0x7c,0x00,0x13,0x40,0x0b,0x01,0x00,0x08,0x04,0x01,0x00,0x25,0x01,0x09,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x07,0x67,0x02,0x26,0x00,0x30,0x00,0x00,0x00,0x07,0x00,0x8e,0x02,0x48, +0x01,0x5d,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x06,0x0a,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x32,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x22,0x20,0x13,0x1f,0x25,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x06,0xe2,0x02,0x26,0x00,0x30,0x00,0x00, +0x00,0x07,0x00,0xdb,0x02,0x78,0x01,0x5d,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x05,0x85,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0xac,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x23,0x29,0x13,0x1f,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x06,0x72, +0x05,0x9a,0x02,0x26,0x00,0x30,0x00,0x00,0x00,0x07,0x02,0x45,0x01,0xf2,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x06,0x54,0x04,0x18,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x02,0x45,0x02,0x27,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x23,0x29,0x12,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0xe3, +0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x27,0x01,0x5e,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x17,0x1d,0x0a,0x13,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0x85,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8a,0x00,0x00,0x00,0x13, +0x40,0x0b,0x01,0x09,0x16,0x1c,0x0a,0x12,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xa0,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xf7,0xb4,0x17,0x1d,0x09,0x00,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6, +0xfe,0xc6,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x04,0x00,0x00,0x00,0x0b,0xb6,0x01,0x0a,0x16,0x1c,0x0a,0x12,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1c,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xbf,0xfa,0x5a,0x00,0x1e,0xb9,0x00,0x01,0xff, +0xfd,0xb6,0x16,0x17,0x0a,0x13,0x25,0x01,0x16,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x16,0x14,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x21,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x0e,0x15,0x16,0x0a,0x12,0x25,0x01,0x15,0xb8, +0xff,0xc0,0xb5,0x09,0x0b,0x36,0x15,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x3c,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x91,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x09,0x18,0x14,0x0a,0x13,0x25,0x01,0x19,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0xa6,0xfe,0x3c,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe2,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x09,0x17,0x13,0x0a,0x12,0x25,0x01,0x18,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x08,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd7, +0x01,0x1e,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x26,0x1c,0x03,0x09,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xae,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0xd8,0x6d,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x26,0x1c,0x03,0x09,0x25, +0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x02,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd9,0x01,0x1b,0x00,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x00,0x3a,0x30,0x03,0x09,0x25,0x04,0x03,0x02,0x3a,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b, +0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xa8,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0xda,0x73,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x04,0x3a,0x30,0x03,0x09,0x25,0x04,0x03,0x02,0x3a,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa, +0x07,0xcf,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd1,0x01,0xca,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1d,0x1c,0x03,0x09,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x72,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0xd2,0x01,0x1c, +0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1d,0x1f,0x03,0x09,0x25,0x03,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xcf,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd3,0x01,0xca,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1c,0x1f,0x03,0x09,0x25, +0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x72,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0xd4,0x01,0x13,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf7,0x40,0x0a,0x1d,0x1f,0x03,0x09,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, +0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x07,0x67,0x02,0x26,0x00,0x33,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xb9,0x40,0x09,0x15,0x13,0x03,0x07,0x25,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x06,0x0a,0x02,0x26,0x00,0x53, +0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1b,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe7,0x40,0x09,0x20,0x1e,0x04,0x0c,0x25,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x06,0xe2,0x02,0x26,0x00,0x33,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x5c,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff, +0xb8,0x40,0x09,0x16,0x1c,0x03,0x07,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0x85,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x9f,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf0,0x40,0x09,0x21,0x27,0x04,0x0c,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01, +0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x06,0xe2,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x87,0x01,0x5d,0x00,0x08,0xb3,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xbc,0x05,0x85,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xb6,0x00,0x00,0x00,0x16,0xb9,0x00, +0x01,0xff,0xd3,0x40,0x09,0x14,0x1a,0x08,0x10,0x25,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x07,0x02,0x45,0x01,0x33,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x06,0x02,0x45, +0x5a,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xc0,0x06,0x8c,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x27,0x00,0xd9,0x01,0x23,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x33,0x00,0x00,0x00,0x08,0xb3,0x02,0x29,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x02,0xbc,0x05,0x2f,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x26,0x00,0xd9, +0x6c,0x00,0x01,0x06,0x02,0x45,0x5a,0x00,0x00,0x22,0xb9,0x00,0x02,0xff,0xfe,0xb5,0x18,0x1e,0x08,0x10,0x3e,0x01,0xb8,0xff,0xf7,0x40,0x09,0x12,0x11,0x08,0x10,0x3e,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1b,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xd9, +0x01,0x5c,0xfa,0x59,0x00,0x11,0xb1,0x02,0x2a,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x2a,0x14,0x26,0x00,0x2b,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xff,0x1d,0x02,0xc7,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x8d,0xfa,0x5b,0x00,0x1c,0x40,0x09,0x01,0x18,0x13,0x14,0x08,0x10,0x25,0x01,0x13,0xb8,0xff,0xc0, +0xb5,0x09,0x0b,0x36,0x13,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x06,0xe2,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x83,0x01,0x5d,0x00,0x08,0xb3,0x01,0x36,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x05,0x85,0x02,0x26,0x00,0x56,0x00,0x00, +0x01,0x07,0x00,0xdb,0x01,0x05,0x00,0x00,0x00,0x08,0xb3,0x01,0x2f,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x79,0xfe,0xc6,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x07,0x02,0x45,0x00,0xd3,0x00,0x00,0xff,0xff,0x00,0x68,0xfe,0xc6,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06,0x02,0x45,0x72,0x00, +0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x02,0xdb,0x01,0x5a,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x42,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0e,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x02,0xdc,0x00,0xdb,0x00,0x00,0x00,0x0a,0xb4,0x02, +0x01,0x3e,0x11,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0xd7,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x02,0xdd,0x01,0x16,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x44,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x7b,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x02,0xde, +0x00,0x8c,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x3d,0x11,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x79,0xfe,0xc6,0x03,0xde,0x06,0xe2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x27,0x00,0xdb,0x01,0x93,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x0b,0x00,0x00,0x00,0x08,0xb3,0x01,0x36,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xfe,0xc6, +0x03,0x0f,0x05,0x85,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x27,0x02,0x45,0x00,0x82,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xff,0x00,0x00,0x00,0x08,0xb3,0x01,0x3b,0x14,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x06,0xe2,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x4d,0x01,0x5d,0x00,0x13,0x40,0x0b, +0x01,0x00,0x0b,0x11,0x06,0x07,0x25,0x01,0x08,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x55,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x5e,0x00,0xd0,0x00,0x19,0xb9,0x00,0x01,0xff,0xd6,0xb6,0x18,0x1e,0x07,0x14,0x25,0x01,0x15,0xb9,0x01,0x2d,0x00,0x0a,0x00,0x10, +0xfe,0x34,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x29,0xfe,0xc6,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc4,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0b,0x11,0x06,0x07,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0xc6,0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x06,0x02,0x45, +0x13,0x00,0x00,0x0b,0xb6,0x01,0x12,0x18,0x1e,0x07,0x14,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x29,0xff,0x1c,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xe0,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x00,0x0a,0x0b,0x06,0x07,0x25,0x01,0x0a,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0a,0x14,0x26,0x00, +0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x2b,0xff,0x1b,0x02,0x95,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x5b,0xfa,0x59,0x00,0x1c,0x40,0x09,0x01,0x41,0x17,0x18,0x07,0x14,0x25,0x01,0x17,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x17,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x29, +0xfe,0x3d,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xa7,0xf9,0x7b,0x00,0x13,0x40,0x0b,0x01,0x03,0x0c,0x08,0x06,0x07,0x25,0x01,0x0d,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x3e,0x02,0x86,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xf6, +0xf9,0x7c,0x00,0x13,0x40,0x0b,0x01,0x16,0x19,0x15,0x07,0x14,0x25,0x01,0x1a,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xfe,0xc3,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x17,0xfa,0x01,0x00,0x22,0xb1,0x02,0x01,0xb8,0xff,0xf8,0xb7,0x1d,0x17,0x05,0x0d,0x25,0x02,0x01, +0x20,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x20,0x14,0x26,0x00,0x2b,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x90,0xfe,0xc4,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x7f,0xfa,0x02,0x00,0x22,0xb1,0x02,0x01,0xb8,0xff,0xe6,0xb7,0x21,0x1b,0x08,0x11,0x25,0x02,0x01,0x24,0xb8,0xff,0xc0, +0xb5,0x09,0x0b,0x36,0x24,0x17,0x26,0x00,0x2b,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xaa,0xfe,0x9e,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x4c,0xf9,0xec,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x18,0x0e,0x05,0x0d,0x25,0x01,0x21,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0x90,0xfe,0x9e,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd3,0xf9,0xec,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x1c,0x12,0x08,0x11,0x25,0x01,0x25,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xfe,0x3d,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00, +0x01,0x07,0x00,0xd7,0x01,0x42,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x01,0xff,0xf9,0x40,0x09,0x12,0x0e,0x05,0x0d,0x25,0x01,0x13,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xfe,0x3d,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xbb,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x01,0xff,0xf8,0x40, +0x09,0x16,0x12,0x08,0x11,0x25,0x01,0x17,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x08,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x02,0xd7,0x00,0xdc,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x06,0x1c,0x12,0x05,0x0d,0x25,0x02,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, +0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xae,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x02,0xd8,0x59,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x09,0x20,0x16,0x08,0x11,0x25,0x02,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x9e,0x02,0x26,0x00,0x38, +0x00,0x00,0x01,0x07,0x02,0xdf,0x01,0x8c,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x04,0x1d,0x17,0x05,0x0d,0x25,0x03,0x02,0x01,0x27,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x42,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0xe0,0x00,0xff,0x00,0x00, +0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xfd,0x40,0x0b,0x21,0x1b,0x08,0x11,0x25,0x03,0x02,0x01,0x2b,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6,0x07,0x0f,0x02,0x26,0x00,0x39,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x1d,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x04,0x16,0x0c, +0x03,0x00,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xcb,0x05,0xb2,0x02,0x26,0x00,0x59,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x16,0x0c,0x03,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12, +0xfe,0xc6,0x04,0xe6,0x05,0x9a,0x02,0x26,0x00,0x39,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x29,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0f,0x15,0x03,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0xc6,0x03,0xcb,0x04,0x00,0x02,0x26,0x00,0x59,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0x92,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff, +0xfb,0xb4,0x0f,0x15,0x03,0x00,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x06,0xe2,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0xfd,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0e,0x1f,0x25,0x0b,0x00,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0, +0x05,0x85,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x24,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0e,0x1f,0x25,0x0b,0x00,0x25,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0xfe,0xc6,0x07,0x60,0x05,0x9a,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x02,0x45,0x02,0x75,0x00,0x00,0x00,0x0b, +0xb6,0x01,0x0d,0x1f,0x25,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0xfe,0xc6,0x05,0xb0,0x04,0x00,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x95,0x00,0x00,0x00,0x0b,0xb6,0x01,0x06,0x1f,0x25,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x06,0xe2,0x02,0x26,0x00,0x3b, +0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x93,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x07,0x19,0x1f,0x09,0x00,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x05,0x85,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x0e,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x06,0x17,0x1d, +0x0b,0x00,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x06,0xe4,0x02,0x26,0x00,0x3b,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xcd,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x13,0x25,0x1f,0x09,0x00,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, +0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x05,0x87,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x06,0x00,0x8f,0x43,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x0d,0x23,0x1d,0x0b,0x00,0x25,0x02,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2,0x02,0x26,0x00,0x3c,0x00,0x00, +0x01,0x07,0x00,0xdb,0x01,0x67,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x11,0x17,0x05,0x00,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x85,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x1f,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40, +0x09,0x18,0x1e,0x0c,0x00,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x6b,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xdb,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0f,0x0e,0x0a,0x05,0x09,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0e,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x06,0x00,0xd7,0x6f,0x00,0x00,0x13,0x40,0x0b,0x01,0x1d,0x0e,0x0a,0x05,0x09,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xfe,0xc6,0x04,0x64,0x05,0x9a,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xfd, +0x00,0x00,0x00,0x0b,0xb6,0x01,0x10,0x0d,0x13,0x05,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xfe,0xc6,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0x87,0x00,0x00,0x00,0x0b,0xb6,0x01,0x14,0x0d,0x13,0x05,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xff,0x1c,0x04,0x64,0x05,0x9a, +0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x0c,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x06,0x0c,0x0d,0x05,0x09,0x25,0x01,0x0c,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0c,0x14,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0xff,0x1b,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xd9, +0x00,0x9c,0xfa,0x59,0x00,0x1c,0x40,0x09,0x01,0x10,0x0c,0x0d,0x05,0x09,0x25,0x01,0x0c,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0c,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x09, +0x14,0x15,0x0a,0x11,0x25,0x01,0x14,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x14,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x57,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0xb8,0x00,0xd0,0x00,0x1b,0x40,0x0b,0x02,0x01,0x00,0x24,0x1e,0x07,0x14,0x25,0x02,0x01,0x15,0xb9, +0x01,0x2d,0x00,0x0a,0x00,0x10,0xfe,0x34,0x34,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x1c,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0xcc,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x08,0x1f,0x25,0x0b,0x00,0x25,0x02,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, +0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x1c,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xcb,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a,0x18,0x1e,0x0c,0x00,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x1f,0x02,0x26, +0x00,0x44,0x00,0x00,0x01,0x07,0x06,0x84,0x00,0xc9,0xff,0xf0,0x00,0x13,0x40,0x0b,0x02,0x30,0x26,0x29,0x08,0x14,0x25,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x4e,0x00,0x00,0x02,0x62,0x06,0xe2,0x02,0x26,0x01,0x84,0x00,0x00,0x01,0x07,0x00,0xdb,0xff,0xe2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff, +0x2c,0x40,0x09,0x10,0x16,0x07,0x0c,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x29,0x29,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x2d,0x33,0x0a,0x13,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x61,0xe8,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xb3,0x40,0x09,0x2b,0x31,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x36, +0x0c,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xde,0x40,0x0a,0x2d,0x34,0x0a,0x13,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x43,0xf2,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xc3,0x40,0x0a,0x2a,0x34, +0x0a,0x13,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x37,0x37,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x2d,0x34,0x0a,0x13,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, +0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x44,0x27,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9,0x40,0x0a,0x2a,0x34,0x0a,0x13,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f, +0x00,0x00,0x01,0x06,0x04,0x38,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xd1,0x40,0x0a,0x2d,0x27,0x0a,0x13,0x25,0x03,0x02,0x33,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x45,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8, +0xff,0xd1,0x40,0x0a,0x2d,0x27,0x0a,0x13,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x27,0xfe,0x3f,0xff,0x7d,0x00,0x16,0xb4,0x02,0x19,0x04,0x19,0x02,0xb8,0xfe,0x04,0xb4,0x11,0x1c,0x05,0x00,0x25,0x01, +0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x61,0xfe,0x44,0xff,0x7d,0x00,0x16,0xb4,0x02,0x17,0x04,0x17,0x02,0xb8,0xfe,0x08,0xb4,0x14,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0x9e, +0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfe,0xd7,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07, +0x04,0x43,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x15,0x04,0x15,0x03,0x02,0xb8,0xfe,0xe5,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03, +0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfe,0xe7,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x86,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x15,0x04,0x15,0x03,0x02,0xb8,0xff,0x00,0xb4, +0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xff,0x05,0xb4,0x10,0x10,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00, +0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfd,0x88,0xb4,0x16,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe7, +0x03,0x3b,0x06,0x23,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x27,0xb2,0x00,0x00,0x13,0x40,0x0b,0x01,0x4d,0x2c,0x32,0x0c,0x11,0x25,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x23,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x61,0x82,0x00,0x00,0x13,0x40,0x0b, +0x01,0x11,0x2a,0x30,0x0c,0x11,0x25,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x36,0x8b,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x21,0x2c,0x33,0x0c,0x11,0x25,0x02,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, +0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x04,0x43,0xff,0x71,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x06,0x29,0x33,0x0c,0x11,0x25,0x02,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26, +0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x37,0xc4,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x5a,0x2c,0x33,0x0c,0x11,0x25,0x02,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x44,0xa8,0x00,0x00,0x17,0x40,0x0d,0x02,0x01, +0x3e,0x29,0x33,0x0c,0x11,0x25,0x02,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x04,0x35,0x05,0xa0,0x00,0x27,0x00,0x28,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xff,0x6b,0xb4,0x18,0x18,0x02,0x02,0x25,0x01, +0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x04,0x35,0x05,0xa0,0x00,0x27,0x00,0x28,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x13,0x04,0x13,0x01,0xb8,0xfd,0x7b,0xb4,0x10,0x0c,0x02,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0x5a, +0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xff,0x76,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00, +0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a, +0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0xf5,0xb4,0x0d,0x19,0x02,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff, +0xa0,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x27,0x1f,0x00,0x00,0x13,0x40,0x0b,0x01,0x3b,0x16,0x21,0x0c,0x14,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82, +0xfe,0x6c,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x61,0xdc,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x19,0x15,0x0c,0x14,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x36,0xdd,0x00, +0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf8,0x40,0x0a,0x16,0x22,0x0c,0x14,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x43,0xca,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe5,0x40,0x0a,0x18,0x22,0x0c,0x14, +0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x37,0x29,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x44,0x16,0x22,0x0c,0x14,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff, +0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x44,0x08,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x24,0x18,0x22,0x0c,0x14,0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06, +0x04,0x38,0xdf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a,0x1b,0x15,0x0c,0x14,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x45,0xdf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a, +0x1b,0x15,0x0c,0x14,0x25,0x02,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xff,0x6b,0xb4,0x18,0x18,0x06,0x06,0x25,0x01,0x2b,0x35, +0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x13,0x04,0x13,0x01,0xb8,0xff,0x6e,0xb4,0x0c,0x0c,0x06,0x06,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0x9e, +0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xff,0x76,0xb4,0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07, +0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a,0xb6,0x02, +0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x56,0xb4,0x0d,0x19,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0xa0,0xb4, +0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0xb2,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x64,0xb4,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00, +0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0xb2,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x64,0xb4,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x94,0xff,0xf4, +0x02,0x08,0x06,0x23,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x27,0xfe,0xb0,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb2,0x40,0x09,0x0d,0x18,0x05,0x0b,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x6e,0xff,0xf4,0x02,0x08,0x06,0x23,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x61,0xfe,0x8c, +0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x8d,0x40,0x09,0x10,0x0c,0x05,0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xdd,0xff,0xf4,0x02,0x08,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x93,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x94,0x40,0x0a,0x0d,0x19,0x05,0x0b, +0x25,0x02,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xb3,0xff,0xf4,0x02,0x08,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x6f,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x70,0x40,0x0a,0x0f,0x19,0x05,0x0b,0x25,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, +0x35,0x35,0xff,0xff,0x00,0x1b,0xff,0xf4,0x02,0x47,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0xd9,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xda,0x40,0x0a,0x0d,0x19,0x05,0x0b,0x25,0x02,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xea,0xff,0xf4,0x02,0x2d,0x06,0x06, +0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0xb2,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xb4,0x40,0x0a,0x0f,0x19,0x05,0x0b,0x25,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xc0,0xff,0xf4,0x02,0x0a,0x06,0x83,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8d, +0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8e,0x40,0x0a,0x12,0x0c,0x05,0x0b,0x25,0x02,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xc0,0xff,0xf4,0x02,0x0a,0x06,0x83,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8d,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8e,0x40,0x0a, +0x12,0x0c,0x05,0x0b,0x25,0x02,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x02,0x4a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x00,0xe6,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x07,0xb2,0x01,0x0d,0x03,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x02,0x48,0x05,0xa0, +0x00,0x27,0x00,0x2c,0x00,0xe4,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x07,0xb2,0x01,0x0b,0x04,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x3a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x01,0xd6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x73,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00, +0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0x3a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x01,0xd6,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0x00,0x00,0x03,0x6e,0x05,0xa0,0x00,0x27,0x00,0x2c,0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7a,0xff,0x9a, +0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbf,0x00,0x00,0x03,0x77,0x05,0xa0,0x00,0x27,0x00,0x2c,0x02,0x13,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xb2,0x00,0x27,0x00,0x2c, +0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8a,0xff,0x2f,0x00,0x09,0xb3,0x02,0x01,0x0d,0x04,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xb2,0x00,0x27,0x00,0x2c,0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8a,0xff,0x2f,0x00,0x09,0xb3,0x02,0x01,0x0d,0x04,0x00,0x3f,0x35,0x35,0x00,0xff,0xff, +0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x23,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x27,0x0a,0x00,0x00,0x13,0x40,0x0b,0x02,0x0b,0x19,0x24,0x03,0x09,0x25,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x23,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x61,0xd4,0x00, +0x00,0x16,0xb9,0x00,0x02,0xff,0xd4,0x40,0x09,0x1c,0x18,0x03,0x09,0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x36,0xe9,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe9,0x40,0x0a,0x19,0x25,0x03,0x09,0x25,0x03,0x02,0x18, +0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x43,0xb9,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xb9,0x40,0x0a,0x1b,0x25,0x03,0x09,0x25,0x03,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60, +0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x37,0x21,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x21,0x19,0x25,0x03,0x09,0x25,0x03,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x44, +0xfc,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x1b,0x25,0x03,0x09,0x25,0x03,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x02,0x21,0x04,0x21,0x02,0xb8,0xfc, +0xc8,0xb4,0x19,0x24,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x02,0x1f,0x04,0x1f,0x02,0xb8,0xfc,0xca,0xb4,0x1c,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff, +0xff,0xbc,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x21,0x04,0x21,0x03,0x02,0xb8,0xff,0xe2,0xb4,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27, +0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x1d,0x04,0x1d,0x03,0x02,0xb8,0xff,0xf0,0xb4,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x37, +0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x21,0x04,0x21,0x03,0x02,0xb8,0xfc,0x36,0xb4,0x19,0x25,0x03,0x09,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x86,0xff,0x98,0x00,0x18,0x40,0x0d,0x03,0x02, +0x1d,0x04,0x1d,0x03,0x02,0x0b,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x23,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x27,0xed,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xed,0x40,0x09,0x23,0x29,0x00,0x16,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01, +0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x23,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x61,0x90,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x84,0x40,0x09,0x21,0x27,0x00,0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00, +0x01,0x06,0x04,0x36,0xae,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xa9,0x40,0x0a,0x23,0x2a,0x00,0x16,0x25,0x02,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x43,0xa5,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9f, +0x40,0x0a,0x20,0x2a,0x00,0x16,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x37,0xee,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe9,0x40,0x0a,0x23,0x2a,0x00,0x16,0x25,0x02,0x01,0x1d,0x11,0x26,0x00,0x2b, +0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x44,0xcf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xca,0x40,0x0a,0x20,0x2a,0x00,0x16,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e, +0x06,0x83,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x38,0xb0,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xaa,0x40,0x0a,0x23,0x1d,0x00,0x16,0x25,0x02,0x01,0x29,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x83,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x45,0xaa,0x00, +0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xa4,0x40,0x0a,0x23,0x1d,0x00,0x16,0x25,0x02,0x01,0x2c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0x48,0x05,0xa0,0x00,0x27,0x00,0x3c,0x00,0xe8,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xfd, +0x13,0xb4,0x12,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x06,0x7d,0x05,0x9e,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x13,0x04,0x13,0x02,0x01,0xb8,0xff,0xb9,0xb4,0x1b,0x1b,0x05,0x05,0x25,0x01,0x2b,0x35,0x35,0x00, +0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x06,0x7d,0x05,0x9e,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x13,0x04,0x13,0x02,0x01,0xb8,0xff,0xd3,0xb4,0x1b,0x1b,0x05,0x05,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00, +0x06,0x7d,0x05,0xb2,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x17,0x04,0x17,0x02,0x01,0xb8,0xfc,0x8b,0xb4,0x14,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01, +0x01,0x07,0x04,0x27,0x00,0xf7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1a,0x28,0x2e,0x06,0x1d,0x25,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x61,0x00,0xca,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe1,0x40,0x09,0x26, +0x2c,0x06,0x1d,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x36,0x00,0xcc,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xea,0x40,0x0a,0x28,0x2f,0x06,0x1d,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, +0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x43,0x00,0xb3,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd0,0x40,0x0a,0x25,0x2f,0x06,0x1d,0x25,0x02,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06, +0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x37,0x01,0x27,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x45,0x28,0x2f,0x06,0x1d,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x44,0x00,0xf9,0x00,0x00, +0x00,0x17,0x40,0x0d,0x02,0x01,0x17,0x25,0x2f,0x06,0x1d,0x25,0x02,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x38,0x00,0xd5,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf2,0x40,0x0a,0x28,0x22,0x06,0x1d, +0x25,0x02,0x01,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x45,0x00,0xd5,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf2,0x40,0x0a,0x28,0x22,0x06,0x1d,0x25,0x02,0x01,0x31,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, +0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x93,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x25,0x04,0x25,0x01,0xb8,0xff,0xb1,0xb4,0x28,0x28,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x06,0x3c,0x05,0xb2,0x00,0x27, +0x00,0x9f,0x00,0x93,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x23,0x04,0x23,0x01,0xb8,0xff,0xb4,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98, +0x00,0x1a,0xb6,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0xb8,0xff,0xd7,0xb4,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x21,0x04,0x21,0x02,0x01, +0xb8,0xff,0xe7,0xb4,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0xb8,0xff,0xe8,0xb4,0x29,0x29,0x12,0x12,0x25,0x01, +0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x18,0x40,0x0d,0x02,0x01,0x21,0x04,0x21,0x02,0x01,0x00,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc, +0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x18,0x40,0x0d,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d, +0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x18,0x40,0x0d,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x55,0xbe,0x00,0x00,0x16,0xb9,0x00,0x02,0xff, +0x8f,0x40,0x09,0x29,0x27,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x60,0x35,0x00,0x00,0x13,0x40,0x0b,0x02,0x06,0x29,0x27,0x0a,0x13,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x00,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x04,0x55,0xff,0x6c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x28,0x26,0x0c,0x11,0x25,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x00,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x60, +0xda,0x00,0x00,0x13,0x40,0x0b,0x01,0x6f,0x28,0x26,0x0c,0x11,0x25,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x00,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x55,0xbe,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd9,0x40,0x09,0x17,0x15,0x0c,0x14,0x25,0x01,0x16,0x11,0x26, +0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x00,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x60,0x40,0x00,0x00,0x13,0x40,0x0b,0x01,0x5b,0x17,0x15,0x0c,0x14,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x34,0xff,0xf4,0x02,0x08,0x06,0x00,0x02,0x26,0x01,0xc9, +0x00,0x00,0x01,0x07,0x04,0x55,0xfe,0x63,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x64,0x40,0x09,0x0e,0x0c,0x05,0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0xf4,0x02,0x08,0x06,0x00,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0xdd,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff, +0xde,0x40,0x09,0x0e,0x0c,0x05,0x0b,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x55,0xd2,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xd2,0x40,0x09,0x1a,0x18,0x03,0x09,0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35, +0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x60,0x24,0x00,0x00,0x13,0x40,0x0b,0x02,0x24,0x1a,0x18,0x03,0x09,0x25,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x00,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x55, +0x8c,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x86,0x40,0x09,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x00,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x60,0x02,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1f, +0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x55,0x00,0xaf,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xcc,0x40,0x09,0x24,0x22,0x06,0x1d,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00, +0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x60,0x01,0x1f,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x3c,0x24,0x22,0x06,0x1d,0x25,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x27,0x29,0x00,0x01,0x06,0x04,0x28, +0x5c,0x00,0x00,0x1b,0x40,0x12,0x02,0x27,0x11,0x26,0x03,0x25,0x3c,0x36,0x0a,0x00,0x3e,0x02,0x00,0x2d,0x33,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x61,0xe9,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c, +0x02,0x28,0x11,0x26,0x03,0x25,0x3b,0x35,0x0a,0x00,0x3e,0x02,0xb8,0xff,0xb4,0xb4,0x2b,0x31,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x36,0x0c,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x27,0x11, +0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xde,0xb4,0x2d,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x43,0xf4,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x28,0x11, +0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xc5,0xb4,0x2a,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x37,0x38,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1f,0x40,0x14,0x03,0x02,0x27,0x11, +0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0x0a,0x2d,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x44,0x26,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x28,0x11,0x26,0x04, +0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xf8,0xb4,0x2a,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x38,0x00,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x33,0x11,0x26,0x04, +0x25,0x45,0x3f,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xd1,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x45,0x00,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x36,0x11,0x26,0x04, +0x25,0x45,0x3f,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xd1,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x04,0x29,0xfe,0x40,0xff,0x7d,0x01,0x07,0x04,0x28,0x00,0xa4,0x00,0x00,0x00,0x1f,0x40,0x0c,0x02,0x19, +0x04,0x19,0x03,0x07,0x25,0x26,0x05,0x00,0x3e,0x02,0xb8,0xfe,0xd3,0xb4,0x1c,0x1c,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x04,0x61,0xfe,0x46,0xff,0x7d,0x01,0x07,0x04,0x28,0x00,0xa4,0x00,0x00,0x00,0x1f,0x40,0x0c, +0x02,0x17,0x04,0x17,0x03,0x07,0x24,0x25,0x05,0x00,0x3e,0x02,0xb8,0xfe,0xcc,0xb4,0x1a,0x1a,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x73,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x75,0x00,0x00, +0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x13,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xd8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xc1,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7d,0xff,0x97, +0x01,0x07,0x04,0x28,0x01,0x84,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x15,0x04,0x15,0x04,0x22,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xe8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00, +0x00,0x27,0x04,0x37,0xfe,0x7b,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x50,0x00,0x00,0x00,0x25,0xb5,0x03,0x02,0x19,0x04,0x19,0x04,0xb8,0xff,0xee,0xb6,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xe8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbf,0xfe,0x40,0x05,0xd7, +0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x87,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x69,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x15,0x04,0x15,0x04,0x07,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x01,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00, +0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x8a,0xff,0x2f,0x01,0x07,0x04,0x28,0x01,0x64,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x02,0x2e,0x2f,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x06,0xb4,0x10,0x10,0x06,0x06,0x3e,0x2b,0x35,0x35, +0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x05,0xd7,0x05,0xb1,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x2e,0x01,0x07,0x04,0x28,0x01,0x68,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x06,0x2e,0x2f,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x05,0xb4, +0x10,0x10,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x27,0x1f,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x15,0x11,0x26,0x02,0x01,0x2b,0x2b,0x08,0x08,0x3e,0x01,0x2e,0x1b, +0x21,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x61,0xdd,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x16,0x11,0x26,0x02,0x01,0x2a,0x2a,0x08,0x08,0x3e,0x01,0xb8,0xff,0xe0,0xb4,0x19,0x1f, +0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x36,0xde,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x15,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff,0xe8,0xb4,0x1b,0x22, +0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x43,0xca,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x16,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff,0xd3,0xb4, +0x18,0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x37,0x27,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x15,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0x31,0x1b, +0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x44,0x08,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x16,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0x12,0x18, +0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x38,0xe0,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x21,0x11,0x26,0x03,0x01,0x34,0x34,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff, +0xe9,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x45,0xdf,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x24,0x11,0x26,0x03,0x01,0x34,0x34,0x08,0x08,0x3e,0x02,0x01, +0xb8,0xff,0xe8,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0xff,0xbc,0xfe,0x40,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x00,0x27,0x04,0x27,0xfd,0xd8,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x5d,0x00,0x00,0x00,0x21,0xb4,0x01,0x15,0x04,0x15,0x02,0xb8,0xff,0xfc,0xb5, +0x21,0x22,0x05,0x00,0x3e,0x01,0xb8,0xff,0x6a,0xb4,0x18,0x18,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x00,0x27,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x5f,0x00,0x00,0x00,0x21,0xb4,0x01,0x13,0x04, +0x13,0x02,0xb8,0xff,0xfe,0xb5,0x20,0x21,0x05,0x00,0x3e,0x01,0xb8,0xff,0x61,0xb4,0x16,0x16,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x97,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa5,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x72,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x84,0x00,0x00, +0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x77,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x06,0x96,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa4,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7a, +0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x83,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x11,0x04,0x11,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x97,0x05,0x9f,0x00,0x27,0x00,0x2b, +0x01,0xa5,0x00,0x00,0x00,0x27,0x04,0x37,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x75,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xf0,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x87,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe, +0xfe,0x40,0x06,0x96,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa4,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x86,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x83,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x11,0x04,0x11,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa1,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35, +0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x98,0x05,0xb3,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0x85,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x2a,0x2b,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa4,0xb4, +0x0c,0x0c,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x98,0x05,0xb3,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0x85,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x2a, +0x2b,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa4,0xb4,0x0c,0x0c,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x29,0x00,0xf7,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x22, +0x11,0x26,0x02,0x0b,0x37,0x38,0x06,0x1d,0x3e,0x01,0x1a,0x28,0x2e,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x61,0x00,0xca,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x23,0x11,0x26, +0x02,0x0b,0x36,0x37,0x06,0x1d,0x3e,0x01,0xb8,0xff,0xe1,0xb4,0x26,0x2c,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x36,0x00,0xcc,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x22,0x11, +0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xea,0xb4,0x28,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x43,0x00,0xb3,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e, +0x02,0x01,0x23,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xd0,0xb4,0x25,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x37,0x01,0x27,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00, +0x00,0x1f,0x40,0x14,0x02,0x01,0x22,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0x45,0x28,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x44,0x00,0xfa,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f, +0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x23,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0x18,0x25,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x38,0x00,0xd5,0x00,0x00,0x01,0x07,0x04,0x28, +0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x2e,0x11,0x26,0x03,0x0b,0x40,0x41,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xf2,0xb4,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x45,0x00,0xd5,0x00,0x00, +0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x31,0x11,0x26,0x03,0x0b,0x40,0x41,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xf2,0xb4,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x93,0x00,0x00,0x00,0x27, +0x04,0x27,0xfd,0xd8,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x9f,0x00,0x00,0x00,0x21,0xb4,0x01,0x25,0x04,0x25,0x02,0xb8,0xff,0xfd,0xb5,0x31,0x32,0x0e,0x00,0x3e,0x01,0xb8,0xff,0xb0,0xb4,0x28,0x28,0x12,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f, +0x00,0x93,0x00,0x00,0x00,0x27,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x9f,0x00,0x00,0x00,0x21,0xb4,0x01,0x23,0x04,0x23,0x02,0xb8,0xff,0xfd,0xb5,0x30,0x31,0x0e,0x00,0x3e,0x01,0xb8,0xff,0xa7,0xb4,0x26,0x26,0x12,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x45, +0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9c,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x72,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa8,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0xb8,0xff,0xd8,0xb4,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35, +0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x07,0x44,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9b,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa7,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x21,0x04,0x21,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0xb8,0xff,0xe7,0xb4,0x29,0x29,0x12,0x12, +0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x45,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9c,0x00,0x00,0x00,0x27,0x04,0x37,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa8,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e, +0x02,0x01,0xb8,0xff,0xe8,0xb4,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x07,0x44,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9b,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x86,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa7,0x00,0x00,0x00,0x23,0xb5,0x02,0x01,0x21,0x04,0x21, +0x03,0xb8,0xff,0xfd,0x40,0x0d,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0x02,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x46,0x05,0xb3,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0xa9,0x00,0x00, +0x00,0x23,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0x40,0x0d,0x3a,0x3b,0x0e,0x00,0x3e,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x46,0x05,0xb3,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x30, +0x01,0x07,0x04,0x28,0x02,0xa9,0x00,0x00,0x00,0x23,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0x40,0x0d,0x3a,0x3b,0x0e,0x00,0x3e,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0xbe,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07, +0x04,0x66,0x02,0x6a,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe3,0x40,0x09,0x2d,0x27,0x0a,0x13,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0x2f,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x68,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe1,0x40,0x09,0x28, +0x27,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x55,0xbd,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c,0x02,0x28,0x11,0x26,0x03,0x25,0x31,0x2b,0x0a,0x00,0x3e,0x02,0xb8,0xff,0x8e,0xb4,0x29,0x27, +0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x04,0x18,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x28,0x5b,0x00,0x00,0x0b,0xb6,0x02,0x24,0x2d,0x27,0x0a,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26, +0x04,0x60,0x35,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1b,0x40,0x12,0x02,0x29,0x11,0x26,0x03,0x25,0x31,0x2b,0x0a,0x00,0x3e,0x02,0x06,0x29,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0x94,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x2a,0x0a,0x00,0x00,0x16, +0xb9,0x00,0x02,0xff,0xdb,0x40,0x09,0x2d,0x27,0x0a,0x13,0x25,0x02,0x2d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x05,0x94,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x2a,0x0a,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c,0x02,0x2d,0x11,0x26,0x03,0x25,0x39,0x33,0x0a,0x00, +0x3e,0x02,0xb8,0xff,0xdb,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x0a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x66,0x02,0x94,0x01,0x4c,0x00,0x13,0x40,0x0b,0x02,0x00,0x16,0x10,0x05,0x00,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, +0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0x79,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x96,0x01,0x4a,0x00,0x13,0x40,0x0b,0x02,0x00,0x12,0x13,0x05,0x00,0x25,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfb,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07, +0x04,0x55,0xfe,0x2a,0xff,0x99,0x00,0x16,0xb4,0x02,0x12,0x03,0x12,0x02,0xb8,0xfd,0xee,0xb4,0x12,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0x5c,0xff,0x99,0x00,0x16,0xb4,0x02,0x13,0x03,0x13,0x02,0xb8,0xfe, +0x20,0xb4,0x12,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x28,0x00,0xa3,0x00,0x00,0x00,0x0b,0xb6,0x02,0x67,0x16,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x00,0x01,0x01,0xe4,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0e, +0x00,0x1f,0xb5,0x03,0x03,0x00,0x09,0xfa,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xc4,0x39,0x2f,0x31,0x30,0x01,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x0a,0x26,0x68,0x10,0x30,0x3e,0x3a,0x2c,0x35,0x46,0x73,0x04,0x7b,0x3f,0x38, +0x68,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x57,0xa8,0x00,0x01,0x01,0xba,0xfe,0x40,0x02,0xf6,0xff,0x89,0x00,0x0c,0x00,0x23,0x40,0x13,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26, +0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x02,0xf6,0x3c,0x56,0x4b,0x5f,0x7b,0x44,0x29,0x29,0xfe,0x90,0x50,0x53,0x46,0xb0,0xba,0x43,0x2a,0x00,0x00,0x01,0x01,0xe4,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0xfa,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03, +0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x01,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x0a,0x26,0x68,0x10,0x30,0x3e,0x3a,0x2c,0x35,0x46,0x73,0x04,0x7b,0x3f,0x38,0x68,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x57,0xa8,0x00,0x01,0x01,0x40,0x04,0xa6,0x03,0x70, +0x05,0x94,0x00,0x0b,0x00,0x1c,0x40,0x0d,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x33,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x03,0x70,0x6a,0x18,0x96,0x96,0x18,0x6a,0x0a,0x9a,0x74,0x74,0x9a,0x04,0xa6,0x8b,0x8b,0x6a, +0x84,0x85,0x00,0x03,0x01,0x33,0x04,0x7f,0x03,0x7d,0x06,0x5a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x35,0x40,0x1b,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x12,0x0c,0x1e,0xc1,0x18,0x0f,0xc0,0x15,0x15,0x00,0x21,0xc0,0x1b,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x10,0xd6,0xe1,0x10,0xc2,0x2f,0xe1,0x00,0x2f,0xfd,0x39, +0x39,0xde,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x1a,0x9e,0x6d,0x6c,0xa0,0x4c,0x28,0x38,0x39,0x27,0x2a, +0x3b,0x3b,0xfe,0x56,0x29,0x3a,0x3a,0x29,0x29,0x3b,0x3b,0x05,0x8e,0x6c,0x6c,0x5f,0x6d,0x6e,0xfe,0x93,0x38,0x2b,0x29,0x39,0x3a,0x28,0x2a,0x39,0x38,0x2b,0x28,0x3a,0x3a,0x28,0x2a,0x39,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x06,0x00,0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x55,0xbe,0x00,0x01,0x07,0x04,0x28,0xff,0x14, +0x00,0x00,0x00,0x20,0xb4,0x01,0x15,0x11,0x26,0x02,0xb8,0xff,0xff,0xb5,0x20,0x20,0x08,0x08,0x3e,0x01,0xb8,0xff,0xc6,0xb4,0x17,0x15,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x04,0x18,0x02,0x26,0x01,0xc7,0x01,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x0e,0xb9,0x00, +0x01,0xff,0x2e,0xb4,0x1b,0x15,0x0c,0x14,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x06,0x00,0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x60,0x40,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x1e,0xb4,0x01,0x16,0x11,0x26,0x02,0xb8,0xff,0xff,0x40,0x0c,0x20,0x20,0x08,0x08,0x3e,0x01,0x48,0x17,0x15, +0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x6c,0x03,0xf9,0x05,0x94,0x02,0x26,0x01,0xc7,0x01,0x00,0x01,0x06,0x04,0x2a,0xf5,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1b,0x15,0x0c,0x14,0x25,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x05,0x94, +0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x2a,0xf5,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x20,0xb4,0x01,0x15,0x11,0x26,0x02,0xb8,0xff,0xff,0xb5,0x28,0x28,0x08,0x08,0x3e,0x01,0xb8,0xff,0xfd,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x04,0x37,0x05,0x9a, +0x00,0x27,0x00,0x28,0x00,0x83,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xfd,0x78,0xb4,0x0e,0x0c,0x02,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc4,0x00,0x00,0x04,0x36,0x05,0x9a,0x00,0x27,0x00,0x28,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf3, +0xff,0x99,0x00,0x16,0xb4,0x01,0x0f,0x03,0x0f,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x02,0x02,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xff,0x7c,0xb4, +0x0c,0x0c,0x06,0x06,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc4,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf3,0xff,0x99,0x00,0x16,0xb4,0x01,0x0f,0x03,0x0f,0x01,0xb8,0xfc,0xf2,0xb4,0x0e,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff, +0x00,0xbc,0xfe,0x40,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x04,0x28,0x00,0xdd,0x00,0x00,0x00,0x0b,0xb6,0x01,0x5e,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x00,0x00,0x02,0x01,0x4a,0x04,0x92,0x03,0x66,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x30,0x40,0x0e,0x03,0x03,0x09,0x0e,0x00,0x0f,0x09,0xfa,0x0d,0x80, +0x0f,0x0f,0x0b,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03,0x0b,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x10,0xc2,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x27,0x36,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x05,0x23,0x03,0x33,0x01,0x68,0x1e,0x5d,0x17,0x31,0x41,0x36,0x2c,0x77,0x01, +0x41,0x5e,0xae,0xa6,0x04,0x92,0x3d,0x28,0x4f,0x36,0x2c,0x28,0x36,0x7a,0xa8,0x4e,0x01,0x6a,0x00,0x02,0x01,0x42,0x04,0x92,0x03,0x6e,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x37,0x40,0x13,0x10,0x18,0x09,0x0e,0x48,0x03,0x03,0x09,0x0f,0x00,0x10,0x09,0xfa,0x0d,0x80,0x0f,0x0f,0x0b,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03, +0x0b,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x10,0xc2,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x2b,0x01,0x27,0x36,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x01,0x03,0x23,0x13,0x01,0x60,0x1e,0x5d,0x17,0x32,0x40,0x36,0x2c,0x76,0x01,0x52,0xb0,0x5e,0x66,0x04,0x92,0x3d,0x28,0x4f,0x36,0x2c, +0x28,0x36,0x7a,0xa8,0x01,0x1c,0xfe,0x96,0x01,0x6a,0x00,0x02,0x01,0x33,0x04,0x77,0x03,0x7d,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x53,0x40,0x0d,0x0d,0x18,0x09,0x12,0x48,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x0f,0xb8,0x01,0x02,0x40,0x0d,0x0f,0x13,0x1f,0x13,0x02,0x13,0x40,0x13,0x18,0x48,0x13,0x0c,0x0d,0xb8,0xff,0xc0,0xb5,0x09, +0x12,0x48,0x0d,0x0f,0x16,0xb8,0x01,0x01,0x40,0x09,0x11,0x11,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x2f,0xd4,0x2b,0x5d,0xed,0xd6,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x2b,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x27,0x36,0x37,0x22,0x35,0x34, +0x33,0x32,0x16,0x15,0x14,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x19,0xa0,0x6c,0x6c,0xa0,0xfe,0xb4,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x05,0xb6,0x6d,0x6d,0x5f,0x6e,0x6e,0xfe,0x62,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0xff,0xff,0xff,0xec,0xff,0xf4,0x02,0x10,0x05,0xbe,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x66, +0x00,0xfe,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa7,0x40,0x09,0x12,0x0c,0x05,0x0b,0x25,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfa,0xff,0xf4,0x02,0x08,0x05,0x2f,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x64,0x00,0xf8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa1,0x40,0x09,0x0e,0x0f,0x05, +0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5e,0x06,0x0e,0x00,0x26,0x01,0xc9,0x01,0x00,0x01,0x07,0x04,0x53,0xfe,0xb0,0x00,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xb0,0x40,0x0b,0x1f,0x19,0x05,0x0b,0x25,0x03,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01, +0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5e,0x06,0x0e,0x00,0x26,0x01,0xc9,0x01,0x00,0x01,0x07,0x04,0x54,0xfe,0xb0,0x00,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xb0,0x40,0x0b,0x1f,0x19,0x05,0x0b,0x25,0x03,0x02,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xdf, +0xff,0xf4,0x02,0x0f,0x05,0x94,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x2a,0xfe,0x9f,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa0,0x40,0x09,0x12,0x0c,0x05,0x0b,0x25,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xd5,0xff,0xf4,0x02,0x1f,0x06,0x5a,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x2b, +0xfe,0xa2,0x00,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xa3,0x40,0x0b,0x12,0x21,0x05,0x0b,0x25,0x03,0x02,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x22,0x07,0x0a,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x66,0x01,0x10,0x01,0x4c,0x00,0x13,0x40,0x0b, +0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01,0x07,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x02,0x0e,0x06,0x79,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x64,0x01,0x10,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, +0xff,0xff,0xff,0xae,0x00,0x00,0x02,0x2c,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xc8,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdd,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0x5d,0xb7,0x06,0x04,0x02,0x03,0x25,0x01,0x07,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc6,0x00,0x00,0x02,0x4a,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xe6, +0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf5,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0x57,0xb7,0x06,0x04,0x02,0x03,0x25,0x01,0x07,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0x00,0x02,0x01,0x44,0x04,0x92,0x03,0x6c,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x35,0x40,0x1d,0x0b,0x0b,0x05,0x0e,0x01,0x0f,0x05,0xfa,0x0d,0x80,0x0f,0x40,0x09,0x0e, +0x48,0x0f,0x0f,0x08,0x00,0x40,0x09,0x12,0x48,0x00,0x00,0x0b,0x08,0xaf,0x03,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x10,0xc2,0x2f,0x2b,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x07,0x26,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x16,0x05,0x23,0x03,0x33,0x02,0x1e,0x20,0xba,0x76,0x2c,0x36,0x40,0x32,0x18, +0x01,0xaa,0x5c,0xb0,0xa8,0x04,0xcf,0x3d,0x50,0xaa,0x7a,0x35,0x29,0x2c,0x36,0x4f,0x61,0x01,0x6a,0x00,0x00,0x02,0x01,0x38,0x04,0x92,0x03,0x7b,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x35,0x40,0x1d,0x0b,0x0b,0x05,0x0f,0x01,0x10,0x05,0xfa,0x0d,0x80,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x0f,0x08,0x00,0x40,0x09,0x12,0x48,0x00,0x00,0x0b, +0x08,0xaf,0x03,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x10,0xc2,0x2f,0x5d,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x07,0x26,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x16,0x01,0x03,0x23,0x13,0x02,0x12,0x1e,0xbc,0x76,0x2c,0x36,0x40,0x32,0x17,0x01,0xc6,0xb0,0x5f,0x67,0x04,0xcf,0x3d,0x52,0xa8,0x7a,0x36, +0x28,0x2c,0x36,0x4f,0x01,0x09,0xfe,0x96,0x01,0x6a,0x00,0x02,0x01,0x33,0x04,0x77,0x03,0x7d,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x52,0x40,0x0d,0x0e,0x18,0x09,0x12,0x48,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x0c,0xb8,0x01,0x02,0x40,0x15,0x0f,0x14,0x1f,0x14,0x02,0x14,0x40,0x13,0x18,0x48,0x14,0x0f,0x0e,0x40,0x09,0x12,0x48,0x0e, +0x0e,0x0c,0x16,0xb8,0x01,0x01,0x40,0x09,0x11,0x11,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x2f,0xf1,0x39,0xc0,0x2f,0x2b,0x00,0x2f,0xd4,0x2b,0x5d,0xed,0xd6,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x2b,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x16,0x17,0x07,0x26,0x35,0x34,0x36, +0x33,0x32,0x15,0x14,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x19,0xa0,0x6c,0x6c,0xa0,0xfe,0xf8,0x06,0x54,0x14,0xb0,0x3e,0x30,0x5a,0x05,0xb6,0x6d,0x6d,0x5f,0x6e,0x6e,0xfe,0xe7,0x3a,0x16,0x35,0x25,0x91,0x30,0x41,0x52,0x50,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0xbe,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x04,0x66, +0x02,0x08,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xaa,0x40,0x09,0x23,0x1d,0x00,0x16,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x2f,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x0e,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb0,0x40,0x09,0x1e,0x1d,0x00, +0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0e,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x53,0xc3,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xbd,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35, +0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0e,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x54,0xd6,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xd0,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0xa1,0xfe,0x74,0x04,0x50, +0x06,0x23,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x06,0x04,0x29,0x14,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf4,0x40,0x09,0x1c,0x27,0x04,0x0a,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa1,0xfe,0x74,0x04,0x50,0x06,0x23,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x06,0x04,0x61,0xd4,0x00,0x00,0x16,0xb9,0x00, +0x02,0xff,0xb3,0x40,0x09,0x1f,0x1b,0x04,0x0a,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x94,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x2a,0xba,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb4,0x40,0x09,0x23,0x1d,0x00,0x16,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01, +0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x5a,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x2b,0xa9,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xa4,0x40,0x0b,0x38,0x32,0x00,0x16,0x25,0x03,0x02,0x01,0x35,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60, +0x07,0x0a,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x04,0x66,0x02,0x37,0x01,0x4c,0x00,0x13,0x40,0x0b,0x01,0x00,0x14,0x0e,0x05,0x00,0x25,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0x81,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x38,0x01,0x52,0x00,0x13, +0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x96,0x00,0x00,0x05,0x49,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe9,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xc5,0xff,0x99,0x00,0x16,0xb4,0x01,0x10,0x03,0x10,0x01,0xb8,0xfc,0xfb,0xb4,0x10,0x0e,0x05,0x00,0x25,0x01, +0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xb2,0x00,0x00,0x05,0x49,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe9,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xe1,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xfd,0x17,0xb4,0x10,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x04,0xb0, +0x05,0xa0,0x00,0x27,0x00,0x33,0x00,0x87,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x02,0x1a,0x04,0x1a,0x02,0xb8,0xfd,0x3b,0xb4,0x17,0x13,0x03,0x07,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0x03,0x01,0x02,0x04,0x96,0x03,0xae,0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x2c,0x40,0x15,0x0a,0x04, +0x16,0xc1,0x40,0x10,0x10,0x02,0x80,0x01,0x0d,0xc0,0x07,0x00,0x40,0x13,0xc0,0x19,0x00,0x80,0x02,0x2f,0x1a,0xcd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x03,0x33,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32, +0x16,0x15,0x14,0x06,0x02,0xc0,0x5e,0xb0,0xa8,0xf0,0x28,0x38,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x04,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00,0x03,0x01,0x02,0x04,0x96,0x03,0xae,0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b, +0x00,0x2c,0x40,0x15,0x0a,0x04,0x16,0xc1,0x40,0x10,0x10,0x03,0x80,0x02,0x13,0xc0,0x19,0x02,0x40,0x0d,0xc0,0x07,0x00,0x80,0x02,0x2f,0x1a,0xdd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22, +0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x00,0xb0,0x5e,0x66,0xf2,0x28,0x38,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x06,0x00,0xfe,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00,0x01,0x01,0xd1,0x04,0x96,0x02,0xdf, +0x06,0x00,0x00,0x03,0x00,0x11,0xb6,0x01,0x40,0x02,0x01,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x3f,0x1a,0xcd,0x31,0x30,0x01,0x23,0x03,0x33,0x02,0xdf,0x5e,0xb0,0xa8,0x04,0x96,0x01,0x6a,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x55,0x00,0xb0,0x00,0x00,0x01,0x07,0x04,0x28, +0x01,0x4f,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x23,0x11,0x26,0x02,0x0b,0x2c,0x2d,0x06,0x1d,0x3e,0x01,0xb8,0xff,0xcd,0xb4,0x24,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x04,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x0b,0xb6,0x01, +0x0b,0x28,0x29,0x06,0x1d,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x60,0x01,0x1f,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x24,0x11,0x26,0x02,0x0b,0x2c,0x2d,0x06,0x1d,0x3e,0x01,0x3c,0x24,0x22,0x06,0x1d,0x3e, +0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xe9,0x06,0x00,0x05,0x94,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0xeb,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x08,0x28,0x22,0x06,0x1d,0x25,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x05,0x94, +0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x2a,0x00,0xeb,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x28,0x11,0x26,0x02,0x0b,0x34,0x35,0x06,0x1d,0x3e,0x01,0x08,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0xff,0xac,0xff,0xe8,0x06,0x11,0x05,0xb2,0x00,0x26, +0x00,0x32,0x67,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x02,0x1a,0x03,0x1a,0x02,0xb8,0xfc,0xc8,0xb4,0x1a,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xd1,0xff,0xe8,0x06,0x11,0x05,0xb2,0x00,0x26,0x00,0x32,0x67,0x00,0x01,0x07,0x04,0x60,0xfe,0x00,0xff,0x99,0x00,0x16,0xb4,0x02, +0x1b,0x03,0x1b,0x02,0xb8,0xfc,0xed,0xb4,0x1a,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x06,0x53,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0xaa,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x1e,0x03,0x1e,0x01,0xb8,0xff,0xac,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01, +0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xd1,0x00,0x00,0x06,0x3d,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x94,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0x00,0xff,0x99,0x00,0x16,0xb4,0x01,0x1f,0x03,0x1f,0x01,0xb8,0xff,0xe7,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x64,0xfe,0x40,0x05,0xa9, +0x05,0xb2,0x02,0x26,0x00,0x9f,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x0e,0x00,0x00,0x00,0x0b,0xb6,0x01,0x5e,0x22,0x1c,0x12,0x18,0x25,0x01,0x2b,0x35,0x00,0x00,0x01,0x01,0xd1,0x04,0x96,0x02,0xdf,0x06,0x00,0x00,0x03,0x00,0x11,0xb6,0x02,0x40,0x03,0x01,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x3f,0x1a,0xcd,0x31,0x30,0x01,0x03,0x23, +0x13,0x02,0xdf,0xb0,0x5e,0x67,0x06,0x00,0xfe,0x96,0x01,0x6a,0x00,0x01,0x01,0xe2,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0d,0x00,0x25,0x40,0x15,0x00,0x18,0x09,0x0d,0x48,0x0c,0x0c,0x01,0x07,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x0c,0x0a,0xaf,0x04,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xc4,0x39,0x2f,0x31,0x30,0x2b,0x01, +0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x02,0xcf,0x29,0x53,0x71,0x45,0x35,0x2c,0x3a,0x6c,0x10,0x04,0xba,0x3f,0x28,0xa7,0x58,0x39,0x48,0x3a,0x2b,0x5d,0x07,0x68,0x00,0x00,0x01,0xfe,0xe8,0x04,0xc2,0x01,0x1a,0x06,0x0e,0x00,0x06,0x00,0x15,0xb7,0x00,0xc0,0x04,0x02,0x00,0x05,0x80,0x04,0x00,0x2f,0x1a, +0xcd,0x39,0x39,0x01,0x2f,0x1a,0xcc,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x01,0x1a,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x04,0xc2,0xe6,0xe6,0x01,0x4c,0x00,0x01,0xfe,0xc0,0x04,0xb2,0x01,0x42,0x05,0xb2,0x00,0x13,0x00,0x1e,0x40,0x0e,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x13,0x07,0xda,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6,0xfd, +0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54,0x4a,0x36,0x53,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6a,0x82,0x34,0x2c,0x74,0x00,0x00,0x01,0xff,0x02, +0x04,0xc2,0x00,0xfe,0x05,0x2f,0x00,0x03,0x00,0x0e,0xb4,0x00,0x01,0x02,0xe2,0x01,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x35,0x21,0xfe,0xfe,0x04,0x01,0xfc,0x04,0xc2,0x6d,0x00,0x01,0xfe,0x58,0x05,0x74,0x01,0xaa,0x05,0xec,0x00,0x03,0x00,0x0d,0xb4,0x02,0xda,0x01,0x00,0x01,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01, +0x21,0x35,0x21,0x01,0xaa,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0x01,0xfe,0xee,0x04,0xc2,0x01,0x12,0x05,0xbe,0x00,0x0c,0x00,0x1d,0x40,0x0d,0x0c,0xc4,0x00,0xc0,0x07,0xc4,0x06,0x0c,0x06,0x80,0x09,0xdb,0x03,0x00,0x2f,0xed,0x1a,0xdc,0xc4,0x01,0x2f,0xe1,0x1a,0xdc,0xe1,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16, +0x33,0x32,0x36,0x37,0x01,0x12,0x0a,0x9c,0x70,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x05,0xbe,0x70,0x8c,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0xff,0x9e,0x04,0xc2,0x00,0x62,0x05,0x85,0x00,0x0b,0x00,0x0f,0xb5,0x09,0xc0,0x03,0x06,0xc1,0x00,0x00,0x2f,0xed,0x01,0x2f,0xe1,0x31,0x30,0x11,0x22,0x26,0x35,0x34,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x04,0xc2,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x05,0x87,0x00,0x0b,0x00,0x17,0x00,0x1a,0x40,0x0c,0x06,0x00,0x12,0xc1,0x0c,0x09,0xc0,0x03,0x0f,0xc0,0x03,0x15,0x2f,0xc6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30, +0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x28,0x3a,0x38,0x28,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x04,0xc2,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x00,0x02,0xff,0x33, +0x04,0x98,0x00,0xcf,0x06,0x1c,0x00,0x0b,0x00,0x16,0x00,0x2a,0x40,0x18,0x14,0xc4,0x30,0x09,0x80,0x09,0xd0,0x09,0xe0,0x09,0x04,0x09,0xc0,0x0f,0xc4,0x03,0x0c,0xc5,0x40,0x06,0xc0,0x11,0xc5,0x00,0x00,0x2f,0xed,0x1a,0xdc,0x1a,0xed,0x01,0x2f,0xe1,0x1a,0xdc,0x71,0xe1,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x59,0x72,0x76,0x5b,0x59,0x72,0x7a,0x57,0x31,0x3f,0x70,0x31,0x41,0x41,0x04,0x98,0x6b,0x53,0x58,0x6e,0x6c,0x54,0x54,0x70,0x01,0x33,0x41,0x30,0x70,0x40,0x30,0x31,0x40,0x00,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x2b, +0x40,0x14,0x00,0x0e,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x06,0x03,0x02,0x07,0x80,0x06,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0xe9,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x01,0x25,0xf6,0x60,0xd1,0x73,0xef,0x61,0xcf,0x06,0x00,0xfe,0xc2, +0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x01,0xfe,0xe8,0x04,0xc2,0x01,0x18,0x06,0x0c,0x00,0x06,0x00,0x11,0xb5,0x00,0xc0,0x03,0x03,0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x1a,0xcc,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x01,0x18,0xd4,0x86,0xd6,0x72,0xa4,0xa4,0x06,0x0c,0xfe,0xb6,0x01,0x4a,0xe5,0xe5,0x00,0x01,0xff,0xcb, +0x04,0x96,0x00,0x35,0x06,0x00,0x00,0x03,0x00,0x0e,0xb5,0x01,0x02,0x01,0x00,0xfc,0x01,0x2f,0xe1,0x00,0x3f,0xcd,0x31,0x30,0x13,0x23,0x11,0x33,0x35,0x6a,0x6a,0x04,0x96,0x01,0x6a,0x00,0x00,0x02,0xff,0x58,0x04,0x96,0x00,0xa8,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0c,0x02,0x01,0x05,0x06,0x01,0x00,0xfc,0x01,0x01,0x04, +0xfc,0x05,0x2f,0xf1,0xca,0x2f,0xe1,0x00,0x3f,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x23,0x11,0x33,0xa8,0x6a,0x6a,0xe6,0x6a,0x6a,0x04,0x96,0x01,0x6a,0xfe,0x96,0x01,0x6a,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x17,0x00,0x0e,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80, +0x06,0x04,0x42,0x60,0x04,0x01,0x04,0x06,0x07,0x04,0x03,0x80,0x00,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0xcd,0x5d,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0xe1,0x31,0x30,0x01,0x23,0x03,0x33,0x03,0x23,0x03,0x33,0x01,0x25,0x61,0xef,0x81,0x23,0x60,0xf6,0x85,0x04,0xc2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x02,0xfe,0xee, +0x04,0xc2,0x01,0x12,0x06,0x68,0x00,0x0b,0x00,0x18,0x00,0x26,0x40,0x13,0x06,0xc1,0x00,0x0c,0x12,0x15,0xdb,0x0f,0x0c,0xfc,0x18,0x18,0x09,0x12,0xfc,0x13,0x09,0xc0,0x03,0x2f,0xe1,0xde,0xe1,0x10,0xca,0x2f,0xe1,0x00,0x2f,0xfd,0xd4,0x32,0xd4,0xed,0x31,0x30,0x11,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x06, +0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0xe9,0x0a,0x9c,0x70,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x05,0xa6,0x39,0x29,0x2a,0x36,0x37,0x29,0x28,0x3a,0x18,0x70,0x8c,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0xfe,0xee,0x04,0xc2,0x01,0x12,0x05,0xbe,0x00,0x0c,0x00,0x18, +0x40,0x0b,0x0a,0xdb,0x04,0x00,0x07,0x00,0xfc,0x01,0x06,0xfc,0x07,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x33,0xd4,0xed,0x31,0x30,0x01,0x23,0x26,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x12,0x66,0x09,0x61,0x44,0xa0,0x0c,0x64,0x04,0x95,0x75,0x71,0x9b,0x04,0xc2,0x48,0x54,0x9c,0x72,0x8a,0x8a,0x00,0x00,0x01,0xff,0x8c, +0x04,0x7b,0x00,0x77,0x06,0x23,0x00,0x0d,0x00,0x27,0xb9,0x00,0x00,0xff,0xe8,0x40,0x13,0x09,0x0d,0x48,0x07,0xfb,0x02,0x0d,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x02,0x04,0xaf,0x0a,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xd4,0xed,0x31,0x30,0x2b,0x13,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x77, +0x69,0x10,0x6e,0x3a,0x2c,0x35,0x45,0x71,0x53,0x05,0xe4,0x38,0x68,0x08,0x5d,0x2a,0x3a,0x47,0x3a,0x58,0xa7,0x28,0x00,0x01,0xff,0x8c,0x03,0xf8,0x00,0x77,0x05,0xa0,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x03,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39, +0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x4e,0x26,0x68,0x10,0x30,0x3c,0x38,0x2c,0x35,0x46,0x72,0x03,0xf8,0x40,0x36,0x69,0x01,0x39,0x2b,0x2a,0x3a,0x48,0x3a,0x57,0xa7,0x00,0x00,0x01,0xff,0x8c,0x03,0xf8,0x00,0x77,0x05,0xa0,0x00,0x0e,0x00,0x24, +0x40,0x15,0x00,0x18,0x09,0x0d,0x48,0x01,0x0d,0xfb,0x07,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x0d,0x0a,0xaf,0x04,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x13,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x77,0x27,0x54,0x70,0x45,0x35,0x2c,0x38,0x3c,0x30,0x10,0x04,0x38, +0x40,0x29,0xa6,0x57,0x3b,0x47,0x3a,0x2a,0x2b,0x39,0x01,0x69,0x00,0x01,0x00,0x2f,0x03,0xf8,0x01,0x1a,0x05,0xa0,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x03,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x13, +0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x56,0x27,0x69,0x10,0x30,0x3c,0x38,0x2c,0x35,0x45,0x70,0x03,0xf8,0x40,0x36,0x69,0x01,0x39,0x2b,0x2a,0x3a,0x47,0x3b,0x57,0xa6,0x00,0x00,0x01,0xff,0x3e,0xfe,0x42,0x00,0xc2,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x00,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03, +0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x13,0x23,0x01,0x33,0xc2,0x7e,0xfe,0xfa,0xa8,0xfe,0x42,0x01,0x47,0x00,0x01,0xff,0x3e,0xfe,0x42,0x00,0xc2,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x17, +0x01,0x23,0x13,0xc2,0xfe,0xfa,0x7e,0xde,0x77,0xfe,0xb9,0x01,0x47,0x00,0x00,0x01,0xff,0x48,0xfe,0x58,0x00,0xb8,0xff,0xc2,0x00,0x07,0x00,0x2a,0x40,0x17,0x01,0x0e,0x02,0xfd,0x05,0x40,0x05,0x06,0x42,0x05,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x05,0x02,0x04,0x2f,0xdd,0x32,0xe1,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a, +0x18,0x10,0xfd,0xed,0x31,0x30,0x13,0x23,0x35,0x21,0x35,0x21,0x35,0x33,0xb8,0x6a,0xfe,0xfa,0x01,0x06,0x6a,0xfe,0x58,0x7f,0x6d,0x7e,0x00,0x01,0xff,0x48,0xfe,0x58,0x00,0xb8,0xff,0xc2,0x00,0x07,0x00,0x2c,0x40,0x18,0x02,0x0e,0x01,0xfd,0x06,0x40,0x06,0x05,0x42,0x06,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x03,0xfc,0x01,0x01, +0x06,0x07,0x2f,0xcd,0x32,0x10,0xe1,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a,0x18,0x10,0xfd,0xed,0x31,0x30,0x13,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0xb8,0xfe,0xfa,0x6a,0x6a,0x01,0x06,0xfe,0xd7,0x7f,0x01,0x6a,0x7e,0x00,0x00,0x01,0xff,0x16,0x04,0x96,0x00,0xea,0x06,0x68,0x00,0x05,0x00,0x14,0x40,0x09,0x00,0x03,0xfd,0x04,0x01,0x00, +0xfc,0x02,0x03,0x2f,0xdd,0xe1,0x00,0x3f,0xed,0xc4,0x31,0x30,0x13,0x23,0x11,0x21,0x35,0x21,0xea,0x6a,0xfe,0x96,0x01,0xd4,0x04,0x96,0x01,0x6a,0x68,0x00,0x00,0x01,0xff,0x52,0x04,0x96,0x00,0xae,0x06,0x0e,0x00,0x0b,0x00,0x12,0xb7,0x05,0x01,0xda,0x00,0x08,0xc2,0x03,0x00,0x2f,0xd4,0xe1,0x00,0x2f,0xed,0xc4,0x31,0x30,0x03,0x37, +0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0xae,0x02,0xd5,0x15,0x88,0x12,0x8e,0x78,0x04,0x96,0x74,0x82,0x48,0x3a,0x37,0x50,0x6c,0x85,0x00,0x01,0xff,0xa6,0xfe,0x5c,0x00,0x5a,0xff,0xc8,0x00,0x0b,0x00,0x28,0x40,0x16,0x0b,0xcb,0x40,0x00,0xc0,0x07,0xcb,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x06,0x80,0x09, +0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x5d,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x15,0x14,0x33,0x5a,0x4d,0x67,0x66,0x4e,0x5e,0x5e,0xfe,0x5c,0x69,0x4d,0x4d,0x69,0x5e,0x58,0x5a,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x07,0x00,0x22,0x40,0x10,0x05,0x00, +0xfd,0x02,0x40,0x03,0x06,0x0e,0x05,0xfc,0x02,0x02,0x01,0x42,0x02,0x01,0x2f,0xcd,0x2b,0x01,0x10,0xf1,0xe1,0x00,0x18,0x2f,0x1a,0xdd,0xed,0x33,0x31,0x30,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xb4,0x7f,0x6d,0x7e,0xfe,0x56,0x6a,0x01,0x06,0xfe,0xfa,0x6a,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x07,0x00,0x22, +0x40,0x10,0x04,0x02,0x06,0xfd,0x40,0x07,0x01,0x0e,0x02,0xfc,0x05,0x05,0x06,0x42,0x05,0x06,0x2f,0xcd,0x2b,0x01,0x10,0xf1,0xe1,0x00,0x18,0x2f,0x1a,0xfd,0x32,0xc6,0x31,0x30,0x17,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0xb6,0x7e,0x6d,0x7f,0x3a,0x6a,0xfe,0xfa,0x01,0x06,0x6a,0x00,0x00,0x01,0xff,0x4c,0xfe,0x5e,0x00,0xb6,0xff,0xc6, +0x00,0x0b,0x00,0x38,0x40,0x1f,0x03,0x0e,0x0a,0x01,0x04,0xfd,0x07,0x0e,0x40,0x0f,0x08,0x1f,0x08,0x2f,0x08,0x03,0x09,0x03,0x08,0x00,0x0e,0x01,0x04,0x05,0x42,0x05,0x0a,0x07,0x01,0xfc,0x04,0x2f,0xe1,0x39,0x39,0xcd,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xfd,0xfd,0x39,0x39,0xed,0x31,0x30,0x13,0x23,0x15,0x23, +0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0xb6,0x7e,0x6d,0x7f,0x7f,0x6d,0x7e,0xfe,0xdd,0x7f,0x7f,0x6b,0x7e,0x7e,0xff,0xff,0xff,0x03,0xff,0x53,0x00,0xff,0xff,0xbf,0x00,0x07,0x06,0x9a,0xfe,0xc5,0xfd,0x5f,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x12,0xb7,0x08,0x91,0x03,0x0a,0x00,0x7e,0x0a,0x06,0x2f, +0xd6,0xe1,0x00,0x2f,0xd4,0xed,0x31,0x30,0x37,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0xe6,0xb3,0x9f,0x42,0x38,0x33,0x3f,0xb2,0x35,0xbd,0xe2,0x14,0xa0,0x1d,0x01,0x08,0x00,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x15,0x40,0x09,0x03,0x91,0x08,0x00,0x05,0x05,0x01,0x7e,0x00,0x2f,0xf1,0xc2, +0x2f,0x00,0x2f,0xd4,0xed,0x31,0x30,0x27,0x33,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0xe6,0xa8,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0x35,0xfe,0xf8,0x1d,0xa0,0x14,0xe2,0x00,0x02,0xfe,0xdd,0xfe,0xc4,0x01,0x25,0xff,0x89,0x00,0x0b,0x00,0x17,0x00,0x1a,0x40,0x0c,0x06,0x00,0x0c,0xc1,0x12,0x09,0xc0,0x03,0x0f,0xc0,0x03,0x15, +0x2f,0xc6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x28,0x3a,0x38,0x28,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0xfe,0xc4,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39, +0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0xff,0xff,0xff,0x35,0xfe,0x7e,0x00,0xd1,0x00,0x02,0x00,0x07,0x00,0xdc,0xfe,0xe3,0xf9,0xe6,0x00,0x01,0xff,0x9c,0xfe,0x62,0x00,0x64,0xff,0x89,0x00,0x0b,0x00,0x3b,0xb5,0x01,0x18,0x09,0x12,0x48,0x00,0xb8,0xff,0xc0,0xb4,0x13,0x16,0x48,0x00,0x03,0xb8,0x01,0x02,0x40,0x09,0x0f,0x07,0x1f, +0x07,0x2f,0x07,0x03,0x07,0x01,0xb8,0xff,0xc0,0xb5,0x09,0x12,0x48,0x01,0x03,0x0a,0xb9,0x01,0x01,0x00,0x05,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x2f,0x5d,0xfd,0xc4,0x2b,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x4a,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0xfe,0x62,0x36,0x16,0x3a,0x50,0x51,0x41,0x30, +0x91,0x00,0xff,0xff,0xff,0x56,0xfe,0x50,0x00,0xaa,0x00,0x00,0x00,0x07,0x00,0xdd,0xff,0x23,0x00,0x00,0xff,0xff,0xff,0x5d,0xfe,0x70,0x00,0x71,0x00,0x00,0x00,0x07,0x00,0xdf,0xff,0x1f,0x00,0x00,0x00,0x01,0xff,0xcb,0xfe,0x1e,0x00,0x35,0xff,0x89,0x00,0x03,0x00,0x16,0x40,0x0c,0x01,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x00, +0xfc,0x01,0x2f,0xe1,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x13,0x23,0x11,0x33,0x35,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0x00,0x00,0x01,0xfe,0x9c,0xfe,0x5c,0x01,0x64,0xff,0x89,0x00,0x07,0x00,0x22,0x40,0x13,0x00,0x05,0x80,0x03,0xfd,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x01,0x04,0xfc,0x05,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x5d, +0xed,0x1a,0xcd,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x23,0x11,0x21,0x01,0x64,0x68,0xfe,0x08,0x68,0x02,0xc8,0xfe,0x5c,0xc5,0xc5,0x01,0x2d,0x00,0x01,0xfe,0xb1,0xfe,0xbc,0x01,0x4f,0xff,0x89,0x00,0x14,0x00,0x44,0x40,0x26,0x00,0x05,0x10,0x03,0x0a,0x12,0x03,0x0d,0xc5,0x40,0x07,0x80,0x0f,0x0a,0x1f,0x0a,0x2f,0x0a,0x03,0x09, +0x03,0x0a,0x14,0xff,0x00,0x0e,0x10,0x0b,0xff,0x0a,0x0a,0x0f,0x42,0x0a,0x80,0x10,0xfe,0x0f,0x2f,0xe1,0x1a,0xcc,0x2b,0x01,0x10,0xe1,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xdc,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x33,0x14,0x33,0x32,0x35,0x33,0x14, +0x33,0x32,0x35,0x01,0x4f,0x6a,0x57,0x5a,0x34,0x35,0x5b,0x57,0x68,0x61,0x5f,0x69,0x4c,0x6a,0x5e,0x77,0x59,0x74,0x44,0x44,0x72,0x5b,0x75,0x75,0x75,0x75,0x00,0x01,0xfe,0xe8,0xfe,0x40,0x01,0x18,0xff,0x89,0x00,0x06,0x00,0x1a,0x40,0x0d,0x00,0xc0,0x03,0x02,0x80,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x2f,0x5d,0x1a,0xcd, +0x01,0x2f,0x1a,0xcc,0x31,0x30,0x05,0x03,0x23,0x03,0x33,0x17,0x37,0x01,0x18,0xd4,0x86,0xd6,0x72,0xa4,0xa4,0x77,0xfe,0xb7,0x01,0x49,0xe5,0xe5,0x00,0x01,0xfe,0xe8,0xfe,0x3e,0x01,0x1a,0xff,0x89,0x00,0x06,0x00,0x1a,0x40,0x0d,0x00,0xc0,0x04,0x04,0x80,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f, +0x1a,0xcc,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x01,0x1a,0x78,0xa4,0xa6,0x70,0xd6,0x86,0xfe,0x3e,0xe5,0xe5,0x01,0x4b,0x00,0x00,0x01,0xfe,0xee,0xfe,0x8e,0x01,0x12,0xff,0x89,0x00,0x0c,0x00,0x29,0x40,0x16,0x0c,0xc4,0x00,0xc0,0x07,0xc4,0x06,0x0c,0x06,0x09,0xdb,0x40,0x03,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06, +0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x10,0xc4,0x01,0x2f,0xe1,0x1a,0xdc,0xe1,0x31,0x30,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x01,0x12,0x0a,0x9b,0x71,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x77,0x72,0x89,0x89,0x72,0x9b,0x54,0x47,0xff,0xff,0xfe,0xe9,0xff,0x13,0x01,0x19,0x00,0x01,0x00,0x07, +0x04,0x2a,0xfd,0xa9,0xfa,0x6d,0x00,0x01,0xfe,0xc0,0xfe,0x9e,0x01,0x42,0xff,0x9e,0x00,0x13,0x00,0x22,0x40,0x11,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x09,0x11,0xda,0x03,0x07,0xda,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xd4,0xfd,0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15, +0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54,0x4a,0x36,0x53,0x62,0x69,0x85,0x34,0x2a,0x70,0x69,0x82,0x33,0x2d,0x75,0xff,0xff,0xff,0x05,0xff,0x51,0x01,0x01,0xff,0xbe,0x00,0x07,0x00,0xd9,0xfe,0xc7,0xfa,0x8f,0x00,0x01,0xfe,0x57,0xfe,0xd7,0x01,0xa9, +0xff,0x4e,0x00,0x03,0x00,0x0d,0xb4,0x01,0xda,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x01,0xa9,0xfc,0xae,0x03,0x52,0xfe,0xd7,0x77,0xff,0xff,0xfe,0x57,0xfd,0xfe,0x01,0xa9,0xff,0x62,0x00,0x07,0x01,0x35,0xfe,0x57,0x00,0x00,0x00,0x01,0xfe,0xc0,0x01,0x9e,0x01,0x42,0x02,0x9e,0x00,0x13,0x00,0x1e, +0x40,0x0e,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x13,0x07,0xda,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6,0xfd,0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54, +0x4a,0x36,0x53,0x02,0x9e,0x69,0x85,0x34,0x2a,0x70,0x69,0x82,0x33,0x2d,0x75,0x00,0x00,0x01,0xff,0x02,0x01,0xe6,0x00,0xfe,0x02,0x52,0x00,0x03,0x00,0x0e,0xb4,0x00,0x01,0x02,0xe2,0x01,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x35,0x21,0xfe,0xfe,0x04,0x01,0xfc,0x01,0xe6,0x6c,0xff,0xff,0xfe,0x58,0xff,0xc5,0x01,0xaa, +0x00,0x3d,0x00,0x07,0x01,0x95,0xfe,0x58,0xfa,0x51,0x00,0x01,0xfe,0x66,0x00,0x77,0x01,0x9c,0x03,0xc2,0x00,0x03,0x00,0x2a,0xb6,0x03,0x02,0x01,0x00,0x03,0x00,0x01,0xb8,0x01,0x00,0x40,0x0a,0x02,0x03,0x14,0x02,0x03,0x01,0x02,0x00,0x00,0x02,0x2f,0xcd,0x00,0x2f,0x2f,0xc1,0x87,0x05,0x2b,0x10,0x00,0xc1,0x87,0x05,0x7d,0x10,0xc4, +0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x9c,0xfd,0x50,0x86,0x02,0xae,0x03,0xc2,0xfc,0xb5,0x03,0x4b,0x00,0x00,0x01,0xfe,0x70,0xff,0x12,0x01,0x92,0x05,0x9a,0x00,0x03,0x00,0x2b,0xb6,0x03,0x02,0x01,0x00,0x03,0x00,0x01,0xb8,0x01,0x00,0x40,0x0b,0x02,0x03,0x14,0x02,0x03,0x01,0x02,0x00,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0x2f,0xc1, +0x87,0x05,0x2b,0x10,0x00,0xc1,0x87,0x05,0x7d,0x10,0xc4,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x92,0xfd,0x50,0x72,0x02,0xae,0x05,0x9a,0xf9,0x78,0x06,0x88,0x00,0x01,0xff,0xa6,0xfe,0x5c,0x00,0x5a,0xff,0xc8,0x00,0x0b,0x00,0x2a,0x40,0x17,0x01,0xcb,0x40,0x00,0xc0,0x05,0xcb,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x06, +0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x5d,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0x5a,0x5e,0x5e,0x4f,0x65,0x67,0xfe,0x5c,0x5c,0x5a,0x58,0x5e,0x67,0x4f,0x4d,0x69,0x00,0x01,0xfe,0x9c,0xfe,0x5c,0x01,0x64,0xff,0x89,0x00,0x07,0x00,0x24, +0x40,0x14,0x04,0xfd,0x40,0x01,0x80,0x06,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x07,0xfc,0x06,0x03,0xfc,0x02,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x5d,0x33,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x21,0x35,0x33,0x01,0x64,0xfd,0x38,0x68,0x01,0xf8,0x68,0xfe,0x5c,0x01,0x2d,0xc5,0xc5,0x00,0x02,0xff,0x44,0xfe,0x10, +0x00,0xbc,0xff,0x89,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x14,0x01,0xc4,0x2f,0x07,0x01,0x07,0x06,0xc4,0x02,0x40,0x09,0x0d,0x48,0x02,0x03,0xc4,0x05,0x06,0xc4,0x02,0x2f,0xe1,0xdd,0xe1,0x00,0x2f,0x2b,0xed,0xdd,0x5d,0xed,0x31,0x30,0x13,0x21,0x11,0x21,0x03,0x35,0x23,0x15,0xbc,0xfe,0x88,0x01,0x78,0x5a,0xc4,0xfe,0x10,0x01,0x79, +0xfe,0xe1,0xc5,0xc5,0x00,0x01,0xfe,0xa5,0xfe,0xa8,0x01,0x5b,0xff,0x89,0x00,0x16,0x00,0x45,0x40,0x25,0x00,0x0d,0x0d,0x12,0x07,0x80,0x14,0x03,0x0a,0xc5,0x40,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x09,0x03,0x10,0x01,0xff,0x00,0x0e,0x06,0x0c,0xff,0x0d,0x0d,0x07,0x42,0x0d,0x80,0x06,0xfe,0x07,0x2f,0xe1,0x1a,0xce,0x2b,0x01,0x10, +0xe1,0x10,0xf2,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xed,0x39,0x39,0x1a,0xcc,0x39,0x39,0x7c,0x2f,0x33,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x01,0x5b,0x62,0x11,0x4f,0x32,0x40,0x4e,0x41,0x32,0x4e,0x11,0x62,0x0b,0x6e,0x48,0x70,0x2a, +0x28,0x72,0x46,0x70,0xfe,0xee,0x43,0x55,0x34,0x35,0x54,0x43,0x43,0x58,0x64,0x64,0x5a,0x00,0x00,0x01,0xff,0x30,0x04,0xc2,0x00,0xd2,0x06,0x65,0x00,0x0b,0x00,0x09,0xb1,0x07,0x04,0x19,0x2f,0x00,0x2f,0x31,0x30,0x13,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0xd2,0x85,0x85,0x4c,0x86,0x85,0x4b,0x85,0x85,0x4c,0x86, +0x85,0x06,0x1a,0x86,0x84,0x4e,0x86,0x86,0x4c,0x85,0x85,0x4d,0x85,0x85,0x00,0x01,0xff,0x9e,0x05,0x08,0x00,0x62,0x07,0x1c,0x00,0x11,0x00,0x27,0x40,0x13,0x0a,0xc5,0x40,0x09,0xc0,0x01,0xc5,0x40,0x00,0x09,0x03,0xc4,0x10,0x00,0x80,0x0c,0xc4,0x07,0x00,0x2f,0xd4,0xe1,0x1a,0x10,0xdd,0xe1,0xc4,0x00,0x2f,0x1a,0xed,0x1a,0xdc,0x1a, +0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x27,0x26,0x35,0x34,0x33,0x15,0x22,0x15,0x14,0x17,0x16,0x15,0x14,0x62,0x6e,0x35,0x35,0xc0,0x6a,0x35,0x35,0x05,0x08,0x5e,0x42,0x1c,0x42,0x41,0x36,0x9f,0x5e,0x41,0x1b,0x40,0x40,0x3a,0xa0,0x00,0x00,0x02,0xfe,0x57,0x05,0x74,0x01,0xa9,0x07,0x04,0x00,0x03,0x00,0x07,0x00,0x19,0x40,0x0b, +0x02,0xda,0x01,0x06,0xda,0x05,0x07,0x06,0x01,0x00,0x01,0x2f,0x2f,0x12,0x39,0x39,0x00,0x2f,0xfd,0xd6,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x01,0xa9,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x06,0x8e,0x76,0xfe,0x70,0x78,0x00,0x00,0x01,0xfe,0x70,0x04,0xc2,0xff,0xf6,0x06,0x0a,0x00,0x03,0x00,0x0e,0xb4,0x03, +0x80,0x01,0x02,0x00,0x2f,0xcd,0x00,0x2f,0x1a,0xcd,0x31,0x30,0x03,0x23,0x01,0x33,0x0a,0x7f,0xfe,0xf9,0xa8,0x04,0xc2,0x01,0x48,0x00,0x00,0x01,0x00,0x0a,0x04,0xc2,0x01,0x90,0x06,0x0a,0x00,0x03,0x00,0x0e,0xb4,0x03,0x02,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x01,0x23,0x13,0x01,0x90,0xfe,0xf9,0x7f,0xe0, +0x06,0x0a,0xfe,0xb8,0x01,0x48,0xff,0xff,0xfe,0xc0,0x04,0xb2,0x01,0x41,0x05,0xb2,0x00,0x07,0x00,0xd8,0xfe,0x9d,0x00,0x00,0x00,0x01,0xff,0x9c,0x04,0xc2,0x00,0x64,0x05,0xea,0x00,0x0b,0x00,0x33,0xb5,0x01,0x18,0x09,0x12,0x48,0x00,0xb8,0xff,0xc0,0xb4,0x13,0x16,0x48,0x00,0x03,0xb8,0x01,0x02,0xb2,0x07,0x00,0x01,0xb8,0xff,0xc0, +0xb5,0x09,0x12,0x48,0x01,0x03,0x0a,0xb9,0x01,0x01,0x00,0x05,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x3f,0xfd,0xc4,0x2b,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x4a,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x04,0xc2,0x36,0x16,0x3a,0x50,0x52,0x42,0x2f,0x91,0x00,0x00,0x03,0xfe,0xaa,0x04,0x96,0x01,0x56, +0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x2c,0x40,0x15,0x0a,0x04,0x16,0xc1,0x40,0x10,0x10,0x03,0x80,0x02,0x13,0xc0,0x19,0x02,0x40,0x0d,0xc0,0x07,0x00,0x80,0x02,0x2f,0x1a,0xdd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x13,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36, +0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xa8,0xb0,0x5e,0x66,0xf2,0x29,0x37,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x06,0x00,0xfe,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00, +0x00,0x01,0xff,0x64,0xfe,0x40,0x00,0x9c,0xff,0x89,0x00,0x0c,0x00,0x23,0x40,0x13,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x13,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x9c,0x3b, +0x55,0x4b,0x5d,0x78,0x46,0x27,0x29,0xfe,0x90,0x50,0x52,0x47,0xb0,0xba,0x43,0x2a,0x00,0x01,0xfe,0x9c,0x04,0xc2,0x01,0x64,0x05,0xf0,0x00,0x07,0x00,0x1b,0x40,0x0d,0x00,0x05,0x80,0x03,0xfd,0x06,0x00,0x00,0xfc,0x01,0x04,0xfc,0x05,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xed,0x1a,0xcd,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x23,0x11, +0x21,0x01,0x64,0x68,0xfe,0x08,0x68,0x02,0xc8,0x04,0xc2,0xc5,0xc5,0x01,0x2e,0x00,0x00,0x02,0xfe,0x2a,0xfd,0xfe,0x01,0xd6,0xff,0xaa,0x00,0x03,0x00,0x07,0x00,0x10,0xb6,0x06,0x05,0x02,0x50,0x01,0x01,0x01,0x00,0x2f,0x5d,0xcd,0x2f,0xcd,0x31,0x30,0x05,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x01,0xd6,0xfc,0x54,0x03,0xac,0xfc,0x54, +0x03,0xac,0xda,0x84,0xfe,0x54,0x84,0x00,0x00,0x02,0xff,0x58,0xfe,0x1e,0x00,0xa8,0xff,0x89,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x12,0x02,0x01,0x05,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x01,0x01,0x04,0xfc,0x05,0x2f,0xf1,0xca,0x2f,0xe1,0x00,0x2f,0x5d,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x23,0x11, +0x33,0xa8,0x6a,0x6a,0xe6,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0xfe,0x95,0x01,0x6b,0x00,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x05,0x00,0x12,0xb7,0x01,0x04,0xfd,0x05,0x01,0xfc,0x02,0x05,0x2f,0xd4,0xe1,0x00,0x2f,0xfd,0xc4,0x31,0x30,0x17,0x11,0x23,0x11,0x23,0x35,0xb6,0x6c,0xfe,0x3a,0xfe,0x90,0x01,0x06,0x6a,0x00, +0x00,0x01,0xfe,0xc0,0x04,0xc4,0x01,0x40,0x06,0x74,0x00,0x19,0x00,0x3c,0x40,0x1d,0x05,0xc4,0x06,0x12,0xc4,0x13,0x0e,0x0b,0x09,0x10,0x18,0x01,0x03,0x16,0x0d,0x00,0x0c,0x19,0x06,0x0c,0x13,0x06,0x10,0xda,0x16,0x03,0xda,0x09,0x13,0x00,0x2f,0xd4,0xfd,0xdc,0xed,0xc4,0x10,0xc6,0x10,0xc6,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x11, +0x12,0x39,0x39,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x13,0x07,0x16,0x33,0x32,0x35,0x33,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x37,0xa6,0x58,0x1e,0x1e,0x54,0x62,0x5f,0x53,0x3c,0x44,0x5a,0x5a,0x56,0x1e,0x1c,0x58,0x5e,0x60,0x56,0x3a,0x40,0x5c,0x06,0x3a,0x88,0x0a,0x74,0x68, +0x85,0x21,0x8c,0x3a,0x84,0x0c,0x72,0x6e,0x7e,0x23,0x8f,0x00,0x00,0x03,0xfe,0xc0,0x04,0xc4,0x01,0x40,0x07,0x62,0x00,0x0b,0x00,0x1f,0x00,0x2b,0x00,0x35,0x40,0x1b,0x09,0x03,0x29,0xc0,0x23,0x23,0x16,0x1f,0xc4,0x0c,0x15,0xc4,0x16,0x06,0xc1,0x00,0x0c,0x13,0xda,0x19,0x1d,0xda,0x0f,0x16,0x26,0xc1,0x20,0x00,0x2f,0xfd,0xd6,0xd4, +0xfd,0xdc,0xed,0xd4,0xd6,0xed,0x01,0x2f,0xe1,0xd4,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x39,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01, +0x28,0x3b,0x3c,0x27,0x29,0x3a,0x3a,0x01,0x18,0x5f,0x53,0x46,0x5c,0x4c,0x2a,0x58,0x5e,0x60,0x56,0x42,0x54,0x49,0x35,0x54,0xdf,0x29,0x3a,0x3c,0x27,0x29,0x3a,0x3a,0x06,0xa0,0x39,0x29,0x2a,0x36,0x37,0x29,0x29,0x39,0x0a,0x69,0x85,0x33,0x2b,0x70,0x6c,0x7f,0x33,0x2d,0x75,0xfe,0x2e,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00, +0x00,0x02,0xfe,0xc0,0x04,0xb2,0x01,0x40,0x06,0xa0,0x00,0x12,0x00,0x25,0x00,0x34,0x40,0x1a,0x25,0x13,0x12,0xc4,0x00,0x1c,0x1d,0x09,0xc4,0x0a,0x00,0x07,0xda,0x0c,0x10,0xda,0x09,0x03,0x13,0x1a,0xda,0x1f,0x23,0xda,0x1d,0x16,0x00,0x2f,0xc4,0xfd,0xdc,0xed,0xd4,0xd6,0xc6,0xfd,0xdc,0xed,0xc4,0x01,0x2f,0xe1,0x39,0x39,0xd4,0xe1, +0x39,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x40,0x5c,0x56,0x42,0x57,0x57,0x28,0x58,0x5e,0xb6,0x3e,0x52,0x52,0x32,0x54,0x62,0x5c,0x56,0x42,0x57,0x57, +0x28,0x58,0x5e,0xb6,0x3e,0x52,0x52,0x32,0x54,0x06,0xa0,0x64,0x76,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0xfe,0xfe,0x64,0x76,0x25,0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x00,0x01,0xfe,0xa8,0xfe,0x6e,0x01,0x58,0xff,0xb6,0x00,0x09,0x00,0x35,0x40,0x1c,0x07,0x05,0x02,0x00,0x0e,0x09,0xfd,0x03,0x40,0x03,0x02,0x42,0x03,0x0f,0x02,0x1f, +0x02,0x2f,0x02,0x03,0x02,0x04,0x03,0x09,0x08,0x06,0x09,0x01,0x2f,0xcd,0x2f,0xcd,0x11,0x39,0x39,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a,0x18,0x10,0xfd,0xed,0x11,0x39,0x39,0x31,0x30,0x03,0x27,0x37,0x15,0x21,0x35,0x17,0x07,0x35,0x21,0xa8,0xb0,0xb0,0x01,0x50,0xb0,0xb0,0xfe,0xb0,0xfe,0x6e,0xa4,0xa4,0x6e,0x6e,0xa4,0xa4,0x6f,0x00, +0x00,0x01,0xff,0x5c,0xfe,0x5c,0x00,0xa4,0xff,0xdb,0x00,0x06,0x00,0x18,0x40,0x0a,0x00,0x04,0x02,0x03,0x04,0x04,0x05,0xfc,0x01,0x02,0x2f,0xdd,0xf1,0xc1,0x2f,0x00,0x2f,0xdd,0x32,0xc6,0x31,0x30,0x03,0x35,0x23,0x37,0x17,0x23,0x15,0x35,0x6f,0xa4,0xa4,0x6f,0xfe,0x5c,0xcf,0xb0,0xb0,0xcf,0x00,0x01,0xfd,0x0e,0x05,0xc2,0x02,0xf2, +0x07,0x00,0x00,0x15,0x00,0x1d,0x40,0x0e,0x00,0x07,0xda,0x0e,0x12,0xda,0x03,0x0b,0x15,0xda,0x00,0x0a,0xda,0x0b,0x2f,0xe1,0x2f,0xe1,0x00,0x2f,0xd4,0xfd,0xd4,0xed,0xc4,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x25,0x24,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x05,0x04,0x33,0x32,0x36,0x35,0x02,0xf2,0x02,0xb6,0x86,0x92,0xfe, +0xde,0xfe,0xde,0x90,0x58,0x71,0x77,0x02,0xb4,0x88,0x95,0x01,0x23,0x01,0x22,0x8c,0x57,0x72,0x07,0x00,0x86,0xb2,0x5b,0x5a,0x6b,0x50,0x88,0xb0,0x5b,0x5b,0x6c,0x50,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x07,0x40,0x00,0x09,0x00,0x16,0x40,0x09,0x03,0xda,0x08,0x00,0x06,0x01,0x00,0x05,0x06,0x2f,0x33,0x2f,0x32,0x00,0x2f,0xc4, +0xd4,0xed,0x31,0x30,0x01,0x23,0x02,0x21,0x20,0x03,0x23,0x12,0x21,0x20,0x03,0x1a,0xa2,0xba,0xfe,0x41,0xfe,0x43,0xba,0xa2,0xf0,0x02,0x2a,0x02,0x2a,0x05,0xc2,0x01,0x02,0xfe,0xfe,0x01,0x7e,0x00,0x00,0x01,0xfd,0xaf,0xfe,0x6e,0x02,0x51,0xff,0xb6,0x00,0x06,0x00,0x22,0x40,0x12,0x04,0x05,0xfd,0x01,0x40,0x0f,0x02,0x1f,0x02,0x2f, +0x02,0x03,0x02,0x01,0x05,0x80,0x03,0x00,0x2f,0x2f,0x1a,0xcd,0x32,0x00,0x2f,0x5d,0x1a,0xdd,0xfd,0xcd,0x31,0x30,0x05,0x21,0x35,0x17,0x07,0x35,0x21,0xfd,0xaf,0x03,0xf2,0xb0,0xb0,0xfc,0x0e,0xb8,0x6e,0xa4,0xa4,0x6f,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4c,0x40,0x2b,0x0d,0x0a,0x04,0x95, +0x40,0x07,0x08,0x11,0x07,0x95,0x09,0x30,0x03,0x15,0x01,0x1d,0x95,0x17,0x16,0x0e,0x23,0x95,0x11,0x10,0x08,0x00,0x0b,0x0b,0x0a,0x14,0x83,0x20,0x20,0x27,0x02,0x0d,0x0a,0x07,0x04,0x19,0x84,0x05,0x03,0x2f,0xc6,0xe9,0x17,0x39,0x12,0x39,0x2f,0xe9,0x11,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x2b,0x00,0x18,0x2f, +0x1a,0xed,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x85,0x85,0xa2,0xf8,0xf8,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80, +0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x04,0xb4,0x8c,0xac,0xac,0x8c,0xfe,0x98,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49,0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x03,0xff,0xac,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x1b,0x00,0x23,0x00,0x2b,0x00,0x48,0x40,0x26,0x08,0x08,0x00,0x0d,0x14,0x24,0x91,0x1d,0x1d,0x0d, +0x25,0x91,0x00,0x12,0x1c,0x01,0x91,0x0d,0x03,0x14,0x25,0x18,0x7d,0x29,0x29,0x11,0x7d,0x21,0x21,0x2d,0x00,0x05,0x7e,0x0a,0x1d,0x25,0x7e,0x00,0x2f,0xe9,0x32,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xe9,0x39,0x2f,0xe9,0x11,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x11,0x23,0x22, +0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x01,0x0e,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x96,0xba,0xda,0x84,0x74,0x91,0xae,0xfe,0xf8,0xc9,0xfa,0xac,0x8a, +0x9d,0xfe,0xee,0xc1,0xe4,0x94,0xa3,0xfe,0xa6,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0xe4,0x05,0x02,0xfe,0x31,0x85,0x79,0xd1,0xfd,0x9a,0xfd,0xfc,0x8c,0x7a,0xfe,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x2e,0x40,0x18,0x0d,0x91, +0x05,0x05,0x01,0x0e,0x91,0x00,0x12,0x04,0x91,0x01,0x03,0x02,0x02,0x09,0x7d,0x12,0x12,0x16,0x05,0x0e,0x7e,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc, +0x02,0xfe,0xfd,0xaa,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0x98,0xfe,0x38,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x12,0x00,0x1f,0x00,0x36,0x40,0x1d,0x08,0x00,0x0b,0x17,0x95,0x11,0x16,0x03,0x15,0x1d,0x95,0x0b, +0x10,0x07,0x95,0x04,0x00,0x05,0x05,0x0e,0x83,0x1a,0x1a,0x21,0x14,0x01,0x08,0x84,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33, +0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x03,0x25,0xfd,0x7d,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80,0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x05,0xec,0x8c,0xfd,0xec,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49,0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x02,0x00,0x33,0x00,0x00, +0x04,0x38,0x05,0xb2,0x00,0x0d,0x00,0x15,0x00,0x2b,0x40,0x16,0x0e,0x91,0x06,0x06,0x05,0x0f,0x91,0x00,0x12,0x03,0x05,0x04,0x0a,0x7d,0x13,0x13,0x17,0x02,0x06,0x0f,0x7e,0x00,0x2f,0xe1,0x32,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xcd,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x27,0x35,0x25,0x33,0x11,0x21,0x32,0x16,0x15, +0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x89,0x01,0x1b,0x16,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa0,0xfe,0xcb,0x04,0x81,0x77,0x16,0xa4,0xfd,0x86,0xcd,0xbf,0xc6,0xe6,0x02,0xa4,0xfd,0xf2,0x8e,0x7e,0x01,0x02,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x13,0x00,0x20,0x00,0x33, +0x40,0x1b,0x09,0x01,0x0c,0x18,0x95,0x12,0x16,0x03,0x15,0x1e,0x95,0x0c,0x10,0x06,0x08,0x00,0x0f,0x83,0x1b,0x1b,0x22,0x14,0x01,0x09,0x84,0x05,0x03,0x2f,0xc6,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xcd,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x27,0x35,0x25,0x33,0x11,0x33,0x36,0x33, +0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x85,0x01,0x10,0x17,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80,0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x04,0xc2,0x73,0x17,0xa0,0xfd,0x60,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49, +0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x01,0x00,0x6a,0xff,0xe8,0x04,0x98,0x05,0xb2,0x00,0x15,0x00,0x22,0x40,0x11,0x01,0x03,0x91,0x14,0x13,0x0b,0x09,0x91,0x0e,0x04,0x11,0x7d,0x06,0x06,0x17,0x0b,0x00,0x2f,0x32,0x11,0x39,0x2f,0xe9,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x00,0x11,0x10, +0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x6a,0x9a,0xba,0xf6,0x01,0x34,0xfe,0xe1,0xea,0xd8,0x9d,0x9f,0xed,0x01,0x31,0x01,0x71,0xfe,0x64,0xfe,0xc0,0xcc,0x23,0xb2,0x56,0x01,0x4b,0x01,0x13,0x01,0x07,0x01,0x36,0x60,0xa4,0x54,0xfe,0x76,0xfe,0xc0,0xfe,0xa8,0xfe,0x58,0x00,0x01,0x00,0x5e,0xff,0xe8, +0x05,0x42,0x06,0x83,0x00,0x21,0x00,0x43,0x40,0x24,0x20,0x11,0x01,0x11,0x0f,0x91,0x14,0x13,0x21,0x92,0x00,0x02,0x92,0x1f,0x1a,0x1c,0x1a,0x07,0x09,0x91,0x1a,0x04,0x19,0x06,0x17,0x00,0x1c,0x7f,0x04,0x06,0x12,0x12,0x23,0x0c,0x7d,0x17,0x2f,0xe1,0x12,0x39,0x2f,0xd6,0xd6,0xe1,0xc6,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x11,0x39, +0x10,0xd4,0xfd,0xd6,0xed,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x05,0x42,0x2a,0x24,0x71,0x0f,0x09,0xa5,0xb7,0xf1,0xfe,0xd2,0x01,0x1f,0xe9,0xd8,0x9e,0x9f,0xed, +0xfe,0xce,0xfe,0x90,0x01,0x9c,0x01,0x3e,0x5c,0x5e,0x03,0x85,0x68,0x30,0x30,0x05,0xe4,0x14,0x9e,0x3c,0x58,0x06,0x5a,0xfe,0xb5,0xfe,0xed,0xfe,0xfa,0xfe,0xc9,0x60,0xa3,0x54,0x01,0x8a,0x01,0x40,0x01,0x57,0x01,0xa9,0x18,0x5f,0x8a,0x13,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x0e,0x04,0xd5,0x00,0x21,0x00,0x48,0x40,0x1d,0x30,0x11, +0x01,0x11,0x11,0x0f,0x95,0x14,0x16,0x21,0x96,0x00,0x02,0x96,0x1f,0x1a,0x1c,0x1a,0x40,0x07,0x01,0x07,0x07,0x09,0x95,0x1a,0x10,0x00,0x1c,0xb8,0x01,0x03,0xb7,0x04,0x06,0x11,0x11,0x23,0x0c,0x83,0x17,0x2f,0xe1,0x12,0x39,0x2f,0xd6,0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x12,0x39,0x10,0xd4,0xfd,0xd6,0xed,0x3f,0xed,0x32, +0x2f,0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x04,0x0e,0x23,0x20,0x65,0x08,0x06,0x93,0x7d,0x95,0xbb,0xbd,0x9f,0x86,0x76,0x76,0xa2,0xdd,0xfe,0xf5,0x01,0x1a,0xe0,0x4b,0x41,0x02, +0x77,0x59,0x28,0x2e,0x04,0x42,0x12,0x8e,0x54,0x2e,0x04,0x4e,0xdf,0xb9,0xb4,0xd0,0x59,0x9c,0x47,0x01,0x1f,0xe5,0xef,0x01,0x3d,0x14,0x57,0x7a,0x13,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x0b,0x00,0x17,0x00,0x43,0x40,0x0a,0x10,0x0d,0x01,0x91,0x40,0x04,0x05,0x00,0x04,0x91,0xb8,0x01,0x00,0x40,0x17,0x30, +0x11,0x91,0x00,0x12,0x0c,0x91,0x05,0x03,0x0f,0x0f,0x11,0x08,0x7d,0x15,0x15,0x19,0x0d,0x04,0x11,0x7e,0x02,0x00,0x2f,0xc6,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x21, +0x15,0x21,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0xbc,0xa0,0xa0,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0x01,0x50,0xfe,0xb0,0xd6,0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x02,0x81,0x9b,0x02,0x7e,0xfd,0x45,0xfe,0xb2,0xfe,0x6f,0x05,0x02,0xfe,0x1a,0x9b,0xfe,0x17,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x02,0xff,0xac,0x00,0x00,0x05,0x90, +0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x2e,0x40,0x18,0x08,0x08,0x0d,0x15,0x91,0x00,0x12,0x14,0x01,0x91,0x0d,0x03,0x05,0x7e,0x0a,0x00,0x10,0x7d,0x19,0x19,0x1d,0x15,0x7e,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xd4,0xe1,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x21,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26, +0x35,0x34,0x36,0x33,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0x01,0x0e,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x8a,0x02,0xf6,0xfe,0x5b,0xfe,0x9e,0xd3,0xd6,0x01,0x1a,0x01,0x39,0xfd,0xb7,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xfd,0x45,0xfe,0xb4,0xfe,0x6d,0x05,0x02,0xfb,0x96, +0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x02,0x00,0x5c,0x00,0x00,0x03,0xd7,0x05,0x9a,0x00,0x0c,0x00,0x13,0x00,0x2c,0x40,0x17,0x0e,0x91,0x08,0x08,0x0c,0x0d,0x91,0x00,0x12,0x09,0x91,0x0c,0x03,0x00,0x7e,0x08,0x0d,0x0d,0x15,0x0a,0x11,0x7d,0x04,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed, +0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x24,0x33,0x33,0x11,0x21,0x35,0x21,0x03,0x11,0x23,0x20,0x11,0x10,0x21,0x03,0xd7,0xfe,0x5c,0xe5,0xf2,0x01,0x0a,0xe0,0xe9,0xfd,0xaa,0x02,0xfe,0xa8,0xe7,0xfe,0xc6,0x01,0x36,0xce,0xc2,0xc2,0xe6,0x01,0xc8,0x9a,0xfa,0xfa,0x02,0x0e,0xfe,0xf4,0xfe,0xfe,0x00,0x00,0x02,0x00,0x60,0xff,0xe8, +0x04,0x0e,0x05,0xec,0x00,0x12,0x00,0x1f,0x00,0x34,0x40,0x1c,0x0e,0x02,0x0b,0x1d,0x95,0x05,0x16,0x00,0x15,0x17,0x95,0x0b,0x10,0x0f,0x95,0x12,0x00,0x00,0x84,0x13,0x02,0x0e,0x0e,0x21,0x1a,0x83,0x10,0x08,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x21,0x23, +0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x0e,0xa2,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xfd,0x7e,0x03,0x24,0xa2,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01, +0x32,0xa6,0x01,0xee,0x8c,0xfb,0xe3,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x5c,0x04,0x18,0x00,0x1a,0x00,0x26,0x00,0x44,0x40,0x25,0x00,0x0d,0x1b,0x03,0x06,0x16,0x10,0x09,0x01,0x09,0x0b,0x95,0x06,0x1c,0x21,0x95,0x16,0x10,0x1b,0x00,0x24,0x0d,0x83,0x03,0x03,0x13,0x08,0x08,0x13,0x19, +0x83,0x1e,0x1e,0x28,0x24,0x83,0x13,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x11,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xfd,0xc6,0x5d,0x11,0x12,0x17,0x39,0x31,0x30,0x25,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x10,0x05, +0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xdd,0x7b,0x56,0xd9,0xac,0xad,0x90,0x96,0xab,0xd9,0x58,0xc8,0xd3,0xb3,0x01,0x22,0xe4,0xdf,0x01,0x17,0xfe,0x00,0xc6,0x92,0xba,0x9c,0x9a,0xbc,0x81,0x48,0x53,0x7e,0x50,0x71,0x98,0x4c,0xac,0x6c,0x7f,0x34,0x5d,0x77,0x7e,0xf7,0x92,0xcf,0x01,0x11,0xfe,0xfc,0xc4,0xfe, +0xd9,0x8f,0x6f,0xca,0x73,0x96,0xb2,0xb3,0x95,0x6e,0xbe,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x03,0x52,0x05,0x9a,0x00,0x0b,0x00,0x32,0x40,0x1b,0x04,0x91,0x40,0x07,0x0b,0x00,0x07,0x91,0x2b,0x30,0x03,0x91,0x00,0x12,0x08,0x91,0x0b,0x03,0x00,0x7e,0x07,0x03,0x03,0x0d,0x05,0x09,0x01,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00, +0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x52,0xfd,0x08,0x02,0x50,0xfd,0xfa,0x02,0x06,0xfd,0xd1,0x02,0xd7,0x98,0x01,0xe9,0x97,0x01,0xea,0x98,0x00,0x00,0x01,0x00,0x70,0xff,0xe8,0x03,0xf4,0x05,0xb2,0x00,0x23,0x00,0x49,0x40,0x28,0x08,0x1b, +0x91,0x40,0x1a,0x0e,0x02,0x1a,0x91,0x09,0x30,0x20,0x23,0x01,0x23,0x21,0x91,0x02,0x13,0x11,0x13,0x91,0x0e,0x04,0x08,0x05,0x1b,0x1b,0x1e,0x10,0x00,0x00,0x25,0x05,0x16,0x7d,0x0b,0x1e,0x7d,0x05,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f, +0x1a,0xed,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x37,0x35,0x24,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0xf4,0xa6,0xcf,0xf5,0xfe,0xe6,0xa2,0x90,0xff,0x00,0x01,0x11,0xd9,0xb2,0x91,0x99,0xaf,0x8d,0xaa,0xcb,0xab,0x69, +0x6b,0xfe,0x5d,0xbf,0xa5,0xc8,0xa7,0x35,0x4d,0xdd,0xb8,0x85,0xc4,0x26,0x06,0x50,0xed,0xa7,0xdc,0x46,0xaa,0x58,0x7e,0x6b,0x70,0x92,0x97,0xfe,0xf1,0x7d,0x8d,0x5c,0x00,0x01,0xff,0x9a,0xfe,0x96,0x03,0x94,0x05,0x9a,0x00,0x11,0x00,0x33,0x40,0x1b,0x05,0x91,0x40,0x02,0x10,0x12,0x02,0x91,0x09,0x30,0x0b,0x0d,0x91,0x08,0x01,0x91, +0x10,0x03,0x03,0x11,0x11,0x13,0x02,0x06,0x7e,0x0b,0x0f,0x2f,0xc6,0xe1,0x32,0x12,0x39,0x2f,0xc4,0x00,0x3f,0xed,0x2f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x21,0x03,0x94,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0xfe,0xae,0x41,0x37,0x32, +0x3e,0xb2,0x02,0xd8,0x05,0x02,0xfe,0x10,0x97,0xfd,0xba,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x05,0x65,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x85,0x06,0x83,0x00,0x25,0x00,0x63,0x40,0x37,0x12,0x91,0x40,0x15,0x1e,0x0f,0x15,0x91,0x08,0x30,0x16,0x11,0x0f,0x91,0x18,0x13,0x00,0x20,0x07,0x1e,0x02,0x92,0x23,0x1e,0x1f,0x07,0x2f,0x07, +0x02,0x07,0x09,0x91,0x1e,0x04,0x1d,0x06,0x1b,0x00,0x20,0x7f,0x04,0x06,0x06,0x16,0x13,0x13,0x0c,0x16,0x7e,0x11,0x11,0x27,0x0c,0x7d,0x1b,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x10,0xc0,0x2f,0xd6,0xe1,0xc6,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x5d,0x10,0xd4,0xfd,0x11,0x12,0x39,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18, +0x2f,0x1a,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x21,0x35,0x21,0x11,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x05,0x85,0x29,0x24,0x72,0x0f,0x08,0xbf,0xd2,0xf6,0xfe,0xc8,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc6,0x01,0xe4, +0xd8,0xfe,0xf6,0xfe,0xcd,0xfe,0x85,0x01,0xa5,0x01,0x43,0x79,0x76,0x03,0x86,0x67,0x30,0x30,0x05,0xe4,0x14,0xa8,0x48,0x54,0x06,0x6c,0xfe,0xb6,0xfe,0xf6,0xfe,0xf0,0xfe,0xc9,0x43,0x01,0x92,0x98,0xfd,0x76,0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x22,0x64,0x8f,0x13,0x00,0x00,0x02,0x00,0x12,0xfe,0x1e,0x04,0xe6,0x05,0x9a, +0x00,0x17,0x00,0x1f,0x00,0x16,0x40,0x0a,0x1c,0x91,0x07,0x1c,0x00,0x0f,0x03,0x00,0x21,0x0f,0x2f,0x10,0xc6,0x00,0x3f,0x33,0x3f,0xed,0x31,0x30,0x01,0x01,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x01,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x04,0xe6,0xfd,0xfe, +0x06,0x72,0x89,0x63,0x60,0x82,0x29,0x4d,0x08,0xfe,0x06,0xbb,0x01,0x8d,0x15,0x08,0x04,0x0d,0x14,0x01,0x95,0xfe,0x43,0x43,0x43,0x44,0x05,0x9a,0xfa,0xc8,0x0c,0xe4,0x6e,0x61,0x85,0x82,0x64,0x3d,0x75,0x9a,0x10,0x05,0x3a,0xfb,0xbc,0x3a,0x36,0x39,0x37,0x04,0x44,0xfa,0x3f,0x8d,0x44,0x58,0x58,0x44,0x00,0x01,0x00,0xa6,0xff,0xe8, +0x06,0x87,0x05,0xec,0x00,0x20,0x00,0x45,0x40,0x27,0x04,0x01,0x07,0x0c,0x95,0x17,0x16,0x01,0x15,0x11,0x0f,0x1d,0x95,0x40,0x07,0x10,0x02,0x00,0x0a,0x84,0x19,0x00,0x0f,0x19,0x84,0x09,0x30,0x12,0x83,0x11,0x14,0x84,0x0f,0x0f,0x22,0x04,0x00,0x84,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0x2b,0x01,0x10,0xe1,0x00,0x18, +0x3f,0x3f,0x1a,0xed,0x3f,0x3f,0x3f,0xed,0x11,0x12,0x39,0x31,0x30,0x21,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x15,0x10,0x33,0x32,0x36,0x35,0x10,0x03,0x33,0x12,0x11,0x14,0x02,0x23,0x20,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x4a,0xa4,0xa4,0x04,0x62,0xcb,0x01,0x50,0xf7,0x84,0x9e,0x90,0xb2,0x81,0xfe,0xcb,0xfe, +0x69,0x69,0x7c,0x6c,0x8c,0x05,0xec,0xfd,0x72,0xba,0xfe,0x5f,0xaa,0xfe,0xaa,0xc2,0xa4,0x01,0x19,0x01,0x0a,0xfe,0xf6,0xfe,0xee,0xe5,0xfe,0xe9,0x01,0xda,0x8a,0xaa,0x98,0xb5,0x91,0x00,0x00,0x01,0x00,0xb8,0xff,0xee,0x02,0x25,0x05,0x9a,0x00,0x0b,0x00,0x1b,0x40,0x0d,0x0b,0x09,0x91,0x02,0x16,0x05,0x03,0x00,0x00,0x0d,0x06,0x7e, +0x05,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x25,0x06,0x23,0x22,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x25,0x3c,0x3b,0xf6,0xa8,0x68,0x30,0x2d,0x04,0x16,0x01,0x22,0x04,0x8a,0xfb,0x7a,0x8f,0x15,0x00,0x01,0x00,0x29,0x00,0x00,0x02,0x10,0x05,0x9a,0x00,0x0b,0x00,0x3b,0x40,0x20,0x0a,0x01,0x04,0x91, +0x40,0x07,0x08,0x03,0x07,0x91,0x14,0x30,0x03,0x12,0x08,0x03,0x0b,0x0a,0x06,0x07,0x40,0x0a,0x07,0x02,0x7e,0x03,0x0c,0x0d,0x03,0x7e,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x1a,0x18,0x10,0xcd,0x10,0xcd,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11, +0x33,0x02,0x10,0xa0,0xa8,0x9f,0x9f,0xa8,0xa0,0x02,0x8e,0xfd,0x72,0x02,0x8e,0x97,0x02,0x75,0xfd,0x8b,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0xb2,0x00,0x17,0x00,0x2e,0x40,0x18,0x0a,0x17,0x05,0x03,0x08,0x01,0x07,0x12,0x08,0x03,0x12,0x14,0x91,0x0f,0x04,0x17,0x06,0x12,0x00,0x19,0x09,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x10, +0xd6,0xc6,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0x33,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x01,0x3c,0x8d,0x94,0x5c,0x38,0x37,0x38,0x3e,0x50,0x76,0xfe,0xc4, +0x02,0x90,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x01,0xa4,0xbc,0x5a,0x1a,0x9c,0x1e,0x99,0xfe,0x65,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x15,0x00,0x31,0x40,0x1a,0x01,0x03,0x11,0x15,0x04,0x14,0x05,0x15,0x14,0x0f,0x0c,0x0e,0x95,0x09,0x01,0x15,0x04,0x14,0x00,0x17,0x0c,0x10,0x10,0x04,0x84,0x05,0x2f,0xe1, +0x32,0x10,0xc6,0x10,0xd6,0xc6,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xb3,0x8b,0x47,0x2f,0x37,0x35,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe, +0x14,0x04,0xb2,0x99,0xb7,0x12,0x94,0x1b,0xcf,0xfd,0x83,0x01,0xd5,0xfe,0x12,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x01,0xdb,0x05,0xec,0x00,0x0b,0x00,0x3b,0x40,0x20,0x0a,0x01,0x04,0x95,0x40,0x07,0x08,0x03,0x07,0x95,0x14,0x30,0x03,0x15,0x08,0x00,0x0b,0x0a,0x06,0x07,0x40,0x0a,0x07,0x02,0x84,0x03,0x0c,0x0d,0x03,0x84,0x08,0x30, +0x2b,0x01,0x10,0xe1,0x39,0x39,0x1a,0x18,0x10,0xcd,0x10,0xcd,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x01,0xdb,0x91,0xa4,0x92,0x92,0xa4,0x91,0x02,0xc4,0xfd,0x3c,0x02,0xc4,0x8c,0x02,0x9c,0xfd,0x64,0x00,0x01,0xff,0xfe,0x00,0x00,0x03,0xdf, +0x05,0xee,0x00,0x16,0x00,0x7c,0x40,0x44,0x16,0x12,0x00,0x06,0x05,0x02,0x07,0x15,0x07,0x13,0x12,0x00,0x09,0x05,0x02,0x08,0x14,0x08,0x16,0x13,0x12,0x00,0x12,0x09,0x06,0x05,0x02,0x05,0x06,0x08,0x09,0x13,0x15,0x16,0x06,0x07,0x14,0x10,0x07,0x07,0x05,0x05,0x02,0x0b,0x00,0x04,0x15,0x0d,0x0b,0x95,0x10,0x00,0x14,0x07,0x08,0x15, +0x00,0x08,0x0d,0x0d,0x02,0x05,0x12,0x03,0x04,0x00,0x18,0x04,0x2f,0x10,0xc6,0x11,0x17,0x39,0x39,0x2f,0xc6,0x10,0xc6,0x11,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x33,0x12,0x39,0x39,0x11,0x33,0x2f,0x10,0xc4,0x11,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0, +0x31,0x30,0x21,0x23,0x01,0x01,0x23,0x01,0x27,0x05,0x27,0x25,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x37,0x17,0x05,0x03,0xdf,0xb0,0xfe,0xe7,0xfe,0x9c,0xb4,0x01,0xcf,0x1b,0xfe,0xf2,0x3a,0x01,0x1f,0x35,0x66,0x3e,0x3c,0x3c,0x46,0x68,0x80,0x36,0xf4,0x3a,0xff,0x00,0x03,0x3c,0xfc,0xc4,0x03,0xf8,0x4c,0x84,0x71,0x8b, +0x9c,0x12,0x99,0x0f,0x69,0x85,0x77,0x71,0x7d,0x00,0x00,0x01,0x00,0xb8,0xff,0xe8,0x06,0x66,0x05,0x9a,0x00,0x1e,0x00,0x45,0x40,0x27,0x02,0x07,0x15,0x1e,0x04,0x0c,0x19,0x05,0x11,0x91,0x40,0x09,0x13,0x00,0x12,0x0c,0x03,0x01,0x1e,0x7e,0x1d,0x0e,0x15,0x0c,0x15,0x42,0x0d,0x7e,0x0c,0x07,0x16,0x7e,0x15,0x1f,0x20,0x15,0x7e,0x08, +0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x33,0x00,0x18,0x3f,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x66,0xa4,0x04, +0x6c,0xd1,0xd7,0x48,0x72,0xe4,0xfe,0xac,0xa8,0x67,0x7d,0x67,0x91,0xa8,0xe2,0x6c,0x8c,0xa8,0xa2,0xba,0xd4,0xd4,0x01,0xc4,0x03,0xee,0xfc,0x26,0xa5,0x9c,0xbf,0x86,0x03,0xd6,0xfc,0x12,0xfe,0xd3,0xb5,0x90,0x03,0xd6,0x00,0x01,0xff,0x9a,0xfe,0x96,0x05,0x42,0x05,0x9a,0x00,0x1b,0x00,0x30,0x40,0x19,0x0d,0x0f,0x91,0x0a,0x04,0x16, +0x1b,0x03,0x13,0x01,0x12,0x13,0x03,0x13,0x01,0x07,0x1b,0x7e,0x1a,0x1a,0x1d,0x0d,0x07,0x7e,0x12,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x16,0x17,0x33, +0x26,0x35,0x11,0x33,0x05,0x42,0xd0,0xfd,0x1e,0x1c,0x12,0x06,0x08,0xfe,0xae,0x41,0x37,0x32,0x3e,0xb2,0xda,0x02,0xce,0x2d,0x0d,0x04,0x0a,0xaa,0x04,0x77,0x2b,0x2f,0x2e,0x97,0xfc,0x29,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x05,0x65,0xfb,0x9b,0x46,0x1a,0x3e,0x95,0x03,0xf2,0x00,0x00,0x01,0x00,0x83,0xfe,0x6c,0x03,0xf8,0x04,0x18, +0x00,0x15,0x00,0x34,0x40,0x1b,0x0f,0x09,0x12,0x01,0x09,0x15,0x0c,0x0f,0x04,0x95,0x12,0x10,0x00,0x83,0x01,0x01,0x17,0x09,0x10,0x0d,0x08,0x84,0x09,0x0d,0x83,0x0c,0x09,0x2f,0xd6,0xe1,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x2f,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15, +0x11,0x23,0x11,0x34,0x27,0x33,0x16,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa6,0xec,0x7d,0x9f,0xa4,0x23,0xa8,0x1b,0x04,0x70,0xe4,0xa7,0xb3,0xfe,0x6c,0x03,0xd0,0x01,0x47,0xb1,0x86,0xfd,0xb4,0x02,0xb6,0xef,0x5b,0x47,0x67,0xc6,0xd6,0xcb,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x12,0x00,0x19, +0x00,0x38,0xb7,0x14,0x91,0x40,0x12,0x06,0x00,0x12,0x91,0xb8,0x01,0x00,0x40,0x14,0x30,0x17,0x91,0x00,0x13,0x0f,0x91,0x06,0x04,0x12,0x0c,0x14,0x09,0x7d,0x13,0x13,0x1b,0x14,0x7d,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00, +0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x00,0x23,0x22,0x00,0x07,0x05,0x21,0x16,0x00,0x33,0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xc2,0x13,0xfe,0xfd,0xd8,0xd0,0xfe,0xee,0x16,0x03,0xe6,0xfc,0x1a,0x15,0x01,0x0c,0xcb,0xdc,0x01,0x0b,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01, +0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x03,0x30,0xf6,0x01,0x0c,0xfe,0xe8,0xea,0x9b,0xea,0xfe,0xec,0x01,0x0b,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x07,0x04,0x05,0xb2,0x00,0x15,0x00,0x20,0x00,0x3e,0x40,0x22,0x16,0x07,0x1f,0x91,0x09,0x13,0x00,0x12,0x02,0x06,0x17,0x03,0x19,0x04,0x91,0x13,0x15,0x19,0x91,0x0f,0x04,0x07, +0x7e,0x16,0x16,0x0c,0x01,0x7e,0x00,0x00,0x22,0x1c,0x7d,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x33,0xd4,0xed,0x11,0x17,0x39,0x3f,0x3f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x11,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x11,0x26,0x23, +0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x07,0x04,0xa8,0x76,0x82,0x36,0x4f,0xf9,0xe8,0xfe,0xce,0xfe,0x92,0x01,0x83,0x01,0x37,0x70,0xbe,0xbe,0x6c,0xd8,0xbc,0xfd,0x34,0xca,0x5e,0xe4,0xfe,0xe2,0x01,0x17,0xe5,0xa0,0x04,0xf4,0x19,0x09,0xfb,0x7e,0x7a,0x01,0x90,0x01,0x44,0x01,0x4c,0x01,0xaa,0x22,0x22,0x44,0xfb,0x0a,0x04,0x3e,0x20, +0xfe,0xba,0xfe,0xf7,0xfe,0xf6,0xfe,0xbe,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0xac,0x04,0x18,0x00,0x15,0x00,0x20,0x00,0x3e,0x40,0x22,0x16,0x07,0x1f,0x95,0x09,0x16,0x00,0x15,0x02,0x06,0x17,0x03,0x19,0x04,0x95,0x13,0x15,0x19,0x95,0x0f,0x10,0x07,0x84,0x16,0x16,0x0c,0x00,0x84,0x01,0x01,0x22,0x1c,0x83,0x0c,0x2f,0xe1,0x12,0x39, +0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x33,0xd4,0xed,0x11,0x17,0x39,0x3f,0x3f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x11,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x05,0xac,0xa4,0x64,0x5c,0x3e,0x3d,0xaf,0xb8, +0xec,0xfe,0xe6,0x01,0x28,0xec,0x54,0x98,0x98,0x54,0xb2,0xae,0xfd,0x81,0x7f,0x46,0x9e,0xc2,0xc5,0xa7,0x6e,0x03,0x62,0x18,0x08,0xfc,0xec,0x56,0x01,0x1b,0xf3,0xfa,0x01,0x28,0x21,0x22,0x43,0xfc,0x80,0x02,0xd8,0x1e,0xd7,0xbd,0xb8,0xd0,0x00,0x02,0xff,0xac,0x00,0x00,0x04,0x7b,0x05,0x9a,0x00,0x16,0x00,0x1d,0x00,0x3c,0x40,0x1f, +0x09,0x09,0x0f,0x02,0x00,0x91,0x18,0x18,0x0f,0x02,0x12,0x17,0x03,0x91,0x0f,0x03,0x13,0x7d,0x1b,0x1b,0x1f,0x02,0x09,0x09,0x07,0x7e,0x0c,0x18,0x01,0x7e,0x02,0x2f,0xe1,0x32,0xd4,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22, +0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0x01,0xb6,0xa8,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x88,0xe6,0xfd,0xfe,0xe6,0xef,0xbc,0xb0,0x01,0x65,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xe1,0xcb, +0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x01,0x30,0x01,0x1c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x3c,0x40,0x20,0x0f,0x01,0x18,0x12,0x03,0x1b,0x1e,0x95,0x18,0x16,0x24,0x95,0x12,0x10,0x0a,0x0c,0x95,0x07,0x01,0x0a,0x0a,0x02,0x15,0x83,0x21,0x21,0x28,0x1b,0x0e,0x02,0x84,0x03,0x2f,0xe1, +0x32,0x32,0x12,0x39,0x2f,0xe1,0x10,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x3f,0x11,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01, +0x4e,0x04,0xa4,0xb2,0x8c,0x47,0x2f,0x37,0x35,0xa4,0x04,0x76,0xec,0xc5,0xdf,0xfa,0xd9,0xc9,0x6e,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x06,0x89,0x98,0xb8,0x12,0x94,0x1b,0xcf,0xfe,0xa4,0xcc,0xfe,0xef,0xe9,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7e,0xb2,0xe3,0xcc,0xab,0xc2,0xc6,0x00,0x02,0x00,0xbc,0xff,0x68, +0x04,0x62,0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x40,0x40,0x22,0x11,0x05,0x91,0x40,0x15,0x0a,0x07,0x15,0x91,0x08,0x30,0x00,0x07,0x12,0x14,0x91,0x0a,0x08,0x03,0x10,0x15,0x01,0x00,0x00,0x0e,0x7d,0x19,0x19,0x1d,0x15,0x0a,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x12,0x39,0x00,0x3f,0xdd,0xed,0x3f, +0x2f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x05,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x15,0x21,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x04,0x62,0xc8,0xc5,0x5d,0xa1,0x73,0xa8,0xa8,0x01,0x04,0xcd,0xe7,0xfe,0xc1,0x57,0x47,0xfd,0xe9,0xde,0x89,0xa1,0xfe,0xde,0x98,0x01, +0xb6,0xce,0xfe,0x14,0x05,0x9a,0x98,0xcd,0xb0,0xfe,0xe0,0x4d,0x04,0x36,0x92,0x03,0x1e,0xfe,0x19,0x80,0x74,0xf3,0x00,0x01,0x00,0x62,0xff,0xe8,0x03,0xc7,0x05,0xb2,0x00,0x35,0x00,0x3e,0x40,0x23,0x0a,0x2d,0x14,0x23,0x04,0x05,0x30,0x1b,0x01,0x1b,0x19,0x91,0x1e,0x04,0x20,0x35,0x01,0x35,0x30,0x91,0x05,0x13,0x23,0xb1,0x14,0x1b, +0x14,0x1b,0x0a,0x35,0x35,0x37,0x2d,0xb1,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x00,0x3f,0xed,0xc4,0x5d,0x3f,0xed,0xcd,0x5d,0x12,0x17,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e, +0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x03,0xc7,0x1c,0x5d,0x68,0x63,0x23,0x66,0xb8,0x8d,0x53,0x3d,0x68,0x8a,0x4d,0x4b,0x73,0x50,0x29,0x36,0x56,0x6d,0x38,0xc7,0x7f,0x62,0xd3,0x5d,0xb3,0x8c,0x56,0x37,0x60,0x82,0x4b,0x47,0x7b,0x5a,0x33,0x99,0x9b,0x2d,0x6a,0x69,0x5f,0x22,0x3a,0x13,0x1f,0x15,0x0b,0x29, +0x5c,0x93,0x6a,0x50,0x7c,0x66,0x54,0x26,0x25,0x3e,0x42,0x50,0x37,0x3b,0x52,0x34,0x17,0x58,0xbd,0x33,0x2e,0x5e,0x91,0x62,0x50,0x77,0x5e,0x4e,0x26,0x24,0x41,0x47,0x56,0x3a,0x6c,0x73,0x12,0x21,0x30,0x1e,0x00,0x01,0x00,0x56,0xff,0xe8,0x02,0xfd,0x04,0x18,0x00,0x2e,0x00,0x43,0xb7,0x0b,0x20,0x07,0x2a,0x04,0x02,0x1b,0x2e,0xb8, +0xff,0xc0,0x40,0x1b,0x0b,0x0e,0x48,0x2e,0x2e,0x2c,0x95,0x02,0x16,0x18,0x18,0x16,0x95,0x1b,0x10,0x11,0x83,0x20,0x20,0x18,0x00,0x00,0x30,0x18,0x2a,0x83,0x07,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x2f,0x2b,0x11,0x12,0x17,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35, +0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x33,0x32,0x37,0x02,0xfd,0x74,0x9e,0x4f,0x93,0x70,0x43,0x29,0x4c,0x6d,0x43,0x33,0x50,0x38,0x1d,0x1d,0x35,0x4a,0x2e,0x93,0x71,0x69,0x85,0x4b,0x8d,0x6e,0x42,0x23,0x45,0x67,0x44,0x31, +0x55,0x3f,0x25,0xd8,0xa2,0x85,0x25,0x3d,0x24,0x4a,0x70,0x4c,0x3e,0x5a,0x45,0x37,0x1a,0x14,0x22,0x2a,0x36,0x28,0x20,0x35,0x26,0x15,0x4a,0xa6,0x2e,0x26,0x4b,0x6f,0x48,0x3b,0x58,0x45,0x37,0x1b,0x13,0x23,0x2c,0x39,0x29,0x90,0x63,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x03,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x38,0x40,0x1b,0x03,0x09, +0x09,0x05,0x02,0x0a,0x91,0x01,0x12,0x04,0x08,0x91,0x05,0x03,0x08,0x04,0x0a,0x03,0x09,0x09,0x02,0x07,0x00,0x00,0x0d,0x04,0x02,0x2f,0xc6,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x33,0x32,0x11,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x12,0x39,0x19,0x2f,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21, +0x03,0xf0,0xfc,0x3d,0x01,0xd3,0xfe,0x58,0x03,0x5a,0xfd,0x9c,0x01,0x78,0xfe,0x5f,0x02,0xcb,0x4e,0x02,0x96,0x02,0x5c,0x5a,0x9a,0xfd,0xe8,0xfd,0xac,0x00,0x00,0x02,0xff,0x83,0xfe,0x1e,0x02,0x87,0x06,0x02,0x00,0x15,0x00,0x20,0x00,0x39,0x40,0x1f,0x15,0x13,0x95,0x02,0x1c,0x1f,0x95,0x40,0x07,0xc0,0x19,0x95,0x40,0x0d,0x01,0x15, +0x04,0x16,0x04,0x1c,0x84,0x0a,0x11,0x84,0x04,0x21,0x22,0x04,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xd4,0xe1,0x11,0x33,0x10,0xc4,0x00,0x3f,0x1a,0xed,0x1a,0xdc,0x1a,0xed,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x37,0x01,0x35,0x34, +0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x87,0x39,0x5c,0xfe,0xfc,0x39,0x43,0x65,0x8a,0x90,0x6c,0x80,0x91,0x91,0x38,0x2e,0xfe,0x67,0x71,0x2a,0x39,0x3e,0x31,0x35,0xfe,0x3e,0x20,0x01,0x34,0x04,0xe6,0x1c,0x87,0x67,0x68,0x90,0xab,0x95,0xfa,0xac,0xc4,0x21,0x05,0xf7,0x0d,0xa8,0x3c,0x2b,0x2c,0x3c,0x00,0x00,0x01,0x00,0x2b, +0xfe,0x96,0x02,0x81,0x05,0x2f,0x00,0x1e,0x00,0x3e,0x40,0x22,0x06,0x08,0x95,0x03,0x1e,0x1c,0x95,0x0b,0x16,0x18,0x15,0x0e,0x95,0x14,0x11,0x0f,0x0b,0x40,0x13,0x16,0x48,0x0b,0x84,0x1e,0x17,0x17,0x18,0x06,0x15,0x11,0x18,0x84,0x0f,0x0e,0x2f,0xcd,0xe1,0x39,0x39,0xc4,0x10,0xc1,0x2f,0xd4,0xe1,0x2b,0x00,0x3f,0xcd,0xed,0x39,0x39, +0x3f,0xfd,0xc6,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x36,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x99,0x7e,0x3c,0x34,0x34,0x3c,0x7e,0xfe,0xf3,0xb0,0xb0,0x4d,0x57,0x01,0x02,0xfe,0xfe,0x45,0x52,0x3c,0x2f,0x44,0x87, +0x9f,0x18,0x92,0x1f,0x9f,0x28,0x01,0x2c,0x02,0x60,0x8c,0xfa,0x18,0x1d,0xfe,0xd1,0x8c,0xfd,0xbd,0x67,0x58,0x22,0x00,0x01,0xff,0xcd,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x11,0x00,0x2d,0x40,0x18,0x03,0x12,0x0a,0x04,0x01,0x91,0x40,0x11,0x03,0x08,0x7e,0x0d,0x0d,0x02,0x00,0x02,0x7e,0x03,0x12,0x13,0x03,0x7e,0x08,0x30,0x2b,0x01, +0x10,0xe1,0x18,0xc4,0x10,0xc0,0x2f,0xe1,0x00,0x3f,0x1a,0xed,0x32,0xc4,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x04,0x0c,0xfe,0x62,0xa8,0x9b,0x5a,0x65,0x15,0x9d,0x17,0xc2,0xa2,0x02,0xdb,0x05,0x02,0xfa,0xfe,0x05,0x02,0x5c,0x4e,0x37,0x33,0x38,0x42,0x85,0xad, +0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x02,0x00,0x1d,0x00,0x32,0x40,0x1a,0x1d,0x1b,0x95,0x02,0x16,0x0f,0x11,0x95,0x0c,0x01,0x17,0x14,0x05,0x95,0x08,0x0f,0x1d,0x0f,0x16,0x16,0x14,0x08,0x17,0x84,0x06,0x05,0x2f,0xcd,0xf1,0x39,0x39,0xc1,0x2f,0xc4,0xc4,0x00,0x3f,0xed,0x39,0x39,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30, +0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0x98,0x83,0x4a,0x41,0x3d,0x40,0x85,0x01,0x02,0xfe,0xfe,0x45,0x52,0x3c,0x2f,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xc0,0x93,0xaf,0x1c, +0x92,0x23,0xbf,0xb8,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x01,0x00,0x27,0xfe,0x96,0x04,0x0c,0x05,0x9a,0x00,0x0f,0x00,0x32,0x40,0x1a,0x06,0x04,0x91,0x09,0x01,0x0c,0x91,0x40,0x0e,0x03,0x06,0x06,0x02,0x00,0x0b,0x0d,0x0d,0x02,0x7e,0x0b,0x10,0x11,0x0b,0x7e,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc0,0x18,0x2f,0x10,0xc4,0x11,0x39,0x2f, +0x00,0x3f,0x1a,0xed,0x32,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x21,0x11,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xaa,0x46,0x34,0x3a,0x4e,0xfe,0xbc,0xfe,0x61,0x03,0xe5,0x05,0x02,0xfb,0x33,0xfe,0xf8,0x17,0x94,0x1a,0x01,0x95,0x04,0xd7,0x98,0x00,0x00,0x01,0x00,0x62,0xff,0xe8,0x05,0xa8, +0x05,0x9a,0x00,0x1b,0x00,0x42,0x40,0x24,0x09,0x91,0x17,0x13,0x04,0x0e,0x10,0x11,0x04,0x01,0x91,0x02,0x03,0x12,0x7d,0x0e,0x0e,0x0c,0x06,0x00,0x7e,0x04,0x04,0x0c,0x06,0x11,0x11,0x14,0x7d,0x0c,0x0c,0x1d,0x01,0x06,0x7d,0x1a,0x2f,0xe1,0x33,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00, +0x3f,0xed,0x17,0x39,0x3f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x15,0x04,0x11,0x14,0x00,0x33,0x32,0x00,0x35,0x10,0x01,0x35,0x21,0x15,0x21,0x04,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x01,0xbe,0xfe,0xa4,0x02,0x06,0xfe,0xa8,0x01,0x15,0xdd,0xe0,0x01,0x18,0xfe,0xa6,0x02,0x06,0xfe,0xa6,0x01,0x5c,0xfe,0x8e,0xfe,0xd0,0xfe,0xcd, +0xfe,0x8f,0x05,0x06,0x94,0x94,0xfe,0xfe,0x86,0xf7,0xfe,0xe6,0x01,0x1c,0xf5,0x01,0x78,0x01,0x00,0x94,0x94,0xec,0xfe,0x6f,0xfe,0xca,0xfe,0x95,0x01,0x66,0x01,0x39,0x01,0x93,0x00,0x01,0x00,0xb8,0xff,0xe8,0x05,0x54,0x05,0xb2,0x00,0x16,0x00,0x2a,0x40,0x16,0x04,0x91,0x14,0x13,0x00,0x03,0x0b,0x09,0x91,0x0e,0x04,0x0b,0x0b,0x01, +0x11,0x7d,0x07,0x07,0x18,0x01,0x7e,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xed,0x31,0x30,0x13,0x33,0x11,0x10,0x21,0x32,0x00,0x11,0x10,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x20,0x11,0xb8,0xa8,0x01,0x58,0xd9,0x01,0x17,0xfe,0xf8,0x48,0x40,0x4d,0x57,0xba,0xde, +0xfe,0x81,0xfe,0xdb,0xfe,0x08,0x05,0x9a,0xfc,0xac,0xfe,0x39,0x01,0x91,0x01,0x25,0x01,0xe5,0x1c,0x9a,0x1a,0xfe,0xad,0xfe,0xe3,0xfe,0x99,0xfe,0x0d,0x02,0x56,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x04,0xd6,0x05,0xb2,0x00,0x15,0x00,0x2b,0x40,0x16,0x00,0x15,0x14,0x03,0x14,0x0c,0x11,0x7e,0x14,0x03,0x14,0x11,0x03,0x13,0x15,0x03, +0x13,0x12,0x0e,0x91,0x09,0x03,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc6,0x12,0x39,0x10,0xcd,0x32,0x31,0x30,0x13,0x01,0x16,0x17,0x33,0x37,0x13,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x01,0x11,0x23,0x11,0x01,0xc1,0x01,0x50,0x1b,0x0c,0x02,0x23,0xc7,0x46,0x8e,0x6b,0x39,0x3a,0x2f,0x3a,0x5a,0x54, +0xfe,0xd1,0xa8,0xfe,0x27,0x05,0x9a,0xfd,0x78,0x33,0x25,0x58,0x01,0x9a,0x91,0x75,0x18,0x9c,0x1c,0xaa,0xfd,0x9e,0xfd,0xf2,0x02,0x12,0x03,0x88,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x04,0x60,0x04,0x18,0x00,0x1c,0x00,0x2f,0x40,0x19,0x14,0x05,0x0f,0x0a,0x0c,0x95,0x07,0x1c,0x10,0x0f,0x00,0x02,0x95,0x1a,0x10,0x0a,0x05,0x0a,0x0f,0x14, +0x04,0x10,0x00,0x1e,0x10,0x2f,0x10,0xc6,0x11,0x17,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xfd,0xc6,0x2f,0x33,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x12,0x33,0x32,0x17,0x04,0x60,0x2c,0x2c,0x66,0x42,0xfe,0x9e,0x7d,0xe5, +0x42,0x29,0x33,0x2e,0x7c,0x3e,0x52,0xfe,0x70,0xb6,0x01,0x15,0x0a,0x0b,0x06,0x05,0x0f,0xc0,0x6d,0xd1,0x29,0x31,0x03,0x79,0x13,0xa8,0xfc,0x78,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x1c,0x32,0x1a,0x34,0x02,0x06,0x01,0x26,0x10,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x11,0x00,0x5a,0x40,0x2e, +0x02,0x02,0x01,0x04,0x01,0x05,0x00,0x05,0x0b,0x0b,0x0a,0x0d,0x0a,0x09,0x0e,0x09,0x04,0x01,0x0a,0x91,0x40,0x0d,0x10,0x08,0x0d,0x91,0x14,0x30,0x09,0x05,0x91,0x08,0x12,0x00,0x0e,0x91,0x10,0x03,0x06,0x0e,0x00,0x00,0x13,0x05,0x0f,0x09,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x33,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2b,0x00,0x18, +0x2f,0x1a,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x10,0x87,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x31,0x30,0x01,0x01,0x33,0x15,0x21,0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x01,0x21,0x35,0x21,0x04,0x64,0xfe,0x71,0xfc,0xfe,0x9d,0xfe,0xae,0x03,0x34,0xfb,0xd1,0x01,0x99,0xe3,0x01,0x4a,0x01,0x41,0xfd,0x00, +0x04,0x02,0x05,0x72,0xfd,0xb3,0x97,0xfe,0x0a,0x98,0x2f,0x02,0x5f,0x97,0x01,0xdd,0x98,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x00,0x11,0x00,0x5a,0x40,0x2e,0x02,0x02,0x01,0x04,0x01,0x05,0x00,0x05,0x0b,0x0b,0x0a,0x0d,0x0a,0x09,0x0e,0x09,0x04,0x01,0x0a,0x95,0x40,0x0d,0x10,0x08,0x0d,0x95,0x14,0x30,0x09,0x05, +0x95,0x08,0x15,0x00,0x0e,0x95,0x10,0x0f,0x06,0x0e,0x00,0x00,0x13,0x05,0x0f,0x09,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x33,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x10,0x87,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x31,0x30,0x01,0x01,0x33,0x15,0x21,0x03, +0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0x70,0xfe,0xec,0xbc,0xfe,0xe0,0xe6,0x02,0x58,0xfc,0xb7,0x01,0x27,0xa8,0x01,0x0c,0xd3,0xfd,0xdb,0x03,0x16,0x03,0xd1,0xfe,0x83,0x8c,0xfe,0xc4,0x8c,0x33,0x01,0x95,0x8c,0x01,0x20,0x8c,0x00,0x00,0x01,0x00,0x0a,0xfe,0x1e,0x04,0x83,0x05,0x9a,0x00,0x18,0x00,0x44, +0x40,0x24,0x0b,0x0a,0x91,0x40,0x11,0x0e,0x17,0x11,0x91,0x09,0x30,0x01,0x03,0x91,0x17,0x1c,0x10,0x0c,0x91,0x0e,0x03,0x11,0x0b,0x0b,0x06,0x00,0x0c,0x10,0x10,0x14,0x7d,0x06,0x06,0x1a,0x0d,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a, +0xed,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x24,0x35,0x34,0x24,0x21,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x04,0x00,0x15,0x10,0x00,0x21,0x22,0x0a,0xe0,0xde,0xe9,0x01,0x22,0xfe,0xd1,0xfe,0xf6,0x5c,0x01,0xf5,0xfc,0xf4,0x04,0x02,0xfe,0x02,0x01,0x11,0x01,0x47,0xfe,0x6f,0xfe,0xd4,0xe8,0xfe,0x89,0xb5,0x88,0xef,0xbf,0xcc, +0xe2,0x4c,0x02,0xa4,0x98,0x4c,0xfd,0x52,0x17,0xfe,0xd0,0xef,0xff,0x00,0xfe,0xb4,0x00,0x01,0x00,0x5e,0xfe,0x1e,0x04,0xd7,0x05,0x9a,0x00,0x18,0x00,0x40,0x40,0x22,0x0e,0x0f,0x91,0x40,0x08,0x0a,0x02,0x08,0x91,0x09,0x30,0x18,0x16,0x91,0x02,0x1c,0x09,0x0d,0x91,0x0a,0x03,0x08,0x0e,0x0e,0x13,0x0c,0x18,0x18,0x1a,0x0d,0x09,0x13, +0x7d,0x05,0x2f,0xe1,0xc4,0x32,0x12,0x39,0x2f,0xc6,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x20,0x00,0x11,0x34,0x00,0x25,0x01,0x35,0x21,0x15,0x21,0x01,0x15,0x23,0x20,0x04,0x15,0x14,0x04,0x33,0x32,0x37,0x04,0xd7,0xd5,0xfc,0xfe,0xd5,0xfe,0x83,0x01, +0x4e,0x01,0x0a,0xfe,0x02,0x04,0x02,0xfc,0xf6,0x01,0xf4,0x5c,0xfe,0xf8,0xfe,0xce,0x01,0x22,0xe8,0xf0,0xcf,0xfe,0x89,0x6b,0x01,0x3e,0x01,0x02,0xeb,0x01,0x40,0x17,0x02,0xae,0x4c,0x98,0xfd,0x5c,0x4c,0xe5,0xc9,0xbf,0xef,0x7d,0x00,0x01,0x00,0x1e,0xfe,0x21,0x03,0xaa,0x04,0x00,0x00,0x18,0x00,0x3e,0x40,0x21,0x0e,0x0f,0x96,0x40, +0x08,0x0a,0x02,0x08,0x96,0x09,0x30,0x18,0x16,0x95,0x02,0x1c,0x09,0x0d,0x95,0x0a,0x0f,0x08,0x0e,0x0e,0x13,0x0c,0x18,0x1a,0x0d,0x09,0x13,0x83,0x05,0x2f,0xe1,0xc4,0x32,0x10,0xd6,0xc6,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36, +0x37,0x01,0x35,0x21,0x15,0x21,0x01,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0xaa,0x9a,0xca,0xf4,0xfe,0xcc,0xf7,0xcf,0xfe,0x76,0x03,0x2d,0xfd,0xc5,0x01,0x7a,0x54,0xc8,0xe4,0xda,0xaa,0xc4,0x9c,0xfe,0x72,0x51,0xf9,0xcc,0xb0,0xfb,0x1d,0x02,0x1f,0x33,0x8c,0xfd,0xec,0x33,0xab,0x96,0x8d,0xb3,0x62,0x00,0x00,0x01, +0x00,0x0a,0xfe,0x1e,0x03,0x08,0x04,0x00,0x00,0x22,0x00,0x58,0x40,0x30,0x19,0x0b,0x06,0x1f,0x04,0x03,0x10,0x0f,0x96,0x40,0x16,0x13,0x03,0x16,0x96,0x08,0x30,0x00,0x21,0x95,0x03,0x1c,0x15,0x11,0x95,0x13,0x0f,0x16,0x11,0x15,0x10,0x10,0x0b,0x06,0x15,0x15,0x19,0x00,0x00,0x19,0x84,0x0b,0x0b,0x24,0x12,0x1f,0x83,0x06,0x2f,0xe1, +0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x12,0x17,0x39,0x31,0x30,0x05,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x06, +0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x02,0x9e,0x89,0xb9,0xa0,0xb2,0x01,0x38,0xa4,0x7e,0x9e,0x8e,0x52,0x01,0x1a,0xfe,0x0a,0x02,0xd8,0xfe,0xda,0x9e,0xae,0xa6,0xc4,0x93,0x59,0xb8,0xaa,0xfc,0x9e,0x48,0x7d,0x6f,0xc5,0x66,0x36,0x6d,0x59,0x5a,0x67,0x3d,0x01,0x45,0x8c,0x46,0xfe,0xae,0x12,0xa2,0x81,0x7e,0xaf,0x44,0x32,0x45,0x35, +0x6c,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0xc2,0x05,0xb2,0x00,0x1b,0x00,0x6e,0x40,0x38,0x1a,0x01,0x02,0x18,0x02,0x0a,0x07,0x06,0x0d,0x06,0x01,0x1a,0x07,0x99,0x0a,0x0a,0x02,0x10,0x18,0x0d,0x15,0x06,0x02,0x99,0x05,0x18,0x12,0x10,0x9a,0x15,0x07,0x08,0x08,0x12,0x07,0x1a,0x01,0x18,0x02,0x0a,0x07,0x0d,0x06,0x00,0x00,0x18, +0x04,0x04,0x18,0x8a,0x0d,0x0d,0x1d,0x12,0x02,0x06,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x10,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x32,0x12,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x01,0x21, +0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x33,0x03,0xc2,0xfe,0xde,0xfe,0x85,0x02,0x9b,0xfc,0xa0,0x01,0x7f,0xfd,0x01,0x84,0x69,0x52,0x90,0x81,0xbe,0xb2,0xa2,0xe5,0xc0,0xdb,0x9f,0x9f,0x02,0x2b,0xfe,0x69,0x94,0x92,0x01,0x99,0x93,0x77,0x9d, +0x55,0x78,0x88,0xa4,0xac,0x83,0xcf,0xb0,0xaf,0xc6,0x00,0x01,0x00,0x74,0xff,0xe8,0x03,0xc8,0x05,0x9a,0x00,0x1d,0x00,0x42,0x40,0x24,0x0d,0x14,0x09,0x9a,0x40,0x16,0x10,0x1c,0x16,0x9a,0x08,0x30,0x01,0x03,0x95,0x1c,0x16,0x13,0x0e,0x99,0x10,0x06,0x11,0x11,0x19,0x89,0x06,0x06,0x1f,0x0e,0x13,0x14,0x03,0x0d,0x0f,0x00,0x2f,0xc6, +0xc4,0x17,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x23,0x13,0x23,0x35,0x21,0x15,0x21,0x03,0x36,0x33,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0xa4,0x93,0x98,0x99,0xb9,0xbe,0xb1,0x32, +0x4d,0x5f,0x07,0x45,0x9e,0x03,0x13,0xfe,0x25,0x33,0x41,0x2c,0xe7,0xfb,0xfe,0xf1,0xec,0xbd,0x23,0xae,0x5f,0xad,0x8d,0x8e,0x9d,0x05,0x07,0x02,0x3b,0x94,0x94,0xfe,0x5c,0x04,0xe6,0xca,0xd0,0xfe,0x00,0x01,0x00,0x48,0xff,0xe8,0x02,0xcd,0x04,0x00,0x00,0x1b,0x00,0x42,0x40,0x24,0x0b,0x12,0x09,0x95,0x40,0x14,0x0e,0x1a,0x14,0x95, +0x08,0x30,0x01,0x03,0x95,0x1a,0x16,0x11,0x0c,0x95,0x0e,0x0f,0x10,0x10,0x17,0x83,0x06,0x06,0x1d,0x0c,0x11,0x12,0x03,0x0b,0x0d,0x00,0x2f,0xc6,0xc4,0x17,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23, +0x22,0x07,0x13,0x23,0x35,0x21,0x15,0x21,0x07,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x5a,0x72,0x7a,0x64,0x7b,0x83,0x73,0x17,0xa6,0x3e,0x68,0x02,0x5c,0xfe,0xa2,0x28,0x32,0x14,0x9d,0xcc,0xd5,0xb2,0x9e,0x18,0xa6,0x4c,0x6c,0x57,0x54,0x65,0x08,0x01,0x8e,0x8c,0x8c,0xfd,0x02,0xa7,0x94,0x97,0xbf,0x00,0x00,0x01,0x00,0x1e, +0xff,0xe8,0x02,0xe4,0x05,0x2f,0x00,0x20,0x00,0x41,0x40,0x21,0x1c,0x05,0x1f,0x0f,0x01,0x03,0x95,0x1f,0x16,0x11,0x15,0x12,0x0c,0x95,0x0f,0x0f,0x14,0x14,0x15,0x1c,0x83,0x05,0x05,0x22,0x12,0x0f,0x15,0x84,0x0c,0x01,0x01,0x0d,0x0c,0x2f,0xcd,0x39,0x2f,0x10,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x39, +0x39,0xcd,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x35,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x70,0x76,0x95,0xc3,0x38,0x7d,0x92,0x5b,0x7e,0x7e,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x66,0x89,0x6f,0xc9, +0xad,0x96,0x25,0xb0,0x63,0x90,0x2e,0x4b,0x3f,0x4c,0x9b,0x6d,0x66,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0x62,0x4b,0x5e,0x31,0x44,0x8c,0x5e,0x7f,0xa3,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x16,0x04,0x18,0x00,0x0c,0x00,0x15,0x00,0x2c,0x40,0x17,0x02,0x1b,0x05,0x07,0x0e,0x95,0x00,0x03,0x0f,0x14,0x95,0x07,0x10,0x0a,0x83,0x11,0x11,0x17, +0x0e,0x05,0x01,0x84,0x02,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x12,0x39,0x3f,0x31,0x30,0x05,0x11,0x23,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x00,0x01,0x11,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x01,0x4a,0xa4,0xa4,0xac,0xc2,0x97,0xc7,0xfe,0x84,0xfe,0xb0,0xf2,0x01,0x32,0x70,0x5c,0x9e, +0x2d,0xfe,0x56,0x05,0xd7,0x81,0x99,0xc4,0x92,0xdf,0xfe,0x72,0x02,0x80,0xfd,0x9b,0x61,0x01,0x34,0xad,0x5d,0x7a,0x00,0x01,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x0f,0xb6,0x03,0xfa,0x00,0x1c,0x00,0xca,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0xfe,0x1e,0x08,0x00,0x00, +0x00,0x02,0x00,0xac,0xfe,0x1e,0x02,0x66,0x06,0x1e,0x00,0x03,0x00,0x07,0x00,0x25,0x40,0x12,0x02,0x01,0x06,0x05,0x1c,0x06,0xfa,0x00,0xca,0x01,0x01,0x09,0x04,0xca,0x00,0x05,0x01,0x05,0x2f,0x5d,0xe1,0x12,0x39,0x7c,0x2f,0xe1,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0x02,0x66,0x93, +0x93,0xfe,0xda,0x94,0x94,0xfe,0x1e,0x08,0x00,0xf8,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x33,0xfe,0x1e,0x03,0x72,0x06,0x1e,0x00,0x13,0x00,0x4f,0x40,0x2c,0x12,0x01,0x04,0x95,0x07,0x11,0x0e,0x0b,0x95,0x08,0x40,0x0c,0x03,0x08,0x07,0x08,0x3a,0x03,0x1c,0x0c,0xfa,0x10,0x09,0x00,0x05,0x08,0x0b,0x0e,0x11,0x04,0x02,0x00,0x03,0x05, +0x05,0x02,0xca,0x03,0x14,0x15,0x03,0xca,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc0,0x18,0x2f,0x10,0xc4,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x39,0x39,0x10,0xed,0x39,0x39,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x03, +0x72,0xfe,0xaa,0x93,0xfe,0xaa,0x01,0x56,0xfe,0xaa,0x01,0x56,0x93,0x01,0x56,0xfe,0xaa,0x01,0x56,0x01,0x46,0xfc,0xd8,0x03,0x28,0x8b,0x01,0x17,0x8a,0x02,0xac,0xfd,0x54,0x8a,0xfe,0xe9,0xff,0xff,0x00,0xb4,0xff,0xee,0x01,0x92,0x05,0x9a,0x02,0x06,0x00,0x04,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x09,0xbc,0x07,0x62,0x00,0x26, +0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x3d,0x05,0x58,0x00,0x00,0x01,0x07,0x00,0xe0,0x06,0x43,0x01,0x56,0x00,0x13,0x40,0x0b,0x03,0x05,0x1f,0x1f,0x18,0x19,0x25,0x03,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x08,0xef,0x06,0x0c,0x00,0x26,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x5d,0x05,0x7f, +0x00,0x00,0x01,0x07,0x00,0xe0,0x05,0xf5,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x0e,0x1f,0x1f,0x18,0x19,0x25,0x03,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x08,0x05,0x06,0x0c,0x00,0x26,0x00,0x47,0x00,0x00,0x00,0x27,0x00,0x5d,0x04,0x95,0x00,0x00,0x01,0x07,0x00,0xe0,0x05,0x0c,0x00,0x00, +0x00,0x13,0x40,0x0b,0x03,0x0e,0x2d,0x2d,0x26,0x27,0x25,0x03,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0xe8,0x06,0x29,0x05,0x9a,0x00,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x2d,0x03,0xfe,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x02,0xed,0xb4,0x0c,0x12,0x02,0x05,0x25,0x01,0x2b,0x35,0xff,0xff, +0x00,0xbc,0xfe,0x1e,0x05,0x39,0x05,0xd9,0x00,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x4d,0x03,0xd3,0x00,0x00,0x00,0x10,0xb1,0x02,0x01,0xb8,0x01,0xf3,0xb4,0x18,0x0f,0x02,0x05,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xa6,0xfe,0x1e,0x03,0x77,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x4d,0x02,0x11,0x00,0x00, +0xff,0xff,0x00,0xbc,0xff,0xe8,0x07,0xe4,0x05,0x9a,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x2d,0x05,0xb9,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x03,0xda,0xb4,0x1a,0x20,0x0a,0x13,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x1e,0x07,0x34,0x05,0xd9,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x4d,0x05,0xce,0x00,0x00, +0x00,0x10,0xb1,0x02,0x01,0xb8,0x03,0x20,0xb4,0x26,0x1d,0x0a,0x13,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xa6,0xfe,0x1e,0x05,0xed,0x05,0xd9,0x00,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x4d,0x04,0x87,0x00,0x00,0x00,0x10,0xb1,0x02,0x01,0xb8,0x02,0x88,0xb4,0x25,0x1c,0x0a,0x12,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16, +0x00,0x00,0x05,0x12,0x07,0x62,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x12,0x01,0x56,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x13,0x10,0x05,0x00,0x25,0x02,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x0c,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x00,0xe0, +0x7f,0x00,0x00,0x13,0x40,0x0b,0x02,0x18,0x23,0x20,0x08,0x14,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf7,0x00,0x00,0x02,0x29,0x07,0x62,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x91,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x04,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00, +0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdf,0x00,0x00,0x02,0x11,0x06,0x0c,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x79,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x04,0x02,0x03,0x25,0x01,0x06,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x62,0x02,0x26, +0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x85,0x01,0x56,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x18,0x03,0x09,0x25,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0c,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xd9,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00, +0x1b,0x18,0x03,0x09,0x25,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x62,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x41,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x11,0x0e,0x05,0x0d,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff, +0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0c,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0a,0x15,0x12,0x08,0x11,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x51, +0x00,0x69,0x01,0x60,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x00,0x21,0x1b,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x3a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x60,0xe9,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x07, +0x25,0x1f,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x42,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x54,0x00,0x80,0x01,0x60,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x0a,0x21,0x0e,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05, +0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xe2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x05,0x54,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x10,0x25,0x12,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00, +0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x5a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x53,0x00,0x80,0x01,0x60,0x00,0x1f,0x40,0x12,0x03,0x02,0x01,0x00,0x24,0x1e,0x05,0x0d,0x25,0x03,0x02,0x01,0x30,0x21,0x01,0x21,0x05,0x26,0x00,0x2b,0x71,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8, +0x03,0xe2,0x06,0xfa,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x61,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x07,0x28,0x22,0x08,0x11,0x25,0x03,0x02,0x01,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x42,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07, +0x06,0x62,0x00,0x6d,0x01,0x60,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0b,0x10,0x1b,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xe2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x62,0xee,0x00,0x00,0x1b,0x40,0x0f, +0x03,0x02,0x01,0x00,0x14,0x1f,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0x48,0x40,0x21,0x06,0x40,0x0b,0x0e,0x48,0x06,0x06,0x04,0x13,0x95,0x40,0x01,0x09,0x0f,0x01,0x95,0x08,0x30,0x17,0x95, +0x0f,0x16,0x04,0x95,0x09,0x10,0x0c,0x83,0x01,0x13,0x13,0x1b,0x06,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x06,0x14,0x83,0x00,0x2f,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0xc5,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x2b,0x31,0x30,0x13,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14, +0x00,0x23,0x22,0x02,0x35,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x52,0x02,0xd3,0x05,0xae,0x9b,0xad,0x90,0x86,0xde,0xd9,0xf8,0xfe,0xf1,0xc8,0xcb,0xdb,0x02,0xd1,0xfd,0xd7,0x02,0x86,0x78,0x74,0xa2,0x02,0x29,0xab,0xba,0x72,0x9a,0x62,0xfe,0xe9,0xfd,0xf1,0xfe,0xd5,0x01,0x06,0xe5,0x35,0x8f,0x9d,0xa6,0xff,0xff,0x00,0x16,0x00,0x00, +0x05,0x12,0x07,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x05,0x51,0x00,0x33,0x01,0x60,0x00,0x1e,0xb2,0x04,0x03,0x02,0xb8,0xff,0xf6,0x40,0x0b,0x23,0x1d,0x05,0x00,0x25,0x04,0x03,0x02,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x3a,0x00,0x26,0x00,0x44, +0xf8,0x00,0x01,0x06,0x06,0x60,0xa3,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x14,0x33,0x2d,0x08,0x14,0x25,0x04,0x03,0x02,0x30,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x05,0x52,0x00,0x90,0x01,0x65,0x00,0x17, +0x40,0x0d,0x03,0x02,0x00,0x12,0x13,0x05,0x00,0x25,0x03,0x02,0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x35,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x06,0x63,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x20,0x22,0x23,0x08,0x14,0x25,0x03,0x02,0x24,0x11,0x26,0x00, +0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x06,0x8c,0x02,0x26,0x00,0x91,0x00,0x00,0x01,0x07,0x00,0xd9,0x03,0x5a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0x01,0x50,0x40,0x09,0x16,0x17,0x05,0x0f,0x25,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x06,0x4e, +0x05,0x2f,0x00,0x26,0x00,0xa0,0xf8,0x00,0x01,0x07,0x00,0xd9,0x02,0x1a,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x06,0x38,0x39,0x11,0x23,0x25,0x03,0x37,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x7d,0x05,0xb2,0x00,0x21,0x00,0x61,0x40,0x37,0x01,0x20,0x18,0x92,0x0f,0x1b,0x1f,0x1b,0x2f,0x1b, +0x03,0x1b,0x1b,0x17,0x1c,0x91,0x1e,0x1e,0x0a,0x02,0x17,0x15,0x91,0x04,0x13,0x1f,0x0d,0x2f,0x0d,0x02,0x0d,0x0f,0x91,0x0a,0x04,0x00,0x00,0x1f,0x1a,0x1d,0x1d,0x1c,0x12,0x0d,0x0d,0x01,0x18,0x1f,0x7e,0x1c,0x1c,0x23,0x12,0x7d,0x07,0x2f,0xe9,0x12,0x39,0x2f,0xf9,0x39,0x39,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xc6,0x10,0xc0,0x2f,0x00, +0x3f,0xfd,0xc6,0x5d,0x3f,0xed,0x32,0x32,0x11,0x39,0x2f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x15,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x05,0x7d,0x91,0xd8,0xfe,0xf8,0xfe,0xcd,0xfe, +0x85,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc8,0x01,0x38,0xfe,0xc6,0x01,0xe2,0x91,0x01,0x31,0xcf,0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xf0,0xfe,0xc9,0x43,0x6f,0x8b,0x98,0x98,0xfe,0xd0,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0xb6, +0x04,0x18,0x00,0x22,0x00,0x2f,0x00,0x77,0x40,0x12,0x22,0x00,0x0f,0x0b,0x01,0x17,0x03,0x0b,0x95,0x40,0x0c,0x13,0x08,0x0c,0x95,0x08,0x30,0x06,0xb8,0xff,0xc0,0x40,0x2d,0x0b,0x0f,0x48,0x06,0x06,0x08,0x95,0x03,0x1c,0x1c,0x10,0x19,0x2d,0x95,0x13,0x1e,0x0f,0x27,0x95,0x19,0x10,0x21,0x01,0x1f,0x0d,0x0a,0x0f,0x06,0x22,0x22,0x1f, +0x0c,0x0c,0x16,0x1f,0x84,0x23,0x1d,0x0f,0x0f,0x31,0x2a,0x83,0x06,0x16,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x12,0x39,0x2f,0x10,0xc2,0x2f,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x12,0x39,0x39,0x3f,0xed,0x32,0x2f,0x2b,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x5f,0x5e,0x5d,0x39,0x39,0x31,0x30,0x05, +0x23,0x02,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x21,0x35,0x21,0x36,0x35,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x14,0x07,0x33,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xb6,0xdb,0x77,0xfe,0x90,0xbe,0x8e,0xad,0x9d,0xda,0x5d,0xfe,0xb4,0x01,0x83,0x0c, +0x04,0x75,0xeb,0xbd,0xeb,0x01,0x00,0xd5,0xcf,0x64,0x04,0xa4,0x0c,0xb2,0xfe,0xb6,0xa5,0x7b,0x97,0xad,0xa7,0x86,0x8a,0xad,0xd1,0xfe,0xef,0x48,0xa4,0x60,0x85,0x8b,0x3d,0x45,0x99,0xc5,0x01,0x0c,0xd8,0xf5,0x01,0x2f,0xa6,0x8e,0xfc,0x52,0x50,0x48,0x02,0x3e,0x6e,0x7a,0xae,0xd6,0xba,0x9d,0xc5,0xc2,0xff,0xff,0x00,0x5e,0xff,0xe8, +0x04,0xec,0x07,0x62,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x5c,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x36,0x1d,0x1a,0x05,0x19,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0c,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc2,0x00,0x00, +0x00,0x13,0x40,0x0b,0x02,0x09,0x29,0x26,0x10,0x18,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x07,0x62,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xdd,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xad,0x40,0x09,0x14,0x11,0x08,0x00,0x25,0x01,0x13,0x05,0x26, +0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x62,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0x81,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xb1,0x40,0x09,0x10,0x0d,0x06,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x02,0x00,0x5e,0xfe,0x70,0x05,0xaa,0x05,0xb2, +0x00,0x19,0x00,0x25,0x00,0x50,0xb1,0x06,0x04,0xb8,0x01,0x05,0x40,0x0b,0x09,0x20,0x91,0x0e,0x00,0x13,0x1a,0x91,0x14,0x04,0x0e,0xb8,0x01,0x04,0xb5,0x00,0x00,0x02,0x06,0x06,0x02,0xb8,0x01,0x04,0x40,0x0f,0x0c,0x0c,0x19,0x0f,0x19,0x0f,0x11,0x17,0x7d,0x23,0x23,0x27,0x1d,0x7d,0x11,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39, +0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc2,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x33,0xed,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x48,0x80,0x44, +0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x83,0xfe,0xe5,0xfe,0xac,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0xb9,0xfe,0xa7,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x14,0x7e,0x4d,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x6f,0x75,0x11,0x01,0x8d,0x01,0x34,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xba,0xfe,0x6b,0x05,0x16, +0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x02,0x00,0x60,0xfe,0x70,0x04,0x50,0x04,0x18,0x00,0x19,0x00,0x25,0x00,0x4c,0xb1,0x06,0x04,0xb8,0x01,0x05,0x40,0x0b,0x09,0x20,0x95,0x00,0x0e,0x16,0x1a,0x95,0x14,0x10,0x0e,0xb8,0x01,0x04,0xb3,0x00,0x06,0x06,0x02,0xb8,0x01,0x04,0x40,0x0f, +0x0c,0x0c,0x19,0x0f,0x19,0x0f,0x11,0x17,0x83,0x23,0x23,0x27,0x1d,0x83,0x11,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0xd6,0xe1,0x00,0x3f,0xed,0x3f,0x33,0xed,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x02,0x35,0x10,0x00, +0x33,0x32,0x00,0x15,0x14,0x02,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xa2,0x81,0x43,0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x83,0xd0,0xf5,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xe6,0xfe,0xf4,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x14,0x80,0x4b,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x6f,0x75,0x0e,0x01,0x1c,0xe0,0x01,0x02, +0x01,0x22,0xfe,0xe6,0xfa,0xde,0xfe,0xdf,0x03,0x89,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0xff,0xff,0x00,0x5e,0xfe,0x70,0x05,0xaa,0x06,0x8c,0x02,0x26,0x05,0x14,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xd2,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x0a,0x28,0x29,0x11,0x17,0x25,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, +0xff,0xff,0x00,0x60,0xfe,0x70,0x04,0x50,0x05,0x2f,0x02,0x26,0x05,0x15,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x26,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x28,0x29,0x11,0x17,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0a,0xfe,0x1e,0x04,0x83,0x07,0x62,0x02,0x26,0x04,0xe1,0x00,0x00,0x01,0x07, +0x00,0xe0,0x00,0x8b,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xc4,0x40,0x09,0x1c,0x19,0x01,0x14,0x25,0x01,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xdd,0xfe,0x21,0x03,0x68,0x06,0x0c,0x00,0x26,0x05,0x97,0x00,0x00,0x01,0x06,0x00,0xe0,0xf8,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd5,0x40,0x09,0x1c,0x19,0x01, +0x14,0x25,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x02,0x10,0x06,0x0c,0x02,0x26,0x06,0xac,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x78,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0xb5,0x10,0x0d,0x06,0x0c,0x25,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00, +0x09,0xbc,0x05,0x9a,0x00,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0x3d,0x05,0x58,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04,0x9d,0xb4,0x15,0x19,0x01,0x04,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x08,0xf0,0x05,0x9a,0x00,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0x5d,0x05,0x80,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04, +0x4b,0xb4,0x15,0x19,0x01,0x04,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x08,0x06,0x05,0xec,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0x5d,0x04,0x96,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04,0x26,0xb4,0x23,0x27,0x08,0x10,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x68,0x02,0x26,0x00,0x2a, +0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x27,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0xcb,0x1c,0x1a,0x05,0x19,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0a,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x56,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x67,0x28,0x26, +0x10,0x18,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xff,0xe8,0x07,0x79,0x05,0x9a,0x00,0x17,0x00,0x43,0x40,0x25,0x08,0x91,0x40,0x0d,0x0b,0x0a,0x0d,0x91,0x2b,0x30,0x13,0x91,0x03,0x13,0x0a,0x12,0x17,0x0f,0x10,0x0b,0x03,0x0e,0x0d,0x09,0x10,0x7e,0x07,0x07,0x0a,0x17,0x7e,0x16,0x16,0x19, +0x09,0x7e,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x07,0x79,0xe8,0xcd,0xc9,0xda,0xfd,0x43,0xa8, +0xa8,0x02,0xbd,0xa7,0x01,0x05,0x01,0x04,0xa8,0x01,0xac,0xd6,0xee,0xe5,0xd3,0xee,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfc,0x14,0xfe,0xd1,0x01,0x29,0x02,0x58,0x00,0x02,0x00,0xbc,0xfe,0x29,0x05,0x27,0x05,0xb2,0x00,0x0c,0x00,0x15,0x00,0x2e,0x40,0x18,0x05,0x00,0x07,0x02,0x1b,0x0e,0x91,0x00,0x03,0x03,0x14,0x91,0x07,0x04, +0x0a,0x7d,0x11,0x11,0x17,0x0e,0x05,0x01,0x7e,0x02,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x3f,0x11,0x12,0x39,0x31,0x30,0x05,0x11,0x23,0x11,0x33,0x15,0x36,0x21,0x32,0x12,0x15,0x10,0x00,0x01,0x11,0x24,0x00,0x11,0x34,0x26,0x23,0x22,0x01,0x64,0xa8,0xa8,0xeb,0x01,0x1d,0xc2,0xf9,0xfe,0x03,0xfe, +0x3a,0x01,0x61,0x01,0xb2,0xa3,0x88,0xea,0x3a,0xfe,0x63,0x07,0x71,0xe2,0xfa,0xfe,0xf2,0xc7,0xfe,0xbf,0xfd,0xdb,0x03,0x7f,0xfc,0x78,0x91,0x01,0xc9,0x01,0x03,0x8e,0xbd,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x68,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x7d,0x01,0x5e,0x00,0x16,0xb9,0x00,0x01,0xff, +0x93,0x40,0x09,0x16,0x14,0x0a,0x13,0x25,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0a,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xcb,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x90,0x40,0x09,0x15,0x13,0x0a,0x12,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01, +0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x5e,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x1d,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8a,0x40,0x0a,0x16,0x10,0x05,0x00,0x25,0x03,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x00, +0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x07,0x04,0x6e,0x01,0xa1,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xbc,0x40,0x0a,0x26,0x20,0x08,0x14,0x25,0x03,0x02,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xf0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0x00, +0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x00,0x17,0x10,0x05,0x00,0x25,0x02,0x17,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x05,0xbc,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x04,0x2a,0xae,0x28,0x00,0x13,0x40,0x0b,0x02,0x20,0x26,0x20,0x08,0x14,0x25,0x02,0x26,0x11,0x26,0x00,0x2b,0x35, +0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x9e,0x00,0x00,0x03,0xb4,0x07,0x5e,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc1,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8a,0x40,0x0a,0x12,0x0c,0x02,0x0b,0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd, +0x06,0x00,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xbf,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xa2,0x40,0x0a,0x20,0x1a,0x0c,0x12,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x18,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x2a, +0xff,0xd3,0x01,0x84,0x00,0x16,0xb9,0x00,0x01,0xff,0xf3,0x40,0x09,0x12,0x0c,0x02,0x0b,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbc,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x04,0x2a,0xc0,0x28,0x00,0x16,0xb9,0x00,0x02,0xff,0xfa,0x40,0x09,0x20,0x1a,0x0c,0x12,0x25, +0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0x86,0x00,0x00,0x01,0xce,0x07,0x5e,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0xa9,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x0a,0x04,0x02,0x03,0x25,0x02,0x01,0x09,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff, +0xff,0x6e,0x00,0x00,0x01,0xb6,0x06,0x00,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0x91,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x0a,0x04,0x02,0x03,0x25,0x02,0x01,0x09,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xf8,0x00,0x00,0x02,0x28,0x07,0x18,0x02,0x26,0x00,0x2c, +0x00,0x00,0x01,0x07,0x04,0x2a,0xfe,0xb8,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xe6,0x00,0x00,0x02,0x0a,0x05,0xbe,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x04,0x70,0x00,0xf8,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x0b,0x04, +0x02,0x03,0x25,0x01,0x0b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x5e,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x91,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8e,0x40,0x0a,0x1e,0x18,0x03,0x09,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, +0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xe3,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8c,0x40,0x0a,0x1e,0x18,0x03,0x09,0x25,0x03,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x18, +0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0xac,0x01,0x84,0x00,0x13,0x40,0x0b,0x02,0x00,0x1e,0x18,0x03,0x09,0x25,0x02,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xbc,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x2a,0x00,0x28,0x00,0x13,0x40,0x0b,0x02,0x00, +0x1e,0x18,0x03,0x09,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa0,0x00,0x00,0x04,0xc0,0x07,0x5e,0x00,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc3,0x01,0x5e,0x00,0x0a,0xb4,0x03,0x02,0x2d,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x04,0x00,0x00,0x02,0xbc,0x06,0x00,0x02,0x26, +0x00,0x55,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0x27,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x77,0x40,0x0a,0x17,0x11,0x08,0x10,0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x07,0x18,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x04,0x2a,0xff,0xfe,0x01,0x84, +0x00,0x08,0xb3,0x02,0x2e,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x9a,0x00,0x00,0x02,0xca,0x05,0xbc,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x04,0x2a,0xff,0x5a,0x00,0x28,0x00,0x13,0x40,0x0b,0x01,0x00,0x17,0x11,0x08,0x10,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5, +0x07,0x5e,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x54,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x96,0x40,0x0a,0x14,0x0e,0x05,0x0d,0x25,0x02,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x04,0x6e, +0x01,0xd1,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x99,0x40,0x0a,0x18,0x12,0x08,0x11,0x25,0x02,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x18,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0x68,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x14,0x0e, +0x05,0x0d,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xbc,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x04,0x2a,0xeb,0x28,0x00,0x13,0x40,0x0b,0x01,0x0a,0x18,0x12,0x08,0x11,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x10,0xfe,0x21, +0x03,0xcb,0x05,0xb2,0x00,0x24,0x00,0x53,0x40,0x2d,0x1d,0x0c,0x0f,0x09,0x01,0x1f,0x03,0x09,0x0b,0x91,0x40,0x0c,0x17,0x23,0x0c,0x91,0x08,0x30,0x01,0x03,0x91,0x23,0x1b,0x14,0x12,0x91,0x17,0x04,0x1d,0x1a,0x0b,0x0b,0x06,0x01,0x0f,0x7d,0x1a,0x1a,0x20,0x7d,0x06,0x06,0x26,0x14,0x01,0x2f,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1, +0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xfd,0xc6,0x5f,0x5e,0x5d,0x12,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x20,0x00,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x37,0x24,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x04,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x10,0x00,0x21,0x22, +0x10,0x4c,0x66,0x01,0x00,0x01,0x58,0xe4,0xb7,0x5a,0x73,0x71,0x01,0xae,0xc2,0xa7,0xac,0xa2,0x9a,0xbe,0xf6,0x01,0x15,0xfe,0xd7,0xad,0xca,0xfe,0x47,0xfe,0xb4,0x67,0xfe,0x2f,0x9c,0x13,0x01,0x11,0xcf,0xa0,0xca,0x20,0x97,0x19,0x5f,0x01,0x09,0x83,0x9d,0x5a,0xa4,0x4e,0xec,0xc2,0xfe,0xe7,0x72,0x09,0x29,0xf9,0xb0,0xfe,0xf8,0xfe, +0x8b,0x00,0x00,0x01,0x00,0x1e,0xfe,0x21,0x03,0x3e,0x04,0x18,0x00,0x25,0x00,0x51,0x40,0x2d,0x1e,0x0c,0x09,0x40,0x1f,0x22,0x48,0x09,0x0b,0x95,0x40,0x0c,0x18,0x24,0x0c,0x95,0x08,0x30,0x01,0x03,0x95,0x24,0x1c,0x15,0x13,0x95,0x18,0x10,0x1e,0x1b,0x0b,0x0b,0x06,0x01,0x10,0x84,0x1b,0x1b,0x21,0x83,0x06,0x06,0x27,0x01,0x15,0x2f, +0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xfd,0xc6,0x2b,0x12,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x24,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15, +0x16,0x16,0x15,0x14,0x00,0x21,0x22,0x2f,0x42,0x55,0xcb,0x01,0x05,0xa4,0x8c,0x58,0x5e,0x60,0x9e,0xb0,0x93,0x89,0x96,0x8e,0x86,0xb0,0xc7,0xe7,0xe8,0x84,0xa0,0xfe,0xa4,0xfe,0xeb,0x61,0xfe,0x2d,0x91,0x12,0xc8,0x9e,0x7d,0x9a,0x1d,0x8c,0x12,0x1e,0x92,0x62,0x62,0x70,0x52,0x97,0x45,0xbd,0x97,0xc7,0x6d,0x07,0x1e,0xc7,0x8c,0xd9, +0xfe,0xe2,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x07,0x62,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x58,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x0c,0x06,0x0b,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x62,0x02,0x26,0x00,0x4b,0x00,0x00, +0x01,0x07,0x00,0xe0,0x00,0x81,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xb1,0x40,0x09,0x15,0x12,0x0a,0x11,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0xbc,0xfe,0x29,0x05,0x27,0x05,0xb2,0x00,0x12,0x00,0x2a,0x40,0x16,0x0c,0x09,0x0f,0x01,0x1b,0x09,0x12,0x0a,0x03,0x04,0x91,0x0f,0x04,0x00,0x7e,0x01, +0x01,0x14,0x0c,0x08,0x7e,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x11,0x10,0x21,0x22,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x12,0x21,0x32,0x12,0x11,0x05,0x27,0xa8,0xfe,0x9f,0xc0,0xfa,0xa8,0xa8,0x06,0x9e,0x01,0x3e,0xe9,0xf8,0xfe,0x29,0x05,0x0c,0x01,0xe5, +0xfe,0xe6,0xd5,0xfc,0xd5,0x05,0x9a,0xfe,0xfa,0x01,0x1e,0xfe,0xcd,0xfe,0xe3,0x00,0x00,0x02,0x00,0x3e,0xff,0xe8,0x04,0x81,0x05,0x9a,0x00,0x1e,0x00,0x2a,0x00,0x62,0x40,0x36,0x14,0x00,0x1f,0x91,0x40,0x0a,0x04,0x1a,0x0a,0x91,0x08,0x30,0x25,0x91,0x1a,0x13,0x10,0x04,0x03,0x14,0x00,0x12,0x02,0x10,0x7d,0x0f,0x0f,0x0d,0x7e,0x12, +0x12,0x17,0x28,0x04,0x7d,0x8f,0x05,0x01,0x05,0x05,0x07,0x7e,0x02,0x02,0x22,0x1d,0x17,0x7d,0x28,0x28,0x2c,0x22,0x7d,0x1d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x5d,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0xe1,0x11,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39, +0x31,0x30,0x01,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x56,0xcd,0x37,0xac,0x3b,0xa4,0x89,0x8a,0xa6,0x3e,0xae,0x37,0xd1,0x86,0x97,0xfe,0xc8,0xef, +0xf2,0xfe,0xd6,0x02,0x20,0x9e,0xd2,0xd8,0x98,0x9f,0xd4,0xda,0x03,0x60,0x6a,0xde,0x78,0x7a,0x70,0x7a,0x74,0x96,0x96,0x74,0x76,0x74,0x7c,0x76,0xce,0x7a,0x34,0xd6,0x8b,0xd7,0xfe,0xf4,0x01,0x01,0xd9,0x01,0x1e,0x2a,0xaf,0x95,0x95,0xb2,0xb1,0x96,0x95,0xaf,0x00,0x02,0x00,0x48,0xff,0xe8,0x04,0x42,0x05,0xec,0x00,0x1e,0x00,0x2a, +0x00,0x54,0x40,0x2f,0x15,0x00,0x1f,0x95,0x40,0x0b,0x05,0x1a,0x0b,0x95,0x08,0x30,0x25,0x95,0x1a,0x16,0x11,0x05,0x00,0x11,0x84,0x10,0x10,0x01,0x10,0x10,0x0e,0x84,0x13,0x13,0x17,0x83,0x28,0x28,0x2c,0x1d,0x05,0x84,0x06,0x06,0x08,0x84,0x03,0x03,0x22,0x83,0x1d,0x2f,0xe1,0x39,0x2f,0xf1,0xc2,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1, +0x39,0x2f,0xf1,0xc2,0x2f,0x71,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x04,0x11,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34, +0x26,0x01,0x52,0x5f,0x6e,0x2b,0xa0,0x27,0x98,0x85,0x85,0x95,0x26,0x9f,0x2b,0xcc,0x01,0x0a,0xfe,0xd7,0xdb,0xdf,0xfe,0xe9,0x01,0xfe,0x92,0xc4,0xc8,0x8c,0x91,0xc5,0xc8,0x03,0x74,0x30,0xc6,0x7c,0x80,0x86,0x78,0x84,0x8e,0xae,0xaf,0x8d,0x84,0x78,0x86,0x80,0xf5,0x7d,0x7e,0xfe,0xdb,0xd7,0xfe,0xee,0x01,0x0b,0xda,0x01,0x26,0x36, +0xbd,0x9d,0x9c,0xc1,0xc0,0x9d,0x99,0xc1,0x00,0x01,0x00,0x21,0xff,0x0c,0x04,0x7b,0x05,0x9a,0x00,0x11,0x00,0x30,0x40,0x18,0x01,0x07,0x0d,0x91,0x06,0x12,0x0c,0x08,0x91,0x0a,0x03,0x08,0x0c,0x10,0x01,0x01,0x03,0x7e,0x10,0x10,0x13,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc4,0x32,0x00,0x3f,0xed,0x39, +0x3f,0xed,0x39,0x2f,0x31,0x30,0x05,0x23,0x36,0x35,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x04,0x5a,0xa4,0x27,0x91,0xfc,0xd5,0x03,0x41,0xfd,0x02,0x04,0x00,0xfc,0xb8,0x02,0x3c,0x01,0x23,0xf4,0x46,0x3c,0x72,0x2f,0x04,0xd3,0x98,0x28,0xfb,0x26,0xfc,0x47,0x00,0x01,0x00,0x21,0xff,0x1e,0x03,0x9e, +0x04,0x00,0x00,0x11,0x00,0x33,0x40,0x1b,0x01,0x07,0x0d,0x95,0x06,0x15,0x0c,0x08,0x95,0x0a,0x0f,0x08,0x0c,0x10,0x01,0xa0,0x03,0xb0,0x03,0x02,0x03,0x10,0x10,0x13,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xdd,0x5d,0xc6,0x10,0xc4,0x32,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2f,0x31,0x30,0x05,0x23,0x36,0x35,0x34,0x23,0x21, +0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x03,0x7f,0x95,0x22,0x85,0xfd,0x9a,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x01,0x80,0x01,0x0c,0xe2,0x40,0x38,0x6a,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0xe8,0x41,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xea,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xdb, +0x01,0xc7,0x01,0x65,0x00,0x13,0x40,0x0b,0x02,0x00,0x13,0x19,0x05,0x00,0x25,0x02,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x05,0x85,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x07,0x00,0xdb,0x01,0x38,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x20,0x23,0x29,0x08,0x14,0x25,0x02,0x20,0x11, +0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xa3,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x05,0x51,0x00,0xb0,0x01,0x69,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x03,0x2b,0x25,0x03,0x09,0x25,0x04,0x03,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff, +0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x3a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x60,0x00,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x00,0x2b,0x25,0x03,0x09,0x25,0x04,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xb7,0x02,0x26,0x00,0x32, +0x00,0x00,0x01,0x07,0x05,0x55,0x00,0xaa,0x01,0x62,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x22,0x18,0x03,0x09,0x25,0x03,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x55,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x64,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02, +0x0b,0x22,0x18,0x03,0x09,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xea,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x36,0x01,0x65,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x21,0x03,0x09,0x25,0x02,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b, +0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x85,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8a,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x21,0x03,0x09,0x25,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x9a,0x02,0x26,0x00,0x32,0x00,0x00, +0x01,0x07,0x05,0x52,0x00,0xfe,0x01,0x65,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1a,0x1b,0x03,0x09,0x25,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x35,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x63,0x52,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1a, +0x1b,0x03,0x09,0x25,0x03,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0x8c,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfb,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, +0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x2f,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xb4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x17,0x18,0x0c,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x03,0x01,0x33,0x04,0xc2,0x03,0x7b,0x06,0x3a,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x32, +0xb2,0x02,0xe2,0x01,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x01,0x04,0x0a,0x16,0xc1,0x10,0x00,0x01,0x00,0x01,0x13,0x0d,0xc0,0x07,0x13,0xc0,0x07,0x19,0x2f,0xc6,0xe1,0x10,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xfd,0x39,0x39,0xde,0x2b,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x56,0xfe,0x04,0x01,0xfc,0x3e,0x28,0x3a,0x39,0x27,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x05,0xcd,0x6d,0xfe,0x88,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x02,0x01,0x08,0x04,0xc2, +0x03,0x04,0x06,0x35,0x00,0x03,0x00,0x0f,0x00,0x25,0xb2,0x02,0xe2,0x01,0xb8,0xff,0xc0,0x40,0x0e,0x09,0x0c,0x48,0x01,0x0a,0xc1,0x04,0x01,0x01,0x0d,0x00,0x0d,0xc0,0x07,0x2f,0xe1,0xc4,0x10,0xc0,0x2f,0x00,0x2f,0xfd,0xde,0x2b,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03, +0x04,0xfe,0x04,0x01,0xfc,0xfe,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x05,0xc8,0x6d,0xfe,0x8d,0x39,0x2a,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x64,0x06,0xfa,0x00,0x06,0x00,0x12,0x00,0x1e,0x00,0x37,0xb4,0x05,0x00,0x03,0x80,0x01,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x01,0x07,0x0d,0x19,0xc1,0x13, +0x00,0x03,0x00,0x03,0x16,0x10,0xc0,0x0a,0x16,0xc0,0x0a,0x1c,0x2f,0xc6,0xe1,0x10,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xfd,0x39,0x39,0xd6,0x2b,0x1a,0xcd,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x03,0x5a,0xd5,0x85,0xd7,0x73,0xa4,0xa4,0x1e,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xfa,0xfe,0xb6,0x01,0x4a,0xe6,0xe6,0xfd,0xc8,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x77,0x06,0xe2, +0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x35,0xb2,0x00,0x80,0x01,0xb8,0xff,0xc0,0x40,0x16,0x09,0x0c,0x48,0x01,0x04,0x0a,0x16,0xc1,0x40,0x10,0x00,0x80,0x02,0x02,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x07,0x19,0x2f,0xc6,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0x39,0x39,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x01,0x23, +0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x77,0xfe,0xf9,0x7e,0xdf,0x31,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xe2,0xfe,0xb8,0x01,0x48,0xfd,0xe0,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a, +0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x02,0x01,0x23,0x04,0xb2,0x03,0xa4,0x06,0x55,0x00,0x13,0x00,0x17,0x00,0x3c,0x40,0x17,0x14,0x15,0x14,0x15,0x0a,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x17,0xe2,0x14,0x40,0x0d,0x12,0x48,0x14,0x13,0x07,0xda,0x0d,0xb8,0xff,0xc0,0xb7,0x09,0x0c,0x48,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6, +0xfd,0xdc,0x2b,0xed,0xd6,0xd6,0x2b,0xed,0x01,0x2f,0xe1,0xd4,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x37,0x21,0x35,0x21,0x03,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x1a,0xfe,0x04, +0x01,0xfc,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x36,0x6d,0x00,0x02,0x00,0x90,0xff,0xe8,0x03,0xb8,0x04,0x18,0x00,0x15,0x00,0x20,0x00,0x46,0xb9,0x00,0x04,0xff,0xc0,0x40,0x23,0x09,0x0c,0x48,0x04,0x04,0x02,0x0d,0x10,0x16,0x96,0x00,0x00,0x1d,0x02,0x95,0x08,0x16,0x0b,0x0f,0x1d,0x95,0x10,0x10,0x04,0x04, +0x13,0x83,0x1a,0x1a,0x22,0x16,0x0c,0x00,0x84,0x0b,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x12,0x39,0x11,0x33,0x2f,0x2b,0x31,0x30,0x01,0x10,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x25,0x37,0x36,0x36, +0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x31,0xd5,0xba,0x94,0x37,0xcb,0x5a,0xfe,0x98,0xa3,0x05,0x6a,0xd0,0x99,0xad,0xfe,0xae,0xfe,0xcb,0xfa,0x6e,0x77,0x6a,0x5a,0x7c,0x9f,0x01,0x77,0xfe,0xfb,0x7e,0xa8,0x27,0x39,0x01,0x7e,0x02,0x9a,0xa0,0xb8,0xa2,0x86,0xfe,0xe1,0x2f,0x58,0x22,0x0f,0x51,0x68,0x4c,0x5e,0xad,0x81,0x00,0x02, +0x00,0x60,0xff,0xe8,0x04,0x10,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x49,0x40,0x18,0x02,0x1b,0x95,0x05,0x16,0x01,0x15,0x0e,0x15,0x95,0x0b,0x10,0x0f,0x0f,0x11,0x0d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0x40,0x13,0x0c,0x06,0x4d,0x01,0x01,0x1f,0x18,0x08,0x0c,0x06,0x4d,0x18,0x83,0x08,0x0e,0x0c,0x06,0x4d,0x08, +0x2f,0x2b,0xe9,0x2b,0x12,0x39,0x2f,0x2b,0xe9,0x2b,0x33,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5, +0xd3,0x60,0x04,0xa4,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfd,0xcf,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x49,0x40,0x16,0x03,0x15,0x01,0x15,0x95,0x0f,0x16,0x07,0x1b,0x95,0x09,0x10, +0x04,0x0f,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xec,0x40,0x15,0x0c,0x06,0x4d,0x18,0x18,0x1f,0x06,0x02,0x12,0x06,0x0c,0x06,0x4d,0x12,0x84,0x03,0x02,0x0c,0x06,0x4d,0x03,0x2f,0x2b,0xe9,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0xe9,0x2b,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x31,0x30,0x25,0x23,0x15,0x23,0x11, +0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0x6c,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0x94,0x04,0x00,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f, +0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x56,0x06,0x02,0x00,0x1a,0x00,0x27,0x00,0x38,0x40,0x1e,0x10,0x01,0x13,0x1f,0x95,0x19,0x16,0x03,0x15,0x25,0x95,0x13,0x10,0x0a,0x0c,0x95,0x07,0x01,0x0a,0x0a,0x16,0x83,0x22,0x22,0x29,0x10,0x02,0x1c,0x83,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f, +0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x50,0x04,0xa6,0xfd,0xdc,0x8a,0x7e,0x84,0x88, +0x87,0xa8,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xca,0x6d,0xa5,0x7f,0x95,0xab,0x9f,0x88,0x8f,0xae,0x94,0x94,0x03,0xdd,0x01,0x14,0x01,0x11,0x37,0x98,0x44,0xa5,0xf3,0x93,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe5,0xca,0xaa,0xc3,0xc7,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x04,0x18,0x00,0x15, +0x00,0x26,0x40,0x14,0x30,0x01,0x01,0x01,0x03,0x95,0x14,0x16,0x0b,0x09,0x95,0x0e,0x10,0x11,0x83,0x06,0x06,0x17,0x0b,0x00,0x2f,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x5c,0x78, +0x84,0x99,0xc1,0xbd,0x9f,0x83,0x79,0x78,0x9e,0xdb,0x01,0x0f,0xfe,0xe7,0xed,0x8c,0x21,0xa5,0x54,0xdc,0xb8,0xb4,0xd4,0x54,0x9b,0x43,0xfe,0xe3,0xe5,0xfe,0xfe,0xd0,0x00,0x02,0x00,0x60,0xff,0x70,0x03,0xa0,0x04,0x18,0x00,0x1d,0x00,0x26,0x00,0x57,0x40,0x1e,0x14,0x12,0x20,0x0f,0x05,0x00,0x1c,0x0a,0x03,0x16,0x96,0x25,0x20,0x96, +0x1c,0x16,0x0d,0x0f,0x95,0x0a,0x10,0x1e,0x14,0x23,0x12,0x00,0x05,0x19,0x07,0x02,0xb8,0x01,0x03,0x40,0x0c,0x03,0x07,0x0d,0x0d,0x19,0x84,0x23,0x23,0x28,0x12,0x83,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xd4,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xd6,0xed,0x2f,0x11,0x12,0x39, +0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x25,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x01,0x68,0x1c,0x06,0x8c,0x0d,0x31,0x98,0x01,0x22,0xf2,0x87,0x67,0x72,0x82,0x9d,0xc9,0x46, +0x8a,0xbc,0x76,0x96,0xbc,0x9a,0x7c,0x24,0x4c,0x60,0x55,0x63,0x7e,0x88,0x18,0x50,0x58,0x86,0x70,0x90,0xf2,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0x9c,0x64,0xb4,0x79,0x5c,0x66,0x87,0xb4,0x30,0x37,0x2e,0x56,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x21,0x05,0xec,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x19,0x17,0x95,0x02, +0x1c,0x12,0x06,0x0f,0x24,0x95,0x09,0x16,0x1e,0x95,0x0f,0x10,0x14,0x00,0x19,0x19,0x15,0x84,0x1a,0x12,0x06,0x06,0x28,0x21,0x83,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x10, +0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x41,0x42,0x92,0xa0,0x04,0x72,0xee,0xc2,0xe6,0x01,0x04,0xd6,0xcc,0x62,0x04,0xa4,0xa0,0x3c,0x35,0xfe,0x4b,0xa2,0x80,0x99,0xa9,0xa4,0x89,0x8a,0xad,0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x48,0xcc, +0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xf9,0x86,0xc8,0x1a,0x03,0x13,0x87,0x7f,0xb1,0xe0,0xc2,0xac,0xce,0xcb,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x21,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x13,0x07,0x10,0x24,0x95,0x0a,0x16,0x05,0x15,0x1e,0x95,0x10,0x10,0x00,0x02,0x95,0x17,0x01,0x00,0x00,0x05,0x84, +0x1a,0x13,0x06,0x06,0x28,0x21,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22, +0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xa4,0x04,0x72,0xee,0xc2,0xe6,0x01,0x04,0xd6,0xcc,0x62,0x04,0xb4,0x8a,0x48,0x2f,0xfe,0x4b,0xa2,0x80,0x99,0xa9,0xa4,0x89,0x8a,0xad,0x05,0x5c,0x1b,0xcf,0xfb,0x58,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x01,0x42,0x99,0xb7,0x12,0xfb,0xe7,0x87,0x7f,0xb1, +0xe0,0xc2,0xac,0xce,0xcb,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x18,0x00,0x4b,0xb9,0x00,0x01,0xff,0xc0,0x40,0x1f,0x0b,0x0e,0x48,0x01,0x01,0x03,0x07,0x95,0x40,0x18,0x0b,0x11,0x18,0x95,0x08,0x30,0x03,0x95,0x11,0x16,0x15,0x95,0x0b,0x10,0x0e,0x83,0x13,0x06,0x06,0x1a,0x01,0xb8,0xff,0xc0,0xb6, +0x0e,0x12,0x48,0x01,0x18,0x83,0x07,0x2f,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x34,0x12,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x01,0x02,0x23,0x22,0x06,0x07,0x9a,0x9a,0xb4,0x97,0xa7,0x03, +0xfd,0x29,0xeb,0xcd,0xcd,0xf8,0xfe,0xfb,0xd8,0xc2,0x01,0xf3,0x28,0xfb,0x7a,0x8a,0x02,0x42,0xa2,0x72,0xbd,0xa8,0x56,0xe0,0x01,0x0b,0xfe,0xe3,0xfb,0xf7,0xfe,0xdf,0x02,0x7a,0x01,0x2c,0xa1,0x8b,0x00,0x02,0x00,0x50,0xff,0xe8,0x05,0x16,0x04,0x18,0x00,0x1d,0x00,0x26,0x00,0x77,0x40,0x14,0x05,0x05,0x06,0x1e,0x1e,0x26,0x1f,0x04, +0x1f,0x17,0x17,0x16,0x0e,0x0e,0x0f,0x0d,0x18,0x0d,0x1d,0x02,0xb8,0x01,0x04,0x40,0x2c,0x1b,0x1e,0x05,0x1f,0x04,0x18,0x04,0x0d,0x18,0x1f,0x04,0x15,0x22,0x95,0x0a,0x16,0x12,0x40,0x09,0x0e,0x48,0x12,0x10,0x95,0x15,0x10,0x1e,0x0e,0x25,0x17,0x05,0x07,0x12,0x00,0x00,0x07,0x83,0x25,0x25,0x28,0x12,0x1f,0x83,0x0d,0x2f,0xe1,0xc6, +0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xed,0x12,0x17,0x39,0x2f,0x11,0x12,0x39,0x39,0xd6,0xed,0xc6,0x31,0x30,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x06,0x23,0x22,0x27,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x26,0x27,0x01,0x26,0x23,0x22,0x07, +0x35,0x36,0x33,0x32,0x17,0x37,0x17,0x16,0x33,0x32,0x37,0x05,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x05,0x16,0x38,0x34,0x88,0x3c,0x3e,0x23,0xfe,0xf5,0xcc,0xbe,0xd9,0x0d,0x02,0x85,0x5b,0xa9,0xa4,0x99,0x9e,0xbe,0xf0,0x86,0xc3,0x21,0x22,0x4c,0x30,0x2e,0xfd,0xfc,0xfd,0xe8,0x0a,0x8b,0x6b,0x8f,0x9c,0x02,0x98,0x1f,0x8d,0x22, +0x61,0x7f,0xf4,0xfe,0xd8,0xee,0xdc,0x01,0x60,0x7c,0x72,0x9a,0x62,0xb8,0x68,0x68,0x6a,0x22,0x84,0xfe,0xda,0x6c,0x90,0xd4,0xb8,0x56,0x00,0x01,0x00,0x60,0xff,0xe8,0x02,0xf4,0x04,0x18,0x00,0x22,0x00,0x45,0x40,0x25,0x07,0x1a,0x95,0x40,0x19,0x0d,0x02,0x19,0x95,0x0c,0x30,0x22,0x20,0x95,0x02,0x16,0x10,0x12,0x95,0x0d,0x10,0x07, +0x05,0x1a,0x1a,0x1d,0x10,0x00,0x00,0x24,0x05,0x15,0x83,0x0a,0x1d,0x83,0x05,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23, +0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x02,0xf4,0x72,0x98,0xba,0xd0,0xde,0xbb,0xc9,0xa4,0x82,0x67,0x6d,0x7c,0x5a,0x6d,0x8c,0x78,0x50,0x52,0xfe,0xdd,0x80,0x72,0x86,0x74,0x1a,0x32,0xa1,0x87,0xcf,0x37,0x04,0x40,0xa8,0x7d,0x99,0x2e,0x9a,0x3e,0x51,0x43,0x4c,0x58,0x8e,0xac,0x4e,0x5c, +0x3e,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x02,0xee,0x04,0x18,0x00,0x21,0x00,0x4d,0x40,0x2a,0x1b,0x09,0x95,0x40,0x0a,0x15,0x20,0x0a,0x95,0x0c,0x30,0x70,0x01,0x01,0x01,0x03,0x95,0x20,0x16,0x12,0x10,0x95,0x15,0x10,0x1b,0x1d,0x09,0x0e,0x83,0x18,0x18,0x1d,0x09,0x09,0x00,0x1d,0x83,0x06,0x06,0x23,0x12,0x00,0x2f,0xc4,0x12,0x39, +0x2f,0xe1,0x12,0x39,0x2f,0x10,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x5a, +0x72,0x8e,0x6f,0x7d,0xfe,0xdf,0x54,0x50,0x79,0x8b,0xc9,0x76,0x72,0x73,0x81,0xa2,0xc1,0xb9,0xdc,0xdb,0xbb,0x8c,0x1a,0x9a,0x42,0x5f,0x4b,0xac,0x8e,0x59,0x4b,0x94,0x3c,0x98,0x2e,0x97,0x7b,0xa5,0x45,0x04,0x33,0xcb,0x88,0xaa,0x00,0x01,0x00,0x5a,0xff,0xe8,0x04,0x35,0x04,0x18,0x00,0x2c,0x00,0x72,0x40,0x3d,0x04,0x05,0x27,0x08, +0x2c,0x02,0x96,0x2a,0x26,0x19,0x27,0x27,0x24,0x08,0x08,0x18,0x95,0x40,0x19,0x24,0x0d,0x19,0x95,0x0c,0x30,0x70,0x10,0x01,0x10,0x12,0x95,0x0d,0x16,0x21,0x1f,0x95,0x24,0x10,0x27,0x04,0x26,0x00,0x00,0x0a,0x08,0x0a,0x18,0x18,0x15,0x0f,0x1d,0x84,0x26,0x26,0x0a,0x83,0x15,0x15,0x2e,0x21,0x0f,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0, +0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x10,0xc2,0x2f,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x11,0x12,0x39,0x2f,0x12,0x39,0xd6,0xed,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x07,0x06,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32, +0x36,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x37,0x17,0x16,0x33,0x32,0x37,0x04,0x35,0x39,0x2f,0x7a,0x3d,0x54,0x54,0x5c,0xdc,0xdb,0xbb,0x8c,0x72,0x72,0x8e,0x6f,0x7d,0xfe,0xdf,0x54,0x52,0x73,0x8f,0xc9,0x76,0x72,0x73,0x81,0x01,0x1d,0x3d,0x86,0x20,0x27,0x4e,0x2a,0x2e,0x02, +0x98,0x1f,0x79,0x56,0x56,0x2a,0x04,0x34,0xca,0x88,0xaa,0x32,0x9a,0x42,0x5f,0x4b,0xac,0x8e,0x5d,0x49,0x92,0x3c,0x98,0x2e,0xdc,0x8c,0x5e,0x74,0x22,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x0c,0x04,0x18,0x00,0x10,0x00,0x23,0x00,0x44,0x40,0x25,0x01,0x11,0x95,0x40,0x12,0x0c,0x06,0x12,0x95,0x0c,0x30,0x1e,0x95,0x06,0x16,0x18, +0x95,0x0c,0x10,0x01,0x03,0x11,0x11,0x21,0x1b,0x15,0x84,0x0f,0x0f,0x03,0x83,0x21,0x21,0x25,0x1b,0x83,0x09,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32, +0x16,0x15,0x14,0x05,0x35,0x33,0x32,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x3a,0xd2,0xe8,0xc2,0xee,0xfe,0xec,0x01,0x26,0xee,0xa8,0xd2,0xfe,0x24,0x44,0xf4,0x7a,0x62,0xa4,0xc2,0xc2,0xa0,0x74,0x86,0xfe,0xf6,0x02,0x1c,0x04,0x30,0xca,0x87,0xaf,0x01,0x1a,0xf0,0xfc,0x01,0x2a,0x9b,0x7b, +0xa2,0x98,0x8e,0xa0,0x43,0x55,0xd5,0xbf,0xb6,0xd2,0x60,0x4a,0xac,0x00,0x00,0x01,0xff,0x81,0xfe,0x1e,0x02,0x1c,0x04,0x00,0x00,0x14,0x00,0x4b,0x40,0x29,0x13,0x01,0x0d,0x95,0x40,0x10,0x11,0x05,0x10,0x95,0x08,0x30,0x08,0x0a,0x95,0x40,0x05,0x1c,0x11,0x0f,0x08,0x0c,0x13,0x10,0x0c,0x00,0x0e,0x02,0x0e,0x0c,0x42,0x0e,0x02,0x84, +0x0c,0x15,0x16,0x0c,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xc6,0x2b,0x01,0x10,0xe2,0x12,0x39,0x39,0x18,0x10,0xc6,0x00,0x3f,0x3f,0x1a,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x02,0x1c,0xae,0xc3, +0xad,0x48,0x35,0x3d,0x42,0xcb,0xaf,0xaf,0xa3,0xae,0x01,0xdb,0xfe,0x04,0xd6,0xeb,0x1a,0x99,0x27,0x01,0x31,0x02,0x00,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x21,0x06,0x02,0x00,0x21,0x00,0x2e,0x00,0x4a,0xb9,0x00,0x0a,0xff,0xc0,0x40,0x26,0x0b,0x0f,0x48,0x0a,0x0a,0x0c,0x95,0x07,0x1c,0x1b,0x0f,0x18,0x2c, +0x95,0x12,0x16,0x26,0x95,0x18,0x10,0x00,0x02,0x95,0x1f,0x01,0x00,0x00,0x05,0x84,0x22,0x1b,0x0f,0x0f,0x30,0x0a,0x29,0x83,0x15,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x32,0x2f,0x2b,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x10,0x21,0x22,0x27, +0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xfd,0xe4,0xbe,0x8e,0xad,0x9d,0x01,0x7a,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xb4,0x8a,0x48,0x2f, +0xfe,0x4b,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x05,0x5c,0x1b,0xcf,0xfb,0xaa,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x11,0xe6,0x01,0x05,0x01,0x34,0xa6,0x01,0x40,0x99,0xb7,0x12,0xfb,0xdf,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x04,0x18,0x02,0x06,0x00,0x4a,0x00,0x00, +0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xcd,0x04,0x18,0x00,0x19,0x00,0x41,0x40,0x23,0x17,0x95,0x40,0x18,0x08,0x02,0x18,0x95,0x08,0x30,0x15,0x00,0x13,0x95,0x02,0x16,0x0b,0x0d,0x95,0x08,0x10,0x17,0x17,0x15,0x10,0x0b,0x0b,0x00,0x84,0x15,0x15,0x1b,0x10,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x00, +0x3f,0xfd,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x03,0xcd,0xaf,0xb8,0xec,0xfe,0xe6,0x01,0x38,0xf6,0x9a,0x82,0x82,0xa3,0xa9,0xd4,0xc5,0xa7,0x6e,0x4b,0xdf,0x01,0x7f, +0x3e,0x56,0x01,0x18,0xf0,0xf1,0x01,0x37,0x30,0x9c,0x42,0xe0,0xb4,0xb8,0xd0,0x26,0x01,0x04,0x8b,0x00,0x00,0x02,0x00,0x0e,0xfe,0x52,0x03,0xc6,0x04,0x00,0x00,0x11,0x00,0x19,0x00,0x16,0x40,0x0a,0x16,0x95,0x07,0x00,0x0f,0x0e,0x0f,0x00,0x1b,0x0e,0x2f,0x10,0xc6,0x00,0x3f,0x3f,0x2f,0xed,0x31,0x30,0x01,0x01,0x17,0x16,0x15,0x14, +0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x01,0x33,0x09,0x02,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x03,0xc6,0xfe,0x78,0x22,0x5e,0x7c,0x63,0x5f,0x78,0x62,0x22,0xfe,0x82,0xb2,0x01,0x26,0x01,0x2e,0xfe,0xd0,0x40,0x40,0x41,0x04,0x00,0xfc,0xa0,0x44,0xbc,0x68,0x63,0x83,0x83,0x63,0x5a,0xca,0x44,0x03,0x60,0xfd,0x42,0x02,0xbe,0xfc, +0x10,0x8b,0x49,0x63,0x63,0x40,0x00,0x02,0x00,0x0a,0xff,0xe8,0x03,0x9e,0x04,0x18,0x00,0x1b,0x00,0x23,0x00,0x2a,0x40,0x17,0x20,0x95,0x09,0x16,0x00,0x12,0x19,0x02,0x10,0x95,0x15,0x10,0x0c,0x1e,0x22,0x06,0x0e,0x04,0x06,0x12,0x00,0x25,0x12,0x2f,0x10,0xc6,0x11,0x17,0x39,0x00,0x3f,0xfd,0x39,0x39,0xd6,0xc4,0x3f,0xed,0x31,0x30, +0x01,0x26,0x23,0x22,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x17,0x01,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x03,0x9e,0x46,0x33,0x75,0x7d,0x95,0x85,0x74,0x6f,0x7e,0x92,0x82,0x73,0x3f,0x36,0x40,0x4a,0x9e,0xa3,0xa5,0x9e,0x48,0x3e,0xfe,0x37,0x58,0x58, +0x58,0x03,0x60,0x2e,0xbf,0xef,0xca,0x88,0xa6,0xa4,0x86,0xd2,0xeb,0xbf,0x2c,0x96,0x20,0xce,0xce,0x20,0xfe,0x60,0xa3,0x97,0xac,0xac,0x92,0x00,0x00,0x01,0x00,0x90,0xfe,0x29,0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0x27,0x40,0x14,0x00,0x1b,0x11,0x02,0x08,0x0c,0x95,0x05,0x16,0x08,0x0f,0x11,0x84,0x02,0x10,0x10,0x13,0x09,0x84,0x08, +0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x78,0xda,0xfe,0xa8,0xa3,0xeb,0x7a,0xa6,0xa4,0xfe,0x29,0x02,0x81,0xc2,0x01,0xa1,0x02,0x77,0xfd,0xb2,0xfe,0xc0,0xbb,0x8f,0x02, +0x44,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x1b,0x00,0x32,0x40,0x1a,0x16,0x00,0x19,0x09,0x15,0x04,0x95,0x19,0x10,0x10,0x12,0x95,0x0d,0x01,0x10,0x10,0x16,0x00,0x84,0x01,0x01,0x1d,0x16,0x08,0x84,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x12,0x39,0x39, +0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xfc,0xdb,0x8a,0x7e,0x84,0x88,0x87,0xa8,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x03,0xdd,0x01,0x14,0x01,0x11, +0x37,0x98,0x44,0xa5,0xf3,0x89,0xc2,0xfe,0x5f,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x03,0xf8,0x06,0x02,0x00,0x24,0x00,0x40,0x40,0x22,0x06,0x08,0x95,0x03,0x1c,0x1f,0x22,0x12,0x15,0x0d,0x95,0x22,0x10,0x19,0x1b,0x95,0x16,0x01,0x19,0x19,0x1f,0x00,0x06,0x06,0x11,0x00,0x84,0x0a,0x0a,0x26,0x1f,0x11,0x84,0x12,0x2f,0xe1,0x32,0x12, +0x39,0x2f,0xe1,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xbf, +0xad,0x4c,0x36,0x3e,0x44,0xc8,0xee,0x78,0xa4,0xa4,0xfc,0xdb,0x8a,0x7e,0x84,0x88,0x87,0xa8,0x04,0x76,0xda,0x01,0x5a,0x04,0xe6,0xf8,0x1a,0x99,0x27,0x01,0x3e,0x02,0x66,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x03,0xdd,0x01,0x14,0x01,0x11,0x37,0x98,0x44,0xa5,0xf3,0x89,0xc2,0xfe,0x5f,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x0e,0x05,0xd9, +0x00,0x0b,0x00,0x17,0x00,0x52,0x40,0x2f,0x16,0x0d,0x10,0x95,0x40,0x13,0x14,0x0f,0x13,0x95,0x0c,0x30,0x0f,0x15,0x06,0x63,0x40,0x00,0x14,0x0f,0x09,0x62,0x03,0x0f,0x0e,0x03,0x62,0xff,0x30,0x0c,0x0e,0x0e,0x0f,0x11,0x42,0x11,0x16,0x13,0x0e,0x84,0x0f,0x18,0x19,0x0f,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x2b, +0x01,0x10,0xe2,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0xd6,0x1a,0xed,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x01,0x10,0x2c,0x40,0x40,0x2c,0x2e,0x3d,0x3d,0xd0,0xb0,0xa4,0xb0,0xb0,0xa4,0xb0, +0x05,0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xfc,0xd7,0xfe,0x25,0x01,0xdb,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x00,0x01,0x00,0x94,0xff,0xea,0x02,0x2f,0x04,0x00,0x00,0x0b,0x00,0x19,0x40,0x0c,0x0b,0x09,0x95,0x02,0x16,0x05,0x0f,0x0b,0x0b,0x06,0x84,0x05,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x25,0x06,0x23, +0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x2f,0x39,0x5c,0xfe,0xfa,0xa4,0x90,0x3c,0x2b,0x08,0x1e,0x01,0x28,0x02,0xee,0xfd,0x2f,0xbb,0x20,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x02,0x44,0x04,0x00,0x00,0x0b,0x00,0x33,0x40,0x1b,0x0a,0x02,0x95,0x01,0x15,0x09,0x05,0x95,0x06,0x0f,0x08,0x05,0x02,0x0b,0x0b,0x0a,0x02,0x40, +0x0a,0x84,0x03,0x0c,0x0d,0x03,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x1a,0x18,0xcd,0x10,0xc1,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x02,0x44,0xfe,0x08,0xaa,0xaa,0x01,0xf8,0xaa,0xaa,0x8c,0x02,0xe8,0x8c,0x8c,0xfd,0x18,0x00,0x01,0xff,0xec, +0x00,0x00,0x02,0x52,0x05,0xec,0x00,0x17,0x00,0x5c,0x40,0x33,0x13,0x10,0x15,0x0e,0x07,0x04,0x09,0x15,0x95,0x02,0x0c,0x91,0x0b,0x09,0x00,0x91,0x17,0x09,0x95,0x40,0x0e,0x11,0x06,0x0e,0x95,0x08,0x30,0x06,0x15,0x11,0x00,0x00,0x00,0x01,0x0e,0x03,0x00,0x00,0x05,0x0b,0x12,0x11,0x05,0x84,0x06,0x18,0x19,0x06,0x84,0x08,0x30,0x2b, +0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x10,0xc2,0x2f,0x5f,0x5e,0x5d,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0xd4,0xed,0x10,0xd6,0xed,0xd4,0xed,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x16,0x33,0x32,0x37,0x02,0x52, +0x44,0x58,0x23,0x29,0xa4,0x2e,0x17,0x4d,0x48,0x46,0x55,0x1d,0x22,0xa4,0x2e,0x24,0x4e,0x48,0x02,0xd9,0x39,0x0a,0xfd,0x56,0x02,0xd9,0x0d,0x46,0x95,0x3b,0x08,0x02,0x84,0xfd,0x4c,0x0d,0x45,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x02,0xee,0x05,0xec,0x00,0x11,0x00,0x19,0x00,0x4a,0x40,0x29,0x0d,0x12,0x15,0x96,0x40,0x0b,0x12,0x80, +0x12,0x04,0x01,0x95,0x40,0x10,0x0e,0x03,0x10,0x95,0x08,0x30,0x03,0x15,0x0e,0x00,0x00,0x00,0x0d,0x10,0x12,0x03,0x02,0x84,0x0f,0x03,0x01,0x03,0x03,0x1b,0x17,0x84,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xf1,0x17,0x39,0xc2,0x2f,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x1a,0x10,0xdc,0x1a,0xed,0x12,0x39,0x31,0x30, +0x01,0x21,0x11,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x21,0x21,0x26,0x26,0x23,0x22,0x15,0x14,0x33,0x02,0xee,0xff,0x00,0xa4,0x42,0x88,0x94,0x75,0x59,0x56,0x3a,0xa4,0x01,0x00,0xfe,0x5c,0x04,0x49,0x32,0x4c,0x8b,0x02,0x87,0xfd,0x79,0x02,0x87,0x74,0x67,0x55,0x78,0x3b,0x01,0xf8,0xfd,0x26,0x44, +0x5c,0x4a,0x56,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x02,0x5a,0x05,0xec,0x00,0x0c,0x00,0x24,0x40,0x13,0x0c,0x0a,0x95,0x40,0x02,0x1c,0x06,0x00,0x0c,0x0c,0x08,0x84,0x05,0x0d,0x0e,0x05,0x84,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc2,0x18,0x2f,0x00,0x3f,0x3f,0x1a,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14, +0x33,0x32,0x37,0x02,0x5a,0x40,0x43,0x93,0x9e,0xa4,0xa0,0x3c,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x06,0x80,0xf9,0x86,0xc8,0x1a,0x00,0x01,0x00,0xa6,0xfe,0x21,0x04,0xb2,0x05,0xec,0x00,0x1c,0x00,0x57,0x40,0x30,0x0b,0x0a,0x96,0x40,0x15,0x12,0x1b,0x15,0x96,0x08,0x30,0x10,0x01,0x01,0x01,0x03,0x95,0x1b,0x1c,0x0f,0x15,0x14,0x0c,0x95, +0x12,0x0f,0x10,0x00,0x15,0x0b,0x0b,0x06,0x01,0x01,0x0e,0x0f,0x0c,0x14,0x14,0x18,0x83,0x06,0x06,0x1e,0x12,0x0e,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x11,0x39,0x2f,0x33,0x00,0x3f,0x3f,0xed,0x39,0x3f,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x16, +0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x01,0x27,0xa5,0xb1,0xae,0xdf,0xdf,0xcd,0x52,0x01,0x80,0xfd,0xbe,0xa4,0xa4,0x03,0x2d,0xfe,0x77,0xd8,0xec,0xfe,0xbc,0xf7,0xb6,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x96,0xa5,0x33,0x02,0x14,0xfc,0x8c, +0x05,0xec,0xfe,0x14,0x33,0xfd,0xe1,0x1a,0xeb,0xb3,0xcc,0xfe,0xf7,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8,0x06,0x54,0x04,0x00,0x00,0x1f,0x00,0x45,0x40,0x25,0x02,0x08,0x0d,0x1a,0x05,0x12,0x95,0x40,0x0a,0x10,0x00,0x1e,0x16,0x0d,0x0f,0x1f,0x84,0x01,0x1e,0x0e,0x16,0x0d,0x16,0x42,0x0e,0x84,0x0d,0x08,0x17,0x84,0x16,0x20,0x21,0x16, +0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x32,0xe1,0x00,0x18,0x3f,0x33,0x33,0x2f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11, +0x33,0x06,0x54,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x54,0x04,0x00,0x00,0x1f,0x00,0x46, +0x40,0x26,0x02,0x08,0x0d,0x1a,0x05,0x12,0x95,0x40,0x0a,0x10,0x00,0x1b,0x1e,0x16,0x0d,0x0f,0x1f,0x84,0x01,0x1e,0x0e,0x16,0x0d,0x16,0x42,0x0e,0x84,0x0d,0x08,0x17,0x84,0x16,0x20,0x21,0x16,0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x32,0xe1,0x00,0x18,0x3f,0x33,0x33,0x3f,0x3f,0x1a,0xed,0x39, +0x39,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x54,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xfe,0x29,0x02, +0x79,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x06,0x54,0x04,0x18,0x00,0x28,0x00,0x50,0x40,0x2d,0x26,0x28,0x95,0x23,0x1c,0x05,0x15,0x16,0x1b,0x04,0x0d,0x95,0x40,0x1d,0x18,0x10,0x13,0x0f,0x0a,0x12,0x26,0x26, +0x09,0x20,0x84,0x01,0x0e,0x0a,0x12,0x0a,0x42,0x14,0x11,0x84,0x12,0x1b,0x09,0x84,0x0a,0x29,0x2a,0x0a,0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x32,0x2b,0x01,0x10,0xf2,0xe1,0x12,0x39,0x18,0x2f,0x00,0x2f,0x33,0x3f,0x3f,0x33,0x1a,0xed,0x17,0x32,0x3f,0xfd,0xc6,0x31,0x30,0x00,0x11,0x11,0x34,0x26,0x23,0x22,0x06, +0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x05,0xb0,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0xbf,0xad,0x4c,0x36,0x3e,0x44,0xfe,0xaa,0x01, +0x3e,0x02,0x64,0xaa,0x98,0xc0,0x86,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb5,0x91,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0xfd,0x85,0xe6,0xf8,0x1a,0x99,0x27,0x00,0x00,0x01,0xff,0x96,0xfe,0x1e,0x03,0xf8,0x04,0x18,0x00,0x1a,0x00,0x35,0x40,0x1c,0x15,0x00,0x18,0x0e,0x10,0x95,0x0b,0x1c,0x00,0x15,0x13,0x0f,0x04,0x95, +0x18,0x10,0x00,0x84,0x01,0x01,0x1c,0x12,0x15,0x08,0x0e,0x08,0x84,0x12,0x2f,0xe1,0xc6,0x11,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11, +0x03,0xf8,0xa4,0xec,0x7b,0xa3,0xb3,0x8b,0x48,0x2e,0x36,0x36,0xa4,0xa4,0x04,0x74,0xde,0x01,0x58,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0x24,0x99,0xb5,0x13,0x93,0x1a,0xcd,0x04,0x89,0xaa,0xc2,0xfe,0x5a,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x05,0x08,0x04,0x18,0x00,0x1a,0x00,0x31,0x40,0x1a,0x1a,0x18,0x95,0x02,0x1c,0x10,0x13,0x0d, +0x15,0x0e,0x0f,0x08,0x95,0x13,0x10,0x1a,0x1a,0x16,0x84,0x05,0x05,0x1c,0x10,0x0c,0x84,0x0d,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11,0x11,0x14,0x33, +0x32,0x37,0x05,0x08,0x40,0x43,0x93,0x9e,0xec,0x7b,0xa3,0xa4,0xa4,0x04,0x74,0xde,0x01,0x58,0xa0,0x3c,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x02,0xdc,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xfe,0x5a,0xfd,0x00,0xc8,0x1a,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x0a,0x04,0x00,0x00,0x13,0x00,0x26,0x40,0x14,0x01,0x04,0x0f,0x13, +0x04,0x0b,0x09,0x15,0x0b,0x0f,0x01,0x13,0x84,0x12,0x12,0x15,0x0b,0x08,0x84,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x04,0x0a,0x9c,0xfe,0x06,0x24,0x0c,0x04,0x04,0x9e,0xa4,0x01, +0xf2,0x20,0x10,0x04,0x06,0xa0,0x02,0xd1,0x33,0x18,0x35,0x4d,0xfd,0x66,0x04,0x00,0xfd,0x40,0x2d,0x21,0x33,0x3f,0x02,0x9c,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x33,0x40,0x1c,0x13,0x95,0x40,0x11,0x06,0x00,0x11,0x95,0x1b,0x30,0x16,0x95,0x00,0x16,0x0e,0x95,0x06,0x10,0x09,0x83, +0x0c,0x12,0x12,0x19,0x11,0x13,0x83,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x20,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01, +0xfe,0xeb,0x69,0x1e,0xfe,0xd8,0x8d,0xb1,0x12,0x02,0x98,0xfd,0x66,0x0a,0xb4,0x94,0x01,0x34,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x68,0x01,0x3e,0xa6,0x98,0x8c,0x9e,0xb4,0x00,0x00,0x02,0x00,0x60,0xff,0xea,0x05,0x60,0x04,0x16,0x00,0x13,0x00,0x1e,0x00,0x47,0x40,0x28,0x10,0x95,0x40,0x0f, +0x0b,0x00,0x0f,0x95,0x1b,0x30,0x1d,0x96,0x02,0x16,0x13,0x95,0x00,0x15,0x0c,0x95,0x0b,0x0f,0x17,0x96,0x08,0x10,0x0e,0x12,0x84,0x14,0x14,0x05,0x0c,0x10,0x00,0x00,0x20,0x1a,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xe1,0x32,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31, +0x30,0x21,0x21,0x07,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x21,0x11,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x05,0x60,0xfd,0xd3,0xd7,0xeb,0xfe,0xef,0x01,0x1a,0xee,0x31,0x9a,0x02,0x15,0xfe,0x76,0x01,0x6f,0xfe,0x91,0x01,0xa2,0xfd,0xbc,0x60,0x52,0x9f,0xc1,0xba,0xa2,0x46, +0x16,0x01,0x21,0xeb,0xf3,0x01,0x2d,0x16,0x8c,0xfe,0xd6,0x8c,0xfe,0xce,0x02,0xed,0x19,0xe1,0xb3,0xb4,0xdc,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x64,0x04,0x18,0x00,0x11,0x00,0x22,0x00,0x43,0x40,0x25,0x01,0x03,0x12,0x12,0x1b,0x16,0x0f,0x20,0x95,0x03,0x16,0x1b,0x95,0x40,0x09,0x10,0x18,0x84,0x0c,0x0e,0x13,0x12,0x06,0x42, +0x00,0x13,0x84,0x12,0x23,0x24,0x12,0x84,0x08,0x30,0x1e,0x84,0x06,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x39,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x39,0x39,0x11,0x39,0x2f,0x12,0x39,0x31,0x30,0x25,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x06,0x23,0x22,0x26,0x03,0x33,0x15,0x10,0x33, +0x32,0x11,0x34,0x26,0x23,0x22,0x00,0x15,0x10,0x33,0x32,0x11,0x02,0xdf,0x06,0x57,0xcc,0x9e,0xb8,0x01,0x65,0x01,0x2d,0x01,0x1c,0x01,0x56,0xc8,0xb0,0x6a,0x7b,0x75,0x9f,0xb9,0xd6,0xfa,0xe0,0xde,0xfe,0xfc,0xcf,0xbf,0xb2,0xca,0xeb,0xd5,0x01,0x17,0x01,0x59,0xfe,0xb6,0xfe,0xf0,0xe1,0xf5,0x5c,0x01,0xc2,0x5a,0xfe,0xc6,0x01,0x44, +0xdf,0xf9,0xfe,0xfe,0xd8,0xfe,0xbe,0x01,0x3a,0x00,0x00,0x03,0x00,0x60,0xfe,0x29,0x04,0xba,0x05,0xec,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x48,0x40,0x2a,0x02,0x1b,0x13,0x00,0x19,0x95,0x03,0x16,0x12,0x0c,0x1a,0x95,0x40,0x09,0x10,0x0a,0x00,0x16,0x83,0x0f,0x0e,0x00,0x06,0x03,0x42,0x09,0x0c,0x13,0x19,0x04,0x00,0x84,0x03,0x20, +0x21,0x03,0x84,0x08,0x30,0x1d,0x83,0x06,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x17,0x39,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x3f,0xed,0x39,0x39,0x3f,0x31,0x30,0x05,0x11,0x23,0x11,0x26,0x02,0x35,0x34,0x00,0x37,0x11,0x33,0x11,0x16,0x12,0x15,0x14,0x00,0x03,0x11,0x36,0x36,0x35,0x34,0x26,0x01,0x11,0x06, +0x06,0x15,0x14,0x16,0x02,0xdf,0xa3,0xdd,0xff,0x01,0x04,0xd8,0xa3,0xdf,0xfc,0xfe,0xfe,0xd9,0x93,0xa0,0xa0,0xfe,0xca,0x91,0xa3,0xa3,0x18,0xfe,0x41,0x01,0xbf,0x11,0x01,0x22,0xdf,0xe7,0x01,0x20,0x17,0x01,0xd4,0xfe,0x2c,0x10,0xfe,0xe1,0xe5,0xe3,0xfe,0xdc,0x03,0x91,0xfc,0xe4,0x12,0xd0,0xac,0xab,0xd1,0xfc,0xf6,0x03,0x1c,0x12, +0xd2,0xac,0xa6,0xd3,0x00,0x01,0x00,0x0c,0xff,0xee,0x02,0x23,0x04,0x00,0x00,0x0f,0x00,0x20,0x40,0x10,0x08,0x0a,0x95,0x05,0x16,0x00,0x15,0x0e,0x0f,0x02,0x0f,0x84,0x0e,0x0e,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35, +0x11,0x33,0x02,0x23,0xa4,0x04,0x53,0xba,0x40,0x22,0x2c,0x51,0x69,0x8d,0xa4,0xc8,0xda,0x0e,0xaa,0x21,0xc8,0xa9,0x02,0x0a,0x00,0x01,0x00,0x0c,0xff,0xee,0x02,0x23,0x05,0xec,0x00,0x0f,0x00,0x20,0x40,0x10,0x08,0x0a,0x95,0x05,0x16,0x00,0x15,0x0e,0x00,0x02,0x0f,0x84,0x0e,0x0e,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f, +0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x23,0xa4,0x04,0x53,0xba,0x40,0x22,0x2c,0x51,0x69,0x8d,0xa4,0xc8,0xda,0x0e,0xaa,0x21,0xc8,0xa9,0x03,0xf6,0x00,0x01,0x00,0x0c,0xfe,0x1e,0x03,0x33,0x04,0x00,0x00,0x18,0x00,0x2f,0x40,0x18,0x18,0x16,0x95,0x02, +0x1c,0x07,0x09,0x12,0x0c,0x0e,0x95,0x09,0x16,0x12,0x0f,0x18,0x18,0x06,0x13,0x84,0x12,0x12,0x1a,0x0c,0x2f,0x12,0x39,0x2f,0xf1,0x33,0xc2,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33, +0x32,0x37,0x03,0x33,0x40,0x43,0x92,0x9f,0x04,0x52,0xbb,0x40,0x22,0x2c,0x51,0x68,0x8e,0xa4,0x9f,0x3d,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x58,0xd6,0x0e,0xaa,0x21,0xc7,0xaa,0x02,0x0a,0xfb,0x72,0xc8,0x1a,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x0f,0x00,0x23,0x40,0x11,0x07,0x1b,0x08,0x0f,0x00,0x00,0x0a,0x02, +0x0d,0x10,0x00,0x00,0x11,0x0a,0x06,0x84,0x07,0x2f,0xe9,0x32,0x11,0x39,0x2f,0x00,0x3f,0xcd,0x32,0x32,0x2f,0x3f,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0xa4,0xa4,0x04,0x4a,0xc2,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfc,0x1f,0x05,0xd7,0xd3, +0xe5,0x0e,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x02,0xbc,0x04,0x12,0x00,0x19,0x00,0x2c,0x40,0x16,0x14,0x1a,0x17,0x0a,0x08,0x95,0x0d,0x1c,0x11,0x0f,0x00,0x02,0x17,0x10,0x0a,0x00,0x00,0x1b,0x13,0x06,0x84,0x10,0x2f,0xe1,0x32,0x11,0x39,0x2f,0xc6,0x00,0x3f,0xdd,0xc6,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x31,0x30,0x01,0x26,0x23,0x22, +0x06,0x15,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0xa0,0x3c,0x34,0x40,0x43,0x93,0x9e,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfd,0x68,0xc8,0x1a,0x8a,0x1c,0xaf,0x9f,0x04,0x94,0xd3,0x6c,0x79,0x0e,0x00,0x00,0x01, +0x00,0x90,0x00,0x00,0x02,0xa2,0x04,0x18,0x00,0x0c,0x00,0x1b,0x40,0x0d,0x06,0x15,0x00,0x02,0x95,0x0a,0x10,0x00,0x00,0x0e,0x05,0x84,0x06,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x11,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0xa2,0x46,0x54,0xd7,0xa1,0xce,0xaa,0x56,0x44,0x03,0x68, +0x26,0xfe,0xed,0xfd,0x85,0x02,0x7b,0xbd,0xe0,0x1e,0x00,0x01,0x00,0x0c,0xfe,0x29,0x02,0x1e,0x04,0x18,0x00,0x0c,0x00,0x1b,0x40,0x0d,0x00,0x1b,0x06,0x04,0x95,0x09,0x10,0x00,0x84,0x01,0x01,0x0e,0x06,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x23,0x11,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15, +0x02,0x1e,0xa1,0xd7,0x4c,0x4e,0x50,0x54,0xb0,0xbe,0xfe,0x29,0x04,0x4e,0x01,0x17,0x28,0x92,0x20,0xd2,0xc5,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x83,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x3e,0x40,0x20,0x0f,0x05,0x95,0x13,0x13,0x07,0x08,0x01,0x15,0x07,0x15,0x12,0x95,0x08,0x0f,0x03,0x10,0x10,0x0f,0x06,0x01,0x00,0x00,0x0c, +0x84,0x16,0x16,0x1a,0x13,0x06,0x84,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x83,0xb8, +0x75,0x3e,0x78,0x56,0xa4,0x01,0x52,0xa5,0xb7,0xea,0x53,0x39,0xfe,0x54,0x9a,0xcc,0xc4,0x01,0x14,0x92,0xfe,0x5a,0x04,0x00,0x98,0x84,0xda,0x31,0x04,0x21,0x7c,0x02,0x3c,0xfe,0xbd,0xa8,0x9b,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x83,0x04,0x00,0x00,0x12,0x00,0x1a,0x00,0x43,0x40,0x24,0x04,0x13,0x95,0x40,0x0d,0x0b,0x0a,0x0d, +0x95,0x08,0x30,0x14,0x95,0x0a,0x15,0x00,0x0f,0x0b,0x0f,0x10,0x02,0x03,0x02,0x0d,0x12,0x00,0x00,0x06,0x84,0x17,0x17,0x1c,0x0d,0x14,0x84,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x03,0x06,0x07,0x15,0x16,0x15, +0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x33,0x32,0x36,0x37,0x13,0x01,0x11,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x83,0x8d,0x33,0x55,0xe6,0xc7,0xae,0xfe,0xc7,0xa4,0x56,0x41,0x53,0x22,0x79,0xfe,0x7b,0x95,0xd1,0x6e,0x5e,0x04,0x00,0xfe,0xcb,0x71,0x29,0x04,0x2b,0xd7,0x88,0xa3,0x04,0x00,0xfe,0x5a,0x41,0x51,0x01,0x14,0xfd,0xcf,0xfe, +0xbd,0x9d,0x4f,0x57,0x00,0x01,0x00,0x68,0xfe,0xb6,0x02,0xdb,0x04,0x18,0x00,0x2b,0x00,0x5d,0x40,0x0e,0x05,0x03,0x00,0x08,0x01,0x08,0x10,0x16,0x21,0x27,0x04,0x2a,0x19,0x0c,0xb8,0xff,0xc0,0x40,0x13,0x0b,0x0e,0x48,0x0c,0x0c,0x0e,0x95,0x2a,0x16,0x1c,0x1c,0x1e,0x95,0x19,0x10,0x05,0x05,0x27,0x00,0xb8,0x01,0x03,0x40,0x0d,0x0c, +0x1c,0x1c,0x27,0x83,0x10,0x10,0x2d,0x0c,0x21,0x83,0x16,0x0c,0x2f,0xd6,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x2f,0x2b,0x11,0x12,0x17,0x39,0x2f,0x5d,0xdd,0xc6,0x31,0x30,0x17,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x16,0x33,0x32,0x35, +0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0xee,0x95,0x3b,0x3c,0x41,0x49,0x7b,0x8d,0x82,0x88,0xc3,0x56,0x7d,0x93,0x65,0xca,0x9f,0x7a,0x61,0x66,0x82,0x52,0x62,0x45,0x7e,0x94,0x72,0xc2,0xa9,0x41,0x02,0x27,0xaa,0x23,0x7b,0x1f,0x8f, +0x83,0x01,0x0d,0x63,0x90,0x3c,0x4e,0x36,0x41,0x89,0x64,0x80,0xa8,0x2e,0xa6,0x4a,0x50,0x40,0x3e,0x4b,0x35,0x40,0x8c,0x62,0x82,0xa8,0x00,0x01,0xff,0x92,0xfe,0x1e,0x02,0x68,0x06,0x02,0x00,0x15,0x00,0x2d,0x40,0x18,0x0b,0x0d,0x95,0x08,0x1c,0x00,0x02,0x95,0x40,0x13,0x01,0x00,0x00,0x05,0x0a,0x05,0x84,0x0f,0x16,0x17,0x0f,0x84, +0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xc4,0x10,0xc2,0x2f,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x68,0x32,0x3c,0xaa,0xb9,0x8f,0x4c,0x2a,0x32,0x3c,0xac,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfa, +0xe7,0xa2,0xbf,0x13,0x93,0x1a,0xdf,0x05,0x17,0xa4,0xbe,0x12,0x00,0x01,0xff,0x9e,0xfe,0x1e,0x02,0x72,0x06,0x02,0x00,0x1d,0x00,0x53,0x40,0x2d,0x08,0x05,0x14,0x95,0x40,0x17,0x1b,0x0c,0x17,0x95,0x08,0x30,0x0f,0x11,0x95,0x0c,0x1c,0x00,0x02,0x95,0x40,0x1b,0x01,0x15,0x15,0x13,0x0f,0x06,0x06,0x09,0x00,0x00,0x09,0x0f,0x17,0x05, +0x09,0x84,0x13,0x1e,0x1f,0x13,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x10,0xc0,0x2f,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x33,0x15,0x23,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32, +0x35,0x11,0x23,0x35,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x72,0x32,0x3a,0xac,0xb0,0xb0,0xb7,0x8f,0x4b,0x2b,0x32,0x3a,0xac,0xb0,0xb0,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfd,0xce,0x8b,0xfd,0xa4,0xa4,0xbd,0x13,0x93,0x1a,0xdf,0x02,0x52,0x8b,0x02,0x3a,0xa2,0xc0,0x12,0x00,0x01,0xff,0xa6,0xfe,0x1e,0x02,0x48,0x04,0x18, +0x00,0x14,0x00,0x22,0x40,0x11,0x14,0x12,0x95,0x02,0x1c,0x09,0x07,0x95,0x0c,0x10,0x14,0x14,0x10,0x09,0x10,0x84,0x04,0x2f,0xe1,0xc6,0x10,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x37,0x02,0x48,0x3a,0x5c,0xfe, +0xfa,0x9a,0x3a,0x32,0x40,0x3d,0x90,0x9d,0x92,0x38,0x2e,0xfe,0x3c,0x1e,0x01,0x28,0x03,0x82,0xc5,0x19,0x8c,0x18,0xae,0x9c,0xfc,0x95,0xbb,0x22,0x00,0x02,0xff,0x44,0xfe,0x1e,0x02,0x8e,0x06,0x02,0x00,0x1b,0x00,0x23,0x00,0x68,0xb7,0x15,0x05,0x07,0x13,0x1c,0x0a,0x1e,0x07,0xb8,0xff,0xc0,0x40,0x30,0x13,0x16,0x48,0x07,0x08,0x08, +0x22,0x1e,0x96,0x0f,0x13,0x1f,0x13,0x02,0x09,0x03,0x13,0x22,0x96,0x0d,0x1c,0x00,0x02,0x95,0x40,0x19,0x01,0x1c,0x15,0x0a,0x05,0x10,0x07,0x00,0x00,0x05,0x20,0x84,0x10,0x05,0x84,0x15,0x24,0x25,0x15,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xd4,0xe1,0x10,0xc2,0x2f,0xc6,0x11,0x12,0x39,0x11,0x33,0x00,0x3f,0x1a,0xfd,0xc6,0x3f, +0xed,0x2f,0x5f,0x5e,0x5d,0xed,0x11,0x39,0x2f,0xcd,0x2b,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x16,0x17,0x15,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x02,0x8e,0x32,0x3e,0xaa,0x7a,0x74,0x7a, +0x80,0x10,0xa3,0x82,0x69,0x86,0xb4,0x91,0x27,0x21,0xb8,0x8d,0x4c,0x2c,0xfe,0x43,0x23,0x25,0xae,0x63,0x8e,0x05,0x5c,0x1b,0xdf,0xfb,0x2a,0x2c,0x54,0xa6,0x68,0x34,0x81,0x99,0x79,0x5d,0x6d,0x91,0x04,0x04,0xb2,0xa2,0xc0,0x12,0xf9,0x78,0x06,0x70,0x5a,0x00,0x00,0x01,0x00,0x38,0xfe,0xd1,0x02,0x8e,0x04,0x16,0x00,0x14,0x00,0x30, +0x40,0x18,0x03,0x04,0x07,0x04,0x13,0x95,0x01,0x15,0x0d,0x0b,0x95,0x10,0x10,0x14,0x14,0x04,0x01,0x13,0x84,0x07,0x07,0x16,0x06,0x0d,0x2f,0x33,0x12,0x39,0x2f,0xf1,0x39,0x39,0xc1,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x31,0x30,0x21,0x23,0x15,0x07,0x11,0x21,0x35,0x21,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36, +0x33,0x20,0x11,0x11,0x33,0x02,0x8e,0xb1,0xa1,0xfe,0xfc,0x01,0x04,0x48,0x52,0x3e,0x2c,0x39,0x60,0x01,0x0c,0xb1,0xfa,0x35,0x01,0x2f,0x8c,0x02,0x41,0x67,0x58,0x22,0x8c,0x20,0xfe,0xd4,0xfd,0xa2,0x00,0x01,0x00,0x2b,0xfe,0x1e,0x02,0x81,0x05,0x2f,0x00,0x14,0x00,0x2e,0x40,0x17,0x14,0x12,0x95,0x02,0x1c,0x0a,0x0e,0x0b,0x06,0x95, +0x07,0x0f,0x00,0x00,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x84,0x04,0x2f,0xe9,0x33,0x32,0x33,0x32,0x2f,0x2f,0x33,0x2f,0x00,0x3f,0xed,0x33,0x32,0xc4,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4, +0x01,0x02,0xfe,0xfe,0x46,0x51,0x3b,0x30,0xfe,0x40,0x22,0x01,0x2e,0x04,0x28,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfb,0xf4,0x67,0x57,0x23,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0xa4,0x04,0x00,0x00,0x15,0x00,0x1d,0x00,0x4c,0x40,0x2b,0x01,0x10,0x14,0x18,0x04,0x0a,0x95,0x40,0x0d,0x0e,0x07,0x0d,0x95,0x08,0x30,0x13,0x04,0x0e,0x1b,0x95, +0x07,0x16,0x02,0x15,0x0e,0x0f,0x00,0x01,0x01,0x04,0x17,0x03,0x13,0x84,0x12,0x12,0x1f,0x0c,0x18,0x0a,0x0f,0x84,0x0e,0x2f,0xe1,0x39,0x39,0xc6,0x12,0x39,0x2f,0xe1,0x17,0x39,0x10,0xcd,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x17,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11, +0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0x35,0x21,0x15,0x10,0x33,0x32,0x36,0x04,0xa4,0x98,0xa4,0x04,0x66,0xd5,0xfe,0x8f,0x97,0x97,0xa4,0x02,0x0c,0xa4,0x98,0xfe,0xc4,0xfd,0xf4,0xfa,0x78,0x9a,0x01,0xdb,0xfe,0x25,0xa2,0xba,0x01,0xb4,0x3f,0x8b,0x01,0x9a,0xfe,0x66,0x01,0x9a,0xfe,0x66,0xb4,0x29,0x25, +0xfe,0xbc,0xb0,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x62,0x04,0x00,0x00,0x1b,0x00,0x38,0x40,0x1e,0x09,0x95,0x17,0x16,0x04,0x0e,0x11,0x03,0x10,0x0f,0x01,0x95,0x02,0x0f,0x12,0x0e,0x11,0x14,0x84,0x0c,0x0c,0x1d,0x1a,0x00,0x04,0x04,0x01,0x06,0x84,0x1a,0x2f,0xf1,0x33,0xc2,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x32,0xc6,0x32, +0x00,0x3f,0xed,0x3f,0x17,0x32,0x3f,0xed,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x06,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x27,0x35,0x21,0x15,0x23,0x16,0x11,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x01,0x1c,0xbc,0x01,0x7f,0xdb,0xbd,0xa1,0xa6,0xb6,0xda,0x01,0x7e,0xb8,0xb8,0xfe,0xec,0xf2,0xed,0xfe,0xf1,0x03,0x74,0x8c,0x8e,0x64, +0xfe,0xe6,0xaf,0xd3,0xcc,0xb6,0x01,0x1a,0x64,0x8e,0x8c,0x89,0xfe,0xfb,0xe3,0xfe,0xe5,0x01,0x16,0xe1,0x01,0x07,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0x16,0x04,0x18,0x00,0x17,0x00,0x2a,0x40,0x16,0x04,0x95,0x15,0x16,0x00,0x0f,0x0c,0x0a,0x95,0x0f,0x10,0x0c,0x0c,0x01,0x12,0x83,0x07,0x07,0x19,0x01,0x84,0x00,0x2f,0xe1,0x12,0x39, +0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xed,0x31,0x30,0x13,0x33,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x20,0x11,0x90,0xa3,0x01,0x0b,0x93,0x9f,0x60,0x56,0x3b,0x35,0x3e,0x4f,0x96,0xa9,0xff,0x00,0xe3,0xfe,0x5d,0x04,0x00,0xfd,0xb4,0xfe,0xbe,0xdb, +0xc1,0xba,0xc8,0x1c,0x8a,0x1a,0xfe,0xe7,0xeb,0xfd,0xfe,0xd1,0x01,0xbe,0x00,0x01,0x00,0x0c,0x00,0x00,0x03,0xc8,0x04,0x00,0x00,0x0b,0x00,0x1d,0x40,0x0d,0x00,0x05,0x0a,0x09,0x15,0x0a,0x0f,0x01,0x00,0x00,0x0d,0x08,0x09,0x2f,0x33,0x11,0x33,0x2f,0x32,0x00,0x3f,0x3f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06, +0x07,0x01,0x23,0x01,0x33,0x03,0xc8,0xb4,0xfe,0xfc,0x1c,0x06,0x04,0x09,0x1b,0xfe,0xf2,0xac,0x01,0x96,0xa4,0x02,0xe8,0x51,0x3e,0x43,0x48,0xfd,0x14,0x04,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x00,0x1b,0x00,0x3c,0x40,0x20,0x00,0x04,0x09,0x0c,0x16,0x1a,0x06,0x12,0x11,0x15,0x12,0x0f,0x1b,0x1a,0x04,0x09, +0x08,0x16,0x13,0x12,0x0c,0x16,0x04,0x0c,0x03,0x11,0x01,0x00,0x00,0x1d,0x10,0x11,0x2f,0x33,0x11,0x33,0x2f,0x32,0x12,0x17,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16, +0x17,0x33,0x36,0x37,0x13,0x33,0x05,0xb0,0xac,0xd3,0x0b,0x03,0x09,0x02,0x10,0xec,0x95,0xd5,0x0a,0x04,0x08,0x02,0x0e,0xd2,0xa2,0x01,0x36,0xa8,0xd2,0x0c,0x05,0x04,0x03,0x12,0xe5,0xa4,0x03,0x02,0x28,0x34,0x2c,0x32,0xfd,0x00,0x03,0x04,0x24,0x38,0x27,0x35,0xfc,0xfc,0x04,0x00,0xfd,0x23,0x2b,0x34,0x24,0x39,0x02,0xdf,0x00,0x01, +0x00,0x0c,0x00,0x00,0x03,0xd1,0x05,0xec,0x00,0x14,0x00,0x2c,0x40,0x17,0x00,0x15,0x09,0x15,0x04,0x0a,0x14,0x0f,0x0f,0x0f,0x11,0x95,0x0c,0x00,0x0f,0x0a,0x0f,0x14,0x03,0x09,0x00,0x16,0x09,0x2f,0x10,0xc6,0x11,0x17,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x33,0x33,0x3f,0x3f,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07, +0x01,0x23,0x01,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x03,0xd1,0xb5,0xfe,0xea,0x02,0x10,0x06,0x06,0x11,0xfe,0xdf,0xaa,0x01,0xdc,0x7e,0xe4,0x3d,0x2b,0x34,0x2a,0x7f,0x3f,0x54,0x03,0x14,0x07,0x47,0x18,0x34,0xfc,0xea,0x04,0xae,0x01,0x3e,0x0d,0x93,0x12,0x98,0xc8,0x00,0x01,0x00,0x0a,0x00,0x00,0x03,0x4c,0x04,0x00, +0x00,0x0d,0x00,0x30,0x40,0x1a,0x00,0x01,0x04,0x09,0x04,0x05,0x03,0x15,0x05,0x0f,0x09,0x01,0x00,0x04,0x40,0x05,0x05,0x01,0x84,0x04,0x0e,0x0f,0x04,0x84,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc1,0x18,0x2f,0x1a,0x10,0xcd,0x12,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x13,0x16,0x17,0x33,0x36, +0x37,0x13,0x03,0x4c,0xfe,0xb0,0xa4,0xfe,0xb2,0xb0,0xb8,0x29,0x11,0x04,0x18,0x20,0xbc,0x04,0x00,0xfd,0x77,0xfe,0x89,0x01,0x77,0x02,0x89,0xfe,0x7f,0x57,0x2e,0x46,0x3f,0x01,0x81,0x00,0x00,0x01,0x00,0x21,0xfe,0xfa,0x03,0xfe,0x04,0x00,0x00,0x16,0x00,0x36,0x40,0x0f,0x16,0x14,0x02,0x09,0x0f,0x95,0x08,0x15,0x0e,0x0a,0x95,0x0c, +0x0f,0x16,0x05,0xb8,0x01,0x03,0x40,0x09,0x12,0x0a,0x0e,0x10,0x10,0x18,0x0b,0x0f,0x09,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xc6,0x32,0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2f,0xdd,0xc6,0x31,0x30,0x05,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x06,0x15,0x14,0x33,0x32,0x37,0x03, +0xfe,0x34,0x41,0x58,0x6b,0x09,0xfd,0x52,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x02,0x58,0x22,0x5a,0x2c,0x30,0xee,0x18,0x6f,0x51,0x22,0x24,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0x78,0x3d,0x69,0x1b,0x00,0x00,0x02,0x00,0x21,0xff,0x81,0x04,0x25,0x04,0x00,0x00,0x17,0x00,0x1e,0x00,0x7d,0x40,0x32,0x07,0x28,0x09,0x0d,0x48,0x04, +0x1e,0x14,0x1e,0x02,0x34,0x0d,0x44,0x0d,0x02,0x06,0x0d,0x16,0x0d,0x26,0x0d,0x03,0x1d,0x96,0x40,0x11,0x0d,0x80,0x02,0x00,0x18,0x00,0x07,0x0d,0x95,0x06,0x15,0x0c,0x08,0x95,0x0a,0x0f,0x18,0x00,0x1b,0x02,0x0e,0x05,0x14,0x02,0xb8,0x01,0x03,0x40,0x0b,0x0f,0x03,0x01,0x03,0x03,0x14,0x0d,0x08,0x0c,0x0c,0x14,0xb8,0x01,0x03,0xb5, +0x1b,0x1b,0x20,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x39,0x39,0x10,0xce,0x1a,0x10,0xdc,0x1a,0xed,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x00,0x2b,0x21,0x06,0x07,0x23,0x36,0x37,0x21,0x35,0x01,0x21,0x35, +0x21,0x15,0x01,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x35,0x34,0x23,0x22,0x02,0x06,0x0f,0x03,0x8e,0x04,0x0d,0xfe,0xaa,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x90,0x3d,0xca,0x78,0x76,0x8e,0xac,0x9c,0xaa,0xac,0xb7,0x78,0x9a,0x46,0x39,0x48,0x37,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0x8f,0x9f,0x78, +0x5c,0x6a,0x7c,0x8c,0x5a,0x54,0x00,0x01,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x00,0x18,0x00,0x44,0x40,0x24,0x0b,0x0a,0x96,0x40,0x11,0x0e,0x17,0x11,0x91,0x09,0x30,0x01,0x03,0x95,0x17,0x1c,0x10,0x0c,0x95,0x0e,0x0f,0x11,0x0b,0x0b,0x06,0x00,0x0c,0x10,0x10,0x14,0x83,0x06,0x06,0x1a,0x0d,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1, +0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x23,0xa5,0xb1,0xae,0xdf,0xde,0xce,0x52,0x01,0x80,0xfd,0xbe,0x03,0x2d,0xfe, +0x77,0xda,0xea,0xfe,0xbc,0xf7,0xb6,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x95,0xa6,0x33,0x02,0x14,0x8c,0x33,0xfd,0xe1,0x1a,0xea,0xb4,0xcc,0xfe,0xf7,0x00,0x02,0xff,0xea,0xfe,0x21,0x03,0x8c,0x04,0x00,0x00,0x20,0x00,0x29,0x00,0xa0,0xb5,0x19,0x20,0x0b,0x01,0x4d,0x14,0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x01,0x4d,0x02,0x00,0x23,0x1e,0x0c, +0x0a,0x20,0xb8,0xff,0xc0,0x40,0x47,0x12,0x16,0x48,0x20,0x00,0x04,0x23,0x95,0x0f,0x0a,0x1f,0x0a,0x02,0x09,0x03,0x0a,0x0a,0x04,0x13,0x12,0x96,0x40,0x19,0x40,0x09,0x0c,0x48,0x19,0x16,0x04,0x19,0x96,0x09,0x30,0x28,0x95,0x04,0x1c,0x18,0x14,0x95,0x16,0x0f,0x19,0x13,0x13,0x0e,0x07,0x14,0x18,0x18,0x1c,0x21,0x0c,0x0e,0x26,0x1e, +0x02,0x1c,0x07,0x20,0x20,0x1c,0x83,0x0e,0x0e,0x2b,0x15,0x26,0x84,0x07,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x2b,0x1a,0xed,0x39,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0xed,0x10,0xd4,0xcd, +0x2b,0x11,0x39,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x2b,0x2b,0x01,0x26,0x27,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x07,0x16,0x17,0x25,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x03,0x8c,0x55,0x64,0xa6,0xfe,0xfe,0x94,0xad,0xb0, +0x8b,0xb3,0xc8,0x20,0xe1,0xcb,0x52,0x01,0x80,0xfd,0xbe,0x03,0x2d,0xfe,0x77,0xd6,0xee,0x43,0x3e,0x29,0xfe,0xc2,0xa8,0x81,0x4d,0x59,0xb4,0xab,0xfe,0x21,0x4f,0x46,0x95,0x7c,0x67,0x64,0x82,0x76,0x3e,0x46,0x92,0xa3,0x33,0x02,0x14,0x8c,0x33,0xfd,0xe1,0x1a,0xe7,0xb1,0x75,0x6b,0x2e,0x21,0x39,0x5c,0x32,0x28,0x5e,0x00,0x00,0x01, +0x00,0x1c,0x00,0x00,0x02,0xe8,0x06,0x02,0x00,0x19,0x00,0x2a,0x40,0x15,0x13,0x08,0x10,0x01,0x15,0x0d,0x0b,0x95,0x10,0x01,0x00,0x84,0x01,0x01,0x0d,0x13,0x83,0x08,0x08,0x1b,0x0d,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x36,0x36,0x35,0x34, +0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x01,0x89,0xa3,0x4c,0x6e,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x50,0x3f,0x01,0xee,0x87,0xa2,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x83,0x6f,0x00,0x01,0x00,0x04,0x00,0x00,0x02,0xcf, +0x06,0x02,0x00,0x19,0x00,0x2e,0x40,0x18,0x14,0x05,0x17,0x0d,0x15,0x4f,0x00,0x01,0x00,0x02,0x95,0x17,0x01,0x0c,0x84,0x0d,0x0d,0x14,0x00,0x00,0x1b,0x05,0x83,0x14,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15, +0x11,0x23,0x11,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x02,0xcf,0x87,0x94,0x7a,0x90,0x32,0x72,0x70,0x48,0xa4,0x39,0x5c,0x7a,0x4f,0xf0,0xc0,0x94,0x87,0x05,0x29,0x4e,0x78,0x59,0x38,0x72,0x75,0x73,0xa2,0x84,0xfe,0x12,0x01,0xee,0x5f,0x82,0x5c,0x79,0x9f,0x5f,0x95,0xcb,0x3e,0x00,0x00,0x01,0x00,0x00,0xff,0xea, +0x02,0xcb,0x05,0xec,0x00,0x19,0x00,0x30,0x40,0x19,0x15,0x06,0x18,0x0d,0x40,0x01,0x01,0x01,0x03,0x95,0x18,0x16,0x0d,0x00,0x0e,0x84,0x0d,0x0d,0x01,0x15,0x83,0x06,0x06,0x1b,0x01,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x5d,0x11,0x12,0x39,0x39,0x31,0x30,0x35,0x35,0x16,0x33,0x32,0x36,0x35,0x34, +0x26,0x27,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x86,0x94,0x7a,0x91,0x3c,0x68,0x6f,0x4a,0xa4,0x3e,0x58,0x7a,0x4f,0xef,0xc2,0x93,0x27,0x9b,0x4e,0x76,0x5c,0x45,0x6e,0x6b,0x73,0xa0,0x87,0x01,0xee,0xfe,0x12,0x5e,0x88,0x58,0x77,0xa0,0x5f,0x97,0xc9,0x00,0x00,0x01,0x00,0x60,0xfe,0x21, +0x03,0x60,0x04,0x18,0x00,0x13,0x00,0x2e,0x40,0x1b,0x10,0x13,0x20,0x13,0x30,0x13,0x03,0x13,0x11,0x95,0x02,0x1c,0x3f,0x0b,0x01,0x0b,0x0d,0x95,0x08,0x10,0x0b,0x13,0x13,0x15,0x0f,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x01,0x06,0x23,0x22,0x02,0x11,0x10,0x00,0x33,0x32, +0x17,0x15,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x03,0x60,0x84,0x9c,0xe8,0xf8,0x01,0x07,0xf7,0x87,0x7b,0x7e,0x84,0xfe,0xac,0x01,0x4a,0x8c,0x80,0xfe,0x77,0x56,0x01,0x7b,0x01,0x6c,0x01,0x7f,0x01,0x91,0x41,0xa4,0x5b,0xfd,0x86,0xfd,0x96,0x66,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x92,0x06,0x02,0x00,0x0b,0x00,0x15,0x00,0x21, +0x00,0x3f,0x40,0x24,0x16,0x63,0x40,0x1c,0x06,0x00,0x1c,0x63,0x14,0x30,0x11,0x95,0x00,0x16,0x0c,0x95,0x40,0x06,0x01,0x1f,0x62,0x19,0x0f,0x14,0x19,0x62,0x08,0x30,0x09,0x83,0x14,0x14,0x23,0x0f,0x83,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31, +0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x03,0x22,0x02,0x11,0x10,0x21,0x32,0x12,0x11,0x10,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x74,0xfe,0xfe,0xfe,0xee,0x01,0x1b,0x01,0x04,0x01,0x02,0x01,0x11,0xfe,0xe6,0xff,0xb4,0xbd,0x01,0x71,0xb4,0xbd,0xfe,0x8f,0x2f,0x40,0x40,0x2f, +0x2e,0x43,0x43,0x18,0x01,0x8c,0x01,0x76,0x01,0x7c,0x01,0x9c,0xfe,0x76,0xfe,0x86,0xfe,0x83,0xfe,0x67,0x05,0x8f,0xfe,0xb3,0xfe,0xc8,0xfd,0x80,0x01,0x4c,0x01,0x38,0x02,0x81,0xfd,0x0e,0x42,0x2f,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x00,0x03,0x00,0xa6,0x00,0x00,0x03,0x7f,0x04,0x00,0x00,0x0d,0x00,0x14,0x00,0x1b,0x00,0x40,0x40,0x23, +0x08,0x15,0x95,0x40,0x0f,0x01,0x00,0x0f,0x95,0x09,0x30,0x16,0x95,0x00,0x15,0x0e,0x95,0x01,0x0f,0x08,0x0a,0x0f,0x12,0x83,0x05,0x05,0x0a,0x83,0x19,0x19,0x1d,0x0f,0x16,0x84,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x33,0x11, +0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0x01,0x56,0xa4,0xb0,0xac,0xdb,0xca,0xaf,0xbc,0xa2,0xbe,0xb8,0xa8,0xba,0xd3,0xe3,0x04,0x00,0x85,0x79,0xac,0x35,0x05,0x27,0xca,0x89,0xa2,0x03,0x74,0xfe,0xe2,0x94,0x8a,0xfe,0x57,0xfe,0xc1, +0x9d,0xa2,0x00,0x02,0x00,0x5c,0xff,0xe8,0x04,0x02,0x04,0x18,0x00,0x10,0x00,0x24,0x00,0x42,0x40,0x24,0x00,0x12,0x95,0x40,0x11,0x06,0x0c,0x11,0x95,0x0c,0x30,0x18,0x95,0x0c,0x16,0x1e,0x95,0x06,0x10,0x00,0x0f,0x12,0x12,0x15,0x09,0x83,0x1b,0x1b,0x26,0x0f,0x21,0x83,0x03,0x15,0x83,0x0f,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f, +0xe1,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x26,0x35,0x34,0x25,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x01,0x2f,0xbd,0xd9,0xb5,0xee,0x01, +0x14,0xfe,0xe1,0xf3,0xc0,0xd4,0x02,0x10,0x56,0xfe,0xee,0x81,0x71,0xa6,0xbe,0xbf,0xa3,0x68,0x78,0x88,0x78,0x02,0x14,0x04,0x3d,0xa9,0x7e,0x9c,0xfe,0xe6,0xf4,0xf5,0xfe,0xd3,0x9e,0x8a,0xce,0x78,0x8e,0xaa,0x4f,0x5d,0xd2,0xc0,0xb9,0xd1,0x54,0x44,0x48,0x58,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x54,0x04,0xe2,0x00,0x27,0x00,0x57, +0x40,0x1c,0x12,0x95,0x40,0x15,0x1e,0x18,0x15,0x95,0x08,0x30,0x16,0x11,0x0f,0x95,0x18,0x16,0x07,0x09,0x00,0x02,0x96,0x25,0x09,0x95,0x1e,0x10,0x00,0x22,0xb8,0x01,0x03,0x40,0x10,0x04,0x06,0x13,0x13,0x11,0x0c,0x06,0x06,0x16,0x84,0x11,0x11,0x29,0x0c,0x83,0x1b,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x10, +0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x2f,0xfd,0xc6,0x10,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x04, +0x54,0x30,0x2a,0x5e,0x16,0x06,0x9c,0x8f,0xa8,0xd1,0xc5,0xa7,0x6e,0x4b,0xdf,0x01,0x7f,0xaf,0xb8,0xec,0xfe,0xe6,0x01,0x34,0xf5,0x51,0x49,0x05,0x70,0x56,0x3c,0x34,0x04,0x52,0x1a,0x76,0x42,0x68,0x06,0x48,0xe1,0xb3,0xb8,0xd0,0x26,0x01,0x04,0x8b,0xfe,0x17,0x56,0x01,0x18,0xf0,0xef,0x01,0x39,0x16,0x22,0x03,0x4c,0x6f,0x1a,0x00, +0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xe2,0x04,0x00,0x00,0x0b,0x00,0x35,0x40,0x1c,0x03,0x95,0x40,0x08,0x06,0x05,0x08,0x95,0x0c,0x30,0x0b,0x00,0x06,0x05,0x15,0x06,0x0f,0x09,0x08,0x04,0x00,0x84,0x01,0x01,0x0d,0x04,0x84,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a, +0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xe2,0xa4,0xfe,0x0c,0xa4,0xa4,0x01,0xf4,0xa4,0x01,0xc6,0xfe,0x3a,0x04,0x00,0xfe,0x52,0x01,0xae,0x00,0x00,0x03,0xff,0x18,0xfe,0x1e,0x02,0x38,0x05,0xd9,0x00,0x0b,0x00,0x1d,0x00,0x25,0x00,0x70,0xb7,0x1e,0x0e,0x0c,0x20,0x1b,0x18,0x16,0x1d,0xb8, +0xff,0xc0,0x40,0x36,0x13,0x16,0x48,0x1d,0x0c,0x0c,0x10,0x20,0x96,0x0f,0x16,0x1f,0x16,0x02,0x09,0x03,0x16,0x24,0x96,0x10,0x1c,0x06,0x63,0x40,0x00,0x19,0x0f,0x09,0x62,0x03,0x18,0x1b,0x03,0x62,0xff,0x30,0x0c,0x0c,0x1b,0x0e,0x1b,0x22,0x84,0x13,0x1e,0x1b,0x84,0x18,0x26,0x27,0x18,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x33,0x18, +0xd4,0xe1,0x12,0x39,0x10,0xc1,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0xd6,0x1a,0xed,0x3f,0xed,0x2f,0x5f,0x5e,0x5d,0xed,0x12,0x39,0x2f,0xcd,0x2b,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x26,0x27,0x02,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11, +0x33,0x11,0x16,0x17,0x25,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0xfa,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x01,0x11,0x7c,0x7e,0x2d,0xfe,0xf7,0x68,0x88,0xb5,0x91,0x27,0x21,0xa4,0x7a,0x74,0xfe,0x6e,0x24,0x24,0xae,0x62,0x8f,0x05,0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xf9,0x98,0x68,0x34,0xfe,0xe6,0x78,0x5e,0x6d,0x91,0x04, +0x04,0x12,0xfb,0xc2,0x2c,0x54,0x26,0x06,0x70,0x5a,0x00,0x01,0x00,0x04,0xfe,0x14,0x03,0x56,0x04,0x00,0x00,0x0c,0x00,0x2a,0x40,0x16,0x00,0x1c,0x02,0x06,0x0a,0x03,0x07,0x05,0x15,0x0c,0x0f,0x07,0x0f,0x0c,0x84,0x06,0x02,0x0a,0x0a,0x0e,0x05,0x07,0x2f,0xc6,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x3f, +0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x03,0x56,0xa4,0x04,0xfe,0x52,0xd7,0x01,0xdb,0xfe,0x00,0xe6,0x01,0xc4,0x04,0xa4,0xfe,0x14,0x03,0xc1,0xfe,0x2b,0x01,0xee,0x02,0x12,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xf8,0x04,0x00,0x00,0x05,0x00,0x19,0x40,0x0c,0x04,0x95, +0x01,0x15,0x02,0x0f,0x00,0x00,0x07,0x04,0x84,0x01,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x02,0xf8,0xfd,0xae,0xa4,0x01,0xae,0x04,0x00,0xfc,0x8c,0x00,0x02,0x00,0x60,0xfe,0x29,0x05,0x21,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x05,0x1b,0x13,0x07,0x10,0x24,0x95,0x0a, +0x16,0x1e,0x95,0x10,0x10,0x00,0x02,0x95,0x17,0x01,0x00,0x00,0x05,0x84,0x1a,0x13,0x07,0x07,0x28,0x21,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32, +0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xa4,0x04,0x6e,0xee,0xc2,0xea,0xff,0xd6,0xd3,0x60,0x04,0xb4,0x8a,0x48,0x2f,0xfe,0x4b,0xa7,0x7b,0x98,0xaa,0xa7,0x84,0x8b,0xae,0x05,0x5c,0x1b,0xcf,0xf9,0x81,0x02,0x85,0xc6,0x01,0x12,0xee,0x01, +0x00,0x01,0x30,0xa6,0x01,0x40,0x99,0xb7,0x12,0xfb,0xdb,0x9b,0x7b,0xad,0xde,0xc4,0xb3,0xc7,0xc2,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x02,0xe8,0x06,0x02,0x00,0x1f,0x00,0x50,0x40,0x2a,0x03,0x00,0x06,0x95,0x40,0x09,0x17,0x05,0x09,0x95,0x08,0x30,0x1a,0x0f,0x17,0x05,0x15,0x14,0x12,0x95,0x17,0x01,0x02,0x02,0x1a,0x04,0x07,0x07, +0x14,0x09,0x00,0x04,0x84,0x05,0x05,0x14,0x1a,0x83,0x0f,0x0f,0x21,0x14,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x34,0x36,0x37,0x36, +0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x89,0xc5,0xc5,0xa3,0xae,0xae,0x51,0x69,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x4e,0x41,0x02,0x04,0x8b,0xfe,0x87,0x01,0x79,0x8b,0x7a,0x9d,0x68,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f, +0x7b,0x4b,0x7d,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x02,0xcf,0x06,0x02,0x00,0x1f,0x00,0x4e,0x40,0x2a,0x0e,0x0b,0x11,0x95,0x40,0x14,0x1d,0x10,0x14,0x95,0x08,0x30,0x10,0x15,0x4f,0x00,0x01,0x00,0x02,0x95,0x1d,0x01,0x13,0x13,0x10,0x1a,0x0c,0x0c,0x00,0x14,0x0b,0x10,0x84,0x0f,0x0f,0x05,0x00,0x00,0x21,0x05,0x83,0x1a,0x2f,0xe1, +0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17, +0x02,0xcf,0x87,0x94,0x7a,0x90,0x32,0x72,0x6b,0x4d,0xb0,0xb0,0xa4,0xc6,0xc6,0x41,0x54,0x7a,0x4f,0xf0,0xc0,0x94,0x87,0x05,0x29,0x4e,0x78,0x59,0x38,0x72,0x75,0x6e,0x9d,0x78,0x8b,0xfe,0x87,0x01,0x79,0x8b,0x54,0x80,0x53,0x79,0x9f,0x5f,0x95,0xcb,0x3e,0x00,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x27,0x05,0xec,0x00,0x15,0x00,0x22, +0x00,0x25,0x00,0x4a,0x40,0x29,0x11,0x05,0x0e,0x20,0x95,0x08,0x16,0x25,0x01,0x95,0x04,0x15,0x00,0x23,0x95,0x14,0x0f,0x1a,0x95,0x0e,0x10,0x12,0x00,0x11,0x14,0x16,0x03,0x01,0x25,0x84,0x04,0x04,0x0b,0x23,0x00,0x03,0x03,0x27,0x1d,0x83,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0xc6,0x32,0x12,0x39,0x2f,0xe1,0x32,0x17,0x39,0x00,0x3f,0x3f, +0xed,0x3f,0xed,0x39,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x21,0x11,0x07,0x27,0xfd,0x9f,0x02,0x58,0xfc,0x4e,0x04,0x72,0xee,0xc2, +0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x17,0xfc,0x45,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0x02,0xc9,0xfd,0xdb,0x03,0xd1,0xfc,0xbb,0x8c,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0xfd,0xd7,0x87,0x7f,0xb1,0xdf,0xc3,0xac,0xce,0xcb,0x02,0x37,0xfd,0x0f,0x00,0x00,0x02,0x00,0x60,0xfe,0x21, +0x07,0x77,0x05,0xec,0x00,0x29,0x00,0x36,0x00,0x72,0x40,0x40,0x0b,0x0a,0x96,0x40,0x22,0x1f,0x28,0x22,0x96,0x08,0x30,0x01,0x03,0x95,0x28,0x1c,0x1c,0x10,0x19,0x34,0x95,0x13,0x16,0x0e,0x15,0x21,0x0c,0x95,0x1f,0x0f,0x2e,0x95,0x19,0x10,0x1d,0x00,0x22,0x0b,0x0b,0x06,0x01,0x0c,0x21,0x21,0x25,0x01,0x01,0x1c,0x1f,0x2a,0x03,0x0e, +0x84,0x0f,0x0f,0x16,0x25,0x83,0x06,0x06,0x38,0x31,0x83,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x17,0x39,0x39,0x2f,0x10,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x39,0x3f,0x3f,0xed,0x12,0x39,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x16,0x33, +0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xee,0xa4,0xb2,0xae,0xdf,0xdf,0xcd,0x52,0x01,0x7f,0xfd,0xbe, +0xa4,0x04,0x72,0xee,0xc2,0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x2e,0xfe,0x76,0xd7,0xec,0xfe,0xbd,0xf6,0xb6,0xfe,0xe4,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x95,0xa6,0x33,0x02,0x14,0xfc,0x8c,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0x33,0xfd,0xe1,0x1a, +0xe9,0xb5,0xcc,0xfe,0xf7,0x03,0xb6,0x87,0x7f,0xb1,0xdf,0xc3,0xac,0xce,0xcb,0x00,0x00,0x04,0x00,0x60,0xff,0x81,0x07,0xdb,0x05,0xec,0x00,0x22,0x00,0x2f,0x00,0x32,0x00,0x39,0x00,0xcb,0xb9,0x00,0x30,0xff,0xd8,0x40,0x4e,0x0b,0x10,0x01,0x4c,0x19,0x18,0x0b,0x10,0x01,0x4c,0x04,0x39,0x14,0x39,0x24,0x39,0x03,0x34,0x19,0x44,0x19, +0x02,0x06,0x19,0x16,0x19,0x26,0x19,0x03,0x09,0x13,0x07,0x10,0x2d,0x95,0x0a,0x16,0x02,0x00,0x00,0x32,0x33,0x03,0x06,0x19,0x38,0x96,0x40,0x1c,0x80,0x19,0x95,0x06,0x15,0x18,0x30,0x95,0x16,0x0f,0x27,0x95,0x40,0x10,0x10,0x14,0x00,0x30,0x18,0x18,0x1f,0x33,0x00,0x36,0x02,0x1a,0x05,0x1f,0x02,0xb8,0x01,0x03,0x40,0x0b,0x03,0x0f, +0x03,0x1f,0x03,0x02,0x0a,0x03,0x32,0x1f,0x03,0xb8,0x01,0x03,0x40,0x11,0x08,0x30,0x19,0x13,0x16,0x23,0x03,0x32,0x84,0x06,0x06,0x1f,0x0d,0x30,0x18,0x18,0x1f,0xb8,0x01,0x03,0xb5,0x36,0x36,0x3b,0x2a,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x32,0x2b,0x01,0x5f,0x5e,0x5d,0x10, +0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0xc0,0x18,0x2f,0x32,0x00,0x3f,0x3f,0x1a,0xed,0x3f,0xed,0x39,0x3f,0xfd,0x1a,0xdc,0x1a,0xed,0x11,0x12,0x17,0x39,0x10,0xce,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x5e,0x5d,0x5d,0x5d,0x2b,0x2b,0x21,0x06,0x07,0x23,0x36,0x37,0x21,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33, +0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x15,0x01,0x33,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x21,0x11,0x25,0x33,0x32,0x35,0x34,0x23,0x22,0x05,0xba,0x0c,0x04,0x90,0x04,0x0f,0xfe,0x3f,0x04,0x72,0xee,0xc2,0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x17, +0xfd,0x9f,0x92,0x86,0xf9,0x76,0x8e,0xac,0x9b,0xfc,0xd8,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0x02,0xc9,0xfd,0xdb,0x01,0xd8,0xae,0xb4,0x75,0x9d,0x39,0x46,0x3b,0x44,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0x2f,0xfc,0xbb,0x01,0x2e,0x78,0x5c,0x6b,0x7b,0x01,0xd7,0x87,0x7f,0xb1,0xdf,0xc3,0xac, +0xce,0xcb,0x02,0x37,0xfd,0x0f,0x09,0x5a,0x54,0x00,0x00,0x02,0x00,0x2b,0xff,0xe8,0x04,0x94,0x05,0x2f,0x00,0x1d,0x00,0x2c,0x00,0x53,0x40,0x2d,0x11,0x17,0x25,0x2b,0x04,0x09,0x23,0x95,0x1a,0x16,0x05,0x06,0x1f,0x06,0x00,0x95,0x03,0x0f,0x0c,0x0e,0x95,0x09,0x10,0x1e,0x07,0x0c,0x11,0x83,0x2b,0x2b,0x17,0x1f,0x0c,0x0c,0x17,0x83, +0x25,0x25,0x2e,0x02,0x1f,0x00,0x06,0x84,0x03,0x2f,0xe1,0x39,0x39,0xcd,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14, +0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x23,0x11,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0xdb,0xb0,0xb0,0xa4,0x01,0x73,0x46,0x54,0x7c,0x60,0x64,0x85,0x52,0x60,0x47,0x7a,0x94,0x72,0xf1,0xef,0xfb,0xde,0x01,0x6d,0xc9,0x9f,0x9e,0x01,0x30,0x59,0x79,0x8a,0x6b,0x03,0x74,0x8c,0xfa,0x35, +0xfe,0xd1,0x18,0x2e,0xa6,0x4a,0x4f,0x3f,0x3e,0x4b,0x33,0x40,0x8c,0x62,0x84,0xaa,0xcd,0xd7,0x01,0xe8,0xfe,0x24,0x9d,0x89,0xa0,0x39,0x4b,0x30,0x38,0x8b,0x69,0x48,0x00,0x02,0x00,0x2b,0xfe,0x1e,0x04,0x3e,0x06,0x02,0x00,0x22,0x00,0x2a,0x00,0x49,0x40,0x27,0x0b,0x0d,0x95,0x08,0x1c,0x23,0x29,0x95,0x12,0x16,0x1a,0x1b,0x25,0x1b, +0x15,0x95,0x18,0x0f,0x00,0x02,0x95,0x20,0x01,0x00,0x00,0x04,0x84,0x0b,0x24,0x10,0x1c,0x1c,0x2c,0x25,0x15,0x1b,0x84,0x17,0x18,0x2f,0xcd,0xe1,0x39,0x39,0x12,0x39,0x2f,0x33,0x33,0xc4,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14, +0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x04,0x3e,0x32,0x3d,0xaa,0xb9,0x8f,0x4b,0x2c,0x32,0x3d,0xac,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xb8,0x8d,0x4c,0x2c,0xfe,0x43,0xfe, +0xfe,0x46,0x51,0x3e,0x05,0x5c,0x1b,0xdf,0xfa,0xe7,0xa3,0xbe,0x13,0x93,0x1a,0xdf,0x81,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0xa0,0xa2,0xc0,0x12,0xfa,0xa6,0x02,0xde,0xfd,0xbf,0x67,0x58,0x00,0x00,0x02,0x00,0x2b,0xff,0xe8,0x05,0xaa,0x05,0x2f,0x00,0x2b,0x00,0x34,0x00,0x77,0x40,0x41,0x22,0x13,0x24,0x13,0x00,0x2a, +0x18,0x33,0x96,0x0f,0x24,0x1f,0x24,0x02,0x24,0x24,0x18,0x2e,0x96,0x2a,0x16,0x11,0x95,0x02,0x16,0x0a,0x0b,0x0e,0x0b,0x05,0x95,0x08,0x0f,0x1b,0x1d,0x95,0x18,0x10,0x0c,0x2c,0x22,0x31,0x20,0x13,0x00,0x27,0x20,0x83,0x15,0x15,0x27,0x0e,0x1b,0x1b,0x27,0x84,0x31,0x31,0x36,0x0e,0x05,0x0b,0x84,0x07,0x08,0x2f,0xcd,0xe1,0x39,0x39, +0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0xc4,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14, +0x33,0x32,0x37,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x03,0x18,0xa0,0x8a,0xfe,0xed,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x93,0x4a,0x66,0x58,0x01,0x22,0xf3,0x87,0x66,0x72,0x81,0x9e,0xc9,0x38,0xd2, +0x86,0x75,0x93,0xbd,0x9b,0xba,0x02,0x54,0x70,0x54,0x66,0x78,0x60,0x52,0x6a,0x01,0x3d,0x02,0x4f,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xc1,0xc3,0x42,0x84,0xb0,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0x81,0x61,0x96,0x7a,0x5b,0x67,0x86,0xc6,0x42,0x3a,0x2b,0x56,0x00,0x00,0x01,0x00,0x35,0xfe,0x1e,0x05,0xc8,0x06,0x02,0x00,0x2e, +0x00,0x58,0x40,0x30,0x06,0x08,0x95,0x03,0x1c,0x28,0x2b,0x12,0x15,0x16,0x15,0x0d,0x95,0x2b,0x10,0x26,0x14,0x17,0x95,0x1a,0x0f,0x21,0x23,0x95,0x1e,0x01,0x06,0x06,0x0a,0x21,0x21,0x28,0x11,0x84,0x12,0x12,0x1a,0x00,0x84,0x0a,0x0a,0x30,0x17,0x14,0x26,0x84,0x19,0x1a,0x2f,0xcd,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f, +0xe1,0x32,0x39,0x2f,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15, +0x15,0x21,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x05,0xc8,0xbe,0xae,0x4c,0x35,0x3d,0x44,0xc9,0xed,0x7c,0xa2,0xa3,0xf0,0xa3,0xaf,0xaf,0xbf,0x97,0x4f,0x33,0x3a,0x40,0xbb,0x01,0x93,0x04,0x74,0xdc,0xa8,0xb2,0x04,0xe7,0xf7,0x1a,0x99,0x27,0x01,0x3e,0x02,0x60,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x03,0x74,0xfc,0x8c,0x03,0x74,0x8c,0x92, +0xa8,0xc8,0x16,0x94,0x1f,0xee,0x89,0xaa,0xc2,0xd8,0xce,0x00,0x00,0x01,0x00,0x98,0xff,0xe8,0x04,0x50,0x05,0xfc,0x00,0x24,0x00,0x3c,0x40,0x21,0x07,0x0d,0x18,0x1e,0x04,0x10,0x05,0x95,0x21,0x16,0x13,0x15,0x95,0x10,0x10,0x00,0x01,0x18,0x83,0x0d,0x0d,0x1e,0x00,0x13,0x13,0x1e,0x83,0x07,0x07,0x26,0x01,0x84,0x00,0x2f,0xe1,0x12, +0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x33,0x11,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x98,0xa4,0x9f,0xa0,0x01, +0x2d,0x58,0x79,0x8c,0x69,0xc8,0x9e,0x7c,0x61,0x65,0x84,0x52,0x61,0x47,0x7a,0x97,0x6f,0xf1,0xef,0xfb,0xdd,0x05,0xfc,0xfb,0x9c,0x9d,0x89,0xa0,0x39,0x4b,0x30,0x39,0x89,0x6a,0x81,0xa5,0x2e,0xa6,0x4a,0x4f,0x3f,0x3e,0x4b,0x33,0x41,0x8b,0x62,0x86,0xa8,0xcc,0xd8,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x60,0x05,0xec,0x00,0x08, +0x00,0x0b,0x00,0x2b,0x40,0x16,0x0b,0x01,0x95,0x04,0x15,0x00,0x09,0x95,0x07,0x0f,0x05,0x00,0x09,0x00,0x03,0x03,0x0d,0x01,0x07,0x0b,0x84,0x04,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xc6,0x32,0x00,0x3f,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x07,0x21,0x11,0x04,0x60,0xfd,0xa0,0x02, +0x58,0xfc,0x4e,0xa4,0x03,0x16,0xf2,0xfd,0xdc,0x03,0xd1,0xfc,0xbb,0x8c,0x05,0xec,0xfe,0x14,0x8c,0xfd,0x0f,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x03,0xc2,0x05,0x9a,0x00,0x1b,0x00,0x37,0x00,0x22,0x40,0x10,0x27,0x0e,0x40,0x26,0x12,0x0a,0x0b,0x42,0x0a,0x0b,0x03,0x00,0x1c,0x39,0x0b,0x27,0x2f,0x33,0x10,0xc6,0x32,0x00,0x3f,0xcd, +0x2b,0x00,0x18,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x13,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13, +0x03,0xc2,0xb6,0x93,0x6b,0x09,0x05,0x04,0x03,0x0f,0x73,0x91,0xb5,0x8b,0x6b,0x09,0x03,0x05,0x02,0x10,0x76,0x8c,0x6c,0x08,0x04,0x04,0x01,0x10,0x67,0x82,0xb6,0x93,0x6b,0x09,0x05,0x04,0x03,0x0f,0x73,0x91,0xb5,0x8b,0x6b,0x09,0x03,0x05,0x02,0x10,0x76,0x8c,0x6c,0x08,0x04,0x04,0x01,0x10,0x67,0x05,0x9a,0xfd,0x78,0x01,0x90,0x21, +0x3b,0x24,0x36,0xfe,0x6e,0x02,0x88,0xfe,0x5a,0x24,0x34,0x21,0x39,0x01,0xa4,0xfe,0x5a,0x20,0x38,0x16,0x42,0x01,0xa6,0xfc,0xed,0xfd,0x79,0x01,0x90,0x21,0x3b,0x24,0x36,0xfe,0x6e,0x02,0x87,0xfe,0x5b,0x24,0x35,0x21,0x3a,0x01,0xa3,0xfe,0x5b,0x20,0x39,0x17,0x42,0x01,0xa5,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x03,0x7f,0x05,0x9a, +0x00,0x07,0x00,0x0f,0x00,0x37,0x40,0x1c,0x0b,0x96,0x0e,0x08,0x0d,0x12,0x00,0x05,0x03,0x96,0x06,0x03,0x01,0x00,0x08,0x09,0x05,0x04,0x0c,0x0d,0x08,0x7f,0x09,0x09,0x11,0x0c,0x7f,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0xcd,0x32,0x3f,0x33,0xdd,0xed,0x31,0x30,0x01,0x23,0x11, +0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x03,0x7f,0x89,0xfe,0x06,0x88,0x03,0x0b,0x89,0xfe,0x06,0x88,0x03,0x0b,0x03,0xa2,0x01,0x74,0xfe,0x8c,0x01,0xf8,0xfa,0x66,0x01,0x74,0xfe,0x8c,0x01,0xf8,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x14,0x05,0xfc,0x00,0x13,0x00,0x23,0x00,0x3d,0x40,0x20,0x01,0x00, +0x14,0x96,0x15,0x15,0x1f,0x1a,0x95,0x0e,0x01,0x1f,0xec,0x07,0x16,0x01,0x14,0x11,0x83,0x18,0x14,0x18,0x14,0x1d,0x04,0x83,0x22,0x22,0x25,0x1d,0x84,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x15,0x16,0x16,0x15,0x14,0x06, +0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x35,0x36,0x36,0x35,0x34,0x23,0x22,0x11,0x11,0x10,0x21,0x32,0x36,0x35,0x10,0x02,0x9e,0xb4,0xc2,0xf7,0xcd,0xcd,0xdd,0xda,0xbc,0xa6,0xc6,0x95,0xfe,0xdf,0x78,0x98,0xd1,0xe7,0x01,0x10,0x83,0x8f,0x03,0x38,0x05,0x1d,0xd8,0xa6,0xc3,0xed,0xfb,0xea,0x02,0x8d, +0xbe,0xe4,0xb9,0x9b,0x7e,0xcc,0x78,0x82,0x14,0xa5,0x73,0xdc,0xfe,0xda,0xfd,0x87,0xfe,0xa6,0x90,0x87,0x01,0x30,0x00,0x02,0x00,0x14,0xff,0xe8,0x04,0xc4,0x06,0x02,0x00,0x2a,0x00,0x32,0x00,0x6b,0x40,0x3b,0x02,0x20,0x00,0x28,0x2b,0x00,0xec,0x2a,0x2b,0xec,0x20,0x20,0x1d,0x10,0x0e,0x95,0x13,0x10,0x2d,0x95,0x26,0x01,0x1d,0xec, +0x05,0x16,0x30,0x84,0x23,0x40,0x0b,0x0e,0x48,0x23,0x23,0x2b,0x0c,0x2a,0x2a,0x28,0x02,0x28,0x08,0x20,0x2b,0x1a,0x84,0x08,0x16,0x84,0x0c,0x0c,0x10,0x28,0x84,0x2b,0x2b,0x34,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x11,0x12,0x39,0x10,0xca,0x2f,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x00,0x3f,0xed,0x3f, +0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x06,0x07,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x13,0x26,0x00,0x35,0x34,0x36,0x33,0x20,0x13,0x36,0x37,0x05,0x02,0x23,0x22, +0x06,0x15,0x14,0x16,0x04,0xc4,0x42,0x59,0x0b,0xfe,0xed,0xea,0xbe,0xdc,0x16,0x15,0x58,0x26,0x20,0x32,0x31,0x65,0x7a,0x15,0x16,0x89,0x75,0x9e,0xb5,0x09,0xeb,0xfe,0xda,0xad,0x87,0x01,0x70,0x13,0x4d,0x4c,0xfe,0xc3,0x0e,0xd3,0x3f,0x4f,0xc7,0x02,0xe6,0x19,0x0f,0xfe,0xa6,0xfe,0x84,0xdc,0xc1,0x55,0x81,0x81,0x3a,0x78,0x11,0x89, +0x12,0x8a,0x6b,0x3f,0x81,0x81,0x50,0x84,0x97,0x01,0x29,0x01,0x12,0x08,0x01,0x18,0xd0,0x97,0xc9,0xfd,0x4a,0x0c,0x1f,0x35,0x02,0x35,0x71,0x5a,0x98,0xc9,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xb8,0x05,0xb2,0x00,0x16,0x00,0x4f,0x40,0x27,0x12,0x0d,0x14,0x03,0x05,0x02,0x08,0x05,0x0d,0x0d,0x0a,0x07,0x00,0x02,0x91,0x14,0x04,0x0a, +0x03,0x07,0x00,0x12,0x00,0x03,0x03,0x18,0x05,0x0a,0x09,0x09,0x17,0x0e,0x0d,0x05,0x7e,0x08,0x08,0x18,0x17,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x11,0x33,0x33,0x2f,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x33,0x11,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x07, +0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x36,0x33,0x32,0x17,0x04,0xb8,0x2c,0x2c,0x52,0x60,0xfe,0xd9,0xa8,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x08,0x1a,0xc7,0x4b,0x8c,0x5e,0x36,0x2c,0x05,0x06,0x14,0xbe,0xfd,0xb2,0xfd,0xf2,0x02,0x0e,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x1c,0x3c,0x01,0x8e,0x96, +0x7c,0x14,0xff,0xff,0xff,0xb1,0x00,0x00,0x05,0xa0,0x05,0xb2,0x00,0x27,0x05,0xb5,0x00,0xe8,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xe3,0xff,0x99,0x00,0x14,0xb3,0x01,0x17,0x03,0x01,0xb8,0xff,0xc4,0xb4,0x17,0x17,0x09,0x09,0x25,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xb8,0x06,0xf7,0x02,0x26,0x05,0xb5, +0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x96,0x01,0x70,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd1,0x40,0x0a,0x26,0x20,0x09,0x16,0x25,0x02,0x01,0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x03,0x00,0x60,0xfe,0x29,0x04,0xba,0x05,0xec,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x45,0x40,0x25,0x0a,0x00,0x12,0x1a,0x95,0x0c, +0x09,0x10,0x02,0x1b,0x13,0x19,0x95,0x40,0x00,0x03,0x16,0x0f,0x83,0x16,0x0e,0x00,0x1d,0x03,0x42,0x13,0x0c,0x00,0x84,0x19,0x09,0x03,0x03,0x21,0x1d,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x32,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x31,0x30,0x05,0x11,0x23, +0x11,0x26,0x02,0x35,0x34,0x00,0x37,0x11,0x33,0x11,0x16,0x12,0x15,0x14,0x00,0x03,0x11,0x36,0x36,0x35,0x34,0x26,0x01,0x11,0x06,0x06,0x15,0x14,0x16,0x02,0xdf,0xa3,0xdd,0xff,0x01,0x04,0xd8,0xa3,0xdf,0xfc,0xfe,0xfe,0xd9,0x93,0xa0,0xa0,0xfe,0xca,0x91,0xa3,0xa3,0x18,0xfe,0x41,0x01,0xbf,0x11,0x01,0x22,0xdf,0xe7,0x01,0x20,0x17, +0x01,0xd4,0xfe,0x2c,0x10,0xfe,0xe1,0xe5,0xe3,0xfe,0xdc,0x03,0x91,0xfc,0xe4,0x12,0xd0,0xac,0xab,0xd1,0xfc,0xf6,0x03,0x1c,0x12,0xd2,0xac,0xa6,0xd3,0x00,0x00,0x02,0x00,0x00,0xff,0xea,0x06,0x2d,0x04,0x00,0x00,0x16,0x00,0x28,0x00,0x69,0x40,0x38,0x08,0x0b,0x20,0x20,0x0b,0x0f,0x12,0x01,0x09,0x04,0x12,0x18,0x01,0x10,0x95,0x15, +0x0f,0x24,0x1d,0xec,0x06,0x0b,0x16,0x17,0x83,0x01,0x01,0x03,0x18,0x83,0x10,0x0e,0x40,0x00,0x00,0x03,0x83,0x27,0x0e,0x22,0x1a,0x1f,0x42,0x09,0x08,0x22,0x84,0x1f,0x1f,0x2a,0x1a,0x83,0x0e,0x0e,0x2a,0x12,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x39,0x2b,0x01,0x10,0xf2,0xe1,0x32,0x18,0x2f,0x1a,0x10,0xdd,0xe1,0x10, +0xc9,0x2f,0xe1,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x32,0x32,0x32,0x5f,0x5e,0x5d,0x11,0x39,0x2f,0x11,0x39,0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x22,0x07,0x35,0x36,0x33,0x21,0x05,0x21,0x06,0x15,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x15,0x10,0x33,0x32,0x36,0x35,0x34, +0x06,0x2d,0xb6,0x83,0xd5,0xbf,0xcf,0x64,0x04,0x67,0xce,0xb9,0xd1,0x84,0x7e,0x76,0x6a,0x96,0x05,0x2d,0xfe,0xa0,0xfc,0xd1,0x88,0x7b,0x6d,0xe8,0xa1,0xe5,0x6c,0x7c,0x03,0x74,0xdc,0xda,0xda,0xfa,0xbe,0xbe,0xfb,0xd9,0xd5,0xe1,0x58,0x9c,0x48,0x8c,0xe6,0xd6,0x96,0xa9,0x01,0x5a,0xfc,0xfc,0xfe,0xa6,0xaa,0x95,0xd6,0x00,0x00,0x01, +0x00,0x00,0xfe,0x96,0x04,0x90,0x04,0x18,0x00,0x33,0x00,0x83,0x40,0x28,0x06,0x08,0x95,0x40,0x03,0x34,0x80,0x11,0x29,0x27,0x15,0x29,0x15,0x17,0x2b,0x1f,0x1d,0x95,0x22,0x10,0x2b,0x0f,0x33,0x31,0x95,0x40,0x0c,0x16,0x17,0x29,0x11,0x2b,0x0f,0x27,0x15,0x25,0x17,0x06,0x06,0x0b,0xb8,0x01,0x2e,0x40,0x1a,0x33,0x2b,0x83,0x2c,0x2c, +0x00,0x2e,0x84,0x0f,0x0e,0x33,0x17,0x83,0x18,0x18,0x1a,0x1f,0x1f,0x25,0x42,0x25,0x84,0x1a,0x1a,0x35,0x1f,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0xe1,0x2f,0xf0,0xe1,0x11,0x39,0x2f,0xe1,0x10,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x1a,0xed,0x32,0x3f,0x3f,0xed,0x32,0x11, +0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x1a,0x10,0xdc,0x1a,0xed,0x32,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x35,0x26,0x26,0x35,0x34,0x37,0x06,0x07,0x06,0x07,0x06,0x07,0x23,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x00,0x37,0x36,0x37,0x33,0x02,0x15,0x14,0x16, +0x33,0x32,0x37,0x04,0x90,0x98,0x7d,0x3f,0x34,0x34,0x3b,0x39,0x46,0x77,0x85,0x14,0x06,0xf1,0x94,0x56,0x14,0x27,0xac,0xb0,0x56,0x50,0x2a,0x26,0x32,0x3e,0x8a,0x9c,0x15,0x01,0x8d,0x54,0x14,0x28,0xac,0xb0,0x57,0x4f,0x2a,0x26,0x44,0x87,0x9f,0x18,0x92,0x1f,0x57,0x48,0x2a,0x10,0xdb,0xb0,0x69,0x6a,0x06,0xdb,0x87,0x62,0x35,0x59, +0x01,0x72,0xf4,0x89,0x9f,0x15,0x89,0x16,0xde,0xbf,0x69,0x6a,0x01,0x65,0x65,0x35,0x59,0xfe,0x8e,0xf4,0x8c,0x9c,0x0f,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x05,0x48,0x05,0xb2,0x00,0x0e,0x00,0x1a,0x00,0x3c,0x40,0x1f,0x15,0x91,0x00,0x03,0x03,0x02,0x0f,0x91,0x40,0x09,0x04,0x02,0x0c,0x7d,0x18,0x0e,0x01,0x12,0x02,0x42,0x12,0x7d, +0x06,0x06,0x1b,0x01,0x7e,0x02,0x02,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x3f,0x1a,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x26,0x00,0x35,0x34,0x00,0x21,0x20,0x00,0x15,0x14,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03, +0x23,0xa8,0xfc,0xfe,0xd7,0x01,0x63,0x01,0x18,0x01,0x1e,0x01,0x59,0xfe,0xd2,0xfe,0xb5,0xd2,0xf7,0xf8,0xd1,0xd2,0xf7,0xf7,0x01,0x64,0xfe,0x9c,0x01,0x64,0x17,0x01,0x29,0xdf,0xf1,0x01,0x3e,0xfe,0xcf,0xf1,0xde,0xfe,0xcc,0x03,0x9c,0xde,0xb3,0xb1,0xe0,0xde,0xb3,0xb1,0xe0,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x50,0x04,0x18, +0x00,0x0e,0x00,0x1a,0x00,0x3a,0x40,0x1f,0x0f,0x95,0x09,0x10,0x02,0x1b,0x15,0x96,0x40,0x00,0x03,0x16,0x0c,0x83,0x18,0x0e,0x00,0x12,0x03,0x42,0x00,0x84,0x03,0x03,0x1c,0x12,0x83,0x06,0x06,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x3f,0x3f,0xed,0x31,0x30, +0x05,0x11,0x23,0x11,0x26,0x02,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x02,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xaa,0xa4,0xc5,0xe1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xe2,0xfe,0xf0,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x14,0xfe,0x3d,0x01,0xc3,0x18,0x01,0x18,0xd8,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa, +0xdc,0xfe,0xe0,0x03,0x86,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x00,0x02,0x00,0x5e,0xfe,0xae,0x04,0xa8,0x06,0x60,0x00,0x20,0x00,0x21,0x00,0x4d,0xb9,0x00,0x0d,0xff,0xd8,0x40,0x0f,0x13,0x1d,0x48,0x01,0x22,0x80,0x11,0x16,0x1c,0x0b,0x07,0x22,0x21,0x04,0x1c,0xb8,0xff,0xf0,0x40,0x15,0x10,0x16,0x48,0x1c,0x06,0x13,0x1f, +0x7e,0x01,0x03,0x03,0x08,0x13,0x7e,0x10,0x0e,0x0e,0x23,0x1a,0x7d,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0x33,0x2b,0x3f,0x12,0x39,0x39,0x12,0x39,0xc4,0x1a,0x10,0xce,0x31,0x30,0x2b,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x24,0x11,0x10,0x00,0x37,0x24,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14, +0x06,0x07,0x06,0x06,0x02,0x15,0x10,0x05,0x16,0x16,0x15,0x14,0x13,0x04,0x44,0xb4,0x4f,0x88,0xa3,0xfd,0xaa,0x01,0x15,0xfb,0x01,0x28,0x62,0x08,0x97,0x0d,0x84,0xca,0xca,0xdf,0x8f,0x01,0xcf,0xef,0xbb,0x21,0xfe,0xae,0x54,0x4c,0x3a,0x45,0x1b,0x62,0x02,0x68,0x01,0x13,0x01,0x79,0x47,0x3e,0x37,0x2f,0x1b,0x1c,0x24,0x28,0x5d,0x6c, +0x2f,0x2d,0x6e,0xfe,0xfa,0xbf,0xfe,0x23,0x57,0x2d,0x80,0x77,0x5a,0x06,0xa8,0x00,0x00,0x02,0x00,0x60,0xfe,0xc4,0x03,0xa4,0x04,0xc6,0x00,0x1e,0x00,0x1f,0x00,0x4f,0xb9,0x00,0x17,0xff,0xd8,0x40,0x1f,0x13,0x1d,0x48,0x1b,0x01,0x10,0x10,0x16,0x48,0x01,0x15,0x15,0x20,0x1f,0x10,0x0c,0x20,0x80,0x06,0xec,0x11,0x15,0x0b,0x0c,0x0c, +0x09,0x84,0x0e,0x0e,0x13,0x1d,0xb8,0x01,0x2e,0xb6,0x1a,0x18,0x18,0x21,0x04,0x83,0x13,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x11,0x33,0x00,0x3f,0xed,0x1a,0x10,0xce,0x3f,0x12,0x39,0x11,0x33,0x2b,0xc4,0x31,0x30,0x2b,0x01,0x0e,0x02,0x15,0x14,0x05,0x16,0x16,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x27, +0x24,0x11,0x10,0x25,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x37,0x03,0x10,0xb1,0xe2,0x75,0x01,0x25,0xc4,0xa3,0x50,0xb4,0x62,0x73,0x8d,0xfe,0x6e,0x01,0x52,0xd4,0x7a,0x0a,0x98,0x0c,0x0a,0x03,0xbe,0x36,0x5f,0xc8,0x94,0xfd,0x3a,0x28,0x7d,0x76,0x5f,0x58,0x50,0x54,0x3f,0x40,0x19,0x48,0x01,0x70,0x01,0x9e,0x8e,0x41,0x38, +0x33,0x1c,0x1a,0x24,0x25,0x85,0x20,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa8,0x05,0x9a,0x00,0x11,0x00,0x38,0x40,0x0d,0x01,0x06,0x91,0x0d,0x0d,0x08,0x0c,0x91,0x09,0x03,0x08,0x01,0x10,0xb8,0x01,0x2c,0x40,0x0d,0xaf,0x03,0x01,0x03,0x03,0x08,0x0b,0x0b,0x13,0x0d,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f, +0x5d,0xe1,0xc6,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x23,0x36,0x35,0x34,0x23,0x21,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x21,0x32,0x15,0x14,0x03,0x70,0x8c,0x08,0x69,0xfe,0xe1,0xa8,0x02,0xec,0xfd,0xbc,0x01,0x25,0xf6,0x02,0x0e,0x1e,0x28,0x5a,0xfd,0x52,0x05,0x9a,0x98,0xfe,0x40,0xce,0x34,0x00,0x00,0x01, +0x00,0x90,0xfe,0x29,0x03,0x54,0x04,0x18,0x00,0x0e,0x00,0x2a,0x40,0x15,0x07,0x95,0x04,0x04,0x0f,0x01,0x95,0x0d,0x10,0x09,0x1b,0x05,0x05,0x00,0x00,0x10,0x04,0x04,0x07,0x84,0x0a,0x2f,0xe1,0x32,0x11,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x23,0x20,0x11,0x15,0x21,0x15,0x21,0x11,0x23, +0x11,0x34,0x12,0x33,0x33,0x03,0x54,0xee,0xfe,0xcd,0x01,0xf8,0xfe,0x08,0xa3,0xf4,0xe4,0xec,0x03,0x8e,0xfe,0xb0,0x4c,0x8c,0xfc,0xc3,0x04,0x02,0xea,0x01,0x03,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x04,0x7d,0x05,0x9a,0x00,0x07,0x00,0x36,0x40,0x1b,0x04,0x91,0x40,0x07,0x05,0x02,0x07,0x91,0x2b,0x30,0x05,0x03,0x02,0x03,0x00,0x02, +0x07,0x06,0x04,0x02,0x00,0x06,0x04,0x00,0x00,0x09,0x04,0x2f,0x12,0x39,0x2f,0x10,0xcd,0x10,0xcd,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x01,0x23,0x13,0x21,0x01,0x33,0x03,0x04,0x7d,0xfe,0xdb,0xb4,0xf2,0xfc,0xb2,0x01,0x1c,0xb4,0xe9,0x03,0x25,0xfc,0xdb,0x02,0x8e,0x03,0x0c, +0xfd,0x8b,0x00,0x01,0x00,0x33,0xfe,0x1e,0x03,0xd1,0x06,0x02,0x00,0x23,0x00,0x5e,0x40,0x32,0x12,0x95,0x40,0x23,0x1d,0x0b,0x23,0x95,0x2b,0x30,0x1a,0x18,0x95,0x1d,0x01,0x08,0x06,0x95,0x40,0x0b,0x1c,0x11,0x00,0x0e,0x08,0x08,0x00,0x03,0x84,0x0e,0x0e,0x00,0x1a,0x1a,0x15,0x12,0x12,0x20,0x42,0x23,0x12,0x20,0x84,0x15,0x15,0x00, +0x00,0x25,0x12,0x24,0x10,0xce,0x11,0x39,0x2f,0x39,0x2f,0xe1,0x11,0x39,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x10,0xf1,0xe1,0x11,0x39,0x2f,0x11,0x12,0x39,0x00,0x3f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x03,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x37, +0x21,0x13,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x03,0x07,0x03,0xd1,0x5d,0x7a,0x41,0x39,0x2b,0x21,0x2c,0x38,0x74,0x92,0x81,0x21,0xfd,0x3b,0x5d,0x7a,0x41,0x39,0x2a,0x22,0x2c,0x38,0x74,0x92,0x81,0x21,0x02,0x56,0xfe,0xfc,0xfe,0xab,0x91,0x56,0x6c,0x14,0x89,0x17,0xb3,0x87,0xaa,0x01,0x6c,0x5d, +0x01,0x04,0x01,0x55,0x90,0x5a,0x69,0x15,0x8a,0x16,0xb2,0x88,0xaa,0xfe,0x94,0x5c,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x85,0x05,0xb2,0x00,0x18,0x00,0x94,0x40,0x5c,0x5d,0x05,0x6d,0x05,0x7d,0x05,0x03,0x05,0x08,0x0a,0x0d,0x0e,0x04,0x0e,0x2c,0x04,0x5c,0x04,0x02,0x04,0x0e,0x01,0x5b,0x08,0x01,0x06,0x05,0x08,0x03,0x07,0x29,0x0d, +0x01,0x29,0x0a,0x79,0x0a,0x89,0x0a,0x03,0x0b,0x0a,0x0d,0x03,0x0c,0x0a,0x07,0x01,0x05,0x0c,0x01,0x5f,0x0c,0x01,0x07,0x0c,0x07,0x0c,0x0f,0x01,0x11,0x0f,0x91,0x14,0x04,0x06,0x07,0x07,0x0b,0x0f,0x0c,0x01,0x0c,0x0c,0x3a,0x0e,0x01,0x0e,0x05,0x08,0x0a,0x0d,0x04,0x06,0x11,0x01,0x17,0x7d,0x03,0x03,0x1a,0x11,0x2f,0x12,0x39,0x2f, +0xe1,0x33,0x12,0x17,0x39,0x5d,0x39,0x2f,0x5d,0x33,0x33,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x17,0x33,0x5d,0x5d,0x11,0x17,0x33,0x5d,0x11,0x39,0x39,0x5d,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x00,0x5d,0x21,0x23,0x12,0x11,0x34,0x27,0x01,0x27,0x01,0x26,0x27,0x01,0x27,0x01, +0x26,0x23,0x22,0x07,0x35,0x36,0x21,0x20,0x00,0x11,0x10,0x03,0xfc,0xba,0x97,0x0e,0xfe,0x4d,0x54,0x01,0xe4,0x20,0x32,0xfd,0xfa,0x56,0x02,0x00,0x7c,0xb1,0xff,0xce,0xd2,0x01,0x03,0x01,0x3c,0x01,0x74,0x01,0x01,0x01,0x4d,0x58,0x5a,0xfe,0xae,0x6c,0x01,0x7c,0x60,0x4e,0xfe,0x6c,0x6c,0x01,0x92,0x6c,0xda,0xc2,0xb0,0xfe,0x1a,0xfe, +0x94,0xfe,0xc4,0x00,0x00,0x01,0xff,0x7b,0xfe,0x29,0x03,0x77,0x06,0x02,0x00,0x14,0x00,0x8d,0x40,0x5a,0x05,0x08,0x0a,0x0d,0x0e,0x04,0x0e,0x06,0x08,0x05,0x03,0x07,0x66,0x0d,0x01,0x0a,0x0d,0x01,0x0a,0x0a,0x01,0x0b,0x0d,0x0a,0x03,0x0c,0x16,0x07,0x76,0x07,0x02,0x07,0x76,0x0c,0x01,0x1d,0x0c,0x01,0x0c,0x0b,0x0e,0x7b,0x0e,0x02, +0x0c,0x04,0x2c,0x04,0x5c,0x04,0x6c,0x04,0xcc,0x04,0xdc,0x04,0x06,0x0e,0x0c,0x07,0x04,0x04,0x01,0x1b,0x0f,0xee,0x10,0x01,0x06,0x07,0x07,0x0b,0x0c,0x0c,0x04,0x0e,0x01,0x05,0x08,0x0a,0x0d,0x04,0x0f,0x13,0x84,0x03,0x03,0x16,0x15,0x0f,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x33,0x39,0x39,0x39,0x2f,0x33,0x33,0x2f,0x33, +0x00,0x3f,0xed,0x3f,0x17,0x39,0x5d,0x5d,0x2f,0x5d,0x5d,0x2f,0x5d,0x11,0x17,0x33,0x5d,0x5d,0x5d,0x11,0x17,0x33,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x01,0x23,0x12,0x11,0x34,0x27,0x05,0x27,0x25,0x26,0x27,0x05,0x27,0x25,0x02,0x25,0x35,0x04,0x00,0x11,0x10,0x02,0xa4,0xbc,0xed,0x08,0xfe,0x2f,0x31,0x01,0xe7,0x1e,0x3e, +0xfe,0x1a,0x30,0x01,0xd0,0xfa,0xfe,0x65,0x01,0xc2,0x02,0x3a,0xfe,0x29,0x01,0x4b,0x01,0x8a,0x4f,0x41,0xaa,0x82,0xb2,0x7c,0x7a,0xb2,0x81,0xac,0x01,0x88,0x4b,0xa6,0x58,0xfd,0x27,0xfe,0x2f,0xfe,0x94,0x00,0x00,0x01,0x00,0xb8,0xfe,0x1e,0x06,0x66,0x05,0x9a,0x00,0x2f,0x00,0x85,0x40,0x4b,0x3a,0x23,0x01,0x0c,0x91,0x00,0x07,0x10, +0x07,0x02,0x09,0x03,0x07,0x03,0x0a,0x91,0x09,0x10,0x91,0x09,0x03,0x1c,0x0d,0x18,0x01,0x0d,0x04,0x18,0x14,0x1e,0x2a,0x22,0x91,0x40,0x16,0x1a,0x13,0x2e,0x26,0x1e,0x03,0x03,0x10,0x10,0x40,0x09,0x14,0x48,0x10,0x02,0x13,0x0a,0x18,0x27,0x26,0x0a,0x0a,0x1d,0x2f,0x7e,0x13,0x2e,0x0e,0x27,0x1e,0x26,0x42,0x27,0x7e,0x26,0x26,0x31, +0x1e,0x7e,0x1d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x11,0x39,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x39,0x2b,0x11,0x33,0x00,0x3f,0x33,0x33,0x3f,0x33,0x1a,0xed,0x32,0x12,0x39,0x39,0x5f,0x5e,0x5d,0x3f,0x33,0xed,0x10,0xed,0x10,0xdc,0x5f,0x5e,0x5d,0xed,0x31,0x30,0x01,0x5d,0x01,0x10,0x00,0x21,0x22, +0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x66,0xfe,0xc1,0xfe,0xa4,0x47,0x7a,0x7a,0x30,0x68,0x56,0x56,0x70,0x38,0x72,0x71,0x50,0xf7,0xe5,0x0f, +0x06,0x6d,0xca,0xd7,0x48,0x72,0xe4,0xfe,0xac,0xa8,0x67,0x7d,0x67,0x91,0xa8,0xe2,0x6c,0x8c,0xa8,0x01,0x29,0xfe,0x62,0xfe,0x93,0x0c,0x0b,0x17,0x96,0x19,0x0b,0x0c,0xe8,0xfc,0xb2,0xd4,0xd4,0x01,0xc4,0x03,0xee,0xfc,0x26,0xa5,0x9c,0xbf,0x86,0x03,0xd6,0xfc,0x12,0xfe,0xd3,0xb5,0x90,0x03,0xd6,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1c, +0x06,0x54,0x04,0x00,0x00,0x30,0x00,0x7d,0x40,0x49,0x0c,0x95,0x04,0x07,0x14,0x07,0x02,0x07,0x03,0x0a,0x95,0x09,0x10,0x95,0x09,0x42,0x03,0x1c,0x19,0x13,0x1b,0x2f,0x27,0x1f,0x0f,0x2b,0x23,0x95,0x40,0x16,0x1b,0x16,0x03,0x10,0x2d,0x10,0x01,0x02,0x0f,0x10,0x1f,0x10,0x02,0x09,0x03,0x10,0x40,0x0c,0x15,0x48,0x10,0x13,0x0a,0x0a, +0x1e,0x30,0x84,0x13,0x2f,0x0e,0x28,0x1f,0x27,0x42,0x19,0x28,0x84,0x27,0x27,0x32,0x1f,0x84,0x1e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x11,0x39,0x18,0x2f,0x12,0x39,0x2b,0x5f,0x5e,0x5d,0x5f,0x5d,0x11,0x33,0x00,0x3f,0x33,0x1a,0xed,0x32,0x3f,0x33,0x33,0x12,0x39,0x39,0x3f,0xe6,0xed,0x10,0xed,0x10, +0xdc,0x5d,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x22,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x13,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x54,0xfe,0xc9,0xfe,0xa5,0x46,0x6f,0x6f,0x34, +0x70,0x4a,0x56,0x6c,0x33,0x6c,0x6b,0x51,0xef,0xe8,0x0c,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0x01,0x5c,0xfe,0x3d,0xfe,0x85,0x0c,0x0b,0x19,0x8e,0x16,0x0b,0x0b,0xf5,0x01,0x03,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd, +0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0x2f,0x05,0xb2,0x00,0x18,0x00,0x42,0x40,0x23,0x0b,0x09,0x1b,0x09,0x02,0x02,0x16,0x16,0x14,0x91,0x04,0x04,0x17,0x01,0x0d,0x0f,0x91,0x0a,0x04,0x17,0x03,0x01,0x0d,0x0d,0x16,0x11,0x00,0x7e,0x16,0x01,0x01,0x1a,0x11,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f, +0x33,0xe1,0x11,0x12,0x39,0x2f,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x31,0x30,0x01,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x14,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x2f,0xa8,0xbc,0xc3,0xd5,0xff,0x00,0xb4,0x98,0x40,0x3f,0x3d,0x3a,0xac, +0xa9,0x94,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x06,0xd8,0xcf,0xfd,0x18,0x96,0x1a,0xfe,0xce,0x98,0xb4,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0x33,0xfe,0x29,0x03,0x85,0x04,0x18,0x00,0x18,0x00,0x42,0x40,0x26,0x0a,0x08,0x1a,0x08,0x02,0x0a,0x06,0x1a,0x06,0x02,0x01,0x1b,0x03,0x05,0x17,0x0c,0x0e,0x95,0x09,0x10,0x17,0x0f,0x13,0x95, +0x05,0x16,0x0c,0x0c,0x10,0x18,0x84,0x01,0x17,0x17,0x1a,0x10,0x84,0x07,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x01,0x23,0x11,0x23,0x06,0x23,0x20,0x11,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11, +0x33,0x03,0x85,0xa3,0x05,0x71,0xd4,0xfe,0x9b,0x01,0x48,0x3a,0x35,0x34,0x35,0xaa,0x71,0x7c,0x7a,0xa4,0xa3,0xfe,0x29,0x02,0x73,0xb4,0x02,0x18,0x02,0x18,0x14,0x8d,0x17,0xfe,0x7a,0xd4,0xc2,0xbc,0x8e,0x02,0x44,0x00,0x00,0x01,0x00,0x00,0xfe,0x1e,0x04,0xb8,0x05,0x9a,0x00,0x22,0x00,0x5e,0x40,0x37,0x2b,0x10,0x3b,0x10,0x02,0x44, +0x01,0x01,0x0b,0x91,0x00,0x06,0x10,0x06,0x02,0x06,0x02,0x09,0x91,0x08,0x0f,0x91,0x08,0x02,0x1c,0x1d,0x18,0x18,0x16,0x91,0x1f,0x1f,0x19,0x1c,0x03,0x19,0x02,0x0f,0x0f,0x40,0x09,0x12,0x48,0x0f,0x09,0x22,0x7e,0x13,0x13,0x24,0x1d,0x18,0x7e,0x1a,0x09,0x2f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2b,0x11,0x33,0x00,0x2f, +0x3f,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x3f,0x33,0xed,0x10,0xed,0x10,0xdc,0x5d,0xed,0x31,0x30,0x01,0x5d,0x5d,0x25,0x10,0x21,0x22,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x12,0x15,0x04,0xb8,0xfd,0x71,0x45,0x77,0x77, +0x38,0x68,0x56,0x56,0x70,0x36,0x73,0x72,0x50,0xf7,0xe8,0xaa,0x97,0xbf,0xac,0xa8,0xa8,0xb9,0xcd,0xd3,0xfb,0xec,0xfd,0x32,0x0c,0x0b,0x17,0x96,0x19,0x0b,0x0c,0x01,0x13,0x01,0x21,0xc8,0xb0,0xcf,0x71,0xfd,0x40,0x05,0x9a,0xfd,0xb6,0x78,0xfe,0xec,0xe5,0x00,0x00,0x02,0xff,0xec,0xff,0xe8,0x03,0xe8,0x04,0x18,0x00,0x26,0x00,0x2f, +0x00,0xc5,0x40,0x59,0x1c,0x1d,0x16,0x1b,0x0d,0x0e,0x1a,0x0e,0x27,0x0c,0x28,0x18,0x17,0x1d,0x16,0x2f,0x19,0x2f,0x1c,0x17,0x1d,0x16,0x1d,0x27,0x0d,0x0c,0x28,0x0c,0x1d,0x21,0x15,0x0c,0x08,0x29,0x0e,0x0f,0x95,0x2e,0x2f,0x2e,0x25,0xec,0x04,0x00,0x04,0x10,0x04,0x02,0x2e,0x04,0x2e,0x04,0x08,0x28,0x29,0x95,0x16,0x19,0x1a,0x03, +0x15,0x10,0x08,0xec,0x21,0x16,0x00,0x1d,0x16,0x1e,0x12,0x28,0x0c,0x0b,0x2c,0x0d,0x0e,0x1b,0x1c,0x04,0x1a,0x12,0x17,0x18,0x27,0x2f,0x04,0x2c,0x1a,0xb8,0x01,0x2e,0xb3,0x19,0x19,0x0b,0x2c,0xb8,0x01,0x2e,0x40,0x0b,0x12,0x12,0x01,0x1e,0x84,0x0b,0x0b,0x31,0x00,0x84,0x01,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12, +0x39,0x2f,0xe1,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0xed,0x3f,0x17,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x04,0xc0,0x08,0xc0,0x10,0x87, +0xc0,0x04,0xc0,0x08,0xc0,0x31,0x30,0x33,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x37,0x33,0x06,0x07,0x16,0x15,0x14,0x02,0x23,0x22,0x27,0x26,0x23,0x22,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x8c,0xa0,0x13,0x85,0x68,0x65,0x6f,0x62,0x38, +0x5e,0x8c,0x38,0xa6,0xbe,0x78,0xa2,0xb9,0x96,0xa6,0x8b,0x1d,0x15,0x9b,0x27,0x42,0x76,0xec,0xa6,0x82,0x70,0x56,0x22,0x48,0x02,0x14,0x62,0x7d,0x52,0x5e,0x87,0x8c,0x8f,0xa4,0x64,0x58,0xdc,0x9d,0x78,0x63,0xa8,0x83,0x68,0x71,0x99,0x6c,0x32,0x3a,0x6f,0x61,0x98,0xc0,0xd6,0xfe,0xce,0x6a,0x52,0x02,0x91,0x59,0x43,0x35,0x68,0x00, +0x00,0x01,0x00,0x48,0xff,0xe8,0x04,0xae,0x05,0xb2,0x00,0x29,0x00,0x52,0x40,0x2e,0x03,0x28,0x13,0x28,0x02,0x0c,0x1c,0x06,0x23,0x04,0x03,0x29,0x29,0x19,0x26,0x13,0x13,0x03,0x0f,0x91,0x19,0x04,0x26,0x91,0x03,0x13,0x13,0x11,0x7e,0x16,0x1c,0x7d,0x0c,0x16,0x0c,0x16,0x0c,0x06,0x00,0x7e,0x29,0x29,0x2b,0x23,0x7d,0x06,0x2f,0xe1, +0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x32,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x11,0x17,0x39,0x31,0x30,0x5d,0x01,0x06,0x00,0x21,0x22,0x24,0x35,0x34,0x36,0x36,0x25,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x32,0x00,0x15,0x14,0x06,0x06, +0x07,0x05,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x04,0xae,0x17,0xfe,0xb7,0xfe,0xf4,0xe9,0xfe,0xef,0x68,0xb4,0x01,0x4e,0xda,0xd0,0x78,0x9c,0x14,0xa4,0x16,0xa7,0x93,0xbf,0x01,0x41,0x3a,0x72,0x33,0xfe,0x73,0xd8,0xb4,0xa0,0xc0,0xf2,0x0c,0x02,0x0a,0xfe,0xfe,0xdc,0xfd,0xbb,0x78,0xaf,0x5c,0x4d,0x30,0x68,0x6a,0xa8,0x6c,0x25, +0x2f,0x30,0x32,0x69,0x8d,0xff,0x00,0xaa,0x46,0x6c,0x4d,0x0c,0x61,0x46,0xb4,0x80,0xa3,0xd3,0xb8,0x00,0x00,0x01,0x00,0x3e,0xff,0xe8,0x03,0x90,0x04,0x18,0x00,0x27,0x00,0x6e,0x40,0x29,0x05,0x09,0x15,0x09,0x02,0x0b,0x09,0x24,0x1f,0x1e,0x03,0x20,0x27,0x30,0x27,0x02,0x27,0x27,0x19,0x24,0x13,0x40,0x09,0x0c,0x48,0x13,0x13,0x03, +0x0f,0x95,0x19,0x10,0x24,0x95,0x03,0x16,0x1c,0x84,0x0c,0x13,0x11,0xb8,0x01,0x2e,0x40,0x0d,0x10,0x16,0x20,0x16,0x30,0x16,0x03,0x16,0x0c,0x16,0x0c,0x06,0x00,0xb8,0x01,0x2e,0xb5,0x27,0x27,0x29,0x21,0x84,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x32,0x10,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39, +0x2f,0x2b,0x11,0x12,0x39,0x2f,0x5d,0x11,0x39,0x39,0x11,0x39,0x39,0x5d,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x04,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x90,0x0a,0xf6,0xd2,0xad,0xd3,0x4a, +0x85,0xe1,0x97,0xa2,0x51,0x5d,0x21,0x98,0x1e,0x7c,0x6b,0x9d,0x01,0x05,0x6b,0xfe,0xa0,0x7c,0x7c,0x68,0x8c,0xa8,0x04,0x01,0xa0,0xd0,0xe8,0xb0,0x89,0x56,0x7e,0x47,0x34,0x23,0x44,0x41,0x78,0x46,0x29,0x31,0x31,0x37,0x53,0x6d,0xca,0x75,0x52,0x76,0x47,0x58,0x4b,0x50,0x65,0x9f,0x8f,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x04,0xb0, +0x05,0xb2,0x00,0x1c,0x00,0x1f,0x00,0xce,0x40,0x7a,0x1d,0x1e,0x8d,0x1e,0xbd,0x1e,0x03,0x74,0x0f,0xe4,0x0f,0x02,0x1e,0x1b,0x1f,0x19,0x0f,0x02,0x10,0x1c,0x0e,0x1c,0x1e,0x1f,0x19,0x04,0x03,0x02,0x10,0x1d,0x05,0x1d,0x0f,0x03,0x02,0x10,0x02,0x1e,0x1b,0x1a,0x1f,0x19,0x1f,0x10,0x42,0x0e,0x72,0x0e,0x82,0x0e,0x02,0x16,0x0e,0x46, +0x0e,0x56,0x0e,0x03,0x0e,0x1c,0x0c,0x19,0x42,0x05,0x76,0x05,0x01,0x05,0x04,0x1a,0x03,0x1b,0x1e,0x1d,0x07,0x1f,0x17,0x09,0x15,0x03,0x07,0x91,0x12,0x0c,0x04,0x1c,0x02,0x76,0x02,0x01,0x0f,0x02,0x1f,0x02,0x02,0x02,0x1f,0x91,0x01,0x10,0x19,0x19,0x1f,0x1f,0x02,0x15,0x0e,0x05,0x05,0x1d,0x1d,0x1c,0x09,0x15,0x09,0x15,0x09,0x02, +0x1c,0x1c,0x21,0x02,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x12,0x39,0x11,0x33,0x11,0x12,0x39,0x12,0x39,0x11,0x33,0x00,0x2f,0xed,0x39,0x5d,0x5d,0x11,0x33,0x3f,0x33,0xed,0x17,0x32,0x11,0x17,0x39,0x5d,0x10,0xe4,0x11,0x12,0x39,0x5d,0x5d,0x10,0xe6,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0x0e,0xc0, +0x10,0x87,0x08,0xc0,0x05,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x3d,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x21,0x21,0x35,0x01,0x27,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x07,0x01,0x27,0x01,0x01,0x04,0xb0,0xfb,0x64,0x01,0xf4,0x37,0x3b,0x46,0x2d, +0x2c,0x2c,0x2b,0x37,0x5a,0x8a,0x51,0x52,0x8b,0x59,0x36,0x2c,0x2c,0x2c,0x2c,0x4a,0x3c,0x36,0x01,0xf6,0xee,0xfe,0x9e,0xfe,0x9e,0x31,0x03,0xc1,0x6a,0x72,0x4c,0x14,0x98,0x14,0x76,0x9c,0x9e,0x74,0x14,0x98,0x14,0x49,0x75,0x66,0xfc,0x3b,0x67,0x02,0xb4,0xfd,0x4c,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x03,0xcd,0x04,0x18,0x00,0x1a, +0x00,0x1d,0x00,0x76,0x40,0x47,0x03,0x0e,0x33,0x0e,0x43,0x0e,0xd3,0x0e,0x04,0x0e,0x0b,0x19,0x03,0xcb,0x1c,0xdb,0x1c,0x02,0x8f,0x1c,0x01,0x14,0x1c,0x01,0x1c,0x03,0x1d,0x08,0x14,0x16,0x03,0x06,0x95,0x11,0x0b,0x10,0x1a,0x02,0x0b,0x02,0x2b,0x02,0x02,0x02,0x1d,0x95,0x01,0x19,0x03,0x1a,0x1d,0x14,0x02,0x1b,0x1a,0x08,0x0f,0x14, +0x01,0x00,0x08,0x01,0x14,0x08,0x14,0x08,0x02,0x1a,0x1a,0x1f,0x02,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x12,0x39,0x11,0x12,0x39,0x12,0x39,0x39,0x00,0x2f,0xed,0x39,0x5d,0x11,0x33,0x3f,0x33,0xed,0x17,0x32,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x11,0x33,0x12,0x39,0x5d,0x31,0x30,0x21,0x21,0x35,0x01,0x27,0x26, +0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x01,0x27,0x03,0x03,0x03,0xcd,0xfc,0x47,0x01,0x88,0x25,0x3b,0x40,0x21,0x21,0x20,0x2c,0x50,0x66,0x34,0x35,0x67,0x4f,0x2b,0x21,0x21,0x20,0x46,0x3c,0x22,0x01,0x8b,0xe3,0xfc,0xfc,0x23,0x02,0xba,0x44,0x6d,0x0f,0x8b,0x0e,0x48, +0x5e,0x5f,0x47,0x0e,0x8b,0x0f,0x6d,0x3f,0xfd,0x41,0x69,0x01,0xc6,0xfe,0x3a,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0xee,0x06,0x04,0x00,0x1e,0x00,0x2a,0x00,0x74,0x40,0x34,0x33,0x18,0x43,0x18,0x53,0x18,0x03,0x0c,0x09,0x1c,0x09,0x2c,0x09,0x03,0x99,0x05,0x01,0x0b,0x13,0x1f,0x91,0x0d,0x0d,0x19,0x25,0x03,0x91,0x0f,0x1d,0x1f, +0x1d,0x2f,0x1d,0x03,0x1d,0x19,0x01,0x91,0x00,0x07,0x91,0x00,0x42,0x19,0x01,0x25,0x91,0x13,0x13,0x1b,0x05,0x05,0xb8,0xff,0xc0,0x40,0x0e,0x0c,0x12,0x48,0x01,0x05,0x01,0x0a,0x10,0x7d,0x28,0x28,0x2c,0x0a,0x22,0xb9,0x01,0x2f,0x00,0x16,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2b,0x11,0x33,0x00,0x3f,0xed,0x3f, +0xe6,0xed,0x10,0xed,0x10,0xdc,0x5d,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x15,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x06,0x03,0x33,0x36,0x21,0x32,0x00,0x15,0x14,0x00,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04, +0xc2,0x50,0x68,0x33,0x6a,0x6b,0x4a,0xc2,0xc7,0x15,0x09,0xa3,0x01,0x07,0xf6,0x01,0x2b,0xfe,0xb9,0xff,0xfe,0xe6,0xfe,0xd0,0x01,0x23,0x01,0x3d,0x44,0x6e,0x6d,0x35,0x60,0xfe,0x3e,0xb4,0xe2,0xd7,0xb9,0xb7,0xdd,0xd7,0x06,0x04,0x96,0x18,0x0a,0x0a,0xe7,0xfe,0xef,0xc8,0xfe,0xce,0xf0,0xf2,0xfe,0xc2,0x01,0x58,0x01,0x45,0x01,0xda, +0x01,0xa3,0x0a,0x0a,0xfd,0xb4,0xd8,0xa5,0xbe,0xe8,0xe0,0xb1,0xb2,0xe0,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x00,0x1e,0x00,0x2c,0x00,0x75,0x40,0x2f,0x6b,0x1e,0x7b,0x1e,0x02,0x0c,0x09,0x1c,0x09,0x2c,0x09,0x8c,0x09,0x04,0x0b,0x1f,0x1f,0x2a,0x95,0x0d,0x0d,0x19,0x24,0x03,0x95,0x1d,0x40,0x09,0x0e,0x48,0x1d,0x19, +0x01,0x95,0x00,0x42,0x07,0x95,0x19,0x01,0x24,0x95,0x13,0x16,0x1b,0x05,0x05,0xb8,0xff,0xc0,0x40,0x18,0x0f,0x24,0x48,0x0a,0x05,0x21,0x6f,0x01,0x7f,0x01,0x8f,0x01,0x03,0x01,0x01,0x16,0x10,0x83,0x27,0x27,0x2e,0x21,0x83,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0x12,0x39,0x39,0x2b,0x11,0x33,0x00,0x3f,0xed,0x3f, +0xed,0xf6,0xed,0x10,0xdc,0x2b,0xed,0x11,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x31,0x30,0x5d,0x5d,0x01,0x15,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x02,0x03,0x33,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x01,0x06,0x15,0x14,0x12,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06, +0x03,0xdb,0x38,0x4f,0x18,0x39,0x3a,0x2f,0xac,0xc6,0x1a,0x04,0x81,0xe1,0xdc,0x01,0x00,0xfe,0xe8,0xea,0xed,0xfe,0xff,0x01,0x21,0x01,0x21,0x20,0x45,0x45,0x1e,0x44,0xfd,0x5e,0x04,0xb1,0x9f,0xa0,0xb0,0xb3,0xa3,0x63,0xb3,0x06,0x06,0x8b,0x11,0x04,0x04,0xfe,0xfc,0xfe,0xfc,0xae,0xfe,0xe4,0xf8,0xf4,0xfe,0xd8,0x01,0x57,0x01,0x40, +0x01,0xc1,0x01,0xc2,0x04,0x04,0xfc,0xcc,0x41,0x35,0xd8,0xfe,0xfa,0xcf,0xbd,0xc3,0xcd,0x71,0x00,0x01,0x00,0x0a,0x00,0x00,0x04,0x7b,0x05,0x9a,0x00,0x13,0x00,0x36,0x40,0x17,0x09,0x01,0x04,0x91,0x12,0x0f,0x0f,0x03,0x10,0x03,0x03,0x12,0x01,0x7e,0x0f,0x04,0x04,0x0c,0x00,0x00,0x15,0x09,0x07,0xb9,0x01,0x2e,0x00,0x0c,0x2f,0xe1, +0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0x33,0xe1,0x32,0x00,0x2f,0x3f,0x12,0x39,0x2f,0x33,0xfd,0x32,0xc6,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x21,0x33,0x11,0x33,0x11,0x21,0x04,0x7b,0xfe,0x33,0xa8,0xff,0x00,0x68,0x08,0x8e,0x0e,0x01,0x00,0xfc,0xa8,0x01,0xcd,0x04,0x00,0xfc,0x00,0x04, +0x00,0x5a,0x28,0x1e,0x32,0x34,0xd2,0x01,0x02,0xfe,0xfe,0x00,0x00,0x01,0x00,0x00,0xfe,0x96,0x03,0x4e,0x05,0x2f,0x00,0x18,0x00,0x3a,0x40,0x1d,0x05,0xec,0x40,0x04,0x19,0x80,0x0e,0x09,0x16,0x01,0x09,0x95,0x17,0x14,0x0f,0x05,0x17,0x01,0x84,0x14,0x09,0x09,0x11,0x00,0x1a,0x0e,0x0c,0xed,0x11,0x2f,0xe1,0x32,0x10,0xc6,0x11,0x39, +0x2f,0x33,0xe1,0x32,0xc6,0x00,0x3f,0x33,0xed,0x32,0xcd,0x10,0xc6,0x1a,0x10,0xde,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x10,0x05,0x35,0x36,0x36,0x35,0x11,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x33,0x33,0x35,0x37,0x11,0x21,0x03,0x4e,0xfe,0xc0,0xfe,0xa0,0x68,0x54,0x7a,0x60,0x06,0x8c,0x0a,0xf0,0x7a,0xa4,0x01,0x40,0x03, +0x74,0xfc,0xd6,0xfe,0x90,0x44,0x9f,0x16,0x7e,0x7f,0x03,0x2c,0x53,0x21,0x1e,0x30,0x2e,0xc0,0xfa,0x35,0xfe,0xd1,0x00,0x01,0x00,0x00,0xff,0xe8,0x04,0x90,0x04,0x18,0x00,0x29,0x00,0x65,0x40,0x35,0x1d,0x0b,0x07,0x1f,0x1f,0x0b,0x0e,0x21,0x0f,0x15,0x13,0x95,0x18,0x10,0x29,0x27,0x95,0x40,0x02,0x16,0x0e,0x1f,0x07,0x21,0x05,0x1d, +0x0b,0x1b,0x0d,0x21,0x83,0x22,0x22,0x29,0x24,0x84,0x05,0x0e,0x29,0x15,0x1b,0x42,0x0d,0x83,0x0e,0x0e,0x15,0x1b,0x84,0x10,0x10,0x2b,0x15,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x18,0x2f,0xf0,0xe1,0x11,0x39,0x2f,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x3f, +0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x06,0x07,0x06,0x07,0x23,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x00,0x37,0x36,0x37,0x33,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x04,0x90,0x33,0x3f,0x88,0x9c,0x14,0x06,0xf1,0x94,0x56,0x14,0x27, +0xac,0xb0,0x56,0x50,0x2a,0x26,0x32,0x3e,0x8a,0x9c,0x15,0x01,0x8d,0x54,0x14,0x28,0xac,0xb0,0x57,0x4f,0x2a,0x26,0x02,0x16,0xde,0xbf,0x69,0x6a,0x06,0xdb,0x87,0x62,0x35,0x59,0x01,0x72,0xf4,0x89,0x9f,0x15,0x89,0x16,0xde,0xbf,0x69,0x6a,0x01,0x65,0x65,0x35,0x59,0xfe,0x8e,0xf4,0x8c,0x9c,0x15,0x00,0x00,0x02,0x00,0xa2,0xfe,0x1e, +0x04,0x50,0x04,0x18,0x00,0x19,0x00,0x25,0x00,0x39,0x40,0x20,0x05,0x03,0x15,0x03,0x02,0x22,0x95,0x12,0x10,0x00,0x1a,0x1a,0x1d,0x95,0x18,0x16,0x07,0x95,0x08,0x1c,0x07,0x07,0x0f,0x15,0x83,0x1f,0x1f,0x27,0x01,0x25,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x3f,0xed, +0x31,0x30,0x5d,0x25,0x23,0x1e,0x02,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x24,0x02,0x11,0x11,0x34,0x12,0x33,0x32,0x00,0x15,0x10,0x02,0x23,0x22,0x03,0x16,0x16,0x33,0x20,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x48,0x04,0x09,0x76,0xd1,0xc7,0x78,0x43,0x40,0x7f,0xf2,0xfe,0xee,0xb1,0xf4,0xe1,0xd9,0x01,0x00,0xf8,0xdd,0xc1,0x76, +0x26,0xa5,0x59,0x01,0x3e,0xa7,0x8f,0x90,0x9c,0x62,0x92,0xc0,0x56,0x04,0x02,0x08,0x8e,0x08,0x02,0x04,0x66,0x01,0x24,0x01,0x54,0x01,0x04,0xf4,0x01,0x16,0xfe,0xde,0xe6,0xfe,0xfc,0xfe,0xdc,0x01,0x1a,0x3d,0x53,0x01,0x96,0xb0,0xd6,0xcf,0xb3,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00, +0xff,0xff,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4d,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x02,0xcf,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x5c,0x04,0x00,0x00,0x12,0x00,0x39,0x40,0x1e,0x0e,0x95,0x40,0x0d,0x08,0x00,0x0d,0x95,0x2b,0x30,0x09,0x95,0x08,0x0f,0x12,0x95, +0x00,0x0c,0x08,0x0d,0x08,0x0d,0x08,0x0f,0x00,0x00,0x14,0x0f,0x83,0x04,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x00,0x2f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x15,0x23,0x20,0x03,0x21,0x15,0x21,0x12,0x21,0x33,0x03,0x5c,0xe3,0xf9,0xfe,0xe0, +0x01,0x2d,0xff,0xc6,0xc9,0xfe,0xb6,0x33,0x02,0x1f,0xfd,0xdb,0x1b,0x01,0x68,0xd3,0x01,0x09,0xe3,0xf3,0x01,0x21,0x8c,0xfe,0xe0,0x8c,0xfe,0xc4,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x5c,0x04,0x00,0x00,0x12,0x00,0x37,0x40,0x1d,0x05,0x95,0x40,0x06,0x0b,0x00,0x06,0x95,0x2b,0x30,0x0a,0x95,0x0b,0x0f,0x01,0x95,0x00,0x0f,0x83,0x04, +0x0a,0x05,0x0a,0x05,0x07,0x04,0x04,0x14,0x00,0x2f,0x11,0x39,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x00,0x2f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x33,0x35,0x33,0x20,0x13,0x21,0x35,0x21,0x02,0x21,0x23,0x35,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x60,0xd3,0x01,0x5d,0x24,0xfd,0xde,0x02,0x22,0x2a,0xfe,0xa9, +0xc9,0xda,0xf8,0x01,0x20,0xfe,0xd4,0xff,0x8c,0x01,0x3c,0x8c,0x01,0x20,0x8c,0xfe,0xf7,0xe3,0xf4,0xfe,0xe0,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x06,0xca,0x05,0x9a,0x00,0x33,0x00,0x2b,0x40,0x15,0x32,0x10,0x15,0x25,0x7e,0x24,0x16,0x7e,0x15,0x15,0x07,0x24,0x24,0x35,0x08,0x7e,0x07,0x07,0x03,0x00,0x12,0x00,0x3f,0x3f,0x01,0x2f, +0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x21,0x2e,0x05,0x27,0x33,0x1e,0x05,0x17,0x13,0x2e,0x03,0x27,0x33,0x1e,0x05,0x17,0x3e,0x05,0x37,0x33,0x0e,0x05,0x07,0x23,0x2e,0x03,0x27,0x03,0x01,0xe2,0x4d,0x75,0x5a,0x40,0x32,0x25,0x11,0xa8,0x10,0x26,0x2e,0x38,0x46,0x57,0x35,0xe0,0x15,0x21,0x1c, +0x18,0x0c,0xa8,0x10,0x26,0x2e,0x38,0x46,0x57,0x35,0x35,0x57,0x46,0x38,0x2e,0x25,0x11,0xa8,0x11,0x25,0x32,0x40,0x5a,0x75,0x4d,0xa4,0x2b,0x4a,0x40,0x37,0x17,0xd5,0x95,0xf8,0xdd,0xd0,0xdc,0xf3,0x91,0x8a,0xe5,0xc7,0xb5,0xb5,0xbd,0x6d,0x02,0x3c,0x48,0x94,0x9f,0xb0,0x63,0x8a,0xe5,0xc7,0xb5,0xb5,0xbd,0x6d,0x6d,0xbd,0xb5,0xb5, +0xc7,0xe5,0x8a,0x92,0xf2,0xdc,0xd0,0xde,0xf7,0x95,0x53,0x95,0x89,0x7f,0x3c,0xfd,0xd4,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x05,0x5e,0x04,0x00,0x00,0x14,0x00,0x4c,0x40,0x25,0x0d,0x03,0x02,0x0f,0x14,0x08,0x03,0x0d,0x02,0x0f,0x0f,0x02,0x0c,0x13,0x03,0x04,0x02,0x01,0x13,0x05,0x04,0x0c,0x13,0x0c,0x00,0x08,0x10,0x0f,0x0f,0x14, +0x08,0x14,0x00,0x00,0x16,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x2f,0x17,0x33,0x3f,0x12,0x39,0x39,0x33,0x33,0x87,0x05,0xc0,0xc0,0x31,0x30,0x01,0x01,0x23,0x03,0x03,0x23,0x02,0x02,0x27,0x33,0x16,0x12,0x13,0x13,0x26,0x27,0x33,0x16,0x12,0x17, +0x01,0x05,0x5e,0xfe,0xaa,0xa6,0xb8,0xb6,0x94,0xb5,0x72,0x1b,0xa8,0x1a,0x58,0x7c,0xaa,0x47,0x1b,0xac,0x20,0x77,0x75,0x01,0x08,0x04,0x00,0xfc,0x00,0x01,0xaa,0xfe,0x56,0x01,0x9b,0x01,0x76,0xef,0xcf,0xfe,0xce,0xfe,0xce,0x01,0x87,0xcb,0xe1,0xe2,0xfe,0xad,0xfe,0x03,0x33,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0xc6,0x05,0x9a, +0x00,0x12,0x00,0x1a,0x00,0x45,0x40,0x23,0x0a,0x01,0x91,0x07,0x04,0x04,0x05,0x13,0x91,0x0b,0x0b,0x05,0x03,0x14,0x91,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x7d,0x18,0x18,0x1c,0x0b,0x07,0x14,0x7e,0x04,0x00,0x00,0x1c,0x1b,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f, +0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x4c,0xfe,0xdd,0x01,0x23,0xa8,0x01,0x5a,0xfe,0xa6,0x01,0x10,0xd4,0xee,0xf8,0xd8,0xfe,0xfe,0xeb,0x96,0xa1,0xfe,0xc9,0x04,0x74, +0x9a,0x8c,0x8c,0x9a,0xfe,0xc6,0xcd,0xc1,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0x4e,0x05,0xec,0x00,0x12,0x00,0x19,0x00,0x47,0x40,0x24,0x0a,0x01,0x96,0x07,0x04,0x04,0x06,0x0b,0x95,0x13,0x13,0x00,0x06,0x00,0x14,0x95,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x83,0x17,0x17,0x1b,0x0b, +0x07,0x14,0x84,0x04,0x00,0x00,0x1b,0x1a,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x11,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32, +0x35,0x34,0x23,0x01,0x40,0xfe,0xe9,0x01,0x17,0xa4,0x01,0x38,0xfe,0xc8,0x01,0x12,0x9d,0xbb,0xbb,0x8d,0xfe,0xde,0xf5,0xcd,0xcf,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0xc5,0xa3,0x94,0x93,0xad,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x00,0x01,0x00,0xbc,0xff,0xe8,0x06,0xd9,0x05,0xb2,0x00,0x1f,0x00,0x5e,0x40,0x34,0x1a,0x17,0x06,0x91, +0x40,0x0b,0x0a,0x08,0x0b,0x91,0x2b,0x30,0x30,0x12,0x01,0x12,0x12,0x14,0x91,0x0f,0x04,0x0a,0x03,0x20,0x1f,0x01,0x1f,0x1f,0x1d,0x91,0x02,0x13,0x08,0x19,0x19,0x17,0x12,0x1a,0x7d,0x0c,0x12,0x05,0x05,0x08,0x12,0x00,0x00,0x21,0x0b,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0xe1,0x11,0x39,0x39, +0x2f,0x00,0x2f,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0x3f,0xed,0x32,0x2f,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x03,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x15,0x21,0x16,0x00,0x33,0x32,0x37,0x06,0xd9,0x9f,0xea,0xfe,0xde,0xfe,0x95, +0x0f,0xfe,0xb0,0xa8,0xa8,0x01,0x52,0x1d,0x01,0x7e,0x01,0x1b,0xd6,0x97,0xa3,0xcc,0xd7,0xfe,0xeb,0x18,0x02,0x79,0xfd,0x85,0x10,0x01,0x11,0xd7,0xe0,0x9d,0x3c,0x54,0x01,0x69,0x01,0x2e,0xfd,0x81,0x05,0x9a,0xfd,0x7c,0x01,0x34,0x01,0x68,0x3b,0xb3,0x56,0xfe,0xed,0xf1,0x97,0xef,0xfe,0xed,0x60,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8, +0x05,0x66,0x04,0x18,0x00,0x1f,0x00,0x68,0x40,0x3a,0x17,0x1a,0x06,0x95,0x40,0x0b,0x0a,0x08,0x0b,0x95,0x2b,0x30,0x0a,0x0f,0x40,0x12,0x50,0x12,0x02,0x12,0x12,0x14,0x95,0x0f,0x10,0x30,0x1f,0x01,0x1f,0x1f,0x1d,0x95,0x02,0x16,0x08,0x17,0x12,0x1a,0x83,0x05,0x0c,0x12,0x05,0x18,0x12,0x18,0x12,0x00,0x05,0x05,0x08,0x00,0x00,0x21, +0x0b,0x06,0x84,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xe1,0x11,0x39,0x00,0x2f,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x32,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x27,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x36,0x24,0x33, +0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x05,0x66,0x72,0xa0,0xd6,0xfe,0xf9,0x0f,0xfe,0xe2,0xa4,0xa4,0x01,0x20,0x18,0x01,0x0e,0xdc,0x89,0x67,0x64,0x92,0x93,0xb6,0x0d,0x01,0xb4,0xfe,0x4a,0x08,0xb2,0x94,0x92,0x78,0x2d,0x45,0xfb,0xdb,0xfe,0x42,0x04,0x00,0xfe,0x4a,0xdb,0xf3,0x32,0xa2, +0x4a,0xb0,0x94,0x8c,0x97,0xb5,0x5b,0x00,0x00,0x02,0x00,0x16,0x00,0x00,0x05,0x3c,0x05,0x9a,0x00,0x0b,0x00,0x14,0x00,0x66,0x40,0x37,0x0d,0x0c,0x02,0x0a,0x01,0x0a,0x0d,0x01,0x0a,0x13,0x12,0x07,0x08,0x0b,0x08,0x12,0x0b,0x08,0x02,0x03,0x06,0x07,0x0c,0x10,0x13,0x14,0x08,0x0b,0x0a,0x03,0x05,0x01,0x08,0x0a,0x0b,0x0f,0x10,0x14, +0x05,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0x7e,0x05,0x05,0x16,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x00,0x18,0x2f,0x33,0x33,0x3f,0x33,0x17,0x39,0x11,0x12,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23, +0x03,0x07,0x11,0x23,0x11,0x27,0x01,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x17,0x05,0x3c,0xbb,0xfc,0x8f,0xa8,0x83,0xff,0x00,0xb5,0x02,0x3e,0xb6,0x3e,0x7d,0x12,0x0b,0x04,0x0a,0x17,0x7d,0x9c,0x02,0x8e,0xb7,0xfe,0x29,0x01,0xd3,0xb6,0xfd,0x77,0x05,0x9a,0xfd,0x91,0x01,0x45,0x2f,0x51,0x47,0x3b,0xfe,0xc3,0xd7, +0x00,0x02,0x00,0x0c,0x00,0x00,0x03,0xf2,0x04,0x00,0x00,0x0b,0x00,0x14,0x00,0x68,0x40,0x37,0x0d,0x0c,0x02,0x0a,0x01,0x0a,0x0d,0x01,0x0a,0x13,0x12,0x07,0x08,0x0b,0x08,0x12,0x0b,0x02,0x03,0x06,0x07,0x0c,0x13,0x06,0x14,0x14,0x08,0x0b,0x0a,0x0f,0x05,0x01,0x08,0x0a,0x0b,0x0f,0x10,0x14,0x05,0x05,0x01,0x00,0x0e,0x04,0x08,0x09, +0x09,0x05,0x42,0x04,0x8b,0x05,0x05,0x16,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x00,0x18,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x2f,0x17,0x33,0x11,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27, +0x03,0x23,0x01,0x33,0x13,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x17,0x03,0xf2,0xb0,0x98,0x60,0x96,0x64,0x9c,0xa8,0x01,0xac,0xa2,0x18,0x4d,0x1b,0x08,0x04,0x0b,0x16,0x51,0x7a,0x01,0x8c,0x76,0xfe,0xea,0x01,0x16,0x78,0xfe,0x72,0x04,0x00,0xfe,0x1a,0xd2,0x4a,0x45,0x55,0x36,0xcd,0x8d,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x06,0xe6, +0x05,0x9a,0x00,0x13,0x00,0x1c,0x00,0xa1,0x40,0x59,0x15,0x14,0x02,0x12,0x01,0x12,0x15,0x01,0x12,0x1b,0x1a,0x07,0x08,0x13,0x08,0x1a,0x13,0x08,0x11,0x0a,0x09,0x12,0x09,0x02,0x03,0x06,0x07,0x14,0x1b,0x1c,0x07,0x0c,0x12,0x0a,0x91,0x40,0x11,0x0f,0x0c,0x11,0x91,0x2b,0x30,0x12,0x13,0x17,0x18,0x04,0x0f,0x03,0x01,0x05,0x08,0x09, +0x04,0x0c,0x13,0x17,0x12,0x18,0x17,0x18,0x1c,0x03,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0x7e,0x05,0x05,0x1e,0x0f,0x09,0x01,0x09,0x09,0x1e,0x10,0x0c,0x7e,0x0d,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x5d,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x00,0x18,0x2f,0x17, +0x33,0x3f,0x17,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27,0x01,0x23,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x13,0x03,0x26, +0x27,0x23,0x06,0x07,0x03,0x17,0x06,0xe6,0xbb,0xfc,0x8f,0xa8,0x84,0xff,0x00,0xb4,0x01,0x0d,0xfe,0x97,0xa8,0xa8,0x01,0xa4,0xf6,0xb6,0x3e,0x7e,0x10,0x0c,0x04,0x0a,0x17,0x7d,0x9c,0x02,0x8e,0xb7,0xfe,0x29,0x01,0xd3,0xb6,0xfd,0x77,0x02,0x9e,0xfd,0x62,0x05,0x9a,0xfd,0x9b,0x02,0x65,0xfd,0x91,0x01,0x45,0x2a,0x56,0x47,0x3b,0xfe, +0xc3,0xd7,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0x7b,0x04,0x00,0x00,0x13,0x00,0x1c,0x00,0xb0,0x40,0x50,0x11,0x0a,0x09,0x12,0x15,0x14,0x02,0x12,0x01,0x12,0x15,0x01,0x12,0x1b,0x1a,0x07,0x08,0x13,0x08,0x1a,0x13,0x08,0x02,0x03,0x06,0x07,0x14,0x1b,0x06,0x00,0x1c,0x01,0x13,0x03,0x1c,0x1c,0x0c,0x0f,0x0a,0x96,0x40,0x11,0x0f,0x0c, +0x11,0x96,0x2b,0x30,0x12,0x13,0x17,0x18,0x04,0x0f,0x0f,0x01,0x05,0x08,0x09,0x04,0x0c,0x13,0x17,0x12,0x18,0x17,0x18,0x1c,0x03,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0xb8,0x01,0x2e,0x40,0x11,0x05,0x05,0x1e,0x2f,0x09,0x3f,0x09,0x4f,0x09,0x03,0x09,0x09,0x1e,0x10,0x0c,0x84,0x0d,0x2f,0xe1,0x32,0x11,0x39,0x2f, +0x5d,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x00,0x18,0x2f,0x17,0x33,0x3f,0x17,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x17,0x33,0x11,0x12,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x87,0xc0,0xc0, +0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27,0x03,0x23,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x13,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x17,0x05,0x7b,0xb0,0x98,0x60,0x95,0x65,0x9b,0xa8,0xc2,0xfe,0xf2,0xa4,0xa4,0x01,0x46,0xb2,0xa2,0x18,0x4e,0x1b,0x07,0x05,0x0b,0x16,0x52,0x7c,0x01,0x8c,0x76,0xfe,0xea,0x01, +0x16,0x78,0xfe,0x72,0x01,0xd5,0xfe,0x2b,0x04,0x00,0xfe,0x58,0x01,0xa8,0xfe,0x1a,0xd2,0x49,0x46,0x55,0x36,0xcd,0x8d,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x05,0xaa,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0xb3,0x40,0x30,0x10,0x03,0x0f,0x03,0x1a,0x19,0x06,0x13,0x06,0x1a,0x19,0x13,0x06,0x16,0x15,0x14,0x03,0x14,0x16,0x15,0x03,0x14, +0x0d,0x0e,0x06,0x0d,0x18,0x10,0x03,0x17,0x17,0x0e,0x03,0x06,0x06,0x09,0x13,0x14,0x91,0x40,0x0f,0x0e,0x03,0x05,0x01,0x09,0x13,0x0f,0xb8,0xff,0xd8,0x40,0x14,0x0b,0x01,0x4d,0x0f,0x0f,0x00,0x03,0x14,0x00,0x0e,0x10,0x0e,0x02,0x09,0x03,0x0e,0x0e,0x06,0x0a,0x00,0xb8,0x01,0x2f,0xb6,0x01,0x0e,0x03,0x09,0x06,0x42,0x09,0xb8,0x01, +0x2f,0x40,0x0b,0x0a,0x0a,0x1b,0x18,0x17,0x03,0x7e,0x06,0x06,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x2b,0x33,0x00,0x2f,0x33,0x33,0x3f,0x33,0x1a,0xed,0x32,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x17,0x33,0x87, +0x05,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x06,0x02,0x03,0x23,0x12,0x12,0x37,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x01,0x16,0x17,0x33,0x36,0x37,0x05,0xaa,0xc0,0x32,0xfe,0x8a,0xa8,0xcb,0xcb,0x1a, +0xc1,0x33,0xfd,0xe9,0xfe,0x62,0x04,0xa0,0xfe,0x52,0xea,0xf7,0xfe,0xb0,0xfd,0x9f,0x01,0x07,0x0d,0x16,0x02,0x10,0x16,0x02,0x0a,0x66,0xfd,0x90,0x02,0x72,0x39,0xfe,0xd3,0xfe,0xf4,0x01,0x50,0x01,0x67,0x45,0x02,0x9e,0xfd,0x60,0x48,0xfe,0x9a,0x03,0xb6,0xfe,0x52,0x22,0x36,0x35,0x23,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x04,0x66, +0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x87,0x40,0x26,0x0f,0x0e,0x03,0x0e,0x0c,0x0d,0x06,0x0d,0x0f,0x42,0x0c,0x0c,0x08,0x16,0x16,0x0d,0x03,0x42,0x06,0x06,0x08,0x13,0x95,0x40,0x0e,0x0d,0x0f,0x05,0x01,0x08,0x12,0x13,0x0d,0x0e,0x0e,0x00,0x03,0x0d,0xb8,0xff,0xc0,0x40,0x16,0x0b,0x0f,0x48,0x0d,0x0d,0x06,0x09,0x00,0x83,0x01,0x0e, +0x03,0x08,0x06,0x42,0x08,0x83,0x09,0x09,0x19,0x16,0x03,0xb8,0x01,0x2e,0xb6,0x10,0x06,0x01,0x06,0x06,0x1a,0x19,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x2b,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x2f,0x33,0x33,0x3f,0x32,0x1a,0xed,0x12,0x39,0x2f,0xe5,0x12, +0x39,0x11,0x12,0x39,0x10,0xe5,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x04,0x03,0x23,0x36,0x12,0x37,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x13,0x16,0x17,0x36,0x37,0x04,0x66,0xae,0x21,0xfe,0xfd,0x9c,0xfe,0xf8,0x23,0xaf,0x29,0xb9,0xae,0xfe,0xc2,0x03,0xb5,0xfe,0xb8,0xab,0xb7,0xfe,0xd7, +0xfe,0x6f,0xb5,0x04,0x0a,0x04,0x0c,0x01,0x64,0x4e,0xfe,0x4e,0x01,0xb4,0x4b,0xfe,0x97,0xf6,0x01,0x01,0x34,0x01,0xd5,0xfe,0x29,0x36,0xff,0x00,0x02,0x86,0xfe,0xdd,0x06,0x18,0x0a,0x14,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x48,0x05,0x9a,0x00,0x18,0x00,0x1f,0x00,0xa9,0x40,0x3f,0x0c,0x0a,0x13,0x0a,0x16,0x03,0x15,0x03,0x13,0x14, +0x06,0x14,0x16,0x42,0x1c,0x1c,0x13,0x03,0x42,0x06,0x06,0x05,0x0c,0x91,0x40,0x13,0x11,0x0e,0x13,0x91,0x2b,0x30,0x1a,0x91,0x14,0x40,0x15,0x14,0x11,0x03,0x01,0x05,0x0a,0x03,0x0e,0x19,0x15,0x15,0x00,0x03,0x1a,0x00,0x14,0x10,0x14,0x02,0x0b,0x03,0x14,0x14,0x06,0x0a,0x00,0xb8,0x01,0x2f,0xb6,0x01,0x0e,0x03,0x09,0x06,0x42,0x09, +0xb8,0x01,0x2f,0x40,0x13,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0a,0x0e,0x1d,0x1c,0x03,0x7e,0x06,0x06,0x21,0x12,0x0e,0x7e,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x5d,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x17,0x33,0x3f,0x33,0x33, +0x1a,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0xe5,0x12,0x39,0x10,0xe5,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x06,0x02,0x03,0x23,0x12,0x25,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x01,0x17,0x33,0x36,0x37,0x07,0x48,0xc1, +0x2f,0xfe,0x87,0xa7,0xcb,0xcb,0x1b,0xc1,0x54,0x01,0x34,0xfe,0x16,0xa8,0xa8,0x02,0x54,0xfe,0x8a,0x04,0xa0,0xfe,0x51,0xea,0xf8,0xfe,0xaf,0xfd,0xa0,0x01,0x06,0x24,0x02,0x10,0x16,0x02,0x09,0x67,0xfd,0x90,0x02,0x72,0x39,0xfe,0xd3,0xfe,0xf4,0x02,0x0e,0x92,0xfd,0x60,0x05,0x9a,0xfd,0xa2,0x02,0x5e,0xfd,0x60,0x48,0xfe,0x9c,0x03, +0xb4,0xfe,0x52,0x58,0x35,0x23,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0xdf,0x04,0x00,0x00,0x17,0x00,0x1d,0x00,0xb8,0x40,0x4c,0x0b,0x09,0x12,0x09,0x15,0x03,0x14,0x03,0x12,0x13,0x06,0x15,0x05,0x1c,0x1c,0x13,0x03,0x42,0x06,0x06,0x05,0x0b,0x96,0x40,0x12,0x10,0x0d,0x12,0x96,0x2b,0x30,0x19,0x95,0x13,0x40,0x14,0x13,0x10,0x0f,0x01, +0x05,0x09,0x03,0x0d,0x18,0x14,0x14,0x00,0x03,0x19,0x00,0x13,0x10,0x13,0x20,0x13,0x60,0x13,0x04,0x0d,0x03,0x13,0x13,0x06,0x09,0x00,0x83,0x01,0x0e,0x03,0x08,0x06,0x42,0x08,0x83,0x09,0xb8,0xff,0xc8,0x40,0x0e,0x0b,0x0c,0x01,0x4c,0x09,0x40,0x09,0x0c,0x48,0x09,0x09,0x0d,0x1c,0x03,0xb8,0x01,0x2e,0x40,0x0c,0x0f,0x06,0x1f,0x06, +0x02,0x06,0x06,0x1f,0x11,0x0d,0x84,0x0e,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x17,0x33,0x3f,0x33,0x33,0x1a,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0xe5,0x12,0x39, +0x11,0x12,0x39,0x87,0x05,0xc0,0x10,0x87,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x04,0x03,0x23,0x12,0x37,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x01,0x21,0x01,0x16,0x16,0x01,0x21,0x13,0x16,0x17,0x37,0x05,0xdf,0xae,0x23,0xfe,0xfe,0x9c,0xfe,0xf7,0x21,0xae,0x3e,0xe2,0xfe,0x92,0xa4,0xa4,0x01,0xbc,0xfe, +0xe4,0x03,0xb4,0xfe,0xb8,0xab,0xb6,0xfe,0xd9,0xfe,0x6e,0xb4,0x07,0x07,0x11,0x01,0x66,0x4c,0xfe,0x4e,0x01,0xb4,0x4d,0xfe,0x99,0x01,0x72,0x67,0xfe,0x27,0x04,0x00,0xfe,0x58,0x01,0xa8,0xfe,0x29,0x36,0xff,0x02,0x85,0xfe,0xdd,0x0b,0x13,0x1e,0x00,0x00,0x01,0x00,0x31,0xfe,0x66,0x03,0xe2,0x06,0xcb,0x00,0x43,0x00,0x75,0x40,0x41, +0x32,0x7d,0x13,0x00,0x7d,0x01,0x2e,0x17,0x2c,0x7d,0x1b,0x13,0x01,0x1b,0x17,0x20,0x20,0x17,0x1b,0x01,0x13,0x05,0x45,0x3b,0x7e,0x09,0x03,0x9a,0x42,0x42,0x35,0x3e,0x0c,0x9a,0x39,0x39,0x35,0x2f,0x2e,0x16,0x9a,0x17,0x17,0x29,0x10,0x9a,0x35,0x27,0x26,0x0f,0x24,0x1f,0x24,0x02,0x24,0x20,0x1e,0x99,0x23,0x29,0x03,0x3e,0x9a,0x01, +0x07,0x00,0x2f,0x33,0xed,0x3f,0x33,0xed,0x32,0xc4,0x5d,0x39,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x23,0x34,0x23,0x22,0x07,0x06,0x23,0x20,0x11,0x34,0x36,0x33, +0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x37,0x03,0x33,0x17,0x37,0x33,0x03,0x36,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0xd3,0xb7,0x4d,0x2c,0x6f,0x70,0x45,0xfe, +0xb2,0xa6,0xa0,0x17,0x4b,0x4b,0x18,0x72,0x81,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x82,0xa2,0xb9,0x73,0xa4,0xa4,0x77,0xbd,0x58,0xea,0xfe,0xf0,0x94,0xae,0xdb,0xbd,0x18,0x58,0x58,0x18,0x93,0x56,0x4c,0x2b,0x7b,0x7b,0x4a,0xef,0xfe,0x66,0x4c,0x26,0x26,0x01,0x23,0x80,0x91,0x06,0x06,0x89,0x75,0x01,0x14,0x8b,0x8a, +0x7e,0x6c,0x82,0x71,0xaa,0x48,0x0d,0x01,0x1c,0xe5,0xe5,0xfe,0xdd,0x0a,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xb4,0xe2,0x06,0x06,0x89,0x3f,0x50,0x25,0x25,0x00,0x01,0x00,0x21,0xfe,0x66,0x03,0x3c,0x05,0x35,0x00,0x42,0x00,0x79,0xb3,0x31,0x84,0x13,0x00,0xb8,0x01,0x2e,0x40,0x13,0x01,0x2d,0x17,0x2a,0x84,0x1a,0x13,0x01, +0x1a,0x17,0x1f,0x1f,0x17,0x1a,0x01,0x13,0x05,0x44,0x3a,0xb8,0x01,0x2e,0x40,0x27,0x0a,0x03,0x96,0x41,0x41,0x34,0x3d,0x2e,0x2d,0x16,0x95,0x17,0x17,0x28,0x0d,0x96,0x38,0x38,0x28,0x11,0x96,0x34,0x15,0x1f,0x1d,0x95,0x0f,0x23,0x1f,0x23,0x02,0x23,0x22,0x28,0x0f,0x3d,0x95,0x01,0x07,0x00,0x2f,0x33,0xed,0x3f,0x33,0xc4,0x5d,0xed, +0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x23,0x34,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x34,0x21,0x23,0x35,0x33, +0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x37,0x03,0x33,0x17,0x37,0x33,0x03,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0x1e,0x95,0x3d,0x2e,0x55,0x55,0x38,0x82,0x99,0x9b,0x82,0x13,0x3b,0x3a,0x13,0xbf,0xfe,0xd6,0x64,0x60,0x01, +0x04,0x77,0x67,0x96,0x96,0x81,0x71,0xb6,0x73,0xa4,0xa4,0x77,0xb9,0xf9,0x71,0x61,0x70,0x8c,0xb0,0xa4,0x14,0x45,0x45,0x12,0x86,0x4b,0x41,0x2c,0x55,0x55,0x44,0xc6,0xfe,0x66,0x50,0x28,0x28,0x99,0x82,0x71,0x9a,0x07,0x08,0xa1,0xaa,0x8a,0xa4,0x45,0x53,0x4c,0x99,0x2e,0x0b,0x01,0x17,0xe5,0xef,0xfe,0xd9,0x29,0xdf,0x5b,0x80,0x15, +0x04,0x09,0x87,0x6a,0x89,0x97,0x07,0x07,0x85,0x42,0x51,0x25,0x25,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x05,0xc0,0x05,0x9a,0x00,0x19,0x00,0x3d,0x40,0x1e,0x14,0x11,0x91,0x04,0x07,0x07,0x06,0x18,0x12,0x0c,0x03,0x06,0x00,0x7e,0x17,0x17,0x1b,0x06,0x0c,0x0b,0x0b,0x1a,0x14,0x05,0x7e,0x11,0x06,0x06,0x1b,0x1a,0x11,0x12,0x39,0x2f, +0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x14,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x20,0x03,0x03,0x33,0x13,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x20,0x11,0x11,0x33,0x05,0xc0,0xfe,0xe1,0xf1,0x39,0x9c,0x54,0xfe,0xd9,0x54,0xa6,0xa4, +0xa0,0x1d,0x6b,0x6e,0x3b,0x9c,0x39,0x01,0x68,0xa8,0x03,0x87,0xdf,0xfe,0xdd,0xfe,0x7b,0x01,0x85,0x01,0x5f,0x02,0xb6,0xfd,0x5e,0x79,0x65,0x03,0x80,0xfc,0x80,0x01,0x6d,0x02,0x13,0x00,0x00,0x01,0x00,0x66,0xfe,0x1e,0x05,0x7b,0x05,0x33,0x00,0x1b,0x00,0x40,0x40,0x19,0x06,0x1c,0x13,0x13,0x1a,0x0d,0x0f,0x15,0x12,0x95,0x04,0x07, +0x16,0x00,0x84,0x19,0x19,0x1d,0x06,0x0d,0x0c,0x0c,0x1c,0x14,0x05,0xb8,0x01,0x2e,0xb4,0x13,0x06,0x06,0x1d,0x1c,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x33,0x2f,0x3f,0x31,0x30,0x01,0x10,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x26,0x27,0x03,0x33, +0x13,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x05,0x7b,0xfe,0xe4,0xe8,0x19,0x93,0x15,0xac,0xd4,0x3c,0x94,0xa6,0x94,0x2a,0x81,0x6f,0x11,0x93,0x19,0x96,0xca,0xa4,0x02,0x2d,0xfe,0xf4,0xfe,0xc9,0xfe,0x34,0x01,0xcc,0xca,0xf6,0x02,0x56,0xfd,0xaa,0xa9,0x88,0x04,0xba,0xfb,0x46,0xef,0xc3,0x01,0xd5,0x00, +0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x19,0x00,0x27,0x00,0x48,0x40,0x25,0x12,0x18,0x91,0x40,0x22,0x1c,0x0e,0x25,0x0f,0x14,0x42,0x0c,0x1a,0x14,0x91,0x20,0x20,0x00,0x0f,0x91,0x06,0x04,0x25,0x91,0x00,0x13,0x22,0x1a,0x12,0x09,0x7d,0x0c,0x0c,0x29,0x12,0x7d,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12, +0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x7c,0x2f,0x18,0xed,0x33,0x32,0x2b,0x00,0x18,0x10,0xf6,0x32,0x1a,0xed,0x32,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x24,0x23,0x22,0x00,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x17,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x05,0x16,0x00,0x33, +0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xbe,0x1a,0xfe,0xff,0xcf,0xd6,0xfe,0xea,0x0e,0xfc,0x46,0x3c,0x88,0x88,0x24,0x3d,0xfb,0xf0,0x52,0x3a,0x84,0x84,0x2e,0x2a,0xfe,0xf6,0x1a,0x01,0x09,0xc7,0xe4,0x01,0x0e,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd, +0xfe,0xa1,0xfe,0x68,0x03,0x52,0xe7,0xf9,0xfe,0xd8,0xf4,0x52,0x3a,0x3b,0x39,0x5a,0x3a,0x3a,0x56,0xe0,0xfe,0xf9,0x01,0x21,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x25,0x00,0x57,0x40,0x30,0x0b,0x25,0x1b,0x25,0x02,0x00,0x0f,0x10,0x0f,0x02,0x0c,0x03,0x11,0x17,0x95,0x40,0x21,0x1b,0x0e,0x24, +0x0e,0x13,0x42,0x0c,0x13,0x95,0x19,0x1f,0x1f,0x00,0x0e,0x95,0x06,0x10,0x24,0x95,0x00,0x16,0x09,0x83,0x0c,0x19,0x19,0x27,0x11,0x21,0x83,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x7c,0x2f,0x33,0x18,0xed,0x32,0x2b,0x00,0x18,0x10,0xf6,0x32,0x1a,0xed,0x32,0x31,0x30,0x01,0x5f,0x5e,0x5d, +0x5d,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x17,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x16,0x16,0x33,0x20,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0x69,0x22,0xfe,0xdc,0x8b,0xb5,0x12,0x8e,0x35,0x30,0x6c,0x6b, +0x1e,0x22,0x8e,0x84,0x34,0x30,0x68,0x68,0x26,0x1e,0x9c,0x12,0xb4,0x8c,0x01,0x26,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x64,0x01,0x42,0xaa,0x9a,0x31,0x34,0x35,0x5a,0x33,0x35,0x34,0x38,0x9a,0xaa,0x00,0x01,0x00,0x12,0x00,0x00,0x05,0xb8,0x05,0xb2,0x00,0x13,0x00,0x31,0x40,0x17,0x01,0x03, +0x91,0x12,0x04,0x09,0x03,0x0c,0x07,0x07,0x06,0x0c,0x0c,0x08,0x10,0x05,0x00,0x7e,0x01,0x01,0x15,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x39,0x19,0x2f,0x33,0x33,0x00,0x18,0x2f,0x33,0x3f,0x3f,0xfd,0xce,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x36,0x33, +0x32,0x05,0xb8,0x9a,0x0c,0x47,0x41,0x2a,0xfe,0x77,0xbd,0xfd,0xf8,0xbb,0x01,0x8d,0x13,0x0a,0x04,0x07,0x1a,0x01,0x3b,0x3f,0xbb,0xd1,0x04,0xc0,0x63,0x7d,0xfb,0x5a,0x05,0x9a,0xfb,0x8f,0x37,0x48,0x32,0x4f,0x03,0xc7,0xc0,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x04,0x9a,0x04,0x18,0x00,0x13,0x00,0x34,0x40,0x11,0x01,0x03,0x95,0x12, +0x10,0x09,0x0f,0x0c,0x07,0x07,0x06,0x0d,0x0d,0x08,0x10,0x05,0x00,0xb8,0x01,0x2e,0xb4,0x01,0x01,0x15,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x39,0x19,0x2f,0x33,0x33,0x00,0x18,0x2f,0x33,0x3f,0x3f,0xfd,0xce,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36, +0x33,0x32,0x04,0x9a,0x96,0x08,0x42,0x37,0x31,0xfe,0xe8,0xa8,0xfe,0x7c,0xb4,0x01,0x04,0x1d,0x07,0x04,0x08,0x18,0xbf,0x47,0xaa,0xc6,0x03,0x3c,0x54,0x88,0xfc,0xf8,0x04,0x00,0xfd,0x18,0x52,0x3d,0x45,0x46,0x02,0x32,0xd2,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x05,0xb8,0x07,0x5c,0x02,0x26,0x05,0xee,0x00,0x00,0x01,0x07,0x04,0x6e, +0x02,0x2f,0x01,0x5c,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x4b,0x40,0x0a,0x1a,0x14,0x08,0x00,0x25,0x02,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x0e,0x00,0x00,0x04,0x9a,0x06,0x00,0x02,0x26,0x05,0xef,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc1,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x6e, +0x40,0x0a,0x1a,0x14,0x08,0x00,0x25,0x02,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x04,0x00,0x5e,0xfe,0x66,0x0a,0x7f,0x05,0xdb,0x00,0x0d,0x00,0x1b,0x00,0x30,0x00,0x31,0x00,0x8f,0x40,0x33,0x0e,0x91,0x08,0x0e,0x00,0x0f,0x91,0x07,0x0e,0x01,0x16,0x91,0x00,0x15,0x91,0x40,0x01,0x01,0x07,0x32,0x31,0x24, +0x42,0x31,0x04,0x23,0x29,0x24,0x16,0x1d,0x1f,0x95,0x2f,0x10,0x26,0x0f,0x29,0x24,0x22,0x23,0x23,0x21,0x25,0x2e,0x20,0x06,0x20,0x01,0x20,0x26,0x1c,0xb8,0x01,0x2e,0x40,0x17,0x1d,0x1d,0x26,0x25,0x25,0x33,0x19,0x16,0x01,0x08,0x0f,0x01,0x0f,0x01,0x04,0x0b,0x7d,0x19,0x19,0x33,0x12,0x7d,0x04,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x11, +0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x2f,0xe1,0x12,0x39,0x5d,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x39,0x00,0x3f,0x3f,0xfd,0xce,0x3f,0x33,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x1a,0xed,0xdd,0xe6,0x10,0xf4,0xed,0x10,0xf4,0xe6,0x31,0x30,0x05,0x35,0x20,0x00,0x11,0x10,0x00,0x21,0x15, +0x20,0x00,0x11,0x10,0x00,0x01,0x35,0x22,0x00,0x11,0x10,0x00,0x33,0x15,0x32,0x00,0x11,0x10,0x00,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x13,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x33,0x32,0x13,0x02,0xfe,0xfe,0xd0,0xfe,0x90,0x01,0x7f,0x01,0x33,0x01,0x37,0x01,0x63,0xfe,0x8e,0xfe,0xd8,0xe7,0xfe,0xe5,0x01,0x12, +0xde,0xec,0x01,0x10,0xfe,0xfe,0x06,0x81,0x95,0x0a,0x40,0x3c,0x2d,0xfe,0x75,0xac,0x8f,0xfe,0x79,0xb4,0x01,0x04,0x1c,0x07,0x05,0x06,0x1a,0xaa,0x40,0xb2,0xc6,0x1b,0x42,0x52,0x01,0x93,0x01,0x43,0x01,0x52,0x01,0xa3,0x52,0xfe,0x76,0xfe,0xb7,0xfe,0xa2,0xfe,0x66,0x05,0x34,0x52,0xfe,0xb3,0xfe,0xfd,0xfe,0xf7,0xfe,0xbd,0x52,0x01, +0x34,0x01,0x16,0x01,0x1a,0x01,0x38,0xfe,0x4a,0x54,0x88,0xfb,0x5e,0x01,0x82,0x04,0x18,0xfd,0x18,0x51,0x3e,0x36,0x55,0x02,0x32,0xd2,0x01,0x9a,0x00,0x03,0x00,0x58,0xfe,0x66,0x08,0xec,0x04,0x38,0x00,0x0d,0x00,0x1a,0x00,0x2f,0x00,0x83,0x40,0x2b,0x0e,0x95,0x08,0x0e,0x00,0x0f,0x95,0x07,0x0e,0x01,0x16,0x95,0x00,0x15,0x95,0x40, +0x01,0x2e,0x23,0x42,0x22,0x29,0x23,0x16,0x1c,0x1e,0x95,0x2e,0x10,0x25,0x0f,0x29,0x23,0x2c,0x21,0x22,0x22,0x24,0x2c,0x20,0x20,0x25,0x1b,0xb8,0x01,0x2e,0x40,0x17,0x1c,0x1c,0x25,0x24,0x24,0x31,0x19,0x15,0x00,0x0e,0x07,0x00,0x07,0x00,0x04,0x0b,0x83,0x19,0x19,0x31,0x12,0x83,0x04,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39, +0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x2f,0xe1,0x12,0x39,0x11,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x39,0x00,0x3f,0x3f,0xfd,0xce,0x3f,0x33,0x2f,0x2b,0x00,0x7d,0x2f,0x1a,0x18,0xed,0xdd,0xed,0x10,0xf4,0xed,0x10,0xf4,0xed,0x31,0x30,0x05,0x35,0x22,0x00,0x35,0x34,0x00,0x33,0x15,0x32,0x00,0x15,0x14,0x00,0x03, +0x35,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x32,0x36,0x35,0x10,0x05,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x13,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x33,0x32,0x02,0x4e,0xe7,0xfe,0xf1,0x01,0x1a,0xea,0xeb,0x01,0x01,0xfe,0xeb,0xd7,0xa2,0xba,0xb3,0x9b,0xa1,0xb1,0x05,0x4c,0x96,0x08,0x42,0x3b,0x2d,0xfe,0x74,0xac,0x90, +0xfe,0x78,0xb5,0x01,0x04,0x1c,0x07,0x04,0x07,0x19,0xaa,0x40,0xb2,0xc6,0x38,0x3e,0x01,0x20,0xec,0xfa,0x01,0x2c,0x3e,0xfe,0xe6,0xfa,0xf6,0xfe,0xd8,0x03,0xa6,0x3e,0xd3,0xc1,0xb8,0xce,0x3e,0xd0,0xbb,0x01,0x8f,0x32,0x54,0x88,0xfb,0x5e,0x01,0x82,0x04,0x18,0xfd,0x18,0x51,0x3e,0x36,0x55,0x02,0x32,0xd2,0x00,0x00,0x02,0x00,0x5e, +0xff,0xb4,0x06,0x3e,0x05,0xec,0x00,0x13,0x00,0x26,0x00,0x5b,0x40,0x31,0x20,0x1e,0x16,0x18,0x0c,0x0a,0x02,0x04,0x14,0x18,0x91,0x0e,0x42,0x0a,0x04,0x22,0x1e,0x91,0x40,0x00,0x04,0x13,0x11,0x7d,0x25,0x0e,0x0e,0x1b,0x04,0x42,0x22,0x18,0x14,0x0a,0x00,0x00,0x0a,0x14,0x18,0x22,0x05,0x0e,0x1e,0x04,0x04,0x28,0x1b,0x7d,0x07,0x2f, +0xe1,0x12,0x39,0x2f,0x33,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x32,0x3f,0xe5,0xed,0x32,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x05,0x06,0x23,0x22,0x27,0x24,0x00,0x11,0x10,0x00,0x25,0x36,0x33,0x32,0x17,0x04,0x00,0x11,0x10,0x00,0x01,0x06,0x23,0x22,0x27, +0x06,0x00,0x15,0x14,0x12,0x17,0x36,0x33,0x32,0x17,0x36,0x12,0x35,0x10,0x03,0xb0,0x26,0x42,0x42,0x27,0xfe,0xd0,0xfe,0xaf,0x01,0x53,0x01,0x39,0x25,0x49,0x48,0x24,0x01,0x2c,0x01,0x4e,0xfe,0xad,0xfe,0xd1,0x26,0x3e,0x3e,0x26,0xe5,0xfe,0xff,0xf5,0xdc,0x27,0x42,0x42,0x26,0xe5,0xf9,0x14,0x38,0x38,0x1b,0x01,0x7e,0x01,0x37,0x01, +0x46,0x01,0x8b,0x1f,0x40,0x3e,0x1b,0xfe,0x82,0xfe,0xca,0xfe,0xb3,0xfe,0x76,0x05,0x0c,0x30,0x30,0x18,0xfe,0xc9,0xfa,0xf9,0xfe,0xcf,0x1c,0x37,0x37,0x1b,0x01,0x2a,0xfe,0x02,0x16,0x00,0x00,0x02,0x00,0x60,0xff,0xb0,0x04,0xd3,0x04,0x4e,0x00,0x11,0x00,0x21,0x00,0x59,0x40,0x31,0x0b,0x09,0x14,0x12,0x42,0x16,0x95,0x0d,0x09,0x10, +0x02,0x04,0x1c,0x1e,0x1a,0x95,0x40,0x00,0x42,0x04,0x16,0x0f,0x83,0x20,0x0e,0x0d,0x18,0x04,0x42,0x1e,0x1a,0x16,0x12,0x09,0x00,0x00,0x09,0x12,0x16,0x1a,0x1e,0x06,0x0d,0x04,0x04,0x23,0x18,0x83,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0xe5,0x1a,0xfd, +0x32,0xcd,0x10,0xcd,0x3f,0x33,0xfd,0xf5,0xcd,0x10,0xcd,0x31,0x30,0x05,0x06,0x23,0x22,0x27,0x26,0x02,0x35,0x10,0x25,0x36,0x33,0x32,0x17,0x04,0x11,0x14,0x02,0x03,0x06,0x23,0x22,0x27,0x04,0x11,0x10,0x05,0x36,0x33,0x32,0x17,0x24,0x11,0x10,0x03,0x0a,0x26,0x48,0x46,0x27,0xe3,0xec,0x01,0xdc,0x26,0x46,0x46,0x26,0x01,0xbf,0xf0, +0xd1,0x26,0x44,0x46,0x26,0xfe,0xcc,0x01,0x29,0x27,0x44,0x44,0x26,0x01,0x25,0x10,0x40,0x3e,0x19,0x01,0x0f,0xde,0x01,0xe8,0x36,0x3c,0x3c,0x32,0xfe,0x24,0xde,0xfe,0xe9,0x03,0x74,0x37,0x3b,0x2f,0xfe,0xa2,0xfe,0xb2,0x31,0x37,0x37,0x2f,0x01,0x54,0x01,0x4e,0x00,0x03,0x00,0x5e,0xff,0xe8,0x08,0xaa,0x08,0x05,0x00,0x29,0x00,0x41, +0x00,0x4d,0x00,0x5e,0x40,0x31,0x36,0x37,0x37,0x4c,0x47,0x2a,0x2a,0x47,0x20,0x0a,0x05,0x25,0x7d,0x1a,0x47,0x1a,0x47,0x1a,0x4f,0x10,0x7d,0x05,0x1d,0x91,0x22,0x04,0x42,0x42,0x08,0x49,0x49,0x2c,0x31,0x96,0x3c,0x3c,0x2a,0x96,0x37,0x2c,0x2c,0x0d,0x91,0x08,0x04,0x13,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0x33,0x2f,0x33,0xed, +0x32,0x2f,0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0x3f,0xed,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x39,0x11,0x33,0x2f,0x11,0x33,0x33,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23, +0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x13,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x01,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x04,0x85,0xc2,0xcb,0xfe,0xd3,0xfe,0x93,0x01,0x66,0x01,0x32,0x9e,0x6e,0x6a,0xa4,0xdf,0xfe,0xf9,0x01, +0x0e,0xf0,0xdd,0x9a,0x9a,0xdf,0xf0,0x01,0x0e,0xfe,0xfa,0xe0,0xa4,0x6a,0x6e,0x9e,0x01,0x31,0x01,0x67,0xfe,0x93,0xfe,0xd3,0xc8,0xc9,0x29,0x4a,0x85,0x78,0x6b,0x30,0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x40,0x76,0x77,0x79,0x43,0xfe,0x59,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x3e,0x56,0x01,0x8e,0x01,0x4c,0x01,0x4c,0x01, +0xa4,0x2b,0xb2,0x45,0xfe,0xba,0xfe,0xf2,0xfe,0xeb,0xfe,0xce,0x60,0x60,0x01,0x31,0x01,0x16,0x01,0x0d,0x01,0x47,0x45,0xb2,0x2b,0xfe,0x5e,0xfe,0xb4,0xfe,0xb4,0xfe,0x70,0x07,0xa3,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0xfe,0x54,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0x00,0x03,0x00,0x60, +0xff,0xe8,0x06,0xc6,0x06,0x9d,0x00,0x29,0x00,0x41,0x00,0x4d,0x00,0x5d,0x40,0x31,0x36,0x37,0x37,0x4c,0x47,0x2a,0x2a,0x47,0x0b,0x1f,0x05,0x25,0x83,0x1a,0x47,0x1a,0x47,0x1a,0x4f,0x10,0x83,0x05,0x42,0x42,0x08,0x49,0x49,0x2c,0x31,0x96,0x3c,0x3c,0x41,0x96,0x36,0x2c,0x00,0x1d,0xec,0x22,0x10,0x0d,0xec,0x08,0x10,0x13,0x95,0x02, +0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x32,0x2f,0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x39,0x11,0x33,0x2f,0x11,0x33,0x33,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32, +0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x13,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x01,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x03,0x96,0x96,0xac,0xe8,0xfe,0xf4,0x01,0x08,0xde,0x84, +0x63,0x69,0x82,0x93,0xa7,0xbb,0xad,0xa2,0x82,0x81,0xa1,0xad,0xbb,0xa6,0x92,0x83,0x69,0x63,0x85,0xde,0x01,0x06,0xfe,0xf5,0xe8,0xa9,0xf1,0x29,0x4a,0x85,0x78,0x6b,0x30,0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x40,0x76,0x77,0x79,0x43,0xfe,0x59,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x42,0x5a,0x01,0x25,0xed,0xf0,0x01,0x2e, +0x30,0xaa,0x49,0xd2,0xb9,0xb3,0xd5,0x63,0x63,0xd2,0xb6,0xb9,0xd2,0x49,0xaa,0x30,0xfe,0xd1,0xef,0xec,0xfe,0xda,0x06,0x3b,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0xfe,0x54,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x06,0xca,0x06,0xdb,0x02,0x26,0x05,0xda, +0x00,0x00,0x01,0x07,0x06,0x65,0x02,0x1f,0x01,0x0a,0x00,0x08,0xb3,0x01,0x3e,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x1e,0x00,0x00,0x05,0x5e,0x05,0x7f,0x02,0x26,0x05,0xdb,0x00,0x00,0x01,0x07,0x06,0x65,0x01,0x53,0xff,0xae,0x00,0x16,0xb9,0x00,0x01,0xff,0xea,0x40,0x09,0x20,0x15,0x08,0x00,0x25,0x01,0x1f,0x11,0x26,0x00,0x2b, +0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x5e,0xfe,0x66,0x04,0x8c,0x05,0xb2,0x00,0x15,0x00,0x31,0x40,0x1a,0x30,0x00,0x01,0x00,0x00,0x02,0x91,0x13,0x04,0x0c,0x0a,0x08,0x91,0x0d,0x13,0x0a,0x7e,0x0d,0x0d,0x10,0x00,0x00,0x17,0x05,0x7d,0x10,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x2f,0x3f,0xed,0x32,0x2f, +0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x23,0x11,0x24,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x04,0x8c,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0x20,0x2e,0xa8,0xfe,0xe8,0xfe,0xba,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x04,0xc4,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x04,0xfd,0xe3,0x01,0x82, +0x16,0x01,0x85,0x01,0x2f,0x01,0x58,0x01,0xa8,0x3b,0x00,0x01,0x00,0x60,0xfe,0x66,0x03,0x62,0x04,0x18,0x00,0x15,0x00,0x2d,0x40,0x17,0x00,0x00,0x02,0x95,0x13,0x10,0x0c,0x0a,0x08,0x96,0x0d,0x16,0x0a,0x84,0x0d,0x0d,0x10,0x00,0x00,0x17,0x05,0x83,0x10,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x2f,0x3f, +0xed,0x32,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x11,0x26,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x03,0x62,0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x1e,0x28,0xa2,0xc0,0xe8,0x01,0x22,0xf2,0x87,0x67,0x03,0x3e,0x50,0xe1,0xb7,0xb4,0xd0,0x09,0xfd,0xeb,0x01,0x88,0x15,0x01,0x17,0xce,0xfd,0x01,0x33, +0x32,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x03,0xd5,0x05,0x9a,0x00,0x13,0x00,0xc8,0x40,0x6b,0x09,0x08,0x11,0x06,0x07,0x12,0x05,0x0a,0x05,0x0c,0x08,0x11,0x03,0x07,0x12,0x04,0x0b,0x04,0x0d,0x08,0x11,0x02,0x01,0x0e,0x01,0x13,0x07,0x12,0x10,0x08,0x11,0x00,0x0f,0x0f,0x0e,0x0e,0x00,0x04,0x0a,0x42,0x05,0x04,0x04,0x03,0x13,0x06, +0x03,0x02,0x07,0x12,0x07,0x02,0x03,0x06,0x13,0x04,0x12,0x07,0x10,0x0d,0x0c,0x09,0x08,0x11,0x08,0x09,0x0c,0x0d,0x10,0x04,0x11,0x08,0x00,0x01,0x0f,0x0a,0x0b,0x05,0x40,0x04,0x05,0x0e,0x0f,0x05,0x0f,0x05,0x08,0x12,0x11,0x03,0x07,0x08,0x11,0x12,0x07,0x0b,0x0a,0x0e,0x08,0x12,0x00,0x42,0x00,0x12,0x12,0x15,0x08,0x2f,0x12,0x39, +0x2f,0xce,0x2b,0x01,0x10,0xe2,0x32,0x33,0x11,0x33,0x00,0x18,0x2f,0x33,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x1a,0x10,0xcd,0x32,0x10,0xcd,0x32,0x11,0x12,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x33,0x2b,0x01,0x10,0xe1,0x32, +0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x07,0x25,0x03,0x05,0x07,0x25,0x03,0x23,0x13,0x25,0x37,0x05,0x13,0x25,0x37,0x05,0x13,0x33,0x03,0x03,0xd5,0x37,0xfe,0xe5,0x99,0x01,0x16,0x38,0xfe,0xec,0xac,0x91,0xc3,0xfe,0xf3,0x37,0x01,0x0a,0x9a, +0xfe,0xfa,0x38,0x01,0x04,0xa1,0x93,0xba,0x03,0x6a,0x7a,0x7e,0xfe,0x9c,0x7c,0x7c,0x7c,0xfe,0x72,0x01,0xc4,0x78,0x7c,0x76,0x01,0x62,0x74,0x7e,0x75,0x01,0x79,0xfe,0x50,0x00,0x00,0x01,0x00,0x52,0x04,0xc2,0x02,0xd7,0x05,0xcb,0x00,0x11,0x00,0x18,0x40,0x0a,0x0b,0x08,0xe2,0x00,0x02,0x09,0x0e,0x00,0x0e,0x05,0x2f,0xcd,0xcd,0x10, +0xcd,0x00,0x2f,0xdd,0xfd,0xcc,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x0a,0x0a,0x52,0x26,0x36,0x36,0x26,0x01,0x73,0x0b,0x4f,0x26,0x36,0x36,0x26,0x05,0x12,0x50,0x36,0x26,0x27,0x36,0x50,0x36,0x27,0x26,0x36,0x00,0x01,0x00,0x5e,0x04,0xc2,0x03,0x0a,0x05,0xbe, +0x00,0x0f,0x00,0x1c,0x40,0x0d,0x0e,0x4c,0x03,0x09,0x99,0x00,0x08,0x00,0xc2,0x01,0x01,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x33,0xed,0xdc,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x06,0x23,0x23,0x35,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0x0a,0x7a,0x32,0x64,0x32,0x61,0x61,0x42,0x66,0x50,0x3d,0x6a,0x69,0x4c,0x97, +0x04,0xc2,0x88,0x44,0x44,0x9a,0x31,0x31,0xff,0xff,0xff,0x90,0x04,0x7b,0x00,0x7d,0x06,0x23,0x00,0x07,0x04,0x61,0xfd,0xae,0x00,0x00,0xff,0xff,0xff,0x86,0x04,0x7b,0x00,0x71,0x06,0x23,0x00,0x07,0x04,0x29,0xfd,0xa2,0x00,0x00,0x00,0x08,0x00,0x21,0xfe,0xcf,0x07,0xbc,0x05,0x5a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b, +0x00,0x47,0x00,0x53,0x00,0x5f,0x00,0xd5,0x40,0x74,0x0d,0x11,0x19,0x03,0x1d,0x0f,0x1b,0xc3,0x15,0x21,0x21,0x09,0x39,0x3d,0x41,0x49,0x03,0x4d,0x3f,0x4b,0xc3,0x45,0x51,0x51,0x39,0x5d,0x55,0x59,0x57,0xc3,0x40,0x5d,0x0e,0x30,0x39,0x05,0x42,0x09,0xc3,0x03,0x01,0x05,0x2d,0x39,0xc3,0x27,0x33,0x40,0x24,0x2a,0x35,0x03,0x30,0x3c, +0x0c,0xc4,0x3d,0x0d,0x0d,0x80,0x41,0x11,0xc4,0x42,0x12,0x0e,0x2a,0x30,0x18,0x42,0x48,0x18,0xc4,0x49,0x19,0x4d,0x1d,0xc4,0x4e,0x1e,0x1e,0x06,0x36,0x24,0xc4,0x25,0x25,0x80,0x29,0xc4,0x2a,0x0e,0x06,0x30,0x00,0x42,0x54,0x00,0xc4,0x55,0x01,0x59,0x05,0xc4,0x5a,0x06,0x06,0x61,0x36,0x30,0xc4,0x31,0x80,0x35,0xc4,0x36,0x2f,0xe1, +0x1a,0xdc,0xe1,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0xdc,0x32,0xe1,0x32,0x2b,0x01,0x10,0xf2,0xe1,0x1a,0xc8,0x18,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0xdc,0x32,0xe1,0x32,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x32,0x1a,0xc8,0x18,0x2f,0x32,0xe1,0x32,0x00,0x2f,0x17,0x33,0x1a,0xdc,0x32,0xed,0x32,0x2f,0x33,0xde,0xed,0x2b,0x00, +0x18,0x10,0xf6,0x1a,0xfd,0xce,0x32,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0xce,0x17,0x32,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0xce,0x17,0x32,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32, +0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x04,0xa2,0x50, +0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x02,0x8f,0x50,0x08,0x67,0x62,0x0e,0x52,0x08,0x6b,0x4f,0x52,0x6a,0xfa,0xfd,0x50,0x08,0x67,0x63,0x0d,0x52,0x08,0x6b,0x4f,0x52,0x6a,0x05,0x98,0x50,0x08,0x66,0x64,0x0c,0x52,0x07,0x6b,0x50,0x52,0x69,0xf9,0xe9,0x50,0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x05,0x8f, +0x50,0x08,0x67,0x62,0x0e,0x52,0x08,0x6b,0x4f,0x52,0x6a,0xfa,0xfd,0x50,0x08,0x67,0x63,0x0d,0x52,0x08,0x6b,0x4f,0x52,0x6a,0x02,0x7e,0x50,0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x04,0xa4,0x6a,0x6a,0x53,0x63,0x63,0xfe,0xaf,0x6a,0x6a,0x52,0x64,0x63,0x53,0x6a,0x6a,0x52,0x64,0x63,0xfd,0xc3,0x6b,0x6b,0x52,0x64,0x62, +0x54,0x6b,0x6b,0x53,0x63,0x62,0xfd,0xc1,0x6b,0x6b,0x52,0x64,0x63,0x53,0x6b,0x6b,0x52,0x64,0x63,0xfe,0xab,0x6b,0x6b,0x53,0x63,0x63,0x00,0x08,0x00,0x35,0xfe,0x66,0x07,0x68,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x95,0x40,0x4d,0x4f,0x15,0x5f,0x15,0x02,0x15,0x17,0x19, +0x1b,0x17,0x1b,0x17,0x1f,0x12,0x0b,0x09,0x40,0x07,0x50,0x07,0x02,0x07,0x05,0x09,0x05,0x09,0x05,0x0c,0x02,0x1e,0x2f,0x1f,0x01,0x1f,0x0c,0x03,0x02,0x12,0x10,0x0e,0x0c,0x14,0x16,0x08,0x0a,0x06,0x04,0x1a,0x18,0x1e,0x1c,0x00,0x02,0x16,0x0a,0x16,0x0a,0x11,0x02,0x18,0x04,0x18,0x04,0x1c,0x02,0x1c,0x02,0x0c,0x10,0x11,0x11,0x21, +0x0d,0x0c,0x0c,0x21,0x20,0x11,0x12,0x39,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x00,0x2f,0xcd,0xd6,0xdd,0xd6,0xcd,0x10,0xd6,0x5d,0xcd,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x5d,0x10,0xcd,0x11, +0x12,0x39,0x39,0x2f,0x2f,0xcd,0x10,0xcd,0x5d,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x07,0x03,0x37,0x05,0x05,0x27,0x25,0x01,0x25,0x35,0x05,0x05,0x25,0x35,0x05,0x01,0x07,0x03,0x37,0x05,0x05,0x27,0x25,0x05,0x03,0x23,0x13,0x04,0x4c,0x5c,0x7c,0x76,0xfe,0x6a,0x58,0xa6,0x46,0x05,0x16,0xfe,0xc7,0x58,0x01,0x4d,0xfb,0x28,0xfe,0x9f, +0x01,0x61,0x05,0xd2,0xfe,0xa0,0x01,0x60,0xfe,0xe0,0x46,0xb8,0x58,0xfc,0xdb,0xfe,0xb2,0x43,0x01,0x39,0x02,0x04,0x75,0x62,0x5c,0x05,0x9a,0xfe,0xa0,0x01,0x60,0xfe,0x10,0x58,0x01,0x4e,0x44,0xb1,0xb8,0x58,0xa6,0xfd,0x2d,0x74,0x63,0x5c,0x9e,0x5c,0x7b,0x74,0xfd,0x7a,0x44,0x01,0x3a,0x58,0x81,0xa6,0x46,0xb8,0xbf,0xfe,0xa0,0x01, +0x60,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0x45,0x40,0x23,0x0a,0x01,0x91,0x07,0x04,0x04,0x05,0x13,0x91,0x0b,0x0b,0x05,0x03,0x14,0x91,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x7d,0x18,0x18,0x1c,0x0b,0x07,0x14,0x7e,0x04,0x00,0x00,0x1c,0x1b,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x12, +0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x93,0x93,0xa8,0xa2,0xa2,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe, +0xec,0x95,0xa2,0xfe,0xc9,0x04,0x74,0x9a,0x8c,0x8c,0x9a,0xfe,0xc6,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x03,0xb4,0x05,0xec,0x00,0x12,0x00,0x19,0x00,0x47,0x40,0x24,0x0a,0x01,0x96,0x07,0x04,0x04,0x06,0x0b,0x95,0x13,0x13,0x00,0x06,0x00,0x14,0x95,0x00,0x02,0x00,0x09, +0x09,0x14,0x0f,0x83,0x17,0x17,0x1b,0x0b,0x07,0x14,0x84,0x04,0x00,0x00,0x1b,0x1a,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x11,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x32,0x16, +0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0x79,0x79,0xa4,0x81,0x81,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x04,0xd1,0x85,0x96,0x96,0x85,0xfd,0xa6,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x75,0x40,0x3f, +0x16,0x00,0x15,0x01,0x15,0x13,0x03,0x14,0x02,0x14,0x03,0x00,0x06,0x09,0x16,0x13,0x10,0x0f,0x01,0x02,0x06,0x14,0x0f,0x15,0x1f,0x15,0x2f,0x15,0x03,0x15,0x15,0x0f,0x06,0x91,0x10,0x10,0x08,0x0f,0x91,0x09,0x03,0x08,0x02,0x01,0x01,0x0d,0x07,0x15,0x00,0x14,0x01,0x14,0x14,0x10,0x0d,0x7d,0x18,0x18,0x1c,0x10,0x07,0x7e,0x08,0x2f, +0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0x10,0xc6,0x32,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x01,0x17,0x07,0x27,0x06,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16, +0x15,0x14,0x01,0x11,0x33,0x32,0x37,0x27,0x37,0x17,0x36,0x35,0x10,0x21,0x03,0x81,0x75,0x73,0x7d,0x67,0x7e,0xbd,0xa8,0x01,0x8a,0xe6,0xfd,0xfd,0x3b,0xb0,0x52,0x46,0x66,0x72,0x6f,0x52,0xfe,0xb0,0x02,0x89,0xb0,0x4d,0xba,0x28,0xfd,0xe2,0x05,0x9a,0xe0,0xcc,0xe3,0x01,0xf7,0xfd,0xb4,0x15,0x97,0x4e,0xa4,0x4e,0x8c,0x01,0x1c,0x00, +0x00,0x02,0x00,0xa6,0xfe,0x23,0x04,0x54,0x04,0x18,0x00,0x14,0x00,0x25,0x00,0x7c,0x40,0x44,0x18,0x00,0x17,0x01,0x17,0x15,0x03,0x16,0x02,0x16,0x03,0x00,0x05,0x10,0x18,0x15,0x24,0x1d,0x09,0x1c,0x01,0x02,0x05,0x16,0x17,0x40,0x09,0x0c,0x48,0x17,0x17,0x1d,0x24,0x95,0x05,0x16,0x0e,0x1d,0x95,0x10,0x10,0x0c,0x0f,0x02,0xdf,0x01, +0x01,0x01,0x01,0x13,0x09,0x17,0x00,0x16,0x01,0x16,0x16,0x21,0x13,0x83,0x1a,0x1a,0x27,0x21,0x0c,0x09,0x84,0x0a,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0x5d,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0x2b,0x33,0x10,0xc6,0x32,0x3f,0x11,0x12,0x39,0x39,0x11,0x12,0x39, +0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x25,0x17,0x07,0x27,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x05,0x27,0x37,0x17,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x03,0xae,0x70,0x72,0x72,0x52,0x67,0xd7,0x5c,0x04,0xa4,0xa4,0x04,0x74, +0xee,0xc0,0xe4,0xfe,0x92,0x78,0x74,0x72,0x5a,0xa2,0x85,0x8d,0xb0,0xa6,0x80,0x42,0x56,0xa8,0x4e,0xaa,0x22,0xac,0xfd,0x8f,0x05,0xdd,0xb4,0xcc,0xfe,0xf2,0xe3,0xfe,0xc9,0x69,0xb1,0x4d,0xaa,0x71,0xd0,0xa9,0xc9,0xc9,0x98,0x8f,0x7f,0xad,0x00,0x01,0x00,0xbc,0xfe,0x66,0x04,0x33,0x05,0x9a,0x00,0x19,0x00,0x40,0x40,0x24,0x18,0x91, +0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0b,0x0a,0x91,0x11,0x11,0x0b,0x10,0x91,0x0d,0x03,0x0b,0x0f,0x0f,0x0c,0x15,0x7d,0x06,0x06,0x1b,0x11,0x0b,0x7e,0x01,0x42,0x0c,0x2f,0xe2,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x10,0xde,0x32,0x5d,0xed,0x31,0x30,0x13,0x35,0x16,0x33, +0x32,0x36,0x35,0x34,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x20,0x00,0x11,0x14,0x00,0x21,0x22,0xbe,0xa4,0x9a,0xbd,0xca,0xfe,0xdb,0x46,0xa8,0x02,0xd0,0xfd,0xd8,0x4a,0x01,0x27,0x01,0x5e,0xfe,0xd9,0xfe,0xf4,0xae,0xfe,0xb2,0xb8,0x6c,0xdf,0xcb,0xd5,0x01,0x25,0xfd,0x5e,0x05,0x9a,0x9a,0xfe,0x3a,0xfe,0x97,0xfe, +0xdd,0xfd,0xfe,0xb5,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xaa,0x04,0x00,0x00,0x19,0x00,0x3f,0x40,0x23,0x18,0x95,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0b,0x0a,0x95,0x11,0x11,0x0b,0x10,0x95,0x0d,0x0f,0x0b,0x0e,0x0e,0x0c,0x15,0x83,0x06,0x06,0x1b,0x11,0x0b,0x84,0x01,0x0c,0x2f,0x33,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11, +0x39,0x2f,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x10,0xde,0x32,0x5d,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0xa6,0x75,0x8b,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0x02,0x76,0xfe,0x2e,0x42,0xf7,0x01,0x27,0xfe,0xe9,0xef,0x99, +0xfe,0xa0,0xa0,0x4e,0xbb,0xa9,0xb9,0xd7,0xfe,0x1a,0x04,0x00,0x8c,0xff,0x00,0xfe,0xdd,0xf9,0xd7,0xfe,0xe5,0x00,0x00,0x01,0x00,0x60,0xfe,0xae,0x03,0xe2,0x05,0xb2,0x00,0x31,0x00,0x79,0x40,0x46,0x08,0x0a,0xe2,0x40,0x05,0x32,0x80,0x00,0x0e,0x26,0x2c,0x2b,0x18,0x92,0x1b,0x1b,0x26,0x00,0x11,0x10,0x11,0x20,0x11,0x03,0x11,0x13, +0x92,0x0e,0x13,0x0f,0x23,0x1f,0x23,0x2f,0x23,0x03,0x23,0x21,0x92,0x26,0x04,0x08,0x02,0xc2,0x0c,0x00,0xc2,0x0e,0x0e,0x2f,0x10,0x2b,0x19,0x29,0x7d,0x1e,0x23,0x1e,0x19,0x19,0x1e,0x23,0x03,0x10,0x2f,0x7d,0x16,0x16,0x33,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1, +0xd6,0xe1,0xc6,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x5d,0x12,0x39,0x2f,0xed,0x39,0x39,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x05,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22, +0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x06,0x02,0x4c,0x35,0x5a,0x4c,0x47,0x38,0x32,0x30,0x44,0x2d,0xf1,0x84,0xa8,0xd5,0x9b,0xb7,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x9e,0xce,0xcc,0xea,0xfe,0xf0,0x94,0xae,0xd8,0x10,0x56,0x40,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x3e,0x50,0x54,0xb6, +0x7b,0x96,0x7f,0x01,0x14,0x8b,0x8a,0x7e,0x6c,0x82,0x71,0xaa,0x58,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xab,0xe1,0x00,0x01,0x00,0x58,0xfe,0xae,0x03,0x44,0x04,0x18,0x00,0x2e,0x00,0x70,0x40,0x3d,0x08,0x0a,0xe2,0x40,0x05,0x2f,0x80,0x00,0x0e,0x24,0x29,0x28,0x17,0x95,0x40,0x1a,0x24,0x0e,0x1a,0x95,0x2b,0x30,0x11,0x13, +0x95,0x0e,0x16,0x21,0x1f,0x95,0x24,0x10,0x08,0x02,0xc2,0x0c,0x00,0xc2,0x0e,0x0e,0x2c,0x11,0x29,0x18,0x26,0x84,0x1c,0x21,0x1c,0x18,0x18,0x1c,0x21,0x03,0x11,0x2c,0x84,0x15,0x15,0x30,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0xc6,0x00,0x3f,0xfd,0xc6, +0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x05,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x35,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15, +0x16,0x16,0x15,0x14,0x06,0x02,0x00,0x33,0x5a,0x4b,0x48,0x38,0x32,0x30,0x44,0x2d,0xc9,0x66,0x86,0xb4,0x01,0x0e,0xfe,0xd7,0x65,0x60,0x01,0x05,0x77,0x68,0x96,0x96,0xaa,0x8e,0x01,0x76,0xd2,0x70,0x8c,0xac,0x12,0x53,0x41,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x3e,0x50,0x04,0x30,0xa2,0x4c,0xac,0xaa,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d, +0xfe,0xee,0xbe,0x32,0x04,0x09,0x87,0x6a,0x77,0xa0,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x18,0x00,0x52,0x40,0x2a,0x08,0x11,0x96,0x0b,0x0e,0x0e,0x0d,0x13,0x04,0x18,0x04,0x18,0x01,0x18,0x06,0x16,0x0d,0x03,0x01,0x06,0x10,0x10,0x16,0x11,0x16,0x17,0x17,0x06,0x01,0x00,0x00,0x1a,0x19,0x09,0x0e,0x11,0x18,0x03, +0x06,0x7e,0x0b,0x07,0x2f,0x33,0xe1,0x17,0x32,0xc6,0x11,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x5d,0x11,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x37, +0x01,0x33,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x25,0x0d,0xfd,0x3e,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x4d,0x40,0x27,0x0f,0x06, +0x96,0x0c,0x09,0x09,0x0b,0x00,0x11,0x02,0x14,0x14,0x04,0x12,0x0f,0x01,0x04,0x0e,0x0e,0x12,0x0f,0x07,0x05,0x12,0x13,0x13,0x04,0x01,0x00,0x00,0x16,0x0c,0x0f,0x14,0x03,0x04,0x84,0x09,0x05,0x2f,0x33,0xe1,0x17,0x32,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x10,0xc6,0x11,0x12,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x11,0x39,0x11,0x33, +0x33,0x3f,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5, +0xfe,0x12,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0xac,0x05,0x9a,0x00,0x12,0x00,0x42,0x40,0x20,0x0d,0x04,0x12,0x12,0x06,0x08,0x91,0x10,0x0b,0x03,0x01,0x06,0x10,0x11,0x11,0x06,0x01,0x00,0x00,0x14,0x07,0x09,0x09,0x13,0x12,0x0b,0x06,0x7e,0x07,0x07,0x14,0x13,0x11,0x12,0x39,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f, +0x33,0x12,0x39,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x05,0xac,0xea,0xfd,0xd6,0x1b,0x0b,0x04,0xa8,0xfe,0x63,0x02,0x45,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x20,0x12,0xfd,0x3e, +0x05,0x00,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0xa4,0x04,0x00,0x00,0x0e,0x00,0x42,0x40,0x20,0x0b,0x02,0x0e,0x0e,0x04,0x06,0x95,0x0c,0x09,0x0f,0x01,0x04,0x0c,0x0d,0x0d,0x04,0x01,0x00,0x00,0x10,0x05,0x07,0x07,0x0f,0x0e,0x09,0x04,0x84,0x05,0x05,0x10,0x0f,0x11,0x12,0x39,0x2f, +0xe1,0x32,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x01,0x33,0x01,0x04,0xa4,0xe4,0xfe,0x3e,0x04,0xa4,0xfe,0xc8,0x01,0xdc,0x04,0x01,0xae,0xd9,0xfe,0x23,0x01,0xea,0xfe,0x16, +0x03,0x74,0x8c,0xfe,0x2d,0x01,0xd3,0xfe,0x10,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0x90,0x05,0x9a,0x00,0x0d,0x00,0x3b,0x40,0x1f,0x05,0x91,0x40,0x0a,0x09,0x06,0x0a,0x91,0x2b,0x30,0x01,0x91,0x0c,0x0c,0x09,0x03,0x03,0x06,0x00,0x00,0x0f,0x02,0x7e,0x0b,0x03,0x03,0x0f,0x0a,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33, +0xe1,0x11,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x21,0x06,0x90,0xfe,0x62,0xa8,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0x02,0x46,0x05,0x00,0xfb,0x00,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00,0x01,0x00,0xa6, +0x00,0x00,0x05,0x2f,0x04,0x00,0x00,0x0d,0x00,0x3b,0x40,0x1f,0x05,0x95,0x40,0x0a,0x09,0x06,0x0a,0x95,0x2b,0x30,0x01,0x95,0x0c,0x0c,0x09,0x0f,0x03,0x06,0x00,0x00,0x0f,0x02,0x84,0x0b,0x03,0x03,0x0f,0x0a,0x05,0x84,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x11,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x10,0xed,0x2b,0x00,0x18, +0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x21,0x05,0x2f,0xfe,0xc9,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0x01,0xdb,0x03,0x74,0xfc,0x8c,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0x00,0x01,0x00,0xbc,0xfe,0x66,0x07,0xbe,0x05,0x9a,0x00,0x1b,0x00,0x45,0x40,0x27,0x0a,0x91, +0x13,0x13,0x0c,0x0e,0x91,0x11,0x03,0x1a,0x91,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0c,0x0c,0x0f,0x13,0x0b,0x7e,0x01,0x42,0x0c,0x0c,0x10,0x17,0x7d,0x06,0x06,0x1d,0x0f,0x7e,0x10,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe2,0xe1,0x32,0x00,0x2f,0x33,0x10,0xde,0x32,0x5d,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31, +0x30,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x00,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x20,0x00,0x11,0x14,0x00,0x21,0x22,0x04,0x4c,0xa4,0x99,0xbc,0xcd,0xff,0x00,0xda,0x46,0xa8,0xfd,0x1a,0xa8,0x04,0x36,0x4a,0x01,0x26,0x01,0x5c,0xfe,0xd6,0xfe,0xfa,0xae,0xfe,0xb2,0xae,0x6c,0xe7,0xcd,0xd3,0x01,0x29, +0xfd,0x5c,0x05,0x04,0xfa,0xfc,0x05,0x9a,0xfd,0x9e,0xfe,0x99,0xfe,0xdd,0xff,0xfe,0xb7,0x00,0x00,0x01,0x00,0xa6,0xfe,0x66,0x06,0x56,0x04,0x00,0x00,0x1b,0x00,0x44,0x40,0x26,0x0a,0x95,0x14,0x14,0x0c,0x0d,0x95,0x12,0x0f,0x1a,0x95,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0c,0x0c,0x0f,0x13,0x0b,0x84,0x01,0x0c,0x0c,0x10, +0x17,0x83,0x06,0x06,0x1d,0x0f,0x84,0x10,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x32,0x00,0x2f,0x33,0x10,0xde,0x32,0x5d,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22, +0x03,0x54,0x72,0x8e,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0xfd,0xf6,0xa4,0x03,0x52,0x42,0xf7,0x01,0x25,0xfe,0xeb,0xef,0x99,0xfe,0xa0,0xa4,0x4c,0xb6,0xa8,0xb9,0xd7,0xfe,0x1a,0x03,0x74,0xfc,0x8c,0x04,0x00,0xfe,0x74,0xfe,0xdb,0xf7,0xd5,0xfe,0xe3,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xb6,0x05,0xb2,0x00,0x3b,0x00,0x4f,0x00,0x4a, +0x40,0x29,0x46,0x7d,0x21,0x1c,0x3a,0x2e,0x03,0x21,0x2b,0x7d,0x3c,0x21,0x0c,0x3c,0x3c,0x0c,0x21,0x03,0x51,0x15,0x7d,0x05,0x31,0x91,0x37,0x13,0x4b,0x1a,0x41,0x91,0x26,0x26,0x1a,0x10,0x91,0x0a,0x04,0x1a,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f, +0x2f,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x06, +0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x02,0xff,0x8e,0xf6,0xb5,0x68,0x57,0xa9,0xf8,0xa0,0x24,0x23,0x0e,0x26,0x13,0x73,0xb5,0x7e,0x42,0x44,0x80,0xb6,0x72,0x41,0x3a,0x38,0x57,0x3b,0x1f,0x33,0x5e,0x89,0x55,0x5c,0x8a,0x5c,0x2f,0x76,0x62,0x18,0x32,0x1b,0x31,0x66,0x26,0x50,0x7a,0x42,0x74, +0x35,0x78,0x01,0x33,0x18,0x2f,0x47,0x30,0x31,0x49,0x30,0x18,0x1c,0x35,0x4d,0x31,0x33,0x44,0x29,0x11,0x18,0x5f,0xb7,0x01,0x0f,0xaf,0xaa,0x01,0x17,0xc7,0x6e,0x08,0x99,0x04,0x05,0x53,0x9a,0xdb,0x87,0x81,0xd8,0x9c,0x58,0x0e,0x38,0x8b,0x9c,0xa6,0x52,0x86,0xd2,0x91,0x4c,0x4c,0x91,0xd2,0x86,0xc6,0xfe,0xd4,0x62,0x07,0x07,0x18, +0x16,0x9b,0x28,0x1e,0x1b,0x3d,0x02,0xfb,0x5a,0x97,0x6f,0x3e,0x3c,0x6d,0x9a,0x5f,0x4f,0x96,0x87,0x71,0x29,0x2c,0x76,0x89,0x95,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x55,0x04,0x1a,0x00,0x38,0x00,0x48,0x00,0x54,0x40,0x31,0x1b,0x36,0x1e,0x28,0xef,0x39,0x43,0x84,0x1e,0x4f,0x39,0x01,0x39,0x0c,0x1e,0x1e,0x0c,0x39,0x03,0x4a, +0x14,0x83,0x40,0x05,0x50,0x05,0x60,0x05,0x03,0x05,0x2e,0x95,0x34,0x16,0x46,0x19,0x3e,0x95,0x23,0x23,0x19,0x0f,0x95,0x0a,0x0f,0x19,0x95,0x00,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22, +0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x27,0x06,0x06,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02, +0x53,0x6a,0xb6,0x86,0x4d,0x43,0x7e,0xb4,0x71,0x1d,0x1a,0x19,0x1e,0x48,0x76,0x53,0x2d,0x2a,0x52,0x77,0x4d,0x1e,0x1c,0x44,0x4d,0x22,0x45,0x69,0x47,0x48,0x69,0x45,0x21,0x4d,0x42,0x0e,0x1d,0x10,0x23,0x4b,0x1c,0x39,0x5c,0x61,0x56,0x2a,0x5c,0x01,0x02,0x10,0x20,0x2c,0x1d,0x21,0x2f,0x1e,0x0e,0x44,0x3f,0x3d,0x35,0x18,0x44,0x85, +0xc4,0x7f,0x7a,0xca,0x91,0x51,0x08,0x8d,0x09,0x3d,0x6b,0x92,0x54,0x57,0x91,0x6a,0x3b,0x03,0x4a,0xd5,0x86,0x44,0x84,0x69,0x41,0x3e,0x67,0x85,0x47,0x86,0xd4,0x4a,0x02,0x03,0x11,0x10,0x88,0x23,0x28,0x14,0x15,0x02,0x25,0x38,0x5b,0x41,0x24,0x28,0x44,0x5a,0x32,0x7e,0xb0,0x31,0x31,0xaf,0x00,0x01,0x00,0x5e,0xfe,0xae,0x04,0x8c, +0x05,0xb2,0x00,0x23,0x00,0x52,0x40,0x2c,0x0a,0x0c,0xe2,0x40,0x07,0x10,0x80,0x02,0x10,0x16,0x30,0x19,0x01,0x19,0x19,0x1b,0x91,0x16,0x04,0x20,0x23,0x01,0x23,0x23,0x21,0x91,0x10,0x13,0x0a,0x0a,0x10,0x0e,0xc2,0x02,0x04,0x04,0x13,0x18,0x00,0x00,0x25,0x1e,0x7d,0x13,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0xf1,0x32, +0xc2,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x25,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x24,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x04,0x8c,0x72,0xae, +0x34,0x5a,0x4c,0x47,0x38,0x31,0x31,0x44,0x2d,0xfe,0xd1,0xfe,0x99,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0xd8,0x9e,0x3c,0x3c,0x12,0x54,0x40,0x4e,0x5e,0x16,0x6d,0x19,0x42,0x3e,0x50,0x04,0x01,0x89,0x01,0x3d,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00, +0x00,0x01,0x00,0x60,0xfe,0xae,0x03,0x62,0x04,0x18,0x00,0x23,0x00,0x4c,0x40,0x28,0x15,0x17,0xe2,0x40,0x12,0x24,0x80,0x0d,0x1b,0x21,0x00,0x00,0x02,0x95,0x21,0x10,0x30,0x0a,0x01,0x0a,0x0a,0x08,0x95,0x1b,0x16,0x15,0x15,0x1b,0x19,0xc2,0x0d,0x0f,0x0f,0x0a,0x1e,0x0b,0x00,0x05,0x83,0x1e,0x2f,0xe1,0x2f,0x33,0x11,0x12,0x39,0x2f, +0x33,0xf1,0x32,0xc2,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x26,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x03,0x62, +0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x86,0x76,0x58,0x72,0x32,0x59,0x4c,0x47,0x38,0x31,0x31,0x44,0x2e,0xc8,0xf4,0x01,0x22,0xf2,0x87,0x67,0x03,0x3e,0x50,0xe1,0xb7,0xb4,0xd0,0x59,0x9c,0x35,0x0e,0x54,0x3e,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x40,0x50,0x0e,0x01,0x19,0xd7,0xfd,0x01,0x33,0x32,0x00,0x00,0x01,0x00,0x29,0xfe,0x80,0x04,0x0c, +0x05,0x9a,0x00,0x0b,0x00,0x42,0xb9,0x00,0x05,0x01,0x30,0x40,0x14,0x01,0x08,0x91,0x0a,0x03,0x02,0x91,0x40,0x07,0x00,0x0e,0x02,0x09,0x07,0x42,0x09,0x09,0x07,0x0c,0x03,0xb8,0x01,0x2c,0xb7,0x06,0x06,0x02,0x7e,0x07,0x07,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f, +0x1a,0xed,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xc1,0x9b,0xce,0xfe,0x63,0x03,0xe3,0x05,0x02,0xfb,0x96,0xfd,0xe8,0x01,0x80,0x05,0x02,0x98,0x00,0x01,0x00,0x1e,0xfe,0x8a,0x03,0x29,0x04,0x00,0x00,0x0b,0x00,0x42,0xb9,0x00,0x05,0x01,0x31,0x40,0x14,0x01, +0x08,0x95,0x0a,0x0f,0x02,0x95,0x40,0x07,0x00,0x0e,0x02,0x09,0x07,0x42,0x09,0x09,0x07,0x0c,0x03,0xb8,0x01,0x2c,0xb7,0x06,0x06,0x02,0x84,0x07,0x07,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23, +0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x29,0xfe,0xcd,0x98,0x8e,0xae,0xfe,0xcc,0x03,0x0b,0x03,0x74,0xfd,0x18,0xfd,0xfe,0x01,0x76,0x03,0x74,0x8c,0x00,0x01,0x00,0x29,0xfe,0x80,0x06,0xbc,0x05,0x9a,0x00,0x0f,0x00,0x50,0xb6,0x09,0x04,0x91,0x0c,0x07,0x03,0x01,0xb8,0x01,0x30,0x40,0x10,0x0e,0x0a,0x91,0x40,0x03,0x05,0x0e,0x03,0x0a, +0x08,0x42,0x08,0x08,0x0b,0x0a,0x0f,0xb8,0x01,0x2c,0x40,0x0d,0x02,0x02,0x0e,0x7e,0x0b,0x0b,0x11,0x0a,0x7e,0x03,0x03,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f,0x3f,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x21, +0x35,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x06,0xbc,0x9b,0xfb,0xa5,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x02,0xe6,0xa8,0xc0,0xfe,0x80,0x01,0x80,0x05,0x02,0x98,0x98,0xfb,0x96,0x05,0x02,0xfa,0xfe,0x00,0x00,0x01,0x00,0x1e,0xfe,0x8b,0x05,0x3c,0x04,0x00,0x00,0x0f,0x00,0x50,0xb9,0x00,0x01,0x01,0x31,0x40,0x16,0x09,0x04,0x95, +0x0c,0x06,0x0f,0x0e,0x0a,0x95,0x40,0x03,0x05,0x0e,0x03,0x0a,0x08,0x42,0x08,0x08,0x0b,0x0a,0x0f,0xb8,0x01,0x2c,0x40,0x0d,0x02,0x02,0x0e,0x84,0x0b,0x0b,0x11,0x0a,0x84,0x03,0x03,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f, +0x33,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0x3c,0x8e,0xfc,0xa4,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x02,0x0a,0xa4,0x98,0xfe,0x8b,0x01,0x75,0x03,0x74,0x8c,0x8c,0xfd,0x18,0x03,0x74,0xfc,0x8c,0x00,0x00,0x01,0x00,0xa6,0xfe,0x80,0x05,0x42,0x05,0x9a,0x00,0x14, +0x00,0x3d,0x40,0x0b,0x10,0x04,0x0e,0x91,0x06,0x06,0x03,0x11,0x0b,0x03,0x01,0xb8,0x01,0x30,0xb3,0x13,0x91,0x03,0x14,0xb8,0x01,0x2c,0x40,0x0b,0x02,0x02,0x12,0x7e,0x04,0x11,0x11,0x16,0x0b,0x7e,0x0a,0x2f,0xe1,0x11,0x39,0x2f,0x33,0xe1,0x32,0x2f,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x01, +0x23,0x11,0x23,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x05,0x42,0x9c,0xcd,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0xc1,0xfe,0x80,0x01,0x80,0x02,0x85,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0xfa,0xfe,0x00,0x00,0x01,0x00,0x98,0xfe,0x8b,0x04,0x77,0x04,0x00, +0x00,0x13,0x00,0x3d,0x40,0x0b,0x0f,0x04,0x0d,0xec,0x06,0x06,0x03,0x10,0x0a,0x0f,0x01,0xb8,0x01,0x31,0xb3,0x12,0x95,0x03,0x13,0xb8,0x01,0x2c,0x40,0x0b,0x02,0x02,0x11,0x84,0x04,0x0f,0x0f,0x15,0x0a,0x84,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x32,0x2f,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31, +0x30,0x01,0x23,0x11,0x23,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x04,0x77,0x8d,0xae,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0x98,0xfe,0x8b,0x01,0x75,0x01,0x9c,0x62,0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xfc,0x8c,0x00,0x02,0x00,0x29,0xff,0xe8,0x06,0x58,0x05,0xb2, +0x00,0x1c,0x00,0x23,0x00,0x56,0x40,0x19,0x13,0x0c,0x18,0x01,0x91,0x40,0x23,0x1b,0x09,0x23,0x91,0x2b,0x30,0x20,0x91,0x1b,0x04,0x06,0x04,0x91,0x40,0x09,0x13,0x13,0x15,0xb8,0x01,0x2c,0x40,0x13,0x10,0x0c,0x80,0x06,0x06,0x0c,0x00,0x7d,0x1d,0x1d,0x25,0x0c,0x23,0x42,0x01,0x7d,0x18,0x42,0x0c,0x2f,0xe1,0xf1,0xe1,0x11,0x12,0x39, +0x2f,0xe1,0x11,0x39,0x2f,0x1a,0x10,0xdd,0xe1,0x32,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0xc4,0x31,0x30,0x01,0x21,0x16,0x00,0x33,0x20,0x37,0x15,0x06,0x21,0x20,0x00,0x03,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x33,0x12,0x00,0x21,0x20,0x03,0x26,0x02,0x23,0x22,0x00,0x07, +0x06,0x58,0xfb,0xa2,0x10,0x01,0x1c,0xda,0x01,0x09,0xc2,0xc5,0xfe,0xe4,0xfe,0xda,0xfe,0x95,0x0f,0x1d,0x7c,0x88,0x27,0x8f,0x29,0x84,0x12,0x1d,0x01,0x6f,0x01,0x16,0x02,0x6a,0xb4,0x08,0xe7,0xc9,0xd0,0xfe,0xf6,0x16,0x02,0x7f,0xeb,0xfe,0xeb,0xa4,0xaa,0x91,0x01,0x6a,0x01,0x2d,0x8b,0x7d,0x5e,0x4a,0x47,0x52,0x80,0x01,0x30,0x01, +0x6c,0xfd,0x64,0xed,0x01,0x17,0xfe,0xe4,0xe8,0x00,0x00,0x02,0x00,0x29,0xff,0xe8,0x04,0xc4,0x04,0x18,0x00,0x1e,0x00,0x25,0x00,0x5f,0x40,0x0e,0x13,0x0c,0x0c,0x01,0x95,0x18,0x25,0x25,0x04,0x22,0x95,0x1b,0x10,0x06,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0e,0x48,0x06,0x06,0x04,0x95,0x09,0x16,0x18,0x00,0x0c,0x25,0x1f,0x01,0x06,0x06, +0x00,0x0c,0x13,0x15,0xb8,0x01,0x2c,0x40,0x0a,0x10,0x0c,0x00,0x83,0x1f,0x1f,0x27,0x01,0x83,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xdd,0xe1,0x32,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0xed,0x32,0x2f,0x2b,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xc4,0x31,0x30,0x01,0x21,0x16,0x16,0x33,0x32,0x37, +0x15,0x06,0x23,0x22,0x02,0x27,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x33,0x36,0x24,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x04,0xc4,0xfd,0x2e,0x04,0xaf,0x9b,0xac,0x91,0x87,0xde,0xd0,0xf7,0x09,0x1b,0x77,0x8d,0x27,0x89,0x29,0x8a,0x14,0x1c,0x01,0x04,0xb0,0xca,0xdc,0xa8,0x01,0x85,0x7a,0x74, +0xa2,0x12,0x01,0xd7,0xab,0xba,0x72,0x9a,0x62,0x01,0x04,0xeb,0x85,0x6f,0x55,0x4a,0x47,0x4a,0x77,0xc8,0xee,0xfe,0xfc,0xe7,0x35,0x8d,0x9f,0xa6,0x86,0x00,0xff,0xff,0x00,0x29,0xfe,0x80,0x06,0x58,0x05,0xb2,0x02,0x26,0x06,0x1d,0x00,0x00,0x00,0x06,0x0b,0x51,0x00,0x00,0xff,0xff,0x00,0x29,0xfe,0x8a,0x04,0xc4,0x04,0x18,0x02,0x26, +0x06,0x1e,0x00,0x00,0x00,0x06,0x0b,0x52,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0xff,0xea,0x00,0x00,0x07,0x02,0x07,0x1a,0x02,0x26,0x01,0xed,0x00,0x00,0x01,0x07,0x00,0xda,0x02,0x3f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x24,0x1e,0x0d,0x00,0x25,0x01,0x21,0x05, +0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x05,0xf6,0x05,0xbe,0x02,0x26,0x02,0x0d,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xc7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x1c,0x16,0x09,0x00,0x25,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbe,0xfe,0x66,0x04,0x4c,0x05,0x9a, +0x00,0x19,0x00,0x42,0x40,0x24,0x01,0x15,0x18,0x91,0x13,0x13,0x15,0x19,0x17,0x03,0x07,0x91,0x04,0x0a,0x14,0x0a,0x24,0x0a,0x03,0x0a,0x0c,0x15,0x19,0x00,0x00,0x04,0x7d,0x0f,0x0f,0x1b,0x01,0x18,0x14,0x7e,0x0a,0x15,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x00,0x2f,0xde,0x32,0x5d,0xed,0x3f,0x33,0x12,0x39, +0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x01,0x16,0x00,0x11,0x14,0x00,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x00,0x23,0x23,0x11,0x23,0x11,0x33,0x11,0x01,0x04,0x4c,0xfd,0xce,0xfa,0x01,0x1d,0xfe,0xd6,0xfe,0xf9,0xae,0x94,0xa4,0x9a,0xbc,0xcd,0xfe,0xff,0xda,0x46,0xa6,0xa6,0x02,0x17,0x05,0x9a,0xfd,0x97,0x21,0xfe,0xa1, +0xfe,0xfd,0xff,0xfe,0xb7,0x4c,0xae,0x6c,0xea,0xca,0xd6,0x01,0x26,0xfd,0x5c,0x05,0x9a,0xfd,0xa0,0x02,0x60,0x00,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xae,0x04,0x00,0x00,0x1a,0x00,0x42,0x40,0x24,0x01,0x14,0x19,0x95,0x13,0x13,0x14,0x1a,0x17,0x0f,0x07,0xec,0x04,0x0a,0x14,0x0a,0x24,0x0a,0x03,0x0a,0x0c,0x14,0x1a,0x00,0x00,0x04, +0x83,0x0f,0x0f,0x1c,0x17,0x01,0x14,0x84,0x0a,0x15,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x00,0x2f,0xde,0x32,0x5d,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x01,0x16,0x12,0x15,0x14,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x11,0x33, +0x01,0x03,0xae,0xfe,0x4c,0xc8,0xe6,0xfe,0xea,0xee,0x99,0x65,0x72,0x8e,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0xa4,0x02,0x01,0x87,0x04,0x00,0xfe,0x6c,0x20,0xfe,0xe5,0xd9,0xd6,0xfe,0xe4,0x3a,0xa4,0x4c,0xb6,0xa8,0xb9,0xd7,0xfe,0x1a,0x04,0x00,0xfe,0x74,0x01,0x8c,0x00,0x01,0x00,0xbc,0xfe,0x66,0x04,0xf2,0x05,0x9a,0x00,0x18,0x00,0x40, +0x40,0x22,0x0a,0x7e,0x18,0x07,0x18,0x11,0x18,0x11,0x18,0x1a,0x06,0x02,0x7e,0x03,0x11,0x13,0x92,0x0e,0x08,0x03,0x01,0x91,0x06,0x40,0x04,0x03,0x06,0x91,0x2b,0x30,0x04,0x03,0x03,0x12,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x3f,0x2f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xe1,0x31,0x30, +0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x07,0x06,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x36,0x35,0x04,0x4a,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x95,0x94,0xfe,0xf8,0xae,0x94,0xa4,0x9a,0x5e,0x95,0x33,0x67,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfb,0x14,0xff,0xa4,0xa5,0x4c,0xae,0x6c, +0x3a,0x3b,0x74,0xcb,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xf8,0x04,0x00,0x00,0x19,0x00,0x3a,0x40,0x1f,0x0a,0x84,0x07,0x12,0x03,0x19,0x19,0x1b,0x06,0x02,0x84,0x03,0x14,0x95,0x0f,0x08,0x0f,0x01,0x95,0x06,0x40,0x04,0x03,0x06,0x95,0x2b,0x30,0x04,0x0f,0x03,0x15,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x3f,0x2f,0xed,0x01, +0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x33,0xe1,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x03,0x54,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x46,0x46,0x8b,0xef,0x9a,0x64,0x75,0x8b,0x54,0x83,0x5a,0x2f,0x01,0xd1,0xfe,0x2f,0x04,0x00, +0xfe,0x5c,0x01,0xa4,0xfc,0x69,0x72,0xbc,0x47,0x8e,0x3a,0xa0,0x4e,0x31,0x5c,0x85,0x54,0x00,0x00,0x01,0x00,0xa6,0xfe,0x80,0x04,0x81,0x05,0x9a,0x00,0x14,0x00,0x38,0xb9,0x00,0x02,0x01,0x30,0x40,0x0f,0x10,0x91,0x08,0x08,0x01,0x13,0x0d,0x03,0x05,0x91,0x01,0x00,0x7e,0x12,0x01,0xb8,0x01,0x2c,0xb7,0x04,0x12,0x06,0x06,0x16,0x0e, +0x7e,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xd6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x3f,0x31,0x30,0x21,0x23,0x11,0x23,0x11,0x33,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0xd7,0x9c,0xcb,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0xfe,0x80,0x02,0x18,0x01, +0xed,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0x00,0x01,0x00,0x98,0xfe,0x8a,0x03,0xdf,0x04,0x00,0x00,0x13,0x00,0x3d,0x40,0x0b,0x11,0x06,0x0f,0xec,0x08,0x08,0x01,0x12,0x0c,0x0f,0x02,0xb8,0x01,0x31,0xb3,0x05,0x95,0x01,0x01,0xb8,0x01,0x2c,0x40,0x0b,0x04,0x00,0x84,0x06,0x06,0x11,0x11,0x15,0x0c,0x84,0x0b,0x2f, +0xe1,0x12,0x39,0x2f,0x33,0x10,0xe1,0xd6,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x23,0x11,0x33,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x03,0xdf,0xb0,0x8b,0x98,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0xfe,0x8a,0x02,0x02,0x01,0x10,0x62, +0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x19,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x55,0x01,0x5b,0x00,0x08,0xb3,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xda, +0x00,0xc6,0x00,0x00,0x00,0x08,0xb3,0x02,0x23,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xe2,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe6,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf2,0x40,0x0a,0x1f,0x19,0x05,0x00,0x25,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b, +0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x87,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x14,0x2f,0x29,0x08,0x14,0x25,0x03,0x02,0x2c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x05,0x9a,0x02,0x06,0x00,0x91, +0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x06,0x56,0x04,0x18,0x02,0x06,0x00,0xa0,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x1b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x13,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x12,0x12,0x0c,0x02,0x0b,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00, +0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x20,0x1a,0x0c,0x12,0x25,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x56,0xff,0xe8,0x05,0x66,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x3f,0x40,0x23, +0x12,0x91,0x40,0x01,0x09,0x0f,0x01,0x91,0x2b,0x30,0x2f,0x06,0x01,0x06,0x06,0x04,0x91,0x09,0x04,0x16,0x91,0x0f,0x13,0x06,0x06,0x00,0x0c,0x7d,0x01,0x12,0x12,0x1a,0x13,0x7d,0x00,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x13,0x21,0x26, +0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x25,0x21,0x16,0x12,0x33,0x32,0x00,0x56,0x04,0x5e,0x11,0xfe,0xe5,0xda,0xd8,0x9c,0x9e,0xe2,0x01,0x3f,0x01,0x6d,0xfe,0x94,0xfe,0xd3,0xfe,0xd1,0xfe,0xb8,0x04,0x5e,0xfc,0x56,0x04,0xf2,0xcf,0xcf,0x01,0x02,0x03,0x1a,0xed,0x01,0x13,0x60,0xa4,0x54,0xfe, +0x76,0xfe,0xa5,0xfe,0xbe,0xfe,0x5d,0x01,0x9f,0xfc,0xeb,0xfe,0xe7,0x01,0x18,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x02,0x06,0x05,0x07,0x00,0x00,0xff,0xff,0x00,0x56,0xff,0xe8,0x05,0x66,0x06,0xe4,0x02,0x26,0x06,0x32,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x2a,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xec, +0x40,0x0a,0x28,0x22,0x00,0x0c,0x25,0x03,0x02,0x25,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0xcf,0x05,0x87,0x02,0x26,0x05,0x07,0x00,0x00,0x01,0x06,0x00,0x8f,0x7a,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x29,0x23,0x12,0x0c,0x25,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01, +0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xea,0x00,0x00,0x07,0x02,0x06,0xe4,0x02,0x26,0x01,0xed,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0xd6,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x2d,0x27,0x0d,0x00,0x25,0x02,0x01,0x2a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x05,0xf6,0x05,0x87, +0x02,0x26,0x02,0x0d,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x54,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0a,0x25,0x1f,0x09,0x00,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xe2,0x06,0xe4,0x02,0x26,0x01,0xee,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x61, +0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe0,0x40,0x0a,0x33,0x2d,0x01,0x1f,0x25,0x02,0x01,0x30,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0xe7,0x03,0x3b,0x05,0x87,0x02,0x26,0x02,0x0e,0x00,0x00,0x01,0x06,0x00,0x8f,0x11,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf6,0x40,0x0a,0x31,0x2b, +0x12,0x16,0x25,0x02,0x01,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x01,0x00,0x52,0xff,0xe8,0x03,0xd3,0x05,0x9a,0x00,0x16,0x00,0x3f,0x40,0x20,0x0f,0x96,0x09,0x09,0x15,0x0b,0x91,0x0c,0x03,0x01,0x03,0x91,0x15,0x13,0x0a,0x0f,0x0e,0x09,0x09,0x06,0x01,0x0e,0x0b,0x0e,0x0b,0x01,0x12,0x7d,0x06,0x06,0x18,0x01, +0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x01,0x21,0x35,0x21,0x15,0x01,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0x52,0xa8,0xd5,0x9f,0xb3,0xfe,0xa1,0x91,0x01,0x8f,0xfd,0xaa, +0x03,0x56,0xfe,0x7a,0xc0,0xd9,0xfe,0xee,0xf9,0xf2,0x3c,0xb6,0x7b,0xa4,0x83,0x01,0x1e,0x02,0x46,0x98,0x28,0xfd,0xc8,0xdc,0xb6,0xca,0xf6,0x00,0xff,0xff,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x02,0x06,0x05,0x97,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0x8c,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0xd9, +0x01,0xd6,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x14,0x16,0x17,0x0a,0x13,0x25,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x05,0x2f,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1e,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x07,0x10,0x11,0x07,0x0d,0x25,0x01,0x0f,0x11, +0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0xe4,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x6f,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x11,0x23,0x1d,0x0a,0x13,0x25,0x02,0x01,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00, +0x04,0x00,0x05,0x87,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xce,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x1b,0x1d,0x17,0x07,0x0d,0x25,0x02,0x01,0x1a,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe4,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8f, +0x01,0x67,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x87,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x27,0x21,0x03, +0x09,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe4,0x02,0x26,0x02,0xcf,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x67,0x01,0x5d,0x00,0x17,0x40,0x0d,0x04,0x03,0x03,0x29,0x23,0x03,0x09,0x25,0x04,0x03,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35, +0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x87,0x02,0x26,0x02,0xd0,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x04,0x03,0x00,0x27,0x21,0x03,0x09,0x25,0x04,0x03,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x04,0x90,0x06,0xe4,0x02,0x26, +0x02,0x04,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x76,0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x28,0x22,0x0f,0x14,0x25,0x02,0x01,0x25,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x05,0x87,0x02,0x26,0x02,0x24,0x00,0x00,0x01,0x06,0x00,0x8f,0xf0,0x00,0x00,0x1a, +0xb1,0x02,0x01,0xb8,0xff,0xb6,0x40,0x0a,0x28,0x22,0x01,0x14,0x25,0x02,0x01,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x06,0x8c,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x32,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x05,0x17,0x16,0x0d,0x00,0x25,0x01,0x17,0x05, +0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x2f,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x17,0x18,0x0c,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x06,0xe4, +0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xca,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x25,0x1f,0x0d,0x00,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x87,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x00,0x8f,0x50,0x00,0x00,0x17, +0x40,0x0d,0x02,0x01,0x00,0x24,0x1e,0x0c,0x00,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x07,0x5c,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x52,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x4c,0x1c,0x16,0x0d,0x00,0x25,0x02,0x01,0x1c,0x05, +0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x00,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xde,0x00,0xf0,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x62,0x1b,0x15,0x0c,0x00,0x25,0x02,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6, +0x00,0x00,0x04,0x81,0x06,0xe4,0x02,0x26,0x01,0xfe,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xf6,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x03,0x20,0x1a,0x08,0x10,0x25,0x02,0x01,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x98,0x00,0x00,0x03,0xdf,0x05,0x87,0x02,0x26,0x02,0x1e,0x00,0x00,0x01,0x07, +0x00,0x8f,0x00,0x92,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0a,0x1f,0x19,0x07,0x0f,0x25,0x02,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x87,0x06,0xe3,0x02,0x26,0x02,0x02,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x87,0x01,0x5c,0x00,0x17,0x40,0x0d,0x04,0x03, +0x06,0x26,0x20,0x05,0x03,0x25,0x04,0x03,0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x05,0x06,0x05,0x87,0x02,0x26,0x02,0x22,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x33,0x00,0x00,0x00,0x1a,0xb1,0x04,0x03,0xb8,0xff,0xfd,0x40,0x0a,0x25,0x1f,0x05,0x03,0x25,0x04,0x03,0x22,0x11,0x26, +0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x02,0x00,0x56,0x00,0x00,0x03,0xd1,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x24,0x40,0x12,0x0c,0x91,0x08,0x08,0x09,0x03,0x0b,0x91,0x00,0x00,0x7e,0x08,0x0b,0x0b,0x14,0x0f,0x7d,0x04,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0xed,0x3f,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x22,0x26, +0x35,0x34,0x36,0x33,0x21,0x11,0x33,0x03,0x11,0x23,0x20,0x11,0x14,0x16,0x33,0x03,0xd1,0xfe,0x56,0xd8,0xf9,0xee,0xd4,0x01,0x11,0xa8,0xa8,0xeb,0xfe,0xc8,0xa3,0x95,0xe6,0xc6,0xc1,0xcd,0x02,0x60,0xfa,0xfe,0x02,0x0a,0xff,0x00,0x7d,0x8d,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x02,0x06,0x00,0x47,0x00,0x00,0x00,0x02, +0x00,0x64,0xff,0xe8,0x06,0x58,0x05,0x9a,0x00,0x19,0x00,0x22,0x00,0x3a,0x40,0x1e,0x06,0x08,0x1b,0x91,0x18,0x0f,0x0f,0x11,0x03,0x15,0x20,0x91,0x03,0x08,0x13,0x06,0x12,0x7e,0x0f,0x1a,0x1a,0x0b,0x00,0x7e,0x17,0x17,0x24,0x1e,0x7d,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x39,0x00,0x3f,0x33,0xed,0x32,0x3f, +0x39,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x11,0x23,0x20,0x11,0x10,0x21,0x32,0x36,0x06,0x58,0xd1,0xbf,0x69,0xad,0x2b,0x73,0xed,0xd2,0xf1,0xf2,0xd1,0x01,0x11,0xa7,0x7f,0x6d,0xe5,0xa8,0xfc, +0xe0,0xec,0xfe,0xc8,0x01,0x2a,0x63,0x97,0x01,0x92,0xc8,0xe2,0x63,0x5d,0xc0,0xeb,0xcb,0xc2,0xda,0x02,0x60,0xfb,0xf6,0x79,0x98,0x01,0x1f,0x01,0x9c,0xfe,0x38,0x01,0x30,0xfe,0xf2,0xfe,0xeb,0x82,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x70,0x05,0xec,0x00,0x1a,0x00,0x27,0x00,0x3f,0x40,0x21,0x19,0x19,0x0d,0x25,0x11,0x00,0x0f,0x1f, +0x95,0x0d,0x10,0x16,0x05,0x25,0x95,0x03,0x07,0x16,0x05,0x13,0x84,0x11,0x1b,0x1b,0x0a,0x1a,0x83,0x19,0x19,0x29,0x22,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x39,0x00,0x3f,0x33,0xed,0x32,0x32,0x3f,0xed,0x32,0x3f,0x11,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x22,0x02,0x35, +0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x70,0xca,0xb6,0xf4,0x4e,0x7c,0xfe,0xf1,0xd9,0xea,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x7e,0x64,0xd6,0xa8,0xfc,0xfc,0xa4,0x7e,0x96,0xac,0xa6,0x8a,0x89,0xab,0x01,0x83,0xbf, +0xdc,0xe3,0xe3,0x01,0x14,0xec,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfb,0x95,0x75,0x9a,0x01,0x1a,0xa1,0x5e,0x97,0x7c,0xac,0xdc,0xc2,0xb2,0xcc,0xc6,0x00,0x01,0x00,0x29,0xff,0xe8,0x05,0xf6,0x05,0xb2,0x00,0x24,0x00,0x4b,0x40,0x27,0x1c,0x1b,0x08,0x91,0x0b,0x0b,0x03,0x23,0x23,0x20,0x13,0x11,0x91,0x16,0x04,0x20,0x91,0x03,0x13,0x1c, +0x09,0x19,0x7d,0x0e,0x09,0x0e,0x09,0x13,0x1e,0x7d,0x06,0x06,0x13,0x24,0x7e,0x23,0x23,0x26,0x13,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x02,0x21,0x23,0x35, +0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x04,0x13,0x12,0x33,0x32,0x11,0x11,0x33,0x05,0xf6,0xd2,0xbe,0xb9,0xdd,0x05,0x09,0xfe,0x94,0x96,0x8a,0x9f,0xaf,0x92,0x7f,0xb3,0xab,0x9e,0xcf,0xcc,0xea,0xfe,0xf0,0x01,0x32,0x0f,0x0c,0xdf,0xe6,0xa8,0x01,0x92,0xc9,0xe1,0xeb,0xb9,0x01, +0x14,0x8b,0x8c,0x7c,0x6d,0x81,0x71,0xaa,0x58,0xc3,0x9d,0xfe,0xe9,0x49,0x04,0x26,0xfe,0xce,0xfe,0xe9,0x01,0x1f,0x01,0x9c,0x00,0x01,0x00,0x1e,0xff,0xe8,0x05,0x56,0x04,0x18,0x00,0x22,0x00,0x4b,0x40,0x27,0x22,0x22,0x03,0x1a,0x19,0x09,0x95,0x0a,0x0a,0x1e,0x12,0x10,0x95,0x15,0x10,0x1e,0x95,0x03,0x16,0x1a,0x09,0x17,0x84,0x0d, +0x09,0x0d,0x09,0x12,0x1c,0x84,0x05,0x05,0x12,0x22,0x83,0x21,0x21,0x24,0x12,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x20,0x03,0x26,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34, +0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15,0x16,0x17,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0x56,0xcc,0xb5,0xfe,0xb7,0x3a,0x0e,0x7c,0x9f,0x65,0x61,0x01,0x04,0x77,0x68,0x96,0x96,0xaa,0x8e,0x01,0x77,0xd3,0xda,0x20,0x20,0xbf,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0x01,0x4b,0x52,0x43,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d, +0xfe,0xee,0xbd,0x33,0x04,0x12,0xc2,0xcc,0x01,0x1a,0xa1,0x00,0x00,0x01,0x00,0x29,0xfe,0x80,0x04,0x3a,0x05,0xb2,0x00,0x1f,0x00,0x4e,0x40,0x0d,0x1a,0x19,0x07,0x91,0x08,0x08,0x03,0x11,0x0f,0x91,0x14,0x04,0x01,0xb8,0x01,0x30,0x40,0x0e,0x1e,0x91,0x03,0x1a,0x07,0x17,0x7d,0x0c,0x07,0x0c,0x07,0x03,0x11,0x1f,0xb8,0x01,0x2c,0xb7, +0x02,0x02,0x1e,0x7e,0x03,0x03,0x21,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x2f,0xed,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15, +0x10,0x05,0x15,0x16,0x16,0x15,0x15,0x33,0x04,0x3a,0x9c,0xcd,0xfe,0x85,0x96,0x8a,0x9f,0xaf,0x92,0x7f,0xb3,0xab,0x9e,0xcf,0xcc,0xea,0xfe,0xf0,0x93,0xaa,0xc1,0xfe,0x80,0x01,0x80,0x01,0x8c,0x01,0x14,0x8b,0x8c,0x7c,0x6d,0x81,0x71,0xaa,0x58,0xc3,0x9d,0xfe,0xe9,0x49,0x04,0x11,0xbb,0x8e,0xfc,0x00,0x00,0x01,0x00,0x1e,0xfe,0x8b, +0x03,0x8e,0x04,0x18,0x00,0x1d,0x00,0x4e,0x40,0x0d,0x18,0x17,0x07,0x95,0x08,0x08,0x03,0x10,0x0e,0x95,0x13,0x10,0x01,0xb8,0x01,0x31,0x40,0x0e,0x1c,0x95,0x03,0x18,0x07,0x15,0x84,0x0b,0x07,0x0b,0x07,0x03,0x10,0x1d,0xb8,0x01,0x2c,0xb7,0x02,0x02,0x1c,0x84,0x03,0x03,0x1f,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12, +0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x2f,0xed,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15,0x16,0x16,0x15,0x15,0x33,0x03,0x8e,0x8e,0xae,0xfe,0xd7,0x65,0x61,0x01,0x04,0x77,0x68, +0x96,0x96,0xaa,0x8e,0x01,0x77,0xd3,0x71,0x8b,0x98,0xfe,0x8b,0x01,0x75,0x01,0x1c,0xac,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d,0xfe,0xee,0xbd,0x33,0x04,0x09,0x87,0x6a,0x8c,0x00,0x00,0x01,0x00,0x18,0xff,0xe8,0x06,0xc2,0x05,0x9a,0x00,0x1c,0x00,0x3c,0x40,0x20,0x1c,0x1c,0x18,0x07,0x91,0x14,0x03,0x18,0x91,0x03,0x13,0x0e,0x10,0x91, +0x0b,0x13,0x15,0x7e,0x06,0x06,0x1a,0x09,0x7e,0x12,0x00,0x7e,0x1a,0x12,0x1a,0x12,0x1e,0x0e,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11, +0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x06,0xc2,0xd2,0xbd,0xba,0xdb,0xfe,0x2d,0xfe,0x97,0x28,0x22,0x1c,0x20,0xd7,0x03,0x1b,0x7e,0x71,0xe5,0xa8,0x01,0x9a,0xcb,0xe7,0xf2,0xb8,0x03,0x70,0xfd,0x36,0xfd,0xb6,0x0a,0x96,0x0b,0x01,0xae,0x03,0x69,0xfc,0x08,0x81,0xa2,0x01,0x21,0x01,0x9a,0x00,0x00,0x01,0x00,0x14,0xff,0xe8, +0x05,0xee,0x04,0x00,0x00,0x1c,0x00,0x46,0x40,0x1a,0x1c,0x1c,0x18,0x07,0x95,0x14,0x0f,0x0e,0x10,0x95,0x0b,0x0b,0x1d,0x18,0x95,0x03,0x16,0x15,0x84,0x06,0x06,0x12,0x1c,0x83,0x1b,0x09,0xb8,0x01,0x2e,0xb6,0x12,0x1b,0x12,0x1b,0x12,0x1e,0x0e,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed, +0x12,0x39,0x7c,0x2f,0x18,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0xee,0xcc,0xb6,0xb1,0xd3,0xfe,0xa4,0xfe,0xc6,0x25,0x19,0x15,0x25,0xa4,0x02,0x9a,0x77,0x67,0xdc,0xa8, +0x01,0x83,0xbd,0xde,0xdd,0xb6,0x01,0xf9,0xfe,0x2a,0xfe,0x54,0x08,0x8b,0x0a,0x01,0x17,0x02,0x6e,0xfd,0x85,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x01,0x00,0xbc,0xff,0xe8,0x07,0x6e,0x05,0x9a,0x00,0x18,0x00,0x41,0x40,0x23,0x17,0x17,0x08,0x91,0x40,0x0d,0x0c,0x09,0x0d,0x91,0x2b,0x30,0x0f,0x0c,0x03,0x14,0x91,0x03,0x13,0x09,0x10,0x7e, +0x0e,0x07,0x07,0x0a,0x00,0x7e,0x16,0x16,0x1a,0x0d,0x08,0x7e,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0x3f,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11, +0x11,0x33,0x07,0x6e,0xd3,0xbc,0xba,0xdb,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x7e,0x72,0xe4,0xa8,0x01,0x9a,0xcd,0xe5,0xf2,0xb8,0xfc,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfc,0x08,0x81,0xa2,0x01,0x21,0x01,0x9a,0x00,0x01,0x00,0xa6,0xff,0xe8,0x06,0x5a,0x04,0x00,0x00,0x18,0x00,0x44,0x40,0x24,0x17,0x17,0x03,0x08,0x95,0x40, +0x0d,0x0c,0x09,0x0d,0x95,0x2b,0x30,0x0f,0x0c,0x0f,0x14,0x95,0x03,0x16,0x09,0x11,0x84,0x0e,0x07,0x07,0x0a,0x00,0x83,0x16,0x16,0x1a,0x0d,0x08,0x84,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0x3f,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x7c,0x2f,0x31,0x30,0x01,0x14,0x06,0x23, +0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x06,0x5a,0xcc,0xb5,0xb1,0xd4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x78,0x67,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0xdc,0xb7,0x56,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfd,0x85,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x01,0x00,0x5e, +0xff,0xe8,0x05,0x62,0x05,0xb2,0x00,0x1a,0x00,0x3e,0x40,0x22,0x18,0x91,0x19,0x19,0x09,0x14,0x1f,0x0c,0x2f,0x0c,0x02,0x0c,0x0c,0x0e,0x91,0x09,0x04,0x14,0x91,0x03,0x13,0x18,0x0c,0x18,0x0c,0x06,0x00,0x7e,0x17,0x17,0x1c,0x11,0x7d,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f, +0x5d,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x12,0x37,0x21,0x35,0x21,0x05,0x62,0xfe,0xb5,0xfe,0xdd,0xfe,0xc9,0xfe,0xa1,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x07,0xe5,0xcc,0xf2,0x04,0xfe,0x46, +0x02,0x60,0x02,0x8e,0xfe,0xd0,0xfe,0x8a,0x01,0x8a,0x01,0x48,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xef,0xfe,0xca,0x01,0x07,0xd8,0x98,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xf4,0x04,0x18,0x00,0x1a,0x00,0x40,0x40,0x24,0x18,0x95,0x19,0x19,0x09,0x14,0x3f,0x0c,0x4f,0x0c,0x5f,0x0c,0x03,0x0c,0x0c,0x0e, +0x95,0x09,0x10,0x14,0x95,0x03,0x16,0x19,0x0c,0x19,0x0c,0x11,0x1a,0x83,0x17,0x17,0x1c,0x11,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15, +0x14,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x03,0xf4,0xe4,0xcc,0xd9,0xfe,0xf5,0x01,0x22,0xf2,0x9c,0x6b,0x77,0x96,0x9d,0xc9,0xb0,0x8e,0x7b,0x89,0x02,0xfe,0x98,0x02,0x10,0x01,0xd3,0xe3,0xfe,0xf8,0x01,0x1b,0xe5,0xfd,0x01,0x33,0x3f,0xa8,0x5d,0xe1,0xb7,0xaf,0xd5,0xa3,0x89,0x8b,0x00,0x00,0x01,0x00,0x29,0xff,0xe8,0x04,0xec, +0x05,0x9a,0x00,0x14,0x00,0x3a,0x40,0x1e,0x13,0x13,0x10,0x0c,0x07,0x91,0x09,0x03,0x10,0x91,0x40,0x03,0x13,0x0b,0x0e,0x0d,0x08,0x06,0x42,0x0d,0x7e,0x06,0x06,0x08,0x00,0x7e,0x12,0x12,0x16,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe2,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x31,0x30, +0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x04,0xec,0xd3,0xbd,0xba,0xdc,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x7f,0x71,0xe6,0xa8,0x01,0x9a,0xca,0xe8,0xf1,0xb9,0x03,0x70,0x98,0x98,0xfc,0xa0,0x80,0xa3,0x01,0x21,0x01,0x9a,0x00,0x00,0x01,0x00,0x1e,0xff,0xe8,0x04,0x58, +0x04,0x00,0x00,0x14,0x00,0x3a,0x40,0x1e,0x13,0x13,0x10,0x0c,0x07,0x95,0x09,0x0f,0x10,0x95,0x40,0x03,0x16,0x0b,0x0e,0x0d,0x08,0x06,0x42,0x0d,0x84,0x06,0x06,0x08,0x00,0x83,0x12,0x12,0x16,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe2,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x31,0x30, +0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x04,0x58,0xcc,0xb5,0xb2,0xd3,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x78,0x67,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0xdd,0xb6,0x01,0xf9,0x8c,0x8c,0xfe,0x11,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x03,0x01,0x33,0x04,0xc2,0x03,0x7b,0x06,0x3a, +0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x36,0x40,0x1c,0x01,0xe2,0x40,0x02,0x80,0x0a,0x16,0xc1,0x40,0x04,0x10,0x01,0x00,0x01,0x00,0x13,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1d,0x1c,0x07,0x19,0x2b,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x11,0x39,0x39,0x18,0x2f,0x2f,0x00,0x2f,0x33,0x1a,0xfd,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x21, +0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x56,0xfe,0x04,0x01,0xfc,0x3e,0x28,0x3a,0x39,0x27,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x05,0xcd,0x6d,0xfe,0x88,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a, +0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x64,0x06,0xfa,0x00,0x06,0x00,0x12,0x00,0x1e,0x00,0x66,0x40,0x3d,0x06,0x70,0x03,0x01,0x03,0x80,0x09,0x05,0x19,0x05,0x02,0x09,0x05,0x02,0x40,0x09,0x10,0x48,0x02,0x02,0x0d,0x19,0xc1,0x40,0x07,0x13,0x00,0xe0,0x03,0x01,0x03,0x03,0x00,0x05,0x05,0x1c,0x10,0xc0, +0x0a,0x16,0xc0,0x1c,0x00,0x1c,0x01,0x0f,0x0f,0x0a,0x1f,0x0a,0x2f,0x0a,0x03,0x10,0x03,0x20,0x1f,0x0a,0x1c,0x2b,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x5e,0x5d,0x10,0xe1,0x10,0xe1,0x12,0x39,0x3d,0x2f,0x33,0x33,0x18,0x2f,0x5d,0x2f,0x00,0x2f,0x33,0x1a,0xed,0x32,0x32,0x2f,0x2b,0x33,0x5e,0x5d,0x1a,0xcd,0x5d,0x32,0x31,0x30,0x01,0x03, +0x23,0x03,0x33,0x17,0x37,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x5a,0xd5,0x85,0xd7,0x73,0xa4,0xa4,0x1e,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xfa,0xfe,0xb6,0x01,0x4a,0xe6,0xe6,0xfd,0xc8, +0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x77,0x06,0xe2,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x44,0xb2,0x03,0x80,0x00,0xb8,0xff,0xc0,0x40,0x20,0x09,0x0c,0x48,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19, +0x0f,0x07,0x01,0x10,0x03,0x1d,0x1c,0x07,0x19,0x2b,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x00,0x2f,0x33,0xed,0x32,0x32,0x2f,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x23,0x01,0x33,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x02,0xa2,0x7f,0xfe,0xf9,0xa6,0x01,0x50,0x29,0x39,0x3b,0x29,0x2a,0x39,0x3c,0xfe,0x57,0x2a,0x39,0x3b,0x2a,0x27,0x39,0x3a,0x05,0x9a,0x01,0x48,0xfd,0xe0,0x3a,0x29,0x29,0x39,0x39,0x29,0x2a,0x39,0x3a,0x29,0x29,0x39,0x38,0x2a,0x2b,0x38,0x00,0x02,0x01,0x08,0x04,0xc2,0x03,0x04,0x06,0x35,0x00,0x03,0x00,0x0f,0x00,0x32, +0x40,0x1a,0x01,0xe2,0x40,0x02,0x80,0x0a,0xc1,0x40,0x04,0x00,0x0e,0x0d,0x01,0x07,0x42,0x01,0x01,0x07,0xc0,0x0d,0x11,0x10,0x0d,0xc0,0x2b,0x30,0x2b,0x01,0x10,0xe1,0x32,0x18,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xfd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x03,0x04,0xfe,0x04,0x01,0xfc,0xfe,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x05,0xc8,0x6d,0xfe,0x8d,0x39,0x2a,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x00,0x02,0x01,0x23,0x04,0xb2,0x03,0xa4,0x06,0x55,0x00,0x13,0x00,0x17,0x00,0x3c,0x40,0x20,0x15,0xe2,0x40,0x16,0x80,0x13,0x0d,0xda,0x07,0x11,0xda,0x03,0x09,0x17,0x16,0x17, +0x16,0x0a,0x00,0xc4,0x0f,0x13,0x01,0x13,0x13,0x19,0x09,0xc4,0x20,0x0a,0x01,0x0a,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x5d,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xd6,0xed,0xdc,0xfd,0xc6,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x37,0x21, +0x35,0x21,0x03,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x1a,0xfe,0x04,0x01,0xfc,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x36,0x6d,0x00,0x01,0xff,0x8c,0x05,0x0e,0x03,0x1e,0x05,0xd1,0x00,0x0b,0x00,0x32,0x40,0x19,0x0b,0xdb,0x04,0x08,0x40,0x05,0x01,0x09,0x03,0x03, +0x00,0x0e,0x05,0x0b,0x06,0x42,0x08,0x40,0x0b,0x0c,0x0d,0x06,0x05,0x2b,0x3a,0x2b,0x01,0x18,0x2f,0x1a,0xcd,0x2b,0x01,0x10,0xf0,0xc1,0x18,0x2f,0x00,0x2f,0x33,0x33,0x1a,0xdd,0x32,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x03,0x1e,0x5a,0x22,0x30,0xdc,0x30,0x22,0x30,0xdc,0x30,0x22,0x5a,0x05, +0xd1,0xc3,0x64,0x64,0x64,0x64,0xc3,0x00,0x00,0x02,0xff,0x27,0x04,0x89,0x00,0xbc,0x06,0xa2,0x00,0x14,0x00,0x1e,0x00,0x65,0x40,0x0d,0x02,0x09,0x12,0x09,0x22,0x09,0x03,0x03,0x05,0x0f,0x0f,0x0d,0x0b,0xba,0x01,0x3d,0x00,0x16,0xff,0xf0,0xb6,0x0c,0x0f,0x48,0x16,0x16,0x01,0x0d,0x41,0x0a,0x01,0x3d,0x00,0x12,0x01,0x39,0x00,0x1c, +0x01,0x3d,0x00,0x40,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0xb3,0x0f,0x0f,0x08,0x14,0xb8,0x01,0x3c,0xb4,0x16,0x01,0x0b,0x80,0x1a,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0x1a,0xdc,0x32,0x32,0xe1,0x11,0x39,0x2f,0x00,0x3f,0x3f,0x1a,0xed,0x3f,0xed,0x11,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0x11,0x39,0x31,0x30,0x5d,0x13,0x23,0x35, +0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x07,0x35,0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x36,0xbc,0x52,0x02,0x35,0x68,0x4d,0x57,0xaa,0x99,0x6a,0x5d,0x49,0x41,0x6d,0xb4,0x52,0x7c,0x43,0x30,0x62,0x3e,0x4f,0x04,0x96,0x50,0x5d,0x52,0x43,0x8f,0x17,0x17,0x81,0x3e,0x54,0x30,0xbe, +0x7e,0x34,0x13,0x0a,0x2b,0x2d,0x56,0x57,0x00,0x02,0xff,0x21,0x04,0x89,0x00,0xdf,0x06,0xa2,0x00,0x11,0x00,0x17,0x00,0x68,0x40,0x14,0x02,0x01,0x12,0x01,0x22,0x01,0x03,0x0f,0x01,0x1f,0x01,0x2f,0x01,0x03,0x09,0x03,0x05,0x05,0x03,0x01,0xb8,0x01,0x3d,0xb4,0x40,0x17,0x0e,0x08,0x17,0xb8,0x01,0x3d,0xb2,0x2b,0x30,0x14,0xbe,0x01, +0x3d,0x00,0x0e,0x01,0x39,0x00,0x03,0x01,0x3d,0x00,0x08,0x01,0x3b,0xb3,0x05,0x05,0x0b,0x11,0xb8,0x01,0x3c,0xb7,0x60,0x12,0xc0,0x12,0x02,0x12,0x17,0x01,0xb9,0x01,0x3c,0x00,0x0b,0x2f,0xe1,0x32,0xdd,0x71,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x5d, +0x13,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x06,0x07,0xdf,0xfe,0x98,0x04,0xa1,0x57,0x49,0x42,0x70,0x6c,0x7d,0x87,0x64,0x64,0x6f,0x53,0x02,0x7e,0x3a,0x52,0x09,0x05,0x81,0xb2,0x39,0x4e,0x31,0x8c,0x7f,0x78,0x96,0x81,0x75,0x1a,0x96,0x52,0x44,0x00,0x00,0x02, +0xff,0xcb,0x04,0x96,0x00,0x35,0x07,0x83,0x00,0x07,0x00,0x0b,0x00,0x41,0xb9,0x00,0x00,0x01,0x3f,0x40,0x09,0x40,0x04,0x80,0x00,0x0a,0x01,0x0c,0x03,0x0a,0xbc,0x01,0x38,0x00,0x09,0x01,0x3a,0x00,0x0b,0x01,0x3c,0xb3,0x0a,0x02,0x06,0x0a,0xb8,0x01,0x3c,0xb2,0x2b,0x30,0x02,0xb8,0x01,0x3e,0xb1,0x06,0x0d,0x10,0xd4,0xe1,0x2b,0x01, +0x10,0xe1,0x00,0x18,0x3f,0x3f,0x5f,0x5e,0x5d,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x11,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x03,0x23,0x11,0x33,0x35,0x35,0x35,0x0e,0x52,0x52,0x07,0x18,0x36,0x35,0x35,0x36,0xfd,0x7e,0x02,0x00,0x00,0x00,0x02,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa2,0x00,0x0b,0x00,0x15,0x00,0x29,0x41,0x0e,0x00,0x0c, +0x01,0x3d,0x00,0x06,0x01,0x39,0x00,0x12,0x01,0x3d,0x00,0x00,0x01,0x3b,0x00,0x09,0x01,0x3c,0x00,0x14,0x00,0x0f,0x01,0x3c,0x00,0x03,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x02,0x72,0x88,0x8e,0x78, +0x72,0x80,0x89,0x6f,0x4f,0x5d,0x5c,0x50,0xa4,0x04,0x89,0x90,0x77,0x7f,0x93,0x8e,0x7c,0x7b,0x94,0x01,0xd3,0x6a,0x5e,0x5a,0x6b,0xc7,0xc6,0x00,0x00,0x01,0xff,0x2b,0x04,0x89,0x00,0xd5,0x06,0x96,0x00,0x11,0x00,0x31,0xb1,0x10,0x09,0xb8,0x01,0x38,0xb2,0x0f,0x02,0x0c,0xbe,0x01,0x3d,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00, +0x11,0x01,0x3c,0xb2,0x01,0x10,0x09,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0xd4,0x32,0xe1,0x00,0x3f,0x3f,0xed,0x32,0x32,0x3f,0x33,0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0xd5,0x52,0x02,0x33,0x6a,0xb9,0x52,0x7d,0x3c,0x4d,0x52,0x04,0x96,0x52,0x5f,0xdb,0x01,0x32,0xfe, +0xda,0xa1,0x57,0x48,0x01,0x28,0x00,0x01,0xff,0x2b,0x04,0x89,0x00,0xac,0x06,0xa2,0x00,0x15,0x00,0x2a,0xb1,0x00,0x02,0xbf,0x01,0x3d,0x00,0x13,0x01,0x39,0x00,0x0a,0x00,0x08,0x01,0x3d,0x00,0x0d,0x01,0x3b,0xb2,0x00,0x0a,0x05,0xb9,0x01,0x3c,0x00,0x10,0x2f,0xe1,0xc4,0x32,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x13,0x26, +0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0xac,0x38,0x41,0x4f,0x65,0x5f,0x4f,0x43,0x3c,0x3d,0x51,0x6d,0x86,0x91,0x79,0x45,0x32,0x06,0x35,0x27,0x6f,0x5b,0x5a,0x69,0x2d,0x4e,0x25,0x8f,0x71,0x7e,0x9b,0x19,0x00,0x02,0xff,0x14,0x04,0x89,0x00,0xec,0x07,0x8c,0x00,0x10, +0x00,0x1c,0x00,0x3e,0xb9,0x00,0x0f,0x01,0x36,0xb3,0x0d,0x03,0x05,0x15,0x41,0x0b,0x01,0x3d,0x00,0x0b,0x01,0x39,0x00,0x1a,0x01,0x3d,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00,0x10,0x01,0x3c,0xb3,0x12,0x01,0x0f,0x17,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0xd4,0x32,0x32,0xe1,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f, +0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x36,0xec,0x52,0x02,0x3a,0x76,0x60,0x74,0x80,0x6a,0x6a,0x30,0x02,0x52,0x52,0x53,0x3f,0xa0,0x54,0x44,0x45,0x55,0x04,0x96,0x58,0x65,0x8b,0x75,0x80,0x99,0x52,0x01,0x3c,0xfd, +0xf1,0x4b,0x3f,0x55,0xce,0x59,0x66,0x64,0x00,0x01,0xff,0x2b,0x04,0x96,0x00,0xd5,0x07,0x8c,0x00,0x11,0x00,0x32,0xb9,0x00,0x0b,0x01,0x36,0xb2,0x0d,0x08,0x04,0xbf,0x01,0x3d,0x00,0x0f,0x01,0x39,0x00,0x01,0x00,0x08,0x01,0x3a,0x00,0x00,0x01,0x3c,0xb2,0x01,0x0b,0x08,0xb9,0x01,0x3c,0x00,0x09,0x2f,0xe1,0x32,0xd4,0xe1,0x00,0x3f, +0x33,0x3f,0xed,0x12,0x39,0x3f,0x31,0x30,0x13,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0xd5,0x52,0x77,0x3d,0x52,0x52,0x52,0x02,0x3b,0x6d,0xae,0x04,0x96,0x01,0x26,0xa0,0x5c,0x48,0xfe,0xde,0x02,0xf6,0xfe,0xb6,0x60,0xd1,0x00,0x01,0xfe,0x96,0x04,0x96,0x01,0x6c,0x06,0xa2,0x00,0x1d, +0x00,0x51,0xb4,0x04,0x15,0x19,0x03,0x0c,0xb8,0x01,0x3d,0xb2,0x40,0x1b,0x17,0xba,0x01,0x39,0x00,0x13,0x01,0x38,0xb2,0x08,0x00,0x10,0xba,0x01,0x3a,0x00,0x00,0x01,0x3c,0xb7,0x01,0x0e,0x08,0x10,0x09,0x42,0x19,0x08,0xb8,0x01,0x3c,0xb4,0x09,0x09,0x1e,0x13,0x10,0xb9,0x01,0x3c,0x00,0x11,0x2f,0xe1,0x32,0x11,0x39,0x2f,0xe1,0x39, +0x2b,0x01,0x10,0xf2,0xe1,0x00,0x18,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x1a,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x01,0x6c,0x52,0x72,0x35,0x4a,0x52,0x75,0x35,0x45,0x52,0x52,0x02,0x36,0x67, +0x71,0x20,0x3a,0x70,0xaa,0x04,0x96,0x01,0x26,0xa0,0x5e,0x44,0xfe,0xdc,0x01,0x30,0x96,0x59,0x49,0xfe,0xdc,0x02,0x00,0x50,0x5c,0x6a,0x6a,0xd1,0x00,0x01,0xff,0x9c,0x04,0x96,0x00,0xa8,0x06,0xa0,0x00,0x0f,0x00,0x2d,0xb3,0x0a,0x07,0x00,0x02,0xbe,0x01,0x40,0x00,0x0d,0x01,0x39,0x00,0x08,0x01,0x38,0x00,0x07,0x01,0x3a,0xb3,0x00, +0x00,0x09,0x06,0xb9,0x01,0x3c,0x00,0x07,0x2f,0xf1,0x32,0xc2,0x2f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x12,0x39,0x31,0x30,0x13,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0xa8,0x16,0x2a,0x35,0x45,0x52,0x52,0x02,0x24,0x63,0x1d,0x14,0x06,0x44,0x10,0x64,0x54,0xfe,0xfa,0x02,0x00,0x69,0x73,0x08,0x00, +0x00,0x01,0xff,0x6a,0x04,0x8c,0x00,0x96,0x07,0x2d,0x00,0x13,0x00,0x3a,0xb2,0x0a,0x0e,0x05,0x41,0x09,0x01,0x3d,0x00,0x0b,0x00,0x08,0x01,0x38,0x00,0x13,0x00,0x11,0x01,0x3d,0x00,0x02,0x01,0x3b,0xb6,0x13,0x0d,0x0d,0x0e,0x06,0x0b,0x0e,0xb8,0x01,0x3c,0xb1,0x08,0x05,0x2f,0x33,0xe1,0x32,0xcd,0x10,0xc1,0x2f,0x32,0x00,0x3f,0xed, +0x32,0x3f,0x33,0xed,0x32,0xcd,0x31,0x30,0x13,0x06,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x96,0x1e,0x2e,0x88,0x58,0x58,0x52,0x82,0x82,0x4c,0x1f,0x17,0x04,0x9c,0x10,0x95,0x01,0x2f,0x46,0x7c,0x1b,0x97,0x46,0xfe,0xdf,0x5e,0x11,0x00,0x00,0x01,0xff,0x10,0x04,0x96,0x00,0xf0, +0x06,0x96,0x00,0x0b,0x00,0x5b,0x40,0x0e,0x07,0x40,0x0e,0x11,0x48,0x07,0x18,0x09,0x0d,0x48,0x07,0x02,0x0b,0x04,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x40,0x25,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x0b,0x00,0x0e,0x07,0x0f,0x04,0x1f,0x04,0x2f,0x04,0x03,0x09,0x05,0x04,0x03,0x03,0x07,0x42,0x03,0x01,0x18,0x09,0x0d,0x48,0x00,0x01, +0x02,0x03,0x04,0x07,0x19,0x2f,0x17,0x33,0x2b,0x18,0x2f,0x2b,0x11,0x01,0x33,0x5f,0x5e,0x5d,0x10,0xe0,0x32,0x5d,0x00,0x18,0x3f,0x3f,0x33,0x12,0x39,0x2b,0x2b,0x31,0x30,0x13,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0xf0,0xcd,0x50,0xc3,0x5a,0x84,0x0c,0x04,0x02,0x05,0x0b,0x8a,0x06,0x96,0xfe,0x00,0x02,0x00,0xfe, +0x8d,0x21,0x27,0x26,0x20,0x01,0x75,0x00,0x00,0x01,0xff,0x23,0x04,0x96,0x00,0xdd,0x06,0x96,0x00,0x14,0x00,0x1c,0xbb,0x00,0x0e,0x01,0x38,0x00,0x0a,0x01,0x3a,0x40,0x09,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x0b,0x2f,0xc4,0x5d,0x00,0x3f,0x3f,0x31,0x30,0x13,0x03,0x17,0x23,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x23,0x37,0x03, +0x33,0x17,0x16,0x17,0x33,0x37,0x37,0xdd,0xac,0xaa,0x60,0x65,0x0f,0x07,0x02,0x07,0x0f,0x67,0x5e,0xae,0xa8,0x60,0x63,0x08,0x0e,0x02,0x16,0x69,0x06,0x96,0xfe,0xfe,0xfe,0xa6,0x19,0x0d,0x0e,0x18,0xa6,0xfc,0x01,0x04,0xae,0x0e,0x1c,0x2a,0xae,0x00,0x00,0x01,0x00,0x72,0x03,0xc6,0x01,0x62,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb4,0x02, +0x03,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x62,0x7c,0x74,0x54,0x05,0x9a,0xfe,0x2c,0x01,0xd4,0x00,0x01,0x00,0x72,0xfd,0xfe,0x01,0x62,0xff,0xc6,0x00,0x03,0x00,0x20,0xb9,0x00,0x03,0xff,0xc0,0x40,0x0e,0x0e,0x11,0x48,0x03,0x03,0x04,0x1f,0x02,0x2f,0x02,0x02,0x02,0x00,0x02,0x2f,0xcd,0x00, +0x2f,0x5d,0x12,0x39,0x2f,0x2b,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0x62,0x54,0x9c,0x7e,0x3a,0xfe,0x38,0x01,0xc8,0x00,0x01,0x01,0xba,0xfe,0x40,0x02,0xf6,0xff,0x89,0x00,0x0c,0x00,0x21,0x40,0x11,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x06,0x40,0x09,0x0d,0x48,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x2b,0x1a,0xdc, +0x1a,0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x02,0xf6,0x3c,0x56,0x4b,0x5f,0x7b,0x44,0x29,0x29,0xfe,0x90,0x50,0x53,0x46,0xb0,0xba,0x43,0x2a,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x50,0x05,0xc4,0x00,0x11,0x00,0x36,0xbc,0x00,0x0a,0x01,0x07,0x00,0x09,0x00,0x01,0x01,0x0a,0xb2, +0x0a,0x0c,0x04,0xbc,0x01,0x0d,0x00,0x0f,0x01,0x09,0x00,0x00,0x01,0x0c,0xb4,0x01,0x01,0x13,0x0c,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xe9,0x00,0x3f,0xed,0x32,0x32,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d, +0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x50,0x05,0xc4,0x00,0x1a,0x00,0x4d,0xb1,0x09,0x01,0xbd,0x01,0x0a,0x00,0x15,0x00,0x04,0x01,0x0d,0x00,0x18,0xff,0xc0,0xb3,0x09,0x0d,0x48,0x18,0xb8,0x01,0x09,0xb2,0x10, +0x10,0x12,0xba,0x01,0x0d,0x00,0x0d,0x01,0x07,0xb3,0x10,0x10,0x08,0x00,0xb8,0x01,0x0c,0xb4,0x01,0x01,0x1c,0x15,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xe9,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x2b,0xed,0x32,0x3f,0x33,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x36, +0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x39,0x45,0x80,0x96,0x87,0x3d,0x3c,0x3a,0x3d,0x9f,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x0a,0x88,0x98,0x18,0x68,0x1c,0xb2,0x46,0x67,0xe7,0x00,0x02,0xff,0xbe,0x01,0x98,0x00,0xf6,0x05,0xc4,0x00,0x07, +0x00,0x13,0x00,0x38,0xb2,0x0d,0x0d,0x0f,0xb8,0x01,0x0d,0xb5,0x0a,0x12,0x04,0x00,0x40,0x12,0xb8,0x01,0x08,0x40,0x0b,0x02,0x06,0x0c,0x11,0x08,0x02,0x06,0xff,0x3a,0x0c,0x08,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xe9,0x33,0x2b,0x01,0x18,0x2f,0x2f,0x2f,0x00,0x3f,0x1a,0xde,0xcd,0x10,0xd4,0xed,0x32,0x2f,0x31,0x30,0x13,0x22,0x35,0x34, +0x33,0x32,0x15,0x14,0x03,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0xa6,0x4e,0x50,0x4e,0x0e,0xda,0x2b,0x25,0x22,0x24,0x64,0x80,0x05,0x2d,0x4c,0x4b,0x4b,0x4c,0xfd,0x79,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x02,0x24,0x00,0x01,0x00,0x66,0x02,0x9a,0x01,0xa8,0x04,0xc8,0x00,0x0e,0x00,0x2d,0xbb,0x00,0x06,0x01,0x0a,0x00, +0x07,0x01,0x08,0xb5,0x0e,0xda,0x00,0x09,0x00,0x02,0xbe,0x01,0x0e,0x00,0x0c,0x01,0x09,0x00,0x09,0x00,0x05,0x01,0x0c,0x00,0x06,0x2f,0xe9,0x32,0x00,0x3f,0xed,0x32,0x32,0x2f,0xed,0x3f,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x01,0xa8,0x1e,0x26,0x7e,0x80,0x80,0x02,0x28,0x69, +0x1b,0x14,0x04,0x46,0x12,0xb4,0xfe,0xf6,0x02,0x24,0x6c,0x76,0x08,0x00,0x00,0x01,0x00,0x0a,0x02,0x90,0x01,0x4c,0x04,0xbe,0x00,0x0e,0x00,0x31,0xb5,0x08,0x02,0x08,0x0a,0x52,0x05,0xbc,0x01,0x0b,0x00,0x01,0x01,0x0a,0x00,0x0d,0x01,0x08,0xb3,0x07,0x07,0x0c,0x00,0xb8,0x01,0x0c,0xb3,0x01,0x01,0x10,0x0f,0x11,0x12,0x39,0x2f,0xe9, +0x33,0x33,0x2f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x2f,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x01,0x4c,0x7f,0x02,0x29,0x68,0x1c,0x14,0x1e,0x26,0x7f,0x7f,0x02,0x9a,0x6c,0x76,0x08,0x7a,0x12,0xb4,0x01,0x0a,0x00,0x01,0x00,0x0a,0x01,0x94,0x01,0xcf,0x04,0xbe,0x00,0x16,0x00,0x3e, +0xb2,0x16,0x16,0x14,0xb8,0x01,0x0d,0xb7,0x02,0x08,0x0b,0x05,0x0b,0x0d,0x52,0x08,0xba,0x01,0x0b,0x00,0x10,0x01,0x08,0xb5,0x00,0x0a,0x00,0x0a,0x0f,0x12,0xb8,0x01,0x0c,0xb3,0x04,0x04,0x18,0x17,0x11,0x12,0x39,0x2f,0xe9,0x33,0x33,0x32,0x2f,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x32,0x2f,0x10,0xd4,0xed,0x32,0x2f,0x31,0x30,0x01,0x06, +0x23,0x22,0x35,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0xcf,0x23,0x40,0x9f,0x02,0x29,0x68,0x1c,0x14,0x1e,0x26,0x7f,0x7f,0x4a,0x1e,0x1b,0x01,0xa6,0x12,0xbe,0xb4,0x76,0x08,0x7a,0x12,0xb4,0x01,0x0a,0xfd,0x9e,0x5e,0x10,0x00,0x02,0x00,0x66,0x02,0x9a,0x02,0x29,0x04,0xbe, +0x00,0x10,0x00,0x17,0x00,0x4d,0xb1,0x03,0x11,0xb8,0x01,0x0d,0xb3,0x0c,0x0c,0x0a,0x12,0xbd,0x01,0x0d,0x00,0x09,0x01,0x0a,0x00,0x00,0x00,0x0a,0x01,0x08,0x40,0x09,0x01,0x0f,0x0f,0x12,0x10,0xc2,0x00,0x00,0x06,0xb8,0x01,0x0c,0xb5,0x15,0x15,0x19,0x04,0x0c,0x12,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x32,0x12,0x39,0x2f,0xe9, +0x32,0x2f,0xe9,0x11,0x39,0x11,0x33,0x00,0x3f,0x33,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x07,0x06,0x07,0x15,0x16,0x15,0x14,0x23,0x23,0x11,0x33,0x15,0x33,0x32,0x37,0x37,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0x29,0x47,0x1a,0x36,0x7c,0xdf,0xc9,0x80,0x2a,0x3e,0x1c,0x3c,0xc0,0x43,0x67,0x61,0x04,0xbe,0xa2,0x3c, +0x15,0x03,0x14,0x6e,0xac,0x02,0x24,0xd0,0x43,0x8d,0xfe,0xce,0x90,0x48,0x48,0x00,0x00,0x01,0x00,0x14,0x02,0x9a,0x03,0x18,0x04,0xbe,0x00,0x1b,0x00,0x17,0xbb,0x00,0x0a,0x01,0x0a,0x00,0x0b,0x01,0x08,0xb3,0x00,0x00,0x1d,0x0b,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x34,0x27,0x23,0x06,0x07,0x03,0x23, +0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x03,0x18,0x8c,0x9c,0x4a,0x0c,0x04,0x04,0x09,0x51,0x9c,0x88,0x8a,0x48,0x03,0x05,0x04,0x02,0x0a,0x58,0x92,0x50,0x03,0x05,0x04,0x02,0x08,0x4a,0x04,0xbe,0xfd,0xdc,0x01,0x41,0x01,0x45,0x19,0x2b,0xfe,0xbd,0x02,0x24,0xfe,0x9e,0x10,0x36,0x20, +0x28,0x01,0x60,0xfe,0x9e,0x0b,0x3b,0x20,0x26,0x01,0x62,0x00,0x00,0x01,0x00,0x0a,0x01,0x94,0x02,0x2f,0x04,0xbe,0x00,0x14,0x00,0x25,0xb2,0x06,0x06,0x08,0xb8,0x01,0x0d,0xb6,0x11,0x14,0x0b,0x01,0x04,0x03,0x0c,0xb8,0x01,0x08,0xb3,0x00,0x00,0x16,0x0c,0x2f,0x11,0x33,0x2f,0x00,0x3f,0xd4,0x17,0x39,0xed,0x32,0x2f,0x31,0x30,0x01, +0x03,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x02,0x2f,0xeb,0x48,0xa2,0x22,0x26,0x1e,0x20,0x57,0x24,0x14,0xd5,0x8a,0x78,0x0a,0x06,0x05,0x09,0x09,0x79,0x04,0xbe,0xfd,0x94,0xbe,0x0c,0x6c,0x0e,0x60,0x38,0x02,0x28,0xfe,0xa0,0x1e,0x34,0x37,0x1b,0x01,0x60,0x00,0x00,0x01, +0x00,0x82,0x03,0xdb,0x01,0x5e,0x05,0x9a,0x00,0x03,0x00,0x18,0xb7,0x02,0x03,0x03,0x03,0xbd,0x00,0x00,0x01,0xb9,0x01,0x34,0x00,0x02,0x2f,0xe9,0x32,0x2f,0xe9,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x5e,0x68,0x74,0x56,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x00,0x02,0x00,0x8d,0x03,0xdb,0x02,0x84,0x05,0x9a,0x00,0x03, +0x00,0x07,0x00,0x28,0x40,0x12,0x06,0x03,0x02,0x07,0x04,0x03,0x00,0x00,0x01,0x02,0x02,0x09,0x06,0x07,0x04,0x04,0x05,0x06,0x2f,0xcd,0x32,0x2f,0xcd,0x11,0x12,0x39,0x2f,0xcd,0x32,0x2f,0xcd,0x00,0x3f,0xc4,0x33,0x32,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x84,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe, +0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x00,0x01,0x00,0x6a,0x03,0xf4,0x01,0x6c,0x05,0xb2,0x00,0x03,0x00,0x16,0x40,0x09,0x02,0x03,0x04,0x03,0x00,0x00,0x01,0x01,0x02,0x2f,0x33,0x11,0x33,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x6c,0x6c,0x96,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0x00,0xff,0xff,0x00,0x6e, +0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x06,0x00,0xb7,0x00,0x00,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x16,0x40,0x09,0x01,0x02,0x04,0x01,0x00,0x00,0x03,0x03,0x02,0x2f,0x33,0x11,0x33,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x23,0x03,0x33,0x01,0x70,0x74,0x8e,0x94,0x03,0xf4,0x01,0xbe,0x00,0x00,0x01, +0x00,0xfb,0x04,0xc2,0x01,0xaf,0x06,0x2f,0x00,0x0b,0x00,0x22,0x40,0x10,0x05,0xcb,0x40,0x06,0xc0,0x01,0xcb,0x40,0x00,0x00,0x06,0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x35,0x32,0x35,0x34,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0xfb,0x5e,0x5e,0x4e,0x66,0x66, +0x04,0xc2,0x5c,0x5b,0x58,0x5e,0x68,0x4e,0x4e,0x69,0x00,0x01,0x00,0xfb,0x04,0xc2,0x01,0xaf,0x06,0x2f,0x00,0x0b,0x00,0x20,0x40,0x0f,0x07,0xcb,0x40,0x06,0xc0,0x0b,0xcb,0x40,0x00,0x00,0x06,0x80,0x09,0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x15, +0x22,0x15,0x14,0x33,0x01,0xaf,0x4e,0x66,0x65,0x4f,0x5e,0x5e,0x04,0xc2,0x69,0x4e,0x4d,0x69,0x5e,0x58,0x5b,0x00,0x00,0x01,0x00,0x14,0x02,0x9a,0x01,0xb0,0x05,0xc4,0x00,0x15,0x00,0x2f,0xb1,0x0b,0x09,0xbe,0x01,0x0d,0x00,0x0e,0x01,0x07,0x00,0x01,0x01,0x0a,0x00,0x00,0x01,0x0c,0xb3,0x01,0x01,0x0b,0x11,0xb8,0x01,0x0c,0xb3,0x07, +0x07,0x17,0x0b,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xed,0x32,0x31,0x30,0x13,0x23,0x11,0x34,0x36,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0xfc,0x7f,0x24,0x41,0x4d,0x87,0x4a,0x4a,0x4a,0x5a,0x73,0x85,0x6a,0x4a,0x02,0x9a,0x01,0x08,0x40,0x59,0x3c,0x49,0x36, +0x64,0x2b,0x73,0x22,0x6e,0x58,0x62,0x60,0x44,0x56,0x00,0x01,0x00,0x0a,0x02,0x9a,0x01,0xa6,0x05,0xc4,0x00,0x15,0x00,0x2f,0xb1,0x00,0x02,0xbe,0x01,0x0d,0x00,0x13,0x01,0x07,0x00,0x0b,0x01,0x0a,0x00,0x09,0x01,0x0c,0xb6,0x0c,0x0c,0x10,0x00,0x00,0x17,0x04,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x2f,0xe1, +0x00,0x3f,0x3f,0xed,0x32,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0xa6,0x48,0x52,0x80,0x4f,0x3a,0x29,0x80,0x50,0x64,0x8b,0x73,0x52,0x4c,0x05,0x2f,0x2b,0x5e,0x33,0x50,0x3a,0x58,0x45,0xfe,0xf8,0x01,0x06,0x4c,0x50,0x64,0x5a,0x58,0x72,0x22, +0x00,0x01,0x00,0x72,0x00,0xe4,0x04,0x3c,0x04,0xc2,0x00,0x06,0x00,0x32,0x40,0x16,0x04,0x03,0x0e,0x05,0x20,0x06,0x00,0x05,0x00,0x42,0x00,0x00,0x02,0x01,0x05,0x05,0x01,0x04,0x00,0x00,0x08,0x07,0x11,0x12,0x39,0x2f,0x33,0xcd,0x39,0x00,0x19,0x2f,0x33,0x33,0x33,0x18,0x2f,0x2b,0x11,0x00,0x33,0x1a,0x19,0x10,0xed,0x32,0x31,0x30, +0x25,0x01,0x35,0x01,0x17,0x01,0x01,0x04,0x3c,0xfc,0x36,0x03,0xc8,0x01,0xfc,0xff,0x03,0x00,0xe4,0x01,0x9b,0xa8,0x01,0x9b,0xb2,0xfe,0xc3,0xfe,0xc3,0x00,0x00,0x01,0x00,0x70,0x00,0xe4,0x04,0x3c,0x04,0xc2,0x00,0x06,0x00,0x32,0x40,0x17,0x04,0x05,0x0e,0x03,0x20,0x02,0x01,0x03,0x01,0x42,0x01,0x00,0x01,0x06,0x03,0x03,0x03,0x00, +0x04,0x01,0x01,0x08,0x07,0x11,0x12,0x39,0x2f,0x33,0xcd,0x39,0x00,0x19,0x2f,0x17,0x33,0x18,0x2f,0x2b,0x11,0x00,0x33,0x1a,0x19,0x10,0xed,0x32,0x31,0x30,0x01,0x01,0x35,0x01,0x01,0x35,0x01,0x04,0x3a,0xfc,0x36,0x03,0x02,0xfc,0xfe,0x03,0xcc,0x02,0x7f,0xfe,0x65,0xb2,0x01,0x3d,0x01,0x3d,0xb2,0xfe,0x65,0x00,0x00,0x01,0x00,0x66, +0x00,0xee,0x04,0x46,0x04,0xb8,0x00,0x06,0x00,0x23,0x40,0x0f,0x02,0x05,0x01,0x03,0x06,0x05,0x02,0x02,0x04,0x01,0x00,0x00,0x08,0x03,0x04,0x2f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x33,0x33,0x00,0x2f,0x33,0xcd,0x32,0x31,0x30,0x25,0x23,0x01,0x01,0x23,0x01,0x33,0x04,0x46,0xb2,0xfe,0xc2,0xfe,0xc2,0xb2,0x01,0x9c,0xa8,0xee, +0x03,0x02,0xfc,0xfe,0x03,0xca,0x00,0x01,0x00,0x66,0x00,0xee,0x04,0x46,0x04,0xb8,0x00,0x06,0x00,0x23,0x40,0x0f,0x06,0x04,0x05,0x02,0x02,0x01,0x05,0x05,0x03,0x06,0x00,0x00,0x08,0x04,0x03,0x2f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x33,0x33,0x00,0x2f,0x33,0xcd,0x32,0x31,0x30,0x01,0x01,0x23,0x01,0x33,0x01,0x01,0x04,0x46, +0xfe,0x64,0xa8,0xfe,0x64,0xb2,0x01,0x3e,0x01,0x3e,0x04,0xb8,0xfc,0x36,0x03,0xca,0xfc,0xfe,0x03,0x02,0x00,0x01,0x01,0x20,0x04,0x96,0x01,0x8a,0x06,0x00,0x00,0x03,0x00,0x11,0xb3,0x01,0x02,0x01,0x00,0xb9,0x01,0x32,0x00,0x01,0x2f,0xe1,0x00,0x3f,0xcd,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x8a,0x6a,0x6a,0x04,0x96,0x01,0x6a,0x00, +0xff,0xff,0x00,0x87,0x04,0xc2,0x02,0x0c,0x06,0x0a,0x02,0x06,0x00,0x8e,0x00,0x00,0xff,0xff,0x00,0x52,0x04,0xc2,0x01,0xd7,0x06,0x0a,0x02,0x06,0x00,0x43,0x00,0x00,0x00,0x01,0x01,0x20,0xfe,0x1e,0x01,0x8a,0xff,0x89,0x00,0x03,0x00,0x15,0xb5,0x02,0x02,0x04,0x01,0x1c,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x00,0x3f,0x12,0x39, +0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x8a,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0x00,0x00,0x01,0x00,0x3e,0xff,0x1c,0x02,0x3a,0xff,0x89,0x00,0x03,0x00,0x13,0xb7,0x01,0xe2,0x02,0x04,0x03,0x03,0x05,0x02,0x2f,0x12,0x39,0x2f,0x00,0x10,0xde,0xed,0x31,0x30,0x05,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0xe4,0x6d,0x00,0xff,0xff, +0x00,0x52,0xfe,0x43,0x01,0xd7,0xff,0x8b,0x00,0x07,0x00,0x43,0x00,0x00,0xf9,0x81,0xff,0xff,0x00,0x87,0xfe,0x42,0x02,0x0c,0xff,0x8a,0x00,0x07,0x00,0x8e,0x00,0x00,0xf9,0x80,0x00,0x02,0x00,0xb6,0x00,0x00,0x01,0x83,0x04,0x25,0x00,0x03,0x00,0x07,0x00,0x1f,0x40,0x11,0x02,0x63,0x03,0x06,0x63,0x05,0x00,0x42,0x04,0x40,0x13,0x19, +0x48,0x04,0x62,0x03,0x05,0x2f,0x33,0xf1,0x2b,0xe2,0x00,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x13,0x23,0x37,0x33,0x01,0x83,0x5a,0x19,0x5a,0xcc,0xcc,0x5a,0x18,0x04,0x25,0xcd,0xcd,0xfb,0xdb,0xcd,0x00,0x00,0x01,0x00,0xb6,0x01,0xc8,0x01,0x83,0x02,0x96,0x00,0x03,0x00,0x15,0x40,0x0b,0x03,0x63,0x02,0x00,0x40,0x13, +0x19,0x48,0x00,0x62,0x03,0x2f,0xe1,0x2b,0x00,0x2f,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x01,0x83,0x58,0x1b,0x5a,0x02,0x96,0xce,0xce,0xff,0xff,0x00,0xfb,0x01,0x75,0x01,0xaf,0x02,0xe2,0x00,0x07,0x06,0x84,0x00,0x00,0xfc,0xb3,0xff,0xff,0x00,0xfb,0x01,0x75,0x01,0xaf,0x02,0xe2,0x00,0x07,0x06,0x85,0x00,0x00,0xfc,0xb3,0x00,0x01, +0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xe6,0x00,0x07,0x00,0x22,0xb3,0x03,0xc0,0x05,0x02,0xb8,0x01,0x33,0xb5,0x00,0x06,0x06,0x05,0x01,0x05,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0xcd,0x10,0xc9,0x2f,0x00,0x2f,0xed,0x32,0x1a,0xcc,0x31,0x30,0x13,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xa0,0x7e,0x6e,0x7e,0x01,0x74,0x6b,0x01,0x07,0xfe, +0xf9,0x6b,0x00,0x01,0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xe6,0x00,0x07,0x00,0x1f,0x40,0x0e,0x01,0x06,0xe2,0x40,0x07,0xc0,0x04,0x01,0x01,0x02,0x06,0x02,0x50,0x05,0x2f,0xe1,0xcd,0x10,0xc1,0x2f,0x00,0x2f,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x02,0x0a,0x7e,0x6e,0x7e,0x02,0xe6,0x6b,0xfe, +0xf9,0x01,0x07,0x6b,0x00,0x01,0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xdd,0x00,0x0b,0x00,0x29,0x40,0x13,0x08,0x80,0x01,0x04,0xfd,0x40,0x0a,0x07,0x03,0x00,0x04,0x05,0x05,0x80,0x0a,0x01,0xfc,0x07,0x04,0x2f,0x33,0xf1,0x32,0x1a,0xc8,0x2f,0x10,0xcc,0x00,0x2f,0xde,0x32,0x1a,0xfd,0x32,0x1a,0xce,0x31,0x30,0x01,0x23,0x15,0x23,0x35, +0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x02,0x0a,0x7e,0x6e,0x7e,0x7e,0x6e,0x7e,0x01,0xf4,0x80,0x80,0x6a,0x7f,0x7f,0x00,0x01,0x00,0x3e,0x01,0xf4,0x02,0x3a,0x02,0x60,0x00,0x03,0x00,0x11,0xb6,0x02,0xe2,0x01,0x00,0x00,0x05,0x01,0x2f,0x12,0x39,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x01, +0xf4,0x6c,0x00,0x01,0x00,0x79,0x02,0x79,0x02,0x31,0x03,0xc8,0x00,0x0c,0x00,0x3d,0xb7,0x0c,0x0c,0x09,0x01,0x01,0x0b,0x06,0x04,0xb8,0x01,0x35,0x40,0x09,0x09,0x01,0x06,0x40,0x0b,0x0e,0x48,0x06,0x00,0xb8,0xff,0xc0,0x40,0x09,0x09,0x0d,0x48,0x00,0x00,0x01,0x06,0x03,0x0b,0x19,0x2f,0x17,0x33,0x18,0x2f,0x2b,0x2f,0x2b,0x19,0x2f, +0x00,0x18,0x2f,0xed,0x32,0xcd,0x32,0x2f,0x11,0x39,0x2f,0x31,0x30,0x13,0x37,0x17,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x07,0x79,0xcb,0x20,0x27,0x4e,0x29,0x2f,0x39,0x30,0x7a,0x3c,0x54,0x02,0xf0,0xd8,0x5e,0x74,0x22,0x80,0x1f,0x79,0x56,0x00,0x01,0x00,0x48,0x03,0xa4,0x02,0x68,0x05,0xc4,0x00,0x0b,0x00,0x4a,0x40,0x16, +0x00,0x01,0x04,0x03,0x03,0x06,0x09,0x0a,0x03,0x07,0x02,0x03,0x07,0x08,0x0b,0x05,0xe4,0x05,0xf4,0x05,0x02,0x05,0xb8,0xff,0xe0,0x40,0x15,0x2c,0x30,0x48,0x05,0x00,0x09,0x0a,0x03,0x01,0x04,0x06,0x07,0x03,0x03,0x01,0x02,0x03,0x05,0x0b,0x05,0x08,0x19,0x2f,0x17,0x33,0x11,0x17,0x33,0x11,0x17,0x33,0x00,0x2f,0x2b,0x5d,0x17,0x33, +0x11,0x17,0x33,0x11,0x17,0x33,0x31,0x30,0x01,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x02,0x68,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0x03,0xf8,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0x00,0x02,0x00,0x0a,0x01,0xb8,0x02,0x4c,0x04,0xbe,0x00,0x11,0x00,0x19,0x00,0x4f,0x40,0x12, +0x01,0x0d,0x10,0x12,0x04,0x11,0x0f,0x07,0x16,0x01,0x0d,0x10,0x12,0x04,0x04,0x0a,0x11,0x00,0xb8,0xff,0xc0,0x40,0x10,0x09,0x0c,0x48,0x00,0x00,0x04,0x0f,0x0e,0x40,0x09,0x0c,0x48,0x0e,0x0e,0x0a,0x04,0xbc,0x01,0x34,0x00,0x18,0x00,0x0a,0x01,0x34,0x00,0x14,0x2f,0xe1,0xde,0xe1,0x10,0xc2,0x2f,0x2b,0x32,0x10,0xc2,0x2f,0x2b,0x32, +0x11,0x12,0x17,0x39,0x00,0x2f,0xcd,0xc4,0x32,0x17,0x39,0x31,0x30,0x01,0x03,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x03,0x33,0x13,0x13,0x03,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x02,0x4c,0xdc,0x19,0x3b,0x5c,0x43,0x45,0x52,0x3d,0x19,0xda,0x8a,0x95,0x99,0x99,0x29,0x29,0x29,0x04,0xbe,0xfe,0x50,0x28,0x5e, +0x3c,0x3a,0x5a,0x52,0x3e,0x37,0x67,0x28,0x01,0xb0,0xfe,0xb9,0x01,0x47,0xfd,0xf6,0x44,0x22,0x34,0x34,0x22,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x00,0xe6,0x05,0xc4,0x00,0x03,0x00,0x16,0xbe,0x00,0x02,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x00,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x13,0x23,0x11,0x33,0xe6,0x80, +0x80,0x02,0x9a,0x03,0x2a,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xbc,0x04,0xcf,0x00,0x1d,0x00,0x5d,0x40,0x17,0x25,0x17,0x01,0x17,0x15,0x03,0x0b,0x09,0x1b,0x09,0x2b,0x09,0x03,0x0b,0x07,0x1b,0x07,0x02,0x09,0x07,0x1c,0x10,0x12,0xbf,0x01,0x0d,0x00,0x0d,0x01,0x09,0x00,0x01,0x00,0x03,0x01,0x0d,0x00,0x1c,0x01,0x0b,0xb3,0x10, +0x10,0x0a,0x19,0xb8,0x01,0x0c,0xb4,0x05,0x05,0x1f,0x01,0x14,0xb8,0x01,0x0c,0xb2,0x0a,0x0a,0x01,0x2f,0x33,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x39,0x5d,0x5d,0x12,0x39,0x39,0x5d,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32, +0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x3e,0x48,0x55,0x63,0x27,0x4a,0x8f,0x79,0x5d,0x47,0x43,0x42,0x4a,0x56,0x60,0x69,0x37,0x7f,0x66,0x4f,0x02,0xac,0x70,0x30,0x39,0x1b,0x21,0x1e,0x38,0x6c,0x4a,0x62,0x1d,0x6e,0x28,0x3d,0x31,0x27,0x2a,0x4e,0x30,0x46,0x60,0x00,0x01,0x00,0x14,0x02,0x9a, +0x02,0x2d,0x04,0xbe,0x00,0x13,0x00,0x17,0xbb,0x00,0x0e,0x01,0x08,0x00,0x0a,0x01,0x0a,0xb3,0x02,0x02,0x15,0x0b,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x13,0x23,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x23,0x13,0x03,0x33,0x1f,0x02,0x33,0x37,0x02,0x2d,0xb9,0xb7,0x8f,0x62,0x02,0x15,0x05,0x08,0x0e,0x64,0x90,0xbd, +0xae,0x8f,0x5e,0x01,0x14,0x04,0x7d,0x04,0xbe,0xfe,0xf0,0xfe,0xec,0xa4,0x02,0x2a,0x12,0x18,0xa6,0x01,0x0e,0x01,0x16,0xae,0x02,0x28,0xd8,0x00,0xff,0xff,0x00,0x0a,0x02,0x9a,0x01,0xa6,0x05,0xc4,0x02,0x06,0x06,0x87,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x05,0x00,0x1a,0x40,0x0b,0x01,0x03,0x04,0x04, +0x03,0x03,0x00,0x01,0x01,0x07,0x06,0x11,0x12,0x39,0x2f,0xcd,0x33,0x2f,0x00,0x3f,0xcd,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0xe4,0x05,0x1e,0x9c,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x03,0x04,0x06,0x04,0x03,0x03,0x05,0x00,0x01,0x01,0x09, +0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x3f,0x2f,0xcd,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x03,0xd5,0x9d,0x01,0x48,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x06,0x04,0x03,0x04,0x03,0x03,0x05,0x00,0x01, +0x01,0x09,0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x2f,0xcd,0x3f,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x02,0x90,0x9b,0x02,0x8f,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x06,0x04,0x03,0x04,0x03,0x03,0x05, +0x00,0x01,0x01,0x09,0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x2f,0xcd,0x3f,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x01,0x48,0x9c,0x03,0xd6,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x05,0x00,0x1a,0x40,0x0b,0x01,0x02,0x05,0x04,0x02,0x02, +0x05,0x04,0x04,0x07,0x06,0x11,0x12,0x39,0x2f,0xcd,0x33,0x2f,0x00,0x3f,0x2f,0xcd,0x31,0x30,0x21,0x21,0x35,0x21,0x11,0x33,0x02,0x79,0xfe,0x1d,0x01,0x48,0x9c,0x9c,0x05,0x1e,0x00,0x01,0x00,0x62,0x00,0x00,0x02,0x48,0x03,0x70,0x00,0x05,0x00,0x10,0xb5,0x02,0x04,0x01,0x05,0x04,0x01,0x2f,0xcd,0x2f,0x00,0x2f,0xcd,0x2f,0x31,0x30, +0x21,0x21,0x11,0x33,0x03,0x21,0x02,0x48,0xfe,0x1a,0x5e,0x02,0x01,0x8a,0x03,0x70,0xfc,0xee,0x00,0x01,0x00,0x62,0x00,0x00,0x02,0x48,0x03,0x70,0x00,0x07,0x00,0x19,0x40,0x0a,0x03,0x04,0x01,0x06,0x00,0x00,0x09,0x06,0x02,0x03,0x2f,0xcd,0x32,0x11,0x39,0x2f,0x00,0x2f,0xcd,0x2f,0x2f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x03, +0x21,0x02,0x48,0xfe,0x78,0x5e,0x5e,0x02,0x01,0x8a,0x01,0x89,0xfe,0x77,0x03,0x70,0xfe,0x78,0x00,0x01,0x00,0x3c,0xfe,0x40,0x02,0x6e,0xff,0x89,0x00,0x06,0x00,0x1c,0x40,0x0e,0x00,0x00,0x08,0x03,0x02,0x80,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f,0x12,0x39,0x2f,0x31,0x30,0x05,0x03,0x23,0x03, +0x33,0x17,0x37,0x02,0x6e,0xd6,0x84,0xd8,0x73,0xa4,0xa4,0x77,0xfe,0xb7,0x01,0x49,0xe5,0xe5,0x00,0x02,0x00,0x00,0x04,0x5c,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x13,0x05,0xd9,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x06,0x06,0x01,0xd9,0x02,0x00,0x04,0x01,0x00,0x05,0x2f,0xc4,0x33,0x32,0x00,0x3f,0xed,0x33,0x2f, +0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0xfe,0x70,0x77,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x0a,0x02,0x03,0x06,0x07,0x04,0x03,0xea,0x00,0x00,0x01,0xb8,0x01,0x34,0x40,0x09,0x02,0x02,0x09, +0x06,0x07,0xea,0x04,0x04,0x05,0xb9,0x01,0x34,0x00,0x06,0x2f,0xe9,0x32,0x2f,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x32,0x2f,0xe9,0x00,0x3f,0xcd,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c,0x76,0x6c,0x9a,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x01,0xff,0x3a,0xfe,0x1e, +0x01,0x4a,0x04,0x00,0x00,0x0c,0x00,0x3a,0x40,0x19,0x0b,0x0f,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03,0x1c,0x06,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x84,0x0a,0xb8,0xff,0xfe,0xb6,0x0c,0x06,0x4d,0x0a,0x0a,0x0e,0x0d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0xc6,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f, +0x31,0x30,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0xa4,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x03,0xf0,0x00,0x01,0x00,0x0a,0x00,0x00,0x02,0x0e,0x04,0x00,0x00,0x0b,0x00,0x2d,0x40,0x17,0x01,0x0a,0x04,0x95,0x40,0x07,0x08,0x03,0x07,0x95,0x30,0x30, +0x08,0x0f,0x03,0x00,0x00,0x09,0x08,0x02,0x84,0x05,0x03,0x2f,0xc6,0xf1,0x39,0x39,0xc2,0x2f,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x02,0x0e,0xb0,0xa4,0xb0,0xb0,0xa4,0xb0,0x01,0xdb,0xfe,0x25,0x01,0xdb,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x01, +0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4a,0x40,0x2e,0x74,0x06,0x84,0x06,0x02,0x36,0x06,0x46,0x06,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x34,0x07,0x44,0x07,0x54,0x07,0x74,0x07,0x84,0x07,0x94,0x07,0x06,0x07,0x02,0x04,0x06,0x08,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12, +0x39,0x2f,0x10,0xd4,0xcd,0x12,0x39,0x5d,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x03,0xd6,0x01,0x48,0x9c,0xfe,0xd6,0x01,0x2a,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba, +0x00,0x09,0x00,0x5a,0x40,0x39,0x24,0x03,0x01,0x16,0x03,0x01,0x94,0x06,0xa4,0x06,0x02,0x72,0x06,0x01,0x43,0x06,0x01,0x14,0x06,0x24,0x06,0x34,0x06,0x03,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x03,0x06,0x08,0x90,0x07,0xa0,0x07,0x02,0x84,0x07,0x01,0x70,0x07,0x01,0x07,0x02,0x02,0x01,0x08,0x01,0x00, +0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xd4,0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x02,0x8f,0x02,0x8f,0x9c,0xfe,0x07,0x01,0xf9,0x00,0x01,0x00,0x96, +0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x29,0x04,0x06,0x14,0x06,0x94,0x06,0xa4,0x06,0x04,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x03,0x06,0x09,0xa1,0x07,0x01,0x70,0x07,0x80,0x07,0x90,0x07,0x03,0x07,0x02,0x02,0x01,0x09,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x10,0xd4, +0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x01,0x47,0x03,0xd7,0x9c,0xfd,0x37,0x02,0xc9,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x38,0x40,0x20,0xa6,0x05,0x01,0x02, +0x05,0x03,0x01,0x06,0x08,0x0a,0x00,0x03,0x10,0x03,0x02,0x03,0x02,0x05,0x07,0xa0,0x06,0x01,0x91,0x06,0x01,0x70,0x06,0x80,0x06,0x02,0x06,0x01,0x00,0x2f,0x33,0x5d,0x5d,0x5d,0x2f,0xd4,0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8, +0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x05,0x1e,0x9c,0xfc,0x4a,0x03,0xb6,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x56,0x40,0x33,0xb7,0x06,0x01,0x03,0x06,0x04,0xb6,0x07,0x01,0x99,0x07,0x01,0x07,0x02,0x08,0x0a,0x05,0x04,0xb7,0x04,0x01,0xa8,0x04,0x01,0x04,0x05,0x08,0x93,0x06,0x01,0x86,0x06,0x01,0x77, +0x06,0x01,0x06,0x03,0x03,0x01,0xc6,0x02,0x01,0x48,0x02,0x58,0x02,0x02,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x5d,0x5d,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x5d,0x5d,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8, +0xfe,0x66,0x53,0x01,0x47,0x01,0x48,0x9c,0x05,0x0a,0xfe,0xcc,0x01,0x85,0x5f,0xfe,0xcc,0x01,0x34,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x18,0xaa,0x03,0x01,0x56,0x06,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12, +0x39,0x2f,0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x84,0x53,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0xb8,0x01,0x48,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07, +0x00,0x42,0x40,0x26,0x02,0x05,0x07,0x09,0x04,0x03,0xb6,0x03,0x01,0x03,0x04,0x06,0xc8,0x05,0x01,0x93,0x05,0x01,0x74,0x05,0x01,0x65,0x05,0x01,0x46,0x05,0x56,0x05,0x02,0x37,0x05,0x01,0x05,0x02,0x02,0x01,0x06,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde, +0xdd,0xc4,0x31,0x30,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x1e,0x53,0x02,0x8f,0x9c,0x02,0x8f,0x02,0xcc,0x5f,0xfd,0x8f,0x02,0x71,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x23,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0xb6,0x03,0x01,0x9b,0x03,0x01,0xa7,0x06,0x01, +0x56,0x06,0x01,0x03,0x06,0x02,0xb6,0x04,0x01,0x04,0x05,0x08,0x07,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x66,0x53, +0x01,0x9a,0xf5,0x9c,0x01,0x47,0x02,0x8f,0x01,0x85,0x5f,0xfe,0x7e,0xfe,0x0f,0x03,0x73,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x42,0x40,0x25,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0xb6,0x02,0x01,0x96,0x05,0x01,0x67,0x05,0x77,0x05,0x02,0x55,0x05,0x01,0x02,0x05,0x01,0xb6,0x03,0x01,0x03, +0x04,0x07,0x90,0x06,0x01,0x06,0x01,0x00,0x2f,0x33,0x5d,0x2f,0xc4,0x32,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x66,0x53,0x01,0xae,0xe1,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0x6a,0xfd,0x5e, +0x04,0x38,0x00,0x01,0x00,0x43,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0xb6,0x03,0x01,0x03,0x04,0x06,0x84,0x05,0x94,0x05,0x02,0x56,0x05,0x66,0x05,0x02,0x05,0x02,0x02,0x06,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x5d,0x33, +0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x65,0x53,0x01,0x48,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0xcc,0x01,0x34,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76,0x40,0x4a,0x68,0x07,0x01,0x88,0x04,0x01,0x83,0x03,0x01,0x77,0x03,0x01,0x58,0x03,0x68,0x03, +0x02,0x04,0x03,0x34,0x03,0x44,0x03,0x03,0x77,0x06,0x01,0x03,0x03,0x06,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0xc7,0x04,0x01,0x26,0x04,0x01,0x04,0x05,0x07,0x93,0x06,0xa3,0x06,0x02,0x02,0x83,0x06,0x01,0x74,0x06,0x01,0x27,0x06,0x01,0x06,0x03,0x03,0x01,0x7b,0x02,0x01,0x48,0x02,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0x33,0x5d,0x5d, +0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5f,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x47,0x01,0x48,0x9c,0x04,0xc4,0xfd,0xcb,0x02,0xe4, +0x47,0xfd,0xcb,0x02,0x35,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x40,0x86,0x03,0xc6,0x03,0xd6,0x03,0xe6,0x03,0x04,0x58,0x03,0x68,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x04,0x03,0x01,0x85,0x06,0x95,0x06,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0xb6,0x04,0x01,0x79,0x04,0x01, +0x04,0x05,0x08,0xa2,0x06,0x01,0x74,0x06,0x94,0x06,0x02,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37, +0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x61,0x01,0x2e,0x9c,0x03,0xd6,0xfe,0xb9,0x02,0xe4,0x47,0xfd,0xa0,0x01,0x40,0x01,0x20,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3e,0x40,0x22,0x9c,0x03,0x01,0x79,0x03,0x89,0x03,0x02,0xa6,0x06,0x01,0x57,0x06,0x67,0x06,0x02,0x03,0x06, +0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x7d,0x01,0x12, +0x9c,0x02,0x8f,0x02,0xe4,0x47,0xfd,0x71,0x02,0x8f,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x37,0xa3,0x06,0x01,0x02,0x9a,0x02,0xaa,0x02,0x02,0x7b,0x02,0x8b,0x02,0x02,0x68,0x02,0x01,0x5b,0x02,0x01,0x4a,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x91,0x06,0x01,0x85,0x06,0x01, +0x76,0x06,0x01,0x03,0x06,0x02,0x04,0x05,0x08,0x37,0x07,0x01,0x07,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x5d,0x10,0xc4,0x32,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03, +0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x97,0xf8,0x9c,0x01,0x47,0x01,0x48,0x02,0xe4,0x47,0xfd,0x40,0xf9,0x03,0xb9,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x34,0x40,0x1d,0x01,0x04,0x06,0x08,0x03,0x02,0x02,0x03,0x05,0x93,0x04,0xa3,0x04,0x02,0x02,0x80,0x04,0x01,0x73,0x04,0x01,0x64,0x04,0x01, +0x56,0x04,0x01,0x04,0x00,0x00,0x2f,0x32,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x0a,0x67,0x02,0x8f,0x9c,0x05,0x73,0x47,0xfb,0x5b,0x04,0xa5,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x45, +0x40,0x29,0x88,0x03,0x98,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0xd0,0x03,0x02,0x03,0x26,0x03,0x01,0x03,0x04,0x06,0x90,0x05,0xa0,0x05,0x02,0x72,0x05,0x82,0x05,0x02,0x63,0x05,0x01,0x05,0x02,0x02,0x01,0x06,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd, +0xc4,0x31,0x30,0x00,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x67,0x01,0x48,0x9c,0x02,0x8f,0x02,0xe4,0x47,0xfd,0xd5,0x02,0x2b,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x7a,0x40,0x4d,0x29,0x07,0x01,0x89,0x04,0xa9,0x04,0x02,0x75,0x03,0x85,0x03,0x02,0x68,0x03,0x01, +0x45,0x03,0x01,0x36,0x03,0x01,0x2a,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x78,0x04,0x98,0x04,0x02,0x04,0x05,0x07,0xa3,0x06,0x01,0x02,0x90,0x06,0x01,0x81,0x06,0x01,0x74,0x06,0x01,0x06,0x03,0x03,0x01,0x7b,0x02,0x01,0x1c,0x02,0x01,0x0b,0x02,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f, +0x33,0x5d,0x5d,0x5d,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5f,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x47,0x01,0x48,0x9c,0x04,0x6a, +0xfc,0xdd,0x04,0x3c,0x37,0xfc,0xdd,0x03,0x23,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x75,0x40,0x49,0xa4,0x07,0x01,0x95,0x07,0x01,0x89,0x04,0x99,0x04,0xa9,0x04,0x03,0x78,0x04,0x01,0x85,0x02,0x01,0x76,0x02,0x01,0x84,0x03,0x01,0x35,0x03,0x45,0x03,0x75,0x03,0x03,0x03,0x06,0x03,0x16,0x03,0x02, +0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x94,0x06,0xa4,0x06,0x02,0x83,0x06,0x01,0x02,0x70,0x06,0x01,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x5f,0x5d,0x5d,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39, +0x5d,0x5f,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x51,0x01,0x3e,0x9c,0x03,0xd6,0xfd,0x71,0x04,0x3c,0x37,0xfc,0xc5,0x02,0x89,0xb2,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x64,0x40,0x3b, +0x36,0x03,0x46,0x03,0x02,0x17,0x03,0x01,0x04,0x03,0x01,0x91,0x06,0xa1,0x06,0x02,0xa9,0x04,0x01,0x9b,0x04,0x01,0x89,0x04,0x01,0x79,0x02,0x01,0x6c,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x72,0x06,0x82,0x06,0x02,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39, +0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x71,0x01,0x1e,0x9c,0x02,0x8f,0xfe,0xb8,0x04,0x3c,0x37, +0xfc,0x82,0x01,0x0d,0x02,0x71,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x25,0xa6,0x06,0x01,0x94,0x06,0x01,0x76,0x06,0x86,0x06,0x02,0xad,0x03,0x01,0x99,0x03,0x01,0x88,0x03,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f, +0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x96,0xf9,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfc,0x29,0x03,0xd7,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba, +0x00,0x08,0x00,0x55,0x40,0x35,0x74,0x06,0x01,0x56,0x06,0x01,0xa5,0x05,0x01,0x57,0x05,0x01,0xaa,0x03,0x01,0x99,0x03,0x01,0x8a,0x03,0x01,0xab,0x02,0x01,0x9c,0x02,0x01,0x8a,0x02,0x01,0x68,0x02,0x78,0x02,0x02,0x39,0x02,0x49,0x02,0x02,0x01,0x06,0x08,0x0a,0x04,0x03,0x03,0x04,0x02,0x05,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39, +0x39,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0xb4,0xdb,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfb,0xde,0xde,0x05,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a, +0x05,0xba,0x00,0x07,0x00,0x3b,0x40,0x20,0xa2,0x05,0x01,0x95,0x05,0x01,0x82,0x05,0x01,0x77,0x05,0x01,0xa9,0x03,0x01,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x03,0x04,0x06,0x05,0x02,0x02,0x06,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d, +0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x67,0x01,0x48,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfc,0xc9,0x03,0x37,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x7c,0x40,0x50,0x89,0x06,0x01,0x76,0x06,0x01,0xca,0x03,0x01,0x97,0x03,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x35,0x03, +0x45,0x03,0x02,0x28,0x03,0x01,0x15,0x03,0x01,0x07,0x03,0x01,0x47,0x06,0x01,0x9b,0x04,0xab,0x04,0x02,0x89,0x04,0x01,0x7a,0x04,0x01,0x10,0x04,0x01,0x48,0x02,0x01,0x03,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x04,0x05,0x02,0x07,0xa3,0x06,0x01,0x02,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32, +0x5d,0x5f,0x5d,0x2f,0x33,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x76,0x01,0x4d,0x01,0x48,0x9c,0x04,0x10,0xfb,0xf0, +0x05,0x8c,0x2e,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8c,0x40,0x59,0x8a,0x06,0x01,0x76,0x06,0x01,0xa8,0x04,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x58,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x28,0x03,0x01,0x15,0x03,0x01,0x03,0x07,0x03,0x01,0xa3,0x06,0x01,0x02,0x90,0x06,0x01, +0x82,0x06,0x01,0xaa,0x04,0x01,0x03,0x79,0x04,0x89,0x04,0x99,0x04,0x03,0x14,0x04,0x01,0x9a,0x02,0xaa,0x02,0x02,0x22,0x02,0x01,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x09,0x07,0x02,0x02,0x01,0x09,0x70,0x06,0x01,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32,0x5d,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f, +0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x79,0x01,0x55,0x01,0x3d,0x9c,0x03,0xd6,0xfc,0x2a,0x05,0x8c,0x2e, +0xfb,0xc9,0x03,0xb7,0x80,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x7a,0x40,0x4b,0x76,0x06,0x01,0x07,0x06,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x03,0x06,0x03,0x16,0x03,0x02,0xa7,0x07,0x01,0x93,0x06,0xa3,0x06,0x02,0x02,0x82,0x06,0x01,0xab,0x04,0x01,0x9a,0x04,0x01,0x03, +0x02,0x04,0x01,0x02,0x7b,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x07,0x02,0x02,0x00,0x08,0x70,0x06,0x01,0x54,0x06,0x01,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x5d,0x5d,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5f,0x5d,0x5f, +0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x76,0x01,0x69,0x01,0x2c,0x9c,0x02,0x8f,0xfd,0x71,0x05,0x8c,0x2e,0xfb,0x90,0x02,0x6d,0x02,0x03,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x60, +0x40,0x39,0xa6,0x06,0x01,0x94,0x06,0x01,0x97,0x05,0x01,0x36,0x03,0x46,0x03,0x02,0x17,0x03,0x01,0x06,0x03,0x01,0x90,0x06,0xa0,0x06,0x02,0x82,0x06,0x01,0x71,0x06,0x01,0xab,0x04,0x01,0x89,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x07,0x02,0x02,0x00,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f, +0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x79,0x01,0x81,0x01,0x11,0x9c,0x01,0x47,0xfe,0xb9,0x05,0x8c,0x2e,0xfb,0x43, +0x01,0x04,0x03,0xb9,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0x94,0x04,0x01,0x76,0x04,0x86,0x04,0x02,0xa6,0x03,0x01,0x97,0x03,0x01,0xa9,0x01,0x01,0x01,0x04,0x02,0x06,0x07,0x09,0x03,0x02,0x02,0x03,0x06,0x05,0x00,0x00,0x2f,0xcd,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39, +0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x3d,0x79,0x01,0xa1,0xf1,0x9c,0x05,0x8c,0x2e,0xfa,0xe2,0x05,0x1e,0x00,0x01,0x00,0x1a,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x46,0x40,0x29,0x78,0x01,0x01,0x03,0x07,0x01,0x01,0xa4,0x04,0x01,0x83,0x04,0x93,0x04, +0x02,0x02,0xab,0x02,0x01,0x89,0x02,0x99,0x02,0x02,0x04,0x02,0x01,0x01,0x04,0x06,0x08,0x03,0x00,0x02,0x01,0x02,0x02,0x03,0x05,0x04,0x00,0x00,0x2f,0x32,0x2f,0xc4,0x32,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c, +0xfe,0x3c,0x74,0x01,0x50,0x9c,0x05,0x8c,0x2e,0xfb,0xdc,0x04,0x24,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x2c,0x40,0x15,0xab,0x06,0x01,0x58,0x06,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde, +0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb5,0x51,0x01,0x7e,0x02,0x01,0x05,0x1e,0xfe,0xb8,0x6b,0x01,0x79,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4f,0x40,0x2d,0x93,0x07,0x01,0x47,0x07,0x57,0x07,0x02,0xa6,0x05,0x01,0x9b, +0x03,0x01,0x89,0x03,0x01,0x78,0x03,0x01,0xb6,0x02,0xc6,0x02,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x04,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb0,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x03,0xd6,0x01,0x34,0xfe,0xcc,0x6b,0x01,0x79,0xfe,0xcc,0x01,0x34,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4b,0x40,0x28,0xbb,0x07,0xcb,0x07,0x02,0x76,0x07,0x01,0x67,0x07, +0x01,0xa6,0x05,0x01,0x9b,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21, +0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa5,0xfe,0xc0,0x48,0x01,0x9b,0x01,0x48,0x9c,0x02,0x8f,0x02,0x6a,0xfe,0xdd,0x6b,0x01,0x79,0xfd,0xc1,0x02,0x3f,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x54,0x40,0x2e,0x28,0x06,0x01,0x19,0x06,0x01,0x0b,0x06,0x01,0xcf,0x07,0x01, +0xbb,0x07,0x01,0xa6,0x05,0x01,0xa9,0x03,0x01,0x9b,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d, +0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x8e,0xfe,0xda,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x01,0x47,0x03,0x95,0xfe,0xfa,0x6b,0x01,0x79,0xfc,0xd3,0x03,0x2d,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x39,0x88,0x05,0x01,0x29,0x05,0x01, +0x0b,0x05,0x01,0x79,0x02,0x89,0x02,0x02,0x38,0x02,0x48,0x02,0x68,0x02,0x03,0xed,0x06,0x01,0xdb,0x06,0x01,0xcf,0x06,0x01,0xa6,0x04,0x01,0xad,0x02,0x01,0x9b,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x07,0x04,0x03,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33, +0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x05,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x81,0xfe,0xe7,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x04,0xce,0xf8,0x6b,0x01,0x79,0xfb,0xe6,0x04,0x1a,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba, +0x00,0x06,0x00,0x35,0x40,0x1c,0xa6,0x04,0x01,0x9b,0x02,0x01,0x8a,0x02,0x01,0x69,0x02,0x01,0x58,0x02,0x01,0x05,0x02,0x06,0x08,0x03,0x04,0x04,0x03,0x03,0x01,0x02,0x06,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33, +0x02,0x7a,0x9c,0xfe,0xaf,0x4b,0x01,0x9c,0x9c,0x05,0x14,0xfe,0xc2,0x6b,0x01,0x79,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x42,0x40,0x25,0x59,0x07,0x99,0x07,0x02,0x9a,0x06,0x01,0x88,0x06,0x01,0x79,0x06,0x01,0x38,0x06,0x48,0x06,0x02,0x18,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x04,0x05,0x03, +0x03,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x05,0x00,0xfe,0xd6,0x9c,0x01,0x48,0x00,0x01,0x00,0x96, +0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x24,0x38,0x03,0x48,0x03,0x02,0x92,0x07,0xa2,0x07,0x02,0x65,0x07,0x75,0x07,0x02,0x88,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x05,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x10,0xde,0xdd, +0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x02,0x8f,0x01,0x47,0x9c,0xfe,0xd7,0x02,0x71,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x23,0x97,0x06,0xa7,0x06, +0x02,0xa3,0x07,0x01,0x82,0x07,0x92,0x07,0x02,0x73,0x07,0x01,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x05,0x03,0x02,0x03,0x02,0x03,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01, +0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x01,0x47,0x02,0x8f,0x9c,0xfe,0x07,0x03,0x41,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x46,0x40,0x28,0x94,0x05,0xa4,0x05,0x02,0x76,0x05,0x01,0x38,0x01,0x48,0x01,0x02,0x03,0xa4,0x06,0x01,0x93,0x06,0x01,0x02,0x70, +0x06,0x80,0x06,0x02,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5f,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1, +0xee,0x9c,0x03,0xd6,0x9c,0xfd,0x38,0x04,0x10,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x55,0x40,0x31,0x84,0x06,0x94,0x06,0x02,0x47,0x06,0x01,0x47,0x05,0x01,0x08,0x05,0x01,0x89,0x04,0xa9,0x04,0x02,0x9b,0x02,0x01,0x7a,0x02,0x01,0x69,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x06, +0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x2e, +0x01,0x61,0x9c,0x04,0xc4,0xfd,0xcb,0x01,0x9c,0x6f,0xfe,0xc0,0x02,0x60,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x36,0xba,0x07,0x01,0xb8,0x06,0x01,0x84,0x06,0x94,0x06,0xa4,0x06,0x03,0xa2,0x05,0x01,0x93,0x05,0x01,0x86,0x05,0x01,0x47,0x05,0x01,0x08,0x05,0x01,0x59,0x02,0x01,0x06,0x03,0x04, +0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x02,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4,0x32,0x11,0x33,0x01,0x2f,0x32,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01, +0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x51,0x01,0x4a,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0x01,0x9c,0x5e,0xfe,0xb6,0x01,0x47,0x01,0x34,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x37,0x40,0x1b,0xa3,0x05,0x01,0x86,0x05,0x01,0x08,0x05,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04, +0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x83,0x51,0x01,0x4a,0x01,0x48,0x9c,0x02,0x8f,0x01,0x9c,0x62,0xfe, +0x9e,0x02,0x8f,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x51,0x40,0x31,0x72,0x05,0x92,0x05,0x02,0x64,0x05,0x01,0x56,0x05,0x01,0x44,0x05,0x01,0x35,0x05,0x01,0x27,0x05,0x01,0x64,0x04,0x74,0x04,0x02,0x46,0x04,0x01,0x88,0x03,0xa8,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x03,0x05,0x02,0x04,0x03,0x02, +0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x1d,0x54,0x02,0x8f,0x9c,0x01,0x47,0x02,0xe4,0x65,0xfd,0x71,0x03,0xb9,0x00,0x00,0x01, +0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4d,0x40,0x2c,0x54,0x06,0x94,0x06,0xa4,0x06,0x03,0x08,0x04,0x01,0xa9,0x02,0x01,0x9a,0x02,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0x05,0x02,0x04,0x03,0x84,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x02,0x03,0x02,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39, +0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x4b,0x01,0xb7,0xe1,0x9c,0x02,0x8f,0x01,0x9c,0x64,0xfe,0x4e,0xfe,0x55,0x04,0x88,0x00,0x00,0x01,0x00,0x42,0x00,0x00, +0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x4f,0x40,0x30,0x94,0x05,0x01,0x75,0x05,0x01,0x46,0x05,0x56,0x05,0x66,0x05,0x03,0x56,0x04,0x76,0x04,0x02,0x47,0x04,0x01,0x08,0x04,0x01,0x88,0x03,0xa8,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f, +0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x48,0x01,0x54,0x9c,0x02,0x8f,0x01,0x9c,0x5d,0xfe,0xad,0x02,0x85,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76, +0x40,0x4a,0x86,0x06,0x01,0x77,0x06,0x01,0xc9,0x05,0x01,0x75,0x03,0x85,0x03,0xc5,0x03,0x03,0x68,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x28,0x03,0x01,0xa2,0x06,0x01,0x94,0x06,0x01,0xdb,0x05,0xfb,0x05,0x02,0xcc,0x05,0x01,0xc0,0x02,0x01,0x9c,0x02,0x01,0x8b,0x02,0x01,0x78,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04, +0x06,0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03, +0xc1,0x9c,0xfe,0xb9,0xfe,0x51,0x5d,0x01,0x48,0x01,0x51,0x9c,0x04,0x6a,0xfc,0xdd,0x03,0x47,0x3e,0xfd,0x77,0x03,0x77,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3d,0x85,0x06,0x01,0x76,0x06,0x01,0x85,0x03,0x01,0x74,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x29,0x03,0x01,0xa0,0x06,0x01,0x94, +0x06,0x01,0xcb,0x05,0xdb,0x05,0x02,0x8e,0x02,0x01,0x7a,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x07,0x02,0x05,0x04,0x03,0x02,0x04,0x04,0x02,0x03,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00, +0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x51,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0x03,0x47,0x3e,0xfd,0x71,0x02,0x8f,0xee,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5e,0x40,0x37, +0x76,0x06,0x01,0x76,0x03,0x01,0x37,0x03,0x47,0x03,0x02,0xa4,0x06,0x01,0x93,0x06,0x01,0x84,0x06,0x01,0xcb,0x05,0xdb,0x05,0x02,0xa6,0x05,0x01,0x6c,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x07,0x02,0x05,0x04,0x03,0x02,0x04,0x04,0x02,0x03,0x03,0x08,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11, +0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x6b,0x01,0x2e,0x9c,0x02,0x8f,0xfe,0xb8,0x03,0x47,0x3e,0xfd,0x46,0x01,0x41,0x02,0x67, +0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2f,0x40,0x15,0xa6,0x05,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x21,0x23,0x11, +0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x87,0x01,0x12,0x9c,0x01,0x47,0x03,0x4a,0x3b,0xfd,0x17,0x03,0xd7,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x71,0x40,0x46,0xa0,0x06,0x01,0x93,0x06,0x01,0x74,0x06,0x01,0x65,0x06,0x01,0x56,0x06,0x01,0xa1,0x05,0x01, +0x90,0x05,0x01,0x85,0x05,0x01,0x44,0x05,0x01,0x36,0x05,0x01,0xdb,0x04,0x01,0xc9,0x04,0x01,0x96,0x04,0xa6,0x04,0x02,0x77,0x04,0x01,0x94,0x02,0x01,0x88,0x02,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33, +0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0xa1,0xf8,0x9c,0x01,0x47,0x03,0x47,0x3e,0xfc,0xe6,0xf8,0x05,0x00,0x00,0x01,0x00,0x2f, +0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x54,0x40,0x32,0xfa,0x04,0x01,0xd9,0x04,0xe9,0x04,0x02,0x77,0x04,0x01,0xa2,0x05,0x01,0x91,0x05,0x01,0x80,0x05,0x01,0xcb,0x04,0x01,0xa7,0x04,0x01,0x94,0x04,0x01,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0xd0,0x03,0x02,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f, +0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x5d,0x01,0x52,0x9c,0x01,0x47,0x03,0x47,0x42,0xfd,0x77,0x03,0x73,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1, +0x05,0xba,0x00,0x08,0x00,0x62,0x40,0x3c,0x85,0x06,0x01,0x75,0x03,0x85,0x03,0x02,0x58,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x94,0x06,0xa4,0x06,0x02,0x76,0x06,0x86,0x06,0x02,0x9b,0x02,0x01,0x8c,0x02,0x01,0x02,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x01,0x02, +0x08,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x51,0x6a,0x01,0x3a,0x01,0x52,0x9c,0x04,0x10, +0xfb,0xf0,0x05,0x10,0x2a,0xfc,0x49,0x04,0x37,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x72,0x40,0x47,0x85,0x06,0x01,0x76,0x06,0x01,0xd8,0x05,0x01,0x75,0x03,0x85,0x03,0x02,0x58,0x03,0x01,0x34,0x03,0x44,0x03,0x02,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0xa0,0x06,0x01,0x92,0x06,0x01,0x70,0x06, +0x80,0x06,0x02,0xb9,0x05,0x01,0x7f,0x02,0x8f,0x02,0x02,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d, +0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x44,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x05,0x10,0x24,0xfc,0x3a,0x03,0xcc,0x80,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x78,0x40,0x4c,0xa7,0x06, +0x01,0x76,0x06,0x01,0xb8,0x05,0x01,0x8a,0x03,0x01,0x45,0x03,0x75,0x03,0x02,0x36,0x03,0x01,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0xa1,0x06,0x01,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x54,0x06,0x64,0x06,0x02,0x9e,0x02,0xae,0x02,0x02,0x8f,0x02,0x01,0x7d,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05, +0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1, +0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x5a,0x01,0x32,0x9c,0x02,0x8f,0xfd,0x71,0x05,0x10,0x2d,0xfc,0x19,0x02,0x6b,0x01,0xf9,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3e,0x57,0x06,0x01,0x76,0x05,0x01,0x79,0x03,0x89,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x07,0x03,0x17,0x03,0x02,0x92,0x06,0xa2, +0x06,0x02,0x84,0x06,0x01,0x75,0x06,0x01,0x9a,0x04,0xaa,0x04,0x02,0x8a,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30, +0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x7b,0x01,0x11,0x9c,0x01,0x47,0xfe,0xb9,0x05,0x10,0x2d,0xfb,0xc4,0x01,0x00,0x03,0xb9,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x34,0x40,0x1c, +0x86,0x04,0xa6,0x04,0x02,0x77,0x04,0x01,0x98,0x01,0xa8,0x01,0x02,0x01,0x04,0x02,0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x05,0x00,0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x52, +0x6a,0x01,0x9d,0xef,0x9c,0x05,0x10,0x2a,0xfb,0x62,0x05,0x1e,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x2e,0x40,0x18,0x01,0x04,0x06,0x08,0x03,0x04,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0xa3,0x04,0x01,0x02,0x80,0x04,0x90,0x04,0x02,0x04,0x00,0x00,0x2f,0x32,0x5d,0x5f,0x5d,0x2f,0x39,0x2f,0x33,0x01,0x2f, +0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x6a,0x01,0x45,0x9c,0x05,0x10,0x27,0xfc,0x23,0x04,0x60,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x3e,0x40,0x24,0x8b,0x06,0x9b,0x06,0xab,0x06,0x03,0x59,0x06,0x69,0x06,0x02,0xa5,0x04,0x01,0x86, +0x04,0x01,0x76,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb2,0x6a,0x01,0x5e,0x02,0x3d, +0x05,0x1e,0xfd,0x71,0x50,0x02,0xdb,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x74,0x40,0x47,0xc9,0x06,0x01,0x46,0x06,0x01,0x37,0x06,0x01,0xa6,0x04,0x01,0x95,0x04,0x01,0xc9,0x07,0x01,0x94,0x07,0x01,0x47,0x07,0x57,0x07,0x02,0xc6,0x03,0x01,0xb7,0x03,0x01,0xac,0x03,0x01,0x8b,0x03,0x9b,0x03,0x02, +0x7d,0x03,0x01,0x59,0x03,0x69,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x95,0x6a,0x01,0xb8,0x01,0x47,0x9c,0x03,0xd6,0x01,0x23,0xfd,0x99,0x4d,0x02,0xdb,0xfe,0xcc,0x01,0x34,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x78,0x40,0x4c,0xf9,0x06, +0x01,0x76,0x06,0x86,0x06,0xc6,0x06,0x03,0x45,0x06,0x01,0x34,0x06,0x01,0x2a,0x06,0x01,0xc7,0x03,0x01,0x74,0x07,0x94,0x07,0x02,0x66,0x07,0x01,0x45,0x07,0x01,0xa6,0x05,0x01,0x87,0x05,0x01,0x66,0x05,0x01,0x57,0x05,0x01,0x9f,0x03,0xaf,0x03,0x02,0x8b,0x03,0x01,0x7d,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03, +0x06,0x08,0x05,0x04,0x07,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1, +0x9c,0xfe,0xb8,0xfe,0xb3,0x6a,0x01,0xb7,0x01,0x48,0x9c,0x02,0x8f,0x02,0x35,0xfd,0xcb,0x50,0x02,0xdb,0xfd,0xcb,0x02,0x35,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x98,0x40,0x63,0xf5,0x06,0x01,0xc6,0x06,0x01,0x84,0x06,0x01,0x75,0x06,0x01,0x59,0x06,0x01,0x36,0x06,0x46,0x06,0x02,0x2a,0x06,0x01,0xf5, +0x03,0x01,0xc7,0x03,0x01,0x85,0x03,0x01,0x76,0x03,0x01,0xa6,0x07,0x01,0x90,0x07,0x01,0x74,0x07,0x84,0x07,0x02,0x6c,0x07,0x01,0x57,0x07,0x01,0x2b,0x07,0x01,0x94,0x05,0x01,0x66,0x05,0x86,0x05,0x02,0x54,0x05,0x01,0xad,0x03,0x01,0x7b,0x03,0x9b,0x03,0x02,0x69,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06, +0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23, +0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa2,0xfe,0xc9,0x6a,0x01,0xb7,0x01,0x48,0x9c,0x01,0x47,0x03,0x57,0xfd,0xf9,0x48,0x02,0xdb,0xfc,0xdd,0x03,0x23,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76,0x40,0x4b,0xc5,0x05,0x01,0x8b,0x05,0x01,0x7a,0x05,0x01,0x68,0x05,0x01,0x5a,0x05, +0x01,0x36,0x05,0x46,0x05,0x02,0x2a,0x05,0x01,0xc6,0x02,0x01,0x8b,0x02,0x01,0x7a,0x02,0x01,0x59,0x02,0x01,0xc9,0x06,0x01,0x90,0x06,0x01,0x84,0x04,0x94,0x04,0x02,0x9f,0x02,0xaf,0x02,0x02,0x8b,0x02,0x01,0x7e,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x07,0x04,0x03,0x03,0x07,0x06,0x00,0x00,0x2f,0x32, +0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x96,0xfe,0xd5,0x6a,0x01,0xb8,0x01,0x47,0x9c,0x04,0x81,0xfe,0x19, +0x45,0x02,0xdb,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x3d,0x40,0x23,0x87,0x04,0x97,0x04,0x02,0xac,0x02,0x01,0x02,0x8f,0x02,0x9f,0x02,0x02,0x6d,0x02,0x7d,0x02,0x02,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x03,0x01,0x02,0x06,0x01,0x00,0x2f,0x2f,0x33,0x12, +0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb2,0x6a,0x01,0xb8,0x9c,0x04,0xba,0xfd,0xd7,0x4e,0x02,0xdb,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x18,0x69,0x06,0x79,0x06,0x02,0x06, +0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb8,0x54,0x01,0x7e,0x01,0x65, +0x9c,0x03,0xd6,0xfe,0xbc,0x67,0x01,0x79,0x01,0x48,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5b,0x40,0x35,0xc9,0x07,0x01,0x65,0x07,0x75,0x07,0x02,0x47,0x07,0x01,0xb9,0x06,0x01,0x87,0x06,0x01,0x75,0x06,0x01,0x66,0x06,0x01,0xb9,0x05,0x01,0xa9,0x03,0x01,0x9b,0x02,0x01,0x06,0x03,0x05,0x02,0x07,0x09, +0x0b,0x04,0x05,0x05,0x04,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0xc6,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c, +0xfe,0xb8,0xfe,0xb9,0x54,0x01,0x9b,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfe,0xc9,0x5a,0x01,0x8d,0xfe,0xb9,0x02,0x7b,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x53,0x40,0x2f,0xcc,0x07,0x01,0x02,0xbc,0x07,0x01,0xbb,0x06,0x01,0x96,0x06,0x01,0x89,0x03,0x01,0x58,0x03,0x68,0x03,0x78,0x03,0x03,0x03, +0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01, +0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa5,0xfe,0xcc,0x54,0x01,0x9b,0x01,0x48,0x9c,0x01,0x47,0x02,0x8f,0xfe,0xc9,0x5a,0x01,0x9e,0xfd,0x9c,0x03,0x87,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x38,0x54,0x05,0x01,0x27,0x05,0x01,0x19,0x05,0x01,0xeb,0x06,0x01,0xdf,0x06,0x01,0xcd,0x06,0x01, +0xa2,0x06,0x01,0x64,0x06,0x74,0x06,0x94,0x06,0x03,0x1f,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x8f,0xfe,0xe2,0x54,0x01,0x9c,0x01,0x47,0x9c,0x03,0xd6,0xfe,0xc9,0x5a,0x01,0xd2,0xfc,0x85,0x04,0x6a,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x38,0x40,0x1e,0xf6,0x04,0x01,0xc7, +0x04,0x01,0x87,0x03,0xa7,0x03,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x54, +0x01,0x9c,0x9c,0x03,0xd6,0xfe,0xd2,0x51,0x01,0x83,0x01,0x3e,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3a,0x40,0x1f,0x96,0x03,0xa6,0x03,0x02,0xa9,0x02,0x01,0x8b,0x02,0x9b,0x02,0x02,0x7c,0x02,0x01,0x02,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x04,0x06,0x03,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39, +0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x47,0x01,0x48,0x9c,0x04,0x88,0xfe,0x07,0x9c,0x02,0x8f,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3d,0x40,0x20, +0x46,0x07,0x01,0x37,0x07,0x01,0x09,0x07,0x01,0x8b,0x02,0x01,0x09,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21, +0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0x9c,0x01,0x65,0x01,0x2a,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3b,0x40,0x1f,0xa6,0x07,0x01,0x95,0x07,0x01,0x46,0x07,0x01,0x34,0x07,0x01,0x78,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b, +0x04,0x05,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0x01,0x48,0x9c,0xfe,0xd6, +0x03,0xb9,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3e,0x40,0x23,0x74,0x05,0x01,0x89,0x02,0x99,0x02,0xa9,0x02,0x03,0x78,0x02,0x01,0x94,0x06,0xa4,0x06,0x02,0x53,0x06,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde, +0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x02,0x8f,0x9c,0xfe,0x07,0x04,0x88,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x49,0x40,0x28,0xa2,0x06,0x01,0x94,0x06,0x01, +0x46,0x06,0x01,0x92,0x05,0xa2,0x05,0x02,0x74,0x05,0x01,0x65,0x05,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x06,0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x1d,0x01,0x72,0x9c,0x04,0x74,0xfc,0xd3,0x01,0x9c,0x70,0xfe,0xd2,0x03,0x95,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x57,0x40,0x33,0xa0,0x06,0x01,0x92,0x06,0x01,0x44,0x06,0x74,0x06,0x84,0x06,0x03,0x92, +0x05,0xa2,0x05,0x02,0x76,0x05,0x01,0x65,0x05,0x01,0x37,0x05,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x07,0x02,0x03,0x04,0x02,0x02,0x04,0x03,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x2e,0x01,0x61,0x9c,0x03,0xd6,0xfd,0x71,0x01,0x9c,0x70,0xfe,0xd3,0x02,0xba,0xda,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x61,0x40,0x3b,0xa2,0x06,0x01,0x93,0x06,0x01, +0x87,0x06,0x01,0x64,0x06,0x74,0x06,0x02,0x46,0x06,0x01,0xa1,0x05,0x01,0x92,0x05,0x01,0x36,0x05,0x46,0x05,0x66,0x05,0x76,0x05,0x04,0xb7,0x02,0xd7,0x02,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x02,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4, +0x32,0x11,0x33,0x01,0x2f,0x32,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x51,0x01,0x3e,0x9c,0x02,0x8f,0xfe,0xb8,0x01,0x9c,0x70,0xfe,0xaa,0x01,0x42,0x02,0x7b,0x00,0x00,0x01, +0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3e,0x40,0x20,0xa2,0x05,0x01,0x94,0x05,0x01,0x96,0x05,0x01,0x67,0x05,0x77,0x05,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12, +0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x83,0x54,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0x01,0x9c,0x61,0xfe,0x9f,0x03,0xd7,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x42,0x40,0x28,0x98,0x01,0xa8,0x01,0x02,0x36, +0x04,0x46,0x04,0x56,0x04,0x03,0x27,0x04,0x01,0x46,0x03,0x01,0x37,0x03,0x01,0x68,0x02,0x78,0x02,0x88,0x02,0x03,0x01,0x04,0x06,0x08,0x03,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x37,0x01,0x11, +0x33,0x03,0xc1,0x9c,0xfd,0x1d,0x54,0x02,0x8f,0x9c,0x02,0xe3,0x66,0xfd,0x71,0x05,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x3b,0x40,0x21,0x85,0x05,0x01,0x48,0x03,0x58,0x03,0x68,0x03,0x98,0x03,0xa8,0x03,0x05,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02, +0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x54,0x01,0x48,0x9c,0x01,0x47,0x01,0x9c,0x52,0xfe,0xb8,0x03,0xcd,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba, +0x00,0x08,0x00,0x7c,0x40,0x4f,0x8a,0x06,0x01,0x29,0x06,0x79,0x06,0x02,0xf9,0x03,0x01,0xc5,0x03,0x01,0x7b,0x03,0x8b,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x29,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x93,0x06,0xa3,0x06,0x02,0x02,0x81,0x06,0x01,0x70,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x87,0x05,0x01,0x03,0x9b,0x02,0x01,0x20, +0x02,0x01,0x02,0x03,0x06,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x00,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x48,0x70,0x01,0x2c,0x01,0x63,0x9c,0x04,0x10,0xfb,0xf0,0x03,0x6e,0x49,0xfd,0x93,0x04,0x70,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8e,0x40,0x5c,0xc5,0x06,0x01,0x89,0x06,0x01,0x56,0x06,0x76,0x06,0x02,0x29,0x06,0x01, +0xf9,0x03,0x01,0xc5,0x03,0x01,0x8b,0x03,0x01,0x36,0x03,0x46,0x03,0x76,0x03,0x03,0x29,0x03,0x01,0x17,0x03,0x01,0x03,0x07,0x03,0x01,0x77,0x07,0x01,0xa4,0x06,0x01,0x92,0x06,0x01,0x02,0x70,0x06,0x80,0x06,0x02,0x64,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0x86,0x05,0x01,0x8a,0x04,0x01,0x03,0x23,0x02,0x01,0x02,0x06,0x03,0x04, +0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x02,0x04,0x02,0x00,0x09,0x03,0x00,0x00,0x2f,0xc4,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23, +0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x48,0x70,0x01,0x32,0x01,0x5d,0x9c,0x03,0xd6,0xfc,0x2a,0x03,0x6e,0x4c,0xfd,0x9c,0x03,0xee,0x76,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x7c,0x40,0x4f,0x76,0x06,0x86,0x06,0x02,0xf9,0x03,0x01,0x85,0x03,0xc5,0x03,0x02,0x74, +0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x07,0x03,0x17,0x03,0x02,0xa1,0x06,0x01,0x80,0x06,0x90,0x06,0x02,0x74,0x06,0x01,0x55,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0xae,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x7b,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03, +0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x49,0x70,0x01,0x47, +0x01,0x48,0x9c,0x02,0x8f,0xfd,0x71,0x03,0x6e,0x52,0xfd,0x59,0x02,0xad,0x01,0xf4,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5c,0x40,0x36,0x57,0x06,0x01,0x07,0x03,0x17,0x03,0x37,0x03,0x47,0x03,0x04,0xa2,0x06,0x01,0x80,0x06,0x90,0x06,0x02,0x72,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0x89,0x02,0x01, +0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37, +0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x49,0x70,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0xfe,0xb9,0x03,0x6e,0x49,0xfd,0x2e,0x01,0x3a,0x03,0x9b,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0xa5,0x03,0x01,0x84,0x03,0x94,0x03,0x02,0x59,0x01,0x79,0x01,0xa9,0x01,0x03,0x01,0x04,0x02, +0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x05,0x00,0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x49,0x70,0x01,0x91,0xfe,0x9c,0x03,0x6e,0x49,0xfc,0xe5,0x05,0x1e,0x00,0x01,0x00,0x26, +0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x46,0x40,0x2c,0x84,0x03,0x94,0x03,0xa4,0x03,0x03,0x80,0x04,0x90,0x04,0xa0,0x04,0x03,0x72,0x04,0x01,0x64,0x04,0x01,0x46,0x04,0x01,0x64,0x03,0x74,0x03,0x84,0x03,0x03,0x01,0x04,0x06,0x08,0x00,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01, +0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x48,0x70,0x01,0x48,0x9c,0x03,0x6e,0x4f,0xfd,0x57,0x04,0xa6,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x48,0x40,0x2b,0x9d,0x06,0xad,0x06,0x02,0x8b,0x06,0x01, +0x79,0x06,0x01,0x94,0x04,0xa4,0x04,0x02,0x86,0x04,0x01,0x75,0x04,0x01,0x57,0x04,0x01,0x67,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x00,0x02,0x07,0x00,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23, +0x11,0x23,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xef,0xfe,0x60,0x73,0x01,0xba,0x01,0xe4,0x05,0x1e,0xfc,0x29,0x48,0x04,0x2b,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x72,0x40,0x48,0x36,0x06,0x01,0x07,0x06,0x17,0x06,0x02,0x96,0x03,0xa6,0x03,0x02,0x90,0x07,0x01,0x55,0x07,0x01,0x36,0x07,0x01,0xa4,0x05, +0x01,0x92,0x05,0x01,0x74,0x05,0x84,0x05,0x02,0x8f,0x03,0x9f,0x03,0xaf,0x03,0x03,0x7d,0x03,0x01,0x4b,0x03,0x5b,0x03,0x6b,0x03,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f, +0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x25,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xef,0xfe,0x82,0x73,0x01,0xba,0x01,0x48,0x9c,0x03,0xd6,0xe3,0xfc,0x8e,0x41,0x04,0x32,0xfe,0xea,0x01,0x16,0x00,0x00,0x01,0x00,0x23, +0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x74,0x40,0x4a,0x79,0x06,0x89,0x06,0x02,0x44,0x06,0x01,0x33,0x06,0x01,0x07,0x06,0x17,0x06,0x02,0x79,0x03,0x89,0x03,0x02,0x45,0x03,0x01,0x36,0x03,0x01,0x74,0x07,0xa4,0x07,0x02,0x45,0x07,0x55,0x07,0x65,0x07,0x03,0x94,0x05,0xa4,0x05,0x02,0x9f,0x03,0xaf,0x03,0x02,0x89,0x03,0x01, +0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23, +0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcb,0xfe,0xa6,0x73,0x01,0xba,0x01,0x48,0x9c,0x02,0x8f,0x02,0x02,0xfc,0xb6,0x3b,0x04,0x38,0xfd,0xe9,0x02,0x17,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x92,0x40,0x5f,0xf9,0x06,0x01,0xca,0x06,0x01,0x75,0x06,0x85,0x06,0x02,0x36,0x06,0x46, +0x06,0x02,0x07,0x06,0x17,0x06,0x02,0x76,0x03,0x86,0x03,0x02,0x90,0x07,0x01,0x72,0x07,0x82,0x07,0x02,0x2d,0x07,0x01,0x13,0x07,0x01,0x03,0x06,0x07,0x01,0xa7,0x05,0x01,0x95,0x05,0x01,0x86,0x05,0x01,0x77,0x05,0x01,0xac,0x03,0x01,0x02,0x8f,0x03,0x9f,0x03,0x02,0x6d,0x03,0x7d,0x03,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04, +0x05,0x5b,0x03,0x01,0x03,0x06,0x09,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x73,0x01,0xba,0x01,0x48,0x9c,0x01,0x47,0x03,0x05,0xfc,0xfb,0x3e,0x04,0x35,0xfc,0xdd,0x03,0x23,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x72,0x40,0x4b,0x07,0x05,0x01,0xf9,0x05,0x01,0x35,0x05,0x45,0x05, +0x75,0x05,0x85,0x05,0xc5,0x05,0x05,0x28,0x05,0x01,0x07,0x05,0x17,0x05,0x02,0x76,0x02,0x86,0x02,0x02,0x84,0x06,0x01,0x92,0x04,0xa2,0x04,0x02,0x84,0x04,0x01,0x76,0x04,0x01,0xae,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x5d,0x02,0x7d,0x02,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x08,0x04,0x03,0x03,0x08,0x06, +0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xae,0xfe,0xc3,0x73,0x01,0xbb,0x01,0x47,0x9c,0x04,0x37,0xfd,0x10, +0x3e,0x04,0x35,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x3e,0x40,0x22,0x67,0x03,0x01,0xa3,0x04,0x01,0xae,0x02,0x01,0x03,0x8b,0x02,0x9b,0x02,0x02,0x7c,0x02,0x01,0x02,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x03,0x02,0x06,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f, +0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x73,0x01,0xbb,0x9c,0x04,0x74,0xfc,0xd3,0x38,0x04,0x3b,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x61,0x40,0x3a,0x92,0x06,0x01,0x76, +0x06,0x86,0x06,0x02,0x67,0x06,0x01,0xa2,0x05,0x01,0x93,0x05,0x01,0x86,0x05,0x01,0x74,0x05,0x01,0xaf,0x03,0x01,0x99,0x03,0x01,0x8b,0x03,0x01,0x78,0x03,0x01,0x5b,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x05,0x04,0x06,0x03,0x04,0x03,0x04,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33, +0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x67,0x01,0xae,0x01,0x48,0x9c,0x04,0xf6,0xfe,0xe0,0xfd,0x71,0x51,0x02,0xbd,0x01,0x65,0x00,0x00,0x01,0x00,0x2f, +0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x26,0xaf,0x06,0x01,0x9b,0x06,0x01,0x7a,0x06,0x8a,0x06,0x02,0x95,0x04,0x01,0x57,0x03,0x67,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33, +0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xee,0xfe,0x83,0x67,0x01,0xae,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0x4e,0x02,0xdd,0x01,0x48,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3d,0x49,0x06, +0x01,0x38,0x06,0x01,0x07,0x06,0x01,0xa0,0x07,0x01,0x91,0x07,0x01,0x74,0x07,0x01,0x65,0x07,0x01,0x94,0x06,0xa4,0x06,0x02,0x99,0x03,0xa9,0x03,0x02,0x8a,0x03,0x01,0x78,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x07,0x02,0x06,0x03,0x04,0x02,0x03,0x03,0x02,0x04,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39, +0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd2,0xfe,0x9f,0x67,0x01,0xae,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfd,0x71,0x41, +0x03,0x19,0xfe,0xa8,0x02,0x71,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4b,0x40,0x2a,0x84,0x07,0xa4,0x07,0x02,0x76,0x07,0x01,0xa1,0x06,0x01,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00, +0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x67,0x01,0xae,0x01,0x48,0x9c,0x01,0x47,0x02,0x8f,0xfd,0x71,0x32,0x03,0x67,0xfd, +0x5d,0x03,0x7d,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4b,0x40,0x2a,0xa6,0x06,0x01,0x74,0x06,0x84,0x06,0x02,0x93,0x05,0xa3,0x05,0x02,0x02,0x70,0x05,0x80,0x05,0x02,0x64,0x05,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f, +0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa3,0xfe,0xce,0x67,0x01,0xaf,0x01,0x47,0x9c,0x03,0xd6,0xfd,0x71,0x41,0x03,0x9a,0xfc,0x4c,0x04,0x4c,0x00,0x01, +0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x45,0x40,0x28,0x94,0x04,0xa4,0x04,0x02,0x86,0x04,0x01,0x9f,0x02,0xaf,0x02,0x02,0x8d,0x02,0x01,0x6a,0x02,0x7a,0x02,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11, +0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x35,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x67,0x01,0xaf,0x9c,0x03,0xd6,0xfd,0x71,0x44,0x03,0x7d,0xb2,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5f,0x40,0x39,0x92,0x06,0xa2,0x06,0x02,0x84, +0x06,0x01,0x67,0x06,0x77,0x06,0x02,0x46,0x06,0x01,0x37,0x06,0x01,0xa6,0x05,0x01,0x94,0x05,0x01,0x58,0x03,0x01,0xaf,0x02,0x01,0x9d,0x02,0x01,0x8b,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x05,0x04,0x06,0x03,0x04,0x03,0x04,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01, +0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xff,0xfe,0x70,0x4b,0x01,0x7d,0x01,0x5d,0x9c,0x04,0x88,0xfe,0x07,0xfe,0xb8,0x73,0x01,0x40,0x02,0xc0,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1, +0x05,0xba,0x00,0x07,0x00,0x33,0x40,0x19,0xb9,0x05,0x01,0x65,0x05,0x01,0x56,0x05,0x01,0x02,0x05,0x07,0x09,0x03,0x04,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11, +0x33,0x03,0xc1,0x9c,0xfd,0x71,0x4b,0x02,0xda,0x9c,0x03,0xd6,0xfd,0x71,0x6d,0x02,0xdc,0x01,0x2a,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x30,0x40,0x16,0x88,0x06,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f, +0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x4b,0x01,0x7e,0x01,0x5c,0x9c,0x02,0x8f,0xfe,0xb8,0x67,0x01,0x7d,0x02,0x8f,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x53, +0x40,0x2f,0x84,0x07,0x01,0x56,0x07,0x01,0x47,0x07,0x01,0x84,0x06,0x01,0x77,0x06,0x01,0xb9,0x05,0x01,0x99,0x03,0xa9,0x03,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01, +0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x4b,0x01,0x92,0x01,0x48,0x9c,0x01,0x47,0x01,0x48,0xfe,0xb8,0x63,0x01,0x95,0xfe,0xb8,0x03,0xc3,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1, +0x05,0xba,0x00,0x08,0x00,0x4d,0x40,0x2b,0xa2,0x06,0x01,0x94,0x06,0x01,0x85,0x06,0x01,0x57,0x06,0x01,0xa2,0x05,0x01,0x74,0x05,0x94,0x05,0x02,0xa4,0x04,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01, +0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9f,0xfe,0xd2,0x4b,0x01,0x93,0x01,0x47,0x9c,0x02,0x8f,0xfe,0xb8,0x70,0x01,0xa3,0xfd,0x9c,0x04,0xc4,0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07, +0x00,0x3f,0x40,0x23,0xe9,0x05,0x01,0xbb,0x05,0xcb,0x05,0x02,0xb9,0x04,0xe9,0x04,0x02,0x79,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d, +0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x4b,0x01,0x93,0x9c,0x02,0x8f,0xfe,0xb8,0x5a,0x01,0x94,0x02,0x85,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3a,0x40,0x1f,0x38,0x07,0x01,0x9b,0x06,0xab,0x06,0x02,0x9f,0x02,0x01,0x8b,0x02,0x01,0x7c,0x02,0x01,0x06,0x03,0x04, +0x07,0x02,0x08,0x0a,0x04,0x06,0x03,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x47,0x01,0x48,0x9c,0x04,0x10,0xfd,0x37,0x9c,0x03,0xd7,0x00, +0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x28,0x40,0x11,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x06,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x35,0x33, +0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x01,0x51,0x01,0x3e,0x9c,0x03,0xd6,0xfd,0x71,0x9c,0x03,0x39,0x9e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x41,0x40,0x23,0x65,0x07,0x01,0x37,0x07,0x01,0x18,0x07,0x01,0x7a,0x02,0x01,0x48,0x02,0x01,0x19,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x05,0x07, +0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x02,0x8f,0xfe,0xb8,0x9c,0x01,0x66, +0x02,0x71,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3e,0x40,0x23,0x38,0x02,0x48,0x02,0x88,0x02,0x03,0xa2,0x06,0x01,0x93,0x06,0x01,0x65,0x06,0x75,0x06,0x02,0x56,0x06,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde, +0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0x9c,0xfe,0xd7,0x05,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4e,0x40,0x2d,0x68,0x06,0x78,0x06,0x02,0x46, +0x05,0x01,0x28,0x03,0xc8,0x03,0x02,0xa2,0x06,0x01,0x94,0x06,0x01,0x99,0x04,0xa9,0x04,0x02,0xab,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x00,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d, +0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x11,0x01,0x7e,0x9c,0x04,0x10,0xfb,0xf0,0x01,0x9b,0x66,0xfe,0xfc,0x04,0xbd,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x23,0x46,0x05,0x01,0x28,0x03,0xc8,0x03,0x02, +0x99,0x04,0xa9,0x04,0x02,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37, +0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x1d,0x01,0x72,0x9c,0x03,0xd6,0xfc,0x2a,0x01,0x9b,0x66,0xfe,0xe7,0x04,0x5c,0x76,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x48,0x40,0x25,0x47,0x05,0x01,0x28,0x03,0x01,0x93,0x06,0x01,0xa9,0x04,0x01,0x98,0x04,0x01,0x06,0x03,0x04, +0x02,0x07,0x09,0x0b,0x05,0x04,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1, +0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x34,0x01,0x5b,0x9c,0x02,0x8f,0xfd,0x71,0x01,0x9b,0x66,0xfe,0xca,0x02,0xc4,0x02,0x2b,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4d,0x40,0x2a,0xb9,0x07,0x01,0xb8,0x06,0x01,0x77,0x06,0x01,0x46,0x05,0x01,0x99,0x04,0xa9,0x04,0x02,0x8c,0x02,0x01,0x06,0x03,0x04,0x02, +0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c, +0xfe,0xb8,0xfe,0x65,0x54,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0xfe,0xb9,0x01,0x9b,0x66,0xfe,0xb9,0x01,0x47,0x03,0xb9,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x32,0x40,0x18,0xa7,0x04,0x01,0xab,0x02,0x01,0x9a,0x02,0x01,0x01,0x04,0x02,0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x04,0x00, +0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0xfd,0xff,0xfe,0x82,0x54,0x01,0x48,0x01,0x47,0x9c,0x01,0xa4,0x5d,0xfe,0x9b,0x05,0x1e,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06, +0x00,0x41,0x40,0x27,0x84,0x04,0x01,0x65,0x04,0x01,0xa9,0x02,0x01,0x78,0x02,0x98,0x02,0x02,0x59,0x02,0x01,0x28,0x02,0x38,0x02,0x48,0x02,0x03,0x01,0x04,0x06,0x08,0x03,0x00,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x54,0x01,0x48,0x9c,0x01,0x9b,0x66,0xfe,0xb9,0x05,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x3c,0x40,0x24,0xab,0x06,0x01,0x89,0x06,0x99,0x06,0x02,0x58,0x06,0x78,0x06,0x02,0x96,0x04,0xa6,0x04,0x02,0x77,0x04,0x87,0x04, +0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x02,0x07,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x23,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xf1,0xfe,0x62,0x7c,0x01,0xc3,0x01,0xe4,0x05,0x1e,0xfa,0xe2,0x2e,0x05,0x8c,0x00,0x01, +0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x6e,0x40,0x45,0x36,0x06,0x46,0x06,0x02,0x07,0x06,0x17,0x06,0x02,0xa6,0x03,0x01,0x57,0x03,0x01,0x91,0x07,0x01,0x55,0x07,0x01,0x36,0x07,0x46,0x07,0x02,0xa4,0x05,0x01,0x95,0x05,0x01,0x74,0x05,0x84,0x05,0x02,0xaf,0x03,0x01,0x8d,0x03,0x9d,0x03,0x02,0x7b,0x03,0x01,0x06, +0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x25,0x01,0x27, +0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xf1,0xfe,0x80,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x03,0xd6,0xf1,0xfb,0x39,0x2e,0x05,0x8c,0xfe,0xe0,0x01,0x20,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x70,0x40,0x48,0x79,0x06,0x89,0x06,0xc9,0x06,0x03,0x36,0x06,0x46,0x06,0x02,0x07,0x06,0x17,0x06,0x02,0x78, +0x03,0x01,0x41,0x07,0x01,0x32,0x07,0x01,0xa2,0x05,0x01,0x84,0x05,0x94,0x05,0x02,0x76,0x05,0x01,0x9f,0x03,0xaf,0x03,0x02,0x5d,0x03,0x6d,0x03,0x7d,0x03,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x8d,0x03,0x01,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10, +0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd8,0xfe,0x99,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x02,0x8f,0x01,0xed,0xfb,0x84,0x2e,0x05,0x8c,0xfd,0xdf,0x02,0x21, +0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8c,0x40,0x5b,0xf9,0x06,0x01,0xca,0x06,0x01,0x89,0x06,0x01,0x75,0x06,0x01,0x16,0x06,0x36,0x06,0x46,0x06,0x03,0x05,0x06,0x01,0x89,0x03,0x01,0x75,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0xa4,0x07,0x01,0x72,0x07,0x01,0x2b,0x07,0x01,0x14,0x07,0x01,0x07,0x07,0x01, +0x03,0xa5,0x05,0x01,0x86,0x05,0x96,0x05,0x02,0xac,0x03,0x01,0x02,0x8f,0x03,0x9f,0x03,0x02,0x5d,0x03,0x7d,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39, +0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xc7,0xfe,0xaa,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x01,0x47,0x02,0xf8,0xfb,0xc1,0x2e,0x05,0x8c,0xfc,0xd3,0x03,0x2d,0x00,0x01, +0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x80,0x40,0x53,0xf9,0x05,0x01,0x8a,0x05,0xca,0x05,0x02,0x35,0x05,0x45,0x05,0x75,0x05,0x03,0x28,0x05,0x01,0x16,0x05,0x01,0x07,0x05,0x01,0xc9,0x02,0x01,0x88,0x02,0x01,0x76,0x02,0x01,0x94,0x06,0x01,0x47,0x06,0x01,0x15,0x06,0x01,0x03,0xa5,0x04,0x01,0x96,0x04,0x01,0x85, +0x04,0x01,0x9b,0x02,0xab,0x02,0x02,0x8c,0x02,0x01,0x02,0x7f,0x02,0x01,0x5b,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d, +0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x04,0x10,0xfb,0xf0,0x2e,0x05,0x8c,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x36,0x40,0x1f,0x77,0x03, +0x01,0x84,0x04,0x94,0x04,0xa4,0x04,0x03,0x8f,0x02,0x9f,0x02,0xaf,0x02,0x03,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x02,0x06,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x7c,0x01, +0xc4,0x9c,0x04,0x24,0xfb,0xdc,0x2e,0x05,0x8c,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x49,0x40,0x2a,0xa5,0x06,0x01,0x86,0x06,0x96,0x06,0x02,0x57,0x06,0x01,0x6b,0x03,0x7b,0x03,0xab,0x03,0x03,0x59,0x03,0x01,0xab,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x06,0x03,0x03,0x00,0x02, +0x08,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xdb,0xfe,0x4c,0x72,0x01,0xb9,0x01,0x48,0x9c,0x04,0xf6,0xfe,0xe0,0xfc,0x2a,0x32,0x03,0xf5,0x01, +0x93,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x30,0x40,0x18,0x89,0x06,0x99,0x06,0xa9,0x06,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d, +0x21,0x23,0x11,0x23,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xf9,0xfe,0x6a,0x72,0x01,0xb9,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x04,0x40,0x01,0x48,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x57,0x40,0x33,0xb8,0x07,0x01,0x64,0x07,0x74,0x07,0x02,0xa0,0x06,0x01,0x74,0x06,0x84,0x06,0x94, +0x06,0x03,0x66,0x06,0x01,0xa2,0x05,0x01,0x84,0x05,0x94,0x05,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xe2,0xfe,0x8f,0x72,0x01,0xb9,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfc,0x2a,0x32,0x04,0x99,0xfe,0x88,0x02,0x67,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3c,0x79,0x06,0x01,0x46,0x06,0x01, +0x15,0x06,0x35,0x06,0x02,0x03,0x07,0x06,0x01,0xa4,0x07,0x01,0x93,0x06,0xa3,0x06,0x02,0x02,0x80,0x06,0x01,0x74,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x87,0x05,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f, +0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd9,0xfe,0x98,0x72,0x01,0xc3,0x01,0x3e,0x9c,0x01,0x47,0x02,0x8f,0xfc,0x2a,0x32,0x04,0xf8,0xfd,0x45, +0x03,0x4b,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x37,0x46,0x05,0x01,0x34,0x05,0x01,0x15,0x05,0x01,0x03,0xa6,0x06,0x01,0xa2,0x05,0x01,0x93,0x05,0x01,0x02,0x80,0x05,0x01,0x74,0x05,0x01,0xa4,0x04,0x01,0x92,0x04,0x01,0x74,0x04,0x84,0x04,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04, +0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe,0xa5,0x72,0x01, +0xcd,0x01,0x34,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x05,0x1c,0xfc,0x20,0x04,0x4c,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x3e,0x40,0x24,0x67,0x03,0x77,0x03,0x02,0x84,0x04,0x94,0x04,0xa4,0x04,0x03,0x8f,0x02,0x9f,0x02,0xaf,0x02,0x03,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00, +0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x35,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x72,0x01,0xba,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x05,0x26,0x62,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba, +0x00,0x06,0x00,0x39,0x40,0x21,0xa2,0x04,0x01,0x95,0x04,0x01,0xad,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x7b,0x02,0x01,0x59,0x02,0x69,0x02,0x02,0x05,0x02,0x06,0x08,0x03,0x04,0x02,0x06,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11, +0x01,0x27,0x01,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x67,0x02,0xf6,0x9c,0x04,0xa5,0xfb,0x5b,0x4f,0x05,0x6b,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x38,0x96,0x06,0x01,0x87,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x76,0x05,0x86,0x05,0x02,0xad,0x03,0x01,0x8b,0x03,0x9b,0x03,0x02,0x59,0x03,0x69,0x03, +0x79,0x03,0x03,0x89,0x02,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21, +0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x67,0x01,0xae,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0xfd,0x71,0x4f,0x02,0xab,0x01,0xaa,0x01,0x16,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x26,0xab,0x06,0x01,0x9e,0x06,0x01,0x8b,0x06,0x01,0x58,0x06,0x01,0xa5,0x04, +0x01,0x75,0x03,0x01,0x67,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x03,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1, +0x9c,0xfe,0xee,0xfe,0x83,0x67,0x01,0xa4,0x01,0x52,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x02,0xdc,0x02,0x8f,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x67,0x40,0x3d,0x83,0x07,0x01,0x03,0x67,0x07,0x01,0x56,0x07,0x01,0xa3,0x06,0x01,0x02,0x90,0x06,0x01,0x74,0x06,0x84,0x06,0x02,0x56,0x06,0x01,0xa6,0x05,0x01, +0x94,0x05,0x01,0x76,0x05,0x86,0x05,0x02,0x68,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xf0,0xfe,0x81,0x67,0x01,0xd1,0x01,0x25,0x9c,0x01,0x47,0x01,0x48,0xfd,0x71,0x4f,0x03,0x1f,0xfe,0x9d,0x03,0xaf,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x64,0x40,0x3d,0x36,0x05, +0x46,0x05,0x02,0x27,0x02,0x01,0x54,0x06,0x84,0x06,0x02,0x15,0x06,0x01,0x07,0x06,0x01,0x03,0xa3,0x05,0x01,0x02,0x80,0x05,0x90,0x05,0x02,0x72,0x05,0x01,0x24,0x05,0x01,0x84,0x04,0x94,0x04,0x02,0xa9,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32, +0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe,0xa5,0x67,0x01,0xc5,0x01,0x31,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x03,0x54,0xfd,0x85,0x04, +0x92,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x48,0x40,0x29,0xa6,0x03,0x01,0xa3,0x05,0x01,0x02,0x80,0x05,0x90,0x05,0x02,0x74,0x05,0x01,0x66,0x05,0x01,0x9b,0x02,0x01,0x8a,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f, +0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x67,0x01,0xaf,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x03,0x54,0x02,0x17,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x41, +0x40,0x23,0xa2,0x06,0x01,0x96,0x06,0x01,0x57,0x06,0x67,0x06,0x02,0x9a,0x03,0x01,0x88,0x03,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x06,0x03,0x03,0x00,0x02,0x08,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d, +0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xe1,0xfe,0x52,0x48,0x01,0x95,0x01,0x42,0x9c,0x04,0x38,0xfd,0x0f,0xfe,0xb9,0x7b,0x01,0x32,0x04,0x0d,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x47,0x40,0x26,0xa2,0x06,0x01,0x94,0x06,0x01,0x99,0x03,0xa9,0x03,0x02,0x58,0x03,0x68, +0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x35, +0x33,0x03,0xc1,0x9c,0xf5,0xfe,0x66,0x48,0x01,0x8f,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0xfe,0xb9,0x7b,0x01,0x2e,0x03,0x73,0x9e,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x35,0x40,0x1c,0x46,0x05,0x66,0x05,0x02,0xa6,0x04,0x01,0x97,0x04,0x01,0x6b,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x04,0x05,0x02, +0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x48,0x02,0xd7,0x9c,0x02,0x8f,0xfd,0x71,0x7b,0x02,0xce,0x02,0x71,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1, +0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x19,0xa9,0x06,0x01,0x96,0x03,0xa6,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x03,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21, +0x11,0x33,0x03,0xc1,0x9c,0xfe,0xe0,0xfe,0x91,0x48,0x01,0x99,0x01,0x3e,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x68,0x03,0xd7,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4b,0x40,0x2b,0x74,0x06,0x01,0x53,0x06,0x01,0x36,0x06,0x01,0xbb,0x05,0x01,0x74,0x05,0x01,0x87,0x04,0x97,0x04,0xa7,0x04,0x03,0x69,0x02, +0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe, +0xa5,0x48,0x01,0xa7,0x01,0x30,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x7c,0xfe,0xcd,0x04,0xf6,0x00,0x01,0x00,0x4e,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x31,0x40,0x19,0xb9,0x05,0x01,0x97,0x04,0xa7,0x04,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f, +0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x48,0x01,0x90,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x86,0x03,0xb9,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x36,0x40,0x1d,0xa9,0x06,0x01,0x76, +0x03,0x86,0x03,0x02,0xad,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x05,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01, +0x47,0x01,0x48,0x9c,0x03,0xb6,0xfc,0x4a,0x9c,0x05,0x1e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2d,0x40,0x15,0x9b,0x02,0xab,0x02,0x02,0x06,0x03,0x04,0x07,0x02,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x05,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4, +0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xfe,0xfe,0x73,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x9c,0x04,0xd0,0x4e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2f,0x40,0x16,0xaf,0x02,0x01,0x99,0x02,0x01,0x06,0x03,0x04,0x02, +0x07,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x5b,0x01,0x34,0x9c,0x02,0x8f,0xfd,0x71,0x9c,0x03,0x61,0x01, +0xbd,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3b,0x40,0x1f,0x46,0x07,0x01,0x37,0x07,0x01,0x0b,0x07,0x01,0x8b,0x02,0x01,0x09,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4, +0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0xfe,0xb9,0x9c,0x01,0x65,0x03,0xb9,0x00,0x01,0xff,0x54,0x05,0xc2,0x02,0x6c,0x07,0x40,0x00,0x05,0x00,0x2c,0xb1,0x03,0x00,0xb8,0x01,0x35,0x40,0x16, +0x05,0x04,0x01,0x02,0x01,0x12,0x01,0x22,0x01,0x52,0x01,0x04,0x01,0x02,0x18,0x1a,0x1e,0x48,0x00,0x03,0x84,0x02,0x2f,0xe1,0xc6,0x2b,0x39,0x5d,0x11,0x33,0x00,0x2f,0xed,0xc4,0x31,0x30,0x01,0x20,0x03,0x23,0x12,0x21,0x02,0x6c,0xfe,0x44,0xba,0xa2,0xf0,0x02,0x28,0x06,0xc4,0xfe,0xfe,0x01,0x7e,0x00,0x00,0x01,0xff,0x54,0x05,0xc2, +0x02,0x6c,0x07,0x40,0x00,0x05,0x00,0x33,0xb2,0x00,0x80,0x03,0xb8,0x01,0x35,0x40,0x0f,0x04,0x05,0x02,0x0d,0x02,0x1d,0x02,0x2d,0x02,0x5d,0x02,0x04,0x02,0x03,0x01,0xb8,0xff,0xe8,0xb6,0x1a,0x1e,0x48,0x00,0x84,0x01,0x03,0x2f,0xd6,0xe1,0x2b,0x12,0x39,0x5d,0x11,0x33,0x00,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x23,0x02,0x21,0x35, +0x20,0x02,0x6c,0xa1,0xba,0xfe,0x43,0x02,0x28,0x05,0xc2,0x01,0x02,0x7c,0x00,0x01,0xfd,0xa7,0x05,0xc2,0x00,0xc0,0x06,0xfa,0x00,0x0b,0x00,0x22,0xb2,0x06,0x80,0x02,0xbb,0x01,0x35,0x00,0x09,0x00,0x00,0x01,0x35,0xb2,0x0b,0x0b,0x06,0xb9,0x01,0x34,0x00,0x05,0x2f,0xe1,0xc4,0x00,0x2f,0xed,0xd5,0xed,0x1a,0xcd,0x31,0x30,0x13,0x24, +0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x05,0xc0,0xfe,0xb3,0x8d,0x58,0x70,0x77,0x01,0xb4,0x88,0x93,0x01,0x49,0x06,0x16,0x67,0x6b,0x50,0x88,0xb0,0x66,0x00,0x00,0x01,0xff,0x68,0x05,0xc8,0x02,0x32,0x07,0x00,0x00,0x0b,0x00,0x22,0xb2,0x05,0x80,0x02,0xbe,0x01,0x35,0x00,0x09,0x00,0x0b,0x01,0x35,0x00,0x00,0x00,0x06,0x01, +0x34,0xb1,0x05,0x0b,0x2f,0xd4,0xe1,0x00,0x2f,0xfd,0xd5,0xed,0x1a,0xcc,0x31,0x30,0x03,0x04,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x27,0x98,0x01,0x00,0x8a,0x58,0x72,0x76,0x02,0xb6,0x86,0x8e,0xfe,0x06,0x94,0x50,0x6c,0x50,0x86,0xb2,0x4f,0x00,0x03,0x00,0x60,0xfe,0x1e,0x06,0x1c,0x05,0xec,0x00,0x22,0x00,0x2f,0x00,0x37, +0x01,0x5d,0x40,0x2c,0x30,0x31,0x18,0x00,0x22,0x06,0x01,0x37,0x01,0x19,0x31,0x18,0x05,0x22,0x06,0x04,0x1a,0x04,0x30,0x19,0x31,0x18,0x31,0x05,0x00,0x22,0x06,0x22,0x0b,0x01,0x01,0xbb,0x01,0xcb,0x01,0xdb,0x01,0xfb,0x01,0x04,0x37,0x01,0x36,0x04,0xb8,0xff,0xe8,0x40,0x33,0x09,0x13,0x48,0x1a,0x04,0x03,0x1b,0x0a,0x18,0x01,0xea, +0x18,0xfa,0x18,0x02,0x03,0x18,0x18,0x09,0x13,0x48,0x31,0x18,0x32,0x15,0x0d,0x06,0x01,0xed,0x06,0xfd,0x06,0x02,0x02,0x06,0x18,0x09,0x14,0x48,0x22,0x06,0x21,0x08,0x1b,0x96,0x36,0x36,0x38,0x32,0x95,0x21,0xb8,0xff,0xc0,0x40,0x4f,0x17,0x1c,0x48,0x21,0x21,0x38,0x03,0x1c,0x15,0x00,0x13,0x08,0x0b,0x27,0x95,0x11,0x10,0x2d,0x95, +0x0b,0x16,0xb5,0x37,0x01,0x0b,0x37,0x01,0xfb,0x37,0x01,0x37,0x20,0x09,0x16,0x48,0x37,0x01,0x34,0x02,0x5b,0x1a,0x01,0x1a,0x40,0x09,0x1d,0x48,0x1a,0x04,0x1e,0x03,0xa0,0x31,0x01,0x0b,0x31,0x01,0xeb,0x31,0xfb,0x31,0x02,0x44,0x31,0x01,0x31,0x18,0x34,0x16,0xa0,0x22,0x01,0xc3,0x22,0x01,0x22,0x1e,0x23,0x02,0xba,0x01,0x2c,0x00, +0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x23,0x34,0xb8,0x01,0x2c,0x40,0x14,0xa0,0x1e,0xd0,0x1e,0x02,0x1e,0x1e,0x16,0x84,0x15,0x06,0x07,0x15,0x03,0x23,0x23,0x39,0x2a,0x83,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0x17,0x33,0x10,0xf1,0xc0,0x2f,0x5d,0xe1,0x11,0x39,0x2f,0x2b,0x2b,0xe1,0x11, +0x12,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x71,0x5d,0x71,0x5d,0x11,0x12,0x39,0x39,0x2b,0x71,0x11,0x12,0x39,0x39,0x2b,0x5d,0x71,0x5d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x2b,0x5f,0x5d,0x71,0x11,0x12,0x39,0x39,0x2b,0x5f,0x5d,0x71,0x11,0x12,0x39, +0x39,0x2b,0x11,0x39,0x39,0x5d,0x71,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x04,0x38,0x0f,0x02,0x91,0x07,0x27,0x58,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x13,0x67,0x97,0x6f,0x8c,0xa2,0x80,0x70,0xfe,0xe2,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0x01,0x02,0x3c, +0x50,0x92,0x70,0x6a,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x9a,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfa,0x28,0x4e,0x41,0x7b,0x75,0x5c,0x5f,0x7e,0x03,0x7d,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0xfd,0xd2,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x03,0x56,0x05,0xec,0x00,0x15,0x00,0x1d,0x01,0x0f, +0x40,0x37,0x16,0x17,0x0b,0x00,0x15,0x06,0x01,0x1d,0x01,0x0c,0x17,0x0b,0x05,0x15,0x06,0x04,0x0d,0x04,0x16,0x0c,0x17,0x0b,0x17,0x05,0x00,0x15,0x06,0x15,0xbb,0x01,0xcb,0x01,0xdb,0x01,0x03,0x1d,0x01,0x1c,0x0d,0x0b,0x01,0xed,0x0b,0xfd,0x0b,0x02,0x0a,0x0b,0x01,0x0b,0x18,0x0e,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x1b,0x09,0x13, +0x48,0x0d,0x06,0x01,0xed,0x06,0xfd,0x06,0x02,0x04,0x06,0x0b,0x0d,0x04,0x03,0x0e,0x96,0x1c,0x1c,0x1e,0x17,0x18,0x95,0x15,0x14,0xb8,0xff,0xc0,0x40,0x34,0x17,0x1c,0x48,0x14,0x14,0x1e,0x03,0x08,0x00,0x03,0x1c,0xa0,0x17,0x01,0x15,0x17,0x01,0x17,0x0b,0x1a,0x0a,0xa0,0x15,0x01,0xc3,0x15,0x01,0x15,0x06,0x11,0x07,0xb5,0x1d,0x01, +0x1d,0x20,0x09,0x16,0x48,0x1d,0x01,0x1a,0x02,0x0d,0x40,0x09,0x1d,0x48,0x0d,0x04,0x11,0x02,0xba,0x01,0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x07,0x1a,0xb8,0x01,0x2c,0x40,0x0a,0xa0,0x11,0xd0,0x11,0x02,0x11,0x11,0x0a,0x84,0x07,0x2f,0xf1,0xc0,0x2f,0x5d,0xe1,0x12,0x39, +0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x00,0x3f,0x3f,0x11,0x12,0x39,0x2f,0x2b,0x33,0xed,0x32,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x5d,0x71,0x2b,0x2b,0x5d,0x5d,0x71,0x12,0x39,0x39,0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0, +0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x01,0x70,0x0e,0x02,0x91,0x07,0x28,0x58,0xa4,0x12,0x67,0x97,0x72,0x8a,0xa4,0x7f,0x6f,0x1c,0x3b, +0x50,0x91,0x6e,0x6b,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x05,0xd8,0xfa,0x28,0x4e,0x41,0x7b,0x76,0x5b,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x06,0x04,0x04,0x18,0x00,0x24,0x00,0x2c,0x01,0x33,0x40,0x4c,0x25,0x26,0x1a,0x00,0x24,0x06,0x01,0x2c,0x01,0x1b,0x26,0x1a,0x05,0x24,0x06,0x04,0x1c,0x04, +0x25,0x1b,0x26,0x1a,0x26,0x05,0x00,0x24,0x06,0x24,0xb9,0x01,0xc9,0x01,0xd9,0x01,0x03,0x2c,0x01,0x03,0x2b,0x26,0x27,0x1a,0x0e,0x06,0x01,0xae,0x06,0xee,0x06,0xfe,0x06,0x03,0x02,0x24,0x06,0x23,0x0a,0x0d,0x1a,0x01,0xed,0x1a,0xfd,0x1a,0x02,0x0a,0x1a,0x5a,0x1a,0x02,0x1a,0x18,0x10,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x10,0x09, +0x13,0x48,0x04,0x1a,0x1c,0x03,0x03,0x1d,0x96,0x2b,0x2b,0x2d,0x27,0x95,0x23,0xb8,0xff,0xc0,0x40,0x39,0x17,0x1c,0x48,0x23,0x23,0x2d,0x03,0x1c,0x13,0x0a,0x95,0x15,0x10,0x11,0x0f,0x0e,0xa0,0x26,0x01,0x15,0x26,0x01,0x26,0x1a,0x29,0x18,0xa0,0x24,0x01,0xc3,0x24,0x01,0x24,0x06,0x20,0x08,0xb5,0x2c,0x01,0x2c,0x20,0x09,0x16,0x48, +0x2c,0x01,0x29,0x02,0x1c,0x40,0x09,0x1d,0x48,0x1c,0x04,0x20,0x02,0xba,0x01,0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x08,0x29,0xb8,0x01,0x2c,0x40,0x10,0xa0,0x20,0xd0,0x20,0x02,0x20,0x20,0x18,0x84,0x08,0x08,0x2e,0x11,0x0e,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1, +0xc0,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x2b,0x2b,0x5d,0x5d,0x71,0x11,0x12,0x39,0x39,0x5f,0x5d,0x71,0x11, +0x12,0x39,0x11,0x12,0x39,0x39,0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x04,0x1e,0x0e,0x02,0x91,0x07,0x28,0x58,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x12,0x67,0x97,0x70,0x8c,0xa4,0x7e,0x70,0x1c,0x3b,0x51,0x90,0x6e,0x6b,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x02,0x34,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2, +0xd9,0xcd,0xfd,0xa2,0x4e,0x41,0x7b,0x75,0x5c,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0x2b,0xfe,0x1e,0x03,0x8c,0x05,0x2f,0x00,0x1d,0x00,0x25,0x01,0x39,0x40,0x48,0x1e,0x13,0x1f,0x00,0x06,0x1d,0x01,0x25,0x01,0x14,0x13,0x1f,0x05,0x06,0x1d,0x04,0x15,0x04,0x1e,0x14,0x13,0x1f,0x13,0x05,0x00,0x06,0x1d,0x06,0xb9,0x01, +0xc9,0x01,0xd9,0x01,0x03,0x25,0x01,0x03,0x24,0x0e,0x06,0x01,0xee,0x06,0xfe,0x06,0x02,0x02,0x1d,0x06,0x1c,0x08,0x1f,0x20,0x13,0x0d,0x13,0x01,0xed,0x13,0xfd,0x13,0x02,0x0a,0x13,0x01,0x13,0x18,0x0e,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x10,0x09,0x13,0x48,0x04,0x13,0x15,0x03,0x03,0x16,0x96,0x24,0x24,0x26,0x20,0x95,0x1c,0xb8, +0xff,0xc0,0x40,0x3a,0x17,0x1c,0x48,0x1c,0x1c,0x26,0x03,0x1c,0x0d,0x0e,0x11,0x08,0x95,0x0e,0x0b,0x0f,0xb5,0x25,0x01,0x25,0x20,0x09,0x16,0x48,0x25,0x01,0x22,0x02,0x15,0x40,0x09,0x1d,0x48,0x15,0x04,0x19,0x03,0xa0,0x1f,0x01,0x15,0x1f,0x01,0x1f,0x13,0x22,0x12,0xa0,0x1d,0x01,0xc3,0x1d,0x01,0x1d,0x06,0x19,0x07,0x02,0xba,0x01, +0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x07,0x22,0xb8,0x01,0x2c,0x40,0x13,0xa0,0x19,0xd0,0x19,0x02,0x19,0x19,0x12,0x0f,0x0f,0x27,0x0e,0x0a,0x0b,0x0e,0x12,0x84,0x0b,0x07,0x2f,0x33,0xe1,0x32,0x10,0xcd,0x11,0x12,0x39,0x2f,0x10,0xc0,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x2b, +0x2b,0xe1,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x00,0x3f,0x33,0xed,0x32,0x10,0xcd,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x2b,0x2b,0x5d,0x5d,0x71,0x11,0x12,0x39,0x11,0x12,0x39,0x39,0x5f,0x5d,0x71,0x11,0x12,0x39,0x39, +0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x01, +0xa6,0x0e,0x02,0x92,0x08,0x27,0x58,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x13,0x66,0x98,0x6f,0x8d,0xa4,0x80,0x6f,0x1c,0x3b,0x50,0x92,0x6e,0x6c,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x03,0x60,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfc,0xa0,0x4e,0x41,0x7b,0x75,0x5c,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x01,0xff,0xdb,0xfe,0x23, +0x04,0x16,0x04,0x18,0x00,0x19,0x00,0x31,0x40,0x1a,0x18,0x0f,0x0c,0x0a,0x95,0x0f,0x10,0x01,0x1c,0x03,0x14,0x95,0x05,0x16,0x19,0x84,0x01,0x18,0x18,0x1b,0x11,0x84,0x08,0x08,0x1b,0x0c,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x20, +0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x04,0x16,0xa4,0x04,0x76,0xda,0xfe,0xa6,0x80,0x38,0x31,0x46,0x43,0x01,0x04,0xea,0x7a,0xa6,0xa4,0xfe,0x23,0x02,0x87,0xc2,0x01,0xa1,0x01,0x54,0xb1,0x1e,0x8c,0x1c,0xfe,0xd0,0xfe,0xca,0xfe,0xc0,0xbb,0x8f,0x02,0x44,0x00,0x00,0x01, +0xff,0xdb,0xfe,0x1e,0x05,0x27,0x04,0x18,0x00,0x22,0x00,0x38,0x40,0x1e,0x22,0x20,0x95,0x02,0x1c,0x1c,0x0f,0x10,0x0e,0x95,0x13,0x10,0x07,0x18,0x95,0x09,0x16,0x22,0x1d,0x84,0x05,0x1c,0x1c,0x24,0x15,0x84,0x0c,0x0c,0x24,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0xc4,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x3f, +0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x05,0x27,0x40,0x43,0x92,0xa0,0x04,0x76,0xda,0xfe,0xa6,0x80,0x38,0x31,0x46,0x43,0x01,0x04,0xea,0x7a,0xa6,0xa4,0xa0,0x3c,0x35, +0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x3e,0xc2,0x01,0xa1,0x01,0x54,0xb1,0x1e,0x8c,0x1c,0xfe,0xd0,0xfe,0xca,0xfe,0xc0,0xbb,0x8f,0x02,0x44,0xfb,0x72,0xc8,0x1a,0x00,0x01,0x00,0x85,0xfe,0xa0,0x02,0x22,0xff,0xb8,0x00,0x06,0x00,0x19,0x40,0x0d,0x05,0x80,0x30,0x06,0x40,0x06,0x50,0x06,0x03,0x06,0x03,0xc0,0x06,0x2f,0x1a,0xcc,0x00,0x2f, +0x5d,0x1a,0xcd,0x31,0x30,0x17,0x17,0x37,0x33,0x03,0x23,0x03,0xf0,0x64,0x64,0x6a,0xb4,0x34,0xb5,0x48,0xaa,0xaa,0xfe,0xe8,0x01,0x18,0x00,0x01,0x00,0x85,0xfe,0xa0,0x02,0x22,0xff,0xb8,0x00,0x06,0x00,0x19,0x40,0x0d,0x01,0x80,0x30,0x02,0x40,0x02,0x50,0x02,0x03,0x02,0x04,0xc0,0x01,0x2f,0x1a,0xcc,0x00,0x2f,0x5d,0x1a,0xcd,0x31, +0x30,0x13,0x23,0x13,0x33,0x13,0x23,0x27,0xf0,0x6b,0xb5,0x34,0xb4,0x6a,0x64,0xfe,0xa0,0x01,0x18,0xfe,0xe8,0xaa,0x00,0x01,0x00,0xc8,0xfe,0x5e,0x01,0xe0,0xff,0xfb,0x00,0x06,0x00,0x12,0xb7,0x30,0x01,0x01,0x01,0x04,0x05,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xce,0x5d,0x31,0x30,0x01,0x15,0x25,0x35,0x25,0x15,0x07,0x01,0xe0,0xfe, +0xe8,0x01,0x18,0xaa,0xfe,0xc8,0x6a,0xb4,0x34,0xb5,0x6b,0x64,0x00,0x01,0x00,0xc8,0xfe,0x5e,0x01,0xe0,0xff,0xfb,0x00,0x06,0x00,0x12,0xb7,0x30,0x06,0x01,0x06,0x03,0x05,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xce,0x5d,0x31,0x30,0x13,0x37,0x27,0x35,0x05,0x15,0x05,0xc8,0xaa,0xaa,0x01,0x18,0xfe,0xe8,0xfe,0xc8,0x64,0x64,0x6b,0xb5, +0x34,0xb4,0x00,0x02,0x00,0x87,0xfe,0x2d,0x02,0x23,0xff,0xb2,0x00,0x0b,0x00,0x16,0x00,0x2f,0x40,0x1c,0x11,0xc5,0x40,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x8f,0x00,0x04,0x00,0x80,0x0c,0xc5,0x40,0x4f,0x06,0x01,0x06,0x09,0xc4,0x14,0x80,0x0f,0xc4,0x03,0x2f,0xe1,0x1a,0xdc,0xe1,0x00,0x2f,0x5d,0x1a,0xfd,0x1a,0xdc,0x5d,0x1a,0xed,0x31, +0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x52,0x59,0x72,0x76,0x5b,0x59,0x72,0x7b,0x56,0x31,0x3f,0x70,0x31,0x41,0x41,0xfe,0x2d,0x6b,0x54,0x57,0x6f,0x6c,0x54,0x54,0x71,0x01,0x33,0x40,0x30,0x71,0x41,0x30,0x30,0x40,0x00,0xff,0xff,0x00,0x52, +0x01,0x74,0x01,0xd7,0x02,0xbc,0x02,0x07,0x00,0x43,0x00,0x00,0xfc,0xb2,0xff,0xff,0x00,0x28,0x01,0x7f,0x02,0x70,0x02,0xbd,0x00,0x07,0x04,0x6e,0x01,0x4b,0xfc,0xbd,0xff,0xff,0x00,0x28,0x01,0x7f,0x02,0x6f,0x02,0xbd,0x00,0x07,0x00,0xde,0xff,0xe8,0xfc,0xbd,0xff,0xff,0x00,0x23,0x01,0x9e,0x02,0xa4,0x02,0x9e,0x00,0x07,0x00,0xd8, +0x00,0x00,0xfc,0xec,0xff,0xff,0x00,0xad,0x01,0x8e,0x01,0x8d,0x05,0xba,0x00,0x07,0x00,0x1d,0x00,0x3d,0x01,0xa4,0x00,0x01,0x00,0x98,0x04,0x42,0x02,0x12,0x05,0xba,0x00,0x05,0x00,0x1b,0xb1,0x02,0x01,0xb8,0x01,0x33,0xb4,0x04,0x04,0x00,0x00,0x02,0xb9,0x01,0x32,0x00,0x03,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xcd,0x31,0x30,0x01, +0x21,0x11,0x23,0x11,0x21,0x02,0x12,0xfe,0xf0,0x6a,0x01,0x7a,0x05,0x52,0xfe,0xf0,0x01,0x78,0x00,0x01,0x00,0x98,0x04,0x42,0x02,0x12,0x05,0xba,0x00,0x05,0x00,0x19,0xb1,0x04,0x05,0xb8,0x01,0x33,0xb2,0x02,0x04,0x02,0xb8,0x01,0x32,0xb1,0x05,0x00,0x2f,0xdd,0xe1,0x00,0x3f,0xfd,0xcd,0x31,0x30,0x13,0x35,0x21,0x11,0x23,0x11,0x98, +0x01,0x7a,0x6a,0x05,0x52,0x68,0xfe,0x88,0x01,0x10,0x00,0x01,0x00,0x98,0x00,0x00,0x02,0x12,0x01,0x79,0x00,0x05,0x00,0x1a,0xb1,0x04,0x05,0xb8,0x01,0x33,0xb3,0x02,0x00,0x00,0x05,0xb9,0x01,0x32,0x00,0x02,0x2f,0xf1,0xc1,0x2f,0x00,0x2f,0xfd,0xcd,0x31,0x30,0x25,0x15,0x21,0x11,0x33,0x11,0x02,0x12,0xfe,0x86,0x6a,0x68,0x68,0x01, +0x79,0xfe,0xef,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x02,0x12,0x01,0x79,0x00,0x05,0x00,0x18,0xb1,0x02,0x00,0xbb,0x01,0x33,0x00,0x05,0x00,0x03,0x01,0x32,0xb1,0x01,0x05,0x2f,0xdd,0xe1,0x00,0x2f,0xfd,0xc6,0x31,0x30,0x37,0x21,0x11,0x33,0x11,0x21,0x98,0x01,0x10,0x6a,0xfe,0x86,0x68,0x01,0x11,0xfe,0x87,0x00,0x00,0x01,0xff,0xf0, +0xfe,0x5c,0x02,0xba,0xff,0x89,0x00,0x07,0x00,0x31,0xb9,0x00,0x04,0x01,0x33,0x40,0x0d,0x40,0x01,0x80,0x06,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x07,0xb8,0x01,0x32,0xb3,0x06,0x06,0x09,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x5d,0x33,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15, +0x21,0x35,0x33,0x02,0xba,0xfd,0x36,0x69,0x01,0xf8,0x69,0xfe,0x5c,0x01,0x2d,0xc5,0xc5,0x00,0x00,0x01,0xff,0xf2,0xfe,0x5c,0x02,0xba,0xff,0x89,0x00,0x05,0x00,0x27,0xb9,0x00,0x04,0x01,0x33,0x40,0x0e,0x40,0x01,0x80,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x05,0x07,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x10,0xc6,0x00,0x2f, +0x5d,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x21,0x02,0xba,0xfd,0x38,0x68,0x02,0x60,0xfe,0x5c,0x01,0x2d,0xc5,0x00,0x00,0x01,0x00,0x3a,0xfe,0x5c,0x02,0x6e,0x00,0xa0,0x00,0x09,0x00,0x4b,0x40,0x2f,0x4f,0x02,0xcf,0x02,0x02,0x02,0x01,0x40,0x07,0xc0,0x07,0x02,0x07,0x01,0xdb,0x08,0x01,0x08,0x08,0x20,0x09,0x0c, +0x48,0x08,0x05,0x02,0x42,0x4f,0x07,0x01,0x07,0x40,0x16,0x19,0x48,0x07,0x07,0x05,0x0f,0x09,0x1f,0x09,0x02,0x09,0x09,0x0b,0x05,0x2f,0x12,0x39,0x2f,0x5d,0x12,0x39,0x2f,0x2b,0x5d,0xe0,0x12,0x39,0x2b,0x11,0x33,0x00,0x2f,0xed,0xcd,0x5d,0x10,0xcd,0x5d,0x31,0x30,0x05,0x21,0x17,0x23,0x03,0x35,0x13,0x33,0x07,0x21,0x02,0x6e,0xfe, +0x4a,0xa8,0x5e,0xc8,0xc6,0x5e,0xa6,0x01,0xb6,0xb0,0xf4,0x01,0x1b,0x0e,0x01,0x1b,0xf4,0x00,0x00,0x01,0xff,0x74,0x04,0xba,0x00,0x8c,0x06,0x58,0x00,0x06,0x00,0x1a,0x40,0x0b,0x02,0x00,0x06,0xc0,0x03,0x03,0x02,0x00,0x05,0x80,0x06,0x2f,0x1a,0xcd,0x00,0x3f,0x33,0x2f,0x1a,0xce,0x39,0x39,0x31,0x30,0x03,0x37,0x27,0x35,0x05,0x15, +0x05,0x8c,0xaa,0xaa,0x01,0x18,0xfe,0xe8,0x05,0x25,0x65,0x64,0x6a,0xb5,0x33,0xb6,0x00,0x01,0xff,0xa6,0x04,0x98,0x00,0x5a,0x06,0x04,0x00,0x0b,0x00,0x20,0x40,0x0f,0x07,0xcb,0x40,0x06,0xc0,0x0b,0xcb,0x40,0x00,0x00,0x06,0x80,0x09,0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x22, +0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x15,0x14,0x33,0x5a,0x4d,0x67,0x66,0x4e,0x5e,0x5e,0x04,0x98,0x68,0x4e,0x4c,0x6a,0x5e,0x58,0x5a,0x00,0x02,0xfe,0xee,0x04,0xc2,0x01,0x12,0x06,0x68,0x00,0x0c,0x00,0x18,0x00,0x2f,0x40,0x18,0x0a,0xdb,0x04,0x01,0x06,0x06,0x0d,0xc1,0x40,0x13,0x00,0xc4,0x01,0x0e,0x10,0x06,0x16,0x42,0x06,0xc4, +0x07,0x10,0xc0,0x16,0x2f,0xe1,0xd6,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x00,0x18,0x2f,0x1a,0xed,0x32,0x2f,0x33,0xde,0xed,0x31,0x30,0x01,0x23,0x26,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x01,0x12,0x66,0x09,0x61,0x44,0xa0,0x0c,0x64,0x04,0x95,0x75,0x71,0x9b, +0xfe,0xf8,0x29,0x39,0x39,0x29,0x28,0x3a,0x38,0x05,0x6c,0x48,0x54,0x9c,0x72,0x8a,0x8a,0x59,0x39,0x29,0x29,0x38,0x38,0x29,0x28,0x3a,0x00,0x01,0xff,0x30,0xfd,0xfe,0x00,0xd2,0xff,0xa1,0x00,0x0b,0x00,0xa5,0x40,0x17,0x01,0x42,0x05,0x03,0x02,0x03,0x06,0x09,0x0b,0x00,0x03,0x08,0x56,0x06,0x01,0xd4,0x06,0xe4,0x06,0xf4,0x06,0x03, +0x06,0xb8,0xff,0xe0,0x40,0x42,0x09,0x0c,0x48,0x59,0x08,0x01,0xdb,0x08,0xeb,0x08,0xfb,0x08,0x03,0x08,0x20,0x09,0x0c,0x48,0x08,0x06,0x04,0x0a,0x04,0x0f,0x07,0x1f,0x07,0x2f,0x07,0xcf,0x07,0x04,0x07,0x0a,0x42,0x02,0x00,0x0b,0x03,0x03,0x06,0x08,0x09,0x03,0x05,0x29,0x03,0x59,0x03,0x02,0x03,0x20,0x15,0x1a,0x48,0x03,0x20,0x09, +0x0c,0x48,0x26,0x05,0x56,0x05,0x02,0x05,0xb8,0xff,0xe0,0xb3,0x15,0x1a,0x48,0x05,0xb8,0xff,0xe0,0x40,0x09,0x09,0x0c,0x48,0x05,0x03,0x07,0x01,0x04,0x04,0xb8,0xff,0xe0,0xb3,0x17,0x1b,0x48,0x04,0x19,0x2f,0x2b,0x17,0x33,0x2b,0x2b,0x71,0x2b,0x2b,0x71,0x11,0x17,0x33,0x11,0x17,0x33,0xe1,0x00,0x2f,0x5d,0x17,0x33,0x2b,0x5d,0x71, +0x2b,0x5d,0x71,0x11,0x17,0x33,0x11,0x17,0x33,0x18,0xe5,0x31,0x30,0x17,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0xd2,0x85,0x85,0x4c,0x86,0x85,0x4b,0x85,0x85,0x4c,0x86,0x85,0xaa,0x86,0x84,0x4e,0x86,0x86,0x4c,0x85,0x85,0x4d,0x85,0x85,0x00,0xff,0xff,0xff,0x74,0xfe,0x5e,0x00,0x8c,0xff,0xfb,0x00,0x07,0x07,0x46, +0xfe,0xac,0x00,0x00,0xff,0xff,0xff,0x74,0xfe,0x5e,0x00,0x8c,0xff,0xfb,0x00,0x07,0x07,0x47,0xfe,0xac,0x00,0x00,0x00,0x02,0xfe,0xa1,0xfe,0x5e,0x01,0x5f,0xff,0xfb,0x00,0x06,0x00,0x0d,0x00,0x35,0x40,0x1e,0x07,0x09,0x80,0x0f,0x0b,0x1f,0x0b,0x2f,0x0b,0x03,0x0b,0x0e,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x03,0x0d,0xc0, +0x0a,0x0a,0x02,0x06,0x80,0x05,0x2f,0x1a,0xcd,0x32,0x33,0x2f,0x1a,0xcc,0x00,0x2f,0xce,0x5d,0x1a,0x10,0xde,0x5d,0x1a,0xcd,0x32,0x31,0x30,0x01,0x37,0x27,0x35,0x05,0x15,0x05,0x25,0x27,0x07,0x23,0x13,0x33,0x13,0xfe,0xa1,0xaa,0xaa,0x01,0x19,0xfe,0xe7,0x02,0x53,0x64,0x64,0x6a,0xb5,0x33,0xb5,0xfe,0xc8,0x64,0x64,0x6b,0xb5,0x34, +0xb4,0x2e,0xa9,0xa9,0x01,0x18,0xfe,0xe8,0x00,0x01,0xff,0xa6,0x04,0x98,0x00,0x5a,0x06,0x04,0x00,0x0b,0x00,0x22,0x40,0x10,0x05,0xcb,0x40,0x06,0xc0,0x01,0xcb,0x40,0x00,0x00,0x06,0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x23,0x35,0x32, +0x16,0x15,0x14,0x06,0x5a,0x5e,0x5e,0x4d,0x67,0x67,0x04,0x98,0x5c,0x5a,0x58,0x5e,0x69,0x4d,0x4e,0x68,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x07,0x40,0x00,0x09,0x00,0x23,0x40,0x11,0x09,0x05,0x07,0xda,0x40,0x02,0x00,0x84,0x09,0x0e,0x0a,0x05,0x0a,0x42,0x05,0x84,0x04,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x1a, +0xed,0xc4,0x32,0x31,0x30,0x01,0x02,0x21,0x20,0x03,0x33,0x12,0x21,0x20,0x13,0x03,0x1a,0xf0,0xfd,0xd6,0xfd,0xd6,0xf0,0xa2,0xba,0x01,0xbd,0x01,0xbf,0xba,0x07,0x40,0xfe,0x82,0x01,0x7e,0xfe,0xfe,0x01,0x02,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x06,0x58,0x00,0x03,0x00,0x19,0x40,0x0b,0x02,0x91,0x40,0x01,0x00,0x0e,0x04,0x04, +0x01,0x42,0x01,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1a,0xf9,0xcc,0x06,0x34,0x05,0xc2,0x96,0x00,0x01,0xfc,0xe6,0xfe,0x70,0x03,0x1a,0xff,0x04,0x00,0x03,0x00,0x19,0x40,0x0b,0x01,0x91,0x40,0x02,0x03,0x0e,0x04,0x02,0x04,0x42,0x02,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a, +0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1a,0xf9,0xcc,0x06,0x34,0xfe,0x70,0x94,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0xec,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x06,0x00,0xed,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x03,0xb6,0x04,0x00,0x00,0x07,0x00,0x0f,0x00,0x3c, +0x40,0x1e,0x0a,0x07,0x01,0x02,0x08,0x0c,0x01,0x0c,0x0f,0x03,0x04,0x0c,0x04,0x08,0x95,0x02,0x02,0x01,0x07,0x0f,0x04,0x01,0x15,0x0f,0x08,0x05,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0x12,0x39,0x2f,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x5d,0x21,0x23,0x03,0x21, +0x03,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x03,0xb6,0xb4,0x58,0xfe,0x66,0x56,0xb0,0x01,0x75,0xc3,0x3b,0x87,0x02,0x12,0x07,0x05,0x10,0x88,0x01,0x02,0xfe,0xfe,0x04,0x00,0xfd,0x8e,0x01,0x8c,0x06,0x4e,0x1a,0x3a,0xfe,0x74,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0xe4,0x04,0x00,0x00,0x0f,0x00,0x13,0x00,0x5e, +0x40,0x31,0x13,0x03,0x04,0x12,0x04,0x0c,0x95,0x40,0x0b,0x07,0x00,0x0b,0x95,0x1a,0x30,0x10,0x95,0x02,0x02,0x00,0x11,0x08,0x95,0x07,0x0f,0x04,0x0f,0x95,0x00,0x12,0x06,0x06,0x01,0x14,0x08,0x0c,0x00,0x00,0x15,0x10,0x0a,0x0e,0x84,0x01,0x01,0x15,0x14,0x04,0x05,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x11,0x33,0x2f,0xc4, +0xc4,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0xed,0xc4,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x11,0x23,0x03,0x04,0xe4,0xfd,0xb6,0xfe,0xa2,0x82,0xba,0x02,0x23,0x02,0xaa,0xfe,0x6f, +0x01,0x74,0xfe,0x8c,0x01,0xa8,0xfd,0xb6,0x1d,0xfa,0x01,0x02,0xfe,0xfe,0x04,0x00,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0,0x01,0x02,0x01,0xe6,0xfe,0x1a,0x00,0x03,0x00,0x52,0xff,0xe8,0x06,0x50,0x04,0x18,0x00,0x23,0x00,0x2e,0x00,0x35,0x00,0x71,0x40,0x1d,0x16,0x40,0x0b,0x0e,0x48,0x16,0x16,0x14,0x24,0x00,0x11,0x95,0x2f,0x2f,0x0c,0x14, +0x95,0x19,0x10,0x2b,0x95,0x1e,0x10,0x09,0x33,0x95,0x0c,0x16,0x04,0xb8,0xff,0xd0,0x40,0x1a,0x09,0x0c,0x48,0x04,0x02,0x95,0x07,0x16,0x05,0x05,0x21,0x83,0x28,0x28,0x37,0x00,0x09,0x1c,0x2f,0x04,0x24,0x83,0x11,0x11,0x37,0x17,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x17,0x30,0x83,0x0f,0x2f,0xe1,0xc4,0x2b,0x12,0x39,0x2f,0xe1,0x17, +0x39,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x39,0x2f,0x2b,0x31,0x30,0x01,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x02,0x35,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x33,0x32,0x16, +0x15,0x10,0x05,0x25,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x07,0x21,0x16,0x16,0x33,0x32,0x36,0x03,0xcb,0xd7,0xb1,0x9b,0x94,0xc8,0xee,0x42,0x04,0x73,0xf1,0xca,0xde,0x02,0xd3,0x03,0xb0,0x99,0xaf,0x90,0x84,0xe2,0x01,0x0a,0x77,0x04,0x8d,0xf6,0x99,0xaf,0xfe,0x81,0xfe,0xfa,0xcd,0x85,0x8d,0x6a,0x5a,0x78,0xa3,0xa6, +0xfd,0xd5,0x02,0x85,0x77,0x74,0xa6,0x01,0x9c,0xfe,0xd6,0x7a,0xa4,0x60,0xc6,0xc6,0x01,0x05,0xe8,0x54,0xab,0xba,0x72,0x9a,0x62,0xe0,0xe0,0xa1,0x87,0xfe,0xd2,0x16,0x7d,0x0a,0x06,0x52,0x61,0x49,0x59,0xab,0x85,0xc0,0x90,0x9c,0xa4,0x00,0x00,0x03,0x00,0x3e,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x48, +0x40,0x27,0x01,0x12,0x15,0x1c,0x04,0x08,0x95,0x0b,0x0b,0x1d,0x14,0x95,0x0c,0x0f,0x1d,0x95,0x07,0x15,0x12,0x01,0x19,0x83,0x10,0x10,0x03,0x20,0x00,0x00,0x03,0x83,0x20,0x20,0x25,0x15,0x0b,0x1d,0x84,0x09,0x07,0x2f,0xce,0xe1,0x39,0x39,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed, +0x12,0x39,0x2f,0xed,0x17,0x39,0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x33,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x92,0x7e,0x6b,0xc4,0xab,0xfe,0x96,0x68,0x68,0x01,0x5e,0x99,0xb5,0x60,0xa0,0xfd,0xb6,0xac,0x54, +0x64,0xb8,0xac,0xba,0xd7,0x7b,0x64,0x01,0xcb,0x37,0x78,0x7f,0x9d,0x01,0xcb,0x8b,0x01,0xaa,0x8a,0x70,0x75,0x3b,0x01,0x1e,0xfe,0xe2,0x51,0x47,0x86,0xfe,0x57,0xfe,0xc1,0x99,0x4c,0x5a,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x06,0x04,0x00,0x00,0x07, +0x00,0x0e,0x00,0x1f,0x40,0x10,0x08,0x95,0x01,0x0f,0x09,0x95,0x00,0x15,0x04,0x83,0x0c,0x0c,0x10,0x09,0x84,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x33,0x11,0x21,0x20,0x11,0x14,0x00,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0xa6,0x01,0x40,0x02,0x20,0xfe,0xd5,0xfc,0x97,0x8f,0x01,0x89,0xfe,0x7b, +0x04,0x00,0xfe,0x0a,0xeb,0xfe,0xe1,0x03,0x74,0xfd,0x18,0x01,0x7a,0x01,0x6e,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x04,0x10,0x04,0x00,0x00,0x0b,0x00,0x16,0x00,0x3f,0x40,0x22,0x10,0x0d,0x01,0x95,0x40,0x04,0x05,0x00,0x04,0x95,0x1a,0x30,0x0c,0x95,0x05,0x0f,0x11,0x95,0x00,0x15,0x0f,0x0f,0x11,0x08,0x83,0x14,0x14,0x18,0x0d,0x04, +0x11,0x84,0x02,0x00,0x2f,0xc6,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x14,0x00,0x23,0x03,0x11,0x33,0x15,0x23,0x11,0x33,0x20,0x11,0x10,0x21,0xb0,0x74,0x74,0x01,0x40,0x02,0x20,0xfe,0xd6,0xfc, +0x98,0xec,0xec,0x90,0x01,0x88,0xfe,0x7c,0x01,0xba,0x8c,0x01,0xba,0xfe,0x0a,0xea,0xfe,0xe0,0x03,0x74,0xfe,0xd2,0x8c,0xfe,0xd2,0x01,0x7a,0x01,0x6e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xf0,0x04,0x00,0x00,0x0b,0x00,0x32,0x40,0x1b,0x08,0x95,0x40,0x07,0x03,0x00,0x07,0x95,0x1a,0x30,0x04,0x95,0x03,0x0f,0x0b,0x95,0x00,0x15, +0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0x84,0x01,0x2f,0xe1,0x39,0x11,0x33,0x2f,0xc4,0xc4,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x02,0xf0,0xfd,0xb6,0x02,0x33,0xfe,0x6f,0x01,0x74,0xfe,0x8c,0x01,0xa8,0x04,0x00,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0, +0x00,0x01,0x00,0x5a,0xff,0xe8,0x02,0xec,0x04,0x18,0x00,0x22,0x00,0x3e,0x40,0x20,0x01,0x12,0x95,0x13,0x13,0x1e,0x0b,0x1b,0x19,0x95,0x1e,0x10,0x09,0x0b,0x95,0x06,0x16,0x00,0x21,0x12,0x0e,0x83,0x03,0x03,0x21,0x83,0x16,0x16,0x24,0x12,0x08,0x1b,0x2f,0xc6,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xfd, +0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x10,0xbb,0xca,0xa3,0x82,0x68,0x6e,0x7c,0x5a,0x6d,0x8c,0x78,0x50,0x52,0x01,0x21, +0x7e,0x72,0x86,0x74,0x72,0x98,0xb9,0xcf,0x01,0xea,0x04,0x40,0xa8,0x7d,0x99,0x2e,0x9a,0x3e,0x51,0x43,0x4b,0x59,0x8e,0xac,0x4d,0x5d,0x3e,0x96,0x32,0xa0,0x88,0xd0,0x00,0x02,0x00,0x8e,0xfe,0x27,0x01,0x64,0x04,0x00,0x00,0x03,0x00,0x0f,0x00,0x23,0x40,0x12,0x0a,0x63,0x04,0x1b,0x00,0x15,0x03,0x0f,0x0d,0x62,0x07,0x07,0x00,0x84, +0x01,0x01,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x33,0x2f,0xe1,0x00,0x3f,0x3f,0x3f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x48,0xa2,0xa2,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x04,0x00,0xfa,0x27,0x3d,0x2e,0x2e,0x3c,0x3e,0x2c,0x2e,0x3d,0x00,0x00,0x01,0x00,0x14, +0xff,0xec,0x01,0xd3,0x04,0x00,0x00,0x0b,0x00,0x1b,0x40,0x0d,0x0b,0x0f,0x05,0x07,0x95,0x02,0x16,0x09,0x84,0x00,0x00,0x0d,0x04,0x2f,0x11,0x33,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0xd3,0xfe,0xb9,0x40,0x38,0x32,0x3d,0xac,0xa4,0x01,0x72,0xfe,0x7a,0x14, +0x94,0x1d,0x01,0x00,0x02,0x89,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x0d,0x00,0x45,0x40,0x23,0x0b,0x02,0x03,0x0a,0x03,0x08,0x05,0x04,0x09,0x0a,0x09,0x04,0x03,0x09,0x03,0x09,0x03,0x01,0x06,0x0f,0x0c,0x95,0x01,0x15,0x0a,0x0a, +0x00,0x00,0x0f,0x08,0x05,0x0c,0x84,0x03,0x01,0x2f,0xce,0xe1,0x39,0x39,0x11,0x33,0x2f,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x21,0x21,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x21,0x03,0x04,0xfd,0xa2,0x64,0x64,0xa2,0xf0,0xf0, +0x01,0xbc,0x01,0x74,0x38,0x8a,0x3a,0x02,0x00,0xfe,0x5c,0x88,0x8e,0x87,0xfe,0xbd,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0xf8,0x04,0x00,0x02,0x06,0x02,0x13,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00,0x02,0x06,0x02,0x0f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00, +0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x00,0x15,0x00,0x34,0x40,0x1f,0x40,0x0b,0x50,0x0b,0x02,0x0b,0x0b,0x09,0x95,0x0e,0x10,0x4f,0x01,0x5f,0x01,0x6f,0x01,0x03,0x01,0x01,0x03,0x95,0x14,0x16,0x11,0x83,0x06,0x06,0x17,0x0b,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d, +0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x5a,0x6c,0x86,0xa6,0xd2,0xcd,0x9f,0x8e,0x70,0x7c,0x9a,0xe6,0x01,0x16,0xfe,0xcd,0xeb,0x84,0x18,0x9a,0x40,0xda,0xb8,0xb3,0xd7,0x46,0x95,0x3b,0xfe,0xde,0xea,0xef,0xfe,0xcb,0x00,0x02,0x00,0x60,0x00,0x08, +0x04,0x92,0x03,0xf8,0x00,0x0b,0x00,0x17,0x00,0x1f,0x40,0x10,0x0c,0xf4,0x06,0x0f,0x12,0xf4,0x00,0x15,0x09,0xed,0x15,0x15,0x19,0x0f,0xed,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x25,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34, +0x26,0x02,0x79,0xf2,0xfe,0xd9,0x01,0x28,0xf1,0xf2,0x01,0x27,0xfe,0xd7,0xf2,0xb9,0xd2,0xd2,0xbd,0xb7,0xd4,0xd2,0x08,0x01,0x15,0xe5,0xe7,0x01,0x0f,0xfe,0xeb,0xe5,0xe5,0xfe,0xef,0x03,0x48,0xb6,0x9a,0xa2,0xae,0xb5,0x9b,0xa1,0xaf,0x00,0x00,0x01,0x00,0x60,0x00,0xb6,0x04,0x92,0x03,0xf8,0x00,0x15,0x00,0x29,0x40,0x14,0x0b,0x00, +0x00,0x17,0x06,0xf4,0x11,0x0f,0x01,0x14,0xed,0x03,0x03,0x17,0x0e,0x0b,0x0b,0x09,0xed,0x0e,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0xc6,0x00,0x3f,0xed,0x12,0x39,0x2f,0xc4,0x31,0x30,0x25,0x23,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x04,0x50,0x92,0x48,0xd8, +0xb5,0xb3,0xda,0x47,0x91,0x42,0x01,0x2f,0xec,0xec,0x01,0x2b,0xb6,0x7a,0xab,0xab,0xcc,0xd0,0xa7,0xa5,0x80,0x8e,0x9b,0xf0,0x01,0x29,0xfe,0xdf,0xe9,0xae,0x00,0x03,0x00,0x4c,0xff,0xe8,0x04,0xa6,0x04,0x18,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x7d,0x40,0x47,0x15,0x15,0x16,0x14,0x14,0x1b,0x13,0x13,0x12,0x0c,0x0c,0x0d,0x0b,0x00, +0x0b,0x1d,0x1d,0x1e,0x1c,0x1c,0x23,0x09,0x09,0x08,0x02,0x02,0x03,0x0a,0x01,0x0a,0x00,0x01,0x04,0x0a,0x0b,0x14,0x15,0x1c,0x1d,0x04,0x22,0x1a,0x02,0x09,0x0c,0x13,0x04,0x04,0x1a,0xf4,0x0e,0x0f,0x22,0xf4,0x04,0x15,0x01,0x00,0x00,0x11,0x0b,0x0a,0x07,0x11,0xed,0x17,0x17,0x25,0x1f,0xed,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10, +0xc6,0x32,0x10,0xc2,0x2f,0x32,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0xc6,0x32,0x10,0xc6,0x32,0x31,0x30,0x10,0x87,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x25,0x07,0x27,0x06,0x23,0x22,0x00,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x00,0x15,0x14, +0x07,0x01,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x01,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x04,0xa6,0x48,0x8b,0x8b,0xcf,0xf2,0xfe,0xd9,0x71,0x85,0x48,0x8a,0x8c,0xcf,0xf2,0x01,0x27,0x71,0xfd,0x77,0x02,0x18,0x56,0xd2,0xbd,0x82,0x01,0x65,0xfd,0xe8,0x56,0xd2,0xbd,0x81,0x33,0x4b,0x84,0x64,0x01,0x15,0xe5,0xc8,0x82,0x81,0x4b,0x84, +0x64,0xfe,0xeb,0xe5,0xc8,0x82,0x02,0x6d,0xfd,0xfb,0x5a,0x8a,0xa1,0xaf,0xfd,0x8f,0x02,0x05,0x5a,0x8a,0xa2,0xae,0x00,0x03,0x00,0x52,0xff,0xe8,0x07,0x10,0x04,0x18,0x00,0x1c,0x00,0x28,0x00,0x2f,0x00,0x58,0x40,0x29,0x0d,0x40,0x0b,0x0e,0x48,0x0d,0x0d,0x0b,0x08,0x95,0x29,0x29,0x0b,0x03,0x10,0x0b,0x1d,0x95,0x15,0x10,0x2d,0x03, +0x23,0x95,0x1b,0x16,0x18,0x83,0x26,0x26,0x31,0x00,0x12,0x29,0x03,0x20,0x83,0x08,0x08,0x31,0x0d,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x0d,0x2a,0x83,0x06,0x2f,0xe1,0xc4,0x2b,0x12,0x39,0x2f,0xe1,0x17,0x39,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x39,0x39,0x3f,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30, +0x25,0x23,0x06,0x21,0x22,0x02,0x35,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x00,0x15,0x10,0x00,0x23,0x20,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x21,0x16,0x16,0x33,0x32,0x36,0x03,0x72,0x04,0x76,0xfe,0xf6,0xc2,0xda,0x02,0xd3,0x03,0xb0,0x9b,0xad,0x90,0x88, +0xda,0x01,0x10,0x71,0x04,0x83,0x01,0x1a,0xe5,0x01,0x0d,0xfe,0xe6,0xf0,0xfe,0xd9,0x01,0x35,0xa0,0xa9,0xab,0x9c,0x9f,0xb9,0xb9,0xfd,0x72,0xfd,0xd7,0x02,0x84,0x74,0x78,0xa6,0xd3,0xeb,0x01,0x05,0xe4,0x58,0xab,0xba,0x72,0x9a,0x62,0xed,0xed,0xfe,0xe4,0xee,0xfe,0xfc,0xfe,0xde,0x03,0xa6,0xcf,0xbb,0xc2,0xd0,0xd9,0xbf,0xb5,0xcf, +0xfe,0x10,0x8e,0x9e,0xa9,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xea,0x04,0x00,0x00,0x1f,0x00,0x2b,0x00,0x3f,0x40,0x21,0x14,0x00,0x20,0x95,0x0a,0x0a,0x26,0x05,0x10,0x0f,0x26,0x95,0x1a,0x16,0x14,0x00,0x02,0x0d,0x84,0x12,0x12,0x17,0x83,0x29,0x29,0x2d,0x1d,0x07,0x84,0x02,0x23,0x83,0x1d,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39, +0x2f,0xf1,0xc0,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34, +0x26,0x01,0x40,0xa6,0x1c,0xa0,0x1c,0x7e,0x6d,0x6d,0x7e,0x1c,0xa2,0x1a,0xa8,0x68,0x7a,0xfe,0xcb,0xd1,0xf0,0x78,0x01,0x4d,0x82,0x9b,0xa0,0x7d,0x81,0x9c,0x9f,0x02,0x7f,0x4b,0xa4,0x46,0x4c,0x45,0x40,0x56,0x6b,0x6b,0x56,0x40,0x45,0x46,0x4c,0x9e,0x51,0x26,0x9f,0x66,0xa2,0xca,0xc1,0xa3,0x65,0xa5,0x27,0x78,0x67,0x66,0x78,0x7a, +0x68,0x63,0x78,0x00,0x00,0x01,0x00,0x60,0x02,0x00,0x04,0x62,0x04,0x18,0x00,0x0d,0x00,0x1d,0x40,0x0e,0x07,0x00,0x04,0x95,0x0b,0x10,0x00,0x83,0x01,0x01,0x0f,0x07,0x83,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0xc4,0x32,0x31,0x30,0x01,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x00,0x33,0x32,0x00,0x04,0x62,0xa8, +0xb9,0xa1,0x9f,0xb9,0xa8,0x01,0x1f,0xe9,0xe7,0x01,0x13,0x02,0x00,0xbc,0xd2,0xd8,0xb6,0xee,0x01,0x2a,0xfe,0xde,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x62,0x02,0x00,0x00,0x0d,0x00,0x1d,0x40,0x0e,0x0d,0x06,0x0a,0x95,0x03,0x16,0x00,0x83,0x0d,0x0d,0x0f,0x07,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0xd4,0xc4,0x31, +0x30,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x04,0x62,0xfe,0xe1,0xe9,0xe6,0xfe,0xec,0xa8,0xb9,0xa1,0x9f,0xb9,0x02,0x00,0xef,0xfe,0xd7,0x01,0x22,0xf6,0xbc,0xd2,0xd8,0xb6,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x52,0x04,0x00,0x00,0x0a,0x00,0x11,0x00,0x27,0x40,0x14,0x0c,0x95,0x00,0x00,0x01,0x0b, +0x95,0x03,0x0f,0x01,0x15,0x07,0x83,0x0f,0x0f,0x13,0x0c,0x01,0x84,0x02,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x48,0xa2,0x01,0x33,0xb4,0xc5,0xd4,0xb8,0x7e,0x7e,0xe6,0xd9,0x01,0x70, +0xfe,0x90,0x04,0x00,0xa1,0x99,0x98,0xbe,0x02,0x04,0xfe,0x88,0xc2,0xb6,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0xfc,0x04,0x00,0x00,0x12,0x00,0x1a,0x00,0x3b,0x40,0x1e,0x0b,0x02,0x95,0x13,0x13,0x00,0x14,0x95,0x12,0x0f,0x07,0x00,0x15,0x06,0x09,0x0b,0x09,0x08,0x13,0x00,0x84,0x01,0x01,0x1c,0x17,0x84,0x0e,0x0e,0x07,0x08,0x2f,0x33, +0x33,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xc4,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x23,0x11,0x23,0x22,0x06,0x07,0x03,0x23,0x13,0x36,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x15,0x14,0x16,0x33,0x02,0xfc,0xa2,0x58,0x42,0x51,0x23,0x79,0xb5,0x8e,0x34,0x53, +0xe5,0xc6,0xae,0x01,0x3a,0xa2,0x98,0xd0,0x6e,0x5e,0x01,0xa6,0x3f,0x53,0xfe,0xec,0x01,0x35,0x71,0x29,0x04,0x2b,0xd7,0x87,0xa4,0xfe,0x31,0x01,0x43,0x9d,0x4f,0x57,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0xfc,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x3b,0x40,0x1e,0x06,0x13,0x95,0x0f,0x0f,0x12,0x0b,0x11,0x0f,0x12,0x95,0x00,0x15,0x0c, +0x09,0x09,0x06,0x0a,0x0f,0x00,0x84,0x12,0x12,0x1a,0x16,0x84,0x04,0x04,0x0b,0x0a,0x2f,0x33,0x33,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x37,0x35,0x26,0x27,0x03,0x33,0x13,0x16,0x33,0x33,0x11,0x33,0x03,0x11,0x23, +0x22,0x15,0x14,0x33,0x02,0xfc,0xfe,0xae,0xa5,0xb7,0xea,0x53,0x39,0x8e,0xb9,0x75,0x3e,0x78,0x58,0xa2,0xa2,0x9c,0xcc,0xc4,0x98,0x84,0xda,0x31,0x04,0x21,0x7c,0x01,0x38,0xfe,0xec,0x92,0x01,0xa6,0xfc,0x8c,0x01,0x43,0xa8,0x9b,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0x29,0x04,0x00,0x02,0x06,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0x90, +0xff,0xe8,0x03,0xb6,0x04,0x00,0x00,0x0d,0x00,0x1e,0x40,0x0f,0x06,0x0d,0x0f,0x09,0x95,0x02,0x16,0x0d,0x84,0x0c,0x0c,0x0f,0x06,0x84,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x33,0x31,0x30,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x11,0x11,0x33,0x03,0xb6,0xfe,0x64,0xfe,0x76,0xa1,0xf2,0xf1,0xa2, +0x01,0xa6,0xfe,0x42,0x01,0xb2,0x02,0x66,0xfd,0xa2,0xfe,0xd0,0x01,0x2a,0x02,0x64,0x00,0x01,0x00,0x66,0x00,0x5a,0x04,0x38,0x03,0xac,0x00,0x12,0x00,0x2a,0x40,0x14,0x00,0xf4,0x01,0x01,0x13,0x0d,0x08,0xf4,0x09,0x0c,0x04,0x0b,0x0b,0x0f,0xed,0x04,0x04,0x14,0x08,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x33,0x00,0x2f, +0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x37,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x23,0x66,0x02,0x0c,0x01,0x3a,0xad,0x88,0xfd,0xef,0x03,0xb8,0x80,0x9a,0xef,0xd5,0x5a,0xa4,0xf2,0x74,0xa6,0xa2,0xa2,0x04,0x6b,0xc2,0xb0,0xcf,0x00,0x03,0x00,0x3e,0x00,0x5a,0x05,0x6c,0x03,0xac, +0x00,0x12,0x00,0x1e,0x00,0x2a,0x00,0x49,0x40,0x25,0x19,0x63,0x13,0x1f,0x63,0x25,0x13,0x25,0x13,0x09,0x00,0xf4,0x01,0x01,0x13,0x0d,0x08,0xf4,0x09,0x0c,0x04,0x0b,0x0b,0x0f,0xed,0x04,0x04,0x2c,0x08,0x00,0x00,0x2c,0x1c,0x16,0x28,0x62,0x22,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x33,0x00, +0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0xed,0x10,0xed,0x31,0x30,0x25,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x9c,0x02,0x0c, +0x01,0x3a,0xae,0x88,0xfd,0xf0,0x03,0xb8,0x81,0x99,0xed,0xd5,0xfc,0xf6,0x2a,0x38,0x38,0x2a,0x29,0x39,0x38,0x2a,0x2a,0x38,0x38,0x2a,0x29,0x39,0x38,0x5a,0xa4,0xf2,0x73,0xa7,0xa2,0xa2,0x04,0x6b,0xc2,0xb1,0xce,0x02,0x12,0x3b,0x28,0x29,0x3b,0x3b,0x29,0x29,0x3a,0xfe,0x80,0x38,0x28,0x29,0x3b,0x39,0x29,0x28,0x3a,0x00,0x00,0x01, +0x00,0x66,0xff,0x2d,0x04,0x38,0x04,0xd7,0x00,0x1f,0x00,0x3e,0x40,0x1f,0x01,0xf4,0x40,0x00,0x0e,0x09,0x0a,0x12,0x42,0x15,0x11,0xf4,0x12,0x1b,0x09,0xf4,0x0a,0x14,0x14,0x1b,0x15,0x18,0x0d,0x1d,0xed,0x05,0x05,0x21,0x11,0x09,0x00,0x2f,0x32,0x32,0x11,0x39,0x2f,0xf1,0x39,0x39,0x33,0x33,0xc0,0x2f,0x00,0x2f,0xed,0x39,0xd6,0xed, +0x32,0x2b,0x00,0x18,0x10,0xf6,0x1a,0xed,0x31,0x30,0x17,0x35,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x10,0x21,0x66,0x02,0x04,0xab,0x97,0xbc,0x8a,0xfe,0x00,0x02,0x19,0x01,0x2d,0xb4,0x92,0xfe,0x00,0x03,0xb8,0x8c,0xa6,0x76, +0x60,0xd6,0xfe,0x47,0xd3,0xa2,0x6a,0x75,0x6f,0x93,0xa2,0xe6,0x70,0x8d,0xa2,0xa2,0x04,0x5b,0xbc,0x6f,0xab,0x27,0x61,0xd4,0xfe,0x89,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xcb,0x04,0x00,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x02,0x06,0x00,0x5a,0x00,0x00,0xff,0xff,0x00,0x21,0x00,0x00, +0x03,0x70,0x04,0x00,0x02,0x06,0x00,0x5d,0x00,0x00,0x00,0x01,0x00,0x50,0xff,0xe8,0x02,0xf8,0x04,0x00,0x00,0x17,0x00,0x3d,0x40,0x1f,0x0a,0x08,0x52,0x10,0x10,0x03,0x0f,0x0c,0x95,0x0d,0x0f,0x01,0x03,0x95,0x16,0x16,0x10,0x0a,0x0a,0x06,0x0c,0x0b,0x0f,0x0f,0x13,0x84,0x06,0x06,0x19,0x0c,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0, +0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x50,0x6a,0x92,0x7a,0x8e,0xfe,0xdd,0x3d,0x01,0x06,0xfe,0x56,0x02,0x8b,0xfe,0xed,0x8e,0xa2,0xf0, +0xc6,0x89,0x18,0x96,0x3c,0x66,0x59,0xc1,0x3d,0x01,0x45,0x8c,0x46,0xfe,0xac,0x13,0xa4,0x7c,0x92,0xb9,0x00,0x01,0x00,0x50,0xff,0xe8,0x02,0xfa,0x04,0x18,0x00,0x25,0x00,0x42,0x40,0x22,0x14,0x13,0x07,0x01,0x00,0x0c,0x1f,0x1c,0x1a,0x95,0x1f,0x10,0x09,0x07,0x95,0x0c,0x16,0x00,0x83,0x14,0x14,0x18,0x0f,0x09,0x09,0x22,0x83,0x18, +0x18,0x27,0x1c,0x05,0x83,0x0f,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x10,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x01,0x15,0x06,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x37,0x35,0x36,0x37,0x36,0x35,0x34,0x23,0x22, +0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x01,0xf8,0x2e,0x56,0x7e,0xe5,0x9b,0x76,0x7c,0xa5,0xb3,0xc8,0x9e,0x3a,0x2a,0x2e,0x55,0x7f,0xe6,0x9a,0x76,0x7c,0xa5,0xb3,0xc8,0x9e,0x3a,0x02,0x0a,0x54,0x1e,0x28,0x3a,0x4a,0x7a,0x4c,0x97,0x3f,0x8c,0x72,0x90,0x4a,0x1c,0x1a,0x54,0x1e,0x28,0x3a,0x4a,0x7a,0x4c,0x97,0x3f,0x8c, +0x72,0x90,0x4a,0x1c,0x00,0x01,0x00,0x14,0xff,0xe8,0x04,0x25,0x04,0x18,0x00,0x1b,0x00,0x3b,0x40,0x1e,0x12,0x10,0x09,0x1b,0x0b,0x06,0x19,0x95,0x02,0x16,0x04,0x0d,0x17,0x03,0x0f,0x1b,0x0e,0x15,0x0f,0x40,0x0f,0x09,0x42,0x09,0x09,0x1c,0x0f,0x0f,0x1d,0x1c,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x1a,0x18,0x10,0xdd,0xe2, +0x12,0x17,0x39,0x00,0x3f,0xfd,0x39,0x39,0xd6,0xc4,0x3f,0x31,0x30,0x25,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x04,0x25,0x61,0x82,0x99,0x8d,0x8c,0x94,0x81,0x67,0x6e,0x74,0x60,0x62,0xe9,0xb6,0x9c,0x9b,0xae,0xe7,0x63,0x64,0x71, +0x6a,0x38,0x50,0x7a,0x7a,0x4d,0xa8,0x6b,0x54,0xe7,0xf5,0xa4,0xd2,0xcb,0xa5,0xfc,0xe6,0x54,0x67,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xdf,0x04,0x00,0x02,0x06,0x02,0x0a,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x03,0xb6,0x04,0x00,0x00,0x0b,0x00,0x17,0x40,0x0a,0x04,0x0b,0x0f,0x00,0x09,0x15,0x00,0x00,0x0d,0x09,0x2f,0x11, +0x33,0x2f,0x00,0x3f,0xc4,0x3f,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x03,0xb6,0xb2,0xfe,0xf2,0x02,0x12,0x05,0x05,0x10,0xfe,0xf2,0xb0,0x01,0x79,0xc1,0x03,0x14,0x06,0x4e,0x1b,0x39,0xfc,0xec,0x04,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x02,0x16,0x00,0x00, +0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0x52,0x04,0x00,0x02,0x06,0x07,0x7a,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x04,0x5a,0x04,0x00,0x00,0x13,0x00,0x4c,0x40,0x29,0x0c,0x05,0x0f,0x96,0x40,0x02,0x02,0x03,0x0e,0x09,0x13,0x0f,0x03,0x15,0x11,0x84,0x00,0x0e,0x03,0x0a,0x84,0x07,0x04,0x07,0x42,0x07,0x07,0x14,0x0f,0x0c,0x03,0x84, +0x4f,0x04,0x5f,0x04,0x02,0x04,0x04,0x15,0x14,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x39,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x10,0x05,0x11,0x23,0x11,0x24,0x11,0x11,0x33,0x11,0x14,0x05,0x11,0x33,0x11,0x24,0x35,0x11,0x33,0x04,0x5a, +0xfe,0x54,0xa2,0xfe,0x54,0xa2,0x01,0x0a,0xa2,0x01,0x0a,0xa2,0x02,0x92,0xfe,0xa0,0x18,0xfe,0xe6,0x01,0x1a,0x12,0x01,0x60,0x01,0x74,0xfe,0x92,0xee,0x08,0x02,0x64,0xfd,0x9c,0x0c,0xea,0x01,0x6e,0x00,0x01,0x00,0x0a,0xff,0xf4,0x03,0xd7,0x04,0x00,0x00,0x10,0x00,0x2a,0x40,0x15,0x02,0x95,0x10,0x0f,0x09,0x0b,0x95,0x06,0x01,0x00, +0x15,0x03,0x0f,0x0f,0x09,0x00,0x84,0x01,0x01,0x12,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x00,0x3f,0x10,0xd4,0xfd,0xc6,0x3f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x11,0x21,0x03,0xd7,0xa2,0xfe,0x67,0x0d,0x94,0xa1,0x26,0x2a,0x20,0x1e,0x41,0x48,0x2b,0x02,0xdb, +0x03,0x74,0xfd,0xb0,0xfe,0xd0,0x0c,0x8c,0x0d,0x7e,0x01,0x90,0x01,0x73,0x00,0x02,0x00,0x0a,0x02,0x9a,0x02,0xd7,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x4e,0x40,0x10,0x02,0x08,0x09,0x0a,0x0b,0x0c,0x01,0x0c,0x0d,0x0e,0x0f,0x03,0x04,0x0c,0x04,0x03,0xb8,0x01,0x0e,0xb2,0x0f,0x0f,0x06,0xbc,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x05, +0x01,0x0a,0xb6,0x0f,0x08,0x05,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x00,0x3f,0x3f,0x3f,0x39,0x2f,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x05,0xc0,0x0e,0xc0,0xc0,0x05,0xc0,0xc0,0x01,0x23,0x27,0x21,0x07,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x02,0xd7,0x8f,0x44, +0xfe,0xd5,0x3f,0x90,0x01,0x1d,0x97,0x24,0x63,0x03,0x0a,0x04,0x05,0x09,0x64,0x02,0x9a,0xbe,0xbe,0x03,0x00,0xfe,0x2e,0x01,0x22,0x0a,0x31,0x22,0x19,0xfe,0xde,0x00,0x00,0x02,0xff,0xf6,0x02,0x9a,0x03,0x9e,0x05,0x9a,0x00,0x0f,0x00,0x13,0x00,0x76,0xb5,0x13,0x03,0x04,0x12,0x04,0x0d,0xb8,0x01,0x0e,0xb4,0x40,0x0a,0x06,0x01,0x0a, +0xb8,0x01,0x0e,0xb2,0xff,0x30,0x03,0xb8,0x01,0x0e,0xb3,0x13,0x13,0x06,0x0e,0xb8,0x01,0x0e,0xb2,0x01,0x01,0x05,0xbe,0x01,0x0a,0x00,0x09,0x01,0x0e,0x00,0x12,0x01,0x0e,0x00,0x06,0x01,0x06,0x40,0x09,0x03,0x04,0x12,0x13,0x04,0x05,0x10,0x0a,0x0e,0xb8,0x01,0x0c,0x40,0x09,0x01,0x01,0x05,0x08,0x0c,0x00,0x00,0x15,0x05,0x2f,0x12, +0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x17,0x39,0x00,0x3f,0xed,0xed,0x3f,0x33,0x10,0xed,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x01,0x21,0x35,0x21,0x07,0x23,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x25,0x11,0x23,0x03,0x03,0x9e,0xfe,0x50,0xff,0x00, +0x60,0x98,0x01,0xa2,0x01,0xf6,0xfe,0xe2,0x01,0x09,0xfe,0xf7,0x01,0x2e,0xfe,0x50,0x0f,0xb8,0x02,0x9a,0xbe,0xbe,0x03,0x00,0x71,0xd9,0x6c,0xda,0xbe,0x01,0x63,0xfe,0x9d,0x00,0x00,0x03,0x00,0x7b,0x02,0x9a,0x02,0x89,0x05,0x9a,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0x57,0xb1,0x07,0x14,0xb8,0x01,0x0e,0xb4,0x40,0x0e,0x01,0x00,0x0e, +0xb8,0x01,0x0e,0xb2,0x32,0x30,0x15,0xbe,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x0d,0x01,0x0e,0x00,0x01,0x01,0x06,0xb3,0x06,0x09,0x0e,0x11,0xb8,0x01,0x0c,0xb2,0x04,0x04,0x09,0xb8,0x01,0x0c,0xb4,0x18,0x18,0x1c,0x0e,0x15,0xb9,0x01,0x0c,0x00,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xed, +0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x13,0x11,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x7b,0xe7,0x01,0x06,0x89,0xaa,0x99,0x84,0x6e,0x5a,0x8a,0x8c,0x58,0x6e,0x96,0xa0,0x02,0x9a,0x03,0x00,0xbf,0x7d,0x29,0x02,0x19,0x9f, +0x68,0x79,0x02,0x8f,0xc9,0x66,0x63,0xfe,0xc7,0xe6,0x71,0x75,0x00,0x03,0x00,0x23,0x02,0x9a,0x02,0xb2,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x20,0x00,0x64,0xb5,0x01,0x11,0x14,0x1a,0x04,0x08,0xb8,0x01,0x0e,0xb4,0x40,0x0b,0x0c,0x07,0x0b,0xb8,0x01,0x0e,0xb2,0x32,0x30,0x1b,0xbe,0x01,0x0e,0x00,0x07,0x01,0x0a,0x00,0x13,0x01,0x0e, +0x00,0x0c,0x01,0x06,0xb4,0x11,0x01,0x03,0x14,0x17,0xb8,0x01,0x0c,0xb5,0x0f,0x0f,0x03,0x00,0x00,0x03,0xb8,0x01,0x0c,0xb7,0x1e,0x1e,0x22,0x14,0x0b,0x1b,0x09,0x07,0x2f,0xc6,0xc1,0x39,0x39,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x17,0x39, +0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x20,0x15,0x14,0x07,0x33,0x25,0x15,0x33,0x32,0x35,0x34,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0xb2,0x6a,0x56,0x97,0x86,0xf1,0x6d,0x6d,0xe7,0x01,0x06,0x48,0x7d,0xfe,0x60,0x5a,0x8a,0x8c,0x58,0x6f,0x95,0x9f,0x03,0xf0,0x28,0x58,0x62,0x74, +0x01,0x56,0x70,0x01,0x3a,0xbf,0x53,0x28,0xc9,0xc9,0x66,0x63,0xfe,0xc7,0xe6,0x6d,0x79,0x00,0x00,0x02,0x00,0x7b,0x02,0x9a,0x03,0x08,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x2d,0x41,0x0a,0x00,0x09,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x0e,0x00,0x01,0x01,0x06,0x00,0x04,0x01,0x0c,0xb3,0x0d,0x0d,0x11,0x09,0xb9,0x01,0x0c, +0x00,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x11,0x33,0x20,0x11,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x7b,0xf1,0x01,0x9c,0xe2,0xc0,0x68,0x64,0x89,0x96,0xfe,0xe7,0x02,0x9a,0x03,0x00,0xfe,0x87,0xb1,0xd6,0x02,0x8f,0xfd,0xe1,0x90,0x84,0x01,0x0b,0x00,0x00,0x01,0x00,0x7b, +0x02,0x9a,0x02,0x2b,0x05,0x9a,0x00,0x0b,0x00,0x43,0xb9,0x00,0x09,0x01,0x0e,0xb4,0x40,0x06,0x02,0x01,0x06,0xb8,0x01,0x0e,0xb2,0xff,0x30,0x0a,0xbe,0x01,0x0e,0x00,0x01,0x01,0x0a,0x00,0x05,0x01,0x0e,0x00,0x02,0x01,0x06,0xb6,0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xc4,0xc4, +0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2b,0xfe,0x50,0x01,0x9f,0xfe,0xe4,0x01,0x08,0xfe,0xf8,0x01,0x2d,0x02,0x9a,0x03,0x00,0x71,0xd7,0x70,0xd8,0x00,0x00,0x01,0x00,0x48,0x02,0x9a,0x01,0xf8,0x05,0x9a,0x00,0x0b,0x00,0x43,0xb9,0x00, +0x04,0x01,0x0e,0xb4,0x40,0x07,0x0b,0x00,0x07,0xb8,0x01,0x0e,0xb2,0xff,0x30,0x03,0x41,0x09,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x0e,0x00,0x0b,0x01,0x06,0x00,0x00,0x01,0x0c,0xb6,0x07,0x03,0x03,0x0d,0x09,0x05,0x01,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31, +0x30,0x01,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0xf8,0xfe,0x50,0x01,0x2c,0xfe,0xf8,0x01,0x08,0xfe,0xe4,0x01,0xa0,0x02,0x9a,0x70,0xd8,0x70,0xd7,0x71,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0xcb,0x05,0xaa,0x00,0x19,0x00,0x50,0xb9,0x00,0x17,0x01,0x0e,0xb5,0x18,0x18,0x08,0x15,0x00,0x13,0xba,0x01,0x0e,0x00, +0x02,0x01,0x0b,0xb4,0xaf,0x0b,0x01,0x0b,0x0d,0xba,0x01,0x0e,0x00,0x08,0x01,0x07,0xb6,0x17,0x17,0x16,0x10,0x0b,0x0b,0x19,0xb8,0x01,0x0c,0xb3,0x16,0x16,0x1b,0x10,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xed,0x32,0x32,0x11,0x39,0x2f,0xed,0x31,0x30, +0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x35,0x23,0x35,0x21,0x02,0xcb,0x75,0x96,0xb2,0xd0,0xe7,0xb8,0x77,0x5e,0x62,0x75,0x7a,0x9d,0x8d,0x77,0x49,0x37,0x9c,0x01,0x1f,0x02,0xcb,0x42,0xd0,0xb5,0xb7,0xe5,0x27,0x81,0x38,0xa2,0x82,0x85,0x97,0x1c,0xb2,0x72, +0x00,0x01,0x00,0x7b,0x02,0x9a,0x02,0xea,0x05,0x9a,0x00,0x0b,0x00,0x49,0xb9,0x00,0x03,0x01,0x0e,0xb4,0x40,0x08,0x06,0x05,0x08,0xb8,0x01,0x0e,0xb5,0x32,0x30,0x0b,0x00,0x06,0x05,0xba,0x01,0x0a,0x00,0x06,0x01,0x06,0xb3,0x09,0x08,0x04,0x00,0xbb,0x01,0x0c,0x00,0x01,0x00,0x04,0x01,0x0c,0xb4,0x05,0x01,0x01,0x0d,0x05,0x2f,0x12, +0x39,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x02,0xea,0x84,0xfe,0x98,0x83,0x83,0x01,0x68,0x84,0x02,0x9a,0x01,0x4e,0xfe,0xb2,0x03,0x00,0xfe,0xbe,0x01,0x42,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a, +0x00,0xfe,0x05,0x9a,0x00,0x03,0x00,0x16,0xbe,0x00,0x01,0x01,0x0a,0x00,0x02,0x01,0x06,0x00,0x00,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x13,0x23,0x11,0x33,0xfe,0x83,0x83,0x02,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x0a,0x02,0x87,0x01,0x5e,0x05,0x9a,0x00,0x0c,0x00,0x23,0xb1,0x06,0x08,0xbe,0x01,0x0e,0x00,0x03, +0x01,0x0b,0x00,0x0b,0x01,0x06,0x00,0x0c,0x01,0x0c,0xb3,0x0b,0x0b,0x0e,0x06,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x01,0x5e,0x82,0x74,0x35,0x29,0x2a,0x2c,0x7b,0x83,0x03,0xaa,0x8a,0x99,0x15,0x78,0x1c,0xb6,0x01,0xec,0x00,0x01,0x00,0x7b, +0x02,0x9a,0x02,0xc0,0x05,0x9a,0x00,0x10,0x00,0x21,0xbb,0x00,0x07,0x01,0x0a,0x00,0x08,0x01,0x06,0xb5,0x0f,0x00,0x12,0x10,0x0a,0x05,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xe1,0x32,0x32,0x10,0xd6,0xc6,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x03,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x13,0x33,0x01,0x02,0xc0,0xa8,0xe9, +0x1f,0x0e,0x04,0x83,0x83,0x04,0x10,0x1d,0xe1,0x9c,0xfe,0xd7,0x02,0x9a,0x01,0x31,0x28,0x1d,0xfe,0x8a,0x03,0x00,0xfe,0x99,0x19,0x26,0x01,0x28,0xfe,0x8d,0x00,0x01,0x00,0x7b,0x02,0x9a,0x02,0x25,0x05,0x9a,0x00,0x05,0x00,0x22,0xbd,0x00,0x04,0x01,0x0e,0x00,0x01,0x01,0x0a,0x00,0x02,0x01,0x06,0xb3,0x00,0x00,0x07,0x04,0xb9,0x01, +0x0c,0x00,0x01,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x21,0x02,0x25,0xfe,0x56,0x83,0x01,0x27,0x02,0x9a,0x03,0x00,0xfd,0x70,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0xb6,0x05,0x9a,0x00,0x1b,0x00,0x27,0xbe,0x00,0x11,0x01,0x0a,0x00,0x13,0x01,0x06,0x00,0x1a,0x00,0x00,0x01,0x0c,0xb4, +0x01,0x01,0x1d,0x13,0x10,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x03,0xb6,0x83,0x07,0x05,0x07,0x10,0xd6,0x62,0xd8,0x0a,0x0e,0x04, +0x04,0x7b,0xbd,0xc6,0x14,0x08,0x04,0x11,0x0f,0xc2,0xb6,0x02,0x9a,0x01,0xe9,0x3b,0x58,0x20,0x36,0xfd,0xda,0x02,0x20,0x18,0x46,0x40,0x6a,0xfe,0x2c,0x03,0x00,0xfe,0x08,0x32,0x2c,0x3e,0x24,0x01,0xf4,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0x06,0x05,0x9a,0x00,0x11,0x00,0x29,0xbb,0x00,0x08,0x01,0x0a,0x00,0x0a,0x01,0x06,0xb3, +0x0a,0x01,0x07,0x11,0xb8,0x01,0x0c,0xb3,0x10,0x10,0x13,0x07,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x01,0x26,0x27,0x23,0x17,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x27,0x11,0x33,0x03,0x06,0x8d,0xfe,0xb2,0x15,0x1c,0x04,0x02,0x7d,0x93,0x01,0x48,0x15,0x1c, +0x05,0x03,0x7d,0x02,0x9a,0x01,0xfc,0x1f,0x3d,0x6f,0xfe,0x17,0x03,0x00,0xfe,0x0e,0x1f,0x3d,0x6e,0x01,0xe0,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0x06,0x05,0x9a,0x00,0x11,0x00,0x29,0xbb,0x00,0x07,0x01,0x0a,0x00,0x09,0x01,0x06,0xb3,0x10,0x07,0x0a,0x00,0xb8,0x01,0x0c,0xb3,0x01,0x01,0x13,0x0a,0xb9,0x01,0x0c,0x00,0x08,0x2f, +0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x07,0x33,0x36,0x37,0x01,0x33,0x03,0x06,0x7d,0x03,0x05,0x0d,0x24,0xfe,0xb2,0x8d,0x7d,0x02,0x04,0x0e,0x23,0x01,0x47,0x94,0x02,0x9a,0x01,0xe9,0x6f,0x1e,0x3e,0xfe,0x04,0x03,0x00,0xfe,0x20,0x6e,0x1e, +0x3e,0x01,0xf2,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x03,0x2b,0x05,0xaa,0x00,0x0b,0x00,0x17,0x00,0x2d,0x41,0x0a,0x00,0x12,0x01,0x0e,0x00,0x00,0x01,0x0b,0x00,0x0c,0x01,0x0e,0x00,0x06,0x01,0x07,0x00,0x09,0x01,0x0c,0xb3,0x15,0x15,0x19,0x0f,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31, +0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xae,0xa6,0xca,0xd3,0xa9,0xa7,0xca,0xd2,0xa3,0x6c,0x86,0x82,0x6c,0x6c,0x86,0x82,0x02,0x89,0xd9,0xb0,0xb7,0xe1,0xd8,0xb1,0xb5,0xe3,0x02,0xb1,0x9e,0x84,0x83,0x9b,0x9d,0x83,0x83,0x9d,0x00,0x02, +0x00,0x3e,0x02,0x89,0x02,0xcf,0x05,0x9a,0x00,0x1b,0x00,0x27,0x00,0x5c,0xb2,0x12,0x00,0x1c,0xb8,0x01,0x0e,0xb3,0x09,0x09,0x04,0x22,0xbf,0x01,0x0e,0x00,0x17,0x01,0x0b,0x00,0x0e,0x00,0x04,0x01,0x06,0x00,0x0b,0x01,0x0c,0xb6,0x10,0x10,0x14,0x1a,0x05,0x05,0x07,0xb8,0x01,0x0c,0xb5,0x02,0x02,0x12,0x00,0x1a,0x14,0xb8,0x01,0x0c, +0xb3,0x25,0x25,0x29,0x1f,0xb9,0x01,0x0c,0x00,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x13,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x15,0x14, +0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0xdd,0x75,0x19,0x7d,0x16,0x9d,0x9e,0x15,0x80,0x16,0x73,0x9e,0xba,0x92,0x92,0xb3,0x01,0x47,0x58,0x6d,0x6e,0x57,0x58,0x6f,0x73,0x04,0x7f,0x35,0x75,0x35,0x3c,0x2e,0x37,0x83,0x83,0x3b,0x2a,0x38,0x39,0x70,0x3a,0x3f,0xa2,0x7a,0x9b,0x96, +0x79,0xa0,0x0a,0x59,0x4b,0x4a,0x5a,0x58,0x4c,0x48,0x5c,0x00,0x00,0x02,0x00,0x7b,0x02,0x9a,0x02,0x83,0x05,0x9a,0x00,0x09,0x00,0x10,0x00,0x35,0xb9,0x00,0x00,0x01,0x0e,0xb3,0x0b,0x0b,0x03,0x02,0xbe,0x01,0x0a,0x00,0x0a,0x01,0x0e,0x00,0x03,0x01,0x06,0x00,0x06,0x01,0x0c,0xb4,0x0e,0x0e,0x12,0x0b,0x01,0xb9,0x01,0x0c,0x00,0x02, +0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x11,0x23,0x11,0x33,0x20,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0xfe,0x83,0xef,0x01,0x19,0xa1,0x86,0x5e,0x54,0xaa,0xa4,0x03,0xa6,0xfe,0xf4,0x03,0x00,0xf2,0x71,0x91,0x01,0x83,0xfe,0xed,0x8e,0x85,0x00,0x02,0x00,0x7b, +0x02,0x9a,0x02,0xa4,0x05,0x9a,0x00,0x11,0x00,0x18,0x00,0x42,0xb1,0x0f,0x05,0xb8,0x01,0x0e,0xb4,0x13,0x13,0x08,0x00,0x07,0xbc,0x01,0x0a,0x00,0x12,0x01,0x0e,0x00,0x08,0x01,0x06,0xb4,0x0f,0x13,0x00,0x00,0x0c,0xb8,0x01,0x0c,0xb4,0x16,0x16,0x1a,0x13,0x06,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f, +0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x23,0x27,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x17,0x01,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0xa4,0x96,0x5c,0x2a,0x4a,0x40,0x83,0x01,0x00,0x7f,0x89,0xae,0x37,0x29,0xfe,0xc9,0x68,0x94,0x90,0x02,0x9a,0xd2,0x61,0xfe, +0xcd,0x03,0x00,0x73,0x65,0xa8,0x22,0x02,0x16,0x59,0x01,0xa2,0xeb,0x78,0x73,0x00,0x00,0x01,0x00,0x0a,0x02,0x9a,0x02,0x48,0x05,0x9a,0x00,0x07,0x00,0x2d,0xbe,0x00,0x03,0x01,0x0a,0x00,0x01,0x00,0x04,0x01,0x0e,0x00,0x06,0x01,0x06,0xb4,0x00,0x03,0x05,0x05,0x02,0xb8,0x01,0x0c,0xb3,0x03,0x03,0x09,0x08,0x11,0x12,0x39,0x2f,0xf1, +0xc0,0x2f,0x10,0xc4,0x00,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x02,0x48,0xde,0x82,0xde,0x02,0x3e,0x05,0x29,0xfd,0x71,0x02,0x8f,0x71,0x00,0x00,0x01,0x00,0x74,0x02,0x89,0x02,0xdb,0x05,0x9a,0x00,0x0d,0x00,0x2b,0x41,0x09,0x00,0x09,0x01,0x0e,0x00,0x02,0x01,0x0b,0x00,0x0d,0x00,0x05,0x01,0x06, +0x00,0x0d,0x01,0x0c,0xb3,0x0c,0x0c,0x0f,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x31,0x30,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x02,0xdb,0xfe,0xc5,0xfe,0xd4,0x84,0xb0,0xb0,0x83,0x03,0xd3,0xfe,0xb6,0x01,0x3f,0x01,0xd2,0xfe,0x35,0xd5,0xd5,0x01, +0xcb,0x00,0x00,0x01,0x00,0x10,0x02,0x9a,0x04,0x25,0x05,0x9a,0x00,0x1b,0x00,0x15,0xbb,0x00,0x0a,0x01,0x0a,0x00,0x0b,0x01,0x06,0xb2,0x00,0x1d,0x0b,0x2f,0x10,0xc6,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37, +0x13,0x04,0x25,0xc7,0x9e,0x8f,0x0a,0x02,0x04,0x05,0x0a,0x95,0x9e,0xcf,0x92,0x85,0x09,0x03,0x07,0x02,0x0e,0x9c,0x88,0x8e,0x0a,0x04,0x06,0x02,0x0c,0x82,0x05,0x9a,0xfd,0x00,0x02,0x0e,0x25,0x2d,0x2c,0x24,0xfd,0xf0,0x03,0x00,0xfd,0xdf,0x26,0x2a,0x1f,0x31,0x02,0x21,0xfd,0xda,0x26,0x25,0x19,0x35,0x02,0x23,0x00,0x02,0x00,0x3e, +0x02,0x89,0x02,0x1e,0x04,0xcf,0x00,0x14,0x00,0x1d,0x00,0x61,0x40,0x0c,0x02,0x05,0x16,0x0f,0x30,0x11,0x17,0x48,0x0f,0x0f,0x0d,0x16,0xb8,0x01,0x0d,0xb4,0x40,0x0b,0x12,0x05,0x0b,0xb8,0x01,0x0d,0xb2,0x30,0x30,0x1b,0x41,0x0b,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x0d,0x01,0x0d,0x00,0x12,0x01,0x09,0x00,0x00, +0x01,0x0c,0xb6,0x16,0x0b,0x01,0x01,0x1f,0x0f,0x19,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x2b,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33, +0x32,0x15,0x07,0x35,0x07,0x06,0x15,0x14,0x33,0x32,0x36,0x02,0x1e,0x7e,0x02,0x38,0x76,0x53,0x5f,0xc2,0xa0,0x6f,0x64,0x59,0x56,0x76,0xde,0x7e,0x79,0x6d,0x5e,0x3c,0x4c,0x02,0x9a,0x50,0x61,0x59,0x4b,0x9b,0x1c,0x16,0x72,0x3f,0x71,0x31,0xd7,0x81,0x2f,0x10,0x0e,0x4e,0x50,0x4e,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x48,0x04,0xcf, +0x00,0x14,0x00,0x1d,0x00,0x61,0xb9,0x00,0x04,0xff,0xd0,0xb6,0x11,0x17,0x48,0x04,0x04,0x02,0x00,0xb8,0x01,0x0d,0x40,0x0c,0x15,0x5f,0x15,0x01,0x15,0x40,0x18,0x1b,0x48,0x15,0x0f,0x02,0x41,0x09,0x01,0x0d,0x00,0x07,0x01,0x0b,0x00,0x0a,0x01,0x08,0x00,0x1a,0x01,0x0d,0x00,0x0f,0x01,0x09,0xb2,0x04,0x04,0x12,0xb8,0x01,0x0c,0xb5, +0x18,0x18,0x1f,0x15,0x00,0x0b,0xb9,0x01,0x0c,0x00,0x0a,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x11,0x39,0x2b,0x71,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30,0x13,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x35,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x37,0x36,0x35, +0x34,0x23,0x22,0x06,0x15,0xe6,0x6e,0x64,0x58,0x54,0x76,0xe0,0x80,0x02,0x37,0x77,0x52,0x60,0xc3,0x9f,0x78,0x6d,0x5f,0x3a,0x4c,0x03,0x5e,0x72,0x3f,0x71,0x31,0xd7,0x01,0x5e,0x50,0x61,0x5c,0x48,0x9b,0x1c,0x3e,0x10,0x0f,0x4d,0x50,0x4e,0x3e,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x60,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x41, +0xb3,0x0e,0x02,0x0b,0x19,0x41,0x0d,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x10,0x01,0x08,0x00,0x15,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x00,0x01,0x0c,0xb5,0x11,0x0e,0x01,0x01,0x1d,0x17,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31, +0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0x7e,0x03,0x42,0x76,0x68,0x81,0x8e,0x6e,0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x90,0x8e,0x42,0x52,0x02,0x9a,0x50,0x61,0x97,0x80,0x84,0xab,0x54,0x43,0xfe,0xda,0x2e,0x46, +0x5c,0xc2,0xb6,0x5e,0x00,0x03,0x00,0x48,0x02,0x89,0x03,0xa2,0x04,0xcf,0x00,0x22,0x00,0x2b,0x00,0x30,0x00,0xa9,0x40,0x09,0x1a,0x0a,0x0c,0x18,0x15,0x15,0x13,0x10,0x04,0xb8,0xff,0xd0,0xb6,0x11,0x17,0x48,0x04,0x04,0x02,0x00,0xb8,0x01,0x0d,0x40,0x0d,0x23,0x5f,0x23,0x01,0x23,0x40,0x18,0x1b,0x48,0x23,0x1d,0x02,0x10,0xb8,0x01, +0x0d,0x40,0x0c,0x03,0x2d,0x13,0x2d,0x23,0x2d,0x03,0x2d,0x2d,0x13,0x0c,0x02,0xb8,0x01,0x0d,0xb2,0x07,0x07,0x2f,0xbc,0x01,0x0d,0x00,0x0c,0x01,0x0b,0x00,0x28,0x01,0x0d,0xb3,0x1d,0x1d,0x13,0x18,0xb8,0x01,0x09,0xb5,0x00,0x09,0x1a,0x2c,0x04,0x23,0xb8,0x01,0x0c,0xb6,0x11,0x11,0x20,0x10,0x04,0x04,0x20,0xb8,0x01,0x0c,0xb4,0x26, +0x26,0x32,0x15,0x2d,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x00,0x3f,0xcd,0x33,0x10,0xed,0x3f,0xed,0x33,0x10,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x2b,0x71,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x39,0x31,0x30,0x01, +0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x37,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x07,0x23,0x16,0x33,0x32,0x02,0x40,0x6e,0x64,0x58,0x54,0x76,0x7e,0x32,0x04,0x48,0x6a,0x72,0x80,0x01,0x78, +0x08,0x9c,0x5c,0x4e,0x4a,0x73,0x97,0x44,0x04,0x43,0x8a,0x58,0x6f,0xc3,0x9f,0x78,0x6d,0x5f,0x3a,0x4c,0x80,0xfe,0x02,0x7a,0x78,0x03,0x5e,0x72,0x3f,0x71,0x31,0x50,0x50,0x93,0x7a,0x43,0x8f,0x35,0x6f,0x2d,0x6b,0x6b,0x5e,0x46,0x9b,0x1c,0x3e,0x10,0x0f,0x4d,0x50,0x4e,0x3e,0x6b,0x8b,0x00,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x89, +0x05,0xc4,0x00,0x10,0x00,0x1b,0x00,0x41,0xb3,0x06,0x01,0x09,0x15,0x41,0x0d,0x01,0x0d,0x00,0x0f,0x01,0x0b,0x00,0x03,0x01,0x0a,0x00,0x19,0x01,0x0d,0x00,0x09,0x01,0x09,0x00,0x04,0x01,0x06,0x00,0x0c,0x01,0x0c,0xb5,0x17,0x17,0x1d,0x12,0x06,0x02,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f, +0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x23,0x15,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x80,0x02,0x42,0x76,0x68,0x81,0x8f,0x6c,0x72,0x36,0x51,0x40,0x91,0x8d,0x43,0x52,0x02,0xdd,0x43,0x03,0x2a,0xfe,0xaa,0x61, +0x97,0x80,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x60,0x05,0xc4,0x00,0x10,0x00,0x1b,0x00,0x41,0xb3,0x0e,0x02,0x0b,0x19,0x41,0x0d,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x15,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x10,0x01,0x06,0x00,0x10,0x01,0x0c,0xb5,0x12,0x02, +0x0f,0x0f,0x1d,0x17,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0x7e,0x03,0x42,0x76,0x68, +0x81,0x8e,0x6e,0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x92,0x8e,0x42,0x54,0x02,0x9a,0x50,0x61,0x97,0x80,0x84,0xab,0x54,0x01,0x49,0xfd,0xd4,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x35,0x04,0xcf,0x00,0x11,0x00,0x16,0x00,0x4e,0xb3,0x05,0x05,0x03,0x01,0xb8,0x01,0x0d,0x40,0x0b,0x0c,0x16,0x1c,0x16, +0x2c,0x16,0x03,0x16,0x16,0x0e,0x03,0xbe,0x01,0x0d,0x00,0x08,0x01,0x0b,0x00,0x14,0x01,0x0d,0x00,0x0e,0x01,0x09,0xb2,0x05,0x05,0x00,0xb8,0x01,0x0c,0xb4,0x12,0x12,0x18,0x16,0x01,0xb9,0x01,0x0c,0x00,0x0b,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30, +0x01,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x07,0x02,0x35,0xfe,0x87,0x0a,0x9a,0x5c,0x4e,0x48,0x78,0x7e,0x8e,0x92,0x72,0x71,0x82,0x7b,0x02,0x78,0x78,0x0c,0x03,0x7f,0x8f,0x35,0x6f,0x2d,0x97,0x88,0x81,0xa6,0x91,0x7c,0x20,0x8a,0x8a,0x00,0x00,0x02,0x00,0x48, +0x02,0x87,0x02,0x40,0x04,0xd1,0x00,0x11,0x00,0x16,0x00,0x4c,0xb3,0x05,0x05,0x03,0x00,0xb8,0x01,0x0d,0x40,0x0b,0x03,0x13,0x13,0x13,0x23,0x13,0x03,0x13,0x13,0x03,0x15,0x41,0x09,0x01,0x0d,0x00,0x0e,0x01,0x0b,0x00,0x03,0x01,0x0d,0x00,0x08,0x01,0x09,0x00,0x0b,0x01,0x0c,0xb5,0x01,0x12,0x12,0x18,0x05,0x13,0xb9,0x01,0x0c,0x00, +0x00,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30,0x13,0x21,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x05,0x23,0x16,0x33,0x32,0x48,0x01,0x78,0x09,0x9b,0x5c,0x4e,0x4a,0x77,0x7c,0x91,0x94,0x70,0x72,0x82,0x01,0x78, +0xfe,0x02,0x7a,0x74,0x03,0xd9,0x91,0x35,0x6f,0x2d,0x99,0x88,0x81,0xa8,0x94,0x7b,0x1f,0x8d,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xdb,0x04,0xcf,0x00,0x1e,0x00,0x5b,0xb1,0x06,0x17,0xb8,0x01,0x0d,0xb4,0x40,0x16,0x0c,0x02,0x16,0xb8,0x01,0x0d,0xb3,0x30,0x30,0x1e,0x1c,0xbf,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0f,0x00,0x11,0x01, +0x0d,0x00,0x0c,0x01,0x09,0x40,0x0b,0x06,0x04,0x17,0x17,0x1a,0x0f,0x00,0x00,0x20,0x04,0x13,0xbc,0x01,0x0c,0x00,0x09,0x00,0x1a,0x01,0x0c,0x00,0x04,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x35, +0x34,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x15,0x14,0x33,0x32,0x37,0x01,0xdb,0x49,0x58,0xfc,0x7a,0x66,0x80,0x6e,0x4d,0x40,0x3e,0x49,0x71,0x8b,0x32,0x34,0x9e,0x88,0x55,0x3e,0x02,0xa4,0x1b,0xa4,0x6f,0x1c,0x04,0x20,0x59,0x48,0x52,0x17,0x68,0x1c,0x41,0x47,0x63, +0x4c,0x49,0x1c,0x00,0x00,0x01,0x00,0x42,0x02,0x89,0x01,0xdf,0x04,0xcf,0x00,0x1e,0x00,0x54,0xb1,0x01,0x11,0xb8,0x01,0x0d,0xb5,0x10,0x10,0x16,0x06,0x09,0x0b,0xbf,0x01,0x0d,0x00,0x06,0x01,0x0b,0x00,0x18,0x00,0x16,0x01,0x0d,0x00,0x1b,0x01,0x09,0xb6,0x01,0x1d,0x11,0x11,0x14,0x18,0x0d,0xb8,0x01,0x0c,0xb2,0x03,0x03,0x1d,0xb8, +0x01,0x0c,0xb4,0x14,0x14,0x20,0x09,0x18,0x2f,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35, +0x36,0x33,0x32,0x15,0x14,0x01,0x64,0x67,0x81,0x6d,0x4d,0x40,0x3e,0x49,0x71,0x8c,0x30,0x32,0x9e,0x87,0x55,0x3e,0x49,0x59,0xfb,0x03,0xa0,0x04,0x1f,0x5a,0x49,0x51,0x17,0x68,0x1c,0x41,0x47,0x63,0x4c,0x49,0x1c,0x64,0x1b,0xa4,0x6f,0x00,0x00,0x02,0x00,0x3e,0x01,0x94,0x02,0x60,0x04,0xcf,0x00,0x18,0x00,0x23,0x00,0x4e,0xb3,0x05, +0x05,0x0d,0x07,0xb8,0x01,0x0d,0xb5,0x02,0x02,0x15,0x0a,0x13,0x21,0x41,0x0b,0x01,0x0d,0x00,0x0d,0x01,0x0b,0x00,0x18,0x01,0x08,0x00,0x1d,0x01,0x0d,0x00,0x13,0x01,0x09,0x00,0x18,0x01,0x0c,0xb5,0x16,0x0a,0x19,0x19,0x25,0x1f,0xb8,0x01,0x0c,0xb1,0x05,0x10,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f, +0xed,0x12,0x39,0x39,0xc4,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x01,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0xfe,0xbe,0x62,0x4a,0x58,0x59,0xbf,0x03,0x42,0x76,0x68,0x81,0x8e,0x6e, +0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x90,0x8e,0x42,0x52,0x02,0xbc,0xfe,0xd8,0x22,0x79,0x31,0xbc,0x30,0x61,0x97,0x80,0x84,0xab,0x54,0x43,0xfe,0xda,0x2e,0x46,0x5c,0xc2,0xb6,0x5e,0x00,0x00,0x02,0x00,0x58,0x01,0x94,0x00,0xf6,0x04,0xbe,0x00,0x03,0x00,0x0b,0x00,0x22,0xb4,0x01,0x08,0x40,0x04,0x02,0xb8,0x01,0x08,0xb6,0x01,0x00, +0x06,0x0a,0xff,0x3a,0x00,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x2b,0x00,0x18,0x3f,0xd4,0x1a,0xdd,0xce,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0xe8,0x82,0x82,0x42,0x4e,0x50,0x4e,0x02,0x9a,0x02,0x24,0xfc,0xd6,0x4b,0x4c,0x4c,0x4b,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x56,0x05,0xc4,0x00,0x0c, +0x00,0x2e,0xb5,0x03,0x08,0x0c,0x03,0x05,0x00,0xbc,0x01,0x0a,0x00,0x0b,0x01,0x08,0x00,0x06,0x01,0x07,0xb5,0x0b,0x00,0x0e,0x0c,0x08,0x03,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x32,0x32,0x10,0xd6,0xc6,0x00,0x3f,0x3f,0x3f,0x33,0x17,0x39,0x31,0x30,0x01,0x23,0x03,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x37,0x33,0x03,0x02,0x56,0xa0, +0xce,0x02,0x80,0x80,0x02,0xc2,0x9c,0xde,0x02,0x9a,0x01,0x0e,0xfe,0xf2,0x03,0x2a,0xfd,0xfc,0xfe,0xfe,0xfc,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x03,0x9a,0x04,0xcf,0x00,0x1d,0x00,0x59,0xb6,0x01,0x09,0x14,0x19,0x04,0x17,0x11,0xba,0x01,0x0a,0x00,0x12,0x01,0x08,0xb2,0x1b,0x04,0x0c,0xbb,0x01,0x0d,0x00,0x40,0x00,0x17,0x01,0x09, +0xb3,0x19,0x08,0x14,0x00,0xb8,0x01,0x0c,0xb7,0x01,0x0e,0x09,0x11,0x09,0x42,0x14,0x10,0xbb,0x01,0x0c,0x00,0x11,0x00,0x08,0x01,0x0c,0xb3,0x09,0x09,0x1f,0x1e,0x11,0x12,0x39,0x2f,0xe1,0x2f,0xe1,0x32,0x2b,0x01,0x10,0xf0,0xe1,0x11,0x12,0x39,0x00,0x18,0x3f,0x1a,0xed,0x39,0x39,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x23,0x11, +0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x03,0x9a,0x80,0x68,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x02,0x9a,0x01,0x3b,0x8f,0x54,0x3f,0xfe,0xc9,0x01,0x3f,0x8b,0x52,0x45,0xfe,0xcd,0x02, +0x24,0x52,0x63,0x6f,0x6f,0xe3,0x00,0x01,0x00,0x66,0x01,0x98,0x02,0x50,0x04,0xcf,0x00,0x19,0x00,0x40,0xb1,0x05,0x07,0x41,0x0a,0x01,0x0d,0x00,0x02,0x00,0x11,0x01,0x0a,0x00,0x12,0x01,0x08,0x00,0x0c,0x01,0x0d,0x00,0x17,0x01,0x09,0xb3,0x05,0x05,0x10,0x00,0xb8,0x01,0x0c,0xb4,0x09,0x09,0x1b,0x14,0x10,0xb9,0x01,0x0c,0x00,0x11, +0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xd4,0xfd,0xc6,0x31,0x30,0x01,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0xd9,0x2b,0x25,0x22,0x23,0x65,0x6d,0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02, +0xa6,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xcf,0x00,0x0b,0x00,0x17,0x00,0x2d,0x41,0x0a,0x00,0x12,0x01,0x0d,0x00,0x00,0x01,0x0b,0x00,0x0c,0x01,0x0d,0x00,0x06,0x01,0x09,0x00,0x09,0x01,0x0c,0xb3,0x15,0x15,0x19,0x0f,0xb9, +0x01,0x0c,0x00,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x58,0x80,0x9a,0xa2,0x84,0x80,0x9b,0xa3,0x7e,0x49,0x57,0x58,0x48,0x49,0x57,0x57,0x02,0x89,0x9e,0x7f,0x87,0xa2, +0x9f,0x7e,0x88,0xa1,0x01,0xdb,0x62,0x56,0x56,0x62,0x62,0x56,0x58,0x60,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xec,0x04,0xcf,0x00,0x15,0x00,0x2e,0xb1,0x01,0x03,0x41,0x0a,0x01,0x0d,0x00,0x14,0x01,0x0b,0x00,0x0b,0x00,0x09,0x01,0x0d,0x00,0x0e,0x01,0x09,0x00,0x11,0x01,0x0c,0xb4,0x06,0x06,0x17,0x0b,0x00,0x2f,0x32,0x11,0x39,0x2f, +0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x3e,0x35,0x45,0x52,0x60,0x5a,0x50,0x49,0x39,0x45,0x56,0x7c,0x97,0xa4,0x88,0x50,0x02,0xa2,0x78,0x26,0x62,0x56,0x56,0x62,0x28,0x70,0x23,0x9f,0x80,0x8b,0x9c,0x00, +0x00,0x01,0x00,0x3e,0x03,0xac,0x02,0x7f,0x04,0xcf,0x00,0x0d,0x00,0x26,0xb2,0x01,0x07,0x04,0xbc,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x00,0x01,0x0c,0xb3,0x01,0x01,0x0f,0x07,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x32,0x31,0x30,0x01,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33, +0x32,0x16,0x02,0x7f,0x81,0x57,0x49,0x49,0x57,0x80,0xa5,0x81,0x82,0x99,0x03,0xac,0x58,0x60,0x62,0x56,0x84,0x9f,0xa1,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0x7f,0x03,0xac,0x00,0x0d,0x00,0x26,0xb2,0x00,0x06,0x0a,0xbc,0x01,0x0d,0x00,0x03,0x01,0x0b,0x00,0x00,0x01,0x0c,0xb3,0x0d,0x0d,0x0f,0x07,0xb9,0x01,0x0c,0x00,0x06,0x2f, +0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc4,0x32,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x02,0x7f,0xa5,0x82,0x80,0x9a,0x80,0x58,0x48,0x49,0x57,0x03,0xac,0x84,0x9f,0xa0,0x83,0x56,0x62,0x62,0x56,0x00,0x00,0x02,0x00,0x66,0x01,0xa4,0x02,0x89,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x3e, +0xb4,0x03,0x06,0x00,0x09,0x15,0x41,0x0b,0x01,0x0d,0x00,0x0f,0x01,0x0b,0x00,0x04,0x01,0x08,0x00,0x19,0x01,0x0d,0x00,0x09,0x01,0x09,0x00,0x0c,0x01,0x0c,0xb5,0x17,0x17,0x1d,0x11,0x01,0x05,0xb9,0x01,0x0c,0x00,0x04,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0xc4,0x31,0x30,0x13,0x23, +0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x80,0x02,0x42,0x76,0x68,0x81,0x8f,0x6c,0x72,0x36,0x51,0x40,0x91,0x8d,0x43,0x52,0x02,0xdd,0xfe,0xc7,0x03,0x1a,0x50,0x61,0x97,0x80,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6, +0x60,0x00,0x00,0x01,0x00,0x0a,0x02,0x8e,0x01,0x68,0x05,0x62,0x00,0x13,0x00,0x45,0xb1,0x13,0x11,0xba,0x01,0x0d,0x00,0x02,0x01,0x0b,0xb4,0x0a,0x0b,0x0e,0x0b,0x05,0xba,0x01,0x0d,0x00,0x08,0x01,0x08,0xb7,0x0d,0x13,0x13,0x15,0x05,0x0e,0x05,0x0b,0xb8,0x01,0x0c,0x40,0x09,0x07,0x10,0x08,0x20,0x08,0x30,0x08,0x03,0x08,0x2f,0x5d, +0xcd,0xe1,0x39,0x39,0x11,0x12,0x39,0x2f,0xc4,0x00,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x15,0x14,0x33,0x32,0x37,0x01,0x68,0x22,0x40,0xa0,0x5c,0x5c,0x80,0x82,0x82,0x49,0x1e,0x1b,0x02,0xa0,0x12,0xbe,0x01,0x08,0x6a,0x80,0x24,0xa4, +0x6a,0xfe,0x5e,0x10,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x46,0x04,0xbe,0x00,0x11,0x00,0x36,0xb3,0x11,0x02,0x08,0x0c,0x41,0x0a,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x08,0x00,0x02,0x00,0x11,0x01,0x0c,0xb3,0x10,0x10,0x13,0x09,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xc4,0x00,0x3f, +0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x46,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x80,0x02,0x9a,0x56,0x67,0xe7,0x01,0x4e,0xfe,0xce,0x98,0x53,0x40,0x01,0x37,0x00,0x01,0x00,0x3e,0x02,0xb8,0x02,0x72,0x04,0xa2,0x00,0x12, +0x00,0x2e,0x40,0x15,0x00,0x0e,0x40,0x01,0x09,0x0d,0x08,0x09,0x08,0x42,0x08,0x09,0x0c,0x00,0x09,0x0a,0x0f,0x04,0x04,0x14,0x09,0x2f,0x12,0x39,0x2f,0xdd,0xc4,0x12,0x39,0x39,0x00,0x2f,0xcd,0x2b,0x00,0x18,0x10,0xc4,0x10,0xd6,0x1a,0xed,0x31,0x30,0x13,0x35,0x21,0x32,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15, +0x14,0x06,0x23,0x3e,0x01,0x32,0x98,0x54,0x40,0xfe,0xca,0x02,0x24,0x4c,0x5c,0x7c,0x6a,0x02,0xb8,0x80,0x6c,0x38,0x47,0x7f,0x7f,0x02,0x3f,0x69,0x58,0x69,0x00,0x01,0x00,0x60,0x02,0x89,0x03,0x94,0x04,0xbe,0x00,0x1d,0x00,0x67,0x40,0x09,0x02,0x07,0x14,0x1d,0x04,0x0c,0x18,0x05,0x10,0xbf,0x01,0x0d,0x00,0x40,0x00,0x09,0x01,0x0b, +0x00,0x00,0x01,0x0a,0x00,0x0c,0x01,0x08,0xb4,0x07,0x14,0x02,0x02,0x1d,0xb8,0x01,0x0c,0xb6,0x1c,0x0e,0x14,0x0c,0x14,0x42,0x0d,0xb8,0x01,0x0c,0xb6,0x00,0x0c,0x01,0x0b,0x03,0x0c,0x15,0xb8,0x01,0x0c,0xb3,0x14,0x1e,0x1f,0x14,0xb8,0x01,0x0c,0xb1,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0x2f,0x5f,0x5e,0x5d,0xe1,0x2b,0x01,0x10,0xf0, +0xe1,0xc1,0x18,0x2f,0x12,0x39,0x00,0x3f,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0x94,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x7f,0x69,0x31,0x41, +0x80,0x68,0x32,0x40,0x80,0x02,0x9a,0x52,0x63,0x6f,0x6f,0xe3,0x01,0x52,0xfe,0xc5,0x8f,0x54,0x3f,0x01,0x37,0xfe,0xc1,0x8b,0x52,0x46,0x01,0x32,0x00,0x01,0x00,0x0a,0x02,0x9a,0x02,0x35,0x04,0xbe,0x00,0x0b,0x00,0x1b,0xb3,0x07,0x00,0x03,0x02,0xba,0x01,0x0a,0x00,0x03,0x01,0x08,0xb2,0x00,0x0d,0x03,0x2f,0x10,0xc6,0x00,0x3f,0x3f, +0x12,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x02,0x35,0xc9,0x9b,0xc7,0x8a,0x78,0x0f,0x03,0x05,0x04,0x11,0x78,0x04,0xbe,0xfd,0xdc,0x02,0x24,0xfe,0x8e,0x2f,0x25,0x22,0x32,0x01,0x72,0x00,0x01,0x00,0x14,0x02,0x89,0x02,0x79,0x04,0xcf,0x00,0x1b,0x00,0x4a,0x40,0x0b,0x17,0x0d,0x0b,0x04, +0x06,0x12,0x1b,0x09,0x19,0x02,0x0b,0xbd,0x01,0x0d,0x00,0x40,0x00,0x06,0x01,0x0b,0x00,0x12,0x01,0x09,0x40,0x10,0x04,0x0d,0x17,0x03,0x0f,0x1b,0x0e,0x15,0x15,0x1d,0x0f,0x08,0x0f,0x42,0x08,0x0f,0x2f,0x2f,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0xe2,0x12,0x17,0x39,0x00,0x3f,0x3f,0x1a,0xfd,0x39,0x39,0xd6,0xc4,0x11,0x12,0x39,0x12, +0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x02,0x79,0x3c,0x49,0x60,0x4e,0x4f,0x5b,0x46,0x42,0x43,0x3f,0x36,0x28,0x77,0x6e,0x5d,0x5c,0x6c,0x78,0x2a,0x36,0x41,0x40,0x02,0xb4,0x2b,0x3b,0x3b,0x2b,0x79,0x39, +0x20,0x6b,0x85,0x57,0x74,0x71,0x56,0x84,0x6e,0x22,0x37,0x00,0x00,0x02,0x00,0x60,0x01,0xa4,0x02,0x74,0x05,0xc4,0x00,0x12,0x00,0x25,0x00,0x63,0xb3,0x02,0x11,0x0c,0x13,0xb8,0x01,0x0d,0xb4,0x40,0x14,0x06,0x11,0x14,0xb8,0x01,0x0d,0xb3,0x1e,0x30,0x1d,0x1f,0xbe,0x01,0x0d,0x00,0x11,0x01,0x0b,0x00,0x1a,0x01,0x0d,0x00,0x06,0x01, +0x07,0xb6,0x0c,0x0e,0x13,0x13,0x22,0x1d,0x18,0xb8,0x01,0x0c,0xb2,0x09,0x09,0x0e,0xb8,0x01,0x0c,0xb4,0x22,0x22,0x27,0x1d,0x01,0xb9,0x01,0x0c,0x00,0x02,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x10,0xc4,0x31,0x30,0x13, +0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x15,0x11,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0xdf,0x7f,0x8c,0x74,0x70,0x86,0x7f,0x9d,0x93,0x79,0x4a,0x09,0x1d,0x42,0x51,0x79,0x7f,0x3b,0x46,0x42,0x52,0x60,0x50,0x02,0xa6,0xfe,0xfe, +0x03,0x14,0x7a,0x92,0x7c,0x5c,0x81,0x2f,0x04,0x2e,0x93,0x67,0x87,0x01,0x77,0x62,0x46,0x3a,0x7c,0xa2,0xfe,0x5a,0x22,0x46,0x3a,0x40,0x4c,0x00,0x00,0x01,0xff,0xec,0x01,0xa4,0x02,0x23,0x04,0xbe,0x00,0x13,0x00,0x36,0xb4,0x03,0x0a,0x05,0x07,0x00,0xbb,0x01,0x0a,0x00,0x10,0x00,0x07,0x01,0x08,0xb6,0x0a,0x00,0x05,0x07,0x07,0x00, +0x0d,0xbc,0x01,0x0c,0x00,0x12,0x00,0x00,0x01,0x0c,0x00,0x05,0x2f,0xe1,0xd4,0xe1,0x10,0xc1,0x2f,0x11,0x12,0x39,0x00,0x3f,0x33,0x3f,0x11,0x39,0x39,0xcd,0x31,0x30,0x01,0x14,0x07,0x23,0x36,0x35,0x02,0x03,0x33,0x16,0x17,0x33,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x01,0x50,0x02,0x88,0x0b,0x48,0x9d,0x91,0x75,0x39,0x04,0x75, +0x06,0x80,0x05,0x02,0x83,0xb3,0x2c,0x6e,0x94,0x01,0x06,0x01,0x12,0xda,0xc8,0xa5,0xb1,0x2a,0x22,0x20,0x21,0xe8,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x7f,0x05,0xc4,0x00,0x17,0x00,0x21,0x00,0x4c,0x40,0x09,0x00,0x02,0x0d,0x10,0x18,0x1f,0x06,0x05,0x1d,0xbf,0x01,0x0d,0x00,0x13,0x01,0x0b,0x00,0x08,0x00,0x0a,0x01,0x0d,0x00,0x05, +0x01,0x07,0xb3,0x08,0x08,0x10,0x0c,0xb8,0x01,0x0c,0xb2,0x02,0x16,0x10,0xb8,0x01,0x0c,0xb3,0x1f,0x1f,0x23,0x1a,0xb9,0x01,0x0c,0x00,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xd4,0xe1,0x10,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14, +0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0xee,0x4a,0x72,0x63,0x5f,0x60,0x5e,0x5b,0x5a,0x8f,0xcb,0xa2,0x83,0x81,0x9b,0x01,0x08,0x88,0x56,0x4a,0xa0,0x48,0x04,0xa0,0x37,0x4e,0x45,0x5a,0x2a,0x75,0x39,0x3b,0x25,0x58,0x7c,0x9c,0x72,0x93,0x8f,0x6f,0xa0,0x3b,0x54,0x80, +0x48,0x52,0x9a,0x36,0x5d,0x00,0x00,0x02,0x00,0x3e,0x01,0xa4,0x03,0x06,0x04,0xcf,0x00,0x15,0x00,0x1d,0x00,0x61,0xb3,0x02,0x1c,0x00,0x0d,0x41,0x0a,0x01,0x0d,0x00,0x03,0x01,0x0b,0x00,0x09,0x01,0x08,0x00,0x19,0x01,0x0d,0x00,0x40,0x00,0x10,0x01,0x09,0xb4,0x09,0x09,0x0d,0x0b,0x16,0xb8,0x01,0x0c,0xb6,0x13,0x0e,0x01,0x06,0x02, +0x42,0x0b,0xb8,0x01,0x0c,0xb3,0x06,0x1c,0x0d,0x01,0xb8,0x01,0x0c,0xb3,0x02,0x1e,0x1f,0x02,0xb8,0x01,0x0c,0xb1,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x11,0x12,0x39,0x18,0x2f,0x00,0x3f,0x1a,0xed,0x3f,0x3f,0xed,0x39,0x39,0xcd,0x31,0x30,0x01,0x15,0x23,0x35,0x26,0x26,0x35,0x34,0x37, +0x33,0x06,0x15,0x14,0x17,0x11,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x34,0x26,0x23,0x22,0x15,0x11,0x36,0x01,0xe2,0x80,0x8a,0x9a,0x56,0x86,0x5e,0xa6,0xba,0x68,0x82,0x9e,0x1f,0x3e,0x2f,0x38,0xa5,0x02,0x89,0xe5,0xe5,0x05,0x9c,0x86,0x8a,0x84,0x78,0x90,0xbc,0x06,0x01,0x24,0xb7,0x9b,0x82,0x84,0x9e,0x01,0x1e,0x54,0x62,0x48, +0xfe,0xd8,0x08,0x00,0x00,0x01,0xff,0xf6,0x01,0x94,0x02,0x62,0x04,0xcf,0x00,0x1c,0x00,0x3c,0x40,0x0b,0x06,0x09,0x14,0x17,0x04,0x08,0x16,0x0e,0x0c,0x1c,0x1a,0xb8,0x01,0x0d,0xb3,0x02,0x08,0x11,0x16,0xbc,0x01,0x08,0x00,0x0c,0x01,0x0d,0x00,0x11,0x01,0x09,0xb4,0x16,0x00,0x1e,0x0e,0x08,0x2f,0xc6,0x10,0xd4,0xc4,0x00,0x3f,0xed, +0x3f,0x10,0xd4,0xd4,0xfd,0xc6,0x10,0xc6,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x27,0x27,0x03,0x23,0x13,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x17,0x37,0x33,0x03,0x17,0x16,0x33,0x32,0x37,0x02,0x62,0x20,0x21,0x41,0x4c,0x28,0x47,0xa0,0x8f,0xf0,0x4e,0x29,0x2b,0x13,0x1b,0x1c,0x28,0x6a,0x34,0x3d, +0x7d,0x8c,0xca,0x67,0x2f,0x2e,0x17,0x13,0x01,0x9e,0x0a,0x44,0x5b,0xa8,0xfe,0xc9,0x01,0xb4,0xb0,0x5c,0x0a,0x6c,0x09,0x7b,0x92,0xfc,0xfe,0x8e,0xe6,0x68,0x08,0x00,0xff,0xff,0x00,0x58,0xff,0x42,0x00,0xf6,0x02,0x6c,0x00,0x07,0x07,0xce,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x66,0xff,0x42,0x01,0xa8,0x01,0x70,0x00,0x07,0x06,0x79, +0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x5c,0xff,0x31,0x02,0x46,0x01,0x66,0x00,0x07,0x07,0xba,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x0a,0xff,0x42,0x02,0x35,0x01,0x66,0x00,0x07,0x07,0xbd,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x60,0xfe,0x4c,0x02,0x74,0x02,0x6c,0x00,0x07,0x07,0xbf,0x00,0x00,0xfc,0xa8,0xff,0xff,0xff,0xec,0xfe,0x4c, +0x02,0x23,0x01,0x66,0x00,0x07,0x07,0xc0,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x66,0xfe,0x4c,0x02,0x89,0x01,0x77,0x00,0x07,0x07,0xcf,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x3e,0xfe,0x4c,0x03,0x06,0x01,0x77,0x00,0x07,0x07,0xc2,0x00,0x00,0xfc,0xa8,0xff,0xff,0xff,0xf6,0xfe,0x3c,0x02,0x62,0x01,0x77,0x00,0x07,0x07,0xc3,0x00,0x00, +0xfc,0xa8,0x00,0x01,0x00,0xfc,0x04,0xc2,0x03,0xc4,0x05,0xf2,0x00,0x0c,0x00,0x16,0x40,0x09,0x00,0x07,0x09,0xf2,0x03,0x00,0x0c,0x07,0x06,0x2f,0xcd,0xd4,0xcd,0x00,0x2f,0xfd,0xd6,0xc4,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x03,0xc4,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68, +0x0c,0x05,0xf2,0x8d,0xa3,0xa3,0x8d,0xbc,0x63,0x59,0x00,0x02,0x00,0x58,0x02,0x9a,0x00,0xf6,0x05,0xc4,0x00,0x07,0x00,0x0b,0x00,0x25,0xb3,0x04,0x00,0x40,0x0a,0xba,0x01,0x08,0x00,0x09,0x01,0x0a,0xb6,0x09,0x08,0x02,0x06,0xff,0x3a,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe1,0x2b,0x00,0x18,0x3f,0x3f,0x1a,0xde,0xcd,0x31,0x30,0x13, +0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x03,0x23,0x11,0x33,0xa6,0x4e,0x50,0x4e,0x0e,0x82,0x82,0x05,0x2d,0x4c,0x4b,0x4b,0x4c,0xfd,0x6d,0x02,0x24,0x00,0x02,0x00,0x66,0x01,0xa4,0x02,0x89,0x04,0xcf,0x00,0x0e,0x00,0x19,0x00,0x31,0xb1,0x02,0x13,0x41,0x09,0x01,0x0d,0x00,0x0d,0x01,0x0b,0x00,0x17,0x01,0x0d,0x00,0x07,0x01,0x09,0x00, +0x0a,0x01,0x0c,0xb4,0x15,0x15,0x1b,0x0f,0x02,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0xc6,0x31,0x30,0x13,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x9a,0x7d,0x7a,0x92,0x8f,0x6c, +0x72,0x36,0x51,0x40,0x91,0x91,0x40,0x51,0x02,0xdd,0xfe,0xc7,0x02,0x00,0x8b,0xa0,0x9a,0x7d,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x33,0x40,0x1c,0x9d,0x02,0x01,0x5b,0x02,0x6b,0x02,0x7b,0x02,0x03,0x49,0x02,0x01,0x38,0x02,0x01,0x05,0x02,0x06,0x08, +0x03,0x04,0x04,0x03,0x03,0x02,0x06,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x54,0x02,0xe3,0x9c,0x05,0x00,0xfd,0x8f,0x6a,0x02,0xc1,0x00,0x02,0x00,0x8f,0xff,0xe7,0x06,0xb2,0x04,0x19,0x00,0x20, +0x00,0x27,0x00,0xe1,0x40,0x34,0x69,0x23,0x79,0x23,0x02,0xe6,0x1e,0xf6,0x1e,0x02,0x55,0x14,0x65,0x14,0x02,0xaa,0x0f,0x01,0xcf,0x26,0xdf,0x26,0x02,0x9b,0x26,0xfb,0x26,0x02,0x24,0x26,0x34,0x26,0x02,0x05,0x17,0x01,0x7e,0x0f,0x8e,0x0f,0x9e,0x0f,0x03,0x09,0x0f,0x19,0x0f,0x02,0x5b,0x0a,0x01,0x02,0xb8,0xff,0xe8,0x40,0x0e,0x13, +0x16,0x48,0x24,0x02,0x34,0x02,0x44,0x02,0x03,0xe2,0x1b,0x01,0x1b,0xb8,0xff,0xe0,0xb3,0x19,0x1c,0x48,0x1b,0xb8,0xff,0xe0,0x40,0x51,0x0b,0x0e,0x48,0xcb,0x0b,0x01,0x5b,0x0b,0x01,0x1b,0x0b,0x1d,0x0e,0x27,0x95,0xe0,0x01,0xf0,0x01,0x02,0x01,0x01,0x09,0x24,0x95,0x1d,0x10,0x19,0x11,0x0f,0x07,0xec,0x00,0x06,0x10,0x06,0x02,0x06, +0x04,0x95,0x09,0x16,0x15,0x95,0x0e,0x16,0x27,0x01,0x0b,0x03,0x1a,0x84,0x5f,0x19,0x7f,0x19,0x02,0x20,0x19,0xa0,0x19,0x02,0x19,0x19,0x11,0x06,0x40,0x0f,0x12,0x48,0x06,0x21,0x83,0x00,0x29,0x12,0x84,0x00,0x11,0x01,0x11,0x2f,0x5d,0xe1,0x10,0xde,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0x5d,0x5d,0xe1,0x17,0x39,0x00,0x3f,0xed,0x3f,0xfd, +0xd6,0x5d,0xed,0x3f,0xc4,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x39,0x5d,0x5d,0x2b,0x2b,0x5d,0x31,0x30,0x5d,0x2b,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33, +0x15,0x36,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0xb2,0xfd,0x2f,0x05,0xae,0x99,0xac,0x91,0x8a,0xc7,0xfe,0xd9,0x71,0x2a,0xba,0x8d,0xfe,0x7f,0xa4,0xfe,0x7c,0x90,0xa4,0x7d,0xbb,0xc2,0xd7,0xa8,0x02,0x86,0x78,0x71,0xa3,0x15,0x01,0xd7,0xae,0xb6,0x70,0x99,0x63,0xea,0x66,0x84,0x01,0xb5,0x02,0x64,0xfd,0xb6, +0xfe,0xbd,0xb3,0x94,0x02,0x46,0x7b,0x94,0xfe,0xf8,0xe4,0x35,0x91,0x9a,0xa0,0x8b,0x00,0x01,0x00,0x74,0x00,0x00,0x04,0x8b,0x05,0xb4,0x00,0x27,0x00,0x57,0x40,0x2e,0x1d,0x91,0x02,0x02,0x1e,0x00,0x25,0x92,0x40,0x22,0x1e,0x00,0x22,0x92,0x28,0x30,0x21,0x92,0x1e,0x1e,0x0c,0x27,0x92,0x00,0x10,0x13,0x92,0x0c,0x04,0x0f,0x0f,0x1d, +0x22,0x26,0x7e,0x01,0x01,0x07,0x24,0x20,0x00,0x00,0x29,0x18,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xf1,0x32,0x33,0xc0,0x2f,0x31,0x00,0x3f,0xfd,0xc6,0x2f,0xed,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x11,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32, +0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x04,0x8b,0xfd,0xb6,0x6b,0xab,0x77,0x40,0x49,0x8a,0xc5,0x7c,0x44,0x7d,0x34,0x39,0x80,0x42,0x55,0x86,0x5b,0x30,0x24,0x49,0x6e,0x4a,0x02,0x33,0xfe,0x6f,0x01,0x74,0xfe,0x8c,0x01,0xa8,0x01,0x7e,0x03,0x54, +0x8d,0xb9,0x69,0x7a,0xce,0x95,0x53,0x19,0x19,0xac,0x28,0x26,0x3f,0x6d,0x93,0x53,0x4c,0x81,0x63,0x3f,0x0b,0x01,0xe8,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0,0x00,0x00,0x03,0x00,0x76,0xff,0xb5,0x04,0x18,0x06,0x3d,0x00,0x2e,0x00,0x36,0x00,0x40,0x00,0x97,0x40,0x1d,0x23,0x1e,0x1b,0x1d,0x20,0x22,0x25,0x04,0x1b,0x0e,0x31,0x3b,0x3e,0x04, +0x3f,0x15,0x01,0x15,0x10,0x92,0x1b,0x13,0x04,0x07,0x0a,0x2d,0x04,0x01,0x0b,0xb8,0xff,0xc0,0x40,0x3c,0x0c,0x0f,0x48,0x0b,0x37,0x0d,0x32,0x3a,0x3f,0x04,0x37,0x05,0x2e,0x37,0x92,0x01,0x32,0x3a,0x3f,0x0d,0x04,0x0b,0x31,0x3b,0x3e,0x0e,0x04,0x16,0x2f,0x2d,0x01,0x04,0x07,0x04,0x0b,0x25,0x22,0x20,0x1d,0x04,0x16,0x28,0x05,0x06, +0x1e,0x03,0x1f,0x00,0x23,0x2e,0x03,0x24,0x28,0x0b,0x16,0x16,0x42,0x2f,0x7d,0x28,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x10,0xd4,0x17,0x32,0xc4,0x17,0x32,0x11,0x12,0x17,0x39,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x12,0x17,0x39,0x31,0x00,0x2f,0xed,0xcd,0x32,0x11,0x17,0x33,0x10,0xc4,0x2b,0x11,0x17,0x33,0x3f,0xfd,0xc6,0x5d,0x17,0x33, +0x11,0x17,0x33,0x10,0xce,0x32,0x30,0x01,0x07,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x07,0x23,0x13,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x37,0x01,0x14,0x17,0x01,0x0e,0x03,0x01,0x22,0x06,0x07,0x01,0x16,0x16, +0x17,0x01,0x26,0x03,0x36,0x2b,0x1a,0x2f,0x16,0x2b,0x73,0x31,0x10,0x20,0x11,0x3c,0x30,0xfe,0xa3,0x42,0x52,0x2f,0x4e,0x49,0x48,0x27,0x26,0x4a,0x50,0x57,0x34,0x5a,0x50,0x17,0x71,0x23,0x2a,0x27,0x33,0x71,0x4d,0x4c,0x54,0x52,0x91,0xc7,0x76,0x2d,0xfe,0x63,0x34,0x01,0x0b,0x48,0x76,0x54,0x2d,0x01,0xdf,0x0a,0x12,0x09,0xfe,0xc4, +0x11,0x25,0x14,0x01,0x52,0x1c,0x06,0x3d,0x8b,0x02,0x02,0x8f,0xa2,0x04,0x0a,0x05,0xa5,0x1b,0x10,0xfb,0x82,0x1c,0x0a,0x14,0x1e,0x14,0x96,0x11,0x1a,0x12,0x09,0x18,0x4b,0x74,0x18,0x1e,0xaa,0x01,0x00,0x5e,0x01,0x00,0x9f,0x9a,0x01,0x03,0xc5,0x7f,0x15,0x95,0xfc,0x7f,0xa6,0x80,0x03,0x71,0x1d,0x6d,0x98,0xbd,0x01,0xfe,0x01,0x01, +0xfb,0xf0,0x16,0x25,0x11,0x04,0x5b,0x03,0x00,0x01,0x00,0x76,0xff,0xe8,0x04,0x18,0x05,0xb2,0x00,0x3e,0x00,0x5e,0x40,0x16,0x38,0x37,0x3b,0x00,0x02,0x95,0x3b,0x35,0x35,0x1f,0x15,0x34,0x07,0x3f,0x0f,0x01,0x0f,0x0a,0x92,0x15,0x13,0x25,0xb8,0xff,0xc0,0x40,0x0c,0x0c,0x0f,0x48,0x25,0x2a,0x92,0x1f,0x04,0x38,0x00,0x37,0x07,0xb8, +0x01,0x2e,0x40,0x0b,0x34,0x34,0x1a,0x00,0x25,0x10,0x10,0x40,0x2f,0x7d,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0x12,0x39,0x2f,0xe1,0x32,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xfd,0xc6,0x5d,0x33,0x33,0x11,0x12,0x39,0x2f,0xd4,0xfd,0xc6,0x11,0x33,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x16,0x32,0x33,0x32, +0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x04,0x18,0x27,0x48,0x5f,0x3f,0x3f,0x05,0x0c,0x06,0x2f,0x4e,0x49,0x48,0x27,0x26,0x4a,0x50,0x57,0x34,0x83, +0xdc,0x9f,0x59,0x65,0xb1,0xf0,0x8b,0x2c,0x47,0x40,0x3d,0x21,0x27,0x42,0x40,0x43,0x27,0x69,0xaf,0x80,0x47,0x27,0x48,0x66,0x3f,0x92,0x04,0x20,0x80,0x50,0x1d,0x2b,0x10,0x03,0x1c,0x1e,0x59,0x58,0x9a,0xfe,0x86,0x01,0x0a,0x14,0x1e,0x14,0x96,0x11,0x1a,0x12,0x09,0x66,0xba,0x01,0x08,0xa2,0xac,0x01,0x1b,0xca,0x6f,0x05,0x0a,0x10, +0x0b,0xa5,0x12,0x19,0x10,0x08,0x5b,0xa3,0xe3,0x89,0x63,0xae,0x8c,0x68,0x1e,0x03,0x18,0xbd,0x61,0x6c,0x07,0x06,0x00,0x01,0x00,0xa6,0xff,0x12,0x06,0x54,0x05,0x0c,0x00,0x2e,0x00,0x8c,0x40,0x48,0x10,0x13,0x16,0x03,0x12,0x26,0x2e,0x01,0x15,0x12,0x06,0x20,0x2d,0x2b,0x0f,0x0c,0x95,0x01,0x24,0x23,0x19,0x95,0x01,0x26,0x10,0x21, +0x0f,0x2d,0x16,0x15,0x2e,0x15,0x2d,0x16,0x2e,0x15,0x13,0x10,0x0f,0x01,0x14,0x00,0x01,0x0f,0x10,0x13,0x04,0x14,0x2e,0x00,0x00,0x06,0x14,0x15,0x20,0x2b,0x2b,0x17,0x11,0x84,0x12,0x12,0x20,0x06,0x84,0x05,0x05,0x30,0x23,0x1f,0x84,0x20,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xf1,0x33,0xc1,0x2f,0x10,0xc6,0x32,0x10, +0xc0,0x2f,0x32,0x12,0x00,0x17,0x39,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x31,0x00,0x3f,0x3f,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x33,0x33,0x2f,0x33,0x33,0xc6,0x10,0xcd,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x33,0x20,0x11,0x11,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x03, +0x11,0x23,0x35,0x03,0x23,0x01,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x37,0x13,0x05,0x85,0x87,0x04,0x01,0x52,0xa4,0x11,0x32,0x5a,0x48,0x07,0x0d,0x07,0xe1,0xa4,0xf5,0x99,0x01,0x8e,0xe9,0x3f,0x5e,0x3d,0x1e,0xa4,0xa4,0x04,0x6e,0xd0,0x32,0x5d,0x4d,0x38,0x0e,0x3e, +0x5f,0x9f,0x05,0x0c,0xf4,0xfe,0x5f,0xfd,0x89,0x02,0x4c,0x46,0x76,0x56,0x30,0x01,0x01,0xfe,0x69,0xfe,0x0b,0xcc,0xfe,0x46,0x02,0xd0,0x7e,0x01,0x2e,0x39,0x5c,0x75,0x3c,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1e,0x38,0x4e,0x30,0x73,0x34,0x01,0x21,0x00,0x00,0x05,0x00,0x23,0x00,0x00,0x05,0x0a,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0x23, +0x00,0x29,0x00,0x31,0x00,0x98,0x40,0x5a,0x24,0x25,0x2a,0x2b,0x04,0x15,0x02,0x0f,0x13,0x29,0x03,0x0c,0x1c,0x20,0x03,0x17,0x92,0x18,0x0b,0x1f,0x23,0x03,0x04,0x08,0x2e,0x03,0x1b,0x92,0x2f,0x00,0x01,0x90,0x00,0xa0,0x00,0xc0,0x00,0xd0,0x00,0x04,0x00,0x00,0x02,0x11,0x15,0x06,0x02,0x03,0x12,0x21,0x22,0x2f,0x04,0x2a,0x11,0x29, +0x1c,0x1f,0x04,0x04,0x03,0x24,0x1b,0x17,0x15,0x19,0x01,0x15,0x0c,0x08,0x0a,0x0e,0x25,0x1e,0x13,0x20,0x2a,0x03,0x14,0x03,0x15,0x11,0x06,0x7f,0x10,0x10,0x33,0x14,0x7f,0x15,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x11,0x33,0x11,0x17,0x33,0x32,0x32,0xc6,0x32,0x33,0x33,0x11,0x33,0x33,0x10,0xc6,0x32,0x11,0x12,0x17,0x39,0x11,0x12, +0x17,0x39,0x31,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x2f,0x5d,0x5d,0xfd,0x17,0x33,0x17,0x32,0xd6,0xed,0x17,0x33,0x17,0x32,0x11,0x12,0x17,0x39,0x31,0x30,0x13,0x33,0x11,0x33,0x13,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x01,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x05,0x33,0x35,0x21,0x05,0x21, +0x27,0x23,0x01,0x33,0x26,0x35,0x35,0x23,0x01,0x23,0x16,0x15,0x15,0x33,0x27,0x26,0x23,0x99,0xcb,0xf1,0x01,0x5f,0x97,0x9c,0x9c,0x9c,0x9c,0xc2,0xfe,0xfb,0xfe,0xac,0x97,0x99,0x99,0x99,0x02,0xde,0xd6,0xfe,0xe7,0xfe,0x95,0x01,0x0f,0x44,0xcb,0x02,0x88,0x03,0x07,0x92,0xfe,0x0c,0x05,0x07,0x85,0x60,0x1b,0x03,0xae,0x01,0xec,0xfe, +0x14,0x01,0xec,0xfe,0x14,0x8d,0x88,0x8c,0xfd,0xf3,0x02,0x0d,0xfd,0xf3,0x02,0x0d,0x8c,0x88,0x88,0x88,0x88,0x88,0xfd,0xbc,0x31,0xa0,0x5f,0x02,0xbb,0x2e,0x94,0x58,0xc2,0x37,0x00,0x03,0x00,0xbc,0xff,0xe8,0x06,0x77,0x05,0x9a,0x00,0x16,0x00,0x21,0x00,0x54,0x00,0x84,0x40,0x12,0x2c,0x47,0x51,0x36,0x60,0x3a,0x70,0x3a,0x02,0x3a, +0x3d,0x95,0x36,0x36,0x36,0x07,0x08,0x22,0xb8,0xff,0xc0,0x40,0x33,0x09,0x0e,0x48,0x22,0x25,0x95,0x51,0x16,0x14,0x13,0x18,0x91,0x05,0x05,0x08,0x01,0x07,0x17,0x91,0x08,0x03,0x22,0x31,0x3a,0x4c,0x42,0x7e,0x31,0x31,0x27,0x1e,0x13,0x13,0x0e,0x01,0x00,0x00,0x0e,0x7d,0x1e,0x1e,0x07,0x27,0x7e,0x4c,0x4c,0x56,0x18,0x06,0x7e,0x07, +0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x10,0xc1,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x10,0xc4,0x10,0xc6,0x31,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0xed,0x39,0x39,0x3f,0xfd,0xc6,0x2b,0x11,0x12,0x39,0x2f,0x2f,0xfd,0xc6,0x5d,0x11,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23, +0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26, +0x27,0x04,0x04,0xc8,0xb1,0x4e,0x8d,0x4c,0xa8,0x01,0x60,0x5e,0x9e,0x72,0x40,0x29,0x4e,0x72,0x4a,0x51,0x42,0xfe,0x3a,0x92,0x3f,0x6b,0x4e,0x2c,0x8f,0x8d,0x02,0x21,0x3e,0x81,0x44,0xb0,0x1d,0x31,0x40,0x23,0x49,0x61,0x3b,0x18,0x2e,0x57,0x7d,0x4f,0x39,0x73,0x2d,0x33,0x6e,0x3d,0x24,0x3d,0x2b,0x19,0x17,0x2b,0x3c,0x24,0x42,0x64, +0x42,0x22,0x23,0x51,0x84,0x61,0x45,0x84,0x36,0x01,0xb0,0xb2,0xfd,0x9e,0x05,0x9a,0x2f,0x60,0x8f,0x60,0x4b,0x82,0x67,0x48,0x10,0x04,0x1e,0x8c,0x03,0x20,0xfd,0xf8,0x26,0x47,0x67,0x40,0x73,0x81,0xfb,0xcc,0x2a,0x31,0x6e,0x1f,0x2c,0x1f,0x18,0x0c,0x18,0x35,0x41,0x4d,0x2f,0x35,0x5c,0x46,0x28,0x14,0x12,0xa3,0x1f,0x20,0x0f,0x1c, +0x28,0x19,0x21,0x2a,0x1d,0x16,0x0c,0x16,0x2f,0x3e,0x50,0x37,0x31,0x5e,0x4a,0x2d,0x1d,0x1b,0x00,0x07,0x00,0x14,0x00,0x00,0x05,0xe0,0x05,0x9a,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x33,0x00,0x3b,0x00,0x43,0x01,0x3f,0x40,0xb7,0x1a,0x1d,0x1e,0x01,0x02,0x19,0x02,0x17,0x26,0x25,0x3a,0x39,0x18,0x39,0x3b,0x24,0x27,0x16, +0x15,0x34,0x15,0x04,0x29,0x2a,0x41,0x42,0x03,0x42,0x40,0x2b,0x28,0x05,0x06,0x3f,0x06,0x13,0x22,0x21,0x32,0x31,0x14,0x31,0x12,0x23,0x20,0x33,0x2c,0x11,0x2c,0x0f,0x0c,0x0b,0x08,0x07,0x10,0x07,0x2e,0x2f,0x36,0x37,0x04,0x07,0x10,0x01,0x05,0x33,0x3b,0x04,0x1e,0x20,0x24,0x28,0x04,0x09,0x92,0x0a,0x1d,0x23,0x27,0x2b,0x04,0x12, +0x16,0x1a,0x40,0x41,0x05,0x0d,0x92,0x0e,0x0e,0x10,0x03,0x07,0x18,0x14,0x10,0x03,0x04,0x2a,0x41,0x03,0x3c,0x03,0x3b,0x24,0x27,0x16,0x04,0x15,0x37,0x3a,0x25,0x26,0x17,0x04,0x18,0x36,0x01,0x1e,0x1d,0x1a,0x04,0x19,0x02,0x05,0x28,0x2b,0x40,0x04,0x3d,0x06,0x32,0x21,0x22,0x13,0x04,0x14,0x2f,0x12,0x23,0x20,0x33,0x04,0x11,0x2e, +0x08,0x0c,0x0f,0x03,0x10,0x07,0x15,0x14,0x06,0x1c,0x00,0x02,0x0d,0x09,0x07,0x11,0x10,0x07,0x18,0x19,0x03,0x36,0x37,0x19,0x04,0x02,0x02,0x45,0x07,0x11,0x10,0x06,0x2e,0x2f,0x10,0x04,0x07,0x2f,0x17,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x17,0x33,0x2f,0x33,0x11,0x33,0x33,0x10,0xc6,0x32,0x10,0xc6,0x32,0x10,0xcd,0x32,0x11,0x12, +0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x31,0x00,0x3f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0xfd,0x17,0x33,0x17,0x32,0xd6,0xed,0x17,0x33,0x17,0x32,0x11,0x12,0x17,0x39,0x30,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x10, +0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x01,0x21,0x03,0x23,0x03,0x23,0x03,0x23,0x03,0x21,0x35,0x33,0x27,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13, +0x33,0x13,0x21,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x21,0x33,0x37,0x23,0x05,0x33,0x37,0x23,0x05,0x33,0x27,0x23,0x03,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x05,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x03,0x23,0x06,0x07,0x07,0x33,0x27,0x26,0x05,0xe0,0xfe,0xf3,0x63,0xa2,0x63,0xe7,0x63,0xa1,0x67,0xfe,0xfb,0xe9,0x1a,0xcf,0xb3, +0x5f,0x8f,0x5a,0x01,0x0d,0x5e,0x84,0x59,0x01,0x01,0x57,0x8d,0x5c,0xbe,0xd9,0x19,0xf1,0xfb,0xa5,0xa5,0x1a,0xd8,0x02,0x60,0x9e,0x18,0xcf,0xfe,0xed,0xb2,0x19,0x80,0xf7,0x0d,0x03,0x04,0x03,0x11,0x25,0x71,0x02,0x6d,0x0b,0x05,0x02,0x03,0x0f,0x23,0x6c,0xea,0x03,0x04,0x0d,0x14,0x4a,0x13,0x0d,0x02,0x10,0xfd,0xf0,0x02,0x10,0xfd, +0xf0,0x02,0x10,0x8c,0x88,0x8d,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x8d,0x88,0x88,0x88,0x88,0x88,0x88,0xfe,0x2a,0x45,0x4b,0x35,0x5b,0xc2,0xca,0x39,0x4d,0x34,0x56,0xc6,0x02,0x9a,0x4a,0x46,0x69,0x67,0x43,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x03,0xd3,0x04,0x00,0x00,0x0f,0x00,0x1f,0x00,0x4a,0x40,0x23, +0x19,0x01,0xbe,0x0e,0x0e,0x1f,0x0f,0x1e,0xbe,0x06,0x11,0x0f,0x00,0xcd,0x0f,0x0f,0x10,0x18,0xc2,0x19,0x19,0x10,0x06,0xc2,0x2f,0x07,0x3f,0x07,0x02,0x07,0x07,0x21,0x1f,0xcd,0x10,0xb8,0xff,0xc0,0xb3,0x0b,0x10,0x48,0x10,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x5d,0xe1,0x11,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x31,0x00,0x3f,0x33,0xfd, +0xc6,0x2f,0x33,0x10,0xfd,0xc6,0x31,0x30,0x01,0x11,0x21,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x21,0x11,0x03,0x11,0x21,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x21,0x11,0x01,0xe0,0x01,0x07,0x31,0x3a,0x81,0x1a,0x38,0x57,0x3d,0xfe,0x75,0xfe,0x01,0x8b,0x3d,0x57,0x38,0x1a,0x81,0x3a,0x31,0xfe,0xf9,0x03, +0x05,0xfd,0x7f,0x40,0x3b,0x03,0x01,0xfc,0xe4,0x2d,0x52,0x3f,0x26,0x03,0x05,0xfc,0xfb,0x04,0x00,0x25,0x3f,0x53,0x2d,0xfd,0xdf,0x02,0x07,0x3a,0x40,0xfc,0x84,0x00,0x00,0x03,0x00,0x60,0xfe,0xd7,0x04,0x98,0x05,0xec,0x00,0x1c,0x00,0x31,0x00,0x35,0x00,0x5b,0x40,0x33,0x33,0x96,0x34,0x05,0x01,0x02,0x2d,0x95,0x05,0x16,0x11,0x23, +0x95,0x0f,0x10,0x1c,0x19,0x14,0x96,0x0f,0x15,0x1f,0x15,0x2f,0x15,0x03,0x15,0x17,0x00,0x11,0x03,0x0a,0x35,0x00,0x34,0x14,0x0a,0x1b,0x19,0x12,0x16,0x1d,0x03,0x01,0x84,0x00,0x00,0x37,0x28,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x17,0x32,0x33,0xc6,0x10,0xc4,0xc4,0x10,0xc6,0x12,0x39,0x39,0x31,0x00,0x3f,0xd6,0x5d,0xed,0x33, +0x32,0x3f,0xed,0x33,0x3f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x13,0x21,0x35,0x21,0x04,0x10,0xa4, +0x04,0x72,0xee,0x6c,0xa0,0x69,0x33,0x3b,0x75,0xb0,0x75,0xd0,0x63,0x04,0xfe,0xb5,0x01,0x4b,0xa4,0x88,0x88,0xa4,0x2c,0x4d,0x6a,0x3f,0x56,0x7a,0x4e,0x24,0x23,0x4a,0x73,0x50,0x47,0x73,0x51,0x2b,0x7b,0xfc,0xae,0x03,0x52,0xae,0xc6,0x52,0x8b,0xba,0x69,0x71,0xcc,0x99,0x5a,0xa6,0x01,0x40,0x86,0xb4,0xb4,0x86,0xfd,0x1d,0x97,0x3e, +0x6c,0x50,0x2e,0x43,0x72,0x96,0x53,0x4c,0x8b,0x69,0x3e,0x39,0x60,0x7e,0xfd,0x4e,0x77,0x00,0x00,0x01,0x00,0x2a,0x00,0x00,0x03,0xfd,0x05,0x9a,0x00,0x19,0x00,0x44,0x40,0x22,0x19,0x06,0x16,0x10,0x0a,0x92,0x0b,0x0b,0x0d,0x01,0x08,0x14,0x0d,0x03,0x05,0x10,0x16,0x19,0x04,0x17,0x08,0x01,0x00,0x14,0x17,0x15,0x15,0x1b,0x0a,0x0f, +0x0c,0x07,0x7e,0x08,0x2f,0xe1,0x33,0x32,0xc6,0x12,0x39,0x2f,0xc6,0x33,0xc6,0x32,0x11,0x12,0x17,0x39,0x31,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x2f,0xed,0x33,0x33,0x32,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x03,0xfd, +0xdb,0xfe,0x6c,0x10,0x0e,0x08,0x04,0xa8,0x92,0x92,0xa8,0x04,0x08,0x16,0x08,0x01,0x96,0xc2,0xfe,0x36,0x01,0x70,0xfe,0x97,0x02,0x54,0x1a,0x1b,0x0e,0xfd,0x69,0x02,0x9e,0x8d,0x02,0x6f,0xfd,0x8f,0x0e,0x22,0x0c,0x02,0x35,0xfd,0x91,0x8d,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0x6c,0x05,0x9a,0x00,0x17,0x00,0x73,0x40,0x3b,0x08,0x05, +0x09,0x04,0x0b,0x02,0x0a,0x03,0x0c,0x01,0x0d,0x00,0x16,0x0f,0x17,0x0e,0x0d,0x0a,0x09,0x04,0x50,0x03,0x01,0x03,0x00,0x0d,0x00,0x6f,0x17,0x7f,0x17,0x02,0x17,0x17,0x12,0x07,0x15,0x11,0x91,0x12,0x03,0x0a,0x0e,0x11,0x07,0x03,0x17,0x16,0x02,0x06,0x0f,0x0b,0x07,0x14,0x14,0x19,0x06,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f,0x11,0x33, +0x33,0x11,0x33,0x33,0xc6,0x32,0x10,0xd4,0xc6,0x32,0x31,0x00,0x3f,0xed,0x32,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0xcd,0x10,0xd6,0x5d,0xcd,0xdd,0xcd,0x10,0xcd,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x07,0x15,0x37,0x15,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11, +0x21,0x35,0x21,0x15,0x21,0x11,0x37,0x03,0x08,0xea,0xea,0xea,0xa8,0xef,0xef,0xef,0xef,0xfe,0xb3,0x03,0x43,0xfe,0xb2,0xea,0x03,0xb5,0x85,0xcc,0x85,0x8e,0x85,0xfe,0x2a,0x01,0x76,0x87,0x8e,0x87,0xcc,0x87,0x8e,0x87,0x01,0xa4,0x98,0x98,0xfe,0xbc,0x85,0x00,0x00,0x05,0x00,0x2c,0xfe,0x9e,0x08,0xe2,0x06,0x77,0x00,0x3a,0x00,0x53, +0x00,0x6a,0x00,0x7e,0x00,0x8e,0x00,0x84,0x40,0x4c,0x1e,0x3e,0x8c,0x0c,0x04,0x0f,0x19,0x29,0x32,0x24,0x36,0x4f,0xe2,0x2f,0x7a,0xe7,0x59,0x70,0x69,0x70,0x52,0x63,0x7f,0xdb,0x0f,0x19,0x1f,0x19,0x02,0x19,0x89,0x43,0xe2,0x07,0x63,0x07,0x89,0xdb,0x0f,0x0c,0x1e,0x24,0x2f,0x36,0x3e,0x4f,0x8c,0x08,0x00,0x14,0x32,0x33,0x33,0x00, +0x29,0x2a,0x14,0x54,0x68,0x69,0x6b,0x04,0x6a,0x00,0xb1,0x4a,0x4a,0x14,0x75,0xea,0x5e,0x5e,0x90,0x84,0xf3,0x14,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0xc4,0x17,0x32,0x10,0xc4,0x32,0x10,0xc0,0x2f,0x32,0x11,0x12,0x17,0x39,0x31,0x00,0x2f,0xed,0x33,0x33,0x10,0xed,0x10,0xd4,0x5d,0xed,0x10,0xed,0xc6,0x10,0xd4,0xed, +0x2f,0xed,0x33,0x32,0xcd,0xc4,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x12,0x37,0x36,0x36,0x37,0x0e,0x03,0x07,0x27,0x3e,0x03,0x37,0x36,0x36,0x37,0x17,0x06,0x06,0x07,0x1e,0x03,0x05,0x06,0x02,0x07,0x1e,0x03, +0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x03,0x23,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x06,0x84,0x23,0x4d,0x78, +0xaa,0xdf,0x8c,0x3b,0x66,0x58,0x4c,0x22,0x42,0x94,0x55,0x2e,0x4a,0x34,0x1d,0x23,0x3a,0x4b,0x28,0x26,0x44,0x3d,0x3a,0x1c,0x36,0x58,0x26,0x25,0x5e,0x3c,0x5a,0x9b,0x8a,0x7d,0x3d,0x34,0x45,0x9f,0xb2,0xc2,0x68,0x43,0xa1,0x61,0x37,0x47,0x6c,0x2c,0x8a,0xcf,0x8a,0x45,0xfc,0xcf,0x32,0x74,0x46,0x1e,0x3f,0x48,0x50,0x2e,0x69,0xa8, +0x82,0x5e,0x3d,0x1d,0x3b,0x72,0xa9,0x6d,0x1b,0x31,0x2d,0x2e,0x02,0xf0,0x0f,0x2e,0x51,0x80,0x62,0x3d,0x66,0x4a,0x2a,0x2c,0x55,0x7b,0x4f,0x21,0x3f,0x36,0x2b,0x0d,0x8a,0xa3,0x01,0x64,0x12,0x25,0x39,0x27,0x2c,0x44,0x2f,0x18,0x14,0x25,0x35,0x21,0x35,0x49,0x2d,0x14,0xf9,0xfc,0x15,0x27,0x1e,0x12,0x12,0x1c,0x25,0x12,0x39,0x63, +0x2c,0x32,0x5c,0x03,0x3c,0x59,0xc0,0xb8,0xa4,0x7d,0x49,0x14,0x22,0x2d,0x18,0x3f,0x3c,0x1c,0x33,0x47,0x2b,0x30,0x4a,0x31,0x1a,0x10,0x1c,0x25,0x15,0x5f,0x01,0x0d,0xab,0xa9,0xf9,0x5d,0x0a,0x35,0x49,0x58,0x2d,0x50,0x38,0x69,0x51,0x34,0x03,0x48,0x66,0x26,0x42,0x1f,0x49,0x30,0x0f,0x5f,0x9b,0xd4,0xb1,0xc4,0xfe,0xe4,0x60,0x15, +0x24,0x1b,0x10,0x3f,0x6b,0x8e,0x9c,0xa1,0x4a,0x77,0xbb,0x85,0x4e,0x0a,0x2e,0x71,0x88,0xa3,0xfd,0xba,0x36,0x74,0x60,0x3f,0x25,0x47,0x68,0x43,0x48,0x7f,0x5f,0x36,0x10,0x1f,0x2c,0x1b,0xfe,0x29,0x02,0x7c,0x20,0x3e,0x30,0x1d,0x26,0x3f,0x51,0x2b,0x28,0x43,0x30,0x1a,0x31,0x47,0x52,0x15,0x0e,0x19,0x24,0x16,0x19,0x26,0x1a,0x0e, +0x36,0x35,0x27,0x36,0x00,0x02,0x00,0x30,0xfe,0x52,0x03,0x6a,0x05,0xe2,0x00,0x3c,0x00,0x4e,0x00,0x5d,0x40,0x32,0x01,0x02,0x07,0x1b,0x35,0x3b,0x4a,0x07,0x00,0x11,0x2b,0x25,0x3a,0x00,0x42,0xcb,0x11,0x00,0x4a,0x07,0x3d,0x02,0x35,0x1b,0x16,0x02,0x3a,0x00,0x47,0x48,0x0c,0x0c,0x3d,0x00,0x28,0x28,0x30,0x3d,0xc4,0x16,0x30,0xc0, +0x20,0x20,0x50,0x01,0x3b,0x3c,0x03,0x00,0x2f,0x17,0x32,0x11,0x39,0x2f,0xe1,0xd4,0xe1,0x10,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x10,0xc6,0x32,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x00,0x3f,0xed,0x2f,0xd6,0xd4,0xcd,0x11,0x12,0x17,0x39,0x31,0x30,0x33,0x13,0x13,0x36,0x37,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33, +0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x26,0x36,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x06,0x06,0x07,0x06,0x07,0x03,0x07,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x3e,0x03,0x30,0xfe,0x4c,0x11,0x13,0x11,0x28,0x16,0x26,0x4a,0x3a,0x23,0x20,0x3b,0x54, +0x34,0x30,0x47,0x2f,0x17,0x10,0x1d,0x26,0x16,0x2f,0x62,0x50,0x32,0x3e,0x6e,0x96,0x57,0x0b,0x0b,0x01,0x08,0x0c,0x25,0x51,0x43,0x2c,0x17,0x29,0x35,0x1e,0x23,0x47,0x1c,0x21,0x1e,0x64,0x62,0x01,0xcd,0x0e,0x19,0x22,0x14,0x11,0x21,0x19,0x0f,0x41,0x32,0x0e,0x19,0x12,0x0b,0x02,0x23,0xfe,0xe4,0x37,0x40,0x37,0x90,0x51,0x4b,0x8e, +0x8b,0x8a,0x47,0x3f,0x67,0x49,0x28,0x23,0x40,0x5b,0x38,0x22,0x69,0x85,0x99,0x52,0x54,0xad,0xbc,0xce,0x74,0x50,0x96,0x74,0x46,0x0c,0x09,0x06,0x10,0x03,0x09,0x3b,0x5a,0x78,0x47,0x56,0x9f,0x92,0x88,0x40,0x7d,0xe7,0x5b,0x6a,0x5d,0x01,0x50,0xf6,0x04,0xe1,0x30,0x41,0x28,0x11,0x13,0x29,0x41,0x2f,0x67,0xbf,0x60,0x3b,0x71,0x66, +0x56,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x04,0x8e,0x05,0x9a,0x00,0x1f,0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x81,0x40,0x4a,0x2c,0x12,0x24,0x0f,0x1c,0x92,0x1d,0x40,0x09,0x0d,0x48,0x1d,0x1d,0x03,0x18,0x23,0x0a,0x2f,0x07,0x00,0x92,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x01,0x01,0x03,0x2d,0x91,0x18,0x18,0x03,0x19,0x2e,0x91,0x03, +0x03,0x07,0x0a,0x0f,0x12,0x04,0x0c,0x22,0x25,0x2b,0x30,0x04,0x20,0x24,0x2d,0x2f,0x03,0x19,0x00,0x1c,0x1a,0x1e,0x02,0x1a,0x10,0x09,0x20,0x7d,0x0c,0x0c,0x35,0x19,0x7e,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x33,0x33,0x10,0xc6,0x32,0x11,0x17,0x33,0x11,0x17,0x33,0x11,0x17,0x33,0x31,0x00,0x3f,0xed,0x2f,0x12,0x39, +0x2f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x33,0x33,0x32,0x32,0x11,0x12,0x39,0x2f,0x2b,0xed,0x33,0x33,0x32,0x32,0x31,0x30,0x13,0x35,0x33,0x11,0x21,0x32,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x23,0x0e,0x03,0x23,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x05,0x34,0x27,0x21,0x15,0x21,0x36,0x36,0x01,0x32,0x36, +0x37,0x21,0x15,0x11,0x15,0x21,0x26,0x26,0x23,0x26,0x96,0x01,0x7c,0xa1,0xdb,0x2e,0xac,0x90,0x03,0x03,0x02,0x92,0xb7,0x1b,0x59,0x73,0x8d,0x50,0xaf,0xa8,0x96,0x96,0x02,0x95,0x03,0xfe,0x16,0x01,0xe8,0x02,0x03,0xfe,0xb9,0x67,0x87,0x26,0xfe,0x46,0x01,0xbe,0x23,0x7f,0x64,0x03,0xfd,0x8d,0x01,0x10,0x8b,0x85,0x8d,0x1b,0x1c,0x15, +0x28,0x14,0x8c,0x42,0x69,0x49,0x27,0xfe,0x32,0x02,0xe9,0x8c,0x88,0x3f,0x21,0x1e,0x88,0x11,0x24,0xfe,0xbc,0x45,0x3e,0x83,0x02,0x9c,0x78,0x39,0x3f,0x00,0x00,0x04,0x00,0xa2,0xff,0xdf,0x06,0x7d,0x05,0xbb,0x00,0x1b,0x00,0x33,0x00,0x42,0x00,0x4f,0x00,0x52,0x40,0x2d,0x34,0x4c,0x0f,0x44,0x1f,0x44,0x02,0x44,0x44,0x37,0x36,0x36, +0x28,0x43,0x4c,0x37,0x37,0x1c,0x28,0xcb,0x00,0xc7,0x1c,0xcb,0x0e,0x04,0x3d,0xbd,0x4a,0x4a,0x2d,0x44,0x35,0xc2,0x36,0x36,0x07,0x2d,0xc9,0x15,0x15,0x51,0x21,0xc9,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x31,0x00,0x3f,0xed,0xf4,0xed,0x11,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x2f, +0x5d,0xed,0x31,0x30,0x05,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x03,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x03,0x90,0x67,0xbf, +0xa7,0x89,0x62,0x36,0x36,0x62,0x8a,0xa6,0xbf,0x67,0x67,0xbe,0xa7,0x89,0x62,0x36,0x36,0x62,0x89,0xa6,0xbf,0x67,0x88,0xf1,0xb4,0x69,0x30,0x56,0x79,0x94,0xa8,0x5b,0x88,0xf1,0xb4,0x68,0x30,0x56,0x79,0x93,0xa9,0xdd,0x83,0x01,0x1d,0x53,0x84,0x5b,0x30,0x29,0x59,0x8c,0x64,0x8a,0x81,0x48,0x5f,0x37,0x16,0x1a,0x3a,0x5a,0x41,0x21, +0x36,0x62,0x89,0xa7,0xbf,0x67,0x67,0xbf,0xa7,0x89,0x62,0x36,0x36,0x62,0x8a,0xa7,0xbf,0x66,0x66,0xbf,0xa7,0x8a,0x62,0x36,0x05,0x84,0x69,0xb4,0xf1,0x88,0x5b,0xa9,0x93,0x78,0x57,0x2f,0x68,0xb4,0xf1,0x88,0x5b,0xa8,0x93,0x79,0x57,0x30,0xfc,0xdb,0xfe,0xba,0x03,0xba,0x28,0x4d,0x71,0x4a,0x3a,0x74,0x5d,0x39,0x02,0x01,0xfe,0x71, +0x23,0x3a,0x49,0x25,0x2d,0x49,0x33,0x1b,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x1a,0x05,0xec,0x00,0x1d,0x00,0x2b,0x00,0x39,0x00,0x41,0x40,0x24,0x11,0x00,0x36,0x95,0x16,0x10,0x22,0x95,0x0d,0x10,0x30,0x95,0x1c,0x16,0x28,0x95,0x07,0x16,0x03,0x12,0x2d,0x02,0x84,0x11,0x1e,0x03,0x03,0x0a,0x19,0x83,0x33,0x33,0x3b,0x25,0x83,0x0a, +0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x31,0x30,0x25,0x23,0x15,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06, +0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x04,0x14,0x04,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0xfe,0xf0,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0x55,0x51,0xa9,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f, +0x57,0x53,0x94,0x94,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x01,0xd8,0xa6,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0x63,0x5e,0x01,0x0d,0x9e,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0x64,0x5e,0x00,0x00,0x03,0x00,0x60,0xfe,0x29,0x07,0x1a,0x04,0x18,0x00,0x1d,0x00,0x2b,0x00,0x39, +0x00,0x42,0x40,0x25,0x11,0x0f,0x36,0x95,0x16,0x10,0x22,0x95,0x0d,0x10,0x30,0x95,0x1c,0x16,0x28,0x95,0x07,0x16,0x03,0x1b,0x12,0x2d,0x02,0x84,0x11,0x1e,0x03,0x03,0x0a,0x19,0x83,0x33,0x33,0x3b,0x25,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f, +0xed,0x3f,0x31,0x30,0x25,0x23,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x04,0x14, +0x04,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0xfe,0xf0,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0x55,0x51,0xa9,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0x57,0x53,0x94,0xfd,0x95,0x02,0x85,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff, +0xfe,0xcb,0x01,0xd8,0xa6,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0x63,0x5e,0x01,0x0d,0x9e,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0x64,0x5e,0x00,0x01,0x00,0x16,0xff,0x6a,0x04,0xf0,0x06,0x30,0x00,0x03,0x00,0x18,0x40,0x0c,0x00,0x02,0xa0,0x03,0x01,0x0f,0x03,0x3f,0x03,0x02,0x03,0x02,0x00,0x2f,0x2f,0x5d,0x5d,0x01,0x2f,0xcd,0x31,0x30,0x01,0x01, +0x23,0x01,0x04,0xf0,0xfb,0xca,0xa4,0x04,0x36,0x06,0x30,0xf9,0x3a,0x06,0xc6,0x00,0xff,0xff,0x00,0x16,0xff,0x6a,0x05,0x12,0x06,0x30,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x06,0x07,0xe3,0x00,0x00,0xff,0xff,0x00,0x16,0xff,0x6a,0x04,0xf0,0x06,0x30,0x02,0x26,0x00,0x26,0x00,0x00,0x00,0x06,0x07,0xe3,0x00,0x00,0xff,0xff,0x00,0x21, +0xff,0x37,0x04,0x0b,0x04,0xd1,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x00,0xbc,0x01,0x59,0xff,0x37,0xff,0xff,0x00,0x12,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x07,0x00,0xd9,0xff,0xd4,0xfd,0xf5,0xff,0xff,0xff,0xef,0xff,0x6a,0x04,0xc9,0x06,0x30,0x02,0x26,0x00,0x37,0x00,0x00,0x00,0x06,0x07,0xe3, +0xd9,0x00,0x00,0x01,0x00,0x68,0xfe,0x92,0x03,0x0f,0x04,0x18,0x00,0x3c,0x00,0x57,0x40,0x31,0x3c,0x3a,0x95,0x02,0x0d,0x30,0x17,0x26,0x04,0x1c,0x36,0x1f,0x21,0x95,0x1c,0x10,0x08,0x36,0x20,0x09,0x30,0x09,0x40,0x09,0x03,0x09,0x0b,0x95,0x36,0x16,0x3c,0x3c,0x36,0x09,0x1f,0x1f,0x30,0x26,0x83,0x17,0x17,0x09,0x30,0x83,0x0d,0x0d, +0x3e,0x06,0x09,0x2f,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x11,0x39,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x11,0x39,0x3f,0xfd,0xc6,0x11,0x12,0x17,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33, +0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x07,0x06,0x07,0x16,0x17,0x16,0x33,0x32,0x37,0x02,0xc7,0x3a,0x5c,0x8c,0x46,0x3d,0x92,0x15,0x13,0x86,0xa1,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x42,0x6e,0x8d,0x4b,0x85,0x69,0x71,0x93,0x2e,0x4a,0x35,0x1d,0x1d,0x38,0x50, +0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x49,0x40,0x44,0x27,0x16,0x30,0x3c,0x48,0x47,0xfe,0xb7,0x25,0xa4,0x90,0x4b,0x09,0x0b,0xb0,0x63,0x90,0x29,0x39,0x2c,0x23,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x6f,0x4b,0x26,0x2e,0xa6,0x4a,0x15,0x26,0x35,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5a,0x3e,0x4c,0x70,0x4a,0x12,0x0f,0x03, +0x24,0x35,0x71,0x28,0x00,0x01,0x00,0x21,0xfe,0x92,0x03,0x70,0x04,0x00,0x00,0x13,0x00,0x30,0x40,0x19,0x13,0x11,0x95,0x02,0x0c,0x08,0x95,0x0a,0x0f,0x07,0x0d,0x96,0x06,0x13,0x09,0x08,0x09,0x0d,0x13,0x04,0x07,0x0c,0x0c,0x15,0x07,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x2f,0xed,0x39,0x3f,0xed,0x39,0x2f,0xfd,0xc6, +0x31,0x30,0x01,0x06,0x23,0x22,0x00,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x17,0x16,0x33,0x32,0x37,0x03,0x6a,0x3a,0x5c,0x96,0xfe,0xcf,0xb2,0x3a,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0x97,0x85,0x81,0x88,0x46,0x48,0x47,0xfe,0xb7,0x25,0x01,0x6e,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xad,0x2b,0x97,0x9e,0x28,0x00,0x00,0x01, +0x00,0x30,0x00,0x00,0x03,0xf6,0x06,0x02,0x00,0x19,0x00,0x29,0x40,0x14,0x13,0x08,0x10,0x01,0x0d,0x0b,0x95,0x10,0x01,0x00,0x84,0x01,0x01,0x0d,0x13,0x83,0x08,0x08,0x1b,0x0d,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x00,0x3f,0xfd,0xc6,0x2f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26, +0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x04,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x02,0x47,0xa3,0x5d,0x88,0x82,0x45,0xc1,0xe1,0xd8,0xa6,0xa1,0xde,0x01,0x29,0x01,0x1e,0x61,0x9e,0x63,0x4d,0x01,0xee,0x87,0xa2,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x83,0x6f,0x00,0xff,0xff,0x00,0x6c,0x04,0xc2, +0x01,0x31,0x05,0x85,0x02,0x06,0x00,0xdb,0x00,0x00,0x00,0x01,0xff,0x2b,0xfe,0x52,0x00,0xd4,0xff,0xe6,0x00,0x0e,0x00,0x0c,0xb3,0x05,0x0b,0x0c,0x0b,0x2f,0xcd,0x00,0x2f,0xc4,0x31,0x30,0x17,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x27,0x33,0x07,0x37,0xd4,0x9e,0x6b,0x4f,0x53,0x52,0x4f,0x6a,0x9d,0x1f,0x94,0x0f,0x61, +0x0e,0x94,0xd7,0x23,0x7b,0x39,0x8c,0x8c,0x39,0x7b,0x23,0x5b,0x40,0xa2,0xa2,0x40,0x00,0x03,0xfe,0xbd,0xfe,0x5c,0x01,0x43,0xff,0xc8,0x00,0x1a,0x00,0x26,0x00,0x32,0x00,0x34,0x40,0x1d,0x0e,0x06,0xc3,0x40,0x27,0x0f,0x1b,0x1f,0x1b,0x2f,0x1b,0x03,0x1b,0x80,0x2d,0x21,0xc3,0x13,0x00,0x30,0xf1,0x11,0x2a,0x1e,0xf1,0x03,0x24,0xf1, +0x2a,0x2f,0xfd,0xd4,0xed,0x10,0xd4,0xed,0x00,0x2f,0x33,0xed,0x32,0x1a,0xdc,0x5d,0x32,0x1a,0xed,0x32,0x31,0x30,0x17,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x32,0x17,0x16,0x17,0x36,0x37,0x36,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x23,0x32,0x36, +0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x8f,0x4b,0x69,0x69,0x4b,0x4b,0x35,0x08,0x07,0x07,0x09,0x34,0x4b,0x4b,0x69,0x69,0x96,0x34,0x09,0x07,0x07,0x08,0x35,0x4b,0x2c,0x3f,0x3f,0x2c,0x2c,0x3e,0x3e,0xf2,0x2c,0x3f,0x3f,0x2c,0x2c,0x3e,0x3e,0x38,0x6b,0x4b,0x4b,0x6b,0x36,0x08,0x0a,0x0a,0x08,0x36,0x6b,0x4b,0x4b,0x6b,0x35, +0x09,0x09,0x09,0x09,0x35,0xfe,0xdd,0x40,0x2d,0x2c,0x40,0x40,0x2c,0x2d,0x40,0x40,0x2d,0x2c,0x40,0x40,0x2c,0x2d,0x40,0x00,0x00,0x01,0xff,0x60,0x04,0xba,0x00,0xa0,0x06,0x70,0x00,0x07,0x00,0x16,0x40,0x09,0x05,0x06,0xdb,0x40,0x01,0x03,0x07,0x80,0x03,0x2f,0x1a,0xcd,0x00,0x2f,0xc6,0x1a,0xfd,0xcd,0x31,0x30,0x13,0x23,0x37,0x23, +0x13,0x33,0x07,0x33,0x5a,0x64,0x2d,0xc3,0x46,0x64,0x2d,0xc3,0x04,0xba,0xac,0x01,0x0a,0xac,0xff,0xff,0xfc,0xe6,0xfe,0x52,0x03,0x1a,0xff,0xd0,0x02,0x07,0x07,0x5d,0x00,0x00,0xf8,0x90,0xff,0xff,0x00,0x21,0xfe,0x74,0x04,0x50,0x04,0x18,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xe3,0xfa,0x31,0x00,0x0f,0x40,0x09, +0x02,0x10,0x1c,0x20,0x1c,0x40,0x1c,0x03,0x1c,0x00,0x11,0x5d,0x35,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x00,0x15,0x00,0x2c,0x40,0x17,0x0b,0x0a,0x08,0x91,0x0d,0x04,0x15,0x20,0x00,0x01,0x00,0x02,0x91,0x13,0x13,0x10,0x7d,0x05,0x05,0x17,0x0a,0x0a,0x00,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6, +0x5d,0x32,0x3f,0xfd,0xc6,0x32,0x31,0x30,0x37,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x27,0x68,0x9e,0xd8,0xe9,0x01,0x1f,0xfe,0xcd,0xf7,0xba,0x9a,0x86,0xcc,0x01,0x3e,0x01,0x9e,0xfe,0x90,0xfe,0xce,0xed,0x9f,0xdf,0x60,0x01,0x37,0x01,0x06,0x01,0x14,0x01,0x4a,0x56, +0xb3,0x3b,0xfe,0x58,0xfe,0xa8,0xfe,0xc0,0xfe,0x76,0x54,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x34,0xfd,0xb0,0x00,0x15,0x40,0x0e,0x01,0x1f,0x1c,0x01,0x0f,0x1c,0x5f,0x1c,0xcf,0x1c,0xff,0x1c,0x04,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0x68, +0xff,0xe8,0x04,0x96,0x05,0xb2,0x02,0x26,0x07,0xf2,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x23,0xfd,0xb0,0x00,0x15,0x40,0x0e,0x01,0x1f,0x1c,0x01,0x0f,0x1c,0x5f,0x1c,0xcf,0x1c,0xff,0x1c,0x04,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x03,0xa4,0x05,0x9a,0x00,0x09,0x00,0x26,0x40,0x13,0x01,0xee,0x08,0x03, +0x02,0x91,0x06,0x05,0x00,0x00,0x0b,0x07,0x03,0x7f,0x06,0x06,0x02,0x7e,0x07,0x2f,0xf1,0xc1,0x2f,0xed,0x11,0x12,0x39,0x2f,0x00,0x2f,0x2f,0xed,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x03,0xa4,0xfd,0xc1,0x99,0x99,0xa9,0x02,0xe8,0x04,0xfe,0xfb,0x98,0xfd,0xea,0x01,0x80,0x05,0x9a,0x00,0x00,0x01, +0x00,0xa6,0xfe,0x8b,0x02,0xdf,0x04,0x00,0x00,0x09,0x00,0x26,0x40,0x13,0x01,0x95,0x08,0x0f,0x02,0x96,0x06,0x05,0x00,0x00,0x0b,0x07,0x03,0xed,0x06,0x06,0x02,0x84,0x07,0x2f,0xf1,0xc1,0x2f,0xed,0x11,0x12,0x39,0x2f,0x00,0x2f,0x2f,0xed,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x02,0xdf,0xfe,0x6b, +0x8c,0x8c,0xa4,0x02,0x39,0x03,0x74,0xfd,0x0d,0xfe,0x0a,0x01,0x75,0x04,0x00,0x00,0xff,0xff,0xff,0xbb,0xff,0xe8,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x06,0x00,0xd8,0x98,0xc5,0x00,0x11,0x40,0x0b,0x02,0x10,0x2b,0x20,0x2b,0x70,0x2b,0xaf,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8, +0x04,0xff,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd8,0x02,0x5b,0xff,0xc5,0x00,0x11,0x40,0x0b,0x02,0x10,0x2b,0x20,0x2b,0x70,0x2b,0xaf,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xf8,0x00,0x00,0x02,0xa0,0x06,0x02,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xd5,0xfc,0xb7,0x00,0x0a, +0xb4,0x01,0x10,0x22,0x01,0x22,0x00,0x11,0x5d,0x35,0x00,0x03,0xff,0xc0,0x00,0x00,0x07,0x34,0x04,0x18,0x00,0x2c,0x00,0x36,0x00,0x3f,0x00,0xa3,0x40,0x2b,0x15,0x3e,0x0c,0x09,0x11,0x07,0x04,0x09,0x2c,0x28,0x02,0x96,0x23,0x28,0x35,0x37,0x2d,0x09,0x96,0x28,0x3e,0x3e,0x0b,0x02,0x19,0x01,0x0c,0x04,0x1e,0x31,0x19,0x03,0x3a,0x95, +0x20,0x1b,0x10,0x16,0x0f,0x06,0x01,0x0b,0x27,0xb8,0x01,0x03,0x40,0x0f,0x40,0x28,0x28,0x22,0x2d,0x00,0x84,0x01,0x0e,0x06,0x06,0x0b,0x42,0x14,0x10,0xb8,0x01,0x03,0x40,0x1b,0x40,0x11,0x16,0x17,0x3e,0x03,0x0a,0x84,0x0b,0x37,0x1e,0x35,0x03,0x05,0x84,0x06,0x0f,0x06,0x01,0x0c,0x03,0x40,0x41,0x06,0x84,0x30,0x30,0x2b,0x01,0x5f, +0x5e,0x5d,0x10,0xe1,0x17,0x39,0x18,0x2f,0xe1,0x17,0x39,0xd6,0x1a,0xed,0x33,0x2b,0x01,0x18,0x10,0xf4,0xf1,0x39,0x39,0xc0,0x2f,0x1a,0xed,0x00,0x2f,0x33,0x33,0x3f,0x3f,0x33,0xed,0x17,0x32,0x5f,0x5e,0x5d,0x12,0x39,0x2f,0xc4,0xed,0xd4,0x39,0x39,0x11,0x39,0xfd,0x11,0x39,0x11,0x39,0x39,0xc4,0x11,0x39,0x11,0x39,0x31,0x30,0x21, +0x23,0x11,0x26,0x25,0x11,0x23,0x11,0x24,0x27,0x11,0x23,0x11,0x06,0x07,0x06,0x15,0x23,0x36,0x37,0x36,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x15,0x36,0x37,0x36,0x35,0x33,0x06,0x07,0x06,0x07,0x27,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x04,0x25,0x35,0x10,0x23,0x22,0x07,0x06,0x07,0x16,0x06, +0x54,0xa4,0xb3,0xfe,0xd2,0xa4,0xfe,0xd1,0xb2,0xa4,0x21,0x16,0x38,0x77,0x02,0x5a,0x35,0x55,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0x1c,0x14,0x39,0x77,0x02,0x5b,0x34,0x4f,0xa4,0x69,0x7c,0x69,0x93,0x01,0x32,0xfe,0x2a,0xe9,0x6c,0x46,0x35,0x0d,0xb4,0x01,0x5a,0x05,0x42,0xfe,0x5f,0x01,0xc6,0x42,0x06,0xfd,0xf2, +0x01,0xfb,0x0d,0x15,0x35,0x50,0x88,0x58,0x34,0x15,0x01,0x83,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0x8a,0x0c,0x13,0x36,0x50,0x86,0x59,0x33,0x16,0x6c,0x76,0xaa,0x98,0xc0,0x86,0x2a,0x43,0x68,0x1d,0x01,0x2e,0x5b,0x44,0x64,0x07,0x00,0x02,0xff,0xc0,0x00,0x00,0x04,0xdc,0x04,0x18,0x00,0x25,0x00,0x30,0x00,0x5f,0x40,0x1a,0x0e,0x06, +0x02,0x13,0x25,0x96,0x1c,0x21,0x2f,0x28,0x09,0x96,0x21,0x12,0x12,0x08,0x16,0x2b,0x95,0x18,0x10,0x13,0x0f,0x01,0x08,0x20,0xb8,0x01,0x03,0x40,0x0b,0x21,0x21,0x1c,0x28,0x00,0x84,0x01,0x01,0x32,0x08,0x0d,0xb8,0x01,0x03,0xb7,0x0e,0x13,0x14,0x2f,0x03,0x07,0x84,0x08,0x2f,0xe1,0x17,0x39,0xd6,0xed,0x11,0x12,0x39,0x2f,0xf1,0x39, +0x39,0xc0,0x2f,0xed,0x00,0x2f,0x33,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xc4,0xed,0xd4,0x39,0x11,0x39,0xfd,0x11,0x39,0x39,0xc4,0x31,0x30,0x21,0x23,0x11,0x26,0x27,0x26,0x27,0x11,0x23,0x11,0x06,0x07,0x06,0x15,0x23,0x36,0x37,0x36,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x15,0x36,0x37,0x36,0x35,0x33,0x06,0x07,0x06, +0x07,0x25,0x16,0x17,0x35,0x10,0x23,0x22,0x07,0x06,0x07,0x16,0x03,0xf8,0xa4,0x6c,0x9a,0x9a,0x6a,0xa4,0x27,0x1a,0x2e,0x77,0x02,0x50,0x3b,0x59,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x25,0x19,0x2f,0x77,0x02,0x51,0x3b,0x56,0xfe,0x59,0x9a,0x69,0xee,0x7b,0x51,0x3f,0x0e,0x6c,0x01,0x63,0x14,0x3d,0x3d,0x14,0xfd,0xfb,0x02,0x04,0x0d,0x1e, +0x35,0x50,0x88,0x58,0x41,0x11,0x01,0x7a,0xaa,0xc2,0xd9,0xcd,0x91,0x0e,0x1d,0x36,0x50,0x86,0x59,0x41,0x12,0xd1,0x3d,0x14,0x68,0x01,0x46,0x5d,0x49,0x67,0x14,0x00,0xff,0xff,0xff,0xbb,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x98,0xf9,0xf2,0x00,0x11,0x40,0x0b,0x02,0x20,0x2b,0x5f, +0x2b,0x70,0x2b,0xe0,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xbb,0x00,0x00,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x98,0xfc,0xc8,0x00,0x11,0x40,0x0b,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0xaf,0x1e,0x04,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xa5,0x00,0x00,0x02,0xa2, +0x04,0x18,0x02,0x26,0x05,0x83,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x82,0xfc,0xc8,0x00,0x11,0x40,0x0b,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0xaf,0x1e,0x04,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x27,0xff,0xe8,0x03,0xac,0x04,0x18,0x00,0x26,0x00,0x56,0x28,0x00,0x00,0x06,0x08,0x5f,0x00,0x00,0xff,0xff,0xff,0xef,0xff,0xea, +0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xcc,0xfc,0xc8,0x00,0x13,0x40,0x0d,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0x8f,0x1e,0xaf,0x1e,0x05,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x5f,0xfc,0xc8, +0x00,0x13,0x40,0x0d,0x01,0x10,0x17,0x20,0x17,0x70,0x17,0x8f,0x17,0xaf,0x17,0x05,0x17,0x00,0x11,0x5d,0x35,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x04,0x56,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x44,0x40,0x26,0x0a,0x23,0x95,0x0d,0x0d,0x02,0x1d,0x05,0x40,0x0b,0x0f,0x48,0x05,0x07,0x95,0x02,0x10,0x16,0x1d,0x95,0x18,0x13,0x1c,0x05, +0x05,0x09,0x10,0x83,0x20,0x20,0x27,0x09,0x84,0x19,0x84,0x17,0x84,0x18,0x2f,0xe1,0xe1,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xc4,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x11,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x13,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x20,0x11,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27, +0x23,0x15,0x23,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xa6,0x02,0x1c,0xbe,0x8e,0xad,0x9d,0xfe,0x86,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xa4,0xa4,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x01,0xe4,0x02,0x34,0x48,0xa4,0x60,0xfe,0x6e,0x70,0xc4,0xfe,0xef,0xe6,0xfe,0xfb,0xfe,0xcc,0xa6, +0x8e,0x02,0x31,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0x00,0x00,0x01,0x00,0x7a,0x01,0xf6,0x03,0x37,0x05,0x9a,0x00,0x0b,0x00,0x3b,0x40,0x23,0x03,0x54,0x3f,0x08,0x4f,0x08,0x5f,0x08,0x8f,0x08,0x9f,0x08,0xaf,0x08,0x06,0x08,0x08,0x06,0x01,0x05,0x05,0x0c,0x0a,0x06,0x03,0x00,0x50,0x09,0x01,0x01,0x0d,0x08,0x04,0x50,0x05,0x2f, +0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0x37,0x6d,0xfe,0x1d,0x6d,0x6d,0x01,0xe3,0x6d,0x01,0xf6,0x01,0xa9,0xfe,0x57,0x03,0xa4,0xfe,0x67,0x01,0x99,0x00,0x00,0x02,0x00,0x60,0xfe,0x21,0x04,0x3f, +0x04,0x00,0x00,0x26,0x00,0x3c,0x00,0x54,0x40,0x30,0x38,0x0e,0x00,0x07,0x00,0x24,0x10,0x24,0x40,0x24,0x50,0x24,0x04,0x24,0x24,0x07,0x2c,0x95,0x1a,0x1b,0x09,0x06,0x95,0x07,0x0f,0x0e,0x84,0x05,0x08,0x38,0x24,0x31,0x00,0x08,0x07,0x07,0x08,0x00,0x03,0x1f,0x15,0x83,0x31,0x31,0x3e,0x27,0x83,0x1f,0x2f,0xe1,0x12,0x39,0x2f,0xe1, +0x11,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x12,0x39,0xe1,0x00,0x3f,0xed,0x39,0x3f,0xed,0x11,0x39,0x2f,0x5d,0x12,0x39,0x39,0x33,0x31,0x30,0x01,0x34,0x3e,0x02,0x37,0x21,0x35,0x21,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x03,0x14,0x1e,0x02,0x33,0x32, +0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x27,0x0e,0x03,0x01,0xd9,0x1d,0x33,0x45,0x29,0xfe,0x40,0x03,0x2d,0x58,0x90,0x66,0x37,0x42,0x64,0x74,0x64,0x42,0x4f,0x8b,0xbf,0x70,0x5b,0xaa,0x83,0x4e,0x37,0x6a,0x9a,0x63,0x14,0x11,0xd1,0x31,0x54,0x70,0x3f,0x48,0x7f,0x5e,0x36,0x15,0x3a,0x67,0x51,0x21,0x19,0x6e,0x84,0x46,0x16,0x02, +0x73,0x28,0x4d,0x43,0x37,0x12,0x8c,0x47,0x28,0x4f,0x4f,0x53,0x2d,0x32,0x4e,0x4c,0x53,0x6e,0x94,0x66,0x72,0xab,0x74,0x3a,0x37,0x6e,0xa5,0x6e,0x59,0x9b,0x85,0x70,0x2e,0x21,0x41,0xfd,0x87,0x4c,0x71,0x4b,0x25,0x27,0x4e,0x77,0x50,0x34,0x50,0x50,0x5c,0x3f,0x1a,0x17,0x36,0x6e,0x6e,0x6b,0xff,0xff,0x00,0x16,0xff,0xea,0x06,0xae, +0x05,0xec,0x00,0x26,0x00,0x57,0x00,0x00,0x00,0x27,0x00,0x4b,0x02,0xb6,0x00,0x00,0x00,0x06,0x08,0x06,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x00,0x05,0x18,0x05,0x9a,0x00,0x03,0x00,0x09,0xb2,0x03,0x03,0x02,0x00,0x2f,0x3f,0x31,0x30,0x01,0x01,0x23,0x01,0x05,0x18,0xfb,0xa2,0xa4,0x04,0x5e,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xff,0xff, +0x00,0x4a,0x00,0x00,0x02,0x46,0x04,0x00,0x02,0x26,0x05,0x6f,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x0c,0xfd,0x17,0x00,0x15,0x40,0x0e,0x01,0x0c,0x2f,0x0c,0x4f,0x0c,0x02,0xaf,0x0c,0xcf,0x0c,0xff,0x0c,0x03,0x00,0x5d,0x71,0x11,0x35,0x00,0xff,0xff,0xff,0xfb,0xff,0xf4,0x02,0x08,0x04,0x00,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07, +0x00,0xd9,0xff,0xbd,0xfd,0x17,0x00,0x15,0x40,0x0e,0x01,0x2f,0x0e,0x4f,0x0e,0x02,0xaf,0x0e,0xcf,0x0e,0xff,0x0e,0x03,0x0e,0x00,0x11,0x5d,0x71,0x35,0x00,0x00,0x03,0x00,0x22,0xfe,0x29,0x04,0xd5,0x04,0x18,0x00,0x19,0x00,0x23,0x00,0x2c,0x00,0x4b,0x40,0x29,0x14,0x21,0x05,0xe2,0x11,0x2a,0x06,0x06,0x1c,0x0a,0x26,0x95,0x0d,0x10, +0x08,0x0f,0x00,0x1c,0x95,0x18,0x16,0x03,0x1b,0x13,0x13,0x11,0x14,0x83,0x2b,0x20,0x20,0x2e,0x07,0x0a,0x2a,0x21,0x04,0x02,0x84,0x05,0x03,0x2f,0xc6,0xe1,0x17,0x39,0x12,0x39,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x23,0x11,0x23,0x11, +0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x16,0x17,0x33,0x15,0x23,0x06,0x07,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x15,0x14,0x01,0x26,0x23,0x22,0x07,0x06,0x07,0x21,0x26,0x01,0x4e,0x04,0xa4,0x84,0x84,0xa4,0x04,0x79,0xe9,0xc6,0x6f,0x65,0x09,0x82,0x84,0x0f,0x6b,0x7d,0xd9,0xc7,0x1e,0x53,0x7f, +0x95,0x54,0x45,0x0d,0xfd,0xa1,0x02,0x13,0x4f,0x87,0x8f,0x57,0x51,0x06,0x02,0x61,0x08,0x94,0xfd,0x95,0x03,0xaf,0x6d,0x01,0xbb,0xb4,0xcc,0x8a,0x7d,0xcc,0x6d,0xd1,0x85,0x9a,0xe2,0x58,0x72,0x5c,0x98,0x36,0x7f,0x02,0x0a,0x61,0x64,0x5d,0x88,0x91,0x00,0x02,0x00,0x22,0xff,0xe8,0x04,0x24,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0x3b, +0x40,0x1e,0x01,0x17,0x08,0xe2,0x11,0x0d,0x09,0x09,0x0f,0x0b,0x0f,0x13,0x95,0x04,0x16,0x12,0x12,0x01,0x16,0x10,0x84,0x0f,0x0f,0x1b,0x09,0x17,0x07,0x0c,0x84,0x0b,0x2f,0xe1,0x39,0x39,0xc6,0x12,0x39,0x2f,0xf1,0x39,0x39,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x33,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x01,0x23,0x15,0x10,0x21, +0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x01,0x32,0x11,0x35,0x21,0x15,0x10,0x04,0x24,0x6e,0xfe,0x64,0xfe,0x76,0x6e,0x6e,0xa1,0x01,0xe3,0xa2,0x6e,0xfd,0xff,0xf1,0xfe,0x1d,0x01,0xd8,0x32,0xfe,0x42,0x01,0xb2,0x3e,0x6d,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xfe,0x2d,0x01,0x2a,0x3c,0x36,0xfe, +0xd0,0x00,0x00,0x02,0x00,0x14,0xff,0xe8,0x04,0xae,0x04,0x00,0x00,0x1e,0x00,0x27,0x00,0x5e,0x40,0x31,0x12,0x26,0x1a,0xe2,0x0f,0x06,0x1d,0x1d,0x21,0x04,0x09,0x0d,0x03,0x01,0x95,0x0a,0x02,0x0f,0x21,0x95,0x16,0x16,0x0d,0x12,0x09,0x00,0x1a,0x04,0x09,0x04,0x12,0x1a,0x11,0x11,0x0c,0x0f,0x12,0x84,0x07,0x25,0x25,0x29,0x06,0x26, +0x84,0x01,0x1d,0x07,0x1a,0x2f,0xcd,0x33,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0x32,0x32,0xc1,0x2f,0x11,0x12,0x39,0x39,0x2f,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0xed,0x17,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x06,0x07,0x21,0x26,0x27,0x35,0x21,0x15,0x23,0x16,0x17, +0x33,0x15,0x23,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x23,0x35,0x33,0x36,0x13,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x16,0x01,0x1c,0xbc,0x01,0x7f,0xba,0x1c,0x02,0xb0,0x1c,0xb9,0x01,0x7e,0xb8,0x95,0x1c,0x53,0x4c,0x04,0x86,0x8a,0xf2,0xed,0x88,0x85,0x02,0x4c,0x54,0x1e,0xdc,0x5f,0xa1,0xa6,0x5b,0x54,0x06,0xfd,0x47,0x07,0x03, +0x74,0x8c,0x8e,0x55,0xd8,0xd8,0x55,0x8e,0x8c,0x6f,0xc0,0x6d,0xda,0x89,0x8d,0x8b,0x89,0xdc,0x6d,0xbe,0xfd,0xd8,0x69,0x66,0x5e,0xa2,0x9c,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x00,0x07,0x08,0x5b,0x03,0x05,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x96,0x04,0xa9,0x05,0xec,0x02,0x26, +0x00,0x47,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0xd2,0x00,0x00,0x00,0x09,0xb3,0x02,0x2a,0x2a,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x35,0xfe,0x96,0x02,0xa0,0x06,0x02,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x49,0x00,0x00,0x00,0x09,0xb3,0x01,0x21,0x21,0x09,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60, +0xfe,0x1e,0x05,0xfc,0x04,0x18,0x02,0x26,0x00,0x4a,0x00,0x00,0x00,0x27,0x08,0x5d,0x05,0x25,0x00,0x00,0x01,0x07,0x08,0x60,0x03,0xc2,0xfb,0x74,0x00,0x1b,0x40,0x0c,0x02,0x32,0x32,0x33,0x02,0x26,0x26,0x36,0x03,0x35,0x35,0x18,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96, +0x03,0xf9,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0x22,0x00,0x00,0x00,0x09,0xb3,0x01,0x0d,0x0d,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5c,0xfe,0x96,0x01,0xe3,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x0c,0x00,0x00,0x00,0x09,0xb3,0x01,0x10,0x10,0x00,0x10,0x3c,0x12, +0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x06,0xed,0x04,0x18,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x08,0x5d,0x06,0x16,0x00,0x00,0x00,0x09,0xb3,0x01,0x2c,0x2c,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x04,0x91,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0xba,0x00,0x00,0x00,0x09, +0xb3,0x01,0x1f,0x1f,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x08,0x5b,0x03,0x05,0x00,0x00,0xff,0xff,0x00,0x5c,0xfe,0x96,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x0c,0x00,0x00,0x00,0x09,0xb3,0x01,0x1d,0x1d, +0x06,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x68,0xfe,0x96,0x03,0xad,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x27,0x08,0x5d,0x02,0xd6,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0x73,0xfb,0x27,0x00,0x11,0xb7,0x02,0x3d,0x42,0x2d,0x01,0x30,0x30,0x3f,0x10,0x3c,0x12,0x34,0x00,0x10,0xf4,0x34,0x00,0xff,0xff,0xff,0x92,0xfe,0x1e, +0x03,0x4b,0x06,0x02,0x00,0x26,0x05,0x88,0x00,0x00,0x00,0x27,0x08,0x5d,0x02,0x74,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0x11,0xfb,0x74,0x00,0x1b,0x40,0x0c,0x01,0x22,0x22,0x24,0x01,0x17,0x17,0x26,0x02,0x25,0x25,0x04,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x0e,0xfe,0x96,0x04,0x06, +0x04,0x00,0x02,0x26,0x00,0x59,0x00,0x00,0x00,0x27,0x08,0x5d,0x03,0x2f,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0xcc,0xfb,0x3f,0x00,0x12,0xb7,0x02,0x1a,0x1a,0x02,0x01,0x0c,0x0c,0x1c,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0xff,0xff,0x00,0x1a,0xfe,0x96,0x03,0x92,0x04,0x00,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x07,0x08,0x5d, +0x02,0xbb,0x00,0x00,0x00,0x09,0xb3,0x01,0x14,0x14,0x02,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x21,0xfe,0x96,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x08,0x5d,0x02,0x93,0x00,0x00,0x00,0x09,0xb3,0x01,0x0a,0x0a,0x03,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5a,0xfe,0x96,0x04,0x71,0x04,0x18,0x02,0x26, +0x00,0x44,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0xc1,0x00,0x00,0x00,0x09,0xb3,0x02,0x20,0x20,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60,0xfe,0x96,0x04,0xfe,0x04,0x18,0x02,0x26,0x05,0x57,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x4e,0x00,0x00,0x00,0x09,0xb3,0x02,0x1e,0x1e,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60, +0xfe,0x96,0x05,0x21,0x06,0x02,0x02,0x26,0x05,0x5d,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x4e,0x00,0x00,0x00,0x09,0xb3,0x02,0x27,0x27,0x05,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60,0xfe,0xb4,0x04,0x84,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0xd4,0x00,0x1e,0x00,0x09,0xb3,0x02,0x1a,0x1a,0x06,0x10, +0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x52,0xfe,0x96,0x04,0x29,0x04,0x19,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0x79,0x00,0x00,0x00,0x09,0xb3,0x01,0x26,0x26,0x25,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x50,0xfe,0x96,0x03,0x3b,0x04,0x19,0x02,0x26,0x02,0x0e,0x00,0x00,0x01,0x07,0x08,0x5e,0x01,0x27,0x00,0x00, +0x00,0x09,0xb3,0x01,0x2d,0x2d,0x01,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x05,0xe0,0x04,0x18,0x00,0x26,0x02,0xce,0x00,0x00,0x00,0x27,0x08,0x5e,0x05,0x30,0x01,0xf4,0x01,0x07,0x08,0x60,0x02,0x70,0xfc,0xdd,0x00,0x12,0xb7,0x02,0x1a,0x1a,0x00,0x03,0x29,0x29,0x00,0x00,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34, +0xff,0xff,0x00,0x90,0xfe,0x96,0x02,0xd1,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x07,0x08,0x5e,0x02,0x21,0x00,0x00,0x00,0x09,0xb3,0x02,0x1c,0x1c,0x0f,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5a,0xfe,0x96,0x03,0x5a,0x04,0x18,0x02,0x26,0x05,0x5a,0x00,0x00,0x01,0x07,0x08,0x5e,0x01,0x33,0x00,0x00,0x00,0x09,0xb3,0x01, +0x21,0x21,0x01,0x10,0x3c,0x12,0x34,0x00,0x00,0x01,0xff,0x92,0xfe,0x1d,0x02,0x68,0x06,0x02,0x00,0x1f,0x00,0x28,0x40,0x15,0x17,0x95,0x09,0x0c,0x95,0x11,0x1c,0x02,0x95,0x1d,0x00,0x00,0x00,0x05,0x84,0x19,0x0e,0x09,0x83,0x15,0x19,0x2f,0xd6,0xe1,0xc4,0x10,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2f,0xed,0x31,0x30,0x01,0x26, +0x23,0x22,0x15,0x11,0x14,0x07,0x06,0x07,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x68,0x32,0x3c,0xaa,0x5d,0x4c,0x7d,0x7f,0x3b,0x35,0x34,0x3d,0x7d,0x99,0x32,0x3c,0xac,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfc,0x71,0xa2,0x60,0x4d,0x0e,0x67,0x9d, +0x1e,0x92,0x17,0xa0,0x8b,0x01,0x06,0x1a,0xdf,0x03,0x8d,0xa4,0xbe,0x12,0xff,0xff,0x00,0x90,0xfe,0x96,0x04,0xd0,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x20,0x00,0x00,0x00,0x09,0xb3,0x01,0x13,0x13,0x00,0x10,0x3c,0x12,0x34,0x00,0x00,0x01,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x00,0x23,0x00,0x53, +0x40,0x2f,0x09,0x96,0x11,0x11,0x0e,0x10,0x01,0x01,0x01,0x17,0x95,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x10,0x0d,0x95,0x0e,0x0f,0x1d,0xec,0x21,0x1c,0x11,0x0c,0x0b,0x10,0x0b,0x10,0x0b,0x16,0x0e,0x14,0x83,0x06,0x06,0x25,0x0e,0x1f,0x19,0x83,0x01,0x2f,0xed,0xc4,0x2f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12, +0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x39,0x2f,0x5d,0xed,0xc6,0x5d,0x12,0x39,0x2f,0xed,0x31,0x30,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x23,0xa5,0xb1,0xae,0xdf,0xde,0xce,0x52,0x01, +0x63,0xfd,0xdb,0x03,0x2d,0xfe,0x95,0xbc,0xea,0xfe,0xbc,0xf7,0x5f,0x58,0x7e,0x3c,0x34,0x34,0x3c,0x7f,0x98,0xb7,0x01,0x01,0x68,0x84,0x72,0x81,0x74,0x33,0x01,0x74,0x8c,0x33,0xfe,0x81,0x1a,0xb8,0xa0,0xae,0xd7,0x17,0x25,0x9d,0x1f,0x93,0x17,0x9f,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x88,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x48, +0xb3,0x0e,0x02,0x05,0x13,0x41,0x0d,0x01,0x0d,0x00,0x0b,0x01,0x0b,0x00,0x10,0x01,0x0a,0x00,0x00,0x01,0x08,0x00,0x17,0x01,0x0d,0x00,0x05,0x01,0x09,0x00,0x08,0x01,0x0c,0x40,0x09,0x11,0x0e,0x01,0x15,0x15,0x1d,0x0f,0x02,0x1b,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0x11,0x33,0x33,0xed,0x00,0x3f,0xed,0x3f, +0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x15,0x23,0x36,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0x15,0x15,0x66,0x7e,0x03,0x35,0x70,0x6e,0x8e,0x81,0x68,0x76,0x42,0x03,0x7e,0x7e,0x52,0x42,0x8e,0x90,0x40,0x52,0x04,0xbe,0x43,0x54,0xab,0x84,0x80,0x97, +0x61,0x50,0xb4,0x5e,0xb6,0xc2,0x5c,0x46,0x2e,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xec,0x04,0xd1,0x00,0x15,0x00,0x32,0xb1,0x0b,0x0d,0xba,0x01,0x0d,0x00,0x08,0x01,0x09,0xb6,0xc0,0x15,0xd0,0x15,0x02,0x15,0x13,0xba,0x01,0x0d,0x00,0x02,0x01,0x0b,0xb3,0x0b,0x15,0x17,0x10,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x10,0xc6,0x32, +0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x01,0xec,0x42,0x5b,0x7b,0x96,0xa2,0x87,0x4b,0x3a,0x3a,0x42,0x50,0x60,0x5b,0x51,0x44,0x3c,0x02,0xb2,0x29,0x9b,0x7c,0x8a,0xa7,0x24,0x6c,0x2c,0x6c,0x58,0x56,0x66, +0x31,0x00,0x00,0x02,0x00,0x3d,0x02,0x48,0x02,0x10,0x04,0xd1,0x00,0x1d,0x00,0x26,0x00,0x5b,0xb5,0x05,0x00,0x0a,0x1c,0x0d,0x0f,0xba,0x01,0x0d,0x00,0x0a,0x01,0x09,0x40,0x0d,0x25,0xbf,0x16,0x01,0x00,0x16,0x10,0x16,0x20,0x16,0x03,0x16,0x20,0xbb,0x01,0x0d,0x00,0x03,0x00,0x1c,0x01,0x0b,0x40,0x0f,0x03,0x05,0x00,0x03,0x03,0x19, +0x07,0x1e,0x14,0x12,0x23,0x19,0x0d,0x28,0x12,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xed,0x10,0xd4,0xd4,0xcd,0x11,0x39,0x39,0x11,0x12,0x17,0x39,0x2f,0x00,0x3f,0xc4,0xfd,0xd4,0x5d,0x5d,0xcd,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x13,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15, +0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0xdb,0x10,0x03,0x59,0x07,0x1c,0x55,0xa2,0x88,0x4b,0x3a,0x39,0x40,0x4f,0x64,0x21,0x4d,0x58,0x3d,0x4d,0x6d,0x54,0x45,0x0d,0x2d,0x24,0x1e,0x2f,0x3c,0x36,0x02,0x9e,0x27,0x2f,0x49,0x3d,0x4e,0x84,0x8a,0xa7,0x24,0x6c,0x2c,0x6d, +0x59,0x4c,0x2a,0x4d,0x42,0x32,0x42,0x3f,0x71,0x13,0x0f,0x12,0x20,0x00,0x00,0x02,0x00,0x3e,0x02,0x8a,0x02,0x7f,0x05,0xd4,0x00,0x1c,0x00,0x27,0x00,0x62,0x40,0x10,0x16,0x14,0x17,0x02,0x1c,0x01,0x06,0x15,0x00,0x15,0x00,0x15,0x1a,0x06,0x09,0x1d,0xbe,0x01,0x0d,0x00,0x0f,0x01,0x09,0x00,0x23,0x01,0x0d,0x00,0x09,0x01,0x0b,0x40, +0x10,0x01,0x1c,0x01,0x02,0x03,0x06,0x16,0x17,0x14,0x11,0x03,0x26,0x19,0x19,0x0c,0x06,0xb8,0x01,0x0c,0xb3,0x26,0x26,0x29,0x20,0xb9,0x01,0x0c,0x00,0x0c,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xc6,0x12,0x17,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0xc4,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x31,0x30, +0x01,0x17,0x07,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x26,0x27,0x07,0x27,0x37,0x26,0x27,0x33,0x16,0x17,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x02,0x38,0x21,0x8a,0x22,0x22,0x6c,0x9d,0x86,0x86,0x98,0x9d,0x86,0x32,0x2c,0x02,0x28,0x2e,0xb6,0x1e,0x95,0x43,0x4f,0xa4, +0x2a,0x2b,0x30,0x4d,0x58,0x56,0x4d,0x49,0x54,0x05,0xd4,0x47,0x37,0x26,0x2f,0x94,0xb8,0x83,0xa8,0x99,0x83,0x85,0xa5,0x16,0x02,0x40,0x32,0x48,0x49,0x3b,0x38,0x2e,0x17,0x26,0xfe,0xd1,0x64,0x57,0x53,0x62,0x64,0x53,0xb9,0x00,0x00,0x01,0x00,0x42,0x02,0x89,0x01,0xdf,0x04,0xcf,0x00,0x1e,0x00,0x55,0xb1,0x1d,0x0d,0xb8,0x01,0x0d, +0x40,0x09,0x0e,0x0e,0x18,0x08,0xb0,0x15,0x01,0x15,0x13,0xbf,0x01,0x0d,0x00,0x18,0x01,0x09,0x00,0x06,0x00,0x08,0x01,0x0d,0x00,0x03,0x01,0x0b,0xb2,0x16,0x0e,0x1b,0xb8,0x01,0x0c,0xb6,0x11,0x0e,0x16,0x11,0x03,0x06,0x01,0xb8,0x01,0x0c,0xb3,0x0a,0x0a,0x20,0x06,0x2f,0x12,0x39,0x2f,0xed,0x12,0x17,0x39,0x2f,0xed,0x2f,0x2f,0x00, +0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x71,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x00,0x15,0x14,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x01,0xdf,0xfb,0x59,0x49,0x3e,0x55,0x87,0x9e,0x32,0x30,0x8c,0x71,0x49,0x3e,0x40,0x4d,0x6d, +0x81,0x67,0x03,0x9c,0x6f,0xa4,0x1b,0x64,0x1c,0x49,0x4c,0x63,0x47,0x41,0x1c,0x68,0x17,0x51,0x49,0x5a,0x1f,0x04,0x00,0x01,0x00,0x0a,0x02,0x9a,0x01,0x83,0x05,0xd3,0x00,0x14,0x00,0x33,0xb9,0x00,0x02,0x01,0x0d,0xb2,0x12,0x08,0x0c,0xbd,0x01,0x0d,0x00,0x05,0x00,0x0d,0x01,0x08,0x00,0x0a,0x01,0x0a,0x40,0x09,0x06,0x06,0x00,0x05, +0x09,0xcd,0x0e,0x0c,0x0a,0x2f,0xc6,0x33,0xfd,0x32,0xc4,0x39,0x2f,0x00,0x3f,0x3f,0x33,0xed,0x32,0xd4,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x83,0x1b,0x22,0x60,0x82,0x82,0x80,0x5c,0x5c,0x79,0x62,0x2a,0x18,0x05,0x59,0x0f,0x61,0x49,0x6a, +0xfe,0x46,0x01,0xba,0x6a,0x4d,0x62,0x66,0x0a,0x00,0x00,0x01,0xff,0xdd,0x01,0x94,0x01,0x56,0x04,0xbe,0x00,0x14,0x00,0x48,0x40,0x0b,0x0e,0x0c,0x0a,0xcd,0x09,0x06,0x06,0x00,0x05,0x09,0x09,0xba,0x01,0x08,0x00,0x02,0x01,0x0d,0x40,0x13,0x0f,0x12,0x1f,0x12,0x02,0x2f,0x12,0x3f,0x12,0x9f,0x12,0xaf,0x12,0xbf,0x12,0x05,0x12,0x0b, +0x08,0xbb,0x01,0x0d,0x00,0x0e,0x00,0x05,0x01,0x0a,0x00,0x3f,0x33,0xed,0x32,0xd4,0x5d,0x71,0xed,0x3f,0x01,0x2f,0x33,0xc4,0x39,0x2f,0x10,0xfd,0xc6,0x33,0x31,0x30,0x03,0x16,0x33,0x32,0x35,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x1b,0x22,0x60,0x82,0x82,0x80,0x5c,0x5c,0x79,0x62, +0x2a,0x18,0x02,0x0e,0x0f,0x61,0x58,0x6a,0x01,0x9c,0xfe,0x64,0x6a,0x5c,0x62,0x66,0x0a,0x00,0xff,0xff,0x00,0x3e,0x01,0x94,0x02,0x60,0x04,0xcf,0x02,0x06,0x07,0xaf,0x00,0x00,0x00,0x01,0x00,0x5c,0x01,0xa4,0x02,0x46,0x04,0xbe,0x00,0x11,0x00,0x30,0x41,0x0a,0x00,0x0c,0x01,0x0d,0x00,0x01,0x00,0x05,0x01,0x0b,0x00,0x10,0x00,0x08, +0x01,0x08,0x00,0x11,0x01,0x0c,0xb4,0x01,0x10,0x10,0x13,0x09,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x33,0x3f,0xc6,0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x46,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x80,0x01,0xa4, +0x01,0x4c,0x67,0xe7,0x01,0x4e,0xfe,0xce,0x98,0x53,0x40,0x01,0x37,0x00,0x00,0x02,0x00,0x0f,0x02,0x9a,0x01,0x3f,0x05,0xc4,0x00,0x0b,0x00,0x13,0x00,0x48,0x40,0x19,0x01,0x05,0x0a,0x1f,0x06,0x01,0x06,0x40,0x0c,0x10,0x48,0x06,0x06,0x08,0x03,0x0c,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x10,0x08,0xba,0x01,0x08,0x00,0x03,0x01,0x0a, +0xb3,0x0b,0x12,0x0a,0x02,0xb8,0x01,0x0c,0xb3,0x0e,0x06,0x07,0x03,0x2f,0xc4,0xc4,0xc4,0xfd,0x32,0xc4,0xc4,0x00,0x3f,0x3f,0xd4,0x5d,0xcd,0x11,0x12,0x39,0x2f,0x2b,0x71,0x33,0xcd,0x32,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x03,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x01,0x3f,0x57,0x82,0x57,0x57, +0x82,0x57,0x99,0x4e,0x50,0x4e,0x03,0x91,0xf7,0xf7,0x56,0xd7,0xd7,0x01,0x46,0x4c,0x4b,0x4b,0x4c,0x00,0x00,0x01,0x00,0x66,0x02,0x8b,0x01,0x72,0x04,0xbe,0x00,0x0b,0x00,0x1f,0x41,0x0a,0x00,0x05,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0b,0x00,0x06,0x01,0x0c,0x00,0x05,0x2f,0xfd,0xc6,0x00,0x3f,0xed,0x3f,0x31, +0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x72,0x25,0x3c,0xab,0x82,0x50,0x22,0x18,0x02,0x9b,0x10,0xb5,0x01,0x7e,0xfe,0x8a,0x52,0x12,0x00,0x01,0x00,0x11,0x02,0x9a,0x01,0x51,0x04,0xbe,0x00,0x0b,0x00,0x2e,0xb1,0x0b,0x07,0xbf,0x01,0x0d,0x00,0x08,0x01,0x08,0x00,0x01,0x00,0x04,0x01,0x0d,0x00,0x03, +0x01,0x0a,0xb2,0x0a,0x01,0x00,0xb8,0x01,0x0c,0xb2,0x07,0x04,0x05,0x2f,0xcd,0x32,0xfd,0xcd,0x32,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x13,0x33,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0xf2,0x5f,0xfe,0xc0,0x5f,0x5f,0x01,0x40,0x5f,0x02,0xf0,0x56,0x56,0x01,0x78,0x56,0x56,0x00,0x00,0x01,0x00,0x11,0x02,0x9a, +0x01,0x51,0x04,0xbe,0x00,0x13,0x00,0x44,0x40,0x09,0x01,0x09,0xcb,0x12,0x0a,0x0a,0x06,0x11,0x0d,0xbf,0x01,0x0d,0x00,0x0e,0x01,0x08,0x00,0x02,0x00,0x06,0x01,0x0d,0x00,0x05,0x01,0x0a,0xb4,0x00,0x0f,0x03,0x12,0x02,0xb8,0x01,0x0c,0xb4,0x0e,0x0a,0x06,0x0b,0x07,0x2f,0x33,0xcd,0x32,0x32,0xfd,0x32,0xcd,0x32,0x32,0x00,0x3f,0xed, +0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x01,0x49,0x57,0x5f,0xfe,0xc0,0x5f,0x57,0x57,0x5f,0x01,0x40,0x5f,0x57,0x03,0x91,0xa1,0x56,0x56,0xa1,0x56,0x81,0x56,0x56,0x81,0x00,0x00,0x03,0xff,0x87,0x01,0x94, +0x01,0x6d,0x05,0xc4,0x00,0x11,0x00,0x19,0x00,0x21,0x00,0x51,0x40,0x1f,0x02,0x00,0x14,0x0f,0x0c,0x00,0x0a,0x18,0x00,0x18,0x40,0x04,0x50,0x04,0x02,0x2f,0x04,0x3f,0x04,0x02,0x04,0x1a,0x0f,0x1e,0x1f,0x1e,0x2f,0x1e,0x03,0x1e,0x0d,0xb8,0x01,0x0a,0xb3,0x11,0x20,0x02,0x0e,0xb8,0x01,0x0c,0xb5,0x1c,0x0d,0x16,0x07,0x12,0x0d,0x2f, +0x33,0xd4,0xcd,0x10,0xc4,0xfd,0x32,0xc4,0xc6,0x00,0x3f,0xd4,0x5d,0xcd,0x2f,0x5d,0x5d,0xcd,0xc4,0x10,0xd4,0x11,0x39,0x39,0xcd,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x16,0x17,0x25,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x13,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x01, +0x6d,0x45,0x47,0x23,0xb1,0x3a,0x4c,0x65,0x52,0x15,0x13,0x82,0x44,0x41,0xfe,0xf9,0x14,0x14,0x58,0x32,0x4b,0x43,0x4e,0x50,0x4e,0x01,0xcf,0x39,0x1c,0x90,0x42,0x33,0x3b,0x4f,0x02,0x02,0x2d,0xfd,0xbb,0x18,0x2e,0x0b,0x03,0x33,0x27,0x03,0x46,0x4c,0x4b,0x4b,0x4c,0x00,0x00,0x01,0x00,0x66,0x01,0x98,0x01,0x72,0x05,0xc4,0x00,0x0b, +0x00,0x1b,0xbb,0x00,0x05,0x01,0x07,0x00,0x09,0x01,0x0d,0xb2,0x02,0x0b,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xfd,0xc6,0x00,0x2f,0xed,0x3f,0x31,0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x72,0x25,0x3c,0xab,0x82,0x50,0x22,0x18,0x01,0xa8,0x10,0xb5,0x03,0x77,0xfc,0x91,0x52,0x12,0x00,0x01,0x00,0x31, +0x01,0xcb,0x01,0x3d,0x05,0xc4,0x00,0x0e,0x00,0x38,0xbb,0x00,0x00,0x01,0x07,0x00,0x0b,0x01,0x0d,0xb3,0x50,0x06,0x01,0x06,0xb8,0xff,0xc0,0xb5,0x09,0x0c,0x48,0x06,0x02,0x0e,0xbf,0x01,0x0a,0x00,0x09,0x00,0x03,0x01,0x0c,0x00,0x0d,0x00,0x01,0x01,0x0c,0x00,0x00,0x2f,0xfd,0xd5,0xfd,0xc4,0x00,0x3f,0xd5,0xd4,0x2b,0x71,0xed,0x3f, +0x31,0x30,0x13,0x33,0x11,0x33,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x23,0x66,0x80,0x57,0x64,0x63,0x25,0x20,0x1d,0x23,0x59,0x0a,0x6e,0x05,0xc4,0xfc,0xf3,0x6f,0x7d,0x0b,0x61,0x10,0x73,0x00,0x00,0x01,0x00,0x66,0x02,0x96,0x01,0xb4,0x04,0xc4,0x00,0x05,0x00,0x20,0xbb,0x00,0x02,0x01,0x06,0x00,0x04,0x01,0x0d,0xb5, +0x01,0xff,0x00,0x00,0x07,0x04,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xed,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x13,0x33,0x01,0xb3,0xfe,0xb3,0x7f,0x01,0xce,0x02,0x96,0x02,0x2e,0xfe,0x3c,0x00,0x00,0x01,0x00,0x66,0x01,0x98,0x03,0x9a,0x04,0xcf,0x00,0x25,0x00,0x65,0xb9,0x00,0x24,0x01,0x0d,0x40,0x09,0x1f, +0x1d,0x00,0x08,0x13,0x18,0x05,0x16,0x10,0xba,0x01,0x0a,0x00,0x11,0x01,0x08,0xb2,0x1a,0x03,0x0b,0xba,0x01,0x0d,0x00,0x16,0x01,0x09,0xb3,0x18,0x07,0x13,0x1d,0xb8,0x01,0x0c,0x40,0x0a,0x40,0x22,0x00,0x0e,0x08,0x10,0x08,0x42,0x13,0x0f,0xbb,0x01,0x0c,0x00,0x10,0x00,0x07,0x01,0x0c,0xb3,0x08,0x08,0x27,0x26,0x11,0x12,0x39,0x2f, +0xed,0x2f,0xed,0x32,0x2b,0x01,0x18,0x10,0xf4,0xc6,0x1a,0xed,0x11,0x12,0x39,0x00,0x3f,0xed,0x39,0x39,0x3f,0x3f,0x12,0x17,0x39,0xd4,0xed,0x31,0x30,0x01,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x11,0x02,0x23,0x22,0x27,0x35, +0x16,0x33,0x32,0x03,0x1a,0x68,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x01,0xd9,0x2b,0x25,0x22,0x23,0x65,0x02,0x9a,0x01,0x3b,0x8f,0x54,0x3f,0xfe,0xc9,0x01,0x3f,0x8b,0x52,0x45,0xfe,0xcd,0x02,0x24,0x52,0x63,0x6f,0x6f,0xe3,0xfe,0xba,0xfe,0xf2,0x10,0x68,0x14,0x00,0x00,0x01,0x00,0x60, +0x01,0xa4,0x03,0x94,0x04,0xbe,0x00,0x1d,0x00,0x56,0xb4,0x07,0x18,0x02,0x03,0x10,0xb8,0x01,0x0d,0xb2,0x05,0x01,0x09,0xb8,0x01,0x0b,0xb2,0x1c,0x14,0x0c,0xb8,0x01,0x08,0xb3,0x07,0x01,0x14,0x1d,0xb8,0x01,0x0c,0x40,0x09,0x40,0x01,0x1c,0x0e,0x14,0x0c,0x14,0x42,0x0d,0xbb,0x01,0x0c,0x00,0x0c,0x00,0x15,0x01,0x0c,0xb3,0x14,0x14, +0x1f,0x1e,0x11,0x12,0x39,0x2f,0xed,0x2f,0xed,0x2b,0x01,0x18,0x10,0xf4,0x32,0x1a,0xed,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0xc6,0x33,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0x94, +0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x7f,0x69,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x01,0xa4,0x01,0x48,0x63,0x6f,0x6f,0xe3,0x01,0x52,0xfe,0xc5,0x8f,0x54,0x3f,0x01,0x37,0xfe,0xc1,0x8b,0x52,0x46,0x01,0x32,0x00,0x01,0xff,0xbc,0x01,0x98,0x02,0x50,0x04,0xcf,0x00,0x19,0x00,0x3e,0xb1,0x0c,0x16,0xbe,0x01,0x0d,0x00,0x0f, +0x01,0x09,0x00,0x0a,0x01,0x08,0x00,0x07,0x01,0x0d,0xb3,0x02,0x00,0x09,0x13,0xba,0x01,0x0a,0x00,0x12,0x01,0x0c,0xb4,0x13,0x13,0x1b,0x0b,0x00,0xb8,0x01,0x0c,0xb1,0x05,0x09,0x2f,0xc6,0xed,0x32,0x12,0x39,0x2f,0xed,0x00,0x3f,0x33,0x33,0xd4,0xed,0x3f,0x3f,0xed,0x32,0x31,0x30,0x13,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35, +0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0xe6,0xda,0x2b,0x25,0x22,0x23,0x65,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x02,0xa6,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x02,0x24,0x56,0x67,0xe7,0xfe,0xb2,0x01,0x33,0x97,0x54,0x3f,0x00,0x01,0x00,0x66,0x01,0x98,0x02,0xfa,0x04,0xcf,0x00,0x19, +0x00,0x3f,0xb1,0x14,0x0c,0xbe,0x01,0x0d,0x00,0x17,0x01,0x09,0x00,0x12,0x01,0x08,0x00,0x02,0x01,0x0d,0xb3,0x07,0x00,0x09,0x11,0xbb,0x01,0x0a,0x00,0x04,0x00,0x00,0x01,0x0c,0xb4,0x09,0x09,0x1b,0x13,0x10,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xc6,0x00,0x3f,0x33,0x33,0xd4,0xed,0x3f,0x3f,0xed,0x32,0x31, +0x30,0x01,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x65,0x23,0x22,0x25,0x2b,0xd9,0x6d,0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x9e,0x14,0x68,0x10,0x01,0x0e,0x01,0x27,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7, +0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x6a,0x04,0xbe,0x00,0x13,0x00,0x26,0xbd,0x00,0x0a,0x01,0x08,0x00,0x09,0x01,0x0a,0x00,0x00,0x01,0x0c,0xb5,0x01,0x11,0x11,0x15,0x0b,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33, +0x13,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x02,0x6a,0x7f,0xea,0x14,0x07,0x02,0x02,0x80,0x84,0xe5,0x12,0x09,0x02,0x04,0x82,0x02,0x9a,0x01,0x4d,0x1c,0x0d,0x1d,0x2a,0xfe,0xd1,0x02,0x24,0xfe,0xbc,0x18,0x12,0x1c,0x22,0x01,0x30,0x00,0x03,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xcf,0x00,0x0b,0x00,0x14,0x00,0x1d,0x00,0x3f,0xb9,0x00, +0x13,0x01,0x0d,0xb3,0x19,0x19,0x0e,0x15,0xbe,0x01,0x0d,0x00,0x06,0x01,0x09,0x00,0x0e,0x01,0x0d,0x00,0x00,0x01,0x0b,0xb3,0x1a,0x19,0x13,0x09,0xb8,0x01,0x0c,0xb3,0x12,0x12,0x1f,0x13,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x26, +0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x16,0x13,0x22,0x07,0x06,0x07,0x21,0x26,0x27,0x26,0x01,0x58,0x80,0x9a,0xa2,0x84,0x80,0x9b,0xa3,0xf2,0x2c,0x48,0x49,0x2b,0x21,0x08,0xfe,0xc5,0x08,0x96,0x49,0x2c,0x1d,0x0a,0x01,0x38,0x0a,0x1e,0x2b,0x02,0x89,0x9e,0x7f,0x87,0xa2,0x9f,0x7e, +0x88,0xa1,0x97,0x2c,0x2c,0x21,0x40,0x40,0x01,0x23,0x2c,0x1e,0x36,0x37,0x1e,0x2b,0x00,0x03,0x00,0x3e,0x01,0xa4,0x02,0xb1,0x05,0xc4,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x54,0xb1,0x1c,0x26,0xb8,0x01,0x0d,0xb2,0x0c,0x0a,0x09,0xbb,0x01,0x09,0x00,0x1d,0x00,0x25,0x01,0x0d,0xb5,0x14,0x40,0x00,0x01,0x00,0x01,0xb8,0x01,0x0b,0xb2, +0x0c,0x1d,0x15,0xb8,0x01,0x0c,0xb5,0x09,0x25,0x00,0x00,0x05,0x10,0xb8,0x01,0x0c,0xb3,0x18,0x18,0x29,0x21,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x00,0x3f,0xcd,0x5d,0x33,0xed,0x32,0x3f,0xcd,0x33,0xed,0x32,0x31,0x30,0x01,0x35,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37, +0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x13,0x36,0x35,0x34,0x27,0x26,0x27,0x11,0x36,0x01,0x06,0x15,0x14,0x17,0x16,0x17,0x11,0x06,0x01,0x36,0x6e,0x3d,0x4d,0x51,0x3d,0x6a,0x82,0x6e,0x3d,0x4e,0x52,0x3e,0x69,0x4c,0x2c,0x2c,0x1b,0x31,0x31,0xff,0x00,0x2b,0x2c,0x1b,0x31,0x31,0x01,0xa4,0xe8,0x0d,0x3f,0x4f, +0x7f,0x87,0x51,0x3d,0x0f,0xfa,0xf8,0x0d,0x40,0x4f,0x7e,0x88,0x51,0x3d,0x0f,0xe9,0x01,0x81,0x31,0x56,0x58,0x30,0x1e,0x0b,0xfe,0x9d,0x0c,0x01,0x2d,0x31,0x56,0x56,0x31,0x1f,0x0c,0x01,0x63,0x0b,0x00,0x01,0x00,0x42,0x01,0xe2,0x01,0xa1,0x04,0xd1,0x00,0x2b,0x00,0x4f,0xb1,0x03,0x08,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x12,0x48,0x08, +0x10,0x27,0x16,0x21,0x04,0x19,0x0e,0xbe,0x01,0x0d,0x00,0x2a,0x01,0x0b,0x00,0x1e,0x01,0x0d,0x00,0x19,0x01,0x09,0xb7,0x1b,0x21,0xcd,0x16,0x1b,0x16,0x0c,0x27,0xb8,0x01,0x0c,0xb5,0x10,0x10,0x2d,0x05,0x01,0x0c,0x2f,0xcd,0xc4,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0xed,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0xd4,0x2b, +0xcd,0x31,0x30,0x13,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x97,0x4a,0x21,0x21,0x24,0x29,0x45,0x4f,0x3f,0x41,0x60,0x2b,0x3c,0x47,0x31,0x71,0x5a, +0x44,0x36,0x31,0x3e,0x31,0x27,0x24,0x3d,0x48,0x37,0x6c,0x5f,0x24,0x02,0x92,0x12,0x53,0x13,0x4d,0x11,0x4e,0x47,0xa7,0x36,0x3b,0x20,0x29,0x1d,0x24,0x4c,0x37,0x45,0x5c,0x19,0x6f,0x29,0x23,0x18,0x21,0x27,0x1d,0x23,0x4e,0x36,0x47,0x5b,0x00,0x01,0xff,0xc9,0x01,0x94,0x01,0x83,0x05,0xd3,0x00,0x15,0x00,0x2d,0xbc,0x00,0x02,0x01, +0x0d,0x00,0x13,0x00,0x0d,0x01,0x0d,0x40,0x0d,0x40,0x08,0x50,0x08,0x02,0x2f,0x08,0x3f,0x08,0x02,0x08,0x01,0x05,0xb8,0x01,0x0c,0xb1,0x0b,0x0f,0x2f,0xc6,0xfd,0xc6,0x00,0x2f,0x5d,0x5d,0xed,0x2f,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x01, +0x83,0x1b,0x22,0x60,0x79,0x62,0x2a,0x18,0x1b,0x22,0x60,0x79,0x62,0x2a,0x18,0x05,0x59,0x0f,0x61,0xfd,0x55,0x62,0x66,0x0a,0x70,0x0f,0x61,0x02,0xab,0x62,0x66,0x0a,0x00,0x01,0x00,0x0a,0x01,0xe2,0x01,0x68,0x05,0x62,0x00,0x1d,0x00,0x53,0xb1,0x08,0x03,0xb8,0xff,0xc0,0xb6,0x0c,0x11,0x48,0x03,0x0c,0x1d,0x1b,0xbb,0x01,0x0d,0x00, +0x00,0x00,0x0c,0x01,0x0b,0xb4,0x14,0x15,0x18,0x15,0x0f,0xba,0x01,0x0d,0x00,0x12,0x01,0x08,0x40,0x0a,0x06,0x0a,0x17,0x1d,0x1d,0x1f,0x0f,0x18,0x0f,0x15,0xb8,0x01,0x0c,0xb1,0x11,0x12,0x2f,0xcd,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xc4,0xcd,0xc4,0x00,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0x33,0xfd,0xc6,0x10,0xd4,0x2b,0xcd,0x31, +0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x15,0x14,0x33,0x32,0x37,0x01,0x68,0x4f,0x45,0x29,0x24,0x21,0x21,0x4a,0x0d,0xa0,0x5c,0x5c,0x80,0x82,0x82,0x49,0x1e,0x1b,0x02,0x77,0x47,0x4e,0x11,0x4d,0x13,0x53,0x0e,0xbe,0x01,0x08,0x6a,0x80, +0x24,0xa4,0x6a,0xfe,0x5e,0x10,0x00,0x02,0x00,0x05,0x02,0x89,0x02,0x9d,0x04,0xbe,0x00,0x15,0x00,0x1d,0x00,0x59,0xb4,0x1b,0x1a,0x01,0x03,0x0a,0xb8,0x01,0x0d,0x40,0x09,0x14,0x10,0x5f,0x0d,0x01,0x0d,0x0d,0x12,0x0e,0xbf,0x01,0x08,0x00,0x04,0x00,0x16,0x01,0x0d,0x00,0x07,0x01,0x0b,0x00,0x03,0x01,0x0a,0xb5,0x15,0x1a,0x03,0x01, +0x03,0x13,0xb8,0x01,0x0c,0xb5,0x12,0x12,0x1f,0x1c,0x0a,0x0f,0xb8,0x01,0x0c,0xb1,0x0c,0x0e,0x2f,0xc6,0xed,0x39,0x39,0x12,0x39,0x2f,0xfd,0x17,0x39,0xc6,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x33,0x39,0x2f,0x71,0x33,0x33,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x35,0x23,0x35,0x33,0x35,0x33,0x15, +0x33,0x35,0x33,0x15,0x33,0x05,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x02,0x9d,0x57,0x80,0x02,0x3b,0x79,0xb4,0x57,0x57,0x7f,0xeb,0x80,0x57,0xfe,0xab,0x39,0x45,0xeb,0x03,0x91,0xf7,0x56,0x67,0xe7,0x21,0x56,0xd7,0xd7,0xd7,0xd7,0xf3,0x53,0x40,0x0a,0x05,0x98,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xbe,0x00,0x1b,0x00,0x4f, +0xb4,0x04,0x0e,0x12,0x03,0x01,0xbf,0x01,0x0d,0x00,0x0f,0x00,0x02,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x17,0x01,0x0b,0x40,0x0c,0x12,0x14,0x0f,0x00,0x1a,0x03,0x0f,0x03,0x0c,0x06,0x10,0x14,0xb8,0x01,0x0c,0xb3,0x0c,0x0c,0x1d,0x06,0xb8,0x01,0x0c,0xb1,0x02,0x1a,0x2f,0xc4,0xed,0x12,0x39,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f, +0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0xed,0x17,0x32,0x31,0x30,0x13,0x23,0x35,0x33,0x15,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0xad,0x6f,0xfa,0x7a,0x56,0x4b,0x4c,0x53,0x7a,0xfb,0x6e,0x6e,0x9b,0x89,0x84,0x99,0x04,0x54,0x6a,0x5b,0x31, +0x83,0x5f,0x5c,0x59,0x62,0x83,0x31,0x5b,0x6a,0x41,0x74,0x7c,0x9a,0x97,0x7b,0x75,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x46,0x04,0xbe,0x00,0x0d,0x00,0x29,0xb1,0x0c,0x05,0xbe,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0d,0x01,0x0c,0xb3,0x0c,0x0c,0x0f,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x12,0x39,0x2f,0xed, +0x00,0x3f,0xed,0x3f,0x33,0x31,0x30,0x01,0x14,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x02,0x46,0xfb,0xef,0x7f,0x76,0x75,0x80,0x03,0x79,0xf0,0xea,0x01,0x4b,0xfe,0xcf,0x99,0x95,0x01,0x35,0x00,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x55,0x04,0xcf,0x00,0x17,0x00,0x33,0x41,0x0c,0x00,0x0a,0x01,0x0d,0x00,0x0f, +0x00,0x00,0x01,0x08,0x00,0x04,0x01,0x0d,0x00,0x15,0x01,0x0b,0x00,0x0d,0x00,0x12,0x01,0x0c,0xb3,0x07,0x07,0x19,0x01,0xb9,0x01,0x0c,0x00,0x00,0x2f,0xed,0x12,0x39,0x2f,0xed,0xc4,0x00,0x3f,0xed,0x3f,0xd4,0xed,0x31,0x30,0x13,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x23,0x22,0x35,0x5c,0x7f,0x73,0x4d,0x39,0x1e,0x24,0x21,0x1e,0x23,0x2c,0x5e,0x55,0x86,0x89,0xea,0x04,0xbe,0xfe,0xc6,0x90,0x6b,0x56,0x63,0x4c,0x0f,0x6c,0x0e,0x99,0x7e,0x8a,0xa5,0xf3,0x00,0x01,0x00,0x0b,0x02,0x9a,0x02,0x36,0x04,0xbe,0x00,0x0b,0x00,0x17,0xbb,0x00,0x00,0x01,0x0a,0x00,0x01,0x01,0x08,0xb3,0x03,0x03,0x0d,0x00, +0x2f,0x11,0x39,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x13,0x13,0x33,0x13,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x0b,0xc9,0x9b,0xc7,0x8a,0x78,0x0f,0x03,0x05,0x04,0x11,0x78,0x02,0x9a,0x02,0x24,0xfd,0xdc,0x01,0x72,0x2f,0x25,0x22,0x32,0xfe,0x8e,0x00,0x00,0x01,0x00,0x1a,0x02,0x9a,0x01,0xf5,0x04,0xbe,0x00,0x09,0x00,0x34,0xb1,0x05, +0x01,0xbf,0x01,0x0d,0x00,0x04,0x01,0x0a,0x00,0x00,0x00,0x06,0x01,0x0d,0x00,0x09,0x01,0x08,0x40,0x0c,0x02,0x07,0x06,0x07,0x02,0x01,0x04,0x05,0x00,0x00,0x0b,0x05,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x01,0xf5,0xfe,0xe8, +0x01,0x14,0xfe,0x29,0x01,0x18,0xf8,0x01,0xbb,0x04,0x86,0xfe,0x7e,0x6a,0x3a,0x01,0x80,0x6a,0x00,0x01,0x00,0x1a,0x01,0xe2,0x02,0x5a,0x04,0xbe,0x00,0x16,0x00,0x47,0xb1,0x04,0x09,0xb8,0xff,0xc0,0xb5,0x0c,0x10,0x48,0x09,0x10,0x16,0xbf,0x01,0x0d,0x00,0x0f,0x01,0x0a,0x00,0x15,0x00,0x11,0x01,0x0d,0x00,0x14,0x01,0x08,0x40,0x0f, +0x06,0x0c,0x02,0x00,0x12,0x11,0x12,0x00,0x16,0x04,0x10,0x15,0x15,0x18,0x10,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0xd6,0xcd,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0xd4,0x2b,0xcd,0x31,0x30,0x01,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x21,0x35,0x01,0x23,0x35,0x21,0x15,0x01,0x01,0xf1, +0x23,0x4a,0x21,0x21,0x24,0x29,0x45,0x4f,0x04,0xfe,0x9d,0x01,0x18,0xf8,0x01,0xbb,0xfe,0xe8,0x03,0x04,0x41,0x43,0x53,0x13,0x4d,0x11,0x4e,0x47,0x11,0x12,0x3a,0x01,0x80,0x6a,0x38,0xfe,0x7e,0x00,0x00,0x02,0x00,0x1a,0x02,0x55,0x02,0x82,0x04,0xbe,0x00,0x17,0x00,0x1e,0x00,0x52,0xb6,0x1d,0x11,0x07,0x00,0x18,0x03,0x0d,0x41,0x09, +0x01,0x0d,0x00,0x03,0x00,0x06,0x01,0x0a,0x00,0x0c,0x00,0x08,0x01,0x0d,0x00,0x0b,0x01,0x08,0x40,0x15,0x18,0x00,0x1b,0x02,0x0e,0x05,0x14,0x03,0x09,0x1b,0x14,0x08,0x09,0x0d,0x03,0x04,0x07,0x0c,0x0c,0x20,0x07,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0xd4,0xcd,0x2f,0x2f,0x12,0x39,0x39,0xcd,0x11,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f, +0xce,0xfd,0x17,0x39,0xd4,0xcd,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x23,0x35,0x01,0x23,0x35,0x21,0x15,0x01,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x36,0x35,0x34,0x23,0x22,0x01,0x4b,0x11,0x07,0x59,0x0b,0x0d,0xd8,0x01,0x18,0xf8,0x01,0xbb,0xfe,0xe8,0x3d,0x2b,0x72,0x44,0x45,0x42,0x60,0x58,0x48,0x54, +0x51,0x2e,0x41,0x02,0x9a,0x26,0x1f,0x27,0x1e,0x3a,0x01,0x80,0x6a,0x38,0xfe,0x7e,0x4e,0x57,0x42,0x32,0x43,0x58,0x6a,0x02,0x2a,0x23,0x00,0x01,0xff,0xfb,0x01,0x94,0x01,0xf7,0x04,0xbe,0x00,0x18,0x00,0x4c,0xb1,0x0b,0x09,0xb8,0x01,0x0d,0xb6,0x11,0x11,0x03,0x10,0x0d,0xe2,0x0e,0xbb,0x01,0x08,0x00,0x01,0x00,0x03,0x01,0x0d,0x40, +0x0d,0x17,0x11,0x0c,0x0f,0x0b,0x0b,0x0e,0x0f,0x0e,0x0f,0x0e,0x01,0x14,0xb8,0x01,0x0c,0xb3,0x06,0x06,0x1a,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x2f,0xfd,0xc6,0x3f,0xed,0x39,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35, +0x37,0x21,0x35,0x21,0x15,0x03,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x05,0x5a,0x5a,0x5e,0x68,0x6c,0x65,0x28,0xa7,0xfe,0xec,0x01,0xc7,0xb3,0x55,0x7f,0xb2,0x8d,0x66,0x01,0xc0,0x76,0x38,0x4d,0x46,0x4a,0x44,0x3a,0xfb,0x6a,0x3a,0xfe,0xf7,0x0c,0x79,0x62,0x70,0x90,0x00,0x00,0x03,0x00,0x3e,0x02,0x89,0x02,0x7f,0x05,0xd3,0x00,0x0a, +0x00,0x10,0x00,0x17,0x00,0x3f,0xb9,0x00,0x12,0x01,0x0d,0xb3,0x10,0x10,0x15,0x0d,0xbe,0x01,0x0d,0x00,0x06,0x01,0x07,0x00,0x15,0x01,0x0d,0x00,0x00,0x01,0x0b,0xb3,0x0b,0x10,0x12,0x08,0xb8,0x01,0x0c,0xb3,0x11,0x11,0x19,0x12,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12, +0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x13,0x02,0x23,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x01,0x58,0x85,0x95,0x9c,0x91,0x01,0x14,0x99,0x14,0x08,0x91,0x46,0x54,0x05,0x01,0x39,0xfe,0xc5,0x03,0x52,0x4a,0x48,0x51,0x02,0x89,0xd9,0xc5,0xcf,0xdd,0xfe,0x61,0xcc,0xdf,0x01, +0xdd,0x01,0x02,0x8c,0x76,0x63,0x85,0x8a,0x8c,0x00,0x00,0x03,0xff,0x3e,0x04,0xba,0x00,0xc2,0x05,0xd3,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x27,0x40,0x11,0x00,0x07,0x40,0x0d,0x80,0x02,0x19,0x13,0x01,0x03,0x01,0x03,0x16,0x0a,0x04,0x10,0x16,0x2f,0xcd,0xd4,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xcd,0xc4,0x1a,0xdc,0x1a,0xcd, +0xc4,0x31,0x30,0x03,0x05,0x07,0x25,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x6a,0x01,0x02,0x2e,0xfe,0xfe,0x01,0x5a,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0xfe,0xf2,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x05,0xd3,0xe7,0x32,0xe7,0x09,0x19, +0x22,0x22,0x19,0x19,0x22,0x22,0xbc,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x00,0x03,0xff,0x3e,0x04,0xba,0x00,0xc2,0x05,0xd3,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x27,0x40,0x11,0x0d,0x40,0x03,0x07,0x80,0x01,0x13,0x19,0x00,0x02,0x00,0x02,0x04,0x10,0x16,0x0a,0x04,0x2f,0xcd,0xd4,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xcd,0xc4, +0x1a,0xdc,0xc4,0x1a,0xcd,0x31,0x30,0x13,0x05,0x27,0x25,0x05,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x05,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x98,0xfe,0xfe,0x2e,0x01,0x02,0xfe,0xd4,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x01,0x0e,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x05,0xa1,0xe7, +0x32,0xe7,0x3b,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x8a,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x00,0x01,0xff,0x9c,0xfe,0x51,0x00,0x5b,0xff,0xc9,0x00,0x36,0x00,0x2c,0x40,0x15,0x30,0x1c,0x00,0x33,0x03,0x21,0x16,0x26,0x11,0x2b,0x0c,0x0c,0x11,0x16,0x1b,0x04,0x00,0x30,0x06,0x36,0x00,0x2f,0xcd,0xd4,0xcd,0x12,0x17,0x39,0x2f,0xcd, +0x2f,0xcd,0x2f,0xcd,0x00,0x2f,0xcd,0xcd,0xc4,0x39,0x31,0x30,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x07,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x64,0x13,0x39,0x24, +0x24,0x2b,0x0e,0x13,0x15,0x18,0x12,0x17,0x12,0x12,0x15,0x12,0x0f,0x17,0x1b,0x0b,0x01,0x1b,0x35,0x28,0x19,0x12,0x15,0x12,0x12,0x15,0x11,0x18,0x1d,0x18,0x11,0x0f,0x0f,0x18,0x04,0x87,0x2a,0x26,0x26,0x14,0x14,0x1d,0x0b,0x0c,0x13,0x08,0x07,0x0c,0x0f,0x17,0x11,0x10,0x15,0x12,0x10,0x0b,0x0b,0x0f,0x0c,0x08,0x04,0x0d,0x04,0x0c, +0x15,0x10,0x0f,0x14,0x11,0x0f,0x0b,0x0a,0x11,0x12,0x15,0x0e,0x0f,0x17,0x14,0x13,0x0c,0x0a,0x0d,0x10,0x0b,0x00,0x00,0x01,0xfe,0xdd,0x04,0xd2,0x01,0x29,0x05,0xbc,0x00,0x19,0x00,0x19,0x40,0x0a,0x0d,0x40,0x0c,0x0c,0x19,0x80,0x05,0x14,0x0d,0x19,0x2f,0xc4,0x00,0x2f,0xcd,0x1a,0xcd,0x39,0x2f,0x1a,0xcd,0x31,0x30,0x03,0x14,0x1e, +0x02,0x33,0x32,0x3e,0x04,0x33,0x17,0x22,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0xbe,0x0c,0x18,0x22,0x16,0x14,0x3a,0x43,0x48,0x44,0x3d,0x16,0x1b,0x19,0x40,0x47,0x4b,0x48,0x43,0x1b,0x29,0x45,0x31,0x1c,0x05,0x7b,0x10,0x29,0x26,0x1a,0x1b,0x28,0x2e,0x28,0x1b,0x29,0x1c,0x29,0x31,0x29,0x1c,0x36,0x4b,0x50,0x19,0xff,0xff,0x00,0x70, +0xfe,0x3c,0x01,0x50,0x05,0xd1,0x02,0x27,0x00,0x11,0x00,0x00,0x00,0x8d,0x00,0x27,0x00,0x11,0x00,0x00,0xfe,0x52,0x00,0x27,0x00,0x11,0x00,0x00,0x02,0xca,0x00,0x07,0x00,0x11,0x00,0x00,0x05,0x06,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x1e,0x01,0x24,0x02,0x07,0x07,0xa5,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x35, +0x01,0x24,0x02,0x07,0x07,0xab,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x7f,0x01,0x24,0x02,0x07,0x07,0xb4,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x12,0xfe,0xef,0x02,0x11,0x01,0x13,0x02,0x07,0x08,0x61,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x48,0xfe,0xdc,0x02,0x40,0x01,0x26,0x02,0x07,0x07,0xac,0x00,0x00,0xfc,0x55, +0x00,0x03,0x00,0x54,0xff,0x2f,0x03,0xf2,0x06,0x50,0x00,0x1c,0x00,0x27,0x00,0x2e,0x00,0x1f,0xb7,0x17,0x39,0x2d,0x28,0x22,0x2e,0x39,0x1c,0xb8,0x01,0x4d,0xb3,0x23,0x16,0x39,0x0f,0xb8,0x01,0x06,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0xed,0x31,0x30,0x05,0x23,0x37,0x2e,0x03,0x35,0x34,0x12,0x36,0x36,0x37,0x37,0x33,0x07,0x16, +0x16,0x17,0x15,0x26,0x26,0x27,0x03,0x21,0x11,0x06,0x23,0x23,0x01,0x14,0x1e,0x02,0x17,0x13,0x0e,0x03,0x01,0x32,0x36,0x37,0x11,0x23,0x03,0x02,0x39,0x6d,0x13,0x64,0x95,0x62,0x30,0x43,0x83,0xc1,0x7f,0x11,0x6d,0x11,0x51,0x8e,0x39,0x3d,0x94,0x53,0x2e,0x01,0x65,0xb9,0xe1,0x0c,0xfe,0xb0,0x1b,0x39,0x5b,0x41,0x62,0x56,0x7f,0x54, +0x29,0x01,0x67,0x43,0x7d,0x31,0xd4,0x28,0xd1,0xe2,0x15,0x6e,0xae,0xe9,0x8f,0xa5,0x01,0x07,0xbb,0x69,0x08,0xbe,0xbe,0x05,0x25,0x20,0xb0,0x2f,0x35,0x07,0xfd,0xe9,0xfd,0x94,0x7a,0x02,0xc0,0x70,0xb7,0x8a,0x5c,0x15,0x04,0x5e,0x0b,0x59,0x95,0xc9,0xfd,0x53,0x21,0x22,0x01,0x88,0xfe,0x35,0x00,0x03,0x00,0x0c,0x00,0x00,0x04,0x44, +0x05,0x9a,0x00,0x17,0x00,0x1b,0x00,0x23,0x00,0x91,0x40,0x4d,0x06,0x03,0x02,0x17,0x16,0x07,0x16,0x23,0x22,0x21,0x1a,0x19,0x09,0x08,0x1c,0x08,0x1d,0x1e,0x1f,0x20,0x1b,0x18,0x0a,0x0b,0x1c,0x0b,0x14,0x11,0x10,0x0d,0x0c,0x15,0x0c,0x02,0x1b,0x11,0x92,0x17,0x20,0x14,0x06,0x0a,0x0d,0x92,0x03,0x18,0x00,0x10,0x10,0x10,0x80,0x10, +0x03,0x10,0x10,0x14,0x1c,0x03,0x15,0x03,0x08,0x0c,0x01,0x05,0x13,0x0e,0x0e,0x15,0x16,0x1d,0x05,0x05,0x0c,0x07,0x07,0x25,0x0c,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x33,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x17,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0, +0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x0e,0xc0,0xc0,0x05,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x01,0x15,0x23,0x17,0x33,0x15,0x23,0x13,0x23,0x03,0x21,0x03,0x23,0x13,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x13,0x01,0x21,0x27,0x21,0x13,0x23,0x06,0x07,0x03,0x33,0x03,0x26,0x04, +0x2c,0xcd,0x39,0x94,0x68,0x80,0xba,0x76,0xfe,0x25,0x72,0xbb,0x7f,0x67,0x93,0x39,0xcc,0xf8,0xb5,0xad,0xb5,0xfe,0x2e,0x01,0x8a,0x34,0xfe,0xdd,0x92,0x03,0x08,0x0b,0x53,0xd1,0x55,0x09,0x03,0x5f,0x8d,0xb3,0x8d,0xfe,0x6e,0x01,0x92,0xfe,0x6e,0x01,0x92,0x8d,0xb3,0x8d,0x02,0x3b,0xfd,0xc5,0xfe,0xc0,0xb3,0x02,0x10,0x3d,0x23,0xfe, +0xdd,0x01,0x23,0x1e,0x00,0x01,0x00,0x69,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x00,0x47,0x00,0x89,0xb1,0x01,0x2f,0xb8,0x01,0x05,0xb6,0x46,0x2f,0x30,0x01,0x30,0x09,0x26,0xb8,0x01,0x05,0x40,0x44,0x06,0xd0,0x27,0xe0,0x27,0x02,0x27,0x21,0x0e,0x35,0x44,0x27,0x30,0x06,0x3f,0x1c,0x3d,0x3c,0x3a,0x91,0x3f,0x04,0x17,0x00,0x16,0x10,0x16, +0x20,0x16,0x03,0x16,0x11,0x91,0x1c,0x13,0x3c,0x09,0x06,0x01,0x46,0x04,0x44,0x0e,0x25,0x28,0x2e,0x31,0x3c,0x05,0x35,0x21,0x16,0x16,0x44,0x08,0x00,0x00,0x44,0x7d,0x35,0x35,0x49,0x48,0x30,0x27,0x0e,0x7d,0x21,0x2f,0xe1,0xc4,0x32,0x11,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39, +0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x32,0x3f,0xfd,0xc6,0x32,0x11,0x12,0x17,0x39,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x07,0x06,0x07,0x06,0x07,0x21,0x15,0x21,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x36,0x37,0x23,0x35,0x33, +0x36,0x37,0x36,0x37,0x36,0x37,0x21,0x35,0x21,0x36,0x37,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x03,0xe2,0x6f,0x04,0x30,0x41,0x34,0x3a,0x01,0x52,0xfd,0xe2,0x24,0x1d,0x2d,0x33,0x99,0x9b,0x2d,0x6a,0x69,0x5f,0x22,0x1c,0x5d,0x68,0x64,0x22,0x66,0xb8,0x8d,0x53,0x1e,0x12,0x1a, +0x54,0xc7,0x16,0x17,0x45,0x4d,0x2e,0x28,0xfe,0x24,0x02,0x80,0x19,0x0f,0x15,0x36,0x56,0x6e,0x37,0xc7,0x7f,0x61,0xd4,0x5d,0xb3,0x8c,0x56,0x1a,0x26,0x03,0x41,0x04,0x2f,0x27,0x1f,0x1f,0x6b,0x16,0x17,0x23,0x56,0x3a,0x6c,0x73,0x12,0x21,0x30,0x1e,0xc6,0x13,0x1f,0x15,0x0b,0x29,0x5c,0x93,0x6a,0x50,0x3e,0x25,0x21,0x6b,0x0f,0x0e, +0x2a,0x26,0x17,0x14,0x6b,0x19,0x1e,0x28,0x37,0x3b,0x52,0x34,0x17,0x58,0xbd,0x33,0x2e,0x5e,0x91,0x62,0x4d,0x3a,0x00,0x02,0x00,0x56,0xff,0x2f,0x03,0xe6,0x06,0x50,0x00,0x18,0x00,0x21,0x00,0x4f,0x40,0x2d,0x13,0x20,0x15,0x91,0x0d,0x9f,0x0f,0xaf,0x0f,0x02,0x0f,0x10,0x04,0x20,0x18,0x01,0x18,0x1f,0x16,0x91,0x05,0x60,0x03,0x70, +0x03,0x02,0x03,0x02,0x13,0x10,0x16,0x03,0x8c,0x0d,0x1f,0x04,0x04,0x09,0x13,0x00,0x00,0x23,0x1b,0x7e,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x00,0x3f,0xcd,0x5d,0x33,0xfd,0x32,0xc6,0x5d,0x3f,0xcd,0x5d,0x33,0xfd,0x32,0xc6,0x31,0x30,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x27,0x26,0x11,0x10, +0x37,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x01,0x06,0x11,0x10,0x17,0x16,0x17,0x11,0x06,0x03,0xe6,0x73,0xa7,0x68,0xe6,0x8d,0x9b,0xaf,0x8e,0xd1,0x68,0xad,0x6d,0x7d,0x9d,0xa4,0x76,0xfd,0x97,0x7f,0x77,0x5f,0x90,0x8a,0x3c,0x48,0x0a,0xbb,0xbb,0x11,0xb2,0xc5,0x01,0x40,0x01,0x58,0xd4,0xad,0x1f,0xa6, +0x9e,0x01,0x3a,0xb3,0x55,0x01,0xfb,0x65,0x07,0x59,0x03,0x96,0xa5,0xfe,0xec,0xfe,0xfa,0x9c,0x7c,0x19,0x04,0x89,0x1f,0x00,0x00,0x02,0x00,0x42,0x00,0xc8,0x02,0x68,0x03,0x49,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x11,0x01,0x00,0x03,0x10,0x03,0x02,0x03,0x03,0x08,0x05,0x07,0x03,0x07,0x07,0x09,0x02,0x06,0x2f,0x33,0x12,0x39,0x2f, +0x33,0x00,0x2f,0xcd,0x12,0x39,0x2f,0x5d,0xcd,0x31,0x30,0x01,0x05,0x35,0x25,0x35,0x05,0x35,0x25,0x02,0x68,0xfd,0xda,0x02,0x26,0xfd,0xda,0x02,0x26,0x01,0x9a,0xd2,0x83,0xd2,0xa9,0xd2,0x83,0xd2,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0xc1,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed, +0x00,0x2f,0x2f,0xed,0x31,0x30,0x37,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0xc1,0xfe,0xfd,0x89,0x9f,0x17,0x93,0x1f,0x9d,0x01,0x03,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0x8f,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed, +0x00,0x2f,0x2f,0xed,0x31,0x30,0x37,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0x8f,0xd1,0x89,0x9f,0x17,0x93,0x1f,0x9d,0xd1,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0x35,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed,0x00,0x2f, +0x2f,0xed,0x31,0x30,0x37,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0x35,0x77,0x89,0x9f,0x17,0x93,0x1f,0x9d,0x77,0x00,0x01,0xff,0x29,0xfe,0x96,0x00,0xb0,0x00,0x35,0x00,0x0c,0x00,0x12,0xb7,0x03,0x95,0x08,0x00,0x05,0x00,0x84,0x0c,0x2f,0xfd,0xc6,0x00,0x2f,0x2f,0xed, +0x31,0x30,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x3e,0x7e,0x3c,0x34,0x34,0x3c,0x7f,0x98,0x35,0x77,0x9d,0x1f,0x93,0x17,0x9f,0x89,0x77,0x00,0x01,0x00,0x27,0x01,0x83,0x03,0xac,0x02,0x83,0x00,0x11,0x00,0x27,0x40,0x0c,0x09,0x0f,0x96,0x03,0x06,0x96,0x11,0x2f,0x0c,0x01,0x0c,0x00,0xbc,0x01,0x03,0x00, +0x11,0x00,0x08,0x01,0x03,0x00,0x09,0x2f,0xed,0x2f,0xed,0x00,0x2f,0x5d,0xc6,0xfd,0xdc,0xed,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x24,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x04,0x33,0x32,0x35,0x03,0xac,0x60,0x7a,0x47,0xfe,0xc2,0x48,0x80,0x5e,0x60,0x7e,0x5f,0x01,0x34,0x36,0x7c,0x02,0x83,0x69,0x85,0x5f,0x71,0x6b,0x81, +0x60,0x74,0x00,0x01,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x05,0x4d,0x00,0x03,0x00,0x0d,0xb4,0x02,0x95,0x01,0x03,0x02,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x04,0xc2,0x8b,0x00,0x01,0x00,0x12,0x02,0x9a,0x02,0x11,0x04,0xbe,0x00,0x0d,0x00,0x13,0xbb,0x00,0x07,0x01,0x0a,0x00,0x09,0x01, +0x08,0xb1,0x02,0x07,0x2f,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x13,0x23,0x27,0x23,0x07,0x23,0x13,0x03,0x33,0x17,0x33,0x37,0x02,0x11,0xbc,0xb8,0x91,0x6a,0x02,0x6e,0x90,0xbe,0xb6,0x92,0x67,0x02,0x6f,0x04,0xbe,0xfe,0xeb,0xfe,0xf1,0xb2,0xb2,0x01,0x0c,0x01,0x18,0xbd,0xbd,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32, +0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x36,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x38,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00, +0x01,0x07,0x04,0x37,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x39,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x43,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x38, +0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x44,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x39,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff, +0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x36,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x41,0x01,0x0f,0x41,0x10,0x41,0x02,0x41,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a, +0xff,0xe8,0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x37,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8, +0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x43,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5, +0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x44,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xf9,0xff,0xf4,0x02,0x15,0x07,0x32, +0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0xaf,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x02,0xff,0xf4,0x02,0x32,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00, +0x01,0x07,0x04,0x37,0xfe,0xc4,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0xff,0xfc,0xff,0xf4,0x02,0x24,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0xb8,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e, +0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0xff,0xe5,0xff,0xf4,0x02,0x28,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0xad,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff, +0xff,0xee,0xff,0xf4,0x02,0x1a,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x36,0xfe,0xb4,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee, +0xff,0xf4,0x02,0x2d,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x37,0xfe,0xbf,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee,0xff,0xf4, +0x02,0x20,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x43,0xfe,0xb4,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee,0xff,0xf4,0x02,0x3a, +0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x44,0xfe,0xbf,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32, +0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x36,0xff,0xcc,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00, +0x01,0x07,0x04,0x37,0xff,0xd9,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x43,0xff,0xcd,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f, +0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x44,0xff,0xd0,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff, +0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x36,0xff,0xc7,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14, +0xff,0xe6,0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x37,0xff,0xd0,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6, +0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x43,0xff,0xc5,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e, +0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x44,0xff,0xd0,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40, +0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x64,0x00,0xf6,0x00,0xd2,0x01,0x07,0x02,0x46,0xff,0xc1,0x01,0x88,0x00,0x29,0x40,0x1a,0x04,0x0f,0x2b,0x3f,0x2b,0x8f,0x2b,0x03,0x2b,0x40,0x0d,0x15,0x36,0x2b,0x03,0x24,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x05,0x00,0x10,0xda,0x5d, +0x34,0x34,0x10,0xda,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x64,0x00,0xf6,0x00,0xd2,0x01,0x07,0x02,0x47,0xff,0xf3,0x01,0x88,0x00,0x29,0x40,0x1a,0x04,0x0f,0x2b,0x3f,0x2b,0x8f,0x2b,0x03,0x2b,0x40, +0x0d,0x15,0x36,0x2b,0x03,0x24,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x05,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x66,0x00,0xf6,0x00,0xaa,0x01,0x07, +0x02,0x46,0xff,0x8f,0x01,0x88,0x00,0x33,0x40,0x22,0x04,0x4f,0x32,0x8f,0x32,0x02,0x32,0x40,0x0c,0x15,0x36,0x32,0x03,0x7f,0x27,0x8f,0x27,0x02,0x27,0x40,0x0d,0x11,0x36,0x27,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x06,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3, +0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x66,0x00,0xf6,0x00,0xaa,0x01,0x07,0x02,0x47,0x00,0x19,0x01,0x88,0x00,0x33,0x40,0x22,0x04,0x4f,0x32,0x8f,0x32,0x02,0x32,0x40,0x0c,0x15,0x36,0x32,0x03,0x7f,0x27,0x8f,0x27,0x02,0x27,0x40,0x0d,0x11,0x36,0x27, +0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x06,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0xd2,0x01,0x07,0x02,0x46,0x00,0xef, +0x01,0x88,0x00,0x2b,0x40,0x1b,0x04,0x4f,0x3c,0x8f,0x3c,0x02,0x3c,0x40,0x0c,0x15,0x36,0x3c,0x03,0x00,0x35,0x01,0x35,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00, +0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0xd2,0x01,0x07,0x02,0x47,0x01,0x20,0x01,0x88,0x00,0x2b,0x40,0x1b,0x04,0x4f,0x3c,0x8f,0x3c,0x02,0x3c,0x40,0x0c,0x15,0x36,0x3c,0x03,0x00,0x35,0x01,0x35,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x5d, +0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x66,0x02,0x1b,0x00,0xaa,0x01,0x07,0x02,0x46,0x00,0xd1,0x01,0x88,0x00,0x31,0x40,0x20,0x04,0x8f,0x45,0x01,0x45,0x40,0x0c,0x15,0x36,0x45,0x03,0x7f,0x38,0x8f, +0x38,0x02,0x38,0x40,0x0e,0x11,0x36,0x38,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x66,0x02,0x1b, +0x00,0xaa,0x01,0x07,0x02,0x47,0x01,0x48,0x01,0x88,0x00,0x31,0x40,0x20,0x04,0x8f,0x45,0x01,0x45,0x40,0x0c,0x15,0x36,0x45,0x03,0x7f,0x38,0x8f,0x38,0x02,0x38,0x40,0x0e,0x11,0x36,0x38,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0x00,0x03, +0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x16,0x00,0x1e,0x00,0x39,0xbc,0x00,0x0f,0x01,0x43,0x00,0x19,0x00,0x1d,0x01,0x43,0xb5,0x14,0x19,0x14,0x06,0x00,0x17,0xb8,0x01,0x44,0xb2,0x11,0x07,0x1b,0xb8,0x01,0x44,0xb2,0x0c,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xe6,0x01,0x2f, +0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x32,0x12,0x11,0x10,0x21,0x22,0x02,0x11,0x10,0x12,0x13,0x32,0x11,0x10,0x23,0x22,0x11,0x10,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x04,0x8e,0xe4,0xfe,0xfe,0x3e,0xeb, +0xf9,0xef,0xec,0xe7,0xed,0xf1,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xff,0x00,0x01,0x7f,0x01,0x6c,0x02,0xdf,0xfe,0x7a,0xfe,0x84,0xfe,0xa6,0xfe,0x92,0x05,0x0d,0xfd,0xcd,0xfd,0xe2,0x02,0x14,0x02,0x3d,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x1a,0x00,0x32, +0xb9,0x00,0x1a,0x01,0x43,0x40,0x11,0x13,0x19,0x19,0x00,0x06,0x00,0x1a,0x18,0x04,0x18,0x01,0x18,0x12,0x13,0x0c,0x07,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xde,0xce,0x33,0x5d,0x3f,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0xe6,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x23, +0x0e,0x03,0x07,0x15,0x3e,0x03,0x37,0x11,0x33,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x05,0x15,0x7a,0x26,0x68,0x75,0x79,0x36,0x30,0x65,0x5b,0x49,0x13,0xe0,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x04,0xd2,0x21,0x45,0x3f,0x33,0x0f,0xce, +0x0c,0x2a,0x30,0x31,0x13,0xfb,0x51,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x32,0x00,0x4e,0xb1,0x23,0x11,0xb8,0x01,0x43,0xb2,0x31,0x10,0x1b,0xb8,0x01,0x43,0x40,0x0c,0x27,0x31,0x27,0x31,0x27,0x00,0x08,0x00,0x12,0x27,0x20,0x10,0xb8,0x01,0x44,0xb3,0x31,0x18,0x23,0x25,0xb8,0x01,0x44,0xb3,0x22, +0x20,0x07,0x0c,0xba,0x01,0x42,0x00,0x04,0x01,0x41,0x00,0x3f,0x3f,0x3f,0x33,0xe6,0x32,0x3f,0xe6,0x12,0x39,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe6,0x32,0x10,0xe6,0x33,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x05,0x21,0x35,0x34,0x3e,0x06,0x35,0x34,0x2e,0x02, +0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x15,0x14,0x0e,0x06,0x15,0x15,0x21,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x06,0x52,0xfd,0x88,0x36,0x58,0x70,0x75,0x70,0x58,0x36,0x41,0x71,0x96,0x54,0xde,0xa9,0xb0,0xc0,0xce,0x38,0x5b,0x74,0x7a,0x74, +0x5b,0x38,0x03,0x74,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0x22,0x16,0x27,0x4a,0x4d,0x52,0x5f,0x6e,0x85,0x9f,0x60,0x5d,0x8c,0x5d,0x2f,0x83,0xde,0xa4,0xda,0x4b,0x7b,0x6b,0x61,0x61,0x66,0x76,0x8c,0x55,0x6b,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31, +0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x2d,0x00,0x73,0xb2,0x15,0x25,0x17,0xb8,0x01,0x43,0x40,0x09,0x21,0x1d,0x25,0x25,0x1d,0x21,0x03,0x0c,0x11,0xb8,0x01,0x43,0x40,0x09,0x28,0x0c,0x28,0x0c,0x06,0x00,0x15,0x1a,0x25,0xb8,0x01,0x44,0x40,0x0d,0x24,0x24,0x2b,0x80,0x1d,0x01,0x2b,0x1d,0x3b,0x1d,0x02,0x1d,0x1f,0xb8,0x01,0x44,0x40, +0x09,0x1a,0x07,0x24,0x2d,0x34,0x2d,0x02,0x2d,0x2b,0xb8,0x01,0x44,0xb2,0x0e,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0xc6,0x5d,0x3f,0xe6,0xc6,0x5d,0x5d,0x12,0x39,0x2f,0xe6,0x11,0x39,0x01,0x2f,0xc4,0x39,0x39,0x2f,0x2f,0xe6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0xe6,0x11,0x39,0x31,0x30,0x13,0x10,0x00, +0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x05,0x16,0x33,0x32,0x24,0x35,0x34,0x26,0x27,0x35,0x24,0x11,0x34,0x26,0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x15,0x14,0x21,0x23,0x15,0x33,0x20,0x15,0x14,0x06,0x23,0x22,0x27,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x03,0x0b,0x79,0xcc, +0xe3,0x01,0x15,0xb7,0x9b,0x01,0x20,0xd9,0xb5,0xbc,0x8a,0x86,0x97,0xd2,0xfe,0xda,0x71,0x77,0x01,0x53,0x92,0x7b,0xb9,0x93,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xb3,0x4d,0xed,0xc1,0x8c,0xbb,0x0f,0x04,0x51,0x01,0x1b,0x96,0xc0,0x52,0xd2,0x67,0xda,0xd7,0xbd,0xe9,0x6a,0x90,0x74,0x00, +0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x1c,0x00,0x27,0x00,0x4f,0xb3,0x10,0x11,0x11,0x1a,0xb8,0x01,0x43,0x40,0x0e,0x27,0x13,0x19,0x1d,0x17,0x19,0x17,0x19,0x17,0x00,0x08,0x00,0x1b,0x18,0xb8,0x01,0x44,0x40,0x0b,0x16,0x11,0x1d,0x1d,0x12,0x1a,0x18,0x22,0x12,0x07,0x0c,0xba,0x01,0x42,0x00,0x04,0x01, +0x41,0x00,0x3f,0x3f,0x3f,0x33,0x3f,0x12,0x39,0x2f,0x33,0x33,0xe6,0x32,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0xe6,0x32,0x11,0x33,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x01,0x23,0x11,0x21,0x02,0x00,0x07,0x15,0x21,0x11,0x33,0x11,0x33,0x25,0x3e, +0x03,0x37,0x33,0x06,0x06,0x15,0x11,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x06,0x68,0xae,0xfe,0xfe,0xa4,0xfe,0xda,0x82,0x02,0x70,0xde,0xae,0xfc,0xde,0x35,0x6f,0x69,0x61,0x28,0x04,0x02,0x02,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe, +0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0x01,0x4c,0x03,0x66,0xfe,0xe0,0xfe,0x4e,0xa4,0xa7,0xfe,0x83,0x01,0x7d,0xb7,0x3b,0x95,0xa4,0xa8,0x4e,0x2a,0x49,0x21,0xfe,0x2a,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x34,0x00,0x50,0xb1,0x23,0x17,0xb8,0x01,0x43,0xb2,0x2d, +0x34,0x21,0xb8,0x01,0x43,0x40,0x09,0x26,0x2d,0x26,0x2d,0x26,0x00,0x08,0x00,0x28,0xb8,0x01,0x44,0xb3,0x1c,0x1c,0x12,0x23,0xb8,0x01,0x44,0xb2,0x25,0x06,0x32,0xb8,0x01,0x44,0xb2,0x12,0x19,0x0c,0xba,0x01,0x42,0x00,0x04,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xe6,0x12,0x39,0x2f,0xe6,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f, +0x10,0xe6,0x33,0x10,0xe6,0x32,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x05,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x22,0x06,0x06,0x07,0x13,0x21,0x35,0x21,0x03,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5, +0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x03,0x22,0x62,0xc7,0x6d,0xba,0x87,0x4d,0x4c,0x83,0xb0,0x63,0x07,0x1b,0x1f,0x1c,0x09,0x1b,0x01,0xec,0xfd,0x5e,0x3c,0xa5,0x3c,0x4a,0x7f,0x5d,0x35,0x2c,0x4c,0x65,0x39,0x97,0x94,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe, +0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0xc5,0x3b,0x3f,0x77,0xab,0x6d,0x6f,0xa3,0x6a,0x34,0x01,0x02,0x01,0x01,0x72,0xc6,0xfc,0xff,0x0c,0x22,0x40,0x5d,0x3b,0x3e,0x62,0x44,0x23,0x5f,0x00,0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x22,0x00,0x2e,0x00,0x5a,0xb5,0x0c,0x2c,0x0c, +0x2c,0x1d,0x17,0xbb,0x01,0x43,0x00,0x26,0x00,0x1d,0x01,0x43,0xb5,0x11,0x26,0x11,0x06,0x00,0x23,0xb8,0x01,0x44,0x40,0x0b,0x1a,0x1a,0x0e,0x29,0x22,0x20,0x09,0x12,0x48,0x22,0x20,0xb8,0x01,0x44,0xb2,0x0e,0x07,0x29,0xb8,0x01,0x44,0xb2,0x14,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xf6,0xcd, +0x2b,0x11,0x12,0x39,0x2f,0xe6,0x01,0x2f,0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x11,0x39,0x39,0x2f,0x2f,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x26,0x23,0x20,0x00,0x11,0x10,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x23,0x34,0x12,0x33,0x32,0x17,0x01,0x32,0x16,0x15,0x14,0x06,0x23, +0x22,0x26,0x35,0x34,0x36,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x05,0xf2,0x58,0x96,0xfe,0xf8,0xfe,0xbe,0xf6,0xd8,0xc4,0xfe,0xde,0xbc,0xad,0x61,0x03,0xc5,0xa4,0x7b,0x6f,0xfe,0x99,0x68,0x73,0x78,0x61,0x66,0x7c,0x7c,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b, +0xfd,0x49,0x02,0xb7,0x04,0xa1,0x29,0xfe,0x3e,0xfe,0x87,0xfe,0xc9,0xfe,0xa8,0x01,0x0b,0xd3,0xca,0xf1,0x8f,0xe0,0x01,0x23,0x39,0xfe,0x08,0x91,0x81,0x75,0x99,0xb0,0x7c,0x63,0x91,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x1a,0x00,0x3a,0xb2,0x0f,0x0c,0x15,0xb8,0x01,0x43,0x40,0x0e,0x14,0x0c,0x14, +0x0d,0x0d,0x14,0x0c,0x03,0x00,0x06,0x00,0x15,0x18,0x0f,0xb8,0x01,0x44,0xb2,0x0d,0x06,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe6,0x11,0x33,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x21,0x15,0x21,0x06,0x0a, +0x02,0x07,0x33,0x36,0x1a,0x02,0x37,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x06,0x78,0xfc,0x64,0x02,0x91,0x66,0x9c,0x75,0x55,0x1f,0xec,0x11,0x4e,0x80,0xb4,0x77,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x04,0xb2,0xc6,0xad,0xfe,0xbc,0xfe, +0xce,0xfe,0xdc,0x8d,0x94,0x01,0x38,0x01,0x4c,0x01,0x60,0xbc,0x00,0x04,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x25,0x00,0x39,0x00,0x4d,0x00,0x59,0x00,0x71,0xb3,0x21,0x0f,0x1e,0x44,0xb8,0x01,0x43,0xb2,0x14,0x14,0x0a,0xbb,0x01,0x43,0x00,0x30,0x00,0x3a,0x01,0x43,0xb2,0x1e,0x1e,0x26,0xb8,0x01,0x43,0x40,0x0b,0x00,0x30, +0x00,0x30,0x00,0x4e,0x54,0x4e,0x21,0x0f,0x2b,0xb8,0x01,0x44,0x40,0x09,0x60,0x49,0x70,0x49,0x02,0x49,0x49,0x51,0x57,0xbc,0x01,0x42,0x00,0x51,0x01,0x41,0x00,0x3f,0x01,0x44,0xb2,0x19,0x07,0x35,0xb8,0x01,0x44,0xb1,0x05,0x19,0x00,0x3f,0xe6,0x3f,0xe6,0x3f,0x3f,0x12,0x39,0x2f,0x5d,0xe6,0x39,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39, +0x2f,0x2f,0x10,0xe6,0x33,0x2f,0xe6,0x10,0xe6,0x32,0x2f,0xe6,0x12,0x39,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x0e,0x03,0x17,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x13,0x34, +0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x76,0x47,0x7d,0xac,0x66,0x67,0xac,0x7c,0x44,0x1d,0x38,0x4f,0x32,0x24,0x3a,0x29,0x17,0x3e,0x6e,0x97,0x58,0x57,0x95,0x6f,0x3f,0x52,0x4d,0x32,0x51,0x39,0x1f,0xe8,0x24,0x40,0x57,0x34,0x37, +0x59,0x3f,0x22,0x23,0x40,0x59,0x35,0x37,0x59,0x3e,0x21,0x2d,0x1c,0x33,0x48,0x2b,0x29,0x46,0x34,0x1d,0x1e,0x34,0x46,0x28,0x28,0x46,0x35,0x1f,0xfc,0x29,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x01,0x97,0x5f,0xa0,0x76,0x42,0x42,0x76,0xa0,0x5f,0x34,0x6c,0x65,0x55,0x1d,0x1b,0x43,0x4e, +0x55,0x2c,0x4f,0x89,0x65,0x3a,0x39,0x65,0x89,0x50,0x5a,0x9e,0x35,0x1d,0x56,0x64,0x6c,0x26,0x35,0x5e,0x46,0x29,0x2b,0x48,0x5d,0x32,0x38,0x5e,0x43,0x26,0x25,0x43,0x5e,0x02,0xc3,0x28,0x47,0x35,0x1e,0x1d,0x33,0x48,0x2a,0x29,0x4a,0x3a,0x22,0x22,0x39,0x4b,0xfe,0xc7,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49, +0x02,0xb7,0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x22,0x00,0x2e,0x00,0x5c,0xb5,0x0c,0x2c,0x0c,0x2c,0x1d,0x26,0xbb,0x01,0x43,0x00,0x17,0x00,0x11,0x01,0x43,0xb5,0x1d,0x1d,0x17,0x06,0x00,0x23,0xb8,0x01,0x44,0xb4,0x1a,0x1a,0x0e,0x29,0x22,0xb8,0xff,0xe0,0xb4,0x09,0x12,0x48,0x22,0x20,0xb8,0x01,0x44, +0xb2,0x0e,0x19,0x29,0xb8,0x01,0x44,0xb2,0x14,0x07,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xf6,0xcd,0x2b,0x11,0x12,0x39,0x2f,0xe6,0x01,0x2f,0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x05,0x16,0x33,0x20, +0x00,0x11,0x10,0x02,0x23,0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x33,0x14,0x02,0x23,0x22,0x27,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x03,0x33,0x58,0x96,0x01,0x08,0x01,0x42,0xf6,0xd8,0xc4,0xfe,0xde,0xbc,0xad,0x61, +0x03,0xc5,0xa4,0x7b,0x6f,0x01,0x67,0x68,0x73,0x78,0x61,0x66,0x7c,0x7c,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xd7,0x29,0x01,0xc2,0x01,0x79,0x01,0x37,0x01,0x58,0xfe,0xf5,0xd3,0xca,0xf1,0x8f,0xe0,0xfe,0xdd,0x39,0x01,0xf8,0x91,0x81,0x75,0x99,0xb0,0x7c,0x63,0x91,0x00,0x05,0x00,0xbc, +0xff,0x2f,0x03,0xea,0x06,0x50,0x00,0x17,0x00,0x1e,0x00,0x22,0x00,0x26,0x00,0x2d,0x00,0x5d,0x40,0x34,0x1c,0x0d,0x1f,0x91,0x2c,0x24,0x24,0x20,0x2b,0x23,0x91,0x05,0x80,0x03,0x01,0x03,0x01,0x03,0x1d,0x20,0x91,0x14,0x16,0x00,0x09,0x7d,0x29,0x1d,0x1c,0x0c,0x2c,0x05,0x05,0x15,0x8c,0x21,0x25,0x02,0x03,0x16,0x29,0x16,0x00,0x10, +0x7d,0x1a,0x1a,0x2f,0x24,0x20,0x7e,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x17,0x33,0xed,0x17,0x32,0x2f,0xe1,0x00,0x2f,0xc6,0x33,0xed,0x32,0x3f,0xc6,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x39,0x32,0x31,0x30,0x33,0x11,0x21,0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15, +0x14,0x07,0x06,0x07,0x15,0x23,0x35,0x37,0x36,0x35,0x34,0x27,0x11,0x36,0x01,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x13,0x36,0x35,0x34,0x27,0x11,0x36,0xbc,0x01,0x3a,0x68,0x93,0x5b,0x66,0x84,0x74,0x8a,0xa6,0x7a,0x6e,0xa4,0x68,0xfd,0x47,0xdc,0x5c,0xfe,0xaa,0x92,0x92,0x92,0xc6,0x46,0xa4,0x37,0x05,0x9a,0xb6,0xb7,0x09,0x51,0x5b, +0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0x72,0x68,0x09,0xd2,0xd1,0xde,0x46,0x7a,0xd8,0x20,0xfe,0x05,0x0b,0x01,0xf6,0xfd,0xfc,0x02,0x04,0x02,0x66,0xfe,0x31,0x01,0xcf,0xfe,0x73,0x43,0x79,0xab,0x1f,0xfe,0x45,0x10,0x00,0x00,0x02,0x00,0x48,0x02,0x34,0x02,0xa5,0x05,0xae,0x00,0x0a,0x00,0x12,0x00,0x1f,0x40,0x10,0x0b,0xe6, +0x06,0x27,0x0f,0xe6,0x00,0x29,0x08,0xcc,0x11,0x11,0x14,0x0d,0xcc,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x11,0x10,0x33,0x32,0x11,0x10,0x01,0x6d,0x8b,0x9a,0xa1,0x99,0x01,0x23,0xa3,0x87,0xa9,0xa6,0xa4,0x02,0x34,0xdb,0xd1,0xe5, +0xe9,0xfe,0x47,0xdb,0xe6,0x03,0x03,0xfe,0xaf,0xfe,0xc6,0x01,0x40,0x01,0x4b,0x00,0x00,0x02,0x00,0x49,0x02,0x34,0x02,0xa6,0x05,0xae,0x00,0x26,0x00,0x36,0x00,0x3c,0x40,0x23,0x04,0x10,0x14,0x10,0x02,0x27,0xe6,0x04,0x10,0x14,0x10,0x02,0x10,0x10,0x31,0x06,0xe6,0x24,0x27,0x31,0xe6,0x1a,0x29,0x01,0x01,0x1f,0x15,0xcc,0x34,0x34, +0x38,0x2c,0x0c,0xcc,0x1f,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x5d,0x31,0x30,0x01,0x15,0x2e,0x03,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x03,0x22,0x0e, +0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x63,0x0e,0x28,0x2b,0x2c,0x12,0x39,0x55,0x21,0x1f,0x2d,0x04,0x1d,0x6e,0x4e,0x3c,0x5f,0x42,0x23,0x2d,0x4f,0x6b,0x3d,0x3f,0x72,0x56,0x32,0x38,0x65,0x8c,0x54,0x2b,0x52,0xc1,0x22,0x3c,0x2c,0x1a,0x15,0x29,0x3a,0x25,0x4b,0x55,0x4d,0x05,0x8b,0x81,0x09,0x10,0x0c,0x07, +0x24,0x24,0x22,0x7f,0x61,0x32,0x41,0x27,0x47,0x63,0x3d,0x3d,0x68,0x4d,0x2b,0x31,0x63,0x99,0x67,0x75,0xb5,0x7c,0x40,0x12,0xfe,0x59,0x15,0x28,0x38,0x24,0x22,0x41,0x32,0x1e,0x5b,0x49,0x4e,0x5a,0x00,0x02,0x00,0x49,0x02,0x33,0x02,0xa6,0x05,0xae,0x00,0x27,0x00,0x39,0x00,0x3c,0x40,0x23,0x0b,0x0b,0x1b,0x0b,0x02,0x30,0xe6,0x0b, +0x0b,0x1b,0x0b,0x02,0x0b,0x0b,0x1f,0x28,0xe6,0x15,0x27,0x00,0xe6,0x1f,0x29,0x23,0x23,0x10,0x1a,0xcc,0x35,0x06,0x06,0x3b,0x2d,0xcc,0x10,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x5d,0x31,0x30,0x01,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34, +0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x1e,0x03,0x13,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x34,0x42,0x5e,0x3c,0x1b,0x04,0x0d,0x2b,0x37,0x42,0x24,0x3c,0x61,0x46,0x26,0x2a,0x4d,0x6c,0x41,0x40,0x72,0x55,0x32,0x30,0x5d,0x8a,0x5b,0x30,0x61,0x26,0x13, +0x2e,0x30,0x30,0x52,0x21,0x39,0x2a,0x18,0x52,0x45,0x20,0x3d,0x2f,0x1d,0x19,0x2c,0x3c,0x02,0xaa,0x33,0x5c,0x7e,0x4b,0x1c,0x2f,0x21,0x13,0x26,0x47,0x63,0x3c,0x3f,0x6a,0x4c,0x2a,0x33,0x65,0x96,0x64,0x69,0xb4,0x82,0x4a,0x17,0x16,0x7f,0x0b,0x13,0x0f,0x08,0x02,0x8e,0x17,0x2b,0x3f,0x28,0x4c,0x56,0x16,0x26,0x33,0x1d,0x2a,0x47, +0x32,0x1c,0x00,0x01,0x00,0x5d,0x02,0xcb,0x02,0x91,0x04,0xff,0x00,0x0b,0x00,0x1b,0x40,0x10,0x04,0x7f,0x07,0x9f,0x07,0x02,0x3f,0x07,0xdf,0x07,0xff,0x07,0x03,0x07,0x02,0x03,0x2f,0xcd,0x00,0x2f,0x5d,0x71,0xcd,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x02,0x91,0xe8,0x64,0xe8,0xe8,0x64,0xe8,0x03, +0xb3,0xe8,0xe8,0x64,0xe8,0xe8,0x00,0x01,0x00,0x5d,0x03,0xb3,0x02,0x91,0x04,0x17,0x00,0x03,0x00,0x1b,0x40,0x10,0x02,0x7f,0x01,0x9f,0x01,0x02,0x3f,0x01,0xdf,0x01,0xff,0x01,0x03,0x01,0x02,0x03,0x2f,0xcd,0x00,0x2f,0x5d,0x71,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x5d,0x02,0x34,0xfd,0xcc,0x04,0x17,0x64,0x00,0x00,0x02,0x00,0x5d, +0x03,0x22,0x02,0x91,0x04,0xa8,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x11,0x03,0x40,0x00,0x80,0x07,0x0f,0x04,0x2f,0x04,0x3f,0x04,0x03,0x04,0x06,0x07,0x02,0x03,0x2f,0xcd,0x33,0x32,0x00,0x2f,0x5d,0xcd,0x1a,0xde,0x1a,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x5d,0x02,0x34,0xfd,0xcc,0x02,0x34,0xfd,0xcc,0x03,0x86, +0x64,0x01,0x86,0x64,0x00,0x01,0x00,0xcc,0x01,0xce,0x02,0x06,0x05,0xee,0x00,0x09,0x00,0x1a,0x40,0x0d,0xdf,0x05,0x01,0x40,0x05,0x01,0x05,0x01,0x06,0x00,0x08,0xcd,0x03,0x2f,0xed,0xd4,0xc6,0x00,0x2f,0x2f,0x5d,0x5d,0x31,0x30,0x01,0x23,0x26,0x11,0x10,0x37,0x33,0x06,0x11,0x10,0x02,0x05,0x7f,0xba,0xba,0x80,0xbc,0x01,0xce,0xd4, +0x01,0x38,0x01,0x38,0xdc,0xe4,0xfe,0xd1,0xfe,0xd3,0x00,0x01,0x00,0x64,0x01,0xce,0x01,0x9e,0x05,0xee,0x00,0x09,0x00,0x1a,0x40,0x0d,0xdf,0x03,0x01,0x40,0x03,0x01,0x03,0x09,0x09,0x03,0x06,0xcd,0x01,0x2f,0xfd,0xd4,0xc6,0x00,0x2f,0x2f,0x5d,0x5d,0x31,0x30,0x00,0x11,0x10,0x27,0x33,0x16,0x11,0x10,0x07,0x23,0x01,0x20,0xbc,0x80, +0xba,0xba,0x7f,0x02,0xae,0x01,0x2d,0x01,0x2f,0xe4,0xdc,0xfe,0xc8,0xfe,0xc8,0xd4,0x00,0x02,0x00,0x5b,0x02,0xcd,0x01,0x05,0x06,0xeb,0x00,0x0b,0x00,0x0f,0x00,0x1c,0x40,0x0d,0x0d,0x24,0x00,0x40,0x06,0x80,0x0e,0x03,0x09,0x0c,0xc2,0x03,0x0d,0x2f,0xc4,0xfd,0xc4,0x00,0x3f,0x1a,0xdc,0x1a,0xcd,0x3f,0x31,0x30,0x13,0x22,0x26,0x35, +0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0xaf,0x25,0x2f,0x2f,0x25,0x26,0x30,0x30,0x19,0x80,0x80,0x06,0x54,0x2b,0x21,0x1f,0x2c,0x2c,0x1f,0x20,0x2c,0xfc,0x79,0x02,0xcf,0x00,0xff,0xff,0x00,0x68,0x03,0x74,0x02,0x92,0x06,0xda,0x02,0x07,0x00,0xf1,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x81,0x03,0x5f,0x02,0x8e, +0x06,0xda,0x02,0x07,0x00,0xf2,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x50,0x03,0x74,0x01,0xc2,0x06,0xdc,0x02,0x07,0x00,0xf0,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x48,0x03,0x60,0x02,0xa5,0x06,0xda,0x02,0x07,0x08,0x8d,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x2f,0x03,0x74,0x02,0xaa,0x06,0xc6,0x02,0x07,0x02,0x38,0x00,0x00,0x01,0x2c, +0xff,0xff,0x00,0x7b,0x03,0x5f,0x02,0x8a,0x06,0xca,0x02,0x07,0x02,0x39,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x49,0x03,0x60,0x02,0xa6,0x06,0xda,0x02,0x07,0x08,0x8e,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x4d,0x03,0x74,0x02,0xa0,0x06,0xd0,0x02,0x07,0x02,0x3a,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x41,0x03,0x60,0x02,0xad,0x06,0xda, +0x02,0x07,0x02,0x3b,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x49,0x03,0x5f,0x02,0xa6,0x06,0xda,0x02,0x07,0x08,0x8f,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x5d,0x03,0xf7,0x02,0x91,0x06,0x2b,0x02,0x07,0x08,0x90,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x5d,0x04,0xdf,0x02,0x91,0x05,0x43,0x02,0x07,0x08,0x91,0x00,0x00,0x01,0x2c,0xff,0xff, +0x00,0x5d,0x04,0x4e,0x02,0x91,0x05,0xd4,0x02,0x07,0x08,0x92,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0xcc,0x02,0xfa,0x02,0x06,0x07,0x1a,0x02,0x07,0x08,0x93,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x64,0x02,0xfa,0x01,0x9e,0x07,0x1a,0x02,0x07,0x08,0x94,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x48,0xfe,0xfa,0x02,0xa5,0x02,0x74,0x03,0x07, +0x08,0x8d,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0x0e,0x01,0xc2,0x02,0x76,0x03,0x07,0x00,0xf0,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0x0e,0x02,0x92,0x02,0x74, +0x03,0x07,0x00,0xf1,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x81,0xfe,0xf9,0x02,0x8e,0x02,0x74,0x03,0x07,0x00,0xf2,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x2f,0xff,0x0e,0x02,0xaa,0x02,0x60, +0x03,0x07,0x02,0x38,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7b,0xfe,0xf9,0x02,0x8a,0x02,0x64,0x03,0x07,0x02,0x39,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0xfe,0xfa,0x02,0xa6, +0x02,0x74,0x03,0x07,0x08,0x8e,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x4d,0xff,0x0e,0x02,0xa0,0x02,0x6a,0x03,0x07,0x02,0x3a,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x41,0xfe,0xfa, +0x02,0xad,0x02,0x74,0x03,0x07,0x02,0x3b,0x00,0x00,0xfc,0xc6,0x00,0x11,0x40,0x09,0x02,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x49,0xfe,0xf9,0x02,0xa6,0x02,0x74,0x03,0x07,0x08,0x8f,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d, +0x35,0x35,0xff,0xff,0x00,0x5d,0xff,0x91,0x02,0x91,0x01,0xc5,0x03,0x07,0x08,0x90,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x5d,0x00,0x79,0x02,0x91,0x00,0xdd,0x03,0x07,0x08,0x91,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11, +0x5d,0x35,0xff,0xff,0x00,0x5d,0xff,0xe8,0x02,0x91,0x01,0x6e,0x03,0x07,0x08,0x92,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xcc,0xfe,0x94,0x02,0x06,0x02,0xb4,0x03,0x07,0x08,0x93,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00, +0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x64,0xfe,0x94,0x01,0x9e,0x02,0xb4,0x03,0x07,0x08,0x94,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0xbc,0xfe,0x7e,0x06,0x12,0x07,0x4e,0x00,0x17,0x00,0x24,0x00,0x77,0x40,0x16,0x24,0xc4,0x18,0x1e,0xc4,0x1f,0x1f,0x00,0x0c,0x0f, +0x04,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7e,0x0e,0xb8,0xff,0xfe,0x40,0x17,0x0b,0x06,0x4d,0x0e,0x04,0x03,0x40,0x01,0x01,0x00,0x04,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x16,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xdc,0x40,0x11,0x0b,0x06,0x4d,0x05,0x24,0x1e,0x80,0x21,0xda,0x1b,0x17, +0x03,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xd6,0xed,0x1a,0xcc,0x32,0x01,0x2f,0x2b,0x2b,0x33,0xf1,0x2b,0x2b,0xc1,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x31,0x30,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x14,0x07,0x33,0x36, +0x37,0x01,0x33,0x03,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x05,0x40,0xd2,0xb8,0xc1,0xab,0xac,0x0a,0x06,0x13,0x1b,0xfd,0x1e,0xd0,0xa8,0x08,0x04,0x16,0x22,0x02,0xd0,0xd8,0xd4,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68,0x0c,0x96,0xfd,0xe8,0x01,0x82,0x04,0x0c,0x8c,0x39,0x31,0x29,0xfb,0x89, +0x05,0x9a,0xfc,0x0e,0xa2,0x31,0x2c,0x34,0x04,0x65,0x01,0xb4,0x8d,0xa3,0xa3,0x8d,0xbc,0x63,0x59,0x00,0x00,0x02,0x00,0xa6,0xfe,0x8b,0x04,0xda,0x05,0xf2,0x00,0x11,0x00,0x1e,0x00,0x49,0x40,0x0a,0x1e,0xc4,0x12,0x18,0xc4,0x19,0x19,0x01,0x05,0x08,0xb8,0x01,0x2e,0xb6,0x07,0x00,0x11,0x0f,0x0f,0x40,0x0e,0xb8,0x01,0x2e,0x40,0x0f, +0x0c,0x01,0x11,0x1e,0x18,0x80,0x1b,0xda,0x15,0x0d,0x0f,0x0e,0xec,0x01,0x15,0x00,0x3f,0xed,0x3f,0xd6,0xed,0x1a,0xcc,0x32,0x2f,0x01,0x2f,0x33,0xf1,0x1a,0xc9,0x2f,0xcd,0x39,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x36,0x37,0x01,0x33,0x11,0x33,0x03,0x23,0x13, +0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x04,0x19,0xad,0x16,0x2d,0xfe,0x27,0xaa,0x96,0x0c,0x28,0x01,0xe6,0xaa,0xda,0xb0,0xb4,0x4e,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68,0x0c,0x03,0x31,0x2b,0x4e,0xfd,0x48,0x04,0x00,0xfc,0xd9,0x1d,0x46,0x02,0xc4,0xfc,0x96,0xfd,0xf5,0x07,0x67,0x8d,0xa3, +0xa3,0x8d,0xbc,0x63,0x59,0x00,0x00,0x01,0x00,0x10,0xfe,0x7e,0x05,0x76,0x05,0x9a,0x00,0x16,0x00,0x62,0x40,0x19,0x0b,0x18,0x0b,0x00,0x4d,0x04,0x03,0x01,0x01,0x00,0x08,0x0b,0x0d,0x06,0x4c,0x00,0x7e,0x07,0x15,0x05,0x28,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xda,0x40,0x1a,0x0b,0x06,0x4d,0x20, +0x05,0x01,0x05,0x15,0x05,0x15,0x18,0x0f,0x06,0x91,0x16,0x03,0x0f,0x11,0x91,0x0c,0x13,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xfd,0xc6,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x2b,0x2b,0x11,0x33,0xf1,0x2b,0xc1,0x2f,0xcd,0x39,0x31,0x30,0x00,0x2b,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x21,0x02,0x02, +0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x04,0xa4,0xd2,0xb8,0xc1,0xab,0xac,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0x96,0xfd,0xe8,0x01,0x82,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0x00,0x01,0x00,0x10,0xfe,0x8b, +0x04,0x6c,0x04,0x00,0x00,0x12,0x00,0x36,0x40,0x1c,0x07,0xed,0x11,0x04,0x03,0x01,0x01,0x00,0x84,0x11,0x0d,0x05,0x05,0x14,0x0d,0x06,0x95,0x12,0x0f,0x0f,0x95,0x0a,0x15,0x00,0xec,0x05,0x15,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0xf1,0xc1,0x2f,0xcd,0x39,0x10,0xed,0x31,0x30,0x25,0x33, +0x03,0x23,0x13,0x23,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x03,0x91,0xdb,0xb0,0xb4,0xa3,0xbd,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x96,0xfd,0xf5,0x01,0x75,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0x00,0x01,0x00,0xbc,0xfe,0x7e,0x05,0xc4,0x05,0x9a,0x00,0x0f, +0x00,0x4c,0x40,0x17,0x02,0x06,0x91,0x40,0x0b,0x0a,0x07,0x0b,0x91,0x2b,0x30,0x0d,0x0a,0x03,0x0f,0x91,0x04,0x40,0x04,0x07,0x03,0x00,0x01,0xb8,0x01,0x2c,0x40,0x0e,0x02,0x80,0x00,0x00,0x0f,0x7e,0x0c,0x05,0x05,0x11,0x0b,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0xc1,0x2f,0x1a,0xdd,0xe1,0x12,0x39,0x00,0x2f,0x33, +0x1a,0x10,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x2f,0x31,0x30,0x25,0x03,0x23,0x13,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x05,0xc4,0xb8,0xc1,0xab,0xac,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x96,0xfd,0xe8,0x01,0x82,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xfc,0x00,0x01,0x00,0xa6, +0xfe,0x8b,0x04,0xd3,0x04,0x00,0x00,0x0f,0x00,0x4a,0x40,0x14,0x06,0x95,0x40,0x0b,0x0a,0x07,0x0b,0x95,0x2b,0x30,0x0d,0x0a,0x0f,0x02,0x0f,0xec,0x04,0x04,0x07,0x01,0xb8,0x01,0x2c,0x40,0x10,0x02,0x03,0x00,0x00,0x03,0x03,0x0f,0x84,0x0c,0x05,0x05,0x11,0x0b,0x06,0x84,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x32,0x2f,0x33, +0x2f,0x10,0xdd,0xe1,0x00,0x2f,0x33,0x10,0xed,0x2f,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x25,0x03,0x23,0x13,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0xd3,0xb0,0xb4,0xa3,0xbe,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x96,0xfd,0xf5,0x01,0x75,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4, +0xfc,0x96,0x00,0x01,0x00,0xbc,0xfe,0x7e,0x07,0x44,0x05,0x9a,0x00,0x1f,0x00,0x2b,0x40,0x15,0x04,0x03,0x01,0x01,0x00,0x7e,0x1e,0x05,0x05,0x21,0x17,0x14,0x7e,0x15,0x1f,0x03,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0xc1,0x2f,0xcd,0x39,0x31,0x30,0x25,0x33,0x03,0x23,0x13, +0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x06,0x72,0xd2,0xb8,0xc1,0xab,0xab,0x0e,0x04,0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x15,0x16,0x04,0x08,0xa2,0xde,0x01,0xb8,0x33,0x0f,0x06,0x2b,0x1a,0x01,0xc1,0xd2,0x96,0xfd,0xe8,0x01,0x82, +0x03,0xc2,0x72,0xa5,0x61,0x2a,0xfb,0xb2,0x04,0x46,0x30,0x63,0x56,0xc3,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x73,0x39,0x76,0x3a,0x03,0xe4,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x05,0xd3,0x04,0x00,0x00,0x17,0x00,0x29,0x40,0x14,0x04,0x03,0x01,0x16,0x00,0x84,0x05,0x05,0x19,0x11,0x0e,0xed,0x0f,0x17,0x0f,0x00,0xec,0x05,0x15,0x03,0x00,0x2f, +0x3f,0xed,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xe1,0x33,0xdd,0xcd,0x39,0x31,0x30,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01,0x33,0x04,0xf8,0xdb,0xb0,0xb4,0xa3,0xbc,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49, +0x01,0x06,0xda,0x96,0xfd,0xf5,0x01,0x75,0x03,0x4c,0x40,0x7c,0xfd,0x70,0x02,0x90,0x35,0x87,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x49,0x81,0xc6,0x02,0xa0,0x00,0x00,0x01,0x00,0x5a,0x01,0xfa,0x03,0xf6,0x02,0x7b,0x00,0x03,0x00,0x0e,0xb4,0x03,0x02,0x01,0xeb,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0xf6, +0xfc,0x64,0x03,0x9c,0x01,0xfa,0x81,0x00,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x1c,0x40,0x0e,0x05,0xb4,0x07,0x01,0xb4,0x03,0x06,0xb3,0x07,0x04,0x02,0xb3,0x03,0x04,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x13,0x23,0x03,0x21,0x13,0x23,0x03,0x01,0x04,0x6c,0x76, +0x8c,0x01,0xc3,0x6f,0x76,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x03,0x00,0x8d,0x03,0xdb,0x03,0x9d,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x20,0x40,0x0e,0x08,0x0a,0x04,0x06,0x00,0x02,0x0a,0x06,0x02,0xb3,0x0b,0x07,0x03,0x03,0x00,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x2f,0xcd,0x2f,0xcd, +0x31,0x30,0x01,0x03,0x23,0x13,0x21,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x01,0x69,0x69,0x73,0x55,0x02,0xbb,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x03,0x00,0xe8,0x00,0x69,0x04,0x94,0x04,0x3a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x43,0x40,0x1b,0x02,0x01, +0xbe,0x59,0x0a,0x02,0x0e,0x59,0x0a,0x09,0xbe,0x59,0x06,0x05,0xbe,0x59,0x0a,0x06,0x42,0x06,0x4f,0x0a,0x01,0x0a,0x03,0x0b,0x04,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x04,0x02,0x0a,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x33,0x33,0x2f,0x2b,0x33,0x33,0x00,0x2f,0x5d,0xc6,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x25, +0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0x69,0x84,0x02,0xc9,0x84,0xfd,0xd9,0x84,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x03,0xdf,0x05,0xb2,0x00,0x15,0x00,0x1f,0x40,0x0f,0x0b,0x15,0x15,0x17,0x10,0x7d,0x05,0x0d,0x91,0x08,0x04,0x13,0x91,0x02, +0x13,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe1,0x11,0x39,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x37,0x03,0xdf,0x85,0xc7,0xff,0x00,0xfe,0xcb,0x01,0x5b,0x01,0x0b,0xab,0x70,0x7c,0x96,0xc7,0xf8,0xe7,0xbc,0xaf,0x7f,0x3c,0x54,0x01,0x8a,0x01, +0x40,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0xd2,0x05,0x9a,0x00,0x25,0x00,0x32,0x40,0x1a,0x0b,0x7e,0x09,0x0c,0x0c,0x27,0x00,0x23,0x7e,0x24,0x04,0x1e,0x10,0x03,0x25,0x18,0x18,0x24,0x25,0x03,0x24,0x12,0x0c,0x12,0x09,0x03,0x00,0x3f,0x3f,0x3f, +0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x31,0x30,0x01,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x11,0x23,0x11,0x34,0x36,0x37,0x23,0x0e,0x03,0x07,0x01,0x23,0x01,0x2e,0x03,0x27,0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x01,0x95,0x01,0x74,0x19,0x21,0x08,0x06,0x0a,0x1d,0x1a,0x01, +0x64,0xdc,0xa7,0x07,0x07,0x04,0x07,0x18,0x1b,0x16,0x05,0xfe,0x8f,0x52,0xfe,0x90,0x04,0x19,0x1a,0x17,0x05,0x04,0x04,0x04,0xa2,0x05,0x9a,0xfd,0x56,0x2d,0x4e,0x1d,0x1e,0x50,0x2e,0x02,0xa6,0xfa,0x66,0x03,0xc2,0x39,0x91,0x53,0x18,0x3b,0x37,0x2c,0x0b,0xfd,0x58,0x02,0xa6,0x0c,0x2d,0x37,0x3a,0x19,0x2b,0x92,0x62,0xfc,0x40,0x05, +0x9a,0x00,0x00,0x01,0x00,0xa6,0xfe,0x2a,0x04,0xf8,0x04,0x00,0x00,0x13,0x00,0x32,0x40,0x1a,0x13,0x84,0x12,0x02,0x02,0x15,0x0d,0x09,0xed,0x0c,0x12,0x0f,0x10,0x09,0x02,0x03,0x0c,0x06,0x06,0x01,0x0c,0x0f,0x0b,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xe1, +0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01,0x33,0x04,0xf8,0xa2,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49,0x01,0x06,0xda,0x03,0x4c,0x2c,0x54,0xfe,0x42,0x01,0xbe,0x24,0x5c,0xfa,0xde,0x05,0xd6,0xfe,0x33,0x32,0x59,0x89,0x01, +0xcf,0x00,0x00,0x01,0xff,0xdc,0xfe,0x68,0x00,0x24,0x06,0xd6,0x00,0x03,0x00,0x11,0xb3,0x03,0x02,0x1b,0x01,0xb9,0x04,0xf1,0x00,0x02,0x2f,0xed,0x00,0x3f,0x2f,0x31,0x30,0x13,0x11,0x23,0x11,0x24,0x48,0x06,0xd6,0xf7,0x92,0x08,0x6e,0x00,0x00,0x01,0xff,0x25,0xfe,0x68,0x00,0xdb,0x06,0xd6,0x00,0x0e,0x00,0x44,0x40,0x0c,0x07,0x06, +0x03,0x04,0x01,0x09,0x0a,0x0d,0x0c,0x08,0x0b,0x00,0xb8,0x04,0xf1,0x40,0x13,0x05,0x01,0x0a,0x09,0x07,0x0c,0x0d,0x08,0x0b,0x05,0x02,0x0e,0x05,0x04,0x03,0x06,0x07,0x01,0x1b,0x00,0x3f,0x2f,0x33,0xdc,0x32,0x17,0x39,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0xfd,0x32,0x39,0xde,0x32,0xc4,0x32,0x10,0xde,0x32,0xc4,0x32,0x31,0x30, +0x13,0x23,0x11,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x24,0x48,0x86,0x31,0xab,0xab,0x31,0xaa,0xaa,0x31,0xab,0xab,0x31,0x86,0xfe,0x68,0x07,0x43,0x88,0x31,0xa9,0xa8,0x31,0xab,0xab,0x31,0xa8,0xa9,0x31,0x88,0x00,0x00,0x01,0xff,0xdc,0xfe,0x68,0x01,0xaf,0x06,0xd6,0x00,0x0a,0x00,0x30,0xb7,0x0a,0x09,0x03, +0x08,0x00,0x01,0x02,0x07,0xb8,0x04,0xf1,0xb4,0x04,0x02,0x01,0x00,0x04,0xb8,0x04,0xf1,0xb4,0x08,0x09,0x0a,0x05,0x1b,0x00,0x3f,0x2f,0x33,0xdd,0xfd,0x39,0xcc,0x32,0x01,0x2f,0xed,0xde,0x32,0xcd,0x39,0x39,0xc4,0x32,0x31,0x30,0x01,0x07,0x27,0x37,0x21,0x11,0x23,0x11,0x21,0x27,0x37,0x01,0xaf,0xd9,0x31,0x89,0xfe,0xf6,0x48,0x01, +0x52,0x89,0x31,0x05,0xff,0xd6,0x31,0x82,0xf8,0x8c,0x07,0xbb,0x82,0x31,0x00,0x01,0xfe,0x51,0xfe,0x68,0x00,0x24,0x06,0xd6,0x00,0x0a,0x00,0x32,0xb7,0x03,0x09,0x06,0x05,0x04,0x07,0x08,0x0a,0xb8,0x04,0xf1,0xb5,0x02,0x06,0x09,0x04,0x05,0x02,0xb8,0x04,0xf1,0xb4,0x09,0x08,0x07,0x00,0x1b,0x00,0x3f,0x2f,0x33,0xdd,0xfd,0xcc,0x32, +0x12,0x39,0x01,0x2f,0xed,0xdc,0x32,0xc4,0x32,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x21,0x17,0x07,0x27,0x37,0x17,0x07,0x21,0x24,0x48,0xfe,0xf6,0x89,0x31,0xd9,0xd9,0x31,0x89,0x01,0x52,0xfe,0x68,0x07,0x74,0x82,0x31,0xd6,0xd7,0x31,0x82,0x00,0x00,0x01,0x00,0xab,0xff,0xf2,0x02,0x01,0x05,0xec,0x00,0x0e,0x00,0x1b,0xb1,0x0e, +0x09,0xb8,0x05,0x0a,0xb2,0x06,0x07,0x0e,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x01,0x2f,0xed,0xc4,0x31,0x30,0x05,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x02,0x01,0x14,0x66,0x7f,0x45,0x18,0x9c,0x0a,0x26,0x4a,0x40,0x0e,0x3e,0x66,0x82,0x45,0x04,0x8f,0xfb,0xac,0x42,0x60,0x3f,0x1e,0x00, +0xff,0xff,0x00,0x49,0xff,0xf2,0x02,0x01,0x07,0xe9,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x00,0xff,0xff,0xff,0xa2,0xff,0xf2,0x02,0x65,0x07,0x30,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x37,0x00,0x00,0xff,0xff,0x00,0x49,0xfd,0xfe,0x02,0x01,0x05,0xec,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x7f, +0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f, +0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xa3,0xff,0xa7,0x00,0x01,0xff,0xba,0xff,0xf2, +0x04,0x7c,0x03,0x0f,0x00,0x28,0x00,0x2c,0x40,0x0a,0x0c,0x21,0x2a,0x15,0x21,0x0c,0x20,0x03,0x00,0x12,0xb8,0x04,0xff,0xb4,0x2f,0x19,0x01,0x19,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x12,0x17,0x39,0x01,0x2f,0x12,0x39,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37, +0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x0e,0x05,0x23,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x2b,0x73,0x92,0xb1,0xd0,0xf1,0x88,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39, +0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x0a,0x42,0x59,0x62,0x53,0x36,0x00,0x00,0x01,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x00,0x40,0x00,0x5c,0xb9,0x00,0x03,0x05,0x0b,0x40,0x0c,0x0f,0x00,0x0f,0x1c,0x0f,0x35,0x35,0x0f,0x1c,0x03,0x09,0x14,0xb8,0x05,0x0a,0xb3,0x25,0x09,0x03, +0x0f,0xb8,0x04,0xfb,0xb5,0x40,0x39,0x2d,0x2d,0x20,0x32,0xbb,0x04,0xff,0x00,0x39,0x00,0x19,0x04,0xfc,0xb6,0x1f,0x20,0x2f,0x20,0x02,0x20,0x08,0xba,0x04,0xfb,0x00,0x09,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xe4,0x32,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed, +0x31,0x30,0x01,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x04,0x0c,0x22,0x40,0x1e,0x05,0x26,0x46,0x69,0x47,0x18,0x63, +0x8f,0x5f,0x31,0x05,0x8d,0xc0,0x75,0x32,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x02,0x01,0x09,0x12,0x09,0x60,0x7e,0x49,0x1d,0xa7,0x3f,0x75,0xa6,0x67,0x33,0x6e,0x77,0x80, +0x45,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff, +0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xda,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0x00,0x01,0xff,0xba,0xff,0xf2,0x05,0xf4,0x03,0x0f,0x00,0x42,0x00,0x60,0xb1,0x18,0x00,0xbb,0x05,0x0a,0x00,0x40,0x00,0x0d,0x05,0x0a,0x40,0x09,0x0a,0x21,0x33,0x40,0x0a,0x40,0x0a,0x44,0x36,0xb8,0x05,0x0a,0xb6,0x33, +0x41,0x2f,0x35,0x01,0x35,0x26,0xba,0x05,0x03,0x00,0x1d,0x05,0x03,0xb7,0x3b,0x2e,0x2e,0x2d,0x2d,0x21,0x18,0x05,0xba,0x04,0xfb,0x00,0x12,0x05,0x03,0xb3,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0x3f,0xed,0x39,0x39,0x32,0x11,0x33,0x11,0x33,0x3f,0x3f,0x2f,0x5d,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10, +0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0xf3,0x0b,0x27, +0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x39,0x5d,0x77,0x3f,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x21,0x64,0x77,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe, +0x37,0x6c,0x85,0x4a,0x19,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0x0b,0xc9,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57, +0x00,0x02,0xff,0xba,0xff,0xea,0x07,0x4b,0x03,0x3c,0x00,0x39,0x00,0x4b,0x00,0x52,0xb9,0x00,0x2a,0x05,0x0a,0x40,0x0d,0x3f,0x49,0x1e,0x1e,0x15,0x3f,0x3f,0x4d,0x16,0x15,0x00,0x15,0x31,0xba,0x05,0x03,0x00,0x44,0x04,0xfb,0x40,0x0f,0x2f,0x25,0x01,0x25,0x2f,0x15,0x01,0x15,0x49,0x49,0x3a,0x3a,0x1e,0x1e,0x0c,0xba,0x04,0xfb,0x00, +0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x33,0x11,0x33,0x2f,0x2f,0x5d,0x2f,0x5d,0xed,0x3f,0x12,0x39,0x01,0x2f,0xcd,0x12,0x39,0x2f,0x12,0x39,0x10,0xcd,0x10,0xed,0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32, +0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x26,0x26,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x01,0x98,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x27,0x42,0x30,0x1c,0x0f,0x0d,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4, +0x65,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb3,0xff,0x00,0xaf,0x69,0x1b,0x23,0x2e,0x14,0x03,0x61,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x6d,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x18,0x27,0x33,0x1b,0x30,0x6e,0x3d,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95, +0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55,0x2f,0x16,0x05,0x01,0x06,0x0d,0x0c,0x0f,0x31,0x23,0x26,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0x00,0x01,0x00,0xb9,0x01,0xac,0x02,0x89,0x03,0x7c,0x00,0x13,0x00,0x13,0xb6,0x0f,0x05,0x05,0x15,0x14,0x00,0x0a,0x00,0x2f,0xcd,0x11,0x12,0x01, +0x39,0x2f,0xcd,0x31,0x30,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xa3,0x29,0x52,0x45,0x2a,0x2b,0x44,0x52,0x29,0x29,0x51,0x43,0x29,0x29,0x43,0x51,0x01,0xac,0x29,0x43,0x51,0x29,0x28,0x53,0x44,0x2b,0x2a,0x45,0x52,0x29,0x29,0x51,0x43,0x29,0x00,0x01,0x00,0x2b,0x00,0x00,0x01,0x56, +0x05,0x9a,0x00,0x0f,0x00,0x19,0xbc,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x08,0x04,0xe6,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x3f,0x01,0x2f,0xed,0x31,0x30,0x13,0x1e,0x05,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x17,0x26,0x1f,0x18,0x0f,0x08,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0x62,0xad,0xa2,0x9f,0xaa,0xb9,0x6c, +0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x01,0x00,0x2b,0x00,0x00,0x03,0x50,0x05,0x9a,0x00,0x0f,0x00,0x28,0xb5,0x03,0x0a,0x01,0x01,0x11,0x09,0xbd,0x05,0x0a,0x00,0x0a,0x00,0x09,0x04,0xe6,0x00,0x02,0x04,0xfb,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x31,0x30, +0x13,0x21,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x2b,0x03,0x25,0xfd,0xa1,0x19,0x26,0x19,0x0d,0x9c,0x11,0x23,0x36,0x05,0x9a,0xa7,0x71,0xca,0xd0,0xe4,0x89,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x00,0x01,0x00,0x2b,0x00,0x00,0x04,0x1a,0x05,0x9a,0x00,0x38,0x00,0x5c,0xb3,0x1c,0x0d,0x32,0x1f,0xbb, +0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x40,0x0d,0x0b,0x27,0x0b,0x1a,0x0b,0x1a,0x0b,0x3a,0x32,0x03,0x2b,0x2b,0x31,0xbb,0x05,0x0a,0x00,0x32,0x00,0x31,0x04,0xe6,0xb4,0x2b,0x2b,0x29,0x29,0x24,0xb8,0x04,0xfc,0xb7,0x06,0x15,0x1c,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x32,0x2f,0x33,0xed,0x32,0x2f,0x32,0x2f,0x3f,0x01, +0x2f,0xed,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x27,0x1e, +0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x15,0x24,0x0f,0x15,0x26,0x11,0x2a,0x3b,0x26,0x11,0x24,0x9d,0x24,0x1f,0x1d,0x34,0x17,0x2a,0x3b,0x26,0x11,0x24,0x9d,0x24,0x26,0x4a,0x6c,0x46,0x2d,0x67,0x3c,0x47,0x63,0x29,0x2b,0x0b,0x10,0x0b,0x06,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0x5b,0xa1,0x4c,0x05,0x04,0x1c,0x30, +0x3f,0x24,0x54,0x4e,0x59,0x56,0x51,0x40,0x09,0x08,0x1c,0x30,0x3f,0x24,0x54,0x4e,0x59,0x56,0x3e,0x6b,0x4f,0x2d,0x18,0x1c,0x33,0x09,0x43,0x88,0x91,0x9f,0x5a,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x00,0x01,0x00,0x62,0xff,0xea,0x02,0xf5,0x05,0xb8,0x00,0x31,0x00,0x3f,0xb9,0x00,0x2c,0x05,0x0a,0xb2,0x21,0x21, +0x07,0xb8,0x05,0x0a,0xb7,0x17,0x17,0x33,0x32,0x31,0x1c,0x12,0x27,0xb8,0x05,0x02,0xb7,0x2f,0x26,0x01,0x26,0x0f,0x10,0x10,0x0c,0xba,0x04,0xfb,0x00,0x12,0x05,0x03,0x00,0x3f,0xed,0x33,0x11,0x33,0x2f,0x5d,0xed,0x12,0x39,0x39,0x11,0x12,0x01,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x0e,0x05,0x15,0x14,0x1e,0x02,0x33,0x32, +0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x02,0x67,0x54,0x76,0x50,0x2e,0x18,0x07,0x2b,0x47,0x58,0x2d,0x4b,0x79,0x3a,0x7e,0x8e,0x47,0x8b,0x70,0x45,0x1b,0x42,0x6f,0x54,0x50,0x6b,0x3f,0x1a,0x2c,0x6d,0xb6,0x8a,0x73,0x87,0x45, +0x14,0x1f,0x52,0x90,0x72,0x03,0x13,0x4e,0x7f,0x67,0x50,0x3b,0x29,0x0c,0x2a,0x35,0x1d,0x0a,0x13,0x0f,0xa5,0x2c,0x1d,0x40,0x65,0x47,0x29,0x69,0x7e,0x93,0x53,0x25,0x44,0x45,0x49,0x2a,0x36,0x71,0x6f,0x69,0x2f,0xb0,0x24,0x46,0x3f,0x33,0x10,0x18,0x29,0x35,0x48,0x38,0x00,0x02,0x00,0x4f,0x00,0x9c,0x03,0xa9,0x04,0xd2,0x00,0x15, +0x00,0x29,0x00,0x31,0xb9,0x00,0x1b,0x05,0x0a,0xb3,0x0f,0x0f,0x2a,0x05,0xbb,0x05,0x0a,0x00,0x25,0x00,0x0a,0x04,0xfb,0xb4,0x2f,0x20,0x01,0x20,0x16,0xb8,0x04,0xff,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e, +0x02,0x35,0x34,0x3e,0x04,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0xf4,0x47,0x9b,0x80,0x53,0x3d,0x72,0xa4,0x67,0x65,0x9b,0x6a,0x36,0x27,0x41,0x56,0x5e,0x5f,0x28,0x28,0x5c,0x4e,0x34,0x2a,0x48,0x5f,0x36,0x4a,0x6a,0x45,0x20,0x3b,0x56,0x62,0x04,0xd2,0x55,0xa5,0xf2,0x9c,0x60,0x9f, +0x71,0x3e,0x38,0x66,0x90,0x59,0x69,0xb7,0x99,0x78,0x52,0x2c,0xa2,0x4a,0x85,0xbb,0x70,0x41,0x5c,0x3a,0x1a,0x22,0x3e,0x58,0x37,0x77,0xbd,0x83,0x45,0x00,0x00,0x01,0xff,0xef,0x00,0x00,0x03,0x92,0x05,0x9a,0x00,0x15,0x00,0x22,0xb1,0x15,0x0e,0xb8,0x05,0x0a,0xb2,0x00,0x09,0x0a,0xb8,0x04,0xfb,0xb4,0x2f,0x0d,0x01,0x0d,0x00,0xb8, +0x04,0xe6,0x00,0x3f,0x2f,0x5d,0xed,0x01,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x2e,0x07,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x02,0xee,0x18,0x25,0x1c,0x15,0x0e,0x0b,0x07,0x06,0x03,0x03,0xfd,0x9b,0x02,0xfc,0x06,0x04,0x08,0x0d,0x14,0x21,0x31,0x22,0x66,0xa6,0x8e,0x7c,0x79,0x7b,0x8d,0xa4,0x65,0x53,0xa7,0xc6,0x8c,0xd7, +0xb7,0xa6,0xb5,0xd5,0x8a,0x00,0x00,0x01,0xff,0xf4,0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x11,0x00,0x14,0xb1,0x04,0x0b,0xb8,0x04,0xe6,0xb4,0x07,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x3f,0x39,0x31,0x30,0x13,0x12,0x12,0x13,0x33,0x12,0x12,0x13,0x33,0x02,0x02,0x03,0x23,0x26,0x0a,0x02,0x27,0x93,0x65,0xae,0x4e,0x06,0x51,0xad, +0x64,0x9e,0x80,0xd8,0x61,0x94,0x33,0x69,0x6d,0x73,0x3d,0x05,0x9a,0xfe,0xf0,0xfd,0xc1,0xfe,0xcb,0x01,0x36,0x02,0x3f,0x01,0x0f,0xfe,0x9f,0xfd,0x39,0xfe,0x8e,0xc2,0x01,0x71,0x01,0x64,0x01,0x59,0xaa,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x04,0x4f,0x05,0x9a,0x00,0x11,0x00,0x21,0x40,0x0d,0x11,0x00,0x00,0x13,0x07,0x08,0x04,0x2f, +0x0d,0x01,0x0d,0x07,0x00,0xb8,0x04,0xe6,0x00,0x3f,0x32,0x2f,0x5d,0x39,0x01,0x2f,0x33,0x12,0x39,0x11,0x33,0x31,0x30,0x21,0x02,0x02,0x03,0x23,0x02,0x02,0x03,0x23,0x36,0x1a,0x02,0x37,0x33,0x12,0x12,0x13,0x03,0xb0,0x65,0xae,0x4e,0x06,0x51,0xad,0x64,0x9e,0x40,0x75,0x6d,0x66,0x31,0x94,0x66,0xd8,0x7b,0x01,0x10,0x02,0x3f,0x01, +0x35,0xfe,0xca,0xfd,0xc1,0xfe,0xf1,0xb1,0x01,0x61,0x01,0x65,0x01,0x6a,0xb9,0xfe,0x7d,0xfd,0x3c,0xfe,0xad,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x03,0xdb,0x05,0xa8,0x00,0x1e,0x00,0x33,0x00,0x3a,0xb9,0x00,0x1a,0x05,0x0a,0xb4,0x06,0x1f,0x1f,0x35,0x2c,0xb8,0x05,0x0a,0xb2,0x0d,0x06,0x08,0xb8,0x04,0xfb,0xb4,0x2f,0x31,0x01,0x31, +0x27,0xb8,0x04,0xfb,0xb4,0x2f,0x12,0x01,0x12,0x00,0xb8,0x04,0xe6,0x00,0x3f,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x23,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x01,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e, +0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x03,0xdb,0x9f,0x29,0x36,0x24,0x15,0x08,0x7e,0x78,0x50,0x8d,0x69,0x3e,0x33,0x60,0x8c,0x5a,0x58,0x8d,0x3c,0x20,0x26,0x16,0x0c,0x06,0x07,0x14,0x26,0x3e,0xfe,0xe5,0x04,0x08,0x0a,0x0e,0x0a,0x23,0x6f,0x45,0x2c,0x4b,0x37,0x20,0x28,0x46,0x61,0x39,0x30,0x67,0x61,0xbd,0xb1,0xa3,0x48,0x3b, +0x34,0x61,0x8e,0x5a,0x50,0x9a,0x78,0x4a,0x51,0x5e,0x33,0x63,0x6d,0x7b,0x49,0x52,0xb5,0xcb,0xe2,0x02,0xd4,0x2a,0x42,0x38,0x32,0x1a,0x58,0x61,0x26,0x40,0x58,0x31,0x37,0x56,0x3c,0x1f,0x17,0x00,0xff,0xff,0xff,0xba,0xff,0xea,0x07,0x4b,0x04,0xb2,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x01, +0xff,0xba,0xff,0xf2,0x04,0x3c,0x03,0x8a,0x00,0x2c,0x00,0x36,0xb9,0x00,0x24,0x05,0x0a,0xb5,0x13,0x13,0x2e,0x2d,0x1c,0x1f,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x18,0x01,0x18,0x00,0x2c,0x2c,0x29,0x29,0x0c,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0xed, +0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x37,0x04,0x3c,0x78,0xd5,0xc9,0xc5,0x67,0xfa,0x23,0x23,0x23,0x23,0x01,0x71,0x01,0x3e,0x4e,0x2c,0x0f,0x45,0x82,0xbc,0x77,0x28, +0x59,0x30,0x2e,0x63,0x36,0x3f,0x76,0x5c,0x37,0x16,0x36,0x5c,0x47,0x80,0xf9,0x8c,0xab,0x37,0x47,0x2a,0x11,0x34,0x20,0x20,0x33,0x06,0x33,0x63,0x5c,0x51,0x21,0x4f,0x8e,0x6b,0x3f,0x08,0x09,0xaa,0x08,0x0b,0x14,0x35,0x5a,0x45,0x21,0x4c,0x53,0x59,0x2e,0x19,0x54,0x42,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0xad,0x03,0x5e,0x00,0x29, +0x00,0x38,0x00,0x47,0xb3,0x28,0x13,0x23,0x31,0xb8,0x05,0x0a,0xb3,0x16,0x16,0x39,0x23,0xb8,0x05,0x0a,0xb7,0x2a,0x05,0x13,0x28,0x34,0x04,0x01,0x2d,0xb8,0x04,0xff,0xb7,0x2f,0x1c,0x01,0x1c,0x10,0x0f,0x0f,0x00,0xbb,0x04,0xfb,0x00,0x08,0x00,0x01,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x01, +0x2f,0xed,0x11,0x33,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x15,0x23,0x22,0x26,0x27,0x06,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x36,0x37,0x26,0x26,0x27,0x35,0x3e,0x03,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x16,0x16,0x17,0x3e,0x03,0x04,0xad,0x3e,0x87, +0xef,0x6d,0x67,0xfe,0xf0,0xae,0x67,0x23,0x23,0x23,0x23,0x71,0x80,0xc7,0x4f,0x6a,0xad,0x45,0x2d,0x72,0x7e,0x85,0x3f,0x27,0x54,0x50,0x47,0x36,0x20,0x19,0x35,0x52,0x39,0xb8,0x7c,0x79,0x67,0x4c,0x9e,0x49,0x45,0xa7,0x69,0x34,0x49,0x2d,0x14,0x99,0xa7,0x4a,0x45,0x40,0x4f,0x34,0x20,0x20,0x33,0x2a,0x23,0x58,0xd0,0x70,0xad,0x07, +0x12,0x0f,0x0b,0x05,0x10,0x1c,0x2d,0x41,0x2c,0x26,0x65,0x70,0x74,0x36,0x55,0x01,0xcb,0x33,0x2a,0x0f,0x08,0x0b,0x6a,0xb1,0x48,0x29,0x58,0x51,0x42,0x00,0x00,0x02,0x00,0x65,0xfd,0xff,0x04,0xad,0x03,0x95,0x00,0x3c,0x00,0x4a,0x00,0x63,0xb3,0x3a,0x23,0x1e,0x35,0xbb,0x05,0x0a,0x00,0x3d,0x00,0x44,0x05,0x0a,0xb2,0x28,0x28,0x0d, +0xb8,0x05,0x0a,0x40,0x0e,0x1e,0x3d,0x1e,0x3d,0x1e,0x4c,0x4b,0x08,0x3a,0x23,0x46,0x04,0x02,0x40,0xb8,0x04,0xff,0xb5,0x2f,0x2e,0x01,0x2e,0x15,0x12,0xb8,0x04,0xfc,0xb7,0x16,0x1f,0x19,0x2f,0x19,0x02,0x19,0x00,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0xed,0x12,0x17,0x39,0x11,0x12, +0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x27,0x35,0x3e,0x03,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x16,0x16, +0x03,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x16,0x17,0x3e,0x03,0x04,0x98,0x15,0x3e,0x56,0xa3,0x98,0x8d,0x40,0x4d,0x68,0x40,0x1b,0x2e,0x63,0x9e,0x71,0x61,0xc7,0x64,0x6d,0xbf,0x64,0x98,0xd7,0x89,0x40,0x1c,0x48,0x7e,0x62,0x20,0x46,0x44,0x3e,0x16,0x2d,0x72,0x7f,0x85,0x3f,0x27,0x54,0x4f,0x48,0x35,0x20,0x1b,0x48,0x80,0x66,0x70, +0xf2,0xb6,0x78,0x67,0x4c,0x9f,0x49,0x71,0x87,0x55,0x6e,0x40,0x18,0x99,0xa7,0x26,0x45,0x61,0x3b,0x20,0x46,0x4a,0x4f,0x28,0x40,0x72,0x55,0x32,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5b,0x36,0x69,0x69,0x67,0x33,0x22,0x58,0x5e,0x5d,0x26,0xa5,0x07,0x12,0x0f,0x0b,0x06,0x0f,0x1b,0x2c,0x3e,0x2a,0x23,0x5f,0x6b,0x6f,0x31,0x52, +0x59,0x02,0x07,0x2f,0x29,0x0f,0x08,0x0d,0xb0,0x81,0x26,0x4d,0x44,0x36,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x02,0xff,0xff, +0x00,0x65,0xfd,0xff,0x04,0xad,0x05,0x01,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x51,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07, +0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07, +0x0f,0x51,0x00,0xd5,0x04,0x74,0x00,0x01,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x00,0x21,0x00,0x33,0xb9,0x00,0x1a,0x05,0x0a,0x40,0x12,0x0c,0x0c,0x23,0x22,0x11,0x12,0x0c,0x1a,0x15,0x12,0x04,0x00,0x14,0x2f,0x13,0x01,0x13,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0x12,0x17,0x39,0x11,0x33,0x11, +0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x23,0x23,0x23,0x01,0x28,0x61,0x80,0x4c,0x1e,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0x8b,0xe1,0x9e,0x56,0x0b,0x23,0x42,0x6d,0xa0,0x6f,0x0e,0x34, +0x20,0x20,0x33,0x16,0x2a,0x3f,0x29,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x42,0x8a,0x97,0xa6,0x5d,0x1e,0x4a,0x4d,0x49,0x39,0x22,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x01,0xf2,0x05,0xec,0x00,0x16,0x00,0x20,0xb9,0x00,0x08,0x05,0x0a,0xb4,0x05,0x05,0x18,0x17,0x00,0xbb,0x04,0xfb,0x00,0x0f,0x05,0x03,0x00,0x06, +0x00,0x2f,0x3f,0xed,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x0f,0x2a,0x48,0x39,0x04,0x99,0xfb,0x60,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34, +0x20,0x20,0x33,0x00,0x00,0x02,0xff,0xba,0xff,0xf2,0x03,0xf4,0x02,0xaf,0x00,0x23,0x00,0x33,0x00,0x39,0xb9,0x00,0x16,0x05,0x0a,0x40,0x0a,0x2a,0x2a,0x35,0x34,0x20,0x24,0x0c,0x03,0x11,0x1b,0xba,0x05,0x03,0x00,0x2f,0x04,0xfb,0xb5,0x2f,0x11,0x01,0x11,0x27,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d, +0xed,0x3f,0x12,0x17,0x39,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57, +0x3b,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x35,0x9a,0x5e,0x01,0x6e,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3f,0x2d,0x0e,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1a,0x2f,0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f, +0x50,0x43,0x01,0x13,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x53,0xff,0xf2,0x05,0x32,0x04,0x53,0x02,0x06,0x0e,0x5c,0x00,0x00,0x00,0x03,0x00,0x67,0xfd,0xff,0x05,0x58, +0x03,0x56,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x61,0xb1,0x3f,0x40,0xb8,0x05,0x0a,0xb7,0x00,0x0b,0x0b,0x00,0x00,0x50,0x24,0x17,0xb8,0x05,0x0a,0xb4,0x35,0x4a,0x4a,0x35,0x45,0xb8,0x04,0xfb,0xb6,0x1f,0x29,0x2f,0x29,0x02,0x29,0x3a,0xb8,0x04,0xfb,0x40,0x0c,0x2f,0x12,0x01,0x12,0x3f,0x30,0x30,0x1e,0x1e,0x1d,0x1d,0x0b,0xb8,0x04, +0xfb,0xb2,0x40,0x20,0x00,0xb8,0x05,0x03,0x00,0x3f,0x32,0x32,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x27,0x1e,0x03,0x33,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x17, +0x21,0x15,0x21,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x01,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x02,0x01,0x53,0x7d,0x5b,0x3c,0x13,0x20,0x2c,0x5a,0x65,0x73,0x45,0x15,0x41,0x4e,0x55,0x52,0x49,0x1c,0x2e,0x53,0x3f,0x25,0x17, +0x27,0x34,0x1c,0x02,0x01,0x45,0xfe,0xc0,0x01,0x48,0x40,0x28,0x48,0x64,0x3d,0x26,0x55,0x56,0x50,0x3f,0x29,0x01,0x21,0x30,0x52,0x3a,0x21,0x11,0x1e,0x27,0x15,0x1a,0x48,0x48,0x3c,0x0e,0x0b,0x04,0x2e,0x45,0x52,0x29,0x21,0x2d,0x1c,0x0d,0x20,0x3d,0x58,0x38,0x0e,0x03,0x04,0x06,0x03,0xa9,0x05,0x07,0x04,0x02,0x85,0xcf,0x9c,0x6c, +0x43,0x1e,0x45,0x6e,0x88,0x43,0x35,0x5b,0x4e,0x41,0x19,0x07,0xa7,0x06,0x2d,0x78,0x3e,0x34,0x60,0x4a,0x2c,0x14,0x2e,0x4b,0x6f,0x96,0x01,0x08,0x33,0x53,0x69,0x36,0x28,0x55,0x46,0x2c,0x47,0x87,0xc7,0x7f,0xa7,0x58,0x7d,0x50,0x26,0x16,0x22,0x2c,0x16,0x24,0x4b,0x3c,0x26,0x00,0x00,0x02,0x00,0xa1,0xff,0xf2,0x04,0x02,0x03,0xd7, +0x00,0x1b,0x00,0x29,0x00,0x3f,0xb9,0x00,0x1c,0x05,0x0a,0xb4,0x16,0x16,0x2a,0x24,0x01,0xbb,0x05,0x0a,0x00,0x00,0x00,0x11,0x04,0xfb,0xb4,0x2f,0x21,0x01,0x21,0x07,0xbc,0x04,0xfb,0x00,0x08,0x05,0x03,0x00,0x25,0x04,0xfc,0xb4,0x1b,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xdd,0xed,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x33,0x11, +0x33,0x2f,0xed,0x31,0x30,0x01,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x02,0xac,0x9c,0x0f,0x29,0x48,0x3a,0x16,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65, +0xfe,0x8b,0x24,0x3a,0x4f,0x2a,0x27,0x55,0x22,0x4c,0x88,0x66,0x3b,0x03,0xd7,0xfd,0xb5,0x3e,0x5c,0x3c,0x1d,0xa7,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0xfe,0x66,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x03,0x0f,0x02,0x26, +0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x06,0xae,0x02,0x13,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x05,0x64,0x02,0x26,0x08,0xf3,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x29,0x04,0xb4,0x00,0x01,0x00,0x9a, +0xff,0x02,0x06,0xae,0x02,0x13,0x00,0x44,0x00,0x4c,0xb9,0x00,0x36,0x05,0x0a,0xb2,0x0f,0x0f,0x14,0xb8,0x05,0x0a,0xb3,0x31,0x31,0x46,0x27,0xbb,0x05,0x0a,0x00,0x20,0x00,0x0c,0x04,0xff,0xb4,0x2f,0x3b,0x01,0x3b,0x1b,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x2c,0x01,0x2c,0x2f,0x24,0x01,0x24,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00, +0x3f,0xed,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e, +0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x06,0xae,0x16,0x43,0x67,0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e, +0x21,0x2a,0x3b,0x52,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0x00,0x01, +0x00,0x6f,0xff,0xea,0x01,0x76,0x01,0xe7,0x00,0x12,0x00,0x1c,0xb1,0x09,0x0e,0xb8,0x05,0x0c,0xb5,0x05,0x05,0x14,0x13,0x08,0x00,0xb8,0x05,0x03,0x00,0x3f,0xcd,0x11,0x12,0x01,0x39,0x2f,0xed,0x39,0x31,0x30,0x17,0x22,0x2e,0x02,0x35,0x34,0x37,0x13,0x33,0x03,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0xf1,0x1b,0x2f,0x23,0x15,0x0a,0x6a, +0x75,0x4b,0x64,0x02,0x03,0x15,0x24,0x30,0x16,0x15,0x24,0x2f,0x1b,0x15,0x1e,0x01,0x47,0xfe,0xe3,0x23,0x0e,0x18,0x0b,0x23,0x35,0x23,0x11,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x14,0x05,0x3e,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35, +0xff,0xff,0x00,0x52,0xff,0xea,0x03,0xf3,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x07,0x0f,0x8c,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x07,0x0f,0x8d,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00, +0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x49,0xff,0xea,0x03,0xf3,0x07,0x78,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff, +0x00,0x49,0xff,0xea,0x04,0xad,0x07,0x78,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff,0xff,0xa2,0xff,0xea,0x03,0xf3,0x06,0xbf,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x02,0x2f,0x2d, +0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x82,0xff,0x02,0x06,0xae,0x04,0x21,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x39,0xfc,0x38,0x00,0x0a,0xb4,0x01,0x2f,0x5b,0x01,0x5b,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x00,0xfe,0xea,0x01,0x77,0x00,0xe4,0x00,0x0f,0x00,0x0a,0xb2,0x02,0x0d,0x07,0x00,0x2f,0x2f,0xcd, +0x30,0x31,0x15,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x36,0x2c,0x4a,0x41,0x2f,0x8c,0x2d,0x94,0x79,0x37,0x33,0x7b,0x0e,0x48,0x47,0x5e,0x80,0x79,0x6e,0x82,0x91,0x15,0xff,0xff,0xff,0xa2,0xff,0xea,0x04,0xad,0x06,0xbf,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00, +0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x02,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x6f,0xff,0xea,0x01,0x76,0x04,0x00,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x08,0xf8,0x00,0x00,0x02,0x19,0x00,0x02,0x00,0xab,0xff,0xee,0x03,0x57,0x05,0xb3,0x00,0x29,0x00,0x3d,0x00,0x3e,0xb5,0x00,0x2f,0x24,0x39,0x39, +0x24,0xb8,0x05,0x0a,0xb3,0x05,0x05,0x3f,0x1d,0xbd,0x05,0x0a,0x00,0x0c,0x00,0x34,0x04,0xfe,0x00,0x2a,0x05,0x03,0xb2,0x14,0x15,0x18,0xb8,0x04,0xfc,0xb3,0x2f,0x11,0x01,0x11,0x00,0x2f,0x5d,0xfd,0xc2,0x32,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x10,0xc4,0x39,0x31,0x30,0x01,0x3e,0x03,0x35,0x34,0x2e,0x04,0x35, +0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x03,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xf5,0x04,0x08,0x06,0x04,0x34,0x4e,0x5c,0x4e,0x34,0x3e,0x6c,0x91,0x53,0x48,0x91,0x45,0x3d,0x97,0x46,0x34,0x58,0x41,0x24, +0x33,0x4c,0x58,0x4c,0x33,0x04,0x06,0x09,0x04,0x5a,0x15,0x28,0x1f,0x13,0x12,0x1f,0x28,0x16,0x16,0x28,0x1f,0x12,0x13,0x1f,0x28,0x01,0x8e,0x0c,0x22,0x26,0x25,0x0f,0x3c,0x5b,0x4e,0x4a,0x58,0x6f,0x4b,0x51,0x81,0x5a,0x30,0x23,0x2a,0xac,0x39,0x34,0x1b,0x32,0x48,0x2e,0x38,0x5b,0x53,0x51,0x5c,0x6c,0x44,0x13,0x2a,0x27,0x23,0x0c, +0xfe,0x60,0x11,0x1d,0x28,0x18,0x17,0x29,0x1e,0x11,0x11,0x1e,0x29,0x17,0x18,0x28,0x1d,0x11,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0xe5,0x02,0xb4,0x00,0x1e,0x00,0x3a,0xb5,0x0c,0x00,0x0c,0x00,0x20,0x08,0xb8,0x05,0x0a,0xb3,0x16,0x1e,0x1e,0x03,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x1b,0x01,0x1b,0x10,0x10,0x0f,0x0f,0x0b,0xba,0x04,0xfb, +0x00,0x0d,0x04,0xe6,0x00,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x2f,0x5d,0xed,0x33,0x2f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x27,0x33,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x02,0xac,0x1d,0x43,0x20,0x30,0x53,0x3d,0x24,0x7b,0x79, +0xa9,0xfd,0x92,0x1d,0xa9,0x01,0x19,0x22,0x15,0x09,0x37,0x66,0x8f,0x58,0x1c,0x41,0x20,0x01,0xff,0x05,0x07,0x13,0x2a,0x42,0x30,0x5b,0x5e,0xa3,0x99,0x06,0x19,0x38,0x3b,0x39,0x19,0x45,0x72,0x52,0x2e,0x05,0x05,0x00,0xff,0xff,0xff,0xa2,0x00,0x00,0x02,0x65,0x07,0x30,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x37,0x00,0x00, +0xff,0xff,0x00,0x49,0x00,0x00,0x01,0xa2,0x07,0xe9,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x3e,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xe4,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4d,0x01,0x4d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0xfd,0xfe, +0x01,0xa2,0x05,0xec,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x7f,0x00,0x00,0xff,0xff,0x00,0x82,0xff,0x55,0x05,0x91,0x04,0xcc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0x39,0xfc,0xe3,0x00,0x01,0x00,0xab,0x00,0x00,0x01,0x47,0x05,0xec,0x00,0x03,0x00,0x15,0xbd,0x00,0x01,0x05,0x0a,0x00,0x00,0x00,0x02,0x04, +0xe6,0x00,0x01,0x00,0x2f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x13,0x33,0x11,0x23,0xab,0x9c,0x9c,0x05,0xec,0xfa,0x14,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x05,0x5d,0x02,0x26,0x09,0x28,0x00,0x00,0x00,0x07, +0x0f,0x51,0x01,0x01,0x04,0xad,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0x04,0x02,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54, +0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xc8,0xff,0xcf,0x00,0x01,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x40,0x40,0x0a,0x1d,0x00,0x31,0x03,0x16,0x0d,0x0d,0x33,0x26,0x05,0xb8,0x05,0x0a,0xb6,0x16,0x00,0x1d,0x31,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xff,0xb6,0x0e,0x1f, +0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33, +0x32,0x1e,0x04,0x17,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26, +0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0x00,0x01,0x00,0x52,0xff,0xea,0x03,0x4a,0x03,0xba,0x00,0x19, +0x00,0x24,0xb9,0x00,0x11,0x05,0x0a,0xb4,0x08,0x08,0x1b,0x1a,0x03,0xba,0x04,0xfb,0x00,0x16,0x05,0x03,0xb3,0x2f,0x0e,0x01,0x0e,0x00,0x2f,0x5d,0x3f,0xed,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x12,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x52,0x61,0xa6, +0x39,0x4f,0x6c,0x42,0x1d,0x3b,0x60,0x7b,0x40,0xb9,0x9f,0x9c,0x48,0x7a,0xa0,0x57,0x3a,0x9a,0x4b,0xa9,0x0b,0x0b,0x15,0x2c,0x44,0x2f,0x49,0x9c,0x9f,0xa1,0x4e,0xb1,0xfe,0xbf,0x91,0x63,0x80,0x4c,0x1e,0x0c,0x0a,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x05,0x5d,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab, +0x04,0xad,0x00,0x01,0x00,0x00,0xfd,0xff,0x02,0x9e,0x02,0x5e,0x00,0x1a,0x00,0x26,0xb9,0x00,0x12,0x05,0x0a,0xb2,0x07,0x00,0x02,0xb8,0x04,0xfb,0x40,0x0b,0x1a,0x1f,0x17,0x2f,0x17,0x02,0x17,0x2f,0x0d,0x01,0x0d,0x00,0x2f,0x5d,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x11,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02, +0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1a,0x28,0x1c,0x0f,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0xfe,0xd1,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x41,0x8e,0x8f,0x8b,0x3e,0x8a,0xd4,0x90,0x4a,0x16,0x17,0x00,0xff,0xff,0x00,0x00,0xfd,0xff, +0x02,0x9e,0x04,0x07,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x03,0x0f,0x00,0x4d,0x00,0x74,0xb9,0x00,0x1b,0x05,0x0a,0xb2,0x18,0x26,0x0e,0xb8,0x05,0x0a,0xb3,0x0b,0x2f,0x2f,0x03,0xb8,0x05,0x0a,0x40,0x0a,0x4a,0x18,0x0b,0x4a,0x4a,0x0b,0x18,0x03,0x4f,0x40, +0xb8,0x05,0x0a,0xb5,0x39,0x2f,0x3d,0x01,0x3d,0x45,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x34,0x2f,0x34,0x02,0x34,0x26,0x2f,0x13,0x06,0xbc,0x04,0xfb,0x00,0x2b,0x05,0x03,0x00,0x20,0x05,0x03,0x40,0x09,0x19,0x20,0x0d,0x01,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xd4,0x5d,0xc6,0x3f,0x3f,0xed,0x32,0x39,0x39,0x2f,0x5d,0xed,0x2f,0x5d, +0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x07,0x0e,0x03,0x23, +0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x04,0x80,0x08,0x0c,0x05,0x06,0x58,0x5e,0x22,0x3f,0x30,0x1d,0x9c,0x0b,0x27,0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x38,0x5d,0x78,0x3f,0x2c,0x4f,0x42,0x34,0x12,0x04,0x19,0x3f,0x44,0x46,0x1f,0x42,0x52,0x19,0x05,0x03, +0x3d,0x80,0xcc,0x91,0x8a,0xb9,0x70,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x10,0x02,0x01,0x3f,0x70,0x38,0x42,0x3f,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x37,0x6c,0x85,0x4a,0x19,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x26,0x20,0x01, +0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xbb,0x78,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x46,0x03,0x57,0x00,0x02,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x03,0x3c,0x00,0x42,0x00,0x56, +0x00,0x57,0xb3,0x54,0x09,0x13,0x3c,0xbe,0x05,0x0a,0x00,0x48,0x00,0x1a,0x05,0x0a,0x00,0x13,0x00,0x4d,0x04,0xfb,0x40,0x0d,0x2f,0x37,0x01,0x37,0x2f,0x28,0x01,0x28,0x2f,0x17,0x01,0x17,0x1f,0xb8,0x04,0xfb,0x40,0x0c,0x1f,0x0e,0x2f,0x0e,0x02,0x0e,0x54,0x54,0x43,0x43,0x09,0x30,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed, +0x39,0x32,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x26,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e, +0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x27,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x07,0x93,0xa1,0xe7,0x9d,0x5e,0x18,0x1f,0x28,0x12,0x05,0x03,0x3d,0x81,0xcd,0x94,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x17,0x9a,0x0b, +0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4,0x65,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9b,0x3b,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x85,0x75,0x65,0x52,0x3f,0x15,0x5c,0xee,0x16,0x01,0x03,0x08,0x07,0x09,0x1d,0x15,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39, +0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xc5,0x6e,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55,0x2f,0x16,0x05,0xa9,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x2a,0x49,0x63,0x71,0x7a,0x3c,0x02,0x01,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x04,0xb2,0x02,0x26, +0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0xca,0x04,0x02,0x00,0x02,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x00,0x20,0x00,0x34,0x00,0x3a,0xb9,0x00,0x0d,0x05,0x0a,0xb2,0x26,0x32,0x01,0xb8,0x05,0x0a,0xb5,0x00,0x32,0x32,0x21,0x21,0x1d,0xb8,0x04,0xfb,0xb3,0x03,0x1a,0x01,0x14,0xba,0x05,0x03,0x00,0x2b,0x04,0xfb,0xb1,0x08, +0x01,0x00,0x2f,0x2f,0xed,0x3f,0x12,0x39,0x39,0xed,0x32,0x11,0x33,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x33,0x11,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16, +0x01,0x55,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x5a,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x02,0x52,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x05,0xec,0xfc,0x1d,0x01,0x43,0x7a,0x5d,0x36,0x4f,0x88,0xb5,0x66, +0x5d,0x80,0x55,0x2f,0x16,0x05,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a,0x66,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0xff,0xff,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x02,0x26,0x09,0x1d,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0x00,0x01,0x00,0x65,0xfd,0xff, +0x04,0x2d,0x04,0x2a,0x00,0x37,0x00,0x52,0xb4,0x29,0x00,0x16,0x39,0x31,0xb8,0x05,0x0a,0xb2,0x20,0x20,0x05,0xb8,0x05,0x0a,0xb4,0x16,0x28,0x29,0x29,0x2c,0xb8,0x04,0xfb,0x40,0x0d,0x25,0x00,0x34,0x1b,0x37,0x37,0x11,0x2f,0x25,0x01,0x25,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed, +0x32,0x2f,0x5d,0x12,0x39,0x2f,0x39,0x39,0x33,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22, +0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x37,0x03,0x5c,0xaf,0xe8,0x8b,0x39,0x2e,0x63,0x9e,0x71,0x61,0xc7,0x64,0x6d,0xbf,0x64,0x98,0xd7,0x89,0x40,0x14,0x31,0x53,0x3f,0x26,0x37,0x23,0x11,0x3d,0x72,0xa6,0x69,0x23,0x4f,0x2a,0x27,0x56,0x2a,0x36,0x65,0x4d,0x2f,0x37,0x33,0x51,0xd1,0x89,0x01,0x9a,0x2e,0x66,0x72,0x7d,0x45,0x40, +0x72,0x55,0x32,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5b,0x31,0x64,0x65,0x64,0x30,0x24,0x51,0x55,0x56,0x29,0x4f,0x92,0x70,0x42,0x08,0x09,0xaa,0x08,0x0b,0x16,0x38,0x5d,0x46,0x4c,0x7f,0x2b,0x2d,0x52,0x24,0x00,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0x8f,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xe4, +0x04,0xdf,0x00,0x01,0xff,0xba,0xff,0xf2,0x01,0x56,0x00,0x99,0x00,0x08,0x00,0x13,0xb2,0x08,0x04,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x01,0x2f,0xcd,0x31,0x30,0x05,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x01,0x56,0xfe,0xaa,0x23,0x23,0x23,0x23,0x01,0x56,0x0e,0x34,0x20,0x20,0x33,0x00,0xff,0xff,0x00,0xab, +0xff,0xea,0x07,0x4b,0x05,0x24,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x50,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x04,0x79,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xd4,0x03,0xc9,0x00,0x02,0x00,0xab,0xff,0xea,0x05,0xf4,0x05,0xec,0x00,0x25,0x00,0x46,0x00,0x71,0xbf,0x00,0x13,0x05, +0x0a,0x00,0x10,0x00,0x41,0x05,0x0b,0x00,0x28,0x00,0x39,0x05,0x0b,0x40,0x10,0x30,0x36,0x10,0x28,0x26,0x30,0x22,0x10,0x28,0x30,0x30,0x28,0x10,0x03,0x48,0x03,0xbe,0x05,0x0a,0x00,0x22,0x00,0x26,0x04,0xfd,0x00,0x46,0x00,0x36,0x04,0xfd,0x40,0x0a,0x28,0x41,0x30,0x39,0x04,0x1a,0x35,0x35,0x11,0x0b,0xba,0x04,0xfb,0x00,0x1a,0x05, +0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x12,0x17,0x39,0xed,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e, +0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x35,0x34,0x26,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4e,0x7b,0xb1,0x7d,0x6d,0xa2,0x6c,0x36,0x9c,0x2d,0x52,0x71,0x88,0x9a,0x51,0x76,0xc2,0x9b, +0x78,0x2c,0x3f,0x30,0x12,0x0b,0x01,0xe4,0xc5,0x1f,0x15,0x10,0x21,0x1b,0x11,0x2e,0x4f,0x69,0x3b,0x5e,0x54,0x21,0x17,0x0f,0x20,0x1a,0x10,0x25,0x4c,0x74,0x4f,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x0a,0x29,0x53,0x48,0x04,0x8b,0xfb,0x6e,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x06,0x16,0x2c,0x26,0x37,0x98,0x58, +0x3d,0x70,0x33,0x57,0x0b,0x47,0x12,0x16,0x0b,0x08,0x14,0x1b,0x27,0x1b,0x26,0x3e,0x2f,0x1f,0x08,0x5d,0x0c,0x2d,0x21,0x14,0x18,0x0b,0x08,0x12,0x1a,0x23,0x19,0x1f,0x3e,0x33,0x23,0x04,0x00,0x01,0x00,0x9b,0xfe,0xac,0x04,0x9e,0x05,0xec,0x00,0x1d,0x00,0x25,0xbf,0x00,0x03,0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00, +0x08,0x04,0xfb,0xb5,0x15,0x0f,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x38,0x81, +0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0x28,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x00,0x02,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x00,0x26,0x00,0x38,0x00,0x41,0xb2,0x17,0x1b,0x05,0xbb,0x05,0x0a,0x00,0x2c,0x00,0x12,0x05, +0x0a,0x40,0x0a,0x1b,0x2f,0x17,0x01,0x17,0x20,0x34,0x34,0x00,0x27,0xbd,0x04,0xfb,0x00,0x0f,0x00,0x0a,0x05,0x03,0x00,0x31,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x2f,0x5d,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e, +0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x02,0xac,0x4c,0x79,0x55,0x2e,0x23,0x47,0x69,0x45,0x31,0x66,0x61,0x59,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45, +0x49,0x44,0x3b,0x2e,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x02,0xb9,0x53,0x7d,0x91,0x3e,0x3b,0x6c,0x52,0x30,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x43,0x23,0x0b,0xfd,0xdf,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4, +0xad,0x05,0x0f,0x0d,0x09,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x03,0x5c,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x02,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x00,0x17,0x00,0x29,0x00,0x36,0xb9,0x00,0x06,0x05,0x0a,0xb6,0x20,0x20,0x10,0x2b,0x00,0x00,0x18,0xb8,0x05,0x0a,0xb4,0x10, +0x15,0x25,0x01,0x1d,0xba,0x04,0xfb,0x00,0x0b,0x05,0x03,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x37,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x03,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34, +0x2e,0x02,0x27,0x0e,0x03,0x01,0x3f,0x60,0x76,0xa7,0x6a,0x31,0x30,0x5a,0x83,0x53,0x51,0x7c,0x54,0x2b,0x2a,0x43,0x56,0x2c,0x15,0x2d,0x13,0x1d,0x32,0x42,0x25,0x66,0x5c,0x12,0x2b,0x46,0x34,0x29,0x47,0x34,0x1d,0x03,0x4f,0x7f,0x4e,0x9f,0xa5,0xaa,0x59,0x4b,0x7b,0x59,0x30,0x2b,0x50,0x70,0x45,0x53,0x96,0x7f,0x65,0x23,0x11,0x22, +0xfd,0xfb,0x2d,0x3e,0x28,0x12,0x58,0x4b,0x2e,0x5a,0x5c,0x5f,0x33,0x1d,0x52,0x60,0x6d,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x00,0x22,0x00,0x36,0x00,0x47,0xb2,0x23,0x23,0x1a,0xb8,0x05,0x0a,0xb3,0x08,0x08,0x38,0x2f,0xb8,0x05,0x0a,0xb2,0x0f,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x22,0x1f,0x1f,0x2f,0x1f,0x02,0x1f, +0x2a,0xb8,0x04,0xfb,0xb5,0x2f,0x14,0x01,0x14,0x08,0x34,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16, +0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x6c,0xad,0x52,0x64,0x7b,0x45,0x1a,0x02,0x53,0x59,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x34,0x72,0xb6,0x82,0x5b,0xac,0x64,0x02,0xa9,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c, +0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xfe,0xf9,0x2c,0x23,0x42,0x68,0x82,0x41,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xed,0x84,0x74,0xd3,0xa2,0x60,0x26,0x2e,0x02,0x66,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0x01,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0x15,0x00,0x35, +0x00,0x42,0xb2,0x09,0x05,0x2f,0xbb,0x05,0x0a,0x00,0x16,0x00,0x28,0x05,0x0a,0xb6,0x1d,0x16,0x1d,0x16,0x1d,0x37,0x0c,0xb8,0x05,0x0a,0xb2,0x05,0x28,0x23,0xbe,0x04,0xff,0x00,0x22,0x00,0x00,0x04,0xfb,0x00,0x11,0x04,0xe6,0x00,0x09,0x00,0x2f,0x3f,0xed,0x2f,0xed,0x2f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed, +0x11,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b, +0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58,0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f, +0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x00,0xff,0xff,0x00,0x9a,0xfd,0xfb,0x05,0x91,0x04,0x15,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x01,0xfe,0x00,0x00,0x02,0x00,0x05,0x06,0x7c,0x02,0x01,0x07,0x8d,0x00,0x03,0x00,0x07,0x00,0x1d,0xb4,0x05,0x01,0x04,0x00,0x02,0xbc,0x04,0xfd,0x00,0x01,0x00,0x06,0x04,0xfd,0x00, +0x05,0x00,0x2f,0xfd,0xde,0xed,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0xd4,0x58,0x01,0x11,0x58,0x00,0x02,0xff,0x33,0x06,0x55,0x01,0xca,0x08,0x0e,0x00,0x23,0x00,0x31,0x00,0x3b,0xb2,0x20,0x13,0x1d,0xb8,0x05,0x0d,0xb5,0x24,0x23,0x23,0x24, +0x11,0x2c,0xb8,0x05,0x0d,0xb4,0x13,0x0b,0x08,0x05,0x18,0xb8,0x04,0xfd,0xb3,0x27,0x20,0x2f,0x0e,0xb9,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0x32,0x39,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37, +0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x2f,0x21,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34,0x10,0x0f,0x01,0x36,0x1f,0x31,0x3f,0x21,0x1f,0x3b,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04, +0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x06,0x55,0x22,0x22,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x45,0x45,0x26,0x3b,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x02,0x00,0x05,0xfe,0x60,0x02,0x01,0xff,0x71, +0x00,0x03,0x00,0x07,0x00,0x1d,0xb4,0x05,0x01,0x04,0x00,0x02,0xbc,0x04,0xfd,0x00,0x01,0x00,0x06,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0xde,0xed,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0xfe,0xb8,0x58,0x01,0x11,0x58,0x00,0x01,0x00,0x05,0x06,0x7c, +0x02,0x01,0x06,0xd4,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x02,0xb9,0x04,0xfd,0x00,0x01,0x00,0x2f,0xed,0x01,0x10,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x06,0xd4,0x58,0x00,0x00,0x02,0xff,0xbf,0x06,0x55,0x01,0xca,0x08,0x0e,0x00,0x22,0x00,0x30,0x00,0x35,0xb2,0x1f,0x12,0x1c,0xb8,0x05,0x0d,0xb5,0x23,0x22, +0x22,0x23,0x10,0x2b,0xbb,0x05,0x0d,0x00,0x12,0x00,0x17,0x04,0xfd,0xb3,0x26,0x1f,0x2e,0x0c,0xb9,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e, +0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x2d,0x23,0x18,0x30,0x15,0x39,0x67,0x30,0x12,0x32,0x5c,0x38,0x01,0x0b,0x06,0x01,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f, +0x23,0x1a,0x30,0x3c,0x06,0x55,0x22,0x22,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x01,0x00,0x05,0xff,0x19,0x02,0x01,0xff,0x71,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x02, +0xb9,0x04,0xfd,0x00,0x01,0x00,0x2f,0xed,0x01,0x10,0xcd,0x31,0x30,0x17,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x8f,0x58,0x00,0x01,0xff,0xd4,0x06,0x76,0x02,0x33,0x07,0xa0,0x00,0x33,0x00,0x53,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x30,0x33,0x33,0x30,0x0a,0x21,0x25,0x25,0x2a,0xb8,0x05,0x0d,0xb4,0x21,0x24,0x24,0x21, +0x1b,0xb8,0x05,0x0b,0x40,0x0b,0x12,0x15,0x15,0x12,0x16,0x25,0x25,0x33,0x0a,0x0d,0x06,0xb8,0x04,0xfd,0xb1,0x1e,0x2d,0x00,0x2f,0x33,0xed,0x32,0x39,0xce,0x32,0x11,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23, +0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x0e,0x02,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x06,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x03, +0x02,0x02,0x26,0x2d,0x2c,0x23,0x02,0x61,0x01,0x01,0x22,0x2d,0x2f,0x25,0x04,0x02,0x07,0xa0,0x14,0x25,0x0e,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x1a,0x2c,0x0e,0x17,0x1d,0x13,0x0c,0x05,0x33,0x3f,0x3e,0x3b,0x14,0x2e,0x0f,0x07,0x15,0x16,0x16,0x08,0x3d,0x3d,0x3e,0x37,0x17,0x30,0x0e,0x00,0x02,0x00,0x45,0x06,0x76, +0x01,0xc1,0x07,0xe9,0x00,0x13,0x00,0x1f,0x00,0x26,0x41,0x0c,0x00,0x05,0x05,0x0d,0x00,0x17,0x00,0x1d,0x05,0x0d,0x00,0x0f,0x00,0x00,0x04,0xfd,0x00,0x1a,0x00,0x14,0x04,0xfd,0x00,0x0a,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02, +0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x03,0x29,0x45,0x33,0x1d,0x1d,0x33,0x45,0x29,0x2a,0x46,0x32,0x1c,0x1c,0x33,0x45,0x2a,0x30,0x34,0x34,0x30,0x2f,0x35,0x35,0x07,0xe9,0x1d,0x32,0x44,0x27,0x27,0x44,0x31,0x1d,0x1d,0x31,0x44,0x27,0x27,0x44,0x32,0x1d,0xfe,0xe4,0x36,0x2c,0x2b,0x38,0x38,0x2b,0x2c, +0x36,0x00,0xff,0xff,0x00,0x52,0xfd,0xfe,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7f,0x72,0x00,0xff,0xff,0x00,0x52,0xfd,0xfe,0x04,0xad,0x05,0xec,0x02,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7f,0x72,0x00,0xff,0xff, +0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xa2,0x06,0x62,0x02,0x65,0x07,0x30,0x00,0x1b,0x00,0x20,0x40,0x0d,0x00,0x0e,0x0e,0x0d,0x0d,0x05,0x00,0x1b,0x1b,0x13,0x0a,0x18,0x05,0x00,0x2f,0xcd,0xd4,0xcd,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x23, +0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x65,0x1a,0x31,0x2d,0x29,0x12,0x33,0x5c,0x56,0x54,0x2d,0x22,0x31,0x19,0x3e,0x1a,0x31,0x2d,0x29,0x12,0x33,0x5c,0x56,0x54,0x2c,0x23,0x31,0x19,0x06,0xb6,0x1b,0x21,0x12,0x06,0x1e,0x24,0x1e,0x16,0x16,0x46,0x1b,0x21,0x12,0x06,0x1e, +0x24,0x1e,0x15,0x17,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x03,0x0f,0x00,0x1f, +0x00,0x26,0xb1,0x0b,0x00,0xb8,0x05,0x0a,0xb7,0x1d,0x2f,0x1f,0x01,0x1f,0x0b,0x17,0x05,0xbb,0x04,0xfb,0x00,0x10,0x00,0x06,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x39,0x2f,0x5d,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e, +0x02,0x35,0x11,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x00,0x02,0xff,0xba,0xff,0xf2,0x03,0x49,0x03,0x62, +0x00,0x24,0x00,0x38,0x00,0x31,0xb9,0x00,0x12,0x05,0x0a,0xb3,0x25,0x25,0x3a,0x31,0xb8,0x05,0x0a,0xb2,0x05,0x36,0x20,0xbc,0x04,0xfb,0x00,0x19,0x05,0x03,0x00,0x2c,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32, +0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81,0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8, +0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42, +0x4a,0x2a,0x18,0x4d,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0x02,0x03,0x62,0x00,0x2f,0x00,0x43,0x00,0x3e,0xb1,0x15,0x12,0xb8,0x05,0x0a,0xb4,0x30,0x30,0x05,0x19,0x3c,0xb8,0x05,0x0a,0xb5,0x05,0x1f,0x0a,0x41,0x2b,0x18,0xbd,0x04,0xfb,0x00,0x24,0x00,0x19,0x05,0x03,0x00,0x37,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed, +0x3f,0x33,0xed,0x32,0x32,0x12,0x39,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22, +0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19, +0x43,0x74,0x5b,0x21,0x19,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x00,0x01,0x00,0xab, +0xff,0xea,0x06,0x9f,0x03,0x0f,0x00,0x25,0x00,0x2c,0xb9,0x00,0x13,0x05,0x0a,0xb3,0x10,0x10,0x27,0x03,0xbd,0x05,0x0a,0x00,0x22,0x00,0x0b,0x04,0xfb,0x00,0x1a,0x05,0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xc6,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33, +0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x62,0x09,0x11,0x1e,0x30,0x1d,0x5c,0x91,0xd2,0x93,0x80,0xc0,0x7f,0x3f,0x9c,0x33,0x5d,0x81,0x9a,0xaf,0x5d,0x86,0xde,0xb3,0x87,0x30,0x3f,0x30,0x12,0x0b,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05, +0x0a,0x29,0x53,0x48,0x01,0xae,0xfe,0x4b,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x03,0x15,0x2d,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x00,0x1f,0x00,0x26,0xb1,0x0b,0x00,0xb8,0x05,0x0a,0xb6,0x1d,0x1e,0x18,0x17,0x17,0x0b,0x05,0xbb,0x04,0xfb,0x00,0x10,0x00,0x06,0x05,0x03,0x00,0x3f,0x33, +0xed,0x39,0x32,0x11,0x33,0x2f,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x61,0x74,0x1d,0x04,0x1b,0x43,0x48,0x49,0x22,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43, +0x38,0x25,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x04,0x99,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f, +0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x74,0xb9,0x00,0x3b,0x05,0x0a,0xb2,0x3a,0x3a,0x39,0xb8,0x05,0x0a,0xb3,0x38,0x1d,0x38,0x32,0xb8,0x05,0x0a,0xb7,0x33,0x38,0x33,0x38,0x33,0x3f,0x26,0x05,0xbb,0x05,0x0a,0x00,0x16, +0x00,0x3a,0x05,0x02,0xb2,0x3d,0x36,0x32,0xb8,0x05,0x02,0x40,0x0d,0x38,0x2f,0x35,0x3f,0x35,0x02,0x35,0x31,0x1d,0x00,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0x32,0xd6,0xed,0x01,0x2f, +0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x05,0x23, +0x35,0x33,0x03,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0x6a,0xb5,0xb5,0x01,0x42,0xb5,0xb5,0xa1,0xb5,0xb5,0x02,0x01, +0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x64,0xb3,0xb3,0xb3,0xfe,0x3f,0xb3,0x00,0x00,0x05,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x03,0x00,0x07, +0x00,0x0b,0x00,0x3d,0x00,0x4b,0x00,0x97,0xb1,0x19,0x3e,0xbb,0x05,0x0b,0x00,0x49,0x00,0x09,0x05,0x0a,0xb2,0x08,0x08,0x04,0xbb,0x05,0x0a,0x00,0x05,0x00,0x00,0x05,0x0a,0x40,0x0b,0x01,0x49,0x05,0x01,0x01,0x05,0x49,0x03,0x4d,0x32,0x11,0xbd,0x05,0x0a,0x00,0x22,0x00,0x41,0x04,0xfb,0x00,0x43,0x05,0x03,0xb6,0x3e,0x0c,0x29,0x3d, +0x04,0x1d,0x2f,0xb8,0x04,0xff,0xb2,0x36,0x19,0x16,0xb8,0x04,0xfc,0x40,0x0c,0x1a,0x1f,0x1d,0x2f,0x1d,0x02,0x1d,0x07,0x06,0x06,0x02,0x08,0xb8,0x05,0x02,0xb7,0x0f,0x0b,0x1f,0x0b,0x02,0x0b,0x04,0x00,0xb8,0x05,0x02,0xb5,0x2f,0x02,0x3f,0x02,0x02,0x02,0x00,0x2f,0x5d,0xfd,0x32,0xde,0x5d,0xed,0x11,0x33,0x11,0x33,0x2f,0x5d,0x33, +0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x13,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35, +0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x13,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x02,0x78,0xb5,0xb5,0x01,0x2e,0xb5,0xb5,0x97,0xb5,0xb5,0xfd,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19, +0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x2b,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x02,0xb3,0xb3,0xb3,0xfe,0x49,0xb3,0x02,0x50,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38, +0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfe,0x9a,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x00,0xfd,0xff, +0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0x02,0x00,0x36,0x00,0x33,0xb2,0x1e,0x23,0x03,0xbb,0x05,0x0a,0x00,0x33,0x00,0x23,0x05,0x0a,0x40,0x09,0x15,0x1a,0x1e,0x1b,0x03,0x00,0x00,0x1c,0x0b,0xbb,0x04,0xfb,0x00,0x2b,0x05,0x03,0x00, +0x1c,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37, +0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4f,0x7b,0xb1,0x7c,0x4e,0x7e,0x67,0x51,0x20,0x25,0x32,0x1c,0x0c,0x57,0xa3,0xe8,0x91,0x03,0x4b,0xfd,0x66,0x8b,0xe1,0x9e,0x56,0x0f,0x31,0x5d,0x4f,0x57,0xef,0xa5,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x01,0x06,0x0a,0x09, +0x0a,0x1d,0x26,0x2c,0x1a,0x4d,0x8b,0x86,0x85,0x47,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x42,0x8b,0x96,0xa6,0x5e,0x1f,0x56,0x59,0x50,0x19,0x1b,0x0e,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x02,0x06,0x08,0xed,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0x38, +0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0x15,0x02,0x06,0x09,0x2a,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x02,0x13,0x02,0x06, +0x08,0xf7,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x06,0x19,0x02,0x26,0x08,0xf3,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x3e,0xfe,0x30,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x06,0x12,0x02,0x26, +0x09,0x28,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x16,0xfe,0x29,0x00,0x0a,0xb4,0x02,0x2f,0x40,0x01,0x40,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb9,0x01,0xac,0x02,0x89,0x03,0x7c,0x02,0x06,0x08,0xd7,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x01,0x56,0x05,0x9a,0x02,0x06,0x08,0xd8,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x03,0x50, +0x05,0x9a,0x02,0x06,0x08,0xd9,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x04,0x1a,0x05,0x9a,0x02,0x06,0x08,0xda,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x03,0x70,0x05,0xb7,0x00,0x36,0x00,0x4a,0xb5,0x1d,0x0b,0x38,0x29,0x02,0x2f,0xb8,0x05,0x0a,0x40,0x09,0x30,0x1e,0x1d,0x1d,0x13,0x02,0x03,0x07,0x2f,0xbb,0x04,0xe6,0x00,0x29, +0x00,0x23,0x04,0xfb,0xb4,0x2f,0x18,0x01,0x18,0x0e,0xb8,0x04,0xfb,0xb7,0x2f,0x07,0x01,0x07,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x39,0x3f,0x12,0x17,0x39,0x11,0x33,0x01,0x2f,0xed,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x13,0x17,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02, +0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x07,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x30,0x05,0x0e,0x3f,0x5f,0x7d,0x4b,0x20,0x49,0x24,0x23,0x45,0x23,0x43,0x77,0x5a,0x34,0x29,0x41,0x51,0x29,0x32,0x62,0x5b,0x50,0x1f,0x14,0x49,0x5c,0x6b,0x36,0x1e,0x3e,0x39, +0x32,0x13,0x04,0x07,0x0c,0x07,0x04,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0xd2,0x2f,0x56,0x42,0x28,0x08,0x09,0xa6,0x08,0x08,0x1b,0x30,0x43,0x28,0x23,0x33,0x21,0x0f,0x14,0x20,0x28,0x14,0xaa,0x11,0x26,0x21,0x15,0x08,0x10,0x19,0x11,0x03,0x38,0x71,0x7a,0x84,0x4a,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x00,0x02, +0x00,0x72,0xff,0xe9,0x04,0x28,0x05,0x9a,0x00,0x1e,0x00,0x3f,0x00,0x46,0xbf,0x00,0x17,0x05,0x0a,0x00,0x2a,0x00,0x20,0x05,0x0a,0x00,0x1f,0x00,0x38,0x05,0x0a,0xb3,0x09,0x3d,0x3d,0x25,0xb8,0x04,0xfb,0xb7,0x1c,0x00,0x1c,0x20,0x20,0x10,0x04,0x1c,0xba,0x05,0x03,0x00,0x31,0x04,0xff,0xb3,0x2f,0x10,0x01,0x10,0x00,0x2f,0x5d,0xed, +0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x10,0xed,0x32,0x2f,0x01,0x2f,0xed,0xd4,0xed,0xd6,0xed,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x03,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x15,0x14,0x1e,0x02, +0x33,0x32,0x36,0x02,0x51,0x08,0x2a,0x66,0x3d,0x31,0x5f,0x4b,0x2f,0x2c,0x4b,0x62,0x6b,0x6e,0x31,0x30,0x6b,0x68,0x5e,0x48,0x2a,0x32,0x4f,0x64,0x31,0x3b,0x61,0x6c,0x86,0x0f,0x1f,0x2e,0x1f,0x1a,0x2f,0x23,0x15,0x1e,0x32,0x42,0x48,0x4a,0x21,0x21,0x48,0x46,0x3e,0x30,0x1c,0x14,0x23,0x2f,0x1c,0x36,0x41,0x7d,0x51,0x43,0x2c,0x70, +0xbe,0x92,0x8e,0xfd,0xd6,0xac,0x78,0x40,0x3e,0x75,0xa6,0xd1,0xf7,0x8a,0x98,0xc7,0x76,0x30,0x43,0x01,0x39,0x2d,0x4b,0x37,0x1e,0x1a,0x46,0x7a,0x60,0x72,0xd1,0xb3,0x92,0x67,0x38,0x39,0x68,0x91,0xb1,0xcd,0x6e,0x5c,0x7c,0x4c,0x20,0x6a,0x00,0x01,0x00,0x2f,0xff,0xf5,0x03,0x65,0x05,0xa4,0x00,0x28,0x00,0x3d,0xb5,0x00,0x16,0x07, +0x03,0x2a,0x1e,0xbb,0x05,0x0a,0x00,0x0d,0x00,0x08,0x04,0xfc,0x40,0x09,0x2f,0x23,0x01,0x23,0x00,0x28,0x28,0x03,0x19,0xb8,0x04,0xfb,0xb5,0x2f,0x12,0x01,0x12,0x04,0x03,0xb8,0x04,0xe6,0x00,0x3f,0x33,0x2f,0x5d,0xed,0x12,0x39,0x11,0x33,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x00,0x03,0x27,0x36,0x12, +0x37,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x36,0x36,0x37,0x03,0x65,0xe1,0xfe,0x7d,0xac,0x26,0x5e,0xec,0x84,0x01,0x49,0x74,0x51,0x2b,0x3b,0x6e,0x9e,0x62,0x1d,0x47,0x23,0x20,0x4d,0x21,0x37,0x5f,0x46,0x28,0x21,0x3a,0x51,0x2f,0x45,0x4d, +0x26,0x4a,0x27,0x03,0x0a,0x6e,0xfe,0x77,0xfe,0xe2,0xc2,0x9e,0x01,0x17,0x6b,0x04,0x0c,0x3b,0x5a,0x76,0x46,0x53,0x86,0x5f,0x34,0x05,0x05,0xab,0x05,0x07,0x17,0x31,0x4f,0x39,0x34,0x4e,0x35,0x1a,0x1b,0x17,0x2a,0x14,0xff,0xff,0xff,0xf4,0x00,0x00,0x03,0xfa,0x05,0x9a,0x02,0x06,0x08,0xde,0x00,0x00,0xff,0xff,0x00,0x49,0x00,0x00, +0x04,0x4f,0x05,0x9a,0x02,0x06,0x08,0xdf,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x03,0xdb,0x05,0xa8,0x02,0x06,0x08,0xe0,0x00,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x00,0x28,0x00,0x36,0xb1,0x1b,0x10,0xb8,0x05,0x0a,0xb3,0x0d,0x0d,0x17,0x03,0xb8,0x05,0x0a,0xb2,0x25,0x17,0x08,0xb8,0x04,0xfb,0xb2,0x20,0x1b, +0x15,0xba,0x04,0xfb,0x00,0x16,0x05,0x03,0xb1,0x0f,0x00,0x00,0x2f,0x2f,0x3f,0xed,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36, +0x37,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x0c,0x27,0x4a,0x3d,0x13,0x49,0x59,0x1c,0x04,0x11,0x4c,0x7f,0xb7,0x7c,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0xb0,0x43,0x61,0x40,0x1f,0xa7,0x28,0x26,0x5f,0x95,0x69,0x37,0x45,0x7f, +0xb7,0x72,0x3f,0x83,0x4b,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xb9,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x57,0x02,0xad,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x06,0x32,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07, +0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc6,0x05,0xb9,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x01,0xc1, +0x00,0x20,0x00,0x34,0xb9,0x00,0x02,0x05,0x0a,0xb3,0x1d,0x1d,0x22,0x13,0xb8,0x05,0x0a,0x40,0x0a,0x0c,0x2f,0x20,0x01,0x20,0x2f,0x10,0x01,0x10,0x18,0xb8,0x04,0xfb,0xb5,0x1f,0x07,0x2f,0x07,0x02,0x07,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x0e,0x02,0x23,0x22, +0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x04,0x84,0x22,0x37,0x83,0xd6,0x9e,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0x01,0xc1,0xb9,0xa1,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f, +0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x02,0x06,0x09,0x28,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0x0a,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x06,0x0f,0x5a,0x00,0x00,0x00,0x01,0xff,0xba,0xfd,0xfa,0x04,0x02,0x02,0x01,0x00,0x32,0x00,0x48, +0xb9,0x00,0x1e,0x05,0x0b,0x40,0x0a,0x13,0x09,0x09,0x13,0x13,0x24,0x19,0x28,0x28,0x0e,0xb8,0x05,0x0a,0xb5,0x03,0x24,0x19,0x28,0x18,0x00,0xbb,0x04,0xfb,0x00,0x19,0x00,0x2b,0x05,0x03,0xb7,0x2f,0x1f,0x01,0x1f,0x2f,0x09,0x01,0x09,0x00,0x2f,0x5d,0x2f,0x5d,0x3f,0x33,0xed,0x32,0x39,0x01,0x2f,0x2f,0x33,0xed,0x33,0x2f,0x11,0x12, +0x39,0x2f,0x33,0x2f,0x10,0xed,0x31,0x30,0x37,0x32,0x36,0x37,0x3e,0x03,0x37,0x33,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x33,0x15,0x22,0x0e,0x02,0x15,0x15,0x2e,0x03,0x35,0x34,0x36,0x37,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x9b,0x30,0x3d,0x0e,0x09,0x10,0x1c,0x2e,0x27,0x97,0x2f,0x42,0x28,0x12,0x21, +0x33,0x3e,0x1e,0x07,0x42,0x73,0xa2,0x68,0x57,0x81,0x54,0x2a,0x7c,0xa9,0x68,0x2d,0x07,0x06,0x04,0x1a,0x40,0x2d,0x74,0x23,0x23,0x23,0x23,0x99,0x0a,0x0e,0x09,0x26,0x4b,0x7a,0x5c,0x67,0xa8,0x8b,0x71,0x2e,0x45,0x59,0x38,0x1e,0x09,0x60,0xa9,0x7d,0x48,0xa7,0x3f,0x76,0xa9,0x6a,0x30,0x18,0x47,0x60,0x7b,0x4d,0x20,0x43,0x25,0x02, +0x0c,0x0d,0x34,0x20,0x20,0x33,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x06,0x12,0x02,0x26,0x09,0x28,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x16,0xfe,0x29,0x00,0x0a,0xb4,0x02,0x2f,0x40,0x01,0x40,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x05,0x5d,0x02,0x26,0x09,0x28,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x01, +0x04,0xad,0x00,0x01,0x00,0x72,0xff,0xea,0x06,0xe5,0x03,0x5b,0x00,0x2b,0x00,0x1f,0xb9,0x00,0x0a,0x05,0x0a,0xb6,0x21,0x00,0x2f,0x2b,0x01,0x2b,0x0f,0xba,0x04,0xfb,0x00,0x1a,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xcd,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e, +0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x37,0x03,0x4b,0x3a,0x72,0x69,0x60,0x28,0x24,0x3b,0x2a,0x17,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x27,0x43,0x5c,0x35,0x2e,0x62,0x63,0x60,0x2c,0x02,0xd3,0x30,0x4e,0x3f,0x34,0x16,0x14,0x25,0x25,0x28, +0x18,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x37,0x5a,0x4c,0x43,0x20,0x1c,0x38,0x3c,0x43,0x27,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb, +0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x33,0x02,0xac,0x0d,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93, +0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27,0x08,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0xff,0xff,0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x3e,0x02,0x26,0x09,0x65,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xab, +0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x3d,0x02,0x26,0x09,0x66,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0x00,0x01,0x00,0x2d,0x00,0x00,0x01,0xab,0x00,0xbc,0x00,0x03,0x00,0x13,0xb2,0x03,0x02,0x02,0xba,0x04,0xfb,0x00,0x00,0x04,0xe6,0x00, +0x3f,0xed,0x01,0x2f,0xcd,0x31,0x30,0x21,0x21,0x27,0x21,0x01,0xab,0xfe,0xaa,0x28,0x01,0x7e,0xbc,0x00,0x00,0x03,0x00,0x7c,0x00,0x00,0x04,0x18,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x34,0xbc,0x00,0x05,0x05,0x0c,0x00,0x04,0x00,0x01,0x05,0x0c,0xb5,0x00,0x2f,0x09,0x01,0x09,0x08,0xba,0x04,0xe6,0x00,0x06,0x04,0xfe,0xb4, +0x2f,0x05,0x01,0x05,0x02,0xb9,0x04,0xfe,0x00,0x01,0x00,0x2f,0xed,0x2f,0x5d,0xed,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x05,0x01,0x33,0x01,0xc0,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0xfd,0x86,0x03,0x0d,0x8f,0xfc,0xf3,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0x5b,0x05,0x58,0xfa,0xa8,0x00, +0x00,0x01,0x00,0x42,0x01,0xae,0x02,0xd9,0x04,0x25,0x00,0x0e,0x00,0x0c,0xb4,0x20,0x03,0x01,0x03,0x0c,0x00,0x2f,0xc4,0x5d,0x31,0x30,0x01,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x27,0x33,0x07,0x37,0x02,0xd9,0xf6,0xa6,0x7b,0x81,0x81,0x7b,0xa6,0xf5,0x2f,0xe7,0x16,0x97,0x16,0xe7,0x02,0xfe,0x37,0xbf,0x5a,0xdb,0xdb, +0x5a,0xbf,0x37,0x8f,0x64,0xfc,0xfc,0x64,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x4b,0x06,0x3c,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x53,0x04,0xd7,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02, +0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0xff,0xf2,0x07,0x4a,0x08,0x36,0x00,0x3a,0x00,0x48,0x00,0x4c, +0x00,0x7a,0x00,0xdd,0xb9,0x00,0x0d,0x05,0x0a,0xb3,0x0a,0x66,0x66,0x69,0xb8,0x05,0x0d,0xb6,0x63,0x65,0x65,0x63,0x5a,0x5a,0x5d,0xb8,0x05,0x0d,0x40,0x09,0x4a,0x4b,0x4b,0x56,0x56,0x4a,0x59,0x59,0x49,0xb8,0x05,0x0b,0xb4,0x16,0x70,0x4a,0x4a,0x00,0xb8,0x05,0x0a,0xb3,0x38,0x4d,0x4d,0x50,0xb8,0x05,0x0b,0xb5,0x78,0x7a,0x7a,0x78, +0x43,0x2d,0xb8,0x05,0x0a,0x40,0x0e,0x2c,0x0a,0x63,0x38,0x78,0x2c,0x2c,0x78,0x38,0x63,0x0a,0x05,0x7c,0x3b,0xbb,0x05,0x0a,0x00,0x26,0x00,0x21,0x04,0xfb,0xb6,0x2f,0x40,0x01,0x40,0x16,0x33,0x05,0xbb,0x04,0xfb,0x00,0x19,0x00,0x12,0x05,0x03,0x40,0x0b,0x70,0x60,0x6c,0x30,0x4c,0x01,0x4c,0x49,0x5a,0x53,0x60,0xb8,0x04,0xfd,0xb3, +0x73,0x6c,0x0b,0x44,0xb8,0x04,0xfc,0x40,0x0a,0x2b,0x2f,0x2c,0x01,0x2c,0x3a,0x20,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xd6,0xd4,0x5d,0xdd,0xed,0x10,0xd4,0x32,0xfd,0x32,0xd6,0xde,0xcd,0x5d,0x11,0x12,0x39,0x3f,0x33,0xed,0x32,0x39,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x2f, +0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x2f,0x39,0x39,0xed,0x33,0x2f,0x11,0x33,0x2f,0x33,0x2f,0x10,0xe4,0x32,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22, +0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x23,0x11,0x33,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x34,0x27,0x33,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x15, +0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x05,0x49,0x0c,0x26,0x46,0x39,0x25,0x42,0x31,0x1c,0x9c,0x3c,0x61,0x7b,0x3e,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1d,0x40,0x36,0x24,0x9c, +0xfb,0xee,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x04,0x03,0x74,0x74,0xfe,0xf5,0x03,0x01,0x26,0x2d,0x2c,0x23,0x01,0x5f,0x01,0x22,0x2d,0x2f,0x25,0x03,0x5f,0x01,0x01,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x03,0x01,0x8c,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfb,0xce, +0x65,0x86,0x4f,0x20,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xf4,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x04,0xd3,0x01,0x56,0xfe,0x57,0x1c,0x18,0x09,0x33,0x3f,0x3e,0x3b,0x0d, +0x1c,0x0d,0x0e,0x1c,0x0b,0x3d,0x3d,0x3e,0x37,0x1f,0x1b,0x0c,0x18,0x08,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x21,0x18,0x00,0x01,0x00,0x57,0xff,0xaf,0x04,0x02,0x01,0xbb,0x00,0x1e,0x00,0x2a,0xbc,0x00,0x0d,0x05,0x0a,0x00,0x12,0x00,0x08,0x04,0xfb,0x40,0x09,0x2f,0x17,0x01,0x17,0x2f,0x0e,0x01,0x0e,0x1e,0xba,0x04, +0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x33,0x04,0x02,0x0c,0x42,0x6c,0x60,0x56,0x55,0x58,0x32,0x2a,0x4d,0x3b,0x23,0x83,0x03,0x01,0x42,0x69,0x80,0x3f,0x3f,0x6b, +0x60,0x58,0x56,0x58,0x31,0x0e,0x2b,0x40,0x4c,0x40,0x2b,0x23,0x4e,0x7c,0x58,0x20,0x16,0x1e,0x05,0x7e,0xb2,0x70,0x33,0x2b,0x40,0x4c,0x40,0x2b,0x00,0x01,0x00,0xc4,0x06,0x7c,0x01,0x42,0x08,0x04,0x00,0x03,0x00,0x15,0xbd,0x00,0x00,0x05,0x0b,0x00,0x01,0x00,0x00,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x01, +0x23,0x11,0x33,0x01,0x42,0x7e,0x7e,0x06,0x7c,0x01,0x88,0x00,0x00,0x02,0xff,0x17,0x06,0x1d,0x02,0xee,0x08,0xde,0x00,0x53,0x00,0x65,0x00,0x6f,0xb5,0x09,0x26,0x61,0x03,0x47,0x1a,0xb8,0x05,0x0d,0xb2,0x59,0x2d,0x00,0xbb,0x05,0x0d,0x00,0x51,0x00,0x38,0x05,0x0d,0xb2,0x47,0x53,0x15,0xb8,0x05,0x01,0x40,0x11,0x5c,0x54,0x26,0x2d, +0x54,0x1f,0x61,0x61,0x54,0x4c,0x4c,0x54,0x10,0x10,0x0a,0x03,0x54,0xb8,0x05,0x01,0x40,0x09,0x1f,0x35,0x35,0x30,0x30,0x29,0x29,0x1f,0x3b,0xb9,0x05,0x01,0x00,0x42,0x00,0x2f,0xfd,0xce,0x32,0x2f,0x32,0x2f,0x32,0x2f,0x10,0xfd,0x32,0xcc,0x33,0x2f,0x11,0x33,0x2f,0x11,0x33,0x2f,0x11,0x12,0x39,0x39,0x10,0xde,0xfd,0xc6,0x01,0x2f, +0xed,0x2f,0xed,0x39,0x2f,0xed,0x11,0x17,0x39,0x31,0x30,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22,0x06,0x15, +0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x01,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x61,0x0e,0x1a,0x1a,0x15,0x05,0x05,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13, +0x20,0x46,0x71,0x51,0x48,0x61,0x15,0x0a,0x14,0x06,0x01,0x12,0x31,0x1a,0x1f,0x28,0x0a,0x01,0x11,0x2c,0x16,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x40,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35,0x3b,0x16,0x1d,0x10,0x0e,0x0c,0x58,0x01,0x9b,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c, +0x1d,0x1b,0x07,0x7e,0x2a,0x27,0x1c,0x1a,0x0b,0x2a,0x12,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x03,0x08,0x04,0x14,0x0b,0x18,0x13,0x17,0x14,0x19,0x12,0x01,0x0f,0x12,0x19,0x10,0x09,0x06,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x08,0x17,0x15,0x01,0x76, +0xfe,0x4d,0x02,0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x00,0x01,0x00,0x10,0x06,0x71,0x01,0xbb,0x08,0xde,0x00,0x14,0x00,0x27,0xb9,0x00,0x0c,0x05,0x0d,0xb5,0x09,0x06,0x06,0x00,0x00,0x03,0xb8,0x05,0x01,0xb5,0x11,0x14,0x14,0x11,0x0b,0x05,0x00,0x2f,0xc4,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x01,0x2f, +0xed,0x31,0x30,0x13,0x16,0x16,0x33,0x03,0x33,0x13,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x10,0x2e,0x51,0x27,0x99,0x5d,0x98,0x28,0x28,0x59,0x23,0x3d,0x53,0x30,0x2d,0x5e,0x30,0x06,0xe2,0x06,0x04,0x01,0xca,0xfe,0x37,0x02,0x1c,0x2a,0x01,0xbd,0xfe,0x22,0x34,0x3a,0x1b,0x06,0x04,0x06,0x00,0xff,0xff, +0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xc2,0xfd,0xfe,0x01,0xa2,0xff,0x6b,0x00,0x28,0x00,0x3e,0xbc,0x00,0x1b,0x05,0x0d,0x00,0x0d,0x00,0x26,0x04,0xfd,0xb5,0x04,0x04,0x1f,0x14,0x14,0x12,0xb8,0x04,0xfd,0x40,0x0a,0x00,0x18,0x10,0x18,0x02,0x18,0x1f,0x09,0x09,0x1f,0xb8,0x04,0xfd, +0xb3,0x1f,0x20,0x01,0x20,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x10,0xde,0x5d,0xed,0x32,0x2f,0x11,0x39,0x2f,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x07, +0x3e,0x19,0x28,0x11,0x11,0x1d,0x1f,0x24,0x19,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x0d,0x1d,0x10,0x2d,0x3e,0x46,0x48,0x46,0xc7,0x31,0x40,0x2b,0x1e,0x0f,0x1f,0x2e,0xfe,0x06,0x56,0x15,0x10,0x0c,0x0f,0x0c,0x01,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x65,0x03,0x04,0x26,0x25,0x30,0x2d,0x61,0x0f,0x11,0x0f,0x28, +0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00, +0x00,0x02,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x02,0xb7,0x00,0x30,0x00,0x44,0x00,0x5b,0xb2,0x31,0x31,0x14,0xbb,0x05,0x0a,0x00,0x00,0x00,0x3d,0x05,0x0a,0xb6,0x07,0x00,0x07,0x00,0x07,0x46,0x25,0xb8,0x05,0x0a,0xb3,0x1e,0x1e,0x13,0x2a,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x19,0x2f,0x19,0x02,0x19,0x22,0x22,0x02,0x38,0xb8,0x04,0xfb,0xb5, +0x2f,0x0c,0x01,0x0c,0x00,0x42,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x33,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23, +0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0xad,0x50,0x5c,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x1b,0x28,0x1b,0x0e,0x4a,0x98,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c, +0x2b,0x64,0xa5,0x7a,0x67,0x93,0x64,0x3b,0x21,0x0b,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x17,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x2a,0x68,0x75,0x7f,0x40,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x1d,0x32, +0x46,0x51,0x5b,0xd0,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0x06,0x7c,0x01,0xa2,0x07,0xe9,0x00,0x18,0x00,0x2f,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb6,0x11,0x0e,0x09,0x0a,0x18,0x18,0x16, +0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e, +0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x07,0x7e,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0x01,0x00,0x49,0xfd,0xfe,0x01,0xa2,0xff,0x6b,0x00,0x18,0x00,0x34,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb3,0x11,0x18,0x18,0x16,0xb8,0x04,0xfd,0x40,0x0a,0x00,0x03, +0x10,0x03,0x02,0x03,0x09,0x0d,0x0d,0x09,0xb8,0x04,0xfd,0xb3,0x1f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x10,0xde,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x73,0x0d,0x1d,0x10,0x2d, +0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xff,0x00,0x03,0x04,0x26,0x27,0x5b,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0xff,0xff,0xff,0x97,0x00,0x00,0x01,0xf0,0x07,0xe8,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x00,0xff,0xff,0xff,0x97,0xff,0xf2,0x02,0x01, +0x07,0xe8,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x00,0xff,0xff,0xff,0xc2,0x00,0x00,0x01,0xa2,0x07,0xe9,0x02,0x26,0x09,0x0d,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x7e,0x00,0x0a,0xb4,0x01,0x20,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xff,0xf2,0x02,0x01,0x07,0xe9,0x02,0x26,0x08,0xc7, +0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x7e,0x00,0x0a,0xb4,0x01,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xfd,0xfe,0x01,0xa2,0x05,0xec,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x77,0x00,0x00,0xff,0xff,0xff,0xc2,0xfd,0xfe,0x02,0x01,0x05,0xec,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x77, +0x00,0x00,0xff,0xff,0x00,0xab,0x00,0x00,0x02,0xf8,0x05,0xec,0x00,0x26,0x09,0x0d,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0x00,0x0a,0xb4,0x01,0x20,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xf2,0x03,0x57,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x09,0x21,0x02,0x01,0x00,0x00,0x01,0x07, +0x09,0x7e,0x01,0x56,0xfe,0x00,0x00,0x0a,0xb4,0x02,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0xa3,0x05,0x3e,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x09,0x7e,0x02,0x01,0xfd,0x55,0xff,0xff,0xff,0xe7,0xfd,0xff,0x03,0xa3,0x05,0x63,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01, +0xfd,0x55,0x00,0x07,0x09,0x30,0x00,0x28,0xfd,0x55,0xff,0xff,0x00,0x9a,0xff,0x55,0x06,0x4f,0x05,0xe9,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x09,0x7e,0x04,0xad,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xfa,0x05,0x3e,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x09,0x7e,0x05,0x58,0xfd,0x55,0xff,0xff,0x00,0xab,0xff,0xea, +0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad, +0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xee,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x5b,0x02,0xad,0x00,0xef,0x01,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0x00,0x0c,0xb5,0x02,0x01,0x20, +0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x01,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0x00,0x0c,0xb5,0x02,0x01,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca, +0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0x04,0x02,0xff,0xff, +0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07, +0x0f,0x56,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0x8f,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfd,0xa6,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0x8f,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfd,0xa6,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x16, +0x02,0x26,0x08,0xd0,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfd,0x2d,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0xf2,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0xf2,0x02,0x26,0x08,0xd1, +0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x79,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xc8,0xff,0xb1,0xff,0xff,0x00,0x7e,0xfd,0xff, +0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x96,0xff,0x75,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x02,0x26,0x09,0x13,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0xc8, +0xff,0x26,0x00,0x0c,0xb5,0x02,0x01,0x20,0x34,0x01,0x34,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0x91,0xff,0x14,0x00,0x0c,0xb5,0x02,0x01,0x20,0x43,0x01,0x43,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f, +0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0xf2,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0xf2,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x2a,0xff,0xff, +0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x79,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x03,0xb1,0x00,0x05,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x84,0xb1,0x3e,0x36,0xb8,0x05,0x0a,0xb4,0x37,0x3f,0x37,0x3a,0x32,0xb8,0x05,0x0a,0x40,0x0e,0x33,0x3b,0x33, +0x1d,0x00,0x0d,0x03,0x37,0x33,0x37,0x33,0x43,0x26,0x05,0xb8,0x05,0x0a,0xb2,0x16,0x3e,0x3a,0xb8,0x04,0xfb,0x40,0x09,0x40,0x0f,0x3d,0x1f,0x3d,0x02,0x3d,0x36,0x32,0xb8,0x04,0xfb,0x40,0x0d,0x38,0x2f,0x35,0x3f,0x35,0x02,0x35,0x31,0x1d,0x00,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11, +0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0x32,0xde,0x5d,0x32,0xed,0x32,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06, +0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64, +0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0x7e,0xb5,0xb5,0x01,0x1a,0xb5,0xb5,0xfe,0xe6,0xb5,0xb5,0x01,0x1a,0xb5,0xb5,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a, +0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x78,0xb3,0xb3,0xb3,0xfe,0x35,0xb3,0xb3,0xb3,0x00,0x04,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x42,0x00,0x46,0x00,0x4a,0x00,0x4e,0x00,0x90,0xb2,0x03,0x43,0x00,0xb8,0x05,0x0a,0xb4,0x01,0x44,0x01,0x4b,0x47,0xb8,0x05,0x0a,0x40,0x0e, +0x48,0x4c,0x48,0x23,0x38,0x13,0x03,0x01,0x48,0x01,0x48,0x50,0x2c,0x0b,0xbd,0x05,0x0a,0x00,0x1c,0x00,0x3c,0x04,0xfb,0x00,0x3e,0x05,0x03,0xb6,0x06,0x38,0x23,0x37,0x04,0x17,0x29,0xb8,0x04,0xff,0xb2,0x30,0x13,0x10,0xb8,0x04,0xfc,0x40,0x09,0x14,0x1f,0x17,0x2f,0x17,0x02,0x17,0x47,0x43,0xb8,0x04,0xfb,0x40,0x09,0x49,0x0f,0x46, +0x1f,0x46,0x02,0x46,0x4b,0x00,0xb8,0x04,0xfb,0xb4,0x4d,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0x33,0xfd,0x32,0xde,0x5d,0x32,0xed,0x32,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x39,0x31,0x30,0x25,0x23, +0x35,0x33,0x26,0x26,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x07,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x27,0x11,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x35,0x23,0x35, +0x33,0x03,0xa6,0xb5,0xa9,0x1d,0x2a,0x0f,0x9d,0xd5,0x81,0x37,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x20,0x4b,0x24,0xc1,0x99,0x19,0x2f,0x84,0xc0,0x3f,0xb5,0xb5,0xfe,0xf0, +0xb5,0xb5,0xb5,0xb5,0x34,0xb3,0x31,0x70,0x3e,0x35,0x72,0x7b,0x86,0x48,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x15,0x9f,0xb4,0xa7,0x7a,0x66,0xfe,0x4a,0xb3,0xb3,0xb3,0x65,0xb3, +0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfe,0xf4,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x01,0x07,0x0f,0x5b,0x00,0xab,0x00,0xf5,0x00,0x0c,0xb5,0x02,0x01,0x20,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0x35,0xff,0xff, +0x00,0x52,0xfe,0xa6,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xfe,0xa6,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0xab,0xfe,0xab,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x05,0x5d, +0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xa6,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0x04,0xad,0xff,0xff, +0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc2,0x04,0xaf,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07, +0x0a,0x6d,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x31,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x90,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x4f,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xf2,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xe1,0x04,0x31,0x02,0x5e, +0x00,0x26,0x09,0x17,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x09,0xf7,0x65,0x00,0x0a,0xb4,0x01,0x2f,0x1d,0x01,0x1d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x4f,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf2,0xfe,0x00,0x00,0x06,0x0f,0x50,0xce,0x05,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e, +0x04,0x07,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x04,0x07,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0x50,0x03,0x57, +0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x05,0xf4,0x04,0x07,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x08,0xa0,0x03,0x0f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x50,0xfd,0xce, +0xff,0xff,0xff,0xba,0xfd,0xc9,0x05,0xf4,0x03,0x0f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xa4,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x54,0x05,0x50,0xfd,0xce,0x00,0x07,0x0f,0x53,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xfd,0xc9,0x05,0xf4, +0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xa4,0xfd,0xce,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x03,0x3c,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x51,0x06,0x3c,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x07,0x4b,0x03,0x3c,0x02,0x26,0x08,0xd6,0x00,0x00, +0x00,0x07,0x0f,0x51,0x03,0x86,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x05,0xca,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x07,0x4b,0x05,0xca,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x1e,0x04,0x02,0xff,0xff,0x00,0x19,0xff,0xea,0x05,0xf5, +0x05,0xec,0x02,0x26,0x09,0x1d,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xa7,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xe4,0x04,0xdf,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x06,0x42,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x7a, +0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x02,0x00,0x02,0x00,0xab,0xff,0xea,0x07,0x4b,0x03,0x62,0x00,0x36,0x00,0x4a,0x00,0x4c, +0xbc,0x00,0x23,0x05,0x0a,0x00,0x37,0x00,0x43,0x05,0x0a,0xb6,0x16,0x37,0x16,0x37,0x16,0x4c,0x03,0xb8,0x05,0x0a,0xb4,0x33,0x48,0x10,0x10,0x0d,0xb8,0x04,0xfb,0xb4,0x2a,0x00,0x00,0x1b,0x2a,0xba,0x05,0x03,0x00,0x3e,0x04,0xfb,0xb3,0x2f,0x1b,0x01,0x1b,0x00,0x2f,0x5d,0xed,0x3f,0x12,0x39,0x2f,0x10,0xed,0x32,0x2f,0x32,0x01,0x2f, +0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14, +0x1e,0x02,0x17,0x36,0x36,0x01,0x62,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x3a,0x64,0x89,0x9d,0xac,0x55,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x05,0xe6,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2c, +0x1a,0x18,0x42,0x73,0x5a,0x21,0x1d,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x60,0x84,0x57,0x30,0x17,0x05,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0xf2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26, +0x3c,0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x18,0x4d,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6, +0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x05,0x24,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x27,0x0f,0x50,0x04,0xd7,0x04,0x74,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c, +0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x0e,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x0e,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8, +0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x10,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x0e,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x0e,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea, +0x07,0x4b,0x06,0x3c,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x56,0x04,0xd7,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xd5, +0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x04,0x79,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xd4,0x03,0xc9,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x05,0x91,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xd4,0x03,0xc9,0x00,0x01,0x00,0x19,0xff,0xea,0x08,0x3d,0x04,0x19,0x00,0x3f,0x00,0x41, +0xb9,0x00,0x2e,0x05,0x0a,0xb6,0x0f,0x0c,0x0c,0x0f,0x0f,0x41,0x23,0xbf,0x05,0x0a,0x00,0x18,0x00,0x07,0x04,0xfb,0x00,0x38,0x05,0x03,0x00,0x12,0x04,0xfb,0xb4,0x2f,0x29,0x01,0x29,0x1e,0xb8,0x04,0xfb,0xb3,0x2f,0x1d,0x01,0x1d,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f,0x10,0xed,0x31, +0x30,0x37,0x1e,0x05,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x27,0x19,0x25,0x83,0xaa,0xc8,0xd8,0xdd,0x69,0xa5,0xf9,0xc5,0x9e,0x4b,0x03, +0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x18,0x4a,0x89,0x71,0x03,0xba,0x46,0x76,0x54,0x2f,0x0d,0x1d,0x2e,0x20,0x3a,0xb4,0xed,0xfe,0xdc,0xaa,0x46,0xb1,0xc0,0xc2,0xae,0x8f,0x2d,0xa9,0x05,0x07,0x06,0x03,0x02,0x01,0x02,0x04,0x08,0x06,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40, +0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2d,0x12,0x15,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x1c,0x41,0x40,0x3b,0x16,0x05,0x09,0x06,0x04,0x01,0x02,0x03,0x06,0x07,0x05,0x00,0x00,0x01,0xff,0xba,0xff,0xea,0x07,0x92,0x04,0x19,0x00,0x44,0x00,0x48,0xb9,0x00,0x29,0x05,0x0a,0xb3,0x1e,0x1e,0x45,0x34,0xb8,0x05,0x0a,0xb4, +0x15,0x12,0x12,0x15,0x3e,0xba,0x05,0x03,0x00,0x18,0x04,0xfb,0xb4,0x2f,0x2f,0x01,0x2f,0x24,0xb8,0x04,0xfb,0xb5,0x2f,0x23,0x01,0x23,0x0d,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0x33,0x2f,0x10,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x17,0x23,0x22,0x26,0x35,0x34, +0x36,0x33,0x33,0x32,0x16,0x16,0x04,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x32,0x32,0x23,0x23,0x23,0x23,0x3b,0x1e,0xa2,0xef,0x01,0x2e, +0xab,0x9d,0xf6,0xc3,0x99,0x40,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f,0x0d,0x1d,0x2e,0x20,0x34,0xb6,0xec,0xfe,0xe9,0x96,0x50,0xb3,0xb2,0xa8,0x8b,0x66,0x0e,0x34,0x20,0x20,0x33,0x03,0x03,0x02,0x03,0x05,0x07,0x05,0x0b, +0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x1c,0x41,0x40,0x3b,0x16,0x05,0x08,0x07,0x04,0x01,0x02,0x02,0x02,0x01,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x5b,0x04,0xa6, +0x05,0xb0,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x06,0xb3,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed, +0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x07,0xcb,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xcb,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9, +0x05,0xf4,0x05,0xec,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x74,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x5b,0x04,0xa6, +0x05,0xb0,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x27,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xc3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00, +0x01,0x07,0x0f,0x51,0x03,0x90,0x07,0x13,0x00,0x0c,0xb5,0x02,0x03,0x20,0x3e,0x01,0x3e,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xc3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x51,0x00,0x39,0x07,0x13,0x00,0x0c,0xb5,0x02,0x03,0x20,0x28,0x01,0x28,0x00,0x11,0x5d, +0x35,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab, +0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x52,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff, +0x00,0xab,0xff,0xea,0x06,0xa2,0x08,0xbd,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x57,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x45,0x01,0x20,0x45,0x01,0x45,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x08,0xbd,0x02,0x26, +0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x00,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x30,0x01,0x20,0x30,0x01,0x30,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x70,0x08,0x0e,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0a,0x6d,0x03,0x48,0x00,0x32, +0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x08,0x0e,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0x00,0x32,0xff,0xff,0x00,0x9b,0xfe,0xac,0x04,0xa5,0x07,0x67,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x48,0x06,0xb7,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x07,0x67,0x02,0x26,0x08,0xee,0x00,0x00, +0x00,0x07,0x0f,0x50,0x00,0x9c,0x06,0xb7,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x46,0x08,0x7f,0x02,0x26,0x09,0x25,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x48,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x28,0x01,0x28,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x08,0x7f,0x02,0x26,0x08,0xee,0x00,0x00, +0x01,0x07,0x0f,0x53,0x00,0x9c,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0x04,0x00,0x9b,0xfd,0xc4,0x04,0x9e,0x05,0xec,0x00,0x1d,0x00,0x21,0x00,0x25,0x00,0x29,0x00,0x65,0xbc,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x27,0x05,0x0c,0xb2,0x26,0x26,0x22,0xbb,0x05,0x0c,0x00,0x23, +0x00,0x1e,0x05,0x0c,0x40,0x0a,0x1f,0x0d,0x23,0x1f,0x1f,0x23,0x0d,0x03,0x2b,0x03,0xbb,0x05,0x0a,0x00,0x1a,0x00,0x26,0x04,0xfb,0xb2,0x29,0x22,0x1e,0xb8,0x04,0xfb,0xb5,0x24,0x20,0x21,0x01,0x21,0x08,0xba,0x04,0xfb,0x00,0x15,0x05,0x03,0xb1,0x0e,0x00,0x00,0x2f,0x2f,0x3f,0xed,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0xed,0x01,0x2f,0xed, +0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67, +0x93,0x5d,0x2b,0x9c,0x38,0x81,0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0x9d,0xc9,0xc9,0x01,0x56,0xc9,0xc9,0xab,0xc9,0xc9,0x02,0xec,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x03,0x7e,0xfc,0x6e,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0xfb,0xf0,0xbd,0xbd,0xbd,0xfe,0x2b,0xbd,0x00,0xff,0xff, +0xff,0xba,0xfd,0xc9,0x02,0x48,0x05,0xec,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x4a,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xfb,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00,0x01,0x56,0x00,0x27,0x0f,0x50,0x01,0x9f,0x04,0x02,0x00,0x07,0x0f,0x50,0x01,0x9f,0xfe,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x01,0xf9, +0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x05,0x0e,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x9f,0x02,0xac,0xff,0xff,0x00,0x9b,0xfe,0x55,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00, +0x01,0x56,0x00,0x27,0x0f,0x5b,0x01,0x9f,0x00,0x56,0x00,0x07,0x0f,0x50,0x01,0x9f,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0x05,0x01,0xf9,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x04,0x74,0x02,0x26,0x09,0x5f, +0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x00,0x26,0x09,0x42,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff, +0x05,0x58,0x04,0xda,0x02,0x26,0x09,0x43,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0x56,0xfd,0xce,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x02,0x26,0x09,0x29, +0x00,0x00,0x00,0x06,0x0f,0x5b,0x66,0x60,0x00,0x02,0x00,0x00,0xfd,0xfe,0x03,0x4b,0x03,0x1c,0x00,0x2a,0x00,0x3f,0x00,0x62,0xb2,0x08,0x20,0x35,0xb8,0x05,0x0a,0xb2,0x09,0x16,0x20,0xb8,0x05,0x0a,0xb7,0x0e,0x3d,0x3d,0x0e,0x0e,0x3a,0x11,0x08,0xb8,0x04,0xfd,0xb3,0x0b,0x0b,0x03,0x11,0xb8,0x04,0xfb,0x40,0x09,0x3d,0x2f,0x3a,0x3f, +0x3a,0x02,0x3a,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x2a,0x1f,0x27,0x2f,0x27,0x02,0x27,0x30,0xb8,0x04,0xfb,0xb3,0x2f,0x1b,0x01,0x1b,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0x33,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e, +0x02,0x37,0x21,0x35,0x21,0x36,0x36,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x67,0xab,0x45,0x3e,0x60,0x48,0x33,0x11,0xfe,0x2a,0x01,0xf4,0x08,0x07,0x01,0x2f,0x58, +0x29,0x42,0x7b,0x5e,0x39,0x30,0x55,0x75,0x45,0x42,0x7f,0x63,0x3d,0x13,0x2c,0x49,0x6e,0x96,0x62,0x58,0xad,0x58,0x02,0x98,0x0f,0x2a,0x32,0x35,0x1a,0x1c,0x37,0x2c,0x1b,0x20,0x3a,0x4e,0x2f,0x1b,0x4b,0x2a,0x02,0x09,0xfe,0xfa,0x2b,0x25,0x1b,0x31,0x43,0x28,0x6d,0x2b,0x58,0x2d,0x16,0x11,0x29,0x4f,0x72,0x48,0x41,0x8e,0x77,0x4d, +0x4f,0x9e,0xee,0x9f,0x51,0xa2,0x96,0x83,0x61,0x37,0x2c,0x2a,0x03,0x34,0x33,0x55,0x3d,0x22,0x26,0x3d,0x4a,0x24,0x26,0x3c,0x29,0x16,0x0c,0x14,0x1d,0x33,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x31,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x0a,0x6d,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x38,0x01,0x38,0x00,0x11, +0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x63,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x09,0x30,0x00,0xe4,0xfd,0x55,0x00,0x0c,0xb5,0x03,0x02,0x2f,0x38,0x01,0x38,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x59,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x09,0x73,0x00,0xe5,0xfd,0x55, +0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x31,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x38,0x01,0x38,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x04,0x79,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x00, +0xfd,0xff,0x03,0x49,0x05,0x91,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x03,0xc9,0x00,0x01,0x00,0x32,0xff,0x55,0x06,0x3d,0x04,0x15,0x00,0x37,0x00,0x3a,0xb2,0x0b,0x05,0x31,0xbb,0x05,0x0a,0x00,0x18,0x00,0x2a,0x05,0x0a,0x40,0x09,0x1f,0x25,0x18,0x1f,0x18,0x1f,0x39,0x08,0x0e,0xbd,0x05,0x0a,0x00,0x05,0x00, +0x00,0x04,0xfb,0x00,0x13,0x04,0xe6,0x00,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e, +0x04,0x15,0x14,0x0e,0x04,0x03,0x48,0x91,0xc4,0x78,0x34,0x0e,0x0e,0xfe,0xcf,0x01,0xeb,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xab,0x4c,0x81,0xad,0x60,0x38,0x72,0x39,0x39,0x72,0x61,0x58,0xaf,0x55, +0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x00,0x00,0x01,0x00,0x1e,0xff,0x02,0x07,0x58,0x02,0x13,0x00,0x44,0x00,0x5a,0xb3,0x26,0x14,0x20,0x38,0xb8,0x05,0x0a,0xb2,0x0f, +0x0f,0x14,0xb8,0x05,0x0a,0xb3,0x33,0x33,0x46,0x29,0xb8,0x05,0x0a,0x40,0x09,0x20,0x23,0x23,0x20,0x26,0x3d,0x23,0x23,0x0c,0xb8,0x04,0xff,0xb4,0x2f,0x3d,0x01,0x3d,0x1b,0xb8,0x04,0xfb,0xb4,0x2f,0x2e,0x01,0x2e,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f, +0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e, +0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x07,0x58,0x16,0x43,0x67,0x4f,0x3b,0x2e,0x25,0x12,0x17,0x29,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x97,0xcc,0x7d,0x35,0x04,0x04,0xfe,0xd0,0x01,0xe3,0x0e,0x12,0x23,0x5d,0xa0,0x7d,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x19,0x2c,0x40, +0x66,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x4b,0x81,0xad,0x63,0x1f,0x49,0x23,0x39,0x72,0x5f,0x49,0x79,0x3f,0x4d,0x7d,0x5a,0x31,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x27,0x60,0x54,0x39,0xff,0xff,0x00,0x9a, +0xff,0x55,0x05,0x91,0x05,0xdc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0x2c,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfc,0x50,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x6d, +0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x04,0x79,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x9a,0xfd,0xc9,0x05,0x91,0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x00,0x07,0x0f,0x52,0x02,0x01,0xfd,0xce,0xff,0xff, +0x00,0x9a,0xfd,0xc4,0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0xc8,0xfd,0xc9,0x00,0x08,0xb3,0x02,0x4a,0x14,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc9,0x05,0x91,0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x00,0x07,0x0f,0x54,0x02,0x01,0xfd,0xce,0xff,0xff,0x00,0x9a,0xfd,0xc4, +0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xc8,0xfd,0xc9,0x00,0x04,0xff,0xa8,0x06,0x1d,0x02,0x5f,0x08,0xde,0x00,0x46,0x00,0x56,0x00,0x5a,0x00,0x5e,0x00,0x7a,0xb9,0x00,0x5c,0x05,0x0d,0xb2,0x5b,0x5b,0x0e,0xb8,0x05,0x0d,0xb5,0x47,0x29,0x29,0x47,0x18,0x3f,0xbe,0x05,0x0d,0x00,0x3c,0x00,0x23, +0x05,0x0d,0x00,0x32,0x00,0x57,0x05,0x0d,0xb2,0x58,0x58,0x51,0xb8,0x05,0x0d,0xb6,0x03,0x5d,0x5a,0x5b,0x57,0x3e,0x08,0xb8,0x05,0x01,0x40,0x0a,0x4c,0x43,0x18,0x13,0x54,0x46,0x46,0x37,0x37,0x43,0xb8,0x05,0x01,0xb4,0x13,0x1b,0x1b,0x13,0x26,0xb9,0x05,0x01,0x00,0x2d,0x00,0x2f,0xfd,0xce,0x32,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f, +0x32,0x11,0x39,0x10,0xd4,0xfd,0xcc,0xde,0x32,0xcd,0x32,0x01,0x2f,0xed,0x39,0x2f,0xed,0x2f,0xed,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22, +0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x32,0x17,0x37,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x01,0x98,0x32,0x23,0x14,0x25,0x32, +0x1e,0x1e,0x2f,0x19,0x11,0x1c,0x38,0x55,0x65,0x2e,0x17,0x27,0x30,0x0b,0x01,0x11,0x2c,0x16,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x40,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35,0x3b,0x16,0x1d,0x10,0x0e,0x0c,0x58,0x10,0x1a,0x1a,0x21,0x2d,0x14,0x6e,0x0a,0x11,0x16,0x0c,0x09,0x11,0x0d,0x09,0x25,0x36,0x09, +0x09,0x58,0x57,0x57,0x8f,0x57,0x57,0x07,0x2f,0x15,0x3a,0x1f,0x1b,0x36,0x2b,0x1c,0x1f,0x25,0x1a,0x46,0x2a,0x3b,0x3f,0x1e,0x05,0x17,0x15,0x19,0x12,0x01,0x0f,0x12,0x19,0x10,0x09,0x06,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x08,0x17,0x15,0x01,0x76,0xfe,0xa0,0x2f,0x22,0x01,0x40,0x10,0x24,0x1f,0x15,0x0c, +0x12,0x17,0x0c,0x14,0x29,0x18,0x06,0x1b,0x01,0x06,0x56,0x56,0x56,0x00,0x00,0x02,0xff,0xb7,0x06,0x71,0x02,0x28,0x08,0x06,0x00,0x1f,0x00,0x2f,0x00,0x35,0xb9,0x00,0x12,0x05,0x0d,0xb6,0x26,0x1a,0x20,0x08,0x03,0x17,0x0d,0xb8,0x05,0x01,0xb2,0x2b,0x13,0x23,0xbb,0x05,0x01,0x00,0x17,0x00,0x03,0x05,0x01,0xb3,0x1f,0x1f,0x1d,0x17, +0x00,0x2f,0x33,0x33,0x2f,0xed,0x10,0xfd,0x32,0xd6,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x31,0x30,0x03,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x49,0x0e,0x1c,0x0b, +0x26,0x30,0x21,0x16,0x0d,0x0a,0x1f,0x30,0x45,0x32,0x37,0x50,0x33,0x18,0x19,0x32,0x4a,0x31,0x3f,0x67,0x24,0x20,0x57,0x31,0x16,0x16,0xfa,0x18,0x53,0x31,0x36,0x3e,0x0f,0x1f,0x2f,0x20,0x1d,0x2e,0x24,0x1a,0x06,0xdc,0x02,0x02,0x11,0x21,0x30,0x1e,0x19,0x3d,0x35,0x23,0x2c,0x43,0x4e,0x21,0x23,0x41,0x34,0x1f,0x32,0x23,0x30,0x25, +0x03,0x9e,0x1d,0x1e,0x26,0x26,0x12,0x2c,0x26,0x19,0x16,0x26,0x34,0x00,0x00,0x02,0x00,0x37,0x06,0x1e,0x01,0x9b,0x08,0x4e,0x00,0x2b,0x00,0x2f,0x00,0x39,0xb1,0x19,0x2c,0xb8,0x05,0x0d,0xb2,0x2d,0x20,0x05,0xb8,0x05,0x0e,0xb4,0x13,0x2b,0x18,0x0e,0x24,0xb8,0x04,0xfd,0xb2,0x1e,0x00,0x2f,0xbc,0x04,0xfd,0x00,0x2c,0x00,0x08,0x05, +0x01,0x00,0x0e,0x00,0x2f,0xfd,0xde,0xfd,0xd6,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x03,0x23,0x35,0x33,0x01,0x86, +0x49,0x62,0x3c,0x19,0x3b,0x46,0x46,0x4e,0x29,0x48,0x23,0x38,0x4f,0x32,0x17,0x14,0x37,0x5f,0x4b,0x12,0x1d,0x1e,0x25,0x1b,0x35,0x23,0x14,0x2d,0x1a,0x1c,0x2b,0x24,0x20,0x24,0x2a,0x1d,0x50,0x57,0x57,0x07,0x93,0x12,0x29,0x2d,0x31,0x1a,0x29,0x38,0x1a,0x61,0x0e,0x0c,0x1e,0x33,0x42,0x23,0x1f,0x42,0x3f,0x39,0x17,0x03,0x06,0x0e, +0x0c,0x08,0x0d,0x5f,0x06,0x07,0x0a,0x0f,0x13,0x10,0x0b,0x01,0xfe,0xc7,0x56,0x00,0x00,0x03,0x00,0x1d,0x06,0x70,0x01,0xec,0x08,0x17,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x2d,0xbf,0x00,0x09,0x05,0x0a,0x00,0x08,0x00,0x00,0x05,0x0a,0x00,0x01,0x00,0x0b,0x04,0xff,0xb5,0x20,0x08,0x01,0x08,0x06,0x03,0xb8,0x04,0xff,0xb1,0x04,0x00, +0x00,0x2f,0x32,0xfd,0x32,0xde,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0xbf,0xa2,0xa2,0x01,0x2d,0xa1,0xa1,0x96,0xa2,0xa2,0x06,0x70,0x9e,0x9e,0x9e,0x6b,0x9e,0x00,0x01,0xff,0x2b,0x06,0x1f,0x02,0xae,0x08,0x2f,0x00,0x43,0x00,0x60,0xb4,0x28,0x28,0x00,0x00,0x03, +0xb8,0x05,0x0d,0xb2,0x40,0x21,0x0b,0xb8,0x05,0x0d,0xb6,0x08,0x40,0x08,0x40,0x08,0x18,0x38,0xbb,0x05,0x0d,0x00,0x32,0x00,0x18,0x05,0x0d,0x40,0x0b,0x15,0x21,0x28,0x10,0x1d,0x17,0x0a,0x0a,0x00,0x05,0x10,0xb8,0x05,0x01,0xb3,0x24,0x1d,0x35,0x3b,0xb9,0x04,0xfd,0x00,0x2d,0x00,0x2f,0xfd,0xc6,0xd4,0x32,0xfd,0x32,0xc4,0x32,0x11, +0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x2f,0x32,0x2f,0x31,0x30,0x13,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23, +0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0xe0,0x03,0x05,0x02,0x03,0x3f,0x1d,0x26,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x59,0x1b,0x2b,0x38,0x1d,0x29,0x3e,0x11,0x01,0x14,0x3a,0x1a,0x1a,0x21,0x0a,0x02,0x02,0x19,0x37,0x56,0x3e,0x3f,0x54,0x32, +0x15,0x0d,0x56,0x05,0x05,0x3b,0x44,0x28,0x38,0x23,0x10,0x07,0x07,0x07,0xbc,0x1a,0x2c,0x17,0x34,0x1e,0x2d,0x6d,0x50,0x1b,0x28,0x19,0x0c,0x06,0x11,0x1e,0x17,0xb8,0xd2,0x2d,0x3a,0x21,0x0c,0x17,0x1d,0x1e,0x16,0x0f,0x0e,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x33,0x3b,0x1b,0x29,0x16,0x41,0x35,0x12,0x28,0x41,0x2f,0x21,0x43, +0x2f,0x00,0x00,0x04,0x00,0x2d,0xfe,0xd2,0x08,0xcf,0x06,0x97,0x00,0x20,0x00,0x48,0x00,0x5c,0x00,0x70,0x00,0x31,0x40,0x16,0x18,0x6c,0x6c,0x15,0x3d,0x62,0x62,0x38,0x42,0x1b,0x15,0x08,0x4e,0x4e,0x0d,0x29,0x58,0x58,0x2e,0x24,0x03,0x0d,0x00,0x2f,0x33,0xcd,0x32,0x32,0x2f,0xcd,0x11,0x33,0x2f,0xcd,0x2f,0x33,0xcd,0x32,0x32,0x2f, +0xcd,0x11,0x33,0x2f,0xcd,0x30,0x31,0x25,0x06,0x04,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x24,0x27,0x24,0x11,0x10,0x25,0x36,0x25,0x36,0x36,0x33,0x32,0x16,0x17,0x04,0x17,0x04,0x11,0x10,0x05,0x16,0x04,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x36,0x24,0x37,0x36,0x12,0x35,0x10,0x25,0x26,0x25,0x0e,0x03,0x23,0x22,0x2e,0x02, +0x27,0x06,0x04,0x07,0x04,0x11,0x10,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0xa1,0x7c,0xfe,0xcc,0xbe,0x08,0x22,0x2f,0x3a,0x20,0x20,0x3a,0x2f,0x22,0x08,0xfe,0x82,0xf7,0xfe,0xd5,0x01,0x2e,0xf1,0x01, +0x83,0x12,0x60,0x3f,0x3e,0x5f,0x13,0x01,0x7a,0xf9,0x01,0x2c,0xf8,0xe8,0x6d,0x01,0x09,0xa1,0x09,0x22,0x2e,0x39,0x20,0x1f,0x3a,0x2e,0x22,0x09,0xa4,0x01,0x0a,0x6a,0x86,0x81,0xfe,0xfd,0xce,0xfe,0xb4,0x07,0x21,0x30,0x3b,0x21,0x21,0x3a,0x30,0x22,0x07,0x9f,0xfe,0xf9,0x6a,0xfe,0xef,0x03,0x5b,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21, +0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x41,0x61,0x72,0x13,0x1e,0x32,0x24,0x15,0x15,0x24,0x32,0x1d,0x24,0xc1,0xed,0x01,0x7c,0x01,0x96,0xf1,0xc1,0x27,0x38,0x48,0x47,0x37,0x21,0xc4,0xec,0xfe,0x83,0xfe,0x65,0xa5,0x55,0x63,0x11,0x1c,0x31, +0x23,0x14,0x14,0x23,0x31,0x1c,0x11,0x5e,0x50,0x66,0x01,0x16,0xb7,0x01,0x72,0xc9,0x9f,0x23,0x1f,0x34,0x26,0x15,0x15,0x25,0x33,0x1e,0x11,0x65,0x53,0xd4,0xfe,0xa6,0xfe,0xa6,0xfe,0x2f,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x06,0x38,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21, +0x13,0x13,0x21,0x2d,0x00,0x0a,0x01,0x46,0xfe,0xa4,0x07,0x66,0x06,0xc8,0x00,0x17,0x00,0x2b,0x00,0x34,0x00,0x3d,0x00,0x45,0x00,0x52,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x0c,0xb3,0x3d,0x12,0x31,0x06,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x34,0x3e,0x02,0x37,0x01,0x01,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x01, +0x2e,0x03,0x25,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x01,0x32,0x16,0x17,0x13,0x27,0x07,0x13,0x36,0x01,0x03,0x06,0x06,0x23,0x22,0x27,0x03,0x17,0x13,0x16,0x16,0x17,0x25,0x26,0x26,0x27,0x01,0x14,0x16,0x17,0x25,0x26,0x26,0x35,0x34,0x37,0x25,0x06,0x06,0x05,0x14,0x06,0x07,0x05,0x36,0x35, +0x34,0x26,0x27,0x05,0x16,0x01,0x26,0x26,0x27,0x05,0x16,0x16,0x17,0x01,0x06,0x06,0x07,0x13,0x36,0x36,0x37,0x01,0x36,0x36,0x37,0x03,0x06,0x06,0x07,0x01,0x46,0x42,0x78,0xa7,0x65,0x01,0x4a,0x01,0x4a,0x65,0xa7,0x78,0x42,0x43,0x78,0xa7,0x64,0xfe,0xb6,0xfe,0xb4,0x64,0xa6,0x78,0x42,0x01,0xf5,0x2c,0x4d,0x67,0x3b,0x3b,0x67,0x4d, +0x2c,0x2c,0x4d,0x67,0x3b,0x3b,0x67,0x4d,0x2c,0x01,0x1b,0x20,0x3e,0x1d,0x72,0xed,0xee,0x73,0x3c,0x01,0x2c,0x73,0x1d,0x3d,0x20,0x41,0x3a,0x72,0xed,0xb3,0x38,0x58,0x1d,0x01,0x06,0x33,0xa7,0x6c,0xfc,0x3a,0x14,0x14,0x01,0x05,0x09,0x0a,0x14,0xfe,0xfa,0x14,0x14,0x04,0x32,0x0b,0x09,0x01,0x05,0x29,0x14,0x14,0xfe,0xfa,0x14,0xfd, +0xc0,0x38,0x58,0x1d,0xfe,0xfb,0x33,0xa7,0x6c,0x02,0x80,0x1d,0x58,0x38,0x6c,0x6c,0xa7,0x33,0xfc,0x3a,0x1d,0x58,0x38,0x6c,0x6b,0xa8,0x33,0x02,0xb6,0x76,0xda,0xb8,0x91,0x2f,0x01,0x4a,0xfe,0xb5,0x2f,0x91,0xb8,0xd9,0x76,0x76,0xd9,0xb8,0x92,0x2e,0xfe,0xb5,0x01,0x4c,0x2e,0x91,0xb8,0xd9,0x76,0x3b,0x67,0x4d,0x2c,0x2c,0x4d,0x67, +0x3b,0x3b,0x67,0x4d,0x2c,0x2c,0x4d,0x67,0x01,0x51,0x0b,0x09,0x01,0x16,0xee,0xee,0xfe,0xea,0x14,0xfb,0xe5,0x01,0x16,0x09,0x0a,0x14,0xfe,0xe9,0xed,0x04,0xdc,0x1d,0x58,0x38,0x6d,0x6c,0xa7,0x33,0xfd,0x9a,0x3d,0x74,0x36,0x6c,0x1d,0x3e,0x20,0x3f,0x3c,0x6c,0x36,0x74,0x3d,0x20,0x3e,0x1d,0x6c,0x6d,0x7a,0x3d,0x74,0x36,0x6d,0x3a, +0xfe,0x5f,0x1d,0x58,0x38,0x6c,0x6c,0xa7,0x33,0x01,0xb2,0x38,0x58,0x1d,0xfe,0xfc,0x33,0xa6,0x6c,0x01,0xd3,0x38,0x58,0x1d,0x01,0x05,0x33,0xa7,0x6b,0x00,0x00,0x02,0x00,0x63,0x06,0x8f,0x01,0xa4,0x07,0xd0,0x00,0x0b,0x00,0x17,0x00,0x26,0x41,0x0c,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x00,0x05,0x00, +0x00,0x12,0x00,0x0c,0x05,0x00,0x00,0x06,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x05,0x41,0x5e,0x5e,0x41,0x45,0x5d,0x5d,0x45,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0x07,0xd0,0x5d, +0x45,0x41,0x5e,0x5e,0x41,0x45,0x5d,0xf6,0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0x02,0x00,0x63,0x06,0x7b,0x01,0xa4,0x08,0x1c,0x00,0x0b,0x00,0x19,0x00,0x24,0xbf,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x00,0x05,0x00,0xb2,0x12,0x0c,0x06,0xb8,0x01,0x4c,0x00,0x3f,0xdd,0xd6,0xed,0x01,0x2f,0xed, +0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x01,0x02,0x4b,0x57,0x53,0x4f,0x4c,0x53,0x54,0x4e,0x30,0x21,0x22,0x2f,0x30,0x24,0x08,0x14,0x20,0x08,0x1c,0x67,0x69,0x66,0x6b,0x69,0x67,0x6a,0x67,0xfe,0xaa,0x3b,0x49,0x4b,0x3c, +0x3b,0x4b,0x25,0x33,0x1f,0x0e,0x00,0x01,0x00,0x23,0x06,0x71,0x01,0xe3,0x07,0xb8,0x00,0x20,0x00,0x1d,0xb4,0x0b,0x12,0x1b,0x04,0x16,0xbc,0x04,0xfd,0x00,0x10,0x00,0x07,0x05,0x01,0x00,0x00,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xc4,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x36,0x37,0x35,0x2e,0x03,0x23, +0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x07,0x0e,0x03,0x5f,0x0d,0x15,0x0d,0x0d,0x0e,0x1c,0x0d,0x54,0x90,0x39,0x12,0x1f,0x22,0x29,0x1d,0x32,0x24,0x13,0x2e,0x18,0x2b,0x3c,0x36,0x3b,0x2a,0x12,0x15,0x43,0x5c,0x76,0x06,0x71,0x01,0x02,0x67,0x02,0x02,0x34,0x23,0x03,0x06,0x0e,0x0c,0x08,0x0d,0x5f,0x06,0x07,0x16,0x1a, +0x17,0x01,0x73,0x09,0x2e,0x30,0x25,0x00,0x00,0x02,0x00,0x16,0x06,0x1f,0x02,0x28,0x08,0x5e,0x00,0x20,0x00,0x30,0x00,0x40,0xb3,0x06,0x2c,0x03,0x10,0xb8,0x05,0x0d,0xb3,0x24,0x20,0x20,0x1d,0xb8,0x05,0x0d,0x40,0x0a,0x03,0x00,0x00,0x03,0x1a,0x06,0x2c,0x03,0x15,0x0b,0xbb,0x05,0x01,0x00,0x29,0x00,0x21,0x05,0x01,0xb1,0x15,0x20, +0x00,0x2f,0xd6,0xfd,0xd6,0xed,0x11,0x17,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x13,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e, +0x03,0x1e,0x04,0x04,0x31,0x2b,0x12,0x41,0x48,0x44,0x15,0x33,0x4a,0x2f,0x16,0x16,0x2a,0x3f,0x29,0x1a,0x35,0x31,0x2e,0x13,0x2b,0x24,0x04,0x05,0xfa,0x27,0x34,0x0d,0x1b,0x2b,0x1e,0x35,0x50,0x14,0x16,0x2c,0x2b,0x2b,0x06,0x1f,0x1a,0x31,0x14,0x44,0x61,0x17,0x65,0x74,0x3b,0x10,0x2c,0x44,0x4f,0x23,0x24,0x40,0x30,0x1d,0x0b,0x0c, +0x0b,0x3a,0x34,0x14,0x32,0x1a,0x01,0x12,0x1e,0x2b,0x13,0x2d,0x26,0x19,0x56,0x58,0x01,0x09,0x09,0x07,0x00,0x01,0xff,0x2b,0xfd,0xf5,0x02,0xae,0x00,0x05,0x00,0x43,0x00,0x66,0xb9,0x00,0x18,0x05,0x0d,0xb2,0x15,0x21,0x0b,0xb8,0x05,0x0d,0xb5,0x08,0x28,0x28,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x0a,0x40,0x15,0x08,0x40,0x40,0x08, +0x15,0x03,0x17,0x38,0xb8,0x05,0x0d,0xb4,0x32,0x17,0x38,0x32,0x2d,0xb8,0x04,0xfd,0xb4,0x3b,0x21,0x28,0x24,0x1d,0xb8,0x04,0xfd,0xb6,0x05,0x10,0x16,0x09,0x09,0x35,0x00,0x00,0x2f,0x32,0x32,0x11,0x33,0xd4,0x32,0xed,0x32,0x39,0x39,0xd4,0xed,0x2f,0x2f,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x32, +0x2f,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x17,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e, +0x02,0x35,0x34,0x26,0x27,0xe0,0x03,0x05,0x02,0x03,0x3f,0x1d,0x26,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x59,0x1b,0x2b,0x38,0x1d,0x29,0x3e,0x11,0x01,0x14,0x3a,0x1a,0x1a,0x21,0x0a,0x02,0x02,0x19,0x37,0x56,0x3e,0x3f,0x54,0x32,0x15,0x0d,0x56,0x05,0x05,0x3b,0x44,0x28,0x38,0x23,0x10,0x07,0x07,0x6e,0x1a,0x2c,0x17,0x34, +0x1e,0x2d,0x6d,0x50,0x1b,0x28,0x19,0x0c,0x06,0x11,0x1e,0x17,0xb8,0xd2,0x2d,0x3a,0x21,0x0c,0x17,0x1d,0x1e,0x16,0x0f,0x0e,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x33,0x3b,0x1b,0x29,0x16,0x41,0x35,0x12,0x28,0x41,0x2f,0x21,0x43,0x2f,0x00,0x01,0xff,0xc9,0x06,0x71,0x02,0x3c,0x07,0x26,0x00,0x1b,0x00,0x28,0x40,0x0a,0x00,0x0e, +0x0e,0x0d,0x0d,0x05,0x00,0x1b,0x1b,0x13,0xbc,0x05,0x01,0x00,0x0a,0x00,0x18,0x05,0x01,0x00,0x05,0x00,0x2f,0xed,0xdc,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x3c,0x18,0x2e,0x2a,0x26, +0x10,0x30,0x4b,0x45,0x46,0x29,0x20,0x2d,0x17,0x3a,0x18,0x2d,0x2a,0x26,0x11,0x30,0x4c,0x45,0x44,0x29,0x21,0x2d,0x17,0x06,0xbf,0x19,0x1f,0x10,0x06,0x19,0x1d,0x19,0x15,0x14,0x41,0x19,0x1f,0x10,0x06,0x19,0x1d,0x19,0x13,0x16,0x00,0x02,0x00,0x4d,0x06,0x1f,0x01,0xb8,0x08,0x29,0x00,0x22,0x00,0x32,0x00,0x39,0xb1,0x13,0x2d,0xb8, +0x05,0x0d,0xb4,0x0f,0x0f,0x33,0x23,0x1a,0xb8,0x05,0x0d,0xb2,0x08,0x03,0x14,0xb8,0x05,0x01,0xb2,0x28,0x08,0x30,0xbc,0x04,0xfd,0x00,0x0a,0x00,0x03,0x04,0xfd,0x00,0x1f,0x00,0x2f,0xfd,0xde,0xfd,0x39,0xde,0xed,0x01,0x2f,0x2f,0xed,0x33,0x11,0x33,0x2f,0xed,0x32,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22, +0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x4d,0x2c,0x45,0x21,0x29,0x32,0x1b,0x0a,0x01,0x21,0x28,0x1e,0x36,0x29,0x18,0x16,0x27,0x36,0x20,0x22,0x34,0x1a,0x1a,0x19,0x17,0x31,0x4f,0x38,0x26,0x49, +0x2d,0x01,0x13,0x0c,0x15,0x1b,0x0f,0x0b,0x16,0x11,0x0b,0x2f,0x1c,0x10,0x1f,0x06,0x9c,0x11,0x0c,0x14,0x1f,0x28,0x14,0x0c,0x12,0x23,0x35,0x23,0x1e,0x42,0x36,0x24,0x25,0x25,0x26,0x69,0x3b,0x30,0x59,0x44,0x29,0x0e,0x11,0x01,0x0d,0x0d,0x2b,0x28,0x1d,0x0e,0x16,0x1c,0x0d,0x1d,0x1f,0x04,0xff,0xff,0x00,0x21,0x06,0x70,0x03,0x36, +0x08,0x35,0x00,0x07,0x0a,0x1e,0x00,0x9f,0x00,0x00,0x00,0x01,0xff,0x82,0x06,0x70,0x02,0x97,0x08,0x35,0x00,0x23,0x00,0x1b,0xb9,0x00,0x08,0x05,0x0d,0xb4,0x1b,0x00,0x23,0x23,0x0b,0xb9,0x05,0x01,0x00,0x16,0x00,0x2f,0xed,0x32,0x2f,0x33,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02, +0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x36,0x36,0x37,0x01,0x02,0x20,0x38,0x33,0x31,0x19,0x2d,0x23,0x81,0x8b,0x38,0x77,0x72,0x66,0x27,0x34,0x7a,0x78,0x6c,0x27,0x63,0x86,0x51,0x22,0x13,0x23,0x2f,0x1b,0x2a,0x68,0x31,0x07,0xe3,0x1a,0x28,0x20,0x1b,0x0d,0x17,0x19,0x12,0x25,0x1b,0x04,0x06,0x08,0x05, +0x65,0x06,0x09,0x07,0x03,0x15,0x29,0x3a,0x25,0x1e,0x2e,0x27,0x21,0x11,0x19,0x40,0x2a,0x00,0x00,0x02,0x00,0x32,0x06,0x71,0x01,0xd4,0x08,0x8c,0x00,0x1e,0x00,0x22,0x00,0x31,0xbc,0x00,0x1f,0x05,0x0b,0x00,0x20,0x00,0x03,0x05,0x0d,0xb3,0x1b,0x11,0x11,0x13,0xb8,0x05,0x0d,0xb5,0x0d,0x22,0x1f,0x1e,0x11,0x16,0xb9,0x05,0x01,0x00, +0x08,0x00,0x2f,0xfd,0xc6,0xd6,0xd6,0xcd,0x01,0x2f,0xed,0x32,0x2f,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x01,0xc7,0x07,0x06,0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06, +0x05,0x58,0x09,0x31,0x3b,0x23,0x31,0x20,0x0e,0x07,0x06,0x31,0x73,0x73,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x35,0x2a,0x0f,0x22,0x37,0x27,0x1a,0x3d,0x26,0x38,0x71,0x00,0x00,0x04,0x00,0x64,0xff,0xe0,0x04,0x68,0x06,0xb4,0x00,0x17,0x00,0x2e,0x00,0x45,0x00,0x5b,0x00,0x14, +0xb7,0x3a,0x23,0x0b,0x52,0x45,0x18,0x17,0x46,0x00,0x2f,0xcd,0xde,0xcd,0x2f,0x33,0xce,0x32,0x30,0x31,0x01,0x26,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x07,0x11,0x21,0x37,0x11,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x06,0x06, +0x07,0x11,0x27,0x11,0x36,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x17,0x11,0x07,0x21,0x11,0x36,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x01,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x01,0x18,0x41,0x2b,0x23,0x25,0x13,0x24,0x33,0x21,0x01,0x77,0x01,0x75,0x40,0x4d,0x22, +0x23,0x15,0x37,0x23,0xfd,0x64,0xbe,0x34,0x40,0x14,0x16,0x16,0x2a,0x26,0xf4,0xf2,0x24,0x2e,0x17,0x15,0x17,0x44,0x2d,0x44,0x39,0x4c,0x11,0x0e,0x10,0x21,0x19,0xc6,0xc6,0x1c,0x1e,0x0f,0x0e,0x0e,0x4a,0x3f,0x9a,0x01,0xcc,0x33,0x3f,0x0e,0x1a,0x1a,0x3c,0x33,0xfe,0xd5,0xfe,0xd3,0x33,0x3a,0x1c,0x1a,0x1e,0x60,0x02,0xa2,0x29,0x42, +0x35,0x7c,0x42,0x32,0x56,0x4d,0x45,0x21,0x01,0x79,0xfe,0x8b,0x41,0x9f,0x60,0x41,0x7b,0x35,0x20,0x37,0x15,0xfd,0x3e,0xbe,0x02,0x6c,0x15,0x2f,0x19,0x1c,0x4e,0x2d,0x3c,0x5b,0x26,0xf5,0xf2,0x24,0x5e,0x40,0x2d,0x4c,0x1b,0x1d,0x2f,0x14,0xfd,0x96,0x44,0x02,0x52,0x1a,0x2d,0x16,0x12,0x37,0x22,0x30,0x45,0x19,0xc6,0xc8,0x1d,0x41, +0x2c,0x21,0x39,0x12,0x13,0x33,0x14,0xfd,0xaa,0x9a,0x02,0x95,0x1e,0x35,0x17,0x28,0x5e,0x32,0x49,0x7f,0x33,0x01,0x2b,0xfe,0xd2,0x34,0x76,0x4d,0x33,0x60,0x27,0x2e,0x3d,0x00,0x00,0x02,0x00,0x10,0xfd,0xda,0x01,0xf7,0xff,0xc1,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x14,0x00,0x07,0x07,0x05,0x05,0x06,0x01,0x04,0x03,0x02,0x02,0x01, +0x2f,0x03,0x01,0x03,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0x2f,0x5d,0x12,0x39,0x3d,0x2f,0x12,0x39,0x12,0x39,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x13,0x37,0x17,0x07,0x35,0x37,0x27,0x07,0x10,0xf4,0xf3,0xf4,0x8a,0x89,0x8a,0xfe,0xcd,0xf4,0xf4,0xf3,0x6a,0x89,0x89,0x89,0x00,0x02,0x00,0x10,0x06,0x35,0x01,0xf7,0x08,0x1c,0x00,0x03, +0x00,0x07,0x00,0x22,0x40,0x0e,0x00,0x07,0x07,0x05,0x05,0x06,0x01,0x04,0x03,0x02,0x02,0x01,0x03,0x01,0x00,0x2f,0x2f,0x12,0x39,0x3d,0x2f,0x12,0x39,0x12,0x39,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x13,0x37,0x17,0x07,0x35,0x37,0x27,0x07,0x10,0xf4,0xf3,0xf4,0x8a,0x89,0x8a,0x07,0x28,0xf4,0xf4,0xf3,0x6a,0x89,0x89,0x89,0x00,0x02, +0x00,0x16,0xfd,0xf5,0x02,0x28,0x00,0x34,0x00,0x20,0x00,0x30,0x00,0x40,0xb9,0x00,0x10,0x05,0x0d,0xb5,0x24,0x20,0x20,0x06,0x06,0x1d,0xb8,0x05,0x0d,0x40,0x09,0x03,0x00,0x00,0x03,0x1a,0x2c,0x0b,0x20,0x15,0xbb,0x04,0xfd,0x00,0x21,0x00,0x29,0x04,0xfd,0xb3,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xfd,0xd6,0xed,0x32,0x11,0x39,0x39, +0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x2f,0xed,0x31,0x30,0x13,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x13,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x1e,0x04,0x04,0x31,0x2b,0x12,0x41,0x48,0x44, +0x15,0x33,0x4a,0x2f,0x16,0x16,0x2a,0x3f,0x29,0x1a,0x35,0x31,0x2e,0x13,0x2b,0x24,0x04,0x05,0xfa,0x27,0x34,0x0d,0x1b,0x2b,0x1e,0x35,0x50,0x14,0x16,0x2c,0x2b,0x2b,0xfd,0xf5,0x1a,0x31,0x14,0x44,0x61,0x17,0x65,0x74,0x3b,0x10,0x2c,0x44,0x4f,0x23,0x24,0x40,0x30,0x1d,0x0b,0x0c,0x0b,0x3a,0x34,0x14,0x32,0x1a,0x01,0x12,0x1e,0x2b, +0x13,0x2d,0x26,0x19,0x56,0x58,0x01,0x09,0x09,0x07,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x53,0x05,0x46,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xa4, +0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x04,0xb2,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x27,0x0f,0x50,0x06,0x3c,0xfe,0xab,0x00,0x07,0x0f,0x50,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x07,0x4b,0x04,0xb2,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x27,0x0f,0x50,0x03,0x1e, +0x04,0x02,0x00,0x07,0x0f,0x50,0x03,0x90,0xfe,0xab,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0x8f,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0xe4,0x04,0xdf,0x00,0x07,0x0f,0x50,0x01,0x8f,0xff,0xb1,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x05,0x2a,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x56, +0x04,0x7a,0x00,0x07,0x0f,0x50,0x01,0x56,0xff,0x57,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x1d,0x04,0x34,0x00,0x07,0x0f,0x50,0x01,0x1d,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x56, +0x04,0x02,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x5a,0xfd,0xff,0x02,0xe5,0x02,0xb4,0x02,0x26,0x09,0x07,0x00,0x00,0x00,0x07,0x0f,0x5d,0x00,0xab,0x00,0x00,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x5d,0x01,0x99,0x00,0x00,0xff,0xff,0xff,0xc2,0xff,0xea, +0x03,0xf3,0x07,0x77,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x02,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xff,0xea,0x04,0xad,0x07,0x77,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x07, +0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x02,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x34,0xfd,0xfe,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff,0x00,0x34,0xfd,0xfe,0x04,0xad,0x05,0xec,0x00,0x27,0x0f,0x8d,0x02,0xac, +0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff,0x00,0x3a,0xff,0xea,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x3a,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00, +0x00,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xc5,0x08,0x0e,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x9d,0x00,0x32,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xc5,0x08,0x0e,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27, +0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x9d,0x00,0x32,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0xfa,0x07,0x67,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x9d,0x06,0xb7,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x07,0x67,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27, +0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x9d,0x06,0xb7,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x9b,0x08,0x7f,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x01,0x07,0x0f,0x53,0x02,0x9d,0x06,0xb7,0x00,0x0e,0xb6,0x04,0x03,0x02,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff, +0x00,0x52,0xff,0xea,0x04,0xad,0x08,0x7f,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x01,0x07,0x0f,0x53,0x02,0x9d,0x06,0xb7,0x00,0x0e,0xb6,0x04,0x03,0x02,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x9b,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27, +0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x9d,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x9d,0xfd,0xce,0x00,0x01,0x00,0x65,0x00,0x00,0x03,0xf8,0x05,0xa8,0x00,0x2b,0x00,0x40,0xb4,0x04,0x03,0x15, +0x2d,0x1d,0xb8,0x05,0x0a,0xb2,0x0e,0x0e,0x14,0xb8,0x05,0x0a,0xb6,0x15,0x27,0x22,0x04,0x04,0x14,0x09,0xb8,0x04,0xfb,0xb7,0x22,0x00,0x00,0x2f,0x22,0x01,0x22,0x14,0xb8,0x04,0xe6,0x00,0x3f,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x02,0x07, +0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x16,0x12,0x15,0x11,0x23,0x11,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x03,0xf8,0x48,0x6d,0x23,0x9a,0x11,0x38,0x4a,0x5b,0x33,0x1d,0x25,0x14,0x07,0x18,0x1e,0x18,0x9c,0x0d,0x12,0x17,0x12,0x0d,0x21,0x41,0x5f,0x3f,0x46,0x75,0x5c,0x3f, +0x0f,0x05,0x1a,0x43,0x26,0x05,0x9a,0x6f,0xfe,0xfe,0x95,0x4a,0x83,0x62,0x39,0x11,0x1b,0x23,0x11,0x1d,0x72,0xbe,0xfe,0xec,0xc0,0xfe,0x85,0x01,0x73,0x88,0xd5,0xa4,0x7a,0x5c,0x44,0x1c,0x39,0x5d,0x43,0x25,0x3c,0x5d,0x6e,0x33,0x56,0x94,0x42,0x00,0x00,0x01,0x00,0x52,0x00,0x00,0x03,0x81,0x05,0x9a,0x00,0x12,0x00,0x20,0xb9,0x00, +0x08,0x05,0x0a,0xb2,0x07,0x00,0x0f,0xba,0x04,0xfb,0x00,0x11,0x04,0xe6,0xb3,0x2f,0x08,0x01,0x08,0x00,0x2f,0x5d,0x3f,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x37,0x3e,0x04,0x12,0x37,0x33,0x06,0x02,0x0e,0x03,0x07,0x21,0x15,0x21,0x52,0x31,0x53,0x45,0x36,0x27,0x19,0x05,0x9c,0x07,0x19,0x23,0x2d,0x37,0x41,0x25,0x02,0x5c,0xfc,0xd1, +0x42,0x5c,0xb1,0xba,0xcd,0xf3,0x01,0x20,0xb1,0xb4,0xfe,0xe2,0xe8,0xba,0xa2,0x92,0x4b,0xa7,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xcb,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xcb,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90, +0x06,0x03,0x00,0x01,0x00,0x00,0x01,0x87,0x02,0xfe,0x01,0xd9,0x00,0x03,0x00,0x10,0xb9,0x00,0x00,0x04,0xfd,0xb3,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0xfe,0xfd,0x02,0x02,0xfe,0x01,0x87,0x52,0x00,0xff,0xff,0xff,0x97,0xff,0xea,0x03,0xf3,0x07,0x77,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00, +0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x8f,0xff,0xff,0xff,0x97,0xff,0xea,0x04,0xad,0x07,0x77,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x8f,0x00,0x10,0x00,0x66,0x00,0x5a,0x04,0x5b,0x04,0x4e,0x00,0x07,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x2f, +0x00,0x37,0x00,0x3f,0x00,0x47,0x00,0x4f,0x00,0x57,0x00,0x5f,0x00,0x67,0x00,0x6f,0x00,0x77,0x00,0x7f,0x01,0x23,0xb9,0x00,0x18,0x05,0x0b,0xb2,0x1c,0x30,0x10,0xb8,0x05,0x0b,0xb4,0x34,0x14,0x14,0x40,0x00,0xb8,0x05,0x0b,0xb4,0x04,0x44,0x04,0x48,0x08,0xb8,0x05,0x0b,0xb4,0x0c,0x4c,0x0c,0x60,0x20,0xb8,0x05,0x0b,0xb4,0x24,0x64, +0x24,0x70,0x28,0xb8,0x05,0x0b,0xb4,0x2c,0x74,0x2c,0x78,0x38,0xb8,0x05,0x0b,0xb4,0x3c,0x7c,0x3c,0x68,0x50,0xb8,0x05,0x0b,0x40,0x14,0x54,0x6c,0x54,0x1c,0x04,0x0c,0x24,0x2c,0x3c,0x54,0x54,0x3c,0x2c,0x24,0x0c,0x04,0x1c,0x07,0x81,0x58,0xb8,0x05,0x0b,0xb2,0x5c,0x2a,0x0a,0xb8,0x04,0xfd,0xb4,0x0e,0x2e,0x0e,0x3a,0x02,0xb8,0x04, +0xfd,0xb4,0x06,0x3e,0x06,0x52,0x12,0xb8,0x04,0xfd,0xb4,0x16,0x56,0x16,0x5a,0x1a,0xb8,0x04,0xfd,0xb4,0x1e,0x5e,0x1e,0x6a,0x32,0xb8,0x04,0xfd,0xb4,0x36,0x6e,0x36,0x7a,0x42,0xb8,0x04,0xfd,0xb4,0x46,0x7e,0x46,0x72,0x4a,0xb8,0x04,0xfd,0x40,0x14,0x4e,0x76,0x4e,0x0e,0x06,0x16,0x1e,0x36,0x46,0x4e,0x4e,0x46,0x36,0x1e,0x16,0x06, +0x0e,0x07,0x26,0x62,0xbb,0x04,0xfd,0x00,0x66,0x00,0x22,0x04,0xfd,0xb3,0x3f,0x26,0x01,0x26,0x00,0x2f,0x5d,0xed,0x2f,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32, +0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x32,0x2f,0x33,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x14,0x23,0x22,0x35,0x34,0x33, +0x32,0x27,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x13,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x07,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33, +0x32,0x07,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x07,0x16,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x25,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x13,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x27,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x03,0xd4,0x30,0x34,0x34,0x30,0x94, +0x30,0x34,0x34,0x30,0xf7,0x33,0x31,0x33,0x31,0x24,0x30,0x34,0x34,0x30,0xfe,0x37,0x32,0x32,0x32,0x32,0xad,0x33,0x31,0x31,0x33,0x02,0x52,0x33,0x31,0x31,0x33,0xfd,0x1a,0x32,0x32,0x32,0x32,0x02,0x83,0x30,0x34,0x34,0x30,0x94,0x30,0x34,0x34,0x30,0xfd,0xae,0x30,0x34,0x32,0x32,0x24,0x01,0x31,0x34,0x34,0x31,0x01,0xc7,0x32,0x32, +0x32,0x32,0xfe,0x5c,0x32,0x32,0x32,0x32,0xf7,0x33,0x31,0x31,0x33,0x94,0x32,0x32,0x32,0x32,0x03,0x96,0x32,0x32,0x32,0x30,0x31,0x31,0x33,0xfe,0xd7,0x33,0x33,0x31,0xdf,0x32,0x32,0x32,0x01,0x97,0x33,0x33,0x31,0x56,0x31,0x31,0x33,0xfd,0x7b,0x31,0x31,0x33,0x01,0xbd,0x32,0x2f,0x35,0xfd,0x48,0x31,0x31,0x33,0x95,0x30,0x30,0x34, +0x02,0x20,0x33,0x33,0x31,0xdf,0x32,0x32,0x32,0xfe,0x07,0x33,0x33,0x31,0xe8,0x31,0x31,0x33,0xfe,0xd9,0x34,0x30,0x34,0x2e,0x31,0x31,0x33,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x09,0x63,0x01,0xef,0x00,0x0f,0x00,0x10,0xb2,0x0e,0x0b,0x07,0xb9,0x04,0xfb,0x00,0x00,0x00,0x2f,0xfd,0xcd,0x33,0x30,0x31,0x05,0x21,0x22,0x26,0x27,0x27, +0x37,0x21,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x33,0x09,0x63,0xf8,0x84,0x55,0xb2,0x51,0x1c,0x05,0x07,0x66,0x20,0x23,0x9d,0x25,0x1e,0xe8,0x0e,0x0e,0x0f,0x85,0x05,0x5a,0xa8,0x54,0x5a,0xa3,0x59,0x00,0x01,0x00,0x73,0xff,0xf1,0x08,0x39,0x01,0x60,0x00,0x4d,0x00,0x22,0xb1,0x2e,0x3d,0xb8,0x04,0xfb,0xb5,0x1d,0x00,0x10,0x18,0x06, +0x22,0xb8,0x04,0xfb,0xb2,0x45,0x33,0x29,0x00,0x2f,0x33,0x33,0xfd,0x32,0x32,0xdc,0x32,0x32,0xed,0x32,0x30,0x31,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x1e,0x03,0x33,0x21,0x17,0x07,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23, +0x22,0x2e,0x02,0x27,0x2e,0x03,0x23,0x22,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x24,0x0a,0x0b,0x23,0x1b,0x16,0x2a,0x28,0x25,0x11,0x14,0x2e,0x34,0x3c,0x21,0x20,0x31,0x27,0x1f,0x0e,0x1e,0x30,0x22,0x12,0x29,0x2e,0x32,0x1a,0x36,0x74,0x87,0x9f,0x62,0x01,0x7a,0x05,0x1c,0x51,0xb2,0x55,0x35,0x60,0x8d, +0x71,0x60,0x33,0x20,0x3c,0x38,0x33,0x18,0x21,0x33,0x29,0x20,0x0f,0x12,0x1c,0x1a,0x1b,0x12,0x1d,0x34,0x1d,0x16,0x32,0x3d,0x4c,0x30,0x33,0x48,0x2d,0x15,0x13,0x0f,0x01,0x48,0x1e,0x3b,0x16,0x26,0x20,0x10,0x1b,0x21,0x11,0x13,0x28,0x20,0x15,0x15,0x20,0x29,0x13,0x2a,0x32,0x10,0x26,0x3e,0x2f,0x1d,0x39,0x2c,0x1b,0x05,0x85,0x0f, +0x0e,0x17,0x25,0x31,0x1b,0x2a,0x35,0x1d,0x0b,0x0f,0x1a,0x22,0x13,0x17,0x25,0x19,0x0e,0x28,0x1c,0x15,0x2d,0x25,0x18,0x1b,0x30,0x43,0x28,0x2a,0x52,0x25,0x00,0x02,0x00,0x49,0xff,0xf2,0x05,0xd0,0x02,0x6c,0x00,0x1c,0x00,0x2e,0x00,0x16,0xb9,0x00,0x15,0x04,0xfb,0xb2,0x22,0x2c,0x1c,0xb9,0x04,0xfb,0x00,0x0b,0x00,0x2f,0xfd,0x32, +0xdc,0xed,0x30,0x31,0x25,0x17,0x07,0x06,0x06,0x23,0x23,0x2a,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x17,0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x05,0xcc,0x04,0x1c,0x51,0xb2,0x55,0x36,0x1c,0x5e,0x7b,0x95,0x52,0x82,0xc1,0x7f,0x3f,0x32,0x5a,0x7c,0x4a,0x3e,0x68,0x55, +0x43,0x33,0x23,0x0b,0x9f,0x0b,0x2b,0x3f,0x53,0x34,0x20,0x43,0x38,0x24,0x20,0x42,0x66,0x47,0x30,0x52,0x99,0x06,0x84,0x0f,0x0e,0x05,0x2a,0x59,0x53,0x55,0x97,0x71,0x42,0x2d,0x4a,0x60,0x68,0x68,0x2c,0x36,0x6a,0x55,0x35,0x17,0x31,0x4c,0x35,0x24,0x28,0x13,0x03,0x01,0x00,0x02,0x00,0x73,0xff,0xed,0x0b,0xbf,0x02,0x6c,0x00,0x32, +0x00,0x46,0x00,0x1c,0xb9,0x00,0x18,0x04,0xfb,0xb4,0x3d,0x42,0x11,0x09,0x00,0xb8,0x04,0xfb,0xb1,0x22,0x2c,0x00,0x2f,0x33,0xfd,0xcc,0x33,0x33,0xdc,0xed,0x30,0x31,0x25,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x26,0x27, +0x23,0x06,0x06,0x23,0x21,0x22,0x26,0x27,0x27,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x07,0xab,0x2d,0x23,0x02,0x04,0x07,0x04,0x8a,0x0b,0x0e,0x04,0x03,0x0a,0x13,0x20,0x19,0x0f,0x2d,0x3d,0x4c,0x5b,0x6b,0x3d,0x45,0x65,0x43,0x20,0x36,0x78,0xc0,0x8a,0x7c,0xa4,0x24,0x11,0x21, +0x0b,0x02,0x1e,0x53,0x2d,0xfa,0x41,0x55,0xb2,0x51,0x1c,0x05,0x09,0xab,0x4e,0x65,0x3c,0x17,0x18,0x29,0x37,0x1f,0x35,0x59,0x46,0x33,0x0f,0x0d,0x30,0x32,0x2d,0x99,0x2f,0x2d,0x0a,0x1d,0x21,0x22,0x0f,0x2a,0x4e,0x14,0x0d,0x18,0x13,0x0d,0x02,0x2c,0x68,0x67,0x60,0x4a,0x2c,0x3a,0x64,0x87,0x4d,0x63,0x6d,0x33,0x0a,0x05,0x0e,0x06, +0x22,0x13,0x2a,0x1f,0x0e,0x0f,0x85,0x05,0x03,0x04,0x16,0x2f,0x2c,0x31,0x45,0x2d,0x15,0x36,0x55,0x6b,0x36,0x01,0x00,0x02,0x00,0x49,0xff,0xf0,0x08,0x3d,0x02,0x6c,0x00,0x1e,0x00,0x30,0x00,0x36,0xb4,0x1e,0x1f,0x1f,0x32,0x29,0xbb,0x05,0x0a,0x00,0x12,0x00,0x24,0x04,0xfb,0x40,0x0b,0x2f,0x17,0x01,0x17,0x2e,0x2e,0x1f,0x1f,0x1e, +0x1e,0x00,0xb9,0x04,0xfb,0x00,0x07,0x00,0x2f,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x10,0xcd,0x30,0x31,0x25,0x32,0x36,0x37,0x07,0x06,0x06,0x23,0x21,0x22,0x06,0x22,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x17,0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e, +0x02,0x33,0x32,0x36,0x06,0xfe,0x51,0x9c,0x52,0x21,0x23,0x80,0x55,0xfd,0x63,0x5c,0x8c,0x80,0x82,0x53,0x82,0xc1,0x7f,0x3f,0x32,0x5a,0x7c,0x4a,0x3e,0x68,0x55,0x43,0x33,0x23,0x0b,0x9f,0x0b,0x2a,0x40,0x54,0x33,0x20,0x43,0x38,0x24,0x20,0x42,0x66,0x47,0x30,0x53,0x99,0x08,0x0a,0xa9,0x05,0x0b,0x01,0x01,0x07,0x2a,0x5a,0x52,0x55, +0x97,0x71,0x42,0x2d,0x4a,0x60,0x68,0x68,0x2c,0x36,0x6a,0x55,0x35,0x17,0x31,0x4c,0x35,0x24,0x28,0x13,0x03,0x01,0x00,0x01,0x00,0x46,0xfe,0xaa,0x02,0x1e,0x02,0x01,0x00,0x09,0x00,0x18,0x40,0x0a,0x00,0x06,0x06,0x0b,0x0a,0x09,0x2f,0x05,0x01,0x05,0x00,0x2f,0x5d,0xcd,0x11,0x12,0x01,0x39,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x07, +0x23,0x36,0x12,0x37,0x02,0x1e,0x2c,0x5a,0x56,0x51,0x23,0x88,0x46,0x9f,0x4f,0x02,0x01,0x5a,0xce,0xdb,0xe4,0x70,0xfb,0x01,0xb4,0xa8,0x00,0x02,0x00,0x32,0xfd,0xfe,0x04,0x2e,0x04,0x0c,0x00,0x45,0x00,0x58,0x00,0x6d,0xb2,0x45,0x26,0x13,0xb8,0x05,0x0a,0xb4,0x4b,0x4b,0x5a,0x2e,0x26,0xb8,0x05,0x0a,0xb3,0x09,0x05,0x05,0x3f,0xb8, +0x05,0x0a,0xb7,0x2e,0x1b,0x23,0x55,0x09,0x04,0x18,0x0e,0xbc,0x04,0xfc,0x00,0x50,0x04,0xe6,0x00,0x00,0x04,0xfb,0xb5,0x42,0x2b,0x45,0x45,0x18,0x3a,0xb8,0x04,0xfb,0xb2,0x33,0x20,0x46,0xb8,0x04,0xfc,0x40,0x09,0x18,0x1f,0x1f,0x1f,0x18,0x2f,0x18,0x02,0x18,0x00,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x12,0x39,0x2f,0x39, +0x39,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x39,0x2f,0x39,0xed,0x11,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x16,0x17,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34, +0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x37,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x15,0x16,0x16,0x03,0x5c,0xad,0xe9,0x8c,0x3b,0x08,0x07,0x05,0x3a,0x76,0x78,0x78,0x3d,0x4f,0x77,0x50,0x28,0x40,0x78,0xae,0x6e,0x6f,0xad,0x3f,0x03,0x10,0x1e, +0x10,0x8c,0x1d,0x3b,0x1d,0x21,0x21,0x14,0x32,0x52,0x3f,0x4c,0x45,0x3d,0x72,0xa6,0x69,0x23,0x4f,0x2a,0x27,0x55,0x2b,0x36,0x65,0x4d,0x2f,0x37,0x33,0x51,0xd0,0x8a,0xfb,0x4b,0x72,0x4e,0x27,0x14,0x2c,0x45,0x30,0x2a,0x5c,0x62,0x6a,0x37,0x2d,0x86,0x01,0x9f,0x2e,0x68,0x73,0x7c,0x42,0x1d,0x33,0x1a,0x51,0x70,0x46,0x1f,0x2e,0x4f, +0x68,0x39,0x49,0x87,0x69,0x3f,0x40,0x36,0x01,0x1b,0x39,0x20,0x3d,0x6b,0x30,0x36,0x78,0x40,0x2e,0x65,0x66,0x65,0x30,0x45,0xa3,0x4f,0x4c,0x8c,0x6a,0x40,0x08,0x09,0xaa,0x08,0x0b,0x15,0x34,0x57,0x43,0x48,0x71,0x28,0x2d,0x52,0x24,0xfc,0x55,0x26,0x3d,0x4d,0x26,0x1b,0x33,0x28,0x18,0x17,0x39,0x63,0x4c,0x02,0x2d,0x36,0x00,0x02, +0xff,0xc9,0x06,0x37,0x02,0x29,0x07,0xeb,0x00,0x24,0x00,0x36,0x00,0x2e,0xbc,0x00,0x11,0x05,0x0d,0x00,0x2a,0x00,0x0c,0x05,0x01,0x40,0x09,0x2d,0x25,0x32,0x32,0x25,0x07,0x07,0x01,0x25,0xb8,0x05,0x01,0xb1,0x1f,0x16,0x00,0x2f,0xc6,0xfd,0xc4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd6,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x33,0x16,0x16, +0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x16,0x32,0x32,0x17,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13,0x20,0x46,0x71, +0x51,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x01,0x44,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c,0x1d,0x1b,0x07,0x56,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x04,0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x58,0x02, +0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x01,0xff,0xe9,0x06,0x37,0x01,0xee,0x07,0xeb,0x00,0x2e,0x00,0x4a,0xb1,0x24,0x06,0xb8,0x05,0x0d,0xb4,0x00,0x27,0x27,0x09,0x1e,0xb8,0x05,0x0d,0x40,0x0b,0x18,0x1a,0x1a,0x18,0x09,0x24,0x09,0x0a,0x2e,0x2e,0x2c,0xb8,0x05,0x01,0xb5,0x03,0x09,0x23,0x23,0x1b,0x09,0xb8,0x05, +0x01,0xb1,0x14,0x0a,0x00,0x2f,0xc6,0xfd,0xc4,0x33,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x11,0x12,0x39,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x39,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x17, +0x1e,0x03,0x33,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0xbe,0x0e,0x1d,0x11,0x2e,0x40,0x92,0x48,0xcd,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x0a,0x51,0x06,0x09,0x02,0x02,0x08,0x12,0x20,0x1b,0x1d,0x12,0x17,0x1d,0x34,0x49,0x2c,0x20,0x22,0x07,0x7e,0x03,0x04,0x26,0x2c,0x5b,0x64,0x01,0x04, +0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x27,0x18,0x2f,0x0b,0x0a,0x11,0x0c,0x06,0x1b,0x3b,0x1e,0x23,0x3b,0x2b,0x17,0x06,0x00,0x02,0x00,0x03,0x06,0x1f,0x02,0x20,0x08,0x00,0x00,0x1d,0x00,0x36,0x00,0x2c,0xbf,0x00,0x2e,0x05,0x0d,0x00,0x25,0x00,0x11,0x04,0xfd,0x00,0x18,0x00,0x20,0x04,0xfd,0x40,0x0a,0x33,0x1e,0x00, +0x0c,0x14,0x1d,0x05,0x05,0x28,0x05,0x00,0x2f,0x2f,0x12,0x17,0x39,0x2f,0xfd,0xd4,0xed,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x23,0x3e,0x03,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x03,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22, +0x26,0x27,0x01,0x4a,0x49,0x5a,0x34,0x18,0x07,0x51,0x06,0x17,0x32,0x57,0x47,0x14,0x1c,0x1e,0x25,0x1c,0x18,0x2d,0x11,0x14,0x2e,0x17,0x2b,0x39,0x32,0x37,0x2b,0x65,0x38,0x26,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x0c,0x11,0x0c,0x06,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0x07,0x2f,0x12,0x29,0x2f,0x36,0x1e,0x1e,0x40,0x3f,0x3a,0x18, +0x03,0x07,0x0e,0x0c,0x07,0x06,0x07,0x5f,0x06,0x07,0x15,0x1b,0x17,0x01,0xfe,0xee,0x11,0x17,0x29,0x37,0x21,0x3e,0x75,0x36,0x1d,0x3d,0x3e,0x3a,0x19,0x3c,0x5c,0x3e,0x20,0x09,0x0a,0x00,0x00,0x04,0xff,0x88,0x06,0x1f,0x02,0xb1,0x08,0xbb,0x00,0x24,0x00,0x36,0x00,0x4d,0x00,0x51,0x00,0x52,0xb2,0x41,0x45,0x4e,0xbb,0x05,0x0d,0x00, +0x4f,0x00,0x45,0x05,0x0d,0xb2,0x3e,0x37,0x11,0xb8,0x05,0x0d,0xb3,0x2a,0x51,0x4e,0x0c,0xb8,0x05,0x01,0x40,0x09,0x2d,0x25,0x32,0x32,0x25,0x07,0x07,0x01,0x25,0xb8,0x05,0x01,0xb3,0x1f,0x16,0x41,0x39,0xb9,0x04,0xfd,0x00,0x4a,0x00,0x2f,0xfd,0xce,0xd4,0xce,0xfd,0xc4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd6,0xfd,0xd6,0xcd,0x01,0x2f, +0xed,0x39,0x2f,0xed,0x2f,0xed,0x12,0x39,0x31,0x30,0x03,0x33,0x16,0x16,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x16,0x32,0x32,0x17,0x16,0x33,0x32,0x3e,0x02, +0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0x23,0x35,0x33,0x58,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0c,0x2d,0x40,0x53,0x33,0x27,0x38,0x26,0x12,0x1e,0x42,0x69,0x4b,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x01,0x3c,0x2a,0x37,0x20,0x0d,0x30,0x22,0x1d,0x2f,0x26,0x1c, +0x08,0x07,0x1a,0x1b,0x18,0xa0,0x36,0x28,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x17,0x18,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0x98,0x57,0x57,0x07,0x92,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x04,0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x58,0x02,0x0e,0x1b,0x1a, +0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x83,0x11,0x17,0x28,0x38,0x20,0x3f,0x74,0x37,0x39,0x7f,0x34,0x3c,0x5b,0x3e,0x20,0x09,0x0a,0x02,0x33,0x56,0x00,0x01,0xff,0xc4,0x06,0x71,0x02,0x22,0x07,0xb0,0x00,0x2a,0x00,0x31,0xb9,0x00,0x01,0x05,0x0d,0xb2,0x29,0x0c,0x1e,0xb8,0x05,0x0d,0xb5,0x1d,0x1e,0x18,0x15,0x15,0x24,0xb8,0x05,0x01, +0xb5,0x06,0x14,0x14,0x11,0x06,0x00,0x00,0x2f,0x2f,0x33,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x02, +0x22,0x1b,0x2b,0x38,0x1d,0x26,0x33,0x20,0x10,0x03,0x04,0x0b,0x22,0x35,0x4d,0x34,0x10,0x21,0x13,0x0c,0x17,0x2a,0x13,0x3f,0x4f,0x2d,0x10,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x07,0xb0,0xa7,0x2d,0x3b,0x23,0x0d,0x11,0x1f,0x2b,0x1a,0x19,0x2b,0x1f,0x12,0x02,0x02,0x66,0x02,0x02,0x15,0x29,0x3a,0x25,0x35,0x1b,0x28,0x19, +0x0c,0x06,0x11,0x1e,0x17,0x8d,0x00,0x01,0x00,0xc4,0xfd,0xf6,0x01,0x42,0xff,0x7e,0x00,0x03,0x00,0x15,0xbd,0x00,0x00,0x05,0x0b,0x00,0x01,0x00,0x00,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x42,0x7e,0x7e,0xfd,0xf6,0x01,0x88,0x00,0x00,0x02,0xff,0xbf,0x06,0x73,0x01,0xca,0x08,0x2c, +0x00,0x23,0x00,0x2f,0x00,0x35,0xb2,0x03,0x10,0x06,0xb8,0x05,0x0d,0xb5,0x24,0x00,0x00,0x24,0x14,0x2a,0xb8,0x05,0x0d,0xb3,0x10,0x03,0x23,0x1e,0xbc,0x04,0xfd,0x00,0x17,0x00,0x2d,0x04,0xfd,0x00,0x0b,0x00,0x2f,0xfd,0xd4,0xed,0x32,0x39,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x06,0x06,0x07,0x16, +0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x27,0x26,0x22,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x13,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x71,0x09,0x14,0x0b,0x39,0x48,0x1d,0x31,0x3e,0x21,0x26,0x3e,0x2c,0x18,0x17,0x1a,0x01,0x06,0x07,0x01,0x38,0x5c, +0x32,0x12,0x30,0x66,0x3c,0x14,0x30,0x17,0x23,0x2d,0x39,0x3c,0x34,0x1d,0x1c,0x29,0x29,0x21,0x36,0x07,0xef,0x08,0x10,0x0b,0x1a,0x59,0x42,0x2a,0x3d,0x29,0x14,0x19,0x2b,0x3b,0x21,0x20,0x46,0x21,0x02,0x01,0x0f,0x0d,0x53,0x0e,0x0e,0x03,0x05,0x22,0x22,0xfe,0xec,0x2a,0x3a,0x10,0x1a,0x3d,0x1c,0x21,0x2d,0x23,0x00,0x01,0x00,0x32, +0x06,0x71,0x01,0xd4,0x07,0xe3,0x00,0x1c,0x00,0x29,0xb2,0x11,0x11,0x13,0xb8,0x05,0x0d,0xb3,0x0d,0x0d,0x1d,0x03,0xb8,0x05,0x0d,0xb3,0x19,0x1c,0x11,0x16,0xb9,0x05,0x01,0x00,0x08,0x00,0x2f,0xfd,0xc6,0xc6,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34, +0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0xc7,0x07,0x06,0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06,0x05,0x58,0x09,0x30,0x3c,0x46,0x3c,0x07,0x06,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x36,0x29,0x40,0x4f,0x1a,0x3d,0x26,0x00,0xff,0xff, +0xff,0xc6,0x06,0x7c,0x02,0x2c,0x08,0xde,0x01,0x07,0x0f,0x57,0x00,0x00,0x06,0x7c,0x00,0x15,0x40,0x0c,0x01,0x00,0x20,0x00,0x01,0x20,0x00,0x01,0x20,0x00,0x01,0x00,0x00,0x11,0x5d,0x5d,0x5d,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x05,0x02,0x26,0x09,0x15,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xfe,0x29, +0x00,0x0a,0xb4,0x01,0x2f,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x05,0x02,0x26,0x0e,0x2f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x1d,0xfe,0x29,0x00,0x0a,0xb4,0x01,0x2f,0x2b,0x01,0x2b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc2,0x04,0xaf,0x02,0x26,0x09,0x17,0x00,0x00, +0x00,0x07,0x0a,0x6e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xaf,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x53,0xff,0xf2,0x05,0x32,0x06,0x40,0x02,0x26,0x0e,0x5c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0x01,0xfe,0x64,0xff,0xff,0x00,0x67,0xfd,0xff,0x05,0x58, +0x05,0xaa,0x02,0x26,0x08,0xf2,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x73,0xfd,0xce,0x00,0x0a,0xb4,0x03,0x2f,0x56,0x01,0x56,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x87,0x06,0x40,0x02,0x26,0x0e,0x5b,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x56,0xfe,0x64,0x00,0x0a,0xb4,0x03,0x2f,0x57,0x01,0x57,0x00,0x11,0x5d,0x35, +0xff,0xff,0xff,0xba,0xfd,0xff,0x04,0x02,0x05,0xaa,0x02,0x26,0x0e,0x5d,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x1d,0xfd,0xce,0x00,0x0a,0xb4,0x03,0x2f,0x4d,0x01,0x4d,0x00,0x11,0x5d,0x35,0x00,0x06,0xfe,0x93,0xfe,0x64,0x01,0x6d,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x1f,0x00,0x29,0x00,0x32,0x00,0x57,0xbc,0x00,0x20,0x05, +0x0a,0x00,0x25,0x00,0x2f,0x05,0x0a,0xb2,0x2a,0x2a,0x16,0xbb,0x05,0x0a,0x00,0x1a,0x00,0x12,0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x31,0x10,0xb8,0x04,0xfc,0xb5,0x2c,0x12,0x0b,0x23,0x18,0x02,0xb8,0x04,0xfc,0xb6,0x27,0x1d,0x14,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0x33,0x33,0x33,0xed,0x32,0x32,0xd4,0x32, +0x32,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0xed,0x39,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x14,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x16,0x17,0x14,0x23, +0x22,0x26,0x35,0x34,0x33,0x32,0x01,0x6d,0x41,0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xbb,0x43,0x44,0x28,0x1c,0x1c,0x27,0xb6,0x28,0x1b,0x42,0x42,0x1c,0x27,0x5a,0x41,0x1c,0x28,0x44,0x41,0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x44,0x41,0x41,0x1c,0x28,0x28,0x1c,0x1b,0x26,0x41, +0x44,0x28,0xd4,0x44,0x28,0x1c,0x41,0x00,0x00,0x04,0xfe,0xa9,0xfe,0x64,0x01,0x54,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x19,0x00,0x47,0xbc,0x00,0x16,0x05,0x0c,0x00,0x17,0x00,0x12,0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x12,0x0b,0xbb,0x04,0xfc,0x00,0x10,0x00,0x02,0x04,0xfc,0xb4,0x07,0x15,0x07, +0x07,0x16,0xb8,0x04,0xfd,0xb4,0x14,0x2f,0x19,0x01,0x19,0x00,0x2f,0x5d,0x33,0xed,0x33,0x11,0x33,0x10,0xfd,0xd6,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x21,0x35,0x21,0x01,0x54,0x41, +0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xbb,0xfe,0xf4,0x01,0x0c,0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x52,0x52,0x00,0x04,0xfe,0x91,0xfe,0x64,0x01,0x71,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x1d,0x00,0x59,0xb9,0x00,0x18,0x05,0x0d,0xb4,0x19,0x19,0x1e,0x1b,0x12,0xb8, +0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x1a,0x16,0xb8,0x04,0xfd,0xb2,0x1d,0x15,0x02,0xb8,0x04,0xfc,0xb2,0x07,0x07,0x18,0xb8,0x04,0xfe,0xb6,0x14,0x2f,0x1d,0x01,0x1d,0x12,0x0b,0xb8,0x04,0xfc,0xb3,0x2f,0x10,0x01,0x10,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x5d,0x33,0xe4,0x33,0x10,0xed,0x33,0x10,0xed,0x32,0x01, +0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x01,0x71,0x41,0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xba,0x73,0x5c,0x73,0x01,0x42, +0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x54,0x85,0x85,0x54,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x08,0x0e,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0x00,0x32,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x07,0x67,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c, +0x06,0xb7,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x08,0x7f,0x02,0x26,0x09,0x3f,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x9c,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x2a,0x01,0x2a,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x05,0xec,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x4a, +0xfd,0xce,0xff,0xff,0x00,0xa1,0xff,0xf2,0x09,0x4b,0x08,0x36,0x00,0x26,0x09,0x71,0x00,0x00,0x00,0x07,0x09,0x0d,0x08,0x04,0x00,0x00,0x00,0x05,0x00,0x9b,0xfd,0xff,0x0b,0x15,0x05,0xec,0x00,0x1d,0x00,0x37,0x00,0x52,0x00,0x56,0x00,0x5a,0x00,0xb2,0xb2,0x44,0x1a,0x4a,0xb8,0x05,0x0a,0xb2,0x3f,0x38,0x24,0xba,0x05,0x0a,0x00,0x58, +0x05,0x0a,0xb6,0x21,0x57,0x57,0x21,0x54,0x54,0x53,0x41,0x09,0x05,0x0a,0x00,0x33,0x05,0x0a,0x00,0x30,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x03,0x05,0x0a,0x40,0x17,0x1a,0x3f,0x21,0x30,0x0d,0x1a,0x1a,0x0d,0x30,0x21,0x3f,0x05,0x5c,0x5b,0x5a,0x5a,0x08,0x55,0x55,0x08,0x08,0x59,0x56,0xb8,0x04,0xfb,0x40,0x0b,0x58,0x53,0x53,0x54, +0x54,0x15,0x15,0x57,0x57,0x38,0x3a,0xb8,0x04,0xfb,0x40,0x0b,0x52,0x1f,0x4f,0x2f,0x4f,0x02,0x4f,0x44,0x33,0x32,0x1e,0xba,0x04,0xfb,0x00,0x29,0x05,0x03,0xb2,0x23,0x0e,0x00,0x00,0x2f,0x2f,0x2f,0x3f,0xed,0x2f,0x2f,0x2f,0x2f,0x5d,0x33,0xed,0x32,0x32,0x2f,0x32,0x2f,0x33,0x2f,0x32,0x2f,0x33,0xed,0x32,0x32,0x2f,0x33,0x2f,0x11, +0x33,0x2f,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0xe4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xe4,0xed,0x39,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x32,0x36,0x35, +0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x4e,0x0b,0x0b,0x24,0x4e,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x38,0x81,0xd4,0x9d, +0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x06,0x96,0x5d,0x5b,0x9c,0x37,0x5f,0x7e,0x47,0x44,0x65,0x48,0x2d,0x1a,0x0a,0x9c,0x09,0x23,0x45,0x01,0x67,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1a,0x28,0x1c,0x0f,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0xfe,0x48,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84, +0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0x28,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0xfe,0xeb,0x68,0x70,0x01,0xa6,0xfe,0x53,0x6b,0x90,0x58,0x25,0x21,0x39,0x4c,0x57,0x5e,0x2e,0x04,0x79,0xfb,0xc2,0x40,0x69,0x4b,0x29,0xfe,0x40,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x41,0x8e,0x8f,0x8b,0x3e, +0x8a,0xd4,0x90,0x4a,0x16,0x17,0x79,0xb5,0xb5,0xb5,0x00,0x02,0xff,0xd4,0x05,0x20,0x02,0x33,0x06,0xf2,0x00,0x2f,0x00,0x33,0x00,0x62,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb7,0x12,0x15,0x15,0x12,0x0a, +0x29,0x06,0x31,0xb8,0x04,0xfd,0xb6,0x32,0x15,0x23,0x23,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0xdc,0x32,0x11,0x33,0xde,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15, +0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x25,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11, +0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xbc, +0x58,0x00,0x00,0x03,0xff,0xd4,0x05,0x20,0x02,0x33,0x07,0xfd,0x00,0x2f,0x00,0x53,0x00,0x61,0x00,0x85,0xb9,0x00,0x54,0x05,0x0d,0xb3,0x4d,0x00,0x00,0x03,0xb8,0x05,0x0d,0xb4,0x2c,0x2f,0x2f,0x2c,0x43,0xb8,0x05,0x0d,0x40,0x09,0x0a,0x41,0x1f,0x5c,0x5c,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19, +0xb8,0x05,0x0b,0xb4,0x12,0x15,0x15,0x12,0x48,0xb8,0x04,0xfd,0xb3,0x57,0x50,0x5f,0x3d,0xb8,0x04,0xfd,0x40,0x0a,0x36,0x33,0x33,0x36,0x15,0x00,0x23,0x0a,0x0d,0x06,0xb8,0x04,0xfd,0xb1,0x1c,0x29,0x00,0x2f,0x33,0xed,0x32,0x39,0xde,0x32,0x32,0xce,0x32,0x2f,0x10,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f, +0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x12,0x39,0x39,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14, +0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14, +0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x5a,0x17,0x28,0x11,0x18,0x2f,0x14,0x3c,0x65,0x31,0x12,0x33,0x5a,0x39,0x01,0x0b,0x06,0x01,0x34,0x1e,0x31,0x3e,0x21,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f, +0x18,0x0f,0x23,0x1a,0x30,0x3a,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x1d,0x11,0x22,0x11,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x40,0x40,0x24,0x39,0x27,0x14,0x14, +0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x1a,0x10,0x1a,0x3a,0x1a,0x0e,0x36,0x00,0x00,0x02,0xff,0xd4,0x05,0x28,0x02,0x33,0x06,0xfc,0x00,0x2f,0x00,0x33,0x00,0x63,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f, +0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0d,0x12,0x15,0x15,0x12,0x0a,0x29,0x06,0x15,0x22,0x22,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb2,0x0d,0x06,0x31,0xb9,0x04,0xfd,0x00,0x32,0x00,0x2f,0xfd,0xd6,0x32,0xfd,0x32,0xcc,0x32,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39, +0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x02,0x2f,0x02,0x02, +0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x06,0xfc,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12, +0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xfe,0x84,0x58,0x00,0x00,0x03,0xff,0x6c,0x05,0x20,0x02,0x33,0x07,0xfd,0x00,0x2f,0x00,0x54,0x00,0x62,0x00,0x8b,0xb2,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb7,0x12,0x15,0x15,0x12,0x12,0x63,0x3b,0x55,0xb8,0x05,0x0d,0xb4,0x4e,0x3b,0x00,0x00,0x03,0xb8,0x05,0x0d,0xb4,0x2c, +0x2f,0x2f,0x2c,0x44,0xb8,0x05,0x0d,0x40,0x09,0x0a,0x42,0x1f,0x5d,0x5d,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0x40,0x0a,0x1f,0x22,0x22,0x1f,0x3c,0x60,0x39,0x03,0x36,0x49,0xbb,0x04,0xfd,0x00,0x58,0x00,0x3f,0x04,0xfd,0xb6,0x36,0x16,0x00,0x22,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd4,0x32, +0x32,0xd6,0xfd,0xd4,0xed,0x11,0x17,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x12,0x39,0x39,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34, +0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37, +0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x5a,0x17,0x28,0x11,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34, +0x10,0x0f,0x01,0x36,0x1e,0x31,0x3f,0x20,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a,0x2f,0x3b,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14, +0x2c,0x0d,0x1d,0x11,0x22,0x11,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x42,0x41,0x24,0x38,0x27,0x14,0x14,0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x19,0x11,0x1b,0x38,0x1b,0x0e,0x35,0x00,0x00,0x03,0xff,0xd4,0x05,0x28,0x02,0x33,0x07,0xab,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6b, +0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0d,0x12,0x15,0x15,0x12,0x0a,0x29,0x06,0x15,0x23,0x23,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb2,0x0d,0x06,0x31,0xbc,0x04,0xfd,0x00,0x32,0x00,0x35,0x04,0xfd,0x00, +0x36,0x00,0x2f,0xfd,0xd6,0xfd,0xd6,0x32,0xfd,0x32,0xcc,0x32,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37, +0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01, +0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x07,0xab,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xfe,0x84,0x58,0x57,0x58,0x00,0x00,0x04,0x00,0x35, +0xfd,0xf6,0x03,0xf2,0x05,0x28,0x00,0x27,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x58,0xbc,0x00,0x14,0x05,0x0a,0x00,0x28,0x00,0x3e,0x05,0x0b,0xb2,0x3f,0x3f,0x3a,0xbb,0x05,0x0c,0x00,0x3b,0x00,0x32,0x05,0x0a,0x40,0x0b,0x05,0x28,0x3b,0x05,0x05,0x3b,0x28,0x03,0x43,0x42,0x3a,0xb8,0x04,0xfb,0xb4,0x3d,0x3f,0x40,0x37,0x24,0xbd,0x04, +0xfb,0x00,0x1b,0x05,0x03,0x00,0x2d,0x04,0xfb,0x00,0x0c,0x00,0x2f,0xed,0x3f,0xed,0x32,0xd6,0xcd,0x2f,0xed,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x04,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x27,0x16, +0x16,0x33,0x32,0x36,0x37,0x25,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x03,0x23,0x11,0x33,0x02,0x4e,0x49,0x60,0x38,0x16,0x15,0x28,0x3a,0x47,0x54,0x2f,0x45,0x75,0x38,0x14,0x26,0x1d,0x11,0x3c,0x64,0x82,0x8e,0x8f,0x3e,0x39,0x52,0x41,0x36,0x1e,0x20,0x51,0x9e,0x47,0x49,0x77, +0x21,0x01,0x09,0x22,0x38,0x4a,0x27,0x1d,0x37,0x2b,0x1b,0x18,0x42,0x73,0x5a,0x21,0x1d,0xab,0xc9,0xc9,0x23,0x7e,0x7e,0x9e,0x1d,0x45,0x4c,0x52,0x2b,0x2e,0x60,0x5b,0x50,0x3d,0x23,0x51,0x58,0x20,0x4a,0x54,0x5d,0x32,0x5e,0x82,0x56,0x30,0x17,0x05,0x02,0x04,0x06,0x04,0xa7,0x0a,0x08,0x07,0x04,0xc6,0x33,0x78,0x66,0x44,0x26,0x3c, +0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x17,0x52,0x03,0x36,0xbd,0xf8,0xce,0x01,0x88,0x00,0x03,0x00,0x65,0xff,0xea,0x03,0x9d,0x03,0x6c,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3a,0xb9,0x00,0x21,0x05,0x0c,0xb4,0x13,0x1b,0x1b,0x24,0x15,0xbb,0x05,0x0c,0x00,0x0f,0x00,0x09,0x05,0x0c,0xb2,0x03,0x1e,0x12,0xbe,0x04,0xfe,0x00,0x18,0x00, +0x0c,0x05,0x03,0x00,0x00,0x04,0xfe,0x00,0x06,0x00,0x2f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0xd4,0xed,0x11,0x33,0x2f,0xc4,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x02,0x00,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0xfd,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0xfd,0x79,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x02,0x8e,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfd,0x5c,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0xff,0xe7,0x06,0x7c,0x02,0x1f,0x06,0xe8, +0x00,0x03,0x00,0x15,0xb2,0x01,0x00,0x02,0xb8,0x04,0xfd,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xcd,0x31,0x30,0x03,0x21,0x15,0x21,0x19,0x02,0x38,0xfd,0xc8,0x06,0xe8,0x6c,0x00,0x00,0x01,0xff,0xdf,0x06,0x7c,0x02,0x28,0x07,0xdc,0x00,0x06,0x00,0x15,0xb7,0x03,0x01,0x05,0x01,0x04,0x02,0x03,0x00,0x00,0x2f,0x32, +0xcd,0x32,0x01,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x03,0x33,0x17,0x37,0x33,0x03,0xcb,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x06,0x7c,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x01,0xff,0xdf,0x06,0x7c,0x02,0x28,0x07,0xdc,0x00,0x06,0x00,0x15,0xb7,0x03,0x01,0x05,0x01,0x03,0x00,0x04,0x02,0x00,0x2f,0x33,0xcd,0x32,0x01,0x2f,0x2f,0x12, +0x39,0x31,0x30,0x01,0x13,0x23,0x27,0x07,0x23,0x13,0x01,0x3c,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x07,0xdc,0xfe,0xa0,0xff,0xff,0x01,0x60,0x00,0x01,0x00,0x97,0xfe,0x92,0x01,0x6e,0xff,0x69,0x00,0x0b,0x00,0x15,0xbd,0x00,0x06,0x05,0x0c,0x00,0x00,0x00,0x09,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x13,0x34,0x36, +0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x97,0x3d,0x2f,0x2f,0x3c,0x3c,0x2f,0x2f,0x3d,0xfe,0xfe,0x2f,0x3c,0x3c,0x2f,0x2f,0x3d,0x3d,0x00,0x00,0x02,0x00,0x3d,0x06,0x55,0x02,0x48,0x08,0x0e,0x00,0x23,0x00,0x2f,0x00,0x39,0xb4,0x14,0x2a,0x03,0x06,0x10,0xb8,0x05,0x0d,0xb3,0x2a,0x00,0x00,0x24,0xbb,0x05,0x0d,0x00,0x06,0x00, +0x0b,0x04,0xfd,0xb3,0x2d,0x03,0x27,0x17,0xb8,0x04,0xfd,0xb3,0x20,0x1e,0x01,0x1e,0x00,0x2f,0x5d,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0xed,0x32,0x2f,0x2f,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x13,0x36,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x17,0x16,0x32,0x33,0x32,0x36,0x37,0x17,0x06, +0x06,0x23,0x22,0x26,0x27,0x06,0x07,0x03,0x14,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x96,0x09,0x14,0x0b,0x39,0x48,0x1d,0x31,0x3e,0x21,0x26,0x3e,0x2c,0x18,0x17,0x1a,0x01,0x06,0x07,0x01,0x38,0x5c,0x32,0x12,0x30,0x66,0x3c,0x14,0x30,0x17,0x23,0x2d,0x39,0x3c,0x34,0x1d,0x1c,0x29,0x29,0x21,0x36,0x06,0x92,0x08,0x10, +0x0b,0x1a,0x59,0x42,0x2a,0x3d,0x29,0x14,0x19,0x2b,0x3b,0x21,0x20,0x46,0x21,0x02,0x01,0x0f,0x0d,0x53,0x0e,0x0e,0x03,0x05,0x22,0x22,0x01,0x14,0x2a,0x3a,0x10,0x1a,0x3d,0x1c,0x21,0x2d,0x23,0x00,0x00,0x03,0x00,0x05,0x06,0x67,0x02,0x01,0x08,0x31,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x34,0xb9,0x00,0x08,0x05,0x0a,0xb3,0x00,0x09, +0x01,0x04,0xb8,0x05,0x0a,0x40,0x0f,0x05,0x02,0x01,0x03,0x00,0x01,0x00,0x04,0x0b,0x08,0x07,0x20,0x04,0x01,0x04,0x00,0x2f,0x5d,0xdd,0xd4,0xcd,0x11,0x39,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x32,0x2f,0x33,0xed,0x31,0x30,0x13,0x01,0x15,0x01,0x25,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xa1, +0xa1,0xfe,0xa5,0xa1,0xa1,0x06,0xd3,0x01,0x5e,0x6c,0xfe,0xa2,0x01,0x9d,0x8f,0x9d,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x55,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x22,0x03,0x0f,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x55,0x00,0x83,0xfe,0xab, +0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab, +0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00, +0x00,0x27,0x0f,0x53,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x83,0xfd,0xce,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00, +0x00,0x27,0x0f,0x51,0x02,0xad,0xfe,0xab,0x00,0x07,0x0f,0x50,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x81,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x83,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0x13,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00, +0x01,0x07,0x0a,0x6e,0x02,0xad,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x2a,0x01,0x2a,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0x13,0x02,0xab,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0x83,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f, +0x05,0x5a,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0xad,0xfd,0x7e,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0xfd,0x7e,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x2a, +0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xda,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x03,0xb1,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39, +0x00,0x3d,0x00,0x75,0xb9,0x00,0x3a,0x05,0x0a,0xb2,0x3b,0x3b,0x33,0xb8,0x05,0x0a,0xb3,0x32,0x1d,0x32,0x37,0xb8,0x05,0x0a,0xb7,0x36,0x32,0x36,0x32,0x36,0x3f,0x26,0x05,0xbb,0x05,0x0a,0x00,0x16,0x00,0x3c,0x04,0xfb,0xb5,0x2f,0x3b,0x01,0x3b,0x38,0x34,0xbb,0x04,0xfb,0x00,0x36,0x00,0x33,0x04,0xe6,0xb5,0x00,0x1d,0x31,0x03,0x11, +0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0x33,0xed,0x32,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14, +0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x13,0x33,0x15,0x23,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7, +0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xf7,0xb5,0xb5,0xfe,0xbe,0xb5,0xb5,0xa1,0xb5,0xb5,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a, +0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x44,0xb3,0xb3,0xb3,0x01,0xc1,0xb3,0x00,0x05,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x0d,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x8b,0xb1,0x2b,0x40,0xbb,0x05,0x0a,0x00,0x1b,0x00,0x00,0x05,0x0b,0xb4,0x0b,0x41,0x41,0x0b,0x49, +0xb8,0x05,0x0a,0xb2,0x48,0x48,0x45,0xb8,0x05,0x0a,0xb7,0x44,0x0b,0x44,0x0b,0x44,0x4d,0x34,0x13,0xbb,0x05,0x0a,0x00,0x24,0x00,0x4a,0x04,0xfb,0xb5,0x2f,0x49,0x01,0x49,0x46,0x42,0xbb,0x04,0xfb,0x00,0x44,0x00,0x41,0x04,0xe6,0xb5,0x0e,0x2b,0x3f,0x03,0x1f,0x31,0xb8,0x04,0xff,0xb2,0x38,0x1b,0x18,0xb8,0x04,0xfc,0xb7,0x1c,0x1f, +0x1f,0x2f,0x1f,0x02,0x1f,0x03,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0x33,0xed,0x32,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x11,0x33,0x2f,0x10,0xed,0x39,0xe6,0x32,0x31,0x30,0x01,0x16,0x16,0x33,0x33,0x15,0x23, +0x22,0x2e,0x02,0x27,0x36,0x36,0x27,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x13,0x33,0x15,0x23,0x04,0x57,0x06,0x74,0x68,0x1f, +0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x2b,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xf7,0xb5,0xb5,0xfe,0xbe,0xb5,0xb5,0xa1,0xb5,0xb5,0x01, +0x56,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0xb3,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x44,0xb3,0xb3,0xb3,0x01,0xc1,0xb3,0xff,0xff,0xff,0xba, +0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0x13,0x03,0x4a,0x03,0xba,0x02,0x26, +0x09,0x15,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x4e,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x5c,0x00,0xc0,0xfc,0xfa,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00, +0x00,0x07,0x0f,0x56,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0xa3,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad, +0x05,0x20,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x02, +0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xbb,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x06,0x38,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00, +0x00,0x07,0x0f,0x54,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0x04,0x02,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xbb,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad, +0x06,0x38,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x02, +0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x51,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00, +0x00,0x07,0x0f,0x51,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x10,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0e,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02, +0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0e,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0xb3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x90,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03, +0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xcb,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xcb,0x02,0x26,0x08,0xed,0x00,0x00, +0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xcb,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b, +0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x04,0x79,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9, +0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0xf4,0x04,0x79,0x02,0x26,0x08,0xef,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0xf4,0x02,0xaf,0x02,0x26,0x08,0xef,0x00,0x00, +0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xfb,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00,0x01,0x56,0x00,0x27,0x0f,0x50,0x01,0x9f,0x04,0x02,0x00,0x07,0x0f,0x51,0x01,0x9f,0xfe,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a, +0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x06,0x64,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x07,0x0f,0x57,0x01,0x9f,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x07,0xba,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c, +0x04,0x02,0x01,0x07,0x0f,0x57,0x00,0x72,0x05,0x58,0x00,0x0a,0xb4,0x01,0x20,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x05,0x63,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x01,0x07,0x0a,0x6d,0x01,0x9f,0xfd,0x87,0x00,0x0a,0xb4,0x01,0x20,0x22,0x01,0x22,0x00,0x11, +0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x06,0xb9,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0a,0x6d,0x00,0x9c,0xfe,0xdd,0x00,0x13,0x40,0x0a,0x02,0x2f,0x1c,0x01,0x1c,0x01,0x20,0x19,0x01,0x19,0x00,0x11,0x5d,0x35,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x51, +0x05,0xec,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0xc3,0x00,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0xc3,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xa5,0x05,0xec,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x06,0x0f,0x5c,0x17,0x00,0xff,0xff, +0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x06,0x0f,0x5c,0x17,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x04,0xbc,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x09,0x7e, +0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x52,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06, +0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xa6,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0x18,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x5c, +0x02,0x18,0x00,0x00,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x00,0x00,0x0a,0x00,0x15,0x40,0x09,0x03,0x91,0x08,0x00,0x05,0x05,0x01,0x7e,0x00,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0xd4,0xed,0x31,0x30,0x23,0x33,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0xe6,0xa8,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0xd3,0x1d,0xa0,0x14,0xc5, +0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x12,0xb7,0x08,0x91,0x03,0x0a,0x00,0x7e,0x0a,0x06,0x2f,0xd6,0xe1,0x00,0x2f,0xd4,0xed,0x31,0x30,0x37,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0xe6,0xb3,0x9f,0x42,0x38,0x33,0x3f,0xb2,0x35,0xbd,0xe2,0x14,0xa0,0x1d,0x01,0x08,0x00,0x00,0x01,0x01,0x9f, +0xfe,0x80,0x02,0x60,0x00,0x98,0x00,0x05,0x00,0x18,0xb9,0x00,0x01,0x01,0x2c,0xb5,0x04,0x00,0x91,0x05,0x22,0x03,0xb8,0x01,0x30,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0x9f,0xc1,0x9b,0x26,0x98,0xfd,0xe8,0x01,0x80,0x00,0x01,0x01,0xb3,0xfe,0x8a,0x02,0x4d,0x00,0x8b,0x00,0x05,0x00,0x18, +0xb9,0x00,0x01,0x01,0x2c,0xb5,0x04,0x00,0x95,0x05,0x22,0x03,0xb8,0x01,0x31,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0xb3,0x9a,0x8f,0x0b,0x8b,0xfd,0xff,0x01,0x76,0x00,0x01,0x00,0x14,0x00,0x8b,0x02,0xe8,0x05,0x30,0x00,0x1d,0x00,0x30,0x40,0x17,0x17,0xb1,0x0c,0x00,0xb1,0x05,0x0c,0x05, +0x0c,0x05,0x04,0x01,0x01,0x1f,0x11,0x04,0x0f,0xbe,0x14,0x00,0x04,0xbe,0x03,0x00,0x2f,0xed,0x32,0x2f,0xed,0x01,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x15,0x21,0x35,0x33,0x34,0x37,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x07,0x06,0x07,0x06,0x01,0x89,0x01,0x2f,0xfd,0x5c,0xd2,0x26,0x26,0x6e,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x50,0x20,0x1f,0x01,0x20,0x95,0x95,0x84,0x50,0x51,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x42,0x40,0x00,0x00,0x03,0x00,0x1c,0x00,0x00,0x04,0x2f,0x05,0x9a, +0x00,0x13,0x00,0x1f,0x00,0x27,0x00,0x84,0x40,0x0b,0x0c,0x19,0x10,0x06,0x0b,0x0d,0x06,0x4c,0x10,0x7d,0x1d,0xb8,0xff,0xf0,0x40,0x42,0x0b,0x0d,0x06,0x4c,0x1d,0x1d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x7d,0x25,0x08,0x0b,0x0c,0x06,0x4c,0x7f,0x25,0x01,0x25,0x25,0x29,0x00,0x29,0x40,0x0b,0x00,0x4d,0x21,0x17,0x17,0x15,0x19,0x7e,0x00, +0x04,0x00,0x02,0x02,0x00,0x0c,0x14,0x91,0x21,0x18,0x01,0x91,0x04,0x15,0x04,0x21,0x04,0x21,0x04,0x19,0x20,0x91,0x05,0x03,0x19,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x39,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x2f,0x32,0x2b,0x11,0x12,0x39,0x2f,0x5d, +0x2b,0xe9,0x2b,0x39,0x2f,0x2b,0xe9,0x2b,0x11,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x15,0x33,0x15,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0xbc,0xa0,0xa0,0x01,0x98,0xba,0xda,0x84,0x74,0x91,0xae,0xfe, +0xf8,0xc9,0xfa,0xfc,0xfc,0xe4,0x94,0xa3,0xfe,0xa6,0xc1,0xac,0x8a,0x9e,0xfe,0xed,0x01,0x4f,0x98,0x03,0xb3,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0xe4,0x02,0x9c,0xb5,0x98,0xb7,0x8c,0x7a,0xfe,0x02,0x66,0xfe,0x31,0x85,0x79,0xd1,0x00,0x00,0x02,0x00,0x1e,0xff,0xe8,0x05,0x61,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x41, +0x40,0x21,0x12,0x10,0x10,0x0e,0x7e,0x16,0x0d,0x0d,0x1b,0x17,0x0a,0x7e,0x09,0x07,0x07,0x05,0x09,0x0d,0x03,0x17,0x12,0x06,0x91,0x0f,0x0b,0x07,0x07,0x09,0x03,0x13,0x91,0x02,0x12,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x3f,0x01,0x2f,0x33,0x33,0x2f,0x10,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x32,0x31, +0x30,0x01,0x10,0x21,0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x01,0x20,0x11,0x35,0x21,0x15,0x10,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0x8c,0x8c,0xa8,0x02,0xdb,0xa8,0x8c,0x8c,0xfd,0xf1,0x01,0x67,0xfd,0x25,0x02,0x44,0xfd,0xa4,0x02,0x45,0x57,0x98,0x02,0x7e,0xfd,0x82,0x02,0x7e,0xfd,0x82,0x98, +0xfd,0xfb,0x01,0xaa,0x5b,0x4c,0xfe,0x47,0xff,0xff,0x00,0x18,0x00,0x00,0x04,0xef,0x05,0x9a,0x00,0x06,0x01,0xb0,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x70,0x03,0xb4,0x05,0xf8,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x1b,0x00,0x5e,0x00,0x1b,0x40,0x14,0x20,0x0e,0x30,0x0e,0x02,0x20,0x0d,0x30,0x0d,0x02,0x0f,0x0f, +0x1f,0x0f,0x02,0x0f,0x0c,0x1f,0x0c,0x02,0x00,0x5d,0x5d,0x5d,0x5d,0x00,0xff,0xff,0x00,0x60,0xfe,0xb5,0x03,0xdd,0x05,0x3d,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x3a,0xff,0xa3,0x00,0x0a,0xb4,0x02,0x4f,0x1c,0x01,0x1c,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x14,0xff,0xe8,0x02,0xbd,0x05,0x9a,0x00,0x14,0x00,0x75, +0x40,0x0d,0x79,0x09,0x01,0x76,0x09,0x01,0x76,0x01,0x01,0x13,0x13,0x11,0x05,0xb8,0xff,0xf0,0x40,0x18,0x0d,0x06,0x4d,0x05,0x05,0x00,0x08,0x0b,0x0d,0x06,0x4c,0x00,0x7e,0x0a,0x0e,0x0a,0x0c,0x0c,0x0a,0x18,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0x40,0x15,0x0b,0x06,0x4d,0x0a,0x0a,0x16,0x15, +0x14,0x0c,0x91,0x11,0x0d,0x0d,0x0f,0x03,0x06,0x06,0x08,0x91,0x03,0x13,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x2f,0x11,0x33,0x10,0xe9,0x2b,0x32,0x2f,0x2b,0x32,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11, +0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x02,0x2b,0xd8,0xb5,0x54,0x36,0x36,0x56,0xe3,0xd8,0xd8,0xa8,0x92,0x92,0x02,0x02,0xff,0xfe,0xe5,0x18,0xa6,0x27,0x01,0x81,0x81,0x98,0x02,0x81,0xfd,0x7f,0x98,0x00,0x00,0x02,0xff,0x3a,0xfe,0x1e,0x01,0xd4,0x05,0xd9,0x00,0x14,0x00,0x20,0x00,0x7a,0x40,0x28,0x1e,0x62,0x18,0x0a, +0x00,0x18,0x62,0xff,0x30,0x06,0x0a,0x12,0x12,0x11,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x0a,0x0e,0x0a,0x0c,0x0c,0x7f,0x0a,0x01,0x0a,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfe,0x40,0x19,0x0b,0x06,0x4d,0x0a,0x0a,0x22,0x21,0x1b,0x63,0x15,0x0f,0x14,0x0c,0x95,0x11, +0x0d,0x0d,0x0f,0x0f,0x06,0x06,0x08,0x95,0x03,0x1c,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x10,0xde,0xed,0x11,0x12,0x01,0x39,0x2f,0x2b,0x2b,0x5d,0x33,0x2f,0x11,0x33,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x10,0xc6,0x2b,0x01,0x10,0xe1,0x31,0x30,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11, +0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0x8a,0x8a,0xa4,0x8a,0x8a,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x01,0x9d,0x87,0x01,0xcc,0xfe,0x34,0x87,0x03,0x57,0x3c,0x2e, +0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0x00,0x02,0x00,0x5e,0xfe,0x96,0x06,0x3d,0x05,0xb2,0x00,0x1b,0x00,0x29,0x00,0x30,0x40,0x19,0x05,0x05,0x01,0x7e,0x25,0x1a,0x0b,0x0b,0x2b,0x1f,0x7d,0x13,0x1b,0x03,0x1c,0x91,0x16,0x04,0x22,0x91,0x10,0x13,0x03,0x91,0x08,0x00,0x2f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33, +0x33,0xed,0x32,0x2f,0x31,0x30,0x01,0x11,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x07,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x17,0x16,0x17,0x35,0x05,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x11,0x35,0x02,0x27,0x26,0x05,0x19,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0x0c,0x0d,0xa2,0xfe,0xf1,0xfe,0xf6, +0xfe,0xc1,0x01,0x45,0x01,0x19,0x01,0x02,0x9e,0x0b,0x0a,0xfe,0x54,0xc3,0xf4,0xed,0xbf,0xcc,0xeb,0x03,0x6f,0x72,0x05,0x9a,0xfa,0x9b,0xfe,0xf8,0x1d,0xa0,0x14,0xe2,0xbd,0xa0,0x11,0x10,0xcc,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xc8,0x0e,0x0f,0xcd,0x80,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x0e,0x01, +0x12,0x97,0x9b,0x00,0x00,0x02,0x00,0x60,0xfe,0x96,0x05,0x34,0x04,0x18,0x00,0x1d,0x00,0x2e,0x00,0x2c,0x40,0x17,0x27,0x83,0x12,0x02,0x02,0x1c,0x84,0x1e,0x1a,0x0a,0x1a,0x0f,0x23,0x95,0x16,0x10,0x2b,0x95,0x0e,0x16,0x00,0xec,0x05,0x00,0x2f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x2f,0xed,0x31,0x30, +0x05,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x26,0x26,0x35,0x35,0x23,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x10,0x03,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0xc2,0x3e,0x34,0x39,0x41,0x9f,0x5a,0x2d,0x28,0x04,0x72,0xee,0xc1,0x74,0x73,0x80, +0x80,0xd5,0xd3,0x60,0x04,0xa4,0xa4,0x52,0x53,0x7d,0x96,0x56,0x56,0x52,0x53,0x8b,0x89,0x55,0x56,0xd3,0x1d,0xa0,0x14,0x71,0x39,0x96,0x5f,0x79,0xc6,0x89,0x89,0xee,0xfd,0x9a,0x99,0xa6,0x8e,0xfc,0x35,0xfe,0xf8,0x02,0xa2,0x97,0x7d,0x55,0x56,0x6e,0x6e,0xc2,0xb1,0x67,0x66,0x63,0x64,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x04,0xc0, +0x05,0x9a,0x00,0x20,0x00,0x2b,0x00,0xb0,0x40,0x32,0x75,0x13,0x01,0x76,0x12,0x01,0x39,0x02,0x01,0x0e,0x1b,0x22,0x91,0x0b,0x08,0x08,0x0a,0x21,0x91,0x0f,0x03,0x01,0x0a,0x1b,0x09,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x28,0x7d,0x15,0x79,0x02,0x01,0x7a,0x01,0x01,0x02,0xb8,0xff,0xe8,0xb4, +0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x28,0x0b,0x0d,0x01,0x4c,0x01,0x1c,0x02,0x15,0x04,0x70,0x00,0x01,0x00,0x08,0x0d,0x06,0x4d,0x00,0x2d,0x22,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x0e,0x0d,0x09,0x7e,0x0a,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0c,0x06, +0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x33,0x33,0x2b,0x2b,0x2b,0x32,0x10,0xc6,0x2b,0x5d,0x17,0x32,0x2b,0x2b,0x5d,0x5d,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x00,0x2f,0x33,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x39,0x32,0x31,0x30,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11, +0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x04,0xc0,0xc8,0xf0,0x21,0x3e,0x41,0x4b,0x2f,0x8a,0xa8,0xa0,0xa0,0x01,0xac,0x5e,0x9f,0x75,0x42,0x2d,0x53,0x75,0x49,0x24,0x35,0x30,0x2f,0x1d,0xfd,0xb1,0xe4,0x3f,0x6b,0x4e,0x2c, +0x95,0x8d,0x01,0x92,0x38,0x4f,0x32,0x17,0xfd,0x9e,0x02,0x62,0x98,0x02,0xa0,0x2f,0x60,0x8f,0x60,0x4b,0x7d,0x62,0x45,0x13,0x04,0x10,0x29,0x38,0x47,0x2f,0x03,0x53,0xfd,0xf8,0x26,0x47,0x67,0x40,0x73,0x81,0x00,0x01,0x00,0x1c,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x18,0x00,0x3f,0x40,0x1f,0x00,0x00,0x1a,0x11,0x06,0x0a,0x84,0x0b, +0x0f,0x0b,0x0d,0x0d,0x0b,0x09,0x0c,0xec,0x06,0x0f,0x0f,0x0b,0x16,0x12,0x00,0x00,0x02,0x16,0x10,0x10,0x0f,0x0b,0x15,0x00,0x3f,0x3f,0x3f,0xcd,0x32,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x15,0x21,0x11, +0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0x01,0x16,0xfe,0xea,0xa4,0x8a,0x8a,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0x23,0x98,0xfe,0xb1,0x01,0x4f,0x98,0x02,0x19,0xd3,0x6c,0x79,0x0e,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x11, +0x00,0x19,0x00,0x68,0x40,0x34,0x18,0x10,0x14,0x11,0x11,0x00,0x0f,0x19,0x0e,0x14,0x14,0x07,0x04,0x01,0x00,0x06,0x7e,0x0c,0x09,0x07,0x07,0x0d,0x00,0x02,0x02,0x00,0x00,0x1b,0x0e,0x0d,0x0b,0x0b,0x0d,0x19,0x04,0x0a,0x91,0x0f,0x01,0x0b,0x0b,0x11,0x11,0x14,0x05,0x08,0x03,0x07,0x0d,0x03,0x07,0x12,0x00,0x3f,0x3f,0x12,0x17,0x39, +0x33,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x11,0x33,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x03,0x33,0x15,0x23,0x03,0x11,0x23,0x11,0x03,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13,0x01,0x16, +0x17,0x33,0x36,0x37,0x37,0x21,0x04,0x60,0x8b,0x7a,0xc9,0xff,0xa8,0xfa,0xc9,0x7c,0x86,0xbf,0x83,0x01,0xd0,0x8a,0xfe,0x64,0x06,0x1d,0x03,0x0a,0x1c,0x78,0xfe,0xc9,0x05,0x9a,0xfe,0xf7,0x98,0xfe,0x19,0xfd,0xee,0x02,0x0e,0x01,0xeb,0x98,0x01,0x09,0xfe,0xf7,0x01,0x09,0xfd,0x78,0x0c,0x4c,0x22,0x36,0xe7,0x00,0x00,0x02,0x00,0x0e, +0xfe,0x1e,0x03,0xd5,0x04,0x00,0x00,0x18,0x00,0x20,0x00,0x66,0x40,0x35,0x1f,0x17,0x18,0x18,0x00,0x20,0x16,0x1b,0x15,0x01,0x04,0x05,0x1b,0x0f,0x10,0x13,0x07,0x00,0x0a,0x0a,0x14,0x00,0x02,0x02,0x00,0x00,0x22,0x15,0x14,0x12,0x12,0x14,0x20,0x04,0x11,0x96,0x16,0x01,0x12,0x12,0x21,0x18,0x14,0x0f,0x1b,0x05,0x0f,0x0a,0x0a,0x0c, +0x95,0x07,0x1c,0x00,0x3f,0xed,0x32,0x2f,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x11,0x33,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x39,0x39,0x31,0x30,0x01,0x03,0x33,0x15,0x23,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32, +0x37,0x37,0x03,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x21,0x03,0xd5,0x8b,0x79,0xae,0xfe,0xe9,0x7e,0xe4,0x40,0x2b,0x35,0x2c,0x7c,0x3e,0x52,0xd3,0xae,0x79,0x88,0xb6,0x7a,0x01,0x6c,0x81,0xfe,0xae,0x05,0x10,0x06,0x05,0x0f,0x71,0xfe,0xf4,0x04,0x00,0xfe,0xa3,0x86,0xfd,0x3f,0xfe,0xc2,0x0d, +0x93,0x12,0x94,0xc2,0x02,0x1b,0x86,0x01,0x5d,0xfe,0xa3,0x01,0x5d,0xfc,0xec,0x0f,0x3f,0x18,0x34,0x01,0x33,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x06,0x07,0x72,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x78,0xfc,0xe6,0x00,0x1b, +0x40,0x14,0x01,0x0f,0x1c,0x1f,0x1c,0x02,0x3f,0x1c,0x6f,0x1c,0x70,0x1c,0x8f,0x1c,0xcf,0x1c,0xdf,0x1c,0x06,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x26,0x07,0x72,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xb5,0xfc,0xe6,0x00,0x1b,0x40,0x14,0x01,0x0f,0x1c,0x1f,0x1c,0x02,0x3f,0x1c, +0x6f,0x1c,0x70,0x1c,0x8f,0x1c,0xcf,0x1c,0xdf,0x1c,0x06,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x02,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,0x00,0x29,0xfe,0x96,0x03,0xf6,0x05,0x9a,0x02,0x26,0x02,0xb9,0x00,0x00,0x01,0x07,0x08,0x5c,0x01,0x78,0x00,0x00,0x00,0x09,0xb3,0x01,0x1a,0x1a, +0x06,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x1e,0xfe,0x96,0x03,0x29,0x04,0x00,0x02,0x26,0x02,0xba,0x00,0x00,0x01,0x07,0x08,0x5c,0x01,0x56,0x00,0x00,0x00,0x09,0xb3,0x01,0x1a,0x1a,0x06,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x1a,0xfe,0x96,0x04,0xda,0x05,0x9a,0x00,0x26,0x00,0x3b,0x00,0x00,0x00,0x07,0x08,0x5c,0x04,0x03, +0x00,0x00,0xff,0xff,0x00,0x1a,0xfe,0x96,0x03,0xc6,0x04,0x00,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x07,0x08,0x5c,0x02,0xef,0x00,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x00,0x1b,0x00,0x9b,0xb9,0x00,0x16,0xff,0xe0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0f,0x20,0x0b,0x0d,0x01,0x4c,0x08,0x20,0x0b,0x0d,0x01,0x4c,0x01, +0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x16,0x08,0x0c,0x00,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x00,0x4d,0x0a,0x10,0x0b,0x00,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x00,0x4d,0x01,0x08,0x0c,0x00,0x4d,0x0a,0x18,0x0d,0x1b,0x04,0x0e,0x19,0x19,0x17,0x00,0x10,0x0b,0x00,0x4d,0x00,0x00,0x1d,0x0b,0x0b,0x0e,0x09,0xb8, +0xff,0xf0,0x40,0x16,0x0b,0x00,0x4d,0x09,0x1b,0x04,0x0b,0x91,0x18,0x12,0x2f,0x0c,0x01,0x0c,0x0c,0x08,0x16,0x0f,0x03,0x01,0x08,0x12,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0xc6,0x33,0x2f,0x11,0x33,0x2f,0x2b,0xc6,0x33,0x2f,0x11,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b, +0x2b,0x2b,0x2b,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x21,0x35,0x21,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x04,0x9a,0xcd,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xb2,0xfe,0x66,0x01,0x94,0xfe,0x7a,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe, +0x71,0x01,0x8b,0xfe,0x6d,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0x8d,0x98,0x02,0x75,0xfe,0x08,0x32,0x32,0x42,0x26,0x01,0xf4,0xfd,0x8b,0x98,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x19,0x00,0x4e,0x40,0x2f,0x0d,0x0a,0x18,0x01,0x04,0x02,0x09,0x02,0x00,0x17,0x09,0x0c,0x0b,0x0e,0x13,0x0d,0x19,0x96, +0x0a,0x06,0x0f,0x00,0x1f,0x00,0x4f,0x00,0x5f,0x00,0x04,0x2f,0x00,0x3f,0x00,0x6f,0x00,0x7f,0x00,0x04,0x00,0x00,0x03,0x0f,0x16,0x15,0x08,0x03,0x0f,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x71,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x13,0x21,0x01,0x33,0x13,0x16, +0x17,0x33,0x01,0x33,0x01,0x21,0x15,0x21,0x01,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x21,0x28,0x01,0x21,0xfe,0xe0,0xbf,0xc6,0x16,0x15,0x04,0x01,0x00,0xb5,0xfe,0xd4,0x01,0x1e,0xfe,0xe3,0x01,0x25,0xbf,0xc9,0x13,0x1a,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x31,0xfe,0xdd,0x02,0x3d,0x01,0xc3,0xfe,0xa2,0x27,0x29,0x01,0xae, +0xfe,0x3d,0x86,0xfe,0x49,0x01,0x4c,0x1f,0x2f,0x09,0x45,0xfe,0xb4,0x01,0xb7,0x00,0xff,0xff,0x00,0x70,0xff,0xe8,0x03,0xf4,0x05,0xb2,0x02,0x06,0x04,0xbf,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x04,0x19,0x02,0x06,0x01,0x31,0x00,0x00,0xff,0xff,0x00,0x10,0xfe,0x96,0x04,0xa4,0x05,0x9a,0x02,0x26,0x01,0xf2,0x00,0x00, +0x01,0x07,0x04,0x80,0x03,0xbe,0x00,0x00,0x00,0x09,0xb3,0x01,0x1d,0x1d,0x01,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x10,0xfe,0x96,0x03,0x92,0x04,0x00,0x02,0x26,0x02,0x12,0x00,0x00,0x01,0x07,0x04,0x80,0x02,0xac,0x00,0x00,0x00,0x09,0xb3,0x01,0x19,0x19,0x01,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x3e,0x04,0xc2,0x03,0x75, +0x06,0x0a,0x00,0x26,0x00,0xd9,0x00,0x00,0x00,0x07,0x00,0x8e,0x01,0x69,0x00,0x00,0xff,0xff,0x00,0x3f,0x04,0xc2,0x03,0x75,0x06,0x0a,0x00,0x27,0x00,0xd9,0x01,0x3b,0x00,0x00,0x00,0x06,0x00,0x43,0xed,0x00,0xff,0xff,0x00,0x3e,0x03,0xe8,0x03,0x68,0x05,0x30,0x00,0x26,0x00,0xd9,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x91,0xff,0x26, +0x00,0x0a,0xb3,0x01,0x06,0x06,0x02,0x00,0x10,0x3c,0x11,0x35,0xff,0xff,0x00,0x3f,0x03,0xe8,0x03,0x68,0x05,0x30,0x00,0x27,0x00,0xd9,0x01,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xb8,0xff,0x26,0x00,0x0a,0xb3,0x01,0x07,0x07,0x02,0x00,0x10,0x3c,0x11,0x35,0xff,0xff,0x00,0x3f,0x04,0x83,0x03,0xd0,0x05,0xcb,0x00,0x26,0x00,0x43, +0xed,0xc1,0x00,0x27,0x00,0x8e,0x00,0xbd,0xff,0xc1,0x00,0x07,0x00,0x43,0x01,0xf9,0xff,0xc1,0xff,0xff,0x00,0x3f,0x04,0x83,0x03,0xd0,0x05,0xcb,0x00,0x26,0x00,0x8e,0xb8,0xc1,0x00,0x27,0x00,0x43,0x00,0xf3,0xff,0xc1,0x00,0x07,0x00,0x8e,0x01,0xc4,0xff,0xc1,0xff,0xff,0x00,0x66,0xfd,0xfe,0x01,0xa8,0x00,0x2c,0x00,0x07,0x06,0x79, +0x00,0x00,0xfb,0x64,0x00,0x01,0x00,0x77,0x04,0x09,0x02,0x30,0x06,0x83,0x00,0x06,0x00,0x0d,0xb3,0x00,0x01,0x03,0x00,0x00,0x2f,0xce,0x01,0x2f,0xcd,0x31,0x30,0x01,0x25,0x35,0x25,0x15,0x05,0x05,0x02,0x30,0xfe,0x47,0x01,0xb9,0xfe,0xb6,0x01,0x4a,0x04,0x09,0xdd,0xc0,0xdd,0x7c,0xc1,0xc1,0x00,0x02,0x00,0xdb,0xfe,0x05,0x04,0x57, +0x00,0x1b,0x00,0x06,0x00,0x0d,0x00,0x2c,0x40,0x17,0x07,0x0a,0x05,0x40,0x06,0x80,0x0a,0x01,0x0a,0x80,0x30,0x09,0x40,0x09,0x02,0x09,0x09,0x03,0xc0,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x1a,0xce,0x33,0x2f,0x5d,0x1a,0xcd,0x5d,0x01,0x2f,0x1a,0xcd,0x2f,0xcc,0x31,0x30,0x13,0x37,0x27,0x35,0x05,0x15,0x05,0x01,0x03,0x23,0x03,0x33, +0x17,0x37,0xdb,0xc8,0xc8,0x01,0x37,0xfe,0xc9,0x03,0x7c,0xab,0xc0,0xab,0x7c,0x8f,0x8f,0xfe,0x81,0x8f,0x8f,0x7c,0xab,0xc0,0xab,0x01,0x94,0xfe,0xc9,0x01,0x37,0xc8,0xc8,0x00,0x00,0x04,0x00,0x35,0xff,0xf5,0x05,0xae,0x05,0x9a,0x00,0x07,0x00,0x0a,0x00,0x40,0x00,0x44,0x00,0x8e,0x40,0x0f,0x08,0x02,0x01,0x09,0x01,0x0a,0x03,0x04, +0x09,0x04,0x2c,0x13,0x3b,0x25,0x27,0xb8,0x01,0x0e,0x40,0x0c,0x0f,0x22,0x3f,0x22,0x5f,0x22,0x6f,0x22,0x04,0x22,0x0b,0x10,0xb8,0x01,0x0e,0xb3,0x3b,0x02,0x08,0x03,0xb8,0x01,0x0e,0xb7,0x0a,0x0a,0x06,0x05,0x43,0x44,0x09,0x06,0xbc,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x05,0x01,0x0a,0xb3,0x41,0x43,0x0b,0x2c,0xb8,0x01,0x0c,0xb2, +0x1d,0x25,0x36,0xb8,0x01,0x0c,0x40,0x09,0x13,0x13,0x46,0x0a,0x08,0x05,0x00,0x00,0x05,0x2f,0x33,0x2f,0x12,0x39,0x39,0x11,0x33,0x2f,0xed,0x32,0xd4,0xed,0x33,0x2f,0x2f,0x00,0x3f,0x3f,0x3f,0x33,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x33,0x32,0x2f,0xed,0x32,0x2f,0x5d,0xed,0x32,0x12,0x39,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0, +0x10,0x87,0xc0,0xc0,0x01,0x23,0x27,0x21,0x07,0x23,0x01,0x33,0x13,0x03,0x03,0x01,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x01,0x01,0x23,0x01,0x02,0xd3,0x83, +0x49,0xfe,0xf7,0x46,0x83,0x01,0x17,0x6f,0x23,0x5d,0x5a,0x02,0xbe,0x17,0x36,0x37,0x34,0x15,0x3b,0x46,0x17,0x29,0x37,0x20,0x26,0x42,0x32,0x1c,0x2d,0x49,0x5d,0x30,0x6a,0x3e,0x59,0x57,0x18,0x2e,0x24,0x16,0x13,0x24,0x34,0x20,0x24,0x46,0x37,0x21,0x29,0x46,0x5e,0x35,0x1a,0x38,0x35,0x2f,0x11,0x01,0x4d,0xfc,0xa6,0x90,0x03,0x5b, +0x02,0xc0,0xc2,0xc2,0x02,0xd9,0xfe,0x59,0x01,0x01,0xfe,0xff,0xfc,0xc8,0x14,0x1f,0x16,0x0c,0x2d,0x2b,0x17,0x23,0x1f,0x1d,0x10,0x14,0x27,0x32,0x3f,0x2b,0x35,0x4c,0x32,0x18,0x20,0x8b,0x3b,0x09,0x14,0x20,0x17,0x15,0x21,0x1d,0x1c,0x10,0x13,0x2b,0x35,0x40,0x29,0x38,0x4f,0x33,0x17,0x07,0x0d,0x12,0x0b,0x05,0x74,0xfa,0x66,0x05, +0x9a,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x03,0x0c,0x04,0x01,0x00,0x09,0x00,0x2d,0x40,0x16,0x07,0x84,0x06,0x02,0x06,0x03,0x06,0x03,0x06,0x0b,0x00,0x02,0x95,0x05,0x05,0x06,0x01,0x95,0x08,0x15,0x06,0x0f,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x37,0x21,0x11, +0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x48,0x02,0x21,0xfe,0x34,0x01,0xcc,0xa3,0xfd,0x3c,0x8a,0x01,0x5d,0x8c,0x01,0x8e,0xfb,0xff,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x06,0x07,0x72,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x15,0x00,0x86,0xb9,0x00,0x15,0xff,0xf0,0xb3,0x10,0x06, +0x4d,0x15,0xb8,0xff,0xf0,0xb4,0x0b,0x0d,0x06,0x4c,0x15,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x15,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x15,0xb8,0xff,0xc0,0x40,0x32,0x0a,0x1f,0x48,0x15,0x15,0x17,0x01,0x0e,0x11,0x11,0x10,0x0c,0x14,0x7e,0x01,0x07,0x03,0x03,0x09,0x05,0x01,0x13,0x02,0x91,0x05,0x10,0x05,0x0f,0x06,0x91,0x09,0x0c, +0x09,0x2f,0x09,0x6f,0x09,0x7f,0x09,0x03,0x05,0x09,0x05,0x09,0x0a,0x03,0x14,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x32,0x32,0x2f,0x33,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x21,0x21, +0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x21,0x03,0xa4,0xfd,0x18,0xa0,0xa0,0xa0,0xa0,0xa8,0x01,0x2e,0xfe,0xd2,0x01,0x2e,0xfe,0xd2,0x02,0x40,0x01,0xda,0x98,0x9e,0x98,0x01,0xf2,0xfe,0x0e,0x98,0x9e,0x98,0xfe,0xbe,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x36,0x05,0xec, +0x00,0x13,0x00,0x51,0x40,0x2d,0x08,0x03,0x03,0x01,0x0e,0x12,0x12,0x00,0x84,0x09,0x05,0x01,0x0f,0x07,0x96,0x08,0x0c,0x08,0x13,0x03,0x96,0x04,0x10,0x04,0x0f,0x08,0x1f,0x08,0x3f,0x08,0x03,0x6f,0x04,0x8f,0x04,0x02,0x08,0x04,0x08,0x04,0x01,0x0a,0x00,0x01,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10, +0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x21,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x01,0x77,0xa4,0xbf,0xbf,0xbf,0xbf,0xa4,0xbf,0xbf,0xbf,0xbf,0x01,0xe1,0x86,0x92,0x86,0x02,0x6d,0xfd,0x93,0x86,0x92, +0x86,0x00,0xff,0xff,0x00,0x27,0x00,0x00,0x03,0xf9,0x05,0x9a,0x00,0x26,0x00,0x2f,0x55,0x00,0x00,0x07,0x00,0xd8,0x00,0x04,0xfd,0x66,0x00,0x02,0x00,0x1c,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x51,0x40,0x29,0x12,0x12,0x14,0x0b,0x7d,0x18,0x18,0x1c,0x02,0x10,0x14,0x14,0x00,0x01,0x7e,0x02,0x06,0x02,0x04,0x04, +0x02,0x00,0x91,0x14,0x13,0x03,0x91,0x06,0x10,0x06,0x14,0x06,0x14,0x06,0x02,0x0f,0x91,0x07,0x03,0x02,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x23, +0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x15,0x21,0x15,0x21,0x15,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xa0,0xa0,0x01,0x8a,0xe6,0xfd,0xfe,0xe7,0xef,0xbd,0x01,0x24,0xfe,0xdc,0xb0,0xae,0xb7,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x03,0x8a,0x98,0x01,0x78,0xe0,0xcc,0xcc,0xfe,0xfc,0x02,0xe4,0xe0,0x98,0xd4,0x9f, +0x91,0x01,0x1c,0x00,0xff,0xff,0x00,0xbc,0xfe,0x96,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x0a,0xbb,0x01,0xa2,0x00,0x00,0x00,0x09,0xb3,0x02,0x29,0x29,0x09,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xb5,0x03,0x95,0x05,0x3d,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x03,0xff,0xa3, +0x00,0x0a,0xb4,0x02,0x4f,0x1f,0x01,0x1f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xb5,0xff,0x12,0x02,0xd7,0x05,0x9a,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x04,0x96,0x01,0x45,0x00,0x00,0x00,0x0a,0xb4,0x01,0x4f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xbc,0xfe,0x80,0x05,0xb2,0x05,0x9a,0x02,0x06,0x02,0xc1,0x00,0x00, +0xff,0xff,0x00,0xa6,0xfe,0x8a,0x04,0x92,0x05,0xec,0x00,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x0a,0xbe,0x02,0x45,0x00,0x00,0x00,0x09,0xb3,0x01,0x12,0x12,0x00,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x80,0x04,0xdd,0x05,0x9a,0x00,0x26,0x00,0x2e,0x00,0x00,0x00,0x07,0x0a,0xbd,0x02,0x7d,0x00,0x00,0xff,0xff,0x00,0xa6, +0xfe,0x8a,0x04,0x0c,0x05,0xec,0x00,0x26,0x00,0x4e,0x00,0x00,0x00,0x07,0x0a,0xbe,0x01,0xbf,0x00,0x00,0xff,0xff,0x00,0x21,0xfe,0x80,0x04,0xb6,0x05,0x9a,0x00,0x26,0x00,0x3d,0x00,0x00,0x00,0x07,0x0a,0xbd,0x02,0x56,0x00,0x00,0xff,0xff,0x00,0x21,0xfe,0x8b,0x03,0xbd,0x04,0x00,0x00,0x26,0x00,0x5d,0x00,0x00,0x00,0x07,0x0a,0xbe, +0x01,0x70,0x00,0x01,0x00,0x02,0x00,0x4b,0x00,0x00,0x04,0x3a,0x04,0x23,0x00,0x21,0x00,0x2d,0x00,0x5c,0x40,0x2e,0x0a,0xef,0x1c,0x1f,0x1b,0x00,0x1b,0x0f,0x2b,0x28,0x1a,0x13,0x13,0x19,0x22,0x22,0x00,0x18,0x19,0x19,0x2f,0x28,0xef,0x00,0x1e,0x1e,0x00,0x1f,0x2b,0x1e,0x25,0x1e,0x1c,0x0f,0x05,0x1d,0x1d,0x13,0x1b,0x15,0x18,0x0f, +0x25,0x95,0x05,0x10,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x13,0x16,0x16, +0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x23,0x01,0x07,0x27,0x37,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x95,0x26,0x41,0x53,0x2d,0x2c,0x52,0x3e,0x25,0x1d,0x37,0x50,0x32,0x9f,0x14,0x18,0x07,0x04,0x05,0x10,0x0b,0x01,0x10,0xad,0xfe,0x68,0x9a,0xfe,0xf9,0x7a,0x3c,0x7b,0x15,0x1c,0x01,0x31,0x26, +0x24,0x1e,0x31,0x0f,0x10,0x3f,0x3b,0x03,0x3f,0x3c,0x56,0x37,0x1b,0x1a,0x33,0x4d,0x32,0x31,0x4f,0x43,0x3a,0x1d,0xfe,0xd2,0x26,0x42,0x1e,0x26,0x46,0x1f,0x02,0xec,0xfc,0x00,0x01,0xf6,0x41,0x7a,0x3e,0x31,0x68,0x43,0x24,0x2f,0x2f,0x35,0x24,0x3f,0x23,0x23,0x46,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x07, +0x00,0x22,0x40,0x10,0x07,0x03,0x7e,0x04,0x01,0x01,0x04,0x02,0x91,0x07,0x07,0x04,0x05,0x03,0x04,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0xfa,0xfd,0x6a,0xa8,0xa8,0x03,0x25,0x97,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x00,0x00,0x01,0x00,0xa6, +0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x07,0x00,0x22,0x40,0x10,0x07,0x03,0x84,0x04,0x00,0x00,0x04,0x02,0x95,0x07,0x07,0x04,0x05,0x0f,0x04,0x15,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0x04,0xfe,0x46,0xa4,0xa4,0x02,0x5c,0x8b,0xfe,0x2f,0x04, +0x00,0xfe,0x5c,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x38,0x04,0x18,0x00,0x15,0x00,0x1f,0x00,0x35,0xb9,0x00,0x1f,0x01,0x2e,0x40,0x18,0x0e,0x07,0x0e,0x07,0x04,0x13,0x83,0x1a,0x1a,0x21,0x09,0x83,0x04,0x1d,0x95,0x10,0x10,0x07,0x0f,0x16,0x0d,0x95,0x01,0x16,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f, +0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x00,0x35,0x10,0x37,0x33,0x06,0x11,0x14,0x16,0x33,0x33,0x11,0x10,0x21,0x32,0x12,0x15,0x14,0x00,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x03,0x36,0xd2,0xec,0xfe,0xe8,0xd2,0xc2,0xec,0xbf,0x9b,0x1e,0x01,0x12,0xbc,0xea,0xfe,0xe7,0xfe,0xf5,0x22,0x98,0xc2, +0x93,0x67,0x82,0x18,0x01,0x20,0xf6,0x01,0x3b,0xc7,0xd8,0xfe,0xd2,0xb8,0xce,0x02,0x95,0x01,0x0f,0xfe,0xd7,0xfb,0xe9,0xfe,0xdd,0x8c,0xd3,0xb5,0xb4,0xdc,0x81,0x00,0x00,0x02,0x00,0xaf,0x03,0xf9,0x02,0x48,0x05,0xf5,0x00,0x03,0x00,0x0f,0x00,0x22,0xb3,0x0d,0xc0,0x07,0x01,0xb8,0x01,0x32,0x40,0x09,0x02,0x0a,0xc1,0x04,0x04,0x02, +0x03,0x03,0x02,0x00,0x2f,0x33,0x2f,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x48,0x6d,0xc9,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x05,0xf5,0xfe,0x04,0x01,0xfc,0xfe,0xa0,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x00,0x00,0x02, +0x00,0xaf,0x03,0xfd,0x02,0xa0,0x05,0xee,0x00,0x13,0x00,0x17,0x00,0x28,0x40,0x14,0x14,0x14,0x16,0x16,0x0c,0xc0,0x02,0x07,0xc1,0x0f,0x11,0x1f,0x11,0x02,0x11,0x11,0x15,0x17,0x17,0x15,0x00,0x2f,0x33,0x2f,0x11,0x33,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x33,0x2f,0x33,0x2f,0x31,0x30,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02, +0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x01,0x27,0x01,0xcc,0x1d,0x0f,0x19,0x24,0x15,0x15,0x24,0x1b,0x10,0x11,0x1b,0x25,0x13,0x12,0x24,0x01,0xc6,0xfe,0x99,0x4d,0x01,0x67,0x05,0x47,0x1d,0x29,0x13,0x24,0x1a,0x10,0x11,0x1c,0x23,0x13,0x14,0x23,0x1a,0x10,0x0f,0x2c,0xfe,0x98,0x4d,0x01,0x68,0x00,0x00,0x02,0x00,0xaf,0x04,0x2b, +0x02,0xab,0x05,0xc4,0x00,0x03,0x00,0x0f,0x00,0x27,0x40,0x14,0x0a,0xc0,0x04,0x04,0x01,0x00,0x00,0x01,0x07,0xc1,0x0d,0x40,0x09,0x0e,0x48,0x0d,0x0d,0x02,0xe7,0x01,0x00,0x2f,0xed,0x33,0x2f,0x2b,0xed,0x01,0x2f,0x33,0x2f,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x25,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22, +0x26,0x02,0xab,0xfe,0x04,0x01,0xfc,0xfe,0xa0,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x04,0x2b,0x6d,0xc9,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x00,0x01,0x00,0x75,0x04,0xfe,0x03,0x69,0x06,0x58,0x00,0x05,0x00,0x18,0x40,0x0a,0x04,0xea,0x01,0x01,0x02,0x05,0x05,0x03,0xbe,0x02,0x00,0x2f,0xed,0x33,0x2f,0x01,0x2f,0x33,0x2f,0xed, +0x31,0x30,0x01,0x11,0x21,0x35,0x21,0x35,0x03,0x69,0xfd,0x0c,0x02,0x5f,0x06,0x58,0xfe,0xa6,0x95,0xc5,0x00,0x01,0x00,0x75,0x04,0x7c,0x04,0x54,0x06,0x58,0x00,0x09,0x00,0x25,0x40,0x11,0x09,0xea,0x00,0x00,0x04,0x07,0x07,0x03,0xea,0x04,0x08,0x02,0xbe,0x05,0x05,0x00,0x04,0x00,0x2f,0x33,0x33,0x2f,0xed,0x32,0x01,0x2f,0xed,0x33, +0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x02,0x23,0xfe,0xe7,0x95,0x03,0xdf,0xfe,0x64,0x04,0x7d,0x01,0x46,0xfe,0xb9,0x01,0xdc,0x95,0xfe,0xba,0x00,0x00,0x01,0x00,0x75,0x04,0x7c,0x04,0x54,0x06,0x58,0x00,0x09,0x00,0x27,0x40,0x12,0x00,0xea,0x09,0x09,0x05,0x02,0x02,0x06,0xea,0x05, +0x01,0x07,0xbe,0x04,0x09,0x05,0x05,0x04,0x00,0x2f,0x33,0x2f,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x33,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x11,0x02,0xb8,0x01,0x9c,0xfc,0x21,0x95,0x01,0x19,0x06,0x57,0xfe,0xba,0x95,0x01,0xdc,0xfe,0xb9,0x01,0x46,0x00,0x00,0x01,0x00,0x00,0xfd,0xff, +0x03,0x57,0x02,0x5e,0x00,0x23,0x00,0x34,0xb1,0x05,0x1f,0xb8,0x05,0x0a,0x40,0x09,0x16,0x1f,0x05,0x02,0x2f,0x1b,0x01,0x1b,0x11,0xb8,0x04,0xfb,0xb6,0x1f,0x0b,0x2f,0x0b,0x02,0x0b,0x00,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x31,0x30,0x25,0x15,0x23,0x22, +0x26,0x27,0x07,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x03,0x57,0x16,0x3f,0x4a,0x19,0x05,0x44,0x78,0xa5,0x61,0x33,0x6c,0x39,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1d,0x2c,0x0e,0x06,0x1c,0x30,0x49,0x99,0xa7,0x24,0x21,0x01, +0x8c,0xd5,0x8e,0x48,0x16,0x17,0xa5,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x4b,0xa0,0x51,0x23,0x34,0x22,0x10,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0x07,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00, +0x00,0x07,0x0f,0x53,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0xb9,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xaf,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57, +0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x90,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xf2,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xe1,0x04,0x31,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x09,0xf7,0x65, +0x00,0x0a,0xb4,0x01,0x2f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf2,0xfe,0x00,0x00,0x06,0x0f,0x50,0xce,0x05,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0x07,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9a, +0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xbc,0x02,0x26,0x0b,0x0c, +0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x02,0x06,0x09,0x28,0x00,0x00,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x03,0xd7,0x02,0x06,0x08,0xf3,0x00,0x00,0x00,0x03,0x00,0x79,0xfe,0x1e,0x06,0xf3,0x06,0x02,0x00,0x13,0x00,0x37,0x00,0x3b,0x00,0x1f,0x40,0x0e,0x28,0x23, +0x37,0x0a,0x00,0x23,0x00,0x23,0x00,0x38,0x3a,0x00,0x38,0x1b,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xd6,0xcd,0x11,0x33,0x31,0x30,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x13,0x26,0x26,0x35,0x34,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x1e,0x02,0x15, +0x14,0x0e,0x04,0x15,0x14,0x16,0x17,0x13,0x09,0x02,0x03,0x91,0x16,0x26,0x1c,0x10,0x11,0x1d,0x25,0x15,0x16,0x26,0x1d,0x10,0x12,0x1d,0x26,0x5b,0x08,0x13,0x2b,0x40,0x4b,0x40,0x2b,0x34,0x57,0x72,0x3e,0x87,0x7c,0x67,0x89,0x24,0x40,0x30,0x1c,0x2a,0x3e,0x49,0x3e,0x2a,0x0c,0x0b,0x78,0xfc,0xc3,0x03,0x3d,0x03,0x3d,0x89,0x12,0x1d, +0x25,0x14,0x15,0x26,0x1d,0x11,0x12,0x1d,0x26,0x14,0x16,0x26,0x1c,0x10,0x01,0x63,0x15,0x3d,0x25,0x2d,0x49,0x45,0x44,0x4f,0x5f,0x3d,0x40,0x60,0x40,0x21,0x54,0x9e,0x6d,0x12,0x24,0x35,0x22,0x2e,0x4d,0x46,0x43,0x4a,0x54,0x34,0x22,0x43,0x15,0xfd,0x44,0x03,0xf2,0x03,0xf2,0xfc,0x0e,0x00,0x00,0x01,0x00,0x3f,0x04,0xc1,0x03,0x26, +0x05,0xba,0x00,0x17,0x00,0x1e,0x40,0x0e,0x0c,0x00,0x0d,0x07,0x96,0x12,0x12,0x17,0x96,0x0c,0x0f,0x02,0x01,0x02,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x01,0x2f,0xc4,0xcd,0x31,0x30,0x01,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x03,0x26,0x29,0x3f,0x88,0x81,0x71,0x29, +0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x38,0x7e,0x7f,0x7d,0x37,0x05,0x40,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0x00,0xff,0xff,0x00,0x5e,0xff,0x3f,0x06,0x25,0x05,0xb2,0x02,0x06,0x00,0x34,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x29,0x04,0x10,0x04,0x18,0x02,0x06,0x00,0x54,0x00,0x00, +0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x02,0x06,0x00,0x3a,0x00,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x02,0x06,0x00,0x5a,0x00,0x00,0x00,0x01,0x00,0xb0,0xff,0xe8,0x04,0x9d,0x05,0xb1,0x00,0x36,0x00,0x57,0x40,0x2e,0x29,0x7d,0x16,0x2f,0x7d,0x0b,0x2c,0x11,0x16,0x01,0x11,0x16,0x0b,0x0b,0x16,0x11, +0x01,0x04,0x38,0x1d,0x7e,0x1e,0x2c,0x10,0x11,0x11,0x10,0x92,0x59,0x11,0x11,0x06,0x24,0x34,0x06,0x91,0x59,0x34,0x13,0x24,0x19,0x91,0x59,0x24,0x04,0x1e,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10, +0xe1,0x10,0xe1,0x31,0x30,0x25,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x04,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x01,0xf6,0x17,0x3a,0x3e,0x40,0x1d,0x3c,0x62,0x46,0x27,0x37,0x71, +0xab,0x74,0x4c,0x7a,0x56,0x2f,0x84,0x77,0x8e,0x90,0xa8,0x4f,0x83,0xa8,0x59,0x5e,0x99,0x6d,0x3b,0x9c,0x98,0x01,0xaf,0x43,0x74,0x9e,0x5c,0x56,0x72,0x0d,0xad,0x0c,0x15,0x11,0x09,0x21,0x40,0x61,0x40,0x41,0x6e,0x54,0x34,0x07,0x7a,0x09,0x2b,0x45,0x61,0x3f,0x66,0x63,0x8d,0x9d,0xfc,0x0f,0x04,0x09,0x79,0xa2,0x63,0x2a,0x2f,0x57, +0x78,0x4a,0x86,0xae,0x29,0x05,0x47,0xfe,0xb3,0x5b,0x93,0x66,0x37,0x16,0xff,0xff,0xfc,0x8c,0x04,0xa7,0xff,0x4c,0x07,0x68,0x00,0x07,0x00,0x0d,0xfc,0x40,0x01,0xce,0xff,0xff,0x00,0x4a,0xff,0xec,0x06,0xd9,0x05,0xb0,0x00,0x26,0x00,0xf0,0xfa,0x00,0x00,0x27,0x00,0xbc,0x03,0x03,0x00,0x00,0x01,0x07,0x00,0xf2,0x04,0x4b,0xfd,0xb9, +0x00,0x07,0xb2,0x02,0x30,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x8d,0xff,0xec,0x06,0xd7,0x05,0xae,0x00,0x26,0x00,0xf1,0x25,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x00,0xf2,0x04,0x49,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x43,0x2d,0x00,0x3f,0x35,0x00,0x00,0x01,0x00,0x96,0x01,0x08,0x06,0x00,0x03,0xa4,0x00,0x09, +0x00,0x1b,0x40,0x0c,0x09,0x08,0x01,0x07,0x03,0x04,0x02,0x05,0x04,0x00,0xbe,0x09,0x00,0x2f,0xed,0x01,0x2f,0x2f,0xcd,0x11,0x17,0x39,0x2f,0x31,0x30,0x01,0x21,0x17,0x15,0x01,0x35,0x01,0x15,0x07,0x21,0x06,0x00,0xfb,0x5a,0x7b,0xfe,0xc1,0x01,0x3f,0x7d,0x04,0xa8,0x02,0x12,0x76,0x94,0x01,0x4c,0x04,0x01,0x4c,0x94,0x78,0x00,0x01, +0x00,0x96,0xff,0xf4,0x03,0x31,0x05,0x5e,0x00,0x09,0x00,0x10,0xb6,0x08,0x01,0x07,0x03,0x03,0x04,0x00,0x00,0x2f,0x2f,0xcd,0x17,0x39,0x31,0x30,0x05,0x11,0x07,0x23,0x01,0x33,0x01,0x23,0x27,0x11,0x01,0xa0,0x77,0x93,0x01,0x4b,0x04,0x01,0x4c,0x93,0x79,0x0c,0x04,0xa4,0x79,0x01,0x3f,0xfe,0xc1,0x7b,0xfb,0x5a,0x00,0x01,0x00,0xe7, +0x01,0x08,0x06,0x52,0x03,0xa4,0x00,0x09,0x00,0x17,0x40,0x0a,0x01,0x02,0x08,0x03,0x07,0x05,0x00,0x09,0xbe,0x00,0x00,0x2f,0xed,0x01,0x2f,0x2f,0xcd,0x17,0x39,0x31,0x30,0x13,0x21,0x27,0x35,0x01,0x15,0x01,0x35,0x37,0x21,0xe7,0x04,0xa6,0x7b,0x01,0x40,0xfe,0xc0,0x79,0xfb,0x5c,0x02,0x98,0x78,0x94,0xfe,0xb4,0x04,0xfe,0xb4,0x94, +0x76,0x00,0x00,0x01,0x00,0x96,0xff,0xf6,0x03,0x31,0x05,0x60,0x00,0x09,0x00,0x10,0xb6,0x09,0x01,0x02,0x08,0x03,0x06,0x05,0x00,0x2f,0xcd,0x17,0x39,0x2f,0x31,0x30,0x01,0x11,0x37,0x33,0x01,0x23,0x01,0x33,0x17,0x11,0x02,0x25,0x79,0x93,0xfe,0xb4,0x04,0xfe,0xb5,0x93,0x77,0x05,0x60,0xfb,0x58,0x7d,0xfe,0xc1,0x01,0x3f,0x7b,0x04, +0xa6,0x00,0x00,0x01,0x00,0x96,0x01,0x08,0x06,0x50,0x03,0xa4,0x00,0x0f,0x00,0x1f,0x40,0x0f,0x01,0x0a,0x0b,0x03,0x00,0x0e,0x09,0x02,0x08,0x03,0x03,0x06,0x02,0xbe,0x09,0x00,0x2f,0xed,0x01,0x2f,0xcd,0x17,0x39,0x2f,0xcd,0x17,0x39,0x31,0x30,0x01,0x37,0x21,0x17,0x15,0x01,0x35,0x01,0x15,0x07,0x21,0x27,0x35,0x01,0x15,0x01,0x05, +0x10,0x79,0xfb,0xd1,0x7b,0xfe,0xc1,0x01,0x3f,0x7d,0x04,0x33,0x7b,0x01,0x40,0xfe,0xc0,0x01,0x9c,0x76,0x76,0x94,0x01,0x4c,0x04,0x01,0x4c,0x94,0x78,0x78,0x94,0xfe,0xb4,0x04,0xfe,0xb4,0xff,0xff,0x00,0x33,0x00,0x00,0x04,0xf8,0x05,0x9a,0x02,0x06,0x00,0xa9,0x00,0x00,0x00,0x01,0x00,0xe6,0x00,0x00,0x04,0x92,0x03,0xac,0x00,0x05, +0x00,0x13,0xb7,0x02,0xbd,0x05,0x03,0x02,0xbe,0x05,0x00,0x00,0x2f,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x31,0x30,0x13,0x33,0x11,0x21,0x15,0x21,0xe6,0x84,0x03,0x28,0xfc,0x54,0x03,0xac,0xfc,0xd7,0x83,0x00,0x01,0x00,0xe6,0x00,0x6a,0x04,0xb7,0x04,0x4f,0x00,0x19,0x00,0x1e,0x40,0x0d,0x13,0x14,0x14,0x1b,0x06,0x07,0x00,0x0d,0x14,0x10, +0x07,0x01,0x07,0x00,0x2f,0x5d,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x02,0xc8,0x48,0x7f,0x5f,0x38,0x84,0x55,0x8a,0xb0,0x5a,0x5d,0xb0,0x88,0x53,0x84,0x3c,0x64,0x83,0x03,0xd1,0x31,0x65,0x9a, +0x69,0xfe,0x32,0x01,0xcf,0x8a,0xc9,0x83,0x40,0x40,0x83,0xc9,0x8a,0xfe,0x31,0x01,0xce,0x66,0x99,0x67,0x33,0x00,0x00,0x03,0x00,0xe6,0x00,0x70,0x04,0xac,0x04,0x3a,0x00,0x13,0x00,0x27,0x00,0x3b,0x00,0x2e,0x40,0x17,0x37,0xaf,0x2d,0x23,0xaf,0x19,0x2d,0x19,0x2d,0x19,0x3d,0x0f,0xaf,0x05,0x28,0xb0,0x32,0x10,0x1e,0x0a,0xb0,0x14, +0x00,0x00,0x2f,0x32,0xed,0x32,0x3f,0xed,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x31,0x30,0x25,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32, +0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x55,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x02,0xcf,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0xfe,0x76,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x70,0x12,0x1e,0x29,0x17,0x17,0x29, +0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x02,0xe9,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x01,0x00,0xe6,0x00,0x6a,0x05,0x38,0x04,0x3b,0x00,0x1b,0x00,0x2e,0x40,0x16,0x15,0x0f,0x1a,0x13, +0x16,0xea,0x08,0x05,0x0f,0xbe,0x0e,0x0e,0x07,0x1a,0xbe,0x1b,0x1b,0x16,0x06,0xbe,0x13,0x07,0x00,0x2f,0x33,0xed,0x32,0x32,0x2f,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0xed,0x32,0x2f,0x33,0x33,0x31,0x30,0x25,0x22,0x2e,0x02,0x27,0x23,0x35,0x33,0x3e,0x03,0x33,0x21,0x15,0x21,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x21, +0x15,0x03,0xa8,0x6a,0xb3,0x87,0x53,0x0a,0xc1,0xc1,0x0c,0x5b,0x8a,0xb0,0x60,0x01,0x90,0xfe,0x80,0xad,0xc1,0x11,0x02,0xff,0xfd,0x01,0x11,0xcb,0xc1,0x01,0x62,0x6a,0x37,0x6b,0x9f,0x69,0x84,0x68,0x9d,0x69,0x35,0x84,0x8d,0x92,0x84,0x93,0x93,0x84,0x00,0x01,0x00,0xa5,0x00,0x00,0x06,0x3f,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb3,0x03, +0x02,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x11,0x21,0xa5,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfa,0x66,0x00,0x01,0x00,0xa5,0x00,0x00,0x07,0x5b,0x04,0xac,0x00,0x03,0x00,0x0d,0xb3,0x03,0x02,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x11,0x21,0xa5,0x06,0xb6,0xf9,0x4a,0x04,0xac,0xfb,0x54, +0x00,0x01,0x00,0x50,0x00,0x00,0x06,0x94,0x05,0x9a,0x00,0x02,0x00,0x0d,0xb3,0x01,0x02,0x00,0x02,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x01,0x21,0x03,0x72,0x03,0x22,0xf9,0xbc,0x05,0x9a,0xfa,0x66,0x00,0x01,0x00,0xa5,0x01,0x61,0x06,0x3f,0x04,0x39,0x00,0x02,0x00,0x0d,0xb3,0x01,0x00,0x02,0x01,0x00,0x2f,0x2f,0x01,0x2f, +0x2f,0x31,0x30,0x01,0x01,0x11,0x06,0x3f,0xfa,0x66,0x02,0xcd,0xfe,0x94,0x02,0xd8,0x00,0x01,0x00,0x50,0x00,0x00,0x06,0x94,0x05,0x9a,0x00,0x02,0x00,0x0d,0xb3,0x01,0x00,0x02,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x01,0x50,0x06,0x44,0xfc,0xde,0x05,0x9a,0xfa,0x66,0x00,0x00,0x01,0x00,0xa5,0x01,0x61,0x06,0x3f, +0x04,0x39,0x00,0x02,0x00,0x0d,0xb3,0x01,0x02,0x01,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x11,0x01,0x06,0x3f,0xfa,0x66,0x04,0x39,0xfd,0x28,0x01,0x6c,0x00,0x02,0x00,0x8c,0xff,0xe7,0x06,0x58,0x05,0xb2,0x00,0x1b,0x00,0x33,0x00,0x15,0xb7,0x0e,0x28,0x1c,0x00,0x21,0x15,0x2f,0x07,0x00,0x2f,0xcd,0x2f,0xcd,0x01,0x2f, +0xcd,0x2f,0xcd,0x31,0x30,0x13,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x04,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x8c,0x35,0x60,0x87,0xa5,0xbe,0x66,0x66,0xbe,0xa5,0x88,0x61,0x35,0x35,0x61,0x88,0xa5,0xbe,0x66,0x67,0xbd,0xa5,0x87,0x60,0x35,0x7c,0x61, +0xa7,0xe1,0x80,0x55,0x9f,0x89,0x71,0x51,0x2c,0x2c,0x51,0x71,0x89,0x9f,0x55,0x80,0xe1,0xa7,0x61,0x02,0xcc,0x66,0xbe,0xa5,0x87,0x61,0x35,0x35,0x61,0x87,0xa5,0xbe,0x66,0x67,0xbd,0xa5,0x87,0x60,0x35,0x35,0x60,0x87,0xa5,0xbe,0x66,0x80,0xe1,0xa7,0x61,0x2c,0x50,0x70,0x8a,0x9e,0x55,0x55,0x9f,0x89,0x71,0x50,0x2c,0x61,0xa8,0xe1, +0x00,0x02,0x02,0x0d,0x00,0x00,0x04,0xd7,0x05,0x9a,0x00,0x03,0x00,0x17,0x00,0x1a,0x40,0x0a,0x0e,0x02,0x04,0x03,0x13,0x09,0x13,0x09,0x03,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xcd,0xdd,0xcd,0x31,0x30,0x01,0x21,0x11,0x21,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x02,0x0d, +0x02,0xca,0xfd,0x36,0x64,0x28,0x46,0x5d,0x36,0x35,0x5d,0x46,0x29,0x29,0x46,0x5d,0x35,0x36,0x5d,0x46,0x28,0x05,0x9a,0xfa,0x66,0x02,0xcd,0x35,0x5e,0x46,0x28,0x28,0x46,0x5e,0x35,0x35,0x5e,0x46,0x28,0x28,0x46,0x5e,0x00,0x03,0x00,0xa5,0x00,0x00,0x06,0x3f,0x05,0x9a,0x00,0x03,0x00,0x1d,0x00,0x31,0x00,0x1f,0x40,0x0d,0x1e,0x04, +0x03,0x28,0x12,0x02,0x2d,0x0b,0x03,0x22,0x23,0x17,0x00,0x00,0x2f,0xdd,0xce,0x3f,0xdd,0xce,0x01,0x2f,0xdd,0xce,0x2f,0xdd,0xce,0x31,0x30,0x13,0x21,0x11,0x21,0x13,0x14,0x1e,0x04,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x17,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0xa5, +0x05,0x9a,0xfa,0x66,0x64,0x2c,0x50,0x70,0x89,0x9d,0x55,0x55,0x9f,0x89,0x71,0x51,0x2c,0x61,0xa8,0xe2,0x80,0x55,0x9d,0x89,0x70,0x50,0x2c,0x67,0x51,0x8b,0xba,0x6a,0x6b,0xbc,0x8c,0x51,0x51,0x8c,0xbc,0x6b,0x6a,0xba,0x8b,0x51,0x05,0x9a,0xfa,0x66,0x02,0xcb,0x55,0x9d,0x89,0x70,0x50,0x2c,0x2c,0x50,0x70,0x89,0x9d,0x55,0x80,0xe2, +0xa8,0x61,0x2c,0x51,0x71,0x89,0x9f,0x55,0x6b,0xbc,0x8c,0x51,0x51,0x8c,0xbc,0x6b,0x6a,0xbb,0x8b,0x50,0x50,0x8b,0xbb,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x05,0x1c,0x05,0xb2,0x00,0x2b,0x00,0x1e,0x40,0x0d,0x0f,0x1c,0x1c,0x07,0x24,0x07,0x0c,0x1f,0x1f,0x16,0x22,0x00,0x26,0x00,0x3f,0x3f,0x39,0x2f,0x33,0x01,0x2f,0x2f,0x12,0x39, +0x2f,0xcd,0x31,0x30,0x01,0x1e,0x05,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x1e,0x03,0x17,0x15,0x21,0x35,0x3e,0x03,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x02,0xc1,0x2c,0x7b,0x86,0x84,0x69,0x41,0x34,0x55,0x6d,0x39,0x37,0x63,0x27,0x04,0x15,0x26,0x36,0x25,0xfd,0xee,0x25,0x36,0x26,0x15,0x04,0x27,0x63, +0x37,0x39,0x6d,0x55,0x34,0x41,0x69,0x84,0x86,0x7b,0x2c,0x05,0xb2,0x34,0x6b,0x76,0x82,0x93,0xa6,0x5f,0x52,0x7e,0x55,0x2c,0x1c,0x20,0x22,0x4c,0x4c,0x4a,0x1f,0x4b,0x4b,0x1f,0x4a,0x4c,0x4c,0x22,0x20,0x1c,0x2c,0x55,0x7e,0x52,0x5f,0xa6,0x93,0x82,0x76,0x6c,0x33,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x05,0x1c,0x05,0x9a,0x00,0x38, +0x00,0x1c,0x40,0x0b,0x32,0x06,0x06,0x10,0x28,0x10,0x2d,0x0b,0x0b,0x1c,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x31,0x30,0x21,0x35,0x3e,0x03,0x35,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02, +0x23,0x22,0x2e,0x02,0x27,0x14,0x1e,0x02,0x17,0x15,0x01,0xb4,0x1c,0x36,0x2a,0x1a,0x13,0x25,0x2a,0x31,0x1f,0x41,0x73,0x55,0x31,0x2d,0x53,0x73,0x45,0x10,0x2d,0x52,0x72,0x46,0x46,0x72,0x52,0x2d,0x10,0x45,0x73,0x53,0x2d,0x31,0x55,0x73,0x41,0x1f,0x31,0x2a,0x25,0x13,0x19,0x2a,0x36,0x1d,0x4b,0x17,0x46,0x5c,0x72,0x44,0x0d,0x14, +0x0f,0x08,0x2c,0x51,0x74,0x48,0x41,0x71,0x55,0x32,0x01,0x34,0x37,0x40,0x73,0x55,0x32,0x32,0x55,0x73,0x40,0x37,0x34,0x01,0x32,0x55,0x71,0x41,0x48,0x74,0x51,0x2c,0x08,0x0f,0x14,0x0d,0x44,0x72,0x5c,0x46,0x17,0x4b,0x00,0x01,0x00,0x5e,0x00,0x78,0x05,0x1c,0x05,0x23,0x00,0x23,0x00,0x0d,0xb3,0x05,0x14,0x19,0x0c,0x00,0x2f,0x2f, +0x01,0x2f,0x2f,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x07,0x23,0x2e,0x05,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x3e,0x03,0x03,0xea,0x3b,0x6f,0x55,0x33,0x40,0x68,0x83,0x86,0x7d,0x2d,0x09,0x2d,0x7c,0x86,0x83,0x68,0x40,0x33,0x55,0x6f,0x3b,0x39,0x5b,0x49,0x37,0x14,0x09,0x14,0x38,0x49,0x5b,0x05,0x23, +0x2b,0x57,0x84,0x5a,0x64,0xad,0x98,0x85,0x79,0x6f,0x35,0x35,0x6f,0x79,0x85,0x98,0xad,0x64,0x5a,0x84,0x57,0x2b,0x1e,0x33,0x41,0x22,0x22,0x41,0x33,0x1e,0x00,0x01,0x00,0xcd,0x00,0x00,0x04,0xae,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb3,0x02,0x00,0x03,0x01,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x09,0x02,0xcd,0x01,0xf0,0x01, +0xf1,0xfe,0x0f,0x02,0xcc,0x02,0xce,0xfd,0x32,0xfd,0x34,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x2c,0x05,0xb2,0x00,0x16,0x00,0x2d,0x00,0x2d,0x40,0x17,0x13,0x12,0x7e,0x10,0x28,0x28,0x2f,0x1c,0x7d,0x05,0x13,0x10,0x03,0x17,0x91,0x0f,0x0a,0x04,0x21,0x91,0x14,0x00,0x13,0x00,0x3f,0x32,0xed,0x3f,0x33,0xed,0x3f,0x2f,0x01,0x2f, +0xe1,0x12,0x39,0x2f,0x33,0xe1,0x33,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x11,0x23,0x35,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x11,0x34,0x2e,0x02,0x02,0xb9,0x86,0xde,0x9f,0x58,0x5c,0xaa,0xef,0x94,0x4e,0x80,0x66,0x4d,0x1c,0xa8, +0xa8,0x40,0xe1,0x80,0x6c,0xad,0x7a,0x42,0x42,0x79,0xa9,0x66,0x33,0x67,0x5f,0x53,0x3d,0x23,0x3b,0x6e,0x99,0x18,0x6a,0xbf,0x01,0x0b,0xa0,0xac,0x01,0x18,0xc6,0x6c,0x21,0x39,0x4b,0x2a,0xb7,0xfa,0x66,0xd6,0x6d,0x81,0x05,0x32,0x56,0x9c,0xd9,0x84,0x84,0xd9,0x9a,0x55,0x13,0x2c,0x48,0x6a,0x90,0x5d,0x01,0x0d,0x6c,0xa2,0x6c,0x36, +0xff,0xff,0x00,0x0e,0x00,0x00,0x04,0x9a,0x04,0x18,0x02,0x06,0x05,0xef,0x00,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x08,0x74,0x05,0xb2,0x00,0x2c,0x00,0x54,0x40,0x2b,0x25,0x24,0x1c,0x2c,0x01,0x00,0x19,0x15,0x14,0x06,0x0a,0x09,0x10,0x24,0x2c,0x19,0x06,0x10,0x10,0x06,0x19,0x2c,0x24,0x05,0x2e,0x0c,0x0b,0x27,0x92,0x40,0x25,0x80, +0x21,0x04,0x14,0x05,0x0b,0x03,0x18,0x0f,0x01,0x0a,0x12,0x00,0x3f,0x33,0x33,0x33,0x3f,0x33,0x33,0x3f,0x1a,0xcc,0x1a,0xed,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01, +0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x3e,0x03,0x33,0x32,0x16,0x17,0x23,0x26,0x23,0x22,0x0e,0x02,0x07,0x05,0xcb,0xc5,0xfe,0xd9,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x14,0x04,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x05,0x16,0xe1, +0x12,0x32,0x45,0x5c,0x3c,0x69,0x79,0x0b,0x9a,0x0c,0x47,0x16,0x23,0x1b,0x17,0x0b,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x35,0x55,0x03,0x54,0x46,0x68,0x44,0x22,0x79,0x79,0x63,0x16,0x29,0x3d,0x27,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x06,0x97, +0x04,0x18,0x00,0x2c,0x00,0x54,0x40,0x2b,0x0a,0x09,0x11,0x15,0x14,0x06,0x01,0x00,0x19,0x1d,0x2c,0x26,0x25,0x11,0x06,0x19,0x2c,0x25,0x25,0x2c,0x19,0x06,0x11,0x05,0x2e,0x0c,0x0b,0x29,0x95,0x40,0x26,0x80,0x22,0x10,0x14,0x05,0x0b,0x0f,0x18,0x10,0x01,0x0a,0x15,0x00,0x3f,0x33,0x33,0x33,0x3f,0x33,0x33,0x3f,0x1a,0xcc,0x1a,0xed, +0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x03,0x26,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x3e,0x03,0x33,0x32,0x16,0x17,0x23,0x26, +0x26,0x23,0x22,0x06,0x07,0x04,0x7d,0xaa,0xd3,0x06,0x08,0x02,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x05,0x07,0x02,0x08,0x03,0x0f,0xec,0x96,0xd4,0x0b,0x04,0x08,0x01,0x09,0x07,0x9a,0x0d,0x26,0x38,0x4e,0x35,0x5b,0x6b,0x0b,0x96,0x04,0x23,0x1c,0x21,0x2a,0x14,0x02,0xdd,0x15,0x30,0x1a,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc, +0xfe,0x11,0x2e,0x1d,0x2d,0x31,0x03,0x00,0xfc,0xfc,0x26,0x36,0x14,0x2e,0x1a,0x02,0x46,0x32,0x4f,0x38,0x1d,0x6d,0x6f,0x2a,0x2a,0x3f,0x46,0x00,0x00,0x01,0x00,0x96,0x03,0x82,0x03,0x31,0x05,0xd3,0x00,0x09,0x00,0x0d,0xb3,0x09,0x00,0x00,0x04,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x01,0x11,0x07,0x23,0x01,0x33,0x01,0x23,0x27, +0x11,0x01,0xa0,0x77,0x93,0x01,0x4b,0x04,0x01,0x4c,0x93,0x79,0x03,0x82,0x01,0x8b,0x79,0x01,0x3f,0xfe,0xc1,0x7b,0xfe,0x73,0x00,0x01,0x00,0x96,0x03,0x82,0x03,0x31,0x05,0xd3,0x00,0x09,0x00,0x0d,0xb3,0x00,0x09,0x04,0x09,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x01,0x11,0x37,0x33,0x01,0x23,0x01,0x33,0x17,0x11,0x02,0x25,0x79, +0x93,0xfe,0xb4,0x04,0xfe,0xb5,0x93,0x77,0x05,0xd3,0xfe,0x73,0x7b,0xfe,0xc1,0x01,0x3f,0x79,0x01,0x8b,0x00,0x02,0x00,0xb4,0x03,0x83,0x01,0x92,0x06,0x89,0x00,0x03,0x00,0x0f,0x00,0x20,0x40,0x0f,0x00,0x03,0x03,0x0d,0x07,0x02,0x50,0x0a,0x01,0x0a,0x00,0x04,0x01,0x04,0x03,0x00,0x2f,0xd4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33, +0x2f,0xcd,0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x77,0x13,0x87,0x12,0x58,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x06,0x89,0xfe,0x2d,0x01,0xd3,0xfc,0xfa,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x00,0x02,0x00,0xb4,0x03,0x83,0x01,0x92,0x06,0x89,0x00,0x03,0x00,0x0f, +0x00,0x20,0x40,0x0f,0x03,0x00,0x00,0x07,0x0d,0x02,0x5f,0x0a,0x01,0x0a,0x00,0x03,0x01,0x03,0x04,0x00,0x2f,0xc4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x31,0x30,0x13,0x13,0x33,0x13,0x03,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0xcb,0x12,0x87,0x13,0x54,0x2d,0x42,0x42,0x2d,0x2e,0x41,0x41,0x03,0x83, +0x01,0xd3,0xfe,0x2d,0x03,0x06,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x02,0x00,0xb4,0x01,0xd5,0x01,0x92,0x04,0xdb,0x00,0x03,0x00,0x0f,0x00,0x23,0x40,0x0f,0x03,0x00,0x00,0x07,0x0d,0x01,0x5f,0x0a,0x01,0x0a,0x00,0x00,0x01,0x00,0x04,0xb8,0x01,0x3a,0x00,0x3f,0xc4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x31, +0x30,0x13,0x13,0x33,0x13,0x03,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0xcb,0x12,0x87,0x13,0x54,0x2d,0x42,0x42,0x2d,0x2e,0x41,0x41,0x01,0xd5,0x01,0xd3,0xfe,0x2d,0x03,0x06,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x00,0x01,0x00,0x63,0xfe,0x3e,0x02,0x95,0xff,0x89,0x00,0x06,0x00,0x18,0x40,0x0c,0x00,0x04, +0x04,0x80,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f,0xc4,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x02,0x95,0x78,0xa4,0xa6,0x70,0xd6,0x86,0xfe,0x3e,0xe5,0xe5,0x01,0x4b,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x02,0x06,0x00,0x1d,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x3e, +0x03,0x9a,0x03,0x6c,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0b,0x00,0x01,0x04,0x05,0x04,0x05,0xbe,0x06,0x01,0xbe,0x02,0x00,0x2f,0xed,0xd6,0xed,0x01,0x2f,0x2f,0x11,0x39,0x39,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x9a,0xfd,0x4e,0x02,0xb2,0xfd,0x4e,0x02,0xb2,0x02,0xe8,0x84,0xfd,0xd2,0x84,0x00,0x01,0x00,0x94, +0x02,0xc3,0x01,0x43,0x05,0x9a,0x00,0x03,0x00,0x1c,0x40,0x0e,0x00,0x7d,0x03,0x04,0x0d,0x06,0x4d,0x03,0x03,0x05,0x04,0x01,0x00,0x03,0x00,0x3f,0xcd,0x11,0x12,0x01,0x39,0x2f,0x2b,0xe1,0x31,0x30,0x01,0x03,0x23,0x03,0x01,0x43,0x1e,0x73,0x1e,0x05,0x9a,0xfd,0x29,0x02,0xd7,0x00,0xff,0xff,0x00,0xa3,0x03,0xdb,0x01,0x34,0x05,0x9a, +0x02,0x06,0x00,0x0a,0x00,0x00,0x00,0x01,0x03,0x9b,0xfe,0x80,0x04,0x36,0x00,0x00,0x00,0x03,0x00,0x0d,0xb3,0x01,0x00,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x21,0x33,0x11,0x23,0x03,0x9b,0x9b,0x9b,0xfe,0x80,0x00,0x00,0x01,0x02,0xd6,0xfe,0x8a,0x03,0x64,0x00,0x00,0x00,0x03,0x00,0x0d,0xb3,0x01,0x00,0x03,0x00,0x00, +0x2f,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x21,0x33,0x11,0x23,0x02,0xd6,0x8e,0x8e,0xfe,0x8a,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x00,0xb9,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x2f,0xb9,0x00,0x00,0x01,0x51,0xb2,0x06,0x06,0x0c,0xb8,0x01,0x51,0xb3,0x12,0x12,0x19,0x03,0xbb,0x01,0x55,0x00,0x09,0x00,0x0f,0x01,0x55,0xb2,0x15,0x15,0x19, +0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x01,0x33,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x35,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0x5a,0x2a,0x31,0x2f,0x2c, +0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x05,0x00,0x00,0xfd,0xff,0x02,0xdd,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b,0x00,0x00,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26, +0x35,0x34,0x36,0x33,0x32,0x16,0x35,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x14,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x10,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x33,0x29,0x2a,0x33,0x31, +0x2a,0x2a,0x34,0xfe,0x67,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0xe2, +0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x37,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0xb8,0x01,0x51,0xb7,0x06,0x1b,0x1a,0x18,0x1b,0x1b,0x09,0x0f,0xbb,0x01,0x55,0x00,0x15,0x00,0x03,0x01,0x55,0xb2,0x09,0x09,0x1d,0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xcd,0x01,0x2f,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30, +0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x25,0x21,0x35,0x21,0x02,0xdd,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xce,0xfe,0x50,0x01,0xb0,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce, +0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb1,0x66,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0xe1,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x1f,0x00,0x40,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0xb8,0x01,0x51,0x40,0x0c,0x06,0x1f,0x19,0x1e,0x1c,0x1c,0x1a,0x19,0x1f,0x1f,0x09,0x0f,0xbb,0x01,0x55,0x00,0x15,0x00,0x03,0x01,0x55,0xb2, +0x09,0x09,0x21,0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xdd,0xcd,0x33,0x01,0x2f,0xcd,0xdd,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30,0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x25,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x02,0xdd,0x33,0x29, +0x2a,0x33,0x31,0x2a,0x2a,0x34,0x04,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xcf,0xa5,0x66,0xa5,0x01,0xb0,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb1,0xdf,0xdf,0x66,0x00,0x00,0x01,0x00,0x00,0xff,0x04,0x00,0xb9,0xff,0xbb,0x00,0x0b,0x00,0x1d,0xb9,0x00,0x00,0x01,0x51,0xb3, +0x06,0x06,0x0d,0x03,0xb8,0x01,0x55,0xb2,0x09,0x09,0x0d,0x11,0x00,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xed,0x30,0x31,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x02,0x00,0x00,0xff,0x04,0x01,0xd6,0xff,0xbb,0x00,0x0b, +0x00,0x17,0x00,0x2f,0xbc,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x0c,0x01,0x51,0xb3,0x12,0x12,0x19,0x03,0xb8,0x01,0x55,0xb2,0x09,0x09,0x0f,0xb8,0x01,0x55,0xb2,0x15,0x15,0x19,0x11,0x00,0x33,0x2f,0xed,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde,0xed,0x30,0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05, +0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0xd6,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xe3,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x01,0xd6,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23, +0x00,0x45,0xb9,0x00,0x00,0x01,0x51,0xb3,0x06,0x06,0x1e,0x0c,0xbb,0x01,0x51,0x00,0x12,0x00,0x18,0x01,0x51,0xb3,0x1e,0x1e,0x25,0x03,0xbe,0x01,0x55,0x00,0x09,0x00,0x1b,0x01,0x55,0x00,0x21,0x00,0x0f,0x01,0x55,0xb4,0x15,0x15,0x21,0x21,0x25,0x11,0x00,0x33,0x2f,0x33,0x2f,0xed,0x10,0xfd,0xde,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde, +0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x37,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x48,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x8e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xe3, +0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0x5a,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0x00,0x00,0xff,0x38,0x01,0xb0,0xff,0x9e,0x00,0x03,0x00,0x11,0xb5,0x00,0x02,0x00,0x02,0x02,0x05,0x11,0x00,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x30, +0x31,0x05,0x21,0x35,0x21,0x01,0xb0,0xfe,0x50,0x01,0xb0,0xc8,0x66,0x00,0x00,0x01,0x00,0x00,0xfe,0x59,0x01,0xb0,0xff,0x9e,0x00,0x07,0x00,0x1a,0x40,0x0a,0x07,0x01,0x06,0x04,0x02,0x01,0x04,0x06,0x06,0x09,0x11,0x00,0x33,0x2f,0xdd,0x32,0xcd,0x01,0x2f,0xcd,0xdd,0xcd,0x30,0x31,0x05,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x01,0xb0, +0xa5,0x66,0xa5,0x01,0xb0,0xc8,0xdf,0xdf,0x66,0x00,0x00,0x01,0xff,0xa4,0x05,0x4e,0x00,0x5d,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5d,0x33,0x29,0x2a,0x33, +0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0x77,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3d,0xbf,0x00,0x18,0x01,0x51,0x00,0x1e,0x00,0x0c,0x01,0x51,0x00,0x12,0x00,0x00,0x01,0x51,0xb3,0x06,0x06,0x25,0x1b,0xbe,0x01,0x55,0x00,0x21,0x00,0x0f,0x01,0x55,0x00, +0x15,0x00,0x03,0x01,0x55,0xb2,0x09,0x09,0x25,0x11,0x00,0x33,0x2f,0xed,0xdc,0xed,0xdc,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde,0xfd,0xde,0xed,0x30,0x31,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32, +0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xdf,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xdf,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xaf,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb0,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xff,0xa5,0x02,0x18,0x00,0x5e,0x02,0xcf,0x00,0x0b, +0x00,0x15,0xbd,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x00,0x2f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x02,0x73,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0xcd,0xfe,0x09,0x00,0x33,0xff,0xb1, +0x00,0x03,0x00,0x11,0xb5,0x03,0x02,0x00,0x03,0x03,0x05,0x11,0x00,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x13,0x23,0x11,0x33,0x33,0x66,0x66,0xfe,0x09,0x01,0xa8,0x00,0x01,0x00,0x4b,0x04,0x38,0x02,0xe8,0x04,0xcd,0x00,0x03,0x00,0x14,0xb5,0x03,0x05,0x02,0x04,0x01,0x03,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x11,0x01,0x33,0x11,0x33, +0x30,0x31,0x01,0x21,0x37,0x21,0x02,0xd0,0xfd,0x7b,0x18,0x02,0x85,0x04,0x38,0x95,0x00,0x01,0xfe,0xd2,0x05,0x6b,0x01,0x31,0x05,0xd5,0x00,0x03,0x00,0x0d,0xb3,0x03,0x01,0x03,0x01,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x01,0x21,0x35,0x21,0x01,0x31,0xfd,0xa1,0x02,0x5f,0x05,0x6b,0x6a,0x00,0x01,0x00,0x94,0xff,0x9d,0x01,0x09, +0x05,0x30,0x00,0x03,0x00,0x15,0xbd,0x00,0x03,0x01,0x50,0x00,0x02,0x00,0x03,0x01,0x4b,0x00,0x00,0x00,0x2f,0x3f,0x01,0x2f,0xed,0x30,0x31,0x05,0x23,0x11,0x33,0x01,0x09,0x75,0x75,0x63,0x05,0x93,0x00,0x01,0x02,0x00,0x05,0x4e,0x02,0xb9,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00, +0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x02,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xfd,0x3c,0x05,0x4e,0xfd,0xf5,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00, +0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xfd,0xf5,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x36,0x40,0x12, +0x00,0xb0,0x06,0x10,0x12,0xb0,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0xff,0x9c,0x05,0x77,0x00,0x67,0x06,0x40,0x00,0x0b,0x00,0x17,0xbe,0x00, +0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x67,0x38,0x2d,0x2e,0x38,0x36,0x2e,0x2e,0x39,0x05,0xdb,0x2e,0x36,0x34,0x30,0x2e,0x37,0x34,0x00,0x00,0x01,0xff,0x9c,0xfe,0x8d,0x00,0x67,0xff,0x56,0x00,0x0b, +0x00,0x19,0xbc,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x03,0x01,0x57,0xb2,0x09,0x09,0x0d,0x11,0x00,0x33,0x2f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x67,0x38,0x2d,0x2e,0x38,0x36,0x2e,0x2e,0x39,0xfe,0xf1,0x2e,0x36,0x34,0x30,0x2e,0x37,0x34,0x00,0x00,0x01,0x00,0xa5,0x00,0x00, +0x04,0x9a,0x04,0xd4,0x00,0x28,0x00,0x51,0x40,0x0b,0x1e,0x28,0x17,0x00,0x15,0x08,0x16,0x01,0x01,0x00,0x23,0xb8,0x01,0x50,0xb7,0x20,0x20,0x0f,0x2a,0x17,0x16,0x16,0x0e,0xb8,0x01,0x50,0x40,0x0a,0x0f,0x15,0x08,0x1e,0x28,0x04,0x16,0x17,0x17,0x21,0xbb,0x01,0x4a,0x00,0x0f,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0x2f,0x33, +0x17,0x39,0x01,0x2f,0xed,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0xed,0xc4,0x32,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x2e,0x05,0x27,0x0e,0x03,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x37,0x03,0x37,0x1e,0x03,0x17,0x16,0x17,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x07,0x04,0x9a,0xc5,0x2f,0x51,0x4b,0x4a,0x54, +0x61,0x3c,0x28,0x32,0x1c,0x09,0xa9,0x17,0x34,0x52,0x3c,0xdb,0x8e,0x2d,0x5a,0x54,0x4e,0x22,0x4f,0x46,0xae,0xaa,0x21,0x41,0x61,0x41,0x45,0x75,0x6e,0x6c,0x77,0x88,0x53,0x27,0x4c,0x51,0x5d,0x38,0xfe,0x73,0x01,0x98,0x4c,0x77,0x68,0x5f,0x33,0x01,0x38,0x47,0x3c,0x79,0x74,0x6d,0x30,0x70,0x66,0x63,0xd5,0x01,0x5d,0xfe,0xc1,0x52, +0x85,0x6d,0x5a,0x29,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0x3c,0x04,0xde,0x00,0x24,0x00,0x38,0xb2,0x07,0x07,0x00,0xb8,0x01,0x50,0xb7,0x06,0x12,0x12,0x26,0x09,0x19,0x19,0x16,0x41,0x09,0x01,0x54,0x00,0x1a,0x00,0x1f,0x01,0x4b,0x00,0x06,0x00,0x0a,0x01,0x54,0x00,0x09,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f, +0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x07,0x21,0x07,0x21,0x37,0x21,0x32,0x3e,0x04,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xee,0x17,0x28,0x38,0x20,0x34,0x01,0x19,0x16,0xfc,0x2e,0x18,0x01,0xa6,0x44,0x62,0x44,0x29,0x17,0x07,0xc0,0xb0,0x69, +0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7,0x8f,0x4f,0x02,0x66,0x54,0x7b,0x5d,0x47,0x1f,0x32,0xa2,0xa2,0x33,0x52,0x65,0x64,0x59,0x1b,0x86,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x01,0x00,0x31,0x00,0x00,0x03,0x17,0x04,0xcd,0x00,0x25,0x00,0x43,0xb3,0x17,0x02,0x02,0x00,0xb8,0x01,0x50, +0xb6,0x01,0x01,0x0b,0x27,0x1e,0x1e,0x0a,0xbb,0x01,0x50,0x00,0x0b,0x00,0x02,0x01,0x56,0xb3,0x17,0x17,0x00,0x1e,0xbd,0x01,0x54,0x00,0x1f,0x01,0x4a,0x00,0x0b,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x33,0x11,0x33,0x31,0x30,0x21,0x23,0x03,0x06,0x06, +0x07,0x0e,0x03,0x07,0x23,0x36,0x37,0x3e,0x03,0x37,0x3e,0x03,0x37,0x03,0x2e,0x03,0x23,0x23,0x37,0x33,0x32,0x1e,0x02,0x17,0x03,0x17,0xa1,0x28,0x4d,0x7b,0x28,0x19,0x29,0x20,0x18,0x0a,0xa9,0x13,0x19,0x0b,0x18,0x1c,0x1f,0x10,0x24,0x54,0x61,0x6b,0x3a,0x1b,0x06,0x2a,0x44,0x5b,0x38,0xc5,0x16,0xaa,0x62,0x99,0x6d,0x3f,0x07,0x01, +0xe0,0x14,0x4e,0x2f,0x1d,0x4f,0x59,0x5e,0x2c,0x4d,0x47,0x1e,0x41,0x3f,0x38,0x15,0x2f,0x45,0x35,0x29,0x13,0x01,0x0e,0x36,0x4c,0x31,0x17,0x91,0x24,0x51,0x84,0x60,0x00,0x01,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x00,0x14,0x00,0x2d,0xb1,0x04,0x14,0xb8,0x01,0x50,0x40,0x09,0x00,0x0c,0x00,0x0c,0x16,0x0a,0x0e,0x04,0x0a,0xbc, +0x01,0x54,0x00,0x0b,0x01,0x4a,0x00,0x00,0x01,0x4d,0x00,0x3f,0x3f,0xed,0x32,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x31,0x30,0x21,0x11,0x34,0x36,0x37,0x22,0x0e,0x02,0x23,0x21,0x37,0x21,0x07,0x23,0x22,0x0e,0x02,0x15,0x11,0x02,0x2e,0x42,0x39,0x0c,0x26,0x27,0x23,0x0a,0xfd,0xfd,0x18,0x03,0x73,0x19,0x37,0x28,0x33, +0x1e,0x0b,0x03,0x32,0x5b,0x81,0x30,0x02,0x02,0x02,0x95,0x95,0x29,0x3e,0x46,0x1e,0xfc,0x93,0x00,0x02,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x00,0x17,0x00,0x1b,0x00,0x38,0xb9,0x00,0x00,0x01,0x50,0xb3,0x01,0x01,0x1d,0x18,0xb8,0x01,0x50,0xb5,0x19,0x0c,0x0c,0x19,0x0c,0x07,0xb8,0x01,0x54,0xb2,0x1b,0x0d,0x12,0xbb,0x01,0x4b, +0x00,0x19,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0xc4,0xed,0x32,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x01,0x23,0x11,0x37,0x04,0xc0,0xab,0x34,0x61,0x8d,0x59,0x3a,0x86,0x83,0x75,0x2a,0x13,0x30,0x73, +0x7f,0x88,0x46,0x6e,0xbc,0x8c,0x4f,0xfc,0xae,0xa9,0xa9,0x02,0xea,0x65,0x88,0x52,0x22,0x0c,0x13,0x17,0x0a,0xa5,0x09,0x10,0x0d,0x08,0x36,0x77,0xba,0x84,0xfd,0x0d,0x02,0xc9,0x51,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x17,0xbe,0x00,0x00,0x01,0x50,0x00,0x01,0x00,0x00,0x01,0x4d,0x00,0x02,0x01, +0x4a,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x04,0xcd,0x00,0x00,0x01,0x00,0x31,0x00,0x00,0x02,0x5f,0x04,0xcd,0x00,0x20,0x00,0x2a,0xb4,0x18,0x0c,0x00,0x00,0x06,0xb8,0x01,0x50,0xb4,0x1e,0x0d,0x13,0x00,0x1e,0xbc,0x01,0x54,0x00,0x1f,0x01,0x4a,0x00,0x0c,0x01,0x4d,0x00,0x3f,0x3f,0xed, +0x32,0x01,0x2f,0x33,0xc6,0xed,0x32,0x2f,0x32,0x32,0x31,0x30,0x01,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x13,0x23,0x03,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x22,0x0e,0x02,0x23,0x23,0x37,0x21,0x02,0x5f,0x31,0x31,0x49,0x31,0x18,0x06,0x07,0x09,0x03,0x6f,0xb1,0x6f,0x02,0x07,0x06,0x04,0x09,0x1e,0x3b,0x31,0x18,0x3b,0x39, +0x33,0x10,0x53,0x13,0x02,0x1b,0x04,0x38,0x1d,0x35,0x4a,0x2c,0x12,0x35,0x39,0x36,0x13,0xfd,0x59,0x02,0xb4,0x0e,0x29,0x31,0x34,0x17,0x1a,0x3c,0x3a,0x34,0x12,0x02,0x01,0x02,0x95,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x04,0xba,0x04,0xde,0x00,0x17,0x00,0x30,0xb9,0x00,0x00,0x01,0x50,0xb3,0x01,0x01,0x19,0x0b,0xb8,0x01,0x50,0xb2, +0x0c,0x0a,0x07,0xbe,0x01,0x54,0x00,0x0d,0x00,0x12,0x01,0x4b,0x00,0x0c,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x04,0xba,0xab,0x34,0x60,0x8a,0x57,0x53,0xa4,0x3c, +0xa9,0x30,0x7f,0x86,0x83,0x35,0x7f,0xc4,0x86,0x46,0x02,0xf8,0x63,0x82,0x4d,0x1e,0x14,0x0c,0xfb,0xd8,0x04,0xad,0x0a,0x12,0x0d,0x08,0x36,0x77,0xba,0x84,0x00,0x01,0x00,0xa0,0xff,0xed,0x05,0x01,0x04,0xdd,0x00,0x29,0x00,0x3e,0xb9,0x00,0x00,0x01,0x50,0xb6,0x17,0x20,0x17,0x20,0x17,0x2b,0x0d,0xb8,0x01,0x50,0xb2,0x0a,0x20,0x1d, +0x41,0x0a,0x01,0x54,0x00,0x21,0x00,0x24,0x01,0x4b,0x00,0x0b,0x01,0x4a,0x00,0x12,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x34, +0x2e,0x02,0x23,0x22,0x06,0x07,0x37,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x05,0x01,0x52,0x98,0xd8,0x86,0x7c,0xc7,0x8c,0x4a,0xaa,0x22,0x54,0x90,0x6d,0x67,0x99,0x66,0x33,0x26,0x47,0x63,0x3d,0x35,0x5e,0x30,0x15,0x2c,0x5d,0x41,0x52,0x95,0x72,0x43,0x02,0x56,0x87,0xe3,0xa3,0x5c,0x52,0x9d,0xe6,0x94,0x02,0x77,0xfd,0x96,0x54,0xaa, +0x8a,0x56,0x49,0x7d,0xa5,0x5c,0x8f,0x4c,0x84,0x62,0x39,0x07,0x09,0x94,0x08,0x0b,0x47,0x86,0xc0,0x79,0x00,0x01,0x00,0xbe,0x02,0x27,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x14,0xb9,0x00,0x00,0x01,0x50,0xb2,0x01,0x00,0x02,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x01,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x02,0x27, +0x02,0xa6,0x00,0x01,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x00,0x13,0x00,0x27,0xb9,0x00,0x00,0x01,0x50,0xb5,0x01,0x01,0x15,0x08,0x08,0x05,0xbd,0x01,0x54,0x00,0x09,0x00,0x0e,0x01,0x4b,0x00,0x00,0x01,0x4f,0x00,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x07, +0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xcd,0xab,0xc0,0xb0,0x69,0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7,0x8f,0x4f,0xfe,0x00,0x04,0xea,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x00,0x01,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x00,0x25,0x00,0x35,0xb9,0x00,0x00,0x01,0x50,0xb6, +0x11,0x11,0x27,0x08,0x1b,0x1b,0x16,0x41,0x0a,0x01,0x54,0x00,0x1c,0x00,0x21,0x01,0x4b,0x00,0x09,0x00,0x0c,0x01,0x54,0x00,0x08,0x00,0x03,0x01,0x4e,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0x33,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x22,0x2e,0x02,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34, +0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x03,0xeb,0xfe,0xcb,0xfe,0xc4,0x28,0x53,0x4b,0x3d,0x12,0x15,0x2f,0x81,0x46,0x77,0xae,0x72,0x37,0x33,0x6e,0xab,0x78,0x1b,0x4d,0x53,0x51,0x20,0x14,0x1d,0x4a,0x4f,0x51,0x24,0x91,0xe2,0x9a,0x51,0x02,0x5f,0xfe,0xc7,0xfe,0xc7,0x07,0x0b,0x0d,0x07,0x8d,0x0a, +0x12,0x38,0x75,0xb4,0x7d,0x76,0xb5,0x7b,0x40,0x04,0x07,0x0b,0x06,0x8f,0x08,0x0d,0x09,0x05,0x4b,0x9d,0xf1,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x00,0x2b,0x00,0x39,0xb9,0x00,0x00,0x01,0x50,0xb6,0x1d,0x0e,0x1d,0x0e,0x1d,0x2d,0x26,0x41,0x0c,0x01,0x50,0x00,0x23,0x00,0x23,0x01,0x54,0x00,0x26,0x01,0x4a,0x00, +0x24,0x01,0x4c,0x00,0x0f,0x01,0x54,0x00,0x0e,0x01,0x4d,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x03,0x0e,0x03,0x07,0x0e,0x03,0x07,0x37,0x32,0x3e,0x02,0x37,0x3e,0x03,0x37,0x13,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x21,0x11,0x33,0x11,0x21,0x32,0x1e,0x02, +0x03,0xeb,0x05,0x02,0x1c,0x06,0x1a,0x2d,0x41,0x2d,0x2f,0x7e,0x85,0x7e,0x2f,0x32,0x1a,0x48,0x4f,0x4f,0x1f,0x25,0x38,0x27,0x18,0x05,0x1b,0x01,0x05,0x22,0x3f,0x5a,0x37,0xfe,0x0a,0xa9,0x01,0x6e,0x56,0x8c,0x63,0x36,0x03,0x95,0x1c,0x3e,0x13,0xfe,0xe1,0x3b,0x76,0x6c,0x60,0x25,0x27,0x29,0x13,0x03,0x01,0x8e,0x03,0x0b,0x15,0x12, +0x15,0x42,0x53,0x5f,0x31,0x01,0x1a,0x0a,0x38,0x19,0x30,0x4a,0x32,0x1a,0x02,0x68,0xfe,0x2d,0x2f,0x54,0x72,0x00,0x00,0x02,0x00,0xbe,0x00,0x00,0x04,0xe2,0x04,0xde,0x00,0x0b,0x00,0x16,0x00,0x36,0xb9,0x00,0x00,0x01,0x50,0xb3,0x0c,0x0c,0x18,0x16,0xb8,0x01,0x50,0xb2,0x02,0x15,0x12,0x41,0x09,0x01,0x54,0x00,0x03,0x00,0x06,0x01, +0x4b,0x00,0x00,0x00,0x16,0x01,0x54,0x00,0x02,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x07,0x21,0x11,0x36,0x24,0x33,0x32,0x1e,0x02,0x15,0x03,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x04,0xe2,0x31,0xfc,0x0d,0x80,0x01,0x00,0x86,0x82,0xca,0x8a,0x48,0xab,0x37, +0x69,0x96,0x60,0x6a,0x9c,0x34,0xa9,0xa9,0x04,0xac,0x17,0x1b,0x42,0x7e,0xb6,0x75,0xfd,0xaf,0x02,0x53,0x5b,0x80,0x52,0x26,0x14,0x0b,0xfc,0x79,0x00,0x01,0x00,0xa4,0xff,0xed,0x04,0xe8,0x04,0xe5,0x00,0x33,0x00,0x4b,0xb9,0x00,0x00,0x01,0x50,0x40,0x09,0x11,0x08,0x11,0x08,0x35,0x28,0x27,0x2b,0x22,0xb8,0x01,0x50,0xb2,0x23,0x21, +0x19,0x41,0x0d,0x01,0x54,0x00,0x2b,0x00,0x2e,0x01,0x4a,0x00,0x27,0x00,0x28,0x01,0x4b,0x00,0x23,0x01,0x4d,0x00,0x0c,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x32,0xc6,0x32,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x16,0x16, +0x33,0x32,0x3e,0x02,0x35,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x07,0x06,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x04,0xe8,0x31,0x60,0x8e,0x5c,0x35,0x62,0x26,0x2c,0x21,0x40,0x28,0x38,0x51,0x35,0x1a,0x0e,0x21,0x38,0x52,0x71,0x4a,0x2c,0x5f,0x57,0x4a,0x17,0x09,0x0f, +0xa9,0x0a,0x17,0x94,0x16,0x1a,0x02,0x4a,0xba,0x75,0x7e,0xc1,0x83,0x43,0x01,0xb9,0x6f,0xab,0x75,0x3d,0x13,0x11,0x85,0x08,0x09,0x2a,0x4c,0x69,0x40,0xf8,0x30,0x64,0x5f,0x54,0x3e,0x25,0x15,0x29,0x3d,0x29,0x11,0x27,0x14,0xfc,0xaa,0x03,0xf5,0x2e,0x55,0x2d,0x40,0x20,0x54,0x3f,0x50,0x5c,0x52,0x94,0xcc,0x7a,0x00,0x01,0x00,0xbe, +0xfd,0xff,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x17,0xbe,0x00,0x00,0x01,0x50,0x00,0x01,0x00,0x00,0x01,0x4f,0x00,0x02,0x01,0x4a,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0xfd,0xff,0x06,0xce,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x02,0x87,0x04,0xde,0x00,0x19,0x00,0x33,0xb9,0x00,0x00,0x01, +0x50,0x40,0x09,0x03,0x03,0x01,0x1b,0x0e,0x0e,0x01,0x0e,0x09,0xbf,0x01,0x54,0x00,0x0f,0x00,0x12,0x01,0x4b,0x00,0x02,0x01,0x54,0x00,0x01,0x01,0x4d,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x37,0x21,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x36,0x36,0x33, +0x32,0x1e,0x04,0x15,0x02,0x87,0xfd,0xe0,0x13,0x01,0x62,0x0d,0x2b,0x52,0x44,0x0f,0x24,0x24,0x1f,0x08,0x18,0x1c,0x56,0x25,0x45,0x65,0x49,0x2f,0x1b,0x0b,0xa2,0x02,0x7b,0x41,0x6d,0x50,0x2c,0x02,0x03,0x04,0x02,0x94,0x06,0x08,0x22,0x3e,0x54,0x64,0x71,0x3a,0x00,0x02,0x00,0x96,0xff,0xed,0x04,0xf7,0x04,0xde,0x00,0x14,0x00,0x27, +0x00,0x32,0xb9,0x00,0x00,0x01,0x50,0xb3,0x15,0x15,0x29,0x1e,0xb8,0x01,0x50,0xb2,0x0a,0x1d,0x1a,0xbf,0x01,0x54,0x00,0x0b,0x00,0x10,0x01,0x4b,0x00,0x23,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x3e,0x03, +0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x04,0xf7,0x4f,0x96,0xd9,0x8a,0x89,0xca,0x85,0x41,0x3c,0x87,0x8f,0x92,0x45,0x8c,0xd5,0x8f,0x48,0xab,0x2f,0x63,0x9a,0x6b,0x63,0xc4,0x4f,0x22,0x55,0x90,0x6d,0x6f,0x9c,0x61,0x2d,0x02,0x56,0x82,0xe1,0xa7,0x5f,0x5b,0xa4,0xe3, +0x87,0x02,0x59,0x09,0x11,0x0d,0x08,0x61,0xac,0xee,0x8d,0x68,0xb5,0x85,0x4d,0x10,0x0b,0xfe,0x39,0x54,0xaa,0x8a,0x56,0x55,0x86,0xa5,0x00,0x01,0x00,0x59,0xff,0x94,0x04,0x2b,0x04,0xcd,0x00,0x17,0x00,0x3a,0xb2,0x10,0x0d,0x00,0xb8,0x01,0x50,0xb5,0x0d,0x0e,0x15,0x15,0x19,0x0f,0xb8,0x01,0x51,0xb7,0x0e,0x08,0x08,0x0e,0x0d,0x10, +0x16,0x0e,0xbb,0x01,0x4a,0x00,0x08,0x01,0x54,0x00,0x07,0x00,0x2f,0xed,0x3f,0x33,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x04,0x07,0x27,0x3e,0x03,0x37,0x01,0x33,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x2b,0x4d,0x86,0xb4,0xcd,0xdb,0x6b,0x2f,0x31,0x68,0x65,0x5f, +0x28,0xfe,0x72,0xb6,0x01,0x70,0x38,0x5e,0x46,0x27,0xa9,0x02,0x64,0x91,0xd3,0x95,0x61,0x3f,0x27,0x10,0xa5,0x05,0x0d,0x13,0x17,0x0d,0x04,0x4b,0xfb,0xe8,0x1b,0x46,0x5f,0x7c,0x50,0x02,0x8c,0x00,0x00,0x01,0x00,0x6c,0xfd,0xff,0x04,0x39,0x04,0xde,0x00,0x1b,0x00,0x3d,0xb9,0x00,0x00,0x01,0x50,0xb6,0x01,0x0e,0x01,0x0e,0x01,0x1d, +0x0d,0xbb,0x01,0x50,0x00,0x10,0x00,0x10,0x01,0x54,0xb4,0x0d,0x0d,0x1c,0x0c,0x07,0xbc,0x01,0x54,0x00,0x11,0x00,0x16,0x01,0x4b,0x00,0x00,0x00,0x2f,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x11,0x21,0x07,0x21, +0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x04,0x39,0xab,0x30,0x6a,0xaa,0x7a,0x16,0x34,0x33,0x2e,0x11,0x01,0x18,0x19,0xfe,0x59,0x24,0x57,0x5e,0x5f,0x2c,0xa5,0xeb,0x94,0x45,0xfd,0xff,0x04,0x73,0x81,0xb3,0x70,0x32,0x04,0x06,0x08,0x04,0xfe,0x65,0x96,0x02,0xaa,0x0b,0x12,0x0e,0x08,0x47,0x98,0xec,0xa5,0x00,0x00,0x01,0x00,0x96, +0xff,0xed,0x04,0x9c,0x04,0xde,0x00,0x27,0x00,0x51,0xb9,0x00,0x00,0x01,0x50,0xb6,0x13,0x1b,0x13,0x1b,0x13,0x29,0x1a,0xb8,0x01,0x50,0xb4,0x1d,0x0a,0x0a,0x1d,0x1d,0xb8,0x01,0x54,0xb4,0x1a,0x1a,0x0e,0x19,0x16,0x41,0x0a,0x01,0x54,0x00,0x1e,0x00,0x23,0x01,0x4b,0x00,0x0b,0x00,0x0e,0x01,0x54,0x00,0x0a,0x00,0x05,0x01,0x4e,0x00, +0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0x32,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x02,0x23,0x22,0x06,0x07,0x11,0x21,0x07,0x21,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x04,0x9c,0x54, +0x9c,0xde,0x8a,0x2d,0x70,0x74,0x70,0x2d,0x1c,0x4b,0xbc,0x7d,0x6a,0xa4,0x71,0x3a,0xca,0xd4,0x5c,0x94,0x26,0x01,0x4c,0x1c,0xfe,0x2b,0x2c,0x71,0x75,0x70,0x2c,0x8f,0xdf,0x9a,0x50,0x02,0x59,0xa0,0xea,0x98,0x4a,0x06,0x0c,0x14,0x0e,0x96,0x14,0x1c,0x32,0x6d,0xaf,0x7e,0xf2,0x01,0x03,0x11,0x0b,0xfe,0x7f,0x96,0x02,0x8b,0x0f,0x17, +0x10,0x08,0x50,0xa1,0xf2,0x00,0x00,0x01,0x00,0x1e,0xfd,0xff,0x04,0x03,0x04,0xe5,0x00,0x22,0x00,0x44,0xb3,0x17,0x09,0x06,0x0a,0xb8,0x01,0x50,0xb4,0x0b,0x0b,0x12,0x20,0x00,0xb8,0x01,0x50,0x40,0x0e,0x1f,0x1c,0x1c,0x24,0x13,0x12,0x12,0x13,0x13,0x17,0x06,0x0a,0x1f,0x20,0xba,0x01,0x4b,0x00,0x0a,0x01,0x4f,0x00,0x3f,0x3f,0x33, +0x12,0x39,0x39,0x33,0x2f,0x33,0x01,0x2f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x32,0x32,0x32,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x07,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x01,0x37,0x01,0x16,0x16,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x04,0x03,0x1e,0x44,0x70,0x52,0x61,0x05,0x02, +0xa9,0x0a,0x17,0x27,0x1e,0xfe,0xa8,0xab,0x01,0x36,0x1d,0x32,0x0c,0x4a,0x63,0x3b,0x19,0x1d,0x14,0xa3,0x17,0x1f,0x03,0xd4,0x59,0x96,0x7a,0x61,0x24,0x2b,0x26,0x50,0x20,0xfc,0xda,0x03,0x23,0x3a,0x62,0x5a,0x54,0x2d,0x02,0x05,0x40,0xfe,0x1f,0x2d,0x6b,0x2d,0x20,0x4e,0x60,0x72,0x44,0x4c,0x72,0x29,0x42,0x32,0x8e,0x00,0x00,0x01, +0x00,0x4b,0x00,0x00,0x04,0x25,0x04,0xd4,0x00,0x14,0x00,0x4e,0xb3,0x05,0x0d,0x0c,0x06,0xb8,0x01,0x51,0xb3,0x0a,0x0a,0x08,0x00,0xb8,0x01,0x50,0x40,0x10,0x12,0x12,0x08,0x16,0x0c,0x0b,0x0b,0x08,0x05,0x0d,0x06,0x0c,0x13,0x13,0x0b,0x0c,0xbd,0x01,0x4a,0x00,0x06,0x00,0x09,0x01,0x54,0x00,0x08,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f, +0x33,0x33,0x2f,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x13,0x07,0x21,0x37,0x21,0x01,0x37,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x25,0x28,0x48,0x64,0x3c,0xdc,0x2c,0xfc,0x86,0x2d,0x02,0xb3,0xfd,0x39,0x9a,0x01,0xc9,0x23,0x41, +0x32,0x1e,0xaa,0x03,0xd4,0x60,0x94,0x77,0x62,0x2f,0xfe,0xca,0xa2,0xa2,0x03,0xee,0x44,0xfd,0x74,0x15,0x42,0x5c,0x76,0x47,0x01,0x15,0x00,0x02,0x00,0x42,0xfd,0xff,0x04,0xd2,0x04,0xde,0x00,0x29,0x00,0x2d,0x00,0x46,0xb9,0x00,0x00,0x01,0x50,0xb6,0x15,0x09,0x15,0x09,0x15,0x2f,0x2a,0xb8,0x01,0x50,0xb2,0x1f,0x2b,0x2a,0xb8,0x01, +0x4f,0xb4,0x2c,0x2c,0x0a,0x1f,0x1a,0xbf,0x01,0x54,0x00,0x20,0x00,0x25,0x01,0x4b,0x00,0x0a,0x01,0x54,0x00,0x09,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x3f,0x01,0x2f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x07,0x0e,0x03,0x07,0x37,0x3e,0x03,0x37,0x37,0x3e,0x03,0x35, +0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x01,0x23,0x11,0x33,0x04,0xd2,0x02,0x02,0x08,0x10,0x60,0x9f,0xdf,0x90,0x15,0x5e,0x99,0x72,0x47,0x0c,0x0d,0x01,0x01,0x01,0x01,0x2a,0x58,0x88,0x5f,0x5b,0xa4,0x9b,0x97,0x4e,0x20,0x2d,0x7f,0x9a,0xad,0x5a,0x91,0xcf,0x85,0x3e,0xfc,0x9c,0xa9,0xa9,0x03, +0x4a,0x10,0x35,0x11,0x68,0xb7,0xf7,0x9a,0x4c,0x0b,0xa1,0x0b,0x35,0x69,0xaa,0x80,0x8a,0x09,0x1a,0x1b,0x1a,0x09,0x44,0x61,0x3e,0x1d,0x0a,0x11,0x18,0x0e,0xa6,0x06,0x10,0x0d,0x0a,0x32,0x65,0x97,0xfa,0x4f,0x04,0xe2,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x00,0x13,0x00,0x27,0xb9,0x00,0x00,0x01,0x50,0xb5,0x01,0x01, +0x15,0x08,0x08,0x05,0xbd,0x01,0x54,0x00,0x09,0x00,0x0e,0x01,0x4b,0x00,0x00,0x01,0x4d,0x00,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xcd,0xab,0xc0,0xb0,0x69,0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7, +0x8f,0x4f,0x02,0xea,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x05,0xd8,0x04,0xcd,0x00,0x31,0x00,0x56,0xbc,0x00,0x00,0x01,0x50,0x00,0x31,0x00,0x1b,0x01,0x50,0x40,0x0d,0x1a,0x31,0x1a,0x31,0x1a,0x33,0x0c,0x26,0x25,0x25,0x0e,0x0e,0x0d,0xb8,0x01,0x51,0xb2,0x0b,0x0c, +0x25,0xb8,0x01,0x54,0xb3,0x0e,0x0e,0x00,0x26,0xba,0x01,0x54,0x00,0x0b,0x01,0x4d,0xb2,0x1a,0x0c,0x00,0xb8,0x01,0x4a,0x00,0x3f,0x32,0x32,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x07,0x06,0x06,0x07,0x0e,0x03,0x23,0x21, +0x03,0x33,0x13,0x3e,0x05,0x37,0x36,0x36,0x37,0x36,0x37,0x33,0x06,0x07,0x06,0x06,0x07,0x0e,0x03,0x07,0x17,0x21,0x32,0x3e,0x02,0x37,0x36,0x36,0x37,0x36,0x37,0x05,0xd8,0x06,0x0a,0x08,0x1a,0x14,0x13,0x4f,0x7e,0xaf,0x73,0xfd,0x97,0xb9,0xb3,0x6b,0x3b,0x5f,0x4a,0x38,0x2a,0x1d,0x09,0x05,0x0a,0x05,0x05,0x05,0xb0,0x04,0x05,0x05, +0x0a,0x06,0x0e,0x3e,0x76,0xb9,0x89,0x18,0x01,0xd6,0x3c,0x6b,0x58,0x40,0x10,0x16,0x1c,0x08,0x0a,0x05,0x04,0xcd,0x33,0x54,0x48,0xe8,0xab,0xa8,0xeb,0x94,0x44,0x04,0xcd,0xfd,0x0e,0x12,0x24,0x31,0x44,0x61,0x85,0x5a,0x2e,0x5d,0x26,0x2d,0x29,0x24,0x2c,0x26,0x62,0x39,0x8a,0xc9,0x93,0x66,0x27,0xa7,0x27,0x64,0xad,0x85,0xa6,0xea, +0x4c,0x59,0x39,0x00,0x00,0x01,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x00,0x2d,0x00,0x47,0xb2,0x22,0x22,0x0b,0xb8,0x01,0x50,0xb3,0x1e,0x1e,0x15,0x00,0xb8,0x01,0x50,0x40,0x09,0x01,0x01,0x2f,0x15,0x22,0x0a,0x0a,0x1f,0x07,0x41,0x09,0x01,0x54,0x00,0x23,0x00,0x28,0x01,0x4b,0x00,0x1a,0x01,0x54,0x00,0x12,0x01,0x4e,0x00,0x01, +0x00,0x2f,0x3f,0xed,0x3f,0x33,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x06,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x05, +0x23,0xab,0x39,0x71,0xaa,0x71,0x33,0x6f,0x39,0x04,0x12,0x24,0x42,0x64,0x48,0x1d,0x3e,0x21,0x13,0x14,0x20,0x0f,0x2e,0x3e,0x27,0x11,0x2c,0x4c,0x1e,0x13,0x37,0x81,0x8f,0x9a,0x4f,0x7c,0xd5,0x9d,0x5a,0x02,0xea,0x61,0x86,0x54,0x26,0x08,0x06,0xfd,0x73,0x3d,0x72,0x64,0x54,0x3b,0x21,0x04,0x05,0x91,0x04,0x01,0x1f,0x44,0x69,0x49, +0x02,0x90,0x07,0x0f,0x06,0xa5,0x09,0x10,0x0d,0x08,0x36,0x77,0xba,0x84,0xff,0xff,0x00,0xbe,0x00,0x00,0x03,0x70,0x04,0xcd,0x00,0x26,0x0b,0x6d,0x00,0x00,0x00,0x07,0x0b,0x6d,0x02,0x09,0x00,0x00,0xff,0xff,0x00,0xbe,0x00,0x00,0x03,0x70,0x04,0xcd,0x00,0x27,0x0b,0x6d,0x02,0x09,0x00,0x00,0x00,0x06,0x0b,0x71,0x00,0x00,0xff,0xff, +0x00,0xbe,0x02,0x27,0x03,0x70,0x04,0xcd,0x00,0x26,0x0b,0x71,0x00,0x00,0x00,0x07,0x0b,0x71,0x02,0x09,0x00,0x00,0x00,0x01,0x00,0x6e,0x03,0x0e,0x01,0x70,0x04,0xcc,0x00,0x03,0x00,0x11,0xb5,0x03,0x00,0x01,0x02,0x00,0x02,0x00,0x2f,0xcd,0x01,0x2f,0x33,0xcd,0x32,0x30,0x31,0x01,0x03,0x23,0x13,0x01,0x70,0x8c,0x76,0x6f,0x04,0xcc, +0xfe,0x42,0x01,0xbe,0x00,0x02,0x00,0x6e,0x03,0x0e,0x02,0xa0,0x04,0xcc,0x00,0x03,0x00,0x07,0x00,0x20,0x40,0x0d,0x03,0x00,0x01,0x02,0x07,0x04,0x05,0x06,0x00,0x02,0x02,0x04,0x06,0x00,0x2f,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0x33,0xdd,0x32,0xd6,0x32,0xcd,0x32,0x30,0x31,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c,0x76, +0x6c,0x9a,0x8c,0x76,0x6f,0x04,0xcc,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x53,0x01,0x48,0x02,0xfb,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x5b,0x00,0xce,0x02,0xfb, +0xff,0xff,0xff,0x51,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x06,0x0b,0x5c,0xad,0x00,0xff,0xff,0xff,0x51,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x26,0x0b,0x5c,0xad,0x00,0x00,0x07,0x0b,0x5e,0x01,0xc6,0x00,0x00,0x00,0x03,0x00,0xbe,0x01,0x58,0x03,0x95,0x04,0xcd,0x00,0x03, +0x00,0x07,0x00,0x0b,0x00,0x30,0xb1,0x03,0x0b,0xb8,0x01,0x50,0xb3,0x0a,0x0a,0x0d,0x07,0xb8,0x01,0x50,0xb2,0x02,0x06,0x0a,0xb8,0x01,0x4b,0xb4,0x00,0x02,0x09,0x04,0x06,0xb8,0x01,0x4b,0x00,0x3f,0xdd,0x32,0xde,0xcd,0x3f,0x01,0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x01,0x21,0x35,0x21,0x25,0x23,0x11,0x33,0x01,0x23, +0x11,0x33,0x03,0x95,0xfd,0x29,0x02,0xd7,0xfd,0xd2,0xa9,0xa9,0x02,0x2e,0xa9,0xa9,0x01,0x58,0x6a,0x65,0x02,0xa6,0xfd,0x5a,0x02,0xa6,0x00,0x01,0x00,0x59,0x00,0x00,0x04,0x2b,0x04,0xcd,0x00,0x16,0x00,0x3a,0xb2,0x0f,0x0c,0x16,0xb8,0x01,0x50,0xb5,0x0c,0x0d,0x15,0x15,0x18,0x0e,0xb8,0x01,0x51,0xb7,0x0d,0x08,0x08,0x0d,0x0c,0x0f, +0x16,0x0e,0xbb,0x01,0x4a,0x00,0x08,0x01,0x54,0x00,0x07,0x00,0x2f,0xed,0x3f,0x33,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x03,0x23,0x23,0x27,0x33,0x32,0x32,0x37,0x01,0x33,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x2b,0x4d,0x86,0xb4,0xaf,0x9a,0xca,0x2f,0xcd,0x33, +0x53,0x2b,0xfe,0x79,0xb6,0x01,0x70,0x38,0x5e,0x46,0x27,0xa9,0x02,0x80,0x91,0xd3,0x95,0x61,0x26,0xa2,0x08,0x04,0x23,0xfc,0x04,0x1b,0x46,0x5f,0x7c,0x50,0x02,0x70,0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x06,0x0b,0x68,0x00,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x02,0x06,0x0b,0x6b,0x00,0x00, +0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x02,0x06,0x0b,0x6c,0x00,0x00,0xff,0xff,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x02,0x06,0x0b,0x73,0x00,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x06,0x0b,0x74,0x00,0x00,0xff,0xff,0x00,0xbe,0x00,0x00,0x04,0xe2,0x04,0xde,0x02,0x06,0x0b,0x75,0x00,0x00, +0xff,0xff,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x02,0x06,0x0b,0x80,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x02,0x06,0x0b,0x82,0x00,0x00,0x00,0x01,0x00,0x5f,0x02,0x12,0x04,0x0b,0x04,0x2b,0x00,0x07,0x00,0x19,0xb1,0x07,0x05,0xb8,0x01,0x50,0xb5,0x02,0x04,0x06,0x00,0x02,0x04,0x00,0x2f,0xde,0xcd,0x33, +0x01,0x2f,0xce,0xfd,0xce,0x30,0x31,0x01,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x0b,0xfc,0x54,0x01,0x93,0x85,0x01,0x94,0x02,0x12,0x86,0x01,0x93,0xfe,0x6d,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xde,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x63,0x03,0x25,0x00,0x00,0xff,0xff,0x00,0x61,0x00,0x00,0x05,0xd8, +0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x64,0x03,0x25,0x00,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xde,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x27,0x0b,0x63,0x03,0x25,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0x61,0x00,0x00,0x05,0xd8,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00, +0x00,0x27,0x0b,0x64,0x03,0x25,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0xa5,0xff,0x38,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5a,0x01,0xae,0x00,0x00,0xff,0xff,0x00,0xa5,0xfe,0x59,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5b,0x01,0xae,0x00,0x00, +0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0x3a,0xfe,0x43,0xff,0xff,0x00,0x50,0x00,0x00,0x04,0x3c,0x04,0xde,0x02,0x26,0x0b,0x69,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xd3,0x00,0x00,0xff,0xff,0x00,0x31,0x00,0x00,0x03,0x17,0x04,0xcd,0x02,0x26,0x0b,0x6a,0x00,0x00, +0x00,0x07,0x0b,0x5e,0x01,0x10,0x00,0x8c,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x02,0x26,0x0b,0x6b,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x36,0x00,0x00,0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x02,0x26,0x0b,0x6c,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xb8,0x00,0x00,0xff,0xff,0xff,0xfb,0x00,0x00,0x01,0xad, +0x04,0xcd,0x00,0x26,0x0b,0x6d,0x46,0x00,0x00,0x06,0x0b,0x5e,0x56,0x00,0xff,0xff,0xff,0xfa,0x00,0x00,0x02,0x87,0x04,0xcd,0x00,0x26,0x0b,0x6e,0x28,0x00,0x00,0x06,0x0b,0x5e,0x55,0x00,0xff,0xff,0x00,0xa0,0xff,0xed,0x05,0x01,0x04,0xdd,0x02,0x26,0x0b,0x70,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xc7,0x00,0x00,0xff,0xff,0xff,0xfb, +0x02,0x27,0x01,0xad,0x04,0xcd,0x00,0x26,0x0b,0x71,0x46,0x00,0x00,0x07,0x0b,0x5e,0x00,0x56,0x01,0x0e,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xa4,0x00,0x00,0xff,0xff,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x02,0x26,0x0b,0x73,0x00,0x00,0x00,0x07,0x0b,0x5e, +0x01,0xa4,0x00,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xc6,0x00,0x00,0xff,0xff,0x00,0xa4,0xff,0xed,0x04,0xe8,0x04,0xe5,0x02,0x26,0x0b,0x76,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xd2,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x87,0x04,0xde,0x02,0x26, +0x0b,0x78,0x00,0x00,0x00,0x07,0x0b,0x5e,0x00,0xfa,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0xed,0x04,0xf7,0x04,0xde,0x02,0x26,0x0b,0x79,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xb2,0x00,0x00,0xff,0xff,0x00,0x6c,0xfd,0xff,0x04,0x39,0x04,0xde,0x02,0x26,0x0b,0x7b,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xd5,0xff,0xd9,0xff,0xff,0x00,0x96, +0xff,0xed,0x04,0x9c,0x04,0xde,0x02,0x26,0x0b,0x7c,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0x2f,0xff,0xf7,0xff,0xff,0x00,0x4b,0x00,0x00,0x04,0x25,0x04,0xd4,0x02,0x26,0x0b,0x7e,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x68,0xff,0x16,0xff,0xff,0x00,0x42,0xfd,0xff,0x04,0xd2,0x04,0xde,0x02,0x26,0x0b,0x7f,0x00,0x00,0x00,0x07,0x0b,0x5e, +0x02,0xad,0x00,0x00,0xff,0xff,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x80,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xb3,0x00,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xd8,0x04,0xcd,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x02,0x26, +0x0b,0x82,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0x20,0x00,0x00,0xff,0xff,0x00,0xb5,0x00,0x00,0x01,0x6e,0x06,0x05,0x02,0x26,0x0b,0x6d,0x00,0x00,0x00,0x07,0x0b,0x5c,0x01,0x11,0x00,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x04,0x3c,0x05,0xd5,0x02,0x26,0x0b,0x69,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xea,0x00,0x00,0xff,0xff,0x00,0x4e, +0xff,0xed,0x03,0xeb,0x05,0xd5,0x02,0x26,0x0b,0x73,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xc7,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0xed,0x04,0x9c,0x05,0xd5,0x02,0x26,0x0b,0x7c,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0x44,0x00,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x04,0xba,0x06,0xa0,0x00,0x1b,0x00,0x40,0xb6,0x17,0x06,0x12,0x0c,0x0b, +0x0b,0x01,0xb8,0x01,0x50,0xb3,0x1a,0x1a,0x1d,0x12,0xb8,0x01,0x50,0xb7,0x0f,0x06,0x17,0x0b,0x12,0x12,0x0f,0x1b,0xbc,0x01,0x4a,0x00,0x10,0x01,0x4c,0x00,0x0b,0x01,0x4d,0x00,0x3f,0x3f,0x3f,0x33,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x33,0x12,0x39,0x39,0x31,0x30,0x01,0x11,0x14,0x0e,0x02,0x07, +0x1e,0x03,0x17,0x23,0x02,0x00,0x25,0x11,0x33,0x11,0x16,0x16,0x17,0x16,0x17,0x36,0x36,0x35,0x11,0x04,0x89,0x28,0x4a,0x68,0x41,0x24,0x52,0x57,0x57,0x28,0xcb,0xc4,0xfe,0x36,0xfe,0xf8,0xaa,0x6f,0xc2,0x48,0x54,0x47,0x5c,0x6c,0x04,0xcd,0xfe,0xc1,0x52,0x83,0x6c,0x58,0x29,0x2b,0x6e,0x79,0x7e,0x3c,0x01,0x23,0x02,0x19,0xf6,0x02, +0x6e,0xfd,0xde,0x6f,0xd2,0x51,0x5f,0x55,0x35,0x99,0x6a,0x01,0x5d,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x09,0x9a,0x06,0xe8,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x18,0x00,0x1c,0x00,0x21,0x00,0x2c,0x00,0x31,0x00,0x35,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4e,0x00,0x55,0x00,0x5c,0x00,0x64,0x00,0xee,0x40,0x10,0x05,0x32,0x06,0x33, +0x0a,0x19,0x46,0x1a,0x47,0x4b,0x2d,0x61,0x4a,0xce,0x3c,0x36,0xb8,0x01,0x50,0xb2,0x5d,0x53,0x5a,0x41,0x0a,0x01,0x52,0x00,0x25,0x00,0x29,0x01,0x52,0x00,0x4f,0x00,0x22,0x01,0x50,0x00,0x56,0x00,0x0d,0x01,0x50,0x40,0x28,0x16,0x02,0x1e,0x3c,0x5d,0x25,0x4f,0x56,0x16,0x1e,0x1e,0x16,0x56,0x4f,0x25,0x5d,0x3c,0x07,0x0a,0x42,0xce, +0x43,0x2f,0x4b,0x09,0x00,0x1d,0xce,0x0a,0x0b,0x44,0x30,0x0a,0x43,0x48,0x20,0x4c,0x0f,0x25,0x39,0xb8,0x01,0x56,0xb4,0x63,0x14,0x5a,0x63,0x59,0xb8,0x01,0x56,0xb2,0x53,0x52,0x5f,0xb8,0x01,0x56,0x40,0x19,0x3f,0x26,0x17,0x3f,0x01,0x2f,0x4c,0x63,0x53,0x3f,0x2f,0x2f,0x3f,0x53,0x63,0x4c,0x05,0x30,0x34,0x48,0x1e,0x33,0x47,0x03, +0x4b,0xb8,0x01,0x4d,0xb6,0x06,0x1a,0x03,0x07,0x1b,0x03,0x30,0x00,0x2f,0x17,0x33,0xc4,0x32,0x3f,0x17,0x33,0xc4,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x10,0xc6,0x32,0x10,0xc6,0x32,0x01,0x2f,0xe4,0x32,0x32,0x2f,0x33,0x33, +0xe4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x10,0xe4,0x32,0x32,0x10,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0x31,0x30,0x01,0x23,0x01,0x35,0x21,0x05,0x21,0x35,0x21,0x01,0x23,0x11,0x33,0x01,0x10,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x35,0x11, +0x33,0x01,0x21,0x35,0x21,0x01,0x21,0x35,0x01,0x33,0x01,0x14,0x21,0x21,0x11,0x21,0x20,0x15,0x14,0x07,0x16,0x01,0x01,0x23,0x11,0x21,0x01,0x21,0x35,0x21,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x23,0x11,0x33,0x01,0x21,0x35,0x21,0x05,0x21,0x11,0x33,0x01,0x01,0x34,0x23,0x23,0x15,0x33,0x32,0x17,0x34, +0x23,0x23,0x11,0x33,0x32,0x01,0x10,0x23,0x22,0x11,0x10,0x33,0x32,0x09,0x9a,0x78,0xfe,0xf3,0x01,0x85,0xfd,0x4e,0xfe,0x7d,0x01,0x83,0x02,0xb2,0x78,0x78,0xfe,0xc0,0xfd,0x67,0x3d,0x55,0x20,0x2f,0x71,0x8c,0xfb,0xda,0xfe,0x7e,0x01,0x82,0x05,0x66,0xfe,0x7b,0x01,0x0d,0x78,0xfd,0x12,0xfe,0xb7,0xfe,0xe0,0x01,0x1b,0x01,0x2a,0x6a, +0x8e,0xfa,0xd9,0xfe,0xf3,0x78,0x01,0x85,0x05,0x63,0xfe,0x7d,0x01,0x83,0xfd,0x19,0xc5,0xb8,0xb8,0xc0,0xc0,0xb8,0xb8,0xc5,0xfc,0x77,0x78,0x78,0x03,0xbc,0xfe,0x7e,0x01,0x82,0xfd,0x51,0xfe,0x7b,0x78,0x01,0x0d,0x04,0x79,0xc5,0x6c,0x7a,0xb7,0x22,0xcc,0x87,0x96,0xbd,0xfd,0x54,0xf0,0xec,0xec,0xf0,0x05,0x65,0x01,0x09,0x7a,0x7a, +0x7a,0xfb,0xca,0x01,0x82,0xfe,0xa8,0xfe,0xe1,0x36,0x5e,0x1e,0xa4,0x02,0x45,0x01,0x52,0x7a,0xf9,0x18,0x78,0x01,0x0d,0x01,0x41,0xfa,0x03,0x50,0xe0,0x6f,0x3d,0x36,0x03,0x14,0xfe,0xf7,0x01,0x83,0xf9,0x18,0x78,0x02,0xfa,0xd1,0xe4,0xe4,0xd1,0xd1,0xe7,0xe7,0xfe,0x6f,0x01,0x82,0xfb,0xcc,0x78,0x78,0x01,0x85,0xfe,0xf3,0x03,0xb8, +0x75,0xe6,0xf9,0x82,0xfe,0xf7,0x01,0x33,0x01,0x43,0xfe,0xbd,0xfe,0xc1,0x00,0x01,0x00,0x00,0xfe,0x09,0x01,0xb0,0xff,0x9e,0x00,0x07,0x00,0x1a,0x40,0x0a,0x07,0x01,0x06,0x04,0x02,0x01,0x04,0x06,0x06,0x09,0x11,0x00,0x33,0x2f,0xdd,0x32,0xcd,0x01,0x2f,0xcd,0xdd,0xcd,0x30,0x31,0x05,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x01,0xb0, +0xa5,0x66,0xa5,0x01,0xb0,0xc8,0xfe,0xd1,0x01,0x2f,0x66,0x00,0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x01,0x07,0x0b,0x5e,0x02,0x2a,0xfe,0x6f,0x00,0x0f,0xb1,0x01,0x2c,0xb8,0xff,0xc0,0xb3,0x10,0x10,0x36,0x2c,0x00,0x11,0x2b,0x35,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0, +0x02,0x06,0x0b,0x74,0x00,0x00,0xff,0xff,0x00,0x59,0xff,0x04,0x04,0xba,0x06,0xa0,0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x58,0x02,0x3f,0x00,0x00,0xff,0xff,0x00,0x59,0xfd,0xff,0x04,0xba,0x06,0xa0,0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x59,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x59,0xfd,0xff,0x05,0x40,0x06,0xa0, +0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x54,0x02,0x63,0x00,0x00,0x00,0x01,0xff,0x43,0xfe,0x09,0x00,0xbe,0xff,0xb1,0x00,0x18,0x00,0x2a,0x40,0x12,0x02,0x18,0x12,0x11,0x08,0x0b,0x11,0x13,0x05,0x40,0x10,0x10,0x01,0x0a,0xc0,0x11,0x11,0x1a,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x32,0x39,0x2f,0x1a,0xcd,0x33,0x01,0x2f,0xdc,0xcd, +0x10,0xdd,0xdc,0xcd,0x30,0x31,0x13,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x1e,0x03,0x15,0xbe,0x66,0x27,0x30,0x31,0x27,0x66,0x0e,0x20,0x35,0x27,0x66,0x28,0x35,0x20,0x0e,0xfe,0x09,0x76,0x35,0x2f,0x2f,0x35,0x76,0x77,0x26,0x40,0x31,0x20,0x06,0x74,0x74,0x06,0x20,0x31,0x40, +0x26,0x00,0x00,0x03,0xff,0x15,0x05,0x4e,0x00,0xeb,0x07,0x0a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3f,0xb9,0x00,0x06,0x01,0x51,0xb3,0x00,0x00,0x0c,0x1e,0xbe,0x01,0x51,0x00,0x18,0x00,0x12,0x01,0x51,0x00,0x0c,0x00,0x1b,0x01,0x55,0xb3,0x21,0x21,0x15,0x03,0xbd,0x01,0x55,0x00,0x09,0x00,0x0f,0x01,0x55,0x00,0x15,0x05,0x10,0x00, +0x3f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xde,0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x03,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x07,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x5d,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34, +0x8e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x1d,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x06,0xaf,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xff,0x73,0x05,0x4e,0x00,0x8e,0x07,0x0a,0x00,0x0b,0x00,0x24,0x40,0x0f,0x04,0x02,0x00,0x40, +0x0a,0x08,0x06,0x07,0x03,0x09,0x01,0x04,0x0b,0xc0,0x05,0xb8,0x05,0x10,0x00,0x3f,0x1a,0xcc,0x17,0x39,0x01,0x2f,0x33,0x33,0x1a,0xcc,0x32,0x32,0x30,0x31,0x13,0x07,0x17,0x07,0x17,0x07,0x23,0x37,0x27,0x37,0x27,0x37,0x8e,0xa1,0xa1,0xa1,0xa1,0xa1,0x7a,0xa1,0xa1,0xa1,0xa1,0xa1,0x07,0x0a,0x59,0x59,0x58,0x59,0x59,0x59,0x59,0x58, +0x59,0x59,0x00,0x02,0xff,0xa1,0x05,0x4e,0x00,0x5f,0x07,0x0a,0x00,0x0b,0x00,0x17,0x00,0x2a,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0x41,0x09,0x01,0x51,0x00,0x06,0x00,0x15,0x01,0x55,0x00,0x0f,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xfd,0xde,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23, +0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x27,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5f,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0xff,0x49,0x05,0x4e,0x00,0xb8, +0x07,0x0a,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x32,0xb9,0x00,0x04,0x01,0x51,0xb2,0x0a,0x0a,0x10,0xb8,0x01,0x51,0xb4,0x16,0x03,0x02,0x03,0x19,0xbe,0x01,0x55,0x00,0x13,0x00,0x0d,0x01,0x55,0x00,0x00,0x00,0x07,0x05,0x10,0x00,0x3f,0x33,0xfd,0xde,0xed,0x32,0x01,0x2f,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30,0x31,0x03,0x23,0x11,0x33, +0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x27,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x51,0x66,0x66,0x01,0x09,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x58,0x01,0xa8,0xfe,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c, +0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0x45,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x08,0x05,0x00,0x08,0x09,0x03,0x03,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xcd,0xcc,0x30,0x31,0x07,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x15,0x22,0x26,0xbb,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0xa0,0x25,0x2c,0x31,0x23, +0x96,0x64,0x64,0xa7,0x00,0x01,0xff,0x61,0x05,0x4e,0x00,0x9f,0x06,0xdf,0x00,0x03,0x00,0x10,0xb3,0x00,0x02,0x03,0x01,0xb8,0x05,0x10,0x00,0x3f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x13,0x07,0x27,0x37,0x9f,0x9f,0x9f,0x9f,0x06,0x17,0xc9,0xc9,0xc8,0x00,0x00,0x01,0xfe,0xab,0x05,0x4e,0x01,0x56,0x06,0xa3,0x00,0x31,0x00,0x2d,0x40,0x12, +0x00,0x19,0x0f,0x24,0x21,0x28,0x0b,0x08,0x0f,0x08,0x21,0x2d,0x25,0x05,0x14,0x1e,0x0c,0x2d,0xb8,0x05,0x10,0x00,0x3f,0x33,0xcd,0xdd,0xcd,0x33,0x12,0x39,0x39,0x01,0x2f,0xcd,0x33,0xdc,0xcd,0x33,0x12,0x39,0x39,0x30,0x31,0x03,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02, +0x17,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x1b,0x1c,0x28,0x21,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2c,0x17,0x1b,0x28,0x20,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2b,0x05, +0xdf,0x26,0x31,0x1b,0x0b,0x32,0x2d,0x29,0x31,0x0d,0x48,0x14,0x56,0x45,0x24,0x3d,0x2c,0x19,0x15,0x26,0x36,0x1f,0x26,0x31,0x1b,0x0b,0x32,0x2c,0x29,0x32,0x0d,0x47,0x14,0x56,0x45,0x23,0x3e,0x2c,0x19,0x15,0x26,0x37,0x00,0x01,0xfe,0x26,0x05,0x57,0xff,0x9c,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x05,0x00,0x09,0x08,0x09,0x02,0xb8, +0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xdc,0xcd,0x30,0x31,0x03,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0x64,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0x05,0xaa,0x26,0x2d,0x32,0x24,0x91,0x67,0x64,0xab,0x00,0x01,0x00,0x64,0xfe,0x09,0x01,0xc4,0xff,0xb1,0x00,0x05,0x00,0x40,0x40,0x22,0xb4,0x02,0x01,0x03,0x01,0x00, +0x44,0x04,0x54,0x04,0x02,0xcb,0x04,0x01,0x04,0x80,0xcb,0x05,0x01,0x85,0x05,0x01,0x05,0x02,0x02,0x07,0x02,0x05,0x05,0x01,0xc0,0x03,0x03,0x07,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x39,0x3d,0x2f,0x33,0x11,0x01,0x33,0x18,0x2f,0x33,0x5d,0x5d,0x1a,0xcd,0x5d,0x71,0x32,0x39,0x39,0x5d,0x30,0x31,0x01,0x23,0x27,0x37,0x33,0x07,0x01,0xc4, +0x8d,0xd3,0xd3,0x8d,0xd2,0xfe,0x09,0xd4,0xd4,0xd4,0x00,0x02,0xff,0x42,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x17,0x00,0x27,0xb3,0x04,0x00,0x07,0x0c,0xb8,0x01,0x51,0xb5,0x12,0x04,0x03,0x0a,0x0a,0x0f,0xb8,0x01,0x55,0xb2,0x15,0x15,0x19,0x11,0x00,0x33,0x2f,0xed,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xfd,0xde,0xcd,0xce,0x30, +0x31,0x17,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x07,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0xc0,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa0,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x3a,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0x45, +0x05,0x57,0x00,0xbb,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x07,0x03,0x00,0x04,0x03,0x09,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcc,0xcd,0x30,0x31,0x03,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x01,0x00,0x64, +0x05,0x57,0x01,0xda,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x07,0x03,0x00,0x04,0x03,0x09,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcc,0xcd,0x30,0x31,0x13,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x64,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x02,0xfe,0xe1, +0x05,0x57,0x01,0x1f,0x07,0x09,0x00,0x0b,0x00,0x17,0x00,0x25,0x40,0x0e,0x13,0x10,0x0c,0x0c,0x03,0x07,0x00,0x10,0x0f,0x0f,0x04,0x03,0x15,0x09,0xb8,0x05,0x10,0x00,0x3f,0x33,0xdc,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0xcc,0x32,0x2f,0xcc,0xcd,0x30,0x31,0x01,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x25,0x34,0x36, +0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0xfe,0xe1,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0x01,0x20,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x25,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x04,0xfe,0x06,0x05,0x35,0x01,0xfa,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x2b,0x00,0x37, +0x00,0x44,0x40,0x1f,0x29,0x32,0x1e,0x2c,0x24,0x2b,0x1e,0x02,0x16,0x00,0x0d,0x10,0x07,0x29,0x2a,0x35,0x2a,0x27,0x27,0x04,0x02,0x01,0x13,0x04,0x2f,0x21,0x21,0x19,0x0a,0x01,0x04,0x00,0x2f,0xce,0xdc,0xcd,0x33,0x2f,0xcd,0x10,0xcd,0x11,0x39,0x11,0x33,0x2f,0xce,0xcd,0x11,0x39,0x01,0x2f,0xcd,0xdc,0xce,0xcd,0x32,0xde,0xce,0xdc, +0xcd,0x10,0xcd,0x32,0x30,0x31,0x03,0x07,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x28,0x3e, +0x6d,0x29,0x3f,0x4f,0x70,0x71,0x4e,0x54,0x6f,0x1c,0xfe,0xeb,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x02,0x3d,0x1c,0x6f,0x54,0x4e,0x71,0x70,0x4f,0x3f,0x29,0x6d,0x3e,0x01,0x81,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0x73,0x3e,0x6e,0x1e,0x6f,0x53,0x50,0x73,0x70,0x53,0x3e,0x28,0x66,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44, +0x95,0x28,0x3e,0x53,0x70,0x73,0x50,0x53,0x6f,0x1e,0x6e,0x3e,0xd4,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44,0x00,0x02,0xff,0x17,0x05,0x35,0x00,0xe9,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x24,0x40,0x0f,0x0d,0x16,0x02,0x10,0x08,0x0f,0x02,0x0d,0x0e,0x19,0x0e,0x0b,0x13,0x05,0x0b,0x00,0x2f,0xdc,0xcd,0x10,0xce,0xcd,0x11,0x39,0x01,0x2f, +0xce,0xdc,0xcd,0x10,0xcd,0x32,0x30,0x31,0x03,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x7d,0x1c,0x6f,0x54,0x4e,0x71,0x70,0x4f,0x3f,0x29,0x6d,0x3e,0x01,0x81,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0xe1,0x28,0x3e,0x53,0x70, +0x73,0x50,0x53,0x6f,0x1e,0x6e,0x3e,0xd4,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44,0x00,0x00,0x01,0xff,0x5b,0x05,0x58,0x00,0xa6,0x07,0x00,0x00,0x11,0x00,0x2f,0x40,0x15,0x06,0x0a,0x09,0x11,0x40,0x00,0xc0,0x09,0x04,0x40,0x0d,0x40,0x09,0x10,0x48,0x0d,0x0d,0x11,0x09,0xc0,0x07,0xb8,0x05,0x10,0x00,0x3f,0x1a,0xcd,0x32,0x39,0x2f,0x2b, +0x1a,0xcd,0x01,0x2f,0x1a,0xdc,0x1a,0xcd,0x10,0xcd,0x32,0x30,0x31,0x13,0x15,0x14,0x06,0x23,0x22,0x27,0x15,0x23,0x11,0x33,0x15,0x16,0x33,0x32,0x36,0x35,0x35,0xa6,0x57,0x57,0x22,0x17,0x64,0x64,0x0f,0x1c,0x30,0x26,0x07,0x00,0x76,0x58,0x65,0x0a,0x7f,0x01,0xa8,0xcf,0x0b,0x2c,0x39,0x75,0x00,0x01,0xff,0x43,0xfe,0x09,0x00,0xbe, +0xff,0xb1,0x00,0x18,0x00,0x30,0x40,0x17,0x09,0x0a,0x10,0x13,0x01,0x00,0x13,0x10,0x13,0x40,0x05,0x40,0x09,0x10,0x48,0x05,0x05,0x12,0xc0,0x09,0x01,0x01,0x1a,0x11,0x00,0x33,0x2f,0x33,0x1a,0xcc,0x39,0x2f,0x2b,0x1a,0xcd,0x32,0x01,0x2f,0xdd,0xcd,0x10,0xdd,0xdd,0xcd,0x30,0x31,0x07,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35, +0x33,0x15,0x14,0x0e,0x02,0x07,0x15,0x23,0x35,0x2e,0x03,0x35,0xbd,0x66,0x27,0x30,0x31,0x27,0x66,0x0e,0x20,0x35,0x27,0x66,0x28,0x35,0x20,0x0e,0x4f,0x76,0x35,0x2f,0x2f,0x35,0x76,0x77,0x26,0x40,0x31,0x20,0x06,0x74,0x74,0x06,0x20,0x31,0x40,0x26,0x00,0x01,0xff,0x6a,0xfe,0x09,0x00,0x96,0xff,0xb1,0x00,0x05,0x00,0x15,0xb7,0x05, +0x02,0x04,0x02,0x01,0x05,0x05,0x07,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xce,0xcd,0x30,0x31,0x13,0x21,0x35,0x33,0x11,0x33,0x96,0xfe,0xd4,0xc6,0x66,0xfe,0x09,0x66,0x01,0x42,0x00,0x00,0x01,0xff,0x4b,0xfe,0x09,0x00,0xab,0xff,0xb1,0x00,0x05,0x00,0x40,0x40,0x22,0xb4,0x02,0x01,0x03,0x01,0x00,0x44,0x04,0x54,0x04,0x02,0xcb, +0x04,0x01,0x04,0x80,0xcb,0x05,0x01,0x85,0x05,0x01,0x05,0x02,0x02,0x07,0x02,0x05,0x05,0x01,0xc0,0x03,0x03,0x07,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x39,0x3d,0x2f,0x33,0x11,0x01,0x33,0x18,0x2f,0x33,0x5d,0x5d,0x1a,0xcd,0x5d,0x71,0x32,0x39,0x39,0x5d,0x30,0x31,0x13,0x23,0x27,0x37,0x33,0x07,0xab,0x8d,0xd3,0xd3,0x8d,0xd2,0xfe,0x09, +0xd4,0xd4,0xd4,0x00,0x00,0x01,0xff,0x45,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x04,0x00,0x07,0x04,0x03,0x0a,0x0a,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xcd,0xce,0x30,0x31,0x17,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0xa0,0xba,0xa7,0x64,0x64, +0x96,0x23,0x31,0x2c,0x00,0x02,0xfe,0xe1,0xfd,0xff,0x01,0x1f,0xff,0xb1,0x00,0x0b,0x00,0x17,0x00,0x26,0x40,0x10,0x00,0x07,0x04,0x04,0x0c,0x10,0x13,0x10,0x0f,0x0f,0x04,0x03,0x16,0x0a,0x0a,0x19,0x11,0x00,0x33,0x2f,0x33,0xdc,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0xce,0xcd,0x32,0x10,0xde,0xcd,0x30,0x31,0x05,0x14,0x06,0x23,0x35,0x32, +0x36,0x35,0x34,0x27,0x33,0x16,0x05,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x01,0x1f,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0xfe,0xe0,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0xa0,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x25,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x00,0x01,0xff,0x68,0xfd,0xff,0x00,0x99,0xff,0xbb, +0x00,0x09,0x00,0x2a,0x40,0x11,0x04,0x09,0x00,0x08,0x80,0x05,0x03,0x09,0x07,0x04,0x04,0x03,0x02,0x08,0x07,0x07,0x0b,0x11,0x00,0x33,0x2f,0x33,0xcc,0x32,0x39,0x19,0x2f,0x12,0x39,0x01,0x18,0x2f,0x33,0x1a,0xcc,0x32,0x39,0x39,0x30,0x31,0x13,0x07,0x07,0x35,0x37,0x27,0x37,0x37,0x15,0x07,0x99,0x4d,0xe4,0xa8,0xa8,0x4d,0xe4,0xaa, +0xfe,0x67,0x41,0x27,0x5c,0x1b,0xdd,0x41,0x27,0x59,0x1e,0x00,0x00,0x01,0xff,0x45,0x05,0x4d,0x00,0xbb,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x08,0x00,0x05,0x08,0x09,0x02,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcd,0xce,0x30,0x31,0x13,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0xbb,0x06,0x64,0x04,0x8b,0x85, +0xbf,0xb7,0x05,0xa0,0x26,0x2d,0x32,0x24,0x9b,0x67,0x64,0xab,0x00,0x02,0xff,0x17,0x05,0x35,0x00,0xe9,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x22,0x40,0x0e,0x02,0x16,0x00,0x0d,0x10,0x07,0x02,0x01,0x13,0x04,0x19,0x0a,0x01,0x04,0x00,0x2f,0xce,0xdc,0xcd,0x10,0xcd,0x11,0x39,0x01,0x2f,0xcd,0xdc,0xce,0xcd,0x32,0x30,0x31,0x13,0x07, +0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xe9,0x3e,0x6d,0x29,0x3f,0x4f,0x70,0x71,0x4e,0x54,0x6f,0x1c,0xfe,0xeb,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0x73,0x3e,0x6e,0x1e,0x6f,0x53,0x50,0x73,0x70,0x53,0x3e,0x28,0x66,0x2f,0x44, +0x44,0x2f,0x2f,0x44,0x44,0x00,0xff,0xff,0xff,0x43,0xfe,0x09,0x00,0xbe,0xff,0xb1,0x02,0x06,0x0b,0xd0,0x00,0x00,0x00,0x01,0xff,0x4b,0x05,0x4d,0x00,0xb5,0x07,0x09,0x00,0x05,0x00,0x31,0x40,0x17,0x00,0x04,0x80,0x84,0x05,0x94,0x05,0x02,0x05,0x34,0x03,0x01,0x03,0x34,0x01,0x01,0x01,0x02,0x05,0x05,0x03,0xc0,0x00,0xb8,0x05,0x10, +0x00,0x3f,0x1a,0xcc,0x39,0x3d,0x2f,0x01,0x18,0x2f,0x33,0x71,0x33,0x71,0x33,0x5d,0x1a,0xcd,0x32,0x30,0x31,0x13,0x23,0x27,0x37,0x33,0x07,0xb5,0x8d,0xdd,0xdd,0x8d,0xdc,0x05,0x4d,0xde,0xde,0xde,0x00,0x01,0xff,0x6a,0x05,0x58,0x00,0x96,0x07,0x00,0x00,0x05,0x00,0x14,0xb5,0x05,0x02,0x04,0x05,0x02,0x00,0xb8,0x05,0x10,0x00,0x3f, +0xcd,0xcd,0x01,0x2f,0xce,0xcd,0x30,0x31,0x13,0x21,0x35,0x33,0x11,0x33,0x96,0xfe,0xd4,0xc6,0x66,0x05,0x58,0x66,0x01,0x42,0x00,0x01,0x00,0x64,0xfd,0xff,0x01,0xda,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x08,0x05,0x00,0x08,0x09,0x02,0x02,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xdd,0xce,0x30,0x31,0x17,0x34,0x37,0x33,0x06, +0x15,0x14,0x16,0x33,0x15,0x22,0x26,0x64,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0xa0,0x25,0x2c,0x31,0x23,0x96,0x64,0x64,0xa7,0x00,0x01,0xfd,0x87,0x05,0x4e,0x00,0x32,0x06,0xa3,0x00,0x31,0x00,0x2d,0x40,0x12,0x00,0x19,0x0f,0x24,0x21,0x28,0x0b,0x08,0x0f,0x08,0x21,0x2d,0x25,0x05,0x14,0x1e,0x0c,0x2d,0xb8,0x05,0x10,0x00,0x3f,0x33, +0xcd,0xdd,0xcd,0x33,0x12,0x39,0x39,0x01,0x2f,0xcd,0x33,0xdc,0xcd,0x33,0x12,0x39,0x39,0x30,0x31,0x01,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0xfe,0xc1,0x1c, +0x28,0x21,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2c,0x17,0x1b,0x28,0x20,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2b,0x05,0xdf,0x26,0x31,0x1b,0x0b,0x32,0x2d,0x29,0x31,0x0d,0x48,0x14,0x56,0x45,0x24,0x3d,0x2c,0x19,0x15,0x26,0x36,0x1f,0x26, +0x31,0x1b,0x0b,0x32,0x2c,0x29,0x32,0x0d,0x47,0x14,0x56,0x45,0x23,0x3e,0x2c,0x19,0x15,0x26,0x37,0x00,0x00,0x02,0xff,0x29,0x05,0x4e,0x00,0xd8,0x06,0xfd,0x00,0x0b,0x00,0x17,0x00,0x18,0xb7,0x12,0x06,0x0c,0x00,0x15,0x03,0x0f,0x09,0xb8,0x05,0x10,0x00,0x3f,0xcd,0xdc,0xcd,0x01,0x2f,0xcd,0xdc,0xcd,0x30,0x31,0x03,0x34,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xd7,0x78,0x5f,0x5f,0x79,0x79,0x5f,0x5f,0x78,0x60,0x43,0x34,0x35,0x43,0x43,0x35,0x34,0x43,0x06,0x25,0x55,0x83,0x83,0x55,0x55,0x82,0x82,0x55,0x2f,0x48,0x48,0x2f,0x2f,0x49,0x49,0x00,0xff,0xff,0xff,0xa4,0x05,0x4e,0x00,0x5d, +0x06,0x05,0x02,0x06,0x0b,0x5c,0x00,0x00,0x00,0x01,0x00,0xab,0x00,0x00,0x02,0xcb,0x04,0xde,0x00,0x19,0x00,0x2c,0xb5,0x0b,0x0b,0x18,0x18,0x1b,0x15,0x41,0x0a,0x01,0x50,0x00,0x00,0x00,0x16,0x01,0x54,0x00,0x18,0x01,0x4d,0x00,0x10,0x01,0x54,0x00,0x07,0x01,0x4a,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f, +0x31,0x30,0x13,0x34,0x3e,0x04,0x33,0x32,0x16,0x17,0x17,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x11,0x21,0x17,0x21,0xab,0x0b,0x1b,0x2f,0x49,0x65,0x45,0x25,0x56,0x1c,0x18,0x08,0x1f,0x24,0x24,0x0f,0x44,0x52,0x2b,0x0d,0x01,0x62,0x13,0xfd,0xe0,0x03,0x1b,0x3a,0x71,0x64,0x54,0x3e,0x22,0x08,0x06,0x94,0x02,0x04,0x03,0x02,0x2c,0x50, +0x6d,0x41,0xfd,0x85,0xa2,0x00,0xff,0xff,0x00,0xb6,0x00,0xfc,0x01,0x6f,0x04,0xcd,0x02,0x26,0x0b,0x71,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x11,0xfe,0xe4,0x00,0x01,0xfe,0xb2,0x05,0x67,0x01,0x4f,0x06,0x78,0x00,0x0d,0x00,0x15,0xb7,0x00,0x01,0x08,0x07,0x00,0x08,0x0b,0x04,0x00,0x2f,0xcd,0xcc,0x32,0x01,0x2f,0x33,0xcc,0x32,0x30, +0x31,0x13,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0xc8,0x87,0x17,0xaa,0x8d,0x8e,0xa9,0x18,0x87,0x10,0x60,0x51,0x5e,0x60,0x06,0x78,0x84,0x8d,0x8a,0x87,0x49,0x54,0x51,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0x9a,0x00,0x19,0x00,0x8c,0x40,0x5f,0x59,0x17,0x01,0x48,0x17,0x01,0x56,0x13,0x01,0x79, +0x06,0x01,0x6a,0x06,0x01,0x0b,0x06,0x1b,0x06,0x02,0x9a,0x05,0x01,0x68,0x05,0x01,0x2a,0x05,0x01,0x96,0x03,0x01,0x24,0x03,0x01,0x05,0x03,0x15,0x03,0x02,0x66,0x02,0x76,0x02,0x02,0x0d,0x0d,0x00,0x7d,0x10,0x19,0x20,0x19,0x30,0x19,0x03,0x19,0x19,0x1b,0x0f,0x11,0x7d,0x08,0x0b,0x0b,0x8a,0x0a,0x01,0x69,0x0a,0x79,0x0a,0x02,0x4b, +0x0a,0x01,0x0a,0x0f,0x08,0x1f,0x08,0x02,0x08,0x00,0x00,0x15,0x0a,0x0f,0x91,0x0d,0x03,0x15,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xc4,0x12,0x39,0x2f,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x33,0x2f,0x10,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x01,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x10,0x13,0x23,0x35,0x21,0x15,0x21,0x04,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x05,0xaa,0xac,0xb6,0xfe,0xb6,0xfe,0xc6,0xb6,0xb0,0xf1,0xf1,0x05,0x4c,0xfc,0x89,0xfe,0xdb,0x7a,0x87,0xef,0xfc,0x86,0x7a,0x02,0xc8,0xfe,0xb4,0xc4,0xd0,0xc8,0xc1,0x01,0x3b,0x01,0x55,0x01,0x01, +0x98,0x98,0xef,0xfe,0xa8,0xf4,0x9c,0xac,0xaa,0x9b,0x01,0x04,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0xf0,0x05,0x9a,0x00,0x16,0x00,0x5a,0x40,0x39,0x46,0x0e,0x01,0x37,0x0e,0x01,0x78,0x05,0x01,0x5b,0x05,0x01,0x16,0x15,0x7e,0x12,0x02,0x02,0x18,0x0a,0x0c,0x7e,0x68,0x09,0x78,0x09,0x02,0x09,0x0f,0x07,0x2f,0x07,0x3f,0x07,0x4f,0x07, +0x04,0x07,0x40,0x10,0x13,0x48,0x07,0x02,0x04,0x91,0x12,0x10,0x10,0x15,0x0a,0x13,0x03,0x15,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x5d,0xed,0x32,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x33,0x06, +0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x04,0xf0,0xfe,0x97,0xbc,0xc3,0xd7,0xfe,0x5b,0xb0,0x63,0x52,0x55,0x96,0xb2,0xbd,0xa8,0xc1,0x02,0x7b,0x73,0x01,0x08,0xd8,0xfe,0xb4,0xce,0xe0,0x97,0x59,0x5c,0x70,0x02,0x8a,0xfa,0xfe,0x00,0x00,0x01,0x00,0x64,0xff,0x35,0x05,0x23,0x05,0xb2,0x00,0x17,0x00,0x5b,0x40,0x37, +0x82,0x14,0x01,0x8a,0x12,0x01,0x76,0x08,0x01,0x67,0x08,0x01,0x65,0x07,0x01,0x7a,0x05,0x01,0x69,0x05,0x01,0x16,0x7e,0x04,0x17,0x7e,0x02,0x04,0x02,0x04,0x02,0x19,0x0c,0x0a,0x7e,0x0d,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x0c,0x0d,0x0d,0x16,0x06,0x91,0x13,0x04,0x16,0x91,0x01,0x03,0x12,0x00,0x3f,0xce,0xed,0x3f,0xed,0x11,0x39,0x2f, +0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x23,0x35,0x21,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x11,0x21,0x05,0x23,0x9c,0xfe,0x89,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71, +0xd5,0x01,0xa8,0x01,0x6b,0xcb,0xcb,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xfc,0xb2,0x00,0x02,0x00,0x5a,0xff,0xe8,0x05,0x4c,0x05,0x9a,0x00,0x16,0x00,0x26,0x00,0x7c,0x40,0x53,0x29,0x25,0x79,0x25,0x02,0x26,0x21,0x76,0x21,0x02,0x26,0x1d,0x76,0x1d,0x02,0x29,0x19,0x79,0x19,0x02, +0x8a,0x0b,0x01,0x8a,0x0a,0x01,0x89,0x06,0x01,0x86,0x02,0x01,0x12,0x7e,0x0c,0x11,0x11,0x00,0x7d,0x17,0x50,0x0c,0x01,0x10,0x17,0x20,0x17,0x50,0x17,0x60,0x17,0x04,0x0c,0x17,0x0c,0x17,0x28,0x1f,0x7d,0x08,0x0e,0x0e,0x0f,0x08,0x1f,0x08,0x2f,0x08,0x03,0x08,0x1b,0x91,0x0c,0x13,0x12,0x0d,0x91,0x0f,0x03,0x23,0x91,0x04,0x13,0x00, +0x3f,0xed,0x3f,0xfd,0xc4,0xdd,0x32,0xed,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x34,0x37,0x36,0x37,0x35,0x21,0x35,0x21,0x15,0x21,0x15,0x16,0x17,0x16,0x07,0x34,0x27, +0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x4c,0xbe,0xb3,0xfe,0xfa,0xfe,0xfc,0xb7,0xc0,0xa0,0x99,0xec,0xfd,0xdb,0x04,0xf2,0xfd,0xdb,0xe9,0x9b,0xa1,0xb0,0x87,0x82,0xc0,0xbf,0x82,0x88,0x87,0x82,0xc0,0xbf,0x82,0x88,0x02,0x28,0xfe,0xfa,0xa2,0x98,0xa0,0xa9,0x01,0x04,0xee,0xa0,0x99,0x16,0x90,0x98, +0x98,0x90,0x19,0xa0,0xa5,0xe5,0xc3,0x79,0x73,0x74,0x7a,0xc1,0xc3,0x79,0x73,0x74,0x79,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x03,0xb8,0x05,0xb2,0x00,0x13,0x00,0x51,0x40,0x34,0x96,0x12,0x01,0x72,0x12,0x82,0x12,0x02,0x8a,0x10,0x01,0x79,0x10,0x01,0x7a,0x0f,0x01,0x56,0x06,0x66,0x06,0x02,0x59,0x03,0x69,0x03,0x02,0x00,0x7e,0x02, +0x02,0x15,0x0a,0x08,0x7e,0x0b,0x0f,0x0d,0x1f,0x0d,0x02,0x0d,0x0a,0x0b,0x0b,0x01,0x04,0x91,0x11,0x04,0x01,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34, +0x37,0x36,0x33,0x20,0x11,0x03,0xb8,0xa8,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0x00,0x01,0x00,0x64,0x00,0x00,0x05,0x23,0x05,0xb2,0x00,0x19,0x00,0x6f,0x40,0x44,0xa7,0x16,0x01,0x84,0x16,0x01,0x71,0x16,0x01,0x06, +0x16,0x01,0x7a,0x14,0x8a,0x14,0x02,0x7a,0x13,0x01,0x66,0x0a,0x01,0x6a,0x07,0x01,0x03,0x18,0x7e,0x06,0x19,0x7e,0x01,0x00,0x06,0x01,0x06,0x01,0x06,0x01,0x1b,0x0e,0x0c,0x7e,0x0f,0x0f,0x11,0x1f,0x11,0x02,0x11,0x0e,0x0f,0x19,0x91,0x01,0x03,0x0f,0x03,0x0f,0x03,0x05,0x08,0x91,0x15,0x04,0x05,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39, +0x39,0x2f,0x2f,0x10,0xce,0xed,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x23,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x15,0x21,0x05,0x23,0x9c, +0xcf,0xa8,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0x01,0x6b,0x01,0xc2,0xcb,0xfd,0x73,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xc1,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x9a,0x05,0x9a,0x00,0x12,0x00,0x22,0x00,0x51,0x40,0x18,0x4a,0x21,0x5a,0x21,0x02,0x45, +0x1d,0x55,0x1d,0x02,0x45,0x19,0x55,0x19,0x02,0x5a,0x15,0x01,0x49,0x15,0x01,0x00,0x7e,0x13,0xb8,0xff,0xc0,0x40,0x19,0x09,0x0c,0x48,0x13,0x13,0x24,0x1b,0x7e,0x0d,0x7e,0x0a,0x08,0x17,0x91,0x0d,0x0f,0x10,0x09,0x91,0x0c,0x03,0x1f,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x01,0x2f,0xce,0xed,0xed,0x12,0x39,0x2f, +0x2b,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x21,0x35,0x21,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x9a,0x85,0x8b,0xee,0xe7,0x87,0x84,0xfe,0x88,0x02,0x20,0x88,0xda,0xee,0x80,0x78,0xa8,0x4a,0x55, +0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0x03,0x0e,0x98,0xfe,0x07,0x77,0x95,0x8d,0xf8,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a,0x73,0x74,0x66,0x00,0x02,0x00,0x5e,0x00,0x00,0x05,0xe7,0x05,0x9a,0x00,0x0e,0x00,0x17,0x00,0x6b,0x40,0x45,0x06,0x15,0x86,0x15,0x02,0x9b,0x0a,0x01, +0x89,0x0a,0x01,0x7c,0x0a,0x01,0x6e,0x0a,0x01,0x0a,0x48,0x0e,0x49,0x29,0x0a,0x01,0x1a,0x0a,0x01,0x59,0x07,0x69,0x07,0x02,0x0d,0x03,0x7e,0x0f,0x0e,0x7e,0x02,0x00,0x0f,0x01,0x0f,0x02,0x0f,0x02,0x19,0x13,0x7d,0x0f,0x09,0x1f,0x09,0x02,0x09,0x0e,0x91,0x01,0x03,0x03,0x04,0x10,0x91,0x0c,0x03,0x0f,0x91,0x04,0x12,0x00,0x3f,0xed, +0x3f,0xed,0x11,0x39,0x2f,0xce,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x21,0x20,0x27,0x26,0x11,0x10,0x21,0x21,0x11,0x21,0x01,0x11,0x23,0x20,0x11,0x10,0x17,0x16,0x21,0x05,0xe7,0x9c,0xcf,0xfe,0xe8,0xfe, +0xa8,0xd4,0xda,0x02,0xf6,0x01,0x28,0x01,0x6b,0xfd,0xed,0x7c,0xfd,0xb6,0x9f,0x9c,0x01,0x19,0x01,0xc2,0xcb,0xfd,0x73,0xc2,0xc8,0x01,0x55,0x02,0xbb,0xfd,0x8b,0xfd,0x73,0x04,0x6a,0xfd,0xd9,0xfe,0xe9,0x98,0x94,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x00,0x05,0x00,0x1a,0x40,0x0c,0x05,0x7e,0x02,0x02,0x07,0x03, +0x02,0x91,0x05,0x03,0x01,0x12,0x00,0x3f,0x3f,0xed,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x03,0x08,0xa8,0xfd,0xc0,0x02,0xe8,0x05,0x02,0x98,0x00,0x02,0x00,0x8c,0x00,0x00,0x04,0x7c,0x05,0x9a,0x00,0x11,0x00,0x21,0x00,0x6a,0x40,0x45,0x35,0x0f,0x01,0x35,0x0e,0x01,0x3a,0x06,0x01,0x3a,0x05,0x01, +0x45,0x0f,0x01,0x46,0x0e,0x01,0x4a,0x06,0x01,0x49,0x05,0x01,0x12,0x7e,0x11,0x7e,0x10,0x02,0x01,0x02,0x02,0x23,0x1a,0x7e,0x0b,0x7e,0x08,0x16,0x91,0x64,0x0b,0x01,0x35,0x0b,0x45,0x0b,0x55,0x0b,0x03,0x0b,0x0d,0x0a,0x03,0x1e,0x91,0x49,0x02,0x59,0x02,0x02,0x3a,0x02,0x01,0x02,0x04,0x01,0x12,0x00,0x3f,0xde,0x32,0x5d,0x5d,0xed, +0x3f,0xde,0x32,0x5d,0x5d,0xed,0x01,0x2f,0xed,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x36,0x33,0x32,0x17,0x16,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x7c, +0xa8,0x88,0xda,0xed,0x81,0x78,0xa8,0x88,0xda,0xed,0x81,0x78,0xa8,0x4c,0x55,0xa9,0xa6,0x5c,0x54,0x4c,0x55,0xa9,0xa6,0x5c,0x54,0x01,0x30,0x77,0x96,0x8c,0xf2,0x02,0xcd,0xfe,0xd0,0x77,0x96,0x8c,0xf2,0xaf,0x67,0x74,0x75,0x6a,0xab,0xaf,0x67,0x74,0x75,0x6a,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x9a,0x05,0x9a,0x00,0x13,0x00,0x23, +0x00,0x61,0x40,0x3f,0x43,0x12,0x53,0x12,0x02,0x4a,0x06,0x01,0x49,0x05,0x59,0x05,0x02,0x5b,0x02,0x01,0x4a,0x02,0x01,0x00,0x7e,0x10,0x14,0x20,0x14,0x30,0x14,0x03,0x14,0x14,0x07,0x25,0x0c,0x7e,0x0a,0x1c,0x7e,0x0e,0x7e,0x0f,0x07,0x01,0x07,0x18,0x91,0x55,0x0e,0x01,0x46,0x0e,0x01,0x0e,0x10,0x10,0x0a,0x08,0x91,0x0d,0x03,0x20, +0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xce,0x3f,0x33,0x5d,0x5d,0xed,0x01,0x2f,0x5d,0xed,0xed,0xde,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x00,0x35,0x11,0x23,0x15,0x23,0x11,0x21,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15, +0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x9a,0x85,0x8b,0xee,0xe2,0xfe,0xf0,0xdc,0x9c,0x02,0x20,0x88,0xda,0xee,0x80,0x78,0xa8,0x4a,0x55,0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x01,0x20,0xec,0x03,0x0e,0xcb,0x01,0x63,0xfe,0x07,0x77,0x95,0x8d,0xf8,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a, +0x73,0x74,0x66,0x00,0x00,0x02,0x00,0x5c,0xff,0xe8,0x05,0xb0,0x05,0x9a,0x00,0x17,0x00,0x21,0x00,0x7c,0x40,0x53,0x5b,0x0f,0x01,0x3a,0x0f,0x4a,0x0f,0x02,0x3a,0x0e,0x4a,0x0e,0x5a,0x0e,0x03,0x5a,0x0a,0x01,0x49,0x0a,0x01,0x3a,0x0a,0x01,0x49,0x09,0x01,0x36,0x07,0x46,0x07,0x56,0x07,0x03,0x35,0x06,0x45,0x06,0x55,0x06,0x03,0x17, +0x7e,0x01,0x03,0x16,0x7e,0x11,0x00,0x19,0x10,0x19,0x02,0x19,0x19,0x23,0x1c,0x7e,0x0c,0x13,0x13,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x11,0x16,0x91,0x03,0x01,0x19,0x19,0x1e,0x12,0x91,0x15,0x03,0x1e,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xcc,0xc4,0xfd,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d, +0xc4,0xfd,0xc4,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x01,0x11,0x21,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x05,0xb0,0x9c,0xc8,0x83,0x87,0xe8,0xef,0x8a,0x85,0x78,0x7e,0xef,0x01, +0x63,0xfc,0xf4,0x03,0xb4,0x01,0x64,0xfd,0xf4,0xfe,0xaf,0xfe,0xb1,0x01,0x4a,0xa7,0x5b,0x54,0x02,0x9d,0xcb,0xfe,0x8c,0xea,0x8f,0x93,0x93,0x8f,0xf0,0xf0,0x87,0x8f,0x01,0x02,0x98,0xfe,0x66,0xfd,0xf8,0x01,0x70,0xfe,0x8c,0xfe,0x7e,0x72,0x69,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xa4,0x05,0x9a,0x00,0x19,0x00,0x3d,0x40,0x20, +0x95,0x17,0x01,0x94,0x0b,0x01,0x0f,0x0f,0x00,0x7e,0x02,0x02,0x08,0x1b,0x13,0x06,0x7e,0x08,0x13,0x15,0x91,0x06,0x04,0x04,0x08,0x10,0x91,0x0e,0x03,0x01,0x08,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x34,0x23, +0x22,0x07,0x11,0x23,0x11,0x34,0x37,0x36,0x33,0x21,0x15,0x21,0x22,0x15,0x11,0x36,0x33,0x32,0x17,0x16,0x15,0x04,0xa4,0xa8,0xf5,0xb4,0xe2,0xa8,0x6c,0x67,0xb8,0x02,0x14,0xfd,0xfe,0xf5,0xe4,0xc6,0xb7,0x67,0x6b,0x02,0x12,0xe8,0x6e,0xfd,0x74,0x04,0x28,0xb5,0x60,0x5d,0x98,0xe8,0xfe,0xfa,0x7a,0x5e,0x61,0xb5,0x00,0x02,0x00,0x5e, +0xfe,0xea,0x05,0xaa,0x05,0xb2,0x00,0x1f,0x00,0x2f,0x00,0xc8,0x40,0x8d,0x59,0x2e,0x01,0x99,0x2d,0x01,0x6a,0x2d,0x01,0x54,0x2b,0x64,0x2b,0x02,0x56,0x2a,0x86,0x2a,0x02,0x86,0x26,0x01,0x67,0x26,0x01,0x56,0x26,0x01,0x64,0x25,0x01,0x56,0x25,0x01,0x6a,0x23,0x01,0x59,0x22,0x01,0x86,0x16,0x01,0x75,0x16,0x01,0x76,0x12,0x01,0x27, +0x12,0x01,0x13,0x12,0x01,0x04,0x12,0x01,0x24,0x11,0x94,0x11,0x02,0x07,0x11,0x01,0x29,0x0f,0x99,0x0f,0x02,0x79,0x0e,0x01,0x0a,0x0e,0x1a,0x0e,0x02,0x79,0x0a,0x01,0x1b,0x0a,0x01,0x0a,0x0a,0x01,0x2a,0x09,0x9a,0x09,0x02,0x09,0x09,0x01,0x19,0x7e,0x06,0x1f,0x1f,0x14,0x7d,0x20,0x40,0x06,0x01,0x10,0x20,0x20,0x20,0x30,0x20,0x03, +0x06,0x20,0x06,0x20,0x31,0x28,0x7d,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x24,0x91,0x10,0x04,0x1f,0x1d,0x91,0x00,0x02,0x2c,0x91,0x06,0x08,0x13,0x00,0x3f,0x33,0xed,0xdc,0x32,0xed,0x32,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x03,0x10,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16, +0x33,0x32,0x37,0x36,0x05,0xaa,0x34,0x3c,0x88,0x5e,0x61,0x02,0x6e,0x85,0xfe,0xc8,0xb8,0xb0,0xb1,0xbb,0x01,0x4c,0x01,0x35,0xb4,0xab,0xba,0x23,0x43,0x39,0x32,0x45,0x3c,0x34,0xb0,0x73,0x81,0xfc,0xf2,0x8b,0x7f,0x7b,0x88,0xed,0xfc,0x86,0x7a,0xff,0x17,0x51,0x54,0x7e,0x25,0xd1,0xc7,0x01,0x3c,0x01,0x51,0xcd,0xd8,0xd2,0xc7,0xfe, +0xc6,0xfe,0xa1,0xcc,0x22,0x48,0x37,0x4a,0x2c,0x28,0x1f,0x03,0x34,0x01,0x05,0x9d,0xb0,0xb3,0xa3,0xf9,0xf5,0xa3,0xb4,0xaa,0x9b,0x00,0x00,0x01,0x00,0x32,0xff,0xe8,0x05,0xd5,0x05,0x9a,0x00,0x0f,0x00,0x45,0x40,0x2a,0x35,0x0c,0x01,0x26,0x0c,0x01,0x96,0x0a,0x01,0x33,0x0a,0x01,0x25,0x0a,0x01,0x59,0x03,0x01,0x4b,0x03,0x01,0x4a, +0x01,0x01,0x0f,0x7e,0x0d,0x0d,0x11,0x09,0x7e,0x07,0x05,0x0e,0x05,0x91,0x08,0x03,0x0b,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0xc4,0x01,0x2f,0xcd,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x21,0x35,0x21,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x05,0xd5,0xfd, +0xdf,0xfd,0xf6,0xfe,0x88,0x02,0x20,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0x98,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x05,0x43,0x05,0x9a,0x00,0x16,0x00,0x48,0x40,0x29,0x47,0x10,0x01,0x36,0x10,0x01,0x58,0x06,0x01,0x5a,0x05,0x01,0x14,0x00,0x7e,0x02,0x02,0x18, +0x0c,0x0e,0x7e,0x0a,0x09,0x0f,0x07,0x01,0x07,0x14,0x12,0x91,0x02,0x04,0x04,0x01,0x09,0x91,0x15,0x0c,0x03,0x01,0x12,0x00,0x3f,0x3f,0xc4,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x5d,0x33,0xce,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x21,0x35, +0x21,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x05,0x43,0xa8,0xbc,0xc3,0xd7,0xfe,0x23,0xfe,0xc8,0x02,0x20,0x63,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x08,0xd8,0x94,0x86,0x98,0xce,0xe0,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0x64,0xff,0xe8,0x05,0x23,0x05,0x9a,0x00,0x19,0x00,0x61,0x40,0x3c, +0x69,0x14,0x79,0x14,0x02,0x66,0x11,0x76,0x11,0x02,0x8a,0x07,0x01,0x96,0x05,0x01,0x80,0x05,0x01,0x05,0x05,0x01,0x19,0x7e,0x01,0x18,0x03,0x7e,0x00,0x15,0x01,0x15,0x15,0x1b,0x0d,0x0f,0x7e,0x0c,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0d,0x0c,0x19,0x91,0x01,0x03,0x0c,0x03,0x0c,0x03,0x16,0x03,0x13,0x91,0x06,0x13,0x00,0x3f,0xed,0x3f, +0x39,0x39,0x2f,0x2f,0x10,0xce,0xed,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0x5d,0xfd,0xc4,0xde,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x15,0x10,0x21,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x11,0x11,0x33,0x11,0x21,0x05,0x23,0x9c,0xcf,0xfe,0x58,0xd5, +0x71,0x66,0x34,0x96,0x22,0x36,0x44,0x8a,0x01,0x00,0xa8,0x01,0x6b,0x01,0xc2,0xcb,0xd9,0xfe,0x34,0x8a,0x7c,0xc9,0x8e,0x6a,0x46,0x4e,0x64,0x83,0x56,0x6c,0x01,0x48,0x03,0xe0,0xfd,0x8b,0x00,0x01,0x00,0xb0,0xff,0xe8,0x04,0x04,0x05,0x9a,0x00,0x13,0x00,0x4b,0x40,0x2f,0x59,0x0d,0x69,0x0d,0x02,0x66,0x0a,0x01,0x57,0x0a,0x01,0x99, +0x05,0x01,0x8a,0x05,0x01,0x7b,0x05,0x01,0x75,0x02,0x01,0x12,0x00,0x7e,0x11,0x10,0x0f,0x20,0x0f,0x02,0x0f,0x0f,0x15,0x09,0x7e,0x06,0x11,0x12,0x12,0x08,0x03,0x0b,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07, +0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x32,0x37,0x36,0x35,0x34,0x27,0x37,0x16,0x04,0x04,0x65,0x72,0xd5,0xfe,0x58,0xa8,0x01,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x01,0xb7,0xc9,0x7c,0x8a,0x01,0xcc,0x03,0xe6,0xfc,0x20,0xfe,0xb8,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a, +0x00,0x0e,0x00,0x15,0x00,0x53,0x40,0x34,0x38,0x15,0x48,0x15,0x02,0x56,0x09,0x01,0x57,0x06,0x01,0x77,0x05,0x87,0x05,0x02,0x65,0x05,0x01,0x53,0x05,0x01,0x0e,0x0e,0x07,0x7d,0x10,0x0f,0x20,0x0f,0x02,0x0f,0x0f,0x01,0x17,0x13,0x0c,0x7e,0x01,0x0c,0x91,0x14,0x14,0x0d,0x12,0x91,0x02,0x03,0x0d,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f, +0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x23,0x11,0x21,0x03,0x10,0x21,0x23,0x11,0x33,0x20,0x04,0x29,0xfc,0x93,0x01,0x8a,0xdc,0x7e,0x89,0x99,0x8f,0xe0,0xbd,0x02,0xc5,0xb0,0xfe, +0xb0,0xc5,0xb0,0x01,0x65,0x05,0x9a,0x66,0x70,0xd6,0xdb,0x7f,0x76,0xfe,0x7a,0x03,0x4e,0x01,0x1c,0xfd,0xb4,0x00,0x00,0x02,0x00,0x5e,0xfe,0xea,0x05,0xaa,0x05,0xb2,0x00,0x1d,0x00,0x2d,0x00,0xc8,0x40,0x8d,0x6a,0x2c,0x01,0x59,0x2c,0x01,0x69,0x2b,0x99,0x2b,0x02,0x64,0x29,0x01,0x87,0x28,0x01,0x55,0x28,0x01,0x87,0x24,0x01,0x55, +0x24,0x01,0x63,0x23,0x01,0x56,0x23,0x01,0x6b,0x21,0x01,0x59,0x20,0x01,0x07,0x1c,0x01,0x75,0x18,0x01,0x16,0x18,0x01,0x05,0x18,0x01,0x24,0x17,0x94,0x17,0x02,0x15,0x17,0x01,0x07,0x17,0x01,0x99,0x15,0x01,0x2a,0x15,0x01,0x18,0x15,0x01,0x19,0x14,0x79,0x14,0x02,0x0a,0x14,0x01,0x1a,0x10,0x7a,0x10,0x02,0x0b,0x10,0x01,0x99,0x0f, +0x01,0x2c,0x0f,0x01,0x1a,0x0f,0x01,0x09,0x0f,0x01,0x47,0x1c,0x01,0x1c,0x00,0x7e,0x0c,0x05,0x0a,0x0a,0x1a,0x7d,0x10,0x1e,0x20,0x1e,0x30,0x1e,0x03,0x1e,0x1e,0x2f,0x26,0x7d,0x0f,0x12,0x1f,0x12,0x02,0x12,0x22,0x91,0x16,0x04,0x05,0x91,0x06,0x2a,0x91,0x1c,0x0c,0x0e,0x13,0x00,0x3f,0x33,0x33,0xed,0xde,0xed,0x3f,0xed,0x01,0x2f, +0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x33,0x2f,0xcc,0x33,0xed,0x32,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x14,0x06,0x07,0x06,0x23,0x35,0x16,0x37,0x36,0x35,0x34,0x27,0x06,0x21,0x20,0x27,0x26, +0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x16,0x03,0x10,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0xaa,0x86,0x6b,0x25,0x4d,0x22,0x27,0x82,0x41,0xb4,0xfe,0xe1,0xfe,0xc8,0xb8,0xb0,0xb1,0xbb,0x01,0x4c,0x01,0x35,0xb4,0xab,0x7b,0x7b,0xb0,0x73,0x81,0xfc,0xf2,0x8b,0x7f,0x7b,0x88, +0xed,0xfc,0x86,0x7a,0x1c,0x64,0xa2,0x21,0x0b,0x87,0x03,0x0c,0x28,0x74,0x52,0x2c,0xac,0xd1,0xc7,0x01,0x3c,0x01,0x51,0xcd,0xd8,0xd2,0xc7,0xfe,0xc6,0xfe,0xe3,0xbc,0x55,0x02,0x17,0x01,0x05,0x9d,0xb0,0xb3,0xa3,0xf9,0xf5,0xa3,0xb4,0xaa,0x9b,0x00,0x00,0x03,0x00,0x5a,0x00,0x00,0x05,0x4c,0x05,0xb2,0x00,0x12,0x00,0x1b,0x00,0x24, +0x00,0x79,0x40,0x51,0x56,0x24,0x01,0x65,0x23,0x75,0x23,0x02,0x65,0x1f,0x75,0x1f,0x02,0x7b,0x1a,0x01,0x6a,0x1a,0x01,0x59,0x16,0x01,0x6a,0x15,0x7a,0x15,0x02,0x97,0x11,0x01,0x85,0x11,0x01,0x89,0x0d,0x01,0x98,0x09,0x01,0x8b,0x09,0x01,0x86,0x02,0x01,0x13,0x7d,0x10,0x00,0x20,0x00,0x02,0x00,0x04,0x18,0x7e,0x07,0x21,0x7d,0x1f, +0x0b,0x2f,0x0b,0x02,0x0b,0x1c,0x07,0x18,0x1c,0x91,0x07,0x04,0x04,0x06,0x17,0x1d,0x91,0x0f,0x04,0x06,0x12,0x00,0x3f,0x3f,0xed,0x32,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xdd,0x5d,0xed,0x10,0xfd,0xc4,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x07, +0x11,0x23,0x11,0x26,0x27,0x26,0x35,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x03,0x34,0x27,0x26,0x27,0x11,0x36,0x37,0x36,0x05,0x11,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x05,0x4c,0xa1,0x9b,0xe9,0xa8,0xec,0x99,0xa0,0xc0,0xb7,0x01,0x04,0x01,0x06,0xb3,0xbe,0xb0,0x6c,0x67,0xa2,0xa3,0x66,0x6c,0xfd,0xe3,0xa3,0x66,0x6c,0x6c,0x67,0x03, +0x72,0xec,0xa5,0xa0,0x19,0xfe,0xd8,0x01,0x28,0x16,0x99,0xa0,0xee,0x01,0x04,0xa9,0xa0,0x98,0xa2,0xfe,0xf3,0xab,0x75,0x6e,0x1a,0xfc,0xaf,0x19,0x6f,0x75,0xfc,0x03,0x51,0x19,0x6f,0x75,0xac,0xaa,0x75,0x6f,0x00,0x01,0x00,0x32,0x00,0x00,0x04,0x62,0x05,0x9a,0x00,0x0f,0x00,0x46,0x40,0x2b,0x00,0x7e,0x20,0x02,0xa0,0x02,0xb0,0x02, +0xc0,0x02,0x04,0x02,0x03,0x0e,0x7e,0x06,0x07,0x7e,0x2f,0x09,0xaf,0x09,0xbf,0x09,0xcf,0x09,0x04,0x09,0x0b,0x06,0x0e,0x09,0x0b,0x91,0x06,0x01,0x03,0x03,0x05,0x0d,0x03,0x05,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xce,0xc4,0xfd,0xce,0xc4,0x01,0x2f,0xc4,0xdc,0x5d,0xed,0x10,0xfd,0xc4,0xdd,0x5d,0xed,0x31,0x30,0x01,0x23,0x35,0x21, +0x11,0x23,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x33,0x11,0x21,0x04,0x62,0x9c,0xfe,0xd8,0xa8,0xfe,0x3c,0x9c,0x01,0x28,0xa8,0x01,0xc4,0x02,0x9d,0xcb,0xfc,0x98,0x03,0x68,0x01,0x63,0xcb,0x01,0x9a,0xfe,0x66,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0xb2,0x00,0x0d,0x00,0x38,0x40,0x21,0x45,0x0c,0x01,0x44,0x0a,0x01,0x3a,0x05, +0x01,0x29,0x05,0x01,0x3a,0x03,0x01,0x29,0x03,0x01,0x00,0x7e,0x02,0x02,0x0f,0x06,0x7e,0x08,0x04,0x91,0x0b,0x04,0x01,0x07,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x04,0xd5,0xa8,0xfe, +0x93,0xfe,0x92,0xa8,0x02,0x17,0x02,0x14,0x03,0x71,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x12,0x00,0x3a,0x40,0x20,0x36,0x0c,0x01,0x68,0x06,0x01,0x4a,0x06,0x5a,0x06,0x02,0x10,0x00,0x7e,0x02,0x02,0x14,0x09,0x7e,0x07,0x02,0x04,0x91,0x10,0x0e,0x0e, +0x00,0x09,0x11,0x03,0x00,0x12,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x11,0x33,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0xa2,0xa8,0xbc,0xc3,0xd7,0xfe,0xa8,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02, +0x7b,0x73,0x01,0x08,0xd8,0x01,0xb2,0xfe,0x52,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x81,0x05,0x9a,0x00,0x21,0x00,0x5c,0x40,0x38,0x86,0x1c,0x01,0x36,0x0f,0x01,0x36,0x0b,0x96,0x0b,0x02,0x27,0x0b,0x01,0x49,0x06,0x59,0x06,0x02,0x49,0x02,0x59,0x02,0x02,0x4a,0x01,0x01,0x21,0x7e,0x12,0x1f,0x1f, +0x18,0x23,0x09,0x7e,0x08,0x08,0x1a,0x7e,0x18,0x1f,0x1d,0x91,0x12,0x09,0x14,0x14,0x0d,0x1a,0x20,0x03,0x0d,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xce,0x33,0xed,0x32,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xc4,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22, +0x27,0x26,0x35,0x33,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0x85,0x88,0xdf,0xdb,0x8d,0x87,0xa8,0x57,0x61,0x8f,0x90,0x5e,0x56,0xe4,0xc6,0xb7,0x67,0x6b,0xa8,0xf5,0xb4,0xe2,0xa8,0x01,0xb4,0xce,0x7e,0x80,0x8a,0x85,0xc0,0x76,0x63,0x6c, +0x6a,0x61,0x7d,0x01,0x12,0x7a,0x5e,0x61,0xb5,0x01,0xd4,0xfe,0x34,0xe8,0x6e,0x02,0x46,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xc5,0x05,0x9a,0x00,0x12,0x00,0x40,0x40,0x24,0x66,0x11,0x76,0x11,0x02,0x59,0x04,0x01,0x4a,0x04,0x01,0x39,0x04,0x01,0x00,0x7e,0x02,0x02,0x0a,0x14,0x0d,0x08,0x7e,0x0a,0x08,0x06,0x91,0x0d,0x0f,0x0f, +0x0a,0x0c,0x03,0x01,0x0a,0x12,0x00,0x3f,0xc4,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x12,0x15,0x04,0xc5,0xa8,0x52,0x55,0x96,0xb2,0xbd,0xa8,0xa8,0xbc,0xc3,0xd7, +0xfe,0x01,0xae,0x97,0x59,0x5c,0x70,0xfd,0x76,0x05,0x9a,0xfd,0x85,0x73,0xfe,0xf8,0xd8,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x00,0x05,0xb2,0x00,0x1f,0x00,0x83,0x40,0x57,0x66,0x18,0x01,0x06,0x17,0x16,0x17,0x56,0x17,0x66,0x17,0x04,0x56,0x13,0x66,0x13,0x02,0x66,0x12,0x01,0x08,0x0b,0x18,0x0b,0x02,0x29,0x05,0x01,0x77,0x0a, +0x01,0x99,0x07,0x01,0x79,0x06,0x01,0x0f,0x0f,0x1f,0x7e,0x02,0x10,0x1d,0x01,0x1d,0x1d,0x21,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x1e,0x1e,0x19,0x0f,0x11,0x91,0x96,0x0e,0x01,0x87,0x0e,0x01,0x76,0x0e,0x01,0x0e,0x0c,0x04,0x1d,0x19,0x91,0x69,0x02,0x79,0x02,0x02,0x02,0x04,0x13,0x00,0x12,0x00,0x3f,0x3f,0x33,0x5d,0xed,0x32, +0x3f,0x33,0x5d,0x5d,0x5d,0xed,0x32,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36, +0x37,0x11,0x33,0x05,0x00,0xa8,0xa7,0xb9,0xfe,0xc6,0xb4,0xac,0xbf,0xc5,0x01,0x46,0xe0,0x9f,0xae,0xe4,0xf8,0x8d,0x82,0x7b,0x86,0xfe,0x66,0x5f,0x56,0x30,0xa8,0x40,0x58,0xcd,0xc3,0x01,0x42,0x01,0x4e,0xd2,0xd8,0x4c,0xba,0x6e,0xaf,0xa2,0xfe,0xfd,0xfe,0xf8,0x99,0xa6,0x28,0x23,0x34,0x01,0x56,0x00,0x00,0x02,0x00,0x5c,0xff,0xe8, +0x05,0xb0,0x05,0x9a,0x00,0x15,0x00,0x1f,0x00,0x73,0x40,0x4c,0x39,0x1e,0x01,0x39,0x1d,0x01,0x36,0x1b,0x01,0x35,0x19,0x01,0x4b,0x0f,0x5b,0x0f,0x02,0x49,0x0e,0x59,0x0e,0x02,0x59,0x0a,0x01,0x4a,0x0a,0x01,0x5a,0x09,0x01,0x56,0x07,0x01,0x55,0x06,0x01,0x44,0x06,0x01,0x15,0x7e,0x01,0x03,0x14,0x7e,0x11,0x00,0x17,0x10,0x17,0x02, +0x17,0x17,0x21,0x1a,0x7e,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x14,0x11,0x91,0x17,0x01,0x03,0x03,0x12,0x03,0x1c,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0x39,0x2f,0xce,0xc4,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0xfd,0xc4,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35, +0x23,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x11,0x33,0x11,0x21,0x01,0x11,0x21,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x05,0xb0,0x9c,0xc8,0x83,0x87,0xe8,0xef,0x8a,0x85,0x78,0x7e,0xef,0x01,0x63,0xa8,0x01,0x64,0xfd,0xf4,0xfe,0xaf,0xfe,0xb1,0x01,0x4a,0xa7,0x5b,0x54,0x02,0x9d,0xcb,0xfe,0x8c,0xea, +0x8f,0x93,0x93,0x8f,0xf0,0xf0,0x87,0x8f,0x01,0x9a,0xfe,0x66,0xfd,0xf8,0x01,0x70,0xfe,0x8c,0xfe,0x7e,0x72,0x69,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x5f,0x40,0x3c,0x67,0x19,0x77,0x19,0x02,0x68,0x14,0x78,0x14,0x02,0x85,0x12,0x95,0x12,0x02,0x86,0x11,0x96,0x11,0x02,0x89,0x02,0x99,0x02, +0x02,0x9a,0x01,0x01,0x89,0x01,0x01,0x00,0x7d,0x13,0x13,0x0d,0x1b,0x07,0x7e,0x09,0x17,0x0b,0x06,0x7e,0x0d,0x08,0x0a,0x91,0x07,0x18,0x91,0x05,0x05,0x0d,0x16,0x91,0x0e,0x03,0x0d,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0xde,0xfd,0xcd,0x01,0x2f,0xfd,0xc4,0xc4,0xdc,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x21,0x15,0x21,0x11,0x23,0x35,0x23,0x11,0x23,0x11,0x21,0x32,0x17,0x16,0x07,0x34,0x21,0x23,0x11,0x33,0x20,0x04,0x38,0x81,0x78,0xcb,0xfe,0xf0,0x01,0x6b,0x9c,0xcf,0xa8,0x01,0xaa,0xd5,0x79,0x84,0xb1,0xfe,0xc9,0xec,0xec,0x01,0x37,0x04,0x2f,0xb2,0x60,0x59,0x99,0xfe,0x9d,0xcb, +0xfe,0x6d,0x05,0x9a,0x56,0x5e,0xb7,0xd3,0xfe,0x5a,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xb5,0x05,0xb2,0x00,0x31,0x00,0xa6,0x40,0x68,0x66,0x31,0x76,0x31,0x02,0x76,0x29,0x01,0x7a,0x27,0x01,0x95,0x20,0x01,0x66,0x20,0x86,0x20,0x02,0x9a,0x1c,0x01,0x8b,0x1c,0x01,0x6c,0x1c,0x01,0x89,0x1a,0x01,0x7c,0x12,0x01,0x56,0x0f,0x01,0x89, +0x07,0x01,0x7a,0x07,0x01,0x69,0x07,0x01,0x66,0x02,0x01,0x66,0x01,0x01,0x23,0x21,0x7d,0x24,0x26,0x26,0x13,0x2e,0x2a,0x00,0x7d,0x17,0x1b,0x20,0x13,0x50,0x13,0x02,0x13,0x13,0x33,0x2a,0x7d,0x1b,0x0b,0x0d,0x7d,0x0a,0x08,0x08,0x1b,0x23,0x23,0x2e,0x28,0x2e,0x1d,0x11,0x0a,0x0a,0x17,0x11,0x17,0x04,0x28,0x91,0x1d,0x04,0x11,0x91, +0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0xed,0x11,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14, +0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x11,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x10,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x21,0x20,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x04,0xb5,0xab,0x8c,0xec,0xe8,0x93,0xb3,0x0f,0xb4,0x12,0x81,0x62,0x9c,0x01,0x71, +0x7a,0x49,0xa5,0xf5,0x70,0xaf,0x01,0xfa,0xcb,0x84,0xa1,0x0a,0xae,0x08,0xfe,0xbe,0xfe,0xb8,0x80,0x48,0xaa,0xee,0x73,0xa9,0x01,0x85,0xdd,0x6a,0x56,0x57,0x6b,0xd9,0x43,0x40,0x43,0x42,0x8e,0x42,0x32,0x01,0x06,0x85,0x44,0x28,0x1f,0x2e,0x43,0x68,0xcc,0x01,0x78,0x4e,0x5f,0xbd,0x25,0x4b,0x45,0x2b,0xd2,0xe0,0x85,0x42,0x26,0x1e, +0x2b,0x48,0x6b,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xc5,0x05,0x9a,0x00,0x14,0x00,0x46,0x40,0x2a,0x39,0x10,0x01,0x66,0x02,0x76,0x02,0x02,0x45,0x02,0x55,0x02,0x02,0x47,0x01,0x57,0x01,0x02,0x07,0x07,0x14,0x7e,0x12,0x12,0x09,0x16,0x0c,0x05,0x7e,0x09,0x0e,0x91,0x03,0x03,0x06,0x13,0x0b,0x03,0x06,0x91,0x09,0x12,0x00,0x3f, +0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x04,0xc5,0xfe,0xd7,0xc3,0xbc,0x02,0xf2,0xfc,0x66,0xa8,0xbd,0xb2,0x96,0x55,0x52,0xa8,0x03,0xe8, +0xd8,0xfe,0xf8,0x73,0xfe,0x1d,0x98,0x05,0x9a,0xfd,0x76,0x70,0x5c,0x59,0x97,0x01,0xae,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x05,0x1d,0x05,0x9a,0x00,0x0a,0x00,0x0d,0x00,0x6b,0x40,0x41,0x0d,0x0b,0x04,0x0c,0x00,0x0a,0x09,0x03,0x0c,0x00,0x05,0x0b,0x04,0x01,0x06,0x02,0x09,0x03,0x01,0x06,0x0b,0x03,0x09,0x03,0x7e,0x04,0x0b,0x14, +0x04,0x04,0x0b,0x09,0x09,0x0c,0x01,0x06,0x01,0x7e,0x00,0x0c,0x14,0x00,0x0c,0x00,0x00,0x04,0x0f,0x07,0x06,0x06,0x0b,0x04,0x01,0x04,0x0c,0x06,0x0b,0x91,0x09,0x03,0x01,0x00,0x03,0x04,0x12,0x00,0x3f,0xc4,0xdc,0xc4,0x3f,0xfd,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0xcd,0x11,0x12,0x39,0x2f,0x87,0x2b,0x87,0x7d,0xc4,0x01,0x33,0x18, +0x2f,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x0f,0x0f,0x0f,0x0f,0x31,0x30,0x25,0x23,0x01,0x01,0x23,0x01,0x01,0x21,0x35,0x21,0x01,0x13,0x21,0x13,0x05,0x1d,0xce,0xfe,0xa3,0xfe,0x0e,0xce,0x02,0x59,0xfe,0xad,0xfe,0xfa,0x04,0xeb,0xfe,0x3c,0x86,0xfe,0x27,0xec,0xcc,0x01,0xdb,0xfd,0x59,0x03,0x33,0x01,0xcf,0x98,0xfd,0x99,0x01,0xcf,0xfe, +0xbd,0x00,0x00,0x01,0x00,0x32,0xff,0xe8,0x05,0xd5,0x05,0x9a,0x00,0x11,0x00,0x55,0x40,0x35,0x29,0x0e,0x39,0x0e,0x49,0x0e,0x03,0x96,0x0c,0x01,0x44,0x0c,0x01,0x35,0x0c,0x01,0x26,0x0c,0x01,0x59,0x03,0x01,0x11,0x7e,0x10,0x0f,0x01,0x0f,0x0f,0x04,0x13,0x09,0x7e,0x07,0x0b,0x7e,0x0f,0x04,0x01,0x04,0x11,0x11,0x0a,0x0d,0x07,0x05, +0x91,0x0a,0x03,0x0d,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xce,0x11,0x12,0x39,0x2f,0x01,0x2f,0x5d,0xed,0xde,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x23,0x15,0x23,0x11,0x21,0x11,0x10,0x21,0x20,0x11,0x35,0x33,0x05,0xd5,0xfd,0xdf,0xfd,0xf6,0xdc,0x9c,0x02, +0x20,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0xcb,0x01,0x63,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x7f,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xf0,0x05,0x9a,0x00,0x11,0x00,0x55,0x40,0x34,0x97,0x0f,0xa7,0x0f,0x02,0x86,0x0f,0x01,0x7a,0x02,0x01,0x00,0x10,0x7e,0x01,0x01,0x09,0x13,0x0c,0x07,0x7e,0x09,0x75,0x0c, +0x01,0x56,0x0c,0x66,0x0c,0x02,0x44,0x0c,0x01,0x23,0x0c,0x33,0x0c,0x02,0x0c,0x0e,0x91,0x03,0x10,0x91,0x01,0x03,0x03,0x08,0x0b,0x03,0x08,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xde,0xed,0x10,0xed,0x32,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x21,0x10,0x23,0x22, +0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x20,0x13,0x33,0x04,0xf0,0xfe,0x95,0xf0,0x94,0x4c,0x44,0xa8,0xa8,0x6f,0xb5,0x01,0x49,0x41,0xd1,0x02,0x44,0x01,0x4a,0x78,0x6b,0xb1,0xfe,0x06,0x05,0x9a,0xfe,0x07,0x77,0xfe,0xc4,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0x9a,0x00,0x15,0x00,0x64,0x40,0x42,0x27,0x15, +0x01,0x86,0x14,0x01,0x37,0x14,0x01,0x25,0x14,0x01,0x6b,0x0d,0x7b,0x0d,0x02,0x59,0x0d,0x01,0x99,0x09,0x01,0x1b,0x09,0x5b,0x09,0x02,0x08,0x09,0x01,0x65,0x02,0x75,0x02,0x02,0x00,0x7d,0x00,0x0b,0x10,0x0b,0x02,0x0b,0x0b,0x17,0x12,0x7e,0x0f,0x06,0x06,0x0f,0x0f,0x91,0x13,0x10,0x03,0x06,0x08,0x91,0x9a,0x05,0x01,0x05,0x03,0x13, +0x00,0x3f,0x33,0x5d,0xed,0x32,0x3f,0xdc,0xed,0x01,0x2f,0x32,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x00,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x00,0x11,0x34,0x00,0x23,0x21,0x11,0x33,0x15,0x33,0x20,0x00,0x04,0x8c,0xfe,0x75,0xfe,0xaf,0xcc,0x86,0x9a,0xba, +0x01,0x0a,0x01,0x20,0xfe,0xf1,0xf9,0xfe,0xf4,0x9c,0x86,0x01,0x3c,0x01,0x66,0x02,0xa7,0xfe,0xba,0xfe,0x87,0x3b,0xb3,0x56,0x01,0x1d,0x01,0x00,0xec,0x01,0x00,0x01,0x11,0x79,0xfe,0xb4,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0x2f,0x05,0x9a,0x00,0x14,0x00,0x3f,0x40,0x24,0x36,0x0e,0x46,0x0e,0x02,0x5b,0x05,0x01,0x12,0x00,0x7e,0x02, +0x02,0x16,0x0a,0x0c,0x7e,0x09,0x07,0x40,0x09,0x0d,0x48,0x07,0x02,0x04,0x91,0x12,0x10,0x10,0x01,0x0a,0x13,0x03,0x01,0x12,0x00,0x3f,0x3f,0xce,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2b,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x17, +0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x2f,0xa8,0xbc,0xc3,0xd7,0xfe,0x33,0xb0,0x3b,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x08,0xd8,0x72,0x88,0x92,0x64,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x01,0x00,0x96,0x00,0x00,0x04,0xc4,0x05,0x9a,0x00,0x10,0x00,0x41,0x40,0x26,0x96,0x0b,0x01,0x87,0x0b,0x01,0x49,0x06,0x01,0x3a, +0x06,0x01,0x3a,0x01,0x4a,0x01,0x02,0x09,0x7e,0x07,0x04,0x0f,0x7e,0x00,0x02,0x7e,0x04,0x05,0x02,0x91,0x0c,0x0c,0x04,0x0f,0x09,0x03,0x04,0x12,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x32,0x01,0x2f,0xfd,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x05,0x11,0x23,0x11,0x24,0x11,0x11,0x33,0x11, +0x10,0x21,0x20,0x11,0x11,0x33,0x04,0xc4,0xfe,0x3d,0xa8,0xfe,0x3d,0xa8,0x01,0x6f,0x01,0x6f,0xa8,0x04,0x48,0xfd,0xd4,0x2c,0xfe,0x10,0x01,0xf0,0x2e,0x02,0x13,0x01,0x69,0xfe,0xa2,0xfe,0x47,0x01,0xaa,0x01,0x6d,0x00,0x00,0x03,0x00,0x52,0xff,0xe8,0x06,0x3a,0x05,0x9a,0x00,0x17,0x00,0x22,0x00,0x2e,0x00,0x6b,0x40,0x40,0x89,0x2d, +0x01,0x85,0x27,0x01,0x77,0x27,0x01,0x95,0x17,0x01,0x9a,0x11,0x01,0x94,0x0a,0x01,0x94,0x01,0x01,0x1e,0x07,0x03,0x7e,0x24,0x14,0x06,0x06,0x00,0x7d,0x18,0x14,0x18,0x14,0x18,0x30,0x29,0x7e,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x07,0x24,0x91,0x04,0x1e,0x91,0x02,0x14,0x04,0x04,0x2b,0x1d,0x91,0x15,0x03,0x2b,0x91,0x0b,0x13,0x00,0x3f, +0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xde,0xed,0x10,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0x10,0xc4,0xfd,0xc4,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x21,0x15,0x21,0x15,0x21,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x33,0x11,0x21,0x20,0x03, +0x34,0x27,0x26,0x23,0x23,0x11,0x33,0x32,0x37,0x36,0x01,0x35,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x06,0x3a,0xfe,0x3c,0xfe,0xf0,0x02,0x23,0xfd,0xdd,0xcd,0xb6,0xb5,0x6b,0x71,0x81,0x74,0xb1,0xc6,0x01,0xaa,0x01,0xd2,0xb1,0x5b,0x45,0x97,0xec,0xec,0xa4,0x45,0x4e,0xfd,0x35,0xc6,0x65,0x45,0x4c,0xe1,0x69,0x3a,0x38, +0x04,0x61,0xfe,0xc7,0x82,0x98,0xa8,0xb5,0xc9,0x57,0x5c,0xa8,0xab,0x60,0x58,0x02,0xf4,0xfe,0xc7,0x60,0x25,0x1c,0xfe,0xbe,0x21,0x24,0xfd,0x61,0xa8,0x32,0x39,0x60,0xc4,0x41,0x3e,0x00,0x00,0x01,0x00,0x60,0xff,0xea,0x03,0x98,0x04,0x00,0x00,0x2d,0x00,0x58,0x40,0x36,0x99,0x16,0x01,0x88,0x16,0x01,0x95,0x29,0x01,0x76,0x29,0x86, +0x29,0x02,0x27,0x29,0x37,0x29,0x02,0x29,0x00,0x24,0x84,0x23,0x00,0x84,0x19,0x6a,0x1e,0x01,0x1e,0x19,0x10,0x19,0x90,0x19,0x02,0x23,0x19,0x23,0x19,0x2f,0x0f,0x84,0x0a,0x0d,0x0c,0x0c,0x24,0x0f,0x14,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x5d,0x10,0xed,0x10, +0xed,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x1e,0x03,0x03,0x98,0x44,0x72,0x96,0x51,0x51,0x95,0x72,0x43,0x28,0x9c,0x1e,0x27,0x43,0x59,0x32,0x32,0x5a, +0x43,0x28,0x16,0x28,0x39,0x23,0x36,0x41,0x26,0x0f,0x03,0xa4,0x01,0x0e,0x20,0x35,0x28,0x2c,0x47,0x31,0x1b,0x01,0x4a,0x57,0x84,0x58,0x2d,0x2d,0x58,0x84,0x57,0x5f,0x50,0x37,0x38,0x44,0x36,0x4f,0x34,0x19,0x19,0x34,0x4f,0x36,0x2f,0x49,0x42,0x3f,0x25,0x38,0x57,0x59,0x69,0x4b,0x37,0x54,0x48,0x45,0x28,0x2c,0x52,0x57,0x63,0x00, +0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xec,0x00,0x16,0x00,0x26,0x00,0x84,0x40,0x59,0x96,0x21,0x01,0x96,0x1d,0x01,0x53,0x15,0x01,0x44,0x15,0x01,0x53,0x14,0x01,0x42,0x14,0x01,0x09,0x0a,0x01,0x5a,0x06,0x01,0x4b,0x06,0x01,0x59,0x05,0x01,0x56,0x03,0x01,0x56,0x02,0x01,0x45,0x02,0x01,0x17,0x83,0x40,0x00,0x50,0x00,0x02, +0x00,0x12,0x84,0x0c,0x10,0x84,0x0e,0x0c,0x1f,0x83,0x0f,0x08,0x3f,0x08,0x02,0x08,0x4f,0x0c,0x01,0x0c,0x0e,0x95,0x11,0x11,0x0f,0x1b,0x95,0x0c,0x00,0x13,0x10,0x13,0x20,0x13,0x03,0x13,0x10,0x0f,0x00,0x23,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x5d,0x33,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x5d,0xdd,0x5d,0xed,0x10,0xde,0xed, +0x10,0xfd,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x10,0x37,0x36,0x37,0x35,0x21,0x11,0x33,0x15,0x21,0x11,0x16,0x17,0x16,0x03,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x50,0x85,0x8b,0xee, +0xe7,0x87,0x84,0x8d,0x71,0xb2,0xfe,0xb8,0xa4,0x01,0x48,0xb1,0x6b,0x80,0xa8,0x4a,0x55,0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0x01,0x02,0x91,0x74,0x17,0xc9,0x01,0x11,0x79,0xfe,0xa1,0x14,0x75,0x8c,0xfe,0xff,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a,0x73,0x74,0x66,0x00,0x02, +0x00,0x60,0xfe,0x1e,0x04,0x50,0x04,0x18,0x00,0x32,0x00,0x42,0x00,0x8d,0x40,0x5b,0x49,0x42,0x59,0x42,0x02,0x59,0x3e,0x01,0x4a,0x3e,0x01,0x55,0x3b,0x01,0x46,0x3b,0x01,0x6a,0x23,0x01,0x76,0x1a,0x01,0x65,0x1a,0x01,0x07,0x1a,0x17,0x1a,0x02,0x48,0x0e,0x58,0x0e,0x02,0x19,0x0e,0x29,0x0e,0x39,0x0e,0x03,0x19,0x16,0x83,0x2e,0x2b, +0x2e,0x1c,0x83,0x40,0x30,0x40,0x01,0x2e,0x40,0x2e,0x40,0x26,0x44,0x08,0x05,0x83,0x09,0x0c,0x0c,0x38,0x83,0x0f,0x26,0x1f,0x26,0x02,0x26,0x08,0x09,0x33,0x95,0x19,0x2b,0x2b,0x00,0x3d,0x95,0x21,0x1c,0x00,0x95,0x11,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xed,0x32, +0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02, +0x33,0x36,0x36,0x35,0x34,0x2e,0x02,0x13,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xc6,0x2a,0x46,0x32,0x1c,0x06,0x0e,0xa6,0x10,0x06,0x35,0x5f,0x83,0x4f,0x4f,0x82,0x5e,0x34,0x17,0x0e,0xa5,0xa7,0x46,0x83,0xbd,0x78,0x74,0xb9,0x81,0x44,0x46,0x85,0xc2,0x7c,0x0e,0x10,0x1d,0x33,0x47,0x6e,0x57,0x81, +0x54,0x2a,0x2b,0x56,0x80,0x55,0x9f,0xab,0xab,0x03,0x8e,0x1f,0x35,0x45,0x27,0x1b,0x2f,0x39,0x1d,0x46,0x3a,0x20,0x4a,0x7a,0x57,0x2f,0x2f,0x58,0x7d,0x4e,0x43,0x60,0x22,0x28,0xfa,0xc3,0x76,0xbd,0x84,0x47,0x44,0x80,0xb7,0x73,0x7c,0xc1,0x84,0x45,0x27,0x4e,0x35,0x33,0x4f,0x35,0x1b,0xfd,0xfa,0x35,0x62,0x8a,0x55,0x53,0x86,0x5e, +0x33,0xb0,0xbe,0xc0,0xb2,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x06,0xa0,0x04,0x18,0x00,0x3e,0x00,0x52,0x01,0x00,0x40,0xa8,0x97,0x11,0x01,0x95,0x10,0x01,0x57,0x50,0x01,0x55,0x4b,0x01,0x58,0x42,0x01,0x65,0x3d,0x01,0x65,0x3c,0x01,0x55,0x37,0x01,0x56,0x34,0x01,0x47,0x34,0x01,0x36,0x34,0x01,0x46,0x33,0x56,0x33,0x02,0x37,0x33, +0x01,0x39,0x2d,0x49,0x2d,0x59,0x2d,0x03,0x29,0x11,0x01,0x28,0x10,0x01,0x69,0x07,0x01,0x69,0x03,0x01,0x68,0x02,0x01,0x49,0x83,0x0a,0x38,0x9a,0x0c,0x01,0x89,0x0c,0x01,0x68,0x0c,0x78,0x0c,0x02,0x0c,0x0a,0x9d,0x2c,0x01,0x8f,0x2c,0x01,0x2c,0x31,0x92,0x1a,0x01,0x70,0x1a,0x01,0x1a,0x13,0x9d,0x20,0x01,0x7a,0x20,0x8a,0x20,0x02, +0x20,0x1f,0x1f,0x00,0x83,0x3f,0x0a,0x3f,0x0a,0x3f,0x54,0x13,0x83,0x31,0x29,0x29,0x31,0x4e,0x95,0x05,0x05,0x2c,0x44,0x95,0x3a,0x0c,0x0e,0x95,0x56,0x38,0x01,0x25,0x38,0x01,0x14,0x38,0x01,0x05,0x38,0x01,0x38,0x36,0x36,0x3a,0x10,0x26,0x1a,0x01,0x1a,0x20,0x2c,0x95,0x25,0x17,0x29,0x01,0x29,0x95,0x28,0x28,0x25,0x1f,0x20,0x1c, +0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x5d,0x10,0xed,0x11,0x39,0x5d,0x3f,0x33,0x2f,0x33,0x5d,0x5d,0x5d,0x5d,0xed,0x32,0x10,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0x33,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x11,0x33,0x5d,0x5d,0x5d,0x33,0x10,0xed,0x31, +0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x17,0x1e,0x03,0x17,0x07,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33, +0x32,0x17,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x06,0xa0,0x3c,0x74,0xa7,0x6b,0x6b,0xad,0x7b,0x43,0x46,0x6a,0x74,0x4d,0x7a,0x54,0x2d,0x2c,0x52,0x73,0x90,0xa7,0x5c,0x5d,0x96,0x7b,0x66,0x2d,0x68,0x64,0xc7,0xd4,0xe5,0x82,0x6c,0xc8,0x4b,0x4e,0xca,0x6b,0x54, +0x83,0x5c,0x30,0x45,0x81,0xbb,0x75,0xb7,0x83,0x7a,0xb4,0x6b,0xa7,0x74,0x3c,0xa8,0x21,0x45,0x6a,0x4a,0x4a,0x71,0x4c,0x27,0x27,0x4c,0x71,0x4a,0x4a,0x6a,0x45,0x21,0x02,0x2e,0x6a,0xb3,0x82,0x49,0x4a,0x83,0xb3,0x6a,0x9e,0x74,0x4c,0x41,0x70,0x94,0x53,0x61,0x98,0x78,0x5d,0x4c,0x3e,0x1d,0x1d,0x38,0x39,0x39,0x1f,0x7d,0x3f,0x5e, +0x3f,0x20,0x3f,0x3f,0xa8,0x31,0x31,0x2e,0x77,0x91,0xaa,0x62,0x7b,0xcd,0x95,0x53,0x64,0x64,0x4a,0x83,0xb4,0x69,0x46,0x80,0x61,0x39,0x39,0x60,0x7f,0x46,0x47,0x7f,0x61,0x39,0x38,0x60,0x7f,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x2d,0x00,0x6b,0x40,0x45,0x07,0x2b,0x17,0x2b,0x02,0x96,0x20,0x01,0x76,0x1f, +0x86,0x1f,0x96,0x1f,0x03,0x9c,0x1c,0x01,0x79,0x1c,0x89,0x1c,0x02,0x6a,0x16,0x01,0x59,0x16,0x01,0x75,0x12,0x01,0x57,0x12,0x67,0x12,0x02,0x77,0x11,0x01,0x2d,0x84,0x19,0x19,0x0a,0x2f,0x22,0x84,0x23,0x23,0x0d,0x0f,0x84,0x0c,0x0a,0x0d,0x0c,0x22,0x0c,0x22,0x14,0x1d,0x95,0x28,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed, +0x11,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e, +0x02,0x33,0x32,0x1e,0x02,0x15,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x74,0x55,0x30,0x80,0x71,0x32,0x53,0x3c,0x22,0xa6,0x3e,0x6b,0x8f,0x51,0x50,0x92,0x70,0x43,0x22,0x69,0xa6,0x74,0x3d,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4d,0x6d,0x45, +0x02,0xc2,0x79,0x83,0x19,0x34,0x51,0x37,0x55,0x83,0x5a,0x2e,0x2b,0x57,0x85,0x59,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x43,0x00,0x9b,0x40,0x61,0x87,0x3d,0x01,0x76,0x3d,0x01,0x76,0x2d,0x86,0x2d,0x96,0x2d,0x03,0x79,0x29,0x89,0x29,0x99,0x29,0x03,0x5b,0x1c,0x01,0x6a,0x16,0x01,0x59,0x16,0x01,0x56,0x12,0x66, +0x12,0x02,0x75,0x11,0x01,0x3f,0x3e,0x1f,0x3b,0x83,0x26,0x26,0x19,0x1f,0x1f,0x0f,0x00,0x83,0x19,0x19,0x0a,0x45,0x30,0x84,0x31,0x40,0x12,0x18,0x48,0x31,0x31,0x0d,0x0f,0x84,0x0c,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0d,0x0c,0x3f,0x3e,0x1e,0x31,0x31,0x2b,0x20,0x95,0x1e,0x0c,0x1e,0x0c,0x1e,0x14,0x2b,0x95,0x36,0x10,0x14,0x95,0x05, +0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x2b,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x11,0x33,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e, +0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b, +0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x1f,0x3c,0x58,0x39,0x32,0x56,0x40,0x25,0xa6,0x41,0x6f,0x92,0x51,0x55,0x93,0x6d,0x3f,0x98,0x8d,0x49,0x82,0x62,0x39,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54, +0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x34,0x57,0x3d,0x22,0x1b,0x35,0x50,0x35,0x5a,0x84,0x57,0x2b,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x00,0x03,0x00,0x3c,0xff,0xe8,0x05,0xcc,0x06,0x02,0x00,0x1a,0x00,0x2a,0x00,0x36,0x00,0x6e,0x40,0x44,0x48,0x36,0x58,0x36,0x02,0x46,0x33,0x56,0x33,0x02,0x47,0x2f,0x57,0x2f, +0x02,0x65,0x19,0x01,0x66,0x02,0x01,0x00,0x83,0x10,0x2b,0x30,0x2b,0x02,0x2b,0x2b,0x08,0x38,0x0f,0x84,0x23,0x31,0x83,0x08,0x1b,0x1b,0x15,0x84,0x0f,0x08,0x01,0x08,0x09,0x0b,0x95,0x27,0x2d,0x95,0x17,0x15,0x17,0x27,0x17,0x27,0x17,0x35,0x1f,0x95,0x12,0x01,0x35,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f, +0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x10,0xed,0xdc,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x21,0x22,0x27,0x26,0x35,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x11,0x36,0x33,0x32,0x17,0x16,0x01,0x34,0x27,0x26,0x23,0x22,0x07, +0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x01,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x05,0xcc,0x6c,0x76,0xfe,0xf8,0xe5,0x80,0x79,0x31,0x64,0x91,0x52,0x50,0x9f,0x94,0x01,0x3d,0x88,0xc6,0xea,0x7a,0x6e,0xfc,0x38,0x24,0x28,0x44,0x44,0x28,0x24,0x24,0x28,0x43,0x43,0x29,0x25,0x03,0x20,0xfe,0xca,0xa8,0x53, +0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xf0,0x81,0x97,0x8f,0x88,0xe1,0x01,0xd3,0x2c,0x57,0x54,0x91,0x94,0xab,0xfe,0xc9,0xfe,0x9a,0x77,0x8d,0x80,0x01,0xf6,0x47,0x32,0x39,0x39,0x32,0x47,0x45,0x33,0x38,0x38,0x33,0xfd,0x6a,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0xc1,0x04,0x18,0x00,0x2a, +0x00,0x3e,0x00,0xca,0x40,0x8b,0x39,0x3c,0x01,0x36,0x38,0x01,0x37,0x32,0x01,0x38,0x2e,0x01,0x47,0x28,0x57,0x28,0x02,0x57,0x23,0x01,0x45,0x23,0x01,0x57,0x22,0x01,0x5a,0x1e,0x01,0x49,0x1e,0x01,0x48,0x1d,0x58,0x1d,0x02,0x58,0x19,0x01,0x49,0x19,0x01,0x4a,0x18,0x5a,0x18,0x02,0x45,0x14,0x55,0x14,0x02,0x47,0x13,0x57,0x13,0x02, +0x46,0x0f,0x01,0x39,0x0a,0x99,0x0a,0x02,0x2a,0x0a,0x01,0x99,0x09,0x01,0x68,0x05,0x98,0x05,0x02,0x94,0x03,0x01,0x76,0x02,0x86,0x02,0x02,0x03,0x04,0x04,0x07,0x19,0x23,0x01,0x23,0x37,0x0f,0x01,0x0f,0x11,0x83,0x2b,0x00,0x83,0x07,0x10,0x07,0x01,0x2b,0x07,0x2b,0x07,0x40,0x35,0x83,0x1b,0x30,0x95,0x20,0x20,0x0f,0x0c,0x95,0x24, +0x23,0x34,0x23,0x02,0x15,0x23,0x01,0x23,0x26,0x10,0x04,0x03,0x03,0x3a,0x95,0x16,0x16,0x00,0x3f,0xed,0x33,0x2f,0x33,0x3f,0x33,0x5d,0x5d,0xed,0x32,0x33,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x32,0x5d,0x32,0x5d,0x11,0x39,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x05,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02, +0x33,0x32,0x3e,0x02,0x06,0xc1,0x7f,0x76,0x75,0x5d,0x65,0x2c,0x56,0x7e,0x52,0x3f,0x64,0x2d,0x4f,0x43,0x81,0xbc,0x79,0x74,0xb7,0x7f,0x43,0x44,0x83,0xc1,0x7d,0x5e,0x94,0x3c,0x43,0x98,0x5d,0x76,0xbb,0x81,0x44,0xfc,0xdd,0x23,0x4d,0x7c,0x59,0x58,0x7f,0x53,0x27,0x29,0x54,0x7e,0x56,0x59,0x7c,0x4d,0x23,0x01,0xe8,0xa5,0xfe,0x5d, +0x73,0x47,0xcc,0x88,0x4d,0x93,0x72,0x46,0x22,0x23,0x80,0xc5,0x77,0xc6,0x8f,0x50,0x4e,0x8b,0xc1,0x72,0x7b,0xca,0x90,0x4f,0x2e,0x30,0x30,0x2e,0x57,0x97,0xcd,0x5f,0x54,0x92,0x6c,0x3e,0x40,0x6d,0x93,0x54,0x52,0x8f,0x6a,0x3d,0x3d,0x6a,0x91,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x81,0x04,0x18,0x00,0x19,0x00,0x89,0x40,0x5a, +0x45,0x18,0x01,0x4a,0x14,0x01,0x96,0x0b,0x01,0x99,0x07,0x01,0x28,0x07,0x38,0x07,0x02,0x99,0x10,0x01,0x88,0x10,0x01,0x79,0x10,0x01,0x10,0x12,0x0f,0x96,0x02,0x01,0x87,0x02,0x01,0x76,0x02,0x01,0x02,0x03,0x00,0x67,0x0f,0x01,0x01,0x0f,0x01,0x68,0x03,0x01,0x0e,0x03,0x01,0x0f,0x03,0x0f,0x03,0x0d,0x00,0x83,0x20,0x05,0x30,0x05, +0xa0,0x05,0x03,0x05,0x05,0x1b,0x0d,0x83,0x0f,0x12,0x1f,0x12,0xaf,0x12,0x03,0x12,0x09,0x95,0x16,0x10,0x03,0x02,0x02,0x0f,0x10,0x16,0x00,0x3f,0x33,0x33,0x2f,0x33,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x5d,0x5d,0x5d, +0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x27,0x36,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x10,0x17,0x07,0x26,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x04,0x81,0xeb,0x75,0xb8,0x5e,0x65,0xa8,0xa8,0x63,0x5b,0xb8,0x75,0xeb,0x8b,0x90,0xf7,0xf7,0x8e,0x8a,0x01,0xe8,0xfe,0xb8,0xb8,0x73,0x8d,0x01,0x0e,0xab,0x72, +0x7b,0x7b,0x71,0xac,0xfe,0xf2,0x8d,0x73,0xb8,0x01,0x48,0xfa,0x98,0x9e,0x9e,0x98,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x39,0x00,0x72,0x40,0x44,0x86,0x33,0x01,0x77,0x33,0x01,0x79,0x29,0x89,0x29,0x99,0x29,0x03,0x6b,0x16,0x01,0x59,0x16,0x01,0x74,0x12,0x01,0x67,0x12,0x01,0x56,0x12,0x01,0x34,0x35,0x31,0x1f, +0x1f,0x0f,0x00,0x83,0x19,0x19,0x0a,0x3b,0x31,0x83,0x2b,0x26,0x0d,0x0f,0x84,0x0c,0x0a,0x35,0x34,0x20,0x95,0x0d,0x0c,0x1e,0x0c,0x1e,0x0c,0x14,0x2b,0x95,0x2c,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x39,0x39,0x01,0x2f,0x33,0xed,0x32,0x2f,0xce,0xed,0x11,0x12,0x39,0x2f,0xed, +0x12,0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x35,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03, +0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x1f,0x3c,0x58,0x39,0x55,0x93,0x6d,0x3f,0x98,0x8d,0x49,0x82,0x62,0x39,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26, +0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x34,0x57,0x3d,0x22,0x8b,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x08,0x06,0x04,0x18,0x00,0x5f,0x01,0x72,0x40,0xf7,0x77,0x5e,0x01,0x86,0x5d,0x01,0x75,0x5d,0x01,0x89,0x58,0x01,0x77,0x53,0x01,0x89,0x50,0x01, +0x78,0x50,0x01,0x99,0x4f,0x01,0x97,0x4b,0x01,0x86,0x4b,0x01,0x99,0x47,0x01,0x88,0x47,0x01,0x79,0x47,0x01,0x78,0x41,0x01,0x66,0x2d,0x01,0x5a,0x29,0x6a,0x29,0x02,0x66,0x1f,0x01,0x64,0x1e,0x01,0x56,0x1e,0x01,0x5a,0x1a,0x6a,0x1a,0x02,0x6a,0x19,0x01,0x97,0x11,0x01,0x56,0x0f,0x66,0x0f,0x02,0x69,0x0b,0x01,0x99,0x07,0x01,0x88, +0x07,0x01,0x69,0x07,0x01,0x44,0x59,0x01,0x45,0x53,0x01,0x45,0x50,0x01,0x45,0x4c,0x01,0x47,0x4b,0x01,0x46,0x10,0x01,0x47,0x0f,0x01,0x4e,0x23,0x84,0x24,0x56,0x15,0x94,0x05,0x01,0x85,0x05,0x01,0x76,0x05,0x01,0x05,0x06,0x06,0x08,0x14,0x84,0x15,0x7f,0x3f,0x8f,0x3f,0x9f,0x3f,0x03,0x5c,0x3f,0x01,0x4b,0x3f,0x01,0x3a,0x3f,0x01, +0x2d,0x3f,0x01,0x3f,0x44,0x9b,0x38,0x01,0x8a,0x38,0x01,0x7b,0x38,0x01,0x6c,0x38,0x01,0x5a,0x38,0x01,0x38,0x93,0x35,0x01,0x85,0x35,0x01,0x62,0x35,0x01,0x35,0x37,0x37,0x30,0x00,0x83,0x08,0x24,0x15,0x08,0x08,0x15,0x24,0x03,0x61,0x30,0x83,0x44,0x3d,0x3d,0x44,0x0d,0x95,0x5b,0x5b,0x51,0x2b,0x95,0x49,0x49,0x70,0x4e,0x01,0x44, +0x4e,0x01,0x70,0x56,0x01,0x44,0x56,0x01,0x4e,0x56,0x23,0x51,0x14,0x14,0x23,0x23,0x05,0x1c,0x95,0x51,0x10,0x35,0x38,0x3f,0x95,0x3a,0x3d,0x95,0x3c,0x3c,0x3a,0x37,0x38,0x1c,0x06,0x05,0x16,0x00,0x3f,0x33,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x3f,0xed,0x11,0x39,0x2f,0x33,0x2f,0x11,0x12,0x39,0x39,0x5d,0x5d,0x5d, +0x5d,0x33,0x2f,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x12,0x39,0x2f,0x39,0x5d,0x5d,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x11,0x39,0x10,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x07,0x27,0x36,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15, +0x14,0x1e,0x02,0x17,0x04,0x17,0x07,0x24,0x21,0x22,0x07,0x35,0x36,0x33,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x08,0x06,0x1c,0x3a,0x59,0x3c,0x75,0xb8,0x1f,0x36,0x4a,0x2b,0x2b,0x42,0x30,0x20,0x14,0x08,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x29, +0x3f,0x2e,0x1e,0x13,0x08,0xa4,0x08,0x14,0x21,0x30,0x41,0x2b,0x2b,0x4a,0x36,0x1f,0x56,0x9f,0xde,0x89,0x01,0x91,0xb6,0x68,0xfe,0x6f,0xfd,0xf9,0xd7,0x94,0x9b,0xd4,0x54,0x7e,0x53,0x2a,0x29,0x59,0x8d,0x63,0x2f,0x5a,0x4f,0x3f,0x15,0x2a,0x99,0x5d,0x2e,0x59,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x5a,0x2f,0x55,0x89,0x60,0x34,0x02,0x26, +0x4e,0xa3,0x99,0x85,0x2f,0x73,0x8d,0x01,0x3e,0x5a,0x87,0x5a,0x2d,0x2b,0x46,0x59,0x5d,0x59,0x22,0x22,0x58,0x5d,0x5a,0x46,0x2b,0x2d,0x48,0x5b,0x5d,0x56,0x1f,0x1f,0x56,0x5d,0x5b,0x48,0x2d,0x2d,0x5a,0x87,0x5a,0x91,0xd1,0x98,0x6c,0x2b,0x80,0x7a,0x7d,0xfc,0x7e,0xa8,0x62,0x2d,0x8c,0xaa,0xbe,0x5f,0x5b,0xb2,0x8d,0x58,0x1b,0x33, +0x4a,0x2f,0x5f,0x68,0x1b,0x33,0x4a,0x2f,0x2f,0x4a,0x33,0x1b,0x3e,0x7d,0xbb,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x25,0x00,0x33,0x00,0x72,0x40,0x4a,0x59,0x31,0x01,0x56,0x2e,0x01,0x59,0x29,0x01,0x99,0x1e,0x01,0x99,0x1d,0x01,0x76,0x18,0x01,0x67,0x17,0x01,0x6a,0x14,0x7a,0x14,0x02,0x69,0x0d,0x01,0x69, +0x0c,0x01,0x26,0x25,0x83,0x30,0x11,0x40,0x11,0x02,0x11,0x11,0x0a,0x35,0x1a,0x84,0x1b,0x1b,0x2d,0x83,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x2b,0x95,0x4f,0x1b,0x01,0x1b,0x11,0x0f,0x0f,0x2f,0x15,0x95,0x20,0x01,0x2f,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xce,0x5d,0xed,0x01,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11, +0x12,0x39,0x2f,0x5d,0xed,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x03,0x34,0x2e,0x02,0x23,0x20,0x11,0x10,0x21,0x32,0x3e,0x02,0x04,0x28, +0x3f,0x7a,0xb2,0x73,0x75,0xb7,0x7d,0x41,0x3b,0x75,0xae,0x74,0xc5,0x89,0x8d,0x87,0x31,0x56,0x41,0x25,0xa6,0x41,0x6f,0x91,0x50,0x66,0xa5,0x74,0x3f,0xa8,0x26,0x4e,0x7a,0x54,0xfe,0xca,0x01,0x36,0x52,0x79,0x50,0x27,0x01,0xe0,0x70,0xb9,0x85,0x4a,0x4c,0x8a,0xbf,0x73,0x71,0xb6,0x80,0x45,0x77,0xec,0x8a,0x9d,0x1e,0x3b,0x58,0x39, +0x55,0x89,0x61,0x35,0x3d,0x74,0xa6,0x69,0xfd,0xa4,0x50,0x86,0x60,0x36,0xfe,0x98,0xfe,0x88,0x3a,0x65,0x87,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x1f,0x00,0x2b,0x00,0x7f,0x40,0x2c,0x59,0x2b,0x01,0x56,0x29,0x01,0x47,0x29,0x01,0x56,0x28,0x01,0x55,0x24,0x01,0x5a,0x21,0x01,0x66,0x1e,0x76,0x1e,0x02,0x2b, +0x0a,0x3b,0x0a,0x4b,0x0a,0x03,0x0c,0x0a,0x1c,0x0a,0x02,0x69,0x05,0x01,0x10,0x11,0x11,0x00,0x83,0x20,0xb8,0xff,0xc0,0x40,0x24,0x0a,0x0d,0x48,0x20,0x20,0x2d,0x26,0x83,0x1a,0x84,0x0f,0x08,0x1f,0x08,0x02,0x08,0x22,0x95,0x1a,0x1c,0x1c,0x2a,0x11,0x13,0x95,0x10,0x0e,0x0e,0x16,0x95,0x0b,0x01,0x2a,0x95,0x04,0x16,0x00,0x3f,0xed, +0x3f,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x39,0x2f,0x33,0xed,0x01,0x2f,0x5d,0xed,0xed,0x12,0x39,0x2f,0x2b,0xed,0x32,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x10,0x21,0x32,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x23,0x22,0x06,0x15,0x11, +0x36,0x33,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x04,0x28,0x7b,0x84,0xeb,0xe5,0x80,0x79,0x01,0x5a,0x40,0xeb,0x35,0x52,0x72,0x4a,0x83,0x88,0x44,0xf5,0x2d,0x64,0x4b,0x88,0xc6,0xea,0x7a,0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xe6,0x8c,0x96,0x8f,0x88,0xe1, +0x02,0xd0,0x01,0x52,0x46,0x46,0x71,0x5f,0x46,0x55,0x64,0xfe,0xa6,0x77,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x05,0xae,0x04,0x18,0x00,0x3e,0x00,0xb8,0x40,0x11,0x86,0x3c,0x96,0x3c,0x02,0x77,0x38,0x01,0x66,0x38,0x01,0x47,0x38,0x57,0x38,0x02,0x32,0xb8,0xff,0xf8,0x40,0x65, +0x0d,0x10,0x48,0x96,0x2e,0x01,0x87,0x2e,0x01,0x99,0x27,0x01,0x75,0x24,0x01,0x66,0x24,0x01,0x85,0x23,0x01,0x69,0x20,0x79,0x20,0x02,0x6a,0x0b,0x7a,0x0b,0x02,0x84,0x08,0x01,0x66,0x07,0x76,0x07,0x02,0x99,0x04,0x01,0x88,0x04,0x01,0x26,0x25,0x25,0x16,0x2b,0x83,0x22,0x16,0x35,0x16,0x05,0x06,0x06,0x15,0x00,0x83,0x09,0x15,0x84, +0x16,0x0e,0x95,0x3a,0x3a,0x71,0x35,0x01,0x62,0x35,0x01,0x40,0x35,0x50,0x35,0x02,0x35,0x30,0x16,0x16,0x26,0x1d,0x95,0x30,0x10,0x94,0x06,0x01,0x06,0x05,0x05,0x94,0x25,0x01,0x25,0x26,0x16,0x00,0x3f,0x33,0x5d,0x33,0x2f,0x33,0x5d,0x3f,0xed,0x11,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0x32,0x2f,0xed,0x01,0x2f,0xfd,0xde,0xed,0x12, +0x39,0x2f,0x33,0x11,0x39,0x10,0xde,0xed,0x12,0x39,0x2f,0x33,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x2e,0x03, +0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x05,0xae,0x1f,0x3e,0x5c,0x3c,0x75,0x5d,0x65,0x22,0x3a,0x4d,0x2b,0x2d,0x43,0x30,0x20,0x12,0x07,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x65,0x5d,0x75,0x3c,0x5c,0x3e,0x1f,0x37,0x64,0x8c,0x55,0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f, +0x59,0x2e,0x55,0x8c,0x64,0x37,0x02,0x26,0x4e,0xa3,0x99,0x85,0x2f,0x73,0x47,0xe4,0xa0,0x5a,0x87,0x5a,0x2d,0x2a,0x45,0x59,0x5d,0x59,0x24,0x26,0x5b,0x5d,0x57,0x44,0x29,0x2d,0x5a,0x87,0x5a,0xa0,0xe4,0x47,0x73,0x2f,0x85,0x99,0xa3,0x4e,0x7c,0xbb,0x7d,0x3e,0x1e,0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x00,0x00,0x01, +0x00,0x60,0xff,0xe8,0x03,0xf1,0x06,0x02,0x00,0x3f,0x00,0x99,0x40,0x5b,0x86,0x38,0x01,0x96,0x31,0x01,0x79,0x28,0x01,0x6a,0x16,0x01,0x59,0x16,0x01,0x56,0x12,0x66,0x12,0x02,0x7a,0x08,0x8a,0x08,0x02,0x7a,0x07,0x8a,0x07,0x02,0x46,0x3e,0x01,0x47,0x33,0x01,0x3a,0x3b,0x1f,0x31,0x2d,0x35,0x84,0x29,0x2d,0x26,0x26,0x19,0x2e,0x2d, +0x2d,0x1f,0x1f,0x0f,0x00,0x83,0x19,0x19,0x41,0x0d,0x0f,0x84,0x0c,0x0a,0x3b,0x3a,0x1e,0x18,0x31,0x01,0x09,0x31,0x01,0x29,0x31,0x2e,0x20,0x95,0x0d,0x0c,0x1e,0x0c,0x1e,0x0c,0x2d,0x2e,0x01,0x14,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x11,0x39,0x39,0x5d,0x5d,0x11,0x39,0x39,0x01,0x2f,0x33, +0xed,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0xed,0x11,0x39,0x11,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23, +0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x27,0x37,0x1e,0x05,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x79,0x49,0x20,0x38,0x59,0x70,0x70,0x65,0x21,0x5e,0x23,0x70,0x7f,0x81,0x68, +0x41,0x1e,0x3f,0x64,0x46,0x49,0x82,0x62,0x39,0x01,0xbc,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1d,0x34,0x47,0x2a,0x37,0x46,0x31,0x24,0x2b,0x3b,0x2f,0x56,0x2c,0x3b,0x31,0x31,0x43,0x5f,0x47,0x2c,0x54,0x47,0x35,0x0c,0x04,0x0b,0x43, +0x66,0x85,0x00,0x01,0x00,0x3f,0xfe,0x1e,0x03,0xf1,0x04,0x00,0x00,0x2d,0x00,0x8e,0x40,0x52,0x65,0x13,0x01,0x56,0x13,0x01,0x76,0x0f,0x01,0x57,0x0f,0x67,0x0f,0x02,0x2c,0x2d,0x84,0x16,0x18,0x1a,0x28,0x25,0x27,0x27,0x20,0x1a,0x84,0x25,0x25,0x0d,0x16,0x16,0x08,0x2f,0x20,0x84,0x1f,0x1f,0x0b,0x0d,0x84,0x0a,0x08,0x28,0x95,0x18, +0x27,0x18,0x1f,0x20,0x0b,0x0a,0x0a,0x11,0x1d,0x95,0x22,0x89,0x16,0x99,0x16,0x02,0x16,0x2d,0x00,0x18,0x10,0x18,0x02,0x18,0x20,0x22,0x22,0x20,0x18,0x03,0x2d,0x0f,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x12,0x39,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x11,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0x33, +0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x37,0x16, +0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x32,0x37,0x36,0x37,0x33,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x57,0x5d,0x5f,0xab,0x3f,0x8e,0x9b,0xf9,0x21,0x89,0x17,0x7a,0x4c,0x40,0x6f,0x37,0xac,0x62,0x73,0x73,0x50,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c, +0x51,0x8a,0x03,0x3b,0x39,0x08,0x4a,0x65,0x75,0x93,0x01,0x1d,0x26,0xb9,0x47,0x47,0x6b,0x3c,0x82,0x1f,0x24,0x6a,0x00,0x01,0x00,0x60,0xff,0xe8,0x05,0xae,0x06,0x02,0x00,0x52,0x00,0xfc,0x40,0xa7,0x96,0x4c,0x01,0x94,0x47,0x01,0x99,0x2f,0x01,0x66,0x4c,0x76,0x4c,0x02,0x84,0x4b,0x01,0x8c,0x48,0x01,0x8a,0x47,0x01,0x69,0x47,0x79, +0x47,0x02,0x4a,0x42,0x5a,0x42,0x6a,0x42,0x03,0x4a,0x39,0x5a,0x39,0x6a,0x39,0x03,0x7b,0x33,0x01,0x6a,0x33,0x01,0x85,0x2f,0x01,0x66,0x2f,0x76,0x2f,0x02,0x89,0x2c,0x01,0x86,0x25,0x96,0x25,0x02,0x77,0x21,0x01,0x25,0x04,0x01,0x55,0x03,0x01,0x46,0x03,0x01,0x34,0x03,0x01,0x26,0x03,0x01,0x9b,0x4e,0x01,0x4e,0x4d,0x4d,0x3e,0x94, +0x17,0x01,0x17,0x11,0x4a,0x07,0x0d,0x00,0x83,0x4a,0x3e,0x94,0x2d,0x01,0x2d,0x2e,0x2e,0x3d,0x31,0x0c,0x0d,0x0d,0x28,0x83,0x31,0x1e,0x3d,0x84,0x3e,0x70,0x1e,0x01,0x1e,0x23,0x3e,0x3e,0x4e,0x2e,0x2d,0x2d,0x4d,0x4e,0x16,0x36,0x95,0x23,0x45,0x95,0x17,0x19,0x19,0x9d,0x11,0x01,0x7a,0x11,0x8a,0x11,0x02,0x96,0x07,0x01,0x09,0x07, +0x19,0x07,0x29,0x07,0x03,0x11,0x07,0x0c,0x23,0x10,0x0d,0x0c,0x01,0x00,0x3f,0x33,0x3f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x33,0x2f,0x33,0xed,0x10,0xed,0x3f,0x33,0x33,0x2f,0x33,0x11,0x39,0x2f,0x12,0x39,0x5d,0x01,0x2f,0xfd,0x39,0xde,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x5d,0x10,0xde,0xed,0x11,0x39,0x12,0x39,0x39, +0x5d,0x11,0x39,0x2f,0x33,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x13,0x34,0x3e,0x02,0x37,0x3e,0x05,0x37,0x17,0x0e,0x05,0x07,0x06,0x06,0x07,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07, +0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x2e,0x03,0x60,0x30,0x64,0x99,0x69,0x3f,0x85,0x81,0x7a,0x67,0x50,0x18,0x76,0x17,0x5d,0x7a,0x8b,0x8b,0x80,0x31,0x3c,0x4a,0x13,0x18,0x18,0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x59,0x2e,0x55,0x8c, +0x64,0x37,0x1f,0x3e,0x5c,0x3c,0x75,0x5d,0x65,0x22,0x3a,0x4d,0x2b,0x2d,0x43,0x30,0x20,0x12,0x07,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x65,0x5d,0x75,0x3c,0x5c,0x3e,0x1f,0x02,0x26,0x84,0xe2,0xb8,0x8c,0x2d,0x1b,0x2a,0x24,0x23,0x28,0x30,0x21,0x53,0x25,0x3c,0x33,0x2c,0x29,0x28,0x16,0x1b,0x3f,0x19,0x03,0x1e, +0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x7c,0x4e,0xa3,0x99,0x85,0x2f,0x73,0x47,0xe4,0xa0,0x5a,0x87,0x5a,0x2d,0x2a,0x45,0x59,0x5d,0x59,0x24,0x26,0x5b,0x5d,0x57,0x44,0x29,0x2d,0x5a,0x87,0x5a,0xa0,0xe4,0x47,0x73,0x2f,0x85,0x99,0xa3,0x00,0x01,0x00,0x9a,0xff,0xe6,0x04,0x1d,0x05,0xec,0x00,0x19,0x00,0x6b,0x40,0x26, +0x99,0x13,0x01,0x68,0x13,0x78,0x13,0x02,0x69,0x0e,0x01,0x65,0x0c,0x01,0x56,0x0c,0x01,0x79,0x06,0x01,0x89,0x05,0x01,0x96,0x03,0x01,0x76,0x02,0x01,0x14,0x15,0x17,0x84,0x12,0x00,0x84,0x0f,0x12,0xb8,0xff,0xc0,0x40,0x1c,0x0a,0x0d,0x48,0x10,0x0f,0x20,0x0f,0x02,0x12,0x0f,0x12,0x0f,0x1b,0x0b,0x84,0x90,0x08,0x01,0x08,0x15,0x14, +0x10,0x0a,0x00,0x0d,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x10,0xed,0x10,0xfd,0xce,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x34,0x26,0x35,0x34,0x37,0x17,0x06, +0x15,0x14,0x16,0x04,0x1d,0x6a,0x76,0xe0,0xe5,0x74,0x6a,0xa2,0x01,0x21,0x01,0x1b,0x78,0xbf,0x4d,0x5e,0x6f,0x01,0xb3,0xd5,0x78,0x80,0x7b,0x77,0xd8,0x04,0x3c,0xfb,0xe1,0xfe,0xab,0x01,0x34,0x71,0xfb,0x3c,0x87,0x3d,0x87,0x23,0x34,0x1a,0xf7,0x00,0x00,0x02,0x00,0x5e,0xfe,0x1e,0x05,0xaa,0x05,0x31,0x00,0x36,0x00,0x42,0x01,0x23, +0x40,0xc8,0x09,0x13,0x01,0x06,0x10,0x01,0x57,0x35,0x01,0x77,0x2f,0x87,0x2f,0x02,0x77,0x2b,0x87,0x2b,0x02,0x88,0x27,0x01,0x7c,0x15,0x8c,0x15,0x02,0x6a,0x15,0x01,0x66,0x13,0x01,0x65,0x10,0x01,0x56,0x10,0x01,0x47,0x10,0x01,0x65,0x0f,0x85,0x0f,0x95,0x0f,0x03,0x69,0x0d,0x01,0x57,0x0a,0x01,0x79,0x06,0x01,0x79,0x02,0x01,0x1e, +0xa1,0x1f,0xb1,0x1f,0xc1,0x1f,0x03,0x50,0x1f,0x01,0x1f,0x1f,0x18,0x00,0x83,0x14,0x14,0x29,0x44,0x56,0x33,0x01,0x16,0x33,0x18,0x31,0x84,0x5a,0x27,0x01,0x27,0x41,0x25,0x37,0x3f,0x84,0x29,0x18,0x84,0x25,0x25,0x29,0x08,0x83,0x0f,0x0e,0x01,0x0e,0x0b,0x0c,0x29,0x7b,0x0c,0x8b,0x0c,0x9b,0x0c,0x03,0x49,0x0c,0x01,0x0c,0x85,0x41, +0x01,0x74,0x41,0x01,0x48,0x33,0x68,0x33,0x02,0x39,0x33,0x01,0x78,0x27,0x01,0x6a,0x27,0x01,0x58,0x27,0x01,0x3a,0x27,0x4a,0x27,0x02,0x06,0x27,0x16,0x27,0x26,0x27,0x03,0x27,0x33,0x41,0x03,0x3b,0x9c,0x16,0x01,0x8b,0x16,0x01,0x7c,0x16,0x01,0x6a,0x16,0x01,0x38,0x16,0x48,0x16,0x58,0x16,0x03,0x16,0x0b,0x0b,0x1c,0x2d,0x95,0x3b, +0x3b,0x1f,0x21,0x95,0x1e,0x1c,0x12,0x95,0x04,0x1c,0x00,0x3f,0xed,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x12,0x39,0x2f,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x33,0x5d,0x5d,0x01,0x2f,0xce,0x32,0xdc,0x5d,0xed,0x11,0x33,0x2f,0xed,0x10,0xfd,0xde,0x11,0x39,0x39,0x5d,0xed,0x11, +0x39,0x39,0x5d,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x5d,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x25,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x34,0x12,0x37,0x17,0x06,0x11,0x14,0x17,0x16,0x33,0x20,0x11,0x10,0x25,0x06,0x15,0x14,0x17,0x16,0x33, +0x32,0x37,0x17,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x36,0x05,0xaa,0xae,0xb5,0xfe,0xb2,0xfe,0xc5,0xb3,0xad,0xbb,0xb1,0x3b,0xf7,0x78,0x83,0xf0,0x02,0x01,0xfe,0x72,0x60,0x20,0x1d,0x25,0x39, +0x22,0x7a,0x52,0x83,0x62,0x4a,0x52,0x82,0x82,0x53,0x49,0x63,0x5e,0x4a,0x4f,0x87,0xd3,0x78,0x80,0xfe,0x22,0x1f,0x1b,0x23,0x25,0x1d,0x20,0x60,0x5f,0xd9,0xfe,0xb9,0xb7,0xbd,0xc1,0xbb,0x01,0x3a,0xeb,0x01,0x56,0x53,0x96,0x90,0xfe,0xa1,0xf3,0x96,0xa5,0x02,0x0d,0x01,0x67,0xf7,0x5b,0x45,0x28,0x19,0x17,0x2c,0x50,0x6d,0x39,0x40, +0x66,0x79,0x79,0x6e,0x72,0x6d,0x42,0x3a,0x3c,0x40,0x5b,0x62,0x7c,0x7b,0xaa,0xb5,0x02,0xb8,0x21,0x14,0x11,0x14,0x17,0x23,0x46,0x42,0x59,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x06,0x22,0x04,0x18,0x00,0x5a,0x00,0xe8,0x40,0x99,0x17,0x57,0x01,0x7a,0x53,0x01,0x69,0x53,0x01,0x7b,0x52,0x01,0x6a,0x52,0x01,0x48,0x50,0x58,0x50,0x02, +0x96,0x4e,0x01,0x65,0x4e,0x75,0x4e,0x02,0x97,0x4d,0x01,0x86,0x4d,0x01,0x65,0x4d,0x75,0x4d,0x02,0x69,0x49,0x01,0x98,0x3c,0x01,0x89,0x3c,0x01,0x57,0x35,0x01,0x46,0x35,0x01,0x37,0x35,0x01,0x48,0x2c,0x58,0x2c,0x02,0x49,0x2b,0x01,0x8a,0x1d,0x9a,0x1d,0x02,0x48,0x17,0x01,0x5a,0x16,0x01,0x49,0x16,0x01,0x65,0x12,0x75,0x12,0x02, +0x47,0x12,0x57,0x12,0x02,0x5a,0x84,0x19,0x19,0x27,0x5c,0x3d,0x20,0x3e,0x40,0x3e,0x50,0x3e,0x03,0x3e,0x3e,0x48,0x33,0x27,0x43,0x84,0x3b,0x50,0x26,0x84,0x27,0x0d,0x0f,0x84,0x0c,0x0a,0x0a,0x27,0x1f,0x95,0x55,0x55,0x4b,0x3e,0x3d,0x3d,0x4b,0x36,0x95,0x45,0x2e,0x0d,0x0c,0x50,0x26,0x4b,0x0c,0x26,0x0c,0x26,0x14,0x2e,0x95,0x4b, +0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xdc,0xed,0x11,0x33,0x2f,0x33,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xdc,0xed,0x11,0x39,0x39,0x32,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x2e,0x02, +0x35,0x34,0x37,0x17,0x0e,0x03,0x15,0x14,0x33,0x36,0x36,0x37,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x06,0x22,0x4d,0x85,0xb4,0x66,0x59,0xa0,0x79,0x47,0x29,0x99,0x1c,0x2c,0x4c,0x64,0x39,0x43,0x77,0x59,0x33,0x17,0x2c,0x3d,0x27,0x24,0x38,0x2b,0x1e,0x12,0x09,0xa4,0x0a,0x13,0x1d,0x26,0x30,0x1c, +0x1d,0x2b,0x22,0x1e,0x11,0x21,0x73,0x63,0x32,0x50,0x38,0x1d,0x7f,0x69,0x12,0x20,0x1a,0x0f,0x4d,0x2e,0x45,0x1f,0x1f,0x84,0x58,0x2e,0x4c,0x3e,0x32,0x13,0x15,0x36,0x43,0x52,0x30,0x55,0x7e,0x52,0x29,0x0e,0x73,0xaf,0x76,0x3c,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4f,0x76,0x4e,0x02,0x40,0x5f, +0x89,0x59,0x2a,0x2d,0x48,0x5b,0x5d,0x56,0x1f,0x1f,0x56,0x5d,0x5b,0x48,0x2d,0x1a,0x35,0x4e,0x34,0x68,0x69,0x22,0x3c,0x54,0x32,0x88,0x6c,0x59,0x0b,0x20,0x28,0x30,0x1a,0x54,0x01,0x56,0x67,0x68,0x78,0x1f,0x39,0x4f,0x2f,0x2f,0x4f,0x39,0x1f,0x38,0x77,0xbb,0x84,0x00,0x00,0x02,0x00,0x40,0xfe,0x1e,0x06,0x9c,0x04,0x18,0x00,0x55, +0x00,0x69,0x00,0xd9,0x40,0x52,0x5a,0x67,0x01,0x39,0x67,0x49,0x67,0x02,0x36,0x63,0x46,0x63,0x56,0x63,0x03,0x56,0x5d,0x01,0x35,0x5d,0x45,0x5d,0x02,0x39,0x59,0x49,0x59,0x59,0x59,0x03,0x56,0x54,0x01,0x86,0x4f,0x96,0x4f,0x02,0x75,0x4f,0x01,0x95,0x4b,0x01,0x96,0x4a,0x01,0x7b,0x29,0x8b,0x29,0x02,0x69,0x28,0x01,0x58,0x28,0x01, +0x5a,0x16,0x01,0x86,0x11,0x01,0x9a,0x08,0x01,0x0d,0x0f,0x84,0x0a,0x0c,0x0a,0x50,0x51,0x4d,0x1f,0x5a,0x43,0x01,0x43,0x30,0xb8,0xff,0xf0,0x40,0x38,0x0f,0x12,0x48,0x30,0x32,0x83,0x56,0x4d,0x83,0x26,0x00,0x83,0x19,0x0a,0x56,0x26,0x19,0x19,0x26,0x56,0x0a,0x04,0x6b,0x60,0x83,0x3c,0x5b,0x95,0x41,0x41,0x48,0x0d,0x0c,0x65,0x95, +0x37,0x51,0x50,0x20,0x95,0x1e,0x37,0x1e,0x37,0x1e,0x14,0x30,0x2b,0x95,0x43,0x48,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x39,0x10,0xed,0xce,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xfd,0x32,0x2b,0x32, +0x5d,0xce,0x11,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e, +0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x06,0x9c,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c, +0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x2b,0x4a,0x63,0x38,0x2b,0x47,0x3c,0x35,0x1a,0x46,0x43,0x7b,0xad,0x6b,0x6b,0xad,0x7b,0x43,0x43,0x7b,0xad,0x6b,0xb4,0x7a,0x20,0x53,0x5e,0x64,0x30,0x58,0x9d,0x77,0x46,0x98,0x8d,0x49,0x82,0x62,0x39,0xfc,0xa8,0x27,0x4c,0x71,0x4a,0x4a, +0x71,0x4c,0x27,0x27,0x4c,0x71,0x4a,0x4a,0x71,0x4c,0x27,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x36,0x57,0x3c,0x21,0x0a,0x13,0x1c,0x12,0x74,0x9e,0x6a,0xb3,0x83,0x4a,0x49,0x82,0xb3,0x6a,0x69,0xb4,0x83,0x4a, +0x64,0x17,0x25,0x1a,0x0e,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x01,0xef,0x46,0x7f,0x60,0x39,0x39,0x61,0x80,0x46,0x47,0x7f,0x60,0x38,0x39,0x61,0x7f,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x05,0xec,0x00,0x29,0x00,0xad,0x40,0x70,0x76,0x1b,0x01,0x79,0x18,0x01,0x59,0x13,0x69,0x13,0x02,0x75,0x0f,0x01, +0x57,0x0f,0x67,0x0f,0x02,0x09,0x25,0x01,0x95,0x1f,0x01,0x88,0x1b,0x01,0x28,0x29,0x84,0x74,0x26,0x01,0x26,0x00,0x27,0x70,0x27,0x02,0x27,0x24,0x20,0x16,0x01,0x16,0x16,0x08,0x2b,0x1d,0x84,0x1e,0x1e,0x0b,0x0d,0x84,0x0a,0x30,0x08,0x01,0x0f,0x08,0x1f,0x08,0x02,0x08,0x8b,0x25,0x9b,0x25,0x02,0x7f,0x25,0x01,0x49,0x25,0x59,0x25, +0x02,0x27,0x25,0x28,0x8f,0x26,0x9f,0x26,0x02,0x26,0x22,0x0b,0x0a,0x1d,0x0a,0x1d,0x11,0x19,0x95,0x95,0x24,0x01,0x83,0x24,0x01,0x24,0x22,0x22,0x28,0x00,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x5d,0x5d,0xed,0x11,0x39,0x39,0x2f,0x2f,0x33,0x10,0xce,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x01,0x2f,0x5d,0x5d,0x33, +0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xc4,0xcc,0x5d,0x32,0x5d,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x37,0x36,0x33, +0x32,0x17,0x11,0x07,0x27,0x01,0x33,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x57,0x5d,0x88,0x77,0x66,0x43,0x49,0xa6,0x7d,0x73,0xa8,0x97,0x68,0x81,0x6f,0x01,0x10,0x84,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x51,0x8a,0x01,0xfa,0x79,0x83,0x34,0x39, +0x68,0xa8,0x61,0x57,0x3e,0x01,0xd8,0x82,0x70,0x01,0x14,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x05,0xce,0x04,0x18,0x00,0x49,0x00,0xdb,0x40,0x91,0x67,0x3f,0x77,0x3f,0x02,0x49,0x3b,0x59,0x3b,0x02,0x3a,0x3b,0x01,0x6a,0x3a,0x01,0x66,0x31,0x01,0x46,0x30,0x56,0x30,0x66,0x30,0x03,0x35,0x30,0x01,0x69,0x2c,0x79,0x2c,0x02,0x86,0x1e, +0x96,0x1e,0x02,0x79,0x1a,0x01,0x99,0x19,0x01,0x7a,0x19,0x8a,0x19,0x02,0x76,0x15,0x86,0x15,0x96,0x15,0x03,0x75,0x14,0x01,0x89,0x10,0x99,0x10,0x02,0x47,0x42,0x8e,0x08,0x9e,0x08,0x02,0x7b,0x08,0x01,0x59,0x08,0x01,0x3a,0x08,0x4a,0x08,0x02,0x08,0x00,0x06,0x06,0x0d,0x83,0x42,0x36,0x26,0x27,0x27,0x21,0x83,0x29,0x8d,0x01,0x9d, +0x01,0x02,0x01,0x00,0x00,0x29,0x17,0x35,0x84,0x36,0x17,0x35,0x12,0x27,0x26,0x35,0x26,0x35,0x26,0x08,0x3d,0x95,0x12,0x2e,0x95,0x1c,0x1c,0x12,0x10,0x27,0x47,0x01,0x47,0x01,0x08,0x95,0x03,0x06,0xf4,0x05,0x05,0x03,0x00,0x01,0x1c,0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x5d,0x3f,0x33,0x2f,0xed,0x10,0xed,0x11, +0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0xfd,0x39,0xce,0x32,0x2f,0x33,0x5d,0x10,0xed,0x33,0x2f,0x39,0x10,0xde,0xed,0x32,0x2f,0x11,0x39,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x07,0x24,0x21,0x22,0x07,0x35,0x36,0x33,0x2e,0x03, +0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x27,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x16,0x04,0x05,0x42,0x68,0xfe,0x9c,0xfe,0x55,0xd7,0x94,0x9b,0xd4,0x54,0x7e,0x53,0x2a,0x37,0x64,0x8c,0x55, +0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x59,0x2e,0x55,0x8c,0x64,0x37,0x08,0x0f,0x16,0x0e,0x98,0x2b,0x22,0x3a,0x4d,0x2b,0x2c,0x41,0x30,0x20,0x13,0x09,0xa4,0x01,0x08,0x13,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x48,0x88,0xc7,0x7f,0xab,0x01,0x00,0xfe,0x9b,0x7d,0xfc,0x7e,0xa8,0x62,0x2d,0x8c,0xaa,0xbe,0x5f,0x7c,0xbb,0x7d, +0x3e,0x1e,0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x7c,0x28,0x59,0x57,0x4e,0x1e,0x37,0x80,0x8d,0x5a,0x87,0x5a,0x2d,0x33,0x52,0x69,0x6c,0x67,0x27,0x27,0x67,0x6c,0x69,0x52,0x33,0x2d,0x5a,0x88,0x5a,0x89,0xcc,0x9a,0x72,0x2f,0x3f,0x7c,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x3b,0x00,0xcb,0x40,0x77, +0x66,0x32,0x01,0x86,0x31,0x01,0x74,0x31,0x01,0x65,0x31,0x01,0x56,0x31,0x01,0x9a,0x22,0x01,0x98,0x21,0x01,0x55,0x17,0x65,0x17,0x02,0x47,0x16,0x01,0x67,0x11,0x01,0x56,0x11,0x01,0x7a,0x08,0x01,0x79,0x07,0x01,0x3b,0x84,0x1a,0x39,0x39,0x0a,0x3d,0x5c,0x2a,0x6c,0x2a,0x7c,0x2a,0x03,0x3b,0x2a,0x4b,0x2a,0x02,0x2d,0x2a,0x01,0x2a, +0x2f,0x84,0x7c,0x29,0x01,0x6b,0x29,0x01,0x5c,0x29,0x01,0x3d,0x29,0x4d,0x29,0x02,0x2e,0x29,0x01,0x29,0x60,0x24,0x01,0x24,0x24,0x0d,0x0f,0x84,0x0c,0x0a,0x2a,0x29,0x29,0x3a,0x34,0x95,0x6a,0x1a,0x01,0x59,0x1a,0x01,0x3a,0x1a,0x4a,0x1a,0x02,0x2b,0x1a,0x01,0x1a,0x1f,0x0d,0x0c,0x1f,0xb8,0xff,0xc0,0x40,0x0d,0x0b,0x10,0x48,0x1f, +0x0c,0x1f,0x0c,0x3a,0x0f,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x33,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x33,0x2f,0x33,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0xed,0x32,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x37,0x17,0x06,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x03,0xf1,0x4a,0x81, +0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x74,0x55,0x30,0x17,0x3f,0x4b,0x53,0x2a,0x57,0x91,0x68,0x39,0x0f,0x0a,0x0b,0x0f,0x99,0x0b,0x08,0x08,0x0b,0x28,0x42,0x56,0x2f,0x3e,0x65,0x48,0x27,0xa4,0x22,0x69,0xa6,0x74,0x3d,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4d, +0x6d,0x45,0x02,0x41,0x1a,0x2f,0x24,0x15,0x36,0x67,0x96,0x5f,0x33,0x59,0x22,0x28,0x22,0x37,0x1a,0x1e,0x1a,0x43,0x26,0x46,0x66,0x42,0x20,0x3b,0x63,0x80,0x45,0x85,0x00,0x02,0x00,0x32,0xff,0xe8,0x04,0xdb,0x06,0x02,0x00,0x2b,0x00,0x37,0x00,0x9d,0x40,0x65,0x48,0x36,0x58,0x36,0x02,0x39,0x36,0x01,0x37,0x33,0x47,0x33,0x57,0x33, +0x03,0x38,0x2e,0x48,0x2e,0x58,0x2e,0x03,0x88,0x10,0x01,0x69,0x0a,0x01,0x66,0x03,0x01,0x86,0x28,0x96,0x28,0x02,0x86,0x26,0x96,0x26,0x02,0x99,0x10,0x01,0x08,0x83,0x32,0x32,0x16,0x20,0x22,0x84,0x1f,0x1f,0x1d,0x01,0x1d,0x16,0x27,0x16,0x15,0x2c,0x83,0x2b,0x84,0x10,0x0e,0x01,0x0e,0x15,0x84,0x16,0x1a,0x95,0x25,0x25,0x83,0x27, +0x93,0x27,0x02,0x27,0x29,0x1f,0x20,0x20,0x16,0x30,0x95,0x0e,0x0c,0x0c,0x34,0x11,0x95,0x29,0x01,0x34,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x2f,0x33,0x11,0x39,0x5d,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xdc,0x5d,0xfd,0xed,0x11,0x12,0x39,0x10,0xde,0x5d,0x32,0xed,0x32,0x11,0x33,0x2f,0xed,0x31, +0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x35,0x10,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x20,0x11,0x03,0x34,0x27,0x26,0x23,0x20,0x11, +0x10,0x21,0x32,0x37,0x36,0x04,0xdb,0x79,0x80,0xe5,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xac,0x67,0x30,0x24,0xa4,0x24,0x30,0x67,0x47,0x4c,0x1e,0xa6,0x20,0xad,0x8e,0xb9,0x53,0x53,0xbb,0x01,0x54,0xa8,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa3,0x55,0x4a,0x01,0xe0,0xe1,0x88,0x8f,0x96,0x8c,0xe6,0xdf,0x80,0x8d,0x77,0xce,0x01, +0x45,0x64,0x49,0x69,0x69,0x49,0x64,0x65,0x51,0x3a,0x53,0x1d,0x52,0x4e,0x95,0xb5,0xbd,0xbd,0xfe,0x22,0xfd,0xc2,0xa1,0x5e,0x6d,0xfe,0x98,0xfe,0x88,0x73,0x63,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x03,0xf8,0x06,0x02,0x00,0x23,0x00,0x2c,0x00,0x72,0x40,0x44,0x85,0x21,0xa5,0x21,0x02,0x87,0x17,0x01,0x88,0x06,0x98,0x06,0x02,0x7b, +0x08,0x01,0x80,0x04,0x90,0x04,0x02,0x76,0x04,0x01,0x04,0x00,0x05,0x05,0x1e,0x00,0x83,0x07,0x07,0x10,0x2e,0x19,0x84,0x24,0x2b,0x0e,0x1e,0x84,0x10,0x2b,0x95,0x1d,0x1d,0x37,0x1e,0x01,0x26,0x1e,0x01,0x1e,0x0a,0x95,0x20,0x20,0x0f,0x26,0x95,0x15,0x01,0x05,0x04,0x04,0x0f,0x15,0x00,0x3f,0x33,0x2f,0x33,0x3f,0xed,0x11,0x39,0x2f, +0xed,0x33,0x5d,0x5d,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0xc4,0xdc,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x07,0x27,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07, +0x15,0x36,0x33,0x32,0x17,0x16,0x01,0x34,0x23,0x22,0x07,0x06,0x15,0x15,0x36,0x03,0xf8,0x3d,0x3e,0x6b,0x75,0xb7,0x7a,0x74,0x81,0x51,0x4a,0xa4,0x37,0x48,0xb5,0x6b,0x41,0x46,0x7b,0x64,0xa3,0x72,0xe2,0x9c,0x61,0x5d,0xfe,0x32,0x50,0x43,0x28,0x25,0xe0,0x01,0xe3,0x8e,0x89,0x8c,0x58,0x73,0x9f,0xe1,0x88,0x9f,0x70,0x66,0x88,0xfe, +0x5c,0x04,0x83,0xb0,0x59,0x76,0x34,0x38,0x66,0x96,0x69,0x55,0x2b,0xd3,0xae,0x7a,0x77,0x02,0x91,0x4b,0x33,0x2f,0x45,0x8d,0x3c,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x04,0x8b,0x04,0x18,0x00,0x2d,0x00,0xcc,0x40,0x89,0x87,0x2d,0x01,0x65,0x2d,0x01,0x76,0x2c,0x01,0x86,0x29,0x96,0x29,0x02,0x64,0x29,0x74,0x29,0x02,0x46,0x26,0x96, +0x26,0x02,0x96,0x24,0x01,0x9a,0x20,0x01,0x8d,0x1f,0x01,0x39,0x1f,0x01,0x5d,0x17,0x01,0x48,0x16,0x01,0x69,0x13,0x01,0x48,0x13,0x01,0x84,0x10,0x01,0x75,0x0f,0x01,0x07,0x0f,0x17,0x0f,0x67,0x0f,0x03,0x9a,0x06,0x01,0x29,0x06,0x01,0x54,0x02,0x01,0x9a,0x0a,0x01,0x8b,0x0a,0x01,0x7e,0x0a,0x01,0x0a,0x08,0x0b,0x21,0x94,0x22,0x01, +0x22,0x21,0x2a,0x2b,0x19,0x28,0x83,0x1d,0x00,0x83,0x15,0x2f,0x21,0x3f,0x21,0x02,0x21,0x19,0x1d,0x15,0x15,0x1d,0x19,0x21,0x04,0x2f,0x0d,0x83,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2b,0x2a,0x18,0x95,0x1a,0x1a,0x22,0x0b,0x0a,0x0a,0x21,0x22,0x10,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x2f,0x33,0x11,0x39,0x2f,0xed,0x39, +0x39,0x01,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x5d,0x10,0xce,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x13,0x17, +0x02,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x05,0x15,0x16,0x16,0x04,0x8b,0x8e,0x85,0xcf,0xfe,0xdf,0x9b,0x8d,0xb0,0x88,0x8a,0x74,0x6d,0xb1,0x89,0x5a,0x60,0xcb,0xb0,0x1d,0x17,0x01,0x4f,0xa2,0x8b,0x4c,0x77,0x3d,0x79, +0x65,0x45,0x4a,0xfe,0xef,0x92,0xb1,0x22,0xd2,0x7b,0x73,0xcc,0xba,0x01,0x35,0x01,0xa5,0x01,0x9a,0x3a,0xfe,0x88,0xfe,0x71,0xfe,0xf4,0x96,0x8d,0x4c,0x51,0x8a,0x8b,0x98,0x8b,0xd9,0x8b,0x2c,0x26,0x85,0x60,0x6d,0x22,0x1c,0x4e,0x52,0x65,0xf3,0x36,0x04,0x0e,0xba,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x16, +0x00,0x22,0x00,0x68,0x40,0x26,0x59,0x21,0x01,0x56,0x1e,0x01,0x55,0x1c,0x01,0x59,0x19,0x01,0x78,0x0b,0x01,0x69,0x0b,0x01,0x66,0x03,0x01,0x94,0x12,0x01,0x76,0x12,0x86,0x12,0x02,0x12,0x00,0x11,0x0e,0x17,0x83,0x00,0x84,0x0e,0xb8,0xff,0xc0,0x40,0x1a,0x0a,0x0d,0x48,0x0e,0x0e,0x24,0x1d,0x83,0x0f,0x08,0x1f,0x08,0x02,0x08,0x11, +0x12,0x01,0x1b,0x95,0x0e,0x0c,0x0f,0x1f,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x33,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x2b,0xfd,0xed,0x10,0xce,0x11,0x39,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x35,0x10,0x27,0x37,0x16, +0x17,0x16,0x15,0x03,0x34,0x27,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x04,0x28,0x79,0x80,0xe5,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xb8,0x75,0x71,0x3f,0x3b,0xa8,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa3,0x55,0x4a,0x01,0xf4,0xf5,0x88,0x8f,0x96,0x8c,0xfa,0xf3,0x80,0x8d,0x77,0x4c,0x01,0x29,0x8d,0x73,0x58,0xa3,0x97, +0x98,0xfe,0x22,0xb5,0x5e,0x6d,0xfe,0x84,0xfe,0x74,0x73,0x63,0x00,0x02,0x00,0x32,0xfe,0x1e,0x04,0xdb,0x06,0x02,0x00,0x25,0x00,0x28,0x01,0x1e,0x40,0x21,0x98,0x22,0x01,0x96,0x20,0x01,0x86,0x0a,0x01,0x99,0x07,0x01,0x21,0x0d,0x0c,0x19,0x1a,0x18,0x1a,0x06,0x27,0x01,0x27,0x15,0x14,0x28,0x14,0x51,0x18,0x61,0x18,0x02,0x18,0xb8, +0xff,0xc8,0x40,0x90,0x33,0x36,0x48,0x00,0x18,0x10,0x18,0x20,0x18,0x03,0xf1,0x18,0x01,0x58,0x18,0x01,0x29,0x18,0x01,0x18,0x14,0x28,0x14,0x84,0x1a,0x18,0x14,0x1a,0x1a,0x18,0x0c,0x84,0x0d,0x0d,0x26,0x0f,0x1a,0x01,0x1a,0x1a,0x28,0x03,0x05,0x84,0x00,0x31,0x17,0x41,0x17,0x51,0x17,0x71,0x17,0x81,0x17,0x05,0x77,0x17,0x01,0x56, +0x17,0x01,0x47,0x17,0x01,0x25,0x17,0x01,0x16,0x17,0x01,0x3e,0x26,0x4e,0x26,0x02,0x38,0x26,0x01,0x0b,0x26,0x01,0x17,0x26,0x28,0x26,0x84,0x16,0x17,0x14,0x16,0x16,0x17,0x02,0x0e,0x00,0x01,0x00,0x00,0x80,0x16,0x01,0x16,0x16,0x58,0x28,0x01,0x26,0x28,0x01,0x28,0x28,0x1b,0x21,0x0d,0x08,0x95,0x23,0x23,0x1f,0x03,0x02,0x02,0x0d, +0x26,0x27,0x95,0x1a,0x16,0x15,0x14,0x15,0x0d,0x15,0x0d,0x15,0x18,0x11,0x95,0x1f,0x01,0x17,0x18,0x1b,0x00,0x3f,0xc4,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4,0x33,0xfd,0xc4,0x11,0x33,0x2f,0x33,0x11,0x33,0x2f,0xed,0x12,0x39,0x3f,0x01,0x3d,0x2f,0x5d,0x5d,0xc9,0x18,0x2f,0x5d,0x32,0x2f,0x5d,0x33,0x87,0x10,0x2b, +0x87,0x7d,0xc4,0x01,0x5d,0x5d,0x72,0x5d,0x5d,0x5d,0x5d,0x5d,0x72,0x18,0x10,0xed,0x32,0x10,0xc9,0x2f,0x5d,0x12,0x39,0x2f,0xed,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x01,0x5d,0x5d,0x71,0x72,0x2b,0x72,0x10,0x87,0xc4,0xc4,0x01,0x5d,0x10,0x87,0x0e,0xc4,0x11,0x12,0x01,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x27,0x36,0x35, +0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x11,0x14,0x17,0x21,0x01,0x23,0x01,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x01,0x21,0x01,0x04,0xdb,0x20,0xa6,0x1e,0x4c,0x47,0x67,0x30,0x24,0xa4,0x24,0x30,0x67,0xac,0x1c,0x03,0xa7,0xfe,0x25,0xa2,0xfe,0x67,0x55,0x4d,0x57,0xb0,0xbb,0x53, +0x53,0xb9,0x8e,0xad,0xfe,0xf4,0xfd,0x4c,0x01,0x56,0x04,0xb8,0x4e,0x52,0x1d,0x53,0x3a,0x51,0x65,0x64,0x49,0x69,0x69,0x49,0x64,0xfe,0xc5,0x6c,0x5d,0xfa,0xaa,0x04,0x7f,0xef,0xa2,0xd3,0x78,0x89,0xbd,0xbd,0xb5,0xfd,0x9a,0xfb,0xe8,0x00,0x00,0x02,0x00,0x50,0xfe,0x1e,0x04,0x00,0x05,0xec,0x00,0x41,0x00,0x4c,0x00,0xe4,0x40,0x8d, +0x76,0x3f,0x01,0x75,0x3e,0x01,0x86,0x3d,0x01,0x73,0x3d,0x01,0x99,0x18,0x01,0x76,0x13,0x01,0x76,0x0f,0x01,0x67,0x0f,0x01,0x88,0x01,0x01,0x37,0x36,0x39,0x2f,0x36,0x36,0x34,0x31,0x32,0x2f,0x84,0x28,0x1c,0x42,0x00,0x84,0x15,0x42,0x15,0x42,0x15,0x22,0x4e,0x2d,0x84,0x2a,0x2a,0x22,0x0b,0x0d,0x84,0x0a,0x08,0x08,0x48,0x84,0x22, +0x43,0x42,0x45,0x4b,0xb9,0x32,0x01,0xa8,0x32,0x01,0x32,0x31,0x31,0x66,0x2f,0x01,0x37,0x2f,0x47,0x2f,0x57,0x2f,0x03,0x26,0x2f,0x01,0x69,0x39,0x01,0x38,0x39,0x48,0x39,0x58,0x39,0x03,0x29,0x39,0x01,0x1c,0x39,0x34,0x2f,0x28,0x05,0x1e,0x26,0x95,0x45,0x4b,0xb6,0x36,0x01,0xa7,0x36,0x01,0x36,0x37,0x37,0x0b,0x0a,0x0a,0x11,0x1e, +0x95,0x4b,0x4b,0x11,0x29,0x95,0x2e,0x2c,0x00,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xde,0xed,0x11,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0x32,0x2f,0x33,0x5d,0x5d,0x10,0xde,0xed,0x11,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x5d,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x2f, +0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xc4,0xfd,0xcd,0x39,0x39,0x32,0x2f,0x10,0xc4,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x26,0x27,0x26,0x35,0x06, +0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x36,0x37,0x17,0x06,0x07,0x16,0x17,0x07,0x26,0x27,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x01,0x35,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x04,0x00,0x9d,0x86,0xb6,0xb3,0x88,0x9c,0x28,0x9c,0x1e,0x68,0x58,0x71,0x74,0x56,0x69, +0x25,0x06,0xb5,0x19,0x28,0x5d,0x5d,0x71,0x43,0x3f,0x3f,0x44,0x70,0x5b,0x5f,0xfe,0x7c,0xa4,0x01,0x84,0x55,0x40,0x81,0x4b,0x56,0x56,0x4b,0x81,0x40,0x55,0x23,0x13,0x42,0x67,0x19,0x2b,0xfe,0x39,0x64,0x56,0x25,0x3d,0x3d,0x25,0x56,0x8c,0xa5,0x5f,0x52,0x57,0x64,0xa5,0x5e,0x51,0x37,0x37,0x45,0x65,0x3b,0x32,0x2d,0x36,0x65,0x51, +0x34,0x09,0xbb,0x2c,0x45,0x66,0x29,0x4b,0x46,0x6d,0x6d,0x47,0x4b,0x2a,0x01,0xa1,0x01,0x11,0x79,0xfd,0x61,0x59,0x69,0x60,0x74,0x5d,0x5d,0x74,0x5f,0x69,0x59,0x6d,0x41,0x34,0x1c,0x41,0x66,0x27,0x46,0x02,0x5f,0x43,0x40,0x3f,0x22,0x22,0x40,0x00,0x00,0x02,0x00,0xae,0xff,0xe8,0x04,0x76,0x05,0xec,0x00,0x11,0x00,0x1d,0x00,0x92, +0x40,0x62,0x5a,0x1d,0x01,0x49,0x1d,0x01,0x45,0x1b,0x55,0x1b,0x02,0x46,0x1a,0x56,0x1a,0x02,0x46,0x16,0x56,0x16,0x02,0x49,0x13,0x59,0x13,0x02,0x69,0x05,0x01,0x37,0x1d,0x01,0x37,0x1a,0x01,0x38,0x16,0x01,0x85,0x0e,0x01,0x74,0x0e,0x01,0x07,0x0e,0x17,0x0e,0x02,0x0e,0x0c,0x0b,0x2e,0x0d,0x01,0x1f,0x0d,0x01,0x0d,0x0d,0x00,0x83, +0x10,0x12,0x20,0x12,0x30,0x12,0x03,0x12,0x12,0x1f,0x0b,0x84,0x18,0x83,0x08,0x0c,0x2e,0x0d,0x01,0x0d,0x0d,0x0a,0x14,0x95,0x66,0x0b,0x01,0x0b,0x0e,0x0f,0x0a,0x00,0x1c,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0x01,0x2f,0xed,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x5d,0x5d,0x12,0x39, +0x39,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x01,0x33,0x01,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x04,0x76,0x7b,0x84,0xeb,0xe5,0x80,0x79,0xa8,0x01,0xd8,0xd7,0xfe,0xa0,0xea,0x79, +0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xe6,0x8c,0x96,0x8f,0x88,0xe1,0x04,0x0c,0xfd,0x7a,0x01,0x9e,0xfe,0xd8,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x00,0x01,0x00,0x21,0xfe,0x1e,0x05,0xf5,0x04,0x18,0x00,0x43,0x01,0x30,0x40,0xb7,0x75,0x3a,0x01,0x67,0x29,0x01,0x56,0x29, +0x01,0x45,0x29,0x01,0x26,0x29,0x01,0x36,0x17,0x01,0x6a,0x0e,0x01,0x42,0x41,0x41,0x00,0x84,0x3f,0x3b,0x30,0x31,0x31,0x2c,0x3a,0x3b,0x28,0x38,0x08,0x39,0x38,0x08,0x38,0x2a,0x2b,0x17,0x29,0x3b,0x28,0x2b,0x17,0x18,0x06,0x19,0x2b,0x17,0x07,0x06,0x19,0x38,0x08,0xa5,0x2b,0x01,0x2b,0x08,0x38,0x08,0x84,0x17,0x2b,0x14,0x17,0x17, +0x2b,0x2b,0x2c,0x84,0x38,0x37,0x37,0x28,0x06,0x19,0x06,0x84,0x3b,0x28,0x14,0x3b,0x28,0x3b,0x3b,0x17,0x45,0x20,0x1f,0x22,0x84,0x1d,0x1f,0x1f,0x1d,0x19,0x19,0x17,0x10,0x0f,0x08,0x17,0x0a,0x84,0x00,0x15,0x01,0x15,0x15,0x17,0x38,0x2e,0x31,0x33,0x30,0x30,0x2e,0x95,0x33,0x33,0x26,0xc5,0x1f,0x01,0x1f,0x20,0x20,0x19,0x1b,0x95, +0x28,0x26,0x10,0xba,0x41,0x01,0xa9,0x41,0x01,0x41,0x42,0x42,0x3b,0x3d,0x95,0x04,0xd2,0x17,0x01,0x24,0x17,0x44,0x17,0x54,0x17,0x03,0x09,0x17,0x01,0x17,0x76,0x10,0x86,0x10,0x02,0x10,0x12,0x95,0x6c,0x0f,0x01,0x0f,0x0d,0x0d,0x06,0x04,0x1c,0x00,0x3f,0x33,0x33,0x2f,0x33,0x5d,0xed,0x32,0x5d,0x32,0x5d,0x5d,0x5d,0x10,0xed,0x32, +0x32,0x2f,0x33,0x5d,0x5d,0x3f,0x33,0xed,0x32,0x32,0x2f,0x33,0x5d,0x11,0x33,0x2f,0xed,0x32,0x2f,0x12,0x39,0x11,0x33,0x01,0x2f,0x33,0x2f,0x5d,0xed,0x11,0x39,0xcc,0x32,0x11,0x33,0x2f,0xce,0x32,0x2f,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x87,0x2b,0x87,0x7d,0xc4,0x01,0x33,0x18,0x2f,0x33,0xed,0x32,0x87,0x04,0x10,0x2b,0x87, +0x7d,0xc4,0x00,0x5d,0x0f,0x0f,0x0f,0x87,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x0f,0x11,0x01,0x33,0x18,0x2f,0x33,0x10,0xde,0xed,0x33,0x2f,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x01,0x01, +0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x01,0x01,0x36,0x35,0x34,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x01,0x01,0x16,0x33,0x32,0x35,0x34,0x27,0x37,0x16,0x05,0xf5,0x40,0x3c,0x5b,0x90,0x52,0xfe,0xcf,0xfe,0xa4,0x33,0x8e,0x69,0x77,0x53,0x43,0x3c,0x4b,0x24,0x36,0x83, +0x01,0xef,0xfe,0xc3,0x36,0x2f,0x2b,0x5a,0x7f,0x74,0x40,0x3c,0x5b,0x8b,0x52,0x01,0x3b,0x01,0xd3,0x59,0x38,0x3d,0x87,0x58,0xac,0x64,0x62,0x3a,0x37,0x86,0xfe,0x26,0x01,0x35,0x37,0x30,0x2b,0x5a,0x7f,0x74,0xfe,0xf1,0x62,0x3a,0x37,0x86,0x01,0xf3,0xfe,0xfd,0x38,0x6c,0x5d,0x75,0x47,0x8a,0x47,0x34,0x24,0x6b,0x50,0x01,0x70,0x02, +0x06,0x58,0x38,0x3d,0x87,0x58,0xac,0x64,0x62,0x3a,0x37,0x86,0xfd,0xff,0x01,0x5c,0x42,0x25,0x2b,0x5a,0x7f,0x74,0x40,0x3c,0x5b,0x7e,0x64,0xfe,0x9f,0xfe,0x08,0x59,0x38,0x3d,0x87,0x58,0xac,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xf3,0x06,0x02,0x00,0x3d,0x00,0xa2,0x40,0x5f,0x94,0x32,0x01,0x87,0x2e,0x01,0x98,0x15,0x01,0x86, +0x12,0x01,0x77,0x12,0x01,0x77,0x0f,0x87,0x0f,0x02,0x99,0x01,0x01,0x36,0x20,0x33,0x84,0x24,0x24,0x13,0x3a,0x19,0x38,0x84,0x1d,0x1d,0x13,0x20,0x20,0x19,0x19,0x0d,0x00,0x84,0x13,0x13,0x08,0x3f,0x2d,0x2c,0x2c,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x01,0x08,0x36,0x20,0x95,0x22,0x3a,0x19,0x0b,0x0a,0x0a,0x17,0x95,0x19,0x8b,0x2c,0x01, +0x18,0x31,0x01,0x9a,0x28,0x01,0x28,0x31,0x2c,0x03,0x2d,0x22,0x19,0x22,0x19,0x2d,0x01,0x11,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x33,0x11,0x39,0x10,0xed,0x39,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f, +0x11,0x33,0x2f,0xed,0x11,0x39,0x11,0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x35,0x34,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x26, +0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17,0x04,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x03,0xf3,0x8f,0x80,0xd5,0xae,0x79,0x88,0x29,0x99,0x1c,0x55,0x4a,0x6c,0x01,0x3f,0x3d,0x40,0x60,0x60,0x60,0x64,0x79,0xdd,0x60,0x60,0xdd,0x55,0x17,0x79,0xa1,0x2f,0x6a,0x3d,0x6d,0x41,0x5f,0x23,0x9d,0x01,0x32,0x6d,0x5c,0xc9, +0xc9,0x58,0x3a,0x37,0x01,0x2b,0xa2,0x55,0x4c,0x57,0x62,0xa7,0x5c,0x53,0x37,0x33,0x49,0x66,0x3a,0x32,0xc9,0x43,0x2f,0x30,0x8b,0x48,0x40,0x82,0x8b,0x84,0x44,0x1e,0x08,0x14,0x1b,0x10,0x24,0x54,0x60,0x48,0x1c,0x0b,0x18,0x2f,0xc9,0x4a,0x6e,0x13,0x2a,0xa1,0xa0,0x2a,0x13,0x4b,0x47,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x95, +0x06,0x02,0x00,0x3d,0x00,0x45,0x00,0xc6,0x40,0x7a,0x76,0x41,0x01,0x57,0x41,0x67,0x41,0x02,0x65,0x30,0x01,0x99,0x2b,0x01,0x98,0x2a,0x01,0x99,0x29,0x01,0x99,0x28,0x01,0x99,0x17,0x01,0x9b,0x14,0x01,0x89,0x14,0x01,0x94,0x12,0x01,0x55,0x12,0x85,0x12,0x02,0x37,0x11,0x01,0x86,0x0d,0x01,0x89,0x07,0x01,0x6b,0x03,0x01,0x36,0x22, +0x33,0x84,0x26,0x26,0x15,0x3a,0x1b,0x00,0x22,0x22,0x2f,0x1b,0x01,0x1b,0x1b,0x42,0x38,0x84,0x1f,0x1f,0x15,0x2d,0x2c,0x3e,0x84,0x0b,0x0b,0x42,0x00,0x84,0x15,0x15,0x47,0x0f,0x42,0x83,0x06,0x3a,0x19,0x95,0x1b,0x42,0x95,0x0f,0x36,0x23,0x95,0x21,0x1b,0x0f,0x21,0x21,0x0f,0x1b,0x03,0x13,0x40,0x95,0x08,0x2c,0x2d,0x2d,0x08,0x01, +0x13,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x33,0x10,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x10,0xed,0x39,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0xce,0x32,0x11,0x33,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0x2f,0x11,0x12,0x39,0x11,0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x03,0x26,0x11,0x10,0x21,0x32,0x16,0x15,0x14,0x07,0x06,0x07,0x14,0x17,0x12,0x33,0x20,0x35,0x34,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17, +0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x23,0x22,0x11,0x36,0x37,0x36,0x04,0x95,0xfe,0x5f,0xfe,0xb4,0xb4,0x94,0x01,0x4e,0x67,0x7c,0x7d,0x7a,0x8f,0x67,0x87,0xf0,0x01,0x09,0x3d,0x40,0x60,0x60,0x60,0x64,0x79,0xdd,0x60,0x60,0xdd,0x3d,0x40,0x41,0x51,0x21,0x81,0x1a,0x5b,0x88,0x0c,0x49,0x6d,0x5c, +0xc9,0xc9,0x58,0x3a,0x37,0xfd,0x5a,0x41,0xa3,0x65,0x45,0x3a,0x01,0x2b,0xfe,0xbd,0x01,0x30,0xfa,0x01,0x59,0x02,0x97,0x74,0x68,0xa0,0xa0,0x9b,0x26,0xd8,0xcc,0xfe,0xf1,0xc9,0x43,0x2f,0x30,0x8b,0x48,0x40,0x82,0x8b,0x84,0x36,0x29,0x27,0x28,0x39,0x50,0x4a,0x41,0x3c,0x59,0x0b,0x42,0x5c,0x4a,0x6e,0x13,0x2a,0xa1,0xa0,0x2a,0x13, +0x4b,0x47,0x03,0xa4,0x55,0xfe,0x40,0x1b,0x83,0x6f,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x1d,0x04,0x18,0x00,0x19,0x00,0x27,0x01,0x04,0x40,0xb7,0x48,0x20,0x58,0x20,0x02,0x48,0x1c,0x58,0x1c,0x02,0x08,0x17,0x01,0x77,0x13,0x01,0x65,0x13,0x01,0x77,0x0f,0x01,0x65,0x0f,0x01,0x08,0x0b,0x01,0x25,0x1a,0x22,0x17,0x04,0x0b,0x03,0x0d, +0x19,0x19,0x15,0x83,0x1a,0x1a,0x29,0x22,0x83,0x0d,0x09,0x09,0x0d,0x1e,0x95,0x11,0x10,0x16,0x25,0x01,0x07,0x25,0x01,0xe7,0x25,0xf7,0x25,0x02,0xc5,0x25,0x01,0x97,0x25,0x01,0x73,0x25,0x83,0x25,0x02,0x64,0x25,0x01,0x47,0x25,0x57,0x25,0x02,0x25,0x09,0xda,0x0b,0x01,0x99,0x0b,0x01,0x0b,0x95,0x06,0x19,0xda,0x17,0x01,0x99,0x17, +0x01,0x17,0x95,0x19,0x00,0x01,0x08,0x00,0x01,0xe9,0x00,0xf9,0x00,0x02,0x9b,0x00,0x01,0x00,0x02,0x02,0x19,0x08,0x01,0x08,0x08,0x01,0xe9,0x08,0xf9,0x08,0x02,0x9b,0x08,0x01,0x08,0x0b,0x04,0x01,0xeb,0x04,0xfb,0x04,0x02,0x04,0x20,0x21,0x24,0x48,0x7c,0x04,0x01,0x5d,0x04,0x6d,0x04,0x02,0x4b,0x04,0x01,0x1a,0x04,0x2a,0x04,0x3a, +0x04,0x03,0x09,0x04,0x01,0xfa,0x04,0x01,0xdb,0x04,0xeb,0x04,0x02,0x9d,0x04,0x01,0x04,0x06,0x16,0x00,0x3f,0x33,0x5d,0x5d,0x5d,0x71,0x71,0x71,0x71,0x71,0x2b,0x71,0x72,0x33,0x5d,0x5d,0x71,0x71,0x33,0x2f,0x33,0x5d,0x5d,0x71,0x71,0xed,0x5d,0x5d,0x32,0x10,0xed,0x5d,0x5d,0x32,0x32,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x71,0x3f, +0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x11,0x17,0x39,0x11,0x12,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x37,0x26,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x10,0x07,0x16,0x37,0x01,0x34,0x27,0x26,0x23,0x22,0x07,0x06, +0x15,0x14,0x16,0x17,0x36,0x36,0x05,0x1d,0x92,0xec,0x84,0x73,0x73,0x85,0xec,0x92,0x8e,0xfb,0xe8,0x8a,0x7d,0xcc,0xcc,0x7e,0x8c,0xe8,0xfb,0x8e,0xfe,0xb7,0x59,0x4e,0x87,0x86,0x4e,0x57,0xa3,0x8a,0x8a,0xa2,0x1b,0x33,0x1e,0x1e,0x33,0x9c,0x47,0x02,0xa6,0x01,0x2a,0xe8,0x7d,0x71,0x71,0x7d,0xe8,0xfe,0xd6,0xa6,0x02,0x47,0x01,0x8b, +0xaa,0x56,0x4c,0x4c,0x56,0xaa,0x88,0xe0,0x39,0x39,0xe0,0x00,0x00,0x01,0x00,0x5e,0xfe,0x1e,0x03,0xf1,0x04,0x00,0x00,0x28,0x00,0x9a,0x40,0x5d,0x55,0x27,0x01,0x99,0x16,0x01,0x3a,0x16,0x4a,0x16,0x02,0x76,0x0f,0x01,0x57,0x0f,0x67,0x0f,0x02,0x66,0x02,0x01,0x54,0x02,0x01,0x77,0x25,0x01,0x99,0x1a,0x01,0x8a,0x1a,0x01,0x59,0x1a, +0x69,0x1a,0x02,0x25,0x1a,0x24,0x19,0x19,0x0d,0x15,0x24,0x24,0x00,0x83,0x15,0x15,0x08,0x2a,0x1f,0x1e,0x1e,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x01,0x08,0x1a,0x1c,0x24,0x23,0x23,0x1f,0x19,0x25,0x95,0x0b,0x0a,0x18,0x0a,0x18,0x0a,0x11,0x1c,0x95,0x21,0x21,0x1e,0x95,0x1f,0x0f,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x33,0x2f, +0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x39,0x11,0x33,0x2f,0x33,0x12,0x39,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17, +0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x10,0x21,0x23,0x35,0x01,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x25,0x15,0x01,0x16,0x17,0x16,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x86,0x57,0x5b,0xfe,0x54,0x52,0x01,0x65,0x77,0x77,0xab,0xb9,0x2b,0x93,0xcb,0xcc,0x01,0x03,0xfe,0x77,0xd2, +0x74,0x7e,0x1d,0xd2,0x7d,0x76,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x54,0x57,0x8c,0x01,0x4e,0x33,0x01,0xea,0x18,0x42,0x8c,0x42,0x42,0x33,0xfd,0xe1,0x19,0x6e,0x77,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x06,0x02,0x00,0x43,0x00,0xe0,0x40,0x8f,0x56,0x43,0x66,0x43,0x02,0x85,0x3d,0x01,0x57,0x3d,0x67,0x3d, +0x02,0x76,0x36,0x86,0x36,0x02,0x79,0x32,0x89,0x32,0x02,0x89,0x22,0x01,0x48,0x17,0x01,0x59,0x13,0x69,0x13,0x02,0x76,0x0f,0x86,0x0f,0x02,0x67,0x0f,0x01,0x56,0x0f,0x01,0x2d,0x2b,0x84,0x2e,0x30,0x30,0x15,0x85,0x3a,0x95,0x3a,0x02,0x3a,0x38,0x3e,0x83,0x9b,0x1f,0x01,0x79,0x1f,0x01,0x08,0x1f,0x01,0x1f,0x23,0x1d,0x1d,0x15,0x54, +0x40,0x01,0x41,0x40,0x00,0x19,0x19,0x0d,0x00,0x83,0x20,0x15,0x01,0x15,0x15,0x08,0x45,0x38,0x83,0x23,0x23,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2e,0x2d,0x40,0x41,0x1a,0x0b,0x0a,0x0a,0x11,0x18,0x95,0x1a,0x18,0x1f,0x01,0x3a,0x1f,0x1a,0x0f,0x2d,0x1f,0x2d,0x02,0x2d,0x1a,0x2d,0x1a,0x11,0x34,0x95,0x27,0x01,0x11, +0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x11,0x39,0x39,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x5d,0x11,0x33,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11, +0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x27,0x24,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07, +0x27,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x14,0x05,0x15,0x16,0x16,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x55,0x5b,0xcb,0xb0,0x1d,0x17,0x01,0x4f,0xa7,0xfe,0xf2,0x2a,0xa7,0x89,0x79,0xaf,0xae,0x79,0x88,0x27,0x9d,0x1e,0x54,0x4a,0x6b,0x6c,0x4a, +0x55,0xa8,0x9c,0x9c,0xa8,0xfe,0xef,0x92,0xb1,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x50,0x8b,0x8b,0x98,0x8b,0xd9,0x5d,0x3f,0x66,0x1a,0x6a,0xc6,0xa8,0x61,0x57,0x57,0x62,0xa7,0x60,0x4f,0x37,0x37,0x45,0x67,0x39,0x32,0x32,0x39,0x67,0x98,0x4b,0x38,0x38,0x4d,0x9e,0xf3,0x36,0x04,0x0e, +0xba,0x00,0x00,0x03,0x00,0x52,0xff,0xe8,0x04,0x92,0x06,0x02,0x00,0x21,0x00,0x2c,0x00,0x38,0x00,0x81,0x40,0x50,0x99,0x37,0x01,0x8a,0x37,0x01,0x85,0x31,0x01,0x8a,0x25,0x01,0x79,0x25,0x01,0x96,0x19,0x01,0x9a,0x16,0x01,0x7a,0x12,0x8a,0x12,0x02,0x9a,0x0b,0x01,0x7b,0x0b,0x01,0x7b,0x0a,0x01,0x1e,0x21,0x1c,0x01,0x1f,0x84,0x2e, +0x22,0x0e,0x0e,0x09,0x3a,0x28,0x83,0x14,0x14,0x33,0x83,0x09,0x40,0x09,0x0c,0x48,0x09,0x1c,0x22,0x95,0x0f,0x1f,0x0e,0x2e,0x01,0x95,0x20,0x0e,0x0e,0x35,0x26,0x95,0x18,0x01,0x35,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x10,0xdd,0xc4,0xfd,0xc4,0x01,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x11,0x12,0x39, +0x2f,0xc4,0xc4,0xfd,0xc4,0xc4,0xde,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x33,0x35,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x21,0x15,0x21,0x01,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17, +0x16,0x33,0x13,0x35,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x04,0x92,0xfe,0xd4,0xcd,0xb6,0xb5,0x6b,0x71,0x81,0x74,0xb1,0xc6,0xc6,0xb1,0x74,0x81,0x71,0x6b,0xb5,0xb6,0xcd,0x01,0x2c,0xfe,0xd4,0x01,0x2c,0xfe,0x2c,0x72,0x69,0xe1,0x4c,0x45,0x65,0xc6,0xc6,0x65,0x45,0x4c,0xe1,0x69,0x3a,0x38,0x02,0x0e,0xa8,0xb5,0xc9, +0x57,0x5c,0xa8,0xab,0x60,0x58,0x9e,0x58,0x60,0xab,0xa8,0x5c,0x57,0xc9,0xb5,0xa8,0x98,0x9e,0x01,0x36,0xa8,0x68,0x7f,0xc4,0x60,0x39,0x32,0xfd,0x8a,0xa8,0x32,0x39,0x60,0xc4,0x41,0x3e,0x00,0x03,0x00,0x60,0xfe,0x1e,0x07,0x48,0x06,0x02,0x00,0x31,0x00,0x3d,0x00,0x49,0x00,0xb9,0x40,0x79,0x46,0x45,0x01,0x46,0x43,0x01,0x49,0x3d, +0x01,0x49,0x33,0x01,0x55,0x45,0x01,0x59,0x43,0x01,0x55,0x3d,0x01,0x5a,0x33,0x01,0x44,0x83,0x0f,0x19,0x1f,0x19,0x3f,0x19,0x03,0x19,0x12,0x32,0x83,0x00,0x00,0x10,0x00,0x30,0x00,0x03,0x00,0x06,0x38,0x38,0x2c,0x0b,0x06,0x84,0x12,0x3e,0x3e,0x24,0x1f,0x12,0x24,0x22,0x95,0x25,0x27,0x01,0x34,0x95,0x44,0x2c,0x54,0x2c,0x02,0x2c, +0x2e,0x2e,0x42,0x95,0x44,0x1f,0x54,0x1f,0x02,0x1f,0x1d,0x0f,0x3c,0x95,0x79,0x06,0x01,0x6a,0x06,0x01,0x4b,0x06,0x5b,0x06,0x02,0x06,0x04,0x04,0x46,0x95,0x69,0x13,0x79,0x13,0x02,0x4b,0x13,0x5b,0x13,0x02,0x13,0x15,0x16,0x0b,0x09,0x95,0x0c,0x0e,0x1c,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x5d,0x5d,0xed,0x33,0x2f,0x33,0x5d,0x5d, +0x5d,0xed,0x3f,0x33,0x5d,0xed,0x33,0x2f,0x33,0x5d,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xcc,0x33,0x2f,0x10,0xfd,0xce,0xc4,0x33,0x2f,0x10,0xdc,0x5d,0xed,0x10,0xdc,0x5d,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27, +0x26,0x35,0x35,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x01,0x34,0x27,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x07,0x48,0x7b,0x84,0xeb,0xbc,0x7a, +0xac,0x3d,0x30,0x2c,0x4b,0x93,0x5d,0x5a,0x7a,0xbc,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xac,0x3d,0x30,0x2c,0x4b,0x93,0x5d,0x5a,0x88,0xc6,0xea,0x7a,0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0xfc,0xe0,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa1,0x56,0x4b,0x01,0xf0,0xe6,0x8c,0x96,0x63,0xc9,0xd9,0x1b,0x94, +0x12,0x65,0x62,0x95,0xd1,0x63,0x96,0x8c,0xe6,0xdf,0x80,0x8d,0x77,0x01,0x39,0xd9,0x1b,0x94,0x12,0x65,0x62,0x95,0xfe,0xbf,0x77,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x01,0x74,0xa1,0x5e,0x6d,0xfe,0x98,0xfe,0x88,0x71,0x62,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x2f,0x00,0xc2,0x40,0x83, +0x79,0x29,0x01,0x68,0x29,0x01,0x59,0x29,0x01,0x56,0x25,0x66,0x25,0x02,0x25,0x1f,0x01,0x77,0x1e,0x01,0x35,0x1e,0x01,0x85,0x1b,0x95,0x1b,0x02,0x8a,0x17,0x9a,0x17,0x02,0x75,0x12,0x01,0x67,0x12,0x01,0x7a,0x0f,0x01,0x2a,0x0a,0x01,0x69,0x09,0x01,0x06,0x02,0x16,0x02,0x02,0x2e,0x00,0x84,0x2d,0x2b,0x2b,0x0e,0x34,0x20,0x54,0x20, +0x64,0x20,0x84,0x20,0x04,0x20,0x23,0x1d,0x83,0x8b,0x0b,0x9b,0x0b,0x02,0x6d,0x0b,0x01,0x4a,0x0b,0x5a,0x0b,0x02,0x2f,0x0b,0x01,0x0b,0x08,0x20,0x0e,0x30,0x0e,0x02,0x0e,0x0e,0x31,0x23,0x83,0x08,0x14,0x84,0x15,0x15,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2d,0x2e,0x2e,0x27,0x20,0x20,0x04,0x15,0x15,0x0b,0x10,0x95,0x0b,0x19,0x10,0x27, +0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x39,0xed,0x11,0x39,0x2f,0x11,0x39,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x21,0x22,0x07,0x06,0x15,0x23,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x37,0x16,0x03,0xf1,0x88,0x7d,0xaa,0xcf,0x85,0x8e,0xbc,0xae,0xae,0xbc,0xfe,0xfb,0x68,0x44, +0x4b,0xa6,0x7f,0x73,0xab,0xba,0x77,0x7c,0xbc,0xae,0xae,0xbc,0x5b,0x55,0x88,0x68,0x4e,0x55,0x1c,0x9a,0x28,0x6e,0xa9,0x6a,0x61,0x73,0x7b,0xd2,0xcd,0x76,0x4d,0x4e,0x58,0x85,0xf4,0x34,0x39,0x68,0xa8,0x61,0x57,0x60,0x63,0xa7,0xe0,0x72,0x4b,0x4b,0x57,0xa0,0x8b,0x50,0x4c,0x3c,0x42,0x68,0x49,0x33,0x37,0x51,0x00,0x01,0x00,0x5f, +0xfe,0x1e,0x03,0xf0,0x04,0x18,0x00,0x3b,0x00,0x76,0x40,0x49,0x56,0x2a,0x66,0x2a,0x76,0x2a,0x03,0x55,0x24,0x65,0x24,0x02,0x47,0x24,0x01,0x99,0x1a,0x01,0x9a,0x19,0x01,0x76,0x0a,0x86,0x0a,0x02,0x2f,0x31,0x84,0x2c,0x12,0x17,0x84,0x11,0x0c,0x0c,0x2e,0x2c,0x2c,0x3d,0x02,0x21,0x84,0x3b,0x6b,0x21,0x01,0x3a,0x21,0x4a,0x21,0x5a, +0x21,0x03,0x21,0x07,0x95,0x2e,0x2f,0x1c,0x2f,0x1c,0x2f,0x01,0x27,0x95,0x36,0x1c,0x11,0x12,0x12,0x01,0x0f,0x00,0x3f,0x33,0x2f,0x33,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x33,0x5d,0x5d,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x13,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x5f,0xa4,0x27,0x48,0x65,0x3e,0x2e,0x57,0x42,0x28,0x0c,0x07, +0x09,0x0a,0x99,0x0e,0x0b,0x0a,0x10,0x39,0x68,0x91,0x57,0x2a,0x53,0x4b,0x40,0x16,0x30,0x55,0x73,0x44,0x32,0x60,0x4b,0x2e,0x1c,0x99,0x29,0x49,0x79,0x9b,0x52,0x66,0xb1,0x81,0x4a,0x04,0x00,0x85,0x45,0x80,0x63,0x3b,0x20,0x42,0x66,0x46,0x26,0x43,0x1a,0x1e,0x1a,0x37,0x22,0x28,0x22,0x59,0x33,0x5f,0x96,0x67,0x36,0x15,0x24,0x2f, +0x1a,0xfd,0xbf,0x45,0x6d,0x4d,0x28,0x20,0x3c,0x55,0x35,0x4a,0x32,0x37,0x54,0x5b,0x56,0x8a,0x60,0x34,0x3d,0x74,0xa6,0x69,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x50,0x04,0x18,0x00,0x36,0x00,0x46,0x00,0x93,0x40,0x60,0x45,0x46,0x55,0x46,0x02,0x55,0x42,0x01,0x46,0x42,0x01,0x5a,0x3f,0x01,0x49,0x3f,0x01,0x59,0x39,0x01,0x4a,0x39, +0x01,0x64,0x27,0x01,0x69,0x23,0x01,0x79,0x1e,0x01,0x6a,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x02,0x16,0x12,0x26,0x12,0x46,0x12,0x56,0x12,0x04,0x2f,0x32,0x84,0x1a,0x1d,0x1a,0x0b,0x10,0x83,0x0a,0x05,0x05,0x2a,0x83,0x3c,0x30,0x3c,0x01,0x1a,0x3c,0x1a,0x3c,0x48,0x44,0x83,0x0f,0x20,0x1f,0x20,0x02,0x20,0x0a,0x0b,0x37,0x95,0x1d,0x2f, +0x2f,0x00,0x41,0x95,0x25,0x10,0x00,0x95,0x15,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x32,0x3e,0x02,0x35, +0x34,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x06,0x06,0x15,0x14,0x1e,0x02,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xea,0x2a,0x46,0x32,0x1c,0x06, +0x04,0x04,0x06,0xa6,0x06,0x05,0x04,0x07,0x35,0x5f,0x83,0x4f,0x4f,0x82,0x5e,0x34,0x17,0x0e,0xa5,0xa7,0x46,0x83,0xbd,0x78,0x74,0xb9,0x81,0x44,0x46,0x86,0xc1,0x7c,0x0e,0x10,0x1d,0x33,0x47,0x6e,0x57,0x81,0x54,0x2a,0x2b,0x56,0x80,0x55,0x9f,0xab,0xab,0xfe,0xa8,0x1f,0x35,0x45,0x27,0x1a,0x30,0x12,0x15,0x12,0x1d,0x16,0x1a,0x16, +0x3a,0x20,0x4a,0x7a,0x57,0x2f,0x2f,0x58,0x7d,0x4e,0x43,0x60,0x22,0x28,0xfa,0xc3,0x76,0xbd,0x84,0x47,0x44,0x80,0xb7,0x73,0x7c,0xc1,0x84,0x45,0x27,0x4e,0x35,0x33,0x4f,0x35,0x1b,0x02,0x06,0x35,0x62,0x8a,0x55,0x53,0x86,0x5e,0x33,0xb0,0xbe,0xc0,0xb2,0x00,0x00,0x01,0x00,0x40,0xfe,0x1e,0x04,0x96,0x04,0x18,0x00,0x33,0x00,0x93, +0x40,0x60,0x35,0x27,0x45,0x27,0x55,0x27,0x95,0x27,0x04,0x3a,0x23,0x4a,0x23,0x5a,0x23,0x03,0x65,0x16,0x01,0x94,0x2f,0x01,0x86,0x2f,0x01,0x64,0x2f,0x74,0x2f,0x02,0x2f,0x2a,0x8f,0x0c,0x9f,0x0c,0x02,0x3b,0x0c,0x4b,0x0c,0x5b,0x0c,0x03,0x18,0x0c,0x01,0x0c,0x0f,0x8b,0x01,0x9b,0x01,0x02,0x19,0x01,0x39,0x01,0x02,0x01,0x00,0x00, +0x1c,0x19,0x83,0x1d,0x20,0x20,0x35,0x2a,0x83,0x0f,0x09,0x09,0x0f,0x1d,0x1c,0x1c,0x0c,0x25,0x95,0x14,0x10,0x2f,0x01,0x0c,0x95,0x06,0x09,0x95,0x08,0x08,0x06,0x00,0x01,0x1c,0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x3f,0xed,0x11,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x32, +0x2f,0x33,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x07,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x26,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0x96, +0x68,0x4f,0x98,0x9c,0xa4,0x5c,0xd7,0x94,0x4e,0xc0,0x6b,0xa8,0xb1,0x49,0x89,0xc5,0x7d,0x6f,0xb1,0x7b,0x42,0x0a,0x13,0x9d,0x0c,0x06,0x2b,0x52,0x77,0x4d,0x57,0x84,0x58,0x2d,0x43,0x84,0xc4,0x81,0x3a,0x65,0x5c,0x59,0xfe,0x9b,0x7d,0x3f,0x5e,0x3f,0x20,0x7e,0xa8,0x31,0x31,0x5e,0x01,0x30,0xca,0x7c,0xc7,0x8c,0x4b,0x4a,0x8a,0xc2, +0x78,0x28,0x4c,0x61,0x37,0x42,0x3a,0x23,0x56,0x8f,0x66,0x38,0x3b,0x68,0x90,0x54,0x81,0xb9,0x8e,0x71,0x39,0x1a,0x39,0x3e,0x44,0x00,0x00,0x03,0x00,0x70,0xff,0xea,0x02,0xf4,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x32,0x40,0x1a,0x0c,0xaf,0x12,0x12,0x1e,0x25,0x00,0xaf,0x06,0x06,0x18,0xaf,0x1e,0x15,0xb0,0x0f,0x0f,0x03, +0x21,0xb0,0x1b,0x16,0x03,0xb0,0x09,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33, +0x32,0x16,0x01,0x50,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x01,0xa4,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0xfe,0x5c,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x03,0xa8,0x2f,0x41,0x42,0x2e,0x2e,0x40,0x3f,0xfe,0x28,0x2f,0x41,0x42,0x2e,0x2e,0x40,0x3f,0xfe,0x2c,0x2f,0x41,0x42,0x2e,0x2e,0x43,0x42,0x00,0x00,0x02,0x00,0x32, +0x02,0x58,0x02,0x76,0x06,0x02,0x00,0x20,0x00,0x2e,0x00,0x67,0x40,0x3f,0xd7,0x2a,0x01,0x0a,0x1c,0x01,0xea,0x1c,0xfa,0x1c,0x02,0x0a,0x06,0x01,0xeb,0x06,0xfb,0x06,0x02,0x0b,0x05,0x01,0x05,0x02,0x01,0xe5,0x02,0xf5,0x02,0x02,0x10,0x11,0x11,0x00,0x00,0x21,0x10,0x21,0x02,0x21,0x1b,0x29,0x29,0x09,0x1b,0x1b,0x1d,0x25,0x2b,0x04, +0x00,0x25,0x01,0x25,0x16,0x0b,0x11,0x13,0x10,0x0e,0x0e,0x0b,0x01,0x00,0x3f,0x33,0x2f,0x33,0xcd,0x32,0x10,0xdd,0xdc,0x5d,0xdc,0xcd,0x10,0xcd,0x32,0x01,0x2f,0xcd,0x33,0x2f,0x10,0xdc,0x5d,0xcd,0x32,0x2f,0x33,0x31,0x30,0x5d,0x71,0x71,0x5d,0x71,0x5d,0x71,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x34,0x33,0x32, +0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x15,0x15,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x02,0x76,0x4a,0x4f,0x8d,0x89,0x4d,0x48,0xcf,0x26,0x8d,0x20,0x31,0x45,0x2c,0x4f,0x51,0x29,0x93,0x1b,0x35,0x13,0x0d,0x52,0x63,0x8d,0x48,0x42,0x78,0x1d, +0x24,0x65,0x64,0x29,0x21,0xae,0x63,0x26,0x1d,0x03,0x90,0x8a,0x54,0x5a,0x56,0x52,0x87,0x01,0xb0,0xcb,0x2a,0x2a,0x58,0x39,0x2a,0x1f,0x17,0x39,0xbc,0x48,0x55,0x4d,0x89,0x65,0x2a,0x35,0x38,0x2d,0x62,0xcb,0x3b,0x2e,0x00,0x01,0x00,0x28,0xff,0x40,0x04,0x25,0x04,0x18,0x00,0x32,0x00,0x8c,0x40,0x4f,0x96,0x23,0x01,0x1b,0x1c,0x1c, +0x19,0x84,0x1e,0x03,0x00,0x84,0x04,0x07,0x07,0x1e,0x1e,0x28,0x34,0x2c,0x2b,0x2b,0x2a,0x2e,0x0c,0x0d,0x0e,0x2d,0x2d,0x0e,0x0e,0x84,0x28,0x2a,0x14,0x28,0x2a,0xa8,0x2a,0xb8,0x2a,0x02,0x19,0x2a,0x29,0x2a,0x02,0x0a,0x2a,0x01,0x2a,0x1f,0x28,0x01,0x28,0x0c,0x03,0x09,0x95,0x2e,0x31,0x10,0x2a,0x95,0x2d,0x0f,0x16,0x95,0x20,0x25, +0x1c,0x1b,0x1b,0x0e,0x11,0x95,0x28,0x25,0x16,0x00,0x3f,0x33,0xed,0x32,0x33,0x2f,0x33,0x10,0xdc,0xed,0x3f,0xed,0x3f,0x33,0xfd,0xcc,0x33,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x33,0x2f, +0x39,0x31,0x30,0x5d,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x0d,0xa8,0x13,0x03,0x33,0x0d, +0x13,0xfe,0x54,0x7c,0x02,0x33,0x0d,0x13,0x01,0x2b,0x4a,0x30,0x40,0x50,0x72,0x7d,0x52,0x33,0x0d,0x13,0xfe,0xd4,0x4e,0x26,0x9f,0x08,0x8d,0xc7,0x1d,0x01,0x6e,0x18,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x73,0xfd,0xb6,0x09,0x1b,0x35,0x05,0x4d,0x13,0x53,0x41,0x6a,0x99,0x5b,0x57,0x2f,0x31, +0x05,0x51,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0x68,0x6b,0x15,0x00,0x01,0x00,0x28,0xfe,0x1f,0x04,0x4e,0x04,0x00,0x00,0x30,0x00,0x95,0x40,0x54,0x9b,0x17,0x01,0x89,0x17,0x01,0x78,0x17,0x01,0x2f,0x30,0x02,0x00,0x00,0x84,0x30,0x1c,0x14,0x30,0x30,0x1c,0x30,0x1c,0x06,0x84,0x19,0x19,0x1c,0x1c,0x22,0x32,0x27,0x29,0x29,0x84,0x22, +0x24,0x14,0x22,0x22,0x24,0x26,0x25,0x25,0x24,0xa8,0x24,0xb8,0x24,0x02,0x24,0x22,0x10,0x12,0x84,0x0f,0x0d,0x0d,0x1f,0x22,0x01,0x22,0x00,0x30,0x24,0x95,0x27,0x0f,0x2f,0x29,0x2c,0x95,0x10,0x15,0x0f,0x22,0x1c,0x02,0x1f,0x16,0x15,0x95,0x0a,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x33,0xce,0x11,0x39,0xed,0x32,0x32,0x3f,0xed,0xd4, +0xc4,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x17, +0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4e,0xb8,0x02,0x9c,0xb3,0x84,0xbc,0x93,0xd5,0x47,0x90,0x30,0x84,0x5a,0x65,0x56,0x75,0x9b,0xfe,0x7f,0x48,0x2c,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03, +0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x95,0x0a,0x0c,0x32,0xba,0x43,0xa7,0x50,0x3a,0x85,0x5f,0x52,0x4e,0x37,0x33,0x27,0x2c,0x3d,0x21,0x2d,0x55,0x2d,0xa9,0x4a,0x70,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0x00,0x01,0x00,0x28,0xfe,0x1f,0x04,0x30,0x04,0x18,0x00,0x33,0x00,0xbd, +0x40,0x74,0x78,0x15,0x01,0x9a,0x11,0x01,0x89,0x11,0x01,0x30,0x2d,0x2d,0x84,0x1a,0x17,0x14,0x1a,0x1a,0x17,0xd9,0x1a,0x01,0x78,0x1a,0x01,0x1a,0x17,0x00,0x84,0x13,0x13,0x50,0x17,0x60,0x17,0x02,0x17,0x17,0x22,0x35,0x25,0x24,0x24,0x23,0x20,0x27,0x26,0x21,0x26,0x21,0x21,0x84,0x22,0x23,0x14,0x22,0x22,0x23,0xf7,0x23,0x01,0x88, +0x23,0xa8,0x23,0xc8,0x23,0x03,0x79,0x23,0x01,0x47,0x23,0x57,0x23,0x02,0x23,0x22,0x0a,0x0c,0x84,0x09,0x07,0x07,0x1f,0x22,0x01,0x22,0x40,0x0c,0x10,0x48,0x22,0x20,0x1a,0x1d,0x95,0x2d,0x27,0x2a,0x10,0x23,0x95,0x26,0x0f,0x0a,0x09,0x30,0x21,0x17,0x22,0x15,0x0f,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x33,0xc4,0x33,0xce,0x32,0x3f, +0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x05,0x14,0x07, +0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x16,0x04,0x30,0xb3,0x84,0xbc,0x93,0xd5,0x47,0x90,0x30,0x84,0x5a,0x65,0x56,0x75, +0x9b,0x09,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x87,0x02,0x9c,0xb0,0xa7,0x50,0x3a,0x85,0x5f,0x52,0x4e,0x37,0x33,0x27,0x2c,0x3d,0x21,0x2d,0x55,0x2c,0xa9,0x4b,0x1d,0x2c,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0xb4,0x26, +0x26,0xfd,0x7d,0x0a,0x0c,0x32,0xba,0x00,0x00,0x02,0x00,0x30,0xff,0xe7,0x04,0xa7,0x06,0x04,0x00,0x39,0x00,0x48,0x00,0xe4,0x40,0x9a,0x84,0x44,0x01,0x75,0x44,0x01,0x66,0x40,0x01,0x45,0x40,0x55,0x40,0x02,0x85,0x3f,0x01,0x8b,0x3d,0x01,0x7c,0x3d,0x01,0x48,0x3d,0x68,0x3d,0x02,0x79,0x3c,0x89,0x3c,0x02,0x48,0x36,0x58,0x36,0x68, +0x36,0x03,0x79,0x1e,0x89,0x1e,0x02,0x99,0x1d,0x01,0x99,0x1a,0x01,0x76,0x17,0x86,0x17,0x02,0x27,0x17,0x01,0x94,0x11,0x01,0x85,0x11,0x01,0x11,0x15,0x0c,0x0f,0x84,0x22,0x97,0x25,0x01,0x25,0x22,0x15,0x83,0x3a,0x03,0x00,0x84,0x04,0x07,0x07,0x89,0x3e,0x01,0x58,0x3e,0x78,0x3e,0x02,0x20,0x3e,0x3a,0x4f,0x22,0x5f,0x22,0x6f,0x22, +0x03,0x22,0x3a,0x22,0x3a,0x1c,0x4a,0x2e,0x31,0x84,0x2d,0x00,0x2a,0x10,0x2a,0x02,0x2a,0x2a,0x42,0x83,0x0f,0x1c,0x1f,0x1c,0x5f,0x1c,0x6f,0x1c,0x04,0x1c,0x25,0x0c,0x28,0x04,0x09,0x95,0x38,0x01,0x3e,0x95,0x20,0x20,0x45,0x28,0x95,0x33,0x2d,0x00,0x45,0x95,0x19,0x16,0x00,0x3f,0xed,0x3f,0xdc,0xed,0x11,0x39,0x2f,0xed,0x3f,0xfd, +0xce,0x12,0x39,0x39,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x5d,0x33,0xed,0x32,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x32,0x2f,0x33,0xed,0x32,0x10,0xed,0x11,0x33,0x5d,0x10,0xed,0x32,0x11,0x39,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x07, +0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x0f,0x02,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x10,0x07,0x06,0x21,0x22,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x37,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x37,0x33,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x33,0x32,0x01,0x34,0x27,0x26,0x27,0x06,0x07,0x06,0x15,0x14,0x16, +0x33,0x32,0x37,0x36,0x04,0xa7,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xaa,0x28,0x02,0x53,0x7c,0x1d,0x53,0x9e,0xa6,0xfe,0xf7,0xbd,0xde,0x90,0x93,0xfd,0x1d,0x09,0x15,0x9b,0x44,0x30,0x9f,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0x01,0xf7,0x44,0x30,0x9f,0xfe,0xc9,0x36,0x20,0x53,0xfe,0x84,0x6d,0x89,0x74,0xb9,0x77,0x6b,0x05, +0x50,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x35,0xc3,0x0a,0x0c,0x3c,0x42,0x63,0x25,0x66,0x95,0xfe,0xf7,0xb5,0xc0,0xc9,0xad,0xf8,0xb0,0xb4,0x2e,0x2f,0x38,0x19,0x30,0x71,0x30,0x15,0xb4,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x9c,0x15,0xfc,0x5c,0x5e,0x48,0x2b,0x41,0x1b,0xa8,0x8b,0xbf,0x6d,0x85,0xa3,0x91,0x00,0x00,0x01, +0x00,0x28,0xfe,0x25,0x04,0x25,0x04,0x18,0x00,0x21,0x00,0x90,0x40,0x57,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0xb8,0x10,0xc8,0x10,0x02,0x10,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x18,0x23,0x1b,0x1a,0x1a,0x19,0x16,0x1d,0x1c,0x17,0x1c,0x17,0x17,0x84,0x18,0x19,0x14,0x18,0x19,0xf7,0x19,0x01,0x88,0x19,0xa8,0x19,0xc8, +0x19,0x03,0x79,0x19,0x01,0x57,0x19,0x01,0x19,0x1f,0x18,0x01,0x18,0x40,0x0c,0x10,0x48,0x18,0x16,0x10,0x13,0x95,0x1d,0x01,0x20,0x10,0x19,0x95,0x1c,0x0f,0x17,0x0d,0x04,0x18,0x15,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0xc4,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10, +0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25, +0x08,0x87,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x88,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x7e,0x5a,0x45,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x40,0x63,0x02,0xa4,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x00,0x01, +0x00,0x28,0xfe,0x25,0x06,0xc0,0x04,0x18,0x00,0x30,0x00,0xb5,0x40,0x69,0x25,0x24,0x24,0x23,0x20,0x27,0x26,0x21,0x26,0x21,0x21,0x84,0x22,0x23,0x14,0x22,0x23,0xc8,0x23,0x01,0x86,0x23,0x01,0x57,0x23,0x77,0x23,0x02,0x23,0x5f,0x22,0x8f,0x22,0xbf,0x22,0x03,0x22,0x17,0x2c,0x0e,0x0c,0x0c,0x84,0x1a,0x17,0x14,0x1a,0x1a,0x17,0xa8, +0x1a,0xc8,0x1a,0x02,0x1a,0x17,0x12,0x84,0x13,0x13,0x17,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0xb8,0x06,0x01,0x06,0x04,0x17,0x0c,0x06,0x09,0x95,0x2c,0x01,0x2f,0x2f,0x20,0x1a,0x1d,0x95,0x27,0x2a,0x10,0x23,0x95,0x26,0x0f,0x03,0x04,0x21,0x17,0x0e,0x22,0x15,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x33,0xc4,0xd4,0xc4,0x3f, +0xed,0x3f,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x32,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x33,0x18,0x10,0xdc,0x5d,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x31, +0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x06,0xc0,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0d,0x13,0xfe,0x56,0x86,0x13, +0x01,0x14,0xa4,0x14,0x01,0x14,0x88,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x84,0x17,0x01,0x8c,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfd,0x81,0x5a,0x45,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x40,0x63,0x02,0xa4,0x0f,0x0e,0x35, +0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x86,0x71,0x15,0x00,0x00,0x02,0xff,0x3f,0xff,0xe7,0x04,0x25,0x06,0x04,0x00,0x2d,0x00,0x3f,0x00,0xa4,0x40,0x5e,0x87,0x04,0x01,0x76,0x04,0x01,0x64,0x04,0x01,0x53,0x04,0x01,0x03,0x01,0x01,0x84,0x3f,0x3d,0x14,0x3f,0x3f,0x3d,0x08,0x3f,0x18,0x3f,0x02,0x3f,0x3d,0x3d,0x0b,0x41, +0x1b,0x1d,0x84,0x18,0x34,0x33,0x29,0x28,0x27,0x35,0x27,0x35,0x35,0x84,0x0b,0x0e,0x14,0x0b,0x0b,0x0e,0x1a,0x18,0x18,0x0e,0x39,0x0e,0x01,0x2a,0x0e,0x01,0x0e,0x1f,0x0b,0x01,0x0b,0x3f,0x33,0x30,0x95,0x29,0x01,0x2c,0x10,0x0e,0x11,0x95,0x27,0x24,0x01,0x16,0x95,0x1f,0x1b,0x00,0x3d,0x35,0x38,0x95,0x0b,0x03,0x08,0x16,0x00,0x3f, +0x33,0x33,0xed,0x32,0x32,0x3f,0xde,0xed,0x3f,0x33,0xed,0x32,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x01,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d, +0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37, +0x13,0x36,0x04,0x25,0x08,0x6c,0x1f,0xae,0xfe,0x8a,0x53,0x21,0x9f,0x08,0xec,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x51,0x01,0x75,0x4a,0x2a,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfe,0x03,0x94, +0x2c,0x5f,0x15,0xb4,0x27,0x25,0x04,0x4a,0x10,0x0d,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x27,0x25,0xfe,0x8b,0x6a,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x02,0x00,0x5b,0xff,0xa7,0x06,0xc3,0x04,0x58,0x00,0x3a,0x00,0x4c,0x00,0xf0,0x40,0x85, +0x88,0x2c,0x98,0x2c,0x02,0x87,0x1c,0x01,0x76,0x1b,0x86,0x1b,0x96,0x1b,0x03,0x97,0x07,0x01,0x1d,0x1c,0x1c,0x18,0x16,0x36,0x01,0x07,0x36,0x01,0x36,0x16,0x49,0x4a,0x4b,0x4c,0x18,0x16,0x16,0x84,0x4c,0x20,0x14,0x4c,0x4c,0x20,0x4c,0x20,0x40,0x41,0x42,0x31,0x31,0x42,0x42,0x84,0x26,0x29,0x14,0x26,0x26,0x29,0x2e,0x2d,0x2d,0x29, +0x29,0x5f,0x26,0x01,0x26,0x20,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x50,0x0d,0x01,0x0d,0x20,0x4c,0x40,0x29,0x3d,0x95,0x34,0x16,0x10,0x13,0x95,0x36,0x01,0x39,0x39,0x34,0x2d,0x2e,0x2e,0x31,0x34,0x10,0x49,0x42,0x45,0x95,0x23,0x0d,0x08,0x04,0x09,0x09,0x96,0x1c,0x01,0x1c,0x1d,0x1d,0x23,0x26, +0x26,0x20,0x18,0x23,0x16,0x00,0x3f,0x33,0x33,0x33,0x2f,0x11,0x33,0x2f,0x33,0x5d,0x33,0x2f,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x3f,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x10,0xcc,0x5d,0x32,0x11, +0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0xc4,0x05,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35, +0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x05,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xc3,0x08,0x81,0x04, +0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0xfe,0x53,0x80,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x84,0x17,0x01,0x8f,0x4b,0x29,0x9f,0xfc,0xbb,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03, +0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e,0x0f,0x35,0x05,0x73,0xfd,0x9f,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x22,0x39,0x62,0x15,0xb4,0x27,0x25,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x85,0x70,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f, +0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x01,0x00,0x28,0x00,0x00,0x03,0xa4,0x04,0x00,0x00,0x1f,0x00,0x52,0x40,0x2f,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0xd8,0x06,0x01,0x06,0x00,0x04,0x01,0x04,0x04,0x21,0x15,0x17,0x84,0x14,0x13,0x12,0x10,0x0e,0x95,0x0f,0x19,0x1f,0x19,0x02,0x19,0x06,0x09,0x95,0x01,0x1e, +0x12,0x95,0x15,0x0f,0x03,0x04,0x15,0x00,0x3f,0xc4,0x3f,0xed,0xde,0x32,0xed,0x32,0xdc,0x5d,0xed,0x01,0x2f,0x33,0xce,0x32,0xed,0x32,0x12,0x39,0x2f,0x5d,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x23,0x37,0x21,0x06,0x15, +0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x03,0xa4,0x08,0x8a,0xa3,0x8e,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x02,0xc7,0x1d,0x01,0x6e,0x1f,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x02,0xec,0x25,0x27,0xfd,0x60,0x02,0xc3,0x0f,0x0e,0x2b,0x05,0x34,0x15,0x96,0x12,0x10,0x8b,0x78,0x15,0x28,0x05,0x31,0x15,0x00,0x00,0x02,0x00,0x59, +0xfe,0x25,0x04,0x25,0x05,0xec,0x00,0x27,0x00,0x37,0x00,0x95,0x40,0x4e,0x36,0x35,0x0f,0x0e,0x0d,0x04,0x01,0x01,0x84,0x37,0x0d,0x14,0x37,0x37,0x0d,0x37,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x15,0x39,0x2e,0x2d,0x23,0x22,0x21,0x2f,0x21,0x2f,0x2f,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x84,0x1c,0x1c,0x18,0x87,0x18,0x01,0x18, +0x1f,0x15,0x01,0x15,0x37,0x2d,0x2a,0x95,0x23,0x21,0x18,0x01,0x26,0x10,0x1c,0x00,0x35,0x2f,0x32,0x95,0x15,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0xed,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e, +0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13, +0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x04,0x25,0x09,0x99,0x13,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x03,0xfe,0x89,0x4a,0x2a,0x9f,0x09,0x99,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x54,0x7c, +0x03,0x33,0x0d,0x13,0x01,0xac,0x7c,0x03,0x03,0x64,0x22,0x2a,0xfd,0x3b,0x58,0x59,0x09,0x1d,0xfe,0xa9,0x01,0x50,0x16,0x0e,0x35,0x85,0x14,0x6b,0x15,0xb4,0x22,0x2a,0x02,0xc5,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0xc0,0x35,0x05,0x73,0xfd,0xaf,0x0e,0x0f,0x35,0x05,0x73,0x02,0x51,0x0e,0x00, +0x00,0x02,0x00,0x31,0xff,0xa7,0x06,0xbe,0x04,0x58,0x00,0x30,0x00,0x42,0x00,0xd9,0x40,0x7c,0x79,0x22,0x01,0x87,0x07,0x01,0x76,0x07,0x01,0x24,0x23,0x23,0x1f,0x27,0x1b,0x1c,0x1c,0x84,0x1d,0x1f,0x14,0x1d,0x1f,0x7a,0x1f,0x8a,0x1f,0x9a,0x1f,0x03,0x1f,0x1d,0x12,0x07,0x2c,0x17,0x2c,0x02,0x2c,0x36,0x38,0x38,0x84,0x12,0x15,0x14, +0x12,0x12,0x15,0x15,0x12,0x09,0x08,0x08,0x04,0x41,0x40,0x3f,0x0c,0x42,0x0c,0x97,0x04,0x01,0x04,0x01,0x01,0x84,0x42,0x0c,0x14,0x42,0x42,0x0c,0x42,0x0c,0x12,0x42,0x36,0x33,0x95,0x2c,0x01,0x2f,0x2f,0x2a,0x9a,0x23,0x01,0x8b,0x23,0x01,0x23,0x24,0x24,0x1b,0x15,0x18,0x95,0x27,0x1f,0x2a,0x10,0x1c,0x1d,0x15,0x3f,0x38,0x3b,0x95, +0x0f,0x85,0x08,0x95,0x08,0x02,0x08,0x09,0x09,0x12,0x0c,0x04,0x0f,0x16,0x00,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x5d,0x10,0xed,0x32,0x32,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x10,0x87,0xc4,0x0e, +0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x5d,0x18,0x10,0xdc,0x32,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35, +0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xbe,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x80,0x02,0x33, +0x0d,0x13,0xfe,0x57,0xa6,0xab,0xb5,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x83,0x18,0x01,0x8a,0x4b,0x29,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21,0x3a,0x62,0x15,0xb4,0x27,0x25,0x02,0x54, +0x09,0x14,0x35,0x05,0x72,0xfc,0xea,0x03,0x4b,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x83,0x6e,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x00,0x02,0x00,0x30,0xff,0xe7,0x05,0x4c,0x06,0x04,0x00,0x30,0x00,0x3d,0x00,0xcc,0x40,0x7d,0x56,0x3c,0x01,0x95,0x38,0x01, +0x87,0x38,0x01,0x89,0x35,0x01,0x95,0x0e,0x01,0x46,0x0e,0x56,0x0e,0x02,0x8a,0x07,0x01,0x21,0x23,0x84,0x20,0x1e,0x1e,0x14,0x00,0x01,0x01,0x2d,0x31,0x12,0x13,0x14,0x3d,0x14,0x2e,0x2f,0x05,0x06,0x2d,0x06,0x2d,0x2d,0x84,0x14,0x3d,0x14,0x14,0x14,0x3d,0x14,0x3d,0x3d,0x3f,0x37,0x83,0x0c,0x1c,0x95,0x0f,0x25,0x1f,0x25,0x02,0x25, +0x14,0x17,0x95,0x2d,0x2a,0x01,0x20,0x00,0x05,0x31,0x33,0x54,0x00,0x64,0x00,0x02,0x45,0x00,0x01,0x16,0x00,0x26,0x00,0x36,0x00,0x03,0x07,0x00,0x01,0x66,0x2f,0x01,0x12,0x2f,0x00,0x03,0x10,0x01,0x01,0x33,0x95,0x20,0x10,0x01,0x10,0x10,0x47,0x3d,0x01,0x3d,0x39,0x95,0x06,0x0a,0x16,0x00,0x3f,0x33,0xed,0x32,0x5d,0x3f,0x5d,0xed, +0x32,0x2f,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x39,0x3f,0x3f,0x33,0xed,0x32,0xdc,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x01,0x07,0x26,0x27,0x26,0x27,0x03,0x06,0x07,0x06,0x23,0x20,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x16,0x05,0x26,0x23,0x20,0x07,0x06,0x15,0x14,0x33,0x32,0x37, +0x36,0x37,0x05,0x4c,0x25,0x1c,0x20,0x4d,0x51,0x7e,0x21,0xc3,0x98,0xa8,0xfe,0x85,0xee,0xf7,0x01,0x75,0x27,0x1b,0x3c,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x3b,0x83,0xfe,0xc0,0x1f,0x1a,0xfe,0xe3,0xc8,0xbb,0xee,0x59,0x73,0x8d,0x10,0x03,0x9b,0xa2,0x15,0x12,0x2d,0x1b, +0xfd,0xb3,0x9c,0x55,0x43,0x01,0x7a,0x01,0x1f,0xc9,0xd0,0x02,0x01,0x1a,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x27,0x25,0xfe,0xee,0x23,0x4f,0x03,0xaf,0xa4,0xcc,0xfb,0x2d,0x36,0x4c,0x00,0x01,0x00,0x31,0x00,0x00,0x04,0x8d,0x06,0x04,0x00,0x33,0x00,0x9e,0x40,0x59,0x03,0x00,0x84,0x06, +0x18,0x15,0x15,0x84,0x24,0x21,0x14,0x24,0x24,0x21,0x04,0x06,0x06,0x24,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x00,0x21,0x01,0x21,0x21,0x2c,0x35,0x2a,0x0f,0x0e,0x2b,0x0e,0x2b,0x2b,0x84,0x2c,0x2d,0x14,0x2c,0x2d,0x08,0x2d,0x01,0x2d,0x2c,0x2f,0x03,0x01,0x03,0x03,0x12,0x19,0x0e,0x01,0x0e,0x09,0x95,0x77,0x2d,0x01,0x26,0x2d,0x01,0x19, +0x2d,0x01,0x2d,0x32,0x01,0x21,0x27,0x18,0x12,0x1d,0x2b,0x2c,0x15,0x2a,0x24,0x27,0x95,0x15,0x0f,0x12,0x10,0x00,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xc4,0xc4,0x11,0x39,0x11,0x39,0x3f,0x33,0x5d,0x5d,0x5d,0xed,0x32,0x5d,0x11,0x39,0x2f,0x5d,0x01,0x2f,0x33,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x12,0x01,0x39,0x18, +0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x07,0x03,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x07,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23, +0x22,0x07,0x05,0x03,0x23,0x01,0x36,0x37,0x25,0x36,0x33,0x32,0x04,0x8d,0x08,0x0e,0xa8,0x14,0x03,0x33,0x0d,0x13,0xfe,0x89,0x37,0x0a,0x3e,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x27,0x13,0x03,0x12,0xa4,0x12,0x03,0x14,0x28,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0x01,0x06,0x1f,0xae,0x01,0x76,0x53,0x21,0x9f,0x05,0x50,0x27,0x25,0x41, +0x64,0x0f,0x0e,0x35,0x05,0x63,0x0f,0x32,0xfe,0xc9,0x6a,0x15,0xb4,0x2a,0x22,0xa7,0x51,0x44,0x30,0x3d,0xfe,0x91,0x01,0x6f,0x3d,0x2d,0x34,0x65,0xc9,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x04,0xd0,0x94,0x2c,0x5f,0x15,0x00,0x01,0x00,0x5b,0xff,0xa7,0x06,0xea,0x04,0x58,0x00,0x35,0x00,0xba,0x40,0x67,0x96,0x05,0x01,0x07,0x87,0x06, +0x01,0x06,0x06,0x96,0x02,0x01,0x87,0x02,0x01,0x02,0x00,0x00,0x84,0x35,0x34,0x14,0x35,0x35,0x34,0x35,0x0a,0x50,0x34,0x01,0x34,0x2a,0x2c,0x2e,0x2e,0x84,0x2a,0x2b,0x14,0x2a,0x2a,0x2b,0x2b,0x2a,0x21,0x24,0x24,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x1c,0x1c,0x18,0x99,0x18,0x01,0x08,0x18,0x01,0x18,0x5f,0x15,0x01,0x15,0x0f, +0x2a,0x00,0x35,0x2b,0x1c,0x1d,0x1d,0x2c,0x21,0x18,0x2b,0x0f,0x34,0x2e,0x31,0x95,0x0d,0x2a,0x24,0x27,0x95,0x15,0x0f,0x12,0x12,0x0d,0x06,0x07,0x07,0x0a,0x02,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x3f,0x33,0x33,0xc4,0x33,0x2f,0x33,0x10,0xd4,0xc4,0x01,0x2f, +0x33,0xcc,0x5d,0x32,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xcc,0x5d,0x32,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x5d,0x32,0x18,0x2f,0x5d,0x33,0x31,0x30,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23, +0x22,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x06,0xea,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x82,0x4b,0x29,0x84,0x17,0xfe,0x71,0x4b,0x29,0x9f,0x08,0x81,0x04, +0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0xa7,0xac,0x03,0x33,0x0d,0x13,0x01,0xa9,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x85,0x70,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73, +0x03,0x16,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x00,0x01,0x00,0x28,0xff,0xa7,0x05,0xa2,0x04,0x18,0x00,0x36,0x00,0x8e,0x40,0x4e,0x86,0x05,0x01,0x07,0x06,0x06,0x02,0x00,0x00,0x84,0x36,0x35,0x14,0x36,0x36,0x35,0x36,0x0a,0x35,0x35,0x10,0x38,0x20,0x22,0x84,0x1d,0xa7,0x2c,0x01,0x2c,0x2f,0x2f,0x84,0x10,0x13,0x14, +0x10,0x10,0x13,0x1f,0x1d,0x1d,0x13,0xd8,0x13,0x01,0x13,0x10,0x00,0x36,0x0f,0x1b,0x95,0x24,0x13,0x16,0x95,0x2c,0x29,0x10,0x1f,0x0f,0x35,0x2f,0x32,0x95,0x0d,0x94,0x06,0x01,0x06,0x07,0x07,0x10,0x0a,0x02,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x5d,0x10,0xed,0x32,0x32,0x3f,0x3f,0x33,0xed,0x32,0xdc,0xed,0x3f,0xc4, +0x01,0x2f,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22, +0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x05,0xa2,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x86,0x4a,0x30,0x9f,0x08,0x81,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51, +0x23,0x96,0x08,0x81,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x26,0x26,0x02,0x5e,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x26,0x26,0xfd,0xa2,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x01,0x00,0x28,0xfe,0x25, +0x05,0xa2,0x04,0x18,0x00,0x39,0x00,0x88,0x40,0x48,0x0c,0x0d,0x38,0x39,0x02,0x00,0x00,0x84,0x39,0x0b,0x14,0x39,0x39,0x0b,0x39,0x0b,0x06,0x84,0x07,0x07,0x0b,0x0b,0x13,0x3b,0x23,0x25,0x84,0x20,0x2f,0x32,0x32,0x84,0x13,0x16,0x14,0x13,0x13,0x16,0x22,0x20,0x20,0x16,0x16,0x13,0x00,0x39,0x0f,0x1e,0x95,0x27,0x16,0x19,0x95,0x2c, +0x2f,0x2c,0x22,0x22,0x2c,0x10,0x38,0x32,0x35,0x95,0x13,0x0d,0x0b,0x02,0x10,0x16,0x07,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0xdc,0xed,0x3f,0xc4,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x2f, +0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14, +0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x05,0xa2,0xc3,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x05,0xfe,0x85,0x4a,0x30,0x9f,0x08,0x81,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x81,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0x53,0x52,0x5f,0x09,0x1d,0xfe, +0xa9,0x01,0x4e,0x18,0x0e,0x61,0x59,0x14,0x6b,0x15,0xb4,0x26,0x26,0x02,0x5e,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x26,0x26,0xfd,0xa2,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x01,0x00,0x59,0xff,0xa7,0x06,0xbc,0x05,0xec,0x00,0x3b,0x00,0xc6,0x40,0x6e,0x96,0x07,0x01,0x31,0x84,0x30, +0x30,0x19,0x2a,0x2b,0x2c,0x18,0x2c,0x16,0x37,0x36,0x35,0x17,0x35,0x17,0x17,0x84,0x18,0x2c,0x14,0x18,0x18,0x2c,0x57,0x2c,0x01,0x2c,0x18,0x22,0x24,0x24,0x84,0x1f,0x21,0x14,0x1f,0x21,0x38,0x21,0x01,0x09,0x21,0x01,0x21,0x6f,0x1f,0x01,0x1f,0x18,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x28,0x10,0x01, +0x10,0x20,0x0d,0x50,0x0d,0x02,0x0d,0x18,0x16,0x10,0x13,0x95,0x37,0x35,0x2c,0x01,0x3a,0x10,0x31,0x30,0x00,0x22,0x21,0x0f,0x2a,0x24,0x27,0x95,0x1f,0x19,0x1c,0x16,0x0d,0x08,0x04,0x09,0x09,0x17,0x18,0x15,0x00,0x3f,0xc4,0x33,0x2f,0x33,0x33,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xc4,0x3f,0xc4,0x3f,0x33,0x33,0x33,0x33,0xed, +0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x10,0xdc,0x5d,0x32,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x01,0x33,0x18,0x2f,0xed,0x31,0x30,0x5d,0x01,0x14, +0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x06,0xbc,0x08,0x81,0x04,0x15, +0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0xfe,0x54,0xa8,0xa6,0x16,0xfe,0x8e,0x4a,0x2a,0x9f,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0e,0x12,0x01,0xa7,0x98,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e, +0x0f,0x35,0x05,0x73,0xfc,0xeb,0x65,0x69,0x15,0xb4,0x26,0x26,0x03,0x19,0xfc,0xc4,0x0f,0x0e,0x35,0x05,0x72,0x02,0xc3,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x00,0x01,0x00,0x59,0xff,0xa7,0x04,0x4c,0x05,0xec,0x00,0x26,0x00,0x7d,0x40,0x45,0x07,0x06,0x06,0x02,0x00,0x00,0x84,0x26,0x25,0x14, +0x26,0x26,0x25,0x18,0x26,0x01,0x26,0x0a,0x25,0x25,0x10,0x28,0x1c,0x1f,0x1f,0x84,0x10,0x13,0x14,0x10,0x10,0x13,0x18,0x84,0x17,0x17,0x13,0x08,0x13,0x28,0x13,0x38,0x13,0x03,0x13,0x1f,0x10,0x01,0x10,0x1c,0x13,0x00,0x26,0x0f,0x17,0x00,0x25,0x1f,0x22,0x95,0x0d,0x06,0x02,0x07,0x07,0x10,0x0a,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33, +0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x3f,0x3f,0xc4,0x33,0x33,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0xed,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22, +0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4c,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x86,0x4a,0x30,0x9f,0x08,0x97,0x14,0x01,0x14,0xa4,0x14,0x01,0x14,0x9c,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f, +0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x26,0x26,0x02,0xc5,0x5e,0x53,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x5b,0x5f,0xfd,0x18,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x00,0x02,0x00,0x42,0xfe,0x1f,0x04,0x25,0x04,0x58,0x00,0x27,0x00,0x39,0x00,0xab,0x40,0x64,0x86,0x0e,0x01,0x75,0x0e,0x01,0x88,0x04,0x01,0x03,0x01,0x01, +0x84,0x39,0x37,0x14,0x39,0x39,0x37,0x18,0x39,0x01,0x09,0x39,0x01,0x39,0x37,0x12,0x13,0x13,0x37,0x37,0x18,0x3b,0x23,0x0a,0x2d,0x2f,0x2f,0x84,0x18,0x1b,0x14,0x18,0x18,0x1b,0x20,0x1f,0x1f,0x1b,0x09,0x1b,0x01,0x1b,0x1f,0x18,0x3f,0x18,0x02,0x18,0x39,0x2d,0x2a,0x95,0x26,0x1f,0x1b,0x20,0x20,0x23,0x01,0x26,0x10,0x5a,0x13,0x6a, +0x13,0x9a,0x13,0x03,0x13,0x15,0x12,0x12,0x10,0x95,0x15,0x1c,0x37,0x2f,0x32,0x95,0x18,0x0a,0x79,0x03,0x01,0x03,0x08,0x16,0x00,0x3f,0x33,0x5d,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f,0x33,0x33,0x33,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d, +0x10,0xc4,0x01,0x33,0x32,0x11,0x12,0x39,0x18,0x2f,0x33,0x2f,0x33,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16, +0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x04,0x25,0x08,0x6c,0x1f,0xae,0xfe,0x8a,0x53,0x21,0x08,0x0b,0x02,0x5a,0x53,0xb6,0xcd,0xb2,0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x9f,0xa7,0x33,0x0d,0x13, +0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfe,0x03,0x94,0x2c,0x5f,0x15,0x01,0x18,0x08,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x85,0x9a,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x25,0x3f,0x6b,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20, +0x0f,0x00,0x00,0x01,0x00,0x5b,0xfe,0x25,0x06,0xea,0x05,0xec,0x00,0x42,0x00,0xb9,0x40,0x64,0x31,0x33,0x33,0x84,0x2f,0x30,0x14,0x2f,0x2f,0x30,0x30,0x2f,0x26,0x29,0x29,0x84,0x1a,0x1d,0x14,0x1a,0x1a,0x1d,0x22,0x21,0x21,0x1d,0x1d,0x5f,0x1a,0x8f,0x1a,0x02,0x1a,0x2f,0x40,0x84,0x3f,0x3f,0x0e,0x0f,0x39,0x3a,0x3b,0x04,0x01,0x01, +0x84,0x3b,0x0d,0x14,0x3b,0x3b,0x0d,0x68,0x3b,0x01,0x3b,0x0d,0x08,0x84,0x09,0x09,0x60,0x0d,0x01,0x0d,0x14,0x2f,0x3f,0x00,0x26,0x21,0x1d,0x22,0x22,0x3b,0x31,0x01,0x30,0x0f,0x39,0x33,0x36,0x95,0x12,0x2f,0x29,0x2c,0x95,0x1a,0x14,0x17,0x17,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x33, +0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x3f,0x33,0xc4,0x33,0x33,0x2f,0x33,0x33,0x33,0x3f,0x01,0x2f,0x33,0xcc,0x5d,0x32,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x01,0x33,0x18,0x2f,0xed,0x10,0xcc,0x5d,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33, +0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x33,0x03,0x06,0x15,0x14,0x33, +0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x06,0xea,0x13,0xb2,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x05,0xfe,0x83,0x4a,0x2a,0x84,0x17,0xfe,0x71,0x4b,0x29,0x9f,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0xa7,0xac,0x03,0x33,0x0d,0x13,0x01,0xa9,0x96,0x14,0x01,0x14, +0xa4,0x14,0x01,0x04,0x66,0x5f,0x5b,0xfc,0xa7,0x52,0x5f,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x19,0x0e,0x61,0x59,0x14,0x6b,0x15,0x85,0x70,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x72,0x02,0xc3,0x5e,0x53,0x14, +0x12,0x01,0x69,0xfe,0x97,0x12,0x00,0x03,0x00,0x5b,0xfe,0x25,0x06,0xbe,0x04,0x58,0x00,0x32,0x00,0x3e,0x00,0x50,0x01,0x06,0x40,0x94,0x25,0x2e,0x01,0x06,0x2e,0x16,0x2e,0x02,0x2e,0x38,0x18,0x4d,0x4e,0x4f,0x50,0x17,0x50,0x0d,0x38,0x0e,0x38,0x0e,0x0e,0x84,0x17,0x50,0x14,0x17,0x17,0x50,0x50,0x17,0x16,0x29,0x26,0x29,0x02,0x07, +0x29,0x01,0x29,0x44,0x46,0x46,0x84,0x1e,0x21,0x14,0x1e,0x1e,0x21,0x26,0x25,0x25,0x21,0x21,0x1e,0x17,0x12,0x84,0x13,0x13,0x17,0x09,0x08,0x08,0x04,0x3b,0x3c,0x3d,0x3e,0x04,0x01,0x01,0x84,0x3e,0x0c,0x14,0x3e,0x3e,0x0c,0x3e,0x20,0x0c,0x50,0x0c,0x02,0x0c,0x17,0x50,0x44,0x41,0x95,0x2c,0x3e,0x38,0x35,0x95,0x2e,0x01,0x31,0x31, +0x2c,0x25,0x21,0x26,0x26,0x29,0x2c,0x10,0x4d,0x46,0x39,0x49,0x95,0x1b,0x7b,0x3b,0x01,0x3b,0xa9,0x0c,0x01,0x9a,0x0c,0x01,0x7b,0x0c,0x8b,0x0c,0x02,0x0c,0x96,0x08,0x01,0x08,0x04,0x09,0x09,0x1e,0x18,0x17,0x0e,0x0d,0x1b,0x16,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x33,0x5d,0x33,0x5d,0x5d,0x5d,0x33, +0x5d,0x10,0xed,0x32,0x32,0x32,0x3f,0x33,0x33,0x2f,0x33,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x01,0x2f,0xcd,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0xc4,0x05,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x2f,0xed,0x10,0xcc,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4, +0x01,0x32,0x5d,0x5d,0x11,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0x10,0x87,0x0e,0xc4,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36, +0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x25,0x36,0x37,0x13,0x36,0x25,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xbe,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfd,0xf4,0x03,0x01,0x0c,0xa4, +0x0c,0x01,0x17,0xfe,0x81,0x50,0x24,0x9f,0x08,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x85,0x16,0x01,0x8a,0x4e,0x26,0x9f,0xa7,0x33,0x0e,0x12,0xfe,0x58,0x8c,0x01,0xd5,0x36,0x0b,0x6e,0x03,0xfd,0x67,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfd, +0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21,0x3a,0x77,0x29,0x1c,0x09,0x1d,0xfe,0xa9,0x01,0x39,0x1a,0x21,0x5d,0x6b,0x65,0x15,0xb4,0x27,0x25,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x7f,0x6a,0x15,0xc0,0x35,0x05,0x73,0xfd,0x58,0x6d,0x0d,0x34,0x02,0x20,0x0f,0x0e,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f, +0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x01,0x00,0x71,0xfe,0x25,0x04,0x75,0x05,0xec,0x00,0x39,0x00,0xb1,0x40,0x63,0x30,0x84,0x2f,0x2f,0x2b,0x21,0x1e,0x84,0x22,0x2f,0x25,0x01,0x25,0x25,0x2b,0x03,0x00,0x84,0x04,0x7f,0x07,0x01,0x07,0x07,0x34,0x2a,0x19,0x18,0x17,0x2b,0x17,0x0d,0x0c,0x35,0x34,0x0e,0x34,0x0e,0x0e,0x84, +0x17,0x2b,0x14,0x17,0x17,0x2b,0x89,0x2b,0x01,0xf8,0x2b,0x01,0x99,0x2b,0x01,0x85,0x2b,0x01,0x66,0x2b,0x01,0x08,0x2b,0x01,0x2b,0x17,0x12,0x84,0x13,0x13,0x17,0x2a,0x35,0x38,0x27,0x95,0x0c,0x19,0x09,0x1c,0x1c,0x03,0x09,0x95,0x38,0x34,0x2b,0x38,0x22,0x22,0x38,0x10,0x2f,0x00,0x0e,0x17,0x15,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x3f, +0x3f,0x33,0x2f,0x11,0x33,0x33,0x10,0xfd,0xcc,0x32,0x2f,0x12,0x39,0x39,0xed,0x11,0x39,0x39,0x01,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x5d,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0x33,0xed, +0x32,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x37,0x33,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x37,0x36,0x33, +0x32,0x04,0x75,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xad,0x9f,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x13,0x92,0x9b,0x44,0x30,0x9f,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xd0,0x15,0x01,0x14,0xa4,0x14,0x01,0x0a,0x78,0x44,0x30,0x9f,0x03,0x64,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x36,0xfd,0x01,0x52,0x5f,0x09,0x1d,0xfe,0xa9, +0x01,0x4d,0x19,0x0e,0x5d,0x5d,0x02,0xc9,0x30,0x15,0xb4,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x41,0x67,0x4e,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x44,0x44,0x25,0x15,0x00,0x01,0x00,0x28,0xff,0xa7,0x04,0x25,0x04,0x18,0x00,0x21,0x00,0x84,0x40,0x4a,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10, +0x0d,0x0d,0x18,0x23,0x1b,0x1a,0x1a,0x19,0x16,0x1d,0x1c,0x17,0x1c,0x17,0x17,0x84,0x18,0x19,0x14,0x18,0x19,0x88,0x19,0x01,0x79,0x19,0x01,0x18,0x19,0x01,0x19,0x1f,0x18,0x3f,0x18,0x02,0x18,0x16,0x10,0x13,0x95,0x1d,0x01,0x20,0x10,0x19,0x95,0x1c,0x0f,0x0d,0x96,0x08,0x01,0x08,0x04,0x09,0x09,0x17,0x18,0x15,0x00,0x3f,0xc4,0x33, +0x2f,0x33,0x33,0x5d,0x33,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26, +0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x0a,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46, +0x85,0x5c,0x28,0x4d,0x0c,0x31,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x00,0x00,0x01,0x00,0x28,0xfe,0x25,0x04,0x4e,0x04,0x00,0x00,0x21,0x00,0x7e,0x40,0x45,0x20,0x0d,0x0c,0x0b,0x00,0x02,0x02,0x84,0x0b,0x21,0x14,0x0b,0x0b,0x21,0xa8,0x21,0x01,0x21,0x0b,0x06,0x84,0x07,0x07,0x0b,0x0b,0x13, +0x23,0x18,0x1a,0x1a,0x84,0x13,0x15,0x14,0x13,0x13,0x15,0x17,0x16,0x16,0x15,0xa9,0x15,0xb9,0x15,0x02,0x15,0x1f,0x13,0x01,0x13,0x00,0x21,0x15,0x95,0x18,0x0f,0x20,0x1a,0x1d,0x95,0x13,0x0d,0x0b,0x02,0x10,0x16,0x07,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33, +0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33, +0x32,0x37,0x25,0x13,0x04,0x4e,0xc5,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x10,0x06,0xfe,0x84,0x48,0x2c,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x53,0x51,0x60,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x19,0x0e,0x73,0x47,0x19,0x70,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e,0x0f,0x35, +0x05,0x73,0x03,0x16,0x00,0x01,0x00,0x5b,0xfe,0x1f,0x04,0x4e,0x04,0x00,0x00,0x2c,0x00,0x8e,0x40,0x52,0x75,0x12,0x85,0x12,0x02,0x85,0x11,0x01,0x76,0x11,0x01,0x98,0x0c,0x01,0x95,0x08,0x01,0x95,0x07,0x01,0x2b,0x1a,0x02,0x00,0x00,0x84,0x2c,0x1a,0x14,0x2c,0x2c,0x1a,0x2c,0x1a,0x06,0x84,0x17,0x17,0x1a,0x1a,0x20,0x2e,0x23,0x25, +0x25,0x84,0x20,0x22,0x14,0x20,0x20,0x22,0x22,0x20,0x0f,0x84,0x0e,0x0e,0x1f,0x20,0x01,0x20,0x00,0x2c,0x23,0x22,0x0f,0x2b,0x25,0x28,0x95,0x0e,0x0f,0x20,0x1a,0x02,0x1d,0x16,0x13,0x95,0x0a,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x33,0xce,0x32,0xed,0x32,0x32,0x3f,0xc4,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x87,0x10, +0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x05,0x06,0x23,0x22,0x35, +0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4e,0xb8,0x02,0x1a,0x9f,0x77,0xb5,0x9a,0x6f,0x61,0x12,0x9d,0x08,0x41,0x4c,0x67,0x5d,0x4a,0x61,0x19,0xfe,0x7f,0x48,0x2c,0x9f,0x08,0xa8,0xa8,0xae,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x95,0x0a,0x0c,0x32,0xb0,0x43,0xae,0x51,0x3c,0x60,0x54, +0x6c,0x19,0x39,0x36,0x40,0x23,0x2f,0x5b,0x2d,0x9f,0x4a,0x70,0x15,0xb4,0x26,0x26,0x03,0x19,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0x00,0x00,0x01,0x00,0x2f,0xfe,0x25,0x04,0x25,0x05,0xec,0x00,0x33,0x00,0x97,0x40,0x52,0x96,0x07,0x01,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x0d,0x0d,0x21, +0x35,0x29,0x84,0x28,0x28,0x24,0x17,0x16,0x2f,0x2e,0x2d,0x18,0x2d,0x18,0x18,0x84,0x21,0x24,0x14,0x21,0x21,0x24,0xe6,0x24,0x01,0xd7,0x24,0x01,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x1f,0x21,0x3f,0x21,0x02,0x21,0x16,0x10,0x13,0x95,0x2f,0x2d,0x24,0x01,0x32,0x10,0x28,0x00,0x0d,0x08,0x04,0x09,0x09,0x18,0x21,0x15,0x1d,0x1b,0x00,0x3f, +0x3f,0x33,0x33,0x2f,0x33,0x33,0x33,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30, +0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07, +0x86,0x03,0x33,0x0d,0x13,0xfe,0x54,0x97,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x14,0xb8,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e,0x0f,0x35,0x05,0x73,0xfd,0x3e,0x62,0x4f,0x09,0x1d,0xfe,0xa9,0x01,0x4b,0x18, +0x11,0x5d,0x5d,0x03,0x59,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x00,0x01,0x00,0x42,0xfe,0x1f,0x04,0x25,0x04,0x58,0x00,0x34,0x00,0xa5,0x40,0x5f,0x9a,0x23,0x01,0x76,0x1b,0x86,0x1b,0x02,0x95,0x07,0x01,0x77,0x07,0x87,0x07,0x02,0x1f,0x20,0x20,0x50,0x20,0x60,0x20,0x03,0x20,0x20,0x09,0x08, +0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x0d,0x0d,0x25,0x36,0x2d,0x2c,0x2c,0x28,0x30,0x16,0x18,0x18,0x84,0x25,0x28,0x14,0x25,0x28,0x28,0x1f,0x25,0x01,0x25,0x2c,0x28,0x2d,0x2d,0x16,0x10,0x13,0x95,0x30,0x01,0x33,0x10,0x9a,0x20,0x01,0x20,0x22,0x1f,0x1f,0x1d,0x95,0x22,0x1c,0x08,0x09,0x09,0x25,0x18,0x0d, +0x04,0x0a,0x15,0x00,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x01,0x2f,0x5d,0x33,0x87,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x11,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x32,0x2f,0x5d, +0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81, +0x04,0x15,0x63,0x53,0x90,0x3f,0x0a,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0x7a,0x23,0x5a,0x53,0xb6,0xcd,0xb2,0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x83,0x05,0x15,0x63,0x53,0x90,0x37,0x06,0x01,0x7f,0x4b,0x29,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x0c,0x31,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72, +0xfd,0xba,0xa7,0x61,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x85,0x9a,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x23,0x41,0x6b,0x15,0x00,0x00,0x02,0x00,0x59,0xff,0xe7,0x06,0xbc,0x05,0xec,0x00,0x2a,0x00,0x36,0x00,0xb6,0x40,0x64,0x20,0x84,0x1f,0x1f,0x1b,0x1a,0x2b,0x36,0x0f,0x0e,0x1b,0x0e,0x0c,0x26,0x25,0x24,0x0d,0x24, +0x0d,0x0d,0x84,0x0e,0x1b,0x14,0x0e,0x0e,0x1b,0x88,0x1b,0x01,0x79,0x1b,0x01,0x1b,0x0e,0x2d,0x30,0x30,0x84,0x15,0x18,0x14,0x15,0x18,0x78,0x18,0x01,0x69,0x18,0x01,0x08,0x18,0x01,0x18,0x15,0x0e,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0x06,0x04,0x0e,0x2d,0x2b,0x95,0x24,0x1b,0x18,0x1a,0x1a,0x0c,0x06,0x09,0x95,0x26, +0x01,0x29,0x10,0x1f,0x00,0x36,0x30,0x33,0x95,0x15,0x0f,0x12,0x16,0x03,0x04,0x0d,0x0e,0x15,0x00,0x3f,0xc4,0xd4,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x33,0xed,0x32,0x01,0x2f,0xcc,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xdc,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d, +0x10,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x10,0x87,0xc4,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x31,0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x37,0x25,0x36,0x35,0x34, +0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x05,0x05,0x06,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x06,0xbc,0x08,0xa5,0xa7,0xaa,0x03,0x33,0x0d,0x13,0xfe,0x54,0xa8,0xa6,0x16,0xfe,0x8e,0x4a,0x2a,0x9f,0x08,0x69,0x20,0xad,0x02,0x0b,0x03,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f, +0xfc,0xd0,0xfe,0x23,0x37,0x0a,0x6b,0x03,0x33,0x0e,0x12,0x01,0xa7,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfc,0xeb,0x65,0x69,0x15,0xb4,0x27,0x25,0x01,0xeb,0x94,0x2c,0x86,0x23,0x22,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x87,0x7e,0x0e,0x33,0xfd,0xf2,0x0f,0x0e,0x35,0x05, +0x72,0x00,0x00,0x01,0x00,0x3f,0xfe,0x25,0x06,0xc0,0x04,0x58,0x00,0x35,0x00,0xae,0x40,0x61,0x29,0x28,0x28,0x24,0x15,0x2c,0x01,0x06,0x2c,0x01,0x2c,0x16,0x18,0x18,0x84,0x21,0x24,0x14,0x21,0x21,0x24,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x5f,0x21,0x01,0x21,0x0e,0x06,0x31,0x16,0x31,0x02,0x31,0x0d,0x0c,0x0c,0x84,0x10,0x0e,0x14,0x10, +0x10,0x0e,0x10,0x0e,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0x06,0x50,0x04,0x80,0x04,0x02,0x04,0x0e,0x0c,0x06,0x09,0x95,0x31,0x01,0x34,0x34,0x2f,0x28,0x24,0x29,0x29,0x16,0x10,0x13,0x95,0x2c,0x2f,0x10,0x1d,0x1b,0x03,0x04,0x21,0x18,0x0d,0x0e,0x15,0x00,0x3f,0xc4,0x33,0x33,0xd4,0xc4,0x3f,0x3f,0x33,0xed,0x32,0x32, +0x33,0x2f,0x33,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x33,0x5d,0x18,0x10,0xcc,0x5d,0x32,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x5d,0x5d,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x01,0x14, +0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x06,0xc0,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0d,0x13,0xfe,0x56, +0xa5,0xa3,0xa7,0x03,0x33,0x0d,0x13,0xfe,0x57,0x87,0x18,0x01,0x14,0xa4,0x14,0x01,0x14,0x93,0x05,0x15,0x63,0x53,0x90,0x37,0x06,0x01,0x7f,0x4b,0x29,0x84,0x17,0x01,0x8c,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfc,0xeb,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x72,0xfd,0x80,0x72,0x2d,0x37,0x14, +0xfe,0x79,0x01,0x87,0x14,0x34,0x45,0x5e,0x02,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x23,0x41,0x6b,0x15,0x86,0x71,0x15,0x00,0x01,0x00,0x21,0xfe,0x1f,0x04,0x80,0x04,0x18,0x00,0x44,0x00,0xd9,0x40,0x84,0x97,0x44,0x01,0x7a,0x2c,0x01,0x69,0x2c,0x01,0x9a,0x28,0x01,0x96,0x24,0x01,0x77,0x24,0x87,0x24,0x02,0x46,0x17,0x56,0x17, +0x02,0x85,0x13,0x01,0x36,0x28,0x01,0x01,0x00,0x00,0x42,0x84,0x04,0x3d,0x84,0x09,0x09,0x04,0x04,0x15,0x83,0x2a,0x2a,0x33,0x46,0x36,0x35,0x35,0x34,0x0f,0x0e,0x38,0x37,0x32,0x67,0x32,0x77,0x32,0x02,0x37,0x32,0x32,0x84,0x33,0x34,0x14,0x33,0x33,0x34,0x47,0x34,0x77,0x34,0x97,0x34,0x03,0x34,0x33,0x20,0x22,0x84,0x1f,0x1d,0x1d, +0x4f,0x33,0x5f,0x33,0x02,0x33,0x20,0x1f,0x0f,0x11,0x32,0x33,0x33,0x26,0x2e,0x95,0x00,0x01,0x09,0x01,0x19,0x01,0x29,0x01,0x03,0x11,0x01,0x11,0x01,0x26,0x0e,0x0b,0x95,0x38,0x3b,0x10,0x34,0x95,0x37,0x0f,0x26,0x95,0x19,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0xed,0x11,0x39, +0x2f,0xc4,0x12,0x39,0xce,0x32,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x87,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x33,0x2f,0x33,0x2f,0xed,0x10,0xed,0x32,0x2f,0x33,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01, +0x07,0x27,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x36,0x33,0x32,0x17,0x16,0x15,0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x07, +0x06,0x15,0x14,0x17,0x04,0x80,0x53,0x90,0x3f,0x0a,0x13,0x03,0x33,0x0d,0x13,0xfe,0x57,0x5e,0x81,0xca,0xcd,0x74,0x62,0xb8,0x9a,0xf1,0xc7,0x78,0x6f,0x3b,0x90,0x24,0x4b,0x52,0x87,0x8e,0x6b,0x87,0x40,0x4e,0x8c,0x64,0x5f,0x70,0x2d,0xab,0xa8,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x11,0x04,0x15,0x02,0x47,0x85, +0x5c,0x28,0x4d,0x06,0x37,0x6b,0x10,0x0d,0x35,0x05,0x72,0xfe,0x3f,0x4a,0x7b,0x69,0x8f,0xfe,0xf2,0x8a,0x75,0x50,0x4b,0x71,0x53,0x52,0x37,0x38,0x27,0x3c,0x29,0x2c,0x52,0x69,0xc4,0x56,0x43,0x54,0x2a,0x31,0x56,0x03,0x11,0x8b,0x67,0x6a,0x15,0xb4,0x28,0x24,0x49,0x11,0x0b,0x17,0x0f,0x00,0x00,0x01,0x00,0x42,0xfe,0x1f,0x04,0x2e, +0x04,0x58,0x00,0x30,0x00,0xbb,0x40,0x6b,0x18,0x25,0x01,0x99,0x2c,0x01,0x88,0x2c,0x01,0x9a,0x0f,0x01,0x77,0x0a,0x87,0x0a,0x02,0x2e,0x2d,0x2d,0x29,0x0e,0x0f,0x0f,0x04,0x01,0x01,0x84,0x29,0x26,0x14,0x29,0x29,0x26,0x18,0x29,0x01,0x09,0x29,0x01,0x29,0x26,0x26,0x14,0x32,0x1c,0x1b,0x1b,0x17,0x21,0x22,0x23,0x24,0x06,0x20,0x20, +0x06,0x06,0x84,0x14,0x17,0x14,0x14,0x17,0x17,0x1f,0x14,0x01,0x14,0x2d,0x2e,0x2e,0x1b,0x1c,0x1c,0x29,0x20,0x17,0x01,0x1d,0x0f,0x7a,0x0f,0x01,0x5b,0x0f,0x6b,0x0f,0x02,0x0f,0x11,0x0e,0x0e,0x0c,0x95,0x11,0x1c,0x26,0x24,0x95,0x14,0x79,0x04,0x01,0x04,0x06,0x16,0x00,0x3f,0x33,0x5d,0x33,0xed,0x32,0x3f,0xed,0x32,0x2f,0x12,0x39, +0x5d,0x5d,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0x0e,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01, +0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x07,0x25,0x36,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x04,0x2e,0x06,0x73,0x1f,0xae,0xfd,0xfe,0x01,0x5a,0x53,0xb6,0xcd,0xb2, +0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x84,0x03,0x15,0x63,0x53,0x90,0x3f,0x07,0x85,0x0c,0x07,0x01,0xdb,0x37,0x0a,0x70,0x03,0x15,0x63,0x53,0x90,0x3f,0x03,0x87,0x20,0x1d,0xfd,0xdc,0x95,0x2b,0x7f,0x12,0x0d,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x86,0x99,0x02,0x64,0x10,0x0c,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1c,0x21,0xfd,0x86, +0x38,0x2d,0x7a,0x0e,0x33,0x02,0x25,0x0f,0x0d,0x17,0x0f,0x46,0x85,0x5c,0x28,0x00,0x00,0x02,0xff,0x8a,0xfe,0x25,0x04,0x5a,0x04,0xb5,0x00,0x15,0x00,0x18,0x00,0x95,0x40,0x5d,0x27,0x01,0x01,0x06,0x05,0x18,0x16,0x08,0x17,0x02,0x09,0x16,0x08,0x0a,0x03,0x04,0x00,0x05,0x0a,0x03,0x01,0x00,0x05,0x17,0x02,0x16,0x05,0x00,0x05,0x84, +0x08,0x16,0x14,0x08,0x08,0x16,0x17,0x03,0x0a,0x03,0x84,0x02,0x17,0x14,0x02,0x02,0x17,0x00,0x00,0x0f,0x02,0x4f,0x02,0x6f,0x02,0x7f,0x02,0xbf,0x02,0x05,0x02,0x02,0x08,0x1a,0x10,0x12,0x84,0x0f,0x0d,0x0d,0x0a,0x0a,0x07,0x0f,0x08,0x01,0x08,0x00,0x15,0x17,0x0a,0x16,0x95,0x10,0x15,0x0f,0x07,0x1b,0x08,0x05,0x03,0x02,0x15,0x00, +0x3f,0xc4,0x33,0x33,0x3f,0x3f,0xce,0xfd,0xc4,0xc4,0x12,0x39,0x01,0x2f,0x5d,0x33,0x33,0x2f,0x33,0x2f,0x33,0xed,0x32,0x11,0x12,0x39,0x2f,0x5d,0x33,0x2f,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x87,0x18,0x10,0x2b,0x87,0x7d,0xc4,0x0f,0x0f,0x0f,0x0f,0x11,0x01,0x33,0x31,0x30,0x5d,0x01,0x01,0x13,0x23,0x03,0x00,0x03,0x23,0x12,0x01,0x03, +0x23,0x22,0x37,0x36,0x37,0x33,0x06,0x15,0x14,0x33,0x21,0x05,0x21,0x17,0x04,0x5a,0xfe,0x68,0xe6,0xb5,0xa5,0xfe,0x8d,0x8e,0xc3,0xc9,0x01,0xb5,0xaa,0x86,0x96,0x06,0x02,0x1d,0xa7,0x1f,0x29,0x03,0x42,0xfe,0xf5,0xfe,0xc4,0x6b,0x03,0xd1,0xfe,0x24,0xfe,0x0b,0x01,0x67,0xfe,0x2f,0xfe,0x8f,0x01,0xcd,0x02,0x0d,0x01,0x75,0x94,0x2f, +0x7e,0x78,0x15,0x28,0x8c,0xea,0x00,0x01,0x00,0x31,0xff,0xa7,0x06,0xe6,0x04,0x58,0x00,0x37,0x00,0xb7,0x40,0x65,0x89,0x20,0x01,0x97,0x05,0x01,0x22,0x70,0x21,0x01,0x21,0x21,0x1d,0x25,0x19,0x1a,0x1a,0x84,0x1b,0x1d,0x14,0x1b,0x1d,0x89,0x1d,0x01,0x1d,0x1b,0x10,0x2b,0x2e,0x2e,0x84,0x10,0x13,0x14,0x10,0x10,0x13,0x13,0x10,0x07, +0x06,0x06,0x02,0x36,0x35,0x0a,0x02,0x00,0x00,0x84,0x37,0x0a,0x14,0x37,0x37,0x0a,0x37,0x20,0x0a,0x01,0x0a,0x10,0x00,0x37,0x0f,0x21,0x1d,0x22,0x22,0x19,0x13,0x16,0x95,0x2b,0x25,0x28,0x10,0x1a,0x1b,0x15,0x29,0x35,0x01,0x35,0x2e,0x31,0x95,0x0d,0x06,0x02,0x07,0x07,0x10,0x28,0x0a,0x01,0x0a,0x0d,0x16,0x00,0x3f,0x33,0x5d,0x33, +0x33,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x5d,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x3f,0xc4,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xdc,0x32,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x01, +0x32,0x11,0x33,0x18,0x2f,0x5d,0x33,0x31,0x30,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25, +0x36,0x37,0x13,0x06,0xe6,0xb1,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x7f,0x03,0x33,0x0e,0x13,0xfe,0x58,0xa6,0xab,0xb5,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7d,0x4b,0x2a,0x9f,0x0a,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x94,0x04,0x00,0xfc,0xb4,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21, +0x3a,0x62,0x15,0xb4,0x26,0x26,0x02,0x54,0x0e,0x0f,0x35,0x05,0x72,0xfc,0xea,0x03,0x4b,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x1e,0x30,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0xe5,0x00,0x01,0x00,0x2f,0xfe,0x25,0x04,0xbe,0x05,0xec,0x00,0x2d,0x00,0x77,0x40,0x40,0x00,0x01,0x37,0x29,0x97,0x29, +0x02,0x29,0x2b,0x84,0x06,0x04,0x04,0x15,0x2f,0x1d,0x84,0x1c,0x1c,0x18,0x22,0x23,0x0a,0x0b,0x0c,0x21,0x21,0x0c,0x0c,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x69,0x18,0x01,0x18,0x15,0x10,0x84,0x11,0x11,0x15,0x02,0x95,0x2d,0x0a,0x07,0x95,0x23,0x21,0x18,0x26,0x10,0x1c,0x00,0x0c,0x15,0x15,0x11,0x1b,0x00,0x3f,0x3f,0x33,0x3f,0x3f, +0x33,0x33,0x33,0xed,0x32,0xdc,0xed,0x01,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0x5d,0xcc,0x32,0x31,0x30,0x01,0x07,0x23,0x22,0x27,0x27,0x26,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13, +0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x17,0x16,0x17,0x17,0x16,0x33,0x04,0xbe,0x1d,0xd3,0x60,0x22,0x38,0x0d,0x2a,0x10,0x10,0xfe,0xc5,0x9a,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x14,0xb8,0x13,0x01,0x14,0xa4,0x14,0x01,0x0f,0x03,0x01,0x04,0x42,0x32,0x4c, +0x27,0x19,0x17,0x32,0x08,0x19,0x02,0x7f,0x8b,0x87,0xde,0x34,0x05,0x63,0xfd,0x2e,0x62,0x4f,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x18,0x0f,0x5d,0x5d,0x03,0x59,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x3e,0x64,0x14,0x53,0x15,0x36,0x23,0x5a,0xc7,0x1f,0x00,0x01,0x00,0x35,0xff,0xe7,0x03,0xfe,0x04,0x00,0x00,0x1b,0x00,0x58, +0x40,0x35,0x89,0x0b,0x01,0x95,0x08,0x01,0x28,0x05,0x01,0x95,0x02,0x01,0x37,0x02,0x01,0x24,0x02,0x01,0x00,0x83,0x20,0x0d,0x01,0x0d,0x0d,0x1d,0x15,0x17,0x84,0x12,0x07,0x06,0x06,0x14,0x12,0x0f,0x95,0x1a,0x15,0x0f,0x08,0x06,0x18,0x06,0x02,0x06,0x04,0x07,0x07,0x09,0x95,0x04,0x16,0x00,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f, +0xde,0xed,0x01,0x2f,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x06,0x21,0x22,0x27,0x37,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x23,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x21,0x20,0x03,0xfe,0x9c,0xa5,0xfe,0xe9,0xe9,0x88,0x65,0x81,0x9a,0xbf, +0x77,0x6b,0xbb,0xfe,0xc8,0x90,0x0e,0xa3,0x0a,0x29,0x01,0x2c,0x01,0x2f,0x02,0x41,0xfe,0xfe,0xa7,0xb1,0x8b,0x7f,0x7e,0x91,0x84,0xb5,0xde,0x94,0x1e,0x33,0x25,0x0c,0x28,0x00,0x00,0x01,0x00,0x46,0xfe,0x29,0x04,0x3c,0x05,0xec,0x00,0x33,0x00,0x94,0x40,0x4e,0x9a,0x1b,0x01,0x31,0x84,0x30,0x30,0x2c,0x2b,0x2a,0x0f,0x0e,0x0d,0x04, +0x01,0x01,0x84,0x2c,0x0d,0x14,0x2c,0x2c,0x0d,0x2c,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x15,0x35,0x21,0x24,0x24,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x1c,0x1c,0x18,0x08,0x18,0x01,0x18,0x1f,0x15,0x01,0x15,0x30,0x00,0x1c,0x1d,0x1d,0x2c,0x21,0x18,0x01,0x1e,0x0f,0x2a,0x24,0x27,0x95,0x15,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b, +0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x3f,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f, +0xed,0x31,0x30,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x04,0x3c,0x14,0xb8,0x13,0x01,0x10,0xa4, +0x10,0x01,0x14,0x03,0xfe,0x89,0x4a,0x2a,0x9f,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xac,0x97,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x04,0x66,0x5d,0x5d,0xfc,0xa7,0x58,0x59,0x11,0x15,0xfe,0xad,0x01,0x53,0x15,0x08,0x35,0x85,0x14,0x6b,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85, +0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73,0x02,0xc2,0x62,0x4f,0x08,0x1e,0x01,0x69,0xfe,0x97,0x1e,0x00,0x00,0x01,0x00,0x28,0xfe,0x25,0x04,0x4e,0x04,0x00,0x00,0x27,0x00,0x6f,0x40,0x3c,0x02,0x00,0x00,0x84,0x27,0x25,0x14,0x27,0x27,0x25,0x27,0x25,0x0f,0x1c,0x1e,0x1e,0x84,0x17,0x19,0x14,0x17,0x17,0x19,0x1b, +0x1a,0x1a,0x19,0x19,0x17,0x0f,0x0b,0x84,0x0c,0x0c,0x06,0x08,0x84,0x11,0x0f,0x00,0x27,0x19,0x95,0x1c,0x0f,0x67,0x25,0x01,0x25,0x1e,0x21,0x95,0x17,0x11,0x06,0x02,0x14,0x16,0x0c,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x5d,0x3f,0xed,0xd4,0xc4,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x10,0xcc,0x32,0x11,0x33, +0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xcd,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x03,0x06,0x07,0x06,0x07,0x07,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x04,0x4e,0x99, +0x14,0x42,0x27,0x50,0x7e,0x06,0x01,0x14,0xa4,0x14,0x01,0x01,0x53,0x4b,0x29,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03,0x33,0x0f,0x11,0x01,0x7b,0x37,0x0a,0x96,0x04,0x00,0xfd,0x26,0x5d,0x31,0x1c,0x16,0x23,0x28,0x24,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x0d,0x12,0x17,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e, +0x0f,0x35,0x05,0x6e,0x10,0x31,0x02,0xda,0x00,0x02,0x00,0x59,0xff,0xe7,0x07,0x24,0x06,0x04,0x00,0x35,0x00,0x43,0x00,0xcc,0x40,0x71,0x43,0x36,0x2e,0x2f,0x30,0x42,0x30,0x0e,0x0f,0x20,0x21,0x22,0x0d,0x86,0x22,0x01,0x65,0x22,0x01,0x0d,0x22,0x22,0x84,0x42,0x30,0x14,0x42,0x42,0x30,0x3a,0x30,0x01,0x08,0x30,0x18,0x30,0x02,0x30, +0x42,0x38,0x3b,0x3b,0x84,0x29,0x2c,0x14,0x29,0x2c,0x78,0x2c,0x01,0x6a,0x2c,0x01,0x08,0x2c,0x01,0x2c,0x29,0x42,0x03,0x00,0x84,0x07,0x17,0x15,0x15,0x84,0x1a,0x18,0x14,0x1a,0x1a,0x18,0x04,0x07,0x07,0x1a,0x1a,0x18,0x42,0x0d,0x09,0x95,0x30,0x34,0x01,0x42,0x3b,0x3e,0x95,0x29,0x22,0x26,0x16,0x17,0x18,0x15,0x38,0x36,0x95,0x2c, +0x2e,0x2e,0x20,0x1a,0x1d,0x95,0x15,0x0f,0x03,0x12,0x10,0x00,0x3f,0xce,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0xed,0x32,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xcc,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x10,0xdc,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d, +0x10,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x5d,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x07,0x03,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x23,0x13,0x36,0x35, +0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x37,0x25,0x37,0x36,0x37,0x25,0x36,0x33,0x32,0x01,0x05,0x06,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x07,0x24,0x08,0x0e,0xa8,0x14,0x03,0x33,0x0d,0x13,0xfe,0x89,0x37,0x0a,0x40,0x01,0x77,0x4a,0x2a,0x9f,0x08,0xa5,0xa7,0xaa, +0x03,0x33,0x0d,0x13,0xfe,0x54,0x6c,0x20,0xae,0xfe,0x90,0x55,0x1f,0x9f,0x08,0x69,0x20,0xad,0x02,0x12,0x25,0x1e,0xaf,0x01,0x76,0x53,0x21,0x9f,0xfc,0x68,0xfe,0x23,0x37,0x0a,0x6b,0x03,0x33,0x0f,0x13,0x01,0x6f,0x35,0x0b,0x05,0x50,0x27,0x25,0x41,0x64,0x0f,0x0e,0x35,0x05,0x63,0x0e,0x33,0xfe,0xc8,0x6b,0x15,0xb4,0x26,0x26,0xfc, +0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfe,0x02,0x95,0x2b,0x5b,0x15,0xb4,0x27,0x25,0x01,0xeb,0x94,0x2c,0x86,0xb8,0x93,0x2d,0x5f,0x15,0xfd,0x8d,0x7e,0x0e,0x33,0xfd,0xf2,0x0f,0x0e,0x35,0x05,0x5f,0x0e,0x33,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x06,0x3a,0x05,0x9a,0x00,0x25,0x00,0x70,0x40,0x4b,0x98,0x21,0x01,0x98,0x20,0x01, +0x3a,0x20,0x01,0x29,0x20,0x01,0x94,0x1c,0x01,0x86,0x1c,0x01,0x25,0x1c,0x35,0x1c,0x02,0x87,0x1b,0x97,0x1b,0x02,0x48,0x14,0x01,0x49,0x13,0x01,0x45,0x0e,0x01,0x57,0x0e,0x01,0x07,0x7e,0x00,0x08,0x01,0x08,0x03,0x0c,0x25,0x7e,0x10,0x23,0x20,0x23,0x30,0x23,0x03,0x23,0x23,0x27,0x18,0x7e,0x16,0x24,0x18,0x03,0x1e,0x91,0x11,0x13, +0x03,0x91,0x0c,0x08,0x12,0x00,0x3f,0xde,0xed,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0xfd,0x32,0x32,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x06,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14, +0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x05,0x25,0x03,0x04,0x83,0x99,0x99,0x47,0x5a,0x1a,0x66,0x8e,0xb1,0x65,0x83,0xd0,0x91,0x4e,0xa8,0x3b,0x6c,0x98,0x5d,0x5a,0x93,0x69,0x39,0xa8,0x02,0x44,0x23,0x40,0x1f,0x03,0x9f,0x9d,0x83,0x83,0x53,0x5c,0x01,0x53,0x7c,0x53,0x29,0x49,0x91,0xda,0x91,0x03,0x6d,0xfc,0x9e,0x6e,0xa6, +0x6e,0x37,0x35,0x6b,0x9f,0x6b,0x03,0x71,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x07,0x05,0xb2,0x00,0x11,0x00,0x7a,0x40,0x51,0x37,0x10,0x01,0xa8,0x10,0xb8,0x10,0x02,0x56,0x10,0x01,0x45,0x10,0x01,0x58,0x0e,0x01,0x4a,0x0e,0x01,0x26,0x05,0x01,0x97,0x05,0xa7,0x05,0x02,0x34,0x05,0x01,0x26,0x05,0x01,0x99,0x03,0x01,0x3a,0x03,0x01, +0xc0,0x08,0x01,0x08,0x00,0x7e,0x9f,0x01,0x01,0x01,0x01,0x13,0x07,0x0a,0x7e,0x8f,0x0c,0x01,0x0c,0x01,0x01,0x0f,0x08,0x91,0xaf,0x0a,0x01,0x9f,0x0a,0xdf,0x0a,0x02,0x0a,0x0a,0x0b,0x04,0x91,0x0f,0x04,0x0b,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x32,0x12,0x39,0x2f,0x5d,0xfd, +0xc6,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x04,0xd5,0xa8,0xfe,0x93,0xfe,0x92,0x03,0xb5,0xfc,0x4b,0xa8,0x02,0x17,0x02,0x14,0x03,0x2a,0x47,0x01,0xaa,0xfe,0x47,0xfe,0xa8,0x98,0xfe,0x8e,0x03,0x6d, +0x02,0x45,0xfd,0xa4,0x00,0x02,0x00,0x5e,0x00,0x00,0x05,0x70,0x05,0xb2,0x00,0x10,0x00,0x19,0x00,0x76,0x40,0x4f,0x26,0x16,0x01,0xa7,0x14,0x01,0x26,0x14,0x01,0x3a,0x12,0x4a,0x12,0x02,0x28,0x12,0x01,0xa8,0x11,0x01,0xa8,0x0d,0x01,0x55,0x0d,0x01,0x3a,0x0a,0x4a,0x0a,0x5a,0x0a,0x03,0x3b,0x06,0x4b,0x06,0x5b,0x06,0x03,0x00,0x00, +0x1b,0x0f,0x01,0x7d,0x18,0x04,0x04,0x1b,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x0f,0x18,0x91,0x01,0xaf,0x04,0x01,0x9f,0x04,0xdf,0x04,0x02,0x04,0x04,0x03,0x13,0x91,0x0b,0x04,0x03,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0x33,0xed,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x39,0x2f,0x31,0x30, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x23,0x11,0x21,0x20,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x11,0x21,0x00,0x26,0x23,0x20,0x03,0x12,0x21,0x21,0x11,0x05,0x70,0xfe,0xfc,0xa8,0xfe,0x9d,0xfe,0xfd,0xff,0x00,0x01,0x19,0x01,0x03,0xe8,0x01,0x0a,0x01,0x04,0xfe,0x54,0xaf,0xa7,0xfe,0xa2,0x0a,0x0a, +0x01,0x63,0x01,0x51,0x01,0x72,0xfe,0x8e,0x01,0x72,0x01,0x2a,0xf0,0x01,0x04,0x01,0x22,0xfe,0xde,0xfe,0xfe,0x78,0x02,0x43,0xdb,0xfe,0x6a,0xfe,0x78,0x01,0x84,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x05,0x94,0x05,0xb2,0x00,0x11,0x00,0x62,0x40,0x3e,0x96,0x0e,0x01,0x35,0x0e,0x01,0x26,0x0e,0x01,0x29,0x0c,0x01,0x98,0x0c,0x01,0x3a, +0x0c,0x01,0x29,0x0c,0x01,0x49,0x03,0x01,0x46,0x03,0x56,0x03,0x02,0xa7,0x01,0x01,0x49,0x01,0x59,0x01,0x02,0x07,0x05,0x08,0x7e,0x0a,0x0a,0x13,0x10,0x7e,0x11,0x11,0x11,0x0d,0x0a,0x06,0x91,0x08,0x08,0x02,0x0a,0x12,0x0d,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f, +0xfd,0x32,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x13,0x10,0x21,0x20,0x11,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x15,0x23,0x78,0x02,0x14,0x02,0x17,0xf1,0xf1,0xa8,0xfe,0x92,0xfe,0x93,0xa8,0x03,0x56,0x02,0x5c,0xfd,0xbb,0xfe,0x9d,0x98,0xfe,0x8e,0x03,0x62,0x01,0xb9,0xfe,0x56, +0x47,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0x07,0x05,0x9a,0x00,0x11,0x00,0x64,0x40,0x3e,0x99,0x0e,0x01,0x3a,0x0e,0x01,0x26,0x0c,0x01,0xa7,0x0c,0x01,0x95,0x0c,0x01,0x34,0x0c,0x01,0x26,0x0c,0x01,0x4a,0x03,0x01,0xa8,0x01,0x01,0x45,0x01,0x01,0x09,0x09,0x13,0x11,0x7e,0x9f,0x10,0x01,0x10,0x10,0x13,0x07,0x0a,0x7e,0x8f,0x04, +0x01,0x04,0x10,0x10,0x02,0x0a,0x91,0x08,0x08,0x02,0x05,0x03,0x0d,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x21,0x15,0x21,0x11, +0x10,0x21,0x20,0x11,0x35,0x33,0x04,0xd5,0xfd,0xec,0xfd,0xe9,0xa8,0x03,0xb5,0xfc,0x4b,0x01,0x6e,0x01,0x6d,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfe,0x8e,0x98,0xfe,0xa8,0xfe,0x47,0x01,0xaa,0x47,0x00,0x01,0x00,0x64,0xff,0x38,0x05,0x44,0x05,0xb2,0x00,0x29,0x00,0x8e,0x40,0x5c,0x55,0x1c,0x01,0x27,0x19,0x01,0x84,0x18, +0x01,0x8c,0x14,0x01,0x99,0x13,0x01,0x24,0x0d,0x01,0x15,0x0d,0x01,0x69,0x09,0x79,0x09,0x02,0x1b,0x09,0x01,0x68,0x08,0x78,0x08,0x02,0x6a,0x04,0x7a,0x04,0x02,0x38,0x04,0x48,0x04,0x02,0x91,0x1d,0x01,0x83,0x1d,0x01,0x54,0x1d,0x01,0x1d,0x00,0x1b,0x7d,0x04,0x02,0x06,0x06,0x23,0x7d,0x24,0x24,0x02,0x2b,0x10,0x7d,0x11,0x11,0x00, +0x7e,0x0f,0x02,0x01,0x02,0x11,0x11,0x04,0x0b,0x91,0x16,0x04,0x1d,0x04,0x91,0x00,0x24,0x02,0x00,0x12,0x00,0x3f,0xdd,0xc4,0x10,0xfd,0xc4,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x33,0x2f,0x12,0x39,0xed,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x21,0x15,0x23,0x11,0x21,0x24,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x01,0x0e,0xaa,0x01,0x99,0x02,0x6f,0x36,0x69,0x9b,0x66,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd8,0x83,0x88,0xdc,0x99,0x53, +0xfe,0x29,0xc5,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xc8,0x01,0x60,0xe6,0x01,0xbb,0x62,0xaf,0x84,0x4d,0x3e,0x6f,0x9b,0x5d,0x81,0xd3,0x96,0x52,0x5b,0xa3,0xe4,0x88,0xfe,0x3d,0xed,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0x00,0x00,0x01,0x00,0xbc,0xff,0x38,0x04,0x83,0x05,0x9a,0x00,0x13,0x00,0x2d,0x40,0x17,0x12,0x12, +0x06,0x7e,0x07,0x07,0x0d,0x15,0x10,0x13,0x7e,0x0d,0x12,0x91,0x10,0x10,0x0f,0x03,0x07,0x00,0x91,0x0d,0x12,0x00,0x3f,0xed,0xce,0x3f,0x3f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x25,0x21,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x01,0x64,0x01,0xb3,0x55, +0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xfd,0xca,0xa8,0x03,0x1f,0xfc,0xe1,0x98,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0x05,0x9a,0xfe,0x8e,0x98,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x07,0x05,0xb2,0x00,0x0f,0x00,0x44,0x40,0x29,0xa8,0x0e,0x01,0x45,0x0e,0x01,0x4a,0x0c,0x01,0x25,0x05,0x35,0x05,0x02,0x2a,0x03,0x3a,0x03, +0x02,0x08,0x08,0x11,0x0f,0x7e,0x01,0x01,0x11,0x07,0x7e,0x0b,0x01,0x01,0x0a,0x04,0x91,0x0d,0x04,0x07,0x91,0x0a,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x21,0x15,0x21,0x11,0x10,0x21,0x20,0x11, +0x04,0xd5,0xa8,0xfe,0x93,0xfe,0x92,0x03,0xb5,0xfb,0xa3,0x02,0x17,0x02,0x14,0x03,0x2a,0x47,0x01,0xaa,0xfe,0x47,0xfd,0x36,0x98,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x00,0x02,0x00,0xaa,0xff,0xe8,0x06,0x2b,0x05,0xb2,0x00,0x2c,0x00,0x3d,0x00,0xa0,0x40,0x6c,0x6a,0x3b,0x01,0x67,0x37,0x01,0x64,0x31,0x01,0x56,0x31,0x01,0x79,0x29, +0x01,0x78,0x28,0x01,0x99,0x24,0x01,0x88,0x24,0x01,0x7a,0x24,0x01,0x8a,0x23,0x9a,0x23,0x02,0x7b,0x23,0x01,0x86,0x1f,0x96,0x1f,0x02,0x75,0x1f,0x01,0x76,0x1e,0x01,0x46,0x14,0x01,0x49,0x10,0x01,0x97,0x08,0x01,0x86,0x07,0x96,0x07,0x02,0x25,0x07,0x35,0x07,0x02,0x16,0x07,0x01,0x98,0x03,0x01,0x2a,0x03,0x3a,0x03,0x02,0x1b,0x1a, +0x18,0x7e,0x2c,0x2e,0x2e,0x0c,0x3f,0x34,0x7e,0x26,0x0a,0x7e,0x0c,0x1b,0x2e,0x91,0x2c,0x18,0x18,0x39,0x05,0x91,0x12,0x04,0x39,0x91,0x21,0x21,0x0c,0x12,0x00,0x3f,0x33,0x2f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x01,0x2f,0xfd,0xde,0xed,0x11,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x21,0x15,0x21,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x35,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02, +0x17,0x32,0x3e,0x02,0x04,0x7d,0x3a,0x6b,0x95,0x5b,0x5c,0x95,0x6b,0x3a,0xa8,0x4f,0x95,0xd5,0x86,0x85,0xd4,0x94,0x4f,0x01,0x06,0xfe,0xfa,0x35,0x63,0x90,0x5b,0x53,0x89,0x62,0x35,0x3c,0x6d,0x97,0x5c,0xb2,0xb2,0x36,0x58,0x3d,0x21,0x18,0x31,0x49,0x31,0x34,0x52,0x38,0x1d,0x03,0x71,0x6a,0xa0,0x6b,0x35,0x37,0x6e,0xa6,0x6e,0xfc, +0x9e,0x03,0x6d,0x91,0xda,0x91,0x49,0x4b,0x97,0xe3,0x97,0x38,0x98,0xee,0x65,0xa0,0x6f,0x3c,0x3b,0x6a,0x92,0x56,0x5e,0x9d,0x70,0x3e,0xfe,0x7a,0xee,0x2a,0x49,0x64,0x3a,0x33,0x58,0x41,0x27,0x03,0x29,0x4b,0x67,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x70,0x05,0x9a,0x00,0x10,0x00,0x19,0x00,0x6e,0x40,0x48,0x3a,0x18,0x4a,0x18, +0x9a,0x18,0x03,0x28,0x18,0x01,0x96,0x16,0x01,0x34,0x16,0x44,0x16,0x02,0x26,0x16,0x01,0x96,0x14,0x01,0x34,0x14,0x44,0x14,0x02,0x26,0x14,0x01,0x59,0x09,0x01,0x55,0x04,0x01,0x00,0x00,0x1b,0x0f,0x01,0x7e,0x0c,0x9f,0x11,0x01,0x11,0x11,0x1b,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x12,0x01,0x91,0x0f,0x0c,0x0c,0x05,0x0d,0x03, +0x17,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0x33,0xed,0x32,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x14,0x00,0x23,0x20,0x00,0x11,0x34,0x00,0x21,0x21,0x11,0x33,0x11,0x21,0x01,0x11,0x21,0x20,0x03,0x12,0x21, +0x32,0x36,0x05,0x70,0xfe,0xfc,0xfe,0xf6,0xe8,0xfe,0xfd,0xfe,0xe7,0x01,0x00,0x01,0x03,0x01,0x63,0xa8,0x01,0x04,0xfe,0x54,0xfe,0xaf,0xfe,0x9d,0x0a,0x0a,0x01,0x5e,0xa7,0xaf,0x03,0x90,0xfe,0x78,0xfe,0xfe,0xde,0x01,0x22,0x01,0x04,0xf0,0x01,0x2a,0x01,0x72,0xfe,0x8e,0xfd,0xe4,0x01,0x84,0xfe,0x78,0xfe,0x6a,0xdb,0x00,0x00,0x01, +0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x1b,0x00,0x5e,0x40,0x3c,0x9c,0x0a,0x01,0x8a,0x0a,0x01,0x89,0x09,0x99,0x09,0x02,0x98,0x05,0x01,0x39,0x05,0x01,0x89,0x04,0x01,0x4b,0x04,0x01,0x39,0x04,0x01,0x2b,0x04,0x01,0x18,0x04,0x01,0x1b,0x7e,0x01,0x01,0x0e,0x1d,0x11,0x0c,0x7e,0x0e,0x36,0x11,0x01,0x15,0x11,0x25,0x11,0x02, +0x11,0x07,0x91,0x16,0x16,0x10,0x03,0x01,0x0d,0x12,0x00,0x3f,0xce,0x3f,0x39,0x2f,0xed,0x33,0x5d,0x5d,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02, +0x15,0x04,0xd5,0xa8,0x2b,0x57,0x86,0x5b,0x5c,0x8c,0x5f,0x31,0xa8,0xa8,0x1d,0x4b,0x5e,0x71,0x42,0x85,0xc5,0x81,0x3f,0x01,0x3c,0xe7,0x6a,0xaa,0x75,0x3f,0x41,0x79,0xaf,0x6e,0xfd,0xec,0x05,0x9a,0xfe,0x45,0x21,0x3c,0x2c,0x1a,0x55,0xa2,0xec,0x97,0x00,0x01,0x00,0xbc,0xff,0x38,0x04,0x08,0x05,0x9a,0x00,0x0f,0x00,0x1f,0x40,0x0f, +0x09,0x7e,0x0a,0x0a,0x11,0x03,0x7e,0x00,0x02,0x03,0x0a,0x03,0x91,0x00,0x12,0x00,0x3f,0xed,0xce,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0xbc,0xa8,0x01,0x6a,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0x05,0x9a,0xfa,0xfe,0x37,0x60,0x80,0x49, +0x2b,0x49,0x36,0x1e,0x00,0x01,0x00,0xbc,0xff,0xe8,0x05,0xc3,0x05,0x9a,0x00,0x1f,0x00,0x5a,0x40,0x38,0x94,0x1e,0x01,0x6a,0x15,0x7a,0x15,0x8a,0x15,0x03,0x59,0x15,0x01,0x84,0x11,0x01,0x65,0x11,0x75,0x11,0x02,0x56,0x11,0x01,0x9a,0x02,0x01,0x0d,0x7e,0x05,0x1a,0x7e,0x18,0x05,0x18,0x05,0x18,0x09,0x21,0x0c,0x07,0x7e,0x09,0x19, +0x06,0x91,0x0d,0x0f,0x0b,0x03,0x13,0x91,0x00,0x00,0x08,0x12,0x00,0x3f,0x33,0x2f,0xed,0x3f,0x3f,0xed,0xc4,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x35,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e, +0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x04,0x23,0x5d,0x99,0x6c,0x3b,0xfe,0xde,0xa8,0xa8,0x01,0xc5,0x27,0x43,0x5b,0x35,0x35,0x5d,0x44,0x27,0xa3,0x3b,0x6d,0x9a,0x18,0x36,0x6d,0xa4,0x6d,0x01,0xcc,0xfc,0x98,0x05,0x9a,0xfe,0x66,0xfd,0xb6,0x51,0x7a,0x51,0x28,0x28,0x51,0x7a,0x51,0x02,0x4a,0xfd,0x9c,0x6d,0xa4,0x6d,0x36,0x00, +0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x04,0x05,0xb2,0x00,0x1a,0x00,0x25,0x00,0xf0,0x40,0x33,0x76,0x21,0x01,0x79,0x25,0x01,0x26,0x22,0x76,0x22,0x02,0x3a,0x1f,0x01,0x86,0x1d,0x01,0x39,0x1d,0x01,0x45,0x17,0x55,0x17,0x02,0x05,0x17,0x15,0x17,0x25,0x17,0x03,0x98,0x04,0x01,0x38,0x02,0x88,0x02,0x02,0x89,0x1c,0x01,0x96,0x16,0xa6, +0x16,0xe6,0x16,0x03,0x15,0xb8,0xff,0xe0,0xb3,0x2e,0x31,0x48,0x15,0xb8,0xff,0xc0,0x40,0x6e,0x25,0x28,0x48,0x0c,0x15,0x0a,0x11,0x18,0x7d,0x6b,0x05,0x7b,0x05,0x8b,0x05,0x03,0x08,0x05,0x18,0x05,0x02,0x6b,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x29,0x1e,0x03,0x1e,0x05,0x07,0x10,0x1b,0x20,0x1b,0x30,0x1b,0x03,0x1b,0x1b,0x03,0x27,0x0a, +0x7e,0x07,0x20,0x7d,0x0f,0x03,0x1f,0x03,0x02,0x03,0x1e,0x18,0x1a,0x1f,0x48,0x09,0x1e,0x01,0xe9,0x1e,0xf9,0x1e,0x02,0x1e,0x05,0x07,0x91,0x06,0x15,0x16,0x15,0x26,0x15,0x03,0xb9,0x15,0x01,0x15,0xb9,0x0c,0x01,0x0c,0xb0,0x0a,0xc0,0x0a,0xd0,0x0a,0x03,0x0a,0x0a,0x08,0x11,0x13,0x91,0x10,0x0e,0x04,0x08,0x03,0x23,0x91,0x00,0x13, +0x00,0x3f,0xed,0x3f,0x3f,0x33,0xed,0x32,0x10,0xcd,0x2f,0x5d,0x32,0x5d,0x32,0x71,0x72,0xed,0x32,0x32,0x5d,0x71,0x2b,0x01,0x2f,0x5d,0xed,0xd4,0xed,0x11,0x12,0x39,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0xfd,0xc4,0x12,0x39,0x39,0x2b,0x2b,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x05,0x20,0x00,0x11,0x10,0x37,0x26,0x27,0x11,0x33,0x15,0x16,0x17,0x36,0x21,0x32,0x17,0x15,0x26,0x23,0x26,0x07,0x16,0x00,0x11,0x10,0x00,0x13,0x10,0x24,0x27,0x06,0x11,0x14,0x16,0x33,0x36,0x36,0x02,0xc0,0xfe,0xf4,0xfe,0xaa,0xd4,0x63,0x71,0x9c,0x79,0x6c,0xed,0x01,0x42,0x86,0x70,0x7f,0x8a,0xad,0x84,0xe7,0x01,0x53,0xfe,0xbb, +0x95,0xfe,0x8e,0xe8,0xec,0xf7,0xb8,0xbd,0xda,0x18,0x01,0x4a,0x01,0x24,0x01,0x45,0xec,0x06,0x01,0x01,0x0c,0x79,0x01,0x0b,0x9d,0x10,0xb0,0x28,0x02,0x30,0x27,0xfe,0xd2,0xfe,0xde,0xfe,0xce,0xfe,0xa5,0x02,0x83,0x01,0x0c,0xef,0x0e,0xcb,0xfe,0xb9,0xea,0xf9,0x01,0xff,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x17, +0x00,0x49,0x40,0x2d,0x4b,0x16,0x01,0x95,0x08,0x01,0x84,0x08,0x01,0x34,0x03,0x01,0x25,0x03,0x01,0x0c,0x7e,0x0a,0x0f,0x0f,0x19,0x01,0x7e,0x17,0x8e,0x0f,0x01,0x49,0x0f,0x01,0x2a,0x0f,0x3a,0x0f,0x02,0x0f,0x05,0x91,0x14,0x0e,0x12,0x0b,0x0f,0x01,0x03,0x00,0x3f,0x3f,0x3f,0xde,0xed,0x33,0x5d,0x5d,0x5d,0x01,0x2f,0xed,0x12,0x39, +0x2f,0xc4,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x11,0x23,0x11,0x0e,0x03,0x23,0x20,0x02,0x11,0xaa,0xa8,0xab,0xb7,0x51,0x8b,0x64,0x39,0xa8,0xa8,0x1b,0x50,0x63,0x71,0x3b,0xfe,0xf6,0xff,0x05,0x9a,0xfd,0xa1,0xd6,0xd4,0x34,0x6c,0xa6,0x73,0xb6,0xfc,0x00,0x01, +0x7f,0x1c,0x30,0x24,0x15,0x01,0x2e,0x01,0x2e,0x00,0x00,0x01,0x00,0x21,0xff,0x68,0x04,0x50,0x06,0x02,0x00,0x0d,0x00,0xa1,0x40,0x5e,0xa6,0x08,0xb6,0x08,0x02,0xa9,0x04,0x01,0xb8,0x04,0x01,0x08,0x07,0x08,0x09,0x07,0x7e,0x06,0x05,0x14,0x06,0x06,0x05,0x06,0x05,0x0b,0x04,0x03,0x04,0x7e,0x0a,0x0b,0x14,0x0a,0x04,0x05,0x0a,0x0b, +0x08,0x09,0x04,0x05,0x08,0x05,0x04,0x7e,0x09,0x08,0x14,0x09,0x08,0x04,0x09,0x09,0x0a,0x61,0x05,0x01,0xc1,0x05,0xd1,0x05,0xe1,0x05,0x03,0x05,0x0a,0x05,0x0a,0x03,0x0d,0x7e,0x00,0x00,0x0f,0x03,0x86,0x0a,0x01,0x48,0x05,0x01,0x07,0x05,0x09,0x0a,0x04,0x06,0x0b,0x91,0x03,0x00,0x02,0x12,0x00,0x3f,0xce,0x33,0xed,0x2f,0x17,0x39, +0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x11,0x33,0x10,0xc1,0x87,0x04,0x2b,0x10,0x01,0xc1,0x87,0x04,0x7d,0x10,0xc4,0x87,0x08,0x18,0x10,0x2b,0x87,0x05,0x7d,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x08,0x7d,0x10,0xc4,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x05,0x35,0x21,0x35,0x01,0x25,0x13, +0x17,0x07,0x05,0x15,0x01,0x21,0x11,0x03,0xa8,0xfc,0x79,0x02,0xb3,0xfe,0x8c,0x8c,0x95,0x46,0x01,0x6b,0xfd,0x76,0x03,0x34,0x98,0x98,0x2f,0x04,0x03,0xc2,0x01,0x0e,0x4e,0x86,0xba,0x1d,0xfc,0x41,0xfe,0xd0,0x00,0x02,0x00,0x5e,0xff,0xc6,0x05,0x38,0x05,0xb2,0x00,0x35,0x00,0x45,0x00,0xba,0x40,0x7a,0x39,0x34,0x49,0x34,0x59,0x34, +0x03,0x84,0x1f,0x01,0x9b,0x1a,0x01,0x86,0x14,0x01,0x7a,0x10,0x01,0x28,0x10,0x01,0x69,0x0f,0x79,0x0f,0x02,0x56,0x09,0x01,0x37,0x09,0x47,0x09,0x02,0x9d,0x2b,0x01,0x7c,0x2b,0x8c,0x2b,0x02,0x2b,0x2a,0x2a,0x91,0x25,0x01,0x64,0x25,0x74,0x25,0x84,0x25,0x03,0x30,0x25,0x36,0x22,0x7e,0x9e,0x3c,0x01,0x8d,0x3c,0x01,0x7e,0x3c,0x01, +0x6b,0x3c,0x01,0x3c,0x0a,0x36,0x10,0x0d,0x20,0x0d,0x02,0x0d,0x0d,0x47,0x36,0x7e,0x00,0x17,0x7e,0x18,0x18,0x0f,0x00,0x1f,0x00,0x02,0x00,0x3c,0x25,0x39,0x41,0x18,0x18,0x12,0x30,0x0a,0x33,0x05,0x91,0x41,0x39,0x91,0x33,0x2a,0x2b,0x2b,0x33,0x13,0x12,0x91,0x1d,0x04,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x33,0x10,0xfd,0xde,0xed,0x11, +0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x39,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x39,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x35,0x34,0x2e,0x02, +0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x1e,0x03,0x17,0x07,0x2e,0x03,0x27,0x06,0x04,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x36,0x36,0x37,0x2e,0x03,0x23,0x22,0x0e,0x02,0x5e,0x05,0x31,0x5f,0x8e,0x61,0x3f,0x7c,0x78,0x73,0x35,0x41,0x48,0x34,0x67,0x9c,0x69,0x63,0x98,0x67,0x36,0xb0, +0x54,0x99,0xd7,0x84,0x89,0xdb,0x9a,0x52,0x5d,0x53,0x14,0x40,0x45,0x42,0x17,0x73,0x18,0x42,0x46,0x43,0x18,0x74,0xfe,0xff,0x91,0xa9,0xb3,0xa6,0x5b,0x5b,0x6d,0xb5,0x51,0x23,0x4e,0x57,0x5d,0x30,0x38,0x50,0x34,0x18,0xf8,0x3f,0x67,0x49,0x29,0x18,0x2a,0x38,0x1f,0x4f,0xcb,0x8a,0x63,0xb8,0x8f,0x56,0x3f,0x70,0x9d,0x5d,0x81,0xd4, +0x97,0x54,0x63,0xae,0xed,0x8a,0xa7,0xfe,0xfc,0x64,0x0f,0x37,0x3e,0x3c,0x13,0x82,0x16,0x3f,0x41,0x3a,0x12,0x57,0x69,0x92,0x7c,0x29,0x3d,0x01,0x41,0x33,0x12,0x23,0x1c,0x12,0x12,0x1f,0x29,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x05,0x94,0x05,0xb2,0x00,0x0f,0x00,0x56,0x40,0x38,0x96,0x0c,0x01,0x24,0x0c,0x34,0x0c,0x02,0x98,0x0a, +0x01,0x2a,0x0a,0x3a,0x0a,0x02,0xa8,0x03,0x01,0x57,0x03,0x01,0x45,0x03,0x01,0xa7,0x01,0x01,0x49,0x01,0x59,0x01,0x02,0x06,0x05,0x7e,0xc0,0x09,0x01,0x09,0x09,0x11,0x0e,0x7e,0x0f,0x0e,0x0e,0x02,0x05,0x91,0x08,0x12,0x0b,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xcd,0x31, +0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x10,0x21,0x20,0x11,0x11,0x33,0x15,0x21,0x11,0x10,0x21,0x20,0x11,0x15,0x23,0x78,0x02,0x14,0x02,0x17,0xf1,0xfe,0x67,0xfe,0x92,0xfe,0x93,0xa8,0x03,0x56,0x02,0x5c,0xfd,0xbb,0xfd,0x2b,0x98,0x03,0x62,0x01,0xb9,0xfe,0x56,0x97,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x05,0x3a, +0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x7d,0x40,0x51,0x78,0x17,0x01,0x36,0x12,0x01,0x07,0x12,0x17,0x12,0x02,0x44,0x11,0x84,0x11,0x94,0x11,0x03,0x29,0x03,0x39,0x03,0x02,0x19,0x10,0x14,0x4a,0x04,0x7a,0x04,0x8a,0x04,0x9a,0x04,0x04,0x04,0x09,0x01,0x0d,0x0d,0x00,0x7e,0x15,0x15,0x1d,0x14,0x7e,0x01,0x06,0x06,0x01,0x19,0x20,0x24, +0x2a,0x48,0x19,0x20,0x17,0x1e,0x48,0x19,0x04,0x06,0x91,0x10,0x09,0xd0,0x07,0x01,0x07,0x07,0x01,0x0d,0x91,0x0c,0x03,0x14,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2b,0x2b,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x12,0x39,0x39,0x5d,0x12,0x39,0x39,0x31,0x30, +0x71,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x10,0x37,0x26,0x23,0x35,0x20,0x17,0x36,0x21,0x33,0x15,0x23,0x22,0x07,0x04,0x00,0x11,0x01,0x21,0x11,0x10,0x24,0x27,0x06,0x11,0x05,0x3a,0xfb,0x82,0xca,0x59,0xcb,0x01,0x47,0x76,0xf7,0x01,0x56,0xce,0xe1,0xd4,0xa9,0x01,0x07,0x01,0x57,0xfc,0x2a,0x03,0x2e,0xfe,0xa6,0xfd,0xd7,0x02,0x10, +0x01,0x45,0xe7,0x07,0x9b,0x0f,0xcb,0x98,0x53,0x2c,0xfe,0xde,0xfe,0xce,0xfe,0x69,0x01,0x8d,0x01,0x0f,0xe4,0x18,0xd3,0xfe,0xbf,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x05,0x9a,0x00,0x0f,0x00,0x57,0x40,0x39,0x29,0x0e,0x39,0x0e,0x02,0x96,0x0c,0x01,0x25,0x0c,0x35,0x0c,0x02,0x4a,0x07,0x5a,0x07,0xda,0x07,0x03,0xc8,0x05, +0x01,0xa9,0x05,0x01,0x46,0x05,0x01,0xb7,0x0c,0x01,0x02,0x03,0x7e,0x30,0x0f,0x01,0x0f,0x0f,0x11,0x0a,0x7e,0xb0,0x08,0x01,0x08,0x09,0x03,0x0d,0x91,0x06,0x13,0x03,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01, +0x21,0x15,0x23,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x04,0x2d,0x01,0xa3,0xfb,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0x05,0x9a,0x98,0xfd,0x42,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x4d,0x05,0xb2,0x00,0x3f,0x00,0x9b,0x40,0x63,0x49,0x3e, +0x01,0x33,0x10,0x10,0x13,0x48,0x6a,0x33,0x01,0x57,0x2d,0x01,0x67,0x29,0x77,0x29,0x02,0x56,0x29,0x01,0x46,0x24,0x56,0x24,0x02,0x84,0x20,0x01,0x87,0x1f,0x01,0xaa,0x1a,0x01,0x98,0x1a,0x01,0x7a,0x1a,0x8a,0x1a,0x02,0x63,0x14,0x01,0x79,0x10,0x01,0x6b,0x10,0x01,0x79,0x0f,0x01,0x25,0x06,0x22,0x7e,0x0d,0x0d,0x2b,0x7e,0x00,0x00, +0x18,0x41,0x36,0x7e,0x35,0x35,0x18,0x06,0x06,0x17,0x7e,0x18,0x26,0x25,0x06,0x18,0x18,0x12,0x08,0x91,0x06,0x36,0x06,0x36,0x12,0x3b,0x91,0x30,0x13,0x12,0x91,0x1d,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x01,0x2f,0xed,0x33,0x2f,0x11,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed, +0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x01,0x34,0x2e,0x02,0x23,0x21,0x35,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22, +0x2e,0x02,0x27,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xa5,0x3b,0x70,0xa3,0x69,0xfe,0xac,0x01,0x4e,0x5e,0x93,0x60,0x30,0x26,0x45,0x60,0x3a,0x34,0x61,0x4a,0x2c,0xa6,0x4b,0x79,0x9c,0x51,0x51,0x9a,0x79,0x49,0x9a,0x90,0x48,0x84,0x62,0x38,0x55,0x8f,0xba,0x64,0x5c,0xb0,0x8a,0x55,0x02,0xa6,0x30,0x57,0x7c,0x4b,0x41,0x7a, +0x5f,0x39,0x01,0x87,0x46,0x69,0x47,0x23,0x8b,0x21,0x42,0x63,0x42,0x3d,0x5c,0x3d,0x1e,0x1b,0x36,0x50,0x34,0x58,0x84,0x58,0x2c,0x2d,0x57,0x7f,0x53,0x8e,0xb6,0x28,0x04,0x05,0x34,0x5a,0x7b,0x48,0x67,0xa0,0x6e,0x39,0x27,0x54,0x86,0x60,0x34,0x50,0x37,0x1c,0x24,0x47,0x67,0x00,0x00,0x01,0xff,0xf6,0xff,0xe8,0x05,0x1c,0x05,0x9a, +0x00,0x0f,0x00,0x54,0x40,0x38,0x29,0x0c,0x39,0x0c,0x49,0x0c,0x99,0x0c,0x04,0x97,0x0a,0x01,0x25,0x0a,0x35,0x0a,0x45,0x0a,0x03,0x46,0x03,0x56,0x03,0x02,0xd7,0x03,0x01,0x58,0x03,0x01,0x56,0x01,0x01,0x0f,0x7e,0x10,0x0e,0x01,0x0e,0x0e,0x11,0x08,0x7e,0x06,0x04,0x0e,0x0e,0x02,0x05,0x91,0x07,0x03,0x0b,0x91,0x02,0x13,0x00,0x3f, +0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xce,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x23,0x35,0x21,0x11,0x10,0x21,0x20,0x11,0x35,0x33,0x05,0x1c,0xfd,0xec,0xfd,0xe9,0xfb,0x01,0xa3,0x01,0x6e,0x01,0x6d,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0x98,0xfc, +0x9e,0xfe,0x47,0x01,0xaa,0xab,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xf6,0x05,0xba,0x00,0x23,0x00,0xa4,0x40,0x69,0x97,0x22,0x01,0x98,0x1e,0x01,0x99,0x19,0x01,0x38,0x19,0x48,0x19,0x02,0x9b,0x18,0x01,0x94,0x14,0x01,0x85,0x09,0x01,0x76,0x09,0x01,0x27,0x09,0x01,0x87,0x08,0x01,0x84,0x02,0x01,0x55,0x02,0x01,0x47,0x02,0x01,0x01, +0x20,0x21,0x23,0x21,0x00,0x21,0x7e,0x22,0x23,0x14,0x22,0x22,0x23,0x00,0x9f,0x20,0x01,0x8c,0x20,0x01,0x71,0x01,0x01,0x64,0x01,0x01,0x20,0x01,0x21,0x23,0x23,0x11,0x7e,0x10,0x10,0x20,0x10,0x02,0x10,0x10,0x1b,0x25,0x22,0x21,0x21,0x06,0x7e,0x0f,0x1b,0x1f,0x1b,0x02,0x1b,0x00,0x11,0x00,0x11,0x22,0x04,0x0b,0x91,0x16,0x13,0x00, +0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x33,0x87,0x04,0x10,0x2b,0x87,0x7d,0xc4,0x10,0xc4,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x25,0x0e,0x03,0x15,0x14,0x1e,0x02, +0x33,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x25,0x37,0x01,0x04,0xb8,0xfe,0x92,0x88,0xd4,0x93,0x4d,0x37,0x6a,0x9b,0x64,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd7,0x84,0x86,0xdb,0x9b,0x54,0x43,0x7e,0xb6,0x73,0xfe,0x8b,0x27,0x03,0xe5,0x04,0x14,0x66,0x15,0x6b,0x99,0xbd,0x69,0x61, +0xa3,0x76,0x42,0x3f,0x70,0x9d,0x5d,0x7d,0xd3,0x9a,0x56,0x4f,0x96,0xd7,0x88,0x6c,0xcf,0xae,0x84,0x22,0x6c,0x93,0xfe,0xed,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x25,0x05,0xb2,0x00,0x19,0x00,0x3f,0x40,0x28,0x3b,0x12,0x4b,0x12,0x02,0x86,0x0a,0x96,0x0a,0x02,0x95,0x09,0x01,0x86,0x09,0x01,0x25,0x09,0x01,0x99,0x05,0x01,0x2a,0x05, +0x01,0x19,0x7e,0x01,0x01,0x1b,0x0c,0x7e,0x0e,0x07,0x91,0x14,0x04,0x01,0x0d,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x05,0x25,0xa8,0x39,0x69, +0x93,0x5a,0x5d,0x98,0x6c,0x3b,0xa8,0x4e,0x91,0xd0,0x83,0x88,0xd9,0x97,0x51,0x03,0x71,0x6a,0xa0,0x6b,0x35,0x37,0x6e,0xa6,0x6e,0xfc,0x9e,0x03,0x6d,0x91,0xda,0x91,0x49,0x4b,0x97,0xe3,0x97,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x04,0xf6,0x05,0xb2,0x00,0x23,0x00,0x9a,0x40,0x63,0x46,0x1e,0x56,0x1e,0x96,0x1e,0x03,0x93,0x19,0x01, +0x45,0x18,0x01,0x9c,0x14,0x01,0x38,0x14,0x01,0x86,0x0d,0x01,0x89,0x09,0x01,0x3a,0x09,0x01,0x01,0x20,0x21,0x23,0x21,0x00,0x21,0x7e,0x22,0x23,0x14,0x22,0x22,0x23,0x99,0x22,0x01,0x22,0x21,0x21,0x81,0x20,0x91,0x20,0x02,0x34,0x20,0x74,0x20,0x02,0x20,0x23,0x1b,0x7e,0x6d,0x01,0x01,0x01,0x23,0x10,0x06,0x20,0x06,0x30,0x06,0x03, +0x06,0x06,0x11,0x25,0x00,0x23,0x23,0x10,0x7e,0x0f,0x11,0x1f,0x11,0x02,0x11,0x00,0x10,0x00,0x10,0x22,0x12,0x0b,0x91,0x16,0x04,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0x12,0x39,0x5d,0xed,0x11,0x39,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x87,0x04,0x10,0x2b,0x87,0x7d,0xc4, +0x10,0xc4,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x05,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x05,0x07,0x01,0x9c,0x01,0x6e,0x88,0xd4,0x93,0x4d,0x37,0x6a,0x9b,0x64,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd7,0x84,0x86, +0xdb,0x9b,0x54,0x43,0x7e,0xb6,0x73,0x01,0x75,0x27,0xfc,0x1b,0x01,0xa6,0x66,0x15,0x65,0x91,0xb8,0x69,0x61,0x9f,0x71,0x3e,0x3f,0x70,0x9d,0x5d,0x7d,0xd3,0x9a,0x56,0x4b,0x91,0xd3,0x88,0x6c,0xc9,0xa7,0x7e,0x22,0x6c,0x93,0x01,0x13,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0x89,0x05,0xb2,0x00,0x1c,0x00,0x58,0x40,0x38,0x7a,0x19, +0x01,0x68,0x19,0x01,0x1a,0x19,0x01,0x96,0x11,0x01,0x85,0x11,0x01,0x27,0x11,0x01,0x25,0x10,0x01,0x2a,0x0c,0x01,0x8b,0x0b,0x9b,0x0b,0x02,0x29,0x0b,0x01,0x16,0x03,0x01,0x13,0x7e,0x15,0x00,0x06,0x7e,0x08,0x1b,0x7e,0x00,0x08,0x08,0x01,0x00,0x15,0x12,0x1b,0x01,0x91,0x0e,0x04,0x00,0x3f,0xed,0x32,0x3f,0xce,0x11,0x39,0x2f,0x01, +0x2f,0xed,0xde,0xed,0x10,0xde,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x11,0x0e,0x03,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x11,0x02,0xaf,0x52,0x8e,0x69,0x3c,0xa8,0x5b,0xa8,0xed,0x92,0x92,0xee,0xa9,0x5c,0xa8,0x3c,0x6a,0x90,0x54, +0x01,0x59,0x03,0xbc,0x0b,0x47,0x74,0x9f,0x62,0x74,0x7f,0x91,0xe0,0x99,0x4f,0x52,0x9e,0xe9,0x97,0xfc,0xbe,0x03,0x5d,0x5f,0x9a,0x71,0x45,0x0a,0xfc,0x43,0x00,0x02,0x00,0x64,0xff,0x38,0x05,0x44,0x05,0xb2,0x00,0x28,0x00,0x3a,0x00,0xb7,0x40,0x79,0x95,0x37,0x01,0x47,0x37,0x01,0x93,0x36,0x01,0x94,0x33,0x01,0x55,0x32,0x95,0x32, +0x02,0x45,0x2d,0x01,0x36,0x2d,0x01,0x2b,0x2b,0x8b,0x2b,0x02,0x68,0x2a,0x78,0x2a,0x02,0x94,0x27,0x01,0x94,0x24,0x01,0x36,0x24,0x01,0x89,0x1e,0x01,0x8a,0x1d,0x01,0x8a,0x1b,0x01,0x5a,0x19,0x01,0x80,0x28,0x90,0x28,0x02,0x61,0x28,0x71,0x28,0x02,0x50,0x28,0x01,0x04,0x28,0x01,0x28,0x0c,0x39,0x7e,0x16,0x4f,0x10,0x01,0x3b,0x10, +0x01,0x29,0x10,0x01,0x10,0x0e,0x16,0x05,0x7e,0x06,0x06,0x26,0x7e,0x29,0x16,0x29,0x16,0x29,0x20,0x3c,0x0c,0x7e,0x0e,0x0e,0x2f,0x7e,0x20,0x39,0x10,0x2c,0x91,0x23,0x04,0x28,0x10,0x91,0x0c,0x06,0x0e,0x0c,0x12,0x00,0x3f,0xdd,0xc4,0x10,0xfd,0xc4,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f, +0x10,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x5d,0x5d,0x5d,0x10,0xed,0x11,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x21,0x15,0x23,0x11,0x21,0x36,0x37,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35, +0x34,0x00,0x33,0x20,0x00,0x11,0x10,0x05,0x01,0x34,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x36,0x04,0x0a,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xfd,0x29,0xaa,0x01,0x93,0x50,0x2f,0x35,0x41,0x1d,0x14,0x2c,0x45,0x30,0x43,0x88,0x6e,0x45,0x01,0x18,0xea,0x01,0x08,0x01,0x34,0xfe,0x26,0x01,0x2a,0xcf, +0xbd,0xa4,0xae,0x2d,0x4d,0x64,0x37,0x3d,0x63,0x44,0x25,0xc0,0x98,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0xc8,0x01,0x60,0x1d,0x1b,0x1e,0x3b,0x38,0x17,0x20,0x34,0x2c,0x27,0x13,0x1a,0x48,0x66,0x8a,0x5c,0xc0,0x01,0x12,0xfe,0xb3,0xfe,0xe3,0xfe,0x42,0xf2,0x02,0xa1,0xd6,0x01,0x0c,0xc3,0x78,0x33,0x5b,0x4e,0x3d,0x15,0x18,0x39, +0x47,0x56,0x33,0xae,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0xc6,0x05,0xb2,0x00,0x11,0x00,0x6a,0x40,0x46,0xd9,0x0a,0xf9,0x0a,0x02,0xa8,0x0a,0x01,0x46,0x0a,0x01,0x09,0x08,0x01,0x59,0x08,0x01,0x4a,0x08,0x01,0x97,0x03,0x01,0x25,0x03,0x35,0x03,0x02,0xb7,0x01,0x01,0x29,0x01,0x39,0x01,0x02,0x70,0x0e,0x01,0x0e,0x0c,0x0f,0x7e,0x30, +0x11,0x70,0x11,0x02,0x11,0x11,0x13,0x04,0x7e,0xb0,0x06,0x01,0x06,0x0d,0x91,0x0f,0x0f,0x06,0x02,0x91,0x09,0x03,0x11,0x11,0x06,0x12,0x00,0x3f,0x33,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xfd,0x32,0xcd,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20, +0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x15,0x33,0x15,0x23,0x11,0x23,0x04,0x2d,0xfe,0x99,0xfe,0x8c,0xa8,0x02,0x0a,0x02,0x21,0xf1,0xf1,0xa8,0x03,0x71,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x3d,0x98,0xfd,0x7f,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0x25,0x05,0x9a,0x00,0x19,0x00,0x3f,0x40,0x28,0x99,0x14, +0x01,0x2a,0x14,0x01,0x95,0x10,0x01,0x86,0x10,0x01,0x25,0x10,0x01,0x87,0x0f,0x97,0x0f,0x02,0x3b,0x07,0x4b,0x07,0x02,0x19,0x7e,0x17,0x17,0x1b,0x0c,0x7e,0x0a,0x18,0x0c,0x03,0x12,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23, +0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x05,0x25,0x51,0x97,0xd9,0x88,0x83,0xd0,0x91,0x4e,0xa8,0x3b,0x6c,0x98,0x5d,0x5a,0x93,0x69,0x39,0xa8,0x02,0x44,0x97,0xe3,0x97,0x4b,0x49,0x91,0xda,0x91,0x03,0x6d,0xfc,0x9e,0x6e,0xa6,0x6e,0x37,0x35,0x6b,0x9f,0x6b,0x03,0x71,0x00,0x00,0x01, +0x00,0x5e,0x00,0x00,0x05,0x7a,0x05,0x9a,0x00,0x11,0x00,0x57,0x40,0x36,0x9e,0x10,0x01,0x4b,0x10,0x01,0x93,0x06,0x01,0x84,0x06,0x01,0x35,0x03,0x01,0x26,0x03,0x01,0x0a,0x08,0x7e,0x0c,0x06,0x06,0x13,0x01,0x7e,0x11,0x0b,0x4a,0x0d,0x5a,0x0d,0x02,0x3b,0x0d,0x01,0x2d,0x0d,0x01,0x1b,0x0d,0x01,0x0d,0x04,0x91,0x0f,0x09,0x91,0x0c, +0x12,0x01,0x07,0x03,0x00,0x3f,0xce,0x3f,0xed,0xde,0xed,0x33,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xc4,0xfd,0xce,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0x06,0x23,0x20,0x11,0x5e,0xa8,0x01,0x6d,0x01,0x6e,0xa8,0xf1,0xfe,0x67,0x84, +0xeb,0xfd,0xec,0x04,0x5e,0xfe,0xf1,0xfe,0x56,0x01,0xb9,0x02,0x3c,0xfa,0xfe,0x98,0x01,0x93,0x85,0x02,0x5c,0x00,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xb5,0x05,0xb2,0x00,0x3a,0x00,0xba,0x40,0x7a,0x75,0x2e,0x01,0x56,0x2e,0x66,0x2e,0x02,0x5b,0x2a,0x01,0x86,0x24,0x96,0x24,0x02,0x75,0x24,0x01,0x66,0x24,0x01,0x75,0x23,0x01,0x67, +0x23,0x01,0x89,0x1e,0x99,0x1e,0x02,0x89,0x1a,0x01,0x4a,0x1a,0x01,0x7a,0x15,0x01,0x69,0x14,0x01,0x5a,0x11,0x01,0x33,0x0e,0x01,0x88,0x08,0x01,0x08,0x10,0x0d,0x10,0x48,0x49,0x07,0x01,0x73,0x03,0x01,0x65,0x03,0x01,0x65,0x02,0x75,0x02,0x02,0x26,0x7e,0x27,0x27,0x12,0x36,0x31,0x00,0x7e,0x17,0x1c,0x60,0x12,0x01,0x12,0x12,0x3c, +0x31,0x7e,0x1c,0x0b,0x7e,0x0a,0x0a,0x60,0x1c,0x01,0x1c,0x27,0x27,0x36,0x2c,0x36,0x10,0x21,0x0b,0x0b,0x17,0x10,0x17,0x05,0x2c,0x91,0x21,0x04,0x10,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39, +0xed,0x11,0x39,0x11,0x33,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x33,0x20,0x11,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e, +0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0xb5,0x5a,0x97,0xc6,0x6c,0x67,0xc8,0x9e,0x61,0xb1,0x45,0x6e,0x88,0x44,0x01,0x71,0x33,0x59,0x7a,0x48,0x6d,0xbf,0x8e,0x53,0x3f,0x7a,0xb1,0x72,0x5a,0xae,0x89,0x55,0xb0,0x29,0x4f,0x75,0x4b,0x48,0x6f,0x4c,0x27,0x38,0x62,0x81,0x48,0x6c,0xb9,0x87,0x4c,0x01,0x85, +0x75,0x9e,0x60,0x2a,0x2f,0x67,0xa3,0x74,0x4e,0x6a,0x41,0x1d,0x01,0x06,0x49,0x5e,0x3a,0x22,0x0d,0x14,0x3b,0x60,0x8e,0x68,0x55,0x8b,0x63,0x35,0x2b,0x5f,0x99,0x6f,0x38,0x5c,0x42,0x24,0x20,0x3b,0x52,0x33,0x43,0x5b,0x3c,0x25,0x0c,0x13,0x37,0x5f,0x92,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x25,0x05,0xb2,0x00,0x0d,0x00,0x4f, +0x40,0x33,0x46,0x0c,0x01,0x33,0x0c,0x01,0x4b,0x0a,0x01,0x3d,0x0a,0x01,0x94,0x05,0x01,0x85,0x05,0x01,0x26,0x05,0x01,0x17,0x05,0x01,0x89,0x03,0x99,0x03,0x02,0x18,0x03,0x28,0x03,0x02,0x0d,0x7e,0x01,0x01,0x0f,0x06,0x7e,0x08,0x00,0x00,0x07,0x04,0x91,0x0b,0x04,0x07,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0xed,0x12, +0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x05,0x25,0xa8,0xfe,0x6b,0xfe,0x6a,0xa8,0x02,0x3f,0x02,0x3c,0x02,0xc6,0xab,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x02,0x00,0x90,0xff,0xe8,0x04,0xdf, +0x05,0xb2,0x00,0x2f,0x00,0x43,0x00,0x9f,0x40,0x67,0x59,0x2d,0x01,0x48,0x29,0x01,0x26,0x24,0x01,0x79,0x1e,0x01,0x68,0x1e,0x01,0x59,0x1e,0x01,0x5a,0x1d,0x01,0x76,0x18,0x01,0x67,0x18,0x01,0x56,0x18,0x01,0x66,0x14,0x76,0x14,0x02,0x64,0x0c,0x74,0x0c,0x84,0x0c,0x03,0x66,0x0b,0x76,0x0b,0x02,0x6a,0x07,0x01,0x7b,0x06,0x8b,0x06, +0x02,0x6c,0x06,0x01,0x01,0x10,0x04,0x0e,0x7e,0x30,0x30,0x16,0x7e,0x50,0x2b,0x01,0x2b,0x2b,0x04,0x45,0x21,0x7e,0x20,0x20,0x3a,0x7e,0x04,0x2f,0x2f,0x04,0x11,0x10,0x2e,0x3f,0x3f,0x01,0x91,0x21,0x2e,0x2e,0x35,0x26,0x91,0x1b,0x13,0x35,0x91,0x09,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xce,0xed,0x32,0x2f,0x11,0x39,0x39, +0x01,0x2f,0x33,0x2f,0x10,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e, +0x02,0x27,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x21,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0xcc,0xbf,0x43,0x45,0x51,0x83,0xa6,0x56,0x55,0xa4,0x82,0x50,0xfe,0xf0,0x49,0x7b,0x5a,0x33,0x5d,0x99,0xc7,0x6a,0x6c,0xc6,0x98,0x5c,0x02,0xa8,0x35,0x64,0x8e,0x5a,0x48,0x89, +0x6c,0x41,0xd1,0xdc,0xfe,0x42,0x03,0x2a,0x30,0x50,0x6a,0x39,0x3f,0x6d,0x4f,0x2d,0x2a,0x4d,0x6c,0x42,0x42,0x6c,0x4e,0x2a,0x03,0x29,0x32,0x93,0x64,0x5b,0x85,0x56,0x2a,0x28,0x57,0x87,0x5a,0xfe,0xed,0x51,0x04,0x05,0x31,0x57,0x7b,0x4e,0x6d,0xa1,0x6a,0x34,0x34,0x6a,0xa1,0x6d,0x43,0x6c,0x4b,0x28,0x20,0x43,0x68,0x48,0x8c,0x8d, +0x01,0x95,0x3a,0x5b,0x3e,0x21,0x23,0x3f,0x5b,0x37,0x40,0x61,0x41,0x22,0x01,0x03,0x23,0x41,0x5f,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0xb2,0x05,0x9a,0x00,0x1a,0x00,0x57,0x40,0x34,0x9a,0x08,0x01,0x79,0x08,0x89,0x08,0x02,0x98,0x07,0x01,0x9a,0x03,0x01,0x3d,0x03,0x4d,0x03,0x02,0x2b,0x03,0x01,0x00,0x19,0x7e,0x01,0x01,0x0c, +0x1c,0x0f,0x0a,0x7e,0x0c,0x1a,0x91,0x01,0x26,0x0f,0x01,0x0f,0x14,0x91,0x05,0x01,0x05,0x01,0x05,0x0b,0x0e,0x03,0x0b,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x5d,0x10,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x35,0x34,0x26,0x23,0x22, +0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x33,0x05,0xb2,0xfe,0x7b,0xb7,0xb6,0x57,0x88,0x5e,0x31,0xa8,0xa8,0x21,0x49,0x58,0x6b,0x42,0x78,0xbb,0x84,0x4d,0x0b,0xe2,0x01,0xe6,0x47,0xd5,0xe9,0x41,0x79,0xaf,0x6e,0xfd,0xec,0x05,0x9a,0xfe,0x45,0x21,0x3c,0x2c,0x1a,0x44,0x84,0xc0,0x7c,0x00,0x03, +0x00,0x5e,0x00,0x00,0x05,0xf8,0x05,0x9a,0x00,0x14,0x00,0x1d,0x00,0x26,0x00,0x87,0x40,0x5a,0x29,0x22,0x01,0x29,0x1e,0x01,0x26,0x19,0x01,0x26,0x15,0x01,0x68,0x12,0x78,0x12,0x02,0x68,0x0e,0x78,0x0e,0x02,0x67,0x07,0x77,0x07,0x02,0x67,0x04,0x77,0x04,0x02,0x17,0x7d,0x0f,0x10,0x01,0x10,0x10,0x0b,0x20,0x7d,0x90,0x06,0x01,0x00, +0x06,0xc0,0x06,0x02,0x06,0x06,0x25,0x02,0x09,0x7e,0x1b,0x14,0x10,0x0b,0xc0,0x0b,0xd0,0x0b,0xf0,0x0b,0x04,0x0b,0x0b,0x27,0x28,0x1b,0x25,0x91,0x0c,0x09,0x40,0x12,0x16,0x48,0x09,0x0b,0x12,0x24,0x1c,0x91,0x02,0x14,0x00,0x03,0x00,0x3f,0xdd,0x32,0xed,0x32,0x3f,0xdd,0x2b,0x32,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x5d,0x33,0x33, +0xed,0x32,0x32,0x32,0x2f,0x5d,0x71,0xed,0x11,0x33,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x33,0x15,0x04,0x17,0x16,0x15,0x14,0x00,0x21,0x15,0x23,0x35,0x20,0x27,0x26,0x35,0x34,0x37,0x36,0x25,0x01,0x06,0x15,0x14,0x17,0x16,0x33,0x11,0x06,0x01,0x36,0x35,0x34,0x27,0x26,0x27,0x11,0x32,0x02,0xd7, +0xa8,0x01,0x0d,0xb6,0xb6,0xfe,0x94,0xfe,0xf3,0xa8,0xfe,0xf2,0xb5,0xb6,0xb6,0xb5,0x01,0x0e,0xfe,0xab,0x74,0x74,0x73,0xe2,0xe2,0x02,0xdf,0x74,0x74,0x74,0xe1,0xe1,0x05,0x9a,0x8c,0x01,0xa3,0xa3,0xfb,0xfd,0xfe,0xb9,0x88,0x88,0xa3,0xa4,0xfd,0xfb,0xa3,0xa3,0x01,0xfe,0xe6,0x7f,0xab,0xa9,0x80,0x7f,0x03,0x52,0x01,0xfd,0x2e,0x80, +0xa9,0xab,0x7f,0x7f,0x01,0xfc,0xae,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x04,0xe1,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0xbe,0x40,0x87,0x39,0x20,0x49,0x20,0x59,0x20,0x99,0x20,0x04,0xe4,0x1e,0x01,0xa6,0x1e,0xb6,0x1e,0x02,0x94,0x1e,0x01,0x36,0x1e,0x46,0x1e,0x56,0x1e,0x03,0xe7,0x1a,0x01,0xa6,0x1a,0x01,0x94,0x1a,0x01,0x35,0x1a, +0x45,0x1a,0x55,0x1a,0x03,0x99,0x18,0x01,0x3a,0x18,0x4a,0x18,0x5a,0x18,0x03,0x06,0x10,0x01,0x5b,0x0c,0x01,0x49,0x0c,0x01,0xe8,0x0c,0x01,0xaa,0x0c,0xba,0x0c,0x02,0x56,0x0a,0x01,0xe7,0x0a,0x01,0x14,0x01,0x7e,0x1c,0x7d,0x04,0x07,0x04,0x15,0x15,0x0e,0x7e,0x16,0x10,0x16,0x01,0x00,0x16,0x10,0x16,0x20,0x16,0x03,0x04,0x16,0x04, +0x16,0x23,0x06,0x19,0x91,0x0b,0x26,0x1f,0x91,0x59,0x13,0x69,0x13,0x02,0x13,0x0f,0x11,0x01,0xbf,0x11,0xcf,0x11,0xdf,0x11,0x03,0x11,0x07,0x15,0x91,0x04,0x01,0x03,0x12,0x00,0x3f,0xdd,0x32,0xfd,0x32,0xde,0x5d,0x71,0x32,0x5d,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x10,0xed,0x32,0x2f,0x11,0x33,0x10,0xed, +0xed,0x32,0x31,0x30,0x5d,0x71,0x5d,0x5d,0x71,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x21,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x02,0x23,0x22,0x27,0x15,0x21,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xe1,0xfc,0xb8,0xa8,0xdd,0xdd,0x01, +0x0b,0xe7,0xee,0x01,0x10,0xf8,0xee,0xda,0x88,0x03,0x48,0xa8,0x9f,0xab,0xa6,0xb0,0xac,0xaa,0xab,0x9f,0x98,0x98,0x98,0x98,0x02,0x8a,0xdf,0x01,0x19,0xfe,0xdf,0xe7,0xe8,0xfe,0xe8,0x77,0xf1,0x02,0x80,0xa8,0xd0,0xd3,0xa1,0xa6,0xda,0xd3,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x82,0x40,0x61, +0x1a,0x17,0x01,0xc8,0x13,0x01,0x0a,0x13,0x1a,0x13,0x02,0xc6,0x11,0x01,0x05,0x11,0x15,0x11,0x02,0x85,0x0d,0xc5,0x0d,0x02,0x04,0x0d,0x14,0x0d,0x02,0xc9,0x0b,0x01,0x56,0x0b,0x66,0x0b,0x96,0x0b,0x03,0xd7,0x07,0x01,0x55,0x07,0x65,0x07,0x95,0x07,0x03,0xc6,0x05,0x01,0x59,0x05,0x69,0x05,0x99,0x05,0x03,0xc6,0x01,0x01,0x5a,0x01, +0x6a,0x01,0x9a,0x01,0x03,0x09,0x7d,0x00,0x15,0x10,0x15,0x30,0x15,0x03,0x15,0x15,0x19,0x0f,0x7d,0x0f,0x03,0x1f,0x03,0x02,0x03,0x0c,0x91,0x06,0x04,0x12,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xfe,0xd4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70, +0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x05,0x32,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x03,0x00,0x86,0xff,0xe8,0x05,0x45,0x05,0x9a,0x00,0x1f,0x00,0x2a,0x00,0x35,0x00,0x82,0x40,0x54,0x3a,0x28,0x4a,0x28,0x02,0x29,0x28,0x01,0x7c,0x23,0x01,0x69,0x23,0x01,0x4a,0x23,0x01,0x39,0x23,0x01, +0x95,0x1d,0x01,0x99,0x14,0x01,0x45,0x0e,0x95,0x0e,0x02,0x24,0x0e,0x34,0x0e,0x02,0x05,0x0e,0x15,0x0e,0x02,0x96,0x0d,0x01,0x55,0x03,0x01,0x57,0x02,0x01,0x16,0x7e,0x2b,0x11,0x00,0x7e,0x20,0x25,0x1b,0x7e,0x11,0x0a,0x7e,0x0b,0x30,0x11,0x0b,0x0b,0x26,0x11,0x11,0x25,0x05,0x31,0x91,0x1b,0x30,0x1a,0x03,0x10,0x26,0x91,0x05,0x13, +0x00,0x3f,0xed,0x32,0x3f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0xc4,0xde,0xed,0x10,0xfd,0xc4,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x17,0x11,0x2e,0x03,0x35,0x34,0x36, +0x33,0x33,0x11,0x1e,0x03,0x07,0x34,0x2e,0x02,0x27,0x11,0x3e,0x03,0x01,0x14,0x1e,0x02,0x17,0x11,0x22,0x0e,0x02,0x05,0x45,0x59,0x9f,0xdb,0x82,0x88,0xe3,0xa4,0x5b,0xb1,0x36,0x61,0x84,0x4e,0x6d,0x9c,0x63,0x2f,0xd0,0xcb,0xa8,0x80,0xbf,0x7f,0x3f,0xb0,0x29,0x53,0x7d,0x54,0x4b,0x7b,0x57,0x30,0xfd,0x20,0x29,0x43,0x54,0x2b,0x40, +0x5a,0x38,0x19,0x01,0xe9,0x86,0xc2,0x7d,0x3c,0x44,0x86,0xc6,0x81,0x4d,0x82,0x63,0x3d,0x06,0x02,0xde,0x1a,0x3e,0x4b,0x5a,0x35,0x7a,0x8c,0xfe,0x3f,0x1e,0x61,0x7f,0x9b,0x57,0x3f,0x64,0x50,0x40,0x1b,0xfd,0x4f,0x09,0x33,0x57,0x7c,0x02,0xff,0x21,0x30,0x23,0x1a,0x0a,0x01,0x04,0x10,0x1c,0x28,0x00,0x00,0x01,0x00,0x00,0x04,0x90, +0x00,0xca,0x06,0x1c,0x00,0x0d,0x00,0x50,0x40,0x15,0x0c,0x18,0x22,0x25,0x48,0x0c,0x18,0x09,0x13,0x48,0x08,0x18,0x22,0x25,0x48,0x08,0x18,0x09,0x13,0x48,0x05,0xb8,0xff,0xe8,0xb3,0x1d,0x21,0x48,0x01,0xb8,0xff,0xf0,0x40,0x17,0x1d,0x21,0x48,0x00,0x06,0x03,0xc4,0x10,0x0a,0x20,0x0a,0x30,0x0a,0x03,0x0a,0x00,0xc5,0x40,0x0d,0xc0, +0x06,0xc5,0x07,0x00,0x2f,0xed,0x1a,0xde,0x1a,0xed,0x01,0x2f,0x5d,0xfd,0xce,0x32,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x13,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0xca,0x30,0x40,0x40,0x30,0x54,0x76,0x76,0x54,0x05,0xcb,0x41,0x34,0x34,0x41,0x51,0x6c,0x5a,0x5a,0x6c,0x00,0x01,0x00,0x00,0x04,0x8a, +0x00,0xe1,0x06,0x03,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x01,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x11,0x35,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x5e,0x14,0x34,0x3e, +0x3a,0x30,0x35,0x42,0x71,0x04,0x8a,0x49,0x05,0x62,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x60,0x93,0x00,0x00,0x01,0x00,0x00,0x04,0xc2,0x01,0x35,0x06,0x0a,0x00,0x03,0x00,0x22,0x40,0x11,0x78,0x03,0x88,0x03,0x98,0x03,0x03,0x03,0x40,0x00,0x80,0x01,0x40,0x02,0x03,0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x1a,0xcd,0x1a,0xdd,0x1a, +0xcd,0x31,0x30,0x5d,0x01,0x03,0x23,0x13,0x01,0x35,0xb6,0x7f,0x8f,0x06,0x0a,0xfe,0xb8,0x01,0x48,0x00,0x00,0x01,0x00,0x00,0x04,0x3e,0x01,0x92,0x06,0x03,0x00,0x1d,0x00,0x13,0xb6,0x03,0x1b,0x1b,0x0d,0x13,0x00,0x0f,0x00,0x2f,0xcc,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15, +0x14,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x35,0x34,0x27,0x01,0x86,0x04,0x08,0x1a,0x2d,0x3c,0x22,0x1a,0x2c,0x21,0x12,0x08,0x71,0x04,0x07,0x59,0x48,0x18,0x2d,0x23,0x15,0x08,0x06,0x03,0x0f,0x30,0x13,0x23,0x38,0x2e,0x25,0x10,0x0c,0x19,0x1d,0x24,0x16,0x17,0x22,0x0f,0x2f,0x14,0x45,0x5b,0x1d,0x0a,0x19,0x1f,0x25, +0x16,0x17,0x22,0x00,0x00,0x01,0x00,0x00,0x04,0xc2,0x01,0x35,0x06,0x0a,0x00,0x03,0x00,0x31,0xb7,0x77,0x03,0x87,0x03,0x97,0x03,0x03,0x03,0xb8,0xff,0xf8,0x40,0x12,0x18,0x1c,0x48,0x01,0x40,0x00,0x80,0x03,0x40,0x50,0x02,0x60,0x02,0x02,0x02,0x03,0x80,0x01,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x5d,0x1a,0xcd,0x1a,0xdd,0x1a,0xcd,0x31, +0x30,0x2b,0x5d,0x01,0x23,0x03,0x33,0x01,0x35,0x7f,0xb6,0xa8,0x04,0xc2,0x01,0x48,0x00,0x01,0x00,0x00,0x04,0x76,0x02,0x29,0x06,0x1c,0x00,0x2d,0x00,0xa0,0xb5,0x2a,0x08,0x11,0x14,0x48,0x26,0xb8,0xff,0xf8,0x40,0x4f,0x11,0x14,0x48,0x2a,0x1c,0x01,0x1c,0x10,0x11,0x14,0x48,0x06,0x12,0x16,0x12,0x02,0x19,0x07,0x11,0x01,0x2a,0x09, +0x0d,0x01,0x08,0x0c,0x01,0x39,0x0c,0x10,0x19,0x1f,0x48,0x07,0x03,0x17,0x03,0x27,0x03,0x03,0x3e,0x00,0x7f,0x2d,0x8f,0x2d,0x02,0x2d,0x2d,0x16,0x0a,0x9f,0x23,0xaf,0x23,0x02,0x23,0x40,0x09,0x0c,0x48,0x23,0x16,0x10,0x17,0x20,0x17,0x30,0x17,0x03,0x17,0x00,0x00,0x0f,0xc0,0x05,0x01,0x05,0x28,0xb8,0xff,0xc0,0x40,0x12,0x15,0x1a, +0x48,0x28,0x17,0xaf,0x0f,0xbf,0x0f,0xcf,0x0f,0x03,0x0f,0xc0,0x1e,0x01,0x1e,0x17,0xb8,0x01,0x3a,0x00,0x3f,0xdc,0x71,0xcd,0x71,0x10,0xd4,0x2b,0xcd,0x71,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xcd,0xdc,0x2b,0x71,0xcd,0x11,0x39,0x2f,0x71,0xcd,0x31,0x30,0x5e,0x5d,0x2b,0x5e,0x5d,0x5d,0x5e,0x5d,0x5e,0x5d,0x2b,0x5d,0x2b,0x2b,0x01,0x14, +0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x3e,0x04,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x01,0x37,0x07,0x10,0x1b,0x14,0x15,0x1f,0x14,0x09,0x16,0x24,0x30,0x19,0x32,0x4b,0x35,0x23,0x13,0x08,0x5b,0x09,0x1a,0x2e,0x4a,0x69,0x47,0x2e,0x51,0x3c,0x23,0x18, +0x2d,0x40,0x27,0x2a,0x3c,0x28,0x13,0x05,0x4f,0x0e,0x1e,0x19,0x10,0x0e,0x18,0x1f,0x10,0x1a,0x2b,0x1e,0x11,0x20,0x36,0x45,0x4a,0x49,0x1f,0x20,0x57,0x5e,0x5c,0x48,0x2d,0x1e,0x36,0x4a,0x2c,0x23,0x3f,0x2e,0x1b,0x1b,0x2f,0x3d,0x21,0x00,0x00,0x01,0x00,0x00,0x04,0xb7,0x02,0xce,0x06,0x1c,0x00,0x06,0x00,0x2a,0x40,0x16,0xa5,0x01, +0xb5,0x01,0xc5,0x01,0x03,0x96,0x01,0x01,0x01,0x06,0x04,0x00,0x00,0x02,0x04,0x00,0x06,0x05,0x01,0x04,0x00,0x2f,0xdd,0x32,0xcd,0x32,0x01,0x2f,0xcd,0x39,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x01,0x07,0x21,0x15,0x21,0x35,0x01,0x01,0x60,0xc9,0x02,0x37,0xfd,0x32,0x01,0x11,0x05,0xd1,0xd5,0x45,0x45,0x01,0x20,0x00,0x00,0x01, +0x00,0x90,0xff,0xe8,0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x91,0x40,0x63,0x9c,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x29,0x1e,0x03,0x57,0x1c,0x01,0x98,0x1b,0x01,0xc8,0x1a,0x01,0x9c,0x1a,0x01,0x07,0x0e,0x17,0x0e,0x02,0xf7,0x0e,0x01,0x36,0x0e,0x01,0x66,0x0c,0xe6,0x0c,0xf6,0x0c,0x03,0x55,0x0c,0x01,0x27,0x0c,0x37,0x0c,0x02,0x66,0x0c, +0x76,0x0c,0x86,0x0c,0x03,0x36,0x06,0x01,0x56,0x04,0x01,0x66,0x04,0x76,0x04,0x86,0x04,0x03,0x01,0x84,0x1f,0x08,0x15,0x15,0x12,0x84,0x10,0x1b,0x0a,0x84,0x08,0x08,0x20,0x21,0x16,0x0d,0x0d,0x1b,0x05,0x95,0x18,0x1d,0x16,0x14,0x0f,0x11,0x09,0x00,0x0f,0x00,0x3f,0x32,0x32,0x3f,0x3f,0x33,0xed,0x32,0x32,0x11,0x33,0x11,0x12,0x01, +0x39,0x2f,0xed,0x33,0xdc,0xed,0x33,0x2f,0x10,0xdc,0xed,0x31,0x30,0x5d,0x71,0x5d,0x5d,0x71,0x71,0x71,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x90,0xa4,0x69, +0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0xfc,0x00,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0x2a,0x04,0x18,0x00,0x16,0x00,0x5a,0x40,0x3a,0x75,0x15, +0x01,0x05,0x14,0x15,0x14,0x25,0x14,0x75,0x14,0x85,0x14,0x95,0x14,0x06,0xe8,0x06,0xf8,0x06,0x02,0xc7,0x06,0xd7,0x06,0x02,0x69,0x03,0x01,0x09,0x09,0x18,0x16,0x84,0x01,0x01,0x18,0x0f,0x0b,0x07,0x84,0x0d,0x10,0x04,0x95,0x13,0x01,0x01,0x13,0x10,0x0e,0x0f,0x0d,0x1b,0x09,0x95,0x0b,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x39,0x2f, +0x10,0xed,0x32,0x01,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0x02,0xe0,0xfd,0x20,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x01,0x30, +0x01,0x18,0x01,0x46,0xb9,0x8d,0xfe,0x50,0x98,0xfe,0x29,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0xf2,0x04,0x18,0x00,0x14,0x00,0x21,0x00,0x72,0x40,0x4d,0xc9,0x21,0xd9,0x21,0x02,0x26,0x20,0x36,0x20,0x02,0xc9,0x1e,0xd9,0x1e,0x02,0x64,0x1e,0x01,0x45,0x1e,0x55,0x1e,0x02,0x44,0x1a,0x54,0x1a,0x02, +0x68,0x0d,0x01,0xa7,0x0c,0x01,0xca,0x09,0xda,0x09,0x02,0x02,0x00,0x13,0x84,0x16,0x12,0x20,0x04,0x01,0x04,0x04,0x23,0x1c,0x83,0x0f,0x0b,0x1f,0x0b,0x02,0x0b,0x12,0x0f,0x10,0x19,0x95,0x0e,0x10,0x05,0x1f,0x95,0x08,0x16,0x04,0x1b,0x00,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0x5d,0xed, +0x12,0x39,0x2f,0x5d,0x33,0x33,0xfd,0xce,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x15,0x23,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xf2,0xe2,0xa4,0x04,0x6b,0xf3,0xc1,0xe9,0x01, +0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xa4,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0x98,0x98,0xfe,0x29,0x02,0x87,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfc,0x98,0x01,0x35,0x95,0x7e,0xae,0xdb,0xc7,0xb1,0xc9,0xc5,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0xc3,0x04,0x18,0x00,0x16,0x00,0x5d,0x40,0x0b,0x28,0x11,0x01,0x76,0x11,0x86, +0x11,0x96,0x11,0x03,0x10,0xb8,0xff,0xe0,0x40,0x2f,0x10,0x14,0x48,0x05,0x10,0x15,0x10,0x25,0x10,0x03,0x86,0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x68,0x03,0x01,0x14,0x00,0x12,0x84,0x01,0x01,0x18,0x0b,0x07,0x84,0x09,0x14,0x95,0x16,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x09,0x15,0x01,0x1b,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32, +0x3f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0x32,0xce,0x31,0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x15,0x23,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xcb,0xcb,0xfe,0x29,0x04,0x1f,0x01, +0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0xfe,0x26,0x98,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x2a,0x05,0xec,0x00,0x16,0x00,0x60,0x40,0x3e,0x7a,0x11,0x8a,0x11,0x02,0x10,0x18,0x10,0x14,0x48,0x09,0x10,0x19,0x10,0x29,0x10,0x03,0xc9,0x06,0xd9,0x06,0x02,0x06,0x10,0x1f,0x22,0x48,0x36,0x06,0x01,0x65,0x03,0x01,0x00, +0x00,0x18,0x09,0x84,0x0b,0x07,0x07,0x18,0x15,0x01,0x84,0x12,0x08,0x08,0x0f,0x00,0x95,0x15,0x0f,0x13,0x00,0x0c,0x04,0x95,0x0f,0x16,0x0b,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x2b,0x5d,0x5d,0x2b,0x5d,0x01,0x21,0x11,0x10, +0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x21,0x04,0x2a,0xfd,0x20,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xa4,0x02,0xe0,0x03,0x68,0xfe,0x50,0xfe,0xba,0xb9,0x8d,0x01,0x18,0xfd,0x30,0xaa,0xc2,0xd9,0xcd,0x04,0x5e,0xfe,0x14,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0xec, +0x04,0x18,0x00,0x12,0x00,0x1f,0x00,0x67,0x40,0x46,0xc9,0x1f,0xd9,0x1f,0x02,0x26,0x1e,0x36,0x1e,0x02,0xc9,0x1c,0xd9,0x1c,0x02,0x45,0x1c,0x55,0x1c,0x02,0x44,0x18,0x54,0x18,0x02,0xa7,0x07,0x01,0xca,0x04,0xda,0x04,0x02,0x10,0x0e,0x84,0x14,0x0d,0x00,0x12,0x10,0x12,0x20,0x12,0x03,0x12,0x12,0x21,0x1a,0x83,0x1f,0x06,0x01,0x06, +0x10,0x95,0x12,0x1b,0x0d,0x0f,0x0c,0x17,0x95,0x09,0x10,0x00,0x1d,0x95,0x03,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0x33,0x33,0xfd,0xce,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x33, +0x15,0x21,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x6c,0x04,0x6b,0xf3,0xc1,0xe9,0x01,0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xdc,0xfe,0x80,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0xb0,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfa,0xc1,0x98,0x03,0xa4,0x95,0x7e,0xae,0xdb,0xc7,0xb1,0xc9,0xc5,0x00, +0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x2a,0x05,0xec,0x00,0x09,0x00,0x26,0x40,0x13,0x09,0x06,0x09,0x06,0x0b,0x04,0x07,0x84,0x01,0x06,0x95,0x04,0x0f,0x02,0x00,0x09,0x95,0x01,0x15,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x03,0xf8, +0xfc,0xae,0xa4,0x02,0xe0,0xfd,0x20,0x02,0xae,0x05,0xec,0xfe,0x14,0x98,0xfd,0x30,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0x2a,0x04,0x18,0x00,0x14,0x00,0x5c,0x40,0x0b,0x28,0x13,0x01,0x76,0x13,0x86,0x13,0x96,0x13,0x03,0x12,0xb8,0xff,0xe0,0x40,0x2f,0x10,0x14,0x48,0x05,0x12,0x15,0x12,0x25,0x12,0x03,0x86,0x06,0x96,0x06,0x02,0xe8, +0x05,0x01,0x28,0x03,0x01,0x69,0x03,0x01,0x09,0x14,0x84,0x01,0x01,0x16,0x0d,0x07,0x84,0x0b,0x0e,0x04,0x95,0x11,0x10,0x0c,0x0f,0x09,0x95,0x0b,0x1b,0x01,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x5d,0x71,0x5d,0x71,0x5d,0x2b,0x5d,0x71,0x21,0x23,0x11,0x10,0x23,0x22, +0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0x02,0xe0,0xfc,0x7c,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfc,0x79,0x98,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x02,0x00,0xa6,0xfe,0x29,0x05,0x2b,0x04,0x18,0x00,0x0c,0x00,0x38,0x00,0x8c,0x40,0x5b, +0x98,0x35,0x01,0x97,0x23,0x01,0x66,0x23,0x76,0x23,0x86,0x23,0x03,0x65,0x22,0x01,0x89,0x1e,0x01,0x96,0x15,0x01,0x87,0x15,0x01,0x5a,0x10,0x01,0x49,0x10,0x01,0x9a,0x0a,0x01,0x89,0x0a,0x01,0x78,0x0a,0x01,0x69,0x0a,0x01,0x97,0x07,0x01,0x66,0x03,0x76,0x03,0x86,0x03,0x03,0x28,0x27,0x25,0x84,0x0d,0x01,0x01,0x19,0x3a,0x05,0x84, +0x33,0x1b,0x17,0x84,0x19,0x01,0x28,0x95,0x25,0x0d,0x0d,0x12,0x08,0x95,0x2e,0x16,0x1c,0x1d,0x1d,0x12,0x95,0x20,0x10,0x1a,0x0f,0x18,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x33,0x11,0x33,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x01,0x2f,0xfd,0xc4,0xde,0xed,0x11,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x03,0xe9,0x80,0x58,0x67, +0x4f,0x47,0x2e,0x41,0x28,0x12,0x03,0x2e,0x4e,0x69,0x3e,0x57,0x8b,0x62,0x35,0xa4,0xa4,0x04,0x40,0xd4,0x8a,0x5a,0x99,0x71,0x40,0x01,0x9a,0x9a,0x2c,0x56,0x80,0x54,0x45,0x74,0x54,0x2f,0x36,0x60,0x85,0x4f,0x01,0x5c,0x9e,0x6a,0x61,0x54,0x61,0x27,0x40,0x51,0x01,0x60,0x3a,0x5d,0x42,0x23,0x41,0x6b,0x88,0x47,0xfc,0x16,0x05,0xd7, +0xb4,0x60,0x6c,0x38,0x67,0x90,0x57,0x98,0x9e,0x52,0x88,0x63,0x37,0x32,0x58,0x77,0x46,0x52,0x84,0x5c,0x31,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0xca,0x05,0xec,0x00,0x16,0x00,0x23,0x00,0x55,0x40,0x36,0x68,0x0f,0x01,0x4a,0x0f,0x5a,0x0f,0x02,0x48,0x0e,0x58,0x0e,0x02,0x68,0x09,0x01,0x5a,0x09,0x01,0x4d,0x09,0x01,0x66,0x05, +0x01,0x55,0x05,0x01,0x43,0x05,0x01,0x01,0x00,0x15,0x84,0x12,0x17,0x17,0x25,0x1b,0x83,0x0c,0x01,0x17,0x95,0x12,0x15,0x0f,0x14,0x00,0x1e,0x95,0x07,0x16,0x00,0x3f,0xed,0x3f,0x3f,0xc4,0xfd,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11,0x14,0x0e, +0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x33,0x11,0x33,0x05,0x21,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x04,0xca,0xce,0x39,0x6f,0xa3,0x6b,0x7b,0xb8,0x79,0x3c,0x40,0x7b,0xb4,0x74,0x01,0x13,0xa8,0xce,0xfe,0x8a,0xfe,0xff,0xa7,0xa1,0x05,0x05,0xa1,0x8e,0x48,0x6b,0x45,0x22,0x03,0x76,0xfe,0x8d, +0x69,0xc3,0x96,0x59,0x52,0x92,0xc8,0x75,0x70,0xba,0x84,0x49,0x01,0xec,0xfe,0x14,0x8a,0xba,0xb9,0xc8,0xc9,0x46,0x72,0x92,0x4b,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0xf8,0x05,0xec,0x00,0x11,0x00,0x4e,0xb3,0x37,0x10,0x01,0x10,0xb8,0xff,0xd0,0x40,0x2c,0x11,0x14,0x48,0x71,0x10,0x01,0x06,0x10,0x16,0x10,0x26,0x10,0x03,0x86, +0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x68,0x03,0x01,0x11,0x84,0x01,0x01,0x13,0x0b,0x07,0x84,0x09,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x00,0x08,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x71,0x71,0x5d,0x5d,0x2b,0x71,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23, +0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0xc3,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0x76,0x04,0x00,0x00,0x05,0x00,0x1a,0x40,0x0c,0x01,0x01,0x07,0x05,0x84,0x03,0x04,0x0f,0x01,0x95,0x03,0x1b, +0x00,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x11,0x33,0x2f,0x31,0x30,0x01,0x21,0x15,0x21,0x11,0x33,0x01,0x4a,0x01,0x2c,0xfe,0x30,0xa4,0xfe,0xc1,0x98,0x05,0xd7,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x0b,0x05,0xec,0x00,0x35,0x00,0x49,0x40,0x29,0x95,0x2c,0x01,0x87,0x2c,0x01,0x28,0x84,0x0d,0x35,0x84,0x01,0x33,0x0d,0x33,0x0d,0x33,0x1a, +0x37,0x1c,0x18,0x84,0x1a,0x34,0x0f,0x1e,0x13,0x95,0x23,0x10,0x1c,0x00,0x19,0x1b,0x2e,0x95,0x03,0x08,0x16,0x00,0x15,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x3f,0xed,0x33,0x3f,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc4,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x21,0x23,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35, +0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x06,0x0b,0xa4,0x04,0x1a,0x38,0x44,0x51,0x32,0x61,0x80,0x4b,0x1f,0x0d,0x26,0x43,0x37,0x42,0x63,0x42,0x21,0xa4,0xa4,0x04,0x1e,0x41,0x4c,0x5b,0x36,0x54,0x6d, +0x3f,0x18,0x0d,0x2d,0x54,0x47,0x3e,0x5a,0x3b,0x1d,0xa4,0xa2,0x2f,0x45,0x2f,0x17,0x43,0x7c,0xb0,0x6d,0x62,0x50,0x84,0x5f,0x35,0x43,0x6b,0x84,0x40,0xfc,0x0d,0x07,0xc3,0xfd,0x6a,0x30,0x49,0x31,0x18,0x41,0x77,0xa9,0x68,0x71,0x51,0x86,0x60,0x35,0x43,0x69,0x80,0x3c,0x02,0x26,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0xb0,0x06,0x02, +0x00,0x15,0x00,0x25,0x00,0xc7,0x40,0x64,0x96,0x1a,0x01,0x96,0x16,0x01,0x48,0x0a,0x58,0x0a,0x02,0x49,0x06,0x59,0x06,0x02,0x5a,0x05,0x01,0x49,0x05,0x01,0x56,0x03,0x01,0x45,0x03,0x01,0x56,0x02,0x01,0x47,0x02,0x01,0x79,0x0c,0x99,0x0c,0x02,0x4c,0x0c,0x5c,0x0c,0x02,0x38,0x0c,0x01,0x0c,0x23,0x0d,0x20,0xb5,0x11,0xc5,0x11,0x02, +0x87,0x11,0x01,0x62,0x11,0x01,0x47,0x11,0x57,0x11,0x02,0x46,0x14,0x56,0x14,0x02,0x11,0x14,0x10,0x12,0x12,0x00,0x83,0x10,0x20,0x20,0x20,0x30,0x20,0x03,0x20,0x20,0x08,0x27,0xe9,0x0f,0x01,0x0f,0x10,0x0d,0x12,0x48,0x0f,0x10,0xb8,0xff,0xc0,0x40,0x21,0x0e,0x12,0x48,0x10,0x36,0x0e,0x01,0x0e,0x0d,0x0d,0x18,0x83,0x20,0x08,0x01, +0x08,0x14,0x23,0x95,0x0f,0x10,0x0d,0x03,0x0e,0x0c,0x11,0x0f,0x0e,0x00,0x1c,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0xc5,0x12,0x17,0x39,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x5d,0xcd,0x2b,0x32,0x2b,0x5d,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d, +0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x01,0x37,0x17,0x07,0x01,0x21,0x15,0x23,0x16,0x25,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x26,0x27,0x27,0x23,0x22,0x04,0x50,0x85,0x8b,0xee,0xe7,0x87,0x84,0x89,0x78,0xce,0xfe,0x55, +0x97,0x88,0x43,0x01,0xda,0x01,0x76,0xd9,0x78,0xfd,0x14,0x5b,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x01,0x8c,0x2c,0x5b,0xd6,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0xfb,0x88,0x78,0x0f,0x01,0x21,0xe3,0x5a,0x65,0xfe,0xbd,0x8a,0x96,0x2c,0x69,0xa9,0xab,0x6a,0x73,0x74,0x66,0xb2,0xe6,0x73,0x1f,0x00,0x01,0x00,0x90,0xfe,0x29,0x03,0xe2, +0x05,0xec,0x00,0x11,0x00,0x37,0x40,0x21,0x76,0x0b,0x01,0x67,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x84,0x03,0x01,0x0f,0x09,0x84,0x07,0x11,0x0f,0x09,0x00,0x0c,0x95,0x02,0x05,0x16,0x00,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x2f,0xc4,0x33,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11, +0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xfe,0x29,0x02,0x79,0xba,0x01,0xb4,0x04,0x50,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x11,0x00,0x98,0x40,0x2c,0x75,0x10, +0x01,0x92,0x10,0x01,0x82,0x10,0x01,0x6a,0x03,0x01,0x75,0x10,0x01,0x01,0x15,0x09,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b, +0x06,0x4d,0x01,0x01,0x13,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b, +0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x05,0xec,0xfd,0x6a,0xc2, +0xfe,0x5f,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xb2,0x05,0xc6,0x00,0x14,0x00,0x2f,0x00,0x93,0x40,0x5d,0x99,0x27,0x01,0x46,0x24,0x01,0x37,0x1d,0x01,0x9a,0x12,0x01,0x85,0x08,0x01,0x78,0x15,0x88,0x15,0x02,0x75,0x07,0x01,0x66,0x07,0x01,0x84,0x1a,0x01,0x00,0x1a,0x05,0x91,0x19,0x01,0x19,0x2f,0x2f,0x2a,0x0f,0x99,0x17,0x01,0x17, +0x90,0x18,0x01,0x18,0x16,0x15,0x15,0x05,0x83,0x0f,0x2a,0x01,0x2a,0x21,0x1f,0x84,0x0f,0x0f,0x01,0x0f,0x6c,0x00,0x7c,0x00,0x02,0x4a,0x00,0x5a,0x00,0x02,0x00,0x2f,0x19,0x15,0x18,0x04,0x16,0x1a,0x1a,0x16,0x0a,0x95,0x23,0x25,0x16,0x20,0x15,0x16,0x00,0x00,0x3f,0x3f,0x3f,0x33,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0x33,0x5d,0x5d, +0x01,0x2f,0x5d,0xed,0xc4,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xcd,0x5d,0x32,0x5d,0x11,0x12,0x39,0x2f,0xcd,0x5d,0x11,0x39,0x39,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x34,0x2e,0x02,0x01,0x37,0x17,0x07,0x05,0x07,0x1e,0x03,0x15,0x11,0x23, +0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0xf0,0x48,0x5c,0x35,0x14,0x25,0x41,0x56,0x32,0x47,0x6b,0x47,0x24,0x2c,0x4d,0x69,0xfe,0x4e,0x6e,0x8f,0x37,0x01,0x89,0x71,0x49,0x7f,0x5d,0x35,0xa4,0x04,0x62,0xc6,0x54,0x8d,0x67,0x3a,0x29,0x5b,0x91,0x67,0x03,0x73,0x44,0x80,0x78,0x73,0x36,0x47,0x6a,0x47,0x24, +0x33,0x5a,0x78,0x45,0x28,0x56,0x79,0x5a,0x45,0x01,0x9e,0xd6,0x3c,0x63,0xda,0x75,0x29,0x5a,0x72,0x8e,0x5b,0xfe,0x06,0xa2,0xba,0x32,0x64,0x95,0x63,0x5a,0xaa,0xaa,0xad,0x5d,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0xd4,0x04,0x18,0x00,0x14,0x00,0x58,0x40,0x0b,0x28,0x10,0x01,0x76,0x10,0x86,0x10,0x96,0x10,0x03,0x0f,0xb8,0xff,0xe0, +0x40,0x2c,0x10,0x14,0x48,0x05,0x0f,0x15,0x0f,0x25,0x0f,0x03,0x86,0x05,0x96,0x05,0x02,0x28,0x02,0x01,0x68,0x02,0x01,0x14,0x12,0x84,0x01,0x01,0x16,0x0a,0x06,0x84,0x09,0x0c,0x03,0x95,0x0e,0x10,0x0a,0x0f,0x08,0x15,0x12,0x95,0x00,0x1b,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xcd,0x31, +0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x01,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x15,0x03,0x54,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xdc,0xfe,0x29,0x04,0x1f,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0xfc,0x4f,0x98,0x00,0x00,0x02, +0x00,0x60,0xff,0xe8,0x03,0x89,0x06,0x02,0x00,0x20,0x00,0x31,0x00,0x79,0x40,0x4c,0x49,0x2d,0x59,0x2d,0x02,0x76,0x24,0x86,0x24,0x96,0x24,0x03,0x67,0x24,0x01,0x75,0x12,0x01,0x66,0x12,0x01,0x86,0x0d,0x01,0x77,0x0d,0x01,0x49,0x03,0x59,0x03,0x99,0x03,0x03,0x2f,0x10,0x21,0x1f,0x01,0x1c,0x09,0x09,0x13,0x84,0x15,0x2b,0x2b,0x33, +0x21,0x84,0x1c,0x00,0x00,0x0f,0x1c,0x01,0x1c,0x26,0x95,0x17,0x19,0x16,0x14,0x15,0x09,0x0b,0x95,0x08,0x06,0x01,0x1f,0x2f,0x95,0x10,0x01,0x10,0x00,0x3f,0xc4,0xfd,0xc4,0x3f,0x33,0xed,0x32,0x3f,0x3f,0x33,0xed,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xc4,0xed,0x32,0x2f,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x07,0x33,0x20,0x11,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x10,0x21,0x23,0x06,0x06,0x60,0x5a,0x21,0x77,0xa0,0xc0,0x6b,0x43,0x29,0x34,0x3e,0x50, +0x8a,0x71,0x55,0x19,0x5e,0x01,0xcd,0xa4,0x04,0x6a,0xd1,0x99,0xad,0x17,0x1d,0x34,0xa8,0x1c,0x33,0x48,0x2d,0x3f,0x68,0x4a,0x28,0xfe,0xc9,0x78,0x1b,0x13,0x04,0x18,0x62,0xb1,0x87,0x50,0x0a,0x8d,0x0d,0x3c,0x63,0x7e,0x43,0xfe,0x1e,0xfd,0xca,0xa0,0xb8,0xde,0xe0,0x8d,0xf3,0x68,0xfe,0x24,0x53,0x78,0x4f,0x26,0x30,0x52,0x6e,0x3e, +0x85,0x01,0x69,0x61,0xec,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0xaf,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x28,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x13,0x84,0x03,0x01,0x0f,0x0f,0x15,0x09,0x84,0x07,0x12,0x95,0x10,0x00,0x09,0x0f,0x0c,0x95,0x02,0x05,0x16,0x00,0x15,0x00,0x3f, +0x3f,0x33,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xc4,0x32,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x15,0x23,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x01,0x71,0xcd,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd, +0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0x98,0x00,0x01,0xff,0x70,0xfe,0x29,0x01,0x80,0x04,0x00,0x00,0x0a,0x00,0x16,0x40,0x0a,0x0a,0x84,0x05,0x09,0x09,0x0f,0x06,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xce,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x11,0x11,0x33,0x01,0x80,0xcb,0xb5,0x90,0x8c,0xe0,0xa4,0x09, +0xe8,0xf8,0x98,0x01,0x3b,0x04,0x04,0x00,0x00,0x01,0xff,0xf6,0xff,0xe8,0x04,0x0b,0x05,0xec,0x00,0x13,0x00,0x3e,0x40,0x25,0x9a,0x10,0x01,0x8b,0x10,0x01,0x29,0x10,0x01,0x76,0x03,0x01,0x67,0x03,0x01,0x13,0x01,0x84,0x11,0x0d,0x0b,0x09,0x84,0x07,0x0c,0x04,0x95,0x0f,0x16,0x0a,0x15,0x09,0x0f,0x12,0x95,0x01,0x00,0x00,0x3f,0xed, +0x3f,0x3f,0x3f,0xed,0x33,0x01,0x2f,0xed,0xc4,0x32,0x2f,0xed,0xce,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x03,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x23,0x0a,0x01,0x66,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xc3,0x05,0xec,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e, +0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0x00,0x01,0x00,0x60,0xfe,0x29,0x03,0xc6,0x04,0x18,0x00,0x2f,0x00,0x71,0x40,0x49,0x66,0x2d,0x76,0x2d,0x02,0x79,0x2b,0x01,0x48,0x22,0x58,0x22,0x02,0x9a,0x03,0x01,0x89,0x03,0x01,0x99,0x02,0x01,0x88,0x02,0x01,0x93,0x0f,0x01,0x64,0x0f,0x74,0x0f,0x84,0x0f,0x03,0x0f,0x13,0x1a,0x1a,0x0a, +0x84,0x9c,0x25,0x01,0x8b,0x25,0x01,0x6c,0x25,0x01,0x25,0x20,0x29,0x29,0x31,0x13,0x84,0x20,0x2f,0x84,0x00,0x00,0x20,0x19,0x95,0x1b,0x1b,0x00,0x00,0x2c,0x95,0x05,0x10,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0xed,0x32,0x2f,0x11,0x39,0x5d,0x5d,0x31,0x30, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x60,0x44,0x76,0x9e,0x5b,0x5b,0x9e,0x76,0x44,0x3d,0x63,0x80,0x84,0x80,0x63,0x3d,0x1a,0x33,0x49,0x30,0x01,0xfe,0xfd, +0xf1,0x51,0x7f,0x58,0x2f,0x3d,0x63,0x80,0x84,0x80,0x63,0x3d,0x8c,0x85,0x85,0x8c,0x02,0x89,0x5c,0x94,0x67,0x38,0x38,0x67,0x94,0x5c,0x5c,0x8e,0x6e,0x57,0x4b,0x46,0x4d,0x5b,0x3b,0x24,0x3d,0x2e,0x1a,0x94,0x30,0x57,0x77,0x48,0x4e,0x77,0x5d,0x4d,0x48,0x4a,0x5c,0x72,0x4b,0x7e,0x86,0x86,0x7e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00, +0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x98,0x40,0x2c,0x75,0x11,0x01,0x92,0x10,0x01,0x82,0x10,0x01,0x6a,0x03,0x01,0x75,0x10,0x01,0x01,0x15,0x09,0x15,0x0a,0x0f,0x0c,0x04,0x95,0x0f,0x10,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff, +0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x14,0x01,0x5d,0x2f,0x2b,0x2b, +0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x32,0x3f,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2, +0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0x00,0x01,0x00,0x60,0xfe,0x29,0x02,0xec,0x04,0x1c,0x00,0x29,0x00,0x6a,0x40,0x41,0xb7,0x29,0x01,0xa6,0x29,0x01,0x88,0x25,0x01,0x9a,0x1f,0x01,0x89,0x1f,0x01,0x99,0x1e,0x01,0x8a,0x1e,0x01,0x65,0x0a,0x01,0x47,0x09,0x01,0x67,0x08,0x01,0x67,0x01,0x01,0x27, +0x28,0x28,0x29,0x95,0x29,0x01,0x29,0x11,0x11,0x03,0x84,0x26,0x23,0x23,0x2b,0x0e,0x84,0x16,0x23,0x03,0x11,0x29,0x28,0x95,0x26,0x27,0x10,0x11,0x95,0x12,0x1b,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x32,0x5d,0x11,0x33,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x07,0x06,0x06,0x15,0x14,0x33,0x21,0x15,0x21,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x37,0x36,0x36,0x35,0x34,0x27,0x01,0x25,0x17,0x07,0x02,0x64,0x11,0x13,0x34,0x3b,0x31,0x46,0x3a,0x38,0x22,0x0b,0x12,0x4e,0x01,0xad,0xfe,0x53,0x73,0x6c,0x06, +0x0d,0x15,0x0f,0x1b,0x4c,0x56,0x58,0x27,0x14,0x10,0x0c,0xfe,0x9c,0x01,0x07,0x5f,0x8d,0x01,0xa4,0x19,0x37,0x23,0x29,0x61,0x3b,0x30,0x48,0x41,0x41,0x29,0x0e,0x2b,0x0e,0x45,0x94,0x68,0x70,0x0c,0x24,0x28,0x29,0x13,0x22,0x54,0x59,0x58,0x27,0x13,0x26,0x10,0x19,0x12,0x02,0x08,0xbd,0x84,0x66,0x00,0x00,0x01,0x00,0x90,0xfe,0x29, +0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x5b,0x40,0x38,0x9c,0x1e,0x01,0x85,0x0c,0x01,0x66,0x0c,0x76,0x0c,0x02,0x86,0x03,0x01,0x77,0x03,0x01,0x66,0x03,0x01,0x02,0x84,0x1f,0x08,0x16,0x14,0x12,0x84,0x10,0x1b,0x0b,0x84,0x08,0x05,0x95,0x1d,0x9d,0x1b,0x01,0x48,0x1b,0x58,0x1b,0x02,0x1b,0x15,0x0d,0x95,0x18,0x16,0x13,0x1b,0x11,0x01, +0x0a,0x0f,0x00,0x3f,0xc4,0xc4,0x3f,0x3f,0xed,0x33,0x33,0x5d,0x5d,0xd4,0xed,0x01,0x2f,0xed,0x33,0xdc,0xed,0xc4,0x33,0x10,0xdc,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x26,0x27,0x06, +0x23,0x20,0x11,0x90,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0xfa,0x29,0x02,0x79,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x04,0x04,0x18, +0x00,0x2d,0x00,0x44,0x00,0x86,0x40,0x57,0x66,0x40,0x01,0x67,0x3e,0x01,0x94,0x39,0x01,0x76,0x39,0x86,0x39,0x02,0x69,0x36,0x01,0x5a,0x29,0x01,0x49,0x29,0x01,0x67,0x17,0x01,0x93,0x16,0x01,0x86,0x16,0x01,0x75,0x16,0x01,0x66,0x16,0x01,0x95,0x15,0x01,0x85,0x14,0x01,0x77,0x0f,0x01,0x75,0x0e,0x01,0x89,0x02,0x99,0x02,0x02,0x1f, +0x1f,0x11,0x84,0x33,0x2e,0x42,0x84,0x00,0x00,0x07,0x33,0x33,0x26,0x46,0x3b,0x84,0x07,0x07,0x1b,0x84,0x26,0x2e,0x38,0x1f,0x95,0x21,0x1b,0x38,0x95,0x0c,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x3e,0x03,0x17,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x04,0x15,0x14,0x06, +0x01,0x5c,0x22,0x32,0x3c,0x32,0x22,0x43,0x78,0xa6,0x64,0x64,0xa8,0x78,0x43,0x4d,0x7d,0xa0,0xa6,0xa0,0x3e,0x10,0x15,0x2f,0x33,0x02,0xb1,0xfd,0x4f,0x39,0x5a,0x3f,0x21,0x28,0x23,0x3c,0x46,0x25,0x0a,0x6e,0x43,0x90,0x78,0x4d,0x2a,0x4d,0x6b,0x41,0x96,0x8f,0x1e,0x2e,0x34,0x2e,0x1e,0x0b,0x01,0x01,0x29,0x45,0x40,0x40,0x48,0x55, +0x35,0x58,0x81,0x55,0x29,0x39,0x65,0x8d,0x54,0x54,0x9b,0x8f,0x87,0x7f,0x7a,0x3b,0x0f,0x2d,0x0e,0x23,0x36,0x94,0x23,0x40,0x5b,0x38,0x2d,0x51,0x20,0x35,0x54,0x4b,0x48,0x43,0x3a,0x70,0x77,0x84,0x4e,0x3b,0x60,0x44,0x25,0x68,0x6a,0x23,0x41,0x3e,0x3d,0x41,0x45,0x27,0x2a,0x44,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x87,0x04,0x18, +0x00,0x17,0x00,0x55,0x40,0x31,0x86,0x10,0x96,0x10,0x02,0x75,0x10,0x01,0x6a,0x03,0x01,0x59,0x03,0x01,0x06,0x14,0x01,0x14,0x00,0x15,0x15,0x12,0x84,0x02,0x00,0x00,0x07,0x02,0x02,0x09,0x19,0x0d,0x0b,0x07,0x84,0x09,0x00,0x14,0x95,0x09,0x17,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x00,0x3f,0x3f,0xed,0x33,0x3f,0xc4,0xed,0x39, +0x01,0x2f,0xfd,0xc4,0x33,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x25,0x24,0x11,0x10,0x25,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x21,0x15,0x21,0x02,0x5b,0x01,0x17,0xfe,0xfe,0x85,0xa1,0xa4,0xa4,0x04,0x74,0xe6,0x9e,0xd0, +0xc0,0x01,0x31,0xfd,0xd4,0x47,0x95,0x01,0x63,0x01,0x3e,0x11,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xea,0xf0,0xf7,0xbb,0x8c,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0xa5,0x40,0x3c,0x79,0x06,0x01,0x9b,0x06,0x01,0x8b,0x06,0x01,0x66,0x0b,0x01,0x56,0x0b,0x01,0x79,0x06,0x01,0x0d,0x10,0x0b,0x0c, +0x00,0x4c,0x38,0x03,0x01,0x01,0x15,0x03,0x0c,0x95,0x05,0x16,0x10,0x0f,0x08,0x0f,0x01,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0f,0x01,0x0f,0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0x40,0x2a,0x0b,0x06,0x4d,0x0f,0x0f, +0x13,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0a,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x02,0x0b,0x06,0x4d,0x07,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0xed,0x32, +0x3f,0x5d,0x31,0x30,0x2b,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x90,0xfe,0x29, +0x04,0xbe,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x28,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x00,0x12,0x84,0x03,0x01,0x0f,0x0f,0x15,0x09,0x84,0x07,0x11,0x00,0x09,0x0f,0x0c,0x95,0x02,0x05,0x16,0x13,0x95,0x01,0x1b,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f, +0xc4,0x33,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x33,0x04,0xbe,0xfe,0x80,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xdc,0xfe,0x29,0x02,0x79,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xf8,0xd5, +0x00,0x01,0x00,0x8f,0xff,0xe8,0x06,0x17,0x04,0x18,0x00,0x26,0x00,0x53,0x40,0x33,0x94,0x24,0x01,0x85,0x16,0x01,0x66,0x16,0x76,0x16,0x02,0x9c,0x11,0x01,0x79,0x03,0x89,0x03,0x02,0x68,0x03,0x01,0x14,0x84,0x12,0x1c,0x1e,0x09,0x84,0x1c,0x00,0x84,0x02,0x0b,0x1c,0x20,0x04,0x95,0x23,0x10,0x14,0x1d,0x0f,0x17,0x95,0x0d,0x10,0x16, +0x01,0x0a,0x15,0x00,0x3f,0xc4,0x3f,0x33,0xed,0x3f,0xc4,0x3f,0xed,0x33,0x01,0x2f,0xc4,0xdc,0xed,0x10,0xfd,0xc4,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x33, +0x36,0x36,0x33,0x32,0x16,0x15,0x06,0x17,0xa4,0xd0,0x39,0x5e,0x42,0x25,0xa4,0x04,0x33,0x8b,0x60,0xfe,0xb0,0xa3,0xda,0x36,0x5a,0x41,0x24,0xa4,0x04,0x3a,0x9c,0x5c,0x96,0xa6,0x02,0x48,0x01,0x46,0x33,0x56,0x71,0x3e,0xfd,0xaa,0xa2,0x5e,0x5c,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x34,0x58,0x74,0x40,0x02,0x4e,0xaa,0x61,0x61, +0xd8,0xce,0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x53,0x40,0x0b,0x28,0x11,0x01,0x76,0x11,0x86,0x11,0x96,0x11,0x03,0x10,0xb8,0xff,0xe0,0x40,0x29,0x10,0x14,0x48,0x05,0x10,0x15,0x10,0x25,0x10,0x03,0x86,0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x69,0x03,0x01,0x12,0x84,0x01,0x01,0x14,0x0b,0x07,0x84,0x09, +0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x09,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74, +0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfb,0xe1,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x10,0x04,0x18,0x00,0x28,0x00,0x3d,0x00,0x70,0x40,0x47,0x55,0x31,0x01,0x46,0x31,0x01,0x45,0x2b,0x01,0x5a,0x21,0x01,0x7a,0x1b,0x01,0x69,0x1b,0x01,0x38,0x12,0x01,0x74,0x0e,0x01,0x9a,0x08,0x01,0x89, +0x08,0x01,0x8a,0x07,0x01,0x54,0x02,0x01,0x45,0x02,0x01,0x27,0x15,0x00,0x84,0x38,0x38,0x1e,0x3f,0x0b,0x83,0x0a,0x0a,0x2e,0x83,0x1e,0x28,0x0f,0x29,0x95,0x25,0x23,0x10,0x33,0x95,0x17,0x0b,0x19,0x16,0x10,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0xce,0x33,0xed,0x3f,0x33,0xed,0x3f,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f, +0xed,0xc4,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x10,0x00,0x23,0x22,0x2e,0x04,0x35,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x35,0x33,0x05,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02, +0x35,0x35,0x34,0x2e,0x02,0x04,0x10,0xfe,0xf7,0xf5,0x20,0x59,0x60,0x5f,0x4b,0x2f,0xa8,0x35,0x4f,0x5d,0x27,0x51,0x81,0x5a,0x30,0x04,0x75,0xeb,0x6a,0x9f,0x6a,0x35,0x38,0x73,0xb1,0x79,0xcf,0x64,0x04,0xa4,0xfe,0x3c,0x58,0x7b,0x4e,0x23,0x24,0x4a,0x71,0x4e,0x48,0x73,0x51,0x2b,0x2c,0x4e,0x69,0x52,0xfe,0xe6,0xfe,0xe6,0x0d,0x20, +0x35,0x52,0x70,0x4a,0x3f,0x57,0x35,0x17,0x32,0x65,0x96,0x65,0x70,0xc4,0x50,0x89,0xb7,0x67,0x74,0xcf,0x9b,0x5b,0xa6,0x8e,0x72,0x44,0x74,0x98,0x54,0x4a,0x88,0x68,0x3e,0x38,0x5f,0x7f,0x47,0x97,0x3c,0x6b,0x51,0x30,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0x02,0x04,0x00,0x00,0x05,0x00,0x1a,0x40,0x0c,0x01,0x01,0x07,0x00,0x84,0x03, +0x05,0x0f,0x00,0x95,0x03,0x15,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x25,0x21,0x15,0x21,0x11,0x33,0x01,0x4a,0x01,0xb8,0xfd,0xa4,0xa4,0x98,0x98,0x04,0x00,0x00,0x00,0x01,0x00,0x8f,0xfe,0x29,0x06,0x17,0x05,0xec,0x00,0x26,0x00,0x55,0x40,0x35,0x94,0x24,0x01,0x85,0x16,0x01,0x66,0x16,0x76,0x16,0x02,0x9c, +0x11,0x01,0x79,0x03,0x89,0x03,0x02,0x68,0x03,0x01,0x14,0x84,0x12,0x1c,0x1e,0x09,0x84,0x1c,0x00,0x84,0x02,0x0b,0x1c,0x20,0x04,0x95,0x23,0x10,0x1d,0x00,0x14,0x0f,0x17,0x95,0x0d,0x10,0x16,0x0a,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x3f,0xed,0x33,0x01,0x2f,0xc4,0xdc,0xed,0x10,0xfd,0xc4,0x10,0xdc,0xed,0x31, +0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x23,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x06,0x17,0xa4,0xd0,0x39,0x5e,0x42,0x25,0xa4,0x04,0x33,0x8b,0x60,0xfe,0xb0,0xa3,0xda,0x36,0x5a,0x41, +0x24,0xa4,0x04,0x3a,0x9c,0x5c,0x96,0xa6,0x02,0x48,0x01,0x46,0x33,0x56,0x71,0x3e,0xfb,0xd3,0x02,0x79,0x5e,0x5c,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x34,0x58,0x74,0x40,0x04,0x3a,0xfd,0x6a,0x61,0x61,0xd8,0xce,0x00,0x02,0x00,0x00,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x62,0x40,0x3b,0x4a,0x21,0x5a,0x21, +0x02,0x43,0x1f,0x53,0x1f,0x02,0x66,0x09,0x76,0x09,0x02,0x12,0x12,0x0a,0x83,0x20,0x20,0x17,0x27,0x05,0x03,0x1a,0x14,0x0f,0x11,0x84,0x01,0x00,0x17,0x11,0x01,0x95,0x17,0x00,0x14,0x10,0x14,0x20,0x14,0x03,0x14,0x16,0x1b,0x1d,0x95,0x0f,0x0d,0x16,0x23,0x95,0x04,0x07,0x10,0x02,0x0f,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x33,0xed,0x3f, +0xdd,0x5d,0xc4,0xfd,0xc4,0x01,0x2f,0xcd,0xc4,0xfd,0x32,0xc4,0xc4,0xc4,0x32,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x15,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x35,0x23,0x01,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23, +0x22,0x06,0xa6,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x6c,0x04,0x03,0x0a,0xfc,0xf6,0xa4,0xa6,0x01,0x4a,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0xa7,0x04,0xa7,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0xac,0xfe,0xc5,0x98,0x98,0x98,0x03,0x70,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0x60,0xff,0xe8, +0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x85,0x40,0x1f,0x19,0x40,0x0b,0x02,0x4d,0x12,0x95,0x00,0x16,0x0c,0x95,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x0b,0x0c,0x06,0x4d,0x20,0x15,0x30,0x15,0x90, +0x15,0x03,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d, +0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x18,0x01,0x1f,0xed, +0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x03,0x00,0x60,0xfe,0x29,0x05,0x1f,0x05,0xec,0x00,0x0a,0x00,0x2f,0x00,0x38,0x00,0x93,0x40,0x5e,0x45,0x2d,0x01,0x46,0x2c,0x01,0x95,0x27,0x01,0x76,0x27,0x01,0x99,0x1c,0x01,0x96,0x16,0x01,0x34,0x16,0x01,0x25,0x16,0x01, +0x14,0x16,0x01,0x05,0x16,0x01,0x96,0x15,0x01,0x49,0x10,0x01,0x4c,0x0f,0x01,0x5b,0x08,0x01,0x3a,0x08,0x01,0x29,0x08,0x01,0x39,0x03,0x49,0x03,0x69,0x03,0x03,0x1e,0x83,0x30,0x19,0x2a,0x83,0x00,0x2f,0x05,0x25,0x84,0x19,0x12,0x83,0x13,0x35,0x0d,0x19,0x13,0x13,0x06,0x19,0x19,0x05,0x0d,0x36,0x95,0x25,0x35,0x24,0x00,0x18,0x06, +0x95,0x2f,0x0d,0x13,0x0b,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0xc4,0xc4,0xde,0xed,0x10,0xfd,0xc4,0xc4,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x02,0x27,0x11,0x3e, +0x03,0x01,0x23,0x11,0x2e,0x03,0x35,0x33,0x14,0x1e,0x02,0x17,0x11,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x14,0x1e,0x02,0x17,0x11,0x22,0x06,0x04,0x6f,0x29,0x53,0x7d,0x54,0x4c,0x7b,0x57,0x2f,0xfe,0xb3,0xa8,0x71,0xc5,0x91,0x53,0xb1,0x38,0x62,0x84,0x4b,0x6d,0x9c,0x63,0x2f,0x37, +0x69,0x99,0x62,0xa8,0x80,0xbf,0x7f,0x3f,0x4e,0x89,0xba,0x6c,0xfe,0x6d,0x29,0x43,0x54,0x2b,0x7c,0x6f,0x01,0xe9,0x3f,0x64,0x50,0x40,0x1b,0xfd,0x4f,0x0b,0x32,0x55,0x7c,0xfc,0x95,0x01,0xc2,0x07,0x49,0x84,0xbd,0x7d,0x50,0x83,0x60,0x3a,0x08,0x02,0xde,0x1e,0x47,0x56,0x67,0x3c,0x46,0x6f,0x4e,0x29,0xfd,0xea,0x1e,0x61,0x7c,0x9b, +0x57,0x7e,0xb7,0x7b,0x42,0x0a,0x04,0xd7,0x30,0x3b,0x2e,0x22,0x0d,0x01,0x56,0x4f,0x00,0x01,0x00,0x90,0xff,0xe8,0x05,0x5e,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x27,0x76,0x0b,0x01,0x67,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x84,0x03,0x01,0x0f,0x13,0x0f,0x13,0x15,0x09,0x84,0x07,0x11,0x0f,0x09,0x00,0x0c,0x95, +0x02,0x05,0x16,0x12,0x95,0x01,0x15,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xc4,0x33,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x21,0x05,0x5e,0xfd,0xe0,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78, +0x9b,0xa4,0x01,0x7c,0xa2,0xba,0x01,0xb4,0x04,0x50,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x98,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x36,0x40,0x12,0x00,0xb0,0x06,0x10,0x12,0xb0,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f, +0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f, +0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0x00,0x2a,0x00,0x00,0x02,0x19,0x00,0xc8,0x00,0x09,0x00,0x35,0x40,0x1f,0x07,0x08,0x08,0x0b,0x73,0x03,0x83,0x03,0x02,0x55,0x03,0x65,0x03,0x02,0x46,0x03,0x01,0x27,0x03,0x37,0x03,0x02,0x03,0x02,0x02,0x03, +0x07,0x05,0x08,0x00,0x15,0x00,0x3f,0x32,0xdd,0x32,0xce,0x32,0x01,0x2f,0x33,0x71,0x71,0x71,0x71,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x22,0x27,0x37,0x16,0x33,0x32,0x37,0x17,0x06,0x01,0x19,0xa6,0x49,0x59,0x27,0x70,0x66,0x7b,0x1e,0x84,0x86,0x42,0x59,0x20,0x63,0x2c,0x00,0x01,0x00,0x90,0xff,0xe8,0x08,0x69,0x05,0xec,0x00,0x23, +0x00,0x79,0x40,0x4b,0x9b,0x20,0x01,0x85,0x13,0x01,0x76,0x13,0x01,0x67,0x13,0x01,0x85,0x0b,0x01,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x9b,0x06,0x01,0x03,0x01,0x23,0x84,0x0f,0x12,0x84,0x21,0x1d,0x1b,0x19,0x84,0x17,0x80,0x0f,0x01,0x4f,0x21,0x01,0x0f,0x21,0x17,0x17,0x21,0x0f,0x03,0x25,0x09,0x84,0x07,0x23,0x95,0x10,0x00, +0x18,0x09,0x0f,0x1c,0x14,0x95,0x1f,0x0c,0x95,0x02,0x05,0x16,0x1a,0x00,0x15,0x00,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0xed,0x33,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0xc4,0x32,0x10,0xed,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06, +0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x21,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7c,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xfe,0xcb,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd, +0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x08,0x9b,0x05,0xec,0x00,0x28,0x00,0x8c,0x40,0x58,0x85,0x20,0x01,0x66,0x20,0x76,0x20,0x02,0x57,0x20,0x01,0x9b,0x1b,0x01,0x9a,0x10,0x01,0x85,0x03,0x01,0x66,0x03,0x76,0x03, +0x02,0x18,0x16,0x15,0x84,0x24,0x27,0x01,0x84,0x12,0x0d,0x0b,0x07,0x28,0x28,0x09,0x84,0x07,0x20,0x24,0x80,0x24,0x02,0x3f,0x12,0x01,0x10,0x07,0x70,0x07,0x02,0x24,0x12,0x07,0x07,0x12,0x24,0x03,0x2a,0x1e,0x84,0x1c,0x08,0x00,0x95,0x1e,0x27,0x0f,0x14,0x95,0x25,0x00,0x0c,0x04,0x95,0x0f,0x21,0x95,0x17,0x1a,0x16,0x0b,0x15,0x0f, +0x00,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0xed,0x33,0x3f,0xed,0x3f,0xc4,0xfd,0xce,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xc4,0x32,0x10,0xfd,0xc4,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23, +0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x21,0x08,0x9b,0xfd,0x20,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x02,0xe0,0x03,0x68,0xfe,0x50,0xfe,0xba,0xb9, +0x8d,0x01,0x18,0xfd,0x30,0xaa,0xc2,0xd9,0xcd,0x03,0xc6,0xfa,0xac,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfe,0x14,0x00,0x00,0x01,0x00,0x90,0xfe,0x29,0x08,0x69,0x05,0xec,0x00,0x23,0x00,0x81,0x40,0x52,0x92,0x22,0x01,0x85,0x17,0x01,0x66,0x17,0x76,0x17,0x02,0x57,0x17,0x01,0x9b,0x12,0x01,0x8a, +0x03,0x01,0x79,0x03,0x01,0x68,0x03,0x01,0x0f,0x0d,0x0b,0x84,0x1b,0x1f,0x1d,0x07,0x84,0x09,0x23,0x84,0x02,0x20,0x1b,0x80,0x1b,0x02,0x7f,0x09,0x01,0x10,0x02,0x01,0x1b,0x09,0x02,0x02,0x09,0x1b,0x03,0x25,0x15,0x84,0x13,0x1e,0x04,0x95,0x21,0x10,0x0a,0x95,0x1c,0x00,0x15,0x0f,0x18,0x95,0x0e,0x11,0x16,0x01,0x0c,0x15,0x08,0x1b, +0x00,0x3f,0x3f,0xc4,0x3f,0x33,0xed,0x3f,0x3f,0xed,0x3f,0xed,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x33,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20, +0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x33,0x36,0x33,0x20,0x11,0x08,0x69,0xa4,0xee,0x78,0xa4,0xa4,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0x2b,0xfa,0xac,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe, +0xbc,0xb1,0x8f,0x04,0x3a,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x01,0x00,0x90,0xfe,0x29,0x08,0x69,0x05,0xec,0x00,0x25,0x00,0x81,0x40,0x51,0x85,0x21,0x01,0x66,0x21,0x76,0x21,0x02,0x57,0x21,0x01,0x9c,0x1c,0x01,0x9b,0x10,0x01,0x75,0x03,0x85,0x03,0x02,0x66,0x03,0x01,0x16,0x14,0x84,0x19,0x17,0x25,0x02,0x84,0x11,0x0d,0x0b,0x09,0x84, +0x07,0x80,0x25,0x01,0x4f,0x11,0x01,0xc0,0x07,0x01,0x25,0x11,0x07,0x07,0x11,0x25,0x03,0x27,0x1f,0x84,0x1d,0x08,0x1f,0x0f,0x15,0x95,0x17,0x1b,0x22,0x95,0x18,0x1b,0x0c,0x04,0x95,0x0f,0x16,0x0a,0x15,0x12,0x95,0x00,0x00,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x33,0xd4,0x32,0xed,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f, +0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0xc4,0x33,0x10,0xed,0x10,0xc4,0x33,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x03, +0x3e,0x02,0x7c,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xfe,0xcb,0xa5,0xfe,0xb7,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x05,0xec,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0xf9,0x6d,0x98,0x02,0x79,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x00,0x00,0x01, +0x00,0x90,0xfe,0x29,0x0a,0xc2,0x05,0xec,0x00,0x31,0x00,0x90,0x40,0x59,0x85,0x2b,0x01,0x76,0x2b,0x01,0x67,0x2b,0x01,0x83,0x1d,0x01,0x66,0x1d,0x76,0x1d,0x02,0x57,0x1d,0x01,0x9b,0x18,0x01,0x9a,0x09,0x01,0x88,0x09,0x01,0x9b,0x06,0x01,0x15,0x13,0x11,0x84,0x21,0x25,0x23,0x0d,0x84,0x0f,0x29,0x84,0x07,0x03,0x01,0x31,0x84,0x2f, +0x21,0x0f,0x07,0x2f,0x2f,0x07,0x0f,0x21,0x04,0x33,0x1b,0x84,0x19,0x24,0x0a,0x95,0x27,0x10,0x10,0x95,0x22,0x00,0x30,0x1b,0x0f,0x2c,0x95,0x02,0x05,0x1e,0x95,0x14,0x17,0x16,0x01,0x12,0x15,0x0e,0x1b,0x00,0x3f,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0x32,0xed,0x3f,0xc4,0x3f,0xed,0x3f,0xed,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f, +0x2f,0x2f,0x10,0xed,0xc4,0x32,0x10,0xed,0x10,0xfd,0xc4,0x33,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21, +0x11,0x33,0x36,0x33,0x20,0x11,0x15,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x0a,0xc2,0xa4,0x04,0x66,0xc7,0xfe,0xab,0xc1,0x78,0xa4,0xa4,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x04,0x76,0xda,0x01,0x2c,0xdf,0x69,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0xb2,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0x2b,0xfa,0xac, +0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfd,0x6a,0xc2,0xfe,0x5f,0xc1,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x83,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x2b,0x00,0x5a,0x40,0x30,0x0f,0x09,0x1c,0x1b,0x11,0x0e,0x7e,0x01,0x2a,0x14,0x01,0x08,0x09,0x1b,0x01,0x01,0x1b,0x09,0x03,0x2d,0x24,0x00, +0x08,0x14,0x23,0x92,0x24,0x11,0x2b,0x92,0x0e,0x00,0x00,0x00,0x24,0x10,0x24,0x02,0x24,0x24,0x08,0x1c,0x12,0x0b,0x07,0x92,0x08,0x03,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x5d,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xed,0x32,0x11,0x33,0x11,0x33, +0x31,0x30,0x13,0x21,0x2e,0x03,0x23,0x23,0x35,0x21,0x15,0x21,0x16,0x16,0x17,0x21,0x15,0x21,0x06,0x06,0x07,0x15,0x1e,0x03,0x17,0x13,0x23,0x03,0x2e,0x03,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x37,0x21,0x83,0x01,0xe5,0x08,0x25,0x43,0x63,0x44,0xce,0x03,0x87,0xfe,0xb8,0x1d,0x25,0x06,0x01,0x00,0xfe,0xfb,0x15,0x9b,0x77,0x22,0x38, +0x34,0x33,0x1d,0xff,0xbe,0xe4,0x21,0x3b,0x43,0x51,0x36,0x70,0xcd,0x33,0x5c,0x49,0x33,0x0b,0xfe,0x1d,0x04,0x53,0x2a,0x45,0x31,0x1b,0x8c,0x8c,0x25,0x5d,0x39,0x8c,0x78,0xa9,0x20,0x04,0x10,0x2a,0x37,0x48,0x2e,0xfe,0x65,0x01,0x7e,0x37,0x54,0x38,0x1c,0x89,0x21,0x3b,0x53,0x32,0x00,0x02,0x00,0x37,0x00,0x00,0x04,0x1a,0x05,0x9a, +0x00,0x07,0x00,0x0b,0x00,0x3b,0x40,0x1f,0x0b,0x00,0x02,0x7e,0x08,0x05,0x00,0x0d,0x05,0x0c,0x03,0x03,0x0d,0x0c,0x01,0x05,0x91,0x00,0x06,0x10,0x06,0x02,0x06,0x06,0x03,0x08,0x91,0x09,0x03,0x03,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0xed,0x11,0x33,0x31, +0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x25,0x35,0x21,0x15,0x04,0x1a,0xfe,0x62,0xa8,0xfe,0x63,0x03,0xe3,0xfc,0x1d,0x03,0xe3,0x03,0xdc,0xfc,0x24,0x03,0xdc,0x98,0x8e,0x98,0x98,0xff,0xff,0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4c,0x00,0x00,0x00,0x02,0x00,0x5c,0xff,0xe7,0x03,0xf4,0x04,0x19,0x00,0x0d, +0x00,0x18,0x00,0x22,0xbc,0x00,0x00,0x01,0x86,0x00,0x0e,0x00,0x13,0x01,0x86,0x40,0x09,0x08,0x10,0x9a,0x0b,0x10,0x16,0x9a,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf4, +0x3d,0x77,0xaf,0x72,0xd9,0xea,0xf4,0xeb,0xe0,0xd9,0xac,0xfe,0xe9,0x8f,0x9c,0x91,0x90,0x8c,0x95,0x02,0x04,0x83,0xc9,0x8a,0x47,0x01,0x06,0xff,0x01,0x14,0x01,0x19,0xfe,0xf0,0xfe,0xf5,0x01,0x93,0xcb,0xd0,0xbf,0xc8,0xcd,0x00,0x00,0x01,0x00,0x79,0x00,0x00,0x02,0x71,0x04,0x1e,0x00,0x0e,0x00,0x24,0xbc,0x00,0x00,0x01,0x86,0x00, +0x01,0x00,0x08,0x01,0x81,0x40,0x09,0x02,0x0d,0x07,0x07,0x01,0x0d,0x10,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0x71,0xac,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x46,0x03,0x3b,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f, +0x33,0x3f,0x45,0x21,0x00,0x01,0x00,0x99,0x00,0x00,0x03,0xd3,0x04,0x1b,0x00,0x26,0x00,0x34,0xb9,0x00,0x1b,0x01,0x86,0xb5,0x12,0x0a,0x0a,0x00,0x25,0x24,0xb8,0x01,0x86,0xb6,0x00,0x03,0x0a,0x12,0x03,0x24,0x0d,0xb8,0x01,0x7f,0xb5,0x16,0x10,0x24,0x99,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x2f,0x12, +0x39,0x2f,0x39,0xed,0x31,0x30,0x33,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x06,0x15,0x21,0x15,0x99,0x32,0x53,0x69,0x6e,0x69,0x53,0x32,0x7a,0x67,0x27,0x55,0x57,0x54,0x25,0x48,0xb5,0x67,0x5b,0x8a,0x5e,0x30,0x33,0x52,0x6a,0x6f,0x6a,0x52,0x33,0x02,0x93, +0x58,0x48,0x6d,0x56,0x44,0x3b,0x3a,0x40,0x4e,0x33,0x55,0x5d,0x12,0x20,0x2c,0x1a,0x9d,0x36,0x31,0x2b,0x4f,0x70,0x45,0x40,0x67,0x55,0x46,0x3e,0x39,0x3b,0x3f,0x26,0x93,0x00,0x00,0x01,0x00,0x7b,0xfe,0x50,0x03,0xb8,0x04,0x1b,0x00,0x2a,0x00,0x43,0x40,0x1b,0x16,0x89,0x1b,0x13,0x25,0x03,0x08,0x23,0x23,0x08,0x00,0x89,0x0f,0x0f, +0x2c,0x08,0x25,0x12,0x9a,0x08,0x05,0x1b,0x1e,0x13,0x13,0x05,0x18,0xb8,0x01,0x7f,0xb4,0x1e,0x10,0x0a,0x9a,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02, +0x35,0x10,0x21,0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb8,0x4a,0x85,0xb9,0x6f,0xcb,0x7b,0x91,0xbb,0x4a,0x7a,0x56,0x2f,0xfe,0x71,0x77,0x71,0x01,0x62,0xfe,0xf2,0x4b,0x90,0x42,0x88,0xbe,0x5b,0x92,0x68,0x38,0xfe,0xe1,0x4b,0x7c,0x59,0x32,0x02,0x60, +0x9f,0x71,0x3e,0x4e,0xb0,0x73,0x27,0x48,0x66,0x40,0x01,0x18,0x8b,0x01,0x09,0xf3,0x33,0x33,0xa0,0x52,0x32,0x5b,0x7e,0x4b,0xfe,0xe6,0x53,0x04,0x07,0x37,0x59,0x78,0x00,0x02,0x00,0x32,0xfe,0x68,0x04,0x2e,0x04,0x02,0x00,0x0e,0x00,0x15,0x00,0x31,0xb2,0x10,0x0e,0x05,0xb8,0x01,0x85,0x40,0x12,0x0f,0x09,0x06,0x06,0x17,0x09,0x11, +0x07,0x0e,0x10,0x09,0x01,0x10,0x9a,0x04,0x07,0x18,0x06,0x00,0x2f,0x3f,0x33,0xed,0x32,0x32,0x3f,0x12,0x39,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x76,0xb8,0xb8,0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe, +0x24,0x01,0xe9,0x46,0x83,0x7b,0x72,0x04,0x02,0xfc,0x83,0x85,0xfe,0x68,0x01,0x98,0x7d,0x64,0xe3,0xea,0xe9,0x6b,0xfc,0x83,0x02,0x89,0x75,0xbc,0x9b,0x82,0x00,0x01,0x00,0xa4,0xfe,0x4d,0x03,0xc9,0x04,0x00,0x00,0x23,0x00,0x35,0xb9,0x00,0x1c,0x01,0x85,0xb3,0x17,0x17,0x08,0x00,0xb8,0x01,0x86,0xb2,0x0f,0x08,0x12,0xb8,0x01,0x7f, +0xb7,0x1f,0x1f,0x0a,0x1b,0x99,0x18,0x0f,0x0a,0xb9,0x01,0x7f,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e, +0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92,0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97,0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x1c,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00, +0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x36,0xb3,0x12,0x2b,0x19,0x00,0xbb,0x01,0x86,0x00,0x21,0x00,0x19,0x01,0x86,0x40,0x0c,0x0a,0x26,0x9a,0x19,0x1c,0x1c,0x30,0x14,0x9a,0x0f,0x06,0x30,0xb8,0x01,0x7f,0xb1,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x2f, +0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8, +0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e,0x3b,0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d, +0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37,0x2f,0x54,0x75,0x00,0x00,0x01,0x00,0x45,0xfe,0x66,0x03,0xd5,0x04,0x00,0x00,0x12,0x00,0x22,0xb9,0x00,0x07,0x01,0x86,0x40,0x0c,0x0f,0x08,0x08,0x00,0x10,0x00,0x00,0x10,0x99,0x11,0x0f,0x08,0x00,0x2f,0x3f,0xed,0x39,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x0e,0x03,0x02, +0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02,0x37,0x21,0x35,0x21,0x03,0xd5,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x03,0xa1,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x03,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2, +0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x47,0x40,0x25,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x00,0x05,0x15,0x33,0x9a,0x3d,0x3d,0x0d,0x29,0x99,0x1f,0x18,0x47,0x9a,0x0d,0x06,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f, +0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02, +0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c,0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31, +0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35,0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f,0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57, +0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58,0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xfe,0x4e,0x03,0xec,0x04,0x19,0x00,0x20,0x00,0x34,0x00,0x33,0x40,0x16,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36,0x2b,0x89,0x17,0x30,0x99,0x0f,0x12,0x12,0x05,0x26,0x9a,0x1c,0x10,0x0a,0xb9,0x01,0x7f,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed, +0x11,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec, +0x4e,0x96,0xd8,0x8a,0x8e,0x6c,0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b,0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x01,0x8a,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a, +0xb0,0x7f,0x46,0x57,0xa7,0xf4,0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49,0x63,0xff,0xff,0x00,0x5c,0xff,0xe7,0x03,0xf4,0x04,0x19,0x02,0x06,0x0c,0xb9,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x02,0xe0,0x04,0x1e,0x00,0x0e,0x00,0x24,0xbc,0x00,0x00,0x01,0x86,0x00,0x01,0x00,0x08,0x01,0x81,0x40, +0x09,0x02,0x0d,0x07,0x07,0x01,0x0d,0x10,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0xe0,0xac,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x46,0x03,0x3b,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0xff,0xff, +0x00,0x99,0x00,0x00,0x03,0xd3,0x04,0x1b,0x02,0x06,0x0c,0xbb,0x00,0x00,0xff,0xff,0x00,0x7b,0xfe,0x50,0x03,0xb8,0x04,0x1b,0x02,0x06,0x0c,0xbc,0x00,0x00,0xff,0xff,0x00,0x32,0xfe,0x68,0x04,0x2e,0x04,0x02,0x00,0x06,0x0c,0xbd,0x00,0x00,0xff,0xff,0x00,0xa4,0xfe,0x4d,0x03,0xc9,0x04,0x00,0x02,0x06,0x0c,0xbe,0x00,0x00,0xff,0xff, +0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x02,0x06,0x0c,0xbf,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x66,0x03,0xf0,0x04,0x00,0x00,0x06,0x0c,0xc0,0x1b,0x00,0xff,0xff,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2,0x02,0x06,0x0c,0xc1,0x00,0x00,0xff,0xff,0x00,0x5e,0xfe,0x4e,0x03,0xec,0x04,0x19,0x02,0x06,0x0c,0xc2,0x00,0x00,0x00,0x02, +0x00,0x56,0xff,0xe7,0x03,0xfc,0x05,0xb2,0x00,0x10,0x00,0x18,0x00,0x20,0x40,0x10,0x00,0x89,0x11,0x11,0x1a,0x15,0x89,0x0a,0x13,0x9a,0x0f,0x07,0x17,0x9a,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x20,0x03, +0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x03,0xfc,0x41,0x7b,0xb3,0x72,0x6c,0xa9,0x74,0x3c,0x3f,0x7a,0xb5,0x75,0x01,0xc3,0xa8,0xfe,0xdd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x02,0xd3,0xb4,0xfe,0xea,0xbf,0x63,0x5f,0xb6,0x01,0x09,0xab,0xbc,0x01,0x20,0xc3,0x63,0xfd,0x11,0x02,0x64,0xfd,0x91,0xfd,0xbb,0x00,0x00,0x01,0x00,0x53,0x00,0x00, +0x02,0x43,0x05,0xba,0x00,0x0e,0x00,0x28,0x40,0x13,0x0e,0x8a,0x00,0x06,0x00,0x06,0x00,0x0f,0x10,0x07,0x99,0x01,0x0c,0x06,0x06,0x0c,0x07,0x00,0x18,0x00,0x3f,0x3f,0x39,0x2f,0x12,0x39,0xed,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x21,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x11,0x01,0x9f,0x13,0x49,0x5b, +0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x3e,0x04,0xd7,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0xfa,0x46,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x03,0xe2,0x05,0xb2,0x00,0x2a,0x00,0x2e,0x40,0x17,0x1e,0x13,0x89,0x0a,0x21,0x00,0x00,0x2c,0x1d,0x89,0x21,0x00,0x0e,0x1d,0x99,0x20,0x18,0x0a,0x0a,0x05,0x9a,0x0e,0x07,0x00, +0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x32,0x31,0x30,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x21,0x15,0x21,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x03,0x04,0x29,0x47,0x60,0x38,0x30,0x5c,0x57,0x51, +0x23,0x45,0xab,0x7b,0x58,0x96,0x6e,0x3f,0x27,0x4f,0x78,0x51,0x65,0x83,0x4d,0x1f,0x02,0xca,0xfc,0x8b,0x28,0x5c,0x95,0x6c,0x4e,0x69,0x40,0x1b,0x04,0x22,0x42,0x62,0x41,0x20,0x1a,0x2e,0x40,0x27,0xb0,0x43,0x47,0x33,0x62,0x90,0x5d,0x55,0x8a,0x7a,0x70,0x3a,0x48,0x66,0x59,0x59,0x3a,0x93,0x47,0x5c,0x8c,0x7e,0x7e,0x4f,0x38,0x66, +0x66,0x69,0x00,0x01,0x00,0x7b,0xff,0xe7,0x03,0xb9,0x05,0xb2,0x00,0x29,0x00,0x55,0x40,0x32,0x16,0x89,0x1a,0x13,0x24,0x03,0x08,0x22,0x22,0x08,0x00,0x89,0x0f,0x0f,0x2b,0x08,0x39,0x1a,0x01,0x2f,0x1a,0x01,0x1a,0x1a,0x18,0x9a,0x1d,0x24,0x12,0x9a,0x13,0x13,0x1d,0x07,0x36,0x08,0x01,0x00,0x08,0x10,0x08,0x20,0x08,0x03,0x08,0x08, +0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x3f,0x39,0x2f,0xed,0x39,0x10,0xed,0x32,0x2f,0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36, +0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb9,0x49,0x85,0xba,0x70,0xcd,0x79,0x91,0xbb,0x4b,0x79,0x57,0x2f,0xfe,0x70,0x77,0x71,0x01,0x62,0xfe,0xf2,0x98,0x85,0x89,0xbd,0x5a,0x92,0x68,0x39,0xfe,0xe2,0x49,0x7c,0x5a,0x33,0x01,0x96,0x61,0x9f,0x71,0x3e,0x4e,0xb0,0x72,0x26,0x48,0x66,0x40,0x01,0x19,0x8b,0x01,0x08, +0xf4,0x66,0x9f,0x52,0x32,0x5a,0x7e,0x4c,0xfe,0xe5,0x51,0x04,0x08,0x37,0x58,0x77,0x00,0x02,0x00,0x32,0x00,0x00,0x04,0x56,0x05,0x9a,0x00,0x0e,0x00,0x15,0x00,0x2e,0x40,0x16,0x10,0x0e,0x04,0x8a,0x07,0x07,0x17,0x0f,0x09,0x04,0x08,0x99,0x09,0x01,0x0f,0x0f,0x06,0x11,0x0e,0x06,0x06,0x18,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x33, +0x33,0xed,0x32,0x01,0x2f,0x33,0x12,0x39,0x2f,0xed,0x33,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x76,0xe0,0xe0,0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe,0x24,0x01,0xe9,0x4b,0x86,0x79,0x6e,0x05,0x9a,0xfc,0x4d,0x96,0xfe,0xaf,0x01,0x51,0x8e,0x6a,0xf1, +0xf8,0xf7,0x71,0xfc,0x4d,0x02,0xbe,0x83,0xce,0xa8,0x88,0x00,0x00,0x01,0x00,0xa4,0xff,0xe7,0x03,0xc9,0x05,0x9a,0x00,0x23,0x00,0x3d,0x40,0x21,0x1c,0x8a,0x1a,0x17,0x17,0x08,0x00,0x89,0x0f,0x0f,0x25,0x08,0x12,0x9a,0x1f,0x1f,0x0a,0x1b,0x99,0x18,0x06,0x32,0x08,0x01,0x20,0x08,0x01,0x08,0x08,0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed, +0x32,0x2f,0x5d,0x5d,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e,0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92, +0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97,0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x01,0xb6,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2, +0x00,0x20,0x00,0x34,0x00,0x37,0x40,0x1c,0x12,0x0a,0x00,0x89,0x21,0x21,0x36,0x2b,0x19,0x89,0x0a,0x26,0x9a,0x1a,0x1c,0x1c,0x30,0x0f,0x12,0x12,0x14,0x9a,0x0f,0x07,0x30,0x9a,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14,0x0e, +0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8,0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e,0x3b, +0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d,0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37,0x2f, +0x54,0x75,0x00,0x01,0x00,0x45,0x00,0x00,0x03,0xd5,0x05,0x9a,0x00,0x12,0x00,0x24,0x40,0x11,0x07,0x89,0x0f,0x00,0x08,0x00,0x08,0x00,0x14,0x10,0x00,0x10,0x99,0x11,0x06,0x08,0x18,0x00,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x01,0x0e,0x03,0x02,0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02, +0x37,0x21,0x35,0x21,0x03,0xd5,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x05,0x3b,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x03,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2,0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x47, +0x40,0x25,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x00,0x15,0x05,0x33,0x9a,0x3d,0x3d,0x0d,0x29,0x99,0x1f,0x19,0x47,0x9a,0x0d,0x07,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39, +0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02, +0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c,0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31,0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35, +0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f,0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57,0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58, +0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xff,0xe7,0x03,0xec,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x35,0x40,0x1b,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36,0x2b,0x89,0x17,0x30,0x99,0x0f,0x12,0x12,0x05,0x26,0x9a,0x1c,0x07,0x08,0x08,0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x2f,0x39,0xed,0x01, +0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec,0x4e,0x96,0xd8,0x8a,0x8e,0x6c, +0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b,0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x03,0x23,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a,0xb0,0x7f,0x46,0x57,0xa7,0xf4, +0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49,0x63,0x00,0x02,0x00,0x56,0xff,0xe8,0x03,0xfc,0x05,0xb2,0x00,0x0a,0x00,0x12,0x00,0x88,0x40,0x1a,0x0f,0x9a,0x00,0x19,0x0b,0x9a,0x06,0x07,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x89,0x11,0xb8,0xff,0xf0,0xb3, +0x0d,0x06,0x4d,0x11,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x30,0x11,0x01,0x11,0xb8,0xff,0xe0,0x40,0x1d,0x0b,0x06,0x4d,0x20,0x11,0x40,0x11,0x02,0x11,0x11,0x14,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x89,0x03,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d, +0x03,0xb8,0xff,0xe0,0xb6,0x0b,0x06,0x4d,0x2f,0x03,0x01,0x03,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x05,0x22,0x02,0x11,0x10,0x12,0x33,0x20,0x11,0x10,0x02,0x03,0x20,0x11,0x10,0x21,0x20,0x11,0x10,0x02,0x1a,0xd5,0xef,0xf9, +0xeb,0x01,0xc2,0xfe,0xcd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x18,0x01,0x6e,0x01,0x5a,0x01,0x7c,0x01,0x86,0xfd,0x21,0xfe,0x94,0xfe,0x81,0x05,0x3f,0xfd,0x91,0xfd,0xba,0x02,0x50,0x02,0x65,0x00,0x01,0x00,0xa8,0x00,0x00,0x03,0xdb,0x05,0xba,0x00,0x09,0x00,0x7e,0xb5,0x26,0x06,0x36,0x06,0x02,0x06,0xb8,0xff,0xf8,0x40,0x2d,0x0d,0x06, +0x4d,0x04,0x08,0x0d,0x06,0x4d,0x06,0x04,0x07,0x05,0x08,0x02,0x99,0x01,0x18,0x05,0x07,0x07,0x01,0x05,0x01,0x00,0x01,0x00,0x01,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x8a,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xd0,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xd6,0xb3,0x0b, +0x06,0x4d,0x03,0xb8,0xff,0xf0,0xb6,0x0b,0x01,0x4d,0x03,0x03,0x0b,0x0a,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x33,0x2f,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x33,0x3f,0xed,0x32,0x2f,0x12,0x39,0x39,0x2b,0x2b,0x31,0x30,0x5d,0x21,0x21,0x35,0x21,0x11,0x05,0x35,0x25,0x11,0x21,0x03,0xdb,0xfc,0xd5,0x01,0x44, +0xfe,0xb4,0x01,0xf0,0x01,0x43,0x90,0x04,0x5a,0x63,0x9c,0x97,0xfa,0xd6,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0xcd,0x05,0xb2,0x00,0x17,0x00,0xa3,0xb3,0x78,0x08,0x01,0x15,0xb8,0xff,0xe8,0x40,0x36,0x0c,0x00,0x4d,0x11,0x06,0x0e,0x02,0x15,0x99,0x01,0x18,0x0b,0x0b,0x09,0x9a,0x0e,0x07,0x0b,0x00,0x10,0x0c,0x06,0x4d,0x00,0x18,0x0b, +0x0d,0x01,0x4c,0x00,0x00,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x11,0x8a,0x20,0x06,0x30,0x06,0x02,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x19,0x0b,0xb8,0xff,0xf8,0x40,0x0c,0x0d,0x06,0x4d,0x0b, +0x16,0x20,0x0b,0x0c,0x01,0x4c,0x16,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x33,0x2b,0x33,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x2b,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x12,0x39,0x39,0x31,0x30,0x01,0x2b,0x5d,0x21, +0x21,0x35,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x07,0x01,0x15,0x21,0x03,0xc0,0xfc,0xa0,0x01,0xa2,0xa0,0x89,0x8e,0x83,0xc0,0xb0,0xa8,0xdf,0xc0,0xdc,0x98,0xc5,0xfe,0xb5,0x02,0x9b,0x92,0x01,0xa3,0xa0,0xd5,0x79,0x7c,0x88,0xa4,0xac,0x83,0xd0,0xaf,0x8a,0xfe,0xf9,0xc3,0xfe,0xb9, +0x04,0x00,0x00,0x01,0x00,0x83,0xff,0xe8,0x03,0xc0,0x05,0xb2,0x00,0x21,0x00,0xe5,0x40,0x3a,0x76,0x1c,0x01,0x74,0x16,0x01,0x7a,0x00,0x01,0x12,0x11,0x00,0x01,0x19,0x09,0x9a,0x0a,0x0a,0x14,0x34,0x01,0x01,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x01,0x01,0x03,0x9a,0x20,0x19,0x3b,0x11,0x01,0x2f,0x11,0x01,0x11,0x11,0x0f,0x9a,0x14, +0x07,0x19,0x09,0x10,0x0c,0x06,0x4d,0x09,0x70,0x11,0x01,0x11,0xb8,0xff,0xf0,0x40,0x3f,0x0d,0x06,0x4d,0x11,0x17,0x06,0x0c,0x06,0x4d,0x17,0x06,0x0b,0x06,0x4d,0x17,0x89,0x0d,0x10,0x0d,0x06,0x4d,0x0d,0x10,0x0c,0x06,0x4d,0x0d,0x14,0x0b,0x06,0x4d,0x0d,0x09,0x11,0x0d,0x03,0x00,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d, +0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x89,0x7f,0x06,0x01,0x06,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x23,0x00,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0x11, +0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x12,0x17,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2f,0x2b,0x5d,0x2f,0x2b,0x39,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x11,0x39,0x2f,0xed,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35, +0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x83,0x93,0xb9,0x96,0xb3,0xfe,0x71,0x77,0x71,0x01,0x63,0xfe,0xf1,0x97,0x86,0x8a,0xbc,0xb5,0xd9,0xfe,0xe0,0x9b,0xb7,0xfe,0xeb,0xe3,0xcc,0x35,0xb1,0x74,0x96,0x7f,0x01,0x19,0x8b,0x01,0x08,0xf4,0x67,0xa0,0x52, +0xc0,0x96,0xfe,0xe5,0x51,0x04,0x0f,0xbb,0x8c,0xc1,0xed,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x8a,0x40,0x16,0x39,0x07,0x79,0x07,0x02,0x76,0x06,0x01,0x09,0x00,0x00,0x02,0x06,0x0b,0x0d,0x06,0x4c,0x02,0x8a,0x0b,0x07,0x03,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xd6,0xb4, +0x0b,0x0c,0x06,0x4c,0x03,0xb8,0xff,0xe0,0xb3,0x0d,0x01,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0b,0x0c,0x01,0x4c,0x03,0x03,0x14,0x12,0x05,0xb8,0xff,0xf8,0x40,0x15,0x0c,0x0d,0x06,0x4c,0x2f,0x05,0x3f,0x05,0x4f,0x05,0x03,0x05,0x01,0x05,0x9a,0x09,0x06,0x12,0x12,0x03,0x0f,0xb8,0xff,0xf0,0xb7,0x0c,0x00,0x4d,0x0f,0x07,0x06,0x03, +0x18,0x00,0x3f,0x3f,0x33,0x2b,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0x5d,0x2b,0x32,0x11,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x33,0x33,0xe9,0x2b,0x32,0x2f,0x32,0x31,0x30,0x00,0x5d,0x01,0x5d,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x01,0x33,0x11,0x33,0x21,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x04,0x0a,0xb8,0xa2,0xfd,0x5e,0x02, +0x7e,0xc6,0xb8,0xfe,0xa6,0x04,0x04,0x0e,0x29,0xfe,0x47,0x01,0x7d,0xfe,0x83,0x01,0x7d,0x6b,0x03,0xb2,0xfc,0x68,0x02,0x6c,0x42,0x52,0x24,0x4a,0xfd,0x6e,0x00,0x01,0x00,0xa4,0xff,0xe8,0x03,0xc8,0x05,0x9a,0x00,0x19,0x00,0xb1,0x40,0x32,0x7a,0x00,0x01,0x00,0x01,0x0b,0x09,0x9a,0x12,0x12,0x0c,0x20,0x01,0x30,0x01,0x02,0x01,0x01, +0x03,0x9a,0x18,0x19,0x0f,0x99,0x0c,0x06,0x0e,0x00,0x0e,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x89,0x7f,0x06,0x01,0x06,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x1b,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xe0,0x40,0x14, +0x0c,0x06,0x4d,0x00,0x10,0x06,0x0c,0x06,0x4d,0x10,0x0e,0x0b,0x06,0x4d,0x10,0x8b,0x70,0x0b,0x01,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0b,0x20,0x0d,0x01,0x4d,0x0b,0x2f,0x2b,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x33,0x2b,0x2b,0x12,0x39, +0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x39,0x2f,0xed,0x32,0x11,0x33,0x31,0x30,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x21,0x15,0x21,0x11,0x36,0x33,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0xa4,0x93,0x98,0x98,0xba,0xbe,0xb1,0x3c,0xa5, +0x02,0xb6,0xfd,0xe5,0x42,0x38,0xe6,0xfc,0xfe,0xf1,0xec,0xc7,0x23,0xae,0x5f,0xac,0x8e,0x8d,0x9e,0x0c,0x02,0xcf,0x94,0xfe,0x5c,0x04,0xe7,0xc9,0xd0,0xfe,0x00,0x02,0x00,0x6e,0xff,0xe8,0x03,0xfe,0x05,0xb2,0x00,0x16,0x00,0x22,0x00,0xae,0x40,0x3b,0x7a,0x14,0x01,0x76,0x0a,0x01,0x29,0x14,0x39,0x14,0x02,0x06,0x0f,0x15,0x17,0x9a, +0x09,0x09,0x15,0x1d,0x9a,0x0f,0x19,0x01,0x01,0x03,0x9a,0x15,0x07,0x01,0x40,0x0c,0x00,0x4d,0x01,0x01,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x89,0x20,0x20,0x30,0x20,0x02,0x20,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x20,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x20,0xb8,0xff,0xe4,0x40,0x19, +0x0b,0x06,0x4d,0x20,0x20,0x24,0x1a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x89,0x12,0xb8,0xff,0xd4,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xd6,0xb3,0x0c,0x06,0x4d,0x12,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x12,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b, +0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x01,0x15,0x26,0x23,0x22,0x02,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x02,0x11,0x10,0x00,0x21,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03, +0xa6,0x6f,0x7b,0xbf,0xe5,0x04,0x64,0xe4,0xbc,0xde,0xfe,0xc4,0xd8,0xf6,0x01,0x42,0x01,0x08,0x96,0xfe,0xf2,0x7f,0x9e,0x9d,0x82,0x7c,0x98,0x92,0x05,0x89,0x9b,0x39,0xfe,0xac,0xfe,0xe3,0xcb,0xf1,0xca,0xd3,0xfe,0xf5,0x01,0x58,0x01,0x37,0x01,0x79,0x01,0xc2,0xfd,0x44,0xac,0x75,0x93,0xd0,0xb5,0x8b,0x98,0xac,0x00,0x01,0x00,0x56, +0x00,0x00,0x03,0xf2,0x05,0x9a,0x00,0x06,0x00,0xbc,0x40,0x0b,0x73,0x01,0x01,0x02,0x18,0x00,0x04,0x99,0x05,0x06,0x03,0xb8,0xff,0xd8,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x01,0x28,0x0b,0x0d,0x01,0x4c,0x03,0xb8,0xff,0xf4,0x40,0x09,0x0d,0x06,0x4d,0x01,0x0c,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x01,0x10,0x0c, +0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x14,0x0b,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0x03,0x00,0x02,0x02,0x04,0x20,0x00,0x30,0x00,0x02,0x00,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf0,0x40,0x0d,0x0b,0x06,0x4d,0x00,0x20,0x0b,0x0c,0x01,0x4c,0x00,0x00,0x08,0x04,0xb8,0xff, +0xe0,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xe0,0x40,0x0e,0x0b,0x06,0x4d,0x04,0x40,0x0b,0x01,0x4d,0x04,0x40,0x0b,0x00,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x5d,0x12,0x39,0x2f,0x12,0x39,0x39,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xed, +0x39,0x3f,0x31,0x30,0x01,0x5d,0x01,0x01,0x23,0x01,0x21,0x35,0x21,0x03,0xf2,0xfd,0xc8,0xaa,0x02,0x19,0xfd,0x2d,0x03,0x9c,0x05,0x66,0xfa,0x9a,0x05,0x06,0x94,0x00,0x00,0x03,0x00,0x64,0xff,0xe8,0x03,0xee,0x05,0xb2,0x00,0x15,0x00,0x1f,0x00,0x29,0x00,0xfa,0x40,0x26,0x7b,0x13,0x01,0x7b,0x0f,0x01,0x74,0x08,0x01,0x74,0x04,0x01, +0x76,0x07,0x01,0x29,0x08,0x0b,0x00,0x4d,0x35,0x1f,0x01,0x36,0x0a,0x01,0x36,0x1d,0x01,0x76,0x1e,0x01,0x20,0x08,0x0d,0x06,0x4d,0x1e,0xb8,0xff,0xf8,0x40,0x38,0x0d,0x06,0x4d,0x20,0x00,0x0b,0x03,0x1e,0x1e,0x06,0x25,0x9a,0x11,0x19,0x19,0x9a,0x06,0x07,0x00,0x0b,0x1e,0x20,0x04,0x03,0x16,0x89,0x09,0x18,0x0d,0x01,0x4d,0x09,0x09, +0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x89,0x20,0x28,0x30,0x28,0x02,0x28,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x28,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x28,0xb8,0xff,0xe8,0x40,0x0a,0x0b,0x06,0x4d,0x28,0x28,0x2b,0x14,0x1c,0x89,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff, +0xf8,0x40,0x17,0x0b,0x06,0x4d,0x03,0x03,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0x08,0x0b,0x06,0x4d,0x22,0x89,0x14,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x14,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x14,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x14,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0x2b,0xe9,0x11, +0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0xe9,0x12,0x17,0x39,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x17,0x33,0x2b,0x2b,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x2b,0x01,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x35,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x05,0x15,0x04,0x11,0x14,0x04,0x23,0x22,0x26, +0x35,0x10,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x07,0x04,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x9a,0xfe,0xfe,0xec,0xba,0xa8,0xd8,0xfe,0xf6,0x01,0x3a,0xff,0x00,0xe4,0xb8,0xee,0x02,0xb2,0x7c,0x6b,0x64,0x8b,0xe9,0xed,0xf8,0xfe,0xee,0x9f,0x82,0x7c,0x9d,0x02,0xf0,0x04,0x78,0xe4,0x9b,0xc7,0xba,0x92,0xee, +0x84,0x04,0x70,0xfe,0xec,0xb2,0xd2,0xd0,0xa6,0x01,0x14,0x01,0xe0,0x63,0x72,0x77,0x5c,0xbb,0x5f,0x62,0xfa,0x6d,0xcf,0x6b,0x89,0x87,0x67,0xd8,0x00,0x02,0x00,0x5e,0xff,0xe8,0x03,0xec,0x05,0xb2,0x00,0x17,0x00,0x23,0x00,0xc1,0x40,0x29,0x79,0x14,0x01,0x74,0x15,0x01,0x76,0x04,0x01,0x2d,0x04,0x3d,0x04,0x02,0x29,0x14,0x39,0x14, +0x02,0x08,0x10,0x0a,0x9a,0x1e,0x1e,0x10,0x70,0x01,0x01,0x01,0x01,0x03,0x9a,0x16,0x19,0x18,0x9a,0x10,0x07,0x21,0x00,0xb8,0xff,0xea,0x40,0x17,0x0c,0x06,0x4d,0x00,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x21,0x13,0x89,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb3,0x0c, +0x06,0x4d,0x06,0xb8,0xff,0xe8,0x40,0x1e,0x0b,0x06,0x4d,0x20,0x06,0x30,0x06,0x02,0x06,0x06,0x25,0x00,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x89,0x0d,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x0d,0x2f,0x2b, +0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x33,0x2b,0x2b,0x2b,0x2f,0x2b,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x37,0x35,0x16,0x33,0x32,0x12,0x11,0x06,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x00,0x33,0x32,0x12, +0x11,0x10,0x00,0x21,0x22,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0xac,0x78,0x86,0xc3,0xd9,0x02,0x02,0x5c,0xe4,0xb8,0xec,0x01,0x03,0xca,0xd4,0xed,0xfe,0xcc,0xfe,0xee,0x90,0x01,0x06,0x77,0x9f,0x9c,0x85,0x74,0xa1,0xa0,0x18,0x9e,0x44,0x01,0x3a,0x01,0x21,0x01,0x01,0xb9,0xfa,0xc5,0xd2,0x01,0x0d,0xfe,0xb1, +0xfe,0xc0,0xfe,0x73,0xfe,0x52,0x05,0x3f,0xb3,0x8a,0x97,0xad,0x9e,0x72,0xa3,0xce,0x00,0x02,0x00,0x48,0xff,0xec,0x02,0xa5,0x03,0x66,0x00,0x0a,0x00,0x12,0x00,0x20,0x40,0x10,0x08,0xcc,0x11,0x11,0x14,0x0d,0xcc,0x03,0x0b,0xe7,0x06,0x2b,0x0f,0xe7,0x00,0x2d,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30, +0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x11,0x10,0x33,0x32,0x11,0x10,0x01,0x6d,0x8b,0x9a,0xa1,0x99,0x01,0x23,0xa3,0x87,0xa9,0xa6,0xa4,0x14,0xdb,0xd1,0xe5,0xe9,0xfe,0x47,0xdb,0xe6,0x03,0x03,0xfe,0xaf,0xfe,0xc6,0x01,0x40,0x01,0x4b,0x00,0xff,0xff,0x00,0x50,0x00,0x01,0x01,0xc2,0x03,0x69,0x01,0x07, +0x00,0xf0,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x00,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x68,0x00,0x01,0x02,0x92,0x03,0x67,0x03,0x07,0x00,0xf1,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x01,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x02,0x8e,0x03,0x67,0x03,0x07,0x00,0xf2,0x00,0x00,0xfd,0xb9,0x00,0x07, +0xb2,0x00,0x1f,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x2f,0x00,0x01,0x02,0xaa,0x03,0x53,0x01,0x07,0x02,0x38,0x00,0x00,0xfd,0xb9,0x00,0x09,0xb3,0x01,0x00,0x03,0x2c,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x7b,0xff,0xec,0x02,0x8a,0x03,0x57,0x03,0x07,0x02,0x39,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x23,0x2d,0x00,0x3f, +0x35,0x00,0x00,0x02,0x00,0x49,0xff,0xec,0x02,0xa6,0x03,0x66,0x00,0x26,0x00,0x36,0x00,0x2f,0x40,0x18,0x01,0x15,0xcd,0x34,0x34,0x38,0x2c,0x0c,0xcc,0x1f,0x27,0xe7,0x0c,0x10,0x10,0x31,0x06,0xe6,0x24,0x2b,0x31,0xe6,0x1a,0x2d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x32,0x31, +0x30,0x01,0x15,0x2e,0x03,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x63,0x0e,0x28,0x2b,0x2c,0x12,0x39,0x55,0x21,0x1f,0x2d,0x04,0x1d,0x6e,0x4e, +0x3c,0x5f,0x42,0x23,0x2d,0x4f,0x6b,0x3d,0x3f,0x72,0x56,0x32,0x38,0x65,0x8c,0x54,0x2b,0x52,0xc1,0x22,0x3c,0x2c,0x1a,0x15,0x29,0x3a,0x25,0x4b,0x55,0x4d,0x03,0x43,0x81,0x09,0x10,0x0c,0x07,0x24,0x24,0x22,0x7f,0x61,0x32,0x41,0x27,0x47,0x63,0x3d,0x3d,0x68,0x4d,0x2b,0x31,0x63,0x98,0x68,0x75,0xb5,0x7c,0x40,0x12,0xfe,0x59,0x15, +0x28,0x38,0x24,0x22,0x41,0x32,0x1e,0x5b,0x49,0x4e,0x5a,0x00,0xff,0xff,0x00,0x4d,0x00,0x01,0x02,0xa0,0x03,0x5d,0x03,0x07,0x02,0x3a,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x00,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x41,0xff,0xed,0x02,0xad,0x03,0x67,0x03,0x07,0x02,0x3b,0x00,0x00,0xfd,0xb9,0x00,0x0b,0xb4,0x02,0x01,0x00, +0x1f,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0x00,0x02,0x00,0x49,0xff,0xeb,0x02,0xa6,0x03,0x66,0x00,0x27,0x00,0x39,0x00,0x31,0x40,0x19,0x2d,0xcc,0x23,0x10,0x35,0x1a,0xcd,0x06,0x05,0x05,0x10,0x3b,0x30,0xe7,0x0b,0x0b,0x28,0x00,0xe6,0x1f,0x2d,0x28,0xe6,0x15,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x12,0x01,0x39, +0x2f,0x10,0xed,0x33,0x2f,0x33,0xed,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x1e,0x03,0x13,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x34,0x42,0x5e,0x3c,0x1b,0x04,0x0d,0x2b, +0x37,0x42,0x24,0x3c,0x61,0x46,0x26,0x2a,0x4d,0x6c,0x41,0x40,0x71,0x56,0x32,0x30,0x5d,0x8a,0x5b,0x30,0x61,0x26,0x13,0x2e,0x30,0x30,0x52,0x21,0x39,0x2a,0x18,0x52,0x45,0x20,0x3d,0x2f,0x1d,0x19,0x2c,0x3c,0x62,0x33,0x5c,0x7e,0x4b,0x1c,0x2f,0x21,0x13,0x26,0x47,0x63,0x3c,0x3f,0x6a,0x4c,0x2a,0x33,0x65,0x96,0x64,0x69,0xb4,0x82, +0x4a,0x17,0x16,0x7f,0x0b,0x13,0x0f,0x08,0x02,0x8e,0x17,0x2c,0x3e,0x28,0x4c,0x56,0x16,0x26,0x33,0x1d,0x2a,0x47,0x32,0x1c,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x00,0x07,0x00,0x15,0x00,0x27,0x40,0x12,0x15,0x08,0x15,0x08,0x00,0x05,0x00,0x03,0x39,0x15,0x15,0x05,0x0f,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f, +0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x13,0x03,0x2e,0x03,0x27,0x23,0x0e,0x03,0x07,0x03,0x04,0x04,0xb3,0x71,0xfe,0x3d,0x6a,0xb3,0x01,0xae,0xa4,0x5e,0x98,0x02,0x07,0x08,0x07,0x01,0x03,0x02,0x06,0x07,0x07,0x03,0x92,0x01,0x1a,0xfe,0xe6,0x04,0x33, +0xfd,0x73,0x01,0x9a,0x05,0x17,0x1d,0x1c,0x0b,0x0c,0x1d,0x1d,0x18,0x07,0xfe,0x6b,0x00,0x03,0x00,0xb0,0x00,0x00,0x03,0xa1,0x04,0x33,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x3c,0x40,0x21,0x10,0x24,0x0d,0x38,0x16,0x16,0x06,0x00,0x38,0x1f,0x1b,0x24,0x37,0x06,0x10,0x23,0x3a,0x2f,0x1b,0x3f,0x1b,0x02,0x1b,0x1b,0x06,0x1a,0x3a,0x07, +0x35,0x24,0x3a,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x03,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x23,0x11,0x33, +0x32,0x36,0x03,0xa1,0x3b,0x67,0x8e,0x52,0xfe,0x91,0x01,0x67,0x4c,0x7c,0x57,0x2f,0x6c,0x61,0x3d,0x63,0x44,0x25,0xe7,0x71,0x72,0x83,0x71,0x73,0x82,0x3c,0x8f,0x90,0x83,0xa0,0x7b,0x87,0x01,0x35,0x45,0x72,0x51,0x2d,0x04,0x33,0x23,0x41,0x5b,0x37,0x5b,0x86,0x1e,0x03,0x06,0x2a,0x44,0x5b,0x01,0xb9,0x4e,0x3a,0xfe,0xc3,0x5a,0xfe, +0x6c,0x60,0x55,0xfe,0x9b,0x54,0x00,0x01,0x00,0x58,0xff,0xed,0x03,0xbb,0x04,0x45,0x00,0x1d,0x00,0x1b,0x40,0x0d,0x16,0x38,0x07,0x0f,0x00,0x11,0x39,0x0c,0x36,0x1b,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x33,0x2f,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22, +0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x03,0xbb,0x83,0xc5,0x7d,0xc8,0x8c,0x4a,0x54,0x9b,0xd8,0x84,0xa9,0x6f,0x7a,0x96,0x63,0x9e,0x6d,0x3a,0x36,0x66,0x94,0x5e,0xad,0x7d,0x2c,0x3f,0x4d,0x8c,0xc6,0x79,0x80,0xd4,0x98,0x54,0x2c,0x9e,0x40,0x3d,0x70,0x9e,0x62,0x5d,0x96,0x6a,0x39,0x48,0x00,0x00,0x02,0x00,0xb0,0x00,0x00, +0x04,0x54,0x04,0x33,0x00,0x0a,0x00,0x17,0x00,0x1c,0x40,0x0e,0x00,0x38,0x0b,0x12,0x37,0x06,0x11,0x39,0x07,0x35,0x12,0x39,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x20,0x00,0x03,0x34,0x2e,0x02,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x04,0x54,0x5d,0xa9,0xef, +0x92,0xfe,0xe3,0x01,0x2b,0x01,0x3c,0x01,0x3d,0xab,0x3c,0x76,0xae,0x72,0x83,0x7a,0x6e,0xb0,0x7b,0x42,0x02,0x27,0x7d,0xcb,0x90,0x4f,0x04,0x33,0xfe,0xfb,0xfe,0xf6,0x67,0x92,0x5c,0x2a,0xfc,0xed,0x30,0x64,0x98,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x27,0x04,0x33,0x00,0x0b,0x00,0x3c,0x40,0x22,0x06,0x0a,0x37,0x01,0x08,0x04, +0x08,0x04,0x00,0x01,0x00,0x09,0x39,0x0f,0x06,0x01,0x2f,0x06,0x3f,0x06,0xff,0x06,0x03,0x06,0x06,0x01,0x05,0x39,0x02,0x35,0x0a,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0xed,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21, +0x03,0x27,0xfd,0x89,0x02,0x5b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0x01,0xd3,0x04,0x33,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x0b,0x04,0x33,0x00,0x09,0x00,0x29,0x40,0x14,0x02,0x06,0x37,0x07,0x04,0x04,0x00,0x07,0x00,0x05,0x39,0x02,0x02,0x07,0x01,0x39,0x08,0x35,0x07,0x33,0x00,0x3f,0x3f,0xed,0x12,0x39, +0x2f,0xed,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x0b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0xa4,0x02,0x5b,0x03,0xa8,0xfe,0xb1,0x8a,0xfe,0x31,0x04,0x33,0x00,0x00,0x01,0x00,0x58,0xff,0xed,0x04,0x20,0x04,0x45,0x00,0x22,0x00,0x2f,0x40,0x18,0x20,0x20,0x07,0x1e, +0x0f,0x00,0x37,0x1e,0x16,0x38,0x07,0x20,0x39,0x21,0x21,0x02,0x11,0x39,0x0c,0x36,0x1b,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02, +0x33,0x32,0x36,0x37,0x11,0x21,0x35,0x21,0x04,0x20,0xb3,0xdc,0x7f,0xd2,0x96,0x52,0x5c,0xa4,0xe3,0x87,0xc0,0x86,0x8e,0xbd,0x60,0xa3,0x75,0x42,0x39,0x6b,0x98,0x60,0x42,0x6d,0x30,0xfe,0xfe,0x01,0xa4,0x4a,0x5d,0x4f,0x8e,0xc8,0x79,0x7b,0xd1,0x98,0x56,0x39,0xa4,0x53,0x3f,0x71,0x9b,0x5b,0x5e,0x99,0x6c,0x3a,0x16,0x16,0x01,0x0b, +0x8b,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x00,0x0b,0x00,0x27,0x40,0x13,0x08,0x04,0x37,0x05,0x09,0x00,0x37,0x01,0x03,0x39,0x08,0x08,0x05,0x0a,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11, +0x21,0x11,0x33,0x04,0x39,0xa5,0xfd,0xc0,0xa4,0xa4,0x02,0x40,0xa5,0x01,0xf3,0xfe,0x0d,0x04,0x33,0xfe,0x4b,0x01,0xb5,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x01,0x54,0x04,0x33,0x00,0x03,0x00,0x10,0xb6,0x00,0x37,0x01,0x02,0x35,0x01,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x54,0xa4,0xa4,0x04,0x33, +0x00,0x01,0x00,0x11,0xff,0xed,0x01,0xe5,0x04,0x33,0x00,0x11,0x00,0x16,0x40,0x0a,0x00,0x37,0x0f,0x07,0x10,0x35,0x0a,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0xe5,0x33,0x5d,0x83,0x4f,0x46,0x2c,0x2c,0x48,0x2f,0x46, +0x2f,0x18,0xa4,0x01,0x81,0x65,0x98,0x65,0x32,0x13,0x9a,0x1d,0x1b,0x3d,0x63,0x48,0x02,0xb3,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x00,0x12,0x00,0x33,0x40,0x18,0x10,0x11,0x11,0x00,0x12,0x0b,0x07,0x37,0x08,0x01,0x00,0x00,0x14,0x12,0x06,0x0b,0x0b,0x08,0x10,0x09,0x35,0x01,0x08,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12, +0x39,0x11,0x33,0x33,0x11,0x01,0x33,0x2f,0x33,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x03,0xec,0xcc,0xfe,0x60,0x09,0x19,0x06,0x04,0xa4,0xa4,0x04,0x05,0x19,0x0a,0x01,0x91,0xb8,0xfe,0x33,0x01,0xdd,0x0b,0x20,0x0a,0xfd, +0xee,0x04,0x33,0xfe,0x07,0x08,0x1e,0x0b,0x01,0xc8,0xfd,0xfc,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x00,0x05,0x00,0x16,0x40,0x0a,0x04,0x37,0x01,0x00,0x02,0x35,0x04,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x2f,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x03,0x2e,0xfd,0x82,0xa4,0x01,0xda,0x04,0x33,0xfc, +0x58,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x05,0x62,0x04,0x33,0x00,0x21,0x00,0x20,0x40,0x0f,0x17,0x10,0x14,0x37,0x15,0x20,0x06,0x05,0x00,0x37,0x01,0x16,0x35,0x15,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x33,0x33,0x33,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x26,0x26,0x27, +0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x05,0x62,0x9e,0x02,0x06,0x04,0x0a,0x14,0x11,0xfe,0x9d,0x58,0xfe,0x98,0x12,0x15,0x09,0x03,0x03,0x03,0x99,0xda,0x01,0x45,0x15,0x1b,0x06,0x06,0x0b,0x1e,0x11,0x01,0x46,0xd7,0x02,0xbe,0x2b,0x61,0x3e,0x24,0x3a,0x26,0xfc,0xfc,0x03,0x04, +0x26,0x38,0x26,0x20,0x62,0x49,0xfd,0x43,0x04,0x33,0xfd,0x3e,0x2a,0x4a,0x17,0x1d,0x4d,0x24,0x02,0xbf,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x00,0x18,0x00,0x1a,0x40,0x0c,0x01,0x00,0x37,0x16,0x0c,0x09,0x37,0x0a,0x0b,0x35,0x01,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x32,0x2f,0xed,0x33,0x31,0x30,0x21,0x23,0x01,0x26, +0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x1e,0x03,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x04,0x7a,0xae,0xfd,0xcc,0x1f,0x29,0x08,0x05,0x06,0x99,0xb9,0x02,0x35,0x12,0x19,0x11,0x09,0x03,0x03,0x04,0x04,0x99,0x02,0xf7,0x2a,0x41,0x13,0x23,0x71,0xfd,0x1f,0x04,0x33,0xfd,0x04,0x19,0x23,0x18,0x10,0x05,0x17,0x4e,0x39,0x02, +0xc7,0x00,0x00,0x02,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x00,0x13,0x00,0x23,0x00,0x1c,0x40,0x0e,0x00,0x38,0x14,0x1c,0x38,0x0a,0x17,0x39,0x0f,0x36,0x21,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34, +0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0x95,0x52,0x91,0xc9,0x77,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x02,0x27,0x86,0xd4,0x93,0x4d,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c, +0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x24,0x40,0x12,0x00,0x38,0x0f,0x14,0x07,0x37,0x08,0x06,0x3a,0x14,0x14,0x08,0x13,0x3a,0x09,0x35,0x08,0x33,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02, +0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x03,0x92,0x3f,0x73,0xa3,0x63,0x86,0xa4,0x01,0x4b,0x61,0x98,0x68,0x36,0xab,0x86,0x87,0x86,0x76,0x89,0x94,0x02,0xee,0x4d,0x82,0x5e,0x34,0xfe,0x73,0x04,0x33,0x2c,0x54,0x79,0x52,0x6b,0x5a,0xfe,0x65,0x69,0x00,0x02,0x00,0x58,0xff,0x65, +0x04,0xc5,0x04,0x45,0x00,0x18,0x00,0x28,0x00,0x24,0x40,0x12,0x00,0x38,0x19,0x21,0x38,0x0f,0x08,0x05,0x0a,0x1c,0x39,0x14,0x36,0x26,0x39,0x0a,0x34,0x07,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x06,0x07,0x05,0x23,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02, +0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0x95,0x52,0x49,0x22,0x28,0x01,0x15,0xf8,0xb2,0x4f,0x5a,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x02,0x27,0x86,0xd4,0x4a,0x22,0x1b,0xe1,0x9e, +0x16,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0xdf,0x04,0x33,0x00,0x19,0x00,0x24,0x00,0x2e,0x40,0x17,0x16,0x09,0x00,0x11,0x38,0x1a,0x1f,0x09,0x37,0x0a,0x16,0x08,0x3a,0x1f,0x1f,0x0a,0x1e,0x3a,0x0b,0x35,0x01,0x0a, +0x33,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0xfd,0xc6,0x12,0x39,0x31,0x30,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x03,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x03,0xdf,0xc0,0xbe,0x13,0x24,0x29,0x2f,0x1d,0x61, +0xa4,0x01,0x6d,0x56,0x8a,0x61,0x34,0x26,0x46,0x62,0x3c,0x3c,0x3f,0x1c,0x77,0x76,0xa6,0xa0,0x37,0x59,0x40,0x23,0x01,0x47,0x20,0x2b,0x19,0x0a,0xfe,0x4b,0x04,0x33,0x27,0x4a,0x69,0x43,0x3a,0x63,0x4c,0x35,0x0d,0x03,0x1a,0x65,0x01,0xa1,0x57,0x4c,0xfe,0x8e,0x1e,0x37,0x4c,0x00,0x00,0x01,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45, +0x00,0x37,0x00,0x26,0x40,0x13,0x2e,0x37,0x0a,0x1f,0x27,0x00,0x37,0x15,0x15,0x2d,0x05,0x29,0x39,0x24,0x36,0x10,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xc4,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e, +0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x03,0x08,0x38,0x67,0x94,0x5d,0x20,0x4e,0x4c,0x41,0x12,0x1a,0x46,0x4d,0x4f,0x24,0x39,0x53,0x36,0x19,0x14,0x35,0x5d,0x4a,0x47,0x66,0x42,0x1f,0x39,0x66,0x8d,0x53,0xa0,0x4a,0x5f,0x93,0x32,0x4f,0x38,0x1d,0x0e,0x2f,0x56, +0x48,0x4f,0x6f,0x46,0x20,0x01,0x1b,0x44,0x70,0x4f,0x2b,0x0b,0x11,0x16,0x0c,0xac,0x15,0x24,0x1a,0x0e,0x16,0x28,0x38,0x22,0x1f,0x32,0x30,0x36,0x25,0x23,0x46,0x4c,0x58,0x35,0x40,0x68,0x49,0x28,0x26,0xa5,0x42,0x15,0x26,0x33,0x1e,0x1d,0x2f,0x31,0x36,0x22,0x26,0x47,0x4c,0x54,0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33, +0x00,0x07,0x00,0x1e,0x40,0x0e,0x02,0x37,0x03,0x03,0x00,0x05,0x00,0x01,0x05,0x39,0x06,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x6c,0xfe,0xa9,0xa4,0xfe,0xa8,0x03,0x53,0x03,0xa8,0xfc,0x58,0x03,0xa8,0x8b,0x00,0x01,0x00,0x9c,0xff,0xed, +0x04,0x26,0x04,0x33,0x00,0x15,0x00,0x1b,0x40,0x0d,0x00,0x37,0x13,0x09,0x37,0x06,0x14,0x07,0x35,0x0e,0x39,0x03,0x34,0x00,0x3f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x04,0x26,0xed,0xe2,0xd9,0xe2,0xa5,0x22,0x48, +0x6f,0x4d,0x4a,0x6b,0x45,0x20,0xa5,0x01,0xb3,0xe3,0xe3,0xdb,0xda,0x02,0x91,0xfd,0x80,0x51,0x77,0x4e,0x25,0x24,0x4d,0x76,0x51,0x02,0x83,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x15,0x04,0x33,0x00,0x0f,0x00,0x0f,0xb5,0x03,0x00,0x03,0x35,0x02,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x01,0x23,0x01,0x33,0x01,0x1e, +0x03,0x17,0x33,0x36,0x36,0x37,0x01,0x04,0x15,0xfe,0x43,0xa3,0xfe,0x4b,0xb9,0x01,0x0c,0x10,0x17,0x0f,0x0a,0x02,0x03,0x04,0x20,0x22,0x01,0x12,0x04,0x33,0xfb,0xcd,0x04,0x33,0xfd,0x40,0x2a,0x40,0x32,0x24,0x0e,0x17,0x61,0x57,0x02,0xbf,0x00,0x01,0x00,0x05,0x00,0x00,0x06,0x64,0x04,0x33,0x00,0x26,0x00,0x0f,0xb5,0x1a,0x0a,0x1a, +0x35,0x19,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x23,0x03,0x2e,0x03,0x27,0x0e,0x03,0x07,0x03,0x23,0x01,0x33,0x13,0x1e,0x03,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0x81,0xdf,0x1d,0x1a,0x04,0x03,0x05,0x1c,0x20,0xd4,0xb1,0xfe,0x8c,0xa3,0xdf,0x07,0x10,0x10,0x0f, +0x04,0x06,0x10,0x11,0x10,0x07,0xda,0xa3,0xfe,0x8c,0xb0,0xd7,0x10,0x16,0x0e,0x09,0x02,0x03,0x04,0x1a,0x1d,0xde,0x04,0x33,0xfd,0x5e,0x5a,0x71,0x17,0x1c,0x71,0x62,0x02,0x95,0xfb,0xcd,0x02,0xa4,0x15,0x37,0x3e,0x3e,0x1c,0x1f,0x43,0x40,0x39,0x14,0xfd,0x67,0x04,0x33,0xfd,0x6b,0x31,0x4d,0x3a,0x29,0x0e,0x17,0x71,0x5a,0x02,0xa2, +0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x00,0x19,0x00,0x0f,0xb5,0x0b,0x00,0x0d,0x35,0x0b,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x03,0xe4,0xc3,0xfe,0xfa,0x06,0x0e,0x08,0x03, +0x04,0x0e,0x0b,0xfe,0xc3,0x01,0x7c,0xfe,0xa2,0xc5,0xe6,0x0d,0x15,0x09,0x03,0x0d,0x17,0x0a,0xe3,0xb8,0xfe,0x9a,0x01,0x8e,0x0a,0x1a,0x12,0x09,0x1b,0x12,0xfe,0x72,0x02,0x28,0x02,0x0b,0xfe,0x91,0x14,0x25,0x12,0x19,0x27,0x0e,0x01,0x6c,0xfd,0xdf,0x00,0x01,0x00,0x14,0x00,0x00,0x03,0xa7,0x04,0x33,0x00,0x0f,0x00,0x1d,0x40,0x0d, +0x0a,0x02,0x37,0x03,0x03,0x06,0x05,0x0f,0x00,0x05,0x35,0x03,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x32,0x2f,0x33,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0xa7,0xfe,0x83,0xa3,0xfe,0x8d,0xb4,0xf3,0x06,0x0f,0x08,0x02,0x05,0x10,0x0b,0xff,0x04,0x33,0xfd,0x5a, +0xfe,0x73,0x01,0x8a,0x02,0xa9,0xfe,0x25,0x0c,0x21,0x15,0x0d,0x21,0x14,0x01,0xdb,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0xb3,0x04,0x33,0x00,0x09,0x00,0x26,0x40,0x12,0x07,0x07,0x00,0x01,0x04,0x06,0x03,0x00,0x00,0x07,0x39,0x08,0x35,0x05,0x01,0x39,0x04,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x01,0x2f,0x33,0x33,0x2f,0x33,0x12, +0x39,0x2f,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x03,0xb3,0xfd,0x73,0x02,0x7c,0xfc,0x87,0x02,0x8b,0xfd,0xad,0x03,0x52,0x04,0x02,0xfc,0x89,0x8b,0x37,0x03,0x71,0x8b,0x00,0x00,0x02,0xff,0xf8,0x00,0x00,0x05,0x56,0x04,0x33,0x00,0x0f,0x00,0x13,0x00,0x59,0x40,0x33,0x0a,0x0e,0x37,0x01,0x11,0x01,0x10,0x01, +0x0c,0x08,0x08,0x0c,0x01,0x10,0x04,0x00,0x05,0x00,0x09,0x13,0x39,0x06,0x03,0x39,0x10,0x0d,0x39,0x0a,0x0f,0x0a,0x01,0x2f,0x0a,0x3f,0x0a,0xff,0x0a,0x03,0x10,0x0a,0x10,0x0a,0x01,0x06,0x35,0x05,0x33,0x0e,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x01,0x2f, +0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x21,0x11,0x23,0x05,0x56,0xfd,0x89,0xfe,0x6f,0x9b,0xbb,0x02,0x46,0x02,0xfc,0xfe,0x49,0x01,0x95,0xfe,0x6b,0x01,0xd3,0xfc,0x3c,0x01,0x4d,0x49,0x01,0x28,0xfe,0xd8, +0x04,0x33,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x01,0x28,0x01,0xf6,0x00,0x02,0x00,0x58,0xff,0xed,0x05,0xe8,0x04,0x45,0x00,0x1e,0x00,0x2e,0x00,0x51,0x40,0x2f,0x19,0x1d,0x37,0x1f,0x1b,0x1f,0x1b,0x00,0x28,0x38,0x0b,0x17,0x00,0x18,0x20,0x39,0x15,0x1c,0x39,0x0f,0x19,0x01,0x2f,0x19,0x3f,0x19,0xff,0x19,0x03,0x19,0x19,0x01,0x15,0x35, +0x23,0x39,0x10,0x36,0x2d,0x39,0x06,0x34,0x1d,0x1f,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x5d,0x71,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x31,0x30,0x21,0x21,0x22,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x23,0x21, +0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x25,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x05,0xe8,0xfd,0xab,0x06,0x3a,0x50,0x57,0x23,0x80,0xcf,0x93,0x4f,0x52,0x99,0xd8,0x86,0x25,0x58,0x49,0x2f,0x03,0x02,0x3b,0xfe,0x47,0x01,0x97,0xfe,0x69,0x01,0xd3,0xfd,0x89,0x40,0x6a,0x2b,0x5b,0x96,0x6c,0x3c,0x3b, +0x6b,0x95,0x59,0x5a,0x06,0x07,0x06,0x4f,0x8f,0xc8,0x7a,0x82,0xd2,0x94,0x50,0x06,0x06,0x06,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x06,0x03,0x14,0x0b,0x0b,0x3f,0x70,0x9a,0x5a,0x5b,0x98,0x6e,0x3e,0x00,0x00,0x01,0x00,0x38,0x00,0x00,0x03,0x2e,0x04,0x33,0x00,0x0d,0x00,0x34,0x40,0x19,0x08,0x0c,0x37,0x01,0x0a,0x0a,0x00,0x05,0x03,0x01, +0x00,0x02,0x08,0x09,0x03,0x09,0x03,0x09,0x01,0x06,0x35,0x0c,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x25,0x15,0x05,0x11,0x21,0x03,0x2e,0xfd,0x82,0x78,0x78,0xa4,0x01,0x01,0xfe, +0xff,0x01,0xda,0x01,0x95,0x44,0x8a,0x43,0x02,0x15,0xfe,0x48,0x8f,0x8b,0x8d,0xfe,0x99,0x00,0x00,0x03,0x00,0x41,0xff,0xda,0x04,0xa9,0x04,0x65,0x00,0x1b,0x00,0x26,0x00,0x32,0x00,0x28,0x40,0x14,0x1f,0x30,0x2c,0x00,0x38,0x1c,0x2c,0x38,0x0e,0x2f,0x1e,0x22,0x27,0x39,0x13,0x36,0x22,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x11, +0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x17,0x07,0x16,0x16,0x07,0x34,0x27,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x01,0x26,0x26,0x04,0xa9,0x4d,0x90,0xce, +0x82,0x6f,0xb6,0x45,0x83,0x4e,0x86,0x36,0x39,0x4d,0x92,0xd4,0x86,0x61,0xa4,0x42,0x7b,0x4f,0x7a,0x3f,0x42,0xab,0x44,0xfd,0xc4,0x30,0x80,0x4e,0x5c,0x8f,0x63,0x34,0xfe,0x88,0x57,0x8f,0x66,0x37,0x1d,0x1b,0x02,0x34,0x2d,0x74,0x02,0x27,0x82,0xd2,0x95,0x51,0x3c,0x39,0x88,0x49,0x8c,0x45,0xb0,0x69,0x81,0xd1,0x95,0x51,0x32,0x2f, +0x81,0x4b,0x7f,0x47,0xbd,0x80,0xa8,0x68,0xfd,0xac,0x2d,0x2f,0x38,0x6a,0x9b,0x02,0x07,0x3c,0x6e,0x9b,0x5e,0x46,0x78,0x31,0x02,0x4e,0x21,0x23,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x00,0x10,0x00,0x19,0x00,0x2e,0x40,0x17,0x00,0x38,0x11,0x16,0x0b,0x07,0x37,0x08,0x06,0x3a,0x16,0x15,0x3a,0x0b,0x16,0x0b,0x16,0x0b, +0x08,0x09,0x35,0x08,0x33,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x32,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x03,0x92,0x3f,0x73,0xa3,0x63,0x86,0xa4,0xa4,0xa7,0x61,0x98,0x68,0x36, +0xab,0x86,0x87,0x86,0x76,0x89,0x94,0x02,0x2c,0x4d,0x82,0x5e,0x34,0xcb,0x04,0x33,0xc2,0x2c,0x54,0x79,0x52,0x6b,0x5a,0xfe,0x65,0x69,0x00,0x02,0x00,0x2d,0x00,0x00,0x04,0x54,0x04,0x33,0x00,0x0e,0x00,0x1f,0x00,0x35,0x40,0x1b,0x18,0x18,0x06,0x00,0x38,0x0f,0x16,0x1a,0x37,0x0a,0x08,0x06,0x19,0x08,0x39,0x16,0x09,0x09,0x06,0x15, +0x39,0x0b,0x35,0x1a,0x39,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x00,0x03,0x34,0x2e,0x02,0x23,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x32,0x3e,0x02,0x04,0x54,0x5d,0xa9, +0xef,0x92,0xfe,0xe3,0x83,0x83,0x01,0x2b,0x01,0x3c,0x01,0x3d,0xab,0x3c,0x76,0xae,0x72,0x83,0xfb,0xfb,0x7a,0x6e,0xb0,0x7b,0x42,0x02,0x27,0x7d,0xcb,0x90,0x4f,0x01,0xe1,0x89,0x01,0xc9,0xfe,0xfb,0xfe,0xf6,0x67,0x92,0x5c,0x2a,0xfe,0xc7,0x89,0xfe,0xaf,0x30,0x64,0x98,0x00,0x01,0x00,0xa6,0xff,0xee,0x03,0xe8,0x04,0x45,0x00,0x39, +0x00,0x3f,0x40,0x21,0x27,0x38,0x14,0x30,0x38,0x09,0x01,0x0f,0x1c,0x14,0x09,0x14,0x09,0x3b,0x1b,0x37,0x1c,0x2a,0x0e,0x3b,0x0f,0x0f,0x22,0x04,0x39,0x35,0x34,0x17,0x39,0x22,0x36,0x1c,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31, +0x30,0x25,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x01,0x9a,0x26,0x73,0x43,0x28,0x48,0x36,0x1f,0x2a,0x57,0x84,0x5a,0x39,0x5c, +0x41,0x23,0x5a,0x58,0x65,0x74,0xa4,0x42,0x6c,0x8c,0x4a,0x4e,0x7f,0x5a,0x31,0x68,0x77,0x56,0x7b,0x4f,0x25,0x31,0x5e,0x88,0x56,0x2c,0x43,0x35,0x2a,0x0a,0x97,0x12,0x1a,0x13,0x2a,0x42,0x30,0x2f,0x4f,0x3b,0x25,0x05,0x71,0x06,0x1c,0x2f,0x41,0x2a,0x45,0x43,0x71,0x7d,0xfd,0x32,0x02,0xe3,0x68,0x88,0x51,0x21,0x24,0x43,0x61,0x3c, +0x5a,0x80,0x1e,0x04,0x0d,0x31,0x48,0x62,0x3f,0x45,0x70,0x4f,0x2c,0x05,0x07,0x0a,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0x96,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26, +0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x0e,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x2c,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x8c,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00, +0x00,0x00,0x04,0x04,0x05,0xd0,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x9f,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0xa5,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x17,0x01,0x17,0x00, +0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x67,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xdf,0xff,0x4b,0x00,0x09,0xb3,0x03,0x02,0x27,0x35,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x58,0xfe,0x56,0x03,0xbb,0x04,0x45,0x02,0x26,0x0c,0xed,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x97,0x00,0x06, +0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x43,0x79,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xec,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d, +0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x2c,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0xd7,0x6c,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xa5,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x8f,0x53,0x1e,0x00,0x0c, +0xb5,0x02,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xfc,0x00,0x00,0x01,0x81,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0x43,0xaa,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x87,0x00,0x00,0x02,0x0c,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06, +0x00,0x8e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe9,0x00,0x00,0x02,0x1d,0x06,0x2c,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd7,0x8d,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3, +0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a,0x05,0xd0,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x32,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58, +0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x68,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24, +0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x2c,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x00,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xd0,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x13,0x00,0x1e, +0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xa5,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xd6,0x00,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x28,0x02,0x26,0x0c,0xff, +0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x07,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x28,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x62,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed, +0x04,0x26,0x06,0x2c,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xeb,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xa5,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xc1,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00, +0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x4d,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xc6,0x00,0x1e, +0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0xdc,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfe,0x70,0x04,0x04,0x04,0x33,0x02,0x26,0x0c,0xeb,0x00,0x00, +0x00,0x07,0x00,0xdf,0x02,0xab,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x28,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x71,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x2a,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0xe0, +0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x05,0xa3,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xba,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x54,0x06,0x2a,0x02,0x26, +0x0c,0xee,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x2d,0x00,0x00,0x04,0x54,0x04,0x33,0x02,0x06,0x0d,0x0a,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0x4d,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x9c,0x00,0x1e, +0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xdc,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xac,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xa3,0x02,0x26,0x0c,0xef,0x00,0x00, +0x01,0x07,0x00,0xdb,0x01,0x15,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x70,0x03,0x27,0x04,0x33,0x02,0x26,0x0c,0xef,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xbe,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x2a,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0xe0, +0x66,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x05,0xdc,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x52,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xfe,0x85,0x04,0x20,0x04,0x45,0x02,0x26,0x0c,0xf1, +0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xf8,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x05,0xa3,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xb0,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x06,0x2c,0x02,0x26,0x0c,0xf2,0x00,0x00,0x01,0x07, +0x00,0xd7,0x00,0xfe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0c,0x01,0x0c,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0x2d,0x00,0x00,0x04,0xbc,0x04,0x33,0x00,0x13,0x00,0x17,0x00,0x4a,0x40,0x0e,0x17,0x0c,0x04,0x37,0x05,0x14,0x0d,0x00,0x37,0x01,0x03,0x39,0x17,0x17,0xb8,0xff,0xc0,0x40,0x16,0x09,0x0c,0x48,0x16,0x13,0x06,0x39,0x09,0x10, +0x0c,0x09,0x17,0x09,0x17,0x09,0x05,0x0e,0x0a,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x2b,0x10,0xed,0x01,0x2f,0xed,0x33,0x33,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23, +0x07,0x35,0x21,0x15,0x04,0x39,0xa5,0xfd,0xc0,0xa4,0x83,0x83,0xa4,0x02,0x40,0xa5,0x83,0x83,0xa5,0xfd,0xc0,0x01,0xf3,0xfe,0x0d,0x03,0x2b,0x89,0x7f,0x7f,0x7f,0x7f,0x89,0xad,0xad,0xad,0xff,0xff,0xff,0xc3,0x00,0x00,0x02,0x44,0x05,0xd0,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd8,0xa0,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05, +0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x04,0x00,0x00,0x02,0x00,0x05,0x4d,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd9,0xc6,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x16,0x05,0xdc,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xda,0xcc,0x1e,0x00,0x0a, +0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x3f,0xfe,0x70,0x01,0x54,0x04,0x33,0x02,0x26,0x0c,0xf3,0x00,0x00,0x00,0x06,0x00,0xdf,0x01,0x00,0xff,0xff,0x00,0xa0,0x00,0x00,0x01,0x65,0x05,0xa3,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xdb,0x34,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11, +0x5d,0x35,0xff,0xff,0x00,0xb0,0xff,0xed,0x03,0xe9,0x04,0x33,0x00,0x26,0x0c,0xf3,0x00,0x00,0x00,0x07,0x0c,0xf4,0x02,0x04,0x00,0x00,0xff,0xff,0x00,0x11,0xff,0xed,0x02,0xac,0x06,0x2c,0x02,0x26,0x0c,0xf4,0x00,0x00,0x01,0x06,0x00,0xd7,0x1c,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0, +0xfe,0x85,0x03,0xec,0x04,0x33,0x02,0x26,0x0c,0xf5,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xa8,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x06,0x28,0x02,0x26,0x0c,0xf6,0x00,0x00,0x01,0x06,0x00,0x8e,0x52,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x06,0x01,0x06,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x03,0x2e,0x04,0x33, +0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x06,0x01,0x9c,0x6b,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x07,0x01,0x9c,0x01,0x13,0x04,0xaa,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x07,0x00,0xdb,0x01,0x8a,0xfd,0x56,0xff,0xff,0x00,0xb0, +0x00,0x00,0x04,0x7a,0x06,0x28,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x9e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x04,0x7a,0x04,0x33,0x02,0x26,0x0c,0xf8,0x00,0x00,0x00,0x07,0x01,0x9c,0x01,0x0c,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a, +0x06,0x2a,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x16,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0xb0,0xfe,0x59,0x04,0x88,0x04,0x33,0x00,0x26,0x00,0x32,0x40,0x18,0x26,0x37,0x25,0x0f,0x25,0x08,0x08,0x25,0x1a,0x17,0x37,0x18,0x20,0x13,0x17,0x25,0x19,0x35,0x0f,0x00, +0x17,0x0a,0x39,0x05,0x00,0x2f,0xed,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x01,0x26,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x1e,0x03,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x04, +0x88,0x33,0x5e,0x83,0x4f,0x46,0x2c,0x2c,0x48,0x2f,0x46,0x2f,0x18,0xfd,0xbc,0x20,0x28,0x08,0x05,0x06,0xa0,0xc0,0x02,0x35,0x12,0x19,0x11,0x09,0x03,0x03,0x04,0x04,0xa0,0x13,0x65,0x98,0x65,0x32,0x13,0x9a,0x1d,0x1b,0x42,0x6e,0x52,0x02,0xf1,0x29,0x42,0x13,0x23,0x71,0xfd,0x1f,0x04,0x33,0xfd,0x21,0x19,0x23,0x18,0x10,0x05,0x17, +0x4e,0x39,0x02,0xaa,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0x4d,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x3a,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xdc,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x3f,0x00,0x1e, +0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x1e,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x7d,0x00,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xdf,0x06,0x28,0x02,0x26,0x0c,0xfc, +0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x03,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x03,0xdf,0x04,0x33,0x02,0x26,0x0c,0xfc,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xa0,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xdf,0x06,0x2a,0x02,0x26,0x0c,0xfc,0x00,0x00,0x01,0x07, +0x00,0xe0,0x00,0x83,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x28,0x02,0x26,0x0c,0xfd,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x2c, +0x02,0x26,0x0c,0xfd,0x00,0x00,0x01,0x06,0x00,0xd7,0x4e,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xfe,0x50,0x03,0x08,0x04,0x45,0x02,0x26,0x0c,0xfd,0x00,0x00,0x00,0x07,0x00,0xdd,0x00,0xdc,0x00,0x00,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x2a,0x02,0x26,0x0c,0xfd,0x00,0x00, +0x01,0x06,0x00,0xe0,0x4f,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x19,0xfe,0x50,0x03,0x6c,0x04,0x33,0x02,0x26,0x0c,0xfe,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x15,0x00,0x00,0xff,0xff,0x00,0x19,0xfe,0x85,0x03,0x6c,0x04,0x33,0x02,0x26,0x0c,0xfe,0x00,0x00,0x00,0x06,0x01,0x9c,0x2d,0x00, +0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x06,0x2a,0x02,0x26,0x0c,0xfe,0x00,0x00,0x01,0x06,0x00,0xe0,0x43,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x08,0x01,0x08,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x00,0x0f,0x00,0x3d,0x40,0x1f,0x02,0x06,0x37,0x07,0x0b,0x07,0x0a,0x07,0x03,0x03,0x07,0x0a,0x03,0x00, +0x0d,0x00,0x01,0x0d,0x39,0x0e,0x05,0x09,0x39,0x02,0x0a,0x0a,0x07,0x0e,0x35,0x07,0x33,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x6c,0xfe, +0xa9,0x01,0x0e,0xfe,0xf2,0xa4,0xfe,0xf1,0x01,0x0f,0xfe,0xa8,0x03,0x53,0x03,0xa8,0xfe,0xb6,0x89,0xfe,0x2b,0x01,0xd5,0x89,0x01,0x4a,0x8b,0x00,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xd0,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xfe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35, +0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0x4d,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x25,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xdc,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x2a,0x00,0x1e,0x00,0x0a,0xb4,0x01, +0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x3a,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x41,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x1e,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07, +0x00,0xde,0x01,0x51,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xfe,0x70,0x04,0x26,0x04,0x33,0x02,0x26,0x0c,0xff,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xaa,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x2c,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0xd7, +0x01,0xbe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x28,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xa6,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x28,0x02,0x26, +0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x5e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x05,0xa5,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x94,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0x35,0xff,0xff, +0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x2c,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0xd7,0x67,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x05,0xa5,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0x8f,0x3d,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x10,0x01,0x10,0x00, +0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0x43,0x71,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x06,0x28,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x21,0x00,0x1e,0x00,0x0a, +0xb4,0x01,0x0f,0x0b,0x01,0x0b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x05,0xa3,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x3d,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x06,0x2a,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07, +0x00,0xe0,0x00,0x8d,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0a,0x01,0x0a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0xe3,0x02,0x26,0x0c,0xeb,0x00,0x00,0x00,0x27,0x00,0xdc,0x00,0xdf,0xff,0x4b,0x01,0x07,0x00,0x8e,0x01,0x14,0x00,0xd9,0x00,0x2a,0x40,0x1b,0x04,0xe0,0x2f,0x01,0x90,0x2f,0x01,0x90,0x2f,0x01, +0x80,0x2f,0x01,0x70,0x2f,0x01,0x70,0x2f,0x01,0x60,0x2f,0x01,0x2f,0x03,0x02,0x27,0x35,0x00,0x3f,0x35,0x35,0x11,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x35,0xff,0xff,0xff,0xf8,0x00,0x00,0x05,0x56,0x06,0x28,0x02,0x26,0x0d,0x05,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x7b,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x16,0x01,0x16,0x00,0x11, +0x5d,0x35,0xff,0xff,0x00,0x41,0xff,0xda,0x04,0xa9,0x06,0x28,0x02,0x26,0x0d,0x08,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x69,0x00,0x1e,0x00,0x0a,0xb4,0x03,0x0f,0x35,0x01,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x02,0x06,0x0c,0xeb,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xa1,0x04,0x33, +0x02,0x06,0x0c,0xec,0x00,0x00,0x00,0x01,0x00,0x9c,0x00,0x00,0x03,0x06,0x04,0x33,0x00,0x05,0x00,0x18,0x40,0x0b,0x00,0x07,0x02,0x37,0x03,0x01,0x39,0x04,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x11,0x33,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0x06,0xfe,0x3a,0xa4,0x02,0x6a,0x03,0xa6,0xfc,0x5a,0x04,0x33,0x00, +0x00,0x02,0x00,0x2a,0x00,0x00,0x04,0x20,0x04,0x33,0x00,0x05,0x00,0x0e,0x00,0x23,0x40,0x10,0x0e,0x02,0x06,0x05,0x02,0x05,0x0f,0x10,0x09,0x01,0x03,0x35,0x0e,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x12,0x39,0x11,0x12,0x01,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x33,0x01,0x27,0x01,0x26,0x27,0x23,0x06,0x06, +0x07,0x01,0x04,0x20,0xfc,0x0a,0x01,0xa7,0xa4,0x01,0xab,0xcb,0xfe,0xed,0x1c,0x04,0x03,0x03,0x10,0x0e,0xfe,0xf3,0x39,0x03,0xfa,0xfc,0x06,0x51,0x02,0x9a,0x44,0x26,0x12,0x35,0x23,0xfd,0x66,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x04,0x33,0x02,0x06,0x0c,0xef,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x04,0x33, +0x02,0x06,0x0d,0x04,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x02,0x06,0x0c,0xf2,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x00,0x03,0x00,0x17,0x00,0x27,0x00,0x2f,0x40,0x18,0x02,0x01,0x20,0x04,0x38,0x18,0x18,0x29,0x20,0x38,0x0e,0x00,0x39,0x01,0x01,0x25,0x1b,0x39,0x13,0x36,0x25,0x39, +0x09,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x35,0x21,0x15,0x25,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xac,0x01,0x95,0x01,0x54,0x52, +0x91,0xc9,0x77,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x01,0xdd,0x8b,0x8b,0x4a,0x86,0xd4,0x93,0x4d,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0xff,0xff,0x00,0xb0, +0x00,0x00,0x01,0x54,0x04,0x33,0x02,0x06,0x0c,0xf3,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x02,0x06,0x0c,0xf5,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x15,0x04,0x33,0x00,0x0d,0x00,0x22,0x40,0x0f,0x04,0x03,0x0d,0x00,0x03,0x00,0x0f,0x0e,0x04,0x08,0x01,0x0d,0x33,0x01,0x35,0x00,0x3f,0x3f,0x12,0x39, +0x39,0x11,0x12,0x01,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x31,0x01,0x33,0x01,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x01,0xbd,0xa3,0x01,0xb5,0xb9,0xfe,0xf4,0x20,0x1e,0x04,0x03,0x04,0x20,0x22,0xfe,0xee,0x04,0x33,0xfb,0xcd,0x02,0xc0,0x53,0x5f,0x1c,0x17,0x61,0x57,0xfd,0x41,0x00,0xff,0xff,0x00,0xb0,0x00,0x00, +0x05,0x62,0x04,0x33,0x02,0x06,0x0c,0xf7,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x02,0x06,0x0c,0xf8,0x00,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x03,0x4c,0x04,0x33,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x30,0x40,0x19,0x02,0x03,0x06,0x07,0x04,0x0b,0x0a,0x0b,0x0a,0x0b,0x0c,0x0d,0x05,0x39,0x06,0x06,0x02,0x0a, +0x39,0x09,0x33,0x01,0x39,0x02,0x35,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x21,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0x36,0xfd,0x29,0x02,0xd7,0x73,0xfe,0x0f,0x01,0xf1,0x89,0xfc,0xfd,0x03,0x03,0x03,0xa3,0x90,0xfd,0xa7,0x8c,0xfd,0x9a, +0x91,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x02,0x06,0x0c,0xf9,0x00,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x37,0x04,0x33,0x00,0x07,0x00,0x1b,0x40,0x0d,0x04,0x37,0x05,0x00,0x37,0x01,0x03,0x39,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x11, +0x23,0x11,0x21,0x04,0x37,0xa5,0xfd,0xc2,0xa4,0x03,0x87,0x03,0xa6,0xfc,0x5a,0x04,0x33,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x02,0x06,0x0c,0xfa,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x03,0x63,0x04,0x33,0x00,0x0b,0x00,0x34,0x40,0x1a,0x08,0x04,0x03,0x07,0x09,0x0b,0x04,0x09,0x0b,0x0b,0x09,0x04,0x03,0x0d, +0x0a,0x02,0x04,0x08,0x39,0x05,0x35,0x02,0x0a,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x32,0x11,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x03,0x63,0xfc,0xcd,0x01,0x82,0xfe,0xa1,0x02,0xdc,0xfe,0x0d,0x01,0x27,0xfe,0xb0, +0x02,0x50,0x44,0x01,0xe5,0x01,0xbd,0x4d,0x8c,0xfe,0x87,0xfe,0x59,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x02,0x06,0x0c,0xfe,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x04,0x33,0x02,0x06,0x0d,0x03,0x00,0x00,0x00,0x03,0x00,0x50,0xff,0xf5,0x04,0xb1,0x04,0x3d,0x00,0x1d,0x00,0x2a,0x00,0x37,0x00,0x46, +0x40,0x23,0x1f,0x12,0x01,0x37,0x37,0x0f,0x02,0x02,0x09,0x18,0x37,0x25,0x32,0x37,0x09,0x1f,0x37,0x3a,0x04,0x00,0x04,0x1e,0x2c,0x3a,0x0f,0x12,0x0f,0x04,0x0f,0x04,0x0f,0x02,0x10,0x36,0x02,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33, +0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x15,0x23,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x02,0xcd,0x99,0x18,0x66,0xaa,0x79,0x43,0x43,0x7a, +0xaa,0x67,0x16,0x99,0x17,0x69,0xaa,0x78,0x42,0x44,0x79,0xa9,0x65,0x19,0x17,0x46,0x70,0x4e,0x29,0x2a,0x4f,0x70,0x46,0xae,0x14,0x45,0x71,0x4f,0x2b,0x29,0x4e,0x70,0x47,0x8b,0x96,0x96,0x3e,0x71,0x9c,0x5f,0x5d,0x97,0x6a,0x3a,0x70,0x70,0x3b,0x6b,0x97,0x5b,0x5f,0x9c,0x71,0x3e,0x02,0xc4,0xfd,0xc1,0x27,0x4b,0x6c,0x46,0x41,0x69, +0x49,0x28,0xfd,0xc1,0x02,0x3f,0x27,0x49,0x6a,0x42,0x46,0x6c,0x4a,0x27,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x02,0x06,0x0d,0x02,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x04,0xc3,0x04,0x33,0x00,0x1b,0x00,0x34,0x40,0x1a,0x0d,0x00,0x37,0x0e,0x1b,0x1b,0x06,0x15,0x37,0x14,0x07,0x37,0x06,0x01,0x19,0x39,0x0c,0x10, +0x10,0x0e,0x1b,0x06,0x14,0x35,0x0e,0x33,0x00,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x02,0xec,0x19,0x97, +0x88,0x9f,0xe1,0xdd,0x19,0x99,0x19,0xd7,0xe6,0x9e,0x88,0x97,0x19,0x04,0x33,0xfd,0x60,0x8a,0x89,0x01,0x8d,0xfe,0x73,0xc6,0xd4,0xfe,0xf4,0x01,0x0c,0xd1,0xc9,0x01,0x8d,0xfe,0x73,0x89,0x8a,0x02,0xa0,0x00,0x00,0x01,0x00,0x58,0x00,0x00,0x04,0xb8,0x04,0x45,0x00,0x2b,0x00,0x2a,0xbc,0x00,0x0f,0x01,0x50,0x00,0x1b,0x00,0x25,0x01, +0x50,0x40,0x0d,0x05,0x0a,0x39,0x20,0x36,0x2a,0x12,0x03,0x15,0x39,0x01,0x14,0x33,0x00,0x3f,0x33,0xed,0x32,0x32,0x32,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x15,0x21,0x35,0x21,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15, +0x14,0x0e,0x02,0x07,0x21,0x04,0xb8,0xfe,0x51,0x80,0x86,0x36,0x64,0x90,0x5a,0x5c,0x92,0x66,0x37,0x87,0x81,0xfe,0x50,0x01,0x0d,0x48,0x67,0x40,0x1e,0x51,0x93,0xcd,0x7d,0x7f,0xd0,0x93,0x50,0x1e,0x41,0x65,0x48,0x01,0x0c,0x8a,0x5d,0xd4,0x89,0x59,0x8c,0x62,0x33,0x33,0x62,0x8c,0x58,0x89,0xd5,0x5d,0x8a,0x8b,0x2c,0x62,0x6f,0x81, +0x4c,0x75,0xb8,0x80,0x43,0x42,0x7f,0xb9,0x76,0x4b,0x81,0x70,0x61,0x2d,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1c,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef, +0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe8,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x06,0x28,0x02,0x26,0x0c,0xf2,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x6f,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0c,0x01,0x0c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x87,0x00,0x00, +0x02,0x0c,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0x8e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x65,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35, +0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xf5,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0x00,0x00,0x04,0xb8,0x06,0x28,0x02,0x26,0x0d,0x80,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x6d,0x00,0x1e,0x00,0x0a,0xb4,0x01, +0x0f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x05,0xa5,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06, +0x00,0x8f,0x3d,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0x8a,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x8f,0x45,0x03,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0x35,0x00,0x01,0x00,0x22,0xff,0xf2,0x04,0x3f,0x04,0x33, +0x00,0x1d,0x00,0x3e,0x40,0x20,0x13,0x0b,0x37,0x0c,0x19,0x37,0x06,0x01,0x11,0x06,0x0c,0x06,0x0c,0x06,0x1f,0x0e,0x0a,0x39,0x13,0x13,0x0f,0x03,0x3a,0x1c,0x34,0x12,0x0e,0x39,0x0f,0x35,0x0c,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x32, +0x31,0x30,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x02,0x7c,0x32,0x49,0x4a,0x58,0x7e,0x72,0xba,0xa3,0xfe,0xd6,0x03,0x3a,0xfe,0x93,0xca,0x59,0x90,0x66,0x37,0xa4,0x97,0x4c,0x04,0x8c,0x19,0x5f,0x52,0x60,0x68,0xfe,0x10, +0x03,0xa9,0x8a,0x8a,0xfe,0xce,0x2c,0x56,0x7c,0x51,0x94,0xa2,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x1a,0x06,0x28,0x00,0x26,0x0d,0x6b,0x14,0x00,0x01,0x07,0x00,0x8e,0x00,0xd6,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x06,0x01,0x06,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x58,0xff,0xee,0x03,0xca,0x04,0x45,0x00,0x1c,0x00,0x2e,0x40,0x17, +0x0f,0x16,0x07,0x1c,0x1c,0x1e,0x14,0x17,0x38,0x07,0x17,0x39,0x14,0x14,0x1a,0x11,0x39,0x0c,0x36,0x1a,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21, +0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x03,0xca,0x83,0xc3,0x7d,0xcd,0x92,0x50,0x56,0x9a,0xd4,0x7f,0xb0,0x7f,0x86,0xaa,0xb1,0xcf,0x15,0x01,0xf7,0xfe,0x08,0x0e,0xc8,0xb4,0xb9,0x83,0x2d,0x3f,0x48,0x89,0xc7,0x7f,0x8a,0xd6,0x93,0x4d,0x2c,0x9e,0x40,0xa9,0xb6,0x89,0xa5,0xb7,0x48,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45, +0x02,0x06,0x0c,0xfd,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x01,0x54,0x04,0x33,0x02,0x06,0x0c,0xf3,0x00,0x00,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x11, +0xff,0xed,0x01,0xe5,0x04,0x33,0x02,0x06,0x0c,0xf4,0x00,0x00,0x00,0x02,0x00,0x0d,0xff,0xef,0x06,0x32,0x04,0x33,0x00,0x26,0x00,0x2f,0x00,0x44,0xb6,0x02,0x19,0x1b,0x28,0x37,0x00,0x21,0xb8,0x01,0x50,0x40,0x1b,0x2c,0x19,0x00,0x2c,0x2c,0x00,0x19,0x03,0x31,0x0f,0x27,0x39,0x1b,0x1b,0x28,0x02,0x39,0x19,0x35,0x11,0x39,0x0c,0x34, +0x28,0x39,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x11,0x33,0x31,0x30,0x21,0x11,0x21,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x12,0x37,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23, +0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x37,0xfe,0xe5,0x0e,0x1a,0x16,0x14,0x08,0x0f,0x26,0x45,0x6f,0x5a,0x42,0x30,0x2b,0x33,0x2c,0x38,0x27,0x1e,0x12,0x19,0x34,0x1d,0x02,0x4a,0xe2,0x58,0x8b,0x60,0x33,0x36,0x65,0x8f,0x58,0xd6,0xc4,0x70,0x7a,0x74,0x76,0x03,0xa9,0x66,0xa5,0x87,0x6a,0x2a,0x4e,0x92,0x70,0x44,0x0f, +0x8f,0x16,0x28,0x51,0x7a,0x52,0x70,0x01,0x39,0xce,0xfe,0x44,0x2b,0x50,0x73,0x48,0x4a,0x77,0x53,0x2d,0x01,0xed,0xfe,0x9d,0x52,0x5d,0x60,0x54,0x00,0x02,0x00,0xb0,0x00,0x00,0x06,0x46,0x04,0x33,0x00,0x08,0x00,0x1f,0x00,0x49,0xb6,0x1f,0x01,0x37,0x14,0x1c,0x14,0x0e,0xb8,0x01,0x50,0x40,0x1c,0x05,0x14,0x05,0x14,0x05,0x21,0x1b, +0x17,0x37,0x18,0x16,0x39,0x1b,0x00,0x39,0x1f,0x1b,0x1f,0x1b,0x1f,0x1d,0x19,0x35,0x01,0x39,0x17,0x14,0x33,0x00,0x3f,0x33,0xed,0x3f,0x33,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x32, +0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x03,0xf3,0xbf,0x70,0x7a,0x6f,0x76,0x1e,0x58,0x8a,0x5e,0x31,0x36,0x65,0x8f,0x58,0xfe,0x8c,0xfe,0x03,0xa3,0xa3,0x01,0xfd,0xa3,0x01,0xed,0xfe,0x9d,0x52,0x5d,0x60,0x54,0x8a,0x2b,0x50,0x73,0x48,0x4a,0x77,0x53,0x2d,0x01,0xec,0xfe, +0x14,0x04,0x33,0xfe,0x43,0x01,0xbd,0xfe,0x44,0x00,0x00,0x01,0x00,0x22,0x00,0x00,0x04,0x64,0x04,0x33,0x00,0x12,0x00,0x34,0x40,0x1a,0x0f,0x07,0x37,0x08,0x00,0x37,0x01,0x08,0x01,0x08,0x01,0x14,0x0a,0x06,0x39,0x0f,0x0f,0x08,0x0e,0x0a,0x39,0x0b,0x35,0x01,0x08,0x33,0x00,0x3f,0x33,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f, +0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x20,0x11,0x04,0x64,0xa4,0x6f,0x65,0xfc,0xa3,0xfe,0xd5,0x03,0x3a,0xfe,0x94,0xfd,0x01,0x77,0x01,0x24,0x66,0x5f,0xfe,0x17,0x03,0xa9,0x8a,0x8a,0xfe,0xc7,0xfe,0xb4,0x00,0xff,0xff, +0x00,0xb0,0x00,0x00,0x03,0xec,0x06,0x28,0x02,0x26,0x0c,0xf5,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x42,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x36,0xff,0xed,0x03,0xf4,0x05,0xdc,0x02,0x26,0x0d,0xab,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xea,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1c, +0x01,0x1c,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0xb0,0xfe,0xe0,0x04,0x2f,0x04,0x33,0x00,0x0b,0x00,0x2e,0x40,0x17,0x01,0x37,0x04,0x00,0x37,0x09,0x04,0x09,0x04,0x09,0x0d,0x08,0x37,0x05,0x0a,0x06,0x35,0x08,0x39,0x01,0x05,0x33,0x03,0x00,0x2f,0x3f,0x33,0xed,0x3f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed, +0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0x2f,0xfe,0x8b,0x98,0xfe,0x8e,0xa3,0x02,0x38,0xa4,0xfe,0xe0,0x01,0x20,0x04,0x33,0xfc,0x57,0x03,0xa9,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x02,0x06,0x0c,0xeb,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x9c,0x04,0x33,0x00,0x10, +0x00,0x1b,0x00,0x2f,0x40,0x18,0x03,0x12,0x0b,0x38,0x16,0x16,0x1d,0x05,0x12,0x37,0x00,0x11,0x39,0x05,0x05,0x12,0x04,0x39,0x01,0x35,0x12,0x39,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x33,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e, +0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0xb0,0x02,0x7c,0xfe,0x27,0xca,0x58,0x8e,0x64,0x35,0x38,0x67,0x92,0x59,0xbf,0xac,0x7d,0x75,0x1b,0x3b,0x5c,0x40,0x04,0x33,0x8a,0xfe,0xce,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xed,0xfe,0x9d,0x50,0x5f,0x30,0x45,0x2b,0x14,0x00,0xff,0xff,0x00,0xb0,0x00,0x00, +0x03,0xa1,0x04,0x33,0x02,0x06,0x0c,0xec,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x1a,0x04,0x33,0x00,0x06,0x0d,0x6b,0x14,0x00,0x00,0x02,0x00,0x12,0xfe,0xdf,0x04,0x6c,0x04,0x33,0x00,0x0f,0x00,0x18,0x00,0x44,0x40,0x23,0x0f,0x37,0x02,0x0e,0x37,0x10,0x12,0x37,0x0c,0x18,0x07,0x0c,0x07,0x10,0x06,0x02,0x10,0x02,0x10,0x1a, +0x03,0x37,0x06,0x12,0x39,0x0c,0x35,0x01,0x04,0x0e,0x07,0x18,0x39,0x03,0x33,0x00,0x3f,0xed,0x32,0x32,0x2f,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x36,0x37,0x12,0x37,0x21,0x11,0x33,0x21,0x11, +0x21,0x06,0x06,0x07,0x06,0x06,0x07,0x04,0x6c,0x98,0xfc,0xd7,0x99,0x5d,0x3c,0x64,0x2a,0x55,0x0a,0x02,0x34,0xa0,0xfe,0xbd,0xfe,0xfd,0x07,0x2d,0x27,0x27,0x56,0x30,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0xab,0x61,0xdf,0x81,0x01,0x02,0xe6,0xfc,0x57,0x03,0x1f,0x58,0xcb,0x75,0x76,0xc2,0x4f,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27, +0x04,0x33,0x02,0x06,0x0c,0xef,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0xe7,0x04,0x33,0x00,0x1d,0x00,0x17,0x40,0x0a,0x06,0x37,0x07,0x07,0x1f,0x1e,0x15,0x35,0x07,0x33,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16, +0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x05,0xe7,0xc9,0xfe,0x47,0x15,0x0a,0x04,0x9c,0x04,0x0b,0x13,0xfe,0x46,0xca,0x01,0xff,0xfe,0x25,0xb9,0x01,0xa7,0x13,0x0b,0x04,0x9c,0x04,0x0a,0x15,0x01,0xa6,0xb8,0xfe,0x26,0x01,0xec,0x14,0x11,0xfd,0xef,0x02,0x11,0x10,0x15,0xfe,0x14,0x02,0x2e,0x02,0x05,0xfe,0x2f,0x15, +0x10,0x01,0xf6,0xfe,0x0a,0x10,0x15,0x01,0xd1,0xfd,0xfb,0x00,0x00,0x01,0x00,0x50,0xff,0xee,0x03,0x3d,0x04,0x45,0x00,0x2f,0x00,0x39,0x40,0x1e,0x10,0x38,0x17,0x0c,0x23,0x03,0x00,0x20,0x20,0x00,0x29,0x38,0x08,0x08,0x31,0x00,0x24,0x0b,0x3a,0x0c,0x0c,0x1b,0x03,0x3b,0x2e,0x34,0x15,0x3b,0x1b,0x36,0x00,0x3f,0xed,0x3f,0xed,0x11, +0x39,0x2f,0xed,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x50,0x88,0xa9, +0x3d,0x65,0x46,0x27,0xfe,0xd9,0x76,0x6c,0x7e,0x89,0x1e,0x38,0x50,0x33,0x8e,0x89,0x42,0x96,0x56,0x54,0x88,0x60,0x34,0x75,0x71,0x3d,0x64,0x47,0x27,0x3d,0x72,0xa2,0x65,0xca,0x2d,0x96,0x5c,0x1b,0x33,0x48,0x2d,0xc2,0x80,0x60,0x58,0x25,0x3e,0x2c,0x18,0x55,0x8d,0x22,0x20,0x26,0x46,0x61,0x3b,0x69,0x83,0x1c,0x03,0x06,0x2b,0x44, +0x59,0x34,0x4a,0x77,0x54,0x2d,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x00,0x18,0x00,0x1e,0x40,0x0e,0x0e,0x37,0x0c,0x0f,0x0f,0x1a,0x17,0x01,0x37,0x00,0x17,0x33,0x01,0x35,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x13,0x33,0x11,0x14,0x06,0x07,0x33,0x3e,0x03,0x37,0x01,0x33,0x11,0x23, +0x11,0x34,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0xb0,0x99,0x04,0x04,0x03,0x03,0x09,0x11,0x19,0x12,0x02,0x35,0xb9,0x99,0x06,0x05,0x08,0x29,0x1f,0xfd,0xcc,0xae,0x04,0x33,0xfd,0x39,0x39,0x4e,0x17,0x05,0x10,0x18,0x23,0x19,0x02,0xfc,0xfb,0xcd,0x02,0xe1,0x71,0x23,0x13,0x41,0x2a,0xfd,0x09,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a, +0x05,0xdc,0x02,0x26,0x0d,0xa0,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x65,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1c,0x01,0x1c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x02,0x06,0x0c,0xf5,0x00,0x00,0x00,0x01,0x00,0x0d,0xff,0xef,0x03,0xda,0x04,0x33,0x00,0x1b,0x00,0x2b,0x40,0x16,0x03,0x37,0x1a,0x00, +0x37,0x01,0x1a,0x01,0x1a,0x01,0x1d,0x10,0x03,0x39,0x1a,0x35,0x12,0x39,0x0d,0x34,0x01,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x12,0x37,0x21,0x03,0xda,0xa3,0xfe, +0xe5,0x0e,0x1a,0x16,0x14,0x08,0x0f,0x26,0x45,0x6f,0x5a,0x42,0x30,0x2b,0x33,0x2c,0x38,0x27,0x1e,0x12,0x19,0x34,0x1d,0x02,0x4a,0x03,0xa9,0x66,0xa5,0x87,0x6a,0x2a,0x4e,0x92,0x70,0x44,0x0f,0x8f,0x16,0x28,0x51,0x7a,0x52,0x70,0x01,0x39,0xce,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x05,0x62,0x04,0x33,0x02,0x06,0x0c,0xf7,0x00,0x00, +0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x02,0x06,0x0c,0xf2,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x02,0x06,0x0c,0xf9,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x37,0x04,0x33,0x02,0x06,0x0d,0x78,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x02,0x06,0x0c,0xfa,0x00,0x00, +0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x04,0x45,0x02,0x06,0x0c,0xed,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x02,0x06,0x0c,0xfe,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0xed,0x03,0xf4,0x04,0x33,0x00,0x18,0x00,0x23,0x40,0x10,0x18,0x00,0x00,0x1a,0x12,0x11,0x10,0x16,0x06,0x18,0x11,0x35,0x0b,0x39,0x06,0x34, +0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x01,0x01,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x01,0x03,0xf4,0xfe,0x91,0x2c,0x56,0x61,0x72,0x48,0x57,0x3d,0x45,0x4c,0x1f,0x3a,0x39,0x3b,0x21,0xfe,0x63,0xb6,0x01,0x18,0x08,0x11, +0x06,0x01,0x01,0x23,0x04,0x33,0xfd,0x12,0x5a,0x82,0x54,0x28,0x17,0x98,0x26,0x0e,0x29,0x49,0x3c,0x03,0x01,0xfd,0xdc,0x0e,0x26,0x12,0x02,0x6a,0xff,0xff,0x00,0x50,0xff,0xf5,0x04,0xb1,0x04,0x3d,0x02,0x06,0x0d,0x7d,0x00,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x02,0x06,0x0d,0x02,0x00,0x00,0x00,0x01,0x00,0xb0, +0xfe,0xdf,0x04,0xce,0x04,0x33,0x00,0x0b,0x00,0x2a,0x40,0x15,0x02,0x37,0x0b,0x0b,0x09,0x37,0x08,0x08,0x0d,0x05,0x37,0x04,0x08,0x04,0x35,0x0a,0x06,0x39,0x03,0x33,0x01,0x00,0x2f,0x3f,0xed,0x32,0x3f,0x33,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33, +0x04,0xce,0x99,0xfc,0x7b,0xa3,0x02,0x38,0xa4,0x9f,0xfe,0xdf,0x01,0x21,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xb0,0x04,0x33,0x00,0x15,0x00,0x2b,0x40,0x15,0x15,0x37,0x02,0x14,0x14,0x17,0x0c,0x37,0x0b,0x10,0x39,0x02,0x0b,0x05,0x05,0x01,0x14,0x0b,0x35,0x01,0x33,0x00,0x3f,0x3f,0x33,0x12, +0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x23,0x11,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x03,0xb0,0xa3,0x56,0xa7,0x60,0x47,0x72,0x4f,0x2b,0xa3,0x54,0x60,0x4b,0x99,0x55,0xa3,0x01,0xd8,0x28,0x33,0x26,0x4b,0x6f,0x49,0x01,0x8d,0xfe, +0x90,0x64,0x5b,0x28,0x26,0x01,0xe1,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x05,0xc3,0x04,0x33,0x00,0x0b,0x00,0x2e,0x40,0x17,0x07,0x37,0x06,0x0b,0x37,0x0a,0x06,0x0a,0x06,0x0a,0x0d,0x03,0x37,0x02,0x0a,0x06,0x02,0x35,0x08,0x04,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0x33,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed, +0x10,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x05,0xc3,0xfa,0xed,0xa3,0x01,0x95,0xa3,0x01,0x95,0xa3,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x03,0xa9,0x00,0x00,0x01,0x00,0xb0,0xfe,0xdf,0x06,0x61,0x04,0x33,0x00,0x0f,0x00,0x39,0x40,0x1d,0x05,0x37,0x04,0x0e,0x37,0x0b,0x0b,0x09,0x37,0x08, +0x04,0x08,0x04,0x08,0x11,0x01,0x37,0x00,0x0a,0x06,0x02,0x39,0x0f,0x33,0x0d,0x08,0x04,0x00,0x35,0x00,0x3f,0x32,0x32,0x2f,0x3f,0xed,0x32,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x2f,0xed,0x10,0xed,0x31,0x30,0x13,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x21,0xb0,0xa3,0x01, +0x95,0xa3,0x01,0x95,0xa3,0x9e,0x99,0xfa,0xe8,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x03,0xa9,0xfc,0x57,0xfe,0x55,0x01,0x21,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x04,0x3b,0x04,0x33,0x00,0x10,0x00,0x19,0x00,0x33,0x40,0x1a,0x05,0x12,0x37,0x00,0x0b,0x38,0x16,0x00,0x16,0x00,0x16,0x1b,0x02,0x11,0x3a,0x05,0x05,0x12,0x02,0x39, +0x03,0x35,0x12,0x3a,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x4d,0xfe,0xd5,0x01,0xce,0xca,0x58,0x8f,0x64,0x36, +0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x03,0xa9,0x8a,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0x00,0x00,0x03,0x00,0xb0,0x00,0x00,0x04,0xf1,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x1b,0x00,0x35,0x40,0x1b,0x09,0x38,0x14,0x18,0x37,0x19,0x14,0x19,0x14,0x19,0x1d,0x03, +0x10,0x37,0x00,0x0f,0x3a,0x03,0x03,0x1a,0x01,0x35,0x10,0x3a,0x19,0x00,0x33,0x00,0x3f,0x32,0xed,0x3f,0x33,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x23,0x11, +0x33,0xb0,0xa3,0xca,0x58,0x8f,0x64,0x36,0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x02,0xf2,0xa4,0xa4,0x04,0x33,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0xfe,0x0f,0x04,0x33,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x9e,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x26,0x40,0x13, +0x09,0x38,0x14,0x14,0x19,0x03,0x10,0x37,0x00,0x0f,0x3a,0x03,0x03,0x01,0x35,0x10,0x3a,0x00,0x33,0x00,0x3f,0xed,0x3f,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0xb0,0xa3,0xca,0x58,0x8f,0x64, +0x36,0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x04,0x33,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0x00,0x00,0x01,0x00,0x54,0xff,0xee,0x03,0xc6,0x04,0x45,0x00,0x1c,0x00,0x2e,0x40,0x17,0x15,0x38,0x08,0x06,0x00,0x05,0x05,0x1e,0x0d,0x00,0x06,0x39,0x07,0x07,0x10,0x02, +0x39,0x1a,0x34,0x0b,0x39,0x10,0x36,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0xed,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x54,0x82,0xba,0xb4,0xc8,0x0e,0xfe,0x08,0x01, +0xf7,0x15,0xcf,0xb1,0xaa,0x86,0x7f,0xb0,0x86,0xd7,0x96,0x50,0x50,0x92,0xcd,0x7d,0xc4,0x82,0xbf,0x48,0xb7,0xa5,0x89,0xb6,0xa9,0x40,0x9e,0x2c,0x4d,0x94,0xd6,0x89,0x7f,0xc7,0x89,0x48,0x3f,0x00,0x00,0x02,0x00,0xb0,0xff,0xed,0x06,0x88,0x04,0x45,0x00,0x1a,0x00,0x2a,0x00,0x43,0xb9,0x00,0x23,0x01,0x50,0x40,0x20,0x0a,0x11,0x0a, +0x00,0x38,0x1b,0x0a,0x1b,0x0a,0x1b,0x2c,0x10,0x0c,0x37,0x0d,0x0b,0x3a,0x10,0x10,0x28,0x1e,0x39,0x16,0x36,0x0e,0x35,0x0d,0x33,0x28,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e, +0x02,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x06,0x88,0x52,0x91,0xc9,0x77,0x74,0xc1,0x8d,0x52,0x05,0xf9,0xa3,0xa3,0xfe,0x0e,0x57,0x8c,0xc0,0x78,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57, +0xb8,0xc0,0x02,0x27,0x86,0xd4,0x93,0x4d,0x4b,0x87,0xbd,0x72,0xfe,0x12,0x04,0x33,0xfe,0x3d,0x68,0xac,0x7c,0x45,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x00,0x02,0x00,0x12,0x00,0x00,0x03,0x39,0x04,0x33,0x00,0x1c,0x00,0x27,0x00,0x3d,0xb9,0x00,0x22,0x01,0x50,0x40,0x1b,0x16,0x1d,0x00, +0x37,0x01,0x10,0x01,0x16,0x01,0x16,0x01,0x29,0x09,0x0a,0x10,0x03,0x3a,0x27,0x27,0x09,0x1e,0x3a,0x1c,0x35,0x01,0x09,0x33,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x33,0x10,0xed,0x31,0x30,0x21,0x23,0x11,0x23,0x22,0x0e,0x02,0x07,0x03,0x23,0x13,0x3e,0x03, +0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x03,0x39,0xa4,0x9c,0x16,0x26,0x24,0x24,0x14,0x97,0xb8,0xb7,0x08,0x1b,0x23,0x2b,0x18,0x3b,0x5d,0x40,0x22,0x39,0x66,0x8f,0x56,0x01,0x5d,0xa3,0xb0,0x6d,0x77,0x20,0x3b,0x52,0x33,0x01,0xb5,0x08,0x1b,0x32,0x2a,0xfe,0xca,0x01, +0x63,0x10,0x26,0x24,0x1e,0x09,0x03,0x0c,0x32,0x49,0x5d,0x36,0x46,0x71,0x50,0x2b,0xfe,0x08,0x01,0x72,0x5e,0x58,0x2c,0x45,0x31,0x1a,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x1a,0x04,0xf9,0x00,0x07,0x00,0x1f,0x40,0x0f,0x00,0x37,0x05,0x05,0x09,0x02,0x37,0x03,0x06,0x01,0x39,0x04,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0xce,0x01,0x2f, +0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x33,0x03,0x1a,0xfe,0x39,0xa3,0x01,0xda,0x90,0x03,0xa9,0xfc,0x57,0x04,0x33,0xc6,0x00,0x01,0x00,0x35,0x00,0x00,0x03,0xff,0x06,0x04,0x00,0x1d,0x00,0x37,0x40,0x1c,0x1c,0x04,0x84,0x09,0x05,0x05,0x01,0x07,0x13,0x00,0x84,0x01,0x13,0x13,0x08,0x16,0x95,0x0f, +0x01,0x03,0x07,0x95,0x1c,0x08,0x0f,0x01,0x05,0x15,0x00,0x3f,0x33,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x21,0x03, +0xff,0xa4,0xfe,0x2c,0xa4,0xae,0xae,0x40,0x81,0xc2,0x81,0x48,0x7e,0x23,0x2e,0x7f,0x49,0x53,0x7f,0x56,0x2b,0x02,0x78,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xb3,0x8a,0x54,0x09,0x09,0x94,0x0e,0x0d,0x37,0x61,0x85,0x4f,0x0d,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x04,0x01,0x06,0x04,0x00,0x1d,0x00,0x33,0x40,0x1a,0x0b,0x0f, +0x84,0x14,0x10,0x0d,0x10,0x0d,0x01,0x12,0x00,0x84,0x01,0x05,0x95,0x1a,0x01,0x0e,0x12,0x95,0x0b,0x13,0x0f,0x01,0x10,0x15,0x00,0x3f,0x33,0x3f,0x33,0xed,0x32,0x3f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11, +0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x04,0x01,0xa2,0x17,0x56,0x2c,0x53,0x79,0x4e,0x25,0xf1,0xf1,0xa4,0xae,0xae,0x3a,0x79,0xbc,0x81,0x3e,0x96,0x5a,0x05,0x6e,0x04,0x07,0x37,0x61,0x85,0x4f,0x0d,0x8b,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xb3,0x8a,0x54,0x0b,0x0d,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x05,0x19, +0x06,0x02,0x00,0x2c,0x00,0x59,0x40,0x2f,0x11,0x28,0x84,0x29,0x00,0x29,0x20,0x24,0x84,0x12,0x0a,0x25,0x29,0x25,0x22,0x22,0x25,0x29,0x03,0x1a,0x2b,0x1a,0x27,0x23,0x2b,0x95,0x2c,0x0a,0x1b,0x0a,0x1b,0x06,0x20,0x11,0x2c,0x0f,0x25,0x29,0x15,0x1d,0x95,0x18,0x01,0x0d,0x95,0x06,0x00,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x3f,0x33, +0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x13,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x15, +0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0xe3,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e,0x53,0x30,0x6d,0x71,0x01,0xd5,0x30,0x57,0x78,0x47,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0xf0,0xa4,0xfe,0x2b,0xa4,0xae,0x04,0x00,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0xa6,0x4e,0x80,0x5b,0x33,0x12,0x94,0x1b, +0xd9,0x9e,0x8b,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x00,0x01,0x00,0x35,0x00,0x00,0x06,0x78,0x06,0x04,0x00,0x33,0x00,0x62,0x40,0x36,0x1e,0x08,0x84,0x09,0x0d,0x09,0x32,0x04,0x84,0x1f,0x17,0x05,0x09,0x05,0x09,0x05,0x01,0x0b,0x29,0x00,0x84,0x01,0x2c,0x95,0x25,0x01,0xb0,0x29,0xc0,0x29,0xe0,0x29,0x03,0x17,0x29,0x17, +0x29,0x0c,0x1a,0x95,0x13,0x00,0x07,0x03,0x0b,0x95,0x32,0x1e,0x0c,0x0f,0x05,0x01,0x09,0x15,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x3f,0xed,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21, +0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x21,0x06,0x78,0xa4,0xfe,0x2c,0xa4,0xfe,0x2b,0xa4,0xae,0xae,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e, +0x53,0x30,0x6d,0x71,0x01,0xd5,0x40,0x81,0xc2,0x81,0x48,0x7e,0x23,0x2e,0x7f,0x49,0x53,0x7f,0x56,0x2b,0x02,0x78,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0x15,0x5e,0xb3,0x8a,0x54,0x09,0x09,0x94,0x0e,0x0d,0x37,0x61,0x85,0x4f,0x0d,0x00,0x00,0x01, +0x00,0x35,0x00,0x00,0x06,0x78,0x06,0x04,0x00,0x33,0x00,0x58,0x40,0x2f,0x29,0x13,0x84,0x14,0x18,0x14,0x0b,0x0f,0x84,0x2a,0x22,0x10,0x14,0x10,0x0d,0x0d,0x10,0x14,0x03,0x01,0x16,0x00,0x84,0x01,0x05,0x95,0x30,0x01,0x22,0x22,0x17,0x25,0x95,0x1e,0x00,0x12,0x0e,0x16,0x95,0x29,0x0b,0x17,0x0f,0x10,0x01,0x14,0x15,0x00,0x3f,0x33, +0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x2f,0x3f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02, +0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x06,0x78,0xa2,0x17,0x56,0x2c,0x53,0x79,0x4e,0x25,0xf1,0xf1,0xa4,0xfe,0x2d,0xa4,0xae,0xae,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e,0x53,0x30,0x6d,0x71,0x01,0xd3,0x3a,0x79,0xbc,0x81,0x3e,0x96,0x5a,0x05,0x6e,0x04,0x07, +0x37,0x61,0x85,0x4f,0x0d,0x8b,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0x15,0x5e,0xb3,0x8a,0x54,0x0b,0x0d,0x00,0x00,0x03,0x00,0x57,0xff,0xef,0x05,0x31,0x04,0x45,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0x6d,0x40,0x3e,0x38,0x05,0x0f,0x33,0x37,0x2c,0x29,0x49, +0x2c,0x53,0x24,0x4e,0x12,0x03,0x17,0x21,0x37,0x58,0x60,0x37,0x17,0x40,0x2c,0x58,0x17,0x17,0x58,0x2c,0x40,0x04,0x69,0x53,0x37,0x0f,0x12,0x4e,0x49,0x05,0x04,0x00,0x5d,0x3b,0x1c,0x2f,0x2f,0x44,0x65,0x24,0x29,0x38,0x04,0x3d,0x1c,0x36,0x44,0x39,0x0a,0x34,0x3d,0x39,0x00,0x34,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x17,0x39,0x12, +0x39,0x2f,0x10,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07, +0x1e,0x03,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x13,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x04,0xb2,0x2f,0x4a,0x41,0x3b,0x1f,0x23,0x56,0x6a, +0x7e,0x4b,0x5c,0x97,0x6c,0x3c,0x8b,0x85,0x19,0x30,0x26,0x17,0x30,0x53,0x71,0x41,0x40,0x6c,0x4d,0x2b,0x65,0x65,0x34,0x56,0x4a,0x3f,0x1e,0x33,0x35,0x08,0x07,0xa1,0x08,0x06,0x14,0x2a,0x40,0x2c,0x1d,0x2d,0x2d,0x33,0x21,0x18,0x34,0x1b,0x1e,0x41,0xfd,0x20,0x3a,0x63,0x52,0x44,0x1c,0x2a,0x4f,0x56,0x63,0x3d,0x2d,0x4e,0x39,0x20, +0x26,0x42,0x59,0xde,0x19,0x28,0x31,0x18,0x44,0x51,0x01,0x14,0x21,0x2a,0x17,0x5a,0x50,0x11,0x12,0x23,0x33,0x20,0x1b,0x31,0x26,0x16,0x2a,0x51,0x76,0x4b,0x73,0xa1,0x34,0x10,0x2b,0x36,0x43,0x28,0x3c,0x5b,0x3f,0x20,0x20,0x3c,0x54,0x34,0x5a,0x77,0x2a,0x14,0x3b,0x48,0x53,0x2b,0x55,0xcb,0x70,0x1d,0x32,0x19,0x19,0x2c,0x1e,0x40, +0x86,0x83,0x7e,0x37,0x20,0x2b,0x1a,0x0b,0x0c,0x09,0x85,0x0e,0x0b,0x8b,0x10,0x1d,0x27,0x18,0x3e,0x63,0x4d,0x3a,0x16,0x11,0x29,0x39,0x4a,0x32,0x2f,0x46,0x2e,0x18,0x02,0xd7,0x1f,0x2e,0x1e,0x0e,0x45,0x3b,0x1a,0x2f,0x28,0x20,0x0b,0x1c,0x4e,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x2c,0x02,0x26,0x0c,0xed,0x00,0x00, +0x01,0x07,0x00,0xd7,0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x06,0x2c,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x1e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xfe,0x85,0x03,0x08, +0x04,0x45,0x02,0x26,0x0c,0xfd,0x00,0x00,0x00,0x06,0x01,0x9c,0x25,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0xff,0xff,0x00,0x52,0x00,0x00,0x03,0xbf,0x05,0x9a,0x01,0x0f,0x00,0x33,0x04,0x7b,0x05,0x9a, +0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x03,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0x27,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x27,0x00,0x00,0x04,0x0a,0x05,0x9a,0x01,0x47,0x00,0x37,0xff,0xfe,0x05,0x9a, +0x40,0x00,0xc0,0x00,0x00,0x07,0xb2,0x00,0x07,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x05,0xb2,0x02,0x06,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x00,0x03,0xe8,0x05,0x9a,0x01,0x0f,0x00,0x2e,0x04,0xa4,0x05,0x9a, +0xc0,0x00,0x00,0x07,0xb2,0x00,0x08,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x01,0x0f,0x00,0x26,0x04,0xf4,0x05,0x9a,0xc0,0x00, +0x00,0x07,0xb2,0x00,0x08,0x13,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x02,0x06,0x00,0x3d,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0x94,0x05,0x9a,0x02,0x06,0x00,0x29,0x00,0x00,0xff,0xff,0x00,0x54,0x00,0x00,0x03,0x2c,0x05,0x9a,0x01,0x0f,0x00,0x29,0x03,0xe8,0x05,0x9a,0xc0,0x00,0x00,0x07, +0xb2,0x00,0x08,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x00,0x31,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde, +0x05,0xb2,0x02,0x06,0x00,0x36,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x05,0x9a,0x02,0x06,0x00,0x35,0x00,0x00,0xff,0xff,0x00,0x09,0x00,0x00,0x04,0x0d,0x05,0x9a,0x01,0x0f,0x00,0x35,0x04,0xc9,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x0b,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6, +0x05,0x9a,0x01,0x0f,0x00,0x39,0x04,0xf8,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6,0x05,0x9a,0x02,0x06,0x00,0x39,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0x91,0xff,0xe8,0x05,0x1f,0x05,0xb2, +0x01,0x0f,0x00,0x2a,0x05,0x7d,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x08,0x13,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x02,0xc7,0x05,0xb2,0x01,0x0f,0x00,0x2d,0x02,0xdb,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x0b,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x02,0x06,0x00,0x3a, +0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x03,0xda,0x05,0x9a,0x01,0x0f,0x00,0x25,0x04,0x96,0x05,0x9a,0xc0,0x00,0x00,0x0b,0xb4,0x02,0x01,0x00,0x01,0x12,0x00,0x3f, +0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0x17,0x00,0x00,0x05,0x13,0x05,0x9a,0x01,0x0f,0x00,0x24,0x05,0x29,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x06,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06, +0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x58,0x00,0x00,0x03,0x50,0x05,0x9a,0x01,0x0f,0x00,0x28,0x04,0x0c,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32, +0x00,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x05,0x9a,0x02,0x06,0x00,0x38,0x00,0x00,0xff,0xff,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0xb2,0x01,0x0f,0x00,0x38,0x05,0x7f,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x05,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x01,0x0f,0x00,0x2f,0x03,0xc4, +0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x5e,0x00,0x00,0x04,0xe0,0x05,0x9a,0x01,0x0f,0x00,0x27,0x05,0x9c,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x01,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x00,0xcb,0x02,0x06,0x00,0x11,0x00,0x00,0xff,0xff, +0x00,0x27,0xfe,0xf8,0x01,0x3c,0x00,0xe4,0x02,0x06,0x00,0x0f,0x00,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x03,0x0c,0x00,0xcb,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x00,0x11,0x01,0xbc,0x00,0x00,0xff,0xff,0x00,0x70,0xfe,0xf8,0x02,0xf8,0x00,0xe4,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x00,0x0f,0x01,0xbc,0x00,0x00,0xff,0xff, +0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16,0x02,0x06,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x02,0x06,0x00,0x1d,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0xea,0x04,0x83,0x02,0x7b,0x00,0x26,0x00,0x10,0x00,0x00,0x00,0x07,0x00,0x11,0x03,0x33,0x00,0x00,0xff,0xff,0x00,0x90,0x01,0xc8,0x02,0xb2,0x03,0xf4, +0x02,0x27,0x00,0x10,0x00,0x00,0x01,0x79,0x00,0x06,0x00,0x10,0x00,0xce,0x00,0x01,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x61,0x40,0x40,0x02,0x0a,0x92,0x0b,0x03,0x03,0x07,0x92,0x40,0x06,0x01,0x04,0x0e,0x03,0x07,0x08,0x42,0x0a,0x07,0x40,0x03,0x06,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x06,0x0b,0x06, +0x4d,0x03,0x7e,0x08,0x08,0x04,0x0d,0x06,0x4d,0x08,0x02,0x0c,0x06,0x4d,0x08,0x02,0x0b,0x06,0x4d,0x08,0x40,0x0d,0x01,0x4d,0x0c,0x0d,0x08,0x7e,0xff,0x30,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x1a,0x18,0xcd,0x32,0x2b,0x01,0x10,0xe1,0x32,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x01,0x15,0x23, +0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x01,0xf0,0x8c,0x8c,0xfe,0x40,0x8c,0x8c,0x05,0x9a,0x90,0xfb,0x86,0x90,0x90,0x04,0x7a,0x90,0x00,0x00,0x02,0x00,0x5e,0xfe,0x7c,0x05,0xcc,0x05,0xb2,0x00,0x28,0x00,0x38,0x00,0x96,0x40,0x29,0x78,0x12,0x01,0x14,0x00,0x29,0x91,0x0b,0x04,0x31,0x91,0x00,0x19,0xee,0x24,0x1e,0x1e,0x75, +0x14,0x01,0x14,0x00,0x07,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x35,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x35,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x35,0xb8,0xff,0xea,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x35,0x30,0x35,0x02,0x35,0x35,0x3a,0x2d,0x06,0x0d,0x06,0x4d,0x2d,0x06,0x0c,0x06, +0x4d,0x2d,0x06,0x0b,0x06,0x4d,0x2d,0x7d,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x10,0x0b,0x06,0x4d,0x07,0x2f,0x3a,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x5d,0xc2,0x2f,0x00,0x2f,0xed,0x2f,0xed,0x3f,0xed,0x12,0x39,0x31,0x30, +0x01,0x5d,0x05,0x22,0x2e,0x02,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x03,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x10,0x27,0x26,0x02,0xf4,0x40,0x84,0x7c,0x71,0x2e,0xb7,0xba,0xbc,0x01,0x46,0x01, +0x24,0xb6,0xb6,0x3d,0x7c,0xbc,0x80,0x34,0x5b,0x5b,0x62,0x3b,0x10,0x26,0x27,0x24,0x0f,0x10,0x28,0x29,0x28,0x11,0x60,0x99,0x85,0x7c,0x2e,0xe2,0x8d,0x8d,0x89,0x8a,0xdd,0xec,0x88,0x88,0x84,0x84,0x18,0x19,0x33,0x4b,0x32,0xc8,0x01,0x43,0x01,0x5b,0xcd,0xce,0xc8,0xc8,0xfe,0xbd,0x88,0xf1,0xc2,0x87,0x1d,0x38,0x56,0x3b,0x1e,0x03, +0x07,0x09,0x06,0xa2,0x05,0x07,0x05,0x03,0x39,0x63,0x84,0x05,0x7e,0xa3,0xa3,0xfe,0xf7,0xfe,0xf8,0xa3,0xa1,0x9a,0x9a,0x01,0x15,0x01,0x1d,0x9a,0x9b,0x00,0x00,0x03,0x00,0x77,0xff,0xe7,0x05,0x91,0x05,0xb2,0x00,0x29,0x00,0x37,0x00,0x46,0x00,0x69,0x40,0x3c,0x02,0x38,0x3b,0x0b,0x04,0x12,0x04,0x24,0x27,0x1f,0x1c,0x36,0x24,0x05, +0x12,0x01,0x45,0x95,0x04,0x13,0x2f,0x96,0x12,0x04,0x27,0x02,0x25,0x09,0x1f,0x38,0x24,0x40,0x0b,0x36,0x3b,0x1c,0x04,0x17,0x0d,0x25,0xef,0x24,0x17,0x84,0x2a,0x34,0x84,0x0d,0x0d,0x2a,0x24,0x03,0x09,0x01,0x00,0x00,0x48,0x40,0x83,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x17,0x39,0x2f,0xe1,0x2f,0xe1,0x2f,0xe1,0x11,0x12,0x17, +0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2f,0x11,0x17,0x39,0x2f,0x11,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x27,0x06,0x21,0x22,0x2e,0x02,0x35,0x34,0x25,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x17,0x3e,0x03,0x37,0x33,0x02,0x07,0x16,0x16,0x01,0x34,0x2e, +0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x17,0x36,0x13,0x26,0x26,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x05,0x91,0xe5,0x9a,0xc2,0xfe,0xed,0x67,0xa7,0x77,0x41,0x01,0x47,0x9b,0x38,0x65,0x8a,0x52,0x4d,0x7e,0x5a,0x31,0x21,0x4c,0x7c,0x5b,0x67,0xbb,0x55,0x17,0x29,0x20,0x12,0x01,0x97,0x01,0xab,0x14,0x87,0xfe,0x34,0x1c,0x30, +0x41,0x25,0x32,0x50,0x39,0x1e,0x8d,0xfe,0x62,0x46,0xcc,0x87,0x45,0x60,0x3c,0x1b,0x2c,0x4d,0x68,0x3d,0xdc,0x9e,0xb7,0x39,0x66,0x8e,0x56,0xfd,0xa7,0xc7,0x8b,0x49,0x7c,0x5a,0x33,0x2d,0x50,0x6e,0x40,0x42,0x6b,0x5f,0x56,0x2d,0x6d,0xbe,0x54,0x21,0x5c,0x67,0x6a,0x2f,0xfe,0xf2,0xd8,0x14,0x87,0x04,0x04,0x27,0x43,0x30,0x1c,0x1e, +0x37,0x4c,0x2e,0x6d,0x9d,0x7a,0xfd,0x30,0x48,0xd3,0x8f,0x23,0x45,0x4b,0x54,0x32,0x3a,0x5e,0x42,0x24,0x00,0x02,0x00,0xb4,0xff,0xee,0x01,0x91,0x05,0x9a,0x00,0x03,0x00,0x17,0x00,0x1e,0x40,0x0f,0x03,0x03,0x02,0x13,0xb0,0x09,0x13,0x01,0x02,0x00,0x7d,0x03,0x04,0xaf,0x0e,0x2f,0xe1,0xd4,0xe1,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f, +0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x01,0x77,0x14,0x72,0x14,0xb4,0x11,0x1e,0x28,0x17,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x16,0x28,0x1e,0x12,0x05,0x9a,0xfb,0xf9,0x04,0x07,0xfa,0xc2,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x17,0x28,0x1e,0x12, +0x12,0x1e,0x29,0x00,0x00,0x01,0x00,0x5c,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x14,0x00,0x17,0x40,0x0a,0x14,0x0c,0xb2,0x15,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31,0x30,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x5c,0x37,0x4c, +0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x5e,0xfe,0xed,0x01,0x52,0x04,0x17,0x00,0x13,0x00,0x28,0x00,0x22,0x40,0x11,0x05,0xb0,0x0f,0x10,0x28,0x20,0xb2,0x29,0x00,0xaf,0x0a,0x17,0x23,0x14, +0x23,0xaf,0x1d,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x10,0xf4,0xc4,0x3f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0x52,0x12,0x1e,0x29,0x18,0x17,0x28,0x1e,0x11, +0x11,0x1e,0x28,0x17,0x16,0x29,0x20,0x12,0xf4,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x03,0xa8,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x28,0x1e,0x12,0x11,0x1e,0x29,0xfb,0x69,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x02,0x00,0x83, +0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x32,0x40,0x0b,0x19,0x17,0x95,0x1c,0x04,0x09,0x30,0xb0,0x26,0x13,0x08,0xb8,0x01,0x03,0x40,0x0c,0x09,0x21,0xaf,0x2b,0x2b,0x19,0x00,0x84,0x12,0x12,0x36,0x19,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x14, +0x07,0x0e,0x03,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x31,0xcf,0x31,0x44,0x2a,0x12,0x70,0x0f,0x25,0x3d,0x2d,0x57,0x59,0x21,0x3d,0x55,0x34,0xa9,0x7c,0x99,0xa5, +0x53,0x88,0x60,0x35,0xfe,0xc1,0x11,0x1e,0x28,0x18,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x17,0x28,0x1e,0x12,0x04,0x5a,0xce,0xaf,0x2a,0x41,0x39,0x3a,0x22,0x4a,0x4e,0x31,0x52,0x4a,0x48,0x29,0x4e,0x8f,0x50,0x31,0x51,0x39,0x20,0x85,0xb0,0x60,0x32,0x5a,0x7f,0xfb,0xb5,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x17,0x28,0x1e, +0x12,0x12,0x1e,0x28,0x00,0x02,0x00,0x6f,0x03,0xd0,0x02,0x9c,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x32,0x40,0x18,0x21,0x0c,0x29,0x14,0x04,0x18,0x1e,0x24,0x03,0x09,0x0f,0x15,0x15,0x1e,0xaf,0x24,0x24,0x2b,0x11,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00, +0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x05,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x01,0x6b, +0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0x03,0xd0,0x02,0x95,0x05,0xb2, +0x00,0x14,0x00,0x29,0x00,0x2c,0x40,0x15,0x14,0x29,0x0c,0x21,0x04,0x03,0x0f,0x09,0x18,0x24,0x1e,0x00,0x0f,0xaf,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0xc6,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32, +0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18, +0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x6f,0x03,0xd0,0x01,0x61,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x0c,0x14,0x04,0x03,0x09,0x0f,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2, +0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44, +0x1e,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x15,0x40,0x09,0x14,0x0c,0x04,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x74,0x37,0x4c,0x14,0x1a,0x28,0x1a, +0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x62,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x16,0x00,0x17,0x40,0x0a,0x16,0x0e,0xb2,0x17,0x05,0x11,0x00,0x11,0xaf,0x0b,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31, +0x30,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x62,0x1b,0x31,0x24,0x15,0x19,0x1d,0x28,0x1a,0x2f,0x30,0x3b,0x45,0x20,0x35,0x46,0x27,0xde,0x16,0x31,0x31,0x2f,0x15,0x19,0x13,0x0d,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68, +0xfe,0xed,0x02,0x95,0x00,0xcf,0x00,0x14,0x00,0x29,0x00,0x2a,0x40,0x14,0x14,0x0c,0x29,0x21,0xb2,0x2a,0x18,0x24,0x1e,0x03,0x0f,0xaf,0x09,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x2f,0xe1,0x39,0x11,0x12,0x39,0x00,0x10,0xf4,0xc4,0x33,0x32,0x31,0x30,0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35, +0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d, +0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0xff,0xff,0x00,0x60,0xff,0xe8,0x05,0x76,0x05,0xf6,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x0e,0x10,0x03,0x70,0x06,0x63,0x00,0x14,0x40,0x0b, +0x02,0x27,0x9d,0x27,0x27,0x10,0x10,0x25,0x02,0x2a,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0xa4,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x0e,0x10,0x01,0x54,0x06,0x11,0x00,0x16,0xb1,0x01,0x15,0xb8,0xff,0xb6,0xb7,0x15,0x15,0x05,0x05,0x25,0x01,0x12,0x04,0x00,0x3f,0x35,0x01,0x2b, +0x11,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0x8b,0x05,0xf6,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x0e,0x10,0x00,0x85,0x06,0x63,0x00,0x14,0x40,0x0b,0x01,0x0d,0x78,0x0d,0x0d,0x03,0x03,0x25,0x01,0x10,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0xff,0xe4,0x00,0x00,0x04,0x4a,0x05,0xb2,0x00,0x26,0x00,0x51,0x52,0x00, +0x01,0x07,0x0d,0xfc,0xff,0x70,0x00,0x00,0x00,0x16,0xb1,0x01,0x1f,0xb8,0xff,0x62,0xb7,0x1f,0x1f,0x0a,0x0a,0x25,0x01,0x1f,0x04,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0x5e,0xfe,0x05,0x04,0xec,0x05,0xb2,0x02,0x26,0x00,0x2a,0x00,0x00,0x00,0x07,0x0e,0x10,0x01,0x65,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10, +0x06,0x3c,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x0f,0x0e,0x10,0x03,0xe5,0x04,0x41,0xc0,0x00,0x00,0x15,0x40,0x0c,0x02,0x32,0x11,0x26,0x02,0x35,0x0b,0x35,0x2f,0x10,0x18,0x25,0x01,0x2b,0x11,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xd6, +0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0x87,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x00,0x07,0x0e,0x10,0x01,0x45,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51, +0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xc5,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xf9,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x06,0x0e,0x10,0xed,0x00,0xff,0xff,0x00,0x2b,0xff,0xea,0x03,0x7f, +0x05,0xf6,0x00,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x0e,0x10,0x01,0x79,0x06,0x63,0x00,0x16,0xb1,0x01,0x1e,0xb8,0x01,0x37,0xb7,0x1e,0x1e,0x0a,0x0a,0x25,0x01,0x21,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0x79,0xfe,0x05,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x06,0x0e,0x10,0x7f,0x00,0xff,0xff, +0x00,0x68,0xfe,0x05,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06,0x0e,0x10,0x14,0x00,0xff,0xff,0x00,0x5e,0xfe,0xed,0x01,0x52,0x04,0x17,0x02,0x06,0x0d,0xf7,0x00,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x00,0x08,0x04,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x2f, +0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x36,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a, +0x5f,0x2d,0x00,0x01,0x01,0x3d,0xfe,0x05,0x02,0x06,0xff,0x93,0x00,0x12,0x00,0x12,0xb6,0x12,0x0c,0x03,0x0f,0x00,0x0f,0x09,0x2f,0xc1,0xc4,0x12,0x39,0x00,0x2f,0xc4,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x50,0x31,0x21,0x12,0x17,0x24,0x18,0x2b,0x2e,0x33, +0x3d,0x45,0x46,0xfe,0x3a,0x28,0x41,0x17,0x16,0x12,0x0b,0x10,0x22,0x1e,0x22,0x34,0x48,0x45,0x4e,0x7c,0x37,0x00,0xff,0xff,0x00,0x29,0xfe,0x05,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x00,0x06,0x0e,0x10,0x7a,0x00,0xff,0xff,0x00,0x2b,0xfe,0x05,0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x00,0x06,0x0e,0x10, +0xe5,0x00,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x3d,0x00,0x60,0x40,0x25,0x3b,0x36,0x14,0x0f,0x36,0x0f,0x36,0x0f,0x3f,0x25,0x31,0x28,0x11,0x38,0x38,0x2d,0x1f,0x19,0x0d,0x33,0x0d,0x00,0x01,0x01,0x02,0x0a,0x2d,0x0d,0x26,0x0a,0x0a,0x26,0x0d,0x2d,0x04,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08, +0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xcd,0x32,0x11,0x33,0x11,0x33,0x10,0xcd,0x32,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x10,0xcd,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x03,0x16,0x33, +0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01,0xce,0x01,0x61,0x93,0x17, +0x12,0x4e,0x11,0x64,0x12,0x15,0x28,0x3a,0x26,0x17,0x32,0x1c,0x11,0x36,0x16,0x14,0x10,0x01,0x06,0x07,0x64,0x08,0x10,0x1a,0x12,0x67,0x0a,0x10,0x07,0x12,0x0e,0x23,0x23,0x11,0x63,0x10,0x06,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x02,0x1c,0x05,0x50,0x29,0x24,0x2f,0x2f,0x24,0x40,0x31,0x1c,0x0d, +0x10,0x0f,0x0d,0x03,0x01,0x32,0x6b,0x4a,0x7a,0x77,0x47,0x78,0x74,0x7a,0x49,0x2a,0x4a,0x24,0x05,0x2c,0x25,0x25,0x27,0x26,0x2e,0x12,0x24,0x00,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x3a,0x00,0x57,0xb3,0x09,0x10,0x10,0x35,0xb8,0x05,0x0d,0xb6,0x2a,0x20,0x20,0x2a,0x30,0x2f,0x1b,0xb8,0x04,0xfd,0x40, +0x11,0x15,0x00,0x01,0x01,0x02,0x0a,0x25,0x0b,0x2f,0x03,0x08,0x15,0x0a,0x15,0x0a,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08,0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x10,0xcd,0x32,0x11,0x33,0x10,0xed,0x10,0xcd,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f, +0x39,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x03,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01, +0xce,0x01,0x61,0xbf,0x38,0x3f,0x20,0x07,0x12,0x1e,0x25,0x12,0x24,0x33,0x1e,0x41,0x42,0x23,0x45,0x36,0x22,0x09,0x1b,0x2f,0x26,0x24,0x2d,0x19,0x0a,0x15,0x36,0x5d,0x48,0x33,0x3b,0x1e,0x08,0x11,0x26,0x3f,0x2e,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x01,0xa7,0x34,0x4a,0x32,0x1c,0x06,0x0d,0x0f, +0x08,0x03,0x07,0x08,0x67,0x14,0x0d,0x1c,0x2f,0x22,0x0f,0x2c,0x36,0x3f,0x23,0x10,0x21,0x21,0x21,0x11,0x19,0x33,0x31,0x2f,0x16,0x6c,0x0c,0x16,0x14,0x11,0x06,0x0a,0x14,0x18,0x20,0x17,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x30,0x00,0x4f,0xb1,0x09,0x1d,0xbb,0x05,0x0b,0x00,0x1e,0x00,0x14,0x04,0xfd, +0x40,0x14,0x27,0x0b,0x0b,0x27,0x00,0x01,0x01,0x02,0x0a,0x2c,0x08,0x0f,0x1d,0x0a,0x0a,0x1d,0x0f,0x03,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08,0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xcd,0x32,0x11,0x33,0x2f,0x33,0x2f,0x10,0xed,0x01,0x2f,0xed, +0x39,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x13,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01,0xce,0x01,0x61,0x23, +0x22,0x34,0x10,0x76,0x07,0x16,0x1c,0x24,0x14,0x13,0x11,0x0a,0x0b,0x0a,0x64,0x0c,0x0f,0x0c,0x4a,0x34,0x21,0x39,0x2e,0x22,0x0a,0x02,0x0d,0x1a,0x11,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x02,0xb5,0x35,0x8b,0x47,0x1b,0x37,0x2b,0x1c,0x17,0x12,0x0f,0x2b,0x4f,0x78,0x5b,0x7a,0x77,0x5e,0x82,0x5a, +0x39,0x15,0x36,0x3e,0x16,0x25,0x31,0x19,0x25,0x3b,0x1f,0x00,0x00,0x02,0x00,0x1e,0xfe,0xa9,0x06,0xd2,0x03,0x61,0x00,0x3b,0x00,0x4d,0x00,0x5d,0xb4,0x38,0x25,0x16,0x10,0x06,0xb8,0x05,0x0a,0xb4,0x25,0x49,0x49,0x25,0x41,0xb8,0x05,0x0a,0xb7,0x2d,0x25,0x2d,0x25,0x2d,0x4f,0x13,0x19,0xb8,0x05,0x0a,0xb3,0x10,0x25,0x05,0x28,0xb8, +0x04,0xfb,0xb5,0x38,0x2f,0x46,0x01,0x46,0x3c,0xb8,0x04,0xfb,0xb4,0x2f,0x32,0x01,0x32,0x1e,0xb9,0x04,0xfb,0x00,0x0b,0x00,0x2f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x2f,0x10,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x01,0x0e,0x03,0x07,0x15,0x14,0x0e, +0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x25,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x2e,0x03,0x06,0xd2,0x0f,0x2c,0x39,0x43,0x25, +0x49,0x99,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x09,0x08,0xfe,0xc7,0x01,0xeb,0x13,0x13,0x2b,0x64,0xa5,0x7a,0x62,0x8f,0x64,0x3e,0x24,0x0e,0x02,0x2d,0x57,0x28,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x23,0x30,0x0c,0x33,0x5a,0x23,0xfd,0xf3,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x25,0x4d,0x27,0x07,0x27,0x36,0x43, +0x01,0x7c,0x0d,0x20,0x23,0x25,0x11,0x04,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x31,0x6b,0x3a,0x3a,0x72,0x61,0x64,0xa8,0x48,0x5f,0x84,0x54,0x26,0x1a,0x30,0x42,0x50,0x5b,0x30,0x0e,0x0f,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x38,0x91,0x52,0x1c,0x3b,0x1a,0xa6,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0e,0x0d, +0x3a,0x7a,0x63,0x40,0x00,0x04,0x00,0x7c,0x00,0x00,0x05,0x61,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x5e,0xb4,0x0d,0x0e,0x0e,0x00,0x09,0xbb,0x05,0x0c,0x00,0x08,0x00,0x05,0x05,0x0c,0x40,0x0c,0x04,0x0c,0x0f,0x0f,0x04,0x00,0x08,0x04,0x08,0x04,0x11,0x01,0xb8,0x05,0x0c,0xb5,0x00,0x2f,0x0d,0x01,0x0d,0x0c,0xbb, +0x04,0xe6,0x00,0x0a,0x00,0x06,0x04,0xfe,0xb5,0x08,0x2f,0x05,0x01,0x05,0x02,0xb9,0x04,0xfe,0x00,0x01,0x00,0x2f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x39,0x11,0x33,0x31,0x30,0x13,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x25,0x33, +0x15,0x23,0x05,0x01,0x33,0x01,0xc0,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0xfc,0x12,0x03,0x0d,0x8f,0xfc,0xf3,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0xf7,0xf7,0x5b,0x05,0x58,0xfa,0xa8,0x00,0x00,0x05,0x00,0x7c,0x00,0x00,0x06,0xd5,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x6d,0xb4,0x01,0x02,0x02, +0x04,0x11,0xbe,0x05,0x0c,0x00,0x10,0x00,0x0d,0x05,0x0c,0x00,0x0c,0x00,0x09,0x05,0x0c,0x40,0x0f,0x08,0x00,0x03,0x03,0x08,0x04,0x10,0x0c,0x08,0x08,0x0c,0x10,0x03,0x15,0x05,0xb8,0x05,0x0c,0xb3,0x04,0x12,0x0e,0x0a,0xb8,0x04,0xfe,0xb6,0x10,0x0c,0x2f,0x09,0x01,0x09,0x06,0xb8,0x04,0xfe,0xb5,0x05,0x2f,0x01,0x01,0x01,0x00,0xb8, +0x04,0xe6,0x00,0x3f,0x2f,0x5d,0x2f,0xed,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x11,0x33,0x31,0x30,0x33,0x01,0x33,0x01,0x03,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x7c,0x03,0x0d, +0x8f,0xfc,0xf3,0x4b,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0x05,0x58,0xfa,0xa8,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0xf7,0xf7,0xf7,0xf7,0x00,0x01,0x00,0x76,0xfe,0xf8,0x01,0x8b,0x00,0xe4,0x00,0x03,0x00,0x10,0xb7,0x2f,0x01,0x01,0x01,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x5d,0x31,0x30,0x25,0x13, +0x23,0x03,0x01,0x16,0x75,0x75,0xa0,0xe4,0xfe,0x14,0x01,0xec,0x00,0x02,0xff,0xc8,0x06,0x1d,0x02,0x29,0x08,0xde,0x00,0x2b,0x00,0x2f,0x00,0x2c,0xbc,0x00,0x2f,0x05,0x0d,0x00,0x2c,0x00,0x13,0x05,0x0d,0x40,0x09,0x16,0x26,0x09,0x2d,0x14,0x0e,0x1e,0x2c,0x29,0xb9,0x05,0x01,0x00,0x04,0x00,0x2f,0xfd,0xce,0xde,0xcd,0x2f,0x2f,0x01, +0x2f,0xcd,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x11,0x33,0x11,0x02,0x29,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35, +0x3b,0x16,0x1d,0x10,0x0d,0x0d,0x58,0x10,0x1d,0x26,0x15,0x06,0x0c,0x06,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x7f,0x58,0x06,0x8f,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x07,0x17,0x16,0x01,0x76,0xfe,0x7e,0x26,0x34,0x21,0x11,0x03,0x01,0x01,0x01,0x0f,0x12,0x19,0x10,0x09,0x48,0x02,0x0d, +0xfd,0xf3,0x00,0x02,0x00,0x43,0x06,0x1f,0x01,0x6c,0x08,0xbb,0x00,0x16,0x00,0x1a,0x00,0x23,0xb2,0x17,0x17,0x0e,0xbb,0x05,0x0d,0x00,0x07,0x00,0x19,0x04,0xfd,0xb2,0x18,0x0a,0x02,0xb9,0x04,0xfd,0x00,0x13,0x00,0x2f,0xfd,0xd6,0xd6,0xed,0x01,0x2f,0xed,0x33,0x2f,0x31,0x30,0x13,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33, +0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x13,0x23,0x35,0x33,0x43,0x36,0x28,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x17,0x18,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0xda,0x57,0x57,0x06,0x90,0x11,0x17,0x28,0x38,0x20,0x3f,0x74,0x37,0x39,0x7f,0x34,0x3c,0x5b,0x3e,0x20,0x09,0x0a,0x02,0x33,0x56,0x00,0x01,0x00,0x37,0x06,0x7c, +0x01,0xcf,0x06,0xca,0x00,0x03,0x00,0x0c,0xba,0x00,0x02,0x05,0x00,0x00,0x01,0x00,0x2f,0xed,0x31,0x30,0x13,0x21,0x15,0x21,0x37,0x01,0x98,0xfe,0x68,0x06,0xca,0x4e,0x00,0x02,0x00,0x0d,0x06,0x5c,0x01,0xb5,0x07,0xe2,0x00,0x23,0x00,0x2f,0x00,0x36,0xb2,0x16,0x09,0x13,0xb8,0x05,0x0e,0xb4,0x24,0x19,0x19,0x24,0x2a,0xb8,0x05,0x0e, +0x40,0x0c,0x09,0x16,0x19,0x19,0x20,0x0e,0x27,0x2d,0x03,0x03,0x20,0x1a,0x00,0x2f,0x2e,0xc9,0x2f,0x32,0xd4,0xcd,0x11,0x33,0x2f,0x39,0x01,0x2f,0xed,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x32,0x37,0x35,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26, +0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x1e,0x21,0x41,0x26,0x01,0x09,0x06,0x2d,0x1b,0x2b,0x38,0x1d,0x1c,0x34,0x28,0x19,0x3f,0x33,0x05,0x19,0x06,0x2f,0x14,0x23,0x10,0x15,0x2b,0x11,0x28,0x48,0x23,0x01,0x5d,0x2d,0x1b,0x1d,0x30,0x1f,0x17,0x2a,0x35,0x06,0xea,0x08, +0x08,0x01,0x02,0x3c,0x3b,0x22,0x35,0x24,0x13,0x12,0x24,0x36,0x24,0x3b,0x4f,0x17,0x05,0x16,0x05,0x35,0x0f,0x1f,0x0f,0x05,0x03,0x08,0x07,0xb0,0x23,0x22,0x22,0x20,0x1a,0x36,0x19,0x0e,0x32,0x00,0x00,0x01,0x00,0x37,0xff,0x23,0x01,0xcf,0xff,0x71,0x00,0x03,0x00,0x0c,0xba,0x00,0x02,0x05,0x00,0x00,0x01,0x00,0x2f,0xed,0x31,0x30, +0x17,0x21,0x15,0x21,0x37,0x01,0x98,0xfe,0x68,0x8f,0x4e,0x00,0xff,0xff,0x00,0x70,0xfe,0xf8,0x01,0x8b,0x03,0x11,0x02,0x26,0x0e,0x19,0x00,0x00,0x00,0x07,0x00,0x11,0x00,0x00,0x02,0x46,0xff,0xff,0x00,0x9a,0xfe,0x63,0x05,0x91,0x04,0x15,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x64,0xff,0xff,0x00,0x9a, +0xfe,0x0e,0x06,0xae,0x02,0x13,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x0f,0xff,0xff,0xff,0xba,0xff,0x05,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x5b,0x00,0x1a,0x01,0x06,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x5b, +0x00,0x1a,0x01,0x06,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x3e,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xe4,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0x3e,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55, +0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab, +0xff,0xea,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x53, +0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0x00,0x01,0xff,0xba,0xff,0xf2,0x04,0xad,0x03,0x0f,0x00,0x35, +0x00,0x41,0xb1,0x0d,0x24,0xb8,0x05,0x0b,0xb4,0x30,0x30,0x37,0x15,0x2a,0xb8,0x05,0x03,0x40,0x09,0x30,0x24,0x24,0x21,0x0c,0x20,0x04,0x00,0x12,0xb8,0x04,0xff,0xb5,0x2f,0x19,0x01,0x19,0x29,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d,0xed,0x12,0x17,0x39,0x11,0x33,0x3f,0x01,0x2f,0x12,0x39,0x2f,0xed, +0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33, +0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x14,0x35,0x5e,0x4a,0x14,0x62,0x7d,0x4a,0x1e,0x02,0x48,0xab,0xc8,0xe3,0x80,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2b,0x3b,0x25,0x10,0xa7, +0x29,0x46,0x5d,0x35,0x2b,0x5b,0x4b,0x30,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0x00,0x01,0x00,0x52,0xff,0xea,0x04,0x02,0x03,0xba,0x00,0x24,0x00,0x29,0xb1,0x1b,0x0f,0xb8,0x05,0x0a,0xb5,0x06,0x1c,0x21,0x14,0x14,0x03,0xbd,0x04,0xfb,0x00,0x0b, +0x00,0x21,0x05,0x03,0x00,0x15,0x05,0x03,0x00,0x3f,0x3f,0xc4,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x12,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x52,0x61,0xa6,0x39,0x92,0x7f,0x1c,0x31,0x40,0x24, +0xa6,0x38,0x4d,0x1d,0x07,0x18,0x2d,0x46,0x36,0x16,0x21,0x3f,0x38,0x2d,0x0f,0x05,0x1a,0x51,0x64,0x75,0x3e,0x3a,0x9a,0x4b,0xa9,0x0b,0x0b,0x47,0x4e,0x2e,0x92,0xb0,0xc3,0x5f,0xa7,0xfe,0xe3,0x80,0x20,0x4d,0x43,0x2d,0xa7,0x10,0x23,0x39,0x29,0x2d,0x3c,0x25,0x0f,0x0c,0x0a,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x05,0x5d, +0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x1d,0x04,0xad,0x00,0x01,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x03,0x0f,0x00,0x58,0x00,0x83,0xb1,0x13,0x08,0xb8,0x05,0x0a,0xb2,0x05,0x1e,0x54,0xb8,0x05,0x0a,0xb3,0x51,0x27,0x27,0x49,0xb8,0x05,0x0a,0x40,0x0a,0x42,0x05,0x51,0x42,0x42,0x51,0x05,0x03,0x5a,0x38,0xb8,0x05,0x0a, +0x40,0x0e,0x31,0x2f,0x53,0x01,0x53,0x2f,0x46,0x01,0x46,0x2f,0x35,0x01,0x35,0x3d,0xb8,0x04,0xfb,0xb6,0x1f,0x2c,0x2f,0x2c,0x02,0x2c,0x4c,0xba,0x04,0xfb,0x00,0x23,0x05,0x03,0xb6,0x26,0x12,0x1d,0x03,0x06,0x0d,0x00,0xba,0x04,0xfb,0x00,0x18,0x05,0x03,0xb3,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x3f,0xed,0x32,0x12,0x17,0x39,0x3f, +0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x10,0xed,0x39,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x07, +0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x07,0x57,0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c, +0x4f,0x42,0x34,0x12,0x04,0x19,0x3f,0x44,0x46,0x1f,0x42,0x52,0x19,0x05,0x03,0x3d,0x80,0xcc,0x91,0x8a,0xb9,0x70,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x10,0x9b,0x08,0x0c,0x05,0x06,0x58,0x5e,0x22,0x3f,0x30,0x1d,0x9c,0x0b,0x27,0x48,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x8f,0x43,0x62, +0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x26,0x20,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xbb,0x78,0x3f,0x70,0x38,0x42,0x3f,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x00,0x00,0x01, +0xff,0xba,0xff,0xf2,0x06,0xae,0x03,0x0f,0x00,0x4d,0x00,0x68,0xb5,0x27,0x39,0x1e,0x46,0x13,0x08,0xbe,0x05,0x0a,0x00,0x05,0x00,0x49,0x05,0x0a,0x00,0x46,0x00,0x3c,0x05,0x0a,0x40,0x17,0x39,0x48,0x2f,0x3a,0x01,0x3a,0x26,0x1d,0x06,0x13,0x18,0x12,0x12,0x06,0x18,0x41,0x34,0x34,0x33,0x33,0x0d,0x0d,0x00,0xb8,0x04,0xfb,0xb3,0x2c, +0x23,0x0e,0x18,0xb8,0x05,0x03,0xb3,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x3f,0x33,0x33,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x39,0x2f,0x5d,0x33,0x01,0x2f,0xed,0xd4,0xed,0xd4,0xed,0x39,0x12,0x39,0x11,0x39,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33, +0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x04,0xab,0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e, +0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x21,0x64,0x77,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x8f,0x43,0x62, +0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0x0b,0xc9,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31, +0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0x00,0x02,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x03,0x3c,0x00,0x4b,0x00,0x5f,0x00,0x7b,0xbf,0x00,0x26,0x05,0x0a,0x00,0x1f,0x00,0x5d,0x05,0x0a,0x00,0x2b,0x00, +0x37,0x05,0x0a,0x40,0x0a,0x51,0x2b,0x51,0x1f,0x51,0x1f,0x51,0x0e,0x3d,0x15,0xb8,0x05,0x0a,0x40,0x0a,0x0e,0x5d,0x5d,0x4c,0x4c,0x3c,0x3c,0x42,0x04,0x2b,0xbd,0x04,0xfb,0x00,0x3d,0x00,0x47,0x05,0x03,0x00,0x56,0x04,0xfb,0x40,0x0d,0x2f,0x32,0x01,0x32,0x2f,0x23,0x01,0x23,0x2f,0x12,0x01,0x12,0x1a,0xb8,0x04,0xfb,0xb5,0x1f,0x09, +0x2f,0x09,0x02,0x09,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x39,0x39,0x32,0x2f,0x33,0x11,0x33,0x2f,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x26,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15, +0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0xf8,0x1f,0x28,0x12,0x05,0x03,0x3d,0x81, +0xcd,0x94,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x17,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4,0x65,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x46,0x38,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54,0xa1,0xe7,0x9d,0x5e,0x02,0x99,0x6b, +0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x85,0x75,0x65,0x52,0x3f,0x15,0x5c,0xee,0x03,0x09,0x1d,0x15,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xc5,0x6e,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x49,0x7d,0xa4,0x5b, +0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x01,0x03,0x08,0x9d,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x2a,0x49,0x63,0x71,0x7a,0x3c,0x02,0x01,0x00,0x00,0x02,0xff,0xba,0xff,0xea,0x08,0x04,0x03,0x3c,0x00,0x42,0x00,0x54,0x00,0x64,0xbc,0x00,0x52,0x05,0x0a,0x00,0x27,0x00,0x33,0x05,0x0a,0xb7,0x48,0x27,0x48,0x27, +0x48,0x1b,0x39,0x22,0xbd,0x05,0x0a,0x00,0x1b,0x00,0x39,0x05,0x03,0x00,0x4d,0x04,0xfb,0x40,0x13,0x2f,0x2e,0x01,0x2e,0x2f,0x1e,0x01,0x1e,0x52,0x52,0x43,0x43,0x38,0x38,0x27,0x27,0x3e,0x09,0x15,0xbc,0x04,0xfb,0x00,0x0e,0x05,0x03,0x00,0x00,0x05,0x03,0x00,0x3f,0x3f,0xed,0x39,0x39,0x32,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x2f, +0x5d,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x24,0x26,0x26,0x27,0x26,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03, +0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x27,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x04,0xe7,0xb3,0xff,0x00,0xaf,0x69,0x1b,0x23,0x2e,0x14,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x27,0x42,0x30,0x1c,0x0f,0x0d,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c, +0x67,0x81,0x9a,0xb4,0x65,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x3e,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x16,0x01,0x06,0x0d,0x0c,0x0f,0x31,0x23,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x18,0x27,0x33,0x1b,0x30,0x6e,0x3d,0x3f, +0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x49,0x7d,0xa4,0x5b,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0xa9,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x04,0xb2,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x50, +0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x08,0x04,0x04,0xb2,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x02,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x29,0x00,0x3d,0x00,0x4c,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x2f,0x2f,0x0b,0x3b,0x24,0xb8,0x05,0x0a,0x40,0x11,0x21,0x0b,0x25,0x1b, +0x15,0x23,0x15,0x15,0x0b,0x3b,0x3b,0x2a,0x2a,0x1e,0x1e,0x10,0x0a,0xbd,0x04,0xfb,0x00,0x0b,0x05,0x03,0x00,0x34,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x11,0x33,0x2f,0x11,0x33,0x2f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33, +0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54, +0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e, +0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x00,0x02,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x00,0x24,0x00,0x38,0x00,0x43,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x2a,0x2a,0x3a,0x36,0x1f,0xb8,0x05,0x0a,0x40,0x09,0x1c,0x20,0x0c,0x1e, +0x36,0x36,0x25,0x25,0x18,0xb8,0x04,0xff,0xb3,0x11,0x0c,0x0c,0x11,0xbb,0x05,0x03,0x00,0x2f,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x3f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x2f,0x12,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35, +0x34,0x36,0x33,0x21,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x79,0xae,0x70,0x36,0x2d,0x51,0x71,0x88,0x9a,0x52,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2, +0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x83,0x75,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x03,0x58,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x54,0x2e,0x16,0x04,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2c,0x4e,0x68,0x77,0x81,0x3f,0x02,0x01, +0x00,0x02,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x00,0x2d,0x00,0x41,0x00,0x50,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x33,0x33,0x0b,0x3f,0x28,0xb8,0x05,0x0a,0xb6,0x25,0x0b,0x29,0x15,0x27,0x1a,0x15,0xb8,0x05,0x03,0x40,0x0a,0x3f,0x3f,0x2e,0x2e,0x22,0x22,0x21,0x21,0x10,0x0a,0xbd,0x04,0xff,0x00,0x0b,0x05,0x03,0x00,0x38,0x04,0xfb, +0x00,0x00,0x00,0x2f,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x3f,0x33,0x2f,0x12,0x39,0x01,0x2f,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x36,0x37, +0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x6f,0x89,0x9d,0x54,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4, +0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3c,0x43,0x30,0x35,0x1a,0x05,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25, +0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0xff,0xff,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x39,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x02,0x26,0x0e,0x3a,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x06,0xae, +0x05,0xec,0x02,0x26,0x0e,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0xb3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0xb3,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x90,0x06,0x03, +0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00, +0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02, +0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0xdc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0x01,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0x2c,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x01,0xfc,0x50, +0x00,0x0a,0xb4,0x01,0x2f,0x4b,0x01,0x4b,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x6e,0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x6e, +0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0xf9,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x8f,0x04,0x49,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x03,0xb9,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xdc,0x03,0x09,0xff,0xff,0xff,0xba, +0xfe,0xa6,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9a, +0xff,0x55,0x05,0x91,0x06,0x11,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x8f,0x04,0x49,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0xd1,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xdc,0x03,0x09,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51, +0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04,0x05,0x24,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x50, +0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x04,0x79,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xd4,0x03,0xc9,0x00,0x02,0x00,0xab,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x2e,0x00,0x4f,0x00,0x66,0xb1,0x1e,0x13,0xbe,0x05,0x0a,0x00,0x10,0x00,0x4a,0x05,0x0b,0x00,0x31,0x00,0x42,0x05,0x0b,0x40,0x0a, +0x39,0x10,0x31,0x39,0x39,0x31,0x10,0x03,0x51,0x03,0xbe,0x05,0x0a,0x00,0x2b,0x00,0x3e,0x04,0xfd,0x00,0x3f,0x00,0x2f,0x04,0xfd,0xb5,0x4f,0x1e,0x23,0x18,0x18,0x0b,0xbc,0x04,0xfb,0x00,0x23,0x05,0x03,0x00,0x19,0x05,0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x3f,0x3f,0xed,0x32,0x2f,0x11,0x39,0x2f,0xfd,0xd4,0xed, +0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x35,0x34,0x26,0x27, +0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4e,0x7b,0xb1,0x7d,0x6d,0xa2,0x6c,0x36,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x64,0x75,0x20,0x04,0x26,0x6f,0x87,0x9b,0x53,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x01,0xe4,0xc5,0x1f, +0x15,0x10,0x21,0x1b,0x11,0x2e,0x4f,0x69,0x3b,0x5e,0x54,0x21,0x17,0x0f,0x20,0x1a,0x10,0x25,0x4c,0x74,0x4f,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x0a,0x29,0x53,0x48,0x04,0x8b,0xfb,0xac,0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x34,0x1a,0x05,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0x57,0x0b, +0x47,0x12,0x16,0x0b,0x08,0x14,0x1b,0x27,0x1b,0x26,0x3e,0x2f,0x1f,0x08,0x5d,0x0c,0x2d,0x21,0x14,0x18,0x0b,0x08,0x12,0x1a,0x23,0x19,0x1f,0x3e,0x33,0x23,0x04,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x00,0x2c,0x00,0x2e,0x40,0x11,0x11,0x15,0x12,0x03,0x00,0x14,0x2f,0x13,0x01,0x13,0x27,0x27,0x26,0x26,0x21,0x21, +0x06,0xbb,0x04,0xfb,0x00,0x22,0x00,0x00,0x05,0x03,0x00,0x3f,0x32,0xed,0x32,0x11,0x33,0x2f,0x33,0x2f,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x17,0x1e,0x05,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23, +0x23,0x23,0x23,0x01,0x28,0x61,0x80,0x4c,0x1e,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0xad,0xdd,0x85,0x40,0x10,0x03,0x0b,0x14,0x21,0x34,0x49,0x32,0x16,0x59,0x8d,0x2c,0x05,0x17,0x47,0x68,0x8d,0x5d,0x0e,0x34,0x20,0x20,0x33,0x16,0x2a,0x3f,0x29,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x52,0x92,0x8b,0x8a,0x4a, +0x0f,0x2b,0x30,0x2e,0x26,0x17,0xa7,0x4a,0x55,0x22,0x3a,0x2b,0x18,0x00,0x00,0x02,0x00,0x39,0xfd,0xff,0x04,0xad,0x02,0xb9,0x00,0x2f,0x00,0x41,0x00,0x54,0xb9,0x00,0x3d,0x01,0x52,0xb5,0x1f,0x1f,0x16,0x1a,0x06,0x2b,0xbb,0x05,0x0a,0x00,0x35,0x00,0x11,0x05,0x0a,0xb4,0x1a,0x0e,0x05,0x09,0x3a,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x26, +0x01,0x26,0x2f,0x16,0x01,0x16,0x09,0xb8,0x05,0x03,0xb3,0x1f,0x30,0x30,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x3f,0x2f,0x5d,0x2f,0x5d,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x39,0x11,0x39,0x39,0x10,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x23, +0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x04,0xad,0x16,0x51,0x68,0x21,0x04,0x26,0x6c,0x4f,0x31,0x65,0x60,0x57,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42, +0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x15,0x44,0x6e,0x53,0x34,0x0b,0x06,0x0f,0x26,0x45,0xfe,0x55,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x99,0xa7,0x3a,0x36,0x36,0x3b,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x42,0x24, +0x0b,0x41,0x67,0x80,0x3f,0x26,0x43,0x33,0x1d,0x01,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0e,0x0e,0x09,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0xad,0x02,0xaf,0x00,0x30,0x00,0x40,0x00,0x32,0xb2,0x31,0x08,0x3c,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x24,0x01,0x24,0x34,0x30,0x30,0x0d,0x05,0x17,0xb8,0x04,0xfb,0xb4,0x10, +0x08,0x08,0x00,0x10,0xb8,0x05,0x03,0x00,0x3f,0x33,0x33,0x2f,0x10,0xed,0x39,0x39,0x32,0x2f,0x33,0x2f,0x5d,0xed,0x12,0x39,0x31,0x30,0x05,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x04,0x17,0x1e,0x03,0x33, +0x25,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x04,0xad,0x16,0x5b,0x6f,0x1e,0x05,0x2d,0x87,0x61,0x34,0x61,0x57,0x4b,0x1e,0x35,0x99,0x5f,0x13,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57,0x3a,0x23,0x0b,0x0d,0x21,0x2b,0x38,0x48,0x5c,0x39,0x4f,0x72,0x50,0x33,0x1c,0x0c,0x02,0x04,0x0d,0x25,0x46,0x3d,0xfc,0xd4, +0x2b,0x8e,0x56,0x5e,0x69,0x1a,0x35,0x52,0x37,0x30,0x4f,0x3e,0x2f,0x0e,0x40,0x41,0x39,0x48,0x18,0x28,0x35,0x1e,0x50,0x43,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1b,0x1f,0x49,0x48,0x42,0x34,0x1e,0x2e,0x48,0x56,0x51,0x40,0x0e,0x21,0x3e,0x30,0x1d,0x6d,0x35,0x36,0x44,0x45,0x21,0x51,0x45,0x2f,0x26,0x45,0x5f,0xff,0xff,0x00,0x9b, +0xfd,0xff,0x05,0x58,0x03,0x5c,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x03,0xff,0xba,0xff,0xf2,0x04,0x87,0x04,0x53,0x00,0x2d,0x00,0x3f,0x00,0x50,0x00,0x63,0xb3,0x12, +0x1f,0x17,0x24,0xb8,0x05,0x0a,0xb2,0x4b,0x46,0x43,0xb8,0x05,0x0b,0xb6,0x31,0x4b,0x31,0x4b,0x31,0x52,0x3b,0xbf,0x05,0x0a,0x00,0x17,0x00,0x49,0x04,0xfc,0x00,0x29,0x05,0x03,0x00,0x36,0x04,0xfc,0x40,0x10,0x1c,0x00,0x46,0x40,0x1c,0x04,0x05,0x1e,0x2f,0x1f,0x01,0x1f,0x2e,0x0f,0x0f,0x0c,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00, +0x3f,0xed,0x32,0x11,0x33,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x33,0x32,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x27,0x35,0x16,0x04,0x16,0x16, +0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x36,0x35,0x34,0x2e,0x02,0x27,0x02,0x3b,0x26,0x61,0x6c,0x73,0x37,0x9e,0x23,0x23,0x23,0x23,0x3a,0x72,0x3a,0x84,0x38,0x01,0x4a,0x60,0x38,0x15,0x25,0x43,0x5c, +0x38,0x01,0x53,0xca,0x01,0x32,0xcd,0x68,0x17,0x2f,0x46,0x2e,0x1e,0x5a,0x6b,0x76,0x51,0x33,0x21,0x1c,0x2b,0x34,0x18,0x1c,0x3a,0x2f,0x1e,0x11,0x31,0x58,0x01,0x0a,0x09,0x08,0x2a,0x2d,0x43,0x9a,0x4b,0x1d,0x29,0x45,0x5b,0x31,0x4c,0x1d,0x23,0x14,0x06,0x34,0x20,0x20,0x33,0x02,0x03,0x04,0x1e,0x44,0x4d,0x55,0x2f,0x37,0x79,0x6c, +0x52,0x11,0x06,0x36,0xc7,0x71,0xf6,0xe7,0xc7,0x42,0x2f,0x5f,0x4c,0x30,0x09,0x15,0x22,0xbd,0x3f,0x7e,0x37,0x2d,0x50,0x3d,0x23,0x29,0x41,0x4f,0x26,0x19,0x36,0x3c,0x42,0x01,0x40,0x20,0x3c,0x21,0x4e,0x92,0x36,0x1a,0x20,0x06,0x2c,0x36,0x2b,0x5d,0x60,0x60,0x2e,0x00,0x00,0x03,0x00,0x53,0xff,0xf2,0x05,0x32,0x04,0x53,0x00,0x2a, +0x00,0x3c,0x00,0x4d,0x00,0x63,0xb3,0x0f,0x1c,0x14,0x21,0xb8,0x05,0x0a,0xb2,0x48,0x43,0x40,0xb8,0x05,0x0b,0xb6,0x2e,0x48,0x2e,0x48,0x2e,0x4f,0x38,0xbf,0x05,0x0a,0x00,0x14,0x00,0x46,0x04,0xfc,0x00,0x26,0x05,0x03,0x00,0x33,0x04,0xfc,0x40,0x10,0x19,0x00,0x43,0x3d,0x19,0x04,0x05,0x1b,0x2f,0x1c,0x01,0x1c,0x2b,0x0e,0x0e,0x0c, +0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x32,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x27, +0x35,0x16,0x04,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x36,0x35,0x34,0x2e,0x02,0x27,0x02,0xe6,0x23,0x59,0x63,0x69,0x33,0x55,0x80,0x23,0x20,0x52,0x9c,0x51,0x80,0x3b,0x01,0x4a,0x60,0x38, +0x15,0x25,0x43,0x5c,0x38,0x01,0x53,0xca,0x01,0x32,0xcd,0x68,0x17,0x2f,0x46,0x2e,0x1e,0x5a,0x6b,0x76,0x51,0x33,0x21,0x1c,0x2b,0x34,0x18,0x1c,0x3a,0x2f,0x1e,0x11,0x31,0x58,0x01,0x0a,0x09,0x08,0x2a,0x2d,0x43,0x9a,0x4b,0x1d,0x29,0x45,0x5b,0x31,0x4c,0x1d,0x23,0x14,0x06,0x0b,0x05,0xa7,0x0a,0x08,0x03,0x04,0x1e,0x44,0x4d,0x55, +0x2f,0x37,0x79,0x6c,0x52,0x11,0x06,0x36,0xc7,0x71,0xf6,0xe7,0xc7,0x42,0x2f,0x5f,0x4c,0x30,0x09,0x15,0x22,0xbd,0x3f,0x7e,0x37,0x2d,0x50,0x3d,0x23,0x29,0x41,0x4f,0x26,0x19,0x36,0x3c,0x42,0x01,0x40,0x20,0x3c,0x21,0x4e,0x92,0x36,0x1a,0x20,0x06,0x2c,0x36,0x2b,0x5d,0x60,0x60,0x2e,0x00,0x00,0x03,0xff,0xba,0xfd,0xff,0x04,0x02, +0x03,0x56,0x00,0x2c,0x00,0x3c,0x00,0x4c,0x00,0x59,0xb1,0x19,0x0c,0xb8,0x05,0x0a,0xb5,0x32,0x47,0x47,0x32,0x3c,0x3d,0xb8,0x05,0x0a,0x40,0x09,0x12,0x00,0x25,0x2d,0x13,0x13,0x12,0x12,0x00,0xb8,0x04,0xfb,0xb3,0x3d,0x16,0x14,0x25,0xba,0x05,0x03,0x00,0x42,0x04,0xfb,0xb6,0x1f,0x1e,0x2f,0x1e,0x02,0x1e,0x37,0xb8,0x04,0xfb,0xb3, +0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0x33,0x33,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x17,0x21,0x15,0x21,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x27,0x23, +0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0xb4,0x15,0x41,0x4e,0x55,0x51,0x49,0x1b,0x2f,0x54,0x3f,0x25,0x16,0x27,0x34,0x1d,0x02,0x01,0x45,0xfe,0xc0,0x01,0x48,0x40,0x27,0x49,0x66,0x3f,0x24,0x54,0x55,0x50,0x3f, +0x29,0x04,0xab,0x23,0x23,0x23,0x23,0x01,0xd0,0x30,0x52,0x3a,0x21,0x11,0x1e,0x27,0x16,0x1a,0x47,0x47,0x3d,0x0e,0x0b,0x04,0x2e,0x45,0x52,0x27,0x22,0x2e,0x1c,0x0d,0x20,0x3d,0x58,0x38,0x99,0x85,0xcf,0x9c,0x6c,0x43,0x1e,0x45,0x6d,0x87,0x43,0x35,0x5d,0x4e,0x41,0x19,0x07,0xa7,0x06,0x2d,0x79,0x3f,0x33,0x5f,0x49,0x2d,0x14,0x2e, +0x4b,0x6f,0x96,0x61,0x34,0x20,0x20,0x33,0x33,0x53,0x69,0x36,0x28,0x55,0x45,0x2d,0x47,0x88,0xc6,0x7f,0xa7,0x58,0x7d,0x50,0x26,0x16,0x22,0x2c,0x16,0x24,0x4b,0x3c,0x26,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x00,0x27,0x00,0x38,0x00,0x55,0xb2,0x1f,0x1f,0x1c,0xb8,0x05,0x0a,0xb4,0x36,0x0b,0x0b,0x36,0x32,0xb8, +0x05,0x0a,0xb2,0x11,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x27,0x1f,0x24,0x2f,0x24,0x02,0x24,0x2d,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x16,0x01,0x16,0x36,0x35,0x35,0x1d,0x1d,0x1c,0xbb,0x04,0xfb,0x00,0x1e,0x00,0x0b,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0x33, +0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x37,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x6c,0xad,0x52,0x45,0x66,0x48,0x2c,0x0c, +0x05,0x0b,0x04,0x75,0x5c,0x92,0x66,0x36,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x35,0x07,0xbc,0xbd,0x08,0x3e,0x74,0xab,0x75,0x5b,0xac,0x64,0x02,0x8d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1b,0x7c,0x87,0x65,0x04,0x0e,0xfe,0xf9,0x2c,0x23,0x21,0x39,0x4c,0x2c,0x13,0x3d,0x26,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54, +0x56,0x48,0xbf,0x6d,0xa7,0x66,0xb5,0x88,0x50,0x26,0x2e,0x02,0xe1,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf2,0x03,0x0f,0x02,0x06,0x0e,0x6f,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x03,0x0f,0x02,0x06,0x09,0x3b,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6, +0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x03,0xff,0xd4,0x05,0x20,0x02,0x33,0x07,0xa1,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x60,0xb2,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb5,0x12,0x15,0x15,0x12,0x12,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26, +0xb8,0x05,0x0d,0xb5,0x1f,0x22,0x22,0x1f,0x00,0x31,0xbb,0x04,0xfd,0x00,0x32,0x00,0x35,0x04,0xfd,0xb4,0x36,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0xd6,0xfd,0xd6,0xed,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x10,0xed, +0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63, +0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37, +0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x01,0x6b,0x58,0x57,0x58,0x00,0x03,0xff,0xd8,0x06,0x60,0x02,0x2c,0x08,0x21,0x00,0x1e,0x00,0x35,0x00,0x41,0x00,0x4c,0xb4,0x14,0x39,0x04,0x32,0x11,0xbe,0x05,0x0d,0x00,0x39,0x00,0x22,0x05,0x0d,0x00,0x32,0x00,0x3f,0x05,0x0d,0xb4,0x07,0x36,0x1b,0x1e, +0x0c,0xb8,0x04,0xfd,0x40,0x0a,0x3c,0x00,0x1f,0x35,0x04,0x14,0x27,0x2d,0x2d,0x00,0xb9,0x05,0x00,0x00,0x1e,0x00,0x2f,0xed,0x32,0x2f,0xdd,0x39,0x39,0xc0,0x32,0x10,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x2f,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x13,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e, +0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x07,0x13,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x88,0x2d,0x58,0x2e,0x01,0x2e,0x2b,0x1a,0x2d,0x3c,0x22,0x24,0x3d,0x2c,0x19, +0x2a,0x23,0x0e,0x18,0x0b,0x21,0x1b,0x2e,0x15,0x3e,0x84,0x3f,0x0b,0x30,0x3a,0x05,0x06,0x0d,0x06,0x1e,0x2b,0x31,0x22,0x17,0x28,0x1d,0x11,0x54,0x4c,0x01,0x17,0x22,0x27,0x2e,0x23,0x23,0x2f,0x31,0x06,0xb0,0x04,0x0e,0x13,0x05,0x1f,0x4e,0x2d,0x24,0x3b,0x2b,0x18,0x18,0x2b,0x39,0x21,0x33,0x4c,0x21,0x08,0x09,0x05,0x4a,0x0a,0x15, +0x0b,0x21,0x1d,0x05,0x01,0x86,0x17,0x41,0x2a,0x0e,0x14,0x02,0x02,0x28,0x21,0x26,0x2c,0x17,0x27,0x35,0x1e,0x4d,0x74,0x24,0xfe,0xe1,0x18,0x3a,0x21,0x22,0x29,0x27,0x20,0x26,0x3a,0x00,0x00,0x04,0xff,0xd4,0x05,0x20,0x02,0x33,0x08,0x29,0x00,0x2f,0x00,0x4e,0x00,0x65,0x00,0x71,0x00,0xaa,0x40,0x0a,0x44,0x2c,0x34,0x03,0x12,0x52, +0x52,0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0b,0x12,0x62,0x62,0x12,0x15,0x15,0x12,0x12,0x41,0x41,0x03,0xb8,0x05,0x0d,0x40,0x0d,0x2c,0x69,0x69,0x2c,0x2f,0x2f,0x2c,0x0a,0x26,0x1f,0x6f,0x6f,0x37,0xb8,0x05,0x0d,0xb3,0x26,0x23,0x23,0x26,0xb8,0x05,0x0d,0x40,0x09,0x1f,0x22,0x22,0x1f,0x00,0x4b,0x66,0x4e,0x3c,0xb8,0x04,0xfd,0x40, +0x0a,0x6c,0x30,0x4f,0x65,0x34,0x44,0x57,0x5d,0x5d,0x30,0xb8,0x05,0x00,0xb6,0x4e,0x2f,0x16,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0x32,0x32,0xde,0xed,0x32,0x2f,0xcd,0x39,0x39,0xc0,0x32,0x10,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x10,0xe4,0x33, +0x2f,0x11,0x12,0x39,0x2f,0x33,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x11,0x33,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x11,0x12,0x39,0x11,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36, +0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x25,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x07,0x13,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02, +0x35,0x34,0x36,0x37,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0xb9,0x2d,0x58,0x2e,0x01,0x2e,0x28,0x1c,0x2d,0x3a,0x1f, +0x1f,0x3b,0x2e,0x1c,0x28,0x23,0x0e,0x18,0x0b,0x21,0x1b,0x2e,0x15,0x3e,0x84,0x3f,0x0b,0x30,0x3a,0x05,0x06,0x0d,0x06,0x1e,0x2b,0x31,0x22,0x17,0x28,0x1d,0x11,0x54,0x4c,0x01,0x17,0x22,0x25,0x32,0x1e,0x1d,0x31,0x2e,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30, +0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x8e,0x04,0x0e,0x13,0x05,0x1d,0x49,0x2b,0x27,0x3a,0x27,0x13,0x13,0x25,0x38,0x25,0x30,0x48,0x20,0x08,0x09,0x05,0x4a,0x0a,0x15,0x0b,0x21,0x1b,0x05,0x01,0x78,0x15,0x3d,0x26,0x0e,0x12,0x02,0x02,0x28,0x21,0x26,0x2c,0x16,0x26,0x33,0x1d,0x4b,0x70, +0x23,0xfe,0xed,0x16,0x35,0x1f,0x23,0x23,0x23,0x21,0x23,0x33,0x00,0x02,0xff,0xd4,0x05,0x20,0x02,0x33,0x08,0x04,0x00,0x2f,0x00,0x33,0x00,0x5e,0xb4,0x0a,0x31,0x23,0x23,0x30,0xbb,0x05,0x0b,0x00,0x31,0x00,0x26,0x05,0x0d,0xb5,0x22,0x22,0x31,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb5,0x12,0x15,0x15,0x12,0x12,0x03,0xb8,0x05,0x0d,0x40, +0x0d,0x2c,0x2f,0x2f,0x2c,0x00,0x33,0x30,0x2f,0x16,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0x32,0x32,0xd6,0xcd,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0xed,0x10,0xed,0x32,0x2f,0x11,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06, +0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x23,0x11,0x33,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02, +0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x92,0x74,0x74,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x64,0x01,0x6a,0x00,0x00,0x03, +0xff,0x6c,0x05,0x26,0x02,0x03,0x08,0x58,0x00,0x18,0x00,0x3d,0x00,0x4b,0x00,0x69,0xb2,0x3a,0x11,0x37,0xb8,0x05,0x0d,0xb5,0x3e,0x09,0x09,0x3e,0x0e,0x11,0xb8,0x05,0x0d,0xb3,0x2b,0x06,0x06,0x46,0xb8,0x05,0x0d,0xb7,0x2d,0x0e,0x09,0x0a,0x25,0x22,0x1f,0x32,0xb8,0x04,0xfd,0xb3,0x41,0x3a,0x49,0x28,0xb8,0x04,0xfd,0xb4,0x1f,0x16, +0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0x32,0x39,0xd4,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x2f,0x39,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15, +0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36, +0x36,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x02,0x17,0x28,0x11,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34,0x10,0x0f,0x01,0x36,0x1e,0x31,0x3f,0x20,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a, +0x2f,0x3b,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x2b,0x11,0x22,0x11,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x42,0x41,0x24,0x38,0x27,0x14,0x14,0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x19,0x11,0x1b,0x38,0x1b,0x0e,0x35,0x00, +0x00,0x02,0x00,0x05,0x05,0x26,0x02,0x01,0x07,0x3b,0x00,0x18,0x00,0x1c,0x00,0x3f,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb7,0x11,0x11,0x1d,0x1a,0x0e,0x09,0x0a,0x1a,0xb8,0x04,0xfd,0xb4,0x1b,0x16,0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f, +0x10,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x25,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21, +0xfe,0x92,0x01,0xfc,0xfe,0x04,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xb8,0x58,0x00,0x03,0xff,0xf8,0x05,0x26,0x02,0x03,0x08,0x58,0x00,0x18,0x00,0x3c,0x00,0x4a,0x00,0x65,0xb3,0x39,0x18,0x11,0x36,0xb8,0x05,0x0d,0xb5,0x3d,0x09,0x09,0x3d,0x0e,0x11,0xb8,0x05,0x0d,0xb3,0x2a, +0x06,0x06,0x45,0xb8,0x05,0x0d,0xb4,0x2c,0x0e,0x09,0x0a,0x31,0xb8,0x04,0xfd,0xb3,0x40,0x39,0x48,0x26,0xb8,0x04,0xfd,0xb4,0x1f,0x16,0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0x32,0x39,0xd4,0xed,0x11,0x12,0x39,0x01, +0x2f,0xed,0x39,0x2f,0x39,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02, +0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x02,0x17,0x28,0x11,0x18,0x2f,0x14,0x3c,0x65,0x31,0x12,0x33,0x5a,0x39,0x01,0x0b,0x06,0x01,0x34, +0x1e,0x31,0x3e,0x21,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a,0x30,0x3a,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x2b,0x11,0x22,0x11,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x40,0x40,0x24,0x39,0x27,0x14,0x14,0x27,0x3a, +0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x1a,0x10,0x1a,0x3a,0x1a,0x0e,0x36,0x00,0x00,0x03,0x00,0x05,0x05,0x26,0x02,0x01,0x07,0xea,0x00,0x18,0x00,0x1c,0x00,0x20,0x00,0x41,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb4,0x11,0x0e,0x09,0x0a,0x1a,0xbb,0x04,0xfd,0x00,0x1b,0x00,0x1e,0x04,0xfd,0xb4,0x1f,0x16,0x18,0x18, +0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01, +0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x01,0x67,0x58,0x57,0x58,0x00,0x00,0x03, +0x00,0x49,0x05,0x26,0x01,0xbd,0x08,0x42,0x00,0x17,0x00,0x2b,0x00,0x37,0x00,0x55,0xbc,0x00,0x1d,0x05,0x0d,0x00,0x2f,0x00,0x06,0x05,0x0d,0xb3,0x0e,0x10,0x10,0x35,0xb8,0x05,0x0d,0xb5,0x0b,0x27,0x0e,0x09,0x0a,0x18,0xbb,0x04,0xfd,0x00,0x32,0x00,0x2c,0x04,0xfd,0xb4,0x22,0x15,0x17,0x17,0x15,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c, +0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0xed,0x39,0x2f,0x39,0xed,0x2f,0xed,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x03,0x32,0x1e,0x02, +0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x2d,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x70,0x28,0x45,0x31,0x1c,0x1c,0x31,0x45,0x28,0x2a,0x45,0x30,0x1b,0x1b,0x31,0x44,0x2a,0x30,0x30,0x30, +0x30,0x30,0x30,0x30,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x33,0x3a,0x21,0x37,0x28,0x16,0x06,0x01,0xbf,0x1c,0x31,0x42,0x26,0x26,0x42,0x30,0x1c,0x1c,0x30,0x42,0x26,0x26,0x42,0x31,0x1c,0xfe,0xee,0x33,0x2a,0x29,0x35,0x35,0x29,0x2a,0x33,0x00,0x00,0x03,0x00,0x05,0xfe,0x00,0x02,0x01,0x00,0xc1,0x00,0x18,0x00,0x1c, +0x00,0x20,0x00,0x3d,0xb1,0x0e,0x06,0xbe,0x05,0x0d,0x00,0x11,0x00,0x1b,0x04,0xfd,0x00,0x1a,0x00,0x1f,0x04,0xfd,0xb2,0x1e,0x0e,0x0a,0xb8,0x04,0xfd,0xb4,0x09,0x0c,0x0c,0x09,0x03,0xb8,0x04,0xfd,0xb3,0x16,0x18,0x18,0x16,0x00,0x2f,0x33,0x2f,0x10,0xfd,0xc6,0x32,0x2f,0x10,0xfd,0x39,0xd6,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x39,0x31, +0x30,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04, +0x56,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xfd,0x9d,0x58,0x01,0x07,0x58,0x00,0x00,0x02,0x00,0x05,0xfe,0xaf,0x02,0x01,0x00,0xc1,0x00,0x18,0x00,0x1c,0x00,0x35,0xb1,0x0e,0x06,0xbb,0x05,0x0d,0x00,0x11,0x00,0x1b,0x04,0xfd,0xb2,0x1a,0x0e,0x0a,0xb8,0x04,0xfd,0xb4,0x09,0x0c,0x0c,0x09, +0x03,0xb8,0x04,0xfd,0xb3,0x16,0x18,0x18,0x16,0x00,0x2f,0x33,0x2f,0x10,0xfd,0xc6,0x32,0x2f,0x10,0xfd,0x39,0xd6,0xed,0x01,0x2f,0xed,0x39,0x31,0x30,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e, +0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x56,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xfe,0x4c,0x58,0xff,0xff,0x00,0x4f,0xfe,0xf8,0x01,0x64,0x00,0xe4,0x00,0x06,0x00,0x0f,0x28,0x00,0x00,0x01,0x00,0xab,0xff,0xea,0x07,0x59, +0x03,0x0f,0x00,0x2e,0x00,0x3c,0xb1,0x0c,0x01,0xb8,0x05,0x0a,0xb3,0x2d,0x2d,0x30,0x20,0xb8,0x05,0x0a,0x40,0x0a,0x19,0x2f,0x2e,0x01,0x2e,0x2f,0x1d,0x01,0x1d,0x11,0xb8,0x05,0x03,0xb2,0x0c,0x28,0x06,0xba,0x04,0xfb,0x00,0x07,0x05,0x03,0x00,0x3f,0xed,0x32,0x39,0x3f,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39, +0x31,0x30,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x06,0x9f,0x0c,0x27,0x49,0x3e,0x16,0x61,0x70,0x20,0x04,0x2c,0x80,0x9d,0xb4,0x60,0x88,0xe1,0xb5,0x88,0x30,0x40, +0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1d,0x5c,0x92,0xd1,0x93,0x80,0xc0,0x7f,0x3f,0x03,0x0f,0xfe,0x89,0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x35,0x19,0x05,0x04,0x15,0x2c,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0x00,0x01,0xff,0xba,0xff,0xf2, +0x01,0xf2,0x03,0x0f,0x00,0x16,0x00,0x1e,0xbe,0x00,0x08,0x05,0x0a,0x00,0x05,0x00,0x00,0x04,0xfb,0x00,0x0f,0x05,0x03,0xb3,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c, +0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0x00,0x00,0x02,0x00,0x9b,0xfd,0xff,0x06,0x03,0x02,0xb7,0x00,0x30,0x00,0x41,0x00,0x65,0xb2,0x13,0x13,0x10,0xb8,0x05,0x0a,0xb4,0x3f,0x30,0x30,0x3f,0x3b,0xb8,0x05,0x0a,0xb6,0x05, +0x3f,0x05,0x3f,0x05,0x43,0x24,0xb8,0x05,0x0a,0xb5,0x1d,0x2f,0x21,0x01,0x21,0x29,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x18,0x2f,0x18,0x02,0x18,0x3f,0x3e,0x3e,0x10,0xbd,0x04,0xfb,0x00,0x00,0x00,0x12,0x05,0x03,0x00,0x36,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d, +0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x03,0x2e,0x03,0x23,0x22, +0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x04,0x36,0x5c,0x91,0x66,0x36,0x30,0x55,0x73,0x44,0x48,0x78,0x36,0x2d,0x34,0x07,0xbc,0xbb,0x0b,0x54,0x99,0xe0,0x97,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x60,0x8d,0x63,0x3e,0x24,0x10,0x03,0x1d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1a,0x7c,0x86, +0x65,0x04,0x0e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x48,0xc0,0x6d,0xa7,0x7f,0xbc,0x7b,0x3d,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x19,0x2d,0x3e,0x49,0x52,0x2b,0x01,0x42,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49, +0x03,0x62,0x02,0x06,0x09,0x3c,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x03,0x62,0x02,0x06,0x09,0x3d,0x00,0x00,0xff,0xff,0x00,0x49,0x04,0x7c,0x01,0xa2,0x05,0xe9,0x00,0x07,0x09,0x7e,0x00,0x00,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x3e,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x01, +0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe7,0xfd,0xff,0x04,0x02,0x05,0x63,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01,0xfd,0x55,0x01,0x07,0x09,0x30,0x00,0x28,0xfd,0x55,0x00,0x0e,0xb6,0x04,0x03,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff, +0xff,0xba,0xff,0xf2,0x03,0xa3,0x05,0x3e,0x00,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x01,0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x3e,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01,0xfd,0x55,0x01,0x07,0x09,0x21,0x02,0xac, +0x00,0x00,0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xb9,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x57,0x02,0xad,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x06,0x32,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff, +0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07, +0x0f,0x52,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xee,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x5b,0x02,0xad,0x00,0xef,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff, +0xff,0xba,0xff,0x05,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca, +0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff, +0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07, +0x0f,0x56,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x16,0x02,0x26,0x0e,0x2d,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfd,0x2d,0x00,0x0a,0xb4,0x01,0x2f,0x4c,0x01,0x4c,0x00,0x11, +0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x79,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0xfe,0xab,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d, +0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x79,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9, +0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xf4,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x5b,0x00,0xab, +0x00,0xf5,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x27,0x0f,0x57,0x01,0x1d,0x04,0xad,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea, +0x04,0x02,0x05,0x5d,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x1d, +0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x04,0x07,0x02,0x26,0x0e,0x31, +0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0x50,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x06,0xae,0x04,0x07,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0x5a,0x03,0x0f,0x02,0x26,0x0e,0x31, +0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x50,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x06,0xae,0x03,0x0f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xa4,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x54,0x05,0x50,0xfd,0xce,0x00,0x07,0x0f,0x53,0x05,0x46, +0x03,0x57,0xff,0xff,0xff,0xba,0xfd,0xc9,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xa4,0xfd,0xce,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x03,0x3c,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x51,0x06,0x3c,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6, +0x08,0x04,0x03,0x3c,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x86,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x05,0xca,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x08,0x04,0x05,0xca,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x1e, +0x04,0x02,0xff,0xff,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x39,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x02,0x26,0x0e,0x3a,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x3b, +0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0x00,0x02,0x00,0xab,0xff,0xea,0x08,0x04,0x03,0x62,0x00,0x41,0x00,0x55,0x00,0x5c,0xb1,0x10,0x0d,0xbb,0x05,0x0a,0x00,0x42,0x00,0x4e,0x05,0x0a,0xb6,0x00,0x42,0x00,0x42,0x00,0x57,0x2f,0xb8,0x05,0x0a,0xb5,0x28,0x2f,0x2c,0x01,0x2c,0x1f,0xb8,0x05,0x03,0x40,0x09,0x53,0x1a,0x05, +0x14,0x3c,0x3c,0x39,0x39,0x13,0xbc,0x04,0xfb,0x00,0x14,0x05,0x03,0x00,0x49,0x04,0xfb,0xb3,0x2f,0x05,0x01,0x05,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x11,0x33,0x2f,0x11,0x12,0x39,0x39,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03, +0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x04,0xb0,0x30,0x55,0x74,0x44, +0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5b,0x27,0x33,0x77,0x82,0x8a,0x45,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x01,0xfe,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b, +0x1b,0x19,0x41,0x73,0x5a,0x23,0x1b,0x01,0xd1,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x63,0x27,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x18,0x1a,0x0d,0x03,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x35, +0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x1f,0x3e,0x43,0x4a,0x2b,0x18,0x4d,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x08,0x04,0x05,0x24,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x27,0x0f,0x50,0x04,0xd7, +0x04,0x74,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04,0x06,0x3c,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x53,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0xab,0xfd,0xc9,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x10,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea, +0x08,0x04,0x06,0x3c,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x56,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x04,0x79,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xd4,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5, +0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x05,0x91,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xd4,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c, +0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0x00,0x01,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x00,0x43,0x00,0x49,0xb4,0x13,0x05,0x05,0x1b,0x37,0xb8,0x05,0x0a,0x40,0x0c,0x30,0x1b,0x2f,0x34,0x01, +0x34,0x0a,0x0e,0x0b,0x03,0x0c,0x28,0xb8,0x05,0x03,0xb5,0x3f,0x20,0x20,0x1f,0x1f,0x1a,0xba,0x04,0xfb,0x00,0x1b,0x05,0x03,0xb4,0x0d,0x2f,0x0c,0x01,0x0c,0x00,0x2f,0x5d,0x33,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x33,0x3f,0x12,0x17,0x39,0x2f,0x5d,0x01,0x2f,0x2f,0xed,0x12,0x39,0x10,0xcd,0x31,0x30,0x25,0x3e,0x03,0x35,0x34,0x2e,0x02, +0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x17,0x1e,0x05,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x05,0x4b,0x25,0x32,0x1c,0x0c,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0xad,0xdd,0x85,0x40, +0x10,0x03,0x0b,0x14,0x21,0x34,0x49,0x32,0x16,0x59,0x8d,0x2c,0x05,0x22,0x53,0x44,0x27,0x5d,0x74,0x90,0x5a,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1a,0x4f,0x7b,0xb1,0x7c,0x4f,0x80,0x66,0x4f,0xad,0x0a,0x1d,0x26,0x2d,0x1a,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x52,0x92,0x8b, +0x8a,0x4a,0x0f,0x2b,0x30,0x2e,0x26,0x17,0xa7,0x4a,0x55,0x2d,0x3d,0x15,0x0c,0x10,0x09,0x03,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x02,0x05,0x0a,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x06,0x0e,0x56,0x00,0x00,0x00,0x01,0x00,0x19,0xff,0xea, +0x08,0xaf,0x04,0x19,0x00,0x48,0x00,0x52,0xb9,0x00,0x25,0x05,0x0a,0xb2,0x1a,0x3b,0x30,0xb8,0x05,0x0a,0xb4,0x11,0x0e,0x0e,0x11,0x14,0xb8,0x04,0xfb,0xb7,0x2b,0x2b,0x1f,0x3b,0x41,0x35,0x35,0x07,0x41,0x09,0x04,0xfb,0x00,0x41,0x05,0x03,0x00,0x32,0x04,0xfb,0x00,0x36,0x05,0x03,0x00,0x20,0x04,0xfb,0xb3,0x2f,0x1f,0x01,0x1f,0x00, +0x2f,0x5d,0xed,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x11,0x39,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x37,0x1e,0x05,0x33,0x32,0x3e,0x04,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14, +0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x06,0x04,0x21,0x22,0x2e,0x04,0x27,0x19,0x25,0x83,0xaa,0xc7,0xd4,0xd8,0x65,0x72,0xbb,0x9d,0x83,0x72,0x68,0x33,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f, +0x0b,0x20,0x3e,0x1f,0x07,0x39,0x4b,0x1a,0x04,0x0c,0x21,0x14,0x76,0xfe,0x25,0xfe,0xa9,0x47,0xb1,0xc0,0xc2,0xae,0x8f,0x2d,0xa9,0x05,0x07,0x06,0x03,0x02,0x01,0x01,0x02,0x02,0x05,0x06,0x04,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66, +0x38,0x23,0x2c,0x05,0x03,0xa7,0x2c,0x29,0x16,0x21,0x0e,0x0a,0x0e,0x01,0x02,0x03,0x06,0x07,0x05,0x00,0x00,0x01,0xff,0xba,0xff,0xea,0x08,0x04,0x04,0x19,0x00,0x4d,0x00,0x61,0xb1,0x3f,0x34,0xb8,0x05,0x0a,0x40,0x09,0x15,0x12,0x12,0x24,0x15,0x15,0x1e,0x3a,0x29,0xbb,0x05,0x0a,0x00,0x1e,0x00,0x18,0x04,0xfb,0xb3,0x2f,0x2f,0x23, +0x47,0xbc,0x05,0x03,0x00,0x3a,0x05,0x03,0x00,0x24,0x04,0xfb,0x40,0x0c,0x2f,0x23,0x01,0x23,0x3f,0x00,0x39,0x36,0x36,0x0d,0x0d,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x33,0x11,0x39,0x2f,0x5d,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0x39,0x33,0x2f,0x10,0xed, +0x39,0x31,0x30,0x17,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x16,0x04,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07, +0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x32,0x32,0x23,0x23,0x23,0x23,0x3b,0x1e,0xa2,0xef,0x01,0x2e,0xab,0x9d,0xf6,0xc3,0x99,0x40,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f,0x0b,0x20,0x3e,0x1f,0x07,0x39,0x4c,0x19,0x04,0x0b, +0x22,0x14,0x34,0xb6,0xec,0xfe,0xe9,0x96,0x50,0xb3,0xb2,0xa8,0x8b,0x66,0x0e,0x34,0x20,0x20,0x33,0x03,0x03,0x02,0x03,0x05,0x07,0x05,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x23,0x2c,0x05,0x03,0xa7,0x2d,0x28,0x15,0x22,0x0e, +0x05,0x08,0x07,0x04,0x01,0x02,0x02,0x02,0x01,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x5b,0x04,0xa6,0x05,0xb0,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0xff,0xff,0x00,0xab,0xff,0xea, +0x06,0xae,0x06,0xb3,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xae,0x07,0xcb,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73, +0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xcb,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x74,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56, +0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59, +0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x5b,0x04,0xa6,0x05,0xb0,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x27,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xc3, +0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x51,0x03,0x90,0x07,0x13,0x00,0x0c,0xb5,0x03,0x02,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xc3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x51,0x00,0x39, +0x07,0x13,0x00,0x0c,0xb5,0x03,0x02,0x20,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00, +0x00,0x26,0x0f,0x59,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x52,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x27, +0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x08,0xbd,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x57,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x4f,0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x5d,0x35,0x35, +0x35,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x08,0xbd,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x00,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x3c,0x01,0x20,0x3c,0x01,0x3c,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x70,0x08,0x0e, +0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0a,0x6d,0x03,0x48,0x00,0x32,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x07,0x67,0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x48,0x06,0xb7,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x08,0x7f,0x02,0x26,0x09,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x48,0x06,0xb7,0x00,0x0e, +0xb6,0x01,0x03,0x02,0x20,0x34,0x01,0x34,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0x04,0x00,0x9b,0xfd,0xc4,0x05,0x58,0x05,0xec,0x00,0x28,0x00,0x2c,0x00,0x30,0x00,0x34,0x00,0x72,0xb1,0x0e,0x01,0xbb,0x05,0x0a,0x00,0x27,0x00,0x2a,0x05,0x0c,0xb2,0x29,0x29,0x2d,0xbb,0x05,0x0c,0x00,0x2e,0x00,0x31,0x05,0x0c,0x40,0x0a,0x32,0x27,0x2e, +0x32,0x32,0x2e,0x27,0x03,0x36,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x29,0x04,0xfb,0xb2,0x2c,0x31,0x2d,0xb8,0x04,0xfb,0x40,0x0c,0x33,0x2f,0x30,0x01,0x30,0x1a,0x0d,0x00,0x11,0x11,0x22,0x06,0xbb,0x04,0xfb,0x00,0x07,0x05,0x03,0x00,0x00,0x00,0x2f,0x3f,0xed,0x32,0x33,0x2f,0x12,0x39,0x2f,0x2f,0x5d,0x33,0xfd,0x32,0xd6,0xed,0x01, +0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x01,0x23,0x35,0x33,0x37,0x23,0x35,0x33, +0x05,0x23,0x35,0x33,0x04,0x9e,0x0c,0x27,0x49,0x3e,0x1a,0x23,0x4c,0x48,0x3e,0x14,0x03,0x41,0xda,0xa3,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x24,0x4e,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xfc,0xc9,0xc9,0xab,0xc9,0xc9,0xfe,0xaa,0xc9,0xc9,0x05,0xec,0xfb,0xb0,0x43,0x61,0x40,0x1f,0xa7,0x10,0x27,0x44,0x35,0x56,0x5a,0x45, +0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x2e,0x67,0xa7,0x79,0x03,0x9c,0xf7,0xd8,0xbd,0x5b,0xbd,0xbd,0xbd,0x00,0x03,0x00,0x9b,0xfd,0xf6,0x05,0x58,0x04,0xb6,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6e,0xb1,0x11,0x03,0xb8,0x05,0x0a,0xb2,0x2c,0x34,0x30,0xb8,0x05,0x0c,0x40,0x09,0x31,0x35,0x31,0x2c,0x31, +0x2c,0x31,0x39,0x22,0xbb,0x05,0x0a,0x00,0x1b,0x00,0x34,0x04,0xfb,0xb4,0x2f,0x37,0x01,0x37,0x30,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x33,0x01,0x33,0x2f,0x2f,0x01,0x2f,0x16,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x27,0x01,0x27,0x2f,0x1f,0x01,0x1f,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0x2f,0x5d,0xed, +0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35, +0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x3a,0x34,0x14,0x04,0x1b,0x56,0x79,0x9e,0x63,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0xc9,0xc9,0x03,0x17,0x5d,0xac,0x51,0x21,0x47,0x62,0x3e, +0x1c,0xa7,0x09,0x16,0x28,0x1e,0x3d,0x60,0x42,0x23,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0x40,0xbd,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50, +0x00,0x83,0xfe,0xab,0x00,0x01,0x00,0x9b,0xfd,0xff,0x05,0x58,0x01,0xc1,0x00,0x2a,0x00,0x4a,0xb2,0x0b,0x00,0x0c,0xb8,0x05,0x0a,0xb5,0x2a,0x27,0x27,0x2c,0x1a,0x1d,0xb8,0x05,0x0a,0x40,0x0b,0x19,0x16,0x2f,0x2a,0x01,0x2a,0x2f,0x1a,0x01,0x1a,0x22,0xb8,0x04,0xfb,0xb7,0x1f,0x11,0x2f,0x11,0x02,0x11,0x0c,0x06,0xba,0x04,0xfb,0x00, +0x07,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34, +0x26,0x27,0x04,0x84,0x08,0x09,0x06,0x09,0x55,0x5f,0x16,0x3f,0x4a,0x17,0x05,0x03,0x3c,0x82,0xcf,0x95,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0x01,0xc1,0x2d,0x54,0x2a,0x3f,0x3e,0xa7,0x26,0x20,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39, +0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x05,0x0e,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x06,0x32,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff,0xff,0xba, +0xff,0xf2,0x02,0xac,0x06,0x32,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0x00,0x03,0x00,0x9b,0xfe,0x55,0x05,0x58,0x04,0xb6,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x7e,0xb1,0x11,0x03,0xb8,0x05,0x0a,0xb2,0x39,0x14,0x17,0xb8,0x05,0x0e,0xb2,0x44,0x23,0x21,0xb8,0x05,0x0e,0xb5,0x4a,0x44,0x4a,0x44,0x4a, +0x3d,0xb8,0x05,0x0c,0xb6,0x3e,0x39,0x3e,0x39,0x3e,0x4e,0x2f,0xbb,0x05,0x0a,0x00,0x28,0x00,0x40,0x01,0x57,0xb5,0x3d,0x2f,0x3c,0x01,0x3c,0x1c,0xb8,0x05,0x00,0xb3,0x41,0x14,0x23,0x47,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x34,0x01,0x34,0x2f,0x2c,0x01,0x2c,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d, +0x2f,0x5d,0xfd,0x39,0x39,0xd6,0xed,0x2f,0x5d,0xd6,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x39,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e, +0x02,0x35,0x34,0x37,0x2e,0x03,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x39,0x35,0x14,0x04,0x2b,0xa3,0x80,0x14,0x17,0x1a,0x2b,0x3a, +0x20,0x23,0x3b,0x2b,0x19,0x21,0x6e,0x95,0x5b,0x27,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0x63,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0x03,0x17,0x5e,0xab,0x51,0x21,0x47,0x62,0x3e,0x1c,0xa7,0x09,0x16,0x28,0x1e,0x60,0x7d,0x18,0x15,0x38,0x21,0x20,0x3a,0x2c,0x19,0x19,0x2c,0x39, +0x21,0x3b,0x2a,0x0b,0x4d,0x7e,0xab,0x68,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0xea,0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07, +0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x04,0x74,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x87,0x04,0x53, +0x02,0x06,0x0e,0x5b,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xff,0x04,0x02,0x03,0x56,0x02,0x06,0x0e,0x5d,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0x56,0xfd,0xce,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x57,0xff,0xaf,0x04,0x02,0x04,0x11, +0x02,0x26,0x09,0x72,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfc,0x28,0xff,0xff,0x00,0x57,0xff,0xaf,0x04,0x02,0x03,0x5c,0x02,0x26,0x09,0x72,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0x02,0xac,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x06,0x0f,0x5b,0x66,0x60,0x00,0x02,0x00,0x00, +0xfd,0xfe,0x04,0x02,0x03,0x1c,0x00,0x2c,0x00,0x41,0x00,0x6a,0xb2,0x12,0x2b,0x37,0xb8,0x05,0x0a,0xb2,0x13,0x20,0x2b,0xb8,0x05,0x0a,0xb4,0x18,0x3f,0x3f,0x18,0x12,0xb8,0x04,0xfd,0xb6,0x2f,0x15,0x01,0x15,0x15,0x0d,0x1b,0xb8,0x04,0xfb,0xb6,0x2f,0x3c,0x3f,0x3c,0x02,0x3c,0x32,0xb8,0x04,0xfb,0xb5,0x2f,0x25,0x01,0x25,0x0a,0x0d, +0xb8,0x04,0xfb,0x40,0x09,0x09,0x1f,0x06,0x2f,0x06,0x02,0x06,0x18,0x2b,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x5d,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x05,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x35,0x16, +0x16,0x33,0x32,0x3e,0x02,0x37,0x21,0x35,0x21,0x36,0x36,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x33,0x25,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x04,0x02,0xc3,0x0d,0x3f,0x72,0xab,0x79,0x58,0xad,0x58,0x67,0xab,0x45,0x3e,0x60,0x48,0x33, +0x11,0xfe,0x2a,0x01,0xf4,0x08,0x07,0x01,0x30,0x56,0x2a,0x42,0x7b,0x5e,0x39,0x30,0x55,0x75,0x45,0x42,0x7f,0x63,0x3d,0xb7,0xfe,0x96,0x0f,0x2a,0x32,0x35,0x1a,0x1c,0x37,0x2c,0x1b,0x20,0x3a,0x4e,0x2f,0x1b,0x4b,0x2a,0x02,0x09,0x0e,0x62,0xb5,0x8a,0x53,0x2c,0x2a,0xa6,0x2b,0x25,0x1b,0x31,0x43,0x28,0x6d,0x2b,0x58,0x2d,0x16,0x11, +0x29,0x4f,0x72,0x48,0x41,0x8e,0x77,0x4d,0x4f,0x9e,0xee,0x9f,0x09,0xef,0x33,0x55,0x3d,0x22,0x26,0x3d,0x4a,0x24,0x26,0x3c,0x29,0x16,0x0c,0x14,0x1d,0x33,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x31,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x0a,0x6d,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11, +0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x63,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x30,0x00,0xe4,0xfd,0x55,0x00,0x0c,0xb5,0x03,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x59,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x09,0x73,0x00,0xe5,0xfd,0x55, +0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x31,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x04,0x79,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x00, +0xfd,0xff,0x04,0x02,0x05,0x91,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x03,0xc9,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x6d, +0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x04,0x79,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x03,0xc9,0xff,0xff,0xff,0xba,0xfd,0xc9,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba, +0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54, +0x00,0x83,0xfd,0xce,0x00,0x01,0x00,0x81,0x06,0xa6,0x01,0x86,0x07,0xab,0x00,0x13,0x00,0x19,0xbc,0x00,0x0a,0x05,0x0c,0x00,0x00,0x00,0x05,0x04,0xfe,0xb3,0x2f,0x0f,0x01,0x0f,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x81,0x13,0x23,0x2f,0x1d, +0x1c,0x31,0x22,0x14,0x14,0x22,0x31,0x1c,0x1d,0x2f,0x23,0x13,0x07,0x28,0x1c,0x31,0x22,0x14,0x14,0x22,0x31,0x1c,0x1d,0x2f,0x23,0x13,0x13,0x23,0x2f,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x53,0x05,0x50,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff, +0xff,0xba,0xfe,0xa6,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x04,0xb2,0x00,0x26,0x0e,0x35,0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0xca,0x04,0x02,0x00,0x07,0x0f,0x50,0x06,0x3c,0xfe,0xab,0xff,0xff, +0xff,0xba,0xfe,0xa6,0x08,0x04,0x04,0xb2,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x27,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x07,0x0f,0x50,0x03,0x90,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x55,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x0f, +0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x55,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x21,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xca, +0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07, +0x0f,0x53,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x83,0xfd,0xce,0x00,0x07, +0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xad,0xfe,0xab,0x00,0x07,0x0f,0x50,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x83,0xfe,0xab,0x00,0x07, +0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0x13,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0xad,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x35,0x01,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0x13,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0x83, +0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0x5a,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0xad,0xfd,0x7e,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0xfd,0x7e,0xff,0xff, +0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x27, +0x0f,0x57,0x01,0x1d,0x04,0xad,0x00,0x07,0x0f,0x52,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x52,0xfe,0x13,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x2b,0x01,0x2b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c, +0x00,0x00,0x00,0x07,0x0f,0x5c,0x00,0xc0,0xfc,0xfa,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0f,0x56,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0xab,0xfe,0xa6, +0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x51,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x10,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0xb3,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x90, +0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xcb,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0x00,0x39,0xfd,0xff,0x04,0xad,0x04,0x79,0x02,0x26,0x0e,0x57, +0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x79,0x02,0x26,0x0e,0x58,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0x00,0x39,0xfd,0xff,0x04,0xad,0x02,0xb9,0x02,0x26,0x0e,0x57,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6, +0x04,0xad,0x02,0xaf,0x02,0x26,0x0e,0x58,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0x00,0x04,0x00,0x9b,0xfd,0xf6,0x05,0x58,0x04,0xb6,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x82,0xb1,0x11,0x03,0xbb,0x05,0x0a,0x00,0x2c,0x00,0x31,0x05,0x0c,0xb2,0x30,0x30,0x38,0xbe,0x05,0x0c,0x00,0x39,0x00,0x34,0x05,0x0c,0x00, +0x35,0x00,0x22,0x05,0x0a,0x40,0x0e,0x1b,0x2c,0x39,0x35,0x1b,0x1b,0x35,0x39,0x2c,0x04,0x3d,0x3c,0x38,0x34,0xb8,0x04,0xfb,0xb5,0x3a,0x2f,0x37,0x01,0x37,0x33,0xb8,0x01,0x57,0xb5,0x30,0x2f,0x2f,0x01,0x2f,0x16,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x27,0x01,0x27,0x2f,0x1f,0x01,0x1f,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00, +0x3f,0xed,0x39,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xd6,0xed,0x2f,0x5d,0x33,0xed,0x32,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34, +0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x3a,0x34,0x14,0x04,0x1b,0x56,0x79,0x9e,0x63,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94, +0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0xab,0xc9,0xc9,0x01,0x56,0xc9,0xc9,0x03,0x17,0x5d,0xac,0x51,0x21,0x47,0x62,0x3e,0x1c,0xa7,0x09,0x16,0x28,0x1e,0x3d,0x60,0x42,0x23,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0x40,0xbd,0xbd,0xbd,0x00,0xff,0xff, +0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x06,0x64,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x07,0x0f,0x57,0x01,0x9f,0x04,0x02,0xff,0xff, +0xff,0xba,0xff,0xf2,0x02,0xac,0x07,0xba,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0f,0x57,0x00,0x72,0x05,0x58,0x00,0x0a,0xb4,0x01,0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x05,0x63,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f, +0x02,0xac,0x01,0x07,0x0a,0x6d,0x01,0x9f,0xfd,0x87,0x00,0x0a,0xb4,0x01,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x06,0xb9,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0a,0x6d,0x00,0x9c,0xfe,0xdd,0x00,0x14,0x40,0x0a,0x02,0x2f,0x25,0x01,0x25,0x01, +0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0f,0x52,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xa4,0x03,0x57,0x00,0x03,0x00,0x7e, +0xfd,0xfe,0x04,0x2d,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x6a,0xb4,0x24,0x02,0x1b,0x1b,0x34,0xb8,0x05,0x0e,0xb2,0x44,0x4c,0x2b,0xb8,0x05,0x0d,0xb7,0x28,0x44,0x28,0x44,0x28,0x4e,0x10,0x21,0xbb,0x05,0x0a,0x00,0x02,0x00,0x39,0x04,0xfd,0xb6,0x3f,0x28,0x28,0x25,0x25,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x0f,0x2a,0x2f,0x2f, +0x01,0x2f,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0xc6,0xfd,0xc6,0x32,0x2f,0x32,0x2f,0x10,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x2f,0x11,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35, +0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x2b,0xad,0x53,0xa8,0xfe, +0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x07,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0xfd,0xfe, +0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x1e,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f, +0x33,0x43,0x24,0x00,0x00,0x04,0x00,0x7e,0xfd,0xfe,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x5a,0x00,0x7e,0xb2,0x1b,0x1b,0x34,0xb8,0x05,0x0e,0xb5,0x44,0x58,0x58,0x44,0x4c,0x2b,0xb8,0x05,0x0d,0x40,0x0b,0x28,0x44,0x28,0x44,0x28,0x5c,0x24,0x02,0x4d,0x10,0x21,0xbf,0x05,0x0a,0x00,0x02,0x00,0x50,0x04,0xfb,0x00, +0x52,0x05,0x03,0x00,0x39,0x04,0xfd,0xb6,0x3f,0x28,0x28,0x25,0x25,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x10,0x2a,0x2f,0x2f,0x01,0x2f,0x1b,0x07,0x1c,0x4d,0x04,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0xc6,0xfd,0xc6,0x32,0x2f,0x32,0x2f,0x10,0xed,0x3f,0xed,0x01,0x2f, +0xed,0x39,0x2f,0x12,0x39,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33, +0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5, +0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x06,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x01,0xba,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35, +0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x1e,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x02,0x43,0x68,0x55, +0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x00,0xff,0xff,0xff,0xba,0xfe,0x03,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0xfe,0x03,0xff,0xff,0xff,0xba,0xfe,0x03,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0xfe,0x03,0x00,0x05,0x00,0x7e,0xfd,0xfa,0x04,0x2d, +0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x50,0x00,0x54,0x00,0x9d,0xb9,0x00,0x52,0x05,0x0a,0xb7,0x51,0x51,0x44,0x24,0x02,0x1b,0x1b,0x34,0xbb,0x05,0x0e,0x00,0x44,0x00,0x2b,0x05,0x0d,0xb4,0x2c,0x4c,0x28,0x28,0x4d,0xb8,0x05,0x0a,0xb7,0x4e,0x44,0x4e,0x44,0x4e,0x56,0x10,0x21,0xb8,0x05,0x0a,0xb4,0x02,0x2c,0x2a,0x52,0x4d, +0xb8,0x05,0x02,0xb2,0x53,0x50,0x39,0xb8,0x04,0xfd,0x40,0x0a,0x3f,0x28,0x28,0x25,0x25,0x2f,0x3f,0x01,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x10,0x2f,0x2f,0x3f,0x2f,0x02,0x2f,0x2f,0x2a,0x01,0x2a,0x1c,0x07,0x1b,0x03,0x00,0x0d,0xb8,0x04,0xff,0xb4,0x14,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x2f,0x5d, +0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xfd,0xd6,0x32,0xed,0x32,0x11,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x2f,0x11,0x39,0x11,0x39,0x2f,0xed,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04, +0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63, +0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x07,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x21,0xb9,0xb9,0x01,0x42,0xb9,0xb9, +0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x82,0x02,0x03,0x02,0x01,0x93,0xf7,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38, +0x1f,0x33,0x43,0x24,0xfe,0x83,0xb5,0xb5,0xb5,0x00,0x00,0x06,0x00,0x7e,0xfd,0xfa,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x5a,0x00,0x5e,0x00,0x62,0x00,0xb1,0xb2,0x24,0x02,0x4d,0xb8,0x05,0x0b,0xb3,0x58,0x58,0x44,0x60,0xb8,0x05,0x0a,0xb3,0x34,0x5f,0x5f,0x34,0xbb,0x05,0x0e,0x00,0x44,0x00,0x2b,0x05,0x0d,0xb4, +0x2c,0x4c,0x28,0x28,0x5b,0xb8,0x05,0x0a,0xb7,0x5c,0x44,0x5c,0x44,0x5c,0x64,0x10,0x21,0xb8,0x05,0x0a,0xb2,0x02,0x5f,0x5b,0xb8,0x04,0xfb,0x40,0x0a,0x61,0x2f,0x5e,0x01,0x5e,0x51,0x50,0x50,0x2f,0x39,0xb8,0x04,0xfd,0x40,0x0a,0x3f,0x28,0x28,0x25,0x25,0x2f,0x3f,0x01,0x3f,0x47,0xb8,0x04,0xfd,0xb3,0x2c,0x52,0x2a,0x2f,0xba,0x04, +0xfb,0x00,0x52,0x05,0x03,0xb6,0x4d,0x1c,0x07,0x1b,0x04,0x00,0x0d,0xb8,0x04,0xff,0xb4,0x14,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0xed,0x12,0x17,0x39,0x3f,0xf4,0xc6,0x12,0x39,0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed, +0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x2f,0x10,0xe4,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02, +0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54, +0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x33,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x01,0xe7,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0xfe,0x86,0xb9,0xb9, +0x01,0x42,0xb9,0xb9,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x82,0x02,0x03,0x02,0x01,0x93,0xf7,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e, +0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x01,0xdf,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0xfc,0xac,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfd,0xfa,0x04,0x68,0x02,0xdb,0x00,0x42,0x00,0x50,0x00,0x54,0x00,0x58,0x00,0x92,0xb1,0x0d,0x30,0xb8,0x05,0x0e,0xb2,0x48,0x48,0x55,0xb8,0x05,0x0a,0xb2,0x56,0x50,0x27,0xb8,0x05,0x0d, +0xb2,0x3f,0x3f,0x51,0xb8,0x05,0x0a,0x40,0x09,0x52,0x56,0x52,0x56,0x52,0x5a,0x15,0x55,0x51,0xb8,0x04,0xfb,0x40,0x09,0x57,0x54,0x43,0x3e,0x3e,0x43,0x3b,0x3b,0x35,0xb8,0x04,0xfd,0xb4,0x2f,0x43,0x01,0x43,0x4b,0xb8,0x04,0xfd,0x40,0x0b,0x27,0x2f,0x2b,0x01,0x2b,0x20,0x0c,0x21,0x03,0x00,0x12,0xb8,0x04,0xff,0xb7,0x2f,0x19,0x01, +0x19,0x26,0x3f,0x3f,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x39,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0xd6,0x5d,0xed,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd4,0x32,0xed,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x32,0x10,0xed,0x39,0x2f,0xed,0x39,0x31,0x30,0x15,0x22, +0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x0e,0x03,0x07,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x16,0x16,0x17,0x35,0x06,0x06,0x23,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e, +0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xda,0xc7,0xb9,0x5a,0x3a,0x59,0x60,0x76,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x79,0x66,0x5c,0x65,0x76,0x4e,0x20,0x2c,0x75,0x95,0xb4,0x6a,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x0d,0x17,0x3e, +0x2a,0x51,0xb4,0x64,0x02,0x46,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x21,0xaf,0xaf,0x01,0x38,0xaf,0xaf,0x0e,0x34,0x20,0x20,0x33,0x31,0x4f,0x64,0x32,0x05,0x18,0x30,0x25,0x18,0x14,0x10,0x9d,0x12,0x17,0x1b,0x28,0x2f,0x29,0x1c,0x01,0xbb,0x09,0x41,0x57,0x5f,0x27,0x7a,0x01,0x3d,0x42,0x22,0x39,0x4b,0x29,0x3a, +0x40,0x1e,0x05,0x01,0x03,0x04,0x03,0x62,0x02,0x03,0x02,0xe6,0x17,0x1c,0xb5,0x02,0x0c,0x18,0x17,0x33,0x30,0x1b,0x2c,0x3a,0x1f,0xfe,0xbd,0xab,0xab,0xab,0x00,0x04,0xff,0xba,0xfd,0xfa,0x04,0xad,0x02,0xdb,0x00,0x4f,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0xa7,0xb1,0x0d,0x3d,0xb8,0x05,0x0e,0xb6,0x55,0x55,0x62,0x63,0x30,0x30,0x24, +0xba,0x05,0x0b,0x00,0x62,0x05,0x0a,0xb2,0x63,0x5d,0x34,0xb8,0x05,0x0d,0xb2,0x4c,0x4c,0x5e,0xb8,0x05,0x0a,0x40,0x09,0x5f,0x63,0x5f,0x63,0x5f,0x67,0x66,0x62,0x5e,0xb8,0x04,0xfb,0xb2,0x64,0x61,0x42,0xb8,0x04,0xfd,0x40,0x0a,0x50,0x4b,0x4b,0x48,0x48,0x2f,0x50,0x01,0x50,0x58,0xb8,0x04,0xfd,0xb5,0x34,0x2f,0x38,0x01,0x38,0x2a, +0xb8,0x05,0x03,0xb7,0x30,0x24,0x21,0x0c,0x20,0x05,0x00,0x12,0xb8,0x04,0xff,0x40,0x09,0x2f,0x19,0x01,0x19,0x33,0x4c,0x4c,0x29,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x39,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x3f,0x2f,0x5d,0x33,0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xfd,0xd6,0x32,0xed,0x32,0x11, +0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x32,0x10,0xfd,0xe4,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02, +0x27,0x06,0x06,0x07,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x16,0x16,0x17,0x35,0x06,0x06,0x23,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xda,0xc7,0xb9,0x5a,0x3a,0x59,0x60,0x76,0x57, +0x4e,0x7e,0x33,0x37,0x84,0x4e,0x4f,0x7a,0x66,0x5c,0x64,0x77,0x4e,0x20,0x1d,0x46,0x2a,0x03,0x14,0x35,0x5c,0x4a,0x14,0x62,0x7c,0x49,0x1e,0x04,0x48,0xad,0x67,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x0d,0x17,0x3e,0x2a,0x51,0xb4,0x64,0x02,0x46,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23, +0x3f,0x35,0x2a,0x0f,0x21,0xaf,0xaf,0x01,0x38,0xaf,0xaf,0x0e,0x34,0x20,0x20,0x33,0x31,0x4f,0x64,0x32,0x05,0x18,0x2f,0x26,0x18,0x14,0x10,0x9d,0x12,0x17,0x1b,0x28,0x2f,0x29,0x1c,0x01,0xbb,0x06,0x22,0x17,0x27,0x36,0x23,0x10,0xa7,0x29,0x45,0x59,0x31,0x2a,0x5a,0x25,0x7a,0x01,0x3c,0x43,0x22,0x39,0x4b,0x29,0x3a,0x40,0x1e,0x05, +0x01,0x03,0x04,0x03,0x62,0x02,0x03,0x02,0xe5,0x17,0x1b,0xb5,0x02,0x0c,0x18,0x17,0x33,0x30,0x1b,0x2c,0x3a,0x1f,0xfe,0xbd,0xab,0xab,0xab,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x07,0x0d,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x51,0x05,0x46,0x03,0x57,0x01,0x07,0x0f,0x57,0x05,0x46,0x04,0xab,0x00,0x0c,0xb5,0x02, +0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x07,0x0d,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x51,0x05,0x46,0x03,0x57,0x01,0x07,0x0f,0x57,0x05,0x46,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x5b,0x01,0x5b,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4, +0x07,0x0d,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xa4,0x03,0x57,0x01,0x07,0x0f,0x57,0x02,0xa4,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x45,0x01,0x45,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x07,0x0d,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xa4,0x03,0x57,0x01,0x07, +0x0f,0x57,0x02,0xa4,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc6,0x07,0x0d,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x9a,0x03,0x57,0x01,0x07,0x0f,0x57,0x00,0x9a,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x1d,0x01,0x1d,0x00,0x11,0x5d, +0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x07,0x0d,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x9a,0x03,0x57,0x01,0x07,0x0f,0x57,0x00,0x9a,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x06,0x8c,0x02,0x26,0x09,0x13,0x00,0x00, +0x00,0x07,0x0f,0x57,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x06,0x8c,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x06,0x13,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad, +0x06,0x13,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x17,0x00,0x00,0x01,0xf2,0x07,0x6e,0x00,0x27,0x09,0x0d,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5e,0x00,0x00,0xff,0xff,0x00,0x17,0xff,0xf2,0x02,0xac,0x07,0x6e,0x00,0x27,0x08,0xc7,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5e,0x00,0x00, +0xff,0xff,0x00,0x16,0x00,0x00,0x01,0xfa,0x07,0x6e,0x00,0x27,0x09,0x0d,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5f,0x00,0x00,0xff,0xff,0x00,0x16,0xff,0xf2,0x02,0xac,0x07,0x6e,0x00,0x27,0x08,0xc7,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5f,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0x8a,0x02,0x26,0x09,0x2a,0x00,0x00, +0x01,0x07,0x0f,0x5e,0x00,0xab,0xfe,0x1c,0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0xdf,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x45,0x01,0x2f,0x45,0x01,0x45,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0xff,0xba, +0xfe,0xa6,0x02,0x4c,0x05,0xf6,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5e,0x00,0xd5,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x1f,0x01,0x1f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xf6,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab, +0x01,0x07,0x0f,0x5e,0x00,0xd5,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x28,0x01,0x28,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0x8a,0x02,0x26,0x09,0x2a,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfe,0x1c,0x00,0x0a,0xb4,0x01,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae, +0x04,0xdf,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x68,0x01,0x2f,0x68,0x01,0x68,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x96,0x05,0xf6,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5f,0x00,0x9c,0xfe,0x88, +0x00,0x0a,0xb4,0x03,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xf6,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5f,0x00,0x9c,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x05,0x91, +0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x01,0x07,0x0f,0x60,0x02,0x01,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xc8,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x43,0x01,0x43,0x00,0x11, +0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x02,0x75,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x0f,0x60,0x00,0x9c,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x33,0x01,0x33,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x0f,0x60,0x00,0x9c,0xf8,0x34,0x00,0x0a, +0xb4,0x01,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x17,0xfd,0xff,0x03,0xf4,0x04,0xc3,0x00,0x27,0x09,0x29,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5e,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x17,0xfd,0xff,0x04,0xad,0x04,0xc3,0x00,0x27,0x0e,0x5e,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5e,0x00,0x00,0xfd,0x55,0xff,0xff, +0x00,0x16,0xfd,0xff,0x03,0xf4,0x04,0xc3,0x00,0x27,0x09,0x29,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5f,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x16,0xfd,0xff,0x04,0xad,0x04,0xc3,0x00,0x27,0x0e,0x5e,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5f,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x6e,0x02,0x26,0x09,0x65, +0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfe,0x00,0x00,0x0e,0xb7,0x01,0x2f,0x2c,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x09,0x66,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff, +0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x6e,0x02,0x26,0x09,0x65,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfe,0x00,0x00,0x0e,0xb7,0x01,0x2f,0x2c,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x09,0x66,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a, +0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0x7e,0xfd,0xfe,0x04,0x2c,0x03,0x54,0x00,0x24,0x00,0x4a,0x00,0x65,0xb9,0x00,0x3e,0x05,0x0b,0xb5,0x31,0x31,0x38,0x24,0x02,0x37,0xb8,0x05,0x0d,0xb4,0x38,0x38,0x4c,0x10,0x21,0xb8,0x05,0x0a,0x40,0x09,0x02,0x2f,0x37,0x01,0x37,0x47,0x25,0x28,0x2e,0xb8,0x04,0xfd, +0x40,0x13,0x41,0x4a,0x4a,0x41,0x41,0x2f,0x25,0x01,0x25,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0x33,0x2f,0x33,0x2f,0x10,0xfd,0xc4,0x11,0x39,0x2f,0x5d,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x11,0x39,0x11,0x39,0x2f,0xed,0x31,0x30,0x01, +0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01, +0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x01,0xd3,0x1e,0x2e,0x0f,0x69,0x06,0x14,0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0xfd, +0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x02,0xd6,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35, +0x1c,0x00,0x00,0x03,0x00,0x7e,0xfd,0xfe,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x32,0x00,0x58,0x00,0x81,0xb5,0x24,0x55,0x33,0x03,0x02,0x25,0xbb,0x05,0x0b,0x00,0x30,0x00,0x4c,0x05,0x0b,0xb2,0x3f,0x3f,0x45,0xb8,0x05,0x0d,0xb7,0x46,0x30,0x46,0x30,0x46,0x5a,0x10,0x21,0xb8,0x05,0x0a,0x40,0x09,0x02,0x2f,0x45,0x01,0x45,0x55,0x33, +0x36,0x3c,0xb8,0x04,0xfd,0x40,0x0a,0x4f,0x58,0x58,0x4f,0x4f,0x2f,0x33,0x01,0x33,0x28,0xba,0x04,0xfb,0x00,0x2a,0x05,0x03,0x40,0x0a,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x3f,0xed,0x2f,0x5d,0x33,0x2f,0x33,0x2f,0x10,0xfd,0xc4,0x11,0x39,0x2f,0x5d, +0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x11,0x17,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36, +0x36,0x07,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8, +0x58,0x5d,0x58,0x02,0x89,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x96,0x1e,0x2e,0x0f,0x69,0x06,0x14,0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d, +0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x03,0x58,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x7a,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35,0x1c,0x00,0xff,0xff,0xff,0xba, +0xfd,0x78,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0x56,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0x56,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x52,0x01,0x52, +0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x50,0x02,0x26,0x09,0x19,0x00,0x00,0x01,0x07,0x0f,0x60,0x05,0x49,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x6a,0x01,0x6a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x50,0x02,0x26,0x0e,0x31,0x00,0x00,0x01,0x07,0x0f,0x60,0x05,0x49,0xfd,0xdd, +0x00,0x0a,0xb4,0x01,0x2f,0x75,0x01,0x75,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x50,0x02,0x26,0x08,0xd4,0x00,0x00,0x01,0x07,0x0f,0x60,0x02,0x9d,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x5f,0x01,0x5f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x50,0x02,0x26,0x0e,0x32,0x00,0x00, +0x01,0x07,0x0f,0x60,0x02,0x9d,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x6a,0x01,0x6a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x04,0xb8,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0a,0x6e,0x05,0x46,0xfc,0xdc,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x04,0xb8,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0a,0x6e, +0x05,0x46,0xfc,0xdc,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x04,0xb8,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0xa4,0xfc,0xdc,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x04,0xb8,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0xa4,0xfc,0xdc,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x06,0xb3,0x02,0x26, +0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x73,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xae,0x06,0xb3,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba, +0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0x00,0x01,0x00,0xa4,0xff,0xfb,0x01,0x5d,0x00,0xb0,0x00,0x03,0x00,0x19,0xbc,0x00,0x00,0x05,0x0a,0x00,0x01,0x00,0x02,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x35,0x33,0x01, +0x5d,0xb9,0xb9,0x05,0xb5,0x00,0x00,0x02,0x00,0x03,0xff,0xfb,0x01,0xfe,0x00,0xb0,0x00,0x03,0x00,0x07,0x00,0x29,0xb9,0x00,0x00,0x05,0x0a,0xb3,0x01,0x01,0x08,0x04,0xb8,0x05,0x0a,0xb2,0x05,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x17, +0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x00,0x02,0x00,0xa4,0xff,0xfb,0x01,0x5d,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x25,0xb1,0x04,0x00,0xb8,0x05,0x0a,0xb2,0x05,0x01,0x07,0xbb,0x05,0x02,0x00,0x04,0x00,0x02,0x05,0x02,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xfd,0xd6,0xed, +0x01,0x2f,0x33,0xed,0x32,0x31,0x30,0x05,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x5d,0xb9,0xb9,0xb9,0xb9,0x05,0xb5,0x63,0xb5,0x00,0x00,0x03,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x41,0xbf,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x00,0x05,0x0a,0xb3,0x01,0x01, +0x0c,0x08,0xb8,0x05,0x02,0xb6,0x0b,0x0b,0x00,0x07,0x06,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xed,0xd4,0xed,0xd6,0xed,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9, +0xa1,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x03,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x37,0xbf,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x00,0x05,0x0a,0xb2,0x01,0x04,0x00,0xb8,0x05,0x02,0xb3,0x06,0x03,0x03,0x0a,0xb8,0x05,0x02,0xb3,0x2f,0x08,0x01, +0x08,0x00,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0xd6,0xed,0xd4,0xed,0x31,0x30,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x01,0x13,0xb5,0xb5,0xb5,0xfe,0x33,0xb5,0x00,0x00,0x03,0xff,0x62,0xff,0xfb,0x02,0x9f,0x00,0xb0,0x00,0x03,0x00,0x07, +0x00,0x0b,0x00,0x35,0xbf,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x00,0x05,0x0a,0xb5,0x01,0x01,0x0c,0x0a,0x06,0x02,0xb8,0x05,0x02,0xb5,0x09,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x32,0xed,0x32,0x32,0x11,0x01,0x33,0x2f,0xed,0xd4,0xed,0xd4,0xed,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35, +0x33,0x05,0x23,0x35,0x33,0x1b,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x3f,0xb1,0x08,0x00,0xb8,0x05,0x0a,0xb5,0x09,0x01,0x01,0x10,0x0c,0x04,0xb8,0x05,0x0a,0xb3,0x0d,0x05,0x0d,0x08,0xb8, +0x05,0x02,0xb4,0x0e,0x0b,0x0b,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x33,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9, +0xfe,0xbe,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x63,0xb5,0xb5,0xb5,0x00,0x02,0xff,0xc6,0x00,0x00,0x02,0x2c,0x02,0x62,0x00,0x19,0x00,0x27,0x00,0x44,0xb2,0x27,0x27,0x06,0xb8,0x05,0x0d,0xb3,0x03,0x03,0x28,0x0f,0xb8,0x05,0x0e,0xb4,0x1f,0x06,0x14,0x05,0x0a,0xb8,0x05,0x01,0xb7,0x22,0x00,0x27,0x1a,0x1a,0x03,0x03, +0x00,0xb8,0x05,0x01,0xb4,0x2f,0x14,0x01,0x14,0x02,0x00,0x3f,0x5d,0xed,0x32,0x2f,0x33,0x11,0x33,0x10,0xd4,0xfd,0xc6,0x12,0x39,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x32,0x2f,0x31,0x30,0x27,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35, +0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x3a,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x72,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04, +0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x00,0x02,0xff,0x97,0x06,0x7d,0x01,0xf0,0x07,0xe8,0x00,0x1b,0x00,0x29,0x00,0x2b,0xbf,0x00,0x0e,0x05,0x0d,0x00,0x21,0x00,0x09,0x04,0xfd,0x00,0x24,0x00,0x1c,0x04,0xfd,0xb3,0x13,0x27,0x13,0x03,0xb8,0x04,0xfd,0xb1,0x18,0x13,0x00,0x2f,0xdc,0xed,0x11,0x39,0x10,0xfd, +0xd6,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x69,0x2f,0x4d,0x27,0x0c,0x15,0x0b,0x24,0x77,0x4d,0x27,0x3c,0x29,0x16,0x21,0x39,0x4b,0x2a,0x20, +0x3e,0x3a,0x38,0x19,0x16,0x39,0x23,0x01,0x57,0x1c,0x2b,0x1e,0x10,0x2c,0x1f,0x27,0x4e,0x20,0x1a,0x37,0x06,0xcd,0x20,0x21,0x02,0x03,0x70,0x6f,0x1b,0x2d,0x3a,0x20,0x29,0x49,0x37,0x20,0x10,0x14,0x10,0x13,0x1b,0x56,0x13,0x1e,0x25,0x13,0x22,0x27,0x46,0x53,0x0a,0x0f,0x00,0x01,0x00,0x00,0x04,0x82,0x03,0x4b,0x07,0x38,0x00,0x03, +0x00,0x11,0xb6,0x03,0x01,0x00,0x2f,0x02,0x01,0x02,0x00,0x2f,0x5d,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x11,0x35,0x01,0x15,0x03,0x4b,0x04,0x82,0x94,0x02,0x22,0x94,0x00,0x00,0x01,0x00,0x89,0xfe,0x0a,0x01,0x93,0xff,0xfa,0x00,0x1c,0x00,0x17,0xb9,0x00,0x03,0x05,0x0b,0xb2,0x17,0x1c,0x12,0xb9,0x04,0xfe,0x00,0x08,0x00,0x2f,0xfd,0xc4, +0x01,0x2f,0xed,0x31,0x30,0x05,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0x5d,0x36,0x3a,0x06,0x0c,0x19,0x0e,0x1b,0x29,0x1b,0x0e,0x0f,0x1d,0x2c,0x1d,0x27,0x39,0x24,0x11,0x14,0x2a,0x44,0x30,0x46,0x17,0x57,0x33,0x17,0x16,0x03,0x05,0x14,0x20, +0x29,0x16,0x16,0x2b,0x21,0x15,0x22,0x3a,0x4c,0x2b,0x2c,0x54,0x49,0x3e,0x16,0x00,0x00,0x02,0x00,0x60,0xfd,0xff,0x01,0xa1,0xff,0x40,0x00,0x0b,0x00,0x17,0x00,0x2d,0xbf,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x06,0x05,0x00,0xb4,0x2f,0x0c,0x01,0x0c,0x12,0xb8,0x05,0x00,0xb3,0x2f,0x00,0x01,0x00,0x00, +0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x02,0x41,0x5e,0x5e,0x41,0x45,0x5d,0x5d,0x45,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0xc0,0x5d,0x45,0x41,0x5e,0x5e,0x41,0x45,0x5d,0xf6, +0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0x01,0x00,0x1e,0x04,0x20,0x02,0x8e,0x04,0x8d,0x00,0x03,0x00,0x10,0xb9,0x00,0x00,0x04,0xfd,0xb3,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x8e,0xfd,0x90,0x02,0x70,0x04,0x20,0x6d,0x00,0x00,0x02,0x00,0x3c,0xfd,0xff,0x01,0xc5,0xff,0x67,0x00,0x03, +0x00,0x07,0x00,0x21,0xbc,0x00,0x04,0x05,0x0b,0x00,0x05,0x00,0x00,0x05,0x0b,0xb2,0x01,0x04,0x00,0xb8,0x04,0xfe,0xb1,0x06,0x03,0x00,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0xb5,0x79,0x79,0x01,0x10,0x79,0x79,0xfd,0xff,0x01,0x68,0xfe,0x98,0x01,0x68,0x00,0x01,0x00,0x17, +0x05,0x44,0x01,0x77,0x07,0x6e,0x00,0x0f,0x00,0x17,0xb9,0x00,0x09,0x05,0x0d,0xb2,0x0a,0x09,0x01,0xb9,0x05,0x01,0x00,0x02,0x00,0x2f,0xed,0x2f,0x01,0x2f,0xed,0x31,0x30,0x13,0x21,0x15,0x23,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x17,0x01,0x60,0xee,0x09,0x0d,0x09,0x04,0x59,0x08,0x0f,0x16,0x07,0x6e,0x66,0x2c,0x4e,0x50, +0x58,0x35,0x6d,0x6a,0x3f,0x6b,0x68,0x6d,0x00,0x01,0x00,0x16,0x05,0x44,0x01,0xfa,0x07,0x6e,0x00,0x33,0x00,0x44,0xb9,0x00,0x31,0x05,0x0d,0xb2,0x2c,0x18,0x1c,0xb8,0x05,0x0d,0xb3,0x07,0x2e,0x1d,0x0a,0xb8,0x05,0x0d,0x40,0x0b,0x04,0x1c,0x18,0x02,0x0f,0x24,0x2f,0x2f,0x07,0x29,0x02,0xb8,0x05,0x01,0xb3,0x0f,0x15,0x15,0x0f,0x00, +0x2f,0x33,0x2f,0x10,0xfd,0x32,0xc6,0x32,0x11,0x33,0x11,0x12,0x39,0x2f,0x01,0x2f,0xed,0x2f,0x39,0x39,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17, +0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x01,0x36,0x13,0x12,0x45,0x08,0x07,0x59,0x10,0x12,0x24,0x34,0x22,0x14,0x2d,0x19,0x0f,0x30,0x14,0x11,0x0f,0x01,0x06,0x06,0x59,0x07,0x0f,0x17,0x10,0x5c,0x09,0x0e,0x06,0x0f,0x0e,0x1f,0x1f,0x0f,0x58,0x0f,0x06,0x06,0xe6,0x04,0x47,0x12,0x24,0x0f,0x29,0x2b,0x20,0x39, +0x2c,0x19,0x0c,0x0e,0x0d,0x0c,0x03,0x01,0x2d,0x5f,0x42,0x6d,0x6a,0x3f,0x6b,0x68,0x6d,0x41,0x26,0x42,0x20,0x04,0x27,0x21,0x23,0x21,0x23,0x28,0x10,0x20,0x00,0x01,0x00,0x30,0x05,0x44,0x01,0xd9,0x07,0x73,0x00,0x25,0x00,0x2b,0xb9,0x00,0x19,0x05,0x0b,0xb2,0x0c,0x0c,0x12,0xb8,0x05,0x0d,0xb6,0x13,0x13,0x22,0x03,0x25,0x25,0x1c, +0xb8,0x05,0x01,0xb1,0x03,0x09,0x00,0x2f,0xc4,0xed,0x32,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01,0xd9,0x1e,0x2e,0x0f,0x69,0x06,0x14, +0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0x07,0x6e,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35,0x1c,0x00,0x00,0x01,0x00,0x9a,0xff,0xd2,0x06,0xae, +0x02,0xbd,0x00,0x42,0x00,0x4c,0xb9,0x00,0x14,0x05,0x0a,0xb2,0x2f,0x2f,0x0f,0xb8,0x05,0x0a,0xb3,0x34,0x34,0x44,0x27,0xbb,0x05,0x0a,0x00,0x20,0x00,0x0c,0x04,0xff,0xb4,0x2f,0x39,0x01,0x39,0x1b,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x2c,0x01,0x2c,0x2f,0x24,0x01,0x24,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d, +0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02, +0x33,0x32,0x16,0x17,0x1e,0x05,0x06,0xae,0x16,0x41,0x63,0x4d,0x3a,0x2f,0x27,0x14,0x1a,0x2b,0x1d,0x1c,0x1f,0x12,0x15,0x12,0x29,0x48,0x60,0x6e,0x76,0x39,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0xa0,0x91,0x10,0x13,0x10,0x21,0x3a,0x4e,0x2c,0x3d,0x65,0x2a,0x12,0x1e,0x21,0x29,0x3a,0x50,0x99,0xa7,0x22, +0x3a,0x4c,0x53,0x55,0x25,0x33,0x2e,0x24,0x17,0x11,0x27,0x2d,0x36,0x20,0x2e,0x4a,0x39,0x28,0x1b,0x0c,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x41,0x38,0x14,0x29,0x2b,0x31,0x1d,0x27,0x45,0x33,0x1e,0x41,0x4d,0x20,0x49,0x47,0x41,0x32,0x1d,0x00,0xff,0xff,0xff,0xa2,0x00,0x26,0x02,0xd4,0x06,0xbf, +0x02,0x26,0x0f,0x65,0x00,0x00,0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0x00,0x26,0x02,0xd4,0x07,0x78,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff,0x00,0x72,0xfd,0xfe,0x02,0xd4,0x05,0x58,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06, +0x09,0x7f,0x72,0x00,0x00,0x01,0x00,0x72,0x00,0x26,0x02,0xd4,0x05,0x58,0x00,0x03,0x00,0x0c,0xb4,0x02,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x25,0x01,0x33,0x01,0x02,0x32,0xfe,0x40,0xa6,0x01,0xbc,0x26,0x05,0x32,0xfa,0xce,0xff,0xff,0xff,0x97,0x00,0x26,0x02,0xd4,0x07,0x77,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06, +0x0f,0x58,0x00,0x8f,0xff,0xff,0xff,0xc2,0x00,0x26,0x02,0xd4,0x07,0x77,0x02,0x26,0x0f,0x65,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x01,0x20,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x34,0xfd,0xfe,0x02,0xd4,0x05,0x58,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff, +0x00,0x3a,0x00,0x26,0x02,0xf8,0x05,0xe9,0x02,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x17,0x00,0x26,0x03,0x7f,0x06,0xf6,0x00,0x27,0x0f,0x65,0x00,0xab,0x00,0x00,0x01,0x06,0x0f,0x5e,0x00,0x88,0x00,0x0a,0xb4,0x01,0x2f,0x04,0x01,0x04,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x16,0x00,0x26, +0x03,0x7f,0x06,0xf6,0x00,0x27,0x0f,0x65,0x00,0xab,0x00,0x00,0x01,0x06,0x0f,0x5f,0x00,0x88,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0x00,0x01,0xff,0xc8,0xff,0xf2,0x05,0x49,0x03,0x0f,0x00,0x37,0x00,0x4b,0xb9,0x00,0x1a,0x05,0x0a,0xb2,0x17,0x23,0x0d,0xbb,0x05,0x0a,0x00,0x0a,0x00,0x00,0x05,0x0a,0xb3,0x30, +0x30,0x30,0x33,0xb8,0x04,0xff,0xb6,0x2f,0x34,0x01,0x34,0x23,0x12,0x05,0xbc,0x04,0xfb,0x00,0x28,0x05,0x03,0x00,0x1f,0x05,0x03,0xb4,0x18,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xc6,0x3f,0x3f,0xed,0x32,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xed,0xd4,0xed,0x39,0xd4,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35, +0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x35,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x01,0x47,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x39,0x5d,0x77,0x3f,0x5b,0x84,0x24, +0x04,0x1a,0x42,0x47,0x48,0x21,0x46,0x65,0x47,0x2c,0x18,0x09,0x3a,0x70,0x39,0x17,0x57,0xb6,0x5b,0x01,0x95,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x37,0x6c,0x85,0x4a,0x19,0x36,0x45,0x23,0x2f,0x1d,0x0c,0x21,0x37,0x48,0x4e,0x50,0x23,0x13,0x05,0x03,0x9c, +0x09,0x08,0x00,0x01,0xff,0xc8,0xff,0xf2,0x06,0x03,0x03,0x0f,0x00,0x44,0x00,0x5c,0xb1,0x35,0x2a,0xb8,0x05,0x0a,0xb2,0x27,0x40,0x1d,0x41,0x09,0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x00,0x08,0x00,0x3a,0x05,0x03,0x00,0x30,0x05,0x03,0xb7,0x28,0x2f,0x1b,0x01,0x1b,0x08,0x08,0x0b,0xb8,0x04,0xff,0x40,0x0b,0x2f,0x0c,0x01,0x0c, +0x40,0x35,0x00,0x2f,0x22,0x22,0x15,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x11,0x39,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x2f,0x5d,0xc6,0x3f,0x3f,0x01,0x2f,0xed,0xd4,0xed,0x39,0xd4,0xed,0x39,0x31,0x30,0x05,0x22,0x2e,0x04,0x35,0x35,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e, +0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x01,0xea,0x46,0x65,0x47,0x2c,0x18,0x09,0x3a,0x70,0x39,0x17,0x57,0xb6,0x5b,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x3e, +0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x0e,0x21,0x37,0x48,0x4e,0x50,0x23,0x13,0x05,0x03,0x9c,0x09,0x08,0x64,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc, +0xfe,0x8f,0x43,0x62,0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x00,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07, +0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x05,0x49,0x04,0x07,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0x03,0x04,0x07,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf9,0x03,0x57,0x00,0x07, +0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x05,0x49,0x03,0x0f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x06,0x03,0x03,0x0f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x05,0x49,0x05,0x1f, +0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0xf9,0xfd,0xce,0x00,0x07,0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x05,0x49,0x05,0x1f, +0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f, +0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0xf9,0x03,0x57,0xff,0xff, +0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x07,0x0d,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x51,0x01,0xf9,0x03,0x57,0x01,0x07,0x0f,0x57,0x01,0xf9,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x3d,0x01,0x3d,0x00, +0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x07,0x0d,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x57,0x01,0xf9,0x04,0xab,0x01,0x07,0x0f,0x51,0x01,0xf9,0x03,0x57,0x00,0x0c,0xb5,0x04,0x03,0x20,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x50,0x02,0x26,0x0f,0x6c, +0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xf2,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x54,0x01,0x54,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x50,0x02,0x26,0x0f,0x6d,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xf2,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x54,0x01,0x54,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2, +0x05,0x49,0x04,0xb8,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0xf9,0xfc,0xdc,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x04,0xb8,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0xf9,0xfc,0xdc,0x00,0x02,0xff,0xc8,0xff,0xea,0x06,0xa0,0x03,0x3c,0x00,0x30,0x00,0x42,0x00,0x44,0xb9,0x00,0x0c,0x05,0x0a,0xb7, +0x36,0x36,0x44,0x40,0x00,0x20,0x20,0x23,0xb8,0x04,0xff,0x40,0x09,0x2f,0x24,0x01,0x24,0x40,0x40,0x31,0x31,0x00,0xbc,0x04,0xfb,0x00,0x13,0x05,0x03,0x00,0x3b,0x04,0xfb,0xb3,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xcd,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x3e, +0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x2e,0x03,0x27,0x26,0x26,0x27,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x01,0xd4,0x18,0x4c,0x67,0x81,0x9a,0xb3,0x66,0x79,0xae,0x70,0x36,0x2d,0x52,0x71, +0x88,0x9a,0x52,0xb3,0xff,0x00,0xaf,0x68,0x1c,0x2e,0x3b,0x24,0x13,0x07,0x05,0x04,0x04,0x3c,0x68,0x36,0x17,0x42,0xae,0x5b,0x06,0x09,0x07,0x06,0x04,0x03,0x0d,0x1e,0x33,0x02,0xa7,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x9b,0x41,0x96,0x95,0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55, +0x2f,0x16,0x05,0x01,0x06,0x0d,0x0c,0x14,0x35,0x3f,0x47,0x27,0x1a,0x31,0x1c,0x03,0x04,0x9c,0x06,0x07,0x21,0x3a,0x37,0x37,0x1e,0x1a,0x2c,0x20,0x13,0x0a,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0x02,0xff,0xc8,0xff,0xea,0x07,0x59,0x03,0x3c,0x00,0x39,0x00,0x4b,0x00,0x50,0xb9,0x00,0x05,0x05, +0x0a,0x40,0x09,0x47,0x47,0x0b,0x3f,0x33,0x0b,0x22,0x22,0x25,0xb8,0x04,0xff,0xb4,0x2f,0x26,0x01,0x26,0x15,0xb8,0x05,0x03,0xb6,0x42,0x3f,0x3f,0x33,0x33,0x10,0x0a,0xbc,0x04,0xfb,0x00,0x0b,0x05,0x03,0x00,0x3a,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x2f,0x33,0x3f,0x2f,0x5d,0xed, +0x32,0x2f,0x01,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x2e,0x03,0x27,0x26,0x26,0x27,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x17,0x3e,0x05,0x17,0x22,0x0e,0x02,0x07,0x16,0x16,0x33,0x32, +0x3e,0x02,0x35,0x34,0x2e,0x02,0x04,0xd3,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54,0xb3,0xff,0x00,0xaf,0x68,0x1c,0x2e,0x3b,0x24,0x13,0x07,0x05,0x04,0x04,0x3c,0x68,0x36,0x17,0x42,0xae,0x5b,0x06,0x09,0x07,0x06,0x04,0x03,0x0d,0x1e,0x33,0x29,0x18,0x4c,0x67,0x81,0x9a, +0xb3,0x4c,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x9d,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x03,0x3c,0x49,0x7d,0xa4,0x5b,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x01,0x06,0x0d,0x0c,0x14,0x35,0x3f,0x47,0x27,0x1a,0x31,0x1c,0x03,0x04,0x9c,0x06,0x07,0x21,0x3a,0x37,0x37,0x1e,0x1a,0x2c,0x20,0x13,0x02,0x41,0x96,0x95, +0x8b,0x6a,0x40,0xa9,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0xff,0xff,0xff,0xc8,0xff,0xea,0x06,0xa0,0x04,0xb2,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xff,0xea,0x07,0x59,0x04,0xb2,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73, +0x04,0x02,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0xa0,0x03,0x3c,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xdb,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x07,0x59,0x03,0x3c,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xdb,0xfe,0xab,0xff,0xff,0xff,0xc8,0xff,0xea,0x06,0xa0,0x05,0xca,0x02,0x26,0x0f,0x82, +0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0xa0,0x04,0xb2,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x73,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xe5, +0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x07,0x59,0x04,0xb2,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x73,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xe5,0xfe,0xab,0x00,0x01,0xfd,0xa6,0xff,0xea,0x01,0x47,0x05,0xec,0x00,0x15,0x00,0x1a,0xbf,0x00,0x0b,0x05,0x0a,0x00,0x08,0x00,0x03,0x04,0xfb,0x00,0x12,0x05,0x03,0x00, +0x0a,0x00,0x2f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0xfd,0xa6,0x7f,0xe1,0x6d,0x4f,0x75,0x4e,0x26,0x9c,0x23,0x3f,0x5a,0x6e,0x81,0x46,0x61,0xcb,0x64,0xa8,0x0f,0x09,0x06,0x25,0x4f,0x49,0x04,0x99,0xfb,0x60,0x56,0x77,0x4f,0x2c,0x15,0x05, +0x0a,0x0e,0x00,0x01,0xfd,0xa6,0xff,0xea,0x02,0x01,0x05,0xec,0x00,0x1e,0x00,0x29,0xb1,0x16,0x0b,0xb8,0x05,0x0a,0xb5,0x08,0x16,0x1b,0x10,0x10,0x03,0xbd,0x04,0xfb,0x00,0x1b,0x05,0x03,0x00,0x11,0x05,0x03,0x00,0x0a,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x25,0x16,0x16,0x33,0x32,0x3e,0x02, +0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0xfd,0xa6,0x7f,0xe1,0x6d,0x4f,0x75,0x4e,0x26,0x9c,0x0f,0x2a,0x48,0x39,0x16,0x5a,0x6d,0x1e,0x04,0x1d,0x56,0x6d,0x82,0x4a,0x61,0xcb,0x64,0xa8,0x0f,0x09,0x06,0x25,0x4f,0x49,0x04,0x99,0xfb,0xac,0x47,0x62,0x3c,0x1a,0xa7,0x3b, +0x3c,0x2d,0x33,0x19,0x06,0x0a,0x0e,0x00,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x1a,0x08,0x0e,0x02,0x26,0x0f,0x8c,0x00,0x00,0x00,0x06,0x0a,0x6d,0xf2,0x32,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x1a,0x08,0x0e,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x06,0x0a,0x6d,0xf2,0x32,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0x4f,0x07,0x67,0x02,0x26, +0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x50,0xff,0xf2,0x06,0xb7,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x01,0x07,0x67,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x50,0xff,0xf2,0x06,0xb7,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0xf0,0x08,0x7f,0x02,0x26,0x0f,0x8c,0x00,0x00,0x01,0x07,0x0f,0x53,0xff,0xf2,0x06,0xb7,0x00,0x0e,0xb6,0x03, +0x02,0x01,0x20,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x01,0x08,0x7f,0x02,0x26,0x0f,0x8d,0x00,0x00,0x01,0x07,0x0f,0x53,0xff,0xf2,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x29,0x01,0x29,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xfd,0xa6,0xfd,0xc9,0x01,0xf0,0x05,0xec,0x02,0x26, +0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x54,0xff,0xf2,0xfd,0xce,0xff,0xff,0xfd,0xa6,0xfd,0xc9,0x02,0x01,0x05,0xec,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x54,0xff,0xf2,0xfd,0xce,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0xfb,0x05,0xec,0x02,0x26,0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x5c,0xff,0x6d,0x00,0x00,0xff,0xff,0xfd,0xa6, +0xff,0xea,0x02,0x01,0x05,0xec,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x5c,0xff,0x6d,0x00,0x00,0x00,0x01,0x00,0x39,0xfd,0xff,0x03,0x72,0x02,0x0a,0x00,0x22,0x00,0x2c,0xbc,0x00,0x0b,0x05,0x0a,0x00,0x1b,0x00,0x16,0x04,0xfb,0x40,0x09,0x1f,0x10,0x2f,0x10,0x02,0x10,0x08,0x08,0x06,0xb8,0x04,0xff,0xb3,0x2f,0x00,0x01,0x00, +0x00,0x2f,0x5d,0xed,0x32,0x2f,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x3e,0x03,0x03,0x35,0x1d,0x20,0x28,0x2c,0x3c,0x30,0x11,0x14,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0x7c,0x59, +0x55,0x74,0x45,0x1e,0x2d,0x20,0x2a,0x5b,0x57,0x4e,0x02,0x0a,0x2f,0x1d,0x1e,0x32,0x03,0x52,0x9c,0x46,0x8a,0xd4,0x90,0x4a,0x16,0x17,0xa5,0x27,0x3d,0x6c,0x92,0x56,0x76,0xda,0x67,0x06,0x09,0x06,0x03,0x00,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0c,0x03,0x57, +0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0xb9,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xaf,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0a,0x6d,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00, +0x00,0x07,0x0f,0x5b,0x01,0xc9,0x00,0x00,0xff,0xff,0x00,0x39,0xfd,0xfb,0x03,0x88,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x2b,0xfe,0x00,0xff,0xff,0x00,0x39,0xfd,0xe1,0x04,0x6a,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x42,0xf7,0x65,0x00,0x0a,0xb4,0x01,0x2f,0x27,0x01,0x27, +0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x39,0xfd,0xfb,0x03,0x88,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x2b,0xfe,0x00,0x00,0x07,0x0f,0x50,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39, +0xfd,0xff,0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xaf,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x87,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x5c, +0x00,0xf9,0xfc,0x4f,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xbc,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x07,0x0d,0x02,0x26, +0x0f,0x98,0x00,0x00,0x00,0x27,0x0f,0x51,0x01,0x0c,0x03,0x57,0x01,0x07,0x0f,0x57,0x01,0x0c,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x82,0xff,0x02,0x05,0x74,0x04,0x21,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x39,0xfc,0x38,0x00,0x0a,0xb4,0x01,0x2f,0x4d, +0x01,0x4d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0x2c,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x01,0xfc,0x50,0x00,0x0a,0xb4,0x01,0x2f,0x3d,0x01,0x3d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x03,0xb9,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xdc, +0x03,0x09,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xd1,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xdc,0x03,0x09,0x00,0x01,0x00,0x9a,0xff,0x02,0x05,0x74,0x02,0x0a,0x00,0x36,0x00,0x41,0xb9,0x00,0x0a,0x05,0x0a,0xb2,0x25,0x25,0x05,0xb8,0x05,0x0a,0xb3,0x2c,0x2c,0x38,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x00, +0x04,0xff,0xb4,0x2f,0x31,0x01,0x31,0x11,0xb8,0x04,0xfb,0xb7,0x2f,0x22,0x01,0x22,0x2f,0x1a,0x01,0x1a,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06, +0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x20,0x3b,0x43,0x21,0x08,0x22,0x29,0x22,0x2e,0x51,0x6e,0x7d,0x88,0x43,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x20,0x5b,0xa2,0x83,0xbc,0xb9,0x10,0x18,0x1b,0x18,0x10,0x29,0x54,0x81,0x58,0x1d,0x20,0x28,0x01, +0x6e,0x13,0x1b,0x1e,0x0b,0x22,0x2a,0x2c,0x3b,0x33,0x39,0x5a,0x43,0x2f,0x1d,0x0d,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6e,0x40,0x4a,0x7c,0x5b,0x33,0x48,0x3d,0x13,0x1d,0x1b,0x1e,0x26,0x33,0x23,0x37,0x5b,0x40,0x23,0x2f,0x1d,0x1e,0x32,0x00,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x05,0x74,0x02,0x0a,0x02,0x26,0x0f,0xab,0x00,0x00, +0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0xdd,0x05,0x3e,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x09,0x7e,0x04,0x3b,0xfd,0x55,0x00,0x01,0x00,0x1e,0xff,0x02,0x06,0x1f,0x02,0x0a,0x00,0x38,0x00,0x58,0xb9,0x00,0x1d,0x05,0x0a,0xb5,0x2d,0x2d,0x16,0x0b,0x05,0x32,0xb8,0x05,0x0a,0xb3,0x16,0x16, +0x3a,0x0e,0xb8,0x05,0x0a,0x40,0x0d,0x05,0x08,0x08,0x05,0x09,0x0a,0x0a,0x0b,0x0b,0x22,0x08,0x08,0x28,0xb8,0x04,0xff,0xb4,0x2f,0x22,0x01,0x22,0x00,0xb8,0x04,0xfb,0xb3,0x2f,0x13,0x01,0x13,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x11,0x39, +0x11,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x03,0x5c,0x98,0xcc,0x7d,0x35,0x04,0x04,0xfe,0xd0,0x01,0xe3, +0x0e,0x12,0x24,0x5d,0xa2,0x7e,0xbc,0xb9,0x10,0x18,0x1b,0x18,0x10,0x29,0x54,0x81,0x58,0x1d,0x20,0x28,0x2c,0x3b,0x43,0x21,0x08,0x22,0x29,0x22,0x2e,0x51,0x6e,0x7d,0x88,0xfe,0x4b,0x81,0xad,0x63,0x1f,0x49,0x23,0x39,0x72,0x5f,0x49,0x79,0x3f,0x4d,0x7d,0x5a,0x31,0x48,0x3d,0x13,0x1d,0x1b,0x1e,0x26,0x33,0x23,0x37,0x5b,0x40,0x23, +0x2f,0x1d,0x1e,0x32,0x13,0x1b,0x1e,0x0b,0x22,0x2a,0x2c,0x3b,0x33,0x39,0x5a,0x43,0x2f,0x1d,0x0d,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0x2c,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfc,0x50,0xff,0xff,0x00,0x9a,0xfd,0xc4,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00,0x00,0x07,0x0f,0x54, +0x01,0xc8,0xfd,0xc9,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xdf,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x37,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xdf,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0f,0x5f, +0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x37,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xc8,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x9a,0xff,0xd2,0x05,0x74, +0x02,0xbd,0x00,0x32,0x00,0x41,0xb9,0x00,0x0a,0x05,0x0a,0xb2,0x25,0x25,0x05,0xb8,0x05,0x0a,0xb3,0x2a,0x2a,0x34,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x00,0x04,0xff,0xb4,0x2f,0x2d,0x01,0x2d,0x11,0xb8,0x04,0xfb,0xb7,0x2f,0x22,0x01,0x22,0x2f,0x1a,0x01,0x1a,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39, +0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x20,0x38,0x40,0x1f,0x07,0x0c,0x0f,0x0d,0x29,0x47,0x60,0x70,0x7b, +0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x20,0x5b,0xa2,0x83,0xa9,0x96,0x0e,0x12,0x0e,0xae,0xa1,0x1d,0x20,0x28,0x01,0x6e,0x0a,0x10,0x12,0x07,0x0c,0x15,0x19,0x20,0x17,0x2d,0x48,0x37,0x27,0x19,0x0c,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6e,0x40,0x4a,0x7c,0x5b,0x33,0x30,0x29,0x0e,0x1a,0x1c,0x21,0x17,0x59,0x61, +0x2f,0x1d,0x1e,0x32,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32, +0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x21,0x04,0xad,0xfd,0xf2,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27,0x02,0x09,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10, +0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f, +0xed,0x31,0x30,0x05,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x21,0x06,0xae,0xfb,0xf1,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27, +0x04,0x0a,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x3d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5, +0x03,0x3d,0x02,0x26,0x0f,0xb6,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26, +0x0f,0xb6,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72, +0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb6,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x02,0x0a,0x02,0x06,0x0f,0xab,0x00,0x00,0xff,0xff,0x00,0x9a,0xfd,0xc4,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00, +0x00,0x07,0x0f,0x52,0x01,0xc8,0xfd,0xc9,0xff,0xff,0x00,0x9a,0xfe,0x0e,0x05,0x74,0x02,0x0a,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x0f,0x00,0x01,0xff,0xf1,0xff,0xf2,0x01,0x47,0x05,0x7e,0x00,0x0d,0x00,0x1a,0xbf,0x00,0x08,0x05,0x0a,0x00,0x05,0x00,0x00,0x04,0xfb,0x00,0x0d,0x05,0x03,0x00,0x07,0x00, +0x2f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x27,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x09,0x25,0x42,0x31,0x1c,0x9c,0x3c,0x61,0x7b,0x3e,0x99,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfb,0xce,0x65,0x86,0x4f,0x20,0x00,0x00,0x01,0xff,0xea,0xff,0xf2,0x02,0x24,0x04,0xe8,0x00,0x1c,0x00,0x22,0xb9,0x00,0x00,0x05,0x0a,0xb5, +0x1a,0x10,0x0d,0x1c,0x15,0x05,0xbb,0x04,0xfb,0x00,0x14,0x00,0x0d,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x2f,0x12,0x39,0x01,0x2f,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x47,0x0c,0x26,0x46,0x39,0x16,0x16,0x06,0x0d, +0x13,0x0c,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x0a,0x1c,0x41,0x36,0x24,0x9c,0x01,0x8c,0x3b,0x5a,0x3e,0x20,0x31,0x1f,0x10,0x1f,0x19,0x0f,0x40,0x3b,0x3f,0x3c,0xa7,0x13,0x2c,0x47,0x34,0x03,0x95,0x00,0x02,0x00,0xa1,0xff,0xf2,0x04,0x25,0x03,0xd7,0x00,0x21,0x00,0x2f,0x00,0x48,0xb9,0x00,0x15,0x05,0x0a,0xb5,0x12,0x05,0x2a,0x2a, +0x31,0x22,0xbb,0x05,0x0a,0x00,0x0d,0x00,0x2b,0x04,0xfc,0xb2,0x12,0x14,0x2a,0xb8,0x04,0xfc,0x40,0x0a,0x15,0x14,0x05,0x05,0x00,0x2f,0x14,0x01,0x14,0x1a,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xdd,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x31,0x30,0x05,0x22, +0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x03,0xec,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x17,0x18,0x07, +0x0e,0x16,0xfd,0x3d,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x0e,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x31,0x1e,0x10,0x20,0x19,0x0f,0x01,0xea,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0xff,0xff,0x00,0x39,0xfd,0xff, +0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0c,0x03,0x57,0x00,0x01,0x00,0x64,0x00,0x00,0x04,0x77,0x05,0xb2,0x00,0x23,0x00,0x65,0x40,0x38,0x82,0x16,0x01,0x76,0x0a,0x01,0x63,0x09,0x01,0x6a,0x07,0x7a,0x07,0x02,0x1a,0x1d,0x1f,0x18,0x1b,0x7e,0x01,0x00,0x03,0x22,0x05,0x01,0x01,0x25,0x0e,0x0c, +0x7e,0x0f,0x11,0x0e,0x0f,0x1f,0x22,0x91,0x01,0x1c,0x02,0x05,0x18,0x91,0x1b,0x02,0x0f,0x02,0x0f,0x02,0x20,0x12,0x08,0x91,0x15,0x04,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x10,0xc4,0xfd,0xc4,0x10,0xdd,0xc4,0xfd,0xc4,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xc4,0xc4,0xde,0xc4,0x10,0xfd,0xc4,0xc4,0xde,0xc4,0x31, +0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x33,0x35,0x23,0x35,0x33,0x35,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x02,0x52,0xbe,0xbe,0xbe,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0xbf,0xbf,0xbf,0xbf,0xa8, +0xbe,0x02,0x33,0x6e,0x84,0xbb,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xc1,0x84,0x6e,0x84,0xfe,0x51,0x01,0xaf,0x00,0x00,0x01,0x00,0x65,0xff,0xe8,0x04,0xb6,0x05,0xb2,0x00,0x31,0x00,0xed,0x40,0xa0,0x6a,0x31,0x7a,0x31,0x8a,0x31,0x03,0x7a,0x30,0x01,0x68,0x30,0x01,0x08,0x2c,0x01,0x8c,0x2b, +0x01,0x6b,0x2b,0x7b,0x2b,0x02,0x56,0x24,0x01,0x56,0x23,0x01,0x37,0x23,0x01,0x57,0x20,0x01,0x88,0x19,0x01,0x49,0x19,0x01,0x8b,0x18,0x01,0x4a,0x18,0x01,0x86,0x17,0x01,0x77,0x17,0x01,0x83,0x16,0x93,0x16,0x02,0x61,0x16,0x71,0x16,0x02,0x07,0x16,0x01,0x85,0x13,0x95,0x13,0x02,0x76,0x13,0x01,0x07,0x13,0x01,0x95,0x12,0x01,0x86, +0x12,0x01,0x65,0x12,0x75,0x12,0x02,0x76,0x01,0x01,0x65,0x01,0x01,0x28,0x2a,0x7d,0x27,0x25,0x25,0x08,0x1b,0x1f,0x17,0x7d,0x04,0x00,0x00,0x08,0x01,0x08,0x08,0x33,0x1f,0x7d,0x00,0x0e,0x0c,0x7d,0x0f,0x11,0x11,0x0f,0x00,0x01,0x00,0x00,0x28,0x10,0x28,0x02,0x28,0x28,0x1b,0x21,0x0f,0x0f,0x04,0x0a,0x25,0x04,0x01,0x04,0x15,0x21, +0x91,0x3a,0x1b,0x01,0x29,0x1b,0x01,0x1b,0x2e,0x13,0x0a,0x91,0x15,0x04,0x00,0x3f,0xed,0x3f,0x39,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x5d,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0xed,0x11,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x21,0x20,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x10,0x21,0x32,0x37,0x36,0x35,0x34, +0x27,0x33,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x65,0xa9,0x73,0xee,0xaa,0x48,0x80,0xfe,0xb8,0xfe,0xbe,0x08,0xae,0x0a,0xa1,0x84,0xcb,0x01,0xfa,0xaf,0x70,0xf5,0xa5,0x49,0x7a,0x01,0x71,0x9c,0x62,0x81,0x12,0xb4,0x0f,0xb3,0x93,0xe8,0xec,0x8c,0xab,0x01,0x85,0xcc,0x6b,0x48,0x2b,0x1e,0x26,0x42,0x85,0xe0,0xd2,0x2b,0x45, +0x4b,0x25,0xbd,0x5f,0x4e,0xfe,0x88,0xcc,0x68,0x43,0x2e,0x1f,0x28,0x44,0x85,0xfe,0xfa,0x32,0x42,0x8e,0x42,0x43,0x40,0x43,0xd9,0x6b,0x57,0x56,0x6a,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x09,0x00,0x95,0x40,0x0d,0x7c,0x06,0x01,0x74,0x01,0x01,0x01,0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xe0,0x40,0x29, +0x0b,0x0d,0x01,0x4c,0x15,0x00,0x25,0x00,0x02,0x03,0x00,0x01,0xe3,0x00,0xf3,0x00,0x02,0x1a,0x05,0x2a,0x05,0x02,0x0c,0x05,0x01,0xec,0x05,0xfc,0x05,0x02,0x05,0x01,0x91,0x04,0x12,0x00,0x07,0x91,0x08,0x03,0x06,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01, +0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x5d,0x71,0x71,0x5d,0x71,0x71,0x01,0x2b,0x2b,0x5d, +0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xb8,0x03,0x34,0xfb,0xd1,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x26,0x98,0x2f,0x04,0xd3,0x98,0x00,0x01,0x00,0x5f,0xff,0xe8,0x03,0xf0,0x06,0x02,0x00,0x2f,0x00,0xc5,0x40,0x82,0x7a,0x2f,0x01,0x79,0x2e,0x01,0x08,0x2e,0x18,0x2e,0x02,0x86,0x27,0x01, +0x24,0x27,0x01,0x26,0x26,0x46,0x26,0x02,0x85,0x23,0x01,0x56,0x23,0x01,0x79,0x21,0x01,0x79,0x1e,0x01,0x87,0x1a,0x97,0x1a,0x02,0x96,0x19,0x01,0x85,0x19,0x01,0x07,0x19,0x01,0x95,0x15,0x01,0x06,0x15,0x86,0x15,0x02,0x86,0x14,0x01,0x79,0x12,0x01,0x3b,0x12,0x01,0x38,0x11,0x01,0x9a,0x0e,0x01,0x65,0x0b,0x01,0x57,0x0b,0x01,0x57, +0x07,0x67,0x07,0x02,0x25,0x22,0x28,0x83,0x10,0x0d,0x0d,0x13,0x31,0x1b,0x84,0x1c,0x22,0x83,0x13,0x05,0x84,0x00,0x00,0x13,0x03,0x02,0x02,0x09,0x10,0x98,0x10,0x01,0x6a,0x10,0x01,0x10,0x20,0x2c,0x1b,0x1b,0x25,0x20,0x25,0x17,0x09,0x95,0x2c,0x16,0x20,0x95,0x17,0x01,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11, +0x12,0x39,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x2f,0xed,0x11,0x12,0x39,0x2f,0x39,0xed,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32, +0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x23,0x34,0x27,0x26,0x23,0x20,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x5f,0x28,0x9a,0x1c,0x55,0x4e,0x68,0x88,0x55,0x5b,0xbc,0xae,0xae,0xbc,0x7c,0x77,0xba,0xab,0x73,0x7f,0xa6,0x4b,0x44,0x68,0xfe,0xfb,0xbc, +0xae,0xae,0xbc,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x01,0x5c,0x5e,0x51,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x50,0x95,0xaa,0x57,0x4b,0x4b,0x72,0xe5,0xae,0x63,0x60,0x57,0x61,0xa8,0x68,0x39,0x34,0xfb,0x8a,0x58,0x4e,0x4d,0x76,0xd7,0xdc,0x7b,0x73,0x61,0x6a,0x00,0x00,0x02,0x00,0x0a,0xff,0xe8,0x04,0x52,0x04,0x54,0x00,0x35,0x00,0x49, +0x00,0x8c,0x40,0x5b,0x49,0x47,0x59,0x47,0x69,0x47,0x03,0x65,0x43,0x01,0x46,0x43,0x56,0x43,0x02,0x64,0x3d,0x01,0x9c,0x09,0x01,0x7a,0x08,0x01,0x8f,0x0a,0x9f,0x0a,0x02,0x7e,0x0a,0x01,0x6f,0x0a,0x01,0x87,0x3b,0x01,0x92,0x2c,0x01,0x81,0x2c,0x01,0x63,0x2c,0x73,0x2c,0x02,0x2c,0x1b,0x3b,0x0a,0x04,0x05,0x24,0x24,0x31,0x83,0x30, +0x36,0x01,0x36,0x36,0x4b,0x40,0x83,0x05,0x12,0x12,0x05,0x13,0x18,0x95,0x12,0x0a,0x0d,0x0d,0x3b,0x2c,0x24,0x29,0x95,0x23,0x1b,0x1e,0x10,0x45,0x95,0x00,0x16,0x00,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x32,0x32,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x17,0x39,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x13, +0x34,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x4c,0x6c,0xad,0x7b,0x42,0x22,0x4f,0x81,0x5f,0x30,0x69,0x3b,0x33,0x55,0x1f,0x24,0x1e,0x1b,0x22,0x1d,0x51,0x33,0x89,0xda,0x57,0x34,0x72,0x40,0x30,0x4b,0x1a,0x1f,0x16,0x1a,0x21,0x1c,0x4e,0x30,0x0c,0x16,0x0b,0x39,0x50,0x32,0x17,0x42,0x7b,0xad,0xc2, +0x1d,0x3d,0x5d,0x3f,0x59,0x86,0x5a,0x2d,0x26,0x4b,0x72,0x4b,0x4b,0x72,0x4b,0x26,0x18,0x40,0x7a,0xae,0x6e,0x33,0x84,0x89,0x81,0x30,0x0d,0x0e,0x09,0x05,0x06,0x07,0x97,0x03,0x04,0x02,0x05,0x31,0x2a,0x0b,0x0b,0x03,0x02,0x03,0x02,0x92,0x05,0x04,0x03,0x06,0x01,0x01,0x35,0x77,0x77,0x72,0x30,0x6e,0xae,0x7a,0x40,0x01,0xd6,0x32, +0x70,0x6e,0x66,0x29,0x1e,0x61,0x72,0x78,0x36,0x4c,0x7b,0x56,0x2f,0x2f,0x56,0x7b,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x83,0x40,0x1f,0x19,0x40,0x0b,0x02,0x4d,0x12,0x95,0x00,0x16,0x0c,0x95,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83, +0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x20,0x15,0x30,0x15,0x02,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b, +0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1, +0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x01,0xff,0xe6,0xfe,0x1e,0x04,0x10,0x04,0x18,0x00,0x3f,0x00,0x91,0x40,0x58,0x75,0x35,0x85,0x35,0x02,0x09,0x2d,0x01, +0x05,0x28,0x15,0x28,0x02,0x6a,0x1d,0x01,0x99,0x0a,0x01,0x99,0x05,0x01,0x00,0x02,0x83,0x3f,0x3d,0x3d,0x17,0x30,0x2f,0x33,0x2a,0x83,0x11,0x12,0x0c,0x17,0x17,0x41,0x33,0x83,0x0c,0x1f,0x84,0x20,0x20,0x0c,0x3f,0x00,0x00,0x30,0x38,0x09,0x2f,0x49,0x2f,0x59,0x2f,0x03,0x7a,0x30,0x01,0x28,0x30,0x01,0x2f,0x30,0x07,0x20,0x20,0x12, +0x1a,0x95,0x16,0x12,0x01,0x35,0x11,0x01,0x12,0x11,0x25,0x10,0x38,0x95,0x07,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x39,0x5d,0x5d,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30, +0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x25,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x05,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x03,0x70,0x0d,0x53,0x8c, +0xb9,0x66,0x51,0x94,0x71,0x43,0x25,0x45,0x64,0x3f,0x01,0x7d,0x43,0x5c,0x3a,0x1a,0x6c,0x6d,0x32,0x5c,0x4e,0x3a,0x0f,0xa6,0x12,0x5b,0x80,0x9d,0x54,0x4b,0x87,0x65,0x3c,0x27,0x46,0x63,0x3d,0xfe,0x85,0x80,0x79,0x28,0x45,0x5e,0x36,0x3d,0x75,0x5b,0x37,0x09,0x41,0x2a,0x30,0x66,0xa9,0x78,0x42,0x32,0x5b,0x83,0x51,0x45,0x80,0x6d, +0x56,0x1a,0x9b,0x1b,0x3e,0x49,0x54,0x31,0x4d,0x5d,0x1b,0x36,0x50,0x34,0x56,0x84,0x59,0x2d,0x23,0x49,0x6e,0x4b,0x43,0x7a,0x68,0x54,0x1e,0x96,0x33,0x9c,0x70,0x35,0x53,0x39,0x1e,0x2c,0x4e,0x6c,0x41,0x20,0x1b,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x04,0x55,0x04,0x00,0x00,0x09,0x00,0x41,0x40,0x22,0x06,0x01,0x00,0x01,0x84,0x05, +0x06,0x14,0x05,0x05,0x06,0x09,0x00,0x00,0x02,0x03,0x03,0x05,0x0b,0x08,0x07,0x07,0x04,0x05,0x06,0x95,0x00,0x08,0x0f,0x05,0x01,0x95,0x03,0x15,0x00,0x3f,0xed,0x33,0x3f,0x33,0xed,0x01,0x2f,0x33,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x33,0x2f,0x33,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x31,0x30,0x01,0x01,0x21,0x07,0x21,0x37,0x01, +0x21,0x37,0x21,0x04,0x4b,0xfd,0x04,0x02,0x44,0x1d,0xfc,0xb7,0x0a,0x02,0xfb,0xfd,0xef,0x1e,0x03,0x16,0x03,0xd1,0xfc,0xbb,0x8c,0x33,0x03,0x41,0x8c,0x00,0x00,0x02,0x00,0x72,0xff,0xe8,0x03,0xde,0x05,0xb2,0x00,0x0d,0x00,0x18,0x00,0x20,0x40,0x10,0x0a,0x89,0x11,0x11,0x1a,0x16,0x89,0x04,0x13,0x9a,0x07,0x07,0x0e,0x9a,0x00,0x19, +0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x12,0x11,0x14,0x02,0x06,0x27,0x32,0x12,0x11,0x10,0x21,0x22,0x02,0x11,0x10,0x12,0x02,0x22,0x80,0xc6,0x6a,0xef,0xda,0xcb,0xd8,0x6e,0xc9,0x84,0x82,0x91,0xfe,0xff,0x8b,0x90,0x8e,0x18,0xb6,0x01,0x4d,0xdd,0x01, +0x64,0x01,0x86,0xfe,0x89,0xfe,0x9e,0xe4,0xfe,0xa9,0xb6,0x8a,0x01,0x3b,0x01,0x36,0x02,0x45,0xfe,0xd9,0xfe,0xd8,0xfe,0xdd,0xfe,0xbc,0x00,0x01,0x00,0xa1,0x00,0x00,0x03,0xb2,0x05,0x9a,0x00,0x1f,0x00,0x29,0x40,0x0f,0x18,0x08,0x01,0x8a,0x0b,0x10,0x00,0x14,0x1d,0x1d,0x09,0x14,0x06,0x01,0x0e,0xb8,0x01,0x81,0xb1,0x09,0x18,0x00, +0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0xcd,0xfd,0xcd,0xc4,0x31,0x30,0x01,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x34,0x36,0x33,0x33,0x32,0x17,0x13,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x02,0x75,0xf4,0x1d,0x1f,0x1f,0x1d,0xfd,0x74,0x1f,0x1d,0x1d,0x1f,0xf4,0x29, +0x33,0x7f,0x24,0x0f,0xce,0x05,0x42,0x23,0x24,0x0f,0x04,0xe3,0xfb,0xc1,0x30,0x20,0x20,0x34,0x34,0x20,0x20,0x30,0x04,0xa5,0x2f,0x22,0x1c,0xfe,0x70,0x0c,0x0b,0x20,0x2f,0x1d,0x00,0x01,0x00,0xc2,0xff,0xe8,0x03,0x8a,0x05,0xb2,0x00,0x1b,0x00,0x27,0x40,0x13,0x00,0x8a,0x14,0x14,0x1d,0x13,0x05,0x8a,0x0b,0x04,0x9b,0x13,0x13,0x08, +0x18,0x0f,0x07,0x08,0x19,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x21,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x03,0x8a,0x1c,0x1d,0xfe,0x15,0x30,0x20,0x22,0x32,0x31,0x23,0x20, +0x30,0x01,0x80,0x31,0x23,0x20,0x30,0x03,0x54,0x22,0x32,0xfd,0x21,0x1e,0x1b,0x1c,0x1d,0x05,0x58,0x1d,0x1c,0x1b,0x1e,0xfe,0x2b,0x01,0xd5,0x1d,0x1c,0x1b,0x1e,0x00,0x00,0x01,0x01,0x1f,0x00,0x00,0x03,0x34,0x05,0xb2,0x00,0x19,0x00,0x26,0x40,0x0c,0x0f,0x07,0x01,0x8a,0x13,0x0a,0x0c,0x9b,0x11,0x11,0x17,0x09,0xb8,0x01,0x81,0xb3, +0x05,0x18,0x17,0x07,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0xcd,0x32,0x31,0x30,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x35,0x34,0x33,0x21,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x03,0x34,0x2c,0x1a,0xfe,0x77,0x46,0x46,0x01,0x2b,0xfe,0xcb,0x1f,0x1d,0x1d,0x1f,0x01,0x35, +0x30,0x20,0x22,0x32,0x05,0x79,0xfa,0xd9,0x1c,0x36,0x51,0x53,0x01,0x99,0x30,0x20,0x20,0x34,0x02,0x98,0x1e,0x1b,0x1c,0x00,0x00,0x01,0x00,0xf7,0x00,0x00,0x03,0x55,0x05,0xb2,0x00,0x1a,0x00,0x2b,0x40,0x0f,0x09,0x01,0x8a,0x14,0x14,0x1c,0x05,0x8a,0x0f,0x04,0x9b,0x13,0x13,0x18,0x05,0xb8,0x01,0x81,0xb3,0x0c,0x18,0x18,0x07,0x00, +0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xfd,0xc4,0x31,0x30,0x01,0x11,0x14,0x23,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x03,0x55,0x32,0xfe,0x78,0x01,0x74,0x1e,0x28,0x46,0xfe,0x2e,0x1e,0x28,0x1d,0x1f,0x01,0x7e,0x31,0x23, +0x20,0x30,0x05,0x79,0xfd,0x7a,0x54,0xfe,0x05,0x2a,0x23,0x57,0x39,0x30,0x02,0x86,0x20,0x34,0x02,0x36,0x1d,0x1c,0x1b,0x00,0x00,0x01,0x01,0x08,0xff,0xe8,0x03,0x47,0x05,0xb2,0x00,0x16,0x00,0x1e,0x40,0x0e,0x06,0x01,0x0a,0x8a,0x10,0x09,0x9b,0x01,0x01,0x0d,0x14,0x07,0x0d,0x19,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xfd, +0x32,0xc6,0x31,0x30,0x01,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x01,0xac,0x01,0x55,0x1e,0x28,0x28,0x1e,0xfe,0xab,0x30,0x20,0x22,0x32,0x31,0x23,0x20,0x30,0x05,0x79,0xfd,0xb3,0x2a,0x28,0x2b,0x27,0xfd,0x99,0x1e,0x1b,0x1c,0x1d,0x05,0x58,0x1d,0x1c,0x1b, +0x00,0x01,0x00,0xe1,0xff,0xe9,0x03,0x73,0x05,0xb2,0x00,0x17,0x00,0x23,0x40,0x11,0x01,0x8a,0x07,0x07,0x19,0x14,0x8a,0x0b,0x09,0x9b,0x14,0x14,0x10,0x04,0x19,0x10,0x07,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x22,0x26,0x35,0x11,0x34, +0x36,0x33,0x32,0x16,0x15,0x11,0x21,0x32,0x16,0x03,0x73,0x31,0x23,0x20,0x30,0xfe,0x66,0x22,0x32,0x30,0x20,0x22,0x32,0x01,0xb2,0x1d,0x1f,0x02,0xef,0xfd,0x33,0x1c,0x1d,0x1b,0x1e,0x02,0x7d,0x1c,0x1d,0x02,0xa1,0x1e,0x1b,0x1c,0x1d,0xfd,0xca,0x34,0x00,0x01,0x00,0xa1,0x00,0x00,0x03,0xaf,0x05,0xb2,0x00,0x16,0x00,0x21,0x40,0x0f, +0x0d,0x11,0x11,0x18,0x0c,0x8a,0x04,0x0c,0x0f,0x0f,0x01,0x08,0x07,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x01,0x06,0x01,0x68,0x73,0x25,0x2f,0x31,0x23,0x20,0x30,0x01, +0xd6,0x0d,0x20,0x24,0x43,0x06,0xfd,0xec,0x0e,0x1b,0x1b,0x05,0x43,0x1d,0x1c,0x1b,0x1e,0xfb,0x59,0x03,0x42,0x19,0x35,0x1f,0x0b,0x0c,0xfc,0x57,0x19,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x03,0xa7,0x05,0xb2,0x00,0x14,0x00,0x17,0x00,0x26,0x40,0x12,0x15,0x03,0x03,0x19,0x00,0x17,0x8a,0x0d,0x16,0x9b,0x17,0x00,0x00,0x0a,0x11,0x07, +0x0a,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x21,0x32,0x15,0x14,0x06,0x07,0x01,0x06,0x23,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x01,0x21,0x11,0x01,0x4d,0x02,0x1d,0x3d,0x16,0x16,0xfe,0x22,0x0e,0x1f,0x73,0x25,0x2f,0x31,0x23,0x20,0x30,0x01,0x83, +0xfe,0x7d,0x04,0x2a,0x3a,0x26,0x3a,0x27,0xfc,0xb0,0x19,0x1b,0x1b,0x05,0x43,0x1d,0x1c,0x1b,0x1e,0xfe,0x0d,0xfd,0x4d,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x03,0x94,0x05,0xb2,0x00,0x13,0x00,0x1f,0x00,0x33,0x40,0x1a,0x04,0x8a,0x09,0x00,0x8b,0x14,0x09,0x14,0x09,0x14,0x21,0x1a,0x8b,0x0e,0x1d,0x9b,0x03,0x0b,0x0b,0x11,0x07,0x19, +0x17,0x9b,0x11,0x07,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x94,0x9a,0x80,0x32, +0x20,0x20,0x32,0x82,0x98,0xca,0xa6,0xa6,0xc2,0x9a,0x6b,0x61,0x65,0x73,0x71,0x67,0x5c,0x70,0x04,0x6f,0x78,0xab,0x17,0xfc,0xec,0x1e,0x1b,0x1b,0x1e,0x03,0x15,0x19,0xaa,0x76,0x94,0xaf,0xad,0x8d,0x4f,0x57,0x57,0x4f,0x56,0x60,0x64,0x00,0x00,0x02,0x00,0x76,0x00,0xf7,0x03,0xb0,0x04,0x66,0x00,0x0b,0x00,0x1b,0x00,0x1f,0x40,0x0f, +0x10,0x8a,0x09,0x09,0x1d,0x03,0x8a,0x18,0x06,0x99,0x14,0x00,0x99,0x0c,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x14,0x6e,0x8f,0x93,0x6a,0x6a, +0x91,0x8d,0x6e,0x71,0xbe,0x6d,0x6f,0xbf,0x6e,0x6e,0xbf,0x71,0x6e,0xbe,0x03,0xcc,0xa2,0x7a,0x77,0xa8,0xa7,0x78,0x78,0xa4,0x9a,0x73,0xcc,0x78,0x76,0xcd,0x75,0x76,0xcc,0x76,0x76,0xcd,0x74,0x00,0x00,0x01,0x00,0x8a,0xfe,0xe6,0x03,0x37,0x05,0x9c,0x00,0x29,0x00,0x49,0x40,0x26,0x0a,0x8a,0x20,0x11,0x8a,0x17,0x0e,0x29,0x14,0x1c, +0x29,0x14,0x20,0x17,0x17,0x20,0x14,0x29,0x1c,0x05,0x2b,0x26,0x8a,0x02,0x0e,0x1c,0x29,0x1c,0x13,0x00,0x00,0x06,0x14,0x13,0x23,0x99,0x06,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x26,0x35, +0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0x6f,0xe5,0x50,0x94,0x55,0x5b,0x98,0x57,0x48,0x86,0x9c,0xf0,0xa4,0x56,0x87,0x1c,0x1c,0x2a,0x6e,0xb5,0x75,0x9d,0xad,0x4f,0x55,0x49, +0x45,0x59,0x50,0x47,0x02,0xf7,0x8f,0xd7,0x5b,0x92,0x52,0x58,0xa4,0x68,0x5f,0xb8,0xc0,0xa7,0xd2,0xd2,0x5e,0x6a,0x68,0x52,0x27,0x3b,0x23,0x2c,0x4b,0x75,0xa9,0x67,0x9d,0xd7,0xab,0x5b,0x63,0x6c,0x60,0x49,0x42,0x7d,0x2c,0x00,0x00,0x01,0x00,0x6d,0xfe,0xdb,0x03,0xbe,0x05,0x9c,0x00,0x21,0x00,0x3c,0x40,0x1d,0x00,0x21,0x1d,0x1a, +0x8a,0x0e,0x02,0x0e,0x06,0x06,0x13,0x14,0x0b,0x0e,0x09,0x09,0x11,0x0b,0x9a,0x02,0x1d,0x1d,0x00,0x11,0x9b,0x16,0x06,0x21,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x01,0x2f,0x33,0xc4,0x32,0x39,0x2f,0x12,0x39,0x10,0xed,0x32,0x2f,0x33,0x31,0x30,0x01,0x02,0x03,0x2e,0x02,0x35,0x34,0x36,0x33,0x32, +0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x07,0x07,0x16,0x12,0x17,0x03,0x39,0xee,0x9a,0x46,0x74,0x42,0x4a,0x3c,0x7c,0x50,0x85,0x8d,0xc3,0x9a,0x88,0x96,0x31,0xb1,0xa4,0x8f,0xea,0x83,0xca,0xb0,0x01,0x72,0x9e,0x66,0xfe,0xdb,0x01,0x56,0x01,0x6c,0x02,0x47,0x72,0x3b,0x3b,0x4a, +0xd2,0x2a,0xb4,0x7d,0x9c,0xc8,0x49,0x94,0x4c,0x85,0xe9,0x86,0xa9,0xfe,0xfa,0x3e,0x03,0xed,0xfe,0xf6,0x89,0x00,0x00,0x01,0x00,0x76,0xfe,0xde,0x03,0xa2,0x05,0x88,0x00,0x2f,0x00,0x60,0x40,0x19,0x00,0x2f,0x2b,0x28,0x8a,0x0f,0x0c,0x24,0x0f,0x2f,0x0f,0x2f,0x0f,0x31,0x03,0x18,0x14,0x06,0x14,0x06,0x1c,0x22,0x8a,0x18,0x0c,0xb8, +0x01,0x7e,0x40,0x15,0x2b,0x03,0x2b,0x24,0x13,0x9b,0x14,0x2b,0x09,0x14,0x14,0x09,0x2b,0x03,0x00,0x1c,0x9b,0x1d,0x06,0x2f,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0xc6,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0x10,0xed,0x32, +0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x02,0xf6,0x5a,0x71,0x4b,0x81,0x9d,0x4c,0x39,0x3a,0x83,0x3a, +0x5f,0x61,0x95,0x88,0xfe,0xc3,0x7a,0x8c,0x86,0x82,0xfe,0xd2,0x01,0x29,0x89,0xc3,0x65,0x84,0x62,0x74,0x98,0x7c,0x27,0x93,0x33,0xfe,0xde,0x8b,0x93,0x51,0x05,0x6b,0x51,0x38,0x48,0x57,0x52,0x19,0x85,0x5f,0x7b,0x83,0x97,0x66,0x5c,0x5a,0x5f,0x96,0x53,0x98,0x64,0x9d,0x61,0x06,0x2b,0xc0,0x70,0x84,0xcc,0x24,0x04,0x29,0xb9,0x4c, +0x00,0x02,0x00,0x6c,0xff,0xf3,0x04,0x48,0x05,0x88,0x00,0x25,0x00,0x31,0x00,0x50,0xb6,0x26,0x8b,0x10,0x09,0x8b,0x2c,0x02,0xb8,0x01,0x85,0x40,0x22,0x24,0x2f,0x20,0x13,0x03,0x10,0x06,0x2c,0x24,0x10,0x2c,0x24,0x24,0x2c,0x10,0x03,0x33,0x1c,0x8a,0x17,0x06,0x13,0x20,0x13,0x2f,0x03,0x0d,0x25,0x19,0x06,0x29,0x99,0x0d,0x19,0x00, +0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x16,0x17, +0x3e,0x02,0x35,0x27,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x04,0x41,0x07,0x4d,0x8b,0xa5,0x7e,0x69,0x56,0x98,0x59,0x9c,0xc4,0x65,0x80,0xae,0x89,0x4d,0x0a,0xa6,0x0e,0x41,0x77,0x96,0x92,0x77,0x42,0x04,0xfd,0xfe,0x64,0x57,0x52,0x6e,0x55,0x67,0x68,0x57,0x05,0x88,0x25,0x2e,0x66,0xba,0xb3,0x99,0x74,0xc1, +0x63,0x5d,0x91,0x50,0xb3,0x8f,0x5f,0xb9,0x79,0x94,0xa5,0xae,0x61,0x41,0x39,0x3e,0x32,0x51,0x92,0x8e,0x80,0x84,0x9a,0xa4,0x5b,0x44,0xfb,0xa6,0x4b,0x5a,0x63,0x4c,0x42,0x8f,0x5c,0x63,0x92,0x00,0x00,0x01,0x00,0x97,0xfe,0xdb,0x05,0x22,0x05,0x88,0x00,0x25,0x00,0x49,0x40,0x24,0x25,0x00,0x1a,0x09,0x13,0x0b,0x11,0x00,0x0b,0x11, +0x11,0x0b,0x00,0x03,0x22,0x17,0x16,0x27,0x03,0x8a,0x22,0x13,0x1a,0x1a,0x1e,0x9b,0x09,0x06,0x0e,0x06,0x0e,0x17,0x25,0x06,0x16,0x17,0x00,0x2f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x10,0xc6,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x32,0x11,0x33,0x31,0x30,0x01,0x06,0x06, +0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x12,0x12,0x17,0x07,0x26,0x02,0x27,0x35,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x37,0x01,0x8d,0x2e,0x24,0x8f,0x7f,0x35,0x66,0x24,0x42,0x48,0x3e,0x48,0x5f,0x3a,0x54,0xb1,0x64,0x80,0x62,0xc9,0x25,0x37,0x8c,0x3f,0x82,0xc8,0x6f,0x2b, +0x23,0x05,0x88,0xb2,0xe2,0x63,0xc9,0xd5,0x30,0x2c,0x60,0x6b,0x4b,0x5f,0x7b,0x5c,0x5f,0x5b,0xfe,0xf9,0xfe,0x91,0x85,0x5d,0x86,0x01,0xcd,0x90,0x01,0x2f,0x35,0x91,0x01,0x04,0x9c,0x6f,0x01,0x11,0x7c,0x00,0x00,0x01,0x00,0x90,0xfe,0xde,0x04,0xce,0x05,0x88,0x00,0x36,0x00,0x63,0x40,0x33,0x04,0x8a,0x19,0x16,0x15,0x22,0x1f,0x13, +0x0b,0x11,0x1f,0x0b,0x11,0x15,0x15,0x11,0x0b,0x1f,0x04,0x26,0x38,0x2d,0x2d,0x36,0x32,0x8a,0x26,0x0e,0x01,0x13,0x19,0x19,0x09,0x07,0x99,0x1b,0x22,0x01,0x9b,0x35,0x1b,0x35,0x1b,0x35,0x16,0x2e,0x9b,0x2b,0x06,0x15,0x16,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x33,0x11,0x33,0x11,0x39, +0x01,0x2f,0xfd,0xc6,0x39,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0x32,0xed,0x31,0x30,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35, +0x34,0x3e,0x02,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x03,0x61,0xed,0x73,0x7c,0x9d,0x7c,0x45,0x37,0x2a,0x3c,0x39,0x52,0x73,0x45,0x57,0x92,0x7d,0x3f,0x7c,0x2f,0x60,0x5a,0x80,0xd5,0x77,0x3c,0x4b,0x63,0x75,0x3b,0x64,0xa9,0x85,0xe0,0xca,0x7e,0x7e,0x43,0x96,0x7d,0x01,0x1a,0x02,0xe0,0x75,0x6d,0x7e,0xa2, +0x13,0x56,0x4a,0x3f,0x49,0x8f,0x5a,0x57,0x35,0xad,0xbd,0x5c,0x44,0xd4,0x6d,0x1c,0x75,0xce,0x7d,0x51,0x87,0x3c,0x06,0x26,0xa8,0x6f,0x4d,0x6c,0x47,0x2a,0x96,0x22,0x4a,0x3f,0x5e,0x72,0x00,0x01,0x00,0x76,0xff,0xf8,0x04,0xca,0x05,0x88,0x00,0x29,0x00,0x4d,0xbc,0x00,0x24,0x01,0x85,0x00,0x06,0x00,0x0d,0x01,0x85,0x40,0x0a,0x1d, +0x06,0x29,0x1d,0x1d,0x29,0x06,0x03,0x2b,0x16,0xb8,0x01,0x85,0x40,0x0f,0x15,0x00,0x9b,0x29,0x21,0x9b,0x09,0x29,0x09,0x29,0x09,0x11,0x15,0x06,0x1a,0xb8,0x01,0x80,0xb1,0x11,0x18,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01, +0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x02,0x11,0x33,0x10,0x12,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x37,0x03,0xd4,0x16,0x1d,0x78,0xaf,0x5e,0xa8,0x84,0x72,0xb0,0x60,0x7d,0xe2,0x8f,0xcd,0xfe,0xea,0x83,0x9f,0x69,0xcd,0x93, +0x95,0xb9,0x3e,0x6b,0x3e,0x3f,0x4c,0x43,0x75,0x46,0x1a,0x01,0xd4,0x05,0x62,0xae,0x67,0x89,0xb1,0x8b,0xfc,0x9c,0xb6,0xfe,0xe8,0x97,0x01,0x43,0x02,0x95,0x01,0xb8,0xfe,0x5a,0xfd,0xc3,0xfe,0xeb,0x01,0x05,0xce,0x6f,0xb1,0x64,0x59,0x4c,0x48,0x66,0x36,0x02,0x00,0x01,0x00,0x80,0xff,0xa1,0x04,0x3e,0x05,0x96,0x00,0x16,0x00,0x2f, +0x40,0x16,0x16,0x00,0x0a,0x0b,0x00,0x0b,0x00,0x0b,0x18,0x04,0x8b,0x12,0x0b,0x0a,0x0a,0x0e,0x00,0x16,0x06,0x07,0x99,0x0e,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x00,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x04,0x23,0x22,0x26, +0x26,0x35,0x34,0x12,0x00,0x13,0x03,0x97,0xfd,0xef,0x52,0x19,0x95,0x73,0x6c,0xb9,0x6d,0x89,0x81,0xfe,0xfd,0x95,0x75,0xc1,0x6f,0x82,0x01,0x23,0xe9,0x05,0x39,0xfd,0x2c,0xc9,0x3c,0x3b,0x6c,0x83,0x89,0xb4,0x57,0xc7,0xb4,0x64,0xb4,0x72,0x72,0x01,0x05,0x01,0xb2,0x01,0x42,0x00,0x00,0x01,0x00,0x76,0xfe,0xe6,0x04,0x23,0x05,0x9c, +0x00,0x27,0x00,0x42,0x40,0x21,0x27,0x00,0x24,0x8a,0x02,0x12,0x13,0x10,0x89,0x16,0x00,0x1d,0x13,0x16,0x02,0x16,0x02,0x16,0x29,0x08,0x8a,0x1d,0x00,0x9a,0x27,0x27,0x12,0x05,0x9b,0x20,0x06,0x13,0x12,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x11,0x33, +0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x01,0xf1,0xc5,0x6f,0x59,0x60,0x77,0x38,0x86,0xcc,0xd0,0x7a,0x38,0x56,0x87,0x36,0x29,0x54,0xb4,0xec, +0xa0,0x49,0xcf,0xa2,0x6b,0xaa,0x5f,0x99,0x90,0x03,0x32,0x54,0xa6,0x60,0x76,0x84,0x63,0x40,0x7e,0xa8,0xd8,0xdd,0x99,0x74,0x37,0x6b,0x6b,0x52,0x4e,0x34,0x22,0x4f,0x69,0xbf,0xfa,0xd2,0xb0,0x5a,0xa5,0xce,0x61,0xad,0x67,0x82,0xc5,0x36,0x00,0x02,0x00,0x96,0x00,0x93,0x04,0x9f,0x04,0xc9,0x00,0x0e,0x00,0x1e,0x00,0x1f,0x40,0x0f, +0x1b,0x8a,0x00,0x00,0x20,0x08,0x8a,0x13,0x0b,0x9b,0x0f,0x04,0x9b,0x17,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x03,0xff,0x55,0x9d, +0x66,0x6c,0xa8,0x5e,0xba,0x96,0x67,0xaf,0x64,0xfe,0x79,0x8c,0xdd,0x79,0x8c,0xfa,0x96,0x8e,0xe2,0x7d,0x93,0xff,0x02,0xc0,0x64,0xa4,0x5d,0x66,0xb7,0x6c,0x9b,0xcb,0x68,0xb6,0xfe,0x3f,0x8a,0xf4,0x8e,0x98,0xff,0x93,0x87,0xed,0x90,0x99,0xfe,0xfb,0x94,0x00,0x00,0x01,0x00,0x64,0xff,0xe7,0x03,0x88,0x05,0xb1,0x00,0x25,0x00,0x35, +0x40,0x1a,0x06,0x8a,0x14,0x25,0x0d,0x12,0x22,0x14,0x0d,0x22,0x14,0x14,0x22,0x0d,0x03,0x27,0x1c,0x25,0x1f,0x10,0x10,0x0a,0x1f,0x07,0x0a,0x19,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x15,0x14,0x02,0x06,0x23, +0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x32,0x12,0x5d,0x74,0xc3,0xb0,0x76,0xb2,0x6a,0x5f,0x73,0xa2,0x73,0x35,0x40,0x3b,0x3f,0x75,0x8e,0x9d,0x6a,0x3c,0x59,0x3d,0x37,0x47,0x22,0x23,0x04,0xd3,0x20,0x56,0x59,0x98,0xfe,0x81,0x7a, +0xfe,0xfa,0x86,0x5a,0x4b,0x57,0x74,0x10,0x4d,0x54,0x3d,0x77,0x7c,0x74,0x7f,0x6e,0x6a,0x35,0x44,0x55,0x3f,0x36,0x25,0x2d,0x11,0x00,0x00,0x01,0x00,0x78,0xff,0xa7,0x05,0x09,0x05,0xb1,0x00,0x2d,0x00,0x43,0x40,0x13,0x03,0x00,0x89,0x0c,0x15,0x27,0x23,0x1d,0x07,0x15,0x23,0x23,0x15,0x07,0x03,0x2f,0x1d,0x03,0x0d,0xb8,0x01,0x81, +0x40,0x0b,0x19,0x27,0x27,0x20,0x0c,0x0c,0x08,0x20,0x07,0x07,0x08,0x00,0x2f,0x33,0x3f,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0xed,0x39,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xc4,0xed,0x32,0x31,0x30,0x01,0x14,0x06,0x07,0x15,0x16,0x04,0x17,0x07,0x26,0x24,0x24,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x36,0x36, +0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x1e,0x05,0x04,0x47,0xcc,0xcf,0xc8,0x01,0x3c,0x59,0x68,0x4d,0xfe,0x8e,0xfe,0x5e,0xc8,0x10,0x31,0x85,0x3c,0x36,0x7e,0xf5,0x7c,0x41,0x75,0xa9,0x97,0x82,0x46,0x56,0x42,0x36,0x46,0x22,0x23,0x01,0x34,0x8a,0x94,0x8f,0x71,0x46,0x03,0x4b, +0x7e,0xc8,0x3f,0x06,0x4b,0xe2,0x83,0x69,0x71,0xfa,0x9c,0x12,0xa5,0x03,0x19,0x06,0x4b,0x74,0x49,0x36,0x48,0x31,0x24,0x20,0x3c,0x57,0x41,0x44,0x5b,0x42,0x2f,0x1d,0x38,0x12,0x06,0x07,0x14,0x24,0x37,0x52,0x72,0x00,0x00,0x01,0x00,0x82,0x00,0x93,0x05,0x8b,0x05,0x36,0x00,0x23,0x00,0x38,0x40,0x14,0x1a,0x8a,0x07,0x0a,0x0d,0x13, +0x0d,0x07,0x07,0x0d,0x13,0x03,0x25,0x00,0x22,0x0a,0x10,0x10,0x16,0x03,0xb8,0x01,0x80,0xb4,0x1e,0x22,0x00,0x16,0x06,0x00,0x3f,0xc6,0x32,0xd4,0xed,0x12,0x39,0x2f,0x39,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x31,0x30,0x13,0x12,0x00,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x07,0x16,0x15,0x14,0x06, +0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x03,0x37,0xfb,0x96,0x01,0x40,0xce,0x64,0x97,0x53,0x98,0x83,0x09,0x30,0x8d,0x5b,0x61,0x83,0xc7,0xa8,0x95,0xe1,0x79,0x7a,0xdf,0x8e,0xb4,0xfe,0xce,0xf2,0x4a,0x73,0x05,0x36,0xfd,0xd2,0xfe,0x25,0x6c,0xc0,0x70,0x9e,0xe3,0x18,0x0e,0x3c, +0x4a,0x5b,0x83,0x93,0x6a,0x80,0x9c,0x91,0xfe,0xfe,0x9f,0xa0,0xfe,0xf5,0x99,0xf7,0x01,0xf5,0x01,0x5e,0x59,0x00,0x00,0x03,0x00,0x8c,0x00,0x4c,0x04,0x91,0x05,0xb1,0x00,0x1d,0x00,0x2b,0x00,0x38,0x00,0x46,0x40,0x26,0x2c,0x8a,0x12,0x1a,0x8a,0x33,0x03,0x8b,0x1e,0x0e,0x12,0x33,0x1d,0x1e,0x12,0x33,0x1e,0x1e,0x33,0x12,0x03,0x3a, +0x26,0x8a,0x0b,0x22,0x1d,0x0e,0x30,0x04,0x16,0x29,0x99,0x07,0x36,0x9b,0x16,0x07,0x00,0x3f,0xed,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26, +0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x26,0x27,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x14,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x7e,0x95,0x7e,0x8a,0xee,0x8f,0x8e,0xed,0x83,0x8f,0xa7,0x87,0x7a,0x7f,0xe0,0x80,0x82,0xd2,0x77,0x6e,0x7f,0x77,0x46,0x80,0x9b, +0x9d,0x84,0x47,0xd8,0xa0,0x94,0xbd,0xfd,0x6c,0x3f,0x76,0x9f,0x9c,0x7a,0xb7,0x89,0x84,0xa6,0x03,0x32,0x3f,0xa8,0x77,0x75,0xb3,0x60,0x62,0xb1,0x75,0x7e,0xaa,0x37,0x06,0x34,0x91,0x65,0x62,0x98,0x54,0x51,0x94,0x64,0x6b,0x92,0x33,0xfe,0x98,0x44,0x63,0x4a,0x31,0x28,0x44,0x61,0x47,0x71,0x91,0x85,0x03,0x0b,0x37,0x50,0x3d,0x2f, +0x2c,0x71,0x54,0x4c,0x62,0x5e,0x00,0x02,0x00,0x96,0x00,0x01,0x05,0x82,0x05,0xb1,0x00,0x1f,0x00,0x32,0x00,0x5a,0x40,0x18,0x02,0x8a,0x30,0x2b,0x25,0x0f,0x89,0x28,0x09,0x14,0x00,0x30,0x28,0x28,0x30,0x00,0x14,0x09,0x05,0x34,0x20,0x8a,0x1a,0x13,0xb8,0x01,0x7e,0x40,0x10,0x09,0x2b,0x05,0x12,0x30,0x08,0x1e,0x12,0x08,0x12,0x08, +0x16,0x00,0x1e,0x07,0x25,0xb8,0x01,0x80,0xb1,0x16,0x18,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x32,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x33,0x33,0x10,0xed,0x31,0x30,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x15,0x07,0x0e,0x02,0x15,0x14, +0x16,0x33,0x17,0x15,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x00,0x37,0x17,0x01,0x14,0x16,0x16,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x35,0x37,0x06,0x02,0x03,0xbf,0x2f,0x84,0x5f,0x18,0x2e,0x34,0x95,0x70,0xcb,0x8f,0x48,0x7a,0x50,0x79,0xd2,0xd1,0xb0,0xfe,0xdb,0xa5,0xa5,0x01,0x2d,0xc2,0x95,0xfd,0x75,0x78, +0xde,0x95,0x43,0x42,0x5a,0x83,0x97,0x70,0x82,0x02,0xd9,0xe3,0x05,0x5e,0x5c,0x47,0x5d,0x86,0x0d,0x1f,0x4b,0x06,0x49,0x7d,0x78,0x77,0x40,0x4c,0x80,0x80,0x06,0x6b,0x95,0x01,0x01,0x95,0x91,0x01,0x4c,0x01,0x35,0x73,0x4d,0xfc,0xcc,0x76,0xb8,0x63,0x03,0x36,0xa2,0x4d,0x62,0xc2,0x6e,0x2a,0xaa,0x71,0x15,0x15,0xac,0xfe,0xac,0x00, +0x00,0x01,0x00,0x64,0xff,0xe5,0x06,0x29,0x05,0xb1,0x00,0x2d,0x00,0x5a,0xb9,0x00,0x0a,0x01,0x85,0x40,0x12,0x19,0x06,0x1b,0x01,0x8a,0x21,0x1b,0x21,0x19,0x21,0x28,0x28,0x21,0x19,0x03,0x2f,0x11,0x02,0xb8,0x01,0x80,0x40,0x12,0x11,0x12,0x1b,0x1e,0x22,0x06,0x12,0x1e,0x06,0x12,0x12,0x06,0x1e,0x03,0x0e,0x2b,0x07,0x15,0xb8,0x01, +0x80,0xb1,0x0e,0x19,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x11,0x14,0x33,0x32,0x36,0x37,0x33,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x20,0x00,0x03,0x37,0x33,0x12,0x21,0x32,0x36, +0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0x92,0x23,0x68,0xbd,0x68,0x0e,0x66,0x73,0x87,0xff,0xae,0xfe,0xae,0xfe,0x39,0x78,0x77,0x06,0xfa,0x02,0x1c,0x7a,0xb6,0x62,0x34,0x47,0xc2,0x66,0x74,0x85,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x04,0x89, +0xfe,0xd2,0x73,0x93,0xa4,0x59,0xfe,0xf7,0x98,0xa6,0xfe,0xf9,0x93,0x02,0x35,0x02,0x51,0x64,0xfb,0xb5,0x6f,0xc6,0x7b,0x7a,0x6a,0x60,0x6e,0x8f,0x78,0x01,0x72,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x00,0x02,0x00,0x87,0xff,0xe8,0x04,0xa0,0x05,0xb1,0x00,0x21,0x00,0x30,0x00,0x43,0x40,0x0a,0x24,0x14,0x8a,0x21,0x1b,0x21,0x1b,0x21, +0x32,0x2e,0xb8,0x01,0x82,0xb4,0x05,0x05,0x2e,0x24,0x22,0xb8,0x01,0x80,0x40,0x0d,0x00,0x0d,0x15,0x1e,0x02,0x02,0x0d,0x1e,0x19,0x2a,0x9b,0x0d,0x07,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x32,0x32,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x27,0x26, +0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x03,0x15,0x11,0x17,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x32,0x37,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x06,0x15,0x17,0x16,0x03,0x4e,0x63,0x96,0x5c,0xfe,0xe1,0x1b,0x19,0x1f,0x62,0x9a,0xc7,0x73,0x1f,0x58,0x59,0x3e,0x27,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58, +0x41,0x57,0x62,0xfe,0xfb,0xa2,0x63,0x29,0x37,0x3a,0x11,0x61,0xae,0x65,0x07,0x8c,0x02,0x74,0x1d,0x2a,0x13,0x1c,0x5b,0x2a,0x65,0xfc,0xb7,0x64,0x35,0x62,0x84,0xb2,0x74,0xfd,0xb2,0x4c,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0x01,0xe2,0x27,0x57,0x75,0xa0,0x63,0x2c,0x87,0xe9,0x83,0x0a,0x25,0x00,0x00,0x02,0x00,0x78,0xff,0xe8, +0x06,0x08,0x05,0xb1,0x00,0x31,0x00,0x41,0x00,0x6e,0xb3,0x1f,0x8a,0x18,0x26,0xb8,0x01,0x86,0x40,0x2d,0x3e,0x12,0x24,0x1a,0x3e,0x18,0x1a,0x3e,0x3e,0x1a,0x18,0x03,0x43,0x0e,0x35,0x8a,0x07,0x31,0x1a,0x1c,0x3e,0x34,0x32,0x9b,0x10,0x23,0x9b,0x15,0x12,0x0e,0x02,0x0a,0x1c,0x0e,0x15,0x2b,0x1c,0x10,0x15,0x15,0x10,0x1c,0x03,0x0a, +0x3a,0xb8,0x01,0x80,0xb3,0x2b,0x19,0x0a,0x07,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0xc4,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x27,0x27,0x06,0x23,0x22,0x26,0x35, +0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x37,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x03,0x35,0x25,0x22,0x07,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x36,0x35,0x27,0x26,0x26,0x01,0x26,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41, +0x56,0x63,0x78,0xa1,0x90,0x80,0x26,0x52,0x54,0x58,0x4c,0x0b,0x82,0x06,0x28,0xad,0x90,0x30,0x1b,0x0e,0x62,0x99,0xc7,0x71,0x1f,0x58,0x59,0x3e,0x27,0x01,0xca,0x9b,0x8b,0x29,0x37,0x3a,0x11,0x61,0xab,0x65,0x07,0x3b,0x6f,0x04,0x71,0x52,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0xfe,0xa4,0x36,0x3c,0x18,0x12,0x3a,0x3b,0x1d,0x1f, +0x06,0x62,0x4f,0x52,0x81,0x9b,0x06,0x19,0x2a,0x64,0xff,0xb6,0x63,0x35,0x62,0x84,0xb2,0x74,0x97,0x40,0x57,0x75,0xa0,0x63,0x2c,0x85,0xeb,0x83,0x0a,0x20,0x1e,0x00,0x00,0x01,0x00,0x96,0xff,0xe7,0x05,0x3b,0x05,0xb1,0x00,0x3c,0x00,0x67,0xb9,0x00,0x1a,0x01,0x83,0xb6,0x39,0x0d,0x39,0x0d,0x39,0x07,0x35,0xb8,0x01,0x85,0x40,0x24, +0x1d,0x2d,0x2a,0x24,0x2a,0x1d,0x1d,0x2a,0x24,0x03,0x3e,0x07,0x89,0x14,0x00,0x9b,0x18,0x31,0x21,0x07,0x10,0x0a,0x21,0x2d,0x18,0x27,0x0a,0x18,0x0a,0x18,0x10,0x27,0x07,0x10,0x19,0x1a,0xb8,0x01,0x81,0xb1,0x39,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x01, +0x2f,0xec,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x22,0x06,0x06,0x15,0x14,0x17,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x20,0x13,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x07,0x07,0x14,0x16,0x17,0x04,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x2e,0x02,0x02,0x26,0x41,0x6f,0x42,0x0c,0x0b,0x0f,0x4e,0x2d,0x41,0x5d,0x5f,0x4b,0x4d,0x90,0x56,0x6d,0xb2,0x6d,0x01,0x6e,0x4c,0x56,0x6a,0x55,0xac,0xff,0xfe,0xe1,0xe2,0x4f,0x44,0x39,0x48,0x22,0x23,0x01,0x94,0xa2,0x01,0x37,0xeb,0x7a,0x87,0xd5,0x85, +0x23,0x4e,0x72,0x02,0x1f,0x45,0x7a,0x41,0x28,0x25,0x02,0x2a,0x36,0x66,0x44,0x47,0x58,0x57,0x95,0x59,0x6a,0xc4,0x63,0xfd,0xec,0x23,0xa6,0x5f,0x42,0x6e,0x61,0x5f,0x69,0xcd,0x8a,0x54,0x5c,0x3e,0x37,0x25,0x2d,0x11,0x06,0x3f,0x6c,0x39,0x6e,0x8c,0xaf,0x6d,0x81,0xf5,0x7c,0xe5,0xe2,0x71,0x00,0x02,0x00,0x98,0x00,0xe6,0x03,0xee, +0x04,0x23,0x00,0x0b,0x00,0x17,0x00,0x2a,0xb9,0x00,0x00,0x01,0x85,0xb3,0x0c,0x0c,0x19,0x12,0xbe,0x01,0x85,0x00,0x06,0x00,0x15,0x01,0x7e,0x00,0x03,0x00,0x0f,0x01,0x7e,0xb1,0x09,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34, +0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xee,0xf8,0xb3,0xb3,0xf8,0xf0,0xbb,0xbb,0xf0,0xa0,0x93,0x78,0x77,0x94,0x97,0x74,0x73,0x98,0x02,0x83,0xae,0xef,0xef,0xae,0xbb,0xe5,0xe5,0xbb,0x71,0xab,0xad,0x6f,0x77,0xa5,0xa8,0x00,0x02,0x01,0x00,0xff,0xba,0x03,0x6f,0x05,0x1a,0x00,0x15,0x00,0x1e,0x00,0x36,0x40,0x09, +0x16,0x12,0x8a,0x02,0x00,0x02,0x00,0x20,0x1b,0xb8,0x01,0x85,0x40,0x0b,0x0a,0x1d,0x99,0x05,0x05,0x00,0x19,0x9b,0x0d,0x06,0x15,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x33,0x31,0x30,0x05,0x24,0x11,0x35,0x12,0x35,0x06,0x23,0x22,0x26,0x35,0x34, +0x36,0x33,0x32,0x16,0x15,0x10,0x03,0x15,0x14,0x17,0x01,0x35,0x34,0x23,0x22,0x15,0x14,0x33,0x32,0x03,0x6f,0xfe,0xeb,0x0a,0x25,0x25,0x7e,0x9c,0x9f,0x7c,0x7a,0x72,0x0a,0x72,0xfe,0xfa,0x4e,0x7b,0x78,0x21,0x46,0x24,0x01,0x11,0x0c,0x01,0x1e,0xe4,0x08,0x9b,0x7d,0x74,0x99,0xb2,0xe0,0xfe,0xf0,0xfe,0x83,0x07,0x8e,0x0d,0x03,0x44, +0x25,0xb8,0x6d,0x7c,0x00,0x01,0x00,0x5d,0xff,0xbe,0x04,0x26,0x04,0xee,0x00,0x20,0x00,0x4d,0xb2,0x1e,0x05,0x1c,0xb8,0x01,0x85,0x40,0x1d,0x10,0x0d,0x10,0x01,0x00,0x09,0x10,0x00,0x00,0x10,0x09,0x03,0x22,0x16,0x0d,0x05,0x1e,0x1e,0x07,0x0b,0x07,0x0b,0x07,0x01,0x13,0x9b,0x19,0x06,0x00,0xb8,0x01,0x80,0xb1,0x01,0x19,0x00,0x3f, +0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0x33,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x32,0x31,0x30,0x25,0x07,0x26,0x27,0x26,0x27,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x36,0x33,0x32,0x00,0x15,0x10,0x05,0x16,0x16, +0x04,0x26,0x28,0x79,0x5b,0x19,0xa2,0x6c,0x6f,0xd9,0xe9,0x79,0x6b,0x6b,0x80,0xc3,0xa3,0xbc,0x8f,0x65,0x72,0xbe,0x80,0xe5,0x01,0x21,0xfe,0xf6,0x65,0x6d,0x58,0x9a,0x11,0x43,0x12,0x98,0x24,0x91,0x8e,0x45,0x38,0xc5,0x73,0xa4,0xc8,0x77,0x7c,0x57,0x44,0xfe,0xda,0xe6,0xfe,0xd1,0xad,0x63,0x3e,0x00,0x00,0x01,0x00,0x6b,0xff,0x7b, +0x04,0x19,0x05,0x04,0x00,0x2a,0x00,0x68,0xb6,0x05,0x04,0x04,0x2c,0x29,0x00,0x26,0xb8,0x01,0x85,0x40,0x19,0x1b,0x08,0x02,0x02,0x16,0x1b,0x0d,0x16,0x0d,0x16,0x22,0x13,0x1b,0x02,0x09,0x29,0x29,0x17,0x0f,0x0f,0x11,0x16,0x9b,0x17,0x11,0xb8,0x01,0x81,0x40,0x0b,0x09,0x17,0x09,0x17,0x09,0x05,0x1f,0x9b,0x24,0x06,0x04,0xb9,0x01, +0x80,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x11,0x39,0x11,0x12,0x39,0x01,0x2f,0x33,0xc4,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x14,0x05,0x16,0x17,0x07,0x26,0x26,0x27,0x07,0x22,0x27,0x26,0x35,0x34,0x33, +0x32,0x17,0x24,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x16,0x04,0x19,0xfe,0xdb,0x41,0x7d,0x29,0x72,0x96,0x62,0x4c,0x8c,0x41,0x77,0xaa,0x6d,0xb3,0x01,0x20,0xfe,0xca,0xcd,0xeb,0x7c,0x94,0x82,0x49,0xa0,0xa8,0xbb,0x38,0xd6,0xc5,0x02,0x0b,0x57,0x3c, +0x9b,0x01,0x8f,0xe9,0x41,0x2e,0x22,0x9a,0x1f,0x51,0x61,0x01,0x12,0x22,0x65,0x78,0x6e,0x14,0x8d,0xcb,0xa1,0x5a,0x53,0x7c,0x29,0x17,0x47,0x97,0x50,0xfe,0xa4,0x46,0x9b,0x24,0x77,0x00,0x00,0x02,0x00,0x94,0xff,0xba,0x03,0xf0,0x05,0x1e,0x00,0x1c,0x00,0x29,0x00,0x53,0xb3,0x00,0x89,0x1c,0x06,0xbb,0x01,0x85,0x00,0x1d,0x00,0x24, +0x01,0x85,0x40,0x1e,0x0e,0x02,0x1c,0x12,0x21,0x18,0x03,0x1d,0x0e,0x1c,0x1d,0x0e,0x0e,0x1d,0x1c,0x03,0x2b,0x15,0x89,0x14,0x18,0x02,0x12,0x21,0x04,0x0a,0x1c,0x14,0x06,0x27,0xb8,0x01,0x80,0xb1,0x0a,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x10, +0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x01,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x00,0x03,0x33,0x16,0x16,0x17,0x3e,0x02,0x37,0x03,0x34,0x27,0x26,0x27,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf0,0x30,0xfe,0xef,0x81,0x3d,0x1f,0x5c,0x9b,0x53,0x54,0x9a,0x5c,0x1f,0x3e,0x80, +0xfe,0xeb,0x2c,0xaa,0x22,0x76,0x6f,0x57,0x55,0x3d,0x18,0x5a,0x38,0x11,0x5e,0x72,0x3b,0x67,0x43,0x43,0x67,0x05,0x1e,0xfe,0x81,0xfe,0xdc,0x95,0x64,0x63,0x30,0x51,0x8f,0x55,0x55,0x8f,0x51,0x30,0x63,0x65,0x94,0x01,0x28,0x01,0x7b,0xb6,0xfa,0x76,0x5a,0x8d,0xba,0x85,0xfb,0xd1,0x3b,0x50,0x18,0x6c,0x84,0x50,0x3b,0x38,0x5e,0x5c, +0x00,0x01,0x00,0x59,0xff,0xf6,0x04,0x2b,0x04,0xe1,0x00,0x1a,0x00,0x48,0xb9,0x00,0x10,0x01,0x85,0xb2,0x0a,0x18,0x00,0xb8,0x01,0x85,0x40,0x0d,0x01,0x0a,0x01,0x0a,0x01,0x1c,0x12,0x89,0x0d,0x07,0x18,0x12,0x15,0xb8,0x01,0x80,0x40,0x0b,0x02,0x07,0x0d,0x04,0x04,0x01,0x19,0x0d,0x06,0x01,0x18,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f, +0x12,0x39,0x39,0xed,0x32,0x32,0x01,0x2f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed,0x31,0x30,0x05,0x23,0x11,0x06,0x23,0x22,0x24,0x27,0x37,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x04,0x2b,0xa0,0x7b,0xe0,0xa7,0xfe,0xf9,0x29,0x4f,0x39,0x41,0x23,0xaa,0x5a, +0x65,0x1f,0x9f,0x56,0x57,0xd7,0x2d,0xa0,0x0a,0x01,0x53,0x2a,0x8e,0x7e,0x69,0x66,0x92,0x50,0xde,0x27,0xac,0xa9,0xcd,0x98,0x31,0x37,0x22,0x16,0x02,0xea,0x00,0x01,0x00,0x7d,0xff,0xf6,0x04,0x06,0x06,0x30,0x00,0x2d,0x00,0x68,0xb9,0x00,0x17,0x01,0x85,0x40,0x10,0x0c,0x13,0x0e,0x13,0x1a,0x1a,0x13,0x0e,0x03,0x05,0x2f,0x25,0x25, +0x00,0x20,0x28,0xb8,0x01,0x85,0x40,0x1c,0x09,0x07,0x05,0x14,0x9b,0x11,0x0c,0x00,0x2d,0x07,0x26,0x9b,0x23,0x1a,0x1b,0x2d,0x23,0x1b,0x1b,0x23,0x2d,0x03,0x02,0x1d,0x9b,0x0c,0x06,0x2b,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x39,0x11,0x33,0x10,0xdd,0xed,0x01, +0x2f,0x33,0x33,0xfd,0x32,0xc4,0x39,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x17,0x15,0x27,0x22,0x06,0x15,0x14,0x17,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33, +0x32,0x37,0x04,0x06,0xb9,0xc0,0xe9,0xfe,0xd9,0xa0,0x9c,0xde,0xc2,0x1c,0x98,0x7a,0x69,0x69,0x50,0x22,0x68,0x88,0x23,0x75,0x7a,0xc1,0xa2,0xba,0x84,0xec,0xcb,0xfe,0x9d,0xe0,0x91,0xa3,0xa5,0x39,0x43,0xc4,0xaf,0xa5,0x5c,0x5d,0xb1,0x98,0xb4,0x10,0x32,0x45,0x6a,0x7b,0x04,0xa7,0x03,0x1c,0x21,0x47,0x27,0x23,0x9c,0x1a,0x5f,0x61, +0x52,0x6d,0xaf,0xa1,0x61,0x72,0x3b,0x00,0x00,0x01,0x00,0xbf,0xff,0xf0,0x03,0xc4,0x05,0x25,0x00,0x17,0x00,0x40,0xb4,0x03,0x04,0x10,0x0f,0x00,0xb8,0x01,0x85,0x40,0x09,0x07,0x0f,0x07,0x04,0x07,0x04,0x07,0x19,0x0d,0xb8,0x01,0x85,0x40,0x0c,0x12,0x0f,0x10,0x10,0x15,0x04,0x03,0x19,0x0a,0x9b,0x15,0x06,0x00,0x3f,0xed,0x3f,0x33, +0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x00,0x05,0x27,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0xc4,0xfe,0xba,0xff,0x00,0x70,0xe0,0x01,0x37,0x98,0x69,0x52,0x74,0x40,0x8c,0x53,0xc4, +0xa1,0xb1,0xef,0x03,0x92,0xc2,0xfe,0x08,0xe8,0x71,0xcb,0x01,0xc9,0x9d,0x61,0x92,0x6b,0x46,0x52,0x6b,0x4e,0x75,0x96,0x8f,0xc2,0xe8,0x00,0x01,0x00,0x2b,0xff,0xf6,0x04,0x59,0x05,0x29,0x00,0x18,0x00,0x3c,0xb6,0x10,0x00,0x10,0x00,0x1a,0x0e,0x13,0xb8,0x01,0x85,0x40,0x09,0x09,0x05,0x00,0x18,0x18,0x10,0x02,0x0c,0x0f,0xb8,0x01, +0x80,0xb3,0x07,0x10,0x06,0x16,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0x33,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0xc4,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x59,0x9b, +0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x02,0xbd,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x01,0x00,0x2b,0xff,0xf6,0x04,0x59,0x05,0xda,0x00,0x25,0x00,0x4a,0xb9,0x00,0x19,0x01,0x85,0x40,0x0e,0x0f,0x1d,0x11, +0x1d,0x15,0x00,0x00,0x15,0x1d,0x11,0x04,0x27,0x0e,0x20,0xb8,0x01,0x85,0xb7,0x09,0x05,0x17,0x9b,0x14,0x1c,0x0c,0x0e,0xb8,0x01,0x80,0xb3,0x07,0x1e,0x06,0x23,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0x33,0xfd,0xcd,0x33,0xd4,0xed,0x01,0x2f,0xc4,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30, +0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x59,0x9b,0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x01,0xb5,0x11,0x8e,0xb1,0x44,0x17,0x45,0x46,0x34,0xfd,0x59,0x03, +0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x2c,0x37,0x7f,0x77,0xa0,0x06,0x11,0x3f,0x2c,0x37,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x00,0x02,0x00,0x76,0x01,0x13,0x03,0xc8,0x04,0xa4,0x00,0x0b,0x00,0x19,0x00,0x27,0xb9,0x00,0x10,0x01,0x85,0xb3,0x09,0x09,0x1b,0x03,0xbb,0x01, +0x85,0x00,0x17,0x00,0x06,0x01,0x80,0xb4,0x13,0x00,0x9b,0x0c,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x02,0x20,0x73,0x99,0x9d,0x6f,0x70,0x9a,0x97,0x73,0x75, +0xc3,0x70,0xed,0xbb,0x72,0xc6,0x72,0xe9,0x04,0x09,0xab,0x81,0x7f,0xb0,0xb0,0x7f,0x80,0xac,0x9b,0x76,0xd3,0x7f,0xc8,0xfe,0xff,0x7a,0xd3,0x7c,0xce,0xfa,0x00,0x02,0x00,0x2d,0xff,0xe8,0x03,0x89,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x3c,0x40,0x0b,0x18,0x0d,0x8a,0x0e,0x0f,0x15,0x0f,0x15,0x0f,0x23,0x1f,0xbb,0x01,0x85,0x00,0x06, +0x00,0x16,0x01,0x80,0xb3,0x03,0x03,0x09,0x0d,0xb8,0x01,0x80,0xb5,0x12,0x19,0x1c,0x9b,0x09,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x33,0x31,0x30,0x01,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35, +0x03,0x32,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x0c,0x02,0x50,0x4e,0x8c,0xb3,0xb2,0x87,0x92,0xb8,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0xa4,0x58,0x4c,0x55,0x49,0x47,0x5c,0x5b,0x03,0x39,0x02,0x15,0xb7,0x98,0x8c,0xb1,0xc9,0x9f,0xfc,0x38,0x67,0xac,0x28,0x2d,0x55,0x4b,0x03,0x3e,0x23,0x66,0x5e,0x6a,0x5e,0x49, +0x4c,0x5e,0x00,0x01,0x00,0x7c,0xff,0xe8,0x04,0x43,0x05,0xb2,0x00,0x26,0x00,0x55,0xb9,0x00,0x00,0x01,0x85,0x40,0x24,0x09,0x0a,0x1b,0x0a,0x1b,0x0a,0x28,0x18,0x03,0x8b,0x21,0x13,0x10,0x0a,0x09,0x03,0x21,0x20,0x18,0x10,0x16,0x09,0x10,0x16,0x20,0x20,0x16,0x10,0x09,0x04,0x0c,0x1e,0x9b,0x23,0x07,0x07,0xb8,0x01,0x80,0xb1,0x0c, +0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x32,0x11,0x33,0x01,0x2f,0xcd,0xc4,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x17,0x16,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36, +0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x03,0x84,0xca,0xac,0x25,0x22,0x64,0x51,0x73,0x8c,0x3a,0x96,0x9f,0x90,0xb4,0x30,0x28,0x7d,0x79,0x68,0x47,0x94,0x38,0x6e,0x81,0xbe,0x9f,0x62,0x33,0x1a,0x38,0x60,0xa7,0xed,0x7e,0x03,0xce,0xa3,0xf2,0x26,0x90,0x82,0x7e,0x47,0x9e,0x44,0xbc,0xc0,0xa3,0x05,0x4e,0x53, +0x45,0x5d,0x9d,0x20,0x9c,0x6b,0x90,0xae,0x08,0x95,0x0e,0x7a,0xdb,0x00,0x00,0x01,0x00,0x0f,0xff,0xe8,0x04,0x52,0x05,0xb2,0x00,0x2b,0x00,0x5b,0xb9,0x00,0x02,0x01,0x85,0x40,0x0d,0x00,0x1d,0x10,0x10,0x2d,0x1d,0x23,0x17,0x23,0x17,0x0a,0x09,0x29,0xb8,0x01,0x85,0x40,0x17,0x1d,0x09,0x0a,0x00,0x13,0x17,0x9b,0x18,0x23,0x22,0x0a, +0x18,0x22,0x22,0x18,0x0a,0x03,0x06,0x20,0x9b,0x25,0x07,0x0d,0xb8,0x01,0x80,0xb1,0x06,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x39,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24, +0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x03,0x80,0xd2,0x7b,0xdd,0x89,0xb9,0xfe,0xd6,0x7f,0x7a,0x5e,0xf8,0x8d,0x97,0xb1,0x70,0x5e,0x36,0x40,0x58,0x4d,0x13,0x29,0x5d,0x6f,0x8e,0x96,0x78, +0x4d,0x3f,0x23,0x4d,0x57,0x88,0xc7,0x68,0x7f,0x02,0xf7,0x8d,0xe4,0x7d,0xbc,0x65,0xb6,0xc0,0x5f,0x94,0xa6,0x8e,0x7e,0x56,0x90,0x2f,0x10,0x0b,0x97,0x07,0x89,0x6a,0x6f,0x86,0x12,0x97,0x16,0x6a,0xbd,0x74,0xb0,0x6e,0x00,0x02,0x00,0x0a,0xff,0xe8,0x04,0xc4,0x05,0xbc,0x00,0x10,0x00,0x1b,0x00,0x57,0xbc,0x00,0x16,0x01,0x85,0x00, +0x0d,0x00,0x07,0x01,0x85,0x40,0x1c,0x11,0x02,0x03,0x14,0x01,0x0f,0x03,0x0d,0x04,0x11,0x03,0x0d,0x11,0x03,0x03,0x11,0x0d,0x03,0x1d,0x00,0x10,0x01,0x0f,0x04,0x14,0x04,0x00,0x19,0xb8,0x01,0x80,0xb7,0x0a,0x19,0x03,0x10,0x10,0x02,0x00,0x07,0x00,0x3f,0x32,0x32,0x11,0x33,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0x33,0x12,0x17,0x39, +0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x01,0x01,0x17,0x01,0x16,0x12,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x10,0x37,0x01,0x01,0x34,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x70,0x01,0xf5,0x01,0xed,0x72,0xfe,0x16,0x76,0x71,0xbd,0x9b,0x9f,0xbd,0xe6,0xfe,0x17,0x03,0x19, +0x55,0x64,0xbf,0x67,0x50,0x54,0x6d,0x05,0xbc,0xfe,0x3a,0x01,0xc6,0x75,0xfe,0x3b,0x81,0xfe,0xff,0x92,0xae,0xd8,0xe0,0xb0,0x01,0x1a,0xf6,0x01,0xbc,0xfc,0x35,0x5a,0xd5,0x6e,0xcb,0xd8,0x67,0x89,0x8a,0x00,0x00,0x01,0x00,0x16,0xff,0xe8,0x05,0x11,0x05,0xb2,0x00,0x22,0x00,0x4b,0x40,0x12,0x01,0x02,0x20,0x00,0x8a,0x08,0x02,0x08, +0x02,0x08,0x24,0x1b,0x8a,0x15,0x0e,0x21,0x06,0x1e,0xb8,0x01,0x80,0x40,0x0d,0x15,0x09,0x14,0x0b,0x14,0x0b,0x14,0x05,0x12,0x9b,0x17,0x07,0x00,0xb8,0x01,0x80,0xb1,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0xed,0x3f,0x01,0x2f,0xc4,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x31, +0x30,0x25,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x38,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0x6e,0x8b,0xda,0xe8,0x2c,0x2f,0x2d,0x1c,0x1f,0x28,0x41,0x76,0x88,0x8e,0x7c,0x97,0x76,0xa4,0x82, +0x67,0xac,0x28,0x2d,0x55,0x4b,0xfb,0x35,0xed,0xdb,0x01,0xa2,0x29,0x36,0x05,0x96,0x0a,0x91,0x7f,0xfe,0x5e,0x87,0x90,0x66,0x03,0x4b,0x00,0x01,0x00,0x41,0xff,0xe8,0x04,0x85,0x05,0xbb,0x00,0x36,0x00,0x70,0xbf,0x00,0x0a,0x01,0x85,0x00,0x15,0x00,0x2a,0x01,0x85,0x00,0x27,0x00,0x04,0x01,0x85,0x40,0x11,0x1b,0x1d,0x27,0x1b,0x15, +0x00,0x0f,0x27,0x1b,0x1b,0x27,0x0f,0x00,0x15,0x05,0x38,0x30,0xb8,0x01,0x85,0x40,0x16,0x20,0x0f,0x10,0x07,0x17,0x17,0x1d,0x12,0x00,0x9b,0x2d,0x22,0x10,0x0d,0x22,0x27,0x36,0x36,0x0d,0x27,0x07,0x12,0xb8,0x01,0x80,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0xed,0x12,0x39,0x39,0x11,0x33, +0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x02,0x35,0x34,0x37,0x35,0x24,0x35,0x10,0x21,0x32,0x36,0x35,0x34,0x27,0x17, +0x16,0x15,0x14,0x06,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x30,0xb9,0x5f,0x66,0x81,0xb5,0xdb,0xc2,0xa2,0x89,0x86,0x60,0x2f,0x57,0x5b,0x3f,0x53,0xfa,0xb6,0xc1,0x62,0x44,0xfe,0xe9,0x01,0x9a,0x43,0x56,0x06,0x9d,0x04,0xac,0x82,0x87,0x7b,0x89,0x6c,0x2b,0x2d,0xed,0x03,0x1a,0x1c,0x0e,0x59,0x48,0x3d,0x3d,0x05, +0x07,0x79,0x75,0x6d,0x86,0x28,0x8b,0x1b,0x38,0x27,0x50,0x06,0x05,0x3d,0x7b,0x62,0x66,0x4a,0x02,0x45,0xdb,0x01,0x25,0x25,0x22,0x17,0x12,0x33,0x12,0x1e,0x49,0x5f,0x47,0x47,0x43,0x50,0x03,0x23,0x00,0x02,0x00,0x36,0xff,0xe8,0x04,0xaf,0x05,0xb2,0x00,0x1d,0x00,0x29,0x00,0x53,0xb1,0x21,0x16,0xbb,0x01,0x85,0x00,0x07,0x00,0x27, +0x01,0x85,0x40,0x0d,0x0f,0x07,0x0f,0x07,0x0f,0x2b,0x00,0x8b,0x1d,0x1d,0x00,0x21,0x1e,0xb8,0x01,0x80,0x40,0x09,0x0c,0x09,0x0c,0x00,0x0c,0x00,0x0c,0x12,0x03,0xb8,0x01,0x80,0xb5,0x1a,0x19,0x24,0x9b,0x12,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39, +0x2f,0x2f,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x13,0x12,0x12,0x33,0x32,0x36,0x12,0x35,0x34,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x03,0x25,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xd1,0x2c,0xcf,0xb5,0x76,0xb8,0x62,0x04,0x02,0x7d,0x9b,0xa1,0xc9, +0xc0,0xa2,0x89,0xce,0x6d,0x89,0xfd,0xa2,0xf8,0xfe,0xde,0x37,0x02,0xb4,0x42,0x89,0x3d,0x21,0x83,0x52,0x5e,0x77,0x6d,0x03,0x23,0xfe,0x94,0xfe,0xcc,0x92,0x01,0x00,0x97,0x3d,0x3a,0x6a,0xdb,0xb0,0xa5,0xc9,0xbf,0xfe,0x9b,0xed,0xc9,0xfe,0xc0,0xb0,0x01,0x70,0x01,0xa2,0x5a,0x47,0x44,0x91,0xa7,0x73,0x5f,0x6c,0x85,0x00,0x00,0x01, +0x00,0x80,0xff,0xe8,0x04,0x3e,0x05,0xbc,0x00,0x14,0x00,0x33,0x40,0x14,0x14,0x00,0x09,0x0a,0x00,0x0a,0x00,0x0a,0x16,0x04,0x8b,0x10,0x0a,0x09,0x09,0x0d,0x00,0x14,0x07,0x07,0xb8,0x01,0x80,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01, +0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x13,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x01,0x03,0x7c,0xfe,0x6e,0x6f,0x5e,0x90,0x74,0xe9,0xab,0x89,0x7c,0xfd,0xa0,0xbb,0xea,0x6c,0x71,0x01,0x96,0x05,0x5f,0xfd,0xdf,0x97,0xd8,0x5a,0x6a,0x88,0x01,0x3b,0x57,0xd3,0xac,0xe3,0xaf,0x7c,0x01,0x07,0x98,0x02,0x27,0x00,0x02, +0x00,0x7d,0xff,0xe8,0x04,0x96,0x05,0xb5,0x00,0x03,0x00,0x18,0x00,0x58,0x40,0x13,0x03,0x00,0x15,0x16,0x01,0x02,0x0b,0x0c,0x00,0x16,0x02,0x0c,0x0c,0x02,0x16,0x00,0x04,0x1a,0x04,0xb8,0x01,0x85,0x40,0x13,0x12,0x0c,0x0b,0x00,0x03,0x02,0x01,0x0b,0x03,0x01,0x01,0x03,0x0b,0x03,0x0e,0x16,0x15,0x07,0x08,0xb8,0x01,0x80,0xb1,0x0e, +0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x01,0x17,0x01,0x25,0x14,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x37,0x17,0x06,0x02,0x02, +0x1d,0x01,0xb1,0x71,0xfe,0x52,0xfe,0x8a,0x72,0xc8,0x78,0x61,0xa7,0x51,0x70,0xce,0xf5,0xae,0xfe,0xef,0x97,0xdc,0xca,0x70,0xad,0xcb,0x02,0x68,0x01,0x8c,0x73,0xfe,0x75,0x9a,0x99,0xf0,0x84,0x49,0x43,0x73,0xb4,0xab,0x01,0x3c,0xcc,0xe6,0x01,0x97,0x9d,0x75,0x84,0xfe,0x90,0x00,0x00,0x02,0x00,0x82,0x00,0xd7,0x04,0x4f,0x04,0x89, +0x00,0x0f,0x00,0x1c,0x00,0x22,0x40,0x09,0x08,0x89,0x10,0x10,0x1e,0x16,0x89,0x00,0x19,0xb8,0x01,0x80,0xb4,0x0c,0x13,0x9b,0x04,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14, +0x16,0x33,0x32,0x36,0x36,0x82,0x81,0xe3,0x83,0x81,0xe3,0x82,0x84,0xe2,0x80,0x81,0xe3,0x83,0x03,0x26,0xb9,0x86,0x84,0xbc,0xbb,0x85,0x55,0x94,0x56,0x02,0xb0,0x7d,0xda,0x82,0x80,0xdc,0x7d,0x7e,0xdc,0x7f,0x80,0xdc,0x7d,0x84,0xbc,0xbc,0x84,0x82,0xbd,0x54,0x96,0x00,0x00,0x02,0x00,0x82,0xff,0xe2,0x03,0x7f,0x05,0x7d,0x00,0x15, +0x00,0x21,0x00,0x3b,0x40,0x0e,0x08,0x8a,0x13,0x12,0x16,0x12,0x16,0x12,0x23,0x0e,0x1c,0x89,0x00,0x1f,0xb8,0x01,0x80,0x40,0x0d,0x0e,0x04,0x0c,0x0c,0x13,0x19,0x9b,0x04,0x06,0x12,0x9a,0x13,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x13, +0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x27,0x1e,0x02,0x17,0x07,0x24,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x82,0x69,0xb2,0x67,0x65,0xb1,0x65,0x64,0xb2,0x65,0x68,0x47,0x1b,0x8c,0xe0,0x84,0x56,0xfe,0xcc,0xfe,0xac,0x02,0x58,0x7d,0x59,0x55,0x7f,0x7e,0x56,0x59,0x7d,0x03, +0xe5,0x6c,0xbe,0x6e,0x69,0xb1,0x62,0x64,0xae,0x68,0x33,0x72,0xe3,0xc1,0x3c,0x86,0x92,0x02,0x27,0x01,0x66,0x5c,0x84,0x8b,0x63,0x58,0x7c,0x87,0x00,0x02,0x00,0x96,0xff,0xe2,0x03,0x93,0x05,0x7d,0x00,0x17,0x00,0x23,0x00,0x3d,0x40,0x0f,0x03,0x04,0x0a,0x00,0x89,0x1e,0x04,0x1e,0x04,0x1e,0x25,0x18,0x89,0x10,0x1b,0xb8,0x01,0x80, +0x40,0x0d,0x0a,0x14,0x0c,0x0c,0x03,0x21,0x9b,0x14,0x06,0x04,0x9a,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x31,0x30,0x01,0x10,0x00,0x05,0x27,0x36,0x36,0x37,0x15,0x36,0x37,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16, +0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x93,0xfe,0xaa,0xfe,0xcf,0x55,0x68,0xbc,0x44,0x74,0x2e,0x49,0x67,0x65,0xb1,0x65,0x67,0xb0,0x64,0x66,0xb3,0x69,0xfd,0xaa,0x7d,0x57,0x57,0x7d,0x7d,0x57,0x58,0x7c,0x03,0xe5,0xfe,0xb7,0xfd,0xd7,0x91,0x86,0x31,0x90,0x4f,0x01,0x91,0xb2,0x33,0x67,0xaf,0x64, +0x64,0xb1,0x67,0x6e,0xbe,0x50,0x5d,0x85,0x7d,0x57,0x62,0x8c,0x83,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0x4c,0x05,0x7d,0x00,0x33,0x00,0x57,0x40,0x1a,0x11,0x10,0x14,0x89,0x0d,0x22,0x32,0x8a,0x33,0x29,0x8a,0x2a,0x10,0x0d,0x33,0x2a,0x2a,0x33,0x0d,0x10,0x04,0x35,0x07,0x89,0x1b,0x0a,0xb8,0x01,0x81,0x40,0x11,0x10,0x22,0x11, +0x17,0x11,0x17,0x11,0x1f,0x2a,0x33,0x18,0x2e,0x04,0x9b,0x25,0x1f,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36, +0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x02,0xaf,0x31,0x4f,0x27,0x5c,0x82,0x4c,0x36,0x17,0x1c,0x2e,0x27,0x33,0x52,0x77,0x80,0x5a,0x50,0x8b,0x4f,0x61,0xb4,0x74,0x4f, +0x86,0x1d,0x2a,0x7f,0x4e,0xa1,0xb7,0xa4,0x69,0x46,0x4a,0x5c,0xa4,0x03,0xe7,0x3f,0x76,0x45,0xc8,0x91,0x6d,0x9d,0x26,0x19,0x16,0x2e,0x11,0x8d,0x04,0x87,0x57,0x5f,0x88,0x77,0xc7,0x74,0x8f,0xe5,0x81,0x53,0x40,0x48,0x4b,0xc0,0xa2,0xfb,0xe5,0x04,0x1b,0x4f,0x77,0x8d,0x6d,0xfc,0x19,0x00,0x00,0x02,0x00,0x64,0xff,0xe5,0x05,0x0b, +0x05,0xa9,0x00,0x17,0x00,0x23,0x00,0x53,0x40,0x29,0x1e,0x89,0x00,0x10,0x89,0x18,0x0b,0x8b,0x0a,0x08,0x1b,0x03,0x03,0x00,0x0d,0x18,0x0a,0x00,0x18,0x0a,0x0a,0x18,0x00,0x03,0x25,0x06,0x89,0x05,0x0b,0x05,0x05,0x08,0x03,0x0d,0x1b,0x04,0x14,0x0a,0x06,0x07,0x21,0xb8,0x01,0x80,0xb1,0x14,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17, +0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x12,0x05,0x36,0x13,0x17,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01, +0x27,0x95,0x84,0xee,0xee,0xa6,0xa6,0x01,0x1e,0xc3,0xe1,0x99,0xd6,0xde,0x85,0x93,0x72,0xc3,0x6f,0x6f,0xc1,0x74,0x02,0xa0,0x8c,0x70,0x73,0x8a,0x94,0x69,0x67,0x95,0x01,0x60,0x87,0xfa,0x57,0x94,0x01,0x9b,0x42,0xfe,0xa2,0xb0,0x6d,0x01,0x87,0x43,0xfe,0x8d,0xa2,0x64,0xf1,0x74,0x6e,0xb5,0x66,0x65,0xb1,0x72,0x5f,0xc7,0x3f,0x38, +0xcf,0x6b,0x5c,0x84,0x8b,0x00,0x00,0x03,0x00,0x64,0xff,0xe5,0x05,0x23,0x05,0x7d,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x6e,0x40,0x39,0x37,0x89,0x0a,0x1d,0x89,0x25,0x12,0x89,0x31,0x19,0x18,0x3a,0x28,0x03,0x08,0x04,0x0a,0x25,0x15,0x1b,0x31,0x18,0x0a,0x25,0x31,0x18,0x18,0x31,0x25,0x0a,0x04,0x3e,0x06,0x05,0x2b,0x89,0x00,0x18, +0x05,0x08,0x3a,0x15,0x03,0x28,0x1b,0x06,0x06,0x19,0x06,0x19,0x06,0x21,0x34,0x9b,0x0e,0x06,0x2e,0xb8,0x01,0x80,0xb1,0x21,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x32,0x33,0x01,0x2f,0xed,0xc6,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x17,0x39,0x11,0x33,0x10,0xed, +0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16, +0x17,0x36,0x36,0x01,0x0b,0x7d,0x6e,0xc8,0xca,0x86,0x80,0x8c,0x49,0x63,0xaa,0x61,0x5c,0xa4,0x60,0x89,0x5f,0x73,0xba,0x63,0x88,0x60,0x82,0x48,0x66,0xb0,0x64,0x65,0xb0,0x67,0x02,0x50,0x50,0x43,0x7d,0x97,0x7c,0x57,0x56,0x7e,0x79,0x6d,0x4c,0x52,0x74,0x4f,0x45,0x6a,0x81,0x01,0x47,0x57,0xb0,0x47,0x59,0x01,0x24,0x65,0xe0,0x56, +0x62,0x78,0x5d,0xa5,0x60,0x64,0xab,0x60,0x5d,0xb5,0x3b,0x2b,0xa3,0x89,0x65,0xaa,0x5c,0x7e,0x62,0x55,0x98,0x59,0x60,0xa4,0x42,0x54,0x9f,0x32,0x29,0x95,0x4b,0x53,0x74,0x62,0x03,0x2c,0x56,0x7d,0x74,0x52,0x3f,0x8a,0x3d,0x38,0x89,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x04,0xe2,0x05,0x7d,0x00,0x2f,0x00,0x57,0x40,0x16,0x12,0x89, +0x1f,0x2c,0x89,0x05,0x1f,0x05,0x1f,0x05,0x24,0x31,0x19,0x18,0x18,0x00,0x0c,0x89,0x24,0x18,0x19,0x1c,0xb8,0x01,0x80,0x40,0x0f,0x15,0x0c,0x28,0x1f,0x15,0x19,0x15,0x19,0x15,0x00,0x09,0x9b,0x28,0x06,0x01,0xb8,0x01,0x81,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x11,0x33, +0x01,0x2f,0xed,0xc4,0x39,0x2f,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x33,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15, +0x10,0x00,0x21,0x64,0xcc,0x01,0x42,0x01,0xc7,0x56,0x94,0x56,0x57,0x7e,0x37,0x2e,0x43,0x4b,0xc1,0x86,0x61,0xc1,0x42,0x86,0x36,0x75,0x33,0x44,0x5c,0x76,0x3a,0x42,0x66,0xaf,0x66,0x81,0xe4,0x84,0xfd,0xd4,0xfe,0x7a,0xa7,0x01,0x9f,0x01,0x27,0x63,0xad,0x64,0x54,0x3c,0x17,0x39,0x1a,0x26,0x6b,0x3a,0x77,0xa7,0x77,0x76,0x55,0x50, +0x57,0x46,0x2f,0x3e,0x3d,0x1f,0x6e,0x3d,0x4f,0x8b,0x50,0x90,0xf5,0x8b,0xfe,0x94,0xfd,0xff,0x00,0x02,0x00,0x64,0xff,0xe5,0x04,0xed,0x05,0x7d,0x00,0x27,0x00,0x33,0x00,0x50,0x40,0x13,0x24,0x89,0x05,0x15,0x89,0x2e,0x05,0x2e,0x00,0x00,0x2e,0x05,0x03,0x35,0x28,0x0d,0x8a,0x1c,0x2b,0xb8,0x01,0x80,0x40,0x10,0x18,0x31,0x9b,0x12, +0x0f,0x12,0x18,0x12,0x18,0x12,0x00,0x09,0x9b,0x20,0x06,0x01,0xb8,0x01,0x80,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x17,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15, +0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x10,0x00,0x21,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x64,0x95,0x01,0x5e,0x01,0xef,0x73,0xcc,0x72,0x69,0xb8,0x6b,0x09,0x27,0x7d,0x4a,0x77,0xa0,0xa0,0x70,0x6e,0xc4,0x71,0x99,0x01,0x06, +0x92,0x9f,0x01,0x17,0xa2,0xfd,0xab,0xfe,0x61,0x79,0x11,0x53,0x31,0x2e,0x3b,0x46,0x2a,0x30,0x50,0x1b,0x9c,0x01,0xad,0x01,0x32,0x66,0xb3,0x68,0x5e,0xa2,0x5e,0x18,0x26,0x43,0x54,0x9a,0x69,0x6b,0x98,0x75,0xc9,0x6f,0x86,0xec,0x88,0x92,0xfd,0x8e,0xfe,0x8b,0xfd,0xfa,0x02,0xcb,0x1b,0x24,0x40,0x28,0x26,0x36,0x4c,0x00,0x00,0x01, +0x00,0xb4,0x00,0x00,0x04,0x5a,0x05,0x42,0x00,0x05,0x00,0x16,0x40,0x0a,0x01,0x04,0x89,0x05,0x05,0x18,0x03,0x9b,0x00,0x06,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xfd,0xc4,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x23,0xb4,0x03,0xa6,0xfd,0x02,0xa8,0x05,0x42,0x99,0xfb,0x57,0x00,0x00,0x01,0x00,0x82,0xff,0xe2,0x03,0xf2,0x05,0x62,0x00,0x16, +0x00,0x3b,0x40,0x1d,0x04,0x03,0x0c,0x08,0x89,0x13,0x12,0x0c,0x00,0x05,0x12,0x05,0x12,0x18,0x0f,0x89,0x00,0x0c,0x05,0x0b,0x0b,0x03,0x12,0x99,0x13,0x19,0x06,0x03,0x06,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0xed,0x11,0x33,0x33,0x31,0x30,0x13,0x34,0x12, +0x37,0x33,0x01,0x11,0x33,0x11,0x14,0x06,0x23,0x01,0x06,0x06,0x15,0x14,0x00,0x17,0x07,0x26,0x24,0x02,0x82,0xb1,0x9b,0x1b,0x01,0x62,0xa7,0x1e,0x13,0xfe,0x14,0x56,0x54,0x01,0x19,0xec,0x43,0xac,0xfe,0xe0,0x9f,0x02,0xe5,0xac,0x01,0x58,0x79,0xfe,0x8f,0x01,0x71,0xfd,0x5b,0x0b,0x13,0x01,0xf5,0x51,0xde,0x80,0xcd,0xfe,0xb1,0x51, +0x96,0x3b,0xf3,0x01,0x35,0x00,0x00,0x02,0x00,0x77,0xff,0xe8,0x04,0x41,0x05,0x48,0x00,0x0b,0x00,0x17,0x00,0x20,0x40,0x10,0x00,0x89,0x0c,0x0c,0x19,0x12,0x89,0x06,0x09,0x99,0x0f,0x06,0x15,0x99,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33, +0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0x41,0xfb,0xeb,0xea,0xfa,0xfa,0xea,0xeb,0xfb,0xab,0x9a,0xa1,0xa1,0x98,0x97,0xa2,0xa2,0x99,0x02,0x97,0xfe,0xa8,0xfe,0xa9,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x58,0xfe,0xa8,0xfe,0xa7,0x01,0x17,0x01,0x06,0xfe,0xf7,0xfe,0xec,0xfe,0xeb,0xfe,0xfc,0x01, +0x02,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x05,0x94,0x05,0x31,0x00,0x1d,0x00,0x21,0x00,0x2d,0x00,0x57,0x40,0x30,0x21,0x89,0x14,0x19,0x0a,0x89,0x2d,0x1e,0x2d,0x00,0x89,0x07,0x14,0x2d,0x03,0x07,0x17,0x17,0x07,0x03,0x2d,0x14,0x05,0x2f,0x26,0x89,0x11,0x09,0x23,0x9b,0x14,0x19,0x21,0x21,0x0d,0x18,0x20,0x9b,0x15,0x06,0x2a,0x99, +0x0d,0x18,0x04,0x99,0x03,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x35,0x32,0x36,0x35,0x10,0x21,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37, +0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x16,0x16,0x01,0x11,0x21,0x11,0x05,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x05,0x94,0xdd,0xae,0x68,0x78,0xfe,0xc6,0xd0,0xd0,0x6e,0xce,0x83,0x8d,0x7d,0x03,0x58,0xfe,0xfd,0x39,0x72,0xc5,0x75,0xfd,0x73,0xfe,0xfb,0x01,0x05,0xfe,0xc8,0x61,0x6f,0x56,0x85,0x3b,0x79,0x79,0x01, +0xc0,0xc9,0xf5,0x02,0x95,0x92,0x89,0x01,0x04,0xd5,0xff,0xe0,0x88,0xe7,0x71,0x86,0xb7,0x13,0x02,0x01,0x94,0xfe,0xab,0x65,0xb8,0x01,0x1d,0x01,0x55,0xfe,0xab,0x94,0x72,0x62,0x49,0x9c,0x66,0xad,0xbe,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x05,0xf0,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x62,0xb4,0x23,0x89,0x0d,0x13,0x16,0xb8,0x01, +0x84,0x40,0x0f,0x2f,0x2a,0x89,0x04,0x00,0x0d,0x2f,0x04,0x04,0x2f,0x0d,0x00,0x04,0x3c,0x35,0xbe,0x01,0x84,0x00,0x1c,0x00,0x32,0x01,0x7e,0x00,0x13,0x00,0x38,0x01,0x7e,0x40,0x12,0x19,0x08,0x27,0x27,0x19,0x13,0x19,0x13,0x19,0x01,0x10,0x9b,0x20,0x06,0x2d,0x99,0x01,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11, +0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15, +0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xf0,0xfb,0xe3,0xc7,0xa3,0x45,0x70,0x90,0x96,0x90,0x70,0x45,0xb7,0x9b,0x4d,0x6f,0x33,0x84,0x7d,0x98,0x6d,0x69,0x8b,0x89,0xda,0x88,0xe2,0x01,0x16,0x83,0xf2,0xad,0x8d,0x70,0x56,0x82,0x04,0x04,0xfb,0xcf,0x46,0x2d,0x2f,0x44,0x43,0x30,0x2f, +0x44,0x60,0x6e,0x4a,0x61,0x42,0x2e,0x2d,0x36,0x52,0x7a,0x5a,0x90,0xa5,0x30,0x2f,0x04,0x80,0x7c,0x61,0x8a,0x97,0x6a,0x7d,0xe0,0x76,0xf2,0xc9,0x8a,0xd0,0x79,0x2e,0x25,0x3f,0x2c,0x2e,0x23,0x02,0xbf,0x31,0x47,0x48,0x30,0x33,0x45,0x45,0x00,0x01,0x00,0x8c,0x00,0x00,0x05,0xd1,0x05,0x31,0x00,0x20,0x00,0x51,0x40,0x2b,0x16,0x0c, +0x89,0x0d,0x1f,0x1c,0x89,0x05,0x14,0x00,0x05,0x0d,0x01,0x05,0x05,0x01,0x0d,0x03,0x22,0x10,0x89,0x11,0x02,0x1f,0x99,0x01,0x08,0x9b,0x16,0x01,0x19,0x19,0x12,0x01,0x18,0x15,0x0f,0x9b,0x12,0x06,0x0d,0x11,0x18,0x00,0x3f,0x33,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f, +0x2f,0x2f,0x11,0x39,0x39,0x10,0xed,0x32,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x05,0xd1,0xfd,0xf0,0x61,0x84,0x7b,0x6b,0x47,0x54,0x3d,0xa8,0xfe,0xf4,0xa8,0x02,0xce,0x72, +0x3e,0x64,0x45,0xa8,0xd7,0x45,0x38,0x01,0x00,0x95,0x0d,0xbe,0x7a,0x81,0x9b,0x1e,0x32,0xfd,0x5a,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfe,0xb5,0x20,0x19,0xe8,0xaf,0x5e,0xbf,0x43,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x05,0xa3,0x05,0x31,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x50,0x40,0x2b,0x18,0x89,0x0c,0x11,0x02,0x89,0x24,0x15, +0x24,0x00,0x89,0x12,0x0c,0x24,0x0f,0x12,0x12,0x0f,0x24,0x0c,0x04,0x26,0x1e,0x89,0x09,0x01,0x1a,0x9b,0x11,0x0c,0x18,0x18,0x05,0x10,0x17,0x9b,0x13,0x0d,0x06,0x21,0x99,0x05,0x18,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10, +0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x21,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x33,0x01,0x11,0x21,0x11,0x05,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x05,0xa3,0xfe,0x20,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x02,0xd0,0x6d,0x01,0x38,0xa8,0xfd,0x78,0xfe,0xed, +0x01,0x13,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0x02,0xb4,0x90,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0x94,0xfe,0xab,0x01,0xe9,0xfe,0x17,0x01,0x55,0xfe,0xab,0x94,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0x00,0x01,0x00,0x8c,0xfd,0xb9,0x07,0x18,0x07,0x21,0x00,0x34,0x00,0x62,0x40,0x35,0x19,0x89,0x1a,0x1f, +0x15,0x89,0x16,0x24,0x8a,0x0f,0x34,0x8a,0x00,0x1d,0x16,0x0f,0x1a,0x16,0x0f,0x00,0x00,0x0f,0x16,0x1a,0x04,0x36,0x08,0x89,0x2c,0x1e,0x18,0x9b,0x1b,0x04,0x9b,0x30,0x1b,0x12,0x9b,0x1f,0x21,0x00,0x21,0x00,0x1a,0x1b,0x06,0x0c,0x99,0x28,0x16,0x1a,0x18,0x00,0x3f,0x33,0xd4,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x39,0xed,0x10,0xd4, +0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x02,0x02,0x24,0x23,0x22,0x04,0x02,0x11,0x10,0x12,0x04,0x33,0x20,0x00,0x11,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x33,0x32,0x16, +0x15,0x14,0x02,0x04,0x23,0x20,0x00,0x02,0x11,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x13,0x06,0x76,0x07,0xa4,0xfe,0xde,0xba,0xd3,0xfe,0xc7,0xad,0x9d,0x01,0x1e,0xc8,0x01,0x0b,0x01,0x2e,0x5d,0x4f,0x70,0x37,0xa8,0xee,0xa8,0x02,0xb0,0x72,0x53,0x55,0xa1,0xae,0xb5,0xfe,0xb2,0xd6,0xfe,0xff,0xfe,0x93,0xc3,0xd3,0x01,0x8c,0x01,0x10, +0xe3,0x01,0x63,0xcb,0x0c,0x03,0x1d,0x01,0x03,0x01,0x91,0xdc,0xf7,0xfe,0x22,0xfe,0xbc,0xfe,0xb2,0xfe,0x1c,0xf5,0x01,0x6b,0x01,0x4f,0x72,0x8c,0x51,0xfe,0x4c,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfd,0xaa,0x51,0xe9,0xdd,0xed,0xfe,0x96,0xc2,0x01,0x18,0x02,0x22,0x01,0x81,0x01,0x71,0x02,0x22,0x01,0x1a,0xfe,0xfe,0x2c,0xfe,0xce, +0x00,0x03,0x00,0x50,0x00,0x00,0x07,0x45,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x3e,0x00,0x7a,0x40,0x44,0x3e,0x89,0x2d,0x03,0x23,0x89,0x3a,0x3b,0x3a,0x06,0x1d,0x89,0x1e,0x10,0x0d,0x89,0x17,0x2d,0x3a,0x1e,0x01,0x13,0x17,0x12,0x12,0x17,0x13,0x01,0x1e,0x3a,0x2d,0x07,0x40,0x34,0x89,0x2a,0x14,0x10,0x99,0x13,0x19,0x9b,0x06,0x13, +0x0a,0x0a,0x2e,0x13,0x18,0x22,0x30,0x9b,0x03,0x2d,0x3e,0x3e,0x26,0x02,0x3d,0x9b,0x2e,0x06,0x37,0x99,0x26,0x18,0x1e,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32, +0x10,0xed,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x15,0x23,0x11,0x16,0x16,0x17,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x21,0x35,0x36,0x36,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x01,0x23,0x22,0x06,0x06,0x15, +0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x21,0x11,0x04,0x30,0x6d,0x52,0x75,0x32,0x23,0x50,0x53,0x48,0x94,0xaf,0x3a,0x30,0xa2,0xfe,0xc3,0x28,0x33,0xa1,0x59,0x64,0xa8,0x49,0x51,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x01,0xbb,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0xfe,0xed,0x05,0x31,0x94,0xfe,0xa9,0x0a,0x43,0x40,0x42,0x4d, +0x23,0xd1,0xab,0x64,0xbb,0x3b,0x95,0x93,0x39,0xb3,0x58,0x01,0x00,0x9f,0x95,0xfe,0x5d,0x01,0x94,0x82,0x7e,0x18,0x88,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0xfd,0x83,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0xff,0x01,0x55,0xfe,0xab,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x05,0x5f,0x05,0x31,0x00,0x1a,0x00,0x26, +0x00,0x41,0x40,0x23,0x0f,0x89,0x1b,0x02,0x89,0x03,0x1b,0x03,0x00,0x00,0x03,0x1b,0x03,0x28,0x09,0x21,0x89,0x15,0x1e,0x9b,0x09,0x0c,0x0c,0x12,0x01,0x05,0x9b,0x19,0x06,0x24,0x99,0x12,0x18,0x03,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10, +0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x02,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x11,0x34,0x12,0x24,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x5f,0xab,0xa8,0xed,0x99,0xf7,0x90,0x08,0x2c,0x88,0x44,0x96,0xb7,0xbe,0x91,0xcb,0xd2,0xbd,0x01,0x47,0xc3, +0x02,0x48,0xfd,0x32,0x63,0x45,0x47,0x77,0x2a,0x0a,0x79,0x6b,0x44,0x5e,0x04,0x9d,0xfb,0x63,0x04,0x9d,0x8d,0xfe,0xfc,0xa8,0x2b,0x33,0xbf,0x9c,0x9e,0xc8,0x01,0x21,0x01,0x1e,0xd0,0x01,0x5e,0xc3,0xfc,0x27,0x54,0x82,0x3c,0x30,0x8d,0xa0,0x74,0x00,0x00,0x03,0x00,0x32,0xff,0x00,0x06,0xe6,0x05,0x31,0x00,0x2a,0x00,0x34,0x00,0x40, +0x00,0x78,0x40,0x2c,0x29,0x01,0x89,0x02,0x28,0x89,0x11,0x04,0x89,0x2b,0x14,0x17,0x89,0x35,0x3b,0x8a,0x1e,0x0f,0x11,0x2b,0x02,0x11,0x2b,0x35,0x1e,0x1e,0x35,0x2b,0x11,0x02,0x05,0x42,0x2f,0x89,0x0b,0x2a,0x06,0x04,0x2c,0x9b,0x0e,0x28,0x0e,0x3e,0xb8,0x01,0x80,0x40,0x13,0x1a,0x14,0x1a,0x22,0x0e,0x1a,0x0e,0x1a,0x07,0x38,0x9b, +0x22,0x06,0x32,0x99,0x07,0x19,0x02,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x06, +0x00,0x21,0x22,0x24,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x35,0x34,0x02,0x27,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x07,0x33,0x11,0x01,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x24,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0xe6,0xa8,0xfb,0x59, +0xfe,0x6c,0xfe,0xef,0x8d,0xfe,0xfd,0x83,0xba,0x9a,0x03,0x3c,0x07,0x80,0x78,0x25,0x1b,0xbf,0x92,0x5f,0x97,0x56,0x66,0xc1,0x84,0xb7,0x01,0x0d,0x92,0x06,0xcf,0xfe,0x58,0xfc,0xcb,0x36,0x43,0xd2,0xc5,0xaf,0x01,0x06,0xc9,0x67,0x44,0x44,0x66,0x60,0x4a,0x4b,0x60,0x05,0x31,0xf9,0xf9,0x01,0xdc,0xf9,0xfe,0xf3,0x6e,0xb8,0x75,0x74, +0x8c,0x60,0x31,0xb9,0x01,0x09,0x46,0x25,0x52,0x36,0xa2,0xc1,0x55,0x9f,0x70,0x6d,0xa9,0x5f,0xad,0xfe,0xb1,0xee,0x30,0x48,0x03,0x96,0xfb,0xd5,0x4b,0x35,0x74,0x7d,0xb6,0x03,0x30,0x53,0x7f,0x7d,0x55,0x52,0x6c,0x6e,0x00,0x04,0x00,0x50,0xff,0xe4,0x07,0x4d,0x05,0x31,0x00,0x30,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x91,0x40,0x50, +0x40,0x89,0x20,0x13,0x15,0x08,0x41,0x26,0x03,0x03,0x23,0x23,0x03,0x25,0x15,0x89,0x3c,0x3d,0x3c,0x44,0x8a,0x11,0x0b,0x8a,0x49,0x30,0x00,0x2d,0x8a,0x03,0x00,0x49,0x03,0x20,0x3c,0x11,0x49,0x03,0x03,0x49,0x11,0x3c,0x20,0x05,0x4e,0x36,0x89,0x1d,0x14,0x32,0x9b,0x25,0x20,0x40,0x40,0x19,0x23,0x3f,0x9b,0x21,0x06,0x9b,0x08,0x41, +0x29,0x29,0x0e,0x21,0x06,0x39,0x99,0x19,0x18,0x47,0x99,0x0e,0x18,0x00,0x30,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33, +0x10,0xed,0x32,0x11,0x39,0x2f,0x12,0x17,0x39,0x12,0x39,0x10,0xed,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x07, +0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x23,0x11,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x26,0x06,0x43,0x2d,0x3b,0x87,0x73,0x4d,0x42,0x69,0x78,0x88,0x79,0x80,0x9b,0x31,0x9b,0x4b,0xa2,0x87,0x7f,0xc8,0x72,0x72,0x6c,0x02,0xbc,0x6d,0xea,0x3f,0xa8,0x61,0x72,0xc0,0x6c,0x47,0x3d, +0xfc,0x0c,0x63,0x95,0x9b,0x46,0x9c,0x86,0x65,0x52,0xff,0x02,0xf9,0x25,0x20,0x44,0x30,0x62,0x2a,0x46,0x2c,0x43,0xff,0x70,0xca,0xca,0x47,0x35,0xdf,0x8e,0xb4,0xd5,0xe1,0xc0,0x8d,0x86,0x90,0xd0,0xe5,0x6f,0x70,0xd5,0x92,0x86,0xa4,0x2a,0x02,0x06,0x94,0xfe,0xab,0x57,0x65,0x83,0xeb,0x99,0xa0,0xfe,0xda,0x53,0x02,0xd0,0x28,0x5d, +0x5c,0x93,0xab,0xc1,0xf3,0xff,0x01,0x55,0xfe,0xab,0x98,0x33,0x7c,0x65,0x74,0x93,0xf1,0x47,0x80,0x5a,0x00,0x02,0x00,0x72,0xff,0xe5,0x05,0x5b,0x04,0xc9,0x00,0x0f,0x00,0x1f,0x00,0x23,0x40,0x0d,0x0c,0x8b,0x1c,0x1c,0x21,0x14,0x8b,0x04,0x10,0x9b,0x08,0x06,0x18,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f, +0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x02,0xe6,0xa6,0xfe,0xdc,0xaa,0xa9,0x01,0x25,0xa6,0xa8,0x01,0x24,0xa9,0xa9,0xfe,0xdb,0xa7,0x7f,0xda,0x80,0x7f,0xda,0x80,0x7f, +0xda,0x80,0x80,0xd9,0x1b,0xa6,0x01,0x21,0xab,0xa9,0x01,0x22,0xa7,0xa7,0xfe,0xdd,0xa8,0xa8,0xfe,0xdd,0xa7,0x04,0x5b,0x7f,0xdf,0x81,0x80,0xdd,0x7e,0x7d,0xdd,0x81,0x81,0xe0,0x7e,0x00,0x00,0x01,0x00,0x74,0xff,0xe6,0x06,0x74,0x04,0xc9,0x00,0x1b,0x00,0x3e,0xb4,0x07,0x06,0x15,0x16,0x12,0xb8,0x01,0x85,0x40,0x0a,0x18,0x06,0x16, +0x18,0x18,0x16,0x06,0x03,0x1d,0x04,0xb8,0x01,0x85,0x40,0x0b,0x0a,0x00,0x9b,0x0e,0x06,0x16,0x06,0x06,0x15,0x07,0x19,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x22,0x04,0x06,0x15,0x10,0x05,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32, +0x04,0x12,0x15,0x14,0x02,0x07,0x27,0x24,0x11,0x34,0x26,0x24,0x03,0x74,0xaa,0xfe,0xe8,0xa0,0x01,0x32,0x62,0xaf,0xbf,0xc1,0x01,0x61,0xde,0xe0,0x01,0x60,0xc0,0xbf,0xb0,0x61,0x01,0x31,0xa0,0xfe,0xea,0x04,0x33,0x89,0xef,0x88,0xfe,0xef,0xc2,0x7a,0x6a,0x01,0x37,0xac,0xb7,0x01,0x32,0xad,0xaf,0xfe,0xcf,0xb6,0xac,0xfe,0xc8,0x69, +0x7a,0xc2,0x01,0x11,0x88,0xef,0x89,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x06,0x3d,0x04,0xdc,0x00,0x1e,0x00,0x2a,0x00,0x45,0xb9,0x00,0x19,0x01,0x85,0x40,0x12,0x05,0x08,0x0a,0x8b,0x1f,0x25,0x8b,0x11,0x05,0x1f,0x11,0x11,0x1f,0x05,0x03,0x2c,0x00,0x28,0xb8,0x01,0x80,0x40,0x0c,0x08,0x0e,0x0e,0x15,0x00,0x99,0x1e,0x18,0x22,0x9b, +0x15,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x37,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x21,0x01,0x34,0x26,0x27, +0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x60,0x03,0x61,0x87,0xe4,0x72,0xb2,0x8d,0x2c,0x4e,0x81,0x4b,0x72,0x9c,0x66,0xb0,0x5f,0x99,0x01,0x21,0xab,0x9b,0xfe,0xcd,0xae,0xfc,0x9f,0x03,0x91,0x31,0x2f,0x40,0x57,0x4b,0x32,0x33,0x47,0x97,0x7d,0xd7,0x8e,0x95,0xf7,0x31,0x44,0x45,0x42,0x81,0x4b,0x9f,0x73,0x55,0x88,0x4e,0xac,0xfe, +0xe0,0xa5,0xb1,0xfe,0xee,0xa8,0x03,0xb1,0x28,0x4e,0x1f,0x0b,0x57,0x33,0x33,0x47,0x47,0x00,0x00,0x01,0x00,0x58,0xff,0xe7,0x03,0xcf,0x04,0xc9,0x00,0x28,0x00,0x53,0x40,0x2c,0x23,0x8b,0x17,0x00,0x8b,0x0e,0x26,0x0e,0x12,0x17,0x0e,0x0e,0x17,0x12,0x03,0x2a,0x1c,0x1d,0x07,0x06,0x06,0x07,0x26,0x12,0x9b,0x13,0x1d,0x1c,0x07,0x13, +0x1c,0x1c,0x13,0x07,0x03,0x1f,0x0a,0x99,0x04,0x19,0x1a,0x9b,0x1f,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x39,0x11,0x33,0x01,0x2f,0x33,0xc6,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36, +0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x03,0xcf,0x75,0xca,0x7b,0xd9,0xe4,0x5a,0x65,0xab,0x53,0x51,0x81,0x4b,0x96,0x77,0xb6,0xb6,0x77,0x83,0x98,0x7d,0x7f,0x95,0x5c,0xa8,0xe6,0x72,0xba,0x68,0x49,0x50,0x4e,0x5e,0x01,0x54, +0x60,0xab,0x62,0xc6,0x7b,0x5b,0x50,0x39,0x64,0x3a,0x60,0x74,0x8d,0x6b,0x58,0x50,0x6d,0x74,0x64,0xa4,0x58,0x9a,0x5a,0x5f,0x84,0x2d,0x2a,0x98,0x00,0x02,0x00,0x73,0xff,0xe8,0x05,0x9f,0x04,0xec,0x00,0x0b,0x00,0x32,0x00,0x66,0x40,0x36,0x16,0x8b,0x0f,0x13,0x12,0x1d,0x8b,0x03,0x08,0x8b,0x23,0x2a,0x2b,0x1a,0x12,0x25,0x03,0x23, +0x0f,0x12,0x03,0x23,0x2b,0x2b,0x23,0x03,0x12,0x0f,0x05,0x34,0x2e,0x8b,0x28,0x2b,0x2a,0x06,0x9b,0x0c,0x1a,0x26,0x0c,0x20,0x2a,0x0c,0x2a,0x0c,0x13,0x00,0x9a,0x20,0x19,0x12,0x13,0x06,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, +0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x13,0x24,0x36,0x37,0x26,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x24,0x11,0x34,0x37,0x17,0x06,0x06, +0x15,0x14,0x16,0x16,0x17,0x02,0xfe,0x33,0x47,0x47,0x33,0x35,0x45,0x48,0x30,0x01,0x17,0xee,0x05,0x05,0x58,0x51,0x3e,0x7e,0x8b,0x6c,0xca,0xb8,0x27,0x39,0x9d,0x76,0x77,0x9b,0x37,0x27,0xfe,0x29,0x8a,0x5c,0x31,0x1d,0x5c,0xbf,0xb0,0x72,0x44,0x38,0x29,0x4d,0x0e,0x0f,0x4d,0x28,0x39,0x43,0x01,0xa6,0x3b,0xb0,0x7e,0x4f,0x77,0x31, +0x74,0x3c,0xc2,0x6d,0x74,0xaf,0x7d,0x33,0x1e,0x62,0x40,0x6f,0x97,0x98,0x6e,0x37,0x67,0x21,0x67,0x01,0x46,0xa9,0x71,0x66,0x2f,0x59,0x2c,0x4d,0x79,0x54,0x20,0x00,0x00,0x02,0x00,0x5d,0xff,0xc0,0x06,0x59,0x04,0xcd,0x00,0x33,0x00,0x3e,0x00,0x7f,0xb9,0x00,0x1a,0x01,0x84,0x40,0x0a,0x19,0x0a,0x8b,0x34,0x13,0x20,0x3a,0x8b,0x04, +0x00,0xb8,0x01,0x84,0x40,0x14,0x2c,0x02,0x0d,0x20,0x03,0x34,0x2c,0x04,0x2f,0x19,0x34,0x04,0x2f,0x2f,0x04,0x34,0x19,0x04,0x40,0x28,0xb8,0x01,0x84,0x40,0x0c,0x29,0x00,0x2c,0x28,0x2f,0x9b,0x30,0x06,0x29,0x28,0x19,0x3c,0xb8,0x01,0x81,0x40,0x0f,0x02,0x0d,0x25,0x19,0x25,0x19,0x07,0x16,0x99,0x1d,0x19,0x37,0x9b,0x07,0x06,0x00, +0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x39,0xed,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x02,0x17, +0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x27,0x2e,0x03,0x23,0x22,0x00,0x03,0x27,0x36,0x12,0x37,0x26,0x26,0x27,0x37,0x1e,0x02,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x36,0x02,0xbd,0x38,0x3a,0x51,0xa3,0x85,0x80,0xa1,0x6e,0x69,0x30,0x3f,0x2b,0x17,0x0b,0x11,0x05,0x24,0x20,0x29,0x31, +0x0e,0x8b,0x13,0x83,0x63,0x5e,0x79,0x13,0x1d,0x2d,0x40,0x49,0x33,0xe0,0xfe,0xc2,0x66,0x8f,0x3d,0xf0,0xa3,0x2d,0xc1,0x7c,0x21,0x55,0xba,0x9b,0x02,0x01,0x57,0x37,0x38,0x53,0x5e,0x51,0x6a,0x02,0xc8,0x0f,0x06,0x59,0x6d,0x7f,0xa4,0x9e,0x75,0x5e,0x91,0x27,0x25,0x65,0x82,0x82,0x43,0x44,0x16,0x1f,0x5a,0x61,0x18,0x96,0xa0,0x7f, +0x79,0xb5,0x7a,0x4d,0x21,0xfe,0xd0,0xfe,0xc7,0x25,0xdd,0x01,0x4f,0x55,0x9a,0xe7,0x32,0x88,0x14,0x90,0xdb,0x5f,0x38,0x54,0x55,0x41,0x64,0x3f,0x07,0x62,0x00,0x01,0x00,0x73,0x00,0x00,0x05,0xa9,0x04,0xbe,0x00,0x1e,0x00,0x38,0x40,0x1d,0x02,0x00,0x0a,0x13,0x1a,0x1a,0x13,0x0a,0x03,0x20,0x0e,0x17,0x8a,0x04,0x00,0x02,0x14,0x9b, +0x11,0x11,0x08,0x19,0x99,0x1c,0x18,0x0b,0x9b,0x08,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x21,0x21,0x15, +0x21,0x22,0x26,0x73,0xa7,0xa7,0x5c,0xa0,0x5f,0x97,0x7f,0x66,0x6a,0x97,0x7b,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0x01,0x04,0x03,0x8f,0xfc,0x56,0xbc,0xd0,0x01,0x42,0xbd,0x6b,0x6b,0xbe,0x50,0x8c,0x4f,0x92,0x59,0x54,0x5a,0x6f,0x97,0x77,0x61,0xb0,0x97,0xa8,0x00,0x00,0x01,0x00,0x70,0xff,0xe5,0x04,0x44,0x04,0xc9,0x00,0x2e,0x00,0x54, +0xb3,0x04,0x8a,0x03,0x22,0xb8,0x01,0x85,0x40,0x0d,0x14,0x1a,0x8b,0x1b,0x03,0x14,0x1b,0x1b,0x14,0x03,0x03,0x30,0x2c,0xb8,0x01,0x85,0x40,0x11,0x0b,0x2c,0x07,0x03,0x14,0x1b,0x1e,0x03,0x1b,0x03,0x1b,0x07,0x17,0x9b,0x1e,0x06,0x00,0xb8,0x01,0x80,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39, +0x11,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x32,0x36,0x37,0x33,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x0e,0x03,0x07,0x0e,0x02,0x15,0x14,0x16,0x02,0x56, +0x95,0xa1,0x16,0xa2,0x18,0xfe,0xff,0xd5,0x8b,0xdf,0x7c,0x2e,0x5c,0x9a,0x95,0x8b,0x6f,0x3b,0xa5,0x6e,0x75,0x97,0x0d,0x9b,0xf9,0xbb,0x7b,0xc6,0x72,0x24,0x3d,0x59,0x6f,0x81,0x94,0x71,0x3e,0xad,0x7d,0x7c,0x7b,0xbd,0xd2,0x56,0x9e,0x6b,0x49,0x71,0x54,0x42,0x22,0x20,0x32,0x44,0x32,0x4c,0x6a,0x74,0x68,0xa1,0xd0,0x59,0x9b,0x53, +0x40,0x5f,0x48,0x33,0x27,0x1e,0x21,0x35,0x4d,0x38,0x5f,0x6c,0x00,0x01,0x00,0x74,0xff,0xe7,0x06,0x8b,0x04,0xc9,0x00,0x20,0x00,0x42,0xb1,0x03,0x06,0xb8,0x01,0x85,0x40,0x0c,0x1d,0x12,0x20,0x1d,0x01,0x01,0x1d,0x20,0x12,0x04,0x22,0x15,0xb8,0x01,0x85,0xb5,0x0e,0x12,0x11,0x11,0x00,0x19,0xb8,0x01,0x81,0xb6,0x0a,0x19,0x20,0x03, +0x9b,0x00,0x06,0x00,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x15,0x21,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x02,0x27,0x03,0x21,0x03, +0x6a,0xfd,0xd4,0x7c,0x81,0xa4,0xfe,0xd4,0xa4,0xa4,0xfe,0xd3,0xa3,0x7c,0x6e,0x5b,0x4d,0x58,0x7c,0xdb,0x7d,0x7c,0xdc,0x7c,0xdb,0xc0,0x04,0xc9,0x8b,0x5d,0xfb,0x91,0xa9,0xfe,0xe8,0xad,0xad,0x01,0x19,0xa8,0x92,0xfb,0x5a,0x6e,0x40,0xc9,0x70,0x7d,0xd3,0x7b,0x7b,0xd4,0x7c,0xae,0x01,0x02,0x3b,0x00,0x00,0x01,0x00,0x73,0x00,0x00, +0x05,0xa9,0x04,0xbe,0x00,0x1e,0x00,0x38,0x40,0x1d,0x1d,0x1b,0x16,0x0e,0x04,0x04,0x0e,0x16,0x03,0x20,0x08,0x12,0x8a,0x00,0x1b,0x1d,0x0f,0x9b,0x0c,0x0c,0x03,0x14,0x99,0x17,0x18,0x06,0x9b,0x03,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x31,0x30, +0x13,0x34,0x36,0x33,0x21,0x15,0x21,0x20,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x34,0x37,0x26,0x73,0xcf,0xbd,0x03,0xaa,0xfc,0x71,0xfe,0xfc,0x43,0x7a,0x55,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0xd0,0x7f,0x97,0x60,0xa0,0x5b,0xa7,0xa7,0x03,0x7b,0x99,0xaa,0x98,0xb0,0x3c, +0x64,0x38,0x96,0x70,0x59,0xa8,0x97,0x50,0x8b,0x50,0xbd,0x6b,0x6b,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x05,0x05,0x04,0xac,0x00,0x0f,0x00,0x1f,0x00,0x23,0x40,0x0d,0x00,0x8a,0x10,0x10,0x21,0x18,0x8a,0x08,0x14,0x9b,0x0c,0x06,0x1c,0xb8,0x01,0x81,0xb1,0x04,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31, +0x30,0x01,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x07,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x05,0x05,0x9b,0xfe,0xf4,0x9b,0x9c,0xfe,0xf6,0x9b,0x9a,0x01,0x0d,0x9a,0x9a,0x01,0x0c,0x9c,0xa5,0x6c,0xc0,0x71,0x70,0xc1,0x6c,0x6e,0xbe,0x71,0x70,0xbf,0x6e, +0x02,0x55,0xa2,0xfe,0xea,0x9d,0x9f,0x01,0x14,0xa2,0xa1,0x01,0x16,0xa0,0xa0,0xfe,0xe9,0xa0,0x73,0xc9,0x76,0x76,0xca,0x72,0x74,0xc9,0x74,0x73,0xca,0x00,0x00,0x01,0x00,0x82,0xff,0xfd,0x05,0x1b,0x04,0xac,0x00,0x1d,0x00,0x37,0x40,0x1c,0x13,0x12,0x03,0x04,0x00,0x8a,0x07,0x12,0x04,0x07,0x07,0x04,0x12,0x03,0x1f,0x0f,0x8a,0x16, +0x0b,0x9b,0x1a,0x06,0x04,0x12,0x12,0x03,0x13,0x18,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x07,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04, +0x12,0x05,0x1b,0xc2,0x8b,0x4a,0x68,0x8a,0x75,0xc4,0x6f,0x70,0xc5,0x72,0x8e,0x63,0x49,0x8d,0xc0,0xa0,0x01,0x10,0x9c,0x9d,0x01,0x11,0x9f,0x02,0x55,0xb8,0xfe,0xa6,0x46,0x93,0x37,0x01,0x08,0x86,0x72,0xcb,0x75,0x77,0xc9,0x72,0x8b,0xfe,0xf9,0x34,0x92,0x47,0x01,0x59,0xb8,0xa0,0x01,0x18,0x9f,0xa1,0xfe,0xe8,0x00,0x01,0x00,0x64, +0x00,0x00,0x04,0x54,0x04,0xac,0x00,0x25,0x00,0x44,0x40,0x0f,0x17,0x18,0x00,0x8a,0x0b,0x18,0x0b,0x18,0x0b,0x27,0x12,0x89,0x05,0x1e,0x15,0xb8,0x01,0x81,0x40,0x0c,0x18,0x17,0x1a,0x17,0x1a,0x17,0x05,0x0f,0x9b,0x22,0x06,0x06,0xb8,0x01,0x81,0xb1,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x01, +0x2f,0xc4,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x04,0x23,0x21,0x35,0x21,0x32,0x37,0x24,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x04,0x54,0x9c,0xfe,0xef,0x9f,0xfe,0x5c,0x01,0xa4,0x3c,0x4d, +0x01,0x1e,0x73,0xc4,0x70,0x54,0x80,0x7d,0x57,0x5c,0x3f,0x75,0x62,0xae,0x64,0xb0,0x66,0x66,0xb0,0x64,0xa8,0x01,0x0d,0x97,0x02,0x55,0x9d,0xfe,0xea,0xa2,0xa4,0x1b,0x64,0x01,0x32,0x72,0xca,0x76,0x7c,0x59,0x55,0x7f,0x44,0x72,0x77,0x66,0xae,0x65,0x64,0xb1,0x65,0x9b,0xfe,0xec,0x00,0x02,0x00,0x82,0xff,0xdd,0x04,0xa3,0x04,0xac, +0x00,0x32,0x00,0x3c,0x00,0x7a,0x40,0x21,0x1e,0x1f,0x1f,0x13,0x1a,0x8a,0x25,0x2c,0x8a,0x13,0x03,0x11,0x35,0x03,0x25,0x2e,0x13,0x00,0x25,0x13,0x00,0x00,0x13,0x25,0x03,0x3e,0x3a,0x8a,0x0a,0x38,0x9b,0x0e,0x1c,0xb8,0x01,0x81,0x40,0x12,0x22,0x1f,0x1e,0x11,0x35,0x2e,0x03,0x04,0x06,0x0e,0x22,0x1e,0x1e,0x22,0x0e,0x03,0x28,0x33, +0xb8,0x01,0x81,0xb2,0x06,0x18,0x30,0xb8,0x01,0x81,0xb5,0x00,0x19,0x17,0x9b,0x28,0x06,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x33,0x31,0x30, +0x05,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x05,0x32,0x37,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x04,0xa3,0x54, +0x6c,0x6b,0x58,0xb2,0x92,0x57,0xa4,0x5f,0x57,0x99,0x5d,0x73,0xee,0x48,0x3b,0x65,0xae,0x66,0x2d,0x3a,0x65,0x36,0x2f,0x56,0x20,0x6b,0x32,0x70,0x97,0x97,0x6a,0x8d,0xff,0x9c,0x70,0x46,0x38,0x0c,0x26,0xfd,0x55,0xc5,0x55,0x3c,0xad,0x51,0xa6,0x6d,0x23,0x33,0x61,0x45,0x2c,0x4e,0x81,0x46,0x53,0x7c,0x42,0x6f,0x55,0x53,0xbe,0x6e, +0xbd,0x69,0x30,0x27,0x58,0x41,0x68,0x35,0x47,0x8e,0x6d,0x66,0x96,0x9e,0xfe,0xf1,0x96,0xe1,0x9a,0x51,0x09,0x02,0x4f,0x43,0x4b,0x64,0x36,0x43,0x00,0x03,0x00,0x6e,0xff,0xf3,0x05,0x8a,0x04,0xc1,0x00,0x26,0x00,0x30,0x00,0x3c,0x00,0x72,0x40,0x39,0x37,0x8a,0x11,0x26,0x26,0x22,0x1b,0x8a,0x27,0x0b,0x8a,0x31,0x05,0x8a,0x22,0x2f, +0x15,0x11,0x13,0x1d,0x27,0x08,0x31,0x22,0x11,0x27,0x31,0x22,0x22,0x31,0x27,0x11,0x04,0x3e,0x2c,0x8b,0x15,0x26,0x9b,0x00,0x06,0x34,0x9b,0x13,0x08,0x0e,0x1d,0x2f,0x18,0x1f,0x1f,0x0e,0x29,0x9b,0x18,0x06,0x3a,0xb8,0x01,0x81,0xb1,0x0e,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x39,0xed,0x3f,0xed, +0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x10,0xed,0x31,0x30,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x36,0x36, +0x35,0x34,0x26,0x26,0x27,0x05,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xfe,0x51,0x90,0x6c,0x3f,0xca,0xb8,0x25,0x37,0xbb,0x8f,0x8d,0xbd,0x48,0xfe,0x56,0x92,0x69,0x67,0x95,0xc1,0x82,0xf3,0xf0,0xdd,0x3a,0x5e,0x74,0xfd,0xe6,0x33,0x24,0x25,0x3f,0x33,0x88, +0x02,0x00,0x60,0x46,0x45,0x61,0x5d,0x49,0x4b,0x5b,0x04,0xc1,0x0c,0x1f,0x44,0x78,0x64,0x87,0xce,0x46,0x23,0x63,0x38,0x88,0xa2,0xa7,0x83,0x6f,0x45,0x9b,0x01,0x45,0x69,0x92,0x95,0x67,0xa8,0x49,0x61,0x24,0x3f,0xa0,0x63,0x3a,0x42,0x1f,0x06,0x61,0x27,0x37,0x39,0x25,0x5c,0x3c,0x2d,0xfd,0xc2,0x39,0x51,0x4e,0x3c,0x35,0x45,0x45, +0x00,0x03,0x00,0x82,0xff,0xdc,0x05,0xd8,0x04,0xac,0x00,0x35,0x00,0x3e,0x00,0x47,0x00,0x99,0x40,0x4a,0x00,0x8b,0x36,0x04,0x8b,0x0b,0x3b,0x8b,0x30,0x22,0x21,0x21,0x1e,0x18,0x18,0x3f,0x08,0x08,0x0b,0x2c,0x0f,0x8a,0x3f,0x1e,0x8b,0x25,0x02,0x36,0x2e,0x0d,0x3d,0x03,0x0b,0x30,0x36,0x0b,0x30,0x3f,0x25,0x25,0x3f,0x30,0x0b,0x36, +0x05,0x49,0x42,0x8b,0x15,0x3f,0x0f,0x9b,0x18,0x3d,0x2e,0x33,0x02,0x0d,0x2c,0x2c,0x07,0x39,0x9b,0x33,0x06,0x21,0x22,0x22,0x12,0x1b,0x9b,0x28,0x06,0x45,0xb8,0x01,0x80,0xb2,0x12,0x18,0x08,0xb8,0x01,0x80,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x39,0x39,0x12,0x39,0x39, +0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x10,0xed,0x10,0xed,0x32,0x11,0x39,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x07,0x16,0x15,0x14,0x06,0x07,0x27,0x32,0x36,0x35,0x34,0x27,0x06,0x07,0x06,0x06,0x23,0x22,0x26, +0x35,0x34,0x36,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x17,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x36,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xd8,0xaa,0x74,0x89,0xaa,0x4b,0x62,0x7f,0x84,0x6b,0xf7,0x1b, +0xc7,0xa8,0x73,0xa0,0xea,0x01,0x1f,0x08,0x89,0x57,0x35,0x47,0x25,0x30,0x5a,0x3e,0x59,0xa3,0x76,0x68,0xae,0x67,0x06,0x7f,0x43,0x50,0xa5,0x7a,0x80,0xa0,0x9d,0x4e,0x35,0x83,0x72,0x94,0xfd,0x42,0xc5,0x99,0x49,0x2d,0x4d,0x7e,0x03,0x78,0xdd,0x63,0x78,0x8b,0x99,0x9a,0x26,0xa0,0x67,0x49,0x5c,0x6e,0x19,0x0f,0xe1,0xed,0x9e,0x73, +0xa2,0x9e,0x18,0xac,0xfa,0x4c,0x3c,0x1d,0x3a,0x27,0x82,0x20,0x93,0x4d,0x78,0xad,0x93,0xfe,0xfa,0xa0,0x08,0x0a,0x6a,0x89,0x84,0xb0,0xb0,0x73,0x38,0x4e,0x97,0x5c,0x69,0x3e,0xfe,0xd3,0x10,0x56,0x56,0x2b,0x42,0xa5,0x00,0x02,0x00,0x64,0x00,0x00,0x05,0x43,0x04,0xac,0x00,0x1d,0x00,0x28,0x00,0x64,0xb9,0x00,0x11,0x01,0x85,0x40, +0x12,0x1e,0x23,0x8b,0x17,0x0c,0x8b,0x07,0x00,0x1e,0x17,0x07,0x07,0x17,0x1e,0x00,0x04,0x2a,0x19,0xb8,0x01,0x85,0x40,0x09,0x09,0x05,0x17,0x23,0x23,0x21,0x9b,0x0e,0x26,0xb8,0x01,0x81,0x40,0x0d,0x0c,0x07,0x0e,0x14,0x14,0x01,0x0e,0x06,0x09,0x9b,0x0a,0x06,0x1c,0xb8,0x01,0x81,0xb1,0x01,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12, +0x39,0x2f,0x12,0x39,0x39,0xed,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xc6,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x24,0x26,0x35,0x34,0x37,0x26,0x23,0x37,0x20,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23, +0x22,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x43,0xfe,0x06,0xa4,0xfe,0xed,0x9d,0x9d,0x73,0xbb,0x0f,0x01,0x20,0x98,0x7c,0xa2,0x86,0xac,0xad,0x85,0x7e,0xa1,0x4c,0x4a,0xfc,0xb9,0x01,0xfa,0xfe,0x98,0x54,0x3e,0x7b,0x59,0x3a,0x59,0x41,0x3f,0x53,0x84,0xeb,0x8d,0xc7,0x7d,0xc7,0xa5,0xfe,0xe6,0x2b,0xa0,0x7a,0x7b,0xa7,0x85,0xa0,0x4a, +0x6c,0x93,0xb9,0x01,0xf5,0x36,0x49,0x1d,0x79,0x5c,0x40,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x04,0x9e,0x04,0xc1,0x00,0x27,0x00,0x42,0x40,0x1a,0x11,0x8a,0x16,0x1c,0x8a,0x0b,0x16,0x0b,0x27,0x27,0x0b,0x16,0x03,0x29,0x23,0x8a,0x05,0x1e,0x09,0x13,0x09,0x01,0x14,0x14,0x19,0x26,0xb8,0x01,0x81,0xb5,0x01,0x18,0x0e,0x9b,0x19,0x06, +0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x26,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x07,0x06,0x15, +0x14,0x16,0x33,0x21,0x04,0x9e,0xfd,0x4d,0x66,0xb1,0x66,0x8d,0x27,0xd9,0x84,0x4b,0x3f,0x37,0x4a,0x1b,0x8e,0x31,0xab,0x7c,0x84,0xa8,0x8b,0x3e,0x84,0x3f,0x84,0x7c,0x5c,0x02,0xb3,0x62,0xab,0x64,0xb5,0x66,0x1e,0x61,0x3a,0x49,0x3f,0x50,0x45,0x2f,0x30,0x1c,0x52,0x41,0x62,0x74,0x9f,0xae,0x8d,0x9d,0x46,0x1f,0x34,0x1e,0x40,0x70, +0x5b,0x83,0x00,0x02,0x00,0x82,0x00,0x00,0x05,0x43,0x04,0xc1,0x00,0x26,0x00,0x31,0x00,0x59,0xb3,0x24,0x24,0x22,0x13,0xb8,0x01,0x84,0x40,0x24,0x27,0x01,0x04,0x8a,0x22,0x27,0x22,0x00,0x00,0x22,0x27,0x03,0x33,0x2d,0x1a,0x8a,0x0c,0x2f,0x99,0x16,0x24,0x01,0x9b,0x25,0x18,0x25,0x16,0x25,0x16,0x25,0x08,0x2a,0x9b,0x10,0x06,0x1e, +0xb8,0x01,0x81,0xb1,0x08,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x39,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x11,0x39,0x2f,0x31,0x30,0x01,0x23,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14, +0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x10,0x27,0x35,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x33,0x32,0x36,0x05,0x43,0xd6,0x62,0x4d,0x9f,0xfe,0xf0,0x9d,0xa4,0xfe,0xf0,0x9a,0x5a,0x91,0x5d,0x64,0x90,0x90,0x64,0x5c,0x3f,0x08,0x70,0xc3,0x76,0x6e,0xc5,0x75,0xec,0x01,0xb7,0xfc,0xeb,0x3f, +0x25,0x2e,0x41,0x0b,0x3f,0x3b,0x2b,0x39,0x04,0x07,0x6a,0xc1,0x87,0x9f,0xfe,0xed,0xa3,0xa5,0x01,0x22,0xaf,0xa0,0x01,0x21,0x8a,0xa4,0x72,0x6f,0xa6,0x3c,0x23,0x40,0x80,0xd5,0x76,0x74,0xc6,0x70,0x01,0x15,0xa7,0xa1,0xff,0x00,0x29,0x49,0x58,0x53,0x4b,0x4f,0x00,0x02,0x00,0x82,0x00,0x00,0x04,0x44,0x04,0xac,0x00,0x26,0x00,0x31, +0x00,0x70,0x40,0x3c,0x17,0x18,0x0b,0x8b,0x31,0x10,0x89,0x1d,0x1f,0x06,0x2c,0x03,0x31,0x1d,0x00,0x18,0x31,0x1d,0x1d,0x31,0x18,0x00,0x04,0x33,0x04,0x8a,0x21,0x18,0x17,0x2f,0x99,0x0e,0x29,0x9b,0x08,0x06,0x2c,0x1f,0x10,0x04,0x0e,0x08,0xc0,0x0e,0xf0,0x0e,0x02,0x17,0x0e,0x08,0x08,0x0e,0x17,0x03,0x1a,0x01,0x9b,0x25,0x06,0x15, +0xb8,0x01,0x81,0xb1,0x1a,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x21,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x21,0x01,0x34,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x04,0x44,0xfd,0x93,0x48,0x68,0x35,0x73,0xa4,0x80,0x92,0x92,0x68,0x9c,0x74,0x08,0x7d,0x63,0x5c,0x37,0x74,0x6a,0x9d,0xab,0xdb,0x25,0x70,0x5b, +0x9e,0x5c,0x02,0x6d,0xfe,0xa4,0x5e,0x29,0x7f,0x17,0x20,0x6e,0x27,0x27,0x41,0x04,0x07,0x68,0x48,0x5e,0x32,0x63,0x6f,0x62,0x5d,0x7b,0x45,0x1b,0x16,0x6a,0x87,0x25,0x73,0x56,0xe3,0xb2,0x4e,0x53,0x7c,0xa5,0x5a,0x9f,0x5c,0xfd,0xa9,0x41,0x28,0x15,0x1a,0x2b,0x29,0x00,0x00,0x02,0x00,0x5d,0xff,0xe8,0x03,0xe9,0x03,0x7c,0x00,0x0b, +0x00,0x1b,0x00,0x23,0x40,0x0d,0x18,0x89,0x03,0x03,0x1d,0x09,0x89,0x10,0x06,0x9b,0x14,0x06,0x00,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15, +0x14,0x06,0x06,0x02,0x23,0x7f,0xa0,0xa0,0x7f,0x7f,0xa0,0xa0,0x7f,0x7e,0xd0,0x78,0x78,0xd1,0x7d,0x7e,0xd0,0x78,0x78,0xd0,0x81,0xa9,0x88,0x88,0xa9,0xa9,0x88,0x88,0xa9,0x99,0x76,0xd3,0x81,0x81,0xd3,0x76,0x76,0xd3,0x81,0x81,0xd3,0x76,0x00,0x02,0x00,0x00,0xfe,0x63,0x06,0xd4,0x05,0xb3,0x00,0x18,0x00,0x21,0x00,0x37,0x40,0x1e, +0x21,0x8a,0x11,0x00,0x8a,0x19,0x11,0x09,0x19,0x19,0x09,0x11,0x03,0x23,0x04,0x89,0x0d,0x1d,0x9b,0x15,0x07,0x07,0x99,0x0a,0x18,0x21,0x10,0x99,0x01,0x18,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21, +0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x10,0x12,0x21,0x20,0x00,0x11,0x03,0x11,0x10,0x26,0x23,0x22,0x06,0x11,0x11,0x06,0xd4,0xfa,0x99,0x67,0x5f,0x60,0x66,0x01,0x55,0xfe,0xb6,0xc2,0xb6,0xc4,0xb4,0x01,0x57,0xff,0x01,0x03,0x01,0x02,0x01,0x01,0xa4,0xb1,0xae,0xb0,0xae,0x3f,0x46,0x4a,0x3b,0x93,0x86,0x90,0x8f,0x8b,0x02,0x9d, +0x01,0x44,0x01,0x3f,0xfe,0xc5,0xfe,0xb8,0xfd,0x63,0x02,0x8e,0x01,0x05,0xf4,0xf8,0xfe,0xff,0xfd,0x72,0x00,0x01,0x00,0x64,0xff,0xe6,0x07,0x12,0x05,0xb3,0x00,0x1e,0x00,0x3d,0x40,0x21,0x10,0x0f,0x1e,0x89,0x02,0x1b,0x89,0x06,0x0f,0x02,0x06,0x00,0x00,0x06,0x02,0x0f,0x04,0x20,0x0c,0x89,0x13,0x03,0x1e,0x99,0x02,0x18,0x09,0x9b, +0x17,0x07,0x0f,0x10,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x07,0x12, +0xfc,0xd6,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83,0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x93,0x93,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x00,0x00,0x01,0x00,0x64, +0xff,0xe6,0x07,0x1b,0x05,0xb3,0x00,0x2d,0x00,0x50,0x40,0x2b,0x19,0x18,0x22,0x0d,0x8a,0x0e,0x2d,0x2a,0x8a,0x06,0x01,0x06,0x18,0x0e,0x02,0x06,0x06,0x02,0x0e,0x18,0x04,0x2f,0x15,0x8a,0x1c,0x22,0x19,0x09,0x12,0x9b,0x26,0x1f,0x07,0x18,0x19,0x19,0x0e,0x18,0x03,0x2d,0x99,0x02,0x18,0x00,0x3f,0xed,0x39,0x3f,0x3f,0x33,0x3f,0x33, +0xed,0x32,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x32,0x10,0xed,0x39,0x11,0x33,0x31,0x30,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x36, +0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x07,0x07,0x1b,0xfd,0x59,0x53,0x52,0x6c,0x79,0x71,0x61,0xa4,0x61,0x71,0x7b,0x6a,0x66,0x5d,0x9b,0x5f,0x6c,0xc5,0xbe,0x6e,0x96,0x21,0x08,0x20,0x96,0x6f,0x76,0xad,0x60,0x4b,0x30,0x93,0x93,0x51,0x74,0x01,0x4b,0xf6,0x01,0x12,0x01,0x00,0xc7,0xeb,0xfc,0x9a,0x03,0x66,0xea,0xc8,0xfb,0xfe,0xe9, +0xf9,0xfe,0x87,0x77,0x37,0x7f,0x01,0xa8,0xe2,0x01,0x56,0x01,0x6e,0x74,0x6b,0x6a,0x75,0xa3,0xfe,0xc0,0xe1,0x99,0xfe,0x93,0x56,0x00,0x00,0x02,0x00,0x61,0xff,0xe6,0x06,0x81,0x07,0xc8,0x00,0x30,0x00,0x3c,0x00,0x6d,0x40,0x38,0x14,0x13,0x37,0x89,0x07,0x00,0x89,0x31,0x26,0x26,0x10,0x2b,0x89,0x20,0x1d,0x34,0x0a,0x03,0x07,0x31, +0x2e,0x20,0x13,0x07,0x31,0x20,0x20,0x31,0x07,0x13,0x04,0x3e,0x10,0x89,0x17,0x1d,0x2e,0x0a,0x34,0x04,0x04,0x26,0x25,0x25,0x1b,0x23,0x9b,0x28,0x0c,0x9b,0x1b,0x07,0x13,0x14,0x19,0x3a,0xb8,0x01,0x80,0xb1,0x04,0x19,0x00,0x3f,0xed,0x3f,0x33,0x3f,0xed,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39, +0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x17,0x39,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x04,0x02,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x06,0x31,0x79,0xd9,0x88,0xac,0xd5,0xd6,0xd3,0x80,0xaf,0xac,0xfe,0xf0,0x8c,0x6e,0x6e,0x95,0x71,0x7d,0xb3,0x01,0x60,0xde,0xfd,0xba,0x77,0x5b,0x79,0x7a,0x9b,0x9f,0x1d,0xac,0xbb,0xb2,0xd7,0x7f,0x94,0x5e,0x65,0xa7,0x55,0x4b, +0xbb,0xb2,0x7c,0x69,0x80,0xa8,0x02,0x8e,0xb7,0xfe,0xc0,0xb1,0x01,0x1c,0xdd,0xdb,0x01,0x6c,0x9e,0x54,0x9d,0xfe,0xec,0xb7,0xb6,0xfe,0xc4,0x9e,0x3a,0xa6,0x01,0x7d,0xaa,0xe3,0x01,0x57,0xc6,0x8c,0x5b,0x97,0x51,0x62,0x6e,0x3b,0x8a,0x3f,0xba,0x95,0x6f,0xcf,0x72,0x6b,0xfe,0xde,0xba,0x94,0xfc,0x55,0x8d,0xfe,0xc6,0xc1,0xa3,0xbe, +0x01,0x24,0x00,0x01,0x00,0x61,0xfd,0xfe,0x07,0x0f,0x07,0x61,0x00,0x43,0x00,0x71,0x40,0x38,0x1f,0x8a,0x24,0x22,0x21,0x2a,0x8a,0x19,0x30,0x8a,0x11,0x00,0x01,0x41,0x8a,0x03,0x2c,0x11,0x01,0x24,0x21,0x14,0x19,0x11,0x01,0x03,0x03,0x01,0x11,0x19,0x14,0x21,0x24,0x07,0x45,0x0a,0x8a,0x39,0x01,0x00,0x19,0x06,0x9b,0x3d,0x27,0x2c, +0x14,0x9b,0x15,0x15,0x22,0x1c,0x9b,0x27,0x07,0x0e,0xb8,0x01,0x80,0xb3,0x34,0x21,0x22,0x19,0x00,0x3f,0x33,0xd4,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x10,0xd4,0xed,0x3f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31, +0x30,0x05,0x27,0x12,0x11,0x10,0x00,0x21,0x22,0x00,0x02,0x11,0x10,0x12,0x04,0x33,0x32,0x12,0x35,0x10,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x13,0x07,0x02,0x11,0x10,0x00,0x33,0x32,0x16,0x15,0x10,0x07,0x15,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x02,0x35,0x10,0x12,0x00,0x21,0x32, +0x04,0x12,0x11,0x14,0x02,0x06,0x7d,0x9e,0x8b,0xfe,0xaf,0xfe,0xd1,0xd4,0xfe,0xa5,0xb6,0x9c,0x01,0x0e,0xb4,0xbf,0xd4,0xf8,0x72,0x65,0x63,0x6d,0x73,0x7a,0xa8,0xa0,0x8b,0x99,0x96,0x01,0x03,0xed,0xb9,0xd3,0xae,0x67,0x7d,0x96,0xff,0xa8,0xa9,0xfe,0xea,0xc9,0x74,0xde,0x01,0xaa,0x01,0x0a,0xef,0x01,0x6b,0xc2,0x4c,0x19,0x37,0x01, +0x9f,0x01,0x92,0x01,0xa6,0x01,0xd3,0xfe,0xfe,0xfe,0x32,0xfe,0xcd,0xfe,0xd1,0xfe,0x00,0xff,0x01,0x24,0xfd,0x01,0x7d,0x96,0x9b,0x85,0xa2,0x8d,0xfe,0xe7,0xfe,0xbd,0xfe,0xb1,0xfe,0xae,0x37,0x01,0x75,0x01,0x5f,0x01,0x69,0x01,0x90,0xf0,0xca,0xfe,0xf8,0x67,0x06,0x1e,0xfc,0xb4,0xc0,0xfe,0xb0,0xa8,0xb1,0x01,0x4d,0x01,0xd0,0xe9, +0x01,0x60,0x02,0x19,0x01,0x33,0xfd,0xfe,0x2f,0xfe,0xc6,0xd7,0xfe,0x31,0x00,0x01,0x00,0x64,0xfd,0xfe,0x06,0xf4,0x05,0xb3,0x00,0x3e,0x00,0x6a,0x40,0x0b,0x00,0x3e,0x0a,0x33,0x8a,0x34,0x11,0x2a,0x8a,0x2b,0x17,0xb8,0x01,0x85,0x40,0x24,0x23,0x3e,0x34,0x1d,0x2b,0x23,0x23,0x2b,0x1d,0x34,0x3e,0x05,0x40,0x3c,0x8a,0x03,0x12,0x0b, +0x0b,0x34,0x2f,0x26,0x38,0x9b,0x15,0x0e,0x07,0x07,0x3e,0x00,0x19,0x1d,0x1e,0x1e,0x34,0x20,0xb8,0x01,0x80,0xb3,0x1b,0x2b,0x34,0x18,0x00,0x3f,0x33,0xd4,0xed,0x12,0x39,0x2f,0x33,0x3f,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x12,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10, +0xed,0x39,0x11,0x33,0x31,0x30,0x17,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x20,0x11,0x10,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x22,0x06,0x11,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x26,0x23,0x22, +0x06,0x02,0x15,0x10,0x17,0xee,0x41,0x49,0x51,0x92,0x64,0x56,0x7e,0x2a,0x05,0x24,0x86,0x5a,0x5b,0x6f,0x31,0x06,0x26,0x7f,0x60,0x01,0x3c,0x7f,0xe3,0x99,0x8c,0x6f,0x7e,0x77,0xb3,0xad,0x59,0x4e,0x5e,0x51,0xa3,0x4e,0x5b,0x63,0x54,0xa3,0x49,0x55,0x32,0x52,0x2f,0x7d,0x1a,0x85,0x01,0x91,0xdc,0xe8,0x01,0x4b,0xa8,0x56,0x6b,0x5f, +0x62,0x52,0x73,0x64,0x61,0xfc,0xcf,0xfe,0xaa,0xfd,0xe8,0xfe,0xea,0x2d,0xac,0x40,0x01,0xe2,0x01,0xf7,0x01,0x51,0x01,0x57,0xda,0xfe,0xfe,0xfc,0xc4,0x03,0x3c,0x01,0x05,0xd7,0xe9,0xf1,0xfc,0xc2,0x03,0x3e,0x01,0x0b,0xcf,0x8b,0xfe,0xf9,0xb5,0xfe,0x46,0xfa,0x00,0x02,0x00,0x46,0xff,0xe6,0x05,0x17,0x05,0xb3,0x00,0x0b,0x00,0x30, +0x00,0x47,0x40,0x1d,0x2a,0x89,0x13,0x17,0x1b,0x89,0x00,0x13,0x00,0x30,0x30,0x00,0x13,0x03,0x32,0x06,0x8a,0x22,0x09,0x99,0x30,0x0c,0x18,0x1f,0x0c,0x1f,0x0c,0x26,0x0f,0xb8,0x01,0x80,0xb5,0x2e,0x19,0x03,0x9b,0x26,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f, +0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x04,0x33,0x32,0x36,0x12,0x35,0x34,0x02,0x26,0x27,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x20,0x27,0x02,0x8f,0x6e,0x5e,0x5e,0x7a, +0x6e,0x5d,0x63,0x76,0xfd,0xb9,0x68,0x01,0x05,0x92,0xa8,0xfd,0x84,0x86,0xe3,0x82,0x03,0x55,0x62,0x62,0xb1,0x6f,0xa9,0xc8,0x86,0xed,0x9a,0xcb,0x01,0x41,0xb8,0xb6,0xfe,0xb1,0xcb,0xfe,0xbf,0xbe,0x04,0x1e,0x69,0x80,0x82,0x64,0x66,0x7c,0x78,0xfd,0x84,0x5c,0x60,0x95,0x01,0x0f,0xb0,0x9f,0x01,0x12,0xa3,0x07,0x08,0x1c,0x9b,0x60, +0x65,0xa5,0x5d,0xc6,0xa3,0x7f,0xbd,0x66,0xb4,0xfe,0xa9,0xd3,0xdc,0xfe,0xab,0xbe,0x94,0x00,0x00,0x01,0x00,0x64,0xfd,0xfe,0x06,0xea,0x05,0xb3,0x00,0x2d,0x00,0x57,0x40,0x2a,0x2c,0x01,0x8a,0x0e,0x28,0x89,0x13,0x1d,0x1c,0x0e,0x13,0x0f,0x07,0x1c,0x1c,0x07,0x0f,0x13,0x0e,0x05,0x2f,0x19,0x89,0x20,0x2d,0x06,0x16,0x9b,0x24,0x07, +0x1c,0x1d,0x19,0x10,0x2b,0x99,0x0f,0x07,0x08,0x08,0x0f,0x0b,0xb8,0x01,0x80,0xb2,0x04,0x0f,0x18,0x00,0x3f,0xd4,0xed,0x12,0x39,0x11,0x33,0x10,0xed,0x39,0x3f,0x33,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x01,0x11,0x10,0x00,0x21,0x22,0x26,0x27,0x35, +0x17,0x16,0x33,0x32,0x36,0x35,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x21,0x11,0x06,0xea,0xfe,0xcd,0xfe,0xe6,0x46,0x76,0x55,0x4a,0x69,0x70,0xbb,0xdc,0xfd,0xa2,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83,0x98,0x80,0x78, +0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x01,0x9a,0x05,0x99,0xfa,0xb4,0xfe,0xe3,0xfe,0xce,0x13,0x14,0xac,0x18,0x22,0xc6,0xa3,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x05,0x06,0x00, +0x00,0x02,0x00,0x61,0xff,0xe6,0x07,0x02,0x07,0xc8,0x00,0x3f,0x00,0x4a,0x00,0x84,0x40,0x45,0x1b,0x1a,0x26,0x10,0x8a,0x11,0x46,0x8a,0x07,0x00,0x8a,0x40,0x35,0x35,0x17,0x3a,0x8a,0x2e,0x2b,0x43,0x0a,0x03,0x07,0x40,0x3d,0x2e,0x1a,0x11,0x07,0x40,0x2e,0x2e,0x40,0x07,0x11,0x1a,0x05,0x4c,0x17,0x8a,0x1e,0x0c,0x14,0x9b,0x22,0x2b, +0x26,0x43,0x0a,0x3d,0x26,0x04,0x04,0x35,0x34,0x34,0x22,0x31,0x9b,0x37,0x29,0x22,0x07,0x1a,0x1b,0x19,0x11,0x18,0x48,0xb8,0x01,0x80,0xb1,0x04,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x3f,0x33,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x39, +0x11,0x12,0x17,0x39,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x17, +0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x10,0x33,0x32,0x12,0x06,0xc2,0x64,0xac,0x6c,0x88,0xad,0xb0,0xad,0x57,0x59,0x88,0x91,0xa2,0xea,0x8c,0x88,0x65,0x58,0x9a,0x5c,0x6b,0x6e,0xc5,0x81,0x75,0xab,0x20,0x07,0x2b,0xc0,0x7d,0x90, +0x85,0x3d,0x49,0x60,0x63,0x3b,0x64,0x3f,0x17,0x89,0x97,0x8e,0xad,0x67,0x75,0x48,0x54,0xa4,0x2b,0x30,0x8f,0x7f,0x9a,0x61,0x6e,0x02,0x8e,0xbb,0xfe,0xc2,0xaf,0x01,0x18,0xe1,0xdd,0x01,0x6f,0xa0,0x4f,0xf6,0xe6,0xfc,0xc2,0x03,0x3e,0x01,0xdc,0xfe,0xe3,0xfe,0xd4,0xb4,0xfe,0x8c,0x8c,0x37,0x98,0x01,0x9f,0xbb,0xe4,0x01,0x4a,0xad, +0x90,0x81,0x83,0x8e,0x87,0x3a,0xa8,0x5c,0x63,0x6d,0x1d,0x1e,0x8a,0x3f,0xb8,0x97,0x6f,0xd0,0x70,0x6d,0xfe,0xdd,0xb8,0xb7,0xd9,0x4b,0x84,0xfe,0xd5,0xcf,0xfe,0x9f,0x01,0x13,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0x2b,0x03,0xf1,0x00,0x0b,0x00,0x1b,0x00,0x20,0x40,0x10,0x18,0x89,0x03,0x03,0x1d,0x09,0x89,0x10,0x06,0x9b,0x14,0x06, +0x00,0x99,0x0c,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x24,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x04,0x02,0xd5,0xc7,0xdf,0xdf,0xc7,0xc5,0xdd,0xdd,0xc5,0xaa,0xfe,0xee,0x97,0x95,0x01,0x13,0xab, +0xae,0x01,0x14,0x94,0x97,0xfe,0xee,0x87,0xc2,0xa9,0xab,0xc1,0xc3,0xa9,0xa9,0xc2,0x93,0x7f,0xe9,0x96,0x97,0xea,0x7e,0x7f,0xe9,0x97,0x96,0xe8,0x80,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0xa3,0x03,0xf1,0x00,0x2b,0x00,0x37,0x00,0x5f,0xbc,0x00,0x2c,0x01,0x82,0x00,0x00,0x00,0x06,0x01,0x82,0x40,0x18,0x32,0x14,0x89,0x1b,0x28, +0x32,0x00,0x32,0x17,0x1b,0x1b,0x17,0x32,0x00,0x04,0x39,0x22,0x89,0x0c,0x18,0x99,0x17,0x18,0x2f,0xb8,0x01,0x7d,0x40,0x11,0x28,0x35,0x9b,0x03,0x28,0x03,0x28,0x03,0x09,0x1f,0x9b,0x10,0x06,0x26,0x99,0x09,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f, +0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x04,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x27,0x26,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35, +0x34,0x26,0x23,0x22,0x06,0x02,0x28,0x74,0x5a,0x5d,0x77,0xe8,0xc2,0xb7,0xe7,0xa0,0x01,0x2c,0xc4,0xbf,0x01,0x2c,0xa6,0xcb,0xc2,0x6d,0x6f,0x7a,0xdc,0x8a,0xd9,0xfe,0xf9,0x3f,0x73,0x43,0x82,0x41,0x03,0x55,0x6a,0x6c,0x3a,0x2a,0x27,0x3a,0x39,0x28,0x2b,0x39,0x01,0xb7,0x58,0x78,0x7b,0x63,0xc5,0xf0,0x01,0x05,0xd6,0x9f,0xf9,0x8a, +0x88,0xfa,0x9d,0xc0,0xf6,0x27,0x95,0x1d,0xa8,0x83,0x74,0xb5,0x63,0xd9,0xb6,0x62,0x91,0x51,0x58,0x06,0x06,0x72,0x58,0x29,0x39,0x37,0x2b,0x29,0x39,0x39,0x00,0x02,0x00,0xb4,0x00,0x00,0x05,0x90,0x05,0xe6,0x00,0x3e,0x00,0x4a,0x00,0x71,0xb9,0x00,0x2d,0x01,0x83,0x40,0x2f,0x00,0x42,0x8c,0x30,0x39,0x8c,0x48,0x27,0x26,0x06,0x0e, +0x89,0x1f,0x06,0x48,0x1f,0x00,0x30,0x48,0x1f,0x1f,0x48,0x30,0x00,0x04,0x4c,0x18,0x89,0x15,0x16,0x06,0x45,0x3f,0x30,0x3c,0x36,0x06,0x27,0x3c,0x36,0x27,0x27,0x36,0x3c,0x03,0x03,0x1b,0xb8,0x01,0x80,0xb7,0x12,0x18,0x23,0x2a,0x9b,0x0a,0x03,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11, +0x12,0x39,0x33,0x32,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11, +0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x22,0x76,0x72,0x41,0x5d,0x15,0x07,0x0d,0x6e,0x4a,0x7e,0x89,0xb7,0xa0,0xfd,0xd2,0xa1,0xb6,0xad,0x66,0x5b, +0x02,0x00,0x5b,0x64,0x36,0x33,0x2e,0x3f,0x03,0x91,0x02,0x3e,0x2d,0x31,0x31,0x27,0x1e,0x05,0x04,0x55,0x44,0x44,0x57,0x64,0x5d,0x96,0xa9,0x01,0x67,0x1f,0x2e,0x2d,0x20,0x1e,0x2d,0x2e,0x02,0x98,0xb3,0xa9,0x48,0x45,0x3f,0x4e,0xaf,0x99,0xfe,0x9e,0x9b,0xaf,0xb0,0x9a,0x04,0x9c,0xfb,0x6f,0x5b,0x60,0x60,0x5b,0x01,0x5e,0x55,0x5a, +0x4c,0x3e,0x3e,0x4c,0x58,0x72,0x4f,0x73,0x10,0x05,0x05,0x18,0x42,0x58,0x59,0x41,0x4f,0x56,0xb1,0x3e,0x2b,0x20,0x20,0x2a,0x2a,0x20,0x20,0x2b,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0x73,0x03,0xf3,0x00,0x2d,0x00,0x39,0x00,0x71,0xbc,0x00,0x31,0x01,0x82,0x00,0x25,0x00,0x2b,0x01,0x82,0x40,0x30,0x37,0x1c,0x1b,0x09,0x0f,0x89,0x15, +0x09,0x37,0x12,0x25,0x37,0x12,0x15,0x15,0x12,0x37,0x25,0x04,0x3b,0x22,0x89,0x03,0x13,0x99,0x12,0x18,0x18,0x1f,0x9b,0x06,0x2e,0x9b,0x25,0x00,0x28,0x09,0x1c,0x06,0x28,0x1c,0x28,0x1c,0x00,0x0c,0x06,0x06,0x34,0xb8,0x01,0x7d,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0xed, +0x10,0xed,0x32,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x02,0x07,0x35,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15, +0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x2f,0xc3,0xea,0xc8,0xa4,0x5f,0x8d,0x24,0x1e,0x91,0x63,0xa2,0xc1,0xc4,0xa5,0xb8,0x78,0x58,0x4e,0x53,0xab,0x58,0x4f,0x56,0x77,0x37,0x07,0x06,0x6f,0x58,0x5b,0x76,0x7a,0x55,0x29,0x39,0x39,0x29,0x2a,0x37, +0x38,0x0c,0x01,0x1d,0xeb,0xdf,0x01,0x18,0x72,0x74,0x6b,0x7b,0xfe,0xea,0xdf,0xce,0xfe,0xe9,0x24,0x96,0x3c,0x01,0x37,0x92,0xd0,0x9c,0x91,0x91,0x9c,0xce,0x96,0xb0,0x74,0x02,0x54,0x68,0x74,0x58,0x5d,0x79,0x01,0x38,0x02,0x39,0x29,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x00,0x02,0x00,0x82,0xff,0xed,0x05,0x4b,0x05,0x82,0x00,0x3b, +0x00,0x47,0x00,0x84,0xb9,0x00,0x06,0x01,0x82,0xb4,0x3f,0x28,0x89,0x27,0x45,0xbb,0x01,0x82,0x00,0x0c,0x00,0x0e,0x01,0x83,0x40,0x16,0x00,0x39,0x0c,0x00,0x14,0x3f,0x27,0x0c,0x00,0x00,0x0c,0x27,0x3f,0x14,0x05,0x49,0x32,0x89,0x1e,0x17,0x11,0x3c,0xb8,0x01,0x7d,0x40,0x1a,0x09,0x42,0x9b,0x03,0x22,0x2d,0x11,0x1b,0x0c,0x09,0x2d, +0x03,0x27,0x09,0x03,0x09,0x03,0x1b,0x27,0x06,0x39,0x35,0x99,0x1b,0x18,0x13,0xb8,0x01,0x80,0xb1,0x14,0x19,0x00,0x3f,0xed,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed, +0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37, +0x26,0x26,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xcb,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda,0xed,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0x01,0x6f, +0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0x01,0xae,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x45,0x39,0x2b,0x29,0x3a,0x39,0x2a, +0x2a,0x3a,0x00,0x03,0x00,0x82,0xff,0xed,0x05,0x4b,0x05,0x82,0x00,0x43,0x00,0x4f,0x00,0x5b,0x00,0xaa,0xbf,0x00,0x29,0x01,0x83,0x00,0x1b,0x00,0x4d,0x01,0x82,0x00,0x27,0x00,0x21,0x01,0x82,0x40,0x12,0x47,0x18,0x27,0x1b,0x27,0x47,0x2f,0x2f,0x47,0x27,0x1b,0x04,0x11,0x5d,0x07,0x89,0x06,0x00,0xb8,0x01,0x82,0x40,0x18,0x56,0x50, +0x8c,0x3e,0x3c,0x56,0x3e,0x06,0x56,0x3e,0x3e,0x56,0x06,0x03,0x5d,0x11,0x89,0x39,0x0c,0x01,0x4b,0x9b,0x1e,0x44,0xb8,0x01,0x7d,0x40,0x1a,0x24,0x32,0x2c,0x3c,0x53,0x01,0x03,0x41,0x27,0x1e,0x2c,0x24,0x1e,0x24,0x1e,0x24,0x36,0x59,0x41,0x06,0x18,0x14,0x99,0x36,0x18,0x2e,0xb8,0x01,0x80,0xb3,0x2f,0x19,0x06,0x06,0x00,0x3f,0x3f, +0xed,0x3f,0xed,0x32,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x12,0x39,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x07, +0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16, +0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x5d,0x08,0x9e,0x8f,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41, +0xab,0xa5,0x33,0xda,0xed,0xb0,0xc5,0x3d,0x74,0x59,0x64,0x72,0xdd,0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0xfe,0x0f,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x04,0x3d,0x10,0x29,0x72,0x52,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x4f,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59, +0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xb9,0x01,0x03,0x58,0x3c,0x5c,0x5a,0x75,0x81,0xfc,0xf7,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x02,0xbc,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x02,0x00,0x50,0xff,0xf4,0x04,0xa7,0x05,0x6a,0x00,0x28,0x00,0x34,0x00,0x63,0x40,0x09,0x18,0x89,0x05,0x25, +0x8c,0x2f,0x12,0x0b,0x29,0xb8,0x01,0x83,0x40,0x14,0x1f,0x00,0x0b,0x2f,0x1f,0x05,0x2f,0x1f,0x1f,0x2f,0x05,0x03,0x36,0x0f,0x89,0x0e,0x32,0x9b,0x22,0x2c,0xb8,0x01,0x7d,0x40,0x12,0x00,0x12,0x0b,0x22,0x00,0x22,0x00,0x15,0x02,0x99,0x1c,0x18,0x08,0x9b,0x15,0x06,0x0e,0x06,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f, +0x39,0x39,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x26,0x02,0x27,0x33,0x16,0x16,0x17,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xb5,0x47,0x8b,0xa9,0xc6,0xae,0x9b,0x47,0xa9,0x46,0x30,0xae,0x49,0xd5,0x2c,0x49,0x25,0x30,0x91,0x3b,0xe7,0x01,0x05,0x7e,0xeb,0x98,0xca,0xfe,0xfa,0x7a,0x6a,0x58,0x75,0x75,0x5b,0x60,0x3b,0x28,0x28,0x3b,0x3b,0x28,0x2a,0x39,0xb9, +0x34,0xc2,0xb1,0xa2,0xb0,0x26,0x1f,0xa1,0x01,0x70,0x54,0x44,0xd5,0xa6,0x16,0x1a,0xfc,0xe7,0x98,0xec,0x80,0xd7,0xaa,0x6d,0x7c,0x74,0x5c,0x57,0x76,0xce,0x2a,0x39,0x3c,0x27,0x29,0x3b,0x3a,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x06,0x80,0x05,0xe6,0x00,0x3b,0x00,0x47,0x00,0x7b,0x40,0x0c,0x17,0x89,0x14,0x26,0x25,0x06,0x06,0x2c, +0x0d,0x89,0x1e,0x35,0xb8,0x01,0x82,0x40,0x21,0x45,0x3f,0x8c,0x2f,0x1c,0x1e,0x45,0x14,0x1e,0x45,0x2f,0x2f,0x45,0x1e,0x14,0x04,0x49,0x2c,0x89,0x00,0x3c,0x9b,0x2e,0x38,0x32,0x06,0x26,0x32,0x26,0x32,0x26,0x03,0x42,0xb8,0x01,0x7d,0xb2,0x38,0x18,0x10,0xb8,0x01,0x80,0x40,0x0a,0x1c,0x18,0x15,0x06,0x21,0x29,0x9b,0x0a,0x03,0x06, +0x00,0x3f,0x33,0xed,0x32,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x3e,0x02,0x33,0x32,0x12,0x15,0x14,0x06, +0x07,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x21,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x06,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x82,0xac,0xa3,0x53,0x8a,0x23,0x0d,0x48, +0x66,0x36,0xa0,0xac,0x25,0x15,0x46,0x56,0x62,0xae,0x58,0xa4,0x66,0xfe,0xe2,0x5d,0x52,0x4d,0x2d,0x49,0x29,0xa7,0x01,0x53,0x47,0x51,0x58,0x37,0x07,0x06,0x70,0x58,0x5c,0x74,0x7b,0x64,0x80,0xc5,0x6a,0x01,0xbf,0x2a,0x3a,0x3a,0x2a,0x29,0x39,0x3a,0x01,0xfc,0xf8,0x01,0x00,0x75,0x66,0x37,0x65,0x3f,0xfe,0xfe,0xf4,0x64,0xce,0x31, +0x5f,0x5b,0x04,0x91,0xfb,0x64,0x5d,0x97,0x56,0xc8,0x01,0x36,0xa7,0xbd,0x45,0x8c,0x64,0x9f,0x96,0xb8,0xae,0xbb,0x69,0x02,0x57,0x65,0x75,0x57,0x5f,0x77,0x82,0xec,0x36,0x02,0x39,0x29,0x2a,0x38,0x3b,0x27,0x27,0x3d,0x00,0x02,0x00,0x82,0xff,0xf6,0x05,0x9c,0x05,0x82,0x00,0x40,0x00,0x4c,0x00,0x7e,0xb9,0x00,0x0b,0x01,0x82,0x40, +0x1b,0x47,0x27,0x89,0x26,0x41,0x8c,0x05,0x1a,0x33,0x00,0x47,0x26,0x33,0x05,0x1d,0x47,0x26,0x05,0x05,0x26,0x47,0x03,0x4e,0x31,0x89,0x1d,0x44,0xb8,0x01,0x7d,0x40,0x1a,0x02,0x15,0x9b,0x36,0x4a,0x9b,0x08,0x21,0x2c,0x00,0x02,0x36,0x2c,0x08,0x26,0x02,0x36,0x08,0x08,0x36,0x02,0x03,0x0e,0x26,0x06,0x33,0xb8,0x01,0x81,0xb5,0x1a, +0x18,0x3d,0x99,0x0e,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36, +0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x06,0x07,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26, +0x23,0x22,0x06,0x04,0xfc,0x16,0x1b,0x57,0x78,0x77,0x56,0x5c,0x77,0x9e,0x80,0x2f,0x57,0x56,0x45,0x3e,0x3e,0x1b,0x1e,0x25,0x18,0x10,0x02,0xda,0xfd,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0xb4,0x16,0x6f,0x5d,0x26,0x49,0x49,0x52,0x46,0x4b,0x1c,0x2e,0x49,0x0d,0x9a,0x3b,0x29,0x27,0x3b,0x3a, +0x28,0x27,0x3d,0x01,0x18,0x05,0x76,0x59,0x5a,0x75,0x7c,0x65,0xd1,0xfe,0xf7,0x27,0x46,0x4d,0x44,0x2e,0x33,0x57,0x84,0x1b,0x02,0xf1,0xc7,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0xca,0x39,0x8b,0x7f,0x22,0x39,0x54,0x4c,0x34,0x49,0x3d,0xd0,0x29,0x3b,0x39,0x2b,0x29,0x39, +0x3a,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x06,0x1b,0x04,0xfe,0x00,0x37,0x00,0x43,0x00,0x7a,0x40,0x0a,0x06,0x20,0x2a,0x13,0x89,0x12,0x21,0x89,0x22,0x32,0xbb,0x01,0x82,0x00,0x41,0x00,0x3b,0x01,0x82,0x40,0x19,0x2c,0x12,0x22,0x41,0x2c,0x2c,0x41,0x22,0x12,0x04,0x45,0x2a,0x89,0x00,0x38,0x9b,0x06,0x20,0x03,0x2c,0x35,0x2f,0x2f, +0x03,0x3e,0xb8,0x01,0x7d,0x40,0x15,0x35,0x18,0x1d,0x9b,0x09,0x17,0x9b,0x0f,0x09,0x0f,0x09,0x0f,0x12,0x22,0x18,0x12,0x06,0x26,0x9b,0x03,0x06,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10, +0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01,0x23,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14, +0x06,0x23,0x22,0x02,0x25,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x82,0xd9,0xc5,0x57,0x9d,0x2b,0x1e,0x51,0x38,0x1a,0x3f,0x4b,0x35,0x37,0x15,0x31,0x37,0xa8,0x54,0x79,0x43,0x23,0x55,0x51,0x1d,0x2e,0x11,0x1d,0x2d,0x0b,0x01,0x13,0xc1,0xe5,0x3e,0x6d,0x3f,0x4a,0x67,0x31,0x3c,0x08,0x6f,0x58,0x5b,0x76,0x7a,0x65, +0xc7,0xe6,0x01,0xbd,0x2a,0x39,0x3a,0x29,0x2a,0x37,0x38,0x01,0xdb,0xfa,0x01,0x1c,0x6a,0x57,0x94,0x7a,0x26,0x48,0x35,0x26,0xe1,0xa8,0x88,0xfe,0xe5,0x8f,0x32,0x51,0x1d,0x28,0x88,0x7f,0xfd,0x73,0x02,0x46,0xa1,0x7a,0x63,0xb5,0x6a,0x9d,0x76,0x5c,0x6e,0x74,0x58,0x5d,0x79,0x01,0x06,0x32,0x02,0x3b,0x27,0x2a,0x38,0x38,0x2a,0x28, +0x3c,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x05,0x3f,0x04,0xa3,0x00,0x0f,0x00,0x1e,0x00,0x20,0x40,0x10,0x04,0x89,0x13,0x13,0x20,0x1b,0x89,0x0c,0x00,0x99,0x17,0x06,0x10,0x99,0x08,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34, +0x12,0x24,0x13,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x02,0xe2,0xaa,0x01,0x18,0x9b,0x9e,0xfe,0xe6,0xaf,0xa9,0xfe,0xe7,0x9e,0xa0,0x01,0x1e,0xa2,0xcb,0xf2,0x6d,0xc7,0x7f,0x82,0xcd,0x71,0x71,0xc9,0x04,0xa3,0x9a,0xfe,0xed,0xad,0xad,0xfe,0xec,0x96,0x9c,0x01,0x14,0xa7,0xa9,0x01,0x15,0x9c,0xfb, +0xe5,0xf9,0xc8,0x80,0xd0,0x74,0x76,0xd0,0x80,0x7d,0xcf,0x73,0x00,0x02,0x00,0x78,0xff,0xf7,0x05,0x3b,0x04,0xa3,0x00,0x2a,0x00,0x36,0x00,0x61,0xb5,0x29,0x89,0x04,0x00,0x01,0x19,0xbb,0x01,0x82,0x00,0x2e,0x00,0x33,0x01,0x82,0x40,0x12,0x13,0x11,0x2e,0x13,0x04,0x01,0x2e,0x13,0x13,0x2e,0x01,0x04,0x04,0x38,0x0c,0x89,0x21,0x0f, +0xb8,0x01,0x7f,0x40,0x11,0x2b,0x11,0x31,0x11,0x16,0x1d,0x16,0x1d,0x16,0x00,0x25,0x99,0x08,0x06,0x01,0x00,0x18,0x00,0x3f,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x27,0x36, +0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x10,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0xf3,0x75,0x80,0x94,0x70,0xc9,0x81,0x85,0xc7,0x6e,0x85, +0x6e,0x2d,0x15,0x38,0x69,0x48,0x48,0x6b,0x5b,0xa4,0x6f,0x75,0xbc,0x68,0xa0,0x01,0x11,0xaf,0xa5,0x01,0x15,0xa9,0xfd,0x93,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x09,0x70,0x69,0x01,0x19,0x97,0x65,0xb9,0x6f,0x6a,0xbc,0x71,0x9a,0xb4,0x0b,0x34,0x4d,0x4b,0x69,0x6b,0x49,0x4e,0x81,0x49,0x73,0xd6,0x8e,0x97,0x01,0x07,0x92,0x8e,0xfe, +0xfa,0x8f,0xfe,0x90,0x65,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x04,0x52,0x06,0x66,0x00,0x25,0x00,0x31,0x00,0x5a,0xbf,0x00,0x2f,0x01,0x82,0x00,0x03,0x00,0x17,0x01,0x84,0x00,0x16,0x00,0x09,0x01,0x82,0x40,0x22,0x29,0x00,0x16,0x29,0x03,0x16,0x29,0x29,0x16,0x03,0x03,0x33,0x20,0x89,0x11, +0x13,0x1b,0x2c,0x06,0x31,0x00,0x1b,0x16,0x00,0x06,0x06,0x0d,0x17,0x16,0x07,0x24,0x99,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x39,0x12,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x26,0x26,0x35,0x34,0x36,0x33,0x32, +0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x01,0x36,0x12,0x37,0x17,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x39,0x26,0x26,0x65,0x4b,0x50,0x65,0x6c,0xc8,0x7e,0xa2,0xfb,0x8b,0x01,0x82,0x94,0xca,0x3a,0x92,0x2e,0x5c,0x75,0x8d,0x69, +0x8f,0x57,0x27,0x69,0xba,0x6a,0x61,0x90,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0xa1,0x26,0x3e,0x2d,0x50,0x62,0x68,0x4a,0x58,0x93,0x55,0x7f,0xe8,0x93,0x01,0x2b,0x01,0x35,0x77,0x01,0x06,0x9d,0x36,0x7b,0xa7,0x89,0x77,0x5a,0x91,0x7b,0x71,0x51,0x5c,0xa0,0x62,0x6b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x50, +0xff,0xf2,0x05,0x71,0x06,0xac,0x00,0x45,0x00,0x50,0x00,0x5c,0x00,0x88,0x40,0x23,0x4e,0x89,0x27,0x54,0x22,0x07,0x89,0x3f,0x24,0x46,0x16,0x2f,0x04,0x27,0x2d,0x89,0x48,0x0f,0x89,0x35,0x22,0x3f,0x27,0x3f,0x48,0x35,0x45,0x45,0x35,0x48,0x3f,0x27,0x05,0x5e,0x5a,0xb8,0x01,0x82,0x40,0x1e,0x1c,0x0a,0x3b,0x45,0x3b,0x00,0x00,0x2a, +0x04,0x9b,0x42,0x2a,0x57,0x9b,0x24,0x2f,0x22,0x16,0x04,0x19,0x46,0x2a,0x1f,0x1f,0x19,0x4c,0x9b,0x2a,0x06,0x51,0xb8,0x01,0x7d,0xb5,0x19,0x19,0x32,0x99,0x13,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x17,0x39,0xed,0x10,0xd4,0xed,0x12,0x39,0x2f,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39, +0x2f,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x26,0x02,0x35,0x34,0x36,0x33,0x32,0x16, +0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x12,0x35,0x34,0x2e,0x03,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x04,0x17,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x90,0xec,0x71,0x4f,0x26,0x1d,0x2a,0x44,0x67,0xe9,0xc2,0x6f,0x35,0x64,0xb5,0x71,0x62,0xcb, +0x6a,0x47,0x9f,0x69,0x49,0x68,0x69,0x48,0x36,0x57,0x16,0x27,0x1c,0x54,0x7a,0x7f,0x62,0x76,0x86,0x56,0x5d,0xa3,0x39,0x6d,0x81,0x1f,0x3c,0x59,0x73,0xb3,0x78,0x6a,0x3e,0x8b,0x66,0x56,0x01,0x2a,0x96,0xfd,0x51,0x27,0x2e,0x24,0x17,0x20,0x39,0xf9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0x66,0x71,0x2d,0x12,0x2d,0x1e,0x1d,0x2e, +0x28,0x59,0x74,0x93,0xcf,0x8f,0xc0,0xfe,0xc6,0xae,0x81,0x6f,0x78,0x78,0x69,0x49,0x4b,0x69,0x3b,0x30,0x32,0x4c,0x74,0x01,0x4f,0x72,0x72,0x97,0xd8,0xd4,0x9c,0xe5,0x73,0x81,0x01,0x1d,0xfc,0x65,0x92,0x6c,0x4c,0x3c,0x40,0x2b,0x43,0x57,0x3a,0x5f,0x82,0x68,0x53,0xfc,0x2e,0x69,0x77,0x81,0x93,0x39,0x3e,0x4c,0xe4,0xfd,0xf9,0x27, +0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x78,0xff,0xf2,0x05,0x25,0x06,0x3d,0x00,0x3d,0x00,0x47,0x00,0x53,0x00,0x8b,0xbc,0x00,0x0d,0x01,0x84,0x00,0x43,0x00,0x3b,0x01,0x82,0x40,0x44,0x4b,0x25,0x89,0x22,0x51,0x03,0x03,0x3e,0x08,0x03,0x43,0x06,0x8a,0x34,0x13,0x32,0x22,0x34,0x43,0x4b,0x22,0x34,0x34,0x22,0x4b, +0x43,0x04,0x55,0x2d,0x89,0x19,0x46,0x0a,0x53,0x00,0x4d,0x38,0x1d,0x29,0x08,0x32,0x3e,0x13,0x04,0x10,0x0a,0x03,0x00,0x29,0x38,0x23,0x0a,0x00,0x38,0x38,0x00,0x0a,0x03,0x10,0x23,0x06,0x30,0x99,0x15,0x19,0x40,0x10,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x12,0x17,0x39, +0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34, +0x36,0x36,0x37,0x24,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x05,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x42,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74, +0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x5c,0xbc,0xa9,0x01,0x42,0x85,0x4b,0x1e,0xa8,0xb4,0xcc,0xfe,0xf4,0x87,0x98,0x44,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0xf8,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x5e,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x02,0x0e,0x4c,0x3a,0x16,0x70,0x42,0x4f, +0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa5,0xe0,0x8c,0x2c,0x54,0x2f,0x34,0x41,0x2f,0xa3,0xb0,0x86,0xa0,0x34,0x45,0x23,0x6d,0xa7,0xa2,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0xfe,0xb6,0x50,0x2c,0x1f,0x20,0x27,0x01,0x7b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x04,0x00,0x78, +0xff,0xf2,0x05,0x25,0x06,0x3d,0x00,0x47,0x00,0x51,0x00,0x5c,0x00,0x68,0x00,0xba,0xb9,0x00,0x59,0x01,0x82,0xb6,0x3a,0x38,0x03,0x42,0x03,0x3a,0x40,0xb8,0x01,0x82,0x40,0x13,0x54,0x00,0x8a,0x45,0x3a,0x54,0x45,0x45,0x54,0x3a,0x03,0x33,0x6a,0x20,0x8a,0x10,0x66,0x1d,0x17,0xbb,0x01,0x82,0x00,0x60,0x00,0x27,0x01,0x84,0x40,0x41, +0x4d,0x1d,0x48,0x22,0x2d,0x0e,0x05,0x60,0x10,0x60,0x4d,0x4d,0x60,0x10,0x03,0x6a,0x09,0x89,0x33,0x50,0x24,0x68,0x1a,0x62,0x14,0x06,0x38,0x03,0x42,0x56,0x3d,0x22,0x0e,0x48,0x2d,0x04,0x2a,0x24,0x1d,0x1a,0x42,0x52,0x38,0x03,0x14,0x3d,0x24,0x1a,0x14,0x3d,0x3d,0x14,0x1a,0x24,0x04,0x2a,0x47,0x06,0x0c,0x99,0x2f,0x19,0x4a,0x2a, +0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x11,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10, +0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36, +0x36,0x25,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x36,0x35,0x35,0x33,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x12,0xd0,0xa8,0x23,0x72,0x80,0xc7,0x9c,0x4c,0x4a,0x41,0xc6, +0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0x47,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x68,0xe7,0x01,0x20,0x0f,0x4c,0x66,0x4d,0x4a,0x67,0x0b,0x2b,0x3f,0xa5,0xfe,0x7f,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x7d,0x35,0x2a,0x17,0x1c,0x25,0x31,0xf7,0x1a,0x27,0x27,0x1a,0x1a, +0x26,0x26,0x05,0xd5,0x99,0xbe,0x23,0x3c,0x31,0x4a,0xd9,0xb6,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa6,0xc8,0x9e,0x6b,0x08,0x35,0x5c,0x49,0x6b,0x71,0x47,0x18,0x1d,0x1c,0x6b,0x4b,0x5e,0xfa,0x87,0x50,0x2c,0x1f, +0x20,0x27,0x03,0xf6,0x21,0x29,0x1c,0x29,0x27,0x1e,0x18,0x30,0xfd,0x83,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x78,0xff,0xf2,0x06,0x58,0x06,0xac,0x00,0x4d,0x00,0x58,0x00,0x64,0x00,0xad,0x40,0x0c,0x2a,0x29,0x38,0x89,0x1c,0x0c,0x3e,0x4e,0x16,0x04,0x0e,0x14,0xb8,0x01,0x84,0xb4,0x51,0x31,0x89,0x24,0x57,0xbb, +0x01,0x84,0x00,0x0e,0x00,0x4b,0x01,0x82,0x40,0x26,0x5c,0x62,0x03,0x03,0x5c,0x44,0x29,0x1c,0x51,0x24,0x0e,0x5c,0x5c,0x0e,0x24,0x51,0x1c,0x29,0x06,0x66,0x06,0x89,0x44,0x21,0x34,0x29,0x34,0x2a,0x2a,0x5f,0x2e,0x9b,0x27,0x5f,0x54,0x9b,0x11,0x59,0xb8,0x01,0x7d,0x40,0x11,0x00,0x4e,0x16,0x0c,0x3e,0x04,0x40,0x11,0x03,0x00,0x5f, +0x11,0x00,0x11,0x00,0x40,0x48,0xb8,0x01,0x7d,0xb7,0x5f,0x06,0x18,0x0a,0x99,0x3c,0x40,0x19,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xd4,0xed,0x12,0x39,0x2f,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11, +0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x05,0x07,0x27, +0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x32,0x36,0x57,0x15,0x2e,0x40, +0x54,0x94,0x54,0x5b,0x40,0x63,0x79,0x5a,0x5b,0x6f,0x5d,0x39,0x62,0x50,0x93,0x59,0x35,0x74,0xd1,0xa0,0x70,0x6f,0x92,0x5d,0xa7,0x01,0x70,0x46,0x8f,0xa7,0x5a,0x3f,0x1d,0x28,0x48,0x5f,0xfb,0xed,0x69,0x84,0xe1,0x82,0x9d,0x6d,0x71,0x98,0x87,0xe1,0x7e,0x76,0xcc,0x78,0x48,0x6b,0x6c,0xf0,0x14,0x25,0x21,0x1a,0x1a,0x25,0xf4,0x1a, +0x27,0x27,0x1a,0x1a,0x26,0x26,0x03,0x50,0x3b,0x30,0x43,0xe3,0x6e,0x71,0xc0,0x6e,0x37,0x6f,0x87,0x62,0x7f,0x7f,0x62,0x87,0x6d,0x39,0x88,0xe6,0x80,0xa4,0xa7,0x7b,0x70,0x38,0x27,0x7e,0x4e,0x58,0x7d,0xbb,0x8b,0x43,0x4f,0x1e,0x2e,0x1d,0x20,0x2f,0x24,0x5d,0xb8,0xfe,0xfe,0xcb,0xaf,0xfe,0xd5,0xaa,0x6a,0x6a,0x94,0x01,0x04,0x9f, +0xa1,0x01,0x3a,0xb2,0x6b,0x49,0x49,0x69,0xfd,0xd9,0x14,0x57,0x17,0x2f,0x35,0x32,0x2a,0x4b,0x02,0x5b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x64,0xfd,0xeb,0x05,0x98,0x04,0xa5,0x00,0x2d,0x00,0x37,0x00,0x43,0x00,0x85,0xb3,0x3b,0x1e,0x21,0x40,0xb8,0x01,0x82,0xb2,0x19,0x0f,0x00,0xb8,0x01,0x83,0x40,0x14,0x2e, +0x23,0x2e,0x11,0x89,0x21,0x06,0x89,0x07,0x19,0x2e,0x21,0x07,0x07,0x21,0x2e,0x19,0x04,0x45,0x33,0xb8,0x01,0x83,0x40,0x11,0x28,0x3f,0x9b,0x35,0x25,0x1e,0x16,0x1c,0x23,0x0f,0x25,0x1c,0x25,0x1c,0x25,0x0c,0x38,0xb8,0x01,0x7d,0x40,0x0f,0x07,0x16,0x19,0x30,0x2b,0x2e,0x00,0x00,0x0c,0x2b,0x2b,0x02,0x99,0x0c,0x06,0x00,0x3f,0xed, +0x39,0x2f,0x12,0x39,0x11,0x33,0x11,0x33,0x3f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x39,0x11,0x12,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x24,0x33,0x32,0x12,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x23, +0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0xfc,0x01,0x16,0xc4,0xd3,0xef,0xa8,0x4d,0x82, +0x4b,0x4c,0xee,0x5f,0x39,0x39,0x57,0x74,0x44,0x49,0x68,0x69,0x48,0x3b,0x32,0x17,0x1a,0x22,0x48,0x41,0x57,0x66,0x70,0x4a,0x48,0x5f,0x44,0x29,0x3d,0x1b,0x24,0x26,0x19,0x2c,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x0f,0x96,0xfe,0xeb,0xf3,0xfb,0x4e,0x04,0xb2,0x66,0xab,0x61,0x4b,0x36,0xa7,0xba,0x55,0xea,0xa3,0x59,0x69, +0x49,0x4b,0x69,0x27,0x34,0x8f,0x37,0xac,0x73,0x22,0x69,0x52,0x4c,0x70,0x3c,0x92,0x5a,0x2a,0x1b,0x1b,0x30,0xfc,0xca,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x04,0x00,0x70,0xfe,0xa4,0x05,0x65,0x04,0xa5,0x00,0x4a,0x00,0x5d,0x00,0x67,0x00,0x73,0x00,0xa6,0xb3,0x0a,0x56,0x14,0x0c,0xb8,0x01,0x82,0x40,0x09,0x5e,0x24, +0x06,0x89,0x5a,0x62,0x8c,0x14,0x3d,0xb8,0x01,0x82,0x40,0x1e,0x6b,0x71,0x37,0x34,0x89,0x44,0x37,0x6b,0x44,0x5e,0x5a,0x14,0x6b,0x44,0x44,0x6b,0x14,0x5a,0x5e,0x05,0x75,0x4b,0x89,0x1d,0x2b,0x9b,0x00,0x00,0x03,0x48,0xb8,0x01,0x80,0xb4,0x31,0x54,0x0a,0x14,0x68,0xb8,0x01,0x7d,0x40,0x1b,0x40,0x5a,0x21,0x6e,0x9b,0x3a,0x56,0x60, +0x14,0x03,0x1a,0x21,0x37,0x3a,0x40,0x3a,0x40,0x3a,0x1a,0x28,0x31,0x06,0x4e,0x99,0x1a,0x19,0x65,0xb8,0x01,0x7d,0xb1,0x0f,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x12,0x17,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39, +0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x11,0x10,0x02,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x36,0x35,0x34, +0x26,0x26,0x23,0x22,0x07,0x06,0x07,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x36,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x35,0x01,0x06,0x06,0x05,0x34,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36, +0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xfa,0x1d,0xd2,0x3c,0xa8,0x98,0x19,0x38,0x34,0x5e,0x6b,0x48,0x49,0x6a,0x15,0x5b,0x45,0xbc,0x86,0x8c,0x3e,0x63,0x6e,0xae,0xbf,0x02,0x0d,0x7d,0x54,0x1c,0x3c,0x40,0x56,0xa3,0x22,0x0f,0x14,0x39,0x4a,0x5a,0x36,0x58,0x60,0x39,0x2c,0x0d,0x62,0x3f,0x48,0x6b,0x6c, +0x47,0x74,0xcf,0x7a,0x5c,0xa6,0x66,0x44,0x9c,0xfe,0x62,0x21,0x16,0x1c,0x60,0x60,0x82,0x01,0x21,0x42,0x21,0x2c,0x26,0x31,0xfd,0x99,0xae,0x87,0x03,0xb6,0x47,0x3c,0x26,0x1c,0x1c,0x25,0xfd,0x5f,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x3f,0x1b,0x49,0xee,0xff,0x00,0xfe,0xff,0xfe,0xf8,0x88,0x1b,0x35,0x7e,0x46,0x6c,0x6c,0x51, +0x20,0x26,0x16,0x1e,0x57,0x41,0x2f,0x6a,0x67,0x56,0x95,0x53,0xe5,0x36,0x7a,0x72,0x7d,0x8f,0x3f,0x5a,0x13,0x05,0x03,0x24,0x2a,0x21,0x78,0x7b,0x3a,0x70,0x1b,0x44,0x50,0x6b,0x49,0x49,0x69,0x70,0xc2,0x71,0x71,0xaf,0x5f,0x38,0xfb,0x11,0x1d,0x1f,0x25,0x2e,0x3e,0x68,0x06,0x19,0x7f,0x49,0x42,0xfe,0xf0,0x4d,0x5b,0x46,0x35,0x20, +0x24,0x31,0x19,0x29,0x26,0x02,0xb8,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x06,0xb5,0x04,0xa1,0x00,0x33,0x00,0x3f,0x00,0x64,0x40,0x09,0x02,0x89,0x31,0x00,0x33,0x27,0x89,0x0d,0x1a,0xb8,0x01,0x82,0x40,0x1b,0x37,0x3d,0x14,0x14,0x37,0x21,0x31,0x33,0x0d,0x37,0x37,0x0d,0x33,0x31,0x04,0x41, +0x12,0x89,0x21,0x3a,0x9b,0x14,0x1d,0x17,0x17,0x0f,0x34,0xb8,0x01,0x7d,0x40,0x0c,0x1d,0x19,0x33,0x00,0x24,0x99,0x0f,0x06,0x2e,0x99,0x06,0x19,0x00,0x3f,0xed,0x3f,0xed,0xc4,0x32,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33, +0x10,0xed,0x31,0x30,0x01,0x12,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x37,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x10,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22, +0x06,0x15,0x14,0x16,0x06,0x13,0xa2,0x70,0xcd,0x84,0x78,0xca,0x6a,0x03,0x0c,0xfe,0xe9,0x88,0x97,0x5e,0x17,0x50,0x30,0x48,0x6b,0x6c,0x47,0x6e,0xba,0x76,0xf3,0xcf,0xcf,0xf6,0x06,0x07,0x91,0x83,0x78,0x8d,0x9c,0xfc,0xa9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x9f,0xfe,0x8d,0xfe,0xdf,0x9f,0xf6,0x84,0x5f,0xb4,0x7a,0x56,0xcd, +0x22,0x01,0x47,0xc6,0xb2,0xfe,0xf2,0x83,0x27,0x2f,0x6b,0x49,0x49,0x69,0xb0,0x01,0x49,0xa5,0xf4,0x01,0x1d,0xfd,0xdc,0x30,0x6b,0x6c,0x33,0x7a,0x8c,0xbb,0xc8,0x01,0x1a,0x01,0x42,0xfb,0xfe,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0x01,0xb4,0x03,0xde,0x05,0x9a,0x00,0x0c,0x00,0x1c,0x00,0x1f,0x40,0x0f, +0x11,0x89,0x09,0x09,0x1e,0x03,0x89,0x19,0x06,0x99,0x15,0x00,0x9b,0x0d,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x2c,0x79,0x93,0x8d,0x7f, +0x80,0x8a,0x42,0x78,0x50,0x74,0xcb,0x73,0x6d,0xc8,0x7d,0x75,0xcb,0x74,0x6f,0xca,0x05,0x09,0xc9,0x9a,0xa5,0xbc,0xbb,0xa6,0x62,0xa6,0x5b,0x91,0x86,0xe6,0x89,0x92,0xe3,0x7c,0x80,0xe4,0x8d,0x8c,0xe6,0x83,0x00,0x01,0x00,0x64,0xff,0x83,0x03,0x98,0x05,0x9a,0x00,0x1d,0x00,0x38,0x40,0x1c,0x19,0x89,0x0e,0x0d,0x1d,0x00,0x03,0x0d, +0x00,0x00,0x0d,0x03,0x03,0x1f,0x09,0x89,0x11,0x0d,0x0a,0x0e,0x0e,0x15,0x00,0x1d,0x06,0x9b,0x15,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x31,0x30,0x17,0x36,0x00,0x35,0x34,0x02,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35, +0x34,0x36,0x24,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x00,0x07,0xe9,0xfa,0x01,0x0b,0x5d,0x3d,0x35,0xb1,0x60,0x42,0x39,0x9b,0x39,0x51,0xa5,0x01,0x14,0x6f,0x4b,0x78,0x49,0x85,0xfe,0xf0,0xb0,0x19,0xe7,0x01,0xb7,0xba,0x97,0x01,0x33,0x35,0x39,0x18,0x4b,0xb0,0x43,0x4d,0x51,0xe6,0x5f,0x3a,0x78,0x5a,0x88,0xfe,0xed,0x90,0x9b,0xfe, +0xae,0xfe,0x9b,0x9a,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x00,0x05,0x9a,0x00,0x23,0x00,0x38,0x40,0x1b,0x00,0x23,0x23,0x25,0x0c,0x20,0x0f,0x08,0x08,0x16,0x1c,0x89,0x0f,0x05,0x9b,0x20,0x0a,0x15,0x0a,0x15,0x00,0x12,0x9b,0x19,0x06,0x23,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0xed,0x01,0x2f,0xed,0xc4,0x39, +0x2f,0x12,0x39,0x39,0x11,0x39,0x2f,0x33,0x31,0x30,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x12,0x13,0x03,0x67,0x21,0x4d,0x63,0x85,0x57,0x74,0x5b,0x1b,0x6d,0xb8,0x41,0x41,0x5d,0x79,0x77,0x6a, +0x53,0xf2,0x6d,0x42,0xa3,0xe7,0x6b,0xba,0xd0,0x38,0x61,0x64,0x62,0x88,0x1c,0x7d,0xf0,0x01,0x05,0xa0,0x59,0x36,0x8c,0x3b,0x18,0x54,0xc7,0x48,0x59,0x63,0x90,0x73,0x85,0x90,0x7f,0x98,0x8b,0x5d,0x9f,0x89,0x5d,0x5f,0xfe,0x91,0xfe,0xff,0x00,0x01,0x00,0x78,0xff,0x83,0x03,0xd3,0x05,0x9a,0x00,0x31,0x00,0x64,0x40,0x33,0x1f,0x1e, +0x1e,0x33,0x07,0x18,0x89,0x2b,0x28,0x04,0x00,0x16,0x2b,0x07,0x0e,0x00,0x2b,0x2b,0x00,0x0e,0x03,0x24,0x14,0x89,0x07,0x2e,0x9b,0x02,0x16,0x02,0x21,0x9b,0x26,0x0d,0x11,0x02,0x28,0x1c,0x26,0x1f,0x02,0x26,0x02,0x26,0x11,0x1e,0x1f,0x0a,0x9b,0x11,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11, +0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x10,0xed,0x11,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x17,0x07, +0x02,0x21,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x01,0x0a,0x8c,0x8f,0x33,0x2e,0x59,0x4a,0x5c,0x69,0x4e,0xec,0x60,0x3c,0x8b,0xee,0x71,0x9c,0xbf,0xb1,0x8e,0x2d,0x63,0x53,0x88,0x5b,0x8d,0xa8,0xfe,0xa1,0x37,0x36,0x37,0x5f,0x69,0x85,0x6c,0x59,0x7c,0x78,0x73,0x43,0x81,0x23,0x03,0x68, +0x36,0x08,0x41,0x67,0x32,0x4b,0x4e,0x7f,0x5b,0x7b,0x77,0x79,0x99,0x84,0x8b,0x92,0x52,0x93,0x59,0x78,0x75,0x37,0x69,0xc4,0x4e,0x01,0x68,0x14,0x81,0x23,0x28,0x2c,0x97,0x46,0x53,0x5e,0x18,0x11,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x81,0x05,0x9a,0x00,0x22,0x00,0x33,0x40,0x1a,0x1c,0x89,0x04,0x0e,0x02,0x0e,0x20,0x20,0x0e,0x02, +0x03,0x24,0x09,0x89,0x14,0x21,0x9b,0x20,0x20,0x0f,0x04,0x9b,0x18,0x06,0x0e,0x0f,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30,0x01,0x20,0x11,0x34,0x37,0x22,0x0e,0x02,0x15,0x14,0x12,0x12,0x04,0x17,0x07,0x26,0x00,0x00,0x02,0x35,0x34,0x36,0x24,0x33,0x32, +0x17,0x06,0x15,0x14,0x16,0x33,0x37,0x07,0x06,0x04,0x29,0xfe,0x53,0x0e,0x2e,0xa9,0x76,0x1b,0x86,0xfb,0x01,0x1c,0x77,0x30,0x97,0xfe,0xb0,0xfe,0xe9,0x90,0x57,0x01,0x32,0x83,0x8e,0x27,0x13,0x8a,0x91,0x40,0x10,0x2a,0x02,0xa8,0x01,0xc3,0x57,0x50,0x1c,0x23,0x2a,0x45,0x92,0xfe,0xa9,0xfe,0xad,0xf2,0x2b,0x88,0x32,0x01,0x13,0x01, +0x80,0x01,0x7e,0xac,0x6f,0x61,0x58,0x29,0x9f,0x3f,0xb0,0x9e,0x05,0x9d,0x05,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0xff,0x05,0xae,0x00,0x16,0x00,0x3a,0x40,0x1c,0x04,0x03,0x00,0x89,0x16,0x07,0x14,0x16,0x03,0x16,0x03,0x16,0x18,0x0e,0x8a,0x0d,0x12,0x99,0x07,0x0e,0x09,0x09,0x04,0x00,0x0e,0x07,0x03,0x04,0x00,0x2f,0x33,0x3f, +0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x12,0x12,0x17,0x07,0x26,0x02,0x03,0x06,0x23,0x22,0x26,0x02,0x03,0x37,0x17,0x12,0x16,0x33,0x32,0x37,0x02,0x03,0x03,0x36,0x19,0xee,0xc2,0x4c,0x98,0xe5,0x46,0xa6,0x81,0x73,0x93,0x48,0x03,0xa5,0x08, +0x09,0x69,0x6d,0x3c,0x91,0x3c,0x0b,0x05,0xae,0xfd,0xd5,0xfd,0x09,0x8f,0x7a,0x62,0x01,0x9b,0x01,0x24,0x56,0x9e,0x01,0x57,0x01,0x57,0x14,0x9d,0xfe,0xbf,0xf1,0x4e,0x01,0x2c,0x01,0x41,0x00,0x01,0x00,0x78,0xff,0xf6,0x05,0x17,0x05,0x9a,0x00,0x2c,0x00,0x3f,0x40,0x20,0x17,0x16,0x16,0x1c,0x24,0x89,0x08,0x1c,0x89,0x10,0x08,0x10, +0x08,0x10,0x2e,0x00,0x8a,0x2c,0x1c,0x08,0x28,0x00,0x00,0x13,0x04,0x99,0x28,0x18,0x19,0x9b,0x13,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x12,0x12,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02, +0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x02,0x03,0x01,0x1c,0x0d,0x94,0xef,0x9d,0x39,0x8f,0x5c,0x61,0x61,0x70,0x7f,0x73,0x40,0xdb,0xaf,0x53,0xa0,0x5b,0x4e,0x9a,0x65,0x67,0x7a,0x5f,0x63,0x99,0x7d,0x57,0x35,0x8c,0xee,0x74,0xbe,0xfe,0xe1, +0xb5,0x1f,0x04,0x66,0xfe,0xd1,0xfe,0x33,0xe3,0x5a,0x91,0x52,0x42,0x6d,0x31,0x38,0x3f,0x62,0x7a,0x4e,0x95,0xc0,0x45,0x42,0x73,0x69,0x6c,0x5a,0x3c,0x6a,0x34,0x51,0x4b,0x54,0x68,0x41,0x70,0xdb,0x8f,0xf0,0x01,0xf1,0x01,0x75,0x00,0x01,0x00,0x64,0xff,0xf6,0x05,0x65,0x05,0xae,0x00,0x26,0x00,0x46,0x40,0x12,0x00,0x8b,0x26,0x1b, +0x89,0x0c,0x1f,0x0c,0x07,0x26,0x0c,0x07,0x07,0x0c,0x26,0x03,0x28,0x12,0xb8,0x01,0x84,0x40,0x10,0x13,0x13,0x07,0x12,0x12,0x04,0x0f,0x9b,0x17,0x06,0x21,0x99,0x04,0x18,0x00,0x07,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x31,0x30, +0x01,0x0a,0x02,0x23,0x22,0x26,0x27,0x36,0x37,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x02,0x03,0x27,0x12,0x12,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x02,0x07,0x16,0x33,0x32,0x36,0x12,0x12,0x13,0x05,0x65,0x07,0x72,0xf7,0xd9,0x71,0x98,0x45,0x0a,0x19,0x89,0x6d,0x67,0x6b,0x79,0x90,0x1b,0x8d,0x1c,0x68,0xb7,0x93,0x6f,0x9c,0x54, +0x3e,0x73,0x3a,0x34,0x2c,0x83,0xa4,0x61,0x31,0x0a,0x05,0xae,0xfd,0xac,0xfd,0xa6,0xfe,0xf6,0x29,0x2a,0x18,0x2c,0xef,0x01,0x4f,0x8a,0x92,0x81,0xfe,0xe8,0xfe,0xbd,0x2f,0x01,0x1b,0x01,0x19,0x89,0x65,0xb1,0x68,0x69,0xfe,0xf8,0xfe,0xe9,0x5c,0x10,0x77,0x01,0x01,0x01,0xc4,0x01,0xd7,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x5a, +0x05,0xae,0x00,0x15,0x00,0x2f,0x40,0x15,0x0c,0x0d,0x00,0x15,0x0f,0x08,0x0d,0x15,0x0d,0x15,0x17,0x08,0x0f,0x08,0x07,0x07,0x0d,0x0c,0x07,0x15,0x00,0x00,0x2f,0x32,0x3f,0x33,0x39,0x2f,0x33,0x33,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x3e,0x02, +0x37,0x17,0x04,0x07,0x36,0x33,0x32,0x04,0x12,0x17,0x03,0xc1,0x12,0x80,0xa2,0xb4,0x5b,0x83,0x60,0x23,0x2b,0x9f,0xda,0x63,0x6a,0xfe,0xeb,0x87,0x38,0x3e,0x89,0x01,0x1b,0xda,0x19,0x7d,0x81,0x01,0x4c,0xf6,0x85,0x39,0x7e,0x67,0xef,0xf2,0x56,0x64,0xff,0xf6,0x07,0xfe,0xfe,0x43,0xdb,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x2a, +0x05,0x9a,0x00,0x25,0x00,0x3e,0x40,0x20,0x00,0x25,0x0e,0x89,0x16,0x09,0x89,0x1c,0x25,0x16,0x1c,0x11,0x11,0x1c,0x16,0x25,0x04,0x27,0x23,0x89,0x02,0x11,0x0e,0x06,0x12,0x12,0x00,0x1c,0x9b,0x06,0x06,0x00,0x00,0x2f,0x3f,0xec,0x12,0x39,0x2f,0x12,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed, +0x11,0x33,0x31,0x30,0x17,0x26,0x35,0x10,0x12,0x00,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x02,0x15,0x14,0x17,0xa3,0x2b,0xce,0x01,0x45,0xbc,0x66,0x6c,0x73,0x4b,0x28,0x85,0x72,0x21,0x7a,0xaa,0x5c,0x36,0x3d,0x3a,0x39,0x1e,0x2b, +0x88,0xeb,0x91,0x2e,0x7d,0x95,0xc0,0x01,0x31,0x02,0x4d,0x01,0x44,0x4d,0x45,0x88,0x6b,0x46,0x33,0x1a,0x41,0x54,0x0f,0x91,0x12,0x54,0x74,0x3d,0x28,0x56,0x3b,0x38,0x5c,0x2d,0x19,0x12,0xfe,0xda,0xfd,0xf6,0xfc,0xc5,0x78,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x01,0x03,0x6e,0x00,0x0f,0x00,0x1b,0x00,0x21,0x40,0x0c,0x00,0x8b, +0x10,0x10,0x1d,0x16,0x8b,0x08,0x13,0x9b,0x0c,0x19,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x01,0x78,0xd2,0x78,0x78,0xd0, +0x77,0x79,0xd0,0x76,0x79,0xd0,0x79,0x97,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x01,0xaf,0x76,0xce,0x7a,0x79,0xd0,0x75,0x7a,0xd1,0x74,0x75,0xd0,0x7a,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x00,0x01,0x00,0x7f,0xff,0xf1,0x03,0xda,0x03,0x6e,0x00,0x1b,0x00,0x34,0x40,0x12,0x1b,0x0f,0x0f,0x00,0x0e,0x07,0x8b,0x15,0x00,0x1b, +0x0e,0x0f,0x1b,0x0f,0x1b,0x0f,0x03,0x12,0xb8,0x01,0x7f,0xb3,0x0b,0x18,0x9b,0x03,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x32,0x11,0x33,0x31,0x30,0x13,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26, +0x23,0x22,0x06,0x07,0x80,0x3d,0xe0,0x84,0x79,0xcb,0x75,0x7c,0xd1,0x76,0x85,0xda,0x39,0x89,0x26,0x88,0x59,0x84,0xb0,0xac,0x7e,0x5c,0x93,0x24,0x02,0x68,0x7a,0x8c,0x7a,0xd0,0x75,0x73,0xd1,0x7a,0x91,0x7b,0x37,0x54,0x60,0xab,0x7c,0x7f,0xb9,0x65,0x58,0x00,0x00,0x01,0x00,0x3a,0xfd,0xfe,0x03,0xc2,0x03,0x64,0x00,0x12,0x00,0x24, +0x40,0x0d,0x00,0x8b,0x10,0x10,0x14,0x09,0x8b,0x08,0x08,0x08,0x04,0x11,0x0d,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xc2,0x70,0xc5,0x85,0x92,0xcf,0x6d,0x98, +0x4d,0x8d,0x5c,0x88,0x9b,0x97,0x0d,0x91,0xef,0x75,0x6f,0xc7,0x82,0x52,0x8a,0x4d,0xc8,0xb1,0x03,0x5e,0x00,0x01,0x00,0x7f,0xfd,0xfe,0x03,0xda,0x03,0x6e,0x00,0x1f,0x00,0x47,0x40,0x1b,0x00,0xa8,0x1f,0x1f,0x21,0x1e,0x0a,0x10,0x04,0x04,0x11,0x03,0x18,0x8b,0x0a,0x11,0x10,0x03,0x1e,0x04,0x1c,0x10,0x04,0x10,0x04,0x14,0x07,0xb8, +0x01,0x7f,0xb4,0x1c,0x0d,0x9b,0x14,0x00,0x00,0x2f,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x32,0x11,0x33,0x11,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x01,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16, +0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x27,0x01,0x03,0x0f,0xfd,0xcb,0x2d,0x2e,0x89,0x26,0x88,0x59,0x83,0xb1,0xab,0x7f,0x5c,0x93,0x24,0x86,0x3d,0xe0,0x84,0x79,0xcc,0x74,0x7c,0xd1,0x76,0x05,0x05,0x01,0xc2,0xfd,0xfe,0x02,0x7d,0x32,0x54,0x38,0x54,0x60,0xa8,0x7e,0x80,0xb4,0x65,0x58,0x46,0x7a,0x8c,0x78,0xcd,0x75,0x73,0xd1,0x7a, +0x01,0xfe,0x07,0x00,0x00,0x01,0x00,0x80,0xfd,0xfe,0x03,0xdb,0x03,0x6e,0x00,0x1f,0x00,0x45,0x40,0x1d,0x0f,0x1b,0x1b,0x0e,0x01,0x1c,0x1c,0x07,0x21,0x1f,0x89,0x00,0x15,0x8b,0x07,0x1c,0x1b,0x0e,0x0f,0x01,0x1b,0x0f,0x1b,0x0f,0x03,0x12,0x9b,0x0b,0x18,0xb8,0x01,0x7f,0xb1,0x03,0x00,0x00,0x2f,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39, +0x2f,0x2f,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0xd4,0xed,0x11,0x12,0x39,0x2f,0x39,0x33,0x33,0x11,0x33,0x31,0x30,0x13,0x01,0x07,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x07,0x01,0x9f,0x01,0xb5,0x0b,0x06,0x75,0xd2,0x7c,0x74, +0xcb,0x7a,0x84,0xdd,0x40,0x86,0x25,0x93,0x5b,0x7f,0xab,0xb2,0x82,0x59,0x88,0x26,0x89,0x2a,0x32,0xfd,0xe0,0xfd,0xfe,0x01,0xf9,0x01,0x7a,0xd0,0x74,0x74,0xcd,0x79,0x8b,0x7b,0x46,0x58,0x65,0xb3,0x81,0x7e,0xa8,0x60,0x54,0x38,0x50,0x36,0xfd,0x83,0x00,0x02,0x00,0x80,0xfd,0xfe,0x04,0x08,0x03,0x6e,0x00,0x27,0x00,0x33,0x00,0x5c, +0xb4,0x14,0x8b,0x24,0x02,0x05,0xbb,0x01,0x83,0x00,0x2e,0x00,0x28,0x01,0x83,0x40,0x0d,0x0b,0x24,0x2e,0x0b,0x0b,0x2e,0x24,0x03,0x35,0x1d,0x8b,0x1c,0x31,0xbb,0x01,0x7e,0x00,0x02,0x00,0x2b,0x01,0x7e,0x40,0x0a,0x08,0x02,0x08,0x1c,0x1c,0x08,0x02,0x03,0x0f,0x21,0xb8,0x01,0x7f,0xb3,0x18,0x00,0x9b,0x0f,0x00,0x2f,0xed,0x2f,0xed, +0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36, +0x35,0x11,0x34,0x26,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x4d,0x7a,0x52,0x55,0x73,0x82,0x61,0x5f,0x83,0x75,0xd3,0x81,0x86,0xc5,0x70,0x70,0xc6,0x85,0x91,0xcf,0x6d,0x98,0x4d,0x8d,0x5b,0x89,0x9b,0x99,0xfe,0x2b,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x02,0xdf,0x4e,0x0a,0x81,0x56,0x5b,0x87,0x84, +0x5d,0x7b,0xce,0x76,0x76,0xee,0x91,0xfe,0x7a,0x90,0xef,0x76,0x6e,0xc8,0x82,0x56,0x86,0x4d,0xc8,0xb1,0x01,0x6a,0xb0,0xbf,0xfe,0xd2,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x2f,0x00,0x3b,0x00,0x6f,0xb9,0x00,0x30,0x01,0x83,0xb7,0x00,0x0b,0x8b,0x28,0x1a,0x8b,0x1b,0x06, +0xb8,0x01,0x83,0x40,0x11,0x36,0x08,0x36,0x00,0x28,0x1b,0x36,0x36,0x1b,0x28,0x00,0x04,0x3d,0x23,0x8b,0x12,0x33,0xb8,0x01,0x7e,0x40,0x18,0x2d,0x08,0x2d,0x39,0x9b,0x03,0x2d,0x03,0x2f,0x1b,0x01,0x1b,0x30,0x2d,0x01,0x1b,0x03,0x2d,0x03,0x0e,0x1f,0x9b,0x17,0x25,0xb9,0x01,0x7f,0x00,0x0e,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39, +0x5d,0x2f,0x5d,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x12,0x15,0x23,0x34,0x26,0x26, +0x23,0x22,0x06,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x07,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x0f,0x86,0x5c,0x5e,0x85,0x38,0x2a,0x35,0xfb,0xc6,0x8a,0xc6,0x6a,0x73,0xc5,0x82,0xd9,0xf5,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x01,0x23,0x94,0x96,0x3a,0x25,0x0a,0x0b,0x5e,0x83, +0x7f,0x3c,0x27,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x02,0x7c,0x60,0x84,0x85,0x5e,0x52,0x43,0x1d,0x49,0x37,0x9f,0xbb,0x6a,0xd7,0x8c,0x02,0x54,0x8a,0xdf,0x6e,0xfe,0xf0,0xdb,0x60,0xa0,0x5c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x61,0x5b,0x23,0x2d,0x10,0x01,0x83,0x60,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x3c,0x00,0x00,0x01,0x00,0x80,0xfe,0x05, +0x04,0x30,0x03,0x6e,0x00,0x32,0x00,0x43,0xb9,0x00,0x00,0x01,0x84,0x40,0x0c,0x32,0x23,0x8b,0x10,0x32,0x10,0x32,0x10,0x34,0x19,0x18,0x2a,0xb8,0x01,0x84,0x40,0x0b,0x08,0x18,0x19,0x32,0x19,0x32,0x04,0x13,0x9b,0x1f,0x2d,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0xed,0xc6,0x32, +0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x0e,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x04,0x30,0x07,0x40,0x6d, +0x4b,0x50,0x68,0x3a,0x1d,0x35,0x45,0x44,0x34,0x1c,0xaf,0x7c,0x7c,0xab,0x2d,0x7b,0x4a,0x79,0xd0,0x76,0x7a,0xd1,0x77,0x1e,0x32,0x50,0x58,0x35,0x2c,0x28,0x13,0x1d,0x1d,0x15,0x15,0xf9,0x48,0x74,0x46,0x32,0x5d,0x3b,0x3d,0x62,0x6e,0x6b,0x69,0x6c,0x69,0x34,0x7f,0xa7,0xae,0x82,0x58,0x4a,0x52,0x72,0x82,0x7a,0xd1,0x74,0x72,0xca, +0x79,0x34,0x75,0x68,0x7e,0x88,0x88,0x37,0x2a,0x2c,0x09,0x19,0x23,0x48,0x00,0x02,0x00,0x80,0xff,0xf0,0x04,0x01,0x03,0x6e,0x00,0x1d,0x00,0x24,0x00,0x47,0xb5,0x1a,0x8b,0x03,0x1d,0x00,0x0c,0xb8,0x01,0x83,0x40,0x0f,0x1e,0x03,0x00,0x1e,0x1e,0x00,0x03,0x03,0x26,0x21,0x8b,0x12,0x00,0x1d,0x21,0xb8,0x01,0x7d,0xb6,0x09,0x09,0x0f, +0x06,0x9b,0x16,0x23,0xb9,0x01,0x80,0x00,0x0f,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x2f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15, +0x14,0x06,0x07,0x25,0x34,0x26,0x27,0x16,0x17,0x36,0x02,0xa5,0x53,0x72,0xaf,0x7c,0x64,0xa0,0x1a,0x7c,0x9d,0x6e,0x51,0x77,0x84,0x79,0xd1,0x75,0x79,0xd0,0x79,0x9d,0x76,0xfe,0xc5,0x57,0x42,0x0a,0x74,0x1b,0x6f,0x1d,0xb5,0x6e,0x80,0xb0,0x76,0x5e,0x09,0x9b,0x6f,0x4d,0x9d,0x1d,0x45,0xf8,0x92,0x72,0xc6,0x76,0x75,0xd0,0x7a,0x92, +0xfe,0x2f,0xfd,0x45,0x66,0x04,0x91,0x7a,0x2e,0x00,0x00,0x02,0x00,0x80,0xfd,0xfe,0x04,0x08,0x03,0x6e,0x00,0x30,0x00,0x3c,0x00,0x72,0x40,0x09,0x05,0x29,0x16,0x8b,0x15,0x26,0x8b,0x08,0x2b,0xbb,0x01,0x83,0x00,0x37,0x00,0x31,0x01,0x83,0x40,0x10,0x00,0x29,0x15,0x08,0x37,0x00,0x00,0x37,0x08,0x15,0x04,0x3e,0x0e,0x8b,0x1e,0x34, +0xb8,0x01,0x7e,0x40,0x19,0x2e,0x3a,0x9b,0x03,0x29,0x03,0x20,0x15,0x30,0x15,0x40,0x15,0x03,0x15,0x2e,0x03,0x03,0x2e,0x15,0x03,0x1a,0x0b,0x9b,0x23,0x11,0xb9,0x01,0x7f,0x00,0x1a,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x39, +0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x25,0x34,0x36,0x33,0x33,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x20,0x11,0x11,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x33,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16, +0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x0f,0x83,0x5e,0x0b,0x0a,0x25,0x3a,0x97,0x93,0xfe,0xdd,0x98,0x8b,0x5b,0x93,0x48,0x98,0x6e,0xcf,0x91,0x83,0xc4,0x73,0x6a,0xc7,0x89,0xc6,0xfb,0x35,0x2a,0x38,0x82,0x61,0x5c,0x86,0x7f,0x3b,0x28,0x29,0x3b,0x3c,0x28,0x28,0x3b,0xe3,0x5e,0x83,0x01,0x10,0x2d,0x23,0x5c,0x60,0xfe, +0xaf,0xfe,0x6e,0xb1,0xbe,0x4c,0x83,0x5a,0x82,0xc7,0x6f,0x6e,0xe0,0x89,0x01,0xcc,0x8c,0xd8,0x69,0xbc,0x9e,0x37,0x49,0x1d,0x43,0x52,0x5c,0x87,0x84,0x5e,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x3c,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x0f,0x00,0x1a,0x00,0x23,0x40,0x0d,0x00,0x8b,0x1a,0x1a,0x1c,0x16,0x8b,0x07, +0x12,0x9b,0x0c,0x07,0x18,0xb8,0x01,0x7f,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x07,0x10,0x21,0x22,0x06,0x15,0x11,0x10,0x21,0x20,0x11,0x04,0x08,0xf6,0xd8,0x8a,0xc6,0x6a,0x74,0xc7,0x83,0xdb,0xef, +0x97,0xfe,0xc9,0x88,0x9b,0x01,0x23,0x01,0x37,0x01,0xc8,0xd6,0xfe,0xff,0x6a,0xd7,0x8c,0x02,0x54,0x85,0xe3,0x6f,0xf2,0xdc,0x0d,0x01,0x4c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x01,0x6f,0x00,0x00,0x01,0x00,0x66,0xff,0xe7,0x03,0xa8,0x05,0xe8,0x00,0x09,0x00,0x2d,0x40,0x15,0x03,0x8b,0x07,0x05,0x07,0x05,0x0b,0x00,0x05,0x04,0x00,0x09, +0x04,0x09,0x04,0x09,0x01,0x07,0x18,0x01,0x06,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x13,0x25,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x05,0x66,0x01,0xd1,0x1c,0x01,0x2b,0x2a,0xfe,0x30,0x1c,0xfe,0xd4,0x05,0x16,0xd2,0xfa,0xcb,0x86,0x80,0xd2,0x05,0x35,0x83, +0x00,0x01,0x00,0x80,0x00,0x00,0x03,0xd2,0x05,0xe9,0x00,0x22,0x00,0x32,0xb7,0x08,0x8b,0x1b,0x1b,0x24,0x22,0x03,0x11,0xb8,0x01,0x84,0x40,0x0e,0x00,0x12,0x03,0x00,0x00,0x01,0x12,0x18,0x1e,0x9b,0x05,0x05,0x01,0x06,0x00,0x3f,0x33,0x2f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0x33,0xed,0x32,0x32,0x12,0x39,0x2f,0xed,0x31,0x30, +0x13,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x80,0x97,0x73,0x87,0xca,0xf7,0x51,0x92,0xaa,0x80,0x66,0x37,0x94,0x43,0x77,0x9d,0x91,0x7d,0x42,0xaa,0x80,0x4e,0x83,0x29,0x04,0x12,0x01,0xd1,0x45,0x4b,0xed, +0xbd,0x57,0x9f,0x9d,0x85,0x65,0x66,0x5d,0x2e,0xd1,0xe0,0x42,0x7b,0x7d,0x7b,0x71,0x81,0x7a,0x3e,0x7b,0xa0,0x4e,0x3c,0xbe,0x00,0x01,0x00,0x66,0x00,0x00,0x04,0x34,0x05,0xe3,0x00,0x12,0x00,0x2c,0xb6,0x0a,0x8b,0x0b,0x0b,0x14,0x03,0x12,0xbb,0x01,0x85,0x00,0x00,0x00,0x0f,0x01,0x7f,0xb7,0x03,0x05,0x05,0x01,0x06,0x0b,0x00,0x18, +0x00,0x3f,0x32,0x3f,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x01,0x33,0x03,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x03,0x66,0x01,0xeb,0xa7,0xd1,0x28,0x2c,0x7d,0xcb,0x71,0x97,0xac,0x7e,0x44,0x3f,0xe9,0x05,0xe3,0xfd,0x83,0x08,0x6a,0xbd,0x70,0xfe,0x29,0x01, +0xa7,0x7f,0xb9,0x1e,0xfd,0x3f,0x00,0x01,0x00,0x66,0xff,0xe7,0x04,0x8b,0x05,0xe3,0x00,0x09,0x00,0x37,0x40,0x09,0x03,0x8b,0x07,0x05,0x07,0x05,0x07,0x0b,0x09,0xb8,0x01,0x85,0x40,0x0f,0x00,0x05,0x08,0x01,0x03,0x07,0x04,0x04,0x01,0x07,0x18,0x01,0x06,0x00,0x18,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x33,0x01, +0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x33,0x01,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x01,0x66,0x02,0x1d,0xb3,0x01,0x2c,0x29,0xfe,0x30,0x1c,0xfe,0x68,0x05,0xe3,0xfa,0xcf,0x87,0x80,0xd2,0x04,0x7a,0xfb,0x9f,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x59,0x05,0xe3,0x00,0x11,0x00,0x1d,0x00,0x35,0x40,0x16,0x00,0x04, +0x8b,0x0f,0x1c,0x02,0x1c,0x02,0x1f,0x15,0x8b,0x0b,0x03,0x12,0x9b,0x00,0x0e,0x0e,0x08,0x10,0x06,0x18,0xb8,0x01,0x7f,0xb1,0x08,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x33,0x15,0x23,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33, +0x21,0x11,0x33,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x03,0xdf,0x7a,0x7a,0x67,0xbb,0x7a,0xd0,0xf3,0xf1,0xc9,0x01,0x0e,0x97,0xfe,0x62,0x8d,0x9d,0xa6,0x8e,0x40,0x78,0x45,0x03,0x6e,0x8f,0xfe,0xa0,0x7c,0xb3,0x5f,0xee,0xd0,0xcb,0xf4,0x02,0x75,0xfc,0xfc,0xa4,0x94,0x8a,0x9d,0x3a,0x64,0x3f,0x01,0x82,0x00, +0x00,0x02,0x00,0x80,0x00,0x00,0x04,0x59,0x05,0xe9,0x00,0x11,0x00,0x1d,0x00,0x36,0x40,0x1b,0x10,0x02,0x8b,0x03,0x1d,0x03,0x00,0x03,0x00,0x03,0x1f,0x19,0x8b,0x08,0x10,0x1c,0x99,0x01,0x05,0x05,0x03,0x16,0x9b,0x0b,0x07,0x03,0x18,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11, +0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x33,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x04,0x59,0x7a,0x97,0xfe,0xf2,0xca,0xf0,0xf3,0xd0,0x79,0xbc,0x67,0x7a,0xfe,0xef,0x46,0x77,0x40,0x8e,0xa6,0x9d,0x8d,0x01,0x07,0x02,0x6c,0xfd, +0x94,0x02,0x6c,0xf4,0xcb,0xcf,0xef,0x5f,0xb3,0x7c,0xfe,0xa1,0x01,0x81,0x3f,0x65,0x39,0x9c,0x8a,0x96,0xa2,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x03,0x41,0x05,0xe3,0x00,0x07,0x00,0x2a,0x40,0x0d,0x02,0x89,0x05,0x03,0x01,0x05,0x05,0x01,0x03,0x03,0x09,0x00,0x02,0xb8,0x01,0x7f,0xb5,0x05,0x18,0x07,0x9b,0x00,0x06,0x00,0x3f,0xed, +0x3f,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x31,0x30,0x13,0x21,0x01,0x21,0x15,0x21,0x01,0x21,0x67,0x02,0xa8,0xfe,0x4f,0x01,0xe3,0xfd,0x50,0x01,0xaa,0xfe,0x2c,0x05,0xe3,0xfa,0xac,0x8f,0x05,0x54,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x01,0x05,0xfe,0x00,0x28,0x00,0x34,0x00,0x59,0x40,0x29,0x1a,0x1b,0x00,0x27, +0x03,0x09,0x8b,0x29,0x24,0x29,0x14,0x11,0x1b,0x06,0x29,0x1b,0x27,0x29,0x29,0x27,0x1b,0x03,0x36,0x1e,0x2f,0x8b,0x17,0x11,0x27,0x1b,0x1b,0x00,0x1a,0x14,0x06,0x0d,0x2c,0x9b,0x21,0x06,0x32,0xb8,0x01,0x7f,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0xc4,0x32,0x32,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39, +0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x13,0x34,0x26,0x23, +0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x5b,0x4c,0x5a,0x6e,0x60,0x5f,0x6f,0x78,0xd2,0x78,0x78,0xd0,0x77,0x6a,0x63,0x5e,0x6f,0x5d,0x4d,0x63,0x36,0x3f,0xad,0x7a,0x7e,0xad,0x40,0x39,0x66,0x13,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x05,0xfb,0x3c,0xb3,0x6d,0x6f,0xca,0x3e,0x3d,0xc7,0x75,0x76,0xce,0x7a,0x79,0xd0,0x75, +0x72,0xc7,0x40,0x3d,0xc8,0x72,0x6e,0xb4,0x3d,0x6a,0x2a,0x7e,0x4d,0x81,0xae,0xb4,0x7b,0x4b,0x80,0x2b,0x66,0xfb,0xb4,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x02,0x00,0x80,0xff,0xdc,0x04,0x01,0x05,0xe9,0x00,0x27,0x00,0x33,0x00,0x5a,0x40,0x2e,0x0d,0x0c,0x27,0x00,0x1e,0x24,0x8b,0x03,0x28,0x03,0x13,0x10,0x0c,0x21,0x03,0x0c, +0x00,0x03,0x03,0x00,0x0c,0x03,0x35,0x2e,0x09,0x8b,0x16,0x10,0x31,0x99,0x13,0x21,0x1a,0x06,0x06,0x0d,0x2b,0x9b,0x1a,0x07,0x00,0x0c,0x0c,0x27,0x0d,0x19,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10, +0xed,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0xf1,0x39,0x40, +0xae,0x7d,0x7a,0xad,0x3f,0x36,0x63,0x4d,0x5d,0x6f,0x5e,0x61,0x6c,0x78,0xd0,0x77,0x78,0xd2,0x78,0x6f,0x5f,0x61,0x6d,0x5b,0x4d,0x11,0xae,0x7d,0x7a,0xad,0xa9,0x7e,0x7e,0xad,0x46,0x2a,0x80,0x4b,0x7c,0xb3,0xae,0x81,0x4d,0x7e,0x29,0x6b,0x3d,0xb4,0x6e,0x71,0xc9,0x3d,0x3e,0xca,0x71,0x76,0xd0,0x78,0x7a,0xce,0x76,0x75,0xc6,0x3e, +0x3f,0xc9,0x6f,0x6d,0xb3,0x3e,0x04,0x4e,0x7c,0xb3,0xae,0x81,0x81,0xae,0xb1,0x00,0x00,0x02,0x00,0xa0,0xff,0xec,0x04,0x14,0x05,0xa3,0x00,0x0b,0x00,0x17,0x00,0x26,0xb9,0x00,0x00,0x01,0x85,0x40,0x0b,0x0c,0x0c,0x19,0x12,0x8a,0x06,0x0f,0x9b,0x09,0x06,0x15,0xb8,0x01,0x7f,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed, +0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0x14,0xd6,0xe5,0xe0,0xd9,0xda,0xdf,0xe0,0xdb,0xa0,0x8c,0x8f,0x8a,0x8d,0x88,0x8f,0x92,0x89,0x02,0xc8,0xfe,0x7a,0xfe,0xaa,0x01,0x58,0x01,0x84,0x01,0x78,0x01,0x63,0xfe, +0xa0,0xfe,0x85,0x01,0x3c,0x01,0x13,0xfe,0xe1,0xfe,0xd0,0xfe,0xc9,0xfe,0xe7,0x01,0x11,0x00,0x00,0x01,0x00,0x8c,0xff,0xec,0x04,0x4d,0x05,0xa3,0x00,0x2c,0x00,0x56,0xb9,0x00,0x16,0x01,0x85,0x40,0x0e,0x2b,0x09,0x03,0x23,0x09,0x03,0x1d,0x1d,0x03,0x09,0x23,0x04,0x2e,0x28,0xbb,0x01,0x85,0x00,0x0f,0x00,0x2b,0x01,0x7f,0x40,0x15, +0x0c,0x1c,0x1d,0x00,0x0c,0x06,0x0c,0x1d,0x1d,0x0c,0x06,0x03,0x13,0x1f,0x99,0x1a,0x19,0x25,0x9b,0x13,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0xed,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x00,0x11,0x14,0x02,0x04,0x23,0x22,0x27,0x27,0x16,0x33,0x32,0x36,0x12,0x35,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x38,0x29,0x30,0x4c,0x34,0x3e,0x4c,0x94,0x6f,0x9e,0xbc,0x77,0xd6,0x84,0xeb,0x01,0x05,0xaf,0xfe,0xcf,0xc4,0x48,0x50,0x1b,0x5f,0x68,0x93,0xdc, +0x81,0xfe,0xa4,0x88,0x9d,0x68,0x54,0x3a,0x02,0xf2,0x0b,0x42,0x27,0x32,0x4e,0x5a,0x3f,0x68,0x95,0xd9,0xb3,0x7b,0xd3,0x79,0xfe,0xa1,0xfe,0xb6,0xe2,0xfe,0x95,0xc1,0x0a,0xa5,0x19,0x92,0x01,0x1e,0xb6,0x02,0x2f,0xbd,0x90,0x66,0x88,0x00,0x00,0x02,0x00,0x64,0xff,0xec,0x05,0x7f,0x06,0x3b,0x00,0x4c,0x00,0x55,0x00,0x85,0xb5,0x31, +0x1a,0x1a,0x13,0x21,0x4d,0xbe,0x01,0x85,0x00,0x2b,0x00,0x25,0x01,0x84,0x00,0x52,0x00,0x38,0x01,0x85,0x40,0x0b,0x13,0x2b,0x52,0x13,0x13,0x52,0x2b,0x03,0x57,0x4c,0x04,0xb8,0x01,0x85,0xb4,0x48,0x40,0x9b,0x0b,0x50,0xb8,0x01,0x7e,0x40,0x13,0x28,0x55,0x9b,0x21,0x1a,0x9b,0x31,0x0b,0x28,0x21,0x31,0x31,0x21,0x28,0x0b,0x04,0x2f, +0x10,0x07,0xb8,0x01,0x7f,0x40,0x0b,0x3b,0x45,0x19,0x16,0x1d,0x9b,0x4c,0x00,0x34,0x2f,0x06,0x00,0x3f,0x33,0xc4,0x32,0xed,0x32,0x3f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x11,0x39,0x11, +0x33,0x31,0x30,0x13,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x11,0x34,0x23,0x22,0x06,0x07,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x2e,0x02, +0x23,0x22,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x94,0x66,0x65,0x57,0x24,0x47,0x3e,0x6c,0x68,0x30,0x5f,0x5a,0x53,0x24,0x20,0x2c,0x62,0x22,0x5a,0x2f,0x23,0x2c,0x5c,0x52,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x92,0x6a,0x2d,0x83,0x41,0x69,0x76,0x85, +0x59,0x34,0x56,0x54,0x59,0x37,0x36,0x5e,0x5b,0x5f,0x37,0x78,0x77,0x26,0x35,0x02,0x1d,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x13,0x72,0x6e,0xfb,0xa2,0x72,0x11,0x17,0x28,0x19,0x1e,0x19,0x38,0x20,0x03,0xbd,0x8a,0x46,0x38,0x2a,0x33,0x74,0x55,0x56,0xbd,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x01,0xfd,0xa8,0x9b,0x82,0x3a,0x48, +0x9b,0x8b,0xfc,0x21,0x45,0x6d,0x19,0x1e,0x19,0x19,0x1e,0x19,0x67,0x6d,0x04,0x44,0x5b,0x43,0x0f,0xfc,0xd9,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x02,0x00,0xa0,0xff,0xec,0x06,0x1e,0x05,0xa3,0x00,0x28,0x00,0x31,0x00,0x5e,0xb9,0x00,0x15,0x01,0x84,0xb2,0x2e,0x22,0x08,0xbb,0x01,0x85,0x00,0x09,0x00,0x28,0x01,0x85,0x40,0x0b, +0x00,0x2e,0x09,0x00,0x00,0x09,0x2e,0x03,0x33,0x11,0x29,0xb8,0x01,0x85,0x40,0x0f,0x1b,0x31,0x9b,0x22,0x1f,0x11,0x11,0x18,0x04,0x0d,0x9b,0x24,0x1f,0x06,0x2c,0xb8,0x01,0x7e,0xb4,0x18,0x19,0x00,0x09,0x18,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f, +0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x21,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x25,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x7e,0x82,0x62,0x69, +0x82,0xa0,0x82,0x69,0x63,0x81,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0xd4,0xb0,0x64,0xa2,0x35,0x6c,0xcf,0xaf,0xd5,0xfb,0x22,0x22,0x1c,0x37,0x4d,0x28,0x04,0x1e,0x70,0x89,0x8a,0x6f,0xfb,0xe2,0x04,0x1e,0x6f,0x8a,0x8a,0x6f,0xfd,0xc0,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x03,0x89,0xb5,0xd2,0x44,0x42,0x86,0xd1,0xb6,0xfb,0xe4, +0xba,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x01,0x00,0xa0,0xff,0xec,0x04,0xc4,0x06,0x27,0x00,0x3d,0x00,0x6f,0x40,0x12,0x08,0x89,0x32,0x38,0x8b,0x03,0x2f,0x00,0x32,0x00,0x03,0x03,0x00,0x32,0x03,0x28,0x0b,0x1f,0xb8,0x01,0x85,0xb6,0x1c,0x0b,0x1c,0x0b,0x1c,0x3f,0x28,0xb8,0x01,0x85,0x40,0x14,0x15,0x23,0x19,0x19,0x1d,0x35, +0x0e,0x2f,0x2f,0x12,0x03,0x35,0x3b,0x3b,0x12,0x06,0x9b,0x35,0x06,0x2b,0xb8,0x01,0x7f,0xb4,0x12,0x19,0x0b,0x0c,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0x10,0xc4,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10, +0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x00,0x25,0x36,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23, +0x22,0x26,0x03,0x9f,0x51,0x37,0x08,0x57,0x44,0xb6,0xe7,0xf1,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x01,0x00,0x01,0x1e,0xa9,0x97,0xa0,0x5a,0xac,0xa3,0xa4,0xb7,0x5a,0x6a,0x64,0x2e,0x77,0x7d,0x2d,0x93,0xa6,0xb8,0x9f,0x96,0xb3,0x58,0x44,0x39,0x50,0x02,0x26,0x39,0x4f,0x3b,0x44,0xdc,0x90,0xdd,0x56,0xa0,0x21,0x11,0x12, +0xc2,0x9f,0x01,0x0f,0x01,0x05,0x01,0x2e,0x4e,0x2d,0x61,0x41,0x7b,0x73,0x56,0x81,0x58,0x2b,0x2c,0x82,0xc7,0x8b,0xd6,0x83,0x89,0x0f,0x0f,0x01,0x3d,0xd9,0x93,0xb1,0xc8,0xcb,0xa7,0x4c,0x5e,0x4f,0x00,0x02,0x00,0xa0,0xff,0xec,0x04,0xf8,0x06,0x3b,0x00,0x4e,0x00,0x5a,0x00,0xa2,0xb9,0x00,0x4f,0x01,0x84,0xb4,0x3e,0x46,0x3c,0x3e, +0x44,0xbb,0x01,0x84,0x00,0x55,0x00,0x04,0x01,0x85,0x40,0x1f,0x4a,0x2a,0x89,0x15,0x1b,0x8b,0x24,0x13,0x21,0x15,0x21,0x24,0x24,0x21,0x15,0x03,0x0c,0x2d,0x3e,0x55,0x4a,0x2d,0x00,0x00,0x2d,0x4a,0x55,0x3e,0x05,0x5c,0x0c,0xb8,0x01,0x85,0x40,0x1e,0x37,0x00,0x4e,0x41,0x30,0x13,0x27,0x9b,0x18,0x46,0x3c,0x08,0x13,0x34,0x24,0x1e, +0x08,0x52,0x18,0x41,0x1e,0x18,0x1e,0x18,0x34,0x58,0x9b,0x41,0x06,0x0f,0xb8,0x01,0x7f,0xb4,0x34,0x19,0x2d,0x2e,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x39,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f, +0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x15,0x14,0x06,0x06,0x23,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x26,0x26,0x23, +0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x3e,0x02,0x35,0x35,0x34,0x36,0x37,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x04,0xf8,0x37,0x23,0x7d,0xf5,0x8f,0xae,0xaf,0x6a,0x64,0x2e,0x77,0x7d, +0x2d,0xfe,0xc7,0xc5,0x92,0x96,0xb3,0x58,0x44,0x39,0x50,0x51,0x37,0x08,0x57,0x44,0x53,0x63,0xf9,0xdf,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x43,0x8b,0x72,0x61,0x7a,0x62,0x5f,0x84,0x1b,0x41,0x62,0x38,0x67,0x64,0xfd,0x3f,0x30,0x23,0x24,0x31,0x31,0x24,0x23,0x30,0x05,0xb1,0x10,0x45,0x58,0x53,0x56,0x80,0x47,0x1d,0xbe, +0xaf,0x86,0x83,0x89,0x0f,0x0f,0x01,0x7c,0xf5,0x8b,0xb8,0xcb,0xa7,0x4c,0x5e,0x4f,0x3a,0x39,0x4f,0x3b,0x44,0x60,0x53,0x7a,0xc7,0x3d,0xa0,0x21,0x11,0x12,0xc2,0x9f,0xbf,0x7f,0xa2,0x7d,0x2a,0x43,0x70,0x5f,0x83,0x86,0x5b,0x34,0x33,0x01,0x2e,0x4b,0x25,0x88,0x6f,0x71,0x13,0xfe,0x57,0x23,0x30,0x30,0x23,0x24,0x31,0x31,0x00,0x01, +0x00,0x7b,0xff,0xec,0x04,0x61,0x06,0x3b,0x00,0x3a,0x00,0x76,0xb9,0x00,0x24,0x01,0x85,0xb4,0x0b,0x32,0x89,0x00,0x1e,0xb8,0x01,0x85,0x40,0x11,0x17,0x12,0x13,0x0b,0x00,0x39,0x17,0x13,0x13,0x17,0x39,0x00,0x0b,0x05,0x3c,0x1a,0x05,0xb8,0x01,0x85,0xb3,0x2b,0x13,0x12,0x02,0xb8,0x01,0x7f,0x40,0x0d,0x2e,0x00,0x2e,0x35,0x12,0x2e, +0x35,0x35,0x2e,0x12,0x03,0x20,0x08,0xb8,0x01,0x7f,0x40,0x0a,0x27,0x19,0x1a,0x1b,0x17,0x1e,0x0f,0x9b,0x20,0x06,0x00,0x3f,0xed,0x39,0x39,0xc4,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed, +0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x33,0x32,0x00,0x11,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x02,0x4c,0x16, +0x3a,0x54,0x68,0x9c,0x89,0xb3,0xa9,0xac,0xa5,0x6d,0xba,0x2e,0x65,0x11,0x0c,0x04,0x2f,0x2d,0x2f,0x60,0x6c,0x02,0x70,0x74,0xfc,0x01,0x09,0xff,0xf1,0x84,0xd6,0x77,0xbc,0x9e,0x49,0x77,0x43,0x4c,0x3e,0x35,0x4b,0x30,0x02,0x9d,0x16,0x88,0x66,0x90,0xbd,0x01,0x08,0x01,0x13,0x9e,0xef,0xed,0x63,0x4e,0x72,0x26,0x1b,0x15,0x19,0x2a, +0x3e,0x0c,0x8a,0x13,0x72,0x4b,0x38,0xfe,0xc8,0xfe,0xd0,0xba,0xfe,0xbd,0xfe,0xae,0x79,0xd3,0x7b,0xb3,0xd9,0x44,0x76,0x43,0x3f,0x5a,0x4f,0x31,0x27,0x42,0x00,0x02,0x00,0xa0,0xff,0xec,0x05,0x85,0x06,0x3b,0x00,0x37,0x00,0x40,0x00,0x76,0xb9,0x00,0x1c,0x01,0x84,0xb5,0x3d,0x28,0x11,0x11,0x38,0x2e,0xbb,0x01,0x85,0x00,0x0a,0x00, +0x04,0x01,0x85,0x40,0x0d,0x33,0x3d,0x0a,0x37,0x33,0x33,0x37,0x0a,0x3d,0x04,0x42,0x18,0x38,0xb8,0x01,0x85,0x40,0x15,0x22,0x40,0x9b,0x18,0x11,0x9b,0x28,0x18,0x28,0x18,0x28,0x1f,0x0e,0x14,0x9b,0x37,0x00,0x2a,0x26,0x06,0x3b,0xb8,0x01,0x7e,0xb2,0x1f,0x19,0x30,0xb8,0x01,0x7f,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33, +0xc6,0x32,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15, +0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x04,0xba,0x66,0x65,0x85,0x72,0x72,0x7f,0x28,0x30,0x23,0x63,0x52,0x2b,0x5a,0x54,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x91, +0x6a,0x6c,0x84,0x6a,0x76,0x54,0x27,0x2d,0x29,0x31,0xfc,0xb5,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x15,0x6e,0x65,0xfb,0x6d,0x64,0x70,0x69,0x5d,0x03,0xdb,0x46,0x44,0x49,0x5f,0x33,0x74,0x55,0x56,0xfd,0x73,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x03,0xcd,0xa8,0x9b,0x82,0x82,0x9d,0x89,0xfc,0x67,0x6c,0x39,0x39,0x04,0x2c,0x57, +0x3c,0x08,0xfb,0x09,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x01,0x00,0xa0,0xff,0xec,0x04,0x8e,0x06,0x27,0x00,0x45,0x00,0x6d,0xb9,0x00,0x00,0x01,0x85,0xb5,0x43,0x33,0x13,0x13,0x0c,0x2e,0xb8,0x01,0x85,0x40,0x0f,0x1a,0x1f,0x89,0x28,0x43,0x1a,0x22,0x28,0x28,0x22,0x1a,0x43,0x04,0x47,0x0c,0xbb,0x01,0x85,0x00,0x39,0x00,0x13,0x01, +0x81,0x40,0x09,0x33,0x1f,0x25,0x33,0x25,0x33,0x2b,0x17,0x0f,0xb8,0x01,0x7f,0x40,0x0b,0x31,0x36,0x19,0x05,0x3f,0x3f,0x44,0x1d,0x9b,0x2b,0x06,0x00,0x3f,0xed,0xc4,0x39,0x11,0x33,0x3f,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x39,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11, +0x33,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x0e,0x04,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x17,0x16,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x3e,0x02,0x37, +0x3e,0x02,0x35,0x35,0x33,0x04,0x8e,0x2e,0x54,0x92,0x9a,0x7e,0x72,0x56,0x3a,0x20,0x3b,0x36,0x22,0x5a,0x2f,0x23,0x2c,0x2f,0x54,0x2b,0x41,0x39,0x52,0x3c,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x8a,0x9e,0x8e,0x6a,0x92,0x6a,0x2d,0x84,0x40,0x6c,0x82,0x38,0x73,0xc5,0xc1,0x72,0x71,0x3a,0xa0,0x05,0xb4,0x4a,0x72,0x55, +0x44,0x26,0x20,0x36,0x4e,0x73,0xa1,0x6f,0xfe,0xf0,0x44,0x46,0x46,0x38,0x2a,0x32,0x3b,0x39,0x01,0x9f,0x98,0x75,0x90,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80,0xe4,0xbc,0xb9,0xf9,0x82,0x3b,0x47,0xa1,0x85,0x01,0x2c,0x8b,0xcd,0x8f,0x6c,0x39,0x23,0x3d,0x52,0x30,0x7b,0x00,0x01,0x00,0xe9,0xff,0xec,0x04,0xac,0x06,0x3b, +0x00,0x43,0x00,0x85,0xb9,0x00,0x2f,0x01,0x85,0xb5,0x1b,0x40,0x04,0x8a,0x05,0x0b,0xb8,0x01,0x85,0x40,0x15,0x3b,0x05,0x23,0x38,0x29,0x3b,0x00,0x1b,0x10,0x23,0x29,0x3b,0x3b,0x29,0x23,0x10,0x1b,0x00,0x06,0x45,0x15,0xb8,0x01,0x85,0x40,0x20,0x36,0x00,0x43,0x3e,0x1e,0x9b,0x2c,0x38,0x12,0x9b,0x0f,0x20,0x26,0x2c,0x40,0x05,0x3e, +0x26,0x2c,0x0f,0x05,0x05,0x0f,0x2c,0x26,0x04,0x33,0x08,0x9b,0x3e,0x06,0x18,0xb8,0x01,0x7f,0xb1,0x33,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x39,0x10,0xed,0x10,0xc4,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39, +0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x21,0x07,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35, +0x10,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x34,0x36,0x37,0x04,0xac,0x37,0x23,0xa2,0x22,0x8e,0x61,0x6a,0x85,0x35,0x63,0x46,0x01,0x3c,0x10,0xed,0x8f,0xb5,0xb8,0x8c,0x91,0xa8,0x41,0x30,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x7e,0x8d,0x78,0xda,0x87,0xdf,0xfe,0xfb,0xdc,0x57,0x5e,0xe0,0xb6,0xa3,0x69,0x67, +0x64,0x05,0xb1,0x10,0x45,0x58,0xa4,0x56,0x61,0x70,0x5b,0x35,0x58,0x32,0x8c,0xb2,0x91,0x8f,0xb7,0x7d,0x6d,0x49,0x5e,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80,0xa7,0x99,0x6c,0xa2,0x58,0xf1,0xcd,0x01,0x2d,0x69,0x26,0x8b,0x5b,0x9b,0xbc,0x5b,0x6f,0x71,0x13,0x00,0x02,0x00,0x84,0x00,0x45,0x03,0x96,0x05,0xa3,0x00,0x0e, +0x00,0x1d,0x00,0x1f,0x40,0x0f,0x0f,0x89,0x00,0x00,0x1f,0x07,0x89,0x17,0x0b,0x9a,0x13,0x03,0x9b,0x1b,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x12,0x37,0x14,0x02,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32, +0x12,0x02,0xef,0x60,0x4c,0x4e,0x7c,0x4e,0x33,0x55,0x2f,0x4f,0x77,0x47,0xa7,0x75,0xc9,0x87,0x67,0x95,0x51,0x7a,0xd7,0x7c,0x98,0xad,0x03,0x81,0xb6,0xe2,0xb0,0xfe,0xa8,0xb8,0x72,0xb7,0x62,0xa8,0x01,0x5f,0xa0,0xf3,0xfe,0x7f,0xbc,0x8f,0x01,0x1e,0xba,0xd5,0x01,0x5e,0xc4,0xfe,0xd5,0x00,0x00,0x01,0x00,0x69,0xfe,0xf1,0x03,0x48, +0x05,0xa3,0x00,0x2e,0x00,0x3d,0x40,0x0f,0x00,0x89,0x15,0x1c,0x89,0x28,0x15,0x21,0x28,0x28,0x21,0x15,0x03,0x30,0x0e,0xb8,0x01,0x83,0x40,0x0e,0x09,0x0c,0x24,0x0c,0x24,0x05,0x18,0x9b,0x2c,0x06,0x11,0x99,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10, +0xed,0x31,0x30,0x01,0x14,0x02,0x02,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x16,0x33,0x32,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x12,0x36,0x33,0x32,0x12,0x03,0x48,0x5d,0x88,0xa7,0x50,0x3b,0x7b,0x4d,0x4d,0x11,0x1f,0x06,0x0b, +0x51,0x2d,0x46,0x93,0x53,0x3c,0x36,0x42,0x75,0x4d,0x27,0x10,0x09,0x5f,0x1d,0x11,0x38,0x22,0x74,0xcc,0x7a,0x7f,0x8b,0x03,0x60,0xec,0xfe,0x42,0xfe,0xdd,0xa2,0x4f,0x7b,0x3a,0x12,0x3a,0x20,0x3b,0x61,0x01,0x52,0x01,0xf7,0xcb,0xb6,0xca,0xc0,0xfe,0xa8,0x90,0x72,0x8f,0x29,0x17,0x15,0x1a,0x44,0x68,0x96,0x5a,0x01,0x0e,0x01,0x9e, +0xe2,0xfe,0xd5,0x00,0x00,0x01,0x00,0x84,0x00,0x8a,0x04,0x64,0x05,0xa3,0x00,0x3f,0x00,0x4e,0xb5,0x0c,0x32,0x08,0x32,0x0f,0x00,0xb8,0x01,0x83,0x40,0x21,0x3b,0x2f,0x89,0x15,0x3b,0x15,0x0f,0x20,0x20,0x0f,0x15,0x3b,0x04,0x41,0x1c,0x89,0x27,0x32,0x08,0x0c,0x05,0x08,0x3d,0x3d,0x08,0x05,0x0c,0x04,0x23,0x17,0x9b,0x2c,0x06,0x00, +0x3f,0xed,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x17,0x16,0x15, +0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x03,0x03,0x36,0x33,0x32,0x16,0x33,0x32,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x04,0x64,0x0f,0x6e,0x65,0x44,0x1f,0x3a,0x1f,0x2b,0x35,0x0a,0x09,0x15,0x3e,0x0b,0x01,0x1a,0x29,0x31,0x68,0x41,0xb8,0x9e,0x55,0x30,0x09,0x5f,0x1c,0x13,0x31,0x21,0x6f, +0xcc,0xf4,0x72,0x78,0x89,0xa9,0xc5,0x0d,0x14,0x18,0x2c,0x1b,0x17,0x62,0x21,0x0b,0x0d,0x0b,0x23,0x4c,0x02,0x21,0x11,0x2d,0xd7,0x60,0x12,0x22,0x07,0x40,0x10,0x16,0x16,0x02,0x32,0x52,0xaa,0x28,0xb2,0x9b,0xf7,0xfe,0xeb,0x89,0x5b,0x7d,0x18,0x11,0x17,0x47,0x5b,0x8b,0x3f,0xbf,0x01,0x6d,0x01,0x23,0xa5,0xa4,0x86,0x71,0xfe,0xbb, +0xfe,0x84,0x04,0x09,0x8d,0x51,0x1c,0x17,0x23,0x00,0x00,0x01,0x00,0x84,0x01,0x73,0x04,0x1b,0x05,0xa3,0x00,0x54,0x00,0x4c,0x40,0x28,0x47,0x89,0x14,0x41,0x4b,0x0c,0x14,0x34,0x23,0x0c,0x14,0x00,0x00,0x14,0x0c,0x23,0x34,0x05,0x56,0x2f,0x89,0x3a,0x16,0x2b,0x9b,0x3e,0x41,0x3e,0x51,0x1f,0x51,0x1f,0x04,0x37,0x4b,0x03,0x0a,0x43, +0x3e,0x06,0x00,0x3f,0x33,0xc4,0x17,0x32,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x07,0x22,0x35,0x35,0x34,0x37,0x37,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07, +0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x16,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x16,0x04,0x0e,0x62,0x7f,0x2a,0x11,0x2d,0x28,0x23,0x23, +0x10,0x36,0x43,0x20,0x9b,0x2a,0x3b,0x19,0x15,0x16,0x2b,0x31,0x38,0x24,0x23,0x30,0x27,0x1b,0x11,0x2f,0x2b,0x25,0x48,0x29,0x23,0x38,0x58,0x35,0x0d,0x11,0x0d,0x6b,0x1e,0x12,0x36,0x5f,0xa8,0x72,0x29,0x68,0x16,0x5e,0x61,0x36,0x53,0x2f,0x54,0x50,0x8d,0x18,0x1c,0x20,0x4f,0x1c,0x0d,0x15,0x11,0x32,0x02,0x62,0x22,0x71,0x51,0x07, +0x0f,0x03,0x24,0x0d,0x0e,0x71,0x39,0x01,0x23,0x4d,0xc1,0x35,0x26,0x31,0x32,0x61,0x90,0x5d,0x5c,0x66,0x2e,0x1d,0x11,0x14,0x6d,0x5e,0xb5,0x62,0x26,0x26,0x82,0xfe,0xf1,0x90,0x4b,0x5c,0x3c,0x29,0x16,0x14,0x41,0xc6,0x49,0xe7,0x01,0x75,0xb7,0x32,0x23,0x55,0x32,0x57,0x33,0x4a,0xf1,0x94,0xfe,0x0b,0x3e,0x32,0x18,0x24,0x00,0x01, +0x00,0x84,0xff,0xc3,0x03,0x45,0x05,0xa7,0x00,0x26,0x00,0x2d,0x40,0x17,0x10,0x12,0x04,0x89,0x1f,0x25,0x12,0x1f,0x1f,0x12,0x25,0x03,0x28,0x18,0x8a,0x0b,0x1b,0x9a,0x08,0x10,0x06,0x00,0x07,0x00,0x3f,0x3f,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x32,0x16,0x16,0x15,0x10,0x02, +0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x02,0xa9,0x20,0x4c,0x30,0x69,0xba,0x83,0x8c,0x8f,0x8d,0x81,0x1a,0x15,0x0e,0x57,0x2c,0x75,0x5d,0x43,0x3b,0x4a,0x6e,0x40,0x28,0x2e,0x08,0x54,0x05,0xa7,0x9c,0xed, +0x6b,0xfe,0xef,0xfe,0x1c,0xfb,0xee,0xe8,0xd0,0x01,0x65,0x8e,0x1c,0x36,0x0c,0x14,0x3a,0xa0,0xfe,0xed,0x98,0x94,0xbb,0xde,0x01,0xa1,0xca,0x94,0xb9,0x49,0x0c,0x13,0x11,0x4a,0x00,0x01,0x00,0x84,0x01,0x46,0x03,0x79,0x05,0xa7,0x00,0x33,0x00,0x49,0xb9,0x00,0x31,0x01,0x83,0xb4,0x07,0x2f,0x89,0x28,0x0a,0xb8,0x01,0x84,0x40,0x1b, +0x21,0x00,0x07,0x28,0x21,0x21,0x28,0x07,0x00,0x04,0x35,0x19,0x8b,0x13,0x0a,0x16,0x2b,0x04,0x16,0x04,0x16,0x0f,0x2b,0x07,0x1d,0x99,0x0f,0x00,0x2f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27, +0x27,0x26,0x27,0x27,0x06,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x07,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x27,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x17,0x13,0x17,0x16,0x03,0x79,0x3b,0x29,0x19,0x2e,0x19,0x1a,0x18,0x0a,0x05,0x06,0x29,0x35,0x5a,0x49,0x57,0x65,0x2d, +0x1e,0x37,0x27,0x1d,0x04,0x2a,0x2b,0x30,0x38,0x0d,0x06,0x0b,0x1d,0x14,0x16,0x04,0x3e,0x17,0x1b,0x17,0x14,0x0b,0x04,0x64,0x3c,0x24,0x01,0xdd,0x17,0x23,0x7b,0x8b,0x8a,0x77,0x80,0x2b,0x7f,0xfe,0x64,0xa3,0x51,0x71,0xe0,0xf8,0x21,0x1b,0x15,0x14,0xed,0x72,0x68,0xa7,0xd6,0x5a,0xa9,0x3a,0x3c,0x40,0x10,0x45,0x11,0x11,0x1f,0x18, +0x47,0x45,0x18,0xfe,0x6e,0xd2,0x7f,0x00,0x00,0x01,0x00,0x84,0xff,0xc3,0x03,0xdd,0x05,0xa3,0x00,0x40,0x00,0x49,0xb7,0x06,0x89,0x22,0x00,0x3b,0x8b,0x36,0x27,0xb8,0x01,0x82,0x40,0x1c,0x2e,0x22,0x15,0x36,0x2e,0x2e,0x36,0x15,0x22,0x04,0x42,0x1c,0x89,0x0d,0x24,0x00,0x00,0x2b,0x2b,0x39,0x1f,0x9a,0x09,0x39,0x06,0x19,0x12,0x06, +0x00,0x3f,0x33,0x3f,0xd4,0xed,0x12,0x39,0x2f,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x10,0x02,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x02,0x15,0x10,0x12,0x33,0x32, +0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x07,0x06,0x15,0x14,0x02,0x7d,0x14,0x2a,0x16,0x78,0x94,0xc8,0xbe,0x88,0xd5,0x76,0x60,0xad,0xd8,0x60,0x37,0x26,0x10,0x2a,0x2f,0xb7,0xdc,0xa1,0x8a,0x70,0x72,0x7c,0x17,0x2e,0x20,0x01, +0x01,0x17,0x22,0x1f,0x17,0x0e,0x0d,0x08,0x08,0x1d,0x30,0x4f,0x0b,0x0b,0x03,0x2a,0x06,0x0d,0xb3,0x93,0xfe,0xee,0xfe,0xde,0xb1,0x01,0x49,0xd2,0x9a,0x01,0x1e,0xdb,0x81,0x13,0x1a,0x31,0x1d,0x12,0x07,0x1a,0xfe,0xa4,0xff,0xfe,0xee,0xfe,0xc6,0xb9,0xc6,0xf6,0x31,0x49,0x19,0x1c,0x1d,0x15,0x22,0x33,0x5d,0x5c,0x35,0x26,0x44,0x44, +0x24,0x29,0x28,0x3e,0x1e,0x46,0x47,0x2e,0x23,0x00,0x00,0x01,0x00,0x84,0xff,0xf6,0x03,0xe8,0x05,0xa3,0x00,0x3e,0x00,0x4a,0x40,0x29,0x00,0x89,0x2c,0x23,0x89,0x0a,0x27,0x89,0x06,0x2c,0x0a,0x06,0x16,0x16,0x06,0x0a,0x2c,0x04,0x40,0x37,0x10,0x89,0x1d,0x34,0x34,0x20,0x30,0x9b,0x3b,0x06,0x0d,0x9b,0x20,0x06,0x16,0x19,0x18,0x29, +0x9a,0x03,0x18,0x00,0x3f,0xed,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35, +0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x10,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x03,0xe8,0x91,0x9e,0x6b,0x60,0x0d,0x0c,0x34,0x3c,0x3c,0x30,0x34,0x35,0x08,0x1a,0x59,0x19,0x2b,0x53,0x42,0x9b,0x89,0x78,0x90,0x0c,0x0c,0x41,0x34,0x34,0x5b, +0xa1,0x60,0x23,0x46,0x47,0x20,0x09,0x20,0x14,0xab,0x62,0x95,0xeb,0x83,0x02,0xa5,0xfe,0x97,0xfe,0xba,0xb8,0xb6,0x33,0x95,0x94,0x30,0x7c,0x71,0xb2,0xb6,0x85,0xdd,0x6d,0x0f,0x1b,0x0f,0x15,0x4f,0xab,0x01,0x50,0x71,0xea,0x01,0x09,0xbd,0x9b,0x31,0x94,0x89,0x39,0xfe,0xf8,0x01,0x20,0x01,0x07,0xa6,0x01,0x23,0xa8,0x16,0x17,0x21, +0x2f,0x1e,0x18,0x31,0xc4,0xfe,0x9f,0x00,0x00,0x01,0x00,0x70,0x00,0x45,0x03,0x6c,0x05,0xa7,0x00,0x31,0x00,0x41,0xb9,0x00,0x1c,0x01,0x85,0x40,0x10,0x17,0x05,0x89,0x27,0x17,0x27,0x00,0x00,0x27,0x17,0x03,0x33,0x22,0x8b,0x14,0x22,0xb8,0x01,0x81,0xb5,0x11,0x2f,0x11,0x2f,0x19,0x27,0xb8,0x01,0x80,0xb2,0x0a,0x19,0x07,0x00,0x3f, +0xd4,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xec,0x10,0xed,0x31,0x30,0x01,0x14,0x07,0x06,0x06,0x07,0x0e,0x02,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x37,0x37,0x32,0x17,0x17,0x32,0x37, +0x3e,0x04,0x17,0x32,0x16,0x03,0x6c,0x2e,0x24,0x56,0x16,0x1b,0x17,0x20,0x0f,0x26,0x47,0x47,0x23,0x24,0x3f,0x3f,0x20,0x1d,0x27,0x67,0x01,0x43,0x09,0x44,0x23,0x31,0x12,0x14,0x26,0x57,0xfe,0xef,0x39,0x34,0x0e,0x65,0x20,0x11,0x21,0x0e,0x1f,0x0e,0x54,0x20,0x17,0x1f,0x4e,0x02,0xc6,0x14,0x4c,0x4b,0xd1,0x55,0x69,0x2a,0x1d,0x0f, +0x0e,0x0e,0x0f,0x25,0x26,0x30,0x01,0x24,0x03,0xa9,0x1a,0x1a,0x13,0x0e,0x34,0x2f,0x5b,0xe2,0xfd,0x1f,0x07,0x04,0x10,0x03,0x68,0x2d,0x60,0x25,0xd5,0x34,0x03,0x27,0x00,0x01,0x00,0x84,0xff,0xc3,0x03,0x33,0x05,0xa7,0x00,0x37,0x00,0x3f,0x40,0x21,0x00,0x1f,0x2d,0x89,0x0e,0x33,0x89,0x08,0x1f,0x0e,0x08,0x08,0x0e,0x1f,0x03,0x39, +0x14,0x89,0x27,0x36,0x9a,0x02,0x1c,0x02,0x1c,0x2a,0x17,0x9a,0x23,0x11,0x9b,0x2a,0x07,0x00,0x3f,0xed,0xd4,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x06,0x23,0x27,0x26,0x23,0x22,0x35,0x34,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x02, +0x11,0x10,0x12,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x03,0x07,0x25,0x0d,0x22,0x5d,0x3d,0x3b,0x21,0x33,0x40,0x16,0x3c,0x30,0x72,0x79,0x73,0x66,0x4c,0x31,0x35,0x09,0x10,0x16,0x42,0x5d,0x89,0x4e, +0x72,0xa8,0x5b,0xe6,0xd5,0x6e,0x86,0x2e,0x55,0x0e,0x13,0x24,0x33,0x21,0x01,0x94,0x13,0x4e,0x04,0x12,0x3b,0x18,0x54,0x81,0xdb,0x97,0x48,0x72,0x80,0xfe,0x9f,0xfe,0xc4,0xfe,0xf4,0xfe,0xda,0x3c,0x40,0x0b,0x3a,0x19,0x21,0x61,0x3d,0xa4,0x01,0x3b,0xde,0x01,0x85,0x01,0xa2,0xd1,0xab,0x4c,0xc0,0xe1,0x23,0x29,0x0e,0x10,0x0f,0x0b, +0x08,0x00,0x00,0x02,0x00,0x60,0xff,0xe7,0x04,0xa2,0x04,0x19,0x00,0x0b,0x00,0x17,0x00,0x23,0x40,0x0d,0x09,0x89,0x15,0x15,0x19,0x0f,0x89,0x03,0x0c,0x9b,0x06,0x06,0x12,0xb8,0x01,0x7f,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x14, +0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x81,0xf5,0xfe,0xd4,0x01,0x2c,0x01,0x01,0xf8,0x01,0x1d,0xfe,0xdf,0xfa,0xb3,0xcc,0xd0,0xaf,0xb5,0xbe,0xbe,0x19,0x01,0x21,0xec,0x01,0x02,0x01,0x23,0xfe,0xe7,0xfc,0xfb,0xfe,0xde,0x03,0xa6,0xd9,0xba,0xb5,0xd2,0xcb,0xc0,0xc1,0xce,0x00,0x00,0x01,0x00,0x50, +0xff,0xe7,0x03,0x44,0x04,0x19,0x00,0x15,0x00,0x28,0x40,0x0b,0x0a,0x00,0x05,0x89,0x10,0x0b,0x15,0x0b,0x15,0x02,0x0d,0xb8,0x01,0x7f,0xb5,0x08,0x19,0x13,0x9b,0x02,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xed,0xc4,0x32,0x31,0x30,0x13,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x23,0x22,0x27,0x35,0x16,0x33, +0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x56,0x72,0x9e,0xdf,0xff,0xfe,0xf8,0xf2,0x8e,0x6c,0x69,0x8f,0xa9,0xad,0xa1,0x9d,0x96,0x74,0x03,0xd3,0x46,0xfe,0xe5,0xf6,0xfe,0xfc,0xfe,0xe3,0x38,0xa2,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x00,0x02,0x00,0x2d,0xfd,0x6d,0x03,0xe5,0x04,0x19,0x00,0x1c,0x00,0x27,0x00,0x50,0xb9,0x00,0x0d,0x01, +0x83,0x40,0x0b,0x25,0x19,0x8a,0x0b,0x25,0x0b,0x25,0x0b,0x29,0x03,0x20,0xb8,0x01,0x83,0xb3,0x13,0x03,0x04,0x22,0xb8,0x01,0x7d,0x40,0x11,0x10,0x0d,0x10,0x16,0x04,0x10,0x04,0x10,0x00,0x1d,0x9b,0x16,0x06,0x06,0x9a,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed, +0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x00,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xb0,0x7b,0xb8,0x50,0xa8,0xdf,0x77,0xb4,0x63,0x1d,0x0c, +0x73,0x60,0x64,0x71,0x80,0x86,0xb6,0xb8,0xfe,0xd1,0x68,0x2f,0x33,0x60,0x2b,0x33,0x31,0xfd,0x6d,0x23,0x28,0xaa,0x6c,0x79,0xe6,0x9d,0x02,0x25,0xb3,0x65,0x59,0x65,0x70,0x61,0x6d,0x6a,0xe8,0xdd,0xfd,0x9e,0xfe,0xce,0xfe,0xad,0x06,0x3d,0x35,0x31,0x5f,0x34,0x2d,0x30,0x34,0x00,0x00,0x01,0x00,0x50,0xfd,0x6d,0x03,0xd7,0x04,0x19, +0x00,0x25,0x00,0x40,0x40,0x18,0x1c,0x27,0x13,0x0a,0x25,0x10,0x89,0x05,0x19,0x99,0x1e,0x19,0x0b,0x0a,0x15,0x00,0x13,0x0a,0x00,0x0a,0x00,0x0d,0x25,0x02,0xb8,0x01,0x7f,0xb5,0x13,0x18,0x08,0x9b,0x0d,0x06,0x00,0x3f,0xed,0x3f,0xed,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0xc4,0x32,0x39, +0x10,0xc6,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x10,0x00,0x21,0x23,0x27,0x17,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x04,0x27,0x50,0x78,0xa2,0xc0,0xc6,0xb9,0xb2,0xad,0x82,0x7d,0xb2,0xf7,0x01,0x1a,0xfe,0xdd,0xfe,0xf1,0x1a,0x19,0x53,0xb6,0xe0,0x44,0x43, +0x36,0x36,0x59,0x49,0x94,0x8f,0x87,0x78,0x66,0x27,0xc1,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x9c,0x46,0xfe,0xe4,0xf5,0xfe,0xfc,0xfe,0xe3,0x02,0x5d,0xd2,0xb8,0x1b,0x90,0x20,0x52,0x80,0x9c,0x94,0x7b,0x1e,0x00,0x00,0x01,0x00,0x60,0xfd,0x6d,0x03,0xe5,0x04,0x19,0x00,0x21,0x00,0x46,0x40,0x1d,0x1f,0x0a,0x0e,0x89,0x0f,0x12,0x0f,0x0a, +0x0f,0x0a,0x0f,0x23,0x03,0x89,0x17,0x1e,0x1f,0x12,0x09,0x1f,0x09,0x1f,0x14,0x00,0x9b,0x1b,0x06,0x0a,0x06,0xb8,0x01,0x7f,0xb3,0x14,0x18,0x0f,0x18,0x00,0x3f,0x3f,0xed,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x22,0x06,0x15, +0x14,0x16,0x33,0x32,0x24,0x37,0x15,0x03,0x06,0x02,0x07,0x23,0x36,0x12,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x02,0x75,0xb0,0xbf,0x9e,0x9b,0x57,0x01,0x09,0x46,0xcd,0xa7,0xaf,0x26,0xbb,0x3e,0xea,0x01,0x24,0x6d,0x8b,0xd4,0xfe,0xff,0x84,0xf5,0x98,0x73,0xbf,0x3c,0x41,0xcd,0x03,0x8f, +0xa9,0x9c,0x93,0x98,0x3e,0x24,0x9c,0xfe,0xf7,0xd5,0xfe,0xe1,0x7b,0xa9,0x01,0x5d,0x01,0x50,0x30,0xed,0xce,0x87,0xd2,0x72,0x26,0x20,0x9c,0x29,0x2f,0x00,0x00,0x01,0x00,0x60,0xfd,0x6d,0x05,0xb0,0x04,0x19,0x00,0x32,0x00,0x59,0xb9,0x00,0x0a,0x01,0x84,0x40,0x21,0x05,0x18,0x17,0x2b,0x2b,0x1f,0x00,0x8a,0x0f,0x22,0x05,0x0f,0x0f, +0x05,0x22,0x03,0x34,0x1f,0x89,0x24,0x21,0x22,0x2b,0x18,0x07,0x22,0x18,0x18,0x22,0x07,0x03,0x28,0x0d,0xb8,0x01,0x7f,0xb7,0x02,0x19,0x14,0x1b,0x9b,0x2e,0x28,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x12,0x39,0x11,0x33, +0x33,0x10,0xed,0x31,0x30,0x01,0x10,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x05,0xb0,0xfa,0x6c,0x79,0x14,0x83,0x0e, +0x2e,0x26,0x5e,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0xfe,0x81,0xfe,0xec,0x75,0x64,0x50,0x24,0x2f,0x2d,0x30,0x32,0x8b,0x03,0x79,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca, +0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0x00,0x00,0x01,0x00,0x77,0xff,0xe7,0x04,0x35,0x07,0x62,0x00,0x31,0x00,0x50,0x40,0x26,0x19,0x8b,0x0d,0x1f,0x89,0x06,0x0d,0x06,0x13,0x2c,0x2c,0x13,0x06,0x0d,0x04,0x33,0x31,0x8a,0x26,0x12,0x06,0x19,0x22,0x13,0x13,0x22,0x2b,0x2c,0x2c,0x10,0x2e,0x9b,0x29,0x16,0x9b,0x10,0x06,0x03, +0xb8,0x01,0x7f,0xb1,0x22,0x19,0x00,0x3f,0xed,0x3f,0xed,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x39,0x2f,0x12,0x39,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x10,0x12,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15, +0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x00,0x11,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x01,0x1b,0xb1,0xc5,0x7a,0x84,0x7c,0x77,0x4b,0x32,0x1b,0x96,0x8b,0x73,0x54,0x29,0x60,0x3e,0x41,0x46,0x57,0x75,0x66,0x65,0xd8,0xcc,0xfe,0xed,0xfe,0xf9,0x01,0x3b,0x01,0x2f,0xb6,0x98,0xa5,0xa7,0xe7,0xe1, +0x02,0xe9,0xfe,0xb3,0xfe,0xd7,0x57,0x51,0x5b,0x4a,0x46,0x3b,0x45,0x4f,0x33,0x7f,0x92,0x2b,0x90,0x13,0x20,0x4c,0x39,0x33,0x55,0x43,0x3b,0x89,0x56,0xa0,0xa0,0x01,0x72,0x01,0x90,0x01,0x40,0x01,0x97,0x01,0xa2,0x4e,0xaa,0x6d,0xfe,0x9d,0xfe,0x86,0x00,0x01,0x00,0x60,0xfd,0x6d,0x06,0xec,0x04,0x19,0x00,0x32,0x00,0x5e,0x40,0x09, +0x08,0x07,0x1b,0x1b,0x0f,0x23,0x8a,0x32,0x2b,0xb8,0x01,0x83,0x40,0x21,0x2a,0x12,0x32,0x2a,0x2a,0x32,0x12,0x03,0x34,0x0f,0x89,0x14,0x04,0x0b,0x9b,0x18,0x11,0x12,0x1b,0x08,0x18,0x2a,0x12,0x08,0x08,0x12,0x2a,0x03,0x30,0x1e,0x18,0x06,0x25,0xb8,0x01,0x7f,0xb1,0x30,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f, +0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11, +0x14,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x11,0x05,0x0c,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0x5e,0x27,0x2d,0x0e,0x83,0x15,0x79,0x6d,0xfa,0x02,0x00,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b, +0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca,0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0xfc,0x85,0x89,0x32,0x30,0x2d,0x2f,0x26,0x3e,0x70,0x79,0x01,0x14,0x00,0x01,0x00,0x0a,0x00,0x00,0x04,0x3f,0x04,0x00,0x00,0x0e,0x00,0x2a,0x40,0x14,0x0b,0x89,0x08,0x07,0x00,0x00,0x04,0x0c,0x0c,0x10,0x03,0x89,0x04,0x00,0x04,0x07, +0x06,0x0c,0x04,0x18,0x00,0x3f,0x33,0x3f,0x12,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x33,0xed,0x31,0x30,0x01,0x06,0x02,0x07,0x23,0x36,0x12,0x37,0x33,0x16,0x12,0x17,0x23,0x26,0x02,0x02,0x25,0x2b,0xc5,0x6e,0xbd,0x9a,0xf7,0x36,0xa8,0x3b,0xf2,0x99,0xbc,0x71,0xc3,0x03,0x31,0xbc,0xfe,0x3c,0xb1,0xe1,0x02,0x2e, +0xf1,0xfe,0xfd,0xe1,0xe3,0xb6,0x01,0xc4,0x00,0x01,0x00,0x60,0xfd,0x6d,0x04,0x25,0x04,0x19,0x00,0x24,0x00,0x4d,0xb9,0x00,0x0e,0x01,0x85,0x40,0x12,0x09,0x05,0x89,0x14,0x09,0x14,0x20,0x20,0x14,0x09,0x03,0x26,0x1a,0x89,0x00,0x20,0x1f,0x11,0xb8,0x01,0x7e,0x40,0x11,0x07,0x1f,0x07,0x0b,0x0b,0x07,0x1f,0x03,0x02,0x1d,0x9a,0x22, +0x19,0x17,0x9b,0x02,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x10,0x21,0x32,0x16,0x15,0x10,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12, +0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x60,0x02,0x11,0xd1,0xe3,0xfe,0xcd,0xfa,0x08,0xa0,0x08,0x2b,0x35,0x48,0x3d,0x8b,0x81,0xb3,0xb6,0xf8,0xe9,0x8f,0x86,0x7e,0x9f,0xfe,0xc4,0xfe,0xbb,0x01,0x29,0x02,0xf0,0xea,0xdb,0xfe,0x62,0xdd,0x30,0x12,0x18,0x27,0x2f,0x30,0x8e,0x8b,0x9b,0xa2,0xfe,0xd6,0xfe,0xbc,0xfe,0x74,0xfe,0x65, +0x52,0xa0,0x3d,0x01,0xe3,0x00,0x00,0x01,0x00,0x60,0xff,0xe7,0x04,0x7b,0x05,0xfa,0x00,0x22,0x00,0x4b,0xb1,0x03,0x0e,0xb8,0x01,0x84,0x40,0x19,0x0f,0x0a,0x89,0x05,0x0f,0x1b,0x05,0x05,0x1b,0x0f,0x03,0x24,0x15,0x89,0x20,0x1b,0x1a,0x03,0x0f,0x1a,0x0f,0x1a,0x0f,0x00,0x18,0xb8,0x01,0x7f,0xb6,0x1d,0x19,0x12,0x9b,0x07,0x00,0x06, +0x00,0x3f,0xc6,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x32,0x16,0x17,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x06,0x07,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x11, +0x34,0x12,0x02,0x29,0x68,0xa6,0x29,0x75,0x3f,0xb0,0x35,0x2f,0x54,0x75,0x8d,0x6e,0x5d,0x8d,0x98,0xad,0xa9,0x82,0x76,0x6c,0x8e,0xf2,0xfe,0xf8,0xf2,0x04,0x19,0x5f,0x56,0xa4,0xfc,0x8b,0x6b,0x6a,0x8e,0x65,0xa9,0x9a,0x97,0x5b,0x6f,0xce,0xb5,0xc7,0xd0,0x4e,0xa2,0x38,0x01,0x1a,0x01,0x07,0xfc,0x01,0x15,0x00,0x00,0x03,0x00,0x82, +0xff,0xe8,0x05,0x70,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x33,0x00,0x5c,0xbc,0x00,0x1b,0x01,0x85,0x00,0x27,0x00,0x00,0x01,0x85,0xb2,0x1a,0x05,0x14,0xb8,0x01,0x85,0x40,0x0f,0x13,0x2e,0x8a,0x21,0x27,0x1a,0x13,0x21,0x21,0x13,0x1a,0x27,0x04,0x35,0x0c,0xb8,0x01,0x85,0x40,0x12,0x0b,0x16,0x10,0x99,0x05,0x1a,0x13,0x0b,0x02,0x09, +0x2b,0x9b,0x24,0x06,0x31,0x99,0x1e,0x19,0x00,0x3f,0xed,0x3f,0xed,0xde,0x32,0xcd,0x32,0x32,0x39,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x21,0x22,0x26,0x27,0x0e,0x02,0x23,0x20,0x03,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x12,0x33, +0x32,0x36,0x36,0x35,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x34,0x26,0x26,0x23,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x00,0x05,0x70,0x01,0xfe,0x9f,0x59,0x9d,0x1f,0x0f,0x53,0x76,0x3c,0xfe,0x9e,0x01,0xa1,0x1f,0x5a,0x49,0x63,0x62,0xa1,0x02,0xc0,0x47,0x5a,0x21,0x99,0xfe,0x94,0xfe,0xfd,0xfe,0xfd,0xfe, +0x94,0x01,0x6d,0x01,0x02,0x01,0x01,0x01,0x6e,0xa1,0x7e,0xd5,0x7b,0xbc,0xfe,0xef,0x01,0x0c,0xc1,0xc5,0x01,0x09,0x06,0xd0,0xfe,0x51,0x57,0x4e,0x2c,0x4e,0x2b,0x01,0xaf,0x62,0x7a,0x42,0x86,0x98,0xfe,0xe2,0x3e,0x75,0x6b,0xfb,0x87,0xfe,0xfd,0xfe,0x94,0x01,0x6e,0x01,0x01,0x01,0x01,0x01,0x6e,0xfe,0x94,0xfe,0xfd,0x80,0xdb,0x83, +0xfe,0xe3,0xc1,0xbe,0xfe,0xe0,0x01,0x23,0x00,0x01,0x00,0xf0,0x00,0x00,0x01,0x91,0x06,0xd0,0x00,0x03,0x00,0x12,0xb9,0x00,0x00,0x01,0x85,0xb3,0x01,0x02,0x01,0x18,0x00,0x3f,0xcd,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x91,0xa1,0xa1,0x06,0xd0,0x00,0x04,0x00,0x64,0xff,0xe8,0x06,0x29,0x06,0xe8,0x00,0x20,0x00,0x2c, +0x00,0x38,0x00,0x45,0x00,0x81,0xb9,0x00,0x14,0x01,0x84,0xb4,0x39,0x21,0x89,0x27,0x18,0xbb,0x01,0x85,0x00,0x09,0x00,0x3f,0x01,0x84,0x40,0x37,0x0e,0x00,0x39,0x27,0x09,0x0e,0x0e,0x09,0x27,0x39,0x00,0x05,0x47,0x2d,0x89,0x33,0x3c,0x9b,0x11,0x43,0x00,0x20,0x06,0x9b,0x1a,0x24,0x30,0x2a,0x36,0x17,0x0a,0x18,0x20,0x1a,0x0a,0x36, +0x43,0x20,0x1a,0x30,0x36,0x36,0x30,0x1a,0x20,0x04,0x09,0x43,0x06,0x09,0x18,0x1e,0x99,0x02,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x10,0xed,0x11,0x33,0x10,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10, +0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x11,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x07,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16, +0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x06,0x29,0x73,0x9d,0x78,0x9b,0x86,0x4c,0x9d,0x5e,0xa2,0x72,0x50,0x49,0xcb,0x90,0x90,0xca,0x01,0x8f,0x7b,0x79,0x91,0x6f,0x9e,0x85,0x4d,0x6b,0x4b,0xfd,0x93,0x3d,0x2d,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0xfd,0xd0,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x01,0x77, +0x76,0x54,0x50,0x7a,0x3a,0x3d,0x53,0x54,0x76,0x69,0x81,0x6d,0x5a,0xaf,0x04,0x3a,0x1d,0x5d,0x62,0x77,0x90,0xcb,0xcc,0x8f,0x78,0xbb,0x20,0xfc,0xa4,0x61,0x6b,0x5b,0x5b,0x01,0xe4,0x2d,0x3d,0x3e,0x2c,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0x3d,0x2d,0x2e,0x3d,0x3e,0x02,0xa8,0x56,0x74,0x71,0x59,0x53,0x3d,0x3a,0x72,0x00,0x02,0x00,0x64, +0x00,0x00,0x04,0xfa,0x06,0xe8,0x00,0x29,0x00,0x35,0x00,0x6f,0xb1,0x16,0x22,0xbb,0x01,0x84,0x00,0x2a,0x00,0x04,0x01,0x85,0xb2,0x05,0x25,0x00,0xb8,0x01,0x84,0x40,0x0f,0x0b,0x12,0x27,0x0b,0x2a,0x05,0x0e,0x0b,0x0b,0x0e,0x05,0x2a,0x04,0x37,0x30,0xb8,0x01,0x84,0x40,0x1b,0x1c,0x33,0x99,0x19,0x2d,0x9b,0x1f,0x22,0x07,0x03,0x9b, +0x06,0x27,0x0e,0x9b,0x0f,0x06,0x0f,0x06,0x0f,0x05,0x16,0x9b,0x22,0x06,0x05,0x18,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x33,0x10,0xdd,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x33,0x10,0xed,0x32,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x01,0x10,0x21,0x23,0x11, +0x23,0x11,0x21,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x20,0x36,0x35,0x34,0x26,0x23,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x01,0x34,0x26,0x27,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xfa,0xfe,0x8f,0x5f,0xa1,0x01,0x00,0x79,0x67,0x43,0xa7,0xa1,0x01,0x02, +0x89,0x71,0x6f,0x76,0x19,0xbb,0x80,0x8c,0xcf,0xcb,0x90,0x7c,0xbf,0x19,0x76,0x01,0x71,0xc5,0xc5,0xfd,0x8f,0x76,0x54,0x51,0x79,0x6f,0x5b,0x56,0x74,0x03,0x16,0xfe,0xf9,0xfd,0xf1,0x02,0xa0,0x40,0x4a,0x34,0x3b,0x12,0x91,0x42,0x4d,0x4c,0x2f,0x75,0xa0,0xc7,0x95,0x90,0xcb,0x9c,0x75,0xf8,0xb6,0x32,0x07,0x35,0x01,0xd2,0x55,0x74, +0x01,0x71,0x59,0x51,0x79,0x76,0x00,0x01,0x00,0xb4,0x00,0x00,0x05,0x0a,0x06,0xd0,0x00,0x12,0x00,0x5c,0xb1,0x11,0x04,0xb8,0x01,0x85,0xb5,0x05,0x0e,0x05,0x0b,0x0a,0x00,0xb8,0x01,0x85,0x40,0x0a,0x01,0x05,0x0a,0x01,0x01,0x0a,0x05,0x03,0x14,0x0d,0xb8,0x01,0x85,0x40,0x16,0x07,0x03,0x07,0x9b,0x11,0x0d,0x0a,0x0b,0x0d,0x0f,0x0b, +0x0b,0x0f,0x0d,0x03,0x0c,0x01,0x05,0x18,0x08,0x0c,0x07,0x00,0x3f,0xcd,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x01,0x07,0x01,0x11,0x21,0x11, +0x33,0x11,0x21,0x05,0x0a,0xa1,0xfe,0xc7,0xa1,0xfe,0x25,0xa3,0x01,0xa5,0x72,0xfe,0xcb,0x01,0x3a,0xa1,0x01,0xda,0x02,0x48,0xfd,0xb8,0x02,0x48,0x04,0x88,0xfe,0x58,0x72,0x01,0x39,0xfc,0xea,0x01,0x22,0xfe,0xde,0x00,0x00,0x01,0x00,0xb4,0xff,0xe9,0x04,0xc6,0x06,0xd0,0x00,0x1b,0x00,0x4b,0xb9,0x00,0x00,0x01,0x84,0x40,0x0d,0x12, +0x11,0x07,0x04,0x11,0x11,0x04,0x07,0x03,0x1d,0x14,0x10,0x0d,0xb8,0x01,0x85,0x40,0x13,0x0e,0x0a,0x9b,0x11,0x12,0x14,0x18,0x12,0x18,0x12,0x0e,0x0f,0x13,0x07,0x0e,0x18,0x04,0x03,0x19,0x00,0x3f,0x33,0x3f,0x3f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x32,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33, +0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x00,0x07,0x23,0x11,0x33,0x01,0x07,0x01,0x11,0x36,0x37,0x36,0x33,0x32,0x16,0x16,0x04,0xc6,0xd5,0x96,0x37,0x7c,0x95,0x86,0x70,0xd8,0xfe,0xef,0x01,0xa1,0xa3,0x01,0xa6,0x72,0xfe,0xca,0x51,0x87,0x7f,0x93,0x71,0xb5,0x61,0x01,0xa6,0x9a,0xf6,0x2d,0x7b, +0x21,0xb4,0x6d,0x62,0x74,0xfe,0x82,0xfe,0x06,0xd0,0xfe,0x58,0x72,0x01,0x39,0xfb,0xf9,0x89,0x47,0x47,0x51,0x9e,0x00,0x02,0x00,0x64,0xff,0xe8,0x03,0xfa,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x5e,0xb9,0x00,0x00,0x01,0x84,0x40,0x13,0x1b,0x21,0x1b,0x21,0x1b,0x05,0x28,0x07,0x0a,0x14,0x11,0x04,0x08,0x12,0x12,0x08,0x0e,0x08,0x16, +0xb8,0x01,0x85,0x40,0x18,0x05,0x1e,0x9b,0x18,0x14,0x08,0x9b,0x09,0x11,0x09,0x16,0x18,0x09,0x18,0x09,0x03,0x0c,0x99,0x0f,0x06,0x24,0x99,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x01,0x2f,0xed,0xc6,0xc4,0x11,0x39,0x2f,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x2f,0x2f, +0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x20,0x11,0x10,0x13,0x21,0x35,0x21,0x36,0x37,0x21,0x15,0x21,0x06,0x07,0x21,0x15,0x21,0x02,0x11,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xfa,0xcc,0x8f,0xfe,0x6e,0x7d,0xfe,0xda,0x01,0x61,0x47,0x7a,0x01,0x74,0xfe,0xf2,0x47,0x2f,0x01,0x2f, +0xfe,0x94,0x8b,0x69,0x88,0x8f,0xcc,0x91,0x72,0x58,0x59,0x72,0x70,0x5b,0x5a,0x70,0x01,0x44,0x90,0xcc,0x02,0x57,0x01,0x2d,0x01,0x53,0x92,0xa2,0xdd,0x92,0x83,0x6a,0x92,0xfe,0xa1,0xfe,0xde,0x60,0xcc,0x8e,0x50,0x79,0x78,0x51,0x50,0x7b,0x7a,0x00,0x00,0x02,0x00,0x00,0xff,0xe8,0x05,0x9d,0x06,0xe8,0x00,0x1f,0x00,0x2b,0x00,0x5a, +0xb5,0x0a,0x8a,0x16,0x08,0x16,0x0d,0xb8,0x01,0x84,0xb7,0x26,0x16,0x26,0x16,0x26,0x2d,0x00,0x20,0xb8,0x01,0x84,0x40,0x1b,0x13,0x0a,0x16,0x16,0x1f,0x29,0x29,0x10,0x1f,0x19,0x9b,0x06,0x08,0x06,0x08,0x06,0x1f,0x1d,0x9b,0x02,0x17,0x1f,0x07,0x23,0x99,0x10,0x19,0x00,0x3f,0xed,0x3f,0x33,0xdd,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10, +0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x01,0x2f,0xed,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x11,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x01,0x14,0x16,0x33,0x32,0x36, +0x35,0x34,0x26,0x23,0x22,0x06,0x73,0x9d,0x76,0x9d,0x83,0x4e,0x9e,0x5d,0xa3,0x75,0x96,0xca,0x92,0x8f,0xcc,0x98,0x72,0x77,0x93,0x70,0x9d,0x85,0x4c,0x69,0x4e,0x03,0x26,0x77,0x53,0x54,0x77,0x78,0x53,0x53,0x77,0x06,0x67,0x81,0x6d,0x5b,0xb0,0xfb,0xc5,0x1c,0xc0,0x76,0x90,0xcb,0xca,0x91,0x77,0xc0,0x1b,0x03,0x5d,0x62,0x6c,0x5b, +0x5b,0xfb,0x47,0x53,0x77,0x76,0x54,0x54,0x76,0x77,0x00,0x04,0x00,0x82,0xff,0xe8,0x04,0x4e,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x39,0x00,0x6f,0x40,0x0a,0x34,0x8a,0x1e,0x0c,0x89,0x12,0x00,0x89,0x06,0x18,0xb8,0x01,0x85,0x40,0x11,0x2e,0x20,0x12,0x2c,0x06,0x2e,0x1e,0x12,0x06,0x2e,0x2e,0x06,0x12,0x1e,0x04,0x22,0x2a, +0xbb,0x01,0x85,0x00,0x29,0x00,0x23,0x01,0x85,0x40,0x11,0x22,0x31,0x9b,0x2c,0x20,0x26,0x26,0x1b,0x22,0x09,0x15,0x03,0x0f,0x29,0x22,0x06,0x37,0xb8,0x01,0x80,0xb1,0x1b,0x19,0x00,0x3f,0xed,0x3f,0x33,0xde,0x32,0xcd,0x32,0x11,0x12,0x39,0x2f,0x39,0x39,0xed,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12, +0x39,0x11,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x37,0x26,0x03,0x33,0x16,0x16,0x33,0x32,0x36,0x37,0x33,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22, +0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x13,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0xfd,0x7f,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0x02,0xbc,0xfe,0xe6,0xcc,0xcc,0xfe,0xe6,0xda,0xd9,0x01,0xa2,0x01,0xbd,0x86,0x87,0xbd,0x01,0xa1,0x02,0xd8,0xda,0xa1,0xbf,0x86,0x86,0xbe,0xbf,0x85,0x86,0xbf,0x06,0x18,0x2b,0x40,0x40,0x2b, +0x2d,0x3e,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0xfb,0x8c,0xc7,0xfe,0xde,0x01,0x20,0xc9,0x01,0x02,0x95,0x93,0x01,0x00,0x7e,0xc5,0xc7,0x7c,0xfe,0xff,0x92,0x95,0xfe,0xfe,0x7f,0xc7,0xc6,0x80,0x83,0xc5,0xc7,0x00,0x03,0x00,0x64,0xff,0xe9,0x05,0xdd,0x06,0xe8,0x00,0x28,0x00,0x35,0x00,0x41,0x00,0x82,0xb9,0x00,0x30,0x01, +0x84,0x40,0x11,0x23,0x0d,0x0d,0x3b,0x06,0x89,0x36,0x04,0x08,0x8b,0x12,0x1d,0x12,0x20,0x03,0x23,0x00,0xb8,0x01,0x84,0x40,0x0c,0x29,0x23,0x36,0x12,0x29,0x29,0x12,0x36,0x23,0x04,0x43,0x3b,0xb8,0x01,0x85,0xb5,0x17,0x2d,0x9b,0x26,0x33,0x3f,0xb8,0x01,0x81,0x40,0x14,0x14,0x38,0x9b,0x1b,0x20,0x03,0x1d,0x36,0x06,0x12,0x06,0x1b, +0x14,0x1b,0x14,0x1b,0x0c,0x33,0x06,0x0d,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x31,0x30,0x01,0x14, +0x06,0x07,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x27,0x06,0x21,0x22,0x24,0x27,0x34,0x37,0x36,0x33,0x20,0x17,0x36,0x35,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x32,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x06,0x07,0x14,0x16,0x33,0x32,0x36,0x01,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x20,0x37, +0x05,0xdd,0x92,0x81,0x2f,0x2f,0x79,0xf2,0x98,0xb0,0xc2,0x07,0xb5,0xfe,0xc7,0xcb,0xfe,0xec,0x01,0x8b,0x8a,0xcb,0x01,0x38,0xb6,0x07,0x01,0x7c,0x96,0xca,0x91,0x90,0xcc,0x92,0x3b,0x3a,0x55,0x55,0x74,0x01,0x71,0x59,0x56,0x74,0xfe,0x9f,0x8c,0xfe,0xe6,0x87,0xb8,0x57,0x93,0x55,0x01,0x1b,0x8b,0x05,0x8d,0x76,0xc2,0x1d,0x18,0x86, +0x74,0x72,0x88,0x9d,0xeb,0x9e,0x1d,0xa1,0x2b,0xd7,0xa0,0x28,0x29,0xc4,0xd8,0x95,0x97,0x6a,0x6c,0xc3,0x28,0x28,0x18,0x1d,0xbf,0x79,0x90,0xca,0x01,0xcc,0x8f,0x57,0x38,0x3b,0x76,0x54,0x51,0x79,0x76,0xfd,0xef,0xc2,0x74,0x50,0x32,0x5e,0x33,0xc1,0x00,0x02,0x00,0x67,0xff,0xe7,0x04,0x72,0x05,0xb2,0x00,0x0f,0x00,0x1d,0x00,0x2b, +0xb9,0x00,0x0c,0x01,0x86,0xb3,0x1b,0x1b,0x1f,0x14,0xbb,0x01,0x86,0x00,0x04,0x00,0x10,0x01,0x80,0xb2,0x08,0x07,0x17,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x35,0x10,0x12,0x24,0x33,0x32,0x16,0x16,0x15,0x10,0x02,0x04,0x13,0x22,0x06,0x02,0x15, +0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x01,0xe2,0x78,0xab,0x58,0xae,0x01,0x28,0xc1,0x69,0xaa,0x61,0xab,0xfe,0xde,0x4a,0x87,0xd4,0x86,0x75,0x70,0x81,0xd2,0x85,0x71,0x19,0x75,0xd1,0x86,0x01,0x19,0x01,0xe9,0xfd,0x6a,0xc3,0x7e,0xfe,0xcf,0xfe,0x0a,0xf9,0x05,0x2d,0xd0,0xfe,0x65,0xd5,0xa5,0xaa,0xcf,0x01,0x9b,0xd0,0xa4, +0xb1,0x00,0x00,0x01,0x00,0x84,0xff,0xe7,0x04,0x18,0x05,0xb5,0x00,0x23,0x00,0x40,0xb9,0x00,0x18,0x01,0x86,0xb2,0x0d,0x13,0x1f,0xb8,0x01,0x86,0x40,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x25,0x00,0x00,0x13,0x00,0x13,0x10,0x03,0xb8,0x01,0x80,0xb2,0x21,0x19,0x16,0xb8,0x01,0x80,0xb1,0x10,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39, +0x2f,0x2f,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc6,0x10,0xed,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x1e,0x02,0x15,0x10,0x21,0x22,0x27,0x84,0x3b,0xbe,0x50,0x9c,0x97,0x33,0x4d,0x46,0x3a,0x1f,0xc2,0xbd,0x5d, +0x5b,0x2e,0x35,0x48,0xe4,0x34,0x54,0x49,0x30,0x1d,0xfe,0x26,0xcd,0x7b,0xb2,0x13,0x1a,0x83,0x9b,0x3a,0x7c,0x6b,0x61,0x70,0x78,0x3f,0xb2,0xb7,0x10,0x9e,0x08,0x08,0xb2,0x40,0x88,0x7b,0x6c,0x62,0x69,0x3c,0xfe,0x38,0x1d,0x00,0x00,0x01,0x00,0x67,0xff,0xe7,0x04,0x8e,0x05,0xb2,0x00,0x27,0x00,0x61,0xb9,0x00,0x19,0x01,0x86,0xb4, +0x0b,0x12,0x89,0x13,0x00,0xb8,0x01,0x85,0x40,0x0e,0x27,0x09,0x1d,0x0b,0x1d,0x13,0x27,0x27,0x13,0x1d,0x0b,0x04,0x29,0x21,0xb8,0x01,0x86,0xb2,0x06,0x09,0x1c,0xb8,0x01,0x80,0x40,0x09,0x1d,0x27,0x13,0x13,0x27,0x1d,0x03,0x03,0x16,0xb8,0x01,0x80,0xb2,0x0f,0x07,0x24,0xb8,0x01,0x80,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12, +0x17,0x39,0x2f,0x2f,0x2f,0xed,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33, +0x32,0x12,0x13,0x04,0x8e,0x5d,0xfe,0xc9,0xde,0xcc,0xe9,0x92,0x7a,0xaa,0x64,0xc0,0x84,0xa0,0xe2,0x1d,0xac,0x18,0x7e,0x65,0x73,0x86,0x97,0x8a,0x28,0x9b,0xc0,0x97,0x7c,0xa0,0xec,0x3f,0x02,0xcf,0xfe,0x7f,0xfe,0x99,0xe4,0xca,0x85,0xd5,0x2a,0x6c,0xc4,0x6b,0xa4,0x5a,0xae,0x91,0x4b,0x56,0x6d,0x57,0x70,0x74,0x9e,0xa7,0x8f,0x7e, +0x95,0x01,0x4f,0x01,0x26,0x00,0x00,0x01,0x00,0x3f,0xff,0xe7,0x04,0x9f,0x05,0x9d,0x00,0x2c,0x00,0x5e,0xb6,0x0e,0x8a,0x1e,0x09,0x8a,0x23,0x15,0xb8,0x01,0x85,0x40,0x0d,0x14,0x1e,0x23,0x14,0x14,0x23,0x1e,0x03,0x2a,0x2e,0x03,0x01,0x29,0xb8,0x01,0x85,0x40,0x0f,0x2c,0x2a,0x2a,0x18,0x25,0x99,0x06,0x04,0x06,0x14,0x06,0x14,0x06, +0x00,0x10,0xb8,0x01,0x80,0xb6,0x1b,0x19,0x03,0x2c,0x99,0x00,0x06,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x3f,0x01,0x2f,0xc6,0xfd,0xc4,0x33,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x21,0x07,0x21,0x03,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06, +0x15,0x14,0x33,0x32,0x36,0x37,0x37,0x33,0x07,0x0e,0x03,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23,0x22,0x06,0x07,0x03,0x23,0x01,0x23,0xb1,0x03,0x9f,0x20,0xfd,0xc3,0x4d,0x6c,0x69,0x77,0x90,0x04,0x3d,0x21,0x52,0x2b,0x33,0x17,0x16,0xa2,0x17,0x0f,0x21,0x3e,0x68,0x57,0x70,0x6f,0x26,0x36,0x06,0x84,0x51,0x7f,0x19, +0x91,0xa1,0x01,0x12,0xc0,0x05,0x9d,0x91,0xfe,0x96,0x36,0x84,0x6e,0x10,0x26,0xfe,0xf3,0x79,0x44,0x61,0x44,0x68,0x62,0x6d,0x44,0x75,0x56,0x30,0x69,0x72,0x3a,0xab,0xf1,0x1b,0x1b,0x79,0x51,0x48,0xfd,0x52,0x05,0x0c,0x00,0x02,0x00,0x6b,0xff,0xe7,0x04,0x21,0x05,0xb0,0x00,0x14,0x00,0x21,0x00,0x4f,0xb2,0x10,0x0f,0x03,0xb8,0x01, +0x86,0x40,0x21,0x1e,0x14,0x00,0x01,0x12,0x15,0x0e,0x04,0x1e,0x0f,0x1e,0x00,0x00,0x1e,0x0f,0x03,0x23,0x19,0x89,0x09,0x00,0x0f,0x0f,0x15,0x01,0x0e,0x12,0x04,0x06,0x14,0x10,0x07,0x1b,0xb8,0x01,0x80,0xb1,0x06,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17, +0x39,0x11,0x33,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x01,0x00,0x15,0x14,0x04,0x21,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x37,0x27,0x37,0x16,0x17,0x36,0x37,0x01,0x0e,0x02,0x15,0x14,0x21,0x32,0x36,0x35,0x34,0x02,0x27,0x04,0x20,0xff,0x00,0x01,0x01,0xfe,0xf8,0xfe,0xf2,0xcb,0xd5,0x51,0x92,0xa5,0x5f,0xaa,0x98,0x3e,0x53,0x78,0x5c, +0xfe,0xfc,0x5d,0xc5,0x69,0x01,0x0b,0xa0,0xb9,0x7d,0x56,0x05,0x4f,0xfe,0xff,0xfe,0x52,0xeb,0xec,0xe2,0xb4,0xb0,0x66,0xc6,0xcb,0xad,0x64,0xfd,0x60,0x53,0x80,0x7a,0x58,0xfe,0x16,0x4b,0xf3,0xd3,0x47,0xe8,0x9a,0x8a,0x54,0x01,0x3f,0x88,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x61,0x05,0xb5,0x00,0x26,0x00,0x32,0x00,0x63,0x41,0x0b, +0x00,0x30,0x01,0x86,0x00,0x21,0x00,0x04,0x01,0x84,0x00,0x1f,0x00,0x00,0x01,0x86,0x00,0x2a,0x00,0x12,0x01,0x85,0x40,0x0c,0x11,0x21,0x1f,0x2a,0x11,0x11,0x2a,0x1f,0x21,0x04,0x34,0x0b,0xb8,0x01,0x86,0x40,0x0a,0x18,0x27,0x1f,0x04,0x11,0x04,0x11,0x04,0x15,0x2d,0xb8,0x01,0x80,0xb2,0x24,0x07,0x0e,0xb8,0x01,0x80,0xb1,0x15,0x19, +0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x07,0x06,0x06,0x07,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x37,0x17,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x36,0x37, +0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x03,0x8f,0x51,0xa4,0x63,0x0b,0x37,0x52,0x49,0x38,0x1e,0x7b,0x7b,0x8f,0xf7,0x3f,0xa2,0x58,0xfe,0xc1,0xd5,0xc6,0xd3,0x1f,0x39,0x4c,0x51,0x45,0x0e,0x3d,0xa0,0x77,0x7f,0x92,0xfe,0x9d,0x5c,0x5f,0x3e,0x2f,0x2b,0x40,0x18,0x04,0xab, +0x4b,0x78,0x54,0x0d,0x2d,0x5e,0x5c,0x50,0x56,0x59,0x30,0x72,0x7a,0x01,0x10,0xd8,0x27,0xfe,0xdc,0xfe,0xc5,0xcb,0xbc,0x3e,0x65,0x5c,0x54,0x58,0x72,0x39,0x74,0x6b,0x77,0x9b,0x93,0xfe,0x0f,0x47,0x31,0x2b,0x41,0x43,0x30,0x35,0x48,0x00,0x00,0x01,0x00,0xd6,0xff,0xe7,0x04,0x48,0x05,0x9a,0x00,0x1e,0x00,0x3d,0xb9,0x00,0x1a,0x01, +0x85,0x40,0x0c,0x19,0x05,0x19,0x01,0x19,0x01,0x19,0x20,0x12,0x8a,0x0b,0x15,0xb8,0x01,0x80,0x40,0x0c,0x05,0x0e,0x08,0x08,0x00,0x19,0x0e,0x06,0x01,0x9a,0x00,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x27,0x36,0x36,0x37,0x37,0x06, +0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x13,0x33,0x03,0x0e,0x02,0x01,0x7d,0x10,0x98,0xae,0x2b,0x34,0x29,0x97,0x57,0x81,0xa4,0x08,0x5d,0xa1,0x5a,0x06,0x5d,0x45,0x55,0x9d,0x2d,0x6a,0xa1,0xbd,0x2e,0x81,0xca,0x19,0x87,0x0c,0xa9,0xc3,0xf1,0x1a,0x22,0x87,0x67,0x2b,0x20,0x01, +0xc6,0xfe,0x4d,0x1d,0x19,0x35,0x43,0x32,0x2a,0x02,0x05,0xfc,0x7e,0xd5,0xdf,0x77,0x00,0x01,0x00,0x59,0xff,0xe7,0x04,0x5f,0x05,0xb5,0x00,0x19,0x00,0x41,0xb2,0x0c,0x0d,0x12,0xb8,0x01,0x86,0x40,0x11,0x07,0x0d,0x07,0x0d,0x07,0x1b,0x00,0x89,0x19,0x0d,0x0c,0x19,0x0c,0x19,0x0c,0x0f,0x02,0xb8,0x01,0x80,0xb2,0x16,0x19,0x0a,0xb8, +0x01,0x80,0xb1,0x0f,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x16,0x33,0x32,0x36,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x21,0x32,0x16,0x15,0x10,0x02,0x04,0x23,0x22,0x26,0x27,0x01,0x0d,0x2e,0x9a,0x69,0xaf,0x7f, +0x4c,0x75,0x71,0x9e,0x75,0x89,0xa9,0x01,0x04,0xb1,0xcb,0xae,0xfe,0xd6,0xc0,0x8c,0xc8,0x1a,0x01,0x34,0xaf,0x7f,0xe7,0x01,0x44,0x99,0xa1,0xae,0x96,0x5a,0xda,0xf9,0xd4,0xfe,0xe8,0xfe,0x14,0xfd,0xb4,0x98,0x00,0x01,0x00,0x7b,0xff,0xe7,0x04,0x7f,0x05,0xb2,0x00,0x1a,0x00,0x3f,0x40,0x0b,0x0d,0x0c,0x1a,0x89,0x00,0x0c,0x00,0x0c, +0x00,0x1c,0x07,0xb8,0x01,0x86,0xb7,0x13,0x0d,0x0c,0x00,0x0c,0x00,0x10,0x02,0xb8,0x01,0x80,0xb2,0x17,0x07,0x0a,0xb8,0x01,0x80,0xb1,0x10,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x16,0x33, +0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x12,0x24,0x33,0x32,0x16,0x17,0x03,0xcc,0x30,0x98,0x69,0xad,0x80,0x4c,0x75,0x70,0x9e,0x75,0x88,0x57,0xd3,0x82,0xaf,0xcc,0xae,0x01,0x28,0xc1,0x8d,0xc7,0x19,0x04,0x65,0xaf,0x7c,0xe7,0xfe,0xbd,0x9a,0xa5,0xaa,0x96,0x5a,0x70,0x6a,0xf9,0xd3,0x01,0x19,0x01,0xe9,0xfd,0xb6,0x96, +0x00,0x01,0x00,0x8b,0xff,0xe7,0x04,0x9b,0x05,0x9d,0x00,0x15,0x00,0x29,0xb9,0x00,0x08,0x01,0x85,0xb4,0x07,0x07,0x17,0x13,0x00,0xb8,0x01,0x86,0xb4,0x0f,0x07,0x12,0x06,0x03,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x13,0x33, +0x03,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x01,0x32,0x68,0x6d,0x75,0x88,0x22,0xd3,0xa2,0xd8,0x32,0xe2,0xbf,0xa7,0xbe,0x31,0xb1,0xa2,0xaf,0x2e,0x01,0x45,0x67,0x59,0x97,0x99,0x03,0xe7,0xfc,0x0a,0xef,0xd0,0xa3,0x8f,0x6c,0xd2,0x03,0x46,0xfc,0xca,0xcf,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a, +0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0xff,0xd0,0xfe,0x9d,0x02,0x51,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xad,0xf9,0xeb,0x00,0x0b,0xb6,0x01,0x00,0x16,0x0c,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf9,0x00,0x00,0x02,0x29,0x07,0x18,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x2a, +0xfe,0xb9,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x86,0x00,0x00,0x01,0xf0,0x07,0x5e,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0xa9,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x78,0x40,0x0a,0x12,0x0c,0x0b,0x05, +0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xfe,0x07,0x66,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xf2,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe8,0x40,0x09,0x0d, +0x0d,0x0b,0x05,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfd,0x00,0x00,0x02,0x31,0x07,0x6b,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xa1,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x10,0x05,0x26,0x01,0x00,0x10,0x0c,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0xff,0xbe, +0x00,0x00,0x03,0x58,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x68,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x74,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x40,0x40,0x09,0x0d,0x19,0x0b,0x05,0x25,0x02,0x01,0x1b,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xa1,0x00,0x27,0x0d,0xf2, +0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x31,0x40,0x09,0x0d,0x19,0x0b,0x05,0x25,0x02,0x01,0x1c,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xc1,0x00,0x00,0x03,0x67,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x77,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7d, +0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x3a,0x40,0x09,0x0f,0x19,0x0b,0x05,0x25,0x02,0x01,0x1b,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x03,0x6e,0x05,0xb3,0x00,0x27,0x0d,0xf2,0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8b,0xff,0x30,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x41, +0x40,0x09,0x12,0x0c,0x0b,0x05,0x25,0x02,0x01,0x15,0x04,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0x88,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x88,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x25,0x40,0x09,0x0f,0x19,0x0b,0x05,0x25,0x02,0x01,0x1c, +0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x03,0x6e,0x05,0xb3,0x00,0x27,0x0d,0xf2,0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8b,0xff,0x30,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x41,0x40,0x09,0x12,0x0c,0x0b,0x05,0x25,0x02,0x01,0x15,0x04,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00, +0xff,0xff,0xff,0xbf,0x00,0x00,0x02,0x48,0x05,0xa1,0x00,0x26,0x0d,0xf2,0x58,0x00,0x01,0x07,0x04,0x61,0xfd,0xdd,0xff,0x7e,0x00,0x14,0xb9,0x00,0x01,0xfe,0xb9,0xb7,0x10,0x0c,0x0b,0x05,0x25,0x01,0x13,0x04,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x02,0x4a,0x05,0xa1,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07, +0x04,0x27,0xfd,0xda,0xff,0x7e,0x00,0x14,0xb9,0x00,0x01,0xfe,0xb5,0xb7,0x0d,0x18,0x0b,0x05,0x25,0x01,0x15,0x04,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x22,0x07,0x0a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x66,0x01,0x10,0x01,0x4c,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01, +0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xf2, +0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07, +0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0xfe,0x70,0x01,0xf0,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00, +0x01,0x06,0x00,0xdf,0x12,0x00,0x00,0x0b,0xb6,0x01,0x00,0x1a,0x0c,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x07,0x83,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x02,0x50,0xff,0xf0,0x01,0x5c,0x00,0x13,0x40,0x0b, +0x01,0x00,0x16,0x15,0x0b,0x05,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0xff,0xe8,0x04,0x4c,0x05,0x9a,0x00,0x26,0x0d,0xf2,0x00,0x00,0x00,0x07,0x00,0x2d,0x02,0x21,0x00,0x00,0xff,0xff,0xff,0xd1,0x00,0x00,0x02,0x52,0x07,0x0c,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xae, +0x01,0x5a,0x00,0x13,0x40,0x0b,0x01,0x00,0x16,0x0c,0x0b,0x05,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0xfe,0xc6,0x01,0xf0,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x06,0x02,0x45,0xbc,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0f,0x15,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1c, +0x00,0x00,0x01,0xf0,0x07,0x66,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x43,0xff,0xca,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xc5,0x40,0x09,0x0e,0x0c,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc7,0x00,0x00,0x02,0x4a,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07,0x04,0x60, +0xfd,0xf6,0xff,0x9b,0x00,0x14,0xb9,0x00,0x01,0xfe,0xd0,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01,0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc7,0x00,0x00,0x02,0x4a,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf9,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0xcf,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01, +0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xf3,0x00,0x00,0x02,0x3a,0x07,0xd1,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x02,0xd5,0xff,0x76,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x06,0x1f,0x19,0x0b,0x05,0x25,0x03,0x02,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff, +0xff,0xf8,0x00,0x00,0x02,0x2a,0x07,0x62,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x92,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x0c,0x0b,0x05,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x02,0x0e,0x06,0x79,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x64, +0x01,0x10,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0f,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xaf,0x00,0x00,0x02,0x2c,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x3c,0x00,0x01,0x07,0x04,0x55,0xfd,0xde,0xff,0x9b,0x00,0x14,0xb9,0x00,0x01,0xfe,0xd6,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01, +0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x06,0xe2,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x42,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x15,0x0b,0x05,0x25,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x10,0x06,0x79, +0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xd6,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0f,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x02,0x24,0x07,0x1a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xda,0xff,0xda,0x01,0x5c,0x00,0x13,0x40,0x0b, +0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x55,0x00,0x5b,0x00,0x61,0x00,0x67,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95, +0x00,0x99,0x00,0x9d,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e, +0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x05,0x21,0x35,0x33,0x11,0x07,0x35,0x37,0x11,0x33,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35, +0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d, +0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x02,0xe0,0xfe,0xf0,0x59,0x5b,0xba,0x58,0xfb,0xbb,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56, +0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfc,0x44,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08, +0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x04,0x4b,0x01,0x0b,0x13,0x4c,0x26,0xfe,0x96,0x03,0x8b,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c, +0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x61,0x00,0x67,0x00,0x6d,0x00,0x73,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99, +0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14, +0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x33,0x15,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35, +0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35, +0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x02,0x2f,0xae,0xfe,0xe5,0x7c,0x25,0x1e,0x40,0x37,0x33,0x38,0x47,0x42,0x4a,0x5b,0xfc,0x14,0xeb,0x96,0x04, +0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18, +0x01,0x2a,0xfc,0x44,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x4d,0x02,0x4f,0x4a,0x76,0x24,0x30,0x1b,0x3b,0x2c,0x53,0x25,0x43,0x38,0x4b, +0x51,0x03,0x37,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0, +0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8a,0x00,0x8e,0x00,0x92,0x00,0x96,0x00,0x9a,0x00,0x9e,0x00,0xa2,0x00,0xa6,0x00,0xaa,0x00,0xae,0x00,0xb2,0x00,0xb6,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13, +0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35, +0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01, +0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34, +0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x01,0xd9,0x2b,0x3a,0x24,0x28,0x32,0x2b,0x27,0x24,0x54,0x41,0x2b,0x29,0x2d,0x3d,0x42,0x49,0x55,0x2d,0x35,0x58,0x4e,0x42,0xfc,0x98,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56, +0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfc,0x45,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a, +0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x0a,0x52,0x1f,0x1f,0x1c,0x1d,0x1f,0x48,0x38,0x35,0x1c,0x4d,0x17,0x3b,0x30,0x54,0x15,0x02,0x06,0x37,0x27,0x3d,0x46,0x03,0xdd,0xec, +0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x13,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x0b,0x00,0x41, +0x00,0x5d,0x00,0x63,0x00,0x69,0x00,0x6f,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99,0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0x00,0x01,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x13,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35, +0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x13,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x17,0x16,0x17,0x33,0x36,0x37,0x37,0x33,0x25,0x35,0x33,0x15,0x23,0x15,0x25,0x35, +0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33, +0x03,0x82,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xe5,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x7b,0x60,0x04,0x02,0x08,0x06,0x65, +0x4f,0x67,0x04,0x09,0x03,0x04,0x57,0x8e,0x58,0x0a,0x05,0x02,0x08,0x09,0x58,0x8a,0xfc,0x28,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55, +0x05,0x6b,0x56,0x56,0x02,0xac,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfe,0x63,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d, +0x0c,0x02,0x19,0x01,0x01,0x2a,0x32,0x27,0x12,0xfe,0xdc,0x01,0x21,0x0c,0x30,0x3f,0x30,0xee,0x01,0xae,0xff,0x1f,0x1e,0x23,0x1b,0xfe,0x0a,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03, +0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x03,0x00,0x93,0xff,0x43,0x03,0x75,0x05,0xb8,0x00,0x1e,0x00,0x25,0x00,0x2a,0x00,0x5b,0xb1,0x16,0x1c,0xb8,0x01,0x84,0x40,0x0d,0x29,0x19,0x13,0x00,0x00,0x1f,0x10,0x09,0x03,0x03,0x0d,0x29,0x23,0xb8,0x01,0x84,0x40,0x0b,0x06,0x0d,0x1f,0x19,0x13,0x09, +0x26,0x0a,0x03,0x20,0x18,0xb8,0x01,0x7e,0xb6,0x10,0x7f,0x13,0x01,0x13,0x27,0x09,0xb8,0x01,0x7e,0xb1,0x00,0x03,0x00,0x2f,0x33,0xed,0x32,0x2f,0x71,0x33,0xed,0x32,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x2f,0x33,0x33,0x33,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x31,0x30,0x25,0x15,0x23,0x35,0x22, +0x27,0x35,0x16,0x16,0x33,0x11,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x03,0x11,0x06,0x06,0x15,0x14,0x16,0x13,0x11,0x36,0x35,0x34,0x02,0x2e,0x5e,0xc1,0x79,0x35,0xb6,0x4f,0xc7,0x76,0xb3,0x8a,0x5e,0xb2,0x44,0x5d,0x99,0xbd,0x8a,0xad,0xf8,0x4c,0x59,0x48,0xbb,0xaf, +0x07,0xc4,0xbd,0x4e,0x9e,0x2f,0x3e,0x01,0xd0,0x60,0xa2,0x6e,0x84,0xbf,0x13,0xa3,0x9f,0x06,0x2d,0x9a,0x48,0x06,0xfe,0x21,0x59,0xa8,0x6b,0x80,0xaf,0x02,0xce,0x01,0xa6,0x0f,0x68,0x4b,0x4d,0x64,0xfe,0xff,0xfe,0x66,0x26,0x97,0x7d,0x00,0x00,0x05,0x00,0x48,0xff,0xec,0x05,0xaa,0x05,0x27,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27, +0x00,0x33,0x00,0x6f,0xb5,0x18,0x1a,0x18,0x1a,0x03,0x25,0xbe,0x01,0x83,0x00,0x31,0x00,0x09,0x01,0x83,0x00,0x15,0x00,0x2b,0x01,0x83,0xb7,0x1f,0x15,0x1f,0x15,0x1f,0x03,0x31,0x0f,0xbb,0x01,0x83,0x00,0x03,0x00,0x12,0x01,0x7d,0xb5,0x70,0x00,0x01,0x00,0x00,0x0c,0xb8,0x01,0x7d,0xb6,0x06,0x06,0x7f,0x1b,0x01,0x1b,0x28,0xb8,0x01, +0x7d,0xb2,0x22,0x22,0x2e,0xb8,0x01,0x7d,0xb2,0x1c,0x1c,0x1a,0x00,0x2f,0x33,0x2f,0xed,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x33,0x2f,0x71,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03, +0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x6e,0x86,0xa0,0xa9,0x8f,0x8b,0x99,0xab,0x7e,0x56,0x64,0x62,0x54,0x55,0x60,0x5f,0x03,0x07,0xfc,0xbe,0x81,0x03,0x40,0x23, +0x86,0xa0,0xab,0x8d,0x8a,0x9a,0xac,0x7e,0x57,0x62,0x62,0x54,0x55,0x60,0x5f,0x02,0x88,0xb0,0x94,0xa1,0xba,0xac,0x9c,0x9c,0xbb,0x02,0x3b,0x7f,0x70,0x6d,0x7b,0x7f,0x71,0x6d,0x7a,0x50,0xfa,0xe4,0x05,0x1c,0xfa,0xd9,0xb2,0x92,0xa2,0xbb,0xae,0x9c,0x9b,0xbc,0x02,0x3b,0x7f,0x70,0x6c,0x7a,0x7f,0x70,0x6e,0x78,0x00,0x03,0x00,0x6c, +0xff,0xeb,0x05,0xa8,0x05,0x29,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0x7e,0xb1,0x41,0x33,0xbb,0x01,0x84,0x00,0x2c,0x00,0x60,0x01,0x84,0xb6,0x17,0x12,0x4e,0x24,0x03,0x17,0x21,0xb8,0x01,0x84,0xb3,0x58,0x29,0x05,0x38,0xb8,0x01,0x85,0x40,0x0b,0x49,0x17,0x58,0x49,0x49,0x58,0x17,0x03,0x0f,0x2c,0x53,0xb8,0x01,0x84,0xb3,0x0f,0x24, +0x12,0x4e,0xb8,0x01,0x7e,0x40,0x0c,0x29,0x49,0x38,0x05,0x04,0x0a,0x65,0x2f,0x65,0x2f,0x44,0x5d,0xb8,0x01,0x7e,0xb2,0x1c,0x3d,0x44,0xb8,0x01,0x7e,0xb1,0x00,0x0a,0x00,0x2f,0x33,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0xed,0x39,0x39,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x39, +0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37, +0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x05,0x1d,0x33,0x4f,0x43,0x3f,0x22,0x25,0x5f,0x74,0x89,0x51,0x62,0xa3,0x74,0x40,0x9d,0x91,0x1c,0x36,0x2b,0x1a,0x34,0x5a,0x7c,0x47,0x47,0x75,0x54,0x2f,0x7c,0x7c,0x3e, +0x66,0x56,0x4a,0x24,0x4a,0x4a,0x08,0x07,0x90,0x07,0x03,0x02,0x23,0x3a,0x4d,0x2a,0x1f,0x35,0x35,0x39,0x25,0x1b,0x38,0x1e,0x21,0x47,0xfc,0xe5,0x45,0x74,0x62,0x4f,0x21,0x37,0x5e,0x5f,0x6b,0x47,0x39,0x60,0x46,0x28,0x2d,0x4f,0x69,0x01,0x20,0x22,0x34,0x3f,0x1f,0x59,0x6a,0x01,0x17,0x29,0x36,0x1f,0x72,0x71,0x15,0x1c,0x34,0x4a, +0x2f,0x27,0x48,0x38,0x22,0x31,0x5f,0x8c,0x5a,0x8b,0xc5,0x3e,0x14,0x35,0x44,0x53,0x31,0x47,0x6f,0x4c,0x27,0x27,0x48,0x66,0x3e,0x6d,0x90,0x33,0x18,0x47,0x57,0x64,0x35,0x66,0xf7,0x87,0x22,0x3d,0x1e,0x1e,0x36,0x25,0x52,0xa7,0x9d,0x8d,0x3b,0x2b,0x41,0x2b,0x15,0x0e,0x0b,0x89,0x0d,0x0d,0x81,0x1e,0x32,0x42,0x24,0x56,0x7a,0x59, +0x40,0x1b,0x17,0x37,0x4b,0x64,0x43,0x3e,0x5e,0x3e,0x20,0x03,0x9d,0x2d,0x40,0x29,0x13,0x60,0x52,0x25,0x42,0x38,0x2b,0x10,0x28,0x6a,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x8f,0x05,0x29,0x00,0x1b,0x00,0x4d,0xb1,0x14,0x18,0xb8,0x01,0x84,0x40,0x0c,0x08,0x04,0x16,0x0f,0x00,0x00,0x0f,0x16,0x04,0x04,0x1d,0x1a,0xb8,0x01,0x86,0xb3, +0x06,0x01,0x17,0x06,0xb8,0x01,0x7e,0xb4,0x14,0x07,0x07,0x1a,0x11,0xb8,0x01,0x7e,0xb2,0x0c,0x02,0x1a,0xb9,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34, +0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x14,0x07,0x21,0x03,0x8f,0xfc,0xd1,0xc6,0xb3,0xb3,0xc5,0x9d,0x6a,0x57,0x5b,0x64,0xd0,0x01,0x0c,0xfe,0xf4,0xaf,0x02,0x84,0x7a,0x3f,0xdd,0xa9,0x80,0xe6,0xab,0xd9,0x25,0x8d,0x34,0xfe,0xea,0xd6,0x80,0x8d,0xdb,0x58,0x00,0x02,0x00,0x77,0xff,0xc4,0x02,0xdb, +0x05,0x47,0x00,0x26,0x00,0x30,0x00,0x5c,0xb2,0x1c,0x00,0x25,0xbb,0x01,0x84,0x00,0x2e,0x00,0x20,0x01,0x84,0xb2,0x07,0x16,0x02,0xb8,0x01,0x84,0x40,0x09,0x0d,0x16,0x0d,0x16,0x0d,0x12,0x2e,0x14,0x29,0xb8,0x01,0x84,0x40,0x0c,0x12,0x00,0x2c,0x14,0x27,0x20,0x27,0x2c,0x0d,0x04,0x05,0x1e,0xbc,0x01,0x7e,0x00,0x19,0x00,0x0a,0x01, +0x7e,0x00,0x05,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xfd,0xc5,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xed,0x10,0xfd,0xcd,0xc4,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17, +0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x01,0x06,0x15,0x14,0x16,0x17,0x36,0x35,0x34,0x26,0x02,0x54,0x52,0xb6,0x8c,0x77,0x61,0x75,0x6d,0x4c,0x53,0x40,0x83,0xd3,0x85,0x60,0xa9,0x8b,0x76,0x50,0x5b,0x6f,0x98,0x49,0x94,0xca,0xfe,0x8e,0x5c,0x66,0x80,0x50,0x5f,0x01,0x79,0x43,0x66,0x77,0x95,0x33,0x8f,0x43,0x48, +0x36,0x30,0x42,0x46,0x6e,0xb1,0x94,0x49,0x4b,0x7f,0x73,0x95,0x27,0x8f,0x38,0x83,0x31,0x52,0x47,0x61,0xa8,0x9a,0x01,0x5b,0x2e,0x62,0x41,0x63,0x39,0x3d,0x5f,0x41,0x5b,0x00,0x00,0x01,0x00,0x3e,0x00,0x00,0x03,0xb0,0x05,0x13,0x00,0x1b,0x00,0x72,0xb3,0x10,0x0c,0x05,0x09,0xbb,0x01,0x84,0x00,0x0a,0x00,0x01,0x01,0x82,0x40,0x15, +0x18,0x03,0x07,0x0c,0x12,0x0a,0x0e,0x18,0x07,0x07,0x18,0x0e,0x0a,0x12,0x0c,0x06,0x00,0x13,0x00,0x08,0x0c,0xb8,0x01,0x7e,0xb4,0x0d,0x05,0x0d,0x04,0x10,0xb8,0x01,0x7e,0x40,0x13,0x11,0x01,0x18,0x11,0x0f,0x11,0x1f,0x11,0x02,0x0d,0x11,0x0d,0x11,0x0a,0x13,0x7f,0x00,0x01,0x00,0x00,0x2f,0x71,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x5d, +0x11,0x39,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x11,0x33,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x03,0xb0, +0xfe,0xbe,0x01,0x02,0xfe,0xd1,0x01,0x2f,0xfe,0xd1,0x94,0xfe,0xc8,0x01,0x38,0xfe,0xc8,0x01,0x08,0xfe,0xc1,0xae,0xe2,0x19,0x12,0x03,0x0c,0x21,0xe4,0x05,0x13,0xfd,0xae,0x7e,0xbc,0x7e,0xfe,0xf7,0x01,0x09,0x7e,0xbc,0x7e,0x02,0x52,0xfe,0x2f,0x35,0x30,0x26,0x44,0x01,0xcc,0x00,0x00,0x01,0x00,0x96,0xfe,0x99,0x03,0xb5,0x03,0xa0, +0x00,0x18,0x00,0x29,0xb1,0x0e,0x0a,0xbb,0x01,0x84,0x00,0x0b,0x00,0x17,0x01,0x84,0xb5,0x14,0x03,0x15,0x0d,0x0b,0x11,0xb8,0x01,0x7e,0xb1,0x06,0x01,0x00,0x2f,0x2f,0xed,0x2f,0x2f,0x33,0x01,0x2f,0x33,0xed,0x2f,0xed,0x32,0x31,0x30,0x21,0x23,0x26,0x35,0x23,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32, +0x36,0x35,0x11,0x33,0x11,0x14,0x03,0xb5,0x9a,0x14,0x05,0x4c,0xb1,0x97,0x40,0x04,0x94,0x94,0x7d,0x65,0x6d,0x89,0x96,0x41,0x57,0xad,0x70,0xfe,0x3e,0x05,0x07,0xfd,0xc9,0x73,0x88,0x9b,0x84,0x02,0x13,0xfd,0x50,0xaa,0x00,0x01,0x00,0x2e,0xfe,0x57,0x04,0x48,0x05,0x13,0x00,0x0b,0x00,0x32,0xb1,0x08,0x0a,0xbb,0x01,0x86,0x00,0x01, +0x00,0x09,0x01,0x86,0x40,0x10,0x03,0x03,0x00,0x04,0x01,0x07,0x00,0x08,0x9a,0x7f,0x05,0x01,0x05,0x0a,0x9a,0x01,0x00,0x2f,0xed,0x2f,0x71,0xed,0x01,0x2f,0x33,0x2f,0x33,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x04,0x48,0xfb,0xe6,0x02,0x65,0xfd,0xbd,0x03,0xd4, +0xfd,0x0b,0x02,0x1a,0xfd,0xca,0x03,0x35,0xfe,0x57,0x47,0x03,0x20,0x03,0x04,0x51,0x8b,0xfd,0x39,0xfd,0x21,0x00,0x00,0x01,0x00,0x5c,0xff,0xea,0x03,0x97,0x05,0x29,0x00,0x25,0x00,0x58,0xb4,0x14,0x25,0x25,0x27,0x1d,0xb8,0x01,0x85,0xb2,0x09,0x21,0x05,0xb8,0x01,0x7e,0xb4,0x06,0x1e,0x06,0x1c,0x0c,0xb8,0x01,0x7e,0x40,0x13,0x0d, +0x19,0x0d,0x0f,0x06,0x1f,0x06,0x02,0x3f,0x0d,0x4f,0x0d,0x02,0x06,0x0d,0x06,0x0d,0x23,0x16,0xbc,0x01,0x7e,0x00,0x11,0x00,0x23,0x01,0x7e,0x00,0x02,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0x39,0x31,0x30,0x25,0x06,0x23,0x20, +0x03,0x23,0x35,0x33,0x26,0x35,0x34,0x37,0x23,0x35,0x33,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x06,0x17,0x21,0x15,0x21,0x12,0x33,0x32,0x37,0x03,0x97,0x79,0x87,0xfe,0x7d,0x4a,0x6e,0x62,0x03,0x05,0x64,0x77,0x2e,0x01,0x01,0xb7,0x7c,0x62,0x68,0x80,0x72,0xb0,0x24,0x01,0xc3,0xfe,0x2a,0x08,0x07, +0x01,0xd7,0xfe,0x37,0x41,0xfc,0x77,0x80,0x2d,0x43,0x01,0xcb,0x7f,0x1c,0x29,0x2c,0x36,0x7f,0xd9,0xf6,0x33,0x93,0x47,0xb6,0x9a,0x7f,0x5a,0x4d,0x7f,0xfe,0xb4,0x4f,0x00,0x03,0x00,0x73,0x00,0x00,0x06,0x30,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x24,0x00,0x70,0xb1,0x0e,0x1f,0xbe,0x01,0x83,0x00,0x14,0x00,0x08,0x01,0x82,0x00,0x03, +0x00,0x23,0x01,0x84,0x40,0x11,0x19,0x0f,0x03,0x00,0x0f,0x0f,0x00,0x03,0x03,0x05,0x0a,0x14,0x0c,0x01,0x05,0x08,0x02,0xbb,0x01,0x7d,0x00,0x01,0x00,0x17,0x01,0x7d,0xb7,0x1c,0x01,0x1c,0x01,0x1c,0x0d,0x10,0x23,0xb8,0x01,0x7d,0x40,0x0a,0x0f,0x04,0x99,0x07,0x07,0x7f,0x0d,0x01,0x0d,0x0c,0x00,0x2f,0x2f,0x71,0x33,0x2f,0xed,0x2f, +0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0xc4,0x2f,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0xed,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32, +0x16,0x15,0x14,0x07,0x07,0x15,0x21,0x02,0x43,0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7,0x83,0x03,0x0a,0x01,0xc4,0xfe,0x0a,0xd9,0x5e,0x33,0x45,0x38,0x6b,0x59,0x4d,0x88,0x6b,0x7d,0xb9,0x95,0x01,0x5e,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfa,0xee,0x67,0xd6,0x5c,0x63, +0x32,0x35,0x42,0x5d,0x87,0x45,0x77,0x62,0x8b,0xb1,0x8d,0x04,0x00,0x04,0x00,0x73,0x00,0x00,0x06,0x0a,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x18,0x00,0x20,0x00,0x7d,0xb5,0x17,0x10,0x0e,0xa8,0x11,0x08,0xbb,0x01,0x82,0x00,0x03,0x00,0x1d,0x01,0x83,0x40,0x18,0x13,0x03,0x00,0x13,0x13,0x00,0x03,0x03,0x05,0x1e,0x1a,0x19,0x0a,0x11, +0x0c,0x01,0x05,0x04,0x99,0x07,0x07,0x0d,0x0f,0x13,0xb8,0x01,0x7d,0xb5,0x1d,0x17,0x14,0x1d,0x08,0x02,0xb8,0x01,0x7d,0x40,0x11,0x01,0x19,0x15,0x1d,0x01,0x15,0x15,0x01,0x1d,0x03,0x0c,0x7f,0x0d,0x01,0x0d,0x11,0x0c,0x00,0x2f,0x33,0x2f,0x71,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x33,0x10,0xed,0x32, +0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0xc4,0x2f,0xc4,0x33,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xf4,0xc6,0x32,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x01,0x33,0x11,0x33,0x03,0x23,0x06,0x07,0x03,0x33,0x11,0x34,0x02,0x43, +0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7,0x83,0x03,0x0a,0x01,0x9e,0x64,0x78,0xfe,0x9c,0x01,0x4f,0x8d,0x64,0xd8,0x04,0x0a,0x18,0xc6,0xe8,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfb,0xa6,0xb9,0xb9,0x53,0x01,0xf6,0xfe,0x1a,0x01,0x74,0x1c,0x26,0xfe,0xce,0x01,0x24,0x1d, +0x00,0x04,0x00,0x75,0x00,0x00,0x06,0x45,0x05,0x25,0x00,0x20,0x00,0x24,0x00,0x2f,0x00,0x37,0x00,0x9a,0xb5,0x2e,0x27,0x25,0xa8,0x28,0x17,0xbe,0x01,0x82,0x00,0x0d,0x00,0x1c,0x01,0x83,0x00,0x06,0x00,0x34,0x01,0x83,0x40,0x0f,0x2a,0x0d,0x06,0x2a,0x2a,0x06,0x0d,0x03,0x09,0x35,0x30,0x21,0x28,0x23,0x1a,0xb8,0x01,0x86,0xb4,0x11, +0x00,0x09,0x26,0x2a,0xb8,0x01,0x7d,0xb5,0x34,0x2e,0x2b,0x34,0x19,0x09,0xb8,0x01,0x7d,0xb3,0x0a,0x0a,0x14,0x03,0xb8,0x01,0x7d,0x40,0x0d,0x1f,0x30,0x2c,0x34,0x1f,0x2c,0x2c,0x1f,0x34,0x03,0x23,0x24,0x0f,0xb8,0x01,0x7d,0xb7,0x14,0x14,0x7f,0x24,0x01,0x24,0x28,0x23,0x00,0x2f,0x33,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x17,0x39, +0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x11,0x39,0x2f,0xed,0x39,0x11,0x33,0x33,0x10,0xed,0x32,0x01,0x2f,0xc4,0xc6,0xed,0xc4,0x2f,0xc4,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xf4,0xc6,0x32,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07, +0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x01,0x33,0x11,0x33,0x03,0x23,0x06,0x07,0x03,0x33,0x11,0x34,0x75,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4f,0x72,0x66,0x7a,0x84,0xa1,0x9a,0x81,0x7c,0x04,0x74,0xfc,0xf7,0x82, +0x03,0x0a,0x01,0x98,0x64,0x78,0xfe,0x9c,0x01,0x4f,0x8d,0x64,0xd8,0x04,0x0b,0x17,0xc6,0xe8,0x02,0x2e,0x81,0x45,0x44,0x3a,0x80,0x6a,0x7a,0x6c,0x3f,0x7e,0x2e,0x6b,0x57,0x89,0x31,0x04,0x26,0x91,0x6a,0x86,0x03,0x15,0xfa,0xed,0x05,0x13,0xfb,0xa6,0xb9,0xb9,0x53,0x01,0xf6,0xfe,0x1a,0x01,0x74,0x1c,0x26,0xfe,0xce,0x01,0x24,0x1d, +0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x3e,0x05,0x13,0x00,0x11,0x00,0x4b,0x40,0x09,0x00,0x0e,0x00,0x0e,0x03,0x09,0x10,0x0c,0x02,0xb8,0x01,0x85,0xb4,0x07,0x05,0x03,0x01,0x05,0xb8,0x01,0x7f,0x40,0x12,0x06,0x10,0x06,0x0f,0x9a,0x0c,0x06,0x0c,0x06,0x0c,0x03,0x0b,0x9a,0x7f,0x08,0x01,0x08,0x03,0x00,0x2f,0x2f,0x71,0xed,0x12,0x39, +0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xc6,0x33,0xed,0x32,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x20,0xdd,0x99,0x91,0x91,0x02,0x94,0xfe,0x05,0x01,0xd5,0xfe,0x2b,0xdd,0xfc,0xfc,0xfc,0x8d,0x03,0x8a, +0x8a,0xfe,0x3f,0x89,0xb6,0x00,0x00,0x04,0x00,0xaa,0xff,0xea,0x07,0xd0,0x05,0x13,0x00,0x09,0x00,0x10,0x00,0x25,0x00,0x45,0x00,0x9b,0xb1,0x36,0x41,0xbb,0x01,0x84,0x00,0x2b,0x00,0x06,0x01,0x85,0xb2,0x0e,0x1d,0x21,0xb8,0x01,0x84,0xb5,0x1a,0x18,0x16,0x1f,0x11,0x3b,0xb8,0x01,0x84,0x40,0x0f,0x26,0x30,0x0e,0x16,0x11,0x30,0x30, +0x11,0x16,0x0e,0x04,0x02,0x2b,0x0b,0x01,0xb8,0x01,0x85,0x40,0x0e,0x02,0x2b,0x3b,0x44,0x33,0x44,0x13,0x0b,0x9a,0x00,0x33,0x38,0x20,0x18,0xb8,0x01,0x7e,0x40,0x0d,0x19,0x1d,0x19,0x00,0x19,0x1c,0x1c,0x19,0x00,0x03,0x03,0x29,0x23,0xb8,0x01,0x7e,0x40,0x09,0x13,0x0a,0x9a,0x7f,0x03,0x01,0x03,0x02,0x18,0x00,0x3f,0x2f,0x71,0xed, +0x2f,0xed,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x33,0x10,0xed,0x11,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc4,0xed,0x11,0x33,0x10,0xc6,0x33,0xed,0x32,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x20,0x11,0x14,0x06,0x23,0x03, +0x11,0x33,0x20,0x11,0x10,0x21,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x17,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x01,0x43,0x99,0x01,0x1b,0x01, +0xa3,0xf0,0xd5,0x60,0x55,0x01,0x30,0xfe,0xe3,0x03,0xd3,0x34,0x57,0x76,0x6a,0x8d,0x8d,0x94,0xd7,0xd7,0x77,0x36,0x2a,0x3e,0x6d,0x7c,0x93,0x3a,0xdf,0x61,0xa6,0x85,0x75,0x47,0x57,0x67,0x42,0x4f,0x62,0x55,0x7f,0x44,0x9f,0x8c,0x92,0x01,0xeb,0xfe,0x15,0x05,0x13,0xfe,0x7c,0xbe,0xe6,0x02,0x9e,0xfd,0xec,0x01,0x13,0x01,0x01,0xfb, +0x80,0x1d,0x81,0x8f,0x01,0xa4,0x7d,0xe3,0x31,0xfe,0xec,0x7d,0xfe,0x76,0xad,0x1f,0x66,0x9f,0x5a,0x68,0x24,0x48,0x54,0x38,0x69,0x6e,0x83,0x2a,0x91,0x3e,0x39,0x2e,0x33,0x28,0x23,0x39,0x66,0x43,0x71,0x82,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x8f,0x05,0x29,0x00,0x23,0x00,0x81,0xb5,0x10,0x0c,0x07,0x22,0x1e,0x01,0xb8,0x01,0x84, +0x40,0x0e,0x12,0x0e,0x0a,0x20,0x00,0x0a,0x00,0x19,0x19,0x00,0x0a,0x03,0x05,0x04,0xb8,0x01,0x86,0xb3,0x07,0x05,0x01,0x0c,0xb8,0x01,0x7e,0xb4,0x0d,0x22,0x0d,0x21,0x10,0xb8,0x01,0x7e,0x40,0x16,0x11,0x1e,0x11,0x30,0x0d,0x40,0x0d,0x02,0x2f,0x11,0x01,0x00,0x11,0x10,0x11,0x02,0x0d,0x11,0x0d,0x11,0x04,0x1b,0xb8,0x01,0x7e,0xb2, +0x16,0x08,0x04,0xb9,0x01,0x7e,0x00,0x07,0x00,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0xed,0x32,0x32,0x10,0xc4,0x32,0x31,0x30,0x01,0x21,0x15,0x14,0x07,0x21,0x15,0x21,0x35, +0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0xc6,0xfe,0xf4,0xaf,0x02,0x84,0xfc,0xd1,0xc6,0xb3,0xb3,0xb3,0xb3,0xc5,0x9d,0x6b,0x56,0x5a,0x65,0xd0,0x01,0x0c,0xfe,0xf4,0x01,0x0c,0x01,0xba,0x08,0xdc,0x57,0x7f,0x7a,0x41,0xdb,0x24, +0x7f,0x7b,0x80,0x71,0xab,0xd9,0x25,0x8d,0x34,0xfe,0xea,0x61,0x80,0x7b,0x00,0x05,0x00,0x73,0xff,0xee,0x06,0x35,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x21,0x00,0x2a,0x00,0x34,0x00,0x9a,0xbc,0x00,0x24,0x01,0x83,0x00,0x20,0x00,0x29,0x01,0x83,0x40,0x0a,0x1a,0x0e,0x18,0x1a,0x20,0x1a,0x20,0x1a,0x16,0x10,0xbb,0x01,0x83,0x00,0x33, +0x00,0x2d,0x01,0x83,0x40,0x0b,0x16,0x0c,0x16,0x0a,0x0a,0x16,0x0c,0x03,0x03,0x33,0x08,0xb8,0x01,0x82,0xb7,0x03,0x04,0x99,0x07,0x07,0x0d,0x08,0x02,0xb8,0x01,0x7d,0xb7,0x01,0x18,0x0e,0x2b,0x22,0x2b,0x13,0x26,0xb8,0x01,0x7d,0x40,0x0e,0x1d,0x22,0x30,0x1d,0x01,0x1d,0x01,0x1d,0x0c,0x7f,0x0d,0x01,0x0d,0x30,0xb8,0x01,0x7d,0xb3, +0x13,0x13,0x0c,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21, +0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x02,0x43,0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7, +0x83,0x03,0x0a,0x01,0x35,0x94,0x94,0x87,0x72,0x97,0x93,0x77,0x8b,0x76,0x6a,0x84,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x42,0x41,0x53,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d, +0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x75,0xff,0xee,0x06,0x76,0x05,0x25,0x00,0x20,0x00,0x24,0x00,0x38,0x00,0x41,0x00,0x4b,0x00,0xc3,0xbc,0x00,0x3b,0x01,0x83,0x00,0x37,0x00,0x40,0x01,0x83,0x40,0x0a,0x31,0x25,0x2f,0x31,0x37,0x31,0x37,0x31,0x2d,0x27,0xbb,0x01,0x83,0x00,0x4a,0x00,0x0d, +0x01,0x82,0x40,0x09,0x11,0x09,0x1a,0x03,0x00,0x17,0x17,0x00,0x1c,0xbb,0x01,0x83,0x00,0x06,0x00,0x44,0x01,0x83,0x40,0x0f,0x2d,0x23,0x06,0x2d,0x21,0x21,0x2d,0x06,0x23,0x04,0x00,0x4a,0x00,0x19,0x09,0xb8,0x01,0x7d,0xb3,0x0a,0x0a,0x14,0x03,0xb8,0x01,0x7d,0xb7,0x1f,0x2f,0x25,0x42,0x39,0x42,0x2a,0x3d,0xb8,0x01,0x7d,0x40,0x0b, +0x34,0x39,0x34,0x47,0x1f,0x34,0x1f,0x34,0x23,0x24,0x0f,0xb8,0x01,0x7d,0xb6,0x14,0x14,0x7f,0x24,0x01,0x24,0x47,0xb8,0x01,0x7d,0xb3,0x2a,0x2a,0x23,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x2f,0xed,0x39, +0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15, +0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x75,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4f,0x72,0x66, +0x7a,0x84,0xa1,0x9a,0x81,0x7c,0x04,0x75,0xfc,0xf7,0x83,0x03,0x0b,0x01,0x35,0x93,0x94,0x87,0x71,0x98,0x93,0x77,0x8b,0x77,0x6a,0x83,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x43,0x40,0x53,0x02,0x2e,0x81,0x45,0x44,0x3a,0x80,0x6a,0x7a,0x6c,0x3f,0x7e,0x2e,0x6b,0x57,0x89,0x31,0x04,0x26,0x91,0x6a,0x86,0x03,0x15,0xfa,0xed,0x05, +0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d,0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x82,0xff,0xee,0x06,0x78,0x05,0x17,0x00,0x15,0x00,0x19,0x00,0x2d,0x00,0x36,0x00,0x40,0x00,0xb6,0xbc,0x00,0x30,0x01,0x83,0x00,0x2c,0x00, +0x35,0x01,0x83,0x40,0x0a,0x26,0x1a,0x24,0x26,0x2c,0x26,0x2c,0x26,0x22,0x1c,0xb8,0x01,0x83,0xb2,0x3f,0x0c,0x11,0xbb,0x01,0x83,0x00,0x06,0x00,0x39,0x01,0x83,0x40,0x0d,0x22,0x18,0x06,0x22,0x16,0x16,0x22,0x06,0x18,0x04,0x09,0x3f,0x0e,0xb8,0x01,0x82,0xb2,0x00,0x09,0x08,0xb8,0x01,0x7d,0xb3,0x0e,0x0e,0x0a,0x03,0xb8,0x01,0x7d, +0xb7,0x14,0x1a,0x24,0x37,0x2e,0x37,0x1f,0x32,0xb8,0x01,0x7d,0x40,0x0b,0x29,0x2e,0x29,0x3c,0x14,0x29,0x14,0x29,0x1f,0x19,0x0d,0xb8,0x01,0x7d,0xb6,0x0a,0x0a,0x7f,0x19,0x01,0x19,0x3c,0xb8,0x01,0x7d,0xb3,0x1f,0x1f,0x18,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10, +0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xfd,0xc4,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x11,0x21,0x15,0x21,0x15,0x36,0x16,0x15, +0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x82,0x67,0x4e,0x4d,0x5b,0xb9,0x8c,0x01,0x9e,0xfe,0xd6,0xa5,0xa9,0x9e,0x89,0x70,0x04, +0x6c,0xfc,0xf7,0x83,0x03,0x0b,0x01,0x34,0x94,0x94,0x87,0x72,0x97,0x93,0x77,0x8b,0x76,0x6a,0x84,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x42,0x41,0x53,0x02,0x25,0x84,0x3f,0x51,0x40,0x8a,0x08,0x01,0x9a,0x71,0xb5,0x0c,0x89,0x74,0x72,0x90,0x03,0x15,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43, +0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d,0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x93,0xff,0xee,0x05,0xfe,0x05,0x1c,0x00,0x06,0x00,0x0a,0x00,0x1e,0x00,0x27,0x00,0x31,0x00,0x9a,0xbc,0x00,0x21,0x01,0x83,0x00,0x1d,0x00,0x26,0x01,0x83,0x40,0x0a,0x17,0x0b,0x15,0x17,0x1d,0x17,0x1d, +0x17,0x13,0x0d,0xbe,0x01,0x83,0x00,0x30,0x00,0x06,0x01,0x85,0x00,0x02,0x00,0x2a,0x01,0x83,0x40,0x0f,0x13,0x01,0x09,0x02,0x13,0x07,0x07,0x13,0x02,0x09,0x01,0x05,0x30,0x03,0x03,0xb8,0x01,0x7d,0x40,0x0a,0x04,0x04,0x0a,0x0b,0x15,0x1f,0x28,0x28,0x10,0x23,0xb8,0x01,0x7d,0x40,0x0e,0x1a,0x1f,0x2d,0x1a,0x01,0x1a,0x01,0x1a,0x10, +0x7f,0x0a,0x01,0x0a,0x2d,0xb8,0x01,0x7d,0xb3,0x10,0x10,0x09,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x2f,0xed,0x01,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39, +0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x23,0x01,0x21,0x35,0x21,0x15,0x25,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x73,0x84,0x01,0x23,0xfe,0x81,0x02, +0x1b,0x02,0x09,0xfc,0xf6,0x82,0x03,0x0a,0x01,0x35,0x94,0x95,0x87,0x71,0x97,0x92,0x76,0x8a,0x77,0x6a,0x83,0xf8,0x7b,0x78,0x36,0x46,0x74,0x90,0x55,0x42,0x40,0x54,0x02,0x11,0x02,0xa0,0x6b,0x30,0x27,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d, +0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x04,0x1e,0x05,0x2b,0x00,0x27,0x00,0x61,0xb1,0x22,0x26,0xb8,0x01,0x84,0x40,0x0a,0x1d,0x01,0x10,0x24,0x24,0x10,0x01,0x03,0x00,0x18,0xb8,0x01,0x84,0xb3,0x07,0x20,0x00,0x02,0xbe,0x01,0x7e,0x00,0x1d,0x00,0x25,0x01,0x7e,0x00,0x22,0x00, +0x21,0x01,0x7e,0x40,0x0a,0x1e,0x1d,0x22,0x1e,0x1e,0x22,0x1d,0x03,0x26,0x13,0xbc,0x01,0x7e,0x00,0x0c,0x00,0x26,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0x33,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x2e,0x03, +0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x04,0x1e,0xfd,0xed,0x61,0x9b,0x6c,0x3a,0x42,0x7d,0xb3,0x70,0x3e,0x71,0x2f,0x34,0x74,0x3b,0x4d,0x7a,0x52,0x2c,0x21,0x42,0x64,0x43,0x01,0xfe,0xfe,0x95,0x01,0x51,0xfe,0xaf, +0x01,0x80,0x01,0x5a,0x03,0x4c,0x80,0xa7,0x5f,0x6f,0xbb,0x87,0x4b,0x17,0x17,0x9b,0x24,0x22,0x39,0x63,0x85,0x4b,0x45,0x75,0x59,0x39,0x0a,0x01,0xba,0x7f,0xfe,0xf0,0x7f,0xfe,0xed,0x00,0x00,0x03,0x00,0x6b,0xff,0xbc,0x03,0xb5,0x05,0xa7,0x00,0x2e,0x00,0x36,0x00,0x40,0x00,0x34,0x40,0x09,0x3b,0x32,0x3f,0x03,0x28,0x15,0x15,0x42, +0x2f,0xb8,0x01,0x85,0xb6,0x28,0x3e,0x31,0x32,0x03,0x37,0x10,0xbc,0x01,0x7e,0x00,0x1b,0x00,0x37,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x2f,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x15, +0x0e,0x03,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x07,0x23,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x37,0x01,0x14,0x17,0x13,0x0e,0x03,0x01,0x22,0x06,0x07,0x01,0x16,0x16,0x17,0x01,0x26,0x02,0xe9,0x27,0x17,0x2b,0x14,0x27,0x68,0x2c,0x0e,0x1d,0x0f,0x36,0x2b,0xfe,0xc3,0x3c,0x4b,0x2a,0x47,0x42,0x41,0x23,0x22,0x43,0x48,0x4f, +0x2f,0x52,0x48,0x15,0x67,0x20,0x26,0x23,0x2f,0x66,0x46,0x45,0x4c,0x4a,0x84,0xb4,0x6b,0x29,0xfe,0x89,0x2f,0xf2,0x41,0x6b,0x4c,0x29,0x01,0xb2,0x09,0x10,0x08,0xfe,0xe2,0x0f,0x21,0x13,0x01,0x32,0x1a,0x05,0xa7,0x7e,0x02,0x02,0x82,0x93,0x04,0x09,0x04,0x96,0x19,0x0e,0xfb,0xee,0x19,0x09,0x12,0x1b,0x13,0x88,0x10,0x17,0x11,0x08, +0x16,0x44,0x69,0x16,0x1b,0x9a,0xe8,0x55,0xe8,0x90,0x8c,0xea,0xb3,0x73,0x13,0x87,0xfc,0xd3,0x96,0x74,0x03,0x1e,0x1a,0x63,0x8a,0xab,0x01,0xce,0x01,0x01,0xfc,0x52,0x14,0x21,0x10,0x03,0xf2,0x03,0x00,0x01,0x00,0x6b,0xff,0xea,0x03,0xb5,0x05,0x29,0x00,0x3e,0x00,0x45,0xb1,0x37,0x07,0xb8,0x01,0x83,0xb3,0x34,0x34,0x00,0x2f,0xb8, +0x01,0x85,0xb4,0x1a,0x25,0x10,0x00,0x02,0xb8,0x01,0x7e,0x40,0x09,0x35,0x37,0x34,0x07,0x04,0x3b,0x3b,0x0a,0x2a,0xbc,0x01,0x7e,0x00,0x1f,0x00,0x0a,0x01,0x7e,0x00,0x15,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x17,0x39,0xed,0x01,0x2f,0x33,0x33,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x06,0x15, +0x11,0x16,0x32,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x03,0xb5,0x23,0x41,0x56,0x39,0x39,0x04,0x0b,0x06,0x2a,0x47,0x42,0x41,0x23,0x22,0x43, +0x48,0x4f,0x2f,0x77,0xc7,0x90,0x51,0x5b,0xa1,0xd9,0x7e,0x28,0x40,0x3a,0x38,0x1d,0x23,0x3c,0x3a,0x3c,0x24,0x5f,0x9e,0x74,0x41,0x24,0x41,0x5c,0x39,0x85,0x03,0x1d,0x74,0x49,0x1a,0x27,0x0e,0x02,0xd1,0x1b,0x50,0x50,0x8c,0xfe,0xaa,0x01,0x09,0x12,0x1b,0x13,0x88,0x10,0x17,0x11,0x08,0x5d,0xa8,0xef,0x93,0x9c,0x01,0x00,0xb7,0x65, +0x05,0x09,0x0e,0x0a,0x96,0x11,0x16,0x0f,0x07,0x52,0x94,0xce,0x7c,0x59,0x9e,0x7f,0x5e,0x1b,0x02,0xcd,0xab,0x58,0x62,0x07,0x05,0x00,0x00,0x01,0x00,0x96,0xff,0x28,0x05,0xbc,0x04,0x93,0x00,0x2e,0x00,0x62,0xb1,0x23,0x1f,0xb8,0x01,0x84,0xb2,0x20,0x2b,0x11,0xb8,0x01,0x84,0x40,0x0d,0x16,0x15,0x20,0x12,0x00,0x01,0x12,0x01,0x12, +0x01,0x06,0x20,0x05,0xb8,0x01,0x84,0xb2,0x06,0x0f,0x19,0xb8,0x01,0x7e,0x40,0x12,0x26,0x13,0x16,0x10,0x2b,0x04,0x26,0x20,0x2e,0x2e,0x2d,0x01,0x26,0x15,0x15,0x12,0x06,0x20,0x00,0x2f,0x33,0x33,0x33,0x2f,0x2f,0x33,0x33,0x33,0x2f,0x11,0x12,0x17,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11, +0x12,0x39,0x33,0xed,0x39,0x10,0xed,0x32,0x31,0x30,0x01,0x07,0x33,0x20,0x11,0x11,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x22,0x07,0x03,0x11,0x23,0x35,0x03,0x23,0x01,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x37,0x13,0x05,0x00,0x7a,0x03,0x01,0x33,0x95,0x0f,0x2e,0x51, +0x41,0x07,0x0b,0x07,0xcc,0x94,0xde,0x8b,0x01,0x69,0xd3,0x39,0x56,0x37,0x1b,0x95,0x95,0x04,0x63,0xbd,0x2d,0x54,0x46,0x33,0x0c,0x39,0x56,0x90,0x04,0x93,0xde,0xfe,0x87,0xfd,0xc4,0x02,0x15,0x3f,0x6b,0x4e,0x2b,0x01,0xfe,0x8f,0xfe,0x3a,0xb9,0xfe,0x6f,0x02,0x8d,0x72,0x01,0x11,0x33,0x54,0x6a,0x36,0xfd,0xef,0x03,0xa0,0x93,0xa8, +0x1b,0x32,0x47,0x2c,0x69,0x2f,0x01,0x06,0x00,0x05,0x00,0x20,0x00,0x00,0x04,0x91,0x05,0x13,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x29,0x00,0x31,0x00,0xa2,0x40,0x0f,0x2f,0x22,0x21,0x12,0x04,0x11,0x14,0x11,0x28,0x0e,0x09,0x09,0x0c,0x08,0x10,0xb8,0x01,0x83,0x40,0x0d,0x29,0x1c,0x1f,0x04,0x04,0x03,0x1d,0x05,0x28,0x03,0x2e,0x20, +0x14,0xb8,0x01,0x84,0x40,0x0b,0x15,0x17,0x00,0x00,0x19,0x01,0x15,0x29,0x13,0x0f,0x17,0xb8,0x01,0x7e,0x40,0x09,0x18,0x20,0x1c,0x0c,0x18,0x23,0x1f,0x0b,0x1b,0xb8,0x01,0x7e,0x40,0x1c,0x00,0x2e,0x08,0x04,0x00,0x0f,0x00,0x1f,0x00,0x3f,0x00,0x4f,0x00,0x04,0x18,0x00,0x18,0x00,0x02,0x25,0x15,0x11,0x2b,0x06,0x7f,0x02,0x01,0x02, +0x00,0x2f,0x71,0xc4,0x33,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x11,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x32,0x32,0x2f,0x33,0x33,0x12,0x17,0x39,0xed,0x32,0x32,0x32,0x2f,0x33,0x11,0x33,0x11,0x12,0x17,0x39,0x31,0x30, +0x13,0x33,0x11,0x33,0x13,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x03,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x05,0x33,0x27,0x23,0x01,0x33,0x26,0x35,0x35,0x23,0x01,0x23,0x16,0x15,0x15,0x33,0x27,0x26,0x20,0x8a,0xb8,0xdb,0x01,0x3e,0x88,0x8e,0x8e,0x8e,0x8e,0xaf,0xed,0xfe, +0xcc,0x89,0x8a,0x8a,0x8a,0x02,0x99,0xc2,0xff,0xfe,0xb7,0xf6,0x3e,0xb8,0x02,0x4b,0x03,0x06,0x85,0xfe,0x3b,0x04,0x06,0x79,0x57,0x19,0x03,0x55,0x01,0xbe,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x7f,0x7c,0x7e,0xfe,0x24,0x01,0xdc,0xfe,0x24,0x01,0xdc,0x7e,0x7c,0x7c,0x7c,0x7c,0x7c,0xfd,0xf2,0x2d,0x91,0x56,0x02,0x79,0x2a,0x86,0x50,0xb0, +0x32,0x00,0x00,0x03,0x00,0xaa,0xff,0xea,0x05,0xdb,0x05,0x13,0x00,0x16,0x00,0x21,0x00,0x54,0x00,0x79,0xb1,0x3a,0x4c,0xb8,0x01,0x84,0xb3,0x27,0x13,0x07,0x0e,0xbb,0x01,0x85,0x00,0x1e,0x00,0x42,0x01,0x84,0x40,0x0c,0x31,0x22,0x00,0x31,0x1e,0x31,0x1e,0x31,0x07,0x27,0x18,0x06,0xb8,0x01,0x85,0x40,0x09,0x07,0x13,0x18,0x9a,0x05, +0x27,0x42,0x51,0x3d,0xb8,0x01,0x7e,0x40,0x0d,0x36,0x05,0x36,0x05,0x36,0x07,0x17,0x9a,0x7f,0x08,0x01,0x08,0x25,0xb8,0x01,0x7e,0xb4,0x51,0x51,0x01,0x07,0x18,0x00,0x3f,0x33,0x33,0x2f,0xed,0x2f,0x71,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x12,0x39,0x39,0x10,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11, +0x33,0x33,0x10,0xed,0x10,0xed,0x11,0x39,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17, +0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0xa3,0xb5,0xa0,0x47,0x80,0x44,0x99,0x01,0x3f,0x55,0x90,0x67,0x3a,0x25,0x47,0x67,0x43,0x49,0x3c,0xfe,0x65,0x84,0x39,0x61,0x46,0x28,0x81,0x80,0x01,0xee,0x38,0x75,0x3d,0xa0,0x1a,0x2d,0x3a,0x1f,0x43,0x57,0x36, +0x16,0x2a,0x4f,0x71,0x48,0x33,0x69,0x28,0x2e,0x64,0x37,0x20,0x38,0x27,0x16,0x14,0x27,0x37,0x20,0x3c,0x5b,0x3c,0x1e,0x1f,0x4a,0x77,0x58,0x3f,0x77,0x31,0x01,0x87,0xa2,0xfd,0xd7,0x05,0x13,0x2a,0x57,0x82,0x57,0x44,0x76,0x5d,0x41,0x0f,0x03,0x1b,0x7f,0x02,0xd4,0xfe,0x29,0x23,0x40,0x5d,0x3a,0x69,0x74,0xfc,0x32,0x26,0x2d,0x64, +0x1c,0x28,0x1c,0x16,0x0b,0x15,0x30,0x3b,0x46,0x2a,0x31,0x53,0x3f,0x25,0x13,0x10,0x94,0x1d,0x1c,0x0d,0x19,0x25,0x16,0x1e,0x26,0x1b,0x14,0x0a,0x14,0x2b,0x38,0x49,0x31,0x2d,0x55,0x43,0x29,0x1b,0x18,0x00,0x00,0x07,0x00,0x12,0x00,0x00,0x05,0x53,0x05,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x33,0x00,0x3b,0x00,0x43, +0x00,0x6a,0xb4,0x3b,0x33,0x05,0x01,0x09,0xb8,0x01,0x7e,0x40,0x0b,0x0a,0x28,0x24,0x20,0x1e,0x0a,0x2b,0x27,0x23,0x1d,0x0d,0xb8,0x01,0x7e,0x40,0x23,0x0e,0x40,0x1a,0x16,0x12,0x0e,0x0f,0x0e,0x1f,0x0e,0x3f,0x0e,0x4f,0x0e,0x04,0x0a,0x0e,0x0a,0x0e,0x07,0x3c,0x18,0x14,0x10,0x10,0x7f,0x14,0x01,0x14,0x37,0x36,0x2e,0x2e,0x03,0x07, +0x00,0x2f,0x33,0x33,0x11,0x33,0x33,0x2f,0x71,0x33,0x2f,0x11,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x32,0x11,0x33,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x32,0x31,0x30,0x01,0x23,0x03,0x23,0x03,0x23,0x03,0x23,0x03,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x03,0x33,0x13,0x33, +0x13,0x33,0x13,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x21,0x33,0x37,0x23,0x05,0x33,0x37,0x23,0x07,0x33,0x27,0x23,0x03,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x05,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x03,0x23,0x06,0x07,0x07,0x33,0x27,0x26,0x05,0x53,0xf4,0x5a,0x93,0x59,0xd2,0x59,0x92,0x5d,0xed,0xd3,0x17,0xbc,0xa2,0x56, +0x82,0x51,0xf4,0x55,0x78,0x50,0xe9,0x4f,0x80,0x54,0xad,0xc5,0x17,0xdb,0xfc,0x0e,0x95,0x18,0xc4,0x02,0x27,0x8f,0x16,0xbc,0xf9,0xa1,0x16,0x74,0xe0,0x0c,0x02,0x04,0x03,0x0f,0x22,0x67,0x02,0x33,0x0a,0x04,0x02,0x03,0x0d,0x20,0x62,0xd4,0x02,0x04,0x0c,0x12,0x43,0x11,0x0c,0x01,0xde,0xfe,0x22,0x01,0xde,0xfe,0x22,0x01,0xde,0x7f, +0x7b,0x80,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x80,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0xfe,0x57,0x3f,0x44,0x30,0x53,0xaf,0xb7,0x33,0x46,0x2f,0x4e,0xb3,0x02,0x5c,0x43,0x40,0x5f,0x5d,0x3d,0x00,0x00,0x03,0x00,0x57,0xfe,0xf3,0x04,0x29,0x05,0x5d,0x00,0x1c,0x00,0x31,0x00,0x35,0x00,0x64,0xb4,0x14,0x14,0x01, +0x33,0x28,0xb8,0x01,0x84,0xb4,0x0a,0x32,0x1b,0x19,0x00,0xb8,0x01,0x84,0xb4,0x1d,0x16,0x12,0x01,0x33,0xbb,0x01,0x7d,0x00,0x34,0x00,0x23,0x01,0x7e,0xb2,0x0f,0x1c,0x14,0xb8,0x01,0x7e,0x40,0x0c,0x15,0x19,0x15,0x02,0x12,0x0f,0x15,0x0f,0x15,0x05,0x18,0x2d,0xb8,0x01,0x7e,0xb3,0x05,0x18,0x01,0x18,0x00,0x3f,0x3f,0xed,0x2f,0x12, +0x39,0x39,0x2f,0x2f,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x2f,0xed,0x01,0x2f,0x33,0x33,0x33,0xfd,0x32,0xc6,0xc6,0x2f,0xed,0xc4,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x2e,0x02, +0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x13,0x21,0x35,0x21,0x03,0xae,0x94,0x04,0x67,0xd8,0x62,0x91,0x5f,0x2e,0x35,0x6a,0xa0,0x6a,0xbc,0x5a,0x04,0xfe,0xd4,0x01,0x2c,0x94,0x7b,0x7b,0x94,0x28,0x46,0x60,0x39,0x4e,0x6f,0x46,0x21,0x20,0x43,0x68,0x49,0x40,0x68,0x4a,0x26,0x70,0xfc,0xfe,0x03,0x02,0x9e,0xb4, +0x4b,0x7d,0xa9,0x5f,0x67,0xb8,0x8b,0x51,0x96,0x01,0x22,0x79,0xa3,0xa3,0x79,0xfd,0x62,0x89,0x38,0x62,0x49,0x29,0x3c,0x68,0x87,0x4c,0x44,0x7e,0x60,0x38,0x34,0x57,0x72,0xfd,0x8f,0x6c,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0x9d,0x05,0x13,0x00,0x19,0x00,0x42,0xb6,0x18,0x19,0x16,0x03,0x00,0x0f,0x07,0xb8,0x01,0x85,0xb7,0x0c,0x0a, +0x08,0x15,0x00,0x19,0x06,0x0a,0xb8,0x01,0x7e,0x40,0x0d,0x16,0x10,0x0f,0x0b,0x0b,0x01,0x14,0x7f,0x0e,0x01,0x0e,0x08,0x01,0x00,0x2f,0x33,0x2f,0x71,0x33,0x12,0x39,0x2f,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0xc6,0x33,0xed,0x32,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35, +0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x03,0x9d,0xc6,0xfe,0x92,0x0f,0x0d,0x07,0x03,0x99,0x84,0x84,0x99,0x03,0x07,0x14,0x08,0x01,0x6f,0xb0,0xfe,0x61,0x01,0x4e,0xfe,0xb9,0x02,0x1c,0x18,0x18,0x0d,0xfd,0xa7,0x02,0x5f,0x80,0x02,0x34,0xfd,0xca,0x0d,0x1e,0x0b,0x02,0x00,0xfd,0xcc,0x80,0x00,0x01, +0x00,0x25,0x00,0x00,0x03,0x1a,0x05,0x13,0x00,0x17,0x00,0x5e,0xb9,0x00,0x06,0x01,0x84,0x40,0x2c,0x07,0x15,0x11,0x9a,0x12,0x02,0x0b,0x03,0x0a,0x0a,0x09,0x0f,0x16,0x0e,0x17,0x0e,0x0d,0x08,0x05,0x09,0x04,0x04,0x03,0x0c,0x01,0x0d,0x00,0x00,0x17,0x09,0x0d,0x03,0x17,0x17,0x03,0x0d,0x09,0x04,0x07,0x7f,0x12,0x01,0x12,0x07,0x00, +0x2f,0x2f,0x71,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x01,0x07,0x15,0x37,0x15,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11,0x21,0x35,0x21,0x15,0x21, +0x11,0x37,0x02,0xbf,0xd4,0xd4,0xd4,0x98,0xd9,0xd9,0xd9,0xd9,0xfe,0xd2,0x02,0xf5,0xfe,0xd1,0xd4,0x03,0x5c,0x79,0xb9,0x79,0x81,0x78,0xfe,0x56,0x01,0x53,0x7a,0x80,0x7a,0xb9,0x7a,0x81,0x7a,0x01,0x7c,0x8a,0x8a,0xfe,0xdb,0x78,0x00,0x05,0x00,0x28,0xfe,0xbf,0x08,0x0c,0x05,0xdb,0x00,0x3a,0x00,0x53,0x00,0x6a,0x00,0x7e,0x00,0x8e, +0x00,0x98,0x40,0x09,0x8c,0x3e,0x0c,0x1e,0x4f,0x36,0x2f,0x24,0x00,0xb8,0x01,0x85,0x40,0x11,0x4a,0x68,0x54,0x6b,0x2a,0x1e,0x24,0x4a,0x6b,0x6b,0x4a,0x24,0x1e,0x2a,0x05,0x14,0x5e,0xbb,0x01,0x83,0x00,0x75,0x00,0x84,0x01,0x82,0x40,0x29,0x14,0x6a,0x24,0x4f,0x4f,0x36,0x0c,0x8c,0x07,0x7f,0x7f,0x3e,0x1e,0x43,0x19,0x68,0x63,0x7a, +0x59,0x19,0x59,0x29,0x29,0x59,0x19,0x03,0x0f,0x36,0x32,0x32,0x2f,0x36,0x43,0x89,0x89,0x0f,0x70,0x63,0x63,0x07,0x0f,0x00,0x2f,0x33,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x2f,0x33,0x33,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x12,0x39,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x2f,0x01,0x2f, +0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x33,0x33,0x11,0x33,0x33,0x33,0x31,0x30,0x01,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x37,0x36,0x36,0x37,0x0e,0x03,0x07,0x27,0x3e,0x03,0x37,0x36, +0x36,0x37,0x17,0x06,0x06,0x07,0x1e,0x03,0x05,0x06,0x02,0x07,0x1e,0x03,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x03,0x23,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0x22,0x0e,0x02,0x15, +0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x05,0xe7,0x20,0x45,0x6d,0x9a,0xca,0x7f,0x35,0x5d,0x4f,0x45,0x1f,0x3c,0x86,0x4d,0x2a,0x43,0x2f,0x1a,0x20,0x34,0x44,0x24,0x23,0x3d,0x38,0x34,0x1a,0x30,0x50,0x23,0x21,0x55,0x37,0x52,0x8c,0x7d,0x72,0x37,0x2f,0x3f,0x90,0xa1,0xb0,0x5e,0x3d,0x91,0x58,0x32,0x40,0x62,0x28,0x7d,0xbc, +0x7d,0x3e,0xfd,0x1c,0x2d,0x69,0x40,0x1b,0x39,0x42,0x48,0x2a,0x5f,0x98,0x76,0x55,0x37,0x1b,0x36,0x67,0x99,0x63,0x18,0x2d,0x29,0x29,0x02,0xa9,0x0e,0x29,0x4a,0x74,0x58,0x38,0x5c,0x43,0x26,0x28,0x4d,0x6f,0x48,0x1e,0x39,0x31,0x27,0x0b,0x7d,0x94,0x01,0x43,0x10,0x21,0x34,0x23,0x28,0x3e,0x2a,0x16,0x12,0x21,0x31,0x1d,0x30,0x43, +0x28,0x12,0xfa,0x8c,0x13,0x23,0x1b,0x11,0x11,0x19,0x22,0x10,0x34,0x59,0x28,0x2d,0x53,0x02,0xee,0x50,0xae,0xa7,0x95,0x71,0x42,0x12,0x1f,0x29,0x15,0x39,0x36,0x19,0x2e,0x41,0x27,0x2b,0x43,0x2d,0x17,0x0e,0x1a,0x21,0x13,0x56,0xf4,0x9b,0x99,0xe1,0x55,0x0a,0x30,0x42,0x4f,0x29,0x48,0x33,0x5f,0x4a,0x2f,0x02,0x42,0x5c,0x22,0x3b, +0x1c,0x43,0x2b,0x0e,0x56,0x8c,0xc0,0xa1,0xb1,0xfe,0xff,0x57,0x13,0x21,0x19,0x0e,0x39,0x61,0x81,0x8d,0x92,0x43,0x6c,0xa9,0x79,0x46,0x09,0x29,0x67,0x7b,0x94,0xfd,0xf1,0x31,0x69,0x57,0x39,0x21,0x41,0x5e,0x3d,0x41,0x73,0x56,0x31,0x0f,0x1c,0x28,0x18,0xfe,0x55,0x02,0x40,0x1d,0x38,0x2b,0x1a,0x22,0x39,0x49,0x27,0x25,0x3c,0x2c, +0x17,0x2c,0x40,0x4b,0x13,0x0c,0x17,0x21,0x14,0x16,0x23,0x17,0x0d,0x31,0x30,0x23,0x31,0x00,0x00,0x02,0x00,0x2b,0xfe,0x7a,0x03,0x18,0x05,0x54,0x00,0x3c,0x00,0x4e,0x00,0x5e,0xb9,0x00,0x02,0x01,0x82,0xb2,0x3b,0x28,0x47,0xb8,0x01,0x83,0xb3,0x0c,0x4a,0x35,0x1b,0xbb,0x01,0x82,0x00,0x07,0x00,0x16,0x01,0x82,0x40,0x1a,0x3d,0x3b, +0x0c,0x07,0x3d,0x3d,0x07,0x0c,0x3b,0x04,0x00,0x20,0x8a,0x30,0x00,0x25,0x4a,0x1b,0x07,0x35,0x01,0x02,0x3b,0x07,0x00,0x42,0xb8,0x01,0x7d,0xb2,0x11,0x3a,0x00,0x00,0x2f,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0xcd,0x32,0x10,0xfd,0xc4,0x10,0xed,0x31,0x30, +0x33,0x13,0x13,0x36,0x37,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x26,0x36,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x06,0x06,0x07,0x06,0x07,0x03,0x07,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x3e,0x03, +0x2b,0xe7,0x44,0x10,0x11,0x0f,0x25,0x14,0x23,0x43,0x34,0x20,0x1d,0x35,0x4c,0x30,0x2b,0x40,0x2b,0x15,0x0f,0x1a,0x22,0x14,0x2a,0x59,0x49,0x2d,0x38,0x64,0x88,0x4f,0x0a,0x0a,0x01,0x08,0x0b,0x21,0x49,0x3d,0x28,0x15,0x25,0x30,0x1b,0x20,0x40,0x1a,0x1d,0x1c,0x5a,0x59,0x01,0xa2,0x0d,0x17,0x1e,0x13,0x0f,0x1e,0x17,0x0d,0x3b,0x2d, +0x0d,0x16,0x11,0x0a,0x01,0xf0,0xfe,0xfe,0x32,0x3a,0x32,0x82,0x4a,0x44,0x80,0x7e,0x7d,0x41,0x39,0x5d,0x42,0x24,0x1f,0x3a,0x53,0x32,0x1f,0x5f,0x79,0x8a,0x4b,0x4c,0x9d,0xaa,0xbb,0x69,0x48,0x88,0x69,0x40,0x0b,0x08,0x06,0x0e,0x03,0x08,0x36,0x51,0x6d,0x40,0x4e,0x90,0x85,0x7b,0x3a,0x72,0xd1,0x52,0x60,0x55,0x01,0x31,0xdf,0x04, +0x6c,0x2b,0x3b,0x24,0x10,0x12,0x25,0x3b,0x2a,0x5e,0xad,0x57,0x36,0x66,0x5d,0x4e,0x00,0x04,0x00,0x22,0x00,0x00,0x04,0x20,0x05,0x13,0x00,0x1f,0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x7f,0xb3,0x30,0x2b,0x2d,0x0c,0xb8,0x01,0x85,0xb6,0x20,0x00,0x1c,0x2d,0x2f,0x24,0x19,0xb8,0x01,0x85,0x40,0x09,0x1e,0x02,0x1a,0x18,0x9a,0x2d,0x2c, +0x12,0x1c,0xb8,0x01,0x7e,0xb6,0x1d,0x24,0x0f,0x1d,0x23,0x0a,0x00,0xb8,0x01,0x7e,0x40,0x21,0x01,0x2f,0x07,0x01,0x50,0x2d,0x01,0x50,0x1d,0x01,0x1d,0x40,0x09,0x0d,0x48,0x20,0x01,0x01,0x2d,0x1d,0x01,0x01,0x1d,0x2d,0x03,0x03,0x1a,0x2e,0x9a,0x7f,0x03,0x01,0x03,0x00,0x2f,0x71,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x2b, +0x5d,0x5d,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x10,0xed,0x01,0x2f,0x33,0x33,0xed,0x32,0x32,0x32,0xc6,0x32,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x35,0x33,0x35,0x21,0x32,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x23,0x0e,0x03,0x23,0x23,0x11,0x23,0x11,0x23,0x35,0x33, +0x35,0x05,0x34,0x27,0x21,0x15,0x21,0x36,0x36,0x01,0x32,0x36,0x37,0x21,0x15,0x11,0x15,0x21,0x26,0x26,0x23,0x22,0x88,0x01,0x59,0x91,0xc7,0x2a,0x9b,0x82,0x03,0x03,0x02,0x84,0xa5,0x19,0x50,0x69,0x7f,0x49,0x9e,0x99,0x88,0x88,0x02,0x57,0x03,0xfe,0x45,0x01,0xba,0x01,0x03,0xfe,0xd8,0x5d,0x7b,0x22,0xfe,0x70,0x01,0x94,0x20,0x73, +0x5b,0x03,0x9d,0x80,0xf6,0x7e,0x78,0x80,0x18,0x1a,0x13,0x24,0x12,0x7f,0x3c,0x5f,0x42,0x23,0xfe,0x5d,0x02,0xa3,0x7f,0x7b,0x39,0x1e,0x1b,0x7b,0x0f,0x21,0xfe,0xda,0x3f,0x38,0x77,0x02,0x5d,0x6c,0x33,0x39,0x00,0x03,0x00,0x4c,0xff,0x43,0x03,0x93,0x05,0xb8,0x00,0x1c,0x00,0x27,0x00,0x2e,0x00,0x65,0x40,0x1a,0x1c,0x2e,0x2d,0x17, +0x16,0x0f,0x06,0x0e,0x00,0x00,0x02,0x22,0x23,0x0c,0x04,0x0d,0x01,0x0d,0x13,0x0e,0x01,0x0e,0x01,0x0e,0x07,0x19,0xbe,0x01,0x84,0x00,0x2b,0x00,0x1d,0x01,0x84,0x00,0x07,0x00,0x2d,0x01,0x7e,0xb4,0x17,0x17,0x0f,0x22,0x28,0xb8,0x01,0x7e,0xb4,0x02,0x1b,0x18,0x23,0x16,0xb8,0x01,0x7e,0xb1,0x0c,0x0f,0x00,0x2f,0x33,0xed,0x32,0x3f, +0x33,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x39,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x05,0x23,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x26,0x27,0x03,0x21,0x11,0x06,0x23,0x23,0x01,0x14,0x1e,0x02,0x17,0x13,0x0e, +0x03,0x01,0x32,0x36,0x37,0x11,0x23,0x03,0x02,0x04,0x63,0x11,0x5b,0x87,0x58,0x2c,0x3d,0x76,0xaf,0x73,0x10,0x63,0x10,0x4a,0x80,0x34,0x37,0x87,0x4b,0x29,0x01,0x43,0xa8,0xcb,0x0b,0xfe,0xcf,0x19,0x33,0x53,0x3b,0x59,0x4e,0x73,0x4d,0x25,0x01,0x46,0x3c,0x72,0x2c,0xc0,0x24,0xbd,0xcc,0x13,0x64,0x9e,0xd3,0x81,0x96,0xee,0xaa,0x5f, +0x07,0xac,0xac,0x05,0x21,0x1d,0xa0,0x2b,0x30,0x06,0xfe,0x1c,0xfd,0xce,0x6f,0x02,0x7e,0x65,0xa6,0x7d,0x53,0x13,0x03,0xf4,0x09,0x51,0x87,0xb6,0xfd,0x93,0x1e,0x1f,0x01,0x63,0xfe,0x60,0x00,0x03,0x00,0x0b,0x00,0x00,0x03,0xdd,0x05,0x13,0x00,0x17,0x00,0x1b,0x00,0x23,0x00,0x45,0xb6,0x1c,0x1d,0x1d,0x15,0x0a,0x06,0x0e,0xb8,0x01, +0x7e,0xb6,0x0f,0x18,0x03,0x0f,0x1b,0x02,0x12,0xb8,0x01,0x7e,0x40,0x0f,0x13,0x20,0x17,0x13,0x0f,0x13,0x0f,0x13,0x08,0x7f,0x15,0x01,0x15,0x0c,0x08,0x00,0x2f,0x33,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x23,0x17,0x33, +0x15,0x23,0x13,0x23,0x03,0x21,0x03,0x23,0x13,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x13,0x01,0x21,0x27,0x21,0x13,0x23,0x06,0x07,0x03,0x33,0x03,0x26,0x03,0xc8,0xba,0x34,0x86,0x5f,0x74,0xa8,0x6b,0xfe,0x52,0x68,0xa9,0x73,0x5d,0x85,0x33,0xb8,0xe0,0xa4,0x9d,0xa4,0xfe,0x5a,0x01,0x65,0x2f,0xfe,0xf8,0x84,0x02,0x08,0x0a, +0x4b,0xbe,0x4d,0x09,0x03,0x0e,0x80,0xa2,0x80,0xfe,0x94,0x01,0x6c,0xfe,0x94,0x01,0x6c,0x80,0xa2,0x80,0x02,0x05,0xfd,0xfb,0xfe,0xde,0xa2,0x01,0xde,0x37,0x1f,0xfe,0xf8,0x01,0x08,0x1b,0x00,0x01,0x00,0x5f,0xff,0xea,0x03,0x85,0x05,0x29,0x00,0x47,0x00,0x5c,0xb3,0x3c,0x21,0x16,0x44,0xbb,0x01,0x85,0x00,0x35,0x00,0x0e,0x01,0x85, +0xb2,0x21,0x09,0x26,0xb8,0x01,0x7d,0xb4,0x27,0x06,0x27,0x01,0x2f,0xb8,0x01,0x7d,0x40,0x1b,0x30,0x46,0x30,0x20,0x27,0x01,0x0f,0x27,0x1f,0x27,0x02,0x3f,0x30,0x4f,0x30,0x02,0x27,0x30,0x27,0x30,0x11,0x3a,0x9a,0x3f,0x11,0x9a,0x1c,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11, +0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x32,0x11,0x39,0x31,0x30,0x01,0x23,0x07,0x06,0x07,0x06,0x07,0x21,0x15,0x21,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x36,0x37,0x23,0x35,0x33,0x36,0x37,0x36,0x37,0x36,0x37,0x21,0x35,0x21,0x36,0x37,0x36,0x35, +0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x03,0x85,0x65,0x04,0x2b,0x3b,0x2f,0x35,0x01,0x33,0xfe,0x15,0x21,0x1a,0x29,0x2e,0x8a,0x8d,0x28,0x60,0x60,0x56,0x1f,0x1a,0x54,0x5e,0x5b,0x1f,0x5c,0xa7,0x80,0x4b,0x1b,0x11,0x17,0x4c,0xb4,0x14,0x15,0x3f,0x45,0x2a,0x24,0xfe,0x51,0x02,0x44,0x17, +0x0d,0x13,0x31,0x4e,0x63,0x32,0xb4,0x73,0x57,0xc1,0x54,0xa2,0x7f,0x4e,0x18,0x23,0x02,0xf3,0x04,0x2b,0x23,0x1c,0x1c,0x61,0x14,0x15,0x1f,0x4e,0x35,0x62,0x68,0x10,0x1e,0x2c,0x1b,0xb3,0x12,0x1c,0x13,0x0a,0x25,0x54,0x85,0x60,0x48,0x39,0x21,0x1e,0x61,0x0e,0x0c,0x26,0x23,0x15,0x12,0x61,0x16,0x1b,0x25,0x32,0x35,0x4a,0x2f,0x15, +0x4f,0xab,0x2e,0x2a,0x55,0x83,0x59,0x46,0x34,0x00,0x00,0x02,0x00,0x4e,0xff,0x43,0x03,0x88,0x05,0xb8,0x00,0x18,0x00,0x21,0x00,0x38,0xb2,0x16,0x10,0x03,0xb8,0x01,0x82,0xb5,0x1f,0x0d,0x04,0x04,0x00,0x1b,0xb8,0x01,0x84,0x40,0x0d,0x09,0x13,0x00,0x20,0x15,0x9a,0x0d,0x10,0x1f,0x16,0x9a,0x05,0x02,0x00,0x2f,0x33,0xed,0x32,0x2f, +0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x27,0x26,0x11,0x10,0x37,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x01,0x06,0x15,0x14,0x17,0x16,0x17,0x11,0x06,0x03,0x88,0x68,0x97,0x5f,0xd0,0x80,0x8c,0x9e,0x81,0xbd,0x5f, +0x9c,0x63,0x71,0x8e,0x94,0x6b,0xfd,0xd1,0x73,0x6c,0x56,0x82,0x7d,0x36,0x41,0x09,0xa9,0xa9,0x0f,0xa2,0xb2,0x01,0x22,0x01,0x38,0xc0,0x9d,0x1c,0x96,0x8f,0x01,0x35,0xa2,0x4d,0x01,0xfb,0xd4,0x06,0x51,0x03,0x40,0x96,0xfa,0xed,0x8e,0x70,0x17,0x04,0x1c,0x1c,0x00,0x05,0x00,0xaa,0xff,0x43,0x03,0x8c,0x05,0xb8,0x00,0x17,0x00,0x1e, +0x00,0x22,0x00,0x26,0x00,0x2d,0x00,0x76,0xb6,0x0c,0x10,0x1d,0x1d,0x2c,0x05,0x15,0xb8,0x01,0x82,0xb4,0x16,0x25,0x02,0x16,0x09,0xb8,0x01,0x85,0x40,0x0a,0x29,0x16,0x21,0x29,0x29,0x21,0x16,0x03,0x00,0x10,0xb8,0x01,0x85,0xb2,0x1a,0x24,0x20,0xb8,0x01,0x85,0x40,0x1c,0xa0,0x00,0xb0,0x00,0x02,0x00,0x0d,0x1c,0x1f,0x9a,0x2c,0x24, +0x24,0x01,0x1d,0x20,0x9a,0x17,0x14,0x04,0x2b,0x23,0x9a,0x05,0x7f,0x01,0x01,0x01,0x00,0x2f,0x71,0x33,0xed,0x32,0x2f,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x39,0x01,0x2f,0x5d,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x11,0x12,0x39,0x31,0x30,0x33,0x11, +0x21,0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x23,0x35,0x37,0x36,0x35,0x34,0x27,0x11,0x36,0x01,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x13,0x36,0x35,0x34,0x27,0x11,0x36,0xaa,0x01,0x1d,0x5e,0x85,0x53,0x5c,0x78,0x69,0x7d,0x97,0x6f,0x63,0x95,0x5e,0xe5,0x40,0xc7,0x53,0xfe, +0xcb,0x84,0x84,0x84,0xb3,0x40,0x95,0x32,0x05,0x13,0xa5,0xa6,0x08,0x49,0x53,0x84,0x6e,0xa4,0x22,0x04,0x0f,0xa8,0x86,0xa6,0x68,0x5e,0x08,0xbe,0xbd,0xc9,0x40,0x6e,0xc4,0x1d,0xfe,0x34,0x0a,0x01,0xc7,0xfe,0x2d,0x01,0xd3,0x02,0x2c,0xfe,0x5d,0x01,0xa3,0xfe,0x99,0x3d,0x6d,0x9b,0x1c,0xfe,0x6f,0x0e,0x00,0x05,0x00,0x8c,0xfe,0x2f, +0x0a,0x0a,0x05,0x5d,0x00,0x1d,0x00,0x37,0x00,0x52,0x00,0x56,0x00,0x5a,0x00,0x95,0xbc,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x33,0x05,0x0a,0x40,0x09,0x30,0x30,0x53,0x89,0x54,0x57,0x89,0x58,0x24,0xb8,0x05,0x0a,0x40,0x0e,0x21,0x0d,0x54,0x58,0x21,0x52,0x52,0x21,0x58,0x54,0x0d,0x05,0x1a,0x4a,0xb8,0x05,0x0a,0xb2,0x3f,0x00,0x03, +0xb8,0x05,0x0a,0x40,0x0a,0x1a,0x1d,0x44,0x22,0x22,0x44,0x1d,0x03,0x0f,0x3a,0xb8,0x04,0xfb,0xb4,0x2f,0x4f,0x01,0x4f,0x1e,0xb8,0x04,0xfb,0xb6,0x2f,0x29,0x01,0x29,0x59,0x55,0x08,0xb8,0x04,0xfb,0x40,0x0b,0x58,0x54,0x2f,0x15,0x01,0x15,0x31,0x2f,0x0f,0x01,0x0f,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2f,0x5d, +0xed,0x2f,0x5d,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x01,0x2f,0xfd,0xc6,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05, +0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2f,0x0a,0x0a,0x20,0x47,0x71,0x51,0x5d,0x85,0x55,0x27,0x8d,0x33, +0x75,0xc0,0x8e,0x7a,0xa5,0x63,0x2b,0x0c,0x0d,0x05,0xf7,0x55,0x52,0x8d,0x31,0x56,0x73,0x40,0x3e,0x5b,0x41,0x29,0x18,0x09,0x8e,0x08,0x20,0x3e,0x01,0x45,0x71,0x50,0x4d,0x69,0x3f,0x1b,0x11,0x1c,0x25,0x14,0x92,0x17,0x24,0x1a,0x0d,0x3d,0x6e,0x97,0x59,0x2e,0x62,0x34,0xfe,0x72,0xa8,0xa8,0x01,0x23,0xa7,0xa7,0x01,0x7e,0x41,0x6e, +0x32,0x56,0x78,0x49,0x21,0x2c,0x64,0xa2,0x75,0x04,0x51,0xfb,0x9d,0x82,0xce,0x90,0x4e,0x3e,0x74,0xa5,0x68,0x39,0x76,0x44,0xfb,0x5f,0x65,0x01,0x7e,0xfe,0x7c,0x61,0x83,0x4f,0x22,0x1e,0x34,0x44,0x4f,0x55,0x2a,0x04,0x0d,0xfc,0x29,0x3a,0x60,0x43,0x26,0xfe,0x6a,0x23,0x37,0x62,0x85,0x4d,0x44,0x81,0x7b,0x77,0x39,0x3b,0x81,0x81, +0x7e,0x38,0x7d,0xc0,0x83,0x43,0x14,0x15,0x6e,0xa4,0xa4,0xa4,0x00,0x03,0x00,0x6e,0xff,0xee,0x06,0x34,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x2e,0x00,0x82,0xb9,0x00,0x1b,0x01,0x82,0x40,0x09,0x27,0x18,0x1f,0x03,0x0f,0x25,0x25,0x0f,0x2a,0xb8,0x01,0x83,0x40,0x0b,0x14,0x0a,0x0f,0x0c,0x0c,0x0f,0x0a,0x03,0x03,0x14,0x08,0xb8,0x01, +0x82,0xb7,0x03,0x04,0x99,0x07,0x07,0x0d,0x08,0x02,0xb8,0x01,0x7d,0xb2,0x01,0x27,0x17,0xb8,0x01,0x7d,0xb3,0x18,0x18,0x11,0x1d,0xb8,0x01,0x7d,0x40,0x0b,0x22,0x01,0x22,0x01,0x22,0x0c,0x7f,0x0d,0x01,0x0d,0x11,0xb8,0x01,0x7d,0xb3,0x2d,0x2d,0x0c,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x12, +0x39,0x2f,0xed,0x39,0x10,0xed,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07, +0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x3d,0xfe,0x38,0xa7,0xae,0x01,0x24,0xab,0x02,0xef,0xfc,0xf6,0x82,0x03,0x0a,0x51,0x5d,0x67,0x49,0x53,0xc6,0x4d,0x49,0xb2,0x82,0x55,0x54,0x4f,0x72,0x67,0x79,0x83,0xa0,0x9a,0x80,0x7d,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c, +0xfa,0xed,0x05,0x13,0xfb,0x0b,0x81,0x45,0x44,0x3a,0x7f,0x6b,0x7a,0x6b,0x3e,0x7e,0x2e,0x6c,0x57,0x88,0x31,0x04,0x26,0x91,0x6a,0x86,0x00,0x03,0x00,0x80,0xff,0xee,0x06,0x32,0x05,0x25,0x00,0x16,0x00,0x1a,0x00,0x3b,0x00,0x9c,0xb9,0x00,0x28,0x01,0x82,0x40,0x09,0x2c,0x24,0x35,0x03,0x1b,0x32,0x32,0x1b,0x37,0xbb,0x01,0x83,0x00, +0x21,0x00,0x11,0x01,0x83,0x40,0x13,0x06,0x0b,0x01,0x19,0x00,0x06,0x1b,0x19,0x06,0x1b,0x17,0x17,0x1b,0x06,0x19,0x04,0x01,0x21,0x15,0xbb,0x01,0x84,0x00,0x01,0x00,0x09,0x01,0x7d,0xb4,0x0e,0x0e,0x1a,0x34,0x24,0xb8,0x01,0x7d,0xb3,0x25,0x25,0x1e,0x2a,0xb8,0x01,0x7d,0xb2,0x2f,0x02,0x15,0xb8,0x01,0x7d,0x40,0x0b,0x01,0x2f,0x01, +0x2f,0x01,0x19,0x7f,0x1a,0x01,0x1a,0x1e,0xb8,0x01,0x7d,0xb3,0x3a,0x3a,0x19,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0xed,0x39,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11, +0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x15,0x21,0x01,0x01,0x23,0x01,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15, +0x14,0x06,0x23,0x22,0x02,0x76,0xfe,0x0a,0xd9,0x5e,0x33,0x45,0x38,0x6b,0x59,0x4d,0x88,0x6b,0x7d,0xb9,0x95,0x01,0x5e,0x02,0xb4,0xfc,0xf7,0x83,0x03,0x0a,0x51,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4e,0x73,0x66,0x79,0x83,0xa0,0x9a,0x80,0x7c,0x02,0x11,0x67,0xd6,0x5d,0x62,0x32,0x35,0x42,0x5d,0x87,0x45,0x77, +0x62,0x8b,0xb0,0x8e,0x03,0x02,0x93,0xfa,0xed,0x05,0x13,0xfb,0x0b,0x81,0x45,0x44,0x3a,0x7f,0x6b,0x7a,0x6b,0x3e,0x7e,0x2e,0x6c,0x57,0x88,0x31,0x04,0x26,0x91,0x6a,0x86,0x00,0x00,0x02,0x00,0xb2,0x04,0x37,0x02,0xbc,0x06,0x1f,0x00,0x03,0x00,0x07,0x00,0x1f,0xbc,0x00,0x05,0x01,0x85,0x00,0x06,0x00,0x01,0x01,0x85,0xb5,0x02,0x06, +0x02,0x02,0x07,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x51,0x9f,0x02,0x0a,0x9f,0x06,0x1f,0xfe,0x18,0x01,0xe8,0xfe,0x18,0x01,0xe8,0x00,0x00,0x01,0x00,0xb2,0x04,0x37,0x01,0x51,0x06,0x1f,0x00,0x03,0x00,0x13,0xb9,0x00,0x01,0x01,0x85,0xb3,0x02,0x02, +0x02,0x00,0x00,0x2f,0x32,0x2f,0x01,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x01,0x51,0x9f,0x06,0x1f,0xfe,0x18,0x01,0xe8,0x00,0x01,0x00,0x53,0x03,0x1d,0x03,0x55,0x06,0x1f,0x00,0x0e,0x00,0x0f,0xb4,0x0c,0x0b,0x03,0x03,0x0c,0x00,0x2f,0x33,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x01,0x05,0x13,0x07,0x03,0x03,0x27,0x13,0x25,0x37,0x05, +0x03,0x33,0x03,0x25,0x03,0x55,0xfe,0xd4,0xd0,0x79,0xaa,0xad,0x78,0xd0,0xfe,0xd2,0x31,0x01,0x1f,0x1a,0x97,0x19,0x01,0x20,0x04,0xb7,0x3e,0xfe,0xf7,0x53,0x01,0x21,0xfe,0xdf,0x53,0x01,0x09,0x3e,0x88,0x6c,0x01,0x4c,0xfe,0xb4,0x6c,0x00,0x00,0x01,0x00,0x2b,0xfe,0xdf,0x01,0x59,0x00,0xf9,0x00,0x03,0x00,0x0f,0xb4,0x02,0x00,0x02, +0x02,0x00,0x00,0x2f,0x32,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x25,0x03,0x23,0x13,0x01,0x59,0xae,0x80,0x80,0xf9,0xfd,0xe6,0x02,0x1a,0x00,0x00,0x01,0x00,0xa6,0x02,0x49,0x03,0x1e,0x02,0xde,0x00,0x03,0x00,0x0e,0xb4,0x01,0x00,0x01,0x99,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1e,0xfd,0x88,0x02,0x78, +0x02,0x49,0x95,0x00,0x00,0x01,0x00,0x7a,0xff,0xe8,0x01,0x6f,0x00,0xde,0x00,0x0b,0x00,0x0d,0xb3,0x09,0x03,0x06,0x00,0x00,0x2f,0x32,0x01,0x2f,0xcd,0x31,0x30,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xf4,0x33,0x47,0x47,0x33,0x33,0x48,0x48,0x18,0x48,0x32,0x33,0x49,0x49,0x33,0x32,0x48,0x00,0x02,0x00,0x7a, +0xff,0xe8,0x01,0x6f,0x04,0x77,0x00,0x0b,0x00,0x17,0x00,0x15,0xb7,0x15,0x09,0x0f,0x03,0x12,0x0c,0x00,0x06,0x00,0x2f,0x33,0x2f,0x33,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xf4,0x33,0x47,0x47,0x33,0x33,0x48, +0x48,0x33,0x33,0x47,0x47,0x33,0x33,0x48,0x48,0x03,0x85,0x48,0x32,0x32,0x46,0x46,0x32,0x32,0x48,0xfc,0x63,0x48,0x32,0x33,0x49,0x49,0x33,0x32,0x48,0x00,0x00,0x02,0x00,0x2b,0xfe,0xdf,0x01,0x71,0x04,0x77,0x00,0x0b,0x00,0x0f,0x00,0x1a,0x40,0x0a,0x0c,0x0c,0x0e,0x09,0x03,0x0e,0x0e,0x0f,0x00,0x06,0x00,0x2f,0x33,0x2f,0x33,0x2f, +0x01,0x2f,0xcd,0x2f,0x39,0x2f,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x03,0x23,0x13,0xf7,0x33,0x47,0x47,0x33,0x32,0x48,0x48,0x30,0xae,0x80,0x80,0x03,0x85,0x48,0x32,0x32,0x46,0x46,0x32,0x32,0x48,0xfd,0x74,0xfd,0xe6,0x02,0x1a,0x00,0x01,0x00,0x00,0xfe,0xa9,0x03,0xd7,0xff,0x32,0x00,0x03, +0x00,0x0e,0xb4,0x01,0x00,0x01,0x9a,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0xd7,0xfc,0x29,0x03,0xd7,0xfe,0xa9,0x89,0x00,0x00,0x02,0x00,0x6a,0x00,0xe7,0x04,0x48,0x03,0xf9,0x00,0x05,0x00,0x0b,0x00,0x09,0xb1,0x05,0x0b,0x00,0x19,0x2f,0x33,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x03,0x23,0x01, +0x01,0x33,0x01,0x04,0x46,0xc3,0xfe,0xa7,0x01,0x59,0xc5,0xfe,0x9d,0x61,0xc0,0xfe,0xa6,0x01,0x5a,0xc0,0xfe,0xa2,0xe7,0x01,0x85,0x01,0x8d,0xfe,0x73,0xfe,0x7b,0x01,0x85,0x01,0x8d,0xfe,0x73,0x00,0x00,0x02,0x00,0x68,0x00,0xe7,0x04,0x48,0x03,0xf9,0x00,0x05,0x00,0x0b,0x00,0x09,0xb1,0x03,0x09,0x00,0x19,0x2f,0x33,0x31,0x30,0x01, +0x01,0x23,0x01,0x01,0x33,0x03,0x01,0x23,0x01,0x01,0x33,0x04,0x48,0xfe,0xa4,0xbf,0x01,0x5d,0xfe,0xa3,0xbf,0x66,0xfe,0xa7,0xc5,0x01,0x64,0xfe,0x9c,0xc5,0x02,0x6e,0xfe,0x79,0x01,0x87,0x01,0x8b,0xfe,0x75,0xfe,0x79,0x01,0x87,0x01,0x8b,0x00,0x01,0x00,0x00,0x02,0x29,0x04,0x5f,0x02,0xb6,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x01, +0xb9,0x01,0x7f,0x00,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x04,0x5f,0xfb,0xa1,0x04,0x5f,0x02,0x29,0x8d,0x00,0x02,0x00,0x6f,0x03,0xd0,0x02,0x9c,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x32,0x40,0x18,0x21,0x0c,0x29,0x14,0x04,0x18,0x1e,0x24,0x03,0x09,0x0f,0x15,0x15,0x1e,0xaf,0x24,0x24,0x2b,0x11,0x00, +0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x05,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35, +0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x01,0x6b,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11, +0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0x03,0xd0,0x02,0x95,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x2c,0x40,0x15,0x14,0x29,0x0c,0x21,0x04,0x03,0x0f,0x09,0x18,0x24,0x1e,0x00,0x0f,0xaf,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0xc6,0x11,0x12,0x39,0x11,0x12, +0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27, +0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x6f,0x03,0xd0,0x01,0x61, +0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x0c,0x14,0x04,0x03,0x09,0x0f,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20, +0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x15,0x40,0x09,0x14,0x0c,0x04,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x13,0x36,0x36,0x35,0x34, +0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x74,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x62,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x16,0x00,0x17, +0x40,0x0a,0x16,0x0e,0xb2,0x17,0x05,0x11,0x00,0x11,0xaf,0x0b,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31,0x30,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x62,0x1b,0x31,0x24,0x15,0x19,0x1d,0x28,0x1a,0x2f,0x30,0x3b,0x45,0x20,0x35,0x46,0x27,0xde,0x16,0x31,0x31, +0x2f,0x15,0x19,0x13,0x0d,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0xfe,0xed,0x02,0x95,0x00,0xcf,0x00,0x14,0x00,0x29,0x00,0x2a,0x40,0x14,0x14,0x0c,0x29,0x21,0xb2,0x2a,0x18,0x24,0x1e,0x03,0x0f,0xaf,0x09,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x2f,0xe1, +0x39,0x11,0x12,0x39,0x00,0x10,0xf4,0xc4,0x33,0x32,0x31,0x30,0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44, +0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x74,0x03,0xd0, +0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x00,0x08,0x04,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x36,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28, +0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a,0x5f,0x2d,0x00,0x02,0x00,0x90,0x03,0xd0,0x02,0xbd,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x2d,0x40,0x15,0x26,0x1a,0x20,0x29,0x29,0x20,0xaf,0x1a,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x15,0x00,0x1d,0x08,0x04,0x00, +0x3f,0x33,0xc4,0x32,0x01,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x05,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x52,0x27,0x46,0x35, +0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x01,0x0b,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a,0x5f,0x2d,0x3b,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a, +0x5f,0x2d,0x00,0x03,0x00,0x8d,0xff,0xe7,0x06,0x57,0x05,0xb1,0x00,0x15,0x00,0x31,0x00,0x4d,0x00,0x40,0x40,0x1d,0x10,0x0b,0x00,0x05,0x00,0x05,0x00,0x40,0x32,0x16,0x24,0x40,0x0b,0x0b,0x0d,0x15,0x02,0x13,0x0d,0x08,0x13,0x08,0x13,0x08,0x1d,0x39,0x2b,0x47,0x1d,0x00,0x2f,0xc9,0x2f,0xc9,0x11,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10, +0xc9,0xc6,0x10,0xc2,0x2f,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xc9,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x25,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x04,0x37,0x14,0x1e,0x04,0x33,0x32, +0x3e,0x04,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x04,0x80,0x69,0x8f,0xc0,0xfe,0xfc,0x01,0x0a,0xd5,0x79,0x60,0x56,0x8f,0x8d,0xb7,0xbb,0x90,0x84,0x5e,0xfc,0x0d,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x7f,0x2c,0x50,0x70,0x88,0x9d,0x55,0x54, +0x9d,0x88,0x70,0x50,0x2c,0x2c,0x50,0x70,0x88,0x9d,0x54,0x55,0x9d,0x88,0x70,0x50,0x2c,0x01,0x49,0x45,0xfa,0xbc,0xda,0x01,0x04,0x35,0x96,0x48,0xb4,0x98,0x94,0xb2,0x4e,0xfb,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x5f,0x55,0x9c,0x88,0x70,0x50,0x2c, +0x2c,0x50,0x70,0x88,0x9c,0x55,0x55,0x9d,0x88,0x70,0x50,0x2c,0x2c,0x50,0x70,0x88,0x9d,0x00,0xff,0xff,0x00,0x70,0x00,0xb2,0x01,0x50,0x04,0xde,0x02,0x07,0x00,0x1d,0x00,0x00,0x00,0xc8,0x00,0x17,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b, +0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x5b,0x00,0x6b,0x00,0x73,0x00,0x7c,0x00,0xb2,0x00,0xbc,0x00,0xc3,0x01,0x65,0x40,0xc6,0x3b,0x1b,0x38,0x18,0x37,0x2f,0x14,0x34,0x2c,0x23,0x1f,0x20,0x1c,0x0c,0x64,0x65,0x79,0x97,0x97,0xab,0x7d,0x8e,0x03,0x11,0x4d,0x50,0x51,0xa1,0x8e,0xab,0x86,0x48, +0x57,0x59,0x57,0xbe,0xb4,0xb5,0x6d,0x75,0x5c,0xb9,0xc1,0x61,0x71,0x68,0x79,0x06,0x12,0x11,0x51,0x8e,0x86,0x57,0xb5,0x5c,0xc1,0x71,0x79,0x12,0x12,0x79,0x71,0xc1,0x5c,0xb5,0x57,0x86,0x8e,0x51,0x11,0x0b,0x14,0x30,0x3c,0x40,0x05,0x04,0x0f,0x00,0x31,0x3d,0x41,0x04,0x0c,0x09,0x24,0x28,0x44,0x04,0x17,0x25,0x29,0x45,0x0a,0x04, +0x14,0x2a,0x42,0x29,0x41,0x46,0x3e,0x01,0x45,0x3d,0x3d,0x0f,0x26,0x32,0x32,0x0f,0x25,0x31,0x31,0x0f,0x97,0x97,0x9c,0x7e,0x81,0x5a,0x52,0x51,0x51,0x49,0x15,0x0d,0xb0,0x81,0xb3,0xbe,0xbd,0xb6,0x9c,0x93,0x5c,0x75,0x49,0x57,0x74,0x6d,0x6c,0x5d,0x4d,0x52,0x0a,0x00,0x0d,0xb5,0x81,0xbe,0xb6,0x93,0x75,0x57,0x6d,0x5d,0x52,0x00, +0x00,0x52,0x5d,0x6d,0x57,0x75,0x93,0xb6,0xbe,0x81,0xb5,0x0d,0x0c,0x01,0x19,0x1d,0x2d,0x13,0x04,0x0f,0x12,0x18,0x1c,0x2c,0x04,0x0c,0x20,0x34,0x38,0x06,0x04,0x04,0x07,0x21,0x35,0x39,0x04,0x01,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f, +0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0x10,0xc0,0x2f,0x10,0xc4,0x10,0xc6,0x10,0xc2,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9, +0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x11,0x33,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc5,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4, +0x32,0x31,0x30,0x13,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01, +0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23, +0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x23,0x11,0x33,0x32,0x15,0x14,0x06,0x23,0x27,0x15,0x33,0x32,0x35,0x34,0x23,0xbc,0xeb,0x96, +0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfd,0x02,0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b, +0x98,0x9d,0x48,0x4d,0x2f,0x25,0x2e,0x37,0x55,0x49,0x44,0x2a,0x1e,0x23,0x47,0x24,0x34,0x22,0x26,0x25,0x22,0xfd,0x7c,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22, +0x24,0x40,0x02,0x1f,0x61,0x98,0xa2,0x5d,0x4e,0x2e,0x26,0x4d,0x4d,0x04,0xd4,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff, +0xd1,0x2c,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfe,0x52,0x01,0xae,0x35,0x30,0x23,0x34,0x0a,0x01,0x06,0x38,0x29,0x3b,0x45,0x01,0x67,0x66,0x1d,0x19,0x30,0xae,0x72,0x1f,0x1b,0x1a,0x1e,0xfd,0x3a,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30, +0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x8f,0x94,0x01,0xae,0x89,0x41,0x50,0xd0,0x86,0x43,0x43,0x00,0x00,0x15,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23, +0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x7d,0x00,0x87,0x00,0x8e,0x00,0x98,0x00,0xb4,0x01,0x57,0x40,0xbf,0x3b,0x1b,0x38,0x18,0x14,0x23,0x1f,0x20,0x1c,0x0c,0xa8,0x2f,0x2f,0x37,0x62,0x62,0x76,0x34,0x2c,0xa4,0x8f,0x8f,0x96,0x48,0x59,0x93,0x03,0x11,0x97,0x90,0x6c,0x59, +0x96,0x92,0x76,0x51,0x37,0xa4,0x89,0x7f,0x80,0x84,0x8c,0x06,0x12,0x11,0x90,0x59,0x92,0x51,0xa4,0x80,0x8c,0x12,0x99,0x99,0x12,0x8c,0x80,0xa4,0x51,0x92,0x59,0x90,0x11,0x0a,0x14,0x30,0x3c,0x40,0x05,0x04,0x0f,0x00,0x31,0x3d,0x41,0x04,0x0c,0x09,0x24,0x28,0x44,0x04,0x17,0x25,0x29,0x45,0x0a,0x04,0x14,0x2a,0x42,0x29,0x41,0x46, +0x3e,0x01,0x45,0x3d,0x3d,0x0f,0x26,0x32,0x32,0x0f,0x25,0x31,0x31,0x0f,0x62,0x62,0x67,0x49,0x4c,0xb4,0xa4,0xac,0x15,0x0d,0x7b,0x4c,0x7e,0x89,0x88,0x81,0x67,0x5e,0xa3,0x9b,0x90,0x97,0xb1,0xb0,0xa9,0xa8,0x04,0x97,0x9e,0x9f,0xac,0x93,0x94,0x0a,0x00,0x0d,0x80,0x4c,0x89,0x81,0x5e,0x97,0xac,0x94,0x00,0x00,0x94,0xac,0x97,0x5e, +0x81,0x89,0x4c,0x80,0x0d,0x0a,0x01,0x19,0x1d,0x2d,0x13,0x04,0x0f,0x12,0x18,0x1c,0x2c,0x04,0x0c,0x20,0x34,0x38,0x06,0x04,0x04,0x07,0x21,0x35,0x39,0x04,0x01,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x32, +0x11,0x17,0x33,0x10,0xc9,0x32,0x32,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0x10,0xc4,0x32,0x10,0xc6,0x10,0xc2,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, +0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x32,0x10,0xca,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0xc4,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc4,0x32,0x10,0xc0,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0x31,0x30,0x13,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23, +0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x01,0x35,0x16, +0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x23,0x11,0x33,0x32,0x15,0x14,0x06,0x23,0x27,0x15,0x33,0x32,0x35,0x34,0x23,0x25,0x21,0x35,0x13,0x23,0x35, +0x21,0x15,0x03,0x33,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0xbc,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1, +0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfb,0xac,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40, +0x02,0x1f,0x61,0x98,0xa2,0x5d,0x4e,0x2e,0x26,0x4d,0x4d,0xfe,0x82,0xfe,0xa5,0xdd,0xcd,0x01,0x4a,0xd8,0xd9,0x02,0xb6,0x71,0x6c,0x47,0x06,0x01,0x01,0x03,0x05,0x49,0x70,0x71,0x6a,0x3c,0x04,0x02,0x02,0x01,0x07,0x4e,0x68,0x47,0x04,0x03,0x01,0x01,0x05,0x3b,0x04,0xd4,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56, +0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0xfd,0xc7,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c, +0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x8f,0x94,0x01,0xae,0x89,0x41,0x50,0xd0,0x86,0x43,0x43,0xba,0x38,0x01,0x27,0x4f,0x36,0xfe,0xd6,0x01,0x60,0xfe,0x52,0x01,0x14,0x15,0x1b,0x1d,0x13,0xfe,0xec,0x01,0xae,0xfe,0xe2,0x13,0x1f,0x17,0x1c,0x01,0x1d,0xfe,0xdf, +0x10,0x1e,0x18,0x18,0x01,0x1f,0x00,0x16,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x35,0x00,0x3b,0x00,0x41,0x00,0x47,0x00,0x4d,0x00,0x51,0x00,0x55,0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x91,0x00,0xa5,0x00,0xb5,0x00,0xbd,0x00,0xc6,0x01,0x62,0x40,0xc3, +0x71,0x51,0x6e,0x4e,0x6d,0x65,0x4a,0x6a,0x62,0x59,0x56,0x52,0x42,0x1a,0x1a,0x2e,0x00,0x11,0xae,0xaf,0xc3,0x39,0x47,0x83,0x86,0x87,0xb7,0xbf,0xa6,0xab,0xbb,0xb2,0xc3,0x7e,0x8d,0x8f,0x8d,0x97,0x9a,0x9b,0x24,0x11,0x2e,0x09,0x92,0xa1,0xa3,0xa1,0x3c,0x48,0x47,0x87,0xa6,0xbb,0xc3,0x8d,0x9b,0x11,0x09,0xa1,0x48,0x48,0xa1,0x09, +0x11,0x9b,0x8d,0xc3,0xbb,0xa6,0x87,0x47,0x0b,0x4a,0x66,0x72,0x76,0x3b,0x04,0x45,0x36,0x67,0x73,0x77,0x04,0x42,0x3f,0x5a,0x5e,0x7a,0x04,0x4d,0x5b,0x5f,0x7b,0x40,0x04,0x4a,0x60,0x78,0x5f,0x77,0x7c,0x74,0x37,0x5b,0x67,0x67,0x45,0x01,0xbf,0xa4,0x90,0x88,0x9b,0x87,0x87,0x7f,0x1a,0x7b,0x73,0x73,0xb6,0x5c,0xae,0xaf,0x03,0x68, +0xb7,0x4b,0x43,0x33,0xa6,0xbf,0x04,0xbf,0xbe,0xb7,0x1f,0xb6,0xa7,0x16,0xa7,0x93,0x7f,0x8d,0xa1,0x8d,0x97,0x83,0x88,0x9c,0x88,0x40,0x36,0x43,0xbf,0xb7,0xa7,0x8d,0x88,0x36,0x36,0x88,0x8d,0xa7,0xb7,0xbf,0x43,0x07,0x37,0x4f,0x53,0x63,0x49,0x04,0x45,0x48,0x4e,0x52,0x62,0x04,0x42,0x56,0x6a,0x6e,0x3c,0x04,0x3a,0x3d,0x57,0x6b, +0x6f,0x04,0x37,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x10,0xc9,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc4,0x17,0x32,0x10,0xc0,0x2f,0x32,0x32,0x10,0xc0,0x2f, +0x32,0x10,0xc4,0x32,0x10,0xc4,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10, +0xc9,0x10,0xc9,0x32,0x10,0xc9,0x32,0x11,0x33,0x10,0xc5,0x32,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc4,0x32,0xc4,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4,0x32,0x31,0x30,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14, +0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33, +0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x01,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x01,0x11,0x33,0x32, +0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x04,0x10,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13, +0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0xfc,0x95,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfc,0xe4, +0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b,0x02,0x01,0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b,0xfc,0xc7,0x9d,0x48,0x4d,0x2f,0x25,0x2e,0x37,0x55,0x49,0x44,0x2a,0x1e,0x23,0x47,0x24,0x34,0x22,0x26,0x25,0x22,0x01,0x0e,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11, +0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x03,0xd2,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01, +0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x2c,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfe,0x52,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfc,0x34,0x01,0xae,0x35,0x30, +0x23,0x34,0x0a,0x01,0x06,0x38,0x29,0x3b,0x45,0x01,0x67,0x66,0x1d,0x19,0x30,0xae,0x72,0x1f,0x1b,0x1a,0x1e,0x00,0xff,0xff,0x00,0xab,0xff,0xf2,0x04,0x15,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x0e,0x6f,0x02,0x01,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x73,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x3c,0x01,0x3c,0x00,0x11, +0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xf2,0x04,0xad,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x09,0x3b,0x02,0x01,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x73,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x3c,0x01,0x3c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xa1,0xff,0xf2,0x06,0x16,0x05,0x3f,0x00,0x26,0x08,0xf3,0x00,0x00,0x00,0x27, +0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x57,0x01,0x57,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xa1,0xff,0xf2,0x06,0xae,0x05,0x3f,0x00,0x26,0x08,0xf3,0x00,0x00,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x60, +0x01,0x60,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x3f,0x00,0x26,0x0e,0x5e, +0x00,0x00,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x64,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x30,0x00,0xe4,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07, +0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0e,0xb6,0x05,0x02,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x64,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x30,0x00,0xe4,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0e, +0xb6,0x05,0x02,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0a,0x6d,0x00,0xe5,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0c,0xb5,0x04,0x02,0x2f,0x3e,0x01,0x3e,0x00, +0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0a,0x6d,0x00,0xe5,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0c,0xb5,0x04,0x02,0x2f,0x3e,0x01,0x3e,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff, +0x06,0x16,0x05,0x5a,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x73,0x00,0xe5,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x5d,0x01,0x5d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x5a,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27, +0x09,0x73,0x00,0xe5,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x5d,0x01,0x5d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc5,0x08,0xc2,0x05,0x3f,0x00,0x26,0x0f,0x61,0x00,0x00,0x00,0x27,0x0f,0x52,0x01,0xc8,0xfd,0xca,0x00,0x27,0x0e,0x6f,0x06,0xae, +0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x6c,0x01,0x6c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc5,0x09,0x5a,0x05,0x3f,0x00,0x26,0x0f,0x61,0x00,0x00,0x00,0x27,0x0f,0x52,0x01,0xc8,0xfd,0xca,0x00,0x27,0x09,0x3b,0x06,0xae,0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a, +0xb4,0x04,0x2f,0x6c,0x01,0x6c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0xca,0x04,0xc0,0x05,0x3f,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0x83,0xfd,0xcf,0x00,0x27,0x0e,0x6f,0x02,0xac,0x00,0x00,0x01,0x07,0x09,0x7e,0x03,0x1e,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x55,0x01,0x55,0x00,0x11,0x5d,0x35,0xff,0xff, +0x00,0x9a,0xff,0x02,0x08,0xc2,0x05,0x3f,0x00,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x0e,0x6f,0x06,0xae,0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x09,0x5a,0x05,0x3f,0x00,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x09,0x3b,0x06,0xae, +0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xc0,0x05,0x3f,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0e,0x6f,0x02,0xac,0x00,0x00,0x01,0x07,0x09,0x7e,0x03,0x1e,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x4d,0x01,0x4d,0x00,0x11, +0x5d,0x35,0x00,0x02,0xff,0x0e,0x04,0x88,0x00,0xf3,0x07,0x90,0x00,0x19,0x00,0x25,0x00,0x2b,0x40,0x0d,0x0d,0x0d,0x00,0x1a,0x14,0x14,0x20,0x06,0x1d,0x14,0x17,0x17,0x0c,0xbb,0x01,0x36,0x00,0x23,0x00,0x03,0x01,0x3a,0x00,0x3f,0xc9,0x3f,0x39,0x2f,0x39,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0xd9,0xc0,0x2f,0x31,0x30,0x13,0x14,0x06, +0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x37,0x15,0x06,0x07,0x07,0x0e,0x02,0x07,0x33,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0xf3,0x83,0x6c,0x74,0x82,0x2d,0x68,0x80,0x71,0x1e,0x0e,0x34,0x58,0x46,0x42,0x26,0x06,0x02,0x3c,0x6f,0x69,0x79,0x54,0x58,0x48,0x68,0x34,0x59,0x4a,0x45, +0x54,0x05,0x8c,0x77,0x8d,0xa3,0xa0,0x78,0xaa,0x67,0x15,0x13,0x14,0x4d,0x0e,0x09,0x0e,0x0c,0x2f,0x68,0x49,0x57,0x8c,0x7a,0x59,0x67,0x62,0x3f,0x5c,0x79,0x68,0x00,0x00,0x03,0xff,0x36,0x04,0x96,0x00,0xcb,0x06,0x96,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0x31,0x40,0x10,0x0b,0x09,0x0d,0x0d,0x04,0x00,0x14,0x11,0x18,0x04,0x17,0x11, +0x11,0x18,0x10,0x05,0xbb,0x01,0x38,0x00,0x18,0x00,0x04,0x01,0x3a,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0xc4,0x31,0x30,0x13,0x14,0x06,0x23,0x23,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x27,0x34,0x23,0x23,0x15,0x33,0x32,0x17,0x34,0x23,0x23,0x15,0x33,0x32,0xcb,0x61, +0x47,0xed,0xdf,0x4c,0x57,0x62,0x75,0x65,0x59,0x85,0x7b,0x63,0x13,0x6f,0x82,0x8e,0x63,0x05,0x29,0x40,0x53,0x02,0x00,0x42,0x3b,0x64,0x15,0x0f,0x7c,0x43,0x90,0x94,0x4e,0x9e,0x00,0x01,0xff,0x72,0x04,0x96,0x00,0x8f,0x06,0x96,0x00,0x05,0x00,0x17,0xb4,0x04,0x01,0x02,0x00,0x03,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f, +0xc9,0x01,0x2f,0xc9,0x2f,0x31,0x30,0x03,0x11,0x23,0x11,0x21,0x15,0x3c,0x52,0x01,0x1d,0x06,0x50,0xfe,0x46,0x02,0x00,0x46,0x00,0x02,0xfe,0xfc,0x03,0xdb,0x01,0x05,0x06,0x96,0x00,0x0c,0x00,0x11,0x00,0x2f,0x40,0x0b,0x0a,0x11,0x11,0x00,0x10,0x03,0x04,0x0c,0x00,0x0e,0x08,0xb8,0x01,0x38,0xb5,0x10,0x0a,0x05,0x04,0x00,0x02,0xb8, +0x01,0x3a,0x00,0x3f,0xce,0x32,0xc9,0x32,0x32,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0xc8,0x12,0x39,0x2f,0xc9,0x31,0x30,0x13,0x35,0x21,0x15,0x23,0x11,0x33,0x36,0x13,0x21,0x11,0x33,0x11,0x03,0x23,0x06,0x07,0x33,0xbf,0xfe,0x83,0x46,0x2e,0x81,0x04,0x01,0x0a,0x4c,0x9e,0x72,0x0d,0x67,0xe6,0x03,0xdb,0xbb,0xbb,0x01,0x01,0xba,0x01, +0x00,0xfe,0x46,0xfe,0xff,0x02,0x75,0xd5,0x9f,0x00,0x00,0x01,0xfe,0x84,0x04,0x96,0x01,0x7d,0x06,0x96,0x00,0x15,0x00,0x2f,0x40,0x12,0x10,0x03,0x04,0x0d,0x04,0x0a,0x09,0x04,0x13,0x13,0x04,0x09,0x0a,0x04,0x08,0x15,0x08,0x0b,0xba,0x01,0x38,0x00,0x00,0x01,0x3a,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, +0x11,0x33,0x10,0xc9,0x32,0x31,0x30,0x01,0x27,0x23,0x15,0x23,0x35,0x23,0x07,0x23,0x13,0x27,0x33,0x17,0x33,0x35,0x33,0x15,0x33,0x37,0x33,0x07,0x13,0x01,0x0e,0xe5,0x02,0x4e,0x02,0xe4,0x6f,0xfe,0xee,0x68,0xdb,0x02,0x4e,0x02,0xdb,0x6a,0xf0,0xff,0x04,0x96,0xfd,0xfd,0xfd,0xfd,0x01,0x08,0xf8,0xf0,0xf0,0xf0,0xf0,0xf8,0xfe,0xf8, +0x00,0x01,0xff,0x46,0x04,0x88,0x00,0xbb,0x06,0xa1,0x00,0x21,0x00,0x37,0x40,0x13,0x1e,0x1f,0x0d,0x1b,0x11,0x11,0x0a,0x16,0x05,0x0d,0x00,0x0a,0x1f,0x0d,0x0e,0x0e,0x08,0x14,0x19,0xbb,0x01,0x39,0x00,0x08,0x00,0x03,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x39,0x01,0x2f,0xc9,0x2f,0xc4,0x32,0x12,0x39,0x2f,0xc9, +0x10,0xc9,0x32,0x31,0x30,0x13,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0xbb,0x70,0x64,0x6b,0x36,0x3f,0x5d,0x88,0x95,0x32,0x30,0x82,0x37,0x39,0x4b,0x4a,0x57,0x45,0xbb,0x3a,0x30,0x38,0x46,0x05,0x21, +0x47,0x52,0x1b,0x51,0x26,0x56,0x55,0x46,0x51,0x1f,0x2c,0x25,0x4c,0x1f,0x89,0x2e,0x41,0x09,0x02,0x05,0x42,0x00,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x0c,0x00,0x29,0x40,0x0c,0x0a,0x0a,0x04,0x0c,0x07,0x03,0x0b,0x04,0x02,0x07,0x09,0x06,0xbb,0x01,0x38,0x00,0x04,0x00,0x00,0x01,0x3a,0x00,0x3f,0x32,0x3f,0x33, +0x39,0x39,0x01,0x2f,0xc8,0xc9,0x32,0x2f,0x12,0x39,0x2f,0x31,0x30,0x13,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x01,0x62,0xe2,0x02,0x52,0x52,0x02,0xd7,0x6c,0xee,0x01,0x00,0x04,0x96,0xf6,0xf6,0x02,0x00,0xeb,0xeb,0xf7,0xfe,0xf7,0x00,0x01,0xff,0x20,0x04,0x8f,0x00,0xe1,0x06,0x96,0x00,0x0e,0x00,0x1c,0xb4,0x07, +0x0e,0x00,0x02,0x0c,0xb8,0x01,0x38,0xb2,0x0a,0x05,0x00,0xb8,0x01,0x3a,0x00,0x3f,0xd4,0xc9,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0x31,0x30,0x13,0x11,0x23,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x8f,0x77,0x12,0x61,0x59,0x1a,0x12,0x0d,0x19,0x70,0x1e,0x01,0x0d,0x04,0x96,0x01,0xbb,0xe9,0xd9,0x07,0x47,0x09,0x01, +0xc2,0xfe,0x00,0x00,0x00,0x01,0xfe,0xec,0x04,0x96,0x01,0x15,0x06,0x96,0x00,0x10,0x00,0x17,0xb4,0x07,0x08,0x10,0x00,0x09,0xba,0x01,0x38,0x00,0x08,0x01,0x3a,0x00,0x3f,0x3f,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x11,0x07,0x03,0x23,0x03,0x27,0x11,0x23,0x11,0x33,0x13,0x17,0x37,0x13,0x33,0x11,0xc4,0x0f,0x93,0x49,0x84,0x22, +0x47,0x69,0x87,0x25,0x24,0x83,0x6d,0x04,0x96,0x01,0xa6,0x2d,0xfe,0x87,0x01,0x48,0x5e,0xfe,0x5a,0x02,0x00,0xfe,0xb2,0x65,0x63,0x01,0x50,0xfe,0x00,0x00,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x0b,0x00,0x27,0x40,0x0b,0x07,0x03,0x04,0x0b,0x08,0x00,0x02,0x07,0x07,0x09,0x06,0xbb,0x01,0x38,0x00,0x04,0x00,0x00, +0x01,0x3a,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0xc9,0x01,0x2f,0x33,0xc9,0x2f,0xc9,0x32,0x31,0x30,0x13,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x83,0xfe,0xfb,0x52,0x52,0x01,0x05,0x52,0x04,0x96,0xe8,0xe8,0x02,0x00,0xd2,0xd2,0xfe,0x00,0x00,0x00,0x02,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa2,0x00,0x0b,0x00,0x15, +0x00,0x1c,0xb5,0x09,0x14,0x0f,0x03,0x0c,0x06,0xbb,0x01,0x39,0x00,0x12,0x00,0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x02,0x71,0x89,0x8d,0x79,0x71,0x81,0x8a,0x6e,0x4f,0x5d,0x5b, +0x51,0xa4,0x04,0x89,0x91,0x76,0x82,0x90,0x8e,0x7c,0x7c,0x93,0x01,0xd3,0x6a,0x5e,0x5b,0x6a,0xc7,0xc6,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x07,0x00,0x1c,0xb5,0x03,0x04,0x07,0x00,0x02,0x05,0xbb,0x01,0x38,0x00,0x04,0x00,0x00,0x01,0x3a,0x00,0x3f,0x32,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x11, +0x21,0x11,0x23,0x11,0x21,0x11,0x83,0xfe,0xfb,0x52,0x01,0xa9,0x04,0x96,0x01,0xba,0xfe,0x46,0x02,0x00,0xfe,0x00,0x00,0x02,0xff,0x15,0x03,0xa9,0x00,0xec,0x06,0xa2,0x00,0x10,0x00,0x1d,0x00,0x2e,0x40,0x0c,0x0b,0x17,0x11,0x05,0x01,0x02,0x00,0x05,0x08,0x14,0x01,0x0e,0xbd,0x01,0x3b,0x00,0x1a,0x00,0x08,0x01,0x39,0x00,0x03,0x01, +0x38,0x00,0x3f,0x3f,0xc9,0x3f,0xce,0xc9,0x12,0x39,0x39,0x01,0x2f,0xc9,0x32,0x32,0x2f,0xc9,0x31,0x30,0x03,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x99,0x52,0x52,0x02,0x3c,0x75,0x64,0x6e,0x7d,0x6c,0x65,0x35,0x02,0x52, +0x40,0x46,0x59,0x4e,0x44,0x47,0x58,0x04,0xdf,0xfe,0xca,0x02,0xed,0x5a,0x66,0x8a,0x73,0x82,0x9a,0x56,0x83,0x3b,0x59,0x6c,0x6d,0x52,0x64,0x62,0x48,0x00,0x00,0x01,0xff,0x40,0x04,0x89,0x00,0xc1,0x06,0xa2,0x00,0x15,0x00,0x1c,0xb5,0x05,0x10,0x0b,0x00,0x02,0x13,0xbb,0x01,0x39,0x00,0x08,0x00,0x0d,0x01,0x3b,0x00,0x3f,0xc9,0x3f, +0xc9,0x01,0x2f,0x33,0x2f,0xc9,0x31,0x30,0x13,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0xc1,0x38,0x41,0x4f,0x65,0x5d,0x51,0x43,0x3c,0x3d,0x51,0x6b,0x88,0x93,0x77,0x46,0x31,0x06,0x35,0x27,0x72,0x58,0x58,0x6b,0x2d,0x4e,0x25,0x8c,0x74,0x7d,0x9c,0x19,0x00,0x01, +0xff,0x3e,0x04,0x96,0x00,0xc3,0x06,0x96,0x00,0x07,0x00,0x1d,0xb7,0x01,0x02,0x02,0x06,0x04,0x00,0x04,0x05,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x32,0x01,0x2f,0x2f,0x39,0x2f,0xc9,0x31,0x30,0x13,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x2a,0x52,0x9a,0x01,0x85,0x06,0x50,0xfe,0x46,0x01,0xba,0x46,0x46,0x00,0x01, +0xff,0x23,0x04,0x96,0x00,0xdd,0x06,0x96,0x00,0x10,0x00,0x1d,0xb7,0x01,0x09,0x09,0x0a,0x08,0x02,0x00,0x03,0xba,0x01,0x3a,0x00,0x00,0x01,0x38,0x00,0x3f,0x3f,0x01,0x2f,0x32,0x2f,0x33,0x39,0x2f,0xc9,0x31,0x30,0x13,0x03,0x17,0x23,0x27,0x23,0x06,0x07,0x23,0x37,0x03,0x33,0x16,0x17,0x33,0x37,0x37,0xdd,0xac,0xaa,0x60,0x7b,0x02, +0x12,0x6b,0x5e,0xae,0xa8,0x60,0x6b,0x0e,0x02,0x1a,0x65,0x06,0x96,0xfe,0xfe,0xfe,0xcc,0x20,0xac,0xfc,0x01,0x04,0xbd,0x1b,0x31,0xa7,0x00,0x01,0xff,0x06,0x03,0xdb,0x00,0xfb,0x06,0x96,0x00,0x0b,0x00,0x29,0x40,0x0a,0x09,0x06,0x06,0x00,0x05,0x02,0x0b,0x00,0x07,0x04,0xb8,0x01,0x38,0xb3,0x09,0x05,0x00,0x02,0xb8,0x01,0x3a,0x00, +0x3f,0xce,0xc9,0x32,0x3f,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0x31,0x30,0x13,0x35,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x11,0xb4,0xfe,0x52,0x52,0x01,0x05,0x52,0x4c,0x03,0xdb,0xbb,0x02,0x00,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xff,0x00,0x00,0x01,0xff,0x2f,0x04,0x96,0x00,0xd2,0x06,0x96,0x00,0x0f,0x00,0x24, +0x40,0x0b,0x08,0x05,0x0f,0x0c,0x00,0x03,0x01,0x0a,0x0a,0x0d,0x07,0xba,0x01,0x38,0x00,0x00,0x01,0x3a,0x00,0x3f,0x3f,0x33,0x39,0x2f,0xcd,0xc9,0x01,0x2f,0x33,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x35,0x06,0x23,0x22,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x35,0x33,0x11,0x81,0x57,0x4f,0xac,0x52,0x61,0x49,0x56,0x51,0x04,0x96,0xce, +0x31,0xb6,0xad,0xa9,0x71,0x2b,0xeb,0xfe,0x04,0x00,0x00,0x01,0xfe,0xba,0x04,0x96,0x01,0x47,0x06,0x96,0x00,0x0b,0x00,0x29,0x40,0x0b,0x07,0x04,0x04,0x00,0x0b,0x08,0x03,0x00,0x09,0x05,0x02,0xb8,0x01,0x38,0xb2,0x07,0x03,0x00,0xb8,0x01,0x3a,0x00,0x3f,0xc9,0x32,0x3f,0x33,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0x31, +0x30,0x01,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0xfe,0xba,0x52,0xcc,0x52,0xcb,0x52,0x04,0x96,0x02,0x00,0xfe,0x46,0x01,0xba,0xfe,0x46,0x01,0xba,0xfe,0x00,0x00,0x01,0xfe,0x93,0x03,0xdb,0x01,0x6d,0x06,0x96,0x00,0x0f,0x00,0x37,0x40,0x10,0x09,0x06,0x0d,0x0a,0x06,0x0a,0x06,0x0a,0x00,0x05,0x02,0x0f,0x00,0x0b, +0x07,0x04,0xb8,0x01,0x38,0xb4,0x0d,0x09,0x05,0x00,0x02,0xb8,0x01,0x3a,0x00,0x3f,0xce,0xc9,0x32,0x32,0x3f,0x33,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x31,0x30,0x01,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x01,0x25,0xfd,0x6e,0x52,0xcb,0x52,0xcc,0x52, +0x4d,0x03,0xdb,0xbb,0x02,0x00,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xff,0x00,0x00,0x03,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa1,0x00,0x0b,0x00,0x1b,0x00,0x28,0x00,0x40,0x40,0x19,0x27,0x09,0x19,0x1f,0x13,0x03,0x19,0x13,0x1f,0x0c,0x27,0x10,0x21,0x25,0x1f,0x27,0x21,0x21,0x27,0x1f,0x25,0x04,0x16,0x1c,0x06,0xbb, +0x01,0x39,0x00,0x16,0x00,0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x33,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x22,0x27,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x06,0x06, +0x03,0x22,0x06,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x26,0x02,0x73,0x87,0x8c,0x79,0x73,0x80,0x89,0x29,0x16,0x36,0x32,0x15,0x0d,0x29,0x27,0x08,0x5c,0x45,0x48,0x51,0x0a,0x1d,0x30,0x55,0x49,0x59,0x08,0x48,0x19,0x13,0x39,0x3b,0x0c,0x0e,0x4a,0x10,0x04,0x89,0x8f,0x78,0x80,0x91,0x8c,0x7d,0x7c,0x91,0xcc,0x1b,0x1a,0x10, +0x0c,0x4b,0x57,0x4e,0x55,0x0b,0x0f,0x01,0x05,0x55,0x4d,0x18,0x19,0x1b,0x1d,0xa1,0x00,0x01,0xfe,0x94,0x04,0x88,0x01,0x6c,0x06,0x96,0x00,0x17,0x00,0x30,0x40,0x0d,0x01,0x02,0x0d,0x02,0x0d,0x02,0x12,0x16,0x07,0x12,0x00,0x04,0x15,0xbd,0x01,0x38,0x00,0x0a,0x00,0x0f,0x01,0x3b,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x3f,0xc9, +0x32,0x01,0x2f,0xc9,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x31,0x30,0x13,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0xd3,0x52,0xe0,0x56,0x64,0x58,0x4b,0x44,0x3a,0x39,0x48,0x6d,0x86,0x8d,0x7c,0x01,0xcf,0x06,0x50,0xfe,0x46,0x01,0xba,0x65,0x59,0x55, +0x6e,0x2d,0x4e,0x26,0x8c,0x75,0x7d,0x90,0x46,0x00,0x00,0x02,0xff,0x36,0x04,0x89,0x00,0xcb,0x06,0xa2,0x00,0x14,0x00,0x1e,0x00,0x3a,0x40,0x12,0x0f,0x0f,0x19,0x08,0x1e,0x0b,0x00,0x01,0x15,0x0f,0x12,0x0b,0x0b,0x1b,0x02,0x05,0x0d,0x12,0xbd,0x01,0x39,0x00,0x1b,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x3f, +0xc9,0x12,0x39,0x12,0x39,0x2f,0x12,0x39,0xc9,0x01,0x2f,0xc9,0x33,0x33,0x2f,0xd9,0xc0,0x2f,0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x07,0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0xcb,0x52,0x02,0x35,0x68,0x4e,0x56,0xa4,0x9f,0x6a,0x5c,0x4a,0x40, +0x6e,0xb4,0x52,0x7c,0x42,0x31,0x64,0x3a,0x51,0x04,0x96,0x50,0x5d,0x52,0x43,0x8d,0x18,0x18,0x81,0x3e,0x54,0x30,0xbe,0x4a,0x13,0x0a,0x2a,0x2e,0x56,0x54,0x40,0x00,0x00,0x02,0xff,0x21,0x04,0x89,0x00,0xdf,0x06,0xa2,0x00,0x11,0x00,0x17,0x00,0x2d,0x40,0x0e,0x06,0x06,0x00,0x12,0x17,0x01,0x0b,0x01,0x05,0x17,0x17,0x03,0x14,0x0e, +0xbb,0x01,0x39,0x00,0x03,0x00,0x08,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0x39,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x06,0x07,0xdf,0xfe,0x98,0x04,0xa1,0x56,0x4a,0x41,0x71,0x6d,0x7c, +0x86,0x65,0x64,0x6f,0x53,0x02,0x7e,0x3a,0x52,0x09,0x05,0x81,0xb2,0x39,0x4e,0x31,0x8b,0x80,0x76,0x98,0x80,0x76,0x1a,0x96,0x51,0x45,0x00,0x01,0xff,0x27,0x04,0x96,0x00,0xda,0x06,0x96,0x00,0x19,0x00,0x4c,0x40,0x1f,0x04,0x08,0x01,0x17,0x17,0x14,0x0d,0x19,0x19,0x13,0x14,0x06,0x06,0x0c,0x0d,0x10,0x17,0x08,0x17,0x07,0x19,0x00, +0x04,0x00,0x17,0x00,0x17,0x00,0x02,0x14,0x0d,0xba,0x01,0x3a,0x00,0x02,0x01,0x38,0x00,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0xd9,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x33,0xc9,0x32,0x31,0x30,0x03,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x16,0x16,0x15, +0x15,0x23,0x35,0x34,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x37,0x35,0x23,0xae,0x86,0x52,0x85,0x85,0x57,0x59,0x52,0x85,0x8a,0x52,0xb1,0x86,0x06,0x3a,0x5c,0x5c,0x43,0x4c,0x0a,0x78,0x6a,0x29,0x32,0xa1,0xa1,0x32,0x2c,0xd8,0x12,0x4b,0x00,0x00,0x02,0xff,0x18,0x04,0x88,0x00,0xe8,0x07,0x8c,0x00,0x12,0x00,0x1c,0x00,0x3b,0x40,0x1a, +0x10,0x08,0x0c,0x19,0x00,0x16,0x08,0x19,0x16,0x16,0x19,0x08,0x03,0x06,0x0f,0x1b,0x09,0x06,0x19,0x0c,0x09,0x0c,0x09,0x0f,0x13,0x03,0xb8,0x01,0x3b,0x00,0x3f,0xc9,0x2f,0x39,0x39,0x2f,0x2f,0xc9,0x01,0x2f,0xc6,0xc9,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x11,0x33,0x10,0xc9,0x31,0x30,0x13,0x14,0x06,0x23,0x22,0x26,0x35, +0x34,0x37,0x03,0x33,0x16,0x17,0x37,0x13,0x33,0x03,0x16,0x16,0x07,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x15,0x14,0x5d,0x44,0x34,0x35,0x47,0x47,0x98,0x5f,0x59,0x0e,0x09,0xa5,0x5c,0xda,0x23,0x2c,0x7a,0x19,0x10,0x0f,0x1d,0x26,0x04,0xf8,0x30,0x40,0x3d,0x36,0x37,0x89,0x01,0x20,0xb6,0x23,0x16,0x01,0x74,0xfe,0x30,0x3e,0x5e,0x52, +0x21,0x0e,0x10,0x2d,0x3a,0x4f,0x28,0x2f,0x00,0x02,0xfe,0xf7,0x04,0x96,0x01,0x0a,0x07,0x8c,0x00,0x12,0x00,0x19,0x00,0x3b,0x40,0x19,0x0f,0x0b,0x17,0x08,0x04,0x04,0x06,0x0d,0x00,0x13,0x06,0x16,0x0f,0x0e,0x06,0x07,0x0b,0x07,0x0f,0x07,0x0f,0x07,0x09,0x17,0x04,0xb8,0x01,0x3a,0x00,0x3f,0xc9,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33, +0x10,0xc9,0x32,0x10,0xc9,0x01,0x2f,0x2f,0xc9,0xc4,0x12,0x39,0x2f,0x33,0xc9,0x32,0x32,0x31,0x30,0x01,0x14,0x06,0x23,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x32,0x16,0x07,0x34,0x23,0x23,0x15,0x33,0x32,0x01,0x0a,0x5c,0x48,0xe3,0x8c,0x8c,0x52,0x9c,0x9c,0x89,0x4f,0x5d,0x54,0x68,0x79,0x7a,0x67,0x05, +0x36,0x47,0x59,0x02,0x59,0x43,0x5a,0x5a,0x43,0xfe,0xe2,0x51,0x4a,0x55,0xaf,0x00,0x00,0x02,0xfe,0xa2,0x04,0x8a,0x01,0x5e,0x06,0xa2,0x00,0x12,0x00,0x1a,0x00,0x3b,0x40,0x10,0x15,0x0a,0x03,0x03,0x06,0x10,0x19,0x09,0x05,0x06,0x04,0x09,0x09,0x17,0x13,0x0d,0xbf,0x01,0x39,0x00,0x07,0x01,0x38,0x00,0x06,0x01,0x3a,0x00,0x17,0x00, +0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0x3f,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x12,0x39,0x2f,0x33,0xc9,0x31,0x30,0x13,0x22,0x26,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x15,0x14,0x33,0x32,0x35,0x34,0x6c,0x6a,0x79,0x04,0x91,0x52,0x52,0x92,0x0d,0x7c, +0x69,0x70,0x76,0x81,0x6c,0x99,0x9b,0x97,0x04,0x8a,0x7f,0x75,0xe8,0x02,0x00,0xd2,0x66,0x78,0x8e,0x7c,0x7f,0x8f,0x01,0xd3,0xc8,0xc6,0xc7,0xc7,0x00,0x02,0xfe,0xc2,0x04,0x8a,0x01,0x3f,0x06,0xa2,0x00,0x1b,0x00,0x26,0x00,0x5e,0x40,0x1d,0x0f,0x0b,0x0c,0x15,0x15,0x1c,0x09,0x07,0x07,0x00,0x0c,0x22,0x1b,0x11,0x00,0x15,0x15,0x13, +0x18,0x0a,0x0f,0x23,0x11,0x0f,0x11,0x0f,0x11,0x1f,0x18,0xbd,0x01,0x39,0x00,0x0d,0x01,0x38,0x00,0x00,0x00,0x0c,0x01,0x3a,0xb4,0x01,0x02,0x02,0x1f,0x04,0xb8,0x01,0x3b,0x00,0x3f,0xd9,0xc0,0x2f,0x32,0x3f,0x33,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x01,0x2f,0x33,0xc9,0x33,0x2f,0x12,0x39, +0x2f,0xcd,0xd9,0xc0,0x2f,0x10,0xc9,0x32,0x31,0x30,0x13,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x23,0x11,0x33,0x15,0x21,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x11,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x07,0x06,0x06,0xed,0x02,0x32,0x6b,0x4c,0x57,0x1c,0xb3,0x52,0x52,0x01,0x38,0xa1,0x69,0x5b, +0x4c,0x47,0x67,0xb4,0xfe,0xc0,0x3a,0x28,0x3f,0x4d,0x7c,0x42,0x30,0x04,0x96,0x50,0x5c,0x51,0x43,0x3c,0x24,0xe8,0x02,0x00,0xd2,0x16,0x83,0x3f,0x54,0x30,0xbf,0xfe,0xb3,0x8e,0x2a,0x2b,0x57,0x3c,0x37,0x12,0x0a,0x2b,0x00,0x02,0xff,0x07,0x04,0x96,0x00,0xfa,0x06,0x96,0x00,0x08,0x00,0x14,0x00,0x47,0x40,0x1b,0x00,0x00,0x0d,0x07, +0x0e,0x04,0x03,0x0b,0x08,0x10,0x0e,0x08,0x08,0x0e,0x10,0x03,0x09,0x12,0x09,0x0b,0x10,0x10,0x08,0x0a,0x03,0x04,0x13,0xb8,0x01,0x38,0xb2,0x12,0x0e,0x0a,0xb8,0x01,0x3a,0x00,0x3f,0x33,0x33,0x3f,0xc9,0x32,0x12,0x39,0x39,0x11,0x33,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0xc6,0x32,0x10,0xc4,0xd9,0xc0,0x2f,0x31, +0x30,0x13,0x27,0x26,0x27,0x23,0x06,0x06,0x07,0x17,0x17,0x23,0x27,0x07,0x15,0x23,0x35,0x27,0x07,0x23,0x13,0x33,0x3a,0x26,0x0e,0x04,0x02,0x02,0x08,0x2f,0x3d,0xf6,0x58,0x4c,0x30,0x4b,0x32,0x4e,0x54,0xd6,0x51,0x05,0xa3,0x69,0x22,0x25,0x14,0x23,0x75,0x46,0xcb,0xc6,0x3b,0x8b,0x8b,0x3c,0xc7,0x02,0x00,0x00,0x00,0x02,0xfe,0xee, +0x04,0x96,0x01,0x12,0x06,0x96,0x00,0x12,0x00,0x17,0x00,0x51,0x40,0x20,0x12,0x12,0x0e,0x13,0x03,0x04,0x0f,0x16,0x0c,0x04,0x16,0x16,0x04,0x0c,0x03,0x0d,0x13,0x14,0x09,0x0d,0x0f,0x0c,0x02,0x05,0x16,0x0c,0x16,0x0c,0x16,0x00,0x14,0x0d,0xb8,0x01,0x38,0xb2,0x09,0x04,0x00,0xb8,0x01,0x3a,0x00,0x3f,0x32,0x32,0x3f,0xc9,0x12,0x39, +0x39,0x2f,0x2f,0x10,0xc9,0x32,0x11,0x33,0x01,0x2f,0xc6,0xc9,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x26,0x27,0x15,0x23,0x35,0x06,0x06,0x07,0x23,0x36,0x36,0x37,0x27,0x21,0x07,0x16,0x16,0x17,0x03,0x23,0x17,0x17,0x37,0xbb,0x12,0x80,0x4e,0x44,0x47,0x0b,0x57,0x15,0x5c,0x57, +0x9f,0x01,0xda,0xa4,0x53,0x5b,0x17,0xa8,0xc9,0x5b,0x07,0x04,0x04,0x96,0xb3,0x26,0xd9,0xda,0x15,0x68,0x5d,0x7e,0x7c,0x1b,0xeb,0xec,0x1b,0x7a,0x7f,0x01,0xbc,0x91,0x0f,0x08,0x00,0x02,0xfe,0xb2,0x04,0x96,0x01,0x4f,0x06,0x96,0x00,0x17,0x00,0x1c,0x00,0x69,0x40,0x2d,0x17,0x17,0x13,0x18,0x19,0x12,0x03,0x04,0x14,0x1b,0x12,0x0a, +0x11,0x04,0x1b,0x1b,0x04,0x11,0x0a,0x12,0x05,0x0d,0x18,0x10,0x0c,0x08,0x08,0x0c,0x0d,0x02,0x05,0x1b,0x0b,0x10,0x14,0x1b,0x10,0x10,0x1b,0x14,0x03,0x00,0x19,0x0e,0x12,0xb8,0x01,0x38,0xb3,0x0d,0x08,0x04,0x00,0xb8,0x01,0x3a,0x00,0x3f,0x32,0x32,0x32,0x3f,0xc4,0xc9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x32,0x01, +0x2f,0xd9,0xc2,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x26,0x27,0x15,0x23,0x35,0x06,0x07,0x23,0x36,0x37,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x27,0x21,0x07,0x16,0x16,0x17,0x03,0x23,0x17,0x17,0x37,0xf8,0x11,0x82,0x4e,0x86,0x0f,0x57,0x1e, +0x72,0xb7,0x52,0x52,0xdf,0x8f,0x01,0xda,0xa4,0x54,0x5a,0x17,0xa8,0xc9,0x5a,0x07,0x09,0x04,0x96,0xb0,0x29,0xd9,0xda,0x29,0xb1,0xb7,0x35,0xec,0x02,0x00,0xd4,0xd4,0xec,0x1c,0x76,0x82,0x01,0xbc,0x91,0x0f,0x0f,0x00,0x00,0x01,0x00,0x21,0xfe,0x99,0x04,0x7b,0x05,0x9a,0x00,0x25,0x00,0x3f,0x40,0x21,0x06,0x1a,0x0a,0x0a,0x1a,0x06, +0x03,0x00,0x03,0x09,0x0e,0x7f,0x05,0x00,0x09,0x06,0x91,0x07,0x03,0x1d,0x92,0x16,0x16,0x03,0x23,0x92,0x1a,0x11,0x04,0x0a,0x91,0x03,0x12,0x00,0x3f,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xc4,0xfd,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x31,0x30,0x05,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21, +0x15,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x03,0xe8,0xa4,0xfc,0xdd,0x03,0x41,0xfd,0x02,0x04,0x00,0xfc,0xb8,0x02,0x2a,0x94,0xa1,0x8b,0x73,0x45,0x8b,0x50,0x5d,0x4e,0x40,0x41,0x8c,0x87,0x78,0x4a,0x79,0x3f,0x30,0x64,0x32, +0x37,0x45,0x79,0x79,0x2f,0x04,0xd3,0x98,0x28,0xfb,0x26,0x87,0x7f,0x6f,0x8a,0x2e,0x24,0x29,0x43,0x33,0x73,0x85,0x29,0x19,0x13,0x26,0x3e,0x00,0x00,0x01,0x00,0x21,0xfe,0xa9,0x03,0x9e,0x04,0x00,0x00,0x22,0x00,0x40,0x40,0x22,0x18,0x06,0x0a,0x05,0x05,0x0a,0x06,0x18,0x04,0x00,0x03,0x09,0x0d,0xed,0x00,0x09,0x06,0x95,0x07,0x0f, +0x1b,0x96,0x14,0x14,0x03,0x20,0x96,0x18,0x10,0x04,0x0a,0x95,0x03,0x15,0x00,0x3f,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x05,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22, +0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x33,0x32,0x36,0x03,0x11,0x99,0xfd,0xa9,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x01,0x7b,0x01,0x11,0x7a,0x67,0x65,0x9b,0x52,0x46,0x39,0x39,0x81,0x78,0x6e,0x44,0x82,0x4b,0x50,0x2e,0x36,0x34,0x72,0x72,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0xf5,0x6a,0x84,0x4c,0x28,0x40,0x30, +0x6f,0x7e,0x2c,0x22,0x26,0x3e,0x00,0x01,0x00,0x21,0xfe,0x99,0x04,0x7b,0x05,0x9a,0x00,0x2d,0x00,0x5a,0x40,0x30,0x2d,0x1b,0x03,0x1b,0x0b,0x2c,0x07,0x07,0x2c,0x0b,0x1b,0x03,0x05,0x27,0x2a,0x09,0x06,0x0f,0x7f,0x02,0x27,0x1e,0x92,0x17,0x17,0x2a,0x24,0x92,0x1b,0x12,0x2b,0x0b,0x91,0x2a,0x0a,0x2d,0x92,0x07,0x00,0x00,0x04,0x2a, +0x12,0x06,0x03,0x91,0x04,0x03,0x00,0x3f,0xed,0x39,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xfd,0xc4,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x31,0x30,0x13,0x21,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x21,0x01,0x21,0x32,0x16,0x15,0x14,0x06, +0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x21,0x35,0x01,0x21,0xa2,0x01,0x85,0x01,0x3b,0xfd,0x02,0x04,0x00,0xfe,0x78,0x01,0x38,0xfe,0x72,0xfe,0x96,0x02,0x2a,0xa2,0x93,0x8b,0x72,0x42,0x7d,0x61,0x61,0x4a,0x40,0x42,0x8c,0x87,0x79,0x5c,0x69,0x3e, +0x30,0x63,0x32,0x37,0x44,0xa4,0xfc,0xdd,0x01,0xae,0xfe,0xd3,0x03,0x2e,0x01,0xd4,0x98,0x28,0xfd,0xbc,0x80,0xfd,0xea,0x7e,0x88,0x6f,0x8a,0x27,0x2b,0x29,0x43,0x33,0x73,0x85,0x2a,0x18,0x13,0x26,0x3e,0x2e,0x79,0x2f,0x02,0x7f,0x00,0x01,0x00,0x21,0xfe,0xa9,0x03,0x9e,0x04,0x00,0x00,0x2c,0x00,0x5a,0x40,0x31,0x1b,0x03,0x2c,0x0b, +0x2b,0x07,0x02,0x02,0x07,0x2b,0x0b,0x2c,0x03,0x1b,0x07,0x26,0x29,0x09,0x06,0x0f,0xed,0x26,0x1e,0x96,0x17,0x17,0x29,0x23,0x96,0x1b,0x12,0x2a,0x0b,0x95,0x29,0x0a,0x2c,0x96,0x07,0x00,0x00,0x04,0x29,0x15,0x06,0x03,0x95,0x04,0x0f,0x00,0x3f,0xed,0x39,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xd4,0x32,0xed,0x12,0x39, +0x2f,0xed,0x01,0x2f,0xfd,0xc4,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x13,0x21,0x13,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x21,0x03,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x21,0x35,0x01, +0x23,0x7d,0x01,0x31,0xd1,0xfd,0xdb,0x03,0x16,0xfe,0xec,0x01,0x04,0xfe,0xa4,0xf2,0x01,0x7f,0x80,0x8d,0x7c,0x6b,0x40,0x97,0x2f,0x4c,0x45,0x36,0x37,0x81,0x76,0x6a,0x41,0x7d,0x4f,0x54,0x2f,0x39,0x36,0x76,0xfd,0x86,0x01,0x33,0xd7,0x02,0x54,0x01,0x20,0x8c,0x2f,0xfe,0x83,0x7a,0xfe,0xb2,0x7f,0x76,0x69,0x85,0x33,0x19,0x28,0x40, +0x30,0x70,0x7d,0x2b,0x23,0x26,0x3e,0x2a,0x72,0x33,0x01,0xa7,0x00,0x01,0x00,0x77,0xff,0xe8,0x03,0xdc,0x05,0xb2,0x00,0x27,0x00,0x29,0x40,0x16,0x00,0x1a,0x7d,0x0d,0x22,0x7d,0x13,0x06,0x13,0x0d,0x22,0x27,0x04,0x03,0x10,0x91,0x17,0x04,0x24,0x91,0x03,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xc4,0xed,0x2f,0xfd, +0xc4,0x31,0x30,0x25,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x14,0x21,0x32,0x36,0x37,0x03,0xdc,0x3f,0xcb,0x5d,0xf1,0xfe,0xf3,0xae,0xce,0x8f,0x74,0x34,0x9b,0x96,0x5e,0x8e,0x5a,0x4f,0x88,0x5e,0xef,0x01, +0x03,0x43,0x92,0x8f,0x9d,0x7a,0x38,0x01,0x34,0x63,0xe0,0x3e,0x3a,0x26,0x2c,0xb6,0xa9,0x91,0xd8,0x66,0x48,0x55,0x5d,0x44,0x5a,0x6c,0x24,0x34,0xbd,0x1e,0x15,0xbd,0xad,0x5d,0x8e,0x7a,0x49,0x50,0x5e,0x65,0x44,0xc4,0x4a,0x37,0x00,0x01,0x00,0x70,0xff,0xe8,0x03,0x17,0x04,0x18,0x00,0x22,0x00,0x29,0x40,0x16,0x00,0x16,0x83,0x0b, +0x1d,0x83,0x10,0x05,0x10,0x0b,0x1d,0x22,0x04,0x02,0x0e,0x95,0x13,0x10,0x1f,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xc4,0xed,0x2f,0xfd,0xc4,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x0e,0x02,0x15, +0x14,0x33,0x32,0x36,0x37,0x03,0x17,0x70,0xa2,0xc6,0xcf,0x87,0x9e,0x82,0x56,0x6a,0x60,0x91,0x73,0x68,0x86,0xb5,0xd3,0x75,0x9e,0x6c,0x53,0x2b,0xd8,0x52,0x99,0x3c,0x25,0x3d,0x88,0x85,0x71,0x9c,0x3e,0x34,0x55,0x3c,0x40,0x49,0x4a,0xa6,0x2e,0x91,0x7e,0x72,0x91,0x40,0x2c,0x36,0x41,0x2b,0x86,0x35,0x2e,0x00,0x00,0x01,0x00,0xbc, +0xff,0xf0,0x02,0xc8,0x05,0x9a,0x00,0x11,0x00,0x1f,0x40,0x0f,0x09,0x7e,0x06,0x00,0x7f,0x0f,0x10,0x10,0x03,0x07,0x03,0x0c,0x91,0x03,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x02,0xc8,0x8b,0x79,0x7d, +0x8b,0xa8,0x3c,0x2d,0x2c,0x37,0x98,0xfa,0x7d,0x8d,0x9a,0x93,0x04,0x7d,0xfb,0x82,0x54,0x45,0x3b,0x3d,0x2b,0x00,0x00,0x01,0x00,0xa6,0xff,0xf0,0x02,0xa5,0x04,0x00,0x00,0x11,0x00,0x22,0xb3,0x09,0x84,0x06,0x00,0xb8,0x01,0x2e,0x40,0x0a,0x0f,0x10,0x10,0x03,0x07,0x0f,0x0c,0xec,0x03,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x01, +0x2f,0xed,0x2f,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x02,0xa5,0x85,0x78,0x7b,0x87,0xa3,0x38,0x31,0x2a,0x34,0x95,0xf1,0x76,0x8b,0x98,0x8b,0x02,0xed,0xfd,0x12,0x4a,0x48,0x38,0x3b,0x28,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x19,0x00,0x4d, +0x40,0x29,0x12,0x16,0x7e,0x0f,0x0b,0x0b,0x07,0x00,0x0d,0x06,0x7e,0x07,0x14,0x19,0x7e,0x00,0x16,0x03,0x91,0x0b,0x15,0x0d,0x92,0x0e,0x12,0x0e,0x00,0x0b,0x10,0x0b,0x02,0x0b,0x0e,0x0b,0x0e,0x07,0x10,0x03,0x00,0x07,0x12,0x00,0x3f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x33,0x01,0x2f,0xfd, +0xc4,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x12,0x37,0x35,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x15,0x04,0x11,0x11,0x04,0x2d,0xfe,0x99,0xfe,0x8c,0xa8,0xe0,0xe2,0xfe,0xba,0x01,0x46,0xa8,0x01,0x46,0xfe,0xba,0x01,0xc1,0x01,0x7c,0x01,0xaa,0xfe, +0x47,0xfe,0x93,0x01,0x78,0x01,0x08,0x01,0x28,0x11,0x99,0x8a,0xbe,0xbe,0x8a,0x9b,0x2e,0xfd,0xd8,0xfe,0x9f,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xe4,0x04,0x00,0x00,0x19,0x00,0x47,0x40,0x24,0x14,0x19,0x0d,0x07,0x12,0x16,0x84,0x0f,0x0b,0x0b,0x00,0x07,0x84,0x08,0x19,0x84,0x00,0x15,0x0d,0x96,0x12,0x0e,0x0e,0x08,0x10,0x03, +0x96,0x16,0x0b,0x0b,0x08,0x10,0x0f,0x00,0x08,0x15,0x00,0x3f,0x33,0x3f,0x12,0x39,0x2f,0x33,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xc4,0x10,0xc4,0x31,0x30,0x21,0x35,0x10,0x21,0x22,0x06,0x15,0x15,0x23,0x35,0x10,0x25,0x35,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15, +0x21,0x15,0x04,0x11,0x15,0x03,0x40,0xfe,0xf5,0x8b,0x89,0xa4,0x01,0x62,0xfe,0xf5,0x01,0x0b,0xa4,0x01,0x0b,0xfe,0xf5,0x01,0x61,0x6b,0x01,0x3c,0xa1,0xa7,0x5f,0x58,0x01,0xac,0x28,0x96,0x86,0xb8,0xb8,0x86,0x97,0x2c,0xfe,0x54,0x53,0x00,0x00,0x02,0x00,0x48,0xff,0xe7,0x05,0x73,0x05,0x9a,0x00,0x16,0x00,0x35,0x00,0x55,0x40,0x18, +0x2b,0x1d,0x7e,0x07,0x10,0x23,0x28,0x23,0x28,0x23,0x04,0x17,0x0f,0x13,0x7d,0x17,0x2e,0x7d,0x08,0x04,0x20,0x25,0x1a,0x2b,0xb8,0x01,0x05,0x40,0x10,0x07,0x10,0x0c,0x07,0x25,0x07,0x25,0x07,0x00,0x0e,0x08,0x03,0x32,0x92,0x00,0x13,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x01, +0x2f,0xc4,0xed,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xc4,0xfd,0xcd,0x31,0x30,0x05,0x22,0x24,0x26,0x35,0x34,0x36,0x37,0x01,0x33,0x01,0x17,0x33,0x37,0x01,0x33,0x01,0x16,0x16,0x15,0x14,0x06,0x04,0x01,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x06, +0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x02,0xe9,0xca,0xfe,0xcb,0xa2,0xfe,0xed,0xfe,0x69,0xdc,0x01,0x34,0x36,0x06,0x31,0x01,0x2b,0xca,0xfe,0x88,0xe1,0xfc,0xa4,0xfe,0xd6,0x01,0x1c,0xd1,0xb0,0x46,0x36,0x2a,0x33,0x38,0x43,0x4f,0x4e,0x69,0x7a,0x32,0x39,0xb2,0xdb,0x73,0xf1,0x92,0x8f,0xd8,0x6a,0x19,0x6e,0xc8,0x86,0xad, +0xe5,0x26,0x02,0x3f,0xfe,0x20,0x5e,0x56,0x01,0xe8,0xfd,0xc3,0x26,0xdc,0xa4,0x8d,0xd3,0x70,0x01,0xca,0x88,0xa3,0x0c,0x60,0x71,0x2b,0x21,0x2f,0x1f,0x89,0x1d,0x64,0x59,0x48,0x7f,0x4e,0x14,0xa6,0x82,0x61,0x8f,0x54,0x52,0x95,0x00,0x02,0x00,0x19,0xff,0xe7,0x03,0xb6,0x05,0xed,0x00,0x14,0x00,0x20,0x00,0x3b,0x40,0x1e,0x0e,0x1e, +0x09,0x15,0x84,0x07,0x12,0x00,0x84,0x1b,0x07,0x1b,0x07,0x1b,0x0a,0x11,0x0a,0x0e,0x12,0x1e,0x03,0x0a,0x0a,0x04,0x10,0x00,0x18,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0xc5,0x10,0xfd,0xc5,0xc6,0x32,0x31,0x30,0x25,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34, +0x13,0x01,0x33,0x13,0x16,0x17,0x37,0x01,0x33,0x01,0x16,0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x02,0xa2,0x3c,0x6e,0x45,0x71,0x87,0x8d,0xfe,0xd1,0xbe,0x92,0x20,0x1c,0x13,0x01,0x46,0xb8,0xfe,0x4e,0x4f,0x4f,0xfe,0xba,0x2c,0x27,0x26,0x2c,0x32,0x27,0x28,0x24,0xc6,0x3b,0x68,0x3c,0x7e,0x67,0x79,0x01, +0x07,0x02,0x40,0xfe,0xd5,0x42,0x45,0x2d,0x02,0xe6,0xfc,0x62,0x87,0xb5,0x43,0x2b,0x32,0x32,0x2b,0x23,0x85,0x47,0x59,0x6e,0x00,0x01,0x00,0x5e,0xff,0xe8,0x08,0xaa,0x05,0xb2,0x00,0x32,0x00,0x49,0x40,0x28,0x1e,0x02,0x1e,0x02,0x17,0x09,0x7d,0x30,0x24,0x7d,0x17,0x00,0x21,0x91,0x1b,0x10,0xee,0x02,0x1e,0x1e,0x1b,0x0f,0x2a,0x1f, +0x2a,0x2f,0x2a,0x03,0x2a,0x2a,0x13,0x05,0x1b,0x04,0x2d,0x27,0x91,0x0d,0x13,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x12,0x39,0x11,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x22,0x07,0x35,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x26,0x27, +0x06,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x36,0x37,0x16,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x06,0x14,0xa8,0x66,0x71,0x9b,0xc5,0x01,0x2e,0xa5,0xa4,0xfe,0xd0,0xc6,0x5e,0xd2,0x5b,0x5a,0xd6,0x5d,0xc5,0xfe,0xcf,0xa4,0xa2,0x01,0x2e,0xc8,0xa1,0x6b, +0x2e,0x8f,0x51,0xdc,0xfe,0xf6,0x01,0x0c,0xf2,0x6f,0xc9,0x3f,0x42,0xc2,0x75,0xef,0x01,0x0f,0xfe,0xf8,0x05,0x1a,0x45,0xb2,0x2b,0xb9,0xfe,0xaa,0xdf,0xd9,0xfe,0xb3,0xb6,0x2c,0x2a,0x29,0x2d,0xb6,0x01,0x4c,0xd8,0xda,0x01,0x57,0xbf,0x2b,0xb2,0x20,0x25,0xfe,0xbc,0xfe,0xf0,0xfe,0xee,0xfe,0xcb,0x35,0x2b,0x2b,0x35,0x01,0x31,0x01, +0x16,0x01,0x11,0x01,0x43,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x06,0xc6,0x04,0x18,0x00,0x2b,0x00,0x47,0x40,0x26,0x0c,0x20,0x0c,0x20,0x06,0x27,0x83,0x1b,0x11,0x83,0x06,0x1e,0x0e,0xec,0x09,0x00,0xec,0x20,0x0c,0x0c,0x09,0x16,0x40,0x09,0x0c,0x48,0x16,0x16,0x02,0x23,0x09,0x10,0x18,0x14,0x95,0x2a,0x02,0x16,0x00,0x3f,0x33,0xed, +0x32,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x12,0x39,0x11,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32, +0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x03,0x96,0x93,0xaf,0x98,0xe4,0x78,0x01,0x0a,0xdc,0x80,0x67,0x69,0x82,0x93,0xa7,0xc1,0xa7,0xa5,0x7f,0x80,0xa2,0xa9,0xbf,0xa5,0x93,0x83,0x69,0x6a,0x7e,0x90,0xdd,0x77,0xfe,0xf3,0xe6,0xae,0x42,0x5a,0x84,0xf3,0x9b,0xf6,0x01,0x28,0x30,0xaa,0x49,0xd2,0xb9,0xb9,0xcf,0x63,0x63,0xd0,0xb8,0xb8, +0xd3,0x49,0xaa,0x30,0x87,0xf7,0xa0,0xef,0xfe,0xdd,0x00,0x02,0xff,0xf3,0x00,0x00,0x04,0x5a,0x05,0xb2,0x00,0x14,0x00,0x1d,0x00,0x2d,0x40,0x17,0x00,0x1a,0x7e,0x08,0x08,0x0e,0x04,0x7d,0x15,0x0e,0x19,0x91,0x00,0x00,0x08,0x0c,0x92,0x11,0x04,0x1a,0x91,0x08,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed, +0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x01,0x86,0x01,0x1d,0xcb,0xec,0xf5,0xda,0xfe,0x53,0x4a,0x51,0x26,0x2a,0x2f,0x3e,0x8e,0x98,0x02,0x23,0xa1,0x9d,0xe5,0xe7,0x9a,0xa2,0x03, +0x3a,0xd0,0xbe,0xc5,0xe7,0x04,0x05,0x9f,0x83,0x15,0x8e,0x12,0xce,0xbf,0xfd,0x7d,0x86,0x7a,0xfd,0xf6,0x8c,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x04,0x19,0x04,0x18,0x00,0x06,0x00,0x1b,0x00,0x2d,0x40,0x17,0x13,0x04,0x84,0x1b,0x1b,0x00,0x0c,0x17,0x83,0x00,0x03,0x95,0x13,0x13,0x0f,0x04,0x95,0x1b,0x15,0x0a,0x95,0x0f,0x10,0x00, +0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x34,0x23,0x23,0x11,0x33,0x32,0x01,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x03,0x71,0xce,0xf4,0xf6,0xcc,0xfd,0x9a,0x3b,0x4a,0x30,0x24,0x39,0x37,0x83,0x8a,0x01, +0x14,0x9b,0xbb,0xb5,0x91,0xfe,0x38,0x01,0x40,0xaa,0xfe,0xa2,0x02,0x5b,0x50,0x57,0x0f,0x88,0x11,0x99,0x91,0x77,0xa5,0x92,0x92,0xae,0x00,0x03,0x00,0x33,0x00,0x00,0x06,0xa2,0x05,0x9a,0x00,0x03,0x00,0x10,0x00,0x18,0x00,0x40,0x40,0x22,0x0d,0x15,0x7e,0x08,0x04,0x7d,0x11,0x08,0x11,0x08,0x11,0x00,0x0a,0x03,0x7e,0x00,0x14,0x91, +0x0d,0x0d,0x08,0x0b,0x01,0x03,0x00,0x12,0x0a,0x91,0x0b,0x03,0x15,0x91,0x08,0x12,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x11,0x33,0x11,0x01,0x14,0x06,0x23,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x07,0x10,0x21, +0x23,0x11,0x33,0x32,0x36,0x05,0xfa,0xa8,0xfe,0xb1,0xf5,0xda,0xfe,0x53,0xfe,0x5c,0x02,0x4c,0x01,0x1e,0xcb,0xeb,0xb1,0xfe,0xc3,0xe6,0xe7,0x97,0xa5,0x05,0x9a,0xfa,0x66,0x01,0xac,0xc4,0xe8,0x05,0x02,0x98,0xfd,0xa0,0xd3,0xc5,0x01,0x00,0xfd,0xf6,0x89,0x00,0x00,0x03,0x00,0x1c,0x00,0x00,0x05,0xae,0x04,0x00,0x00,0x03,0x00,0x10, +0x00,0x18,0x00,0x40,0x40,0x22,0x0d,0x16,0x84,0x08,0x04,0x83,0x11,0x08,0x11,0x08,0x11,0x00,0x0a,0x03,0x84,0x00,0x15,0x95,0x0d,0x0d,0x08,0x0b,0x01,0x0f,0x00,0x15,0x0a,0x95,0x0b,0x0f,0x16,0x95,0x08,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10, +0xed,0x32,0x31,0x30,0x21,0x11,0x33,0x11,0x01,0x14,0x06,0x23,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x05,0x0c,0xa2,0xfe,0xae,0xb6,0x92,0xfe,0x3a,0xfe,0xce,0x01,0xd6,0x01,0x14,0xa0,0xb6,0xa8,0x67,0x6c,0xef,0xef,0xd3,0x04,0x00,0xfc,0x00,0x01,0x40,0x93,0xad,0x03,0x73,0x8d,0xfe, +0x77,0xa6,0x93,0x57,0x55,0xfe,0xa2,0x00,0x00,0x02,0x00,0xbb,0x00,0x00,0x06,0x5d,0x05,0x9a,0x00,0x16,0x00,0x1f,0x00,0x4b,0x40,0x27,0x07,0x0b,0x1c,0x7e,0x04,0x13,0x09,0x13,0x09,0x17,0x03,0x16,0x7e,0x00,0x0f,0x7d,0x17,0x0a,0x15,0x91,0x07,0x03,0x03,0x13,0x01,0x1b,0x91,0x0b,0x0b,0x13,0x05,0x01,0x03,0x00,0x12,0x1c,0x91,0x13, +0x12,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x32,0x31,0x30,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x11,0x01,0x34,0x26,0x23,0x23,0x11, +0x33,0x32,0x36,0xbb,0xa8,0x01,0x7e,0xa8,0x01,0x67,0xfe,0x99,0x01,0x1a,0xce,0xec,0xfb,0xd7,0xfe,0x56,0xfe,0x82,0x04,0x49,0x9c,0xa5,0xe2,0xe3,0x9c,0xa4,0x05,0x9a,0x95,0x95,0x95,0x98,0xfe,0xcd,0xd2,0xbc,0xc9,0xe3,0x04,0x6d,0xfb,0x93,0x01,0xa2,0x80,0x80,0xfd,0xf6,0x89,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0xaa,0x05,0xec, +0x00,0x16,0x00,0x1e,0x00,0x4b,0x40,0x27,0x09,0x17,0x07,0x0b,0x1c,0x84,0x04,0x13,0x13,0x17,0x03,0x16,0x84,0x00,0x0f,0x83,0x17,0x0a,0x15,0x95,0x07,0x03,0x03,0x13,0x01,0x1b,0x95,0x0b,0x0b,0x13,0x05,0x01,0x00,0x00,0x15,0x1c,0x95,0x13,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32, +0x01,0x2f,0xed,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x32,0x10,0xc4,0x31,0x30,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x11,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0xa6,0xa4,0x01,0x52,0xa4,0x01,0x1e,0xfe,0xe2,0x01,0x14,0xa2,0xb4,0xb6,0x91,0xfe, +0x39,0xfe,0xae,0x03,0xb8,0x63,0x70,0xef,0xef,0xd3,0x05,0xec,0xc3,0xc3,0xc3,0x8d,0xfd,0xdb,0xa7,0x90,0x91,0xaf,0x04,0x9c,0xfb,0x64,0x01,0x3e,0x55,0x57,0xfe,0xa2,0x00,0x02,0x00,0x60,0xff,0xe8,0x07,0x6a,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x36,0x40,0x1d,0x07,0x7e,0x1c,0x1c,0x0c,0x16,0x7d,0x00,0x0b,0x7e,0x08,0x0c,0x0e,0x91, +0x07,0x07,0x0c,0x09,0x03,0x0c,0x12,0x1f,0x91,0x04,0x04,0x19,0x91,0x12,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x34,0x12,0x24,0x33,0x20,0x00,0x13,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x37,0x10,0x12,0x33, +0x32,0x12,0x11,0x10,0x00,0x23,0x22,0x02,0x60,0x9a,0x01,0x21,0xbf,0x01,0x1b,0x01,0x5b,0x1f,0x01,0x53,0xa8,0xa8,0xfe,0xb2,0xa5,0xfe,0xdb,0xb7,0xcd,0xfe,0xd7,0x9d,0xb0,0xfe,0xe5,0xdf,0xf2,0xfe,0xfd,0xe1,0xe0,0xf0,0x02,0xdf,0xd7,0x01,0x49,0xb3,0xfe,0xae,0xfe,0xd5,0x02,0x65,0xfa,0x66,0x02,0x9e,0xc6,0xfe,0xbb,0xab,0xb7,0x01, +0x59,0xd0,0xfe,0xe9,0xfe,0xce,0x01,0x3b,0x01,0x17,0x01,0x13,0x01,0x36,0xfe,0xcd,0x00,0x02,0x00,0x63,0xff,0xe8,0x05,0xdb,0x04,0x18,0x00,0x13,0x00,0x1b,0x00,0x38,0x40,0x1e,0x06,0x0d,0x84,0x18,0x18,0x0b,0x14,0x83,0x00,0x0a,0x84,0x07,0x0b,0x0d,0x95,0x06,0x06,0x0b,0x08,0x0f,0x0b,0x15,0x1a,0x95,0x03,0x10,0x16,0x95,0x11,0x16, +0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x0e,0x02,0x23,0x22,0x00,0x37,0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x63,0xf0,0xdc,0xca,0xff,0x1b,0x01,0x24,0xa4,0xa4,0xfe,0xde,0x05, +0x6f,0xcb,0x8f,0xe2,0xfe,0xfe,0xa7,0x01,0x2f,0x01,0x36,0xfe,0xce,0xfe,0xcd,0x02,0x04,0xff,0x01,0x15,0xe9,0xd3,0x01,0xa4,0xfc,0x00,0x01,0xd1,0x94,0xde,0x77,0x01,0x24,0xf2,0xfe,0x74,0x01,0x8c,0x01,0x90,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x50,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x48,0xb9,0x00,0x14,0x01,0x04,0x40,0x22,0x05, +0x04,0x05,0x15,0x15,0x05,0x04,0x03,0x08,0x0f,0x0b,0x07,0x7e,0x08,0x02,0x91,0x14,0x06,0x91,0x0b,0x14,0x0b,0x14,0x0b,0x08,0x11,0x0d,0x03,0x09,0x03,0x04,0x00,0x08,0x12,0x00,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x31,0x30, +0x21,0x03,0x21,0x03,0x23,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x01,0x23,0x06,0x07,0x03,0x21,0x03,0x26,0x06,0x96,0x98,0xfd,0xa0,0x8f,0xbb,0xfb,0xfe,0x15,0xa8,0xa8,0x02,0x25,0xf1,0xae,0x02,0x28,0xfd,0x80,0x04,0x09,0x0e,0xdf,0x01,0xf1,0xe1,0x0b,0x01,0x92,0xfe,0x6e,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b, +0x02,0x75,0xfa,0x66,0x04,0xec,0x37,0x29,0xfd,0x9d,0x02,0x63,0x1f,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x05,0xa1,0x04,0x18,0x00,0x1c,0x00,0x27,0x00,0x5d,0x40,0x31,0x0f,0x0b,0x84,0x0c,0x16,0x1d,0x83,0x09,0x07,0x07,0x00,0x0c,0x23,0x1c,0x84,0x11,0x00,0x13,0x95,0x19,0x10,0x01,0x02,0x0a,0x95,0x0f,0x24,0x96,0x11,0x02,0x0c,0x0f, +0x16,0x11,0x0d,0x0f,0x11,0x0f,0x11,0x0c,0x0d,0x0f,0x00,0x0c,0x15,0x20,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x3f,0xed,0x01,0x2f,0x33,0xed,0x33,0x2f,0x12,0x39,0x2f,0xcd,0xfd,0xc4,0x10,0xed,0x32,0x31,0x30,0x21,0x35,0x23,0x06,0x23, +0x22,0x26,0x35,0x34,0x37,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x25,0x10,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x07,0x06,0x06,0x04,0xfd,0x04,0x67,0xd4,0x97,0xaf,0x38,0xfe,0x9a,0xa4,0xa4,0x02,0x71,0x01,0x42,0xd3,0x60,0xa0,0x4e,0x93,0xc9,0x01,0x69,0xfd,0x7f,0x6b,0x59,0x7a, +0x9f,0xef,0x88,0x66,0xa0,0xb8,0x9f,0x89,0x74,0x4d,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x2d,0x01,0x05,0x3d,0x41,0xa8,0x60,0xfe,0x82,0xfd,0x66,0x01,0x1c,0x4c,0x5e,0xab,0x83,0x66,0x21,0x14,0x56,0x00,0x00,0x03,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x11,0x00,0x2f,0x40,0x18,0x07,0x0d,0x0e,0x04,0x04,0x0e, +0x0d,0x07,0x04,0x00,0x03,0x00,0x06,0x92,0x0d,0x0d,0x00,0x09,0x01,0x03,0x07,0x92,0x00,0x12,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x33,0x01,0x33,0x01,0x27,0x03,0x21,0x03,0x01,0x23,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x16,0x02,0x26,0xae,0x02,0x28,0xf1, +0xae,0xfe,0x3a,0xa8,0x01,0x8d,0x04,0x08,0x08,0x08,0x97,0x01,0x62,0x99,0x08,0x06,0x05,0x9a,0xfa,0x66,0x91,0x01,0xd2,0xfe,0x2e,0x04,0x5b,0x23,0x2b,0x14,0xfe,0x62,0x01,0xa0,0x17,0x2c,0x00,0x03,0x00,0x0a,0x00,0x00,0x03,0xc7,0x04,0x00,0x00,0x03,0x00,0x07,0x00,0x0f,0x00,0x2f,0x40,0x18,0x04,0x0b,0x0c,0x05,0x05,0x0c,0x0b,0x04, +0x04,0x00,0x01,0x00,0x07,0x96,0x0b,0x0b,0x01,0x08,0x02,0x0f,0x04,0x96,0x01,0x15,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x21,0x21,0x01,0x33,0x01,0x21,0x03,0x21,0x13,0x06,0x07,0x07,0x33,0x27,0x26,0x27,0x03,0xc7,0xfc,0x43,0x01,0x98,0xa1,0xfe,0xa0,0x02,0x05, +0x71,0xfe,0xe3,0x8c,0x05,0x1a,0x43,0xcb,0x40,0x14,0x10,0x04,0x00,0xfc,0x7b,0x01,0x44,0x01,0xb8,0x44,0x47,0xb9,0xb5,0x34,0x5b,0x00,0x00,0x04,0x00,0x29,0x00,0x00,0x05,0xaa,0x05,0x9a,0x00,0x14,0x00,0x1b,0x00,0x1f,0x00,0x24,0x00,0x69,0x40,0x38,0x16,0x14,0x1c,0x0b,0x7e,0x0c,0x24,0x0c,0x15,0x02,0x7e,0x19,0x00,0x23,0x14,0x0c, +0x19,0x1d,0x01,0x01,0x1d,0x19,0x0c,0x14,0x23,0x00,0x07,0x06,0x11,0x06,0x0a,0x0e,0x92,0x23,0x1c,0x23,0x1f,0x20,0x92,0x14,0x19,0x02,0x14,0x23,0x14,0x23,0x14,0x00,0x0c,0x07,0x11,0x12,0x16,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f, +0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xfd,0xcd,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0x31,0x30,0x13,0x21,0x01,0x16,0x16,0x12,0x17,0x23,0x26,0x27,0x21,0x11,0x23,0x11,0x21,0x06,0x07,0x23,0x12,0x00,0x37,0x01,0x21,0x13,0x16,0x17,0x36,0x36,0x13,0x21,0x26,0x27,0x27,0x06,0x06,0x07,0x21,0xa5,0x04,0x9f,0xfe, +0x52,0x9e,0xcb,0x7e,0x2d,0xbf,0x10,0x31,0xfe,0x98,0xa8,0xfe,0x8c,0x2c,0x10,0xc1,0x2f,0x01,0x01,0xe9,0x01,0xe5,0xfd,0x9f,0xf8,0x23,0x11,0x11,0x0e,0x31,0x01,0x25,0x6e,0xb7,0xa8,0x68,0x8b,0x3e,0x01,0x31,0x05,0x9a,0xfd,0x60,0x36,0xb2,0xfe,0xea,0xfc,0xb1,0x6b,0xfe,0xe4,0x01,0x1c,0x6d,0xaf,0x01,0x4a,0x01,0x6c,0x46,0x02,0x06, +0xfe,0x6a,0x37,0x39,0x33,0x1a,0xfe,0x58,0x9c,0x33,0x02,0x1f,0x5b,0x57,0x00,0x04,0x00,0x1e,0x00,0x00,0x04,0x66,0x04,0x00,0x00,0x15,0x00,0x1c,0x00,0x21,0x00,0x26,0x00,0x6d,0x40,0x0c,0x20,0x17,0x0e,0x22,0x04,0xef,0x05,0x21,0x05,0x23,0x16,0x11,0xb8,0x01,0x2e,0x40,0x2a,0x1a,0x0f,0x0e,0x05,0x1a,0x10,0x10,0x1a,0x05,0x0e,0x0f, +0x05,0x0a,0x15,0x0a,0x03,0x07,0x96,0x20,0x22,0x20,0x26,0x1d,0x96,0x0e,0x11,0x1a,0x0e,0x0f,0x20,0x0e,0x20,0x0e,0x0a,0x17,0x95,0x0f,0x0f,0x05,0x00,0x0a,0x15,0x00,0x3f,0x33,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, +0x2f,0x10,0xfd,0xcd,0xcd,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0xcd,0x31,0x30,0x21,0x26,0x27,0x23,0x15,0x23,0x35,0x21,0x06,0x07,0x23,0x3e,0x02,0x37,0x01,0x21,0x01,0x1e,0x02,0x17,0x01,0x21,0x17,0x16,0x17,0x36,0x36,0x07,0x06,0x06,0x07,0x3b,0x02,0x26,0x26,0x27,0x03,0xb8,0x0a,0x21,0xf9,0x9c,0xff,0x00,0x1a,0x11,0xaf,0x24,0x60, +0x98,0x74,0xfe,0xc2,0x03,0xb5,0xfe,0xb8,0x73,0x9b,0x5e,0x1d,0xfe,0xb0,0xfe,0x6f,0x9f,0x1c,0x08,0x03,0x0a,0x5d,0x3a,0x5a,0x2d,0xc1,0x9c,0xb9,0x35,0x4c,0x38,0x74,0x4e,0xc2,0xc2,0x40,0x82,0xbe,0xc9,0x81,0x23,0x01,0xd5,0xfe,0x29,0x24,0x8a,0xcd,0xae,0x03,0x79,0xff,0x2b,0x17,0x08,0x11,0x9d,0x12,0x37,0x35,0x3a,0x30,0x12,0x00, +0x00,0x03,0x00,0xbc,0x00,0x00,0x07,0x50,0x05,0x9a,0x00,0x0b,0x00,0x0f,0x00,0x17,0x00,0x49,0x40,0x27,0x08,0x04,0x7e,0x05,0x14,0x0e,0x7e,0x0f,0x02,0x01,0x02,0x15,0x0c,0x0c,0x15,0x02,0x01,0x04,0x00,0x05,0x00,0x0e,0x03,0x91,0x14,0x08,0x08,0x01,0x11,0x0a,0x03,0x06,0x03,0x05,0x12,0x0f,0x92,0x01,0x12,0x00,0x3f,0xed,0x3f,0x3f, +0x3f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc5,0xfd,0xcd,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x03,0x21,0x03,0x01,0x23,0x06,0x07,0x03,0x21,0x03,0x26,0x07,0x50,0xfb,0x04,0xfb,0xfe,0x15,0xa8,0xa8,0x02,0x25,0xf1,0xae, +0x01,0x37,0xbe,0xfe,0x5a,0xb8,0x01,0x8d,0x04,0x09,0x0e,0x83,0x01,0x38,0x84,0x09,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xf7,0x01,0xfd,0xfe,0x03,0x04,0x5b,0x37,0x29,0xfe,0x99,0x01,0x67,0x1b,0x00,0x00,0x03,0x00,0xa6,0x00,0x00,0x05,0xd0,0x04,0x00,0x00,0x0b,0x00,0x0f,0x00,0x17,0x00,0x4d,0x40,0x2a,0x08,0x04, +0x84,0x05,0x01,0x02,0x0c,0x13,0x14,0x0d,0x0d,0x14,0x13,0x0c,0x02,0x01,0x06,0x00,0x05,0x00,0x0f,0x96,0x13,0x03,0x95,0x08,0x13,0x08,0x13,0x08,0x01,0x10,0x0a,0x0f,0x06,0x0f,0x05,0x15,0x0c,0x96,0x01,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f, +0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x21,0x03,0x21,0x13,0x06,0x07,0x07,0x33,0x26,0x26,0x27,0x05,0xd0,0xfc,0x43,0xba,0xfe,0x7d,0xa4,0xa4,0x01,0xba,0xa7,0xa1,0xfe,0xa0,0x02,0x05,0x71,0xfe,0xe3,0x8c,0x06,0x18,0x44,0xcb,0x2c,0x2c,0x0c,0x01,0xd1,0xfe, +0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfc,0x7b,0x01,0x44,0x01,0xb8,0x47,0x44,0xb9,0x7b,0x7c,0x4d,0x00,0x00,0x01,0x00,0x1e,0xfe,0x29,0x05,0xfe,0x05,0x9a,0x00,0x1a,0x00,0x2f,0x40,0x17,0x1a,0x7e,0x02,0x00,0x00,0x0b,0x14,0x0b,0x19,0x18,0x01,0x02,0x02,0x12,0x15,0x12,0x12,0x03,0x0e,0x91,0x00,0x08,0x13,0x00,0x3f,0xc6,0xed,0x3f, +0x3f,0x12,0x39,0x11,0x33,0x33,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x06,0x07,0x03,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x23,0x01,0x26,0x27,0x23,0x11,0x03,0x4d,0x05,0x0e,0x1a,0xe0,0x2c,0x8c,0x6d,0x6b,0x85,0x0d,0xa1,0x0d,0x51,0x2c,0x3c,0x1f,0x01,0xb4, +0x9a,0x02,0x0c,0xc0,0xfe,0xe4,0x1d,0x0a,0x05,0xfe,0x29,0x05,0xc9,0x60,0x47,0xfd,0xa3,0x89,0x7e,0x7b,0x80,0x64,0x4b,0x51,0x04,0x80,0xfa,0x66,0x03,0x44,0x5c,0x52,0xfa,0x37,0x00,0x01,0x00,0x05,0xfe,0x29,0x04,0xd0,0x04,0x00,0x00,0x1a,0x00,0x30,0x40,0x18,0x1a,0xef,0x02,0x00,0x00,0x0a,0x14,0x0a,0x19,0x18,0x01,0x02,0x02,0x12, +0x15,0x15,0x12,0x0f,0x0e,0x95,0x08,0x16,0x00,0x1b,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x11,0x33,0x33,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x06,0x07,0x03,0x06,0x06,0x23,0x22,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x26,0x27,0x23,0x11,0x02,0xa3,0x05,0x0f,0x12, +0x81,0x2f,0x78,0x5c,0xd5,0x1f,0x9d,0x05,0x29,0x29,0x27,0x39,0x22,0x01,0x2a,0x9d,0x01,0x8e,0xaa,0xbd,0x1a,0x0b,0x05,0xfe,0x29,0x04,0x86,0x54,0x36,0xfe,0xaf,0x85,0x68,0xeb,0x30,0x2d,0x43,0x56,0x02,0xf2,0xfc,0x00,0x02,0x16,0x58,0x41,0xfb,0x7a,0x00,0x01,0x00,0x3e,0xfe,0x7f,0x05,0x34,0x05,0x9a,0x00,0x0b,0x00,0x2a,0x40,0x15, +0x05,0x7e,0x02,0x02,0x06,0x0b,0x7f,0x00,0x09,0x7e,0x06,0x00,0x0a,0x07,0x03,0x03,0x05,0x01,0x91,0x0a,0x12,0x00,0x3f,0xed,0x32,0x3f,0x33,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x3e,0xc0,0xa8,0x02,0xe6,0xa8,0xfb,0xa5,0xfe,0x7f,0x02,0x19, +0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0x66,0xfe,0x7f,0x00,0x01,0x00,0x3e,0xfe,0x8b,0x04,0x27,0x04,0x00,0x00,0x0b,0x00,0x2a,0x40,0x15,0x05,0x84,0x02,0x02,0x06,0x0b,0xed,0x00,0x09,0x84,0x06,0x00,0x0a,0x07,0x03,0x0f,0x05,0x01,0x95,0x0a,0x15,0x00,0x3f,0xed,0x32,0x3f,0x33,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed, +0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x3e,0x97,0xa4,0x02,0x0a,0xa4,0xfc,0xa4,0xfe,0x8b,0x02,0x00,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x00,0xfe,0x8b,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x06,0xc6,0x05,0x9a,0x00,0x0f,0x00,0x15,0x00,0x3d,0x40,0x1f,0x14,0x07,0x01,0x7e,0x15,0x03,0x7f,0x04,0x15,0x04, +0x15,0x04,0x0e,0x07,0x7f,0x08,0x0e,0x04,0x08,0x06,0x00,0x11,0xee,0x0d,0x03,0x01,0x14,0x09,0x91,0x06,0x12,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x10,0xcd,0x32,0x01,0x2f,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31,0x30,0x01,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21, +0x15,0x21,0x21,0x06,0x02,0x07,0x21,0x04,0x87,0xc1,0x9b,0xfb,0xfd,0x9b,0x6f,0x92,0xc8,0x0c,0x04,0xe2,0xfd,0x19,0xfe,0x94,0x0e,0xb9,0x78,0x02,0xab,0x04,0xfe,0xfb,0x9a,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x0d,0x02,0xba,0x01,0x3b,0x9c,0xe5,0xfd,0x66,0xe7,0x00,0x02,0x00,0x12,0xfe,0x8b,0x05,0x20,0x04,0x00,0x00,0x0f, +0x00,0x15,0x00,0x3d,0x40,0x1f,0x14,0x07,0x01,0x84,0x15,0x03,0xed,0x04,0x15,0x04,0x15,0x04,0x0e,0x07,0xed,0x08,0x0e,0x04,0x08,0x06,0x00,0x11,0x95,0x0d,0x0f,0x01,0x14,0x09,0x95,0x06,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x10,0xcd,0x32,0x01,0x2f,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31, +0x30,0x01,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x35,0x21,0x15,0x21,0x23,0x06,0x02,0x07,0x21,0x03,0x8b,0x98,0x8b,0xfd,0x06,0x8c,0x5b,0x7d,0x8d,0x03,0xa9,0xfd,0xc7,0xe3,0x0a,0x79,0x66,0x01,0xcc,0x03,0x74,0xfd,0x17,0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0xb0,0x01,0xc9,0xfc,0x8c,0xc5,0xfe,0x7d,0xa1, +0x00,0x01,0x00,0x10,0xff,0xe9,0x06,0xe3,0x05,0x9a,0x00,0x17,0x00,0x24,0x40,0x12,0x17,0x7e,0x00,0x00,0x0a,0x14,0x0a,0x16,0x02,0xee,0x13,0x03,0x0e,0x91,0x08,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x21,0x07,0x06,0x02,0x02,0x06,0x23,0x22,0x27,0x35,0x16,0x16, +0x33,0x32,0x36,0x12,0x12,0x13,0x21,0x15,0x21,0x11,0x03,0xfc,0xfe,0x71,0x20,0x1e,0x46,0x57,0x8e,0x6b,0x4d,0x3c,0x12,0x47,0x18,0x44,0x4f,0x4b,0x55,0x2e,0x05,0x01,0xfd,0xc1,0x04,0xfe,0xf9,0xe7,0xfe,0x48,0xfe,0xfa,0x77,0x15,0x9e,0x0b,0x12,0x6e,0x01,0x26,0x02,0x1c,0x01,0x6b,0x9c,0xfb,0x02,0x00,0x00,0x01,0x00,0x10,0xff,0xf2, +0x05,0x26,0x04,0x00,0x00,0x11,0x00,0x24,0x40,0x12,0x11,0x84,0x00,0x00,0x07,0x0e,0x07,0x10,0x02,0x95,0x0d,0x0f,0x0a,0x95,0x05,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x13,0x21,0x15,0x21,0x11,0x02,0xee, +0xee,0x28,0xc1,0xaf,0x38,0x20,0x1f,0x2d,0x6d,0x8b,0x23,0x03,0xaf,0xfe,0x6b,0x03,0x74,0xfe,0x21,0xfe,0x5d,0x0e,0x8d,0x12,0x01,0xbf,0x01,0xc6,0x8c,0xfc,0x8c,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x08,0xb1,0x05,0x9a,0x00,0x1f,0x00,0x3f,0x40,0x1f,0x07,0x06,0x03,0x01,0x7e,0x02,0x02,0x14,0x1e,0x10,0x13,0x7e,0x14,0x00,0xee,0x1d, +0x1d,0x15,0x0f,0x07,0x06,0x10,0x19,0x10,0x14,0x15,0x03,0x0c,0x02,0x14,0x12,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x39,0x11,0x33,0x33,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x32,0x2f,0x12,0x39,0x2f,0xed,0x33,0x33,0x33,0x31,0x30,0x01,0x11,0x23,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15, +0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x01,0x21,0x15,0x06,0x72,0xa7,0x02,0x0c,0x04,0x0d,0x10,0x0e,0xfe,0x16,0x52,0xfe,0x17,0x13,0x17,0x05,0x08,0xa2,0xde,0x01,0xb8,0x31,0x11,0x06,0x29,0x1a,0x01,0xc4,0x03,0x10,0x04,0xfe,0xfb,0x02,0x03,0xc2,0x20,0x39,0xbe,0x2e,0x3f,0x1e,0xfb,0xb2,0x04,0x46,0x2d,0x66,0x6a,0xaf, +0xfc,0x40,0x05,0x9a,0xfc,0x18,0x70,0x3c,0x70,0x3c,0x03,0xe8,0x9c,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0x8d,0x04,0x00,0x00,0x17,0x00,0x34,0x40,0x1a,0x17,0x84,0x00,0x00,0x0a,0x14,0x09,0xed,0x0a,0x16,0x95,0x13,0x13,0x0b,0x01,0x08,0x0f,0x08,0x0a,0x0b,0x0f,0x00,0x0a,0x15,0x05,0x15,0x00,0x3f,0x3f,0x33,0x3f,0x12,0x39,0x39, +0x11,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x06,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x21,0x15,0x21,0x11,0x04,0x56,0x10,0x26,0xfe,0xf2,0x93,0xfe,0xf8,0x2d,0x17,0x8d,0xd1,0x01,0x0e,0x3e,0x0a,0x04,0x0f,0x26,0x01,0x18,0x02,0x6f, +0xfe,0x6b,0x03,0x4c,0x2f,0x6a,0xfd,0x4d,0x02,0x90,0x74,0x48,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x9a,0x2f,0x39,0x5d,0x02,0xcf,0x8c,0xfc,0x8c,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x28,0x40,0x14,0x15,0x7d,0x09,0x21,0x1b,0x7d,0x03,0x0f,0x00,0x06,0x06,0x0c,0x18,0x91,0x12,0x04, +0x1e,0x91,0x0c,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01,0x2f,0xc4,0xed,0x2f,0xc6,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x02,0x30,0x41,0x42,0x31, +0x30,0x42,0x41,0x37,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x23,0x01,0x71,0xfe,0x89,0xfe,0xd7,0xe1,0xfe,0xe5,0x01,0x0f,0xe1,0xef,0x01,0x0d,0xfe,0xf5,0x02,0x70,0x3c,0x30,0x2b,0x3e,0x39,0x30,0x2e,0x3e,0xfd,0x78,0x01,0x90,0x01,0x44,0x01,0x5a,0x01,0x9c,0xfe,0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x05,0x32,0xfe,0xbb,0xfe, +0xf6,0xfe,0xfb,0xfe,0xb9,0x01,0x36,0x01,0x13,0x01,0x20,0x01,0x32,0x00,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x24,0x00,0x28,0x40,0x14,0x15,0x83,0x09,0x22,0x1c,0x83,0x03,0x0f,0x00,0x06,0x06,0x0c,0x19,0x95,0x12,0x10,0x1f,0x95,0x0c,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01, +0x2f,0xc4,0xed,0x2f,0xc6,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x12,0x17,0x14,0x06,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x58,0x29,0x38,0x3a,0x27,0x2a,0x37,0x35,0x32,0xe7,0xfe,0xf5,0x01,0x1c,0xee,0xe6,0xfe,0x02, +0x83,0xe1,0x8e,0x9e,0xb8,0xb6,0xa0,0xa0,0xaa,0xac,0x01,0xaa,0x38,0x2a,0x2d,0x32,0x37,0x28,0x27,0x3b,0xfe,0x3e,0x01,0x23,0xe9,0x01,0x04,0x01,0x20,0xfe,0xe6,0xfa,0xaa,0xf1,0x81,0x03,0xa6,0xd7,0xbd,0xb2,0xd6,0xd0,0xbc,0xc2,0xce,0x00,0x00,0x04,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f, +0x00,0x32,0x40,0x19,0x2d,0x27,0x15,0x7d,0x21,0x1b,0x7d,0x09,0x03,0x0f,0x24,0x00,0x00,0x2a,0x06,0x06,0x0c,0x18,0x91,0x12,0x04,0x1e,0x91,0x0c,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xc4,0xc4,0xed,0x2f,0xed,0xc4,0xc6,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x13,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x34,0x2c,0x3d,0x3e,0x2d,0x30,0x3a,0x3c,0x9a,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x23,0x01,0x71,0xfe,0x89,0xfe,0xd7,0xe1,0xfe, +0xe5,0x01,0x0f,0xe1,0xef,0x01,0x0d,0xfe,0xf5,0x1e,0x2c,0x3d,0x3e,0x2d,0x30,0x3a,0x3c,0x02,0x70,0x3c,0x30,0x2e,0x3b,0x3e,0x2b,0x2d,0x3f,0xfd,0x78,0x01,0x90,0x01,0x44,0x01,0x5a,0x01,0x9c,0xfe,0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x05,0x32,0xfe,0xbb,0xfe,0xf6,0xfe,0xfb,0xfe,0xb9,0x01,0x36,0x01,0x13,0x01,0x20,0x01,0x32,0xfd, +0x56,0x3c,0x30,0x2e,0x3b,0x3e,0x2b,0x2d,0x3f,0x00,0x00,0x04,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x32,0x40,0x19,0x2e,0x28,0x15,0x83,0x09,0x22,0x1c,0x83,0x03,0x0f,0x25,0x00,0x00,0x2b,0x06,0x06,0x0c,0x19,0x95,0x12,0x10,0x1f,0x95,0x0c,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39, +0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xc4,0xed,0x2f,0xc4,0xed,0xc4,0xc6,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x12,0x17,0x14,0x06,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14, +0x06,0x01,0xc9,0x28,0x34,0x37,0x25,0x25,0x38,0x37,0x63,0xe7,0xfe,0xf5,0x01,0x1c,0xee,0xe6,0xfe,0x02,0x83,0xe1,0x8e,0x9e,0xb8,0xb6,0xa0,0xa0,0xaa,0xac,0x16,0x28,0x34,0x37,0x25,0x25,0x38,0x37,0x01,0xaf,0x37,0x26,0x2b,0x30,0x31,0x2a,0x28,0x35,0xfe,0x39,0x01,0x23,0xe9,0x01,0x04,0x01,0x20,0xfe,0xe6,0xfa,0xaa,0xf1,0x81,0x03, +0xa6,0xd7,0xbd,0xb2,0xd6,0xd0,0xbc,0xc2,0xce,0xfe,0x21,0x37,0x26,0x2b,0x30,0x31,0x2a,0x28,0x35,0x00,0x00,0x05,0x00,0x5e,0xff,0xe8,0x09,0x58,0x05,0xb2,0x00,0x1d,0x00,0x2b,0x00,0x37,0x00,0x43,0x00,0x4f,0x00,0x3f,0x40,0x20,0x21,0x7d,0x35,0x35,0x0c,0x4d,0x47,0x1a,0x7d,0x28,0x41,0x3b,0x2f,0x7d,0x0c,0x44,0x38,0x38,0x4a,0x3e, +0x3e,0x09,0x1e,0x2c,0x91,0x0f,0x04,0x25,0x32,0x91,0x09,0x13,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xed,0xc4,0xc4,0x2f,0xed,0xc4,0xc6,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x27,0x23,0x06,0x07,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x04,0x17,0x33,0x3e,0x02,0x33, +0x20,0x00,0x11,0x10,0x07,0x06,0x01,0x22,0x02,0x11,0x14,0x12,0x16,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x21,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x35,0x10,0x02,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0xe8,0x7b,0xc7,0x98,0x2f,0x08,0x27, +0x36,0x9e,0xfe,0xe7,0xfe,0xea,0xfe,0xb1,0x01,0x55,0x01,0x26,0xb8,0x01,0x0a,0x3e,0x08,0x24,0x9d,0xd9,0x83,0x01,0x0e,0x01,0x4c,0xaa,0xa8,0xfe,0xed,0xca,0xf6,0x69,0xc2,0x8a,0xcd,0xf3,0x67,0xc5,0xfb,0x52,0xc8,0xf8,0xf4,0xc1,0xdb,0xe5,0xef,0xcd,0x2d,0x3c,0x40,0x2a,0x2b,0x40,0x3d,0x03,0xf6,0x2b,0x3e,0x3f,0x2b,0x2b,0x40,0x3c, +0x18,0x4e,0x9d,0x7b,0x68,0x3d,0xc1,0x01,0x91,0x01,0x44,0x01,0x59,0x01,0x9c,0xbb,0xa6,0x66,0xa8,0x53,0xfe,0x70,0xfe,0xbd,0xfe,0x9f,0xca,0xcc,0x05,0x32,0xfe,0xb7,0xfe,0xfc,0xac,0xfe,0xf5,0x97,0x01,0x2e,0x01,0x1b,0xbb,0x01,0x0a,0x8d,0xfe,0xba,0xfe,0xf7,0xfe,0xf3,0xfe,0xc1,0x01,0x41,0xfe,0x01,0x2f,0x01,0x2d,0xfd,0x56,0x3f, +0x2d,0x30,0x39,0x39,0x30,0x2e,0x3e,0x3b,0x31,0x30,0x39,0x39,0x30,0x2e,0x3e,0x00,0x00,0x05,0x00,0x60,0xff,0xe8,0x06,0xdc,0x04,0x18,0x00,0x1b,0x00,0x28,0x00,0x34,0x00,0x40,0x00,0x4c,0x00,0x4b,0x40,0x28,0x3e,0x83,0x38,0x20,0x83,0x32,0x4a,0x83,0x44,0x38,0x32,0x44,0x44,0x32,0x38,0x03,0x0c,0x19,0x83,0x26,0x2c,0x83,0x0c,0x41, +0x35,0x35,0x47,0x3b,0x3b,0x08,0x1c,0x29,0x95,0x0f,0x10,0x23,0x2f,0x95,0x08,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x00, +0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x12,0x17,0x14,0x02,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x0e, +0x57,0x89,0x6d,0x25,0x04,0x2a,0xbe,0x8c,0x86,0xc6,0x78,0x01,0x08,0xd1,0x84,0xbd,0x29,0x04,0x32,0xc4,0x86,0xca,0xee,0x01,0xfb,0xc9,0x5f,0x86,0x41,0x99,0x8d,0x88,0x94,0x94,0xfc,0x8e,0x85,0xa1,0x9d,0x89,0x84,0x98,0x95,0x8c,0x24,0x34,0x32,0x26,0x23,0x35,0x32,0x02,0xc4,0x25,0x33,0x32,0x26,0x23,0x35,0x32,0x18,0x32,0x66,0x57, +0x71,0x7e,0x7a,0xea,0xa8,0x01,0x0b,0x01,0x19,0x7e,0x70,0x75,0x79,0xfe,0xe2,0xf6,0xf5,0xfe,0xd9,0x03,0xa6,0x6b,0xad,0x78,0xb2,0xda,0xce,0xbe,0xc2,0xce,0xd3,0xc1,0xb5,0xd3,0xc8,0xc9,0xbb,0xd0,0xfe,0x1c,0x38,0x2a,0x2a,0x35,0x33,0x2c,0x29,0x39,0x39,0x29,0x2a,0x35,0x33,0x2c,0x29,0x39,0x00,0x0f,0x00,0x7e,0xff,0xe7,0x05,0xd7, +0x05,0xb3,0x00,0x2a,0x00,0x36,0x00,0x42,0x00,0x4e,0x00,0x5a,0x00,0x66,0x00,0x72,0x00,0x7e,0x00,0x8a,0x00,0x96,0x00,0xa2,0x00,0xae,0x00,0xba,0x00,0xc6,0x00,0xd2,0x01,0x3c,0xb1,0xbe,0x82,0xb8,0x01,0x04,0x40,0x0f,0x0f,0x09,0x07,0x11,0x07,0x58,0x7f,0x52,0x34,0x64,0x7f,0x5e,0x2e,0x5e,0xa6,0xb8,0x01,0x04,0xb4,0xa0,0x16,0x02, +0xca,0x8e,0xb8,0x01,0x04,0x40,0x0d,0x88,0xc4,0x88,0x4c,0x7f,0x46,0x40,0x7c,0x7f,0x76,0x3a,0x76,0xb2,0xb8,0x01,0x04,0xb4,0xac,0x1d,0x26,0x1b,0x28,0xb8,0x01,0x04,0x40,0x1d,0x94,0xd0,0x94,0x70,0x7f,0x6a,0x07,0x52,0x5e,0xa0,0x88,0x46,0x76,0xac,0x94,0x6a,0x6a,0x94,0xac,0x76,0x46,0x88,0xa0,0x5e,0x52,0x07,0x0a,0x0c,0x21,0xbb, +0x01,0x04,0x00,0xb8,0x00,0x9a,0x01,0x04,0xb2,0x0c,0xc7,0xbb,0xb8,0x01,0x05,0x40,0x0c,0x14,0x73,0x5b,0xee,0x61,0x79,0x61,0x8b,0x7f,0x26,0x25,0x09,0xb8,0x01,0x05,0x40,0x0f,0x9d,0xb5,0x9d,0x67,0x43,0x4f,0xee,0x55,0x6d,0x49,0x55,0xcd,0xc1,0xaf,0x97,0xb8,0x01,0x05,0x40,0x2a,0x0f,0x1e,0x1d,0x0f,0x37,0x2b,0xee,0x31,0x3d,0x31, +0x80,0x55,0x01,0x02,0x61,0x7f,0x9d,0xa9,0x55,0xa3,0xc1,0x0f,0x31,0x16,0x16,0x31,0x0f,0xc1,0xa3,0x55,0xa9,0x9d,0x7f,0x61,0x02,0x0b,0x04,0x18,0x14,0x04,0x91,0x85,0xb8,0x01,0x05,0xb2,0x00,0x04,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x10, +0xed,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xfd,0x32,0xcd,0x32,0x10,0xed,0x11,0x33, +0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x10,0xfd,0x32,0xcd,0x32,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x10,0xcd,0x32,0xed,0x32,0x31,0x30,0x05,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x37,0x32,0x16,0x15, +0x14,0x06,0x07,0x23,0x27,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34, +0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xe2,0x8f,0x45,0x45,0x8b,0x78,0x94,0x27,0x65,0x76,0x74,0x66,0x26,0x91, +0x7e,0x8a,0x43,0x47,0x8f,0x7a,0x88,0x23,0x1c,0x6f,0x89,0x80,0x6e,0x13,0x14,0x24,0x89,0xfd,0xdc,0x1d,0x2c,0x2b,0x1e,0x1f,0x2d,0x2b,0x01,0x83,0x1d,0x2c,0x2c,0x1d,0x1e,0x2e,0x2b,0xd5,0x1d,0x2c,0x2c,0x1d,0x1d,0x2f,0x2c,0xfe,0x3c,0x1d,0x2d,0x2d,0x1d,0x1e,0x2e,0x2c,0x94,0x1d,0x2c,0x2d,0x1c,0x1e,0x2e,0x2b,0x02,0x73,0x1d,0x2c, +0x2c,0x1d,0x20,0x2b,0x2b,0xfe,0xf0,0x1d,0x2c,0x2b,0x1e,0x1e,0x2e,0x2b,0xfe,0x3b,0x46,0x54,0x56,0x48,0x4b,0x4f,0x4f,0x01,0x55,0x47,0x54,0x57,0x48,0x49,0x51,0x50,0xfd,0x5a,0x47,0x54,0x56,0x49,0x48,0x51,0x50,0x01,0x57,0x47,0x54,0x55,0x4a,0x48,0x51,0x51,0x01,0x58,0x46,0x55,0x56,0x48,0x49,0x51,0x4e,0xfd,0x1d,0x46,0x54,0x56, +0x48,0x49,0x51,0x50,0x01,0x56,0x47,0x54,0x56,0x49,0x49,0x51,0x50,0x19,0x65,0x65,0x9e,0x84,0x60,0x44,0x0f,0x99,0x76,0x77,0x9b,0x11,0x41,0x5d,0x86,0xa1,0x66,0x66,0x9e,0x8a,0x5c,0x41,0x02,0x9f,0x87,0x80,0x98,0x07,0x01,0x44,0x60,0x83,0x9e,0x04,0x5f,0x2a,0x25,0x22,0x2b,0x28,0x25,0x22,0x2d,0x2b,0x24,0x24,0x29,0x28,0x25,0x22, +0x2d,0xfe,0x3e,0x2a,0x26,0x24,0x29,0x27,0x26,0x22,0x2e,0x2b,0x25,0x22,0x2b,0x28,0x25,0x23,0x2d,0xfe,0x3f,0x2b,0x24,0x25,0x28,0x28,0x25,0x22,0x2d,0x01,0xc1,0x2c,0x24,0x23,0x2a,0x2a,0x23,0x23,0x2d,0xfe,0x3f,0x2b,0x24,0x22,0x2b,0x27,0x26,0x22,0x2d,0x01,0x09,0x69,0x59,0x5a,0x65,0x66,0x5a,0x5a,0x67,0x6a,0x59,0x59,0x65,0x64, +0x5c,0x5c,0x65,0x01,0xc2,0x6a,0x58,0x58,0x67,0x64,0x5b,0x5d,0x65,0x69,0x59,0x5a,0x65,0x63,0x5c,0x5f,0x63,0x6a,0x58,0x5a,0x65,0x64,0x5c,0x59,0x68,0x01,0xc2,0x69,0x5a,0x5a,0x65,0x64,0x5c,0x5b,0x67,0x6a,0x59,0x5a,0x65,0x64,0x5c,0x5c,0x66,0x00,0x00,0x01,0xfe,0xc2,0x04,0xd3,0x01,0x3e,0x05,0x87,0x00,0x0f,0x00,0x1a,0x40,0x0a, +0x0b,0x0c,0x03,0x04,0x00,0x40,0x07,0x80,0x0c,0x04,0x00,0x2f,0x33,0x1a,0xdd,0x1a,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x03,0x22,0x15,0x15,0x23,0x35,0x34,0x33,0x21,0x32,0x15,0x15,0x23,0x35,0x34,0x23,0x70,0x42,0x8c,0x7a,0x01,0x88,0x7a,0x8b,0x42,0x05,0x20,0x31,0x1c,0x2e,0x86,0x88,0x2c,0x1c,0x31,0x00,0x00,0x08,0x00,0x6f, +0xfe,0xb6,0x07,0x72,0x05,0xf8,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b,0x00,0x47,0x00,0x53,0x00,0x5f,0x00,0x39,0x40,0x1b,0x35,0x59,0x5b,0x37,0x5b,0x29,0x4d,0x4f,0x2b,0x4f,0x1d,0x41,0x43,0x1f,0x43,0x5b,0x4f,0x43,0x43,0x4f,0x5b,0x03,0x07,0x11,0x13,0x05,0x07,0x00,0x2f,0xce,0x2f,0xce,0x12,0x17,0x39,0x2f,0x2f,0x2f, +0x11,0x33,0x10,0xce,0x32,0x11,0x33,0x10,0xce,0x32,0x11,0x33,0x10,0xce,0x32,0x31,0x30,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x03,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x13,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37, +0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x13,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x04,0x1d,0x7e,0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x87,0x7e, +0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x01,0xa4,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0x1c,0x7e,0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0xfe,0xdf,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0xfb,0x1c,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0xfe,0xd4,0x7e, +0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x27,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0x05,0x30,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xf9,0x78,0xba,0x7b,0x7b,0xba,0xc7,0x88,0x88,0x04,0x63,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xfc,0xee,0xb9,0x7b,0x7b,0xb9,0xc8,0x88,0x88,0xfc,0xed,0xba,0x7c,0x7c,0xba, +0xc8,0x89,0x89,0x03,0xcd,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xfc,0xee,0xb9,0x7b,0x7b,0xb9,0xc8,0x88,0x88,0xfc,0xed,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0x00,0x02,0x01,0x13,0xfe,0x52,0x06,0xce,0x06,0x5b,0x00,0x07,0x00,0x0f,0x00,0x40,0xb1,0x05,0x0b,0xb8,0x01,0x04,0xb3,0x06,0x08,0x01,0x0f,0xb8,0x01,0x04,0x40,0x0c,0x02,0x0c, +0x0d,0x09,0x02,0x06,0x09,0x06,0x09,0x06,0x07,0x0b,0xbc,0x01,0x05,0x00,0x08,0x00,0x04,0x01,0x05,0x00,0x07,0x00,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x19,0x02,0x33,0x11,0x21,0x11,0x33,0x11,0x06,0xce,0x60, +0xfb,0x09,0x64,0x64,0x04,0xf7,0x60,0x06,0x5b,0xfe,0x26,0x01,0x80,0xfe,0x80,0x01,0xda,0xf7,0xf7,0x01,0xda,0xfe,0x80,0x01,0x80,0xfe,0x26,0x00,0x00,0x0a,0x00,0x26,0xfe,0x52,0x07,0xbb,0x06,0x5b,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0xae,0xb3,0x28,0x10,0x14, +0x2f,0xb8,0x01,0x04,0xb3,0x2c,0x0b,0x07,0x0f,0xb8,0x01,0x04,0xb4,0x0c,0x04,0x00,0x0c,0x1b,0xb8,0x01,0x04,0x40,0x1f,0x18,0x25,0x1d,0x21,0x14,0x2c,0x02,0x0c,0x09,0x18,0x21,0x21,0x18,0x09,0x0c,0x02,0x2c,0x14,0x07,0x11,0x24,0x20,0x1c,0x29,0x15,0x11,0x19,0x0d,0x2d,0x22,0x16,0xb8,0x01,0x05,0xb4,0x15,0x21,0x15,0x26,0x2a,0xb8, +0x01,0x05,0xb4,0x29,0x25,0x29,0x1e,0x12,0xb8,0x01,0x05,0x40,0x12,0x11,0x1d,0x11,0x2d,0x15,0x29,0x11,0x11,0x29,0x15,0x2d,0x04,0x03,0x18,0x0c,0x2c,0x0a,0x02,0xb8,0x01,0x05,0xb1,0x07,0x03,0x00,0x2f,0x33,0xed,0x32,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33, +0x10,0xed,0x32,0x11,0x33,0x33,0x01,0x2f,0x33,0x33,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x10,0xed,0x11,0x33,0x33,0x31,0x30,0x01,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x03,0x11,0x33,0x11,0x01,0x21,0x35,0x21,0x11,0x21, +0x35,0x21,0x01,0x11,0x33,0x11,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x05,0x21,0x35,0x21,0x13,0x11,0x33,0x11,0x03,0xbd,0xc0,0xc0,0x64,0xb6,0xb6,0x64,0x64,0xfd,0xd5,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0x03,0x61,0x64,0x02,0x00,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0xfa,0x3b, +0xfe,0x30,0x01,0xd0,0x2d,0x64,0x04,0x8b,0xb6,0x64,0xb6,0xb6,0x64,0xb6,0xf9,0xc7,0x01,0xd0,0xfe,0x30,0x05,0x6c,0x64,0xfc,0x68,0x64,0xfd,0x64,0x01,0xd0,0xfe,0x30,0x05,0x6c,0x64,0xfc,0x68,0x64,0x01,0x36,0x64,0x64,0x64,0xfb,0xca,0x01,0xd0,0xfe,0x30,0x00,0x00,0x02,0x00,0x7d,0x02,0xaf,0x03,0x54,0x05,0xeb,0x00,0x0b,0x00,0x17, +0x00,0x64,0xb2,0x16,0x0c,0x17,0xb8,0x01,0x00,0xb5,0x00,0x14,0x0e,0x12,0x10,0x06,0xb8,0x01,0x00,0x40,0x23,0x11,0x00,0x0e,0x11,0x11,0x0e,0x00,0x03,0x01,0x07,0x05,0x0b,0x01,0x0f,0x0c,0x0b,0x08,0x0b,0x13,0x16,0x01,0x04,0x01,0x0e,0x09,0x0b,0x14,0x01,0x0b,0x01,0x0b,0x01,0x03,0x09,0x03,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f, +0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x01,0x2f,0x33,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xfd,0xc5,0x32,0x11,0x33,0x10,0xed,0xc5,0x32,0x31,0x30,0x13,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x23,0x07,0x27,0x23,0x37,0x33,0x17,0x37,0x33,0x27,0x37,0x23,0x27,0x07,0x23,0x17,0xfa,0x7d, +0xf9,0x73,0x74,0xf7,0x7c,0x7c,0xf8,0x73,0x73,0xf7,0x69,0xb1,0x50,0x50,0xb0,0x58,0x58,0xb0,0x50,0x51,0xb0,0x58,0x04,0x4e,0xd5,0xc8,0xc8,0xd6,0xd6,0xc8,0xc8,0x3d,0x8b,0x8b,0x99,0x99,0x8b,0x8b,0x99,0x00,0x00,0x01,0xfe,0x9c,0x04,0xc2,0x01,0x64,0x05,0xf2,0x00,0x0d,0x00,0x13,0xb6,0x0a,0x04,0x0a,0x04,0x80,0x00,0x07,0x00,0x2f, +0xc9,0x1a,0xcd,0x32,0x01,0x2f,0x2f,0x31,0x30,0x03,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x01,0x4e,0x6c,0x09,0xa2,0x0f,0xc2,0x97,0x9c,0xbb,0x09,0xa2,0x12,0xae,0x05,0x36,0x67,0x55,0x8c,0xa4,0xa5,0x8b,0xbc,0x00,0x01,0xff,0x33,0x04,0x80,0x00,0xce,0x05,0xbe,0x00,0x12,0x00,0x26,0x40,0x10,0x01,0x01, +0x06,0x11,0x00,0x00,0x09,0x06,0x0c,0x40,0x03,0x03,0x10,0x08,0x80,0x00,0x00,0x2f,0x1a,0xcc,0x32,0x39,0x2f,0x1a,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0x12,0x39,0x2f,0x31,0x30,0x13,0x37,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x33,0x03,0x0e,0x1b,0x41,0x35,0x39,0x47,0x76,0x1c,0x1f,0x1d,0x27, +0x15,0x18,0x79,0x46,0x04,0x80,0x77,0x1f,0x46,0x48,0x58,0x3c,0x26,0x21,0x0e,0x09,0x6c,0xfe,0xc2,0x00,0x00,0x01,0x00,0xfc,0x04,0xc2,0x03,0xc4,0x05,0xf2,0x00,0x0d,0x00,0x11,0xb5,0x0a,0x04,0x00,0x07,0x0a,0x04,0x00,0x2f,0x33,0x2f,0xc9,0x01,0x2f,0x2f,0x31,0x30,0x01,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16, +0x33,0x02,0x5f,0x4e,0x6c,0x09,0xa2,0x0f,0xc2,0x97,0x9c,0xbb,0x09,0xa2,0x12,0xae,0x05,0x36,0x67,0x55,0x8c,0xa4,0xa5,0x8b,0xbc,0x00,0x00,0x01,0x01,0x33,0x04,0x80,0x02,0xce,0x05,0xbe,0x00,0x12,0x00,0x26,0x40,0x10,0x01,0x01,0x06,0x11,0x00,0x00,0x09,0x06,0x0c,0x40,0x03,0x03,0x10,0x08,0x80,0x00,0x00,0x2f,0x1a,0xcc,0x32,0x39, +0x2f,0x1a,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0x12,0x39,0x2f,0x31,0x30,0x01,0x37,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x33,0x03,0x02,0x0f,0x1a,0x41,0x35,0x39,0x47,0x76,0x1c,0x1f,0x1e,0x26,0x15,0x18,0x79,0x46,0x04,0x80,0x77,0x1f,0x46,0x48,0x58,0x3c,0x26,0x21,0x0e,0x09,0x6c,0xfe,0xc2, +0x00,0x02,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x06,0xa2,0x00,0x10,0x00,0x16,0x00,0x42,0x40,0x22,0x15,0x03,0x0c,0x7f,0x09,0x0e,0x7e,0x16,0x09,0x16,0x09,0x16,0x00,0x03,0x7f,0x04,0x10,0x7f,0x00,0x0a,0x0c,0x00,0x04,0x02,0x12,0x91,0x0c,0x03,0x0e,0x15,0x05,0x91,0x02,0x12,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x10,0xcd,0x32,0x10,0xcd, +0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x11,0x35,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x21,0x06,0x02,0x07,0x21,0x04,0xad,0xfb,0xfd,0x9b,0x6f,0xa4,0xc2,0x90,0x02,0x13,0xc1,0xfe,0x97,0xfe,0x94,0x11,0xb6,0x78,0x02,0xab,0xfe,0x7f, +0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x31,0x02,0xdb,0x01,0x11,0xed,0xfe,0xf8,0xfa,0xfe,0xfd,0xe7,0x06,0x83,0xf6,0xfd,0x7c,0xf0,0x00,0x00,0x02,0x00,0x12,0xfe,0x8b,0x04,0x23,0x05,0x0e,0x00,0x10,0x00,0x15,0x00,0x40,0x40,0x21,0x14,0x0c,0xed,0x09,0x0e,0x84,0x15,0x09,0x15,0x09,0x15,0x00,0x03,0xed,0x04,0x10,0xed,0x00,0x0a,0x0c, +0x00,0x04,0x02,0x12,0x95,0x0c,0x0f,0x0e,0x14,0x05,0x95,0x02,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x10,0xcd,0x32,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0xc4,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x11,0x35,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x23,0x02,0x03,0x21, +0x03,0x98,0xfd,0x06,0x8c,0x5c,0x88,0x81,0x90,0x01,0x84,0x98,0xfe,0xc4,0xe3,0x20,0xc9,0x01,0xcc,0xfe,0x8b,0x01,0x75,0xfe,0x8b,0x02,0x00,0xcf,0x01,0xad,0x01,0x15,0xf2,0xfe,0xf2,0xfc,0x8b,0xfe,0x00,0x04,0xea,0xfe,0x4d,0xfe,0xc9,0x00,0x00,0x01,0x00,0x79,0xfe,0x29,0x03,0xde,0x05,0xb2,0x00,0x22,0x00,0x28,0x40,0x15,0x22,0x16, +0x7d,0x0b,0x11,0x1d,0x7d,0x05,0x11,0x16,0x05,0x00,0x04,0x0e,0x02,0x91,0x20,0x13,0x91,0x0e,0x04,0x00,0x3f,0xed,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0xc4,0x31,0x30,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x02, +0x15,0x14,0x04,0x23,0x22,0x27,0x79,0xb7,0xca,0x93,0xa1,0x87,0xc8,0xbf,0xa5,0x01,0x0f,0xe3,0xa5,0x90,0x9e,0xa8,0x88,0xa9,0xa3,0x95,0x98,0x9b,0x48,0xfe,0xf6,0xf4,0xcc,0x9b,0xbf,0x81,0xa4,0x94,0x7d,0xbf,0x8b,0x83,0xff,0x9e,0xd4,0xff,0x33,0xbd,0x58,0xa9,0x89,0x7f,0xd0,0x5e,0x61,0xa0,0xb7,0x76,0xe7,0xfd,0x52,0x00,0x00,0x01, +0x00,0x67,0xfe,0x29,0x03,0x0f,0x04,0x18,0x00,0x23,0x00,0x29,0x40,0x16,0x23,0x18,0x83,0x0c,0x13,0x1e,0x83,0x06,0x13,0x18,0x06,0x00,0x04,0x10,0x03,0x95,0x21,0x1b,0x15,0x95,0x10,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0xc4,0x31,0x30,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26, +0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x67,0x3d,0x9b,0x50,0x64,0x74,0x6d,0x7d,0x8e,0x85,0x61,0xb3,0x74,0x8e,0x60,0x72,0x88,0x63,0x71,0x62,0x76,0xa0,0x85,0xda,0xbb,0x9b,0x77,0xea,0x2e,0x35,0x7c,0x74,0x5d,0x93,0x4b,0x53,0xd5,0x8d,0x70, +0xb3,0x62,0x2e,0xa6,0x4a,0x81,0x72,0x63,0x90,0x48,0x63,0xc3,0x83,0xb5,0xd9,0x3d,0x00,0x01,0x00,0x60,0xff,0xe8,0x08,0x9a,0x05,0xb2,0x00,0x34,0x00,0x72,0x40,0x3e,0x28,0x7d,0x1d,0x2b,0x08,0x7d,0x06,0x15,0x2f,0x03,0x7e,0x04,0x2c,0x04,0x22,0x18,0x1d,0x15,0x04,0x33,0x32,0x32,0x33,0x04,0x15,0x1d,0x18,0x22,0x07,0x0e,0x34,0x0e, +0x33,0x2f,0x02,0x2f,0x02,0x06,0x18,0x92,0x2b,0x0f,0x04,0x22,0x2d,0x19,0x19,0x04,0x31,0x2d,0x03,0x20,0x92,0x25,0x04,0x12,0x92,0x0c,0x13,0x00,0x04,0x12,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x33,0xed,0x32,0x32,0x33,0x11,0x12,0x39,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f, +0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0xed,0xc4,0x10,0xed,0x31,0x30,0x21,0x01,0x23,0x11,0x23,0x11,0x21,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x11,0x33,0x11, +0x33,0x01,0x33,0x01,0x01,0x07,0xb0,0xfd,0xd7,0x2b,0xa8,0xfe,0x9d,0x91,0x7c,0xed,0xa2,0xf6,0x81,0x55,0xc7,0x61,0x9e,0xb4,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x94,0x7c,0xb9,0xa5,0xa3,0xc9,0xcc,0xea,0x54,0x45,0x01,0x9d,0xa8,0x2b,0x02,0x17,0xd1,0xfd,0xa1,0x02,0x8a,0x02,0xa0,0xfd,0x60,0x02,0xa0,0x5f,0xab,0x80,0xc3,0x6b,0x54,0xb6, +0x40,0x3b,0x96,0x7f,0x01,0x14,0x8b,0x8c,0x7c,0x6f,0x7f,0x71,0xaa,0x58,0xbf,0xa1,0x64,0x9a,0x29,0x02,0x6f,0xfd,0x91,0x02,0x6f,0xfd,0x59,0xfd,0x0d,0x00,0x00,0x01,0x00,0x50,0xff,0xe7,0x07,0x39,0x04,0x19,0x00,0x31,0x00,0x6f,0x40,0x3c,0x30,0x1d,0x84,0x13,0x20,0x00,0x84,0x0b,0x24,0x2d,0x84,0x2e,0x21,0x2e,0x0e,0x13,0x0b,0x2e, +0x28,0x27,0x27,0x28,0x2e,0x0b,0x13,0x0e,0x06,0x05,0x29,0x18,0x05,0x28,0x2c,0x24,0x24,0x2c,0x30,0x0e,0x95,0x20,0x06,0x2e,0x18,0x0f,0x0f,0x22,0x2a,0x2e,0x15,0x26,0x22,0x0f,0x16,0x95,0x1b,0x10,0x09,0x95,0x03,0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x39,0x12,0x39,0x33,0xed,0x32,0x32,0x33,0x11,0x12, +0x39,0x01,0x2f,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0xcd,0x10,0xfd,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x21,0x11,0x33,0x11, +0x33,0x01,0x33,0x01,0x01,0x23,0x01,0x23,0x11,0x23,0x11,0x21,0x16,0x03,0x3b,0xe0,0xc8,0xde,0x65,0x3a,0xab,0x54,0x01,0x0f,0xfe,0xd7,0x65,0x60,0x84,0x81,0x76,0x6a,0x95,0x96,0xa1,0x97,0x01,0x76,0x35,0x2c,0x01,0x36,0xa4,0x2a,0x01,0x88,0xd7,0xfe,0x29,0x01,0xfc,0xe6,0xfe,0x62,0x2a,0xa4,0xfe,0xf6,0x5e,0x01,0x19,0x8c,0xa6,0x36, +0xa1,0x23,0x28,0xac,0xaa,0x8b,0x4f,0x53,0x46,0x51,0x4b,0x99,0x3e,0xfe,0xed,0x3f,0x53,0x20,0x01,0xac,0xfe,0x54,0x01,0xac,0xfe,0x16,0xfd,0xea,0x01,0xc9,0xfe,0x37,0x01,0xc9,0x40,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0xc6,0x05,0x9a,0x00,0x20,0x00,0x38,0x40,0x1c,0x19,0x7e,0x16,0x14,0x14,0x00,0x0f,0x7e,0x0c,0x20,0x7e,0x1d, +0x00,0x1b,0x11,0x91,0x03,0x01,0x05,0x0d,0x09,0x09,0x1e,0x17,0x0d,0x03,0x00,0x12,0x00,0x3f,0x3f,0x33,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x22,0x27,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x37,0x26,0x35, +0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x06,0x1e,0xc3,0xa9,0xc3,0x5b,0x68,0x79,0x7c,0x41,0x9f,0xb1,0xa8,0xc9,0x4d,0xba,0x4d,0x09,0xa8,0xc9,0x96,0xb5,0xa8,0x02,0x85,0x79,0x95,0x3f,0x36,0x20,0xc1,0xad,0x02,0x20,0xfd,0xf2,0xec,0x42,0x32,0x2f,0x3c,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0xfa,0x66,0x00,0x00,0x01, +0x00,0x98,0x00,0x00,0x06,0x3b,0x04,0x00,0x00,0x20,0x00,0x3c,0x40,0x1e,0x19,0xef,0x14,0x16,0x14,0x16,0x14,0x00,0x0f,0x84,0x0c,0x20,0x84,0x1d,0x00,0x1b,0x11,0xec,0x04,0x01,0x07,0x0d,0x0a,0x0a,0x1e,0x17,0x0d,0x0f,0x00,0x15,0x00,0x3f,0x3f,0x33,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12, +0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x21,0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x05,0x98,0x46,0x9a,0x5a,0x60,0x8d,0x22,0x90,0x98,0x49,0xfe,0xba,0xa4,0xb4,0x59,0x98,0x43,0x0c,0xa3,0xb5,0x8b,0x9d, +0xa3,0x01,0x9c,0x27,0x3b,0x43,0x3c,0x4f,0x30,0x01,0x6c,0x01,0x5a,0xfe,0xaf,0xe2,0x38,0x24,0x32,0x4b,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xfc,0x00,0x00,0x02,0x00,0x0f,0xfe,0x38,0x05,0xda,0x05,0x9a,0x00,0x29,0x00,0x2f,0x00,0x4c,0x40,0x27,0x2e,0x13,0x7f,0x14,0x08,0x1b,0x7e,0x29,0x2f,0x1e,0x7f,0x0e,0x2f,0x0e,0x2f,0x0e, +0x05,0x14,0x21,0x24,0x7f,0x05,0x2b,0x91,0x19,0x03,0x21,0x09,0x08,0x08,0x03,0x27,0x2e,0x1b,0x15,0x91,0x14,0x12,0x12,0x00,0x3f,0xcd,0xed,0x32,0x32,0xc4,0x32,0x39,0x2f,0x33,0x33,0x3f,0xed,0x01,0x2f,0xfd,0xcd,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xfd,0xc4,0x10,0xfd,0xc4,0x31,0x30,0x01,0x16,0x16,0x33,0x32,0x35, +0x34,0x23,0x23,0x35,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21,0x11,0x33,0x32,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x03,0x21,0x06,0x02,0x07,0x21,0x04,0x2a,0x24,0x60,0x1e,0x7d,0x89,0x47,0x20,0x20,0x3b,0x42,0x3c,0x40,0xfb,0xf0,0x9b,0x6f,0x92,0xc7,0x0d,0x02, +0xa3,0x47,0xf9,0x36,0x28,0x32,0x3f,0x85,0x77,0x68,0x4b,0x4c,0xfe,0x94,0x0f,0xb1,0x7f,0x02,0xab,0xfe,0xc7,0x0e,0x12,0x43,0x3a,0x69,0x01,0x21,0x1b,0x1f,0x19,0xfe,0x7f,0x02,0x19,0x01,0x0a,0x02,0xc6,0x01,0x32,0xfa,0xec,0xa6,0x33,0x41,0x0b,0x0c,0x45,0x34,0x4e,0x56,0x1a,0x06,0xb0,0xef,0xfd,0x83,0xfe,0x00,0x00,0x02,0x00,0x12, +0xfe,0x38,0x04,0xcb,0x04,0x00,0x00,0x2a,0x00,0x30,0x00,0x54,0x40,0x0a,0x2f,0x13,0xed,0x14,0x08,0x1c,0x84,0x2a,0x30,0x1f,0xb8,0x01,0x2e,0x40,0x09,0x0e,0x30,0x0e,0x30,0x0e,0x05,0x14,0x22,0x25,0xb8,0x01,0x2e,0x40,0x12,0x05,0x2c,0x95,0x1a,0x0f,0x22,0x09,0x08,0x08,0x03,0x28,0x2f,0x1c,0x15,0x95,0x14,0x12,0x15,0x00,0x3f,0xcd, +0xed,0x32,0x32,0xc4,0x32,0x39,0x2f,0x33,0x33,0x3f,0xed,0x01,0x2f,0xfd,0xcd,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xfd,0xc4,0x10,0xfd,0xc4,0x31,0x30,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x35,0x35,0x21,0x11,0x33,0x32,0x15, +0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x03,0x23,0x06,0x02,0x07,0x21,0x03,0x1b,0x17,0x6d,0x1e,0x7d,0x89,0x47,0x20,0x20,0x3a,0x43,0x3c,0x36,0xfc,0xe9,0x8c,0x5b,0x80,0x8a,0x02,0x14,0x34,0xf9,0x36,0x28,0x30,0x41,0x87,0x75,0x68,0x4b,0x35,0xe3,0x0a,0x73,0x6d,0x01,0xcd,0xfe,0xc7,0x0a,0x16,0x43,0x3a,0x69,0x01, +0x20,0x1c,0x1f,0x19,0xfe,0x8b,0x02,0x00,0xb6,0x01,0xc8,0xea,0x0d,0xfc,0x87,0xa7,0x34,0x40,0x0b,0x0c,0x45,0x34,0x4e,0x56,0x1a,0x05,0x23,0xbc,0xfe,0x80,0xae,0x00,0x00,0x01,0x00,0x29,0xfe,0x66,0x05,0x3d,0x05,0x9a,0x00,0x1e,0x00,0x39,0x40,0x1d,0x13,0x0b,0xad,0x0c,0x1e,0x1e,0x05,0x0e,0x18,0x7d,0x11,0x05,0x0a,0x91,0x13,0x13, +0x0c,0x12,0x0e,0x91,0x0f,0x03,0x00,0x0c,0x02,0x91,0x1c,0x0c,0x12,0x00,0x3f,0xd4,0xed,0x11,0x39,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x39,0x2f,0x33,0xe4,0x32,0x31,0x30,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x04,0x12,0x15, +0x14,0x02,0x06,0x23,0x22,0x27,0x01,0xc8,0xa2,0x9c,0xba,0xcd,0x76,0xda,0x8d,0x42,0xa8,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x4a,0xc1,0x01,0x26,0x9e,0x89,0xff,0xab,0xaa,0x98,0x96,0x6c,0xde,0xcc,0x94,0xe8,0x7e,0xfd,0x5e,0x05,0x02,0x98,0x98,0xfe,0x38,0xa2,0xfe,0xd6,0xc0,0xab,0xfe,0xf5,0x92,0x4c,0x00,0x00,0x01,0x00,0x1e,0xfe,0x66, +0x04,0x56,0x04,0x00,0x00,0x1d,0x00,0x39,0x40,0x1d,0x12,0x0a,0x84,0x1d,0x0b,0x0b,0x05,0x0d,0x16,0x83,0x10,0x05,0x09,0x95,0x12,0x12,0x0b,0x11,0x0d,0x95,0x0e,0x0f,0x00,0x0b,0x02,0x95,0x1a,0x0b,0x15,0x00,0x3f,0xd4,0xed,0x11,0x39,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x39,0x2f,0xc4,0xed,0x32,0x31, +0x30,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x01,0x52,0x79,0x87,0xa5,0xb7,0xd9,0xbf,0x20,0xa4,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x42,0xf7,0x01,0x27,0x81,0xeb,0x9a,0x4c,0x6c,0x46,0xc0,0x4e,0xb9,0xab,0xb9,0xd7,0xfe, +0x1a,0x03,0x74,0x8c,0x8c,0xff,0x00,0xfe,0xde,0xfa,0x8e,0xe5,0x7f,0x16,0x24,0x00,0x00,0x01,0x00,0x29,0xff,0xe8,0x04,0x0c,0x05,0x9a,0x00,0x11,0x00,0x23,0x40,0x11,0x0c,0x7e,0x05,0x00,0x05,0x00,0x09,0x07,0x0b,0x07,0x91,0x08,0x03,0x0f,0x92,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0xed,0x31, +0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0x83,0x3c,0x57,0x95,0x95,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x52,0x56,0x44,0x29,0x01,0x19,0xa3,0xac,0x03,0xcb,0x98,0x98,0xfc,0x53,0x78,0x66,0x1d,0x00,0x01,0x00,0x1e,0xff,0xe8,0x03,0x29,0x04,0x00,0x00,0x10,0x00,0x23,0x40,0x11, +0x0b,0x84,0x04,0x00,0x04,0x00,0x08,0x06,0x0a,0x06,0x95,0x07,0x0f,0x0e,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0x0c,0x34,0x58,0xfe,0xd2,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x55,0x53, +0x45,0x29,0x01,0x19,0x01,0x50,0x02,0x3c,0x8c,0x8c,0xfd,0xdd,0x78,0x67,0x1d,0x00,0x00,0x01,0x00,0xae,0xfe,0x29,0x05,0xbd,0x05,0x9a,0x00,0x26,0x00,0x40,0x40,0x12,0x26,0x17,0x7e,0x14,0x14,0x0c,0x13,0x03,0x7f,0x10,0x21,0x1a,0x7f,0x0c,0x15,0x11,0x03,0x24,0xb8,0x01,0x05,0xb3,0x00,0x00,0x10,0x07,0xb8,0x01,0x05,0xb5,0x1e,0x17, +0x13,0x91,0x10,0x12,0x00,0x3f,0xed,0x32,0xd4,0xed,0x12,0x39,0x2f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x04,0x21,0x21,0x22,0x26,0x35, +0x34,0x36,0x33,0x21,0x15,0x01,0xd0,0x45,0x4e,0x88,0x8b,0x0f,0x01,0x32,0x93,0xb4,0x51,0x74,0x68,0xfc,0x6f,0xa8,0x02,0xe6,0xa8,0x63,0x68,0xff,0x00,0xfe,0xf0,0xfe,0x9a,0xd3,0xc6,0x8b,0x93,0x02,0x5a,0xd8,0x23,0x21,0x30,0x24,0x2c,0x51,0x4e,0x51,0x54,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xf8,0x22,0x92,0x69,0xab,0xa1,0x56,0x63, +0x4e,0x5d,0x65,0x00,0x00,0x01,0x00,0x8f,0xfe,0x29,0x04,0xc6,0x04,0x00,0x00,0x24,0x00,0x44,0x40,0x10,0x11,0x84,0x0e,0x24,0x15,0x84,0x12,0x0e,0x12,0x0e,0x12,0x0a,0x03,0xed,0x1f,0x18,0xb8,0x01,0x2e,0x40,0x10,0x0a,0x22,0x00,0x00,0x0e,0x06,0x1c,0x1b,0x13,0x0f,0x0f,0x15,0x11,0x95,0x0e,0x15,0x00,0x3f,0xed,0x32,0x3f,0x33,0x3f, +0xcd,0x12,0x39,0x2f,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x01,0x9a,0x3c,0x44,0x78, +0x6c,0xc3,0xc3,0xaf,0x72,0x60,0xfd,0x45,0xa4,0x02,0x0a,0xa4,0x61,0x6d,0xfb,0xfb,0xed,0xaa,0xaa,0x87,0x77,0x01,0xab,0xd8,0x23,0x20,0x32,0x26,0x01,0x66,0x67,0x4c,0x59,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x7b,0x1d,0x91,0x62,0x9e,0xa4,0x5c,0x62,0x4d,0x57,0x63,0x00,0x00,0x01,0x00,0x29,0xfe,0x9b,0x04,0x0c,0x05,0x9a,0x00,0x13, +0x00,0x31,0x40,0x19,0x00,0x7e,0x0a,0x05,0x13,0x7e,0x0c,0x0a,0x0c,0x0a,0x0c,0x10,0x0e,0x12,0x0e,0x91,0x0f,0x03,0x02,0x92,0x07,0x0b,0x92,0x00,0x12,0x00,0x3f,0xed,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc4,0x10,0xed,0x31,0x30,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x33, +0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x01,0xcf,0x0a,0xa5,0x4c,0x32,0x38,0x52,0x9f,0xac,0x9f,0xfe,0x63,0x03,0xe3,0xfe,0x62,0xdb,0x20,0x92,0x18,0xc5,0xba,0x76,0x04,0x72,0x98,0x98,0xfa,0xfe,0x00,0x00,0x01,0x00,0x1e,0xfe,0x9b,0x03,0x29,0x04,0x00,0x00,0x13,0x00,0x2d,0x40,0x17,0x05,0x13,0x84,0x0c,0x0c,0x0a,0x10,0x0e,0x00,0x84, +0x0a,0x12,0x0e,0x95,0x0f,0x0f,0x02,0x95,0x07,0x0b,0xec,0x00,0x15,0x00,0x3f,0xed,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0xed,0xc6,0x2f,0x12,0x39,0x2f,0xfd,0xc4,0x31,0x30,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x01,0x53,0x0a,0xa4,0x44,0x2e,0x3d,0x45,0x9c,0xa6,0xa3, +0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0xdb,0x20,0x93,0x17,0xc7,0xb8,0x76,0x02,0xe4,0x8c,0x8c,0xfc,0x8c,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0xc5,0x05,0x9a,0x00,0x14,0x00,0x37,0x40,0x1c,0x0d,0x7e,0x06,0x0b,0x06,0x0b,0x00,0x08,0x14,0x7e,0x11,0x00,0x12,0x03,0x0c,0x08,0x91,0x09,0x0f,0x91,0x01,0x09,0x03,0x03,0x09,0x03,0x00,0x12, +0x00,0x3f,0x3f,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x21,0x32,0x37,0x11,0x33,0x11,0x05,0x1d,0xf2,0xcb,0xc3,0xd7,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x04,0xc4,0xe7,0xa8,0x02, +0x85,0x79,0xc3,0xb0,0x01,0x85,0x96,0x98,0xfe,0x85,0xe7,0x6e,0x02,0x8c,0xfa,0x66,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0xae,0x04,0x00,0x00,0x13,0x00,0x37,0x40,0x1c,0x0c,0x84,0x05,0x0a,0x05,0x0a,0x00,0x07,0x13,0x84,0x10,0x00,0x11,0x0f,0x0b,0x07,0x95,0x08,0x0e,0xec,0x01,0x08,0x03,0x03,0x08,0x0f,0x00,0x15,0x00,0x3f,0x3f,0x39, +0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x20,0x11,0x35,0x21,0x35,0x21,0x15,0x21,0x15,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x04,0x0b,0xba,0x9c,0xfe,0x9d,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0xca,0x9a,0xb1,0xa3,0x01,0x9c,0x62,0x01,0x6c,0xce,0x8c, +0x8c,0xc6,0xe1,0x56,0x01,0xdd,0xfc,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0xb4,0x00,0x19,0x00,0x2c,0x40,0x16,0x0b,0x18,0x7e,0x19,0x11,0x7e,0x05,0x12,0x15,0x91,0x0b,0x19,0x0d,0x0d,0x02,0x12,0x19,0x12,0x07,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xc4,0xed,0x2f,0xed,0x32, +0x31,0x30,0x13,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x11,0x23,0xa6,0x01,0xf2,0x63,0x61,0x5c,0x63,0xae,0xa1,0xea,0xc0,0xbf,0xca,0xa8,0xf5,0xb6,0xe0,0xa8,0x03,0xb4,0x02,0x00,0x17,0x9a,0x1d,0xba,0xca,0x88,0x7a,0xc5,0xaf,0xfd,0xe6,0x02,0x12,0xe8, +0x6e,0xfd,0x74,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x1d,0x00,0x29,0x40,0x15,0x0d,0x1c,0x84,0x1d,0x06,0x13,0x84,0x14,0x0d,0x10,0x14,0x1d,0x15,0x17,0x95,0x10,0x10,0x09,0x95,0x03,0x01,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0x32,0x31,0x30,0x13,0x34,0x12,0x33,0x32, +0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x06,0x15,0x11,0x23,0xa6,0xf2,0xe5,0x86,0x82,0x3e,0x8c,0x3d,0xa4,0x90,0x04,0x75,0xdb,0x01,0x5a,0xa4,0xee,0x4d,0x83,0x4c,0xa4,0x03,0xe9,0xfc,0x01,0x1d,0x37,0x98,0x20,0x24,0xc3,0xc8,0x96,0xc2,0xfe,0x5f,0xfd,0x89,0x02, +0x4e,0x01,0x40,0x53,0x97,0x60,0xfd,0xbc,0x00,0x01,0x00,0xbc,0xfe,0x29,0x07,0xa5,0x05,0x9a,0x00,0x2a,0x00,0x54,0x40,0x1d,0x03,0x7f,0x25,0x17,0x7e,0x14,0x2a,0x1b,0x7e,0x18,0x25,0x14,0x18,0x18,0x14,0x25,0x03,0x0c,0x13,0x7e,0x10,0x1e,0x7f,0x0c,0x19,0x15,0x11,0x03,0x28,0xb8,0x01,0x05,0xb3,0x00,0x00,0x10,0x07,0xb8,0x01,0x05, +0xb6,0x22,0x1b,0x17,0x13,0x91,0x10,0x12,0x00,0x3f,0xed,0x32,0x32,0xd4,0xed,0x12,0x39,0x2f,0xed,0x3f,0x33,0x33,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11, +0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x04,0x21,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x03,0x47,0x45,0x4e,0x88,0x8b,0x0f,0x01,0xa3,0x93,0xb4,0x51,0x75,0x68,0xfa,0x88,0xa8,0x02,0x13,0xa8,0x02,0x12,0xa8,0x62,0x6a,0xff,0x00,0xfe,0xf0,0xfe,0x28,0xd2,0xc6,0x8b,0x93,0x02,0xcb,0xd8,0x23,0x21,0x30,0x24,0x2b, +0x53,0x4d,0x51,0x54,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xf8,0x22,0x91,0x6a,0xaa,0xa2,0x56,0x63,0x4e,0x5d,0x65,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x8f,0x04,0x00,0x00,0x28,0x00,0x51,0x40,0x16,0x03,0xed,0x23,0x15,0x84,0x12,0x28,0x19,0x84,0x16,0x23,0x12,0x16,0x16,0x12,0x23,0x03,0x0a,0x11,0x84,0x0e,0x1c, +0xb8,0x01,0x2e,0x40,0x12,0x0a,0x26,0x00,0x00,0x0e,0x06,0x20,0x1b,0x17,0x13,0x0f,0x0f,0x19,0x15,0x11,0x95,0x0e,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0x33,0x33,0x3f,0xcd,0x12,0x39,0x2f,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33, +0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x02,0x85,0x3c,0x44,0x78,0x6c,0x01,0xa1,0xc3,0xaf,0x72,0x60,0xfb,0x7c,0xa4,0x01,0x97,0xa4,0x01,0x98,0xa4,0x61,0x6d,0xfb,0xfb,0xfe,0x35,0xaa,0xaa,0x87, +0x77,0x02,0x89,0xd8,0x23,0x20,0x32,0x26,0x01,0x66,0x67,0x4c,0x59,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x7b,0x1d,0x91,0x62,0x9e,0xa4,0x5c,0x62,0x4d,0x57,0x63,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x04,0x1b,0x05,0x2f,0x00,0x1c,0x00,0x47,0x40,0x24,0x0f,0x07,0x84,0x08,0x0c,0x08,0x13,0x17,0x84,0x04,0x10,0x04, +0x08,0x04,0x08,0x04,0x00,0x0a,0x15,0x00,0x12,0x0e,0x16,0x06,0x0a,0x95,0x13,0x0f,0x0b,0x0f,0x08,0x15,0x1a,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0xc4,0x32,0x01,0x2f,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x23, +0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x04,0x1b,0x3a,0x5f,0xfe,0xf3,0xf6,0xa4,0xb0,0xb0,0xa4,0xf6,0xa4,0x01,0x01,0xfe,0xff,0x46,0x51,0x3f,0x2c,0x0a,0x20,0x01,0x2c,0x02,0x5e,0xfc,0x8c,0x03,0x74,0x8c,0xfa,0x35,0xfe,0xd1,0xfa,0x35,0xfe,0xd1,0x8b,0xfd, +0xbe,0x67,0x58,0x22,0x00,0x04,0x00,0x32,0x00,0x00,0x04,0x37,0x05,0xb2,0x00,0x3f,0x00,0x48,0x00,0x51,0x00,0x5a,0x00,0xb2,0xb1,0x4f,0x2b,0xb8,0x01,0x04,0xb2,0x09,0x2c,0x35,0xb8,0x01,0x04,0xb2,0x58,0x46,0x26,0xb8,0x01,0x04,0xb4,0x51,0x15,0x27,0x3e,0x21,0xb8,0x01,0x04,0x40,0x0e,0x22,0x48,0x22,0x2c,0x58,0x27,0x22,0x22,0x27, +0x58,0x2c,0x04,0x00,0x55,0xb8,0x01,0x04,0x40,0x40,0x30,0x10,0x1d,0x7d,0x00,0x58,0x3e,0x4f,0x48,0x51,0x05,0x52,0x46,0x25,0x52,0x33,0x42,0x3b,0x3b,0x33,0x4b,0x37,0x37,0x1d,0x00,0x39,0x35,0x2d,0x2a,0x20,0x23,0x28,0x09,0x25,0x10,0x15,0x09,0x03,0x33,0x25,0x40,0x09,0x11,0x48,0x0f,0x33,0x1f,0x33,0x2f,0x33,0x03,0x25,0x33,0x25, +0x33,0x0d,0x27,0x22,0x2c,0x12,0x12,0x91,0x0d,0x04,0x00,0x3f,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x11,0x17,0x39,0x12,0x17,0x39,0x33,0x2f,0xc9,0x11,0x33,0x2f,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xc4,0x33, +0xed,0x32,0x10,0xed,0x10,0xc4,0xed,0x32,0x31,0x30,0x01,0x34,0x2e,0x02,0x27,0x2e,0x02,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x06,0x23,0x15,0x23,0x35,0x26,0x27,0x15,0x23,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32, +0x17,0x36,0x33,0x32,0x15,0x15,0x36,0x27,0x34,0x23,0x22,0x06,0x15,0x15,0x32,0x37,0x25,0x34,0x23,0x22,0x06,0x15,0x15,0x16,0x17,0x25,0x22,0x06,0x15,0x14,0x16,0x17,0x35,0x34,0x03,0x87,0x33,0x5a,0x7b,0x47,0x9e,0x83,0x43,0x82,0xe5,0x8b,0xd3,0x62,0x7f,0xc7,0x8d,0xa4,0x2f,0x66,0xa2,0xaa,0x88,0x4a,0x90,0x84,0x60,0x42,0x61,0x60, +0x64,0x40,0x60,0x3f,0x4b,0x3c,0x33,0x5b,0x17,0x2f,0x5a,0x59,0x1e,0x2f,0x5c,0x85,0x64,0xc4,0x4e,0x24,0x31,0x69,0x3a,0xfe,0xfd,0x4e,0x26,0x30,0x39,0x6b,0xfe,0xde,0x13,0x0f,0x22,0x1e,0x01,0x5e,0x3a,0x56,0x48,0x40,0x24,0x50,0x6f,0x84,0x56,0x74,0xae,0x5d,0x33,0xbd,0x58,0x76,0x62,0x3a,0x56,0x4c,0x50,0x55,0x71,0x8a,0x57,0x7d, +0x8b,0x1b,0x4c,0x3e,0x06,0x38,0x3a,0x05,0x0d,0x4c,0x68,0x1a,0x6d,0x49,0x33,0x3d,0x54,0x53,0x53,0x53,0xaa,0x53,0x36,0x0c,0x6b,0x3e,0x30,0x6b,0x0c,0x65,0x68,0x3d,0x34,0x55,0x0c,0x05,0xe8,0x26,0x15,0x23,0x46,0x11,0x6e,0x47,0x00,0x01,0x00,0xe7,0x00,0x50,0x04,0xf6,0x04,0x5c,0x00,0x09,0x00,0x0d,0xb3,0x06,0x00,0x09,0x03,0x00, +0x2f,0xc4,0x01,0x2f,0xc4,0x31,0x30,0x37,0x01,0x23,0x27,0x05,0x17,0x13,0x27,0x35,0x01,0xe7,0x03,0x46,0xa8,0x68,0x01,0xcc,0x05,0x08,0x69,0xfc,0xb9,0xae,0x03,0x46,0x68,0x08,0x04,0xfe,0x33,0x69,0xac,0xfc,0xb8,0x00,0x00,0x01,0x00,0xe7,0x00,0x50,0x04,0xf6,0x04,0x5c,0x00,0x09,0x00,0x0d,0xb3,0x00,0x06,0x09,0x03,0x00,0x2f,0xc4, +0x01,0x2f,0xc4,0x31,0x30,0x01,0x01,0x37,0x17,0x25,0x27,0x03,0x17,0x07,0x01,0x04,0xf6,0xfc,0xb8,0xaa,0x69,0xfe,0x33,0x04,0x09,0x69,0x02,0x03,0x4a,0x03,0xfe,0xfc,0xb8,0x02,0x68,0x08,0x04,0x01,0xcd,0x68,0xaf,0x03,0x4a,0x00,0x00,0x02,0x00,0x00,0xff,0xb8,0x06,0x78,0x06,0x2e,0x00,0x09,0x00,0x13,0x00,0x2e,0x40,0x16,0x06,0x10, +0x06,0x10,0x00,0x0a,0x0a,0x15,0x30,0x00,0x01,0x00,0x03,0x0d,0x03,0x0d,0x09,0x3f,0x13,0x01,0x13,0x09,0x00,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0x11,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x35,0x01,0x21,0x37,0x21,0x17,0x11,0x07,0x11,0x09,0x02,0x21,0x07,0x21,0x27,0x11,0x37,0x11,0x01,0x01,0xee,0xfe, +0x91,0xb3,0x01,0xfe,0x02,0xb3,0xfe,0x11,0x05,0xe8,0xfe,0x12,0x01,0x6f,0xb3,0xfe,0x02,0x02,0xb3,0x01,0xef,0x48,0x01,0xee,0xb3,0x02,0xfe,0x02,0xb3,0x01,0x73,0xfe,0x0f,0x05,0xe6,0xfe,0x12,0xb3,0x02,0x01,0xfe,0xb3,0xfe,0x8d,0x01,0xf1,0x00,0x03,0x00,0x83,0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x13,0x00,0x1b,0x00,0x2f,0x00,0x3a, +0x40,0x1d,0x1b,0x08,0x08,0x09,0x09,0x1c,0xaf,0x26,0x26,0x0c,0x00,0x84,0x17,0x17,0x31,0x0c,0x1b,0x0f,0x09,0x2b,0xb0,0x21,0x15,0x0c,0x0a,0x1a,0x95,0x0f,0x00,0x00,0x3f,0xfd,0x32,0xcc,0x3f,0xfd,0xce,0x11,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x33,0x2f,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x07,0x0e,0x03,0x15, +0x07,0x23,0x03,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x13,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x31,0xcf,0x1e,0x38,0x2b,0x1a,0x03,0x87,0x10,0x5e,0x4c,0x99,0xa5,0x53,0x88,0x60,0x35,0xfe,0xae,0x57,0x59,0x65,0x55,0x0a,0x27,0x11,0x1e,0x28, +0x18,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x16,0x29,0x1e,0x12,0x04,0x5a,0xce,0xaf,0x1a,0x33,0x32,0x32,0x19,0x7f,0x03,0x80,0x20,0x52,0xb0,0x60,0x32,0x5a,0x7f,0xfe,0x78,0x4e,0x8f,0x50,0x58,0x73,0x0d,0xfd,0xe8,0xfd,0x50,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x29,0x00,0xff,0xff,0x00,0xac, +0xfe,0x1e,0x03,0x00,0x06,0x1e,0x00,0x26,0x00,0x5f,0x00,0x00,0x00,0x07,0x00,0x5f,0x01,0xc0,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x78,0x05,0x1c,0x05,0x23,0x00,0x23,0x00,0x45,0x00,0x15,0xb7,0x24,0x14,0x32,0x05,0x41,0x19,0x2b,0x0d,0x00,0x2f,0x33,0x2f,0x33,0x01,0x2f,0x33,0x2f,0x33,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e, +0x04,0x07,0x23,0x2e,0x05,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x3e,0x03,0x01,0x14,0x1e,0x04,0x17,0x3e,0x05,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x2e,0x03,0x23,0x22,0x0e,0x02,0x03,0xea,0x3b,0x6f,0x55,0x33,0x40,0x68,0x83,0x86,0x7d,0x2d,0x09,0x2d,0x7c,0x86,0x83,0x68,0x40,0x33,0x55,0x6f,0x3b,0x39,0x5b, +0x49,0x37,0x14,0x09,0x14,0x38,0x49,0x5b,0xfd,0x2b,0x34,0x54,0x69,0x6c,0x63,0x23,0x23,0x62,0x6b,0x68,0x53,0x34,0x1c,0x30,0x42,0x26,0x3a,0x5b,0x49,0x39,0x16,0x17,0x38,0x49,0x5c,0x39,0x26,0x42,0x30,0x1c,0x05,0x23,0x2b,0x57,0x84,0x5a,0x64,0xad,0x98,0x85,0x79,0x6f,0x35,0x35,0x6f,0x79,0x85,0x98,0xad,0x64,0x5a,0x84,0x57,0x2b, +0x1e,0x33,0x41,0x22,0x22,0x41,0x33,0x1e,0xfe,0xa0,0x50,0x8e,0x7e,0x6f,0x63,0x57,0x26,0x26,0x57,0x63,0x6f,0x7e,0x8e,0x50,0x3d,0x58,0x38,0x1a,0x2e,0x4b,0x5e,0x2f,0x2f,0x5e,0x4b,0x2e,0x1a,0x38,0x58,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x03,0x43,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0x21,0x40,0x0e,0x1c,0x00,0x0f,0x12,0x1d,0x0b, +0x01,0x0e,0x1e,0x1c,0x03,0x11,0x03,0x03,0x00,0x3f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x33,0xcd,0x33,0x2f,0xcd,0x32,0x32,0x31,0x30,0x01,0x25,0x11,0x33,0x15,0x37,0x15,0x07,0x11,0x37,0x15,0x07,0x11,0x23,0x35,0x05,0x11,0x23,0x35,0x07,0x35,0x37,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x25,0x11,0x05,0x01,0x37,0x01,0x05,0x67,0xa0,0xa0, +0xa0,0xa0,0x67,0xfe,0xfb,0x67,0xa0,0xa0,0xa0,0xa0,0x67,0x01,0x05,0xfe,0xfb,0x03,0xff,0x8b,0x01,0x10,0xd9,0x55,0x98,0x55,0xfe,0x42,0x55,0x98,0x55,0xfe,0xda,0xef,0x8b,0xfe,0xef,0xda,0x55,0x98,0x55,0x01,0xbe,0x55,0x98,0x55,0x01,0x0e,0xfc,0xd3,0x8b,0x01,0xbe,0x8b,0x00,0x09,0x00,0xe6,0xff,0xb8,0x07,0x19,0x05,0xe7,0x00,0x1e, +0x00,0x2c,0x00,0x3a,0x00,0x48,0x00,0x56,0x00,0x64,0x00,0x72,0x00,0x7f,0x00,0x8c,0x00,0x1e,0x40,0x13,0x30,0x49,0x23,0x36,0x57,0x41,0x86,0x50,0x79,0x6e,0x2b,0x5d,0x80,0x68,0x0e,0x3b,0x0f,0x73,0x00,0x00,0x2f,0x32,0x2f,0x33,0x17,0x39,0x31,0x30,0x05,0x22,0x27,0x2e,0x02,0x27,0x26,0x35,0x34,0x37,0x36,0x36,0x37,0x36,0x33,0x32, +0x17,0x16,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x0e,0x02,0x07,0x06,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x36,0x33,0x32,0x16,0x17,0x36,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x37,0x26,0x05,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32, +0x37,0x26,0x26,0x35,0x34,0x03,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x37,0x06,0x23,0x22,0x26,0x13,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x01,0x32,0x36,0x35,0x34,0x26,0x27,0x16,0x15,0x14,0x06,0x07,0x16,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x03,0xff,0xa4,0x76,0x69, +0xb5,0x6e,0x05,0x6e,0x6e,0x08,0xe8,0xa1,0x76,0xa4,0xa2,0x79,0xa0,0xe6,0x0a,0x6f,0x3a,0x34,0x07,0x6d,0xb6,0x69,0x77,0x02,0x11,0x54,0x96,0x56,0x63,0xa4,0x24,0x5a,0x64,0x87,0xde,0x2d,0x1b,0x84,0x23,0xa4,0x62,0x53,0x95,0x58,0x1c,0x2a,0xe1,0x86,0x66,0xfe,0x27,0x83,0xbd,0x6f,0x5e,0x2d,0x51,0x88,0x48,0x3e,0xfe,0x44,0x5b,0x71, +0x53,0x93,0x59,0x46,0x3b,0x81,0xa0,0xf1,0x1b,0x54,0x92,0x59,0x61,0xa7,0x22,0x5a,0x63,0x88,0xde,0x3c,0x24,0x9d,0x5c,0x5c,0x9b,0x56,0x1b,0x2c,0xdf,0x87,0x60,0x01,0xd3,0x82,0xbd,0x6b,0x60,0x2c,0x9d,0x86,0x40,0x01,0xbb,0x5a,0x74,0xb9,0x86,0x43,0x3e,0x7f,0xa0,0x48,0x6c,0x05,0x6c,0xb8,0x67,0x76,0xa5,0xa4,0x78,0xa0,0xe8,0x08, +0x6c,0x6d,0x08,0xe7,0x9f,0x7b,0xa4,0x4f,0x92,0x39,0x6a,0xb4,0x6c,0x06,0x6b,0x03,0x16,0x54,0x95,0x58,0x70,0x5d,0x2d,0x9f,0x84,0x40,0x01,0xbd,0x5c,0x6f,0x55,0x95,0x54,0x47,0x3c,0x82,0xa0,0x01,0x0c,0xbb,0x85,0x61,0xa5,0x24,0x58,0x67,0x60,0xa7,0x75,0x13,0x1c,0x81,0x23,0xa6,0x61,0x54,0x94,0x58,0x1b,0x2a,0xe1,0x85,0x66,0xfe, +0xaa,0x3c,0x46,0x53,0x95,0x57,0x6f,0x5d,0x2d,0xa1,0xfe,0x86,0x5b,0x71,0x56,0x94,0x55,0x45,0x3e,0x83,0xa0,0xfe,0xf5,0xbe,0x80,0x61,0xa2,0x28,0x58,0x66,0x87,0xda,0x2e,0x1c,0x80,0x23,0xa2,0x65,0x82,0xbf,0x1b,0x2b,0xdd,0x86,0x6f,0x00,0x00,0x09,0x00,0xe6,0xff,0xb8,0x07,0x19,0x05,0xe7,0x00,0x1e,0x00,0x2c,0x00,0x3a,0x00,0x48, +0x00,0x56,0x00,0x64,0x00,0x72,0x00,0x80,0x00,0x8e,0x00,0x21,0x40,0x15,0x38,0x49,0x2f,0x29,0x32,0x57,0x43,0x88,0x50,0x7a,0x21,0x6a,0x5f,0x81,0x70,0x0f,0x07,0x73,0x16,0x3b,0x07,0x00,0x2f,0x33,0x2f,0x33,0x12,0x17,0x39,0x31,0x30,0x13,0x34,0x37,0x36,0x36,0x37,0x36,0x33,0x32,0x17,0x1e,0x02,0x17,0x16,0x15,0x14,0x07,0x06,0x06, +0x07,0x06,0x23,0x22,0x27,0x2e,0x02,0x27,0x26,0x26,0x37,0x14,0x17,0x36,0x36,0x33,0x32,0x17,0x26,0x26,0x23,0x22,0x06,0x06,0x13,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x25,0x22,0x07,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x35,0x34,0x26,0x17,0x16,0x15,0x14,0x06,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34, +0x26,0x13,0x06,0x06,0x23,0x22,0x27,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x03,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x05,0x32,0x37,0x26,0x26,0x35,0x34,0x37,0x06,0x06,0x15,0x14,0x16,0x16,0x25,0x26,0x35,0x34,0x36,0x37,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0xe6,0x6f,0x08,0xe6,0xa2,0x79,0xa2, +0xa4,0x76,0x68,0xb6,0x6e,0x05,0x6e,0x6e,0x08,0xe6,0xa3,0x76,0xa4,0xa2,0x77,0x68,0xb6,0x70,0x05,0x34,0x3a,0x67,0x1b,0x2d,0xde,0x87,0x64,0x5a,0x23,0xa6,0x62,0x57,0x95,0x54,0x84,0x56,0x66,0x86,0xe1,0x2a,0x1c,0x57,0x94,0x55,0x62,0xa4,0x02,0x0c,0x43,0x3e,0x49,0x87,0x51,0x2d,0x5e,0x6f,0xbe,0xf7,0x2d,0xa0,0x81,0x3b,0x46,0x57, +0x94,0x54,0x71,0xc3,0x2b,0xde,0x88,0x63,0x5a,0x23,0xa6,0x61,0x5a,0x92,0x53,0x82,0x5d,0x60,0x88,0xdf,0x2b,0x1b,0x56,0x9a,0x5d,0x5b,0x9d,0xfd,0xf5,0x43,0x40,0x84,0x9f,0x2c,0x5f,0x6c,0x57,0x95,0xfe,0xdb,0x2d,0xa0,0x7f,0x3e,0x43,0x55,0x93,0x57,0x74,0x02,0xcd,0xa4,0x7b,0x9c,0xe9,0x09,0x6d,0x6c,0x05,0x6e,0xb5,0x68,0x78,0xa4, +0xa5,0x76,0xa0,0xe8,0x08,0x6c,0x6b,0x05,0x6c,0xb6,0x69,0x39,0x92,0x50,0x42,0x40,0x85,0x9e,0x2d,0x5c,0x71,0x58,0x95,0x01,0x27,0x2c,0xa0,0x82,0x3c,0x47,0x54,0x94,0x56,0x70,0xdd,0x1c,0x14,0x75,0xa6,0x60,0x67,0x58,0x24,0xa6,0x60,0x85,0xbb,0x81,0x59,0x66,0x85,0xe1,0x2a,0x1b,0x57,0x93,0x56,0x61,0xa6,0xfe,0x74,0x81,0xa1,0x2d, +0x5f,0x6d,0x58,0x96,0x51,0x46,0xfe,0x41,0x2d,0xa0,0x83,0x3e,0x45,0x55,0x94,0x56,0x70,0xdc,0x1c,0x2d,0xda,0x88,0x66,0x58,0x27,0xa3,0x61,0x54,0x94,0x56,0x80,0x53,0x6f,0x86,0xdd,0x2b,0x1b,0x55,0x97,0x55,0x64,0xa4,0xff,0xff,0x00,0x37,0xfe,0x70,0x01,0x4b,0x04,0x00,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xdf,0xf9,0x00, +0x00,0x0b,0xb6,0x01,0x00,0x12,0x04,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0x00,0x02,0xfd,0x33,0x00,0x00,0x02,0xcd,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x21,0x37,0x21,0x11,0x21,0xfd,0x33,0x05,0x9a,0xfa,0x66,0x7c,0x04,0xa2,0xfb,0x5e,0x05,0x9a,0xfa,0x66,0x7c,0x04,0xa2,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1, +0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x23,0x00,0x27,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x07,0x23,0x07,0x33,0x07,0x23,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x23,0x37,0x33,0x37,0x23,0x37,0x33,0x13,0x33,0x03,0x33,0x13,0x33,0x03,0x07,0x23,0x07,0x33,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0xf6,0x19,0xd1, +0x32,0xe1,0x1a,0xdc,0x42,0x8d,0x41,0xc8,0x3f,0x8c,0x3f,0xd2,0x14,0xd4,0x31,0xde,0x17,0xde,0x3d,0x8d,0x3d,0xc9,0x3f,0x8a,0x3d,0xa2,0xc9,0x35,0xcb,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfd,0x0f,0x6e,0xf0,0x6b,0xfe,0xd9,0x01,0x27,0xfe,0xd9,0x01,0x27,0x6b,0xf0,0x6e,0x01,0x29,0xfe,0xd7,0x01,0x29,0xfe,0xd7,0x6e, +0xf0,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x00,0x01,0x11,0x23,0x11,0x06,0x06,0x07,0x06,0x06,0x07,0x35,0x36,0x36,0x37,0x36,0x36,0x37,0x36,0x36,0x37,0x36,0x36,0x37,0x01,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x04,0x62,0xae,0x16,0x31,0x1a,0x1c,0x3e,0x25,0x19,0x29,0x14,0x14, +0x28,0x14,0x13,0x27,0x13,0x15,0x29,0x15,0xfc,0x7a,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0x04,0xb2,0xfb,0xfd,0x03,0x3f,0x0f,0x1c,0x0b,0x0b,0x13,0x09,0x8b,0x07,0x0e,0x07,0x08,0x11,0x08,0x0a,0x14,0x0b,0x0b,0x1a,0x0b,0x01,0x41,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03, +0x00,0x07,0x00,0x27,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x21,0x35,0x01,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x07,0x21,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x4a,0xfd,0x6f,0x01,0x3d,0x31,0x45,0x2c,0x13,0x10,0x28,0x42,0x32,0x49, +0x82,0x43,0x80,0xa9,0x45,0x73,0x53,0x2e,0x1f,0x3d,0x5b,0x3b,0xed,0x01,0xd6,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x20,0x84,0x01,0x23,0x2d,0x4a,0x46,0x4c,0x2f,0x15,0x38,0x33,0x23,0x3a,0x39,0x97,0x5c,0x2e,0x4e,0x65,0x37,0x3b,0x65,0x60,0x5f,0x34,0xd1,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89, +0x00,0x03,0x00,0x07,0x00,0x3e,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x94, +0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xd6,0x3a,0x95,0x48,0x21,0x4c,0x41,0x2b,0x29,0x49,0x63,0x3a,0x5d,0x58,0x34,0x57,0x3f,0x23,0x21,0x33,0x3c,0x1c,0x3b,0x82,0x35,0x36,0x81,0x49,0x3f,0x77,0x5c,0x37,0x73,0x64,0x31,0x5c,0x47,0x2a,0x3f,0x6c,0x8f,0x4f,0x50,0x92,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x4a, +0x9a,0x29,0x28,0x0e,0x25,0x40,0x31,0x31,0x45,0x2b,0x14,0x80,0x12,0x29,0x40,0x2e,0x2b,0x37,0x1f,0x0c,0x24,0x24,0x8e,0x1d,0x1d,0x1d,0x3c,0x5c,0x3f,0x64,0x80,0x17,0x05,0x26,0x3f,0x55,0x33,0x4a,0x70,0x4c,0x27,0x1b,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x12,0x00,0x15,0x00,0x00,0x13,0x11, +0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x01,0x33,0x11,0x33,0x21,0x11,0x01,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x83,0x88,0xae,0xfe,0x21,0x01,0xc4,0xc9,0x88,0xfe,0xca,0xfe,0xd7,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfb,0x2a,0xfe,0xfb,0x01,0x05,0x7f,0x02,0x79,0xfd,0x99,0x01, +0xac,0xfe,0x54,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2c,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x11,0x21,0x15,0x21,0x11,0x3e,0x02,0x32,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x94,0x06, +0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xd7,0x7b,0x7e,0x36,0x5c,0x43,0x26,0x2d,0x4b,0x64,0x37,0x33,0x88,0x02,0x41,0xfe,0x6c,0x0e,0x0c,0x09,0x0a,0x0c,0x4f,0x92,0x6e,0x42,0x47,0x75,0x98,0x52,0xa5,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x3f,0x97,0x42,0x18,0x30,0x47,0x2f,0x30,0x43,0x2c,0x14,0x09,0x02,0x16,0x86, +0xfe,0xf8,0x01,0x01,0x01,0x21,0x48,0x73,0x52,0x56,0x7a,0x4f,0x25,0x00,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2d,0x00,0x41,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02, +0x35,0x34,0x3e,0x04,0x33,0x32,0x17,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x31,0x5a,0x61,0x56,0x77,0x4a,0x22,0x03,0x12,0x30,0x3d,0x48,0x29,0x47,0x75,0x54,0x2e,0x31,0x5a,0x82,0x51,0x66,0x8e,0x57,0x27,0x19,0x32,0x4d,0x68,0x84,0x51,0x76, +0x48,0xfe,0xe2,0x26,0x4a,0x3b,0x25,0x1b,0x36,0x4e,0x33,0x30,0x47,0x2f,0x18,0x21,0x36,0x45,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfd,0x7c,0x2c,0x46,0x70,0x90,0x49,0x1f,0x34,0x27,0x16,0x2f,0x53,0x72,0x42,0x4c,0x80,0x5c,0x33,0x50,0x81,0xa2,0x52,0x45,0x8c,0x82,0x71,0x55,0x30,0x20,0xfe,0x24,0x1c,0x34,0x4a,0x2e, +0x29,0x49,0x39,0x21,0x24,0x3a,0x49,0x26,0x34,0x4b,0x31,0x17,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x0e,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x01,0x23,0x01,0x21,0x35,0x21,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0xae,0xfe,0x1a,0xad,0x01,0xb4,0xfd,0x9a,0x03,0x45, +0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfe,0x05,0xfc,0x23,0x03,0x78,0x8b,0x00,0x00,0x05,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2b,0x00,0x3f,0x00,0x53,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22, +0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x13,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfc,0x03,0x3b,0x70,0x56,0x34,0x5a,0x5e,0x34,0x53,0x3b,0x1f,0x3a, +0x62,0x7e,0x44,0x44,0x7e,0x62,0x3a,0x1f,0x3b,0x53,0x34,0x5e,0x5a,0x34,0x56,0x70,0x3b,0x1e,0x37,0x28,0x18,0x13,0x26,0x37,0x25,0x25,0x38,0x25,0x13,0x18,0x28,0x37,0x1e,0x28,0x44,0x32,0x1d,0x1a,0x30,0x46,0x2b,0x2c,0x45,0x30,0x1a,0x1d,0x32,0x44,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfe,0x2b,0x21,0x40,0x5e,0x3d, +0x50,0x86,0x23,0x17,0x3a,0x47,0x54,0x31,0x43,0x64,0x42,0x20,0x20,0x42,0x64,0x43,0x31,0x54,0x47,0x3a,0x17,0x23,0x86,0x50,0x3d,0x5e,0x40,0x21,0xfe,0x4a,0x0a,0x24,0x31,0x3c,0x21,0x13,0x2a,0x24,0x18,0x18,0x24,0x2a,0x13,0x21,0x3c,0x31,0x24,0xfe,0x11,0x19,0x2a,0x37,0x1e,0x24,0x39,0x30,0x2a,0x15,0x15,0x2a,0x30,0x39,0x24,0x1e, +0x37,0x2a,0x19,0x00,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2d,0x00,0x41,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x27,0x01,0x32,0x3e, +0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xdb,0x5a,0x61,0x55,0x78,0x4a,0x22,0x03,0x12,0x30,0x3d,0x48,0x29,0x47,0x75,0x54,0x2e,0x31,0x5a,0x82,0x51,0x66,0x8e,0x57,0x27,0x19,0x32,0x4d,0x68,0x84,0x51,0x76,0x48,0x01,0x1e,0x26,0x4a,0x3b,0x25,0x1b,0x36,0x4e, +0x33,0x30,0x47,0x2f,0x18,0x21,0x36,0x45,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0xc2,0x2c,0x46,0x70,0x8f,0x4a,0x1f,0x34,0x27,0x16,0x2f,0x53,0x72,0x42,0x4c,0x80,0x5c,0x33,0x50,0x81,0xa2,0x52,0x45,0x8c,0x82,0x71,0x55,0x30,0x20,0x01,0xdc,0x1c,0x34,0x4a,0x2e,0x28,0x4a,0x39,0x21,0x24,0x3a,0x49,0x26,0x34,0x4b, +0x31,0x17,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x10,0x00,0x1a,0x00,0x1e,0x00,0x22,0x00,0x00,0x25,0x22,0x26,0x27,0x26,0x35,0x34,0x36,0x37,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x06,0x03,0x22,0x11,0x14,0x16,0x33,0x32,0x11,0x34,0x26,0x01,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x03,0xd1,0x55,0x7f,0x30,0x5d,0x2f, +0x32,0x62,0xb5,0x01,0x5c,0x2f,0x32,0x63,0xa0,0xc1,0x5f,0x5e,0xb9,0x58,0xfc,0x57,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0x9e,0x40,0x40,0x7f,0xf5,0x87,0xc8,0x46,0x89,0xfd,0xfa,0x80,0xc2,0x44,0x86,0x03,0x8e,0xfe,0x6d,0xbd,0xbc,0x01,0x7f,0xc9,0xc4,0x01,0xc7,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xff,0xff,0x00,0x90,0x01,0xfa, +0x02,0xb2,0x02,0x7b,0x02,0x06,0x00,0x10,0x00,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9b,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26, +0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23, +0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x1e,0x05,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x08, +0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20, +0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x01, +0xeb,0x13,0x1e,0x19,0x13,0x0c,0x07,0x7d,0x0e,0x1c,0x2b,0x1e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d, +0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x4e,0x8b,0x81,0x7f,0x88,0x94,0x57,0xfe,0xd1,0x01, +0x29,0x76,0xcc,0xc7,0xcf,0x7a,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9b,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34, +0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06, +0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x21,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x08,0xca,0x68, +0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e, +0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xd5,0x02,0x84, +0xfe,0x1b,0x14,0x1e,0x14,0x0b,0x7d,0x0e,0x1c,0x2b,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13, +0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x85,0x5b,0xa1,0xa7,0xb6,0x6e,0xfe,0xd1,0x01,0x29,0x76,0xcc, +0xc7,0xcf,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xc4,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26, +0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06, +0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16, +0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x27,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0, +0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27, +0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xd3,0x11,0x1d,0x0c,0x11,0x1e,0x0e,0x21,0x30,0x1e,0x0e,0x1d,0x7d,0x1d,0x19,0x18,0x29,0x13,0x21,0x2f,0x1f,0x0d,0x1c,0x7d,0x1d,0x1e,0x3c,0x56,0x38,0x24,0x52,0x30,0x39, +0x4f,0x21,0x23,0x09,0x0d,0x09,0x05,0x7d,0x0e,0x1c,0x2b,0x1e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d, +0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x49,0x80,0x3d,0x04,0x03,0x16,0x26,0x33,0x1d,0x43, +0x3e,0x47,0x45,0x41,0x33,0x07,0x06,0x16,0x26,0x33,0x1d,0x43,0x3e,0x47,0x45,0x31,0x56,0x3f,0x24,0x13,0x16,0x28,0x07,0x36,0x6d,0x74,0x7f,0x48,0xfe,0xd1,0x01,0x29,0x76,0xcc,0xc7,0xcf,0x7a,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b, +0x00,0xbd,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14, +0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27, +0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x0e,0x05,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0, +0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f, +0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x02,0x63,0x43,0x5f,0x40,0x24,0x14,0x05,0x22,0x39,0x46, +0x24,0x3c,0x61,0x2f,0x65,0x72,0x39,0x6f,0x59,0x38,0x16,0x35,0x59,0x43,0x40,0x56,0x32,0x15,0x23,0x57,0x92,0x6e,0x5c,0x6c,0x37,0x10,0x19,0x42,0x73,0x5b,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16, +0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20, +0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x03,0xbf,0x3f,0x65,0x53,0x40,0x2f,0x21,0x09,0x22,0x2a,0x18,0x08,0x10,0x0c,0x84,0x24,0x18,0x33,0x51,0x38,0x21,0x54,0x65,0x76,0x42,0x1e,0x36,0x37,0x3b,0x21,0x2b,0x5b,0x59,0x54,0x25,0x8d,0x1c,0x38,0x33,0x29,0x0c,0x14,0x20,0x2b,0x39,0x2d,0x00,0x00,0x0a,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16, +0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xa1,0x00,0xb5,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17, +0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21, +0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34, +0x2e,0x02,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39, +0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20, +0x20,0x2f,0x01,0xe9,0x39,0x7c,0x66,0x43,0x31,0x5b,0x84,0x52,0x51,0x7c,0x55,0x2b,0x1f,0x34,0x45,0x4b,0x4c,0x20,0x20,0x49,0x3f,0x29,0x21,0x3a,0x4c,0x2b,0x3b,0x55,0x37,0x1a,0x2f,0x45,0x4e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e, +0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20, +0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0x24,0x44,0x84,0xc1,0x7d,0x4d,0x7f,0x5b,0x31,0x2d,0x51,0x73,0x48,0x54,0x92,0x7a,0x60,0x42,0x23,0x81,0x3c,0x6a,0x96,0x59,0x34,0x4a,0x2e,0x15,0x1b,0x32,0x46,0x2c,0x5f,0x98,0x68,0x38,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f, +0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xa1,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14, +0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01, +0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x2e,0x07,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68, +0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c, +0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x02,0xb1,0x13,0x1e,0x16,0x11,0x0b,0x09,0x06,0x04,0x03,0x02,0xfe,0x15,0x02,0x64,0x04,0x04,0x06,0x0a,0x10,0x1b,0x27,0x1b, +0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb, +0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x01,0x49,0x52,0x84,0x72,0x63,0x61,0x62,0x71,0x83,0x51,0x43,0x85,0x9e,0x70,0xac,0x93,0x84,0x91,0xab,0x6e,0x00,0x00,0x09, +0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9d,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33, +0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10, +0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x16,0x12,0x17,0x33,0x36,0x12,0x37,0x33,0x02,0x02,0x03,0x23,0x26,0x0a,0x02,0x27,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e, +0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05, +0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xce,0x50,0x8c,0x3e,0x05,0x41,0x8a, +0x50,0x7e,0x66,0xad,0x4d,0x77,0x29,0x54,0x57,0x5c,0x31,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d, +0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xba,0xd9,0xfe,0x34,0xf8,0xf8,0x01,0xcc,0xd9,0xfe,0xe6,0xfd, +0xc7,0xfe,0xd8,0x9b,0x01,0x27,0x01,0x1d,0x01,0x14,0x88,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9d,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34, +0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27, +0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x26,0x02,0x27,0x23,0x06,0x02,0x07,0x23,0x36, +0x1a,0x02,0x37,0x33,0x12,0x12,0x13,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6, +0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e, +0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x03,0x06,0x51,0x8b,0x3e,0x05,0x41,0x8a,0x50,0x7f,0x34,0x5d,0x57,0x52,0x27,0x77,0x51,0xad,0x62,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e, +0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21, +0x2e,0x2f,0x01,0x49,0xda,0x01,0xcc,0xf7,0xf8,0xfe,0x34,0xd9,0x8e,0x01,0x1a,0x01,0x1e,0x01,0x21,0x94,0xfe,0xcb,0xfd,0xc9,0xfe,0xf1,0x00,0x0a,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xaa,0x00,0xbf,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16, +0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07, +0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06, +0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x23,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x03,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28, +0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27, +0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x03,0x51,0x80,0x20,0x2c,0x1c,0x11,0x07,0x64,0x60,0x40,0x71,0x54,0x32,0x29,0x4d,0x70,0x48, +0x46,0x71,0x30,0x1a,0x1e,0x12,0x09,0x05,0x06,0x10,0x1e,0x32,0xe3,0x03,0x06,0x08,0x0c,0x08,0x1c,0x58,0x38,0x23,0x3c,0x2c,0x19,0x20,0x38,0x4d,0x2e,0x26,0x53,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f, +0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80, +0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x01,0x49,0x4e,0x97,0x8d,0x83,0x39,0x2f,0x2a,0x4d,0x72,0x48,0x40,0x7b,0x60,0x3b,0x40,0x4c,0x28,0x50,0x57,0x62,0x3b,0x41,0x91,0xa2,0xb5,0x02,0x43,0x22,0x34,0x2d,0x28,0x15,0x46,0x4e,0x1e,0x34,0x46,0x27,0x2c,0x45,0x30,0x19,0x13,0x00,0x01,0x00,0x53,0x00,0x00,0x04,0x2d,0x05,0x9a,0x00,0x1d, +0x00,0x70,0x40,0x25,0x1b,0x00,0x1a,0x01,0x1a,0x03,0x18,0x02,0x0f,0x19,0x1f,0x19,0x02,0x19,0x40,0x0f,0x12,0x48,0x19,0x19,0x15,0x17,0x04,0x16,0x05,0x16,0x14,0x07,0x15,0x06,0x06,0x00,0x05,0x10,0x05,0x02,0x05,0xb8,0xff,0xc0,0x40,0x1a,0x0f,0x12,0x48,0x05,0x05,0x02,0x01,0x60,0x15,0x70,0x15,0x02,0x0d,0x15,0x01,0x01,0x15,0x0d, +0x03,0x13,0x1c,0x03,0x08,0x91,0x13,0x12,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x2f,0x2b,0x5d,0x33,0x11,0x12,0x39,0x39,0x32,0x11,0x12,0x39,0x39,0x11,0x33,0x2f,0x2b,0x5d,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x25,0x15,0x05,0x15,0x25,0x15,0x05,0x11,0x33,0x32,0x37,0x36,0x37, +0x33,0x06,0x07,0x06,0x23,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11,0x33,0x01,0xea,0x01,0x58,0xfe,0xa8,0x01,0x58,0xfe,0xa8,0x23,0xa3,0x68,0x66,0x0b,0xa4,0x14,0x93,0x90,0xee,0xc6,0xef,0xef,0xef,0xef,0xa8,0x04,0x1d,0x89,0x99,0x89,0x83,0x89,0x99,0x88,0xfe,0x2e,0x69,0x69,0xb9,0xfe,0x92,0x92,0x02,0x26,0x5e,0x98,0x5f, +0x83,0x5f,0x98,0x5f,0x01,0xc0,0x00,0x02,0x00,0xbb,0x00,0xf7,0x03,0xf5,0x04,0x66,0x00,0x0b,0x00,0x1b,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x59,0x6e,0x8f,0x93,0x6a,0x6a,0x91,0x8d,0x6e,0x71,0xbe,0x6d,0x6f, +0xbf,0x6e,0x6e,0xbf,0x71,0x6e,0xbe,0x03,0xcc,0xa2,0x7a,0x77,0xa8,0xa7,0x78,0x78,0xa4,0x9a,0x73,0xcc,0x78,0x76,0xcd,0x75,0x76,0xcc,0x76,0x76,0xcd,0x74,0x00,0x01,0x01,0x01,0xfe,0xe6,0x03,0xae,0x05,0x9c,0x00,0x29,0x00,0x00,0x01,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x07, +0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0xe6,0xe5,0x50,0x94,0x55,0x5b,0x98,0x57,0x48,0x86,0x9c,0xf0,0xa4,0x56,0x87,0x1c,0x1c,0x2a,0x6e,0xb5,0x75,0x9d,0xad,0x4f,0x55,0x49,0x45,0x59,0x50,0x47,0x02,0xf7,0x8f,0xd7,0x5b,0x92,0x52,0x58,0xa4,0x68,0x5f,0xb8,0xc0, +0xa7,0xd2,0xd2,0x5e,0x6a,0x68,0x52,0x27,0x3b,0x23,0x2c,0x4b,0x75,0xa9,0x67,0x9d,0xd7,0xab,0x5b,0x63,0x6c,0x60,0x49,0x42,0x7d,0x2c,0x00,0x01,0x00,0xaf,0xfe,0xdb,0x04,0x00,0x05,0x9c,0x00,0x21,0x00,0x00,0x01,0x02,0x03,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16, +0x16,0x15,0x14,0x02,0x07,0x07,0x16,0x12,0x17,0x03,0x7b,0xee,0x9a,0x46,0x74,0x42,0x4a,0x3c,0x7c,0x50,0x85,0x8d,0xc3,0x9a,0x88,0x96,0x31,0xb1,0xa4,0x8f,0xea,0x83,0xca,0xb0,0x01,0x72,0x9e,0x66,0xfe,0xdb,0x01,0x56,0x01,0x6c,0x02,0x47,0x72,0x3b,0x3b,0x4a,0xd2,0x2a,0xb4,0x7d,0x9c,0xc8,0x49,0x94,0x4c,0x85,0xe9,0x86,0xa9,0xfe, +0xfa,0x3e,0x03,0xed,0xfe,0xf6,0x89,0x00,0x00,0x01,0x00,0xc2,0xfe,0xde,0x03,0xee,0x05,0x88,0x00,0x2f,0x00,0x00,0x01,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14, +0x06,0x07,0x15,0x16,0x16,0x17,0x03,0x42,0x5a,0x71,0x4b,0x81,0x9d,0x4c,0x39,0x3a,0x83,0x3a,0x5f,0x61,0x95,0x88,0xfe,0xc3,0x7a,0x8c,0x86,0x82,0xfe,0xd2,0x01,0x29,0x89,0xc3,0x65,0x84,0x62,0x74,0x98,0x7c,0x27,0x93,0x33,0xfe,0xde,0x8b,0x93,0x51,0x05,0x6b,0x51,0x38,0x48,0x57,0x52,0x19,0x85,0x5f,0x7b,0x83,0x97,0x66,0x5c,0x5a, +0x5f,0x96,0x53,0x98,0x64,0x9d,0x61,0x06,0x2b,0xc0,0x70,0x84,0xcc,0x24,0x04,0x29,0xb9,0x4c,0x00,0x02,0x00,0x6a,0xff,0xf3,0x04,0x46,0x05,0x88,0x00,0x25,0x00,0x31,0x00,0x00,0x01,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16, +0x16,0x17,0x3e,0x02,0x35,0x27,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x04,0x3f,0x07,0x4d,0x8b,0xa5,0x7e,0x69,0x56,0x98,0x59,0x9c,0xc4,0x65,0x80,0xae,0x89,0x4d,0x0a,0xa6,0x0e,0x41,0x77,0x96,0x92,0x77,0x42,0x04,0xfd,0xfe,0x64,0x57,0x52,0x6e,0x55,0x67,0x68,0x57,0x05,0x88,0x25,0x2e,0x66,0xba,0xb3,0x99, +0x74,0xc1,0x63,0x5d,0x91,0x50,0xb3,0x8f,0x5f,0xb9,0x79,0x94,0xa5,0xae,0x61,0x41,0x39,0x3e,0x32,0x51,0x92,0x8e,0x80,0x84,0x9a,0xa4,0x5b,0x44,0xfb,0xa6,0x4b,0x5a,0x63,0x4c,0x42,0x8f,0x5c,0x63,0x92,0x00,0x00,0x01,0x00,0x64,0xfe,0xdb,0x04,0xef,0x05,0x88,0x00,0x25,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37, +0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x12,0x12,0x17,0x07,0x26,0x02,0x27,0x35,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x37,0x01,0x5a,0x2e,0x24,0x8f,0x7f,0x35,0x66,0x24,0x42,0x48,0x3e,0x48,0x5f,0x3a,0x54,0xb1,0x64,0x80,0x62,0xc9,0x25,0x37,0x8c,0x3f,0x82,0xc8,0x6f,0x2b,0x23,0x05,0x88,0xb2,0xe2,0x63,0xc9, +0xd5,0x30,0x2c,0x60,0x6b,0x4b,0x5f,0x7b,0x5c,0x5f,0x5b,0xfe,0xf9,0xfe,0x91,0x85,0x5d,0x86,0x01,0xcd,0x90,0x01,0x2f,0x35,0x91,0x01,0x04,0x9c,0x6f,0x01,0x11,0x7c,0x00,0x01,0x00,0x39,0xfe,0xde,0x04,0x77,0x05,0x88,0x00,0x36,0x00,0x00,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x07,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x03,0x0a,0xed,0x73,0x7c,0x9d,0x7c,0x45,0x37,0x2a,0x3c,0x39,0x52,0x73,0x45,0x57,0x92,0x7d,0x3f,0x7c,0x2f,0x60,0x5a,0x80,0xd5,0x77,0x3c,0x4b, +0x63,0x75,0x3b,0x64,0xa9,0x85,0xe0,0xca,0x7e,0x7e,0x43,0x96,0x7d,0x01,0x1a,0x02,0xe0,0x75,0x6d,0x7e,0xa2,0x13,0x56,0x4a,0x3f,0x49,0x8f,0x5a,0x57,0x35,0xad,0xbd,0x5c,0x44,0xd4,0x6d,0x1c,0x75,0xce,0x7d,0x51,0x87,0x3c,0x06,0x26,0xa8,0x6f,0x4d,0x6c,0x47,0x2a,0x96,0x22,0x4a,0x3f,0x5e,0x72,0x00,0x00,0x01,0x00,0x2e,0xff,0xf8, +0x04,0x82,0x05,0x88,0x00,0x29,0x00,0x00,0x01,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x02,0x11,0x33,0x10,0x12,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x37,0x03,0x8c,0x16,0x1d,0x78,0xaf,0x5e,0xa8,0x84,0x72,0xb0,0x60,0x7d,0xe2, +0x8f,0xcd,0xfe,0xea,0x83,0x9f,0x69,0xcd,0x93,0x95,0xb9,0x3e,0x6b,0x3e,0x3f,0x4c,0x43,0x75,0x46,0x1a,0x01,0xd4,0x05,0x62,0xae,0x67,0x89,0xb1,0x8b,0xfc,0x9c,0xb6,0xfe,0xe8,0x97,0x01,0x43,0x02,0x95,0x01,0xb8,0xfe,0x5a,0xfd,0xc3,0xfe,0xeb,0x01,0x05,0xce,0x6f,0xb1,0x64,0x59,0x4c,0x48,0x66,0x36,0x02,0x00,0x00,0x01,0x00,0x79, +0xff,0xa1,0x04,0x37,0x05,0x96,0x00,0x16,0x00,0x00,0x01,0x00,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x00,0x13,0x03,0x90,0xfd,0xef,0x52,0x19,0x95,0x73,0x6c,0xb9,0x6d,0x89,0x81,0xfe,0xfd,0x95,0x75,0xc1,0x6f,0x82,0x01,0x23,0xe9,0x05,0x39,0xfd,0x2c,0xc9,0x3c,0x3b,0x6c, +0x83,0x89,0xb4,0x57,0xc7,0xb4,0x64,0xb4,0x72,0x72,0x01,0x05,0x01,0xb2,0x01,0x42,0x00,0x01,0x00,0x81,0xfe,0xe6,0x04,0x2e,0x05,0x9c,0x00,0x27,0x00,0x00,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x16, +0x15,0x14,0x06,0x07,0x01,0xfc,0xc5,0x6f,0x59,0x60,0x77,0x38,0x86,0xcc,0xd0,0x7a,0x38,0x56,0x87,0x36,0x29,0x54,0xb4,0xec,0xa0,0x49,0xcf,0xa2,0x6b,0xaa,0x5f,0x99,0x90,0x03,0x32,0x54,0xa6,0x60,0x76,0x84,0x63,0x40,0x7e,0xa8,0xd8,0xdd,0x99,0x74,0x37,0x6b,0x6b,0x52,0x4e,0x34,0x22,0x4f,0x69,0xbf,0xfa,0xd2,0xb0,0x5a,0xa5,0xce, +0x61,0xad,0x67,0x82,0xc5,0x36,0x00,0x02,0x00,0xfd,0x00,0x93,0x05,0x06,0x04,0xc9,0x00,0x0e,0x00,0x1e,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x04,0x66,0x55,0x9d,0x66,0x6c,0xa8,0x5e,0xba,0x96,0x67, +0xaf,0x64,0xfe,0x79,0x8c,0xdd,0x79,0x8c,0xfa,0x96,0x8e,0xe2,0x7d,0x93,0xff,0x02,0xc0,0x64,0xa4,0x5d,0x66,0xb7,0x6c,0x9b,0xcb,0x68,0xb6,0xfe,0x3f,0x8a,0xf4,0x8e,0x98,0xff,0x93,0x87,0xed,0x90,0x99,0xfe,0xfb,0x94,0x00,0x01,0x01,0x70,0xff,0xe7,0x04,0x94,0x05,0xb1,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x17,0x16,0x16,0x15,0x14, +0x02,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x02,0x3e,0x12,0x5d,0x74,0xc3,0xb0,0x76,0xb2,0x6a,0x5f,0x73,0xa2,0x73,0x35,0x40,0x3b,0x3f,0x75,0x8e,0x9d,0x6a,0x3c,0x59,0x3d,0x37,0x47,0x22,0x23,0x04,0xd3,0x20,0x56,0x59,0x98, +0xfe,0x81,0x7a,0xfe,0xfa,0x86,0x5a,0x4b,0x57,0x74,0x10,0x4d,0x54,0x3d,0x77,0x7c,0x74,0x7f,0x6e,0x6a,0x35,0x44,0x55,0x3f,0x36,0x25,0x2d,0x11,0x00,0x01,0x00,0xb9,0xff,0xa7,0x05,0x4a,0x05,0xb1,0x00,0x2d,0x00,0x00,0x01,0x14,0x06,0x07,0x15,0x16,0x04,0x17,0x07,0x26,0x24,0x24,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x36,0x36,0x35, +0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x1e,0x05,0x04,0x88,0xcc,0xcf,0xc8,0x01,0x3c,0x59,0x68,0x4d,0xfe,0x8e,0xfe,0x5e,0xc8,0x10,0x31,0x85,0x3c,0x36,0x7e,0xf5,0x7c,0x41,0x75,0xa9,0x97,0x82,0x46,0x56,0x42,0x36,0x46,0x22,0x23,0x01,0x34,0x8a,0x94,0x8f,0x71,0x46,0x03,0x4b,0x7e, +0xc8,0x3f,0x06,0x4b,0xe2,0x83,0x69,0x71,0xfa,0x9c,0x12,0xa5,0x03,0x19,0x06,0x4b,0x74,0x49,0x36,0x48,0x31,0x24,0x20,0x3c,0x57,0x41,0x44,0x5b,0x42,0x2f,0x1d,0x38,0x12,0x06,0x07,0x14,0x24,0x37,0x52,0x72,0x00,0x01,0x00,0x7d,0x00,0x93,0x05,0x86,0x05,0x36,0x00,0x23,0x00,0x00,0x13,0x12,0x00,0x33,0x32,0x36,0x36,0x35,0x34,0x26, +0x27,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x03,0x37,0xf6,0x96,0x01,0x40,0xce,0x64,0x97,0x53,0x98,0x83,0x09,0x30,0x8d,0x5b,0x61,0x83,0xc7,0xa8,0x95,0xe1,0x79,0x7a,0xdf,0x8e,0xb4,0xfe,0xce,0xf2,0x4a,0x73,0x05,0x36,0xfd,0xd2,0xfe,0x25,0x6c,0xc0, +0x70,0x9e,0xe3,0x18,0x0e,0x3c,0x4a,0x5b,0x83,0x93,0x6a,0x80,0x9c,0x91,0xfe,0xfe,0x9f,0xa0,0xfe,0xf5,0x99,0xf7,0x01,0xf5,0x01,0x5e,0x59,0x00,0x00,0x03,0x00,0xff,0x00,0x4c,0x05,0x04,0x05,0xb1,0x00,0x1d,0x00,0x2b,0x00,0x38,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26, +0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x26,0x27,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x14,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0xf1,0x95,0x7e,0x8a,0xee,0x8f,0x8e,0xed,0x83,0x8f,0xa7,0x87,0x7a,0x7f,0xe0,0x80,0x82,0xd2,0x77,0x6e,0x7f,0x77,0x46,0x80,0x9b, +0x9d,0x84,0x47,0xd8,0xa0,0x94,0xbd,0xfd,0x6c,0x3f,0x76,0x9f,0x9c,0x7a,0xb7,0x89,0x84,0xa6,0x03,0x32,0x3f,0xa8,0x77,0x75,0xb3,0x60,0x62,0xb1,0x75,0x7e,0xaa,0x37,0x06,0x34,0x91,0x65,0x62,0x98,0x54,0x51,0x94,0x64,0x6b,0x92,0x33,0xfe,0x98,0x44,0x63,0x4a,0x31,0x28,0x44,0x61,0x47,0x71,0x91,0x85,0x03,0x0b,0x37,0x50,0x3d,0x2f, +0x2c,0x71,0x54,0x4c,0x62,0x5e,0x00,0x02,0x00,0x8c,0x00,0x01,0x05,0x78,0x05,0xb1,0x00,0x1f,0x00,0x32,0x00,0x00,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x15,0x07,0x0e,0x02,0x15,0x14,0x16,0x33,0x17,0x15,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x00,0x37,0x17,0x01,0x14,0x16,0x16,0x33,0x37,0x26,0x26,0x35,0x34,0x36, +0x37,0x26,0x26,0x35,0x35,0x37,0x06,0x02,0x03,0xb5,0x2f,0x84,0x5f,0x18,0x2e,0x34,0x95,0x70,0xcb,0x8f,0x48,0x7a,0x50,0x79,0xd2,0xd1,0xb0,0xfe,0xdb,0xa5,0xa5,0x01,0x2d,0xc2,0x95,0xfd,0x75,0x78,0xde,0x95,0x43,0x42,0x5a,0x83,0x97,0x70,0x82,0x02,0xd9,0xe3,0x05,0x5e,0x5c,0x47,0x5d,0x86,0x0d,0x1f,0x4b,0x06,0x49,0x7d,0x78,0x77, +0x40,0x4c,0x80,0x80,0x06,0x6b,0x95,0x01,0x01,0x95,0x91,0x01,0x4c,0x01,0x35,0x73,0x4d,0xfc,0xcc,0x76,0xb8,0x63,0x03,0x36,0xa2,0x4d,0x62,0xc2,0x6e,0x2a,0xaa,0x71,0x15,0x15,0xac,0xfe,0xac,0x00,0x00,0x01,0x00,0x1f,0xff,0xe5,0x05,0xe4,0x05,0xb1,0x00,0x2d,0x00,0x00,0x01,0x11,0x14,0x33,0x32,0x36,0x37,0x33,0x16,0x12,0x15,0x14, +0x02,0x06,0x23,0x20,0x00,0x03,0x37,0x33,0x12,0x21,0x32,0x36,0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0x4d,0x23,0x68,0xbd,0x68,0x0e,0x66,0x73,0x87,0xff,0xae,0xfe,0xae,0xfe,0x39,0x78,0x77,0x06,0xfa,0x02,0x1c,0x7a,0xb6,0x62,0x34,0x47,0xc2,0x66,0x74, +0x85,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x04,0x89,0xfe,0xd2,0x73,0x93,0xa4,0x59,0xfe,0xf7,0x98,0xa6,0xfe,0xf9,0x93,0x02,0x35,0x02,0x51,0x64,0xfb,0xb5,0x6f,0xc6,0x7b,0x7a,0x6a,0x60,0x6e,0x8f,0x78,0x01,0x72,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x00,0x02,0x00,0xf5,0xff,0xe8,0x05,0x0e,0x05,0xb1,0x00,0x21,0x00,0x30, +0x00,0x00,0x01,0x06,0x23,0x22,0x24,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x03,0x15,0x11,0x17,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x32,0x37,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x06,0x15,0x17,0x16,0x03,0xbc,0x63,0x96,0x5c,0xfe,0xe1,0x1b,0x19,0x1f,0x62,0x9a,0xc7,0x73,0x1f,0x58,0x59, +0x3e,0x27,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x57,0x62,0xfe,0xfb,0xa2,0x63,0x29,0x37,0x3a,0x11,0x61,0xae,0x65,0x07,0x8c,0x02,0x74,0x1d,0x2a,0x13,0x1c,0x5b,0x2a,0x65,0xfc,0xb7,0x64,0x35,0x62,0x84,0xb2,0x74,0xfd,0xb2,0x4c,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0x01,0xe2,0x27,0x57,0x75,0xa0,0x63,0x2c,0x87,0xe9,0x83, +0x0a,0x25,0x00,0x02,0x00,0x3a,0xff,0xe8,0x05,0xca,0x05,0xb1,0x00,0x31,0x00,0x41,0x00,0x00,0x13,0x27,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x37,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x03, +0x35,0x25,0x22,0x07,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x36,0x35,0x27,0x26,0x26,0xe8,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x78,0xa1,0x90,0x80,0x26,0x52,0x54,0x58,0x4c,0x0b,0x82,0x06,0x28,0xad,0x90,0x30,0x1b,0x0e,0x62,0x99,0xc7,0x71,0x1f,0x58,0x59,0x3e,0x27,0x01,0xca,0x9b,0x8b,0x29,0x37,0x3a,0x11,0x61,0xab, +0x65,0x07,0x3b,0x6f,0x04,0x71,0x52,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0xfe,0xa4,0x36,0x3c,0x18,0x12,0x3a,0x3b,0x1d,0x1f,0x06,0x62,0x4f,0x52,0x81,0x9b,0x06,0x19,0x2a,0x64,0xff,0xb6,0x63,0x35,0x62,0x84,0xb2,0x74,0x97,0x40,0x57,0x75,0xa0,0x63,0x2c,0x85,0xeb,0x83,0x0a,0x20,0x1e,0x00,0x01,0x00,0xaf,0xff,0xe7,0x05,0x54, +0x05,0xb1,0x00,0x3c,0x00,0x00,0x01,0x22,0x06,0x06,0x15,0x14,0x17,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x20,0x13,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x14,0x16,0x17,0x04,0x16,0x16,0x15,0x14,0x06,0x06,0x23, +0x2e,0x02,0x02,0x3f,0x41,0x6f,0x42,0x0c,0x0b,0x0f,0x4e,0x2d,0x41,0x5d,0x5f,0x4b,0x4d,0x90,0x56,0x6d,0xb2,0x6d,0x01,0x6e,0x4c,0x56,0x6a,0x55,0xac,0xff,0xfe,0xe1,0xe2,0x4f,0x44,0x39,0x48,0x22,0x23,0x01,0x94,0xa2,0x01,0x37,0xeb,0x7a,0x87,0xd5,0x85,0x23,0x4e,0x72,0x02,0x1f,0x45,0x7a,0x41,0x28,0x25,0x02,0x2a,0x36,0x66,0x44, +0x47,0x58,0x57,0x95,0x59,0x6a,0xc4,0x63,0xfd,0xec,0x23,0xa6,0x5f,0x42,0x6e,0x61,0x5f,0x69,0xcd,0x8a,0x54,0x5c,0x3e,0x37,0x25,0x2d,0x11,0x06,0x3f,0x6c,0x39,0x6e,0x8c,0xaf,0x6d,0x81,0xf5,0x7c,0xe5,0xe2,0x71,0x00,0x00,0x02,0x00,0xb7,0x00,0xe6,0x04,0x0d,0x04,0x23,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26, +0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x0d,0xf8,0xb3,0xb3,0xf8,0xf0,0xbb,0xbb,0xf0,0xa0,0x93,0x78,0x77,0x94,0x97,0x74,0x73,0x98,0x02,0x83,0xae,0xef,0xef,0xae,0xbb,0xe5,0xe5,0xbb,0x71,0xab,0xad,0x6f,0x77,0xa5,0xa8,0x00,0x02,0x01,0x2a,0xff,0xba,0x03,0x99,0x05,0x1a, +0x00,0x15,0x00,0x1e,0x00,0x00,0x05,0x24,0x11,0x35,0x12,0x35,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x10,0x03,0x15,0x14,0x17,0x01,0x35,0x34,0x23,0x22,0x15,0x14,0x33,0x32,0x03,0x99,0xfe,0xeb,0x0a,0x25,0x25,0x7e,0x9c,0x9f,0x7c,0x7a,0x72,0x0a,0x72,0xfe,0xfa,0x4e,0x7b,0x78,0x21,0x46,0x24,0x01,0x11,0x0c,0x01, +0x1e,0xe4,0x08,0x9b,0x7d,0x74,0x99,0xb2,0xe0,0xfe,0xf0,0xfe,0x83,0x07,0x8e,0x0d,0x03,0x44,0x25,0xb8,0x6d,0x7c,0x00,0x01,0x00,0x7d,0xff,0xbe,0x04,0x46,0x04,0xee,0x00,0x20,0x00,0x00,0x25,0x07,0x26,0x27,0x26,0x27,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x36,0x33,0x32,0x00, +0x15,0x10,0x05,0x16,0x16,0x04,0x46,0x28,0x79,0x5b,0x19,0xa2,0x6c,0x6f,0xd9,0xe9,0x79,0x6b,0x6b,0x80,0xc3,0xa3,0xbc,0x8f,0x65,0x72,0xbe,0x80,0xe5,0x01,0x21,0xfe,0xf6,0x65,0x6d,0x58,0x9a,0x11,0x43,0x12,0x98,0x24,0x91,0x8e,0x45,0x38,0xc5,0x73,0xa4,0xc8,0x77,0x7c,0x57,0x44,0xfe,0xda,0xe6,0xfe,0xd1,0xad,0x63,0x3e,0x00,0x01, +0x00,0x8b,0xff,0x7b,0x04,0x39,0x05,0x04,0x00,0x2a,0x00,0x00,0x01,0x14,0x05,0x16,0x17,0x07,0x26,0x26,0x27,0x07,0x22,0x27,0x26,0x35,0x34,0x33,0x32,0x17,0x24,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x16,0x04,0x39,0xfe,0xdb,0x41,0x7d,0x29,0x72,0x96, +0x62,0x4c,0x8c,0x41,0x77,0xaa,0x6d,0xb3,0x01,0x20,0xfe,0xca,0xcd,0xeb,0x7c,0x94,0x82,0x49,0xa0,0xa8,0xbb,0x38,0xd6,0xc5,0x02,0x0b,0x57,0x3c,0x9b,0x01,0x8f,0xe9,0x41,0x2e,0x22,0x9a,0x1f,0x51,0x61,0x01,0x12,0x22,0x65,0x78,0x6e,0x14,0x8d,0xcb,0xa1,0x5a,0x53,0x7c,0x29,0x17,0x47,0x97,0x50,0xfe,0xa4,0x46,0x9b,0x24,0x77,0x00, +0x00,0x02,0x00,0xb4,0xff,0xba,0x04,0x10,0x05,0x1e,0x00,0x1c,0x00,0x29,0x00,0x00,0x01,0x02,0x01,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x00,0x03,0x33,0x16,0x16,0x17,0x3e,0x02,0x37,0x03,0x34,0x27,0x26,0x27,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0x30,0xfe,0xef,0x81,0x3d,0x1f, +0x5c,0x9b,0x53,0x54,0x9a,0x5c,0x1f,0x3e,0x80,0xfe,0xeb,0x2c,0xaa,0x22,0x76,0x6f,0x57,0x55,0x3d,0x18,0x5a,0x38,0x11,0x5e,0x72,0x3b,0x67,0x43,0x43,0x67,0x05,0x1e,0xfe,0x81,0xfe,0xdc,0x95,0x64,0x63,0x30,0x51,0x8f,0x55,0x55,0x8f,0x51,0x30,0x63,0x65,0x94,0x01,0x28,0x01,0x7b,0xb6,0xfa,0x76,0x5a,0x8d,0xba,0x85,0xfb,0xd1,0x3b, +0x50,0x18,0x6c,0x84,0x50,0x3b,0x38,0x5e,0x5c,0x00,0x00,0x01,0x00,0x79,0xff,0xf6,0x04,0x4b,0x04,0xe1,0x00,0x1a,0x00,0x00,0x05,0x23,0x11,0x06,0x23,0x22,0x24,0x27,0x37,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x04,0x4b,0xa0,0x7b,0xe0,0xa7,0xfe,0xf9,0x29,0x4f,0x39,0x41,0x23, +0xaa,0x5a,0x65,0x1f,0x9f,0x56,0x57,0xd7,0x2d,0xa0,0x0a,0x01,0x53,0x2a,0x8e,0x7e,0x69,0x66,0x92,0x50,0xde,0x27,0xac,0xa9,0xcd,0x98,0x31,0x37,0x22,0x16,0x02,0xea,0x00,0x01,0x00,0x9d,0xff,0xf6,0x04,0x26,0x06,0x30,0x00,0x2d,0x00,0x00,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33, +0x17,0x15,0x27,0x22,0x06,0x15,0x14,0x17,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x04,0x26,0xb9,0xc0,0xe9,0xfe,0xd9,0xa0,0x9c,0xde,0xc2,0x1c,0x98,0x7a,0x69,0x69,0x50,0x22,0x68,0x88,0x23,0x75,0x7a,0xc1,0xa2,0xba,0x84,0xec,0xcb,0xfe,0x9d,0xe0,0x91,0xa3,0xa5,0x39, +0x43,0xc4,0xaf,0xa5,0x5c,0x5d,0xb1,0x98,0xb4,0x10,0x32,0x45,0x6a,0x7b,0x04,0xa7,0x03,0x1c,0x21,0x47,0x27,0x23,0x9c,0x1a,0x5f,0x61,0x52,0x6d,0xaf,0xa1,0x61,0x72,0x3b,0x00,0x00,0x01,0x00,0xdf,0xff,0xf0,0x03,0xe4,0x05,0x25,0x00,0x17,0x00,0x00,0x01,0x14,0x00,0x05,0x27,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17, +0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0xe4,0xfe,0xba,0xff,0x00,0x70,0xe0,0x01,0x37,0x98,0x69,0x52,0x74,0x40,0x8c,0x53,0xc4,0xa1,0xb1,0xef,0x03,0x92,0xc2,0xfe,0x08,0xe8,0x71,0xcb,0x01,0xc9,0x9d,0x61,0x92,0x6b,0x46,0x52,0x6b,0x4e,0x75,0x96,0x8f,0xc2,0xe8,0x00,0x01,0x00,0x4b,0xff,0xf6,0x04,0x79,0x05,0x29,0x00,0x18, +0x00,0x00,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x79,0x9b,0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x02,0xbd,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x9f,0x2f, +0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x01,0x00,0x4b,0xff,0xf6,0x04,0x79,0x05,0xda,0x00,0x25,0x00,0x00,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x79,0x9b,0xa6,0xfb,0xfe, +0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x01,0xb5,0x11,0x8e,0xb1,0x44,0x17,0x45,0x46,0x34,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x2c,0x37,0x7f,0x77,0xa0,0x06,0x11,0x3f,0x2c,0x37,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x00,0x02,0x00,0xe1,0x01,0x13,0x04,0x33, +0x04,0xa4,0x00,0x0b,0x00,0x19,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x02,0x8b,0x73,0x99,0x9d,0x6f,0x70,0x9a,0x97,0x73,0x75,0xc3,0x70,0xed,0xbb,0x72,0xc6,0x72,0xe9,0x04,0x09,0xab,0x81,0x7f,0xb0,0xb0,0x7f,0x80,0xac,0x9b, +0x76,0xd3,0x7f,0xc8,0xfe,0xff,0x7a,0xd3,0x7c,0xce,0xfa,0x00,0x00,0x02,0x00,0xdc,0xff,0xe8,0x04,0x38,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x00,0x01,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x03,0x32,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xbb, +0x02,0x50,0x4e,0x8c,0xb3,0xb2,0x87,0x92,0xb8,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0xa4,0x58,0x4c,0x55,0x49,0x47,0x5c,0x5b,0x03,0x39,0x02,0x15,0xb7,0x98,0x8c,0xb1,0xc9,0x9f,0xfc,0x38,0x67,0xac,0x28,0x2d,0x55,0x4b,0x03,0x3e,0x23,0x66,0x5e,0x6a,0x5e,0x49,0x4c,0x5e,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x6d,0x05,0xb2,0x00,0x26, +0x00,0x00,0x01,0x14,0x06,0x07,0x17,0x16,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x03,0xae,0xca,0xac,0x25,0x22,0x64,0x51,0x73,0x8c,0x3a,0x96,0x9f,0x90,0xb4,0x30,0x28,0x7d,0x79,0x68,0x47,0x94,0x38, +0x6e,0x81,0xbe,0x9f,0x62,0x33,0x1a,0x38,0x60,0xa7,0xed,0x7e,0x03,0xce,0xa3,0xf2,0x26,0x90,0x82,0x7e,0x47,0x9e,0x44,0xbc,0xc0,0xa3,0x05,0x4e,0x53,0x45,0x5d,0x9d,0x20,0x9c,0x6b,0x90,0xae,0x08,0x95,0x0e,0x7a,0xdb,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0xab,0x05,0xb2,0x00,0x2b,0x00,0x00,0x01,0x16,0x15,0x14,0x06,0x06,0x23,0x22, +0x24,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x03,0xd9,0xd2,0x7b,0xdd,0x89,0xb9,0xfe,0xd6,0x7f,0x7a,0x5e,0xf8,0x8d,0x97,0xb1,0x70,0x5e,0x36,0x40,0x58,0x4d,0x13,0x29,0x5d,0x6f,0x8e,0x96, +0x78,0x4d,0x3f,0x23,0x4d,0x57,0x88,0xc7,0x68,0x7f,0x02,0xf7,0x8d,0xe4,0x7d,0xbc,0x65,0xb6,0xc0,0x5f,0x94,0xa6,0x8e,0x7e,0x56,0x90,0x2f,0x10,0x0b,0x97,0x07,0x89,0x6a,0x6f,0x86,0x12,0x97,0x16,0x6a,0xbd,0x74,0xb0,0x6e,0x00,0x00,0x02,0x00,0x2d,0xff,0xe8,0x04,0xe7,0x05,0xbc,0x00,0x10,0x00,0x1b,0x00,0x00,0x13,0x01,0x01,0x17, +0x01,0x16,0x12,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x10,0x37,0x01,0x01,0x34,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x93,0x01,0xf5,0x01,0xed,0x72,0xfe,0x16,0x76,0x71,0xbd,0x9b,0x9f,0xbd,0xe6,0xfe,0x17,0x03,0x19,0x55,0x64,0xbf,0x67,0x50,0x54,0x6d,0x05,0xbc,0xfe,0x3a,0x01,0xc6,0x75,0xfe,0x3b,0x81,0xfe,0xff,0x92,0xae, +0xd8,0xe0,0xb0,0x01,0x1a,0xf6,0x01,0xbc,0xfc,0x35,0x5a,0xd5,0x6e,0xcb,0xd8,0x67,0x89,0x8a,0x00,0x01,0x00,0x0c,0xff,0xe8,0x05,0x07,0x05,0xb2,0x00,0x22,0x00,0x00,0x25,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x33,0x32, +0x37,0x11,0x33,0x04,0x2e,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0x6e,0x8b,0xda,0xe8,0x2c,0x2f,0x2d,0x1c,0x1f,0x28,0x41,0x76,0x88,0x8e,0x7c,0x97,0x76,0xa4,0x82,0x67,0xac,0x28,0x2d,0x55,0x4b,0xfb,0x35,0xed,0xdb,0x01,0xa2,0x29,0x36,0x05,0x96,0x0a,0x91,0x7f,0xfe,0x5e,0x87,0x90,0x66,0x03,0x4b,0x00,0x00,0x01,0x00,0x68,0xff,0xe8, +0x04,0xac,0x05,0xbb,0x00,0x36,0x00,0x00,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x02,0x35,0x34,0x37,0x35,0x24,0x35,0x10,0x21,0x32,0x36,0x35,0x34,0x27,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x57, +0xb9,0x5f,0x66,0x81,0xb5,0xdb,0xc2,0xa2,0x89,0x86,0x60,0x2f,0x57,0x5b,0x3f,0x53,0xfa,0xb6,0xc1,0x62,0x44,0xfe,0xe9,0x01,0x9a,0x43,0x56,0x06,0x9d,0x04,0xac,0x82,0x87,0x7b,0x89,0x6c,0x2b,0x2d,0xed,0x03,0x1a,0x1c,0x0e,0x59,0x48,0x3d,0x3d,0x05,0x07,0x79,0x75,0x6d,0x86,0x28,0x8b,0x1b,0x38,0x27,0x50,0x06,0x05,0x3d,0x7b,0x62, +0x66,0x4a,0x02,0x45,0xdb,0x01,0x25,0x25,0x22,0x17,0x12,0x33,0x12,0x1e,0x49,0x5f,0x47,0x47,0x43,0x50,0x03,0x23,0x00,0x02,0x00,0x4d,0xff,0xe8,0x04,0xc6,0x05,0xb2,0x00,0x1d,0x00,0x29,0x00,0x00,0x13,0x12,0x12,0x33,0x32,0x36,0x12,0x35,0x34,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06, +0x23,0x22,0x00,0x03,0x25,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xe8,0x2c,0xcf,0xb5,0x76,0xb8,0x62,0x04,0x02,0x7d,0x9b,0xa1,0xc9,0xc0,0xa2,0x89,0xce,0x6d,0x89,0xfd,0xa2,0xf8,0xfe,0xde,0x37,0x02,0xb4,0x42,0x89,0x3d,0x21,0x83,0x52,0x5e,0x77,0x6d,0x03,0x23,0xfe,0x94,0xfe,0xcc,0x92,0x01,0x00,0x97,0x3d,0x3a, +0x6a,0xdb,0xb0,0xa5,0xc9,0xbf,0xfe,0x9b,0xed,0xc9,0xfe,0xc0,0xb0,0x01,0x70,0x01,0xa2,0x5a,0x47,0x44,0x91,0xa7,0x73,0x5f,0x6c,0x85,0x00,0x01,0x00,0xab,0xff,0xe8,0x04,0x69,0x05,0xbc,0x00,0x14,0x00,0x00,0x01,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x13,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x01,0x03,0xa7,0xfe, +0x6e,0x6f,0x5e,0x90,0x74,0xe9,0xab,0x89,0x7c,0xfd,0xa0,0xbb,0xea,0x6c,0x71,0x01,0x96,0x05,0x5f,0xfd,0xdf,0x97,0xd8,0x5a,0x6a,0x88,0x01,0x3b,0x57,0xd3,0xac,0xe3,0xaf,0x7c,0x01,0x07,0x98,0x02,0x27,0x00,0x00,0x02,0x00,0x7d,0xff,0xe8,0x04,0x96,0x05,0xb5,0x00,0x03,0x00,0x18,0x00,0x00,0x01,0x01,0x17,0x01,0x25,0x14,0x16,0x16, +0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x37,0x17,0x06,0x02,0x02,0x1d,0x01,0xb1,0x71,0xfe,0x52,0xfe,0x8a,0x72,0xc8,0x78,0x61,0xa7,0x51,0x70,0xce,0xf5,0xae,0xfe,0xef,0x97,0xdc,0xca,0x70,0xad,0xcb,0x02,0x68,0x01,0x8c,0x73,0xfe,0x75,0x9a,0x99,0xf0,0x84,0x49,0x43,0x73,0xb4,0xab,0x01,0x3c,0xcc,0xe6, +0x01,0x97,0x9d,0x75,0x84,0xfe,0x90,0x00,0x00,0x02,0x00,0xad,0x00,0xd7,0x04,0x7a,0x04,0x89,0x00,0x0f,0x00,0x1c,0x00,0x00,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0xad,0x81,0xe3,0x83,0x81,0xe3,0x82,0x84,0xe2,0x80,0x81, +0xe3,0x83,0x03,0x26,0xb9,0x86,0x84,0xbc,0xbb,0x85,0x55,0x94,0x56,0x02,0xb0,0x7d,0xda,0x82,0x80,0xdc,0x7d,0x7e,0xdc,0x7f,0x80,0xdc,0x7d,0x84,0xbc,0xbc,0x84,0x82,0xbd,0x54,0x96,0x00,0x00,0x02,0x01,0x15,0xff,0xe2,0x04,0x12,0x05,0x7d,0x00,0x15,0x00,0x21,0x00,0x00,0x01,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06, +0x23,0x22,0x27,0x1e,0x02,0x17,0x07,0x24,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x15,0x69,0xb2,0x67,0x65,0xb1,0x65,0x64,0xb2,0x65,0x68,0x47,0x1b,0x8c,0xe0,0x84,0x56,0xfe,0xcc,0xfe,0xac,0x02,0x58,0x7d,0x59,0x55,0x7f,0x7e,0x56,0x59,0x7d,0x03,0xe5,0x6c,0xbe,0x6e,0x69,0xb1,0x62,0x64,0xae,0x68, +0x33,0x72,0xe3,0xc1,0x3c,0x86,0x92,0x02,0x27,0x01,0x66,0x5c,0x84,0x8b,0x63,0x58,0x7c,0x87,0x00,0x02,0x01,0x15,0xff,0xe2,0x04,0x12,0x05,0x7d,0x00,0x17,0x00,0x23,0x00,0x00,0x01,0x10,0x00,0x05,0x27,0x36,0x36,0x37,0x15,0x36,0x37,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x05,0x14,0x16,0x33,0x32,0x36, +0x35,0x34,0x26,0x23,0x22,0x06,0x04,0x12,0xfe,0xaa,0xfe,0xcf,0x55,0x68,0xbc,0x44,0x74,0x2e,0x49,0x67,0x65,0xb1,0x65,0x67,0xb0,0x64,0x66,0xb3,0x69,0xfd,0xaa,0x7d,0x57,0x57,0x7d,0x7d,0x57,0x58,0x7c,0x03,0xe5,0xfe,0xb7,0xfd,0xd7,0x91,0x86,0x31,0x90,0x4f,0x01,0x91,0xb2,0x33,0x67,0xaf,0x64,0x64,0xb1,0x67,0x6e,0xbe,0x50,0x5d, +0x85,0x7d,0x57,0x62,0x8c,0x83,0x00,0x01,0x00,0x2f,0x00,0x00,0x04,0xf9,0x05,0x7d,0x00,0x33,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11, +0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x02,0x5c,0x31,0x4f,0x27,0x5c,0x82,0x4c,0x36,0x17,0x1c,0x2e,0x27,0x33,0x52,0x77,0x80,0x5a,0x50,0x8b,0x4f,0x61,0xb4,0x74,0x4f,0x86,0x1d,0x2a,0x7f,0x4e,0xa1,0xb7,0xa4,0x69,0x46,0x4a,0x5c,0xa4,0x03,0xe7,0x3f,0x76,0x45,0xc8,0x91,0x6d,0x9d,0x26,0x19,0x16,0x2e,0x11,0x8d,0x04,0x87,0x57, +0x5f,0x88,0x77,0xc7,0x74,0x8f,0xe5,0x81,0x53,0x40,0x48,0x4b,0xc0,0xa2,0xfb,0xe5,0x04,0x1b,0x4f,0x77,0x8d,0x6d,0xfc,0x19,0x00,0x02,0x00,0x40,0xff,0xe5,0x04,0xe7,0x05,0xa9,0x00,0x17,0x00,0x23,0x00,0x00,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x12,0x05,0x36,0x13,0x17,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26, +0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x03,0x95,0x84,0xee,0xee,0xa6,0xa6,0x01,0x1e,0xc3,0xe1,0x99,0xd6,0xde,0x85,0x93,0x72,0xc3,0x6f,0x6f,0xc1,0x74,0x02,0xa0,0x8c,0x70,0x73,0x8a,0x94,0x69,0x67,0x95,0x01,0x60,0x87,0xfa,0x57,0x94,0x01,0x9b,0x42,0xfe,0xa2,0xb0,0x6d,0x01,0x87,0x43,0xfe,0x8d,0xa2, +0x64,0xf1,0x74,0x6e,0xb5,0x66,0x65,0xb1,0x72,0x5f,0xc7,0x3f,0x38,0xcf,0x6b,0x5c,0x84,0x8b,0x00,0x03,0x00,0x34,0xff,0xe5,0x04,0xf3,0x05,0x7d,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x00,0x13,0x34,0x36,0x37,0x26,0x03,0x37,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27, +0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0xdb,0x7d,0x6e,0xc8,0xca,0x86,0x80,0x8c,0x49,0x63,0xaa,0x61,0x5c,0xa4,0x60,0x89,0x5f,0x73,0xba,0x63,0x88,0x60,0x82,0x48,0x66,0xb0,0x64,0x65,0xb0,0x67,0x02, +0x50,0x50,0x43,0x7d,0x97,0x7c,0x57,0x56,0x7e,0x79,0x6d,0x4c,0x52,0x74,0x4f,0x45,0x6a,0x81,0x01,0x47,0x57,0xb0,0x47,0x59,0x01,0x24,0x65,0xe0,0x56,0x62,0x78,0x5d,0xa5,0x60,0x64,0xab,0x60,0x5d,0xb5,0x3b,0x2b,0xa3,0x89,0x65,0xaa,0x5c,0x7e,0x62,0x55,0x98,0x59,0x60,0xa4,0x42,0x54,0x9f,0x32,0x29,0x95,0x4b,0x53,0x74,0x62,0x03, +0x2c,0x56,0x7d,0x74,0x52,0x3f,0x8a,0x3d,0x38,0x89,0x00,0x01,0x00,0x55,0x00,0x00,0x04,0xd3,0x05,0x7d,0x00,0x2f,0x00,0x00,0x33,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x26,0x35,0x34,0x36,0x36, +0x33,0x32,0x16,0x16,0x15,0x10,0x00,0x21,0x55,0xcc,0x01,0x42,0x01,0xc7,0x56,0x94,0x56,0x57,0x7e,0x37,0x2e,0x43,0x4b,0xc1,0x86,0x61,0xc1,0x42,0x86,0x36,0x75,0x33,0x44,0x5c,0x76,0x3a,0x42,0x66,0xaf,0x66,0x81,0xe4,0x84,0xfd,0xd4,0xfe,0x7a,0xa7,0x01,0x9f,0x01,0x27,0x63,0xad,0x64,0x54,0x3c,0x17,0x39,0x1a,0x26,0x6b,0x3a,0x77, +0xa7,0x77,0x76,0x55,0x50,0x57,0x46,0x2f,0x3e,0x3d,0x1f,0x6e,0x3d,0x4f,0x8b,0x50,0x90,0xf5,0x8b,0xfe,0x94,0xfd,0xff,0x00,0x00,0x02,0x00,0x4f,0xff,0xe5,0x04,0xd8,0x05,0x7d,0x00,0x27,0x00,0x33,0x00,0x00,0x17,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x10,0x00,0x21,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x4f,0x95,0x01,0x5e,0x01,0xef,0x73,0xcc,0x72,0x69,0xb8,0x6b,0x09,0x27,0x7d,0x4a,0x77,0xa0,0xa0,0x70,0x6e,0xc4,0x71,0x99,0x01,0x06,0x92,0x9f,0x01,0x17,0xa2,0xfd,0xab,0xfe,0x61,0x79, +0x11,0x53,0x31,0x2e,0x3b,0x46,0x2a,0x30,0x50,0x1b,0x9c,0x01,0xad,0x01,0x32,0x66,0xb3,0x68,0x5e,0xa2,0x5e,0x18,0x26,0x43,0x54,0x9a,0x69,0x6b,0x98,0x75,0xc9,0x6f,0x86,0xec,0x88,0x92,0xfd,0x8e,0xfe,0x8b,0xfd,0xfa,0x02,0xcb,0x1b,0x24,0x40,0x28,0x26,0x36,0x4c,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x04,0x67,0x05,0x42,0x00,0x05, +0x00,0x00,0x13,0x21,0x15,0x21,0x11,0x23,0xc1,0x03,0xa6,0xfd,0x02,0xa8,0x05,0x42,0x99,0xfb,0x57,0x00,0x00,0x01,0x00,0xdc,0xff,0xe2,0x04,0x4c,0x05,0x62,0x00,0x16,0x00,0x00,0x13,0x34,0x12,0x37,0x33,0x01,0x11,0x33,0x11,0x14,0x06,0x23,0x01,0x06,0x06,0x15,0x14,0x00,0x17,0x07,0x26,0x24,0x02,0xdc,0xb1,0x9b,0x1b,0x01,0x62,0xa7, +0x1e,0x13,0xfe,0x14,0x56,0x54,0x01,0x19,0xec,0x43,0xac,0xfe,0xe0,0x9f,0x02,0xe5,0xac,0x01,0x58,0x79,0xfe,0x8f,0x01,0x71,0xfd,0x5b,0x0b,0x13,0x01,0xf5,0x51,0xde,0x80,0xcd,0xfe,0xb1,0x51,0x96,0x3b,0xf3,0x01,0x35,0x00,0x02,0x01,0xbd,0xff,0xe8,0x05,0x87,0x05,0x48,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x10,0x02,0x23,0x22,0x02, +0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x05,0x87,0xfb,0xeb,0xea,0xfa,0xfa,0xea,0xeb,0xfb,0xab,0x9a,0xa1,0xa1,0x98,0x97,0xa2,0xa2,0x99,0x02,0x97,0xfe,0xa8,0xfe,0xa9,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x58,0xfe,0xa8,0xfe,0xa7,0x01,0x17,0x01,0x06,0xfe,0xf7,0xfe,0xec,0xfe, +0xeb,0xfe,0xfc,0x01,0x02,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x06,0x44,0x05,0x31,0x00,0x1d,0x00,0x21,0x00,0x2d,0x00,0x00,0x01,0x14,0x06,0x07,0x35,0x32,0x36,0x35,0x10,0x21,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x16,0x16,0x01,0x11,0x21,0x11,0x05,0x21,0x22,0x06,0x15,0x14, +0x16,0x16,0x33,0x32,0x36,0x35,0x06,0x44,0xdd,0xae,0x68,0x78,0xfe,0xc6,0xd0,0xd0,0x6e,0xce,0x83,0x8d,0x7d,0x03,0x58,0xfe,0xfd,0x39,0x72,0xc5,0x75,0xfd,0x73,0xfe,0xfb,0x01,0x05,0xfe,0xc8,0x61,0x6f,0x56,0x85,0x3b,0x79,0x79,0x01,0xc0,0xc9,0xf5,0x02,0x95,0x92,0x89,0x01,0x04,0xd5,0xff,0xe0,0x88,0xe7,0x71,0x86,0xb7,0x13,0x02, +0x01,0x94,0xfe,0xab,0x65,0xb8,0x01,0x1d,0x01,0x55,0xfe,0xab,0x94,0x72,0x62,0x49,0x9c,0x66,0xad,0xbe,0x00,0x02,0x00,0xd2,0x00,0x00,0x06,0x72,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x00,0x21,0x21,0x22,0x26,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33, +0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x72,0xfb,0xe3,0xc7,0xa3,0x45,0x70,0x90,0x96,0x90,0x70,0x45,0xb7,0x9b,0x4d,0x6f,0x33,0x84,0x7d,0x98,0x6d,0x69,0x8b,0x89,0xda,0x88,0xe2,0x01,0x16,0x83,0xf2,0xad,0x8d,0x70,0x56,0x82,0x04, +0x04,0xfb,0xcf,0x46,0x2d,0x2f,0x44,0x43,0x30,0x2f,0x44,0x60,0x6e,0x4a,0x61,0x42,0x2e,0x2d,0x36,0x52,0x7a,0x5a,0x90,0xa5,0x30,0x2f,0x04,0x80,0x7c,0x61,0x8a,0x97,0x6a,0x7d,0xe0,0x76,0xf2,0xc9,0x8a,0xd0,0x79,0x2e,0x25,0x3f,0x2c,0x2e,0x23,0x02,0xbf,0x31,0x47,0x48,0x30,0x33,0x45,0x45,0x00,0x01,0x00,0xff,0x00,0x00,0x06,0x44, +0x05,0x31,0x00,0x20,0x00,0x00,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x06,0x44,0xfd,0xf0,0x61,0x84,0x7b,0x6b,0x47,0x54,0x3d,0xa8,0xfe,0xf4,0xa8,0x02,0xce,0x72,0x3e,0x64,0x45,0xa8,0xd7,0x45,0x38, +0x01,0x00,0x95,0x0d,0xbe,0x7a,0x81,0x9b,0x1e,0x32,0xfd,0x5a,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfe,0xb5,0x20,0x19,0xe8,0xaf,0x5e,0xbf,0x43,0x00,0x03,0x00,0xf8,0x00,0x00,0x06,0x4b,0x05,0x31,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x00,0x01,0x21,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11, +0x21,0x11,0x33,0x01,0x11,0x21,0x11,0x05,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x06,0x4b,0xfe,0x20,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x02,0xd0,0x6d,0x01,0x38,0xa8,0xfd,0x78,0xfe,0xed,0x01,0x13,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0x02,0xb4,0x90,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02, +0x06,0x94,0xfe,0xab,0x01,0xe9,0xfe,0x17,0x01,0x55,0xfe,0xab,0x94,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0x00,0x01,0x00,0x5c,0xfd,0xb9,0x06,0xe8,0x07,0x21,0x00,0x34,0x00,0x00,0x01,0x02,0x02,0x24,0x23,0x22,0x04,0x02,0x11,0x10,0x12,0x04,0x33,0x20,0x00,0x11,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x21,0x15, +0x23,0x11,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x04,0x23,0x20,0x00,0x02,0x11,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x13,0x06,0x46,0x07,0xa4,0xfe,0xde,0xba,0xd3,0xfe,0xc7,0xad,0x9d,0x01,0x1e,0xc8,0x01,0x0b,0x01,0x2e,0x5d,0x4f,0x70,0x37,0xa8,0xee,0xa8,0x02,0xb0,0x72,0x53,0x55,0xa1,0xae,0xb5,0xfe,0xb2,0xd6,0xfe,0xff,0xfe,0x93, +0xc3,0xd3,0x01,0x8c,0x01,0x10,0xe3,0x01,0x63,0xcb,0x0c,0x03,0x1d,0x01,0x03,0x01,0x91,0xdc,0xf7,0xfe,0x22,0xfe,0xbc,0xfe,0xb2,0xfe,0x1c,0xf5,0x01,0x6b,0x01,0x4f,0x72,0x8c,0x51,0xfe,0x4c,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfd,0xaa,0x51,0xe9,0xdd,0xed,0xfe,0x96,0xc2,0x01,0x18,0x02,0x22,0x01,0x81,0x01,0x71,0x02,0x22,0x01, +0x1a,0xfe,0xfe,0x2c,0xfe,0xce,0x00,0x03,0x00,0x27,0x00,0x00,0x07,0x1c,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x3e,0x00,0x00,0x01,0x15,0x23,0x11,0x16,0x16,0x17,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x21,0x35,0x36,0x36,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x15,0x10,0x02,0x23,0x22,0x26, +0x26,0x35,0x34,0x36,0x37,0x11,0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x21,0x11,0x04,0x07,0x6d,0x52,0x75,0x32,0x23,0x50,0x53,0x48,0x94,0xaf,0x3a,0x30,0xa2,0xfe,0xc3,0x28,0x33,0xa1,0x59,0x64,0xa8,0x49,0x51,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x01,0xbb,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84, +0xfe,0xed,0x05,0x31,0x94,0xfe,0xa9,0x0a,0x43,0x40,0x42,0x4d,0x23,0xd1,0xab,0x64,0xbb,0x3b,0x95,0x93,0x39,0xb3,0x58,0x01,0x00,0x9f,0x95,0xfe,0x5d,0x01,0x94,0x82,0x7e,0x18,0x88,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0xfd,0x83,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0xff,0x01,0x55,0xfe,0xab,0x00,0x00,0x02, +0x01,0x1a,0x00,0x00,0x06,0x29,0x05,0x31,0x00,0x1a,0x00,0x26,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x02,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x11,0x34,0x12,0x24,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x06,0x29,0xab,0xa8,0xed,0x99,0xf7,0x90,0x08,0x2c,0x88, +0x44,0x96,0xb7,0xbe,0x91,0xcb,0xd2,0xbd,0x01,0x47,0xc3,0x02,0x48,0xfd,0x32,0x63,0x45,0x47,0x77,0x2a,0x0a,0x79,0x6b,0x44,0x5e,0x04,0x9d,0xfb,0x63,0x04,0x9d,0x8d,0xfe,0xfc,0xa8,0x2b,0x33,0xbf,0x9c,0x9e,0xc8,0x01,0x21,0x01,0x1e,0xd0,0x01,0x5e,0xc3,0xfc,0x27,0x54,0x82,0x3c,0x30,0x8d,0xa0,0x74,0x00,0x03,0x00,0x48,0xff,0x00, +0x06,0xfc,0x05,0x31,0x00,0x2a,0x00,0x34,0x00,0x40,0x00,0x00,0x01,0x11,0x23,0x11,0x23,0x06,0x00,0x21,0x22,0x24,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x35,0x34,0x02,0x27,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x07,0x33,0x11,0x01,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32, +0x24,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0xfc,0xa8,0xfb,0x59,0xfe,0x6c,0xfe,0xef,0x8d,0xfe,0xfd,0x83,0xba,0x9a,0x03,0x3c,0x07,0x80,0x78,0x25,0x1b,0xbf,0x92,0x5f,0x97,0x56,0x66,0xc1,0x84,0xb7,0x01,0x0d,0x92,0x06,0xcf,0xfe,0x58,0xfc,0xcb,0x36,0x43,0xd2,0xc5,0xaf,0x01,0x06,0xc9,0x67,0x44,0x44, +0x66,0x60,0x4a,0x4b,0x60,0x05,0x31,0xf9,0xf9,0x01,0xdc,0xf9,0xfe,0xf3,0x6e,0xb8,0x75,0x74,0x8c,0x60,0x31,0xb9,0x01,0x09,0x46,0x25,0x52,0x36,0xa2,0xc1,0x55,0x9f,0x70,0x6d,0xa9,0x5f,0xad,0xfe,0xb1,0xee,0x30,0x48,0x03,0x96,0xfb,0xd5,0x4b,0x35,0x74,0x7d,0xb6,0x03,0x30,0x53,0x7f,0x7d,0x55,0x52,0x6c,0x6e,0x00,0x04,0x00,0x23, +0xff,0xe4,0x07,0x20,0x05,0x31,0x00,0x30,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02, +0x07,0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x23,0x11,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x26,0x06,0x16,0x2d,0x3b,0x87,0x73,0x4d,0x42,0x69,0x78,0x88,0x79,0x80,0x9b,0x31,0x9b,0x4b,0xa2,0x87,0x7f,0xc8,0x72,0x72,0x6c,0x02,0xbc,0x6d,0xea,0x3f,0xa8,0x61,0x72,0xc0,0x6c,0x47, +0x3d,0xfc,0x0c,0x63,0x95,0x9b,0x46,0x9c,0x86,0x65,0x52,0xff,0x02,0xf9,0x25,0x20,0x44,0x30,0x62,0x2a,0x46,0x2c,0x43,0xff,0x70,0xca,0xca,0x47,0x35,0xdf,0x8e,0xb4,0xd5,0xe1,0xc0,0x8d,0x86,0x90,0xd0,0xe5,0x6f,0x70,0xd5,0x92,0x86,0xa4,0x2a,0x02,0x06,0x94,0xfe,0xab,0x57,0x65,0x83,0xeb,0x99,0xa0,0xfe,0xda,0x53,0x02,0xd0,0x28, +0x5d,0x5c,0x93,0xab,0xc1,0xf3,0xff,0x01,0x55,0xfe,0xab,0x98,0x33,0x7c,0x65,0x74,0x93,0xf1,0x47,0x80,0x5a,0x00,0x00,0x02,0x00,0xbf,0xff,0xe5,0x05,0xa8,0x04,0xc9,0x00,0x0f,0x00,0x1f,0x00,0x00,0x05,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32, +0x36,0x36,0x35,0x34,0x26,0x26,0x03,0x33,0xa6,0xfe,0xdc,0xaa,0xa9,0x01,0x25,0xa6,0xa8,0x01,0x24,0xa9,0xa9,0xfe,0xdb,0xa7,0x7f,0xda,0x80,0x7f,0xda,0x80,0x7f,0xda,0x80,0x80,0xd9,0x1b,0xa6,0x01,0x21,0xab,0xa9,0x01,0x22,0xa7,0xa7,0xfe,0xdd,0xa8,0xa8,0xfe,0xdd,0xa7,0x04,0x5b,0x7f,0xdf,0x81,0x80,0xdd,0x7e,0x7d,0xdd,0x81,0x81, +0xe0,0x7e,0x00,0x01,0x00,0x34,0xff,0xe6,0x06,0x34,0x04,0xc9,0x00,0x1b,0x00,0x00,0x01,0x22,0x04,0x06,0x15,0x10,0x05,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x27,0x24,0x11,0x34,0x26,0x24,0x03,0x34,0xaa,0xfe,0xe8,0xa0,0x01,0x32,0x62,0xaf,0xbf,0xc1,0x01,0x61,0xde,0xe0,0x01,0x60,0xc0,0xbf, +0xb0,0x61,0x01,0x31,0xa0,0xfe,0xea,0x04,0x33,0x89,0xef,0x88,0xfe,0xef,0xc2,0x7a,0x6a,0x01,0x37,0xac,0xb7,0x01,0x32,0xad,0xaf,0xfe,0xcf,0xb6,0xac,0xfe,0xc8,0x69,0x7a,0xc2,0x01,0x11,0x88,0xef,0x89,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x06,0x22,0x04,0xdc,0x00,0x1e,0x00,0x2a,0x00,0x00,0x37,0x21,0x32,0x36,0x36,0x35,0x34,0x26, +0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x21,0x01,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x45,0x03,0x61,0x87,0xe4,0x72,0xb2,0x8d,0x2c,0x4e,0x81,0x4b,0x72,0x9c,0x66,0xb0,0x5f,0x99,0x01,0x21,0xab,0x9b,0xfe,0xcd,0xae,0xfc,0x9f,0x03,0x91, +0x31,0x2f,0x40,0x57,0x4b,0x32,0x33,0x47,0x97,0x7d,0xd7,0x8e,0x95,0xf7,0x31,0x44,0x45,0x42,0x81,0x4b,0x9f,0x73,0x55,0x88,0x4e,0xac,0xfe,0xe0,0xa5,0xb1,0xfe,0xee,0xa8,0x03,0xb1,0x28,0x4e,0x1f,0x0b,0x57,0x33,0x33,0x47,0x47,0x00,0x01,0x01,0x78,0xff,0xe7,0x04,0xef,0x04,0xc9,0x00,0x28,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22, +0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x04,0xef,0x75,0xca,0x7b,0xd9,0xe4,0x5a,0x65,0xab,0x53,0x51,0x81,0x4b,0x96,0x77,0xb6,0xb6,0x77,0x83,0x98,0x7d,0x7f,0x95,0x5c,0xa8,0xe6,0x72,0xba, +0x68,0x49,0x50,0x4e,0x5e,0x01,0x54,0x60,0xab,0x62,0xc6,0x7b,0x5b,0x50,0x39,0x64,0x3a,0x60,0x74,0x8d,0x6b,0x58,0x50,0x6d,0x74,0x64,0xa4,0x58,0x9a,0x5a,0x5f,0x84,0x2d,0x2a,0x98,0x00,0x00,0x02,0x00,0x9e,0xff,0xe8,0x05,0xca,0x04,0xec,0x00,0x0b,0x00,0x32,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16, +0x13,0x24,0x36,0x37,0x26,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x24,0x11,0x34,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x17,0x03,0x29,0x33,0x47,0x47,0x33,0x35,0x45,0x48,0x30,0x01,0x17,0xee,0x05,0x05,0x58,0x51,0x3e,0x7e,0x8b,0x6c,0xca,0xb8,0x27,0x39, +0x9d,0x76,0x77,0x9b,0x37,0x27,0xfe,0x29,0x8a,0x5c,0x31,0x1d,0x5c,0xbf,0xb0,0x72,0x44,0x38,0x29,0x4d,0x0e,0x0f,0x4d,0x28,0x39,0x43,0x01,0xa6,0x3b,0xb0,0x7e,0x4f,0x77,0x31,0x74,0x3c,0xc2,0x6d,0x74,0xaf,0x7d,0x33,0x1e,0x62,0x40,0x6f,0x97,0x98,0x6e,0x37,0x67,0x21,0x67,0x01,0x46,0xa9,0x71,0x66,0x2f,0x59,0x2c,0x4d,0x79,0x54, +0x20,0x00,0x00,0x02,0x00,0x36,0xff,0xc0,0x06,0x32,0x04,0xcd,0x00,0x33,0x00,0x3e,0x00,0x00,0x01,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x02,0x17,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x27,0x2e,0x03,0x23,0x22,0x00,0x03,0x27,0x36,0x12,0x37,0x26,0x26,0x27,0x37, +0x1e,0x02,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x36,0x02,0x96,0x38,0x3a,0x51,0xa3,0x85,0x80,0xa1,0x6e,0x69,0x30,0x3f,0x2b,0x17,0x0b,0x11,0x05,0x24,0x20,0x29,0x31,0x0e,0x8b,0x13,0x83,0x63,0x5e,0x79,0x13,0x1d,0x2d,0x40,0x49,0x33,0xe0,0xfe,0xc2,0x66,0x8f,0x3d,0xf0,0xa3,0x2d,0xc1,0x7c,0x21,0x55,0xba,0x9b,0x02, +0x01,0x57,0x37,0x38,0x53,0x5e,0x51,0x6a,0x02,0xc8,0x0f,0x06,0x59,0x6d,0x7f,0xa4,0x9e,0x75,0x5e,0x91,0x27,0x25,0x65,0x82,0x82,0x43,0x44,0x16,0x1f,0x5a,0x61,0x18,0x96,0xa0,0x7f,0x79,0xb5,0x7a,0x4d,0x21,0xfe,0xd0,0xfe,0xc7,0x25,0xdd,0x01,0x4f,0x55,0x9a,0xe7,0x32,0x88,0x14,0x90,0xdb,0x5f,0x38,0x54,0x55,0x41,0x64,0x3f,0x07, +0x62,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x05,0xcf,0x04,0xbe,0x00,0x1e,0x00,0x00,0x13,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x21,0x21,0x15,0x21,0x22,0x26,0x99,0xa7,0xa7,0x5c,0xa0,0x5f,0x97,0x7f,0x66,0x6a,0x97,0x7b,0x01,0xd2,0xfe,0x2e,0x7b, +0x97,0x01,0x04,0x03,0x8f,0xfc,0x56,0xbc,0xd0,0x01,0x42,0xbd,0x6b,0x6b,0xbe,0x50,0x8c,0x4f,0x92,0x59,0x54,0x5a,0x6f,0x97,0x77,0x61,0xb0,0x97,0xa8,0x00,0x00,0x01,0x01,0x4a,0xff,0xe5,0x05,0x1e,0x04,0xc9,0x00,0x2e,0x00,0x00,0x25,0x32,0x36,0x37,0x33,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x34, +0x26,0x23,0x22,0x06,0x07,0x23,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x0e,0x03,0x07,0x0e,0x02,0x15,0x14,0x16,0x03,0x30,0x95,0xa1,0x16,0xa2,0x18,0xfe,0xff,0xd5,0x8b,0xdf,0x7c,0x2e,0x5c,0x9a,0x95,0x8b,0x6f,0x3b,0xa5,0x6e,0x75,0x97,0x0d,0x9b,0xf9,0xbb,0x7b,0xc6,0x72,0x24,0x3d,0x59,0x6f,0x81,0x94,0x71,0x3e,0xad,0x7d,0x7c, +0x7b,0xbd,0xd2,0x56,0x9e,0x6b,0x49,0x71,0x54,0x42,0x22,0x20,0x32,0x44,0x32,0x4c,0x6a,0x74,0x68,0xa1,0xd0,0x59,0x9b,0x53,0x40,0x5f,0x48,0x33,0x27,0x1e,0x21,0x35,0x4d,0x38,0x5f,0x6c,0x00,0x01,0x00,0x28,0xff,0xe7,0x06,0x3f,0x04,0xc9,0x00,0x20,0x00,0x00,0x01,0x21,0x15,0x21,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02, +0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x02,0x27,0x02,0xd5,0x03,0x6a,0xfd,0xd4,0x7c,0x81,0xa4,0xfe,0xd4,0xa4,0xa4,0xfe,0xd3,0xa3,0x7c,0x6e,0x5b,0x4d,0x58,0x7c,0xdb,0x7d,0x7c,0xdc,0x7c,0xdb,0xc0,0x04,0xc9,0x8b,0x5d,0xfb,0x91,0xa9,0xfe,0xe8,0xad,0xad,0x01,0x19,0xa8,0x92,0xfb, +0x5a,0x6e,0x40,0xc9,0x70,0x7d,0xd3,0x7b,0x7b,0xd4,0x7c,0xae,0x01,0x02,0x3b,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x05,0xcf,0x04,0xbe,0x00,0x1e,0x00,0x00,0x13,0x34,0x36,0x33,0x21,0x15,0x21,0x20,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x34,0x37,0x26,0x99,0xcf,0xbd, +0x03,0xaa,0xfc,0x71,0xfe,0xfc,0x43,0x7a,0x55,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0xd0,0x7f,0x97,0x60,0xa0,0x5b,0xa7,0xa7,0x03,0x7b,0x99,0xaa,0x98,0xb0,0x3c,0x64,0x38,0x96,0x70,0x59,0xa8,0x97,0x50,0x8b,0x50,0xbd,0x6b,0x6b,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x05,0x2f,0x04,0xac,0x00,0x0f,0x00,0x1f,0x00,0x00,0x01,0x14,0x02,0x04, +0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x07,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x05,0x2f,0x9b,0xfe,0xf4,0x9b,0x9c,0xfe,0xf6,0x9b,0x9a,0x01,0x0d,0x9a,0x9a,0x01,0x0c,0x9c,0xa5,0x6c,0xc0,0x71,0x70,0xc1,0x6c,0x6e,0xbe,0x71,0x70,0xbf,0x6e,0x02,0x55,0xa2,0xfe,0xea, +0x9d,0x9f,0x01,0x14,0xa2,0xa1,0x01,0x16,0xa0,0xa0,0xfe,0xe9,0xa0,0x73,0xc9,0x76,0x76,0xca,0x72,0x74,0xc9,0x74,0x73,0xca,0x00,0x01,0x00,0xa1,0xff,0xfd,0x05,0x3a,0x04,0xac,0x00,0x1d,0x00,0x00,0x01,0x14,0x02,0x07,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24, +0x33,0x32,0x04,0x12,0x05,0x3a,0xc2,0x8b,0x4a,0x68,0x8a,0x75,0xc4,0x6f,0x70,0xc5,0x72,0x8e,0x63,0x49,0x8d,0xc0,0xa0,0x01,0x10,0x9c,0x9d,0x01,0x11,0x9f,0x02,0x55,0xb8,0xfe,0xa6,0x46,0x93,0x37,0x01,0x08,0x86,0x72,0xcb,0x75,0x77,0xc9,0x72,0x8b,0xfe,0xf9,0x34,0x92,0x47,0x01,0x59,0xb8,0xa0,0x01,0x18,0x9f,0xa1,0xfe,0xe8,0x00, +0x00,0x01,0x00,0xf6,0x00,0x00,0x04,0xe6,0x04,0xac,0x00,0x25,0x00,0x00,0x01,0x14,0x02,0x04,0x23,0x21,0x35,0x21,0x32,0x37,0x24,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x04,0xe6,0x9c,0xfe,0xef,0x9f,0xfe,0x5c,0x01,0xa4,0x3c,0x4d, +0x01,0x1e,0x73,0xc4,0x70,0x54,0x80,0x7d,0x57,0x5c,0x3f,0x75,0x62,0xae,0x64,0xb0,0x66,0x66,0xb0,0x64,0xa8,0x01,0x0d,0x97,0x02,0x55,0x9d,0xfe,0xea,0xa2,0xa4,0x1b,0x64,0x01,0x32,0x72,0xca,0x76,0x7c,0x59,0x55,0x7f,0x44,0x72,0x77,0x66,0xae,0x65,0x64,0xb1,0x65,0x9b,0xfe,0xec,0x00,0x02,0x00,0xdd,0xff,0xdd,0x04,0xfe,0x04,0xac, +0x00,0x32,0x00,0x3c,0x00,0x00,0x05,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x05,0x32,0x37,0x26,0x26,0x23,0x22, +0x15,0x14,0x16,0x04,0xfe,0x54,0x6c,0x6b,0x58,0xb2,0x92,0x57,0xa4,0x5f,0x57,0x99,0x5d,0x73,0xee,0x48,0x3b,0x65,0xae,0x66,0x2d,0x3a,0x65,0x36,0x2f,0x56,0x20,0x6b,0x32,0x70,0x97,0x97,0x6a,0x8d,0xff,0x9c,0x70,0x46,0x38,0x0c,0x26,0xfd,0x55,0xc5,0x55,0x3c,0xad,0x51,0xa6,0x6d,0x23,0x33,0x61,0x45,0x2c,0x4e,0x81,0x46,0x53,0x7c, +0x42,0x6f,0x55,0x53,0xbe,0x6e,0xbd,0x69,0x30,0x27,0x58,0x41,0x68,0x35,0x47,0x8e,0x6d,0x66,0x96,0x9e,0xfe,0xf1,0x96,0xe1,0x9a,0x51,0x09,0x02,0x4f,0x43,0x4b,0x64,0x36,0x43,0x00,0x03,0x00,0x60,0xff,0xf3,0x05,0x7c,0x04,0xc1,0x00,0x26,0x00,0x30,0x00,0x3c,0x00,0x00,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06, +0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x05,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf0,0x51,0x90,0x6c,0x3f,0xca,0xb8,0x25,0x37,0xbb,0x8f,0x8d,0xbd,0x48,0xfe,0x56, +0x92,0x69,0x67,0x95,0xc1,0x82,0xf3,0xf0,0xdd,0x3a,0x5e,0x74,0xfd,0xe6,0x33,0x24,0x25,0x3f,0x33,0x88,0x02,0x00,0x60,0x46,0x45,0x61,0x5d,0x49,0x4b,0x5b,0x04,0xc1,0x0c,0x1f,0x44,0x78,0x64,0x87,0xce,0x46,0x23,0x63,0x38,0x88,0xa2,0xa7,0x83,0x6f,0x45,0x9b,0x01,0x45,0x69,0x92,0x95,0x67,0xa8,0x49,0x61,0x24,0x3f,0xa0,0x63,0x3a, +0x42,0x1f,0x06,0x61,0x27,0x37,0x39,0x25,0x5c,0x3c,0x2d,0xfd,0xc2,0x39,0x51,0x4e,0x3c,0x35,0x45,0x45,0x00,0x03,0x00,0x43,0xff,0xdc,0x05,0x99,0x04,0xac,0x00,0x35,0x00,0x3e,0x00,0x47,0x00,0x00,0x01,0x14,0x07,0x16,0x15,0x14,0x06,0x07,0x27,0x32,0x36,0x35,0x34,0x27,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x25,0x26, +0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x17,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x36,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x99,0xaa,0x74,0x89,0xaa,0x4b,0x62,0x7f,0x84,0x6b,0xf7,0x1b,0xc7,0xa8,0x73,0xa0,0xea, +0x01,0x1f,0x08,0x89,0x57,0x35,0x47,0x25,0x30,0x5a,0x3e,0x59,0xa3,0x76,0x68,0xae,0x67,0x06,0x7f,0x43,0x50,0xa5,0x7a,0x80,0xa0,0x9d,0x4e,0x35,0x83,0x72,0x94,0xfd,0x42,0xc5,0x99,0x49,0x2d,0x4d,0x7e,0x03,0x78,0xdd,0x63,0x78,0x8b,0x99,0x9a,0x26,0xa0,0x67,0x49,0x5c,0x6e,0x19,0x0f,0xe1,0xed,0x9e,0x73,0xa2,0x9e,0x18,0xac,0xfa, +0x4c,0x3c,0x1d,0x3a,0x27,0x82,0x20,0x93,0x4d,0x78,0xad,0x93,0xfe,0xfa,0xa0,0x08,0x0a,0x6a,0x89,0x84,0xb0,0xb0,0x73,0x38,0x4e,0x97,0x5c,0x69,0x3e,0xfe,0xd3,0x10,0x56,0x56,0x2b,0x42,0xa5,0x00,0x00,0x02,0x00,0x7e,0x00,0x00,0x05,0x5d,0x04,0xac,0x00,0x1d,0x00,0x28,0x00,0x00,0x21,0x21,0x22,0x24,0x26,0x35,0x34,0x37,0x26,0x23, +0x37,0x20,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x5d,0xfe,0x06,0xa4,0xfe,0xed,0x9d,0x9d,0x73,0xbb,0x0f,0x01,0x20,0x98,0x7c,0xa2,0x86,0xac,0xad,0x85,0x7e,0xa1,0x4c,0x4a,0xfc,0xb9,0x01,0xfa,0xfe,0x98,0x54,0x3e, +0x7b,0x59,0x3a,0x59,0x41,0x3f,0x53,0x84,0xeb,0x8d,0xc7,0x7d,0xc7,0xa5,0xfe,0xe6,0x2b,0xa0,0x7a,0x7b,0xa7,0x85,0xa0,0x4a,0x6c,0x93,0xb9,0x01,0xf5,0x36,0x49,0x1d,0x79,0x5c,0x40,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x05,0x06,0x04,0xc1,0x00,0x27,0x00,0x00,0x21,0x21,0x22,0x26,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x26, +0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x07,0x06,0x15,0x14,0x16,0x33,0x21,0x05,0x06,0xfd,0x4d,0x66,0xb1,0x66,0x8d,0x27,0xd9,0x84,0x4b,0x3f,0x37,0x4a,0x1b,0x8e,0x31,0xab,0x7c,0x84,0xa8,0x8b,0x3e,0x84,0x3f,0x84,0x7c,0x5c,0x02,0xb3,0x62,0xab,0x64,0xb5,0x66,0x1e,0x61, +0x3a,0x49,0x3f,0x50,0x45,0x2f,0x30,0x1c,0x52,0x41,0x62,0x74,0x9f,0xae,0x8d,0x9d,0x46,0x1f,0x34,0x1e,0x40,0x70,0x5b,0x83,0x00,0x02,0x00,0x8d,0x00,0x00,0x05,0x4e,0x04,0xc1,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x23,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22, +0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x10,0x27,0x35,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x33,0x32,0x36,0x05,0x4e,0xd6,0x62,0x4d,0x9f,0xfe,0xf0,0x9d,0xa4,0xfe,0xf0,0x9a,0x5a,0x91,0x5d,0x64,0x90,0x90,0x64,0x5c,0x3f,0x08,0x70,0xc3,0x76,0x6e,0xc5,0x75,0xec,0x01,0xb7,0xfc,0xeb,0x3f,0x25,0x2e,0x41, +0x0b,0x3f,0x3b,0x2b,0x39,0x04,0x07,0x6a,0xc1,0x87,0x9f,0xfe,0xed,0xa3,0xa5,0x01,0x22,0xaf,0xa0,0x01,0x21,0x8a,0xa4,0x72,0x6f,0xa6,0x3c,0x23,0x40,0x80,0xd5,0x76,0x74,0xc6,0x70,0x01,0x15,0xa7,0xa1,0xff,0x00,0x29,0x49,0x58,0x53,0x4b,0x4f,0x00,0x00,0x02,0x01,0x0d,0x00,0x00,0x04,0xcf,0x04,0xac,0x00,0x26,0x00,0x31,0x00,0x00, +0x01,0x21,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x21,0x01,0x34,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x04,0xcf,0xfd,0x93,0x48,0x68,0x35,0x73,0xa4,0x80,0x92,0x92,0x68,0x9c, +0x74,0x08,0x7d,0x63,0x5c,0x37,0x74,0x6a,0x9d,0xab,0xdb,0x25,0x70,0x5b,0x9e,0x5c,0x02,0x6d,0xfe,0xa4,0x5e,0x29,0x7f,0x17,0x20,0x6e,0x27,0x27,0x41,0x04,0x07,0x68,0x48,0x5e,0x32,0x63,0x6f,0x62,0x5d,0x7b,0x45,0x1b,0x16,0x6a,0x87,0x25,0x73,0x56,0xe3,0xb2,0x4e,0x53,0x7c,0xa5,0x5a,0x9f,0x5c,0xfd,0xa9,0x41,0x28,0x15,0x1a,0x2b, +0x29,0x00,0x00,0x02,0x01,0xc8,0xff,0xe8,0x05,0x54,0x03,0x7c,0x00,0x0b,0x00,0x1b,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x8e,0x7f,0xa0,0xa0,0x7f,0x7f,0xa0,0xa0,0x7f,0x7e,0xd0,0x78,0x78,0xd1,0x7d,0x7e,0xd0, +0x78,0x78,0xd0,0x81,0xa9,0x88,0x88,0xa9,0xa9,0x88,0x88,0xa9,0x99,0x76,0xd3,0x81,0x81,0xd3,0x76,0x76,0xd3,0x81,0x81,0xd3,0x76,0x00,0x00,0x02,0x00,0x24,0xfe,0x63,0x06,0xf8,0x05,0xb3,0x00,0x18,0x00,0x21,0x00,0x00,0x21,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x10,0x12,0x21, +0x20,0x00,0x11,0x03,0x11,0x10,0x26,0x23,0x22,0x06,0x11,0x11,0x06,0xf8,0xfa,0x99,0x67,0x5f,0x60,0x66,0x01,0x55,0xfe,0xb6,0xc2,0xb6,0xc4,0xb4,0x01,0x57,0xff,0x01,0x03,0x01,0x02,0x01,0x01,0xa4,0xb1,0xae,0xb0,0xae,0x3f,0x46,0x4a,0x3b,0x93,0x86,0x90,0x8f,0x8b,0x02,0x9d,0x01,0x44,0x01,0x3f,0xfe,0xc5,0xfe,0xb8,0xfd,0x63,0x02, +0x8e,0x01,0x05,0xf4,0xf8,0xfe,0xff,0xfd,0x72,0x00,0x00,0x01,0x00,0x37,0xff,0xe6,0x06,0xe5,0x05,0xb3,0x00,0x1e,0x00,0x00,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x06,0xe5,0xfc,0xd6,0x67,0x56,0xf8,0xd5,0xd5, +0xf8,0x66,0x83,0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x93,0x93,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x00,0x01,0x00,0x32,0xff,0xe6,0x06,0xe9,0x05,0xb3,0x00,0x2d, +0x00,0x00,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x07,0x06,0xe9,0xfd,0x59,0x53,0x52,0x6c,0x79,0x71,0x61,0xa4,0x61,0x71,0x7b,0x6a,0x66, +0x5d,0x9b,0x5f,0x6c,0xc5,0xbe,0x6e,0x96,0x21,0x08,0x20,0x96,0x6f,0x76,0xad,0x60,0x4b,0x30,0x93,0x93,0x51,0x74,0x01,0x4b,0xf6,0x01,0x12,0x01,0x00,0xc7,0xeb,0xfc,0x9a,0x03,0x66,0xea,0xc8,0xfb,0xfe,0xe9,0xf9,0xfe,0x87,0x77,0x37,0x7f,0x01,0xa8,0xe2,0x01,0x56,0x01,0x6e,0x74,0x6b,0x6a,0x75,0xa3,0xfe,0xc0,0xe1,0x99,0xfe,0x93, +0x56,0x00,0x00,0x02,0x00,0x7e,0xff,0xe6,0x06,0x9e,0x07,0xc8,0x00,0x30,0x00,0x3c,0x00,0x00,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x04,0x02,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x06,0x4e,0x79,0xd9,0x88,0xac,0xd5,0xd6,0xd3,0x80,0xaf,0xac,0xfe,0xf0,0x8c,0x6e,0x6e,0x95,0x71,0x7d,0xb3,0x01,0x60,0xde,0xfd,0xba,0x77,0x5b,0x79,0x7a,0x9b,0x9f,0x1d,0xac,0xbb,0xb2,0xd7,0x7f,0x94,0x5e,0x65,0xa7,0x55,0x4b,0xbb,0xb2,0x7c,0x69,0x80, +0xa8,0x02,0x8e,0xb7,0xfe,0xc0,0xb1,0x01,0x1c,0xdd,0xdb,0x01,0x6c,0x9e,0x54,0x9d,0xfe,0xec,0xb7,0xb6,0xfe,0xc4,0x9e,0x3a,0xa6,0x01,0x7d,0xaa,0xe3,0x01,0x57,0xc6,0x8c,0x5b,0x97,0x51,0x62,0x6e,0x3b,0x8a,0x3f,0xba,0x95,0x6f,0xcf,0x72,0x6b,0xfe,0xde,0xba,0x94,0xfc,0x55,0x8d,0xfe,0xc6,0xc1,0xa3,0xbe,0x01,0x24,0x00,0x00,0x01, +0x00,0x37,0xfd,0xfe,0x06,0xe5,0x07,0x61,0x00,0x43,0x00,0x00,0x05,0x27,0x12,0x11,0x10,0x00,0x21,0x22,0x00,0x02,0x11,0x10,0x12,0x04,0x33,0x32,0x12,0x35,0x10,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x13,0x07,0x02,0x11,0x10,0x00,0x33,0x32,0x16,0x15,0x10,0x07,0x15,0x16,0x16,0x15,0x14,0x02,0x06, +0x23,0x22,0x24,0x02,0x02,0x35,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x11,0x14,0x02,0x06,0x53,0x9e,0x8b,0xfe,0xaf,0xfe,0xd1,0xd4,0xfe,0xa5,0xb6,0x9c,0x01,0x0e,0xb4,0xbf,0xd4,0xf8,0x72,0x65,0x63,0x6d,0x73,0x7a,0xa8,0xa0,0x8b,0x99,0x96,0x01,0x03,0xed,0xb9,0xd3,0xae,0x67,0x7d,0x96,0xff,0xa8,0xa9,0xfe,0xea,0xc9,0x74,0xde,0x01, +0xaa,0x01,0x0a,0xef,0x01,0x6b,0xc2,0x4c,0x19,0x37,0x01,0x9f,0x01,0x92,0x01,0xa6,0x01,0xd3,0xfe,0xfe,0xfe,0x32,0xfe,0xcd,0xfe,0xd1,0xfe,0x00,0xff,0x01,0x24,0xfd,0x01,0x7d,0x96,0x9b,0x85,0xa2,0x8d,0xfe,0xe7,0xfe,0xbd,0xfe,0xb1,0xfe,0xae,0x37,0x01,0x75,0x01,0x5f,0x01,0x69,0x01,0x90,0xf0,0xca,0xfe,0xf8,0x67,0x06,0x1e,0xfc, +0xb4,0xc0,0xfe,0xb0,0xa8,0xb1,0x01,0x4d,0x01,0xd0,0xe9,0x01,0x60,0x02,0x19,0x01,0x33,0xfd,0xfe,0x2f,0xfe,0xc6,0xd7,0xfe,0x31,0x00,0x00,0x01,0x00,0x46,0xfd,0xfe,0x06,0xd6,0x05,0xb3,0x00,0x3e,0x00,0x00,0x17,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x20,0x11, +0x10,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x22,0x06,0x11,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x02,0x15,0x10,0x17,0xd0,0x41,0x49,0x51,0x92,0x64,0x56,0x7e,0x2a,0x05,0x24,0x86,0x5a,0x5b,0x6f,0x31,0x06,0x26,0x7f,0x60,0x01,0x3c,0x7f,0xe3,0x99, +0x8c,0x6f,0x7e,0x77,0xb3,0xad,0x59,0x4e,0x5e,0x51,0xa3,0x4e,0x5b,0x63,0x54,0xa3,0x49,0x55,0x32,0x52,0x2f,0x7d,0x1a,0x85,0x01,0x91,0xdc,0xe8,0x01,0x4b,0xa8,0x56,0x6b,0x5f,0x62,0x52,0x73,0x64,0x61,0xfc,0xcf,0xfe,0xaa,0xfd,0xe8,0xfe,0xea,0x2d,0xac,0x40,0x01,0xe2,0x01,0xf7,0x01,0x51,0x01,0x57,0xda,0xfe,0xfe,0xfc,0xc4,0x03, +0x3c,0x01,0x05,0xd7,0xe9,0xf1,0xfc,0xc2,0x03,0x3e,0x01,0x0b,0xcf,0x8b,0xfe,0xf9,0xb5,0xfe,0x46,0xfa,0x00,0x02,0x01,0x25,0xff,0xe6,0x05,0xf6,0x05,0xb3,0x00,0x0b,0x00,0x30,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x04,0x33,0x32,0x36,0x12,0x35,0x34,0x02,0x26,0x27,0x07,0x16,0x16,0x15, +0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x20,0x27,0x03,0x6e,0x6e,0x5e,0x5e,0x7a,0x6e,0x5d,0x63,0x76,0xfd,0xb9,0x68,0x01,0x05,0x92,0xa8,0xfd,0x84,0x86,0xe3,0x82,0x03,0x55,0x62,0x62,0xb1,0x6f,0xa9,0xc8,0x86,0xed,0x9a,0xcb,0x01,0x41,0xb8,0xb6,0xfe,0xb1,0xcb,0xfe,0xbf, +0xbe,0x04,0x1e,0x69,0x80,0x82,0x64,0x66,0x7c,0x78,0xfd,0x84,0x5c,0x60,0x95,0x01,0x0f,0xb0,0x9f,0x01,0x12,0xa3,0x07,0x08,0x1c,0x9b,0x60,0x65,0xa5,0x5d,0xc6,0xa3,0x7f,0xbd,0x66,0xb4,0xfe,0xa9,0xd3,0xdc,0xfe,0xab,0xbe,0x94,0x00,0x01,0x00,0x4b,0xfd,0xfe,0x06,0xd1,0x05,0xb3,0x00,0x2d,0x00,0x00,0x01,0x11,0x10,0x00,0x21,0x22, +0x26,0x27,0x35,0x17,0x16,0x33,0x32,0x36,0x35,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x21,0x11,0x06,0xd1,0xfe,0xcd,0xfe,0xe6,0x46,0x76,0x55,0x4a,0x69,0x70,0xbb,0xdc,0xfd,0xa2,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83, +0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x01,0x9a,0x05,0x99,0xfa,0xb4,0xfe,0xe3,0xfe,0xce,0x13,0x14,0xac,0x18,0x22,0xc6,0xa3,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74, +0x05,0x06,0x00,0x02,0x00,0x3d,0xff,0xe6,0x06,0xde,0x07,0xc8,0x00,0x3f,0x00,0x4a,0x00,0x00,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x17,0x36,0x36, +0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x10,0x33,0x32,0x12,0x06,0x9e,0x64,0xac,0x6c,0x88,0xad,0xb0,0xad,0x57,0x59,0x88,0x91,0xa2,0xea,0x8c,0x88,0x65,0x58,0x9a,0x5c,0x6b,0x6e,0xc5,0x81,0x75,0xab,0x20,0x07,0x2b,0xc0,0x7d,0x90,0x85,0x3d, +0x49,0x60,0x63,0x3b,0x64,0x3f,0x17,0x89,0x97,0x8e,0xad,0x67,0x75,0x48,0x54,0xa4,0x2b,0x30,0x8f,0x7f,0x9a,0x61,0x6e,0x02,0x8e,0xbb,0xfe,0xc2,0xaf,0x01,0x18,0xe1,0xdd,0x01,0x6f,0xa0,0x4f,0xf6,0xe6,0xfc,0xc2,0x03,0x3e,0x01,0xdc,0xfe,0xe3,0xfe,0xd4,0xb4,0xfe,0x8c,0x8c,0x37,0x98,0x01,0x9f,0xbb,0xe4,0x01,0x4a,0xad,0x90,0x81, +0x83,0x8e,0x87,0x3a,0xa8,0x5c,0x63,0x6d,0x1d,0x1e,0x8a,0x3f,0xb8,0x97,0x6f,0xd0,0x70,0x6d,0xfe,0xdd,0xb8,0xb7,0xd9,0x4b,0x84,0xfe,0xd5,0xcf,0xfe,0x9f,0x01,0x13,0x00,0x02,0x00,0xdf,0xff,0xf4,0x05,0x88,0x03,0xf1,0x00,0x0b,0x00,0x1b,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x24,0x26, +0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x04,0x03,0x32,0xc7,0xdf,0xdf,0xc7,0xc5,0xdd,0xdd,0xc5,0xaa,0xfe,0xee,0x97,0x95,0x01,0x13,0xab,0xae,0x01,0x14,0x94,0x97,0xfe,0xee,0x87,0xc2,0xa9,0xab,0xc1,0xc3,0xa9,0xa9,0xc2,0x93,0x7f,0xe9,0x96,0x97,0xea,0x7e,0x7f,0xe9,0x97,0x96,0xe8,0x80,0x00,0x00,0x02,0x00,0xa3, +0xff,0xf4,0x05,0xc4,0x03,0xf1,0x00,0x2b,0x00,0x37,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x04,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x27,0x26,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34, +0x26,0x23,0x22,0x06,0x02,0x49,0x74,0x5a,0x5d,0x77,0xe8,0xc2,0xb7,0xe7,0xa0,0x01,0x2c,0xc4,0xbf,0x01,0x2c,0xa6,0xcb,0xc2,0x6d,0x6f,0x7a,0xdc,0x8a,0xd9,0xfe,0xf9,0x3f,0x73,0x43,0x82,0x41,0x03,0x55,0x6a,0x6c,0x3a,0x2a,0x27,0x3a,0x39,0x28,0x2b,0x39,0x01,0xb7,0x58,0x78,0x7b,0x63,0xc5,0xf0,0x01,0x05,0xd6,0x9f,0xf9,0x8a,0x88, +0xfa,0x9d,0xc0,0xf6,0x27,0x95,0x1d,0xa8,0x83,0x74,0xb5,0x63,0xd9,0xb6,0x62,0x91,0x51,0x58,0x06,0x06,0x72,0x58,0x29,0x39,0x37,0x2b,0x29,0x39,0x39,0x00,0x00,0x02,0x00,0xc6,0x00,0x00,0x05,0xa2,0x05,0xe6,0x00,0x3e,0x00,0x4a,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23, +0x21,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x34,0x76,0x72,0x41,0x5d,0x15, +0x07,0x0d,0x6e,0x4a,0x7e,0x89,0xb7,0xa0,0xfd,0xd2,0xa1,0xb6,0xad,0x66,0x5b,0x02,0x00,0x5b,0x64,0x36,0x33,0x2e,0x3f,0x03,0x91,0x02,0x3e,0x2d,0x31,0x31,0x27,0x1e,0x05,0x04,0x55,0x44,0x44,0x57,0x64,0x5d,0x96,0xa9,0x01,0x67,0x1f,0x2e,0x2d,0x20,0x1e,0x2d,0x2e,0x02,0x98,0xb3,0xa9,0x48,0x45,0x3f,0x4e,0xaf,0x99,0xfe,0x9e,0x9b, +0xaf,0xb0,0x9a,0x04,0x9c,0xfb,0x6f,0x5b,0x60,0x60,0x5b,0x01,0x5e,0x55,0x5a,0x4c,0x3e,0x3e,0x4c,0x58,0x72,0x4f,0x73,0x10,0x05,0x05,0x18,0x42,0x58,0x59,0x41,0x4f,0x56,0xb1,0x3e,0x2b,0x20,0x20,0x2a,0x2a,0x20,0x20,0x2b,0x00,0x00,0x02,0x00,0xbb,0xff,0xf4,0x05,0xac,0x03,0xf3,0x00,0x2d,0x00,0x39,0x00,0x00,0x05,0x22,0x02,0x35, +0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x02,0x07,0x35,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x68,0xc3,0xea,0xc8,0xa4,0x5f,0x8d,0x24,0x1e, +0x91,0x63,0xa2,0xc1,0xc4,0xa5,0xb8,0x78,0x58,0x4e,0x53,0xab,0x58,0x4f,0x56,0x77,0x37,0x07,0x06,0x6f,0x58,0x5b,0x76,0x7a,0x55,0x29,0x39,0x39,0x29,0x2a,0x37,0x38,0x0c,0x01,0x1d,0xeb,0xdf,0x01,0x18,0x72,0x74,0x6b,0x7b,0xfe,0xea,0xdf,0xce,0xfe,0xe9,0x24,0x96,0x3c,0x01,0x37,0x92,0xd0,0x9c,0x91,0x91,0x9c,0xce,0x96,0xb0,0x74, +0x02,0x54,0x68,0x74,0x58,0x5d,0x79,0x01,0x38,0x02,0x39,0x29,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x02,0x00,0xcf,0xff,0xed,0x05,0x98,0x05,0x82,0x00,0x3b,0x00,0x47,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26, +0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x18,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda, +0xed,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0x01,0x6f,0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0x01,0xae,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57, +0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x45,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x00,0x03,0x00,0xcf,0xff,0xed,0x05,0x98,0x05,0x82,0x00,0x43,0x00,0x4f,0x00,0x5b,0x00,0x00,0x01,0x07,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16, +0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x14,0x16,0x33, +0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0xaa,0x08,0x9e,0x8f,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda,0xed,0xb0,0xc5,0x3d,0x74,0x59,0x64,0x72,0xdd,0x27,0x3b,0x38, +0x2a,0x27,0x3b,0x3c,0xfe,0x0f,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x04,0x3d,0x10,0x29,0x72,0x52,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x4f,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xb9,0x01, +0x03,0x58,0x3c,0x5c,0x5a,0x75,0x81,0xfc,0xf7,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x02,0xbc,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x02,0x01,0x08,0xff,0xf4,0x05,0x5f,0x05,0x6a,0x00,0x28,0x00,0x34,0x00,0x00,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x26,0x02,0x27,0x33,0x16,0x16,0x17,0x36,0x36,0x33, +0x32,0x04,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x6d,0x47,0x8b,0xa9,0xc6,0xae,0x9b,0x47,0xa9,0x46,0x30,0xae,0x49,0xd5,0x2c,0x49,0x25,0x30,0x91,0x3b,0xe7,0x01,0x05,0x7e,0xeb,0x98,0xca,0xfe,0xfa,0x7a,0x6a,0x58, +0x75,0x75,0x5b,0x60,0x3b,0x28,0x28,0x3b,0x3b,0x28,0x2a,0x39,0xb9,0x34,0xc2,0xb1,0xa2,0xb0,0x26,0x1f,0xa1,0x01,0x70,0x54,0x44,0xd5,0xa6,0x16,0x1a,0xfc,0xe7,0x98,0xec,0x80,0xd7,0xaa,0x6d,0x7c,0x74,0x5c,0x57,0x76,0xce,0x2a,0x39,0x3c,0x27,0x29,0x3b,0x3a,0x00,0x02,0x00,0x35,0xff,0xf4,0x06,0x33,0x05,0xe6,0x00,0x3b,0x00,0x47, +0x00,0x00,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x3e,0x02,0x33,0x32,0x12,0x15,0x14,0x06,0x07,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x21,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x06,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x05,0x06,0x06, +0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0xac,0xa3,0x53,0x8a,0x23,0x0d,0x48,0x66,0x36,0xa0,0xac,0x25,0x15,0x46,0x56,0x62,0xae,0x58,0xa4,0x66,0xfe,0xe2,0x5d,0x52,0x4d,0x2d,0x49,0x29,0xa7,0x01,0x53,0x47,0x51,0x58,0x37,0x07,0x06,0x70,0x58,0x5c,0x74,0x7b,0x64,0x80,0xc5,0x6a,0x01,0xbf,0x2a,0x3a,0x3a,0x2a,0x29,0x39, +0x3a,0x01,0xfc,0xf8,0x01,0x00,0x75,0x66,0x37,0x65,0x3f,0xfe,0xfe,0xf4,0x64,0xce,0x31,0x5f,0x5b,0x04,0x91,0xfb,0x64,0x5d,0x97,0x56,0xc8,0x01,0x36,0xa7,0xbd,0x45,0x8c,0x64,0x9f,0x96,0xb8,0xae,0xbb,0x69,0x02,0x57,0x65,0x75,0x57,0x5f,0x77,0x82,0xec,0x36,0x02,0x39,0x29,0x2a,0x38,0x3b,0x27,0x27,0x3d,0x00,0x00,0x02,0x00,0xa7, +0xff,0xf6,0x05,0xc1,0x05,0x82,0x00,0x40,0x00,0x4c,0x00,0x00,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x06,0x07,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x17,0x36,0x36, +0x33,0x32,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x21,0x16,0x1b,0x57,0x78,0x77,0x56,0x5c,0x77,0x9e,0x80,0x2f,0x57,0x56,0x45,0x3e,0x3e,0x1b,0x1e,0x25,0x18,0x10,0x02,0xda,0xfd,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c, +0xb4,0x16,0x6f,0x5d,0x26,0x49,0x49,0x52,0x46,0x4b,0x1c,0x2e,0x49,0x0d,0x9a,0x3b,0x29,0x27,0x3b,0x3a,0x28,0x27,0x3d,0x01,0x18,0x05,0x76,0x59,0x5a,0x75,0x7c,0x65,0xd1,0xfe,0xf7,0x27,0x46,0x4d,0x44,0x2e,0x33,0x57,0x84,0x1b,0x02,0xf1,0xc7,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71, +0x93,0x5f,0xca,0x39,0x8b,0x7f,0x22,0x39,0x54,0x4c,0x34,0x49,0x3d,0xd0,0x29,0x3b,0x39,0x2b,0x29,0x39,0x3a,0x00,0x00,0x02,0x00,0x67,0xff,0xf4,0x06,0x00,0x04,0xfe,0x00,0x37,0x00,0x43,0x00,0x00,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x02,0x06,0x23,0x22,0x26, +0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01,0x23,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x25,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x67,0xd9,0xc5,0x57,0x9d,0x2b,0x1e,0x51,0x38,0x1a,0x3f,0x4b,0x35,0x37,0x15,0x31,0x37,0xa8,0x54,0x79,0x43,0x23, +0x55,0x51,0x1d,0x2e,0x11,0x1d,0x2d,0x0b,0x01,0x13,0xc1,0xe5,0x3e,0x6d,0x3f,0x4a,0x67,0x31,0x3c,0x08,0x6f,0x58,0x5b,0x76,0x7a,0x65,0xc7,0xe6,0x01,0xbd,0x2a,0x39,0x3a,0x29,0x2a,0x37,0x38,0x01,0xdb,0xfa,0x01,0x1c,0x6a,0x57,0x94,0x7a,0x26,0x48,0x35,0x26,0xe1,0xa8,0x88,0xfe,0xe5,0x8f,0x32,0x51,0x1d,0x28,0x88,0x7f,0xfd,0x73, +0x02,0x46,0xa1,0x7a,0x63,0xb5,0x6a,0x9d,0x76,0x5c,0x6e,0x74,0x58,0x5d,0x79,0x01,0x06,0x32,0x02,0x3b,0x27,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x00,0x02,0x00,0xd0,0xff,0xf2,0x05,0x97,0x04,0xa3,0x00,0x0f,0x00,0x1e,0x00,0x00,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x13,0x32,0x36,0x35, +0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x03,0x3a,0xaa,0x01,0x18,0x9b,0x9e,0xfe,0xe6,0xaf,0xa9,0xfe,0xe7,0x9e,0xa0,0x01,0x1e,0xa2,0xcb,0xf2,0x6d,0xc7,0x7f,0x82,0xcd,0x71,0x71,0xc9,0x04,0xa3,0x9a,0xfe,0xed,0xad,0xad,0xfe,0xec,0x96,0x9c,0x01,0x14,0xa7,0xa9,0x01,0x15,0x9c,0xfb,0xe5,0xf9,0xc8,0x80,0xd0,0x74, +0x76,0xd0,0x80,0x7d,0xcf,0x73,0x00,0x02,0x00,0xd2,0xff,0xf7,0x05,0x95,0x04,0xa3,0x00,0x2a,0x00,0x36,0x00,0x00,0x05,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15, +0x10,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x4d,0x75,0x80,0x94,0x70,0xc9,0x81,0x85,0xc7,0x6e,0x85,0x6e,0x2d,0x15,0x38,0x69,0x48,0x48,0x6b,0x5b,0xa4,0x6f,0x75,0xbc,0x68,0xa0,0x01,0x11,0xaf,0xa5,0x01,0x15,0xa9,0xfd,0x93,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x09,0x70,0x69,0x01,0x19,0x97,0x65,0xb9, +0x6f,0x6a,0xbc,0x71,0x9a,0xb4,0x0b,0x34,0x4d,0x4b,0x69,0x6b,0x49,0x4e,0x81,0x49,0x73,0xd6,0x8e,0x97,0x01,0x07,0x92,0x8e,0xfe,0xfa,0x8f,0xfe,0x90,0x65,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x02,0x01,0x47,0xff,0xf2,0x05,0x21,0x06,0x66,0x00,0x25,0x00,0x31,0x00,0x00,0x25,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x01,0x36,0x12,0x37,0x17,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x08,0x26,0x26,0x65,0x4b,0x50,0x65,0x6c,0xc8,0x7e,0xa2,0xfb,0x8b,0x01,0x82,0x94,0xca,0x3a,0x92,0x2e,0x5c,0x75,0x8d,0x69,0x8f,0x57, +0x27,0x69,0xba,0x6a,0x61,0x90,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0xa1,0x26,0x3e,0x2d,0x50,0x62,0x68,0x4a,0x58,0x93,0x55,0x7f,0xe8,0x93,0x01,0x2b,0x01,0x35,0x77,0x01,0x06,0x9d,0x36,0x7b,0xa7,0x89,0x77,0x5a,0x91,0x7b,0x71,0x51,0x5c,0xa0,0x62,0x6b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0xa3,0xff,0xf2, +0x05,0xc4,0x06,0xac,0x00,0x45,0x00,0x50,0x00,0x5c,0x00,0x00,0x01,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x26,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x12,0x35,0x34, +0x2e,0x03,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x04,0x17,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0xe3,0xec,0x71,0x4f,0x26,0x1d,0x2a,0x44,0x67,0xe9,0xc2,0x6f,0x35,0x64,0xb5,0x71,0x62,0xcb,0x6a,0x47,0x9f,0x69,0x49,0x68,0x69,0x48,0x36,0x57, +0x16,0x27,0x1c,0x54,0x7a,0x7f,0x62,0x76,0x86,0x56,0x5d,0xa3,0x39,0x6d,0x81,0x1f,0x3c,0x59,0x73,0xb3,0x78,0x6a,0x3e,0x8b,0x66,0x56,0x01,0x2a,0x96,0xfd,0x51,0x27,0x2e,0x24,0x17,0x20,0x39,0xf9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0x66,0x71,0x2d,0x12,0x2d,0x1e,0x1d,0x2e,0x28,0x59,0x74,0x93,0xcf,0x8f,0xc0,0xfe,0xc6,0xae, +0x81,0x6f,0x78,0x78,0x69,0x49,0x4b,0x69,0x3b,0x30,0x32,0x4c,0x74,0x01,0x4f,0x72,0x72,0x97,0xd8,0xd4,0x9c,0xe5,0x73,0x81,0x01,0x1d,0xfc,0x65,0x92,0x6c,0x4c,0x3c,0x40,0x2b,0x43,0x57,0x3a,0x5f,0x82,0x68,0x53,0xfc,0x2e,0x69,0x77,0x81,0x93,0x39,0x3e,0x4c,0xe4,0xfd,0xf9,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03, +0x00,0xdd,0xff,0xf2,0x05,0x8a,0x06,0x3d,0x00,0x3d,0x00,0x47,0x00,0x53,0x00,0x00,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x24,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x05,0x0e,0x02,0x15,0x14,0x16,0x33,0x32, +0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0xa7,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x5c,0xbc,0xa9,0x01,0x42,0x85,0x4b,0x1e, +0xa8,0xb4,0xcc,0xfe,0xf4,0x87,0x98,0x44,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0xf8,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x5e,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x02,0x0e,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa5,0xe0,0x8c,0x2c,0x54,0x2f,0x34,0x41,0x2f, +0xa3,0xb0,0x86,0xa0,0x34,0x45,0x23,0x6d,0xa7,0xa2,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0xfe,0xb6,0x50,0x2c,0x1f,0x20,0x27,0x01,0x7b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x04,0x00,0xdd,0xff,0xf2,0x05,0x8a,0x06,0x3d,0x00,0x47,0x00,0x51,0x00,0x5c,0x00,0x68,0x00,0x00,0x01,0x14,0x06,0x23, +0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x25,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36, +0x36,0x35,0x35,0x33,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x77,0xd0,0xa8,0x23,0x72,0x80,0xc7,0x9c,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0x47,0x32,0x64,0x16,0x2b,0x3a,0x19, +0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x68,0xe7,0x01,0x20,0x0f,0x4c,0x66,0x4d,0x4a,0x67,0x0b,0x2b,0x3f,0xa5,0xfe,0x7f,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x7d,0x35,0x2a,0x17,0x1c,0x25,0x31,0xf7,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0xd5,0x99,0xbe,0x23,0x3c,0x31,0x4a,0xd9,0xb6,0xb9,0xd4, +0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa6,0xc8,0x9e,0x6b,0x08,0x35,0x5c,0x49,0x6b,0x71,0x47,0x18,0x1d,0x1c,0x6b,0x4b,0x5e,0xfa,0x87,0x50,0x2c,0x1f,0x20,0x27,0x03,0xf6,0x21,0x29,0x1c,0x29,0x27,0x1e,0x18,0x30,0xfd,0x83, +0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x44,0xff,0xf2,0x06,0x24,0x06,0xac,0x00,0x4d,0x00,0x58,0x00,0x64,0x00,0x00,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36, +0x33,0x32,0x05,0x07,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0xfe, +0x36,0x57,0x15,0x2e,0x40,0x54,0x94,0x54,0x5b,0x40,0x63,0x79,0x5a,0x5b,0x6f,0x5d,0x39,0x62,0x50,0x93,0x59,0x35,0x74,0xd1,0xa0,0x70,0x6f,0x92,0x5d,0xa7,0x01,0x70,0x46,0x8f,0xa7,0x5a,0x3f,0x1d,0x28,0x48,0x5f,0xfb,0xed,0x69,0x84,0xe1,0x82,0x9d,0x6d,0x71,0x98,0x87,0xe1,0x7e,0x76,0xcc,0x78,0x48,0x6b,0x6c,0xf0,0x14,0x25,0x21, +0x1a,0x1a,0x25,0xf4,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x03,0x50,0x3b,0x30,0x43,0xe3,0x6e,0x71,0xc0,0x6e,0x37,0x6f,0x87,0x62,0x7f,0x7f,0x62,0x87,0x6d,0x39,0x88,0xe6,0x80,0xa4,0xa7,0x7b,0x70,0x38,0x27,0x7e,0x4e,0x58,0x7d,0xbb,0x8b,0x43,0x4f,0x1e,0x2e,0x1d,0x20,0x2f,0x24,0x5d,0xb8,0xfe,0xfe,0xcb,0xaf,0xfe,0xd5,0xaa,0x6a, +0x6a,0x94,0x01,0x04,0x9f,0xa1,0x01,0x3a,0xb2,0x6b,0x49,0x49,0x69,0xfd,0xd9,0x14,0x57,0x17,0x2f,0x35,0x32,0x2a,0x4b,0x02,0x5b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x9a,0xfd,0xeb,0x05,0xce,0x04,0xa5,0x00,0x2d,0x00,0x37,0x00,0x43,0x00,0x00,0x01,0x24,0x33,0x32,0x12,0x15,0x11,0x23,0x11,0x34,0x26,0x26, +0x23,0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x32,0x01,0x16,0xc4,0xd3,0xef,0xa8,0x4d, +0x82,0x4b,0x4c,0xee,0x5f,0x39,0x39,0x57,0x74,0x44,0x49,0x68,0x69,0x48,0x3b,0x32,0x17,0x1a,0x22,0x48,0x41,0x57,0x66,0x70,0x4a,0x48,0x5f,0x44,0x29,0x3d,0x1b,0x24,0x26,0x19,0x2c,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x0f,0x96,0xfe,0xeb,0xf3,0xfb,0x4e,0x04,0xb2,0x66,0xab,0x61,0x4b,0x36,0xa7,0xba,0x55,0xea,0xa3,0x59, +0x69,0x49,0x4b,0x69,0x27,0x34,0x8f,0x37,0xac,0x73,0x22,0x69,0x52,0x4c,0x70,0x3c,0x92,0x5a,0x2a,0x1b,0x1b,0x30,0xfc,0xca,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x04,0x00,0xb9,0xfe,0xa4,0x05,0xae,0x04,0xa5,0x00,0x4a,0x00,0x5d,0x00,0x67,0x00,0x73,0x00,0x00,0x01,0x36,0x36,0x33,0x32,0x16,0x11,0x10,0x02,0x06,0x07,0x16, +0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x07,0x06,0x07,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x01,0x14,0x16, +0x33,0x32,0x36,0x37,0x36,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x35,0x01,0x06,0x06,0x05,0x34,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x43,0x1d,0xd2,0x3c,0xa8,0x98,0x19,0x38,0x34,0x5e,0x6b,0x48,0x49,0x6a,0x15,0x5b,0x45,0xbc,0x86,0x8c,0x3e,0x63,0x6e,0xae,0xbf, +0x02,0x0d,0x7d,0x54,0x1c,0x3c,0x40,0x56,0xa3,0x22,0x0f,0x14,0x39,0x4a,0x5a,0x36,0x58,0x60,0x39,0x2c,0x0d,0x62,0x3f,0x48,0x6b,0x6c,0x47,0x74,0xcf,0x7a,0x5c,0xa6,0x66,0x44,0x9c,0xfe,0x62,0x21,0x16,0x1c,0x60,0x60,0x82,0x01,0x21,0x42,0x21,0x2c,0x26,0x31,0xfd,0x99,0xae,0x87,0x03,0xb6,0x47,0x3c,0x26,0x1c,0x1c,0x25,0xfd,0x5f, +0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x3f,0x1b,0x49,0xee,0xff,0x00,0xfe,0xff,0xfe,0xf8,0x88,0x1b,0x35,0x7e,0x46,0x6c,0x6c,0x51,0x20,0x26,0x16,0x1e,0x57,0x41,0x2f,0x6a,0x67,0x56,0x95,0x53,0xe5,0x36,0x7a,0x72,0x7d,0x8f,0x3f,0x5a,0x13,0x05,0x03,0x24,0x2a,0x21,0x78,0x7b,0x3a,0x70,0x1b,0x44,0x50,0x6b,0x49,0x49,0x69,0x70, +0xc2,0x71,0x71,0xaf,0x5f,0x38,0xfb,0x11,0x1d,0x1f,0x25,0x2e,0x3e,0x68,0x06,0x19,0x7f,0x49,0x42,0xfe,0xf0,0x4d,0x5b,0x46,0x35,0x20,0x24,0x31,0x19,0x29,0x26,0x02,0xb8,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x15,0xff,0xf2,0x06,0x52,0x04,0xa1,0x00,0x33,0x00,0x3f,0x00,0x00,0x01,0x12,0x11,0x14,0x06,0x06, +0x23,0x22,0x26,0x26,0x35,0x37,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x10,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0xb0,0xa2,0x70,0xcd,0x84, +0x78,0xca,0x6a,0x03,0x0c,0xfe,0xe9,0x88,0x97,0x5e,0x17,0x50,0x30,0x48,0x6b,0x6c,0x47,0x6e,0xba,0x76,0xf3,0xcf,0xcf,0xf6,0x06,0x07,0x91,0x83,0x78,0x8d,0x9c,0xfc,0xa9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x9f,0xfe,0x8d,0xfe,0xdf,0x9f,0xf6,0x84,0x5f,0xb4,0x7a,0x56,0xcd,0x22,0x01,0x47,0xc6,0xb2,0xfe,0xf2,0x83,0x27,0x2f, +0x6b,0x49,0x49,0x69,0xb0,0x01,0x49,0xa5,0xf4,0x01,0x1d,0xfd,0xdc,0x30,0x6b,0x6c,0x33,0x7a,0x8c,0xbb,0xc8,0x01,0x1a,0x01,0x42,0xfb,0xfe,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x01,0x09,0x01,0xb4,0x04,0x6f,0x05,0x9a,0x00,0x0c,0x00,0x1c,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26, +0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0xbd,0x79,0x93,0x8d,0x7f,0x80,0x8a,0x42,0x78,0x50,0x74,0xcb,0x73,0x6d,0xc8,0x7d,0x75,0xcb,0x74,0x6f,0xca,0x05,0x09,0xc9,0x9a,0xa5,0xbc,0xbb,0xa6,0x62,0xa6,0x5b,0x91,0x86,0xe6,0x89,0x92,0xe3,0x7c,0x80,0xe4,0x8d,0x8c,0xe6,0x83,0x00, +0x00,0x01,0x01,0x22,0xff,0x83,0x04,0x56,0x05,0x9a,0x00,0x1d,0x00,0x00,0x05,0x36,0x00,0x35,0x34,0x02,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x00,0x07,0x01,0xa7,0xfa,0x01,0x0b,0x5d,0x3d,0x35,0xb1,0x60,0x42,0x39,0x9b,0x39,0x51,0xa5,0x01,0x14,0x6f,0x4b, +0x78,0x49,0x85,0xfe,0xf0,0xb0,0x19,0xe7,0x01,0xb7,0xba,0x97,0x01,0x33,0x35,0x39,0x18,0x4b,0xb0,0x43,0x4d,0x51,0xe6,0x5f,0x3a,0x78,0x5a,0x88,0xfe,0xed,0x90,0x9b,0xfe,0xae,0xfe,0x9b,0x9a,0x00,0x00,0x01,0x00,0xf8,0xff,0x83,0x04,0x80,0x05,0x9a,0x00,0x23,0x00,0x00,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32, +0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x12,0x13,0x03,0xe7,0x21,0x4d,0x63,0x85,0x57,0x74,0x5b,0x1b,0x6d,0xb8,0x41,0x41,0x5d,0x79,0x77,0x6a,0x53,0xf2,0x6d,0x42,0xa3,0xe7,0x6b,0xba,0xd0,0x38,0x61,0x64,0x62,0x88,0x1c,0x7d,0xf0,0x01,0x05,0xa0,0x59,0x36, +0x8c,0x3b,0x18,0x54,0xc7,0x48,0x59,0x63,0x90,0x73,0x85,0x90,0x7f,0x98,0x8b,0x5d,0x9f,0x89,0x5d,0x5f,0xfe,0x91,0xfe,0xff,0x00,0x01,0x01,0x0e,0xff,0x83,0x04,0x69,0x05,0x9a,0x00,0x31,0x00,0x00,0x01,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14, +0x06,0x06,0x07,0x16,0x17,0x07,0x02,0x21,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x01,0xa0,0x8c,0x8f,0x33,0x2e,0x59,0x4a,0x5c,0x69,0x4e,0xec,0x60,0x3c,0x8b,0xee,0x71,0x9c,0xbf,0xb1,0x8e,0x2d,0x63,0x53,0x88,0x5b,0x8d,0xa8,0xfe,0xa1,0x37,0x36,0x37,0x5f,0x69,0x85,0x6c,0x59,0x7c,0x78, +0x73,0x43,0x81,0x23,0x03,0x68,0x36,0x08,0x41,0x67,0x32,0x4b,0x4e,0x7f,0x5b,0x7b,0x77,0x79,0x99,0x84,0x8b,0x92,0x52,0x93,0x59,0x78,0x75,0x37,0x69,0xc4,0x4e,0x01,0x68,0x14,0x81,0x23,0x28,0x2c,0x97,0x46,0x53,0x5e,0x18,0x11,0x00,0x01,0x00,0xb7,0xff,0x83,0x04,0xc0,0x05,0x9a,0x00,0x22,0x00,0x00,0x01,0x20,0x11,0x34,0x37,0x22, +0x0e,0x02,0x15,0x14,0x12,0x12,0x04,0x17,0x07,0x26,0x00,0x00,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x17,0x06,0x15,0x14,0x16,0x33,0x37,0x07,0x06,0x04,0x68,0xfe,0x53,0x0e,0x2e,0xa9,0x76,0x1b,0x86,0xfb,0x01,0x1c,0x77,0x30,0x97,0xfe,0xb0,0xfe,0xe9,0x90,0x57,0x01,0x32,0x83,0x8e,0x27,0x13,0x8a,0x91,0x40,0x10,0x2a,0x02,0xa8,0x01, +0xc3,0x57,0x50,0x1c,0x23,0x2a,0x45,0x92,0xfe,0xa9,0xfe,0xad,0xf2,0x2b,0x88,0x32,0x01,0x13,0x01,0x80,0x01,0x7e,0xac,0x6f,0x61,0x58,0x29,0x9f,0x3f,0xb0,0x9e,0x05,0x9d,0x05,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0xff,0x05,0xae,0x00,0x16,0x00,0x00,0x01,0x12,0x12,0x17,0x07,0x26,0x02,0x03,0x06,0x23,0x22,0x26,0x02,0x03,0x37,0x17, +0x12,0x16,0x33,0x32,0x37,0x02,0x03,0x03,0x36,0x19,0xee,0xc2,0x4c,0x98,0xe5,0x46,0xa6,0x81,0x73,0x93,0x48,0x03,0xa5,0x08,0x09,0x69,0x6d,0x3c,0x91,0x3c,0x0b,0x05,0xae,0xfd,0xd5,0xfd,0x09,0x8f,0x7a,0x62,0x01,0x9b,0x01,0x24,0x56,0x9e,0x01,0x57,0x01,0x57,0x14,0x9d,0xfe,0xbf,0xf1,0x4e,0x01,0x2c,0x01,0x41,0x00,0x01,0x00,0x6c, +0xff,0xf6,0x05,0x0b,0x05,0x9a,0x00,0x2c,0x00,0x00,0x01,0x12,0x12,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x02,0x03,0x01,0x10,0x0d,0x94,0xef,0x9d,0x39,0x8f,0x5c,0x61,0x61,0x70, +0x7f,0x73,0x40,0xdb,0xaf,0x53,0xa0,0x5b,0x4e,0x9a,0x65,0x67,0x7a,0x5f,0x63,0x99,0x7d,0x57,0x35,0x8c,0xee,0x74,0xbe,0xfe,0xe1,0xb5,0x1f,0x04,0x66,0xfe,0xd1,0xfe,0x33,0xe3,0x5a,0x91,0x52,0x42,0x6d,0x31,0x38,0x3f,0x62,0x7a,0x4e,0x95,0xc0,0x45,0x42,0x73,0x69,0x6c,0x5a,0x3c,0x6a,0x34,0x51,0x4b,0x54,0x68,0x41,0x70,0xdb,0x8f, +0xf0,0x01,0xf1,0x01,0x75,0x00,0x00,0x01,0x00,0x3b,0xff,0xf6,0x05,0x3c,0x05,0xae,0x00,0x26,0x00,0x00,0x01,0x0a,0x02,0x23,0x22,0x26,0x27,0x36,0x37,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x02,0x03,0x27,0x12,0x12,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x02,0x07,0x16,0x33,0x32,0x36,0x12,0x12,0x13,0x05,0x3c,0x07,0x72,0xf7,0xd9, +0x71,0x98,0x45,0x0a,0x19,0x89,0x6d,0x67,0x6b,0x79,0x90,0x1b,0x8d,0x1c,0x68,0xb7,0x93,0x6f,0x9c,0x54,0x3e,0x73,0x3a,0x34,0x2c,0x83,0xa4,0x61,0x31,0x0a,0x05,0xae,0xfd,0xac,0xfd,0xa6,0xfe,0xf6,0x29,0x2a,0x18,0x2c,0xef,0x01,0x4f,0x8a,0x92,0x81,0xfe,0xe8,0xfe,0xbd,0x2f,0x01,0x1b,0x01,0x19,0x89,0x65,0xb1,0x68,0x69,0xfe,0xf8, +0xfe,0xe9,0x5c,0x10,0x77,0x01,0x01,0x01,0xc4,0x01,0xd7,0x00,0x00,0x01,0x00,0xcb,0xff,0x83,0x04,0xad,0x05,0xae,0x00,0x15,0x00,0x00,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x3e,0x02,0x37,0x17,0x04,0x07,0x36,0x33,0x32,0x04,0x12,0x17,0x04,0x14,0x12,0x80,0xa2,0xb4,0x5b,0x83,0x60,0x23,0x2b,0x9f,0xda,0x63,0x6a,0xfe,0xeb, +0x87,0x38,0x3e,0x89,0x01,0x1b,0xda,0x19,0x7d,0x81,0x01,0x4c,0xf6,0x85,0x39,0x7e,0x67,0xef,0xf2,0x56,0x64,0xff,0xf6,0x07,0xfe,0xfe,0x43,0xdb,0x00,0x01,0x00,0xe3,0xff,0x83,0x04,0x95,0x05,0x9a,0x00,0x25,0x00,0x00,0x05,0x26,0x35,0x10,0x12,0x00,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x2e,0x02,0x35, +0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x02,0x15,0x14,0x17,0x01,0x0e,0x2b,0xce,0x01,0x45,0xbc,0x66,0x6c,0x73,0x4b,0x28,0x85,0x72,0x21,0x7a,0xaa,0x5c,0x36,0x3d,0x3a,0x39,0x1e,0x2b,0x88,0xeb,0x91,0x2e,0x7d,0x95,0xc0,0x01,0x31,0x02,0x4d,0x01,0x44,0x4d,0x45,0x88,0x6b,0x46,0x33,0x1a,0x41,0x54,0x0f,0x91,0x12, +0x54,0x74,0x3d,0x28,0x56,0x3b,0x38,0x5c,0x2d,0x19,0x12,0xfe,0xda,0xfd,0xf6,0xfc,0xc5,0x78,0x00,0x02,0x00,0x47,0xff,0xf1,0x03,0xc8,0x03,0x6e,0x00,0x0f,0x00,0x1b,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xc8, +0x78,0xd2,0x78,0x78,0xd0,0x77,0x79,0xd0,0x76,0x79,0xd0,0x79,0x97,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x01,0xaf,0x76,0xce,0x7a,0x79,0xd0,0x75,0x7a,0xd1,0x74,0x75,0xd0,0x7a,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x01,0x00,0x5a,0xff,0xf1,0x03,0xb5,0x03,0x6e,0x00,0x1b,0x00,0x00,0x13,0x36,0x36,0x33,0x32,0x16,0x16,0x15, +0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x5b,0x3d,0xe0,0x84,0x79,0xcb,0x75,0x7c,0xd1,0x76,0x85,0xda,0x39,0x89,0x26,0x88,0x59,0x84,0xb0,0xac,0x7e,0x5c,0x93,0x24,0x02,0x68,0x7a,0x8c,0x7a,0xd0,0x75,0x73,0xd1,0x7a,0x91,0x7b,0x37,0x54,0x60,0xab,0x7c,0x7f,0xb9,0x65, +0x58,0x00,0x00,0x01,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x64,0x00,0x12,0x00,0x00,0x05,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xcc,0x70,0xc5,0x85,0x92,0xcf,0x6d,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x97,0x0d,0x91,0xef,0x75,0x6f,0xc7,0x82,0x52,0x8a,0x4d,0xc8,0xb1,0x03,0x5e, +0x00,0x01,0x00,0x5a,0xfd,0xfe,0x03,0xb5,0x03,0x6e,0x00,0x1f,0x00,0x00,0x01,0x01,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x27,0x01,0x02,0xea,0xfd,0xcb,0x2d,0x2e,0x89,0x26,0x88,0x59,0x83,0xb1,0xab,0x7f,0x5c,0x93,0x24,0x86, +0x3d,0xe0,0x84,0x79,0xcc,0x74,0x7c,0xd1,0x76,0x05,0x05,0x01,0xc2,0xfd,0xfe,0x02,0x7d,0x32,0x54,0x38,0x54,0x60,0xa8,0x7e,0x80,0xb4,0x65,0x58,0x46,0x7a,0x8c,0x78,0xcd,0x75,0x73,0xd1,0x7a,0x01,0xfe,0x07,0x00,0x01,0x00,0x5a,0xfd,0xfe,0x03,0xb5,0x03,0x6e,0x00,0x1f,0x00,0x00,0x13,0x01,0x07,0x23,0x22,0x26,0x26,0x35,0x34,0x36, +0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x07,0x01,0x79,0x01,0xb5,0x0b,0x06,0x75,0xd2,0x7c,0x74,0xcb,0x7a,0x84,0xdd,0x40,0x86,0x25,0x93,0x5b,0x7f,0xab,0xb2,0x82,0x59,0x88,0x26,0x89,0x2a,0x32,0xfd,0xe0,0xfd,0xfe,0x01,0xf9,0x01,0x7a,0xd0,0x74,0x74,0xcd,0x79,0x8b, +0x7b,0x46,0x58,0x65,0xb3,0x81,0x7e,0xa8,0x60,0x54,0x38,0x50,0x36,0xfd,0x83,0x00,0x00,0x02,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x6e,0x00,0x27,0x00,0x33,0x00,0x00,0x01,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16, +0x16,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x11,0x7a,0x52,0x55,0x73,0x82,0x61,0x5f,0x83,0x75,0xd3,0x81,0x86,0xc5,0x70,0x70,0xc6,0x85,0x91,0xcf,0x6d,0x98,0x4d,0x8d,0x5b,0x89,0x9b,0x99,0xfe,0x2b,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x02,0xdf,0x4e,0x0a,0x81, +0x56,0x5b,0x87,0x84,0x5d,0x7b,0xce,0x76,0x76,0xee,0x91,0xfe,0x7a,0x90,0xef,0x76,0x6e,0xc8,0x82,0x56,0x86,0x4d,0xc8,0xb1,0x01,0x6a,0xb0,0xbf,0xfe,0xd2,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x00,0x02,0x00,0x44,0xff,0xf1,0x03,0xcc,0x05,0xe9,0x00,0x2f,0x00,0x3b,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16, +0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x12,0x15,0x23,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x07,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xd3,0x86,0x5c,0x5e,0x85,0x38,0x2a,0x35,0xfb,0xc6,0x8a,0xc6,0x6a, +0x73,0xc5,0x82,0xd9,0xf5,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x01,0x23,0x94,0x96,0x3a,0x25,0x0a,0x0b,0x5e,0x83,0x7f,0x3c,0x27,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x02,0x7c,0x60,0x84,0x85,0x5e,0x52,0x43,0x1d,0x49,0x37,0x9f,0xbb,0x6a,0xd7,0x8c,0x02,0x54,0x8a,0xdf,0x6e,0xfe,0xf0,0xdb,0x60,0xa0,0x5c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x61, +0x5b,0x23,0x2d,0x10,0x01,0x83,0x60,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x3c,0x00,0x01,0x00,0x30,0xfe,0x05,0x03,0xe0,0x03,0x6e,0x00,0x32,0x00,0x00,0x05,0x0e,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06, +0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x03,0xe0,0x07,0x40,0x6d,0x4b,0x50,0x68,0x3a,0x1d,0x35,0x45,0x44,0x34,0x1c,0xaf,0x7c,0x7c,0xab,0x2d,0x7b,0x4a,0x79,0xd0,0x76,0x7a,0xd1,0x77,0x1e,0x32,0x50,0x58,0x35,0x2c,0x28,0x13,0x1d,0x1d,0x15,0x15,0xf9,0x48,0x74,0x46,0x32,0x5d,0x3b,0x3d,0x62,0x6e,0x6b,0x69, +0x6c,0x69,0x34,0x7f,0xa7,0xae,0x82,0x58,0x4a,0x52,0x72,0x82,0x7a,0xd1,0x74,0x72,0xca,0x79,0x34,0x75,0x68,0x7e,0x88,0x88,0x37,0x2a,0x2c,0x09,0x19,0x23,0x48,0x00,0x00,0x02,0x00,0x47,0xff,0xf0,0x03,0xc8,0x03,0x6e,0x00,0x1d,0x00,0x24,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07, +0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x25,0x34,0x26,0x27,0x16,0x17,0x36,0x02,0x6c,0x53,0x72,0xaf,0x7c,0x64,0xa0,0x1a,0x7c,0x9d,0x6e,0x51,0x77,0x84,0x79,0xd1,0x75,0x79,0xd0,0x79,0x9d,0x76,0xfe,0xc5,0x57,0x42,0x0a,0x74,0x1b,0x6f,0x1d,0xb5,0x6e,0x80,0xb0,0x76,0x5e,0x09,0x9b,0x6f,0x4d,0x9d, +0x1d,0x45,0xf8,0x92,0x72,0xc6,0x76,0x75,0xd0,0x7a,0x92,0xfe,0x2f,0xfd,0x45,0x66,0x04,0x91,0x7a,0x2e,0x00,0x02,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x6e,0x00,0x30,0x00,0x3c,0x00,0x00,0x25,0x34,0x36,0x33,0x33,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x20,0x11,0x11,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x33,0x14,0x06,0x06,0x23,0x22, +0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xd3,0x83,0x5e,0x0b,0x0a,0x25,0x3a,0x97,0x93,0xfe,0xdd,0x98,0x8b,0x5b,0x93,0x48,0x98,0x6e,0xcf,0x91,0x83,0xc4,0x73,0x6a,0xc7,0x89,0xc6,0xfb,0x35,0x2a, +0x38,0x82,0x61,0x5c,0x86,0x7f,0x3b,0x28,0x29,0x3b,0x3c,0x28,0x28,0x3b,0xe3,0x5e,0x83,0x01,0x10,0x2d,0x23,0x5c,0x60,0xfe,0xaf,0xfe,0x6e,0xb1,0xbe,0x4c,0x83,0x5a,0x82,0xc7,0x6f,0x6e,0xe0,0x89,0x01,0xcc,0x8c,0xd8,0x69,0xbc,0x9e,0x37,0x49,0x1d,0x43,0x52,0x5c,0x87,0x84,0x5e,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x3c,0x00,0x00,0x02, +0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x0f,0x00,0x1a,0x00,0x00,0x01,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x07,0x10,0x21,0x22,0x06,0x15,0x11,0x10,0x21,0x20,0x11,0x04,0x08,0xf6,0xd8,0x8a,0xc6,0x6a,0x74,0xc7,0x83,0xdb,0xef,0x97,0xfe,0xc9,0x88,0x9b,0x01,0x23,0x01,0x37,0x01,0xc8, +0xd6,0xfe,0xff,0x6a,0xd7,0x8c,0x02,0x54,0x85,0xe3,0x6f,0xf2,0xdc,0x0d,0x01,0x4c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x01,0x6f,0x00,0x01,0x00,0xa3,0xff,0xe7,0x03,0xe5,0x05,0xe8,0x00,0x09,0x00,0x00,0x13,0x25,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x05,0xa3,0x01,0xd1,0x1c,0x01,0x2b,0x2a,0xfe,0x30,0x1c,0xfe,0xd4,0x05,0x16,0xd2,0xfa, +0xcb,0x86,0x80,0xd2,0x05,0x35,0x83,0x00,0x00,0x01,0x00,0x9b,0x00,0x00,0x03,0xed,0x05,0xe9,0x00,0x22,0x00,0x00,0x13,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x9b,0x97,0x73,0x87,0xca,0xf7,0x51,0x92,0xaa, +0x80,0x66,0x37,0x94,0x43,0x77,0x9d,0x91,0x7d,0x42,0xaa,0x80,0x4e,0x83,0x29,0x04,0x12,0x01,0xd1,0x45,0x4b,0xed,0xbd,0x57,0x9f,0x9d,0x85,0x65,0x66,0x5d,0x2e,0xd1,0xe0,0x42,0x7b,0x7d,0x7b,0x71,0x81,0x7a,0x3e,0x7b,0xa0,0x4e,0x3c,0xbe,0x00,0x01,0x00,0x5d,0x00,0x00,0x04,0x2b,0x05,0xe3,0x00,0x12,0x00,0x00,0x33,0x01,0x33,0x03, +0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x03,0x5d,0x01,0xeb,0xa7,0xd1,0x28,0x2c,0x7d,0xcb,0x71,0x97,0xac,0x7e,0x44,0x3f,0xe9,0x05,0xe3,0xfd,0x83,0x08,0x6a,0xbd,0x70,0xfe,0x29,0x01,0xa7,0x7f,0xb9,0x1e,0xfd,0x3f,0x00,0x01,0x00,0x31,0xff,0xe7,0x04,0x56,0x05,0xe3,0x00,0x09,0x00,0x00,0x33,0x01, +0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x01,0x31,0x02,0x1d,0xb3,0x01,0x2c,0x29,0xfe,0x30,0x1c,0xfe,0x68,0x05,0xe3,0xfa,0xcf,0x87,0x80,0xd2,0x04,0x7a,0xfb,0x9f,0x00,0x00,0x02,0x00,0x57,0xff,0xf1,0x04,0x30,0x05,0xe3,0x00,0x11,0x00,0x1d,0x00,0x00,0x01,0x33,0x15,0x23,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21, +0x11,0x33,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x03,0xb6,0x7a,0x7a,0x67,0xbb,0x7a,0xd0,0xf3,0xf1,0xc9,0x01,0x0e,0x97,0xfe,0x62,0x8d,0x9d,0xa6,0x8e,0x40,0x78,0x45,0x03,0x6e,0x8f,0xfe,0xa0,0x7c,0xb3,0x5f,0xee,0xd0,0xcb,0xf4,0x02,0x75,0xfc,0xfc,0xa4,0x94,0x8a,0x9d,0x3a,0x64,0x3f,0x01,0x82,0x00,0x02, +0x00,0x57,0x00,0x00,0x04,0x30,0x05,0xe9,0x00,0x11,0x00,0x1d,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x33,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x04,0x30,0x7a,0x97,0xfe,0xf2,0xca,0xf0,0xf3,0xd0,0x79,0xbc,0x67,0x7a,0xfe,0xef,0x46,0x77,0x40,0x8e, +0xa6,0x9d,0x8d,0x01,0x07,0x02,0x6c,0xfd,0x94,0x02,0x6c,0xf4,0xcb,0xcf,0xef,0x5f,0xb3,0x7c,0xfe,0xa1,0x01,0x81,0x3f,0x65,0x39,0x9c,0x8a,0x96,0xa2,0x00,0x00,0x01,0x00,0xd7,0x00,0x00,0x03,0xb1,0x05,0xe3,0x00,0x07,0x00,0x00,0x13,0x21,0x01,0x21,0x15,0x21,0x01,0x21,0xd7,0x02,0xa8,0xfe,0x4f,0x01,0xe3,0xfd,0x50,0x01,0xaa,0xfe, +0x2c,0x05,0xe3,0xfa,0xac,0x8f,0x05,0x54,0x00,0x02,0x00,0x83,0xff,0xf1,0x04,0x04,0x05,0xfe,0x00,0x28,0x00,0x34,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27, +0x37,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x5e,0x4c,0x5a,0x6e,0x60,0x5f,0x6f,0x78,0xd2,0x78,0x78,0xd0,0x77,0x6a,0x63,0x5e,0x6f,0x5d,0x4d,0x63,0x36,0x3f,0xad,0x7a,0x7e,0xad,0x40,0x39,0x66,0x13,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x05,0xfb,0x3c,0xb3,0x6d,0x6f,0xca,0x3e,0x3d,0xc7,0x75,0x76, +0xce,0x7a,0x79,0xd0,0x75,0x72,0xc7,0x40,0x3d,0xc8,0x72,0x6e,0xb4,0x3d,0x6a,0x2a,0x7e,0x4d,0x81,0xae,0xb4,0x7b,0x4b,0x80,0x2b,0x66,0xfb,0xb4,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x00,0x02,0x00,0x83,0xff,0xdc,0x04,0x04,0x05,0xe9,0x00,0x27,0x00,0x33,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16, +0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0xf4,0x39,0x40,0xae,0x7d,0x7a,0xad,0x3f,0x36,0x63,0x4d,0x5d,0x6f,0x5e,0x61,0x6c,0x78,0xd0,0x77,0x78,0xd2,0x78,0x6f, +0x5f,0x61,0x6d,0x5b,0x4d,0x11,0xae,0x7d,0x7a,0xad,0xa9,0x7e,0x7e,0xad,0x46,0x2a,0x80,0x4b,0x7c,0xb3,0xae,0x81,0x4d,0x7e,0x29,0x6b,0x3d,0xb4,0x6e,0x71,0xc9,0x3d,0x3e,0xca,0x71,0x76,0xd0,0x78,0x7a,0xce,0x76,0x75,0xc6,0x3e,0x3f,0xc9,0x6f,0x6d,0xb3,0x3e,0x04,0x4e,0x7c,0xb3,0xae,0x81,0x81,0xae,0xb1,0x00,0x00,0x02,0x01,0x48, +0xff,0xec,0x04,0xbc,0x05,0xa3,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0xbc,0xd6,0xe5,0xe0,0xd9,0xda,0xdf,0xe0,0xdb,0xa0,0x8c,0x8f,0x8a,0x8d,0x88,0x8f,0x92,0x89,0x02,0xc8,0xfe,0x7a,0xfe,0xaa,0x01,0x58,0x01, +0x84,0x01,0x78,0x01,0x63,0xfe,0xa0,0xfe,0x85,0x01,0x3c,0x01,0x13,0xfe,0xe1,0xfe,0xd0,0xfe,0xc9,0xfe,0xe7,0x01,0x11,0x00,0x00,0x01,0x01,0x21,0xff,0xec,0x04,0xe2,0x05,0xa3,0x00,0x2c,0x00,0x00,0x01,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x00,0x11,0x14,0x02,0x04, +0x23,0x22,0x27,0x27,0x16,0x33,0x32,0x36,0x12,0x35,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0xcd,0x29,0x30,0x4c,0x34,0x3e,0x4c,0x94,0x6f,0x9e,0xbc,0x77,0xd6,0x84,0xeb,0x01,0x05,0xaf,0xfe,0xcf,0xc4,0x48,0x50,0x1b,0x5f,0x68,0x93,0xdc,0x81,0xfe,0xa4,0x88,0x9d,0x68,0x54,0x3a,0x02,0xf2,0x0b,0x42,0x27,0x32,0x4e,0x5a, +0x3f,0x68,0x95,0xd9,0xb3,0x7b,0xd3,0x79,0xfe,0xa1,0xfe,0xb6,0xe2,0xfe,0x95,0xc1,0x0a,0xa5,0x19,0x92,0x01,0x1e,0xb6,0x02,0x2f,0xbd,0x90,0x66,0x88,0x00,0x00,0x02,0x00,0x74,0xff,0xec,0x05,0x8f,0x06,0x3b,0x00,0x4c,0x00,0x55,0x00,0x00,0x13,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36, +0x35,0x11,0x34,0x23,0x22,0x06,0x07,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27, +0xa4,0x66,0x65,0x57,0x24,0x47,0x3e,0x6c,0x68,0x30,0x5f,0x5a,0x53,0x24,0x20,0x2c,0x62,0x22,0x5a,0x2f,0x23,0x2c,0x5c,0x52,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x92,0x6a,0x2d,0x83,0x41,0x69,0x76,0x85,0x59,0x34,0x56,0x54,0x59,0x37,0x36,0x5e,0x5b,0x5f,0x37,0x78,0x77,0x26,0x35,0x02,0x1d,0x22,0x1c,0x37,0x4d, +0x28,0x06,0x3b,0x13,0x72,0x6e,0xfb,0xa2,0x72,0x11,0x17,0x28,0x19,0x1e,0x19,0x38,0x20,0x03,0xbd,0x8a,0x46,0x38,0x2a,0x33,0x74,0x55,0x56,0xbd,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x01,0xfd,0xa8,0x9b,0x82,0x3a,0x48,0x9b,0x8b,0xfc,0x21,0x45,0x6d,0x19,0x1e,0x19,0x19,0x1e,0x19,0x67,0x6d,0x04,0x44,0x5b,0x43,0x0f,0xfc,0xd9, +0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x02,0x00,0x43,0xff,0xec,0x05,0xc1,0x05,0xa3,0x00,0x28,0x00,0x31,0x00,0x00,0x21,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x25,0x14, +0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x21,0x82,0x62,0x69,0x82,0xa0,0x82,0x69,0x63,0x81,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0xd4,0xb0,0x64,0xa2,0x35,0x6c,0xcf,0xaf,0xd5,0xfb,0x22,0x22,0x1c,0x37,0x4d,0x28,0x04,0x1e,0x70,0x89,0x8a,0x6f,0xfb,0xe2,0x04,0x1e,0x6f,0x8a,0x8a,0x6f,0xfd,0xc0,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59, +0x4e,0x03,0x89,0xb5,0xd2,0x44,0x42,0x86,0xd1,0xb6,0xfb,0xe4,0xba,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x01,0x00,0xf0,0xff,0xec,0x05,0x14,0x06,0x27,0x00,0x3d,0x00,0x00,0x01,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x00,0x25,0x36,0x36,0x35,0x35, +0x33,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x03,0xef,0x51,0x37,0x08,0x57,0x44,0xb6,0xe7,0xf1,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x01,0x00,0x01,0x1e,0xa9,0x97,0xa0,0x5a,0xac,0xa3,0xa4,0xb7,0x5a,0x6a, +0x64,0x2e,0x77,0x7d,0x2d,0x93,0xa6,0xb8,0x9f,0x96,0xb3,0x58,0x44,0x39,0x50,0x02,0x26,0x39,0x4f,0x3b,0x44,0xdc,0x90,0xdd,0x56,0xa0,0x21,0x11,0x12,0xc2,0x9f,0x01,0x0f,0x01,0x05,0x01,0x2e,0x4e,0x2d,0x61,0x41,0x7b,0x73,0x56,0x81,0x58,0x2b,0x2c,0x82,0xc7,0x8b,0xd6,0x83,0x89,0x0f,0x0f,0x01,0x3d,0xd9,0x93,0xb1,0xc8,0xcb,0xa7, +0x4c,0x5e,0x4f,0x00,0x00,0x02,0x00,0xd6,0xff,0xec,0x05,0x2e,0x06,0x3b,0x00,0x4e,0x00,0x5a,0x00,0x00,0x01,0x06,0x06,0x15,0x15,0x14,0x06,0x06,0x23,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x06,0x15,0x14, +0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x3e,0x02,0x35,0x35,0x34,0x36,0x37,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x2e,0x37,0x23,0x7d,0xf5,0x8f,0xae,0xaf,0x6a,0x64,0x2e,0x77,0x7d,0x2d,0xfe,0xc7,0xc5, +0x92,0x96,0xb3,0x58,0x44,0x39,0x50,0x51,0x37,0x08,0x57,0x44,0x53,0x63,0xf9,0xdf,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x43,0x8b,0x72,0x61,0x7a,0x62,0x5f,0x84,0x1b,0x41,0x62,0x38,0x67,0x64,0xfd,0x3f,0x30,0x23,0x24,0x31,0x31,0x24,0x23,0x30,0x05,0xb1,0x10,0x45,0x58,0x53,0x56,0x80,0x47,0x1d,0xbe,0xaf,0x86,0x83,0x89, +0x0f,0x0f,0x01,0x7c,0xf5,0x8b,0xb8,0xcb,0xa7,0x4c,0x5e,0x4f,0x3a,0x39,0x4f,0x3b,0x44,0x60,0x53,0x7a,0xc7,0x3d,0xa0,0x21,0x11,0x12,0xc2,0x9f,0xbf,0x7f,0xa2,0x7d,0x2a,0x43,0x70,0x5f,0x83,0x86,0x5b,0x34,0x33,0x01,0x2e,0x4b,0x25,0x88,0x6f,0x71,0x13,0xfe,0x57,0x23,0x30,0x30,0x23,0x24,0x31,0x31,0x00,0x01,0x01,0x0f,0xff,0xec, +0x04,0xf5,0x06,0x3b,0x00,0x3a,0x00,0x00,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x33,0x32,0x00,0x11,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26, +0x35,0x34,0x36,0x02,0xe0,0x16,0x3a,0x54,0x68,0x9c,0x89,0xb3,0xa9,0xac,0xa5,0x6d,0xba,0x2e,0x65,0x11,0x0c,0x04,0x2f,0x2d,0x2f,0x60,0x6c,0x02,0x70,0x74,0xfc,0x01,0x09,0xff,0xf1,0x84,0xd6,0x77,0xbc,0x9e,0x49,0x77,0x43,0x4c,0x3e,0x35,0x4b,0x30,0x02,0x9d,0x16,0x88,0x66,0x90,0xbd,0x01,0x08,0x01,0x13,0x9e,0xef,0xed,0x63,0x4e, +0x72,0x26,0x1b,0x15,0x19,0x2a,0x3e,0x0c,0x8a,0x13,0x72,0x4b,0x38,0xfe,0xc8,0xfe,0xd0,0xba,0xfe,0xbd,0xfe,0xae,0x79,0xd3,0x7b,0xb3,0xd9,0x44,0x76,0x43,0x3f,0x5a,0x4f,0x31,0x27,0x42,0x00,0x02,0x00,0x8f,0xff,0xec,0x05,0x74,0x06,0x3b,0x00,0x37,0x00,0x40,0x00,0x00,0x01,0x16,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11, +0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x04,0xa9,0x66,0x65,0x85,0x72,0x72,0x7f,0x28,0x30,0x23,0x63, +0x52,0x2b,0x5a,0x54,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x91,0x6a,0x6c,0x84,0x6a,0x76,0x54,0x27,0x2d,0x29,0x31,0xfc,0xb5,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x15,0x6e,0x65,0xfb,0x6d,0x64,0x70,0x69,0x5d,0x03,0xdb,0x46,0x44,0x49,0x5f,0x33,0x74,0x55,0x56,0xfd,0x73,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e, +0x03,0xcd,0xa8,0x9b,0x82,0x82,0x9d,0x89,0xfc,0x67,0x6c,0x39,0x39,0x04,0x2c,0x57,0x3c,0x08,0xfb,0x09,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x01,0x01,0x0b,0xff,0xec,0x04,0xf9,0x06,0x27,0x00,0x45,0x00,0x00,0x01,0x14,0x0e,0x02,0x07,0x0e,0x04,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x17,0x16,0x16,0x17,0x32,0x36,0x35,0x34, +0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x35,0x33,0x04,0xf9,0x2e,0x54,0x92,0x9a,0x7e,0x72,0x56,0x3a,0x20,0x3b,0x36,0x22,0x5a,0x2f,0x23,0x2c,0x2f,0x54,0x2b,0x41,0x39,0x52, +0x3c,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x8a,0x9e,0x8e,0x6a,0x92,0x6a,0x2d,0x84,0x40,0x6c,0x82,0x38,0x73,0xc5,0xc1,0x72,0x71,0x3a,0xa0,0x05,0xb4,0x4a,0x72,0x55,0x44,0x26,0x20,0x36,0x4e,0x73,0xa1,0x6f,0xfe,0xf0,0x44,0x46,0x46,0x38,0x2a,0x32,0x3b,0x39,0x01,0x9f,0x98,0x75,0x90,0x07,0x0a,0x39,0x23,0x2b,0x45, +0x4c,0x3a,0x60,0x80,0xe4,0xbc,0xb9,0xf9,0x82,0x3b,0x47,0xa1,0x85,0x01,0x2c,0x8b,0xcd,0x8f,0x6c,0x39,0x23,0x3d,0x52,0x30,0x7b,0x00,0x00,0x01,0x01,0x20,0xff,0xec,0x04,0xe3,0x06,0x3b,0x00,0x43,0x00,0x00,0x01,0x06,0x06,0x15,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x21,0x07,0x23,0x22,0x06,0x15,0x14,0x16, +0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x10,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x34,0x36,0x37,0x04,0xe3,0x37,0x23,0xa2,0x22,0x8e,0x61,0x6a,0x85,0x35,0x63,0x46,0x01,0x3c,0x10,0xed,0x8f,0xb5,0xb8, +0x8c,0x91,0xa8,0x41,0x30,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x7e,0x8d,0x78,0xda,0x87,0xdf,0xfe,0xfb,0xdc,0x57,0x5e,0xe0,0xb6,0xa3,0x69,0x67,0x64,0x05,0xb1,0x10,0x45,0x58,0xa4,0x56,0x61,0x70,0x5b,0x35,0x58,0x32,0x8c,0xb2,0x91,0x8f,0xb7,0x7d,0x6d,0x49,0x5e,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80, +0xa7,0x99,0x6c,0xa2,0x58,0xf1,0xcd,0x01,0x2d,0x69,0x26,0x8b,0x5b,0x9b,0xbc,0x5b,0x6f,0x71,0x13,0x00,0x00,0x02,0x00,0x9d,0x00,0x45,0x03,0xaf,0x05,0xa3,0x00,0x0e,0x00,0x1d,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x12,0x37,0x14,0x02,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33, +0x32,0x12,0x03,0x08,0x60,0x4c,0x4e,0x7c,0x4e,0x33,0x55,0x2f,0x4f,0x77,0x47,0xa7,0x75,0xc9,0x87,0x67,0x95,0x51,0x7a,0xd7,0x7c,0x98,0xad,0x03,0x81,0xb6,0xe2,0xb0,0xfe,0xa8,0xb8,0x72,0xb7,0x62,0xa8,0x01,0x5f,0xa0,0xf3,0xfe,0x7f,0xbc,0x8f,0x01,0x1e,0xba,0xd5,0x01,0x5e,0xc4,0xfe,0xd5,0x00,0x01,0x00,0xb6,0xfe,0xf1,0x03,0x95, +0x05,0xa3,0x00,0x2e,0x00,0x00,0x01,0x14,0x02,0x02,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x16,0x33,0x32,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x12,0x36,0x33,0x32,0x12,0x03,0x95,0x5d,0x88,0xa7,0x50,0x3b,0x7b,0x4d,0x4d,0x11, +0x1f,0x06,0x0b,0x51,0x2d,0x46,0x93,0x53,0x3c,0x36,0x42,0x75,0x4d,0x27,0x10,0x09,0x5f,0x1d,0x11,0x38,0x22,0x74,0xcc,0x7a,0x7f,0x8b,0x03,0x60,0xec,0xfe,0x42,0xfe,0xdd,0xa2,0x4f,0x7b,0x3a,0x12,0x3a,0x20,0x3b,0x61,0x01,0x52,0x01,0xf7,0xcb,0xb6,0xca,0xc0,0xfe,0xa8,0x90,0x72,0x8f,0x29,0x17,0x15,0x1a,0x44,0x68,0x96,0x5a,0x01, +0x0e,0x01,0x9e,0xe2,0xfe,0xd5,0x00,0x01,0x00,0x36,0x00,0x8a,0x04,0x16,0x05,0xa3,0x00,0x3f,0x00,0x00,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x12,0x36,0x33, +0x32,0x16,0x15,0x14,0x03,0x03,0x36,0x33,0x32,0x16,0x33,0x32,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x04,0x16,0x0f,0x6e,0x65,0x44,0x1f,0x3a,0x1f,0x2b,0x35,0x0a,0x09,0x15,0x3e,0x0b,0x01,0x1a,0x29,0x31,0x68,0x41,0xb8,0x9e,0x55,0x30,0x09,0x5f,0x1c,0x13,0x31,0x21,0x6f,0xcc,0xf4,0x72,0x78,0x89,0xa9,0xc5,0x0d,0x14,0x18,0x2c,0x1b, +0x17,0x62,0x21,0x0b,0x0d,0x0b,0x23,0x4c,0x02,0x21,0x11,0x2d,0xd7,0x60,0x12,0x22,0x07,0x40,0x10,0x16,0x16,0x02,0x32,0x52,0xaa,0x28,0xb2,0x9b,0xf7,0xfe,0xeb,0x89,0x5b,0x7d,0x18,0x11,0x17,0x47,0x5b,0x8b,0x3f,0xbf,0x01,0x6d,0x01,0x23,0xa5,0xa4,0x86,0x71,0xfe,0xbb,0xfe,0x84,0x04,0x09,0x8d,0x51,0x1c,0x17,0x23,0x00,0x00,0x01, +0x00,0x5a,0x01,0x73,0x03,0xf1,0x05,0xa3,0x00,0x54,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x07,0x22,0x35,0x35,0x34,0x37,0x37,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x06, +0x23,0x22,0x26,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x16,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x16,0x03,0xe4,0x62,0x7f,0x2a,0x11,0x2d,0x28,0x23,0x23,0x10,0x36,0x43,0x20,0x9b,0x2a,0x3b,0x19,0x15,0x16,0x2b,0x31,0x38,0x24,0x23,0x30,0x27,0x1b,0x11,0x2f,0x2b,0x25,0x48,0x29, +0x23,0x38,0x58,0x35,0x0d,0x11,0x0d,0x6b,0x1e,0x12,0x36,0x5f,0xa8,0x72,0x29,0x68,0x16,0x5e,0x61,0x36,0x53,0x2f,0x54,0x50,0x8d,0x18,0x1c,0x20,0x4f,0x1c,0x0d,0x15,0x11,0x32,0x02,0x62,0x22,0x71,0x51,0x07,0x0f,0x03,0x24,0x0d,0x0e,0x71,0x39,0x01,0x23,0x4d,0xc1,0x35,0x26,0x31,0x32,0x61,0x90,0x5d,0x5c,0x66,0x2e,0x1d,0x11,0x14, +0x6d,0x5e,0xb5,0x62,0x26,0x26,0x82,0xfe,0xf1,0x90,0x4b,0x5c,0x3c,0x29,0x16,0x14,0x41,0xc6,0x49,0xe7,0x01,0x75,0xb7,0x32,0x23,0x55,0x32,0x57,0x33,0x4a,0xf1,0x94,0xfe,0x0b,0x3e,0x32,0x18,0x24,0x00,0x01,0x00,0xc5,0xff,0xc3,0x03,0x86,0x05,0xa7,0x00,0x26,0x00,0x00,0x01,0x32,0x16,0x16,0x15,0x10,0x02,0x06,0x23,0x22,0x26,0x35, +0x34,0x12,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x02,0xea,0x20,0x4c,0x30,0x69,0xba,0x83,0x8c,0x8f,0x8d,0x81,0x1a,0x15,0x0e,0x57,0x2c,0x75,0x5d,0x43,0x3b,0x4a,0x6e,0x40,0x28,0x2e,0x08,0x54,0x05,0xa7,0x9c,0xed,0x6b,0xfe,0xef,0xfe,0x1c, +0xfb,0xee,0xe8,0xd0,0x01,0x65,0x8e,0x1c,0x36,0x0c,0x14,0x3a,0xa0,0xfe,0xed,0x98,0x94,0xbb,0xde,0x01,0xa1,0xca,0x94,0xb9,0x49,0x0c,0x13,0x11,0x4a,0x00,0x00,0x01,0x00,0xab,0x01,0x46,0x03,0xa0,0x05,0xa7,0x00,0x33,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x27,0x27,0x06,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x35, +0x34,0x36,0x33,0x32,0x16,0x15,0x07,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x27,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x17,0x13,0x17,0x16,0x03,0xa0,0x3b,0x29,0x19,0x2e,0x19,0x1a,0x18,0x0a,0x05,0x06,0x29,0x35,0x5a,0x49,0x57,0x65,0x2d,0x1e,0x37,0x27,0x1d,0x04,0x2a,0x2b,0x30,0x38,0x0d,0x06,0x0b,0x1d, +0x14,0x16,0x04,0x3e,0x17,0x1b,0x17,0x14,0x0b,0x04,0x64,0x3c,0x24,0x01,0xdd,0x17,0x23,0x7b,0x8b,0x8a,0x77,0x80,0x2b,0x7f,0xfe,0x64,0xa3,0x51,0x71,0xe0,0xf8,0x21,0x1b,0x15,0x14,0xed,0x72,0x68,0xa7,0xd6,0x5a,0xa9,0x3a,0x3c,0x40,0x10,0x45,0x11,0x11,0x1f,0x18,0x47,0x45,0x18,0xfe,0x6e,0xd2,0x7f,0x00,0x01,0x00,0x79,0xff,0xc3, +0x03,0xd2,0x05,0xa3,0x00,0x40,0x00,0x00,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x10,0x02,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x02,0x15,0x10,0x12,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x27,0x26,0x35,0x34, +0x36,0x33,0x32,0x15,0x14,0x07,0x06,0x15,0x14,0x02,0x72,0x14,0x2a,0x16,0x78,0x94,0xc8,0xbe,0x88,0xd5,0x76,0x60,0xad,0xd8,0x60,0x37,0x26,0x10,0x2a,0x2f,0xb7,0xdc,0xa1,0x8a,0x70,0x72,0x7c,0x17,0x2e,0x20,0x01,0x01,0x17,0x22,0x1f,0x17,0x0e,0x0d,0x08,0x08,0x1d,0x30,0x4f,0x0b,0x0b,0x03,0x2a,0x06,0x0d,0xb3,0x93,0xfe,0xee,0xfe, +0xde,0xb1,0x01,0x49,0xd2,0x9a,0x01,0x1e,0xdb,0x81,0x13,0x1a,0x31,0x1d,0x12,0x07,0x1a,0xfe,0xa4,0xff,0xfe,0xee,0xfe,0xc6,0xb9,0xc6,0xf6,0x31,0x49,0x19,0x1c,0x1d,0x15,0x22,0x33,0x5d,0x5c,0x35,0x26,0x44,0x44,0x24,0x29,0x28,0x3e,0x1e,0x46,0x47,0x2e,0x23,0x00,0x01,0x00,0x74,0xff,0xf6,0x03,0xd8,0x05,0xa3,0x00,0x3e,0x00,0x00, +0x01,0x10,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x10,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x03, +0xd8,0x91,0x9e,0x6b,0x60,0x0d,0x0c,0x34,0x3c,0x3c,0x30,0x34,0x35,0x08,0x1a,0x59,0x19,0x2b,0x53,0x42,0x9b,0x89,0x78,0x90,0x0c,0x0c,0x41,0x34,0x34,0x5b,0xa1,0x60,0x23,0x46,0x47,0x20,0x09,0x20,0x14,0xab,0x62,0x95,0xeb,0x83,0x02,0xa5,0xfe,0x97,0xfe,0xba,0xb8,0xb6,0x33,0x95,0x94,0x30,0x7c,0x71,0xb2,0xb6,0x85,0xdd,0x6d,0x0f, +0x1b,0x0f,0x15,0x4f,0xab,0x01,0x50,0x71,0xea,0x01,0x09,0xbd,0x9b,0x31,0x94,0x89,0x39,0xfe,0xf8,0x01,0x20,0x01,0x07,0xa6,0x01,0x23,0xa8,0x16,0x17,0x21,0x2f,0x1e,0x18,0x31,0xc4,0xfe,0x9f,0x00,0x00,0x01,0x00,0xa8,0x00,0x45,0x03,0xa4,0x05,0xa7,0x00,0x31,0x00,0x00,0x01,0x14,0x07,0x06,0x06,0x07,0x0e,0x02,0x23,0x22,0x27,0x26, +0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x37,0x37,0x32,0x17,0x17,0x32,0x37,0x3e,0x04,0x17,0x32,0x16,0x03,0xa4,0x2e,0x24,0x56,0x16,0x1b,0x17,0x20,0x0f,0x26,0x47,0x47,0x23,0x24,0x3f,0x3f,0x20,0x1d,0x27,0x67,0x01,0x43,0x09,0x44,0x23,0x31,0x12,0x14,0x26, +0x57,0xfe,0xef,0x39,0x34,0x0e,0x65,0x20,0x11,0x21,0x0e,0x1f,0x0e,0x54,0x20,0x17,0x1f,0x4e,0x02,0xc6,0x14,0x4c,0x4b,0xd1,0x55,0x69,0x2a,0x1d,0x0f,0x0e,0x0e,0x0f,0x25,0x26,0x30,0x01,0x24,0x03,0xa9,0x1a,0x1a,0x13,0x0e,0x34,0x2f,0x5b,0xe2,0xfd,0x1f,0x07,0x04,0x10,0x03,0x68,0x2d,0x60,0x25,0xd5,0x34,0x03,0x27,0x00,0x00,0x01, +0x00,0xce,0xff,0xc3,0x03,0x7d,0x05,0xa7,0x00,0x37,0x00,0x00,0x01,0x14,0x06,0x23,0x27,0x26,0x23,0x22,0x35,0x34,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14, +0x16,0x17,0x16,0x03,0x51,0x25,0x0d,0x22,0x5d,0x3d,0x3b,0x21,0x33,0x40,0x16,0x3c,0x30,0x72,0x79,0x73,0x66,0x4c,0x31,0x35,0x09,0x10,0x16,0x42,0x5d,0x89,0x4e,0x72,0xa8,0x5b,0xe6,0xd5,0x6e,0x86,0x2e,0x55,0x0e,0x13,0x24,0x33,0x21,0x01,0x94,0x13,0x4e,0x04,0x12,0x3b,0x18,0x54,0x81,0xdb,0x97,0x48,0x72,0x80,0xfe,0x9f,0xfe,0xc4, +0xfe,0xf4,0xfe,0xda,0x3c,0x40,0x0b,0x3a,0x19,0x21,0x61,0x3d,0xa4,0x01,0x3b,0xde,0x01,0x85,0x01,0xa2,0xd1,0xab,0x4c,0xc0,0xe1,0x23,0x29,0x0e,0x10,0x0f,0x0b,0x08,0x00,0x02,0x00,0xc3,0xff,0xe7,0x05,0x05,0x04,0x19,0x00,0x0b,0x00,0x17,0x00,0x00,0x05,0x22,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15, +0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xe4,0xf5,0xfe,0xd4,0x01,0x2c,0x01,0x01,0xf8,0x01,0x1d,0xfe,0xdf,0xfa,0xb3,0xcc,0xd0,0xaf,0xb5,0xbe,0xbe,0x19,0x01,0x21,0xec,0x01,0x02,0x01,0x23,0xfe,0xe7,0xfc,0xfb,0xfe,0xde,0x03,0xa6,0xd9,0xba,0xb5,0xd2,0xcb,0xc0,0xc1,0xce,0x00,0x01,0x01,0x6a,0xff,0xe7,0x04,0x5e,0x04,0x19, +0x00,0x15,0x00,0x00,0x01,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x01,0x70,0x72,0x9e,0xdf,0xff,0xfe,0xf8,0xf2,0x8e,0x6c,0x69,0x8f,0xa9,0xad,0xa1,0x9d,0x96,0x74,0x03,0xd3,0x46,0xfe,0xe5,0xf6,0xfe,0xfc,0xfe,0xe3,0x38,0xa2,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x00, +0x00,0x02,0x01,0x08,0xfd,0x6d,0x04,0xc0,0x04,0x19,0x00,0x1c,0x00,0x27,0x00,0x00,0x01,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x00,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x8b,0x7b,0xb8,0x50,0xa8,0xdf,0x77, +0xb4,0x63,0x1d,0x0c,0x73,0x60,0x64,0x71,0x80,0x86,0xb6,0xb8,0xfe,0xd1,0x68,0x2f,0x33,0x60,0x2b,0x33,0x31,0xfd,0x6d,0x23,0x28,0xaa,0x6c,0x79,0xe6,0x9d,0x02,0x25,0xb3,0x65,0x59,0x65,0x70,0x61,0x6d,0x6a,0xe8,0xdd,0xfd,0x9e,0xfe,0xce,0xfe,0xad,0x06,0x3d,0x35,0x31,0x5f,0x34,0x2d,0x30,0x34,0x00,0x00,0x01,0x01,0x20,0xfd,0x6d, +0x04,0xa7,0x04,0x19,0x00,0x25,0x00,0x00,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x10,0x00,0x21,0x23,0x27,0x17,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x04,0x27,0x01,0x20,0x78,0xa2,0xc0,0xc6,0xb9,0xb2,0xad,0x82,0x7d,0xb2,0xf7,0x01,0x1a,0xfe,0xdd,0xfe,0xf1,0x1a,0x19, +0x53,0xb6,0xe0,0x44,0x43,0x36,0x36,0x59,0x49,0x94,0x8f,0x87,0x78,0x66,0x27,0xc1,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x9c,0x46,0xfe,0xe4,0xf5,0xfe,0xfc,0xfe,0xe3,0x02,0x5d,0xd2,0xb8,0x1b,0x90,0x20,0x52,0x80,0x9c,0x94,0x7b,0x1e,0x00,0x01,0x01,0x21,0xfd,0x6d,0x04,0xa6,0x04,0x19,0x00,0x21,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16, +0x33,0x32,0x24,0x37,0x15,0x03,0x06,0x02,0x07,0x23,0x36,0x12,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x03,0x36,0xb0,0xbf,0x9e,0x9b,0x57,0x01,0x09,0x46,0xcd,0xa7,0xaf,0x26,0xbb,0x3e,0xea,0x01,0x24,0x6d,0x8b,0xd4,0xfe,0xff,0x84,0xf5,0x98,0x73,0xbf,0x3c,0x41,0xcd,0x03,0x8f,0xa9,0x9c, +0x93,0x98,0x3e,0x24,0x9c,0xfe,0xf7,0xd5,0xfe,0xe1,0x7b,0xa9,0x01,0x5d,0x01,0x50,0x30,0xed,0xce,0x87,0xd2,0x72,0x26,0x20,0x9c,0x29,0x2f,0x00,0x00,0x01,0x00,0x3c,0xfd,0x6d,0x05,0x8c,0x04,0x19,0x00,0x32,0x00,0x00,0x01,0x10,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x11,0x34,0x26,0x26,0x23,0x22, +0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x05,0x8c,0xfa,0x6c,0x79,0x14,0x83,0x0e,0x2e,0x26,0x5e,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b, +0x77,0x88,0xa5,0x4e,0xfe,0x81,0xfe,0xec,0x75,0x64,0x50,0x24,0x2f,0x2d,0x30,0x32,0x8b,0x03,0x79,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca,0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0x00,0x01,0x01,0x05,0xff,0xe7,0x04,0xc3,0x07,0x62,0x00,0x31,0x00,0x00,0x01,0x10,0x12,0x33, +0x32,0x36,0x35,0x34,0x27,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x00,0x11,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x01,0xa9,0xb1,0xc5,0x7a,0x84,0x7c,0x77,0x4b,0x32,0x1b,0x96,0x8b,0x73,0x54,0x29,0x60,0x3e,0x41,0x46, +0x57,0x75,0x66,0x65,0xd8,0xcc,0xfe,0xed,0xfe,0xf9,0x01,0x3b,0x01,0x2f,0xb6,0x98,0xa5,0xa7,0xe7,0xe1,0x02,0xe9,0xfe,0xb3,0xfe,0xd7,0x57,0x51,0x5b,0x4a,0x46,0x3b,0x45,0x4f,0x33,0x7f,0x92,0x2b,0x90,0x13,0x20,0x4c,0x39,0x33,0x55,0x43,0x3b,0x89,0x56,0xa0,0xa0,0x01,0x72,0x01,0x90,0x01,0x40,0x01,0x97,0x01,0xa2,0x4e,0xaa,0x6d, +0xfe,0x9d,0xfe,0x86,0x00,0x01,0x00,0x50,0xfd,0x6d,0x06,0xdc,0x04,0x19,0x00,0x32,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15, +0x14,0x06,0x23,0x22,0x11,0x04,0xfc,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0x5e,0x27,0x2d,0x0e,0x83,0x15,0x79,0x6d,0xfa,0x02,0x00,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca, +0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0xfc,0x85,0x89,0x32,0x30,0x2d,0x2f,0x26,0x3e,0x70,0x79,0x01,0x14,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xfe,0x04,0x00,0x00,0x0e,0x00,0x00,0x01,0x06,0x02,0x07,0x23,0x36,0x12,0x37,0x33,0x16,0x12,0x17,0x23,0x26,0x02,0x02,0xe4,0x2b,0xc5,0x6e,0xbd,0x9a,0xf7,0x36,0xa8,0x3b,0xf2,0x99, +0xbc,0x71,0xc3,0x03,0x31,0xbc,0xfe,0x3c,0xb1,0xe1,0x02,0x2e,0xf1,0xfe,0xfd,0xe1,0xe3,0xb6,0x01,0xc4,0x00,0x01,0x01,0x01,0xfd,0x6d,0x04,0xc6,0x04,0x19,0x00,0x24,0x00,0x00,0x01,0x10,0x21,0x32,0x16,0x15,0x10,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33, +0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x01,0x01,0x02,0x11,0xd1,0xe3,0xfe,0xcd,0xfa,0x08,0xa0,0x08,0x2b,0x35,0x48,0x3d,0x8b,0x81,0xb3,0xb6,0xf8,0xe9,0x8f,0x86,0x7e,0x9f,0xfe,0xc4,0xfe,0xbb,0x01,0x29,0x02,0xf0,0xea,0xdb,0xfe,0x62,0xdd,0x30,0x12,0x18,0x27,0x2f,0x30,0x8e,0x8b,0x9b,0xa2,0xfe,0xd6,0xfe,0xbc,0xfe,0x74,0xfe,0x65, +0x52,0xa0,0x3d,0x01,0xe3,0x00,0x00,0x01,0x00,0xd6,0xff,0xe7,0x04,0xf1,0x05,0xfa,0x00,0x22,0x00,0x00,0x01,0x32,0x16,0x17,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x06,0x07,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x11,0x34,0x12,0x02,0x9f,0x68,0xa6,0x29,0x75,0x3f,0xb0,0x35, +0x2f,0x54,0x75,0x8d,0x6e,0x5d,0x8d,0x98,0xad,0xa9,0x82,0x76,0x6c,0x8e,0xf2,0xfe,0xf8,0xf2,0x04,0x19,0x5f,0x56,0xa4,0xfc,0x8b,0x6b,0x6a,0x8e,0x65,0xa9,0x9a,0x97,0x5b,0x6f,0xce,0xb5,0xc7,0xd0,0x4e,0xa2,0x38,0x01,0x1a,0x01,0x07,0xfc,0x01,0x15,0x00,0x03,0x00,0x8b,0xff,0xe8,0x05,0x79,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x33, +0x00,0x00,0x01,0x02,0x21,0x22,0x26,0x27,0x0e,0x02,0x23,0x20,0x03,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x12,0x33,0x32,0x36,0x36,0x35,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x34,0x26,0x26,0x23,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x00,0x05,0x79,0x01,0xfe,0x9f,0x59,0x9d,0x1f,0x0f,0x53,0x76, +0x3c,0xfe,0x9e,0x01,0xa1,0x1f,0x5a,0x49,0x63,0x62,0xa1,0x02,0xc0,0x47,0x5a,0x21,0x99,0xfe,0x94,0xfe,0xfd,0xfe,0xfd,0xfe,0x94,0x01,0x6d,0x01,0x02,0x01,0x01,0x01,0x6e,0xa1,0x7e,0xd5,0x7b,0xbc,0xfe,0xef,0x01,0x0c,0xc1,0xc5,0x01,0x09,0x06,0xd0,0xfe,0x51,0x57,0x4e,0x2c,0x4e,0x2b,0x01,0xaf,0x62,0x7a,0x42,0x86,0x98,0xfe,0xe2, +0x3e,0x75,0x6b,0xfb,0x87,0xfe,0xfd,0xfe,0x94,0x01,0x6e,0x01,0x01,0x01,0x01,0x01,0x6e,0xfe,0x94,0xfe,0xfd,0x80,0xdb,0x83,0xfe,0xe3,0xc1,0xbe,0xfe,0xe0,0x01,0x23,0x00,0x01,0x02,0xb1,0x00,0x00,0x03,0x52,0x06,0xd0,0x00,0x03,0x00,0x00,0x21,0x23,0x11,0x33,0x03,0x52,0xa1,0xa1,0x06,0xd0,0x00,0x04,0x00,0x1f,0xff,0xe8,0x05,0xe4, +0x06,0xe8,0x00,0x20,0x00,0x2c,0x00,0x38,0x00,0x45,0x00,0x00,0x25,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x11,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x07,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35, +0x34,0x36,0x33,0x32,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x05,0xe4,0x73,0x9d,0x78,0x9b,0x86,0x4c,0x9d,0x5e,0xa2,0x72,0x50,0x49,0xcb,0x90,0x90,0xca,0x01,0x8f,0x7b,0x79,0x91,0x6f,0x9e,0x85,0x4d,0x6b,0x4b,0xfd,0x93,0x3d,0x2d,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0xfd,0xd0,0x3e,0x2d,0x2b,0x40,0x40, +0x2b,0x2d,0x3e,0x01,0x77,0x76,0x54,0x50,0x7a,0x3a,0x3d,0x53,0x54,0x76,0x69,0x81,0x6d,0x5a,0xaf,0x04,0x3a,0x1d,0x5d,0x62,0x77,0x90,0xcb,0xcc,0x8f,0x78,0xbb,0x20,0xfc,0xa4,0x61,0x6b,0x5b,0x5b,0x01,0xe4,0x2d,0x3d,0x3e,0x2c,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0x3d,0x2d,0x2e,0x3d,0x3e,0x02,0xa8,0x56,0x74,0x71,0x59,0x53,0x3d,0x3a, +0x72,0x00,0x00,0x02,0x00,0xb7,0x00,0x00,0x05,0x4d,0x06,0xe8,0x00,0x29,0x00,0x35,0x00,0x00,0x01,0x10,0x21,0x23,0x11,0x23,0x11,0x21,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x20,0x36,0x35,0x34,0x26,0x23,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x01,0x34,0x26,0x27, +0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x4d,0xfe,0x8f,0x5f,0xa1,0x01,0x00,0x79,0x67,0x43,0xa7,0xa1,0x01,0x02,0x89,0x71,0x6f,0x76,0x19,0xbb,0x80,0x8c,0xcf,0xcb,0x90,0x7c,0xbf,0x19,0x76,0x01,0x71,0xc5,0xc5,0xfd,0x8f,0x76,0x54,0x51,0x79,0x6f,0x5b,0x56,0x74,0x03,0x16,0xfe,0xf9,0xfd,0xf1,0x02,0xa0,0x40,0x4a,0x34,0x3b, +0x12,0x91,0x42,0x4d,0x4c,0x2f,0x75,0xa0,0xc7,0x95,0x90,0xcb,0x9c,0x75,0xf8,0xb6,0x32,0x07,0x35,0x01,0xd2,0x55,0x74,0x01,0x71,0x59,0x51,0x79,0x76,0x00,0x00,0x01,0x00,0xd7,0x00,0x00,0x05,0x2d,0x06,0xd0,0x00,0x12,0x00,0x00,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x01,0x07,0x01,0x11,0x21,0x11,0x33,0x11,0x21,0x05, +0x2d,0xa1,0xfe,0xc7,0xa1,0xfe,0x25,0xa3,0x01,0xa5,0x72,0xfe,0xcb,0x01,0x3a,0xa1,0x01,0xda,0x02,0x48,0xfd,0xb8,0x02,0x48,0x04,0x88,0xfe,0x58,0x72,0x01,0x39,0xfc,0xea,0x01,0x22,0xfe,0xde,0x00,0x00,0x01,0x00,0xf9,0xff,0xe9,0x05,0x0b,0x06,0xd0,0x00,0x1b,0x00,0x00,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22, +0x00,0x07,0x23,0x11,0x33,0x01,0x07,0x01,0x11,0x36,0x37,0x36,0x33,0x32,0x16,0x16,0x05,0x0b,0xd5,0x96,0x37,0x7c,0x95,0x86,0x70,0xd8,0xfe,0xef,0x01,0xa1,0xa3,0x01,0xa6,0x72,0xfe,0xca,0x51,0x87,0x7f,0x93,0x71,0xb5,0x61,0x01,0xa6,0x9a,0xf6,0x2d,0x7b,0x21,0xb4,0x6d,0x62,0x74,0xfe,0x82,0xfe,0x06,0xd0,0xfe,0x58,0x72,0x01,0x39, +0xfb,0xf9,0x89,0x47,0x47,0x51,0x9e,0x00,0x00,0x02,0x01,0x37,0xff,0xe8,0x04,0xcd,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x00,0x01,0x14,0x06,0x23,0x20,0x11,0x10,0x13,0x21,0x35,0x21,0x36,0x37,0x21,0x15,0x21,0x06,0x07,0x21,0x15,0x21,0x02,0x11,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04, +0xcd,0xcc,0x8f,0xfe,0x6e,0x7d,0xfe,0xda,0x01,0x61,0x47,0x7a,0x01,0x74,0xfe,0xf2,0x47,0x2f,0x01,0x2f,0xfe,0x94,0x8b,0x69,0x88,0x8f,0xcc,0x91,0x72,0x58,0x59,0x72,0x70,0x5b,0x5a,0x70,0x01,0x44,0x90,0xcc,0x02,0x57,0x01,0x2d,0x01,0x53,0x92,0xa2,0xdd,0x92,0x83,0x6a,0x92,0xfe,0xa1,0xfe,0xde,0x60,0xcc,0x8e,0x50,0x79,0x78,0x51, +0x50,0x7b,0x7a,0x00,0x00,0x02,0x00,0x33,0xff,0xe8,0x05,0xd0,0x06,0xe8,0x00,0x1f,0x00,0x2b,0x00,0x00,0x13,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x11,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06, +0x33,0x73,0x9d,0x76,0x9d,0x83,0x4e,0x9e,0x5d,0xa3,0x75,0x96,0xca,0x92,0x8f,0xcc,0x98,0x72,0x77,0x93,0x70,0x9d,0x85,0x4c,0x69,0x4e,0x03,0x26,0x77,0x53,0x54,0x77,0x78,0x53,0x53,0x77,0x06,0x67,0x81,0x6d,0x5b,0xb0,0xfb,0xc5,0x1c,0xc0,0x76,0x90,0xcb,0xca,0x91,0x77,0xc0,0x1b,0x03,0x5d,0x62,0x6c,0x5b,0x5b,0xfb,0x47,0x53,0x77, +0x76,0x54,0x54,0x76,0x77,0x00,0x00,0x04,0x01,0x1c,0xff,0xe8,0x04,0xe8,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x39,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x37,0x26,0x03,0x33,0x16,0x16, +0x33,0x32,0x36,0x37,0x33,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xad,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0xfd,0x7f,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0x02,0xbc,0xfe,0xe6,0xcc,0xcc,0xfe,0xe6,0xda,0xd9,0x01,0xa2,0x01,0xbd,0x86,0x87,0xbd,0x01,0xa1,0x02,0xd8,0xda,0xa1,0xbf, +0x86,0x86,0xbe,0xbf,0x85,0x86,0xbf,0x06,0x18,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0xfb,0x8c,0xc7,0xfe,0xde,0x01,0x20,0xc9,0x01,0x02,0x95,0x93,0x01,0x00,0x7e,0xc5,0xc7,0x7c,0xfe,0xff,0x92,0x95,0xfe,0xfe,0x7f,0xc7,0xc6,0x80,0x83,0xc5,0xc7,0x00,0x00,0x03,0x00,0x45,0xff,0xe9,0x05,0xbe, +0x06,0xe8,0x00,0x28,0x00,0x35,0x00,0x41,0x00,0x00,0x01,0x14,0x06,0x07,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x27,0x06,0x21,0x22,0x24,0x27,0x34,0x37,0x36,0x33,0x20,0x17,0x36,0x35,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x32,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x06,0x07,0x14,0x16,0x33,0x32,0x36, +0x01,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x20,0x37,0x05,0xbe,0x92,0x81,0x2f,0x2f,0x79,0xf2,0x98,0xb0,0xc2,0x07,0xb5,0xfe,0xc7,0xcb,0xfe,0xec,0x01,0x8b,0x8a,0xcb,0x01,0x38,0xb6,0x07,0x01,0x7c,0x96,0xca,0x91,0x90,0xcc,0x92,0x3b,0x3a,0x55,0x55,0x74,0x01,0x71,0x59,0x56,0x74,0xfe,0x9f,0x8c,0xfe,0xe6,0x87,0xb8,0x57, +0x93,0x55,0x01,0x1b,0x8b,0x05,0x8d,0x76,0xc2,0x1d,0x18,0x86,0x74,0x72,0x88,0x9d,0xeb,0x9e,0x1d,0xa1,0x2b,0xd7,0xa0,0x28,0x29,0xc4,0xd8,0x95,0x97,0x6a,0x6c,0xc3,0x28,0x28,0x18,0x1d,0xbf,0x79,0x90,0xca,0x01,0xcc,0x8f,0x57,0x38,0x3b,0x76,0x54,0x51,0x79,0x76,0xfd,0xef,0xc2,0x74,0x50,0x32,0x5e,0x33,0xc1,0xff,0xff,0x00,0x00, +0xfd,0xff,0x03,0xbd,0xff,0xbb,0x02,0x26,0x0b,0x59,0x00,0x00,0x00,0x27,0x0b,0x5f,0x02,0x6d,0x00,0x00,0x00,0x07,0x0b,0x53,0x03,0x04,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x97,0xff,0xbb,0x02,0x26,0x0b,0x5a,0x00,0x00,0x00,0x67,0x0b,0x5f,0x02,0x47,0x00,0x00,0xc0,0x01,0x40,0x00,0x00,0x07,0x0b,0x53,0x02,0xde,0x00,0x00, +0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x97,0xff,0xbb,0x02,0x26,0x0b,0x5b,0x00,0x00,0x00,0x67,0x0b,0x5f,0x02,0x47,0x00,0x00,0xc0,0x01,0x40,0x00,0x00,0x07,0x0b,0x53,0x02,0xde,0x00,0x00,0xff,0xff,0xff,0x9c,0x05,0x77,0x00,0x67,0x06,0x40,0x02,0x06,0x0b,0x66,0x00,0x00,0xff,0xff,0xfe,0xe6,0x05,0x77,0x01,0x1b,0x06,0x40,0x02,0x27, +0x0b,0x66,0xff,0x4a,0x00,0x00,0x00,0x07,0x0b,0x66,0x00,0xb4,0x00,0x00,0xff,0xff,0xff,0x9c,0xfe,0x8d,0x00,0x67,0xff,0x56,0x02,0x06,0x0b,0x67,0x00,0x00,0xff,0xff,0x00,0x31,0x00,0x00,0x03,0x17,0x05,0xd5,0x02,0x26,0x0b,0x6a,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0x9f,0x00,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x05,0xd5, +0x02,0x26,0x0b,0x6b,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xea,0x00,0x00,0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x05,0xd5,0x02,0x26,0x0b,0x6c,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0xad,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x05,0xd5,0x02,0x26,0x0b,0x82,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0xf3,0x00,0x00,0x00,0x02, +0x00,0x6d,0xff,0xe8,0x01,0xcc,0x05,0xb2,0x00,0x0d,0x00,0x1b,0x00,0x4d,0x40,0x2e,0x11,0x03,0x7e,0x18,0x0a,0x0a,0x1d,0x1b,0x14,0x0d,0x06,0x15,0x91,0x14,0x0d,0x91,0x00,0x2f,0x14,0x01,0x20,0x00,0x50,0x00,0x80,0x00,0xb0,0x00,0xd0,0x00,0xe0,0x00,0x06,0x14,0x00,0x14,0x00,0x06,0x1b,0x91,0x0e,0x04,0x07,0x91,0x06,0x13,0x00,0x3f, +0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x10,0xed,0x01,0x2f,0x33,0x33,0x33,0x12,0x39,0x2f,0x33,0xe9,0x32,0x31,0x30,0x13,0x32,0x16,0x15,0x14,0x06,0x23,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x11,0x32,0x16,0x15,0x14,0x06,0x23,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x6d,0x91,0xce,0xce,0x91,0x52,0x65,0x65,0x52, +0x91,0xce,0xce,0x91,0x52,0x65,0x65,0x52,0x02,0xa6,0xce,0x91,0x91,0xce,0x98,0x06,0x6e,0x53,0x53,0x6e,0x06,0x03,0xa4,0xce,0x91,0x91,0xce,0x98,0x06,0x6e,0x53,0x53,0x6e,0x06,0x00,0x02,0x00,0x5a,0x01,0x80,0x01,0x52,0x05,0xb2,0x00,0x0d,0x00,0x1b,0x00,0x30,0x40,0x18,0x11,0x03,0xed,0x18,0x0a,0x0a,0x1d,0x1b,0x14,0x0d,0x06,0x07, +0x96,0x06,0x0d,0x96,0x00,0x15,0x96,0x14,0x1b,0x96,0x0e,0x04,0x00,0x3f,0xed,0xd6,0xed,0xd6,0xed,0xd6,0xed,0x01,0x2f,0x33,0x33,0x33,0x12,0x39,0x2f,0x33,0xe9,0x32,0x31,0x30,0x13,0x16,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x5a,0x68, +0x90,0x90,0x68,0x36,0x3a,0x3a,0x36,0x68,0x90,0x90,0x68,0x36,0x3a,0x3a,0x36,0x03,0x70,0x02,0x91,0x65,0x65,0x91,0x02,0x82,0x05,0x3b,0x36,0x36,0x3b,0x05,0x02,0xc4,0x02,0x91,0x65,0x65,0x91,0x02,0x82,0x05,0x3b,0x36,0x36,0x3b,0x05,0x00,0x00,0x01,0x00,0x5b,0x02,0xac,0x01,0xde,0x05,0xb2,0x00,0x0d,0x00,0x1e,0x40,0x0e,0x00,0x07, +0x07,0x0f,0x03,0x7e,0x0a,0x06,0x91,0x07,0x00,0x91,0x0d,0x04,0x00,0x3f,0xed,0xd6,0xed,0x01,0x2f,0xe9,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0xde,0x60,0x7b,0x7b,0x60,0xa7,0xdc,0xdc,0xa7,0x05,0x1a,0x06,0x85,0x60,0x60,0x85,0x06,0x98,0xdc,0xa7,0xa7,0xdc,0x00, +0x00,0x01,0x00,0x4e,0x03,0x90,0x01,0x5e,0x05,0xb2,0x00,0x0d,0x00,0x1e,0x40,0x0e,0x00,0x07,0x07,0x0f,0x03,0xed,0x0a,0x06,0x96,0x07,0x00,0x96,0x0d,0x04,0x00,0x3f,0xed,0xd6,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x15,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x5e,0x3f,0x49,0x49,0x3f, +0x77,0x99,0x95,0x7b,0x05,0x30,0x05,0x4b,0x3f,0x3f,0x4b,0x05,0x82,0x02,0x98,0x77,0x75,0x98,0x04,0x00,0x00,0x01,0x00,0xbc,0xfe,0x5a,0x04,0xf2,0x05,0x9a,0x00,0x15,0x00,0x3b,0x40,0x1f,0x13,0x00,0x7e,0x0b,0x06,0x0b,0x06,0x0b,0x17,0x12,0x0e,0x7e,0x0f,0x0d,0x91,0x40,0x12,0x10,0x0f,0x12,0x91,0x2b,0x30,0x14,0x10,0x03,0x08,0x91, +0x03,0x0f,0x12,0x00,0x3f,0xd4,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xb5,0xb7,0x4c,0x3d,0x4f,0x3e,0x5f,0x61,0xfd,0x1a,0xa8, +0xa8,0x02,0xe6,0xa8,0x3f,0xf8,0xed,0x1f,0xa5,0x2c,0x86,0x89,0x02,0x8d,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00,0x01,0x00,0xa6,0xfe,0x5a,0x03,0xf8,0x05,0xec,0x00,0x1a,0x00,0x2f,0x40,0x18,0x00,0x84,0x0a,0x06,0x0a,0x06,0x0a,0x1c,0x15,0x11,0x84,0x12,0x15,0x0d,0x95,0x18,0x0f,0x13,0x00,0x08,0xec,0x03,0x12,0x15,0x00,0x3f, +0xd4,0xed,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x21,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xb7,0xaf,0x4d,0x3d,0x4f,0x3f,0xbe,0xee,0x77,0xa5,0xa4,0xa4,0x04,0x77,0xd9,0x01, +0x5a,0xd4,0xd2,0x1f,0xa5,0x2c,0x01,0x0e,0x02,0x4e,0x01,0x40,0xb8,0x92,0xfd,0xbc,0x05,0xec,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x00,0x01,0x00,0x29,0xfe,0x21,0x05,0x83,0x05,0x9a,0x00,0x21,0x00,0x5c,0x40,0x31,0x1f,0x17,0x7e,0x13,0x0a,0x18,0x03,0x7d,0x10,0x15,0x21,0x1a,0x18,0x1d,0x10,0x21,0x21,0x10,0x1d,0x18,0x1a,0x05,0x22,0x23, +0x00,0x14,0x21,0x15,0x91,0x1f,0x12,0x92,0x00,0x00,0x06,0x1f,0x1f,0x18,0x1e,0x1a,0x91,0x1b,0x03,0x0a,0x0d,0x92,0x06,0x18,0x12,0x00,0x3f,0xd4,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x10,0xc6,0xc4,0xe9,0x32, +0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x15,0x03,0xea,0xbf,0xda,0xfe,0xdf,0xea,0x76,0xaa,0x56,0x63,0xb7,0x63,0x96,0xbc,0xfe,0xa1,0x8c,0x01,0x8a,0xfd,0xfe,0xa8,0xfe,0x63,0x03,0xe3,0xfe, +0x62,0x03,0x02,0x01,0x73,0x04,0xd8,0xb6,0xce,0xf2,0x26,0x2e,0xb6,0x44,0x37,0xa0,0x87,0x01,0x1e,0x07,0x02,0x3f,0xfc,0xc5,0x05,0x02,0x98,0x98,0xfe,0xd1,0x28,0x00,0x00,0x01,0x00,0x2b,0xfe,0x21,0x04,0xe4,0x05,0x2f,0x00,0x29,0x00,0x57,0x40,0x2e,0x00,0x12,0x03,0x83,0x0e,0x14,0x29,0x12,0x0e,0x29,0x29,0x0e,0x12,0x03,0x2b,0x27, +0x15,0x84,0x24,0x22,0x09,0x20,0x29,0x15,0x21,0x95,0x23,0x11,0x96,0x00,0x00,0x06,0x27,0x26,0x23,0x0f,0x1b,0x19,0x95,0x1e,0x15,0x09,0x0b,0x95,0x06,0x1b,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x33,0x33,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x32,0x01,0x2f,0xc4,0x33,0x33,0xe9,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10, +0xe9,0x11,0x33,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x03,0x20,0xd2,0xf2,0xfe,0xb5,0xf0,0xb6,0x9a,0xa6,0xb0,0xab,0xe2,0xdb,0xd1,0x52,0x01, +0x80,0xfd,0xc1,0x46,0x51,0x3f,0x2c,0x3b,0x5e,0xfe,0xf3,0xb0,0xb0,0xa4,0x03,0x2a,0x01,0xae,0x1c,0xe9,0xb3,0xce,0xfe,0xf9,0x51,0xa2,0x68,0xb2,0x94,0x9b,0xa0,0x33,0x02,0x14,0xfd,0xbf,0x67,0x58,0x22,0x8c,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x33,0x00,0x00,0x01,0x00,0x66,0xff,0xe9,0x04,0x0b,0x05,0xb2,0x00,0x24, +0x00,0x4b,0x40,0x17,0x24,0x1a,0x18,0x01,0x20,0x0e,0x1a,0x01,0x0e,0x0e,0x01,0x1a,0x03,0x26,0x09,0x7d,0x15,0x20,0x23,0x91,0x1c,0x00,0x05,0xb8,0x01,0x05,0x40,0x0e,0x19,0x1a,0x24,0x1b,0x19,0x04,0x12,0x1c,0x04,0x0e,0x0c,0x91,0x12,0x13,0x00,0x3f,0xed,0x32,0x3f,0x12,0x17,0x39,0x10,0xed,0x33,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12, +0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x26,0x26,0x27,0x27,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x20,0x24,0x35,0x34,0x24,0x37,0x35,0x01,0x35,0x01,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x07,0x03,0x3c,0x0c,0x25,0x13,0x26,0x1f,0xd2,0xca,0xd4,0xac,0xb9,0xbb,0x5c, +0xb3,0x65,0xfe,0xfd,0xfe,0xd2,0x01,0x17,0xf4,0xfe,0x49,0x01,0xb7,0x93,0x9c,0x4f,0x53,0xbf,0x58,0xf8,0x03,0x40,0x8c,0x03,0x03,0x01,0x02,0x99,0x9b,0x7e,0x8c,0x5c,0xa6,0x29,0x23,0xdc,0xc3,0xc6,0xd8,0x02,0x04,0x01,0x23,0x2e,0x01,0x35,0x24,0x22,0xaa,0x30,0x28,0xab,0x00,0x01,0x00,0x26,0xfe,0x1d,0x03,0xc5,0x04,0x00,0x00,0x25, +0x00,0x4a,0x40,0x26,0x25,0x1b,0x19,0x00,0x1b,0x00,0x1b,0x00,0x16,0x21,0x10,0x10,0x27,0x09,0x84,0x16,0x21,0x24,0x95,0x1d,0x06,0x96,0x00,0x1c,0x25,0x1b,0x03,0x1d,0x19,0x19,0x13,0x1d,0x10,0x0f,0x0c,0x95,0x13,0x1c,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f, +0xc4,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x26,0x26,0x27,0x27,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x24,0x37,0x35,0x01,0x35,0x01,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x07,0x02,0xf6,0x0c,0x25,0x13,0x26,0x1f,0xc3,0xde,0xe3,0xa2,0x5e,0xb8,0x5e, +0x67,0xaa,0x63,0xf9,0xfe,0xce,0x01,0x1e,0xee,0xfe,0x56,0x01,0x8f,0x9a,0xaa,0x4e,0x53,0xbf,0x58,0xf0,0x01,0x8e,0x8c,0x03,0x03,0x01,0x02,0xa9,0x97,0x83,0xa0,0x34,0x2e,0x9c,0x2d,0x24,0xe3,0xca,0xc5,0xe3,0x02,0x05,0x01,0x23,0x2e,0x01,0x36,0x24,0x22,0x9b,0x30,0x28,0xbe,0x00,0x00,0x02,0x00,0x51,0xff,0xe6,0x03,0x95,0x05,0x9a, +0x00,0x12,0x00,0x1e,0x00,0x35,0x40,0x1a,0x13,0x12,0x01,0x7e,0x0f,0x08,0x0f,0x08,0x0f,0x20,0x1e,0x10,0x11,0x10,0x91,0x17,0x12,0x1e,0x1e,0x04,0x12,0x03,0x0b,0x91,0x04,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x01,0x2f,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x33,0x31,0x30,0x01,0x11,0x14,0x06,0x23, +0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x13,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x07,0x06,0x07,0x01,0x03,0x95,0xa4,0xbc,0x23,0x65,0x21,0x1f,0x61,0x29,0x60,0x58,0xfd,0x64,0x02,0x95,0x07,0x07,0x03,0x04,0x07,0x09,0x11,0x09,0x08,0xfe,0x47,0x05,0x9a,0xfb,0xdc,0xde,0xb2,0x0f,0x10,0xa5,0x11,0x1b, +0x58,0x80,0x0f,0x81,0x03,0xb4,0xfc,0x61,0x02,0x4d,0x18,0x54,0x1a,0x0f,0x10,0x1d,0x0f,0x0c,0xfd,0x84,0x00,0x02,0x00,0x21,0xfe,0x1e,0x03,0x50,0x04,0x00,0x00,0x12,0x00,0x1d,0x00,0x30,0x40,0x18,0x13,0x11,0x00,0x84,0x0e,0x07,0x0e,0x07,0x0e,0x1f,0x1d,0x10,0x17,0x11,0x0f,0x10,0x1d,0x96,0x0f,0x15,0x0a,0x95,0x03,0x1c,0x00,0x3f, +0xed,0x3f,0xed,0x32,0x3f,0x33,0x01,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x33,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x33,0x03,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x01,0x03,0x50,0xae,0xa5,0x29,0x57,0x29,0x2b,0x51,0x2a,0x5a,0x58,0xfd,0x75, +0x02,0x85,0xaa,0xa4,0x02,0x05,0x03,0x03,0x0a,0x06,0x14,0xfe,0x46,0x3f,0xca,0xd9,0x0c,0x14,0x99,0x1b,0x12,0x7e,0x9b,0x3d,0x6f,0x03,0x91,0xfc,0x84,0x02,0x54,0x1e,0x32,0x15,0x07,0x14,0x0a,0x22,0xfd,0x8e,0x00,0x03,0x00,0x51,0xff,0xe6,0x04,0xa1,0x05,0x9a,0x00,0x16,0x00,0x22,0x00,0x26,0x00,0x54,0x40,0x2c,0x26,0x23,0x24,0x25, +0x01,0x04,0x7e,0x13,0x17,0x16,0x13,0x23,0x03,0x25,0x13,0x0c,0x0c,0x13,0x25,0x03,0x23,0x05,0x28,0x22,0x14,0x25,0x12,0x26,0x04,0x14,0x91,0x15,0x01,0x1b,0x16,0x22,0x22,0x08,0x16,0x03,0x0f,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0xfd,0x32,0xcc,0x3f,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f, +0x2f,0x2f,0x11,0x33,0x33,0x10,0xe9,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x13,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x07,0x06,0x07,0x01,0x05,0x03,0x23,0x13,0x03,0x95,0xf1,0xf1,0xa6,0xba,0x23,0x65,0x21,0x1f,0x61, +0x29,0x60,0x58,0xfd,0x64,0x02,0x95,0x07,0x07,0x03,0x04,0x07,0x09,0x11,0x09,0x08,0xfe,0x47,0x03,0x99,0xa6,0x7b,0x75,0x05,0x9a,0xfc,0x61,0x96,0x0e,0xc7,0xaa,0x0f,0x10,0xa5,0x11,0x1b,0x58,0x80,0x0f,0x81,0x03,0xb4,0xfc,0x61,0x02,0x4d,0x18,0x54,0x1a,0x0f,0x10,0x1d,0x0f,0x0c,0xfd,0x84,0xf8,0xfe,0xfc,0x01,0x04,0x00,0x00,0x03, +0x00,0x21,0xfe,0x1e,0x04,0x72,0x04,0x00,0x00,0x16,0x00,0x21,0x00,0x25,0x00,0x4b,0x40,0x26,0x23,0x24,0x25,0x22,0x07,0x24,0x14,0x22,0x22,0x14,0x24,0x07,0x04,0x27,0x21,0x10,0x13,0x16,0x84,0x17,0x11,0x0e,0x1b,0x11,0x0f,0x24,0x24,0x03,0x13,0x10,0x21,0x25,0x16,0x0f,0x15,0x0a,0x03,0x1c,0x00,0x3f,0xcd,0x3f,0x33,0xcc,0xcd,0x32, +0x32,0x12,0x39,0x2f,0x3f,0x33,0x01,0x2f,0x33,0x33,0xe9,0x32,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x33,0x11,0x21,0x15,0x21,0x27,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x01,0x05,0x03,0x23, +0x13,0x03,0x50,0xae,0xa5,0x29,0x57,0x29,0x2b,0x51,0x2a,0x5a,0x58,0xfd,0x75,0x02,0x85,0xaa,0x01,0x05,0xfe,0xfb,0xa4,0x02,0x05,0x03,0x03,0x0a,0x06,0x14,0xfe,0x46,0x03,0xa3,0xa6,0x7b,0x75,0x3f,0xca,0xd9,0x0c,0x14,0x99,0x1b,0x12,0x7e,0x9b,0x3d,0x6f,0x03,0x91,0xfc,0x84,0x84,0x84,0x02,0x54,0x1e,0x32,0x15,0x07,0x14,0x0a,0x22, +0xfd,0x8e,0xdc,0xfe,0xfc,0x01,0x04,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x0b,0x04,0x33,0x00,0x09,0x00,0x26,0x40,0x12,0x03,0x00,0x00,0x0b,0x02,0x05,0x84,0x07,0x05,0x95,0x02,0x02,0x07,0x01,0x95,0x08,0x07,0x15,0x00,0x3f,0xdd,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xc6,0x31,0x30,0x01,0x21,0x11,0x21, +0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x0b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0xa4,0x02,0x5b,0x03,0xa8,0xfe,0xb1,0x8a,0xfe,0x31,0x04,0x33,0x00,0x01,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45,0x00,0x21,0x00,0x34,0x40,0x1b,0x1b,0x84,0x06,0x11,0x06,0x11,0x21,0x23,0x16,0x84,0x0b,0x21,0x11,0x13,0x95,0x16,0x0b,0x1b,0x06,0x04,0x0e,0x1e, +0x00,0x03,0x95,0x1e,0x16,0x00,0x3f,0xfd,0xc6,0x10,0xd4,0x17,0x39,0xfd,0xc6,0x01,0x2f,0xd4,0xe9,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x6b,0x33, +0xa3,0x4a,0x73,0x68,0x71,0xfe,0xef,0x7c,0xd7,0xa8,0xa0,0x4a,0x5f,0x93,0x61,0x75,0x77,0x01,0x01,0x87,0xd7,0xb9,0x43,0xa8,0x22,0xd7,0x29,0x38,0x54,0x44,0x46,0x57,0x87,0x91,0x69,0x7e,0x9b,0x26,0xa5,0x42,0x4e,0x3e,0x4d,0x59,0x7b,0x8d,0x67,0x88,0xa6,0x28,0x16,0x00,0x00,0x03,0x00,0x16,0x00,0x00,0x08,0xf1,0x05,0x9a,0x00,0x17, +0x00,0x21,0x00,0x2b,0x00,0x3f,0x40,0x1f,0x17,0x0c,0x1c,0x03,0x05,0x26,0x13,0x00,0x00,0x05,0x13,0x13,0x2d,0x05,0x26,0x1c,0x16,0x03,0x91,0x2b,0x21,0x21,0x04,0x1c,0x11,0x06,0x03,0x14,0x01,0x04,0x12,0x00,0x3f,0x33,0x33,0x3f,0x33,0xcd,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x33,0x01,0x2f,0x11,0x33,0x2f,0x12,0x39,0x2f,0x12,0x39, +0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x01,0x17,0x16,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x01,0x6f,0x16,0x06, +0x0b,0x02,0x04,0x15,0x09,0x01,0x77,0xae,0x02,0x28,0xba,0x98,0xfd,0xa0,0x60,0xfe,0xaa,0xe1,0x06,0x0e,0x02,0x04,0x02,0x0d,0x08,0xdf,0x05,0xd0,0xe1,0x06,0x0e,0x02,0x04,0x02,0x0d,0x08,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x9a,0xfc,0x47,0x3b,0x12,0x23,0x0d,0x0d,0x40,0x16,0x03,0xd3,0xfa,0x66,0x01,0x92,0xfe,0xf2,0x01,0xa5,0x02,0x63, +0x10,0x3a,0x16,0x14,0x36,0x15,0xfd,0x9c,0x02,0x63,0x10,0x3a,0x16,0x14,0x36,0x15,0xfd,0x9c,0x00,0x03,0x00,0x5a,0xff,0xe8,0x05,0xfc,0x04,0x18,0x00,0x2d,0x00,0x38,0x00,0x43,0x00,0x5d,0x40,0x30,0x09,0x09,0x00,0x32,0xef,0x39,0x23,0x19,0x39,0x2e,0x11,0x84,0x12,0x04,0x12,0x39,0x12,0x39,0x12,0x45,0x3d,0x83,0x27,0x20,0x09,0x27, +0x27,0x06,0x25,0x95,0x2a,0x2e,0x39,0x96,0x04,0x23,0x23,0x0d,0x2a,0x0f,0x35,0x40,0x95,0x16,0x1d,0x16,0x12,0x15,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x33,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0xc4,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x33,0x11,0x33,0x33,0x10,0xf9,0x32,0xc0,0x2f,0x31, +0x30,0x01,0x36,0x36,0x37,0x25,0x10,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x05,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x25,0x07,0x06,0x06,0x15,0x14, +0x16,0x33,0x32,0x36,0x35,0x03,0x7b,0x1f,0x5b,0x30,0x01,0x33,0xcd,0x3f,0x8f,0x1f,0x3d,0x87,0x52,0x9f,0xa9,0xa4,0x04,0x6a,0xd1,0x78,0x91,0x26,0x04,0x32,0xa9,0x6b,0x94,0xb2,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x97,0xc5,0xb9,0xa8,0x01,0xdd,0xf7,0x82,0x64,0x73,0x51,0x78,0xa1,0xfd,0x87,0xf7,0x82,0x64,0x6d,0x57,0x7a,0x9f,0x02, +0x2d,0x12,0x18,0x07,0x2b,0x01,0x05,0x49,0x35,0x9e,0x39,0x31,0xbe,0xc0,0xfd,0x66,0xa0,0xb8,0x5b,0x61,0x5a,0x62,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xc3,0xbb,0x94,0x22,0x12,0x5f,0x57,0x4d,0x5d,0xae,0x80,0x66,0x22,0x12,0x5f,0x57,0x50,0x5a,0xae,0x80,0x00,0x00,0x03,0x00,0x16,0xff,0xe8,0x08,0xdb,0x05,0xb2, +0x00,0x15,0x00,0x21,0x00,0x2b,0x00,0x3b,0x40,0x1f,0x0d,0x7d,0x26,0x06,0x1b,0x1b,0x00,0x2d,0x21,0x7f,0x07,0x00,0x14,0x91,0x06,0x2b,0x2b,0x01,0x15,0x12,0x18,0x91,0x10,0x13,0x1e,0x91,0x0a,0x04,0x26,0x01,0x03,0x00,0x3f,0xcd,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0x2f,0xe9,0x11,0x12,0x39,0x2f,0x39,0x39, +0xe9,0x31,0x30,0x33,0x01,0x33,0x13,0x16,0x17,0x17,0x33,0x36,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x24,0x27,0x21,0x03,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x07,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x9f,0x0b,0x08,0x0c,0x04,0x21,0x01,0x60,0x01,0x1a,0x01,0x28,0x01, +0x6c,0xfe,0x8c,0xfe,0xc8,0xeb,0xfe,0xbd,0x42,0xfd,0xa1,0x8f,0x03,0x6e,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xb6,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfe,0x62,0x1d,0x19,0x2c,0xdf,0x01,0x39,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0xed,0xbd,0xfe,0x6e,0x01,0xc1,0xfe,0xbe,0x01,0x34, +0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0xa2,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0xb6,0x04,0x18,0x00,0x20,0x00,0x2c,0x00,0x37,0x00,0x52,0x40,0x2c,0x00,0x14,0x2c,0x84,0x30,0x0a,0x30,0x1b,0x83,0x26,0x30,0x26,0x30,0x26,0x39,0x34,0x83,0x0e,0x07,0x23,0x95,0x1e, +0x16,0x29,0x95,0x18,0x10,0x0e,0x0c,0x95,0x11,0x30,0x96,0x14,0x11,0x00,0x0a,0x0a,0x11,0x10,0x37,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x39,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xc4,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9,0x39,0x39,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22, +0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x26,0x36,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x03,0x27,0x02,0x45,0xc8,0x78,0x92,0xb4,0x01,0x52,0x01,0x33,0xd3,0xba, +0x94,0x97,0xc5,0x8d,0x98,0x18,0x04,0x44,0xd3,0x6a,0xe0,0xfa,0xfe,0xf2,0xe4,0x83,0xe0,0x22,0xb4,0x99,0x9c,0xa2,0xa2,0x9c,0x9c,0xb1,0xfe,0xc2,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xcd,0x73,0x72,0xa2,0x86,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0x64,0x4b,0x61,0x4e,0xfe,0xe4,0xf8,0xf3,0xfe,0xd7,0x75,0xed,0xd8,0xcf,0xbd,0xbe, +0xd2,0xe1,0xa1,0xfe,0x66,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x16,0xff,0xe8,0x07,0x3a,0x05,0x9a,0x00,0x13,0x00,0x1d,0x00,0x30,0x40,0x18,0x02,0x7e,0x18,0x08,0x0c,0x01,0x01,0x1f,0x0c,0x0a,0x91,0x1d,0x1d,0x0b,0x18,0x01,0x0d,0x03,0x0b,0x12,0x12,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x3f,0x33,0xcd,0x12, +0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0xe9,0x31,0x30,0x01,0x11,0x33,0x11,0x10,0x21,0x22,0x26,0x27,0x03,0x21,0x03,0x23,0x01,0x33,0x01,0x16,0x16,0x33,0x20,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x06,0x92,0xa8,0xfd,0xdf,0x34,0x59,0x34,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x01,0xf5,0x12,0x29, +0x11,0x01,0x67,0xfc,0xf7,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x02,0x29,0x03,0x71,0xfc,0xaa,0xfd,0xa4,0x0a,0x0e,0x01,0x92,0xfe,0x6e,0x05,0x9a,0xfa,0xea,0x03,0x02,0x01,0xaa,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xff,0xe8,0x06,0x1e,0x04,0x18,0x00,0x26,0x00,0x31,0x00,0x50,0x40,0x2b, +0x1d,0x84,0x2a,0x12,0x08,0x2a,0x02,0x00,0x84,0x24,0x2a,0x24,0x2a,0x24,0x33,0x2e,0x83,0x18,0x0f,0x25,0x0f,0x18,0x16,0x95,0x1b,0x2a,0x96,0x12,0x12,0x1b,0x0f,0x08,0x31,0x95,0x0c,0x16,0x02,0x21,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x39,0x2f,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc4,0xe1,0x12, +0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x11,0x33,0x33,0x10,0xe9,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33, +0x06,0x1e,0x9f,0x04,0x63,0xd0,0x75,0x98,0x2f,0x03,0x3f,0xc0,0x6a,0x99,0xad,0x01,0x52,0x01,0x33,0x6b,0x68,0xba,0x94,0x97,0xc5,0x01,0x69,0x7b,0x74,0x74,0x94,0xa4,0xfc,0x27,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xa2,0xba,0x57,0x65,0x5d,0x5f,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x11,0x75,0x7f,0x7e,0xa8,0x60,0xfe,0x82,0xf4,0x92,0xa2,0xb2, +0x8e,0x02,0x4e,0xfc,0x72,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x16,0x00,0x00,0x07,0x24,0x05,0x9a,0x00,0x10,0x00,0x1a,0x00,0x32,0x40,0x18,0x15,0x05,0x00,0x0a,0x0b,0x0b,0x1c,0x0c,0x06,0x00,0x0f,0x91,0x1a,0x1a,0x01,0x10,0x05,0x0d,0x12,0x0a,0x03,0x15,0x01,0x03,0x00,0x3f,0xcd,0x3f,0x3f,0x33,0x33,0x12, +0x39,0x2f,0xed,0x01,0x2f,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x39,0x31,0x30,0x33,0x01,0x33,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x01,0xb5,0x14,0x0b,0x04,0x10,0x08,0x01,0x95,0xb5,0xfd,0xed,0xb9,0x98,0xfd,0xa0,0x8f, +0x02,0xb8,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfb,0x8f,0x36,0x49,0x18,0x51,0x16,0x04,0x71,0xfa,0x66,0x01,0x92,0xfe,0x6e,0x02,0x29,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xff,0xe8,0x05,0x3a,0x04,0x18,0x00,0x1b,0x00,0x26,0x00,0x45,0x40,0x24,0x0c,0x04,0x84,0x17,0x0e,0x1f, +0x1f,0x14,0x0a,0x0b,0x0b,0x28,0x23,0x83,0x1b,0x14,0x1f,0x96,0x05,0x17,0x17,0x02,0x0e,0x26,0x95,0x11,0x16,0x0c,0x15,0x0a,0x0f,0x1b,0x19,0x95,0x02,0x10,0x00,0x3f,0xed,0x32,0x3f,0x3f,0x3f,0xed,0x32,0x11,0x39,0x2f,0x39,0xed,0x01,0x2f,0xc4,0xe9,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0xe9,0x32,0x31,0x30,0x13,0x36,0x33, +0x20,0x11,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0xbe,0x97,0xc5,0x01,0x69,0x04,0x03,0x16,0x11,0xdc,0xad,0xfe,0x4a,0xa5,0x04,0x6a,0xd1,0x99,0xad,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x01,0x87, +0x9a,0xf7,0x8f,0x57,0x6e,0x56,0x03,0xb8,0x60,0xfe,0x82,0xfe,0x87,0x24,0x51,0x2a,0x02,0x40,0xfc,0x00,0xa0,0xb8,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xfd,0x62,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x03,0x00,0x16,0x00,0x00,0x07,0x24,0x05,0x9a,0x00,0x0f,0x00,0x19,0x00,0x22,0x00,0x3b,0x40,0x1c,0x00,0x1d, +0x10,0x1d,0x05,0x0d,0x0a,0x0b,0x0b,0x24,0x05,0x22,0x0f,0x03,0x91,0x0c,0x08,0x1c,0x14,0x14,0x04,0x10,0x0a,0x06,0x03,0x01,0x04,0x12,0x00,0x3f,0x33,0x3f,0x33,0xcd,0x12,0x39,0x2f,0x39,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x11,0x33,0x2f,0x33,0xc6,0x12,0x39,0x39,0x11,0x33,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x01, +0x21,0x13,0x33,0x03,0x33,0x15,0x21,0x01,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x27,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x13,0x21,0x05,0x11,0xb9,0xe5,0xfe,0x3a,0xdc,0xbb,0x02,0x26,0xae,0x01,0x02,0x01,0x94,0xef,0xb5,0xf9,0xcd,0xfe,0xfb,0xfc,0x9b,0x05,0x0b,0x07,0x93,0x01,0x57,0x93,0x05,0x0c,0x05,0x02,0x0d,0x14,0x0b,0x04, +0x10,0x08,0x70,0xfe,0xdc,0x02,0x64,0xfd,0x9c,0x05,0x9a,0xfd,0x61,0x02,0x9f,0xfd,0x61,0x97,0x02,0x88,0x1f,0x30,0x11,0xfe,0x6f,0x01,0x91,0x0f,0x30,0x21,0xfc,0x3d,0x36,0x49,0x18,0x51,0x16,0x01,0x3b,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x05,0x3a,0x04,0x18,0x00,0x1d,0x00,0x24,0x00,0x2f,0x00,0x4d,0x40,0x28,0x1a,0x17,0x18,0x18, +0x31,0x1d,0x15,0x1f,0x84,0x0a,0x01,0x2f,0x28,0x83,0x0f,0x07,0x17,0x0f,0x0f,0x0d,0x95,0x12,0x1f,0x1c,0x2f,0x96,0x19,0x15,0x20,0x0a,0x0a,0x12,0x10,0x01,0x2b,0x95,0x04,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x39,0x2f,0x39,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc4,0xe9,0x2f,0x33,0x33,0xe9,0x32,0x32, +0x11,0x33,0x2f,0x33,0xc6,0x31,0x30,0x21,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x24,0x21,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x15,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x03,0x13,0x23,0x15,0x33,0x36,0x36,0x37,0x27,0x20,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x02,0xdf,0x04,0x6a,0xd1,0x99,0xad,0x01,0x29, +0x01,0x5c,0x69,0x6a,0xba,0x94,0x97,0xc5,0x01,0x69,0x7e,0x8c,0xad,0x9f,0x77,0xaf,0xdf,0x4b,0x4c,0x04,0x05,0x20,0x11,0xf3,0xfe,0xf6,0xbe,0x6e,0x56,0x7f,0x9a,0xa0,0xb8,0xa1,0x87,0xbe,0xbf,0x83,0x7e,0x7e,0xa8,0x60,0xfe,0x82,0x0d,0x01,0x73,0xfe,0x8d,0x83,0xfd,0xf6,0x02,0x0a,0xf1,0x2e,0x64,0x2e,0x31,0x76,0x78,0x4b,0x5f,0xa9, +0x8f,0x60,0x00,0x02,0x00,0x16,0xfe,0x1e,0x07,0x24,0x05,0x9a,0x00,0x1c,0x00,0x26,0x00,0x42,0x40,0x22,0x21,0x00,0x0c,0x05,0x19,0x03,0x0b,0x13,0x13,0x00,0x0a,0x0b,0x0b,0x28,0x00,0x1b,0x91,0x05,0x1c,0x26,0x26,0x01,0x19,0x1c,0x12,0x15,0x91,0x0f,0x1c,0x0a,0x03,0x21,0x01,0x03,0x00,0x3f,0xcd,0x3f,0x3f,0xed,0x3f,0x33,0x12,0x39, +0x2f,0x12,0x39,0xed,0x01,0x2f,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x17,0x39,0x12,0x39,0x31,0x30,0x33,0x01,0x33,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x01, +0xb5,0x14,0x0b,0x04,0x10,0x08,0x01,0x95,0xb5,0xfd,0xe5,0x5f,0xb6,0x8c,0x1e,0x30,0x1d,0x31,0x30,0x3a,0x60,0x22,0x48,0xa2,0xfd,0xa0,0x8f,0x02,0xb8,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfb,0x8f,0x36,0x49,0x18,0x51,0x16,0x04,0x71,0xfa,0x53,0xfd,0xd2,0x05,0x08,0x9d,0x12,0x56,0x50,0xa4,0x01,0x92,0xfe,0x6e, +0x02,0x29,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xfe,0x1e,0x05,0x3a,0x04,0x18,0x00,0x25,0x00,0x30,0x00,0x56,0x40,0x2d,0x28,0x13,0x84,0x25,0x0a,0x1b,0x25,0x1a,0x20,0x25,0x20,0x25,0x07,0x19,0x1a,0x1a,0x32,0x2d,0x83,0x07,0x0e,0x0e,0x07,0x22,0x95,0x1d,0x1c,0x19,0x0f,0x0e,0x0c,0x95,0x11,0x29, +0x96,0x14,0x0a,0x0a,0x11,0x10,0x00,0x30,0x95,0x04,0x16,0x00,0x3f,0xed,0x32,0x3f,0x39,0x2f,0x39,0xed,0x10,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xe9,0x11,0x33,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xe9,0x33,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22, +0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x26,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x02,0xe4,0x04,0x36,0xa1,0x69,0x99,0xad,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x97,0xc5,0x01,0x69,0x04,0x03,0x18,0x10,0xdb,0xad,0xfe,0x0a,0x7e,0xe4, +0x41,0x2a,0x34,0x2d,0x7f,0x3d,0x50,0x9f,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xa8,0x5d,0x63,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xfe,0x82,0xfe,0x8c,0x24,0x51,0x2a,0x02,0x3b,0xfb,0x5c,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x70,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x68,0xff,0xe8,0x04,0x96, +0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x37,0x40,0x1c,0x1b,0xc0,0x21,0x10,0x7d,0x05,0x21,0x05,0x21,0x05,0x23,0x0a,0x15,0x1e,0xc1,0x18,0x18,0x0d,0x00,0x02,0x91,0x13,0x13,0x0a,0x08,0x91,0x0d,0x04,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37, +0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x27,0x00,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x68,0x9d,0xd9,0xea,0x01,0x1e,0xfe,0xcc,0xf6,0xb9,0x9b,0x87,0xcb,0x01,0x3e,0x01,0x9e,0xfe,0x8f,0xfe,0xcf,0xed,0x9f,0x01,0x27,0x3a,0x29,0x2a,0x38,0x38,0x2a, +0x29,0x3a,0xdf,0x60,0x01,0x38,0x01,0x05,0x01,0x14,0x01,0x4a,0x56,0xb3,0x3b,0xfe,0x58,0xfe,0xa8,0xfe,0xbf,0xfe,0x77,0x54,0x02,0xc2,0x37,0x36,0x2a,0x2a,0x39,0x3b,0x28,0x00,0x00,0x02,0x00,0x50,0xff,0xe8,0x03,0x52,0x04,0x18,0x00,0x15,0x00,0x21,0x00,0x37,0x40,0x1c,0x1b,0xc0,0x21,0x10,0x83,0x05,0x21,0x05,0x21,0x05,0x23,0x0a, +0x15,0x1e,0xc1,0x18,0x18,0x0d,0x00,0x02,0x95,0x13,0x16,0x0a,0x08,0x95,0x0d,0x10,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x27,0x12, +0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x52,0x77,0x85,0x9e,0xbe,0xca,0x9c,0x81,0x73,0x69,0x85,0xf1,0x01,0x23,0xfe,0xf3,0xdb,0xa1,0x77,0xa1,0x3a,0x29,0x2a,0x38,0x38,0x2a,0x29,0x3a,0xcb,0x59,0xd0,0xb4,0xb6,0xe2,0x50,0xa8,0x32,0xfe,0xcd,0xfd,0xe4,0xfe,0xe4,0x47,0x01,0xfd,0x37,0x36,0x2a,0x2a,0x39,0x3b,0x28, +0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x46,0x40,0x23,0x17,0x18,0x00,0x19,0x10,0x10,0x07,0x01,0x00,0x00,0x1b,0x12,0x0e,0x06,0x7e,0x0b,0x09,0x07,0x11,0x09,0x92,0x0e,0x04,0x19,0x12,0x03,0x0a,0x0a,0x07,0x17,0x0c,0x03,0x01,0x07,0x12,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0x33,0xed,0x32, +0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x39,0x10,0xc6,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x07,0x13,0x0c, +0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x43,0x40,0x22,0x09,0x09,0x0d,0x0e,0x11,0x0e,0x10,0x10,0x16,0x0f,0x0b,0x07,0x14,0x84,0x04,0x02,0x00,0x0d,0x0f,0x0a,0x02,0x96, +0x07,0x12,0x0f,0x0b,0x03,0x03,0x03,0x05,0x00,0x11,0x00,0x15,0x00,0x3f,0x32,0x3f,0x39,0x2f,0x17,0x39,0x33,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x32,0x11,0x33,0x11,0x33,0x33,0x2f,0x33,0x39,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x01,0x23,0x01,0x23,0x11, +0xa6,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x02,0x00,0xe6,0xfe,0x3c,0x04,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5,0xfe,0x12,0xfd,0xee,0x01,0xec,0xfe,0x14,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x41,0x40,0x21,0x0a,0x0c,0x13,0x0c,0x13,0x0c,0x08,0x09,0x09,0x10, +0x0f,0x0f,0x1b,0x03,0x19,0x7e,0x00,0x13,0x12,0x0d,0x0c,0x0c,0x03,0x0a,0x17,0x12,0x05,0x08,0x01,0x03,0x10,0x00,0x12,0x00,0x3f,0x32,0x3f,0x33,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xe1,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01, +0x17,0x01,0x15,0x07,0x01,0x23,0x01,0x07,0x35,0x37,0x27,0x26,0x27,0x23,0x11,0xbc,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xa5,0x01,0x08,0xa8,0x01,0x8d,0xea,0xfe,0xec,0xcc,0x6e,0xb8,0x1e,0x08,0x04,0x05,0x9a,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0xbc,0x01,0x21,0xd5,0xb8,0xfe,0x3e,0x01,0x46,0xe1,0xd7,0x79, +0xdb,0x24,0x0e,0xfd,0x3e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x40,0x40,0x21,0x02,0x13,0x84,0x14,0x0e,0x08,0x0e,0x08,0x05,0x14,0x04,0x05,0x05,0x0c,0x0b,0x0f,0x0e,0x09,0x08,0x08,0x02,0x06,0x11,0x0e,0x05,0x04,0x0c,0x14,0x15,0x04,0x0f,0x00,0x00,0x00,0x3f,0x3f,0x3f,0x33,0x12,0x17,0x39,0x11, +0x33,0x11,0x33,0x01,0x2f,0x33,0x33,0x2f,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x32,0x31,0x30,0x13,0x33,0x11,0x33,0x01,0x33,0x01,0x17,0x37,0x15,0x07,0x01,0x23,0x27,0x07,0x35,0x37,0x27,0x23,0x11,0x23,0xa6,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x67,0xe6,0x88,0x01,0x3b,0xe6,0xc4,0x99,0x3e,0xa5,0x04,0xa4,0x05,0xec,0xfc, +0x3f,0x01,0xd5,0xfe,0x12,0x6b,0xee,0xc2,0x8d,0xfe,0xba,0xd4,0x9e,0xc2,0x40,0xb4,0xfe,0x14,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x21,0x00,0x54,0x40,0x2b,0x12,0x14,0x1b,0x14,0x1b,0x14,0x10,0x11,0x11,0x18,0x17,0x17,0x23,0x0b,0x07,0x21,0x7e,0x04,0x02,0x00,0x0a,0x02,0x92,0x07,0x03,0x15,0x14,0x1b,0x1a,0x1a, +0x1f,0x12,0x0b,0x14,0x05,0x03,0x03,0x10,0x05,0x03,0x18,0x00,0x12,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0x17,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11, +0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x17,0x01,0x15,0x07,0x01,0x23,0x01,0x07,0x35,0x37,0x27,0x26,0x27,0x23,0x11,0xbc,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xa5,0x01,0x08,0xa8,0x01,0x8d,0xea,0xfe,0xec,0xcc,0x6e,0xb8,0x1e,0x08,0x04,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x0b,0x18,0x0e,0x02, +0x71,0xfd,0x50,0xbc,0x01,0x21,0xd5,0xb8,0xfe,0x3e,0x01,0x46,0xe1,0xd7,0x79,0xdb,0x24,0x0e,0xfd,0x3e,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x1c,0x00,0x59,0x40,0x2e,0x0d,0x0f,0x16,0x0f,0x16,0x0f,0x0b,0x0c,0x0c,0x13,0x12,0x12,0x1e,0x09,0x05,0x1a,0x84,0x02,0x00,0x1b,0x10,0x0f,0x16,0x15,0x15,0x18,0x0d,0x09, +0x0f,0x05,0x0b,0x1b,0x08,0x00,0x96,0x05,0x01,0x01,0x03,0x13,0x1b,0x15,0x0b,0x0f,0x03,0x00,0x00,0x3f,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x35,0x33,0x35,0x33, +0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x17,0x37,0x15,0x07,0x01,0x23,0x27,0x07,0x35,0x37,0x27,0x23,0x11,0x23,0x11,0x27,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x67,0xe6,0x88,0x01,0x3b,0xe6,0xc4,0x99,0x3e,0xa5,0x04,0xa4,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5,0xfe,0x12,0x6b,0xee,0xc2, +0x8d,0xfe,0xba,0xd4,0x9e,0xc2,0x40,0xb4,0xfe,0x14,0x04,0xb2,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0x3b,0x05,0x9a,0x00,0x09,0x00,0x2a,0x40,0x16,0x01,0x7e,0x04,0x02,0x04,0x02,0x0b,0x08,0x7e,0x06,0x06,0x05,0x09,0x00,0x04,0x04,0x07,0x03,0x01,0x91,0x04,0x12,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f, +0x2f,0xe1,0x31,0x30,0x01,0x11,0x21,0x15,0x21,0x11,0x07,0x11,0x33,0x11,0x01,0xfc,0x02,0x3f,0xfd,0x18,0x97,0xa9,0x03,0x18,0xfd,0x80,0x98,0x02,0xa8,0x2f,0x03,0x21,0xfd,0x4d,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0xdc,0x05,0xed,0x00,0x07,0x00,0x2b,0x40,0x16,0x06,0x84,0x04,0x00,0x84,0x02,0x04,0x02,0x04,0x02,0x08,0x09,0x04,0x03, +0x07,0x00,0x04,0x02,0x05,0x00,0x02,0x15,0x00,0x3f,0x3f,0x12,0x17,0x39,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x11,0x23,0x11,0x07,0x11,0x33,0x11,0x01,0xdc,0xa4,0x92,0xa4,0x03,0x43,0xfc,0xbd,0x02,0xd5,0x2e,0x03,0x46,0xfd,0x26,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x0d, +0x00,0x2d,0x40,0x16,0x09,0x0c,0x09,0x0c,0x0f,0x0b,0x7e,0x02,0x00,0x0a,0x02,0x92,0x07,0x03,0x03,0x00,0x05,0x03,0x0b,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x15,0xbc,0xaa,0xaa, +0xa8,0xe8,0xe8,0x02,0x40,0x04,0x9c,0x85,0x79,0x79,0x85,0xfb,0xfc,0x98,0x00,0x01,0x00,0x1e,0x00,0x00,0x01,0xd2,0x05,0xec,0x00,0x0b,0x00,0x2c,0x40,0x15,0x09,0x09,0x07,0x0a,0x84,0x04,0x02,0x00,0x00,0x0c,0x0d,0x0a,0x02,0x96,0x07,0x03,0x03,0x05,0x00,0x00,0x15,0x00,0x3f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x01,0x39,0x2f, +0xc6,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0xa6,0x88,0x88,0xa4,0x88,0x88,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfb,0x4e,0x00,0x03,0x00,0x00,0xff,0xe8,0x06,0x08,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x3f,0x40,0x20,0x0a,0x0a,0x08,0x0b,0x7d,0x12,0x1f,0x1f,0x21,0x18, +0x19,0x7d,0x02,0x00,0x11,0x19,0x0b,0x11,0x91,0x18,0x08,0x02,0x02,0x05,0x1c,0x91,0x0e,0x13,0x15,0x91,0x05,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x11,0x35,0x33,0x12,0x00,0x21,0x20,0x00,0x13,0x33,0x15,0x23,0x02, +0x00,0x21,0x20,0x00,0x03,0x25,0x26,0x02,0x23,0x22,0x00,0x07,0x15,0x16,0x00,0x33,0x32,0x00,0x37,0x61,0x14,0x01,0x7a,0x01,0x27,0x01,0x1e,0x01,0x5d,0x17,0x60,0x62,0x16,0xfe,0x91,0xfe,0xdd,0xfe,0xdc,0xfe,0x9a,0x14,0x04,0x97,0x15,0xfe,0xda,0xd3,0xfe,0xee,0x14,0x14,0x01,0x0f,0xca,0xdf,0x01,0x05,0x15,0x02,0x7e,0x9b,0x01,0x2c, +0x01,0x6d,0xfe,0x9e,0xfe,0xc9,0x9b,0xfe,0xd0,0xfe,0x9a,0x01,0x69,0x01,0x2d,0x9b,0xf9,0x01,0x08,0xfe,0xea,0xeb,0x9b,0xe6,0xfe,0xe7,0x01,0x09,0xf6,0x00,0x00,0x03,0x00,0x00,0xff,0xe8,0x04,0xb0,0x04,0x18,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x3b,0x40,0x1e,0x08,0x08,0x07,0x0a,0x83,0x19,0x18,0x1f,0x12,0x83,0x01,0x00,0x10,0x12, +0x0a,0x11,0x95,0x1f,0x07,0x00,0x00,0x04,0x15,0x95,0x0d,0x16,0x1c,0x95,0x04,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x33,0xe1,0x32,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x11,0x33,0x36,0x24,0x33,0x32,0x16,0x17,0x33,0x15,0x23,0x06,0x00,0x23,0x22,0x00,0x27,0x23,0x21,0x16,0x16, +0x33,0x32,0x36,0x37,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x66,0x1e,0x01,0x10,0xd6,0xce,0xfd,0x16,0x65,0x62,0x10,0xfe,0xf2,0xde,0xdc,0xfe,0xf9,0x0e,0x61,0x01,0x0a,0x0c,0xb1,0x97,0x96,0xa5,0x0d,0x04,0x15,0xa3,0x8c,0x87,0xb0,0x19,0x02,0x5b,0xd0,0xed,0xec,0xd1,0x8b,0xe1,0xfe,0xf9,0x01,0x04,0xe4,0xa4,0xba,0xb2,0xac,0x8c,0x95, +0x9d,0xa0,0x92,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x06,0xcb,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x2c,0x00,0x44,0x40,0x25,0x00,0x2b,0x22,0x03,0x11,0x0b,0x7d,0x1b,0x06,0x7f,0x25,0x1b,0x25,0x1b,0x25,0x2e,0x21,0x7d,0x11,0x1e,0x91,0x14,0x04,0x22,0x92,0x09,0x09,0x03,0x18,0x91,0x0e,0x13,0x00,0x28,0x92,0x03,0x04,0x00,0x3f,0xed, +0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x11,0x17,0x39,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x17,0x15,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x15,0x25,0x36,0x36,0x35, +0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x04,0xda,0x26,0x7c,0x55,0x73,0x87,0xa0,0x83,0x02,0xfe,0x8e,0xfe,0xc6,0xfe,0xd0,0xfe,0x90,0x01,0x78,0x01,0x40,0x01,0x14,0xfc,0xe4,0x01,0x11,0xdf,0xef,0x01,0x0d,0xfe,0xfd,0xed,0xe8,0xfe,0xec,0x04,0x89,0x47,0x59,0x39,0x37,0x31,0x4e,0x19,0x4c,0x05,0x04,0x52,0x5c,0x9d,0x84,0x95,0xcd,0x11, +0x1f,0x20,0xfe,0xa8,0xfe,0x61,0x01,0x97,0x01,0x3d,0x01,0x59,0x01,0x9d,0xfc,0x1a,0xfe,0xb3,0x01,0x40,0x01,0x09,0x01,0x17,0x01,0x3b,0xfe,0xac,0xfb,0xd3,0x13,0x7e,0x57,0x4f,0x56,0x4a,0x42,0x71,0x00,0x03,0x00,0x60,0xff,0xe8,0x05,0x4b,0x04,0x18,0x00,0x13,0x00,0x1f,0x00,0x2a,0x00,0x45,0xb7,0x20,0x29,0x04,0x03,0x0d,0x84,0x19, +0x0a,0xb8,0x01,0x03,0x40,0x1b,0x23,0x19,0x23,0x19,0x23,0x2c,0x1f,0x83,0x13,0x20,0x96,0x0d,0x0d,0x07,0x16,0x95,0x10,0x16,0x04,0x26,0x96,0x07,0x0f,0x1c,0x95,0x02,0x10,0x00,0x3f,0xed,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x17,0x39,0x31,0x30,0x12,0x00,0x33, +0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x00,0x23,0x22,0x00,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x60,0x01,0x1b,0xef,0xc4,0x7a,0x22,0x61,0x3c,0x6a,0x7a,0x8e,0x6f,0x16,0xfe,0xef,0xd5,0xe3,0xfe,0xf1,0xa8,0xba,0x9c,0xa1, +0xa9,0xa8,0xa2,0x9f,0xb7,0x03,0x45,0x39,0x40,0x34,0x31,0x23,0x33,0x14,0x4a,0x02,0xef,0x01,0x29,0x68,0x2f,0x39,0x8d,0x79,0x79,0xb8,0x15,0xe0,0xfe,0xfc,0x01,0x24,0xe8,0xa9,0xd9,0xcf,0xbd,0xbf,0xd1,0xe1,0xb3,0x4c,0x19,0x67,0x45,0x40,0x55,0x29,0x1f,0x70,0x00,0x03,0x00,0x5e,0xff,0xe8,0x0a,0x47,0x05,0xb2,0x00,0x19,0x00,0x25, +0x00,0x31,0x00,0x3f,0x40,0x22,0x00,0x0d,0x25,0x7d,0x2b,0x2b,0x07,0x13,0x7d,0x1f,0x1f,0x33,0x31,0x7d,0x07,0x1c,0x91,0x16,0x13,0x22,0x91,0x10,0x04,0x0d,0x00,0x04,0x2e,0x91,0x0a,0x04,0x28,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x39, +0x39,0x31,0x30,0x01,0x0e,0x02,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x04,0x17,0x36,0x24,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x26,0x26,0x36,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x05,0x50,0x1e,0xb0,0xef,0x95,0xfe,0xcf,0xfe,0x91,0x01,0x77, +0x01,0x41,0xd1,0x01,0x2c,0x43,0x42,0x01,0x39,0xe2,0x01,0x28,0x01,0x6c,0xfe,0x8c,0xfe,0xc8,0x93,0xec,0xae,0x3d,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xfb,0x63,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0x01,0x4a,0x54,0xb2,0x5c,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xc5,0x9e,0x9a, +0xc9,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x5d,0xb1,0xcb,0xfe,0xbe,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0xfe,0xf6,0xfe,0xbe,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3f,0x40,0x22,0x00,0x0c, +0x23,0x83,0x29,0x29,0x06,0x12,0x83,0x1d,0x1d,0x31,0x2f,0x83,0x06,0x1a,0x95,0x15,0x16,0x20,0x95,0x0f,0x10,0x0c,0x00,0x03,0x2c,0x95,0x09,0x10,0x26,0x95,0x03,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x39,0x39,0x31,0x30,0x25,0x06,0x06,0x23,0x22, +0x00,0x35,0x10,0x00,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x26,0x36,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x04,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x03,0xf9,0x2d,0xdb,0x9f,0xe4,0xfe,0xf2,0x01,0x19,0xf1,0x92,0xd7,0x2e,0x27,0xe6,0xa4,0xe6,0x01,0x00,0xfe, +0xeb,0xe9,0x98,0xde,0x2c,0xbb,0x9b,0xa1,0xa9,0xa8,0xa2,0xa0,0xb6,0xfc,0xb8,0xba,0x9c,0xa1,0xa9,0xa8,0xa2,0xa0,0xb6,0xc9,0x60,0x81,0x01,0x1f,0xed,0x01,0x01,0x01,0x23,0x75,0x6b,0x5b,0x85,0xfe,0xe5,0xf9,0xf5,0xfe,0xd9,0x81,0xd9,0xd0,0xcf,0xbd,0xbf,0xd1,0xda,0xbb,0xb5,0xd2,0xcf,0xbd,0xbf,0xd1,0xda,0xba,0x00,0x02,0x00,0x19, +0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0x47,0x40,0x24,0x0f,0x7d,0x18,0x18,0x06,0x1c,0x14,0x05,0x03,0x03,0x01,0x05,0x7e,0x0a,0x08,0x06,0x00,0x91,0x14,0x04,0x08,0x92,0x09,0x01,0x09,0x14,0x09,0x14,0x09,0x06,0x13,0x91,0x0b,0x03,0x06,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32, +0x10,0xed,0x01,0x2f,0xc6,0x33,0xf9,0x32,0xc2,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x15,0x21,0x15,0x21,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x21,0x32,0x04,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0x01,0x0d,0xfe,0xf3,0xa8,0xa3,0xa3,0x01,0x8a,0xe1,0x01,0x02,0xfe,0xe8,0xf0,0xbd, +0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0x9d,0x85,0xfc,0xfc,0x85,0x04,0x19,0xe2,0xca,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x00,0x02,0x00,0x1e,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x19,0x00,0x26,0x00,0x49,0x40,0x27,0x0d,0x83,0x20,0x20,0x19,0x28,0x16,0x16,0x14,0x06,0x18,0x84,0x03,0x01,0x19,0x00,0x16,0x96, +0x03,0x15,0x15,0x10,0x19,0x1b,0x12,0x1d,0x95,0x2f,0x10,0x01,0x10,0x16,0x06,0x23,0x95,0x0a,0x10,0x04,0x0f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x5d,0xed,0x32,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xf9,0x32,0x32,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x13,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33, +0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x88,0x88,0xa4,0x04,0x3f,0xaf,0x74,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0x01,0x4b,0xfe,0xb5,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0xfe,0xdd,0x86,0x04,0x9d,0xb4,0x68, +0x64,0xfe,0xee,0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfe,0xcf,0x86,0xb4,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x05,0x31,0x05,0x9a,0x00,0x18,0x00,0x20,0x00,0x39,0x40,0x1d,0x15,0x7d,0x1e,0x1e,0x02,0x22,0x07,0x7e,0x0c,0x1a,0x01,0x7e,0x10,0x02,0x03,0x00,0x91,0x10,0x1a,0x09,0x1a,0x09, +0x02,0x19,0x91,0x11,0x03,0x02,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0xd4,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35, +0x10,0x21,0x02,0x6c,0xa8,0x5c,0x51,0x59,0x14,0x9e,0x16,0xca,0x9a,0x42,0x01,0x8a,0xe5,0xfe,0xfe,0xe8,0xf0,0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x02,0x1e,0x5c,0x4e,0x36,0x34,0x36,0x44,0x89,0xa9,0x02,0xe4,0xe3,0xc9,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x02,0x00,0x05,0xfe,0x29,0x05,0x46, +0x04,0x18,0x00,0x1d,0x00,0x28,0x00,0x39,0x40,0x1e,0x09,0x83,0x22,0x14,0x83,0x1a,0x1e,0x02,0x0e,0x84,0x00,0x0f,0x17,0x17,0x0d,0x0f,0x1b,0x00,0x1e,0x95,0x10,0x0d,0x15,0x03,0x25,0x95,0x06,0x10,0x01,0x0f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x3f,0x12,0x39,0x2f,0x01,0x2f,0x33,0xe9,0x32,0x32,0xd4,0xed,0x2f,0xe9,0x31, +0x30,0x25,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x21,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x3b,0x02,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x98,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfe,0xdd,0xfe,0xf1,0xd8,0xa4,0x39,0x64,0x6c,0x1c,0x94,0x07,0x0b,0xb1,0x99, +0xed,0xe4,0xc6,0xb8,0x9e,0x87,0x8d,0xb0,0x8a,0x03,0x76,0xb4,0xcc,0xfe,0xee,0xe8,0xff,0x00,0xfe,0xe2,0xfe,0x29,0x01,0xd7,0x52,0x52,0x32,0x3a,0x0e,0x4b,0x1d,0x89,0x9b,0xd1,0xc6,0xab,0xc2,0xc5,0x98,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x06,0x27,0x05,0xb2,0x00,0x23,0x00,0x2b,0x00,0x41,0x40,0x22,0x20,0x7d,0x29,0x29,0x02,0x2d, +0x15,0x7e,0x0e,0x08,0x08,0x2c,0x25,0x01,0x7e,0x1b,0x02,0x03,0x00,0x91,0x1b,0x25,0x25,0x01,0x24,0x91,0x1c,0x03,0x0b,0x91,0x12,0x04,0x01,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0x12,0x39,0x2f,0xc6,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22,0x26, +0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x16,0x16,0x33,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x03,0x62,0xa8,0x27,0xcd,0xb4,0x41,0x4e,0x20,0x3a,0x1f,0x28,0x42,0x28,0x7f,0x9f,0x27,0x5b,0x55,0x29,0x01,0x8a,0xe5,0xfe,0xfe,0xe8,0xf0, +0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x02,0x1e,0xb0,0xca,0xd3,0x4e,0x5b,0x0c,0x0a,0x9e,0x0b,0x0b,0x9c,0x7c,0xc4,0x83,0x6b,0x31,0x02,0xe3,0xe3,0xc9,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x00,0x02,0x00,0x05,0xfe,0x29,0x06,0x85,0x04,0x96,0x00,0x28,0x00,0x33,0x00,0x44,0x40,0x24,0x23,0x83, +0x2d,0x2d,0x00,0x35,0x15,0x84,0x0c,0x05,0x05,0x34,0x29,0x1d,0x28,0x84,0x1a,0x00,0x1d,0x30,0x95,0x20,0x10,0x09,0x95,0x11,0x1b,0x0f,0x29,0x1a,0x95,0x27,0x01,0x15,0x00,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0x32,0x12,0x39,0x2f,0xc6,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30, +0x01,0x11,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x16,0x33,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x21,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x02,0xd7,0x49,0xcd,0xb4,0x3e,0x43,0x23,0x41,0x23,0x28,0x1e, +0x31,0x20,0x83,0x92,0x29,0x5d,0x55,0x4b,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfe,0xdd,0xfe,0xf1,0xd8,0xe4,0xc6,0xb8,0x9e,0x87,0x8d,0xb0,0xfe,0x29,0x01,0xd7,0xb0,0xca,0x01,0xf3,0x4f,0x50,0x10,0x10,0x94,0x09,0x07,0x06,0x95,0x83,0xfe,0x2b,0x81,0x6c,0x32,0x03,0x76,0xb4,0xcc,0xfe,0xee,0xe8,0xff,0x00,0xfe,0xe2,0xfe,0x29,0x02,0x61, +0xd1,0xc6,0xab,0xc2,0xc5,0x98,0x00,0x02,0x00,0x5e,0xfe,0xd0,0x06,0x25,0x05,0xb2,0x00,0x18,0x00,0x24,0x00,0x4f,0x40,0x2a,0x02,0x7d,0x1e,0x0b,0x0a,0x07,0x10,0x05,0x1e,0x0e,0x1e,0x07,0x07,0x1e,0x0e,0x03,0x26,0x24,0x7d,0x15,0x21,0x91,0x18,0x04,0x0c,0x0f,0x09,0x06,0x04,0x0b,0x0b,0x0d,0x08,0x07,0x1b,0x91,0x0e,0x0d,0x10,0x05, +0x12,0x13,0x00,0x3f,0x33,0x33,0xc6,0x32,0xfd,0xc0,0x32,0x11,0x39,0x2f,0x17,0x39,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x10,0xc6,0x32,0x10,0xe9,0x31,0x30,0x00,0x00,0x11,0x14,0x02,0x07,0x17,0x25,0x15,0x07,0x17,0x21,0x27,0x05,0x35,0x37,0x27,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x00,0x00, +0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x04,0x3e,0x01,0x6c,0xa1,0x77,0x44,0x01,0x05,0x8d,0xd7,0xfe,0xcf,0x46,0xff,0x00,0x8a,0x52,0x6b,0x7d,0xfe,0xcf,0xfe,0x91,0x01,0x77,0x01,0x41,0xfd,0xf8,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0x05,0xb2,0xfe,0x70,0xfe,0xbd,0xeb,0xfe,0xbd,0x51,0x31,0xa6, +0xa3,0x59,0x9a,0x34,0xa3,0xa3,0x58,0x3e,0x21,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xfc,0x11,0xfe,0xbc,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x98,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x4f,0x40,0x2b,0x14,0x17,0x84,0x00,0x25,0x10,0x04,0x00,0x02,0x00,0x16,0x16, +0x00,0x02,0x03,0x27,0x1f,0x83,0x0b,0x12,0x0f,0x10,0x1c,0x95,0x0e,0x10,0x06,0x22,0x95,0x08,0x17,0x02,0x96,0x14,0x03,0x03,0x2f,0x08,0x01,0x08,0x16,0x00,0x1b,0x00,0x3f,0x3f,0x5d,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x33,0x10,0xe9,0x32,0x31, +0x30,0x01,0x35,0x21,0x35,0x21,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x33,0x15,0x23,0x15,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x03,0x6c,0xfe,0xb5,0x01,0x4b,0x04,0x6b,0xf3,0xc2,0xe8,0xff,0xd9,0xd2,0x5e,0x04,0xa4,0x88,0x88,0xa4,0xa7,0x7d,0x94,0xac,0xa4, +0x85,0x90,0xab,0xfe,0x29,0xb4,0x86,0x01,0x4d,0xc8,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfb,0x63,0x86,0xb4,0x04,0x39,0x7f,0xad,0xdc,0xc6,0xb0,0xca,0xc6,0x95,0x00,0x02,0x00,0x5e,0xfe,0x3c,0x07,0xa9,0x05,0xb2,0x00,0x23,0x00,0x2f,0x00,0x5a,0x40,0x31,0x00,0x01,0x0e,0x7d,0x29,0x1d,0x7e,0x16,0x03,0x11,0x29,0x01,0x29,0x19, +0x22,0x16,0x16,0x22,0x19,0x29,0x01,0x05,0x31,0x2f,0x7d,0x08,0x19,0x92,0x11,0x12,0x03,0x03,0x1a,0x1a,0x05,0x2c,0x91,0x0b,0x04,0x21,0x02,0x05,0x23,0x23,0x01,0x26,0x91,0x05,0x13,0x00,0x3f,0xed,0xc6,0x39,0x2f,0x12,0x39,0x39,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0xed,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x12, +0x39,0x39,0x10,0xe9,0x10,0xe9,0x11,0x33,0x31,0x30,0x01,0x23,0x01,0x27,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x02,0x07,0x17,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x37,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x17,0x21,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x04,0x43,0xaf,0x01,0x00,0xae, +0x6b,0x7d,0xfe,0xcf,0xfe,0x91,0x01,0x77,0x01,0x41,0x01,0x28,0x01,0x6c,0x8f,0x89,0x6e,0x01,0x38,0x64,0x6c,0x6d,0x85,0x01,0xc6,0xcc,0x59,0x8a,0xfe,0xaa,0xb5,0xfe,0xe7,0xfc,0x02,0x01,0x11,0xdf,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xfe,0x3c,0x01,0x4b,0x82,0x21,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xfe,0x70,0xfe, +0xbd,0xce,0xfe,0xac,0x5d,0x4f,0x01,0x93,0x81,0xb7,0x32,0x4c,0x4c,0x91,0x90,0x8e,0x3d,0xb4,0xb0,0xfe,0x49,0x82,0x02,0x83,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x02,0x00,0x60,0xfe,0x29,0x06,0x12,0x04,0x18,0x00,0x25,0x00,0x32,0x00,0x56,0x40,0x2e,0x00,0x01,0x32,0x23,0x84,0x24,0x10,0x02, +0x24,0x1d,0xef,0x16,0x01,0x09,0x24,0x19,0x16,0x16,0x19,0x24,0x03,0x34,0x2c,0x83,0x09,0x25,0x01,0x01,0x06,0x24,0x1b,0x19,0x95,0x1a,0x10,0x0e,0x29,0x95,0x0c,0x10,0x12,0x03,0x2f,0x95,0x06,0x16,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39, +0x10,0xed,0x11,0x33,0x33,0x10,0xe9,0x33,0x11,0x33,0x31,0x30,0x01,0x23,0x01,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x37,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x01,0x11,0x23,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x02, +0xcd,0xa5,0x01,0x44,0x04,0x6b,0xf3,0xc2,0xe8,0xff,0xd9,0xd2,0x5e,0x04,0xa4,0x9b,0x64,0x6c,0x71,0x81,0x01,0xc4,0xc4,0x52,0x43,0x4e,0xfe,0xe1,0xa4,0xa7,0x7d,0x94,0xac,0xa4,0x85,0x90,0xab,0xfe,0x4e,0x01,0x9f,0xc3,0xc8,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfc,0xbe,0xc7,0x81,0xb7,0x32,0x4f,0x50,0x8a,0x90,0x8e,0x40,0xa4, +0x58,0x65,0xfe,0x92,0xfe,0x3e,0xf0,0x03,0x49,0x7f,0xad,0xdc,0xc6,0xb0,0xca,0xc6,0x95,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0x13,0x05,0xb3,0x00,0x16,0x00,0x3d,0x40,0x1f,0x14,0x01,0x11,0x7d,0x04,0x16,0x15,0x01,0x04,0x15,0x15,0x04,0x01,0x03,0x18,0x0a,0x7e,0x0b,0x14,0x01,0x0a,0x01,0x0a,0x01,0x0e,0x16,0x12,0x07,0x91,0x0e, +0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x35,0x24,0x24,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x24,0x33,0x32,0x04,0x15,0x14,0x00,0x07,0x01,0x23,0x01,0x3c,0x01,0x0c,0x01,0x0a,0xa1,0x84,0x8f,0xb1,0x24,0xab, +0x24,0x01,0x1a,0xd4,0xd0,0x01,0x02,0xfe,0xeb,0xca,0x01,0xf0,0xd3,0x02,0x4c,0x3e,0x27,0xc6,0x94,0x7b,0x95,0x9b,0x8f,0xd2,0xf0,0xe7,0xc1,0xa8,0xfe,0xf9,0x2c,0xfd,0xd0,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x03,0x0b,0x04,0x18,0x00,0x16,0x00,0x3e,0x40,0x20,0x0b,0x0a,0x06,0x83,0x10,0x09,0x0c,0x0a,0x10,0x0c,0x0c,0x10,0x0a,0x03, +0x18,0x16,0x84,0x00,0x0c,0x09,0x96,0x0d,0x00,0x0d,0x00,0x03,0x0b,0x15,0x13,0x95,0x03,0x10,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x11,0x33,0x31,0x30,0x13,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x23,0x01,0x35,0x36,0x36,0x35,0x34, +0x26,0x23,0x22,0x06,0x07,0x0f,0x29,0xbb,0xa1,0x94,0xbe,0xab,0x93,0x01,0x63,0xd6,0xfe,0xaa,0x9d,0xc2,0x5e,0x4e,0x58,0x66,0x1f,0x02,0xcf,0xa1,0xa8,0xae,0x89,0x71,0xae,0x32,0xfe,0x70,0x01,0x9e,0x40,0x16,0x8c,0x61,0x4c,0x61,0x56,0x69,0x00,0x01,0x00,0x3d,0x00,0x00,0x04,0x53,0x05,0xb0,0x00,0x1e,0x00,0x4c,0x40,0x26,0x10,0x7e, +0x04,0x1a,0x1a,0x18,0x1c,0x7e,0x1d,0x15,0x1d,0x04,0x1d,0x04,0x1d,0x20,0x14,0x09,0x00,0x1b,0x1e,0x91,0x15,0x18,0x01,0x15,0x16,0x15,0x16,0x15,0x0d,0x1d,0x12,0x09,0x07,0x92,0x0d,0x04,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x01,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10, +0xf9,0x32,0xc2,0x2f,0x10,0xe9,0x31,0x30,0x13,0x35,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x3d,0xfe,0xa8,0x4e,0x3e,0x76,0x5f,0x3d,0x77,0x3d,0x80,0x95,0x5a,0x91,0xaf,0x01,0xf1,0xa8,0xcc,0xcc,0xa8,0x01,0x47,0x96,0x01, +0x05,0x01,0x29,0x7c,0x43,0x55,0x76,0xa4,0x39,0x2a,0x9e,0x8b,0x64,0xc5,0xc3,0xbe,0x01,0xfb,0xfe,0x05,0x96,0xfe,0xb9,0x01,0x47,0x00,0x00,0x01,0x00,0x0f,0xfe,0xe7,0x03,0xe0,0x04,0x18,0x00,0x1e,0x00,0x48,0x40,0x24,0x1b,0x84,0x0e,0x04,0x04,0x03,0x07,0x84,0x08,0x00,0x08,0x0e,0x08,0x0e,0x08,0x20,0x1e,0x14,0x0a,0x14,0x11,0x95, +0x18,0x01,0x01,0x09,0x18,0x10,0x0b,0x03,0x00,0x96,0x08,0x06,0x09,0x15,0x00,0x3f,0x33,0xcd,0xed,0x32,0x32,0x3f,0x12,0x39,0x2f,0x10,0xed,0x32,0x01,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xf9,0x32,0xc0,0x2f,0x10,0xe9,0x31,0x30,0x25,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x37,0x36,0x12,0x35,0x34, +0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x07,0x02,0x9d,0xa4,0x9f,0x9f,0xa4,0xfd,0x72,0x02,0xc9,0xca,0x46,0x42,0x36,0x6b,0x30,0x39,0x79,0x39,0x7d,0x91,0xb1,0xd6,0x84,0x01,0xe3,0xfe,0x1d,0x84,0xfe,0xe7,0x01,0x19,0x77,0xc4,0x01,0x44,0x7f,0x42,0x4e,0x36,0x36,0x93,0x34,0x2f,0x98,0x7b,0x7a,0xfe, +0xd1,0xd8,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xe6,0x05,0x9a,0x00,0x14,0x00,0x3a,0x40,0x1d,0x14,0x00,0x05,0x06,0x00,0x06,0x00,0x06,0x0f,0x10,0x10,0x16,0x03,0x02,0x04,0x07,0x01,0x13,0x0b,0x05,0x14,0x14,0x02,0x12,0x12,0x0f,0x05,0x02,0x03,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0x32,0x11,0x33,0x2f,0x33, +0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x37,0x13,0x01,0x33,0x13,0x13,0x33,0x01,0x17,0x16,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x03,0xb0,0xb1,0xfe,0xb1,0xbb,0xed,0xf3,0x93,0xfe,0xc2,0x58,0x0a,0x0e,0x05,0x04,0x07,0x1a,0x01,0x95,0xb5,0xfd,0xed,0xb9,0x6f,0x68,0x0f,0x01,0xee,0x03,0x9d,0xfd,0x5a,0x02, +0xa6,0xfc,0x8a,0xfb,0x1c,0x3f,0x24,0x3c,0x45,0x04,0x6f,0xfa,0x66,0x01,0x31,0xfe,0xde,0x00,0x00,0x01,0xff,0xe8,0xff,0x37,0x03,0xcb,0x04,0xd1,0x00,0x14,0x00,0x42,0x40,0x24,0x10,0x0f,0x06,0x03,0x01,0x13,0x04,0x07,0x12,0x05,0x05,0x02,0x0f,0x05,0x02,0x02,0x05,0x0f,0x03,0x16,0x14,0x00,0x04,0x07,0x01,0x0a,0x04,0x03,0x14,0x12, +0x15,0x06,0x0f,0x0f,0x03,0x0f,0x00,0x3f,0x3f,0xce,0x3f,0xce,0x12,0x17,0x39,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x33,0x32,0x11,0x33,0x30,0x31,0x07,0x01,0x03,0x33,0x13,0x13,0x33,0x01,0x17,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x03,0x18,0x01,0x09,0xe3,0xb4,0x88,0xff,0x87,0xfe, +0xb7,0x3f,0x1d,0x07,0x04,0x05,0x10,0x0b,0x01,0x10,0xad,0xfe,0x68,0xa1,0x62,0xc3,0xc9,0x02,0x71,0x02,0x58,0xfe,0x79,0x02,0x58,0xfc,0xfb,0xb4,0x53,0x3c,0x26,0x46,0x1f,0x02,0xec,0xfc,0x00,0x01,0x01,0xfe,0x36,0x00,0x00,0x01,0x00,0x1a,0xfe,0x1e,0x07,0x60,0x05,0x9a,0x00,0x2c,0x00,0x4e,0x40,0x27,0x18,0x17,0x1d,0x23,0x22,0x13, +0x0f,0x01,0x27,0x1d,0x19,0x13,0x27,0x00,0x09,0x09,0x19,0x2c,0x00,0x00,0x2e,0x1a,0x19,0x1d,0x27,0x13,0x03,0x18,0x2c,0x22,0x19,0x03,0x0f,0x18,0x12,0x0b,0x91,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x11,0x33,0x33,0x11,0x33, +0x33,0x11,0x33,0x33,0x31,0x30,0x01,0x01,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x07,0x60,0xfe,0x74,0x3c,0x75,0x9c,0x63,0x1d,0x31,0x1d,0x30,0x31,0x3b, +0x67,0x1f,0x3c,0xfe,0xc8,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x13,0x05,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x37,0x09,0x09,0x03,0x03,0x04,0x0a,0x0a,0x01,0x24,0x05,0x9a,0xfa,0x88,0xd5,0xca,0x65,0x05,0x08,0x9d,0x12,0x56,0x52,0xa2,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x05,0x9a, +0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xb0,0x20,0x4a,0x20,0x21,0x43,0x26,0x04,0x50,0x00,0x00,0x01,0x00,0x18,0xfe,0x1e,0x05,0xb0,0x04,0x00,0x00,0x2c,0x00,0x4b,0x40,0x25,0x18,0x17,0x1f,0x23,0x22,0x13,0x0f,0x27,0x1f,0x19,0x13,0x27,0x00,0x09,0x09,0x19,0x2c,0x00,0x00,0x2e,0x1a,0x19,0x27,0x1e,0x13,0x03,0x18,0x2c, +0x22,0x19,0x0f,0x0b,0x95,0x05,0x0f,0x18,0x15,0x00,0x3f,0x33,0xd4,0xed,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x11,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x31,0x30,0x01,0x01,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x03,0x26,0x26,0x27, +0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x33,0x34,0x36,0x37,0x13,0x05,0xb0,0xfe,0xb4,0x39,0x59,0x88,0x6a,0x1c,0x34,0x1b,0x34,0x2d,0x51,0x66,0x23,0x2d,0xdd,0x06,0x08,0x02,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x05,0x07,0x02,0x08,0x03,0x0f,0xec,0x96,0xd5, +0x05,0x06,0x02,0x06,0x06,0x08,0xd6,0x04,0x00,0xfb,0xb6,0xba,0x90,0x4e,0x05,0x08,0x93,0x12,0x5b,0x6f,0x8a,0x02,0xdd,0x15,0x30,0x1a,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc,0xfe,0x11,0x2e,0x1d,0x2d,0x31,0x03,0x00,0xfc,0xfc,0x13,0x2d,0x1c,0x13,0x2f,0x1a,0x03,0x04,0x00,0x00,0x01,0x00,0x55,0xfe,0x21,0x04,0x93,0x05,0xc2,0x00,0x2c, +0x00,0x53,0x40,0x19,0x0c,0x20,0x20,0x26,0x00,0x00,0x26,0x22,0x0b,0x0b,0x0f,0x7d,0x1c,0x1c,0x2e,0x16,0x06,0x7d,0x26,0x0b,0x22,0x91,0x09,0x21,0x1f,0xb8,0x01,0x05,0x40,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x12,0x03,0x91,0x29,0x16,0x19,0x91,0x12,0x1c,0x00,0x3f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed, +0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x32,0x11,0x39,0x2f,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x32,0x04,0x15,0x14,0x04,0x21,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32, +0x16,0x17,0x02,0x7e,0x1f,0x63,0x27,0x59,0x78,0x8e,0x84,0x01,0xf9,0xfe,0xad,0xd3,0x01,0x04,0xfe,0xc0,0xfe,0xfb,0x57,0xae,0x57,0x59,0xb1,0x58,0xb9,0xd8,0xc2,0xf0,0x68,0x01,0x4c,0xfe,0xd8,0xec,0xd9,0x9b,0x32,0x5b,0x29,0x05,0x00,0x10,0x1d,0x74,0x5b,0x74,0x7d,0x56,0xfe,0x65,0xe0,0xbe,0xcc,0xf1,0x20,0x2a,0xa2,0x32,0x22,0x9c, +0x8e,0x91,0x8e,0x37,0x01,0x9c,0xc9,0xc0,0x95,0xcf,0x0b,0x0c,0x00,0x01,0x00,0x3e,0xfe,0x21,0x04,0x0c,0x04,0xdd,0x00,0x2c,0x00,0x53,0x40,0x19,0x0c,0x20,0x20,0x26,0x00,0x00,0x26,0x22,0x0b,0x0b,0x0f,0x83,0x1c,0x1c,0x2e,0x16,0x06,0x83,0x26,0x0b,0x22,0x95,0x09,0x21,0x1f,0xb8,0x01,0x05,0x40,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x12, +0x03,0x96,0x29,0x16,0x19,0x95,0x12,0x1c,0x00,0x3f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0xc4,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x32,0x11,0x39,0x2f,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x04,0x23, +0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x02,0x00,0x26,0x4b,0x27,0x39,0x4a,0x5d,0x5e,0x01,0xec,0xfe,0xbe,0xd4,0xee,0xfe,0xc6,0xf1,0x53,0xa6,0x53,0x55,0xa8,0x54,0xab,0xd3,0xe0,0xcf,0x4f,0x01,0x42,0xfe,0xf9,0x9e,0xc5,0xa8,0x77,0x29, +0x51,0x29,0x04,0x33,0x14,0x10,0x46,0x39,0x4a,0x4e,0x53,0xfe,0x7e,0x11,0xd6,0xb6,0xc6,0xe7,0x1f,0x28,0xa2,0x34,0x2a,0x9c,0x8b,0x91,0x96,0x35,0x01,0x85,0xa0,0x84,0x70,0x95,0x0b,0x11,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x14,0x00,0x1c,0x00,0x56,0x40,0x16,0x11,0x7d,0x1a,0x16,0x0d,0x01,0x0b,0x0b,0x09,0x01, +0x7e,0x06,0x04,0x02,0x00,0x91,0x16,0x15,0x91,0x0d,0x0c,0x04,0xb8,0x01,0x05,0xb6,0x05,0x09,0x05,0x20,0x16,0x01,0x05,0xb8,0xff,0xc0,0x40,0x0c,0x09,0x0e,0x48,0x16,0x05,0x16,0x05,0x02,0x07,0x03,0x02,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x5d,0x11,0x33,0x10,0xfd,0x32,0xdc,0xed,0x10,0xed,0x01,0x2f,0xc6,0x33,0xf9, +0x32,0xc0,0x2f,0x11,0x33,0x33,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xaa,0xaa,0xa8,0xd4,0xd4,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xae,0xb7,0xfe,0xb0,0x01,0x3e,0xfe,0xc2,0x04, +0xee,0x67,0x45,0x45,0x67,0x36,0xe0,0xcc,0xcb,0xfe,0xfd,0x02,0xe3,0xfd,0xb4,0x9b,0x92,0x01,0x1f,0x00,0x00,0x02,0x00,0x27,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4f,0x40,0x2c,0x10,0x83,0x1f,0x08,0x1f,0x08,0x1f,0x27,0x0a,0x06,0x17,0x84,0x03,0x01,0x18,0x17,0x1b,0x15,0x1c,0x95,0x13,0x16,0x0a,0x22,0x95,0x0d, +0x09,0x01,0x96,0x06,0x02,0x02,0x04,0x00,0x0d,0x10,0x0d,0x20,0x0d,0x03,0x0d,0x10,0x04,0x00,0x00,0x3f,0x3f,0x5d,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x13,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36, +0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x79,0xe9,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x9a,0xcc,0xfe,0xee, +0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfd,0x95,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x14,0x00,0x1c,0x00,0x44,0x40,0x23,0x11,0x7d,0x1a,0x1a,0x06,0x1e,0x16,0x05,0x03,0x03,0x01,0x05,0x7e,0x0a,0x08,0x06,0x15,0x91,0x0d,0x0d,0x06,0x0b,0x03,0x16,0x91,0x00,0x01,0x0f, +0x09,0x01,0x09,0x04,0x08,0x06,0x12,0x00,0x3f,0xde,0x32,0xdd,0x5d,0x32,0xdc,0xed,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc6,0x33,0xf9,0x32,0xc2,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36, +0x35,0x10,0x21,0x01,0x64,0xd4,0xd4,0xa8,0xaa,0xaa,0xa8,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xae,0xb7,0xfe,0xb0,0x01,0x3e,0x55,0x67,0x82,0x82,0x67,0x04,0xb1,0xe2,0xe0,0xcc,0xcb,0xfe,0xfd,0x02,0xe3,0xfd,0xb4,0x9b,0x92,0x01,0x1f,0x00,0x02,0x00,0x27,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4b,0x40,0x28, +0x0c,0x1f,0x1f,0x18,0x27,0x19,0x17,0x15,0x15,0x13,0x06,0x17,0x03,0x01,0x18,0x17,0x1b,0x11,0x1c,0x95,0x0f,0x00,0x16,0x96,0x03,0x13,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0x16,0x06,0x22,0x95,0x09,0x10,0x04,0x00,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x5d,0xde,0x32,0xed,0x32,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xd1,0x32,0x32,0xc2,0x2f, +0x11,0x33,0x11,0x12,0x39,0x2f,0xc1,0x31,0x30,0x17,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x7f,0x7f,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0x01,0x54,0xfe, +0xac,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0xf8,0x86,0x06,0x5e,0xfd,0x60,0xcc,0xfe,0xee,0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfe,0xfa,0x86,0xdf,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x01,0x00,0xbc,0xfe,0x29,0x03,0xc7,0x05,0x9a,0x00,0x0b,0x00,0x23,0x40,0x10,0x09,0x0a,0x0a,0x0d,0x04,0x00,0x7e,0x01, +0x04,0x0b,0x01,0x09,0x02,0x03,0x01,0x1b,0x00,0x3f,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0xe9,0x32,0x11,0x33,0x2f,0x33,0x31,0x30,0x01,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x01,0x64,0xa8,0xa8,0x04,0x03,0x0e,0x0d,0x01,0x8c,0xb5,0xfd,0x9d,0xfe,0x29,0x07,0x71,0xfb,0xcb,0x12,0x31,0x1e,0x03,0xd4,0xfa,0x66,0x00, +0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0x28,0x04,0x00,0x00,0x0b,0x00,0x21,0x40,0x0f,0x08,0x09,0x09,0x0d,0x03,0x0a,0x84,0x00,0x0a,0x03,0x08,0x01,0x0f,0x00,0x1b,0x00,0x3f,0x3f,0x33,0x39,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x11,0xa6,0xa4,0x04,0x0a,0x2b, +0x14,0xe4,0xad,0xfe,0x22,0xfe,0x29,0x05,0xd7,0xfd,0x34,0x33,0x68,0x2f,0x02,0x02,0xfc,0x00,0xfe,0x29,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x5d,0x05,0xb2,0x00,0x29,0x00,0x41,0x40,0x22,0x1c,0x7d,0x0f,0x23,0x7d,0x06,0x1f,0x0f,0x0a,0x0f,0x06,0x06,0x0f,0x0a,0x03,0x2b,0x15,0x29,0x1f,0x0a,0x91,0x0b,0x0b,0x19,0x00,0x03,0x91,0x26, +0x13,0x15,0x12,0x91,0x19,0x04,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15, +0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x60,0x4b,0xa1,0x4b,0x80,0x99,0x9b,0x93,0x71,0x5a,0x7f,0x95,0x67,0x62,0x45,0x99,0x41,0x4b,0x93,0x4b,0xa9,0xc3,0x6d,0x6a,0x7c,0x8c,0xf8,0xcc,0x4e,0x9d,0x4e,0xd7,0x32,0x26,0x95,0x82,0x80,0x85,0x98,0x97,0x84,0x64,0x69,0x2d,0x30,0xa2,0x2b,0x27,0xc1,0xa0,0x7d, +0xa9,0x2d,0x08,0x16,0xbe,0x8c,0xc4,0xea,0x21,0x2c,0x00,0x01,0x00,0x1e,0xfe,0x23,0x02,0xe7,0x04,0x18,0x00,0x29,0x00,0x41,0x40,0x22,0x1c,0x84,0x0f,0x23,0x84,0x06,0x20,0x0f,0x0a,0x0f,0x06,0x06,0x0f,0x0a,0x03,0x2b,0x15,0x00,0x1f,0x0a,0x95,0x0b,0x0b,0x19,0x00,0x03,0x95,0x26,0x1c,0x15,0x12,0x95,0x19,0x10,0x00,0x3f,0xed,0x32, +0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x00,0x23, +0x22,0x26,0x27,0x21,0x23,0x6c,0x2b,0x97,0xd0,0x9c,0xba,0x46,0x52,0x78,0xa1,0x71,0x65,0x47,0x8f,0x47,0x48,0x94,0x48,0xaf,0xc6,0x72,0x51,0x80,0x73,0xfe,0xcf,0xdb,0x2a,0x66,0x2a,0xfe,0xcc,0x0f,0x11,0xc5,0x96,0x8b,0x85,0x89,0xa2,0x78,0x65,0x70,0x29,0x2b,0x98,0x25,0x20,0xb8,0xa6,0x5d,0xc0,0x2a,0x05,0x2c,0xbb,0x80,0xcd,0xfe, +0xe9,0x08,0x09,0x00,0x00,0x02,0x00,0x14,0xff,0xe8,0x03,0xba,0x05,0xb0,0x00,0x19,0x00,0x24,0x00,0x41,0x40,0x21,0x24,0x0e,0x7e,0x00,0x03,0x00,0x0a,0x7d,0x1d,0x00,0x1d,0x00,0x1d,0x26,0x01,0x15,0x15,0x17,0x91,0x12,0x0e,0x00,0x91,0x24,0x02,0x02,0x07,0x12,0x13,0x20,0x91,0x07,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed, +0x32,0x10,0xed,0x32,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9,0x32,0x31,0x30,0x01,0x21,0x35,0x21,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x01,0x83,0xfe,0xe2,0x01,0x1e, +0x95,0x86,0x7d,0x9f,0xb9,0x86,0x50,0xd1,0xbc,0x54,0x36,0x36,0x56,0xe3,0xf9,0x49,0x45,0x31,0x36,0x41,0x37,0x03,0x70,0x97,0x81,0x8c,0x9c,0x99,0x7c,0x80,0xab,0xfe,0x92,0xf8,0xfe,0xde,0x18,0xa6,0x27,0x01,0x81,0x02,0x07,0x53,0x41,0x36,0x4a,0x50,0x43,0x81,0x00,0x02,0xff,0x76,0xfe,0x1e,0x03,0x15,0x06,0x02,0x00,0x19,0x00,0x24, +0x00,0x41,0x40,0x21,0x24,0x0e,0x84,0x00,0x03,0x00,0x0a,0x83,0x1d,0x00,0x1d,0x00,0x1d,0x26,0x01,0x15,0x15,0x17,0x95,0x12,0x0e,0x00,0x95,0x24,0x02,0x02,0x07,0x12,0x1c,0x20,0x95,0x07,0x00,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9, +0x32,0x31,0x30,0x13,0x23,0x35,0x37,0x35,0x34,0x36,0x37,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0xe2,0xd8,0xd8,0x91,0x8a,0x7d,0x9b,0xae,0x83,0x5e,0xcc,0xbc,0x45,0x43,0x49,0x43,0xe0,0xf9,0x43,0x4f,0x3d,0x33,0x3c,0x3b, +0x03,0xc6,0x8c,0x01,0x87,0x89,0x9e,0x01,0x98,0x7a,0x82,0xa8,0xfc,0x65,0xfd,0xfe,0xf0,0x20,0x99,0x2d,0x01,0x66,0x04,0x42,0x57,0x47,0x3d,0x4b,0x54,0x4a,0x88,0x00,0x00,0x01,0x00,0x38,0xff,0xe8,0x03,0xca,0x05,0xb2,0x00,0x25,0x00,0x37,0x40,0x1c,0x15,0x7d,0x22,0x08,0x22,0x08,0x22,0x27,0x1c,0x02,0x7e,0x0f,0x1c,0x1f,0x91,0x18, +0x08,0x05,0x91,0x0c,0x0c,0x12,0x18,0x13,0x25,0x91,0x12,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x00,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x22,0x26, +0x27,0x35,0x16,0x16,0x33,0x32,0x12,0x11,0x10,0x26,0x23,0x01,0x7c,0x9b,0x8b,0x7c,0x3a,0x6e,0x36,0x35,0x6d,0x3d,0xc1,0xee,0xf8,0xcd,0xde,0xef,0xfe,0xc0,0xfe,0xe7,0x3c,0x77,0x3c,0x39,0x81,0x39,0xcf,0xd6,0x8f,0x90,0x05,0x1c,0xae,0x8d,0x90,0xaf,0x28,0x2b,0xa2,0x23,0x24,0xfc,0xc7,0xd7,0x01,0x0c,0xfe,0x9f,0xfe,0xbe,0xfe,0x87, +0xfe,0x52,0x18,0x16,0xa5,0x1d,0x20,0x01,0x4c,0x01,0x45,0x01,0x10,0xfd,0x00,0x01,0x00,0x43,0xfe,0x4e,0x03,0xce,0x04,0x18,0x00,0x25,0x00,0x34,0x40,0x1a,0x15,0x83,0x22,0x08,0x22,0x08,0x22,0x27,0x1c,0x02,0x84,0x0f,0x08,0x05,0x95,0x0c,0x0c,0x12,0x1c,0x1f,0x95,0x18,0x25,0x95,0x12,0x0f,0x00,0x3f,0xed,0x2f,0xed,0x32,0x11,0x39, +0x2f,0xed,0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x00,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x01,0x83,0x9c,0x8e,0x7b,0x39,0x6d,0x37,0x36,0x71, +0x37,0xc0,0xec,0xf5,0xcd,0xdd,0xec,0xfe,0xc8,0xfe,0xe2,0x3c,0x76,0x3c,0x39,0x82,0x38,0xd4,0xd5,0x91,0x92,0x03,0x8e,0xb6,0x8e,0x96,0xb2,0x24,0x2b,0x98,0x23,0x1e,0xfb,0xc5,0xd6,0x01,0x0a,0xfe,0xa2,0xfe,0xbb,0xfe,0x8a,0xfe,0x4f,0x16,0x14,0x9d,0x1d,0x20,0x01,0x55,0x01,0x49,0x01,0x18,0x01,0x00,0x00,0x01,0x00,0x28,0x02,0x89, +0x02,0x39,0x05,0xaa,0x00,0x24,0x00,0x44,0xb3,0x00,0x00,0x05,0x0b,0xb8,0x01,0x04,0xb3,0x18,0x18,0x26,0x1e,0xb8,0x01,0x04,0xb3,0x12,0x05,0x12,0x15,0xb8,0x01,0x05,0xb2,0x0e,0x24,0x21,0xb8,0x01,0x05,0xb4,0x02,0x02,0x08,0x0e,0x1b,0xb8,0x01,0x05,0xb1,0x08,0x04,0x00,0x3f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x01, +0x2f,0xc4,0xe9,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x01,0x7a,0x2b,0x32,0x77,0x7e,0x8f,0x71,0x83,0x8e,0xa9,0x9c,0x29,0x4b,0x26, +0x28,0x4b,0x28,0x5f,0x62,0x49,0x45,0x3a,0x47,0x38,0x3f,0x18,0x31,0x13,0x03,0xbb,0x11,0x83,0x72,0x74,0x97,0xbf,0xad,0xc5,0xf0,0x0f,0x0e,0x78,0x14,0x11,0xa3,0xa1,0x86,0x77,0x55,0x42,0x3f,0x52,0x0c,0x0e,0x00,0x02,0x00,0x60,0xff,0x43,0x05,0x60,0x05,0xec,0x00,0x1a,0x00,0x27,0x00,0x4e,0x40,0x2a,0x27,0x19,0x84,0x15,0x09,0x06, +0x07,0x00,0x01,0x09,0x07,0x01,0x03,0x03,0x01,0x07,0x09,0x04,0x29,0x21,0x83,0x10,0x17,0x00,0x15,0x1e,0x95,0x13,0x10,0x0a,0x24,0x95,0x07,0x0d,0x16,0x02,0x00,0x19,0x95,0x05,0x09,0x15,0x00,0x3f,0x33,0xfd,0xc6,0x33,0x3f,0xc6,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33, +0x11,0x33,0xe9,0x33,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x33,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x04,0xbc,0x8e,0x59,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0x04,0x72,0xee,0xc0,0xe8,0xff,0xd6,0xd3, +0x60,0x04,0xa4,0x53,0xf7,0xa6,0x7c,0x97,0xab,0xa3,0x8d,0x88,0xac,0x01,0x44,0xba,0x8a,0xbd,0xbd,0xae,0xc6,0x01,0x11,0xef,0xfc,0x01,0x34,0xa6,0x02,0x7a,0xfa,0x9e,0x01,0xdc,0x7e,0xaa,0xdd,0xc1,0xb1,0xcd,0xc6,0x97,0x00,0x01,0x00,0xa6,0xff,0x43,0x02,0x9a,0x05,0xec,0x00,0x0d,0x00,0x30,0x40,0x17,0x0b,0x0c,0x05,0x06,0x0c,0x06, +0x00,0x08,0x08,0x0f,0x03,0x84,0x00,0x01,0x00,0x07,0x05,0x03,0x95,0x0c,0x0a,0x00,0x15,0x00,0x3f,0x32,0xc6,0xfd,0xc6,0x33,0x3f,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0xa6,0xa4,0x53,0x57,0x8e,0x57,0x6f,0xb1,0x59,0x8e, +0x59,0x05,0xec,0xfa,0x9e,0xba,0xba,0x8a,0xbd,0xbd,0x00,0x01,0x00,0xa6,0xff,0x43,0x07,0xa4,0x04,0x18,0x00,0x29,0x00,0x5d,0x40,0x32,0x1d,0x19,0x84,0x1a,0x23,0x11,0x84,0x12,0x28,0x84,0x09,0x06,0x07,0x00,0x01,0x12,0x09,0x07,0x01,0x03,0x03,0x01,0x07,0x09,0x12,0x05,0x04,0x1a,0x04,0x23,0x1d,0x0d,0x15,0x95,0x25,0x20,0x10,0x1b, +0x0f,0x12,0x19,0x15,0x02,0x00,0x28,0x95,0x07,0x05,0x09,0x15,0x00,0x3f,0x33,0xc6,0xfd,0xc6,0x33,0x3f,0x33,0x3f,0x3f,0x33,0xed,0x32,0x32,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xe9,0x10,0xe9,0x39,0x10,0xe9,0x32,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x11, +0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x11,0x33,0x06,0xfe,0x8e,0x57,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0x68,0x7d,0x69,0x93,0xa4,0xe9,0x6a,0x8e,0xa4,0xa4,0x04,0x6d,0xd1,0x68,0x9e,0x1c,0x72,0xe2,0x01,0x52,0x53,0x01,0x44, +0xba,0x8a,0xbd,0xbd,0x02,0x4c,0xa7,0x9b,0xbe,0x88,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb3,0x93,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x76,0x5e,0xd4,0xfe,0x5f,0xfe,0x13,0x00,0x00,0x01,0x00,0xa6,0xff,0x43,0x05,0x48,0x04,0x18,0x00,0x1c,0x00,0x45,0x40,0x25,0x14,0x10,0x84,0x11,0x1b,0x84,0x06,0x07,0x00,0x01,0x09,0x07,0x01,0x03,0x03,0x01, +0x07,0x09,0x04,0x04,0x11,0x04,0x15,0x0c,0x95,0x17,0x10,0x12,0x0f,0x11,0x15,0x00,0x1b,0x95,0x07,0x09,0x15,0x00,0x3f,0xc6,0xfd,0xc6,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x10,0xe9,0x32,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x11,0x10,0x23, +0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x04,0xa5,0x8e,0x5a,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x53,0x01,0x46,0xbc,0x8a,0xbd,0xbd,0x02,0x48,0x01,0x46,0xb8,0x8e,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfe,0x18,0x00,0x00,0x01,0x00,0xa6, +0x00,0x00,0x02,0xbc,0x04,0x91,0x00,0x17,0x00,0x3a,0x40,0x1e,0x09,0x0a,0x00,0x01,0x0a,0x01,0x06,0x06,0x01,0x0a,0x03,0x19,0x12,0x0f,0x84,0x10,0x11,0x0f,0x10,0x15,0x14,0x0b,0x09,0x08,0xec,0x17,0x00,0x96,0x02,0x10,0x00,0x3f,0xed,0x33,0xfd,0xcd,0x33,0x33,0x3f,0x3f,0x01,0x2f,0xe9,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33, +0x11,0x33,0x31,0x30,0x01,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x07,0x23,0x37,0x06,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x37,0x02,0x26,0x7a,0x23,0x14,0x1e,0x0d,0x26,0x42,0x3a,0x7a,0x31,0x3a,0x4d,0xa4,0xa4,0x04,0x1a,0x5b,0x3b,0x04,0x91,0x80,0x02,0x06,0x05,0xaa,0x1d,0x03,0xd7,0xb7,0x26,0xa8,0x82,0xfd,0xf6, +0x04,0x00,0xd3,0x4f,0x6c,0x18,0x00,0x02,0x00,0xa6,0xff,0x43,0x04,0xa2,0x04,0x01,0x00,0x1e,0x00,0x27,0x00,0x53,0x40,0x2c,0x0f,0x06,0x0c,0x83,0x1c,0x1d,0x16,0x17,0x17,0x14,0x1d,0x00,0x04,0x19,0x24,0x19,0x24,0x19,0x07,0x1a,0x20,0x06,0x84,0x07,0x0f,0x20,0x96,0x05,0x05,0x06,0x1f,0x96,0x08,0x0f,0x06,0x15,0x18,0x16,0x14,0x95, +0x1d,0x1b,0x00,0x15,0x00,0x3f,0x32,0xc6,0xfd,0xc6,0x33,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xe9,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0xed,0x11,0x39,0x31,0x30,0x21,0x03,0x26,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x17,0x33,0x37, +0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x02,0xe5,0x98,0x2e,0x40,0x4e,0x47,0xa4,0x01,0x36,0xce,0xb2,0x90,0x67,0x1f,0x3b,0x2a,0x69,0x53,0x4f,0x8e,0x4f,0x6f,0xb1,0x59,0x8e,0x59,0xfd,0xe7,0x78,0x72,0x80,0x67,0x73,0x01,0x1b,0x54,0x34,0xfe,0x5d,0x04,0x01,0x8b,0x94,0x5f,0x97,0x0c, +0x03,0x09,0x3d,0x4d,0xc0,0xa7,0xa7,0x8a,0xbd,0xbd,0x03,0x7e,0xfe,0xab,0x5f,0x5a,0x4f,0x4d,0x00,0x02,0x00,0x2b,0xff,0xea,0x05,0x12,0x05,0xb1,0x00,0x21,0x00,0x2c,0x00,0x4d,0x40,0x28,0x1c,0xef,0x25,0x09,0x25,0x09,0x25,0x2e,0x14,0x03,0x84,0x11,0x0f,0x0d,0x2c,0x21,0x84,0x15,0x00,0x28,0x96,0x19,0x20,0x02,0x0e,0x95,0x11,0x2c, +0x14,0x11,0x13,0x13,0x11,0x0f,0x06,0x95,0x0b,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x33,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0xd4,0xed,0x01,0x2f,0x33,0xe9,0x32,0x2f,0xc6,0x33,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35, +0x33,0x35,0x37,0x11,0x21,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x02,0xf2,0xfe,0x8d,0x46,0x51,0x3f,0x2c,0x3b,0x5e,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x73,0x8c,0x8a,0x83,0x87,0xa7,0xa0,0x35,0x36,0x4f,0x5d,0x37,0x39,0x39,0x37,0x03,0x74,0xfd,0xbf,0x67, +0x58,0x22,0x8c,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x6e,0xa9,0x9a,0x96,0x82,0x8d,0x98,0xfc,0x8c,0x04,0x00,0x4b,0x4f,0x49,0x48,0x52,0x6e,0x6b,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x03,0x5b,0x05,0xb2,0x00,0x22,0x00,0x2e,0x00,0x4c,0x40,0x28,0x1f,0x10,0x22,0x0d,0x7e,0x26,0x03,0x23,0x00,0x26,0x13,0x7e,0x1c,0x26, +0x1c,0x26,0x1c,0x30,0x22,0x00,0x2c,0x7e,0x18,0x07,0x1f,0x03,0x10,0x23,0x04,0x22,0x22,0x0a,0x18,0x91,0x16,0x12,0x29,0x91,0x0a,0x03,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0xc6,0xe9,0xc6,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x12,0x39,0x39,0x10,0xe9,0x11,0x39,0x39,0x31,0x30,0x13,0x36,0x12,0x37, +0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x21,0x35,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x07,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x95,0x4d,0x8d,0x3c,0x10,0x93,0x4c,0x98,0x6f,0x73,0x88,0x31,0x22,0x84,0x6c,0xe5,0xc4,0xfe,0x3a,0x01,0xd1, +0x69,0x89,0x42,0x48,0x3d,0x87,0x4b,0xcf,0x15,0x18,0x2c,0x29,0x29,0x31,0x49,0x01,0x3a,0x80,0x01,0x04,0x80,0x0e,0x82,0x97,0x4f,0x6b,0x93,0x92,0x79,0x4b,0xa5,0x59,0x84,0xd8,0x73,0xba,0xd5,0x97,0x89,0x6d,0x54,0x9e,0x4e,0x7e,0xed,0x7b,0x02,0xf5,0x38,0x5d,0x38,0x36,0x3b,0x3c,0x29,0x39,0x69,0x00,0x00,0x02,0x00,0x0f,0xff,0xe8, +0x05,0xaa,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x28,0x40,0x14,0x05,0x7d,0x0e,0x0b,0x14,0x14,0x1c,0x1a,0x7d,0x00,0x0b,0x11,0x91,0x08,0x13,0x17,0x0e,0x91,0x01,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x01,0x2f,0xc6,0xe9,0x12,0x39,0x2f,0x12,0x39,0xe9,0x31,0x30,0x13,0x35,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12, +0x37,0x02,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x15,0x0f,0x03,0x07,0x01,0x25,0x01,0x6f,0xfe,0x8c,0xfe,0xc8,0xfe,0xd4,0xfe,0x8c,0x99,0x74,0x5d,0x01,0x11,0xdf,0xe9,0x01,0x13,0xfe,0xfc,0xec,0xe1,0xfe,0xe5,0x05,0x02,0x98,0xfe,0x6d,0xfe,0xcc,0xfe,0xb0,0xfe,0x65,0x01,0x8d,0x01,0x3b,0xe1,0x01,0x2a,0x47,0xfc,0xc1, +0xfe,0xbc,0x01,0x34,0x01,0x09,0x01,0x10,0x01,0x36,0xfe,0xb9,0xfc,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x18,0x05,0xe9,0x00,0x13,0x00,0x1e,0x00,0x2f,0x40,0x18,0x09,0x0c,0x10,0x83,0x19,0x19,0x20,0x0d,0x0c,0x1e,0x83,0x02,0x08,0x05,0x16,0x95,0x13,0x16,0x0d,0x00,0x1b,0x95,0x05,0x10,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39, +0x01,0x2f,0xe9,0xc4,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x31,0x30,0x04,0x02,0x35,0x34,0x00,0x33,0x32,0x16,0x17,0x37,0x26,0x00,0x27,0x33,0x04,0x00,0x11,0x14,0x00,0x23,0x00,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x01,0x5c,0xfc,0x01,0x09,0xde,0x33,0x5e,0x1f,0x03,0x4f,0xfe,0xea,0xbc,0xfa,0x01,0x20,0x01,0x25,0xfe, +0xfa,0xd4,0xfe,0xca,0xa9,0x91,0x8a,0xa4,0xfe,0xd6,0x96,0xa8,0x18,0x01,0x1c,0xf6,0xf0,0x01,0x2e,0x1e,0x1d,0x02,0x77,0x01,0x06,0x8d,0xdb,0xfe,0x07,0xfe,0xf1,0xef,0xfe,0xd1,0x01,0x61,0xd7,0xdf,0xad,0x01,0x90,0xdc,0xb8,0x00,0x00,0x01,0x00,0xbc,0xfe,0x29,0x02,0xf4,0x05,0xac,0x00,0x15,0x00,0x2b,0x40,0x16,0x07,0x00,0x00,0x17, +0x0d,0x06,0x09,0x83,0x0b,0x0e,0x02,0xf4,0x12,0x01,0x0c,0x00,0x0a,0x1b,0x06,0xec,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x02,0xf4,0x2f,0x57,0x78, +0x92,0x01,0x77,0xfe,0x89,0xa8,0xa8,0x04,0x26,0x9b,0x61,0x23,0x34,0x13,0x04,0xea,0x21,0xd1,0xc8,0xfd,0x25,0x97,0xfe,0x29,0x07,0x71,0xd3,0x6b,0x7a,0x07,0x07,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x14,0x00,0x2b,0x40,0x16,0x07,0x00,0x00,0x16,0x0d,0x06,0x09,0x84,0x0b,0x0e,0x02,0xec,0x12,0x10,0x0c,0x0f, +0x0a,0x1b,0x06,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2c,0x50,0x6a,0x8c,0x01,0x56,0xfe,0xaa,0xa4,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24, +0x03,0x5a,0x21,0xc5,0xac,0xfe,0x80,0x8a,0xfe,0x29,0x05,0xd7,0xd3,0x6e,0x77,0x0e,0x00,0x02,0x00,0x5a,0xff,0xe8,0x04,0x49,0x05,0x9a,0x00,0x1a,0x00,0x2b,0x00,0x4d,0x40,0x28,0x07,0x7d,0x18,0x0b,0x7d,0x1d,0x00,0x04,0x15,0x25,0x1d,0x18,0x1d,0x04,0x04,0x1d,0x18,0x03,0x2d,0x28,0x7d,0x01,0x12,0x18,0x07,0x25,0x07,0x02,0x15,0x15, +0x02,0x2b,0x91,0x0f,0x13,0x04,0x00,0x91,0x02,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0x12,0x39,0xcd,0x11,0x33,0x01,0x2f,0xc4,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x11,0x33,0x10,0xe9,0x10,0xe9,0x31,0x30,0x01,0x21,0x35,0x21,0x15,0x06,0x06,0x15,0x14,0x04,0x16,0x15,0x15,0x06,0x04,0x23,0x22,0x24,0x35, +0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x12,0x36,0x35,0x34,0x26,0x2f,0x02,0x26,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x02,0x82,0xfe,0x27,0x03,0x4b,0x95,0xeb,0x01,0x31,0xa4,0x06,0xfe,0xe8,0xe5,0xdb,0xfe,0xef,0xc0,0xda,0x19,0x17,0x69,0xb6,0xb6,0x55,0x39,0x4b,0x3c,0x0e,0x19,0x0e,0xbe,0x87,0xa9,0x96,0x05,0x04,0x96,0x85, +0x1a,0x90,0x52,0x52,0xce,0xcb,0x81,0x07,0xd0,0xee,0xed,0xc3,0x9d,0xee,0x61,0x21,0x53,0x23,0x46,0x7f,0xfb,0x9f,0xa1,0x8c,0x40,0x76,0x2d,0x3a,0x2d,0x0a,0x14,0x0c,0x5a,0xae,0x76,0x88,0x9b,0x00,0x00,0x02,0x00,0x59,0x00,0x00,0x04,0x48,0x05,0xb2,0x00,0x1d,0x00,0x2d,0x00,0x45,0x40,0x24,0x1b,0x7d,0x07,0x15,0x7d,0x2a,0x00,0x0f, +0x07,0x2a,0x01,0x01,0x2a,0x07,0x03,0x2f,0x20,0x7d,0x04,0x0f,0x27,0x1b,0x07,0x07,0x18,0x18,0x03,0x2d,0x91,0x12,0x04,0x04,0x00,0x91,0x03,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x39,0x11,0x33,0xcd,0x01,0x2f,0xc4,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x25,0x21,0x15,0x21,0x35, +0x36,0x24,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x35,0x36,0x24,0x33,0x32,0x04,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x02,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x02,0x20,0x01,0xd9,0xfc,0xb5,0x7b,0x01,0x05,0x45,0x47,0x46,0x8f,0x74,0x06,0x01,0x17,0xe6,0xdb,0x01,0x11,0xc9,0xd1, +0x19,0x17,0x69,0xb6,0xb6,0x60,0x9a,0x1c,0x0d,0x19,0x0e,0xbe,0x87,0xa9,0x96,0x96,0x96,0x85,0x12,0x93,0x57,0x2a,0x53,0x33,0x32,0x6a,0xb5,0x65,0x0d,0xcf,0xef,0xed,0xc3,0xa1,0xf0,0x5b,0x21,0x53,0x23,0x46,0x7f,0x04,0x61,0xa1,0x8c,0x41,0x85,0x6f,0x15,0x0a,0x14,0x0c,0x5a,0xae,0x76,0x88,0x9b,0x00,0x00,0x02,0x00,0x60,0xfe,0x39, +0x04,0x3f,0x04,0x18,0x00,0x19,0x00,0x27,0x00,0x48,0x40,0x25,0x21,0x14,0x1c,0x17,0x84,0x07,0x11,0x83,0x24,0x00,0x0b,0x07,0x01,0x24,0x07,0x24,0x07,0x24,0x29,0x1c,0x83,0x04,0x0b,0x21,0x96,0x14,0x14,0x02,0x27,0x95,0x0e,0x10,0x04,0x00,0x95,0x02,0x1b,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xe9,0x12, +0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xe9,0x10,0xe9,0x11,0x39,0x39,0x31,0x30,0x01,0x21,0x15,0x21,0x35,0x36,0x36,0x35,0x34,0x24,0x26,0x35,0x34,0x24,0x33,0x32,0x04,0x15,0x14,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x02,0x06,0x15,0x14,0x16,0x1f,0x02,0x36,0x36,0x35,0x34,0x26,0x23,0x02,0x08,0x01,0xc0,0xfc,0xd3,0xd5, +0xb0,0xfe,0xc2,0x82,0x01,0x1a,0xef,0xca,0x01,0x0c,0xd8,0xc6,0x14,0x11,0x6a,0x96,0xbe,0x5c,0x60,0x6a,0x1b,0xa7,0xa7,0xaa,0x8a,0xfe,0xc5,0x8c,0x47,0x61,0x97,0x4e,0x5b,0xd6,0xd0,0x86,0xd5,0xf6,0xef,0xc9,0xb2,0xfe,0xf7,0x5c,0x21,0x41,0x21,0x4d,0x8e,0x04,0xa2,0xa7,0x95,0x68,0x7f,0x4d,0x54,0x18,0x52,0xc8,0x95,0x8c,0xa1,0x00, +0x00,0x01,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x00,0x05,0x00,0x1a,0x40,0x0c,0x02,0x7e,0x03,0x03,0x07,0x05,0x03,0x12,0x05,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x12,0x39,0x2f,0xe9,0x31,0x30,0x13,0x21,0x11,0x23,0x11,0x21,0x20,0x02,0xe8,0xa8,0xfd,0xc0,0x05,0x9a,0xfa,0x66,0x05,0x02,0x00,0x01,0x00,0xa6,0x00,0x00, +0x01,0x4a,0x05,0xec,0x00,0x03,0x00,0x17,0x40,0x0a,0x00,0x84,0x01,0x01,0x04,0x05,0x02,0x00,0x01,0x15,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xe9,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x4a,0xa4,0xa4,0x05,0xec,0x00,0x00,0x01,0x00,0xbc,0xfe,0x29,0x05,0xfc,0x05,0xb2,0x00,0x1e,0x00,0x2e,0x40,0x18,0x00,0x7e,0x0d,0x06,0x0d,0x06, +0x20,0x17,0x14,0x7e,0x15,0x19,0x10,0x91,0x1b,0x04,0x17,0x03,0x14,0x1b,0x03,0x91,0x0a,0x13,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x21,0x22,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33, +0x12,0x21,0x32,0x12,0x11,0x05,0x27,0x34,0x31,0x20,0x36,0x1a,0x18,0x44,0x1f,0x7e,0x84,0xfe,0x9f,0xc1,0xf9,0xa8,0xa8,0x06,0x9d,0x01,0x3f,0xe8,0xf9,0x01,0x21,0x5b,0x48,0x0e,0x0e,0x9e,0x0b,0x09,0x91,0x7f,0x02,0x3d,0x01,0xe5,0xfe,0xe5,0xd4,0xfa,0xfe,0x07,0x71,0xfe,0xfa,0x01,0x1e,0xfe,0xcd,0xfe,0xe3,0x00,0x00,0x01,0x00,0xa6, +0xfe,0x29,0x04,0xb0,0x04,0x18,0x00,0x1e,0x00,0x2e,0x40,0x18,0x00,0x84,0x0d,0x06,0x0d,0x06,0x20,0x18,0x14,0x84,0x15,0x18,0x10,0x95,0x1b,0x10,0x17,0x0f,0x14,0x1b,0x03,0x95,0x0a,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x15, +0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0x2c,0x2c,0x16,0x34,0x16,0x17,0x39,0x19,0x73,0x80,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x01,0x14,0x5e,0x45,0x0a,0x0e,0x8d,0x0b,0x09,0x8d,0x83,0x01,0x50,0x01,0x46,0xb8,0x8e,0xfb,0xe1, +0x05,0xd7,0xaa,0xc2,0xd8,0xce,0x00,0x01,0x00,0xbc,0xfe,0x29,0x02,0xf4,0x05,0xb2,0x00,0x11,0x00,0x21,0x40,0x10,0x0c,0x0c,0x13,0x04,0x00,0x83,0x01,0x04,0x0e,0xf4,0x08,0x01,0x03,0x00,0x00,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16, +0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x01,0x64,0xa8,0xa8,0x04,0x26,0x9b,0x61,0x23,0x34,0x13,0x2f,0x57,0x78,0x92,0xfe,0x29,0x07,0x71,0xcd,0x6b,0x7a,0x07,0x07,0xb4,0x21,0xd1,0xc8,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x10,0x00,0x21,0x40,0x10,0x00,0x00,0x12,0x0b,0x06,0x84,0x07,0x0a,0x02,0xec,0x0e,0x10, +0x09,0x0f,0x06,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2c,0x50,0x6a,0x8c,0xa4,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24,0x03,0x5a,0x21,0xc5,0xac,0xfc,0x1f,0x05,0xd7,0xd3,0x6e,0x77,0x0e,0x00, +0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xb9,0x05,0x9b,0x00,0x1e,0x00,0x2f,0x40,0x17,0x1d,0x19,0x12,0x08,0x12,0x08,0x20,0x1e,0x0c,0x7d,0x19,0x13,0x12,0x12,0x0f,0x91,0x16,0x13,0x09,0x1d,0x91,0x00,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x2f,0x33,0x01,0x2f,0xe1,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x33,0x32, +0x37,0x21,0x32,0x17,0x33,0x15,0x21,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x20,0x00,0x11,0x34,0x12,0x36,0x37,0x21,0x6b,0xe6,0x64,0x4f,0x01,0xc6,0x32,0x3a,0x83,0xfe,0x88,0xe7,0xfe,0xb4,0x01,0x20,0xe9,0x57,0xa6,0x78,0x50,0xc0,0x6a,0xfe,0xc4,0xfe,0x88,0x84,0xad,0x35,0xfe,0xa7,0x05,0x9a,0x01,0x01, +0x97,0xfe,0xa4,0xeb,0xfa,0xfe,0xbd,0x28,0x38,0xa3,0x2a,0x2a,0x01,0x88,0x01,0x42,0x91,0x01,0x18,0x96,0x12,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x98,0x04,0x00,0x00,0x17,0x00,0x2d,0x40,0x16,0x16,0x13,0x0c,0x02,0x0c,0x02,0x19,0x17,0x06,0x83,0x13,0x0c,0x0c,0x09,0x95,0x10,0x16,0x03,0x16,0x95,0x00,0x0f,0x00,0x3f,0xed,0x32, +0x3f,0xed,0x32,0x2f,0x01,0x2f,0xe9,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x00,0x35,0x34,0x36,0x37,0x23,0x60,0x03,0x38,0xfe,0xe3,0x9c,0xbf,0xbd,0x93,0x44,0x7f,0x44,0x45,0x82,0x44,0xdd,0xfe,0xe7,0x72,0x5a,0xe2,0x04,0x00, +0x89,0xda,0xaf,0xa1,0xdc,0x2b,0x30,0x9c,0x29,0x1f,0x01,0x16,0xdf,0x95,0xcc,0x39,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x00,0x09,0x00,0x25,0x40,0x12,0x08,0x7e,0x01,0x07,0x07,0x0b,0x04,0x7e,0x03,0x02,0x91,0x05,0x05,0x07,0x03,0x03,0x00,0x12,0x00,0x3f,0x3f,0x33,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x33, +0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0x4a,0xfc,0x72,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0x03,0x0c,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x00,0x00,0x02,0xff,0xe5,0xfe,0x1e,0x03,0x30,0x05,0xec,0x00,0x22,0x00,0x2c,0x00,0x55,0x40,0x2c,0x00,0x08,0x84,0x12,0x23,0x20,0x12,0x0c,0x04,0x12,0x04,0x12,0x04,0x2e, +0x28,0xef,0x1a,0x07,0x17,0x96,0x04,0x03,0x2b,0x00,0x2b,0x25,0x96,0x1d,0x20,0x1d,0x20,0x2b,0x01,0x2b,0x1d,0x2b,0x1d,0x0f,0x21,0x00,0x0a,0x95,0x0f,0x1c,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x11,0x33,0x10,0xc4,0x32,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc6,0x11,0x33,0x33, +0x10,0xe9,0x32,0x31,0x30,0x01,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x07,0x22,0x07,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x03,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x16,0x3c,0x75,0x3c,0x3c,0x75,0x3c,0xac,0x3c,0x32,0x29,0x4d,0x8e, +0xba,0x15,0x0c,0x0d,0x2e,0x8d,0xa4,0x85,0x6a,0x25,0x53,0x26,0xa4,0xa4,0x04,0x8f,0x2a,0x39,0x4d,0x61,0x25,0x03,0x8b,0x1a,0x49,0x34,0xa6,0x2a,0x3f,0x17,0xfc,0x8d,0xdf,0x1a,0x93,0x13,0xc0,0xa1,0x03,0x51,0x02,0x01,0x01,0x81,0x73,0x65,0x7b,0x16,0x22,0x01,0x84,0xfd,0x6a,0xc4,0x30,0x2a,0x3a,0x36,0x00,0x01,0x00,0xbc,0xfe,0x7f, +0x06,0x00,0x05,0x9a,0x00,0x1a,0x00,0x38,0x40,0x1c,0x12,0x0c,0x7e,0x0b,0x0e,0x7f,0x10,0x0b,0x10,0x0b,0x10,0x1c,0x02,0x1a,0x7e,0x00,0x15,0x06,0x01,0x1a,0x10,0x0d,0x91,0x12,0x12,0x0b,0x01,0x03,0x00,0x3f,0x33,0x3f,0xed,0xce,0x33,0x12,0x39,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x33,0x31,0x30, +0x33,0x11,0x33,0x01,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0xbc,0xda,0x02,0xce,0x17,0x1c,0x07,0x04,0x05,0x05,0xa8,0xc0,0x9b,0xf3,0xfd,0x1e,0x1b,0x13,0x06,0x04,0x04,0x05,0x9a,0xfb,0x9b,0x23,0x30,0x0d,0x1f,0x68,0x4c,0x03,0xf2,0xfa,0xfe,0xfd,0xe7, +0x01,0x81,0x04,0x77,0x2a,0x30,0x17,0x61,0x4d,0xfb,0xf4,0x00,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x8f,0x04,0x18,0x00,0x16,0x00,0x35,0x40,0x1b,0x13,0x84,0x01,0x15,0xed,0x16,0x01,0x16,0x01,0x16,0x18,0x0b,0x08,0x84,0x09,0x0c,0x04,0x0f,0x10,0x0a,0x0f,0x08,0x15,0x16,0x13,0x01,0x15,0x00,0x3f,0xcd,0xce,0x3f,0x3f,0x3f,0xcd,0x32, +0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x11,0x23,0x04,0x02,0xae,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x97,0x8d,0x02,0x48,0x01,0x46,0xb8,0x8e,0xfd,0xb8,0x04,0x00,0xaa, +0xc2,0xd8,0xce,0xfe,0x19,0xfe,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x00,0x1b,0x00,0x3e,0x40,0x1f,0x15,0x06,0x06,0x1d,0x1a,0x01,0x7d,0x0f,0x0d,0x0c,0x14,0x15,0x15,0x17,0x91,0x12,0x01,0x0c,0x91,0x1a,0x0f,0x0f,0x12,0x04,0x07,0x06,0x06,0x04,0x91,0x09,0x13,0x00,0x3f,0xed,0x32,0x2f,0x33,0x3f,0x39,0x2f, +0x33,0xed,0x32,0x10,0xed,0x32,0x2f,0x33,0x01,0x2f,0xcd,0x33,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x21,0x16,0x00,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x03,0x23,0x35,0x33,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x02,0xa2,0xfe,0x6e,0x10,0x01,0x18,0xde,0xd8,0x9e,0x9f,0xed,0xfe,0xdc,0xfe,0x93, +0x10,0x5f,0x62,0x1d,0x01,0x91,0x01,0x2a,0xcb,0x87,0x9b,0xb9,0xe3,0xfe,0xd6,0x19,0x01,0x90,0x02,0x7d,0xe7,0xfe,0xe9,0x60,0xa3,0x54,0x01,0x6b,0x01,0x2a,0x9b,0x01,0x25,0x01,0x75,0x3b,0xb3,0x56,0xfe,0xe8,0xea,0x00,0x00,0x01,0x00,0x00,0xff,0xe8,0x03,0x62,0x04,0x18,0x00,0x1b,0x00,0x32,0x40,0x19,0x07,0x14,0x14,0x1d,0x0c,0x0f, +0x83,0x01,0x00,0x1a,0x0f,0x1a,0x95,0x0c,0x00,0x00,0x04,0x12,0x95,0x17,0x16,0x09,0x95,0x04,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xcd,0x33,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x11,0x33,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x15, +0x06,0x23,0x22,0x00,0x27,0x23,0x68,0x1f,0x01,0x15,0xd8,0x85,0x69,0x73,0x81,0x89,0xbc,0x19,0x01,0x36,0xfe,0xc3,0x09,0xbc,0x96,0x85,0x77,0x77,0xa1,0xd5,0xfe,0xf5,0x08,0x60,0x02,0x5c,0xc6,0xf6,0x32,0xa8,0x50,0xac,0x86,0x8b,0xa5,0xba,0x59,0x9c,0x47,0x01,0x0d,0xdc,0x00,0x01,0x00,0x01,0xff,0xe8,0x05,0x1a,0x05,0xb2,0x00,0x1f, +0x00,0x78,0x40,0x2b,0x19,0x19,0x00,0x00,0x0b,0x7e,0x06,0x08,0x06,0x08,0x06,0x21,0x1e,0x01,0x7e,0x13,0x10,0x19,0x19,0x1b,0x91,0x16,0x10,0x01,0x11,0x00,0x00,0x1f,0x08,0x91,0x13,0x1e,0x12,0x1f,0x12,0x11,0x1f,0x16,0x11,0xc0,0x09,0x01,0x09,0xb8,0xff,0xc0,0xb3,0x0f,0x13,0x48,0x09,0xb8,0xff,0xc0,0x40,0x0d,0x0a,0x0d,0x48,0x09, +0x09,0x16,0x04,0x0b,0x06,0x04,0x91,0x0d,0x13,0x00,0x3f,0xed,0x32,0x32,0x3f,0x39,0x2f,0x2b,0x2b,0x5d,0x39,0x12,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0xed,0x11,0x33,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x2f,0x01,0x2f,0x33,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x32,0x2f,0x32,0x2f,0x31,0x30,0x01,0x01,0x16,0x00,0x33,0x32, +0x37,0x11,0x21,0x35,0x21,0x11,0x06,0x21,0x20,0x00,0x03,0x07,0x35,0x37,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x01,0x05,0x1a,0xfb,0xf6,0x13,0x01,0x19,0xe5,0xa9,0x7a,0xfe,0xc6,0x01,0xe2,0xd9,0xfe,0xf9,0xfe,0xe7,0xfe,0x92,0x20,0x64,0x5d,0x0b,0x01,0xa2,0x01,0x3b,0xeb,0x9e,0xaf,0xed,0xe2,0xfe,0xd5,0x14,0x04, +0x08,0x03,0xe0,0xfe,0x9c,0xed,0xfe,0xf0,0x43,0x01,0x92,0x98,0xfd,0x76,0x7a,0x01,0x4c,0x01,0x0d,0x22,0x9a,0x20,0x01,0x41,0x01,0x98,0x4c,0xba,0x6e,0xfe,0xdc,0xe0,0x01,0x64,0x00,0x03,0x00,0x00,0xfe,0x1e,0x04,0x81,0x04,0x18,0x00,0x21,0x00,0x29,0x00,0x31,0x00,0x60,0x40,0x34,0x22,0x2a,0x84,0x0d,0x0b,0x00,0x0e,0x1b,0x1b,0x19, +0x1d,0x84,0x2b,0x29,0x16,0x04,0x00,0x02,0x95,0x1f,0x1b,0x17,0x0f,0x15,0x2e,0x95,0x1c,0x29,0x22,0x0b,0x04,0x0c,0x1b,0x1b,0x19,0x2a,0x0e,0x03,0x0d,0x1a,0x0d,0x0c,0x1a,0x0c,0x08,0x13,0x10,0x05,0x25,0x95,0x08,0x16,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0xed,0x32,0x3f, +0x3f,0xed,0x32,0x01,0x2f,0x33,0x33,0x33,0xf9,0x32,0xc2,0x2f,0x2f,0xc4,0x33,0xcd,0xe9,0x32,0x31,0x30,0x17,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x07,0x35,0x37,0x26,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x37,0x15,0x07,0x11,0x10,0x21,0x22,0x27,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x05,0x25, +0x26,0x26,0x23,0x22,0x06,0x15,0xa8,0xac,0x9e,0x01,0x7a,0x04,0x75,0xeb,0x96,0xd0,0x29,0x79,0x62,0x02,0xfa,0xdb,0xcf,0x64,0x04,0xa4,0x71,0x71,0xfd,0xe4,0xbe,0x8e,0x72,0x1e,0x91,0x6c,0x8a,0xad,0xfd,0x9c,0x02,0x5c,0x16,0x97,0x6b,0x99,0xab,0xf6,0x60,0x01,0x92,0x70,0xc4,0xa8,0x8e,0x29,0x8e,0x21,0x0e,0x1e,0x01,0x14,0x01,0x34, +0xa6,0x8e,0xfe,0xe9,0x27,0x8e,0x27,0xfd,0xf7,0xfd,0xcc,0x48,0x02,0xf0,0x67,0x7d,0xc4,0x99,0x53,0x45,0xd1,0x5c,0x84,0xdf,0xc5,0x00,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x17,0x00,0x1d,0x00,0x57,0x40,0x2f,0x0b,0x10,0x0d,0x09,0x0a,0x0a,0x11,0x10,0x10,0x1f,0x13,0x04,0x19,0x7e,0x17,0x01,0x15,0x0f,0x12,0x13, +0x16,0x04,0x17,0x0e,0x0e,0x0c,0x1a,0x19,0x01,0x04,0x00,0x0d,0x00,0x17,0x17,0x18,0x0b,0x04,0x0d,0x05,0x02,0x11,0x15,0x12,0x09,0x02,0x03,0x00,0x3f,0x33,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0x33,0xc6,0xed,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x33,0x11,0x39,0x31, +0x30,0x13,0x37,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x17,0x25,0x15,0x05,0x01,0x23,0x01,0x07,0x11,0x23,0x11,0x07,0x01,0x15,0x37,0x27,0x26,0x27,0x12,0xaa,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0x81,0x01,0xfb,0xfe,0x6a,0x01,0xac,0xea,0xfe,0x97,0xeb,0xa8,0xaa,0x01,0x52,0x89,0x5f,0x1e,0x08,0x01,0x7c, +0x3a,0x03,0xe4,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0x93,0xaf,0x96,0x8c,0xfe,0x1c,0x01,0xab,0x51,0xfe,0xa6,0x01,0x20,0x3a,0x01,0xdc,0xd2,0x2f,0x71,0x24,0x0e,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x18,0x00,0x54,0x40,0x2e,0x12,0x11,0x15,0x0e,0x06,0x84,0x0b,0x09,0x07,0x14,0x10,0x11, +0x11,0x03,0x02,0x01,0x04,0x05,0x08,0x04,0x09,0x00,0x00,0x13,0x16,0x15,0x0b,0x04,0x0a,0x14,0x0a,0x09,0x09,0x17,0x12,0x0e,0x14,0x05,0x07,0x10,0x0f,0x0c,0x00,0x03,0x07,0x15,0x00,0x3f,0x33,0x3f,0x3f,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0xce,0x33,0xe9, +0x32,0x32,0x11,0x39,0x31,0x30,0x01,0x05,0x01,0x23,0x01,0x07,0x15,0x23,0x35,0x07,0x35,0x37,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x17,0x25,0x05,0x37,0x27,0x23,0x03,0xea,0xfe,0xc2,0x01,0x4c,0xe6,0xfe,0xf7,0xbf,0xa4,0x80,0x80,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x4d,0x01,0xa5,0xfd,0x60,0x5c,0x58,0x04,0x01,0xc5,0x6d,0xfe,0xa8, +0x01,0x20,0x42,0xde,0xa6,0x2c,0x8e,0x2c,0x04,0xb8,0xfc,0x3f,0x01,0xd5,0xfe,0x12,0x50,0x91,0xe7,0x20,0x60,0x00,0x00,0x03,0x00,0x12,0x00,0x00,0x05,0xea,0x05,0x9a,0x00,0x13,0x00,0x1c,0x00,0x26,0x00,0x58,0x40,0x31,0x0c,0x08,0x0a,0x0a,0x08,0x7e,0x25,0x07,0x07,0x28,0x18,0x04,0x11,0x7e,0x02,0x00,0x12,0x0c,0x25,0x26,0x0f,0x10, +0x13,0x06,0x00,0x0b,0x0b,0x06,0x09,0x01,0x0a,0x01,0x00,0x20,0x00,0x02,0x18,0x19,0x05,0x0a,0x14,0x08,0x03,0x0e,0x12,0x12,0x07,0x03,0x03,0x00,0x3f,0x33,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0xce,0x33,0xe9,0x32,0x32,0x12,0x39,0x2f,0x33,0xf9,0xca,0x2f,0x11,0x33,0x31,0x30, +0x13,0x35,0x37,0x11,0x33,0x01,0x25,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x23,0x01,0x05,0x11,0x23,0x11,0x13,0x16,0x16,0x15,0x11,0x25,0x03,0x26,0x27,0x01,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x05,0x12,0xaa,0xda,0x01,0x90,0x01,0x72,0xa8,0xaa,0xaa,0xce,0xfe,0x6a,0xfe,0x88,0xa8,0xa0,0x04,0x04,0x01,0x26,0xfa,0x1b,0x13,0x03, +0x02,0x17,0x1c,0x07,0x04,0x05,0x05,0xfe,0xde,0x01,0x82,0x9a,0x3a,0x03,0x44,0xfd,0x8e,0x7e,0x01,0xf4,0xfe,0x45,0x3a,0x9a,0x3a,0xfc,0xbb,0x02,0x75,0x80,0xfe,0x0b,0x01,0xbc,0x03,0x15,0x17,0x61,0x4d,0xfe,0x83,0x64,0x01,0x84,0x2a,0x30,0xfc,0x64,0x23,0x30,0x0d,0x1f,0x68,0x4c,0x01,0x64,0x63,0x00,0x00,0x02,0x00,0x19,0x00,0x00, +0x04,0x86,0x04,0x18,0x00,0x15,0x00,0x1c,0x00,0x55,0x40,0x2e,0x17,0x0d,0x06,0x84,0x0b,0x09,0x07,0x14,0x02,0x00,0x00,0x02,0x84,0x18,0x03,0x0f,0x1a,0x95,0x01,0x04,0x05,0x03,0x09,0x00,0x00,0x14,0x18,0x17,0x0b,0x04,0x0a,0x15,0x0a,0x09,0x09,0x08,0x15,0x03,0x06,0x11,0x10,0x0d,0x0f,0x03,0x06,0x15,0x00,0x3f,0x33,0x3f,0x3f,0x12, +0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0xed,0x32,0x01,0x2f,0x33,0xf9,0xca,0x2f,0x11,0x33,0x2f,0xce,0x33,0xe9,0x32,0x32,0x31,0x30,0x01,0x07,0x11,0x23,0x11,0x05,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x37,0x05,0x15,0x25,0x26,0x23,0x22,0x06,0x04,0x86,0x8e,0xa4, +0xfd,0xf6,0xa4,0x8d,0x8d,0xa4,0x04,0x74,0xdc,0x93,0xad,0x14,0x94,0xfc,0xc4,0x02,0x05,0x1d,0xcc,0x7a,0xa2,0x02,0x78,0x30,0xfd,0xb8,0x02,0x10,0xb4,0xfe,0xa4,0x01,0x23,0x30,0x8e,0x30,0x02,0x4f,0xaa,0xc2,0xa6,0x9e,0x32,0xbe,0x5e,0xb2,0xf2,0xb8,0x00,0x03,0x00,0x12,0x00,0x00,0x04,0xc0,0x05,0x9a,0x00,0x1d,0x00,0x24,0x00,0x2a, +0x00,0x65,0x40,0x35,0x0f,0x22,0x1c,0x15,0x14,0x09,0x09,0x14,0x14,0x2c,0x07,0x0c,0x27,0x23,0x26,0x1e,0x1b,0x7e,0x02,0x00,0x1c,0x0a,0x23,0x24,0x1d,0x04,0x00,0x09,0x09,0x07,0x27,0x26,0x02,0x04,0x01,0x08,0x01,0x00,0x0f,0x1e,0x91,0x08,0x00,0x1a,0x1a,0x03,0x15,0x1b,0x12,0x25,0x91,0x03,0x03,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39, +0x2f,0x39,0x39,0xed,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x2f,0x33,0xc1,0x32,0x11,0x33,0x2f,0x33,0x2f,0x11,0x33,0x12,0x39,0x39,0x31,0x30,0x13,0x35,0x37,0x11,0x21,0x32,0x16,0x17,0x37,0x15,0x07,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x01,0x23,0x03,0x26,0x26, +0x23,0x23,0x11,0x23,0x11,0x17,0x33,0x32,0x36,0x35,0x35,0x05,0x11,0x11,0x25,0x26,0x26,0x23,0x12,0xaa,0x01,0xac,0x84,0xcd,0x35,0xbc,0x91,0x03,0xa7,0x97,0x2f,0x4d,0x59,0x01,0x0d,0xc8,0xf0,0x47,0x7b,0x58,0x8a,0xa8,0xa8,0xe4,0x81,0xa3,0xfd,0xf8,0x01,0xdb,0x23,0x7b,0x57,0x02,0xf4,0x9a,0x3a,0x01,0xd2,0x5d,0x5f,0x40,0x9a,0x31, +0x1b,0x1c,0x90,0xcb,0x27,0x04,0x15,0x44,0x8e,0xfe,0x51,0x01,0x92,0x79,0x57,0xfd,0x9e,0x03,0x2e,0x34,0x97,0x7d,0x0a,0xb1,0x01,0x9b,0xfe,0xff,0xa1,0x2f,0x31,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x17,0x00,0x48,0x40,0x23,0x17,0x11,0x11,0x19,0x16,0x09,0x02,0x84,0x07,0x05,0x03,0x11,0x11,0x0b,0x13,0x0e, +0x10,0x04,0x01,0x05,0x00,0x00,0x07,0x16,0x06,0x17,0x06,0x05,0x17,0x05,0x03,0x08,0x0f,0x03,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x3f,0xcd,0x32,0x32,0x2f,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x05,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33, +0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x25,0x02,0xa4,0xfe,0xa6,0xa4,0x83,0x83,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24,0x2c,0x50,0x69,0x8d,0x01,0x5a,0x02,0x20,0xa1,0xfe,0x81,0x01,0x33,0x3c,0x92,0x3c,0x02,0x3b,0xd3,0x6e,0x77,0x0e,0xaa,0x21,0xc5,0xa5,0xa1,0x00,0x00,0x01,0x00,0x45,0xff,0xe8,0x04,0x06, +0x05,0xb2,0x00,0x2a,0x00,0x5b,0x40,0x31,0x0f,0x7d,0x00,0x04,0x15,0x15,0x19,0x7d,0x26,0x04,0x26,0x0a,0x0a,0x26,0x04,0x03,0x2c,0x20,0x1f,0x20,0x29,0x16,0x2a,0x15,0x15,0x01,0x13,0x00,0x14,0x00,0x2a,0x26,0x19,0x2a,0x14,0x04,0x0f,0x06,0x07,0x23,0x91,0x1c,0x13,0x09,0x0a,0x0c,0x91,0x07,0x04,0x00,0x3f,0xed,0xcd,0x32,0x3f,0xed, +0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xc4,0x32,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xf9,0xc2,0x2f,0x10,0xc6,0xe9,0x31,0x30,0x13,0x25,0x26,0x26,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x25,0x15,0x05,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x26, +0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x05,0x45,0x01,0x2b,0x86,0x6f,0x01,0x1b,0xd7,0xd3,0x62,0x7f,0xc7,0x8a,0xa7,0x54,0x8e,0x3f,0x01,0xba,0xfe,0xf0,0x7b,0x6d,0xfe,0xf2,0xf0,0x52,0xe2,0x33,0x40,0xe2,0x5f,0x9c,0x98,0x62,0xaf,0xfe,0x28,0x02,0x6f,0x66,0x4d,0xa4,0x6d,0xae,0xd1,0x33,0xbd,0x58,0x74,0x64,0x4d, +0x68,0x4d,0x1f,0x97,0x96,0x5d,0x4f,0xa8,0x64,0xba,0xc8,0x2f,0x23,0xc6,0x39,0x48,0x72,0x6d,0x4a,0x79,0x59,0xa1,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x2b,0x04,0x18,0x00,0x27,0x00,0x63,0x40,0x35,0x26,0x01,0x04,0x22,0x83,0x13,0x17,0x04,0x83,0x0e,0x27,0x1d,0x14,0x11,0x0e,0x17,0x0e,0x1d,0x1d,0x0e,0x17,0x03,0x29,0x09,0x1d,0x1f, +0x95,0x11,0x01,0x12,0x00,0x00,0x14,0x26,0x13,0x27,0x13,0x12,0x0e,0x04,0x12,0x27,0x17,0x22,0x06,0x07,0x1a,0x10,0x0a,0x0c,0x95,0x07,0x16,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xfd,0xc6,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x10,0xc6,0x10,0xe9,0x10, +0xc6,0xe9,0x11,0x39,0x39,0x31,0x30,0x01,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x35,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x25,0x03,0x2b,0x9e,0x3f,0x43,0xe2,0xb3,0x9f,0x73,0x85,0xa2,0xd8,0x41,0x68,0xfe,0xa2,0xa7, +0x53,0x4a,0xe2,0xa6,0x86,0x68,0x71,0x93,0x5b,0x6f,0x41,0x39,0x51,0x01,0x4e,0x02,0x2a,0x37,0x27,0x6a,0x50,0x89,0xa1,0x3d,0xb0,0x63,0x90,0x33,0x4d,0x2a,0x78,0x8e,0x39,0x2d,0x74,0x54,0x84,0xa4,0x2e,0xa6,0x4a,0x50,0x40,0x3b,0x45,0x18,0x21,0x73,0x00,0x01,0xff,0xac,0x00,0x00,0x05,0x44,0x05,0x9a,0x00,0x17,0x00,0x39,0x40,0x1e, +0x17,0x7e,0x14,0x00,0x00,0x04,0x19,0x09,0x7e,0x0e,0x13,0x03,0x7e,0x04,0x15,0x03,0x02,0x91,0x13,0x0b,0x0b,0x04,0x06,0x91,0x11,0x03,0x04,0x12,0x00,0x12,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x2f,0xed,0x3f,0x01,0x2f,0xed,0x32,0xd4,0xe9,0x11,0x12,0x39,0x2f,0x33,0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x23,0x11,0x23,0x22,0x06, +0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0x9c,0xfd,0x1a,0xa8,0x18,0x51,0x59,0x14,0x9e,0x16,0xc8,0x9a,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0xfd,0x72,0x05,0x02,0x5c,0x4e,0x36,0x34,0x36,0x44,0x88,0xaa,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x00,0x02,0x00,0x19,0x02,0x9a,0x03,0x4b,0x05,0x9a,0x00,0x13, +0x00,0x17,0x00,0x5d,0xb3,0x0a,0x0a,0x08,0x0c,0xb8,0x01,0x0c,0xb7,0x14,0x05,0x0d,0x0d,0x19,0x17,0x04,0x10,0xb8,0x01,0x0c,0xb3,0x13,0x01,0x11,0x0f,0xb8,0x01,0x0e,0x40,0x0a,0x30,0x17,0x40,0x17,0x02,0x17,0x17,0x00,0x0d,0x11,0xb8,0x01,0x0a,0xb2,0x16,0x0b,0x13,0xb8,0x01,0x0e,0xb4,0x08,0x04,0x00,0x06,0x02,0xb8,0x01,0x06,0x00, +0x3f,0x33,0xde,0x32,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x5d,0xed,0x01,0x2f,0x33,0xce,0xe1,0x32,0x32,0x12,0x39,0x2f,0x33,0x33,0xf1,0x32,0xca,0x2f,0x31,0x30,0x13,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x05,0x35,0x21,0x15,0x19,0x62,0x83,0x01,0x68,0x84,0x61, +0x61,0x84,0xfe,0x98,0x83,0x62,0x02,0x4d,0xfe,0x98,0x05,0x2b,0x6f,0x6f,0x6f,0x6f,0x70,0xfd,0xdf,0x01,0x4e,0xfe,0xb2,0x02,0x21,0x63,0x63,0x63,0x00,0x03,0x00,0x3e,0x02,0x89,0x03,0xf6,0x04,0xcf,0x00,0x1f,0x00,0x2b,0x00,0x30,0x00,0x7a,0xb3,0x15,0x02,0x30,0x0b,0xb8,0x01,0x0c,0xb2,0x22,0x0f,0x0a,0xb8,0x01,0x0c,0xb6,0x2c,0x22, +0x2c,0x22,0x2c,0x32,0x28,0xb8,0x01,0x0c,0xb2,0x1c,0x02,0x25,0xbb,0x01,0x0d,0x00,0x1f,0x00,0x0b,0x01,0x0d,0x40,0x0e,0x0c,0x30,0x1c,0x30,0x2c,0x30,0x03,0x30,0x0f,0x30,0x0f,0x1f,0x0d,0x2e,0x41,0x0d,0x01,0x0d,0x00,0x06,0x00,0x1f,0x01,0x09,0x00,0x15,0x00,0x2b,0x01,0x0d,0x00,0x19,0x00,0x0d,0x01,0x0d,0x00,0x12,0x00,0x19,0x01, +0x0b,0x00,0x3f,0xd4,0xed,0x10,0xed,0x32,0x3f,0xd4,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc6,0x10,0xed,0x32,0x39,0x39,0x31,0x30,0x00,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x23,0x06, +0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x12,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x25,0x26,0x23,0x22,0x07,0x01,0x9f,0x71,0x2b,0x04,0x23,0x6a,0x37,0x71,0x82,0xfe,0x87,0x0b,0x99,0x5b,0x4f,0x48,0x78,0x3b,0x6c,0x29,0x04,0x26,0x71,0x48,0x7f,0x9b,0xa0,0x86,0x43,0x57,0x57,0x49,0x49,0x57,0x58,0x48,0x02,0x1d, +0x02,0x78,0x78,0x0c,0x04,0xcf,0x2c,0x3c,0x36,0x32,0x92,0x7b,0x43,0x8f,0x35,0x6f,0x2d,0x2a,0x3c,0x30,0x36,0x9d,0x80,0x85,0xa4,0xfe,0x25,0x61,0x57,0x58,0x60,0x61,0x57,0x57,0x61,0xee,0x8a,0x8a,0x00,0x01,0x00,0x90,0xff,0xe8,0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x3b,0x40,0x1f,0x1b,0x0b,0x84,0x08,0x08,0x1f,0x14,0x12,0x84,0x11, +0x11,0x21,0x02,0x84,0x1f,0x1b,0x05,0x95,0x1d,0x16,0x15,0x0d,0x95,0x18,0x16,0x14,0x15,0x11,0x01,0x09,0x0f,0x00,0x3f,0x33,0x33,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xed,0x33,0x12,0x39,0x2f,0xe9,0x33,0x31,0x30,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35, +0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x90,0xa4,0x67,0x7e,0x68,0x94,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6e,0xd0,0x6b,0x9a,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xa8,0x9a,0xc1,0x85,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb4,0x92,0x02,0x48,0xfc,0x00,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1, +0x00,0x01,0x00,0x54,0x00,0x00,0x03,0x2c,0x05,0x9a,0x00,0x09,0x00,0x29,0x40,0x14,0x02,0x7e,0x03,0x06,0x03,0x06,0x03,0x0b,0x09,0x04,0x91,0x07,0x07,0x00,0x03,0x12,0x08,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x13,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11, +0x21,0x54,0x02,0xd8,0xa8,0xfd,0xfa,0x02,0x06,0xfd,0xd0,0x05,0x9a,0xfa,0x66,0x02,0x7b,0x97,0x01,0xf0,0x00,0x02,0x00,0x52,0x00,0x00,0x03,0xbf,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x28,0x40,0x14,0x11,0x08,0x7e,0x09,0x09,0x14,0x0d,0x7d,0x03,0x0a,0x91,0x11,0x11,0x06,0x09,0x12,0x12,0x91,0x06,0x03,0x00,0x3f,0xed,0x3f,0x12,0x39, +0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x33,0x31,0x30,0x01,0x22,0x00,0x35,0x34,0x36,0x33,0x21,0x11,0x23,0x11,0x03,0x20,0x11,0x14,0x16,0x33,0x33,0x11,0x02,0x5a,0xf0,0xfe,0xe8,0xff,0xe4,0x01,0x8a,0xa8,0xc5,0xfe,0xb0,0xb6,0xaf,0xb0,0x02,0x1e,0x01,0x05,0xcb,0xcd,0xdf,0xfa,0x66,0x02,0x1e,0x02,0xe4,0xfe,0xe4,0x92,0x9e, +0x02,0x4c,0x00,0x01,0x00,0xbd,0x00,0x00,0x06,0x73,0x05,0x9a,0x00,0x1e,0x00,0x30,0x40,0x18,0x15,0x13,0x7e,0x05,0x00,0x0d,0x12,0x12,0x20,0x1d,0x01,0x7e,0x00,0x0d,0x06,0x18,0x03,0x15,0x1d,0x12,0x12,0x09,0x00,0x03,0x00,0x3f,0x32,0x32,0x3f,0x33,0x17,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0x39,0x12,0x39,0xe9,0x33,0x31,0x30, +0x13,0x33,0x11,0x14,0x06,0x07,0x33,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x11,0x23,0x01,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0xbd,0xa7,0x07,0x07,0x04,0x18,0x13,0x01,0xea,0x52,0x01,0xe9,0x14,0x17,0x04,0x04,0x04,0xa2,0xde,0xfe,0x48,0x33,0x0f,0x06,0x16,0x22,0x0d,0xfe,0x3f,0xd2,0x05,0x9a,0xfc, +0x3e,0x39,0x8b,0x53,0x63,0x28,0x04,0x4e,0xfb,0xba,0x2e,0x65,0x2b,0x8b,0x63,0x03,0xc0,0xfa,0x66,0x03,0xe8,0x74,0x38,0x3c,0x57,0x1d,0xfc,0x1c,0x00,0x01,0x00,0xbc,0xfe,0x29,0x01,0x64,0x05,0x9a,0x00,0x03,0x00,0x17,0x40,0x0a,0x00,0x7e,0x01,0x01,0x04,0x05,0x02,0x03,0x01,0x1b,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xe9,0x31, +0x30,0x01,0x23,0x11,0x33,0x01,0x64,0xa8,0xa8,0xfe,0x29,0x07,0x71,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x09,0x12,0x05,0x9a,0x00,0x27,0x00,0x48,0x40,0x25,0x0c,0x0b,0x04,0x00,0x0f,0x15,0x14,0x24,0x1f,0x1e,0x18,0x18,0x24,0x0f,0x04,0x04,0x0a,0x1d,0x1d,0x29,0x27,0x10,0x0a,0x0f,0x18,0x04,0x23,0x04,0x09,0x1c,0x14,0x0b,0x03,0x1f, +0x00,0x09,0x12,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x2f,0x33,0x11,0x33,0x2f,0x12,0x17,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x11,0x33,0x33,0x31,0x30,0x21,0x01,0x27,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37, +0x01,0x33,0x01,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x03,0x70,0xfe,0xcc,0x13,0x0a,0x03,0x04,0x03,0x12,0x0a,0xfe,0xd7,0xb6,0x01,0xb2,0xb9,0x01,0x31,0x13,0x05,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x04,0x17,0x01,0x25,0xb6,0xfe,0x6b,0xc5,0xfe,0xd9,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0x04, +0x1a,0x46,0x23,0x25,0x25,0x46,0x23,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x34,0x56,0x04,0x50,0xfa,0x66,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x06,0xd7,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00, +0x01,0x07,0x02,0x3a,0x04,0x37,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x11,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x50,0xff,0xeb,0x06,0xd4,0x05,0xb0,0x00,0x27,0x0c,0xea,0x04,0x2e,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x06,0x00,0xf0,0x00,0x00,0x00,0x09,0xb3,0x01,0x00,0x1f,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff, +0x00,0x4a,0xff,0xec,0x09,0x19,0x05,0xb0,0x00,0x26,0x00,0xf0,0xfa,0x00,0x00,0x27,0x00,0xf0,0x04,0x00,0xfd,0xb9,0x00,0x27,0x0c,0xe1,0x06,0x74,0x00,0x00,0x01,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0x00,0x0e,0xb6,0x03,0x02,0x1a,0x2d,0x01,0x0d,0x2c,0x00,0x3f,0x35,0x3f,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xa3,0x05,0xb0, +0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x02,0x39,0x04,0x19,0xfd,0xb9,0x01,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0x00,0x07,0xb2,0x01,0x30,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x8d,0xff,0xec,0x06,0xe5,0x05,0xae,0x00,0x26,0x00,0xf1,0x25,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x5b,0xfd,0xb9, +0x00,0x07,0xb2,0x02,0x47,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x06,0xe5,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x5b,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x48,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x2f,0xff,0xec,0x06,0xa3,0x05,0x9a,0x00,0x26, +0x02,0x38,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x19,0xfd,0xb9,0x00,0x07,0xb2,0x03,0x39,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xb3,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x0c,0xe7,0x04,0x0d,0x00,0x00,0x00,0x09, +0xb3,0x03,0x02,0x2b,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x7b,0xff,0xec,0x06,0xed,0x05,0x9e,0x00,0x26,0x02,0x39,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xf9,0x00,0x00,0x01,0x07,0x0c,0xe7,0x04,0x47,0x00,0x00,0x00,0x09,0xb3,0x03,0x02,0x43,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x05,0x71,0x05,0xb0, +0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0x27,0x00,0x00,0xff,0xff, +0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x05,0x12,0x05,0xd9,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x07,0x00,0x4c,0x03,0xac,0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x02,0x05,0xd9,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x27,0x00,0x4c,0x03,0xac,0x00,0x00,0x00,0x07, +0x00,0x4c,0x05,0x9c,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x02,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x02,0x06,0x00,0x47,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x04,0x18, +0x02,0x06,0x00,0x50,0x00,0x00,0x00,0x03,0x00,0x5e,0x00,0x00,0x07,0xde,0x05,0x9a,0x00,0x0f,0x00,0x19,0x00,0x23,0x00,0x2d,0x40,0x17,0x11,0x7e,0x22,0x22,0x05,0x0a,0x7d,0x17,0x17,0x25,0x1c,0x7d,0x05,0x10,0x23,0x91,0x07,0x03,0x11,0x22,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12, +0x39,0x2f,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x1e,0x02,0x33,0x33,0x11,0x03,0x64,0xaa,0xfe,0xe4,0xce,0x72,0x02,0xf6,0x01,0x94,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0x66,0x68,0x8b,0xdd,0x9a,0x52,0xfd, +0xb6,0xfe,0x74,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0x68,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0xfb,0x96,0x4c,0x93,0xd8,0x8c,0x02,0x27,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x04,0x6a,0x00,0x03,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x09,0x00,0x20,0x00,0x2b,0x00,0x41,0x40,0x22,0x11,0x7e, +0x24,0x24,0x00,0x04,0x7d,0x1e,0x1e,0x2d,0x2b,0x0b,0x18,0x7e,0x00,0x2a,0x92,0x0b,0x2b,0x92,0x17,0x0b,0x17,0x0b,0x17,0x00,0x0a,0x91,0x01,0x03,0x18,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xe9,0x32,0x32,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x31,0x30,0x33,0x11,0x21, +0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x03,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0xbc,0x01,0x8c,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0xd4,0x5a,0x65,0xa1,0x6f,0x3b,0x3a,0x6f,0xa0,0x65,0x5c,0xd6,0x8b,0xdd,0x9a,0x52,0xfd, +0xb6,0x83,0x78,0x89,0x24,0x44,0x60,0x3c,0x5a,0x05,0x9a,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0x9d,0x30,0x61,0x95,0x65,0x65,0x9d,0x6b,0x38,0x9d,0x4c,0x93,0xd8,0x8c,0x02,0x27,0xfc,0xba,0x8b,0x93,0x49,0x64,0x3d,0x1a,0xfd,0xde,0x00,0x05,0x00,0x5e,0x00,0x00,0x07,0xde,0x05,0x9a,0x00,0x0f,0x00,0x26,0x00,0x3d,0x00,0x48, +0x00,0x53,0x00,0x6b,0x40,0x39,0x45,0x7e,0x20,0x53,0x30,0x3d,0x7e,0x19,0x3e,0x26,0x19,0x36,0x7e,0x4c,0x20,0x19,0x4c,0x4c,0x19,0x20,0x03,0x05,0x0a,0x7d,0x2c,0x2c,0x55,0x13,0x7d,0x05,0x52,0x3f,0x92,0x26,0x30,0x26,0x53,0x3e,0x92,0x1a,0x3c,0x1a,0x26,0x1a,0x26,0x1a,0x00,0x2f,0x10,0x91,0x07,0x03,0x3d,0x19,0x91,0x00,0x12,0x00, +0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x33,0x10,0xe9,0x32,0x32,0x10,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x01, +0x23,0x20,0x11,0x14,0x1e,0x02,0x33,0x33,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x01,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x03,0x64,0xaa,0xfe,0xe4, +0xce,0x72,0x02,0xf6,0x01,0x94,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0xfe,0xf2,0x72,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0x68,0x5c,0x65,0xa0,0x6f,0x3a,0x3b,0x6f,0xa1,0x65,0x5a,0x01,0x10,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0x72,0x5a,0x65,0xa1,0x6f,0x3b,0x3a,0x6f,0xa0,0x65,0x5c,0xa8,0x5a,0x3c,0x60,0x44,0x24,0x89,0x78,0x01,0x62,0x78,0x89, +0x24,0x44,0x60,0x3c,0x5a,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x9d,0x38,0x6b,0x9d,0x65,0x65,0x95,0x61,0x30,0xfc,0x33,0x4c,0x93,0xd8,0x8c,0x02,0x27,0x9d,0x30,0x61,0x95,0x65,0x65,0x9d,0x6b,0x38,0x9d,0x01,0x24,0x02,0x22,0x1a,0x3d,0x64,0x49,0x93,0x8b, +0x8b,0x93,0x49,0x64,0x3d,0x1a,0xfd,0xde,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x00,0x19,0x00,0x2f,0x40,0x18,0x06,0x7d,0x13,0x13,0x1b,0x0d,0x19,0x0c,0x2f,0x0d,0x01,0x0d,0x0d,0x0f,0x91,0x0a,0x13,0x00,0x19,0x19,0x17,0x91,0x02,0x04,0x00,0x3f,0xed,0x32,0x2f,0x33,0x3f,0xed,0x32,0x2f,0x5d,0x33,0x01,0x2f,0x33,0x12, +0x39,0x2f,0xe9,0x31,0x30,0x13,0x36,0x33,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x11,0x10,0x27,0x26,0x23,0x22,0x07,0x68,0x9f,0xed,0x01,0x31,0xb9,0xb8,0xcf,0xcf,0xfe,0xc2,0xcb,0x87,0x9b,0xb9,0xf6,0x9b,0x99,0x8f,0x90,0xe9,0xd9,0x9d,0x05,0x5e,0x54,0xc5,0xc4,0xfe,0xbf,0xfe,0xa7,0xd3, +0xd4,0x3b,0xb3,0x56,0xa5,0xa5,0x01,0x14,0x01,0x05,0x9d,0x9b,0x60,0x00,0x00,0x01,0x00,0x5e,0xfe,0x7f,0x04,0x8c,0x05,0xb2,0x00,0x20,0x00,0x38,0x40,0x1e,0x1c,0x7f,0x1f,0x0d,0x1f,0x0d,0x22,0x14,0x7d,0x05,0x0c,0x30,0x0d,0x01,0x0d,0x0d,0x0f,0x91,0x0a,0x04,0x20,0x1c,0x01,0x1c,0x1c,0x19,0x91,0x1e,0x00,0x13,0x00,0x3f,0xce,0xed, +0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x33,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x23,0x11,0x06,0x03,0x00,0xa1,0xfb,0xac,0x5a,0x6b,0xc2,0x01,0x0d,0xa2,0xcb,0x87, +0x9b,0xb9,0x87,0xcf,0x8c,0x48,0x47,0x87,0xc0,0x7a,0x6b,0xba,0x51,0x9b,0x6e,0x18,0x70,0xc2,0x01,0x04,0x94,0xa6,0x01,0x1a,0xcd,0x73,0x3b,0xb3,0x56,0x61,0xa6,0xdc,0x7b,0x7a,0xd1,0x9a,0x58,0x2f,0x32,0xfd,0x9f,0x01,0x83,0x1a,0x00,0x01,0x01,0x05,0xff,0xcc,0x05,0x57,0x05,0xc6,0x00,0x08,0x00,0x24,0x40,0x0f,0x03,0x08,0x01,0x07, +0x07,0x0a,0x05,0x07,0x00,0x06,0x06,0x03,0x01,0x05,0x03,0x00,0x2f,0xdd,0xc4,0x12,0x39,0x11,0x33,0x2f,0x01,0x2f,0x12,0x39,0x2f,0x39,0xc9,0x39,0x31,0x30,0x01,0x01,0x11,0x01,0x01,0x11,0x01,0x11,0x21,0x03,0xb1,0x01,0xa6,0xfd,0xd7,0xfd,0xd7,0x01,0xa8,0x01,0x04,0x01,0x66,0x01,0x70,0xfe,0xd7,0xfe,0x1f,0x01,0xe1,0x01,0x29,0xfe, +0x90,0x04,0x60,0x00,0x00,0x04,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x09,0x00,0x20,0x00,0x36,0x00,0x3f,0x00,0x65,0x40,0x18,0x2f,0x7f,0x3a,0x11,0x7e,0x26,0x3a,0x26,0x3a,0x26,0x00,0x04,0x7d,0x1e,0x1e,0x41,0x3f,0x36,0x2b,0x0b,0x18,0x7e,0x00,0x3e,0xb8,0x01,0x05,0xb4,0x2b,0x2a,0x92,0x0b,0x3f,0xb8,0x01,0x05,0x40,0x14, +0x35,0x36,0x92,0x17,0x40,0x0b,0x01,0x0b,0x17,0x0b,0x17,0x00,0x0a,0x91,0x01,0x03,0x18,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xfd,0xd6,0xed,0x10,0xfd,0xd6,0xed,0x01,0x2f,0xe9,0x32,0x32,0x32,0x32,0x12,0x39,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x33,0x11,0x21, +0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0xbc,0x01,0x8c,0x02,0xf6,0x72,0xce,0xfe, +0xe4,0xaa,0xd4,0x8c,0x7d,0xc6,0x89,0x48,0x48,0x89,0xc5,0x7c,0x8e,0xd6,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0x54,0x61,0x8b,0x5a,0x2a,0xb1,0xbf,0x8c,0x3c,0x9f,0xa8,0x30,0x56,0x77,0x48,0x3e,0x3c,0x5b,0x57,0x56,0x5c,0x3c,0x05,0x9a,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0x53,0x35,0x71,0xb2,0x7c,0x73,0xb5,0x7e,0x42,0x5b,0x4c, +0x93,0xd8,0x8c,0x02,0x27,0xfc,0x6e,0x3a,0x64,0x83,0x4a,0xa8,0xaf,0x4b,0x7c,0x90,0x50,0x6e,0x44,0x1e,0x4b,0xba,0x52,0x5f,0x55,0x48,0xfe,0xb2,0x00,0x07,0x00,0x5e,0x00,0x00,0x08,0xba,0x05,0x9a,0x00,0x0f,0x00,0x26,0x00,0x3d,0x00,0x53,0x00,0x69,0x00,0x72,0x00,0x7b,0x00,0x95,0x40,0x2c,0x4e,0x7e,0x2c,0x78,0x7f,0x45,0x72,0x69, +0x5e,0x19,0x26,0x7e,0x3c,0x73,0x49,0x3e,0x32,0x3c,0x62,0x7f,0x6d,0x1f,0x7e,0x59,0x2c,0x45,0x3c,0x6d,0x59,0x59,0x6d,0x3c,0x45,0x2c,0x05,0x05,0x0a,0x7d,0x15,0x36,0x7d,0x05,0x71,0x74,0xb8,0x01,0x05,0x40,0x13,0x5e,0x49,0x5d,0x4a,0x92,0x19,0x20,0x32,0x30,0x32,0x02,0x32,0x18,0x33,0x91,0x07,0x03,0x72,0x73,0xb8,0x01,0x05,0x40, +0x0f,0x68,0x3f,0x69,0x3e,0x92,0x25,0x2f,0x3d,0x01,0x3d,0x26,0x3c,0x91,0x00,0x12,0x00,0x3f,0xfd,0x32,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0x32,0xed,0x32,0x3f,0xfd,0x32,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0x32,0xed,0x32,0x01,0x2f,0xe9,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x11,0x33,0x33,0x33,0x33,0x10, +0xe9,0x32,0x32,0x32,0x32,0x10,0xe9,0x10,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x37,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x25,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x23,0x20,0x11,0x14,0x1e,0x02, +0x33,0x33,0x3d,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x64,0xaa,0xfe, +0xe4,0xce,0x72,0x02,0xf6,0x02,0x70,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0x02,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0xe0,0x8c,0x7d,0xc6,0x89,0x48,0x48,0x89,0xc5,0x7c,0x8e,0xfe,0xca,0x7d,0xc4,0x89,0x48,0x48,0x89,0xc6,0x7d,0x8c,0xe0,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0xd6,0x3e,0x48,0x77,0x56,0x30,0xa8,0x9f,0x3c,0x8c,0xbf,0xb1,0x2a,0x5a, +0x8b,0x61,0x01,0xc0,0x61,0x8b,0x5a,0x2a,0xb1,0xbf,0x8c,0x3c,0x9f,0xa8,0x30,0x56,0x77,0x48,0x3e,0x3c,0x5b,0x57,0x56,0x5c,0x3c,0xa8,0x3c,0x5c,0x56,0x56,0x5c,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x98,0x4c,0x93,0xd8,0x8c,0x02,0x27,0x53,0x35,0x71,0xb2,0x7c,0x73,0xb5,0x7e,0x42,0x5b,0x5b,0x42, +0x7e,0xb5,0x73,0x7c,0xb2,0x71,0x35,0x53,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x5b,0x7d,0x4b,0x1e,0x44,0x6e,0x50,0x90,0x7c,0x4b,0xaf,0xa8,0x4a,0x83,0x64,0x3a,0x3a,0x64,0x83,0x4a,0xa8,0xaf,0x4b,0x7c,0x90,0x50,0x6e,0x44,0x1e,0x4b,0xba,0x52,0x5f,0x55,0x48,0xfe,0xb2,0x01,0x4e,0x48,0x55,0x5f,0x52,0x00,0xff,0xff,0x00,0x48,0xff,0xec, +0x06,0xd9,0x05,0xae,0x00,0x27,0x00,0xbc,0x03,0x03,0x00,0x00,0x00,0x27,0x00,0xf2,0x04,0x4b,0xfd,0xb9,0x01,0x06,0x08,0x8d,0x00,0x00,0x00,0x07,0xb2,0x01,0x23,0x2d,0x00,0x3f,0x35,0x00,0x00,0x01,0x00,0x00,0x01,0x46,0x04,0x27,0x01,0xb6,0x00,0x03,0x00,0x0e,0xb4,0x01,0x00,0x01,0x52,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30, +0x01,0x21,0x35,0x21,0x04,0x27,0xfb,0xd9,0x04,0x27,0x01,0x46,0x70,0x00,0x00,0x02,0x00,0xab,0xfe,0x0a,0x07,0x59,0x03,0x0f,0x00,0x2e,0x00,0x35,0x00,0x00,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03, +0x33,0x32,0x3e,0x02,0x35,0x11,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x06,0x9f,0x0c,0x27,0x49,0x3e,0x16,0x61,0x70,0x20,0x04,0x2c,0x80,0x9d,0xb4,0x60,0x88,0xe1,0xb5,0x88,0x30,0x40,0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1d,0x5c,0x92,0xd1,0x93,0x80,0xc0,0x7f,0x3f,0xfd,0x6c,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x03,0x0f,0xfe,0x89, +0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x35,0x19,0x05,0x04,0x15,0x2c,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0xfa,0xfb,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x02,0xff,0xba,0xfe,0x0a,0x02,0xac,0x03,0x0f,0x00,0x1f,0x00,0x26,0x00,0x00,0x01,0x14, +0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x03,0x33,0x17,0x37,0x33,0x03,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0xa9,0xec,0x7d,0xab, +0xa8,0x79,0xe6,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0xfa,0xfb,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x02,0x00,0xab,0xfe,0x0a,0x06,0x9f,0x03,0x0f,0x00,0x25,0x00,0x2c,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35, +0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x01,0x62,0x09,0x11,0x1e,0x30,0x1d,0x5c,0x91,0xd2,0x93,0x80,0xc0,0x7f,0x3f,0x9c,0x33,0x5d,0x81,0x9a,0xaf,0x5d,0x86,0xde,0xb3,0x87,0x30,0x3f,0x30,0x12,0x0b,0x02,0xa7,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x02, +0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0xfe,0x4b,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x03,0x15,0x2d,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0xfb,0xab,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x02,0xff,0xba,0xfe,0x0a,0x02,0xa6,0x03,0x0f,0x00,0x16,0x00,0x1d,0x00,0x00,0x37,0x32,0x3e,0x02, +0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x49,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20, +0x20,0x33,0xfd,0x71,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xb2,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x00,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36, +0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe, +0xf9,0xb9,0xb9,0xfe,0xe9,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x0e,0xb5,0x03,0x7e,0xb5,0xb5,0xb5,0x00,0x04, +0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xb2,0x00,0x40,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x00,0x01,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33, +0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0x22,0x40,0x1e,0x05,0x26,0x46,0x69,0x47,0x18,0x63,0x8f,0x5f,0x31,0x05,0x8d,0xc0,0x75,0x32,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31, +0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xd4,0xb9,0xb9,0xf2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x02,0x01,0x09,0x12,0x09,0x60,0x7e,0x49,0x1d,0xa7,0x3f,0x75,0xa6,0x67,0x33,0x6e,0x77,0x80,0x45,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19, +0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfc,0xe6,0xb5,0x03,0xa6,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x04,0xb2,0x00,0x28,0x00,0x2c,0x00,0x30,0x00,0x34,0x00,0x00,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32, +0x1e,0x04,0x17,0x07,0x0e,0x05,0x23,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x2b,0x73,0x92,0xb1,0xd0,0xf1,0x88,0x02,0x81,0xb9,0xb9,0xc3,0xb9,0xb9,0x01,0x42, +0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x0a,0x42,0x59,0x62,0x53,0x36,0xfe,0xb4,0xb5,0x04,0xa2,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x04,0xad,0x04,0xb2,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x00,0x15,0x22, +0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39, +0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x14,0x35,0x5e,0x4a,0x14,0x62,0x7d,0x4a,0x1e,0x02,0x48,0xab,0xc8,0xe3,0x80,0x02,0x81,0xb9,0xb9,0xc3,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10, +0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2b,0x3b,0x25,0x10,0xa7,0x29,0x46,0x5d,0x35,0x2b,0x5b,0x4b,0x30,0xfe,0xb4,0xb5,0x04,0xa2,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x00,0x20,0x00,0x34,0x00,0x38,0x00,0x3c,0x00,0x00,0x01,0x33,0x11,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02, +0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x55,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x5a,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb7,0xfe,0xf5,0xc6,0x92, +0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x02,0x52,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x97,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xec,0xfc,0x1d,0x01,0x43,0x7a,0x5d,0x36,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x55,0x2f,0x16,0x05,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a, +0x66,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x00,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36, +0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x79,0xae,0x70,0x36,0x2d,0x51,0x71,0x88,0x9a,0x52,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4, +0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x83,0x75,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x96,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x54,0x2e,0x16,0x04,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82, +0x52,0x25,0x2c,0x4e,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x00,0x04,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x00,0x2d,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x00,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33, +0x21,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x6f,0x89,0x9d,0x54,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23, +0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x96,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3c,0x43,0x30,0x35,0x1a,0x05,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a, +0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x29,0x00,0x3d,0x00,0x41,0x00,0x45,0x00,0x00,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26, +0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26, +0x70,0x89,0x9d,0x54,0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x97,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a, +0x06,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x06,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x06,0x3c,0x00,0x36,0x00,0x4a,0x00,0x4e,0x00,0x52,0x00,0x56, +0x00,0x5a,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35, +0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x01,0x62,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x3a,0x64,0x89,0x9d,0xac,0x55,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x05,0xe6,0x0f, +0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1a,0x18,0x42,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0xfe,0x0f,0xb9,0xb9,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x60, +0x84,0x57,0x30,0x17,0x05,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0xf2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x00,0x06,0xff,0xba,0xfe,0xa6,0x03,0x49,0x06,0x3c,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44, +0x00,0x48,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x13,0x23,0x35,0x33, +0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81,0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x39,0xb9,0xb9, +0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42,0x4a,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x00,0x06,0xff,0xba,0xfe,0xa6, +0x04,0x02,0x06,0x3c,0x00,0x2f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22, +0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x13,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8, +0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x39,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17, +0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x06,0x00,0xab,0xfe,0xa6,0x08,0x04,0x06,0x3c,0x00,0x41,0x00,0x55,0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x00,0x01,0x34,0x3e,0x02, +0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36, +0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0xb0,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5b,0x27,0x33,0x77,0x82,0x8a,0x45,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d, +0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x01,0xfe,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x41,0x73,0x5a,0x23,0x1b,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0xfe,0x0f,0xb9,0xb9,0x01,0xd1,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x63,0x27,0x09,0x03,0xa7,0x07, +0x0e,0x16,0x0f,0x18,0x1a,0x0d,0x03,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x35,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x1f,0x3e,0x43,0x4a,0x2b,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5, +0x00,0x05,0x00,0x9b,0xfc,0xb6,0x05,0x4b,0x04,0x79,0x00,0x30,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x50,0x00,0x00,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x2e,0x05, +0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0xad,0x50,0x5c,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x1b,0x28,0x1b,0x0e,0x4a,0x98,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x67,0x93,0x64,0x3b,0x21, +0x0b,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xf8,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x6a,0xb9,0xb9,0x17,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x2a,0x68,0x75,0x7f,0x40,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26, +0x1d,0x32,0x46,0x51,0x5b,0xd0,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x03,0x1f,0xb5,0xb5,0xb5,0xf8,0x3d,0xb5,0x00,0x00,0x05,0xff,0xba,0xfe,0xa6,0x03,0x49,0x05,0x24,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e, +0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81, +0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x68,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04, +0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42,0x4a,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0xf9,0x82,0xb5,0x00,0x05,0xff,0xba,0xfe,0xa6,0x04,0x02,0x05,0x24,0x00,0x2f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16, +0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30, +0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x68,0xb9,0xb9, +0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x03,0x3e,0xb5,0xb5,0xb5,0xf9,0x82,0xb5,0x00, +0x00,0x05,0x00,0x9b,0xfc,0xb6,0x06,0x03,0x04,0x79,0x00,0x30,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x03,0x2e, +0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0x36,0x5c,0x91,0x66,0x36,0x30,0x55,0x73,0x44,0x48,0x78,0x36,0x2d,0x34,0x07,0xbc,0xbb,0x0b,0x54,0x99,0xe0,0x97,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x60,0x8d,0x63,0x3e, +0x24,0x10,0x03,0x1d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1a,0x7c,0x86,0x65,0x04,0x0e,0xfe,0xf5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x6a,0xb9,0xb9,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x48,0xc0,0x6d,0xa7,0x7f,0xbc,0x7b,0x3d,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x19, +0x2d,0x3e,0x49,0x52,0x2b,0x01,0x42,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0x02,0xb6,0xb5,0xb5,0xb5,0xf8,0x3d,0xb5,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x51,0x05,0xec,0x00,0x2d,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15, +0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x05,0x51,0xb3,0xb3,0xb3,0x38,0x81,0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfd,0xa8,0x8f,0xe4, +0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x02,0x44,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xa5,0x05,0xec,0x00,0x26,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32, +0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x02,0xa5,0xb3,0xb3,0xb3,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x2e,0x47,0x30,0x18,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfd,0xe0,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0x0f,0x2a, +0x48,0x39,0x02,0x19,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x00,0x2f,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21, +0x35,0x21,0x11,0x33,0x11,0x33,0x02,0xa5,0xb3,0xb3,0xb3,0x0c,0x27,0x4a,0x3d,0x16,0x61,0x74,0x1d,0x04,0x1b,0x43,0x48,0x49,0x22,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfe,0x2c,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20, +0x20,0x33,0x12,0x2c,0x47,0x35,0x02,0x19,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x00,0x38,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02, +0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x05,0x51,0xb3,0xb3,0xb3,0x0c,0x27,0x4a,0x3d,0x13,0x49,0x59,0x1c,0x04,0x11,0x4c,0x7f,0xb7,0x7c,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04, +0x5c,0x83,0x6d,0xfe,0x30,0x43,0x61,0x40,0x1f,0xa7,0x28,0x26,0x5f,0x95,0x69,0x37,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x02,0x44,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x05,0x00,0x39,0xfd,0xff,0x03,0xf4,0x05,0x91,0x00,0x26,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44, +0x00,0x00,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x02,0xac,0x4c,0x79,0x55,0x2e, +0x23,0x47,0x69,0x45,0x31,0x66,0x61,0x59,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x2e,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x54,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x02,0xb9,0x53,0x7d,0x91,0x3e,0x3b,0x6c,0x52,0x30, +0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x43,0x23,0x0b,0xfd,0xdf,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0f,0x0d,0x09,0x03,0x2c,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0xff,0xba,0xff,0xf2,0x03,0xf4,0x05,0x91,0x00,0x23,0x00,0x33,0x00,0x37, +0x00,0x3b,0x00,0x3f,0x00,0x00,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x23,0x23, +0x23,0x23,0x1a,0x3f,0x57,0x3b,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x35,0x9a,0x5e,0x01,0x6e,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3f,0x2d,0xb0,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1a,0x2f, +0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f,0x50,0x43,0x01,0x13,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x02,0x89,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x91,0x00,0x30,0x00,0x40,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x00,0x05,0x23,0x22,0x26, +0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x04,0x17,0x1e,0x03,0x33,0x25,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x04,0xad,0x16,0x5b, +0x6f,0x1e,0x05,0x2d,0x87,0x61,0x34,0x61,0x57,0x4b,0x1e,0x35,0x99,0x5f,0x13,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57,0x3a,0x23,0x0b,0x0d,0x21,0x2b,0x38,0x48,0x5c,0x39,0x4f,0x72,0x50,0x33,0x1c,0x0c,0x02,0x04,0x0d,0x25,0x46,0x3d,0xfc,0xd4,0x2b,0x8e,0x56,0x5e,0x69,0x1a,0x35,0x52,0x37,0x30,0x4f,0x3e,0x2f,0xaf,0xb9,0xb9,0x01,0x42, +0xb9,0xb9,0xa1,0xb9,0xb9,0x0e,0x40,0x41,0x39,0x48,0x18,0x28,0x35,0x1e,0x50,0x43,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1b,0x1f,0x49,0x48,0x42,0x34,0x1e,0x2e,0x48,0x56,0x51,0x40,0x0e,0x21,0x3e,0x30,0x1d,0x6d,0x35,0x36,0x44,0x45,0x21,0x51,0x45,0x2f,0x26,0x45,0x5f,0x02,0x85,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0x00,0x39, +0xfd,0xff,0x04,0xad,0x05,0x91,0x00,0x2f,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x00,0x25,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02, +0x23,0x22,0x06,0x07,0x1e,0x03,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x04,0xad,0x16,0x51,0x68,0x21,0x04,0x26,0x6c,0x4f,0x31,0x65,0x60,0x57,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x15,0x44,0x6e,0x53,0x34,0x0b,0x06,0x0f,0x26,0x45,0xfe,0x55, +0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x54,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x99,0xa7,0x3a,0x36,0x36,0x3b,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x42,0x24,0x0b,0x41,0x67,0x80,0x3f,0x26,0x43,0x33,0x1d,0x01, +0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0e,0x0e,0x09,0x03,0x2c,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x04,0x00,0x82,0xfe,0x10,0x05,0x91,0x04,0xcc,0x00,0x35,0x00,0x4e,0x00,0x52,0x00,0x56,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e, +0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d, +0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xfe,0xa1,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xc2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58, +0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x05,0x0c,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x4a,0xb5,0xb5,0xb5, +0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0x48,0x05,0x3e,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x37,0x00,0x00,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26, +0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x06,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x63,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c, +0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0xfe,0x0d,0xb5,0xb5,0xb5,0x05,0x78,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x00,0x1f,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x00,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23, +0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23, +0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0d,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xdf,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x01,0xc4,0x03,0x04,0x25, +0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x6e,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x82,0xfd,0xc0,0x06,0xae,0x04,0x68,0x00,0x44,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34, +0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x06,0xae,0x16,0x43,0x67, +0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e,0x21,0x2a,0x3b,0x52,0xfb,0x36,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55, +0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xc2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57, +0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0x03,0x64,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x5e,0xb5,0xb5,0xb5,0x00,0x00,0x04,0x00,0x9a,0xfe,0x10,0x05,0x91,0x04,0x78,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06, +0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b, +0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0x9d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0xb2,0xb9,0xb9,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58,0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23, +0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0xfe,0xbb,0xb5,0xb5,0xb5,0x04,0xfe,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0x48,0x04,0xb2,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x22,0x00,0x00,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01, +0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x06,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x4f,0xb9,0xb9,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0xfe,0x0d,0xb5,0xb5,0xb5,0x04, +0xa2,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x00,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xf2, +0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0xec,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x4f,0xb9,0xb9,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0xfb,0x97,0xb5,0xb5,0xb5,0x04, +0xa2,0xb5,0x00,0x04,0x00,0x9a,0xfd,0xc0,0x06,0xae,0x03,0xba,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x50,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e, +0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x06,0xae,0x16,0x43,0x67,0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d, +0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e,0x21,0x2a,0x3b,0x52,0xfb,0xf8,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x9b,0xb9,0xb9,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c, +0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0xfd,0x27,0xb5,0xb5,0xb5,0x04,0x90,0xb5,0x00,0x02,0xff,0xa6,0xfd,0xff,0x03,0x5a,0x02,0x5e,0x00,0x28,0x00,0x38,0x00,0x00,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e, +0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x03,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x02,0x31,0x1a,0x28,0x1c,0x0f,0x0f,0x0d,0x3c,0x6c,0x30,0x8b,0x3f,0x51,0x23,0x56,0x5f,0x64,0x30,0x45,0x6f,0x4f,0x2a,0x2e,0x4e,0x67,0x39,0x4e,0x9a,0x4b,0x07,0x05,0x13,0x1f, +0x29,0x16,0xbc,0x46,0x78,0x2a,0x37,0x7c,0x47,0x26,0x31,0x1d,0x0b,0x0f,0x23,0x37,0x02,0x5e,0x41,0x8e,0x8f,0x8b,0x3e,0x3e,0x6d,0x31,0x2b,0x72,0x4a,0x57,0x61,0x44,0x36,0x4a,0x2e,0x15,0x22,0x40,0x5d,0x3b,0x3d,0x5b,0x3a,0x1d,0x1d,0x20,0x31,0x41,0x1e,0x4b,0x8e,0x88,0x83,0x3f,0xfc,0x49,0x33,0x39,0x18,0x19,0x0d,0x16,0x1d,0x10, +0x10,0x1c,0x15,0x0c,0x00,0x02,0xff,0xa6,0xfd,0xff,0x03,0x5a,0x02,0x5e,0x00,0x30,0x00,0x40,0x00,0x00,0x01,0x16,0x16,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x03,0x32, +0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x02,0x31,0x1e,0x2b,0x0f,0x06,0x1c,0x31,0x49,0x32,0x16,0x3f,0x4a,0x1a,0x0f,0x0d,0x3c,0x6c,0x30,0x8b,0x3f,0x51,0x23,0x56,0x5f,0x64,0x30,0x45,0x6f,0x4f,0x2a,0x2e,0x4e,0x67,0x39,0x4e,0x9a,0x4b,0x07,0x05,0x13,0x1f,0x29,0x16,0xbc,0x46,0x78,0x2a,0x37,0x7c,0x47,0x26, +0x31,0x1d,0x0b,0x0f,0x23,0x37,0x02,0x5e,0x4c,0xa5,0x53,0x21,0x31,0x20,0x0f,0xa7,0x24,0x21,0x3e,0x6d,0x31,0x2b,0x72,0x4a,0x57,0x61,0x44,0x36,0x4a,0x2e,0x15,0x22,0x40,0x5d,0x3b,0x3d,0x5b,0x3a,0x1d,0x1d,0x20,0x31,0x41,0x1e,0x4b,0x8e,0x88,0x83,0x3f,0xfc,0x49,0x33,0x39,0x18,0x19,0x0d,0x16,0x1d,0x10,0x10,0x1c,0x15,0x0c,0x00, +0x00,0x03,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x00,0x22,0x00,0x36,0x00,0x3a,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01, +0x23,0x35,0x33,0x6c,0xad,0x52,0x64,0x7b,0x45,0x1a,0x02,0x53,0x59,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x34,0x72,0xb6,0x82,0x5b,0xac,0x64,0x02,0xa9,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xfe,0x93,0xb9,0xb9,0xfe,0xf9,0x2c,0x23,0x42,0x68,0x82,0x41, +0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xed,0x84,0x74,0xd3,0xa2,0x60,0x26,0x2e,0x02,0x66,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0xfe,0x8c,0xb5,0x00,0x03,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x00,0x27,0x00,0x38,0x00,0x3c,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e, +0x02,0x37,0x36,0x36,0x37,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x01,0x23,0x35,0x33,0x6c,0xad,0x52,0x45,0x66,0x48,0x2c,0x0c,0x05,0x0b,0x04,0x75,0x5c,0x92,0x66,0x36,0x30, +0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x35,0x07,0xbc,0xbd,0x08,0x3e,0x74,0xab,0x75,0x5b,0xac,0x64,0x02,0x8d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1b,0x7c,0x87,0x65,0x04,0x0e,0xfe,0x7f,0xb9,0xb9,0xfe,0xf9,0x2c,0x23,0x21,0x39,0x4c,0x2c,0x13,0x3d,0x26,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x56,0x48,0xbf,0x6d,0xa7, +0x66,0xb5,0x88,0x50,0x26,0x2e,0x02,0xe1,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0xfe,0x23,0xb5,0x00,0x00,0x04,0x00,0x02,0xfe,0x8d,0x03,0xfe,0x03,0x62,0x00,0x3d,0x00,0x51,0x00,0x55,0x00,0x59,0x00,0x00,0x25,0x16,0x16,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23, +0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x27,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x15,0x1d,0x47,0x26,0x19,0x23,0x23,0x23, +0x23,0x22,0x17,0x3f,0x4a,0x51,0x27,0x32,0x5e,0x4d,0x35,0x07,0x10,0x29,0x49,0x39,0x21,0x83,0x03,0x01,0x41,0x67,0x7f,0x3e,0x10,0x22,0x0a,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x82,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0x87,0xb9,0xb9, +0x01,0x42,0xb9,0xb9,0xa5,0x05,0x07,0x33,0x20,0x20,0x34,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x25,0x4f,0x7b,0x56,0x20,0x16,0x1e,0x05,0x7d,0xb1,0x71,0x34,0x01,0x01,0x07,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0xa2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20, +0x3e,0x44,0x4a,0x2b,0x18,0x4f,0xfd,0x75,0xb5,0xb5,0xb5,0x00,0x00,0x04,0x00,0x02,0xfe,0x8d,0x04,0x1c,0x03,0x62,0x00,0x37,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x2e,0x03,0x35,0x34, +0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x1c,0x30,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x5e,0x4d,0x35,0x07,0x10,0x29,0x49,0x39,0x21,0x83,0x03,0x01,0x41,0x67,0x7f,0x3e,0x0e,0x25, +0x09,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x39,0x8b,0xfe,0xd3,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0x87,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x99,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x25,0x4f,0x7b,0x56,0x20,0x16,0x1e,0x05, +0x7d,0xb1,0x71,0x34,0x01,0x01,0x07,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xd4,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0xfd,0x75,0xb5,0xb5,0xb5,0x00,0x00,0x01,0x00,0x00,0x06,0x40,0x02,0x35,0x07,0xaa,0x00,0x1b, +0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x0c,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x06,0x40,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23, +0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x02,0x00,0x00,0x06,0x76,0x02,0x33,0x08,0x14,0x00,0x2a,0x00,0x37,0x00,0x00,0x01,0x06,0x07,0x06,0x07,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x37,0x1e,0x03,0x33,0x32,0x37,0x36,0x37,0x26,0x27,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x37,0x27,0x34,0x26, +0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x02,0x33,0x25,0x29,0x0b,0x11,0x22,0x72,0x54,0x21,0x44,0x3e,0x31,0x0d,0x44,0x07,0x1a,0x27,0x34,0x22,0x2d,0x26,0x12,0x10,0x10,0x10,0x1c,0x2c,0x1b,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x0f,0x0e,0x6e,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x24,0x1c,0x0b,0x07,0x07,0x0c,0x09, +0x14,0x12,0x25,0x31,0x13,0x22,0x31,0x1e,0x35,0x0e,0x22,0x1e,0x14,0x0b,0x05,0x07,0x02,0x05,0x09,0x24,0x38,0x27,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x14,0x15,0x06,0x07,0x19,0x2a,0x21,0x24,0x1f,0x1f,0x24,0x02,0x1a,0x00,0x00,0x01,0x00,0x00,0xfe,0x89,0x02,0x35,0xff,0xf3,0x00,0x1b,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02, +0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x0c,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0xfe,0x89,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00, +0x00,0x02,0x00,0x00,0x06,0x40,0x02,0x7b,0x08,0x72,0x00,0x1b,0x00,0x37,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x27,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22, +0x06,0x15,0x14,0x17,0x52,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x9f,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x06,0x40,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e, +0x20,0x13,0x0d,0x9d,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x04,0x00,0x00,0x06,0x76,0x02,0xdd,0x08,0xfa,0x00,0x28,0x00,0x51,0x00,0x5e,0x00,0x6c,0x00,0x00,0x01,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x37,0x1e,0x03,0x33,0x32,0x37,0x2e,0x03, +0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x37,0x01,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x07,0x2e,0x03,0x23,0x22,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x06,0x06,0x07,0x17,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x05,0x34,0x26,0x23,0x22, +0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x36,0x02,0xdd,0x26,0x28,0x0f,0x2e,0x40,0x53,0x34,0x21,0x44,0x3e,0x31,0x0d,0x44,0x07,0x1a,0x27,0x34,0x22,0x43,0x31,0x19,0x2f,0x24,0x16,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x08,0x0e,0x07,0xfd,0x35,0x25,0x29,0x0f,0x2e,0x40,0x52,0x35,0x21,0x44,0x3e,0x30,0x0e,0x44,0x08,0x19, +0x27,0x34,0x22,0x44,0x31,0x19,0x2f,0x25,0x16,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x08,0x0e,0x07,0x6e,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x24,0x1c,0x0b,0x01,0xdd,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x12,0x20,0x0e,0x0b,0x07,0x07,0x0c,0x09,0x1a,0x2d,0x21,0x14,0x13,0x22,0x31,0x1e,0x35,0x0e,0x22,0x1e,0x14,0x17,0x03,0x15,0x24, +0x34,0x23,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x16,0x13,0x03,0x06,0x04,0x01,0x14,0x0c,0x09,0x19,0x2e,0x21,0x14,0x13,0x22,0x31,0x1e,0x35,0x0d,0x22,0x1e,0x15,0x18,0x03,0x15,0x24,0x34,0x22,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x15,0x13,0x02,0x07,0x03,0x19,0x2a,0x21,0x24,0x1f,0x1f,0x24,0x03,0x1b,0xb1,0x2a,0x21,0x24, +0x1f,0x1f,0x24,0x01,0x01,0x1b,0x00,0x02,0x00,0x00,0xfd,0xc1,0x02,0x7b,0xff,0xf3,0x00,0x1b,0x00,0x37,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x27,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15, +0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x52,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x9f,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0xfd,0xc1,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b, +0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x9d,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x01,0x00,0x64,0x06,0x76,0x01,0x1d,0x07,0x2b,0x00,0x03,0x00,0x00,0x01,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x06,0x76,0xb5,0x00,0x00,0x02,0x00,0x64,0x06,0x76, +0x02,0x5f,0x07,0x2b,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x06,0x76,0xb5,0xb5,0xb5,0x00,0x00,0x02,0x00,0x00,0x06,0x41,0x02,0x3f,0x07,0xda,0x00,0x1c,0x00,0x2b,0x00,0x00,0x01,0x26,0x27,0x06,0x07,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16, +0x17,0x16,0x17,0x36,0x37,0x17,0x06,0x07,0x06,0x07,0x16,0x17,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x01,0xa4,0x09,0x0b,0x1a,0x1e,0x36,0x43,0x28,0x50,0x3f,0x28,0x5a,0x51,0x3b,0x6c,0x2b,0x27,0x1e,0x37,0x2a,0x1c,0x1a,0x21,0x0e,0x10,0x0b,0x07,0xb5,0x1e,0x4a,0x28,0x0f,0x20,0x1b,0x11,0x47,0x3d, +0x4c,0x3f,0x11,0x06,0x41,0x23,0x20,0x04,0x04,0x06,0x0d,0x27,0x48,0x3a,0x51,0x5d,0x3e,0x36,0x30,0x3f,0x0f,0x10,0x64,0x07,0x0b,0x04,0x05,0x23,0x26,0xcf,0x2a,0x30,0x07,0x12,0x1e,0x17,0x29,0x27,0x0a,0x20,0x00,0x01,0x00,0x64,0xfe,0xa6,0x01,0x1d,0xff,0x5b,0x00,0x03,0x00,0x00,0x01,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0xfe,0xa6, +0xb5,0x00,0x00,0x02,0x00,0x64,0xfe,0xa6,0x02,0x5f,0xff,0x5b,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0xa6,0xb5,0xb5,0xb5,0x00,0x00,0x02,0x00,0x00,0xfd,0xd1,0x02,0x3f,0xff,0x6a,0x00,0x1c,0x00,0x2b,0x00,0x00,0x01,0x26,0x27,0x06,0x07,0x06,0x23,0x22, +0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x17,0x36,0x37,0x17,0x06,0x07,0x06,0x07,0x16,0x17,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x01,0xa4,0x09,0x0b,0x1b,0x1d,0x36,0x43,0x28,0x50,0x3f,0x28,0x5a,0x51,0x3b,0x6c,0x2b,0x27,0x1e,0x37,0x2a,0x1c,0x1a,0x21,0x0e,0x10,0x0b,0x07,0xb5,0x1e, +0x4a,0x28,0x0f,0x20,0x1b,0x11,0x47,0x3d,0x4c,0x40,0x11,0xfd,0xd1,0x23,0x21,0x05,0x03,0x07,0x0d,0x27,0x48,0x3a,0x51,0x5d,0x3e,0x36,0x30,0x3f,0x0f,0x10,0x64,0x07,0x0a,0x05,0x04,0x24,0x26,0xd0,0x29,0x30,0x07,0x12,0x1e,0x17,0x29,0x27,0x0a,0x20,0x00,0x02,0x00,0x00,0x06,0x76,0x02,0xae,0x08,0x74,0x00,0x03,0x00,0x07,0x00,0x00, +0x11,0x25,0x17,0x05,0x13,0x25,0x17,0x05,0x02,0x22,0x1e,0xfd,0xde,0x50,0x02,0x22,0x1e,0xfd,0xde,0x06,0xde,0x9c,0x68,0x9c,0x01,0x62,0x9c,0x68,0x9c,0x00,0x00,0x04,0xff,0xbf,0x06,0x55,0x03,0xd2,0x08,0x0e,0x00,0x21,0x00,0x2f,0x00,0x51,0x00,0x5f,0x00,0x00,0x01,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32, +0x36,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x05,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37, +0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x17,0x28,0x11,0x18,0x30,0x15,0x72,0x5e,0x12,0x33,0x5a,0x39,0x01,0x0b,0x07,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x01,0xcf,0x17,0x28,0x11,0x18,0x30,0x15,0x72,0x5e, +0x12,0x33,0x5a,0x39,0x01,0x0b,0x07,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x06,0x55,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25, +0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0xe9,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x02,0x00,0x00,0xfd,0x6c,0x02,0xae,0xff,0x6a,0x00,0x03,0x00,0x07, +0x00,0x00,0x11,0x25,0x17,0x05,0x13,0x25,0x17,0x05,0x02,0x22,0x1e,0xfd,0xde,0x50,0x02,0x22,0x1e,0xfd,0xde,0xfd,0xd4,0x9c,0x68,0x9c,0x01,0x62,0x9c,0x68,0x9c,0x00,0x00,0x02,0x00,0x00,0x06,0x76,0x01,0xc8,0x08,0xdd,0x00,0x23,0x00,0x35,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34, +0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x3c,0x5c,0x2b,0x34,0x41,0x25,0x0e,0x15,0x2d,0x17,0x24,0x42,0x33,0x1e,0x1a,0x2e,0x3f,0x24,0x26,0x45,0x1d,0x1d,0x1d,0x1e,0x3f,0x63,0x45,0x31,0x5c,0x36,0x01,0x6a,0x01,0x11, +0x1d,0x25,0x15,0x0f,0x1c,0x17,0x0e,0x12,0x1d,0x27,0x15,0x13,0x28,0x07,0x01,0x18,0x12,0x1e,0x31,0x3d,0x20,0x08,0x0a,0x16,0x2a,0x3d,0x28,0x22,0x47,0x39,0x25,0x2b,0x2e,0x2d,0x70,0x47,0x3e,0x6c,0x51,0x2f,0x10,0x19,0x01,0x3d,0x14,0x38,0x33,0x24,0x0f,0x1a,0x24,0x14,0x13,0x1f,0x15,0x0c,0x06,0x00,0x00,0x03,0x00,0x0a,0x06,0x7b, +0x02,0x06,0x08,0x1c,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x00,0x13,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x15,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x32,0x36,0x37,0x23,0x16,0x16,0x13,0x22,0x06,0x07,0x33,0x26,0x26,0x0a,0x5c,0x0a,0x50,0x42,0x42,0x52,0x0b,0x65,0x64,0x08,0x50,0x48,0x45,0x51,0x08,0x5a,0xfb,0x2a,0x22, +0x04,0xa3,0x04,0x25,0x2a,0x27,0x26,0x05,0xa0,0x05,0x23,0x07,0x7e,0x50,0x4e,0x4e,0x50,0x58,0x55,0x56,0x56,0x55,0x60,0x2b,0x35,0x35,0x2b,0x01,0x0b,0x25,0x2e,0x2d,0x26,0x00,0x00,0x02,0x00,0x05,0x06,0x7c,0x02,0x01,0x07,0xdf,0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x21,0x15,0x21,0x25,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01, +0x5b,0xb9,0xb9,0x06,0xd4,0x58,0xae,0xb5,0x00,0x02,0x00,0x05,0xfe,0x07,0x02,0x01,0xff,0x6a,0x00,0x03,0x00,0x07,0x00,0x00,0x17,0x21,0x15,0x21,0x01,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01,0x5b,0xb9,0xb9,0x96,0x58,0xfe,0xf5,0xb5,0x00,0x01,0x00,0x00,0x06,0x62,0x01,0x49,0x08,0x48,0x00,0x06,0x00,0x00,0x11,0x25,0x15,0x07, +0x17,0x15,0x25,0x01,0x49,0xe7,0xe7,0xfe,0xb7,0x07,0x8e,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0x06,0x62,0x01,0x49,0x08,0x48,0x00,0x06,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x07,0x1c,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0xfd,0x84,0x01,0x49, +0xff,0x6a,0x00,0x06,0x00,0x00,0x11,0x25,0x15,0x07,0x17,0x15,0x25,0x01,0x49,0xe7,0xe7,0xfe,0xb7,0xfe,0xb0,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0xfd,0x84,0x01,0x49,0xff,0x6a,0x00,0x06,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0xfe,0x3e,0xba,0x7d,0x76,0x76,0x7d, +0xba,0x00,0x00,0x02,0x00,0x00,0x06,0x62,0x02,0xd9,0x08,0x48,0x00,0x06,0x00,0x0d,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x0d,0x02,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x01,0x90,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x07,0x1c,0xba,0x7d,0x76,0x76,0x7d,0xba,0x72,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x03, +0x00,0x64,0x06,0x62,0x04,0x41,0x08,0x48,0x00,0x03,0x00,0x0a,0x00,0x11,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x05,0x35,0x37,0x27,0x35,0x0d,0x02,0x35,0x37,0x27,0x35,0x05,0x01,0x1d,0xb9,0xb9,0x01,0x94,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x01,0x90,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x06,0xf8,0xb5,0x91,0xba,0x7d,0x76,0x76,0x7d,0xba,0x72, +0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x02,0x00,0x64,0x06,0x62,0x02,0xb1,0x08,0x48,0x00,0x03,0x00,0x0a,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x1d,0xb9,0xb9,0x01,0x94,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x06,0xf8,0xb5,0x91,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x03,0x00,0x00,0x06,0x55,0x02,0x84, +0x08,0x0e,0x00,0x21,0x00,0x2f,0x00,0x33,0x00,0x00,0x01,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x25,0x23,0x35,0x33,0x01,0xf6,0x17,0x28,0x11, +0x18,0x30,0x15,0x72,0x5e,0x12,0x33,0x5a,0x39,0x01,0x0c,0x08,0x36,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0xfe,0x8a,0xb9,0xb9,0x06,0x55,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x02,0x45,0x43,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42, +0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x11,0xb5,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x0b,0xf8,0x02,0x3e,0x00,0x45,0x00,0x2c,0xb1,0x40,0x37,0xb8,0x04,0xfb,0xb5,0x0e,0x45,0x45,0x3c,0x3c,0x30,0xb8,0x04,0xfb,0xb4,0x15,0x05,0x0e,0x28,0x1f,0xb9,0x04,0xfb,0x00,0x21,0x00,0x2f,0xfd, +0x32,0xde,0x32,0xdc,0xed,0x32,0x2f,0x33,0x2f,0x10,0xed,0x32,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x33,0x15,0x21,0x22,0x26,0x27,0x27,0x37,0x21,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x33,0x32,0x3e,0x02,0x35,0x33,0x14, +0x16,0x33,0x32,0x3e,0x02,0x35,0x0b,0xf8,0x16,0x2d,0x44,0x2e,0x2d,0x4a,0x17,0x07,0x12,0x24,0x26,0x28,0x16,0x29,0x39,0x2c,0x25,0x2b,0x36,0x26,0x20,0x24,0x14,0x05,0x0b,0x17,0x21,0x17,0x8c,0xf8,0x84,0x55,0xb2,0x51,0x1c,0x05,0x07,0xa7,0x17,0x15,0x1a,0x38,0x56,0x3c,0x2a,0x3d,0x30,0x28,0x29,0x2f,0x20,0x20,0x2d,0x1c,0x0d,0x6e, +0x26,0x33,0x13,0x18,0x0e,0x06,0x02,0x3d,0x45,0x6f,0x4e,0x2a,0x27,0x2a,0x1a,0x20,0x11,0x06,0x14,0x1e,0x24,0x1e,0x14,0x11,0x1a,0x20,0x10,0x15,0x30,0x2e,0x27,0x0b,0xa7,0x0e,0x0f,0x85,0x05,0x25,0x5c,0x23,0x30,0x5a,0x47,0x2b,0x17,0x22,0x27,0x22,0x17,0x20,0x30,0x37,0x17,0x54,0x4a,0x1f,0x30,0x37,0x18,0x00,0x00,0x01,0x00,0xbc, +0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x07,0x00,0x00,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0xfa,0xfd,0x6a,0xa8,0xa8,0x03,0x25,0x97,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x07,0x00,0x00,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0x04,0xfe,0x46,0xa4,0xa4,0x02,0x5c, +0x8b,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0x33,0x05,0x9a,0x00,0x0b,0x00,0x00,0x01,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x04,0x33,0xa8,0xf6,0xa8,0xf5,0xa8,0x05,0x9a,0xfe,0x1e,0x01,0x4a,0xfa,0xfe,0x05,0x02,0xfe,0xb6,0x01,0xe2,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x03,0xe8, +0x05,0x3f,0x00,0x0b,0x00,0x00,0x01,0x11,0x23,0x35,0x23,0x11,0x23,0x11,0x23,0x15,0x23,0x11,0x03,0xe8,0x9e,0xdc,0xa4,0xdc,0x9e,0x05,0x3f,0xfe,0x8e,0xe6,0xfb,0x4d,0x04,0xb3,0xe6,0x01,0x72,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x01,0xef,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00, +0x02,0x06,0x02,0x0f,0x00,0x00,0x00,0x01,0x00,0xbc,0xfe,0x8c,0x04,0x98,0x05,0x9a,0x00,0x12,0x00,0x00,0x25,0x01,0x27,0x01,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x04,0x98,0xfe,0x30,0x63,0x01,0x49,0xfd,0xe0,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x05,0xfe,0x87, +0x74,0x01,0x0b,0x02,0x85,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x10,0xff,0xe9,0x06,0xe4,0x05,0x9a,0x00,0x28,0x00,0x00,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x23,0x03,0x06,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x12,0x13, +0x21,0x01,0x16,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x06,0xe4,0xcd,0xfe,0xb6,0x10,0x11,0x04,0x05,0x11,0x0c,0xfe,0xac,0xce,0x01,0xe0,0xfe,0xa4,0x7a,0x6d,0x10,0x2d,0x14,0x52,0xc5,0x4f,0x3a,0x34,0x3d,0x3e,0x36,0x37,0x71,0x45,0x01,0x76,0x01,0x25,0x0e,0x1a,0x0b,0x04,0x1f,0x19,0x01,0x31,0xc1,0xfe,0x3d,0x02,0x25,0x1b,0x2c, +0x0b,0x24,0x18,0xfd,0xdb,0x02,0xd1,0x02,0x31,0xfd,0x02,0x71,0xa3,0x36,0xd1,0x15,0x9e,0x1d,0x4a,0x4a,0x02,0x6e,0x02,0x19,0xfe,0x08,0x19,0x32,0x19,0x41,0x27,0x01,0xf4,0xfd,0x39,0x00,0x00,0x01,0x00,0x10,0xff,0xf2,0x05,0x40,0x04,0x00,0x00,0x21,0x00,0x00,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x03, +0x23,0x02,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x13,0x16,0x16,0x17,0x33,0x01,0x05,0x40,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xcd,0xbd,0x01,0x5d,0xf5,0x30,0x29,0x64,0x63,0xa8,0x31,0x27,0x22,0x2a,0xdc,0x3f,0x01,0x1f,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x04,0x00,0xfd,0xfa,0xfe,0x06, +0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfe,0xb4,0x01,0xf6,0x01,0x7f,0xfe,0x0f,0xc9,0xc9,0x0e,0x8d,0x12,0x03,0x85,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x05,0xe0,0x05,0x9a,0x00,0x11,0x00,0x19,0x00,0x00,0x01,0x11,0x23,0x11,0x21,0x32,0x17,0x16,0x17,0x13,0x33,0x01,0x01,0x23,0x01,0x06,0x06,0x23, +0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0x01,0x8a,0xe7,0x7d,0x73,0x0b,0xf1,0xc1,0xfe,0x3d,0x01,0xc9,0xcd,0xfe,0x63,0x42,0xab,0x68,0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0x70,0x66,0xb5,0x01,0x8b,0xfd,0x39,0xfd,0x2d,0x02,0x80,0x32,0x30,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x02, +0x00,0xa6,0xfe,0x29,0x05,0xea,0x04,0x18,0x00,0x1a,0x00,0x2f,0x00,0x00,0x09,0x02,0x23,0x03,0x0e,0x03,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x13,0x01,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0xea,0xfe,0xa8,0x01,0x52,0xbf,0xe2,0x13,0x4e, +0x72,0x95,0x5a,0xc7,0x6c,0x04,0xa4,0xa4,0x04,0x79,0xe9,0x58,0x8f,0x6a,0x42,0x0b,0xe7,0xfc,0x15,0x2b,0x4e,0x6b,0x40,0x4b,0x76,0x52,0x2b,0x29,0x4c,0x6d,0x43,0x47,0x75,0x53,0x2e,0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x74,0x5b,0x93,0x67,0x37,0xac,0xfd,0x95,0x05,0xd7,0xb4,0xcc,0x3a,0x6b,0x99,0x5e,0x01,0x84,0xfe,0x31,0x8f,0x3f, +0x6f,0x52,0x30,0x3b,0x70,0x9f,0x65,0x55,0x87,0x5f,0x32,0x35,0x5e,0x80,0x00,0x02,0x00,0x3d,0x00,0x00,0x06,0x4d,0x05,0x9a,0x00,0x24,0x00,0x2f,0x00,0x00,0x21,0x21,0x11,0x23,0x22,0x0e,0x02,0x07,0x03,0x23,0x13,0x3e,0x03,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x11,0x23, +0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x06,0x4d,0xfd,0x08,0xd1,0x1e,0x34,0x31,0x2f,0x19,0xb4,0xc8,0xda,0x0a,0x21,0x2b,0x33,0x1d,0x47,0x70,0x4e,0x29,0x44,0x7a,0xaa,0x66,0x03,0xd0,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0xfd,0x08,0xe9,0x8f,0x9c,0x2a,0x4d,0x6d,0x43,0x02,0x62,0x0b,0x25,0x47,0x3b,0xfe,0x50,0x01,0xdf,0x16,0x34, +0x30,0x29,0x0b,0x04,0x10,0x43,0x60,0x7b,0x47,0x5c,0x95,0x6a,0x39,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x02,0x62,0x02,0x08,0x85,0x7b,0x3d,0x62,0x44,0x25,0x00,0x00,0x03,0x00,0x3e,0xff,0xe8,0x06,0x3a,0x04,0x18,0x00,0x28,0x00,0x31,0x00,0x38,0x00,0x00,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x22, +0x07,0x03,0x23,0x13,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x21,0x15,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x07,0x11,0x23,0x22,0x15,0x14,0x33,0x06,0x3a,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88,0xdd,0x63,0xa1,0x77,0x48,0x0a,0x8c,0x63,0x51,0x85,0xbe,0xac,0x3d,0x54,0x79,0x7d,0x33, +0x61,0x8b,0x58,0x01,0x66,0x3e,0x9b,0x5a,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0xab,0xc2,0xcf,0xc9,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x3c,0x72,0xa7,0x6b,0xa0,0xfe,0xf8,0x01,0x3c,0x6f,0x22,0x10,0x8f,0x6d,0x44,0x6d,0x4d,0x29,0x62,0x3a,0x40,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42, +0x31,0x01,0x43,0x9d,0xa6,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x00,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x27,0x37,0x17,0x37,0x33,0x01,0x17,0x07,0x27,0x03,0x04,0xa2,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xa8,0x04,0x07,0x13,0x0c,0x01,0x04,0x7f,0x6a, +0x79,0xb0,0xd1,0xfe,0xe6,0x92,0x6e,0x8b,0xe6,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x0b,0x18,0x0e,0x01,0x30,0x8d,0x69,0x82,0xcd,0xfe,0xc5,0x9c,0x71,0x99,0xfe,0xff,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x14,0x00,0x00,0x01,0x37,0x33,0x07,0x17,0x07,0x27,0x07,0x01,0x23,0x01,0x23,0x11,0x23, +0x11,0x33,0x11,0x33,0x37,0x27,0x37,0x02,0x84,0x78,0xd7,0xed,0x66,0x61,0x5e,0x95,0x02,0x00,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0xdf,0x57,0x5f,0x03,0x7d,0x83,0xf6,0x77,0x54,0x6e,0x9b,0xfd,0xee,0x01,0xec,0xfe,0x14,0x04,0x00,0xfe,0x2b,0xf3,0x66,0x55,0x00,0x00,0x01,0x00,0x10,0xfe,0x66,0x07,0x73,0x05,0x9a,0x00,0x2e,0x00,0x00, +0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x03,0x06,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x12,0x13,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x03,0xfe,0xa3,0x9b,0xbe,0xc9,0x42,0x7a,0xb0,0x6d,0x46,0xa8,0xfe,0x72,0x6d,0x10,0x2d,0x14,0x52,0xc5, +0x4f,0x3a,0x34,0x3d,0x3e,0x36,0x37,0x71,0x45,0x02,0xc2,0x4a,0x93,0xee,0xa8,0x5c,0x4b,0x90,0xd2,0x86,0xae,0xfe,0xb2,0xb8,0x6c,0xde,0xcc,0x69,0xb9,0x89,0x4f,0xfd,0x5e,0x05,0x02,0xfd,0x02,0x71,0xa3,0x36,0xd1,0x15,0x9e,0x1d,0x4a,0x4a,0x02,0x6e,0x02,0x19,0xfd,0xa0,0x5f,0xac,0xf0,0x91,0x7d,0xd6,0x9c,0x59,0x00,0x01,0x00,0x10, +0xfe,0x66,0x05,0xf1,0x04,0x00,0x00,0x2c,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x23,0x06,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x02,0xed,0x75,0x8b,0x54,0x81,0x59,0x2e,0x39,0x6a,0x97,0x5e,0x20, +0xa3,0xee,0x15,0x46,0x65,0x85,0x53,0x31,0x27,0x22,0x2a,0xdc,0x3f,0x02,0x1a,0x42,0x7b,0xc8,0x8e,0x4d,0x49,0x87,0xbf,0x77,0x9a,0xfe,0xa0,0xa0,0x4e,0x30,0x5b,0x85,0x54,0x5d,0x94,0x67,0x38,0xfe,0x1a,0x03,0x75,0xfb,0xfe,0xa9,0xd4,0x5d,0x0e,0x8d,0x12,0x03,0x85,0xfe,0x74,0x4c,0x8d,0xc8,0x7b,0x6b,0xb6,0x85,0x4c,0x00,0x00,0x01, +0x00,0xbc,0xfe,0x66,0x07,0xc1,0x05,0x9a,0x00,0x25,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x04,0x4c,0xa3,0x9b,0xbe,0xc9,0x42,0x7a,0xb0,0x6d,0x46,0xa8,0xfd,0x1a,0xa8,0xa8,0x02, +0xe6,0xa8,0x4a,0x93,0xee,0xa8,0x5c,0x4b,0x90,0xd2,0x86,0xae,0xfe,0xb2,0xb8,0x6c,0xde,0xcc,0x69,0xb9,0x89,0x4f,0xfd,0x5e,0x02,0xa3,0xfd,0x5d,0x05,0x9a,0xfd,0xa0,0x02,0x60,0xfd,0xa0,0x5f,0xac,0xf0,0x91,0x7d,0xd6,0x9c,0x59,0x00,0x01,0x00,0xa6,0xfe,0x66,0x06,0x58,0x04,0x00,0x00,0x27,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x3e, +0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x03,0x54,0x75,0x8b,0x54,0x81,0x59,0x2e,0x39,0x6a,0x97,0x5e,0x20,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x42,0x7b,0xc8,0x8e,0x4d,0x49,0x87,0xbf,0x77,0x9a,0xfe,0xa0,0xa0, +0x4e,0x30,0x5b,0x85,0x54,0x5d,0x94,0x67,0x38,0xfe,0x1a,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfe,0x74,0x4c,0x8d,0xc8,0x7b,0x6b,0xb6,0x85,0x4c,0x00,0x00,0x01,0x00,0xa6,0xfe,0x7f,0x05,0x41,0x05,0x9a,0x00,0x16,0x00,0x00,0x13,0x33,0x11,0x36,0x33,0x32,0x1e,0x02,0x15,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x34,0x23, +0x22,0x07,0x11,0x23,0xa6,0xa8,0xe5,0xc5,0x5e,0x92,0x65,0x34,0xc0,0x9b,0xcd,0xf6,0xb1,0xe4,0xa8,0x05,0x9a,0xfd,0x7b,0x79,0x32,0x5f,0x8a,0x58,0xfe,0x7d,0xfd,0xe7,0x01,0x81,0x02,0x13,0xe7,0x6e,0xfd,0x74,0x00,0x01,0x00,0x98,0xfe,0x8b,0x04,0x76,0x04,0x00,0x00,0x13,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x11, +0x23,0x11,0x33,0x11,0x36,0x33,0x20,0x11,0x15,0x33,0x04,0x76,0x8d,0xae,0xc2,0x94,0xaa,0xa3,0xa3,0xb5,0x97,0x01,0x58,0x97,0xfe,0x8b,0x01,0x75,0x01,0x52,0xe1,0x56,0xfe,0x23,0x04,0x00,0xfe,0x64,0x62,0xfe,0x94,0xcf,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x1a,0x00,0x00,0x01,0x07,0x11,0x23,0x11,0x07,0x35,0x37, +0x35,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x37,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xaf,0x32,0x58,0x76,0x45,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0x02,0xec,0x92,0xfd,0xa6,0x01,0xf8,0x6a,0xa5,0x68,0xd9,0x8c,0xa6,0x51,0x81,0x5a,0x30,0x12,0x94,0x1b,0xd9,0xfe,0x5f,0x8f,0x00,0x01,0x00,0x35, +0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x18,0x00,0x00,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xba,0x0d,0x3b,0x52,0x67,0x39,0x4b,0x2c,0x30,0x3d,0x7b,0x23,0x05,0x09,0x8c,0xfb,0x83,0x03,0x74,0x8c,0x7d,0x8c,0x3a,0x5d, +0x40,0x22,0x12,0x94,0x1b,0x6e,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x53,0x05,0xfe,0x00,0x27,0x00,0x38,0x00,0x00,0x01,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x03,0x04,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e, +0x02,0x35,0x34,0x2e,0x02,0x03,0xe7,0xa9,0xab,0x32,0x51,0x3a,0x20,0x19,0x36,0x55,0x3c,0x72,0xa7,0x6e,0x36,0x4a,0x88,0xc0,0x77,0x6d,0xb5,0x83,0x49,0xd3,0xcc,0xee,0x36,0x65,0x91,0x5a,0xa6,0xbf,0xfe,0x92,0x2f,0x57,0x7a,0x4b,0x4f,0x7f,0x59,0x30,0x22,0x4a,0x75,0x05,0xbe,0xb7,0x65,0x12,0x21,0x2f,0x1d,0x18,0x31,0x36,0x3e,0x24, +0x45,0x7c,0x81,0x8f,0x5a,0x75,0xbb,0x83,0x47,0x46,0x7f,0xb1,0x6c,0x9c,0x01,0x01,0x58,0x93,0xa3,0x40,0x63,0x44,0x23,0xfd,0x75,0x95,0xfe,0xec,0x4f,0x7e,0x59,0x30,0x32,0x5d,0x82,0x50,0x3b,0x68,0x63,0x62,0x00,0x02,0x00,0xbc,0x00,0x00,0x05,0x0c,0x05,0x9a,0x00,0x05,0x00,0x09,0x00,0x00,0x21,0x21,0x11,0x33,0x11,0x21,0x05,0x23, +0x11,0x33,0x05,0x0c,0xfd,0x18,0xa8,0x02,0x40,0xfc,0x58,0xa8,0xa8,0x05,0x9a,0xfa,0xfe,0x98,0x05,0x9a,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x26,0x05,0xec,0x00,0x13,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x03,0x26,0x88,0xa4,0xb0,0xa4,0x88,0x88,0xa4,0xb0, +0xa4,0x88,0x04,0xb2,0xfb,0x4e,0x04,0xb2,0xfb,0x4e,0x04,0xb2,0x86,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x01,0x00,0x81,0xff,0xe9,0x04,0x4b,0x05,0xee,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x17,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27, +0x03,0x8d,0x5a,0x64,0x43,0x7d,0xb1,0x6e,0x77,0xb7,0x7d,0x40,0x3b,0x62,0x7d,0x42,0x80,0x3e,0x6c,0x50,0x2e,0x2a,0x51,0x75,0x4b,0x43,0x6d,0x4e,0x2b,0x38,0x33,0x03,0x9b,0x43,0xda,0x8d,0x75,0xbf,0x89,0x4b,0x56,0xa4,0xf0,0x9b,0x92,0x01,0x11,0xea,0xb9,0x3a,0x6b,0x40,0x9e,0xc2,0xe8,0x8b,0x6c,0xb7,0x84,0x4b,0x36,0x5e,0x82,0x4c, +0x60,0x96,0x32,0x00,0x00,0x01,0x00,0x77,0xff,0xe8,0x03,0xaa,0x05,0xf1,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x17,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x02,0xf1,0x58,0x61,0x33,0x61,0x8c,0x5a,0x6c,0xa5,0x6f,0x39,0x3b,0x61, +0x7c,0x42,0x78,0x3e,0x6c,0x50,0x2e,0x25,0x47,0x66,0x41,0x31,0x4d,0x34,0x1c,0x38,0x33,0x03,0x96,0x42,0xd8,0x8c,0x75,0xbf,0x89,0x4b,0x56,0xa5,0xf0,0x9b,0x93,0x01,0x13,0xeb,0xb9,0x39,0x65,0x40,0x9f,0xc4,0xec,0x8d,0x6e,0xbb,0x88,0x4d,0x37,0x62,0x86,0x4e,0x61,0x98,0x33,0x00,0x00,0x02,0x00,0x06,0xff,0xe7,0x04,0x96,0x05,0x9a, +0x00,0x1a,0x00,0x29,0x00,0x00,0x01,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x01,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x26,0x04,0x96,0xfe,0x45,0x3c,0x70,0x71,0x76,0x41,0x3b,0x5f,0x43,0x24,0x42,0x6e,0x8d,0x4b,0x30,0x2f,0xfe,0x4f,0xbf, +0x01,0x58,0x05,0x12,0x0e,0x05,0x01,0x65,0xfd,0x96,0x2e,0x4a,0x35,0x1d,0x3a,0x35,0x18,0x35,0x3c,0x42,0x24,0x43,0x05,0x9a,0xfc,0x17,0x87,0xb0,0x69,0x2a,0x26,0x44,0x5e,0x37,0x48,0x6f,0x4b,0x26,0x06,0x03,0x92,0xfd,0x02,0x0a,0x2e,0x25,0x03,0x5b,0xfb,0xea,0x15,0x26,0x35,0x20,0x3b,0x3c,0x19,0x38,0x5c,0x44,0x16,0x00,0x00,0x02, +0xff,0xbd,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x00,0x19,0x00,0x29,0x00,0x00,0x01,0x01,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x01,0x33,0x01,0x17,0x33,0x36,0x36,0x37,0x01,0x01,0x22,0x0e,0x02,0x15,0x14,0x33,0x32,0x3e,0x02,0x37,0x37,0x26,0x22,0x03,0xd5,0xfe,0x29,0x7e,0xe4,0x32,0x52,0x3b,0x20,0x43,0x6f, +0x8f,0x4b,0x14,0x25,0x13,0xfe,0x79,0xb6,0x01,0x15,0x15,0x06,0x02,0x0a,0x08,0x01,0x23,0xfe,0x08,0x2e,0x4c,0x36,0x1e,0x49,0x12,0x2a,0x2b,0x28,0x0f,0x22,0x0e,0x1e,0x04,0x00,0xfb,0x5c,0xfe,0xc2,0x1b,0x36,0x51,0x36,0x48,0x6f,0x4a,0x26,0x02,0x02,0x03,0xe7,0xfc,0xec,0x4e,0x0c,0x26,0x1a,0x03,0x16,0xfb,0x93,0x15,0x25,0x35,0x20, +0x58,0x12,0x25,0x38,0x25,0x51,0x02,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x05,0x8c,0x05,0xb2,0x00,0x18,0x00,0x2d,0x00,0x00,0x01,0x3e,0x03,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x15,0x23,0x11,0x33,0x11,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x01,0x64, +0x27,0x70,0x7c,0x7e,0x35,0x85,0xe0,0xa2,0x5b,0x67,0xb0,0xea,0x82,0x42,0x7c,0x6c,0x5a,0x21,0xa8,0xa8,0x16,0x65,0x7c,0x84,0x35,0x5d,0xa5,0x7d,0x49,0x40,0x76,0xa5,0x66,0x33,0x82,0x7d,0x69,0x1c,0x04,0xab,0x4a,0x65,0x3d,0x1b,0x6a,0xc3,0xfe,0xeb,0xab,0xa9,0xfe,0xf1,0xbf,0x66,0x22,0x3b,0x4d,0x2b,0xbd,0x05,0x9a,0xfc,0x6d,0x6e, +0x96,0x5c,0x28,0x4e,0x96,0xd9,0x8c,0x8a,0xdc,0x9a,0x52,0x27,0x5c,0x98,0x70,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x40,0x04,0x18,0x00,0x31,0x00,0x3a,0x00,0x00,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x17,0x0e,0x03,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e, +0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x0a,0x04,0xaf,0x9b,0x3c,0x79,0x6b,0x52,0x15,0x6a,0x03,0x18,0x2d,0x45,0x30,0x28,0x46,0x3b,0x32,0x15,0x4a,0x1e,0x4d,0x56,0x5c,0x2d,0x54,0x7a,0x1b,0x29,0x67,0x75,0x7d,0x3f,0x75,0xb7,0x7e,0x42,0x49,0x7f,0xad,0x63,0x65,0x9d,0x6b,0x38,0xa8,0x01, +0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x12,0x39,0x6a,0x57,0x1b,0x1f,0x43,0x37,0x24,0x23,0x3d,0x51,0x2e,0x23,0x57,0x7f,0x54,0x29,0x67,0x62,0x45,0x5c,0x38,0x17,0x47,0x89,0xc6,0x7e,0x77,0xc7,0x8f,0x4f,0x43,0x7f,0xb6,0x73,0x56,0x8b,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x00,0x01,0x00,0x78,0xff,0xee,0x02,0x8e, +0x05,0xfe,0x00,0x25,0x00,0x00,0x37,0x16,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x0e,0x03,0x23,0x22,0x27,0x78,0x2b,0x51,0x69,0x47,0x22,0x24,0x24,0x22,0x47,0x69,0x51,0x2b,0x24,0x3e,0x2d,0x51,0x46,0x36,0x12,0x04,0xa4,0xa4, +0x04,0x12,0x36,0x46,0x51,0x2d,0x3e,0x24,0xa6,0x21,0x63,0x30,0x81,0x53,0x02,0x14,0x52,0x82,0x30,0x63,0x21,0xaa,0x0e,0x1f,0x3b,0x55,0x36,0xd3,0xfa,0x14,0xd3,0x36,0x55,0x3b,0x1f,0x0e,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x13,0x00,0x2f,0x00,0x3e,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32, +0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x35,0x34,0x26,0x03,0x22,0x0e,0x02,0x15,0x14,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x02,0x52,0x71,0xb8,0x82,0x47,0x49,0x88,0xc1,0x78,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f, +0x59,0x30,0x4d,0x46,0x06,0x1f,0x38,0x4d,0x2d,0x2c,0x4a,0x36,0x1f,0x07,0x3e,0x40,0xaa,0x9f,0x18,0x29,0x1e,0x11,0x70,0x19,0x2b,0x1f,0x11,0x41,0x18,0x4b,0x8a,0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x73,0xab,0x31,0x18,0x1b,0x2d,0x49,0x34,0x1c,0x1d,0x33,0x46,0x2a, +0x1c,0x16,0x31,0xa7,0x74,0xc1,0xcf,0xfd,0xc5,0x11,0x1f,0x29,0x18,0x70,0x11,0x1e,0x29,0x18,0x31,0x40,0x00,0x01,0x00,0x49,0x00,0x00,0x02,0xc0,0x04,0x33,0x00,0x0b,0x00,0x00,0x37,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x49,0x01,0xd3,0xfe,0x6b,0x01,0x95,0xfe,0x49,0x02,0x5b,0xfd,0x89,0x8b,0x01,0x52,0x8b,0x01, +0x40,0x8b,0xfb,0xcd,0x00,0x02,0x00,0x06,0xfd,0xe3,0x01,0x4a,0x02,0x13,0x00,0x0d,0x00,0x19,0x00,0x00,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x27,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x40,0x74,0x6e,0x15,0x2c,0x17,0x3a,0x20,0x6a,0x76,0x3f,0x1d,0x2a,0x2a,0x1d,0x1e,0x2b, +0x2b,0xf7,0x8f,0x97,0x0b,0x0a,0x72,0x25,0xb5,0x02,0x19,0x76,0x28,0x1e,0x1d,0x27,0x27,0x1d,0x1d,0x29,0x00,0x01,0x00,0x1c,0x02,0x9a,0x02,0xdb,0x05,0xa3,0x00,0x08,0x00,0x00,0x01,0x01,0x23,0x01,0x33,0x13,0x17,0x37,0x13,0x02,0xdb,0xfe,0xd7,0x79,0xfe,0xe3,0x83,0xcf,0x0a,0x0a,0xd9,0x05,0xa3,0xfc,0xf7,0x03,0x09,0xfd,0xb7,0x2f, +0x2e,0x02,0x4a,0x00,0x00,0x01,0x00,0x79,0xfe,0x92,0x03,0xde,0x05,0xb2,0x00,0x49,0x00,0x00,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x26,0x27,0x26,0x26,0x27,0x35,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03, +0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x17,0x1e,0x03,0x33,0x32,0x36,0x37,0x03,0xab,0x23,0x5b,0x38,0x32,0x5f,0x53,0x42,0x15,0x41,0x8c,0x23,0x3d,0x14,0x22,0x5f,0x69,0x6a,0x2d,0x9c,0x98,0x27,0x53,0x7e,0x57,0x4b,0x82,0x60,0x37,0x56,0x8c,0xb3,0x5d,0xd3,0x62,0x7f,0xc7,0x38,0x6d,0x56,0x36,0x29,0x50,0x73,0x4b,0x4d,0x8a,0x68,0x3d, +0x4d,0x83,0xac,0x5f,0x13,0x1d,0x0b,0x0f,0x2c,0x33,0x38,0x1a,0x2c,0x56,0x2b,0xfe,0xb9,0x14,0x13,0x15,0x2b,0x40,0x2b,0x83,0x4a,0x0a,0x18,0x0e,0xc6,0x1e,0x30,0x21,0x12,0x71,0x6d,0x37,0x4f,0x45,0x45,0x2d,0x27,0x4d,0x5e,0x77,0x50,0x62,0x90,0x5f,0x2e,0x33,0xbd,0x58,0x17,0x34,0x52,0x3b,0x37,0x50,0x42,0x3e,0x25,0x26,0x54,0x66, +0x7d,0x4f,0x64,0x8e,0x5d,0x2e,0x04,0x11,0x28,0x17,0x1d,0x2c,0x1d,0x0f,0x14,0x15,0x00,0x01,0x00,0x21,0xfe,0x8b,0x04,0x64,0x05,0x9a,0x00,0x1c,0x00,0x00,0x01,0x01,0x1e,0x03,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x27,0x2e,0x03,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xbd,0x3a,0x6d,0x60,0x54,0x23, +0x4e,0x75,0x32,0x29,0x43,0x28,0x40,0x69,0xaa,0xaa,0x2b,0x51,0x54,0x59,0x33,0xae,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x2e,0x0c,0x30,0x3e,0x48,0x24,0x51,0x50,0x14,0x15,0x91,0x26,0xba,0x2e,0x47,0x2e,0x18,0x2f,0x04,0xd3,0x98,0x00,0x01,0x00,0x70,0xff,0xea,0x01,0x50,0x01,0xcf,0x00,0x17,0x00,0x00,0x17,0x22,0x2e,0x02, +0x35,0x34,0x3e,0x02,0x37,0x17,0x0e,0x03,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0xdf,0x17,0x28,0x1e,0x12,0x1b,0x24,0x26,0x0b,0x66,0x0b,0x16,0x13,0x10,0x06,0x24,0x30,0x12,0x1f,0x29,0x16,0x12,0x1e,0x29,0x17,0x20,0x67,0x6e,0x63,0x1d,0x13,0x19,0x3c,0x41,0x41,0x1e,0x0a,0x3d,0x26,0x17,0x29,0x1e,0x12,0x00,0x01,0x00,0x70,0x00,0xf8, +0x01,0x50,0x01,0xd9,0x00,0x13,0x00,0x00,0x37,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0xdf,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0xf8,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x01,0x00,0x27,0xff,0xd4, +0x01,0x3c,0x01,0xc0,0x00,0x03,0x00,0x00,0x01,0x03,0x23,0x13,0x01,0x3c,0xa0,0x75,0x75,0x01,0xc0,0xfe,0x14,0x01,0xec,0x00,0x00,0x02,0x00,0x6f,0xff,0xea,0x01,0x9a,0x05,0x08,0x00,0x13,0x00,0x17,0x00,0x00,0x37,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x03,0x13,0x33,0x03,0xdf,0x17,0x29,0x1e, +0x12,0x12,0x1e,0x29,0x17,0x17,0x29,0x1e,0x12,0x12,0x1e,0x29,0x43,0xa0,0x75,0x75,0xc8,0x12,0x1e,0x29,0x17,0x18,0x28,0x1d,0x11,0x11,0x1e,0x28,0x17,0x17,0x29,0x1e,0x12,0x02,0x54,0x01,0xec,0xfe,0x14,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x01,0xda,0x05,0x99,0x00,0x09,0x00,0x00,0x25,0x23,0x03,0x05,0x35,0x05,0x03,0x33,0x03,0x33, +0x01,0xaa,0x4c,0x28,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x30,0xe5,0x02,0xb6,0x1e,0x96,0x14,0x01,0x9a,0xfe,0x66,0x00,0x01,0x01,0x2e,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x09,0x00,0x00,0x01,0x33,0x03,0x33,0x03,0x25,0x15,0x25,0x03,0x23,0x01,0x2e,0x30,0x28,0x9c,0x28,0x01,0x2e,0xfe,0xfa,0x28,0x4c,0x03,0xff,0x01,0x9a,0xfe,0x66, +0x14,0x96,0x1e,0xfd,0x4a,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x0b,0x00,0x00,0x01,0x25,0x13,0x23,0x13,0x05,0x35,0x05,0x13,0x33,0x13,0x25,0x02,0xd8,0xfe,0xd2,0x28,0x9c,0x28,0xfe,0xd2,0x01,0x06,0x28,0x4c,0x28,0x01,0x06,0x02,0x6b,0x14,0xfe,0x66,0x01,0x9a,0x14,0x96,0x1e,0x02,0xb6,0xfd,0x4a,0x1e,0x00, +0x00,0x02,0x00,0x83,0x01,0x31,0x03,0x27,0x05,0xd3,0x00,0x1f,0x00,0x2d,0x00,0x00,0x01,0x26,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x1e,0x02,0x17,0x16,0x15,0x14,0x06,0x07,0x01,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x35,0x34,0x2e,0x02,0x02,0x1e,0x18,0x5d,0x3d,0xe9, +0x93,0x6a,0x31,0x5a,0x7d,0x4c,0x84,0x57,0x65,0x7a,0xa8,0x0d,0x32,0x61,0x54,0xdf,0x3d,0x39,0xfe,0xdd,0x65,0x1a,0x3c,0x61,0x47,0x58,0x18,0x38,0x5d,0x01,0x31,0x13,0x3c,0x20,0x7a,0xc3,0xa3,0x51,0x52,0x8d,0x40,0x6b,0x4d,0x2b,0x2b,0x9e,0x3e,0x90,0x1c,0x2f,0x32,0x3a,0x28,0x6a,0xbb,0x4c,0x7b,0x35,0x01,0xd1,0x33,0x6c,0x25,0x3d, +0x39,0x39,0x20,0x43,0x69,0x24,0x3b,0x36,0x35,0x00,0x00,0x01,0x00,0x00,0x01,0xfa,0x0b,0xf2,0x02,0x7b,0x00,0x03,0x00,0x00,0x01,0x21,0x35,0x21,0x0b,0xf2,0xf4,0x0e,0x0b,0xf2,0x01,0xfa,0x81,0x00,0x00,0x01,0x00,0x00,0x01,0xfa,0x0f,0xfe,0x02,0x7b,0x00,0x03,0x00,0x00,0x01,0x21,0x35,0x21,0x0f,0xfe,0xf0,0x02,0x0f,0xfe,0x01,0xfa, +0x81,0x00,0x00,0x01,0x00,0x25,0x06,0x12,0x02,0x7d,0x09,0x46,0x00,0x1f,0x00,0x00,0x01,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x1e,0x03,0x33,0x32,0x36,0x37,0x02,0x7d,0x5c,0x85,0x55,0x8a,0x62,0x36,0x3a,0x67,0x8f,0x56,0x74,0x5e,0x6b,0x68,0x6b,0x8d,0x0e,0x01, +0x54,0xfe,0xac,0x06,0x2a,0x42,0x58,0x35,0x39,0x6d,0x34,0x06,0x44,0x32,0x3a,0x68,0x92,0x58,0x60,0x9c,0x6f,0x3d,0x25,0x7c,0x38,0x83,0x7b,0x69,0x39,0x5d,0x42,0x23,0x1f,0x21,0x00,0x01,0x00,0x5b,0x06,0x20,0x02,0xe6,0x09,0x3a,0x00,0x09,0x00,0x00,0x01,0x23,0x11,0x01,0x23,0x11,0x33,0x11,0x01,0x33,0x02,0xe6,0x78,0xfe,0x76,0x89, +0x78,0x01,0x87,0x8c,0x06,0x20,0x02,0x64,0xfd,0x9c,0x03,0x1a,0xfd,0x9e,0x02,0x62,0x00,0x03,0xff,0xda,0x06,0x1f,0x01,0x31,0x09,0x2f,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x00,0x13,0x23,0x11,0x33,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x76, +0x76,0x2c,0x1b,0x28,0x27,0x1b,0x1d,0x27,0x26,0xeb,0x1d,0x29,0x28,0x1c,0x1c,0x29,0x28,0x06,0x1f,0x02,0x3e,0x51,0x24,0x1c,0x1c,0x25,0x25,0x1c,0x1b,0x25,0x26,0x1a,0x1c,0x25,0x25,0x1c,0x1b,0x25,0x00,0x01,0xff,0xf7,0x05,0x1c,0x02,0x26,0x08,0x5d,0x00,0x14,0x00,0x00,0x01,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32, +0x36,0x37,0x37,0x26,0x02,0x27,0x33,0x13,0x13,0x02,0x26,0xfe,0xfc,0x22,0x68,0x41,0x12,0x24,0x12,0x2b,0x17,0x1b,0x2e,0x0e,0x2a,0x35,0x70,0x36,0x80,0x97,0x9e,0x08,0x5d,0xfd,0x72,0x55,0x5e,0x05,0x06,0x68,0x0f,0x25,0x23,0x65,0x89,0x01,0x1e,0x89,0xfe,0x53,0x01,0xad,0x00,0x02,0x00,0x0c,0x06,0x1f,0x02,0xe6,0x09,0x39,0x00,0x0e, +0x00,0x16,0x00,0x00,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0xea,0xde,0x01,0x55,0x84,0x79,0x88,0x25,0x45,0x62,0x3d,0x7c,0x71,0x48,0x50,0x98,0x06,0x1f,0x02,0xb0,0x6a,0xfe,0xb9,0x74,0x6e,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x44,0x3e,0x7f,0x00,0x03, +0x00,0x5b,0x06,0x1f,0x03,0x0c,0x09,0x39,0x00,0x03,0x00,0x10,0x00,0x18,0x00,0x00,0x01,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x03,0x0c,0x77,0x77,0xfd,0x4f,0x78,0x83,0x7a,0x88,0x25,0x45,0x62,0x3d,0x7c,0x71,0x48,0x50,0x98,0x06,0x1f,0x03,0x1a,0xfc, +0xe6,0x03,0x1a,0xfe,0xb9,0x75,0x6d,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x43,0x3f,0x7f,0x00,0x02,0x00,0x5a,0x06,0x1f,0x02,0x57,0x09,0x39,0x00,0x0c,0x00,0x14,0x00,0x00,0x13,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x5a,0x78,0x83,0x7a,0x88,0x25,0x45,0x62,0x3d,0x7c, +0x71,0x48,0x50,0x98,0x06,0x1f,0x03,0x1a,0xfe,0xb9,0x75,0x6d,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x43,0x3f,0x7f,0x00,0x00,0x01,0x00,0x1e,0x06,0x1f,0x03,0xd5,0x09,0x39,0x00,0x2d,0x00,0x00,0x01,0x2e,0x05,0x27,0x33,0x1e,0x03,0x17,0x13,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x3e,0x05,0x37,0x33,0x0e,0x05,0x07,0x23,0x26,0x26, +0x27,0x03,0x01,0x19,0x2b,0x41,0x31,0x24,0x1c,0x14,0x0a,0x79,0x0c,0x20,0x2b,0x38,0x26,0x6b,0x0c,0x12,0x0f,0x0d,0x06,0x78,0x0d,0x1f,0x2b,0x39,0x26,0x1a,0x2a,0x23,0x1c,0x18,0x14,0x09,0x78,0x09,0x15,0x1b,0x24,0x32,0x40,0x2b,0x6b,0x2a,0x3f,0x18,0x68,0x06,0x1f,0x53,0x89,0x7b,0x73,0x7a,0x86,0x50,0x6c,0xa7,0x90,0x89,0x4f,0x01, +0x11,0x28,0x52,0x59,0x60,0x37,0x6e,0xa6,0x91,0x89,0x51,0x36,0x5f,0x5d,0x5f,0x6a,0x7a,0x4a,0x51,0x86,0x7a,0x74,0x7a,0x89,0x52,0x51,0x83,0x3c,0xfe,0xf0,0x00,0x01,0x00,0x5c,0x06,0x12,0x03,0xfb,0x09,0x46,0x00,0x27,0x00,0x00,0x01,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x16,0x17, +0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x1e,0x03,0x33,0x32,0x36,0x37,0x03,0xfb,0x5e,0x84,0x50,0x84,0x61,0x3a,0x06,0xcf,0x79,0x79,0xd1,0x09,0x40,0x66,0x86,0x4e,0x3b,0x68,0x2f,0x6d,0x66,0x6c,0x8d,0x0d,0x01,0x53,0xfe,0xac,0x06,0x2a,0x42,0x58,0x35,0x39,0x6d,0x35,0x06,0x44,0x32,0x33,0x5e,0x83,0x50,0xfe,0xa9,0x03,0x1a, +0xfe,0xa6,0x52,0x85,0x5d,0x33,0x13,0x12,0x7c,0x38,0x83,0x7b,0x69,0x39,0x5d,0x42,0x23,0x1f,0x21,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x71,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28, +0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xc8,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02, +0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfd,0xa3,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23, +0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfb,0xe1,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64, +0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfa,0x1f,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f, +0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64,0xff,0xf1,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12, +0x12,0x1f,0x29,0x07,0x58,0xf8,0x99,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x71,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01, +0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x06,0x90,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34, +0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x04,0xfb,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03, +0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x03,0x39,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29, +0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x01,0x77, +0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0xff,0xf1,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29, +0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x0f,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x05,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x02,0xc9,0x06,0xd4,0xf9,0x2c,0x07,0x58,0x00, +0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x94,0x02,0x35,0x05,0x1f,0xfa,0xe1,0x07,0x58,0xfe,0x4b,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb, +0x94,0x94,0x02,0x35,0x03,0x6a,0xfc,0x96,0x07,0x58,0xfc,0x96,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x94,0x02,0x35,0x01,0xb5,0xfe,0x4b,0x07,0x58,0xfa,0xe1,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x05,0x00,0x00, +0x13,0x33,0x11,0x21,0x15,0x21,0x96,0x94,0x02,0x35,0xfd,0x37,0x07,0x58,0xf9,0x2c,0x84,0x00,0x00,0x04,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0e,0x00,0x26,0x00,0x3a,0x00,0x46,0x00,0x5f,0xb9,0x00,0x0e,0x01,0x43,0xb2,0x07,0x0d,0x36,0xbb,0x01,0x43,0x00,0x20,0x00,0x16,0x01,0x43,0x40,0x0c,0x2c,0x0d,0x20,0x2c,0x2c,0x20, +0x0d,0x03,0x3b,0x41,0x3b,0x44,0xbc,0x01,0x42,0x00,0x3e,0x01,0x41,0x00,0x27,0x01,0x44,0xb2,0x1b,0x07,0x31,0xb8,0x01,0x44,0x40,0x0c,0x0f,0x19,0x0e,0x18,0x04,0x0c,0x01,0x0c,0x06,0x07,0x00,0x07,0x00,0x3f,0xde,0xce,0x33,0x5d,0x3f,0x3f,0xe6,0x3f,0xe6,0x3f,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe6,0x10,0xe6, +0x10,0xcd,0xe6,0x30,0x31,0x01,0x23,0x0e,0x03,0x07,0x15,0x3e,0x03,0x37,0x11,0x33,0x05,0x32,0x3e,0x04,0x35,0x34,0x02,0x26,0x26,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x1e,0x04,0x13,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x04,0x2f, +0x7a,0x26,0x68,0x75,0x79,0x36,0x30,0x65,0x5b,0x49,0x13,0xe0,0x02,0x8f,0x64,0x8f,0x62,0x3b,0x20,0x0a,0x2c,0x61,0x9d,0x70,0x75,0xa8,0x6c,0x33,0x0f,0x24,0x3c,0x5c,0x7e,0x6a,0x3a,0x4a,0x2b,0x10,0x11,0x2c,0x4d,0x3b,0x3c,0x4e,0x2d,0x12,0x12,0x2f,0x50,0xfa,0x1d,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe, +0x1b,0xfd,0x49,0x05,0xba,0x21,0x45,0x3f,0x33,0x0f,0xce,0x0c,0x2a,0x30,0x31,0x13,0xfb,0x51,0x18,0x45,0x73,0x98,0xa6,0xa9,0x4c,0xb8,0x01,0x13,0xb8,0x5c,0x62,0xc2,0xfe,0xe0,0xbe,0x58,0xae,0x9f,0x87,0x64,0x38,0x05,0x0d,0x46,0x8d,0xd3,0x8d,0x87,0xcc,0x87,0x44,0x42,0x85,0xc8,0x85,0x8f,0xd7,0x8f,0x48,0xfd,0xd8,0x01,0xe5,0x02, +0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x04,0x08,0x05,0x9a,0x00,0x1a,0x00,0x27,0x00,0x5c,0x40,0x35,0x76,0x15,0x01,0x59,0x22,0x69,0x22,0x89,0x22,0x03,0x22,0x15,0x29,0x05,0x01,0x1c,0x09,0x0d,0x0b,0x06,0x0f,0x07,0x03,0x02,0x0a,0x02,0x0b,0x1a,0x1d,0x0e,0x1d,0x2f,0x02,0x6f, +0x02,0x7f,0x02,0xbf,0x02,0x04,0x2f,0x1d,0x01,0x02,0x1d,0x02,0x1d,0x05,0x27,0x0f,0x06,0x05,0x18,0x00,0x3f,0x3f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10,0xcd,0x32,0x11,0x33,0x10,0xcd,0x32,0x01,0x2f,0x33,0x33,0xce,0x32,0xcd,0x32,0x32,0x10,0xde,0xcd,0x5d,0x5d,0x30,0x31,0x01,0x15,0x21,0x15,0x21,0x11,0x23,0x11, +0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x01,0x5b,0x01,0x82,0xfe,0x7e,0xa4,0x77,0x77,0x77,0x77,0x01,0x84,0x5c,0xa7,0x7f,0x4b,0x43,0x80,0xb8,0x76,0xbc,0xa7,0x57,0x85,0x5b,0x2e,0x2a,0x54,0x7e,0x54,0x02,0x7f,0xcf,0x8b,0xfe, +0xdb,0x01,0x25,0x8b,0xcf,0x8b,0x02,0x90,0x2f,0x60,0x92,0x63,0x66,0x98,0x66,0x33,0x02,0x90,0xfd,0xfb,0x1b,0x3d,0x64,0x48,0x47,0x62,0x3d,0x1b,0x00,0x01,0x00,0x32,0x00,0x00,0x05,0xe6,0x05,0x9a,0x00,0x27,0x00,0x57,0x40,0x35,0x67,0x25,0x01,0x00,0x12,0x25,0x13,0x13,0x1e,0x0a,0x0f,0x07,0x3f,0x07,0x02,0x07,0x29,0x1b,0x5f,0x1e, +0x6f,0x1e,0x8f,0x1e,0xaf,0x1e,0x04,0x1e,0x78,0x11,0x88,0x11,0x02,0x11,0x5b,0x14,0x01,0x3a,0x14,0x4a,0x14,0x02,0x14,0x00,0x25,0x25,0x13,0x27,0x06,0x1c,0x09,0x13,0x18,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x2f,0x33,0xcd,0x5d,0x5d,0x32,0x5d,0x01,0x2f,0x5d,0xcd,0x10,0xde,0x5d,0xcd,0x12,0x39,0x2f,0x33,0xcd,0x32,0x00,0x5d,0x30, +0x31,0x01,0x1e,0x04,0x12,0x15,0x15,0x23,0x35,0x34,0x2e,0x04,0x27,0x11,0x23,0x11,0x0e,0x05,0x15,0x15,0x23,0x35,0x34,0x12,0x3e,0x03,0x37,0x11,0x33,0x03,0x5e,0x55,0xa3,0x90,0x78,0x57,0x31,0xa4,0x27,0x45,0x5d,0x6c,0x75,0x3a,0xa4,0x39,0x73,0x6c,0x5e,0x46,0x28,0xa4,0x32,0x58,0x7a,0x90,0xa1,0x53,0xa4,0x04,0x6d,0x09,0x39,0x65, +0x95,0xcd,0xfe,0xf9,0xa5,0xb8,0xbf,0x91,0xe3,0xac,0x79,0x51,0x2c,0x09,0xfc,0x22,0x03,0xe0,0x08,0x2a,0x4f,0x7a,0xad,0xe5,0x94,0xbf,0xb8,0xa8,0x01,0x0b,0xce,0x95,0x63,0x35,0x08,0x01,0x2c,0x00,0x00,0x16,0x00,0x26,0x00,0x00,0x07,0x15,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23, +0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x57,0x00,0x5c,0x00,0x62,0x00,0x7c,0x00,0x00,0x13,0x35,0x33,0x15,0x23,0x15,0x03,0x35,0x33,0x15,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x13,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23, +0x35,0x33,0x35,0x23,0x35,0x33,0x25,0x35,0x33,0x15,0x23,0x35,0x03,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x23,0x27,0x23,0x07,0x23,0x13,0x33,0x13,0x27,0x27,0x15,0x07,0x05,0x21,0x11,0x33,0x11, +0x33,0x05,0x23,0x11,0x34,0x34,0x37,0x03,0x23,0x03,0x15,0x11,0x23,0x11,0x33,0x13,0x16,0x16,0x17,0x36,0x37,0x3e,0x03,0x37,0x33,0x26,0xeb,0x96,0x55,0x55,0x96,0x5b,0xd3,0xd3,0xd3,0x5e,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0xfd,0x0d,0x55,0x55,0x55,0x55,0x05,0xae,0xec,0x56,0x96,0x96,0x56,0xfd,0xe6,0xd2,0x01,0x48,0x56,0x56, +0x56,0x56,0xfc,0xb7,0xd1,0xd1,0xd1,0x5e,0xd2,0x01,0x48,0x56,0x56,0xfb,0x91,0x50,0x35,0xc6,0x32,0x50,0xc2,0x48,0x28,0x4d,0x01,0x4b,0x02,0x7d,0xfe,0xed,0x4a,0xc9,0x02,0x4a,0x4b,0x01,0xa9,0x28,0xaa,0x48,0x5b,0x9a,0x08,0x04,0x05,0x0a,0x08,0x12,0x28,0x29,0x28,0x12,0x58,0x04,0xd4,0xec,0x55,0x97,0xfb,0x2c,0xeb,0x95,0x56,0x56, +0x56,0x05,0x6b,0x55,0x55,0xfa,0x95,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xf3,0x55,0xec,0x97,0xfa,0x95,0x56,0x95,0xeb,0x56,0x56,0x01,0x48,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x05,0x6b,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0xfe,0xb6,0x8c,0x8c,0x01,0xfb,0xfe,0xce,0xcf,0x02,0x02,0xcf,0xc9, +0x01,0xfb,0xfe,0x42,0x3d,0x01,0x53,0x09,0x14,0x0b,0xfe,0x85,0x01,0x7b,0x29,0xfe,0xae,0x01,0xfb,0xfe,0xa2,0x12,0x0f,0x09,0x1b,0x10,0x28,0x59,0x5c,0x59,0x27,0x00,0x00,0x01,0x00,0xbc,0xfe,0x96,0x06,0x72,0x05,0x9a,0x00,0x26,0x00,0x1f,0x40,0x10,0x0e,0x16,0x21,0x03,0x1c,0x1d,0x03,0x08,0x03,0x03,0x1c,0x12,0x12,0x12,0x00,0x03, +0x00,0x3f,0x3f,0x3f,0x33,0x2f,0x33,0x3f,0x12,0x17,0x39,0x30,0x31,0x01,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x06,0x72,0xfe,0xaf,0x3f,0x39,0x32,0x3e,0xb2,0x07,0x07,0x04, +0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x14,0x17,0x04,0x04,0x04,0xa2,0xde,0x01,0xb8,0x33,0x0f,0x06,0x16,0x22,0x0d,0x01,0xc1,0x05,0x9a,0xfa,0x9b,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x03,0x8d,0x39,0x8b,0x53,0x63,0x28,0xfb,0xb2,0x04,0x46,0x2e,0x65,0x2b,0x8c,0x62,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x74,0x38,0x3c,0x57,0x1d,0x03,0xe4, +0x00,0x02,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x07,0x00,0x11,0x00,0x1a,0x40,0x0c,0x11,0x0d,0x06,0x02,0x02,0x01,0x06,0x12,0x04,0x03,0x01,0x03,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x30,0x31,0x13,0x33,0x13,0x21,0x13,0x33,0x01,0x23,0x03,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x16,0xba,0x98,0x02, +0x60,0x8f,0xbb,0xfd,0xda,0xae,0x9f,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfe,0x6e,0x01,0x92,0xfa,0x66,0x03,0x71,0xfd,0x9d,0x0f,0x30,0x21,0x1f,0x30,0x11,0x02,0x63,0xff,0xff,0x00,0x60,0xfe,0x96,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x08,0x5d,0x02,0x89,0x00,0x00,0xff,0xff,0x00,0xa6, +0xfe,0x96,0x04,0x91,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x00,0x07,0x08,0x5d,0x03,0xba,0x00,0x00,0x00,0x03,0x00,0x6e,0x00,0x00,0x05,0x5b,0x05,0x9a,0x00,0x2a,0x00,0x32,0x00,0x3c,0x00,0x29,0x40,0x15,0x1f,0x35,0x91,0x2b,0x13,0x91,0x01,0x01,0x2b,0x0a,0x2b,0x0a,0x00,0x3c,0x91,0x14,0x03,0x2c,0x91,0x00,0x12,0x00,0x3f,0xed, +0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x2f,0xed,0x10,0xed,0x39,0x30,0x31,0x21,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x3e, +0x02,0x35,0x34,0x21,0x01,0xe8,0x47,0x28,0x3b,0x27,0x13,0x06,0x05,0x98,0x09,0x28,0x4b,0x6a,0x41,0x5c,0x01,0x98,0x5d,0x95,0x69,0x39,0x22,0x40,0x5c,0x3a,0x48,0x75,0x54,0x2e,0x47,0x7c,0xab,0x63,0xfa,0xe4,0x95,0xa2,0xfe,0xa6,0xc1,0xac,0x45,0x6e,0x4c,0x29,0xfe,0xed,0x02,0x9c,0x17,0x25,0x31,0x1a,0x0f,0x2c,0x13,0x30,0x29,0x47, +0x67,0x44,0x20,0x02,0x68,0x30,0x57,0x78,0x49,0x3d,0x6b,0x58,0x41,0x13,0x04,0x08,0x38,0x5a,0x7a,0x4a,0x5c,0x98,0x6c,0x3c,0x02,0x9c,0xfd,0xfc,0x8b,0x7b,0xfe,0x02,0x66,0xfe,0x31,0x22,0x41,0x5f,0x3c,0xd1,0x00,0x02,0x00,0x75,0xfe,0xab,0x05,0x80,0x05,0xec,0x00,0x30,0x00,0x43,0x00,0x24,0x40,0x14,0x12,0x0f,0x21,0x03,0x15,0x23, +0x15,0x2d,0x96,0x05,0x36,0x95,0x1f,0x15,0x40,0x95,0x15,0x10,0x11,0x00,0x00,0x3f,0x3f,0xed,0x3f,0xed,0xdc,0xed,0x3f,0x12,0x17,0x39,0x30,0x31,0x05,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x23,0x15,0x23,0x11,0x0e,0x03,0x15,0x14, +0x16,0x33,0x32,0x36,0x37,0x03,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x03,0x4d,0x10,0x3c,0x4c,0x54,0x27,0x7d,0xac,0x6c,0x30,0x2b,0x57,0x83,0x58,0xa4,0x46,0x9f,0x5b,0x66,0xa9,0x78,0x43,0x40,0x79,0xad,0x6d,0xcc,0x67,0x04,0xa4,0x2f,0x44,0x2c,0x16,0x8d,0x98,0x3f,0x77,0x27,0xa9,0x2b,0x4e, +0x6b,0x40,0x4b,0x76,0x52,0x2b,0x22,0x50,0x83,0x61,0x4e,0x85,0x39,0xf7,0x12,0x22,0x1a,0x10,0x44,0x79,0xa9,0x65,0x4c,0xc0,0xc9,0xc3,0x4e,0x02,0x90,0xfd,0xe0,0x23,0x29,0x48,0x85,0xbb,0x72,0x7f,0xd1,0x94,0x52,0xac,0x94,0x02,0x9c,0x41,0x91,0x92,0x89,0x39,0xa8,0xae,0x1d,0x19,0x02,0x4c,0x3f,0x6f,0x52,0x30,0x3b,0x70,0x9f,0x65, +0x46,0x83,0x66,0x3d,0x2b,0x25,0x00,0x01,0xff,0x9a,0xfe,0x96,0x03,0x94,0x05,0x9a,0x00,0x15,0x00,0x20,0x40,0x10,0x14,0x91,0x01,0x01,0x09,0x91,0x06,0x06,0x02,0x11,0x91,0x0c,0x04,0x91,0x02,0x03,0x00,0x3f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x03,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x10, +0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x23,0x1f,0xdb,0x02,0xd8,0xfd,0xd0,0x01,0x20,0xfe,0xe0,0xfe,0xae,0x3f,0x39,0x32,0x3e,0xb2,0xdb,0x03,0x12,0x02,0x88,0x98,0xfe,0x10,0x97,0xfd,0xba,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x02,0x46,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x1d,0x00,0x33,0xb6,0x05, +0x95,0x08,0x08,0x02,0x95,0x1d,0xb8,0xff,0xc0,0x40,0x14,0x09,0x0c,0x48,0x1d,0x1d,0x03,0x1c,0x95,0x19,0x0f,0x16,0x95,0x11,0x00,0x09,0x95,0x0c,0x0f,0x03,0x15,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x30,0x31,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34, +0x37,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x15,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xaf,0x5d,0x5d,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0xf0,0x03,0x06,0x8c,0xfd,0x86,0x02,0x7a,0x8c,0x6e,0x8c,0xa6,0xa1,0x5d,0x5e,0x12,0x94,0x1b,0xd9,0x9e,0x8c,0x6e,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0x8e,0x05,0xb2, +0x00,0x21,0x00,0x3d,0x00,0x26,0x40,0x14,0x0f,0x36,0x92,0x35,0x35,0x00,0x21,0x03,0x1f,0x2d,0x91,0x1a,0x04,0x02,0x22,0x92,0x05,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e, +0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x01,0x32,0x3e,0x02,0x37,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x04,0x8e,0xa8,0x4e,0xd4,0x83,0x6c,0xb1,0x80,0x46,0x2d,0x54,0x77,0x4a,0x44,0x66,0x44,0x22,0x43,0x79,0xab,0x68,0x3b,0x70,0x64,0x56,0x22,0xa8,0xfd,0xbe,0x4d,0x7b,0x63, +0x4e,0x21,0x21,0x54,0x63,0x72,0x3f,0x47,0x69,0x46,0x23,0xae,0x9d,0xc2,0xbc,0x30,0x55,0x73,0x8c,0x4b,0x59,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x12,0x38,0x4f,0x6a,0x44,0x54,0x8b,0x63,0x37,0x14,0x23,0x31,0x1d,0x6d,0xfa,0xdd,0x27,0x40,0x52,0x2c,0x02,0xf3,0x2d,0x4b,0x36,0x1d,0x23,0x40,0x59,0x35,0x7e,0x80,0x8b, +0x8a,0x8a,0x3e,0x66,0x49,0x28,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0x97,0x04,0x19,0x00,0x1f,0x00,0x3d,0x00,0x26,0x40,0x14,0x0f,0x36,0x96,0x34,0x34,0x01,0x1f,0x0f,0x1d,0x2b,0x95,0x18,0x10,0x02,0x20,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06, +0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x01,0x32,0x3e,0x02,0x37,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x03,0x97,0xa4,0x3c,0x8d,0x5f,0x4f,0x85,0x61,0x36,0x24,0x42,0x5d,0x39,0x64, +0x6f,0x36,0x5d,0x7c,0x47,0x2e,0x52,0x45,0x39,0x16,0xa4,0xfe,0x54,0x24,0x4a,0x45,0x3e,0x17,0x16,0x38,0x41,0x48,0x25,0x37,0x4d,0x31,0x16,0x6d,0x7b,0x06,0x0b,0x4a,0x67,0x3f,0x1c,0x78,0x5d,0x34,0x41,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28,0x05,0x05,0x15,0x6c,0x5a,0x45,0x6d,0x4c,0x29,0x12,0x1c,0x23,0x12,0x4a,0xfc,0x71,0x10, +0x1e,0x2e,0x1e,0x02,0x28,0x1b,0x2d,0x21,0x12,0x19,0x2b,0x3c,0x22,0x51,0x4c,0x81,0x17,0x2c,0x42,0x2a,0x57,0x57,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x14,0x05,0xb2,0x00,0x1e,0x00,0x39,0x00,0x1c,0x40,0x0e,0x0a,0x28,0x92,0x27,0x27,0x00,0x1f,0x91,0x15,0x04,0x30,0x92,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39, +0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x02,0x6a,0x7b,0xc3,0x87,0x47,0x2d,0x54,0x77,0x4a,0x44,0x66,0x44, +0x22,0x44,0x80,0xb8,0x74,0x94,0xf3,0xae,0x5f,0x62,0xb3,0xfb,0x90,0x50,0x72,0x4b,0x23,0xae,0x9d,0xc2,0xbc,0x31,0x58,0x7a,0x4a,0x75,0xc0,0x87,0x4a,0x46,0x81,0xb7,0x18,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x12,0x38,0x4f,0x6a,0x44,0x54,0x8b,0x63,0x37,0x6a,0xbf,0xfe,0xf6,0xa0,0xaa,0xfe,0xe9,0xc8,0x6e,0x05,0x32, +0x23,0x40,0x59,0x35,0x7e,0x80,0x8b,0x8a,0x8a,0x3e,0x66,0x49,0x28,0x52,0x99,0xdc,0x8a,0x8f,0xde,0x97,0x4e,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x10,0x04,0x19,0x00,0x1c,0x00,0x3b,0x00,0x1e,0x40,0x0f,0x00,0x1c,0x1d,0x96,0x3b,0x3b,0x08,0x26,0x95,0x12,0x16,0x30,0x95,0x08,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed, +0x39,0x39,0x30,0x31,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x17,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x33,0x01,0x5c,0x64,0x6f,0x38,0x68,0x96,0x5d,0x6f,0xb8, +0x84,0x49,0x49,0x87,0xc0,0x78,0x63,0x9d,0x6d,0x3b,0x24,0x42,0x5d,0x39,0xbe,0x0b,0x4a,0x67,0x3f,0x1c,0x80,0x89,0x54,0x82,0x58,0x2e,0x24,0x50,0x82,0x5e,0x37,0x56,0x3c,0x1f,0x18,0x36,0x59,0x41,0x06,0x02,0x17,0x15,0x6c,0x5a,0x45,0x6d,0x4c,0x29,0x43,0x85,0xc8,0x85,0x71,0xc5,0x92,0x54,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28, +0x05,0x44,0x17,0x2c,0x42,0x2a,0x57,0x57,0x3b,0x6a,0x92,0x56,0x52,0x92,0x6d,0x3f,0x19,0x2b,0x3c,0x22,0x29,0x3b,0x26,0x13,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8e,0x05,0x9a,0x00,0x2b,0x00,0x21,0x40,0x11,0x0f,0x1c,0x92,0x1b,0x1b,0x00,0x2b,0x03,0x15,0x03,0x02,0x24,0x92,0x05,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f, +0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x11,0x33,0x04,0x8e,0xa8,0x4e,0xd4,0x83,0x6c,0xb1,0x80,0x46,0x2d,0x54,0x77,0x4a,0x7d,0x8a,0xa8,0x31, +0x58,0x7b,0x4a,0xc2,0xbc,0x30,0x55,0x73,0x43,0x4d,0x7b,0x63,0x4e,0x21,0xa8,0x8c,0x4b,0x59,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x22,0x87,0x74,0x01,0x8b,0xfe,0x76,0x39,0x56,0x39,0x1d,0x8b,0x8a,0x8a,0x3e,0x66,0x49,0x28,0x27,0x40,0x52,0x2c,0x04,0x3e,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x97,0x04,0x00,0x00,0x2b, +0x00,0x21,0x40,0x11,0x0f,0x1b,0x96,0x1a,0x1a,0x00,0x2b,0x0f,0x15,0x0f,0x02,0x24,0x92,0x05,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x0e, +0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x11,0x33,0x03,0x97,0xa4,0x3c,0x8d,0x5f,0x4f,0x85,0x61,0x36,0x24,0x42,0x5d,0x39,0x64,0x6f,0xa4,0x6d,0x7a,0x06,0x0b,0x4a,0x67,0x3f,0x1c,0x78,0x70,0x24,0x4a,0x45,0x3e,0x17,0xa4,0x5d,0x34,0x41,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28,0x05,0x05,0x15,0x6c,0x5a,0x01,0x0e,0xfe,0xec, +0x51,0x4c,0x81,0x17,0x2c,0x42,0x2a,0x57,0x57,0x10,0x1e,0x2e,0x1e,0x03,0x15,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x02,0x06,0x01,0xee,0x00,0x00,0x00,0x02,0x00,0x5e,0xfe,0x1e,0x05,0x2c,0x05,0xb2,0x00,0x1f,0x00,0x36,0x00,0x25,0x40,0x14,0x19,0x91,0x16,0x2f,0x14,0x01,0x14,0x11,0x03,0x0f,0x1d,0x00,0x20,0x91, +0x0a,0x04,0x2a,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x2f,0x5d,0x33,0xed,0x30,0x31,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04, +0x35,0x11,0x34,0x2e,0x02,0x02,0xb9,0x86,0xde,0x9f,0x58,0x5c,0xa9,0xf0,0x94,0x4e,0x80,0x66,0x4d,0x1c,0xa8,0xfd,0x6b,0xf4,0xb6,0xdf,0xc9,0xf2,0xfd,0x40,0xe1,0x80,0x6c,0xad,0x7a,0x42,0x42,0x79,0xa9,0x66,0x33,0x67,0x5f,0x53,0x3d,0x23,0x3b,0x6e,0x9a,0x18,0x6a,0xbf,0x01,0x0a,0xa1,0xac,0x01,0x18,0xc6,0x6c,0x21,0x39,0x4b,0x2a, +0xb7,0xfa,0xf0,0xfd,0x94,0x4f,0xb2,0x69,0xdf,0xdd,0x64,0x6d,0x81,0x05,0x32,0x56,0x9c,0xd9,0x84,0x84,0xd9,0x9a,0x55,0x13,0x2c,0x48,0x6a,0x90,0x5d,0x01,0x0d,0x6c,0xa2,0x6c,0x36,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x04,0x9d,0x05,0x9a,0x00,0x20,0x00,0x2c,0x00,0x32,0x40,0x1c,0x1e,0x07,0x92,0x2b,0x17,0x2b,0x23,0x92,0x11,0x8f, +0x11,0xef,0x11,0x02,0x61,0x11,0x01,0x2b,0x11,0x2b,0x11,0x01,0x15,0x03,0x1f,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x30,0x31,0x21,0x21,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x37,0x15,0x06,0x06, +0x07,0x11,0x21,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x04,0x9d,0xfd,0x18,0x0b,0x10,0x13,0x19,0x15,0x46,0x71,0x4f,0x2b,0x23,0x3f,0x58,0x35,0x25,0x53,0x26,0xa8,0x3c,0x75,0x3c,0x3c,0x75,0x3c,0x02,0x40,0xfd,0x18,0x04,0x8f,0x2a,0x39,0x12,0x29,0x43,0x30,0x25,0x02,0x22,0x01,0x01,0x01,0x01,0x21,0x3e,0x5b,0x3a, +0x31,0x53,0x3b,0x21,0x16,0x22,0x01,0xe0,0xfd,0x43,0x1a,0x49,0x34,0xa6,0x2a,0x3f,0x17,0xfe,0x4a,0x02,0x10,0xc4,0x30,0x2a,0x1d,0x2a,0x1c,0x0d,0x00,0x01,0x00,0x02,0x00,0x00,0x03,0xe8,0x05,0x9a,0x00,0x10,0x00,0x19,0x40,0x0d,0x0e,0x12,0x04,0x10,0x0a,0x03,0x06,0x09,0x12,0x06,0x03,0x01,0x03,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39, +0x3f,0x30,0x31,0x13,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x02,0xea,0x02,0x2a,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0xfd,0xe8,0xd1,0x02,0x67,0x05,0x9a,0xfd,0x70,0x25,0x0d,0x02,0xc2,0xfa,0x66,0x02,0xa2,0x16,0x1b,0xfd,0x8f,0x02,0xb0,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c, +0x05,0x9a,0x00,0x07,0x00,0x0f,0xb6,0x05,0x03,0x06,0x02,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0x30,0x31,0x21,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x0c,0xfc,0x1d,0x01,0x9d,0xa8,0x01,0x9e,0x98,0x05,0x02,0xfa,0xfe,0x00,0x00,0x01,0x00,0x32,0x02,0x79,0x05,0xcc,0x03,0x21,0x00,0x03,0x00,0x08,0xb1,0x01,0x03,0x00,0x2f,0xcd, +0x30,0x31,0x01,0x15,0x21,0x35,0x05,0xcc,0xfa,0x66,0x03,0x21,0xa8,0xa8,0x00,0x03,0xff,0xf9,0xff,0xe8,0x04,0xc5,0x04,0x18,0x00,0x27,0x00,0x30,0x00,0x39,0x00,0x30,0x40,0x19,0x1c,0x0f,0x20,0x0c,0x35,0x1d,0x0f,0x19,0x14,0x04,0x2d,0x2d,0x07,0x28,0x95,0x14,0x10,0x31,0xec,0x07,0x16,0x25,0xec,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed, +0x3f,0xed,0x12,0x39,0x2f,0x39,0x12,0x39,0x33,0x33,0xcd,0x32,0x32,0x3f,0x30,0x31,0x25,0x06,0x23,0x22,0x03,0x23,0x02,0x21,0x22,0x2e,0x02,0x27,0x23,0x35,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x1e,0x03,0x33,0x32,0x37,0x01,0x22,0x0e,0x02,0x07,0x21,0x26,0x26,0x03,0x32,0x36,0x37,0x21,0x1e, +0x03,0x04,0xc5,0x33,0x2c,0x9a,0x36,0x04,0x95,0xfe,0xf7,0x5a,0x94,0x6b,0x3d,0x04,0x61,0x67,0x0c,0x4d,0x79,0xa3,0x63,0x3f,0x72,0x60,0x4c,0x1a,0x04,0x55,0xac,0xab,0xa0,0xaa,0x10,0x20,0x26,0x2c,0x1c,0x16,0x12,0xfd,0x74,0x3f,0x67,0x4e,0x33,0x0a,0x02,0x53,0x2a,0x92,0x95,0x66,0xa8,0x3a,0xfd,0xb1,0x05,0x29,0x43,0x5d,0x05,0x0d, +0x01,0x25,0xfe,0xcb,0x48,0x7f,0xae,0x66,0x81,0x68,0xac,0x7c,0x44,0x26,0x4a,0x6a,0x44,0x01,0x06,0xfe,0x44,0x81,0x59,0x75,0x46,0x1d,0x05,0x02,0xf9,0x32,0x59,0x79,0x48,0xa2,0xaa,0xfc,0xe8,0xa6,0xa5,0x47,0x79,0x58,0x33,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0x58,0x04,0x18,0x00,0x29,0x00,0x38,0x00,0x41,0x00,0x43,0x40,0x24, +0x23,0x25,0x95,0x20,0x10,0x18,0x16,0x95,0x1b,0x39,0x95,0x28,0x2a,0x95,0x14,0x08,0x0c,0x28,0x1d,0x14,0x1b,0x28,0x14,0x28,0x14,0x0c,0x1b,0x10,0x33,0x95,0x0c,0x16,0x3e,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x3f,0xed,0x32,0x30, +0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x15,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x05,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x37,0x1e,0x03,0x33,0x32,0x36,0x37,0x06,0x58,0x38, +0x6b,0x9d,0x65,0x80,0xcc,0x3e,0x04,0x91,0xf2,0x4d,0x79,0x55,0x2d,0x01,0x7f,0x01,0x06,0xd7,0xaf,0x9b,0x94,0xc8,0xdb,0x48,0x3c,0xb8,0x7b,0xdd,0x88,0x92,0xac,0x9b,0xaf,0x04,0x02,0xd3,0xfc,0x87,0xcb,0x8b,0x89,0x1b,0x33,0x49,0x2d,0x3b,0x67,0x4d,0x2c,0xa8,0x0a,0x33,0x4e,0x64,0x3a,0x79,0x86,0x01,0x01,0xd3,0x73,0xb6,0x7f,0x43, +0x7e,0x6e,0x07,0xe5,0x2a,0x4d,0x6d,0x44,0x01,0x2c,0x18,0x10,0x01,0x2a,0x7a,0xa4,0x60,0xb1,0x56,0x5b,0x62,0x9a,0x72,0xb9,0xac,0x50,0x0c,0x08,0x52,0x5f,0x24,0x3c,0x2b,0x17,0x2d,0x50,0x6c,0x3f,0x04,0x43,0x6e,0x4f,0x2c,0x9d,0x8f,0x00,0x00,0x02,0x00,0x64,0xff,0xd8,0x03,0x40,0x04,0x12,0x00,0x20,0x00,0x2a,0x00,0x22,0x40,0x0f, +0x1f,0x1e,0x14,0x21,0x1e,0x21,0x1e,0x21,0x01,0x25,0x0d,0x20,0x19,0x01,0x15,0x00,0x3f,0xcd,0x33,0x2f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x30,0x31,0x05,0x37,0x2e,0x03,0x35,0x11,0x34,0x3e,0x02,0x37,0x25,0x33,0x13,0x16,0x15,0x14,0x07,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x17,0x01,0x03,0x25,0x36,0x35, +0x27,0x0e,0x03,0x15,0x01,0xac,0x09,0x62,0x82,0x4d,0x20,0x07,0x10,0x1c,0x14,0x01,0x7c,0x31,0xd9,0x0f,0x1a,0xfe,0x35,0x2f,0x45,0x50,0x21,0x21,0x31,0x2d,0x2f,0x1e,0x2d,0xfe,0xaf,0x92,0x01,0x0b,0x11,0xa7,0x19,0x2b,0x1f,0x12,0x0d,0x1a,0x1e,0x4b,0x5b,0x6c,0x40,0x01,0x18,0x23,0x2d,0x20,0x17,0x0c,0xea,0xfe,0xd6,0x1a,0x09,0x0f, +0x10,0xfe,0xef,0x30,0x44,0x2d,0x15,0x07,0x13,0x21,0x19,0x2d,0xfe,0xd2,0x02,0x09,0x9a,0x0b,0x07,0xf1,0x10,0x1a,0x23,0x35,0x2c,0x00,0x00,0x02,0x00,0x13,0xff,0xe8,0x04,0x23,0x04,0x18,0x00,0x20,0x00,0x29,0x00,0x36,0x40,0x1e,0x11,0x0b,0xff,0x06,0x01,0x06,0x03,0x14,0x03,0x01,0x95,0x29,0xe0,0x03,0xf0,0x03,0x02,0x03,0x29,0x03, +0x29,0x0e,0x24,0x95,0x1b,0x10,0x09,0x95,0x0e,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xdd,0x5d,0xce,0x33,0x30,0x31,0x01,0x21,0x14,0x17,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x23,0x35,0x33,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x27, +0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x03,0xdd,0xfd,0x2d,0x06,0x03,0x13,0xfd,0x15,0x29,0x92,0x65,0xac,0x92,0x88,0xdd,0xa1,0xdb,0x31,0x71,0x53,0x06,0x49,0x7f,0xad,0x63,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0x26,0x21,0x81,0x4d,0x50,0x72,0x9a,0x62,0x98,0x8f,0x81,0x33,0x39,0x77,0xc7,0x8f, +0x4f,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x02,0x00,0x29,0xff,0xe8,0x04,0xc4,0x04,0x18,0x00,0x26,0x00,0x2f,0x00,0x27,0x40,0x14,0x0f,0x95,0x1b,0x1b,0x01,0x95,0x2f,0x13,0x2f,0x13,0x2f,0x09,0x2a,0x95,0x21,0x10,0x04,0x95,0x09,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f, +0xed,0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x04,0xc4,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88,0xdd,0x75,0xab,0x72,0x3a,0x04,0x0e,0x8a,0x29, +0x89,0x27,0x25,0x44,0x60,0x3b,0x22,0x0e,0x4c,0x77,0x9f,0x60,0x6f,0xa0,0x66,0x30,0xa8,0x01,0x86,0x79,0x41,0x66,0x4b,0x2e,0x09,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x4e,0x87,0xb4,0x66,0x77,0x4a,0x47,0x49,0x56,0x38,0x5a,0x40,0x22,0x5b,0x9f,0x77,0x45,0x50,0x88,0xb2,0x61,0x35,0x8f,0x9d,0x34,0x54,0x6c,0x38,0xff,0xff,0x00,0x35, +0x00,0x00,0x02,0xa0,0x06,0x02,0x02,0x06,0x00,0x49,0x00,0x00,0x00,0x03,0x00,0x60,0xfe,0x11,0x04,0x35,0x04,0x18,0x00,0x2d,0x00,0x42,0x00,0x4e,0x00,0x45,0x40,0x2b,0x24,0x15,0x18,0x27,0x0f,0x33,0x95,0x22,0x10,0x24,0x12,0x01,0x02,0x46,0x2a,0x12,0x04,0x05,0x49,0x96,0x2f,0x0f,0x01,0x0f,0x3d,0x95,0xef,0x18,0x01,0x18,0x40,0x09, +0x0f,0x48,0x18,0x15,0x43,0x96,0x05,0x1b,0x2d,0x00,0x1b,0x00,0x3f,0x32,0x3f,0xed,0x3f,0x2b,0x5d,0xed,0xde,0x5d,0xed,0x12,0x17,0x39,0x5d,0x3f,0xed,0x3f,0x12,0x39,0x39,0x30,0x31,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x35,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e, +0x02,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x14,0x07,0x16,0x16,0x17,0x03,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x01,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0xaa,0x1c,0x2b,0x49,0xbc,0x63,0x3a,0x69,0x50,0x2f,0x34,0x56,0x71,0x3e,0x51,0x9e,0x45,0x26,0x04,0x75,0xeb, +0x5f,0x9d,0x6f,0x3d,0x41,0x79,0xae,0x6d,0xcf,0x64,0x04,0xa4,0x4a,0x26,0x38,0x11,0xc9,0x2c,0x4e,0x69,0x3d,0x4b,0x78,0x54,0x2d,0x2a,0x4f,0x6f,0x45,0x45,0x72,0x53,0x2d,0xfe,0x95,0x4d,0x78,0x2d,0x30,0x6e,0x3e,0x4d,0x51,0x48,0xfe,0x11,0x42,0x36,0x3b,0x30,0x1c,0x35,0x4b,0x2f,0x31,0x4b,0x33,0x1b,0x29,0x27,0x5b,0x7e,0x70,0xc4, +0x47,0x83,0xba,0x73,0x82,0xd2,0x95,0x50,0xa6,0x8e,0xfc,0x52,0xd0,0x83,0x29,0x60,0x39,0x04,0x29,0x3c,0x6b,0x51,0x30,0x38,0x6c,0x9c,0x64,0x54,0x8b,0x63,0x36,0x35,0x5d,0x80,0x4b,0xfc,0xd1,0x2a,0x26,0x1f,0x22,0x27,0x1d,0x23,0x2a,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0xb7,0x05,0xec,0x00,0x2b,0x00,0x2b,0x40,0x15,0x21,0x20, +0x11,0x03,0x03,0x1a,0x27,0x0a,0x0b,0x20,0x27,0x0b,0x0b,0x27,0x20,0x03,0x16,0x2a,0x00,0x16,0x15,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x30,0x31,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x23,0x11,0x26,0x26, +0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x01,0xae,0x0f,0x1d,0x0e,0x1b,0x25,0x17,0x09,0x57,0x27,0x58,0x47,0x6f,0x68,0x0e,0x18,0x0c,0xa4,0x0f,0x20,0x11,0x32,0x29,0x2d,0x2a,0x26,0x4d,0x53,0x6a,0x68,0x1a,0x1e,0xa4,0x03,0x1f,0x06,0x08,0x10,0x1c,0x27,0x17,0x5b,0x19,0x52,0x17, +0x63,0x4c,0x5f,0x70,0x04,0x03,0xfd,0x4d,0x02,0xff,0x05,0x07,0x3c,0x2e,0x34,0x32,0x0e,0x51,0x0e,0x62,0x55,0x5f,0x70,0x08,0x02,0x84,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0xa4,0x05,0xec,0x00,0x26,0x00,0x4f,0x6e,0x00,0x00,0x27,0x00,0xd8,0x00,0x00,0xfe,0x71,0x00,0x07,0x00,0xd8,0x00,0x00,0xfd,0x3b,0x00,0x03,0xff,0xf6,0x00,0x00, +0x01,0xfa,0x05,0xec,0x00,0x15,0x00,0x1b,0x00,0x22,0x00,0x29,0x40,0x13,0x20,0x15,0x15,0x18,0x02,0x1f,0x0d,0x0d,0x19,0x0a,0x02,0x0a,0x02,0x0a,0x01,0x0b,0x00,0x01,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x2f,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x21,0x23,0x11,0x2e,0x03,0x35,0x34,0x36,0x37,0x11,0x33, +0x11,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x27,0x14,0x17,0x35,0x06,0x06,0x05,0x34,0x26,0x27,0x15,0x36,0x36,0x01,0x4a,0xa4,0x27,0x41,0x2e,0x1a,0x60,0x50,0xa4,0x50,0x60,0x1a,0x2f,0x41,0x26,0xe4,0x40,0x1d,0x23,0x01,0x1e,0x20,0x1a,0x1a,0x20,0x02,0x1c,0x0a,0x2a,0x3a,0x4a,0x2c,0x5b,0x7a,0x17,0x02,0x00,0xfe,0x01,0x16,0x7a,0x55, +0x2a,0x4a,0x3c,0x2d,0x0c,0xe6,0x5f,0x1e,0xf5,0x13,0x3f,0x26,0x23,0x3c,0x13,0xe3,0x13,0x3b,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0xb4,0x04,0x18,0x00,0x3a,0x00,0x47,0x00,0x36,0x40,0x1e,0x36,0x1a,0x95,0x38,0x03,0x96,0x01,0x01,0x3b,0x96,0x13,0x13,0x20,0x38,0x10,0x2e,0x24,0x95,0x31,0x10,0x2d,0x0f,0x2a,0x15,0x20,0x15,0x43,0x95, +0x09,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x10,0xed,0x32,0x30,0x31,0x01,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33, +0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x33,0x20,0x11,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x54,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66,0x3c,0x56,0x19,0x37,0x57,0x3e,0x35,0x5c,0x44,0x27,0xa4,0xe9,0x35,0x5b,0x42,0x26,0xa4,0xa4,0x04,0x6d,0xd1,0x34,0x5d,0x4b,0x38, +0x0e,0x72,0xe2,0x01,0x52,0xeb,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x01,0xd8,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x74,0x54,0x7a,0x4f,0x25,0x34,0x5a,0x76,0x42,0xfd,0xb8,0x02,0x60,0x01,0x2e,0x30,0x56,0x78,0x48,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0xfe,0x5f,0xfe,0xf2, +0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x58,0x04,0x18,0x00,0x26,0x00,0x33,0x00,0x2b,0x40,0x17,0x20,0x17,0x95,0x23,0x03,0x96,0x00,0x00,0x27,0x96,0x13,0x13,0x1c,0x23,0x10,0x1f,0x0f,0x1c,0x15,0x2f,0x95,0x09,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed, +0x10,0xed,0x32,0x30,0x31,0x01,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x10,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x03,0xf8,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42, +0x24,0x2a,0x4a,0x66,0x3c,0x56,0xee,0x7b,0x51,0x50,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0xeb,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x01,0xd8,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x70,0x01,0x46,0x5d,0x5c,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfe,0xf7,0x16,0x24,0x2f,0x19,0x35,0x3f, +0x50,0x43,0x63,0x00,0x00,0x02,0x00,0xa6,0xfe,0x11,0x04,0x1c,0x04,0x18,0x00,0x2e,0x00,0x3a,0x00,0x3f,0x40,0x28,0x17,0x95,0x24,0x10,0x20,0x0f,0x24,0x12,0x01,0x02,0x32,0x2b,0x12,0x04,0x05,0x35,0x96,0x2f,0x0f,0x5f,0x0f,0x6f,0x0f,0xef,0x0f,0x04,0x06,0x0f,0x01,0x0f,0x0f,0x1d,0x15,0x2e,0x00,0x00,0x2f,0x96,0x05,0x1b,0x00,0x3f, +0xed,0x33,0x2f,0x33,0x3f,0x33,0x2f,0x5d,0x5d,0xed,0x12,0x17,0x39,0x5d,0x3f,0x3f,0xed,0x30,0x31,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x35,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x16,0x16,0x17,0x25, +0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x91,0x1c,0x2a,0x4a,0xbb,0x64,0x3a,0x69,0x50,0x2f,0x34,0x56,0x71,0x3e,0x51,0x9e,0x46,0x26,0xee,0x3d,0x68,0x4c,0x2b,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x27,0x23,0x26,0x37,0x11,0xfd,0xca,0x44,0x83,0x2d,0x30,0x6e,0x3e,0x4d,0x51,0x47,0xfe,0x11,0x42,0x36,0x3b,0x30, +0x1c,0x35,0x4b,0x2f,0x31,0x4b,0x33,0x1b,0x29,0x27,0x5a,0x7f,0x02,0x0c,0x01,0x46,0x31,0x57,0x78,0x46,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfd,0xca,0x61,0x9e,0x3f,0x28,0x60,0x39,0x63,0x29,0x26,0x1f,0x23,0x27,0x1d,0x23,0x2a,0x00,0x00,0x02,0x00,0x64,0xff,0xd8,0x03,0xc9,0x04,0x12,0x00,0x1e,0x00,0x30,0x00,0x0d,0xb4,0x30, +0x1e,0x25,0x10,0x16,0x00,0x3f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x07,0x1e,0x03,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x07,0x23,0x26,0x26,0x27,0x35,0x3e,0x03,0x35,0x11,0x34,0x26,0x27,0x25,0x05,0x11,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x26,0x26,0x27,0x03,0x02,0x20,0x03,0x23,0x36,0x40,0x20,0x16,0x15,0x19,0x38, +0x5c,0x42,0xbd,0x43,0x04,0xbe,0xb4,0x10,0x13,0x0b,0x04,0x05,0x05,0x02,0x54,0xfe,0xa6,0x2d,0x52,0x42,0x2d,0x06,0x0e,0x26,0x22,0x18,0x29,0x28,0x30,0x56,0x13,0x03,0xd9,0x0e,0x05,0x3b,0x55,0x67,0x32,0x23,0x41,0x2a,0x28,0x4e,0x58,0x69,0x42,0xbe,0x14,0x50,0x2d,0x3e,0x05,0x11,0x20,0x31,0x26,0x01,0x57,0x33,0x53,0x22,0xdf,0xd4, +0xfd,0xb8,0x15,0x1e,0x15,0x0a,0x2b,0x47,0x5a,0x2f,0x3a,0x6d,0x3f,0x4a,0x74,0x2a,0x00,0x03,0x00,0x54,0xff,0xb4,0x03,0xc9,0x04,0x40,0x00,0x22,0x00,0x31,0x00,0x37,0x00,0x16,0x40,0x09,0x37,0x00,0x20,0x13,0x12,0x12,0x23,0x0e,0x16,0x00,0x3f,0xcd,0x33,0x2f,0x33,0x2f,0x33,0x33,0x30,0x31,0x01,0x07,0x16,0x16,0x17,0x16,0x16,0x15, +0x14,0x0e,0x02,0x07,0x07,0x23,0x26,0x26,0x27,0x07,0x23,0x37,0x27,0x35,0x3e,0x03,0x35,0x11,0x34,0x26,0x27,0x25,0x17,0x37,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x01,0x1e,0x03,0x03,0x11,0x13,0x26,0x26,0x27,0x03,0x9e,0x83,0x1b,0x46,0x22,0x16,0x15,0x19,0x38,0x5c,0x42,0xbd,0x43,0x03,0x60,0x5b,0x50,0x78,0x62,0x52,0x10, +0x13,0x0b,0x04,0x05,0x05,0x02,0x54,0x14,0x31,0xab,0x0e,0x26,0x22,0x18,0x29,0x28,0x06,0xfe,0xff,0x2b,0x4f,0x3f,0x2b,0xee,0xcb,0x1b,0x2d,0x0b,0x04,0x40,0xd3,0x2d,0x6d,0x36,0x23,0x41,0x2a,0x28,0x4e,0x58,0x69,0x42,0xbe,0x0e,0x31,0x1e,0x81,0x9f,0x16,0x3e,0x05,0x11,0x20,0x31,0x26,0x01,0x57,0x33,0x53,0x22,0xdf,0x22,0x50,0xfc, +0x64,0x2b,0x47,0x5a,0x2f,0x3a,0x6d,0x3f,0x09,0xfe,0x63,0x14,0x1c,0x14,0x09,0x02,0x9a,0xfe,0x64,0x01,0x48,0x27,0x42,0x1a,0x00,0x02,0x00,0x80,0xff,0xb4,0x04,0x50,0x04,0x40,0x00,0x23,0x00,0x2b,0x00,0x2b,0x40,0x15,0x0c,0x22,0x0e,0x23,0x23,0x1f,0x12,0x1b,0x12,0x1b,0x09,0x18,0x95,0x1f,0x10,0x0e,0x0e,0x24,0x95,0x09,0x16,0x00, +0x3f,0xed,0x33,0x2f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x30,0x31,0x01,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x23,0x37,0x26,0x27,0x33,0x16,0x16,0x17,0x01,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x17,0x37,0x01,0x32,0x36,0x35,0x34,0x27,0x01,0x16,0x04,0x25, +0x66,0x47,0x4a,0x48,0x84,0xbd,0x75,0x38,0x64,0x2d,0x36,0x78,0x53,0x7a,0x34,0xb3,0x0e,0x28,0x17,0x01,0x9c,0x4d,0x71,0x6b,0x9b,0x29,0xaf,0x34,0xfd,0xb9,0x4b,0x81,0x36,0x40,0xfe,0xb2,0xa0,0xaa,0x42,0xfe,0x72,0x3c,0x04,0x40,0xa5,0x45,0xce,0x84,0x79,0xc7,0x8e,0x4e,0x12,0x11,0x57,0x87,0x54,0x98,0x1f,0x34,0x15,0x02,0x99,0x36, +0x65,0x5e,0x9f,0xae,0x20,0x1f,0x67,0xfc,0x32,0xcd,0xbf,0xa8,0x65,0xfd,0x7f,0x18,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x1f,0x04,0x18,0x00,0x22,0x00,0x32,0x00,0x3b,0x00,0x2c,0x40,0x18,0x1e,0x95,0x19,0x10,0x33,0x95,0x16,0x14,0x08,0x21,0x21,0x0a,0x23,0x95,0x14,0x10,0x2d,0x95,0x0a,0x16,0x38,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f, +0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0x12,0x39,0xed,0x3f,0xed,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x20,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x1e,0x03,0x33, +0x32,0x36,0x37,0x07,0x1f,0x38,0x6b,0x9d,0x65,0x80,0xca,0x3c,0x83,0xfe,0xe1,0x72,0xb9,0x81,0x46,0x4a,0x89,0xc1,0x78,0x01,0x17,0x6f,0x39,0xc2,0x86,0xdd,0x88,0x92,0xac,0x9b,0xaf,0x04,0x02,0xd3,0xfb,0x3f,0x4e,0x7f,0x59,0x30,0x30,0x58,0x7e,0x4e,0xa0,0xac,0xac,0x01,0x52,0x0a,0x33,0x4e,0x64,0x3a,0x79,0x86,0x01,0x01,0xd3,0x73, +0xb6,0x7f,0x43,0x7e,0x6e,0xec,0x4b,0x89,0xc0,0x76,0x81,0xcc,0x8e,0x4b,0xd4,0x67,0x6d,0x62,0x9a,0x72,0xb9,0xac,0x01,0x65,0x38,0x69,0x98,0x5f,0x5a,0x8f,0x65,0x36,0xcc,0xbe,0xc3,0xcf,0xfe,0x10,0x43,0x6e,0x4f,0x2c,0x9d,0x8f,0x00,0x04,0x00,0x60,0xff,0xb4,0x07,0x21,0x04,0x40,0x00,0x2d,0x00,0x36,0x00,0x41,0x00,0x4a,0x00,0x41, +0x40,0x24,0x2e,0x95,0x29,0x2c,0x3f,0x34,0x0b,0x04,0x0c,0x2d,0x2d,0x29,0x10,0x42,0x95,0x10,0x13,0x26,0x24,0x19,0x19,0x13,0x1f,0x95,0x24,0x10,0x45,0x95,0x13,0x16,0x0c,0x0c,0x37,0x95,0x09,0x16,0x00,0x3f,0xed,0x33,0x2f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x3f,0x33,0x2f,0x12,0x17,0x39,0x10,0xed,0x30, +0x31,0x01,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x23,0x06,0x21,0x22,0x2e,0x02,0x35,0x35,0x21,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x16,0x17,0x37,0x05,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0x26,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x01,0x16,0x01,0x16, +0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0xf5,0x69,0x48,0x4d,0x4a,0x89,0xc2,0x77,0x6a,0x55,0x33,0x78,0x52,0x4d,0x2d,0x04,0x76,0xfe,0xf5,0x63,0x9a,0x6a,0x37,0x02,0xd5,0x02,0x2f,0x56,0x7a,0x4d,0xaf,0x90,0x89,0xdc,0x01,0x0d,0x71,0x04,0x82,0x01,0x1e,0x4d,0x85,0x38,0x43,0xfe,0xa9,0xa0,0xac,0x3c,0x39,0x01,0x9c,0x52,0x75,0x4f,0x7f, +0x59,0x2f,0x24,0x22,0xfe,0x72,0x39,0xfc,0x2a,0x02,0x85,0x75,0x3d,0x67,0x50,0x33,0x08,0x04,0x40,0xaa,0x45,0xc7,0x7c,0x81,0xcc,0x8e,0x4b,0x1f,0x53,0x84,0x38,0x63,0xeb,0x45,0x7f,0xb5,0x70,0x58,0x55,0x85,0x5c,0x2f,0x72,0x9a,0x62,0xed,0xed,0x23,0x21,0x6c,0xb2,0xcc,0xbe,0x72,0xa5,0x33,0x02,0x9a,0x3a,0xfc,0xe4,0x39,0x69,0x97, +0x5f,0x4e,0x7f,0x31,0xfd,0x7f,0x15,0x01,0x2c,0x8f,0x9d,0x2e,0x51,0x6e,0x3f,0x00,0x00,0x04,0x00,0x60,0xff,0xe8,0x07,0x21,0x04,0x18,0x00,0x24,0x00,0x2d,0x00,0x36,0x00,0x3f,0x00,0x3b,0x40,0x20,0x3a,0x95,0x1f,0x16,0x37,0x95,0x01,0x2b,0x95,0x31,0x1c,0x1a,0x01,0x0d,0x31,0x01,0x31,0x01,0x31,0x10,0x25,0x95,0x1a,0x16,0x2e,0x95, +0x10,0x10,0x06,0x95,0x0b,0x10,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x3f,0xed,0x30,0x31,0x13,0x21,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x20,0x27,0x23,0x06,0x21,0x22,0x2e,0x02,0x35,0x01, +0x32,0x3e,0x02,0x37,0x21,0x16,0x16,0x13,0x22,0x06,0x07,0x21,0x2e,0x03,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x60,0x02,0xd5,0x02,0x2f,0x56,0x7a,0x4d,0xaf,0x90,0x89,0xdc,0x01,0x0d,0x71,0x04,0x82,0x01,0x1e,0x73,0xb8,0x81,0x46,0x4a,0x89,0xc2,0x77,0xfe,0xda,0x6c,0x04,0x76,0xfe,0xf5,0x63,0x9a,0x6a,0x37,0x04,0xc3,0x49,0x77, +0x58,0x35,0x07,0xfd,0x63,0x0b,0xab,0x95,0x8c,0xa7,0x14,0x02,0x95,0x0a,0x38,0x55,0x72,0xfb,0x9e,0x02,0x85,0x75,0x3d,0x67,0x50,0x33,0x08,0x02,0x29,0x55,0x85,0x5c,0x2f,0x72,0x9a,0x62,0xed,0xed,0x4c,0x89,0xc0,0x75,0x81,0xcc,0x8e,0x4b,0xeb,0xeb,0x45,0x7f,0xb5,0x70,0xfe,0xa1,0x30,0x5b,0x82,0x52,0xab,0xb4,0x03,0x1c,0x9d,0x95, +0x47,0x72,0x4f,0x2a,0xfe,0x10,0x8f,0x9d,0x2e,0x51,0x6e,0x3f,0x00,0x02,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x00,0x32,0x00,0x42,0x00,0x1f,0x40,0x11,0x33,0x95,0x29,0x10,0x17,0x95,0x10,0x10,0x21,0x95,0x06,0x16,0x03,0x3d,0x95,0x00,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x30,0x31,0x05,0x22,0x26,0x27,0x06, +0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x07,0x26,0x22,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x9a,0x8d,0xd5,0x3f,0x42,0xd6,0x8f,0x71,0xb8,0x82, +0x47,0x49,0x88,0xc1,0x78,0x0d,0x18,0x0c,0x19,0x09,0x12,0x09,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0x4a,0x89,0xc0,0x77,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0xaa,0x18,0x71,0x66,0x66,0x71,0x4b,0x8a,0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x01,0x01,0x89,0x01,0x37,0x69, +0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0x7e,0xc8,0x8b,0x49,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0xc1,0xcf,0x00,0x03,0x00,0x60,0xff,0xb4,0x07,0x98,0x04,0x40,0x00,0x3c,0x00,0x47,0x00,0x4f,0x00,0x30,0x40,0x1b,0x03,0x45,0x4d,0x32,0x04,0x05,0x33,0x33,0x3d,0x95, +0x2f,0x10,0x1d,0x95,0x16,0x10,0x09,0x27,0x95,0x0c,0x16,0x05,0x05,0x48,0x95,0x00,0x16,0x00,0x3f,0xed,0x33,0x2f,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x33,0x2f,0x12,0x17,0x39,0x30,0x31,0x05,0x22,0x26,0x27,0x07,0x23,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x07,0x26,0x22,0x23, +0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x01,0x26,0x03,0x32,0x36,0x35,0x34,0x27,0x01,0x16,0x05,0x9a,0x38,0x64,0x2d,0x36,0x78,0x54,0x26,0x3f,0x19,0x42,0xd6,0x8f,0x71,0xb8,0x82,0x47,0x49, +0x88,0xc1,0x78,0x0d,0x18,0x0c,0x19,0x09,0x12,0x09,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0x4a,0x89,0xc0,0x77,0x4b,0x81,0x36,0x40,0x79,0x66,0x47,0x4a,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x3f,0x3a,0x01,0x9b,0x4d,0x71,0xa0,0xaa,0x42,0xfe,0x72,0x3c,0x18,0x13,0x11,0x58,0x87,0x1a,0x42,0x28,0x66,0x71,0x4b,0x8a, +0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x01,0x01,0x89,0x01,0x37,0x69,0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0x7e,0xc8,0x8b,0x49,0x20,0x1f,0x67,0xa5,0x45,0xce,0x84,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x69,0x9f,0x33,0x02,0x99,0x36,0xfc,0xe4,0xcd,0xbf,0xa8,0x65,0xfd,0x7f,0x18,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xe4, +0x04,0x00,0x00,0x11,0x00,0x19,0x40,0x0c,0x0b,0x03,0x96,0x0e,0x0e,0x07,0x0c,0x0f,0x07,0x15,0x00,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x30,0x31,0x21,0x35,0x10,0x21,0x22,0x06,0x15,0x15,0x23,0x35,0x10,0x25,0x11,0x33,0x11,0x04,0x11,0x15,0x03,0x40,0xfe,0xf5,0x8c,0x88,0xa4,0x01,0x62,0xa4,0x01,0x61,0x6b,0x01,0x3c, +0xa0,0xa8,0x5f,0x58,0x01,0xab,0x29,0x01,0xd4,0xfe,0x2b,0x2c,0xfe,0x54,0x53,0x00,0x00,0x02,0x00,0xb0,0xfe,0x8d,0x04,0x24,0x04,0x33,0x00,0x2a,0x00,0x35,0x00,0x1d,0x40,0x0e,0x0a,0x27,0x3a,0x30,0x30,0x28,0x2f,0x3a,0x2a,0x16,0x3a,0x1d,0x28,0x08,0x00,0x3f,0xdc,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x01,0x32,0x1e, +0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x02,0x1d,0x56,0x8a,0x61,0x34,0x26,0x46,0x62,0x3c,0x3c,0x55,0x37,0x19,0x09,0x1b,0x30,0x28,0x11,0x20, +0x0e,0x11,0x22,0x13,0x96,0x83,0x27,0x40,0x51,0x29,0x90,0xa4,0x02,0x37,0x77,0x76,0xa6,0xa0,0x37,0x59,0x40,0x23,0x04,0x33,0x27,0x4a,0x69,0x43,0x3b,0x62,0x4c,0x35,0x0d,0x03,0x14,0x2e,0x3e,0x4f,0x33,0xe8,0x3b,0x58,0x3a,0x1e,0x05,0x05,0x88,0x04,0x04,0xb8,0xb9,0xff,0x25,0x43,0x33,0x1d,0xfe,0x4b,0x04,0x33,0xfe,0xd7,0x57,0x4c, +0xfe,0x8e,0x1e,0x37,0x4c,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0xef,0x04,0x00,0x00,0x0d,0x00,0x11,0xb7,0x09,0x00,0x0d,0x0f,0x07,0x0f,0x05,0x15,0x00,0x3f,0x3f,0x3f,0x33,0x32,0x30,0x31,0x01,0x06,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x37,0x01,0xef,0x35,0x2a,0x46,0xa4,0xa4,0x04,0x18,0x51,0x35,0x03,0x6a, +0x18,0x3a,0x62,0xac,0xfd,0xf6,0x04,0x00,0xd3,0x49,0x68,0x1a,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf2,0x04,0x12,0x00,0x1e,0x00,0x1b,0x40,0x0e,0x14,0x07,0x0a,0xec,0x1a,0x10,0x13,0x0f,0x10,0x15,0x05,0xec,0x00,0x10,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x30,0x31,0x01,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x26,0x26,0x23, +0x22,0x06,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x36,0x03,0x90,0x3e,0x24,0x2c,0x50,0x65,0x45,0x2a,0x50,0x20,0x35,0x4a,0x23,0x46,0xa4,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x32,0x49,0x1a,0x47,0x04,0x12,0x0e,0xaa,0x21,0x5b,0x37,0x24,0x31,0x32,0x62,0xac,0xfd,0xf6,0x04,0x00,0xd3,0x36,0x55, +0x3b,0x1f,0x20,0x1d,0x3d,0x00,0x00,0x02,0x00,0x1c,0xff,0xe8,0x03,0x9e,0x04,0x12,0x00,0x26,0x00,0x33,0x00,0x28,0x40,0x15,0x02,0xec,0x24,0x10,0x0a,0x96,0x07,0x07,0x27,0x96,0x1e,0x1c,0x1b,0x1b,0x10,0x1c,0x0f,0x2f,0x95,0x10,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x2f,0xed,0x3f,0xed,0x30,0x31,0x01,0x26, +0x23,0x22,0x07,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x17,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x03,0x9e,0x2c,0x50,0x6a,0x46,0x46,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66, +0x3c,0x56,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x3e,0x24,0xfd,0xa3,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x03,0x5a,0x21,0x63,0x62,0xac,0x32,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x02,0x28,0xd3,0x36,0x55,0x3b,0x1f,0x0e,0xfd,0x65,0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x02, +0x00,0x1c,0xff,0xe8,0x04,0xd4,0x04,0x12,0x00,0x32,0x00,0x3f,0x00,0x30,0x40,0x1a,0x07,0x0a,0xec,0x2e,0x10,0x14,0x96,0x11,0x11,0x33,0x96,0x28,0x27,0x25,0x25,0x1a,0x27,0x0f,0x3b,0x95,0x1a,0x16,0x05,0xec,0x00,0x10,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x2f,0xed,0x3f,0xed,0x32,0x30,0x31,0x01,0x32, +0x17,0x15,0x26,0x23,0x22,0x07,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x36,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x04,0x72,0x3e,0x24,0x2c,0x50,0x65,0x45, +0x2a,0x50,0x20,0x35,0x4a,0x23,0x23,0x23,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66,0x3c,0x56,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x32,0x49,0x1a,0x47,0xfd,0x29,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x04,0x12,0x0e,0xaa,0x21,0x5b,0x37,0x24,0x31,0x32,0x32,0x90,0x56,0x28,0x6f,0x63,0x46,0x6b,0x48,0x25, +0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x02,0x28,0xd3,0x36,0x55,0x3b,0x1f,0x20,0x1d,0x3d,0xfd,0x57,0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x03,0x14,0x04,0x00,0x00,0x15,0x00,0x1d,0x40,0x0e,0x05,0x96,0x0f,0x0a,0x0f,0x0a,0x0f,0x01,0x14,0x0f,0x0c,0x0f,0x01,0x15,0x00,0x3f,0x3f,0x3f, +0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x30,0x31,0x21,0x23,0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x03,0x14,0xa4,0x2d,0x70,0x46,0x4a,0x6e,0x2b,0x6e,0x83,0x27,0x64,0x41,0x25,0x4a,0x3f,0x2e,0x09,0xa4,0x03,0x64,0x1a,0x1f,0x1f,0x1c,0xd4,0x01,0x6e,0x38,0x24,0x10,0x1a,0x21, +0x11,0x00,0x00,0x02,0x00,0x3c,0xff,0xe9,0x05,0x06,0x04,0x00,0x00,0x20,0x00,0x2c,0x00,0x29,0x40,0x16,0x21,0x96,0x1c,0x09,0x96,0x13,0x0d,0x1c,0x13,0x13,0x1c,0x0d,0x03,0x00,0x18,0x0f,0x10,0x0f,0x27,0x96,0x00,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x30,0x31,0x05,0x22,0x2e,0x02,0x35, +0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x11,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xb0,0x48,0x76,0x54,0x2e,0x2d,0x70,0x46,0x4a,0x6e,0x2b,0x6e,0x83,0x27,0x64,0x41,0x25,0x4a,0x3f,0x2e,0x09,0xa4,0x49,0x6b,0x01, +0x3e,0xb2,0x94,0x5d,0x4f,0x4e,0x5b,0x5a,0x4c,0x4b,0x17,0x27,0x4b,0x70,0x4a,0x02,0x4f,0x1a,0x1f,0x1f,0x1c,0xd4,0x01,0x6e,0x38,0x24,0x10,0x1a,0x21,0x11,0xfe,0x73,0x24,0xfe,0xac,0xaa,0xb0,0x02,0x52,0x81,0x83,0x79,0x79,0x7a,0x7d,0x80,0x7f,0x00,0xff,0xff,0xff,0x92,0xfe,0x1e,0x02,0x68,0x06,0x02,0x02,0x06,0x05,0x88,0x00,0x00, +0x00,0x01,0x00,0x90,0xff,0xe8,0x03,0xe2,0x04,0x00,0x00,0x12,0x00,0x19,0x40,0x0c,0x11,0x11,0x01,0x09,0x0f,0x02,0x0c,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x30,0x31,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6, +0xfe,0x92,0xa3,0xf8,0x79,0x4c,0x4e,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x58,0x58,0x90,0x01,0x03,0x00,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0xa4,0x04,0x00,0x00,0x15,0x00,0x1f,0x00,0x28,0x40,0x13,0x0a,0x01,0x18,0x10,0x14,0x0d,0x10,0x12,0x10,0x12,0x10,0x07,0x0f,0x0f,0x04,0x1b,0x95,0x07,0x15,0x00,0x3f,0xed, +0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xcd,0x32,0x32,0x30,0x31,0x01,0x23,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x35,0x33,0x15,0x33,0x05,0x35,0x21,0x15,0x10,0x33,0x32,0x3e,0x02,0x04,0xa4,0x98,0xa4,0x04,0x66,0xd5,0xfe,0x8f,0x97,0x97,0xa4,0x02,0x0c,0xa4,0x98,0xfe, +0xc4,0xfd,0xf4,0xfa,0x3c,0x65,0x48,0x29,0x01,0xdb,0xfe,0x25,0xa2,0xba,0x01,0xb4,0x3f,0x8b,0x01,0x9a,0xfe,0x66,0x50,0x50,0xb4,0x29,0x25,0xfe,0xbc,0x2f,0x54,0x76,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0x54,0x04,0x12,0x00,0x27,0x00,0x3b,0x00,0x29,0x40,0x16,0x0e,0x0e,0x25,0x28,0x32,0x10,0x07,0x95,0x25,0x16,0x23,0x1b,0x11,0x95, +0x1e,0x16,0x1a,0x15,0x17,0x0f,0x01,0x0f,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x3f,0xed,0x3f,0xcd,0x12,0x39,0x2f,0x30,0x31,0x13,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x23,0x20,0x11,0x01,0x22,0x2e, +0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0xa6,0xa4,0x19,0x36,0x57,0x3f,0x34,0x5c,0x45,0x27,0xa4,0xe9,0x36,0x5b,0x42,0x25,0xa4,0xa4,0x04,0x6e,0xd0,0x35,0x5d,0x4b,0x37,0x0e,0x72,0xe2,0xfe,0xae,0x02,0xd7,0x16,0x27,0x1c,0x11,0x11,0x1c,0x27,0x16,0x16,0x28,0x1d,0x11,0x11,0x1d,0x28,0x04,0x00,0xfd,0xb4, +0x55,0x7a,0x4e,0x25,0x35,0x59,0x76,0x42,0x8d,0xa5,0xfe,0xd2,0x30,0x57,0x77,0x48,0x02,0x48,0xfc,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0x01,0xa1,0x01,0xb4,0x10,0x1c,0x27,0x17,0x17,0x27,0x1d,0x10,0x10,0x1d,0x27,0x17,0x16,0x27,0x1c,0x11,0x00,0x00,0x02,0x00,0xa6,0xff,0xee,0x06,0x54,0x04,0x18,0x00,0x27,0x00,0x3b,0x00,0x2b, +0x40,0x17,0x28,0x32,0x16,0x07,0x95,0x25,0x10,0x11,0x95,0x1e,0x10,0x23,0x1b,0x19,0x0e,0x0e,0x18,0x19,0x0f,0x18,0x15,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x3f,0xcd,0x30,0x31,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11, +0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x33,0x20,0x11,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x06,0x54,0xa4,0x19,0x36,0x57,0x3f,0x35,0x5b,0x45,0x27,0xa4,0xe9,0x36,0x5b,0x42,0x25,0xa4,0xa4,0x04,0x6d,0xd1,0x34,0x5e,0x4b,0x37,0x0e,0x72,0xe2,0x01,0x52,0xfd,0x29, +0x16,0x27,0x1c,0x11,0x11,0x1c,0x27,0x16,0x17,0x27,0x1d,0x11,0x11,0x1d,0x27,0x02,0x4c,0x55,0x7a,0x4e,0x25,0x35,0x59,0x76,0x42,0x8d,0xa5,0x01,0x2e,0x30,0x57,0x77,0x48,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0xfe,0x5f,0xfe,0x4c,0x10,0x1c,0x27,0x17,0x17,0x27,0x1d,0x10,0x10,0x1d,0x27,0x17,0x16,0x27,0x1c,0x11, +0x00,0x01,0x00,0x0e,0xff,0xe8,0x04,0x46,0x04,0x31,0x00,0x21,0x00,0x1c,0x40,0x0e,0x0d,0x95,0x13,0x13,0x02,0x01,0x20,0x0f,0x1b,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x39,0x33,0x2f,0xed,0x30,0x31,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02, +0x15,0x11,0x10,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x04,0x46,0xa4,0x04,0x66,0xd6,0xfe,0x92,0x0a,0x1c,0x35,0x2a,0x1e,0x2a,0x19,0x2a,0x4c,0x48,0x68,0x43,0x20,0xf8,0x79,0x4c,0x4e,0xa4,0xa2,0xba,0x01,0xb4,0x01,0x2b,0x38,0x54,0x37,0x1c,0x0d,0x0e,0x94,0x12,0x34,0x5e,0x82,0x4e,0xfe,0xe7,0xfe,0xbc,0x58,0x58,0x90,0x02,0x4e,0x00, +0xff,0xff,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x02,0x06,0x01,0xd3,0x00,0x00,0x00,0x02,0x00,0x0c,0xfe,0x21,0x04,0xbc,0x04,0x18,0x00,0x28,0x00,0x3c,0x00,0x28,0x40,0x15,0x38,0x18,0x0a,0x1b,0x07,0x04,0x19,0x1f,0x1f,0x08,0x19,0x0f,0x0d,0xec,0x12,0x10,0x2e,0x00,0x00,0x08,0x1b,0x00,0x3f,0x33,0x2f,0x32,0x3f,0xed,0x3f,0x12, +0x39,0x2f,0x12,0x17,0x39,0x33,0x30,0x31,0x01,0x22,0x26,0x27,0x26,0x26,0x27,0x03,0x01,0x23,0x01,0x03,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x17,0x13,0x01,0x33,0x01,0x13,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0xea, +0x3e,0x5c,0x1c,0x1c,0x35,0x1f,0xa0,0xfe,0xa1,0xb9,0x01,0xc6,0xae,0x42,0x48,0x2e,0x2a,0x21,0x4a,0x2b,0x44,0x39,0x32,0x1a,0x8c,0x01,0x11,0xb9,0xfe,0x89,0xdc,0x1c,0x4c,0x2d,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d,0x8c,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0xfe,0x21,0x38,0x30,0x30,0x6c, +0x43,0x01,0x56,0xfd,0x6f,0x03,0x38,0x01,0x89,0x94,0x0e,0x9a,0x0a,0x15,0x32,0x51,0x3c,0xfe,0xb6,0x02,0x06,0xfd,0x58,0xfe,0x18,0x1a,0x1b,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0xc6,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x00,0x01,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x00,0x21, +0x00,0x20,0x40,0x12,0x02,0xec,0x1f,0x1c,0x08,0x16,0x05,0x19,0x04,0x07,0x18,0x1b,0x13,0xec,0x0e,0x10,0x07,0x0f,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x17,0x39,0x3f,0xed,0x30,0x31,0x13,0x16,0x33,0x32,0x37,0x13,0x01,0x33,0x01,0x13,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x03,0x01,0x23,0x01,0x03,0x0e,0x03,0x23,0x22,0x27, +0x0c,0x27,0x27,0x48,0x44,0xec,0xfe,0x89,0xb9,0x01,0x11,0x8c,0x1a,0x32,0x39,0x44,0x2b,0x4a,0x21,0x2a,0x2e,0x48,0x42,0xae,0x01,0xc6,0xb9,0xfe,0xa1,0x9f,0x26,0x44,0x45,0x4b,0x2d,0x31,0x2b,0xfe,0xc6,0x10,0x96,0x02,0x0c,0x02,0xa8,0xfd,0xfa,0x01,0x4a,0x3d,0x52,0x31,0x14,0x0a,0x9a,0x0e,0x94,0xfe,0x77,0xfc,0xc8,0x02,0x91,0xfe, +0x95,0x57,0x75,0x48,0x1e,0x09,0x00,0x02,0x00,0x1a,0xff,0xd3,0x04,0x2c,0x04,0x00,0x00,0x27,0x00,0x3b,0x00,0x26,0x40,0x16,0x21,0x0f,0x37,0x25,0x01,0x1f,0x18,0x04,0x05,0x40,0x0b,0x0e,0x48,0x05,0x05,0x1d,0x15,0x2d,0x0f,0x16,0x00,0x0f,0x00,0x3f,0x3f,0x33,0x3f,0x39,0x2f,0x2b,0x17,0x39,0x33,0x3f,0x30,0x31,0x01,0x01,0x17,0x36, +0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0x92,0xfe,0xa8,0x88,0x1c,0x51,0x32,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d, +0x2b,0x34,0x46,0x34,0x2c,0x19,0x63,0x09,0x17,0x0d,0x04,0x02,0x18,0x15,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x1b,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x04,0x00,0xfd,0xfa,0xe2,0x1e,0x21,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0x1b,0x32,0x49,0x2e, +0xb5,0x11,0x26,0x17,0x05,0x26,0x23,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfc,0x99,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x00,0x01,0xff,0x1f,0xfe,0x57,0x03,0x92,0x04,0x00,0x00,0x15,0x00,0x1a,0x40,0x0e,0x06,0x0d,0x01,0x13,0x04,0x03,0x15,0x0f,0x0f,0x0f, +0x0b,0x1b,0x03,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x30,0x31,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x03,0x92,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xfe,0x38,0xbd,0x02,0x58,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00, +0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfd,0x0b,0x03,0x9f,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0x00,0x02,0xff,0x1f,0xfe,0x57,0x04,0x2c,0x04,0x00,0x00,0x27,0x00,0x3b,0x00,0x2a,0x40,0x18,0x37,0x18,0x1f,0x01,0x25,0x04,0x27,0x2f,0x05,0x3f,0x05,0x02,0x05,0x05,0x0f,0x27,0x0f,0x21,0x0f,0x1d, +0x1b,0x2d,0x0f,0x16,0x00,0x3f,0x33,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x5d,0x12,0x17,0x39,0x33,0x30,0x31,0x01,0x01,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e, +0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0x92,0xfe,0xa8,0x88,0x1c,0x51,0x32,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d,0x2b,0x29,0x3f,0x36,0x2e,0x16,0x74,0x09,0x17,0x0d,0x04,0x02,0x18,0x15,0xfe,0x38,0xbd,0x02,0x58,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x1b,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d, +0x26,0x15,0x15,0x26,0x1d,0x10,0x04,0x00,0xfd,0xfa,0xe2,0x1e,0x21,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0x15,0x29,0x3e,0x29,0xd4,0x11,0x26,0x17,0x05,0x26,0x23,0xfd,0x0b,0x03,0x9f,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfc,0x99,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x01, +0xfe,0xc8,0xfe,0x21,0x03,0x7a,0x04,0x00,0x00,0x23,0x00,0x1d,0x40,0x10,0x02,0xec,0x21,0x1c,0x0e,0x12,0x08,0x17,0x04,0x10,0x14,0x15,0x10,0x0f,0x0a,0x0f,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x3f,0xed,0x30,0x31,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x33,0x01,0x01,0x23,0x03,0x26,0x27, +0x23,0x06,0x06,0x07,0x01,0x0e,0x03,0x23,0x22,0x27,0xfe,0xc8,0x27,0x27,0x14,0x1d,0x1f,0x2a,0x21,0x01,0xae,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0xb5,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xfe,0xab,0x2b,0x41,0x3c,0x41,0x2a,0x31,0x2b,0xfe,0xc6,0x10,0x0a,0x21,0x3f,0x34,0x02,0xa2,0x02,0x0a, +0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfd,0xdc,0x45,0x64,0x40,0x1e,0x09,0x00,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x03,0x40,0x04,0x00,0x00,0x14,0x00,0x18,0x40,0x0b,0x0f,0x0b,0x14,0x14,0x03,0x0d,0x0f,0x08,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0x30,0x31, +0x01,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0x40,0xfe,0xbe,0x7e,0xe4,0x41,0x2a,0x34,0x2d,0x7d,0x3d,0x52,0xfe,0x70,0xb6,0x01,0x15,0x15,0x06,0x02,0x0a,0x08,0x99,0x02,0x89,0xfc,0xd3,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x4e,0x0c,0x26,0x1a, +0x01,0x9f,0x00,0x02,0x00,0x25,0x03,0x50,0x02,0x4a,0x05,0xbe,0x00,0x10,0x00,0x21,0x00,0x14,0xb7,0x11,0x16,0x14,0x1c,0x0b,0x10,0x0d,0x05,0x00,0x2f,0xcd,0xcc,0x32,0xde,0xcd,0xcc,0x32,0x30,0x31,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e, +0x02,0x17,0x02,0x4a,0x05,0x2e,0x4a,0x61,0x39,0x3a,0x61,0x47,0x2a,0x02,0x64,0x0c,0xa0,0x45,0x60,0x0a,0x0a,0x60,0x45,0xa0,0x0c,0x64,0x02,0x2a,0x47,0x61,0x3a,0x37,0x62,0x4a,0x2f,0x05,0x05,0xbe,0x38,0x5c,0x43,0x25,0x24,0x42,0x5d,0x39,0x9b,0x53,0x48,0xfd,0x92,0x48,0x53,0x9b,0x39,0x5d,0x42,0x24,0x25,0x42,0x5d,0x38,0x00,0x01, +0x00,0x64,0x01,0xbc,0x02,0x4e,0x05,0xc4,0x00,0x21,0x00,0x14,0xb7,0x12,0x1f,0x1f,0x19,0x1a,0x0a,0x05,0x19,0x00,0x2f,0xdc,0xcd,0x2f,0x12,0x39,0x2f,0xcd,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02, +0x4e,0x1f,0x3a,0x56,0x36,0x2b,0x24,0x2b,0x26,0x13,0x25,0x1b,0x11,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a,0xb4,0x02,0xa0,0x3e,0x57,0x36,0x19,0x10,0x5f,0x16,0x06,0x1a,0x32,0x2c,0x01,0x3a,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0x00,0x01,0x00,0x00,0x02,0x9a,0x01,0xf4,0x05,0xc4,0x00,0x28, +0x00,0x29,0x40,0x13,0x1c,0x1d,0x0e,0x02,0x02,0x16,0x23,0x07,0x08,0x1d,0x23,0x08,0x08,0x23,0x1d,0x03,0x12,0x27,0x12,0x00,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x30,0x31,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26, +0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x01,0x3c,0x12,0x11,0x24,0x1b,0x3f,0x1e,0x42,0x35,0x50,0x4b,0x10,0x0d,0x80,0x0a,0x14,0x0b,0x21,0x1b,0x21,0x1e,0x1e,0x39,0x3f,0x4d,0x4c,0x09,0x11,0x09,0x80,0x04,0x6b,0x05,0x27,0x20,0x3d,0x11,0x43,0x11,0x48,0x38,0x45,0x52, +0x03,0xfe,0x81,0x01,0xb9,0x03,0x04,0x29,0x1f,0x23,0x23,0x0a,0x41,0x0b,0x48,0x3e,0x45,0x52,0x03,0x02,0x01,0x20,0x00,0x01,0x00,0x00,0x02,0x95,0x01,0xbf,0x05,0xc0,0x00,0x2f,0x00,0x23,0x40,0x0f,0x03,0x2d,0x2d,0x0a,0x10,0x10,0x28,0x22,0x22,0x15,0x1b,0x1b,0x07,0x1e,0x07,0x00,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x33,0x2f,0xcd,0x32, +0x2f,0xcd,0x33,0x2f,0xcd,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x35,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x35,0x33,0x11,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x27,0x15,0x16,0x33,0x32,0x37,0x01,0xbf,0x02,0x40,0x38,0x11,0x10,0x86,0x14, +0x0d,0x41,0x02,0x3a,0x02,0x40,0x3b,0x11,0x10,0x14,0x0d,0x41,0x02,0x3a,0x02,0x40,0x3b,0x11,0x10,0x86,0x0d,0x11,0x3e,0x02,0x3d,0x02,0x40,0x38,0x11,0x10,0x0d,0x11,0x3e,0x02,0x04,0x3d,0x47,0x59,0x03,0xfe,0xf5,0x01,0x45,0x06,0x50,0x49,0x57,0x04,0x76,0x06,0x50,0x49,0x57,0x04,0xcc,0xfe,0xf7,0x04,0x52,0x47,0x59,0x03,0x79,0x04, +0x52,0x00,0x00,0x01,0x00,0x00,0x02,0x8d,0x02,0x80,0x04,0xfc,0x00,0x25,0x00,0x19,0x40,0x0a,0x0c,0x13,0x13,0x02,0x01,0x25,0x1e,0x06,0x06,0x01,0x00,0x2f,0x33,0x2f,0xcd,0x2f,0x12,0x39,0x33,0x2f,0xcd,0x30,0x31,0x01,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02, +0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x02,0x80,0x7f,0x02,0x1d,0x4f,0x3d,0xd3,0x1c,0x30,0x11,0x18,0x0e,0x0c,0x2e,0x16,0x29,0x42,0x2d,0x18,0x05,0x14,0x29,0x23,0x24,0x3a,0x29,0x15,0x7f,0x02,0x9a,0x5c,0x35,0x34,0xf7,0xa0,0x40,0x3f,0x07,0x08,0x5e,0x05,0x05,0x1e,0x35,0x4a,0x2c,0x8c,0x2e,0x45,0x2e,0x17, +0x1e,0x33,0x41,0x24,0x01,0x3b,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x0e,0x04,0x18,0x00,0x14,0x00,0x29,0x00,0x1b,0x40,0x0e,0x00,0x1b,0x95,0x13,0x10,0x06,0x25,0x95,0x09,0x16,0x04,0x15,0x03,0x0f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x30,0x31,0x01,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34, +0x3e,0x02,0x33,0x32,0x13,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0x66,0x04,0xa4,0xa4,0x04,0x7a,0xe8,0x63,0x9c,0x6c,0x39,0x40,0x79,0xad,0x6d,0xcc,0x6b,0x2c,0x4e,0x6b,0x3f,0x4a,0x76,0x52,0x2c,0x29,0x4c,0x6c,0x44,0x48,0x75,0x53,0x2d,0x03,0x6c,0x94,0xfc,0x00,0xb4,0xcc,0x48,0x84, +0xbb,0x73,0x7f,0xd0,0x95,0x52,0xfd,0xb7,0x8f,0x3e,0x6f,0x53,0x30,0x3b,0x6f,0xa0,0x65,0x55,0x87,0x5f,0x32,0x36,0x5e,0x7f,0xff,0xff,0x00,0x58,0x00,0x00,0x04,0xb8,0x04,0x45,0x02,0x06,0x0d,0x80,0x00,0x00,0xff,0xff,0x00,0xcf,0x03,0xca,0x01,0x88,0x04,0x7f,0x00,0x07,0x0f,0x50,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0xcf,0xfe,0xe8, +0x01,0x88,0xff,0x9d,0x00,0x07,0x0f,0x50,0x00,0x2b,0xfe,0xed,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x04,0x7f,0x00,0x07,0x0f,0x51,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfe,0xe8,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x51,0x00,0x2b,0xfe,0xed,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x05,0x97,0x00,0x07,0x0f,0x53,0x00,0x2b, +0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x53,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x05,0x97,0x00,0x07,0x0f,0x54,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x54,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29, +0x05,0x97,0x00,0x07,0x0f,0x56,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x56,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x67,0xfe,0x36,0x01,0xf0,0xff,0x9e,0x00,0x06,0x0f,0x5d,0x2b,0x37,0xff,0xff,0x00,0xcf,0x03,0xca,0x01,0x88,0x05,0x97,0x00,0x07,0x0f,0x52,0x00,0x2b,0x03,0xcf,0xff,0xff, +0x00,0xcf,0xfd,0xd0,0x01,0x88,0xff,0x9d,0x00,0x07,0x0f,0x52,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x8b,0xfe,0x63,0x01,0xcc,0xff,0xa4,0x00,0x06,0x0f,0x5b,0x2b,0x64,0xff,0xff,0x00,0x0c,0x03,0xca,0x02,0x72,0x06,0x2c,0x00,0x07,0x0f,0x57,0x00,0x46,0x03,0xca,0xff,0xff,0x00,0x0c,0xfe,0x17,0x02,0x72,0x00,0x79,0x00,0x07,0x0f,0x57, +0x00,0x46,0xfe,0x17,0xff,0xff,0xff,0xd4,0x03,0xc3,0x02,0x33,0x06,0xa7,0x02,0x07,0x0e,0x65,0x00,0x00,0xfe,0xa3,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x05,0x95,0x00,0x27,0x0a,0x65,0x00,0x1e,0xfe,0xa3,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x06,0xa0,0x00,0x27,0x0a,0x66,0x00,0x1e,0xfe,0xa3, +0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x05,0x9f,0x00,0x27,0x0a,0x67,0x00,0x1e,0xfe,0xa3,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x05,0xff,0xf2,0x02,0x01,0x07,0x8d,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x2c,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x01,0x07,0x8d,0x02,0x26, +0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x2c,0x00,0x00,0x00,0x02,0x00,0x52,0xfe,0x9c,0x0c,0xb6,0x03,0xba,0x00,0x7a,0x00,0x8a,0x00,0x68,0xb1,0x72,0x03,0xbd,0x04,0xfb,0x00,0x77,0x05,0x03,0x00,0x15,0x00,0x6a,0x04,0xfb,0xb6,0x6b,0x6b,0x59,0x1f,0x5e,0x37,0x34,0xb8,0x04,0xfb,0xb6,0x7b,0x55,0x59,0x33,0x33,0x2c,0x3c,0x41,0x09,0x04, +0xfb,0x00,0x59,0x05,0x03,0x00,0x7e,0x04,0xfb,0x00,0x50,0x05,0x03,0x00,0x86,0x04,0xfb,0xb5,0x2f,0x46,0x01,0x46,0x46,0x25,0xb8,0x04,0xff,0xb3,0x2c,0x0e,0x0e,0x2c,0x00,0x2f,0x33,0x2f,0x10,0xed,0x33,0x2f,0x5d,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x32,0x32,0x39,0x11,0x33,0x2f,0xed,0x32,0x3f,0xed,0x32, +0x30,0x31,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x00,0x17,0x1e,0x03,0x17,0x26,0x26,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23, +0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x05,0x15,0x14,0x1e,0x02,0x17,0x07,0x2e,0x05,0x27,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x52,0x61,0xa6,0x39,0x4f,0x6c,0x42,0x1d,0x3b,0x60,0x7b,0x40,0xb9,0x01,0x05,0x2d,0x1f,0x5e,0x76,0x8a,0x4b, +0x06,0x09,0x31,0x5a,0x80,0x9f,0xb9,0x67,0x39,0x60,0x68,0x7d,0x56,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x13,0x30,0x55,0x44,0x3f,0x56,0x3a,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x32,0x88,0x55,0x31,0x43,0x6e, +0x50,0x30,0x05,0x30,0x6f,0x70,0x66,0x50,0x2f,0x24,0x4b,0x73,0x50,0x2f,0x50,0xad,0xad,0xa5,0x91,0x77,0x28,0x1c,0x53,0x67,0x76,0x3f,0x3a,0x9a,0x4b,0x09,0xd1,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3e,0x2e,0xa9,0x0b,0x0b,0x15,0x2c,0x44,0x2f,0x49,0x9c,0x9f,0xa1,0x4e,0xfe,0xdc,0xf9,0x5a,0x97,0x7b,0x61,0x23, +0x1e,0x39,0x12,0x38,0x57,0x47,0x3e,0x3d,0x42,0x29,0x05,0x1b,0x36,0x2a,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2a,0x3a,0x26,0x11,0x2e,0x41,0x48,0x1a,0x2f,0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f,0x4b,0x48,0x29,0x4d,0x6e,0x45,0x0c,0x24,0x2a,0x31, +0x34,0x38,0x1b,0x25,0x43,0x35,0x22,0x04,0xaa,0x08,0x2a,0x41,0x55,0x67,0x77,0x42,0x2c,0x3b,0x24,0x0f,0x0c,0x0a,0x01,0x05,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x00,0x00,0x12,0x00,0x32,0xff,0x17,0x07,0xc3,0x06,0x5d,0x01,0x37,0x01,0x67,0x01,0x8a,0x01,0xb5,0x01,0xb9,0x01,0xc7,0x01,0xec,0x02,0x11,0x02,0x21, +0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x48,0x02,0x4c,0x02,0x50,0x02,0x54,0x02,0x58,0x02,0x5c,0x00,0x00,0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17, +0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x15,0x14,0x16,0x33,0x33,0x35,0x33,0x15,0x21, +0x32,0x3e,0x02,0x35,0x11,0x23,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x33,0x14,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x17, +0x33,0x11,0x33,0x11,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x23,0x11,0x14,0x1e,0x02,0x33,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17, +0x36,0x36,0x37,0x15,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x21,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x3e,0x02,0x35,0x35,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06, +0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x27,0x15,0x14,0x0e,0x02,0x23, +0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x36,0x35,0x35,0x01,0x33,0x11,0x23,0x25,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x01,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14, +0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x05,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x01,0x34, +0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x1e,0x03,0x03,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x13,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x01,0x21,0x15,0x21,0x25,0x33,0x15,0x23,0x03,0x23,0x35,0x33, +0x07,0x23,0x35,0x33,0x05,0xf4,0x19,0x27,0x32,0x18,0x23,0x37,0x0e,0x11,0x39,0x17,0x1d,0x38,0x10,0x17,0x39,0x17,0x68,0x2f,0x35,0x0b,0x15,0x31,0x14,0x97,0x18,0x28,0x0d,0x10,0x24,0x19,0x13,0x27,0x11,0x0f,0x1b,0x0a,0x19,0x14,0x0e,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0c,0x18,0x27,0x1e,0x13,0x05,0x01,0x05,0x0e, +0x19,0x15,0x8d,0x09,0x15,0x11,0x0c,0xdb,0x1d,0x27,0x0d,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x13,0x23,0xd2,0x41,0x01,0xee,0x09,0x15,0x11,0x0c,0x0c,0x26,0x2e,0x0a,0x15,0x31,0x14,0x27,0x2f,0x22,0x1b,0x12,0x13,0x24,0x21,0x29,0x21,0x8b,0x94,0x75, +0x6a,0x01,0x02,0x3c,0x03,0x20,0x30,0x3a,0x1a,0x73,0x6d,0x24,0x2a,0x24,0x42,0x3c,0x1f,0x2a,0x22,0x24,0x1a,0x09,0x14,0x11,0x0b,0x41,0x18,0x22,0x0a,0x41,0x1a,0x21,0x05,0x05,0x42,0x04,0x04,0x03,0x04,0x3c,0x10,0x36,0x3d,0x3e,0x19,0x2c,0x3c,0x25,0x10,0x21,0x39,0x4d,0x2d,0x4b,0x1a,0x36,0x30,0x28,0x0d,0x01,0x0f,0x2d,0x16,0x0e, +0x07,0x11,0x1d,0x15,0xb7,0x2e,0x1b,0x15,0x2c,0x42,0x2c,0x0e,0x2d,0x12,0x11,0x25,0x14,0x17,0x26,0x1d,0x10,0x24,0x35,0x2f,0x4e,0x33,0x2d,0x4e,0x4a,0x48,0x27,0x8c,0x2f,0x35,0x0b,0x15,0x31,0x14,0xfe,0x16,0x07,0x11,0x1d,0x15,0x6b,0x0b,0x18,0x13,0x0d,0x43,0x1d,0x26,0x0c,0x17,0x12,0x0c,0x40,0x21,0x2a,0x0e,0x1a,0x13,0x0b,0xfc, +0x2c,0x13,0x23,0x17,0x22,0x42,0x16,0x24,0x2d,0x16,0x20,0x2a,0x0e,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x04,0x1d,0x2a,0x43,0x20,0x27,0x31,0x1b,0x0a,0x01,0x21,0x22,0x1a,0x30,0x25,0x16,0x13,0x21,0x2d,0x1b,0x1d,0x2e,0x14,0x16,0x15,0x14,0x2d,0x48, +0x33,0x23,0x43,0x27,0xe6,0x12,0x1c,0x23,0x12,0x34,0x16,0x0d,0x27,0x11,0x14,0x29,0x0b,0x11,0x28,0x11,0xfe,0xa3,0x01,0x60,0x11,0x1f,0x30,0x15,0x1b,0x11,0x1e,0x2d,0x18,0x1d,0x15,0x1e,0xfd,0xf8,0x42,0x42,0x04,0x15,0x4d,0x3c,0x11,0x19,0x1c,0x0c,0x17,0x2d,0x28,0x21,0x0b,0xfa,0xe9,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09, +0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x02,0x68,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x03,0x7c,0x0d,0x16,0x1c,0x0f,0x0c,0x16,0x11,0x0b,0x31,0x20,0x0f,0x1e,0xfa,0x73,0x14,0x19,0x09,0x11,0x15,0x0c,0x2d,0x1b,0x17,0x1d,0x12,0x0a,0xf3, +0x29,0x1b,0x0c,0x18,0x0c,0x32,0x42,0x05,0x29,0x1b,0x0c,0x18,0x0c,0x32,0x42,0x03,0x5d,0x01,0x0d,0xfe,0xf3,0x01,0x0d,0xfe,0xf3,0x02,0x36,0x01,0x0d,0xfe,0xf3,0xfd,0x85,0xd1,0xd1,0xe2,0x4c,0x4c,0x83,0x4b,0x4b,0x01,0x23,0xa2,0x29,0x31,0x1b,0x09,0x12,0x0f,0x14,0x0d,0x11,0x14,0x16,0x0f,0x18,0x0d,0x15,0x10,0x13,0x0e,0x10,0x11, +0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c,0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x01,0x48,0x14,0x11,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21,0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20,0x01,0x07,0xf3,0x26,0x27,0x7c,0x7c,0x05, +0x0d,0x16,0x11,0x01,0x83,0x02,0x17,0x0c,0x15,0x10,0x2b,0x34,0x2b,0x1d,0x1a,0x10,0x26,0x2b,0x30,0x1a,0x4f,0x4b,0x4d,0x55,0x0e,0x17,0x0e,0x13,0x15,0x09,0x20,0x25,0x12,0x05,0x29,0x30,0x11,0x22,0x26,0x2c,0x1c,0x39,0x48,0x2b,0x33,0x2b,0x05,0x0e,0x15,0x11,0x02,0x0c,0xfe,0x0b,0x1a,0x30,0x05,0x01,0xb8,0xfe,0x48,0x02,0x17,0x14, +0x11,0x29,0x17,0x17,0x2b,0x15,0x21,0x03,0x38,0x59,0x3e,0x21,0x1c,0x2f,0x40,0x24,0x33,0x39,0x1b,0x06,0x02,0x09,0x14,0x12,0x14,0x1d,0xfe,0x94,0x0f,0x1c,0x17,0x0e,0x27,0x3b,0x19,0x1d,0x35,0x27,0x17,0x03,0x03,0x46,0x03,0x04,0x05,0x11,0x1f,0x19,0x17,0x37,0x21,0x09,0x1f,0x19,0x4e,0x14,0x1a,0x10,0x06,0x18,0x0d,0x15,0x10,0xfe, +0xcf,0x0f,0x1c,0x17,0x0e,0x04,0x0d,0x16,0x12,0x63,0x4b,0x2c,0x25,0x04,0x0c,0x17,0x12,0x63,0x49,0x2c,0x26,0x01,0x04,0x0c,0x17,0x12,0x9f,0x03,0x42,0x26,0x27,0x1a,0x1f,0x01,0x6d,0xfe,0x90,0x25,0x30,0x1d,0x0c,0x13,0x12,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21,0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20, +0x01,0x39,0xfa,0x39,0x11,0x0e,0x1a,0x28,0x33,0x1a,0x0f,0x10,0x1f,0x2d,0x1d,0x19,0x37,0x2f,0x1e,0x21,0x21,0x22,0x5c,0x34,0x2d,0x53,0x3f,0x26,0x0f,0x12,0x56,0x6d,0x1b,0x21,0x12,0x06,0x16,0x0e,0x08,0x0b,0x0e,0x0f,0x0a,0x30,0x0f,0x17,0x43,0x32,0x1d,0x1a,0x0e,0x18,0x43,0x31,0x1d,0x1a,0x01,0x0e,0x18,0x6b,0x06,0x70,0xfd,0x3c, +0x95,0x1b,0x24,0x20,0x29,0x18,0x0a,0x1c,0x2f,0x3e,0x21,0x02,0x02,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0x69,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03, +0x0f,0x08,0xfa,0xc0,0x0f,0x2d,0x2a,0x1e,0x0f,0x17,0x1e,0x0f,0x1d,0x21,0x05,0x20,0x0f,0x14,0x0c,0x1d,0x18,0x11,0x68,0x04,0x05,0x03,0x01,0x02,0x33,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0x01,0xe7,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0xfc,0xd6,0x25,0x01,0x6f,0x25,0x03,0x3f,0x25,0x51,0x25,0xfb,0x58,0x4c,0x4c,0x4c,0x00,0x00,0x05, +0x00,0x32,0xff,0xba,0x06,0xc7,0x06,0x22,0x00,0xa9,0x00,0xb9,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0x00,0x25,0x22,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x35,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x26, +0x26,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x16,0x33,0x32,0x37,0x26,0x02,0x27,0x35,0x33,0x16,0x12,0x17,0x33,0x11,0x33,0x11,0x14,0x07,0x16,0x16,0x17,0x3e,0x03,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x3e,0x02, +0x37,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x17,0x36,0x36,0x37,0x26,0x26,0x27,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x16,0x17,0x36,0x36,0x37,0x17,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x37,0x15,0x0e,0x05,0x25,0x26,0x26,0x27,0x0e,0x03,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x01,0x0e,0x03,0x15,0x14,0x16,0x33,0x32, +0x3e,0x02,0x35,0x01,0x23,0x35,0x33,0x07,0x23,0x35,0x33,0x04,0xc2,0x2d,0x39,0x10,0x09,0x0a,0x3b,0x5d,0x7e,0x4c,0x6b,0xc5,0xab,0x8a,0x2e,0x33,0x93,0xae,0xc0,0x60,0x3e,0x70,0x56,0x32,0x14,0x2d,0x39,0x16,0x14,0x37,0x3d,0x42,0x20,0x2d,0x5e,0x58,0x4d,0x1c,0x34,0x69,0x29,0x25,0x40,0x22,0x10,0x10,0x05,0x10,0x07,0x0f,0x08,0x32, +0x43,0x2c,0x4d,0x39,0x20,0x17,0x48,0x2a,0x21,0x33,0x23,0x13,0x34,0x51,0x61,0x2d,0x4c,0x3e,0x46,0x3a,0x24,0x39,0x96,0x61,0x5c,0x41,0x81,0x3e,0x08,0x48,0x25,0x0e,0x1b,0x0d,0x13,0x22,0x18,0x0e,0x47,0x08,0x0b,0x0a,0x25,0x14,0x16,0x47,0x16,0x19,0x3d,0x42,0x44,0x21,0x22,0x41,0x22,0x23,0x27,0x2a,0x62,0x35,0x22,0x13,0x1f,0x0c, +0x15,0x3e,0x2a,0x2b,0x56,0x2f,0x1c,0x21,0x2a,0x57,0x33,0x63,0x5d,0x14,0x2d,0x14,0x03,0x19,0x17,0x3d,0x22,0x15,0x27,0x15,0x59,0x1e,0x51,0x5d,0x63,0x5f,0x56,0x01,0x3d,0x0f,0x2b,0x20,0x2f,0x60,0x5b,0x51,0x20,0x0f,0x2e,0x1d,0x29,0x5e,0x5c,0x56,0xfb,0x47,0x22,0x43,0x35,0x21,0x24,0x1f,0x10,0x2a,0x25,0x19,0x04,0xb9,0x3f,0x3f, +0xad,0x3f,0x3f,0x47,0x28,0x26,0x1f,0x18,0x38,0x30,0x20,0x31,0x4e,0x61,0x30,0x61,0x37,0x67,0x50,0x30,0x18,0x29,0x36,0x1e,0x1c,0x24,0x2f,0x25,0x34,0x21,0x0f,0x11,0x1d,0x24,0x13,0x54,0x1e,0x2d,0x0b,0x0a,0x06,0x03,0x02,0x39,0x19,0x33,0x19,0x19,0x15,0x28,0x39,0x23,0x17,0x20,0x18,0x29,0x34,0x1c,0x34,0x44,0x29,0x13,0x03,0x25, +0xfe,0xec,0x32,0x36,0x15,0xab,0x01,0x4c,0x9f,0x05,0x6b,0xfe,0xea,0xb4,0x03,0x86,0xfc,0x77,0x4c,0x31,0x2b,0x5c,0x30,0x08,0x1f,0x27,0x2c,0x15,0x04,0x7b,0xfb,0xb5,0x20,0x38,0x1a,0x17,0x20,0x04,0xa7,0xfb,0x59,0x0d,0x16,0x1c,0x10,0x0a,0x08,0x52,0x13,0x11,0x0c,0x0a,0x11,0x08,0x11,0x21,0x10,0x10,0x0e,0x52,0x0e,0x10,0x1e,0x43, +0x0b,0x1a,0x0b,0x5a,0x0f,0x0e,0x24,0x13,0x0c,0x1a,0x10,0x32,0x54,0x16,0x33,0x34,0x31,0x25,0x17,0xda,0x0e,0x1b,0x0f,0x18,0x2d,0x23,0x16,0x01,0x1c,0x24,0x18,0x27,0x30,0x01,0xe0,0x03,0x0b,0x19,0x2b,0x22,0x1e,0x29,0x06,0x0d,0x14,0x0e,0xfd,0x9c,0x40,0x85,0x40,0x00,0x00,0x20,0x00,0x32,0xfe,0x62,0x08,0x31,0x06,0xaf,0x00,0x69, +0x00,0xcf,0x01,0x2d,0x01,0x5d,0x01,0x61,0x01,0x86,0x01,0x8a,0x01,0x96,0x01,0xa5,0x01,0xb4,0x01,0xbe,0x01,0xc2,0x01,0xc6,0x01,0xca,0x01,0xf0,0x01,0xf4,0x02,0x1a,0x02,0x1e,0x02,0x2a,0x02,0x36,0x02,0x42,0x02,0x4e,0x02,0x52,0x02,0x56,0x02,0x5a,0x02,0x5e,0x02,0x62,0x02,0x66,0x02,0x6a,0x02,0x6e,0x02,0x93,0x02,0xb8,0x00,0x00, +0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02, +0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x3e,0x02,0x35,0x35,0x01,0x06,0x06,0x07,0x0e,0x03,0x23,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36, +0x37,0x36,0x36,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x37,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x03,0x06,0x06,0x07,0x0e,0x03,0x23,0x23, +0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x37,0x27,0x26,0x26,0x23,0x22,0x06, +0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x17,0x1e,0x03,0x33,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x25,0x33,0x11,0x23,0x01,0x06,0x06,0x15, +0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x01,0x23,0x35,0x33,0x13,0x22,0x06,0x07,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x01,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x01,0x32,0x36,0x35, +0x34,0x2e,0x02,0x23,0x22,0x07,0x1e,0x03,0x25,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x01,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x13,0x23,0x35,0x33,0x01,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x27,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16, +0x33,0x01,0x33,0x11,0x23,0x03,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x27,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x01,0x33,0x11,0x23,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22, +0x06,0x15,0x14,0x16,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x03,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x05,0x33,0x15,0x23,0x03,0x33,0x15,0x23,0x05,0x06,0x06,0x15, +0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x13,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23, +0x22,0x26,0x35,0x34,0x34,0x37,0x08,0x31,0x19,0x27,0x32,0x18,0x23,0x37,0x0e,0x11,0x39,0x17,0x1d,0x38,0x10,0x17,0x39,0x17,0x20,0x33,0x0f,0x15,0x31,0x14,0x30,0x18,0x28,0x0d,0x10,0x24,0x19,0x13,0x27,0x11,0x0f,0x1b,0x0a,0x19,0x14,0x0e,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0c,0x18,0x27,0x1e,0x13,0x05,0x01,0x05, +0x0e,0x19,0x15,0x26,0x09,0x15,0x11,0x0c,0x41,0x1d,0x23,0x0b,0x18,0x13,0x0d,0x43,0x1d,0x26,0x0c,0x17,0x12,0x0c,0x40,0x21,0x2a,0x0e,0x1a,0x13,0x0b,0xfd,0x03,0x1a,0x32,0x17,0x16,0x32,0x39,0x3f,0x23,0x24,0x44,0x1c,0x13,0x2c,0x20,0x21,0x3a,0x18,0x12,0x2d,0x19,0x18,0x11,0x15,0x09,0x05,0x58,0x65,0x2f,0x41,0x28,0x12,0x03,0x02, +0x02,0x03,0x42,0x05,0x05,0x31,0x3b,0x23,0x32,0x1f,0x0e,0x07,0x06,0x42,0x08,0x02,0x1c,0x1d,0x10,0x16,0x11,0x0b,0x04,0x0d,0x1a,0x20,0x29,0x1c,0x29,0x34,0x1c,0x0b,0x01,0x08,0x12,0x20,0x1b,0x1c,0x18,0x2f,0x34,0x3b,0x23,0x16,0x23,0x23,0x23,0x16,0x18,0x2f,0x17,0x14,0x33,0x1b,0x22,0x3c,0x3c,0x3f,0x23,0x4f,0x0e,0x31,0x2a,0x16, +0x2e,0x37,0x42,0x2a,0x38,0x20,0x2a,0x0e,0x15,0x31,0x14,0x27,0x17,0x28,0x0d,0x10,0x24,0x1a,0x13,0x26,0x11,0x0f,0x1b,0x0a,0x19,0x15,0x0f,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0b,0x19,0x27,0x1e,0x13,0x05,0x01,0x05,0x0e,0x18,0x15,0x1d,0x09,0x15,0x11,0x0c,0x40,0x14,0x23,0x4b,0x19,0x2e,0x33,0x3b,0x26,0x19,0x19, +0x38,0x2c,0x18,0x2e,0x17,0x14,0x32,0x1c,0x2a,0x39,0x1a,0x0d,0x19,0x1e,0x24,0x17,0xfd,0x23,0x13,0x23,0x17,0x22,0x42,0x16,0x24,0x2d,0x16,0x20,0x2a,0x0e,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x01,0x20,0x42,0x42,0xfe,0x7f,0x02,0x01,0x18,0x14,0x2d, +0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x01,0x40,0x33,0x33,0x32,0x1e,0x27,0x0c,0x1e,0x38,0x3e,0x08,0x10,0x19,0xfe,0x84,0x17,0x1c,0x12,0x0a,0x06,0x15,0x19,0x09,0x11,0x16,0x0c,0x2c,0x03,0x0f,0x14,0x19,0x09,0x11,0x15,0x0c,0x2d,0x1b,0x17,0x1d,0x12,0x0a,0xfb,0xfb,0x29,0x1b,0x0c,0x18, +0x0c,0x32,0x42,0x07,0xb1,0x4b,0x4b,0xf9,0x00,0x4b,0x4b,0xac,0x2d,0x2d,0x04,0xac,0x1e,0x1d,0x42,0x16,0x24,0x2e,0x18,0x3e,0x20,0x15,0x03,0x1a,0x2a,0x38,0x21,0x23,0x2e,0x31,0x1f,0x36,0x2c,0x1a,0x10,0x42,0x0e,0x0f,0x05,0x04,0x20,0x26,0x01,0x10,0x41,0x41,0xdf,0x1e,0x1d,0x42,0x16,0x24,0x2e,0x18,0x3e,0x20,0x15,0x03,0x1a,0x2a, +0x38,0x21,0x23,0x2e,0x31,0x1f,0x36,0x2c,0x1a,0x10,0x42,0x0e,0x0f,0x05,0x04,0x20,0x26,0x01,0x10,0x41,0x41,0xfe,0x50,0x20,0x2c,0x2c,0x20,0x20,0x2c,0x2c,0x20,0x11,0x15,0x15,0x11,0x10,0x15,0x15,0xfe,0xd8,0x1f,0x2c,0x2c,0x1f,0x21,0x2c,0x2c,0x21,0x10,0x15,0x15,0x10,0x11,0x15,0x15,0xfe,0x51,0x4b,0x4b,0x83,0x4c,0x4c,0x02,0x10, +0xd1,0xd1,0xfe,0xd8,0xc7,0xc7,0x60,0xc7,0xc7,0x01,0x86,0xd1,0xd1,0xfb,0x5c,0xc7,0xc7,0x75,0xbd,0xbd,0x05,0x44,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x2c,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d, +0x02,0x04,0xf0,0xa2,0x29,0x31,0x1b,0x09,0x12,0x0f,0x14,0x0d,0x11,0x14,0x16,0x0f,0x14,0x11,0x15,0x10,0x13,0x0e,0x10,0x11,0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c,0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x63,0x4c,0x2a,0x26,0x04,0x0d,0x16,0x12,0x63, +0x4b,0x2c,0x25,0x04,0x0c,0x17,0x12,0x9f,0x85,0x2c,0x26,0x01,0x04,0x0c,0x17,0x12,0x9f,0xfc,0xfb,0x07,0x20,0x0e,0x0e,0x1f,0x1a,0x10,0x27,0x14,0x13,0x1c,0x14,0x14,0x1c,0x08,0x07,0x59,0x63,0x19,0x2e,0x42,0x29,0x0f,0x1b,0x0e,0x0e,0x16,0x0c,0x21,0x2f,0x11,0x3f,0x31,0x10,0x24,0x3b,0x2b,0x17,0x3d,0x24,0x41,0x11,0x14,0x0b,0x11, +0x13,0x09,0x1b,0x2e,0x23,0x14,0x22,0x2d,0x2c,0x0a,0x09,0x12,0x0f,0x09,0x0f,0x1a,0x25,0x17,0x0b,0x11,0x0c,0x06,0x08,0x06,0x46,0x06,0x08,0x15,0x19,0x15,0x01,0xfd,0x54,0x04,0x19,0x1d,0x0f,0x1d,0x17,0x0e,0x14,0x11,0x15,0x10,0x13,0x0e,0x10,0x11,0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c, +0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x9f,0x89,0x2a,0x25,0x0d,0x19,0x26,0x19,0x0c,0x0d,0x15,0x08,0x06,0x45,0x06,0x08,0x15,0x0d,0x06,0x0c,0x09,0x06,0x04,0x83,0x26,0x27,0x1a,0x1f,0x01,0x6d,0xfe,0x90,0x25,0x30,0x1d,0x0c,0x13,0x12,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21, +0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20,0x01,0x39,0x5a,0xfd,0xf1,0x02,0x46,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xfc,0x7e,0xdb,0xfe,0xa4,0x2c,0x25,0x20,0x29,0x0a,0x19,0x16,0x0f,0xfd,0x41,0x04,0x05,0x03,0x01,0x0f,0x14, +0x0c,0x1c,0x19,0x11,0x04,0x56,0x0f,0x14,0x0c,0x1d,0x18,0x11,0x68,0x04,0x05,0x03,0x01,0x6a,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0xfe,0xb5,0x4c,0xfe,0xb0,0x4d,0x03,0xa2,0x71,0xfb,0x17,0x14,0x25,0x01,0x9c,0xfe,0x61,0x29,0x32,0x1b,0x09,0x10,0x2e,0x3e,0x27,0x11,0x12,0x45,0x10,0x35,0x38,0x31,0x5b,0x2b,0x1f,0x2c,0x1b,0x16,0x12, +0x01,0xd0,0xfd,0xe7,0xfd,0xd0,0x14,0x25,0x01,0xa7,0xfe,0x56,0x29,0x31,0x1b,0x09,0x10,0x2e,0x41,0x2a,0x13,0x12,0x44,0x10,0x3d,0x39,0x30,0x5b,0x2c,0x1f,0x2d,0x1b,0x16,0x12,0x01,0xdb,0xfd,0xdd,0x06,0xa1,0x2d,0x20,0x20,0x2c,0x2c,0x20,0x20,0x2d,0x71,0x14,0x10,0x10,0x15,0x15,0x10,0x10,0x14,0xfd,0xfb,0x2d,0x21,0x20,0x2c,0x2c, +0x20,0x21,0x2d,0x72,0x14,0x10,0x10,0x16,0x16,0x10,0x10,0x14,0xfb,0xca,0x4c,0x4c,0x4c,0x04,0x61,0x25,0x8e,0x29,0xfb,0x6f,0x29,0x02,0x00,0x25,0x21,0x2a,0x03,0x7d,0x2a,0xbb,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xfd,0x87,0x0a,0x14, +0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xff,0xff,0x00,0x29,0x03,0xcb,0x02,0x25,0x04,0xdc,0x00,0x07,0x09,0x2c,0x00,0x24,0xfd,0x4f,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x04,0xdc,0x00,0x27,0x09,0x2c,0x00,0x24,0xfd,0x4f,0x00,0x06,0x14,0x02, +0x00,0x00,0xff,0xff,0x00,0x05,0x03,0x9a,0x02,0x9c,0x05,0x53,0x00,0x07,0x09,0x2d,0x00,0xd2,0xfd,0x45,0x00,0x01,0x00,0x9a,0xff,0xf2,0x03,0x2a,0x02,0xdd,0x00,0x13,0x00,0x10,0xb1,0x0a,0x12,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x30,0x31,0x05,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14, +0x1e,0x02,0x33,0x33,0x03,0x2a,0x79,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x56,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0xff,0xff,0x00,0x05,0xfe,0x60,0x02,0x01,0xff,0x71,0x00,0x06,0x09,0x2e,0x00,0x00,0xff,0xff,0x00,0x15,0x03,0xcb,0x02,0x11,0x04,0x23,0x00,0x07, +0x09,0x2f,0x00,0x10,0xfd,0x4f,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x04,0x23,0x02,0x26,0x14,0x02,0x00,0x00,0x00,0x07,0x09,0x2f,0x00,0x10,0xfd,0x4f,0xff,0xff,0x00,0x21,0x03,0x90,0x02,0x2c,0x05,0x49,0x00,0x07,0x09,0x30,0x00,0x62,0xfd,0x3b,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x05,0x49,0x00,0x27,0x09,0x30,0x00,0x62, +0xfd,0x3b,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x29,0xff,0x19,0x02,0x25,0xff,0x71,0x00,0x06,0x09,0x31,0x24,0x00,0xff,0xff,0xff,0xba,0xff,0x19,0x02,0x4e,0x00,0x99,0x00,0x26,0x09,0x31,0x24,0x00,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xf8,0x03,0xc5,0x02,0x57,0x04,0xef,0x00,0x07,0x09,0x32,0x00,0x24,0xfd,0x4f, +0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x57,0x04,0xef,0x00,0x27,0x09,0x32,0x00,0x24,0xfd,0x4f,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x69,0x03,0xbb,0x01,0xe5,0x05,0x2e,0x00,0x07,0x09,0x33,0x00,0x24,0xfd,0x45,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x05,0x2e,0x00,0x27,0x09,0x33,0x00,0x24,0xfd,0x45,0x00,0x06,0x14,0x02, +0x00,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0x4e,0x00,0x99,0x00,0x08,0x00,0x0e,0xbb,0x00,0x08,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x30,0x31,0x05,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x02,0x4e,0xfd,0xb2,0x23,0x23,0x23,0x23,0x02,0x4e,0x0e,0x34,0x20,0x20,0x33,0x00,0x01,0xff,0xe7,0x06,0x19,0x05,0x0f,0x07,0x5f, +0x00,0x1a,0x00,0x16,0xbc,0x00,0x12,0x04,0xfb,0x00,0x07,0x00,0x19,0x04,0xfb,0xb1,0x0c,0x02,0x00,0x2f,0x33,0xed,0xdc,0xed,0x30,0x31,0x01,0x07,0x21,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e,0x04,0x33,0x21,0x05,0x0f,0x5a,0xfd,0xf4,0x4a,0x7d,0x66,0x4d,0x19,0x10,0x27,0x2e,0x34,0x1d,0x79,0x28,0x57, +0x5a,0x59,0x2a,0x18,0x39,0x3f,0x44,0x49,0x4c,0x27,0x02,0x3c,0x06,0xb6,0x9d,0x32,0x3d,0x32,0x08,0x1f,0x3c,0x34,0x55,0x78,0x4c,0x23,0x18,0x23,0x29,0x23,0x18,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0x76,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x09,0x7e,0x02,0xb6,0xfc,0x8d, +0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x14,0x05,0x3e,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55, +0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0x76,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x09,0x7e,0x02,0xb6,0xfc,0x8d,0xff,0xff,0x00,0xc4,0xfd,0xe4,0x01,0x42,0xff,0x6c,0x00,0x07,0x09,0x73,0x00,0x00,0xf7,0x68,0xff,0xff,0x00,0x52,0xfd,0xc9,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15, +0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xc9,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xc9,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0xf7,0x03,0x3c,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x54,0x06,0x46,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9, +0x07,0x4b,0x03,0x3c,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x54,0x03,0x9c,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x08,0x04,0x03,0x3c,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x54,0x03,0x9c,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x0a,0xb0,0x03,0x3c,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x54,0x06,0x46, +0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xb9,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x14,0x18,0x06,0xe0,0xff,0x38,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x5d,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x14,0x18,0x03,0x84,0xff,0x38,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56, +0x00,0x00,0x00,0x07,0x14,0x18,0x03,0x84,0xff,0x38,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x14,0x18,0x06,0xe0,0xff,0x38,0x00,0x02,0x00,0xab,0xfe,0x0c,0x03,0x49,0x02,0xb7,0x00,0x15,0x00,0x29,0x00,0x18,0xb1,0x11,0x1d,0xbd,0x04,0xfb,0x00,0x0a,0x00,0x27,0x04,0xfb,0x00,0x00, +0x05,0x03,0x00,0x3f,0xed,0x2f,0xed,0x2f,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x11,0x23,0x11,0x06,0x06,0x37,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xff,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x9c,0x2a,0x58,0x7e,0x01, +0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xf0,0x92,0xfd,0xd5,0x02,0x09,0x11,0x12,0xc7,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0x02,0x00,0xab,0xfe,0x0c,0x04,0x02,0x02,0xb7,0x00,0x18, +0x00,0x2c,0x00,0x23,0xb1,0x14,0x11,0x41,0x0a,0x04,0xfb,0x00,0x13,0x05,0x03,0x00,0x20,0x04,0xfb,0x00,0x0a,0x00,0x2a,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0xed,0x3f,0xed,0x2f,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x11,0x23,0x11,0x06,0x06,0x37,0x2e, +0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xff,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x33,0x08,0xbd,0xb9,0x9c,0x2a,0x58,0x7e,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x47,0xbc, +0x72,0xa7,0xfe,0x1a,0x02,0x09,0x11,0x12,0xc7,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc3,0x05,0xca,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x07,0x0a,0x6e,0x00,0x9b,0xfd,0xee,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57, +0x05,0xca,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x07,0x0a,0x6e,0x00,0x9b,0xfd,0xee,0x00,0x01,0x00,0x8c,0x06,0x56,0x01,0xc8,0x08,0x05,0x00,0x18,0x00,0x0c,0xb3,0x08,0x0e,0x00,0x18,0x00,0x2f,0xcd,0xdc,0xcd,0x30,0x31,0x13,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32, +0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x8c,0x2a,0x49,0x35,0x1f,0x3e,0x2d,0x10,0x1d,0x0d,0x21,0x1f,0x37,0x52,0x36,0x1b,0x2d,0x53,0x75,0x47,0x06,0xa9,0x0a,0x17,0x23,0x33,0x26,0x29,0x2a,0x04,0x03,0x6d,0x06,0x1c,0x2e,0x3e,0x22,0x3e,0x57,0x3c,0x26,0x0e,0x00,0x00,0x01,0xfe,0x45,0x04,0x3a,0xff,0xd9,0x05,0xc0,0x00,0x03,0x00,0x0c, +0xb3,0x03,0x02,0x01,0x00,0x00,0x2f,0x32,0xcd,0x32,0x30,0x31,0x01,0x35,0x01,0x15,0xfe,0x45,0x01,0x94,0x04,0x3a,0x85,0x01,0x01,0x8f,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x80,0x05,0xbb,0x05,0x9a,0x00,0x26,0x01,0xb5,0x00,0x00,0x00,0x07,0x0a,0xbd,0x03,0x5b, +0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x8a,0x04,0x91,0x04,0x00,0x00,0x26,0x02,0x16,0x00,0x00,0x00,0x07,0x0a,0xbe,0x02,0x44,0x00,0x00,0x00,0x01,0xff,0x98,0xfe,0x96,0x04,0xf2,0x05,0x9a,0x00,0x13,0x00,0x1d,0x40,0x0e,0x10,0x91,0x0b,0x0b,0x06,0x07,0x91,0x01,0x01,0x06,0x12,0x03,0x00,0x03,0x00,0x3f,0x32,0x3f,0x39,0x2f,0xed,0x11, +0x33,0x2f,0xed,0x30,0x31,0x01,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x01,0x64,0x02,0xe6,0xa8,0xa8,0xfd,0x1a,0xfe,0xbc,0x4c,0x3c,0x36,0x44,0xaa,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x02,0x8e,0xfd,0x9d,0xfe,0x6b,0x1a,0x94,0x17,0x01,0x08,0x05,0x65,0x00,0x00,0x01, +0xff,0x5c,0xfe,0x1e,0x03,0xf8,0x04,0x00,0x00,0x16,0x00,0x1f,0x40,0x0f,0x16,0x95,0x10,0x10,0x0e,0x14,0x0a,0x95,0x05,0x05,0x14,0x15,0x11,0x0e,0x0f,0x00,0x3f,0x33,0x3f,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x30,0x31,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x23,0x11, +0x21,0x01,0x4a,0x31,0x5d,0x87,0x57,0x4b,0x37,0x3d,0x45,0xc8,0xa4,0x02,0x0a,0xa4,0xa4,0xfd,0xf6,0x04,0x73,0xb2,0x7a,0x3f,0x1a,0x99,0x27,0x01,0x3e,0x04,0x18,0xfe,0x5c,0x01,0xa4,0xfc,0x00,0x01,0xd1,0x00,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x0a,0x06,0x05,0x9a,0x00,0x25,0x00,0x2e,0x00,0x32,0x40,0x1b,0x08,0x91,0x04,0x25,0x1e,0x03, +0x1a,0x1a,0x07,0x23,0x1c,0x03,0x27,0x91,0x19,0x03,0x12,0x0a,0x26,0x91,0x10,0x0c,0x0e,0x12,0x01,0x07,0x12,0x00,0x3f,0x33,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0xed,0x30,0x31,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12, +0x37,0x12,0x13,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x01,0x11,0x21,0x06,0x02,0x07,0x06,0x02,0x07,0x0a,0x06,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xfe,0x67,0xc1,0x9b,0xfb,0xfd,0x9b,0x6f,0x48,0x79,0x33,0x65,0x0d,0x02,0xa3,0x01,0x99,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xfc,0x6b,0xfe, +0x94,0x08,0x36,0x30,0x30,0x67,0x3a,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x02,0x8e,0xfe,0x0a,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x19,0x84,0x01,0x31,0xb1,0x01,0x61,0x01,0x3b,0xfd,0x8b,0x02,0x75,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0xfd,0xae,0x04,0x6a,0x7d,0xfe,0xe2,0xa7,0xa7,0xfe,0xee,0x6f,0x00,0x02,0x00,0x12,0xfe,0x8b, +0x08,0x44,0x04,0x00,0x00,0x1d,0x00,0x22,0x00,0x32,0x40,0x1b,0x07,0x95,0x02,0x1d,0x19,0x03,0x15,0x15,0x05,0x1b,0x17,0x0f,0x1f,0x95,0x14,0x0f,0x10,0x08,0x1e,0x95,0x0e,0x0a,0x0c,0x15,0x01,0x05,0x15,0x00,0x3f,0x33,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0xed,0x30,0x31,0x21,0x23,0x01,0x23, +0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x00,0x13,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x11,0x23,0x02,0x03,0x08,0x44,0xe6,0xfe,0x3c,0x04,0xa4,0xfe,0x99,0x98,0x8b,0xfd,0x06,0x8c,0x5b,0x01,0x05,0x05,0x02,0x14,0x01,0x67,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0xfc,0xa3,0xe3,0x1b, +0xce,0x01,0xec,0xfe,0x14,0x01,0xd1,0xfe,0xba,0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0x01,0x79,0x01,0xfc,0xfe,0x5c,0x01,0xa4,0xfe,0x2b,0x01,0xd5,0xfe,0x12,0xfe,0x79,0x02,0xea,0xfe,0x62,0xfe,0xb4,0x00,0x00,0x03,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x05,0x9a,0x00,0x13,0x00,0x1a,0x00,0x1f,0x00,0x29,0x40,0x14,0x09,0x14,0x91,0x11, +0x1e,0x13,0x1b,0x1b,0x04,0x0e,0x13,0x03,0x08,0x00,0x18,0x91,0x06,0x02,0x04,0x12,0x00,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0xed,0x32,0x30,0x31,0x25,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x01,0x33,0x01,0x22,0x27,0x01,0x21,0x11,0x06,0x27,0x32, +0x37,0x11,0x01,0x04,0x81,0xc7,0x9b,0xfb,0xfd,0x9b,0x01,0x40,0x53,0x56,0xa8,0x63,0x02,0x28,0xa8,0xfd,0xae,0x30,0x2b,0xfe,0xe2,0x03,0x23,0xe5,0xb0,0xb1,0xe4,0xfe,0x66,0x98,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x1a,0x01,0xa4,0x2d,0xa2,0x73,0x02,0x1b,0xfd,0xed,0x93,0x36,0x02,0xdc,0xfc,0x72,0x06,0xfe,0x86,0x01,0xed,0x79,0x94, +0x6e,0x01,0xb1,0xfd,0xe1,0x00,0x00,0x03,0x00,0x12,0xfe,0x8b,0x04,0x23,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0x1f,0x00,0x2b,0x40,0x15,0x09,0x13,0xec,0x18,0x10,0x1d,0x0d,0x1a,0x1a,0x04,0x11,0x0d,0x0f,0x08,0x01,0x16,0x95,0x06,0x02,0x04,0x15,0x00,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0xed, +0x32,0x30,0x31,0x25,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x01,0x33,0x01,0x22,0x27,0x07,0x21,0x11,0x06,0x27,0x32,0x37,0x11,0x01,0x16,0x03,0xdf,0x44,0x8b,0xfd,0x06,0x8c,0xe8,0x62,0xa4,0x30,0x01,0xd0,0xa3,0xfe,0x11,0x52,0x3f,0xb2,0x02,0x8f,0xb5,0x89,0x94,0xaa,0xfe,0x98,0x13,0x8b, +0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0xfe,0x59,0xc4,0x01,0x5a,0xfe,0xae,0x6f,0x39,0x01,0xfa,0xfd,0x3a,0x15,0xc4,0x01,0x11,0x62,0x93,0x56,0x01,0x3a,0xfe,0x73,0x03,0x00,0xff,0xff,0x00,0x10,0xfe,0x80,0x05,0x60,0x05,0x9a,0x00,0x26,0x01,0xf2,0x00,0x00,0x00,0x07,0x0a,0xbd,0x03,0x00,0x00,0x00,0xff,0xff,0x00,0x10,0xfe,0x8a, +0x04,0x29,0x04,0x00,0x00,0x26,0x02,0x12,0x00,0x00,0x00,0x07,0x0a,0xbe,0x01,0xdc,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x0a,0x47,0x05,0xb2,0x02,0x06,0x12,0x8f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x02,0x06,0x12,0x90,0x00,0x00,0x00,0x05,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x13,0x00,0x1a, +0x00,0x21,0x00,0x28,0x00,0x2f,0x00,0x22,0x40,0x11,0x15,0x2a,0x91,0x23,0x21,0x21,0x00,0x24,0x20,0x91,0x0a,0x03,0x14,0x2b,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x30,0x31,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x27,0x11, +0x21,0x1e,0x03,0x01,0x2e,0x03,0x27,0x11,0x21,0x21,0x11,0x0e,0x03,0x01,0x21,0x11,0x3e,0x03,0x02,0xfe,0x98,0xf8,0xb0,0x60,0x61,0xb4,0x01,0x02,0xa1,0x94,0xf3,0xae,0x5f,0x61,0xb3,0xfc,0xdf,0xfe,0x57,0x09,0x45,0x6f,0x94,0x02,0x93,0x08,0x40,0x6b,0x92,0x5a,0xfd,0xbb,0x01,0xa9,0x59,0x93,0x6e,0x45,0x03,0xda,0xfe,0x61,0x5b,0x91, +0x6a,0x40,0x18,0x6a,0xbf,0x01,0x0a,0xa1,0xac,0x01,0x18,0xc6,0x6c,0x6a,0xbf,0xfe,0xf6,0xa0,0xaf,0xfe,0xe7,0xc5,0x6a,0x9b,0x01,0xfa,0x6b,0xb0,0x82,0x51,0x02,0x89,0x6e,0xb2,0x82,0x4f,0x0c,0xfe,0x03,0x01,0xfc,0x0d,0x53,0x84,0xaf,0xfe,0xfc,0xfe,0x08,0x0d,0x50,0x80,0xaf,0x00,0x00,0x05,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18, +0x00,0x13,0x00,0x17,0x00,0x1e,0x00,0x22,0x00,0x27,0x00,0x22,0x40,0x11,0x19,0x15,0x95,0x24,0x22,0x22,0x00,0x25,0x21,0x95,0x0a,0x0f,0x18,0x16,0x95,0x00,0x15,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x13,0x21, +0x11,0x36,0x05,0x11,0x21,0x1e,0x03,0x01,0x02,0x27,0x11,0x21,0x21,0x11,0x06,0x06,0x02,0x52,0x72,0xb8,0x82,0x46,0x49,0x88,0xc1,0x78,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0xdf,0xfe,0xfe,0xef,0xfe,0x7d,0xfe,0xfa,0x06,0x26,0x40,0x5c,0x01,0xd0,0x24,0xda,0xfe,0x6a,0x01,0x02,0x69,0x85,0x18,0x4c,0x8a,0xc1,0x75,0x81,0xcb,0x8d,0x4b, +0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x01,0xe9,0xfe,0xa6,0x25,0x23,0x01,0x58,0x42,0x72,0x5a,0x3d,0x01,0xd6,0x01,0x0a,0x22,0xfe,0xd4,0x01,0x2a,0x15,0x98,0x00,0xff,0xff,0x00,0x0c,0x06,0x1f,0x02,0xe6,0x09,0x39,0x02,0x06,0x13,0x7b,0x00,0x00,0xff,0xff,0x00,0x5a,0x06,0x1f,0x02,0x57,0x09,0x39,0x02,0x06,0x13,0x7d,0x00,0x00, +0x00,0x03,0x00,0x28,0xff,0xe8,0x04,0xca,0x05,0x88,0x00,0x4a,0x00,0x68,0x00,0x79,0x00,0x54,0x40,0x16,0x3a,0x37,0x99,0x40,0x32,0x27,0x2e,0x03,0x5a,0x4f,0x2b,0x00,0x4a,0x4a,0x2b,0x9a,0x55,0x55,0x22,0x9a,0x5e,0x07,0xb8,0x01,0x7f,0xb2,0x6f,0x6f,0x4b,0xb8,0x01,0x7f,0x40,0x0a,0x18,0x5e,0x18,0x5e,0x18,0x11,0x3b,0x40,0x19,0x75, +0xb9,0x01,0x7d,0x00,0x11,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0xed,0x10,0xed,0x33,0x2f,0xed,0x32,0x2f,0x33,0x10,0xcd,0x32,0x17,0x39,0x10,0xed,0x32,0x30,0x31,0x13,0x3e,0x03,0x37,0x11,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e, +0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x07,0x01,0x11,0x36,0x36,0x37,0x17,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x17,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x01,0x14,0x1e,0x02, +0x33,0x33,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x7c,0x09,0x2b,0x3c,0x48,0x26,0x23,0x56,0x6b,0x3a,0x14,0x25,0x41,0x59,0x35,0x3e,0x56,0x36,0x18,0x01,0x6f,0x49,0x7f,0x5e,0x37,0x1a,0x3a,0x5d,0x43,0x12,0x26,0x25,0x20,0x0c,0x07,0x18,0x3b,0x26,0x20,0x3e,0x17,0x07,0x0e,0x28,0x19,0x07,0x27,0x3f,0x58,0x39,0x5b,0x8b,0x34,0x1c, +0x47,0x4c,0x4d,0x22,0x5b,0x91,0x69,0x40,0x09,0x24,0x44,0x3c,0x30,0x0e,0x01,0x82,0x21,0x2e,0x07,0x3b,0x05,0x0f,0x1b,0x15,0x15,0x2a,0x22,0x15,0x3b,0x30,0x2b,0x10,0x26,0x22,0x17,0x24,0x3d,0x51,0x2e,0xfd,0x4e,0x0d,0x21,0x38,0x2c,0x0c,0x03,0x0e,0x1e,0x1b,0x17,0x20,0x14,0x09,0x01,0x97,0x01,0x09,0x0f,0x15,0x0e,0x01,0x9d,0x37, +0x50,0x59,0x21,0x43,0x68,0x47,0x25,0x2c,0x46,0x56,0x2b,0x98,0x2a,0x4f,0x72,0x49,0x3e,0x78,0x5e,0x3b,0x06,0x11,0x1b,0x15,0x26,0x21,0x20,0x27,0x0b,0x14,0x0a,0x54,0x6c,0x40,0x19,0x35,0x30,0xb1,0x13,0x1c,0x13,0x09,0x2b,0x5d,0x92,0x67,0x08,0x0e,0x0a,0x07,0x02,0x02,0x30,0xfe,0xb3,0x17,0x37,0x20,0x11,0x14,0x2d,0x27,0x19,0x1c, +0x2c,0x33,0x17,0x11,0x39,0x48,0x14,0x2d,0x46,0x32,0x2e,0x45,0x2e,0x17,0x01,0x1b,0x21,0x35,0x25,0x13,0x7a,0x1b,0x3a,0x30,0x1f,0x17,0x27,0x34,0x00,0x01,0xff,0x38,0x06,0x19,0x05,0x0f,0x06,0xc0,0x00,0x04,0x00,0x0c,0xba,0x00,0x02,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x30,0x31,0x01,0x21,0x35,0x21,0x15,0x04,0xb5,0xfa,0x83,0x05, +0xd7,0x06,0x19,0xa7,0x0a,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x05,0x26,0x06,0x50,0x00,0x3b,0x00,0x2e,0x40,0x12,0x3a,0x31,0x00,0x30,0x17,0x0b,0x11,0x9a,0x36,0x15,0x06,0x0d,0x0d,0x23,0x36,0x07,0x26,0x21,0xb8,0x01,0x7f,0xb1,0x23,0x18,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x39,0x39,0xcc,0x32, +0x30,0x31,0x01,0x1e,0x03,0x17,0x23,0x2e,0x03,0x27,0x11,0x23,0x11,0x26,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x21,0x35,0x21,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x03,0x6d,0x67,0xa0,0x6f,0x3e,0x05,0xa5,0x05,0x23,0x42,0x65, +0x45,0x72,0x0e,0x1e,0x0f,0x12,0x21,0x10,0x72,0x47,0x67,0x43,0x20,0x45,0x83,0xbd,0x78,0x01,0xd7,0xfb,0xb4,0x01,0x12,0x4a,0x78,0x54,0x2e,0x40,0x74,0xa4,0x63,0x72,0x11,0x23,0x12,0x0e,0x1c,0x0e,0x72,0x05,0x9c,0x1b,0x76,0xa6,0xcd,0x73,0x5c,0x9d,0x7d,0x59,0x18,0xfe,0x19,0x01,0xff,0x01,0x02,0x02,0x02,0xfe,0x02,0x01,0xe1,0x1d, +0x69,0x8e,0xae,0x62,0x78,0xd9,0xa4,0x61,0x8c,0x8c,0x22,0x7c,0xa1,0xbb,0x62,0x7c,0xde,0xb3,0x81,0x20,0xba,0xa2,0x02,0x02,0x02,0x01,0xa1,0x00,0x00,0x03,0x00,0xbc,0xff,0x2f,0x03,0xea,0x06,0x50,0x00,0x28,0x00,0x33,0x00,0x3e,0x00,0x38,0x40,0x0b,0x12,0x2a,0x99,0x35,0x35,0x27,0x26,0x06,0x00,0x00,0x34,0xb8,0x01,0x80,0xb7,0x08, +0x02,0x27,0x06,0x1d,0x24,0x24,0x2b,0xb8,0x01,0x80,0xb3,0x22,0x1b,0x26,0x18,0x00,0x3f,0x33,0x33,0xed,0x33,0x2f,0x33,0x3f,0x33,0x33,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x01,0x33,0x15,0x33,0x32,0x17,0x35,0x33,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x06,0x07,0x15,0x23,0x35, +0x06,0x22,0x23,0x23,0x15,0x23,0x35,0x23,0x11,0x33,0x13,0x23,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x01,0x7f,0x68,0x0f,0x23,0x24,0x68,0x3a,0x62,0x48,0x29,0x24,0x42,0x5b,0x37,0x48,0x71,0x4e,0x29,0xa9,0x9c,0x68,0x11,0x22,0x12,0x11,0x68,0xc3,0xc3,0x77,0x92,0x94,0x48,0x77, +0x54,0x2f,0xdc,0xfa,0x92,0x81,0x8b,0x17,0x3c,0x68,0x51,0x06,0x50,0xb6,0x03,0xb9,0xc7,0x0c,0x30,0x4b,0x69,0x47,0x3d,0x6c,0x58,0x41,0x12,0x04,0x09,0x3c,0x5c,0x78,0x45,0xac,0xc2,0x1f,0xe0,0xd3,0x02,0xd1,0xd1,0x05,0x9a,0xfd,0x02,0xfd,0xfc,0x1a,0x3d,0x64,0x4b,0xd9,0x1f,0x02,0x6c,0xfe,0x31,0x82,0x7c,0x2b,0x4c,0x39,0x21,0x00, +0x00,0x01,0x00,0x66,0xfe,0xef,0x02,0x50,0x02,0x19,0x00,0x13,0x00,0x12,0xb6,0x04,0x11,0x11,0x0b,0x0c,0x01,0x0b,0x00,0x2f,0x33,0x2f,0x12,0x39,0x2f,0x33,0x30,0x31,0x01,0x23,0x11,0x34,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a, +0xb4,0xfe,0xef,0x01,0x33,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0xff,0xff,0x00,0x66,0xfe,0xef,0x02,0x56,0x02,0x19,0x02,0x07,0x07,0xb1,0x00,0x00,0xfc,0x55,0x00,0x01,0x00,0x66,0xfe,0xef,0x00,0xe6,0x02,0x19,0x00,0x03,0x00,0x08,0xb1,0x03,0x00,0x00,0x2f,0x2f,0x30,0x31,0x13,0x23,0x11,0x33,0xe6,0x80, +0x80,0xfe,0xef,0x03,0x2a,0x00,0xff,0xff,0x00,0x66,0xfe,0xef,0x03,0x9a,0x01,0x24,0x02,0x07,0x07,0xb2,0x00,0x00,0xfc,0x55,0x00,0x01,0x00,0x66,0xfe,0xef,0x02,0x50,0x01,0x24,0x00,0x13,0x00,0x14,0xb7,0x04,0x11,0x11,0x0e,0x0b,0x0c,0x01,0x0b,0x00,0x2f,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x11,0x34,0x23,0x22, +0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a,0xb4,0xfe,0xef,0x01,0x33,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7,0x00,0xff,0xff,0x00,0x66,0xfd,0xf9,0x02,0x89,0x01,0x24,0x02,0x07,0x07,0xb8,0x00,0x00,0xfc,0x55,0x00,0x01, +0x00,0x3c,0xfe,0xdc,0x01,0xcd,0x01,0x26,0x00,0x2e,0x00,0x12,0xb6,0x06,0x1f,0x15,0x03,0x2c,0x1c,0x15,0x00,0x2f,0x33,0x2f,0x33,0x12,0x39,0x39,0x30,0x31,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15, +0x14,0x0e,0x02,0x23,0x22,0x27,0x3c,0x28,0x59,0x2f,0x33,0x32,0x10,0x1d,0x27,0x16,0x2c,0x40,0x2a,0x14,0x22,0x3b,0x51,0x30,0x2a,0x4e,0x20,0x23,0x4d,0x2d,0x2a,0x34,0x39,0x33,0x27,0x3f,0x2c,0x17,0x27,0x42,0x55,0x2e,0x60,0x45,0x96,0x16,0x15,0x1d,0x21,0x13,0x1a,0x14,0x10,0x09,0x10,0x21,0x27,0x30,0x21,0x28,0x3e,0x2a,0x16,0x0f, +0x0e,0x6d,0x0f,0x14,0x1a,0x1d,0x20,0x26,0x13,0x0f,0x1f,0x28,0x32,0x21,0x2b,0x40,0x2a,0x15,0x25,0x00,0xff,0xff,0x00,0x0a,0xfe,0xe3,0x01,0x68,0x01,0xb7,0x02,0x07,0x07,0xb9,0x00,0x00,0xfc,0x55,0x00,0x03,0x00,0x1e,0x04,0xdb,0x03,0x93,0x0a,0x63,0x00,0x1d,0x00,0x26,0x00,0x31,0x00,0x27,0x40,0x11,0x1f,0x1d,0x1d,0x27,0x04,0x1e, +0x13,0x13,0x28,0x0e,0x04,0x0e,0x04,0x0e,0x02,0x10,0x02,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x2f,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x11,0x23,0x11,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34, +0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x02,0x14,0x77,0x12,0x52,0x87,0x60,0x34,0x36,0x61,0x88,0x53,0x0d,0x77,0x0a,0x54,0x8a,0x62,0x35,0x34,0x5f,0x86,0x52,0x14,0x0a,0x73,0x7f,0x7c,0x71,0x86,0x0d,0x70,0x7f,0x20,0x3e,0x5a,0x3b,0x06,0x29,0xfe,0xb2,0x01,0x4e,0x38,0x65,0x8d,0x55,0x5a,0x93,0x69,0x3a,0x01, +0x2b,0xfe,0xd5,0x3a,0x69,0x93,0x5a,0x54,0x8d,0x66,0x38,0x02,0xa4,0xfd,0xc6,0x95,0x84,0x89,0x98,0xfd,0xc6,0x02,0x3a,0x97,0x8a,0x41,0x67,0x4a,0x27,0x00,0x00,0x01,0x00,0x6e,0xff,0x35,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x0e,0xb4,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x25,0x23,0x22,0x06,0x15,0x14, +0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0x9d,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0x00,0x02,0x00,0x6e,0xfe,0x48,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x19,0x00,0x14, +0xb7,0x16,0x19,0x19,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x25,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x21,0x35,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10, +0xfe,0x0a,0x01,0xf6,0x9d,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0xfd,0x36,0x75,0x00,0x00,0x01,0x00,0x6e,0x05,0x32,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x0e,0xb4,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02, +0x35,0x34,0x3e,0x02,0x33,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0x06,0x9a,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0x00,0x00,0x02,0x00,0x6e,0x04,0x45,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x16,0x19,0x19,0x07,0x09, +0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x21,0x35,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0xfe,0x0a,0x01,0xf6,0x06,0x9a, +0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0xfd,0x36,0x75,0x00,0x01,0x00,0x6e,0x05,0x32,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x0e,0xb4,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23, +0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x07,0x0f,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0x00,0x02,0x00,0x6e,0x04,0x45,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x19,0x16,0x16,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f, +0x33,0x33,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x21,0x15,0x21,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0xf6,0xfe,0x0a,0x07,0x0f,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77, +0x36,0x3f,0x40,0x3c,0xfe,0x20,0x75,0x00,0x00,0x01,0x00,0x6e,0xff,0x35,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x0e,0xb4,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25, +0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0x12,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0x00,0x02,0x00,0x6e,0xfe,0x48,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x19,0x16,0x16,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x13,0x21, +0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x21,0x15,0x21,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0xf6,0xfe,0x0a,0x01,0x12,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0xfe,0x20,0x75,0x00, +0xff,0xff,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x02,0x02,0x00,0xc3,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x0b,0x00,0x15,0x40,0x0a,0x09,0x04,0x91,0x06,0x03,0x0a,0x03,0x91,0x01,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x30,0x31,0x21,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x04, +0x0c,0xfc,0x1d,0x01,0x9d,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x9e,0x98,0x04,0x6a,0x98,0x98,0xfb,0x96,0x00,0x02,0x00,0x20,0xff,0xde,0x02,0xd9,0x05,0xa4,0x00,0x1d,0x00,0x29,0x00,0x2a,0x40,0x19,0x07,0x21,0x00,0x16,0x04,0xb9,0x24,0xc9,0x24,0x02,0x24,0x14,0x14,0x0a,0x19,0x03,0xb6,0x1e,0xc6,0x1e,0x02,0x1e,0x04,0x0a,0x12,0x00, +0x3f,0x33,0x33,0x5d,0x3f,0x12,0x39,0x2f,0x33,0x5d,0x17,0x39,0x30,0x31,0x25,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x05,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x83,0x1c,0x2d,0x0d,0x91,0x09,0x18,0x0d,0x38, +0x86,0x4a,0x35,0x59,0x40,0x24,0x29,0x46,0x5f,0x35,0x77,0x66,0x12,0xa8,0x17,0xfe,0x7c,0x2c,0x4d,0x20,0x22,0x47,0x28,0x33,0x33,0x36,0xd6,0x29,0x63,0x37,0x35,0x1b,0x3d,0x17,0x33,0x29,0x1d,0x36,0x4d,0x30,0x32,0x50,0x37,0x1d,0x43,0x4e,0x6d,0x03,0x95,0xfc,0x68,0x52,0x9e,0x91,0x1b,0x20,0x1b,0x1d,0x20,0x19,0x1e,0x1c,0xff,0xff, +0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x02,0x00,0x3b,0x00,0x00,0x00,0x03,0x00,0xbc,0xfe,0x29,0x04,0x2f,0x05,0x9a,0x00,0x19,0x00,0x21,0x00,0x2b,0x00,0x22,0x40,0x11,0x0b,0x1a,0x91,0x23,0x23,0x00,0x1b,0x91,0x17,0x19,0x19,0x17,0x12,0x22,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x39, +0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x23,0x11,0x23,0x13,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x21,0xbc,0x01,0x98,0x5d,0x95,0x69,0x39,0x22,0x40,0x5c,0x3a,0x48,0x75,0x54,0x2e,0x47,0x7c,0xab,0x63,0xfa,0xa8,0xa8,0xe4,0x95, +0xa2,0xfe,0xa6,0xc1,0xac,0x45,0x6e,0x4c,0x29,0xfe,0xed,0x05,0x9a,0x30,0x57,0x78,0x49,0x3d,0x6b,0x58,0x41,0x13,0x04,0x08,0x38,0x5a,0x7a,0x4a,0x5c,0x98,0x6c,0x3c,0xfe,0x29,0x04,0x73,0xfd,0xfc,0x8b,0x7b,0xfe,0x02,0x66,0xfe,0x31,0x22,0x41,0x5f,0x3c,0xd1,0xff,0xff,0x00,0xa7,0xfe,0x1f,0x04,0x15,0x05,0xfc,0x02,0x02,0x01,0xc4, +0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x07,0x58,0x05,0x9a,0x00,0x44,0x00,0x20,0x40,0x10,0x38,0x91,0x21,0x12,0x1c,0x17,0x3f,0x3f,0x0a,0x00,0x91,0x17,0x12,0x2e,0x0a,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x3f,0xed,0x30,0x31,0x25,0x32,0x12,0x11,0x34,0x2e,0x04,0x27,0x33,0x1e,0x05,0x15,0x14,0x02,0x06,0x06, +0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x3e,0x04,0x37,0x33,0x0e,0x05,0x15,0x10,0x12,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x05,0x5d,0xa0,0xab,0x18,0x28,0x35,0x3a,0x3b,0x1b,0xb5,0x18,0x38,0x39,0x35,0x29,0x19,0x46,0x85,0xc0,0x79,0x4a,0x72,0x5a,0x47,0x1e,0x1f,0x47,0x5a,0x72, +0x49,0x7a,0xbf,0x85,0x46,0x19,0x29,0x35,0x39,0x38,0x18,0xb5,0x1b,0x3b,0x3a,0x35,0x28,0x18,0xaa,0xa1,0x5c,0x76,0x44,0x1a,0xa8,0x18,0x42,0x77,0x7f,0x01,0x0a,0x01,0x15,0x45,0x96,0x96,0x8f,0x7b,0x63,0x1e,0x1c,0x58,0x73,0x88,0x98,0xa4,0x54,0xa7,0xfe,0xff,0xb0,0x5b,0x16,0x2b,0x3f,0x29,0x29,0x3f,0x2b,0x16,0x5b,0xb0,0x01,0x01, +0xa7,0x54,0xa4,0x98,0x88,0x73,0x58,0x1c,0x1e,0x63,0x7b,0x8f,0x96,0x96,0x45,0xfe,0xeb,0xfe,0xf6,0x32,0x62,0x93,0x62,0x01,0xc7,0xfe,0x4d,0x66,0x9b,0x68,0x34,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x04,0x01,0x02,0x02,0x01,0xd5,0x00,0x01,0x00,0x02,0x00,0xa6,0x00,0x00,0x06,0x14,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x1e, +0x40,0x0f,0x12,0x95,0x04,0x04,0x00,0x11,0x95,0x02,0x0f,0x13,0x95,0x0f,0x0f,0x00,0x15,0x00,0x3f,0x32,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x21,0x23,0x11,0x21,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x07,0x06,0x23,0x21,0x11,0x21,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x4a,0xa4,0x03,0x04,0x01,0x14,0x51,0x7f,0x58, +0x2e,0x5c,0x5c,0x8f,0xfe,0x39,0xfe,0x44,0x02,0x60,0xf6,0xcc,0xce,0x04,0x00,0xfe,0x6a,0x28,0x4e,0x71,0x49,0x93,0x54,0x53,0x03,0x74,0xfe,0x69,0xfe,0xaf,0xae,0xa3,0x00,0x02,0x00,0xa6,0xff,0xe8,0x05,0xfe,0x04,0x18,0x00,0x1f,0x00,0x28,0x00,0x27,0x40,0x15,0x23,0x95,0x1a,0x0f,0x01,0x95,0x28,0x28,0x0f,0x95,0x14,0x14,0x11,0x12, +0x0f,0x11,0x15,0x04,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x3f,0xed,0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x05,0xfe,0xfd,0x2d,0x04, +0xaf,0x9b,0xac,0x92,0x88,0xdd,0x68,0xa8,0x78,0x44,0x04,0xfe,0xc8,0xa4,0xa4,0x01,0x3e,0x0f,0x52,0x7b,0x9c,0x59,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x42,0x7f,0xb8,0x76,0xfe,0x29,0x04,0x00,0xfe,0x62,0x62,0xa2,0x73,0x3f,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c, +0x4f,0x6f,0x42,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x37,0x04,0x18,0x00,0x2e,0x00,0x37,0x00,0x2e,0x40,0x19,0x32,0x95,0x29,0x0f,0x01,0x95,0x0c,0x0f,0x26,0x23,0x37,0x37,0x0f,0x1e,0x95,0x23,0x0f,0x14,0x95,0x0f,0x15,0x04,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x3f,0xed, +0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x06,0x37,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88, +0xdd,0x88,0xc8,0x3a,0x45,0xdd,0x91,0x85,0x69,0x73,0x81,0x4e,0x84,0x5f,0x35,0x31,0x5b,0x81,0x4f,0x85,0x77,0x77,0xa1,0x89,0xd0,0x3f,0x40,0xc7,0x79,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x6d,0x69,0x66,0x70,0x32,0xa8,0x50,0x3b,0x6c,0x96,0x5b,0x5a,0x8f,0x65,0x36, +0x59,0x9c,0x47,0x73,0x65,0x66,0x72,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x02,0x00,0x90,0xff,0xe8,0x07,0x2a,0x04,0x18,0x00,0x23,0x00,0x33,0x00,0x22,0x40,0x12,0x24,0x95,0x1a,0x0f,0x17,0x03,0x08,0x15,0x0b,0x0f,0x0f,0x95,0x08,0x15,0x2e,0x95,0x00,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39, +0x3f,0xed,0x30,0x31,0x05,0x22,0x26,0x27,0x0e,0x03,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x2c,0x81,0xc6,0x40,0x17,0x3d,0x58,0x77,0x4f,0xfe,0x5d,0xa3,0x01,0x00, +0x48,0x66,0x40,0x1d,0xa4,0x42,0xb2,0x6e,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0xaa,0x18,0x5e,0x57,0x23,0x41,0x33,0x1e,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x2f,0x55,0x75,0x47,0x02,0x4e,0x62,0x3c,0x3e,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96, +0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0xc1,0xcf,0x00,0x00,0x01,0x00,0x35,0xff,0xea,0x04,0xce,0x06,0x02,0x00,0x26,0x00,0x26,0x40,0x14,0x1c,0x0b,0x16,0x95,0x11,0x00,0x20,0x06,0x09,0x95,0x1d,0x19,0x0b,0x0f,0x07,0x15,0x24,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x30,0x31,0x25,0x06, +0x23,0x20,0x11,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x21,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x04,0xce,0x3b,0x5e,0xfe,0xf3,0xfe,0x5f,0xa3,0xaf,0xaf,0x5d,0x5d,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0x01,0xa1,0xa4,0x01,0x02,0xfe,0xfe,0x46, +0x51,0x3f,0x2c,0x0a,0x20,0x01,0x2c,0x02,0x5e,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0x5d,0x5e,0x12,0x94,0x1b,0xd9,0x9e,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x05,0x47,0x05,0x2f,0x00,0x3d,0x00,0x25,0x40,0x14,0x37,0x95,0x34,0x0f,0x0b,0x21,0x1a,0x33,0x05,0x95,0x31,0x0f,0x1f,0x95, +0x1a,0x15,0x3b,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x33,0x12,0x39,0x39,0x3f,0xed,0x30,0x31,0x25,0x06,0x23,0x20,0x11,0x11,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x35,0x37, +0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x05,0x47,0x3b,0x5e,0xfe,0xf3,0xfe,0x3b,0x2e,0x4a,0x35,0x1d,0x1d,0x38,0x50,0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x93,0x4f,0x9f,0x73,0x85,0xa2,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x3d,0x63,0x7e,0x40,0x01,0xd9,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3f,0x2c,0x0a,0x20, +0x01,0x2c,0x02,0x5e,0x0d,0x1c,0x2d,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5b,0x3d,0x4c,0x70,0x4a,0x24,0x3d,0xb0,0x63,0x90,0x27,0x38,0x2d,0x25,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x67,0x42,0x1f,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0xad,0x04,0xda,0x00,0x0b,0x00,0x0b, +0xb3,0x05,0x06,0x00,0x18,0x00,0x3f,0x2f,0x39,0x30,0x31,0x21,0x26,0x02,0x27,0x00,0x25,0x37,0x04,0x13,0x16,0x12,0x17,0x04,0x74,0x58,0xde,0x8d,0xfe,0xeb,0xfe,0xb4,0xe6,0x01,0x1d,0xe7,0x75,0xb8,0x46,0xcd,0x01,0x5b,0x97,0x01,0x2a,0x85,0x6c,0xd4,0xfe,0xbe,0xa3,0xfe,0xa0,0xc1,0x00,0x01,0x00,0x50,0xff,0xfa,0x02,0xd5,0x04,0xdd, +0x00,0x42,0x00,0x26,0x40,0x11,0x2a,0x29,0x29,0x10,0x11,0x36,0x3e,0x11,0x3e,0x11,0x3e,0x05,0x18,0x20,0x33,0x05,0x18,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x23,0x35,0x21,0x36,0x36,0x35,0x34,0x26,0x23, +0x22,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x36,0x1e,0x02,0x15,0x14,0x06,0x15,0x33,0x15,0x23,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x02,0xd5,0x2d,0x51,0x70,0x43,0x17,0x4c,0x4b,0x36,0x1b,0x28,0x30,0x14,0xf7,0x01,0x0e,0x09,0x0d,0x4a,0x40,0x1d,0x27,0x08,0x11,0x0d,0x10, +0x47,0x69,0x45,0x21,0x04,0xe1,0xf3,0x2b,0x39,0x21,0x0d,0x39,0x42,0x3c,0x57,0x1d,0x27,0x20,0x11,0x1b,0x22,0x12,0x1d,0x2d,0x1f,0x10,0x01,0x02,0x2f,0x5e,0x4c,0x2f,0x26,0x46,0x62,0x3c,0x36,0x7a,0x80,0x82,0x3e,0x4e,0x11,0x39,0x28,0x4e,0x55,0x0b,0x08,0x1f,0x1a,0x11,0x26,0x17,0x02,0x3b,0x5e,0x72,0x36,0x17,0x2e,0x15,0x4e,0x7a, +0x9f,0x6a,0x44,0x1d,0x5d,0x65,0x47,0x36,0x12,0x31,0x19,0x13,0x25,0x1b,0x11,0x19,0x27,0x31,0x00,0x03,0x00,0x3c,0xfd,0xec,0x06,0xe7,0x05,0x65,0x00,0x3b,0x00,0x4f,0x00,0x63,0x00,0x43,0x40,0x0e,0x2e,0x15,0x9b,0x18,0x55,0x9b,0x4b,0x18,0x4b,0x18,0x4b,0x06,0x21,0x1f,0xb8,0x01,0x80,0x40,0x0c,0x27,0x5f,0x9b,0x41,0x41,0x06,0x39, +0x99,0x02,0x02,0x35,0x0b,0xb8,0x01,0x80,0xb2,0x09,0x06,0x18,0x00,0x3f,0x33,0xed,0x33,0x33,0x2f,0xed,0x11,0x33,0x2f,0xed,0x2f,0xed,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x30,0x31,0x01,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x37,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x20,0x35, +0x34,0x2e,0x02,0x23,0x22,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x16,0x15,0x14,0x0e,0x02,0x07,0x16,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xcf,0x67,0x59, +0xb2,0x7f,0x56,0x2f,0xbf,0x5e,0x8c,0x50,0xa6,0x34,0x5a,0x43,0x26,0x2d,0x51,0x70,0x43,0x8b,0x8b,0x01,0x35,0x27,0x44,0x5c,0x34,0x9c,0x5d,0x89,0x18,0x4f,0x65,0x76,0x40,0x59,0x96,0x6c,0x3c,0xa6,0xa3,0x33,0x5c,0x7f,0x4b,0x0c,0x4f,0x63,0x61,0x42,0x2c,0x03,0x61,0x3f,0x6c,0x8f,0x51,0x50,0x8f,0x6c,0x3f,0x3f,0x6c,0x8f,0x50,0x50, +0x90,0x6c,0x3f,0xa1,0x25,0x40,0x55,0x30,0x30,0x55,0x40,0x25,0x25,0x40,0x55,0x30,0x30,0x55,0x40,0x25,0xfe,0x20,0x34,0xcd,0x8a,0xc5,0x1f,0xa4,0x4d,0x77,0x1e,0x38,0x4c,0x2f,0x38,0x5b,0x40,0x22,0xa0,0xdc,0x31,0x53,0x3d,0x23,0x77,0x50,0x2d,0x49,0x33,0x1c,0x38,0x66,0x8e,0x56,0xc3,0x6a,0x63,0xe1,0x4a,0x7f,0x60,0x3d,0x09,0x60, +0x81,0xa5,0x26,0x02,0xdb,0x50,0x8f,0x6c,0x3f,0x3f,0x6c,0x8f,0x50,0x51,0x90,0x6c,0x3f,0x3f,0x6c,0x90,0x51,0x30,0x55,0x41,0x25,0x25,0x41,0x55,0x30,0x30,0x55,0x40,0x25,0x25,0x40,0x55,0x00,0x02,0x00,0x54,0xfe,0x9b,0x08,0x76,0x08,0xe0,0x00,0x72,0x00,0x82,0x00,0x53,0xb9,0x00,0x39,0x01,0x81,0xb4,0x4b,0x4b,0x43,0x48,0x42,0xb8, +0x01,0x81,0x40,0x18,0x45,0x11,0x63,0x79,0x23,0x04,0x16,0x7e,0x1e,0x1e,0x01,0x76,0x16,0x16,0x69,0x71,0x01,0x01,0x45,0x45,0x43,0x0c,0x69,0x2d,0xb8,0x01,0x81,0xb4,0x55,0x55,0x40,0x43,0x18,0x00,0x3f,0x33,0x33,0x2f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x17,0x39,0x10,0xed, +0x32,0x12,0x39,0x2f,0xed,0x30,0x31,0x01,0x21,0x35,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x3e,0x03,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x0e,0x02,0x02,0x15,0x14,0x12,0x04,0x04,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21, +0x15,0x23,0x11,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x06,0x04,0x23,0x22,0x24,0x24,0x26,0x26,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x21,0x25,0x34,0x26,0x23,0x22,0x06,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x06,0xe5,0xfe,0x0b,0x1d,0x2f,0x20,0x11,0x28,0x4b,0x6b,0x42,0x3a, +0x60,0x47,0x2a,0x04,0x08,0x1a,0x20,0x20,0x0e,0x76,0x82,0x23,0x3f,0x56,0x34,0x38,0x56,0x40,0x2a,0x0d,0x46,0x93,0x78,0x4c,0x90,0x01,0x05,0x01,0x6d,0xde,0x5f,0xaf,0x96,0x7b,0x57,0x30,0x18,0x2d,0x40,0x29,0x1d,0x36,0x29,0x19,0xd8,0xfe,0xd7,0xd8,0x03,0xcd,0xf4,0x40,0x7f,0x50,0x81,0x5a,0x31,0x66,0xd9,0xfe,0xad,0xec,0xb2,0xfe, +0xc6,0xfe,0xf8,0xd2,0x91,0x4d,0x30,0x54,0x71,0x82,0x8d,0x45,0x44,0x75,0x9d,0x58,0x60,0xa4,0x77,0x44,0x23,0x23,0x01,0x21,0xfd,0x25,0x2b,0x2e,0x26,0x3b,0x11,0x02,0x16,0x22,0x2a,0x17,0x10,0x1d,0x16,0x0d,0x05,0xa8,0x7f,0x12,0x39,0x44,0x47,0x20,0x48,0x75,0x53,0x2e,0x29,0x46,0x61,0x37,0x04,0x08,0x08,0x05,0x78,0x6e,0x32,0x52, +0x3b,0x20,0x27,0x40,0x52,0x2c,0x2d,0x8f,0xd4,0xfe,0xe1,0xbd,0xda,0xfe,0xa0,0xfa,0x87,0x08,0x1f,0x3f,0x6e,0xa6,0x77,0x47,0x78,0x57,0x31,0x21,0x36,0x42,0x21,0xfe,0x1c,0x04,0x78,0xfb,0x88,0x05,0x28,0xb0,0xfe,0x99,0x3e,0x46,0x7c,0xad,0x67,0xb3,0xfe,0xee,0xba,0x5f,0x4b,0x8d,0xca,0xfe,0x01,0x2c,0xa9,0x8e,0xf6,0xd0,0xaa,0x87, +0x64,0x21,0x17,0x58,0x9d,0x75,0x45,0x45,0x78,0xa5,0x60,0x3c,0x7a,0x3b,0x56,0x36,0x30,0x15,0x0e,0x1e,0x37,0x2a,0x1a,0x0f,0x18,0x1f,0x00,0x01,0x00,0x74,0x00,0xfd,0x03,0x47,0x05,0x5a,0x00,0x5c,0x00,0x2b,0x40,0x14,0x37,0x53,0x59,0x22,0x1c,0x12,0x2d,0x03,0x53,0x03,0x12,0x12,0x03,0x53,0x03,0x0a,0x4d,0x40,0x21,0x0a,0x00,0x2f, +0x33,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x11,0x33,0x32,0x32,0x11,0x33,0x30,0x31,0x01,0x06,0x06,0x07,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x11,0x26,0x26,0x27,0x22,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16, +0x17,0x35,0x34,0x26,0x23,0x22,0x06,0x23,0x22,0x2e,0x02,0x27,0x13,0x33,0x17,0x16,0x33,0x32,0x37,0x17,0x07,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x15,0x36,0x36,0x37,0x03,0x47,0x2e,0x82,0x53,0x0d,0x15,0x1a,0x0c,0x42,0x24,0x50,0x43,0x2c,0x3b,0x2e,0x06,0x1b,0x1b,0x15,0x18,0x1c,0x18,0x0b,0x15, +0x20,0x15,0x2e,0x55,0x31,0x36,0x3c,0x10,0x1c,0x26,0x17,0x27,0x3b,0x07,0x0e,0x28,0x1e,0x2a,0x25,0x0f,0x17,0x09,0x0b,0x10,0x10,0x12,0x0c,0xfc,0x1c,0x9f,0x06,0x12,0x0f,0x0c,0x1d,0x75,0x08,0x1e,0x2b,0x38,0x22,0x1a,0x28,0x11,0x0e,0x19,0x0b,0x27,0x3f,0x2d,0x18,0x34,0x66,0x33,0x03,0x8b,0x54,0x4f,0x0e,0xfe,0x69,0x0f,0x1a,0x13, +0x0a,0x38,0x5b,0x75,0x3d,0x3f,0x47,0x06,0x18,0x33,0x2d,0x27,0x27,0x14,0x08,0x07,0x0c,0x25,0x23,0x19,0x01,0x69,0x04,0x0b,0x12,0x3f,0x2a,0x16,0x26,0x1d,0x10,0x2b,0x23,0x09,0x0d,0x0c,0x34,0x35,0x28,0x03,0x0e,0x1b,0x27,0x18,0x01,0x0c,0x6c,0x06,0x09,0x2a,0x78,0x1a,0x20,0x1a,0x2a,0x1b,0x02,0x03,0x17,0x25,0x31,0x1a,0x93,0x05, +0x2c,0x3b,0x00,0x01,0xff,0xf8,0xff,0xec,0x09,0x3b,0x05,0xcd,0x00,0xa4,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x3e,0x03,0x37,0x17,0x0e,0x05,0x07,0x0e,0x05,0x07,0x3e,0x05,0x37,0x3e,0x03,0x37,0x3e,0x03,0x37,0x17, +0x0e,0x05,0x07,0x0e,0x05,0x15,0x14,0x33,0x32,0x3e,0x02,0x37,0x17,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x3e,0x05,0x37,0x0e,0x03,0x07,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x12,0x37,0x3e,0x05,0x37,0x0e,0x05,0x07,0x0e,0x05,0x01,0x0a,0x3f,0x65,0x48,0x26,0x1c,0x31,0x44,0x29,0x22, +0x2c,0x1a,0x0b,0x14,0x2c,0x43,0x2f,0x1a,0x11,0x13,0x2e,0x4b,0x38,0x4b,0x87,0x7e,0x77,0x76,0x78,0x41,0x61,0xc1,0xb0,0x96,0x36,0x21,0x09,0x32,0x40,0x47,0x3f,0x2e,0x07,0x07,0x24,0x30,0x36,0x31,0x26,0x07,0x20,0x4b,0x51,0x55,0x55,0x52,0x27,0x2d,0x4a,0x43,0x40,0x23,0x39,0x70,0x64,0x55,0x1f,0x22,0x17,0x3d,0x44,0x48,0x46,0x40, +0x19,0x15,0x38,0x3c,0x3b,0x2f,0x1d,0x10,0x1b,0x51,0x5b,0x5e,0x29,0x19,0x27,0x5f,0x62,0x5f,0x28,0x23,0x38,0x27,0x15,0x24,0x3b,0x48,0x48,0x3f,0x15,0x1a,0x4d,0x55,0x58,0x4b,0x37,0x0a,0x1a,0x70,0x9d,0xc4,0x6d,0x3e,0x6b,0x5d,0x51,0x24,0x1f,0x38,0x34,0x2f,0x15,0x22,0x27,0x14,0x05,0x19,0x49,0x84,0x6c,0x18,0x3e,0x42,0x41,0x36, +0x28,0x08,0x2c,0x6c,0x74,0x79,0x71,0x67,0x28,0x37,0x6d,0x71,0x78,0x85,0x96,0x14,0x27,0x48,0x63,0x3c,0x2b,0x4c,0x38,0x20,0x14,0x21,0x28,0x14,0x18,0x2d,0x26,0x1c,0x06,0x03,0x16,0x12,0x09,0x30,0x31,0x26,0x3a,0x65,0x8b,0xa0,0xaf,0x58,0x84,0xef,0xc3,0x90,0x26,0x15,0x15,0x6e,0x91,0xa1,0x8e,0x69,0x10,0x10,0x59,0x79,0x8e,0x8f, +0x83,0x30,0x20,0x66,0x7c,0x8a,0x8a,0x82,0x35,0x3d,0x64,0x55,0x4b,0x25,0x3d,0x69,0x54,0x3e,0x12,0x21,0x21,0x65,0x78,0x85,0x85,0x7d,0x33,0x2a,0x79,0x8a,0x90,0x81,0x67,0x1c,0x1d,0x38,0x59,0x6e,0x35,0x15,0x36,0x72,0x5e,0x3d,0x1a,0x3c,0x64,0x4a,0x31,0x7c,0x86,0x87,0x78,0x60,0x1c,0x23,0x5f,0x67,0x67,0x56,0x3e,0x0b,0x12,0x56, +0x97,0xde,0x99,0x59,0xa6,0x98,0x85,0x36,0x2e,0x4f,0x3b,0x21,0x2f,0x45,0x4d,0x1e,0x21,0x7b,0xbc,0x01,0x01,0xa7,0x26,0x5c,0x5e,0x5b,0x4c,0x36,0x0b,0x21,0x6b,0x82,0x91,0x90,0x86,0x36,0x49,0xa1,0x9b,0x8d,0x6b,0x3f,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x04,0x2a,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xc9, +0xfe,0xf4,0xff,0xff,0x00,0xab,0xfe,0xa6,0x05,0xf4,0x05,0xec,0x00,0x27,0x0f,0x50,0x02,0x59,0xfe,0xab,0x00,0x06,0x09,0x24,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0x12,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0xff,0xff,0x00,0xab,0xfd,0xc9, +0x06,0x9f,0x04,0x12,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xad,0xfd,0xce,0x00,0x07,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x04,0x39,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x14,0x7c,0x03,0xc6,0xfb,0xaa,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x5f,0x02,0x26,0x09,0x17, +0x00,0x00,0x00,0x07,0x0a,0x1f,0x00,0xa5,0xfc,0xd3,0xff,0xff,0x00,0x9a,0xfd,0xfb,0x05,0x91,0x05,0xe2,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0x01,0xfe,0x00,0x00,0x07,0x0a,0x1f,0x01,0xc4,0xfd,0x56,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x4b,0x03,0x62,0x02,0x06,0x09,0xc8,0x00,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff, +0x05,0x4b,0x02,0xb7,0x02,0x06,0x09,0x7c,0x00,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x01,0xc1,0x02,0x06,0x09,0x5f,0x00,0x00,0x00,0x04,0x00,0x00,0x06,0x71,0x04,0xb4,0x09,0x9a,0x00,0x28,0x00,0x2c,0x00,0x6e,0x00,0x7c,0x00,0x00,0x01,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23, +0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x13,0x33,0x11,0x23,0x25,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26, +0x27,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x33,0x27,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x17,0x3e,0x03,0x03,0x75,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x0b,0x13,0x08,0x08,0x6a,0x4d,0x15,0x2b,0x17,0x17,0x2f,0x10,0x1d,0x27,0x18,0x0a,0x1f,0x11,0x61,0x0c,0x12,0x05,0x04, +0x1d,0x1d,0xee,0x5c,0x5c,0xfd,0x6b,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x1b,0x45,0x78,0x33,0x31,0x26,0x10,0x23,0x38,0x27,0x26,0x53,0x26,0x2b,0x4d,0x28,0x3f,0x5b,0x39,0x1b,0x0a,0x1a,0x2e,0x23,0x19,0x30,0x11,0x08,0x05,0x12,0x2d,0x32,0x35,0x1a,0x19,0x38,0x2d,0x1e,0x09,0x19,0x2c,0x24,0x25,0x50,0x2d,0x8d,0x26,0x21,0x18,0x32, +0x17,0x11,0x27,0x14,0x1c,0x24,0x15,0x07,0x07,0x95,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x07,0x03,0x66,0x67,0x08,0x0b,0x5f,0x07,0x09,0x15,0x26,0x34,0x1f,0x39,0x73,0x30,0x1d,0x42,0x20,0x14,0x15,0x02,0x05,0xfd,0x9a,0x61,0x16,0x23,0xb7,0xba,0x31,0x3c,0x20,0x0a,0x36,0x2e,0x16,0x30,0x1a,0x16,0x27,0x1e,0x11,0x0f, +0x0d,0x5a,0x14,0x09,0x1e,0x35,0x45,0x27,0x15,0x2b,0x2a,0x29,0x15,0x1c,0x45,0x1d,0x46,0x05,0x09,0x01,0x03,0x07,0x07,0x04,0x07,0x13,0x25,0x1e,0x0e,0x26,0x2a,0x2b,0x14,0x17,0x1a,0xbb,0x0b,0x08,0x04,0x03,0x1a,0x2e,0x14,0x0d,0x18,0x15,0x11,0x00,0x00,0x02,0xff,0x2b,0x06,0x1f,0x02,0xdf,0x08,0x40,0x00,0x36,0x00,0x48,0x00,0x21, +0x40,0x0e,0x00,0x37,0x37,0x23,0x31,0x05,0x0f,0x0f,0x1a,0x3f,0x05,0x05,0x29,0x1a,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x33,0x11,0x33,0x30,0x31,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15, +0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x33,0x17,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x01,0x35,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13,0x20,0x46,0x71,0x51,0x17,0x3e,0x3b,0x30,0x0a,0x02,0x02,0x1a,0x36,0x56,0x3e,0x3f,0x54,0x32,0x15,0x06,0x07,0x56, +0x05,0x05,0x3a,0x45,0x28,0x38,0x23,0x10,0x07,0x07,0x58,0x0a,0x02,0x1b,0x13,0xd3,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c,0x1d,0x1b,0x07,0x2f,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x06,0x0c,0x0a,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x1a,0x37,0x1d,0x1b,0x29,0x16,0x42, +0x34,0x12,0x28,0x41,0x2f,0x21,0x43,0x2f,0x5d,0x14,0x1c,0x03,0x02,0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x00,0x01,0x00,0x00,0x06,0x1e,0x01,0xba,0x08,0xdd,0x00,0x35,0x00,0x19,0x40,0x0a,0x19,0x00,0x30,0x30,0x11,0x2a,0x21,0x21,0x0a,0x11,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0x30,0x31,0x01, +0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x32,0x16,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x3e,0x03,0x37,0x01,0x62,0x47,0x61,0x3d,0x1b,0x12,0x26,0x3d,0x2b,0x2d,0x65,0x26,0x2f,0x5c,0x2e,0x45,0x61, +0x3e,0x1d,0x23,0x30,0x1c,0x1a,0x1c,0x35,0x4d,0x30,0x06,0x16,0x1a,0x16,0x06,0x0b,0x2b,0x11,0x34,0x43,0x11,0x0e,0x10,0x2f,0x34,0x37,0x1a,0x07,0xaa,0x10,0x28,0x2f,0x33,0x1b,0x18,0x2b,0x20,0x13,0x16,0x0e,0x63,0x10,0x12,0x21,0x38,0x4c,0x2a,0x2a,0x56,0x2a,0x1f,0x49,0x23,0x24,0x44,0x34,0x1f,0x02,0x03,0x03,0x64,0x02,0x03,0x25, +0x32,0x1a,0x2d,0x0f,0x0a,0x13,0x13,0x10,0x07,0x00,0x00,0x04,0x00,0x00,0x06,0x71,0x01,0xf5,0x09,0x3e,0x00,0x2a,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x27,0x40,0x11,0x40,0x3e,0x3e,0x3b,0x39,0x39,0x2b,0x00,0x19,0x0f,0x0f,0x22,0x33,0x19,0x19,0x08,0x22,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x32,0x2f,0x33, +0x33,0x2f,0x33,0x30,0x31,0x13,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x32,0x36,0x37,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x65, +0x03,0x05,0x0f,0x23,0x3a,0x2c,0x31,0x3c,0x23,0x0e,0x03,0x18,0x1a,0x1d,0x36,0x29,0x19,0x15,0x26,0x33,0x1e,0x21,0x33,0x19,0x16,0x17,0x7d,0x88,0x43,0x5c,0x38,0x19,0x05,0x05,0x01,0x61,0x0b,0x15,0x0b,0x02,0x0b,0x11,0x16,0x0b,0x10,0x1d,0x27,0x2f,0x73,0x73,0xc8,0x73,0x73,0x07,0xa4,0x1a,0x2c,0x13,0x21,0x2c,0x1b,0x0c,0x0f,0x1b, +0x25,0x15,0x07,0x12,0x23,0x33,0x21,0x1b,0x3d,0x33,0x21,0x25,0x25,0x21,0x65,0x33,0x7e,0x77,0x1b,0x34,0x4e,0x32,0x17,0x32,0x1c,0x10,0x01,0x05,0x0e,0x25,0x21,0x17,0x2b,0x19,0x15,0x18,0x01,0x38,0x71,0x71,0x71,0x00,0x00,0x03,0x00,0x32,0x05,0xd1,0x01,0xd4,0x08,0x8c,0x00,0x1c,0x00,0x20,0x00,0x24,0x00,0x1d,0x40,0x0c,0x23,0x22, +0x22,0x1f,0x1d,0x1d,0x11,0x08,0x1c,0x1c,0x16,0x08,0x00,0x2f,0x33,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x32,0x2f,0x33,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x21,0x15,0x21,0x01,0xc7,0x07,0x06, +0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06,0x05,0x58,0x09,0x30,0x3c,0x46,0x3c,0x07,0x06,0x31,0x73,0x73,0xdd,0x01,0x52,0xfe,0xae,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x36,0x29,0x40,0x4f,0x1a,0x3d,0x26,0x38,0x71,0xfd,0x9d,0x58,0xff,0xff,0x00,0x32,0xfc,0xd5,0x01,0xd4, +0xff,0x90,0x02,0x03,0x14,0x61,0x00,0x00,0xf7,0x04,0x00,0x0b,0xfc,0xe6,0x07,0x1d,0x02,0xe0,0x0a,0x0e,0x00,0x64,0x00,0x68,0x00,0x6c,0x00,0x70,0x00,0x74,0x00,0x78,0x00,0x7c,0x00,0x80,0x00,0x84,0x00,0x88,0x00,0x8c,0x00,0x00,0x03,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x35, +0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17, +0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x01,0x33,0x11,0x23,0x01,0x33,0x15,0x23,0x07,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xf6,0x14,0x26,0x50,0x09,0x14,0x12,0x0c,0x5c,0x13,0x26,0x36,0x09,0x15, +0x11,0x0c,0x5c,0x11,0x21,0x3e,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x3b,0x23,0x32,0x11,0x17,0x35,0x19,0x4c,0x19,0x2c,0x0d,0x17,0x39,0x19,0x6a,0x17,0x2d,0x0d,0x17,0x35,0x1a,0x0e,0x17,0x27,0x22,0x1d,0x0e,0x16,0x2b,0x17,0x1c,0x28,0x50,0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x17,0x2a,0x17,0x0e,0x09,0x15, +0x11,0x0c,0x5c,0x03,0x7a,0x5c,0x5c,0xfc,0xdd,0x3f,0x3f,0x9e,0x65,0x65,0x02,0x2e,0x65,0x65,0xfc,0x7b,0x65,0x65,0x03,0xcc,0x64,0x64,0xfc,0xc0,0x64,0x64,0x01,0x12,0x64,0x64,0x45,0x64,0x64,0x02,0x2e,0x64,0x64,0x07,0xe9,0x2c,0x28,0x06,0x0d,0x16,0x11,0x01,0xcb,0xfe,0x4f,0x2c,0x28,0x06,0x0d,0x16,0x11,0xb7,0x9d,0x2a,0x2a,0x16, +0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x15,0x12,0x16,0x11,0x16,0x11,0x16,0x11,0x18,0x0f,0x16,0x11,0x0c,0x13,0x18,0x0c,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x12,0x1d,0x06,0x0d,0x16,0x11,0xb7,0x01,0x14,0xfd,0x9a,0x02,0xda,0xc4,0x8f,0x62,0x62,0x62,0xeb,0x62,0xaf,0x62, +0xfe,0x8d,0x62,0xaf,0x62,0xea,0x62,0x62,0x62,0x00,0x00,0x07,0xfb,0x6b,0x06,0xaa,0x03,0xb0,0x09,0x9a,0x00,0x84,0x00,0x94,0x00,0x98,0x00,0xa4,0x00,0xa8,0x00,0xac,0x00,0xb0,0x00,0x00,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x33,0x32,0x3e,0x02,0x37,0x27,0x26,0x26,0x23,0x22, +0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x07,0x07,0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06, +0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x03,0x1e,0x03,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x27,0x01,0x33,0x11,0x23,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x13,0x23,0x35,0x33, +0x17,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0xfc,0xb3,0x26,0x47,0x16,0x32,0x29,0x0c,0x13,0x1a,0x0e,0x5f,0x17,0x20,0x0b,0x02,0x08,0x0e,0x15,0x0f,0x09,0x2a,0x4f,0x49,0x45,0x20,0x0b,0x1d,0x3f,0x32,0x1e,0x3d,0x13,0x17,0x3c,0x1f,0x32,0x45,0x1e,0x0d,0x1d,0x22,0x2b,0x1c,0x10,0x3d,0x02,0x22,0x2c,0x1d,0x09,0x15,0x11,0x0c,0x5c,0x03, +0x0b,0x15,0x11,0x16,0x22,0x5c,0x13,0x26,0x17,0x1d,0x5d,0x10,0x21,0x0d,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x1c,0x27,0x0e,0x14,0x34,0x1a,0x22,0x35,0x12,0x17,0x37,0x19,0x24,0x32,0x0f,0x16,0x38,0x18,0x38,0x2d,0x42,0x08,0x1c,0x41,0x4b,0x54,0x2f,0x0f,0x1b,0x2b,0x0c,0x1a,0x4e,0x2e,0x17,0x41,0x1d,0xe7,0x35,0x49,0x2d,0x13, +0x51,0x49,0x47,0x4b,0x35,0x21,0x1f,0x07,0xb2,0x5c,0x5c,0xf8,0x73,0x21,0x17,0x20,0x1c,0x18,0x21,0x1a,0x21,0x20,0x65,0x65,0x8c,0x64,0x64,0x02,0xe0,0x64,0x64,0x07,0x9e,0x05,0x06,0x14,0x16,0x12,0x3e,0x4b,0x52,0x24,0x45,0x79,0x31,0x0a,0x19,0x17,0x0f,0x01,0x12,0x1e,0x27,0x14,0x05,0x10,0x18,0x08,0x05,0x58,0x08,0x0b,0x19,0x10, +0x06,0x0d,0x0b,0x09,0x02,0x59,0x27,0x14,0x10,0x06,0x0d,0x16,0x11,0x71,0x58,0x15,0x20,0x14,0x0a,0x17,0x23,0x71,0x57,0x2c,0x28,0x17,0x23,0xb8,0x9b,0x2b,0x2a,0x02,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x13,0x0f,0x13,0x0f,0x10,0x17,0x16,0x11,0x14,0x12,0x14,0x12,0x30,0x2a,0x10,0x20,0x1a,0x10,0x1c,0x11,0x1b,0x15, +0x08,0x04,0x01,0x96,0x21,0x43,0x45,0x47,0x25,0x42,0x51,0x49,0x3e,0x40,0x63,0x1f,0x1a,0x01,0x0c,0xfd,0x9a,0x8a,0x1a,0x17,0x1a,0x16,0x1f,0x3c,0x23,0x16,0x42,0x01,0x2a,0x62,0x62,0x62,0xfd,0x3b,0x62,0x00,0x00,0x06,0xfb,0x9b,0x07,0x31,0x03,0x92,0x09,0x9a,0x00,0x7e,0x00,0x82,0x00,0x92,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0x00, +0x01,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x26,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37, +0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x16,0x16,0x17,0x01,0x33,0x11,0x23,0x25,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23, +0x22,0x0e,0x02,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x7a,0x17,0x1d,0x5d,0x03,0x0c,0x16,0x13,0x10,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x20,0x2c,0x0f,0x14,0x34,0x1a,0x1b,0x24,0x2d,0x11,0x11,0x2e,0x35,0x3b,0x1e,0x48,0x66,0x45,0x2a,0x0b,0x0c,0x11, +0x07,0x17,0x37,0x19,0x19,0x11,0x1c,0x1a,0x19,0x0f,0x2a,0x67,0x36,0x48,0x68,0x89,0x27,0x1d,0x15,0x0b,0x05,0x5a,0x04,0x09,0x0a,0x0e,0x0c,0x22,0x33,0x48,0x31,0x13,0x26,0x21,0x18,0x04,0x22,0x10,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x39,0x17,0x21,0x09,0x05,0x5c,0x0e,0x02,0x0e,0x10,0x0f,0x37,0x4e,0x65,0x3d,0x33,0x4a, +0x30,0x17,0x01,0x0e,0x17,0x01,0xe2,0x5c,0x5c,0xfc,0x5a,0x21,0x52,0x35,0x26,0x39,0x27,0x14,0x40,0x32,0x25,0x41,0x34,0x29,0xfe,0x59,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x11,0x64,0x64,0x04,0x24,0x64,0x64,0x07,0x95,0x17,0x23,0xb8,0x9b,0x17,0x20,0x16,0x0a,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a, +0x01,0x11,0x10,0x13,0x0f,0x0f,0x18,0x0e,0x11,0x09,0x02,0x01,0x03,0x05,0x05,0x05,0x0f,0x08,0x16,0x11,0x03,0x06,0x08,0x06,0x13,0x07,0x0f,0x20,0x17,0x43,0x25,0x1b,0x34,0x14,0x11,0x34,0x13,0x14,0x23,0x09,0x08,0x0a,0x04,0x01,0x01,0x02,0x02,0x01,0x16,0x31,0x20,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x19,0x0f,0x11, +0x3a,0x17,0x68,0x0b,0x11,0x04,0x28,0x5c,0x4e,0x34,0x1f,0x35,0x46,0x27,0x20,0x25,0x01,0x02,0x04,0xfd,0x9a,0x61,0x01,0x01,0x03,0x0c,0x19,0x16,0x3a,0x31,0x1d,0x2f,0x3c,0x24,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x19,0x0f,0x0d,0x01,0x42,0x62,0x8d,0x62,0x00,0x00,0x05,0xfc,0x00,0x07,0x1d,0x02,0x8d,0x09,0xb2,0x00,0x7e, +0x00,0x82,0x00,0x86,0x00,0x8a,0x00,0x8e,0x00,0x00,0x01,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x35,0x25,0x15,0x07,0x1e,0x03,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22, +0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x05,0x23,0x35, +0x33,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xfe,0x24,0x14,0x26,0xd5,0x43,0x30,0x23,0x40,0x5a,0x36,0x01,0x5e,0xea,0x42,0x50,0x2e,0x15,0x07,0x01,0x07,0x10,0x1d,0x19,0x13,0x09,0x15,0x11,0x0c,0x5c,0x03,0x0b,0x15,0x11,0x16,0x22,0x5c,0x13,0x26,0x17,0x1d,0x5d,0x0f,0x22,0x38,0x29,0x22,0x35,0x12,0x17,0x37, +0x19,0x24,0x32,0x0f,0x16,0x38,0x18,0x38,0x0a,0x16,0x16,0x12,0x05,0x17,0x50,0x42,0xdd,0x23,0x32,0x11,0x17,0x35,0x1a,0x10,0x2c,0x41,0x1c,0x16,0x2b,0x17,0x1c,0x28,0x50,0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x17,0x2a,0x17,0x0e,0x09,0x15,0x11,0x0c,0x5c,0xfe,0x62,0x65,0x65,0x01,0x57,0x65,0x65,0x8c,0x64, +0x64,0xfe,0xa9,0x64,0x64,0x07,0xe9,0x2c,0x28,0x1a,0x18,0x1b,0x35,0x34,0x34,0x1b,0x3d,0xdb,0x61,0x94,0x20,0x38,0x36,0x36,0x1e,0x07,0x18,0x16,0x11,0x06,0x0d,0x16,0x11,0x71,0x58,0x15,0x20,0x14,0x0a,0x17,0x23,0x71,0x57,0x2c,0x28,0x17,0x23,0xb8,0x9b,0x33,0x46,0x2b,0x14,0x10,0x17,0x16,0x11,0x14,0x12,0x14,0x12,0x0b,0x10,0x12, +0x07,0x17,0x1d,0x15,0x12,0x16,0x11,0x2a,0x19,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x12,0x1d,0x06,0x0d,0x16,0x11,0xb7,0x54,0x62,0x27,0x62,0x62,0x62,0xeb,0x62,0x00,0x00,0x06,0xfd,0x71,0x07,0x31,0x01,0x80,0x09,0x5c,0x00,0x43,0x00,0x52,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d, +0x00,0x00,0x03,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x26,0x26,0x17,0x34, +0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xfc,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x74,0x1f,0x16,0x15,0x26,0x32,0x1e,0x24,0x38,0x28,0x15,0x33,0x4f,0x60,0x2c,0x4b,0x1a,0x2f, +0x14,0x2a,0x67,0x36,0x48,0x68,0x89,0x27,0x1d,0x15,0x0b,0x05,0x5a,0x04,0x09,0x0a,0x0e,0x0c,0x22,0x33,0x48,0x31,0x13,0x26,0x21,0x18,0x04,0x22,0x10,0xc8,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x01,0x58,0x0b,0x12,0x17,0x0c,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x58,0x65,0x65,0x8c,0x64,0x64,0xfe,0x63,0x64,0x64, +0x08,0x00,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x16,0x35,0x20,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x3e,0x44,0x1f,0x05,0x0f,0x08,0x13,0x07,0x0f,0x20,0x17,0x43,0x25,0x1b,0x34,0x14,0x11,0x34,0x13,0x14,0x23,0x09,0x08,0x0a,0x04,0x01,0x01,0x02,0x02,0x01,0x16,0x31,0x08,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14, +0x15,0x19,0x0f,0x0d,0x20,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x18,0x0f,0x0f,0x01,0x3f,0x62,0x62,0x62,0x62,0x62,0x00,0x0a,0xfd,0x0e,0x06,0x71,0x02,0x8c,0x09,0x5c,0x00,0x4b,0x00,0x6d,0x00,0x7c,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xaf,0x00,0x00,0x01,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02, +0x15,0x14,0x07,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x05,0x16,0x16,0x33,0x32, +0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x23, +0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x32,0x36,0x37,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0xfe,0xa0,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x74,0x1f,0x16,0x15,0x26,0x32,0x1e,0x24,0x38,0x28,0x15,0x33,0x4f,0x60,0x2c,0x4b,0x19,0x30,0x14,0x15,0x30,0x2f,0x2c,0x12,0x27,0x30,0x42,0x1d,0x16,0x2b,0x17,0x1c,0x28,0x50, +0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x19,0x2f,0x1e,0x14,0x1e,0x05,0x22,0x10,0x02,0x89,0x2a,0x51,0x1d,0x1e,0x27,0x19,0x0c,0x02,0x16,0x1c,0x1d,0x35,0x2a,0x19,0x16,0x25,0x33,0x1e,0x2d,0x3b,0x23,0x0f,0x16,0x30,0x4e,0x37,0x26,0x4b,0x27,0xfe,0x3f,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c, +0x01,0x58,0x0b,0x12,0x17,0x0c,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x58,0x65,0x65,0xfd,0x2c,0x65,0x65,0x01,0xc3,0x64,0x64,0x01,0x9d,0x64,0x64,0xfd,0x2c,0x64,0x64,0x03,0xe3,0x0b,0x15,0x0a,0x02,0x0b,0x11,0x14,0x0c,0x08,0x10,0x0d,0x08,0x27,0x08,0x00,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x16,0x35,0x20,0x1b,0x3d, +0x33,0x21,0x2c,0x40,0x49,0x1d,0x3e,0x44,0x1f,0x05,0x0f,0x08,0x08,0x0a,0x04,0x01,0x2a,0x19,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x14,0x1c,0x03,0x02,0x16,0x31,0xe9,0x11,0x13,0x12,0x1d,0x25,0x14,0x07,0x12,0x23,0x33,0x21,0x1b,0x3d,0x33,0x21,0x38,0x51,0x59,0x21,0x30,0x59,0x43, +0x29,0x09,0x13,0x01,0x4b,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x19,0x0f,0x0d,0x20,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x18,0x0f,0x0f,0x01,0x3f,0x62,0xfe,0xd6,0x62,0x66,0x62,0x62,0x62,0xfe,0xd6,0x62,0xff,0x02,0x05,0x0e,0x25,0x21,0x16,0x0c,0x14,0x17,0x0c,0x16,0x18,0x00,0x02,0x00,0x00,0x06,0x71,0x02,0xf4, +0x08,0x06,0x00,0x1b,0x00,0x2e,0x00,0x14,0xb7,0x21,0x18,0x18,0x05,0x2a,0x10,0x10,0x05,0x00,0x2f,0x33,0x2f,0x33,0x11,0x33,0x11,0x33,0x30,0x31,0x01,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x32,0x36,0x37,0x25,0x14,0x1e,0x02,0x33,0x33,0x36,0x36,0x35,0x34,0x2e,0x02,0x23, +0x22,0x0e,0x02,0x02,0xf4,0x11,0x3c,0x4e,0x5d,0x31,0xef,0x3f,0x54,0x33,0x16,0x11,0x2b,0x48,0x38,0x2b,0x43,0x2c,0x17,0x13,0x81,0x59,0x93,0x2d,0xfd,0x66,0x0f,0x21,0x34,0x24,0x15,0x0f,0x0d,0x10,0x1a,0x20,0x10,0x1d,0x25,0x15,0x08,0x06,0x98,0x08,0x0f,0x0a,0x06,0x26,0x3c,0x49,0x23,0x21,0x47,0x3a,0x25,0x1f,0x36,0x4a,0x2b,0x32, +0x33,0x13,0x10,0x41,0x13,0x24,0x1c,0x11,0x1d,0x31,0x15,0x19,0x26,0x1a,0x0d,0x12,0x1c,0x25,0x00,0x02,0xff,0xfe,0x06,0x71,0x03,0x28,0x07,0xeb,0x00,0x29,0x00,0x39,0x00,0x21,0x40,0x0e,0x0f,0x2d,0x2d,0x20,0x08,0x14,0x1c,0x1c,0x26,0x35,0x14,0x14,0x03,0x26,0x00,0x2f,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0x39,0x33,0x11, +0x33,0x30,0x31,0x03,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x22,0x27,0x25,0x32,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x02,0x0f,0x1b,0x0d,0x37,0x4b,0x2e,0x16,0x03,0x5b,0x04,0x0c, +0x18,0x15,0x0d,0x30,0x44,0x57,0x35,0x42,0x43,0x1d,0x41,0x67,0x4a,0x5d,0x4c,0x52,0x06,0x04,0x0b,0x22,0x35,0x4c,0x35,0x0a,0x13,0x0b,0x01,0xe4,0x08,0x16,0x0c,0x16,0x3f,0x3a,0x2a,0x23,0x1d,0x1f,0x34,0x29,0x1e,0x06,0xda,0x01,0x02,0x11,0x1f,0x2e,0x1e,0x14,0x1a,0x26,0x1a,0x0d,0x01,0x29,0x61,0x53,0x37,0x4c,0x46,0x28,0x51,0x42, +0x2a,0x3e,0x34,0x19,0x2b,0x1f,0x12,0x01,0x66,0x01,0x08,0x18,0x2f,0x27,0x17,0x24,0x1f,0x33,0x3f,0x00,0x00,0x02,0x00,0xdc,0x01,0x03,0x03,0xa8,0x04,0x9a,0x00,0x1e,0x00,0x39,0x00,0x1a,0xb1,0x03,0x1b,0xb8,0x04,0xfb,0xb3,0x36,0x1f,0x22,0x2c,0xb9,0x04,0xfb,0x00,0x0f,0x00,0x2f,0xed,0x2f,0xce,0x33,0xed,0x32,0x30,0x31,0x01,0x06, +0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x3f,0x20,0x4d,0x2e,0x25,0x47,0x39,0x23,0x24,0x3b,0x4c,0x51,0x4e,0x20,0x1e,0x4d,0x4e,0x4b,0x3b, +0x23,0x26,0x3c,0x4b,0x25,0x2d,0x4a,0x1b,0x28,0x2d,0x30,0x13,0x24,0x1c,0x10,0x35,0x4b,0x52,0x1d,0x1d,0x4e,0x48,0x32,0x0f,0x1a,0x25,0x15,0x28,0x31,0x02,0x01,0x68,0x38,0x2d,0x1c,0x46,0x78,0x5c,0x5a,0xa0,0x87,0x6c,0x4c,0x28,0x27,0x4a,0x69,0x83,0x9c,0x57,0x60,0x7e,0x4b,0x1e,0x2d,0x38,0xaf,0x3a,0x49,0x0f,0x28,0x45,0x37,0x62, +0xa9,0x7b,0x46,0x47,0x7b,0xa6,0x5e,0x35,0x46,0x2c,0x12,0x44,0x3f,0x00,0xff,0xff,0xfe,0xd4,0xfe,0x53,0x00,0xdf,0x00,0x0c,0x02,0x07,0x0a,0x51,0xff,0x15,0xf7,0xe0,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x03,0x95,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x47,0x0f,0x54,0x01,0x91,0xfe,0xe7,0x2d,0x51,0x2d,0x42,0xff,0xff,0xff,0xba, +0xfd,0xc9,0x04,0xad,0x03,0x5e,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x7f,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x3c,0x03,0x8a,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x31,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0xae,0x05,0xec,0x00,0x27,0x0f,0x50,0x02,0x59,0xfe,0xab,0x00,0x06, +0x0e,0x55,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x06,0x02,0x00,0x27,0x0f,0x50,0x00,0xf6,0xfe,0xab,0x00,0x06,0x0e,0x56,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x4b,0x06,0x02,0x00,0x27,0x0f,0x50,0x00,0x98,0xfe,0xab,0x00,0x06,0x08,0xed,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0x12,0x00,0x27, +0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x27,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0x00,0x06,0x0e,0x6e,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x00,0x27,0x0f,0x50,0x00,0xa1,0xfe,0xab,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0a,0x19,0x00,0x65,0xfc,0xe0,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x8d,0x05,0x3e,0x00,0x27, +0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x04,0x12,0x00,0x27,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0x00,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x05,0x3e,0x02,0x26, +0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x8d,0x05,0x3e,0x00,0x27,0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x04,0x39,0x02,0x26, +0x0e,0x6e,0x00,0x00,0x00,0x07,0x14,0x7c,0x03,0xc6,0xfb,0xaa,0x00,0x04,0xff,0xba,0xff,0xf2,0x03,0xf1,0x05,0x17,0x00,0x21,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x25,0x40,0x0c,0x4b,0x47,0x4a,0x49,0x34,0x22,0x3a,0x2d,0x2d,0x20,0x05,0x19,0xb8,0x04,0xfb,0xb1,0x06,0x12,0x00,0x2f,0x33,0xed,0x32,0x2f,0x33,0x2f,0xcd,0xde,0x32,0xde, +0x32,0xcd,0x32,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36, +0x37,0x37,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x48,0x07,0x20,0x44,0x3e,0x16,0x32,0x4a,0x37,0x27,0x0f,0x04,0x1a,0x41,0x46,0x47,0x21,0xfe,0x1b,0x23,0x23,0x23,0x23,0x01,0xef,0x1d,0x43,0x38,0x25,0x9c,0xfd,0x2d,0x06,0x09,0x0e,0x16,0x0c,0x1b,0x2b,0x43,0x35,0x39,0x4f,0x31,0x16,0x5e,0x2f,0x54,0x73,0x45,0x3d,0x4f,0x38,0x2a, +0x17,0x1e,0x17,0x0a,0x07,0x97,0x73,0x47,0x72,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x10,0x1f,0x2e,0x1e,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x01,0x5b,0x1a,0x3c,0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x31,0x2c,0xb4,0xb8,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25, +0x42,0x1f,0x3d,0x70,0x70,0x70,0x70,0x00,0x00,0x04,0xff,0xba,0xff,0xf2,0x03,0x48,0x05,0x17,0x00,0x14,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x21,0x40,0x0b,0x3e,0x3a,0x3d,0x3c,0x27,0x15,0x2d,0x20,0x20,0x14,0x0d,0xb9,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed,0x2f,0x33,0x2f,0xcd,0xde,0x32,0xde,0x32,0xcd,0x32,0x30,0x31,0x01,0x11,0x14, +0x0e,0x02,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x11,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x48,0x3d,0x63,0x80,0x43,0xfe,0x1b,0x23, +0x23,0x23,0x23,0x01,0xef,0x2e,0x47,0x30,0x18,0xfd,0xc9,0x06,0x09,0x0e,0x16,0x0c,0x1b,0x2b,0x43,0x35,0x39,0x4f,0x31,0x16,0x5e,0x2f,0x54,0x73,0x45,0x3d,0x4f,0x38,0x2a,0x17,0x1e,0x17,0x0a,0x07,0x97,0x73,0x47,0x72,0x03,0x0f,0xfe,0x3d,0x71,0x88,0x49,0x18,0x34,0x20,0x20,0x33,0x0f,0x2a,0x48,0x39,0x01,0xbc,0x01,0x5b,0x1a,0x3c, +0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x31,0x2c,0xb4,0xb8,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25,0x42,0x1f,0x3d,0x70,0x70,0x70,0x70,0x00,0x00,0x03,0xfe,0x84,0x06,0x71,0x01,0x76,0x08,0x8f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x1d,0x40,0x0c,0x24,0x27,0x27,0x29,0x2b,0x2b,0x00,0x18,0x11,0x11, +0x0b,0x18,0x00,0x2f,0x33,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0xfe,0xed,0x06,0x09,0x12,0x1a,0x10,0x22, +0x37,0x56,0x44,0x49,0x66,0x3f,0x1d,0x5e,0x38,0x65,0x8a,0x52,0x49,0x60,0x43,0x32,0x1b,0x24,0x1c,0x0a,0x07,0x01,0x46,0x73,0x73,0xb9,0x72,0x72,0x07,0xe2,0x1a,0x3c,0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x32,0x2b,0xef,0xf3,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25,0x42,0x1f,0x3d,0x70,0x70,0x70, +0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x5f,0x00,0x27,0x0a,0x1f,0x00,0xa5,0xfc,0xd3,0x00,0x06,0x0b,0x0c,0x00,0x00,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x06,0xae,0x04,0x24,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0x01,0xfd,0xd8,0x00,0x07,0x0a,0x1f,0x01,0xde,0xfb,0x98,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac, +0x05,0xb4,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x1f,0x00,0xa0,0xfd,0x28,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x74,0x05,0xb4,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x1f,0x00,0xa0,0xfd,0x28,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04, +0x03,0x62,0x02,0x06,0x0e,0xa5,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03, +0x02,0xb7,0x02,0x02,0x0e,0x70,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58, +0x01,0xc1,0x02,0x02,0x0e,0xcf,0x00,0x00,0x00,0x01,0x00,0xab,0x01,0xe1,0x01,0xac,0x02,0xe2,0x00,0x13,0x00,0x08,0xb1,0x0a,0x00,0x00,0x2f,0xcd,0x30,0x31,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x2d,0x17,0x2e,0x25,0x18,0x18,0x25,0x2e,0x17,0x16,0x2d,0x25,0x17,0x17,0x25,0x2d,0x01, +0xe1,0x17,0x25,0x2d,0x16,0x16,0x2f,0x25,0x18,0x18,0x25,0x2f,0x16,0x16,0x2d,0x25,0x17,0x00,0x00,0x01,0x00,0xd4,0x01,0x18,0x01,0x84,0x03,0xe5,0x00,0x0d,0x00,0x08,0xb1,0x06,0x00,0x00,0x2f,0x2f,0x30,0x31,0x01,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x01,0x43,0x11,0x18,0x10,0x08,0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5, +0x45,0x74,0x70,0x74,0x45,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x01,0x00,0x66,0x01,0x18,0x02,0x01,0x03,0xe5,0x00,0x0f,0x00,0x0a,0xb2,0x01,0x0e,0x07,0x00,0x2f,0x2f,0xcd,0x30,0x31,0x01,0x21,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x21,0x02,0x01,0xfe,0xf2,0x08,0x0d,0x09,0x05,0x6b,0x07,0x10,0x1b,0x13,0x01,0x9b, +0x03,0x5d,0x2b,0x51,0x53,0x59,0x32,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x01,0x00,0x1f,0x01,0x18,0x02,0x39,0x03,0xe5,0x00,0x37,0x00,0x14,0xb7,0x30,0x2b,0x25,0x06,0x16,0x1c,0x00,0x0d,0x00,0x2f,0x33,0x33,0xdc,0x32,0xcd,0x32,0x2f,0x30,0x31,0x13,0x16,0x16,0x17,0x16,0x32,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16, +0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x8e,0x0c,0x12,0x07,0x04,0x09,0x04,0x28,0x1f,0x12,0x0b,0x6b,0x0d,0x0d,0x04,0x02,0x08,0x0e,0x07,0x28,0x1f,0x12,0x0b,0x6b,0x0d,0x0d, +0x18,0x2b,0x3c,0x23,0x18,0x33,0x1d,0x13,0x2f,0x18,0x10,0x05,0x05,0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5,0x30,0x51,0x27,0x01,0x25,0x1b,0x19,0x38,0x18,0x20,0x37,0x1b,0x0e,0x19,0x0d,0x02,0x01,0x25,0x1b,0x19,0x38,0x18,0x21,0x35,0x1d,0x29,0x3f,0x2d,0x17,0x0b,0x0f,0x0d,0x0c,0x2d,0x5e,0x39,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00, +0x00,0x01,0x00,0x7f,0x01,0x0b,0x01,0xd8,0x03,0xfa,0x00,0x2e,0x00,0x0c,0xb3,0x14,0x13,0x2e,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37, +0x01,0xd8,0x23,0x3f,0x21,0x27,0x4d,0x3d,0x25,0x3b,0x46,0x43,0x38,0x1b,0x3e,0x66,0x4b,0x39,0x44,0x23,0x0b,0x21,0x35,0x44,0x24,0x3f,0x4a,0x25,0x0a,0x16,0x1f,0x25,0x0f,0x14,0x20,0x1e,0x20,0x13,0x01,0x20,0x0b,0x0a,0x10,0x23,0x37,0x28,0x2f,0x6c,0x44,0x20,0x42,0x33,0x22,0x41,0x3a,0x35,0x17,0x8d,0x11,0x1b,0x14,0x0e,0x04,0x0a, +0x1b,0x1c,0x1d,0x0d,0x1d,0x35,0x4b,0x32,0x1d,0x07,0x0e,0x0f,0x07,0x02,0x01,0x04,0x06,0x05,0x00,0x02,0x00,0x4f,0x01,0x60,0x02,0x08,0x03,0x99,0x00,0x13,0x00,0x27,0x00,0x0c,0xb3,0x14,0x0a,0x1e,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22, +0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x26,0x30,0x4f,0x39,0x1f,0x2c,0x42,0x4b,0x20,0x22,0x4f,0x43,0x2c,0x22,0x3c,0x53,0x30,0x11,0x26,0x20,0x16,0x12,0x1e,0x28,0x16,0x23,0x2d,0x1b,0x0a,0x18,0x24,0x29,0x01,0x60,0x1b,0x36,0x4f,0x35,0x54,0x84,0x5b,0x31,0x2b,0x54,0x7e,0x54,0x39,0x56,0x3b, +0x1e,0x01,0xb3,0x1f,0x38,0x4d,0x2e,0x1b,0x22,0x14,0x07,0x0f,0x19,0x1f,0x10,0x30,0x4e,0x37,0x1e,0x00,0x00,0x01,0x00,0x35,0x01,0x18,0x02,0x22,0x03,0xe5,0x00,0x12,0x00,0x0a,0xb2,0x12,0x07,0x0a,0x00,0x2f,0xcd,0x2f,0x30,0x31,0x01,0x2e,0x05,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x01,0xb2,0x10,0x16,0x10,0x09,0x06,0x04,0x02, +0xfe,0xce,0x01,0x99,0x03,0x02,0x04,0x07,0x0a,0x11,0x18,0x11,0x01,0x18,0x43,0x66,0x56,0x4d,0x55,0x63,0x41,0x88,0x63,0x46,0x6c,0x5b,0x53,0x5b,0x6a,0x45,0x00,0x01,0x00,0x1b,0x01,0x12,0x02,0x3c,0x03,0xe5,0x00,0x13,0x00,0x0c,0xb3,0x03,0x10,0x00,0x0a,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x36,0x36,0x37,0x33,0x0e,0x03,0x07, +0x23,0x2e,0x03,0x27,0x33,0x16,0x16,0x17,0x01,0x2d,0x22,0x4e,0x2d,0x72,0x23,0x3d,0x38,0x32,0x19,0x5c,0x1a,0x34,0x38,0x3b,0x21,0x72,0x2d,0x4e,0x22,0x01,0xe5,0x87,0xfc,0x7d,0x60,0xb6,0xb1,0xb1,0x5b,0x60,0xb4,0xb1,0xb1,0x5d,0x7d,0xfb,0x88,0x00,0x00,0x01,0x00,0x1b,0x01,0x18,0x02,0x3c,0x03,0xea,0x00,0x13,0x00,0x0c,0xb3,0x13, +0x09,0x10,0x03,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x06,0x06,0x07,0x23,0x3e,0x03,0x37,0x33,0x1e,0x03,0x17,0x23,0x26,0x26,0x27,0x01,0x2a,0x22,0x4e,0x2d,0x72,0x23,0x3d,0x37,0x33,0x19,0x5c,0x1a,0x34,0x38,0x3b,0x21,0x72,0x2d,0x4e,0x22,0x03,0x18,0x88,0xfb,0x7d,0x60,0xb5,0xb1,0xb1,0x5b,0x5f,0xb4,0xb1,0xb1,0x5d,0x7d,0xfa, +0x89,0x00,0x00,0x02,0x00,0x35,0x01,0x18,0x02,0x23,0x03,0xeb,0x00,0x1c,0x00,0x2d,0x00,0x0e,0xb4,0x1c,0x05,0x28,0x20,0x0f,0x00,0x2f,0xdd,0xde,0xcd,0x2f,0x30,0x31,0x01,0x26,0x26,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x17,0x03,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14, +0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x01,0xb2,0x28,0x20,0x08,0x38,0x36,0x27,0x45,0x35,0x1e,0x1c,0x33,0x47,0x2c,0x2a,0x47,0x1f,0x10,0x13,0x0c,0x07,0x04,0x03,0x0a,0x15,0x23,0x1d,0xdd,0x0e,0x2d,0x1f,0x13,0x1e,0x14,0x0b,0x38,0x29,0x14,0x2e,0x18,0x03,0x07,0x01,0x18,0x5b,0xa5,0x40,0x16,0x19,0x31,0x4a,0x32,0x2f,0x53,0x3d,0x24, +0x28,0x2e,0x1a,0x30,0x36,0x3e,0x26,0x26,0x53,0x63,0x75,0x48,0x02,0x04,0x22,0x28,0x10,0x19,0x20,0x0f,0x26,0x25,0x08,0x07,0x1a,0x1f,0x00,0x01,0x00,0x53,0x01,0x18,0x02,0x05,0x03,0xf1,0x00,0x2b,0x00,0x10,0xb5,0x24,0x1c,0x15,0x0b,0x00,0x05,0x00,0x2f,0x33,0xdd,0xde,0xcd,0x2f,0x30,0x31,0x13,0x17,0x17,0x36,0x36,0x33,0x32,0x16, +0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0xc2,0x12,0x03,0x1a,0x58,0x3f,0x0c,0x23,0x16,0x22,0x25,0x1d,0x38,0x2b,0x1b,0x14,0x1f,0x27,0x14,0x2d,0x58,0x27,0x1f,0x5b,0x30,0x18,0x2e,0x14,0x02,0x02,0x02, +0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5,0x52,0x01,0x2a,0x35,0x03,0x05,0x85,0x08,0x0a,0x13,0x1c,0x12,0x11,0x17,0x0f,0x07,0x1e,0x18,0x8a,0x14,0x1d,0x09,0x0b,0x01,0x1b,0x33,0x20,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x00,0x02,0x00,0x32,0x01,0x07,0x02,0x25,0x03,0xed,0x00,0x1a,0x00,0x35,0x00,0x12,0xb6,0x28,0x25,0x2c,0x03,0x17, +0x1b,0x0d,0x00,0x2f,0xcd,0x2f,0x33,0xdd,0x32,0xcc,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x33,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x29,0x14,0x34,0x1e,0x1a, +0x33,0x2a,0x1a,0x32,0x4c,0x58,0x27,0x26,0x57,0x49,0x30,0x1c,0x2c,0x36,0x1a,0x1d,0x32,0x12,0x04,0x15,0x32,0x2b,0x1c,0x08,0x0d,0x13,0x0b,0x17,0x18,0x02,0x5b,0x17,0x1b,0x0a,0x12,0x0e,0x08,0x1e,0x2d,0x34,0x01,0x4e,0x28,0x1f,0x17,0x3b,0x64,0x4e,0x6c,0xb1,0x7f,0x46,0x44,0x7b,0xae,0x69,0x50,0x69,0x3e,0x19,0x1f,0x28,0x02,0x1f, +0x35,0x5d,0x7f,0x4b,0x26,0x32,0x1d,0x0c,0x31,0x39,0x34,0x35,0x09,0x1b,0x31,0x27,0x4e,0x81,0x5d,0x34,0x00,0x01,0x00,0x59,0x01,0x03,0x01,0xff,0x03,0xec,0x00,0x27,0x00,0x19,0x40,0x0a,0x20,0x19,0x00,0x23,0x1f,0x1f,0x24,0x23,0x0f,0x08,0x00,0x2f,0xcd,0x2f,0x33,0x39,0x2f,0x12,0x39,0x33,0x33,0x30,0x31,0x01,0x26,0x26,0x35,0x34, +0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x27,0x36,0x36,0x37,0x01,0x18,0x48,0x46,0x24,0x3f,0x56,0x32,0x10,0x25,0x1a,0x1b,0x2a,0x12,0x18,0x2b,0x21,0x14,0x12,0x1c,0x25,0x14,0x12,0x1f,0x0f,0x14,0x2e,0x21,0x6a,0xc3,0x5a,0x1f, +0x28,0x62,0x36,0x02,0x70,0x13,0x59,0x45,0x31,0x4c,0x33,0x1b,0x03,0x04,0x88,0x04,0x04,0x07,0x12,0x1f,0x17,0x16,0x1e,0x13,0x09,0x06,0x05,0x0b,0x1a,0x10,0x9b,0x2e,0xb4,0x86,0x9c,0x3c,0x65,0x2d,0x00,0x01,0x00,0x2b,0x01,0x18,0x02,0x2d,0x03,0xec,0x00,0x28,0x00,0x0e,0xb4,0x09,0x0f,0x04,0x23,0x19,0x00,0x2f,0x2f,0x33,0xdd,0xcc, +0x30,0x31,0x01,0x36,0x36,0x37,0x33,0x0e,0x03,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x01,0x6c,0x0e,0x1e,0x13,0x82,0x1e,0x2b,0x21,0x18,0x0a,0x5b,0x09,0x19,0x20,0x27,0x16,0x17,0x13,0x09,0x03,0x08,0x08,0x6b,0x0b,0x0d,0x0b, +0x4c,0x3e,0x22,0x38,0x2c,0x22,0x0c,0x03,0x71,0x21,0x37,0x1c,0x2a,0x48,0x45,0x45,0x26,0x22,0x3c,0x2b,0x19,0x17,0x12,0x11,0x2c,0x14,0x2d,0x7c,0x58,0xd2,0xce,0x60,0x7a,0x51,0x36,0x1b,0x45,0x45,0x15,0x23,0x2c,0x17,0x00,0x01,0x00,0x4d,0x01,0x12,0x02,0x0a,0x03,0xe5,0x00,0x0e,0x00,0x0c,0xb3,0x09,0x05,0x07,0x00,0x00,0x2f,0x2f, +0xcd,0x32,0x30,0x31,0x01,0x0e,0x03,0x07,0x21,0x15,0x21,0x35,0x3e,0x03,0x37,0x01,0x5d,0x06,0x15,0x1e,0x26,0x18,0x01,0x24,0xfe,0x43,0x25,0x39,0x29,0x19,0x06,0x03,0xe5,0x79,0xb1,0x87,0x69,0x31,0x88,0x47,0x43,0x7f,0x94,0xb9,0x7d,0x00,0x00,0x06,0x00,0xa1,0xff,0xf2,0x0b,0x4d,0x08,0x36,0x00,0x64,0x00,0x78,0x00,0x86,0x00,0xb4, +0x00,0xb8,0x00,0xbc,0x00,0x54,0x40,0x0b,0xb8,0xb6,0xa0,0x87,0x94,0x9a,0x8d,0xa6,0xad,0x4d,0x34,0xb8,0x04,0xfb,0x40,0x0f,0x3e,0x82,0x40,0x7e,0x82,0x7e,0x82,0x40,0x40,0x5a,0x4d,0x76,0x53,0x46,0x61,0xb8,0x04,0xfb,0xb5,0x2c,0x25,0x1a,0xbc,0xba,0x6c,0xb9,0x04,0xfb,0x00,0x0a,0x00,0x2f,0xed,0xde,0xcd,0x2f,0x33,0x33,0xed,0x32, +0x32,0x32,0x2f,0x33,0x33,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0xed,0x10,0xde,0x32,0xdd,0x32,0xdc,0x32,0x32,0xde,0xcd,0x30,0x31,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x07,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27, +0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x25,0x14,0x1e,0x02,0x33, +0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x34,0x27,0x33,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x25,0x23,0x11,0x33,0x01,0x23,0x35,0x33,0x09,0xa8,0x4a,0x61,0x38, +0x16,0x31,0x55,0x75,0x44,0x48,0x79,0x36,0x14,0x26,0x1d,0x11,0x39,0x61,0x82,0x90,0x98,0x47,0x8d,0x3b,0x5c,0x46,0x34,0x13,0x04,0x19,0x40,0x49,0x4f,0x28,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1c,0x41,0x36,0x24,0x9c,0x0c, +0x26,0x46,0x39,0x25,0x42,0x31,0x1c,0x9c,0x20,0x3c,0x57,0x38,0x96,0x30,0x75,0x36,0x01,0x0a,0x10,0x1b,0x27,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1c,0x19,0x43,0x73,0x5a,0x21,0x1e,0xf6,0x87,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x02,0xf8,0x03,0x01,0x26,0x2d,0x2d,0x22,0x01,0x5f,0x01,0x22,0x2d,0x30,0x24,0x03,0x5f, +0x01,0x01,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x03,0x01,0x6b,0x74,0x74,0x04,0xfb,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x57,0x21,0x4a,0x52,0x5a,0x30,0x60,0x82,0x53,0x2d,0x15,0x06,0x02,0x11,0x20,0x2e,0x1c,0x23,0x2f,0x1d,0x0c,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a, +0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xa4,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfc,0x0d,0x45,0x5c,0x39,0x18,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x43,0x49,0x2a,0x18,0x4d,0xab,0x26, +0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x04,0x80,0x1c,0x18,0x09,0x33,0x3f,0x3d,0x3c,0x0d,0x1c,0x0d,0x0e,0x1c,0x0b,0x3d,0x3d,0x3e,0x37,0x1f,0x1b,0x0c,0x18,0x08,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x21,0x18,0x53,0x01,0x56,0xfc,0x39,0xb5,0x00,0x00,0x04,0x00,0xa1,0xff,0xf2,0x0b,0x4d,0x05,0x7e, +0x00,0x64,0x00,0x78,0x00,0x86,0x00,0x8a,0x00,0x3b,0xb9,0x00,0x34,0x04,0xfb,0x40,0x0d,0x82,0x3e,0x40,0x7e,0x7e,0x40,0x40,0x5a,0x4d,0x76,0x53,0x46,0x60,0xb8,0x04,0xfb,0xb5,0x2c,0x25,0x19,0x8a,0x88,0x6c,0xb9,0x04,0xfb,0x00,0x0a,0x00,0x2f,0xed,0xde,0xcd,0x2f,0x33,0x33,0xed,0x32,0x32,0x32,0x2f,0x33,0x33,0x2f,0x39,0x2f,0x12, +0x39,0x39,0xed,0x30,0x31,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x07,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02, +0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x25,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x23,0x35,0x33,0x09,0xa8,0x4a,0x61,0x38,0x16,0x31,0x55,0x75,0x44,0x48, +0x79,0x36,0x14,0x26,0x1d,0x11,0x39,0x61,0x82,0x90,0x98,0x47,0x8d,0x3b,0x5c,0x46,0x34,0x13,0x04,0x19,0x40,0x49,0x4f,0x28,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1c,0x41,0x36,0x24,0x9c,0x0c,0x26,0x46,0x39,0x25,0x42,0x31, +0x1c,0x9c,0x20,0x3c,0x57,0x38,0x96,0x30,0x75,0x36,0x01,0x0a,0x10,0x1b,0x27,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1c,0x19,0x43,0x73,0x5a,0x21,0x1e,0xf6,0x87,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x08,0xfe,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x57,0x21,0x4a,0x52,0x5a,0x30,0x60,0x82, +0x53,0x2d,0x15,0x06,0x02,0x11,0x20,0x2e,0x1c,0x23,0x2f,0x1d,0x0c,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xa4,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfc,0x0d,0x45,0x5c,0x39,0x18,0x01, +0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x43,0x49,0x2a,0x18,0x4d,0xab,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x02,0x62,0xb5,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x00,0x0e,0x00,0x0c,0xba,0x00,0x0e,0x04,0xfb,0x00,0x01,0x00,0x2f,0xed,0x30,0x31,0x05,0x21, +0x22,0x2e,0x02,0x27,0x27,0x37,0x1e,0x03,0x33,0x21,0x08,0xfe,0xf9,0xb1,0x4b,0x99,0x8f,0x7d,0x2e,0x1e,0x05,0x36,0x8d,0x9f,0xa9,0x50,0x06,0x2b,0x0e,0x07,0x0f,0x15,0x0e,0x91,0x05,0x0a,0x0f,0x0a,0x05,0x00,0x00,0x01,0x00,0x00,0xff,0xf2,0x05,0x2f,0x00,0x99,0x00,0x07,0x00,0x0c,0xba,0x00,0x00,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed, +0x30,0x31,0x35,0x21,0x17,0x07,0x06,0x06,0x23,0x21,0x05,0x2a,0x05,0x1a,0x56,0xb9,0x6e,0xfc,0x68,0x99,0x05,0x84,0x0d,0x11,0x00,0x01,0x00,0x00,0xff,0xf2,0x05,0x2f,0x00,0x99,0x00,0x07,0x00,0x0c,0xba,0x00,0x00,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed,0x30,0x31,0x35,0x21,0x17,0x07,0x06,0x06,0x23,0x21,0x05,0x2a,0x05,0x1a,0x56,0xb9, +0x6e,0xfc,0x68,0x99,0x05,0x84,0x0d,0x11,0xff,0xff,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x02,0x06,0x14,0x99,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x02,0x06,0x14,0x99,0x00,0x00,0x00,0x01,0x00,0xf2,0x02,0x84,0x02,0x5a,0x03,0xed,0x00,0x13,0x00,0x08,0xb1,0x0a,0x00,0x00,0x2f,0xcd,0x30,0x31,0x01,0x22, +0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xa8,0x20,0x40,0x35,0x21,0x21,0x35,0x40,0x20,0x1f,0x40,0x33,0x20,0x20,0x33,0x40,0x02,0x84,0x20,0x34,0x3f,0x20,0x1f,0x41,0x34,0x22,0x21,0x35,0x41,0x1f,0x20,0x3f,0x34,0x20,0x00,0x00,0x01,0x01,0x2f,0x01,0x4a,0x02,0x1d,0x05,0x7d,0x00,0x0d,0x00,0x08, +0xb1,0x06,0x00,0x00,0x2f,0x2f,0x30,0x31,0x01,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x01,0xb7,0x19,0x27,0x19,0x0d,0x84,0x0c,0x19,0x29,0x1c,0x05,0x7d,0x6c,0xb4,0xb1,0xbc,0x73,0xfe,0xcd,0x01,0x2d,0x67,0xb5,0xb5,0xc1,0x74,0x00,0x01,0x00,0x76,0x01,0x4a,0x02,0xd6,0x05,0x7d,0x00,0x0f,0x00,0x0a,0xb2,0x01,0x0f,0x08, +0x00,0x2f,0x2f,0xcd,0x30,0x31,0x01,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x02,0xd6,0xfe,0x4a,0x10,0x19,0x12,0x09,0x84,0x0c,0x19,0x29,0x1c,0x05,0x7d,0x97,0x4f,0x9b,0xa0,0xa9,0x5d,0xfe,0xf4,0x01,0x06,0x75,0xc5,0xbc,0xc3,0x74,0x00,0x00,0x01,0x00,0x25,0x01,0x4a,0x03,0x28,0x05,0x7d,0x00,0x3c,0x00,0x14, +0xb7,0x35,0x2c,0x26,0x06,0x15,0x1d,0x00,0x0f,0x00,0x2f,0x33,0x33,0xdc,0x32,0xcd,0x32,0x2f,0x30,0x31,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26, +0x27,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0xac,0x11,0x1b,0x0b,0x0c,0x17,0x0b,0x1f,0x2c,0x1b,0x0c,0x12,0x0f,0x84,0x1f,0x12,0x24,0x1e,0x1f,0x2c,0x1b,0x0c,0x12,0x0f,0x84,0x0e,0x10,0x1d,0x39,0x54,0x37,0x23,0x4c,0x2d,0x1b,0x42,0x25,0x0c,0x19,0x0d,0x06,0x0a,0x07,0x04,0x83,0x10,0x1c,0x27,0x17,0x05,0x7d,0x45,0x79, +0x3a,0x03,0x02,0x13,0x21,0x2b,0x19,0x21,0x44,0x20,0x4b,0x45,0x36,0x2d,0x0a,0x13,0x21,0x2b,0x19,0x21,0x44,0x20,0x21,0x52,0x27,0x2c,0x51,0x3e,0x24,0x11,0x16,0x14,0x12,0x02,0x02,0x28,0x53,0x62,0x77,0x4c,0xfe,0xe1,0x01,0x1a,0x6c,0xcb,0xc4,0xbf,0x5f,0x00,0x00,0x01,0x00,0xab,0x01,0x38,0x02,0xa1,0x05,0x97,0x00,0x2f,0x00,0x0c, +0xb3,0x25,0x24,0x0a,0x10,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x02,0x3f,0x5f,0x6c,0x36,0x0e,0x25,0x36,0x3d,0x18,0x39,0x58,0x30,0x62,0x65, +0x37,0x6d,0x56,0x35,0x15,0x30,0x50,0x3c,0x39,0x4d,0x2e,0x14,0x24,0x55,0x8e,0x6b,0x56,0x66,0x34,0x0f,0x20,0x43,0x6a,0x4b,0x03,0x91,0x55,0x7b,0x56,0x33,0x0c,0x1c,0x22,0x12,0x06,0x0c,0x0d,0x96,0x21,0x17,0x31,0x4e,0x38,0x20,0x4d,0x5b,0x68,0x3a,0x1b,0x31,0x34,0x39,0x22,0x2d,0x58,0x55,0x4f,0x23,0x9f,0x1a,0x31,0x29,0x21,0x0a, +0x11,0x22,0x28,0x33,0x22,0x00,0x00,0x02,0x00,0x62,0x01,0xbc,0x02,0xeb,0x04,0xf3,0x00,0x13,0x00,0x27,0x00,0x0c,0xb3,0x1e,0x0a,0x14,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34, +0x2e,0x02,0x01,0xa1,0x35,0x74,0x62,0x3f,0x2f,0x57,0x7c,0x4c,0x4a,0x75,0x51,0x2b,0x40,0x60,0x6f,0x2e,0x1c,0x41,0x37,0x25,0x1e,0x33,0x43,0x26,0x36,0x4c,0x30,0x15,0x29,0x3d,0x46,0x04,0xf3,0x40,0x7c,0xb8,0x78,0x4d,0x7a,0x56,0x2e,0x29,0x4e,0x70,0x47,0x78,0xc1,0x87,0x49,0x94,0x35,0x5e,0x84,0x4f,0x2e,0x3f,0x26,0x11,0x18,0x2c, +0x3c,0x23,0x54,0x85,0x5d,0x31,0x00,0x01,0x00,0x42,0x01,0x4a,0x03,0x0a,0x05,0x7d,0x00,0x13,0x00,0x0a,0xb2,0x13,0x08,0x0a,0x00,0x2f,0xcd,0x2f,0x30,0x31,0x01,0x2e,0x05,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x02,0x80,0x17,0x21,0x17,0x0e,0x0a,0x06,0x03,0x03,0xfe,0x35,0x02,0x4a,0x05,0x03,0x07,0x0a,0x0f,0x19,0x23,0x1a, +0x01,0x4a,0x60,0x96,0x7e,0x70,0x79,0x8a,0x59,0x5c,0x97,0x94,0x68,0xa1,0x89,0x7d,0x88,0xa1,0x67,0x00,0x00,0x01,0x00,0x1c,0x01,0x47,0x03,0x30,0x05,0x7d,0x00,0x13,0x00,0x0c,0xb3,0x03,0x0e,0x07,0x00,0x00,0x2f,0x32,0x2f,0x33,0x30,0x31,0x13,0x16,0x12,0x17,0x33,0x36,0x12,0x37,0x33,0x06,0x0a,0x02,0x07,0x23,0x26,0x0a,0x02,0x27, +0xa5,0x49,0x7d,0x39,0x04,0x3a,0x7d,0x49,0x88,0x32,0x59,0x53,0x4c,0x24,0x78,0x27,0x4e,0x53,0x57,0x2f,0x05,0x7d,0xc7,0xfe,0x64,0xdf,0xdf,0x01,0x9d,0xc6,0x89,0xfe,0xf5,0xfe,0xf5,0xfe,0xf3,0x8a,0x91,0x01,0x12,0x01,0x0b,0x01,0x05,0x83,0x00,0x01,0x00,0x1d,0x01,0x4a,0x03,0x30,0x05,0x80,0x00,0x13,0x00,0x0c,0xb3,0x03,0x0d,0x00, +0x07,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x26,0x02,0x27,0x23,0x06,0x02,0x07,0x23,0x36,0x1a,0x02,0x37,0x33,0x16,0x1a,0x02,0x17,0x02,0xa8,0x4a,0x7d,0x38,0x05,0x39,0x7e,0x48,0x88,0x31,0x59,0x52,0x4d,0x25,0x78,0x26,0x4e,0x53,0x57,0x2f,0x01,0x4a,0xc7,0x01,0x9b,0xe0,0xe0,0xfe,0x64,0xc6,0x88,0x01,0x0b,0x01,0x0b,0x01,0x0e, +0x8a,0x90,0xfe,0xed,0xfe,0xf6,0xfe,0xfa,0x83,0x00,0x00,0x02,0x00,0x3c,0x01,0x4a,0x03,0x10,0x05,0x87,0x00,0x1e,0x00,0x33,0x00,0x10,0xb5,0x07,0x31,0x31,0x1e,0x27,0x11,0x00,0x2f,0xcd,0x2f,0x39,0x2f,0xcd,0x30,0x31,0x01,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03, +0x17,0x01,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x02,0x88,0x1f,0x28,0x1b,0x10,0x06,0x5d,0x55,0x3b,0x6a,0x4f,0x2e,0x27,0x4a,0x6a,0x43,0x41,0x6a,0x2d,0x18,0x1d,0x11,0x09,0x05,0x05,0x0f,0x1e,0x31,0x27,0xfe,0xf3,0x03,0x05,0x07,0x09,0x07,0x19,0x4d,0x33,0x1f,0x35,0x26,0x15,0x1c,0x30, +0x42,0x27,0x22,0x4a,0x01,0x4a,0x47,0x8a,0x81,0x77,0x34,0x29,0x26,0x4a,0x6c,0x46,0x3f,0x76,0x5b,0x37,0x3b,0x47,0x26,0x4b,0x51,0x5c,0x38,0x3b,0x85,0x97,0xab,0x63,0x02,0x86,0x1b,0x2b,0x25,0x21,0x11,0x3d,0x44,0x1b,0x2d,0x3b,0x20,0x25,0x3a,0x27,0x14,0x10,0x00,0x01,0x00,0x69,0x01,0x4a,0x02,0xe4,0x05,0x92,0x00,0x31,0x00,0x12, +0xb6,0x22,0x17,0x17,0x2a,0x0d,0x00,0x07,0x00,0x2f,0x33,0xcd,0x2f,0x39,0x2f,0xcd,0x30,0x31,0x13,0x17,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x26,0x27,0x07,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0xf0,0x21,0x04,0x0d, +0x32,0x46,0x59,0x35,0x16,0x36,0x1d,0x33,0x36,0x30,0x58,0x42,0x28,0x1e,0x31,0x3c,0x1e,0x24,0x48,0x43,0x3d,0x19,0x12,0x37,0x45,0x4d,0x27,0x2a,0x53,0x1d,0x03,0x0a,0x07,0x83,0x0b,0x19,0x28,0x1e,0x05,0x7d,0x92,0x21,0x3d,0x2e,0x1b,0x05,0x08,0x95,0x0c,0x12,0x22,0x30,0x1d,0x1a,0x25,0x18,0x0b,0x0e,0x17,0x1e,0x10,0x9a,0x0e,0x1c, +0x16,0x0f,0x14,0x17,0x02,0x48,0xac,0x53,0xfe,0xe5,0x01,0x16,0x6a,0xba,0xba,0xc8,0x77,0x00,0x00,0x02,0x00,0x3c,0x01,0x36,0x03,0x10,0x05,0x81,0x00,0x1e,0x00,0x3c,0x00,0x12,0xb6,0x3c,0x3a,0x24,0x03,0x1b,0x30,0x0f,0x00,0x2f,0xcd,0x2f,0x33,0xdd,0x32,0xcc,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33, +0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x01,0xa3,0x20,0x4c,0x2e,0x25,0x49,0x3b,0x24,0x22,0x38,0x4b,0x52,0x53,0x26,0x25,0x51,0x4f,0x48,0x37,0x20,0x27,0x3d,0x4d,0x26,0x2c,0x49,0x1c,0x36,0x0a, +0x15,0x21,0x16,0x23,0x25,0x10,0x02,0x16,0x25,0x30,0x35,0x35,0x18,0x23,0x50,0x44,0x2c,0x0e,0x18,0x21,0x13,0x50,0x06,0x01,0xa3,0x3c,0x31,0x22,0x55,0x91,0x70,0x6b,0xbe,0xa1,0x80,0x59,0x30,0x2e,0x57,0x7d,0x9c,0xba,0x68,0x74,0x98,0x5a,0x25,0x31,0x3c,0xcb,0x1f,0x37,0x29,0x18,0x33,0x47,0x48,0x15,0x53,0x96,0x81,0x68,0x49,0x28, +0x59,0x9a,0xd2,0x78,0x41,0x57,0x34,0x16,0x9c,0x00,0x00,0x01,0x00,0x6f,0x01,0x3a,0x02,0xdd,0x05,0x86,0x00,0x25,0x00,0x1b,0x40,0x0c,0x20,0x00,0x07,0x03,0x03,0x25,0x25,0x03,0x16,0x10,0x04,0x03,0x00,0x2f,0x33,0x2f,0xcd,0x11,0x39,0x2f,0x12,0x17,0x39,0x30,0x31,0x01,0x06,0x00,0x07,0x27,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34, +0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x36,0x36,0x37,0x02,0xdd,0xa7,0xfe,0xde,0x83,0x22,0x43,0xa6,0x5e,0x01,0x6e,0x76,0x30,0x57,0x79,0x4a,0x2d,0x3e,0x1d,0x3b,0x1a,0x27,0x46,0x33,0x1e,0x19,0x2c,0x3b,0x21,0x34,0x35,0x1d,0x3c,0x24,0x03,0x78,0x4e,0xfe,0xe3,0xd3,0xaf, +0x6d,0xbe,0x4c,0x03,0x16,0x88,0x69,0x42,0x69,0x4a,0x27,0x09,0x99,0x05,0x05,0x0f,0x22,0x37,0x28,0x25,0x36,0x24,0x11,0x13,0x11,0x22,0x12,0x00,0x00,0x01,0x00,0x41,0x01,0x4a,0x03,0x0b,0x05,0x88,0x00,0x29,0x00,0x0e,0xb4,0x04,0x09,0x29,0x20,0x16,0x00,0x2f,0x2f,0x33,0xdd,0xce,0x30,0x31,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23, +0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x03,0x0b,0x42,0x54,0x1c,0x7a,0x0d,0x29,0x35,0x40,0x25,0x15,0x1a,0x0f,0x06,0x08,0x0c,0x0d,0x0c,0x08,0x83,0x13,0x16,0x13,0x67,0x5e,0x34,0x56,0x44,0x30,0x0e,0x04,0x14,0x30,0x1d,0x05,0x7d,0x61, +0xc2,0x71,0x36,0x60,0x46,0x29,0x0b,0x13,0x19,0x0d,0x11,0x2b,0x3b,0x52,0x73,0x99,0x65,0xfe,0xda,0x01,0x10,0x93,0xd0,0x8e,0x5b,0x1e,0x5b,0x69,0x29,0x3f,0x4e,0x25,0x3c,0x65,0x2f,0x00,0x00,0x01,0x00,0x6b,0x01,0x47,0x02,0xe1,0x05,0x7d,0x00,0x12,0x00,0x0c,0xb3,0x00,0x0f,0x11,0x08,0x00,0x2f,0x2f,0xcd,0x32,0x30,0x31,0x13,0x3e, +0x05,0x37,0x33,0x0e,0x05,0x07,0x21,0x15,0x21,0x6b,0x25,0x3f,0x33,0x28,0x1e,0x13,0x05,0x83,0x06,0x12,0x19,0x21,0x27,0x2f,0x1a,0x01,0xc0,0xfd,0x8a,0x01,0x8b,0x45,0x83,0x89,0x98,0xb2,0xd5,0x82,0x82,0xd1,0xaa,0x8a,0x77,0x6b,0x36,0x97,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0x5f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07, +0x0a,0x1f,0x01,0x09,0xfc,0xd3,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x05,0x74,0x04,0x24,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x27,0x0a,0x1f,0x02,0x00,0xfb,0x98,0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0x00,0x01,0x00,0x55,0xff,0xe8,0x04,0x79,0x05,0x9a,0x00,0x2d,0x00,0x14,0x40,0x09,0x0e,0x0e,0x05,0x24,0x03,0x16,0x91,0x05,0x13,0x00, +0x3f,0xed,0x3f,0x12,0x39,0x2f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x1e,0x03,0x04,0x79,0x4e,0x8f,0xc7,0x78,0x78,0xc1,0x87,0x48,0x0c,0x10,0xb4,0x0e,0x12,0x2c,0x58,0x83,0x58,0xb1, +0xb4,0x1e,0x35,0x49,0x2b,0x2f,0x57,0x44,0x2c,0x04,0xa8,0x03,0x22,0x38,0x4c,0x2e,0x2b,0x57,0x45,0x2b,0x01,0xdc,0x7b,0xbb,0x7e,0x40,0x43,0x75,0x9e,0x5b,0x27,0x52,0x2a,0x21,0x50,0x33,0x3e,0x67,0x4b,0x29,0xa9,0xae,0x40,0x6f,0x62,0x56,0x28,0x2c,0x67,0x85,0xab,0x72,0x60,0x89,0x69,0x57,0x2e,0x2c,0x60,0x74,0x8e,0x00,0x00,0x02, +0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0x9a,0x00,0x2f,0x00,0x41,0x00,0x1c,0x40,0x0e,0x3d,0x91,0x26,0x13,0x12,0x00,0x10,0x03,0x03,0x1c,0x35,0x91,0x00,0x10,0x00,0x3f,0xed,0x39,0x39,0x3f,0x12,0x39,0x3f,0xed,0x30,0x31,0x01,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x06,0x35,0x35,0x33,0x15,0x14,0x1e,0x04,0x15,0x14,0x06,0x07,0x1e, +0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x9f,0x0e,0x1b,0x0e,0x01,0x01,0x20,0x35,0x44,0x46,0x44,0x35,0x20,0xa4,0x38,0x55,0x62,0x55,0x38,0x04,0x02,0x4d,0x74,0x4d,0x26,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88, +0xcf,0x01,0xec,0x33,0x5b,0x80,0x4c,0xb8,0xc4,0x32,0x5f,0x89,0x58,0x58,0x85,0x5a,0x2d,0x04,0x17,0x01,0x01,0x05,0x0a,0x05,0x18,0x1e,0x16,0x11,0x17,0x20,0x34,0x4b,0x36,0x28,0x28,0x1f,0x23,0x1d,0x1d,0x33,0x4f,0x40,0x0b,0x27,0x0f,0x1c,0x60,0x80,0x9c,0x57,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0xfd,0xe7, +0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0x34,0x62,0x8f,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0xae,0x00,0x2f,0x00,0x41,0x00,0x21,0x40,0x11,0x3d,0x91,0x26,0x13,0x10,0x10,0x00,0x0b,0x91,0x16,0x04,0x03,0x1e,0x35,0x91,0x00,0x10,0x00,0x3f,0xed,0x39,0x39,0x3f,0xed,0x12,0x39,0x2f,0x3f,0xed,0x30,0x31,0x01, +0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x9f,0x26,0x46,0x21,0x07,0x08,0x1a,0x2f, +0x40,0x27,0x2f,0x47,0x2f,0x17,0xaf,0x35,0x60,0x86,0x50,0x51,0x82,0x5b,0x32,0x14,0x0c,0x73,0x70,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88,0xcf,0x01,0xec,0x33,0x5b,0x80,0x4c,0xb8,0xc4,0x32,0x5f,0x89,0x58,0x58,0x85,0x5a,0x2d,0x04,0x17,0x07,0x07,0x17,0x35,0x22,0x29,0x3d,0x28,0x13,0x17,0x27,0x36,0x1f,0x43,0x6e,0x4e, +0x2a,0x2a,0x50,0x71,0x46,0x39,0x58,0x1f,0x45,0xed,0x97,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0xfd,0xe7,0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0x34,0x62,0x8f,0x00,0x02,0x00,0x82,0xff,0xe0,0x06,0xac,0x05,0xaf,0x00,0x42,0x00,0x52,0x00,0x34,0x40,0x1b,0x1f,0x2e,0x2a,0x92,0x33,0x50,0x91,0x0a, +0x33,0x0a,0x33,0x0a,0x25,0x15,0x91,0x3d,0x04,0x24,0x25,0x13,0x12,0x40,0x40,0x48,0x91,0x00,0x04,0x00,0x3f,0xed,0x39,0x11,0x33,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x39,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02, +0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x17,0x07,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x3e,0x03,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xdf,0x6a,0xab,0x78,0x40,0x40,0x78,0xab,0x6a,0x6a,0xb1,0x7f,0x47,0x29,0x26,0x38,0x6d,0x31, +0x4e,0x79,0x53,0x2b,0x59,0x94,0xc0,0x67,0x57,0xa4,0x9b,0x91,0x45,0x5d,0x44,0xbb,0xd2,0xda,0x63,0x78,0xc1,0x3c,0x1b,0x46,0x4d,0x50,0x25,0x52,0x89,0x62,0x36,0x48,0x85,0xbb,0x73,0x55,0x9a,0x47,0x3e,0x97,0x01,0x74,0x21,0x46,0x6c,0x4a,0x4b,0x72,0x4d,0x27,0x9b,0x96,0x95,0x88,0x05,0xaf,0x42,0x7d,0xb6,0x75,0x75,0xb6,0x7d,0x40, +0x41,0x7e,0xb6,0x75,0x56,0x90,0x39,0x22,0x11,0x38,0x67,0x93,0x5a,0x82,0xb6,0x7f,0x54,0x20,0x1b,0x35,0x3e,0x4a,0x2f,0x7b,0x33,0x5b,0x45,0x28,0x23,0x1b,0x9c,0x0a,0x11,0x0d,0x08,0x02,0x22,0x68,0x8a,0xab,0x66,0x7e,0xca,0x8c,0x4b,0x25,0x37,0x2d,0x2f,0xfe,0x16,0x52,0x7e,0x57,0x2d,0x32,0x5a,0x7c,0x4a,0xa5,0xaf,0xad,0x00,0x01, +0x00,0x64,0xff,0xe8,0x04,0x87,0x05,0xb2,0x00,0x31,0x00,0x1b,0x40,0x0d,0x26,0x0e,0x26,0x0e,0x05,0x21,0x91,0x2c,0x04,0x16,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11, +0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x04,0x87,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x2d,0x51,0x72,0x44,0x42,0x6c,0x4b,0x29,0xb0,0x48,0x7e,0xaa,0x62,0x62,0xae,0x81,0x4b,0x01,0xda,0x71,0xb7,0x83,0x47,0x44, +0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x02,0x27,0x44,0x68,0x47,0x25,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x35,0x66,0x96,0x61,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0xb2,0x00,0x41,0x00,0x22,0x40,0x11,0x3d,0x1f,0x2d,0x22,0x91,0x0d,0x1f,0x1f,0x05,0x2a,0x91,0x33, +0x04,0x15,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xce,0xfd,0xce,0x12,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x3e,0x02, +0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x04,0x93,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x52,0x6b,0x3f,0x1a,0x7f,0x82,0x79,0x8c,0xb0,0x40,0x75,0xa5,0x65,0x5c,0x9b,0x71,0x3f,0x21,0x3f,0x5d,0x3c,0x43,0x76,0x59,0x33, +0x01,0xb2,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x60,0x6b,0x68,0x6b,0x5c,0x88,0x5a,0x2c,0x31,0x5c,0x81,0x50,0x3b,0x66,0x4e,0x34,0x09,0x08,0x3c,0x61,0x83,0x00,0x00,0x03,0x00,0x28,0xff,0xe8,0x05,0xfe,0x05,0xb2, +0x00,0x27,0x00,0x37,0x00,0x45,0x00,0x24,0x40,0x13,0x1e,0x3b,0x91,0x23,0x10,0x0b,0x33,0x91,0x10,0x10,0x05,0x2b,0x91,0x1a,0x04,0x43,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x3f,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02, +0x33,0x32,0x16,0x15,0x15,0x3e,0x03,0x33,0x32,0x1e,0x02,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x01,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xfe,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0x0d,0x28,0x2e,0x34,0x19,0x41,0x70,0x53,0x30,0x2f,0x56,0x79,0x49,0x9e,0xa1,0x21, +0x53,0x5d,0x63,0x31,0x6e,0xb5,0x81,0x47,0xfc,0x0e,0x58,0x45,0x45,0x58,0x18,0x2a,0x39,0x21,0x21,0x3a,0x2a,0x19,0x03,0x40,0xa8,0x9d,0x4f,0x80,0x5a,0x30,0xaa,0xaf,0xa5,0xa0,0x02,0x16,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x01,0x70,0x0d,0x16,0x0f,0x09,0x2a,0x51,0x73,0x4a,0x4a,0x76,0x53,0x2c,0x9b,0x9c,0xf7,0x29,0x38,0x22, +0x0f,0x42,0x82,0xbf,0x01,0xe2,0x54,0x52,0x52,0x54,0x2c,0x3e,0x28,0x12,0x12,0x28,0x3e,0xfd,0xc7,0xbf,0xb1,0x2d,0x5b,0x8c,0x60,0xc4,0xca,0xcb,0x00,0x02,0x00,0x82,0xff,0xe8,0x07,0x4c,0x05,0xb2,0x00,0x28,0x00,0x36,0x00,0x20,0x40,0x11,0x10,0x23,0x23,0x0e,0x91,0x26,0x04,0x2c,0x91,0x21,0x04,0x34,0x91,0x17,0x13,0x06,0x12,0x00, +0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x39,0x11,0x33,0x30,0x31,0x01,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x10,0x02,0x23,0x22,0x07,0x16,0x11,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x00,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x1e,0x02,0x33,0x32,0x12,0x07, +0x4c,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0xae,0xb4,0x91,0x58,0x61,0x4a,0x8b,0xca,0x7f,0x73,0xc3,0x8d,0x4f,0x4c,0x8e,0xce,0x82,0xc6,0x7d,0x44,0xac,0x67,0xf9,0x01,0x0d,0xfc,0xb6,0xae,0xb4,0xb2,0xbc,0x32,0x5e,0x88,0x56,0xac,0xb6,0x02,0xc0,0x80,0xd2,0xab,0x8a,0x39,0x3a,0x9c,0xb8,0xcd,0x6b,0x01,0x2a,0x01,0x2c,0x60, +0xb7,0xfe,0xc7,0xba,0xfe,0xea,0xb8,0x5c,0x53,0xaf,0x01,0x12,0xc0,0xc0,0x01,0x1c,0xbd,0x5d,0x75,0x3c,0x39,0xfe,0x89,0xfe,0x8b,0x01,0x2a,0x01,0x2b,0xfe,0xd4,0xfe,0xd3,0x97,0xda,0x8e,0x44,0x01,0x1f,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x04,0xb2,0x05,0xb2,0x00,0x24,0x00,0x0f,0xb6,0x0b,0x1a,0x12,0x12,0x91,0x00,0x04,0x00,0x3f, +0xed,0x3f,0x33,0x30,0x31,0x01,0x32,0x16,0x16,0x12,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x10,0x21,0x22,0x02,0x11,0x14,0x1e,0x02,0x17,0x23,0x2e,0x03,0x35,0x34,0x12,0x36,0x36,0x02,0xa7,0x7c,0xc3,0x86,0x46,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0xfe,0x9c,0xb4,0xb8,0x1e,0x34,0x49,0x2b,0xc9,0x20,0x3e,0x31,0x1e, +0x4b,0x8e,0xcb,0x05,0xb2,0x5e,0xbc,0xfe,0xe5,0xbd,0x80,0xd2,0xab,0x8a,0x39,0x3a,0x9c,0xb6,0xc9,0x67,0x02,0x60,0xfe,0xd4,0xfe,0xd6,0x6b,0xcd,0xb8,0x9c,0x3a,0x39,0x8a,0xab,0xd2,0x80,0xbd,0x01,0x1b,0xbc,0x5e,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0xb2,0x00,0x3a,0x00,0x1e,0x40,0x0f,0x36,0x23,0x91,0x0e,0x20,0x20, +0x05,0x2b,0x91,0x2c,0x04,0x16,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x35,0x32,0x1e,0x02, +0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x04,0x93,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x0e,0x0f,0xb8,0x12,0x14,0x36,0x60,0x83,0x4c,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x52,0x6b,0x3f,0x1a,0x7b,0x83,0x63,0x9f,0x70,0x3c,0x21,0x40,0x5e,0x3d,0x45,0x78,0x58,0x33,0x01,0xb2,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60, +0x26,0x52,0x2c,0x26,0x4f,0x2e,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x60,0x6b,0x97,0x31,0x5c,0x81,0x50,0x3b,0x65,0x4e,0x34,0x0a,0x09,0x3c,0x61,0x82,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x08,0x12,0x05,0xb3,0x00,0x5c,0x00,0x3d,0x40,0x21,0x48,0x3e,0x0e,0x0a,0x07,0x91,0x57,0x0b, +0x57,0x3e,0x2e,0x57,0x57,0x2e,0x3e,0x03,0x00,0x39,0x91,0x24,0x04,0x21,0x1b,0x42,0x91,0x1e,0x04,0x4d,0x91,0x18,0x04,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x39,0x11,0x33,0x30,0x31,0x21,0x2e,0x05,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x37,0x2e,0x03, +0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x16,0x04,0x04,0x16, +0x17,0x05,0xf6,0x0c,0x50,0x7a,0x9e,0xb3,0xc4,0x63,0x7e,0xf0,0x68,0x3c,0x93,0x55,0x66,0x8e,0x58,0x28,0x2b,0x59,0x88,0x5c,0x6d,0x9a,0x2f,0x27,0x9a,0x67,0x65,0x9d,0x26,0x32,0x93,0x66,0x54,0x8b,0x62,0x36,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x20,0x36,0x48,0x29,0x73,0x64,0xa8,0x63,0x73,0x39,0x4f,0x31,0x15,0xa8,0x64, +0x73,0x2c,0x49,0x35,0x1d,0x43,0x6f,0x8e,0x4b,0xc7,0x01,0x59,0x01,0x0b,0xb0,0x1f,0x1c,0x38,0x31,0x2a,0x1e,0x11,0x1f,0x22,0x9c,0x11,0x16,0x05,0x33,0x85,0x9c,0xb0,0x5f,0x62,0xb2,0x87,0x50,0x5b,0x65,0x65,0x5b,0x61,0x5f,0x66,0x5a,0x3e,0x7c,0xbb,0x7c,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x62,0x85,0x52,0x23,0xac, +0xae,0x88,0x88,0xae,0xac,0x2b,0x57,0x81,0x57,0x88,0x88,0xae,0xac,0x26,0x53,0x84,0x5f,0x77,0xb9,0x8e,0x67,0x23,0x0f,0x39,0x5c,0x80,0x55,0x00,0x00,0x02,0x00,0x82,0xff,0xe8,0x04,0x74,0x05,0xb2,0x00,0x2a,0x00,0x3a,0x00,0x1e,0x40,0x0f,0x14,0x36,0x91,0x1f,0x0f,0x0f,0x05,0x1a,0x91,0x25,0x04,0x2e,0x91,0x05,0x13,0x00,0x3f,0xed, +0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x04,0x74,0x47,0x82,0xb7, +0x6f,0x7a,0xc0,0x84,0x45,0x47,0x81,0xb5,0x6e,0x31,0x62,0x5c,0x50,0x20,0x2e,0x52,0x72,0x44,0x42,0x6f,0x4f,0x2c,0xb0,0x4b,0x81,0xae,0x62,0x62,0xae,0x82,0x4c,0xfc,0xbe,0xa2,0xa5,0xaf,0xa4,0x2f,0x57,0x7e,0x4f,0x4e,0x7a,0x54,0x2b,0x01,0xfc,0x7f,0xc6,0x88,0x47,0x48,0x8c,0xcc,0x84,0x7d,0xbc,0x7e,0x3f,0x0f,0x23,0x38,0x29,0x92, +0x45,0x69,0x47,0x25,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x32,0x63,0x92,0x61,0xfd,0xdc,0xc7,0xc1,0xc0,0xc4,0x60,0x89,0x58,0x29,0x28,0x57,0x87,0x00,0x00,0x02,0x00,0xa0,0xff,0xe8,0x04,0x92,0x05,0xb2,0x00,0x30,0x00,0x40,0x00,0x2b,0x40,0x16,0x21,0x2b,0x91,0x18,0x26,0x91,0x1d,0x1d,0x18,0x00,0x36,0x91,0x05,0x05,0x0f,0x20, +0x18,0x04,0x3e,0x91,0x0f,0x13,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x39,0x11,0x33,0x2f,0xed,0x10,0xed,0x32,0x30,0x31,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15, +0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x42,0x21,0x53,0x5d,0x63,0x31,0x6e,0xb5,0x81,0x47,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0xa3,0xac,0x2b,0x63,0x5f,0x55,0x1e,0x2a,0x74,0x38,0x17,0x36,0x38,0x36,0x18,0x2e,0x62,0x5e,0x56,0x22,0x2e,0x41,0x28,0x13,0x02,0xa6,0x2d,0x56,0x7c,0x4e,0x4f, +0x80,0x5a,0x30,0xaa,0xaf,0xa5,0xa8,0x03,0x84,0x29,0x38,0x22,0x0f,0x42,0x82,0xbf,0x7d,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x02,0x5a,0xa9,0xa9,0x16,0x1a,0x16,0x21,0x23,0xaa,0x0c,0x12,0x0c,0x06,0x16,0x1a,0x16,0x10,0x28,0x42,0x33,0xfd,0xa1,0x60,0x8b,0x5a,0x2b,0x2d,0x5b,0x8c,0x60,0xc4,0xca,0xcb,0x00,0x00,0x01,0x00,0x82, +0x00,0x00,0x06,0xf8,0x05,0xb4,0x00,0x3e,0x00,0x20,0x40,0x10,0x2a,0x25,0x0c,0x0c,0x2f,0x1c,0x3a,0x12,0x05,0x91,0x2f,0x04,0x12,0x91,0x25,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x30,0x31,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e, +0x02,0x17,0x23,0x2e,0x03,0x35,0x10,0x12,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x06,0x48,0x21,0x46,0x6c,0x4a,0x3a,0x67,0x4e,0x2d,0xa4,0x2d,0x4e,0x67,0x3a,0x4a,0x6c,0x46,0x21,0x1e,0x34,0x49,0x2b,0xc9,0x20,0x3e,0x31,0x1e,0xee,0xe2,0x36,0x6e,0x62,0x4f,0x16,0x13, +0x4f,0x68,0x78,0x3d,0x69,0xa5,0x72,0x3c,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0x02,0xbc,0x91,0xe2,0x9c,0x52,0x46,0x86,0xc4,0x7e,0x6e,0x6e,0x7e,0xc4,0x86,0x46,0x4e,0x98,0xde,0x91,0x73,0xd0,0xb5,0x96,0x3a,0x39,0x8a,0xac,0xd2,0x80,0x01,0x77,0x01,0x7c,0x23,0x4a,0x76,0x52,0x52,0x75,0x4b,0x23,0x61,0xbf,0xfe,0xe3,0xbb, +0x81,0xd0,0xa9,0x89,0x39,0x3a,0x96,0xb2,0xcb,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0x9a,0x00,0x43,0x00,0x1f,0x40,0x0f,0x3b,0x01,0x0f,0x36,0x91,0x21,0x33,0x33,0x01,0x29,0x91,0x19,0x13,0x01,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x11,0x39,0x30,0x31,0x01,0x33,0x1e,0x07,0x15,0x14,0x0e,0x02,0x07, +0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x06,0x01,0x12,0xbe,0x04,0x3a,0x5a,0x71,0x75,0x6f,0x57,0x35,0x24,0x41,0x5d,0x39,0x43,0x76,0x59,0x33,0x5a,0x94,0xbf,0x66,0x75,0xc3, +0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x4f,0x6d,0x44,0x1e,0x36,0x58,0x71,0x78,0x74,0x5e,0x3e,0x05,0x9a,0x23,0x2a,0x1b,0x11,0x16,0x21,0x38,0x56,0x41,0x2e,0x50,0x40,0x2c,0x09,0x08,0x3c,0x61,0x83,0x4e,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a, +0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x1e,0x2e,0x38,0x1a,0x28,0x2f,0x1c,0x12,0x15,0x20,0x39,0x5a,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xc3,0x05,0xb2,0x00,0x42,0x00,0x35,0x40,0x1e,0x3e,0x1a,0x92,0x00,0x0e,0x00,0x0e,0x00,0x20,0xb0,0x30,0xc0,0x30,0xd0,0x30,0x03,0x30,0x13,0x91,0x08,0x08,0x21, +0x38,0x91,0x27,0x13,0x21,0x04,0x20,0x03,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0xce,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x32,0x3e,0x02,0x37,0x33,0x07,0x11,0x14,0x0e,0x02,0x23, +0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x02,0xf1,0x14,0x13,0x2a,0x53,0x7c,0x52,0x3f,0x81,0x68,0x41,0xaa,0x20,0x33,0x3f,0x1f,0x52,0x5d,0x2a,0x31,0x37,0x5e,0x9c,0x86,0x76,0x37,0x4c,0x01,0x4a,0x8b,0xca,0x80,0x75,0xc1,0x8b,0x4c,0x0f,0x10,0xb6,0x0f,0x16, +0x30,0x5e,0x88,0x59,0x57,0x85,0x5a,0x2f,0x18,0x44,0x4e,0x55,0x04,0x7c,0x23,0x4a,0x25,0x39,0x6a,0x52,0x31,0x21,0x4b,0x78,0x58,0x2f,0x3f,0x27,0x11,0x4d,0x51,0x2b,0x43,0x1c,0x83,0x10,0x27,0x43,0x33,0x02,0xfc,0x2a,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53, +0x02,0xe8,0x0e,0x18,0x14,0x0c,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0xd0,0x05,0x9a,0x00,0x54,0x00,0x44,0x40,0x14,0x17,0x45,0x91,0x1e,0x3e,0x1b,0x1b,0x38,0x91,0x23,0x80,0x23,0x90,0x23,0xa0,0x23,0xe0,0x23,0x04,0x23,0xb8,0xff,0xc0,0x40,0x11,0x09,0x0d,0x48,0x3e,0x23,0x3e,0x23,0x0d,0x4f,0x2d,0x12,0x12,0x91,0x07,0x07,0x0d,0x03, +0x00,0x3f,0x33,0x2f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x5d,0x10,0xed,0x33,0x2f,0x12,0x39,0xed,0x39,0x30,0x31,0x13,0x34,0x3e,0x04,0x37,0x3e,0x03,0x37,0x33,0x0e,0x03,0x07,0x0e,0x03,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02, +0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x23,0x2e,0x03,0x82,0x3f,0x6a,0x8d,0x9b,0xa0,0x49,0x55,0x6c,0x42,0x24,0x0d,0xb5,0x10,0x49,0x77,0xa8,0x6f,0x4d,0x8b,0x72,0x58,0x1a,0x05,0x22,0x4f,0x28,0x6a,0x88,0x1b,0x0e,0x3d,0x51,0x5f,0x2f,0x54,0x8b,0x63,0x37,0x1d,0x2f, +0x3c,0x1f,0xc2,0x23,0x45,0x36,0x21,0x22,0x39,0x4b,0x29,0x3b,0x53,0x33,0x17,0xa2,0x14,0x32,0x54,0x40,0x2f,0x4f,0x39,0x20,0x23,0x37,0x44,0x21,0xc2,0x1f,0x3c,0x2f,0x1d,0x02,0x26,0xab,0xf2,0xa4,0x62,0x38,0x18,0x09,0x0a,0x13,0x1a,0x25,0x1c,0x42,0x58,0x3c,0x27,0x10,0x0b,0x11,0x20,0x3b,0x34,0x1d,0x1a,0x7c,0x85,0x45,0x61,0x3d, +0x1d,0x3e,0x7d,0xbb,0x7c,0x66,0xa3,0x85,0x6b,0x2d,0x29,0x6b,0x88,0xa6,0x64,0x62,0x85,0x52,0x23,0x37,0x60,0x83,0x4c,0x30,0x30,0x4d,0x83,0x60,0x36,0x29,0x56,0x83,0x5a,0x64,0xa6,0x88,0x6b,0x29,0x2d,0x6d,0x87,0xa2,0x00,0x01,0x00,0xa0,0xff,0xe8,0x04,0xac,0x05,0x9a,0x00,0x27,0x00,0x18,0x40,0x0b,0x23,0x15,0x1f,0x1f,0x05,0x0c, +0x03,0x10,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x04,0xac,0x46,0x83,0xbb,0x75,0x80,0xc6,0x87,0x46,0xa2,0xb2,0xad,0x58,0x85, +0x58,0x2c,0x13,0x1e,0x21,0x1e,0x13,0x15,0x1b,0xb1,0x15,0x22,0x29,0x31,0x29,0x01,0x98,0x5a,0x9d,0x75,0x44,0x47,0x83,0xb7,0x71,0x03,0xc0,0xfc,0x42,0xa6,0xb8,0x2a,0x4b,0x68,0x3d,0x3a,0x5e,0x4e,0x43,0x40,0x40,0x24,0x22,0x4c,0x2d,0x20,0x46,0x32,0x2c,0x5a,0x6c,0x86,0x00,0x02,0x00,0x6e,0xff,0xe8,0x05,0xba,0x05,0xb2,0x00,0x5a, +0x00,0x66,0x00,0x3e,0xb6,0x3d,0x2d,0x64,0x54,0x64,0x01,0x64,0xb8,0xff,0xe0,0x40,0x1a,0x10,0x15,0x48,0x64,0x9f,0x13,0x01,0x13,0x13,0x35,0x1e,0x1b,0x92,0x23,0x23,0x49,0x55,0x0f,0x05,0x91,0x49,0x13,0x5e,0x92,0x35,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x33,0x12,0x39,0x2f,0x5d,0x33,0x2b,0x5d,0x12,0x39,0x39, +0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x04,0x27,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x16,0x16,0x17,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x05,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e, +0x02,0x37,0x33,0x0e,0x03,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x1d,0x57,0x8e,0xb4,0x5d,0x3a,0x78,0x70,0x62,0x49,0x2a,0x20,0x38,0x4a,0x56,0x5b,0x2d,0x19,0x2b,0x21,0x13,0x31,0x36,0x1d,0x38,0x11,0x23,0x39,0x18,0x52,0x92,0x38,0x5c,0x41,0x24,0x17,0x26,0x33,0x1c,0x3a,0x48,0x28,0x46,0x5c,0x35,0x31, +0x5a,0x46,0x2a,0x43,0x30,0x30,0x66,0x61,0x56,0x40,0x26,0x71,0xbc,0xf6,0x84,0x52,0xa4,0x97,0x81,0x60,0x37,0x21,0x3a,0x4f,0x2d,0xd7,0x35,0x5c,0x46,0x28,0x02,0xbf,0x33,0x2a,0x31,0x31,0x36,0x2d,0x27,0x35,0x02,0x1c,0x6e,0x9c,0x64,0x2f,0x11,0x25,0x3b,0x54,0x70,0x47,0x3c,0x5f,0x4c,0x3d,0x34,0x2e,0x17,0x15,0x27,0x25,0x24,0x12, +0x26,0x32,0x1a,0x16,0x11,0x2d,0x16,0x6d,0x22,0x3b,0x52,0x30,0x27,0x44,0x3b,0x34,0x17,0x2a,0x70,0x51,0x31,0x52,0x3b,0x21,0x21,0x3b,0x52,0x31,0x3c,0x67,0x2d,0x17,0x32,0x3d,0x4b,0x5f,0x77,0x4a,0x93,0xd2,0x86,0x3f,0x1c,0x39,0x59,0x7a,0x9c,0x61,0x46,0x89,0x7f,0x74,0x31,0x2f,0x6f,0x7b,0x86,0x02,0x72,0x23,0x2d,0x2f,0x21,0x2c, +0x41,0x1c,0x20,0x42,0x00,0x01,0x00,0x0a,0xff,0xe8,0x06,0x23,0x05,0xb8,0x00,0x54,0x00,0x30,0x40,0x19,0x10,0x91,0x0d,0x1e,0x07,0x07,0x19,0x4e,0x35,0x4e,0x35,0x4e,0x21,0x3d,0x91,0x2c,0x13,0x48,0x91,0x21,0x04,0x00,0x91,0x19,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x39,0x39,0xed, +0x30,0x31,0x01,0x22,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x16,0x33,0x32,0x3e,0x06,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15, +0x23,0x35,0x34,0x2e,0x02,0x02,0x76,0x32,0x39,0x27,0x22,0x36,0x58,0x49,0x32,0x53,0x3b,0x21,0x97,0x30,0x1d,0x1e,0x2b,0x20,0x1c,0x20,0x29,0x3b,0x51,0x39,0x38,0x5a,0x42,0x2b,0x08,0x1d,0x9b,0x74,0x54,0x88,0x60,0x33,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x20, +0x36,0x48,0x29,0x3b,0x52,0x33,0x17,0xa8,0x13,0x2d,0x49,0x05,0x21,0x2f,0x45,0x51,0x45,0x2e,0x23,0x3f,0x55,0x32,0x2a,0x2a,0x1b,0x2c,0x39,0x3a,0x39,0x2c,0x1b,0x26,0x44,0x5f,0x38,0x80,0x7f,0x3e,0x7d,0xbb,0x7c,0xfe,0x16,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82, +0x53,0x01,0xe1,0x64,0x89,0x52,0x24,0x37,0x60,0x83,0x4c,0x30,0x30,0x49,0x82,0x63,0x39,0x00,0x00,0x02,0x00,0x55,0xff,0xe8,0x06,0xd5,0x05,0xb2,0x00,0x56,0x00,0x66,0x00,0x31,0x40,0x1a,0x64,0x91,0x04,0x2b,0x47,0x19,0x91,0x16,0x2b,0x16,0x2b,0x16,0x3d,0x0c,0x91,0x52,0x13,0x38,0x21,0x91,0x3d,0x04,0x5c,0x91,0x35,0x04,0x00,0x3f, +0xed,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xce,0xed,0x30,0x31,0x01,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x07,0x06,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e, +0x02,0x33,0x32,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x13,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0x59,0x03,0x02,0xb0,0x03,0x02,0x3f,0x6c,0x92,0x53,0x69,0x96,0x60,0x2d,0x25,0x4f,0x79,0x54,0x5e,0x58,0x51,0x6c, +0x41,0x1b,0x82,0x82,0x61,0xaf,0x53,0x1d,0x3a,0x6c,0x9b,0x62,0x61,0xa1,0x73,0x40,0x42,0x75,0xa0,0x5e,0x64,0x9d,0x36,0x37,0x6e,0x6f,0x6f,0x39,0x5d,0x9c,0x71,0x40,0x20,0x3e,0x5a,0x3a,0x3a,0x69,0x4f,0x2e,0x62,0xa2,0xce,0x6c,0x81,0xd4,0x97,0x52,0xa4,0x1c,0x3b,0x5c,0x40,0x41,0x61,0x42,0x21,0x83,0x82,0x80,0x73,0x01,0x8e,0x0f, +0x1f,0x11,0x11,0x1e,0x0f,0x44,0x66,0x44,0x22,0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x5f,0x6d,0x01,0x02,0x30,0x3d,0x54,0x69,0x6c,0xa6,0x71,0x3b,0x3c,0x72,0xa7,0x6b,0x6a,0xa6,0x72,0x3c,0x3e,0x3c,0x26,0x31,0x1c,0x0a,0x31,0x5c,0x81,0x50,0x3b,0x65,0x4e,0x33,0x09,0x04,0x07,0x3b,0x61,0x83,0x4e,0x75, +0xad,0x71,0x37,0x3c,0x6e,0x9c,0x02,0xc1,0x47,0x6f,0x4c,0x27,0x2c,0x4e,0x6c,0x41,0x90,0x99,0x98,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x04,0x7d,0x05,0x9a,0x00,0x31,0x00,0x23,0x40,0x11,0x24,0x0a,0x24,0x0a,0x1b,0x13,0x05,0x91,0x10,0x10,0x15,0x2c,0x91,0x1b,0x13,0x15,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x12,0x39, +0x39,0x2f,0x2f,0x30,0x31,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x03,0xd5,0x2e,0x52,0x72,0x44,0x42,0x6f,0x4f,0x2c,0xa6,0x48,0x7e,0xaa,0x62,0x59, +0x9c,0x41,0xa8,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x02,0xed,0x43,0x68,0x47,0x24,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x28,0x29,0x01,0x51,0xfc,0x40,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a, +0x82,0x53,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0xb6,0x05,0xb3,0x00,0x4d,0x00,0x33,0x40,0x1b,0x08,0x05,0x92,0x4a,0x09,0x0c,0x19,0x37,0x1c,0x0c,0x26,0x37,0x37,0x26,0x0c,0x03,0x00,0x31,0x91,0x1c,0x04,0x3e,0x91,0x16,0x04,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x33,0xed, +0x32,0x30,0x31,0x21,0x2e,0x03,0x27,0x22,0x06,0x07,0x35,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x17,0x16,0x16, +0x17,0x04,0x49,0x19,0x65,0x8a,0xa7,0x6e,0x46,0xbb,0x59,0x41,0x98,0x51,0x68,0x90,0x5a,0x28,0x2b,0x59,0x88,0x5c,0x6d,0x92,0x2f,0x27,0x99,0x67,0x54,0x8b,0x62,0x36,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x20,0x36,0x49,0x2a,0x39,0x4f,0x30,0x15,0xa8,0x16,0x31,0x4f,0x39,0x2c,0x49,0x35,0x1d,0x2b,0x4a,0x62,0x6d,0x74,0x36, +0xb8,0xf1,0x2f,0x2e,0x4f,0x3a,0x23,0x04,0x1e,0x23,0x9c,0x15,0x19,0x02,0x2d,0x83,0x9e,0xb3,0x5e,0x62,0xb2,0x87,0x50,0x5b,0x65,0x65,0x5b,0x3e,0x7c,0xbb,0x7c,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x62,0x85,0x52,0x23,0x2b,0x57,0x81,0x57,0x88,0x88,0x57,0x81,0x57,0x2b,0x26,0x53,0x84,0x5f,0x5a,0x98,0x7e,0x65,0x4f, +0x39,0x13,0x2d,0xa7,0x7d,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x91,0x05,0x9a,0x00,0x3d,0x00,0x1d,0x40,0x0e,0x00,0x1a,0x91,0x30,0x05,0x05,0x21,0x38,0x91,0x27,0x13,0x10,0x21,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x33,0x0e,0x03, +0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x03,0xe9,0x20,0x54,0x5e,0x63,0x30,0x5a,0xa8,0x80,0x4d,0x08,0x0d,0x13,0x0b,0xb6,0x0d,0x15,0x0f,0x08,0x39,0x57,0x68,0x30,0x49,0x7f,0x5e,0x36,0xa8, +0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x03,0x5f,0x2a,0x3a,0x26,0x11,0x34,0x6d,0xaa,0x77,0x21,0x49,0x48,0x45,0x1d,0x1a,0x45,0x4b,0x4c,0x22,0x5f,0x74,0x3f,0x15,0x33,0x57,0x75,0x42,0xfe,0xfc,0x40,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20, +0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x00,0x02,0x00,0x32,0xff,0xe8,0x04,0xf3,0x05,0xb3,0x00,0x13,0x00,0x57,0x00,0x32,0x40,0x1c,0x38,0x33,0x2b,0x20,0x0f,0x91,0x57,0x48,0x00,0x52,0x10,0x52,0x02,0x52,0x52,0x3d,0x05,0x91,0x48,0x13,0x19,0x92,0x3d,0x04,0x26,0x92,0x33,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12, +0x39,0x2f,0x5d,0x12,0x39,0xed,0xce,0x32,0x11,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32, +0x1e,0x02,0x15,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x01,0xb1,0x39,0x5d,0x75,0x3c,0x3c,0x79,0x61,0x3d,0x39,0x5e,0x7a,0x42,0x42,0x76,0x5a,0x35,0x02,0x9a,0x18,0x2d,0x44,0x2b,0x36,0x48,0x2c,0x13,0x9e,0x1c,0x33,0x46,0x2a,0x4e,0x4f,0x15,0xb5,0x0e,0x32,0x5a,0x7b,0x49,0x2a,0x4e, +0x45,0x38,0x13,0x11,0x36,0x43,0x4d,0x29,0x5a,0x87,0x5b,0x2d,0x52,0x89,0xb3,0x61,0x69,0xbc,0x8c,0x52,0x59,0x8e,0xae,0x56,0x31,0x62,0x5b,0x51,0x20,0x01,0xde,0x56,0x83,0x59,0x2e,0x2d,0x58,0x82,0x55,0x55,0x83,0x59,0x2e,0x2b,0x56,0x83,0x01,0xc8,0x50,0x71,0x48,0x22,0x1e,0x33,0x45,0x27,0x2b,0x2b,0x2d,0x46,0x30,0x1a,0x62,0x54, +0x30,0x42,0x36,0x32,0x52,0x7b,0x53,0x2a,0x0f,0x23,0x38,0x29,0x28,0x38,0x24,0x10,0x32,0x6d,0xac,0x7a,0xfd,0xec,0x72,0xb9,0x81,0x46,0x46,0x84,0xbc,0x76,0x78,0xb8,0x7d,0x3f,0x11,0x24,0x37,0x27,0x00,0x02,0x00,0xa0,0x00,0x00,0x04,0x94,0x05,0xb1,0x00,0x0d,0x00,0x3f,0x00,0x22,0x40,0x11,0x06,0x91,0x3a,0x3a,0x3b,0x23,0x91,0x0e, +0x0e,0x2a,0x00,0x92,0x30,0x04,0x19,0x2a,0x12,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x33,0x2f,0xed,0x30,0x31,0x01,0x22,0x0e,0x02,0x15,0x15,0x3e,0x03,0x35,0x34,0x26,0x13,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32, +0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x3e,0x03,0x01,0xde,0x23,0x39,0x28,0x16,0x4e,0x6e,0x45,0x1f,0x3f,0x9a,0x63,0xab,0x7f,0x48,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x37,0x56,0x6b,0x33,0x48,0x87,0x69,0x3f,0xa2,0x33,0x57,0x73,0x41,0x44,0x6f,0x50,0x2b,0x2e,0x6b,0xb0,0x81,0x21,0x5b,0x66,0x6b,0x05,0x21,0x18,0x2a, +0x3c,0x24,0x83,0x0a,0x25,0x31,0x3b,0x20,0x30,0x3a,0xfe,0x36,0x35,0x71,0xb0,0x7b,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x5f,0x7b,0x47,0x1c,0x30,0x57,0x7d,0x4c,0xfe,0x8e,0x04,0x74,0x4c,0x77,0x50,0x2a,0x20,0x3f,0x5b,0x3b,0x34,0x66,0x5a,0x48,0x16,0xc5,0x2d,0x43,0x2c,0x16,0x00,0x01,0x00,0x82,0xff,0xe8,0x05,0x1d, +0x05,0x9a,0x00,0x42,0x00,0x20,0x40,0x10,0x14,0x3d,0x91,0x00,0x07,0x3c,0x3c,0x1e,0x28,0x03,0x31,0x91,0x1e,0x13,0x07,0x03,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x39,0x30,0x31,0x01,0x34,0x2e,0x04,0x35,0x33,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x26,0x02,0x35, +0x34,0x3e,0x02,0x37,0x33,0x06,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x04,0x28,0x3a,0x57,0x65,0x57,0x3a,0xb1,0x39,0x55,0x64,0x55,0x39,0x24,0x41,0x5c,0x37,0x45,0x77,0x56,0x31,0x5f,0x9f,0xd2,0x73,0x87,0xdd,0x9e,0x56,0x1f,0x34,0x42,0x23,0xc7,0x6d,0x68,0x3c,0x72, +0xa4,0x68,0x69,0x97,0x60,0x2d,0x2c,0x58,0x85,0x59,0x7f,0x79,0x46,0x6a,0x48,0x25,0x04,0x1a,0x31,0x32,0x20,0x1c,0x35,0x5c,0x50,0x2c,0x2d,0x1d,0x1c,0x36,0x5e,0x51,0x30,0x54,0x42,0x2d,0x08,0x09,0x3c,0x61,0x82,0x4e,0x75,0xad,0x71,0x37,0x5e,0xbc,0x01,0x1b,0xbd,0x7b,0xd3,0xaf,0x8d,0x36,0x94,0xfe,0xa4,0xd6,0x94,0xe0,0x96,0x4b, +0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x20,0x32,0x3e,0x00,0x02,0x00,0x6e,0xff,0xe8,0x04,0x60,0x05,0x9a,0x00,0x16,0x00,0x24,0x00,0x16,0x40,0x0b,0x15,0x03,0x22,0x91,0x14,0x0f,0x10,0x1a,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32, +0x1e,0x02,0x17,0x11,0x33,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x04,0x60,0x47,0x82,0xb7,0x6f,0x7a,0xc0,0x84,0x45,0x47,0x81,0xb5,0x6e,0x31,0x63,0x5b,0x51,0x1f,0xa8,0xfc,0xbe,0xa2,0xa5,0xae,0xa5,0x2f,0x57,0x7e,0x4f,0x9d,0xaa,0x02,0x06,0x7f,0xc9,0x8c,0x4a,0x4b,0x90,0xcf,0x84,0x7d,0xc0,0x82,0x43, +0x10,0x24,0x39,0x28,0x02,0x17,0xfc,0x76,0xc7,0xcb,0xcb,0xc3,0x60,0x8c,0x5d,0x2d,0xb3,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x04,0xff,0x05,0xb3,0x00,0x41,0x00,0x56,0x00,0x33,0x40,0x1c,0x3f,0x53,0x91,0x17,0x12,0x30,0x00,0x00,0x00,0x10,0x00,0x02,0x23,0x00,0x23,0x00,0x09,0x29,0x92,0x1c,0x04,0x36,0x92,0x12,0x04,0x47,0x09,0x12, +0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xce,0x11,0x39,0xed,0x39,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x07,0x01,0x23,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35, +0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x17,0x36,0x36,0x13,0x1e,0x03,0x17,0x33,0x3e,0x03,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x02,0xa4,0x58,0x8c,0x62,0x33,0x2d,0xfe,0xfe,0x8e,0xfe,0x17,0x11,0x16,0x32,0x5a,0x7e,0x4b,0x29,0x4d,0x43,0x36,0x11,0x13,0x38,0x45,0x4e,0x2a,0x49,0x7c,0x5a,0x33,0x0e, +0xb7,0x15,0x4f,0x4e,0x2a,0x46,0x33,0x1c,0x9e,0x13,0x2c,0x48,0x36,0x22,0x3b,0x2b,0x19,0x0c,0x0c,0x39,0x4e,0xa7,0x33,0x05,0x10,0x10,0x0d,0x03,0x02,0x03,0x0e,0x11,0x11,0x05,0x72,0x18,0x67,0x72,0x4b,0x7e,0x37,0x03,0xd5,0x28,0x4c,0x6d,0x45,0x59,0x5a,0xfe,0x04,0x03,0xca,0x23,0x5b,0x32,0x51,0x76,0x4d,0x25,0x10,0x24,0x38,0x28, +0x29,0x38,0x23,0x0f,0x2a,0x53,0x7b,0x52,0x32,0x36,0x42,0x30,0x54,0x62,0x1a,0x30,0x46,0x2d,0x2b,0x2b,0x27,0x45,0x33,0x1e,0x18,0x2e,0x43,0x2b,0x1d,0x36,0x17,0x72,0x1d,0x20,0xfd,0x79,0x0b,0x20,0x25,0x25,0x0f,0x0f,0x25,0x25,0x21,0x0b,0xe1,0x2e,0x3a,0x53,0x53,0x1c,0x19,0x00,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x26,0x05,0x9a, +0x00,0x41,0x00,0x53,0x00,0x3f,0x40,0x25,0x02,0x41,0x09,0x4f,0x2d,0x10,0x06,0x05,0x0d,0x0d,0x4c,0x91,0x1f,0x32,0x05,0x05,0x42,0x91,0x3c,0x6f,0x32,0x7f,0x32,0xdf,0x32,0x03,0x32,0x3c,0x32,0x3c,0x01,0x27,0x91,0x16,0x13,0x01,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x33,0x2f,0x10,0xce,0xed,0x33,0x2f, +0x12,0x17,0x39,0x30,0x31,0x01,0x33,0x11,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x16,0x16,0x17,0x15,0x26,0x26,0x27,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x25,0x22, +0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x2e,0x03,0x03,0xad,0xa8,0x33,0x66,0x38,0x39,0x69,0x30,0x30,0x69,0x39,0x38,0x66,0x33,0x4a,0x8b,0xca,0x80,0x7e,0xc1,0x82,0x43,0x0f,0x10,0xb6,0x0f,0x16,0x2b,0x58,0x87,0x5c,0x57,0x85,0x5a,0x2f,0x2d,0x5a,0x5f,0x66,0x37,0x43,0x70,0x52,0x2e,0x2e,0x52,0x70,0x43,0x37,0x66,0x5f, +0x5a,0x2d,0xfe,0x88,0x17,0x32,0x2a,0x1b,0x1b,0x2a,0x32,0x17,0x66,0xbf,0x55,0x2a,0x5b,0x5f,0x63,0x05,0x9a,0xfe,0xac,0x2a,0x4d,0x21,0xa0,0x1d,0x46,0x26,0x26,0x45,0x1d,0xa0,0x20,0x4e,0x29,0xfe,0xb6,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x01,0x53,0x22, +0x3b,0x2c,0x19,0x2b,0x4f,0x6d,0x42,0x42,0x6d,0x4e,0x2b,0x19,0x2c,0x3b,0x22,0x0f,0x0f,0x23,0x39,0x2a,0x2a,0x3a,0x23,0x0f,0x55,0x40,0x20,0x37,0x28,0x17,0x00,0x02,0x00,0xa0,0xff,0xe8,0x04,0x92,0x05,0x9a,0x00,0x16,0x00,0x24,0x00,0x16,0x40,0x0b,0x22,0x91,0x11,0x13,0x1a,0x91,0x02,0x07,0x10,0x01,0x03,0x00,0x3f,0x3f,0x33,0xed, +0x3f,0xed,0x30,0x31,0x13,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x25,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0xa0,0xa8,0x1f,0x51,0x5b,0x63,0x31,0x6e,0xb5,0x81,0x47,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0x03,0x42,0xaa,0x9d,0x4f,0x7e,0x57,0x2f,0xa5,0xae, +0xa5,0xa2,0x05,0x9a,0xfd,0xe9,0x28,0x39,0x24,0x10,0x43,0x82,0xc0,0x7d,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x0a,0xbf,0xb3,0x2d,0x5d,0x8c,0x60,0xc3,0xcb,0xcb,0x00,0x01,0x00,0x50,0xff,0xe8,0x05,0xea,0x05,0xb2,0x00,0x5b,0x00,0x34,0x40,0x1d,0x14,0x4f,0x21,0x4f,0x21,0x4f,0x29,0x48,0x91,0x57,0x13,0x5b,0x44,0x15,0x2d,0x04, +0x08,0x34,0x91,0x3b,0x04,0x19,0x92,0x29,0x04,0x0e,0x92,0x08,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x01,0x26,0x26,0x27,0x22,0x06,0x06,0x15,0x14, +0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x01,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x01,0x01,0x16,0x16,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x01,0xd9,0x19,0x1d,0x24,0x49, +0x6e,0x4a,0x20,0x48,0x1f,0x3c,0x4b,0x39,0x39,0x3b,0x3d,0x01,0xc9,0xfe,0xb5,0x0f,0x21,0x12,0x09,0x1a,0x16,0x1c,0x17,0xa4,0x11,0x15,0x25,0x3d,0x4e,0x2a,0x48,0x6a,0x2a,0x01,0x32,0x01,0xc4,0x23,0x1b,0x29,0x1e,0x35,0x51,0x2c,0x2b,0x66,0x28,0x3d,0x5a,0x3b,0x1d,0x3e,0x3e,0xfe,0x21,0x01,0x40,0x0f,0x1f,0x15,0x20,0x18,0x1c,0x17, +0xae,0x11,0x15,0x26,0x3f,0x50,0x2a,0x48,0x6f,0x2a,0xfe,0xd9,0x01,0x7c,0x24,0x54,0x28,0x2f,0x58,0x44,0x29,0x0d,0x0f,0xb5,0x47,0x3f,0x2e,0x30,0x61,0x26,0x01,0x45,0x02,0x1e,0x18,0x0f,0x01,0x08,0x1f,0x1d,0x26,0x5b,0x2c,0x2b,0x50,0x2c,0x37,0x52,0x37,0x1b,0x3f,0x45,0xfe,0x10,0x01,0x42,0x19,0x34,0x14,0x1a,0x22,0x1e,0x17,0xa4, +0x11,0x15,0x22,0x3a,0x4f,0x2d,0x3c,0x6d,0x2c,0xfe,0xad,0xfd,0xfa,0x18,0x12,0x01,0x04,0x24,0x1d,0x26,0x55,0x2c,0x2b,0x50,0x2c,0x37,0x54,0x38,0x1d,0x3f,0x45,0x01,0xe3,0x00,0x00,0x01,0x00,0x50,0xff,0xe8,0x04,0x46,0x05,0x9a,0x00,0x52,0x00,0x2e,0x40,0x19,0x31,0x16,0x91,0x13,0x39,0x0d,0x91,0x0a,0x5f,0x0a,0x01,0x13,0x4b,0x0a, +0x0a,0x4b,0x13,0x03,0x22,0x00,0x91,0x43,0x13,0x22,0x03,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x39,0x30,0x31,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x2e,0x06,0x35,0x33,0x14,0x1e,0x06,0x15,0x14, +0x0e,0x02,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x02,0x58,0x4a,0x76,0x52,0x2b,0x21,0x3b,0x51,0x2f,0x5e,0x5e,0x67,0x75,0x6b,0x71,0x5e,0x5e,0x73,0x69,0x2a,0x46,0x58,0x5d,0x58,0x46,0x2a,0xb1,0x2a,0x46,0x58,0x5d,0x58,0x46, +0x2a,0x17,0x31,0x4c,0x35,0x65,0x63,0x1a,0x32,0x4b,0x31,0x35,0x4c,0x30,0x17,0x3f,0x7c,0xbb,0x7b,0x6f,0xbd,0x8a,0x4e,0x1e,0xb7,0x12,0x13,0x33,0x5c,0x7e,0x7e,0x13,0x2a,0x41,0x2e,0x21,0x36,0x25,0x15,0x96,0x3b,0x3d,0x3f,0x31,0x96,0x3d,0x3b,0x1e,0x24,0x16,0x0e,0x13,0x1d,0x33,0x4f,0x3b,0x1b,0x22,0x18,0x11,0x14,0x1d,0x2e,0x44, +0x32,0x27,0x49,0x3c,0x29,0x07,0x14,0x5c,0x4d,0x26,0x41,0x32,0x21,0x06,0x09,0x2e,0x3f,0x4d,0x28,0x47,0x71,0x50,0x2b,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x00,0x01,0x00,0x82,0xff,0xe8,0x04,0xcc,0x05,0x9a,0x00,0x57,0x00,0x2c,0x40,0x17,0x20,0x4c,0x91,0x49,0x18,0x55,0x91,0x52,0x5f,0x49,0x01,0x49, +0x52,0x49,0x52,0x09,0x3f,0x91,0x2a,0x13,0x35,0x09,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x39,0x30,0x31,0x01,0x34,0x2e,0x06,0x35,0x33,0x14,0x1e,0x06,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x26,0x02,0x35,0x34, +0x3e,0x02,0x37,0x33,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x04,0x1b,0x1f,0x33,0x41,0x45,0x41,0x33,0x1f,0xb1,0x1f,0x33,0x41,0x45,0x41,0x33,0x1f,0x17,0x31,0x4c,0x35,0x65,0x63,0x1a,0x32,0x4b,0x31,0x35,0x4c,0x30,0x17, +0x3f,0x7c,0xbb,0x7b,0x87,0xdd,0x9e,0x56,0x1e,0x33,0x43,0x24,0xc9,0x38,0x50,0x33,0x17,0x3b,0x70,0xa2,0x68,0x47,0x73,0x50,0x2b,0x21,0x3b,0x51,0x2f,0x5e,0x5e,0x67,0x75,0x6b,0x71,0x5e,0x5e,0x73,0x69,0x04,0x47,0x1e,0x25,0x18,0x11,0x14,0x1e,0x32,0x4b,0x38,0x1b,0x22,0x18,0x11,0x14,0x1d,0x2e,0x44,0x32,0x27,0x49,0x3c,0x29,0x07, +0x14,0x5c,0x4d,0x26,0x41,0x32,0x21,0x06,0x09,0x2e,0x3f,0x4d,0x28,0x47,0x71,0x50,0x2b,0x5e,0xbc,0x01,0x1b,0xbd,0x7c,0xd2,0xaf,0x8d,0x36,0x4a,0xa0,0xb0,0xc1,0x6b,0x94,0xe0,0x96,0x4b,0x13,0x29,0x41,0x2e,0x21,0x36,0x25,0x15,0x96,0x3b,0x3d,0x3f,0x31,0x96,0x3d,0x00,0x00,0x02,0x00,0x64,0xff,0xe8,0x05,0xe4,0x05,0xb2,0x00,0x29, +0x00,0x3b,0x00,0x26,0x40,0x14,0x2f,0x91,0x1f,0x04,0x37,0xee,0x08,0x08,0x10,0x15,0x91,0x0f,0x0a,0x13,0x00,0x27,0x91,0x01,0x06,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x39,0x10,0xed,0x3f,0xed,0x30,0x31,0x25,0x15,0x0e,0x03,0x23,0x22,0x27,0x06,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x17,0x2e,0x03,0x35,0x34,0x12, +0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x36,0x36,0x03,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x12,0x17,0x3e,0x03,0x05,0xe4,0x35,0x64,0x6d,0x7c,0x4c,0x82,0x72,0x6b,0x74,0x56,0x83,0x6f,0x63,0x34,0x2f,0x5a,0x5f,0x67,0x3c,0x5c,0x83,0x56,0x28,0x5d,0xaf,0xfa,0x9e,0x92,0xec,0xa7,0x5b,0xb9,0xba,0x72,0xc9,0x78, +0x40,0x7b,0xb1,0x70,0x6e,0xb4,0x80,0x46,0xf7,0xe9,0x75,0xb4,0x7b,0x40,0xd8,0xb0,0x10,0x18,0x10,0x08,0x15,0x15,0x08,0x10,0x18,0x10,0xb5,0x12,0x1e,0x17,0x10,0x03,0x2d,0x82,0xa0,0xbc,0x68,0xa6,0x01,0x04,0xb4,0x5e,0x5d,0xae,0xf8,0x9c,0xe2,0xfe,0xab,0x5d,0x04,0x2f,0x02,0x54,0x85,0xc8,0x85,0x42,0x49,0x8b,0xc8,0x7e,0xf3,0xfe, +0xc7,0x38,0x1b,0x6c,0x9d,0xcb,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0x89,0x05,0xbb,0x00,0x34,0x00,0x26,0x40,0x13,0x0c,0x0a,0x91,0x1b,0x2d,0x1b,0x2d,0x15,0x00,0x91,0x25,0x13,0x10,0x91,0x15,0x15,0x18,0x13,0x04,0x00,0x3f,0x33,0x33,0x2f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x39,0x30,0x31,0x25,0x32,0x3e,0x02,0x35,0x34, +0x2e,0x02,0x23,0x23,0x35,0x01,0x23,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x37,0x15,0x01,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x02,0x78,0x64,0x8a,0x54,0x25,0x2c,0x58,0x85,0x59,0xc5,0x01,0x64,0x03,0x77,0x76,0xaa,0xb7,0x2b,0x8d,0xce,0x67,0xff,0x81, +0xfe,0x76,0x03,0x8b,0xb9,0x6d,0x2d,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x7f,0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x4b,0x01,0xdb,0x18,0x41,0x97,0x40,0x21,0x20,0x3f,0xfd,0xf0,0x02,0x07,0x53,0x7c,0x97,0x4b,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69, +0x48,0x25,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0x89,0x05,0x9a,0x00,0x44,0x00,0x2e,0x40,0x1a,0x3d,0x91,0x08,0x0f,0x36,0x91,0x33,0x00,0x33,0x10,0x33,0x02,0x08,0x33,0x21,0x21,0x33,0x08,0x03,0x00,0x29,0x91,0x19,0x13,0x00,0x03,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x30,0x31,0x01,0x33, +0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x01,0x17,0xaf,0x09,0x1f,0x3d,0x5a,0x3b, +0x01,0x91,0x24,0x41,0x5d,0x39,0x43,0x76,0x59,0x33,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0x70,0x6a,0x4f,0x6d,0x45,0x1f,0xfe,0x58,0x93,0x69,0x3b,0x06,0x05,0x9a,0x24,0x1b,0x23,0x29,0x15,0x05,0xda,0x2e,0x50,0x40,0x2c,0x09,0x08,0x3c,0x61,0x83, +0x4e,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x1e,0x2e,0x38,0x1a,0x55,0x17,0x35,0x57,0x41,0x14,0x2c,0x00,0x03,0x00,0x6e,0xff,0xe8,0x04,0x29,0x05,0xb2,0x00,0x29,0x00,0x38,0x00,0x47,0x00,0x35,0x40,0x1c,0x24,0x2a,0x91,0x13,0x27,0x13, +0x01,0x39,0x91,0x12,0x28,0x12,0x2f,0x13,0x01,0x13,0x12,0x13,0x12,0x07,0x2e,0x91,0x1e,0x04,0x44,0x91,0x07,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x30,0x31,0x01,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x23,0x22, +0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x33,0x15,0x23,0x15,0x33,0x01,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x13,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x04,0x29,0xad,0x35,0x63,0x8e,0x5a,0x54,0x91,0x6c,0x3d,0x3e,0x6f,0x9a,0x5c,0xc9,0xc9,0x5c,0x9a,0x6f,0x3e, +0x3d,0x6a,0x92,0x55,0x5a,0x8e,0x63,0x35,0xad,0xad,0xad,0xfe,0xb1,0x73,0x6b,0x2f,0x53,0x3e,0x24,0x25,0x42,0x5c,0x36,0xc9,0xc9,0x36,0x5c,0x42,0x25,0x24,0x3e,0x53,0x2f,0x68,0x76,0x01,0xe6,0x94,0x5a,0x88,0x5b,0x2d,0x29,0x52,0x7a,0x52,0x51,0x7c,0x55,0x2b,0xa2,0x2b,0x55,0x7c,0x51,0x52,0x7a,0x52,0x29,0x2e,0x5a,0x88,0x5a,0x94, +0x96,0xa2,0x01,0x38,0x94,0x69,0x6c,0x13,0x2a,0x44,0x31,0x2e,0x44,0x2e,0x17,0xfe,0x32,0x17,0x2e,0x45,0x2d,0x31,0x44,0x2a,0x13,0x6b,0x6a,0x00,0x00,0x03,0x00,0x6e,0xff,0xf1,0x05,0xd9,0x05,0xa7,0x00,0x1d,0x00,0x2a,0x00,0x37,0x00,0x2d,0x40,0x17,0x37,0x91,0x04,0x04,0x20,0x91,0x1d,0x2d,0x92,0x0e,0x0e,0x2a,0x92,0x13,0x1d,0x13, +0x1d,0x13,0x01,0x10,0x03,0x01,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0xed,0x10,0xed,0x33,0x2f,0xed,0x30,0x31,0x25,0x15,0x23,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23, +0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x03,0x78,0xa8,0x2b,0x7c,0xd0,0x97,0x54,0x54,0x97,0xd1,0x7d,0x29,0xa8,0x2a,0x7d,0xd0,0x96,0x54,0x55,0x97,0xcf,0x7a,0x2c,0x2c,0x5a,0x91,0x64,0x36,0x37,0x65,0x91,0x5a,0xd2,0x29,0x59,0x91,0x67,0x38,0x35,0x64,0x92,0x5c,0xba,0xc9,0xc9,0x54,0x96,0xd1,0x7d,0x7b,0xc9,0x8f, +0x4d,0x95,0x95,0x4f,0x8f,0xc8,0x7a,0x7e,0xd1,0x96,0x53,0x03,0xca,0xfc,0xcc,0x39,0x6b,0x9a,0x62,0x5b,0x95,0x6a,0x3a,0xfc,0xcc,0x03,0x34,0x39,0x69,0x96,0x5d,0x62,0x9b,0x6a,0x38,0x00,0x00,0x01,0x00,0x76,0xff,0xe8,0x04,0xc1,0x05,0xb2,0x00,0x3a,0x00,0x1b,0x40,0x0d,0x29,0x0a,0x1a,0x31,0x2b,0x91,0x36,0x13,0x15,0x0f,0x91,0x1a, +0x04,0x00,0x3f,0xed,0xcd,0x3f,0xed,0xcd,0x12,0x39,0x39,0x30,0x31,0x13,0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x10,0x21,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x76,0x4c,0x86,0xb8,0x6c, +0x49,0x81,0x62,0x39,0x28,0x4c,0x70,0x49,0x4c,0x76,0x50,0x29,0xaa,0x54,0x88,0xae,0x59,0x71,0xb0,0x79,0x3f,0x4c,0x85,0xb6,0x6a,0x46,0x82,0x65,0x3d,0x01,0x74,0x44,0x89,0x6f,0x46,0xab,0x60,0x9d,0xc7,0x67,0x6b,0xc5,0x96,0x5a,0x01,0x85,0x6f,0x92,0x5f,0x37,0x13,0x0c,0x25,0x3c,0x5b,0x43,0x33,0x52,0x3b,0x20,0x24,0x42,0x5c,0x38, +0x6f,0x99,0x5f,0x2b,0x35,0x63,0x8b,0x55,0x66,0x8d,0x60,0x3a,0x14,0x0d,0x24,0x3e,0x5e,0x47,0xfe,0xfa,0x1d,0x41,0x6a,0x4e,0x74,0xa3,0x67,0x2f,0x2a,0x60,0x9e,0x00,0x00,0x01,0x00,0xa0,0xff,0xe8,0x04,0xc3,0x05,0x9a,0x00,0x3d,0x00,0x1d,0x40,0x0e,0x3d,0x23,0x91,0x0e,0x38,0x38,0x16,0x2d,0x1d,0x03,0x05,0x91,0x16,0x13,0x00,0x3f, +0xed,0x3f,0x33,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x01,0x48, +0x2f,0x5a,0x85,0x57,0x58,0x86,0x5a,0x2e,0x16,0x0f,0xb6,0x10,0x0f,0x4a,0x87,0xbe,0x75,0x80,0xca,0x8b,0x4a,0xa8,0x36,0x5e,0x7f,0x49,0x30,0x68,0x57,0x39,0x08,0x0f,0x15,0x0d,0xb6,0x0b,0x13,0x0d,0x08,0x4d,0x80,0xa8,0x5a,0x30,0x63,0x5e,0x54,0x20,0x01,0xdc,0x53,0x82,0x5a,0x2f,0x2b,0x4b,0x68,0x3d,0x30,0x53,0x20,0x2a,0x53,0x27, +0x5a,0x9d,0x75,0x44,0x47,0x83,0xb7,0x71,0x03,0xc0,0xfe,0x42,0x75,0x57,0x33,0x19,0x44,0x78,0x5f,0x22,0x48,0x47,0x40,0x1a,0x1d,0x45,0x48,0x49,0x21,0x77,0xaa,0x6d,0x34,0x11,0x26,0x3a,0x2a,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0xae,0x00,0x2f,0x00,0x3f,0x00,0x26,0x40,0x15,0x1e,0x03,0x35,0x91,0x11,0x00,0x40,0x09, +0x0d,0x48,0x00,0x00,0x16,0x3d,0x91,0x26,0x04,0x0b,0x91,0x16,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x2b,0xce,0xed,0x39,0x39,0x30,0x31,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e, +0x02,0x15,0x14,0x0e,0x02,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x02,0x87,0x26,0x46,0x21,0x07,0x08,0x1a,0x2f,0x40,0x27,0x2f,0x47,0x2f,0x17,0xaf,0x35,0x60,0x86,0x50,0x51,0x82,0x5b,0x32,0x14,0x0c,0x73,0x70,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88,0xcf,0xfe,0x14,0x33,0x5b,0x7f,0x4d, +0xb8,0xc4,0x32,0x5f,0x89,0x58,0xb0,0xb4,0x01,0x7f,0x07,0x07,0x17,0x35,0x22,0x29,0x3d,0x28,0x13,0x17,0x27,0x36,0x1f,0x43,0x6e,0x4e,0x2a,0x2a,0x50,0x70,0x47,0x39,0x58,0x1f,0x45,0xed,0x97,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0x02,0x19,0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0xca,0x00,0x01, +0x00,0x82,0xff,0xd5,0x05,0x14,0x05,0xb2,0x00,0x24,0x00,0x22,0x40,0x10,0x03,0x22,0x00,0x24,0x12,0x24,0x12,0x24,0x01,0x18,0x91,0x0d,0x04,0x02,0x01,0x13,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x39,0x39,0x30,0x31,0x25,0x01,0x35,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e, +0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x33,0x25,0x04,0xd6,0xfc,0x21,0x01,0x73,0x71,0xb5,0x7e,0x44,0x59,0x9d,0xd8,0x7f,0x83,0xd6,0x99,0x53,0xaa,0x36,0x68,0x9a,0x63,0x65,0x9c,0x6b,0x37,0x4d,0x94,0xd5,0x89,0x01,0x01,0x6a,0xe5,0xfe,0xf0,0x9d,0x6b,0x20,0x75,0xa2,0xcd,0x78,0x84,0xdd,0x9f,0x59,0x50,0x96,0xd5,0x85, +0x5d,0x9d,0x70,0x3f,0x48,0x7e,0xaa,0x61,0x68,0xb8,0x92,0x65,0x15,0x65,0x00,0x01,0x00,0x62,0xff,0xe8,0x04,0xad,0x05,0xb2,0x00,0x3a,0x00,0x1b,0x40,0x0d,0x31,0x12,0x05,0x2c,0x91,0x26,0x21,0x04,0x10,0x91,0x0a,0x05,0x13,0x00,0x3f,0xcd,0xed,0x3f,0xcd,0xed,0x12,0x39,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35, +0x33,0x14,0x1e,0x02,0x33,0x20,0x11,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0xad,0x5a,0x96,0xc5,0x6b,0x67,0xc7,0x9d,0x60,0xab,0x46,0x6f,0x89,0x44,0x01,0x74,0x3d,0x65,0x82,0x46,0x6a,0xb6,0x85,0x4c,0x42,0x7b, +0xaf,0x6d,0x59,0xad,0x89,0x54,0xaa,0x29,0x50,0x76,0x4c,0x49,0x70,0x4d,0x27,0x39,0x61,0x82,0x49,0x6c,0xb8,0x86,0x4c,0x01,0x85,0x75,0x9e,0x60,0x2a,0x2f,0x67,0xa3,0x74,0x4e,0x6a,0x41,0x1d,0x01,0x06,0x47,0x5e,0x3e,0x24,0x0d,0x14,0x3a,0x60,0x8d,0x66,0x53,0x8b,0x63,0x37,0x2b,0x5f,0x99,0x6f,0x38,0x5c,0x42,0x24,0x20,0x3b,0x52, +0x33,0x43,0x5b,0x3c,0x25,0x0c,0x13,0x37,0x5f,0x92,0x00,0x02,0x00,0x64,0xff,0xe8,0x05,0xe4,0x05,0xb2,0x00,0x29,0x00,0x3b,0x00,0x26,0x40,0x14,0x2f,0x91,0x1e,0x13,0x0f,0x14,0x91,0x0e,0x09,0x04,0x37,0xee,0x07,0x07,0x29,0x26,0x91,0x00,0x05,0x04,0x00,0x3f,0x33,0xed,0x32,0x39,0x10,0xed,0x3f,0x33,0xed,0x32,0x3f,0xed,0x30,0x31, +0x13,0x3e,0x03,0x33,0x32,0x17,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x27,0x1e,0x03,0x15,0x14,0x02,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x37,0x06,0x06,0x07,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x02,0x27,0x0e,0x03,0x64,0x34,0x65,0x6d,0x7c,0x4c,0x82,0x72,0x6a,0x75,0x55,0x84,0x6f,0x62,0x35,0x2f, +0x5a,0x5f,0x67,0x3c,0x5b,0x84,0x56,0x28,0x5d,0xaf,0xfb,0x9d,0x92,0xec,0xa7,0x5b,0xb9,0xba,0x72,0xc9,0x66,0xde,0x40,0x7b,0xb0,0x71,0x6e,0xb4,0x80,0x46,0xf7,0xe9,0x75,0xb4,0x7b,0x40,0x05,0x72,0x10,0x18,0x10,0x08,0x15,0x15,0x08,0x10,0x18,0x10,0xb5,0x12,0x1e,0x17,0x10,0x03,0x2d,0x82,0xa0,0xbc,0x68,0xa6,0xfe,0xfc,0xb4,0x5e, +0x5d,0xae,0xf8,0x9c,0xe2,0x01,0x55,0x5d,0x04,0x2f,0x26,0xfd,0xd2,0x86,0xc7,0x85,0x42,0x49,0x8b,0xc8,0x7e,0xf3,0x01,0x39,0x38,0x1b,0x6c,0x9d,0xcb,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x05,0xbe,0x05,0xb2,0x00,0x13,0x00,0x27,0x00,0x10,0xb7,0x14,0x91,0x0a,0x04,0x1e,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x30,0x31,0x05,0x22, +0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x03,0x15,0x98,0xf6,0xb0,0x5f,0x60,0xb4,0x01,0x01,0xa0,0x94,0xf2,0xac,0x5f,0x61,0xb2,0xfb,0x8f,0x72,0xbc,0x87,0x4a,0x48,0x83,0xb8,0x70,0x76,0xbd,0x85, +0x47,0x44,0x81,0xb9,0x18,0x6a,0xc0,0x01,0x0a,0xa0,0xac,0x01,0x18,0xc6,0x6c,0x6a,0xbe,0xfe,0xf5,0xa0,0xaf,0xfe,0xe7,0xc5,0x6a,0x05,0x32,0x56,0x9c,0xd9,0x84,0x83,0xd9,0x9b,0x55,0x4f,0x96,0xda,0x8a,0x8d,0xdd,0x98,0x50,0x00,0x00,0x03,0x00,0xbe,0x02,0x27,0x03,0x98,0x06,0x8f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x1a,0x40,0x09, +0x0b,0x09,0x09,0x02,0x05,0x07,0x07,0x00,0x02,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x2f,0xcd,0x30,0x31,0x01,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0x05,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x02,0x31,0xa9,0xa9,0xfe,0xe8,0xa9,0xa9,0x02,0x27,0x02,0xa6,0xfd,0x5a,0x02,0xa6,0x67,0x02,0x29,0x00,0x00,0x00,0x00,0x01, +0x00,0x00,0xc2,0x66,0x00,0x01,0x20,0x64,0xc0,0x00,0x00,0x0d,0x02,0x58,0x00,0x05,0x00,0x55,0xff,0xcd,0x00,0x05,0x00,0x56,0xff,0xbe,0x00,0x05,0x00,0xe4,0xff,0xbe,0x00,0x05,0x00,0xfb,0xff,0xbe,0x00,0x05,0x01,0x1b,0xff,0xcd,0x00,0x05,0x01,0x1d,0xff,0xcd,0x00,0x05,0x01,0x1f,0xff,0xbe,0x00,0x05,0x01,0x73,0xff,0xcd,0x00,0x05, +0x01,0x75,0xff,0xbe,0x00,0x05,0x01,0xd5,0xff,0x6f,0x00,0x05,0x02,0x2b,0xff,0xbc,0x00,0x05,0x02,0x3e,0xff,0xbe,0x00,0x0a,0x00,0x55,0xff,0xcd,0x00,0x0a,0x00,0x56,0xff,0xbe,0x00,0x0a,0x00,0xe4,0xff,0xbe,0x00,0x0a,0x00,0xfb,0xff,0xbe,0x00,0x0a,0x01,0x1b,0xff,0xcd,0x00,0x0a,0x01,0x1d,0xff,0xcd,0x00,0x0a,0x01,0x1f,0xff,0xbe, +0x00,0x0a,0x01,0x73,0xff,0xcd,0x00,0x0a,0x01,0x75,0xff,0xbe,0x00,0x0a,0x01,0xd5,0xff,0x6f,0x00,0x0a,0x02,0x2b,0xff,0xbc,0x00,0x0a,0x02,0x3e,0xff,0xbe,0x00,0x0b,0x00,0x4d,0x00,0xe9,0x00,0x0b,0x01,0x64,0x00,0xe9,0x00,0x0d,0x00,0x24,0xff,0x5a,0x00,0x0d,0x00,0x2d,0xff,0x66,0x00,0x0d,0x00,0x46,0xff,0x9a,0x00,0x0d,0x00,0x47, +0xff,0x9a,0x00,0x0d,0x00,0x48,0xff,0x9a,0x00,0x0d,0x00,0x4a,0xff,0x9a,0x00,0x0d,0x00,0x52,0xff,0x9a,0x00,0x0d,0x00,0x54,0xff,0x9a,0x00,0x0d,0x00,0xa9,0xff,0x58,0x00,0x0d,0x00,0xf8,0xff,0x9a,0x00,0x0d,0x00,0xfd,0xff,0x9a,0x00,0x0d,0x00,0xff,0xff,0x9a,0x00,0x0d,0x01,0x00,0xff,0x9a,0x00,0x0d,0x01,0x03,0xff,0x5a,0x00,0x0d, +0x01,0x05,0xff,0x5a,0x00,0x0d,0x01,0x08,0xff,0x9a,0x00,0x0d,0x01,0x0b,0xff,0x9a,0x00,0x0d,0x01,0x45,0xff,0x5a,0x00,0x0d,0x01,0x48,0xff,0x9a,0x00,0x0d,0x01,0x52,0xff,0x9a,0x00,0x0d,0x01,0x54,0xff,0x9a,0x00,0x0d,0x01,0x56,0xff,0x9a,0x00,0x0d,0x01,0x63,0xff,0x66,0x00,0x0d,0x01,0x85,0xff,0x5a,0x00,0x0d,0x01,0x87,0xff,0x5a, +0x00,0x0d,0x01,0xa9,0xff,0x58,0x00,0x0d,0x01,0xb0,0xff,0x58,0x00,0x0d,0x01,0xe7,0xff,0x58,0x00,0x0d,0x02,0x0c,0xff,0x98,0x00,0x0d,0x02,0x15,0xff,0x98,0x00,0x0d,0x02,0x18,0xff,0x98,0x00,0x0d,0x02,0x1b,0xff,0x98,0x00,0x0d,0x02,0x27,0xff,0x98,0x00,0x0d,0x02,0x2a,0xff,0x98,0x00,0x0f,0x00,0xb4,0xff,0x31,0x00,0x0f,0x00,0xb5, +0xff,0x31,0x00,0x0f,0x00,0xb6,0xff,0x31,0x00,0x0f,0x00,0xb7,0xff,0x31,0x00,0x10,0x01,0x33,0xff,0xdb,0x00,0x10,0x01,0xd3,0xff,0xe7,0x00,0x10,0x02,0x37,0xff,0xdb,0x00,0x11,0x00,0xb4,0xff,0x31,0x00,0x11,0x00,0xb5,0xff,0x3d,0x00,0x11,0x00,0xb6,0xff,0x31,0x00,0x11,0x00,0xb7,0xff,0x3d,0x00,0x1e,0x02,0x37,0xff,0xdb,0x00,0x22, +0x01,0xcb,0xff,0xe7,0x00,0x22,0x02,0x37,0xff,0xdb,0x00,0x24,0x00,0x0d,0xff,0x7f,0x00,0x24,0x00,0x0f,0x00,0x44,0x00,0x24,0x00,0x1e,0x00,0x44,0x00,0x24,0x00,0x26,0xff,0xe5,0x00,0x24,0x00,0x2a,0xff,0xe5,0x00,0x24,0x00,0x2d,0x00,0x5e,0x00,0x24,0x00,0x32,0xff,0xe5,0x00,0x24,0x00,0x37,0xff,0x6d,0x00,0x24,0x00,0x38,0xff,0xe5, +0x00,0x24,0x00,0x39,0xff,0x8b,0x00,0x24,0x00,0x3a,0xff,0xb6,0x00,0x24,0x00,0x3c,0xff,0x64,0x00,0x24,0x00,0x3d,0x00,0x3b,0x00,0x24,0x00,0x57,0xff,0xe5,0x00,0x24,0x00,0x59,0xff,0xd5,0x00,0x24,0x00,0x5a,0xff,0xe5,0x00,0x24,0x00,0x5c,0xff,0xdb,0x00,0x24,0x00,0x8d,0xff,0x9a,0x00,0x24,0x00,0xb4,0xff,0x66,0x00,0x24,0x00,0xb5, +0xff,0x3f,0x00,0x24,0x00,0xb6,0xff,0x66,0x00,0x24,0x00,0xb7,0xff,0x3f,0x00,0x24,0x00,0xba,0xff,0xc1,0x00,0x24,0x00,0xbb,0xff,0x64,0x00,0x24,0x00,0xe5,0x00,0x3b,0x00,0x24,0x00,0xea,0xff,0x64,0x00,0x24,0x00,0xeb,0xff,0xdb,0x00,0x24,0x00,0xf7,0xff,0xe5,0x00,0x24,0x00,0xfc,0xff,0xe5,0x00,0x24,0x00,0xfe,0xff,0xe5,0x00,0x24, +0x01,0x18,0xff,0xe5,0x00,0x24,0x01,0x20,0xff,0x6d,0x00,0x24,0x01,0x21,0xff,0xe5,0x00,0x24,0x01,0x22,0xff,0x6d,0x00,0x24,0x01,0x23,0xff,0xe5,0x00,0x24,0x01,0x24,0xff,0xe5,0x00,0x24,0x01,0x26,0xff,0xe5,0x00,0x24,0x01,0x28,0x00,0x3b,0x00,0x24,0x01,0x2a,0x00,0x3b,0x00,0x24,0x01,0x47,0xff,0xe5,0x00,0x24,0x01,0x51,0xff,0xe5, +0x00,0x24,0x01,0x53,0xff,0xe5,0x00,0x24,0x01,0x55,0xff,0xe5,0x00,0x24,0x01,0x63,0x00,0x5e,0x00,0x24,0x01,0x6e,0xff,0xe5,0x00,0x24,0x01,0x70,0xff,0xe5,0x00,0x24,0x01,0x76,0xff,0x6d,0x00,0x24,0x01,0x77,0xff,0xe5,0x00,0x24,0x01,0x78,0xff,0xe5,0x00,0x24,0x01,0x7a,0xff,0xe5,0x00,0x24,0x01,0x7c,0xff,0xe5,0x00,0x24,0x01,0x7e, +0xff,0xe5,0x00,0x24,0x01,0x80,0xff,0xb6,0x00,0x24,0x01,0x81,0xff,0xe5,0x00,0x24,0x01,0x82,0xff,0x64,0x00,0x24,0x01,0x83,0xff,0xdb,0x00,0x24,0x01,0x89,0xff,0xe5,0x00,0x24,0x01,0x8c,0xff,0xb6,0x00,0x24,0x01,0x8d,0xff,0xe5,0x00,0x24,0x01,0x8e,0xff,0xb6,0x00,0x24,0x01,0x8f,0xff,0xe5,0x00,0x24,0x01,0x90,0xff,0xb6,0x00,0x24, +0x01,0x91,0xff,0xe5,0x00,0x24,0x01,0x92,0xff,0x64,0x00,0x24,0x01,0x93,0xff,0xdb,0x00,0x25,0x00,0x37,0xff,0xa4,0x00,0x25,0x00,0x3c,0xff,0xbe,0x00,0x25,0x00,0xbb,0xff,0xbe,0x00,0x25,0x00,0xc4,0xff,0xb2,0x00,0x25,0x00,0xc5,0xff,0xb2,0x00,0x25,0x00,0xea,0xff,0xbe,0x00,0x25,0x01,0x20,0xff,0xa4,0x00,0x25,0x01,0x22,0xff,0xa4, +0x00,0x25,0x01,0x76,0xff,0xa4,0x00,0x25,0x01,0x82,0xff,0xbe,0x00,0x25,0x01,0x92,0xff,0xbe,0x00,0x26,0x00,0x22,0x00,0x02,0x00,0x26,0x00,0x26,0xff,0xc9,0x00,0x26,0x00,0x2a,0xff,0xc9,0x00,0x26,0x00,0x32,0xff,0xe5,0x00,0x26,0x00,0x34,0xff,0xc9,0x00,0x26,0x00,0x64,0xff,0xc9,0x00,0x26,0x00,0x67,0xff,0xc9,0x00,0x26,0x00,0x77, +0x00,0x1d,0x00,0x26,0x00,0x92,0xff,0xc9,0x00,0x26,0x00,0xaa,0xff,0xcf,0x00,0x26,0x00,0xaf,0xff,0xc9,0x00,0x26,0x00,0xb0,0xff,0xc9,0x00,0x26,0x00,0xbe,0xff,0xcf,0x00,0x26,0x00,0xd0,0xff,0xc9,0x00,0x26,0x00,0xd1,0xff,0xc9,0x00,0x26,0x00,0xd2,0xff,0xc9,0x00,0x26,0x00,0xf7,0xff,0xc9,0x00,0x26,0x00,0xfc,0xff,0xc9,0x00,0x26, +0x00,0xfe,0xff,0xc9,0x00,0x26,0x01,0x18,0xff,0xe5,0x00,0x26,0x01,0x47,0xff,0xc9,0x00,0x26,0x01,0x51,0xff,0xc9,0x00,0x26,0x01,0x53,0xff,0xc9,0x00,0x26,0x01,0x55,0xff,0xc9,0x00,0x26,0x01,0x5c,0x00,0x1d,0x00,0x26,0x01,0x5e,0x00,0x1d,0x00,0x26,0x01,0x60,0x00,0x1d,0x00,0x26,0x01,0x6e,0xff,0xe5,0x00,0x26,0x01,0x70,0xff,0xe5, +0x00,0x26,0x01,0x89,0xff,0xe5,0x00,0x27,0x00,0x0f,0xff,0x7f,0x00,0x27,0x00,0x11,0xff,0x7f,0x00,0x27,0x00,0x24,0xff,0xdf,0x00,0x27,0x00,0x37,0xff,0xa4,0x00,0x27,0x00,0x3b,0xff,0xcb,0x00,0x27,0x00,0x3d,0xff,0xcf,0x00,0x27,0x00,0x62,0xff,0xdf,0x00,0x27,0x00,0x63,0xff,0xdf,0x00,0x27,0x00,0x91,0xff,0xb6,0x00,0x27,0x00,0xac, +0xff,0x7f,0x00,0x27,0x00,0xad,0xff,0xdf,0x00,0x27,0x00,0xae,0xff,0xdf,0x00,0x27,0x00,0xbb,0xff,0xf6,0x00,0x27,0x00,0xc4,0xff,0x8b,0x00,0x27,0x00,0xc5,0xff,0x8b,0x00,0x27,0x00,0xc7,0xff,0xdf,0x00,0x27,0x00,0xc9,0xff,0xdf,0x00,0x27,0x00,0xe5,0xff,0xcf,0x00,0x27,0x01,0x03,0xff,0xdf,0x00,0x27,0x01,0x05,0xff,0xdf,0x00,0x27, +0x01,0x20,0xff,0xa4,0x00,0x27,0x01,0x22,0xff,0xa4,0x00,0x27,0x01,0x28,0xff,0xcf,0x00,0x27,0x01,0x2a,0xff,0xcf,0x00,0x27,0x01,0x45,0xff,0xdf,0x00,0x27,0x01,0x76,0xff,0xa4,0x00,0x27,0x01,0x85,0xff,0xdf,0x00,0x27,0x01,0x87,0xff,0xdf,0x00,0x28,0x00,0x24,0x00,0x0a,0x00,0x28,0x00,0x2d,0x00,0x44,0x00,0x28,0x00,0x37,0x00,0x04, +0x00,0x28,0x00,0x3a,0x00,0x1d,0x00,0x28,0x00,0x3b,0x00,0x08,0x00,0x28,0x00,0x62,0x00,0x0a,0x00,0x28,0x00,0x63,0x00,0x0a,0x00,0x28,0x00,0x77,0x00,0x12,0x00,0x28,0x00,0xad,0x00,0x0a,0x00,0x28,0x00,0xae,0x00,0x0a,0x00,0x28,0x00,0xc7,0x00,0x0a,0x00,0x28,0x00,0xc9,0x00,0x0a,0x00,0x28,0x01,0x03,0x00,0x0a,0x00,0x28,0x01,0x05, +0x00,0x0a,0x00,0x28,0x01,0x20,0x00,0x04,0x00,0x28,0x01,0x22,0x00,0x04,0x00,0x28,0x01,0x45,0x00,0x0a,0x00,0x28,0x01,0x5c,0x00,0x12,0x00,0x28,0x01,0x5e,0x00,0x12,0x00,0x28,0x01,0x60,0x00,0x12,0x00,0x28,0x01,0x63,0x00,0x44,0x00,0x28,0x01,0x76,0x00,0x04,0x00,0x28,0x01,0x80,0x00,0x1d,0x00,0x28,0x01,0x85,0x00,0x0a,0x00,0x28, +0x01,0x87,0x00,0x0a,0x00,0x28,0x01,0x8c,0x00,0x1d,0x00,0x28,0x01,0x8e,0x00,0x1d,0x00,0x28,0x01,0x90,0x00,0x1d,0x00,0x29,0x00,0x0f,0xff,0x66,0x00,0x29,0x00,0x11,0xff,0x66,0x00,0x29,0x00,0x24,0xff,0x7b,0x00,0x29,0x00,0x2d,0xff,0xbe,0x00,0x29,0x00,0x36,0xff,0xe5,0x00,0x29,0x00,0x37,0x00,0x0e,0x00,0x29,0x00,0x44,0xff,0xb4, +0x00,0x29,0x00,0x49,0x00,0x0a,0x00,0x29,0x00,0x62,0xff,0x7b,0x00,0x29,0x00,0x63,0xff,0x7b,0x00,0x29,0x00,0x77,0x00,0x27,0x00,0x29,0x00,0x91,0xff,0x4c,0x00,0x29,0x00,0xac,0xff,0x66,0x00,0x29,0x00,0xad,0xff,0x7b,0x00,0x29,0x00,0xae,0xff,0x7b,0x00,0x29,0x00,0xc4,0xff,0x4a,0x00,0x29,0x00,0xc5,0xff,0x4a,0x00,0x29,0x00,0xc7, +0xff,0x7b,0x00,0x29,0x00,0xc9,0xff,0x7b,0x00,0x29,0x00,0xe3,0xff,0xe5,0x00,0x29,0x00,0xfa,0xff,0xe5,0x00,0x29,0x01,0x03,0xff,0x7b,0x00,0x29,0x01,0x05,0xff,0x7b,0x00,0x29,0x01,0x06,0xff,0xb4,0x00,0x29,0x01,0x1e,0xff,0xe5,0x00,0x29,0x01,0x20,0x00,0x0e,0x00,0x29,0x01,0x22,0x00,0x0e,0x00,0x29,0x01,0x45,0xff,0x7b,0x00,0x29, +0x01,0x5c,0x00,0x27,0x00,0x29,0x01,0x5e,0x00,0x27,0x00,0x29,0x01,0x60,0x00,0x27,0x00,0x29,0x01,0x63,0xff,0xbe,0x00,0x29,0x01,0x74,0xff,0xe5,0x00,0x29,0x01,0x76,0x00,0x0e,0x00,0x29,0x01,0x85,0xff,0x7b,0x00,0x29,0x01,0x87,0xff,0x7b,0x00,0x29,0x01,0x88,0xff,0xb4,0x00,0x29,0x02,0x3d,0xff,0xe5,0x00,0x2a,0x00,0x37,0xff,0xcf, +0x00,0x2a,0x00,0x39,0xff,0xe5,0x00,0x2a,0x00,0x5c,0xff,0xe5,0x00,0x2a,0x00,0xba,0xff,0xe5,0x00,0x2a,0x00,0xeb,0xff,0xe5,0x00,0x2a,0x01,0x20,0xff,0xcf,0x00,0x2a,0x01,0x22,0xff,0xcf,0x00,0x2a,0x01,0x76,0xff,0xcf,0x00,0x2a,0x01,0x83,0xff,0xe5,0x00,0x2a,0x01,0x93,0xff,0xe5,0x00,0x2d,0x00,0x0f,0xff,0x9a,0x00,0x2d,0x00,0x11, +0xff,0x9a,0x00,0x2d,0x00,0x24,0xff,0xdb,0x00,0x2d,0x00,0x2d,0xff,0xbe,0x00,0x2d,0x00,0x44,0xff,0xe5,0x00,0x2d,0x00,0x62,0xff,0xdb,0x00,0x2d,0x00,0x63,0xff,0xdb,0x00,0x2d,0x00,0x69,0xff,0xe5,0x00,0x2d,0x00,0x6a,0xff,0xe5,0x00,0x2d,0x00,0x6b,0xff,0xe5,0x00,0x2d,0x00,0x6c,0xff,0xe5,0x00,0x2d,0x00,0x6d,0xff,0xe5,0x00,0x2d, +0x00,0x6e,0xff,0xe5,0x00,0x2d,0x00,0x91,0xff,0x98,0x00,0x2d,0x00,0xa0,0xff,0xe5,0x00,0x2d,0x00,0xac,0xff,0x9a,0x00,0x2d,0x00,0xad,0xff,0xdb,0x00,0x2d,0x00,0xae,0xff,0xdb,0x00,0x2d,0x00,0xc4,0xff,0x66,0x00,0x2d,0x00,0xc5,0xff,0x9a,0x00,0x2d,0x00,0xc7,0xff,0xdb,0x00,0x2d,0x00,0xc9,0xff,0xdb,0x00,0x2d,0x01,0x03,0xff,0xdb, +0x00,0x2d,0x01,0x04,0xff,0xe5,0x00,0x2d,0x01,0x05,0xff,0xdb,0x00,0x2d,0x01,0x06,0xff,0xe5,0x00,0x2d,0x01,0x45,0xff,0xdb,0x00,0x2d,0x01,0x46,0xff,0xe5,0x00,0x2d,0x01,0x63,0xff,0xbe,0x00,0x2d,0x01,0x85,0xff,0xdb,0x00,0x2d,0x01,0x86,0xff,0xe5,0x00,0x2d,0x01,0x87,0xff,0xdb,0x00,0x2d,0x01,0x88,0xff,0xe5,0x00,0x2e,0x00,0x0f, +0x00,0x27,0x00,0x2e,0x00,0x1e,0x00,0x27,0x00,0x2e,0x00,0x26,0xff,0xa6,0x00,0x2e,0x00,0x2a,0xff,0xa6,0x00,0x2e,0x00,0x2d,0x00,0x5a,0x00,0x2e,0x00,0x32,0xff,0xa6,0x00,0x2e,0x00,0x34,0xff,0xa6,0x00,0x2e,0x00,0x3b,0x00,0x25,0x00,0x2e,0x00,0x3d,0x00,0x27,0x00,0x2e,0x00,0x46,0xff,0xe5,0x00,0x2e,0x00,0x47,0xff,0xe5,0x00,0x2e, +0x00,0x48,0xff,0xe5,0x00,0x2e,0x00,0x4a,0xff,0xe5,0x00,0x2e,0x00,0x52,0xff,0xe5,0x00,0x2e,0x00,0x54,0xff,0xe5,0x00,0x2e,0x00,0x57,0xff,0xd1,0x00,0x2e,0x00,0x59,0xff,0xb6,0x00,0x2e,0x00,0x5a,0xff,0xcb,0x00,0x2e,0x00,0x5c,0xff,0xa4,0x00,0x2e,0x00,0x64,0xff,0x9a,0x00,0x2e,0x00,0x67,0xff,0xa6,0x00,0x2e,0x00,0x6f,0xff,0xe5, +0x00,0x2e,0x00,0x70,0xff,0xe5,0x00,0x2e,0x00,0x71,0xff,0xe5,0x00,0x2e,0x00,0x72,0xff,0xe5,0x00,0x2e,0x00,0x73,0xff,0xe5,0x00,0x2e,0x00,0x74,0xff,0xcf,0x00,0x2e,0x00,0x77,0x00,0x27,0x00,0x2e,0x00,0x79,0xff,0xe5,0x00,0x2e,0x00,0x7a,0xff,0xe5,0x00,0x2e,0x00,0x7b,0xff,0xe5,0x00,0x2e,0x00,0x7c,0xff,0xe5,0x00,0x2e,0x00,0x7d, +0xff,0xe5,0x00,0x2e,0x00,0x92,0xff,0xa6,0x00,0x2e,0x00,0xaf,0xff,0xa6,0x00,0x2e,0x00,0xb0,0xff,0xa6,0x00,0x2e,0x00,0xb1,0xff,0xe5,0x00,0x2e,0x00,0xba,0xff,0xa4,0x00,0x2e,0x00,0xc4,0x00,0x44,0x00,0x2e,0x00,0xc5,0x00,0x44,0x00,0x2e,0x00,0xd0,0xff,0xa6,0x00,0x2e,0x00,0xd1,0xff,0xa6,0x00,0x2e,0x00,0xd2,0xff,0xa6,0x00,0x2e, +0x00,0xe5,0x00,0x27,0x00,0x2e,0x00,0xeb,0xff,0xa4,0x00,0x2e,0x00,0xf7,0xff,0xa6,0x00,0x2e,0x00,0xf8,0xff,0xe5,0x00,0x2e,0x00,0xfc,0xff,0xa6,0x00,0x2e,0x00,0xfd,0xff,0xe5,0x00,0x2e,0x00,0xfe,0xff,0xa6,0x00,0x2e,0x00,0xff,0xff,0xe5,0x00,0x2e,0x01,0x00,0xff,0xe5,0x00,0x2e,0x01,0x08,0xff,0xe5,0x00,0x2e,0x01,0x0b,0xff,0xe5, +0x00,0x2e,0x01,0x0d,0xff,0xe5,0x00,0x2e,0x01,0x18,0xff,0xa6,0x00,0x2e,0x01,0x19,0xff,0xe5,0x00,0x2e,0x01,0x21,0xff,0xd1,0x00,0x2e,0x01,0x23,0xff,0xd1,0x00,0x2e,0x01,0x28,0x00,0x27,0x00,0x2e,0x01,0x2a,0x00,0x27,0x00,0x2e,0x01,0x47,0xff,0xa6,0x00,0x2e,0x01,0x48,0xff,0xe5,0x00,0x2e,0x01,0x4c,0xff,0xe5,0x00,0x2e,0x01,0x4e, +0xff,0xe5,0x00,0x2e,0x01,0x50,0xff,0xe5,0x00,0x2e,0x01,0x51,0xff,0xa6,0x00,0x2e,0x01,0x52,0xff,0xe5,0x00,0x2e,0x01,0x53,0xff,0xa6,0x00,0x2e,0x01,0x54,0xff,0xe5,0x00,0x2e,0x01,0x55,0xff,0xa6,0x00,0x2e,0x01,0x56,0xff,0xe5,0x00,0x2e,0x01,0x5c,0x00,0x27,0x00,0x2e,0x01,0x5e,0x00,0x27,0x00,0x2e,0x01,0x60,0x00,0x27,0x00,0x2e, +0x01,0x63,0x00,0x5a,0x00,0x2e,0x01,0x6e,0xff,0xa6,0x00,0x2e,0x01,0x6f,0xff,0xe5,0x00,0x2e,0x01,0x70,0xff,0xa6,0x00,0x2e,0x01,0x71,0xff,0xe5,0x00,0x2e,0x01,0x77,0xff,0xd1,0x00,0x2e,0x01,0x81,0xff,0xcb,0x00,0x2e,0x01,0x83,0xff,0xa4,0x00,0x2e,0x01,0x89,0xff,0xa6,0x00,0x2e,0x01,0x8a,0xff,0xe5,0x00,0x2e,0x01,0x8d,0xff,0xcb, +0x00,0x2e,0x01,0x8f,0xff,0xcb,0x00,0x2e,0x01,0x91,0xff,0xcb,0x00,0x2e,0x01,0x93,0xff,0xa4,0x00,0x2f,0x00,0x0d,0xff,0x31,0x00,0x2f,0x00,0x22,0xff,0x9a,0x00,0x2f,0x00,0x24,0x00,0x3b,0x00,0x2f,0x00,0x26,0xff,0xbe,0x00,0x2f,0x00,0x2a,0xff,0xbe,0x00,0x2f,0x00,0x2d,0x00,0x64,0x00,0x2f,0x00,0x32,0xff,0xba,0x00,0x2f,0x00,0x34, +0xff,0xba,0x00,0x2f,0x00,0x37,0xff,0x8f,0x00,0x2f,0x00,0x38,0xff,0xe3,0x00,0x2f,0x00,0x39,0xff,0x8b,0x00,0x2f,0x00,0x3a,0xff,0xcf,0x00,0x2f,0x00,0x3c,0xff,0x7f,0x00,0x2f,0x00,0x3d,0x00,0x3b,0x00,0x2f,0x00,0x57,0xff,0xe5,0x00,0x2f,0x00,0x59,0xff,0x9a,0x00,0x2f,0x00,0x5a,0xff,0xbe,0x00,0x2f,0x00,0x5c,0xff,0xb4,0x00,0x2f, +0x00,0x64,0xff,0xbe,0x00,0x2f,0x00,0x67,0xff,0xba,0x00,0x2f,0x00,0x68,0xff,0xe3,0x00,0x2f,0x00,0x8d,0xff,0x9a,0x00,0x2f,0x00,0x92,0xff,0xba,0x00,0x2f,0x00,0xaf,0xff,0xba,0x00,0x2f,0x00,0xb0,0xff,0xba,0x00,0x2f,0x00,0xb4,0xff,0x73,0x00,0x2f,0x00,0xb5,0xff,0x8b,0x00,0x2f,0x00,0xb6,0xff,0x73,0x00,0x2f,0x00,0xb7,0xff,0x7f, +0x00,0x2f,0x00,0xba,0xff,0xb4,0x00,0x2f,0x00,0xbb,0xff,0x9a,0x00,0x2f,0x00,0xc4,0x00,0x44,0x00,0x2f,0x00,0xc5,0x00,0x44,0x00,0x2f,0x00,0xd0,0xff,0xba,0x00,0x2f,0x00,0xd1,0xff,0xba,0x00,0x2f,0x00,0xd2,0xff,0xba,0x00,0x2f,0x00,0xd3,0xff,0xe3,0x00,0x2f,0x00,0xd4,0xff,0xe3,0x00,0x2f,0x00,0xd5,0xff,0xe3,0x00,0x2f,0x00,0xe5, +0x00,0x3b,0x00,0x2f,0x00,0xea,0xff,0x7f,0x00,0x2f,0x00,0xeb,0xff,0xb4,0x00,0x2f,0x00,0xf7,0xff,0xbe,0x00,0x2f,0x00,0xfc,0xff,0xbe,0x00,0x2f,0x00,0xfe,0xff,0xbe,0x00,0x2f,0x01,0x03,0x00,0x3b,0x00,0x2f,0x01,0x05,0x00,0x3b,0x00,0x2f,0x01,0x18,0xff,0xba,0x00,0x2f,0x01,0x20,0xff,0x8f,0x00,0x2f,0x01,0x21,0xff,0xe5,0x00,0x2f, +0x01,0x22,0xff,0x8f,0x00,0x2f,0x01,0x23,0xff,0xe5,0x00,0x2f,0x01,0x24,0xff,0xe3,0x00,0x2f,0x01,0x26,0xff,0xe3,0x00,0x2f,0x01,0x28,0x00,0x3b,0x00,0x2f,0x01,0x2a,0x00,0x3b,0x00,0x2f,0x01,0x45,0x00,0x3b,0x00,0x2f,0x01,0x47,0xff,0xbe,0x00,0x2f,0x01,0x51,0xff,0xbe,0x00,0x2f,0x01,0x53,0xff,0xbe,0x00,0x2f,0x01,0x55,0xff,0xbe, +0x00,0x2f,0x01,0x63,0x00,0x64,0x00,0x2f,0x01,0x6e,0xff,0xba,0x00,0x2f,0x01,0x70,0xff,0xba,0x00,0x2f,0x01,0x76,0xff,0x8f,0x00,0x2f,0x01,0x77,0xff,0xe5,0x00,0x2f,0x01,0x78,0xff,0xe3,0x00,0x2f,0x01,0x7a,0xff,0xe3,0x00,0x2f,0x01,0x7c,0xff,0xe3,0x00,0x2f,0x01,0x7e,0xff,0xe3,0x00,0x2f,0x01,0x80,0xff,0xcf,0x00,0x2f,0x01,0x81, +0xff,0xbe,0x00,0x2f,0x01,0x82,0xff,0x7f,0x00,0x2f,0x01,0x83,0xff,0xb4,0x00,0x2f,0x01,0x85,0x00,0x3b,0x00,0x2f,0x01,0x87,0x00,0x3b,0x00,0x2f,0x01,0x89,0xff,0xba,0x00,0x2f,0x01,0x8c,0xff,0xcf,0x00,0x2f,0x01,0x8d,0xff,0xbe,0x00,0x2f,0x01,0x8e,0xff,0xcf,0x00,0x2f,0x01,0x8f,0xff,0xbe,0x00,0x2f,0x01,0x90,0xff,0xcf,0x00,0x2f, +0x01,0x91,0xff,0xbe,0x00,0x2f,0x01,0x92,0xff,0x7f,0x00,0x2f,0x01,0x93,0xff,0xb4,0x00,0x32,0x00,0x0f,0xff,0xa4,0x00,0x32,0x00,0x11,0xff,0xa4,0x00,0x32,0x00,0x24,0xff,0xe5,0x00,0x32,0x00,0x2d,0xff,0xf6,0x00,0x32,0x00,0x37,0xff,0xa4,0x00,0x32,0x00,0x3b,0xff,0xdb,0x00,0x32,0x00,0x3c,0xff,0xe7,0x00,0x32,0x00,0x3d,0xff,0xcf, +0x00,0x32,0x00,0x62,0xff,0xe5,0x00,0x32,0x00,0x63,0xff,0xe5,0x00,0x32,0x00,0xac,0xff,0xa4,0x00,0x32,0x00,0xad,0xff,0xe5,0x00,0x32,0x00,0xae,0xff,0xe5,0x00,0x32,0x00,0xbb,0xff,0xf6,0x00,0x32,0x00,0xc4,0xff,0x4c,0x00,0x32,0x00,0xc5,0xff,0x98,0x00,0x32,0x00,0xc7,0xff,0xe5,0x00,0x32,0x00,0xc9,0xff,0xe5,0x00,0x32,0x00,0xe5, +0xff,0xcf,0x00,0x32,0x00,0xea,0xff,0xe7,0x00,0x32,0x01,0x03,0xff,0xe5,0x00,0x32,0x01,0x05,0xff,0xe5,0x00,0x32,0x01,0x20,0xff,0xa4,0x00,0x32,0x01,0x22,0xff,0xa4,0x00,0x32,0x01,0x28,0xff,0xcf,0x00,0x32,0x01,0x2a,0xff,0xcf,0x00,0x32,0x01,0x45,0xff,0xe5,0x00,0x32,0x01,0x63,0xff,0xf6,0x00,0x32,0x01,0x76,0xff,0xa4,0x00,0x32, +0x01,0x82,0xff,0xe7,0x00,0x32,0x01,0x85,0xff,0xe5,0x00,0x32,0x01,0x87,0xff,0xe5,0x00,0x32,0x01,0x92,0xff,0xe7,0x00,0x33,0x00,0x0f,0xfe,0xba,0x00,0x33,0x00,0x11,0xfe,0xba,0x00,0x33,0x00,0x24,0xff,0x62,0x00,0x33,0x00,0x2a,0xff,0xf6,0x00,0x33,0x00,0x2d,0xff,0x7f,0x00,0x33,0x00,0x3a,0x00,0x27,0x00,0x33,0x00,0x3b,0xff,0xc3, +0x00,0x33,0x00,0x44,0xff,0xbe,0x00,0x33,0x00,0x46,0xff,0xb4,0x00,0x33,0x00,0x47,0xff,0xb4,0x00,0x33,0x00,0x48,0xff,0xb4,0x00,0x33,0x00,0x4a,0xff,0xb4,0x00,0x33,0x00,0x52,0xff,0xb4,0x00,0x33,0x00,0x54,0xff,0xb6,0x00,0x33,0x00,0x62,0xff,0x62,0x00,0x33,0x00,0x63,0xff,0x62,0x00,0x33,0x00,0x69,0xff,0xbe,0x00,0x33,0x00,0x6a, +0xff,0xbe,0x00,0x33,0x00,0x6b,0xff,0xbe,0x00,0x33,0x00,0x6c,0xff,0xbe,0x00,0x33,0x00,0x6d,0xff,0xbe,0x00,0x33,0x00,0x6e,0xff,0xbe,0x00,0x33,0x00,0x6f,0xff,0xb4,0x00,0x33,0x00,0x70,0xff,0xb4,0x00,0x33,0x00,0x71,0xff,0xb4,0x00,0x33,0x00,0x72,0xff,0xb4,0x00,0x33,0x00,0x73,0xff,0xb4,0x00,0x33,0x00,0x79,0xff,0xb4,0x00,0x33, +0x00,0x7a,0xff,0xb4,0x00,0x33,0x00,0x7b,0xff,0xb4,0x00,0x33,0x00,0x7c,0xff,0xb4,0x00,0x33,0x00,0x7d,0xff,0xb4,0x00,0x33,0x00,0x91,0xfe,0xe9,0x00,0x33,0x00,0xa0,0xff,0xbe,0x00,0x33,0x00,0xac,0xfe,0xba,0x00,0x33,0x00,0xad,0xff,0x62,0x00,0x33,0x00,0xae,0xff,0x62,0x00,0x33,0x00,0xb1,0xff,0xb4,0x00,0x33,0x00,0xc4,0xfe,0xba, +0x00,0x33,0x00,0xc5,0xfe,0xae,0x00,0x33,0x00,0xc7,0xff,0x62,0x00,0x33,0x00,0xc9,0xff,0x62,0x00,0x33,0x00,0xf7,0xff,0xf6,0x00,0x33,0x00,0xf8,0xff,0xb4,0x00,0x33,0x00,0xfd,0xff,0xb4,0x00,0x33,0x00,0xff,0xff,0xb4,0x00,0x33,0x01,0x00,0xff,0xb4,0x00,0x33,0x01,0x03,0xff,0x62,0x00,0x33,0x01,0x04,0xff,0xbe,0x00,0x33,0x01,0x05, +0xff,0x62,0x00,0x33,0x01,0x06,0xff,0xbe,0x00,0x33,0x01,0x08,0xff,0xb4,0x00,0x33,0x01,0x0b,0xff,0xb4,0x00,0x33,0x01,0x0d,0xff,0xb4,0x00,0x33,0x01,0x19,0xff,0xb4,0x00,0x33,0x01,0x45,0xff,0x62,0x00,0x33,0x01,0x46,0xff,0xbe,0x00,0x33,0x01,0x48,0xff,0xb4,0x00,0x33,0x01,0x4c,0xff,0xb4,0x00,0x33,0x01,0x4e,0xff,0xb4,0x00,0x33, +0x01,0x50,0xff,0xb4,0x00,0x33,0x01,0x51,0xff,0xf6,0x00,0x33,0x01,0x52,0xff,0xb4,0x00,0x33,0x01,0x53,0xff,0xf6,0x00,0x33,0x01,0x54,0xff,0xb4,0x00,0x33,0x01,0x55,0xff,0xf6,0x00,0x33,0x01,0x56,0xff,0xb4,0x00,0x33,0x01,0x63,0xff,0x7f,0x00,0x33,0x01,0x6f,0xff,0xb4,0x00,0x33,0x01,0x71,0xff,0xb4,0x00,0x33,0x01,0x80,0x00,0x27, +0x00,0x33,0x01,0x85,0xff,0x62,0x00,0x33,0x01,0x86,0xff,0xbe,0x00,0x33,0x01,0x87,0xff,0x62,0x00,0x33,0x01,0x88,0xff,0xbe,0x00,0x33,0x01,0x8a,0xff,0xb4,0x00,0x33,0x01,0x8c,0x00,0x27,0x00,0x33,0x01,0x8e,0x00,0x27,0x00,0x33,0x01,0x90,0x00,0x27,0x00,0x34,0x00,0x0f,0xff,0xa4,0x00,0x34,0x00,0x11,0xff,0x7f,0x00,0x34,0x00,0x24, +0xff,0xe5,0x00,0x34,0x00,0x37,0xff,0xa4,0x00,0x34,0x00,0x3b,0xff,0xdb,0x00,0x34,0x00,0x3c,0xff,0xf6,0x00,0x34,0x00,0x3d,0xff,0xcf,0x00,0x34,0x00,0x62,0xff,0xe5,0x00,0x34,0x00,0x63,0xff,0xe5,0x00,0x34,0x00,0xac,0xff,0x7f,0x00,0x34,0x00,0xad,0xff,0xe5,0x00,0x34,0x00,0xae,0xff,0xe5,0x00,0x34,0x00,0xbb,0xff,0xf6,0x00,0x34, +0x00,0xc4,0xff,0x98,0x00,0x34,0x00,0xc5,0xff,0x98,0x00,0x34,0x00,0xc7,0xff,0xe5,0x00,0x34,0x00,0xc9,0xff,0xe5,0x00,0x34,0x00,0xe5,0xff,0xcf,0x00,0x34,0x00,0xea,0xff,0xf6,0x00,0x34,0x01,0x03,0xff,0xe5,0x00,0x34,0x01,0x05,0xff,0xe5,0x00,0x34,0x01,0x20,0xff,0xa4,0x00,0x34,0x01,0x22,0xff,0xa4,0x00,0x34,0x01,0x28,0xff,0xcf, +0x00,0x34,0x01,0x2a,0xff,0xcf,0x00,0x34,0x01,0x45,0xff,0xe5,0x00,0x34,0x01,0x76,0xff,0xa4,0x00,0x34,0x01,0x82,0xff,0xf6,0x00,0x34,0x01,0x85,0xff,0xe5,0x00,0x34,0x01,0x87,0xff,0xe5,0x00,0x34,0x01,0x92,0xff,0xf6,0x00,0x35,0x00,0x1e,0x00,0x52,0x00,0x35,0x00,0x26,0xff,0xe3,0x00,0x35,0x00,0x2a,0xff,0xe3,0x00,0x35,0x00,0x2d, +0x00,0x39,0x00,0x35,0x00,0x32,0xff,0xec,0x00,0x35,0x00,0x34,0xff,0xec,0x00,0x35,0x00,0x37,0xff,0xcb,0x00,0x35,0x00,0x3c,0xff,0xd9,0x00,0x35,0x00,0x46,0xff,0xcb,0x00,0x35,0x00,0x47,0xff,0xcb,0x00,0x35,0x00,0x48,0xff,0xc7,0x00,0x35,0x00,0x4a,0xff,0xc7,0x00,0x35,0x00,0x52,0xff,0xc5,0x00,0x35,0x00,0x54,0xff,0xcb,0x00,0x35, +0x00,0x64,0xff,0xe5,0x00,0x35,0x00,0x67,0xff,0xec,0x00,0x35,0x00,0x6f,0xff,0xbe,0x00,0x35,0x00,0x70,0xff,0xbe,0x00,0x35,0x00,0x71,0xff,0xbe,0x00,0x35,0x00,0x72,0xff,0xbe,0x00,0x35,0x00,0x73,0xff,0xbe,0x00,0x35,0x00,0x79,0xff,0xc5,0x00,0x35,0x00,0x7a,0xff,0xc5,0x00,0x35,0x00,0x7b,0xff,0xc5,0x00,0x35,0x00,0x7c,0xff,0xc5, +0x00,0x35,0x00,0x7d,0xff,0xc5,0x00,0x35,0x00,0x92,0xff,0xec,0x00,0x35,0x00,0xaf,0xff,0xec,0x00,0x35,0x00,0xb0,0xff,0xec,0x00,0x35,0x00,0xb1,0xff,0xc5,0x00,0x35,0x00,0xbb,0xff,0xe5,0x00,0x35,0x00,0xd0,0xff,0xec,0x00,0x35,0x00,0xd1,0xff,0xec,0x00,0x35,0x00,0xd2,0xff,0xec,0x00,0x35,0x00,0xea,0xff,0xd9,0x00,0x35,0x00,0xf7, +0xff,0xe3,0x00,0x35,0x00,0xf8,0xff,0xc7,0x00,0x35,0x00,0xfc,0xff,0xe3,0x00,0x35,0x00,0xfd,0xff,0xcb,0x00,0x35,0x00,0xfe,0xff,0xe3,0x00,0x35,0x00,0xff,0xff,0xcb,0x00,0x35,0x01,0x00,0xff,0xcb,0x00,0x35,0x01,0x08,0xff,0xcb,0x00,0x35,0x01,0x0b,0xff,0xc7,0x00,0x35,0x01,0x0d,0xff,0xbe,0x00,0x35,0x01,0x18,0xff,0xec,0x00,0x35, +0x01,0x19,0xff,0xc5,0x00,0x35,0x01,0x20,0xff,0xcb,0x00,0x35,0x01,0x22,0xff,0xcb,0x00,0x35,0x01,0x47,0xff,0xe3,0x00,0x35,0x01,0x48,0xff,0xcb,0x00,0x35,0x01,0x4c,0xff,0xbe,0x00,0x35,0x01,0x4e,0xff,0xbe,0x00,0x35,0x01,0x50,0xff,0xbe,0x00,0x35,0x01,0x51,0xff,0xe3,0x00,0x35,0x01,0x52,0xff,0xc7,0x00,0x35,0x01,0x53,0xff,0xe3, +0x00,0x35,0x01,0x54,0xff,0xc7,0x00,0x35,0x01,0x55,0xff,0xe3,0x00,0x35,0x01,0x56,0xff,0xc7,0x00,0x35,0x01,0x63,0x00,0x39,0x00,0x35,0x01,0x6e,0xff,0xec,0x00,0x35,0x01,0x6f,0xff,0xc5,0x00,0x35,0x01,0x70,0xff,0xec,0x00,0x35,0x01,0x71,0xff,0xc5,0x00,0x35,0x01,0x76,0xff,0xcb,0x00,0x35,0x01,0x82,0xff,0xd9,0x00,0x35,0x01,0x89, +0xff,0xec,0x00,0x35,0x01,0x8a,0xff,0xc5,0x00,0x35,0x01,0x92,0xff,0xd9,0x00,0x36,0x00,0x57,0xff,0xbe,0x00,0x36,0x00,0x59,0xff,0xcf,0x00,0x36,0x00,0x5a,0xff,0xe5,0x00,0x36,0x00,0x5c,0xff,0xd1,0x00,0x36,0x00,0xba,0xff,0xbe,0x00,0x36,0x00,0xc4,0xff,0xb2,0x00,0x36,0x00,0xc5,0xff,0xb2,0x00,0x36,0x00,0xeb,0xff,0xd1,0x00,0x36, +0x01,0x21,0xff,0xbe,0x00,0x36,0x01,0x23,0xff,0xbe,0x00,0x36,0x01,0x77,0xff,0xbe,0x00,0x36,0x01,0x81,0xff,0xe5,0x00,0x36,0x01,0x83,0xff,0xd1,0x00,0x36,0x01,0x8d,0xff,0xe5,0x00,0x36,0x01,0x8f,0xff,0xe5,0x00,0x36,0x01,0x91,0xff,0xe5,0x00,0x36,0x01,0x93,0xff,0xd1,0x00,0x37,0x00,0x0f,0xff,0x7f,0x00,0x37,0x00,0x11,0xff,0x4c, +0x00,0x37,0x00,0x1d,0xff,0xe9,0x00,0x37,0x00,0x1e,0xff,0xe9,0x00,0x37,0x00,0x24,0xff,0x66,0x00,0x37,0x00,0x26,0xff,0xa4,0x00,0x37,0x00,0x2a,0xff,0xa4,0x00,0x37,0x00,0x2d,0xff,0x8f,0x00,0x37,0x00,0x32,0xff,0xa4,0x00,0x37,0x00,0x34,0xff,0xa4,0x00,0x37,0x00,0x37,0x00,0x27,0x00,0x37,0x00,0x39,0x00,0x2b,0x00,0x37,0x00,0x3a, +0x00,0x27,0x00,0x37,0x00,0x3b,0xff,0xfa,0x00,0x37,0x00,0x3c,0x00,0x1d,0x00,0x37,0x00,0x44,0xff,0x27,0x00,0x37,0x00,0x46,0xff,0x2d,0x00,0x37,0x00,0x47,0xff,0x2d,0x00,0x37,0x00,0x48,0xff,0x2d,0x00,0x37,0x00,0x49,0xff,0xa0,0x00,0x37,0x00,0x4a,0xff,0x2d,0x00,0x37,0x00,0x50,0xff,0x4e,0x00,0x37,0x00,0x51,0xff,0x4e,0x00,0x37, +0x00,0x52,0xff,0x2d,0x00,0x37,0x00,0x53,0xff,0x4e,0x00,0x37,0x00,0x54,0xff,0x2d,0x00,0x37,0x00,0x55,0xff,0x4e,0x00,0x37,0x00,0x56,0xff,0x66,0x00,0x37,0x00,0x58,0xff,0x4e,0x00,0x37,0x00,0x59,0xff,0x9a,0x00,0x37,0x00,0x5a,0xff,0x8f,0x00,0x37,0x00,0x5b,0xff,0x4c,0x00,0x37,0x00,0x5c,0xff,0x8f,0x00,0x37,0x00,0x5d,0xff,0x7f, +0x00,0x37,0x00,0x62,0xff,0x66,0x00,0x37,0x00,0x63,0xff,0x66,0x00,0x37,0x00,0x64,0xff,0xa4,0x00,0x37,0x00,0x67,0xff,0xa4,0x00,0x37,0x00,0x69,0xff,0x27,0x00,0x37,0x00,0x6a,0xff,0x27,0x00,0x37,0x00,0x6b,0xff,0x27,0x00,0x37,0x00,0x6c,0xff,0x27,0x00,0x37,0x00,0x6d,0xff,0x3f,0x00,0x37,0x00,0x6e,0xff,0x27,0x00,0x37,0x00,0x6f, +0xff,0x1b,0x00,0x37,0x00,0x70,0xff,0x2d,0x00,0x37,0x00,0x71,0xff,0x2d,0x00,0x37,0x00,0x72,0xff,0x2d,0x00,0x37,0x00,0x73,0xff,0x2d,0x00,0x37,0x00,0x74,0xff,0xe9,0x00,0x37,0x00,0x76,0x00,0x31,0x00,0x37,0x00,0x77,0x00,0x6f,0x00,0x37,0x00,0x78,0xff,0x4e,0x00,0x37,0x00,0x79,0xff,0x2d,0x00,0x37,0x00,0x7a,0xff,0x2d,0x00,0x37, +0x00,0x7b,0xff,0x2d,0x00,0x37,0x00,0x7c,0xff,0x2d,0x00,0x37,0x00,0x7d,0xff,0x2d,0x00,0x37,0x00,0x7e,0xff,0x4e,0x00,0x37,0x00,0x7f,0xff,0x4e,0x00,0x37,0x00,0x80,0xff,0x4e,0x00,0x37,0x00,0x81,0xff,0x4e,0x00,0x37,0x00,0x8d,0x00,0x52,0x00,0x37,0x00,0x91,0xff,0x0c,0x00,0x37,0x00,0x92,0xff,0xa4,0x00,0x37,0x00,0xa0,0xff,0x27, +0x00,0x37,0x00,0xaa,0xff,0x9a,0x00,0x37,0x00,0xab,0xff,0xcf,0x00,0x37,0x00,0xac,0xff,0x4c,0x00,0x37,0x00,0xad,0xff,0x66,0x00,0x37,0x00,0xae,0xff,0x66,0x00,0x37,0x00,0xaf,0xff,0xa4,0x00,0x37,0x00,0xb0,0xff,0xa4,0x00,0x37,0x00,0xb1,0xff,0x2d,0x00,0x37,0x00,0xb5,0x00,0x27,0x00,0x37,0x00,0xb7,0x00,0x27,0x00,0x37,0x00,0xba, +0xff,0x8f,0x00,0x37,0x00,0xbe,0xff,0x9a,0x00,0x37,0x00,0xbf,0xff,0xcf,0x00,0x37,0x00,0xc4,0xff,0x17,0x00,0x37,0x00,0xc5,0xff,0x17,0x00,0x37,0x00,0xc7,0xff,0x66,0x00,0x37,0x00,0xc9,0xff,0x66,0x00,0x37,0x00,0xd0,0xff,0xa4,0x00,0x37,0x00,0xd1,0xff,0xa4,0x00,0x37,0x00,0xd2,0xff,0xa4,0x00,0x37,0x00,0xe4,0xff,0x66,0x00,0x37, +0x00,0xe6,0xff,0x7f,0x00,0x37,0x00,0xea,0x00,0x1d,0x00,0x37,0x00,0xeb,0xff,0x8f,0x00,0x37,0x00,0xf7,0xff,0xa4,0x00,0x37,0x00,0xf8,0xff,0x2d,0x00,0x37,0x00,0xfb,0xff,0x66,0x00,0x37,0x00,0xfc,0xff,0xa4,0x00,0x37,0x00,0xfd,0xff,0x2d,0x00,0x37,0x00,0xfe,0xff,0xa4,0x00,0x37,0x00,0xff,0xff,0x2d,0x00,0x37,0x01,0x00,0xff,0x2d, +0x00,0x37,0x01,0x03,0xff,0x66,0x00,0x37,0x01,0x04,0xff,0x27,0x00,0x37,0x01,0x05,0xff,0x66,0x00,0x37,0x01,0x06,0xff,0x27,0x00,0x37,0x01,0x08,0xff,0x2d,0x00,0x37,0x01,0x0b,0xff,0x2d,0x00,0x37,0x01,0x0d,0xff,0x2d,0x00,0x37,0x01,0x15,0xff,0x4e,0x00,0x37,0x01,0x17,0xff,0x4e,0x00,0x37,0x01,0x18,0xff,0xa4,0x00,0x37,0x01,0x19, +0xff,0x2d,0x00,0x37,0x01,0x1b,0xff,0x4e,0x00,0x37,0x01,0x1d,0xff,0x4e,0x00,0x37,0x01,0x1f,0xff,0x66,0x00,0x37,0x01,0x20,0x00,0x27,0x00,0x37,0x01,0x22,0x00,0x27,0x00,0x37,0x01,0x25,0xff,0x4e,0x00,0x37,0x01,0x27,0xff,0x4e,0x00,0x37,0x01,0x29,0xff,0x7f,0x00,0x37,0x01,0x2b,0xff,0x7f,0x00,0x37,0x01,0x45,0xff,0x66,0x00,0x37, +0x01,0x46,0xff,0x27,0x00,0x37,0x01,0x47,0xff,0xa4,0x00,0x37,0x01,0x48,0xff,0x2d,0x00,0x37,0x01,0x4c,0xff,0x2d,0x00,0x37,0x01,0x4e,0xff,0x2d,0x00,0x37,0x01,0x50,0xff,0x2d,0x00,0x37,0x01,0x51,0xff,0xa4,0x00,0x37,0x01,0x52,0xff,0x2d,0x00,0x37,0x01,0x53,0xff,0xa4,0x00,0x37,0x01,0x54,0xff,0x2d,0x00,0x37,0x01,0x55,0xff,0xa4, +0x00,0x37,0x01,0x56,0xff,0x2d,0x00,0x37,0x01,0x5c,0x00,0x6f,0x00,0x37,0x01,0x5e,0x00,0x6f,0x00,0x37,0x01,0x60,0x00,0x6f,0x00,0x37,0x01,0x63,0xff,0x8f,0x00,0x37,0x01,0x6d,0xff,0x4e,0x00,0x37,0x01,0x6e,0xff,0xa4,0x00,0x37,0x01,0x6f,0xff,0x2d,0x00,0x37,0x01,0x70,0xff,0xa4,0x00,0x37,0x01,0x71,0xff,0x2d,0x00,0x37,0x01,0x73, +0xff,0x4e,0x00,0x37,0x01,0x75,0xff,0x66,0x00,0x37,0x01,0x76,0x00,0x27,0x00,0x37,0x01,0x79,0xff,0x4e,0x00,0x37,0x01,0x7b,0xff,0x4e,0x00,0x37,0x01,0x7d,0xff,0x4e,0x00,0x37,0x01,0x7f,0xff,0x4e,0x00,0x37,0x01,0x80,0x00,0x27,0x00,0x37,0x01,0x81,0xff,0x8f,0x00,0x37,0x01,0x82,0x00,0x1d,0x00,0x37,0x01,0x83,0xff,0x8f,0x00,0x37, +0x01,0x85,0xff,0x66,0x00,0x37,0x01,0x86,0xff,0x27,0x00,0x37,0x01,0x87,0xff,0x66,0x00,0x37,0x01,0x88,0xff,0x27,0x00,0x37,0x01,0x89,0xff,0xa4,0x00,0x37,0x01,0x8a,0xff,0x2d,0x00,0x37,0x01,0x8c,0x00,0x27,0x00,0x37,0x01,0x8d,0xff,0x8f,0x00,0x37,0x01,0x8e,0x00,0x27,0x00,0x37,0x01,0x8f,0xff,0x8f,0x00,0x37,0x01,0x90,0x00,0x27, +0x00,0x37,0x01,0x91,0xff,0x8f,0x00,0x37,0x01,0x92,0x00,0x1d,0x00,0x37,0x01,0x93,0xff,0x8f,0x00,0x37,0x02,0x3e,0xff,0x66,0x00,0x38,0x00,0x24,0xff,0xd7,0x00,0x38,0x00,0x91,0xff,0x8b,0x00,0x38,0x00,0xc4,0xff,0xa6,0x00,0x38,0x00,0xc5,0xff,0xa6,0x00,0x38,0x01,0x03,0xff,0xd7,0x00,0x38,0x01,0x05,0xff,0xd7,0x00,0x38,0x01,0x45, +0xff,0xd7,0x00,0x38,0x01,0x85,0xff,0xd7,0x00,0x38,0x01,0x87,0xff,0xd7,0x00,0x39,0x00,0x0f,0xff,0x33,0x00,0x39,0x00,0x11,0xff,0x1b,0x00,0x39,0x00,0x24,0xff,0x8b,0x00,0x39,0x00,0x26,0xff,0xd5,0x00,0x39,0x00,0x2a,0xff,0xd5,0x00,0x39,0x00,0x2d,0xff,0xba,0x00,0x39,0x00,0x32,0xff,0xf4,0x00,0x39,0x00,0x34,0xff,0xd5,0x00,0x39, +0x00,0x36,0xff,0xe5,0x00,0x39,0x00,0x37,0x00,0x27,0x00,0x39,0x00,0x44,0xff,0x6d,0x00,0x39,0x00,0x46,0xff,0x7f,0x00,0x39,0x00,0x47,0xff,0x7f,0x00,0x39,0x00,0x48,0xff,0x7f,0x00,0x39,0x00,0x4a,0xff,0x7f,0x00,0x39,0x00,0x50,0xff,0xb4,0x00,0x39,0x00,0x51,0xff,0xb4,0x00,0x39,0x00,0x52,0xff,0x7f,0x00,0x39,0x00,0x53,0xff,0xb4, +0x00,0x39,0x00,0x54,0xff,0x7f,0x00,0x39,0x00,0x55,0xff,0xb4,0x00,0x39,0x00,0x56,0xff,0xbe,0x00,0x39,0x00,0x58,0xff,0xb4,0x00,0x39,0x00,0x62,0xff,0x8b,0x00,0x39,0x00,0x63,0xff,0x8b,0x00,0x39,0x00,0x64,0xff,0xe1,0x00,0x39,0x00,0x67,0xff,0xf4,0x00,0x39,0x00,0x69,0xff,0x6d,0x00,0x39,0x00,0x6a,0xff,0x6d,0x00,0x39,0x00,0x6b, +0xff,0x6d,0x00,0x39,0x00,0x6c,0xff,0x6d,0x00,0x39,0x00,0x6d,0xff,0x6d,0x00,0x39,0x00,0x6e,0xff,0x6d,0x00,0x39,0x00,0x6f,0xff,0x7f,0x00,0x39,0x00,0x70,0xff,0x7f,0x00,0x39,0x00,0x71,0xff,0x7f,0x00,0x39,0x00,0x72,0xff,0x7f,0x00,0x39,0x00,0x73,0xff,0x7f,0x00,0x39,0x00,0x76,0x00,0x1d,0x00,0x39,0x00,0x77,0x00,0x5a,0x00,0x39, +0x00,0x78,0xff,0xb4,0x00,0x39,0x00,0x79,0xff,0x7f,0x00,0x39,0x00,0x7a,0xff,0x7f,0x00,0x39,0x00,0x7b,0xff,0x7f,0x00,0x39,0x00,0x7c,0xff,0x7f,0x00,0x39,0x00,0x7d,0xff,0x7f,0x00,0x39,0x00,0x7e,0xff,0xb4,0x00,0x39,0x00,0x7f,0xff,0xb4,0x00,0x39,0x00,0x80,0xff,0xb4,0x00,0x39,0x00,0x81,0xff,0xb4,0x00,0x39,0x00,0x8d,0x00,0x52, +0x00,0x39,0x00,0x91,0xff,0x44,0x00,0x39,0x00,0x92,0xff,0xf4,0x00,0x39,0x00,0xa0,0xff,0x6d,0x00,0x39,0x00,0xa2,0xff,0x75,0x00,0x39,0x00,0xaa,0xff,0xcf,0x00,0x39,0x00,0xac,0xff,0x1b,0x00,0x39,0x00,0xad,0xff,0x8b,0x00,0x39,0x00,0xae,0xff,0x8b,0x00,0x39,0x00,0xaf,0xff,0xf4,0x00,0x39,0x00,0xb0,0xff,0xf4,0x00,0x39,0x00,0xb1, +0xff,0x7f,0x00,0x39,0x00,0xbe,0xff,0xcf,0x00,0x39,0x00,0xc4,0xff,0x73,0x00,0x39,0x00,0xc5,0xff,0x7f,0x00,0x39,0x00,0xc7,0xff,0x8b,0x00,0x39,0x00,0xc9,0xff,0x8b,0x00,0x39,0x00,0xd0,0xff,0xf4,0x00,0x39,0x00,0xd1,0xff,0xf4,0x00,0x39,0x00,0xd2,0xff,0xf4,0x00,0x39,0x00,0xe3,0xff,0xe5,0x00,0x39,0x00,0xe4,0xff,0xbe,0x00,0x39, +0x00,0xf7,0xff,0xd5,0x00,0x39,0x00,0xf8,0xff,0x7f,0x00,0x39,0x00,0xfa,0xff,0xe5,0x00,0x39,0x00,0xfb,0xff,0xbe,0x00,0x39,0x00,0xfc,0xff,0xd5,0x00,0x39,0x00,0xfd,0xff,0x7f,0x00,0x39,0x00,0xfe,0xff,0xd5,0x00,0x39,0x00,0xff,0xff,0x7f,0x00,0x39,0x01,0x00,0xff,0x7f,0x00,0x39,0x01,0x03,0xff,0x8b,0x00,0x39,0x01,0x04,0xff,0x6d, +0x00,0x39,0x01,0x05,0xff,0x8b,0x00,0x39,0x01,0x06,0xff,0x6d,0x00,0x39,0x01,0x08,0xff,0x7f,0x00,0x39,0x01,0x0b,0xff,0x7f,0x00,0x39,0x01,0x0d,0xff,0x7f,0x00,0x39,0x01,0x15,0xff,0xb4,0x00,0x39,0x01,0x17,0xff,0xb4,0x00,0x39,0x01,0x18,0xff,0xf4,0x00,0x39,0x01,0x19,0xff,0x7f,0x00,0x39,0x01,0x1b,0xff,0xb4,0x00,0x39,0x01,0x1d, +0xff,0xb4,0x00,0x39,0x01,0x1e,0xff,0xe5,0x00,0x39,0x01,0x1f,0xff,0xbe,0x00,0x39,0x01,0x20,0x00,0x27,0x00,0x39,0x01,0x22,0x00,0x27,0x00,0x39,0x01,0x25,0xff,0xb4,0x00,0x39,0x01,0x27,0xff,0xb4,0x00,0x39,0x01,0x45,0xff,0x8b,0x00,0x39,0x01,0x46,0xff,0x6d,0x00,0x39,0x01,0x47,0xff,0xd5,0x00,0x39,0x01,0x48,0xff,0x7f,0x00,0x39, +0x01,0x4c,0xff,0x7f,0x00,0x39,0x01,0x4e,0xff,0x7f,0x00,0x39,0x01,0x50,0xff,0x7f,0x00,0x39,0x01,0x51,0xff,0xd5,0x00,0x39,0x01,0x52,0xff,0x7f,0x00,0x39,0x01,0x53,0xff,0xd5,0x00,0x39,0x01,0x54,0xff,0x7f,0x00,0x39,0x01,0x55,0xff,0xd5,0x00,0x39,0x01,0x56,0xff,0x7f,0x00,0x39,0x01,0x5c,0x00,0x5a,0x00,0x39,0x01,0x5e,0x00,0x5a, +0x00,0x39,0x01,0x60,0x00,0x5a,0x00,0x39,0x01,0x63,0xff,0xba,0x00,0x39,0x01,0x6d,0xff,0xb4,0x00,0x39,0x01,0x6e,0xff,0xf4,0x00,0x39,0x01,0x6f,0xff,0x7f,0x00,0x39,0x01,0x70,0xff,0xf4,0x00,0x39,0x01,0x71,0xff,0x7f,0x00,0x39,0x01,0x73,0xff,0xb4,0x00,0x39,0x01,0x74,0xff,0xe5,0x00,0x39,0x01,0x75,0xff,0xbe,0x00,0x39,0x01,0x76, +0x00,0x27,0x00,0x39,0x01,0x79,0xff,0xb4,0x00,0x39,0x01,0x7b,0xff,0xb4,0x00,0x39,0x01,0x7d,0xff,0xb4,0x00,0x39,0x01,0x7f,0xff,0xb4,0x00,0x39,0x01,0x85,0xff,0x8b,0x00,0x39,0x01,0x86,0xff,0x6d,0x00,0x39,0x01,0x87,0xff,0x8b,0x00,0x39,0x01,0x88,0xff,0x6d,0x00,0x39,0x01,0x89,0xff,0xf4,0x00,0x39,0x01,0x8a,0xff,0x7f,0x00,0x39, +0x02,0x3d,0xff,0xe5,0x00,0x39,0x02,0x3e,0xff,0xbe,0x00,0x3a,0x00,0x0f,0xff,0x8b,0x00,0x3a,0x00,0x11,0xff,0x7f,0x00,0x3a,0x00,0x24,0xff,0xb6,0x00,0x3a,0x00,0x37,0x00,0x27,0x00,0x3a,0x00,0x44,0xff,0xb4,0x00,0x3a,0x00,0x46,0xff,0xcf,0x00,0x3a,0x00,0x47,0xff,0xcf,0x00,0x3a,0x00,0x48,0xff,0xcf,0x00,0x3a,0x00,0x4a,0xff,0xcf, +0x00,0x3a,0x00,0x52,0xff,0xcf,0x00,0x3a,0x00,0x54,0xff,0xcf,0x00,0x3a,0x00,0x62,0xff,0xb6,0x00,0x3a,0x00,0x63,0xff,0xb6,0x00,0x3a,0x00,0x69,0xff,0xb4,0x00,0x3a,0x00,0x6a,0xff,0xb4,0x00,0x3a,0x00,0x6b,0xff,0xb4,0x00,0x3a,0x00,0x6c,0xff,0xb4,0x00,0x3a,0x00,0x6d,0xff,0xb4,0x00,0x3a,0x00,0x6e,0xff,0xb4,0x00,0x3a,0x00,0x6f, +0xff,0xcf,0x00,0x3a,0x00,0x70,0xff,0xcf,0x00,0x3a,0x00,0x71,0xff,0xcf,0x00,0x3a,0x00,0x72,0xff,0xcf,0x00,0x3a,0x00,0x73,0xff,0xcf,0x00,0x3a,0x00,0x76,0x00,0x31,0x00,0x3a,0x00,0x77,0x00,0x64,0x00,0x3a,0x00,0x79,0xff,0xcf,0x00,0x3a,0x00,0x7a,0xff,0xcf,0x00,0x3a,0x00,0x7b,0xff,0xcf,0x00,0x3a,0x00,0x7c,0xff,0xcf,0x00,0x3a, +0x00,0x7d,0xff,0xcf,0x00,0x3a,0x00,0x91,0xff,0x9a,0x00,0x3a,0x00,0xa0,0xff,0xb4,0x00,0x3a,0x00,0xa2,0xff,0xa4,0x00,0x3a,0x00,0xaa,0xff,0xcf,0x00,0x3a,0x00,0xab,0x00,0x27,0x00,0x3a,0x00,0xac,0xff,0x7f,0x00,0x3a,0x00,0xad,0xff,0xb6,0x00,0x3a,0x00,0xae,0xff,0xb6,0x00,0x3a,0x00,0xb1,0xff,0xcf,0x00,0x3a,0x00,0xbe,0xff,0xcf, +0x00,0x3a,0x00,0xbf,0x00,0x27,0x00,0x3a,0x00,0xc4,0xff,0x7f,0x00,0x3a,0x00,0xc5,0xff,0x8b,0x00,0x3a,0x00,0xc7,0xff,0xb6,0x00,0x3a,0x00,0xc9,0xff,0xb6,0x00,0x3a,0x00,0xf8,0xff,0xcf,0x00,0x3a,0x00,0xfd,0xff,0xcf,0x00,0x3a,0x00,0xff,0xff,0xcf,0x00,0x3a,0x01,0x00,0xff,0xcf,0x00,0x3a,0x01,0x03,0xff,0xb6,0x00,0x3a,0x01,0x04, +0xff,0xb4,0x00,0x3a,0x01,0x05,0xff,0xb6,0x00,0x3a,0x01,0x06,0xff,0xb4,0x00,0x3a,0x01,0x08,0xff,0xcf,0x00,0x3a,0x01,0x0b,0xff,0xcf,0x00,0x3a,0x01,0x0d,0xff,0xcf,0x00,0x3a,0x01,0x19,0xff,0xcf,0x00,0x3a,0x01,0x20,0x00,0x27,0x00,0x3a,0x01,0x22,0x00,0x27,0x00,0x3a,0x01,0x45,0xff,0xb6,0x00,0x3a,0x01,0x46,0xff,0xb4,0x00,0x3a, +0x01,0x48,0xff,0xcf,0x00,0x3a,0x01,0x4c,0xff,0xcf,0x00,0x3a,0x01,0x4e,0xff,0xcf,0x00,0x3a,0x01,0x50,0xff,0xcf,0x00,0x3a,0x01,0x52,0xff,0xcf,0x00,0x3a,0x01,0x54,0xff,0xcf,0x00,0x3a,0x01,0x56,0xff,0xcf,0x00,0x3a,0x01,0x5c,0x00,0x64,0x00,0x3a,0x01,0x5e,0x00,0x64,0x00,0x3a,0x01,0x60,0x00,0x64,0x00,0x3a,0x01,0x6f,0xff,0xcf, +0x00,0x3a,0x01,0x71,0xff,0xcf,0x00,0x3a,0x01,0x76,0x00,0x27,0x00,0x3a,0x01,0x85,0xff,0xb6,0x00,0x3a,0x01,0x86,0xff,0xb4,0x00,0x3a,0x01,0x87,0xff,0xb6,0x00,0x3a,0x01,0x88,0xff,0xb4,0x00,0x3a,0x01,0x8a,0xff,0xcf,0x00,0x3b,0x00,0x0f,0x00,0x44,0x00,0x3b,0x00,0x11,0x00,0x39,0x00,0x3b,0x00,0x1e,0x00,0x52,0x00,0x3b,0x00,0x26, +0xff,0xe9,0x00,0x3b,0x00,0x2a,0xff,0xe9,0x00,0x3b,0x00,0x2d,0x00,0x60,0x00,0x3b,0x00,0x32,0xff,0xe9,0x00,0x3b,0x00,0x34,0xff,0xe9,0x00,0x3b,0x00,0x37,0x00,0x21,0x00,0x3b,0x00,0x64,0xff,0xe9,0x00,0x3b,0x00,0x67,0xff,0xe9,0x00,0x3b,0x00,0x77,0x00,0x52,0x00,0x3b,0x00,0x92,0xff,0xe9,0x00,0x3b,0x00,0xac,0x00,0x39,0x00,0x3b, +0x00,0xaf,0xff,0xe9,0x00,0x3b,0x00,0xb0,0xff,0xe9,0x00,0x3b,0x00,0xc4,0x00,0x44,0x00,0x3b,0x00,0xc5,0x00,0x52,0x00,0x3b,0x00,0xd0,0xff,0xe9,0x00,0x3b,0x00,0xd1,0xff,0xe9,0x00,0x3b,0x00,0xd2,0xff,0xe9,0x00,0x3b,0x00,0xf7,0xff,0xe9,0x00,0x3b,0x00,0xfc,0xff,0xe9,0x00,0x3b,0x00,0xfe,0xff,0xe9,0x00,0x3b,0x01,0x18,0xff,0xe9, +0x00,0x3b,0x01,0x20,0x00,0x21,0x00,0x3b,0x01,0x22,0x00,0x21,0x00,0x3b,0x01,0x47,0xff,0xe9,0x00,0x3b,0x01,0x51,0xff,0xe9,0x00,0x3b,0x01,0x53,0xff,0xe9,0x00,0x3b,0x01,0x55,0xff,0xe9,0x00,0x3b,0x01,0x5c,0x00,0x52,0x00,0x3b,0x01,0x5e,0x00,0x52,0x00,0x3b,0x01,0x60,0x00,0x52,0x00,0x3b,0x01,0x63,0x00,0x60,0x00,0x3b,0x01,0x6e, +0xff,0xe9,0x00,0x3b,0x01,0x70,0xff,0xe9,0x00,0x3b,0x01,0x76,0x00,0x21,0x00,0x3b,0x01,0x89,0xff,0xe9,0x00,0x3c,0x00,0x0f,0xff,0x50,0x00,0x3c,0x00,0x11,0xff,0x3d,0x00,0x3c,0x00,0x24,0xff,0x62,0x00,0x3c,0x00,0x26,0xff,0xd3,0x00,0x3c,0x00,0x2a,0xff,0xd3,0x00,0x3c,0x00,0x2d,0xff,0xbe,0x00,0x3c,0x00,0x32,0xff,0xd3,0x00,0x3c, +0x00,0x34,0xff,0xd3,0x00,0x3c,0x00,0x36,0xff,0xe5,0x00,0x3c,0x00,0x37,0x00,0x27,0x00,0x3c,0x00,0x44,0xff,0x39,0x00,0x3c,0x00,0x46,0xff,0x4c,0x00,0x3c,0x00,0x47,0xff,0x4c,0x00,0x3c,0x00,0x48,0xff,0x4c,0x00,0x3c,0x00,0x49,0xff,0xe5,0x00,0x3c,0x00,0x4a,0xff,0x4c,0x00,0x3c,0x00,0x50,0xff,0x73,0x00,0x3c,0x00,0x51,0xff,0x73, +0x00,0x3c,0x00,0x52,0xff,0x4c,0x00,0x3c,0x00,0x53,0xff,0x73,0x00,0x3c,0x00,0x54,0xff,0x4c,0x00,0x3c,0x00,0x55,0xff,0x73,0x00,0x3c,0x00,0x56,0xff,0x7b,0x00,0x3c,0x00,0x58,0xff,0x73,0x00,0x3c,0x00,0x62,0xff,0x62,0x00,0x3c,0x00,0x63,0xff,0x62,0x00,0x3c,0x00,0x64,0xff,0xcd,0x00,0x3c,0x00,0x67,0xff,0xd3,0x00,0x3c,0x00,0x69, +0xff,0x39,0x00,0x3c,0x00,0x6a,0xff,0x39,0x00,0x3c,0x00,0x6b,0xff,0x39,0x00,0x3c,0x00,0x6c,0xff,0x7f,0x00,0x3c,0x00,0x6d,0xff,0x66,0x00,0x3c,0x00,0x6e,0xff,0x39,0x00,0x3c,0x00,0x6f,0xff,0x4c,0x00,0x3c,0x00,0x70,0xff,0x4c,0x00,0x3c,0x00,0x71,0xff,0x4c,0x00,0x3c,0x00,0x72,0xff,0x4c,0x00,0x3c,0x00,0x73,0xff,0x4c,0x00,0x3c, +0x00,0x77,0x00,0x5a,0x00,0x3c,0x00,0x78,0xff,0x73,0x00,0x3c,0x00,0x79,0xff,0x4c,0x00,0x3c,0x00,0x7a,0xff,0x4c,0x00,0x3c,0x00,0x7b,0xff,0x4c,0x00,0x3c,0x00,0x7c,0xff,0x4c,0x00,0x3c,0x00,0x7d,0xff,0x4c,0x00,0x3c,0x00,0x7e,0xff,0x73,0x00,0x3c,0x00,0x7f,0xff,0x73,0x00,0x3c,0x00,0x80,0xff,0x73,0x00,0x3c,0x00,0x81,0xff,0x73, +0x00,0x3c,0x00,0x91,0xff,0x3f,0x00,0x3c,0x00,0x92,0xff,0xd3,0x00,0x3c,0x00,0xa0,0xff,0x39,0x00,0x3c,0x00,0xa2,0xff,0x1b,0x00,0x3c,0x00,0xaa,0xff,0xcf,0x00,0x3c,0x00,0xac,0xff,0x3d,0x00,0x3c,0x00,0xad,0xff,0x62,0x00,0x3c,0x00,0xae,0xff,0x62,0x00,0x3c,0x00,0xaf,0xff,0xd3,0x00,0x3c,0x00,0xb0,0xff,0xd3,0x00,0x3c,0x00,0xb1, +0xff,0x4c,0x00,0x3c,0x00,0xbe,0xff,0x9a,0x00,0x3c,0x00,0xc4,0xff,0x08,0x00,0x3c,0x00,0xc5,0xff,0x08,0x00,0x3c,0x00,0xc7,0xff,0x62,0x00,0x3c,0x00,0xc9,0xff,0x62,0x00,0x3c,0x00,0xd0,0xff,0xd3,0x00,0x3c,0x00,0xd1,0xff,0xd3,0x00,0x3c,0x00,0xd2,0xff,0xd3,0x00,0x3c,0x00,0xe3,0xff,0xe5,0x00,0x3c,0x00,0xe4,0xff,0x7b,0x00,0x3c, +0x00,0xf7,0xff,0xd3,0x00,0x3c,0x00,0xf8,0xff,0x4c,0x00,0x3c,0x00,0xfa,0xff,0xe5,0x00,0x3c,0x00,0xfb,0xff,0x7b,0x00,0x3c,0x00,0xfc,0xff,0xd3,0x00,0x3c,0x00,0xfd,0xff,0x4c,0x00,0x3c,0x00,0xfe,0xff,0xd3,0x00,0x3c,0x00,0xff,0xff,0x4c,0x00,0x3c,0x01,0x00,0xff,0x4c,0x00,0x3c,0x01,0x03,0xff,0x62,0x00,0x3c,0x01,0x04,0xff,0x7f, +0x00,0x3c,0x01,0x05,0xff,0x62,0x00,0x3c,0x01,0x06,0xff,0x39,0x00,0x3c,0x01,0x08,0xff,0x4c,0x00,0x3c,0x01,0x0b,0xff,0x4c,0x00,0x3c,0x01,0x0d,0xff,0x4c,0x00,0x3c,0x01,0x15,0xff,0x73,0x00,0x3c,0x01,0x17,0xff,0x73,0x00,0x3c,0x01,0x18,0xff,0xd3,0x00,0x3c,0x01,0x19,0xff,0x4c,0x00,0x3c,0x01,0x1b,0xff,0x73,0x00,0x3c,0x01,0x1d, +0xff,0x73,0x00,0x3c,0x01,0x1e,0xff,0xe5,0x00,0x3c,0x01,0x1f,0xff,0x7b,0x00,0x3c,0x01,0x20,0x00,0x27,0x00,0x3c,0x01,0x22,0x00,0x27,0x00,0x3c,0x01,0x25,0xff,0x73,0x00,0x3c,0x01,0x27,0xff,0x73,0x00,0x3c,0x01,0x45,0xff,0x62,0x00,0x3c,0x01,0x46,0xff,0x7f,0x00,0x3c,0x01,0x47,0xff,0xd3,0x00,0x3c,0x01,0x48,0xff,0x4c,0x00,0x3c, +0x01,0x4c,0xff,0x4c,0x00,0x3c,0x01,0x4e,0xff,0x4c,0x00,0x3c,0x01,0x50,0xff,0x4c,0x00,0x3c,0x01,0x51,0xff,0xd3,0x00,0x3c,0x01,0x52,0xff,0x4c,0x00,0x3c,0x01,0x53,0xff,0xd3,0x00,0x3c,0x01,0x54,0xff,0x4c,0x00,0x3c,0x01,0x55,0xff,0xd3,0x00,0x3c,0x01,0x56,0xff,0x4c,0x00,0x3c,0x01,0x5c,0x00,0x5a,0x00,0x3c,0x01,0x5e,0x00,0x5a, +0x00,0x3c,0x01,0x60,0x00,0x5a,0x00,0x3c,0x01,0x63,0xff,0xbe,0x00,0x3c,0x01,0x6d,0xff,0x73,0x00,0x3c,0x01,0x6e,0xff,0xd3,0x00,0x3c,0x01,0x6f,0xff,0x4c,0x00,0x3c,0x01,0x70,0xff,0xd3,0x00,0x3c,0x01,0x71,0xff,0x4c,0x00,0x3c,0x01,0x73,0xff,0x73,0x00,0x3c,0x01,0x74,0xff,0xe5,0x00,0x3c,0x01,0x75,0xff,0x7b,0x00,0x3c,0x01,0x76, +0x00,0x27,0x00,0x3c,0x01,0x79,0xff,0x73,0x00,0x3c,0x01,0x7b,0xff,0x73,0x00,0x3c,0x01,0x7d,0xff,0x73,0x00,0x3c,0x01,0x7f,0xff,0x73,0x00,0x3c,0x01,0x85,0xff,0x62,0x00,0x3c,0x01,0x86,0xff,0x7f,0x00,0x3c,0x01,0x87,0xff,0x62,0x00,0x3c,0x01,0x88,0xff,0x39,0x00,0x3c,0x01,0x89,0xff,0xd3,0x00,0x3c,0x01,0x8a,0xff,0x4c,0x00,0x3c, +0x02,0x3d,0xff,0xe5,0x00,0x3c,0x02,0x3e,0xff,0x7b,0x00,0x3d,0x00,0x2d,0x00,0x52,0x00,0x3d,0x00,0x37,0x00,0x27,0x00,0x3d,0x00,0x5c,0xff,0xcb,0x00,0x3d,0x00,0x77,0x00,0x46,0x00,0x3d,0x00,0xab,0x00,0x27,0x00,0x3d,0x00,0xba,0xff,0xbe,0x00,0x3d,0x00,0xbf,0x00,0x52,0x00,0x3d,0x00,0xeb,0xff,0xcb,0x00,0x3d,0x01,0x20,0x00,0x27, +0x00,0x3d,0x01,0x22,0x00,0x27,0x00,0x3d,0x01,0x5c,0x00,0x46,0x00,0x3d,0x01,0x5e,0x00,0x46,0x00,0x3d,0x01,0x60,0x00,0x46,0x00,0x3d,0x01,0x63,0x00,0x52,0x00,0x3d,0x01,0x76,0x00,0x27,0x00,0x3d,0x01,0x83,0xff,0xcb,0x00,0x3d,0x01,0x93,0xff,0xcb,0x00,0x3e,0x00,0x4d,0x00,0xe9,0x00,0x3e,0x01,0x64,0x00,0xe9,0x00,0x45,0x00,0x44, +0xff,0xe5,0x00,0x45,0x00,0x49,0xff,0xf6,0x00,0x45,0x00,0x5b,0xff,0xe7,0x00,0x45,0x00,0x69,0xff,0xe5,0x00,0x45,0x00,0x6a,0xff,0xe5,0x00,0x45,0x00,0x6b,0xff,0xe5,0x00,0x45,0x00,0x6c,0xff,0xe5,0x00,0x45,0x00,0x6d,0xff,0xe5,0x00,0x45,0x00,0x6e,0xff,0xe5,0x00,0x45,0x00,0xa0,0xff,0xe5,0x00,0x45,0x00,0xc0,0xff,0xf6,0x00,0x45, +0x00,0xc1,0xff,0xf6,0x00,0x45,0x01,0x04,0xff,0xe5,0x00,0x45,0x01,0x06,0xff,0xe5,0x00,0x45,0x01,0x46,0xff,0xe5,0x00,0x45,0x01,0x86,0xff,0xe5,0x00,0x45,0x01,0x88,0xff,0xe5,0x00,0x46,0x00,0x2d,0x00,0x46,0x00,0x46,0x00,0x37,0xff,0x9a,0x00,0x46,0x00,0x3c,0xff,0xb4,0x00,0x46,0x00,0xea,0xff,0xb4,0x00,0x46,0x01,0x20,0xff,0x9a, +0x00,0x46,0x01,0x22,0xff,0x9a,0x00,0x46,0x01,0x63,0x00,0x46,0x00,0x46,0x01,0x76,0xff,0x9a,0x00,0x46,0x01,0x82,0xff,0xb4,0x00,0x46,0x01,0x92,0xff,0xb4,0x00,0x48,0x00,0x05,0xff,0x98,0x00,0x48,0x00,0x0a,0xff,0x98,0x00,0x49,0x00,0x0c,0x00,0x8d,0x00,0x49,0x00,0x0f,0xff,0x7f,0x00,0x49,0x00,0x10,0xff,0x9a,0x00,0x49,0x00,0x11, +0xff,0x7f,0x00,0x49,0x00,0x1d,0x00,0x52,0x00,0x49,0x00,0x1e,0x00,0x52,0x00,0x49,0x00,0x22,0x00,0x42,0x00,0x49,0x00,0x40,0x00,0x8d,0x00,0x49,0x00,0x45,0x00,0x12,0x00,0x49,0x00,0x4b,0x00,0x12,0x00,0x49,0x00,0x57,0x00,0x25,0x00,0x49,0x00,0x59,0x00,0x27,0x00,0x49,0x00,0x5a,0x00,0x27,0x00,0x49,0x00,0x5b,0x00,0x12,0x00,0x49, +0x00,0x5c,0x00,0x21,0x00,0x49,0x00,0x60,0x00,0x52,0x00,0x49,0x00,0x75,0x00,0x2d,0x00,0x49,0x00,0x76,0x00,0x12,0x00,0x49,0x00,0x77,0x00,0x79,0x00,0x49,0x00,0x8d,0x00,0x93,0x00,0x49,0x00,0xab,0x00,0x27,0x00,0x49,0x00,0xac,0xff,0x7f,0x00,0x49,0x00,0xb4,0x00,0x5e,0x00,0x49,0x00,0xb5,0x00,0x52,0x00,0x49,0x00,0xb6,0x00,0x5e, +0x00,0x49,0x00,0xb7,0x00,0x52,0x00,0x49,0x00,0xbf,0x00,0x27,0x00,0x49,0x00,0xc4,0xff,0xb0,0x00,0x49,0x00,0xc5,0xff,0xb0,0x00,0x49,0x00,0xeb,0x00,0x21,0x00,0x49,0x00,0xed,0x00,0x12,0x00,0x49,0x01,0x21,0x00,0x25,0x00,0x49,0x01,0x23,0x00,0x25,0x00,0x49,0x01,0x58,0x00,0x12,0x00,0x49,0x01,0x5a,0x00,0x12,0x00,0x49,0x01,0x5c, +0x00,0x79,0x00,0x49,0x01,0x5e,0x00,0x79,0x00,0x49,0x01,0x60,0x00,0x79,0x00,0x49,0x01,0x77,0x00,0x25,0x00,0x49,0x01,0x81,0x00,0x27,0x00,0x49,0x01,0x83,0x00,0x21,0x00,0x49,0x01,0x8d,0x00,0x27,0x00,0x49,0x01,0x8f,0x00,0x27,0x00,0x49,0x01,0x91,0x00,0x27,0x00,0x49,0x01,0x93,0x00,0x21,0x00,0x4a,0x00,0x4d,0x00,0x2f,0x00,0x4a, +0x01,0x64,0x00,0x2f,0x00,0x4d,0x00,0x4d,0x00,0x23,0x00,0x4d,0x01,0x64,0x00,0x23,0x00,0x4e,0x00,0x0f,0x00,0x52,0x00,0x4e,0x00,0x10,0xff,0x75,0x00,0x4e,0x00,0x11,0x00,0x52,0x00,0x4e,0x00,0x1d,0x00,0x52,0x00,0x4e,0x00,0x1e,0x00,0x52,0x00,0x4e,0x00,0x46,0xff,0xd7,0x00,0x4e,0x00,0x47,0xff,0xe5,0x00,0x4e,0x00,0x48,0xff,0xd7, +0x00,0x4e,0x00,0x4a,0xff,0xd7,0x00,0x4e,0x00,0x52,0xff,0xd7,0x00,0x4e,0x00,0x54,0xff,0xe5,0x00,0x4e,0x00,0x57,0xff,0xf0,0x00,0x4e,0x00,0x6f,0xff,0xe5,0x00,0x4e,0x00,0x70,0xff,0xd7,0x00,0x4e,0x00,0x71,0xff,0xd7,0x00,0x4e,0x00,0x72,0xff,0xd7,0x00,0x4e,0x00,0x73,0xff,0xd7,0x00,0x4e,0x00,0x79,0xff,0xd7,0x00,0x4e,0x00,0x7a, +0xff,0xd7,0x00,0x4e,0x00,0x7b,0xff,0xd7,0x00,0x4e,0x00,0x7c,0xff,0xd7,0x00,0x4e,0x00,0x7d,0xff,0xd7,0x00,0x4e,0x00,0xac,0x00,0x52,0x00,0x4e,0x00,0xb1,0xff,0xd7,0x00,0x4e,0x00,0xf8,0xff,0xd7,0x00,0x4e,0x00,0xfd,0xff,0xd7,0x00,0x4e,0x00,0xff,0xff,0xd7,0x00,0x4e,0x01,0x00,0xff,0xe5,0x00,0x4e,0x01,0x08,0xff,0xe5,0x00,0x4e, +0x01,0x0b,0xff,0xd7,0x00,0x4e,0x01,0x0d,0xff,0xd7,0x00,0x4e,0x01,0x19,0xff,0xd7,0x00,0x4e,0x01,0x21,0xff,0xf0,0x00,0x4e,0x01,0x23,0xff,0xf0,0x00,0x4e,0x01,0x48,0xff,0xd7,0x00,0x4e,0x01,0x4c,0xff,0xd7,0x00,0x4e,0x01,0x4e,0xff,0xd7,0x00,0x4e,0x01,0x50,0xff,0xd7,0x00,0x4e,0x01,0x52,0xff,0xd7,0x00,0x4e,0x01,0x54,0xff,0xd7, +0x00,0x4e,0x01,0x56,0xff,0xd7,0x00,0x4e,0x01,0x6f,0xff,0xd7,0x00,0x4e,0x01,0x71,0xff,0xd7,0x00,0x4e,0x01,0x77,0xff,0xf0,0x00,0x4e,0x01,0x8a,0xff,0xd7,0x00,0x51,0x00,0x05,0xff,0x98,0x00,0x51,0x00,0x0a,0xff,0x98,0x00,0x52,0x00,0x05,0xff,0x6f,0x00,0x52,0x00,0x0a,0xff,0x6f,0x00,0x52,0x00,0x44,0xff,0xe5,0x00,0x52,0x00,0x49, +0xff,0xdb,0x00,0x52,0x00,0x5b,0xff,0xe7,0x00,0x52,0x00,0x69,0xff,0xe5,0x00,0x52,0x00,0x6a,0xff,0xe5,0x00,0x52,0x00,0x6b,0xff,0xe5,0x00,0x52,0x00,0x6c,0xff,0xe5,0x00,0x52,0x00,0x6d,0xff,0xe5,0x00,0x52,0x00,0x6e,0xff,0xe5,0x00,0x52,0x00,0xa0,0xff,0xe5,0x00,0x52,0x00,0xb4,0xff,0xb2,0x00,0x52,0x00,0xb5,0xff,0x7d,0x00,0x52, +0x00,0xb6,0xff,0xbe,0x00,0x52,0x00,0xb7,0xff,0x7d,0x00,0x52,0x00,0xc0,0xff,0xe7,0x00,0x52,0x00,0xc1,0xff,0xe7,0x00,0x52,0x01,0x04,0xff,0xe5,0x00,0x52,0x01,0x06,0xff,0xe5,0x00,0x52,0x01,0x46,0xff,0xe5,0x00,0x52,0x01,0x86,0xff,0xe5,0x00,0x52,0x01,0x88,0xff,0xe5,0x00,0x53,0x00,0x44,0xff,0xe5,0x00,0x53,0x00,0x49,0xff,0xdb, +0x00,0x53,0x00,0x5b,0xff,0xe7,0x00,0x53,0x00,0x69,0xff,0xe5,0x00,0x53,0x00,0x6a,0xff,0xe5,0x00,0x53,0x00,0x6b,0xff,0xe5,0x00,0x53,0x00,0x6c,0xff,0xe5,0x00,0x53,0x00,0x6d,0xff,0xe5,0x00,0x53,0x00,0x6e,0xff,0xe5,0x00,0x53,0x00,0xa0,0xff,0xe5,0x00,0x53,0x00,0xb4,0xff,0xcb,0x00,0x53,0x00,0xb5,0xff,0x89,0x00,0x53,0x00,0xb6, +0xff,0x89,0x00,0x53,0x00,0xb7,0xff,0x89,0x00,0x53,0x00,0xc0,0xff,0xe7,0x00,0x53,0x00,0xc1,0xff,0xe7,0x00,0x53,0x01,0x04,0xff,0xe5,0x00,0x53,0x01,0x06,0xff,0xe5,0x00,0x53,0x01,0x46,0xff,0xe5,0x00,0x53,0x01,0x86,0xff,0xe5,0x00,0x53,0x01,0x88,0xff,0xe5,0x00,0x54,0x00,0x4d,0x00,0x66,0x00,0x54,0x01,0x64,0x00,0x66,0x00,0x55, +0x00,0x0f,0xff,0x62,0x00,0x55,0x00,0x10,0xff,0x7f,0x00,0x55,0x00,0x11,0xff,0x56,0x00,0x55,0x00,0x1d,0x00,0x52,0x00,0x55,0x00,0x1e,0x00,0x52,0x00,0x55,0x00,0x46,0xff,0xe5,0x00,0x55,0x00,0x47,0xff,0xe5,0x00,0x55,0x00,0x48,0xff,0xe5,0x00,0x55,0x00,0x49,0x00,0x27,0x00,0x55,0x00,0x4a,0xff,0xe5,0x00,0x55,0x00,0x50,0xff,0xfc, +0x00,0x55,0x00,0x51,0xff,0xfc,0x00,0x55,0x00,0x52,0xff,0xe5,0x00,0x55,0x00,0x54,0xff,0xe5,0x00,0x55,0x00,0x56,0x00,0x0e,0x00,0x55,0x00,0x57,0x00,0x3b,0x00,0x55,0x00,0x59,0x00,0x52,0x00,0x55,0x00,0x5a,0x00,0x52,0x00,0x55,0x00,0x5b,0x00,0x3b,0x00,0x55,0x00,0x5c,0x00,0x52,0x00,0x55,0x00,0x5d,0x00,0x27,0x00,0x55,0x00,0x6f, +0xff,0xe5,0x00,0x55,0x00,0x70,0xff,0xe5,0x00,0x55,0x00,0x71,0xff,0xe5,0x00,0x55,0x00,0x72,0xff,0xe5,0x00,0x55,0x00,0x73,0xff,0xe5,0x00,0x55,0x00,0x79,0xff,0xe5,0x00,0x55,0x00,0x7a,0xff,0xe5,0x00,0x55,0x00,0x7b,0xff,0xe5,0x00,0x55,0x00,0x7c,0xff,0xe5,0x00,0x55,0x00,0x7d,0xff,0xe5,0x00,0x55,0x00,0xac,0xff,0x56,0x00,0x55, +0x00,0xb1,0xff,0xe5,0x00,0x55,0x00,0xb4,0x00,0xa4,0x00,0x55,0x00,0xb5,0x00,0x79,0x00,0x55,0x00,0xb6,0x00,0xa4,0x00,0x55,0x00,0xb7,0x00,0x79,0x00,0x55,0x00,0xc4,0xff,0x62,0x00,0x55,0x00,0xc5,0xff,0x62,0x00,0x55,0x00,0xe4,0x00,0x0e,0x00,0x55,0x00,0xe6,0x00,0x27,0x00,0x55,0x00,0xeb,0x00,0x52,0x00,0x55,0x00,0xf8,0xff,0xe5, +0x00,0x55,0x00,0xfb,0x00,0x0e,0x00,0x55,0x00,0xfd,0xff,0xe5,0x00,0x55,0x00,0xff,0xff,0xe5,0x00,0x55,0x01,0x00,0xff,0xe5,0x00,0x55,0x01,0x08,0xff,0xe5,0x00,0x55,0x01,0x0b,0xff,0xe5,0x00,0x55,0x01,0x0d,0xff,0xe5,0x00,0x55,0x01,0x19,0xff,0xe5,0x00,0x55,0x01,0x1f,0x00,0x0e,0x00,0x55,0x01,0x21,0x00,0x3b,0x00,0x55,0x01,0x23, +0x00,0x3b,0x00,0x55,0x01,0x29,0x00,0x27,0x00,0x55,0x01,0x2b,0x00,0x27,0x00,0x55,0x01,0x48,0xff,0xe5,0x00,0x55,0x01,0x4c,0xff,0xe5,0x00,0x55,0x01,0x4e,0xff,0xe5,0x00,0x55,0x01,0x50,0xff,0xe5,0x00,0x55,0x01,0x52,0xff,0xe5,0x00,0x55,0x01,0x54,0xff,0xe5,0x00,0x55,0x01,0x56,0xff,0xe5,0x00,0x55,0x01,0x6d,0xff,0xfc,0x00,0x55, +0x01,0x6f,0xff,0xe5,0x00,0x55,0x01,0x71,0xff,0xe5,0x00,0x55,0x01,0x75,0x00,0x0e,0x00,0x55,0x01,0x77,0x00,0x3b,0x00,0x55,0x01,0x81,0x00,0x52,0x00,0x55,0x01,0x83,0x00,0x52,0x00,0x55,0x01,0x8a,0xff,0xe5,0x00,0x55,0x01,0x8d,0x00,0x52,0x00,0x55,0x01,0x8f,0x00,0x52,0x00,0x55,0x01,0x91,0x00,0x52,0x00,0x55,0x01,0x93,0x00,0x52, +0x00,0x55,0x02,0x3e,0x00,0x0e,0x00,0x57,0x00,0x10,0xff,0x8f,0x00,0x57,0x00,0x22,0xff,0xcb,0x00,0x57,0x00,0x46,0xff,0xe5,0x00,0x57,0x00,0x47,0xff,0xe5,0x00,0x57,0x00,0x48,0xff,0xf0,0x00,0x57,0x00,0x4a,0xff,0xf0,0x00,0x57,0x00,0x52,0xff,0xf0,0x00,0x57,0x00,0x54,0xff,0xf0,0x00,0x57,0x00,0x5b,0x00,0x1d,0x00,0x57,0x00,0x6f, +0xff,0xe5,0x00,0x57,0x00,0x70,0xff,0xf0,0x00,0x57,0x00,0x71,0xff,0xf0,0x00,0x57,0x00,0x72,0xff,0xf0,0x00,0x57,0x00,0x73,0xff,0xf0,0x00,0x57,0x00,0x79,0xff,0xf0,0x00,0x57,0x00,0x7a,0xff,0xf0,0x00,0x57,0x00,0x7b,0xff,0xf0,0x00,0x57,0x00,0x7c,0xff,0xf0,0x00,0x57,0x00,0x7d,0xff,0xf0,0x00,0x57,0x00,0xab,0x00,0x27,0x00,0x57, +0x00,0xb1,0xff,0xf0,0x00,0x57,0x00,0xbf,0x00,0x27,0x00,0x57,0x00,0xf8,0xff,0xf0,0x00,0x57,0x00,0xfd,0xff,0xe5,0x00,0x57,0x00,0xff,0xff,0xe5,0x00,0x57,0x01,0x00,0xff,0xe5,0x00,0x57,0x01,0x08,0xff,0xe5,0x00,0x57,0x01,0x0b,0xff,0xf0,0x00,0x57,0x01,0x0d,0xff,0xf0,0x00,0x57,0x01,0x19,0xff,0xf0,0x00,0x57,0x01,0x48,0xff,0xe5, +0x00,0x57,0x01,0x4c,0xff,0xf0,0x00,0x57,0x01,0x4e,0xff,0xf0,0x00,0x57,0x01,0x50,0xff,0xf0,0x00,0x57,0x01,0x52,0xff,0xf0,0x00,0x57,0x01,0x54,0xff,0xf0,0x00,0x57,0x01,0x56,0xff,0xf0,0x00,0x57,0x01,0x6f,0xff,0xf0,0x00,0x57,0x01,0x71,0xff,0xf0,0x00,0x57,0x01,0x8a,0xff,0xf0,0x00,0x58,0x00,0x05,0xff,0xbe,0x00,0x58,0x00,0x0a, +0xff,0xbe,0x00,0x59,0x00,0x0f,0xff,0x8b,0x00,0x59,0x00,0x11,0xff,0x7f,0x00,0x59,0x00,0x44,0xff,0xdb,0x00,0x59,0x00,0x46,0xff,0xf4,0x00,0x59,0x00,0x47,0xff,0xf0,0x00,0x59,0x00,0x48,0xff,0xf4,0x00,0x59,0x00,0x4a,0xff,0xf4,0x00,0x59,0x00,0x52,0xff,0xf4,0x00,0x59,0x00,0x54,0xff,0xf0,0x00,0x59,0x00,0x69,0xff,0xdb,0x00,0x59, +0x00,0x6a,0xff,0xdb,0x00,0x59,0x00,0x6b,0xff,0xdb,0x00,0x59,0x00,0x6c,0xff,0xdb,0x00,0x59,0x00,0x6d,0xff,0xdb,0x00,0x59,0x00,0x6e,0xff,0xdb,0x00,0x59,0x00,0x6f,0xff,0xf4,0x00,0x59,0x00,0x70,0xff,0xf4,0x00,0x59,0x00,0x71,0xff,0xf4,0x00,0x59,0x00,0x72,0xff,0xf4,0x00,0x59,0x00,0x73,0xff,0xf4,0x00,0x59,0x00,0x79,0xff,0xf4, +0x00,0x59,0x00,0x7a,0xff,0xf4,0x00,0x59,0x00,0x7b,0xff,0xf4,0x00,0x59,0x00,0x7c,0xff,0xf4,0x00,0x59,0x00,0x7d,0xff,0xf4,0x00,0x59,0x00,0xa0,0xff,0xdb,0x00,0x59,0x00,0xac,0xff,0x7f,0x00,0x59,0x00,0xb1,0xff,0xf4,0x00,0x59,0x00,0xc4,0xff,0x8b,0x00,0x59,0x00,0xc5,0xff,0x7f,0x00,0x59,0x00,0xf8,0xff,0xf4,0x00,0x59,0x00,0xfd, +0xff,0xf4,0x00,0x59,0x00,0xff,0xff,0xf4,0x00,0x59,0x01,0x00,0xff,0xf0,0x00,0x59,0x01,0x04,0xff,0xdb,0x00,0x59,0x01,0x06,0xff,0xdb,0x00,0x59,0x01,0x08,0xff,0xf0,0x00,0x59,0x01,0x0b,0xff,0xf4,0x00,0x59,0x01,0x0d,0xff,0xf4,0x00,0x59,0x01,0x19,0xff,0xf4,0x00,0x59,0x01,0x46,0xff,0xdb,0x00,0x59,0x01,0x48,0xff,0xf4,0x00,0x59, +0x01,0x4c,0xff,0xf4,0x00,0x59,0x01,0x4e,0xff,0xf4,0x00,0x59,0x01,0x50,0xff,0xf4,0x00,0x59,0x01,0x52,0xff,0xf4,0x00,0x59,0x01,0x54,0xff,0xf4,0x00,0x59,0x01,0x56,0xff,0xf4,0x00,0x59,0x01,0x6f,0xff,0xf4,0x00,0x59,0x01,0x71,0xff,0xf4,0x00,0x59,0x01,0x86,0xff,0xdb,0x00,0x59,0x01,0x88,0xff,0xdb,0x00,0x59,0x01,0x8a,0xff,0xf4, +0x00,0x5a,0x00,0x0f,0xff,0xa6,0x00,0x5a,0x00,0x11,0xff,0x9a,0x00,0x5a,0x00,0x46,0xff,0xfa,0x00,0x5a,0x00,0x47,0xff,0xf6,0x00,0x5a,0x00,0x48,0xff,0xf6,0x00,0x5a,0x00,0x4a,0xff,0xfa,0x00,0x5a,0x00,0x52,0xff,0xfa,0x00,0x5a,0x00,0x54,0xff,0xf6,0x00,0x5a,0x00,0x6f,0xff,0xfa,0x00,0x5a,0x00,0x70,0xff,0xf6,0x00,0x5a,0x00,0x71, +0xff,0xf6,0x00,0x5a,0x00,0x72,0xff,0xf6,0x00,0x5a,0x00,0x73,0xff,0xf6,0x00,0x5a,0x00,0x79,0xff,0xfa,0x00,0x5a,0x00,0x7a,0xff,0xfa,0x00,0x5a,0x00,0x7b,0xff,0xfa,0x00,0x5a,0x00,0x7c,0xff,0xfa,0x00,0x5a,0x00,0x7d,0xff,0xfa,0x00,0x5a,0x00,0xac,0xff,0x9a,0x00,0x5a,0x00,0xb1,0xff,0xfa,0x00,0x5a,0x00,0xc4,0xff,0xb4,0x00,0x5a, +0x00,0xc5,0xff,0xb4,0x00,0x5a,0x00,0xf8,0xff,0xfa,0x00,0x5a,0x00,0xfd,0xff,0xfa,0x00,0x5a,0x00,0xff,0xff,0xfa,0x00,0x5a,0x01,0x00,0xff,0xf6,0x00,0x5a,0x01,0x08,0xff,0xf6,0x00,0x5a,0x01,0x0b,0xff,0xf6,0x00,0x5a,0x01,0x0d,0xff,0xf6,0x00,0x5a,0x01,0x19,0xff,0xfa,0x00,0x5a,0x01,0x48,0xff,0xfa,0x00,0x5a,0x01,0x4c,0xff,0xf6, +0x00,0x5a,0x01,0x4e,0xff,0xf6,0x00,0x5a,0x01,0x50,0xff,0xf6,0x00,0x5a,0x01,0x52,0xff,0xfa,0x00,0x5a,0x01,0x54,0xff,0xfa,0x00,0x5a,0x01,0x56,0xff,0xfa,0x00,0x5a,0x01,0x6f,0xff,0xfa,0x00,0x5a,0x01,0x71,0xff,0xfa,0x00,0x5a,0x01,0x8a,0xff,0xfa,0x00,0x5b,0x00,0x46,0xff,0xf0,0x00,0x5b,0x00,0x47,0xff,0xf0,0x00,0x5b,0x00,0x48, +0xff,0xf0,0x00,0x5b,0x00,0x4a,0xff,0xf0,0x00,0x5b,0x00,0x52,0xff,0xf0,0x00,0x5b,0x00,0x54,0xff,0xf0,0x00,0x5b,0x00,0x6f,0xff,0xf0,0x00,0x5b,0x00,0x70,0xff,0xf0,0x00,0x5b,0x00,0x71,0xff,0xf0,0x00,0x5b,0x00,0x72,0xff,0xf0,0x00,0x5b,0x00,0x73,0xff,0xf0,0x00,0x5b,0x00,0x79,0xff,0xf0,0x00,0x5b,0x00,0x7a,0xff,0xf0,0x00,0x5b, +0x00,0x7b,0xff,0xf0,0x00,0x5b,0x00,0x7c,0xff,0xf0,0x00,0x5b,0x00,0x7d,0xff,0xf0,0x00,0x5b,0x00,0xb1,0xff,0xf0,0x00,0x5b,0x00,0xf8,0xff,0xf0,0x00,0x5b,0x00,0xfd,0xff,0xf0,0x00,0x5b,0x00,0xff,0xff,0xf0,0x00,0x5b,0x01,0x00,0xff,0xf0,0x00,0x5b,0x01,0x08,0xff,0xf0,0x00,0x5b,0x01,0x0b,0xff,0xf0,0x00,0x5b,0x01,0x0d,0xff,0xf0, +0x00,0x5b,0x01,0x19,0xff,0xf0,0x00,0x5b,0x01,0x48,0xff,0xf0,0x00,0x5b,0x01,0x4c,0xff,0xf0,0x00,0x5b,0x01,0x4e,0xff,0xf0,0x00,0x5b,0x01,0x50,0xff,0xf0,0x00,0x5b,0x01,0x52,0xff,0xf0,0x00,0x5b,0x01,0x54,0xff,0xf0,0x00,0x5b,0x01,0x56,0xff,0xf0,0x00,0x5b,0x01,0x6f,0xff,0xf0,0x00,0x5b,0x01,0x71,0xff,0xf0,0x00,0x5b,0x01,0x8a, +0xff,0xf0,0x00,0x5c,0x00,0x05,0x00,0x1d,0x00,0x5c,0x00,0x0a,0x00,0x1d,0x00,0x5c,0x00,0x0f,0xff,0x9a,0x00,0x5c,0x00,0x11,0xff,0x81,0x00,0x5c,0x00,0x22,0xff,0xb4,0x00,0x5c,0x00,0x46,0xff,0xf6,0x00,0x5c,0x00,0x47,0xff,0xf6,0x00,0x5c,0x00,0x48,0xff,0xf6,0x00,0x5c,0x00,0x49,0x00,0x04,0x00,0x5c,0x00,0x4a,0xff,0xf6,0x00,0x5c, +0x00,0x52,0xff,0xf6,0x00,0x5c,0x00,0x54,0xff,0xf6,0x00,0x5c,0x00,0x57,0x00,0x06,0x00,0x5c,0x00,0x6f,0xff,0xf6,0x00,0x5c,0x00,0x70,0xff,0xf6,0x00,0x5c,0x00,0x71,0xff,0xf6,0x00,0x5c,0x00,0x72,0xff,0xf6,0x00,0x5c,0x00,0x73,0xff,0xf6,0x00,0x5c,0x00,0x79,0xff,0xf6,0x00,0x5c,0x00,0x7a,0xff,0xf6,0x00,0x5c,0x00,0x7b,0xff,0xf6, +0x00,0x5c,0x00,0x7c,0xff,0xf6,0x00,0x5c,0x00,0x7d,0xff,0xf6,0x00,0x5c,0x00,0xac,0xff,0x81,0x00,0x5c,0x00,0xb1,0xff,0xf6,0x00,0x5c,0x00,0xbf,0x00,0x0c,0x00,0x5c,0x00,0xc4,0xff,0x8d,0x00,0x5c,0x00,0xc5,0xff,0x8d,0x00,0x5c,0x00,0xf8,0xff,0xf6,0x00,0x5c,0x00,0xfd,0xff,0xf6,0x00,0x5c,0x00,0xff,0xff,0xf6,0x00,0x5c,0x01,0x00, +0xff,0xf6,0x00,0x5c,0x01,0x08,0xff,0xf6,0x00,0x5c,0x01,0x0b,0xff,0xf6,0x00,0x5c,0x01,0x0d,0xff,0xf6,0x00,0x5c,0x01,0x19,0xff,0xf6,0x00,0x5c,0x01,0x21,0x00,0x06,0x00,0x5c,0x01,0x23,0x00,0x06,0x00,0x5c,0x01,0x48,0xff,0xf6,0x00,0x5c,0x01,0x4c,0xff,0xf6,0x00,0x5c,0x01,0x4e,0xff,0xf6,0x00,0x5c,0x01,0x50,0xff,0xf6,0x00,0x5c, +0x01,0x52,0xff,0xf6,0x00,0x5c,0x01,0x54,0xff,0xf6,0x00,0x5c,0x01,0x56,0xff,0xf6,0x00,0x5c,0x01,0x6f,0xff,0xf6,0x00,0x5c,0x01,0x71,0xff,0xf6,0x00,0x5c,0x01,0x77,0x00,0x06,0x00,0x5c,0x01,0x8a,0xff,0xf6,0x00,0x5e,0x00,0x4d,0x00,0xcb,0x00,0x5e,0x01,0x64,0x00,0xcb,0x00,0x62,0x00,0x2d,0x00,0x5e,0x00,0x62,0x00,0x37,0xff,0x6d, +0x00,0x62,0x00,0x39,0xff,0x8b,0x00,0x62,0x00,0x3a,0xff,0xb0,0x00,0x62,0x00,0x3c,0xff,0x64,0x00,0x62,0x00,0xea,0xff,0x64,0x00,0x62,0x01,0x20,0xff,0x6d,0x00,0x62,0x01,0x22,0xff,0x6d,0x00,0x62,0x01,0x63,0x00,0x5e,0x00,0x62,0x01,0x76,0xff,0x6d,0x00,0x62,0x01,0x80,0xff,0xb0,0x00,0x62,0x01,0x82,0xff,0x64,0x00,0x62,0x01,0x8c, +0xff,0xb0,0x00,0x62,0x01,0x8e,0xff,0xb0,0x00,0x62,0x01,0x90,0xff,0xb0,0x00,0x62,0x01,0x92,0xff,0x64,0x00,0x63,0x00,0x2d,0x00,0x5e,0x00,0x63,0x00,0x37,0xff,0x6d,0x00,0x63,0x00,0x39,0xff,0x8b,0x00,0x63,0x00,0x3a,0xff,0xb6,0x00,0x63,0x00,0x3c,0xff,0x64,0x00,0x63,0x00,0xea,0xff,0x64,0x00,0x63,0x01,0x20,0xff,0x6d,0x00,0x63, +0x01,0x22,0xff,0x6d,0x00,0x63,0x01,0x63,0x00,0x5e,0x00,0x63,0x01,0x76,0xff,0x6d,0x00,0x63,0x01,0x80,0xff,0xb6,0x00,0x63,0x01,0x82,0xff,0x64,0x00,0x63,0x01,0x8c,0xff,0xb6,0x00,0x63,0x01,0x8e,0xff,0xb6,0x00,0x63,0x01,0x90,0xff,0xb6,0x00,0x63,0x01,0x92,0xff,0x64,0x00,0x64,0x00,0x26,0xff,0xc9,0x00,0x64,0x00,0x2a,0xff,0xc9, +0x00,0x64,0x00,0x32,0xff,0xc9,0x00,0x64,0x00,0x34,0xff,0xc9,0x00,0x64,0x00,0xf7,0xff,0xc9,0x00,0x64,0x00,0xfc,0xff,0xc9,0x00,0x64,0x00,0xfe,0xff,0xc9,0x00,0x64,0x01,0x18,0xff,0xc9,0x00,0x64,0x01,0x47,0xff,0xc9,0x00,0x64,0x01,0x51,0xff,0xc9,0x00,0x64,0x01,0x53,0xff,0xc9,0x00,0x64,0x01,0x55,0xff,0xc9,0x00,0x64,0x01,0x6e, +0xff,0xc9,0x00,0x64,0x01,0x70,0xff,0xc9,0x00,0x64,0x01,0x89,0xff,0xc9,0x00,0x65,0x00,0x2d,0x00,0x3d,0x00,0x65,0x01,0x63,0x00,0x3d,0x00,0x67,0x00,0x24,0xff,0xe5,0x00,0x67,0x00,0x37,0xff,0xa4,0x00,0x67,0x00,0x3b,0xff,0xdb,0x00,0x67,0x00,0x3d,0xff,0xcf,0x00,0x67,0x00,0xe5,0xff,0xcf,0x00,0x67,0x01,0x03,0xff,0xe5,0x00,0x67, +0x01,0x05,0xff,0xe5,0x00,0x67,0x01,0x20,0xff,0xa4,0x00,0x67,0x01,0x22,0xff,0xa4,0x00,0x67,0x01,0x28,0xff,0xcf,0x00,0x67,0x01,0x2a,0xff,0xcf,0x00,0x67,0x01,0x45,0xff,0xe5,0x00,0x67,0x01,0x76,0xff,0xa4,0x00,0x67,0x01,0x85,0xff,0xe5,0x00,0x67,0x01,0x87,0xff,0xe5,0x00,0x79,0x00,0x44,0xff,0xe5,0x00,0x79,0x00,0x49,0xff,0xe7, +0x00,0x79,0x00,0x5b,0xff,0xe5,0x00,0x79,0x00,0xc0,0xff,0xe7,0x00,0x79,0x00,0xc1,0xff,0xe7,0x00,0x79,0x01,0x06,0xff,0xe5,0x00,0x79,0x01,0x88,0xff,0xe5,0x00,0x7a,0x00,0x44,0xff,0xe5,0x00,0x7a,0x00,0x49,0xff,0xe7,0x00,0x7a,0x00,0x5b,0xff,0xe5,0x00,0x7a,0x00,0xc0,0xff,0xe7,0x00,0x7a,0x00,0xc1,0xff,0xe7,0x00,0x7a,0x01,0x06, +0xff,0xe5,0x00,0x7a,0x01,0x88,0xff,0xe5,0x00,0x7b,0x00,0x44,0xff,0xe5,0x00,0x7b,0x00,0x49,0xff,0xe7,0x00,0x7b,0x00,0x5b,0xff,0xe5,0x00,0x7b,0x00,0xc0,0xff,0xe7,0x00,0x7b,0x00,0xc1,0xff,0xe7,0x00,0x7b,0x01,0x06,0xff,0xe5,0x00,0x7b,0x01,0x88,0xff,0xe5,0x00,0x7c,0x00,0x44,0xff,0xe5,0x00,0x7c,0x00,0x49,0xff,0xe7,0x00,0x7c, +0x00,0x5b,0xff,0xe5,0x00,0x7c,0x00,0xc0,0xff,0xe7,0x00,0x7c,0x00,0xc1,0xff,0xe7,0x00,0x7c,0x01,0x06,0xff,0xe5,0x00,0x7c,0x01,0x88,0xff,0xe5,0x00,0x7d,0x00,0x44,0xff,0xe5,0x00,0x7d,0x00,0x49,0xff,0xe7,0x00,0x7d,0x00,0x5b,0xff,0xe5,0x00,0x7d,0x00,0xc0,0xff,0xe7,0x00,0x7d,0x00,0xc1,0xff,0xe7,0x00,0x7d,0x01,0x06,0xff,0xe5, +0x00,0x7d,0x01,0x88,0xff,0xe5,0x00,0x91,0x00,0x2d,0x00,0x0e,0x00,0x91,0x01,0x63,0x00,0x0e,0x00,0x92,0x00,0x24,0xff,0xe5,0x00,0x92,0x00,0x37,0xff,0xa4,0x00,0x92,0x00,0x3b,0xff,0xdb,0x00,0x92,0x00,0x3d,0xff,0xcf,0x00,0x92,0x00,0xe5,0xff,0xcf,0x00,0x92,0x01,0x03,0xff,0xe5,0x00,0x92,0x01,0x05,0xff,0xe5,0x00,0x92,0x01,0x20, +0xff,0xa4,0x00,0x92,0x01,0x22,0xff,0xa4,0x00,0x92,0x01,0x28,0xff,0xcf,0x00,0x92,0x01,0x2a,0xff,0xcf,0x00,0x92,0x01,0x45,0xff,0xe5,0x00,0x92,0x01,0x76,0xff,0xa4,0x00,0x92,0x01,0x85,0xff,0xe5,0x00,0x92,0x01,0x87,0xff,0xe5,0x00,0xa1,0x00,0x44,0xff,0xe5,0x00,0xa1,0x00,0x49,0xff,0xe7,0x00,0xa1,0x00,0x5b,0xff,0xe5,0x00,0xa1, +0x00,0xc0,0xff,0xe7,0x00,0xa1,0x00,0xc1,0xff,0xe7,0x00,0xa1,0x01,0x06,0xff,0xe5,0x00,0xa1,0x01,0x88,0xff,0xe5,0x00,0xa2,0x00,0x3c,0xff,0x9a,0x00,0xa2,0x00,0x4d,0x00,0xbc,0x00,0xa2,0x00,0xea,0xff,0x9a,0x00,0xa2,0x01,0x64,0x00,0xbc,0x00,0xa2,0x01,0x82,0xff,0x9a,0x00,0xa2,0x01,0x92,0xff,0x9a,0x00,0xa4,0x00,0x4d,0x00,0xa0, +0x00,0xa4,0x01,0x33,0xff,0xdb,0x00,0xa4,0x01,0x64,0x00,0xa0,0x00,0xa4,0x02,0x37,0xff,0xdb,0x00,0xa9,0x00,0x0d,0xff,0x7f,0x00,0xa9,0x00,0x8d,0xff,0x98,0x00,0xa9,0x00,0xb4,0xff,0x66,0x00,0xa9,0x00,0xb5,0xff,0x3d,0x00,0xa9,0x00,0xb6,0xff,0x66,0x00,0xa9,0x00,0xb7,0xff,0x3d,0x00,0xa9,0x01,0x2d,0xff,0xd5,0x00,0xa9,0x01,0x2e, +0xff,0xd5,0x00,0xa9,0x01,0x33,0xff,0xa4,0x00,0xa9,0x01,0xb4,0xff,0xd5,0x00,0xa9,0x01,0xb7,0x00,0x3d,0x00,0xa9,0x01,0xb8,0xff,0x66,0x00,0xa9,0x01,0xb9,0xff,0x66,0x00,0xa9,0x01,0xba,0x00,0x3d,0x00,0xa9,0x01,0xbb,0xff,0x79,0x00,0xa9,0x01,0xbc,0x00,0x12,0x00,0xa9,0x01,0xbe,0xff,0x66,0x00,0xa9,0x01,0xc3,0xff,0xf6,0x00,0xa9, +0x01,0xc5,0xff,0xb6,0x00,0xa9,0x01,0xc8,0xff,0xf4,0x00,0xa9,0x01,0xcb,0x00,0x3d,0x00,0xa9,0x01,0xcd,0xff,0xdb,0x00,0xa9,0x01,0xd2,0xff,0xf6,0x00,0xa9,0x01,0xd3,0xff,0xc1,0x00,0xa9,0x01,0xd4,0xff,0xf6,0x00,0xa9,0x01,0xd7,0xff,0xf6,0x00,0xa9,0x01,0xd9,0xff,0xf6,0x00,0xaa,0x00,0x2d,0x00,0x52,0x00,0xaa,0x00,0x37,0xff,0xcf, +0x00,0xaa,0x00,0x3a,0x00,0x52,0x00,0xaa,0x00,0x3d,0x00,0x52,0x00,0xaa,0x00,0x5c,0x00,0x0c,0x00,0xaa,0x00,0xe5,0x00,0x52,0x00,0xaa,0x00,0xeb,0x00,0x0c,0x00,0xaa,0x01,0x20,0xff,0xcf,0x00,0xaa,0x01,0x22,0xff,0xcf,0x00,0xaa,0x01,0x28,0x00,0x52,0x00,0xaa,0x01,0x2a,0x00,0x52,0x00,0xaa,0x01,0x63,0x00,0x52,0x00,0xaa,0x01,0x76, +0xff,0xcf,0x00,0xaa,0x01,0x80,0x00,0x52,0x00,0xaa,0x01,0x83,0x00,0x0c,0x00,0xaa,0x01,0x8c,0x00,0x52,0x00,0xaa,0x01,0x8e,0x00,0x52,0x00,0xaa,0x01,0x90,0x00,0x52,0x00,0xaa,0x01,0x93,0x00,0x0c,0x00,0xaa,0x01,0xac,0x00,0x52,0x00,0xaa,0x01,0xb8,0xff,0xcd,0x00,0xaa,0x01,0xdc,0xff,0xcd,0x00,0xaa,0x01,0xe1,0x00,0x52,0x00,0xaa, +0x01,0xe3,0xff,0xcd,0x00,0xaa,0x01,0xeb,0x00,0x52,0x00,0xaa,0x01,0xf2,0x00,0x52,0x00,0xaa,0x01,0xf9,0xff,0xcd,0x00,0xaa,0x02,0x01,0xff,0xcd,0x00,0xaa,0x02,0x1a,0x00,0x0e,0x00,0xaa,0x02,0x31,0x00,0x0e,0x00,0xab,0x00,0x37,0xff,0xcf,0x00,0xab,0x00,0x39,0xff,0xcf,0x00,0xab,0x00,0x3a,0xff,0xcf,0x00,0xab,0x00,0x3c,0xff,0x9a, +0x00,0xab,0x00,0xea,0xff,0x9a,0x00,0xab,0x01,0x20,0xff,0xcf,0x00,0xab,0x01,0x22,0xff,0xcf,0x00,0xab,0x01,0x76,0xff,0xcf,0x00,0xab,0x01,0x80,0xff,0xcf,0x00,0xab,0x01,0x82,0xff,0x9a,0x00,0xab,0x01,0x8c,0xff,0xcf,0x00,0xab,0x01,0x8e,0xff,0xcf,0x00,0xab,0x01,0x90,0xff,0xcf,0x00,0xab,0x01,0x92,0xff,0x9a,0x00,0xab,0x01,0xb8, +0xff,0xcd,0x00,0xab,0x01,0xb9,0xff,0x98,0x00,0xab,0x01,0xdc,0xff,0xcd,0x00,0xab,0x01,0xe3,0xff,0xcd,0x00,0xab,0x01,0xf9,0xff,0xcd,0x00,0xab,0x02,0x01,0xff,0xcd,0x00,0xac,0x00,0xb4,0xff,0x31,0x00,0xac,0x00,0xb5,0xff,0x3d,0x00,0xac,0x00,0xb6,0xff,0x31,0x00,0xac,0x00,0xb7,0xff,0x3d,0x00,0xad,0x00,0x2d,0x00,0x5e,0x00,0xad, +0x00,0x37,0xff,0x6d,0x00,0xad,0x00,0x39,0xff,0x8b,0x00,0xad,0x00,0x3a,0xff,0xb6,0x00,0xad,0x00,0x3c,0xff,0x64,0x00,0xad,0x00,0xea,0xff,0x64,0x00,0xad,0x01,0x20,0xff,0x6d,0x00,0xad,0x01,0x22,0xff,0x6d,0x00,0xad,0x01,0x63,0x00,0x5e,0x00,0xad,0x01,0x76,0xff,0x6d,0x00,0xad,0x01,0x80,0xff,0xb6,0x00,0xad,0x01,0x82,0xff,0x64, +0x00,0xad,0x01,0x8c,0xff,0xb6,0x00,0xad,0x01,0x8e,0xff,0xb6,0x00,0xad,0x01,0x90,0xff,0xb6,0x00,0xad,0x01,0x92,0xff,0x64,0x00,0xae,0x00,0x2d,0x00,0x5e,0x00,0xae,0x00,0x37,0xff,0x6d,0x00,0xae,0x00,0x39,0xff,0x8b,0x00,0xae,0x00,0x3a,0xff,0xb6,0x00,0xae,0x00,0x3c,0xff,0x64,0x00,0xae,0x00,0xea,0xff,0x64,0x00,0xae,0x01,0x20, +0xff,0x6d,0x00,0xae,0x01,0x22,0xff,0x6d,0x00,0xae,0x01,0x63,0x00,0x5e,0x00,0xae,0x01,0x76,0xff,0x6d,0x00,0xae,0x01,0x80,0xff,0xb6,0x00,0xae,0x01,0x82,0xff,0x64,0x00,0xae,0x01,0x8c,0xff,0xb6,0x00,0xae,0x01,0x8e,0xff,0xb6,0x00,0xae,0x01,0x90,0xff,0xb6,0x00,0xae,0x01,0x92,0xff,0x64,0x00,0xaf,0x00,0x24,0xff,0xe5,0x00,0xaf, +0x00,0x37,0xff,0xa4,0x00,0xaf,0x00,0x3b,0xff,0xdb,0x00,0xaf,0x00,0x3d,0xff,0xcf,0x00,0xaf,0x00,0xe5,0xff,0xcf,0x00,0xaf,0x01,0x03,0xff,0xe5,0x00,0xaf,0x01,0x05,0xff,0xe5,0x00,0xaf,0x01,0x20,0xff,0xa4,0x00,0xaf,0x01,0x22,0xff,0xa4,0x00,0xaf,0x01,0x28,0xff,0xcf,0x00,0xaf,0x01,0x2a,0xff,0xcf,0x00,0xaf,0x01,0x45,0xff,0xe5, +0x00,0xaf,0x01,0x76,0xff,0xa4,0x00,0xaf,0x01,0x85,0xff,0xe5,0x00,0xaf,0x01,0x87,0xff,0xe5,0x00,0xb0,0x00,0x24,0x00,0x1d,0x00,0xb0,0x00,0x2d,0x00,0x44,0x00,0xb0,0x00,0x37,0x00,0x04,0x00,0xb0,0x00,0x3b,0x00,0x08,0x00,0xb0,0x01,0x03,0x00,0x1d,0x00,0xb0,0x01,0x05,0x00,0x1d,0x00,0xb0,0x01,0x20,0x00,0x04,0x00,0xb0,0x01,0x22, +0x00,0x04,0x00,0xb0,0x01,0x45,0x00,0x1d,0x00,0xb0,0x01,0x63,0x00,0x44,0x00,0xb0,0x01,0x76,0x00,0x04,0x00,0xb0,0x01,0x85,0x00,0x1d,0x00,0xb0,0x01,0x87,0x00,0x1d,0x00,0xb4,0x00,0x0f,0xff,0x98,0x00,0xb4,0x00,0x11,0xff,0x98,0x00,0xb4,0x00,0x24,0xff,0x25,0x00,0xb4,0x00,0x2d,0xff,0x62,0x00,0xb4,0x00,0x37,0x00,0x52,0x00,0xb4, +0x00,0x46,0xff,0x7f,0x00,0xb4,0x00,0x47,0xff,0x7f,0x00,0xb4,0x00,0x48,0xff,0x7f,0x00,0xb4,0x00,0x4a,0xff,0x73,0x00,0xb4,0x00,0x56,0xff,0xb2,0x00,0xb4,0x00,0x91,0xfe,0x87,0x00,0xb4,0x00,0xac,0xff,0x98,0x00,0xb4,0x00,0xe4,0xff,0xb2,0x00,0xb4,0x00,0xf8,0xff,0x73,0x00,0xb4,0x00,0xfb,0xff,0xb2,0x00,0xb4,0x00,0xfd,0xff,0x7f, +0x00,0xb4,0x00,0xff,0xff,0x7f,0x00,0xb4,0x01,0x00,0xff,0x7f,0x00,0xb4,0x01,0x03,0xff,0x25,0x00,0xb4,0x01,0x05,0xff,0x25,0x00,0xb4,0x01,0x08,0xff,0x7f,0x00,0xb4,0x01,0x0b,0xff,0x7f,0x00,0xb4,0x01,0x1f,0xff,0xb2,0x00,0xb4,0x01,0x20,0x00,0x52,0x00,0xb4,0x01,0x22,0x00,0x52,0x00,0xb4,0x01,0x45,0xff,0x25,0x00,0xb4,0x01,0x48, +0xff,0x7f,0x00,0xb4,0x01,0x52,0xff,0x73,0x00,0xb4,0x01,0x54,0xff,0x73,0x00,0xb4,0x01,0x56,0xff,0x73,0x00,0xb4,0x01,0x63,0xff,0x62,0x00,0xb4,0x01,0x75,0xff,0xb2,0x00,0xb4,0x01,0x76,0x00,0x52,0x00,0xb4,0x01,0x85,0xff,0x25,0x00,0xb4,0x01,0x87,0xff,0x25,0x00,0xb4,0x01,0xb8,0x00,0x52,0x00,0xb4,0x01,0xdc,0x00,0x52,0x00,0xb4, +0x01,0xe1,0xff,0x6f,0x00,0xb4,0x01,0xe3,0x00,0x52,0x00,0xb4,0x01,0xe7,0xff,0x23,0x00,0xb4,0x01,0xeb,0xff,0x6f,0x00,0xb4,0x01,0xf2,0xff,0x6f,0x00,0xb4,0x01,0xf9,0x00,0x52,0x00,0xb4,0x02,0x01,0x00,0x52,0x00,0xb4,0x02,0x0c,0xff,0x7f,0x00,0xb4,0x02,0x15,0xff,0x7f,0x00,0xb4,0x02,0x18,0xff,0x7f,0x00,0xb4,0x02,0x1b,0xff,0x7f, +0x00,0xb4,0x02,0x27,0xff,0x7f,0x00,0xb4,0x02,0x2a,0xff,0x7f,0x00,0xb4,0x02,0x2b,0xff,0xb0,0x00,0xb4,0x02,0x3e,0xff,0xb2,0x00,0xb5,0x00,0x0f,0xff,0x9a,0x00,0xb5,0x00,0x11,0xff,0x9a,0x00,0xb5,0x00,0x24,0xff,0x66,0x00,0xb5,0x00,0x37,0x00,0x52,0x00,0xb5,0x00,0x46,0xff,0xdd,0x00,0xb5,0x00,0x47,0xff,0x62,0x00,0xb5,0x00,0x48, +0xff,0x62,0x00,0xb5,0x00,0x4a,0xff,0x62,0x00,0xb5,0x00,0x52,0xff,0x62,0x00,0xb5,0x00,0x56,0xff,0x7f,0x00,0xb5,0x00,0x91,0xff,0x0a,0x00,0xb5,0x00,0xac,0xff,0x9a,0x00,0xb5,0x00,0xe4,0xff,0x7f,0x00,0xb5,0x00,0xf8,0xff,0x62,0x00,0xb5,0x00,0xfb,0xff,0x7f,0x00,0xb5,0x00,0xfd,0xff,0xdd,0x00,0xb5,0x00,0xff,0xff,0xdd,0x00,0xb5, +0x01,0x00,0xff,0x62,0x00,0xb5,0x01,0x03,0xff,0x66,0x00,0xb5,0x01,0x05,0xff,0x66,0x00,0xb5,0x01,0x08,0xff,0x62,0x00,0xb5,0x01,0x0b,0xff,0x62,0x00,0xb5,0x01,0x1f,0xff,0x7f,0x00,0xb5,0x01,0x20,0x00,0x52,0x00,0xb5,0x01,0x22,0x00,0x52,0x00,0xb5,0x01,0x45,0xff,0x66,0x00,0xb5,0x01,0x48,0xff,0xdd,0x00,0xb5,0x01,0x52,0xff,0x62, +0x00,0xb5,0x01,0x54,0xff,0x62,0x00,0xb5,0x01,0x56,0xff,0x62,0x00,0xb5,0x01,0x75,0xff,0x7f,0x00,0xb5,0x01,0x76,0x00,0x52,0x00,0xb5,0x01,0x85,0xff,0x66,0x00,0xb5,0x01,0x87,0xff,0x66,0x00,0xb5,0x01,0xdc,0x00,0x52,0x00,0xb5,0x01,0xe3,0x00,0x52,0x00,0xb5,0x01,0xe7,0xff,0x66,0x00,0xb5,0x01,0xf9,0x00,0x52,0x00,0xb5,0x02,0x01, +0x00,0x52,0x00,0xb5,0x02,0x0c,0xff,0x62,0x00,0xb5,0x02,0x15,0xff,0x62,0x00,0xb5,0x02,0x18,0xff,0x62,0x00,0xb5,0x02,0x1b,0xff,0x62,0x00,0xb5,0x02,0x27,0xff,0x62,0x00,0xb5,0x02,0x2a,0xff,0x62,0x00,0xb5,0x02,0x2b,0xff,0x7f,0x00,0xb5,0x02,0x3e,0xff,0x7f,0x00,0xb6,0x00,0x24,0xff,0x25,0x00,0xb6,0x00,0x26,0xff,0xbe,0x00,0xb6, +0x00,0x2d,0xff,0x6f,0x00,0xb6,0x00,0x37,0x00,0x52,0x00,0xb6,0x00,0x46,0xff,0x7f,0x00,0xb6,0x00,0x47,0xff,0x62,0x00,0xb6,0x00,0x48,0xff,0x7f,0x00,0xb6,0x00,0x4a,0xff,0x7f,0x00,0xb6,0x00,0x52,0xff,0x7f,0x00,0xb6,0x00,0x56,0xff,0xb2,0x00,0xb6,0x00,0x91,0xff,0x0a,0x00,0xb6,0x00,0xb6,0xff,0x54,0x00,0xb6,0x00,0xe4,0xff,0xb2, +0x00,0xb6,0x00,0xf8,0xff,0x7f,0x00,0xb6,0x00,0xfb,0xff,0xb2,0x00,0xb6,0x00,0xfc,0xff,0xbe,0x00,0xb6,0x00,0xfd,0xff,0x7f,0x00,0xb6,0x00,0xfe,0xff,0xbe,0x00,0xb6,0x00,0xff,0xff,0x7f,0x00,0xb6,0x01,0x00,0xff,0x62,0x00,0xb6,0x01,0x03,0xff,0x25,0x00,0xb6,0x01,0x05,0xff,0x25,0x00,0xb6,0x01,0x08,0xff,0x62,0x00,0xb6,0x01,0x0b, +0xff,0x7f,0x00,0xb6,0x01,0x1f,0xff,0xb2,0x00,0xb6,0x01,0x20,0x00,0x52,0x00,0xb6,0x01,0x22,0x00,0x52,0x00,0xb6,0x01,0x45,0xff,0x25,0x00,0xb6,0x01,0x47,0xff,0xbe,0x00,0xb6,0x01,0x48,0xff,0x7f,0x00,0xb6,0x01,0x52,0xff,0x7f,0x00,0xb6,0x01,0x54,0xff,0x7f,0x00,0xb6,0x01,0x56,0xff,0x7f,0x00,0xb6,0x01,0x63,0xff,0x6f,0x00,0xb6, +0x01,0x75,0xff,0xb2,0x00,0xb6,0x01,0x76,0x00,0x52,0x00,0xb6,0x01,0x85,0xff,0x25,0x00,0xb6,0x01,0x87,0xff,0x25,0x00,0xb6,0x01,0xdc,0x00,0x52,0x00,0xb6,0x01,0xde,0xff,0xbc,0x00,0xb6,0x01,0xe1,0xff,0x6f,0x00,0xb6,0x01,0xe3,0x00,0x52,0x00,0xb6,0x01,0xe7,0xff,0x23,0x00,0xb6,0x01,0xeb,0xff,0x6f,0x00,0xb6,0x01,0xf2,0xff,0x6f, +0x00,0xb6,0x01,0xf5,0xff,0xbc,0x00,0xb6,0x01,0xf8,0xff,0xbc,0x00,0xb6,0x01,0xf9,0x00,0x52,0x00,0xb6,0x01,0xfb,0xff,0xbc,0x00,0xb6,0x02,0x01,0x00,0x52,0x00,0xb6,0x02,0x0c,0xff,0x7f,0x00,0xb6,0x02,0x15,0xff,0x7f,0x00,0xb6,0x02,0x18,0xff,0x7f,0x00,0xb6,0x02,0x1b,0xff,0x7f,0x00,0xb6,0x02,0x27,0xff,0x7f,0x00,0xb6,0x02,0x2a, +0xff,0x7f,0x00,0xb6,0x02,0x2b,0xff,0xb0,0x00,0xb6,0x02,0x3e,0xff,0xb2,0x00,0xb7,0x00,0x0f,0xff,0x9a,0x00,0xb7,0x00,0x11,0xff,0x9a,0x00,0xb7,0x00,0x24,0xff,0x5a,0x00,0xb7,0x00,0x2d,0xff,0x62,0x00,0xb7,0x00,0x37,0x00,0x52,0x00,0xb7,0x00,0x44,0xff,0x98,0x00,0xb7,0x00,0x46,0xff,0x3d,0x00,0xb7,0x00,0x47,0xff,0x62,0x00,0xb7, +0x00,0x48,0xff,0x62,0x00,0xb7,0x00,0x4a,0xff,0x62,0x00,0xb7,0x00,0x52,0xff,0x62,0x00,0xb7,0x00,0x54,0xff,0x6f,0x00,0xb7,0x00,0x56,0xff,0x8b,0x00,0xb7,0x00,0x91,0xff,0x08,0x00,0xb7,0x00,0xac,0xff,0x9a,0x00,0xb7,0x00,0xb7,0xff,0x54,0x00,0xb7,0x00,0xc4,0xff,0x98,0x00,0xb7,0x00,0xe4,0xff,0x8b,0x00,0xb7,0x00,0xf8,0xff,0x62, +0x00,0xb7,0x00,0xfb,0xff,0x8b,0x00,0xb7,0x00,0xfd,0xff,0x3d,0x00,0xb7,0x00,0xff,0xff,0x3d,0x00,0xb7,0x01,0x00,0xff,0x62,0x00,0xb7,0x01,0x03,0xff,0x5a,0x00,0xb7,0x01,0x05,0xff,0x5a,0x00,0xb7,0x01,0x06,0xff,0x98,0x00,0xb7,0x01,0x08,0xff,0x62,0x00,0xb7,0x01,0x0b,0xff,0x62,0x00,0xb7,0x01,0x1f,0xff,0x8b,0x00,0xb7,0x01,0x20, +0x00,0x52,0x00,0xb7,0x01,0x22,0x00,0x52,0x00,0xb7,0x01,0x45,0xff,0x5a,0x00,0xb7,0x01,0x48,0xff,0x3d,0x00,0xb7,0x01,0x52,0xff,0x62,0x00,0xb7,0x01,0x54,0xff,0x62,0x00,0xb7,0x01,0x56,0xff,0x62,0x00,0xb7,0x01,0x63,0xff,0x62,0x00,0xb7,0x01,0x75,0xff,0x8b,0x00,0xb7,0x01,0x76,0x00,0x52,0x00,0xb7,0x01,0x85,0xff,0x5a,0x00,0xb7, +0x01,0x87,0xff,0x5a,0x00,0xb7,0x01,0x88,0xff,0x98,0x00,0xb7,0x01,0xdc,0x00,0x52,0x00,0xb7,0x01,0xe1,0xff,0x62,0x00,0xb7,0x01,0xe3,0x00,0x52,0x00,0xb7,0x01,0xe7,0xff,0x5a,0x00,0xb7,0x01,0xeb,0xff,0x62,0x00,0xb7,0x01,0xf2,0xff,0x62,0x00,0xb7,0x01,0xf9,0x00,0x52,0x00,0xb7,0x02,0x01,0x00,0x52,0x00,0xb7,0x02,0x07,0xff,0x96, +0x00,0xb7,0x02,0x0c,0xff,0x62,0x00,0xb7,0x02,0x15,0xff,0x62,0x00,0xb7,0x02,0x18,0xff,0x62,0x00,0xb7,0x02,0x1b,0xff,0x62,0x00,0xb7,0x02,0x27,0xff,0x62,0x00,0xb7,0x02,0x2a,0xff,0x62,0x00,0xb7,0x02,0x2b,0xff,0x8b,0x00,0xb7,0x02,0x3e,0xff,0x8b,0x00,0xba,0x00,0x46,0xff,0xf6,0x00,0xba,0x00,0x47,0xff,0xf6,0x00,0xba,0x00,0x48, +0xff,0xf6,0x00,0xba,0x00,0x4a,0xff,0xf6,0x00,0xba,0x00,0x52,0xff,0xf6,0x00,0xba,0x00,0x54,0xff,0xf6,0x00,0xba,0x00,0xf8,0xff,0xf6,0x00,0xba,0x00,0xfd,0xff,0xf6,0x00,0xba,0x00,0xff,0xff,0xf6,0x00,0xba,0x01,0x00,0xff,0xf6,0x00,0xba,0x01,0x08,0xff,0xf6,0x00,0xba,0x01,0x0b,0xff,0xf6,0x00,0xba,0x01,0x48,0xff,0xf6,0x00,0xba, +0x01,0x52,0xff,0xf6,0x00,0xba,0x01,0x54,0xff,0xf6,0x00,0xba,0x01,0x56,0xff,0xf6,0x00,0xbb,0x00,0x24,0xff,0x62,0x00,0xbb,0x00,0x26,0xff,0xe1,0x00,0xbb,0x00,0x2a,0xff,0xe1,0x00,0xbb,0x00,0x32,0xff,0xe1,0x00,0xbb,0x00,0x34,0xff,0xcd,0x00,0xbb,0x00,0x36,0xff,0xe5,0x00,0xbb,0x00,0xe3,0xff,0xe5,0x00,0xbb,0x00,0xf7,0xff,0xe1, +0x00,0xbb,0x00,0xfa,0xff,0xe5,0x00,0xbb,0x00,0xfc,0xff,0xe1,0x00,0xbb,0x00,0xfe,0xff,0xe1,0x00,0xbb,0x01,0x03,0xff,0x62,0x00,0xbb,0x01,0x05,0xff,0x62,0x00,0xbb,0x01,0x18,0xff,0xe1,0x00,0xbb,0x01,0x1e,0xff,0xe5,0x00,0xbb,0x01,0x45,0xff,0x62,0x00,0xbb,0x01,0x47,0xff,0xe1,0x00,0xbb,0x01,0x51,0xff,0xe1,0x00,0xbb,0x01,0x53, +0xff,0xe1,0x00,0xbb,0x01,0x55,0xff,0xe1,0x00,0xbb,0x01,0x6e,0xff,0xe1,0x00,0xbb,0x01,0x70,0xff,0xe1,0x00,0xbb,0x01,0x74,0xff,0xe5,0x00,0xbb,0x01,0x85,0xff,0x62,0x00,0xbb,0x01,0x87,0xff,0x62,0x00,0xbb,0x01,0x89,0xff,0xe1,0x00,0xbb,0x02,0x3d,0xff,0xe5,0x00,0xbe,0x00,0x2d,0x00,0x52,0x00,0xbe,0x00,0x37,0xff,0xcf,0x00,0xbe, +0x00,0x3a,0x00,0x27,0x00,0xbe,0x00,0x3d,0x00,0x52,0x00,0xbe,0x00,0x5c,0x00,0x0c,0x00,0xbe,0x00,0xe5,0x00,0x52,0x00,0xbe,0x00,0xeb,0x00,0x0c,0x00,0xbe,0x01,0x20,0xff,0xcf,0x00,0xbe,0x01,0x22,0xff,0xcf,0x00,0xbe,0x01,0x28,0x00,0x52,0x00,0xbe,0x01,0x2a,0x00,0x52,0x00,0xbe,0x01,0x63,0x00,0x52,0x00,0xbe,0x01,0x76,0xff,0xcf, +0x00,0xbe,0x01,0x80,0x00,0x27,0x00,0xbe,0x01,0x83,0x00,0x0c,0x00,0xbe,0x01,0x8c,0x00,0x27,0x00,0xbe,0x01,0x8e,0x00,0x27,0x00,0xbe,0x01,0x90,0x00,0x27,0x00,0xbe,0x01,0x93,0x00,0x0c,0x00,0xbe,0x01,0xdc,0xff,0xcd,0x00,0xbe,0x01,0xe1,0x00,0x52,0x00,0xbe,0x01,0xe3,0xff,0xcd,0x00,0xbe,0x01,0xeb,0x00,0x52,0x00,0xbe,0x01,0xf2, +0x00,0x52,0x00,0xbe,0x01,0xf9,0xff,0xcd,0x00,0xbe,0x02,0x01,0xff,0xcd,0x00,0xbe,0x02,0x1a,0x00,0x0e,0x00,0xbe,0x02,0x31,0x00,0x0e,0x00,0xbf,0x00,0x37,0xff,0x9a,0x00,0xbf,0x00,0x39,0xff,0xcf,0x00,0xbf,0x00,0x3a,0xff,0xcf,0x00,0xbf,0x00,0x3c,0xff,0x9a,0x00,0xbf,0x00,0xea,0xff,0x9a,0x00,0xbf,0x01,0x20,0xff,0x9a,0x00,0xbf, +0x01,0x22,0xff,0x9a,0x00,0xbf,0x01,0x76,0xff,0x9a,0x00,0xbf,0x01,0x80,0xff,0xcf,0x00,0xbf,0x01,0x82,0xff,0x9a,0x00,0xbf,0x01,0x8c,0xff,0xcf,0x00,0xbf,0x01,0x8e,0xff,0xcf,0x00,0xbf,0x01,0x90,0xff,0xcf,0x00,0xbf,0x01,0x92,0xff,0x9a,0x00,0xbf,0x01,0xdc,0xff,0x98,0x00,0xbf,0x01,0xe3,0xff,0x98,0x00,0xbf,0x01,0xf9,0xff,0x98, +0x00,0xbf,0x02,0x01,0xff,0x98,0x00,0xc4,0x00,0x2a,0xff,0xb2,0x00,0xc4,0x00,0x2d,0x00,0x6d,0x00,0xc4,0x00,0x32,0xff,0xa6,0x00,0xc4,0x00,0x37,0xff,0x31,0x00,0xc4,0x00,0x38,0xff,0xf6,0x00,0xc4,0x00,0x39,0xff,0x73,0x00,0xc4,0x00,0x3a,0xff,0x7f,0x00,0xc4,0x00,0x3b,0x00,0x39,0x00,0xc4,0x00,0x3c,0xff,0x08,0x00,0xc4,0x00,0x52, +0x00,0x19,0x00,0xc4,0x00,0x59,0xff,0x8b,0x00,0xc4,0x00,0x5a,0xff,0x7f,0x00,0xc4,0x00,0xea,0xff,0x08,0x00,0xc4,0x00,0xf7,0xff,0xb2,0x00,0xc4,0x01,0x18,0xff,0xa6,0x00,0xc4,0x01,0x20,0xff,0x31,0x00,0xc4,0x01,0x22,0xff,0x31,0x00,0xc4,0x01,0x24,0xff,0xf6,0x00,0xc4,0x01,0x26,0xff,0xf6,0x00,0xc4,0x01,0x51,0xff,0xb2,0x00,0xc4, +0x01,0x53,0xff,0xb2,0x00,0xc4,0x01,0x55,0xff,0xb2,0x00,0xc4,0x01,0x63,0x00,0x6d,0x00,0xc4,0x01,0x6e,0xff,0xa6,0x00,0xc4,0x01,0x70,0xff,0xa6,0x00,0xc4,0x01,0x76,0xff,0x31,0x00,0xc4,0x01,0x78,0xff,0xf6,0x00,0xc4,0x01,0x7a,0xff,0xf6,0x00,0xc4,0x01,0x7c,0xff,0xf6,0x00,0xc4,0x01,0x7e,0xff,0xf6,0x00,0xc4,0x01,0x80,0xff,0x7f, +0x00,0xc4,0x01,0x81,0xff,0x7f,0x00,0xc4,0x01,0x82,0xff,0x08,0x00,0xc4,0x01,0x89,0xff,0xa6,0x00,0xc4,0x01,0x8c,0xff,0x7f,0x00,0xc4,0x01,0x8d,0xff,0x7f,0x00,0xc4,0x01,0x8e,0xff,0x7f,0x00,0xc4,0x01,0x8f,0xff,0x7f,0x00,0xc4,0x01,0x90,0xff,0x7f,0x00,0xc4,0x01,0x91,0xff,0x7f,0x00,0xc4,0x01,0x92,0xff,0x08,0x00,0xc4,0x01,0xdc, +0xff,0x31,0x00,0xc4,0x01,0xde,0xff,0xa4,0x00,0xc4,0x01,0xe1,0x00,0x6f,0x00,0xc4,0x01,0xe3,0xff,0x31,0x00,0xc4,0x01,0xeb,0x00,0x6f,0x00,0xc4,0x01,0xf2,0x00,0x6f,0x00,0xc4,0x01,0xf5,0xff,0xa4,0x00,0xc4,0x01,0xf8,0xff,0xa4,0x00,0xc4,0x01,0xf9,0xff,0x31,0x00,0xc4,0x01,0xfb,0xff,0xa4,0x00,0xc4,0x01,0xfc,0x00,0x39,0x00,0xc4, +0x02,0x01,0xff,0x31,0x00,0xc4,0x02,0x08,0x00,0x1b,0x00,0xc4,0x02,0x0c,0x00,0x1b,0x00,0xc4,0x02,0x15,0x00,0x1b,0x00,0xc4,0x02,0x18,0x00,0x1b,0x00,0xc4,0x02,0x1b,0x00,0x1b,0x00,0xc4,0x02,0x27,0x00,0x1b,0x00,0xc4,0x02,0x2a,0x00,0x1b,0x00,0xc5,0x00,0x2a,0xff,0xa6,0x00,0xc5,0x00,0x2d,0x00,0x6d,0x00,0xc5,0x00,0x32,0xff,0xb2, +0x00,0xc5,0x00,0x37,0xff,0x31,0x00,0xc5,0x00,0x38,0xff,0xf6,0x00,0xc5,0x00,0x39,0xff,0x7f,0x00,0xc5,0x00,0x3a,0xff,0x8b,0x00,0xc5,0x00,0x3b,0x00,0x27,0x00,0xc5,0x00,0x3c,0xff,0x3d,0x00,0xc5,0x00,0x59,0xff,0x8b,0x00,0xc5,0x00,0x5a,0xff,0x7f,0x00,0xc5,0x00,0xea,0xff,0x3d,0x00,0xc5,0x00,0xf7,0xff,0xa6,0x00,0xc5,0x01,0x18, +0xff,0xb2,0x00,0xc5,0x01,0x20,0xff,0x31,0x00,0xc5,0x01,0x22,0xff,0x31,0x00,0xc5,0x01,0x24,0xff,0xf6,0x00,0xc5,0x01,0x26,0xff,0xf6,0x00,0xc5,0x01,0x51,0xff,0xa6,0x00,0xc5,0x01,0x53,0xff,0xa6,0x00,0xc5,0x01,0x55,0xff,0xa6,0x00,0xc5,0x01,0x63,0x00,0x6d,0x00,0xc5,0x01,0x6e,0xff,0xb2,0x00,0xc5,0x01,0x70,0xff,0xb2,0x00,0xc5, +0x01,0x76,0xff,0x31,0x00,0xc5,0x01,0x78,0xff,0xf6,0x00,0xc5,0x01,0x7a,0xff,0xf6,0x00,0xc5,0x01,0x7c,0xff,0xf6,0x00,0xc5,0x01,0x7e,0xff,0xf6,0x00,0xc5,0x01,0x80,0xff,0x8b,0x00,0xc5,0x01,0x81,0xff,0x7f,0x00,0xc5,0x01,0x82,0xff,0x3d,0x00,0xc5,0x01,0x89,0xff,0xb2,0x00,0xc5,0x01,0x8c,0xff,0x8b,0x00,0xc5,0x01,0x8d,0xff,0x7f, +0x00,0xc5,0x01,0x8e,0xff,0x8b,0x00,0xc5,0x01,0x8f,0xff,0x7f,0x00,0xc5,0x01,0x90,0xff,0x8b,0x00,0xc5,0x01,0x91,0xff,0x7f,0x00,0xc5,0x01,0x92,0xff,0x3d,0x00,0xc5,0x01,0xdc,0xff,0x31,0x00,0xc5,0x01,0xde,0xff,0xb0,0x00,0xc5,0x01,0xe1,0x00,0x6f,0x00,0xc5,0x01,0xe3,0xff,0x31,0x00,0xc5,0x01,0xeb,0x00,0x6f,0x00,0xc5,0x01,0xf2, +0x00,0x6f,0x00,0xc5,0x01,0xf5,0xff,0xb0,0x00,0xc5,0x01,0xf8,0xff,0xb0,0x00,0xc5,0x01,0xf9,0xff,0x31,0x00,0xc5,0x01,0xfb,0xff,0xb0,0x00,0xc5,0x01,0xfc,0x00,0x29,0x00,0xc5,0x02,0x01,0xff,0x31,0x00,0xc7,0x00,0x2d,0x00,0x5e,0x00,0xc7,0x00,0x37,0xff,0x6d,0x00,0xc7,0x00,0x39,0xff,0x8b,0x00,0xc7,0x00,0x3a,0xff,0xb6,0x00,0xc7, +0x00,0x3c,0xff,0x64,0x00,0xc7,0x00,0xea,0xff,0x64,0x00,0xc7,0x01,0x20,0xff,0x6d,0x00,0xc7,0x01,0x22,0xff,0x6d,0x00,0xc7,0x01,0x63,0x00,0x5e,0x00,0xc7,0x01,0x76,0xff,0x6d,0x00,0xc7,0x01,0x80,0xff,0xb6,0x00,0xc7,0x01,0x82,0xff,0x64,0x00,0xc7,0x01,0x8c,0xff,0xb6,0x00,0xc7,0x01,0x8e,0xff,0xb6,0x00,0xc7,0x01,0x90,0xff,0xb6, +0x00,0xc7,0x01,0x92,0xff,0x64,0x00,0xc8,0x00,0x2d,0x00,0x3d,0x00,0xc8,0x01,0x63,0x00,0x3d,0x00,0xc9,0x00,0x2d,0x00,0x5e,0x00,0xc9,0x00,0x37,0xff,0x6d,0x00,0xc9,0x00,0x39,0xff,0x8b,0x00,0xc9,0x00,0x3a,0xff,0xb6,0x00,0xc9,0x00,0x3c,0xff,0x64,0x00,0xc9,0x00,0xea,0xff,0x64,0x00,0xc9,0x01,0x20,0xff,0x6d,0x00,0xc9,0x01,0x22, +0xff,0x6d,0x00,0xc9,0x01,0x63,0x00,0x5e,0x00,0xc9,0x01,0x76,0xff,0x6d,0x00,0xc9,0x01,0x80,0xff,0xb6,0x00,0xc9,0x01,0x82,0xff,0x64,0x00,0xc9,0x01,0x8c,0xff,0xb6,0x00,0xc9,0x01,0x8e,0xff,0xb6,0x00,0xc9,0x01,0x90,0xff,0xb6,0x00,0xc9,0x01,0x92,0xff,0x64,0x00,0xca,0x00,0x2d,0x00,0x3d,0x00,0xca,0x01,0x63,0x00,0x3d,0x00,0xcb, +0x00,0x2d,0x00,0x3d,0x00,0xcb,0x01,0x63,0x00,0x3d,0x00,0xd0,0x00,0x24,0xff,0xe5,0x00,0xd0,0x00,0x37,0xff,0xa4,0x00,0xd0,0x00,0x3b,0xff,0xdb,0x00,0xd0,0x00,0x3d,0xff,0xcf,0x00,0xd0,0x00,0xe5,0xff,0xcf,0x00,0xd0,0x01,0x03,0xff,0xe5,0x00,0xd0,0x01,0x05,0xff,0xe5,0x00,0xd0,0x01,0x20,0xff,0xa4,0x00,0xd0,0x01,0x22,0xff,0xa4, +0x00,0xd0,0x01,0x28,0xff,0xcf,0x00,0xd0,0x01,0x2a,0xff,0xcf,0x00,0xd0,0x01,0x45,0xff,0xe5,0x00,0xd0,0x01,0x76,0xff,0xa4,0x00,0xd0,0x01,0x85,0xff,0xe5,0x00,0xd0,0x01,0x87,0xff,0xe5,0x00,0xd1,0x00,0x24,0xff,0xe5,0x00,0xd1,0x00,0x37,0xff,0xa4,0x00,0xd1,0x00,0x3b,0xff,0xdb,0x00,0xd1,0x00,0x3d,0xff,0xcf,0x00,0xd1,0x00,0xe5, +0xff,0xcf,0x00,0xd1,0x01,0x03,0xff,0xe5,0x00,0xd1,0x01,0x05,0xff,0xe5,0x00,0xd1,0x01,0x20,0xff,0xa4,0x00,0xd1,0x01,0x22,0xff,0xa4,0x00,0xd1,0x01,0x28,0xff,0xcf,0x00,0xd1,0x01,0x2a,0xff,0xcf,0x00,0xd1,0x01,0x45,0xff,0xe5,0x00,0xd1,0x01,0x76,0xff,0xa4,0x00,0xd1,0x01,0x85,0xff,0xe5,0x00,0xd1,0x01,0x87,0xff,0xe5,0x00,0xd2, +0x00,0x24,0xff,0xe5,0x00,0xd2,0x00,0x37,0xff,0xa4,0x00,0xd2,0x00,0x3b,0xff,0xdb,0x00,0xd2,0x00,0x3d,0xff,0xcf,0x00,0xd2,0x00,0xe5,0xff,0xcf,0x00,0xd2,0x01,0x03,0xff,0xe5,0x00,0xd2,0x01,0x05,0xff,0xe5,0x00,0xd2,0x01,0x20,0xff,0xa4,0x00,0xd2,0x01,0x22,0xff,0xa4,0x00,0xd2,0x01,0x28,0xff,0xcf,0x00,0xd2,0x01,0x2a,0xff,0xcf, +0x00,0xd2,0x01,0x45,0xff,0xe5,0x00,0xd2,0x01,0x76,0xff,0xa4,0x00,0xd2,0x01,0x85,0xff,0xe5,0x00,0xd2,0x01,0x87,0xff,0xe5,0x00,0xe1,0x00,0x0d,0xff,0x31,0x00,0xe1,0x00,0x22,0xff,0x9a,0x00,0xe1,0x00,0x24,0x00,0x3b,0x00,0xe1,0x00,0x26,0xff,0xbe,0x00,0xe1,0x00,0x2a,0xff,0xbe,0x00,0xe1,0x00,0x2d,0x00,0x64,0x00,0xe1,0x00,0x32, +0xff,0xba,0x00,0xe1,0x00,0x34,0xff,0xba,0x00,0xe1,0x00,0x37,0xff,0x8f,0x00,0xe1,0x00,0x38,0xff,0xe3,0x00,0xe1,0x00,0x39,0xff,0x8b,0x00,0xe1,0x00,0x3a,0xff,0xcf,0x00,0xe1,0x00,0x3c,0xff,0x7f,0x00,0xe1,0x00,0x3d,0x00,0x3b,0x00,0xe1,0x00,0x57,0xff,0xe5,0x00,0xe1,0x00,0x59,0xff,0x9a,0x00,0xe1,0x00,0x5a,0xff,0xbe,0x00,0xe1, +0x00,0x5c,0xff,0xb4,0x00,0xe1,0x00,0x64,0xff,0xbe,0x00,0xe1,0x00,0x67,0xff,0xba,0x00,0xe1,0x00,0x68,0xff,0xe3,0x00,0xe1,0x00,0x8d,0xff,0x9a,0x00,0xe1,0x00,0x92,0xff,0xba,0x00,0xe1,0x00,0xaf,0xff,0xba,0x00,0xe1,0x00,0xb0,0xff,0xba,0x00,0xe1,0x00,0xb4,0xff,0x73,0x00,0xe1,0x00,0xb5,0xff,0x8b,0x00,0xe1,0x00,0xb6,0xff,0x73, +0x00,0xe1,0x00,0xb7,0xff,0x7f,0x00,0xe1,0x00,0xba,0xff,0xb4,0x00,0xe1,0x00,0xbb,0xff,0x9a,0x00,0xe1,0x00,0xc4,0x00,0x44,0x00,0xe1,0x00,0xc5,0x00,0x44,0x00,0xe1,0x00,0xd0,0xff,0xba,0x00,0xe1,0x00,0xd1,0xff,0xba,0x00,0xe1,0x00,0xd2,0xff,0xba,0x00,0xe1,0x00,0xd3,0xff,0xe3,0x00,0xe1,0x00,0xd4,0xff,0xe3,0x00,0xe1,0x00,0xd5, +0xff,0xe3,0x00,0xe1,0x00,0xe5,0x00,0x3b,0x00,0xe1,0x00,0xea,0xff,0x7f,0x00,0xe1,0x00,0xeb,0xff,0xb4,0x00,0xe1,0x00,0xf7,0xff,0xbe,0x00,0xe1,0x00,0xfc,0xff,0xbe,0x00,0xe1,0x00,0xfe,0xff,0xbe,0x00,0xe1,0x01,0x03,0x00,0x3b,0x00,0xe1,0x01,0x05,0x00,0x3b,0x00,0xe1,0x01,0x18,0xff,0xba,0x00,0xe1,0x01,0x20,0xff,0x8f,0x00,0xe1, +0x01,0x21,0xff,0xe5,0x00,0xe1,0x01,0x22,0xff,0x8f,0x00,0xe1,0x01,0x23,0xff,0xe5,0x00,0xe1,0x01,0x24,0xff,0xe3,0x00,0xe1,0x01,0x26,0xff,0xe3,0x00,0xe1,0x01,0x28,0x00,0x3b,0x00,0xe1,0x01,0x2a,0x00,0x3b,0x00,0xe1,0x01,0x45,0x00,0x3b,0x00,0xe1,0x01,0x47,0xff,0xbe,0x00,0xe1,0x01,0x51,0xff,0xbe,0x00,0xe1,0x01,0x53,0xff,0xbe, +0x00,0xe1,0x01,0x55,0xff,0xbe,0x00,0xe1,0x01,0x63,0x00,0x64,0x00,0xe1,0x01,0x6e,0xff,0xba,0x00,0xe1,0x01,0x70,0xff,0xba,0x00,0xe1,0x01,0x76,0xff,0x8f,0x00,0xe1,0x01,0x77,0xff,0xe5,0x00,0xe1,0x01,0x78,0xff,0xe3,0x00,0xe1,0x01,0x7a,0xff,0xe3,0x00,0xe1,0x01,0x7c,0xff,0xe3,0x00,0xe1,0x01,0x7e,0xff,0xe3,0x00,0xe1,0x01,0x80, +0xff,0xcf,0x00,0xe1,0x01,0x81,0xff,0xbe,0x00,0xe1,0x01,0x82,0xff,0x7f,0x00,0xe1,0x01,0x83,0xff,0xb4,0x00,0xe1,0x01,0x85,0x00,0x3b,0x00,0xe1,0x01,0x87,0x00,0x3b,0x00,0xe1,0x01,0x89,0xff,0xba,0x00,0xe1,0x01,0x8c,0xff,0xcf,0x00,0xe1,0x01,0x8d,0xff,0xbe,0x00,0xe1,0x01,0x8e,0xff,0xcf,0x00,0xe1,0x01,0x8f,0xff,0xbe,0x00,0xe1, +0x01,0x90,0xff,0xcf,0x00,0xe1,0x01,0x91,0xff,0xbe,0x00,0xe1,0x01,0x92,0xff,0x7f,0x00,0xe1,0x01,0x93,0xff,0xb4,0x00,0xe3,0x00,0x57,0xff,0xbe,0x00,0xe3,0x00,0x59,0xff,0xcf,0x00,0xe3,0x00,0x5a,0xff,0xe5,0x00,0xe3,0x00,0x5c,0xff,0xd1,0x00,0xe3,0x00,0xba,0xff,0xbe,0x00,0xe3,0x00,0xc4,0xff,0xb2,0x00,0xe3,0x00,0xc5,0xff,0xb2, +0x00,0xe3,0x00,0xeb,0xff,0xd1,0x00,0xe3,0x01,0x21,0xff,0xbe,0x00,0xe3,0x01,0x23,0xff,0xbe,0x00,0xe3,0x01,0x77,0xff,0xbe,0x00,0xe3,0x01,0x81,0xff,0xe5,0x00,0xe3,0x01,0x83,0xff,0xd1,0x00,0xe3,0x01,0x8d,0xff,0xe5,0x00,0xe3,0x01,0x8f,0xff,0xe5,0x00,0xe3,0x01,0x91,0xff,0xe5,0x00,0xe3,0x01,0x93,0xff,0xd1,0x00,0xe5,0x00,0x2d, +0x00,0x52,0x00,0xe5,0x00,0x37,0x00,0x27,0x00,0xe5,0x00,0x5c,0xff,0xcb,0x00,0xe5,0x00,0x77,0x00,0x46,0x00,0xe5,0x00,0xab,0x00,0x27,0x00,0xe5,0x00,0xba,0xff,0xbe,0x00,0xe5,0x00,0xbf,0x00,0x52,0x00,0xe5,0x00,0xeb,0xff,0xcb,0x00,0xe5,0x01,0x20,0x00,0x27,0x00,0xe5,0x01,0x22,0x00,0x27,0x00,0xe5,0x01,0x5c,0x00,0x46,0x00,0xe5, +0x01,0x5e,0x00,0x46,0x00,0xe5,0x01,0x60,0x00,0x46,0x00,0xe5,0x01,0x63,0x00,0x52,0x00,0xe5,0x01,0x76,0x00,0x27,0x00,0xe5,0x01,0x83,0xff,0xcb,0x00,0xe5,0x01,0x93,0xff,0xcb,0x00,0xe8,0x00,0x0f,0xff,0x7f,0x00,0xe8,0x00,0x11,0xff,0x7f,0x00,0xe8,0x00,0x24,0xff,0xdf,0x00,0xe8,0x00,0x37,0xff,0xa4,0x00,0xe8,0x00,0x3b,0xff,0xcb, +0x00,0xe8,0x00,0x3d,0xff,0xcf,0x00,0xe8,0x00,0x62,0xff,0xdf,0x00,0xe8,0x00,0x63,0xff,0xdf,0x00,0xe8,0x00,0x91,0xff,0xb6,0x00,0xe8,0x00,0xac,0xff,0x7f,0x00,0xe8,0x00,0xad,0xff,0xdf,0x00,0xe8,0x00,0xae,0xff,0xdf,0x00,0xe8,0x00,0xbb,0xff,0xf6,0x00,0xe8,0x00,0xc4,0xff,0x8b,0x00,0xe8,0x00,0xc5,0xff,0x8b,0x00,0xe8,0x00,0xc7, +0xff,0xdf,0x00,0xe8,0x00,0xc9,0xff,0xdf,0x00,0xe8,0x00,0xe5,0xff,0xcf,0x00,0xe8,0x01,0x03,0xff,0xdf,0x00,0xe8,0x01,0x05,0xff,0xdf,0x00,0xe8,0x01,0x20,0xff,0xa4,0x00,0xe8,0x01,0x22,0xff,0xa4,0x00,0xe8,0x01,0x28,0xff,0xcf,0x00,0xe8,0x01,0x2a,0xff,0xcf,0x00,0xe8,0x01,0x45,0xff,0xdf,0x00,0xe8,0x01,0x76,0xff,0xa4,0x00,0xe8, +0x01,0x85,0xff,0xdf,0x00,0xe8,0x01,0x87,0xff,0xdf,0x00,0xea,0x00,0x0f,0xff,0x50,0x00,0xea,0x00,0x11,0xff,0x3d,0x00,0xea,0x00,0x24,0xff,0x62,0x00,0xea,0x00,0x26,0xff,0xd3,0x00,0xea,0x00,0x2a,0xff,0xd3,0x00,0xea,0x00,0x2d,0xff,0xbe,0x00,0xea,0x00,0x32,0xff,0xd3,0x00,0xea,0x00,0x34,0xff,0xd3,0x00,0xea,0x00,0x36,0xff,0xe5, +0x00,0xea,0x00,0x37,0x00,0x27,0x00,0xea,0x00,0x44,0xff,0x39,0x00,0xea,0x00,0x46,0xff,0x4c,0x00,0xea,0x00,0x47,0xff,0x4c,0x00,0xea,0x00,0x48,0xff,0x4c,0x00,0xea,0x00,0x49,0xff,0xe5,0x00,0xea,0x00,0x4a,0xff,0x4c,0x00,0xea,0x00,0x50,0xff,0x73,0x00,0xea,0x00,0x51,0xff,0x73,0x00,0xea,0x00,0x52,0xff,0x4c,0x00,0xea,0x00,0x53, +0xff,0x73,0x00,0xea,0x00,0x54,0xff,0x4c,0x00,0xea,0x00,0x55,0xff,0x73,0x00,0xea,0x00,0x56,0xff,0x7b,0x00,0xea,0x00,0x58,0xff,0x73,0x00,0xea,0x00,0x62,0xff,0x62,0x00,0xea,0x00,0x63,0xff,0x62,0x00,0xea,0x00,0x64,0xff,0xcd,0x00,0xea,0x00,0x67,0xff,0xd3,0x00,0xea,0x00,0x69,0xff,0x39,0x00,0xea,0x00,0x6a,0xff,0x39,0x00,0xea, +0x00,0x6b,0xff,0x39,0x00,0xea,0x00,0x6c,0xff,0x7f,0x00,0xea,0x00,0x6d,0xff,0x66,0x00,0xea,0x00,0x6e,0xff,0x39,0x00,0xea,0x00,0x6f,0xff,0x4c,0x00,0xea,0x00,0x70,0xff,0x4c,0x00,0xea,0x00,0x71,0xff,0x4c,0x00,0xea,0x00,0x72,0xff,0x4c,0x00,0xea,0x00,0x73,0xff,0x4c,0x00,0xea,0x00,0x77,0x00,0x5a,0x00,0xea,0x00,0x78,0xff,0x73, +0x00,0xea,0x00,0x79,0xff,0x4c,0x00,0xea,0x00,0x7a,0xff,0x4c,0x00,0xea,0x00,0x7b,0xff,0x4c,0x00,0xea,0x00,0x7c,0xff,0x4c,0x00,0xea,0x00,0x7d,0xff,0x4c,0x00,0xea,0x00,0x7e,0xff,0x73,0x00,0xea,0x00,0x7f,0xff,0x73,0x00,0xea,0x00,0x80,0xff,0x73,0x00,0xea,0x00,0x81,0xff,0x73,0x00,0xea,0x00,0x91,0xff,0x3f,0x00,0xea,0x00,0x92, +0xff,0xd3,0x00,0xea,0x00,0xa0,0xff,0x39,0x00,0xea,0x00,0xa2,0xff,0x1b,0x00,0xea,0x00,0xaa,0xff,0xcf,0x00,0xea,0x00,0xac,0xff,0x3d,0x00,0xea,0x00,0xad,0xff,0x62,0x00,0xea,0x00,0xae,0xff,0x62,0x00,0xea,0x00,0xaf,0xff,0xd3,0x00,0xea,0x00,0xb0,0xff,0xd3,0x00,0xea,0x00,0xb1,0xff,0x4c,0x00,0xea,0x00,0xbe,0xff,0x9a,0x00,0xea, +0x00,0xc4,0xff,0x08,0x00,0xea,0x00,0xc5,0xff,0x08,0x00,0xea,0x00,0xc7,0xff,0x62,0x00,0xea,0x00,0xc9,0xff,0x62,0x00,0xea,0x00,0xd0,0xff,0xd3,0x00,0xea,0x00,0xd1,0xff,0xd3,0x00,0xea,0x00,0xd2,0xff,0xd3,0x00,0xea,0x00,0xe3,0xff,0xe5,0x00,0xea,0x00,0xe4,0xff,0x7b,0x00,0xea,0x00,0xf7,0xff,0xd3,0x00,0xea,0x00,0xf8,0xff,0x4c, +0x00,0xea,0x00,0xfa,0xff,0xe5,0x00,0xea,0x00,0xfb,0xff,0x7b,0x00,0xea,0x00,0xfc,0xff,0xd3,0x00,0xea,0x00,0xfd,0xff,0x4c,0x00,0xea,0x00,0xfe,0xff,0xd3,0x00,0xea,0x00,0xff,0xff,0x4c,0x00,0xea,0x01,0x00,0xff,0x4c,0x00,0xea,0x01,0x03,0xff,0x62,0x00,0xea,0x01,0x04,0xff,0x7f,0x00,0xea,0x01,0x05,0xff,0x62,0x00,0xea,0x01,0x06, +0xff,0x39,0x00,0xea,0x01,0x08,0xff,0x4c,0x00,0xea,0x01,0x0b,0xff,0x4c,0x00,0xea,0x01,0x0d,0xff,0x4c,0x00,0xea,0x01,0x15,0xff,0x73,0x00,0xea,0x01,0x17,0xff,0x73,0x00,0xea,0x01,0x18,0xff,0xd3,0x00,0xea,0x01,0x19,0xff,0x4c,0x00,0xea,0x01,0x1b,0xff,0x73,0x00,0xea,0x01,0x1d,0xff,0x73,0x00,0xea,0x01,0x1e,0xff,0xe5,0x00,0xea, +0x01,0x1f,0xff,0x7b,0x00,0xea,0x01,0x20,0x00,0x27,0x00,0xea,0x01,0x22,0x00,0x27,0x00,0xea,0x01,0x25,0xff,0x73,0x00,0xea,0x01,0x27,0xff,0x73,0x00,0xea,0x01,0x45,0xff,0x62,0x00,0xea,0x01,0x46,0xff,0x7f,0x00,0xea,0x01,0x47,0xff,0xd3,0x00,0xea,0x01,0x48,0xff,0x4c,0x00,0xea,0x01,0x4c,0xff,0x4c,0x00,0xea,0x01,0x4e,0xff,0x4c, +0x00,0xea,0x01,0x50,0xff,0x4c,0x00,0xea,0x01,0x51,0xff,0xd3,0x00,0xea,0x01,0x52,0xff,0x4c,0x00,0xea,0x01,0x53,0xff,0xd3,0x00,0xea,0x01,0x54,0xff,0x4c,0x00,0xea,0x01,0x55,0xff,0xd3,0x00,0xea,0x01,0x56,0xff,0x4c,0x00,0xea,0x01,0x5c,0x00,0x5a,0x00,0xea,0x01,0x5e,0x00,0x5a,0x00,0xea,0x01,0x60,0x00,0x5a,0x00,0xea,0x01,0x63, +0xff,0xbe,0x00,0xea,0x01,0x6d,0xff,0x73,0x00,0xea,0x01,0x6e,0xff,0xd3,0x00,0xea,0x01,0x6f,0xff,0x4c,0x00,0xea,0x01,0x70,0xff,0xd3,0x00,0xea,0x01,0x71,0xff,0x4c,0x00,0xea,0x01,0x73,0xff,0x73,0x00,0xea,0x01,0x74,0xff,0xe5,0x00,0xea,0x01,0x75,0xff,0x7b,0x00,0xea,0x01,0x76,0x00,0x27,0x00,0xea,0x01,0x79,0xff,0x73,0x00,0xea, +0x01,0x7b,0xff,0x73,0x00,0xea,0x01,0x7d,0xff,0x73,0x00,0xea,0x01,0x7f,0xff,0x73,0x00,0xea,0x01,0x85,0xff,0x62,0x00,0xea,0x01,0x86,0xff,0x7f,0x00,0xea,0x01,0x87,0xff,0x62,0x00,0xea,0x01,0x88,0xff,0x39,0x00,0xea,0x01,0x89,0xff,0xd3,0x00,0xea,0x01,0x8a,0xff,0x4c,0x00,0xea,0x02,0x3d,0xff,0xe5,0x00,0xea,0x02,0x3e,0xff,0x7b, +0x00,0xeb,0x00,0x05,0x00,0x1d,0x00,0xeb,0x00,0x0a,0x00,0x1d,0x00,0xeb,0x00,0x0f,0xff,0x9a,0x00,0xeb,0x00,0x11,0xff,0x81,0x00,0xeb,0x00,0x22,0xff,0xb4,0x00,0xeb,0x00,0x46,0xff,0xf6,0x00,0xeb,0x00,0x47,0xff,0xf6,0x00,0xeb,0x00,0x48,0xff,0xf6,0x00,0xeb,0x00,0x49,0x00,0x04,0x00,0xeb,0x00,0x4a,0xff,0xf6,0x00,0xeb,0x00,0x52, +0xff,0xf6,0x00,0xeb,0x00,0x54,0xff,0xf6,0x00,0xeb,0x00,0x57,0x00,0x06,0x00,0xeb,0x00,0x6f,0xff,0xf6,0x00,0xeb,0x00,0x70,0xff,0xf6,0x00,0xeb,0x00,0x71,0xff,0xf6,0x00,0xeb,0x00,0x72,0xff,0xf6,0x00,0xeb,0x00,0x73,0xff,0xf6,0x00,0xeb,0x00,0x79,0xff,0xf6,0x00,0xeb,0x00,0x7a,0xff,0xf6,0x00,0xeb,0x00,0x7b,0xff,0xf6,0x00,0xeb, +0x00,0x7c,0xff,0xf6,0x00,0xeb,0x00,0x7d,0xff,0xf6,0x00,0xeb,0x00,0xac,0xff,0x81,0x00,0xeb,0x00,0xb1,0xff,0xf6,0x00,0xeb,0x00,0xbf,0x00,0x0c,0x00,0xeb,0x00,0xc4,0xff,0x8d,0x00,0xeb,0x00,0xc5,0xff,0x8d,0x00,0xeb,0x00,0xf8,0xff,0xf6,0x00,0xeb,0x00,0xfd,0xff,0xf6,0x00,0xeb,0x00,0xff,0xff,0xf6,0x00,0xeb,0x01,0x00,0xff,0xf6, +0x00,0xeb,0x01,0x08,0xff,0xf6,0x00,0xeb,0x01,0x0b,0xff,0xf6,0x00,0xeb,0x01,0x0d,0xff,0xf6,0x00,0xeb,0x01,0x19,0xff,0xf6,0x00,0xeb,0x01,0x21,0x00,0x06,0x00,0xeb,0x01,0x23,0x00,0x06,0x00,0xeb,0x01,0x48,0xff,0xf6,0x00,0xeb,0x01,0x4c,0xff,0xf6,0x00,0xeb,0x01,0x4e,0xff,0xf6,0x00,0xeb,0x01,0x50,0xff,0xf6,0x00,0xeb,0x01,0x52, +0xff,0xf6,0x00,0xeb,0x01,0x54,0xff,0xf6,0x00,0xeb,0x01,0x56,0xff,0xf6,0x00,0xeb,0x01,0x6f,0xff,0xf6,0x00,0xeb,0x01,0x71,0xff,0xf6,0x00,0xeb,0x01,0x77,0x00,0x06,0x00,0xeb,0x01,0x8a,0xff,0xf6,0x00,0xec,0x00,0x0f,0xfe,0xba,0x00,0xec,0x00,0x11,0xfe,0xba,0x00,0xec,0x00,0x24,0xff,0x62,0x00,0xec,0x00,0x2a,0xff,0xf6,0x00,0xec, +0x00,0x2d,0xff,0x7f,0x00,0xec,0x00,0x3a,0x00,0x27,0x00,0xec,0x00,0x3b,0xff,0xc3,0x00,0xec,0x00,0x44,0xff,0xbe,0x00,0xec,0x00,0x46,0xff,0xb4,0x00,0xec,0x00,0x47,0xff,0xb4,0x00,0xec,0x00,0x48,0xff,0xb4,0x00,0xec,0x00,0x4a,0xff,0xb4,0x00,0xec,0x00,0x52,0xff,0xb4,0x00,0xec,0x00,0x54,0xff,0xb6,0x00,0xec,0x00,0x62,0xff,0x62, +0x00,0xec,0x00,0x63,0xff,0x62,0x00,0xec,0x00,0x69,0xff,0xbe,0x00,0xec,0x00,0x6a,0xff,0xbe,0x00,0xec,0x00,0x6b,0xff,0xbe,0x00,0xec,0x00,0x6c,0xff,0xbe,0x00,0xec,0x00,0x6d,0xff,0xbe,0x00,0xec,0x00,0x6e,0xff,0xbe,0x00,0xec,0x00,0x6f,0xff,0xb4,0x00,0xec,0x00,0x70,0xff,0xb4,0x00,0xec,0x00,0x71,0xff,0xb4,0x00,0xec,0x00,0x72, +0xff,0xb4,0x00,0xec,0x00,0x73,0xff,0xb4,0x00,0xec,0x00,0x79,0xff,0xb4,0x00,0xec,0x00,0x7a,0xff,0xb4,0x00,0xec,0x00,0x7b,0xff,0xb4,0x00,0xec,0x00,0x7c,0xff,0xb4,0x00,0xec,0x00,0x7d,0xff,0xb4,0x00,0xec,0x00,0x91,0xfe,0xe9,0x00,0xec,0x00,0xa0,0xff,0xbe,0x00,0xec,0x00,0xac,0xfe,0xba,0x00,0xec,0x00,0xad,0xff,0x62,0x00,0xec, +0x00,0xae,0xff,0x62,0x00,0xec,0x00,0xb1,0xff,0xb4,0x00,0xec,0x00,0xc4,0xfe,0xba,0x00,0xec,0x00,0xc5,0xfe,0xae,0x00,0xec,0x00,0xc7,0xff,0x62,0x00,0xec,0x00,0xc9,0xff,0x62,0x00,0xec,0x00,0xf7,0xff,0xf6,0x00,0xec,0x00,0xf8,0xff,0xb4,0x00,0xec,0x00,0xfd,0xff,0xb4,0x00,0xec,0x00,0xff,0xff,0xb4,0x00,0xec,0x01,0x00,0xff,0xb4, +0x00,0xec,0x01,0x03,0xff,0x62,0x00,0xec,0x01,0x04,0xff,0xbe,0x00,0xec,0x01,0x05,0xff,0x62,0x00,0xec,0x01,0x06,0xff,0xbe,0x00,0xec,0x01,0x08,0xff,0xb4,0x00,0xec,0x01,0x0b,0xff,0xb4,0x00,0xec,0x01,0x0d,0xff,0xb4,0x00,0xec,0x01,0x19,0xff,0xb4,0x00,0xec,0x01,0x45,0xff,0x62,0x00,0xec,0x01,0x46,0xff,0xbe,0x00,0xec,0x01,0x48, +0xff,0xb4,0x00,0xec,0x01,0x4c,0xff,0xb4,0x00,0xec,0x01,0x4e,0xff,0xb4,0x00,0xec,0x01,0x50,0xff,0xb4,0x00,0xec,0x01,0x51,0xff,0xf6,0x00,0xec,0x01,0x52,0xff,0xb4,0x00,0xec,0x01,0x53,0xff,0xf6,0x00,0xec,0x01,0x54,0xff,0xb4,0x00,0xec,0x01,0x55,0xff,0xf6,0x00,0xec,0x01,0x56,0xff,0xb4,0x00,0xec,0x01,0x63,0xff,0x7f,0x00,0xec, +0x01,0x6f,0xff,0xb4,0x00,0xec,0x01,0x71,0xff,0xb4,0x00,0xec,0x01,0x80,0x00,0x27,0x00,0xec,0x01,0x85,0xff,0x62,0x00,0xec,0x01,0x86,0xff,0xbe,0x00,0xec,0x01,0x87,0xff,0x62,0x00,0xec,0x01,0x88,0xff,0xbe,0x00,0xec,0x01,0x8a,0xff,0xb4,0x00,0xec,0x01,0x8c,0x00,0x27,0x00,0xec,0x01,0x8e,0x00,0x27,0x00,0xec,0x01,0x90,0x00,0x27, +0x00,0xed,0x00,0x44,0xff,0xe5,0x00,0xed,0x00,0x49,0xff,0xf6,0x00,0xed,0x00,0x5b,0xff,0xe7,0x00,0xed,0x00,0x69,0xff,0xe5,0x00,0xed,0x00,0x6a,0xff,0xe5,0x00,0xed,0x00,0x6b,0xff,0xe5,0x00,0xed,0x00,0x6c,0xff,0xe5,0x00,0xed,0x00,0x6d,0xff,0xe5,0x00,0xed,0x00,0x6e,0xff,0xe5,0x00,0xed,0x00,0xa0,0xff,0xe5,0x00,0xed,0x00,0xc0, +0xff,0xf6,0x00,0xed,0x00,0xc1,0xff,0xf6,0x00,0xed,0x01,0x04,0xff,0xe5,0x00,0xed,0x01,0x06,0xff,0xe5,0x00,0xed,0x01,0x46,0xff,0xe5,0x00,0xed,0x01,0x86,0xff,0xe5,0x00,0xed,0x01,0x88,0xff,0xe5,0x00,0xf7,0x00,0x37,0xff,0xcf,0x00,0xf7,0x00,0x39,0xff,0xe5,0x00,0xf7,0x00,0x5c,0xff,0xe5,0x00,0xf7,0x00,0xba,0xff,0xe5,0x00,0xf7, +0x00,0xeb,0xff,0xe5,0x00,0xf7,0x01,0x20,0xff,0xcf,0x00,0xf7,0x01,0x22,0xff,0xcf,0x00,0xf7,0x01,0x76,0xff,0xcf,0x00,0xf7,0x01,0x83,0xff,0xe5,0x00,0xf7,0x01,0x93,0xff,0xe5,0x00,0xf8,0x00,0x4d,0x00,0x2f,0x00,0xf8,0x01,0x64,0x00,0x2f,0x00,0xfa,0x00,0x57,0xff,0xbe,0x00,0xfa,0x00,0x59,0xff,0xcf,0x00,0xfa,0x00,0x5a,0xff,0xe5, +0x00,0xfa,0x00,0x5c,0xff,0xd1,0x00,0xfa,0x00,0xba,0xff,0xbe,0x00,0xfa,0x00,0xc4,0xff,0xb2,0x00,0xfa,0x00,0xc5,0xff,0xb2,0x00,0xfa,0x00,0xeb,0xff,0xd1,0x00,0xfa,0x01,0x21,0xff,0xbe,0x00,0xfa,0x01,0x23,0xff,0xbe,0x00,0xfa,0x01,0x77,0xff,0xbe,0x00,0xfa,0x01,0x81,0xff,0xe5,0x00,0xfa,0x01,0x83,0xff,0xd1,0x00,0xfa,0x01,0x8d, +0xff,0xe5,0x00,0xfa,0x01,0x8f,0xff,0xe5,0x00,0xfa,0x01,0x91,0xff,0xe5,0x00,0xfa,0x01,0x93,0xff,0xd1,0x00,0xfc,0x00,0x26,0xff,0xc9,0x00,0xfc,0x00,0x2a,0xff,0xc9,0x00,0xfc,0x00,0x32,0xff,0xe5,0x00,0xfc,0x00,0x34,0xff,0xc9,0x00,0xfc,0x00,0x64,0xff,0xc9,0x00,0xfc,0x00,0x67,0xff,0xc9,0x00,0xfc,0x00,0x77,0x00,0x1d,0x00,0xfc, +0x00,0x92,0xff,0xc9,0x00,0xfc,0x00,0xaa,0xff,0xcf,0x00,0xfc,0x00,0xaf,0xff,0xc9,0x00,0xfc,0x00,0xb0,0xff,0xc9,0x00,0xfc,0x00,0xbe,0xff,0xcf,0x00,0xfc,0x00,0xd0,0xff,0xc9,0x00,0xfc,0x00,0xd1,0xff,0xc9,0x00,0xfc,0x00,0xd2,0xff,0xc9,0x00,0xfc,0x00,0xf7,0xff,0xc9,0x00,0xfc,0x00,0xfc,0xff,0xc9,0x00,0xfc,0x00,0xfe,0xff,0xc9, +0x00,0xfc,0x01,0x18,0xff,0xe5,0x00,0xfc,0x01,0x47,0xff,0xc9,0x00,0xfc,0x01,0x51,0xff,0xc9,0x00,0xfc,0x01,0x53,0xff,0xc9,0x00,0xfc,0x01,0x55,0xff,0xc9,0x00,0xfc,0x01,0x5c,0x00,0x1d,0x00,0xfc,0x01,0x5e,0x00,0x1d,0x00,0xfc,0x01,0x60,0x00,0x1d,0x00,0xfc,0x01,0x6e,0xff,0xe5,0x00,0xfc,0x01,0x70,0xff,0xe5,0x00,0xfc,0x01,0x89, +0xff,0xe5,0x00,0xfd,0x00,0x2d,0x00,0x46,0x00,0xfd,0x00,0x37,0xff,0x9a,0x00,0xfd,0x00,0x3c,0xff,0xb4,0x00,0xfd,0x00,0xea,0xff,0xb4,0x00,0xfd,0x01,0x20,0xff,0x9a,0x00,0xfd,0x01,0x22,0xff,0x9a,0x00,0xfd,0x01,0x63,0x00,0x46,0x00,0xfd,0x01,0x76,0xff,0x9a,0x00,0xfd,0x01,0x82,0xff,0xb4,0x00,0xfd,0x01,0x92,0xff,0xb4,0x00,0xfe, +0x00,0x26,0xff,0xc9,0x00,0xfe,0x00,0x2a,0xff,0xc9,0x00,0xfe,0x00,0x32,0xff,0xe5,0x00,0xfe,0x00,0x34,0xff,0xc9,0x00,0xfe,0x00,0x64,0xff,0xc9,0x00,0xfe,0x00,0x67,0xff,0xc9,0x00,0xfe,0x00,0x77,0x00,0x1d,0x00,0xfe,0x00,0x92,0xff,0xc9,0x00,0xfe,0x00,0xaa,0xff,0xcf,0x00,0xfe,0x00,0xaf,0xff,0xc9,0x00,0xfe,0x00,0xb0,0xff,0xc9, +0x00,0xfe,0x00,0xbe,0xff,0xcf,0x00,0xfe,0x00,0xd0,0xff,0xc9,0x00,0xfe,0x00,0xd1,0xff,0xc9,0x00,0xfe,0x00,0xd2,0xff,0xc9,0x00,0xfe,0x00,0xf7,0xff,0xc9,0x00,0xfe,0x00,0xfc,0xff,0xc9,0x00,0xfe,0x00,0xfe,0xff,0xc9,0x00,0xfe,0x01,0x18,0xff,0xe5,0x00,0xfe,0x01,0x47,0xff,0xc9,0x00,0xfe,0x01,0x51,0xff,0xc9,0x00,0xfe,0x01,0x53, +0xff,0xc9,0x00,0xfe,0x01,0x55,0xff,0xc9,0x00,0xfe,0x01,0x5c,0x00,0x1d,0x00,0xfe,0x01,0x5e,0x00,0x1d,0x00,0xfe,0x01,0x60,0x00,0x1d,0x00,0xfe,0x01,0x6e,0xff,0xe5,0x00,0xfe,0x01,0x70,0xff,0xe5,0x00,0xfe,0x01,0x89,0xff,0xe5,0x00,0xff,0x00,0x2d,0x00,0x46,0x00,0xff,0x00,0x37,0xff,0x9a,0x00,0xff,0x00,0x3c,0xff,0xb4,0x00,0xff, +0x00,0xea,0xff,0xb4,0x00,0xff,0x01,0x20,0xff,0x9a,0x00,0xff,0x01,0x22,0xff,0x9a,0x00,0xff,0x01,0x63,0x00,0x46,0x00,0xff,0x01,0x76,0xff,0x9a,0x00,0xff,0x01,0x82,0xff,0xb4,0x00,0xff,0x01,0x92,0xff,0xb4,0x01,0x03,0x00,0x0d,0xff,0x7f,0x01,0x03,0x00,0x0f,0x00,0x44,0x01,0x03,0x00,0x1e,0x00,0x44,0x01,0x03,0x00,0x26,0xff,0xe5, +0x01,0x03,0x00,0x2a,0xff,0xe5,0x01,0x03,0x00,0x2d,0x00,0x5e,0x01,0x03,0x00,0x32,0xff,0xe5,0x01,0x03,0x00,0x37,0xff,0x6d,0x01,0x03,0x00,0x38,0xff,0xe5,0x01,0x03,0x00,0x39,0xff,0x8b,0x01,0x03,0x00,0x3a,0xff,0xb6,0x01,0x03,0x00,0x3c,0xff,0x64,0x01,0x03,0x00,0x3d,0x00,0x3b,0x01,0x03,0x00,0x57,0xff,0xe5,0x01,0x03,0x00,0x59, +0xff,0xd5,0x01,0x03,0x00,0x5a,0xff,0xe5,0x01,0x03,0x00,0x5c,0xff,0xdb,0x01,0x03,0x00,0x8d,0xff,0x9a,0x01,0x03,0x00,0xb4,0xff,0x66,0x01,0x03,0x00,0xb5,0xff,0x3f,0x01,0x03,0x00,0xb6,0xff,0x66,0x01,0x03,0x00,0xb7,0xff,0x3f,0x01,0x03,0x00,0xba,0xff,0xc1,0x01,0x03,0x00,0xbb,0xff,0x64,0x01,0x03,0x00,0xe5,0x00,0x3b,0x01,0x03, +0x00,0xea,0xff,0x64,0x01,0x03,0x00,0xeb,0xff,0xdb,0x01,0x03,0x00,0xf7,0xff,0xe5,0x01,0x03,0x00,0xfc,0xff,0xe5,0x01,0x03,0x00,0xfe,0xff,0xe5,0x01,0x03,0x01,0x18,0xff,0xe5,0x01,0x03,0x01,0x20,0xff,0x6d,0x01,0x03,0x01,0x21,0xff,0xe5,0x01,0x03,0x01,0x22,0xff,0x6d,0x01,0x03,0x01,0x23,0xff,0xe5,0x01,0x03,0x01,0x24,0xff,0xe5, +0x01,0x03,0x01,0x26,0xff,0xe5,0x01,0x03,0x01,0x28,0x00,0x3b,0x01,0x03,0x01,0x2a,0x00,0x3b,0x01,0x03,0x01,0x47,0xff,0xe5,0x01,0x03,0x01,0x51,0xff,0xe5,0x01,0x03,0x01,0x53,0xff,0xe5,0x01,0x03,0x01,0x55,0xff,0xe5,0x01,0x03,0x01,0x63,0x00,0x5e,0x01,0x03,0x01,0x6e,0xff,0xe5,0x01,0x03,0x01,0x70,0xff,0xe5,0x01,0x03,0x01,0x76, +0xff,0x6d,0x01,0x03,0x01,0x77,0xff,0xe5,0x01,0x03,0x01,0x78,0xff,0xe5,0x01,0x03,0x01,0x7a,0xff,0xe5,0x01,0x03,0x01,0x7c,0xff,0xe5,0x01,0x03,0x01,0x7e,0xff,0xe5,0x01,0x03,0x01,0x80,0xff,0xb6,0x01,0x03,0x01,0x81,0xff,0xe5,0x01,0x03,0x01,0x82,0xff,0x64,0x01,0x03,0x01,0x83,0xff,0xdb,0x01,0x03,0x01,0x89,0xff,0xe5,0x01,0x03, +0x01,0x8c,0xff,0xb6,0x01,0x03,0x01,0x8d,0xff,0xe5,0x01,0x03,0x01,0x8e,0xff,0xb6,0x01,0x03,0x01,0x8f,0xff,0xe5,0x01,0x03,0x01,0x90,0xff,0xb6,0x01,0x03,0x01,0x91,0xff,0xe5,0x01,0x03,0x01,0x92,0xff,0x64,0x01,0x03,0x01,0x93,0xff,0xdb,0x01,0x05,0x00,0x0d,0xff,0x7f,0x01,0x05,0x00,0x0f,0x00,0x44,0x01,0x05,0x00,0x1e,0x00,0x44, +0x01,0x05,0x00,0x26,0xff,0xe5,0x01,0x05,0x00,0x2a,0xff,0xe5,0x01,0x05,0x00,0x2d,0x00,0x5e,0x01,0x05,0x00,0x32,0xff,0xe5,0x01,0x05,0x00,0x37,0xff,0x6d,0x01,0x05,0x00,0x38,0xff,0xe5,0x01,0x05,0x00,0x39,0xff,0x8b,0x01,0x05,0x00,0x3a,0xff,0xb6,0x01,0x05,0x00,0x3c,0xff,0x64,0x01,0x05,0x00,0x3d,0x00,0x3b,0x01,0x05,0x00,0x57, +0xff,0xe5,0x01,0x05,0x00,0x59,0xff,0xd5,0x01,0x05,0x00,0x5a,0xff,0xe5,0x01,0x05,0x00,0x5c,0xff,0xdb,0x01,0x05,0x00,0x8d,0xff,0x9a,0x01,0x05,0x00,0xb4,0xff,0x66,0x01,0x05,0x00,0xb5,0xff,0x3f,0x01,0x05,0x00,0xb6,0xff,0x66,0x01,0x05,0x00,0xb7,0xff,0x3f,0x01,0x05,0x00,0xba,0xff,0xc1,0x01,0x05,0x00,0xbb,0xff,0x64,0x01,0x05, +0x00,0xe5,0x00,0x3b,0x01,0x05,0x00,0xea,0xff,0x64,0x01,0x05,0x00,0xeb,0xff,0xdb,0x01,0x05,0x00,0xf7,0xff,0xe5,0x01,0x05,0x00,0xfc,0xff,0xe5,0x01,0x05,0x00,0xfe,0xff,0xe5,0x01,0x05,0x01,0x18,0xff,0xe5,0x01,0x05,0x01,0x20,0xff,0x6d,0x01,0x05,0x01,0x21,0xff,0xe5,0x01,0x05,0x01,0x22,0xff,0x6d,0x01,0x05,0x01,0x23,0xff,0xe5, +0x01,0x05,0x01,0x24,0xff,0xe5,0x01,0x05,0x01,0x26,0xff,0xe5,0x01,0x05,0x01,0x28,0x00,0x3b,0x01,0x05,0x01,0x2a,0x00,0x3b,0x01,0x05,0x01,0x47,0xff,0xe5,0x01,0x05,0x01,0x51,0xff,0xe5,0x01,0x05,0x01,0x53,0xff,0xe5,0x01,0x05,0x01,0x55,0xff,0xe5,0x01,0x05,0x01,0x63,0x00,0x5e,0x01,0x05,0x01,0x6e,0xff,0xe5,0x01,0x05,0x01,0x70, +0xff,0xe5,0x01,0x05,0x01,0x76,0xff,0x6d,0x01,0x05,0x01,0x77,0xff,0xe5,0x01,0x05,0x01,0x78,0xff,0xe5,0x01,0x05,0x01,0x7a,0xff,0xe5,0x01,0x05,0x01,0x7c,0xff,0xe5,0x01,0x05,0x01,0x7e,0xff,0xe5,0x01,0x05,0x01,0x80,0xff,0xb6,0x01,0x05,0x01,0x81,0xff,0xe5,0x01,0x05,0x01,0x82,0xff,0x64,0x01,0x05,0x01,0x83,0xff,0xdb,0x01,0x05, +0x01,0x89,0xff,0xe5,0x01,0x05,0x01,0x8c,0xff,0xb6,0x01,0x05,0x01,0x8d,0xff,0xe5,0x01,0x05,0x01,0x8e,0xff,0xb6,0x01,0x05,0x01,0x8f,0xff,0xe5,0x01,0x05,0x01,0x90,0xff,0xb6,0x01,0x05,0x01,0x91,0xff,0xe5,0x01,0x05,0x01,0x92,0xff,0x64,0x01,0x05,0x01,0x93,0xff,0xdb,0x01,0x07,0x00,0x0f,0xff,0x7f,0x01,0x07,0x00,0x11,0xff,0x7f, +0x01,0x07,0x00,0x24,0xff,0xdf,0x01,0x07,0x00,0x37,0xff,0xa4,0x01,0x07,0x00,0x3b,0xff,0xcb,0x01,0x07,0x00,0x3d,0xff,0xcf,0x01,0x07,0x00,0x62,0xff,0xdf,0x01,0x07,0x00,0x63,0xff,0xdf,0x01,0x07,0x00,0x91,0xff,0xb6,0x01,0x07,0x00,0xac,0xff,0x7f,0x01,0x07,0x00,0xad,0xff,0xdf,0x01,0x07,0x00,0xae,0xff,0xdf,0x01,0x07,0x00,0xbb, +0xff,0xf6,0x01,0x07,0x00,0xc4,0xff,0x8b,0x01,0x07,0x00,0xc5,0xff,0x8b,0x01,0x07,0x00,0xc7,0xff,0xdf,0x01,0x07,0x00,0xc9,0xff,0xdf,0x01,0x07,0x00,0xe5,0xff,0xcf,0x01,0x07,0x01,0x03,0xff,0xdf,0x01,0x07,0x01,0x05,0xff,0xdf,0x01,0x07,0x01,0x20,0xff,0xa4,0x01,0x07,0x01,0x22,0xff,0xa4,0x01,0x07,0x01,0x28,0xff,0xcf,0x01,0x07, +0x01,0x2a,0xff,0xcf,0x01,0x07,0x01,0x45,0xff,0xdf,0x01,0x07,0x01,0x76,0xff,0xa4,0x01,0x07,0x01,0x85,0xff,0xdf,0x01,0x07,0x01,0x87,0xff,0xdf,0x01,0x0a,0x00,0x24,0x00,0x0a,0x01,0x0a,0x00,0x2d,0x00,0x44,0x01,0x0a,0x00,0x37,0x00,0x04,0x01,0x0a,0x00,0x3a,0x00,0x1d,0x01,0x0a,0x00,0x3b,0x00,0x08,0x01,0x0a,0x00,0x62,0x00,0x0a, +0x01,0x0a,0x00,0x63,0x00,0x0a,0x01,0x0a,0x00,0x77,0x00,0x12,0x01,0x0a,0x00,0xad,0x00,0x0a,0x01,0x0a,0x00,0xae,0x00,0x0a,0x01,0x0a,0x00,0xc7,0x00,0x0a,0x01,0x0a,0x00,0xc9,0x00,0x0a,0x01,0x0a,0x01,0x03,0x00,0x0a,0x01,0x0a,0x01,0x05,0x00,0x0a,0x01,0x0a,0x01,0x20,0x00,0x04,0x01,0x0a,0x01,0x22,0x00,0x04,0x01,0x0a,0x01,0x45, +0x00,0x0a,0x01,0x0a,0x01,0x5c,0x00,0x12,0x01,0x0a,0x01,0x5e,0x00,0x12,0x01,0x0a,0x01,0x60,0x00,0x12,0x01,0x0a,0x01,0x63,0x00,0x44,0x01,0x0a,0x01,0x76,0x00,0x04,0x01,0x0a,0x01,0x80,0x00,0x1d,0x01,0x0a,0x01,0x85,0x00,0x0a,0x01,0x0a,0x01,0x87,0x00,0x0a,0x01,0x0a,0x01,0x8c,0x00,0x1d,0x01,0x0a,0x01,0x8e,0x00,0x1d,0x01,0x0a, +0x01,0x90,0x00,0x1d,0x01,0x0b,0x00,0x05,0xff,0x98,0x01,0x0b,0x00,0x0a,0xff,0x98,0x01,0x0c,0x00,0x24,0x00,0x0a,0x01,0x0c,0x00,0x2d,0x00,0x44,0x01,0x0c,0x00,0x37,0x00,0x04,0x01,0x0c,0x00,0x3a,0x00,0x1d,0x01,0x0c,0x00,0x3b,0x00,0x08,0x01,0x0c,0x00,0x62,0x00,0x0a,0x01,0x0c,0x00,0x63,0x00,0x0a,0x01,0x0c,0x00,0x77,0x00,0x12, +0x01,0x0c,0x00,0xad,0x00,0x0a,0x01,0x0c,0x00,0xae,0x00,0x0a,0x01,0x0c,0x00,0xc7,0x00,0x0a,0x01,0x0c,0x00,0xc9,0x00,0x0a,0x01,0x0c,0x01,0x03,0x00,0x0a,0x01,0x0c,0x01,0x05,0x00,0x0a,0x01,0x0c,0x01,0x20,0x00,0x04,0x01,0x0c,0x01,0x22,0x00,0x04,0x01,0x0c,0x01,0x45,0x00,0x0a,0x01,0x0c,0x01,0x5c,0x00,0x12,0x01,0x0c,0x01,0x5e, +0x00,0x12,0x01,0x0c,0x01,0x60,0x00,0x12,0x01,0x0c,0x01,0x63,0x00,0x44,0x01,0x0c,0x01,0x76,0x00,0x04,0x01,0x0c,0x01,0x80,0x00,0x1d,0x01,0x0c,0x01,0x85,0x00,0x0a,0x01,0x0c,0x01,0x87,0x00,0x0a,0x01,0x0c,0x01,0x8c,0x00,0x1d,0x01,0x0c,0x01,0x8e,0x00,0x1d,0x01,0x0c,0x01,0x90,0x00,0x1d,0x01,0x0d,0x00,0x05,0xff,0x98,0x01,0x0d, +0x00,0x0a,0xff,0x98,0x01,0x0e,0x00,0x0d,0xff,0x31,0x01,0x0e,0x00,0x22,0xff,0x9a,0x01,0x0e,0x00,0x24,0x00,0x3b,0x01,0x0e,0x00,0x26,0xff,0xbe,0x01,0x0e,0x00,0x2a,0xff,0xbe,0x01,0x0e,0x00,0x2d,0x00,0x64,0x01,0x0e,0x00,0x32,0xff,0xba,0x01,0x0e,0x00,0x34,0xff,0xba,0x01,0x0e,0x00,0x37,0xff,0x8f,0x01,0x0e,0x00,0x38,0xff,0xe3, +0x01,0x0e,0x00,0x39,0xff,0x8b,0x01,0x0e,0x00,0x3a,0xff,0xcf,0x01,0x0e,0x00,0x3c,0xff,0x7f,0x01,0x0e,0x00,0x3d,0x00,0x3b,0x01,0x0e,0x00,0x57,0xff,0xe5,0x01,0x0e,0x00,0x59,0xff,0x9a,0x01,0x0e,0x00,0x5a,0xff,0xbe,0x01,0x0e,0x00,0x5c,0xff,0xb4,0x01,0x0e,0x00,0x64,0xff,0xbe,0x01,0x0e,0x00,0x67,0xff,0xba,0x01,0x0e,0x00,0x68, +0xff,0xe3,0x01,0x0e,0x00,0x8d,0xff,0x9a,0x01,0x0e,0x00,0x92,0xff,0xba,0x01,0x0e,0x00,0xaf,0xff,0xba,0x01,0x0e,0x00,0xb0,0xff,0xba,0x01,0x0e,0x00,0xb4,0xff,0x73,0x01,0x0e,0x00,0xb5,0xff,0x8b,0x01,0x0e,0x00,0xb6,0xff,0x73,0x01,0x0e,0x00,0xb7,0xff,0x7f,0x01,0x0e,0x00,0xba,0xff,0xb4,0x01,0x0e,0x00,0xbb,0xff,0x9a,0x01,0x0e, +0x00,0xc4,0x00,0x44,0x01,0x0e,0x00,0xc5,0x00,0x44,0x01,0x0e,0x00,0xd0,0xff,0xba,0x01,0x0e,0x00,0xd1,0xff,0xba,0x01,0x0e,0x00,0xd2,0xff,0xba,0x01,0x0e,0x00,0xd3,0xff,0xe3,0x01,0x0e,0x00,0xd4,0xff,0xe3,0x01,0x0e,0x00,0xd5,0xff,0xe3,0x01,0x0e,0x00,0xe5,0x00,0x3b,0x01,0x0e,0x00,0xea,0xff,0x7f,0x01,0x0e,0x00,0xeb,0xff,0xb4, +0x01,0x0e,0x00,0xf7,0xff,0xbe,0x01,0x0e,0x00,0xfc,0xff,0xbe,0x01,0x0e,0x00,0xfe,0xff,0xbe,0x01,0x0e,0x01,0x03,0x00,0x3b,0x01,0x0e,0x01,0x05,0x00,0x3b,0x01,0x0e,0x01,0x18,0xff,0xba,0x01,0x0e,0x01,0x20,0xff,0x8f,0x01,0x0e,0x01,0x21,0xff,0xe5,0x01,0x0e,0x01,0x22,0xff,0x8f,0x01,0x0e,0x01,0x23,0xff,0xe5,0x01,0x0e,0x01,0x24, +0xff,0xe3,0x01,0x0e,0x01,0x26,0xff,0xe3,0x01,0x0e,0x01,0x28,0x00,0x3b,0x01,0x0e,0x01,0x2a,0x00,0x3b,0x01,0x0e,0x01,0x45,0x00,0x3b,0x01,0x0e,0x01,0x47,0xff,0xbe,0x01,0x0e,0x01,0x51,0xff,0xbe,0x01,0x0e,0x01,0x53,0xff,0xbe,0x01,0x0e,0x01,0x55,0xff,0xbe,0x01,0x0e,0x01,0x63,0x00,0x64,0x01,0x0e,0x01,0x6e,0xff,0xba,0x01,0x0e, +0x01,0x70,0xff,0xba,0x01,0x0e,0x01,0x76,0xff,0x8f,0x01,0x0e,0x01,0x77,0xff,0xe5,0x01,0x0e,0x01,0x78,0xff,0xe3,0x01,0x0e,0x01,0x7a,0xff,0xe3,0x01,0x0e,0x01,0x7c,0xff,0xe3,0x01,0x0e,0x01,0x7e,0xff,0xe3,0x01,0x0e,0x01,0x80,0xff,0xcf,0x01,0x0e,0x01,0x81,0xff,0xbe,0x01,0x0e,0x01,0x82,0xff,0x7f,0x01,0x0e,0x01,0x83,0xff,0xb4, +0x01,0x0e,0x01,0x85,0x00,0x3b,0x01,0x0e,0x01,0x87,0x00,0x3b,0x01,0x0e,0x01,0x89,0xff,0xba,0x01,0x0e,0x01,0x8c,0xff,0xcf,0x01,0x0e,0x01,0x8d,0xff,0xbe,0x01,0x0e,0x01,0x8e,0xff,0xcf,0x01,0x0e,0x01,0x8f,0xff,0xbe,0x01,0x0e,0x01,0x90,0xff,0xcf,0x01,0x0e,0x01,0x91,0xff,0xbe,0x01,0x0e,0x01,0x92,0xff,0x7f,0x01,0x0e,0x01,0x93, +0xff,0xb4,0x01,0x10,0x00,0x0d,0xff,0x31,0x01,0x10,0x00,0x22,0xff,0x9a,0x01,0x10,0x00,0x24,0x00,0x3b,0x01,0x10,0x00,0x26,0xff,0xbe,0x01,0x10,0x00,0x2a,0xff,0xbe,0x01,0x10,0x00,0x2d,0x00,0x64,0x01,0x10,0x00,0x32,0xff,0xba,0x01,0x10,0x00,0x34,0xff,0xba,0x01,0x10,0x00,0x37,0xff,0x8f,0x01,0x10,0x00,0x38,0xff,0xe3,0x01,0x10, +0x00,0x39,0xff,0x8b,0x01,0x10,0x00,0x3a,0xff,0xcf,0x01,0x10,0x00,0x3c,0xff,0x7f,0x01,0x10,0x00,0x3d,0x00,0x3b,0x01,0x10,0x00,0x57,0xff,0xe5,0x01,0x10,0x00,0x59,0xff,0x9a,0x01,0x10,0x00,0x5a,0xff,0xbe,0x01,0x10,0x00,0x5c,0xff,0xb4,0x01,0x10,0x00,0x64,0xff,0xbe,0x01,0x10,0x00,0x67,0xff,0xba,0x01,0x10,0x00,0x68,0xff,0xe3, +0x01,0x10,0x00,0x8d,0xff,0x9a,0x01,0x10,0x00,0x92,0xff,0xba,0x01,0x10,0x00,0xaf,0xff,0xba,0x01,0x10,0x00,0xb0,0xff,0xba,0x01,0x10,0x00,0xb4,0xff,0x73,0x01,0x10,0x00,0xb5,0xff,0x8b,0x01,0x10,0x00,0xb6,0xff,0x73,0x01,0x10,0x00,0xb7,0xff,0x7f,0x01,0x10,0x00,0xba,0xff,0xb4,0x01,0x10,0x00,0xbb,0xff,0x9a,0x01,0x10,0x00,0xc4, +0x00,0x44,0x01,0x10,0x00,0xc5,0x00,0x44,0x01,0x10,0x00,0xd0,0xff,0xba,0x01,0x10,0x00,0xd1,0xff,0xba,0x01,0x10,0x00,0xd2,0xff,0xba,0x01,0x10,0x00,0xd3,0xff,0xe3,0x01,0x10,0x00,0xd4,0xff,0xe3,0x01,0x10,0x00,0xd5,0xff,0xe3,0x01,0x10,0x00,0xe5,0x00,0x3b,0x01,0x10,0x00,0xea,0xff,0x7f,0x01,0x10,0x00,0xeb,0xff,0xb4,0x01,0x10, +0x00,0xf7,0xff,0xbe,0x01,0x10,0x00,0xfc,0xff,0xbe,0x01,0x10,0x00,0xfe,0xff,0xbe,0x01,0x10,0x01,0x03,0x00,0x3b,0x01,0x10,0x01,0x05,0x00,0x3b,0x01,0x10,0x01,0x20,0xff,0x8f,0x01,0x10,0x01,0x21,0xff,0xe5,0x01,0x10,0x01,0x22,0xff,0x8f,0x01,0x10,0x01,0x23,0xff,0xe5,0x01,0x10,0x01,0x24,0xff,0xe3,0x01,0x10,0x01,0x26,0xff,0xe3, +0x01,0x10,0x01,0x28,0x00,0x3b,0x01,0x10,0x01,0x2a,0x00,0x3b,0x01,0x10,0x01,0x45,0x00,0x3b,0x01,0x10,0x01,0x47,0xff,0xbe,0x01,0x10,0x01,0x51,0xff,0xbe,0x01,0x10,0x01,0x53,0xff,0xbe,0x01,0x10,0x01,0x55,0xff,0xbe,0x01,0x10,0x01,0x63,0x00,0x64,0x01,0x10,0x01,0x6e,0xff,0xba,0x01,0x10,0x01,0x70,0xff,0xba,0x01,0x10,0x01,0x76, +0xff,0x8f,0x01,0x10,0x01,0x77,0xff,0xe5,0x01,0x10,0x01,0x78,0xff,0xe3,0x01,0x10,0x01,0x7a,0xff,0xe3,0x01,0x10,0x01,0x7c,0xff,0xe3,0x01,0x10,0x01,0x7e,0xff,0xe3,0x01,0x10,0x01,0x80,0xff,0xcf,0x01,0x10,0x01,0x81,0xff,0xbe,0x01,0x10,0x01,0x82,0xff,0x7f,0x01,0x10,0x01,0x83,0xff,0xb4,0x01,0x10,0x01,0x85,0x00,0x3b,0x01,0x10, +0x01,0x87,0x00,0x3b,0x01,0x10,0x01,0x89,0xff,0xba,0x01,0x10,0x01,0x8c,0xff,0xcf,0x01,0x10,0x01,0x8d,0xff,0xbe,0x01,0x10,0x01,0x8e,0xff,0xcf,0x01,0x10,0x01,0x8f,0xff,0xbe,0x01,0x10,0x01,0x90,0xff,0xcf,0x01,0x10,0x01,0x91,0xff,0xbe,0x01,0x10,0x01,0x92,0xff,0x7f,0x01,0x10,0x01,0x93,0xff,0xb4,0x01,0x12,0x00,0x0d,0xff,0x31, +0x01,0x12,0x00,0x22,0xff,0x9a,0x01,0x12,0x00,0x24,0x00,0x3b,0x01,0x12,0x00,0x26,0xff,0xbe,0x01,0x12,0x00,0x2a,0xff,0xbe,0x01,0x12,0x00,0x2d,0x00,0x64,0x01,0x12,0x00,0x32,0xff,0xba,0x01,0x12,0x00,0x34,0xff,0xba,0x01,0x12,0x00,0x37,0xff,0x8f,0x01,0x12,0x00,0x38,0xff,0xe3,0x01,0x12,0x00,0x39,0xff,0x8b,0x01,0x12,0x00,0x3a, +0xff,0xcf,0x01,0x12,0x00,0x3c,0xff,0x7f,0x01,0x12,0x00,0x3d,0x00,0x3b,0x01,0x12,0x00,0x57,0xff,0xe5,0x01,0x12,0x00,0x59,0xff,0x9a,0x01,0x12,0x00,0x5a,0xff,0xbe,0x01,0x12,0x00,0x5c,0xff,0xb4,0x01,0x12,0x00,0x64,0xff,0xbe,0x01,0x12,0x00,0x67,0xff,0xba,0x01,0x12,0x00,0x68,0xff,0xe3,0x01,0x12,0x00,0x8d,0xff,0x9a,0x01,0x12, +0x00,0x92,0xff,0xba,0x01,0x12,0x00,0xaf,0xff,0xba,0x01,0x12,0x00,0xb0,0xff,0xba,0x01,0x12,0x00,0xb4,0xff,0x73,0x01,0x12,0x00,0xb5,0xff,0x8b,0x01,0x12,0x00,0xb6,0xff,0x73,0x01,0x12,0x00,0xb7,0xff,0x7f,0x01,0x12,0x00,0xba,0xff,0xb4,0x01,0x12,0x00,0xbb,0xff,0x9a,0x01,0x12,0x00,0xc4,0x00,0x44,0x01,0x12,0x00,0xc5,0x00,0x44, +0x01,0x12,0x00,0xd0,0xff,0xba,0x01,0x12,0x00,0xd1,0xff,0xba,0x01,0x12,0x00,0xd2,0xff,0xba,0x01,0x12,0x00,0xd3,0xff,0xe3,0x01,0x12,0x00,0xd4,0xff,0xe3,0x01,0x12,0x00,0xd5,0xff,0xe3,0x01,0x12,0x00,0xe5,0x00,0x3b,0x01,0x12,0x00,0xea,0xff,0x7f,0x01,0x12,0x00,0xeb,0xff,0xb4,0x01,0x12,0x00,0xf7,0xff,0xbe,0x01,0x12,0x00,0xfc, +0xff,0xbe,0x01,0x12,0x00,0xfe,0xff,0xbe,0x01,0x12,0x01,0x03,0x00,0x3b,0x01,0x12,0x01,0x05,0x00,0x3b,0x01,0x12,0x01,0x18,0xff,0xba,0x01,0x12,0x01,0x20,0xff,0x8f,0x01,0x12,0x01,0x21,0xff,0xe5,0x01,0x12,0x01,0x22,0xff,0x8f,0x01,0x12,0x01,0x23,0xff,0xe5,0x01,0x12,0x01,0x24,0xff,0xe3,0x01,0x12,0x01,0x26,0xff,0xe3,0x01,0x12, +0x01,0x28,0x00,0x3b,0x01,0x12,0x01,0x2a,0x00,0x3b,0x01,0x12,0x01,0x45,0x00,0x3b,0x01,0x12,0x01,0x47,0xff,0xbe,0x01,0x12,0x01,0x51,0xff,0xbe,0x01,0x12,0x01,0x53,0xff,0xbe,0x01,0x12,0x01,0x55,0xff,0xbe,0x01,0x12,0x01,0x63,0x00,0x64,0x01,0x12,0x01,0x6e,0xff,0xba,0x01,0x12,0x01,0x70,0xff,0xba,0x01,0x12,0x01,0x76,0xff,0x8f, +0x01,0x12,0x01,0x77,0xff,0xe5,0x01,0x12,0x01,0x78,0xff,0xe3,0x01,0x12,0x01,0x7a,0xff,0xe3,0x01,0x12,0x01,0x7c,0xff,0xe3,0x01,0x12,0x01,0x7e,0xff,0xe3,0x01,0x12,0x01,0x80,0xff,0xcf,0x01,0x12,0x01,0x81,0xff,0xbe,0x01,0x12,0x01,0x82,0xff,0x7f,0x01,0x12,0x01,0x83,0xff,0xb4,0x01,0x12,0x01,0x85,0x00,0x3b,0x01,0x12,0x01,0x87, +0x00,0x3b,0x01,0x12,0x01,0x89,0xff,0xba,0x01,0x12,0x01,0x8c,0xff,0xcf,0x01,0x12,0x01,0x8d,0xff,0xbe,0x01,0x12,0x01,0x8e,0xff,0xcf,0x01,0x12,0x01,0x8f,0xff,0xbe,0x01,0x12,0x01,0x90,0xff,0xcf,0x01,0x12,0x01,0x91,0xff,0xbe,0x01,0x12,0x01,0x92,0xff,0x7f,0x01,0x12,0x01,0x93,0xff,0xb4,0x01,0x15,0x00,0x05,0xff,0x98,0x01,0x15, +0x00,0x0a,0xff,0x98,0x01,0x17,0x00,0x05,0xff,0x98,0x01,0x17,0x00,0x0a,0xff,0x98,0x01,0x18,0x00,0x0f,0xff,0xa4,0x01,0x18,0x00,0x11,0xff,0xa4,0x01,0x18,0x00,0x24,0xff,0xe5,0x01,0x18,0x00,0x2d,0xff,0xf6,0x01,0x18,0x00,0x37,0xff,0xa4,0x01,0x18,0x00,0x3b,0xff,0xdb,0x01,0x18,0x00,0x3c,0xff,0xe7,0x01,0x18,0x00,0x3d,0xff,0xcf, +0x01,0x18,0x00,0x62,0xff,0xe5,0x01,0x18,0x00,0x63,0xff,0xe5,0x01,0x18,0x00,0xac,0xff,0xa4,0x01,0x18,0x00,0xad,0xff,0xe5,0x01,0x18,0x00,0xae,0xff,0xe5,0x01,0x18,0x00,0xbb,0xff,0xf6,0x01,0x18,0x00,0xc4,0xff,0x4c,0x01,0x18,0x00,0xc5,0xff,0x98,0x01,0x18,0x00,0xc7,0xff,0xe5,0x01,0x18,0x00,0xc9,0xff,0xe5,0x01,0x18,0x00,0xe5, +0xff,0xcf,0x01,0x18,0x00,0xea,0xff,0xe7,0x01,0x18,0x01,0x03,0xff,0xe5,0x01,0x18,0x01,0x05,0xff,0xe5,0x01,0x18,0x01,0x20,0xff,0xa4,0x01,0x18,0x01,0x22,0xff,0xa4,0x01,0x18,0x01,0x28,0xff,0xcf,0x01,0x18,0x01,0x2a,0xff,0xcf,0x01,0x18,0x01,0x45,0xff,0xe5,0x01,0x18,0x01,0x63,0xff,0xf6,0x01,0x18,0x01,0x76,0xff,0xa4,0x01,0x18, +0x01,0x82,0xff,0xe7,0x01,0x18,0x01,0x85,0xff,0xe5,0x01,0x18,0x01,0x87,0xff,0xe5,0x01,0x18,0x01,0x92,0xff,0xe7,0x01,0x19,0x00,0x05,0xff,0x6f,0x01,0x19,0x00,0x0a,0xff,0x6f,0x01,0x19,0x00,0x44,0xff,0xe5,0x01,0x19,0x00,0x49,0xff,0xdb,0x01,0x19,0x00,0x5b,0xff,0xe7,0x01,0x19,0x00,0x69,0xff,0xe5,0x01,0x19,0x00,0x6a,0xff,0xe5, +0x01,0x19,0x00,0x6b,0xff,0xe5,0x01,0x19,0x00,0x6c,0xff,0xe5,0x01,0x19,0x00,0x6d,0xff,0xe5,0x01,0x19,0x00,0x6e,0xff,0xe5,0x01,0x19,0x00,0xa0,0xff,0xe5,0x01,0x19,0x00,0xb4,0xff,0xb2,0x01,0x19,0x00,0xb5,0xff,0x7d,0x01,0x19,0x00,0xb6,0xff,0xbe,0x01,0x19,0x00,0xb7,0xff,0x7d,0x01,0x19,0x00,0xc0,0xff,0xe7,0x01,0x19,0x00,0xc1, +0xff,0xe7,0x01,0x19,0x01,0x04,0xff,0xe5,0x01,0x19,0x01,0x06,0xff,0xe5,0x01,0x19,0x01,0x46,0xff,0xe5,0x01,0x19,0x01,0x86,0xff,0xe5,0x01,0x19,0x01,0x88,0xff,0xe5,0x01,0x1a,0x00,0x1e,0x00,0x52,0x01,0x1a,0x00,0x26,0xff,0xe3,0x01,0x1a,0x00,0x2a,0xff,0xe3,0x01,0x1a,0x00,0x2d,0x00,0x39,0x01,0x1a,0x00,0x32,0xff,0xec,0x01,0x1a, +0x00,0x34,0xff,0xec,0x01,0x1a,0x00,0x37,0xff,0xcb,0x01,0x1a,0x00,0x3c,0xff,0xd9,0x01,0x1a,0x00,0x46,0xff,0xcb,0x01,0x1a,0x00,0x47,0xff,0xcb,0x01,0x1a,0x00,0x48,0xff,0xc7,0x01,0x1a,0x00,0x4a,0xff,0xc7,0x01,0x1a,0x00,0x52,0xff,0xc5,0x01,0x1a,0x00,0x54,0xff,0xcb,0x01,0x1a,0x00,0x64,0xff,0xe5,0x01,0x1a,0x00,0x67,0xff,0xec, +0x01,0x1a,0x00,0x6f,0xff,0xbe,0x01,0x1a,0x00,0x70,0xff,0xbe,0x01,0x1a,0x00,0x71,0xff,0xbe,0x01,0x1a,0x00,0x72,0xff,0xbe,0x01,0x1a,0x00,0x73,0xff,0xbe,0x01,0x1a,0x00,0x79,0xff,0xc5,0x01,0x1a,0x00,0x7a,0xff,0xc5,0x01,0x1a,0x00,0x7b,0xff,0xc5,0x01,0x1a,0x00,0x7c,0xff,0xc5,0x01,0x1a,0x00,0x7d,0xff,0xc5,0x01,0x1a,0x00,0x92, +0xff,0xec,0x01,0x1a,0x00,0xaf,0xff,0xec,0x01,0x1a,0x00,0xb0,0xff,0xec,0x01,0x1a,0x00,0xb1,0xff,0xc5,0x01,0x1a,0x00,0xbb,0xff,0xe5,0x01,0x1a,0x00,0xd0,0xff,0xec,0x01,0x1a,0x00,0xd1,0xff,0xec,0x01,0x1a,0x00,0xd2,0xff,0xec,0x01,0x1a,0x00,0xea,0xff,0xd9,0x01,0x1a,0x00,0xf7,0xff,0xe3,0x01,0x1a,0x00,0xf8,0xff,0xc7,0x01,0x1a, +0x00,0xfc,0xff,0xe3,0x01,0x1a,0x00,0xfd,0xff,0xcb,0x01,0x1a,0x00,0xfe,0xff,0xe3,0x01,0x1a,0x00,0xff,0xff,0xcb,0x01,0x1a,0x01,0x00,0xff,0xcb,0x01,0x1a,0x01,0x08,0xff,0xcb,0x01,0x1a,0x01,0x0b,0xff,0xc7,0x01,0x1a,0x01,0x0d,0xff,0xbe,0x01,0x1a,0x01,0x18,0xff,0xec,0x01,0x1a,0x01,0x19,0xff,0xc5,0x01,0x1a,0x01,0x20,0xff,0xcb, +0x01,0x1a,0x01,0x22,0xff,0xcb,0x01,0x1a,0x01,0x47,0xff,0xe3,0x01,0x1a,0x01,0x48,0xff,0xcb,0x01,0x1a,0x01,0x4c,0xff,0xbe,0x01,0x1a,0x01,0x4e,0xff,0xbe,0x01,0x1a,0x01,0x50,0xff,0xbe,0x01,0x1a,0x01,0x51,0xff,0xe3,0x01,0x1a,0x01,0x52,0xff,0xc7,0x01,0x1a,0x01,0x53,0xff,0xe3,0x01,0x1a,0x01,0x54,0xff,0xc7,0x01,0x1a,0x01,0x55, +0xff,0xe3,0x01,0x1a,0x01,0x56,0xff,0xc7,0x01,0x1a,0x01,0x63,0x00,0x39,0x01,0x1a,0x01,0x6e,0xff,0xec,0x01,0x1a,0x01,0x6f,0xff,0xc5,0x01,0x1a,0x01,0x70,0xff,0xec,0x01,0x1a,0x01,0x71,0xff,0xc5,0x01,0x1a,0x01,0x76,0xff,0xcb,0x01,0x1a,0x01,0x82,0xff,0xd9,0x01,0x1a,0x01,0x89,0xff,0xec,0x01,0x1a,0x01,0x8a,0xff,0xc5,0x01,0x1a, +0x01,0x92,0xff,0xd9,0x01,0x1b,0x00,0x0f,0xff,0x62,0x01,0x1b,0x00,0x10,0xff,0x7f,0x01,0x1b,0x00,0x11,0xff,0x56,0x01,0x1b,0x00,0x1d,0x00,0x52,0x01,0x1b,0x00,0x1e,0x00,0x52,0x01,0x1b,0x00,0x46,0xff,0xe5,0x01,0x1b,0x00,0x47,0xff,0xe5,0x01,0x1b,0x00,0x48,0xff,0xe5,0x01,0x1b,0x00,0x49,0x00,0x27,0x01,0x1b,0x00,0x4a,0xff,0xe5, +0x01,0x1b,0x00,0x50,0xff,0xfc,0x01,0x1b,0x00,0x51,0xff,0xfc,0x01,0x1b,0x00,0x52,0xff,0xe5,0x01,0x1b,0x00,0x54,0xff,0xe5,0x01,0x1b,0x00,0x56,0x00,0x0e,0x01,0x1b,0x00,0x57,0x00,0x3b,0x01,0x1b,0x00,0x59,0x00,0x52,0x01,0x1b,0x00,0x5a,0x00,0x52,0x01,0x1b,0x00,0x5b,0x00,0x3b,0x01,0x1b,0x00,0x5c,0x00,0x52,0x01,0x1b,0x00,0x5d, +0x00,0x27,0x01,0x1b,0x00,0x6f,0xff,0xe5,0x01,0x1b,0x00,0x70,0xff,0xe5,0x01,0x1b,0x00,0x71,0xff,0xe5,0x01,0x1b,0x00,0x72,0xff,0xe5,0x01,0x1b,0x00,0x73,0xff,0xe5,0x01,0x1b,0x00,0x79,0xff,0xe5,0x01,0x1b,0x00,0x7a,0xff,0xe5,0x01,0x1b,0x00,0x7b,0xff,0xe5,0x01,0x1b,0x00,0x7c,0xff,0xe5,0x01,0x1b,0x00,0x7d,0xff,0xe5,0x01,0x1b, +0x00,0xac,0xff,0x56,0x01,0x1b,0x00,0xb1,0xff,0xe5,0x01,0x1b,0x00,0xb4,0x00,0xa4,0x01,0x1b,0x00,0xb5,0x00,0x79,0x01,0x1b,0x00,0xb6,0x00,0xa4,0x01,0x1b,0x00,0xb7,0x00,0x79,0x01,0x1b,0x00,0xc4,0xff,0x62,0x01,0x1b,0x00,0xc5,0xff,0x62,0x01,0x1b,0x00,0xe4,0x00,0x0e,0x01,0x1b,0x00,0xe6,0x00,0x27,0x01,0x1b,0x00,0xeb,0x00,0x52, +0x01,0x1b,0x00,0xf8,0xff,0xe5,0x01,0x1b,0x00,0xfb,0x00,0x0e,0x01,0x1b,0x00,0xfd,0xff,0xe5,0x01,0x1b,0x00,0xff,0xff,0xe5,0x01,0x1b,0x01,0x00,0xff,0xe5,0x01,0x1b,0x01,0x08,0xff,0xe5,0x01,0x1b,0x01,0x0b,0xff,0xe5,0x01,0x1b,0x01,0x0d,0xff,0xe5,0x01,0x1b,0x01,0x19,0xff,0xe5,0x01,0x1b,0x01,0x1f,0x00,0x0e,0x01,0x1b,0x01,0x21, +0x00,0x3b,0x01,0x1b,0x01,0x23,0x00,0x3b,0x01,0x1b,0x01,0x29,0x00,0x27,0x01,0x1b,0x01,0x2b,0x00,0x27,0x01,0x1b,0x01,0x48,0xff,0xe5,0x01,0x1b,0x01,0x4c,0xff,0xe5,0x01,0x1b,0x01,0x4e,0xff,0xe5,0x01,0x1b,0x01,0x50,0xff,0xe5,0x01,0x1b,0x01,0x52,0xff,0xe5,0x01,0x1b,0x01,0x54,0xff,0xe5,0x01,0x1b,0x01,0x56,0xff,0xe5,0x01,0x1b, +0x01,0x6d,0xff,0xfc,0x01,0x1b,0x01,0x6f,0xff,0xe5,0x01,0x1b,0x01,0x71,0xff,0xe5,0x01,0x1b,0x01,0x75,0x00,0x0e,0x01,0x1b,0x01,0x77,0x00,0x3b,0x01,0x1b,0x01,0x81,0x00,0x52,0x01,0x1b,0x01,0x83,0x00,0x52,0x01,0x1b,0x01,0x8a,0xff,0xe5,0x01,0x1b,0x01,0x8d,0x00,0x52,0x01,0x1b,0x01,0x8f,0x00,0x52,0x01,0x1b,0x01,0x91,0x00,0x52, +0x01,0x1b,0x01,0x93,0x00,0x52,0x01,0x1b,0x02,0x3e,0x00,0x0e,0x01,0x1c,0x00,0x1e,0x00,0x52,0x01,0x1c,0x00,0x26,0xff,0xe3,0x01,0x1c,0x00,0x2a,0xff,0xe3,0x01,0x1c,0x00,0x2d,0x00,0x39,0x01,0x1c,0x00,0x32,0xff,0xec,0x01,0x1c,0x00,0x34,0xff,0xec,0x01,0x1c,0x00,0x37,0xff,0xcb,0x01,0x1c,0x00,0x3c,0xff,0xd9,0x01,0x1c,0x00,0x46, +0xff,0xcb,0x01,0x1c,0x00,0x47,0xff,0xcb,0x01,0x1c,0x00,0x48,0xff,0xc7,0x01,0x1c,0x00,0x4a,0xff,0xc7,0x01,0x1c,0x00,0x52,0xff,0xc5,0x01,0x1c,0x00,0x54,0xff,0xcb,0x01,0x1c,0x00,0x64,0xff,0xe5,0x01,0x1c,0x00,0x67,0xff,0xec,0x01,0x1c,0x00,0x6f,0xff,0xbe,0x01,0x1c,0x00,0x70,0xff,0xbe,0x01,0x1c,0x00,0x71,0xff,0xbe,0x01,0x1c, +0x00,0x72,0xff,0xbe,0x01,0x1c,0x00,0x73,0xff,0xbe,0x01,0x1c,0x00,0x79,0xff,0xc5,0x01,0x1c,0x00,0x7a,0xff,0xc5,0x01,0x1c,0x00,0x7b,0xff,0xc5,0x01,0x1c,0x00,0x7c,0xff,0xc5,0x01,0x1c,0x00,0x7d,0xff,0xc5,0x01,0x1c,0x00,0x92,0xff,0xec,0x01,0x1c,0x00,0xaf,0xff,0xec,0x01,0x1c,0x00,0xb0,0xff,0xec,0x01,0x1c,0x00,0xb1,0xff,0xc5, +0x01,0x1c,0x00,0xbb,0xff,0xe5,0x01,0x1c,0x00,0xd0,0xff,0xec,0x01,0x1c,0x00,0xd1,0xff,0xec,0x01,0x1c,0x00,0xd2,0xff,0xec,0x01,0x1c,0x00,0xea,0xff,0xd9,0x01,0x1c,0x00,0xf7,0xff,0xe3,0x01,0x1c,0x00,0xf8,0xff,0xc7,0x01,0x1c,0x00,0xfc,0xff,0xe3,0x01,0x1c,0x00,0xfd,0xff,0xcb,0x01,0x1c,0x00,0xfe,0xff,0xe3,0x01,0x1c,0x00,0xff, +0xff,0xcb,0x01,0x1c,0x01,0x00,0xff,0xcb,0x01,0x1c,0x01,0x08,0xff,0xcb,0x01,0x1c,0x01,0x0b,0xff,0xc7,0x01,0x1c,0x01,0x0d,0xff,0xbe,0x01,0x1c,0x01,0x18,0xff,0xec,0x01,0x1c,0x01,0x19,0xff,0xc5,0x01,0x1c,0x01,0x20,0xff,0xcb,0x01,0x1c,0x01,0x22,0xff,0xcb,0x01,0x1c,0x01,0x47,0xff,0xe3,0x01,0x1c,0x01,0x48,0xff,0xcb,0x01,0x1c, +0x01,0x4c,0xff,0xbe,0x01,0x1c,0x01,0x4e,0xff,0xbe,0x01,0x1c,0x01,0x50,0xff,0xbe,0x01,0x1c,0x01,0x51,0xff,0xe3,0x01,0x1c,0x01,0x52,0xff,0xc7,0x01,0x1c,0x01,0x53,0xff,0xe3,0x01,0x1c,0x01,0x54,0xff,0xc7,0x01,0x1c,0x01,0x55,0xff,0xe3,0x01,0x1c,0x01,0x56,0xff,0xc7,0x01,0x1c,0x01,0x63,0x00,0x39,0x01,0x1c,0x01,0x6e,0xff,0xec, +0x01,0x1c,0x01,0x6f,0xff,0xc5,0x01,0x1c,0x01,0x70,0xff,0xec,0x01,0x1c,0x01,0x71,0xff,0xc5,0x01,0x1c,0x01,0x76,0xff,0xcb,0x01,0x1c,0x01,0x82,0xff,0xd9,0x01,0x1c,0x01,0x89,0xff,0xec,0x01,0x1c,0x01,0x8a,0xff,0xc5,0x01,0x1c,0x01,0x92,0xff,0xd9,0x01,0x1d,0x00,0x0f,0xff,0x62,0x01,0x1d,0x00,0x10,0xff,0x7f,0x01,0x1d,0x00,0x11, +0xff,0x56,0x01,0x1d,0x00,0x1d,0x00,0x52,0x01,0x1d,0x00,0x1e,0x00,0x52,0x01,0x1d,0x00,0x46,0xff,0xe5,0x01,0x1d,0x00,0x47,0xff,0xe5,0x01,0x1d,0x00,0x48,0xff,0xe5,0x01,0x1d,0x00,0x49,0x00,0x27,0x01,0x1d,0x00,0x4a,0xff,0xe5,0x01,0x1d,0x00,0x50,0xff,0xfc,0x01,0x1d,0x00,0x51,0xff,0xfc,0x01,0x1d,0x00,0x52,0xff,0xe5,0x01,0x1d, +0x00,0x54,0xff,0xe5,0x01,0x1d,0x00,0x56,0x00,0x0e,0x01,0x1d,0x00,0x57,0x00,0x3b,0x01,0x1d,0x00,0x59,0x00,0x52,0x01,0x1d,0x00,0x5a,0x00,0x52,0x01,0x1d,0x00,0x5b,0x00,0x3b,0x01,0x1d,0x00,0x5c,0x00,0x52,0x01,0x1d,0x00,0x5d,0x00,0x27,0x01,0x1d,0x00,0x6f,0xff,0xe5,0x01,0x1d,0x00,0x70,0xff,0xe5,0x01,0x1d,0x00,0x71,0xff,0xe5, +0x01,0x1d,0x00,0x72,0xff,0xe5,0x01,0x1d,0x00,0x73,0xff,0xe5,0x01,0x1d,0x00,0x79,0xff,0xe5,0x01,0x1d,0x00,0x7a,0xff,0xe5,0x01,0x1d,0x00,0x7b,0xff,0xe5,0x01,0x1d,0x00,0x7c,0xff,0xe5,0x01,0x1d,0x00,0x7d,0xff,0xe5,0x01,0x1d,0x00,0xac,0xff,0x56,0x01,0x1d,0x00,0xb1,0xff,0xe5,0x01,0x1d,0x00,0xb4,0x00,0xa4,0x01,0x1d,0x00,0xb5, +0x00,0x79,0x01,0x1d,0x00,0xb6,0x00,0xa4,0x01,0x1d,0x00,0xb7,0x00,0x79,0x01,0x1d,0x00,0xc4,0xff,0x62,0x01,0x1d,0x00,0xc5,0xff,0x62,0x01,0x1d,0x00,0xe4,0x00,0x0e,0x01,0x1d,0x00,0xe6,0x00,0x27,0x01,0x1d,0x00,0xeb,0x00,0x52,0x01,0x1d,0x00,0xf8,0xff,0xe5,0x01,0x1d,0x00,0xfb,0x00,0x0e,0x01,0x1d,0x00,0xfd,0xff,0xe5,0x01,0x1d, +0x00,0xff,0xff,0xe5,0x01,0x1d,0x01,0x00,0xff,0xe5,0x01,0x1d,0x01,0x08,0xff,0xe5,0x01,0x1d,0x01,0x0b,0xff,0xe5,0x01,0x1d,0x01,0x0d,0xff,0xe5,0x01,0x1d,0x01,0x19,0xff,0xe5,0x01,0x1d,0x01,0x1f,0x00,0x0e,0x01,0x1d,0x01,0x21,0x00,0x3b,0x01,0x1d,0x01,0x23,0x00,0x3b,0x01,0x1d,0x01,0x29,0x00,0x27,0x01,0x1d,0x01,0x2b,0x00,0x27, +0x01,0x1d,0x01,0x48,0xff,0xe5,0x01,0x1d,0x01,0x4c,0xff,0xe5,0x01,0x1d,0x01,0x4e,0xff,0xe5,0x01,0x1d,0x01,0x50,0xff,0xe5,0x01,0x1d,0x01,0x52,0xff,0xe5,0x01,0x1d,0x01,0x54,0xff,0xe5,0x01,0x1d,0x01,0x56,0xff,0xe5,0x01,0x1d,0x01,0x6d,0xff,0xfc,0x01,0x1d,0x01,0x6f,0xff,0xe5,0x01,0x1d,0x01,0x71,0xff,0xe5,0x01,0x1d,0x01,0x75, +0x00,0x0e,0x01,0x1d,0x01,0x77,0x00,0x3b,0x01,0x1d,0x01,0x81,0x00,0x52,0x01,0x1d,0x01,0x83,0x00,0x52,0x01,0x1d,0x01,0x8a,0xff,0xe5,0x01,0x1d,0x01,0x8d,0x00,0x52,0x01,0x1d,0x01,0x8f,0x00,0x52,0x01,0x1d,0x01,0x91,0x00,0x52,0x01,0x1d,0x01,0x93,0x00,0x52,0x01,0x1d,0x02,0x3e,0x00,0x0e,0x01,0x1e,0x00,0x57,0xff,0xbe,0x01,0x1e, +0x00,0x59,0xff,0xcf,0x01,0x1e,0x00,0x5a,0xff,0xe5,0x01,0x1e,0x00,0x5c,0xff,0xd1,0x01,0x1e,0x00,0xba,0xff,0xbe,0x01,0x1e,0x00,0xc4,0xff,0xb2,0x01,0x1e,0x00,0xc5,0xff,0xb2,0x01,0x1e,0x00,0xeb,0xff,0xd1,0x01,0x1e,0x01,0x21,0xff,0xbe,0x01,0x1e,0x01,0x23,0xff,0xbe,0x01,0x1e,0x01,0x77,0xff,0xbe,0x01,0x1e,0x01,0x81,0xff,0xe5, +0x01,0x1e,0x01,0x83,0xff,0xd1,0x01,0x1e,0x01,0x8d,0xff,0xe5,0x01,0x1e,0x01,0x8f,0xff,0xe5,0x01,0x1e,0x01,0x91,0xff,0xe5,0x01,0x1e,0x01,0x93,0xff,0xd1,0x01,0x20,0x00,0x0f,0xff,0x7f,0x01,0x20,0x00,0x11,0xff,0x4c,0x01,0x20,0x00,0x1d,0xff,0xe9,0x01,0x20,0x00,0x1e,0xff,0xe9,0x01,0x20,0x00,0x24,0xff,0x66,0x01,0x20,0x00,0x26, +0xff,0xa4,0x01,0x20,0x00,0x2a,0xff,0xa4,0x01,0x20,0x00,0x2d,0xff,0x8f,0x01,0x20,0x00,0x32,0xff,0xa4,0x01,0x20,0x00,0x34,0xff,0xa4,0x01,0x20,0x00,0x37,0x00,0x27,0x01,0x20,0x00,0x39,0x00,0x2b,0x01,0x20,0x00,0x3a,0x00,0x27,0x01,0x20,0x00,0x3b,0xff,0xfa,0x01,0x20,0x00,0x3c,0x00,0x1d,0x01,0x20,0x00,0x44,0xff,0x27,0x01,0x20, +0x00,0x46,0xff,0x2d,0x01,0x20,0x00,0x47,0xff,0x2d,0x01,0x20,0x00,0x48,0xff,0x2d,0x01,0x20,0x00,0x49,0xff,0xa0,0x01,0x20,0x00,0x4a,0xff,0x2d,0x01,0x20,0x00,0x50,0xff,0x4e,0x01,0x20,0x00,0x51,0xff,0x4e,0x01,0x20,0x00,0x52,0xff,0x2d,0x01,0x20,0x00,0x53,0xff,0x4e,0x01,0x20,0x00,0x54,0xff,0x2d,0x01,0x20,0x00,0x55,0xff,0x4e, +0x01,0x20,0x00,0x56,0xff,0x66,0x01,0x20,0x00,0x58,0xff,0x4e,0x01,0x20,0x00,0x59,0xff,0x9a,0x01,0x20,0x00,0x5a,0xff,0x8f,0x01,0x20,0x00,0x5b,0xff,0x4c,0x01,0x20,0x00,0x5c,0xff,0x8f,0x01,0x20,0x00,0x5d,0xff,0x7f,0x01,0x20,0x00,0x62,0xff,0x66,0x01,0x20,0x00,0x63,0xff,0x66,0x01,0x20,0x00,0x64,0xff,0xa4,0x01,0x20,0x00,0x67, +0xff,0xa4,0x01,0x20,0x00,0x69,0xff,0x27,0x01,0x20,0x00,0x6a,0xff,0x27,0x01,0x20,0x00,0x6b,0xff,0x27,0x01,0x20,0x00,0x6c,0xff,0x27,0x01,0x20,0x00,0x6d,0xff,0x3f,0x01,0x20,0x00,0x6e,0xff,0x27,0x01,0x20,0x00,0x6f,0xff,0x1b,0x01,0x20,0x00,0x70,0xff,0x2d,0x01,0x20,0x00,0x71,0xff,0x2d,0x01,0x20,0x00,0x72,0xff,0x2d,0x01,0x20, +0x00,0x73,0xff,0x2d,0x01,0x20,0x00,0x74,0xff,0xe9,0x01,0x20,0x00,0x76,0x00,0x31,0x01,0x20,0x00,0x77,0x00,0x6f,0x01,0x20,0x00,0x78,0xff,0x4e,0x01,0x20,0x00,0x79,0xff,0x2d,0x01,0x20,0x00,0x7a,0xff,0x2d,0x01,0x20,0x00,0x7b,0xff,0x2d,0x01,0x20,0x00,0x7c,0xff,0x2d,0x01,0x20,0x00,0x7d,0xff,0x2d,0x01,0x20,0x00,0x7e,0xff,0x4e, +0x01,0x20,0x00,0x7f,0xff,0x4e,0x01,0x20,0x00,0x80,0xff,0x4e,0x01,0x20,0x00,0x81,0xff,0x4e,0x01,0x20,0x00,0x8d,0x00,0x52,0x01,0x20,0x00,0x91,0xff,0x0c,0x01,0x20,0x00,0x92,0xff,0xa4,0x01,0x20,0x00,0xa0,0xff,0x27,0x01,0x20,0x00,0xaa,0xff,0x9a,0x01,0x20,0x00,0xab,0xff,0xcf,0x01,0x20,0x00,0xac,0xff,0x4c,0x01,0x20,0x00,0xad, +0xff,0x66,0x01,0x20,0x00,0xae,0xff,0x66,0x01,0x20,0x00,0xaf,0xff,0xa4,0x01,0x20,0x00,0xb0,0xff,0xa4,0x01,0x20,0x00,0xb1,0xff,0x2d,0x01,0x20,0x00,0xb5,0x00,0x27,0x01,0x20,0x00,0xb7,0x00,0x27,0x01,0x20,0x00,0xba,0xff,0x8f,0x01,0x20,0x00,0xbe,0xff,0x9a,0x01,0x20,0x00,0xbf,0xff,0xcf,0x01,0x20,0x00,0xc4,0xff,0x17,0x01,0x20, +0x00,0xc5,0xff,0x17,0x01,0x20,0x00,0xc7,0xff,0x66,0x01,0x20,0x00,0xc9,0xff,0x66,0x01,0x20,0x00,0xd0,0xff,0xa4,0x01,0x20,0x00,0xd1,0xff,0xa4,0x01,0x20,0x00,0xd2,0xff,0xa4,0x01,0x20,0x00,0xe4,0xff,0x66,0x01,0x20,0x00,0xe6,0xff,0x7f,0x01,0x20,0x00,0xea,0x00,0x1d,0x01,0x20,0x00,0xeb,0xff,0x8f,0x01,0x20,0x00,0xf7,0xff,0xa4, +0x01,0x20,0x00,0xf8,0xff,0x2d,0x01,0x20,0x00,0xfb,0xff,0x66,0x01,0x20,0x00,0xfc,0xff,0xa4,0x01,0x20,0x00,0xfd,0xff,0x2d,0x01,0x20,0x00,0xfe,0xff,0xa4,0x01,0x20,0x00,0xff,0xff,0x2d,0x01,0x20,0x01,0x00,0xff,0x2d,0x01,0x20,0x01,0x03,0xff,0x66,0x01,0x20,0x01,0x04,0xff,0x27,0x01,0x20,0x01,0x05,0xff,0x66,0x01,0x20,0x01,0x06, +0xff,0x27,0x01,0x20,0x01,0x08,0xff,0x2d,0x01,0x20,0x01,0x0b,0xff,0x2d,0x01,0x20,0x01,0x0d,0xff,0x2d,0x01,0x20,0x01,0x15,0xff,0x4e,0x01,0x20,0x01,0x17,0xff,0x4e,0x01,0x20,0x01,0x18,0xff,0xa4,0x01,0x20,0x01,0x19,0xff,0x2d,0x01,0x20,0x01,0x1b,0xff,0x4e,0x01,0x20,0x01,0x1d,0xff,0x4e,0x01,0x20,0x01,0x1f,0xff,0x66,0x01,0x20, +0x01,0x20,0x00,0x27,0x01,0x20,0x01,0x22,0x00,0x27,0x01,0x20,0x01,0x25,0xff,0x4e,0x01,0x20,0x01,0x27,0xff,0x4e,0x01,0x20,0x01,0x29,0xff,0x7f,0x01,0x20,0x01,0x2b,0xff,0x7f,0x01,0x20,0x01,0x45,0xff,0x66,0x01,0x20,0x01,0x46,0xff,0x27,0x01,0x20,0x01,0x47,0xff,0xa4,0x01,0x20,0x01,0x48,0xff,0x2d,0x01,0x20,0x01,0x4c,0xff,0x2d, +0x01,0x20,0x01,0x4e,0xff,0x2d,0x01,0x20,0x01,0x50,0xff,0x2d,0x01,0x20,0x01,0x51,0xff,0xa4,0x01,0x20,0x01,0x52,0xff,0x2d,0x01,0x20,0x01,0x53,0xff,0xa4,0x01,0x20,0x01,0x54,0xff,0x2d,0x01,0x20,0x01,0x55,0xff,0xa4,0x01,0x20,0x01,0x56,0xff,0x2d,0x01,0x20,0x01,0x5c,0x00,0x6f,0x01,0x20,0x01,0x5e,0x00,0x6f,0x01,0x20,0x01,0x60, +0x00,0x6f,0x01,0x20,0x01,0x63,0xff,0x8f,0x01,0x20,0x01,0x6d,0xff,0x4e,0x01,0x20,0x01,0x6e,0xff,0xa4,0x01,0x20,0x01,0x6f,0xff,0x2d,0x01,0x20,0x01,0x70,0xff,0xa4,0x01,0x20,0x01,0x71,0xff,0x2d,0x01,0x20,0x01,0x73,0xff,0x4e,0x01,0x20,0x01,0x75,0xff,0x66,0x01,0x20,0x01,0x76,0x00,0x27,0x01,0x20,0x01,0x79,0xff,0x4e,0x01,0x20, +0x01,0x7b,0xff,0x4e,0x01,0x20,0x01,0x7d,0xff,0x4e,0x01,0x20,0x01,0x7f,0xff,0x4e,0x01,0x20,0x01,0x80,0x00,0x27,0x01,0x20,0x01,0x81,0xff,0x8f,0x01,0x20,0x01,0x82,0x00,0x1d,0x01,0x20,0x01,0x83,0xff,0x8f,0x01,0x20,0x01,0x85,0xff,0x66,0x01,0x20,0x01,0x86,0xff,0x27,0x01,0x20,0x01,0x87,0xff,0x66,0x01,0x20,0x01,0x88,0xff,0x27, +0x01,0x20,0x01,0x89,0xff,0xa4,0x01,0x20,0x01,0x8a,0xff,0x2d,0x01,0x20,0x01,0x8c,0x00,0x27,0x01,0x20,0x01,0x8d,0xff,0x8f,0x01,0x20,0x01,0x8e,0x00,0x27,0x01,0x20,0x01,0x8f,0xff,0x8f,0x01,0x20,0x01,0x90,0x00,0x27,0x01,0x20,0x01,0x91,0xff,0x8f,0x01,0x20,0x01,0x92,0x00,0x1d,0x01,0x20,0x01,0x93,0xff,0x8f,0x01,0x20,0x02,0x3e, +0xff,0x66,0x01,0x21,0x00,0x10,0xff,0x8f,0x01,0x21,0x00,0x22,0xff,0xcb,0x01,0x21,0x00,0x46,0xff,0xe5,0x01,0x21,0x00,0x47,0xff,0xe5,0x01,0x21,0x00,0x48,0xff,0xf0,0x01,0x21,0x00,0x4a,0xff,0xf0,0x01,0x21,0x00,0x52,0xff,0xf0,0x01,0x21,0x00,0x54,0xff,0xf0,0x01,0x21,0x00,0x5b,0x00,0x1d,0x01,0x21,0x00,0x6f,0xff,0xe5,0x01,0x21, +0x00,0x70,0xff,0xf0,0x01,0x21,0x00,0x71,0xff,0xf0,0x01,0x21,0x00,0x72,0xff,0xf0,0x01,0x21,0x00,0x73,0xff,0xf0,0x01,0x21,0x00,0x79,0xff,0xf0,0x01,0x21,0x00,0x7a,0xff,0xf0,0x01,0x21,0x00,0x7b,0xff,0xf0,0x01,0x21,0x00,0x7c,0xff,0xf0,0x01,0x21,0x00,0x7d,0xff,0xf0,0x01,0x21,0x00,0xab,0x00,0x27,0x01,0x21,0x00,0xb1,0xff,0xf0, +0x01,0x21,0x00,0xbf,0x00,0x27,0x01,0x21,0x00,0xf8,0xff,0xf0,0x01,0x21,0x00,0xfd,0xff,0xe5,0x01,0x21,0x00,0xff,0xff,0xe5,0x01,0x21,0x01,0x00,0xff,0xe5,0x01,0x21,0x01,0x08,0xff,0xe5,0x01,0x21,0x01,0x0b,0xff,0xf0,0x01,0x21,0x01,0x0d,0xff,0xf0,0x01,0x21,0x01,0x19,0xff,0xf0,0x01,0x21,0x01,0x48,0xff,0xe5,0x01,0x21,0x01,0x4c, +0xff,0xf0,0x01,0x21,0x01,0x4e,0xff,0xf0,0x01,0x21,0x01,0x50,0xff,0xf0,0x01,0x21,0x01,0x52,0xff,0xf0,0x01,0x21,0x01,0x54,0xff,0xf0,0x01,0x21,0x01,0x56,0xff,0xf0,0x01,0x21,0x01,0x6f,0xff,0xf0,0x01,0x21,0x01,0x71,0xff,0xf0,0x01,0x21,0x01,0x8a,0xff,0xf0,0x01,0x22,0x00,0x0f,0xff,0x7f,0x01,0x22,0x00,0x11,0xff,0x4c,0x01,0x22, +0x00,0x1d,0xff,0xe9,0x01,0x22,0x00,0x1e,0xff,0xe9,0x01,0x22,0x00,0x24,0xff,0x66,0x01,0x22,0x00,0x26,0xff,0xa4,0x01,0x22,0x00,0x2a,0xff,0xa4,0x01,0x22,0x00,0x2d,0xff,0x8f,0x01,0x22,0x00,0x32,0xff,0xa4,0x01,0x22,0x00,0x34,0xff,0xa4,0x01,0x22,0x00,0x37,0x00,0x27,0x01,0x22,0x00,0x39,0x00,0x2b,0x01,0x22,0x00,0x3a,0x00,0x27, +0x01,0x22,0x00,0x3b,0xff,0xfa,0x01,0x22,0x00,0x3c,0x00,0x1d,0x01,0x22,0x00,0x44,0xff,0x27,0x01,0x22,0x00,0x46,0xff,0x2d,0x01,0x22,0x00,0x47,0xff,0x2d,0x01,0x22,0x00,0x48,0xff,0x2d,0x01,0x22,0x00,0x49,0xff,0xa0,0x01,0x22,0x00,0x4a,0xff,0x2d,0x01,0x22,0x00,0x50,0xff,0x4e,0x01,0x22,0x00,0x51,0xff,0x4e,0x01,0x22,0x00,0x52, +0xff,0x2d,0x01,0x22,0x00,0x53,0xff,0x4e,0x01,0x22,0x00,0x54,0xff,0x2d,0x01,0x22,0x00,0x55,0xff,0x4e,0x01,0x22,0x00,0x56,0xff,0x66,0x01,0x22,0x00,0x58,0xff,0x4e,0x01,0x22,0x00,0x59,0xff,0x9a,0x01,0x22,0x00,0x5a,0xff,0x8f,0x01,0x22,0x00,0x5b,0xff,0x4c,0x01,0x22,0x00,0x5c,0xff,0x8f,0x01,0x22,0x00,0x5d,0xff,0x7f,0x01,0x22, +0x00,0x62,0xff,0x66,0x01,0x22,0x00,0x63,0xff,0x66,0x01,0x22,0x00,0x64,0xff,0xa4,0x01,0x22,0x00,0x67,0xff,0xa4,0x01,0x22,0x00,0x69,0xff,0x27,0x01,0x22,0x00,0x6a,0xff,0x27,0x01,0x22,0x00,0x6b,0xff,0x27,0x01,0x22,0x00,0x6c,0xff,0x27,0x01,0x22,0x00,0x6d,0xff,0x3f,0x01,0x22,0x00,0x6e,0xff,0x27,0x01,0x22,0x00,0x6f,0xff,0x1b, +0x01,0x22,0x00,0x70,0xff,0x2d,0x01,0x22,0x00,0x71,0xff,0x2d,0x01,0x22,0x00,0x72,0xff,0x2d,0x01,0x22,0x00,0x73,0xff,0x2d,0x01,0x22,0x00,0x74,0xff,0xe9,0x01,0x22,0x00,0x76,0x00,0x31,0x01,0x22,0x00,0x77,0x00,0x6f,0x01,0x22,0x00,0x78,0xff,0x4e,0x01,0x22,0x00,0x79,0xff,0x2d,0x01,0x22,0x00,0x7a,0xff,0x2d,0x01,0x22,0x00,0x7b, +0xff,0x2d,0x01,0x22,0x00,0x7c,0xff,0x2d,0x01,0x22,0x00,0x7d,0xff,0x2d,0x01,0x22,0x00,0x7e,0xff,0x4e,0x01,0x22,0x00,0x7f,0xff,0x4e,0x01,0x22,0x00,0x80,0xff,0x4e,0x01,0x22,0x00,0x81,0xff,0x4e,0x01,0x22,0x00,0x8d,0x00,0x52,0x01,0x22,0x00,0x91,0xff,0x0c,0x01,0x22,0x00,0x92,0xff,0xa4,0x01,0x22,0x00,0xa0,0xff,0x27,0x01,0x22, +0x00,0xaa,0xff,0x9a,0x01,0x22,0x00,0xab,0xff,0xcf,0x01,0x22,0x00,0xac,0xff,0x4c,0x01,0x22,0x00,0xad,0xff,0x66,0x01,0x22,0x00,0xae,0xff,0x66,0x01,0x22,0x00,0xaf,0xff,0xa4,0x01,0x22,0x00,0xb0,0xff,0xa4,0x01,0x22,0x00,0xb1,0xff,0x2d,0x01,0x22,0x00,0xb5,0x00,0x27,0x01,0x22,0x00,0xb7,0x00,0x27,0x01,0x22,0x00,0xba,0xff,0x8f, +0x01,0x22,0x00,0xbe,0xff,0x9a,0x01,0x22,0x00,0xbf,0xff,0xcf,0x01,0x22,0x00,0xc4,0xff,0x17,0x01,0x22,0x00,0xc5,0xff,0x17,0x01,0x22,0x00,0xc7,0xff,0x66,0x01,0x22,0x00,0xc9,0xff,0x66,0x01,0x22,0x00,0xd0,0xff,0xa4,0x01,0x22,0x00,0xd1,0xff,0xa4,0x01,0x22,0x00,0xd2,0xff,0xa4,0x01,0x22,0x00,0xe4,0xff,0x66,0x01,0x22,0x00,0xe6, +0xff,0x7f,0x01,0x22,0x00,0xea,0x00,0x1d,0x01,0x22,0x00,0xeb,0xff,0x8f,0x01,0x22,0x00,0xf7,0xff,0xa4,0x01,0x22,0x00,0xf8,0xff,0x2d,0x01,0x22,0x00,0xfb,0xff,0x66,0x01,0x22,0x00,0xfc,0xff,0xa4,0x01,0x22,0x00,0xfd,0xff,0x2d,0x01,0x22,0x00,0xfe,0xff,0xa4,0x01,0x22,0x00,0xff,0xff,0x2d,0x01,0x22,0x01,0x00,0xff,0x2d,0x01,0x22, +0x01,0x03,0xff,0x66,0x01,0x22,0x01,0x04,0xff,0x27,0x01,0x22,0x01,0x05,0xff,0x66,0x01,0x22,0x01,0x06,0xff,0x27,0x01,0x22,0x01,0x08,0xff,0x2d,0x01,0x22,0x01,0x0b,0xff,0x2d,0x01,0x22,0x01,0x0d,0xff,0x2d,0x01,0x22,0x01,0x15,0xff,0x4e,0x01,0x22,0x01,0x17,0xff,0x4e,0x01,0x22,0x01,0x18,0xff,0xa4,0x01,0x22,0x01,0x19,0xff,0x2d, +0x01,0x22,0x01,0x1b,0xff,0x4e,0x01,0x22,0x01,0x1d,0xff,0x4e,0x01,0x22,0x01,0x1f,0xff,0x66,0x01,0x22,0x01,0x20,0x00,0x27,0x01,0x22,0x01,0x22,0x00,0x27,0x01,0x22,0x01,0x25,0xff,0x4e,0x01,0x22,0x01,0x27,0xff,0x4e,0x01,0x22,0x01,0x29,0xff,0x7f,0x01,0x22,0x01,0x2b,0xff,0x7f,0x01,0x22,0x01,0x45,0xff,0x66,0x01,0x22,0x01,0x46, +0xff,0x27,0x01,0x22,0x01,0x47,0xff,0xa4,0x01,0x22,0x01,0x48,0xff,0x2d,0x01,0x22,0x01,0x4c,0xff,0x2d,0x01,0x22,0x01,0x4e,0xff,0x2d,0x01,0x22,0x01,0x50,0xff,0x2d,0x01,0x22,0x01,0x51,0xff,0xa4,0x01,0x22,0x01,0x52,0xff,0x2d,0x01,0x22,0x01,0x53,0xff,0xa4,0x01,0x22,0x01,0x54,0xff,0x2d,0x01,0x22,0x01,0x55,0xff,0xa4,0x01,0x22, +0x01,0x56,0xff,0x2d,0x01,0x22,0x01,0x5c,0x00,0x6f,0x01,0x22,0x01,0x5e,0x00,0x6f,0x01,0x22,0x01,0x60,0x00,0x6f,0x01,0x22,0x01,0x63,0xff,0x8f,0x01,0x22,0x01,0x6d,0xff,0x4e,0x01,0x22,0x01,0x6e,0xff,0xa4,0x01,0x22,0x01,0x6f,0xff,0x2d,0x01,0x22,0x01,0x70,0xff,0xa4,0x01,0x22,0x01,0x71,0xff,0x2d,0x01,0x22,0x01,0x73,0xff,0x4e, +0x01,0x22,0x01,0x75,0xff,0x66,0x01,0x22,0x01,0x76,0x00,0x27,0x01,0x22,0x01,0x79,0xff,0x4e,0x01,0x22,0x01,0x7b,0xff,0x4e,0x01,0x22,0x01,0x7d,0xff,0x4e,0x01,0x22,0x01,0x7f,0xff,0x4e,0x01,0x22,0x01,0x80,0x00,0x27,0x01,0x22,0x01,0x81,0xff,0x8f,0x01,0x22,0x01,0x82,0x00,0x1d,0x01,0x22,0x01,0x83,0xff,0x8f,0x01,0x22,0x01,0x85, +0xff,0x66,0x01,0x22,0x01,0x86,0xff,0x27,0x01,0x22,0x01,0x87,0xff,0x66,0x01,0x22,0x01,0x88,0xff,0x27,0x01,0x22,0x01,0x89,0xff,0xa4,0x01,0x22,0x01,0x8a,0xff,0x2d,0x01,0x22,0x01,0x8c,0x00,0x27,0x01,0x22,0x01,0x8d,0xff,0x8f,0x01,0x22,0x01,0x8e,0x00,0x27,0x01,0x22,0x01,0x8f,0xff,0x8f,0x01,0x22,0x01,0x90,0x00,0x27,0x01,0x22, +0x01,0x91,0xff,0x8f,0x01,0x22,0x01,0x92,0x00,0x1d,0x01,0x22,0x01,0x93,0xff,0x8f,0x01,0x22,0x02,0x3e,0xff,0x66,0x01,0x23,0x00,0x10,0xff,0x8f,0x01,0x23,0x00,0x22,0xff,0xcb,0x01,0x23,0x00,0x46,0xff,0xe5,0x01,0x23,0x00,0x47,0xff,0xe5,0x01,0x23,0x00,0x48,0xff,0xf0,0x01,0x23,0x00,0x4a,0xff,0xf0,0x01,0x23,0x00,0x52,0xff,0xf0, +0x01,0x23,0x00,0x54,0xff,0xf0,0x01,0x23,0x00,0x5b,0x00,0x1d,0x01,0x23,0x00,0x6f,0xff,0xe5,0x01,0x23,0x00,0x70,0xff,0xf0,0x01,0x23,0x00,0x71,0xff,0xf0,0x01,0x23,0x00,0x72,0xff,0xf0,0x01,0x23,0x00,0x73,0xff,0xf0,0x01,0x23,0x00,0x79,0xff,0xf0,0x01,0x23,0x00,0x7a,0xff,0xf0,0x01,0x23,0x00,0x7b,0xff,0xf0,0x01,0x23,0x00,0x7c, +0xff,0xf0,0x01,0x23,0x00,0x7d,0xff,0xf0,0x01,0x23,0x00,0xab,0x00,0x27,0x01,0x23,0x00,0xb1,0xff,0xf0,0x01,0x23,0x00,0xbf,0x00,0x27,0x01,0x23,0x00,0xf8,0xff,0xf0,0x01,0x23,0x00,0xfd,0xff,0xe5,0x01,0x23,0x00,0xff,0xff,0xe5,0x01,0x23,0x01,0x00,0xff,0xe5,0x01,0x23,0x01,0x08,0xff,0xe5,0x01,0x23,0x01,0x0b,0xff,0xf0,0x01,0x23, +0x01,0x0d,0xff,0xf0,0x01,0x23,0x01,0x19,0xff,0xf0,0x01,0x23,0x01,0x48,0xff,0xe5,0x01,0x23,0x01,0x4c,0xff,0xf0,0x01,0x23,0x01,0x4e,0xff,0xf0,0x01,0x23,0x01,0x50,0xff,0xf0,0x01,0x23,0x01,0x52,0xff,0xf0,0x01,0x23,0x01,0x54,0xff,0xf0,0x01,0x23,0x01,0x56,0xff,0xf0,0x01,0x23,0x01,0x6f,0xff,0xf0,0x01,0x23,0x01,0x71,0xff,0xf0, +0x01,0x23,0x01,0x8a,0xff,0xf0,0x01,0x24,0x00,0x24,0xff,0xd7,0x01,0x24,0x00,0x91,0xff,0x8b,0x01,0x24,0x00,0xc4,0xff,0xa6,0x01,0x24,0x00,0xc5,0xff,0xa6,0x01,0x24,0x01,0x03,0xff,0xd7,0x01,0x24,0x01,0x05,0xff,0xd7,0x01,0x24,0x01,0x45,0xff,0xd7,0x01,0x24,0x01,0x85,0xff,0xd7,0x01,0x24,0x01,0x87,0xff,0xd7,0x01,0x25,0x00,0x05, +0xff,0xbe,0x01,0x25,0x00,0x0a,0xff,0xbe,0x01,0x26,0x00,0x24,0xff,0xd7,0x01,0x26,0x00,0x91,0xff,0x8b,0x01,0x26,0x00,0xc4,0xff,0xa6,0x01,0x26,0x00,0xc5,0xff,0xa6,0x01,0x26,0x01,0x03,0xff,0xd7,0x01,0x26,0x01,0x05,0xff,0xd7,0x01,0x26,0x01,0x45,0xff,0xd7,0x01,0x26,0x01,0x85,0xff,0xd7,0x01,0x26,0x01,0x87,0xff,0xd7,0x01,0x27, +0x00,0x05,0xff,0xbe,0x01,0x27,0x00,0x0a,0xff,0xbe,0x01,0x28,0x00,0x2d,0x00,0x52,0x01,0x28,0x00,0x37,0x00,0x27,0x01,0x28,0x00,0x5c,0xff,0xcb,0x01,0x28,0x00,0x77,0x00,0x46,0x01,0x28,0x00,0xab,0x00,0x27,0x01,0x28,0x00,0xba,0xff,0xbe,0x01,0x28,0x00,0xbf,0x00,0x52,0x01,0x28,0x00,0xeb,0xff,0xcb,0x01,0x28,0x01,0x20,0x00,0x27, +0x01,0x28,0x01,0x22,0x00,0x27,0x01,0x28,0x01,0x5c,0x00,0x46,0x01,0x28,0x01,0x5e,0x00,0x46,0x01,0x28,0x01,0x60,0x00,0x46,0x01,0x28,0x01,0x63,0x00,0x52,0x01,0x28,0x01,0x76,0x00,0x27,0x01,0x28,0x01,0x83,0xff,0xcb,0x01,0x28,0x01,0x93,0xff,0xcb,0x01,0x2a,0x00,0x2d,0x00,0x52,0x01,0x2a,0x00,0x37,0x00,0x27,0x01,0x2a,0x00,0x5c, +0xff,0xcb,0x01,0x2a,0x00,0x77,0x00,0x46,0x01,0x2a,0x00,0xab,0x00,0x27,0x01,0x2a,0x00,0xba,0xff,0xbe,0x01,0x2a,0x00,0xbf,0x00,0x52,0x01,0x2a,0x00,0xeb,0xff,0xcb,0x01,0x2a,0x01,0x20,0x00,0x27,0x01,0x2a,0x01,0x22,0x00,0x27,0x01,0x2a,0x01,0x5c,0x00,0x46,0x01,0x2a,0x01,0x5e,0x00,0x46,0x01,0x2a,0x01,0x60,0x00,0x46,0x01,0x2a, +0x01,0x63,0x00,0x52,0x01,0x2a,0x01,0x76,0x00,0x27,0x01,0x2a,0x01,0x83,0xff,0xcb,0x01,0x2a,0x01,0x93,0xff,0xcb,0x01,0x2c,0x00,0x04,0x00,0x44,0x01,0x2c,0x00,0x0f,0xff,0x7d,0x01,0x2c,0x00,0x11,0xff,0x4c,0x01,0x2c,0x00,0x1d,0xff,0xe9,0x01,0x2c,0x00,0x1e,0xff,0xe9,0x01,0x2c,0x00,0x8d,0x00,0x52,0x01,0x2c,0x00,0xa9,0xff,0x6d, +0x01,0x2c,0x00,0xaa,0xff,0x98,0x01,0x2c,0x00,0xab,0xff,0xcd,0x01,0x2c,0x00,0xac,0xff,0x4c,0x01,0x2c,0x00,0xb5,0x00,0x29,0x01,0x2c,0x00,0xb7,0x00,0x29,0x01,0x2c,0x00,0xbe,0xff,0x98,0x01,0x2c,0x00,0xbf,0xff,0xcd,0x01,0x2c,0x00,0xc4,0xff,0x14,0x01,0x2c,0x00,0xc5,0xff,0x14,0x01,0x2c,0x01,0x2d,0xff,0xb6,0x01,0x2c,0x01,0x2e, +0xff,0xb6,0x01,0x2c,0x01,0x2f,0xff,0x2b,0x01,0x2c,0x01,0x30,0xff,0xb0,0x01,0x2c,0x01,0x31,0xff,0x2b,0x01,0x2c,0x01,0x32,0xff,0x2b,0x01,0x2c,0x01,0x33,0xff,0x8f,0x01,0x2c,0x01,0x34,0xff,0x2b,0x01,0x2c,0x01,0xa8,0x00,0x7b,0x01,0x2c,0x01,0xa9,0xff,0x6d,0x01,0x2c,0x01,0xac,0x00,0x0a,0x01,0x2c,0x01,0xb0,0xff,0x6d,0x01,0x2c, +0x01,0xb4,0xff,0xb6,0x01,0x2c,0x01,0xb8,0x00,0x2f,0x01,0x2c,0x01,0xb9,0x00,0x1d,0x01,0x2c,0x01,0xbc,0xff,0xcf,0x01,0x2c,0x01,0xbf,0xff,0x2b,0x01,0x2c,0x01,0xc0,0xff,0x2b,0x01,0x2c,0x01,0xc1,0xff,0x4e,0x01,0x2c,0x01,0xc2,0xff,0x8f,0x01,0x2c,0x01,0xc5,0xff,0xc1,0x01,0x2c,0x01,0xc7,0xff,0x4e,0x01,0x2c,0x01,0xc9,0xff,0x4e, +0x01,0x2c,0x01,0xca,0xff,0x4e,0x01,0x2c,0x01,0xcc,0xff,0x4e,0x01,0x2c,0x01,0xce,0xff,0xb0,0x01,0x2c,0x01,0xcf,0xff,0x2b,0x01,0x2c,0x01,0xd0,0xff,0x4e,0x01,0x2c,0x01,0xd1,0xff,0x2b,0x01,0x2c,0x01,0xd2,0xff,0x4e,0x01,0x2c,0x01,0xd3,0xff,0x7f,0x01,0x2c,0x01,0xd4,0xff,0x4e,0x01,0x2c,0x01,0xd5,0xff,0x2b,0x01,0x2c,0x01,0xd6, +0x00,0x52,0x01,0x2c,0x01,0xd7,0xff,0x4e,0x01,0x2c,0x01,0xd8,0xff,0x2b,0x01,0x2c,0x01,0xd9,0xff,0x4e,0x01,0x2c,0x01,0xda,0xff,0x2b,0x01,0x2c,0x02,0x37,0xff,0x8f,0x01,0x2d,0x00,0x0f,0xff,0xa2,0x01,0x2d,0x00,0xa9,0xff,0xcf,0x01,0x2d,0x00,0xc4,0xff,0x4a,0x01,0x2d,0x00,0xc5,0xff,0x96,0x01,0x2d,0x01,0xa9,0xff,0xe5,0x01,0x2d, +0x01,0xac,0xff,0xcd,0x01,0x2d,0x01,0xb0,0xff,0xe5,0x01,0x2d,0x01,0xb7,0xff,0xe3,0x01,0x2d,0x01,0xb8,0xff,0xa4,0x01,0x2d,0x01,0xb9,0xff,0xe7,0x01,0x2d,0x01,0xba,0xff,0xdb,0x01,0x2d,0x01,0xbe,0xff,0xe7,0x01,0x2d,0x01,0xcb,0xff,0xd7,0x01,0x2e,0x00,0x0f,0xff,0xa2,0x01,0x2e,0x00,0xa9,0xff,0xcf,0x01,0x2e,0x00,0xc4,0xff,0x4a, +0x01,0x2e,0x00,0xc5,0xff,0x96,0x01,0x2e,0x01,0xa9,0xff,0xcf,0x01,0x2e,0x01,0xac,0xff,0xcd,0x01,0x2e,0x01,0xb0,0xff,0xcf,0x01,0x2e,0x01,0xb7,0xff,0xe3,0x01,0x2e,0x01,0xb8,0xff,0xa4,0x01,0x2e,0x01,0xb9,0xff,0xe7,0x01,0x2e,0x01,0xba,0xff,0xd3,0x01,0x2e,0x01,0xbe,0xff,0xe7,0x01,0x2e,0x01,0xcb,0xff,0xc3,0x01,0x2f,0x01,0x2f, +0xff,0xee,0x01,0x2f,0x01,0x30,0xff,0xee,0x01,0x2f,0x01,0x32,0xff,0xee,0x01,0x2f,0x01,0x34,0xff,0xee,0x01,0x2f,0x01,0xbf,0xff,0xee,0x01,0x2f,0x01,0xcf,0xff,0xee,0x01,0x2f,0x01,0xd1,0xff,0xee,0x01,0x2f,0x01,0xd5,0xff,0xee,0x01,0x2f,0x01,0xd8,0xff,0xee,0x01,0x30,0x00,0x05,0xff,0x6f,0x01,0x30,0x00,0x0a,0xff,0x6f,0x01,0x30, +0x00,0xb4,0xff,0xb0,0x01,0x30,0x00,0xb5,0xff,0x7b,0x01,0x30,0x00,0xb6,0xff,0xbc,0x01,0x30,0x00,0xb7,0xff,0x7b,0x01,0x30,0x01,0x33,0xff,0xdb,0x01,0x30,0x01,0xc5,0xff,0xc1,0x01,0x30,0x01,0xd3,0xff,0xaa,0x01,0x30,0x02,0x37,0xff,0xdb,0x01,0x32,0x01,0x33,0x00,0x19,0x01,0x32,0x01,0xc5,0x00,0x31,0x01,0x32,0x01,0xcd,0x00,0x39, +0x01,0x32,0x01,0xd3,0x00,0x19,0x01,0x32,0x02,0x37,0x00,0x19,0x01,0x33,0x01,0x2f,0xff,0xdb,0x01,0x33,0x01,0x30,0xff,0xdb,0x01,0x33,0x01,0x32,0xff,0xdb,0x01,0x33,0x01,0x33,0x00,0x19,0x01,0x33,0x01,0x34,0xff,0xdb,0x01,0x33,0x01,0xbf,0xff,0xdb,0x01,0x33,0x01,0xc5,0x00,0x29,0x01,0x33,0x01,0xcd,0x00,0x25,0x01,0x33,0x01,0xcf, +0xff,0xdb,0x01,0x33,0x01,0xd0,0xff,0xcf,0x01,0x33,0x01,0xd3,0x00,0x19,0x01,0x33,0x01,0xd5,0xff,0xdb,0x01,0x33,0x01,0xd8,0xff,0xdb,0x01,0x33,0x01,0xda,0xff,0xdb,0x01,0x34,0x00,0x05,0xff,0x6f,0x01,0x34,0x00,0x0a,0xff,0x6f,0x01,0x34,0x00,0xb4,0xff,0xb0,0x01,0x34,0x00,0xb5,0xff,0x7b,0x01,0x34,0x00,0xb6,0xff,0xbc,0x01,0x34, +0x00,0xb7,0xff,0x7b,0x01,0x34,0x01,0x33,0xff,0xdb,0x01,0x34,0x01,0xc5,0xff,0xdb,0x01,0x34,0x01,0xd3,0xff,0xc3,0x01,0x34,0x02,0x37,0xff,0xdb,0x01,0x3a,0x00,0x4d,0x00,0x23,0x01,0x3a,0x01,0x64,0x00,0x23,0x01,0x3b,0x00,0x05,0xff,0x98,0x01,0x3b,0x00,0x0a,0xff,0x98,0x01,0x45,0x00,0x0d,0xff,0x7f,0x01,0x45,0x00,0x0f,0x00,0x44, +0x01,0x45,0x00,0x1e,0x00,0x44,0x01,0x45,0x00,0x26,0xff,0xe5,0x01,0x45,0x00,0x2a,0xff,0xe5,0x01,0x45,0x00,0x2d,0x00,0x5e,0x01,0x45,0x00,0x32,0xff,0xe5,0x01,0x45,0x00,0x37,0xff,0x6d,0x01,0x45,0x00,0x38,0xff,0xe5,0x01,0x45,0x00,0x39,0xff,0x8b,0x01,0x45,0x00,0x3a,0xff,0xb6,0x01,0x45,0x00,0x3c,0xff,0x64,0x01,0x45,0x00,0x3d, +0x00,0x3b,0x01,0x45,0x00,0x57,0xff,0xe5,0x01,0x45,0x00,0x59,0xff,0xd5,0x01,0x45,0x00,0x5a,0xff,0xe5,0x01,0x45,0x00,0x5c,0xff,0xdb,0x01,0x45,0x00,0x8d,0xff,0x9a,0x01,0x45,0x00,0xb4,0xff,0x66,0x01,0x45,0x00,0xb5,0xff,0x3f,0x01,0x45,0x00,0xb6,0xff,0x66,0x01,0x45,0x00,0xb7,0xff,0x3f,0x01,0x45,0x00,0xba,0xff,0xc1,0x01,0x45, +0x00,0xbb,0xff,0x64,0x01,0x45,0x00,0xe5,0x00,0x3b,0x01,0x45,0x00,0xea,0xff,0x64,0x01,0x45,0x00,0xeb,0xff,0xdb,0x01,0x45,0x00,0xf7,0xff,0xe5,0x01,0x45,0x00,0xfc,0xff,0xe5,0x01,0x45,0x00,0xfe,0xff,0xe5,0x01,0x45,0x01,0x18,0xff,0xe5,0x01,0x45,0x01,0x20,0xff,0x6d,0x01,0x45,0x01,0x21,0xff,0xe5,0x01,0x45,0x01,0x22,0xff,0x6d, +0x01,0x45,0x01,0x23,0xff,0xe5,0x01,0x45,0x01,0x24,0xff,0xe5,0x01,0x45,0x01,0x26,0xff,0xe5,0x01,0x45,0x01,0x28,0x00,0x3b,0x01,0x45,0x01,0x2a,0x00,0x3b,0x01,0x45,0x01,0x47,0xff,0xe5,0x01,0x45,0x01,0x51,0xff,0xe5,0x01,0x45,0x01,0x53,0xff,0xe5,0x01,0x45,0x01,0x55,0xff,0xe5,0x01,0x45,0x01,0x63,0x00,0x5e,0x01,0x45,0x01,0x6e, +0xff,0xe5,0x01,0x45,0x01,0x70,0xff,0xe5,0x01,0x45,0x01,0x76,0xff,0x6d,0x01,0x45,0x01,0x77,0xff,0xe5,0x01,0x45,0x01,0x78,0xff,0xe5,0x01,0x45,0x01,0x7a,0xff,0xe5,0x01,0x45,0x01,0x7c,0xff,0xe5,0x01,0x45,0x01,0x7e,0xff,0xe5,0x01,0x45,0x01,0x80,0xff,0xb6,0x01,0x45,0x01,0x81,0xff,0xe5,0x01,0x45,0x01,0x82,0xff,0x64,0x01,0x45, +0x01,0x83,0xff,0xdb,0x01,0x45,0x01,0x89,0xff,0xe5,0x01,0x45,0x01,0x8c,0xff,0xb6,0x01,0x45,0x01,0x8d,0xff,0xe5,0x01,0x45,0x01,0x8e,0xff,0xb6,0x01,0x45,0x01,0x8f,0xff,0xe5,0x01,0x45,0x01,0x90,0xff,0xb6,0x01,0x45,0x01,0x91,0xff,0xe5,0x01,0x45,0x01,0x92,0xff,0x64,0x01,0x45,0x01,0x93,0xff,0xdb,0x01,0x47,0x00,0x26,0xff,0xc9, +0x01,0x47,0x00,0x2a,0xff,0xc9,0x01,0x47,0x00,0x32,0xff,0xe5,0x01,0x47,0x00,0x34,0xff,0xc9,0x01,0x47,0x00,0x64,0xff,0xc9,0x01,0x47,0x00,0x67,0xff,0xc9,0x01,0x47,0x00,0x77,0x00,0x1d,0x01,0x47,0x00,0x92,0xff,0xc9,0x01,0x47,0x00,0xaa,0xff,0xcf,0x01,0x47,0x00,0xaf,0xff,0xc9,0x01,0x47,0x00,0xb0,0xff,0xc9,0x01,0x47,0x00,0xbe, +0xff,0xcf,0x01,0x47,0x00,0xd0,0xff,0xc9,0x01,0x47,0x00,0xd1,0xff,0xc9,0x01,0x47,0x00,0xd2,0xff,0xc9,0x01,0x47,0x00,0xf7,0xff,0xc9,0x01,0x47,0x00,0xfc,0xff,0xc9,0x01,0x47,0x00,0xfe,0xff,0xc9,0x01,0x47,0x01,0x18,0xff,0xe5,0x01,0x47,0x01,0x47,0xff,0xc9,0x01,0x47,0x01,0x51,0xff,0xc9,0x01,0x47,0x01,0x53,0xff,0xc9,0x01,0x47, +0x01,0x55,0xff,0xc9,0x01,0x47,0x01,0x5c,0x00,0x1d,0x01,0x47,0x01,0x5e,0x00,0x1d,0x01,0x47,0x01,0x60,0x00,0x1d,0x01,0x47,0x01,0x6e,0xff,0xe5,0x01,0x47,0x01,0x70,0xff,0xe5,0x01,0x47,0x01,0x89,0xff,0xe5,0x01,0x48,0x00,0x2d,0x00,0x46,0x01,0x48,0x00,0x37,0xff,0x9a,0x01,0x48,0x00,0x3c,0xff,0xb4,0x01,0x48,0x00,0xea,0xff,0xb4, +0x01,0x48,0x01,0x20,0xff,0x9a,0x01,0x48,0x01,0x22,0xff,0x9a,0x01,0x48,0x01,0x63,0x00,0x46,0x01,0x48,0x01,0x76,0xff,0x9a,0x01,0x48,0x01,0x82,0xff,0xb4,0x01,0x48,0x01,0x92,0xff,0xb4,0x01,0x4b,0x00,0x24,0x00,0x0a,0x01,0x4b,0x00,0x2d,0x00,0x44,0x01,0x4b,0x00,0x37,0x00,0x04,0x01,0x4b,0x00,0x3a,0x00,0x1d,0x01,0x4b,0x00,0x3b, +0x00,0x08,0x01,0x4b,0x00,0x62,0x00,0x0a,0x01,0x4b,0x00,0x63,0x00,0x0a,0x01,0x4b,0x00,0x77,0x00,0x12,0x01,0x4b,0x00,0xad,0x00,0x0a,0x01,0x4b,0x00,0xae,0x00,0x0a,0x01,0x4b,0x00,0xc7,0x00,0x0a,0x01,0x4b,0x00,0xc9,0x00,0x0a,0x01,0x4b,0x01,0x03,0x00,0x0a,0x01,0x4b,0x01,0x05,0x00,0x0a,0x01,0x4b,0x01,0x20,0x00,0x04,0x01,0x4b, +0x01,0x22,0x00,0x04,0x01,0x4b,0x01,0x45,0x00,0x0a,0x01,0x4b,0x01,0x5c,0x00,0x12,0x01,0x4b,0x01,0x5e,0x00,0x12,0x01,0x4b,0x01,0x60,0x00,0x12,0x01,0x4b,0x01,0x63,0x00,0x44,0x01,0x4b,0x01,0x76,0x00,0x04,0x01,0x4b,0x01,0x80,0x00,0x1d,0x01,0x4b,0x01,0x85,0x00,0x0a,0x01,0x4b,0x01,0x87,0x00,0x0a,0x01,0x4b,0x01,0x8c,0x00,0x1d, +0x01,0x4b,0x01,0x8e,0x00,0x1d,0x01,0x4b,0x01,0x90,0x00,0x1d,0x01,0x4c,0x00,0x05,0xff,0x98,0x01,0x4c,0x00,0x0a,0xff,0x98,0x01,0x4d,0x00,0x24,0x00,0x0a,0x01,0x4d,0x00,0x2d,0x00,0x44,0x01,0x4d,0x00,0x37,0x00,0x04,0x01,0x4d,0x00,0x3a,0x00,0x1d,0x01,0x4d,0x00,0x3b,0x00,0x08,0x01,0x4d,0x00,0x62,0x00,0x0a,0x01,0x4d,0x00,0x63, +0x00,0x0a,0x01,0x4d,0x00,0x77,0x00,0x12,0x01,0x4d,0x00,0xad,0x00,0x0a,0x01,0x4d,0x00,0xae,0x00,0x0a,0x01,0x4d,0x00,0xc7,0x00,0x0a,0x01,0x4d,0x00,0xc9,0x00,0x0a,0x01,0x4d,0x01,0x03,0x00,0x0a,0x01,0x4d,0x01,0x05,0x00,0x0a,0x01,0x4d,0x01,0x20,0x00,0x04,0x01,0x4d,0x01,0x22,0x00,0x04,0x01,0x4d,0x01,0x45,0x00,0x0a,0x01,0x4d, +0x01,0x5c,0x00,0x12,0x01,0x4d,0x01,0x5e,0x00,0x12,0x01,0x4d,0x01,0x60,0x00,0x12,0x01,0x4d,0x01,0x63,0x00,0x44,0x01,0x4d,0x01,0x76,0x00,0x04,0x01,0x4d,0x01,0x80,0x00,0x1d,0x01,0x4d,0x01,0x85,0x00,0x0a,0x01,0x4d,0x01,0x87,0x00,0x0a,0x01,0x4d,0x01,0x8c,0x00,0x1d,0x01,0x4d,0x01,0x8e,0x00,0x1d,0x01,0x4d,0x01,0x90,0x00,0x1d, +0x01,0x4e,0x00,0x05,0xff,0x98,0x01,0x4e,0x00,0x0a,0xff,0x98,0x01,0x4f,0x00,0x24,0x00,0x0a,0x01,0x4f,0x00,0x2d,0x00,0x44,0x01,0x4f,0x00,0x37,0x00,0x04,0x01,0x4f,0x00,0x3a,0x00,0x1d,0x01,0x4f,0x00,0x3b,0x00,0x08,0x01,0x4f,0x00,0x62,0x00,0x0a,0x01,0x4f,0x00,0x63,0x00,0x0a,0x01,0x4f,0x00,0x77,0x00,0x12,0x01,0x4f,0x00,0xad, +0x00,0x0a,0x01,0x4f,0x00,0xae,0x00,0x0a,0x01,0x4f,0x00,0xc7,0x00,0x0a,0x01,0x4f,0x00,0xc9,0x00,0x0a,0x01,0x4f,0x01,0x03,0x00,0x0a,0x01,0x4f,0x01,0x05,0x00,0x0a,0x01,0x4f,0x01,0x20,0x00,0x04,0x01,0x4f,0x01,0x22,0x00,0x04,0x01,0x4f,0x01,0x45,0x00,0x0a,0x01,0x4f,0x01,0x5c,0x00,0x12,0x01,0x4f,0x01,0x5e,0x00,0x12,0x01,0x4f, +0x01,0x60,0x00,0x12,0x01,0x4f,0x01,0x63,0x00,0x44,0x01,0x4f,0x01,0x76,0x00,0x04,0x01,0x4f,0x01,0x80,0x00,0x1d,0x01,0x4f,0x01,0x85,0x00,0x0a,0x01,0x4f,0x01,0x87,0x00,0x0a,0x01,0x4f,0x01,0x8c,0x00,0x1d,0x01,0x4f,0x01,0x8e,0x00,0x1d,0x01,0x4f,0x01,0x90,0x00,0x1d,0x01,0x50,0x00,0x05,0xff,0x98,0x01,0x50,0x00,0x0a,0xff,0x98, +0x01,0x51,0x00,0x37,0xff,0xcf,0x01,0x51,0x00,0x39,0xff,0xe5,0x01,0x51,0x00,0x5c,0xff,0xe5,0x01,0x51,0x00,0xba,0xff,0xe5,0x01,0x51,0x00,0xeb,0xff,0xe5,0x01,0x51,0x01,0x20,0xff,0xcf,0x01,0x51,0x01,0x22,0xff,0xcf,0x01,0x51,0x01,0x76,0xff,0xcf,0x01,0x51,0x01,0x83,0xff,0xe5,0x01,0x51,0x01,0x93,0xff,0xe5,0x01,0x52,0x00,0x4d, +0x00,0x2f,0x01,0x52,0x01,0x64,0x00,0x2f,0x01,0x53,0x00,0x37,0xff,0xcf,0x01,0x53,0x00,0x39,0xff,0xe5,0x01,0x53,0x00,0x5c,0xff,0xe5,0x01,0x53,0x00,0xba,0xff,0xe5,0x01,0x53,0x00,0xeb,0xff,0xe5,0x01,0x53,0x01,0x20,0xff,0xcf,0x01,0x53,0x01,0x22,0xff,0xcf,0x01,0x53,0x01,0x76,0xff,0xcf,0x01,0x53,0x01,0x83,0xff,0xe5,0x01,0x53, +0x01,0x93,0xff,0xe5,0x01,0x54,0x00,0x4d,0x00,0x2f,0x01,0x54,0x01,0x64,0x00,0x2f,0x01,0x55,0x00,0x37,0xff,0xcf,0x01,0x55,0x00,0x39,0xff,0xe5,0x01,0x55,0x00,0x5c,0xff,0xe5,0x01,0x55,0x00,0xba,0xff,0xe5,0x01,0x55,0x00,0xeb,0xff,0xe5,0x01,0x55,0x01,0x20,0xff,0xcf,0x01,0x55,0x01,0x22,0xff,0xcf,0x01,0x55,0x01,0x76,0xff,0xcf, +0x01,0x55,0x01,0x83,0xff,0xe5,0x01,0x55,0x01,0x93,0xff,0xe5,0x01,0x56,0x00,0x4d,0x00,0x2f,0x01,0x56,0x01,0x64,0x00,0x2f,0x01,0x63,0x00,0x0f,0xff,0x9a,0x01,0x63,0x00,0x11,0xff,0x9a,0x01,0x63,0x00,0x24,0xff,0xdb,0x01,0x63,0x00,0x2d,0xff,0xbe,0x01,0x63,0x00,0x44,0xff,0xe5,0x01,0x63,0x00,0x62,0xff,0xdb,0x01,0x63,0x00,0x63, +0xff,0xdb,0x01,0x63,0x00,0x69,0xff,0xe5,0x01,0x63,0x00,0x6a,0xff,0xe5,0x01,0x63,0x00,0x6b,0xff,0xe5,0x01,0x63,0x00,0x6c,0xff,0xe5,0x01,0x63,0x00,0x6d,0xff,0xe5,0x01,0x63,0x00,0x6e,0xff,0xe5,0x01,0x63,0x00,0x91,0xff,0x98,0x01,0x63,0x00,0xa0,0xff,0xe5,0x01,0x63,0x00,0xac,0xff,0x9a,0x01,0x63,0x00,0xad,0xff,0xdb,0x01,0x63, +0x00,0xae,0xff,0xdb,0x01,0x63,0x00,0xc4,0xff,0x66,0x01,0x63,0x00,0xc5,0xff,0x9a,0x01,0x63,0x00,0xc7,0xff,0xdb,0x01,0x63,0x00,0xc9,0xff,0xdb,0x01,0x63,0x01,0x03,0xff,0xdb,0x01,0x63,0x01,0x04,0xff,0xe5,0x01,0x63,0x01,0x05,0xff,0xdb,0x01,0x63,0x01,0x06,0xff,0xe5,0x01,0x63,0x01,0x45,0xff,0xdb,0x01,0x63,0x01,0x46,0xff,0xe5, +0x01,0x63,0x01,0x63,0xff,0xbe,0x01,0x63,0x01,0x85,0xff,0xdb,0x01,0x63,0x01,0x86,0xff,0xe5,0x01,0x63,0x01,0x87,0xff,0xdb,0x01,0x63,0x01,0x88,0xff,0xe5,0x01,0x64,0x00,0x4d,0x00,0x23,0x01,0x64,0x01,0x64,0x00,0x23,0x01,0x65,0x00,0x0f,0x00,0x27,0x01,0x65,0x00,0x1e,0x00,0x27,0x01,0x65,0x00,0x26,0xff,0xa6,0x01,0x65,0x00,0x2a, +0xff,0xa6,0x01,0x65,0x00,0x2d,0x00,0x5a,0x01,0x65,0x00,0x32,0xff,0xa6,0x01,0x65,0x00,0x34,0xff,0xa6,0x01,0x65,0x00,0x3b,0x00,0x25,0x01,0x65,0x00,0x3d,0x00,0x27,0x01,0x65,0x00,0x46,0xff,0xe5,0x01,0x65,0x00,0x47,0xff,0xe5,0x01,0x65,0x00,0x48,0xff,0xe5,0x01,0x65,0x00,0x4a,0xff,0xe5,0x01,0x65,0x00,0x52,0xff,0xe5,0x01,0x65, +0x00,0x54,0xff,0xe5,0x01,0x65,0x00,0x57,0xff,0xd1,0x01,0x65,0x00,0x59,0xff,0xb6,0x01,0x65,0x00,0x5a,0xff,0xcb,0x01,0x65,0x00,0x5c,0xff,0xa4,0x01,0x65,0x00,0x64,0xff,0x9a,0x01,0x65,0x00,0x67,0xff,0xa6,0x01,0x65,0x00,0x6f,0xff,0xe5,0x01,0x65,0x00,0x70,0xff,0xe5,0x01,0x65,0x00,0x71,0xff,0xe5,0x01,0x65,0x00,0x72,0xff,0xe5, +0x01,0x65,0x00,0x73,0xff,0xe5,0x01,0x65,0x00,0x74,0xff,0xcf,0x01,0x65,0x00,0x77,0x00,0x27,0x01,0x65,0x00,0x79,0xff,0xe5,0x01,0x65,0x00,0x7a,0xff,0xe5,0x01,0x65,0x00,0x7b,0xff,0xe5,0x01,0x65,0x00,0x7c,0xff,0xe5,0x01,0x65,0x00,0x7d,0xff,0xe5,0x01,0x65,0x00,0x92,0xff,0xa6,0x01,0x65,0x00,0xaf,0xff,0xa6,0x01,0x65,0x00,0xb0, +0xff,0xa6,0x01,0x65,0x00,0xb1,0xff,0xe5,0x01,0x65,0x00,0xba,0xff,0xa4,0x01,0x65,0x00,0xc4,0x00,0x44,0x01,0x65,0x00,0xc5,0x00,0x44,0x01,0x65,0x00,0xd0,0xff,0xa6,0x01,0x65,0x00,0xd1,0xff,0xa6,0x01,0x65,0x00,0xd2,0xff,0xa6,0x01,0x65,0x00,0xe5,0x00,0x27,0x01,0x65,0x00,0xeb,0xff,0xa4,0x01,0x65,0x00,0xf7,0xff,0xa6,0x01,0x65, +0x00,0xf8,0xff,0xe5,0x01,0x65,0x00,0xfc,0xff,0xa6,0x01,0x65,0x00,0xfd,0xff,0xe5,0x01,0x65,0x00,0xfe,0xff,0xa6,0x01,0x65,0x00,0xff,0xff,0xe5,0x01,0x65,0x01,0x00,0xff,0xe5,0x01,0x65,0x01,0x08,0xff,0xe5,0x01,0x65,0x01,0x0b,0xff,0xe5,0x01,0x65,0x01,0x0d,0xff,0xe5,0x01,0x65,0x01,0x18,0xff,0xa6,0x01,0x65,0x01,0x19,0xff,0xe5, +0x01,0x65,0x01,0x21,0xff,0xd1,0x01,0x65,0x01,0x23,0xff,0xd1,0x01,0x65,0x01,0x28,0x00,0x27,0x01,0x65,0x01,0x2a,0x00,0x27,0x01,0x65,0x01,0x47,0xff,0xa6,0x01,0x65,0x01,0x48,0xff,0xe5,0x01,0x65,0x01,0x4c,0xff,0xe5,0x01,0x65,0x01,0x4e,0xff,0xe5,0x01,0x65,0x01,0x50,0xff,0xe5,0x01,0x65,0x01,0x51,0xff,0xa6,0x01,0x65,0x01,0x52, +0xff,0xe5,0x01,0x65,0x01,0x53,0xff,0xa6,0x01,0x65,0x01,0x54,0xff,0xe5,0x01,0x65,0x01,0x55,0xff,0xa6,0x01,0x65,0x01,0x56,0xff,0xe5,0x01,0x65,0x01,0x5c,0x00,0x27,0x01,0x65,0x01,0x5e,0x00,0x27,0x01,0x65,0x01,0x60,0x00,0x27,0x01,0x65,0x01,0x63,0x00,0x5a,0x01,0x65,0x01,0x6e,0xff,0xa6,0x01,0x65,0x01,0x6f,0xff,0xe5,0x01,0x65, +0x01,0x70,0xff,0xa6,0x01,0x65,0x01,0x71,0xff,0xe5,0x01,0x65,0x01,0x77,0xff,0xd1,0x01,0x65,0x01,0x81,0xff,0xcb,0x01,0x65,0x01,0x83,0xff,0xa4,0x01,0x65,0x01,0x89,0xff,0xa6,0x01,0x65,0x01,0x8a,0xff,0xe5,0x01,0x65,0x01,0x8d,0xff,0xcb,0x01,0x65,0x01,0x8f,0xff,0xcb,0x01,0x65,0x01,0x91,0xff,0xcb,0x01,0x65,0x01,0x93,0xff,0xa4, +0x01,0x66,0x00,0x0f,0x00,0x52,0x01,0x66,0x00,0x10,0xff,0x75,0x01,0x66,0x00,0x11,0x00,0x52,0x01,0x66,0x00,0x1d,0x00,0x52,0x01,0x66,0x00,0x1e,0x00,0x52,0x01,0x66,0x00,0x46,0xff,0xd7,0x01,0x66,0x00,0x47,0xff,0xe5,0x01,0x66,0x00,0x48,0xff,0xd7,0x01,0x66,0x00,0x4a,0xff,0xd7,0x01,0x66,0x00,0x52,0xff,0xd7,0x01,0x66,0x00,0x54, +0xff,0xe5,0x01,0x66,0x00,0x57,0xff,0xf0,0x01,0x66,0x00,0x6f,0xff,0xe5,0x01,0x66,0x00,0x70,0xff,0xd7,0x01,0x66,0x00,0x71,0xff,0xd7,0x01,0x66,0x00,0x72,0xff,0xd7,0x01,0x66,0x00,0x73,0xff,0xd7,0x01,0x66,0x00,0x79,0xff,0xd7,0x01,0x66,0x00,0x7a,0xff,0xd7,0x01,0x66,0x00,0x7b,0xff,0xd7,0x01,0x66,0x00,0x7c,0xff,0xd7,0x01,0x66, +0x00,0x7d,0xff,0xd7,0x01,0x66,0x00,0xac,0x00,0x52,0x01,0x66,0x00,0xb1,0xff,0xd7,0x01,0x66,0x00,0xf8,0xff,0xd7,0x01,0x66,0x00,0xfd,0xff,0xd7,0x01,0x66,0x00,0xff,0xff,0xd7,0x01,0x66,0x01,0x00,0xff,0xe5,0x01,0x66,0x01,0x08,0xff,0xe5,0x01,0x66,0x01,0x0b,0xff,0xd7,0x01,0x66,0x01,0x0d,0xff,0xd7,0x01,0x66,0x01,0x19,0xff,0xd7, +0x01,0x66,0x01,0x21,0xff,0xf0,0x01,0x66,0x01,0x23,0xff,0xf0,0x01,0x66,0x01,0x48,0xff,0xd7,0x01,0x66,0x01,0x4c,0xff,0xd7,0x01,0x66,0x01,0x4e,0xff,0xd7,0x01,0x66,0x01,0x50,0xff,0xd7,0x01,0x66,0x01,0x52,0xff,0xd7,0x01,0x66,0x01,0x54,0xff,0xd7,0x01,0x66,0x01,0x56,0xff,0xd7,0x01,0x66,0x01,0x6f,0xff,0xd7,0x01,0x66,0x01,0x71, +0xff,0xd7,0x01,0x66,0x01,0x77,0xff,0xf0,0x01,0x66,0x01,0x8a,0xff,0xd7,0x01,0x67,0x00,0x0f,0x00,0x52,0x01,0x67,0x00,0x10,0xff,0x75,0x01,0x67,0x00,0x11,0x00,0x52,0x01,0x67,0x00,0x1d,0x00,0x52,0x01,0x67,0x00,0x1e,0x00,0x52,0x01,0x67,0x00,0x46,0xff,0xd7,0x01,0x67,0x00,0x47,0xff,0xe5,0x01,0x67,0x00,0x48,0xff,0xd7,0x01,0x67, +0x00,0x4a,0xff,0xd7,0x01,0x67,0x00,0x52,0xff,0xd7,0x01,0x67,0x00,0x54,0xff,0xe5,0x01,0x67,0x00,0x57,0xff,0xf0,0x01,0x67,0x00,0x6f,0xff,0xe5,0x01,0x67,0x00,0x70,0xff,0xd7,0x01,0x67,0x00,0x71,0xff,0xd7,0x01,0x67,0x00,0x72,0xff,0xd7,0x01,0x67,0x00,0x73,0xff,0xd7,0x01,0x67,0x00,0x79,0xff,0xd7,0x01,0x67,0x00,0x7a,0xff,0xd7, +0x01,0x67,0x00,0x7b,0xff,0xd7,0x01,0x67,0x00,0x7c,0xff,0xd7,0x01,0x67,0x00,0x7d,0xff,0xd7,0x01,0x67,0x00,0xac,0x00,0x52,0x01,0x67,0x00,0xb1,0xff,0xd7,0x01,0x67,0x00,0xf8,0xff,0xd7,0x01,0x67,0x00,0xfd,0xff,0xd7,0x01,0x67,0x00,0xff,0xff,0xd7,0x01,0x67,0x01,0x00,0xff,0xe5,0x01,0x67,0x01,0x08,0xff,0xe5,0x01,0x67,0x01,0x0b, +0xff,0xd7,0x01,0x67,0x01,0x0d,0xff,0xd7,0x01,0x67,0x01,0x19,0xff,0xd7,0x01,0x67,0x01,0x21,0xff,0xf0,0x01,0x67,0x01,0x23,0xff,0xf0,0x01,0x67,0x01,0x48,0xff,0xd7,0x01,0x67,0x01,0x4c,0xff,0xd7,0x01,0x67,0x01,0x4e,0xff,0xd7,0x01,0x67,0x01,0x50,0xff,0xd7,0x01,0x67,0x01,0x52,0xff,0xd7,0x01,0x67,0x01,0x54,0xff,0xd7,0x01,0x67, +0x01,0x56,0xff,0xd7,0x01,0x67,0x01,0x6f,0xff,0xd7,0x01,0x67,0x01,0x71,0xff,0xd7,0x01,0x67,0x01,0x77,0xff,0xf0,0x01,0x67,0x01,0x8a,0xff,0xd7,0x01,0x68,0x00,0x0d,0xff,0x31,0x01,0x68,0x00,0x22,0xff,0x9a,0x01,0x68,0x00,0x24,0x00,0x3b,0x01,0x68,0x00,0x26,0xff,0xbe,0x01,0x68,0x00,0x2a,0xff,0xbe,0x01,0x68,0x00,0x2d,0x00,0x64, +0x01,0x68,0x00,0x32,0xff,0xba,0x01,0x68,0x00,0x34,0xff,0xba,0x01,0x68,0x00,0x37,0xff,0x8f,0x01,0x68,0x00,0x38,0xff,0xe3,0x01,0x68,0x00,0x39,0xff,0x8b,0x01,0x68,0x00,0x3a,0xff,0xcf,0x01,0x68,0x00,0x3c,0xff,0x7f,0x01,0x68,0x00,0x3d,0x00,0x3b,0x01,0x68,0x00,0x57,0xff,0xe5,0x01,0x68,0x00,0x59,0xff,0x9a,0x01,0x68,0x00,0x5a, +0xff,0xbe,0x01,0x68,0x00,0x5c,0xff,0xb4,0x01,0x68,0x00,0x64,0xff,0xbe,0x01,0x68,0x00,0x67,0xff,0xba,0x01,0x68,0x00,0x68,0xff,0xe3,0x01,0x68,0x00,0x8d,0xff,0x9a,0x01,0x68,0x00,0x92,0xff,0xba,0x01,0x68,0x00,0xaf,0xff,0xba,0x01,0x68,0x00,0xb0,0xff,0xba,0x01,0x68,0x00,0xb4,0xff,0x73,0x01,0x68,0x00,0xb5,0xff,0x8b,0x01,0x68, +0x00,0xb6,0xff,0x73,0x01,0x68,0x00,0xb7,0xff,0x7f,0x01,0x68,0x00,0xba,0xff,0xb4,0x01,0x68,0x00,0xbb,0xff,0x9a,0x01,0x68,0x00,0xc4,0x00,0x44,0x01,0x68,0x00,0xc5,0x00,0x44,0x01,0x68,0x00,0xd0,0xff,0xba,0x01,0x68,0x00,0xd1,0xff,0xba,0x01,0x68,0x00,0xd2,0xff,0xba,0x01,0x68,0x00,0xd3,0xff,0xe3,0x01,0x68,0x00,0xd4,0xff,0xe3, +0x01,0x68,0x00,0xd5,0xff,0xe3,0x01,0x68,0x00,0xe5,0x00,0x3b,0x01,0x68,0x00,0xea,0xff,0x7f,0x01,0x68,0x00,0xeb,0xff,0xb4,0x01,0x68,0x00,0xf7,0xff,0xbe,0x01,0x68,0x00,0xfc,0xff,0xbe,0x01,0x68,0x00,0xfe,0xff,0xbe,0x01,0x68,0x01,0x03,0x00,0x3b,0x01,0x68,0x01,0x05,0x00,0x3b,0x01,0x68,0x01,0x18,0xff,0xba,0x01,0x68,0x01,0x20, +0xff,0x8f,0x01,0x68,0x01,0x21,0xff,0xe5,0x01,0x68,0x01,0x22,0xff,0x8f,0x01,0x68,0x01,0x23,0xff,0xe5,0x01,0x68,0x01,0x24,0xff,0xe3,0x01,0x68,0x01,0x26,0xff,0xe3,0x01,0x68,0x01,0x28,0x00,0x3b,0x01,0x68,0x01,0x2a,0x00,0x3b,0x01,0x68,0x01,0x45,0x00,0x3b,0x01,0x68,0x01,0x47,0xff,0xbe,0x01,0x68,0x01,0x51,0xff,0xbe,0x01,0x68, +0x01,0x53,0xff,0xbe,0x01,0x68,0x01,0x55,0xff,0xbe,0x01,0x68,0x01,0x63,0x00,0x64,0x01,0x68,0x01,0x6e,0xff,0xba,0x01,0x68,0x01,0x70,0xff,0xba,0x01,0x68,0x01,0x76,0xff,0x8f,0x01,0x68,0x01,0x77,0xff,0xe5,0x01,0x68,0x01,0x78,0xff,0xe3,0x01,0x68,0x01,0x7a,0xff,0xe3,0x01,0x68,0x01,0x7c,0xff,0xe3,0x01,0x68,0x01,0x7e,0xff,0xe3, +0x01,0x68,0x01,0x80,0xff,0xcf,0x01,0x68,0x01,0x81,0xff,0xbe,0x01,0x68,0x01,0x82,0xff,0x7f,0x01,0x68,0x01,0x83,0xff,0xb4,0x01,0x68,0x01,0x85,0x00,0x3b,0x01,0x68,0x01,0x87,0x00,0x3b,0x01,0x68,0x01,0x89,0xff,0xba,0x01,0x68,0x01,0x8c,0xff,0xcf,0x01,0x68,0x01,0x8d,0xff,0xbe,0x01,0x68,0x01,0x8e,0xff,0xcf,0x01,0x68,0x01,0x8f, +0xff,0xbe,0x01,0x68,0x01,0x90,0xff,0xcf,0x01,0x68,0x01,0x91,0xff,0xbe,0x01,0x68,0x01,0x92,0xff,0x7f,0x01,0x68,0x01,0x93,0xff,0xb4,0x01,0x6c,0x00,0x0f,0xff,0x9a,0x01,0x6c,0x00,0x11,0xff,0x9a,0x01,0x6c,0x00,0x24,0xff,0xdb,0x01,0x6c,0x00,0x2d,0xff,0xbe,0x01,0x6c,0x00,0x44,0xff,0xe5,0x01,0x6c,0x00,0x62,0xff,0xdb,0x01,0x6c, +0x00,0x63,0xff,0xdb,0x01,0x6c,0x00,0x69,0xff,0xe5,0x01,0x6c,0x00,0x6a,0xff,0xe5,0x01,0x6c,0x00,0x6b,0xff,0xe5,0x01,0x6c,0x00,0x6c,0xff,0xe5,0x01,0x6c,0x00,0x6d,0xff,0xe5,0x01,0x6c,0x00,0x6e,0xff,0xe5,0x01,0x6c,0x00,0x91,0xff,0x98,0x01,0x6c,0x00,0xa0,0xff,0xe5,0x01,0x6c,0x00,0xac,0xff,0x9a,0x01,0x6c,0x00,0xad,0xff,0xdb, +0x01,0x6c,0x00,0xae,0xff,0xdb,0x01,0x6c,0x00,0xc4,0xff,0x66,0x01,0x6c,0x00,0xc5,0xff,0x9a,0x01,0x6c,0x00,0xc7,0xff,0xdb,0x01,0x6c,0x00,0xc9,0xff,0xdb,0x01,0x6c,0x01,0x03,0xff,0xdb,0x01,0x6c,0x01,0x04,0xff,0xe5,0x01,0x6c,0x01,0x05,0xff,0xdb,0x01,0x6c,0x01,0x06,0xff,0xe5,0x01,0x6c,0x01,0x45,0xff,0xdb,0x01,0x6c,0x01,0x46, +0xff,0xe5,0x01,0x6c,0x01,0x63,0xff,0xbe,0x01,0x6c,0x01,0x85,0xff,0xdb,0x01,0x6c,0x01,0x86,0xff,0xe5,0x01,0x6c,0x01,0x87,0xff,0xdb,0x01,0x6c,0x01,0x88,0xff,0xe5,0x01,0x6d,0x00,0x4d,0x00,0x23,0x01,0x6d,0x01,0x64,0x00,0x23,0x01,0x6e,0x00,0x0f,0xff,0xa4,0x01,0x6e,0x00,0x11,0xff,0xa4,0x01,0x6e,0x00,0x24,0xff,0xe5,0x01,0x6e, +0x00,0x2d,0xff,0xf6,0x01,0x6e,0x00,0x37,0xff,0xa4,0x01,0x6e,0x00,0x3b,0xff,0xdb,0x01,0x6e,0x00,0x3c,0xff,0xe7,0x01,0x6e,0x00,0x3d,0xff,0xcf,0x01,0x6e,0x00,0x62,0xff,0xe5,0x01,0x6e,0x00,0x63,0xff,0xe5,0x01,0x6e,0x00,0xac,0xff,0xa4,0x01,0x6e,0x00,0xad,0xff,0xe5,0x01,0x6e,0x00,0xae,0xff,0xe5,0x01,0x6e,0x00,0xbb,0xff,0xf6, +0x01,0x6e,0x00,0xc4,0xff,0x4c,0x01,0x6e,0x00,0xc5,0xff,0x98,0x01,0x6e,0x00,0xc7,0xff,0xe5,0x01,0x6e,0x00,0xc9,0xff,0xe5,0x01,0x6e,0x00,0xe5,0xff,0xcf,0x01,0x6e,0x00,0xea,0xff,0xe7,0x01,0x6e,0x01,0x03,0xff,0xe5,0x01,0x6e,0x01,0x05,0xff,0xe5,0x01,0x6e,0x01,0x20,0xff,0xa4,0x01,0x6e,0x01,0x22,0xff,0xa4,0x01,0x6e,0x01,0x28, +0xff,0xcf,0x01,0x6e,0x01,0x2a,0xff,0xcf,0x01,0x6e,0x01,0x45,0xff,0xe5,0x01,0x6e,0x01,0x63,0xff,0xf6,0x01,0x6e,0x01,0x76,0xff,0xa4,0x01,0x6e,0x01,0x82,0xff,0xe7,0x01,0x6e,0x01,0x85,0xff,0xe5,0x01,0x6e,0x01,0x87,0xff,0xe5,0x01,0x6e,0x01,0x92,0xff,0xe7,0x01,0x6f,0x00,0x05,0xff,0x6f,0x01,0x6f,0x00,0x0a,0xff,0x6f,0x01,0x6f, +0x00,0x44,0xff,0xe5,0x01,0x6f,0x00,0x49,0xff,0xdb,0x01,0x6f,0x00,0x5b,0xff,0xe7,0x01,0x6f,0x00,0x69,0xff,0xe5,0x01,0x6f,0x00,0x6a,0xff,0xe5,0x01,0x6f,0x00,0x6b,0xff,0xe5,0x01,0x6f,0x00,0x6c,0xff,0xe5,0x01,0x6f,0x00,0x6d,0xff,0xe5,0x01,0x6f,0x00,0x6e,0xff,0xe5,0x01,0x6f,0x00,0xa0,0xff,0xe5,0x01,0x6f,0x00,0xb4,0xff,0xb2, +0x01,0x6f,0x00,0xb5,0xff,0x7d,0x01,0x6f,0x00,0xb6,0xff,0xbe,0x01,0x6f,0x00,0xb7,0xff,0x7d,0x01,0x6f,0x00,0xc0,0xff,0xe7,0x01,0x6f,0x00,0xc1,0xff,0xe7,0x01,0x6f,0x01,0x04,0xff,0xe5,0x01,0x6f,0x01,0x06,0xff,0xe5,0x01,0x6f,0x01,0x46,0xff,0xe5,0x01,0x6f,0x01,0x86,0xff,0xe5,0x01,0x6f,0x01,0x88,0xff,0xe5,0x01,0x70,0x00,0x0f, +0xff,0xa4,0x01,0x70,0x00,0x11,0xff,0xa4,0x01,0x70,0x00,0x24,0xff,0xe5,0x01,0x70,0x00,0x2d,0xff,0xf6,0x01,0x70,0x00,0x37,0xff,0xa4,0x01,0x70,0x00,0x3b,0xff,0xdb,0x01,0x70,0x00,0x3c,0xff,0xe7,0x01,0x70,0x00,0x3d,0xff,0xcf,0x01,0x70,0x00,0x62,0xff,0xe5,0x01,0x70,0x00,0x63,0xff,0xe5,0x01,0x70,0x00,0xac,0xff,0xa4,0x01,0x70, +0x00,0xad,0xff,0xe5,0x01,0x70,0x00,0xae,0xff,0xe5,0x01,0x70,0x00,0xbb,0xff,0xf6,0x01,0x70,0x00,0xc4,0xff,0x4c,0x01,0x70,0x00,0xc5,0xff,0x98,0x01,0x70,0x00,0xc7,0xff,0xe5,0x01,0x70,0x00,0xc9,0xff,0xe5,0x01,0x70,0x00,0xe5,0xff,0xcf,0x01,0x70,0x00,0xea,0xff,0xe7,0x01,0x70,0x01,0x03,0xff,0xe5,0x01,0x70,0x01,0x05,0xff,0xe5, +0x01,0x70,0x01,0x20,0xff,0xa4,0x01,0x70,0x01,0x22,0xff,0xa4,0x01,0x70,0x01,0x28,0xff,0xcf,0x01,0x70,0x01,0x2a,0xff,0xcf,0x01,0x70,0x01,0x45,0xff,0xe5,0x01,0x70,0x01,0x63,0xff,0xf6,0x01,0x70,0x01,0x76,0xff,0xa4,0x01,0x70,0x01,0x82,0xff,0xe7,0x01,0x70,0x01,0x85,0xff,0xe5,0x01,0x70,0x01,0x87,0xff,0xe5,0x01,0x70,0x01,0x92, +0xff,0xe7,0x01,0x71,0x00,0x05,0xff,0x6f,0x01,0x71,0x00,0x0a,0xff,0x6f,0x01,0x71,0x00,0x44,0xff,0xe5,0x01,0x71,0x00,0x49,0xff,0xdb,0x01,0x71,0x00,0x5b,0xff,0xe7,0x01,0x71,0x00,0x69,0xff,0xe5,0x01,0x71,0x00,0x6a,0xff,0xe5,0x01,0x71,0x00,0x6b,0xff,0xe5,0x01,0x71,0x00,0x6c,0xff,0xe5,0x01,0x71,0x00,0x6d,0xff,0xe5,0x01,0x71, +0x00,0x6e,0xff,0xe5,0x01,0x71,0x00,0xa0,0xff,0xe5,0x01,0x71,0x00,0xb4,0xff,0xb2,0x01,0x71,0x00,0xb5,0xff,0x7d,0x01,0x71,0x00,0xb6,0xff,0xbe,0x01,0x71,0x00,0xb7,0xff,0x7d,0x01,0x71,0x00,0xc0,0xff,0xe7,0x01,0x71,0x00,0xc1,0xff,0xe7,0x01,0x71,0x01,0x04,0xff,0xe5,0x01,0x71,0x01,0x06,0xff,0xe5,0x01,0x71,0x01,0x46,0xff,0xe5, +0x01,0x71,0x01,0x86,0xff,0xe5,0x01,0x71,0x01,0x88,0xff,0xe5,0x01,0x72,0x00,0x1e,0x00,0x52,0x01,0x72,0x00,0x26,0xff,0xe3,0x01,0x72,0x00,0x2a,0xff,0xe3,0x01,0x72,0x00,0x2d,0x00,0x39,0x01,0x72,0x00,0x32,0xff,0xec,0x01,0x72,0x00,0x34,0xff,0xec,0x01,0x72,0x00,0x37,0xff,0xcb,0x01,0x72,0x00,0x3c,0xff,0xd9,0x01,0x72,0x00,0x46, +0xff,0xcb,0x01,0x72,0x00,0x47,0xff,0xcb,0x01,0x72,0x00,0x48,0xff,0xc7,0x01,0x72,0x00,0x4a,0xff,0xc7,0x01,0x72,0x00,0x52,0xff,0xc5,0x01,0x72,0x00,0x54,0xff,0xcb,0x01,0x72,0x00,0x64,0xff,0xe5,0x01,0x72,0x00,0x67,0xff,0xec,0x01,0x72,0x00,0x6f,0xff,0xbe,0x01,0x72,0x00,0x70,0xff,0xbe,0x01,0x72,0x00,0x71,0xff,0xbe,0x01,0x72, +0x00,0x72,0xff,0xbe,0x01,0x72,0x00,0x73,0xff,0xbe,0x01,0x72,0x00,0x79,0xff,0xc5,0x01,0x72,0x00,0x7a,0xff,0xc5,0x01,0x72,0x00,0x7b,0xff,0xc5,0x01,0x72,0x00,0x7c,0xff,0xc5,0x01,0x72,0x00,0x7d,0xff,0xc5,0x01,0x72,0x00,0x92,0xff,0xec,0x01,0x72,0x00,0xaf,0xff,0xec,0x01,0x72,0x00,0xb0,0xff,0xec,0x01,0x72,0x00,0xb1,0xff,0xc5, +0x01,0x72,0x00,0xbb,0xff,0xe5,0x01,0x72,0x00,0xd0,0xff,0xec,0x01,0x72,0x00,0xd1,0xff,0xec,0x01,0x72,0x00,0xd2,0xff,0xec,0x01,0x72,0x00,0xea,0xff,0xd9,0x01,0x72,0x00,0xf7,0xff,0xe3,0x01,0x72,0x00,0xf8,0xff,0xc7,0x01,0x72,0x00,0xfc,0xff,0xe3,0x01,0x72,0x00,0xfd,0xff,0xcb,0x01,0x72,0x00,0xfe,0xff,0xe3,0x01,0x72,0x00,0xff, +0xff,0xcb,0x01,0x72,0x01,0x00,0xff,0xcb,0x01,0x72,0x01,0x08,0xff,0xcb,0x01,0x72,0x01,0x0b,0xff,0xc7,0x01,0x72,0x01,0x0d,0xff,0xbe,0x01,0x72,0x01,0x18,0xff,0xec,0x01,0x72,0x01,0x19,0xff,0xc5,0x01,0x72,0x01,0x20,0xff,0xcb,0x01,0x72,0x01,0x22,0xff,0xcb,0x01,0x72,0x01,0x47,0xff,0xe3,0x01,0x72,0x01,0x48,0xff,0xcb,0x01,0x72, +0x01,0x4c,0xff,0xbe,0x01,0x72,0x01,0x4e,0xff,0xbe,0x01,0x72,0x01,0x50,0xff,0xbe,0x01,0x72,0x01,0x51,0xff,0xe3,0x01,0x72,0x01,0x52,0xff,0xc7,0x01,0x72,0x01,0x53,0xff,0xe3,0x01,0x72,0x01,0x54,0xff,0xc7,0x01,0x72,0x01,0x55,0xff,0xe3,0x01,0x72,0x01,0x56,0xff,0xc7,0x01,0x72,0x01,0x63,0x00,0x39,0x01,0x72,0x01,0x6e,0xff,0xec, +0x01,0x72,0x01,0x6f,0xff,0xc5,0x01,0x72,0x01,0x70,0xff,0xec,0x01,0x72,0x01,0x71,0xff,0xc5,0x01,0x72,0x01,0x76,0xff,0xcb,0x01,0x72,0x01,0x82,0xff,0xd9,0x01,0x72,0x01,0x89,0xff,0xec,0x01,0x72,0x01,0x8a,0xff,0xc5,0x01,0x72,0x01,0x92,0xff,0xd9,0x01,0x73,0x00,0x0f,0xff,0x62,0x01,0x73,0x00,0x10,0xff,0x7f,0x01,0x73,0x00,0x11, +0xff,0x56,0x01,0x73,0x00,0x1d,0x00,0x52,0x01,0x73,0x00,0x1e,0x00,0x52,0x01,0x73,0x00,0x46,0xff,0xe5,0x01,0x73,0x00,0x47,0xff,0xe5,0x01,0x73,0x00,0x48,0xff,0xe5,0x01,0x73,0x00,0x49,0x00,0x27,0x01,0x73,0x00,0x4a,0xff,0xe5,0x01,0x73,0x00,0x50,0xff,0xfc,0x01,0x73,0x00,0x51,0xff,0xfc,0x01,0x73,0x00,0x52,0xff,0xe5,0x01,0x73, +0x00,0x54,0xff,0xe5,0x01,0x73,0x00,0x56,0x00,0x0e,0x01,0x73,0x00,0x57,0x00,0x3b,0x01,0x73,0x00,0x59,0x00,0x52,0x01,0x73,0x00,0x5a,0x00,0x52,0x01,0x73,0x00,0x5b,0x00,0x3b,0x01,0x73,0x00,0x5c,0x00,0x52,0x01,0x73,0x00,0x5d,0x00,0x27,0x01,0x73,0x00,0x6f,0xff,0xe5,0x01,0x73,0x00,0x70,0xff,0xe5,0x01,0x73,0x00,0x71,0xff,0xe5, +0x01,0x73,0x00,0x72,0xff,0xe5,0x01,0x73,0x00,0x73,0xff,0xe5,0x01,0x73,0x00,0x79,0xff,0xe5,0x01,0x73,0x00,0x7a,0xff,0xe5,0x01,0x73,0x00,0x7b,0xff,0xe5,0x01,0x73,0x00,0x7c,0xff,0xe5,0x01,0x73,0x00,0x7d,0xff,0xe5,0x01,0x73,0x00,0xac,0xff,0x56,0x01,0x73,0x00,0xb1,0xff,0xe5,0x01,0x73,0x00,0xb4,0x00,0xa4,0x01,0x73,0x00,0xb5, +0x00,0x79,0x01,0x73,0x00,0xb6,0x00,0xa4,0x01,0x73,0x00,0xb7,0x00,0x79,0x01,0x73,0x00,0xc4,0xff,0x62,0x01,0x73,0x00,0xc5,0xff,0x62,0x01,0x73,0x00,0xe4,0x00,0x0e,0x01,0x73,0x00,0xe6,0x00,0x27,0x01,0x73,0x00,0xeb,0x00,0x52,0x01,0x73,0x00,0xf8,0xff,0xe5,0x01,0x73,0x00,0xfb,0x00,0x0e,0x01,0x73,0x00,0xfd,0xff,0xe5,0x01,0x73, +0x00,0xff,0xff,0xe5,0x01,0x73,0x01,0x00,0xff,0xe5,0x01,0x73,0x01,0x08,0xff,0xe5,0x01,0x73,0x01,0x0b,0xff,0xe5,0x01,0x73,0x01,0x0d,0xff,0xe5,0x01,0x73,0x01,0x19,0xff,0xe5,0x01,0x73,0x01,0x1f,0x00,0x0e,0x01,0x73,0x01,0x21,0x00,0x3b,0x01,0x73,0x01,0x23,0x00,0x3b,0x01,0x73,0x01,0x29,0x00,0x27,0x01,0x73,0x01,0x2b,0x00,0x27, +0x01,0x73,0x01,0x48,0xff,0xe5,0x01,0x73,0x01,0x4c,0xff,0xe5,0x01,0x73,0x01,0x4e,0xff,0xe5,0x01,0x73,0x01,0x50,0xff,0xe5,0x01,0x73,0x01,0x52,0xff,0xe5,0x01,0x73,0x01,0x54,0xff,0xe5,0x01,0x73,0x01,0x56,0xff,0xe5,0x01,0x73,0x01,0x6d,0xff,0xfc,0x01,0x73,0x01,0x6f,0xff,0xe5,0x01,0x73,0x01,0x71,0xff,0xe5,0x01,0x73,0x01,0x75, +0x00,0x0e,0x01,0x73,0x01,0x77,0x00,0x3b,0x01,0x73,0x01,0x81,0x00,0x52,0x01,0x73,0x01,0x83,0x00,0x52,0x01,0x73,0x01,0x8a,0xff,0xe5,0x01,0x73,0x01,0x8d,0x00,0x52,0x01,0x73,0x01,0x8f,0x00,0x52,0x01,0x73,0x01,0x91,0x00,0x52,0x01,0x73,0x01,0x93,0x00,0x52,0x01,0x73,0x02,0x3e,0x00,0x0e,0x01,0x74,0x00,0x57,0xff,0xbe,0x01,0x74, +0x00,0x59,0xff,0xcf,0x01,0x74,0x00,0x5a,0xff,0xe5,0x01,0x74,0x00,0x5c,0xff,0xd1,0x01,0x74,0x00,0xba,0xff,0xbe,0x01,0x74,0x00,0xc4,0xff,0xb2,0x01,0x74,0x00,0xc5,0xff,0xb2,0x01,0x74,0x00,0xeb,0xff,0xd1,0x01,0x74,0x01,0x21,0xff,0xbe,0x01,0x74,0x01,0x23,0xff,0xbe,0x01,0x74,0x01,0x77,0xff,0xbe,0x01,0x74,0x01,0x81,0xff,0xe5, +0x01,0x74,0x01,0x83,0xff,0xd1,0x01,0x74,0x01,0x8d,0xff,0xe5,0x01,0x74,0x01,0x8f,0xff,0xe5,0x01,0x74,0x01,0x91,0xff,0xe5,0x01,0x74,0x01,0x93,0xff,0xd1,0x01,0x76,0x00,0x0f,0xff,0x7f,0x01,0x76,0x00,0x11,0xff,0x4c,0x01,0x76,0x00,0x1d,0xff,0xe9,0x01,0x76,0x00,0x1e,0xff,0xe9,0x01,0x76,0x00,0x24,0xff,0x66,0x01,0x76,0x00,0x26, +0xff,0xa4,0x01,0x76,0x00,0x2a,0xff,0xa4,0x01,0x76,0x00,0x2d,0xff,0x8f,0x01,0x76,0x00,0x32,0xff,0xa4,0x01,0x76,0x00,0x34,0xff,0xa4,0x01,0x76,0x00,0x37,0x00,0x27,0x01,0x76,0x00,0x39,0x00,0x2b,0x01,0x76,0x00,0x3a,0x00,0x27,0x01,0x76,0x00,0x3b,0xff,0xfa,0x01,0x76,0x00,0x3c,0x00,0x1d,0x01,0x76,0x00,0x44,0xff,0x27,0x01,0x76, +0x00,0x46,0xff,0x2d,0x01,0x76,0x00,0x47,0xff,0x2d,0x01,0x76,0x00,0x48,0xff,0x2d,0x01,0x76,0x00,0x49,0xff,0xa0,0x01,0x76,0x00,0x4a,0xff,0x2d,0x01,0x76,0x00,0x50,0xff,0x4e,0x01,0x76,0x00,0x51,0xff,0x4e,0x01,0x76,0x00,0x52,0xff,0x2d,0x01,0x76,0x00,0x53,0xff,0x4e,0x01,0x76,0x00,0x54,0xff,0x2d,0x01,0x76,0x00,0x55,0xff,0x4e, +0x01,0x76,0x00,0x56,0xff,0x66,0x01,0x76,0x00,0x58,0xff,0x4e,0x01,0x76,0x00,0x59,0xff,0x9a,0x01,0x76,0x00,0x5a,0xff,0x8f,0x01,0x76,0x00,0x5b,0xff,0x4c,0x01,0x76,0x00,0x5c,0xff,0x8f,0x01,0x76,0x00,0x5d,0xff,0x7f,0x01,0x76,0x00,0x62,0xff,0x66,0x01,0x76,0x00,0x63,0xff,0x66,0x01,0x76,0x00,0x64,0xff,0xa4,0x01,0x76,0x00,0x67, +0xff,0xa4,0x01,0x76,0x00,0x69,0xff,0x27,0x01,0x76,0x00,0x6a,0xff,0x27,0x01,0x76,0x00,0x6b,0xff,0x27,0x01,0x76,0x00,0x6c,0xff,0x27,0x01,0x76,0x00,0x6d,0xff,0x3f,0x01,0x76,0x00,0x6e,0xff,0x27,0x01,0x76,0x00,0x6f,0xff,0x1b,0x01,0x76,0x00,0x70,0xff,0x2d,0x01,0x76,0x00,0x71,0xff,0x2d,0x01,0x76,0x00,0x72,0xff,0x2d,0x01,0x76, +0x00,0x73,0xff,0x2d,0x01,0x76,0x00,0x74,0xff,0xe9,0x01,0x76,0x00,0x76,0x00,0x31,0x01,0x76,0x00,0x77,0x00,0x6f,0x01,0x76,0x00,0x78,0xff,0x4e,0x01,0x76,0x00,0x79,0xff,0x2d,0x01,0x76,0x00,0x7a,0xff,0x2d,0x01,0x76,0x00,0x7b,0xff,0x2d,0x01,0x76,0x00,0x7c,0xff,0x2d,0x01,0x76,0x00,0x7d,0xff,0x2d,0x01,0x76,0x00,0x7e,0xff,0x4e, +0x01,0x76,0x00,0x7f,0xff,0x4e,0x01,0x76,0x00,0x80,0xff,0x4e,0x01,0x76,0x00,0x81,0xff,0x4e,0x01,0x76,0x00,0x8d,0x00,0x52,0x01,0x76,0x00,0x91,0xff,0x0c,0x01,0x76,0x00,0x92,0xff,0xa4,0x01,0x76,0x00,0xa0,0xff,0x27,0x01,0x76,0x00,0xaa,0xff,0x9a,0x01,0x76,0x00,0xab,0xff,0xcf,0x01,0x76,0x00,0xac,0xff,0x4c,0x01,0x76,0x00,0xad, +0xff,0x66,0x01,0x76,0x00,0xae,0xff,0x66,0x01,0x76,0x00,0xaf,0xff,0xa4,0x01,0x76,0x00,0xb0,0xff,0xa4,0x01,0x76,0x00,0xb1,0xff,0x2d,0x01,0x76,0x00,0xb5,0x00,0x27,0x01,0x76,0x00,0xb7,0x00,0x27,0x01,0x76,0x00,0xba,0xff,0x8f,0x01,0x76,0x00,0xbe,0xff,0x9a,0x01,0x76,0x00,0xbf,0xff,0xcf,0x01,0x76,0x00,0xc4,0xff,0x17,0x01,0x76, +0x00,0xc5,0xff,0x17,0x01,0x76,0x00,0xc7,0xff,0x66,0x01,0x76,0x00,0xc9,0xff,0x66,0x01,0x76,0x00,0xd0,0xff,0xa4,0x01,0x76,0x00,0xd1,0xff,0xa4,0x01,0x76,0x00,0xd2,0xff,0xa4,0x01,0x76,0x00,0xe4,0xff,0x66,0x01,0x76,0x00,0xe6,0xff,0x7f,0x01,0x76,0x00,0xea,0x00,0x1d,0x01,0x76,0x00,0xeb,0xff,0x8f,0x01,0x76,0x00,0xf7,0xff,0xa4, +0x01,0x76,0x00,0xf8,0xff,0x2d,0x01,0x76,0x00,0xfb,0xff,0x66,0x01,0x76,0x00,0xfc,0xff,0xa4,0x01,0x76,0x00,0xfd,0xff,0x2d,0x01,0x76,0x00,0xfe,0xff,0xa4,0x01,0x76,0x00,0xff,0xff,0x2d,0x01,0x76,0x01,0x00,0xff,0x2d,0x01,0x76,0x01,0x03,0xff,0x66,0x01,0x76,0x01,0x04,0xff,0x27,0x01,0x76,0x01,0x05,0xff,0x66,0x01,0x76,0x01,0x06, +0xff,0x27,0x01,0x76,0x01,0x08,0xff,0x2d,0x01,0x76,0x01,0x0b,0xff,0x2d,0x01,0x76,0x01,0x0d,0xff,0x2d,0x01,0x76,0x01,0x15,0xff,0x4e,0x01,0x76,0x01,0x17,0xff,0x4e,0x01,0x76,0x01,0x18,0xff,0xa4,0x01,0x76,0x01,0x19,0xff,0x2d,0x01,0x76,0x01,0x1b,0xff,0x4e,0x01,0x76,0x01,0x1d,0xff,0x4e,0x01,0x76,0x01,0x1f,0xff,0x66,0x01,0x76, +0x01,0x20,0x00,0x27,0x01,0x76,0x01,0x22,0x00,0x27,0x01,0x76,0x01,0x25,0xff,0x4e,0x01,0x76,0x01,0x27,0xff,0x4e,0x01,0x76,0x01,0x29,0xff,0x7f,0x01,0x76,0x01,0x2b,0xff,0x7f,0x01,0x76,0x01,0x45,0xff,0x66,0x01,0x76,0x01,0x46,0xff,0x27,0x01,0x76,0x01,0x47,0xff,0xa4,0x01,0x76,0x01,0x48,0xff,0x2d,0x01,0x76,0x01,0x4c,0xff,0x2d, +0x01,0x76,0x01,0x4e,0xff,0x2d,0x01,0x76,0x01,0x50,0xff,0x2d,0x01,0x76,0x01,0x51,0xff,0xa4,0x01,0x76,0x01,0x52,0xff,0x2d,0x01,0x76,0x01,0x53,0xff,0xa4,0x01,0x76,0x01,0x54,0xff,0x2d,0x01,0x76,0x01,0x55,0xff,0xa4,0x01,0x76,0x01,0x56,0xff,0x2d,0x01,0x76,0x01,0x5c,0x00,0x6f,0x01,0x76,0x01,0x5e,0x00,0x6f,0x01,0x76,0x01,0x60, +0x00,0x6f,0x01,0x76,0x01,0x63,0xff,0x8f,0x01,0x76,0x01,0x6d,0xff,0x4e,0x01,0x76,0x01,0x6e,0xff,0xa4,0x01,0x76,0x01,0x6f,0xff,0x2d,0x01,0x76,0x01,0x70,0xff,0xa4,0x01,0x76,0x01,0x71,0xff,0x2d,0x01,0x76,0x01,0x73,0xff,0x4e,0x01,0x76,0x01,0x75,0xff,0x66,0x01,0x76,0x01,0x76,0x00,0x27,0x01,0x76,0x01,0x79,0xff,0x4e,0x01,0x76, +0x01,0x7b,0xff,0x4e,0x01,0x76,0x01,0x7d,0xff,0x4e,0x01,0x76,0x01,0x7f,0xff,0x4e,0x01,0x76,0x01,0x80,0x00,0x27,0x01,0x76,0x01,0x81,0xff,0x8f,0x01,0x76,0x01,0x82,0x00,0x1d,0x01,0x76,0x01,0x83,0xff,0x8f,0x01,0x76,0x01,0x85,0xff,0x66,0x01,0x76,0x01,0x86,0xff,0x27,0x01,0x76,0x01,0x87,0xff,0x66,0x01,0x76,0x01,0x88,0xff,0x27, +0x01,0x76,0x01,0x89,0xff,0xa4,0x01,0x76,0x01,0x8a,0xff,0x2d,0x01,0x76,0x01,0x8c,0x00,0x27,0x01,0x76,0x01,0x8d,0xff,0x8f,0x01,0x76,0x01,0x8e,0x00,0x27,0x01,0x76,0x01,0x8f,0xff,0x8f,0x01,0x76,0x01,0x90,0x00,0x27,0x01,0x76,0x01,0x91,0xff,0x8f,0x01,0x76,0x01,0x92,0x00,0x1d,0x01,0x76,0x01,0x93,0xff,0x8f,0x01,0x76,0x02,0x3e, +0xff,0x66,0x01,0x77,0x00,0x10,0xff,0x8f,0x01,0x77,0x00,0x22,0xff,0xcb,0x01,0x77,0x00,0x46,0xff,0xe5,0x01,0x77,0x00,0x47,0xff,0xe5,0x01,0x77,0x00,0x48,0xff,0xf0,0x01,0x77,0x00,0x4a,0xff,0xf0,0x01,0x77,0x00,0x52,0xff,0xf0,0x01,0x77,0x00,0x54,0xff,0xf0,0x01,0x77,0x00,0x5b,0x00,0x1d,0x01,0x77,0x00,0x6f,0xff,0xe5,0x01,0x77, +0x00,0x70,0xff,0xf0,0x01,0x77,0x00,0x71,0xff,0xf0,0x01,0x77,0x00,0x72,0xff,0xf0,0x01,0x77,0x00,0x73,0xff,0xf0,0x01,0x77,0x00,0x79,0xff,0xf0,0x01,0x77,0x00,0x7a,0xff,0xf0,0x01,0x77,0x00,0x7b,0xff,0xf0,0x01,0x77,0x00,0x7c,0xff,0xf0,0x01,0x77,0x00,0x7d,0xff,0xf0,0x01,0x77,0x00,0xab,0x00,0x27,0x01,0x77,0x00,0xb1,0xff,0xf0, +0x01,0x77,0x00,0xbf,0x00,0x27,0x01,0x77,0x00,0xf8,0xff,0xf0,0x01,0x77,0x00,0xfd,0xff,0xe5,0x01,0x77,0x00,0xff,0xff,0xe5,0x01,0x77,0x01,0x00,0xff,0xe5,0x01,0x77,0x01,0x08,0xff,0xe5,0x01,0x77,0x01,0x0b,0xff,0xf0,0x01,0x77,0x01,0x0d,0xff,0xf0,0x01,0x77,0x01,0x19,0xff,0xf0,0x01,0x77,0x01,0x48,0xff,0xe5,0x01,0x77,0x01,0x4c, +0xff,0xf0,0x01,0x77,0x01,0x4e,0xff,0xf0,0x01,0x77,0x01,0x50,0xff,0xf0,0x01,0x77,0x01,0x52,0xff,0xf0,0x01,0x77,0x01,0x54,0xff,0xf0,0x01,0x77,0x01,0x56,0xff,0xf0,0x01,0x77,0x01,0x6f,0xff,0xf0,0x01,0x77,0x01,0x71,0xff,0xf0,0x01,0x77,0x01,0x8a,0xff,0xf0,0x01,0x78,0x00,0x24,0xff,0xd7,0x01,0x78,0x00,0x91,0xff,0x8b,0x01,0x78, +0x00,0xc4,0xff,0xa6,0x01,0x78,0x00,0xc5,0xff,0xa6,0x01,0x78,0x01,0x03,0xff,0xd7,0x01,0x78,0x01,0x05,0xff,0xd7,0x01,0x78,0x01,0x45,0xff,0xd7,0x01,0x78,0x01,0x85,0xff,0xd7,0x01,0x78,0x01,0x87,0xff,0xd7,0x01,0x79,0x00,0x05,0xff,0xbe,0x01,0x79,0x00,0x0a,0xff,0xbe,0x01,0x7a,0x00,0x24,0xff,0xd7,0x01,0x7a,0x00,0x91,0xff,0x8b, +0x01,0x7a,0x00,0xc4,0xff,0xa6,0x01,0x7a,0x00,0xc5,0xff,0xa6,0x01,0x7a,0x01,0x03,0xff,0xd7,0x01,0x7a,0x01,0x05,0xff,0xd7,0x01,0x7a,0x01,0x45,0xff,0xd7,0x01,0x7a,0x01,0x85,0xff,0xd7,0x01,0x7a,0x01,0x87,0xff,0xd7,0x01,0x7b,0x00,0x05,0xff,0xbe,0x01,0x7b,0x00,0x0a,0xff,0xbe,0x01,0x7c,0x00,0x24,0xff,0xd7,0x01,0x7c,0x00,0x91, +0xff,0x8b,0x01,0x7c,0x00,0xc4,0xff,0xa6,0x01,0x7c,0x00,0xc5,0xff,0xa6,0x01,0x7c,0x01,0x03,0xff,0xd7,0x01,0x7c,0x01,0x05,0xff,0xd7,0x01,0x7c,0x01,0x45,0xff,0xd7,0x01,0x7c,0x01,0x85,0xff,0xd7,0x01,0x7c,0x01,0x87,0xff,0xd7,0x01,0x7d,0x00,0x05,0xff,0xbe,0x01,0x7d,0x00,0x0a,0xff,0xbe,0x01,0x7e,0x00,0x24,0xff,0xd7,0x01,0x7e, +0x00,0x91,0xff,0x8b,0x01,0x7e,0x00,0xc4,0xff,0xa6,0x01,0x7e,0x00,0xc5,0xff,0xa6,0x01,0x7e,0x01,0x03,0xff,0xd7,0x01,0x7e,0x01,0x05,0xff,0xd7,0x01,0x7e,0x01,0x45,0xff,0xd7,0x01,0x7e,0x01,0x85,0xff,0xd7,0x01,0x7e,0x01,0x87,0xff,0xd7,0x01,0x7f,0x00,0x05,0xff,0xbe,0x01,0x7f,0x00,0x0a,0xff,0xbe,0x01,0x80,0x00,0x0f,0xff,0x8b, +0x01,0x80,0x00,0x11,0xff,0x7f,0x01,0x80,0x00,0x24,0xff,0xb6,0x01,0x80,0x00,0x37,0x00,0x27,0x01,0x80,0x00,0x44,0xff,0xb4,0x01,0x80,0x00,0x46,0xff,0xcf,0x01,0x80,0x00,0x47,0xff,0xcf,0x01,0x80,0x00,0x48,0xff,0xcf,0x01,0x80,0x00,0x4a,0xff,0xcf,0x01,0x80,0x00,0x52,0xff,0xcf,0x01,0x80,0x00,0x54,0xff,0xcf,0x01,0x80,0x00,0x62, +0xff,0xb6,0x01,0x80,0x00,0x63,0xff,0xb6,0x01,0x80,0x00,0x69,0xff,0xb4,0x01,0x80,0x00,0x6a,0xff,0xb4,0x01,0x80,0x00,0x6b,0xff,0xb4,0x01,0x80,0x00,0x6c,0xff,0xb4,0x01,0x80,0x00,0x6d,0xff,0xb4,0x01,0x80,0x00,0x6e,0xff,0xb4,0x01,0x80,0x00,0x6f,0xff,0xcf,0x01,0x80,0x00,0x70,0xff,0xcf,0x01,0x80,0x00,0x71,0xff,0xcf,0x01,0x80, +0x00,0x72,0xff,0xcf,0x01,0x80,0x00,0x73,0xff,0xcf,0x01,0x80,0x00,0x76,0x00,0x31,0x01,0x80,0x00,0x77,0x00,0x64,0x01,0x80,0x00,0x79,0xff,0xcf,0x01,0x80,0x00,0x7a,0xff,0xcf,0x01,0x80,0x00,0x7b,0xff,0xcf,0x01,0x80,0x00,0x7c,0xff,0xcf,0x01,0x80,0x00,0x7d,0xff,0xcf,0x01,0x80,0x00,0x91,0xff,0x9a,0x01,0x80,0x00,0xa0,0xff,0xb4, +0x01,0x80,0x00,0xa2,0xff,0xa4,0x01,0x80,0x00,0xaa,0xff,0xcf,0x01,0x80,0x00,0xab,0x00,0x27,0x01,0x80,0x00,0xac,0xff,0x7f,0x01,0x80,0x00,0xad,0xff,0xb6,0x01,0x80,0x00,0xae,0xff,0xb6,0x01,0x80,0x00,0xb1,0xff,0xcf,0x01,0x80,0x00,0xbe,0xff,0xcf,0x01,0x80,0x00,0xbf,0x00,0x27,0x01,0x80,0x00,0xc4,0xff,0x7f,0x01,0x80,0x00,0xc5, +0xff,0x8b,0x01,0x80,0x00,0xc7,0xff,0xb6,0x01,0x80,0x00,0xc9,0xff,0xb6,0x01,0x80,0x00,0xf8,0xff,0xcf,0x01,0x80,0x00,0xfd,0xff,0xcf,0x01,0x80,0x00,0xff,0xff,0xcf,0x01,0x80,0x01,0x00,0xff,0xcf,0x01,0x80,0x01,0x03,0xff,0xb6,0x01,0x80,0x01,0x04,0xff,0xb4,0x01,0x80,0x01,0x05,0xff,0xb6,0x01,0x80,0x01,0x06,0xff,0xb4,0x01,0x80, +0x01,0x08,0xff,0xcf,0x01,0x80,0x01,0x0b,0xff,0xcf,0x01,0x80,0x01,0x0d,0xff,0xcf,0x01,0x80,0x01,0x19,0xff,0xcf,0x01,0x80,0x01,0x20,0x00,0x27,0x01,0x80,0x01,0x22,0x00,0x27,0x01,0x80,0x01,0x45,0xff,0xb6,0x01,0x80,0x01,0x46,0xff,0xb4,0x01,0x80,0x01,0x48,0xff,0xcf,0x01,0x80,0x01,0x4c,0xff,0xcf,0x01,0x80,0x01,0x4e,0xff,0xcf, +0x01,0x80,0x01,0x50,0xff,0xcf,0x01,0x80,0x01,0x52,0xff,0xcf,0x01,0x80,0x01,0x54,0xff,0xcf,0x01,0x80,0x01,0x56,0xff,0xcf,0x01,0x80,0x01,0x5c,0x00,0x64,0x01,0x80,0x01,0x5e,0x00,0x64,0x01,0x80,0x01,0x60,0x00,0x64,0x01,0x80,0x01,0x6f,0xff,0xcf,0x01,0x80,0x01,0x71,0xff,0xcf,0x01,0x80,0x01,0x76,0x00,0x27,0x01,0x80,0x01,0x85, +0xff,0xb6,0x01,0x80,0x01,0x86,0xff,0xb4,0x01,0x80,0x01,0x87,0xff,0xb6,0x01,0x80,0x01,0x88,0xff,0xb4,0x01,0x80,0x01,0x8a,0xff,0xcf,0x01,0x81,0x00,0x0f,0xff,0xa6,0x01,0x81,0x00,0x11,0xff,0x9a,0x01,0x81,0x00,0x46,0xff,0xfa,0x01,0x81,0x00,0x47,0xff,0xf6,0x01,0x81,0x00,0x48,0xff,0xf6,0x01,0x81,0x00,0x4a,0xff,0xfa,0x01,0x81, +0x00,0x52,0xff,0xfa,0x01,0x81,0x00,0x54,0xff,0xf6,0x01,0x81,0x00,0x6f,0xff,0xfa,0x01,0x81,0x00,0x70,0xff,0xf6,0x01,0x81,0x00,0x71,0xff,0xf6,0x01,0x81,0x00,0x72,0xff,0xf6,0x01,0x81,0x00,0x73,0xff,0xf6,0x01,0x81,0x00,0x79,0xff,0xfa,0x01,0x81,0x00,0x7a,0xff,0xfa,0x01,0x81,0x00,0x7b,0xff,0xfa,0x01,0x81,0x00,0x7c,0xff,0xfa, +0x01,0x81,0x00,0x7d,0xff,0xfa,0x01,0x81,0x00,0xac,0xff,0x9a,0x01,0x81,0x00,0xb1,0xff,0xfa,0x01,0x81,0x00,0xc4,0xff,0xb4,0x01,0x81,0x00,0xc5,0xff,0xb4,0x01,0x81,0x00,0xf8,0xff,0xfa,0x01,0x81,0x00,0xfd,0xff,0xfa,0x01,0x81,0x00,0xff,0xff,0xfa,0x01,0x81,0x01,0x00,0xff,0xf6,0x01,0x81,0x01,0x08,0xff,0xf6,0x01,0x81,0x01,0x0b, +0xff,0xf6,0x01,0x81,0x01,0x0d,0xff,0xf6,0x01,0x81,0x01,0x19,0xff,0xfa,0x01,0x81,0x01,0x48,0xff,0xfa,0x01,0x81,0x01,0x4c,0xff,0xf6,0x01,0x81,0x01,0x4e,0xff,0xf6,0x01,0x81,0x01,0x50,0xff,0xf6,0x01,0x81,0x01,0x52,0xff,0xfa,0x01,0x81,0x01,0x54,0xff,0xfa,0x01,0x81,0x01,0x56,0xff,0xfa,0x01,0x81,0x01,0x6f,0xff,0xfa,0x01,0x81, +0x01,0x71,0xff,0xfa,0x01,0x81,0x01,0x8a,0xff,0xfa,0x01,0x82,0x00,0x0f,0xff,0x50,0x01,0x82,0x00,0x11,0xff,0x3d,0x01,0x82,0x00,0x24,0xff,0x62,0x01,0x82,0x00,0x26,0xff,0xd3,0x01,0x82,0x00,0x2a,0xff,0xd3,0x01,0x82,0x00,0x2d,0xff,0xbe,0x01,0x82,0x00,0x32,0xff,0xd3,0x01,0x82,0x00,0x34,0xff,0xd3,0x01,0x82,0x00,0x36,0xff,0xe5, +0x01,0x82,0x00,0x37,0x00,0x27,0x01,0x82,0x00,0x44,0xff,0x39,0x01,0x82,0x00,0x46,0xff,0x4c,0x01,0x82,0x00,0x47,0xff,0x4c,0x01,0x82,0x00,0x48,0xff,0x4c,0x01,0x82,0x00,0x49,0xff,0xe5,0x01,0x82,0x00,0x4a,0xff,0x4c,0x01,0x82,0x00,0x50,0xff,0x73,0x01,0x82,0x00,0x51,0xff,0x73,0x01,0x82,0x00,0x52,0xff,0x4c,0x01,0x82,0x00,0x53, +0xff,0x73,0x01,0x82,0x00,0x54,0xff,0x4c,0x01,0x82,0x00,0x55,0xff,0x73,0x01,0x82,0x00,0x56,0xff,0x7b,0x01,0x82,0x00,0x58,0xff,0x73,0x01,0x82,0x00,0x62,0xff,0x62,0x01,0x82,0x00,0x63,0xff,0x62,0x01,0x82,0x00,0x64,0xff,0xcd,0x01,0x82,0x00,0x67,0xff,0xd3,0x01,0x82,0x00,0x69,0xff,0x39,0x01,0x82,0x00,0x6a,0xff,0x39,0x01,0x82, +0x00,0x6b,0xff,0x39,0x01,0x82,0x00,0x6c,0xff,0x7f,0x01,0x82,0x00,0x6d,0xff,0x66,0x01,0x82,0x00,0x6e,0xff,0x39,0x01,0x82,0x00,0x6f,0xff,0x4c,0x01,0x82,0x00,0x70,0xff,0x4c,0x01,0x82,0x00,0x71,0xff,0x4c,0x01,0x82,0x00,0x72,0xff,0x4c,0x01,0x82,0x00,0x73,0xff,0x4c,0x01,0x82,0x00,0x77,0x00,0x5a,0x01,0x82,0x00,0x78,0xff,0x73, +0x01,0x82,0x00,0x79,0xff,0x4c,0x01,0x82,0x00,0x7a,0xff,0x4c,0x01,0x82,0x00,0x7b,0xff,0x4c,0x01,0x82,0x00,0x7c,0xff,0x4c,0x01,0x82,0x00,0x7d,0xff,0x4c,0x01,0x82,0x00,0x7e,0xff,0x73,0x01,0x82,0x00,0x7f,0xff,0x73,0x01,0x82,0x00,0x80,0xff,0x73,0x01,0x82,0x00,0x81,0xff,0x73,0x01,0x82,0x00,0x91,0xff,0x3f,0x01,0x82,0x00,0x92, +0xff,0xd3,0x01,0x82,0x00,0xa0,0xff,0x39,0x01,0x82,0x00,0xa2,0xff,0x1b,0x01,0x82,0x00,0xaa,0xff,0xcf,0x01,0x82,0x00,0xac,0xff,0x3d,0x01,0x82,0x00,0xad,0xff,0x62,0x01,0x82,0x00,0xae,0xff,0x62,0x01,0x82,0x00,0xaf,0xff,0xd3,0x01,0x82,0x00,0xb0,0xff,0xd3,0x01,0x82,0x00,0xb1,0xff,0x4c,0x01,0x82,0x00,0xbe,0xff,0x9a,0x01,0x82, +0x00,0xc4,0xff,0x08,0x01,0x82,0x00,0xc5,0xff,0x08,0x01,0x82,0x00,0xc7,0xff,0x62,0x01,0x82,0x00,0xc9,0xff,0x62,0x01,0x82,0x00,0xd0,0xff,0xd3,0x01,0x82,0x00,0xd1,0xff,0xd3,0x01,0x82,0x00,0xd2,0xff,0xd3,0x01,0x82,0x00,0xe3,0xff,0xe5,0x01,0x82,0x00,0xe4,0xff,0x7b,0x01,0x82,0x00,0xf7,0xff,0xd3,0x01,0x82,0x00,0xf8,0xff,0x4c, +0x01,0x82,0x00,0xfa,0xff,0xe5,0x01,0x82,0x00,0xfb,0xff,0x7b,0x01,0x82,0x00,0xfc,0xff,0xd3,0x01,0x82,0x00,0xfd,0xff,0x4c,0x01,0x82,0x00,0xfe,0xff,0xd3,0x01,0x82,0x00,0xff,0xff,0x4c,0x01,0x82,0x01,0x00,0xff,0x4c,0x01,0x82,0x01,0x03,0xff,0x62,0x01,0x82,0x01,0x04,0xff,0x7f,0x01,0x82,0x01,0x05,0xff,0x62,0x01,0x82,0x01,0x06, +0xff,0x39,0x01,0x82,0x01,0x08,0xff,0x4c,0x01,0x82,0x01,0x0b,0xff,0x4c,0x01,0x82,0x01,0x0d,0xff,0x4c,0x01,0x82,0x01,0x15,0xff,0x73,0x01,0x82,0x01,0x17,0xff,0x73,0x01,0x82,0x01,0x18,0xff,0xd3,0x01,0x82,0x01,0x19,0xff,0x4c,0x01,0x82,0x01,0x1b,0xff,0x73,0x01,0x82,0x01,0x1d,0xff,0x73,0x01,0x82,0x01,0x1e,0xff,0xe5,0x01,0x82, +0x01,0x1f,0xff,0x7b,0x01,0x82,0x01,0x20,0x00,0x27,0x01,0x82,0x01,0x22,0x00,0x27,0x01,0x82,0x01,0x25,0xff,0x73,0x01,0x82,0x01,0x27,0xff,0x73,0x01,0x82,0x01,0x45,0xff,0x62,0x01,0x82,0x01,0x46,0xff,0x7f,0x01,0x82,0x01,0x47,0xff,0xd3,0x01,0x82,0x01,0x48,0xff,0x4c,0x01,0x82,0x01,0x4c,0xff,0x4c,0x01,0x82,0x01,0x4e,0xff,0x4c, +0x01,0x82,0x01,0x50,0xff,0x4c,0x01,0x82,0x01,0x51,0xff,0xd3,0x01,0x82,0x01,0x52,0xff,0x4c,0x01,0x82,0x01,0x53,0xff,0xd3,0x01,0x82,0x01,0x54,0xff,0x4c,0x01,0x82,0x01,0x55,0xff,0xd3,0x01,0x82,0x01,0x56,0xff,0x4c,0x01,0x82,0x01,0x5c,0x00,0x5a,0x01,0x82,0x01,0x5e,0x00,0x5a,0x01,0x82,0x01,0x60,0x00,0x5a,0x01,0x82,0x01,0x63, +0xff,0xbe,0x01,0x82,0x01,0x6d,0xff,0x73,0x01,0x82,0x01,0x6e,0xff,0xd3,0x01,0x82,0x01,0x6f,0xff,0x4c,0x01,0x82,0x01,0x70,0xff,0xd3,0x01,0x82,0x01,0x71,0xff,0x4c,0x01,0x82,0x01,0x73,0xff,0x73,0x01,0x82,0x01,0x74,0xff,0xe5,0x01,0x82,0x01,0x75,0xff,0x7b,0x01,0x82,0x01,0x76,0x00,0x27,0x01,0x82,0x01,0x79,0xff,0x73,0x01,0x82, +0x01,0x7b,0xff,0x73,0x01,0x82,0x01,0x7d,0xff,0x73,0x01,0x82,0x01,0x7f,0xff,0x73,0x01,0x82,0x01,0x85,0xff,0x62,0x01,0x82,0x01,0x86,0xff,0x7f,0x01,0x82,0x01,0x87,0xff,0x62,0x01,0x82,0x01,0x88,0xff,0x39,0x01,0x82,0x01,0x89,0xff,0xd3,0x01,0x82,0x01,0x8a,0xff,0x4c,0x01,0x82,0x02,0x3d,0xff,0xe5,0x01,0x82,0x02,0x3e,0xff,0x7b, +0x01,0x83,0x00,0x05,0x00,0x1d,0x01,0x83,0x00,0x0a,0x00,0x1d,0x01,0x83,0x00,0x0f,0xff,0x9a,0x01,0x83,0x00,0x11,0xff,0x81,0x01,0x83,0x00,0x22,0xff,0xb4,0x01,0x83,0x00,0x46,0xff,0xf6,0x01,0x83,0x00,0x47,0xff,0xf6,0x01,0x83,0x00,0x48,0xff,0xf6,0x01,0x83,0x00,0x49,0x00,0x04,0x01,0x83,0x00,0x4a,0xff,0xf6,0x01,0x83,0x00,0x52, +0xff,0xf6,0x01,0x83,0x00,0x54,0xff,0xf6,0x01,0x83,0x00,0x57,0x00,0x06,0x01,0x83,0x00,0x6f,0xff,0xf6,0x01,0x83,0x00,0x70,0xff,0xf6,0x01,0x83,0x00,0x71,0xff,0xf6,0x01,0x83,0x00,0x72,0xff,0xf6,0x01,0x83,0x00,0x73,0xff,0xf6,0x01,0x83,0x00,0x79,0xff,0xf6,0x01,0x83,0x00,0x7a,0xff,0xf6,0x01,0x83,0x00,0x7b,0xff,0xf6,0x01,0x83, +0x00,0x7c,0xff,0xf6,0x01,0x83,0x00,0x7d,0xff,0xf6,0x01,0x83,0x00,0xac,0xff,0x81,0x01,0x83,0x00,0xb1,0xff,0xf6,0x01,0x83,0x00,0xbf,0x00,0x0c,0x01,0x83,0x00,0xc4,0xff,0x8d,0x01,0x83,0x00,0xc5,0xff,0x8d,0x01,0x83,0x00,0xf8,0xff,0xf6,0x01,0x83,0x00,0xfd,0xff,0xf6,0x01,0x83,0x00,0xff,0xff,0xf6,0x01,0x83,0x01,0x00,0xff,0xf6, +0x01,0x83,0x01,0x08,0xff,0xf6,0x01,0x83,0x01,0x0b,0xff,0xf6,0x01,0x83,0x01,0x0d,0xff,0xf6,0x01,0x83,0x01,0x19,0xff,0xf6,0x01,0x83,0x01,0x21,0x00,0x06,0x01,0x83,0x01,0x23,0x00,0x06,0x01,0x83,0x01,0x48,0xff,0xf6,0x01,0x83,0x01,0x4c,0xff,0xf6,0x01,0x83,0x01,0x4e,0xff,0xf6,0x01,0x83,0x01,0x50,0xff,0xf6,0x01,0x83,0x01,0x52, +0xff,0xf6,0x01,0x83,0x01,0x54,0xff,0xf6,0x01,0x83,0x01,0x56,0xff,0xf6,0x01,0x83,0x01,0x6f,0xff,0xf6,0x01,0x83,0x01,0x71,0xff,0xf6,0x01,0x83,0x01,0x77,0x00,0x06,0x01,0x83,0x01,0x8a,0xff,0xf6,0x01,0x84,0x00,0x0c,0x00,0x8d,0x01,0x84,0x00,0x0f,0xff,0x7f,0x01,0x84,0x00,0x10,0xff,0x9a,0x01,0x84,0x00,0x11,0xff,0x7f,0x01,0x84, +0x00,0x1d,0x00,0x52,0x01,0x84,0x00,0x1e,0x00,0x52,0x01,0x84,0x00,0x22,0x00,0x42,0x01,0x84,0x00,0x40,0x00,0x8d,0x01,0x84,0x00,0x45,0x00,0x12,0x01,0x84,0x00,0x4b,0x00,0x12,0x01,0x84,0x00,0x57,0x00,0x25,0x01,0x84,0x00,0x59,0x00,0x27,0x01,0x84,0x00,0x5a,0x00,0x27,0x01,0x84,0x00,0x5b,0x00,0x12,0x01,0x84,0x00,0x5c,0x00,0x21, +0x01,0x84,0x00,0x60,0x00,0x52,0x01,0x84,0x00,0x75,0x00,0x2d,0x01,0x84,0x00,0x76,0x00,0x12,0x01,0x84,0x00,0x77,0x00,0x79,0x01,0x84,0x00,0x8d,0x00,0x93,0x01,0x84,0x00,0xab,0x00,0x27,0x01,0x84,0x00,0xac,0xff,0x7f,0x01,0x84,0x00,0xb4,0x00,0x5e,0x01,0x84,0x00,0xb5,0x00,0x52,0x01,0x84,0x00,0xb6,0x00,0x5e,0x01,0x84,0x00,0xb7, +0x00,0x52,0x01,0x84,0x00,0xbf,0x00,0x27,0x01,0x84,0x00,0xc4,0xff,0xb0,0x01,0x84,0x00,0xc5,0xff,0xb0,0x01,0x84,0x00,0xeb,0x00,0x21,0x01,0x84,0x00,0xed,0x00,0x12,0x01,0x84,0x01,0x21,0x00,0x25,0x01,0x84,0x01,0x23,0x00,0x25,0x01,0x84,0x01,0x58,0x00,0x12,0x01,0x84,0x01,0x5a,0x00,0x12,0x01,0x84,0x01,0x5c,0x00,0x79,0x01,0x84, +0x01,0x5e,0x00,0x79,0x01,0x84,0x01,0x60,0x00,0x79,0x01,0x84,0x01,0x77,0x00,0x25,0x01,0x84,0x01,0x81,0x00,0x27,0x01,0x84,0x01,0x83,0x00,0x21,0x01,0x84,0x01,0x8d,0x00,0x27,0x01,0x84,0x01,0x8f,0x00,0x27,0x01,0x84,0x01,0x91,0x00,0x27,0x01,0x84,0x01,0x93,0x00,0x21,0x01,0x85,0x00,0x0d,0xff,0x7f,0x01,0x85,0x00,0x0f,0x00,0x44, +0x01,0x85,0x00,0x1e,0x00,0x44,0x01,0x85,0x00,0x26,0xff,0xe5,0x01,0x85,0x00,0x2a,0xff,0xe5,0x01,0x85,0x00,0x2d,0x00,0x5e,0x01,0x85,0x00,0x32,0xff,0xe5,0x01,0x85,0x00,0x37,0xff,0x6d,0x01,0x85,0x00,0x38,0xff,0xe5,0x01,0x85,0x00,0x39,0xff,0x8b,0x01,0x85,0x00,0x3a,0xff,0xb6,0x01,0x85,0x00,0x3c,0xff,0x64,0x01,0x85,0x00,0x3d, +0x00,0x3b,0x01,0x85,0x00,0x57,0xff,0xe5,0x01,0x85,0x00,0x59,0xff,0xd5,0x01,0x85,0x00,0x5a,0xff,0xe5,0x01,0x85,0x00,0x5c,0xff,0xdb,0x01,0x85,0x00,0x8d,0xff,0x9a,0x01,0x85,0x00,0xb4,0xff,0x66,0x01,0x85,0x00,0xb5,0xff,0x3f,0x01,0x85,0x00,0xb6,0xff,0x66,0x01,0x85,0x00,0xb7,0xff,0x3f,0x01,0x85,0x00,0xba,0xff,0xc1,0x01,0x85, +0x00,0xbb,0xff,0x64,0x01,0x85,0x00,0xe5,0x00,0x3b,0x01,0x85,0x00,0xea,0xff,0x64,0x01,0x85,0x00,0xeb,0xff,0xdb,0x01,0x85,0x00,0xf7,0xff,0xe5,0x01,0x85,0x00,0xfc,0xff,0xe5,0x01,0x85,0x00,0xfe,0xff,0xe5,0x01,0x85,0x01,0x18,0xff,0xe5,0x01,0x85,0x01,0x20,0xff,0x6d,0x01,0x85,0x01,0x21,0xff,0xe5,0x01,0x85,0x01,0x22,0xff,0x6d, +0x01,0x85,0x01,0x23,0xff,0xe5,0x01,0x85,0x01,0x24,0xff,0xe5,0x01,0x85,0x01,0x26,0xff,0xe5,0x01,0x85,0x01,0x28,0x00,0x3b,0x01,0x85,0x01,0x2a,0x00,0x3b,0x01,0x85,0x01,0x47,0xff,0xe5,0x01,0x85,0x01,0x51,0xff,0xe5,0x01,0x85,0x01,0x53,0xff,0xe5,0x01,0x85,0x01,0x55,0xff,0xe5,0x01,0x85,0x01,0x63,0x00,0x5e,0x01,0x85,0x01,0x6e, +0xff,0xe5,0x01,0x85,0x01,0x70,0xff,0xe5,0x01,0x85,0x01,0x76,0xff,0x6d,0x01,0x85,0x01,0x77,0xff,0xe5,0x01,0x85,0x01,0x78,0xff,0xe5,0x01,0x85,0x01,0x7a,0xff,0xe5,0x01,0x85,0x01,0x7c,0xff,0xe5,0x01,0x85,0x01,0x7e,0xff,0xe5,0x01,0x85,0x01,0x80,0xff,0xb6,0x01,0x85,0x01,0x81,0xff,0xe5,0x01,0x85,0x01,0x82,0xff,0x64,0x01,0x85, +0x01,0x83,0xff,0xdb,0x01,0x85,0x01,0x89,0xff,0xe5,0x01,0x85,0x01,0x8c,0xff,0xb6,0x01,0x85,0x01,0x8d,0xff,0xe5,0x01,0x85,0x01,0x8e,0xff,0xb6,0x01,0x85,0x01,0x8f,0xff,0xe5,0x01,0x85,0x01,0x90,0xff,0xb6,0x01,0x85,0x01,0x91,0xff,0xe5,0x01,0x85,0x01,0x92,0xff,0x64,0x01,0x85,0x01,0x93,0xff,0xdb,0x01,0x87,0x00,0x24,0x00,0x0a, +0x01,0x87,0x00,0x2d,0x00,0x44,0x01,0x87,0x00,0x37,0x00,0x04,0x01,0x87,0x00,0x3a,0x00,0x1d,0x01,0x87,0x00,0x3b,0x00,0x08,0x01,0x87,0x00,0x62,0x00,0x0a,0x01,0x87,0x00,0x63,0x00,0x0a,0x01,0x87,0x00,0x77,0x00,0x12,0x01,0x87,0x00,0xad,0x00,0x0a,0x01,0x87,0x00,0xae,0x00,0x0a,0x01,0x87,0x00,0xc7,0x00,0x0a,0x01,0x87,0x00,0xc9, +0x00,0x0a,0x01,0x87,0x01,0x03,0x00,0x0a,0x01,0x87,0x01,0x05,0x00,0x0a,0x01,0x87,0x01,0x20,0x00,0x04,0x01,0x87,0x01,0x22,0x00,0x04,0x01,0x87,0x01,0x45,0x00,0x0a,0x01,0x87,0x01,0x5c,0x00,0x12,0x01,0x87,0x01,0x5e,0x00,0x12,0x01,0x87,0x01,0x60,0x00,0x12,0x01,0x87,0x01,0x63,0x00,0x44,0x01,0x87,0x01,0x76,0x00,0x04,0x01,0x87, +0x01,0x80,0x00,0x1d,0x01,0x87,0x01,0x85,0x00,0x0a,0x01,0x87,0x01,0x87,0x00,0x0a,0x01,0x87,0x01,0x8c,0x00,0x1d,0x01,0x87,0x01,0x8e,0x00,0x1d,0x01,0x87,0x01,0x90,0x00,0x1d,0x01,0x88,0x00,0x05,0xff,0x98,0x01,0x88,0x00,0x0a,0xff,0x98,0x01,0x89,0x00,0x0f,0xff,0xa4,0x01,0x89,0x00,0x11,0xff,0xa4,0x01,0x89,0x00,0x24,0xff,0xe5, +0x01,0x89,0x00,0x2d,0xff,0xf6,0x01,0x89,0x00,0x37,0xff,0xa4,0x01,0x89,0x00,0x3b,0xff,0xdb,0x01,0x89,0x00,0x3c,0xff,0xe7,0x01,0x89,0x00,0x3d,0xff,0xcf,0x01,0x89,0x00,0x62,0xff,0xe5,0x01,0x89,0x00,0x63,0xff,0xe5,0x01,0x89,0x00,0xac,0xff,0xa4,0x01,0x89,0x00,0xad,0xff,0xe5,0x01,0x89,0x00,0xae,0xff,0xe5,0x01,0x89,0x00,0xbb, +0xff,0xf6,0x01,0x89,0x00,0xc4,0xff,0x4c,0x01,0x89,0x00,0xc5,0xff,0x98,0x01,0x89,0x00,0xc7,0xff,0xe5,0x01,0x89,0x00,0xc9,0xff,0xe5,0x01,0x89,0x00,0xe5,0xff,0xcf,0x01,0x89,0x00,0xea,0xff,0xe7,0x01,0x89,0x01,0x03,0xff,0xe5,0x01,0x89,0x01,0x05,0xff,0xe5,0x01,0x89,0x01,0x20,0xff,0xa4,0x01,0x89,0x01,0x22,0xff,0xa4,0x01,0x89, +0x01,0x28,0xff,0xcf,0x01,0x89,0x01,0x2a,0xff,0xcf,0x01,0x89,0x01,0x45,0xff,0xe5,0x01,0x89,0x01,0x63,0xff,0xf6,0x01,0x89,0x01,0x76,0xff,0xa4,0x01,0x89,0x01,0x82,0xff,0xe7,0x01,0x89,0x01,0x85,0xff,0xe5,0x01,0x89,0x01,0x87,0xff,0xe5,0x01,0x89,0x01,0x92,0xff,0xe7,0x01,0x8a,0x00,0x05,0xff,0x6f,0x01,0x8a,0x00,0x0a,0xff,0x6f, +0x01,0x8a,0x00,0x44,0xff,0xe5,0x01,0x8a,0x00,0x49,0xff,0xdb,0x01,0x8a,0x00,0x5b,0xff,0xe7,0x01,0x8a,0x00,0x69,0xff,0xe5,0x01,0x8a,0x00,0x6a,0xff,0xe5,0x01,0x8a,0x00,0x6b,0xff,0xe5,0x01,0x8a,0x00,0x6c,0xff,0xe5,0x01,0x8a,0x00,0x6d,0xff,0xe5,0x01,0x8a,0x00,0x6e,0xff,0xe5,0x01,0x8a,0x00,0xa0,0xff,0xe5,0x01,0x8a,0x00,0xb4, +0xff,0xb2,0x01,0x8a,0x00,0xb5,0xff,0x7d,0x01,0x8a,0x00,0xb6,0xff,0xbe,0x01,0x8a,0x00,0xb7,0xff,0x7d,0x01,0x8a,0x00,0xc0,0xff,0xe7,0x01,0x8a,0x00,0xc1,0xff,0xe7,0x01,0x8a,0x01,0x04,0xff,0xe5,0x01,0x8a,0x01,0x06,0xff,0xe5,0x01,0x8a,0x01,0x46,0xff,0xe5,0x01,0x8a,0x01,0x86,0xff,0xe5,0x01,0x8a,0x01,0x88,0xff,0xe5,0x01,0x8c, +0x00,0x0f,0xff,0x8b,0x01,0x8c,0x00,0x11,0xff,0x7f,0x01,0x8c,0x00,0x24,0xff,0xb6,0x01,0x8c,0x00,0x37,0x00,0x27,0x01,0x8c,0x00,0x44,0xff,0xb4,0x01,0x8c,0x00,0x46,0xff,0xcf,0x01,0x8c,0x00,0x47,0xff,0xcf,0x01,0x8c,0x00,0x48,0xff,0xcf,0x01,0x8c,0x00,0x4a,0xff,0xcf,0x01,0x8c,0x00,0x52,0xff,0xcf,0x01,0x8c,0x00,0x54,0xff,0xcf, +0x01,0x8c,0x00,0x62,0xff,0xb6,0x01,0x8c,0x00,0x63,0xff,0xb6,0x01,0x8c,0x00,0x69,0xff,0xb4,0x01,0x8c,0x00,0x6a,0xff,0xb4,0x01,0x8c,0x00,0x6b,0xff,0xb4,0x01,0x8c,0x00,0x6c,0xff,0xb4,0x01,0x8c,0x00,0x6d,0xff,0xb4,0x01,0x8c,0x00,0x6e,0xff,0xb4,0x01,0x8c,0x00,0x6f,0xff,0xcf,0x01,0x8c,0x00,0x70,0xff,0xcf,0x01,0x8c,0x00,0x71, +0xff,0xcf,0x01,0x8c,0x00,0x72,0xff,0xcf,0x01,0x8c,0x00,0x73,0xff,0xcf,0x01,0x8c,0x00,0x76,0x00,0x31,0x01,0x8c,0x00,0x77,0x00,0x64,0x01,0x8c,0x00,0x79,0xff,0xcf,0x01,0x8c,0x00,0x7a,0xff,0xcf,0x01,0x8c,0x00,0x7b,0xff,0xcf,0x01,0x8c,0x00,0x7c,0xff,0xcf,0x01,0x8c,0x00,0x7d,0xff,0xcf,0x01,0x8c,0x00,0x91,0xff,0x9a,0x01,0x8c, +0x00,0xa0,0xff,0xb4,0x01,0x8c,0x00,0xa2,0xff,0xa4,0x01,0x8c,0x00,0xaa,0xff,0xcf,0x01,0x8c,0x00,0xab,0x00,0x27,0x01,0x8c,0x00,0xac,0xff,0x7f,0x01,0x8c,0x00,0xad,0xff,0xb6,0x01,0x8c,0x00,0xae,0xff,0xb6,0x01,0x8c,0x00,0xb1,0xff,0xcf,0x01,0x8c,0x00,0xbe,0xff,0xcf,0x01,0x8c,0x00,0xbf,0x00,0x27,0x01,0x8c,0x00,0xc4,0xff,0x7f, +0x01,0x8c,0x00,0xc5,0xff,0x8b,0x01,0x8c,0x00,0xc7,0xff,0xb6,0x01,0x8c,0x00,0xc9,0xff,0xb6,0x01,0x8c,0x00,0xf8,0xff,0xcf,0x01,0x8c,0x00,0xfd,0xff,0xcf,0x01,0x8c,0x00,0xff,0xff,0xcf,0x01,0x8c,0x01,0x00,0xff,0xcf,0x01,0x8c,0x01,0x03,0xff,0xb6,0x01,0x8c,0x01,0x04,0xff,0xb4,0x01,0x8c,0x01,0x05,0xff,0xb6,0x01,0x8c,0x01,0x06, +0xff,0xb4,0x01,0x8c,0x01,0x08,0xff,0xcf,0x01,0x8c,0x01,0x0b,0xff,0xcf,0x01,0x8c,0x01,0x0d,0xff,0xcf,0x01,0x8c,0x01,0x19,0xff,0xcf,0x01,0x8c,0x01,0x20,0x00,0x27,0x01,0x8c,0x01,0x22,0x00,0x27,0x01,0x8c,0x01,0x45,0xff,0xb6,0x01,0x8c,0x01,0x46,0xff,0xb4,0x01,0x8c,0x01,0x48,0xff,0xcf,0x01,0x8c,0x01,0x4c,0xff,0xcf,0x01,0x8c, +0x01,0x4e,0xff,0xcf,0x01,0x8c,0x01,0x50,0xff,0xcf,0x01,0x8c,0x01,0x52,0xff,0xcf,0x01,0x8c,0x01,0x54,0xff,0xcf,0x01,0x8c,0x01,0x56,0xff,0xcf,0x01,0x8c,0x01,0x5c,0x00,0x64,0x01,0x8c,0x01,0x5e,0x00,0x64,0x01,0x8c,0x01,0x60,0x00,0x64,0x01,0x8c,0x01,0x6f,0xff,0xcf,0x01,0x8c,0x01,0x71,0xff,0xcf,0x01,0x8c,0x01,0x76,0x00,0x27, +0x01,0x8c,0x01,0x85,0xff,0xb6,0x01,0x8c,0x01,0x86,0xff,0xb4,0x01,0x8c,0x01,0x87,0xff,0xb6,0x01,0x8c,0x01,0x88,0xff,0xb4,0x01,0x8c,0x01,0x8a,0xff,0xcf,0x01,0x8d,0x00,0x0f,0xff,0xa6,0x01,0x8d,0x00,0x11,0xff,0x9a,0x01,0x8d,0x00,0x46,0xff,0xfa,0x01,0x8d,0x00,0x47,0xff,0xf6,0x01,0x8d,0x00,0x48,0xff,0xf6,0x01,0x8d,0x00,0x4a, +0xff,0xfa,0x01,0x8d,0x00,0x52,0xff,0xfa,0x01,0x8d,0x00,0x54,0xff,0xf6,0x01,0x8d,0x00,0x6f,0xff,0xfa,0x01,0x8d,0x00,0x70,0xff,0xf6,0x01,0x8d,0x00,0x71,0xff,0xf6,0x01,0x8d,0x00,0x72,0xff,0xf6,0x01,0x8d,0x00,0x73,0xff,0xf6,0x01,0x8d,0x00,0x79,0xff,0xfa,0x01,0x8d,0x00,0x7a,0xff,0xfa,0x01,0x8d,0x00,0x7b,0xff,0xfa,0x01,0x8d, +0x00,0x7c,0xff,0xfa,0x01,0x8d,0x00,0x7d,0xff,0xfa,0x01,0x8d,0x00,0xac,0xff,0x9a,0x01,0x8d,0x00,0xb1,0xff,0xfa,0x01,0x8d,0x00,0xc4,0xff,0xb4,0x01,0x8d,0x00,0xc5,0xff,0xb4,0x01,0x8d,0x00,0xf8,0xff,0xfa,0x01,0x8d,0x00,0xfd,0xff,0xfa,0x01,0x8d,0x00,0xff,0xff,0xfa,0x01,0x8d,0x01,0x00,0xff,0xf6,0x01,0x8d,0x01,0x08,0xff,0xf6, +0x01,0x8d,0x01,0x0b,0xff,0xf6,0x01,0x8d,0x01,0x0d,0xff,0xf6,0x01,0x8d,0x01,0x19,0xff,0xfa,0x01,0x8d,0x01,0x48,0xff,0xfa,0x01,0x8d,0x01,0x4c,0xff,0xf6,0x01,0x8d,0x01,0x4e,0xff,0xf6,0x01,0x8d,0x01,0x50,0xff,0xf6,0x01,0x8d,0x01,0x52,0xff,0xfa,0x01,0x8d,0x01,0x54,0xff,0xfa,0x01,0x8d,0x01,0x56,0xff,0xfa,0x01,0x8d,0x01,0x6f, +0xff,0xfa,0x01,0x8d,0x01,0x71,0xff,0xfa,0x01,0x8d,0x01,0x8a,0xff,0xfa,0x01,0x8e,0x00,0x0f,0xff,0x8b,0x01,0x8e,0x00,0x11,0xff,0x7f,0x01,0x8e,0x00,0x24,0xff,0xb6,0x01,0x8e,0x00,0x37,0x00,0x27,0x01,0x8e,0x00,0x44,0xff,0xb4,0x01,0x8e,0x00,0x46,0xff,0xcf,0x01,0x8e,0x00,0x47,0xff,0xcf,0x01,0x8e,0x00,0x48,0xff,0xcf,0x01,0x8e, +0x00,0x4a,0xff,0xcf,0x01,0x8e,0x00,0x52,0xff,0xcf,0x01,0x8e,0x00,0x54,0xff,0xcf,0x01,0x8e,0x00,0x62,0xff,0xb6,0x01,0x8e,0x00,0x63,0xff,0xb6,0x01,0x8e,0x00,0x69,0xff,0xb4,0x01,0x8e,0x00,0x6a,0xff,0xb4,0x01,0x8e,0x00,0x6b,0xff,0xb4,0x01,0x8e,0x00,0x6c,0xff,0xb4,0x01,0x8e,0x00,0x6d,0xff,0xb4,0x01,0x8e,0x00,0x6e,0xff,0xb4, +0x01,0x8e,0x00,0x6f,0xff,0xcf,0x01,0x8e,0x00,0x70,0xff,0xcf,0x01,0x8e,0x00,0x71,0xff,0xcf,0x01,0x8e,0x00,0x72,0xff,0xcf,0x01,0x8e,0x00,0x73,0xff,0xcf,0x01,0x8e,0x00,0x76,0x00,0x31,0x01,0x8e,0x00,0x77,0x00,0x64,0x01,0x8e,0x00,0x79,0xff,0xcf,0x01,0x8e,0x00,0x7a,0xff,0xcf,0x01,0x8e,0x00,0x7b,0xff,0xcf,0x01,0x8e,0x00,0x7c, +0xff,0xcf,0x01,0x8e,0x00,0x7d,0xff,0xcf,0x01,0x8e,0x00,0x91,0xff,0x9a,0x01,0x8e,0x00,0xa0,0xff,0xb4,0x01,0x8e,0x00,0xa2,0xff,0xa4,0x01,0x8e,0x00,0xaa,0xff,0xcf,0x01,0x8e,0x00,0xab,0x00,0x27,0x01,0x8e,0x00,0xac,0xff,0x7f,0x01,0x8e,0x00,0xad,0xff,0xb6,0x01,0x8e,0x00,0xae,0xff,0xb6,0x01,0x8e,0x00,0xb1,0xff,0xcf,0x01,0x8e, +0x00,0xbe,0xff,0xcf,0x01,0x8e,0x00,0xbf,0x00,0x27,0x01,0x8e,0x00,0xc4,0xff,0x7f,0x01,0x8e,0x00,0xc5,0xff,0x8b,0x01,0x8e,0x00,0xc7,0xff,0xb6,0x01,0x8e,0x00,0xc9,0xff,0xb6,0x01,0x8e,0x00,0xf8,0xff,0xcf,0x01,0x8e,0x00,0xfd,0xff,0xcf,0x01,0x8e,0x00,0xff,0xff,0xcf,0x01,0x8e,0x01,0x00,0xff,0xcf,0x01,0x8e,0x01,0x03,0xff,0xb6, +0x01,0x8e,0x01,0x04,0xff,0xb4,0x01,0x8e,0x01,0x05,0xff,0xb6,0x01,0x8e,0x01,0x06,0xff,0xb4,0x01,0x8e,0x01,0x08,0xff,0xcf,0x01,0x8e,0x01,0x0b,0xff,0xcf,0x01,0x8e,0x01,0x0d,0xff,0xcf,0x01,0x8e,0x01,0x19,0xff,0xcf,0x01,0x8e,0x01,0x20,0x00,0x27,0x01,0x8e,0x01,0x22,0x00,0x27,0x01,0x8e,0x01,0x45,0xff,0xb6,0x01,0x8e,0x01,0x46, +0xff,0xb4,0x01,0x8e,0x01,0x48,0xff,0xcf,0x01,0x8e,0x01,0x4c,0xff,0xcf,0x01,0x8e,0x01,0x4e,0xff,0xcf,0x01,0x8e,0x01,0x50,0xff,0xcf,0x01,0x8e,0x01,0x52,0xff,0xcf,0x01,0x8e,0x01,0x54,0xff,0xcf,0x01,0x8e,0x01,0x56,0xff,0xcf,0x01,0x8e,0x01,0x5c,0x00,0x64,0x01,0x8e,0x01,0x5e,0x00,0x64,0x01,0x8e,0x01,0x60,0x00,0x64,0x01,0x8e, +0x01,0x6f,0xff,0xcf,0x01,0x8e,0x01,0x71,0xff,0xcf,0x01,0x8e,0x01,0x76,0x00,0x27,0x01,0x8e,0x01,0x85,0xff,0xb6,0x01,0x8e,0x01,0x86,0xff,0xb4,0x01,0x8e,0x01,0x87,0xff,0xb6,0x01,0x8e,0x01,0x88,0xff,0xb4,0x01,0x8e,0x01,0x8a,0xff,0xcf,0x01,0x8f,0x00,0x0f,0xff,0xa6,0x01,0x8f,0x00,0x11,0xff,0x9a,0x01,0x8f,0x00,0x46,0xff,0xfa, +0x01,0x8f,0x00,0x47,0xff,0xf6,0x01,0x8f,0x00,0x48,0xff,0xf6,0x01,0x8f,0x00,0x4a,0xff,0xfa,0x01,0x8f,0x00,0x52,0xff,0xfa,0x01,0x8f,0x00,0x54,0xff,0xf6,0x01,0x8f,0x00,0x6f,0xff,0xfa,0x01,0x8f,0x00,0x70,0xff,0xf6,0x01,0x8f,0x00,0x71,0xff,0xf6,0x01,0x8f,0x00,0x72,0xff,0xf6,0x01,0x8f,0x00,0x73,0xff,0xf6,0x01,0x8f,0x00,0x79, +0xff,0xfa,0x01,0x8f,0x00,0x7a,0xff,0xfa,0x01,0x8f,0x00,0x7b,0xff,0xfa,0x01,0x8f,0x00,0x7c,0xff,0xfa,0x01,0x8f,0x00,0x7d,0xff,0xfa,0x01,0x8f,0x00,0xac,0xff,0x9a,0x01,0x8f,0x00,0xb1,0xff,0xfa,0x01,0x8f,0x00,0xc4,0xff,0xb4,0x01,0x8f,0x00,0xc5,0xff,0xb4,0x01,0x8f,0x00,0xf8,0xff,0xfa,0x01,0x8f,0x00,0xfd,0xff,0xfa,0x01,0x8f, +0x00,0xff,0xff,0xfa,0x01,0x8f,0x01,0x00,0xff,0xf6,0x01,0x8f,0x01,0x08,0xff,0xf6,0x01,0x8f,0x01,0x0b,0xff,0xf6,0x01,0x8f,0x01,0x0d,0xff,0xf6,0x01,0x8f,0x01,0x19,0xff,0xfa,0x01,0x8f,0x01,0x48,0xff,0xfa,0x01,0x8f,0x01,0x4c,0xff,0xf6,0x01,0x8f,0x01,0x4e,0xff,0xf6,0x01,0x8f,0x01,0x50,0xff,0xf6,0x01,0x8f,0x01,0x52,0xff,0xfa, +0x01,0x8f,0x01,0x54,0xff,0xfa,0x01,0x8f,0x01,0x56,0xff,0xfa,0x01,0x8f,0x01,0x6f,0xff,0xfa,0x01,0x8f,0x01,0x71,0xff,0xfa,0x01,0x8f,0x01,0x8a,0xff,0xfa,0x01,0x90,0x00,0x0f,0xff,0x8b,0x01,0x90,0x00,0x11,0xff,0x7f,0x01,0x90,0x00,0x24,0xff,0xb6,0x01,0x90,0x00,0x37,0x00,0x27,0x01,0x90,0x00,0x44,0xff,0xb4,0x01,0x90,0x00,0x46, +0xff,0xcf,0x01,0x90,0x00,0x47,0xff,0xcf,0x01,0x90,0x00,0x48,0xff,0xcf,0x01,0x90,0x00,0x4a,0xff,0xcf,0x01,0x90,0x00,0x52,0xff,0xcf,0x01,0x90,0x00,0x54,0xff,0xcf,0x01,0x90,0x00,0x62,0xff,0xb6,0x01,0x90,0x00,0x63,0xff,0xb6,0x01,0x90,0x00,0x69,0xff,0xb4,0x01,0x90,0x00,0x6a,0xff,0xb4,0x01,0x90,0x00,0x6b,0xff,0xb4,0x01,0x90, +0x00,0x6c,0xff,0xb4,0x01,0x90,0x00,0x6d,0xff,0xb4,0x01,0x90,0x00,0x6e,0xff,0xb4,0x01,0x90,0x00,0x6f,0xff,0xcf,0x01,0x90,0x00,0x70,0xff,0xcf,0x01,0x90,0x00,0x71,0xff,0xcf,0x01,0x90,0x00,0x72,0xff,0xcf,0x01,0x90,0x00,0x73,0xff,0xcf,0x01,0x90,0x00,0x76,0x00,0x31,0x01,0x90,0x00,0x77,0x00,0x64,0x01,0x90,0x00,0x79,0xff,0xcf, +0x01,0x90,0x00,0x7a,0xff,0xcf,0x01,0x90,0x00,0x7b,0xff,0xcf,0x01,0x90,0x00,0x7c,0xff,0xcf,0x01,0x90,0x00,0x7d,0xff,0xcf,0x01,0x90,0x00,0x91,0xff,0x9a,0x01,0x90,0x00,0xa0,0xff,0xb4,0x01,0x90,0x00,0xa2,0xff,0xa4,0x01,0x90,0x00,0xaa,0xff,0xcf,0x01,0x90,0x00,0xab,0x00,0x27,0x01,0x90,0x00,0xac,0xff,0x7f,0x01,0x90,0x00,0xad, +0xff,0xb6,0x01,0x90,0x00,0xae,0xff,0xb6,0x01,0x90,0x00,0xb1,0xff,0xcf,0x01,0x90,0x00,0xbe,0xff,0xcf,0x01,0x90,0x00,0xbf,0x00,0x27,0x01,0x90,0x00,0xc4,0xff,0x7f,0x01,0x90,0x00,0xc5,0xff,0x8b,0x01,0x90,0x00,0xc7,0xff,0xb6,0x01,0x90,0x00,0xc9,0xff,0xb6,0x01,0x90,0x00,0xf8,0xff,0xcf,0x01,0x90,0x00,0xfd,0xff,0xcf,0x01,0x90, +0x00,0xff,0xff,0xcf,0x01,0x90,0x01,0x00,0xff,0xcf,0x01,0x90,0x01,0x03,0xff,0xb6,0x01,0x90,0x01,0x04,0xff,0xb4,0x01,0x90,0x01,0x05,0xff,0xb6,0x01,0x90,0x01,0x06,0xff,0xb4,0x01,0x90,0x01,0x08,0xff,0xcf,0x01,0x90,0x01,0x0b,0xff,0xcf,0x01,0x90,0x01,0x0d,0xff,0xcf,0x01,0x90,0x01,0x19,0xff,0xcf,0x01,0x90,0x01,0x20,0x00,0x27, +0x01,0x90,0x01,0x22,0x00,0x27,0x01,0x90,0x01,0x45,0xff,0xb6,0x01,0x90,0x01,0x46,0xff,0xb4,0x01,0x90,0x01,0x48,0xff,0xcf,0x01,0x90,0x01,0x4c,0xff,0xcf,0x01,0x90,0x01,0x4e,0xff,0xcf,0x01,0x90,0x01,0x50,0xff,0xcf,0x01,0x90,0x01,0x52,0xff,0xcf,0x01,0x90,0x01,0x54,0xff,0xcf,0x01,0x90,0x01,0x56,0xff,0xcf,0x01,0x90,0x01,0x5c, +0x00,0x64,0x01,0x90,0x01,0x5e,0x00,0x64,0x01,0x90,0x01,0x60,0x00,0x64,0x01,0x90,0x01,0x6f,0xff,0xcf,0x01,0x90,0x01,0x71,0xff,0xcf,0x01,0x90,0x01,0x76,0x00,0x27,0x01,0x90,0x01,0x85,0xff,0xb6,0x01,0x90,0x01,0x86,0xff,0xb4,0x01,0x90,0x01,0x87,0xff,0xb6,0x01,0x90,0x01,0x88,0xff,0xb4,0x01,0x90,0x01,0x8a,0xff,0xcf,0x01,0x91, +0x00,0x0f,0xff,0xa6,0x01,0x91,0x00,0x11,0xff,0x9a,0x01,0x91,0x00,0x46,0xff,0xfa,0x01,0x91,0x00,0x47,0xff,0xf6,0x01,0x91,0x00,0x48,0xff,0xf6,0x01,0x91,0x00,0x4a,0xff,0xfa,0x01,0x91,0x00,0x52,0xff,0xfa,0x01,0x91,0x00,0x54,0xff,0xf6,0x01,0x91,0x00,0x6f,0xff,0xfa,0x01,0x91,0x00,0x70,0xff,0xf6,0x01,0x91,0x00,0x71,0xff,0xf6, +0x01,0x91,0x00,0x72,0xff,0xf6,0x01,0x91,0x00,0x73,0xff,0xf6,0x01,0x91,0x00,0x79,0xff,0xfa,0x01,0x91,0x00,0x7a,0xff,0xfa,0x01,0x91,0x00,0x7b,0xff,0xfa,0x01,0x91,0x00,0x7c,0xff,0xfa,0x01,0x91,0x00,0x7d,0xff,0xfa,0x01,0x91,0x00,0xac,0xff,0x9a,0x01,0x91,0x00,0xb1,0xff,0xfa,0x01,0x91,0x00,0xc4,0xff,0xb4,0x01,0x91,0x00,0xc5, +0xff,0xb4,0x01,0x91,0x00,0xf8,0xff,0xfa,0x01,0x91,0x00,0xfd,0xff,0xfa,0x01,0x91,0x00,0xff,0xff,0xfa,0x01,0x91,0x01,0x00,0xff,0xf6,0x01,0x91,0x01,0x08,0xff,0xf6,0x01,0x91,0x01,0x0b,0xff,0xf6,0x01,0x91,0x01,0x0d,0xff,0xf6,0x01,0x91,0x01,0x19,0xff,0xfa,0x01,0x91,0x01,0x48,0xff,0xfa,0x01,0x91,0x01,0x4c,0xff,0xf6,0x01,0x91, +0x01,0x4e,0xff,0xf6,0x01,0x91,0x01,0x50,0xff,0xf6,0x01,0x91,0x01,0x52,0xff,0xfa,0x01,0x91,0x01,0x54,0xff,0xfa,0x01,0x91,0x01,0x56,0xff,0xfa,0x01,0x91,0x01,0x6f,0xff,0xfa,0x01,0x91,0x01,0x71,0xff,0xfa,0x01,0x91,0x01,0x8a,0xff,0xfa,0x01,0x92,0x00,0x0f,0xff,0x50,0x01,0x92,0x00,0x11,0xff,0x3d,0x01,0x92,0x00,0x24,0xff,0x62, +0x01,0x92,0x00,0x26,0xff,0xd3,0x01,0x92,0x00,0x2a,0xff,0xd3,0x01,0x92,0x00,0x2d,0xff,0xbe,0x01,0x92,0x00,0x32,0xff,0xd3,0x01,0x92,0x00,0x34,0xff,0xd3,0x01,0x92,0x00,0x36,0xff,0xe5,0x01,0x92,0x00,0x37,0x00,0x27,0x01,0x92,0x00,0x44,0xff,0x39,0x01,0x92,0x00,0x46,0xff,0x4c,0x01,0x92,0x00,0x47,0xff,0x4c,0x01,0x92,0x00,0x48, +0xff,0x4c,0x01,0x92,0x00,0x49,0xff,0xe5,0x01,0x92,0x00,0x4a,0xff,0x4c,0x01,0x92,0x00,0x50,0xff,0x73,0x01,0x92,0x00,0x51,0xff,0x73,0x01,0x92,0x00,0x52,0xff,0x4c,0x01,0x92,0x00,0x53,0xff,0x73,0x01,0x92,0x00,0x54,0xff,0x4c,0x01,0x92,0x00,0x55,0xff,0x73,0x01,0x92,0x00,0x56,0xff,0x7b,0x01,0x92,0x00,0x58,0xff,0x73,0x01,0x92, +0x00,0x62,0xff,0x62,0x01,0x92,0x00,0x63,0xff,0x62,0x01,0x92,0x00,0x64,0xff,0xcd,0x01,0x92,0x00,0x67,0xff,0xd3,0x01,0x92,0x00,0x69,0xff,0x39,0x01,0x92,0x00,0x6a,0xff,0x39,0x01,0x92,0x00,0x6b,0xff,0x39,0x01,0x92,0x00,0x6c,0xff,0x7f,0x01,0x92,0x00,0x6d,0xff,0x66,0x01,0x92,0x00,0x6e,0xff,0x39,0x01,0x92,0x00,0x6f,0xff,0x4c, +0x01,0x92,0x00,0x70,0xff,0x4c,0x01,0x92,0x00,0x71,0xff,0x4c,0x01,0x92,0x00,0x72,0xff,0x4c,0x01,0x92,0x00,0x73,0xff,0x4c,0x01,0x92,0x00,0x77,0x00,0x5a,0x01,0x92,0x00,0x78,0xff,0x73,0x01,0x92,0x00,0x79,0xff,0x4c,0x01,0x92,0x00,0x7a,0xff,0x4c,0x01,0x92,0x00,0x7b,0xff,0x4c,0x01,0x92,0x00,0x7c,0xff,0x4c,0x01,0x92,0x00,0x7d, +0xff,0x4c,0x01,0x92,0x00,0x7e,0xff,0x73,0x01,0x92,0x00,0x7f,0xff,0x73,0x01,0x92,0x00,0x80,0xff,0x73,0x01,0x92,0x00,0x81,0xff,0x73,0x01,0x92,0x00,0x91,0xff,0x3f,0x01,0x92,0x00,0x92,0xff,0xd3,0x01,0x92,0x00,0xa0,0xff,0x39,0x01,0x92,0x00,0xa2,0xff,0x1b,0x01,0x92,0x00,0xaa,0xff,0xcf,0x01,0x92,0x00,0xac,0xff,0x3d,0x01,0x92, +0x00,0xad,0xff,0x62,0x01,0x92,0x00,0xae,0xff,0x62,0x01,0x92,0x00,0xaf,0xff,0xd3,0x01,0x92,0x00,0xb0,0xff,0xd3,0x01,0x92,0x00,0xb1,0xff,0x4c,0x01,0x92,0x00,0xbe,0xff,0x9a,0x01,0x92,0x00,0xc4,0xff,0x08,0x01,0x92,0x00,0xc5,0xff,0x08,0x01,0x92,0x00,0xc7,0xff,0x62,0x01,0x92,0x00,0xc9,0xff,0x62,0x01,0x92,0x00,0xd0,0xff,0xd3, +0x01,0x92,0x00,0xd1,0xff,0xd3,0x01,0x92,0x00,0xd2,0xff,0xd3,0x01,0x92,0x00,0xe3,0xff,0xe5,0x01,0x92,0x00,0xe4,0xff,0x7b,0x01,0x92,0x00,0xf7,0xff,0xd3,0x01,0x92,0x00,0xf8,0xff,0x4c,0x01,0x92,0x00,0xfa,0xff,0xe5,0x01,0x92,0x00,0xfb,0xff,0x7b,0x01,0x92,0x00,0xfc,0xff,0xd3,0x01,0x92,0x00,0xfd,0xff,0x4c,0x01,0x92,0x00,0xfe, +0xff,0xd3,0x01,0x92,0x00,0xff,0xff,0x4c,0x01,0x92,0x01,0x00,0xff,0x4c,0x01,0x92,0x01,0x03,0xff,0x62,0x01,0x92,0x01,0x04,0xff,0x7f,0x01,0x92,0x01,0x05,0xff,0x62,0x01,0x92,0x01,0x06,0xff,0x39,0x01,0x92,0x01,0x08,0xff,0x4c,0x01,0x92,0x01,0x0b,0xff,0x4c,0x01,0x92,0x01,0x0d,0xff,0x4c,0x01,0x92,0x01,0x15,0xff,0x73,0x01,0x92, +0x01,0x17,0xff,0x73,0x01,0x92,0x01,0x18,0xff,0xd3,0x01,0x92,0x01,0x19,0xff,0x4c,0x01,0x92,0x01,0x1b,0xff,0x73,0x01,0x92,0x01,0x1d,0xff,0x73,0x01,0x92,0x01,0x1e,0xff,0xe5,0x01,0x92,0x01,0x1f,0xff,0x7b,0x01,0x92,0x01,0x20,0x00,0x27,0x01,0x92,0x01,0x22,0x00,0x27,0x01,0x92,0x01,0x25,0xff,0x73,0x01,0x92,0x01,0x27,0xff,0x73, +0x01,0x92,0x01,0x45,0xff,0x62,0x01,0x92,0x01,0x46,0xff,0x7f,0x01,0x92,0x01,0x47,0xff,0xd3,0x01,0x92,0x01,0x48,0xff,0x4c,0x01,0x92,0x01,0x4c,0xff,0x4c,0x01,0x92,0x01,0x4e,0xff,0x4c,0x01,0x92,0x01,0x50,0xff,0x4c,0x01,0x92,0x01,0x51,0xff,0xd3,0x01,0x92,0x01,0x52,0xff,0x4c,0x01,0x92,0x01,0x53,0xff,0xd3,0x01,0x92,0x01,0x54, +0xff,0x4c,0x01,0x92,0x01,0x55,0xff,0xd3,0x01,0x92,0x01,0x56,0xff,0x4c,0x01,0x92,0x01,0x5c,0x00,0x5a,0x01,0x92,0x01,0x5e,0x00,0x5a,0x01,0x92,0x01,0x60,0x00,0x5a,0x01,0x92,0x01,0x63,0xff,0xbe,0x01,0x92,0x01,0x6d,0xff,0x73,0x01,0x92,0x01,0x6e,0xff,0xd3,0x01,0x92,0x01,0x6f,0xff,0x4c,0x01,0x92,0x01,0x70,0xff,0xd3,0x01,0x92, +0x01,0x71,0xff,0x4c,0x01,0x92,0x01,0x73,0xff,0x73,0x01,0x92,0x01,0x74,0xff,0xe5,0x01,0x92,0x01,0x75,0xff,0x7b,0x01,0x92,0x01,0x76,0x00,0x27,0x01,0x92,0x01,0x79,0xff,0x73,0x01,0x92,0x01,0x7b,0xff,0x73,0x01,0x92,0x01,0x7d,0xff,0x73,0x01,0x92,0x01,0x7f,0xff,0x73,0x01,0x92,0x01,0x85,0xff,0x62,0x01,0x92,0x01,0x86,0xff,0x7f, +0x01,0x92,0x01,0x87,0xff,0x62,0x01,0x92,0x01,0x88,0xff,0x39,0x01,0x92,0x01,0x89,0xff,0xd3,0x01,0x92,0x01,0x8a,0xff,0x4c,0x01,0x92,0x02,0x3d,0xff,0xe5,0x01,0x92,0x02,0x3e,0xff,0x7b,0x01,0x93,0x00,0x05,0x00,0x1d,0x01,0x93,0x00,0x0a,0x00,0x1d,0x01,0x93,0x00,0x0f,0xff,0x9a,0x01,0x93,0x00,0x11,0xff,0x81,0x01,0x93,0x00,0x22, +0xff,0xb4,0x01,0x93,0x00,0x46,0xff,0xf6,0x01,0x93,0x00,0x47,0xff,0xf6,0x01,0x93,0x00,0x48,0xff,0xf6,0x01,0x93,0x00,0x49,0x00,0x04,0x01,0x93,0x00,0x4a,0xff,0xf6,0x01,0x93,0x00,0x52,0xff,0xf6,0x01,0x93,0x00,0x54,0xff,0xf6,0x01,0x93,0x00,0x57,0x00,0x06,0x01,0x93,0x00,0x6f,0xff,0xf6,0x01,0x93,0x00,0x70,0xff,0xf6,0x01,0x93, +0x00,0x71,0xff,0xf6,0x01,0x93,0x00,0x72,0xff,0xf6,0x01,0x93,0x00,0x73,0xff,0xf6,0x01,0x93,0x00,0x79,0xff,0xf6,0x01,0x93,0x00,0x7a,0xff,0xf6,0x01,0x93,0x00,0x7b,0xff,0xf6,0x01,0x93,0x00,0x7c,0xff,0xf6,0x01,0x93,0x00,0x7d,0xff,0xf6,0x01,0x93,0x00,0xac,0xff,0x81,0x01,0x93,0x00,0xb1,0xff,0xf6,0x01,0x93,0x00,0xbf,0x00,0x0c, +0x01,0x93,0x00,0xc4,0xff,0x8d,0x01,0x93,0x00,0xc5,0xff,0x8d,0x01,0x93,0x00,0xf8,0xff,0xf6,0x01,0x93,0x00,0xfd,0xff,0xf6,0x01,0x93,0x00,0xff,0xff,0xf6,0x01,0x93,0x01,0x00,0xff,0xf6,0x01,0x93,0x01,0x08,0xff,0xf6,0x01,0x93,0x01,0x0b,0xff,0xf6,0x01,0x93,0x01,0x0d,0xff,0xf6,0x01,0x93,0x01,0x19,0xff,0xf6,0x01,0x93,0x01,0x21, +0x00,0x06,0x01,0x93,0x01,0x23,0x00,0x06,0x01,0x93,0x01,0x48,0xff,0xf6,0x01,0x93,0x01,0x4c,0xff,0xf6,0x01,0x93,0x01,0x4e,0xff,0xf6,0x01,0x93,0x01,0x50,0xff,0xf6,0x01,0x93,0x01,0x52,0xff,0xf6,0x01,0x93,0x01,0x54,0xff,0xf6,0x01,0x93,0x01,0x56,0xff,0xf6,0x01,0x93,0x01,0x6f,0xff,0xf6,0x01,0x93,0x01,0x71,0xff,0xf6,0x01,0x93, +0x01,0x77,0x00,0x06,0x01,0x93,0x01,0x8a,0xff,0xf6,0x01,0xa1,0x00,0x0d,0xff,0x7f,0x01,0xa1,0x00,0x8d,0xff,0x98,0x01,0xa1,0x00,0xb4,0xff,0x66,0x01,0xa1,0x00,0xb5,0xff,0x3d,0x01,0xa1,0x00,0xb6,0xff,0x66,0x01,0xa1,0x00,0xb7,0xff,0x3d,0x01,0xa1,0x01,0x2d,0xff,0xe5,0x01,0xa1,0x01,0x2e,0xff,0xcf,0x01,0xa1,0x01,0x33,0xff,0x8f, +0x01,0xa1,0x01,0xb4,0xff,0xe5,0x01,0xa1,0x01,0xb7,0x00,0x3d,0x01,0xa1,0x01,0xb8,0xff,0x6d,0x01,0xa1,0x01,0xb9,0xff,0x64,0x01,0xa1,0x01,0xbb,0xff,0x79,0x01,0xa1,0x01,0xbe,0xff,0x64,0x01,0xa1,0x01,0xc5,0xff,0xaa,0x01,0xa1,0x01,0xc8,0xff,0xe7,0x01,0xa1,0x01,0xd3,0xff,0xcf,0x01,0xa2,0x00,0xa9,0x00,0x0c,0x01,0xa2,0x01,0xa8, +0x00,0x0a,0x01,0xa2,0x01,0xa9,0x00,0x0c,0x01,0xa2,0x01,0xb0,0x00,0x0c,0x01,0xa2,0x01,0xb8,0x00,0x33,0x01,0xa5,0x01,0xa9,0xff,0xe5,0x01,0xa5,0x01,0xb0,0xff,0xe5,0x01,0xa5,0x01,0xb8,0xff,0xa4,0x01,0xa5,0x01,0xb9,0xff,0xe7,0x01,0xa5,0x01,0xbe,0xff,0xe7,0x01,0xa5,0x01,0xcb,0xff,0xd7,0x01,0xa6,0x00,0x04,0xff,0xd7,0x01,0xa6, +0x00,0x11,0xff,0x71,0x01,0xa6,0x00,0x1e,0xff,0x4c,0x01,0xa6,0x00,0xa2,0xff,0xd7,0x01,0xa6,0x00,0xa9,0xff,0x71,0x01,0xa6,0x00,0xac,0xff,0x71,0x01,0xa6,0x01,0x2d,0xff,0xd3,0x01,0xa6,0x01,0x2e,0xff,0xd3,0x01,0xa6,0x01,0x2f,0xff,0x4c,0x01,0xa6,0x01,0x30,0xff,0xc3,0x01,0xa6,0x01,0x31,0xff,0x9c,0x01,0xa6,0x01,0x32,0xff,0x4c, +0x01,0xa6,0x01,0x33,0xff,0xcf,0x01,0xa6,0x01,0x34,0xff,0x4c,0x01,0xa6,0x01,0xa9,0xff,0x60,0x01,0xa6,0x01,0xb0,0xff,0x60,0x01,0xa6,0x01,0xb4,0xff,0xd3,0x01,0xa6,0x01,0xb8,0x00,0x29,0x01,0xa6,0x01,0xbf,0xff,0x4c,0x01,0xa6,0x01,0xc0,0xff,0x9c,0x01,0xa6,0x01,0xc3,0xff,0x9a,0x01,0xa6,0x01,0xc6,0xff,0xc1,0x01,0xa6,0x01,0xc7, +0xff,0x71,0x01,0xa6,0x01,0xc9,0xff,0xd7,0x01,0xa6,0x01,0xca,0xff,0x71,0x01,0xa6,0x01,0xcc,0xff,0x71,0x01,0xa6,0x01,0xce,0xff,0xb0,0x01,0xa6,0x01,0xcf,0xff,0x4c,0x01,0xa6,0x01,0xd0,0xff,0x71,0x01,0xa6,0x01,0xd1,0xff,0x4c,0x01,0xa6,0x01,0xd2,0xff,0x9a,0x01,0xa6,0x01,0xd3,0xff,0xdb,0x01,0xa6,0x01,0xd4,0xff,0x9a,0x01,0xa6, +0x01,0xd5,0xff,0x4c,0x01,0xa6,0x01,0xd7,0xff,0x9a,0x01,0xa6,0x01,0xd8,0xff,0x4c,0x01,0xa6,0x01,0xd9,0xff,0x9a,0x01,0xa6,0x01,0xda,0xff,0x4c,0x01,0xa6,0x02,0x37,0xff,0xcf,0x01,0xa8,0x01,0xcb,0x00,0x6a,0x01,0xa9,0x00,0x0d,0xff,0x7f,0x01,0xa9,0x00,0x0f,0x00,0x46,0x01,0xa9,0x00,0x1e,0x00,0x46,0x01,0xa9,0x00,0x8d,0xff,0x98, +0x01,0xa9,0x00,0xa4,0xff,0xf6,0x01,0xa9,0x00,0xb4,0xff,0x66,0x01,0xa9,0x00,0xb5,0xff,0x3d,0x01,0xa9,0x00,0xb6,0xff,0x66,0x01,0xa9,0x00,0xb7,0xff,0x3d,0x01,0xa9,0x01,0x2d,0xff,0xe5,0x01,0xa9,0x01,0x2e,0xff,0xcf,0x01,0xa9,0x01,0x33,0xff,0x8f,0x01,0xa9,0x01,0xb4,0xff,0xe5,0x01,0xa9,0x01,0xb7,0x00,0x3d,0x01,0xa9,0x01,0xb8, +0xff,0x6d,0x01,0xa9,0x01,0xb9,0xff,0x64,0x01,0xa9,0x01,0xbb,0xff,0x79,0x01,0xa9,0x01,0xbe,0xff,0x64,0x01,0xa9,0x01,0xc5,0xff,0xaa,0x01,0xa9,0x01,0xc8,0xff,0xe7,0x01,0xa9,0x01,0xcb,0x00,0x3d,0x01,0xa9,0x01,0xcd,0xff,0xcf,0x01,0xa9,0x01,0xd3,0xff,0xcf,0x01,0xa9,0x01,0xd4,0xff,0xf6,0x01,0xaa,0x00,0xc4,0xff,0xb0,0x01,0xaa, +0x00,0xc5,0xff,0xb0,0x01,0xaa,0x01,0xb8,0xff,0xa4,0x01,0xaa,0x01,0xb9,0xff,0xbe,0x01,0xaa,0x01,0xbb,0xff,0xe7,0x01,0xaa,0x01,0xbe,0xff,0xbe,0x01,0xaa,0x01,0xd3,0xff,0xe7,0x01,0xab,0x00,0xa9,0x00,0x0c,0x01,0xab,0x01,0xa8,0x00,0x0a,0x01,0xab,0x01,0xa9,0x00,0x0c,0x01,0xab,0x01,0xb0,0x00,0x0c,0x01,0xab,0x01,0xb8,0x00,0x33, +0x01,0xab,0x01,0xba,0x00,0x0a,0x01,0xac,0x00,0xab,0x00,0x29,0x01,0xac,0x00,0xbf,0x00,0x52,0x01,0xac,0x01,0xa8,0x00,0x3d,0x01,0xac,0x01,0xb8,0x00,0x29,0x01,0xac,0x01,0xcb,0x00,0x25,0x01,0xaf,0x00,0x0f,0x00,0x29,0x01,0xaf,0x00,0x1e,0x00,0x29,0x01,0xaf,0x00,0xc4,0x00,0x46,0x01,0xaf,0x00,0xc5,0x00,0x46,0x01,0xaf,0x01,0x2d, +0xff,0xa6,0x01,0xaf,0x01,0x2e,0xff,0x91,0x01,0xaf,0x01,0x2f,0xff,0xe7,0x01,0xaf,0x01,0x30,0xff,0xe7,0x01,0xaf,0x01,0x32,0xff,0xe7,0x01,0xaf,0x01,0x33,0xff,0x9a,0x01,0xaf,0x01,0x34,0xff,0xe7,0x01,0xaf,0x01,0xa8,0x00,0x4a,0x01,0xaf,0x01,0xac,0x00,0x29,0x01,0xaf,0x01,0xb4,0xff,0xa6,0x01,0xaf,0x01,0xb7,0x00,0x3f,0x01,0xaf, +0x01,0xba,0x00,0x25,0x01,0xaf,0x01,0xbb,0xff,0xdb,0x01,0xaf,0x01,0xbf,0xff,0xe7,0x01,0xaf,0x01,0xc2,0xff,0xe7,0x01,0xaf,0x01,0xc3,0xff,0xe7,0x01,0xaf,0x01,0xc5,0xff,0xd1,0x01,0xaf,0x01,0xc8,0xff,0xe7,0x01,0xaf,0x01,0xc9,0xff,0xe7,0x01,0xaf,0x01,0xca,0x00,0x29,0x01,0xaf,0x01,0xcb,0x00,0x3d,0x01,0xaf,0x01,0xcc,0x00,0x29, +0x01,0xaf,0x01,0xcf,0xff,0xe7,0x01,0xaf,0x01,0xd1,0xff,0xe7,0x01,0xaf,0x01,0xd2,0xff,0xe7,0x01,0xaf,0x01,0xd4,0xff,0xe7,0x01,0xaf,0x01,0xd5,0xff,0xe7,0x01,0xaf,0x01,0xd7,0xff,0xe7,0x01,0xaf,0x01,0xd9,0xff,0xe7,0x01,0xaf,0x01,0xda,0xff,0xe7,0x01,0xb0,0x00,0x0d,0xff,0x7f,0x01,0xb0,0x00,0x8d,0xff,0x98,0x01,0xb0,0x00,0xb4, +0xff,0x66,0x01,0xb0,0x00,0xb5,0xff,0x3d,0x01,0xb0,0x00,0xb6,0xff,0x66,0x01,0xb0,0x00,0xb7,0xff,0x3d,0x01,0xb0,0x01,0x2d,0xff,0xe5,0x01,0xb0,0x01,0x2e,0xff,0xcf,0x01,0xb0,0x01,0x33,0xff,0x8f,0x01,0xb0,0x01,0xb4,0xff,0xe5,0x01,0xb0,0x01,0xb7,0x00,0x3d,0x01,0xb0,0x01,0xb8,0xff,0x6d,0x01,0xb0,0x01,0xb9,0xff,0x64,0x01,0xb0, +0x01,0xbb,0xff,0x79,0x01,0xb0,0x01,0xbe,0xff,0x64,0x01,0xb0,0x01,0xc3,0xff,0xf6,0x01,0xb0,0x01,0xc5,0xff,0xaa,0x01,0xb0,0x01,0xc8,0xff,0xe7,0x01,0xb0,0x01,0xcb,0x00,0x3d,0x01,0xb0,0x01,0xcd,0xff,0xcf,0x01,0xb0,0x01,0xd3,0xff,0xcf,0x01,0xb0,0x01,0xd4,0xff,0xf6,0x01,0xb0,0x01,0xd9,0xff,0xf6,0x01,0xb3,0x01,0xa8,0x00,0x3d, +0x01,0xb3,0x01,0xb7,0x00,0x25,0x01,0xb3,0x01,0xcb,0x00,0x3d,0x01,0xb4,0x00,0x0f,0xff,0xa2,0x01,0xb4,0x00,0xa9,0xff,0xcf,0x01,0xb4,0x00,0xc4,0xff,0x4a,0x01,0xb4,0x00,0xc5,0xff,0x96,0x01,0xb4,0x01,0xa9,0xff,0xe5,0x01,0xb4,0x01,0xac,0xff,0xcd,0x01,0xb4,0x01,0xb0,0xff,0xe5,0x01,0xb4,0x01,0xb7,0xff,0xe3,0x01,0xb4,0x01,0xb8, +0xff,0xa4,0x01,0xb4,0x01,0xb9,0xff,0xe7,0x01,0xb4,0x01,0xba,0xff,0xdb,0x01,0xb4,0x01,0xbe,0xff,0xe7,0x01,0xb4,0x01,0xcb,0xff,0xd7,0x01,0xb6,0x00,0x0f,0xfe,0xba,0x01,0xb6,0x00,0x11,0xfe,0xba,0x01,0xb6,0x00,0xa9,0xff,0x58,0x01,0xb6,0x00,0xac,0xfe,0xba,0x01,0xb6,0x00,0xc4,0xfe,0xba,0x01,0xb6,0x00,0xc5,0xfe,0xae,0x01,0xb6, +0x01,0x2f,0xff,0xb2,0x01,0xb6,0x01,0x30,0xff,0xb2,0x01,0xb6,0x01,0x32,0xff,0xb2,0x01,0xb6,0x01,0x34,0xff,0xb2,0x01,0xb6,0x01,0xa9,0xff,0x60,0x01,0xb6,0x01,0xb0,0xff,0x60,0x01,0xb6,0x01,0xba,0xff,0xc3,0x01,0xb6,0x01,0xbf,0xff,0xb2,0x01,0xb6,0x01,0xcb,0xff,0xc3,0x01,0xb6,0x01,0xcf,0xff,0xb2,0x01,0xb6,0x01,0xd0,0xff,0xa0, +0x01,0xb6,0x01,0xd1,0xff,0xc3,0x01,0xb6,0x01,0xd5,0xff,0xc3,0x01,0xb6,0x01,0xd8,0xff,0xb2,0x01,0xb7,0x00,0xa9,0x00,0x3d,0x01,0xb7,0x01,0x2d,0xff,0xe7,0x01,0xb7,0x01,0x2e,0xff,0xe7,0x01,0xb7,0x01,0x33,0xff,0xb6,0x01,0xb7,0x01,0xa9,0x00,0x3d,0x01,0xb7,0x01,0xb0,0x00,0x3d,0x01,0xb7,0x01,0xb3,0x00,0x25,0x01,0xb7,0x01,0xb4, +0xff,0xe7,0x01,0xb7,0x01,0xba,0x00,0x12,0x01,0xb7,0x01,0xcb,0x00,0x3d,0x01,0xb7,0x01,0xd3,0xff,0xdb,0x01,0xb8,0x00,0x0f,0xff,0x7d,0x01,0xb8,0x00,0x11,0xff,0x4c,0x01,0xb8,0x00,0x1d,0xff,0x7d,0x01,0xb8,0x00,0x1e,0xff,0xe9,0x01,0xb8,0x00,0x8d,0x00,0x52,0x01,0xb8,0x00,0xa9,0xff,0x6d,0x01,0xb8,0x00,0xaa,0xff,0x98,0x01,0xb8, +0x00,0xab,0xff,0xcd,0x01,0xb8,0x00,0xac,0xff,0x4c,0x01,0xb8,0x00,0xb5,0x00,0x29,0x01,0xb8,0x00,0xb7,0x00,0x29,0x01,0xb8,0x00,0xbe,0xff,0x98,0x01,0xb8,0x00,0xbf,0xff,0xcd,0x01,0xb8,0x00,0xc4,0xff,0x14,0x01,0xb8,0x00,0xc5,0xff,0x14,0x01,0xb8,0x01,0x2d,0xff,0xa4,0x01,0xb8,0x01,0x2e,0xff,0xa4,0x01,0xb8,0x01,0x2f,0xff,0x2b, +0x01,0xb8,0x01,0x30,0xff,0xb0,0x01,0xb8,0x01,0x31,0xff,0x2b,0x01,0xb8,0x01,0x32,0xff,0x2b,0x01,0xb8,0x01,0x33,0xff,0x8f,0x01,0xb8,0x01,0x34,0xff,0x2b,0x01,0xb8,0x01,0xa8,0x00,0x7b,0x01,0xb8,0x01,0xa9,0xff,0x66,0x01,0xb8,0x01,0xb0,0xff,0x66,0x01,0xb8,0x01,0xb4,0xff,0xa4,0x01,0xb8,0x01,0xb8,0x00,0x29,0x01,0xb8,0x01,0xb9, +0x00,0x1d,0x01,0xb8,0x01,0xba,0xff,0xf8,0x01,0xb8,0x01,0xbe,0x00,0x1d,0x01,0xb8,0x01,0xbf,0xff,0x2b,0x01,0xb8,0x01,0xc0,0xff,0x2b,0x01,0xb8,0x01,0xc1,0xff,0x4e,0x01,0xb8,0x01,0xc2,0xff,0x8f,0x01,0xb8,0x01,0xc3,0xff,0x4e,0x01,0xb8,0x01,0xc5,0xff,0xc1,0x01,0xb8,0x01,0xc6,0xff,0xc1,0x01,0xb8,0x01,0xc7,0xff,0x4e,0x01,0xb8, +0x01,0xc9,0xff,0x4e,0x01,0xb8,0x01,0xca,0xff,0x4e,0x01,0xb8,0x01,0xcc,0xff,0x4e,0x01,0xb8,0x01,0xce,0xff,0xb0,0x01,0xb8,0x01,0xcf,0xff,0x2b,0x01,0xb8,0x01,0xd0,0xff,0x4e,0x01,0xb8,0x01,0xd1,0xff,0x2b,0x01,0xb8,0x01,0xd2,0xff,0x4e,0x01,0xb8,0x01,0xd3,0xff,0x7f,0x01,0xb8,0x01,0xd4,0xff,0x4e,0x01,0xb8,0x01,0xd5,0xff,0x2b, +0x01,0xb8,0x01,0xd6,0x00,0x52,0x01,0xb8,0x01,0xd7,0xff,0x4e,0x01,0xb8,0x01,0xd8,0xff,0x2b,0x01,0xb8,0x01,0xd9,0xff,0x4e,0x01,0xb8,0x01,0xda,0xff,0x2b,0x01,0xb8,0x02,0x37,0xff,0x8f,0x01,0xb9,0x00,0x0f,0xff,0x50,0x01,0xb9,0x00,0x11,0xff,0x3d,0x01,0xb9,0x00,0x1e,0xff,0x4c,0x01,0xb9,0x00,0xa2,0xff,0x19,0x01,0xb9,0x00,0xa9, +0xff,0x71,0x01,0xb9,0x00,0xaa,0xff,0xcd,0x01,0xb9,0x00,0xac,0xff,0x3d,0x01,0xb9,0x00,0xbe,0xff,0x98,0x01,0xb9,0x00,0xc4,0xff,0x06,0x01,0xb9,0x00,0xc5,0xff,0x06,0x01,0xb9,0x01,0x2d,0xff,0xd3,0x01,0xb9,0x01,0x2e,0xff,0xd3,0x01,0xb9,0x01,0x2f,0xff,0x4c,0x01,0xb9,0x01,0x30,0xff,0xc3,0x01,0xb9,0x01,0x31,0xff,0x9c,0x01,0xb9, +0x01,0x32,0xff,0x4c,0x01,0xb9,0x01,0x33,0xff,0xcf,0x01,0xb9,0x01,0x34,0xff,0x4c,0x01,0xb9,0x01,0xa8,0x00,0x5c,0x01,0xb9,0x01,0xa9,0xff,0x60,0x01,0xb9,0x01,0xb0,0xff,0x60,0x01,0xb9,0x01,0xb4,0xff,0xd3,0x01,0xb9,0x01,0xb8,0x00,0x29,0x01,0xb9,0x01,0xbf,0xff,0x4c,0x01,0xb9,0x01,0xc0,0xff,0x9c,0x01,0xb9,0x01,0xc2,0xff,0x9a, +0x01,0xb9,0x01,0xc3,0xff,0x9a,0x01,0xb9,0x01,0xc6,0xff,0xc1,0x01,0xb9,0x01,0xc7,0xff,0x71,0x01,0xb9,0x01,0xc9,0xff,0x9a,0x01,0xb9,0x01,0xca,0xff,0x71,0x01,0xb9,0x01,0xcc,0xff,0x71,0x01,0xb9,0x01,0xce,0xff,0xb0,0x01,0xb9,0x01,0xcf,0xff,0x4c,0x01,0xb9,0x01,0xd0,0xff,0x71,0x01,0xb9,0x01,0xd1,0xff,0x4c,0x01,0xb9,0x01,0xd2, +0xff,0x9a,0x01,0xb9,0x01,0xd3,0xff,0xdb,0x01,0xb9,0x01,0xd4,0xff,0x9a,0x01,0xb9,0x01,0xd5,0xff,0x4c,0x01,0xb9,0x01,0xd6,0x00,0x29,0x01,0xb9,0x01,0xd7,0xff,0x9a,0x01,0xb9,0x01,0xd8,0xff,0x4c,0x01,0xb9,0x01,0xd9,0xff,0x9a,0x01,0xb9,0x01,0xda,0xff,0x4c,0x01,0xb9,0x02,0x37,0xff,0xcf,0x01,0xba,0x00,0x0f,0x00,0x46,0x01,0xba, +0x00,0x10,0xff,0xe7,0x01,0xba,0x00,0x11,0x00,0x39,0x01,0xba,0x00,0x1e,0x00,0x52,0x01,0xba,0x00,0xa9,0x00,0x3d,0x01,0xba,0x00,0xac,0x00,0x39,0x01,0xba,0x00,0xc4,0x00,0x46,0x01,0xba,0x00,0xc5,0x00,0x52,0x01,0xba,0x01,0x2d,0xff,0xe7,0x01,0xba,0x01,0x2e,0xff,0xe7,0x01,0xba,0x01,0x33,0xff,0xc3,0x01,0xba,0x01,0xa8,0x00,0x52, +0x01,0xba,0x01,0xb4,0xff,0xe7,0x01,0xba,0x01,0xb7,0x00,0x12,0x01,0xba,0x01,0xb8,0x00,0x23,0x01,0xba,0x01,0xc2,0xff,0xe7,0x01,0xba,0x01,0xc3,0xff,0xe7,0x01,0xba,0x01,0xc9,0xff,0xe7,0x01,0xba,0x01,0xd2,0xff,0xe7,0x01,0xba,0x01,0xd4,0xff,0xe7,0x01,0xba,0x01,0xd6,0x00,0x0a,0x01,0xba,0x01,0xd7,0xff,0xe7,0x01,0xba,0x01,0xd9, +0xff,0xe7,0x01,0xbb,0x00,0xa9,0xff,0x71,0x01,0xbb,0x01,0x2f,0xff,0xe7,0x01,0xbb,0x01,0x30,0xff,0xe7,0x01,0xbb,0x01,0x32,0xff,0xe7,0x01,0xbb,0x01,0x34,0xff,0xe7,0x01,0xbb,0x01,0xa9,0xff,0x6d,0x01,0xbb,0x01,0xb0,0xff,0x6d,0x01,0xbb,0x01,0xbf,0xff,0xe7,0x01,0xbb,0x01,0xcf,0xff,0xe7,0x01,0xbb,0x01,0xd1,0xff,0xe7,0x01,0xbb, +0x01,0xd5,0xff,0xe7,0x01,0xbb,0x01,0xd8,0xff,0xe7,0x01,0xbb,0x01,0xda,0xff,0xe7,0x01,0xbc,0x00,0xa9,0x00,0x12,0x01,0xbe,0x00,0x04,0xff,0xd7,0x01,0xbe,0x00,0x11,0xff,0x71,0x01,0xbe,0x00,0x1e,0xff,0x4c,0x01,0xbe,0x00,0xa2,0xff,0xd7,0x01,0xbe,0x00,0xa9,0xff,0x71,0x01,0xbe,0x00,0xac,0xff,0x71,0x01,0xbe,0x01,0x2d,0xff,0xd3, +0x01,0xbe,0x01,0x2e,0xff,0xd3,0x01,0xbe,0x01,0x2f,0xff,0x4c,0x01,0xbe,0x01,0x30,0xff,0xc3,0x01,0xbe,0x01,0x31,0xff,0x9c,0x01,0xbe,0x01,0x32,0xff,0x4c,0x01,0xbe,0x01,0x33,0xff,0xcf,0x01,0xbe,0x01,0x34,0xff,0x4c,0x01,0xbe,0x01,0xa9,0xff,0x60,0x01,0xbe,0x01,0xb0,0xff,0x60,0x01,0xbe,0x01,0xb4,0xff,0xd3,0x01,0xbe,0x01,0xb8, +0x00,0x29,0x01,0xbe,0x01,0xbf,0xff,0x4c,0x01,0xbe,0x01,0xc0,0xff,0x9c,0x01,0xbe,0x01,0xc3,0xff,0x9a,0x01,0xbe,0x01,0xc6,0xff,0xc1,0x01,0xbe,0x01,0xc7,0xff,0x71,0x01,0xbe,0x01,0xc9,0xff,0xd7,0x01,0xbe,0x01,0xca,0xff,0x71,0x01,0xbe,0x01,0xcc,0xff,0x71,0x01,0xbe,0x01,0xce,0xff,0xb0,0x01,0xbe,0x01,0xcf,0xff,0x4c,0x01,0xbe, +0x01,0xd0,0xff,0x71,0x01,0xbe,0x01,0xd1,0xff,0x4c,0x01,0xbe,0x01,0xd2,0xff,0x9a,0x01,0xbe,0x01,0xd3,0xff,0xdb,0x01,0xbe,0x01,0xd4,0xff,0x9a,0x01,0xbe,0x01,0xd5,0xff,0x4c,0x01,0xbe,0x01,0xd7,0xff,0x9a,0x01,0xbe,0x01,0xd8,0xff,0x4c,0x01,0xbe,0x01,0xd9,0xff,0x9a,0x01,0xbe,0x01,0xda,0xff,0x4c,0x01,0xbe,0x02,0x37,0xff,0xcf, +0x01,0xbf,0x00,0x1e,0xff,0xee,0x01,0xbf,0x01,0x2f,0xff,0xee,0x01,0xbf,0x01,0x30,0xff,0xee,0x01,0xbf,0x01,0x32,0xff,0xee,0x01,0xbf,0x01,0x34,0xff,0xee,0x01,0xbf,0x01,0xcf,0xff,0xee,0x01,0xbf,0x01,0xd1,0xff,0xee,0x01,0xbf,0x01,0xd5,0xff,0xee,0x01,0xc1,0x00,0x05,0xff,0x98,0x01,0xc1,0x00,0x0a,0xff,0x98,0x01,0xc2,0x01,0xcb, +0x00,0x6a,0x01,0xc3,0x00,0x05,0xff,0x6f,0x01,0xc3,0x00,0x0a,0xff,0x6f,0x01,0xc3,0x01,0xc5,0xff,0xdb,0x01,0xc3,0x01,0xcb,0xff,0xe7,0x01,0xc3,0x01,0xd3,0xff,0xe7,0x01,0xc4,0x01,0x33,0xff,0xd1,0x01,0xc4,0x01,0xd3,0xff,0xc1,0x01,0xc5,0x01,0x30,0xff,0xe5,0x01,0xc5,0x01,0x33,0x00,0x19,0x01,0xc5,0x01,0xc8,0x00,0x19,0x01,0xc5, +0x01,0xd0,0xff,0xe7,0x01,0xc5,0x02,0x37,0x00,0x19,0x01,0xc6,0x01,0x2f,0xff,0xb6,0x01,0xc6,0x01,0x30,0xff,0xb6,0x01,0xc6,0x01,0x32,0xff,0xb6,0x01,0xc6,0x01,0x33,0xff,0x81,0x01,0xc6,0x01,0x34,0xff,0xb6,0x01,0xc6,0x01,0xa8,0x00,0x3d,0x01,0xc6,0x01,0xbf,0xff,0xb6,0x01,0xc6,0x01,0xc3,0xff,0xe7,0x01,0xc6,0x01,0xc5,0xff,0xc3, +0x01,0xc6,0x01,0xcd,0xff,0x8f,0x01,0xc6,0x01,0xcf,0xff,0xb6,0x01,0xc6,0x01,0xd1,0xff,0xb6,0x01,0xc6,0x01,0xd2,0xff,0xe7,0x01,0xc6,0x01,0xd4,0xff,0xc3,0x01,0xc6,0x01,0xd5,0xff,0xb6,0x01,0xc6,0x01,0xd7,0xff,0xe7,0x01,0xc6,0x01,0xd8,0xff,0xb6,0x01,0xc6,0x01,0xd9,0xff,0xe7,0x01,0xc7,0x00,0x05,0xff,0x98,0x01,0xc7,0x00,0x0a, +0xff,0x98,0x01,0xc9,0x01,0xcb,0x00,0x6a,0x01,0xca,0x00,0x0f,0x00,0x29,0x01,0xca,0x00,0x10,0xff,0xb8,0x01,0xca,0x00,0x11,0x00,0x29,0x01,0xca,0x00,0x1d,0x00,0x52,0x01,0xca,0x00,0x1e,0x00,0x52,0x01,0xca,0x00,0xac,0x00,0x29,0x01,0xca,0x01,0x2f,0xff,0xd7,0x01,0xca,0x01,0x30,0xff,0xd7,0x01,0xca,0x01,0x32,0xff,0xd7,0x01,0xca, +0x01,0x34,0xff,0xd7,0x01,0xca,0x01,0xbf,0xff,0xd7,0x01,0xca,0x01,0xcb,0x00,0x31,0x01,0xca,0x01,0xcf,0xff,0xd7,0x01,0xca,0x01,0xd1,0xff,0xd7,0x01,0xca,0x01,0xd5,0xff,0xd7,0x01,0xca,0x01,0xd8,0xff,0xd7,0x01,0xca,0x01,0xda,0xff,0xd7,0x01,0xcb,0x01,0x33,0xff,0xb0,0x01,0xcb,0x01,0xc3,0xff,0xdb,0x01,0xcb,0x01,0xcb,0x00,0x31, +0x01,0xcb,0x01,0xcd,0xff,0xd1,0x01,0xcb,0x01,0xd2,0xff,0xdb,0x01,0xcb,0x01,0xd3,0xff,0xcf,0x01,0xcb,0x01,0xd4,0xff,0xdb,0x01,0xcb,0x01,0xd7,0xff,0xdb,0x01,0xcb,0x01,0xd9,0xff,0xdb,0x01,0xcd,0x01,0x2f,0xff,0xd7,0x01,0xcd,0x01,0x30,0xff,0xd7,0x01,0xcd,0x01,0x32,0xff,0xd7,0x01,0xcd,0x01,0x34,0xff,0xd7,0x01,0xcd,0x01,0xbf, +0xff,0xd7,0x01,0xcd,0x01,0xcb,0xff,0xb6,0x01,0xcd,0x01,0xce,0xff,0xe7,0x01,0xcd,0x01,0xcf,0xff,0xd7,0x01,0xcd,0x01,0xd0,0xff,0xdb,0x01,0xcd,0x01,0xd1,0xff,0xec,0x01,0xcd,0x01,0xd5,0xff,0xd7,0x01,0xcd,0x01,0xd8,0xff,0xd7,0x01,0xcd,0x01,0xda,0xff,0xd7,0x01,0xce,0x01,0x2f,0xff,0xd7,0x01,0xce,0x01,0x30,0xff,0xd7,0x01,0xce, +0x01,0x32,0xff,0xd7,0x01,0xce,0x01,0x34,0xff,0xd7,0x01,0xce,0x01,0xbf,0xff,0xd7,0x01,0xce,0x01,0xcf,0xff,0xd7,0x01,0xce,0x01,0xd5,0xff,0xd7,0x01,0xce,0x01,0xda,0xff,0xd7,0x01,0xcf,0x00,0x05,0xff,0x6f,0x01,0xcf,0x00,0x0a,0xff,0x6f,0x01,0xcf,0x00,0xb4,0xff,0xb0,0x01,0xcf,0x00,0xb5,0xff,0x7b,0x01,0xcf,0x00,0xb6,0xff,0xbc, +0x01,0xcf,0x00,0xb7,0xff,0x7b,0x01,0xcf,0x01,0x33,0xff,0xdb,0x01,0xcf,0x01,0xc5,0xff,0xdb,0x01,0xcf,0x01,0xd3,0xff,0xc3,0x01,0xcf,0x02,0x37,0xff,0xdb,0x01,0xd0,0x00,0x05,0xff,0x6f,0x01,0xd0,0x00,0x0a,0xff,0x6f,0x01,0xd0,0x00,0xb4,0xff,0xb0,0x01,0xd0,0x00,0xb5,0xff,0x7b,0x01,0xd0,0x00,0xb6,0xff,0xbc,0x01,0xd0,0x00,0xb7, +0xff,0x7b,0x01,0xd0,0x01,0x33,0xff,0xdb,0x01,0xd0,0x01,0xc5,0xff,0xe7,0x01,0xd0,0x01,0xd3,0xff,0xc3,0x01,0xd0,0x02,0x37,0xff,0xdb,0x01,0xd1,0x01,0x2f,0xff,0xc3,0x01,0xd1,0x01,0x30,0xff,0xc3,0x01,0xd1,0x01,0x32,0xff,0xc3,0x01,0xd1,0x01,0x34,0xff,0xc3,0x01,0xd1,0x01,0xbf,0xff,0xc3,0x01,0xd1,0x01,0xcb,0x00,0x25,0x01,0xd1, +0x01,0xcf,0xff,0xc3,0x01,0xd1,0x01,0xd8,0xff,0xc3,0x01,0xd1,0x01,0xda,0xff,0xc3,0x01,0xd2,0x00,0x05,0xff,0x6f,0x01,0xd2,0x00,0x0a,0xff,0x6f,0x01,0xd2,0x00,0xb4,0xff,0xb0,0x01,0xd2,0x00,0xb5,0xff,0x7b,0x01,0xd2,0x00,0xb6,0xff,0xbc,0x01,0xd2,0x00,0xb7,0xff,0x7b,0x01,0xd2,0x01,0x33,0xff,0xdb,0x01,0xd2,0x01,0xc5,0xff,0xdb, +0x01,0xd2,0x01,0xcb,0xff,0xe7,0x01,0xd2,0x01,0xd3,0xff,0xe7,0x01,0xd2,0x02,0x37,0xff,0xdb,0x01,0xd3,0x00,0x10,0xff,0xe7,0x01,0xd3,0x01,0x2f,0xff,0xc3,0x01,0xd3,0x01,0x30,0xff,0x9c,0x01,0xd3,0x01,0x31,0xff,0xd7,0x01,0xd3,0x01,0x32,0xff,0xc3,0x01,0xd3,0x01,0x34,0xff,0xc3,0x01,0xd3,0x01,0xbf,0xff,0xc3,0x01,0xd3,0x01,0xc0, +0xff,0xd7,0x01,0xd3,0x01,0xc3,0xff,0xe7,0x01,0xd3,0x01,0xcb,0xff,0xe7,0x01,0xd3,0x01,0xcf,0xff,0xc3,0x01,0xd3,0x01,0xd1,0xff,0xbe,0x01,0xd3,0x01,0xd2,0xff,0xe7,0x01,0xd3,0x01,0xd3,0x00,0x19,0x01,0xd3,0x01,0xd5,0xff,0xc3,0x01,0xd3,0x01,0xd7,0xff,0xe7,0x01,0xd3,0x01,0xd8,0xff,0xc3,0x01,0xd3,0x01,0xd9,0xff,0xe7,0x01,0xd3, +0x01,0xda,0xff,0xc3,0x01,0xd4,0x01,0xcb,0xff,0xe7,0x01,0xd5,0x00,0x05,0xff,0x6f,0x01,0xd5,0x00,0x0a,0xff,0x6f,0x01,0xd5,0x00,0xb4,0xff,0xb0,0x01,0xd5,0x00,0xb5,0xff,0x7b,0x01,0xd5,0x00,0xb6,0xff,0xbc,0x01,0xd5,0x00,0xb7,0xff,0x7b,0x01,0xd5,0x01,0x33,0xff,0xdb,0x01,0xd5,0x01,0xc5,0xff,0xdb,0x01,0xd5,0x01,0xd3,0xff,0xe7, +0x01,0xd5,0x02,0x37,0xff,0xdb,0x01,0xd6,0x01,0xcb,0x00,0x6a,0x01,0xd7,0x00,0x05,0xff,0x6f,0x01,0xd7,0x00,0x0a,0xff,0x6f,0x01,0xd7,0x00,0xb4,0xff,0xb0,0x01,0xd7,0x00,0xb5,0xff,0x7b,0x01,0xd7,0x00,0xb6,0xff,0xbc,0x01,0xd7,0x00,0xb7,0xff,0x7b,0x01,0xd7,0x01,0xc5,0xff,0xdb,0x01,0xd7,0x01,0xcb,0xff,0xe7,0x01,0xd7,0x01,0xd3, +0xff,0xe7,0x01,0xd8,0x00,0x05,0xff,0x6f,0x01,0xd8,0x00,0x0a,0xff,0x6f,0x01,0xd8,0x00,0xb4,0xff,0xb0,0x01,0xd8,0x00,0xb5,0xff,0x7b,0x01,0xd8,0x00,0xb6,0xff,0xbc,0x01,0xd8,0x00,0xb7,0xff,0x7b,0x01,0xd8,0x01,0xc5,0xff,0xdb,0x01,0xd8,0x01,0xd3,0xff,0xc3,0x01,0xd9,0x00,0x05,0xff,0x6f,0x01,0xd9,0x00,0x0a,0xff,0x6f,0x01,0xd9, +0x00,0xb4,0xff,0xb0,0x01,0xd9,0x00,0xb5,0xff,0x7b,0x01,0xd9,0x00,0xb6,0xff,0xbc,0x01,0xd9,0x00,0xb7,0xff,0x7b,0x01,0xd9,0x01,0xc5,0xff,0xdb,0x01,0xd9,0x01,0xcb,0xff,0xe7,0x01,0xd9,0x01,0xd3,0xff,0xe7,0x01,0xda,0x00,0x05,0xff,0x6f,0x01,0xda,0x00,0x0a,0xff,0x6f,0x01,0xda,0x00,0xb4,0xff,0xb0,0x01,0xda,0x00,0xb5,0xff,0x7b, +0x01,0xda,0x00,0xb6,0xff,0xbc,0x01,0xda,0x00,0xb7,0xff,0x7b,0x01,0xda,0x01,0xc5,0xff,0xdb,0x01,0xda,0x01,0xd3,0xff,0xe7,0x01,0xdb,0x01,0xe1,0x00,0x46,0x01,0xdb,0x01,0xe7,0x00,0x0c,0x01,0xdb,0x01,0xeb,0x00,0x46,0x01,0xdb,0x01,0xed,0x00,0x14,0x01,0xdb,0x01,0xf2,0x00,0x46,0x01,0xdb,0x01,0xfc,0x00,0x0a,0x01,0xdc,0x01,0xdc, +0xff,0x79,0x01,0xdc,0x01,0xde,0xff,0xcf,0x01,0xdc,0x01,0xe1,0x00,0x29,0x01,0xdc,0x01,0xe3,0xff,0x79,0x01,0xdc,0x01,0xe5,0xff,0xee,0x01,0xdc,0x01,0xeb,0x00,0x29,0x01,0xdc,0x01,0xf2,0x00,0x29,0x01,0xdc,0x01,0xf5,0xff,0xcf,0x01,0xdc,0x01,0xf8,0xff,0xcf,0x01,0xdc,0x01,0xf9,0xff,0x79,0x01,0xdc,0x01,0xfa,0xff,0xee,0x01,0xdc, +0x01,0xfb,0xff,0xc3,0x01,0xdc,0x01,0xfe,0xff,0x60,0x01,0xdc,0x02,0x01,0xff,0x79,0x01,0xdc,0x02,0x19,0xff,0xcf,0x01,0xdc,0x02,0x1a,0xff,0xe7,0x01,0xdc,0x02,0x31,0xff,0xe7,0x01,0xdd,0x00,0x0f,0xff,0x83,0x01,0xdd,0x00,0x11,0xff,0x83,0x01,0xdd,0x00,0xaa,0xff,0x91,0x01,0xdd,0x00,0xab,0xff,0xd7,0x01,0xdd,0x00,0xac,0xff,0x83, +0x01,0xdd,0x01,0xdc,0x00,0x29,0x01,0xdd,0x01,0xde,0xff,0xa2,0x01,0xdd,0x01,0xe1,0xff,0xa2,0x01,0xdd,0x01,0xe3,0x00,0x29,0x01,0xdd,0x01,0xe5,0x00,0x1d,0x01,0xdd,0x01,0xe7,0xff,0x71,0x01,0xdd,0x01,0xeb,0xff,0xa2,0x01,0xdd,0x01,0xf2,0xff,0xa2,0x01,0xdd,0x01,0xf5,0xff,0xcf,0x01,0xdd,0x01,0xf8,0xff,0xcf,0x01,0xdd,0x01,0xf9, +0x00,0x29,0x01,0xdd,0x01,0xfa,0x00,0x1d,0x01,0xdd,0x01,0xfb,0xff,0xa2,0x01,0xdd,0x02,0x01,0x00,0x29,0x01,0xdd,0x02,0x06,0xff,0xe7,0x01,0xdd,0x02,0x07,0xff,0x27,0x01,0xdd,0x02,0x09,0xff,0x4e,0x01,0xdd,0x02,0x0a,0xff,0x4e,0x01,0xdd,0x02,0x0b,0xff,0x9e,0x01,0xdd,0x02,0x0c,0xff,0x2b,0x01,0xdd,0x02,0x0f,0xff,0x4e,0x01,0xdd, +0x02,0x10,0xff,0x4e,0x01,0xdd,0x02,0x11,0xff,0x4e,0x01,0xdd,0x02,0x12,0xff,0x9e,0x01,0xdd,0x02,0x13,0xff,0x4e,0x01,0xdd,0x02,0x14,0xff,0x4e,0x01,0xdd,0x02,0x15,0xff,0x2b,0x01,0xdd,0x02,0x16,0xff,0x4e,0x01,0xdd,0x02,0x17,0xff,0x4e,0x01,0xdd,0x02,0x18,0xff,0x2b,0x01,0xdd,0x02,0x19,0xff,0xc3,0x01,0xdd,0x02,0x1b,0xff,0x2b, +0x01,0xdd,0x02,0x1c,0xff,0x4c,0x01,0xdd,0x02,0x1d,0xff,0x4e,0x01,0xdd,0x02,0x1e,0xff,0x4e,0x01,0xdd,0x02,0x1f,0xff,0x4e,0x01,0xdd,0x02,0x20,0xff,0x4e,0x01,0xdd,0x02,0x21,0xff,0xc3,0x01,0xdd,0x02,0x22,0xff,0x4e,0x01,0xdd,0x02,0x23,0xff,0x4e,0x01,0xdd,0x02,0x24,0xff,0x60,0x01,0xdd,0x02,0x25,0xff,0x4e,0x01,0xdd,0x02,0x26, +0xff,0x54,0x01,0xdd,0x02,0x27,0xff,0x2b,0x01,0xdd,0x02,0x29,0xff,0x4e,0x01,0xdd,0x02,0x2a,0xff,0x2b,0x01,0xdd,0x02,0x2b,0xff,0x66,0x01,0xdd,0x02,0x2c,0x00,0x6f,0x01,0xdd,0x02,0x2d,0xff,0x9e,0x01,0xdd,0x02,0x2e,0xff,0x4e,0x01,0xdd,0x02,0x32,0xff,0x4e,0x01,0xdd,0x02,0x34,0xff,0x4e,0x01,0xde,0x00,0xaa,0xff,0xcd,0x01,0xde, +0x00,0xbe,0xff,0xcd,0x01,0xde,0x01,0xde,0xff,0xc9,0x01,0xde,0x01,0xf5,0xff,0xc9,0x01,0xde,0x01,0xf8,0xff,0xc9,0x01,0xde,0x01,0xfb,0xff,0xc9,0x01,0xde,0x02,0x19,0xff,0xdb,0x01,0xde,0x02,0x21,0xff,0xdb,0x01,0xde,0x02,0x2c,0x00,0x1f,0x01,0xdf,0x00,0xc4,0xff,0xb0,0x01,0xdf,0x00,0xc5,0xff,0xb0,0x01,0xdf,0x01,0xf5,0xff,0xe7, +0x01,0xdf,0x01,0xfb,0xff,0xdb,0x01,0xdf,0x01,0xfe,0xff,0xdb,0x01,0xdf,0x02,0x1a,0xff,0xcf,0x01,0xdf,0x02,0x31,0xff,0xcf,0x01,0xe1,0x01,0xdc,0xff,0x79,0x01,0xe1,0x01,0xde,0xff,0xe7,0x01,0xe1,0x01,0xe3,0xff,0x79,0x01,0xe1,0x01,0xf5,0xff,0xe7,0x01,0xe1,0x01,0xf8,0xff,0xe7,0x01,0xe1,0x01,0xf9,0xff,0x79,0x01,0xe1,0x01,0xfb, +0xff,0xe7,0x01,0xe1,0x01,0xfe,0xff,0x62,0x01,0xe1,0x02,0x01,0xff,0x79,0x01,0xe1,0x02,0x19,0xff,0xcf,0x01,0xe1,0x02,0x21,0xff,0xcf,0x01,0xe2,0x01,0xdc,0xff,0x79,0x01,0xe2,0x01,0xde,0xff,0xe7,0x01,0xe2,0x01,0xe3,0xff,0x79,0x01,0xe2,0x01,0xf5,0xff,0xe7,0x01,0xe2,0x01,0xf8,0xff,0xe7,0x01,0xe2,0x01,0xf9,0xff,0x79,0x01,0xe2, +0x01,0xfb,0xff,0xe7,0x01,0xe2,0x01,0xfe,0xff,0x62,0x01,0xe2,0x02,0x01,0xff,0x79,0x01,0xe2,0x02,0x19,0xff,0xcf,0x01,0xe2,0x02,0x21,0xff,0xcf,0x01,0xe3,0x01,0xdc,0xff,0x79,0x01,0xe3,0x01,0xe1,0x00,0x3d,0x01,0xe3,0x01,0xe3,0xff,0x58,0x01,0xe3,0x01,0xeb,0x00,0x3d,0x01,0xe3,0x01,0xf2,0x00,0x3d,0x01,0xe3,0x01,0xfb,0xff,0xe7, +0x01,0xe3,0x01,0xfe,0xff,0x4e,0x01,0xe3,0x02,0x01,0xff,0xae,0x01,0xe4,0x00,0x0f,0x00,0x29,0x01,0xe4,0x00,0x1e,0x00,0x29,0x01,0xe4,0x00,0xc4,0x00,0x46,0x01,0xe4,0x00,0xc5,0x00,0x46,0x01,0xe4,0x01,0xde,0xff,0xa4,0x01,0xe4,0x01,0xe1,0x00,0x5c,0x01,0xe4,0x01,0xeb,0x00,0x5c,0x01,0xe4,0x01,0xed,0x00,0x62,0x01,0xe4,0x01,0xf2, +0x00,0x5c,0x01,0xe4,0x01,0xf5,0xff,0xa4,0x01,0xe4,0x01,0xf8,0xff,0xa4,0x01,0xe4,0x01,0xfb,0xff,0xa4,0x01,0xe4,0x01,0xfc,0x00,0x25,0x01,0xe4,0x01,0xfe,0xff,0xc3,0x01,0xe4,0x02,0x08,0xff,0xe5,0x01,0xe4,0x02,0x0b,0x00,0x62,0x01,0xe4,0x02,0x0c,0xff,0xe5,0x01,0xe4,0x02,0x0d,0x00,0x3d,0x01,0xe4,0x02,0x12,0x00,0x62,0x01,0xe4, +0x02,0x15,0xff,0xe5,0x01,0xe4,0x02,0x18,0xff,0xe5,0x01,0xe4,0x02,0x1a,0xff,0xa2,0x01,0xe4,0x02,0x1b,0xff,0xe5,0x01,0xe4,0x02,0x1e,0xff,0xc3,0x01,0xe4,0x02,0x27,0xff,0xe5,0x01,0xe4,0x02,0x2a,0xff,0xe5,0x01,0xe4,0x02,0x2c,0x00,0x29,0x01,0xe4,0x02,0x2d,0x00,0x62,0x01,0xe4,0x02,0x31,0xff,0xa2,0x01,0xe5,0x00,0x0f,0xff,0x3b, +0x01,0xe5,0x00,0x11,0xff,0x2b,0x01,0xe5,0x00,0xac,0xff,0x2b,0x01,0xe5,0x01,0xdc,0x00,0x29,0x01,0xe5,0x01,0xe1,0xff,0x75,0x01,0xe5,0x01,0xe3,0x00,0x29,0x01,0xe5,0x01,0xe7,0xff,0x33,0x01,0xe5,0x01,0xeb,0xff,0x75,0x01,0xe5,0x01,0xed,0x00,0x25,0x01,0xe5,0x01,0xf2,0xff,0x75,0x01,0xe5,0x01,0xf9,0x00,0x29,0x01,0xe5,0x02,0x01, +0x00,0x29,0x01,0xe5,0x02,0x07,0xff,0x79,0x01,0xe5,0x02,0x09,0xff,0xb6,0x01,0xe5,0x02,0x0a,0xff,0xb6,0x01,0xe5,0x02,0x0b,0xfe,0xfe,0x01,0xe5,0x02,0x0c,0xff,0x91,0x01,0xe5,0x02,0x0f,0xff,0xb6,0x01,0xe5,0x02,0x10,0xff,0xb6,0x01,0xe5,0x02,0x11,0xff,0xb6,0x01,0xe5,0x02,0x12,0xfe,0xfe,0x01,0xe5,0x02,0x13,0xff,0xb6,0x01,0xe5, +0x02,0x14,0xff,0xb6,0x01,0xe5,0x02,0x15,0xff,0x91,0x01,0xe5,0x02,0x16,0xff,0xb6,0x01,0xe5,0x02,0x17,0xff,0xb6,0x01,0xe5,0x02,0x18,0xff,0x91,0x01,0xe5,0x02,0x1b,0xff,0x91,0x01,0xe5,0x02,0x1c,0xff,0xb6,0x01,0xe5,0x02,0x1d,0xff,0xb6,0x01,0xe5,0x02,0x1f,0xff,0xb6,0x01,0xe5,0x02,0x20,0xff,0xb6,0x01,0xe5,0x02,0x22,0xff,0xb6, +0x01,0xe5,0x02,0x23,0xff,0xb6,0x01,0xe5,0x02,0x25,0xff,0xb6,0x01,0xe5,0x02,0x26,0xff,0xaa,0x01,0xe5,0x02,0x27,0xff,0x91,0x01,0xe5,0x02,0x29,0xff,0xb6,0x01,0xe5,0x02,0x2a,0xff,0x91,0x01,0xe5,0x02,0x2b,0xff,0xc3,0x01,0xe5,0x02,0x2c,0x00,0x6d,0x01,0xe5,0x02,0x2d,0xfe,0xfe,0x01,0xe5,0x02,0x2e,0xff,0xb6,0x01,0xe5,0x02,0x30, +0xff,0xb6,0x01,0xe5,0x02,0x32,0xff,0xb6,0x01,0xe5,0x02,0x34,0xff,0xb6,0x01,0xe7,0x00,0x0d,0xff,0x7f,0x01,0xe7,0x00,0x0f,0x00,0x46,0x01,0xe7,0x00,0x1e,0x00,0x46,0x01,0xe7,0x00,0x8d,0xff,0x98,0x01,0xe7,0x00,0xb4,0xff,0x66,0x01,0xe7,0x00,0xb5,0xff,0x3d,0x01,0xe7,0x00,0xb6,0xff,0x66,0x01,0xe7,0x00,0xb7,0xff,0x3d,0x01,0xe7, +0x01,0xdc,0xff,0x6d,0x01,0xe7,0x01,0xde,0xff,0xe5,0x01,0xe7,0x01,0xe1,0x00,0x60,0x01,0xe7,0x01,0xe3,0xff,0x6d,0x01,0xe7,0x01,0xeb,0x00,0x60,0x01,0xe7,0x01,0xed,0x00,0x3d,0x01,0xe7,0x01,0xf2,0x00,0x60,0x01,0xe7,0x01,0xf5,0xff,0xe5,0x01,0xe7,0x01,0xf8,0xff,0xe5,0x01,0xe7,0x01,0xf9,0xff,0x6d,0x01,0xe7,0x01,0xfb,0xff,0xc3, +0x01,0xe7,0x01,0xfe,0xff,0x3d,0x01,0xe7,0x02,0x01,0xff,0x6d,0x01,0xe7,0x02,0x0b,0x00,0x56,0x01,0xe7,0x02,0x0d,0x00,0x29,0x01,0xe7,0x02,0x12,0x00,0x56,0x01,0xe7,0x02,0x1a,0xff,0xd9,0x01,0xe7,0x02,0x2d,0x00,0x56,0x01,0xe7,0x02,0x31,0xff,0xd9,0x01,0xe8,0x01,0xde,0xff,0xe7,0x01,0xe8,0x01,0xf5,0xff,0xe7,0x01,0xe8,0x01,0xf8, +0xff,0xe7,0x01,0xe8,0x01,0xfb,0xff,0xe7,0x01,0xe8,0x01,0xfe,0xff,0x62,0x01,0xe8,0x02,0x19,0xff,0xcf,0x01,0xe8,0x02,0x21,0xff,0xcf,0x01,0xe9,0x00,0xc4,0xff,0xb0,0x01,0xe9,0x00,0xc5,0xff,0xb0,0x01,0xe9,0x01,0xdc,0xff,0xa2,0x01,0xe9,0x01,0xe3,0xff,0xa2,0x01,0xe9,0x01,0xf9,0xff,0xa2,0x01,0xe9,0x01,0xfe,0xff,0xd5,0x01,0xe9, +0x02,0x01,0xff,0xa2,0x01,0xea,0x00,0x0f,0xff,0x83,0x01,0xea,0x00,0x11,0xff,0x83,0x01,0xea,0x00,0xaa,0xff,0x91,0x01,0xea,0x00,0xab,0xff,0xd7,0x01,0xea,0x00,0xac,0xff,0x83,0x01,0xea,0x01,0xdc,0x00,0x29,0x01,0xea,0x01,0xde,0xff,0xa2,0x01,0xea,0x01,0xe1,0xff,0x9e,0x01,0xea,0x01,0xe3,0x00,0x29,0x01,0xea,0x01,0xe5,0x00,0x1d, +0x01,0xea,0x01,0xe7,0xff,0x71,0x01,0xea,0x01,0xeb,0xff,0xa2,0x01,0xea,0x01,0xf2,0xff,0xa2,0x01,0xea,0x01,0xf5,0xff,0xcf,0x01,0xea,0x01,0xf8,0xff,0xcf,0x01,0xea,0x01,0xf9,0x00,0x29,0x01,0xea,0x01,0xfa,0x00,0x1d,0x01,0xea,0x01,0xfb,0xff,0xa2,0x01,0xea,0x02,0x01,0x00,0x29,0x01,0xea,0x02,0x06,0xff,0xe7,0x01,0xea,0x02,0x07, +0xff,0x27,0x01,0xea,0x02,0x09,0xff,0x4e,0x01,0xea,0x02,0x0a,0xff,0x4e,0x01,0xea,0x02,0x0b,0xff,0x9e,0x01,0xea,0x02,0x0c,0xff,0x2b,0x01,0xea,0x02,0x0f,0xff,0x4e,0x01,0xea,0x02,0x10,0xff,0x4e,0x01,0xea,0x02,0x11,0xff,0x4e,0x01,0xea,0x02,0x12,0xff,0x9e,0x01,0xea,0x02,0x13,0xff,0x4e,0x01,0xea,0x02,0x14,0xff,0x4e,0x01,0xea, +0x02,0x15,0xff,0x2b,0x01,0xea,0x02,0x16,0xff,0x4e,0x01,0xea,0x02,0x17,0xff,0x4e,0x01,0xea,0x02,0x18,0xff,0x2b,0x01,0xea,0x02,0x19,0xff,0xc3,0x01,0xea,0x02,0x1b,0xff,0x2b,0x01,0xea,0x02,0x1c,0xff,0x4c,0x01,0xea,0x02,0x1d,0xff,0x4e,0x01,0xea,0x02,0x1e,0xff,0x4e,0x01,0xea,0x02,0x1f,0xff,0x4e,0x01,0xea,0x02,0x20,0xff,0x4e, +0x01,0xea,0x02,0x21,0xff,0xc3,0x01,0xea,0x02,0x22,0xff,0x4e,0x01,0xea,0x02,0x23,0xff,0x4e,0x01,0xea,0x02,0x24,0xff,0x60,0x01,0xea,0x02,0x25,0xff,0x4e,0x01,0xea,0x02,0x26,0xff,0x54,0x01,0xea,0x02,0x27,0xff,0x2b,0x01,0xea,0x02,0x29,0xff,0x4e,0x01,0xea,0x02,0x2a,0xff,0x2b,0x01,0xea,0x02,0x2b,0xff,0x66,0x01,0xea,0x02,0x2c, +0x00,0x6f,0x01,0xea,0x02,0x2d,0xff,0x9e,0x01,0xea,0x02,0x2e,0xff,0x4e,0x01,0xea,0x02,0x32,0xff,0x4e,0x01,0xea,0x02,0x34,0xff,0x4e,0x01,0xec,0x01,0xe1,0x00,0x46,0x01,0xec,0x01,0xe7,0x00,0x0c,0x01,0xec,0x01,0xeb,0x00,0x46,0x01,0xec,0x01,0xed,0x00,0x14,0x01,0xec,0x01,0xf2,0x00,0x46,0x01,0xec,0x01,0xfc,0x00,0x0a,0x01,0xec, +0x02,0x2c,0x00,0x14,0x01,0xed,0x00,0x0f,0x00,0x52,0x01,0xed,0x00,0x1e,0x00,0x52,0x01,0xed,0x00,0xc4,0x00,0x5a,0x01,0xed,0x00,0xc5,0x00,0x5a,0x01,0xed,0x01,0xde,0xff,0xcd,0x01,0xed,0x01,0xe1,0x00,0x85,0x01,0xed,0x01,0xe7,0x00,0x3d,0x01,0xed,0x01,0xeb,0x00,0x85,0x01,0xed,0x01,0xed,0x00,0x66,0x01,0xed,0x01,0xf5,0xff,0xcd, +0x01,0xed,0x01,0xf8,0xff,0xcd,0x01,0xed,0x01,0xfb,0xff,0xcd,0x01,0xed,0x01,0xfc,0x00,0x25,0x01,0xed,0x01,0xfe,0xff,0xdb,0x01,0xed,0x02,0x06,0x00,0x3d,0x01,0xed,0x02,0x0b,0x00,0x7b,0x01,0xed,0x02,0x0d,0x00,0x3d,0x01,0xed,0x02,0x12,0x00,0x7b,0x01,0xed,0x02,0x1a,0xff,0xd1,0x01,0xed,0x02,0x1c,0x00,0x48,0x01,0xed,0x02,0x1e, +0xff,0xe7,0x01,0xed,0x02,0x2c,0x00,0x52,0x01,0xed,0x02,0x2d,0x00,0x7b,0x01,0xed,0x02,0x31,0xff,0xd1,0x01,0xee,0x01,0xdc,0xff,0xe1,0x01,0xee,0x01,0xde,0xff,0xdb,0x01,0xee,0x01,0xe3,0xff,0xe1,0x01,0xee,0x01,0xf5,0xff,0xdb,0x01,0xee,0x01,0xf8,0xff,0xdb,0x01,0xee,0x01,0xf9,0xff,0xe1,0x01,0xee,0x01,0xfb,0xff,0xdb,0x01,0xee, +0x01,0xfe,0xff,0xdd,0x01,0xee,0x02,0x01,0xff,0xe1,0x01,0xf1,0x00,0x0f,0x00,0x29,0x01,0xf1,0x00,0x1e,0x00,0x29,0x01,0xf1,0x00,0xc4,0x00,0x46,0x01,0xf1,0x00,0xc5,0x00,0x46,0x01,0xf1,0x01,0xde,0xff,0xa4,0x01,0xf1,0x01,0xe1,0x00,0x5c,0x01,0xf1,0x01,0xeb,0x00,0x5c,0x01,0xf1,0x01,0xed,0x00,0x62,0x01,0xf1,0x01,0xf2,0x00,0x5c, +0x01,0xf1,0x01,0xf5,0xff,0xa4,0x01,0xf1,0x01,0xf8,0xff,0xa4,0x01,0xf1,0x01,0xfb,0xff,0xa4,0x01,0xf1,0x01,0xfc,0x00,0x25,0x01,0xf1,0x01,0xfe,0xff,0xc3,0x01,0xf1,0x02,0x06,0x00,0x3d,0x01,0xf1,0x02,0x08,0xff,0xe5,0x01,0xf1,0x02,0x0b,0x00,0x62,0x01,0xf1,0x02,0x0c,0xff,0xe5,0x01,0xf1,0x02,0x0d,0x00,0x3d,0x01,0xf1,0x02,0x12, +0x00,0x62,0x01,0xf1,0x02,0x15,0xff,0xe5,0x01,0xf1,0x02,0x18,0xff,0xe5,0x01,0xf1,0x02,0x1a,0xff,0xa2,0x01,0xf1,0x02,0x1b,0xff,0xe5,0x01,0xf1,0x02,0x1e,0xff,0xc3,0x01,0xf1,0x02,0x27,0xff,0xe5,0x01,0xf1,0x02,0x2a,0xff,0xe5,0x01,0xf1,0x02,0x2c,0x00,0x29,0x01,0xf1,0x02,0x2d,0x00,0x62,0x01,0xf1,0x02,0x31,0xff,0xa2,0x01,0xf5, +0x00,0x0f,0xff,0xa2,0x01,0xf5,0x00,0x11,0xff,0xa2,0x01,0xf5,0x00,0xac,0xff,0xa2,0x01,0xf5,0x00,0xc4,0xff,0x4a,0x01,0xf5,0x00,0xc5,0xff,0x96,0x01,0xf5,0x01,0xdc,0xff,0xa2,0x01,0xf5,0x01,0xdf,0xff,0xdb,0x01,0xf5,0x01,0xe1,0xff,0xf6,0x01,0xf5,0x01,0xe3,0xff,0xa2,0x01,0xf5,0x01,0xe5,0xff,0xe7,0x01,0xf5,0x01,0xe7,0xff,0xe5, +0x01,0xf5,0x01,0xeb,0xff,0xf6,0x01,0xf5,0x01,0xed,0xff,0xcd,0x01,0xf5,0x01,0xf2,0xff,0xf6,0x01,0xf5,0x01,0xf9,0xff,0xa2,0x01,0xf5,0x01,0xfa,0xff,0xe7,0x01,0xf5,0x01,0xfc,0xff,0xdb,0x01,0xf5,0x02,0x01,0xff,0xa2,0x01,0xf7,0x00,0x0f,0xfe,0xba,0x01,0xf7,0x00,0x11,0xfe,0xba,0x01,0xf7,0x00,0xac,0xfe,0xba,0x01,0xf7,0x00,0xc4, +0xfe,0xba,0x01,0xf7,0x00,0xc5,0xfe,0xae,0x01,0xf7,0x01,0xde,0xff,0xf6,0x01,0xf7,0x01,0xe1,0xff,0x7f,0x01,0xf7,0x01,0xe5,0xff,0xe7,0x01,0xf7,0x01,0xe7,0xff,0x60,0x01,0xf7,0x01,0xeb,0xff,0x7f,0x01,0xf7,0x01,0xed,0xff,0xcf,0x01,0xf7,0x01,0xee,0xff,0xe7,0x01,0xf7,0x01,0xf2,0xff,0x7f,0x01,0xf7,0x01,0xf5,0xff,0xf6,0x01,0xf7, +0x01,0xf8,0xff,0xf6,0x01,0xf7,0x01,0xfa,0xff,0xe7,0x01,0xf7,0x01,0xfb,0xff,0xf6,0x01,0xf7,0x01,0xfc,0xff,0xc1,0x01,0xf7,0x02,0x07,0xff,0xbc,0x01,0xf7,0x02,0x0b,0xff,0x6d,0x01,0xf7,0x02,0x0c,0xff,0xb2,0x01,0xf7,0x02,0x12,0xff,0x6d,0x01,0xf7,0x02,0x15,0xff,0xb2,0x01,0xf7,0x02,0x18,0xff,0xb2,0x01,0xf7,0x02,0x1b,0xff,0xb2, +0x01,0xf7,0x02,0x27,0xff,0xb2,0x01,0xf7,0x02,0x2a,0xff,0xb2,0x01,0xf7,0x02,0x2d,0xff,0x6d,0x01,0xf8,0x00,0xaa,0xff,0xcd,0x01,0xf8,0x00,0xbe,0xff,0xcd,0x01,0xf8,0x01,0xde,0xff,0xc9,0x01,0xf8,0x01,0xed,0x00,0x31,0x01,0xf8,0x01,0xf5,0xff,0xc9,0x01,0xf8,0x01,0xf8,0xff,0xc9,0x01,0xf8,0x01,0xfb,0xff,0xc9,0x01,0xf8,0x02,0x19, +0xff,0xdb,0x01,0xf8,0x02,0x21,0xff,0xdb,0x01,0xf8,0x02,0x2c,0x00,0x1f,0x01,0xf9,0x00,0x0f,0xff,0x7d,0x01,0xf9,0x00,0x11,0xff,0x4c,0x01,0xf9,0x00,0x1d,0xff,0xe9,0x01,0xf9,0x00,0x1e,0xff,0xe9,0x01,0xf9,0x00,0x8d,0x00,0x52,0x01,0xf9,0x00,0xaa,0xff,0x98,0x01,0xf9,0x00,0xab,0xff,0xcd,0x01,0xf9,0x00,0xac,0xff,0x4c,0x01,0xf9, +0x00,0xb5,0x00,0x29,0x01,0xf9,0x00,0xb7,0x00,0x29,0x01,0xf9,0x00,0xbe,0xff,0x98,0x01,0xf9,0x00,0xbf,0xff,0xcd,0x01,0xf9,0x00,0xc4,0xff,0x14,0x01,0xf9,0x00,0xc5,0xff,0x14,0x01,0xf9,0x01,0xdc,0x00,0x29,0x01,0xf9,0x01,0xde,0xff,0xa2,0x01,0xf9,0x01,0xe1,0xff,0x8d,0x01,0xf9,0x01,0xe3,0x00,0x29,0x01,0xf9,0x01,0xe7,0xff,0x66, +0x01,0xf9,0x01,0xeb,0xff,0x8d,0x01,0xf9,0x01,0xf2,0xff,0x8d,0x01,0xf9,0x01,0xf5,0xff,0xa2,0x01,0xf9,0x01,0xf8,0xff,0xa2,0x01,0xf9,0x01,0xf9,0x00,0x29,0x01,0xf9,0x01,0xfb,0xff,0xa2,0x01,0xf9,0x01,0xfc,0xff,0xf8,0x01,0xf9,0x02,0x01,0x00,0x29,0x01,0xf9,0x02,0x06,0xff,0xe7,0x01,0xf9,0x02,0x07,0xff,0x27,0x01,0xf9,0x02,0x09, +0xff,0x4e,0x01,0xf9,0x02,0x0a,0xff,0x4e,0x01,0xf9,0x02,0x0b,0xff,0x9e,0x01,0xf9,0x02,0x0c,0xff,0x2b,0x01,0xf9,0x02,0x0d,0xff,0xa6,0x01,0xf9,0x02,0x0f,0xff,0x4e,0x01,0xf9,0x02,0x10,0xff,0x4e,0x01,0xf9,0x02,0x11,0xff,0x4e,0x01,0xf9,0x02,0x12,0xff,0x9e,0x01,0xf9,0x02,0x13,0xff,0x4e,0x01,0xf9,0x02,0x14,0xff,0x4e,0x01,0xf9, +0x02,0x15,0xff,0x2b,0x01,0xf9,0x02,0x16,0xff,0x4e,0x01,0xf9,0x02,0x17,0xff,0x4e,0x01,0xf9,0x02,0x18,0xff,0x2b,0x01,0xf9,0x02,0x19,0xff,0xc3,0x01,0xf9,0x02,0x1a,0xff,0x8d,0x01,0xf9,0x02,0x1b,0xff,0x2b,0x01,0xf9,0x02,0x1c,0xff,0x4c,0x01,0xf9,0x02,0x1d,0xff,0x4e,0x01,0xf9,0x02,0x1e,0xff,0x4e,0x01,0xf9,0x02,0x1f,0xff,0x4e, +0x01,0xf9,0x02,0x20,0xff,0x4e,0x01,0xf9,0x02,0x21,0xff,0xc3,0x01,0xf9,0x02,0x22,0xff,0x4e,0x01,0xf9,0x02,0x23,0xff,0x4e,0x01,0xf9,0x02,0x24,0xff,0x60,0x01,0xf9,0x02,0x25,0xff,0x4e,0x01,0xf9,0x02,0x26,0xff,0x54,0x01,0xf9,0x02,0x27,0xff,0x2b,0x01,0xf9,0x02,0x29,0xff,0x4e,0x01,0xf9,0x02,0x2a,0xff,0x2b,0x01,0xf9,0x02,0x2b, +0xff,0x66,0x01,0xf9,0x02,0x2c,0x00,0x6f,0x01,0xf9,0x02,0x2d,0xff,0x9e,0x01,0xf9,0x02,0x2e,0xff,0x4e,0x01,0xf9,0x02,0x30,0xff,0x4e,0x01,0xf9,0x02,0x31,0xff,0x8d,0x01,0xf9,0x02,0x32,0xff,0x4e,0x01,0xf9,0x02,0x34,0xff,0x4e,0x01,0xfa,0x00,0x0f,0xff,0x3b,0x01,0xfa,0x00,0x11,0xff,0x2b,0x01,0xfa,0x00,0xac,0xff,0x2b,0x01,0xfa, +0x01,0xdc,0x00,0x29,0x01,0xfa,0x01,0xe1,0xff,0x75,0x01,0xfa,0x01,0xe3,0x00,0x29,0x01,0xfa,0x01,0xe7,0xff,0x33,0x01,0xfa,0x01,0xeb,0xff,0x75,0x01,0xfa,0x01,0xed,0x00,0x25,0x01,0xfa,0x01,0xf2,0xff,0x75,0x01,0xfa,0x01,0xf8,0xff,0xdb,0x01,0xfa,0x01,0xf9,0x00,0x29,0x01,0xfa,0x02,0x01,0x00,0x29,0x01,0xfa,0x02,0x07,0xff,0x79, +0x01,0xfa,0x02,0x09,0xff,0xb6,0x01,0xfa,0x02,0x0a,0xff,0xb6,0x01,0xfa,0x02,0x0b,0xfe,0xfe,0x01,0xfa,0x02,0x0c,0xff,0x91,0x01,0xfa,0x02,0x0f,0xff,0xb6,0x01,0xfa,0x02,0x10,0xff,0xb6,0x01,0xfa,0x02,0x11,0xff,0xb6,0x01,0xfa,0x02,0x12,0xfe,0xfe,0x01,0xfa,0x02,0x13,0xff,0xb6,0x01,0xfa,0x02,0x14,0xff,0xb6,0x01,0xfa,0x02,0x15, +0xff,0x91,0x01,0xfa,0x02,0x16,0xff,0xb6,0x01,0xfa,0x02,0x17,0xff,0xb6,0x01,0xfa,0x02,0x18,0xff,0x91,0x01,0xfa,0x02,0x1b,0xff,0x91,0x01,0xfa,0x02,0x1c,0xff,0xb6,0x01,0xfa,0x02,0x1d,0xff,0xb6,0x01,0xfa,0x02,0x1f,0xff,0xb6,0x01,0xfa,0x02,0x20,0xff,0xb6,0x01,0xfa,0x02,0x22,0xff,0xb6,0x01,0xfa,0x02,0x23,0xff,0xb6,0x01,0xfa, +0x02,0x25,0xff,0xb6,0x01,0xfa,0x02,0x26,0xff,0xaa,0x01,0xfa,0x02,0x27,0xff,0x91,0x01,0xfa,0x02,0x29,0xff,0xb6,0x01,0xfa,0x02,0x2a,0xff,0x91,0x01,0xfa,0x02,0x2b,0xff,0xc3,0x01,0xfa,0x02,0x2c,0x00,0x6d,0x01,0xfa,0x02,0x2d,0xfe,0xfe,0x01,0xfa,0x02,0x2e,0xff,0xb6,0x01,0xfa,0x02,0x30,0xff,0xb6,0x01,0xfa,0x02,0x32,0xff,0xb6, +0x01,0xfa,0x02,0x34,0xff,0xb6,0x01,0xfb,0x00,0x0f,0xff,0xa2,0x01,0xfb,0x00,0x11,0xff,0xa2,0x01,0xfb,0x00,0xac,0xff,0xa2,0x01,0xfb,0x00,0xc4,0xff,0x4a,0x01,0xfb,0x00,0xc5,0xff,0x96,0x01,0xfb,0x01,0xdc,0xff,0xa2,0x01,0xfb,0x01,0xdf,0xff,0xdb,0x01,0xfb,0x01,0xe1,0xff,0xf6,0x01,0xfb,0x01,0xe3,0xff,0xa2,0x01,0xfb,0x01,0xe5, +0xff,0xe7,0x01,0xfb,0x01,0xe7,0xff,0xc3,0x01,0xfb,0x01,0xeb,0xff,0xf6,0x01,0xfb,0x01,0xed,0xff,0xcd,0x01,0xfb,0x01,0xee,0xff,0xcf,0x01,0xfb,0x01,0xf2,0xff,0xf6,0x01,0xfb,0x01,0xf9,0xff,0xa2,0x01,0xfb,0x01,0xfa,0xff,0xe7,0x01,0xfb,0x01,0xfc,0xff,0xdb,0x01,0xfb,0x02,0x01,0xff,0xa2,0x01,0xfb,0x02,0x07,0xff,0xe7,0x01,0xfb, +0x02,0x0b,0xff,0x91,0x01,0xfb,0x02,0x2d,0xff,0x91,0x01,0xfc,0x00,0x0f,0x00,0x46,0x01,0xfc,0x00,0x11,0x00,0x39,0x01,0xfc,0x00,0x1e,0x00,0x52,0x01,0xfc,0x00,0xac,0x00,0x39,0x01,0xfc,0x00,0xc4,0x00,0x46,0x01,0xfc,0x00,0xc5,0x00,0x52,0x01,0xfc,0x01,0xdc,0x00,0x23,0x01,0xfc,0x01,0xde,0xff,0xdb,0x01,0xfc,0x01,0xe1,0x00,0x62, +0x01,0xfc,0x01,0xe3,0x00,0x23,0x01,0xfc,0x01,0xeb,0x00,0x62,0x01,0xfc,0x01,0xed,0x00,0x25,0x01,0xfc,0x01,0xf2,0x00,0x62,0x01,0xfc,0x01,0xf5,0xff,0xe7,0x01,0xfc,0x01,0xf8,0xff,0xdb,0x01,0xfc,0x01,0xf9,0x00,0x23,0x01,0xfc,0x01,0xfb,0xff,0xdb,0x01,0xfc,0x02,0x01,0x00,0x23,0x01,0xfc,0x02,0x2c,0x00,0x52,0x01,0xfd,0x00,0x0f, +0x00,0x29,0x01,0xfd,0x00,0xc4,0x00,0x29,0x01,0xfd,0x00,0xc5,0x00,0x29,0x01,0xfd,0x01,0xe1,0x00,0x3d,0x01,0xfd,0x01,0xeb,0x00,0x3d,0x01,0xfd,0x01,0xf2,0x00,0x3d,0x01,0xfd,0x01,0xfe,0xff,0xdb,0x01,0xfd,0x02,0x0b,0x00,0x25,0x01,0xfd,0x02,0x12,0x00,0x25,0x01,0xfd,0x02,0x2d,0x00,0x25,0x02,0x00,0x00,0x0f,0x00,0x29,0x02,0x00, +0x00,0x1e,0x00,0x29,0x02,0x00,0x00,0xc4,0x00,0x29,0x02,0x00,0x00,0xc5,0x00,0x29,0x02,0x00,0x01,0xe1,0x00,0x3d,0x02,0x00,0x01,0xeb,0x00,0x3d,0x02,0x00,0x01,0xf2,0x00,0x3d,0x02,0x00,0x01,0xfb,0xff,0xcf,0x02,0x00,0x01,0xfe,0xff,0xdb,0x02,0x00,0x02,0x0b,0x00,0x25,0x02,0x00,0x02,0x12,0x00,0x25,0x02,0x00,0x02,0x2d,0x00,0x25, +0x02,0x01,0x01,0xdc,0xff,0x79,0x02,0x01,0x01,0xde,0xff,0xe7,0x02,0x01,0x01,0xe3,0xff,0x79,0x02,0x01,0x01,0xf5,0xff,0xe7,0x02,0x01,0x01,0xf8,0xff,0xe7,0x02,0x01,0x01,0xf9,0xff,0x79,0x02,0x01,0x01,0xfb,0xff,0xe7,0x02,0x01,0x01,0xfe,0xff,0x62,0x02,0x01,0x02,0x01,0xff,0x79,0x02,0x01,0x02,0x19,0xff,0xcf,0x02,0x01,0x02,0x21, +0xff,0xcf,0x02,0x03,0x01,0xdc,0xff,0x79,0x02,0x03,0x01,0xde,0xff,0xe7,0x02,0x03,0x01,0xe3,0xff,0x79,0x02,0x03,0x01,0xf5,0xff,0xe7,0x02,0x03,0x01,0xf8,0xff,0xe7,0x02,0x03,0x01,0xf9,0xff,0x79,0x02,0x03,0x01,0xfb,0xff,0xe7,0x02,0x03,0x01,0xfe,0xff,0x62,0x02,0x03,0x02,0x01,0xff,0x79,0x02,0x03,0x02,0x19,0xff,0xcf,0x02,0x03, +0x02,0x21,0xff,0xcf,0x02,0x04,0x00,0x0f,0xff,0xa2,0x02,0x04,0x00,0x11,0xff,0xa2,0x02,0x04,0x00,0xac,0xff,0xa2,0x02,0x04,0x00,0xc4,0xff,0x4a,0x02,0x04,0x00,0xc5,0xff,0x96,0x02,0x04,0x01,0xdc,0xff,0xa2,0x02,0x04,0x01,0xdf,0xff,0xdb,0x02,0x04,0x01,0xe1,0xff,0xf6,0x02,0x04,0x01,0xe3,0xff,0xa2,0x02,0x04,0x01,0xe5,0xff,0xe7, +0x02,0x04,0x01,0xe7,0xff,0xe5,0x02,0x04,0x01,0xeb,0xff,0xf6,0x02,0x04,0x01,0xf2,0xff,0xf6,0x02,0x04,0x01,0xf9,0xff,0xa2,0x02,0x04,0x01,0xfa,0xff,0xe7,0x02,0x04,0x01,0xfc,0xff,0xdb,0x02,0x04,0x02,0x01,0xff,0xa2,0x02,0x05,0x00,0x0f,0xff,0xa2,0x02,0x05,0x00,0x11,0xff,0xa2,0x02,0x05,0x00,0xac,0xff,0xa2,0x02,0x05,0x00,0xc4, +0xff,0x4a,0x02,0x05,0x00,0xc5,0xff,0x96,0x02,0x05,0x01,0xdc,0xff,0xa2,0x02,0x05,0x01,0xdf,0xff,0xdb,0x02,0x05,0x01,0xe1,0xff,0xf6,0x02,0x05,0x01,0xe3,0xff,0xa2,0x02,0x05,0x01,0xe5,0xff,0xe7,0x02,0x05,0x01,0xe7,0xff,0xe5,0x02,0x05,0x01,0xeb,0xff,0xf6,0x02,0x05,0x01,0xf2,0xff,0xf6,0x02,0x05,0x01,0xf9,0xff,0xa2,0x02,0x05, +0x01,0xfa,0xff,0xe7,0x02,0x05,0x01,0xfc,0xff,0xdb,0x02,0x05,0x02,0x01,0xff,0xa2,0x02,0x07,0x02,0x1e,0xff,0xe7,0x02,0x08,0x02,0x0b,0xff,0xe7,0x02,0x08,0x02,0x0d,0xff,0xe1,0x02,0x08,0x02,0x19,0xff,0xdb,0x02,0x08,0x02,0x21,0xff,0xdb,0x02,0x09,0x02,0x19,0xff,0xee,0x02,0x09,0x02,0x1e,0xff,0xe7,0x02,0x09,0x02,0x21,0xff,0xee, +0x02,0x0a,0x00,0x0f,0xff,0xc3,0x02,0x0a,0x00,0x11,0xff,0xae,0x02,0x0a,0x00,0xac,0xff,0xae,0x02,0x0a,0x02,0x07,0xff,0xc3,0x02,0x0a,0x02,0x0b,0xff,0xb6,0x02,0x0a,0x02,0x0c,0xff,0xdb,0x02,0x0a,0x02,0x12,0xff,0xb6,0x02,0x0a,0x02,0x15,0xff,0xdb,0x02,0x0a,0x02,0x18,0xff,0xdb,0x02,0x0a,0x02,0x19,0x00,0x29,0x02,0x0a,0x02,0x1b, +0xff,0xdb,0x02,0x0a,0x02,0x21,0x00,0x29,0x02,0x0a,0x02,0x26,0xff,0xe7,0x02,0x0a,0x02,0x27,0xff,0xdb,0x02,0x0a,0x02,0x2a,0xff,0xdb,0x02,0x0a,0x02,0x2d,0xff,0xb6,0x02,0x0b,0x02,0x12,0x00,0x14,0x02,0x0b,0x02,0x1e,0xff,0xdb,0x02,0x0b,0x02,0x2d,0x00,0x14,0x02,0x0c,0x00,0x05,0xff,0x98,0x02,0x0c,0x00,0x0a,0xff,0x98,0x02,0x0d, +0x00,0x0f,0x00,0x52,0x02,0x0d,0x00,0x10,0xff,0x73,0x02,0x0d,0x00,0x11,0x00,0x52,0x02,0x0d,0x00,0x1d,0x00,0x52,0x02,0x0d,0x00,0x1e,0x00,0x52,0x02,0x0d,0x00,0xac,0x00,0x52,0x02,0x0d,0x02,0x0b,0x00,0x29,0x02,0x0d,0x02,0x0c,0xff,0xd7,0x02,0x0d,0x02,0x0d,0x00,0x4a,0x02,0x0d,0x02,0x12,0x00,0x52,0x02,0x0d,0x02,0x15,0xff,0xd7, +0x02,0x0d,0x02,0x18,0xff,0xd7,0x02,0x0d,0x02,0x1b,0xff,0xd7,0x02,0x0d,0x02,0x1e,0xff,0xe7,0x02,0x0d,0x02,0x27,0xff,0xd7,0x02,0x0d,0x02,0x2a,0xff,0xd7,0x02,0x0d,0x02,0x2d,0x00,0x29,0x02,0x0e,0x02,0x1e,0xff,0xd7,0x02,0x11,0x00,0x0f,0x00,0x52,0x02,0x11,0x00,0x10,0xff,0x73,0x02,0x11,0x00,0x11,0x00,0x52,0x02,0x11,0x00,0x1d, +0x00,0x52,0x02,0x11,0x00,0x1e,0x00,0x52,0x02,0x11,0x00,0xac,0x00,0x52,0x02,0x11,0x02,0x0b,0x00,0x14,0x02,0x11,0x02,0x0c,0xff,0xd7,0x02,0x11,0x02,0x0d,0x00,0x3d,0x02,0x11,0x02,0x12,0x00,0x29,0x02,0x11,0x02,0x15,0xff,0xd7,0x02,0x11,0x02,0x18,0xff,0xd7,0x02,0x11,0x02,0x1b,0xff,0xd7,0x02,0x11,0x02,0x1e,0xff,0xe7,0x02,0x11, +0x02,0x27,0xff,0xd7,0x02,0x11,0x02,0x2a,0xff,0xd7,0x02,0x11,0x02,0x2d,0x00,0x29,0x02,0x15,0x00,0x05,0xff,0x6f,0x02,0x15,0x00,0x0a,0xff,0x6f,0x02,0x15,0x00,0xb4,0xff,0xb0,0x02,0x15,0x00,0xb5,0xff,0x7b,0x02,0x15,0x00,0xb6,0xff,0xbc,0x02,0x15,0x00,0xb7,0xff,0x7b,0x02,0x15,0x02,0x07,0xff,0xe5,0x02,0x15,0x02,0x0b,0xff,0xe7, +0x02,0x15,0x02,0x0d,0xff,0xd7,0x02,0x15,0x02,0x19,0xff,0xdb,0x02,0x15,0x02,0x1c,0xff,0xe7,0x02,0x15,0x02,0x21,0xff,0xdb,0x02,0x17,0x00,0x05,0xff,0x6f,0x02,0x17,0x00,0x0a,0xff,0x6f,0x02,0x17,0x00,0xb4,0xff,0xc9,0x02,0x17,0x00,0xb5,0xff,0x87,0x02,0x17,0x00,0xb6,0xff,0x87,0x02,0x17,0x00,0xb7,0xff,0x87,0x02,0x17,0x02,0x07, +0xff,0xe5,0x02,0x17,0x02,0x0b,0xff,0xe7,0x02,0x17,0x02,0x0d,0xff,0xd7,0x02,0x17,0x02,0x19,0xff,0xdb,0x02,0x17,0x02,0x1c,0xff,0xe7,0x02,0x17,0x02,0x21,0xff,0xdb,0x02,0x19,0x00,0x0f,0xff,0xc3,0x02,0x19,0x00,0x11,0xff,0xae,0x02,0x19,0x00,0xac,0xff,0xae,0x02,0x19,0x02,0x0b,0xff,0xdb,0x02,0x19,0x02,0x0c,0xff,0xdb,0x02,0x19, +0x02,0x12,0xff,0xdb,0x02,0x19,0x02,0x15,0xff,0xdb,0x02,0x19,0x02,0x18,0xff,0xdb,0x02,0x19,0x02,0x19,0x00,0x14,0x02,0x19,0x02,0x1a,0x00,0x29,0x02,0x19,0x02,0x1b,0xff,0xdb,0x02,0x19,0x02,0x21,0x00,0x29,0x02,0x19,0x02,0x26,0xff,0xe7,0x02,0x19,0x02,0x27,0xff,0xdb,0x02,0x19,0x02,0x2a,0xff,0xdb,0x02,0x19,0x02,0x2d,0xff,0xdb, +0x02,0x19,0x02,0x31,0x00,0x29,0x02,0x1a,0x00,0x05,0x00,0x1d,0x02,0x1a,0x00,0x0a,0x00,0x1d,0x02,0x1a,0x00,0x0f,0xff,0x98,0x02,0x1a,0x00,0x11,0xff,0x7f,0x02,0x1a,0x00,0x22,0xff,0xb2,0x02,0x1a,0x00,0xac,0xff,0x7f,0x02,0x1a,0x00,0xbf,0x00,0x0e,0x02,0x1a,0x00,0xc4,0xff,0x8b,0x02,0x1a,0x00,0xc5,0xff,0x8b,0x02,0x1a,0x02,0x0b, +0xff,0x91,0x02,0x1a,0x02,0x0c,0xff,0xf6,0x02,0x1a,0x02,0x12,0xff,0x91,0x02,0x1a,0x02,0x15,0xff,0xf6,0x02,0x1a,0x02,0x18,0xff,0xf6,0x02,0x1a,0x02,0x19,0x00,0x29,0x02,0x1a,0x02,0x1b,0xff,0xf6,0x02,0x1a,0x02,0x21,0x00,0x29,0x02,0x1a,0x02,0x27,0xff,0xf6,0x02,0x1a,0x02,0x2a,0xff,0xf6,0x02,0x1a,0x02,0x2d,0xff,0x91,0x02,0x1b, +0x00,0x05,0xff,0x6f,0x02,0x1b,0x00,0x0a,0xff,0x6f,0x02,0x1b,0x00,0xb4,0xff,0xb0,0x02,0x1b,0x00,0xb5,0xff,0x7b,0x02,0x1b,0x00,0xb6,0xff,0xbc,0x02,0x1b,0x00,0xb7,0xff,0x7b,0x02,0x1b,0x02,0x07,0xff,0xe5,0x02,0x1b,0x02,0x0b,0xff,0xe7,0x02,0x1b,0x02,0x0d,0xff,0xd7,0x02,0x1b,0x02,0x19,0xff,0xdb,0x02,0x1b,0x02,0x1c,0xff,0xe7, +0x02,0x1b,0x02,0x21,0xff,0xdb,0x02,0x1c,0x02,0x0b,0x00,0x14,0x02,0x1c,0x02,0x0c,0xff,0xee,0x02,0x1c,0x02,0x12,0x00,0x29,0x02,0x1c,0x02,0x15,0xff,0xee,0x02,0x1c,0x02,0x18,0xff,0xee,0x02,0x1c,0x02,0x1b,0xff,0xee,0x02,0x1c,0x02,0x1e,0xff,0xdb,0x02,0x1c,0x02,0x27,0xff,0xee,0x02,0x1c,0x02,0x2a,0xff,0xee,0x02,0x1c,0x02,0x2d, +0x00,0x29,0x02,0x1d,0x02,0x1e,0xff,0xdb,0x02,0x20,0x02,0x1e,0xff,0xdb,0x02,0x21,0x02,0x0c,0xff,0xf4,0x02,0x21,0x02,0x15,0xff,0xf4,0x02,0x21,0x02,0x18,0xff,0xf4,0x02,0x21,0x02,0x19,0xff,0xaa,0x02,0x21,0x02,0x1a,0xff,0xb6,0x02,0x21,0x02,0x1b,0xff,0xf4,0x02,0x21,0x02,0x1e,0xff,0x85,0x02,0x21,0x02,0x21,0xff,0xaa,0x02,0x21, +0x02,0x27,0xff,0xf4,0x02,0x21,0x02,0x2a,0xff,0xf4,0x02,0x21,0x02,0x31,0xff,0xb6,0x02,0x23,0x02,0x0c,0xff,0xf4,0x02,0x23,0x02,0x15,0xff,0xf4,0x02,0x23,0x02,0x18,0xff,0xf4,0x02,0x23,0x02,0x19,0xff,0xaa,0x02,0x23,0x02,0x1a,0xff,0xb6,0x02,0x23,0x02,0x1b,0xff,0xf4,0x02,0x23,0x02,0x1e,0xff,0x85,0x02,0x23,0x02,0x21,0xff,0xaa, +0x02,0x23,0x02,0x27,0xff,0xf4,0x02,0x23,0x02,0x2a,0xff,0xf4,0x02,0x23,0x02,0x31,0xff,0xb6,0x02,0x24,0x00,0x05,0xff,0x6f,0x02,0x24,0x00,0x0a,0xff,0x6f,0x02,0x24,0x00,0xb4,0xff,0xb0,0x02,0x24,0x00,0xb5,0xff,0x7b,0x02,0x24,0x00,0xb6,0xff,0xbc,0x02,0x24,0x00,0xb7,0xff,0x7b,0x02,0x24,0x02,0x07,0xff,0xe5,0x02,0x24,0x02,0x0b, +0xff,0xe7,0x02,0x24,0x02,0x0d,0xff,0xd7,0x02,0x24,0x02,0x19,0xff,0xdb,0x02,0x24,0x02,0x1c,0xff,0xe7,0x02,0x24,0x02,0x21,0xff,0xdb,0x02,0x25,0x00,0x05,0xff,0x6f,0x02,0x25,0x00,0x0a,0xff,0x6f,0x02,0x25,0x00,0xb4,0xff,0xb0,0x02,0x25,0x00,0xb5,0xff,0x7b,0x02,0x25,0x00,0xb6,0xff,0xbc,0x02,0x25,0x00,0xb7,0xff,0x7b,0x02,0x25, +0x02,0x07,0xff,0xe5,0x02,0x25,0x02,0x0b,0xff,0xe7,0x02,0x25,0x02,0x0d,0xff,0xd7,0x02,0x25,0x02,0x19,0xff,0xdb,0x02,0x25,0x02,0x1c,0xff,0xe7,0x02,0x25,0x02,0x21,0xff,0xdb,0x02,0x27,0x00,0x05,0xff,0x98,0x02,0x27,0x00,0x0a,0xff,0x98,0x02,0x28,0x00,0x05,0xff,0x6f,0x02,0x28,0x00,0x0a,0xff,0x6f,0x02,0x28,0x00,0xb4,0xff,0xb0, +0x02,0x28,0x00,0xb5,0xff,0x7b,0x02,0x28,0x00,0xb6,0xff,0xbc,0x02,0x28,0x00,0xb7,0xff,0x7b,0x02,0x28,0x02,0x07,0xff,0xee,0x02,0x28,0x02,0x19,0xff,0xe7,0x02,0x28,0x02,0x1c,0xff,0xee,0x02,0x28,0x02,0x1e,0xff,0xe7,0x02,0x28,0x02,0x21,0xff,0xe7,0x02,0x29,0x00,0x0f,0xff,0xc3,0x02,0x29,0x00,0x11,0xff,0xae,0x02,0x29,0x00,0xac, +0xff,0xae,0x02,0x29,0x02,0x07,0xff,0xc3,0x02,0x29,0x02,0x0b,0xff,0xb6,0x02,0x29,0x02,0x0c,0xff,0xdb,0x02,0x29,0x02,0x12,0xff,0xb6,0x02,0x29,0x02,0x15,0xff,0xdb,0x02,0x29,0x02,0x18,0xff,0xdb,0x02,0x29,0x02,0x19,0x00,0x29,0x02,0x29,0x02,0x1b,0xff,0xdb,0x02,0x29,0x02,0x21,0x00,0x29,0x02,0x29,0x02,0x26,0xff,0xe7,0x02,0x29, +0x02,0x27,0xff,0xdb,0x02,0x29,0x02,0x2a,0xff,0xdb,0x02,0x29,0x02,0x2d,0xff,0xb6,0x02,0x2a,0x01,0xe4,0xff,0xe5,0x02,0x2c,0x02,0x28,0x00,0x52,0x02,0x2c,0x02,0x2f,0x00,0x52,0x02,0x2d,0x02,0x0c,0xff,0xf4,0x02,0x2d,0x02,0x15,0xff,0xf4,0x02,0x2d,0x02,0x18,0xff,0xf4,0x02,0x2d,0x02,0x19,0xff,0xaa,0x02,0x2d,0x02,0x1a,0xff,0xb6, +0x02,0x2d,0x02,0x1b,0xff,0xf4,0x02,0x2d,0x02,0x1e,0xff,0x85,0x02,0x2d,0x02,0x21,0xff,0xaa,0x02,0x2d,0x02,0x27,0xff,0xf4,0x02,0x2d,0x02,0x2a,0xff,0xf4,0x02,0x2d,0x02,0x31,0xff,0xb6,0x02,0x2e,0x02,0x0c,0xff,0xf4,0x02,0x2e,0x02,0x15,0xff,0xf4,0x02,0x2e,0x02,0x18,0xff,0xf4,0x02,0x2e,0x02,0x19,0xff,0xaa,0x02,0x2e,0x02,0x1a, +0xff,0xb6,0x02,0x2e,0x02,0x1b,0xff,0xf4,0x02,0x2e,0x02,0x1e,0xff,0x85,0x02,0x2e,0x02,0x21,0xff,0xaa,0x02,0x2e,0x02,0x27,0xff,0xf4,0x02,0x2e,0x02,0x2a,0xff,0xf4,0x02,0x2e,0x02,0x31,0xff,0xb6,0x02,0x2f,0x00,0x05,0xff,0x98,0x02,0x2f,0x00,0x0a,0xff,0x98,0x02,0x30,0x00,0x0f,0x00,0x52,0x02,0x30,0x00,0x10,0xff,0x73,0x02,0x30, +0x00,0x11,0x00,0x52,0x02,0x30,0x00,0x1d,0x00,0x52,0x02,0x30,0x00,0x1e,0x00,0x52,0x02,0x30,0x00,0xac,0x00,0x52,0x02,0x30,0x02,0x0b,0x00,0x29,0x02,0x30,0x02,0x0c,0xff,0xd7,0x02,0x30,0x02,0x12,0x00,0x3d,0x02,0x30,0x02,0x15,0xff,0xd7,0x02,0x30,0x02,0x18,0xff,0xd7,0x02,0x30,0x02,0x1b,0xff,0xd7,0x02,0x30,0x02,0x1e,0xff,0xe7, +0x02,0x30,0x02,0x27,0xff,0xd7,0x02,0x30,0x02,0x2a,0xff,0xd7,0x02,0x30,0x02,0x2d,0x00,0x3d,0x02,0x31,0x00,0x05,0x00,0x1d,0x02,0x31,0x00,0x0a,0x00,0x1d,0x02,0x31,0x00,0x0f,0xff,0x98,0x02,0x31,0x00,0x11,0xff,0x7f,0x02,0x31,0x00,0x22,0xff,0xb2,0x02,0x31,0x00,0xac,0xff,0x7f,0x02,0x31,0x00,0xbf,0x00,0x0e,0x02,0x31,0x00,0xc4, +0xff,0x8b,0x02,0x31,0x00,0xc5,0xff,0x8b,0x02,0x31,0x02,0x0b,0xff,0x91,0x02,0x31,0x02,0x0c,0xff,0xf6,0x02,0x31,0x02,0x12,0xff,0x91,0x02,0x31,0x02,0x15,0xff,0xf6,0x02,0x31,0x02,0x18,0xff,0xf6,0x02,0x31,0x02,0x19,0x00,0x29,0x02,0x31,0x02,0x1b,0xff,0xf6,0x02,0x31,0x02,0x21,0x00,0x29,0x02,0x31,0x02,0x27,0xff,0xf6,0x02,0x31, +0x02,0x2a,0xff,0xf6,0x02,0x31,0x02,0x2d,0xff,0x91,0x02,0x33,0x01,0xdc,0x00,0x29,0x02,0x33,0x01,0xde,0xff,0xa2,0x02,0x33,0x01,0xe0,0x00,0x2d,0x02,0x33,0x01,0xe1,0xff,0xa2,0x02,0x33,0x01,0xe3,0x00,0x29,0x02,0x33,0x01,0xe5,0x00,0x1d,0x02,0x33,0x01,0xe7,0xff,0x71,0x02,0x33,0x01,0xeb,0xff,0xa2,0x02,0x33,0x01,0xf2,0xff,0xa2, +0x02,0x33,0x01,0xf5,0xff,0xcf,0x02,0x33,0x01,0xf8,0xff,0xcf,0x02,0x33,0x01,0xf9,0x00,0x29,0x02,0x33,0x01,0xfa,0x00,0x1d,0x02,0x33,0x01,0xfb,0xff,0xa2,0x02,0x33,0x02,0x01,0x00,0x29,0x02,0x33,0x02,0x06,0xff,0xe7,0x02,0x33,0x02,0x07,0xff,0x27,0x02,0x33,0x02,0x09,0xff,0x4e,0x02,0x33,0x02,0x0a,0xff,0x4e,0x02,0x33,0x02,0x0b, +0xff,0x9e,0x02,0x33,0x02,0x0c,0xff,0x2b,0x02,0x33,0x02,0x0f,0xff,0x4e,0x02,0x33,0x02,0x10,0xff,0x4e,0x02,0x33,0x02,0x11,0xff,0x4e,0x02,0x33,0x02,0x12,0xff,0x9e,0x02,0x33,0x02,0x13,0xff,0x4e,0x02,0x33,0x02,0x14,0xff,0x4e,0x02,0x33,0x02,0x15,0xff,0x2b,0x02,0x33,0x02,0x16,0xff,0x4e,0x02,0x33,0x02,0x17,0xff,0x4e,0x02,0x33, +0x02,0x18,0xff,0x2b,0x02,0x33,0x02,0x19,0xff,0xc3,0x02,0x33,0x02,0x1b,0xff,0x2b,0x02,0x33,0x02,0x1c,0xff,0x4c,0x02,0x33,0x02,0x1d,0xff,0x4e,0x02,0x33,0x02,0x1e,0xff,0x4e,0x02,0x33,0x02,0x1f,0xff,0x4e,0x02,0x33,0x02,0x20,0xff,0x4e,0x02,0x33,0x02,0x21,0xff,0xc3,0x02,0x33,0x02,0x22,0xff,0x4e,0x02,0x33,0x02,0x23,0xff,0x4e, +0x02,0x33,0x02,0x24,0xff,0x60,0x02,0x33,0x02,0x25,0xff,0x4e,0x02,0x33,0x02,0x26,0xff,0x54,0x02,0x33,0x02,0x27,0xff,0x2b,0x02,0x33,0x02,0x29,0xff,0x4e,0x02,0x33,0x02,0x2a,0xff,0x2b,0x02,0x33,0x02,0x2b,0xff,0x66,0x02,0x33,0x02,0x2c,0x00,0x6f,0x02,0x33,0x02,0x2d,0xff,0x9e,0x02,0x33,0x02,0x2e,0xff,0x4e,0x02,0x33,0x02,0x32, +0xff,0x4e,0x02,0x33,0x02,0x34,0xff,0x4e,0x02,0x34,0x00,0x0f,0xff,0xc3,0x02,0x34,0x00,0x11,0xff,0xae,0x02,0x34,0x00,0xac,0xff,0xae,0x02,0x34,0x02,0x07,0xff,0xc3,0x02,0x34,0x02,0x0b,0xff,0xb6,0x02,0x34,0x02,0x0c,0xff,0xdb,0x02,0x34,0x02,0x12,0xff,0xb6,0x02,0x34,0x02,0x15,0xff,0xdb,0x02,0x34,0x02,0x18,0xff,0xdb,0x02,0x34, +0x02,0x19,0x00,0x29,0x02,0x34,0x02,0x1b,0xff,0xdb,0x02,0x34,0x02,0x21,0x00,0x29,0x02,0x34,0x02,0x26,0xff,0xe7,0x02,0x34,0x02,0x27,0xff,0xdb,0x02,0x34,0x02,0x2a,0xff,0xdb,0x02,0x34,0x02,0x2c,0x00,0x52,0x02,0x34,0x02,0x2d,0xff,0xb6,0x02,0x37,0x01,0x33,0x00,0x19,0x02,0x37,0x01,0xc5,0x00,0x29,0x02,0x37,0x02,0x37,0x00,0x19, +0x02,0x3d,0x00,0x57,0xff,0xbe,0x02,0x3d,0x00,0x59,0xff,0xcf,0x02,0x3d,0x00,0x5a,0xff,0xe5,0x02,0x3d,0x00,0x5c,0xff,0xd1,0x02,0x3d,0x00,0xba,0xff,0xbe,0x02,0x3d,0x00,0xc4,0xff,0xb2,0x02,0x3d,0x00,0xc5,0xff,0xb2,0x02,0x3d,0x00,0xeb,0xff,0xd1,0x02,0x3d,0x01,0x21,0xff,0xbe,0x02,0x3d,0x01,0x23,0xff,0xbe,0x02,0x3d,0x01,0x77, +0xff,0xbe,0x02,0x3d,0x01,0x81,0xff,0xe5,0x02,0x3d,0x01,0x83,0xff,0xd1,0x02,0x3d,0x01,0x8d,0xff,0xe5,0x02,0x3d,0x01,0x8f,0xff,0xe5,0x02,0x3d,0x01,0x91,0xff,0xe5,0x02,0x3d,0x01,0x93,0xff,0xd1,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x46,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x14,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00, +0x00,0x01,0x00,0x10,0x02,0x14,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x24,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x10,0x02,0x14,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x18,0x02,0x52,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x0e, +0x02,0x6a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x72,0x02,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x2a,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0b,0x00,0x56,0x02,0xea,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0d,0x0e,0x04,0x03,0x40,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x56,0x02,0xea,0x00,0x03, +0x00,0x01,0x04,0x03,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x05,0x00,0x02,0x00,0x10,0x11,0x50,0x00,0x03,0x00,0x01,0x04,0x06,0x00,0x02,0x00,0x0c,0x11,0x60,0x00,0x03,0x00,0x01,0x04,0x07,0x00,0x02,0x00,0x10,0x11,0x6c,0x00,0x03,0x00,0x01,0x04,0x08,0x00,0x02,0x00,0x10,0x11,0x7c,0x00,0x03,0x00,0x01,0x04,0x09, +0x00,0x00,0x02,0x18,0x11,0x8c,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x10,0x02,0x14,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e,0x02,0x24,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x20,0x02,0x32,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x10,0x02,0x14,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x18, +0x02,0x52,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x0e,0x02,0x6a,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x07,0x00,0x72,0x02,0x78,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x08,0x00,0x2a,0x00,0x0e,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x56,0x02,0xea,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0d,0x0e,0x18,0x13,0xa4,0x00,0x03, +0x00,0x01,0x04,0x09,0x00,0x0e,0x00,0x4a,0x02,0xea,0x00,0x03,0x00,0x01,0x04,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x0b,0x00,0x02,0x00,0x10,0x21,0xbc,0x00,0x03,0x00,0x01,0x04,0x0c,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x0e,0x00,0x02,0x00,0x0c,0x21,0xcc,0x00,0x03,0x00,0x01,0x04,0x10, +0x00,0x02,0x00,0x0e,0x21,0xd8,0x00,0x03,0x00,0x01,0x04,0x13,0x00,0x02,0x00,0x12,0x21,0xe6,0x00,0x03,0x00,0x01,0x04,0x14,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x15,0x00,0x02,0x00,0x10,0x21,0xf8,0x00,0x03,0x00,0x01,0x04,0x16,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x19,0x00,0x02,0x00,0x0e, +0x22,0x08,0x00,0x03,0x00,0x01,0x04,0x1b,0x00,0x02,0x00,0x10,0x22,0x16,0x00,0x03,0x00,0x01,0x04,0x1d,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x1f,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x24,0x00,0x02,0x00,0x0e,0x22,0x26,0x00,0x03,0x00,0x01,0x04,0x2d,0x00,0x02,0x00,0x0e,0x22,0x34,0x00,0x03, +0x00,0x01,0x08,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x08,0x16,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x0c,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x0c,0x0c,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x31,0x00,0x38,0x00,0x20,0x00,0x4d,0x00,0x69, +0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x72,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x52,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20, +0x00,0x52,0x00,0x65,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0d,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f, +0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x33,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x37, +0x00,0x2c,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x54, +0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65, +0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x75,0x00,0x72,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64, +0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x3b,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x65,0x00,0x64, +0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x73, +0x00,0x2e,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x55,0x00,0x49,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x55,0x00,0x49,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72, +0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x35,0x00,0x2e,0x00,0x36,0x00,0x32,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x55,0x00,0x49,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x74,0x00,0x72, +0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x6d,0x00,0x61,0x00,0x72,0x00,0x6b,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x6f,0x00,0x75,0x00,0x70,0x00,0x20,0x00,0x6f, +0x00,0x66,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x70,0x00,0x61,0x00,0x6e,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x2e,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x64,0x00,0x6f,0x00,0x63,0x00,0x73,0x00,0x2e,0x00,0x6d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f, +0x00,0x66,0x00,0x74,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x2f,0x00,0x74,0x00,0x79,0x00,0x70,0x00,0x6f,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x70,0x00,0x68,0x00,0x79,0x00,0x2f,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74, +0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73, +0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x63,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x70,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x70,0x00,0x72, +0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20, +0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f, +0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65, +0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x69,0x00,0x63,0x00,0x68,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20, +0x00,0x77,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x65, +0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72, +0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74, +0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x3b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20, +0x00,0x28,0x00,0x69,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x72,0x00,0x69,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x77,0x00,0x6e,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66, +0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x70,0x00,0x75,0x00,0x74, +0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x6c,0x00,0x70,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x41, +0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x0d,0x00,0x0d,0x00,0x54,0x00,0x68,0x00,0x65, +0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65, +0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x65,0x00,0x6e,0x00,0x2e,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x69, +0x00,0x61,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x2f,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x5f,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x73, +0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f, +0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x20,0x1d, +0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x6a,0x00,0x6f,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6c,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48, +0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0d,0x00,0x50,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73, +0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x65,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20, +0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6f,0x00,0x62,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20, +0x00,0x61,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f, +0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x6f, +0x00,0x63,0x00,0x69,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x63,0x00,0x75,0x00,0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20, +0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x20,0x1d,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x61, +0x00,0x6c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x77, +0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x77,0x00,0x69, +0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x75, +0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x6f,0x00,0x64,0x00,0x69,0x00,0x66,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x65,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x73,0x00,0x68, +0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x62,0x00,0x75,0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x2f,0x00,0x6f,0x00,0x72, +0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63, +0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x73, +0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61, +0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x75,0x00,0x72,0x00,0x6e,0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6a,0x00,0x65,0x00,0x63, +0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x3a,0x00,0x0d,0x00,0x0d, +0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x76,0x00,0x65,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74, +0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x69, +0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e, +0x00,0x74,0x00,0x69,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69, +0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2e,0x00,0x0d,0x00,0x0d,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x20,0x00,0x50,0x00,0x52,0x00,0x4f, +0x00,0x56,0x00,0x49,0x00,0x44,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x27,0x00,0x41,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x27,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x59,0x00,0x20, +0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x4b,0x00,0x49,0x00,0x4e,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x45,0x00,0x58,0x00,0x50,0x00,0x52,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4d,0x00,0x50,0x00,0x4c,0x00,0x49,0x00,0x45,0x00,0x44,0x00,0x2c, +0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x4c,0x00,0x55,0x00,0x44,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x42,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x20,0x00,0x54,0x00,0x48, +0x00,0x45,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x49,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4d,0x00,0x45,0x00,0x52,0x00,0x43,0x00,0x48,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c, +0x00,0x20,0x00,0x46,0x00,0x49,0x00,0x54,0x00,0x4e,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x20,0x00,0x50,0x00,0x41,0x00,0x52,0x00,0x54,0x00,0x49,0x00,0x43,0x00,0x55,0x00,0x4c,0x00,0x41,0x00,0x52,0x00,0x20,0x00,0x50,0x00,0x55,0x00,0x52,0x00,0x50,0x00,0x4f,0x00,0x53, +0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x44,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x4e,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x52,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x45,0x00,0x4d,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x2e,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x20,0x00,0x45,0x00,0x56,0x00,0x45, +0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x48,0x00,0x41,0x00,0x4c,0x00,0x4c,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x55,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x50,0x00,0x59,0x00,0x52,0x00,0x49,0x00,0x47,0x00,0x48, +0x00,0x54,0x00,0x20,0x00,0x48,0x00,0x4f,0x00,0x4c,0x00,0x44,0x00,0x45,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x42,0x00,0x45,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x4c,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x43,0x00,0x4c,0x00,0x41,0x00,0x49, +0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x44,0x00,0x41,0x00,0x4d,0x00,0x41,0x00,0x47,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x57, +0x00,0x48,0x00,0x45,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x52,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x2c, +0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x52,0x00,0x54,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x57,0x00,0x49,0x00,0x53,0x00,0x45,0x00,0x2c,0x00,0x20,0x00,0x41,0x00,0x52,0x00,0x49,0x00,0x53,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x46,0x00,0x52,0x00,0x4f,0x00,0x4d, +0x00,0x2c,0x00,0x20,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x4e,0x00,0x45,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x20,0x00,0x54, +0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x55,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20, +0x00,0x44,0x00,0x45,0x00,0x41,0x00,0x4c,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x2e,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x6f, +0x00,0x62,0x00,0x79,0x01,0x0d,0x00,0x65,0x00,0x6a,0x00,0x6e,0x00,0xe9,0x00,0x6e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x61,0x00,0x72,0x00,0x64,0x03,0x9a,0x03,0xb1,0x03,0xbd,0x03,0xbf,0x03,0xbd,0x03,0xb9,0x03,0xba,0x03,0xac,0x00,0xa9,0x00,0x20,0x00,0x32, +0x00,0x30,0x00,0x31,0x00,0x38,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x72,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x52, +0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54, +0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30, +0x00,0x33,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x37,0x00,0x2c,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48, +0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62, +0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x75,0x00,0x72,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74, +0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x3b,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x65,0x00,0x20, +0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72, +0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x73,0x00,0x2e,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74, +0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x63,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x74, +0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x70,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73, +0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20, +0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66, +0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69, +0x00,0x6e,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x69,0x00,0x63,0x00,0x68,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x77,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20, +0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74, +0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20, +0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20, +0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x3b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x72,0x00,0x69, +0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x77,0x00,0x6e,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74, +0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x70,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x6c, +0x00,0x70,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69, +0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x6c, +0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65, +0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x65,0x00,0x6e,0x00,0x2e,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x69,0x00,0x61,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x2f,0x00,0x4d, +0x00,0x49,0x00,0x54,0x00,0x5f,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e, +0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48, +0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x20,0x1d,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x6a,0x00,0x6f,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x6c,0x00,0x79,0x00,0x20, +0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6c,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x4a, +0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x50,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x68,0x00,0x65, +0x00,0x72,0x00,0x65,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f, +0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6f,0x00,0x62,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20, +0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69, +0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x6f,0x00,0x63,0x00,0x69,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x63, +0x00,0x75,0x00,0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f, +0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x20,0x1d,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c, +0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x77,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73, +0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x77,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x6d,0x00,0x69, +0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x2c,0x00,0x20, +0x00,0x6d,0x00,0x6f,0x00,0x64,0x00,0x69,0x00,0x66,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x65,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x62,0x00,0x75, +0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x2f,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69, +0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2c, +0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x74, +0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x75,0x00,0x72,0x00,0x6e, +0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66, +0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x3a,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x76, +0x00,0x65,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d, +0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20, +0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x69,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x70,0x00,0x6f,0x00,0x72, +0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61, +0x00,0x72,0x00,0x65,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x20,0x00,0x50,0x00,0x52,0x00,0x4f,0x00,0x56,0x00,0x49,0x00,0x44,0x00,0x45,0x00,0x44,0x00,0x20, +0x00,0x27,0x00,0x41,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x27,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x59,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59, +0x00,0x20,0x00,0x4b,0x00,0x49,0x00,0x4e,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x45,0x00,0x58,0x00,0x50,0x00,0x52,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4d,0x00,0x50,0x00,0x4c,0x00,0x49,0x00,0x45,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x4c,0x00,0x55, +0x00,0x44,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x42,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52, +0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x49,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4d,0x00,0x45,0x00,0x52,0x00,0x43,0x00,0x48,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x46,0x00,0x49,0x00,0x54,0x00,0x4e,0x00,0x45, +0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x20,0x00,0x50,0x00,0x41,0x00,0x52,0x00,0x54,0x00,0x49,0x00,0x43,0x00,0x55,0x00,0x4c,0x00,0x41,0x00,0x52,0x00,0x20,0x00,0x50,0x00,0x55,0x00,0x52,0x00,0x50,0x00,0x4f,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x44,0x00,0x20, +0x00,0x4e,0x00,0x4f,0x00,0x4e,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x52,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x45,0x00,0x4d,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x2e,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x20,0x00,0x45,0x00,0x56,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x48,0x00,0x41, +0x00,0x4c,0x00,0x4c,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x55,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x50,0x00,0x59,0x00,0x52,0x00,0x49,0x00,0x47,0x00,0x48,0x00,0x54,0x00,0x20,0x00,0x48,0x00,0x4f,0x00,0x4c,0x00,0x44, +0x00,0x45,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x42,0x00,0x45,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x4c,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x43,0x00,0x4c,0x00,0x41,0x00,0x49,0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x44,0x00,0x41,0x00,0x4d, +0x00,0x41,0x00,0x47,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x48,0x00,0x45,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52, +0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x52,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x2c,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x52,0x00,0x54,0x00,0x20, +0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x57,0x00,0x49,0x00,0x53,0x00,0x45,0x00,0x2c,0x00,0x20,0x00,0x41,0x00,0x52,0x00,0x49,0x00,0x53,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x46,0x00,0x52,0x00,0x4f,0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20, +0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x4e,0x00,0x45,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46, +0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x55,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x44,0x00,0x45,0x00,0x41,0x00,0x4c,0x00,0x49,0x00,0x4e, +0x00,0x47,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x61,0x00,0x6c,0x00,0x69,0x00,0x4e,0x00,0x6f,0x00,0x72, +0x00,0x6d,0x00,0xe1,0x00,0x6c,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x65,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x61,0x00,0x61,0x00,0x72,0x00,0x64,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x6e,0x00,0x79,0x04,0x1e,0x04,0x31,0x04,0x4b,0x04,0x47,0x04,0x3d, +0x04,0x4b,0x04,0x39,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0xe1,0x00,0x6c,0x00,0x6e,0x00,0x65,0x00,0x4e,0x00,0x61,0x00,0x76,0x00,0x61,0x00,0x64,0x00,0x6e,0x00,0x6f,0x00,0x41,0x00,0x72,0x00,0x72,0x00,0x75,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x4e,0x00,0x77,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x08,0x00,0x0a,0x00,0x13,0x00,0x07,0xff,0xff,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x23,0x8a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x82,0x30,0x82,0x23,0x7e, +0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x23,0x6f,0x30,0x82,0x23,0x6b,0x02,0x01,0x01,0x31,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x71,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0xa0,0x63,0x30,0x61,0x30,0x2c,0x06,0x0a,0x2b,0x06,0x01, +0x04,0x01,0x82,0x37,0x02,0x01,0x1c,0xa2,0x1e,0x80,0x1c,0x00,0x3c,0x00,0x3c,0x00,0x3c,0x00,0x4f,0x00,0x62,0x00,0x73,0x00,0x6f,0x00,0x6c,0x00,0x65,0x00,0x74,0x00,0x65,0x00,0x3e,0x00,0x3e,0x00,0x3e,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,0xd1,0x66,0x06,0x5e,0x25,0x40, +0xdd,0x89,0xdd,0x33,0x17,0x38,0x13,0xf4,0x79,0x7b,0x24,0x66,0x3e,0x9d,0x0d,0xef,0x96,0x4e,0xe9,0x40,0xb6,0xb7,0x21,0xab,0x14,0x43,0xa0,0x82,0x0d,0x81,0x30,0x82,0x05,0xff,0x30,0x82,0x03,0xe7,0xa0,0x03,0x02,0x01,0x02,0x02,0x13,0x33,0x00,0x00,0x01,0x03,0x5e,0x25,0x1c,0x99,0x1f,0xa3,0x1e,0xb8,0x00,0x00,0x00,0x00,0x01,0x03, +0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65, +0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53, +0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x30,0x1e,0x17,0x0d,0x31,0x38,0x30,0x37,0x31,0x32,0x32,0x30,0x30,0x38,0x34,0x38,0x5a,0x17,0x0d,0x31,0x39,0x30,0x37,0x32,0x36,0x32,0x30,0x30,0x38,0x34,0x38,0x5a,0x30,0x74,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13, +0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72, +0x61,0x74,0x69,0x6f,0x6e,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x03,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01, +0x0a,0x02,0x82,0x01,0x01,0x00,0xd1,0x94,0x76,0x36,0xe6,0x86,0xab,0x36,0xfe,0x69,0xf9,0x46,0x7c,0x8b,0x88,0x50,0xcb,0x90,0x70,0x7f,0xb0,0x55,0xa9,0x24,0x1d,0x7e,0x39,0xe7,0x05,0x9f,0x0f,0xac,0x7b,0x97,0xb2,0xce,0x73,0x0a,0xfb,0xd4,0x9b,0x24,0x5c,0x16,0xb5,0x39,0xdd,0x1b,0x7e,0x33,0x6c,0x11,0xfc,0x3b,0x26,0xf3,0x98,0xaa, +0x5d,0x53,0x6b,0xaa,0xc3,0xec,0x13,0xb8,0xd2,0xef,0xcf,0x57,0x7f,0xcc,0x65,0xcb,0xaf,0x4d,0x2e,0x32,0xb1,0x56,0x2b,0x4e,0x34,0x07,0x89,0xfe,0x69,0x21,0xbd,0x3e,0x44,0xfb,0xde,0x12,0x9d,0x85,0xbf,0x7c,0x76,0x86,0x7d,0x72,0xb1,0x76,0x9b,0x61,0xe6,0x8a,0x64,0x4c,0x46,0xce,0xb6,0xd5,0x3a,0x8c,0x77,0x93,0x77,0x67,0x21,0x9c, +0xb6,0x5a,0x06,0x5e,0x47,0x86,0xf5,0x3c,0xd1,0x09,0xca,0x0d,0x3d,0xcd,0xb2,0xe9,0xa1,0x50,0x78,0xd1,0x84,0x88,0xe2,0x01,0x3c,0x22,0xfc,0xaf,0x96,0x08,0xcc,0x5d,0x99,0xc0,0xed,0xeb,0xa5,0x5a,0x98,0x92,0xf5,0xc8,0x40,0x4e,0x6a,0x73,0xaf,0xde,0xe3,0x74,0x7a,0xd3,0x5f,0x46,0x97,0xbc,0xe2,0x67,0x28,0x77,0x99,0xac,0xc1,0x0e, +0x31,0x16,0x8f,0x00,0x0f,0x01,0xfe,0x4b,0x5e,0x54,0x0f,0xca,0xc4,0x65,0x3f,0x0a,0xe3,0xa3,0x46,0xdb,0xf6,0x2c,0x03,0x3a,0x19,0xbe,0x68,0x05,0x16,0x9c,0xe6,0x7f,0x34,0xbf,0xa7,0x87,0x8d,0x65,0x39,0x26,0xc9,0x63,0xd4,0xef,0xc5,0xdd,0xbd,0x25,0xfe,0xfd,0x28,0xf4,0x34,0x86,0x79,0xac,0x2a,0xd5,0x5f,0x30,0x91,0x3b,0xe4,0x14, +0x6a,0xeb,0xb1,0xca,0x04,0x23,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x7e,0x30,0x82,0x01,0x7a,0x30,0x1f,0x06,0x03,0x55,0x1d,0x25,0x04,0x18,0x30,0x16,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x4c,0x08,0x01,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x47, +0xbe,0xc0,0xcb,0xe1,0xa6,0x3f,0xfd,0x65,0xd6,0x38,0xf2,0x03,0x5d,0xb7,0xaf,0x77,0xf7,0x40,0xff,0x30,0x50,0x06,0x03,0x55,0x1d,0x11,0x04,0x49,0x30,0x47,0xa4,0x45,0x30,0x43,0x31,0x29,0x30,0x27,0x06,0x03,0x55,0x04,0x0b,0x13,0x20,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e, +0x73,0x20,0x50,0x75,0x65,0x72,0x74,0x6f,0x20,0x52,0x69,0x63,0x6f,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x05,0x13,0x0d,0x32,0x33,0x30,0x30,0x31,0x32,0x2b,0x34,0x33,0x37,0x39,0x36,0x35,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x48,0x6e,0x64,0xe5,0x50,0x05,0xd3,0x82,0xaa,0x17,0x37,0x37,0x22,0xb5, +0x6d,0xa8,0xca,0x75,0x02,0x95,0x30,0x54,0x06,0x03,0x55,0x1d,0x1f,0x04,0x4d,0x30,0x4b,0x30,0x49,0xa0,0x47,0xa0,0x45,0x86,0x43,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x63,0x72,0x6c,0x2f,0x4d,0x69,0x63, +0x43,0x6f,0x64,0x53,0x69,0x67,0x50,0x43,0x41,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x2d,0x30,0x37,0x2d,0x30,0x38,0x2e,0x63,0x72,0x6c,0x30,0x61,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x55,0x30,0x53,0x30,0x51,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f, +0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x43,0x6f,0x64,0x53,0x69,0x67,0x50,0x43,0x41,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x2d,0x30,0x37,0x2d,0x30,0x38,0x2e,0x63,0x72,0x74,0x30, +0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x9f,0xf5,0xc9,0x53,0x0d,0x3f,0x0d,0x26,0xec,0xa2,0x44,0xd8,0x0d,0xd1,0x9f,0x63,0x96,0x06,0x4b,0x3f,0x1e,0x5c,0xc5,0x33,0xa3,0xa4,0xc3,0x6c,0xaf,0x1f,0xc0, +0x01,0xba,0xeb,0x65,0xec,0x9e,0x33,0x10,0x0f,0xa7,0xac,0x5b,0xd4,0xbd,0x90,0x61,0x17,0xe7,0x31,0xe7,0xc3,0x26,0xb4,0xac,0xf5,0x27,0xd3,0x48,0x93,0x86,0x88,0xfe,0x12,0x35,0x91,0x64,0x22,0xd1,0x6b,0x2d,0x3b,0xa8,0x2c,0x15,0x94,0x29,0xd2,0x37,0x96,0xe6,0x35,0xff,0x0c,0xce,0xc8,0x06,0x16,0x16,0x9e,0x24,0xb1,0xe2,0x39,0xf9, +0x6e,0x0e,0x78,0xd8,0x0c,0x1b,0xb6,0x29,0x60,0x27,0x76,0x34,0x24,0x9b,0xdd,0xb9,0x97,0x75,0xcb,0x01,0x3b,0xad,0x82,0x12,0x16,0x22,0x80,0x89,0x15,0x84,0xbb,0x98,0x50,0x20,0xb0,0x17,0x26,0x86,0x49,0xaf,0xce,0x7d,0x45,0x15,0x43,0x34,0x96,0xcf,0x81,0x5c,0x18,0x2c,0xd4,0x93,0xf2,0x67,0xab,0xe2,0x73,0xc8,0x3d,0xa3,0xcd,0xfc, +0x32,0x1e,0x60,0x1c,0xe9,0xb0,0x1b,0x30,0xfb,0x2c,0xbb,0x07,0x2e,0x96,0x84,0x93,0x45,0x28,0x54,0x5c,0xcd,0x96,0xfd,0xa0,0xdb,0x81,0xd8,0xb6,0x30,0xca,0x43,0xb1,0xf3,0x48,0xc0,0xb2,0x46,0x1c,0x5d,0x5e,0x76,0x2a,0x58,0x9f,0xd4,0xee,0xf2,0xf4,0xfa,0x48,0x4c,0xb5,0x61,0x8b,0xb0,0x8c,0x41,0xe9,0xaa,0xb8,0x9d,0x90,0xf4,0xff, +0x6a,0x42,0x0f,0xb9,0x3e,0xe9,0x0e,0xec,0x94,0xfc,0x8d,0x80,0xbb,0x78,0xe3,0x23,0xa7,0x78,0x5b,0xb2,0x6d,0x1f,0xf9,0x59,0xc1,0x7d,0xb6,0xd1,0x39,0xc9,0x79,0xe0,0x83,0x1c,0x60,0x0a,0xda,0x3d,0xb0,0xd1,0xed,0x36,0xbf,0x45,0x07,0xe9,0x1b,0x36,0x6e,0xe5,0x3d,0x3b,0x05,0x03,0xa7,0xd4,0xa7,0x25,0x12,0x8f,0xe6,0x76,0xa3,0x13, +0xb3,0x45,0x5a,0x43,0x31,0x82,0xda,0xd8,0x84,0xae,0xb9,0xb0,0x1f,0x75,0xf5,0xf6,0x1d,0x7d,0x51,0x11,0x37,0x27,0xe8,0xb5,0x35,0x84,0x71,0xf7,0x57,0xaa,0xae,0xfa,0x89,0x71,0xc9,0x98,0xd2,0x9e,0x5a,0x64,0x76,0xbe,0x8c,0xc3,0x7d,0x15,0x6a,0x91,0xf1,0x14,0xf4,0xf2,0xd9,0x35,0x31,0xb8,0xdb,0x72,0xfa,0xb4,0x75,0xc8,0x88,0x9b, +0x6a,0xbf,0x98,0x45,0xc7,0x66,0xb2,0xd7,0xff,0xce,0x92,0x90,0x75,0xe4,0xeb,0xe6,0x86,0xd2,0xc8,0x1b,0xdb,0x27,0xc0,0x5b,0x95,0x6f,0x49,0x6f,0x58,0x5d,0x69,0x2a,0xde,0x53,0x4b,0xf8,0xe8,0xca,0x7b,0xf6,0x6c,0x15,0xf9,0x03,0x19,0x0f,0x11,0x85,0xaa,0x4f,0x9a,0xbf,0xaa,0x57,0xdd,0x60,0xc6,0xf5,0x71,0x20,0xf4,0x51,0xa8,0x9a, +0xca,0xe9,0xd1,0xeb,0x34,0x47,0x3d,0x75,0xfa,0x22,0xec,0x55,0x3f,0x6a,0x19,0x39,0x6b,0x10,0xe9,0x5a,0x3f,0x8e,0xf4,0x23,0x78,0x30,0xb2,0xf2,0xa6,0x38,0xcb,0x35,0x8d,0xaa,0x98,0x59,0x24,0x40,0xb8,0x3a,0x67,0xa4,0x07,0x5f,0xa0,0xfe,0xd8,0x3b,0x49,0x13,0xfb,0x0c,0xe1,0xed,0x0b,0x6d,0x83,0x50,0xce,0xf0,0x7f,0x3e,0xe0,0xd9, +0x08,0xe8,0x8c,0x21,0x4a,0x41,0xc2,0xde,0xeb,0x8e,0x5b,0xee,0x03,0xc3,0x1d,0x6e,0x6e,0xe6,0x54,0x35,0x66,0x67,0x72,0x7c,0x1a,0xea,0x52,0xf6,0x22,0xc4,0x72,0x3f,0xae,0x30,0x82,0x07,0x7a,0x30,0x82,0x05,0x62,0xa0,0x03,0x02,0x01,0x02,0x02,0x0a,0x61,0x0e,0x90,0xd2,0x00,0x00,0x00,0x00,0x00,0x03,0x30,0x0d,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81,0x88,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64, +0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66, +0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x32,0x30,0x31,0x31,0x30,0x1e,0x17,0x0d,0x31,0x31,0x30,0x37,0x30,0x38,0x32,0x30,0x35,0x39,0x30,0x39,0x5a,0x17,0x0d,0x32,0x36,0x30,0x37,0x30,0x38,0x32,0x31,0x30,0x39,0x30,0x39,0x5a,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13, +0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43, +0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x30,0x82,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86, +0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0f,0x00,0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0xab,0xf0,0xfa,0x72,0x10,0x1c,0x2e,0xad,0xd8,0x6e,0xaa,0x82,0x10,0x4d,0x34,0xba,0xf2,0xb6,0x58,0x21,0x9f,0x42,0x1b,0x2a,0x6b,0xe9,0x5a,0x50,0xaa,0xb8,0x06,0x38,0x1a,0x04,0x49,0xba,0x7f,0xc3,0x0c,0x1e,0xdd,0x37,0x6b, +0xc6,0x12,0xd8,0x0b,0xf0,0x38,0xc2,0x99,0x06,0xb0,0xc8,0x39,0xd5,0x01,0x14,0x31,0x42,0xd3,0x89,0x0d,0x79,0x64,0x87,0x7e,0x94,0x60,0x24,0x6c,0xaf,0x9e,0x49,0x9c,0xe9,0x68,0x5e,0xd2,0xdf,0x9b,0x53,0xb2,0x0a,0x2c,0xc3,0xaf,0xd9,0xa9,0x2b,0xae,0x7a,0x09,0xaf,0xd7,0x96,0x59,0xca,0x60,0x1a,0x05,0xe9,0x66,0x76,0xe8,0x32,0x52, +0x26,0x12,0x2f,0xe7,0xab,0x08,0x50,0xcf,0xb3,0x44,0xb7,0x5d,0xd8,0xc4,0x2e,0x03,0x75,0xab,0x68,0xf3,0xcb,0x6d,0xf3,0x3a,0x5c,0xa1,0x16,0xf4,0x46,0xba,0xe0,0x38,0x64,0xac,0x6e,0x64,0x35,0x78,0xa6,0xa0,0x63,0x0f,0x2d,0xd3,0x40,0x93,0xf8,0xe3,0xde,0x07,0x0d,0xd5,0x5c,0x79,0xa5,0x49,0x29,0xe7,0x0d,0xbe,0xa0,0x13,0x77,0xbe, +0x94,0x3d,0xef,0xfb,0xe3,0x2b,0x5a,0x10,0x1f,0x4d,0x56,0x28,0xa2,0x7a,0x72,0xe0,0x12,0x3a,0xb7,0x49,0x5e,0xd8,0xed,0xed,0x43,0x91,0x83,0xd9,0x7b,0xb2,0x7b,0x86,0x1b,0xd9,0x3e,0xb1,0x8c,0x5d,0xe8,0x89,0x4f,0x84,0x1a,0xf2,0xa1,0x2f,0x59,0xe4,0x90,0x3b,0x2d,0xae,0x33,0x58,0xc5,0xb7,0x3e,0xfe,0x32,0xd3,0xb3,0x03,0x3d,0xb1, +0xb2,0xaf,0x92,0x38,0x7e,0xd2,0x9d,0x80,0x2c,0xf5,0x4e,0x56,0x91,0x21,0x35,0x25,0xc3,0x39,0x6e,0x64,0x7f,0x53,0xba,0x9c,0x0f,0xad,0x19,0x23,0x84,0xcb,0xf4,0xba,0x03,0x86,0x8d,0xf7,0x5f,0xf0,0xd0,0x52,0xbf,0x8c,0x94,0x87,0xbc,0xc0,0x21,0x74,0x25,0x5f,0x18,0x28,0xb6,0xcc,0x27,0x28,0x38,0x25,0x98,0x39,0x4a,0x36,0xcf,0x7c, +0xb1,0x92,0xae,0x1c,0x23,0xa7,0xa9,0x66,0xec,0x61,0x1f,0x6a,0xe1,0x28,0x49,0x9d,0x5f,0x88,0xe2,0x25,0x5d,0xd3,0x21,0x4b,0x3e,0x52,0xc4,0xb5,0x57,0x3f,0x24,0x03,0xf0,0xd1,0x7a,0x5b,0x2f,0xd5,0x23,0xe3,0x70,0x5d,0x0f,0x51,0x46,0x77,0xb3,0xf8,0x00,0xe1,0xbc,0xac,0x02,0x82,0x5f,0xdb,0xc0,0x15,0xb3,0xbd,0x1b,0xd4,0x55,0x4b, +0xe7,0x39,0xa1,0x0f,0xe9,0x23,0x49,0xbc,0x18,0xb8,0x44,0x7c,0x45,0xe4,0xc1,0xc3,0x72,0x7a,0xe0,0x72,0xe7,0x24,0xdf,0xbf,0x46,0x99,0xc5,0xef,0xc2,0x1c,0x57,0xdb,0x83,0x8d,0xec,0x4d,0x49,0x30,0xa7,0xab,0x8e,0xdf,0xec,0x5b,0x9f,0xaf,0xfc,0xdd,0xb0,0x66,0xe2,0xc1,0x97,0x81,0x7b,0xed,0xd6,0xed,0x4b,0xe7,0x49,0x29,0xa7,0x13, +0x28,0xa6,0xa7,0x7d,0x67,0x80,0xe6,0x8a,0x62,0x78,0x5f,0xb2,0x2f,0x84,0xd7,0x57,0x9c,0x5c,0xbf,0x77,0x28,0x28,0xf1,0xed,0x6d,0xc3,0x28,0x8f,0x2c,0x8f,0x40,0x37,0x4f,0xc1,0xe1,0x85,0x44,0x89,0xc4,0x09,0x4c,0xc5,0xd4,0xa5,0x43,0x2f,0x74,0x95,0xf7,0x6e,0xf8,0x78,0x20,0x58,0x2c,0x13,0x5d,0x60,0x95,0x9a,0x3e,0x4f,0x33,0x84, +0xda,0xb0,0x88,0x17,0xde,0x9e,0x4e,0xf4,0x96,0xb0,0xbc,0x46,0xa0,0x6c,0x98,0xd2,0xe0,0xd6,0x88,0x8c,0x0b,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0xed,0x30,0x82,0x01,0xe9,0x30,0x10,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x48, +0x6e,0x64,0xe5,0x50,0x05,0xd3,0x82,0xaa,0x17,0x37,0x37,0x22,0xb5,0x6d,0xa8,0xca,0x75,0x02,0x95,0x30,0x19,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04,0x0c,0x1e,0x0a,0x00,0x53,0x00,0x75,0x00,0x62,0x00,0x43,0x00,0x41,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f,0x06,0x03,0x55, +0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x72,0x2d,0x3a,0x02,0x31,0x90,0x43,0xb9,0x14,0x05,0x4e,0xe1,0xea,0xa7,0xc7,0x31,0xd1,0x23,0x89,0x34,0x30,0x5a,0x06,0x03,0x55,0x1d,0x1f,0x04,0x53,0x30,0x51,0x30,0x4f,0xa0,0x4d,0xa0,0x4b,0x86,0x49, +0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x5f, +0x30,0x33,0x5f,0x32,0x32,0x2e,0x63,0x72,0x6c,0x30,0x5e,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x52,0x30,0x50,0x30,0x4e,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x42,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f, +0x70,0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x5f,0x30,0x33,0x5f,0x32,0x32,0x2e,0x63,0x72,0x74,0x30,0x81,0x9f,0x06,0x03,0x55,0x1d,0x20,0x04,0x81,0x97,0x30,0x81,0x94,0x30,0x81,0x91,0x06,0x09,0x2b,0x06,0x01,0x04, +0x01,0x82,0x37,0x2e,0x03,0x30,0x81,0x83,0x30,0x3f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x33,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x64,0x6f,0x63,0x73,0x2f,0x70,0x72,0x69,0x6d,0x61, +0x72,0x79,0x63,0x70,0x73,0x2e,0x68,0x74,0x6d,0x30,0x40,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x34,0x1e,0x32,0x20,0x1d,0x00,0x4c,0x00,0x65,0x00,0x67,0x00,0x61,0x00,0x6c,0x00,0x5f,0x00,0x70,0x00,0x6f,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x79,0x00,0x5f,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x65,0x00, +0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x20,0x1d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x67,0xf2,0x86,0xa5,0x98,0xe0,0x54,0x79,0x1a,0x2e,0xd3,0xd8,0x74,0x67,0x22,0x9b,0x0b,0x96,0x11,0xe1,0x63,0x92,0x99,0x42,0x96,0x7d,0xd2,0x79,0x0c,0x90,0xc1,0x65,0x5f, +0x2e,0x2c,0x3e,0xf8,0xc3,0x72,0xd1,0x6d,0x83,0xfe,0xbe,0x3f,0xe8,0x0a,0xca,0x3b,0xbf,0x47,0xa9,0xa3,0xf3,0x69,0xdb,0x63,0xbf,0x22,0x35,0xa5,0x97,0x5d,0x65,0x84,0x90,0x7d,0x8b,0x46,0x50,0x55,0xd8,0x0c,0x92,0x7c,0xd2,0x1a,0x4b,0x1c,0xf3,0x3c,0x42,0x8b,0x52,0xd0,0xb0,0xfd,0x6b,0xe3,0x3e,0x07,0x2e,0x29,0x9b,0xe6,0x3d,0x1b, +0xa5,0xd4,0xb5,0x1d,0x77,0x94,0x39,0xe2,0xe9,0x64,0xc9,0x44,0x3d,0x78,0x7a,0x23,0xf3,0x13,0x7d,0xa6,0x90,0x74,0x83,0x8d,0xf4,0xcb,0x26,0x02,0x46,0x2a,0xc2,0x8a,0x10,0xbb,0xa4,0xa9,0x05,0x0c,0x9b,0xed,0x68,0xfa,0x68,0x2e,0x95,0xa0,0x2a,0x3f,0x2a,0x6b,0x58,0x49,0x63,0x1f,0x09,0x69,0x6e,0x5a,0x98,0x96,0xe4,0x83,0xf4,0xc0, +0x8f,0xf3,0x46,0x2b,0xde,0xfc,0x3b,0xd0,0xbd,0x35,0xef,0x6e,0x25,0xae,0xe5,0xaf,0x27,0xed,0xd0,0xdd,0xf3,0x0e,0xaf,0x99,0x28,0x97,0x98,0x4d,0x0e,0x3d,0x0b,0xf2,0x08,0x89,0xd6,0x1f,0xc3,0x32,0x18,0xe2,0xf0,0xc5,0x2d,0xce,0x5b,0x9e,0xb4,0x49,0x39,0x0a,0xc6,0x0a,0xc2,0xc6,0xad,0xae,0xe5,0xb2,0xd9,0xdb,0x15,0x88,0x51,0x45, +0x58,0x38,0x32,0x71,0x27,0x1a,0x7f,0xb1,0xf4,0x27,0xf8,0xde,0x2c,0x3a,0x20,0x69,0x98,0xb2,0x59,0x89,0x68,0x6e,0x6f,0xa7,0xb7,0x74,0xc3,0x40,0x05,0x06,0xa6,0x01,0x2a,0x28,0x3e,0x82,0x3f,0x13,0x4d,0x66,0x0b,0xc0,0xb3,0x4d,0xf5,0xe1,0x8f,0x7f,0x1c,0x6f,0x15,0x7d,0x45,0xa7,0x76,0xe5,0x40,0x2a,0x65,0xa3,0xc3,0x5d,0x52,0x62, +0x86,0xc3,0x1d,0x63,0x36,0x97,0x86,0xdf,0xda,0xf3,0xf8,0xf2,0x16,0xa1,0x9a,0x27,0xe1,0xcd,0xa5,0x97,0xd0,0xee,0x5d,0x63,0x41,0xe3,0x5b,0x07,0x9c,0x87,0x3e,0x06,0x77,0x06,0xd1,0x06,0xb1,0x75,0x1f,0x14,0xbe,0x61,0x61,0xb5,0xf0,0xdc,0xc6,0x1b,0x04,0xbe,0xdf,0x41,0xc7,0x0e,0x28,0xee,0xde,0x65,0x2f,0xec,0x97,0xf6,0xa1,0x5c, +0x96,0xd8,0x00,0xd6,0xa1,0x46,0xbd,0x59,0xf3,0x97,0xa5,0x09,0x4b,0x48,0x10,0x99,0x80,0x1f,0xd0,0x00,0x29,0xc5,0xb1,0x9b,0xa5,0x3f,0x45,0x77,0x1e,0x35,0xc6,0xd2,0xa2,0xa2,0x9f,0x7a,0x7a,0x22,0xfa,0x48,0x95,0x1f,0xab,0xfb,0x47,0x23,0x80,0xf5,0x9e,0xf8,0xbf,0x6b,0xb7,0x4b,0x97,0xe2,0xeb,0x75,0x78,0x1a,0xec,0xea,0x37,0x99, +0x79,0x18,0x4b,0xff,0xd6,0xb3,0x23,0x68,0x75,0xe6,0xaf,0xfa,0xfc,0x8b,0xeb,0x0b,0x80,0xea,0x69,0x3b,0xaf,0xfc,0x30,0xed,0x04,0x4c,0x8e,0xdf,0xdf,0x75,0x6d,0x63,0x91,0x3d,0xd1,0x9d,0x56,0x4e,0x4f,0xbf,0x80,0x57,0x22,0xa1,0x78,0x11,0x32,0x21,0x7a,0xef,0x41,0x0a,0xb1,0x3f,0xfb,0xa8,0xcc,0xa4,0x5d,0xc1,0xa1,0x88,0x9b,0x57, +0x71,0x56,0x4e,0x48,0x45,0xc0,0x42,0xc9,0x9b,0x76,0x5b,0x0a,0x80,0x48,0x6b,0xfd,0x79,0x9f,0xc1,0xbd,0x6d,0x6d,0x6a,0xc9,0x52,0x73,0x13,0x0d,0x7a,0x50,0xcd,0x31,0x82,0x15,0x5b,0x30,0x82,0x15,0x57,0x02,0x01,0x01,0x30,0x81,0x95,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11, +0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74, +0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x02,0x13,0x33,0x00,0x00,0x01,0x03,0x5e,0x25,0x1c,0x99,0x1f,0xa3,0x1e,0xb8,0x00,0x00,0x00,0x00, +0x01,0x03,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x81,0xae,0x30,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0x30,0x1c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0b,0x31,0x0e,0x30, +0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x15,0x30,0x2f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xef,0x1c,0x60,0x9d,0x4d,0xa4,0xea,0x66,0x76,0x09,0x51,0xf4,0xba,0x29,0x24,0x71,0xc9,0x1d,0x9e,0x20,0xa1,0x48,0x83,0xb3,0x95,0xb6,0x32,0x21,0x3f,0xc2,0xe1,0x1b,0x30,0x42, +0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0c,0x31,0x34,0x30,0x32,0xa0,0x14,0x80,0x12,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0xa1,0x1a,0x80,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63, +0x6f,0x6d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x01,0x00,0x40,0xe0,0xd2,0x89,0x67,0x1e,0x8d,0xfc,0xdd,0x9c,0xd3,0x57,0x55,0xe8,0x1f,0x88,0x8d,0x5a,0xb1,0x90,0xf0,0xfa,0xb0,0x85,0xec,0xba,0xfa,0x6d,0x70,0xfa,0xab,0x25,0x02,0xe2,0x31,0xef,0xa5,0xfb,0xb2,0x85,0x7a,0xf7,0x50, +0xcf,0x79,0xff,0xf4,0x16,0x03,0x5f,0x86,0xa6,0xde,0xda,0x4a,0xfc,0x47,0xdd,0x21,0x41,0x45,0xda,0xcd,0x3b,0xe9,0xf3,0xf1,0xe6,0xd3,0xf8,0x9b,0xd8,0x83,0xcb,0x5f,0x4e,0x07,0x80,0x70,0x2a,0xc3,0x57,0x1e,0xa3,0x72,0xf3,0xe7,0xc7,0x90,0xd3,0x53,0xc7,0x44,0x76,0xd6,0xff,0xeb,0x2e,0x62,0xf4,0x1b,0xe2,0x09,0x62,0x8f,0x0a,0x08, +0x1b,0xc9,0xc5,0x1a,0xe0,0xd3,0x20,0x65,0x22,0x84,0xc1,0x58,0x73,0xa8,0x05,0x4c,0x6c,0x2a,0xee,0x5c,0x61,0x76,0x16,0x53,0x2b,0xf2,0x1a,0xb3,0xdb,0x8c,0xd7,0x39,0x03,0x3d,0x4c,0xf6,0xbd,0x67,0x20,0x8e,0x69,0xf9,0x0e,0x50,0x18,0x08,0x70,0x7d,0x33,0xfb,0xff,0x2e,0x5c,0x62,0x2d,0x6e,0xc6,0x3e,0x5e,0xf7,0x60,0x56,0x99,0xce, +0x52,0x94,0xce,0x2f,0xae,0xf8,0x50,0x19,0xe7,0x6e,0x6a,0x22,0x9b,0x27,0x70,0xfe,0xbe,0x79,0xdb,0x31,0x52,0x01,0x3f,0x4e,0xb4,0xcd,0xe8,0xf7,0x30,0xc2,0x61,0x02,0xc7,0x05,0x9b,0x0a,0x2f,0xe5,0xf5,0x0e,0x0c,0x9d,0xcb,0x2a,0xb0,0x79,0xac,0x96,0xf8,0x39,0xf0,0xb4,0xe5,0x67,0x7f,0x94,0x8a,0xac,0x77,0x9a,0xc9,0x38,0xb9,0x93, +0xed,0xf5,0x33,0xc2,0x44,0x82,0x81,0x5d,0xab,0x33,0x75,0xd2,0x6e,0x43,0xf4,0x03,0xf0,0x91,0x23,0x18,0xfb,0xa1,0x82,0x12,0xe5,0x30,0x82,0x12,0xe1,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x03,0x03,0x01,0x31,0x82,0x12,0xd1,0x30,0x82,0x12,0xcd,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x12,0xbe, +0x30,0x82,0x12,0xba,0x02,0x01,0x03,0x31,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x82,0x01,0x51,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x01,0x04,0xa0,0x82,0x01,0x40,0x04,0x82,0x01,0x3c,0x30,0x82,0x01,0x38,0x02,0x01,0x01,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84, +0x59,0x0a,0x03,0x01,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,0x4d,0xd8,0x6e,0x4d,0x11,0x8e,0x9b,0xbb,0x96,0x9d,0x1d,0x2e,0x32,0x48,0x7c,0xb0,0xde,0x56,0x6c,0xeb,0x7e,0x1c,0xe6,0x73,0xbc,0xa1,0x52,0xc7,0xa9,0xdb,0x41,0x31,0x02,0x06,0x5c,0x3d,0xd3,0x10,0xa8,0xe5,0x18, +0x13,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x34,0x31,0x38,0x34,0x30,0x33,0x36,0x2e,0x37,0x34,0x35,0x5a,0x30,0x04,0x80,0x02,0x01,0xf4,0xa0,0x81,0xd0,0xa4,0x81,0xcd,0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69, +0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b, +0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54,0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37, +0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0xa0,0x82,0x0e,0x3c,0x30,0x82,0x04,0xf1,0x30,0x82,0x03,0xd9,0xa0,0x03,0x02,0x01,0x02,0x02,0x13, +0x33,0x00,0x00,0x00,0xee,0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c,0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68, +0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04, +0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x1e,0x17,0x0d,0x31,0x38,0x31,0x30,0x32,0x34,0x32,0x31,0x31,0x34,0x31,0x35,0x5a,0x17,0x0d,0x32,0x30,0x30,0x31,0x31,0x30,0x32,0x31,0x31,0x34,0x31,0x35,0x5a, +0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a, +0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26, +0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54,0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37,0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d, +0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xa3,0xf7,0x56,0x35,0x84,0xf3,0xdd,0x34,0xe4,0xa3,0x93,0x48,0x65,0xb2,0x92,0x69,0xb8,0xa1, +0x51,0xc2,0xfb,0x51,0x1e,0x08,0xbe,0xa5,0x84,0xaf,0xf3,0x48,0x46,0x9b,0x6c,0x0c,0xdc,0x8f,0xc3,0x82,0x4b,0x12,0x11,0xb1,0x11,0x5c,0xff,0x22,0xb3,0x3e,0xc2,0xde,0xb7,0xda,0xac,0x93,0x45,0x91,0xf4,0x8a,0xff,0x12,0x16,0x6f,0xd2,0x2d,0x4f,0xc8,0x20,0x76,0x05,0x21,0x37,0x4b,0x9f,0xd4,0xfd,0x57,0x7e,0xa9,0xf4,0x91,0x21,0xa6, +0xb9,0x8c,0x69,0xbf,0xe9,0x21,0xb8,0x98,0x0c,0x20,0xb7,0x5b,0xb4,0xc5,0xbf,0x4f,0xc3,0x6c,0x74,0x86,0x8d,0x10,0xfc,0x68,0xfe,0x8d,0x0c,0x85,0x64,0x5b,0xf0,0x23,0x2d,0xda,0x24,0x0b,0x0c,0x50,0xb4,0x8c,0x8f,0x67,0x02,0x0d,0x97,0x37,0xb4,0x1f,0x1d,0xaf,0x8b,0xcd,0xd5,0x87,0x8c,0x1e,0x70,0xd3,0xee,0xdf,0x22,0xc9,0xfe,0x54, +0xac,0x57,0xf4,0xbe,0xcd,0x55,0x12,0xfb,0x9b,0xa0,0x29,0xe1,0xcb,0x56,0x02,0x2e,0x4d,0xcb,0x72,0x2a,0xbf,0x4c,0x8c,0x14,0x9a,0x84,0x2a,0x25,0xdf,0x11,0xce,0x80,0x81,0xea,0x15,0x60,0x62,0x57,0xa2,0x0e,0x1a,0x09,0x74,0xa5,0x18,0xad,0xe9,0x9a,0x88,0x56,0x2c,0xcd,0xaf,0xd2,0x69,0x5d,0x2f,0xf1,0x88,0x1a,0x96,0x11,0x38,0x51, +0x0e,0x97,0xbd,0xdd,0x6c,0x11,0x52,0xe8,0x32,0xa5,0x95,0x17,0xa4,0x27,0x49,0xa9,0x7e,0x38,0x1a,0x84,0x1d,0xe8,0xe5,0xe7,0xcd,0x9f,0x6c,0x9c,0x2f,0x44,0x65,0x13,0x5d,0x89,0x5a,0x80,0x3d,0x3c,0x5a,0x37,0x7e,0xfd,0x5f,0xc6,0xab,0x2d,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x1b,0x30,0x82,0x01,0x17,0x30,0x1d,0x06,0x03,0x55, +0x1d,0x0e,0x04,0x16,0x04,0x14,0x26,0x77,0xcd,0x38,0x2b,0x45,0x7e,0xbd,0xd3,0x33,0x65,0x28,0xf7,0xcf,0xe3,0x68,0xf2,0x0e,0x65,0x4d,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xd5,0x63,0x3a,0x5c,0x8a,0x31,0x90,0xf3,0x43,0x7b,0x7c,0x46,0x1b,0xc5,0x33,0x68,0x5a,0x85,0x6d,0x55,0x30,0x56,0x06,0x03,0x55, +0x1d,0x1f,0x04,0x4f,0x30,0x4d,0x30,0x4b,0xa0,0x49,0xa0,0x47,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x54,0x69,0x6d,0x53,0x74, +0x61,0x50,0x43,0x41,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x37,0x2d,0x30,0x31,0x2e,0x63,0x72,0x6c,0x30,0x5a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x4e,0x30,0x4c,0x30,0x4a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72, +0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x54,0x69,0x6d,0x53,0x74,0x61,0x50,0x43,0x41,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x37,0x2d,0x30,0x31,0x2e,0x63,0x72,0x74,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x13,0x06, +0x03,0x55,0x1d,0x25,0x04,0x0c,0x30,0x0a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x08,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x91,0x3f,0xe2,0xd1,0x15,0x1b,0x20,0x21,0x1c,0xf2,0x7b,0xbc,0xe4,0x9b,0x59,0x03,0xdf,0x8c,0x9a,0x5c,0x62,0xc4,0x1e,0xc1,0xc5,0xd3, +0x4e,0x96,0x21,0x60,0xf5,0x03,0xe5,0xcf,0x83,0x98,0x94,0x27,0x4d,0x5d,0xf8,0x1a,0x4e,0xec,0xa4,0x59,0xe3,0x23,0x87,0x2c,0x2c,0xc8,0x72,0xf8,0xc4,0x26,0xc3,0x73,0x06,0x5a,0xa7,0xff,0xed,0xfe,0xee,0xa1,0x8a,0x27,0xc5,0x65,0x68,0xc8,0xf6,0x16,0x8f,0x5a,0x4e,0x72,0xe5,0x37,0xf1,0x91,0x81,0xfc,0x18,0xe4,0x6e,0x2c,0xcd,0x94, +0x99,0xb5,0xda,0x60,0xa0,0x60,0x5f,0x76,0x3c,0x64,0x46,0x45,0xff,0x19,0x16,0x0c,0x40,0x25,0x7f,0x67,0xbb,0x2f,0x3a,0xfc,0x1f,0xbf,0x18,0x6c,0x68,0x90,0x8c,0xad,0x9a,0x23,0x6f,0xfd,0xa9,0xa6,0x3e,0x29,0xb2,0x57,0x1e,0xaa,0x83,0x8c,0xa3,0x1a,0xb5,0x95,0xe3,0xd7,0x0b,0x78,0xc9,0xa4,0xd1,0x0b,0x1c,0xbb,0xcd,0xc5,0xcf,0xe3, +0x13,0x45,0x57,0x43,0x0f,0x1f,0xc1,0x17,0x86,0x26,0x71,0x2f,0xad,0x27,0x6e,0x11,0xf3,0xa6,0xb3,0x72,0x5d,0x90,0xa3,0xdd,0xa0,0x2b,0x74,0x87,0xf7,0x77,0x26,0xd9,0x06,0x8f,0x5f,0x4d,0xfd,0x1e,0x0f,0x7b,0x0c,0x34,0xf0,0x25,0x54,0x21,0xe4,0x6e,0x4b,0x1f,0xab,0x7d,0x9d,0x9a,0x01,0x80,0x02,0xdf,0xf6,0xa9,0xa6,0x19,0xf9,0x24, +0xd2,0xa8,0x14,0x2e,0x38,0xfa,0x21,0x59,0x33,0xfe,0x9b,0x67,0xca,0x10,0x77,0x4f,0x66,0x4e,0x7c,0x97,0xb7,0x04,0x5a,0xa5,0x04,0xb3,0x56,0x39,0xb6,0x2f,0x54,0x21,0xe2,0x5c,0xc5,0x01,0xa8,0x46,0x30,0x82,0x06,0x71,0x30,0x82,0x04,0x59,0xa0,0x03,0x02,0x01,0x02,0x02,0x0a,0x61,0x09,0x81,0x2a,0x00,0x00,0x00,0x00,0x00,0x02,0x30, +0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81,0x88,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65, +0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43, +0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x32,0x30,0x31,0x30,0x30,0x1e,0x17,0x0d,0x31,0x30,0x30,0x37,0x30,0x31,0x32,0x31,0x33,0x36,0x35,0x35,0x5a,0x17,0x0d,0x32,0x35,0x30,0x37,0x30,0x31,0x32,0x31,0x34,0x36,0x35,0x35,0x5a,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06, +0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73, +0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xa9,0x1d,0x0d,0xbc,0x77,0x11,0x8a,0x3a,0x20,0xec,0xfc,0x13,0x97,0xf5,0xfa,0x7f,0x69,0x94,0x6b,0x74,0x54,0x10,0xd5,0xa5,0x0a,0x00,0x82,0x85,0xfb,0xed,0x7c,0x68,0x4b,0x2c,0x5f,0xc5,0xc3,0xe5,0x61,0xc2, +0x76,0xb7,0x3e,0x66,0x2b,0x5b,0xf0,0x15,0x53,0x27,0x04,0x31,0x1f,0x41,0x1b,0x1a,0x95,0x1d,0xce,0x09,0x13,0x8e,0x7c,0x61,0x30,0x59,0xb1,0x30,0x44,0x0f,0xf1,0x60,0x88,0x84,0x54,0x43,0x0c,0xd7,0x4d,0xb8,0x38,0x08,0xb3,0x42,0xdd,0x93,0xac,0xd6,0x73,0x30,0x57,0x26,0x82,0xa3,0x45,0x0d,0xd0,0xea,0xf5,0x47,0x81,0xcd,0xbf,0x24, +0x60,0x32,0x58,0x60,0x46,0xf2,0x58,0x47,0x86,0x32,0x84,0x1e,0x74,0x61,0x67,0x91,0x5f,0x81,0x54,0xb1,0xcf,0x93,0x4c,0x92,0xc1,0xc4,0xa6,0x5d,0xd1,0x61,0x13,0x6e,0x28,0xc6,0x1a,0xf9,0x86,0x80,0xbb,0xdf,0x61,0xfc,0x46,0xc1,0x27,0x1d,0x24,0x67,0x12,0x72,0x1a,0x21,0x8a,0xaf,0x4b,0x64,0x89,0x50,0x62,0xb1,0x5d,0xfd,0x77,0x1f, +0x3d,0xf0,0x57,0x75,0xac,0xbd,0x8a,0x42,0x4d,0x40,0x51,0xd1,0x0f,0x9c,0x06,0x3e,0x67,0x7f,0xf5,0x66,0xc0,0x03,0x96,0x44,0x7e,0xef,0xd0,0x4b,0xfd,0x6e,0xe5,0x9a,0xca,0xb1,0xa8,0xf2,0x7a,0x2a,0x0a,0x31,0xf0,0xda,0x4e,0x06,0x91,0xb6,0x88,0x08,0x35,0xe8,0x78,0x1c,0xb0,0xe9,0x99,0xcd,0x3c,0xe7,0x2f,0x44,0xba,0xa7,0xf4,0xdc, +0x64,0xbd,0xa4,0x01,0xc1,0x20,0x09,0x93,0x78,0xcd,0xfc,0xbc,0xc0,0xc9,0x44,0x5d,0x5e,0x16,0x9c,0x01,0x05,0x4f,0x22,0x4d,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0xe6,0x30,0x82,0x01,0xe2,0x30,0x10,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16, +0x04,0x14,0xd5,0x63,0x3a,0x5c,0x8a,0x31,0x90,0xf3,0x43,0x7b,0x7c,0x46,0x1b,0xc5,0x33,0x68,0x5a,0x85,0x6d,0x55,0x30,0x19,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04,0x0c,0x1e,0x0a,0x00,0x53,0x00,0x75,0x00,0x62,0x00,0x43,0x00,0x41,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f, +0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xd5,0xf6,0x56,0xcb,0x8f,0xe8,0xa2,0x5c,0x62,0x68,0xd1,0x3d,0x94,0x90,0x5b,0xd7,0xce,0x9a,0x18,0xc4,0x30,0x56,0x06,0x03,0x55,0x1d,0x1f,0x04,0x4f,0x30,0x4d,0x30,0x4b,0xa0,0x49,0xa0, +0x47,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30, +0x36,0x2d,0x32,0x33,0x2e,0x63,0x72,0x6c,0x30,0x5a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x4e,0x30,0x4c,0x30,0x4a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70, +0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x36,0x2d,0x32,0x33,0x2e,0x63,0x72,0x74,0x30,0x81,0xa0,0x06,0x03,0x55,0x1d,0x20,0x01,0x01,0xff,0x04,0x81,0x95,0x30,0x81,0x92,0x30,0x81,0x8f,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82, +0x37,0x2e,0x03,0x30,0x81,0x81,0x30,0x3d,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x31,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x50,0x4b,0x49,0x2f,0x64,0x6f,0x63,0x73,0x2f,0x43,0x50,0x53,0x2f,0x64,0x65,0x66,0x61,0x75,0x6c, +0x74,0x2e,0x68,0x74,0x6d,0x30,0x40,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x34,0x1e,0x32,0x20,0x1d,0x00,0x4c,0x00,0x65,0x00,0x67,0x00,0x61,0x00,0x6c,0x00,0x5f,0x00,0x50,0x00,0x6f,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x79,0x00,0x5f,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x65,0x00, +0x6e,0x00,0x74,0x00,0x2e,0x20,0x1d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x07,0xe6,0x88,0x51,0x0d,0xe2,0xc6,0xe0,0x98,0x3f,0x81,0x71,0x03,0x3d,0x9d,0xa3,0xa1,0x21,0x6f,0xb3,0xeb,0xa6,0xcc,0xf5,0x31,0xbe,0xcf,0x05,0xe2,0xa9,0xfe,0xfa,0x57,0x6d,0x19,0x30,0xb3, +0xc2,0xc5,0x66,0xc9,0x6a,0xdf,0xf5,0xe7,0xf0,0x78,0xbd,0xc7,0xa8,0x9e,0x25,0xe3,0xf9,0xbc,0xed,0x6b,0x54,0x57,0x08,0x2b,0x51,0x82,0x44,0x12,0xfb,0xb9,0x53,0x8c,0xcc,0xf4,0x60,0x12,0x8a,0x76,0xcc,0x40,0x40,0x41,0x9b,0xdc,0x5c,0x17,0xff,0x5c,0xf9,0x5e,0x17,0x35,0x98,0x24,0x56,0x4b,0x74,0xef,0x42,0x10,0xc8,0xaf,0xbf,0x7f, +0xc6,0x7f,0xf2,0x37,0x7d,0x5a,0x3f,0x1c,0xf2,0x99,0x79,0x4a,0x91,0x52,0x00,0xaf,0x38,0x0f,0x17,0xf5,0x2f,0x79,0x81,0x65,0xd9,0xa9,0xb5,0x6b,0xe4,0xc7,0xce,0xf6,0xca,0x7a,0x00,0x6f,0x4b,0x30,0x44,0x24,0x22,0x3c,0xcf,0xed,0x03,0xa5,0x96,0x8f,0x59,0x29,0xbc,0xb6,0xfd,0x04,0xe1,0x70,0x9f,0x32,0x4a,0x27,0xfd,0x55,0xaf,0x2f, +0xfe,0xb6,0xe5,0x8e,0x33,0xbb,0x62,0x5f,0x9a,0xdb,0x57,0x40,0xe9,0xf1,0xce,0x99,0x66,0x90,0x8c,0xff,0x6a,0x62,0x7f,0xdd,0xc5,0x4a,0x0b,0x91,0x26,0xe2,0x39,0xec,0x19,0x4a,0x71,0x63,0x9d,0x7b,0x21,0x6d,0xc3,0x9c,0xa3,0xa2,0x3c,0xfa,0x7f,0x7d,0x96,0x6a,0x90,0x78,0xa6,0x6d,0xd2,0xe1,0x9c,0xf9,0x1d,0xfc,0x38,0xd8,0x94,0xf4, +0xc6,0xa5,0x0a,0x96,0x86,0xa4,0xbd,0x9e,0x1a,0xae,0x04,0x42,0x83,0xb8,0xb5,0x80,0x9b,0x22,0x38,0x20,0xb5,0x25,0xe5,0x64,0xec,0xf7,0xf4,0xbf,0x7e,0x63,0x59,0x25,0x0f,0x7a,0x2e,0x39,0x57,0x76,0xa2,0x71,0xaa,0x06,0x8a,0x0f,0x89,0x16,0xba,0x61,0xa7,0x11,0xcb,0x9a,0xd8,0x0e,0x47,0x9a,0x80,0xc5,0xd0,0xcd,0xa7,0xd0,0xef,0x7d, +0x83,0xf0,0xe1,0x3b,0x71,0x09,0xdf,0x5d,0x74,0x98,0x22,0x08,0x61,0xda,0xb0,0x50,0x1e,0x6f,0xbd,0xf1,0xe1,0x00,0xdf,0xe7,0x31,0x07,0xa4,0x93,0x3a,0xf7,0x65,0x47,0x78,0xe8,0xf8,0xa8,0x48,0xab,0xf7,0xde,0x72,0x7e,0x61,0x6b,0x6f,0x77,0xa9,0x81,0xcb,0xa7,0x09,0xac,0x39,0xbb,0xec,0xc6,0xcb,0xd8,0x82,0xb4,0x72,0xcd,0x1d,0xf4, +0xb8,0x85,0x01,0x1e,0x80,0xfb,0x1b,0x89,0x2a,0x54,0x39,0xb2,0x5b,0xda,0xc8,0x0d,0x55,0x99,0x7a,0x87,0x73,0x3b,0x08,0xe6,0x98,0x2d,0xea,0x8d,0xe0,0x33,0x2e,0x12,0x29,0xf5,0xc0,0x2f,0x54,0x27,0x21,0xf7,0xc8,0xac,0x4e,0xda,0x28,0xb8,0xb1,0xa9,0xdb,0x96,0xb2,0xa7,0x42,0xa2,0xc9,0xcf,0x19,0x41,0x4d,0xe0,0x86,0xf9,0x2a,0x9a, +0xa3,0x11,0x66,0x30,0xd3,0xbb,0x74,0x32,0x4b,0xdf,0x63,0x7b,0xf5,0x99,0x8a,0x2f,0x1b,0xc7,0x21,0xaf,0x59,0xb5,0xae,0xdc,0x44,0x3c,0x97,0x50,0x71,0xd7,0xa1,0xd2,0xc5,0x55,0xe3,0x69,0xde,0x57,0xc1,0xd1,0xde,0x30,0xc0,0xfd,0xcc,0xe6,0x4d,0xfb,0x0d,0xbf,0x5d,0x4f,0xe9,0x9d,0x1e,0x19,0x38,0x2f,0xbc,0xcf,0x58,0x05,0x2e,0xef, +0x0d,0xa0,0x50,0x35,0xda,0xef,0x09,0x27,0x1c,0xd5,0xb3,0x7e,0x35,0x1e,0x08,0xba,0xda,0x36,0xdb,0xd3,0x5f,0x8f,0xde,0x74,0x88,0x49,0x12,0xa1,0x82,0x02,0xce,0x30,0x82,0x02,0x37,0x02,0x01,0x01,0x30,0x81,0xf8,0xa1,0x81,0xd0,0xa4,0x81,0xcd,0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31, +0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f, +0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54, +0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37,0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0xa2,0x23,0x0a,0x01, +0x01,0x30,0x07,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x03,0x15,0x00,0x38,0x3d,0xac,0x26,0x41,0x22,0x8f,0x3c,0xc6,0xc6,0x55,0xda,0x06,0x0a,0xf9,0x32,0x6d,0x93,0x2e,0x69,0xa0,0x81,0x83,0x30,0x81,0x80,0xa4,0x7e,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04, +0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31, +0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x02,0x05,0x00,0xdf,0xf4,0x2e,0xe3,0x30,0x22,0x18, +0x0f,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x34,0x32,0x30,0x33,0x32,0x33,0x35,0x5a,0x18,0x0f,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x35,0x32,0x30,0x33,0x32,0x33,0x35,0x5a,0x30,0x77,0x30,0x3d,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a,0x04,0x01,0x31,0x2f,0x30,0x2d,0x30,0x0a,0x02,0x05,0x00,0xdf,0xf4,0x2e,0xe3,0x02,0x01, +0x00,0x30,0x0a,0x02,0x01,0x00,0x02,0x02,0x19,0xf6,0x02,0x01,0xff,0x30,0x07,0x02,0x01,0x00,0x02,0x02,0x11,0x74,0x30,0x0a,0x02,0x05,0x00,0xdf,0xf5,0x80,0x63,0x02,0x01,0x00,0x30,0x36,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a,0x04,0x02,0x31,0x28,0x30,0x26,0x30,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a, +0x03,0x02,0xa0,0x0a,0x30,0x08,0x02,0x01,0x00,0x02,0x03,0x07,0xa1,0x20,0xa1,0x0a,0x30,0x08,0x02,0x01,0x00,0x02,0x03,0x01,0x86,0xa0,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00,0x79,0x78,0x9e,0x72,0x3a,0x6f,0xf0,0x0e,0x50,0x48,0xa6,0x78,0x90,0xb3,0x7b,0xd8,0xf9,0xd8,0xeb, +0x34,0x2d,0x2b,0x30,0xd5,0x86,0xfa,0x8c,0xc2,0x8e,0x06,0xad,0x31,0xb1,0xf1,0xfa,0x4b,0x6b,0xce,0xd8,0x44,0x4c,0xc7,0xc5,0xb0,0xa0,0x86,0x94,0x97,0x10,0x01,0x25,0xd1,0x29,0x21,0x2b,0x6c,0x1d,0x67,0x37,0xd3,0x15,0x81,0x32,0x40,0xa9,0x7f,0x2e,0x6b,0x4d,0x0d,0xcb,0xc9,0xa0,0x05,0xed,0x54,0x89,0x0a,0x8c,0x7f,0x0d,0x52,0x1a, +0x26,0xda,0x26,0x7f,0x8e,0xa4,0xc2,0x49,0xba,0x54,0x51,0xd1,0x1e,0xfc,0xf2,0x66,0xbf,0x46,0xa5,0xde,0x59,0x55,0x9a,0xbc,0xea,0xca,0xf7,0xf7,0xf9,0x7b,0x77,0x66,0x86,0x03,0xf0,0xf2,0xb8,0x53,0x28,0xa3,0x4a,0x0e,0xbe,0xf9,0x71,0x31,0x82,0x03,0x0d,0x30,0x82,0x03,0x09,0x02,0x01,0x01,0x30,0x81,0x93,0x30,0x7c,0x31,0x0b,0x30, +0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72, +0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x02,0x13,0x33,0x00,0x00,0x00,0xee, +0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c,0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x82,0x01,0x4a,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0d,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x01,0x04,0x30,0x2f,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xa9,0xb8,0x68,0x0f,0x5b,0x53,0xc4,0x53,0x8f,0x02,0x31,0x6a,0xa0,0x8b,0xf7,0x6b,0x41,0xea,0x53,0x11,0xcb,0xc2,0x98,0xe8,0xce,0x11,0x08,0xe6,0x0c,0xe8,0x14,0xd4,0x30,0x81,0xfa,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x02,0x2f,0x31,0x81, +0xea,0x30,0x81,0xe7,0x30,0x81,0xe4,0x30,0x81,0xbd,0x04,0x20,0x3f,0xae,0xc6,0x22,0xb7,0x3e,0xfb,0xf8,0xb4,0xb1,0x77,0x93,0x35,0x3e,0x92,0x51,0x0a,0x9f,0x0b,0x21,0x01,0xf2,0x99,0x2b,0x12,0x0c,0xd1,0x23,0x2f,0x10,0x2e,0xc3,0x30,0x81,0x98,0x30,0x81,0x80,0xa4,0x7e,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13, +0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43, +0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x02,0x13,0x33,0x00,0x00,0x00,0xee,0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c, +0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x22,0x04,0x20,0x14,0xc2,0x54,0x4f,0xba,0xe2,0x1c,0xdf,0x0c,0x3b,0x9d,0xfc,0xbc,0x5c,0xd8,0xb1,0x97,0xa6,0x39,0x9a,0x30,0x96,0xf8,0xa5,0xf4,0xb2,0x11,0xd6,0x59,0xc6,0x50,0xdd,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x04,0x82,0x01,0x00,0x4e,0x09, +0xa9,0x0d,0x51,0x40,0x35,0x45,0x38,0x88,0x5f,0x87,0xc6,0xaf,0x4a,0xd8,0x8c,0x36,0x34,0xd4,0x98,0x9b,0x5b,0xfb,0xc0,0xc0,0x85,0xd8,0x62,0x7e,0x9d,0x36,0x78,0x97,0xc6,0x77,0x76,0x2c,0xfb,0xf7,0x48,0x80,0x3e,0x93,0x18,0x95,0x1d,0xda,0xab,0x0a,0x0a,0xd1,0x9d,0xdb,0xcd,0xb7,0x67,0x8c,0x91,0xa8,0xdd,0x33,0x8d,0x55,0x9e,0xa0, +0x25,0xdb,0x26,0x6d,0x71,0xea,0xb6,0x99,0x10,0xce,0xa6,0x7a,0xfe,0x58,0x2e,0xb0,0x19,0xbd,0xc4,0x92,0xa4,0xa4,0x2b,0x56,0x85,0x54,0x02,0xdc,0x8d,0xe5,0x7b,0x23,0xcd,0xd7,0xee,0x49,0xcb,0x8d,0x7d,0x2f,0x80,0x9d,0x48,0x77,0xa2,0xe1,0xcc,0xb9,0x66,0x09,0xbd,0x3b,0x43,0x88,0x4d,0x7d,0xbc,0x83,0xff,0xfc,0xbf,0x27,0x4d,0x0c, +0xc7,0x06,0xbb,0x68,0x0d,0x37,0xcc,0xa0,0x0f,0xda,0xe0,0xf5,0xcc,0x8c,0xd2,0x24,0x97,0xe4,0x6c,0x02,0x83,0xb3,0xbd,0x0e,0x50,0xdd,0x2f,0x0c,0x05,0xee,0xe7,0xda,0x9b,0x11,0xc4,0x9d,0x6e,0x67,0x8c,0x29,0x9b,0x4e,0xef,0x33,0xe7,0x31,0x20,0x9e,0xdf,0x47,0xdd,0x6a,0xea,0x7b,0xac,0x08,0x0f,0x83,0x04,0x2c,0xee,0x13,0x35,0x69, +0x90,0xb4,0x8a,0xbe,0xc5,0x5e,0x5e,0x29,0x29,0x09,0xc0,0x1b,0xa7,0x68,0x47,0x29,0x21,0x91,0x3b,0xdf,0xa3,0x2f,0x81,0x42,0x88,0x50,0x90,0x72,0x29,0x4f,0x24,0xc5,0x03,0x45,0x2e,0xa2,0x6a,0x10,0xf4,0xd1,0x0b,0x23,0xbd,0xbf,0x92,0x8c,0xc8,0x74,0x6e,0x35,0xcd,0x74,0x9b,0x38,0xdf,0x13,0xd2,0x2a,0xc5,0xfa,0x30,0xab,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x02,0x1a,0x02,0x22,0x00,0x02,0x00,0x57,0x00,0x00,0x02,0x43,0x00,0x01,0x02,0x44,0x02,0x56,0x00,0x03,0x02,0x57,0x04,0x61,0x00,0x01,0x04,0x62,0x04,0xaf,0x00,0x03,0x04,0xb0,0x05,0xfc,0x00,0x01,0x05,0xfd,0x06,0x02,0x00,0x03,0x06,0x03,0x06,0x65,0x00,0x01,0x06,0x66,0x06,0x72,0x00,0x03, +0x06,0x73,0x06,0x9a,0x00,0x01,0x06,0x9b,0x06,0x9b,0x00,0x03,0x06,0x9c,0x06,0xad,0x00,0x01,0x06,0xae,0x06,0xd9,0x00,0x02,0x06,0xda,0x06,0xda,0x00,0x03,0x06,0xdb,0x07,0x38,0x00,0x02,0x07,0x39,0x07,0x3d,0x00,0x03,0x07,0x3e,0x07,0x54,0x00,0x01,0x07,0x55,0x07,0x5f,0x00,0x03,0x07,0x60,0x07,0xec,0x00,0x01,0x07,0xed,0x07,0xf0, +0x00,0x03,0x07,0xf1,0x08,0x4b,0x00,0x01,0x08,0x4c,0x08,0x4f,0x00,0x03,0x08,0x50,0x09,0x2b,0x00,0x01,0x09,0x2c,0x09,0x33,0x00,0x03,0x09,0x34,0x09,0x36,0x00,0x01,0x09,0x37,0x09,0x37,0x00,0x03,0x09,0x38,0x09,0x70,0x00,0x01,0x09,0x71,0x09,0x71,0x00,0x02,0x09,0x72,0x09,0x72,0x00,0x01,0x09,0x73,0x09,0x75,0x00,0x03,0x09,0x76, +0x09,0x76,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x03,0x09,0x78,0x09,0x7d,0x00,0x01,0x09,0x7e,0x09,0x7f,0x00,0x03,0x09,0x80,0x0a,0x0e,0x00,0x01,0x0a,0x0f,0x0a,0x13,0x00,0x03,0x0a,0x14,0x0a,0x15,0x00,0x01,0x0a,0x16,0x0a,0x1f,0x00,0x03,0x0a,0x20,0x0a,0x20,0x00,0x01,0x0a,0x21,0x0a,0x23,0x00,0x03,0x0a,0x24,0x0a,0x4a,0x00,0x01, +0x0a,0x4b,0x0a,0x53,0x00,0x03,0x0a,0x54,0x0a,0x5b,0x00,0x01,0x0a,0x5c,0x0a,0x5e,0x00,0x03,0x0a,0x5f,0x0a,0x62,0x00,0x01,0x0a,0x63,0x0a,0x64,0x00,0x02,0x0a,0x65,0x0a,0x69,0x00,0x03,0x0a,0x6a,0x0a,0x6b,0x00,0x01,0x0a,0x6c,0x0a,0x71,0x00,0x03,0x0a,0x72,0x0a,0xda,0x00,0x01,0x0a,0xdb,0x0a,0xe3,0x00,0x03,0x0a,0xe4,0x0b,0x52, +0x00,0x01,0x0b,0x53,0x0b,0x5f,0x00,0x03,0x0b,0x60,0x0b,0x60,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x03,0x0b,0x62,0x0b,0x62,0x00,0x01,0x0b,0x63,0x0b,0x64,0x00,0x03,0x0b,0x65,0x0b,0x65,0x00,0x01,0x0b,0x66,0x0b,0x67,0x00,0x03,0x0b,0x68,0x0b,0xb8,0x00,0x01,0x0b,0xb9,0x0b,0xb9,0x00,0x03,0x0b,0xba,0x0b,0xbe,0x00,0x01,0x0b,0xbf, +0x0b,0xde,0x00,0x03,0x0b,0xdf,0x0b,0xe0,0x00,0x01,0x0b,0xe1,0x0b,0xe1,0x00,0x03,0x0b,0xe2,0x0e,0x19,0x00,0x01,0x0e,0x1a,0x0e,0x1e,0x00,0x03,0x0e,0x1f,0x0e,0x61,0x00,0x01,0x0e,0x62,0x0e,0x6c,0x00,0x03,0x0e,0x6d,0x0e,0xea,0x00,0x01,0x0e,0xeb,0x0e,0xeb,0x00,0x03,0x0e,0xec,0x12,0x58,0x00,0x01,0x12,0x59,0x12,0x5e,0x00,0x03, +0x12,0x5f,0x13,0x29,0x00,0x01,0x13,0x2a,0x13,0x44,0x00,0x03,0x13,0x45,0x13,0xd8,0x00,0x01,0x13,0xd9,0x13,0xe9,0x00,0x03,0x13,0xea,0x13,0xee,0x00,0x01,0x13,0xef,0x13,0xf2,0x00,0x02,0x13,0xf3,0x14,0x16,0x00,0x01,0x14,0x17,0x14,0x17,0x00,0x03,0x14,0x18,0x14,0x5c,0x00,0x01,0x14,0x5d,0x14,0x6a,0x00,0x03,0x14,0x6b,0x14,0x6b, +0x00,0x01,0x14,0x6c,0x14,0x6c,0x00,0x03,0x14,0x6d,0x14,0x96,0x00,0x01,0x14,0x97,0x14,0x98,0x00,0x02,0x14,0x99,0x14,0xdf,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x33,0x02,0x44,0x02,0x44,0x00,0x02,0x02,0x45,0x02,0x45,0x00,0x04,0x02,0x46,0x02,0x47,0x00,0x02,0x04,0x62,0x04,0x73,0x00,0x02,0x04,0x75, +0x04,0x78,0x00,0x04,0x04,0x79,0x04,0x79,0x00,0x02,0x04,0x7b,0x04,0x7f,0x00,0x04,0x04,0x82,0x04,0x84,0x00,0x04,0x04,0x87,0x04,0x91,0x00,0x04,0x04,0x97,0x04,0x9a,0x00,0x04,0x04,0x9b,0x04,0x9d,0x00,0x02,0x04,0xa0,0x04,0xa2,0x00,0x02,0x04,0xa3,0x04,0xa3,0x00,0x04,0x04,0xa4,0x04,0xa4,0x00,0x02,0x04,0xa5,0x04,0xa7,0x00,0x04, +0x04,0xa8,0x04,0xaa,0x00,0x02,0x04,0xab,0x04,0xac,0x00,0x04,0x05,0xfd,0x06,0x00,0x00,0x02,0x06,0x66,0x06,0x72,0x00,0x02,0x07,0x3a,0x07,0x3d,0x00,0x03,0x07,0x55,0x07,0x57,0x00,0x02,0x07,0x58,0x07,0x5b,0x00,0x04,0x07,0x5c,0x07,0x5c,0x00,0x02,0x07,0xed,0x07,0xee,0x00,0x04,0x07,0xef,0x07,0xef,0x00,0x02,0x08,0x4c,0x08,0x4d, +0x00,0x02,0x08,0x4e,0x08,0x4e,0x00,0x04,0x08,0x4f,0x08,0x4f,0x00,0x02,0x09,0x2e,0x09,0x2e,0x00,0x01,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x01,0x09,0x7f,0x09,0x7f,0x00,0x01,0x0a,0x1a,0x0a,0x1a,0x00,0x01,0x0a,0x21,0x0a,0x21,0x00,0x01,0x0a,0x23,0x0a,0x23,0x00,0x01,0x0a,0x50,0x0a,0x50,0x00,0x01,0x0a,0x6f, +0x0a,0x6f,0x00,0x01,0x0a,0xdb,0x0a,0xe0,0x00,0x02,0x0a,0xe1,0x0a,0xe1,0x00,0x04,0x0a,0xe2,0x0a,0xe2,0x00,0x02,0x0a,0xe3,0x0a,0xe3,0x00,0x04,0x0e,0x1e,0x0e,0x1e,0x00,0x01,0x0e,0x6b,0x0e,0x6c,0x00,0x01,0x13,0x2c,0x13,0x2c,0x00,0x01,0x13,0x2f,0x13,0x2f,0x00,0x01,0x13,0x33,0x13,0x35,0x00,0x01,0x13,0x38,0x13,0x38,0x00,0x01, +0x13,0x3c,0x13,0x3c,0x00,0x01,0x13,0x3f,0x13,0x40,0x00,0x01,0x14,0x62,0x14,0x62,0x00,0x01,0x14,0x6c,0x14,0x6c,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x0a,0x01,0xee,0x04,0xce,0x00,0x15,0x61,0x72,0x61,0x62,0x00,0x80,0x62,0x6e,0x67,0x32,0x00,0xea,0x63,0x79,0x72,0x6c,0x00,0xf4,0x64,0x65,0x76,0x32,0x01,0x08,0x67,0x6a,0x72,0x32, +0x01,0x22,0x67,0x72,0x65,0x6b,0x01,0x12,0x67,0x75,0x72,0x32,0x01,0x2c,0x68,0x65,0x62,0x72,0x01,0x36,0x6b,0x68,0x6d,0x72,0x01,0x4e,0x6b,0x6e,0x64,0x32,0x01,0x44,0x6c,0x61,0x6f,0x20,0x01,0x58,0x6c,0x61,0x74,0x6e,0x01,0x62,0x6d,0x6c,0x6d,0x32,0x01,0x8a,0x6d,0x6f,0x6e,0x67,0x01,0x94,0x6d,0x79,0x6d,0x72,0x01,0x9e,0x6f,0x72, +0x79,0x32,0x01,0xb2,0x74,0x61,0x6c,0x75,0x01,0xa8,0x74,0x65,0x6c,0x32,0x01,0xc6,0x74,0x68,0x61,0x69,0x01,0xd0,0x74,0x69,0x62,0x74,0x01,0xda,0x74,0x6d,0x6c,0x32,0x01,0xbc,0x00,0x2e,0x00,0x05,0x41,0x52,0x41,0x20,0x00,0x22,0x4d,0x4c,0x59,0x20,0x00,0x3a,0x4d,0x4f,0x52,0x20,0x00,0x46,0x53,0x4e,0x44,0x20,0x00,0x52,0x55,0x52, +0x44,0x20,0x00,0x5e,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1c,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x09,0x00,0x13,0x00,0x1d,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0b,0x00,0x15,0x00,0x1f,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0c,0x00,0x16,0x00,0x20, +0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0d,0x00,0x17,0x00,0x21,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x04,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x22,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x05, +0x00,0x01,0x00,0x0f,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x10,0x00,0x19,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00, +0xff,0xff,0x00,0x00,0x00,0x0a,0x00,0x01,0x54,0x52,0x4b,0x20,0x00,0x1a,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x06,0x00,0x02,0x00,0x11,0x00,0x1a,0x00,0x23,0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x07,0x00,0x03,0x00,0x1b,0x00,0x24,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00, +0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00, +0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x25,0x63,0x61,0x73,0x65,0x00,0xe0,0x63,0x61,0x73,0x65,0x00,0xe6,0x63,0x61,0x73,0x65,0x00,0xec,0x63,0x61,0x73,0x65,0x00,0xf2,0x63,0x70,0x73,0x70,0x00,0xf8,0x63,0x70,0x73,0x70,0x01,0x02,0x63,0x70,0x73,0x70,0x01,0x0c,0x63,0x70,0x73,0x70,0x01,0x16,0x6b,0x65,0x72,0x6e,0x01,0x20,0x6b,0x65, +0x72,0x6e,0x01,0x36,0x6b,0x65,0x72,0x6e,0x01,0x60,0x6b,0x65,0x72,0x6e,0x01,0x76,0x6b,0x65,0x72,0x6e,0x01,0x8c,0x6b,0x65,0x72,0x6e,0x01,0xa2,0x6b,0x65,0x72,0x6e,0x01,0xcc,0x6b,0x65,0x72,0x6e,0x01,0xd2,0x6b,0x65,0x72,0x6e,0x01,0xd8,0x6b,0x65,0x72,0x6e,0x01,0xde,0x6d,0x61,0x72,0x6b,0x01,0xe4,0x6d,0x61,0x72,0x6b,0x01,0xee, +0x6d,0x61,0x72,0x6b,0x01,0xf8,0x6d,0x61,0x72,0x6b,0x02,0x02,0x6d,0x61,0x72,0x6b,0x02,0x0c,0x6d,0x61,0x72,0x6b,0x02,0x16,0x6d,0x61,0x72,0x6b,0x02,0x20,0x6d,0x61,0x72,0x6b,0x02,0x28,0x6d,0x61,0x72,0x6b,0x02,0x6a,0x6d,0x61,0x72,0x6b,0x02,0x80,0x6d,0x6b,0x6d,0x6b,0x02,0x94,0x6d,0x6b,0x6d,0x6b,0x02,0x9c,0x6d,0x6b,0x6d,0x6b, +0x02,0xa4,0x6d,0x6b,0x6d,0x6b,0x02,0xac,0x6d,0x6b,0x6d,0x6b,0x02,0xb4,0x6d,0x6b,0x6d,0x6b,0x02,0xbc,0x6d,0x6b,0x6d,0x6b,0x02,0xc4,0x6d,0x6b,0x6d,0x6b,0x02,0xcc,0x6d,0x6b,0x6d,0x6b,0x02,0xd8,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00, +0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x13, +0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x09, +0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40, +0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x19,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00, +0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x13,0x00,0x00,0x00,0x1f,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20, +0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2c,0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x07,0x00,0x08,0x00,0x09, +0x00,0x0a,0x00,0x0c,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0c,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17, +0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x04,0x00,0x0d,0x00,0x0e,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x0d,0x00,0x0e,0x00,0x86,0x01,0x0e,0x01,0x28,0x01,0x42,0x01,0x52,0x01,0x62,0x01,0x72,0x01,0x82,0x01,0x92,0x01,0xa2,0x01,0xb2,0x01,0xc2,0x01,0xd2, +0x01,0xe2,0x01,0xf2,0x02,0x02,0x02,0x12,0x02,0x22,0x02,0x32,0x02,0x42,0x02,0x52,0x02,0x62,0x02,0x72,0x02,0x96,0x02,0xa6,0x02,0xb6,0x02,0xc6,0x02,0xd6,0x02,0xe6,0x02,0xf6,0x03,0x06,0x03,0x2a,0x03,0x3a,0x03,0x68,0x04,0x5e,0x05,0xb8,0x05,0xc8,0x05,0xd8,0x06,0x56,0x06,0x7a,0x06,0xee,0x07,0x1c,0x09,0x70,0x09,0x80,0x09,0x90, +0x09,0xa0,0x09,0xb0,0x09,0xc0,0x09,0xd0,0x09,0xe0,0x0a,0x04,0x0a,0x14,0x0a,0x38,0x0a,0x7a,0x0a,0xa8,0x0a,0xb8,0x0a,0xc8,0x0a,0xf6,0x0b,0x06,0x0b,0x16,0x0b,0x26,0x0b,0x36,0x0b,0x46,0x0b,0x56,0x0b,0x66,0x0b,0x76,0x0b,0x9a,0x0b,0xbe,0x0b,0xe2,0x0c,0x06,0x0c,0x2a,0x0c,0x4e,0x0c,0x72,0x0c,0x96,0x0c,0xba,0x0c,0xde,0x0c,0xee, +0x0c,0xfe,0x0d,0x0e,0x0d,0x1e,0x0d,0x2e,0x0d,0x3e,0x0d,0x4e,0x0d,0x5e,0x0d,0x6e,0x0d,0x7e,0x0d,0x8e,0x0d,0x9e,0x0d,0xae,0x0d,0xbe,0x0d,0xce,0x0d,0xde,0x0d,0xee,0x0d,0xfe,0x0e,0x0e,0x0e,0x1e,0x0e,0x2e,0x0e,0x3e,0x0e,0x4e,0x0e,0x5e,0x0e,0x6e,0x0e,0x7e,0x0e,0x8e,0x0e,0x9e,0x0e,0xae,0x0e,0xbe,0x0e,0xce,0x0e,0xde,0x0e,0xee, +0x0e,0xfe,0x0f,0x0e,0x0f,0x1e,0x0f,0x2e,0x0f,0x3e,0x0f,0x4e,0x0f,0x5e,0x0f,0x6e,0x0f,0x7e,0x0f,0x8e,0x0f,0x9e,0x0f,0xae,0x0f,0xbe,0x0f,0xce,0x0f,0xde,0x0f,0xee,0x0f,0xfe,0x10,0x0e,0x10,0x1e,0x10,0x2e,0x10,0x3e,0x10,0x4e,0x10,0x5e,0x10,0x6e,0x10,0x7e,0x10,0x8e,0x00,0x09,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01, +0x00,0x02,0x00,0x00,0x0f,0x86,0x00,0x01,0x00,0x02,0x00,0x00,0x2d,0x04,0x00,0x09,0x00,0x08,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x02,0x00,0x00,0x35,0xd0,0x00,0x01,0x00,0x02,0x00,0x00,0x36,0x16,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x82,0xbe,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, +0x00,0x01,0x00,0x04,0x00,0x00,0x97,0x3c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x98,0x5c,0x00,0x09,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x36,0x96,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x99,0xa2,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, +0x00,0x01,0x00,0x04,0x00,0x00,0x9a,0x78,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xa8,0x76,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xa9,0x56,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xaa,0x32,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, +0x00,0x01,0x00,0x04,0x00,0x00,0xb1,0x9a,0x00,0x09,0x03,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xb2,0x1c,0x00,0x09,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0xfe,0xcc,0x00,0x09,0x04,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x01,0x20,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, +0x00,0x01,0x00,0x01,0x00,0x00,0x48,0x22,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x49,0xe8,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x49,0xf2,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x4a,0x08,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08, +0x00,0x01,0x00,0x04,0x00,0x01,0x02,0x92,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x02,0xa8,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x40,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x78,0x00,0x09,0x00,0x01, +0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x05,0x00,0x01,0x12,0xb8,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x15,0x60,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x18,0xd4,0x00,0x09,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x4a,0xcc,0x00,0x09,0x00,0x01, +0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1a,0x3a,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1a,0x90,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xa2,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xe4, +0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xfc,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1d,0x58,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x2c,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x36,0x00,0x01, +0x00,0x08,0x00,0x00,0x4f,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x50,0x00,0x09,0x00,0x01,0x00,0x18,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde, +0x00,0xe6,0x00,0xee,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x58,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x64,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x7e,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x8a,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x98,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xa2,0x00,0x01,0x00,0x08, +0x00,0x00,0x4f,0xb0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xd2,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xe0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x12,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x24,0x00,0x01,0x00,0x08, +0x00,0x00,0x50,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x56,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x66,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x78,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x8a,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x9e,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xaa,0x00,0x01,0x00,0x08, +0x00,0x00,0x50,0xb8,0x00,0x09,0x00,0x01,0x00,0x22,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x8a,0x00,0x92,0x00,0x9a,0x00,0xa2,0x00,0xaa,0x00,0xb2,0x00,0xba,0x00,0xc2,0x00,0xca,0x00,0xd2,0x00,0xda,0x00,0xe2,0x00,0xea,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x01,0x12,0x01,0x1a, +0x01,0x22,0x01,0x2a,0x01,0x32,0x01,0x3a,0x01,0x42,0x01,0x4a,0x01,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xce,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xda,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xe8,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xf8,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x06,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x16,0x00,0x01, +0x00,0x08,0x00,0x00,0x51,0x28,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x34,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x82,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x90,0x00,0x01, +0x00,0x08,0x00,0x00,0x51,0xa0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xd0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xe2,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xf2,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x04,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x18,0x00,0x01, +0x00,0x08,0x00,0x00,0x52,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x36,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x48,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x94,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xa6,0x00,0x01, +0x00,0x08,0x00,0x00,0x52,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xca,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xdc,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xf0,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1b,0xac,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xbe,0x00,0x09, +0x00,0x01,0x00,0x0c,0x00,0x1e,0x00,0x26,0x00,0x2e,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xfa,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x06,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x14,0x00,0x01,0x00,0x08, +0x00,0x00,0x54,0x1e,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x2a,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x4e,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x66,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x72,0x00,0x09,0x00,0x01, +0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xd8,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xe4,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xf2,0x00,0x09,0x00,0x01,0x00,0x0b,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x44,0x00,0x4c,0x00,0x54,0x00,0x5c,0x00,0x64,0x00,0x6c,0x00,0x01,0x00,0x08, +0x00,0x00,0x55,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x4e,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x6c,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x78,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x86,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x96,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xa2,0x00,0x01,0x00,0x08, +0x00,0x00,0x55,0xb0,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xcc,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x56,0x00,0x01,0x00,0x08,0x00,0x00, +0x56,0x68,0x00,0x09,0x00,0x01,0x00,0x3b,0x00,0x7c,0x00,0x84,0x00,0x8c,0x00,0x94,0x00,0x9c,0x00,0xa4,0x00,0xac,0x00,0xb4,0x00,0xbc,0x00,0xc4,0x00,0xcc,0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x01,0x14,0x01,0x1c,0x01,0x24,0x01,0x2c,0x01,0x34,0x01,0x3c,0x01,0x44,0x01,0x4c,0x01,0x54, +0x01,0x5c,0x01,0x64,0x01,0x6c,0x01,0x74,0x01,0x7c,0x01,0x84,0x01,0x8c,0x01,0x94,0x01,0x9c,0x01,0xa4,0x01,0xac,0x01,0xb4,0x01,0xbc,0x01,0xc4,0x01,0xcc,0x01,0xd4,0x01,0xdc,0x01,0xe4,0x01,0xec,0x01,0xf4,0x01,0xfc,0x02,0x04,0x02,0x0c,0x02,0x14,0x02,0x1c,0x02,0x24,0x02,0x2c,0x02,0x34,0x02,0x3c,0x02,0x44,0x02,0x4c,0x00,0x01, +0x00,0x08,0x00,0x00,0x56,0x62,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x90,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xa0,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xc4,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xd8,0x00,0x01, +0x00,0x08,0x00,0x00,0x56,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xfc,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x10,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x24,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x4a,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x6e,0x00,0x01, +0x00,0x08,0x00,0x00,0x57,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x94,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xa8,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xbe,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xd2,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xe6,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xfc,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x12,0x00,0x01, +0x00,0x08,0x00,0x00,0x58,0x2a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x4a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x92,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xa6,0x00,0x01, +0x00,0x08,0x00,0x00,0x58,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xd0,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xe2,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xf4,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x32,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x46,0x00,0x01, +0x00,0x08,0x00,0x00,0x59,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x96,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xaa,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xbe,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xd4,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xea,0x00,0x01, +0x00,0x08,0x00,0x00,0x59,0xf8,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x18,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x28,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x4c,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x72,0x00,0x01, +0x00,0x08,0x00,0x00,0x5a,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x98,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0xac,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1d,0x36,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xa4,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01, +0x00,0x08,0x00,0x00,0x5b,0xb6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xd0,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x1e,0xda,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x1f,0x28,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01, +0x00,0x06,0x00,0x01,0x20,0x1c,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xb6,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xc2,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xce,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x20,0xb0,0x00,0x09,0x00,0x01,0x00,0x03, +0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x2c,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x46,0x00,0x09,0x00,0x01,0x00,0x06,0x00,0x12,0x00,0x1a,0x00,0x22,0x00,0x2a,0x00,0x32,0x00,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xc6,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xd2, +0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xde,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xf6,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x02,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x66,0x00,0x01, +0x00,0x08,0x00,0x00,0x5d,0x72,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x7e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0xe6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x20,0xc8,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08, +0x00,0x00,0x5e,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x70,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x21,0x7a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xa4,0x00,0x09,0x00,0x00, +0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xb6,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xca,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xde,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xf4,0x00,0x09,0x00,0x00, +0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x0a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x20,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x2e,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x48,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x62, +0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x8c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xa8,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xb8,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xd4, +0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xf0,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x1e,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x3c,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x4e, +0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x6c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x8a,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x9c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xd8,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c, +0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x0a,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x2a,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x3e,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x5e,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x7e,0x00,0x09,0x00,0x00, +0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x92,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xd2,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xe6,0x00,0x01,0x00,0x08,0x00,0x00,0x62,0x06,0x00,0x01,0x00,0x08, +0x00,0x00,0x62,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04, +0x00,0x00,0x65,0x04,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x67,0x4e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x68,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x68,0xf8,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04, +0x00,0x00,0x69,0xca,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6a,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6b,0xb0,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6c,0x88,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04, +0x00,0x00,0x6c,0xea,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6d,0xbc,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x18,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0xe6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04, +0x00,0x00,0x6f,0xbe,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x70,0x96,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x71,0x6e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x72,0x94,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06, +0x00,0x00,0x72,0xea,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x73,0x40,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0x96,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xe0,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x60,0xfc,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x02,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x06,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x08,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x0a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x0e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x14,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x18,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x1c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x20,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x22,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x24,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x26,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x2a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x2e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x32,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x36,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x3a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x3e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x42,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x46,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x4a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x4e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x52,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x56,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x58,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x5a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x5c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x5e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x60,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x62,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x64,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x66,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x68,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x6c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x61,0x70,0x00,0x01,0x1c,0xce,0x00,0x05,0x00,0x00,0x00,0x53,0x00,0xb8,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x09,0x64,0x14,0x30,0x00,0xb8,0x10,0x92,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c, +0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x14,0x30,0x14,0x30,0x15,0x52,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x08,0x3c,0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x00,0xb8, +0x00,0xb8,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x00,0x01,0x09,0x08,0x01,0x56,0x01,0x56,0x00,0x01,0x09,0x08, +0x00,0xab,0x00,0xab,0x01,0x3f,0x08,0xcc,0xff,0x55,0xff,0x55,0x08,0xcd,0xff,0x55,0xff,0x55,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55, +0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9,0xff,0x55,0xff,0x55,0x08,0xfa,0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06, +0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55, +0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55,0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55, +0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29,0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b, +0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55,0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55, +0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5c,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55, +0xff,0x55,0x09,0x65,0xff,0x55,0xff,0x55,0x09,0x67,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a,0xff,0x55,0xff,0x55,0x09,0x8c, +0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x93,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x95,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab, +0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55, +0xff,0x55,0x09,0xb7,0xff,0x55,0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd,0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1, +0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55, +0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55,0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55, +0xff,0x55,0x09,0xe2,0xff,0x55,0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9,0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0, +0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xf9,0xff,0x55,0xff,0x55,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55,0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55, +0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55,0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55,0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55, +0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78, +0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55, +0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55,0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55, +0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55,0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf, +0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4,0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55, +0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55,0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55, +0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd1,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16, +0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20,0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55, +0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x3c,0xff,0x55,0xff,0x55,0x0f,0x3e,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55, +0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55,0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74,0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a, +0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55, +0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55,0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55,0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55, +0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56,0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59, +0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x75,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x7b,0xff,0x55,0xff,0x55,0x14,0x83,0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55, +0x00,0x31,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c, +0x00,0xab,0x00,0xab,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xf2,0x00,0xab,0x00,0xab, +0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8f,0x00,0xab, +0x00,0xab,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0xab,0x00,0xab,0x00,0xab,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e, +0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x78,0x00,0xab,0x00,0xab,0x01,0x32,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55, +0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9, +0xff,0x55,0xff,0x55,0x08,0xfa,0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06,0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55, +0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55, +0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26, +0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29,0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b,0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab, +0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55,0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55,0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55, +0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a, +0xff,0x55,0xff,0x55,0x09,0x8c,0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab, +0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55,0xff,0x55,0x09,0xb7,0xff,0x55, +0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd,0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2, +0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55, +0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55,0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55,0xff,0x55,0x09,0xe2,0xff,0x55, +0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9,0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0,0xff,0x55,0xff,0x55,0x09,0xf2, +0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55,0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55,0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55, +0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55,0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55,0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55, +0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a, +0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55, +0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55,0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55, +0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf,0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4, +0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55,0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55, +0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55, +0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20, +0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab, +0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55,0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55, +0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74,0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a,0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84, +0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55,0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55, +0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55,0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55,0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab, +0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56,0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x83, +0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x9a,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55, +0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16, +0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55, +0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x65,0xff,0x55, +0xff,0x55,0x09,0x67,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x8c,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97, +0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55, +0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55, +0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a, +0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55, +0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab, +0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d, +0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55, +0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x3c,0xff,0x55, +0xff,0x55,0x0f,0x3e,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56, +0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x83,0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x30,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x0e,0xff,0x55, +0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98, +0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x73,0x00,0xab,0x00,0xab, +0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0xab,0x00,0xab,0x00,0xab,0x0e,0x49,0x00,0xab, +0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x40, +0x00,0xab,0x00,0xab,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x78,0x00,0xab,0x00,0xab,0x01,0x3f,0x08,0xcc,0xff,0x55,0xff,0x55,0x08,0xcd,0xff,0x55,0xff,0x55,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55, +0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9,0xff,0x55,0xff,0x55,0x08,0xfa, +0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06,0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55, +0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55,0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55, +0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29, +0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b,0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55, +0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55,0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5c,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55, +0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a,0xff,0x55,0xff,0x55,0x09,0x8c, +0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x93,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x95,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab, +0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55, +0xff,0x55,0x09,0xb3,0xff,0x55,0xff,0x55,0x09,0xb4,0xff,0x55,0xff,0x55,0x09,0xb5,0xff,0x55,0xff,0x55,0x09,0xb6,0xff,0x55,0xff,0x55,0x09,0xb7,0xff,0x55,0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd, +0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55, +0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55, +0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55,0xff,0x55,0x09,0xe2,0xff,0x55,0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9, +0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0,0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xf9,0xff,0x55,0xff,0x55,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfd,0xff,0x55,0xff,0x55,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55, +0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55,0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55,0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55, +0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55,0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72, +0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab, +0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55,0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55, +0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55,0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55,0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7, +0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf,0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4,0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55, +0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55,0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55,0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab, +0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf, +0xff,0x55,0xff,0x55,0x0e,0xd1,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20,0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab, +0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab, +0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55,0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55,0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74, +0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a,0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55, +0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55,0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55,0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55, +0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55,0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56, +0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x75,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x7b,0xff,0x55,0xff,0x55,0x14,0x83,0xff,0x55,0xff,0x55, +0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x02,0x00,0x1e,0x08,0xc8,0x08,0xc9,0x00,0x00,0x08,0xff,0x09,0x01,0x00,0x02,0x09,0x04,0x09,0x04,0x00,0x05,0x09,0x08,0x09,0x09,0x00,0x06,0x09,0x17,0x09,0x18,0x00,0x08,0x09,0x45,0x09,0x45,0x00,0x0a,0x09,0x5d,0x09,0x5e,0x00,0x0b, +0x09,0x80,0x09,0x83,0x00,0x0d,0x09,0xad,0x09,0xad,0x00,0x11,0x09,0xaf,0x09,0xb1,0x00,0x12,0x09,0xb3,0x09,0xb8,0x00,0x15,0x0a,0x54,0x0a,0x57,0x00,0x1b,0x0a,0x88,0x0a,0x88,0x00,0x1f,0x0a,0xb4,0x0a,0xb5,0x00,0x20,0x0b,0x0c,0x0b,0x0f,0x00,0x22,0x0b,0x11,0x0b,0x18,0x00,0x26,0x0e,0x8f,0x0e,0x8f,0x00,0x2e,0x0e,0x93,0x0e,0x93, +0x00,0x2f,0x0e,0x95,0x0e,0x97,0x00,0x30,0x0f,0x02,0x0f,0x02,0x00,0x33,0x0f,0x22,0x0f,0x23,0x00,0x34,0x0f,0x28,0x0f,0x2b,0x00,0x36,0x0f,0x62,0x0f,0x63,0x00,0x3a,0x0f,0x66,0x0f,0x67,0x00,0x3c,0x0f,0x6a,0x0f,0x6b,0x00,0x3e,0x0f,0x98,0x0f,0xa6,0x00,0x40,0x0f,0xc3,0x0f,0xc3,0x00,0x4f,0x14,0x58,0x14,0x58,0x00,0x50,0x14,0x7d, +0x14,0x7d,0x00,0x51,0x14,0xad,0x14,0xad,0x00,0x52,0x00,0x02,0x01,0x70,0x00,0x05,0x00,0x00,0x02,0x2e,0x03,0x3a,0x00,0x08,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0xff,0x55, +0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0xab,0x00,0xab,0x00,0xab, +0x00,0xab,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x02,0x00,0x1f,0x08,0xc9, +0x08,0xca,0x00,0x00,0x08,0xff,0x09,0x01,0x00,0x02,0x09,0x04,0x09,0x04,0x00,0x05,0x09,0x08,0x09,0x08,0x00,0x06,0x09,0x0a,0x09,0x0b,0x00,0x07,0x09,0x29,0x09,0x29,0x00,0x09,0x09,0x45,0x09,0x45,0x00,0x0a,0x09,0x85,0x09,0x85,0x00,0x0b,0x09,0xb3,0x09,0xb8,0x00,0x0c,0x0a,0x56,0x0a,0x57,0x00,0x12,0x0a,0xb4,0x0a,0xb5,0x00,0x14, +0x0b,0x0c,0x0b,0x0f,0x00,0x16,0x0b,0x11,0x0b,0x18,0x00,0x1a,0x0e,0x24,0x0e,0x24,0x00,0x22,0x0e,0x5e,0x0e,0x5e,0x00,0x23,0x0e,0x74,0x0e,0x75,0x00,0x24,0x0e,0xdc,0x0e,0xe3,0x00,0x26,0x0e,0xe6,0x0e,0xe6,0x00,0x2e,0x0f,0x02,0x0f,0x02,0x00,0x2f,0x0f,0x22,0x0f,0x23,0x00,0x30,0x0f,0x39,0x0f,0x39,0x00,0x32,0x0f,0x3b,0x0f,0x3b, +0x00,0x33,0x0f,0x62,0x0f,0x63,0x00,0x34,0x0f,0x66,0x0f,0x67,0x00,0x36,0x0f,0x6a,0x0f,0x6b,0x00,0x38,0x0f,0x98,0x0f,0xa6,0x00,0x3a,0x0f,0xc3,0x0f,0xc3,0x00,0x49,0x11,0x02,0x11,0x09,0x00,0x4a,0x14,0x58,0x14,0x58,0x00,0x52,0x14,0x7d,0x14,0x7d,0x00,0x53,0x14,0xad,0x14,0xad,0x00,0x54,0x00,0x02,0x00,0x2c,0x08,0xc9,0x08,0xc9, +0x00,0x01,0x08,0xca,0x08,0xca,0x00,0x03,0x08,0xff,0x09,0x01,0x00,0x04,0x09,0x04,0x09,0x04,0x00,0x04,0x09,0x08,0x09,0x08,0x00,0x01,0x09,0x0a,0x09,0x0a,0x00,0x02,0x09,0x0b,0x09,0x0b,0x00,0x03,0x09,0x29,0x09,0x29,0x00,0x02,0x09,0x45,0x09,0x45,0x00,0x07,0x09,0x85,0x09,0x85,0x00,0x03,0x09,0xb3,0x09,0xb5,0x00,0x05,0x09,0xb6, +0x09,0xb6,0x00,0x06,0x09,0xb7,0x09,0xb8,0x00,0x07,0x0a,0x56,0x0a,0x57,0x00,0x07,0x0a,0xb4,0x0a,0xb5,0x00,0x07,0x0b,0x0c,0x0b,0x0c,0x00,0x05,0x0b,0x0d,0x0b,0x0d,0x00,0x06,0x0b,0x0e,0x0b,0x0f,0x00,0x07,0x0b,0x11,0x0b,0x13,0x00,0x05,0x0b,0x14,0x0b,0x14,0x00,0x06,0x0b,0x15,0x0b,0x18,0x00,0x07,0x0e,0x24,0x0e,0x24,0x00,0x02, +0x0e,0x5e,0x0e,0x5e,0x00,0x02,0x0e,0x74,0x0e,0x75,0x00,0x02,0x0e,0xdc,0x0e,0xe3,0x00,0x02,0x0e,0xe6,0x0e,0xe6,0x00,0x02,0x0f,0x02,0x0f,0x02,0x00,0x06,0x0f,0x22,0x0f,0x23,0x00,0x07,0x0f,0x39,0x0f,0x39,0x00,0x02,0x0f,0x3b,0x0f,0x3b,0x00,0x02,0x0f,0x62,0x0f,0x63,0x00,0x04,0x0f,0x66,0x0f,0x67,0x00,0x04,0x0f,0x6a,0x0f,0x6b, +0x00,0x04,0x0f,0x98,0x0f,0x99,0x00,0x05,0x0f,0x9a,0x0f,0x9b,0x00,0x07,0x0f,0x9c,0x0f,0x9f,0x00,0x05,0x0f,0xa0,0x0f,0xa2,0x00,0x07,0x0f,0xa3,0x0f,0xa3,0x00,0x05,0x0f,0xa4,0x0f,0xa6,0x00,0x07,0x0f,0xc3,0x0f,0xc3,0x00,0x07,0x11,0x02,0x11,0x09,0x00,0x02,0x14,0x58,0x14,0x58,0x00,0x07,0x14,0x7d,0x14,0x7d,0x00,0x07,0x14,0xad, +0x14,0xad,0x00,0x07,0x00,0x02,0x00,0xf0,0x08,0xcc,0x08,0xcd,0x00,0x05,0x08,0xd4,0x08,0xd5,0x00,0x01,0x08,0xd6,0x08,0xd6,0x00,0x02,0x08,0xe1,0x08,0xe2,0x00,0x02,0x08,0xe5,0x08,0xe5,0x00,0x02,0x08,0xe8,0x08,0xe8,0x00,0x02,0x08,0xeb,0x08,0xeb,0x00,0x02,0x08,0xed,0x08,0xed,0x00,0x08,0x08,0xee,0x08,0xee,0x00,0x01,0x08,0xef, +0x08,0xef,0x00,0x02,0x08,0xf0,0x08,0xf0,0x00,0x01,0x08,0xf1,0x08,0xf1,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x06,0x08,0xf9,0x08,0xfa,0x00,0x01,0x08,0xff,0x08,0xff,0x00,0x01,0x09,0x01,0x09,0x01,0x00,0x01,0x09,0x06,0x09,0x06,0x00,0x01,0x09,0x07,0x09,0x07,0x00,0x02,0x09,0x09,0x09,0x09,0x00,0x03,0x09,0x0a,0x09,0x0a,0x00,0x01, +0x09,0x0c,0x09,0x0d,0x00,0x01,0x09,0x0f,0x09,0x0f,0x00,0x04,0x09,0x10,0x09,0x11,0x00,0x02,0x09,0x12,0x09,0x14,0x00,0x06,0x09,0x15,0x09,0x16,0x00,0x02,0x09,0x17,0x09,0x1a,0x00,0x01,0x09,0x1b,0x09,0x1e,0x00,0x02,0x09,0x1f,0x09,0x20,0x00,0x07,0x09,0x22,0x09,0x22,0x00,0x02,0x09,0x24,0x09,0x24,0x00,0x01,0x09,0x26,0x09,0x26, +0x00,0x02,0x09,0x28,0x09,0x28,0x00,0x02,0x09,0x29,0x09,0x2b,0x00,0x01,0x09,0x34,0x09,0x34,0x00,0x01,0x09,0x3c,0x09,0x3c,0x00,0x02,0x09,0x3e,0x09,0x3e,0x00,0x02,0x09,0x40,0x09,0x40,0x00,0x02,0x09,0x41,0x09,0x42,0x00,0x06,0x09,0x45,0x09,0x45,0x00,0x01,0x09,0x46,0x09,0x49,0x00,0x08,0x09,0x4a,0x09,0x4a,0x00,0x01,0x09,0x4c, +0x09,0x4c,0x00,0x06,0x09,0x4e,0x09,0x4e,0x00,0x02,0x09,0x5b,0x09,0x5b,0x00,0x02,0x09,0x5c,0x09,0x5c,0x00,0x05,0x09,0x5d,0x09,0x5d,0x00,0x02,0x09,0x5e,0x09,0x5e,0x00,0x01,0x09,0x60,0x09,0x60,0x00,0x02,0x09,0x63,0x09,0x63,0x00,0x02,0x09,0x64,0x09,0x64,0x00,0x04,0x09,0x65,0x09,0x65,0x00,0x0a,0x09,0x67,0x09,0x67,0x00,0x0a, +0x09,0x6c,0x09,0x6d,0x00,0x02,0x09,0x71,0x09,0x71,0x00,0x01,0x09,0x80,0x09,0x80,0x00,0x03,0x09,0x82,0x09,0x82,0x00,0x03,0x09,0x88,0x09,0x8a,0x00,0x01,0x09,0x8c,0x09,0x8c,0x00,0x02,0x09,0x8d,0x09,0x8d,0x00,0x01,0x09,0x8e,0x09,0x8e,0x00,0x02,0x09,0x8f,0x09,0x8f,0x00,0x06,0x09,0x90,0x09,0x90,0x00,0x02,0x09,0x92,0x09,0x92, +0x00,0x02,0x09,0x93,0x09,0x93,0x00,0x05,0x09,0x94,0x09,0x94,0x00,0x02,0x09,0x95,0x09,0x95,0x00,0x05,0x09,0x96,0x09,0x96,0x00,0x02,0x09,0x97,0x09,0x98,0x00,0x06,0x09,0x9b,0x09,0x9b,0x00,0x06,0x09,0x9e,0x09,0x9e,0x00,0x06,0x09,0xa1,0x09,0xa1,0x00,0x06,0x09,0xa4,0x09,0xa4,0x00,0x06,0x09,0xa7,0x09,0xa7,0x00,0x06,0x09,0xaa, +0x09,0xac,0x00,0x02,0x09,0xae,0x09,0xae,0x00,0x02,0x09,0xb2,0x09,0xb2,0x00,0x01,0x09,0xb3,0x09,0xb6,0x00,0x09,0x09,0xb7,0x09,0xbe,0x00,0x01,0x09,0xbf,0x09,0xc3,0x00,0x02,0x09,0xc4,0x09,0xc4,0x00,0x07,0x09,0xc6,0x09,0xc6,0x00,0x02,0x09,0xc8,0x09,0xca,0x00,0x02,0x09,0xcc,0x09,0xcd,0x00,0x02,0x09,0xd2,0x09,0xd3,0x00,0x02, +0x09,0xd7,0x09,0xd8,0x00,0x02,0x09,0xd9,0x09,0xda,0x00,0x08,0x09,0xdb,0x09,0xdb,0x00,0x01,0x09,0xdc,0x09,0xdc,0x00,0x08,0x09,0xdd,0x09,0xdd,0x00,0x01,0x09,0xde,0x09,0xde,0x00,0x08,0x09,0xdf,0x09,0xdf,0x00,0x01,0x09,0xe1,0x09,0xe5,0x00,0x08,0x09,0xe7,0x09,0xea,0x00,0x08,0x09,0xec,0x09,0xec,0x00,0x01,0x09,0xee,0x09,0xee, +0x00,0x01,0x09,0xf0,0x09,0xf0,0x00,0x01,0x09,0xf2,0x09,0xf2,0x00,0x06,0x09,0xf9,0x09,0xf9,0x00,0x05,0x09,0xfa,0x09,0xfa,0x00,0x06,0x09,0xfd,0x09,0xfd,0x00,0x09,0x09,0xfe,0x0a,0x05,0x00,0x01,0x0a,0x07,0x0a,0x07,0x00,0x01,0x0a,0x0a,0x0a,0x0b,0x00,0x01,0x0a,0x0d,0x0a,0x0d,0x00,0x01,0x0a,0x24,0x0a,0x25,0x00,0x01,0x0a,0x26, +0x0a,0x27,0x00,0x02,0x0a,0x28,0x0a,0x28,0x00,0x07,0x0a,0x2a,0x0a,0x2a,0x00,0x02,0x0a,0x3e,0x0a,0x3e,0x00,0x08,0x0a,0x56,0x0a,0x56,0x00,0x01,0x0a,0x58,0x0a,0x58,0x00,0x02,0x0a,0x5a,0x0a,0x5a,0x00,0x02,0x0a,0x63,0x0a,0x63,0x00,0x01,0x0a,0x72,0x0a,0x72,0x00,0x02,0x0a,0x73,0x0a,0x73,0x00,0x06,0x0a,0x74,0x0a,0x74,0x00,0x02, +0x0a,0x76,0x0a,0x76,0x00,0x02,0x0a,0x77,0x0a,0x77,0x00,0x06,0x0a,0x78,0x0a,0x78,0x00,0x02,0x0a,0x79,0x0a,0x79,0x00,0x06,0x0a,0x7a,0x0a,0x7a,0x00,0x02,0x0a,0x7b,0x0a,0x7b,0x00,0x06,0x0a,0x7c,0x0a,0x7c,0x00,0x02,0x0a,0x7d,0x0a,0x7d,0x00,0x06,0x0a,0x7e,0x0a,0x7e,0x00,0x02,0x0a,0x7f,0x0a,0x7f,0x00,0x01,0x0a,0x80,0x0a,0x80, +0x00,0x06,0x0a,0x83,0x0a,0x83,0x00,0x06,0x0a,0x86,0x0a,0x87,0x00,0x02,0x0a,0x88,0x0a,0x8a,0x00,0x01,0x0a,0x8b,0x0a,0x8b,0x00,0x07,0x0a,0x8d,0x0a,0x8d,0x00,0x02,0x0a,0x8f,0x0a,0x8f,0x00,0x07,0x0a,0x91,0x0a,0x91,0x00,0x02,0x0a,0x93,0x0a,0x93,0x00,0x07,0x0a,0x95,0x0a,0x95,0x00,0x02,0x0a,0x9d,0x0a,0x9e,0x00,0x08,0x0a,0xa0, +0x0a,0xa1,0x00,0x08,0x0a,0xa3,0x0a,0xa3,0x00,0x08,0x0a,0xa6,0x0a,0xa9,0x00,0x02,0x0a,0xab,0x0a,0xab,0x00,0x06,0x0a,0xad,0x0a,0xad,0x00,0x01,0x0a,0xaf,0x0a,0xaf,0x00,0x01,0x0a,0xb2,0x0a,0xb2,0x00,0x01,0x0a,0xb4,0x0a,0xb7,0x00,0x01,0x0b,0x19,0x0b,0x19,0x00,0x02,0x0e,0x20,0x0e,0x20,0x00,0x01,0x0e,0x3a,0x0e,0x3a,0x00,0x02, +0x0e,0x3d,0x0e,0x3d,0x00,0x02,0x0e,0x3f,0x0e,0x3f,0x00,0x08,0x0e,0x41,0x0e,0x41,0x00,0x08,0x0e,0x43,0x0e,0x43,0x00,0x08,0x0e,0x47,0x0e,0x47,0x00,0x01,0x0e,0x49,0x0e,0x49,0x00,0x06,0x0e,0x4b,0x0e,0x4b,0x00,0x01,0x0e,0x4d,0x0e,0x4d,0x00,0x06,0x0e,0x4f,0x0e,0x4f,0x00,0x01,0x0e,0x51,0x0e,0x51,0x00,0x06,0x0e,0x5b,0x0e,0x5c, +0x00,0x02,0x0e,0x5f,0x0e,0x5f,0x00,0x02,0x0e,0x6f,0x0e,0x6f,0x00,0x02,0x0e,0x71,0x0e,0x71,0x00,0x02,0x0e,0x76,0x0e,0x76,0x00,0x01,0x0e,0xa3,0x0e,0xa3,0x00,0x02,0x0e,0xac,0x0e,0xac,0x00,0x02,0x0e,0xaf,0x0e,0xaf,0x00,0x02,0x0e,0xd1,0x0e,0xd1,0x00,0x05,0x0e,0xd7,0x0e,0xd7,0x00,0x02,0x0e,0xe7,0x0e,0xe7,0x00,0x06,0x0e,0xe9, +0x0e,0xe9,0x00,0x06,0x0f,0x16,0x0f,0x16,0x00,0x06,0x0f,0x1a,0x0f,0x1a,0x00,0x06,0x0f,0x1e,0x0f,0x1e,0x00,0x01,0x0f,0x20,0x0f,0x20,0x00,0x01,0x0f,0x22,0x0f,0x22,0x00,0x01,0x0f,0x24,0x0f,0x24,0x00,0x06,0x0f,0x28,0x0f,0x28,0x00,0x01,0x0f,0x2a,0x0f,0x2a,0x00,0x01,0x0f,0x2c,0x0f,0x2c,0x00,0x01,0x0f,0x2e,0x0f,0x2e,0x00,0x06, +0x0f,0x30,0x0f,0x30,0x00,0x01,0x0f,0x32,0x0f,0x32,0x00,0x06,0x0f,0x34,0x0f,0x34,0x00,0x01,0x0f,0x36,0x0f,0x36,0x00,0x06,0x0f,0x38,0x0f,0x38,0x00,0x01,0x0f,0x3a,0x0f,0x3a,0x00,0x01,0x0f,0x3c,0x0f,0x3c,0x00,0x0a,0x0f,0x3e,0x0f,0x3e,0x00,0x0a,0x0f,0x40,0x0f,0x40,0x00,0x06,0x0f,0x44,0x0f,0x44,0x00,0x01,0x0f,0x46,0x0f,0x46, +0x00,0x01,0x0f,0x48,0x0f,0x48,0x00,0x01,0x0f,0x4a,0x0f,0x4a,0x00,0x01,0x0f,0x4c,0x0f,0x4c,0x00,0x01,0x0f,0x4e,0x0f,0x4e,0x00,0x08,0x0f,0x6c,0x0f,0x6c,0x00,0x01,0x0f,0x6e,0x0f,0x6e,0x00,0x01,0x0f,0x70,0x0f,0x70,0x00,0x01,0x0f,0x72,0x0f,0x72,0x00,0x01,0x0f,0x74,0x0f,0x74,0x00,0x01,0x0f,0x76,0x0f,0x76,0x00,0x01,0x0f,0x78, +0x0f,0x78,0x00,0x01,0x0f,0x7a,0x0f,0x7a,0x00,0x01,0x0f,0x7c,0x0f,0x7c,0x00,0x01,0x0f,0x7e,0x0f,0x7e,0x00,0x01,0x0f,0x80,0x0f,0x80,0x00,0x01,0x0f,0x82,0x0f,0x82,0x00,0x02,0x0f,0x84,0x0f,0x84,0x00,0x02,0x0f,0x86,0x0f,0x86,0x00,0x02,0x0f,0x88,0x0f,0x88,0x00,0x02,0x0f,0x8a,0x0f,0x8a,0x00,0x02,0x0f,0x8c,0x0f,0x8c,0x00,0x01, +0x0f,0x8e,0x0f,0x8e,0x00,0x01,0x0f,0x90,0x0f,0x90,0x00,0x01,0x0f,0x92,0x0f,0x92,0x00,0x01,0x0f,0x94,0x0f,0x94,0x00,0x06,0x0f,0x96,0x0f,0x96,0x00,0x01,0x0f,0xc0,0x0f,0xc0,0x00,0x01,0x10,0xfe,0x10,0xfe,0x00,0x01,0x11,0x00,0x11,0x00,0x00,0x01,0x11,0x02,0x11,0x02,0x00,0x01,0x11,0x04,0x11,0x04,0x00,0x01,0x11,0x06,0x11,0x06, +0x00,0x01,0x11,0x08,0x11,0x08,0x00,0x01,0x11,0x0a,0x11,0x0a,0x00,0x01,0x11,0x0c,0x11,0x0d,0x00,0x01,0x11,0x0f,0x11,0x0f,0x00,0x01,0x14,0x53,0x14,0x53,0x00,0x07,0x14,0x54,0x14,0x54,0x00,0x01,0x14,0x55,0x14,0x57,0x00,0x02,0x14,0x58,0x14,0x59,0x00,0x01,0x14,0x5a,0x14,0x5b,0x00,0x02,0x14,0x6f,0x14,0x6f,0x00,0x02,0x14,0x72, +0x14,0x72,0x00,0x08,0x14,0x75,0x14,0x75,0x00,0x05,0x14,0x78,0x14,0x78,0x00,0x06,0x14,0x7b,0x14,0x7b,0x00,0x05,0x14,0x80,0x14,0x80,0x00,0x06,0x14,0x83,0x14,0x83,0x00,0x02,0x14,0x97,0x14,0x98,0x00,0x02,0x00,0x01,0x00,0x26,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x1a,0x00,0x20,0x00,0x20,0x00,0x1a,0x00,0x1a,0x00,0x20,0x00,0x20, +0x00,0x1a,0x00,0x01,0x08,0xdd,0xff,0x55,0x00,0x01,0x08,0xdb,0xff,0x55,0x00,0x02,0x00,0x06,0x08,0xd7,0x08,0xd7,0x00,0x00,0x08,0xd9,0x08,0xd9,0x00,0x01,0x08,0xde,0x08,0xdf,0x00,0x02,0x09,0x4f,0x09,0x4f,0x00,0x04,0x09,0x51,0x09,0x51,0x00,0x05,0x09,0x56,0x09,0x57,0x00,0x06,0x00,0x02,0x00,0x30,0x00,0x04,0x00,0x00,0x00,0x4c, +0x00,0x80,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0xfe,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0x00,0x02,0x00,0x04,0x08,0xd9,0x08,0xda,0x00,0x00,0x08,0xde,0x08,0xdf,0x00,0x02,0x09,0x51,0x09,0x53,0x00,0x04,0x09,0x55,0x09,0x57, +0x00,0x07,0x00,0x02,0x00,0x08,0x08,0xd9,0x08,0xda,0x00,0x01,0x08,0xde,0x08,0xde,0x00,0x01,0x08,0xdf,0x08,0xdf,0x00,0x03,0x09,0x51,0x09,0x52,0x00,0x01,0x09,0x53,0x09,0x53,0x00,0x02,0x09,0x55,0x09,0x55,0x00,0x02,0x09,0x56,0x09,0x56,0x00,0x01,0x09,0x57,0x09,0x57,0x00,0x03,0x00,0x02,0x00,0x0a,0x08,0xd7,0x08,0xd7,0x00,0x01, +0x08,0xdc,0x08,0xdc,0x00,0x01,0x08,0xde,0x08,0xde,0x00,0x02,0x08,0xdf,0x08,0xdf,0x00,0x03,0x08,0xe0,0x08,0xe0,0x00,0x02,0x09,0x4f,0x09,0x4f,0x00,0x01,0x09,0x54,0x09,0x55,0x00,0x01,0x09,0x56,0x09,0x56,0x00,0x02,0x09,0x57,0x09,0x57,0x00,0x03,0x09,0x58,0x09,0x58,0x00,0x02,0x00,0x01,0x10,0xc6,0x00,0x04,0x00,0x00,0x00,0x57, +0x00,0xb8,0x01,0xbe,0x01,0xe4,0x02,0x3e,0x02,0xa8,0x03,0x2a,0x03,0x70,0x03,0xa6,0x04,0xf0,0x06,0x16,0x06,0x9c,0x07,0x96,0x08,0x14,0x09,0x0a,0x09,0x50,0x0b,0x7a,0x0b,0xa8,0x0d,0x72,0x0e,0x88,0x0e,0xde,0x10,0x88,0x00,0xb8,0x00,0xb8,0x01,0xe4,0x06,0x16,0x0b,0x7a,0x06,0x16,0x00,0xb8,0x00,0xb8,0x06,0x16,0x06,0x16,0x0e,0xde, +0x00,0xb8,0x00,0xb8,0x06,0x16,0x06,0x16,0x06,0x16,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x09,0x0a,0x10,0x88,0x02,0x3e,0x0e,0xde,0x03,0x2a,0x09,0x0a,0x01,0xe4,0x01,0xe4,0x00,0xb8,0x00,0xb8,0x04,0xf0,0x06,0x16,0x08,0x14,0x08,0x14,0x09,0x0a,0x09,0x50,0x09,0x50,0x0b,0x7a,0x0b,0x7a,0x10,0x88,0x10,0x88,0x00,0xb8,0x01,0xe4,0x03,0x2a, +0x03,0x2a,0x03,0x2a,0x03,0x70,0x03,0xa6,0x04,0xf0,0x06,0x16,0x06,0x16,0x08,0x14,0x09,0x0a,0x09,0x50,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x0d,0x72,0x0e,0xde,0x00,0xb8,0x06,0x16,0x0d,0x72,0x0d,0x72,0x0d,0x72,0x0e,0xde,0x09,0x0a,0x00,0x41,0x00,0x26,0xff,0xd8,0x00,0x2a,0xff,0xd8,0x00,0x2d,0x00,0x5e,0x00,0x32,0xff,0xd8, +0x00,0x37,0xff,0x6d,0x00,0x38,0xff,0xd8,0x00,0x39,0xff,0x74,0x00,0x3a,0xff,0x74,0x00,0x3c,0xff,0x74,0x00,0x3d,0x00,0x3c,0x00,0x59,0xff,0xd8,0x00,0x5a,0xff,0xd8,0x00,0x5c,0xff,0xd8,0x00,0x64,0xff,0xd8,0x00,0x67,0xff,0xd8,0x00,0x68,0xff,0xd8,0x00,0x92,0xff,0xd8,0x00,0xaf,0xff,0xd8,0x00,0xb0,0xff,0xd8,0x00,0xba,0xff,0xd8, +0x00,0xbb,0xff,0x74,0x00,0xd0,0xff,0xd8,0x00,0xd1,0xff,0xd8,0x00,0xd2,0xff,0xd8,0x00,0xd3,0xff,0xd8,0x00,0xd4,0xff,0xd8,0x00,0xd5,0xff,0xd8,0x00,0xe5,0x00,0x3c,0x00,0xea,0xff,0x74,0x00,0xeb,0xff,0xd8,0x00,0xf7,0xff,0xd8,0x00,0xfc,0xff,0xd8,0x00,0xfe,0xff,0xd8,0x01,0x18,0xff,0xd8,0x01,0x20,0xff,0x6d,0x01,0x22,0xff,0x6d, +0x01,0x24,0xff,0xd8,0x01,0x26,0xff,0xd8,0x01,0x28,0x00,0x3c,0x01,0x2a,0x00,0x3c,0x01,0x47,0xff,0xd8,0x01,0x51,0xff,0xd8,0x01,0x53,0xff,0xd8,0x01,0x55,0xff,0xd8,0x01,0x63,0x00,0x5e,0x01,0x6e,0xff,0xd8,0x01,0x70,0xff,0xd8,0x01,0x76,0xff,0x6d,0x01,0x78,0xff,0xd8,0x01,0x7a,0xff,0xd8,0x01,0x7c,0xff,0xd8,0x01,0x7e,0xff,0xd8, +0x01,0x80,0xff,0x74,0x01,0x81,0xff,0xd8,0x01,0x82,0xff,0x74,0x01,0x83,0xff,0xd8,0x01,0x89,0xff,0xd8,0x01,0x8c,0xff,0x74,0x01,0x8d,0xff,0xd8,0x01,0x8e,0xff,0x74,0x01,0x8f,0xff,0xd8,0x01,0x90,0xff,0x74,0x01,0x91,0xff,0xd8,0x01,0x92,0xff,0x74,0x01,0x93,0xff,0xd8,0x00,0x09,0x00,0x37,0xff,0xa4,0x00,0x3c,0xff,0xbe,0x00,0xbb, +0xff,0xbe,0x00,0xea,0xff,0xbe,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x76,0xff,0xa4,0x01,0x82,0xff,0xbe,0x01,0x92,0xff,0xbe,0x00,0x16,0x00,0x26,0xff,0xc9,0x00,0x2a,0xff,0xc9,0x00,0x32,0xff,0xc9,0x00,0x64,0xff,0xc9,0x00,0x67,0xff,0xc9,0x00,0x92,0xff,0xc9,0x00,0xaf,0xff,0xc9,0x00,0xb0,0xff,0xc9,0x00,0xd0,0xff,0xc9, +0x00,0xd1,0xff,0xc9,0x00,0xd2,0xff,0xc9,0x00,0xf7,0xff,0xc9,0x00,0xfc,0xff,0xc9,0x00,0xfe,0xff,0xc9,0x01,0x18,0xff,0xc9,0x01,0x47,0xff,0xc9,0x01,0x51,0xff,0xc9,0x01,0x53,0xff,0xc9,0x01,0x55,0xff,0xc9,0x01,0x6e,0xff,0xc9,0x01,0x70,0xff,0xc9,0x01,0x89,0xff,0xc9,0x00,0x1a,0x00,0x24,0xff,0xce,0x00,0x37,0xff,0xa4,0x00,0x39, +0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xc4,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a, +0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x85,0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e,0xff,0xce,0x01,0x90,0xff,0xce,0x00,0x20,0x00,0x24,0xff,0x88,0x00,0x2d,0xff,0xbe,0x00,0x44,0xff,0xba,0x00,0x62,0xff,0x88,0x00,0x63,0xff,0x88,0x00,0x69,0xff,0xba,0x00,0x6a,0xff,0xba,0x00,0x6b,0xff,0xba, +0x00,0x6c,0xff,0xba,0x00,0x6d,0xff,0xba,0x00,0x6e,0xff,0xba,0x00,0x75,0x00,0x32,0x00,0x76,0x00,0x32,0x00,0x77,0x00,0x32,0x00,0xa0,0xff,0xba,0x00,0xad,0xff,0x88,0x00,0xae,0xff,0x88,0x00,0xc7,0xff,0x88,0x00,0xc9,0xff,0x88,0x01,0x03,0xff,0x88,0x01,0x04,0xff,0xba,0x01,0x05,0xff,0x88,0x01,0x06,0xff,0xba,0x01,0x45,0xff,0x88, +0x01,0x46,0xff,0xba,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0xff,0xbe,0x01,0x85,0xff,0x88,0x01,0x86,0xff,0xba,0x01,0x88,0xff,0xba,0x00,0x11,0x00,0x37,0xff,0xcf,0x00,0x39,0xff,0xd8,0x00,0x3a,0xff,0xd8,0x00,0x3b,0xff,0xd8,0x00,0x5c,0xff,0xd8,0x00,0x5d,0xff,0xd8,0x00,0xba,0xff,0xd8,0x00,0xeb, +0xff,0xd8,0x01,0x20,0xff,0xcf,0x01,0x22,0xff,0xcf,0x01,0x76,0xff,0xcf,0x01,0x80,0xff,0xd8,0x01,0x83,0xff,0xd8,0x01,0x8c,0xff,0xd8,0x01,0x8e,0xff,0xd8,0x01,0x90,0xff,0xd8,0x01,0x93,0xff,0xd8,0x00,0x0d,0x00,0x24,0xff,0xce,0x00,0x2d,0xff,0xb0,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce, +0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x63,0xff,0xb0,0x01,0x85,0xff,0xce,0x00,0x52,0x00,0x26,0xff,0xa6,0x00,0x2a,0xff,0xa6,0x00,0x2d,0x00,0x5a,0x00,0x32,0xff,0xa6,0x00,0x39,0x00,0x28,0x00,0x3a,0x00,0x28,0x00,0x3b,0x00,0x32,0x00,0x3c,0x00,0x28,0x00,0x3d, +0x00,0x28,0x00,0x46,0xff,0xe5,0x00,0x47,0xff,0xe5,0x00,0x48,0xff,0xe5,0x00,0x4a,0xff,0xe5,0x00,0x52,0xff,0xce,0x00,0x54,0xff,0xce,0x00,0x57,0xff,0xd1,0x00,0x59,0xff,0xba,0x00,0x5a,0xff,0xba,0x00,0x5b,0x00,0x1e,0x00,0x5c,0xff,0xa6,0x00,0x64,0xff,0xa6,0x00,0x67,0xff,0xa6,0x00,0x79,0xff,0xce,0x00,0x7a,0xff,0xce,0x00,0x7b, +0xff,0xce,0x00,0x7c,0xff,0xce,0x00,0x7d,0xff,0xce,0x00,0x92,0xff,0xa6,0x00,0xaf,0xff,0xa6,0x00,0xb0,0xff,0xa6,0x00,0xb1,0xff,0xce,0x00,0xba,0xff,0xa6,0x00,0xbb,0x00,0x28,0x00,0xd0,0xff,0xa6,0x00,0xd1,0xff,0xa6,0x00,0xd2,0xff,0xa6,0x00,0xe5,0x00,0x28,0x00,0xea,0x00,0x28,0x00,0xeb,0xff,0xa6,0x00,0xf7,0xff,0xa6,0x00,0xf8, +0xff,0xe5,0x00,0xfc,0xff,0xa6,0x00,0xfd,0xff,0xe5,0x00,0xfe,0xff,0xa6,0x00,0xff,0xff,0xe5,0x01,0x00,0xff,0xe5,0x01,0x08,0xff,0xe5,0x01,0x0b,0xff,0xe5,0x01,0x18,0xff,0xa6,0x01,0x19,0xff,0xce,0x01,0x21,0xff,0xd1,0x01,0x23,0xff,0xd1,0x01,0x28,0x00,0x28,0x01,0x2a,0x00,0x28,0x01,0x47,0xff,0xa6,0x01,0x48,0xff,0xe5,0x01,0x51, +0xff,0xa6,0x01,0x52,0xff,0xe5,0x01,0x53,0xff,0xa6,0x01,0x54,0xff,0xe5,0x01,0x55,0xff,0xa6,0x01,0x56,0xff,0xe5,0x01,0x63,0x00,0x5a,0x01,0x6e,0xff,0xa6,0x01,0x6f,0xff,0xce,0x01,0x70,0xff,0xa6,0x01,0x71,0xff,0xce,0x01,0x77,0xff,0xd1,0x01,0x80,0x00,0x28,0x01,0x81,0xff,0xba,0x01,0x82,0x00,0x28,0x01,0x83,0xff,0xa6,0x01,0x89, +0xff,0xa6,0x01,0x8a,0xff,0xce,0x01,0x8c,0x00,0x28,0x01,0x8d,0xff,0xba,0x01,0x8e,0x00,0x28,0x01,0x8f,0xff,0xba,0x01,0x90,0x00,0x28,0x01,0x91,0xff,0xba,0x01,0x92,0x00,0x28,0x01,0x93,0xff,0xa6,0x00,0x49,0x00,0x24,0x00,0x3c,0x00,0x26,0xff,0xba,0x00,0x2a,0xff,0xbe,0x00,0x2d,0x00,0x64,0x00,0x32,0xff,0xba,0x00,0x37,0xff,0x74, +0x00,0x38,0xff,0xd8,0x00,0x39,0xff,0x88,0x00,0x3a,0xff,0x88,0x00,0x3c,0xff,0x88,0x00,0x3d,0x00,0x3b,0x00,0x57,0xff,0xe5,0x00,0x59,0xff,0x9c,0x00,0x5a,0xff,0x9c,0x00,0x5c,0xff,0x9c,0x00,0x62,0x00,0x3c,0x00,0x63,0x00,0x3c,0x00,0x64,0xff,0xba,0x00,0x68,0xff,0xd8,0x00,0xad,0x00,0x3c,0x00,0xae,0x00,0x3c,0x00,0xba,0xff,0x9c, +0x00,0xbb,0xff,0x88,0x00,0xc7,0x00,0x3c,0x00,0xc9,0x00,0x3c,0x00,0xd3,0xff,0xd8,0x00,0xd4,0xff,0xd8,0x00,0xd5,0xff,0xd8,0x00,0xe5,0x00,0x3b,0x00,0xea,0xff,0x88,0x00,0xeb,0xff,0x9c,0x00,0xf7,0xff,0xbe,0x00,0xfc,0xff,0xba,0x00,0xfe,0xff,0xba,0x01,0x03,0x00,0x3c,0x01,0x05,0x00,0x3c,0x01,0x18,0xff,0xba,0x01,0x20,0xff,0x74, +0x01,0x21,0xff,0xe5,0x01,0x22,0xff,0x74,0x01,0x23,0xff,0xe5,0x01,0x24,0xff,0xd8,0x01,0x26,0xff,0xd8,0x01,0x28,0x00,0x3b,0x01,0x2a,0x00,0x3b,0x01,0x45,0x00,0x3c,0x01,0x47,0xff,0xba,0x01,0x51,0xff,0xbe,0x01,0x53,0xff,0xbe,0x01,0x55,0xff,0xbe,0x01,0x63,0x00,0x64,0x01,0x6e,0xff,0xba,0x01,0x70,0xff,0xba,0x01,0x76,0xff,0x74, +0x01,0x77,0xff,0xe5,0x01,0x78,0xff,0xd8,0x01,0x7a,0xff,0xd8,0x01,0x7c,0xff,0xd8,0x01,0x7e,0xff,0xd8,0x01,0x80,0xff,0x88,0x01,0x81,0xff,0x9c,0x01,0x82,0xff,0x88,0x01,0x83,0xff,0x9c,0x01,0x85,0x00,0x3c,0x01,0x89,0xff,0xba,0x01,0x8c,0xff,0x88,0x01,0x8d,0xff,0x9c,0x01,0x8e,0xff,0x88,0x01,0x8f,0xff,0x9c,0x01,0x90,0xff,0x88, +0x01,0x91,0xff,0x9c,0x01,0x92,0xff,0x88,0x01,0x93,0xff,0x9c,0x00,0x21,0x00,0x24,0xff,0xce,0x00,0x2d,0xff,0xf6,0x00,0x37,0xff,0xa4,0x00,0x39,0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xce,0x00,0x3c,0xff,0xce,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xbb, +0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x00,0xea,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x63,0xff,0xf6,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x82,0xff,0xce,0x01,0x85, +0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e,0xff,0xce,0x01,0x90,0xff,0xce,0x01,0x92,0xff,0xce,0x00,0x3e,0x00,0x24,0xff,0x74,0x00,0x2d,0xff,0x7f,0x00,0x3b,0xff,0xce,0x00,0x44,0xff,0xba,0x00,0x46,0xff,0xb4,0x00,0x47,0xff,0xb4,0x00,0x48,0xff,0xb4,0x00,0x4a,0xff,0xb4,0x00,0x52,0xff,0xb4,0x00,0x54,0xff,0xb4,0x00,0x62,0xff,0x74, +0x00,0x63,0xff,0x74,0x00,0x69,0xff,0xba,0x00,0x6a,0xff,0xba,0x00,0x6b,0xff,0xba,0x00,0x6c,0xff,0xba,0x00,0x6d,0xff,0xba,0x00,0x6e,0xff,0xba,0x00,0x6f,0xff,0xb4,0x00,0x70,0xff,0xb4,0x00,0x71,0xff,0xb4,0x00,0x72,0xff,0xb4,0x00,0x73,0xff,0xb4,0x00,0x79,0xff,0xb4,0x00,0x7a,0xff,0xb4,0x00,0x7b,0xff,0xb4,0x00,0x7c,0xff,0xb4, +0x00,0x7d,0xff,0xb4,0x00,0xa0,0xff,0xba,0x00,0xad,0xff,0x74,0x00,0xae,0xff,0x74,0x00,0xb1,0xff,0xb4,0x00,0xc7,0xff,0x74,0x00,0xc9,0xff,0x74,0x00,0xf8,0xff,0xb4,0x00,0xfd,0xff,0xb4,0x00,0xff,0xff,0xb4,0x01,0x00,0xff,0xb4,0x01,0x03,0xff,0x74,0x01,0x04,0xff,0xba,0x01,0x05,0xff,0x74,0x01,0x06,0xff,0xba,0x01,0x08,0xff,0xb4, +0x01,0x0b,0xff,0xb4,0x01,0x0d,0xff,0xb4,0x01,0x19,0xff,0xb4,0x01,0x45,0xff,0x74,0x01,0x46,0xff,0xba,0x01,0x48,0xff,0xb4,0x01,0x4c,0xff,0xb4,0x01,0x4e,0xff,0xb4,0x01,0x50,0xff,0xb4,0x01,0x52,0xff,0xb4,0x01,0x54,0xff,0xb4,0x01,0x56,0xff,0xb4,0x01,0x63,0xff,0x7f,0x01,0x6f,0xff,0xb4,0x01,0x71,0xff,0xb4,0x01,0x85,0xff,0x74, +0x01,0x86,0xff,0xba,0x01,0x88,0xff,0xba,0x01,0x8a,0xff,0xb4,0x00,0x1f,0x00,0x24,0xff,0xce,0x00,0x37,0xff,0xa4,0x00,0x39,0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xce,0x00,0x3c,0xff,0xce,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xbb,0xff,0xce,0x00,0xc7, +0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x00,0xea,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x82,0xff,0xce,0x01,0x85,0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e, +0xff,0xce,0x01,0x90,0xff,0xce,0x01,0x92,0xff,0xce,0x00,0x3d,0x00,0x26,0xff,0xe3,0x00,0x2a,0xff,0xe3,0x00,0x2d,0x00,0x39,0x00,0x32,0xff,0xec,0x00,0x37,0xff,0xa4,0x00,0x3c,0xff,0xd9,0x00,0x46,0xff,0xc4,0x00,0x47,0xff,0xc4,0x00,0x48,0xff,0xc4,0x00,0x4a,0xff,0xc4,0x00,0x52,0xff,0xc4,0x00,0x54,0xff,0xcb,0x00,0x64,0xff,0xe3, +0x00,0x6f,0xff,0xc4,0x00,0x70,0xff,0xc4,0x00,0x71,0xff,0xc4,0x00,0x72,0xff,0xc4,0x00,0x73,0xff,0xc4,0x00,0x79,0xff,0xc4,0x00,0x7a,0xff,0xc4,0x00,0x7b,0xff,0xc4,0x00,0x7c,0xff,0xc4,0x00,0x7d,0xff,0xc4,0x00,0xb1,0xff,0xc4,0x00,0xbb,0xff,0xd9,0x00,0xea,0xff,0xd9,0x00,0xf7,0xff,0xe3,0x00,0xf8,0xff,0xc4,0x00,0xfc,0xff,0xe3, +0x00,0xfd,0xff,0xc4,0x00,0xfe,0xff,0xe3,0x00,0xff,0xff,0xc4,0x01,0x00,0xff,0xc4,0x01,0x08,0xff,0xc4,0x01,0x0b,0xff,0xc4,0x01,0x0d,0xff,0xc4,0x01,0x18,0xff,0xec,0x01,0x19,0xff,0xc4,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x47,0xff,0xe3,0x01,0x48,0xff,0xc4,0x01,0x4c,0xff,0xc4,0x01,0x4e,0xff,0xc4,0x01,0x50,0xff,0xc4, +0x01,0x51,0xff,0xe3,0x01,0x52,0xff,0xc4,0x01,0x53,0xff,0xe3,0x01,0x54,0xff,0xc4,0x01,0x55,0xff,0xe3,0x01,0x56,0xff,0xc4,0x01,0x63,0x00,0x39,0x01,0x6e,0xff,0xec,0x01,0x6f,0xff,0xc4,0x01,0x70,0xff,0xec,0x01,0x71,0xff,0xc4,0x01,0x76,0xff,0xa4,0x01,0x82,0xff,0xd9,0x01,0x89,0xff,0xec,0x01,0x8a,0xff,0xc4,0x01,0x92,0xff,0xd9, +0x00,0x11,0x00,0x57,0xff,0xbe,0x00,0x59,0xff,0xce,0x00,0x5a,0xff,0xe2,0x00,0x5b,0xff,0xe2,0x00,0x5c,0xff,0xc4,0x00,0x5d,0xff,0xc4,0x00,0xba,0xff,0xc4,0x00,0xeb,0xff,0xc4,0x01,0x21,0xff,0xbe,0x01,0x23,0xff,0xbe,0x01,0x77,0xff,0xbe,0x01,0x81,0xff,0xe2,0x01,0x83,0xff,0xc4,0x01,0x8d,0xff,0xe2,0x01,0x8f,0xff,0xe2,0x01,0x91, +0xff,0xe2,0x01,0x93,0xff,0xc4,0x00,0x8a,0x00,0x24,0xff,0x74,0x00,0x26,0xff,0xa1,0x00,0x2a,0xff,0xa1,0x00,0x2d,0xff,0x8f,0x00,0x32,0xff,0xa1,0x00,0x36,0xff,0xd8,0x00,0x37,0x00,0x28,0x00,0x39,0x00,0x2b,0x00,0x3a,0x00,0x2b,0x00,0x3c,0x00,0x28,0x00,0x44,0xff,0x1a,0x00,0x46,0xff,0x38,0x00,0x47,0xff,0x38,0x00,0x48,0xff,0x38, +0x00,0x49,0xff,0xa0,0x00,0x4a,0xff,0x38,0x00,0x50,0xff,0x4e,0x00,0x51,0xff,0x4e,0x00,0x52,0xff,0x38,0x00,0x53,0xff,0x4e,0x00,0x54,0xff,0x38,0x00,0x55,0xff,0x4e,0x00,0x56,0xff,0x66,0x00,0x59,0xff,0x9a,0x00,0x5a,0xff,0x8f,0x00,0x5b,0xff,0x4c,0x00,0x5c,0xff,0x8f,0x00,0x5d,0xff,0x8f,0x00,0x62,0xff,0x74,0x00,0x63,0xff,0x74, +0x00,0x64,0xff,0xa1,0x00,0x67,0xff,0xa1,0x00,0x69,0xff,0x1a,0x00,0x6a,0xff,0x1a,0x00,0x6b,0xff,0x1a,0x00,0x6c,0xff,0x38,0x00,0x6d,0xff,0x38,0x00,0x6e,0xff,0x1a,0x00,0x6f,0xff,0x38,0x00,0x70,0xff,0x38,0x00,0x71,0xff,0x38,0x00,0x72,0xff,0x38,0x00,0x73,0xff,0x38,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x32,0x00,0x77,0x00,0x32, +0x00,0x79,0xff,0x38,0x00,0x7a,0xff,0x38,0x00,0x7b,0xff,0x38,0x00,0x7c,0xff,0x38,0x00,0x7d,0xff,0x38,0x00,0x92,0xff,0xa1,0x00,0xa0,0xff,0x1a,0x00,0xad,0xff,0x74,0x00,0xae,0xff,0x74,0x00,0xaf,0xff,0xa1,0x00,0xb0,0xff,0xa1,0x00,0xb1,0xff,0x38,0x00,0xba,0xff,0x8f,0x00,0xbb,0x00,0x28,0x00,0xc7,0xff,0x74,0x00,0xc9,0xff,0x74, +0x00,0xd0,0xff,0xa1,0x00,0xd1,0xff,0xa1,0x00,0xd2,0xff,0xa1,0x00,0xe3,0xff,0xd8,0x00,0xe4,0xff,0x66,0x00,0xea,0x00,0x28,0x00,0xeb,0xff,0x8f,0x00,0xf7,0xff,0xa1,0x00,0xf8,0xff,0x38,0x00,0xfa,0xff,0xd8,0x00,0xfb,0xff,0x66,0x00,0xfc,0xff,0xa1,0x00,0xfd,0xff,0x38,0x00,0xfe,0xff,0xa1,0x00,0xff,0xff,0x38,0x01,0x00,0xff,0x38, +0x01,0x03,0xff,0x74,0x01,0x04,0xff,0x38,0x01,0x05,0xff,0x74,0x01,0x06,0xff,0x1a,0x01,0x08,0xff,0x38,0x01,0x0b,0xff,0x38,0x01,0x0d,0xff,0x38,0x01,0x18,0xff,0xa1,0x01,0x19,0xff,0x38,0x01,0x1b,0xff,0x4e,0x01,0x1d,0xff,0x4e,0x01,0x1e,0xff,0xd8,0x01,0x1f,0xff,0x66,0x01,0x20,0x00,0x28,0x01,0x22,0x00,0x28,0x01,0x45,0xff,0x74, +0x01,0x46,0xff,0x38,0x01,0x47,0xff,0xa1,0x01,0x48,0xff,0x38,0x01,0x4c,0xff,0x38,0x01,0x4e,0xff,0x38,0x01,0x50,0xff,0x38,0x01,0x51,0xff,0xa1,0x01,0x52,0xff,0x38,0x01,0x53,0xff,0xa1,0x01,0x54,0xff,0x38,0x01,0x55,0xff,0xa1,0x01,0x56,0xff,0x38,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0xff,0x8f, +0x01,0x6d,0xff,0x4e,0x01,0x6e,0xff,0xa1,0x01,0x6f,0xff,0x38,0x01,0x70,0xff,0xa1,0x01,0x71,0xff,0x38,0x01,0x73,0xff,0x4e,0x01,0x74,0xff,0xd8,0x01,0x75,0xff,0x66,0x01,0x76,0x00,0x28,0x01,0x80,0x00,0x2b,0x01,0x81,0xff,0x8f,0x01,0x82,0x00,0x28,0x01,0x83,0xff,0x8f,0x01,0x85,0xff,0x74,0x01,0x86,0xff,0x38,0x01,0x88,0xff,0x1a, +0x01,0x89,0xff,0xa1,0x01,0x8a,0xff,0x38,0x01,0x8c,0x00,0x2b,0x01,0x8d,0xff,0x8f,0x01,0x8e,0x00,0x2b,0x01,0x8f,0xff,0x8f,0x01,0x90,0x00,0x2b,0x01,0x91,0xff,0x8f,0x01,0x92,0x00,0x28,0x01,0x93,0xff,0x8f,0x02,0x3d,0xff,0xd8,0x02,0x3e,0xff,0x66,0x00,0x0b,0x00,0x24,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad, +0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x85,0xff,0xce,0x00,0x72,0x00,0x24,0xff,0x88,0x00,0x26,0xff,0xce,0x00,0x2a,0xff,0xce,0x00,0x2d,0xff,0xba,0x00,0x32,0xff,0xce,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0x6a,0x00,0x46,0xff,0x7e, +0x00,0x47,0xff,0x7e,0x00,0x48,0xff,0x7e,0x00,0x4a,0xff,0x7e,0x00,0x50,0xff,0xb0,0x00,0x51,0xff,0xb0,0x00,0x52,0xff,0x7e,0x00,0x53,0xff,0xb4,0x00,0x54,0xff,0x7e,0x00,0x55,0xff,0xb4,0x00,0x56,0xff,0xbe,0x00,0x58,0xff,0xce,0x00,0x62,0xff,0x88,0x00,0x63,0xff,0x88,0x00,0x64,0xff,0xce,0x00,0x67,0xff,0xce,0x00,0x69,0xff,0x6a, +0x00,0x6a,0xff,0x6a,0x00,0x6b,0xff,0x6a,0x00,0x6c,0xff,0x6a,0x00,0x6d,0xff,0x6a,0x00,0x6e,0xff,0x6a,0x00,0x6f,0xff,0x7e,0x00,0x70,0xff,0x7e,0x00,0x71,0xff,0x7e,0x00,0x72,0xff,0x7e,0x00,0x73,0xff,0x7e,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x1e,0x00,0x77,0x00,0x3c,0x00,0x79,0xff,0x7e,0x00,0x7a,0xff,0x7e,0x00,0x7b,0xff,0x7e, +0x00,0x7c,0xff,0x7e,0x00,0x7d,0xff,0x7e,0x00,0x92,0xff,0xce,0x00,0xa0,0xff,0x6a,0x00,0xad,0xff,0x88,0x00,0xae,0xff,0x88,0x00,0xaf,0xff,0xce,0x00,0xb0,0xff,0xce,0x00,0xb1,0xff,0x7e,0x00,0xc7,0xff,0x88,0x00,0xc9,0xff,0x88,0x00,0xd0,0xff,0xce,0x00,0xd1,0xff,0xce,0x00,0xd2,0xff,0xce,0x00,0xe4,0xff,0xbe,0x00,0xf7,0xff,0xce, +0x00,0xf8,0xff,0x7e,0x00,0xfb,0xff,0xbe,0x00,0xfc,0xff,0xce,0x00,0xfd,0xff,0x7e,0x00,0xfe,0xff,0xce,0x00,0xff,0xff,0x7e,0x01,0x00,0xff,0x7e,0x01,0x03,0xff,0x88,0x01,0x04,0xff,0x6a,0x01,0x05,0xff,0x88,0x01,0x06,0xff,0x6a,0x01,0x08,0xff,0x7e,0x01,0x0b,0xff,0x7e,0x01,0x0d,0xff,0x7e,0x01,0x18,0xff,0xce,0x01,0x19,0xff,0x7e, +0x01,0x1b,0xff,0xb4,0x01,0x1d,0xff,0xb4,0x01,0x1f,0xff,0xbe,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x25,0xff,0xce,0x01,0x27,0xff,0xce,0x01,0x45,0xff,0x88,0x01,0x46,0xff,0x6a,0x01,0x47,0xff,0xce,0x01,0x48,0xff,0x7e,0x01,0x4c,0xff,0x7e,0x01,0x4e,0xff,0x7e,0x01,0x50,0xff,0x7e,0x01,0x51,0xff,0xce,0x01,0x52,0xff,0x7e, +0x01,0x53,0xff,0xce,0x01,0x54,0xff,0x7e,0x01,0x55,0xff,0xce,0x01,0x56,0xff,0x7e,0x01,0x5c,0x00,0x3c,0x01,0x5e,0x00,0x3c,0x01,0x60,0x00,0x3c,0x01,0x63,0xff,0xba,0x01,0x6d,0xff,0xb0,0x01,0x6e,0xff,0xce,0x01,0x6f,0xff,0x7e,0x01,0x70,0xff,0xce,0x01,0x71,0xff,0x7e,0x01,0x73,0xff,0xb4,0x01,0x75,0xff,0xbe,0x01,0x76,0x00,0x27, +0x01,0x79,0xff,0xce,0x01,0x7b,0xff,0xce,0x01,0x7d,0xff,0xce,0x01,0x7f,0xff,0xce,0x01,0x85,0xff,0x88,0x01,0x86,0xff,0x6a,0x01,0x88,0xff,0x6a,0x01,0x89,0xff,0xce,0x01,0x8a,0xff,0x7e,0x02,0x3e,0xff,0xbe,0x00,0x45,0x00,0x24,0xff,0xb0,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0xb0,0x00,0x46,0xff,0xb0,0x00,0x47,0xff,0xb0,0x00,0x48, +0xff,0xb0,0x00,0x4a,0xff,0xb0,0x00,0x52,0xff,0xb0,0x00,0x54,0xff,0xb0,0x00,0x62,0xff,0xb0,0x00,0x63,0xff,0xb0,0x00,0x69,0xff,0xb0,0x00,0x6a,0xff,0xb0,0x00,0x6b,0xff,0xb0,0x00,0x6c,0xff,0xb0,0x00,0x6d,0xff,0xb0,0x00,0x6e,0xff,0xb0,0x00,0x6f,0xff,0xb0,0x00,0x70,0xff,0xb0,0x00,0x71,0xff,0xb0,0x00,0x72,0xff,0xb0,0x00,0x73, +0xff,0xb0,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x1e,0x00,0x77,0x00,0x3c,0x00,0x79,0xff,0xb0,0x00,0x7a,0xff,0xb0,0x00,0x7b,0xff,0xb0,0x00,0x7c,0xff,0xb0,0x00,0x7d,0xff,0xb0,0x00,0xa0,0xff,0xb0,0x00,0xad,0xff,0xb0,0x00,0xae,0xff,0xb0,0x00,0xb1,0xff,0xb0,0x00,0xc7,0xff,0xb0,0x00,0xc9,0xff,0xb0,0x00,0xf8,0xff,0xb0,0x00,0xfd, +0xff,0xb0,0x00,0xff,0xff,0xb0,0x01,0x00,0xff,0xb0,0x01,0x03,0xff,0xb0,0x01,0x04,0xff,0xb0,0x01,0x05,0xff,0xb0,0x01,0x06,0xff,0xb0,0x01,0x08,0xff,0xb0,0x01,0x0b,0xff,0xb0,0x01,0x0d,0xff,0xb0,0x01,0x19,0xff,0xb0,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x45,0xff,0xb0,0x01,0x46,0xff,0xb0,0x01,0x48,0xff,0xb0,0x01,0x4c, +0xff,0xb0,0x01,0x4e,0xff,0xb0,0x01,0x50,0xff,0xb0,0x01,0x52,0xff,0xb0,0x01,0x54,0xff,0xb0,0x01,0x56,0xff,0xb0,0x01,0x5c,0x00,0x3c,0x01,0x5e,0x00,0x3c,0x01,0x60,0x00,0x3c,0x01,0x6f,0xff,0xb0,0x01,0x71,0xff,0xb0,0x01,0x76,0x00,0x27,0x01,0x85,0xff,0xb0,0x01,0x86,0xff,0xb0,0x01,0x88,0xff,0xb0,0x01,0x8a,0xff,0xb0,0x00,0x15, +0x00,0x26,0xff,0xe9,0x00,0x2a,0xff,0xe9,0x00,0x2d,0x00,0x60,0x00,0x32,0xff,0xe9,0x00,0x37,0x00,0x21,0x00,0x64,0xff,0xe9,0x00,0xf7,0xff,0xe9,0x00,0xfc,0xff,0xe9,0x00,0xfe,0xff,0xe9,0x01,0x18,0xff,0xe9,0x01,0x20,0x00,0x21,0x01,0x22,0x00,0x21,0x01,0x47,0xff,0xe9,0x01,0x51,0xff,0xe9,0x01,0x53,0xff,0xe9,0x01,0x55,0xff,0xe9, +0x01,0x63,0x00,0x60,0x01,0x6e,0xff,0xe9,0x01,0x70,0xff,0xe9,0x01,0x76,0x00,0x21,0x01,0x89,0xff,0xe9,0x00,0x6a,0x00,0x24,0xff,0x60,0x00,0x26,0xff,0xb0,0x00,0x2a,0xff,0xb0,0x00,0x2d,0xff,0xbe,0x00,0x32,0xff,0xb0,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0x4c,0x00,0x46,0xff,0x4c,0x00,0x47,0xff,0x4c,0x00,0x48,0xff,0x4c,0x00,0x49, +0xff,0xe5,0x00,0x4a,0xff,0x4c,0x00,0x50,0xff,0x73,0x00,0x51,0xff,0x73,0x00,0x52,0xff,0x4c,0x00,0x53,0xff,0x74,0x00,0x54,0xff,0x4c,0x00,0x55,0xff,0x73,0x00,0x56,0xff,0x7b,0x00,0x62,0xff,0x60,0x00,0x63,0xff,0x60,0x00,0x64,0xff,0xb0,0x00,0x67,0xff,0xb0,0x00,0x69,0xff,0x4c,0x00,0x6a,0xff,0x4c,0x00,0x6b,0xff,0x4c,0x00,0x6c, +0xff,0x4c,0x00,0x6d,0xff,0x4c,0x00,0x6e,0xff,0x4c,0x00,0x6f,0xff,0x4c,0x00,0x70,0xff,0x4c,0x00,0x71,0xff,0x4c,0x00,0x72,0xff,0x4c,0x00,0x73,0xff,0x4c,0x00,0x77,0x00,0x32,0x00,0x79,0xff,0x4c,0x00,0x7a,0xff,0x4c,0x00,0x7b,0xff,0x4c,0x00,0x7c,0xff,0x4c,0x00,0x7d,0xff,0x4c,0x00,0x92,0xff,0xb0,0x00,0xa0,0xff,0x4c,0x00,0xad, +0xff,0x60,0x00,0xae,0xff,0x60,0x00,0xaf,0xff,0xb0,0x00,0xb0,0xff,0xb0,0x00,0xb1,0xff,0x4c,0x00,0xc7,0xff,0x60,0x00,0xc9,0xff,0x60,0x00,0xd0,0xff,0xb0,0x00,0xd1,0xff,0xb0,0x00,0xd2,0xff,0xb0,0x00,0xe4,0xff,0x7b,0x00,0xf7,0xff,0xb0,0x00,0xf8,0xff,0x4c,0x00,0xfb,0xff,0x7b,0x00,0xfc,0xff,0xb0,0x00,0xfd,0xff,0x4c,0x00,0xfe, +0xff,0xb0,0x00,0xff,0xff,0x4c,0x01,0x00,0xff,0x4c,0x01,0x03,0xff,0x60,0x01,0x04,0xff,0x4c,0x01,0x05,0xff,0x60,0x01,0x06,0xff,0x4c,0x01,0x08,0xff,0x4c,0x01,0x0b,0xff,0x4c,0x01,0x0d,0xff,0x4c,0x01,0x18,0xff,0xb0,0x01,0x19,0xff,0x4c,0x01,0x1b,0xff,0x73,0x01,0x1d,0xff,0x73,0x01,0x1f,0xff,0x7b,0x01,0x20,0x00,0x27,0x01,0x22, +0x00,0x27,0x01,0x45,0xff,0x60,0x01,0x46,0xff,0x4c,0x01,0x47,0xff,0xb0,0x01,0x48,0xff,0x4c,0x01,0x4c,0xff,0x4c,0x01,0x4e,0xff,0x4c,0x01,0x50,0xff,0x4c,0x01,0x51,0xff,0xb0,0x01,0x52,0xff,0x4c,0x01,0x53,0xff,0xb0,0x01,0x54,0xff,0x4c,0x01,0x55,0xff,0xb0,0x01,0x56,0xff,0x4c,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60, +0x00,0x32,0x01,0x63,0xff,0xbe,0x01,0x6d,0xff,0x73,0x01,0x6e,0xff,0xb0,0x01,0x6f,0xff,0x4c,0x01,0x70,0xff,0xb0,0x01,0x71,0xff,0x4c,0x01,0x73,0xff,0x73,0x01,0x75,0xff,0x7b,0x01,0x76,0x00,0x27,0x01,0x85,0xff,0x60,0x01,0x86,0xff,0x4c,0x01,0x88,0xff,0x4c,0x01,0x89,0xff,0xb0,0x01,0x8a,0xff,0x4c,0x02,0x3e,0xff,0x7b,0x00,0x0f, +0x00,0x2d,0x00,0x52,0x00,0x37,0x00,0x27,0x00,0x5c,0xff,0xcb,0x00,0x77,0x00,0x32,0x00,0xba,0xff,0xcb,0x00,0xeb,0xff,0xcb,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0x00,0x52,0x01,0x76,0x00,0x27,0x01,0x83,0xff,0xcb,0x01,0x93,0xff,0xcb,0x00,0x02,0x00,0x3b, +0x00,0x24,0x00,0x27,0x00,0x00,0x00,0x29,0x00,0x2a,0x00,0x04,0x00,0x2d,0x00,0x2f,0x00,0x06,0x00,0x32,0x00,0x3d,0x00,0x09,0x00,0x62,0x00,0x64,0x00,0x15,0x00,0x67,0x00,0x68,0x00,0x18,0x00,0x92,0x00,0x92,0x00,0x1a,0x00,0xad,0x00,0xb0,0x00,0x1b,0x00,0xbb,0x00,0xbb,0x00,0x1f,0x00,0xc7,0x00,0xc7,0x00,0x20,0x00,0xc9,0x00,0xc9, +0x00,0x21,0x00,0xd0,0x00,0xd5,0x00,0x22,0x00,0xe3,0x00,0xe3,0x00,0x28,0x00,0xe5,0x00,0xe5,0x00,0x29,0x00,0xe8,0x00,0xe8,0x00,0x2a,0x00,0xea,0x00,0xea,0x00,0x2b,0x00,0xf7,0x00,0xf7,0x00,0x2c,0x00,0xfa,0x00,0xfa,0x00,0x2d,0x00,0xfc,0x00,0xfc,0x00,0x2e,0x00,0xfe,0x00,0xfe,0x00,0x2f,0x01,0x03,0x01,0x03,0x00,0x30,0x01,0x05, +0x01,0x05,0x00,0x31,0x01,0x0e,0x01,0x0e,0x00,0x32,0x01,0x18,0x01,0x18,0x00,0x33,0x01,0x1a,0x01,0x1a,0x00,0x34,0x01,0x1c,0x01,0x1c,0x00,0x35,0x01,0x1e,0x01,0x1e,0x00,0x36,0x01,0x20,0x01,0x20,0x00,0x37,0x01,0x22,0x01,0x22,0x00,0x38,0x01,0x24,0x01,0x24,0x00,0x39,0x01,0x26,0x01,0x26,0x00,0x3a,0x01,0x28,0x01,0x28,0x00,0x3b, +0x01,0x2a,0x01,0x2a,0x00,0x3c,0x01,0x45,0x01,0x45,0x00,0x3d,0x01,0x47,0x01,0x47,0x00,0x3e,0x01,0x51,0x01,0x51,0x00,0x3f,0x01,0x53,0x01,0x53,0x00,0x40,0x01,0x55,0x01,0x55,0x00,0x41,0x01,0x63,0x01,0x63,0x00,0x42,0x01,0x65,0x01,0x65,0x00,0x43,0x01,0x68,0x01,0x68,0x00,0x44,0x01,0x6e,0x01,0x6e,0x00,0x45,0x01,0x70,0x01,0x70, +0x00,0x46,0x01,0x72,0x01,0x72,0x00,0x47,0x01,0x74,0x01,0x74,0x00,0x48,0x01,0x76,0x01,0x76,0x00,0x49,0x01,0x78,0x01,0x78,0x00,0x4a,0x01,0x7a,0x01,0x7a,0x00,0x4b,0x01,0x7c,0x01,0x7c,0x00,0x4c,0x01,0x7e,0x01,0x7e,0x00,0x4d,0x01,0x80,0x01,0x80,0x00,0x4e,0x01,0x82,0x01,0x82,0x00,0x4f,0x01,0x85,0x01,0x85,0x00,0x50,0x01,0x89, +0x01,0x89,0x00,0x51,0x01,0x8c,0x01,0x8c,0x00,0x52,0x01,0x8e,0x01,0x8e,0x00,0x53,0x01,0x90,0x01,0x90,0x00,0x54,0x01,0x92,0x01,0x92,0x00,0x55,0x02,0x3d,0x02,0x3d,0x00,0x56,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24,0x00,0x48,0x00,0x02,0x00,0x4c,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x62,0x00,0x68,0x00,0x1a,0x00,0x91,0x00,0x92, +0x00,0x21,0x00,0xad,0x00,0xb0,0x00,0x23,0x00,0xbb,0x00,0xbb,0x00,0x27,0x00,0xc7,0x00,0xd5,0x00,0x28,0x00,0xe1,0x00,0xe1,0x00,0x37,0x00,0xe3,0x00,0xe3,0x00,0x38,0x00,0xe5,0x00,0xe5,0x00,0x39,0x00,0xe8,0x00,0xe8,0x00,0x3a,0x00,0xea,0x00,0xea,0x00,0x3b,0x00,0xec,0x00,0xec,0x00,0x3c,0x00,0xf7,0x00,0xf7,0x00,0x3d,0x00,0xf9, +0x00,0xfa,0x00,0x3e,0x00,0xfc,0x00,0xfc,0x00,0x40,0x00,0xfe,0x00,0xfe,0x00,0x41,0x01,0x03,0x01,0x03,0x00,0x42,0x01,0x05,0x01,0x05,0x00,0x43,0x01,0x07,0x01,0x07,0x00,0x44,0x01,0x09,0x01,0x0a,0x00,0x45,0x01,0x0c,0x01,0x0c,0x00,0x47,0x01,0x0e,0x01,0x0e,0x00,0x48,0x01,0x10,0x01,0x10,0x00,0x49,0x01,0x12,0x01,0x12,0x00,0x4a, +0x01,0x14,0x01,0x14,0x00,0x4b,0x01,0x16,0x01,0x16,0x00,0x4c,0x01,0x18,0x01,0x18,0x00,0x4d,0x01,0x1a,0x01,0x1a,0x00,0x4e,0x01,0x1c,0x01,0x1c,0x00,0x4f,0x01,0x1e,0x01,0x1e,0x00,0x50,0x01,0x20,0x01,0x20,0x00,0x51,0x01,0x22,0x01,0x22,0x00,0x52,0x01,0x24,0x01,0x24,0x00,0x53,0x01,0x26,0x01,0x26,0x00,0x54,0x01,0x28,0x01,0x28, +0x00,0x55,0x01,0x2a,0x01,0x2a,0x00,0x56,0x01,0x39,0x01,0x39,0x00,0x57,0x01,0x45,0x01,0x45,0x00,0x58,0x01,0x47,0x01,0x47,0x00,0x59,0x01,0x49,0x01,0x49,0x00,0x5a,0x01,0x4b,0x01,0x4b,0x00,0x5b,0x01,0x4d,0x01,0x4d,0x00,0x5c,0x01,0x4f,0x01,0x4f,0x00,0x5d,0x01,0x51,0x01,0x51,0x00,0x5e,0x01,0x53,0x01,0x53,0x00,0x5f,0x01,0x55, +0x01,0x55,0x00,0x60,0x01,0x57,0x01,0x57,0x00,0x61,0x01,0x59,0x01,0x59,0x00,0x62,0x01,0x5b,0x01,0x5b,0x00,0x63,0x01,0x5d,0x01,0x5d,0x00,0x64,0x01,0x5f,0x01,0x5f,0x00,0x65,0x01,0x61,0x01,0x61,0x00,0x66,0x01,0x63,0x01,0x63,0x00,0x67,0x01,0x65,0x01,0x65,0x00,0x68,0x01,0x68,0x01,0x68,0x00,0x69,0x01,0x6a,0x01,0x6a,0x00,0x6a, +0x01,0x6c,0x01,0x6c,0x00,0x6b,0x01,0x6e,0x01,0x6e,0x00,0x6c,0x01,0x70,0x01,0x70,0x00,0x6d,0x01,0x72,0x01,0x72,0x00,0x6e,0x01,0x74,0x01,0x74,0x00,0x6f,0x01,0x76,0x01,0x76,0x00,0x70,0x01,0x78,0x01,0x78,0x00,0x71,0x01,0x7a,0x01,0x7a,0x00,0x72,0x01,0x7c,0x01,0x7c,0x00,0x73,0x01,0x7e,0x01,0x7e,0x00,0x74,0x01,0x80,0x01,0x80, +0x00,0x75,0x01,0x82,0x01,0x82,0x00,0x76,0x01,0x85,0x01,0x85,0x00,0x77,0x01,0x87,0x01,0x87,0x00,0x78,0x01,0x89,0x01,0x89,0x00,0x79,0x01,0x8c,0x01,0x8c,0x00,0x7a,0x01,0x8e,0x01,0x8e,0x00,0x7b,0x01,0x90,0x01,0x90,0x00,0x7c,0x01,0x92,0x01,0x92,0x00,0x7d,0x0b,0x21,0x0b,0x21,0x00,0x7e,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24, +0x00,0x48,0x00,0x02,0x00,0x02,0x01,0xdb,0x02,0x06,0x00,0x00,0x02,0x33,0x02,0x33,0x00,0x2c,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24,0x00,0x48,0x00,0x02,0x00,0x04,0x00,0xa9,0x00,0xa9,0x00,0x00,0x01,0x2c,0x01,0x2e,0x00,0x01,0x01,0xa1,0x01,0xa7,0x00,0x04,0x01,0xa9,0x01,0xbe,0x00,0x0b,0x00,0x02,0x00,0x26,0x00,0x02,0x00,0x0f, +0x00,0x8c,0x00,0x8c,0x00,0x6e,0x00,0x8c,0x00,0x8c,0x00,0x8c,0x00,0x8c,0x01,0x96,0x01,0x96,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x02,0x00,0x0b,0x00,0x0b,0x00,0x0c,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x02,0x00,0x3e,0x00,0x3e,0x00,0x03,0x00,0x40,0x00,0x40,0x00,0x04,0x00,0x5e,0x00,0x5e,0x00,0x05, +0x00,0x60,0x00,0x60,0x00,0x06,0x00,0xa2,0x00,0xa2,0x00,0x07,0x00,0xa4,0x00,0xa4,0x00,0x08,0x00,0xaa,0x00,0xab,0x00,0x09,0x00,0xb2,0x00,0xb3,0x00,0x0b,0x00,0xbe,0x00,0xbf,0x00,0x0d,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x02,0x00,0x02,0x0f,0x2c,0x0f,0x2d,0x00,0x00, +0x0f,0x30,0x0f,0x31,0x00,0x02,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4b,0x00,0x01,0x00,0x02,0x0a,0x07,0x0a,0x08,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x8e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x02, +0x00,0x14,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x0c,0x09,0x0c,0x00,0x03,0x09,0x2a,0x09,0x2b,0x00,0x04,0x09,0x4a,0x09,0x4b,0x00,0x06,0x09,0x8a,0x09,0x8b,0x00,0x08,0x0a,0x05,0x0a,0x08,0x00,0x0a,0x0a,0x0b,0x0a,0x0e,0x00,0x0e,0x0e,0x20,0x0e,0x21,0x00,0x12,0x0e,0x4b, +0x0e,0x4c,0x00,0x14,0x0e,0x4f,0x0e,0x50,0x00,0x16,0x0f,0x2c,0x0f,0x2d,0x00,0x18,0x0f,0x30,0x0f,0x31,0x00,0x1a,0x0f,0x34,0x0f,0x35,0x00,0x1c,0x13,0x1c,0x13,0x1c,0x00,0x1e,0x13,0x1f,0x13,0x20,0x00,0x1f,0x13,0x23,0x13,0x23,0x00,0x21,0x14,0x59,0x14,0x59,0x00,0x22,0x14,0x7e,0x14,0x7e,0x00,0x23,0x00,0x01,0x00,0x01,0x09,0x73, +0x00,0x01,0x03,0x7e,0x00,0x05,0x00,0x00,0x00,0x2e,0x00,0x66,0x00,0xd4,0x01,0x48,0x02,0x04,0x02,0x84,0x02,0x84,0x02,0x84,0x01,0x48,0x02,0x84,0x02,0x92,0x02,0x92,0x02,0x9a,0x02,0x92,0x02,0xc6,0x03,0x76,0x02,0x84,0x02,0x84,0x01,0x48,0x01,0x48,0x00,0x66,0x01,0x48,0x02,0x84,0x01,0x48,0x01,0x48,0x02,0xc6,0x02,0xc6,0x02,0xc6, +0x02,0xc6,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x01,0x48,0x02,0x84,0x02,0x84,0x01,0x48,0x02,0x84,0x01,0x48,0x02,0xc6,0x02,0x84,0x01,0x48,0x00,0x66,0x01,0x48,0x01,0x48,0x01,0x48,0x01,0x48,0x00,0x12,0x0b,0x6b,0xff,0xec,0xff,0xec,0x0b,0x74,0xff,0xec,0xff,0xec,0x0b,0x7a,0xff,0xec,0xff,0xec,0x0b,0x7f,0xff,0xec,0xff,0xec, +0x0b,0x81,0xff,0xec,0xff,0xec,0x0b,0x8a,0xff,0xec,0xff,0xec,0x0b,0x8b,0xff,0xec,0xff,0xec,0x0b,0x8d,0xff,0xec,0xff,0xec,0x0b,0x8f,0xff,0xec,0xff,0xec,0x0b,0x92,0xff,0xec,0xff,0xec,0x0b,0x97,0xff,0xec,0xff,0xec,0x0b,0x98,0xff,0xec,0xff,0xec,0x0b,0x99,0xff,0xec,0xff,0xec,0x0b,0x9a,0xff,0xec,0xff,0xec,0x0b,0xa0,0xff,0xec, +0xff,0xec,0x0b,0xaf,0xff,0xec,0xff,0xec,0x0b,0xb1,0xff,0xec,0xff,0xec,0x0b,0xbb,0xff,0xec,0xff,0xec,0x00,0x13,0x0b,0x6b,0xff,0xec,0xff,0xec,0x0b,0x71,0xff,0xec,0xff,0xec,0x0b,0x74,0xff,0xec,0xff,0xec,0x0b,0x7a,0xff,0xec,0xff,0xec,0x0b,0x7f,0xff,0xec,0xff,0xec,0x0b,0x81,0xff,0xec,0xff,0xec,0x0b,0x8a,0xff,0xec,0xff,0xec, +0x0b,0x8b,0xff,0xec,0xff,0xec,0x0b,0x8d,0xff,0xec,0xff,0xec,0x0b,0x8f,0xff,0xec,0xff,0xec,0x0b,0x92,0xff,0xec,0xff,0xec,0x0b,0x97,0xff,0xec,0xff,0xec,0x0b,0x98,0xff,0xec,0xff,0xec,0x0b,0x99,0xff,0xec,0xff,0xec,0x0b,0x9a,0xff,0xec,0xff,0xec,0x0b,0xa0,0xff,0xec,0xff,0xec,0x0b,0xaf,0xff,0xec,0xff,0xec,0x0b,0xb1,0xff,0xec, +0xff,0xec,0x0b,0xbb,0xff,0xec,0xff,0xec,0x00,0x1f,0x0b,0x69,0xff,0xce,0xff,0xce,0x0b,0x6a,0xff,0xce,0xff,0xce,0x0b,0x6c,0xff,0xce,0xff,0xce,0x0b,0x6e,0x00,0x28,0x00,0x28,0x0b,0x6f,0xff,0xce,0xff,0xce,0x0b,0x70,0xff,0xd8,0xff,0xd8,0x0b,0x73,0xff,0xd8,0xff,0xd8,0x0b,0x75,0xff,0xce,0xff,0xce,0x0b,0x76,0xff,0xce,0xff,0xce, +0x0b,0x78,0xff,0xce,0xff,0xce,0x0b,0x79,0xff,0xd8,0xff,0xd8,0x0b,0x7b,0xff,0xce,0xff,0xce,0x0b,0x7c,0xff,0xd8,0xff,0xd8,0x0b,0x7d,0x00,0x14,0x00,0x14,0x0b,0x82,0xff,0xce,0xff,0xce,0x0b,0x90,0xff,0xce,0xff,0xce,0x0b,0x91,0xff,0xd8,0xff,0xd8,0x0b,0x93,0xff,0xce,0xff,0xce,0x0b,0x94,0xff,0xce,0xff,0xce,0x0b,0x95,0xff,0xce, +0xff,0xce,0x0b,0x9f,0xff,0xce,0xff,0xce,0x0b,0xa1,0xff,0xce,0xff,0xce,0x0b,0xa4,0xff,0xd8,0xff,0xd8,0x0b,0xa6,0xff,0xce,0xff,0xce,0x0b,0xa7,0xff,0xd8,0xff,0xd8,0x0b,0xa9,0xff,0xce,0xff,0xce,0x0b,0xab,0xff,0xd8,0xff,0xd8,0x0b,0xac,0xff,0xce,0xff,0xce,0x0b,0xad,0xff,0xd8,0xff,0xd8,0x0b,0xb0,0xff,0xce,0xff,0xce,0x0b,0xb2, +0xff,0xce,0xff,0xce,0x00,0x15,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x6c,0xff,0xec,0xff,0xec,0x0b,0x6e,0x00,0x14,0x00,0x14,0x0b,0x6f,0xff,0xec,0xff,0xec,0x0b,0x75,0xff,0xec,0xff,0xec,0x0b,0x76,0xff,0xec,0xff,0xec,0x0b,0x78,0xff,0xec,0xff,0xec,0x0b,0x7b,0xff,0xec,0xff,0xec,0x0b,0x7d,0x00,0x14,0x00,0x14,0x0b,0x82,0xff,0xec, +0xff,0xec,0x0b,0x90,0xff,0xec,0xff,0xec,0x0b,0x93,0xff,0xec,0xff,0xec,0x0b,0x94,0xff,0xec,0xff,0xec,0x0b,0x95,0xff,0xec,0xff,0xec,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x0b,0xa1,0xff,0xec,0xff,0xec,0x0b,0xa6,0xff,0xec,0xff,0xec,0x0b,0xa9,0xff,0xec,0xff,0xec,0x0b,0xac,0xff,0xec,0xff,0xec,0x0b,0xb0,0xff,0xec,0xff,0xec,0x0b,0xb2, +0xff,0xec,0xff,0xec,0x00,0x02,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x00,0x01,0x0b,0x6e,0x00,0x14,0x00,0x14,0x00,0x07,0x0b,0x79,0xff,0xe2,0xff,0xe2,0x0b,0x7c,0xff,0xe2,0xff,0xe2,0x0b,0x91,0xff,0xe2,0xff,0xe2,0x0b,0xa4,0xff,0xe2,0xff,0xe2,0x0b,0xa7,0xff,0xe2,0xff,0xe2,0x0b,0xab,0xff,0xe2,0xff,0xe2, +0x0b,0xad,0xff,0xe2,0xff,0xe2,0x00,0x1d,0x0b,0x69,0xff,0xec,0xff,0xec,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x6c,0xff,0xec,0xff,0xec,0x0b,0x6f,0xff,0xec,0xff,0xec,0x0b,0x70,0xff,0xec,0xff,0xec,0x0b,0x73,0xff,0xec,0xff,0xec,0x0b,0x75,0xff,0xec,0xff,0xec,0x0b,0x76,0xff,0xec,0xff,0xec,0x0b,0x78,0xff,0xec,0xff,0xec,0x0b,0x79, +0xff,0xec,0xff,0xec,0x0b,0x7b,0xff,0xec,0xff,0xec,0x0b,0x7c,0xff,0xec,0xff,0xec,0x0b,0x82,0xff,0xec,0xff,0xec,0x0b,0x90,0xff,0xec,0xff,0xec,0x0b,0x91,0xff,0xec,0xff,0xec,0x0b,0x93,0xff,0xec,0xff,0xec,0x0b,0x94,0xff,0xec,0xff,0xec,0x0b,0x95,0xff,0xec,0xff,0xec,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x0b,0xa1,0xff,0xec,0xff,0xec, +0x0b,0xa4,0xff,0xec,0xff,0xec,0x0b,0xa6,0xff,0xec,0xff,0xec,0x0b,0xa7,0xff,0xec,0xff,0xec,0x0b,0xa9,0xff,0xec,0xff,0xec,0x0b,0xab,0xff,0xec,0xff,0xec,0x0b,0xac,0xff,0xec,0xff,0xec,0x0b,0xad,0xff,0xec,0xff,0xec,0x0b,0xb0,0xff,0xec,0xff,0xec,0x0b,0xb2,0xff,0xec,0xff,0xec,0x00,0x01,0x0b,0x81,0xff,0xe2,0xff,0xe2,0x00,0x02, +0x00,0x16,0x0b,0x68,0x0b,0x68,0x00,0x00,0x0b,0x6a,0x0b,0x6b,0x00,0x01,0x0b,0x6e,0x0b,0x6e,0x00,0x03,0x0b,0x70,0x0b,0x71,0x00,0x04,0x0b,0x73,0x0b,0x74,0x00,0x06,0x0b,0x79,0x0b,0x7a,0x00,0x08,0x0b,0x7d,0x0b,0x7f,0x00,0x0a,0x0b,0x81,0x0b,0x82,0x00,0x0d,0x0b,0x84,0x0b,0x85,0x00,0x0f,0x0b,0x8a,0x0b,0x8b,0x00,0x11,0x0b,0x8e, +0x0b,0x8f,0x00,0x13,0x0b,0x91,0x0b,0x92,0x00,0x15,0x0b,0x94,0x0b,0x94,0x00,0x17,0x0b,0x97,0x0b,0x9d,0x00,0x18,0x0b,0x9f,0x0b,0xa0,0x00,0x1f,0x0b,0xa4,0x0b,0xa4,0x00,0x21,0x0b,0xa7,0x0b,0xa8,0x00,0x22,0x0b,0xab,0x0b,0xab,0x00,0x24,0x0b,0xb0,0x0b,0xb1,0x00,0x25,0x0b,0xb5,0x0b,0xb5,0x00,0x27,0x0b,0xb7,0x0b,0xb7,0x00,0x28, +0x0b,0xba,0x0b,0xbe,0x00,0x29,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x00,0x00,0x4d,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, +0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x02,0x00,0x44,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x4e,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x02,0x00,0x30,0x00,0x5e,0x00,0x01, +0x00,0x00,0x00,0x4e,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x02,0x00,0x1c,0x00,0x50,0x00,0x01,0x00,0x00,0x00,0x4e,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9, +0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x58,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x5a,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x02,0x00,0x4e,0x00,0x48,0x00,0x01,0x00,0x00,0x00,0x4f, +0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x3a,0x00,0x3a,0x00,0x34,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x05,0x0b,0x5f, +0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x30,0x00,0x02,0x02,0x36,0x02,0x3c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x1c,0x00,0x02,0x02,0x22,0x02,0x38,0x00,0x01, +0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x08,0x00,0x03,0x02,0x0e,0x02,0x2a,0x02,0x24,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xf2,0x00,0x02,0x01,0xf8,0x02,0x36,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xde,0x00,0x03,0x01,0xe4,0x02,0x00,0x02,0x22,0x00,0x01, +0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x01,0x02,0x12,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xb6,0x00,0x03,0x01,0xd8,0x01,0xbc,0x01,0xc2,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x04,0x01,0xc2,0x01,0xc2,0x01,0xa6,0x01,0xac,0x00,0x01, +0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x88,0x00,0x05,0x01,0xaa,0x01,0xaa,0x01,0xaa,0x01,0x8e,0x01,0x94,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x6e,0x00,0x03,0x01,0x90,0x01,0x74,0x01,0x8a,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x04,0x01,0x7a, +0x01,0x5e,0x01,0x7a,0x01,0x74,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x40,0x00,0x04,0x01,0x62,0x01,0x62,0x01,0x46,0x01,0x5c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x28,0x00,0x05,0x01,0x4a,0x01,0x4a,0x01,0x2e,0x01,0x4a,0x01,0x44,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03, +0x00,0x00,0x00,0x01,0x01,0x0e,0x00,0x05,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x14,0x01,0x2a,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf4,0x00,0x06,0x01,0x16,0x01,0x16,0x01,0x16,0x00,0xfa,0x01,0x16,0x01,0x10,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xd8,0x00,0x03,0x00,0xfa, +0x00,0xde,0x01,0x1c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xc2,0x00,0x04,0x00,0xe4,0x00,0xc8,0x00,0xe4,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xaa,0x00,0x04,0x00,0xcc,0x00,0xcc,0x00,0xb0,0x00,0xee,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01, +0x00,0x92,0x00,0x05,0x00,0xb4,0x00,0xb4,0x00,0x98,0x00,0xb4,0x00,0xd6,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x05,0x00,0x9a,0x00,0x9a,0x00,0x9a,0x00,0x7e,0x00,0xbc,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x06,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x64, +0x00,0x80,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x02,0x00,0x64,0x00,0x8c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x50,0x00,0x50,0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x3a, +0x00,0x3a,0x00,0x3a,0x00,0x62,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, +0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x3c,0x00,0x02,0x03,0x42,0x03,0x82,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x28,0x00,0x03,0x03,0xa8,0x03,0x2e,0x03,0x6e, +0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x12,0x00,0x04,0x03,0x92,0x03,0x92,0x03,0x18,0x03,0x58,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xfa,0x00,0x03,0x03,0x00,0x03,0x9c,0x03,0xa2,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x04,0x03,0x64, +0x02,0xea,0x03,0x86,0x03,0x8c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xcc,0x00,0x05,0x03,0x4c,0x03,0x4c,0x02,0xd2,0x03,0x6e,0x03,0x74,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xb2,0x00,0x02,0x02,0xb8,0x03,0x6a,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01, +0x02,0x9e,0x00,0x03,0x03,0x1e,0x02,0xa4,0x03,0x56,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x88,0x00,0x04,0x03,0x08,0x03,0x08,0x02,0x8e,0x03,0x40,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x70,0x00,0x03,0x02,0x76,0x03,0x12,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03, +0x00,0x00,0x00,0x01,0x02,0x5a,0x00,0x04,0x02,0xda,0x02,0x60,0x02,0xfc,0x03,0x18,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x42,0x00,0x05,0x02,0xc2,0x02,0xc2,0x02,0x48,0x02,0xe4,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x28,0x00,0x03,0x02,0x2e,0x02,0xca,0x02,0xec, +0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x12,0x00,0x04,0x02,0x92,0x02,0x18,0x02,0xb4,0x02,0xd6,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xfa,0x00,0x05,0x02,0x7a,0x02,0x7a,0x02,0x00,0x02,0x9c,0x02,0xbe,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xe0, +0x00,0x03,0x01,0xe6,0x02,0x60,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xca,0x00,0x04,0x02,0x4a,0x01,0xd0,0x02,0x4a,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xb2,0x00,0x05,0x02,0x32,0x02,0x32,0x01,0xb8,0x02,0x32,0x01,0xf8,0x00,0x01,0x00,0x00,0x00,0x51, +0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x98,0x00,0x04,0x01,0x9e,0x02,0x18,0x02,0x3a,0x02,0x40,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x05,0x02,0x00,0x01,0x86,0x02,0x00,0x02,0x22,0x02,0x28,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x66,0x00,0x06,0x01,0xe6,0x01,0xe6, +0x01,0x6c,0x01,0xe6,0x02,0x08,0x02,0x0e,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x4a,0x00,0x03,0x01,0x50,0x01,0xca,0x02,0x02,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x34,0x00,0x04,0x01,0xb4,0x01,0x3a,0x01,0xb4,0x01,0xec,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00, +0x00,0x01,0x01,0x1c,0x00,0x05,0x01,0x9c,0x01,0x9c,0x01,0x22,0x01,0x9c,0x01,0xd4,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x02,0x00,0x05,0x01,0x08,0x01,0x82,0x01,0xa4,0x01,0xcc,0x01,0xd2,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x06,0x01,0x68,0x00,0xee,0x01,0x68, +0x01,0x8a,0x01,0xb2,0x01,0xb8,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xcc,0x00,0x07,0x01,0x4c,0x01,0x4c,0x00,0xd2,0x01,0x4c,0x01,0x6e,0x01,0x96,0x01,0x9c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xae,0x00,0x04,0x00,0xb4,0x01,0x2e,0x01,0x50,0x01,0x6c,0x00,0x01,0x00,0x00, +0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x05,0x01,0x16,0x00,0x9c,0x01,0x16,0x01,0x38,0x01,0x54,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x7c,0x00,0x06,0x00,0xfc,0x00,0xfc,0x00,0x82,0x00,0xfc,0x01,0x1e,0x01,0x3a,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x60, +0x00,0x04,0x00,0x66,0x00,0xe0,0x01,0x02,0x01,0x24,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x05,0x00,0xc8,0x00,0x4e,0x00,0xc8,0x00,0xea,0x01,0x0c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x06,0x00,0xae,0x00,0xae,0x00,0x34,0x00,0xae,0x00,0xd0,0x00,0xf2, +0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x01,0x00,0xe8,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07, +0x0b,0xd6,0x0b,0xd6,0x00,0x08,0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c,0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30, +0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68, +0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x61,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1a,0x00,0x01,0x00,0x42, +0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x52,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x03,0x0b,0xc0,0x0b,0xc0,0x00,0x00, +0x0b,0xd7,0x0b,0xd7,0x00,0x01,0x0b,0xdc,0x0b,0xdc,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0xf8,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xde,0x00,0x02,0x01,0x0e,0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xca,0x00,0x03,0x00,0xfa,0x00,0xfa, +0x00,0xd2,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x01,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xa2,0x00,0x02,0x00,0xd2,0x00,0xf4,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x8e,0x00,0x03,0x00,0xbe,0x00,0xbe,0x00,0xe0,0x00,0x01, +0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x01,0x00,0xd0,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x02,0x00,0x96,0x00,0xbe,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x52,0x00,0x03,0x00,0x82,0x00,0x82,0x00,0xaa,0x00,0x01,0x00,0x00,0x00,0x53, +0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x9a,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2a,0x00,0x02,0x00,0x5a,0x00,0x88,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x03,0x00,0x46,0x00,0x46,0x00,0x74,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x01,0x00,0x02, +0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd, +0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x62,0x00,0x01,0x00,0x01,0x11,0x86,0x00,0x01,0x00,0x01,0x0b,0x07,0x00,0x03,0x00,0x01,0x00,0x40,0x00,0x01,0x00,0x46,0x00,0x01,0x00,0x4e,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x03,0x00,0x01,0x00,0x2c,0x00,0x01,0x00,0x32,0x00,0x02, +0x00,0x74,0x00,0x7a,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x5e,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88, +0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x03, +0x00,0x02,0x00,0xee,0x00,0xee,0x00,0x01,0x01,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x01,0x08,0x00,0xda,0x00,0xda,0x00,0x01,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0xf2,0x00,0xf2,0x00,0xc4,0x00,0xc4,0x00,0x01,0x00,0xec,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55, +0x00,0x03,0x00,0x02,0x00,0xac,0x00,0xda,0x00,0x01,0x00,0xd4,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x00,0xc6,0x00,0x98,0x00,0xc6,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0xb0,0x00,0xb0,0x00,0x82,0x00,0xb0,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0x00, +0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x6a,0x00,0xc6,0x00,0x01,0x00,0x92,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x00,0x84,0x00,0x56,0x00,0xb2,0x00,0x01,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0x6e,0x00,0x6e,0x00,0x40,0x00,0x9c,0x00,0x01,0x00,0x68,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x8a,0x00,0x01,0x00,0x50,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x7c,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95, +0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1, +0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x62,0x00,0x01,0x00,0x01,0x11,0x86,0x00,0x01,0x00,0x01,0x0b,0x07,0x00,0x03,0x00,0x03,0x00,0x64,0x00,0x6a,0x00,0x6a,0x00,0x01,0x00,0x92,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x04,0x00,0x4e,0x00,0x54,0x00,0x82,0x00,0x54,0x00,0x01,0x00,0x7c, +0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x05,0x00,0x36,0x00,0x3c,0x00,0x6a,0x00,0x6a,0x00,0x3c,0x00,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x06,0x00,0x1c,0x00,0x22,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x22,0x00,0x01,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x01, +0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61, +0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x03,0x00,0x02,0x06,0x38,0x06,0x3e,0x00,0x01,0x06,0x66,0x00,0x01,0x06,0xa6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0x22,0x06,0xca,0x06,0x28, +0x00,0x01,0x06,0x50,0x00,0x01,0x06,0x90,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x06,0x0a,0x06,0x10,0x00,0x01,0x06,0x38,0x00,0x02,0x06,0xba,0x06,0x78,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0xa2,0x05,0xf2,0x05,0xf8,0x00,0x01,0x06,0x20,0x00,0x01,0x06,0x60,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03, +0x00,0x04,0x06,0x8a,0x06,0x8a,0x05,0xda,0x05,0xe0,0x00,0x01,0x06,0x08,0x00,0x01,0x06,0x48,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0x70,0x05,0xc0,0x05,0xc6,0x00,0x01,0x05,0xee,0x00,0x02,0x06,0x70,0x06,0x2e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x06,0x56,0x06,0x56,0x05,0xa6,0x05,0xac,0x00,0x01, +0x05,0xd4,0x00,0x02,0x06,0x56,0x06,0x14,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x8a,0x06,0x32,0x05,0x90,0x00,0x01,0x05,0xb8,0x00,0x02,0x06,0x3a,0x05,0xf8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x06,0x20,0x05,0x70,0x06,0x18,0x05,0x76,0x00,0x01,0x05,0x9e,0x00,0x01,0x05,0xde,0x00,0x01,0x00,0x00, +0x00,0x57,0x00,0x03,0x00,0x05,0x06,0x06,0x06,0x06,0x05,0x56,0x05,0xfe,0x05,0x5c,0x00,0x01,0x05,0x84,0x00,0x01,0x05,0xc4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x05,0xea,0x05,0x3a,0x05,0xe2,0x05,0x40,0x00,0x01,0x05,0x68,0x00,0x02,0x05,0xea,0x05,0xa8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x05,0xce, +0x05,0xce,0x05,0x1e,0x05,0xc6,0x05,0x24,0x00,0x01,0x05,0x4c,0x00,0x02,0x05,0xce,0x05,0x8c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x05,0x00,0x05,0x06,0x00,0x01,0x05,0x2e,0x00,0x02,0x05,0xd2,0x05,0xd8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x04,0xe8,0x05,0x90,0x04,0xee,0x00,0x01,0x05,0x16,0x00,0x02, +0x05,0xba,0x05,0xc0,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x04,0xce,0x04,0xd4,0x00,0x01,0x04,0xfc,0x00,0x03,0x05,0x7e,0x05,0xa0,0x05,0xa6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x64,0x04,0xb4,0x04,0xba,0x00,0x01,0x04,0xe2,0x00,0x02,0x05,0x86,0x05,0x8c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03, +0x00,0x04,0x05,0x4a,0x05,0x4a,0x04,0x9a,0x04,0xa0,0x00,0x01,0x04,0xc8,0x00,0x02,0x05,0x6c,0x05,0x72,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x2e,0x04,0x7e,0x04,0x84,0x00,0x01,0x04,0xac,0x00,0x03,0x05,0x2e,0x05,0x50,0x05,0x56,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x05,0x12,0x05,0x12,0x04,0x62, +0x04,0x68,0x00,0x01,0x04,0x90,0x00,0x03,0x05,0x12,0x05,0x34,0x05,0x3a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x04,0x44,0x04,0xec,0x04,0x4a,0x00,0x01,0x04,0x72,0x00,0x03,0x04,0xf4,0x05,0x16,0x05,0x1c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x04,0xd8,0x04,0x28,0x04,0xd0,0x04,0x2e,0x00,0x01,0x04,0x56, +0x00,0x02,0x04,0xfa,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x04,0xbc,0x04,0xbc,0x04,0x0c,0x04,0xb4,0x04,0x12,0x00,0x01,0x04,0x3a,0x00,0x02,0x04,0xde,0x04,0xe4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x04,0x9e,0x03,0xee,0x04,0x96,0x03,0xf4,0x00,0x01,0x04,0x1c,0x00,0x03,0x04,0x9e,0x04,0xc0, +0x04,0xc6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x04,0x80,0x04,0x80,0x03,0xd0,0x04,0x78,0x03,0xd6,0x00,0x01,0x03,0xfe,0x00,0x03,0x04,0x80,0x04,0xa2,0x04,0xa8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x03,0xb0,0x03,0xb6,0x00,0x01,0x03,0xde,0x00,0x02,0x04,0x82,0x04,0x98,0x00,0x01,0x00,0x00,0x00,0x57, +0x00,0x03,0x00,0x02,0x03,0x98,0x03,0x9e,0x00,0x01,0x03,0xc6,0x00,0x02,0x04,0x6a,0x04,0x86,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x80,0x04,0x28,0x03,0x86,0x00,0x01,0x03,0xae,0x00,0x02,0x04,0x52,0x04,0x68,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x66,0x04,0x0e,0x03,0x6c,0x00,0x01,0x03,0x94, +0x00,0x02,0x04,0x38,0x04,0x54,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x03,0x4c,0x03,0x52,0x00,0x01,0x03,0x7a,0x00,0x03,0x03,0xfc,0x04,0x1e,0x04,0x34,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0xe2,0x03,0x32,0x03,0x38,0x00,0x01,0x03,0x60,0x00,0x02,0x04,0x04,0x04,0x1a,0x00,0x01,0x00,0x00,0x00,0x57, +0x00,0x03,0x00,0x04,0x03,0xc8,0x03,0xc8,0x03,0x18,0x03,0x1e,0x00,0x01,0x03,0x46,0x00,0x02,0x03,0xea,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0xac,0x02,0xfc,0x03,0x02,0x00,0x01,0x03,0x2a,0x00,0x03,0x03,0xac,0x03,0xce,0x03,0xe4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x90,0x03,0x90, +0x02,0xe0,0x02,0xe6,0x00,0x01,0x03,0x0e,0x00,0x03,0x03,0x90,0x03,0xb2,0x03,0xc8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x02,0xc2,0x02,0xc8,0x00,0x01,0x02,0xf0,0x00,0x03,0x03,0x72,0x03,0x94,0x03,0xb0,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x58,0x02,0xa8,0x02,0xae,0x00,0x01,0x02,0xd6,0x00,0x02, +0x03,0x7a,0x03,0x96,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x3e,0x03,0x3e,0x02,0x8e,0x02,0x94,0x00,0x01,0x02,0xbc,0x00,0x02,0x03,0x60,0x03,0x7c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x22,0x02,0x72,0x02,0x78,0x00,0x01,0x02,0xa0,0x00,0x03,0x03,0x22,0x03,0x44,0x03,0x60,0x00,0x01,0x00,0x00, +0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x06,0x03,0x06,0x02,0x56,0x02,0x5c,0x00,0x01,0x02,0x84,0x00,0x03,0x03,0x06,0x03,0x28,0x03,0x44,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x02,0x38,0x02,0xe0,0x02,0x3e,0x00,0x01,0x02,0x66,0x00,0x03,0x02,0xe8,0x03,0x0a,0x03,0x20,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04, +0x02,0xcc,0x02,0x1c,0x02,0xc4,0x02,0x22,0x00,0x01,0x02,0x4a,0x00,0x02,0x02,0xee,0x03,0x04,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0xb0,0x02,0x00,0x02,0xa8,0x02,0x06,0x00,0x01,0x02,0x2e,0x00,0x02,0x02,0xd2,0x02,0xe8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x94,0x01,0xe4,0x02,0x8c,0x01,0xea, +0x00,0x01,0x02,0x12,0x00,0x03,0x02,0x94,0x02,0xb6,0x02,0xcc,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x02,0x76,0x02,0x76,0x00,0x01,0x01,0xf4,0x00,0x03,0x02,0x76,0x02,0x98,0x02,0xae,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0xac,0x02,0x54,0x01,0xb2,0x00,0x01,0x01,0xda,0x00,0x03,0x02,0x5c,0x02,0x7e, +0x02,0x94,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x40,0x01,0x90,0x02,0x38,0x01,0x96,0x00,0x01,0x01,0xbe,0x00,0x02,0x02,0x62,0x02,0x78,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x02,0x24,0x02,0x24,0x01,0x74,0x02,0x1c,0x01,0x7a,0x00,0x01,0x01,0xa2,0x00,0x02,0x02,0x46,0x02,0x5c,0x00,0x01,0x00,0x00, +0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x06,0x01,0x56,0x01,0xfe,0x01,0x5c,0x00,0x01,0x01,0x84,0x00,0x03,0x02,0x06,0x02,0x28,0x02,0x3e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x01,0x38,0x01,0x3e,0x00,0x01,0x01,0x66,0x00,0x01,0x02,0x2c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0x22,0x01,0xca,0x01,0x28, +0x00,0x01,0x01,0x50,0x00,0x01,0x02,0x16,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x01,0x0a,0x01,0x10,0x00,0x01,0x01,0x38,0x00,0x02,0x01,0xba,0x01,0xfe,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0xa2,0x00,0xf2,0x00,0xf8,0x00,0x01,0x01,0x20,0x00,0x01,0x01,0xe6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03, +0x00,0x04,0x01,0x8a,0x01,0x8a,0x00,0xda,0x00,0xe0,0x00,0x01,0x01,0x08,0x00,0x01,0x01,0xce,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0x70,0x00,0xc0,0x00,0xc6,0x00,0x01,0x00,0xee,0x00,0x02,0x01,0x70,0x01,0xb4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x01,0x56,0x01,0x56,0x00,0xa6,0x00,0xac,0x00,0x01, +0x00,0xd4,0x00,0x02,0x01,0x56,0x01,0x9a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x00,0x8a,0x01,0x32,0x00,0x90,0x00,0x01,0x00,0xb8,0x00,0x02,0x01,0x3a,0x01,0x7e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x01,0x20,0x00,0x70,0x01,0x18,0x00,0x76,0x00,0x01,0x00,0x9e,0x00,0x01,0x01,0x64,0x00,0x01,0x00,0x00, +0x00,0x57,0x00,0x03,0x00,0x05,0x01,0x06,0x01,0x06,0x00,0x56,0x00,0xfe,0x00,0x5c,0x00,0x01,0x00,0x84,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x00,0xea,0x00,0x3a,0x00,0xe2,0x00,0x40,0x00,0x01,0x00,0x68,0x00,0x02,0x00,0xea,0x01,0x2e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x00,0xce, +0x00,0xce,0x00,0x1e,0x00,0xc6,0x00,0x24,0x00,0x01,0x00,0x4c,0x00,0x02,0x00,0xce,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31, +0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07,0x0b,0xd6,0x0b,0xd6,0x00,0x08,0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c, +0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a, +0x00,0x01,0x00,0x02,0x0b,0x5e,0x0b,0x61,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b, +0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x58,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a, +0x00,0x01,0x00,0x00,0x00,0x59,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x02,0x0b,0x58,0x0b,0x5b,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x04,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x5a,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x02,0x0b,0x54,0x0b,0x56, +0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x42,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x00,0x00,0x5b,0x00,0x03,0x00,0x01,0x00,0x8a,0x00,0x01,0x00,0x2e,0x00,0x01,0x00,0x5c,0x00,0x01,0x00,0x00,0x00,0x5b,0x00,0x03,0x00,0x01,0x00,0x7c,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x48,0x00,0x01, +0x00,0x00,0x00,0x5b,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f, +0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x88,0x00,0x01,0x00,0x01,0x0b,0x89,0x00,0x03,0x00,0x02,0x00,0x3e,0x00,0x6c,0x00,0x01,0x00,0x72,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x03,0x00,0x03,0x00,0x66,0x00,0x7c,0x00,0x82,0x00,0x01,0x00,0x5e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x94,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01, +0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x53,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9, +0x00,0x0a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x03,0x00,0x02,0x00,0x78,0x00,0xa6,0x00,0x01, +0x00,0xac,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x64,0x00,0xa0,0x00,0x01,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x50,0x00,0x92,0x00,0x01,0x00,0x84,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x3c,0x00,0x84,0x00,0x01,0x00,0x70,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x76,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x68,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, +0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x58,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0x59,0x00,0x01,0x00,0x01,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x5b,0x00,0x01,0x00,0x01, +0x0b,0x5d,0x00,0x01,0x00,0x01,0x0b,0xb9,0x00,0x03,0x00,0x02,0x00,0x50,0x00,0x7e,0x00,0x01,0x00,0x84,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x3c,0x00,0x78,0x00,0x01,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x6a,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x5c,0x00,0x72,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05, +0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x54,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0x55,0x00,0x01,0x00,0x01,0x0b,0x56,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x03,0x00,0x00, +0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x4c,0x00,0x01,0x00,0x00,0x00,0x5f,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1, +0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d, +0x00,0x10,0x00,0x03,0x00,0x01,0x00,0x5c,0x00,0x01,0x00,0x8a,0x00,0x01,0x00,0x90,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x48,0x00,0x01,0x00,0x76,0x00,0x02,0x00,0x48,0x00,0x7c,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x32,0x00,0x01,0x00,0x60,0x00,0x03,0x00,0x32,0x00,0x32,0x00,0x66,0x00,0x01, +0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x48,0x00,0x04,0x00,0x1a,0x00,0x1a,0x00,0x1a,0x00,0x4e,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11, +0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x01,0x00,0x01,0x0b,0x75,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14, +0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x62,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x63,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01, +0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x02, +0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x01,0x00,0x01,0x14,0x6b,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01, +0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01, +0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e, +0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6d,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x02,0x00,0x01, +0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6f,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0x70,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x71,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x16, +0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01, +0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x74,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00, +0x00,0x75,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16, +0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01, +0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x79,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00, +0x00,0x7a,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x18, +0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02,0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x02,0x00,0x01,0x14,0x9e, +0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02,0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02, +0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01, +0x0a,0x44,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00, +0x00,0x82,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x04,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x04,0x00,0x18, +0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x04,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x85,0x00,0x02,0x00,0x01,0x14,0x9e, +0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x01,0x00,0x0a,0x00,0x03,0x00,0x64,0xff,0xce,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x0a,0x00,0x03,0x01,0x2c,0xff,0xce,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0xc8,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x5d, +0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x89,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88, +0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfc,0xb5,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0c,0x00,0x07,0xfc,0xc8,0xfc,0xc7,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00, +0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0xe6,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf6,0xcd,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf6,0x8e,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08, +0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x8d,0xfc,0xb2,0x00,0x02,0x00,0x01, +0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x74,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x35,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac, +0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01, +0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xff,0x82,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05, +0xfd,0x69,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfd,0x2a,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01, +0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08, +0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e, +0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x8d,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x74,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x35,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00, +0x00,0x01,0x02,0x1c,0x02,0x32,0x00,0x03,0x00,0x0c,0x00,0x3a,0x00,0x0b,0x00,0x00,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x00,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x50,0x4f,0xae,0x4f,0xb4, +0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x4f,0xde,0x50,0x1a,0x50,0x20,0x50,0x14,0x50,0x26,0x50,0x2c,0x50,0x32,0x50,0x38,0x50,0x3e,0x50,0x44,0x50,0x4a,0x50,0x50,0x4f,0xde,0x50,0x1a,0x50,0x20,0x50,0x56, +0x50,0x5c,0x50,0x62,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0x9e,0x50,0xa4,0x50,0xaa,0x50,0xb0,0x50,0xb6,0x50,0xbc,0x50,0xc2,0x50,0xc8,0x50,0xce,0x50,0xd4,0x50,0xda,0x50,0xe0,0x50,0xe6,0x50,0xec,0x50,0xf2,0x50,0xf8,0x50,0xfe,0x51,0x04, +0x51,0x0a,0x51,0x10,0x51,0x16,0x51,0x1c,0x51,0x22,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x76,0x51,0x7c,0x51,0x82,0x51,0x76,0x51,0x7c,0x51,0x82,0x51,0x76,0x51,0x7c,0x51,0x82,0x50,0x56,0x50,0x5c,0x50,0x62,0x50,0x56,0x50,0x5c, +0x50,0x62,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x7a,0x50,0x80,0x50,0x86,0x51,0x88,0x51,0x8e,0x51,0x94,0x51,0x9a,0x51,0xa0,0x51,0xa6,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x51,0xac,0x51,0xb2,0x51,0xb8,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x51,0x40, +0x51,0x46,0x51,0x4c,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14, +0x51,0xbe,0x51,0xc4,0x51,0xca,0x51,0xd0,0x51,0xd6,0x51,0xdc,0x50,0x44,0x50,0x4a,0x50,0x50,0x51,0xbe,0x51,0xc4,0x51,0xca,0x50,0x56,0x50,0x5c,0x50,0x62,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0xb0,0x50,0xb6,0x50,0xbc,0x50,0xc2,0x50,0xc8,0x50,0xce,0x50,0xe6,0x50,0xec, +0x50,0xf2,0x50,0xf8,0x50,0xfe,0x51,0x04,0x51,0x1c,0x51,0x22,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x4f,0xde,0x50,0x1a,0x50,0x20,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0xf8,0x50,0xfe,0x51,0x04,0x51,0x9a, +0x51,0xa0,0x51,0xa6,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x51,0x64,0x51,0x6a,0x51,0x70,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85, +0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x4d,0x7c,0x00,0x00,0x4d,0x7c,0x00,0x50,0x4f,0xac,0x4f,0xb2,0x4f,0xb8,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x4f,0xd0, +0x4e,0xc2,0x4f,0xd6,0x4f,0xdc,0x4f,0xd0,0x4e,0x20,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x4f,0xee,0x4e,0x68,0x4f,0xf4,0x4f,0xfa,0x50,0x00,0x4e,0xb0,0x50,0x06,0x4e,0xd4,0x50,0x0c,0x50,0x12,0x50,0x18,0x50,0x1e,0x50,0x24,0x50,0x2a,0x50,0x2a,0x50,0x2a,0x4e,0x20,0x4e,0x20,0x4f,0xe8,0x4f,0xe8,0x50,0x30,0x50,0x36,0x4f,0xb2,0x4f,0xc4, +0x4f,0xca,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x50,0x18,0x50,0x24,0x50,0x1e,0x50,0x1e,0x50,0x1e,0x50,0x1e,0x4f,0xb2,0x4f,0xb8,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x50,0x3c,0x50,0x42,0x4f,0xdc,0x50,0x3c,0x4e,0x20,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x4f,0xf4,0x50,0x48,0x4e,0xb0,0x50,0x06,0x50,0x0c,0x50,0x12,0x50,0x18,0x50,0x1e,0x50,0x24, +0x4f,0xd0,0x4f,0xb8,0x4f,0xe2,0x50,0x06,0x50,0x36,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x50,0x24,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62, +0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4c,0x94,0x00,0x50,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a, +0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a, +0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06, +0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4b,0xb2,0x00,0x50,0x4e,0x8e,0x4e,0x94,0x4e,0x9a,0x4e,0xa0, +0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xb2,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xbe,0x4e,0xdc,0x4e,0xb2,0x4e,0xe2,0x4e,0xe8,0x4e,0xee,0x4e,0xf4,0x4e,0xe8,0x4e,0xfa,0x4f,0x00,0x4e,0xdc,0x4e,0xca,0x4f,0x06,0x4f,0x0c,0x4e,0xb2,0x4e,0xb2,0x4e,0xb2,0x4e,0xca,0x4e,0xca,0x4e,0xd6,0x4e,0xd6,0x4e,0xb2, +0x4e,0xee,0x4e,0x94,0x4e,0xa6,0x4e,0xac,0x4e,0xd0,0x4e,0xd6,0x4e,0xbe,0x4e,0xca,0x4f,0x0c,0x4f,0x06,0x4f,0x12,0x4f,0x06,0x4f,0x12,0x4e,0x94,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4f,0x18,0x4e,0xf4,0x4e,0xc4,0x4f,0x18,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x4e,0xe8,0x4e,0xf4,0x4e,0xe8,0x4f,0x00,0x4e,0xdc, +0x4e,0xca,0x4f,0x06,0x4f,0x0c,0x4f,0x1e,0x4f,0x24,0x4f,0x2a,0x4f,0x30,0x4e,0xd6,0x4f,0x36,0x4f,0x24,0x4f,0x3c,0x4f,0x42,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31, +0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x2c,0x00,0x32,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0xd0,0x00,0x0c,0x4e,0x66,0x4e,0x6c,0x4e,0x72,0x4e,0x6c,0x4e,0x6c,0x4e,0x78,0x4e,0x66,0x4e,0x7e,0x4e,0x78,0x4e,0x84,0x4e,0x78,0x4e,0x54,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a, +0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x01,0x5c,0x01,0x72,0x00,0x02,0x00,0x0c,0x00,0x1a,0x00,0x03, +0x00,0x00,0x4a,0x64,0x00,0x00,0x4a,0x64,0x00,0x01,0x4a,0x64,0x00,0x50,0x4e,0x16,0x4e,0x1c,0x4e,0x22,0x4e,0x28,0x4e,0x2e,0x4e,0x34,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4e,0x5e,0x4e,0x64,0x4e,0x6a,0x4e,0x70,0x4e,0x76,0x4e,0x7c,0x4e,0x82,0x4e,0x88,0x4e,0x5e,0x4e,0x64,0x4e,0x8e,0x4e,0x94,0x4e,0x9a, +0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0x7c,0x4e,0x16,0x4e,0x58,0x4e,0x5e,0x4e,0x64,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x4e,0xc4,0x4e,0xca,0x4e,0xe8,0x4e,0xee,0x4e,0xf4,0x4e,0xfa,0x4f,0x00,0x4e,0x58,0x4e,0x8e,0x4e,0x94,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4e,0x5e, +0x4e,0x7c,0x4e,0x5e,0x4e,0x7c,0x4e,0x5e,0x4e,0x7c,0x4e,0x8e,0x4e,0x94,0x4e,0x8e,0x4e,0x94,0x4e,0xa6,0x4e,0xac,0x4e,0xa6,0x4e,0xac,0x4e,0x5e,0x4e,0x7c,0x4e,0xd0,0x4e,0xd6,0x4e,0x22,0x4e,0x28,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0x7c,0x4e,0x8e,0x4e,0x94,0x4f,0x12, +0x4f,0x18,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x1e,0x4f,0x24,0x4e,0x2e,0x4f,0x2a,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4f,0x30,0x4f,0x36,0x4f,0x3c,0x4f,0x42,0x4e,0x82,0x4e,0x88,0x4f,0x30,0x4f,0x36,0x4e,0x8e,0x4e,0x94,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6, +0x4e,0xac,0x4e,0x16,0x4e,0x58,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xca,0x4e,0xdc,0x4e,0xe2,0x4e,0xc4,0x4e,0xca,0x4e,0xf4,0x4e,0xfa,0x4f,0x00,0x4e,0x58,0x4e,0x8e,0x4e,0x94,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4e,0x5e,0x4e,0x64,0x4e,0x2e,0x4e,0x34,0x4f,0x48,0x4e,0xa0,0x4e,0xc4,0x4e,0xca,0x4e,0xa6,0x4e,0xac,0x4e,0x3a, +0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4f,0x12,0x4f,0x18,0x00,0x02,0x00,0x03,0x0b,0xc0,0x0b,0xc0,0x00,0x00,0x0b,0xd7,0x0b,0xd7,0x00,0x01,0x0b,0xdc,0x0b,0xdc,0x00,0x02,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d, +0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x48,0xca,0x00,0x00,0x48,0xca,0x00,0x50,0x4a,0x76,0x4d,0xb8,0x4d,0xbe,0x4d,0xc4,0x4d,0xbe,0x4d,0xca,0x4b,0xc6,0x4d,0xd0,0x4b,0x8a,0x4d,0xd6,0x4b,0xc6,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8, +0x4d,0xee,0x4d,0xf4,0x4b,0xc6,0x4d,0xfa,0x4e,0x00,0x4b,0x1e,0x4e,0x06,0x4e,0x0c,0x4e,0x12,0x4e,0x18,0x4e,0x1e,0x4d,0xdc,0x4e,0x24,0x4e,0x2a,0x49,0x68,0x49,0x68,0x49,0x68,0x4d,0xdc,0x4d,0xdc,0x4d,0xe8,0x4d,0xe8,0x4e,0x30,0x4b,0x1e,0x4d,0xb8,0x4d,0xbe,0x4d,0xca,0x4d,0xe2,0x4d,0xe8,0x4d,0xee,0x4d,0xdc,0x4e,0x2a,0x4e,0x24, +0x4e,0x24,0x4e,0x24,0x4e,0x24,0x4d,0xb8,0x4d,0xbe,0x4d,0xc4,0x4d,0xbe,0x4d,0xca,0x4c,0x2c,0x4e,0x36,0x4d,0xd6,0x4c,0x2c,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8,0x4d,0xf4,0x4d,0xfa,0x4e,0x00,0x4e,0x06,0x4e,0x0c,0x4e,0x18,0x4e,0x1e,0x4d,0xdc,0x4e,0x24,0x4e,0x2a,0x4e,0x3c,0x4e,0x42,0x4e,0x48,0x4e,0x4e,0x4e,0x54,0x4e,0x5a,0x4e,0x42, +0x4e,0x60,0x4e,0x66,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16, +0x00,0x02,0x00,0x00,0x47,0xe2,0x00,0x00,0x47,0xe2,0x00,0x0c,0x4d,0x84,0x4d,0x8a,0x49,0xbe,0x4d,0x8a,0x4d,0x8a,0x4d,0x90,0x4d,0x84,0x48,0xfe,0x4d,0x90,0x4d,0x96,0x4d,0x90,0x4d,0x72,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71, +0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x47,0x70,0x00,0x50,0x49,0x20,0x4c,0x62,0x4c,0x68, +0x4c,0x6e,0x4c,0x68,0x4c,0x74,0x4a,0x70,0x4c,0x7a,0x4a,0x34,0x4c,0x80,0x4a,0x70,0x4c,0x86,0x4c,0x8c,0x4d,0x2e,0x4c,0x98,0x4c,0x9e,0x4a,0x70,0x4c,0xa4,0x4c,0xaa,0x49,0xc8,0x4c,0xb0,0x4c,0xb6,0x4c,0xbc,0x4c,0xc2,0x4c,0xc8,0x4c,0x86,0x4c,0xce,0x4c,0xd4,0x48,0x12,0x48,0x12,0x48,0x12,0x4c,0x86,0x4c,0x86,0x4d,0x2e,0x4d,0x2e, +0x4c,0xda,0x49,0xc8,0x4c,0x62,0x4c,0x68,0x4c,0x74,0x4c,0x8c,0x4d,0x2e,0x4c,0x98,0x4c,0x86,0x4c,0xd4,0x4c,0xce,0x4c,0xce,0x4c,0xce,0x4c,0xce,0x4c,0x62,0x4c,0x68,0x4c,0x6e,0x4c,0x68,0x4c,0x74,0x4a,0xd6,0x4c,0xe0,0x4c,0x80,0x4a,0xd6,0x4c,0x86,0x4c,0x8c,0x4d,0x2e,0x4c,0x9e,0x4c,0xa4,0x4c,0xaa,0x4c,0xb0,0x4c,0xb6,0x4c,0xc2, +0x4c,0xc8,0x4c,0x86,0x4c,0xce,0x4c,0xd4,0x4d,0x34,0x4c,0xec,0x4c,0xf2,0x4c,0xf8,0x4c,0xfe,0x4d,0x04,0x4c,0xec,0x4d,0x0a,0x4d,0x10,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7, +0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x2c,0x00,0x32,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x46,0x8e,0x00,0x0c,0x4c,0x58,0x4c,0x5e,0x4c,0x64,0x4c,0x5e,0x4c,0x5e,0x4c,0x6a,0x4c,0x58,0x4c,0x70,0x4c,0x6a,0x4c,0x76,0x4c,0x6a,0x4c,0x22,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x09,0x0b,0x6a, +0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0x64,0x00,0xa4,0x00,0x01,0x00,0x0c,0x00,0x4a, +0x00,0x0f,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x0c, +0x46,0x50,0x4b,0xd8,0x47,0xfa,0x4b,0xd8,0x4b,0xd8,0x4b,0xde,0x46,0x50,0x4b,0xe4,0x4b,0xde,0x4b,0xea,0x4b,0xde,0x4b,0x7e,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07,0x0b,0xd6,0x0b,0xd6,0x00,0x08, +0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c,0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07, +0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x45,0x44,0x00,0x00,0x45,0x44,0x00,0x50,0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4a,0x3e,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4a,0x3e, +0x4a,0x8c,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x47,0xaa,0x45,0x88,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6,0x4b,0xac,0x45,0x9a,0x4b,0xb2,0x4b,0xb8,0x47,0xf8,0x46,0x24,0x46,0x24,0x46,0x24,0x4a,0x8c,0x4a,0x8c,0x4b,0x82,0x4b,0x82,0x48,0x04,0x46,0x8a,0x4b,0x4c,0x4b,0x5e,0x4b,0x64,0x4b,0xbe,0x4b,0x82,0x4b,0x88, +0x4b,0xb2,0x47,0xf8,0x4b,0xb8,0x4b,0xb8,0x4b,0xb8,0x4b,0xb8,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0xc4,0x4b,0x0a,0x4b,0x76,0x4b,0xc4,0x4a,0x8c,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x94,0x47,0xaa,0x4b,0x9a,0x4b,0xa0,0x4b,0xac,0x45,0x9a,0x4b,0xb2,0x4b,0xb8,0x47,0xf8,0x4a,0x3e,0x4b,0x52,0x4b,0x7c,0x4b,0xa0, +0x46,0x8a,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x47,0xf8,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0, +0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x44,0x5c,0x00,0x00,0x44,0x5c,0x00,0x50,0x4a,0xe2,0x4a,0xe8,0x4a,0xee,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4a,0xfa,0x49,0x92,0x4b,0x00,0x4b,0x06,0x4a,0xfa,0x4b,0x0c,0x46,0x14,0x46,0x02,0x4b,0x12,0x4b,0x12,0x4a,0xa6,0x4b,0x18,0x4b,0x1e,0x4b,0x24,0x47,0x22,0x4b,0x2a,0x4a,0xbe, +0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x4e,0x4b,0x4e,0x4b,0x0c,0x4b,0x0c,0x46,0x02,0x46,0x02,0x4b,0x54,0x4b,0x5a,0x4a,0xe8,0x44,0xdc,0x4a,0xf4,0x4b,0x60,0x46,0x02,0x4b,0x12,0x4b,0x3c,0x4b,0x48,0x4b,0x42,0x4b,0x42,0x4b,0x42,0x4b,0x42,0x4a,0xe8,0x4a,0xee,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4b,0x66, +0x4b,0x6c,0x4b,0x06,0x4b,0x66,0x4b,0x0c,0x46,0x14,0x46,0x02,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x47,0x22,0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4a,0xfa,0x4a,0xee,0x46,0x14,0x4b,0x2a,0x4b,0x5a,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4b,0x48,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43, +0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x43,0x74,0x00,0x00,0x43,0x74,0x00,0x50,0x4a,0x8a,0x4a,0x90,0x4a,0x96, +0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4a,0xa2,0x4a,0xa8,0x4a,0xae,0x4a,0xb4,0x4a,0xa2,0x4a,0xba,0x4a,0xc0,0x46,0x04,0x46,0x16,0x46,0x16,0x4a,0xc6,0x43,0x82,0x4a,0xcc,0x4a,0xd2,0x45,0xb6,0x4a,0xd8,0x4a,0xde,0x45,0xfe,0x4a,0xe4,0x4a,0xea,0x4a,0xf0,0x4a,0xf6,0x4a,0xfc,0x4a,0xfc,0x4a,0xfc,0x4a,0xba,0x4a,0xba,0x46,0x04,0x46,0x04, +0x4b,0x02,0x4b,0x08,0x4a,0x90,0x4a,0x9c,0x46,0x1c,0x4b,0x0e,0x46,0x04,0x46,0x16,0x4a,0xea,0x4a,0xf6,0x4a,0xf0,0x4a,0xf0,0x4a,0xf0,0x4a,0xf0,0x4a,0x90,0x4a,0x96,0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4b,0x14,0x4a,0x72,0x4a,0xb4,0x4b,0x14,0x4a,0xba,0x4a,0xc0,0x46,0x04,0x46,0x16,0x43,0x82,0x4a,0xcc,0x45,0xb6,0x4a,0xd8,0x45,0xfe, +0x4a,0xe4,0x4a,0xea,0x4a,0xf0,0x4a,0xf6,0x4a,0xa2,0x4a,0x96,0x4a,0xc0,0x4a,0xd8,0x4b,0x08,0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4a,0xf6,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d, +0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xe0,0x01,0x0e,0x00,0x01,0x00,0x0c,0x00,0x3e,0x00,0x0c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c, +0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x50,0x48,0x90,0x43,0xe6,0x4a,0x0a,0x47,0xee,0x4a,0x10,0x4a,0x16,0x4a,0x1c,0x4a,0x22,0x4a,0x28,0x4a,0x2e,0x4a,0x1c,0x43,0x80,0x4a,0x34,0x47,0x64,0x48,0xf0,0x48,0xf0,0x4a,0x3a,0x4a,0x40,0x4a,0x46,0x4a,0x4c,0x4a,0x52,0x4a,0x58,0x4a,0x5e,0x4a,0x64,0x4a,0x6a,0x4a,0x70,0x4a,0x76, +0x4a,0x7c,0x4a,0x82,0x4a,0x82,0x4a,0x82,0x43,0x80,0x43,0x80,0x47,0x64,0x47,0x64,0x4a,0x88,0x4a,0x8e,0x43,0xe6,0x4a,0x10,0x4a,0x16,0x4a,0x94,0x47,0x64,0x48,0xf0,0x4a,0x70,0x4a,0x7c,0x4a,0x76,0x4a,0x76,0x4a,0x76,0x4a,0x76,0x43,0xe6,0x4a,0x0a,0x47,0xee,0x4a,0x10,0x4a,0x16,0x47,0x82,0x4a,0x9a,0x4a,0x2e,0x47,0x82,0x43,0x80, +0x4a,0x34,0x47,0x64,0x48,0xf0,0x4a,0x40,0x4a,0x46,0x4a,0x52,0x4a,0x58,0x4a,0x64,0x4a,0x6a,0x4a,0x70,0x4a,0x76,0x4a,0x7c,0x4a,0x1c,0x4a,0x0a,0x4a,0x34,0x4a,0x58,0x4a,0x8e,0x47,0xee,0x4a,0x10,0x4a,0x16,0x4a,0x7c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02, +0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c, +0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x41,0x56,0x00,0x00,0x41,0x56,0x00,0x0c,0x49,0x92,0x49,0x98,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f, +0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x40,0xf0,0x00,0x00,0x40,0xf0,0x00,0x0c,0x46,0x2c, +0x46,0x2c,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x46,0xf2,0x49,0x3e,0x49,0x3e,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04, +0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x40,0x8a,0x00,0x00,0x40,0x8a,0x00,0x0c,0x46,0x8c,0x46,0x8c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x48,0xde,0x47,0x1c,0x47,0x1c,0x00,0x01,0x00,0x02, +0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0xf8,0x01,0x32,0x00,0x01,0x00,0x0c,0x00,0x56,0x00,0x12, +0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24, +0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x50,0x48,0x3e,0x48,0x44,0x40,0x28,0x48,0x4a,0x40,0x28,0x48,0x50,0x40,0x88,0x48,0x56,0x48,0x5c,0x48,0x62,0x40,0x88,0x45,0x08,0x41,0x2a,0x42,0x32,0x48,0x68,0x48,0x6e,0x40,0x88,0x42,0x38,0x48,0x74,0x48,0x7a,0x48,0x80,0x46,0x28,0x40,0x76,0x48,0x86,0x48,0x8c,0x45,0x08,0x47,0x00, +0x48,0x92,0x48,0x98,0x48,0x98,0x48,0x98,0x45,0x08,0x45,0x08,0x42,0x32,0x42,0x32,0x47,0xd8,0x48,0x7a,0x48,0x44,0x40,0x28,0x48,0x50,0x41,0x2a,0x42,0x32,0x48,0x68,0x45,0x08,0x48,0x92,0x42,0x56,0x46,0xc4,0x42,0x56,0x46,0xc4,0x48,0x44,0x40,0x28,0x48,0x4a,0x40,0x28,0x48,0x50,0x48,0x9e,0x48,0xa4,0x48,0x62,0x48,0x9e,0x45,0x08, +0x41,0x2a,0x42,0x32,0x48,0x6e,0x42,0x38,0x48,0x74,0x48,0x80,0x46,0x28,0x48,0x86,0x48,0x8c,0x45,0x08,0x47,0x00,0x48,0x92,0x48,0xaa,0x48,0xb0,0x48,0xb6,0x48,0xbc,0x46,0x52,0x48,0xc2,0x48,0xc8,0x48,0xce,0x48,0xd4,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05, +0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d, +0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x3e,0xca,0x00,0x50,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0, +0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0, +0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0, +0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x12,0xf4,0x13,0x46,0x00,0x03,0x00,0x0c,0x01,0xbe,0x00,0x6c,0x00,0x00,0x46,0xe8, +0x00,0x02,0x46,0xee,0x00,0x00,0x46,0xf4,0x00,0x00,0x46,0xf4,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x00,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x06,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x0c,0x00,0x00,0x47,0x0c,0x00,0x00,0x47,0x12, +0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x18,0x00,0x00,0x47,0x1e,0x00,0x00,0x47,0x24,0x00,0x01,0x47,0x2a,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x30,0x00,0x02,0x47,0x36,0x00,0x00,0x47,0x3c,0x00,0x02,0x47,0x42,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x4e, +0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x54,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x54,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x5a,0x00,0x02,0x47,0x60,0x00,0x02,0x47,0x66,0x00,0x02,0x47,0x6c,0x00,0x02,0x3d,0xe8, +0x00,0x02,0x47,0x72,0x00,0x02,0x3d,0xe8,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x78,0x00,0x00,0x47,0x00,0x00,0x00,0x47,0x7e,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x3c,0x00,0x02,0x43,0xb2,0x00,0x00,0x46,0xfa,0x00,0x02,0x47,0x84,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x8a,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x90, +0x00,0x02,0x47,0x96,0x00,0x02,0x47,0x9c,0x00,0x00,0x47,0xa2,0x00,0x00,0x47,0xa8,0x00,0x00,0x47,0xae,0x00,0x00,0x47,0xae,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c, +0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xc0,0x00,0x00,0x46,0xfa,0x00,0x02,0x47,0xc6,0x00,0x02,0x47,0xcc,0x00,0x02,0x47,0xcc,0x00,0x02,0x47,0xcc,0x00,0x00,0x47,0xd2,0x00,0x02,0x47,0xd8,0x00,0x02,0x47,0x5a,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xba, +0x00,0x02,0x47,0xde,0x00,0x00,0x47,0xe4,0x00,0x00,0x47,0xea,0x00,0x00,0x47,0xea,0x00,0x00,0x47,0xf0,0x00,0x00,0x47,0xf0,0x00,0x00,0x47,0xf6,0x00,0x00,0x47,0xf6,0x00,0x02,0x47,0xfc,0x00,0x00,0x48,0x02,0x00,0x02,0x48,0x08,0x02,0xde,0x46,0x5c,0x46,0x62,0x46,0x68,0x46,0x6e,0x46,0x74,0x46,0x7a,0x46,0x80,0x46,0x86,0x46,0x8c, +0x46,0x92,0x46,0x98,0x46,0x9e,0x46,0xa4,0x46,0xaa,0x46,0xb0,0x46,0xa4,0x46,0xaa,0x46,0xb0,0x46,0xb6,0x46,0xbc,0x46,0xc2,0x46,0xc8,0x46,0xce,0x46,0xd4,0x46,0xda,0x46,0xe0,0x46,0xe6,0x46,0xec,0x46,0xf2,0x46,0xf8,0x46,0xfe,0x47,0x04,0x47,0x0a,0x47,0x10,0x47,0x16,0x47,0x1c,0x47,0x22,0x47,0x28,0x47,0x2e,0x46,0xb6,0x47,0x34, +0x47,0x3a,0x47,0x40,0x47,0x46,0x47,0x4c,0x47,0x52,0x46,0x74,0x47,0x58,0x47,0x40,0x47,0x46,0x47,0x5e,0x47,0x52,0x47,0x64,0x46,0x68,0x47,0x6a,0x46,0xaa,0x47,0x70,0x47,0x76,0x47,0x7c,0x47,0x82,0x46,0x92,0x47,0x46,0x47,0x88,0x47,0x8e,0x47,0x46,0x47,0x94,0x47,0x9a,0x47,0xa0,0x47,0xa6,0x47,0xac,0x46,0x98,0x47,0xb2,0x47,0xb8, +0x47,0x04,0x47,0xbe,0x46,0xfe,0x47,0x04,0x47,0xbe,0x47,0xc4,0x47,0xca,0x47,0xd0,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x47,0xe8,0x47,0xee,0x47,0xf4,0x47,0xfa,0x48,0x00,0x48,0x06,0x48,0x0c,0x47,0xca,0x47,0xf4,0x48,0x12,0x46,0x80,0x48,0x18,0x48,0x0c,0x48,0x1e,0x48,0x24,0x47,0xd6,0x47,0xdc,0x47,0x1c,0x48,0x2a,0x48,0x30,0x48,0x36, +0x48,0x3c,0x48,0x30,0x48,0x42,0x47,0xd6,0x48,0x48,0x47,0x1c,0x48,0x2a,0x48,0x4e,0x48,0x36,0x48,0x54,0x48,0x5a,0x48,0x60,0x48,0x66,0x48,0x6c,0x47,0x1c,0x48,0x72,0x48,0x6c,0x48,0x78,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x66,0x48,0x8a,0x48,0x84,0x48,0x90,0x48,0x96,0x48,0x36,0x48,0x9c,0x48,0xa2,0x48,0xa8,0x48,0xae,0x48,0xb4, +0x48,0xba,0x47,0xe8,0x48,0xc0,0x47,0x70,0x48,0xc6,0x48,0xcc,0x48,0xd2,0x48,0xd8,0x48,0xde,0x48,0xe4,0x48,0xea,0x48,0xf0,0x48,0xf6,0x48,0xfc,0x48,0x7e,0x49,0x02,0x49,0x08,0x47,0xee,0x49,0x0e,0x49,0x14,0x49,0x1a,0x46,0x68,0x49,0x14,0x49,0x1a,0x46,0x68,0x46,0x80,0x46,0x86,0x49,0x20,0x49,0x26,0x49,0x2c,0x46,0xb0,0x49,0x32, +0x49,0x38,0x47,0x3a,0x49,0x3e,0x49,0x44,0x47,0x4c,0x49,0x4a,0x49,0x50,0x47,0x88,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x62,0x49,0x5c,0x49,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x74,0x47,0xd0,0x47,0xe8,0x47,0xee,0x49,0x7a,0x49,0x80,0x49,0x5c,0x47,0xf4, +0x49,0x80,0x49,0x5c,0x47,0xf4,0x49,0x86,0x49,0x5c,0x49,0x8c,0x49,0x92,0x49,0x5c,0x47,0x70,0x48,0x2a,0x49,0x98,0x48,0x36,0x48,0x2a,0x49,0x9e,0x48,0x36,0x49,0xa4,0x49,0xaa,0x48,0x36,0x49,0xb0,0x49,0xaa,0x48,0x36,0x49,0xb6,0x49,0xbc,0x47,0x1c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x49,0xc2,0x49,0xbc,0x48,0x78,0x49,0xc8,0x49,0xbc, +0x49,0xce,0x49,0xd4,0x49,0xbc,0x48,0x78,0x49,0xd4,0x49,0xbc,0x48,0x78,0x49,0xda,0x49,0xe0,0x47,0x70,0x49,0xda,0x49,0xe0,0x47,0x70,0x49,0x80,0x49,0xe0,0x47,0xf4,0x49,0xe6,0x49,0xe0,0x47,0xf4,0x49,0xec,0x49,0xf2,0x49,0xf8,0x49,0xfe,0x4a,0x04,0x4a,0x0a,0x47,0x40,0x49,0x44,0x47,0x4c,0x4a,0x10,0x4a,0x16,0x4a,0x1c,0x48,0x72, +0x49,0xbc,0x48,0x78,0x4a,0x22,0x4a,0x28,0x4a,0x2e,0x4a,0x34,0x49,0x1a,0x46,0x68,0x49,0x14,0x4a,0x3a,0x46,0x68,0x49,0x3e,0x49,0x44,0x47,0x4c,0x4a,0x40,0x4a,0x46,0x4a,0x4c,0x4a,0x52,0x4a,0x58,0x4a,0x5e,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x4a,0x70,0x4a,0x76,0x47,0xbe,0x4a,0x34,0x49,0x1a,0x46,0x68,0x4a,0x7c,0x4a,0x82,0x4a,0x88, +0x4a,0x34,0x4a,0x8e,0x46,0x68,0x4a,0x94,0x4a,0x9a,0x4a,0x88,0x49,0x26,0x4a,0x82,0x46,0xb0,0x4a,0xa0,0x4a,0xa6,0x46,0xe6,0x4a,0xac,0x4a,0xa6,0x4a,0xb2,0x4a,0xb8,0x4a,0xbe,0x46,0xe6,0x4a,0xa0,0x4a,0xc4,0x46,0xe6,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xd0,0x49,0x50, +0x47,0x88,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4a,0xd6,0x4a,0xdc,0x48,0x36,0x47,0x10,0x47,0x16,0x47,0x1c,0x4a,0xe2,0x4a,0xe8,0x4a,0xee,0x4a,0xf4,0x4a,0xfa,0x47,0x70,0x4b,0x00,0x4b,0x06,0x48,0xa8,0x4b,0x0c,0x4b,0x12,0x47,0xbe,0x4b,0x18,0x4b,0x1e,0x49,0x0e,0x46,0x92,0x46,0x98,0x46,0x9e,0x4b,0x24, +0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x4b,0x3c,0x4a,0x6a,0x49,0x02,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x54,0x4b,0x5a,0x4b,0x60,0x4b,0x66,0x4b,0x6c,0x46,0xc2,0x49,0x80,0x4b,0x72,0x48,0x24,0x4b,0x78,0x4b,0x7e,0x4a,0xb2,0x47,0x6a,0x46,0xaa,0x4b,0x84,0x48,0x9c,0x48,0xa2,0x4b,0x8a,0x4b,0x90,0x4b,0x96,0x46,0x8c, +0x49,0xda,0x4b,0x1e,0x47,0xf4,0x4b,0x9c,0x4b,0x96,0x4b,0xa2,0x4b,0xa8,0x4b,0x1e,0x4b,0xae,0x47,0xfa,0x48,0x00,0x48,0x06,0x4a,0x34,0x4a,0x3a,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0,0x4b,0xb4,0x46,0x62,0x4b,0xba,0x47,0xc4,0x47,0xca,0x4b,0xc0,0x4b,0xc6,0x4b,0xcc,0x4b,0xd2,0x47,0xfa,0x48,0x00,0x48,0x06,0x46,0x92,0x46,0x98, +0x46,0x9e,0x46,0xa4,0x46,0xaa,0x4b,0xd8,0x48,0x0c,0x47,0xca,0x4b,0xde,0x4a,0x7c,0x4a,0xfa,0x46,0xb0,0x49,0x80,0x49,0x5c,0x47,0xf4,0x4b,0xe4,0x4b,0xea,0x47,0x1c,0x4b,0xf0,0x4b,0xf6,0x48,0x36,0x47,0x10,0x4b,0xfc,0x47,0x1c,0x48,0x2a,0x4c,0x02,0x48,0x36,0x47,0x10,0x47,0x16,0x47,0x1c,0x48,0x2a,0x48,0x4e,0x48,0x36,0x4b,0x66, +0x4c,0x08,0x47,0x3a,0x4c,0x0e,0x49,0xbc,0x47,0x1c,0x4a,0xca,0x4c,0x08,0x4c,0x14,0x49,0xc2,0x49,0xbc,0x46,0xb0,0x4a,0xca,0x4c,0x1a,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x4c,0x20,0x4c,0x26,0x46,0x68,0x4c,0x2c,0x4c,0x32,0x48,0x36,0x4c,0x20,0x4c,0x26,0x46,0x68,0x4c,0x38,0x4c,0x32,0x48,0x36,0x4c,0x3e,0x4a,0xfa,0x47,0x70, +0x4c,0x38,0x4b,0x06,0x48,0xa8,0x47,0x76,0x47,0x7c,0x4b,0x84,0x48,0xae,0x48,0xb4,0x4c,0x44,0x4a,0xf4,0x4c,0x4a,0x47,0x82,0x4c,0x50,0x4c,0x56,0x48,0xba,0x4b,0xc6,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4c,0x62,0x4c,0x68,0x47,0xbe,0x4c,0x6e,0x4b,0x1e, +0x49,0x0e,0x4c,0x74,0x4c,0x7a,0x47,0x1c,0x4c,0x80,0x4b,0x1e,0x49,0x0e,0x4c,0x86,0x4c,0x8c,0x4c,0x92,0x4c,0x98,0x4c,0x9e,0x4c,0xa4,0x4c,0xaa,0x4c,0xb0,0x4c,0xb6,0x4c,0xbc,0x4a,0x3a,0x46,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x4c,0xc2,0x4b,0x96,0x4c,0xc8,0x49,0xda,0x4b,0x1e,0x47,0xf4,0x49,0x3e,0x4c,0xce,0x47,0x4c,0x49,0xd4, +0x4b,0x1e,0x48,0x78,0x4c,0xd4,0x4a,0x9a,0x47,0xbe,0x49,0xe6,0x4c,0xda,0x47,0xf4,0x4c,0xe0,0x4a,0x9a,0x46,0xb0,0x49,0xda,0x49,0x5c,0x47,0x70,0x4c,0xe6,0x4c,0xec,0x47,0x82,0x49,0xe6,0x49,0x5c,0x47,0xf4,0x4b,0x9c,0x4c,0xf2,0x4b,0xa2,0x4b,0xa8,0x4b,0x72,0x4c,0xf8,0x49,0x32,0x4b,0x6c,0x46,0xc2,0x49,0xe6,0x4b,0x72,0x48,0x24, +0x46,0xb6,0x46,0xbc,0x4c,0xfe,0x4d,0x04,0x4d,0x0a,0x48,0x24,0x4d,0x10,0x4c,0x08,0x46,0xd4,0x4d,0x16,0x4d,0x1c,0x47,0xb2,0x4d,0x22,0x4d,0x28,0x4d,0x2e,0x4d,0x34,0x4d,0x3a,0x4d,0x40,0x4d,0x46,0x4a,0xbe,0x4a,0xee,0x4d,0x4c,0x49,0xaa,0x48,0x36,0x4d,0x52,0x4a,0xbe,0x46,0xe6,0x4d,0x58,0x49,0xaa,0x48,0x36,0x4d,0x5e,0x4a,0xc4, +0x4a,0xee,0x4d,0x64,0x49,0x9e,0x48,0x36,0x4d,0x6a,0x46,0xe0,0x4d,0x70,0x48,0x2a,0x48,0x30,0x4d,0x76,0x4d,0x7c,0x4d,0x82,0x46,0xf8,0x48,0x3c,0x4d,0x88,0x48,0x42,0x46,0xfe,0x47,0x04,0x4d,0x8e,0x47,0xd6,0x48,0x48,0x4d,0x94,0x4d,0x9a,0x4d,0xa0,0x4d,0xa6,0x47,0x10,0x47,0x16,0x4d,0xac,0x48,0x2a,0x48,0x4e,0x4d,0xb2,0x46,0xb6, +0x47,0x34,0x4c,0xfe,0x48,0x66,0x48,0x6c,0x4d,0x94,0x46,0xb6,0x47,0x34,0x4d,0xb8,0x48,0x66,0x48,0x6c,0x48,0x84,0x4d,0xbe,0x49,0x44,0x47,0x4c,0x49,0xd4,0x49,0xbc,0x48,0x78,0x4a,0xca,0x49,0x44,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x47,0x52,0x47,0x64,0x4d,0xc4,0x48,0x90,0x48,0x96,0x4d,0xca,0x4a,0xf4,0x4a,0xfa,0x47,0x70, +0x4c,0x38,0x4b,0x06,0x48,0xa8,0x4d,0xd0,0x4d,0xd6,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8,0x48,0xba,0x49,0x4a,0x49,0x50,0x47,0x88,0x49,0x92,0x49,0xe0,0x47,0x70,0x4d,0xee,0x49,0x50,0x47,0x88,0x49,0x92,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x49,0x50,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x46,0x92,0x47,0x46,0x4d,0xf4,0x47,0xe8,0x48,0xc0, +0x4d,0xfa,0x4e,0x00,0x4e,0x06,0x47,0xa6,0x4e,0x0c,0x4e,0x12,0x48,0xe4,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x49,0x56,0x4a,0x6a,0x4e,0x18,0x4e,0x1e,0x4e,0x24,0x48,0x36,0x4e,0x2a,0x4e,0x06,0x47,0xa6,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4e,0x2a,0x4e,0x06,0x47,0xa6,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4e,0x36,0x4e,0x06,0x47,0xa6,0x4e,0x3c, +0x4e,0x12,0x48,0xe4,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x4b,0x3c,0x4e,0x42,0x49,0x02,0x47,0x40,0x4e,0x48,0x47,0x4c,0x48,0x72,0x4e,0x4e,0x48,0x78,0x4e,0x54,0x4e,0x5a,0x47,0x88,0x4e,0x60,0x4e,0x66,0x47,0x70,0x4b,0xb4,0x46,0x62,0x4e,0x6c,0x4e,0x72,0x47,0xca,0x4e,0x78,0x4a,0x34,0x4a,0x8e,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0, +0x47,0xb8,0x46,0xaa,0x4e,0x7e,0x48,0x66,0x47,0xca,0x4e,0x84,0x4a,0xf4,0x4a,0xfa,0x47,0x82,0x49,0x80,0x49,0x5c,0x47,0xf4,0x4c,0xe6,0x4a,0x9a,0x47,0x82,0x49,0xe6,0x4c,0xda,0x47,0xf4,0x4a,0xa0,0x4e,0x8a,0x46,0xe6,0x48,0x2a,0x4e,0x90,0x48,0x36,0x46,0xda,0x46,0xe0,0x4e,0x96,0x48,0x2a,0x48,0x30,0x4e,0x9c,0x47,0x40,0x47,0x46, +0x4e,0xa2,0x48,0x72,0x48,0x6c,0x4e,0xa8,0x4a,0xca,0x4c,0x5c,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x46,0x92,0x47,0x46,0x4e,0xae,0x47,0xe8,0x48,0xc0,0x4e,0xb4,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x47,0xb8,0x47,0x04,0x4e,0x7e,0x48,0xfc,0x48,0x7e,0x49,0x02,0x4b,0x36,0x4b,0x12,0x47,0xbe,0x4b,0x3c, +0x4e,0x42,0x49,0x02,0x4a,0x70,0x4a,0x76,0x47,0xbe,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x47,0x76,0x47,0x7c,0x4e,0xba,0x48,0xae,0x48,0xb4,0x4e,0xc0,0x4e,0xc6,0x4e,0xcc,0x4e,0xd2,0x4e,0xd8,0x4e,0xde,0x4e,0xe4,0x46,0xa4,0x46,0xaa,0x4e,0xea,0x48,0x0c,0x47,0xca,0x49,0x7a,0x4b,0xb4,0x46,0x62,0x4e,0xf0,0x47,0xc4,0x47,0xca,0x4e,0xf6, +0x4e,0xfc,0x4f,0x02,0x46,0x7a,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x4f,0x08,0x46,0x74,0x4f,0x0e,0x47,0xd6,0x47,0xdc,0x4f,0x14,0x47,0xb8,0x46,0x74,0x4f,0x1a,0x47,0xd6,0x47,0xdc,0x4f,0x20,0x49,0x14,0x4f,0x26,0x46,0x68,0x47,0xfa,0x48,0x00,0x48,0x06,0x4f,0x2c,0x46,0x98,0x4f,0x32,0x4f,0x38,0x48,0x00,0x4e,0xa8,0x46,0xfe,0x46,0x98, +0x4f,0x3e,0x47,0xd6,0x48,0x00,0x4f,0x44,0x46,0x92,0x46,0x98,0x4f,0x4a,0x47,0xfa,0x48,0x00,0x4f,0x50,0x4f,0x56,0x46,0x98,0x4f,0x5c,0x47,0xd6,0x48,0x00,0x48,0x84,0x47,0x10,0x46,0xaa,0x48,0x84,0x4f,0x62,0x47,0xca,0x4c,0xf8,0x4f,0x08,0x46,0xaa,0x4f,0x68,0x48,0x0c,0x47,0xca,0x4b,0xde,0x4f,0x6e,0x4a,0x82,0x4f,0x74,0x4f,0x7a, +0x4f,0x80,0x48,0x18,0x4f,0x86,0x49,0x38,0x46,0xc2,0x49,0xe6,0x4b,0x72,0x48,0x24,0x4f,0x8c,0x4f,0x92,0x46,0xd4,0x4f,0x98,0x4f,0x9e,0x47,0x1c,0x46,0xc8,0x46,0xce,0x4f,0xa4,0x4f,0xaa,0x47,0xdc,0x4f,0xb0,0x4f,0x8c,0x49,0x38,0x46,0xd4,0x4f,0xb6,0x4f,0xbc,0x47,0x94,0x46,0xc8,0x46,0xce,0x4f,0xc2,0x47,0xd6,0x47,0xdc,0x48,0x84, +0x46,0xc8,0x46,0xce,0x4f,0xc8,0x47,0xd6,0x47,0xdc,0x4f,0xce,0x46,0xda,0x46,0xe0,0x4f,0xd4,0x48,0x2a,0x48,0x30,0x4d,0x76,0x4f,0xda,0x4c,0x68,0x47,0x0a,0x4f,0xe0,0x49,0x2c,0x47,0x1c,0x47,0x8e,0x47,0x04,0x4f,0xe6,0x4f,0xec,0x48,0x48,0x4e,0xb4,0x46,0xfe,0x47,0x04,0x4f,0x3e,0x4f,0xf2,0x48,0x48,0x4f,0xf8,0x47,0x76,0x47,0x16, +0x4e,0xb4,0x48,0x2a,0x48,0x4e,0x4e,0x9c,0x4f,0xfe,0x50,0x04,0x4e,0xb4,0x50,0x0a,0x4b,0xf6,0x4e,0x9c,0x4f,0x08,0x47,0x16,0x4f,0xf8,0x48,0x2a,0x48,0x4e,0x50,0x10,0x50,0x16,0x47,0x16,0x50,0x1c,0x48,0x2a,0x48,0x4e,0x50,0x22,0x50,0x28,0x50,0x2e,0x47,0x2e,0x50,0x34,0x50,0x3a,0x48,0x60,0x50,0x40,0x50,0x46,0x47,0x2e,0x50,0x34, +0x50,0x3a,0x48,0x60,0x47,0x22,0x47,0x28,0x50,0x4c,0x48,0x54,0x48,0x5a,0x50,0x52,0x50,0x58,0x49,0x38,0x50,0x5e,0x49,0xd4,0x49,0xbc,0x46,0xb0,0x50,0x64,0x47,0x34,0x50,0x6a,0x48,0x72,0x48,0x6c,0x4e,0xa8,0x50,0x64,0x47,0x34,0x50,0x70,0x48,0x72,0x48,0x6c,0x50,0x76,0x47,0x40,0x47,0x34,0x50,0x7c,0x48,0x66,0x48,0x6c,0x48,0x84, +0x4c,0x20,0x50,0x82,0x47,0x58,0x4c,0x0e,0x4a,0x6a,0x48,0x84,0x4a,0x94,0x50,0x88,0x4a,0x88,0x50,0x8e,0x4a,0x6a,0x50,0x94,0x50,0x9a,0x50,0xa0,0x46,0xb0,0x50,0xa6,0x4c,0x32,0x48,0x36,0x47,0x52,0x47,0x64,0x50,0xac,0x48,0x90,0x48,0x96,0x4e,0x9c,0x47,0x52,0x47,0x64,0x50,0xb2,0x48,0x90,0x48,0x96,0x50,0x10,0x4c,0x74,0x4a,0x82, +0x50,0xb8,0x4c,0x2c,0x4b,0x06,0x50,0xbe,0x47,0x6a,0x46,0xaa,0x4e,0xb4,0x50,0xc4,0x48,0xa2,0x50,0xca,0x4c,0x3e,0x50,0xd0,0x47,0x70,0x4c,0x38,0x50,0xd6,0x48,0xa8,0x50,0xdc,0x50,0xd0,0x4b,0xae,0x50,0xe2,0x50,0xd6,0x48,0xa8,0x50,0xe8,0x4a,0x82,0x50,0xee,0x4c,0x2c,0x4b,0x06,0x50,0xf4,0x4c,0xe6,0x4a,0x9a,0x47,0x82,0x50,0xfa, +0x4c,0x56,0x48,0xba,0x47,0x76,0x47,0x7c,0x4e,0xb4,0x48,0xae,0x48,0xb4,0x51,0x00,0x47,0x76,0x47,0x7c,0x51,0x06,0x48,0xae,0x48,0xb4,0x51,0x0c,0x47,0x76,0x47,0x7c,0x51,0x12,0x48,0xae,0x48,0xb4,0x51,0x18,0x46,0x92,0x47,0x46,0x4e,0xae,0x51,0x1e,0x48,0xc0,0x51,0x24,0x46,0x92,0x47,0x46,0x4e,0xae,0x47,0xe8,0x48,0xc0,0x4e,0xb4, +0x4f,0x56,0x47,0x46,0x4f,0x5c,0x51,0x2a,0x48,0xc0,0x50,0x1c,0x51,0x30,0x51,0x36,0x47,0x94,0x49,0x62,0x51,0x3c,0x48,0xd2,0x47,0x8e,0x47,0x46,0x4f,0xe6,0x48,0xc6,0x48,0xcc,0x51,0x42,0x51,0x48,0x51,0x4e,0x47,0xa6,0x51,0x54,0x4e,0x12,0x48,0xe4,0x47,0x9a,0x47,0xa0,0x51,0x5a,0x48,0xd8,0x48,0xde,0x51,0x60,0x51,0x66,0x51,0x6c, +0x47,0xb2,0x51,0x72,0x51,0x78,0x48,0xf6,0x51,0x66,0x4f,0x26,0x47,0xb2,0x51,0x72,0x4e,0x42,0x48,0xf6,0x4a,0x70,0x4c,0x7a,0x47,0xbe,0x4a,0x64,0x4e,0x42,0x49,0x02,0x49,0x26,0x4b,0x12,0x46,0xb0,0x4c,0x6e,0x4b,0x1e,0x51,0x7e,0x46,0xfe,0x47,0x04,0x4e,0xa8,0x49,0x08,0x47,0xee,0x51,0x84,0x46,0xfe,0x47,0x04,0x4f,0x1a,0x48,0x90, +0x47,0xee,0x51,0x8a,0x47,0xd6,0x47,0xdc,0x4f,0x44,0x51,0x90,0x51,0x96,0x48,0xba,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4b,0x3c,0x4a,0x6a,0x49,0x02,0x49,0x56,0x51,0x9c,0x47,0xd0,0x51,0xa2,0x51,0xa8,0x51,0xae,0x4b,0x54,0x51,0xb4,0x51,0xba,0x51,0xc0,0x51,0xc6,0x51,0xcc,0x51,0xd2,0x51,0xd8,0x51,0xde,0x4b,0x54,0x51,0xe4,0x51,0xba, +0x51,0xea,0x51,0xf0,0x51,0xf6,0x4b,0x54,0x51,0xb4,0x51,0xba,0x51,0xfc,0x52,0x02,0x52,0x08,0x52,0x0e,0x52,0x14,0x52,0x1a,0x52,0x20,0x52,0x26,0x4b,0x30,0x52,0x2c,0x52,0x32,0x46,0x9e,0x52,0x38,0x52,0x3e,0x52,0x44,0x52,0x4a,0x52,0x50,0x52,0x56,0x4b,0x54,0x52,0x5c,0x51,0xba,0x52,0x62,0x52,0x68,0x52,0x6e,0x52,0x74,0x52,0x7a, +0x51,0x7e,0x52,0x80,0x52,0x86,0x48,0x78,0x52,0x8c,0x52,0x92,0x52,0x98,0x52,0x9e,0x52,0xa4,0x46,0xc2,0x52,0xaa,0x52,0xb0,0x52,0xb6,0x52,0xbc,0x52,0xc2,0x52,0xc8,0x52,0xce,0x52,0xd4,0x48,0x18,0x52,0xda,0x52,0xe0,0x4a,0xb2,0x52,0xe6,0x52,0xec,0x52,0xf2,0x52,0xf8,0x52,0xfe,0x53,0x04,0x53,0x0a,0x53,0x10,0x53,0x16,0x53,0x1c, +0x53,0x22,0x53,0x04,0x53,0x28,0x53,0x2e,0x53,0x34,0x53,0x3a,0x53,0x40,0x53,0x46,0x53,0x4c,0x53,0x52,0x53,0x58,0x53,0x5e,0x53,0x64,0x53,0x6a,0x53,0x70,0x53,0x76,0x53,0x7c,0x53,0x82,0x53,0x88,0x53,0x8e,0x53,0x94,0x53,0x9a,0x53,0xa0,0x53,0xa6,0x53,0xac,0x4b,0x60,0x53,0xb2,0x53,0xb8,0x53,0xbe,0x47,0x6a,0x46,0xaa,0x47,0x70, +0x48,0x9c,0x48,0xa2,0x48,0xa8,0x53,0xc4,0x53,0xca,0x53,0xd0,0x53,0xd6,0x53,0xdc,0x53,0xe2,0x53,0xe8,0x53,0xee,0x53,0xf4,0x53,0xfa,0x54,0x00,0x54,0x06,0x54,0x0c,0x54,0x12,0x54,0x18,0x53,0xfa,0x54,0x00,0x54,0x1e,0x54,0x24,0x54,0x2a,0x54,0x30,0x54,0x36,0x54,0x3c,0x54,0x42,0x54,0x48,0x54,0x4e,0x54,0x54,0x54,0x5a,0x54,0x60, +0x54,0x66,0x46,0xfe,0x47,0x04,0x47,0xbe,0x49,0x08,0x47,0xee,0x49,0x0e,0x47,0x76,0x47,0x04,0x51,0x12,0x46,0x80,0x46,0xce,0x54,0x6c,0x54,0x72,0x54,0x78,0x54,0x7e,0x54,0x84,0x54,0x8a,0x54,0x90,0x54,0x96,0x54,0x9c,0x54,0xa2,0x54,0xa8,0x54,0xae,0x54,0xb4,0x54,0xba,0x54,0xc0,0x54,0xc6,0x54,0xcc,0x54,0xd2,0x54,0xd8,0x54,0xde, +0x54,0xe4,0x54,0xea,0x54,0xf0,0x54,0xf6,0x54,0xfc,0x55,0x02,0x55,0x08,0x55,0x0e,0x55,0x14,0x55,0x1a,0x55,0x20,0x55,0x26,0x55,0x2c,0x55,0x32,0x55,0x38,0x55,0x3e,0x55,0x44,0x4a,0x34,0x4a,0x8e,0x46,0x68,0x55,0x4a,0x49,0x5c,0x55,0x50,0x4a,0xa0,0x4a,0xa6,0x46,0xe6,0x48,0x2a,0x55,0x56,0x48,0x36,0x4a,0xca,0x4c,0x5c,0x47,0x4c, +0x49,0xc2,0x49,0xbc,0x48,0x78,0x55,0x5c,0x4c,0x5c,0x55,0x62,0x4b,0xa8,0x49,0xe0,0x4b,0xae,0x4e,0x72,0x47,0xca,0x52,0x08,0x55,0x68,0x55,0x6e,0x55,0x74,0x55,0x7a,0x55,0x80,0x55,0x86,0x46,0xb6,0x46,0xbc,0x46,0xc2,0x48,0x0c,0x48,0x1e,0x48,0x24,0x55,0x8c,0x4c,0xf2,0x55,0x92,0x4b,0xa8,0x4b,0x72,0x4c,0xf8,0x49,0x26,0x4c,0x68, +0x46,0xb0,0x55,0x98,0x49,0x2c,0x53,0x04,0x47,0x40,0x47,0x46,0x55,0x9e,0x48,0x72,0x48,0x6c,0x55,0xa4,0x4d,0xbe,0x49,0x44,0x55,0x9e,0x49,0xd4,0x49,0xbc,0x55,0xa4,0x55,0xaa,0x4c,0x68,0x4e,0x18,0x55,0xb0,0x4b,0x1e,0x55,0xb6,0x48,0x3c,0x55,0xbc,0x48,0x42,0x55,0xc2,0x55,0xc8,0x55,0xce,0x55,0xd4,0x55,0xda,0x54,0xc6,0x55,0xe0, +0x55,0xe6,0x54,0xd8,0x4b,0x66,0x4c,0xf2,0x46,0xc2,0x49,0x80,0x4b,0x72,0x48,0x24,0x46,0x92,0x55,0xec,0x46,0x9e,0x55,0xf2,0x55,0xf8,0x55,0xfe,0x4b,0x66,0x49,0x38,0x47,0x3a,0x4c,0x0e,0x49,0xbc,0x47,0x1c,0x4a,0x34,0x56,0x04,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0,0x4a,0x34,0x4a,0x3a,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0, +0x4c,0xe0,0x56,0x0a,0x46,0xb0,0x49,0xda,0x49,0x5c,0x47,0xf4,0x4a,0x7c,0x4a,0x9a,0x4a,0x88,0x49,0xda,0x49,0x5c,0x47,0x70,0x4a,0xa0,0x56,0x10,0x46,0xe6,0x48,0x2a,0x56,0x16,0x48,0x36,0x4a,0xa0,0x4a,0xbe,0x46,0xe6,0x48,0x2a,0x49,0xaa,0x48,0x36,0x4b,0x90,0x49,0x44,0x47,0x4c,0x49,0x80,0x49,0xbc,0x48,0x78,0x4a,0xca,0x49,0x44, +0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x4a,0xf4,0x4c,0x26,0x46,0xb0,0x4b,0x00,0x4c,0x32,0x48,0x36,0x4c,0x20,0x50,0xa0,0x46,0x68,0x56,0x1c,0x4c,0x32,0x48,0x36,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4b,0xa8,0x49,0xe0,0x4b,0xae,0x56,0x22,0x56,0x28,0x56,0x2e,0x56,0x34, +0x56,0x3a,0x56,0x40,0x4d,0x10,0x4c,0x08,0x46,0xd4,0x55,0x98,0x56,0x46,0x47,0x1c,0x56,0x4c,0x56,0x52,0x56,0x58,0x56,0x5e,0x56,0x64,0x56,0x6a,0x56,0x70,0x56,0x76,0x4b,0xae,0x46,0xfe,0x47,0x04,0x56,0x7c,0x49,0x08,0x47,0xee,0x56,0x82,0x49,0x14,0x49,0x1a,0x46,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x49,0x3e,0x49,0x50,0x47,0x4c, +0x49,0xd4,0x49,0xbc,0x48,0x78,0x4a,0x70,0x4f,0x92,0x47,0xbe,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x56,0x88,0x56,0x8e,0x56,0x94,0x56,0x9a,0x56,0xa0,0x56,0xa6,0x56,0x9a,0x56,0xac,0x56,0xa6,0x56,0xb2,0x56,0xb8,0x56,0xbe,0x56,0xc4,0x56,0xca,0x56,0xd0,0x56,0xd6,0x56,0xca,0x56,0xdc,0x56,0xe2,0x56,0xe8,0x56,0xee,0x56,0xe2,0x56,0xf4, +0x56,0xbe,0x56,0xfa,0x4e,0xde,0x57,0x00,0x57,0x06,0x57,0x0c,0x57,0x12,0x57,0x18,0x57,0x1e,0x57,0x24,0x57,0x2a,0x57,0x1e,0x57,0x30,0x57,0x2a,0x57,0x36,0x57,0x30,0x57,0x3c,0x57,0x42,0x57,0x48,0x57,0x4e,0x57,0x54,0x57,0x5a,0x57,0x60,0x56,0xf4,0x48,0x24,0x48,0x0c,0x48,0x1e,0x48,0x24,0x57,0x66,0x57,0x6c,0x57,0x72,0x57,0x78, +0x57,0x7e,0x57,0x84,0x57,0x8a,0x57,0x90,0x57,0x96,0x57,0x9c,0x57,0xa2,0x57,0xa8,0x57,0xae,0x57,0xb4,0x47,0x1c,0x57,0xae,0x57,0xb4,0x57,0xa8,0x57,0xba,0x57,0xc0,0x57,0xc6,0x57,0xcc,0x57,0xd2,0x48,0x18,0x57,0xd8,0x57,0xde,0x57,0xe4,0x57,0xea,0x57,0xf0,0x57,0xf6,0x57,0xfc,0x58,0x02,0x58,0x08,0x58,0x0e,0x58,0x14,0x58,0x1a, +0x58,0x20,0x58,0x26,0x58,0x2c,0x58,0x32,0x58,0x38,0x4c,0x92,0x58,0x32,0x58,0x38,0x58,0x3e,0x48,0x54,0x48,0x5a,0x58,0x44,0x48,0x66,0x48,0x6c,0x48,0x84,0x48,0x66,0x48,0x6c,0x48,0x84,0x58,0x4a,0x58,0x50,0x46,0xb0,0x58,0x56,0x58,0x5c,0x48,0x78,0x58,0x62,0x58,0x68,0x58,0x6e,0x58,0x74,0x58,0x7a,0x58,0x80,0x58,0x86,0x58,0x8c, +0x58,0x92,0x58,0x98,0x58,0x9e,0x58,0xa4,0x58,0xaa,0x58,0xb0,0x58,0xa4,0x58,0x98,0x58,0x9e,0x58,0xb6,0x58,0xbc,0x48,0x96,0x50,0x22,0x58,0xbc,0x48,0x96,0x57,0x5a,0x58,0xc2,0x58,0xc8,0x58,0xce,0x58,0xd4,0x58,0xda,0x58,0xe0,0x58,0xe6,0x58,0xec,0x58,0xf2,0x58,0xe6,0x58,0xf8,0x58,0xf2,0x48,0x9c,0x48,0xa2,0x58,0xfe,0x59,0x04, +0x59,0x0a,0x59,0x10,0x59,0x16,0x59,0x1c,0x59,0x22,0x59,0x28,0x59,0x2e,0x59,0x34,0x59,0x3a,0x59,0x40,0x59,0x46,0x59,0x4c,0x59,0x52,0x59,0x58,0x48,0xae,0x48,0xb4,0x59,0x5e,0x59,0x64,0x59,0x6a,0x59,0x70,0x59,0x76,0x59,0x7c,0x59,0x82,0x59,0x88,0x59,0x8e,0x59,0x94,0x59,0x9a,0x59,0xa0,0x48,0xd2,0x59,0xa6,0x59,0xac,0x59,0xb2, +0x59,0xb8,0x59,0xbe,0x58,0xf2,0x59,0xc4,0x59,0xca,0x59,0xd0,0x49,0x08,0x47,0xee,0x59,0xd6,0x49,0x08,0x47,0xee,0x59,0xdc,0x59,0xe2,0x47,0xee,0x56,0x40,0x59,0xe2,0x47,0xee,0x56,0x40,0x59,0xe8,0x59,0xee,0x59,0xf4,0x59,0xe8,0x59,0xfa,0x5a,0x00,0x57,0xea,0x5a,0x06,0x5a,0x0c,0x5a,0x12,0x5a,0x18,0x48,0x24,0x5a,0x1e,0x5a,0x24, +0x5a,0x2a,0x58,0xe6,0x5a,0x30,0x58,0xf2,0x5a,0x36,0x5a,0x3c,0x5a,0x42,0x5a,0x48,0x5a,0x4e,0x5a,0x54,0x5a,0x5a,0x57,0xa2,0x4d,0x40,0x5a,0x60,0x5a,0x66,0x5a,0x6c,0x5a,0x72,0x5a,0x78,0x5a,0x7e,0x5a,0x84,0x5a,0x8a,0x51,0x7e,0x47,0xd6,0x5a,0x90,0x48,0x84,0x59,0xe8,0x59,0xee,0x59,0xf4,0x59,0xe8,0x59,0xfa,0x5a,0x00,0x5a,0x96, +0x5a,0x9c,0x5a,0xa2,0x5a,0x96,0x5a,0xa8,0x5a,0xae,0x5a,0x96,0x5a,0xb4,0x5a,0xba,0x5a,0xc0,0x5a,0xc6,0x5a,0xcc,0x5a,0xd2,0x5a,0xd8,0x5a,0xde,0x5a,0xe4,0x5a,0xea,0x5a,0xf0,0x5a,0xf6,0x53,0x64,0x5a,0xfc,0x5b,0x02,0x5b,0x08,0x5b,0x0e,0x5b,0x14,0x5b,0x1a,0x5b,0x20,0x5b,0x26,0x5b,0x2c,0x5b,0x32,0x5b,0x38,0x5b,0x2c,0x5b,0x32, +0x5b,0x3e,0x5b,0x44,0x48,0x42,0x5b,0x4a,0x5b,0x44,0x46,0xe6,0x5b,0x50,0x5b,0x56,0x5b,0x5c,0x5b,0x62,0x5b,0x68,0x50,0x22,0x5b,0x6e,0x5b,0x74,0x48,0x84,0x5b,0x7a,0x5b,0x80,0x5b,0x86,0x52,0x62,0x5b,0x8c,0x52,0x6e,0x52,0x62,0x5b,0x8c,0x52,0x6e,0x5b,0x92,0x5b,0x98,0x5b,0x9e,0x5b,0xa4,0x5b,0xaa,0x5b,0xb0,0x5b,0xb6,0x5b,0xbc, +0x5b,0xc2,0x5b,0xc8,0x5b,0xce,0x5b,0xd4,0x5b,0xda,0x5b,0xe0,0x5b,0xe6,0x47,0x10,0x47,0x16,0x47,0x1c,0x5b,0xec,0x5b,0xf2,0x5b,0xf8,0x48,0x9c,0x48,0xa2,0x5b,0xfe,0x49,0x08,0x47,0xee,0x5c,0x04,0x5c,0x0a,0x5c,0x10,0x48,0xd2,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x47,0xfa,0x48,0x00,0x48,0x06,0x48,0x12,0x46,0x80,0x48,0x18,0x48,0x54, +0x48,0x5a,0x48,0x60,0x48,0x66,0x48,0x6c,0x47,0x1c,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x90,0x48,0x96,0x48,0x36,0x5c,0x16,0x5c,0x1c,0x5c,0x22,0x48,0x9c,0x48,0xa2,0x48,0xa8,0x48,0xae,0x48,0xb4,0x48,0xba,0x49,0x08,0x47,0xee,0x49,0x0e,0x5c,0x28,0x5c,0x2e,0x56,0xee,0x5c,0x34,0x5c,0x3a,0x5c,0x40,0x5c,0x46,0x5c,0x4c,0x5c,0x52, +0x5c,0x58,0x5c,0x5e,0x5c,0x64,0x5c,0x6a,0x57,0xde,0x5c,0x70,0x4a,0xd6,0x5c,0x76,0x48,0x36,0x48,0x66,0x48,0x7e,0x48,0x84,0x5c,0x7c,0x5c,0x82,0x5c,0x88,0x59,0x76,0x59,0x7c,0x59,0x82,0x47,0xd6,0x47,0xdc,0x5c,0x8e,0x47,0xfa,0x48,0x00,0x5c,0x94,0x48,0x12,0x46,0x80,0x5c,0x9a,0x48,0x0c,0x48,0x1e,0x48,0x24,0x47,0xd6,0x48,0x48, +0x5c,0xa0,0x48,0x2a,0x48,0x4e,0x4d,0x76,0x48,0x54,0x48,0x5a,0x5c,0xa6,0x48,0x66,0x48,0x6c,0x5c,0xa0,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x90,0x48,0x96,0x4d,0x76,0x48,0x9c,0x48,0xa2,0x58,0xfe,0x59,0x04,0x59,0x0a,0x59,0x10,0x48,0xc6,0x48,0xcc,0x5c,0xac,0x48,0xea,0x48,0xf0,0x5c,0xb2,0x49,0x08,0x47,0xee,0x5c,0xb8,0x47,0xc4, +0x47,0xca,0x4b,0xc0,0x48,0x66,0x48,0x8a,0x5c,0xa0,0x47,0xd6,0x5a,0x90,0x5c,0xa0,0x48,0x0c,0x47,0xca,0x4b,0xde,0x57,0x18,0x57,0x1e,0x5c,0xbe,0x57,0x2a,0x57,0x1e,0x5c,0xc4,0x48,0x0c,0x47,0xca,0x47,0xf4,0x48,0x2a,0x48,0x30,0x4d,0x76,0x5c,0xca,0x47,0xee,0x5c,0xd0,0x59,0x04,0x59,0x0a,0x59,0x10,0x47,0xe8,0x48,0xc0,0x4d,0xfa, +0x5c,0xd6,0x5c,0xdc,0x5c,0xe2,0x5c,0xe8,0x5c,0xee,0x5c,0xf4,0x5c,0xfa,0x5d,0x00,0x57,0xe4,0x46,0x6e,0x46,0x74,0x46,0x7a,0x46,0x92,0x47,0x46,0x47,0x88,0x46,0xfe,0x46,0x62,0x47,0x0a,0x46,0xa4,0x46,0xaa,0x5d,0x06,0x5d,0x0c,0x5d,0x12,0x4b,0xde,0x46,0xec,0x46,0xf2,0x46,0xf8,0x48,0x3c,0x48,0x30,0x48,0x42,0x5d,0x18,0x5d,0x1e, +0x5d,0x24,0x5d,0x2a,0x5d,0x30,0x5d,0x36,0x47,0x52,0x47,0x64,0x46,0x68,0x48,0x90,0x48,0x96,0x48,0x36,0x47,0xb8,0x47,0x04,0x47,0xbe,0x48,0xfc,0x48,0x7e,0x49,0x02,0x5d,0x3c,0x5d,0x42,0x5d,0x48,0x47,0x10,0x47,0x16,0x47,0x1c,0x5d,0x4e,0x48,0x4e,0x5d,0x54,0x47,0x10,0x47,0x16,0x47,0x1c,0x47,0x52,0x46,0x74,0x47,0x58,0x47,0x52, +0x47,0x64,0x5d,0x5a,0x5d,0x60,0x5d,0x66,0x4b,0xc0,0x5d,0x6c,0x5d,0x72,0x5d,0x78,0x48,0x66,0x5d,0x7e,0x47,0x1c,0x5d,0x84,0x5d,0x8a,0x5d,0x90,0x4a,0xd6,0x4a,0xdc,0x4d,0x76,0x00,0x02,0x00,0x0d,0x02,0x44,0x02,0x47,0x00,0x00,0x04,0x62,0x04,0x79,0x00,0x04,0x04,0x7b,0x04,0x7f,0x00,0x1c,0x04,0x82,0x04,0x84,0x00,0x21,0x04,0x87, +0x04,0x91,0x00,0x24,0x04,0x97,0x04,0x9d,0x00,0x2f,0x04,0xa0,0x04,0xac,0x00,0x36,0x05,0xfd,0x06,0x00,0x00,0x43,0x06,0x66,0x06,0x72,0x00,0x47,0x07,0x55,0x07,0x5c,0x00,0x54,0x07,0xed,0x07,0xef,0x00,0x5c,0x08,0x4c,0x08,0x4f,0x00,0x5f,0x0a,0xdb,0x0a,0xe3,0x00,0x63,0x00,0x02,0x00,0x36,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44, +0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77, +0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0x5a,0x00,0xff,0x02,0x6f,0x02,0x74,0x01,0x03,0x02,0x7f,0x02,0x86,0x01,0x09,0x02,0x9b,0x02,0x9e,0x01,0x11,0x02,0xa9,0x02,0xb0, +0x01,0x15,0x02,0xcd,0x02,0xce,0x01,0x1d,0x02,0xe1,0x02,0xea,0x01,0x1f,0x02,0xed,0x02,0xf6,0x01,0x29,0x02,0xfb,0x02,0xfe,0x01,0x33,0x03,0x01,0x03,0x10,0x01,0x37,0x03,0x13,0x03,0x2e,0x01,0x47,0x03,0x37,0x03,0x3e,0x01,0x63,0x03,0x41,0x03,0x5a,0x01,0x6b,0x03,0x5f,0x03,0x78,0x01,0x85,0x04,0xb0,0x04,0xe2,0x01,0x9f,0x04,0xe6, +0x04,0xe7,0x01,0xd2,0x04,0xe9,0x04,0xe9,0x01,0xd4,0x04,0xee,0x04,0xfe,0x01,0xd5,0x05,0x07,0x05,0x07,0x01,0xe6,0x05,0x0c,0x05,0x46,0x01,0xe7,0x05,0x4b,0x05,0x4c,0x02,0x22,0x05,0x4f,0x05,0x50,0x02,0x24,0x05,0x56,0x05,0xb2,0x02,0x26,0x06,0xac,0x06,0xad,0x02,0x83,0x07,0x3e,0x07,0x43,0x02,0x85,0x07,0xe1,0x07,0xe2,0x02,0x8b, +0x07,0xe4,0x07,0xeb,0x02,0x8d,0x07,0xf7,0x08,0x05,0x02,0x95,0x08,0x07,0x08,0x26,0x02,0xa4,0x0a,0x43,0x0a,0x43,0x02,0xc4,0x0a,0xbf,0x0a,0xcc,0x02,0xc5,0x0a,0xe5,0x0a,0xe5,0x02,0xd3,0x0a,0xe7,0x0a,0xed,0x02,0xd4,0x0a,0xf4,0x0a,0xf4,0x02,0xdb,0x0a,0xf7,0x0a,0xf7,0x02,0xdc,0x11,0x8c,0x11,0x8c,0x02,0xdd,0x00,0x01,0x00,0x98, +0x00,0xc0,0x00,0x02,0x00,0x0c,0x00,0x2e,0x00,0x08,0x00,0x00,0x4a,0xba,0x00,0x00,0x4a,0xc0,0x00,0x01,0x4a,0xc6,0x00,0x00,0x4a,0xcc,0x00,0x01,0x4a,0xc6,0x00,0x00,0x4a,0xc6,0x00,0x01,0x4a,0xc6,0x00,0x01,0x4a,0xc6,0x00,0x1a,0x4a,0xb0,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x4a,0xc2,0x4a,0xc2,0x4a,0xc8,0x4a,0xc8,0x4a,0xce,0x4a,0xce, +0x4a,0xd4,0x4a,0xda,0x4a,0xe0,0x4a,0xe6,0x4a,0xec,0x4a,0xf2,0x4a,0xf8,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x4b,0x10,0x40,0xb4,0x40,0xb4,0x4b,0x16,0x4b,0x1c,0x4b,0x22,0x4b,0x22,0x4b,0x28,0x4b,0x2e,0x4b,0x34,0x4b,0x3a,0x4b,0x40,0x4b,0x40,0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x5e,0x4b,0x64,0x4b,0x6a, +0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0x22,0x4b,0x22,0x00,0x02,0x00,0x06,0x02,0x46,0x02,0x47,0x00,0x00,0x04,0x63,0x04,0x64,0x00,0x02,0x04,0x66,0x04,0x66,0x00,0x04,0x04,0x6b,0x04,0x6b,0x00,0x05,0x04,0x6e,0x04,0x6e,0x00,0x06,0x04,0x70,0x04,0x70,0x00,0x07,0x00,0x02,0x00,0x12, +0x01,0xdb,0x01,0xdb,0x00,0x00,0x01,0xe5,0x01,0xe5,0x00,0x01,0x01,0xe7,0x01,0xe7,0x00,0x02,0x01,0xec,0x01,0xec,0x00,0x03,0x01,0xef,0x01,0xf0,0x00,0x04,0x01,0xf5,0x01,0xf5,0x00,0x06,0x01,0xfa,0x01,0xfa,0x00,0x07,0x02,0x02,0x02,0x02,0x00,0x08,0x02,0x04,0x02,0x07,0x00,0x09,0x02,0x0c,0x02,0x0c,0x00,0x0d,0x02,0x0f,0x02,0x10, +0x00,0x0e,0x02,0x15,0x02,0x15,0x00,0x10,0x02,0x1a,0x02,0x1a,0x00,0x11,0x02,0x22,0x02,0x22,0x00,0x12,0x02,0x24,0x02,0x27,0x00,0x13,0x02,0x31,0x02,0x31,0x00,0x17,0x02,0xcd,0x02,0xcd,0x00,0x18,0x05,0x07,0x05,0x07,0x00,0x19,0x00,0x01,0x00,0xd8,0x00,0xde,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x92,0x00,0x62, +0x4a,0x92,0x4a,0x98,0x4a,0x9e,0x4a,0xa4,0x4a,0xaa,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x4a,0xc2,0x4a,0xc8,0x4a,0xce,0x4a,0xd4,0x4a,0xda,0x4a,0xe0,0x4a,0xe6,0x4a,0xec,0x4a,0xe6,0x4a,0xf2,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x4b,0x10,0x42,0x52,0x4b,0x16,0x4b,0x1c,0x4b,0x22,0x4b,0x28,0x4b,0x2e,0x4b,0x34,0x4b,0x3a,0x4b,0x40, +0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6,0x4b,0xac,0x4b,0xb2,0x4b,0xb8,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x3a,0x4b,0x3a,0x4b,0x3a,0x4b,0x3a,0x4b,0x52,0x4b,0x52, +0x4b,0x52,0x4b,0x52,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x9a,0x4b,0x9a,0x4b,0x9a,0x4b,0x9a,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xb2,0x4b,0xd0,0x4b,0xb2,0x4b,0xd6,0x4b,0xdc,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4b,0xf4,0x4b,0xfa,0x4c,0x00,0x4c,0x06,0x4c,0x0c,0x4c,0x12,0x4c,0x18,0x4b,0x76,0x4c,0x1e,0x4c,0x24, +0x4c,0x2a,0x4c,0x30,0x00,0x01,0x00,0x01,0x06,0x9b,0x00,0x02,0x00,0x16,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x69,0x00,0x6e,0x00,0x34,0x00,0x70,0x00,0x77,0x00,0x3a,0x00,0x79,0x00,0x81,0x00,0x42,0x00,0xa0,0x00,0xa1,0x00,0x4b,0x00,0xb1,0x00,0xb1,0x00,0x4d,0x00,0xba,0x00,0xba,0x00,0x4e,0x00,0xd6, +0x00,0xd6,0x00,0x4f,0x00,0xeb,0x00,0xeb,0x00,0x50,0x05,0x07,0x05,0x07,0x00,0x51,0x05,0x56,0x05,0x58,0x00,0x52,0x05,0x5a,0x05,0x5a,0x00,0x55,0x05,0x5e,0x05,0x5e,0x00,0x56,0x05,0x60,0x05,0x61,0x00,0x57,0x05,0x63,0x05,0x63,0x00,0x59,0x05,0x69,0x05,0x69,0x00,0x5a,0x05,0x6d,0x05,0x6d,0x00,0x5b,0x05,0x6f,0x05,0x6f,0x00,0x5c, +0x05,0x7a,0x05,0x7b,0x00,0x5d,0x05,0x8e,0x05,0x8f,0x00,0x5f,0x05,0x91,0x05,0x91,0x00,0x61,0x00,0x01,0x00,0x9c,0x00,0xa6,0x00,0x01,0x00,0x0c,0x00,0x22,0x00,0x05,0x00,0x00,0x4a,0xd6,0x00,0x00,0x4a,0xd6,0x00,0x00,0x26,0xc4,0x00,0x00,0x4a,0xdc,0x00,0x00,0x4a,0xe2,0x00,0x3c,0x4a,0xd2,0x4a,0xd8,0x4a,0xde,0x4a,0xe4,0x4a,0xea, +0x4a,0xf0,0x4a,0xf6,0x4a,0xfc,0x4b,0x02,0x4b,0x08,0x4b,0x0e,0x4b,0x14,0x4b,0x1a,0x4b,0x20,0x4b,0x26,0x4b,0x2c,0x4b,0x32,0x4b,0x2c,0x4b,0x38,0x4b,0x3e,0x4b,0x44,0x4b,0x4a,0x4b,0x50,0x4b,0x56,0x4b,0x5c,0x4b,0x62,0x4b,0x68,0x4b,0x6e,0x4b,0x74,0x4b,0x7a,0x4b,0x80,0x4b,0x86,0x4b,0x8c,0x4b,0x92,0x4b,0x98,0x4b,0x9e,0x4b,0xa4, +0x4b,0xaa,0x4b,0xb0,0x4b,0xb6,0x4b,0xbc,0x4b,0xc2,0x4b,0xc8,0x4b,0xce,0x4b,0xd4,0x4b,0xda,0x4b,0xe0,0x4b,0xe6,0x4b,0xec,0x4b,0xf2,0x4b,0xf8,0x4b,0xfe,0x4c,0x04,0x4c,0x0a,0x4c,0x10,0x4c,0x16,0x4c,0x1c,0x4c,0x22,0x4c,0x28,0x4c,0x2e,0x00,0x02,0x00,0x01,0x04,0x92,0x04,0x96,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x24,0x00,0x3d, +0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x79,0x00,0x79,0x00,0x34,0x00,0xd0,0x00,0xd0,0x00,0x35,0x00,0xe4,0x00,0xe4,0x00,0x36,0x00,0xe6,0x00,0xe6,0x00,0x37,0x00,0xe9,0x00,0xe9,0x00,0x38,0x05,0x83,0x05,0x83,0x00,0x39,0x05,0x88,0x05,0x88,0x00,0x3a,0x05,0x97,0x05,0x97,0x00,0x3b,0x00,0x01,0x0c,0xf8,0x0d,0x0e,0x00,0x02, +0x00,0x0c,0x00,0x2a,0x00,0x07,0x00,0x00,0x4b,0x64,0x00,0x00,0x4b,0x6a,0x00,0x01,0x2f,0x68,0x00,0x00,0x4b,0x6a,0x00,0x00,0x4b,0x6a,0x00,0x01,0x4b,0x70,0x00,0x01,0x2f,0x8c,0x03,0x33,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6, +0x4b,0xac,0x4b,0xb2,0x4b,0xb8,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xd0,0x4b,0xd6,0x4b,0xdc,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4b,0xf4,0x4b,0xfa,0x4c,0x00,0x4c,0x06,0x4c,0x0c,0x4c,0x12,0x4c,0x18,0x4c,0x1e,0x4c,0x24,0x4c,0x2a,0x4c,0x30,0x4c,0x36,0x4c,0x3c,0x4c,0x42,0x4c,0x48,0x4c,0x4e,0x4c,0x54,0x4c,0x5a,0x4c,0x60,0x4c,0x66, +0x4c,0x6c,0x4c,0x72,0x4c,0x78,0x4c,0x7e,0x4c,0x84,0x4c,0x8a,0x4c,0x90,0x4c,0x96,0x4c,0x9c,0x4c,0xa2,0x4c,0xa8,0x4c,0xae,0x4c,0xb4,0x4c,0xba,0x4c,0xc0,0x4c,0xc6,0x4c,0xcc,0x4c,0xd2,0x4c,0xb4,0x4c,0xba,0x4c,0xd8,0x4c,0xde,0x4c,0xe4,0x4c,0xea,0x4c,0xe4,0x4c,0xea,0x4c,0xd8,0x4c,0xde,0x4c,0xf0,0x4c,0xf6,0x4c,0xfc,0x4d,0x02, +0x4c,0xd8,0x4c,0xde,0x4d,0x08,0x4d,0x0e,0x4c,0x9c,0x4c,0xa2,0x4c,0xb4,0x4c,0xba,0x4d,0x14,0x4d,0x1a,0x4d,0x20,0x4d,0x26,0x4d,0x2c,0x4d,0x32,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x4d,0x4a,0x4d,0x50,0x4d,0x56,0x4d,0x5c,0x4d,0x62,0x4d,0x68,0x4d,0x6e,0x4d,0x74,0x4d,0x7a,0x4d,0x80,0x4b,0x5e,0x4d,0x80,0x4b,0x5e,0x4b,0x70,0x4b,0x76, +0x4b,0x88,0x4b,0x8e,0x4d,0x86,0x4b,0xfa,0x4d,0x8c,0x4c,0x06,0x4d,0x92,0x4c,0x4e,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0xa8,0x4c,0xae,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4d,0x98,0x4d,0x9e, +0x4d,0xa4,0x4d,0xaa,0x4d,0xb0,0x4d,0xb6,0x4d,0xbc,0x4d,0xc2,0x4c,0xd8,0x4c,0xde,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0xc8,0x4d,0xce,0x4d,0xd4,0x4d,0xda,0x4c,0x00,0x4c,0x06, +0x4d,0xe0,0x4d,0xe6,0x4d,0xec,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4d,0x80,0x4b,0x5e,0x4d,0x80,0x4b,0x5e,0x4d,0x8c,0x4c,0x06,0x4e,0x04,0x4e,0x0a,0x4e,0x10,0x4e,0x16,0x4d,0x68,0x4d,0x6e,0x4c,0x78,0x4c,0x7e,0x4d,0x80,0x4b,0x5e,0x4e,0x1c,0x4b,0x8e,0x4d,0x80,0x4b,0x5e,0x4e,0x1c,0x4b,0x8e,0x4e,0x1c,0x4b,0x8e,0x4e,0x22,0x4e,0x28, +0x4e,0x2e,0x4e,0x34,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4b,0xbe,0x4d,0x8c,0x4c,0x06,0x4d,0x8c,0x4c,0x06,0x4d,0x8c,0x4c,0x06,0x4d,0x92,0x4c,0x4e,0x4d,0x92,0x4c,0x4e,0x4d,0x92,0x4c,0x4e,0x4c,0xf0,0x4c,0xf6,0x4b,0xdc,0x4b,0xe2,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a, +0x4b,0x7c,0x4b,0x82,0x4e,0x64,0x4e,0x6a,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4c,0x0c,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4b,0xb8,0x4b,0xbe,0x4c,0x30,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4b,0x70,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4e,0x82,0x4e,0x88, +0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4e,0x8e,0x4b,0x82,0x4e,0x94,0x4e,0x9a,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0xa0,0x4b,0xe2,0x4e,0xa6,0x4e,0xac,0x4b,0xdc,0x4b,0xe2,0x4e,0xb2,0x4e,0xb8,0x4b,0xdc,0x4b,0xe2, +0x4e,0xbe,0x4e,0xc4,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a,0x4e,0xd0,0x4e,0xd6,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x3c,0x4c,0x42,0x4e,0xdc,0x4e,0xe2,0x4e,0xe8,0x4c,0x42, +0x4e,0xee,0x4e,0xf4,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4e,0xfa,0x4f,0x00,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae, +0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4b,0xa0,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde, +0x4f,0x2a,0x4f,0x30,0x4c,0xd8,0x4c,0xde,0x4f,0x36,0x4f,0x3c,0x4f,0x42,0x4f,0x48,0x4f,0x4e,0x4f,0x54,0x4f,0x5a,0x4f,0x60,0x4f,0x66,0x4f,0x6c,0x4f,0x72,0x4f,0x78,0x4b,0xb8,0x4b,0xbe,0x4c,0xe4,0x4c,0xea,0x4f,0x7e,0x4f,0x84,0x4f,0x4e,0x4f,0x54,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4c,0xd8,0x4c,0xde,0x4b,0xdc,0x4b,0xe2, +0x4d,0x98,0x4d,0x9e,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4c,0x24,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4d,0x92,0x4c,0x4e, +0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x60,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4f,0x8a,0x4f,0x90,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56, +0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4f,0x9c,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4f,0xb4,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xcc,0x4f,0xd2,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96, +0x4d,0x80,0x4b,0x5e,0x4f,0xd8,0x4f,0xde,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96, +0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x4e,0x1c,0x4b,0x8e,0x50,0x1a,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6, +0x4e,0x46,0x4b,0xbe,0x50,0x20,0x50,0x26,0x4b,0xb8,0x4b,0xbe,0x4c,0xe4,0x4c,0xea,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4e,0x82,0x4e,0x88,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x50,0x2c,0x4d,0x0e, +0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4f,0x9c,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e, +0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4c,0x78,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e, +0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x50,0x3e,0x50,0x44,0x50,0x4a,0x50,0x50,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x50,0x56,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4b,0x64,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4b,0x64,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae, +0x4e,0x8e,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6, +0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x50,0x5c,0x4b,0x9a,0x50,0x62,0x4c,0xd2,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4f,0x1e,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde,0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde, +0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x4b,0xd6,0x4f,0x24,0x4c,0xde,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4b,0xdc,0x4b,0xe2,0x50,0x9e,0x50,0xa4,0x4e,0xa0,0x4b,0xe2,0x50,0xaa,0x50,0xb0, +0x4b,0xdc,0x4b,0xe2,0x50,0xb6,0x50,0xbc,0x4b,0xdc,0x4b,0xe2,0x4e,0xa6,0x4e,0xac,0x50,0xc2,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x50,0xc2,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x4b,0xe8,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde, +0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x50,0x2c,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x50,0xc8,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x50,0xc8,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a, +0x4c,0x24,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4c,0x24,0x4c,0x2a,0x50,0xce,0x50,0xd4,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x30,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x50,0xda,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x50,0xda,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26, +0x4e,0xe8,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x50,0xe0,0x50,0xe6,0x4c,0x3c,0x4c,0x42,0x50,0xec,0x50,0xf2,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e, +0x4d,0x92,0x4c,0x4e,0x50,0xf8,0x4d,0x3e,0x50,0xfe,0x4c,0x5a,0x4d,0x44,0x4d,0x4a,0x4c,0x54,0x4c,0x5a,0x4d,0x44,0x4d,0x4a,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4c,0x60,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x51,0x04,0x4c,0x72,0x4d,0x5c,0x4d,0x62,0x51,0x04,0x4c,0x72,0x4d,0x5c,0x4d,0x62,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e, +0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0xd8,0x4c,0xde,0x4d,0x2c,0x4d,0x32,0x4d,0x50,0x4d,0x56,0x4d,0x68,0x4d,0x6e,0x4c,0x90,0x4c,0x96,0x51,0x0a,0x4f,0x90,0x4c,0x9c,0x4c,0xa2,0x51,0x10,0x51,0x16,0x51,0x1c,0x51,0x22,0x4c,0x9c,0x4c,0xa2, +0x51,0x1c,0x51,0x22,0x4c,0x9c,0x4c,0xa2,0x4e,0x82,0x4e,0x88,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x4b,0x7c,0x4b,0x82,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x34,0x51,0x3a,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x76,0x4b,0x94,0x4b,0x9a,0x51,0x7c,0x51,0x82,0x4c,0x54,0x4c,0x5a,0x51,0x88,0x51,0x8e, +0x51,0x94,0x51,0x9a,0x4d,0xbc,0x4d,0xc2,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x51,0xa0,0x51,0xa6,0x51,0xac,0x51,0xb2,0x51,0xb8,0x51,0xbe,0x51,0x28,0x51,0x2e,0x4c,0xd8,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x51,0xc4,0x51,0xca,0x51,0xd0,0x51,0xd6,0x51,0xdc,0x51,0xe2,0x4c,0x9c,0x4c,0xa2,0x51,0xe8,0x51,0xee,0x51,0xf4,0x51,0xfa, +0x52,0x00,0x52,0x06,0x52,0x0c,0x52,0x12,0x4e,0xbe,0x4e,0xc4,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x52,0x18,0x52,0x1e,0x52,0x24,0x52,0x2a,0x52,0x30,0x52,0x36,0x4c,0x78,0x4c,0x7e,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x52,0x3c,0x52,0x42,0x52,0x48,0x52,0x4e,0x52,0x54,0x52,0x5a, +0x52,0x60,0x52,0x66,0x52,0x6c,0x52,0x72,0x52,0x78,0x52,0x7e,0x52,0x84,0x52,0x8a,0x52,0x90,0x52,0x96,0x52,0x9c,0x52,0xa2,0x52,0xa8,0x52,0xae,0x52,0xb4,0x52,0xba,0x52,0xc0,0x52,0xc6,0x52,0xcc,0x52,0xd2,0x52,0xd8,0x52,0xde,0x52,0xe4,0x52,0xea,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6,0x52,0xfc,0x53,0x02,0x53,0x08,0x53,0x0e, +0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x50,0x4a,0x50,0x50,0x53,0x14,0x4d,0xda,0x53,0x1a,0x53,0x20,0x53,0x26,0x53,0x2c,0x53,0x32,0x53,0x38,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x50,0x98,0x4b,0xd6,0x4f,0x24,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06, +0x4d,0x08,0x4d,0x0e,0x53,0x3e,0x52,0x42,0x53,0x44,0x53,0x4a,0x4d,0xbc,0x4d,0xc2,0x53,0x50,0x52,0x8a,0x53,0x56,0x53,0x5c,0x53,0x62,0x53,0x68,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x53,0x6e,0x53,0x74,0x53,0x7a,0x53,0x80,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6,0x4d,0x80,0x4b,0x5e, +0x52,0xf0,0x52,0xf6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x46,0x4b,0xbe,0x53,0x86,0x53,0x8c,0x53,0x92,0x53,0x98,0x53,0x9e,0x53,0xa4,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a, +0x53,0xaa,0x53,0xb0,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x4d,0x4a,0x53,0xb6,0x53,0xbc,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde,0x53,0x7a,0x53,0x80,0x51,0x10,0x51,0x16,0x53,0xc2,0x53,0xc8,0x51,0xdc,0x51,0xe2,0x53,0xce,0x53,0xd4,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6, +0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4d,0xf8,0x4d,0xfe,0x4c,0xb4,0x4c,0xba,0x4c,0x9c,0x4c,0xa2,0x53,0xda,0x53,0xe0,0x53,0xe6,0x53,0xec,0x53,0xf2,0x53,0xf8,0x53,0xfe,0x54,0x04,0x53,0xfe,0x54,0x04,0x50,0x4a,0x50,0x50,0x54,0x0a,0x54,0x10,0x54,0x16,0x54,0x1c,0x54,0x22,0x54,0x28, +0x54,0x2e,0x54,0x34,0x4c,0x3c,0x4c,0x42,0x54,0x3a,0x54,0x40,0x53,0xfe,0x54,0x04,0x4c,0xb4,0x4c,0xba,0x54,0x46,0x54,0x4c,0x54,0x52,0x54,0x58,0x53,0xce,0x53,0xd4,0x4d,0x38,0x4d,0x3e,0x4c,0xd8,0x4c,0xde,0x4c,0xd8,0x4c,0xde,0x54,0x5e,0x54,0x64,0x54,0x6a,0x54,0x70,0x54,0x76,0x54,0x7c,0x54,0x82,0x54,0x88,0x54,0x22,0x54,0x28, +0x54,0x8e,0x54,0x94,0x54,0x9a,0x54,0xa0,0x4c,0xfc,0x4d,0x02,0x4c,0xfc,0x4d,0x02,0x4c,0xfc,0x4d,0x02,0x4c,0xd8,0x4c,0xde,0x54,0xa6,0x54,0xac,0x54,0xb2,0x54,0xb8,0x4d,0x08,0x4d,0x0e,0x54,0xbe,0x54,0xc4,0x54,0xca,0x54,0xd0,0x54,0xd6,0x54,0xdc,0x54,0xe2,0x4f,0x6c,0x54,0xe2,0x4f,0x6c,0x54,0xe8,0x54,0xee,0x4d,0x14,0x4d,0x1a, +0x4d,0x14,0x4d,0x1a,0x54,0xf4,0x54,0xfa,0x55,0x00,0x55,0x06,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x55,0x0c,0x55,0x12,0x55,0x18,0x55,0x1e,0x55,0x24,0x55,0x2a,0x55,0x30,0x55,0x36,0x55,0x3c,0x55,0x42,0x55,0x3c,0x55,0x42,0x4d,0x2c,0x4d,0x32,0x55,0x48,0x55,0x4e,0x51,0xe8,0x51,0xee,0x52,0x78,0x52,0x7e,0x52,0x54,0x52,0x5a, +0x4d,0x50,0x4d,0x56,0x55,0x54,0x55,0x5a,0x55,0x60,0x55,0x66,0x55,0x6c,0x55,0x72,0x55,0x78,0x55,0x7e,0x53,0x44,0x53,0x4a,0x55,0x84,0x55,0x8a,0x55,0x90,0x55,0x96,0x55,0x9c,0x55,0xa2,0x55,0xa8,0x55,0xae,0x55,0xb4,0x55,0xba,0x55,0xc0,0x55,0xc6,0x55,0xcc,0x55,0xd2,0x55,0xd8,0x55,0xde,0x4c,0x9c,0x4c,0xa2,0x4d,0x38,0x4d,0x3e, +0x55,0xe4,0x4e,0x40,0x55,0xea,0x55,0xf0,0x55,0xf6,0x55,0xfc,0x53,0xfe,0x54,0x04,0x55,0x90,0x55,0x96,0x55,0x9c,0x55,0xa2,0x56,0x02,0x56,0x08,0x56,0x0e,0x56,0x14,0x56,0x1a,0x56,0x20,0x56,0x26,0x56,0x2c,0x56,0x32,0x56,0x38,0x4c,0x00,0x4c,0x06,0x56,0x3e,0x56,0x44,0x4d,0x08,0x4d,0x0e,0x4c,0x78,0x4c,0x7e,0x56,0x4a,0x56,0x50, +0x55,0xcc,0x55,0xd2,0x4c,0xf0,0x4c,0xf6,0x54,0x5e,0x54,0x64,0x56,0x56,0x56,0x5c,0x55,0xea,0x55,0xf0,0x56,0x62,0x56,0x68,0x55,0x84,0x55,0x8a,0x52,0x78,0x52,0x7e,0x53,0x7a,0x53,0x80,0x56,0x6e,0x56,0x74,0x56,0x6e,0x56,0x74,0x4b,0x58,0x4b,0x5e,0x56,0x7a,0x56,0x80,0x56,0x86,0x56,0x8c,0x4b,0xdc,0x4b,0xe2,0x56,0x92,0x56,0x98, +0x4d,0x20,0x4d,0x26,0x4d,0x74,0x4d,0x7a,0x56,0x9e,0x56,0xa4,0x4c,0x9c,0x4c,0xa2,0x56,0xaa,0x56,0xb0,0x4c,0xcc,0x4c,0xd2,0x52,0xd8,0x52,0xde,0x56,0xb6,0x56,0xbc,0x4c,0x9c,0x4c,0xa2,0x4d,0x14,0x4d,0x1a,0x54,0xf4,0x54,0xfa,0x56,0xc2,0x56,0xc8,0x4d,0x2c,0x4d,0x32,0x4d,0x74,0x4d,0x7a,0x53,0xda,0x53,0xe0,0x56,0xce,0x56,0xd4, +0x56,0xda,0x56,0xe0,0x56,0xe6,0x56,0xec,0x56,0xf2,0x56,0xf8,0x56,0xfe,0x57,0x04,0x4c,0x48,0x4c,0x4e,0x57,0x0a,0x57,0x10,0x57,0x16,0x57,0x1c,0x4c,0x9c,0x4c,0xa2,0x4f,0xa8,0x4f,0xae,0x4c,0xcc,0x4c,0xd2,0x57,0x22,0x57,0x28,0x57,0x2e,0x57,0x34,0x57,0x3a,0x57,0x40,0x57,0x46,0x57,0x4c,0x57,0x52,0x57,0x58,0x4c,0x9c,0x4c,0xa2, +0x4d,0x14,0x4d,0x1a,0x57,0x5e,0x57,0x64,0x57,0x6a,0x57,0x70,0x57,0x76,0x57,0x7c,0x4d,0x5c,0x4d,0x62,0x4d,0x74,0x4d,0x7a,0x57,0x82,0x57,0x88,0x57,0x8e,0x57,0x94,0x53,0xfe,0x54,0x04,0x57,0x9a,0x57,0xa0,0x4c,0x0c,0x4c,0x12,0x57,0xa6,0x57,0xac,0x57,0xb2,0x57,0xb8,0x57,0xbe,0x57,0xc4,0x53,0xe6,0x53,0xec,0x55,0x18,0x55,0x1e, +0x57,0xca,0x57,0xd0,0x53,0x44,0x53,0x4a,0x57,0xd6,0x57,0xdc,0x54,0x16,0x54,0x1c,0x4d,0xec,0x4d,0xf2,0x57,0xe2,0x57,0xe8,0x57,0xee,0x57,0xf4,0x4c,0x3c,0x4c,0x42,0x4b,0x64,0x4b,0x6a,0x55,0x0c,0x55,0x12,0x4b,0xb8,0x4b,0xbe,0x57,0xfa,0x58,0x00,0x53,0x32,0x53,0x38,0x56,0x92,0x56,0x98,0x58,0x06,0x58,0x0c,0x58,0x12,0x58,0x18, +0x51,0xac,0x51,0xb2,0x58,0x1e,0x58,0x24,0x58,0x2a,0x58,0x30,0x58,0x36,0x58,0x3c,0x58,0x42,0x58,0x48,0x51,0xdc,0x51,0xe2,0x56,0x92,0x56,0x98,0x58,0x4e,0x58,0x54,0x58,0x5a,0x58,0x60,0x58,0x66,0x58,0x6c,0x58,0x72,0x58,0x78,0x4c,0xf0,0x4c,0xea,0x00,0x02,0x00,0x03,0x04,0xad,0x04,0xaf,0x00,0x00,0x07,0x5d,0x07,0x5f,0x00,0x03, +0x07,0xf0,0x07,0xf0,0x00,0x06,0x00,0x02,0x00,0x2a,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f, +0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce, +0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46,0x02,0x3c,0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e, +0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf,0x0a,0xcc,0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31, +0x11,0x8c,0x11,0x8c,0x03,0x32,0x00,0x01,0x00,0xa4,0x00,0xaa,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x8e,0x00,0x48,0x4a,0x8e,0x4a,0x94,0x4a,0x9a,0x4a,0xa0,0x4a,0xa6,0x4a,0xa6,0x4a,0xac,0x4a,0xb2,0x4a,0xb8,0x4a,0xbe,0x4a,0xc4,0x4a,0xca,0x4a,0xd0,0x4a,0xd6,0x4a,0xdc,0x4a,0xe2,0x4a,0xdc,0x4a,0xe8,0x4a,0xee, +0x4a,0xf4,0x4a,0xfa,0x4b,0x00,0x4b,0x06,0x3a,0xbc,0x3a,0xbc,0x3a,0xbc,0x4b,0x0c,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x4b,0x24,0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x54,0x4b,0x5a,0x4b,0x60,0x4b,0x66,0x4b,0x6c,0x4b,0x72,0x4b,0x78,0x4b,0x7e,0x4b,0x84,0x4b,0x8a,0x4b,0x90,0x4b,0x96,0x4b,0x9c, +0x4b,0xa2,0x4b,0x60,0x4b,0x60,0x4b,0x60,0x4b,0x84,0x4b,0x84,0x4a,0xdc,0x4a,0xdc,0x4a,0xdc,0x4a,0xfa,0x4a,0xfa,0x4a,0xfa,0x4b,0x84,0x4a,0xdc,0x4b,0x60,0x4a,0xdc,0x4b,0x60,0x4a,0xfa,0x4b,0x84,0x4a,0xfa,0x4b,0x84,0x00,0x01,0x00,0x01,0x04,0x7a,0x00,0x02,0x00,0x0b,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a, +0x00,0x79,0x00,0x7a,0x00,0x34,0x00,0x7d,0x00,0x7f,0x00,0x36,0x00,0xaf,0x00,0xaf,0x00,0x39,0x00,0xd0,0x00,0xd0,0x00,0x3a,0x00,0xd2,0x00,0xd3,0x00,0x3b,0x00,0xd5,0x00,0xd5,0x00,0x3d,0x01,0x78,0x01,0x79,0x00,0x3e,0x02,0x83,0x02,0x86,0x00,0x40,0x02,0x9b,0x02,0x9e,0x00,0x44,0x00,0x01,0x00,0x58,0x00,0x5e,0x00,0x01,0x00,0x0c, +0x00,0x12,0x00,0x01,0x00,0x00,0x1e,0xc0,0x00,0x22,0x4a,0xb8,0x4a,0xbe,0x17,0x16,0x2b,0x02,0x19,0xec,0x4a,0xc4,0x18,0x30,0x4a,0xca,0x4a,0xd0,0x4a,0xd6,0x4a,0xdc,0x17,0x70,0x4a,0xe2,0x23,0xb2,0x4a,0xe8,0x4a,0xee,0x4a,0xf4,0x4a,0xfa,0x4b,0x00,0x4b,0x06,0x4b,0x0c,0x21,0x54,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x32,0xe8,0x4b,0x06, +0x4b,0x06,0x32,0xe8,0x32,0xe8,0x19,0xec,0x4a,0xe2,0x4a,0xe2,0x4b,0x06,0x00,0x01,0x00,0x01,0x04,0x85,0x00,0x02,0x00,0x17,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x26,0x00,0x26,0x00,0x01,0x00,0x28,0x00,0x28,0x00,0x02,0x00,0x2a,0x00,0x2a,0x00,0x03,0x00,0x2c,0x00,0x2c,0x00,0x04,0x00,0x2e,0x00,0x2f,0x00,0x05,0x00,0x31,0x00,0x32, +0x00,0x07,0x00,0x35,0x00,0x38,0x00,0x09,0x00,0x44,0x00,0x44,0x00,0x0d,0x00,0x46,0x00,0x46,0x00,0x0e,0x00,0x48,0x00,0x48,0x00,0x0f,0x00,0x4a,0x00,0x4a,0x00,0x10,0x00,0x4c,0x00,0x4c,0x00,0x11,0x00,0x4e,0x00,0x4f,0x00,0x12,0x00,0x51,0x00,0x52,0x00,0x14,0x00,0x55,0x00,0x58,0x00,0x16,0x00,0x74,0x00,0x74,0x00,0x1a,0x00,0x76, +0x00,0x76,0x00,0x1b,0x00,0x7e,0x00,0x7e,0x00,0x1c,0x00,0x80,0x00,0x80,0x00,0x1d,0x00,0xcd,0x00,0xcd,0x00,0x1e,0x00,0xd3,0x00,0xd4,0x00,0x1f,0x01,0x0f,0x01,0x0f,0x00,0x21,0x00,0x01,0x06,0x78,0x06,0x7e,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x3e,0x03,0x32,0x4a,0x3e,0x4a,0x44,0x4a,0x4a,0x4a,0x44,0x1d,0x98, +0x4a,0x50,0x4a,0x56,0x4a,0x5c,0x4a,0x50,0x4a,0x62,0x4a,0x68,0x4a,0x6e,0x4a,0x74,0x4a,0x7a,0x4a,0x80,0x4a,0x50,0x4a,0x86,0x4a,0x8c,0x4a,0x92,0x4a,0x98,0x1d,0x98,0x16,0x2a,0x4a,0x9e,0x4a,0x68,0x4a,0xa4,0x4a,0xaa,0x1b,0xfa,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x16,0x7e,0x19,0x24,0x4a,0xc2,0x4a,0xc8,0x4a,0x50,0x4a,0xce,0x4a,0xd4, +0x19,0x12,0x4a,0xda,0x4a,0xc8,0x16,0x7e,0x4a,0xe0,0x4a,0xe6,0x19,0x12,0x4a,0x98,0x4a,0xec,0x4a,0xf2,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x16,0x7e,0x4a,0x3e,0x4a,0x3e,0x4b,0x10,0x1d,0x98,0x4b,0x16,0x4a,0x80,0x1d,0x98,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x4b,0x1c,0x16,0x7e,0x16,0x7e,0x16,0x7e, +0x16,0x7e,0x19,0x12,0x19,0x12,0x19,0x12,0x19,0x12,0x4a,0xc8,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x4a,0xf2,0x4a,0xf2,0x4a,0xf2,0x4a,0xf2,0x17,0xe0,0x4a,0xda,0x4a,0x80,0x4b,0x22,0x16,0x7e,0x4b,0x28,0x4a,0x3e,0x4a,0x3e,0x4a,0x80,0x4b,0x2e,0x4b,0x34,0x4b,0x0a,0x4a,0xa4,0x4a,0x3e,0x1d,0x98,0x4a,0x3e,0x1d,0x98, +0x1d,0x98,0x4a,0x50,0x19,0x24,0x4a,0x50,0x4b,0x3a,0x4a,0x80,0x4a,0x80,0x4a,0x80,0x1d,0x98,0x1d,0x98,0x1d,0x98,0x19,0x12,0x4a,0x6e,0x4a,0x62,0x4a,0x92,0x4a,0x98,0x4a,0xaa,0x16,0x7e,0x4b,0x40,0x4b,0x46,0x4a,0xa4,0x4b,0x0a,0x19,0x36,0x4b,0x4c,0x4a,0x56,0x4a,0xc2,0x4a,0x50,0x4b,0x52,0x4b,0x58,0x4a,0x4a,0x4a,0xb6,0x4a,0x4a, +0x4a,0xb6,0x4a,0xbc,0x4a,0x3e,0x1b,0xfa,0x4b,0x5e,0x29,0x80,0x4a,0x44,0x4a,0xbc,0x4a,0x44,0x4b,0x64,0x4b,0x6a,0x1d,0x98,0x16,0x7e,0x4a,0x6e,0x19,0x12,0x4a,0x6e,0x19,0x12,0x4a,0x6e,0x19,0x12,0x4a,0x7a,0x4a,0xc8,0x4a,0x7a,0x4a,0xc8,0x4a,0x80,0x16,0x7e,0x4a,0x8c,0x19,0x12,0x4a,0x8c,0x19,0x12,0x4a,0x92,0x4a,0x98,0x47,0x32, +0x4b,0x70,0x4a,0x98,0x4a,0xec,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4a,0xaa,0x16,0x7e,0x4a,0xaa,0x16,0x7e,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4a,0x3e,0x1b,0xfa,0x4a,0x4a,0x4a,0xb6,0x4a,0x4a,0x4a,0xb6,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4a,0x56,0x4a,0xc2,0x4a,0x56,0x4a,0xc2,0x4b,0x88,0x4a,0xc2, +0x4a,0x5c,0x4a,0xc8,0x4a,0x5c,0x4a,0xc8,0x4a,0x50,0x19,0x12,0x4a,0x50,0x19,0x12,0x4a,0x50,0x4b,0x8e,0x2c,0x50,0x4b,0x94,0x4a,0x62,0x4a,0xce,0x4a,0x68,0x1d,0xda,0x16,0x4e,0x4b,0x1c,0x4b,0x9a,0x4a,0x7a,0x4a,0xaa,0x4b,0xa0,0x4b,0xa6,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x8c,0x4b,0x8e,0x4a,0x92,0x4a,0x98,0x4a,0x98, +0x4a,0xec,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4b,0x64,0x4b,0xac,0x4a,0x9e,0x4a,0xfe,0x4a,0xa4,0x4b,0x0a,0x19,0x12,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4a,0xfe,0x4a,0xa4,0x4b,0x0a,0x4a,0x80,0x16,0x7e,0x1d,0x98,0x4a,0xf2,0x4a,0x3e,0x4b,0xb2,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa, +0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x4b,0xb2,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x4b,0xb2,0x1c,0x8a,0x4b,0xb8,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e, +0x1c,0x8a,0x4b,0xb8,0x19,0x36,0x19,0x12,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xd0,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4b,0xd6,0x4b,0xdc,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4a,0xbc, +0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4b,0xf4,0x4a,0xbc,0x4b,0xfa,0x4c,0x00,0x4a,0xa4,0x4b,0x0a,0x4a,0xa4,0x4b,0x0a,0x4c,0x06,0x4c,0x0c,0x4a,0xf2,0x16,0x2a,0x3e,0x62,0x4c,0x12,0x4a,0x3e,0x4a,0xd4,0x4a,0x44,0x4a,0xb0,0x4c,0x18,0x4c,0x1e,0x4c,0x24,0x4c,0x2a, +0x42,0xa0,0x4c,0x30,0x4a,0x44,0x4a,0xbc,0x4c,0x36,0x4a,0xaa,0x4c,0x3c,0x4c,0x42,0x4c,0x48,0x4a,0xaa,0x4c,0x4e,0x23,0x32,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4c,0x54,0x4c,0x54,0x4c,0x5a,0x4c,0x60,0x4c,0x66,0x4c,0x12,0x19,0x36,0x19,0x24,0x4a,0x56,0x4a,0xc2,0x4a,0x5c,0x4a,0xc8,0x4a,0x5c,0x1e,0x4c,0x4a,0x5c,0x4a,0xc8, +0x4a,0x5c,0x4a,0xc8,0x4c,0x6c,0x4c,0x72,0x4c,0x78,0x4c,0x7e,0x4a,0x50,0x19,0x12,0x4a,0x68,0x4a,0xd4,0x4a,0x68,0x4c,0x84,0x4c,0x8a,0x4c,0x90,0x4a,0xf2,0x4c,0x96,0x4a,0xf2,0x4c,0x9c,0x4c,0xa2,0x29,0xc8,0x4c,0xa8,0x4c,0xae,0x4a,0x74,0x4a,0xda,0x4a,0x74,0x4a,0xda,0x4a,0x74,0x4c,0xb4,0x4a,0x7a,0x4a,0xc8,0x4a,0x7a,0x4a,0xaa, +0x4c,0xba,0x28,0xfc,0x22,0xd8,0x4c,0xc0,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x19,0x36,0x4c,0xc6,0x19,0x36,0x4c,0xc6,0x4a,0x8c,0x19,0x12,0x4a,0x8c,0x4b,0x8e,0x4a,0x8c,0x4b,0x8e,0x4c,0xcc,0x4c,0xd2,0x4a,0x92,0x4a,0x98,0x4c,0xd8,0x4c,0xde,0x4a,0x92,0x4a,0x98,0x4a,0x92,0x4a,0x98, +0x4c,0xe4,0x4c,0xea,0x4a,0x98,0x4a,0xec,0x4c,0xf0,0x4c,0xf6,0x4c,0xfc,0x4d,0x02,0x4d,0x08,0x4d,0x0e,0x4d,0x14,0x4d,0x1a,0x4d,0x20,0x4d,0x26,0x4c,0x4e,0x4c,0xa8,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x16,0x2a,0x4a,0xf8,0x4c,0x60,0x33,0x8e,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4d,0x2c,0x4a,0x68,0x4b,0x04,0x4a,0x68,0x4b,0x04, +0x4a,0xa4,0x4b,0x0a,0x4a,0xaa,0x16,0x7e,0x4d,0x32,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x28,0xfc,0x4a,0xec,0x4a,0xfe,0x4b,0x0a,0x1b,0xfa,0x19,0x12,0x4a,0xb0,0x4d,0x4a,0x4d,0x50,0x4a,0xb0,0x1b,0xdc,0x4a,0xb0,0x4d,0x56,0x4a,0x4a,0x4d,0x5c,0x4a,0x44,0x1c,0x4e,0x4d,0x62,0x4d,0x68,0x4d,0x6e,0x4d,0x74,0x4d,0x7a,0x4d,0x80,0x4a,0x56, +0x29,0x02,0x4d,0x86,0x4d,0x8c,0x19,0x36,0x4a,0x68,0x4a,0xd4,0x19,0x12,0x4a,0xf2,0x4a,0x74,0x4a,0x7a,0x4d,0x92,0x4a,0x80,0x4d,0x98,0x4d,0x9e,0x4d,0xa4,0x4d,0xaa,0x4d,0xb0,0x1d,0x26,0x4d,0xb6,0x4b,0xb2,0x4d,0xbc,0x4d,0xc2,0x4a,0x98,0x4a,0xec,0x4d,0xc8,0x4d,0xce,0x4d,0xd4,0x17,0xc2,0x4b,0x0a,0x4a,0xaa,0x16,0x7e,0x4d,0xda, +0x4d,0xe0,0x17,0xe6,0x4d,0xe6,0x4d,0xec,0x4b,0x4c,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4e,0x04,0x47,0xaa,0x4b,0x7c,0x4e,0x0a,0x4e,0x10,0x4e,0x16,0x4a,0x3e,0x1b,0xfa,0x4a,0x50,0x19,0x12,0x4a,0x80,0x16,0x7e,0x1d,0x98,0x4a,0xf2,0x1c,0x0c,0x4e,0x1c,0x4e,0x22,0x4a,0x56,0x4a,0xc2,0x4a,0x56,0x4a,0xc2,0x4a,0x68,0x4a,0xd4,0x4e,0x28, +0x4e,0x2e,0x4e,0x28,0x4e,0x2e,0x4d,0x6e,0x4e,0x34,0x4a,0xce,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4a,0x56,0x4a,0xc2,0x4e,0x3a,0x4e,0x40,0x4b,0x16,0x4a,0xc8,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4a,0x50,0x19,0x12,0x4a,0x50,0x19,0x12,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x8c, +0x19,0x12,0x4a,0x8c,0x19,0x12,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x29,0x20,0x36,0x4c,0x4a,0x5c,0x4a,0xc8,0x4e,0x46,0x4a,0xb0,0x16,0x7e,0x1a,0xe6,0x4a,0xa4,0x4a,0x3e,0x1b,0xfa,0x4a,0x80,0x16,0x7e,0x4a,0xa4,0x4b,0x0a,0x4e,0x4c,0x4e,0x52,0x1e,0x46,0x4b,0x04,0x4e,0x58,0x1b,0x82,0x4e,0x5e,0x4a,0xbc,0x16,0x2a,0x4e,0x64, +0x15,0xfa,0x4d,0xec,0x4e,0x6a,0x4e,0x70,0x4e,0x76,0x4a,0xc2,0x4a,0xc2,0x1b,0x22,0x4e,0x7c,0x4e,0x82,0x4e,0x88,0x4a,0xc8,0x44,0x56,0x18,0xe2,0x4d,0x8c,0x4e,0x8e,0x4b,0x3a,0x4e,0x94,0x2f,0xf8,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4a,0xc8,0x4e,0xb2,0x1e,0x9a,0x16,0x7e,0x4e,0xb8,0x4d,0x2c,0x26,0xb0,0x4e,0xbe,0x4e,0xc4, +0x2a,0x4c,0x32,0xc8,0x2f,0xf8,0x19,0x9c,0x4e,0xca,0x4e,0xd0,0x1b,0xee,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x20,0xb0,0x4e,0xe8,0x4e,0xee,0x2f,0xe6,0x4d,0x68,0x1e,0x46,0x4e,0xf4,0x4b,0xb2,0x4e,0x22,0x4b,0xb2,0x4e,0xfa,0x4f,0x00,0x4b,0x04,0x4f,0x06,0x4f,0x0c,0x18,0xd6,0x4f,0x12,0x4f,0x18,0x4f,0x1e,0x4f,0x24,0x17,0xc2,0x1b,0x9a, +0x1a,0xe6,0x1c,0x18,0x4f,0x2a,0x4f,0x30,0x1c,0x0c,0x4f,0x36,0x18,0xd6,0x4f,0x3c,0x4f,0x42,0x4f,0x48,0x4d,0x98,0x4a,0xf2,0x4f,0x4e,0x4f,0x54,0x4f,0x5a,0x4f,0x60,0x4a,0xaa,0x1d,0xe6,0x4f,0x60,0x4a,0xce,0x19,0x12,0x4e,0x16,0x4f,0x66,0x4f,0x6c,0x44,0x6e,0x4f,0x72,0x4e,0x5e,0x4f,0x78,0x4f,0x7e,0x4a,0x3e,0x4a,0x4a,0x4a,0xb6, +0x4a,0x6e,0x4a,0x98,0x4c,0xde,0x4f,0x84,0x4d,0xec,0x4a,0xb0,0x4a,0xbc,0x19,0x24,0x4a,0xda,0x4a,0xc8,0x4a,0xe0,0x19,0x12,0x4b,0x8e,0x4a,0xa4,0x4a,0xec,0x16,0x7e,0x4f,0x8a,0x4f,0x90,0x2f,0x56,0x4f,0x96,0x4f,0x9c,0x1e,0x34,0x4a,0xe0,0x4f,0xa2,0x1e,0x46,0x4f,0xa8,0x4f,0xae,0x27,0x28,0x4a,0xc2,0x4f,0xb4,0x4f,0xba,0x4f,0xc0, +0x4f,0xc6,0x4a,0xe0,0x4f,0xba,0x25,0x72,0x4e,0xdc,0x4f,0xb4,0x4f,0xcc,0x25,0x90,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x1c,0x0c,0x25,0x78,0x27,0x28,0x21,0xfa,0x4f,0xf6,0x1a,0xe6,0x4f,0xfc,0x50,0x02,0x4a,0x44,0x1d,0x98,0x50,0x08,0x1d,0x98,0x16,0x7e,0x4a,0x62,0x4a,0xce,0x50,0x0e,0x50,0x14,0x4a,0x8c, +0x19,0x12,0x4a,0xa4,0x50,0x1a,0x4a,0xb6,0x4a,0x6e,0x4b,0x3a,0x4a,0x6e,0x4a,0x62,0x4a,0x8c,0x1b,0xfa,0x4a,0xec,0x4d,0xb6,0x50,0x20,0x00,0x01,0x00,0x01,0x04,0x86,0x00,0x02,0x00,0x29,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92, +0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45, +0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce,0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46,0x02,0x3c, +0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e,0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf,0x0a,0xcc, +0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31,0x00,0x01,0x00,0x68,0x00,0x70,0x00,0x02,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x48,0xb4,0x00,0x01,0x48,0xba,0x00,0x14,0x48,0xb6,0x48,0xb6,0x48,0xbc,0x48,0xbc,0x48,0xc2,0x48,0xc8,0x48,0xce, +0x48,0xce,0x48,0xd4,0x48,0xda,0x48,0xe0,0x48,0xe0,0x48,0xe6,0x48,0xe6,0x48,0xec,0x48,0xec,0x42,0x9e,0x42,0x9e,0x48,0xf2,0x48,0xf2,0x48,0xf8,0x48,0xe0,0x48,0xfe,0x48,0xfe,0x49,0x04,0x49,0x04,0x49,0x0a,0x49,0x0a,0x49,0x10,0x49,0x10,0x0f,0x62,0x0f,0x62,0x14,0xf0,0x14,0xf0,0x49,0x16,0x49,0x16,0x49,0x1c,0x49,0x22,0x49,0x28, +0x49,0x2e,0x00,0x01,0x00,0x02,0x04,0x80,0x04,0x81,0x00,0x02,0x00,0x05,0x00,0x45,0x00,0x47,0x00,0x00,0x00,0x49,0x00,0x4b,0x00,0x03,0x00,0x4d,0x00,0x51,0x00,0x06,0x00,0x53,0x00,0x5a,0x00,0x0b,0x00,0x5d,0x00,0x5d,0x00,0x13,0x00,0x01,0x0c,0xec,0x0c,0xf6,0x00,0x02,0x00,0x0c,0x00,0x1e,0x00,0x04,0x00,0x00,0x48,0xac,0x00,0x01, +0x48,0xb2,0x00,0x00,0x48,0xb8,0x00,0x01,0x48,0xbe,0x03,0x33,0x48,0xb2,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x48,0xca,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x48,0xee,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x48,0xfa,0x48,0xb8, +0x49,0x00,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x54,0x48,0xb8, +0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x49,0x60,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x66,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x84,0x48,0xb8, +0x49,0x8a,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x37,0x00,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8, +0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x54,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8, +0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0xae,0x48,0xb8,0x49,0xb4,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0xba,0x48,0xb8,0x49,0x78,0x48,0xb8,0x38,0x44,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x06,0x48,0xb8, +0x49,0xc0,0x48,0xb8,0x49,0xc6,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x37,0x00,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x06,0x48,0xb8, +0x49,0x24,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x24,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xcc,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0xd2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8, +0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0xd8,0x48,0xb8, +0x48,0xca,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xde,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xe4,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8, +0x49,0x78,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0xea,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x42,0x48,0xb8, +0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0xf0,0x48,0xb8,0x49,0xf6,0x48,0xb8,0x49,0xfc,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8, +0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8, +0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8, +0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8, +0x49,0x66,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8, +0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8, +0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8, +0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8, +0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8, +0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8, +0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x4a,0x14,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8, +0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8, +0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x49,0x60,0x48,0xb8, +0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8, +0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8, +0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8,0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8, +0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8, +0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8, +0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x90,0x48,0xb8, +0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8, +0x49,0x66,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x20,0x48,0xb8,0x4a,0x26,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x2c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x32,0x48,0xb8,0x4a,0x32,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x48,0xca,0x48,0xb8, +0x4a,0x3e,0x48,0xb8,0x4a,0x44,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4a,0x50,0x48,0xb8,0x4a,0x56,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x4a,0x5c,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x4a,0x62,0x48,0xb8,0x4a,0x68,0x48,0xb8,0x4a,0x6e,0x48,0xb8,0x48,0xee,0x48,0xb8,0x4a,0x74,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x74,0x48,0xb8, +0x4a,0x7a,0x48,0xb8,0x49,0x00,0x48,0xb8,0x39,0x1c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x4a,0x80,0x48,0xb8,0x4a,0x86,0x48,0xb8,0x4a,0x8c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x92,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x4a,0x98,0x48,0xb8,0x4a,0x9e,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4a,0xaa,0x48,0xb8,0x4a,0xa4,0x48,0xb8, +0x4a,0xaa,0x48,0xb8,0x4a,0xb0,0x48,0xb8,0x4a,0xb6,0x48,0xb8,0x4a,0xbc,0x48,0xb8,0x4a,0xc2,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x38,0x44,0x48,0xb8,0x4a,0xce,0x48,0xb8,0x4a,0xd4,0x48,0xb8,0x4a,0xda,0x48,0xb8,0x4a,0xe0,0x48,0xb8,0x4a,0xe6,0x48,0xb8,0x4a,0xec,0x48,0xb8, +0x4a,0xf2,0x48,0xb8,0x4a,0xf8,0x48,0xb8,0x4a,0xfe,0x48,0xb8,0x4b,0x04,0x48,0xb8,0x4b,0x0a,0x48,0xb8,0x4b,0x10,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x49,0xb4,0x48,0xb8, +0x4b,0x1c,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x4b,0x22,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0xe0,0x48,0xb8,0x4a,0xe6,0x48,0xb8, +0x4a,0xec,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0x28,0x48,0xb8,0x4b,0x2e,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe2,0x48,0xb8, +0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x39,0x1c,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x34,0x48,0xb8, +0x4b,0x3a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x40,0x48,0xb8,0x49,0x36,0x48,0xb8,0x4b,0x46,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x37,0x36,0x48,0xb8, +0x37,0x36,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x39,0x16,0x48,0xb8,0x4b,0x4c,0x48,0xb8,0x4b,0x4c,0x48,0xb8,0x4a,0x50,0x48,0xb8,0x4b,0x52,0x48,0xb8,0x36,0x52,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0x58,0x48,0xb8, +0x49,0x90,0x48,0xb8,0x4b,0x5e,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x64,0x48,0xb8,0x4a,0x6e,0x48,0xb8,0x4b,0x6a,0x48,0xb8,0x4b,0x70,0x48,0xb8,0x4b,0x76,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x4b,0x7c,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x72,0x48,0xb8,0x4b,0x82,0x48,0xb8, +0x4b,0x82,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4b,0x88,0x48,0xb8,0x4a,0x14,0x48,0xb8,0x4b,0x8e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4b,0x9a,0x48,0xb8,0x4b,0x9a,0x48,0xb8,0x4b,0xa0,0x48,0xb8, +0x4b,0xa6,0x48,0xb8,0x4b,0xac,0x48,0xb8,0x4a,0x68,0x48,0xb8,0x4b,0xb2,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4b,0xb8,0x48,0xb8,0x4b,0xbe,0x48,0xb8,0x4b,0xc4,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0xca,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4b,0xd0,0x48,0xb8,0x4b,0x22,0x48,0xb8, +0x4b,0x22,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x37,0x36,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0xdc,0x48,0xb8,0x4b,0x58,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x4a,0x74,0x48,0xb8,0x4b,0xe2,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8, +0x4b,0xe8,0x48,0xb8,0x4b,0xee,0x48,0xb8,0x4b,0xf4,0x48,0xb8,0x4a,0x20,0x48,0xb8,0x4b,0xfa,0x48,0xb8,0x4c,0x00,0x48,0xb8,0x4c,0x06,0x48,0xb8,0x48,0xee,0x48,0xb8,0x4a,0xbc,0x48,0xb8,0x4c,0x0c,0x48,0xb8,0x4c,0x0c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4b,0x64,0x48,0xb8,0x4c,0x12,0x48,0xb8,0x4c,0x18,0x48,0xb8,0x4c,0x1e,0x48,0xb8, +0x49,0x8a,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4c,0x24,0x48,0xb8,0x4c,0x24,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4c,0x2a,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x60,0x48,0xb8, +0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4c,0x30,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4c,0x36,0x48,0xb8,0x4c,0x3c,0x48,0xb8,0x4c,0x42,0x48,0xb8,0x4b,0x6a,0x48,0xb8,0x4c,0x48,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4c,0x4e,0x48,0xb8, +0x4b,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x60,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x84,0x48,0xb8,0x4c,0x54,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0xa8,0x48,0xb8, +0x49,0x48,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x4c,0x5a,0x48,0xb8,0x4c,0x60,0x48,0xb8,0x4c,0x66,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x4b,0xa6,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x22,0x48,0xb8,0x4c,0x6c,0x48,0xb8,0x4c,0x72,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x24,0x48,0xb8, +0x4c,0x78,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4c,0x7e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4c,0x84,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x4c,0x8a,0x48,0xb8,0x4c,0x90,0x48,0xb8,0x49,0x0c,0x48,0xb8, +0x49,0x12,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x4c,0x96,0x48,0xb8,0x4c,0x9c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x00,0x02,0x00,0x01,0x07,0x3a,0x07,0x3d,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91, +0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0, +0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce,0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46, +0x02,0x3c,0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e,0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf, +0x0a,0xcc,0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31,0x11,0x8c,0x11,0x8c,0x03,0x32,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x00,0x00,0x01,0x02,0x47,0x00,0x00,0x00,0x01,0x01,0xc1,0x00,0x00,0x00,0x01,0x03,0x0a,0x00,0x00, +0x00,0x01,0x02,0x6d,0x00,0x00,0x00,0x01,0x01,0xe7,0x00,0x00,0x00,0x01,0x02,0xb9,0x00,0x00,0x00,0x01,0x02,0x1c,0x00,0x00,0x00,0x01,0x01,0x96,0x00,0x00,0x00,0x01,0x02,0x30,0x00,0x00,0x00,0x01,0x01,0x93,0x00,0x00,0x00,0x01,0x01,0x0d,0x00,0x00,0x00,0x01,0x02,0xf2,0x00,0x00,0x00,0x01,0x02,0x23,0x00,0x00,0x00,0x01,0x01,0x61, +0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x02,0xa0,0x00,0x00,0x00,0x01,0x02,0x1a,0x00,0x00,0x00,0x01,0x00,0xf9,0x00,0x00,0x00,0x01,0x00,0x73,0x00,0x00,0x00,0x01,0x01,0x4b,0x00,0x00,0x00,0x01,0x00,0xcf,0x00,0x00,0x00,0x01,0x03,0x3b,0x00,0x00,0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x02,0x18,0x00,0x00,0x00,0x01, +0x03,0x3a,0x00,0x00,0x00,0x01,0x02,0x9d,0x00,0x00,0x00,0x01,0x02,0x17,0x00,0x00,0x00,0x01,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0xfc,0x00,0x00,0x00,0x01,0xff,0xf5,0x00,0x00,0x00,0x01,0x02,0x48,0x00,0x00,0x00,0x01,0x01,0xab,0x00,0x00,0x00,0x01,0x01,0x39,0x00,0x00,0x00,0x01,0x02,0x4d,0x00,0x00,0x00,0x01,0x01,0xb0,0x00,0x00, +0x00,0x01,0x01,0x2a,0x00,0x00,0x00,0x01,0x03,0x42,0x00,0x00,0x00,0x01,0x02,0xa5,0x00,0x00,0x00,0x01,0x02,0x1f,0x00,0x00,0x00,0x01,0xff,0xb5,0x00,0x00,0x00,0x01,0xfe,0x98,0x00,0x00,0x00,0x01,0xfd,0x91,0x00,0x00,0x00,0x01,0x01,0xee,0x00,0x00,0x00,0x01,0x01,0x51,0x00,0x00,0x00,0x01,0x00,0xcb,0x00,0x00,0x00,0x01,0x03,0x37, +0x00,0x00,0x00,0x01,0x02,0x9a,0x00,0x00,0x00,0x01,0x02,0x14,0x00,0x00,0x00,0x01,0x02,0xe8,0x00,0x00,0x00,0x01,0x02,0x4b,0x00,0x00,0x00,0x01,0x01,0xc5,0x00,0x00,0x00,0x01,0x02,0x85,0x00,0x00,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x01,0x02,0xcf,0x00,0x00,0x00,0x01,0x02,0x32,0x00,0x00,0x00,0x01, +0x01,0xac,0x00,0x00,0x00,0x01,0x00,0xd3,0x00,0x00,0x00,0x01,0xff,0xb6,0x00,0x00,0x00,0x01,0xfe,0xaf,0x00,0x00,0x00,0x01,0x02,0x8e,0x00,0x00,0x00,0x01,0x01,0xf1,0x00,0x00,0x00,0x01,0x01,0x6b,0x00,0x00,0x00,0x01,0x03,0x89,0x00,0x00,0x00,0x01,0x03,0x6b,0x00,0x00,0x00,0x01,0x03,0x61,0x00,0x00,0x00,0x01,0x03,0xe7,0x00,0x00, +0x00,0x01,0x03,0x18,0x00,0x00,0x00,0x01,0x02,0x06,0x00,0x00,0x00,0x01,0x03,0x83,0x00,0x00,0x00,0x01,0x02,0xe6,0x00,0x00,0x00,0x01,0x02,0x60,0x00,0x00,0x00,0x01,0x03,0x7e,0x00,0x00,0x00,0x01,0x02,0xe1,0x00,0x00,0x00,0x01,0x02,0x5b,0x00,0x00,0x00,0x01,0x02,0x9b,0x00,0x00,0x00,0x01,0x01,0xfe,0x00,0x00,0x00,0x01,0x01,0x78, +0x00,0x00,0x00,0x01,0x02,0xad,0x00,0x00,0x00,0x01,0x02,0x10,0x00,0x00,0x00,0x01,0x01,0x8a,0x00,0x00,0x00,0x01,0x02,0xc5,0x00,0x00,0x00,0x01,0x02,0x28,0x00,0x00,0x00,0x01,0x01,0xa2,0x00,0x00,0x00,0x01,0x02,0x34,0x00,0x00,0x00,0x01,0x01,0x97,0x00,0x00,0x00,0x01,0x01,0x11,0x00,0x00,0x00,0x01,0x01,0xdc,0x00,0x00,0x00,0x01, +0x01,0x3f,0x00,0x00,0x00,0x01,0x00,0xb9,0x00,0x00,0x00,0x01,0x02,0x42,0x00,0x00,0x00,0x01,0x01,0x73,0x00,0x00,0x00,0x01,0x00,0xf7,0x00,0x00,0x00,0x01,0x03,0xbf,0x00,0x00,0x00,0x01,0x03,0xe5,0x00,0x00,0x00,0x01,0x03,0x9a,0x00,0x00,0x00,0x01,0x03,0x0b,0x00,0x00,0x00,0x01,0x03,0x5b,0x00,0x00,0x00,0x01,0x04,0x18,0x00,0x00, +0x00,0x01,0x02,0x71,0x00,0x00,0x00,0x01,0x04,0x16,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x01,0x03,0x41,0x00,0x00,0x00,0x01,0x03,0x28,0x00,0x00,0x00,0x01,0x04,0x1d,0x00,0x00,0x00,0x01,0x02,0xc9,0x00,0x00,0x00,0x01,0x04,0x12,0x00,0x00,0x00,0x01,0x03,0xa1,0x00,0x00,0x00,0x01,0x03,0xaa,0x00,0x00,0x00,0x01,0x03,0x69, +0x00,0x00,0x00,0x01,0x05,0x40,0x00,0x00,0x00,0x01,0x03,0xab,0x00,0x00,0x00,0x01,0x04,0x5e,0x00,0x00,0x00,0x01,0x04,0x59,0x00,0x00,0x00,0x01,0x03,0x76,0x00,0x00,0x00,0x01,0x03,0x88,0x00,0x00,0x00,0x01,0x03,0xa0,0x00,0x00,0x00,0x01,0x02,0xb7,0x00,0x00,0x00,0x01,0x02,0xf7,0x00,0x00,0x00,0x01,0x04,0x11,0x00,0x00,0x00,0x01, +0xfe,0xfd,0x00,0x00,0x00,0x01,0x00,0xe6,0xff,0x9c,0x00,0x01,0x00,0xef,0x00,0x00,0x00,0x01,0x00,0xb8,0x00,0x00,0x00,0x01,0x00,0xca,0x00,0x00,0x00,0x01,0x00,0x8a,0x00,0x00,0x00,0x01,0x01,0x1d,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x00,0x01,0x01,0x10,0x00,0x00,0x00,0x01,0x00,0xf2,0x00,0x00, +0x00,0x01,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x01,0xff,0xac,0x00,0x00,0x00,0x01,0x01,0x17,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x00,0x01,0x00,0xb5,0x00,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0xc0, +0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x00,0x00,0x01,0xff,0xb4,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x01,0xff,0xc4,0x00,0x00,0x00,0x01,0x00,0xd2,0x00,0x00,0x00,0x01,0x01,0x18,0x00,0x00,0x00,0x01, +0x00,0xb6,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x00,0x01,0x00,0xa0,0x00,0x00,0x00,0x01,0x00,0x7c,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x00,0x01,0x00,0xed,0x00,0xf0,0x00,0x01,0x01,0xa6,0x00,0xf0,0x00,0x01,0x00,0xe4,0x00,0xf0,0x00,0x01,0x01,0x9d,0x00,0xf0,0x00,0x01,0x00,0x8e,0x00,0xf0, +0x00,0x01,0x01,0x47,0x00,0xf0,0x00,0x01,0x00,0x3c,0x00,0xf0,0x00,0x01,0x00,0xf5,0x00,0xf0,0x00,0x01,0x00,0x60,0x00,0xf0,0x00,0x01,0x01,0x19,0x00,0xf0,0x00,0x01,0x01,0x11,0x00,0xf0,0x00,0x01,0x01,0x97,0x00,0xf0,0x00,0x01,0x00,0x84,0x00,0xf0,0x00,0x01,0x01,0x3d,0x00,0xf0,0x00,0x01,0x00,0x6c,0x00,0xf0,0x00,0x01,0x01,0x25, +0x00,0xf0,0x00,0x01,0x01,0x0e,0x00,0xf0,0x00,0x01,0x01,0x90,0x00,0xf0,0x00,0x01,0x00,0xf0,0x00,0xf0,0x00,0x01,0x01,0x72,0x00,0xf0,0x00,0x01,0x00,0x6d,0x00,0xf0,0x00,0x01,0x01,0x26,0x00,0xf0,0x00,0x01,0x00,0x8a,0x00,0xf0,0x00,0x01,0x01,0x43,0x00,0xf0,0x00,0x01,0xff,0x1e,0x00,0xf0,0x00,0x01,0xff,0xd7,0x00,0xf0,0x00,0x01, +0x01,0x04,0x00,0xf0,0x00,0x01,0x00,0x62,0x00,0xf0,0x00,0x01,0x01,0x1b,0x00,0xf0,0x00,0x01,0x00,0xdc,0x00,0xf0,0x00,0x01,0x01,0x68,0x00,0xf0,0x00,0x01,0x00,0xb3,0x00,0xf0,0x00,0x01,0x01,0x6c,0x00,0xf0,0x00,0x01,0x00,0xb2,0x00,0xf0,0x00,0x01,0x01,0x3e,0x00,0xf0,0x00,0x01,0x00,0x64,0x00,0xf0,0x00,0x01,0x01,0x1d,0x00,0xf0, +0x00,0x01,0x00,0xaa,0x00,0xf0,0x00,0x01,0x01,0x63,0x00,0xf0,0x00,0x01,0x01,0x0b,0x00,0xf0,0x00,0x01,0x00,0xbe,0x00,0xf0,0x00,0x01,0x01,0x77,0x00,0xf0,0x00,0x01,0x00,0xf2,0x00,0xf0,0x00,0x01,0x01,0xab,0x00,0xf0,0x00,0x01,0x00,0xe3,0x00,0xf0,0x00,0x01,0x01,0x9c,0x00,0xf0,0x00,0x01,0x01,0x01,0x00,0xf0,0x00,0x01,0x00,0xca, +0x00,0xf0,0x00,0x01,0x01,0x83,0x00,0xf0,0x00,0x01,0x00,0x94,0x00,0xf0,0x00,0x01,0x01,0x4d,0x00,0xf0,0x00,0x01,0xff,0x5e,0x00,0xf0,0x00,0x01,0x02,0xa8,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0x00,0x00,0x01,0x01,0x56,0x00,0x00,0x00,0x01,0x02,0xc1,0x00,0x00,0x00,0x01, +0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x02,0x3d,0x00,0x00,0x00,0x01,0x02,0xbf,0x00,0x00,0x00,0x01,0x02,0xbe,0x00,0x00,0x00,0x01,0x01,0x6a,0x00,0x00,0x00,0x01,0x02,0xb3,0x00,0x00,0x00,0x01,0x02,0x26,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0x00,0x00,0x01,0x02,0x33,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00, +0x00,0x01,0x02,0xaf,0x00,0x00,0x00,0x01,0x03,0x1f,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0x00,0x00,0x01,0x02,0x29,0x00,0x00,0x00,0x01,0x01,0x7f,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0xf0,0x00,0x01,0x01,0xeb,0x00,0xdc,0x00,0x01,0x01,0xc8,0x00,0xdc,0x00,0x01,0x02,0x45,0x00,0xdc,0x00,0x01,0x02,0x91,0x00,0x00,0x00,0x01,0x01,0xa0, +0x00,0xdc,0x00,0x01,0x02,0xae,0x00,0xdc,0x00,0x01,0x02,0xf4,0x00,0xdc,0x00,0x01,0x02,0x4e,0x00,0x00,0x00,0x01,0x01,0xcf,0x00,0x00,0x00,0x01,0x02,0x38,0x00,0x00,0x00,0x01,0x02,0x15,0x00,0x00,0x00,0x01,0x02,0x3b,0x00,0x00,0x00,0x01,0xff,0xa6,0x00,0x00,0x00,0x01,0x02,0x4c,0x00,0x00,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01, +0x02,0x0e,0x00,0x00,0x00,0x01,0x02,0x36,0x00,0x00,0x00,0x01,0x02,0x12,0x00,0x00,0x00,0x01,0x02,0x13,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x01,0x01,0xe0,0x00,0x00,0x00,0x01,0x01,0xe1,0x00,0x00,0x00,0x01,0x02,0xee,0x00,0x00,0x00,0x01,0x03,0x14,0x00,0x00,0x00,0x01,0x02,0xc3,0x00,0x00, +0x00,0x01,0x02,0x3a,0x00,0x00,0x00,0x01,0x03,0x10,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x00,0x00,0x01,0x02,0x24,0x00,0x00,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x01,0x03,0x44,0x00,0x00,0x00,0x01,0x02,0x52,0x00,0x00,0x00,0x01,0x02,0x57,0x00,0x00,0x00,0x01,0x03,0x4c,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x01,0x01,0xf8, +0x00,0x00,0x00,0x01,0x02,0xbb,0x00,0x00,0x00,0x01,0x02,0xd9,0x00,0x00,0x00,0x01,0x01,0x45,0x00,0x00,0x00,0x01,0x02,0x98,0x00,0x00,0x00,0x01,0x04,0x05,0x00,0x00,0x00,0x01,0x03,0x8d,0x00,0x00,0x00,0x01,0x02,0x3e,0x00,0x00,0x00,0x01,0x01,0xe6,0x00,0x00,0x00,0x01,0x03,0x7d,0x00,0x00,0x00,0x01,0x03,0xa3,0x00,0x00,0x00,0x01, +0x03,0x52,0x00,0x00,0x00,0x01,0x03,0xd6,0x00,0x00,0x00,0x01,0x02,0x2f,0x00,0x00,0x00,0x01,0x03,0xd4,0x00,0x00,0x00,0x01,0x03,0xd3,0x00,0x00,0x00,0x01,0x02,0x8b,0x00,0x00,0x00,0x01,0x03,0xdb,0x00,0x00,0x00,0x01,0x02,0x87,0x00,0x00,0x00,0x01,0x03,0xd0,0x00,0x00,0x00,0x01,0x03,0x81,0x00,0x00,0x00,0x01,0x03,0x68,0x00,0x00, +0x00,0x01,0x03,0x27,0x00,0x00,0x00,0x01,0x04,0x2b,0x00,0x00,0x00,0x01,0x04,0x30,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x17,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x5e,0x00,0x00,0x00,0x01,0x02,0xcd,0x00,0x00,0x00,0x01,0x02,0x75,0x00,0x00,0x00,0x01,0x02,0xdb, +0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x01,0x04,0x26,0x00,0x00,0x00,0x01,0x03,0xd5,0x00,0x00,0x00,0x01,0x03,0x8c,0x00,0x00,0x00,0x01,0x02,0xb2,0x00,0x00,0x00,0x01,0x03,0x36,0x00,0x00,0x00,0x01,0x04,0x57,0x00,0x00,0x00,0x01,0x04,0x56,0x00,0x00,0x00,0x01,0x02,0x9f,0x00,0x00,0x00,0x01,0x03,0x64,0x00,0x00,0x00,0x01, +0x00,0x3b,0x00,0x00,0x00,0x01,0x04,0x53,0x00,0x00,0x00,0x01,0x04,0x04,0x00,0x00,0x00,0x01,0x03,0xeb,0x00,0x00,0x00,0x01,0x01,0x59,0x00,0x00,0x00,0x01,0x05,0x1e,0x00,0x00,0x00,0x01,0x04,0x4f,0x00,0x00,0x00,0x01,0x04,0x9f,0x00,0x00,0x00,0x01,0x04,0x9a,0x00,0x00,0x00,0x01,0x03,0xb7,0x00,0x00,0x00,0x01,0x03,0xc9,0x00,0x00, +0x00,0x01,0x03,0xe1,0x00,0x00,0x00,0x01,0x03,0x50,0x00,0x00,0x00,0x01,0x02,0xf8,0x00,0x00,0x00,0x01,0x03,0x1a,0x00,0x00,0x00,0x01,0x03,0x03,0x00,0x00,0x00,0x01,0x03,0x9e,0x00,0x00,0x00,0x01,0x01,0xf7,0x00,0x00,0x00,0x01,0x02,0x7b,0x00,0x00,0x00,0x01,0x03,0x9c,0x00,0x00,0x00,0x01,0x03,0x9b,0x00,0x00,0x00,0x01,0x02,0xa9, +0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x00,0x00,0x01,0x02,0x4f,0x00,0x00,0x00,0x01,0x03,0x98,0x00,0x00,0x00,0x01,0x03,0x49,0x00,0x00,0x00,0x01,0x02,0x80,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x00,0xce,0x00,0x00,0x00,0x01,0x02,0xef,0x00,0x00,0x00,0x01,0x04,0x46,0x00,0x00,0x00,0x01,0x03,0xf8,0x00,0x00,0x00,0x01, +0x03,0xe4,0x00,0x00,0x00,0x01,0x03,0xdf,0x00,0x00,0x00,0x01,0x02,0xfc,0x00,0x00,0x00,0x01,0x03,0x0e,0x00,0x00,0x00,0x01,0x03,0x26,0x00,0x00,0x00,0x01,0x02,0x95,0x00,0x00,0x00,0x01,0x02,0xa3,0x00,0x00,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x01,0x5e,0x00,0x00,0x00,0x01,0x01,0xc2,0x00,0x00,0x00,0x01,0x02,0xbc,0x00,0x00, +0x00,0x01,0x03,0x84,0x00,0x00,0x00,0x01,0x03,0x67,0x00,0x00,0x00,0x01,0x03,0xaf,0x00,0x00,0x00,0x01,0x02,0xa7,0x00,0x00,0x00,0x01,0x03,0xb5,0x00,0x00,0x00,0x01,0x02,0x5d,0x00,0x00,0x00,0x01,0x03,0xbe,0x00,0x00,0x00,0x01,0x03,0xc8,0x00,0x00,0x00,0x01,0x03,0xc6,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x00,0x00,0x01,0x03,0xba, +0x00,0x00,0x00,0x01,0x03,0x78,0x00,0x00,0x00,0x01,0x03,0x2d,0x00,0x00,0x00,0x01,0x03,0x65,0x00,0x00,0x00,0x01,0x03,0xb6,0x00,0x00,0x00,0x01,0x03,0xfb,0x00,0x00,0x00,0x01,0x03,0x1e,0x00,0x00,0x00,0x01,0x02,0x5f,0x00,0x00,0x00,0x01,0x02,0x86,0x00,0x00,0x00,0x01,0x02,0x5f,0x00,0xf0,0x00,0x01,0x02,0xf2,0x00,0xd0,0x00,0x01, +0x02,0xcf,0x00,0xd0,0x00,0x01,0x03,0x4c,0x00,0xd0,0x00,0x01,0x02,0xa7,0x00,0xd0,0x00,0x01,0x02,0xf2,0x00,0xdc,0x00,0x01,0x03,0xb5,0x00,0xd0,0x00,0x01,0x03,0xfb,0x00,0xd0,0x00,0x01,0x01,0x04,0x04,0xb0,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x01,0x13,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0xb0,0x00,0x01,0x00,0x00,0x05,0x64, +0x00,0x01,0xff,0xce,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x88,0x00,0x01,0x00,0x46,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x60,0x00,0x01,0x00,0x00,0x03,0xde,0x00,0x01,0x00,0x00,0x03,0xe8,0x00,0x01,0xff,0xc4,0x03,0xe8,0x00,0x01,0xff,0xf6,0x00,0x41,0x00,0x01,0x00,0x0a,0x00,0x41,0x00,0x01,0x00,0x00,0x04,0x7e,0x00,0x01,0x00,0x0f, +0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x41,0x00,0x01,0xff,0xfb,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0xff,0xc9,0x00,0x01,0x00,0x00,0xff,0xe2,0x00,0x01,0xff,0xf1,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0x00,0x00,0x04,0xec,0x00,0x01,0x00,0x00,0xff,0xec,0x00,0x01, +0x01,0xae,0x00,0x82,0x00,0x01,0x00,0x00,0x00,0x46,0x00,0x01,0x00,0x1e,0x04,0xb0,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01,0x01,0x93,0x04,0xb0,0x00,0x01,0x01,0xa6,0x04,0xb0,0x00,0x01,0x01,0xb2,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x6f,0x00,0x01,0x00,0x00,0x04,0xa6,0x00,0x01,0x00,0x0f,0x04,0x7e, +0x00,0x01,0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0xff,0xf1,0x04,0x7e,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0x00,0x04,0xc4,0x00,0x01,0x01,0xd9,0x04,0xba,0x00,0x01,0x01,0xd9,0x03,0xca,0x00,0x01,0x02,0x07,0x04,0x74,0x00,0x01,0x00,0xd9,0x00,0x82,0x00,0x01,0x01,0x53, +0x04,0x06,0x00,0x01,0x02,0x80,0x00,0x82,0x00,0x01,0x02,0x8c,0x06,0x40,0x00,0x01,0x03,0x93,0x05,0xdc,0x00,0x01,0x02,0x9e,0xff,0xf1,0x00,0x01,0x02,0x1c,0x06,0x40,0x00,0x01,0x03,0xe8,0x05,0xdc,0x00,0x01,0x02,0x1c,0xff,0xf1,0x00,0x01,0x02,0xee,0x06,0x40,0x00,0x01,0x04,0xc4,0x05,0xdc,0x00,0x01,0x02,0xee,0xff,0xe7,0x00,0x01, +0x02,0xbc,0x06,0x40,0x00,0x01,0x04,0xce,0x05,0xdc,0x00,0x01,0x02,0xbc,0xff,0xf1,0x00,0x01,0x02,0x58,0x06,0x40,0x00,0x01,0x03,0xd4,0x05,0xdc,0x00,0x01,0x02,0x58,0xff,0xf1,0x00,0x01,0x03,0x20,0x06,0x40,0x00,0x01,0x05,0x00,0x05,0xdc,0x00,0x01,0x03,0x20,0xff,0xe7,0x00,0x01,0x02,0xd0,0x06,0x40,0x00,0x01,0x05,0x28,0x05,0xdc, +0x00,0x01,0x02,0xd0,0xff,0xf1,0x00,0x01,0x01,0x09,0x06,0x40,0x00,0x01,0x02,0x08,0x05,0xdc,0x00,0x01,0x01,0x09,0xff,0xf1,0x00,0x01,0x01,0xd6,0x06,0x40,0x00,0x01,0x02,0x58,0x05,0xdc,0x00,0x01,0x01,0x7c,0xff,0xf1,0x00,0x01,0x02,0x8a,0x06,0x40,0x00,0x01,0x04,0xb0,0x05,0xdc,0x00,0x01,0x02,0x8a,0xff,0xf1,0x00,0x01,0x02,0x4e, +0x06,0x40,0x00,0x01,0x03,0x84,0x05,0xdc,0x00,0x01,0x02,0x4e,0xff,0xf1,0x00,0x01,0x03,0x93,0x06,0x40,0x00,0x01,0x06,0xa4,0x05,0xdc,0x00,0x01,0x03,0x93,0xff,0xf1,0x00,0x01,0x05,0x78,0x05,0xdc,0x00,0x01,0x03,0x20,0xff,0xf1,0x00,0x01,0x03,0x02,0x06,0x40,0x00,0x01,0x05,0x14,0x05,0xdc,0x00,0x01,0x03,0x02,0xff,0xe7,0x00,0x01, +0x02,0x62,0x06,0x40,0x00,0x01,0x02,0x62,0xff,0xf1,0x00,0x01,0x03,0x02,0xfe,0xf2,0x00,0x01,0x04,0x10,0x05,0xdc,0x00,0x01,0x02,0x3a,0x06,0x40,0x00,0x01,0x02,0x26,0xff,0xe7,0x00,0x01,0x02,0x26,0x06,0x40,0x00,0x01,0x04,0x4c,0x05,0xdc,0x00,0x01,0x02,0x26,0xff,0xf1,0x00,0x01,0x02,0xbc,0xff,0xe7,0x00,0x01,0x02,0x80,0x06,0x40, +0x00,0x01,0x02,0x80,0xff,0xf1,0x00,0x01,0x03,0xca,0x06,0x40,0x00,0x01,0x07,0x9e,0x05,0xdc,0x00,0x01,0x03,0xca,0xff,0xf1,0x00,0x01,0x02,0x6c,0x06,0x40,0x00,0x01,0x02,0x6c,0xff,0xf1,0x00,0x01,0x02,0x44,0x06,0x40,0x00,0x01,0x02,0x44,0xff,0xf1,0x00,0x01,0x02,0x08,0x05,0x14,0x00,0x01,0x03,0x84,0x04,0xb0,0x00,0x01,0x02,0x08, +0xff,0xe7,0x00,0x01,0x02,0x4e,0x06,0x72,0x00,0x01,0x03,0xca,0x05,0x78,0x00,0x01,0x02,0x6c,0xff,0xe7,0x00,0x01,0x02,0x26,0x05,0x14,0x00,0x01,0x03,0x98,0x04,0xb0,0x00,0x01,0x02,0x3a,0xff,0xe7,0x00,0x01,0x02,0x1c,0x06,0x72,0x00,0x01,0x04,0x4c,0x06,0x40,0x00,0x01,0x02,0x1c,0xff,0xe7,0x00,0x01,0x02,0x3a,0x05,0x14,0x00,0x01, +0x01,0xe0,0x06,0x72,0x00,0x01,0x01,0x36,0xff,0xf1,0x00,0x01,0x04,0x38,0x04,0xb0,0x00,0x01,0x02,0x3a,0xfe,0x2a,0x00,0x01,0x00,0xfa,0x06,0x72,0x00,0x01,0x01,0xa4,0x06,0x0e,0x00,0x01,0x00,0xfa,0xff,0xf1,0x00,0x01,0x00,0xf0,0x06,0x72,0x00,0x01,0x00,0x50,0xfe,0x2a,0x00,0x01,0x03,0x84,0x05,0x78,0x00,0x01,0x01,0x7c,0x06,0x40, +0x00,0x01,0x03,0x7a,0x05,0x14,0x00,0x01,0x06,0x40,0x04,0xb0,0x00,0x01,0x03,0x7a,0xff,0xf1,0x00,0x01,0x02,0x4e,0x05,0x14,0x00,0x01,0x03,0xe8,0x04,0xb0,0x00,0x01,0x02,0x58,0x05,0x14,0x00,0x01,0x02,0x58,0xff,0xe7,0x00,0x01,0x04,0x1a,0x04,0xb0,0x00,0x01,0x02,0x4e,0xfe,0x2a,0x00,0x01,0x04,0x42,0x04,0xb0,0x00,0x01,0x01,0xcc, +0x05,0x14,0x00,0x01,0x02,0xe4,0x04,0xb0,0x00,0x01,0x01,0xae,0x05,0x14,0x00,0x01,0x03,0x02,0x04,0xb0,0x00,0x01,0x01,0xae,0xff,0xe7,0x00,0x01,0x01,0x2c,0x05,0xdc,0x00,0x01,0x01,0xe0,0x05,0x78,0x00,0x01,0x01,0x80,0xff,0xe7,0x00,0x01,0x04,0x06,0x04,0xb0,0x00,0x01,0x01,0xf4,0x05,0x14,0x00,0x01,0x04,0x10,0x04,0xb0,0x00,0x01, +0x01,0xf4,0xff,0xf1,0x00,0x01,0x02,0xf3,0x05,0x14,0x00,0x01,0x05,0xf0,0x04,0xb0,0x00,0x01,0x02,0xf3,0xff,0xf1,0x00,0x01,0x01,0xd6,0x05,0x14,0x00,0x01,0x03,0xca,0x04,0xb0,0x00,0x01,0x01,0xd6,0xff,0xf1,0x00,0x01,0x01,0xf9,0x05,0x14,0x00,0x01,0x01,0xf9,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x05,0x14,0x00,0x01,0x01,0xc2,0xff,0xf1, +0x00,0x01,0x02,0x9e,0x07,0x80,0x00,0x01,0x04,0x33,0x06,0x7c,0x00,0x01,0x02,0xee,0xfe,0x48,0x00,0x01,0x02,0x58,0x07,0xb0,0x00,0x01,0x03,0xd4,0x06,0xa4,0x00,0x01,0x03,0x20,0x07,0x80,0x00,0x01,0x05,0x78,0x06,0x7c,0x00,0x01,0x03,0x02,0x07,0x80,0x00,0x01,0x05,0x8c,0x06,0x7c,0x00,0x01,0x02,0xbc,0x07,0x80,0x00,0x01,0x05,0x64, +0x06,0x7c,0x00,0x01,0x02,0x08,0x06,0x54,0x00,0x01,0x03,0xd4,0x05,0x50,0x00,0x01,0x01,0xf4,0x06,0x04,0x00,0x01,0x01,0xf4,0xff,0xe7,0x00,0x01,0x02,0x08,0x06,0x04,0x00,0x01,0x03,0x84,0x05,0x50,0x00,0x01,0x02,0x3a,0xfe,0x48,0x00,0x01,0x02,0x3a,0x06,0x54,0x00,0x01,0x02,0x2b,0x06,0x54,0x00,0x01,0x02,0x2b,0xff,0xe7,0x00,0x01, +0x02,0x26,0x06,0x04,0x00,0x01,0x02,0x44,0x05,0x46,0x00,0x01,0x01,0xf4,0x05,0x1e,0x00,0x01,0x00,0xe6,0x06,0x72,0x00,0x01,0x02,0x44,0x05,0x1e,0x00,0x01,0x00,0xe6,0x06,0x0e,0x00,0x01,0x02,0x4e,0x06,0x04,0x00,0x01,0x04,0x38,0x05,0x50,0x00,0x01,0x02,0x58,0x06,0x54,0x00,0x01,0x02,0x53,0x06,0x54,0x00,0x01,0x02,0x53,0xff,0xe7, +0x00,0x01,0x02,0x58,0x06,0x04,0x00,0x01,0x02,0x26,0x06,0x54,0x00,0x01,0x04,0x56,0x05,0x50,0x00,0x01,0x02,0x3a,0x06,0x04,0x00,0x01,0x02,0x2d,0x06,0xa2,0x00,0x01,0x04,0x5a,0x06,0x02,0x00,0x01,0x02,0x2d,0xff,0xe7,0x00,0x01,0x03,0xe8,0x06,0x40,0x00,0x01,0x06,0xe2,0x05,0xdc,0x00,0x01,0x03,0xe8,0xff,0xf1,0x00,0x01,0x03,0x48, +0x05,0x14,0x00,0x01,0x06,0xa8,0x04,0xb0,0x00,0x01,0x03,0x48,0xff,0xe7,0x00,0x01,0x03,0x02,0x06,0x72,0x00,0x01,0x04,0x00,0x05,0x9a,0x00,0x01,0x01,0x4b,0xfe,0xd4,0x00,0x01,0x02,0x9e,0x07,0xb0,0x00,0x01,0x04,0x83,0x06,0x7c,0x00,0x01,0x04,0x74,0x06,0x40,0x00,0x01,0x07,0x72,0x05,0xdc,0x00,0x01,0x04,0x74,0xff,0xe7,0x00,0x01, +0x03,0xfc,0x05,0x14,0x00,0x01,0x07,0x6c,0x04,0xb0,0x00,0x01,0x03,0xfc,0xff,0xe7,0x00,0x01,0x01,0xf9,0x06,0x04,0x00,0x01,0x04,0x6a,0x05,0x50,0x00,0x01,0x02,0x44,0x07,0x80,0x00,0x01,0x05,0x00,0x06,0x7c,0x00,0x01,0x02,0x30,0x07,0xb0,0x00,0x01,0x04,0x24,0x06,0x7c,0x00,0x01,0x02,0x30,0xff,0xf1,0x00,0x01,0x04,0x33,0x06,0xa4, +0x00,0x01,0x02,0x30,0x07,0x80,0x00,0x01,0x04,0x4c,0x06,0x7c,0x00,0x01,0x01,0x09,0x07,0xb0,0x00,0x01,0x02,0x80,0x06,0xa4,0x00,0x01,0x01,0x1d,0x07,0xb0,0x00,0x01,0x01,0x1d,0xff,0xf1,0x00,0x01,0x01,0x09,0x07,0x80,0x00,0x01,0x02,0x80,0x06,0x7c,0x00,0x01,0x02,0x30,0x06,0x7c,0x00,0x01,0x03,0x02,0x07,0xb0,0x00,0x01,0x02,0xbc, +0x07,0xb0,0x00,0x01,0x00,0xfa,0x04,0xa0,0x00,0x01,0x01,0x7c,0x04,0x50,0x00,0x01,0x01,0x0e,0x06,0x72,0x00,0x01,0x01,0xa4,0x06,0x40,0x00,0x01,0x01,0x0e,0xff,0xf1,0x00,0x01,0x02,0x26,0x07,0xb0,0x00,0x01,0x04,0x24,0x06,0xa4,0x00,0x01,0x01,0x90,0x06,0x54,0x00,0x01,0x03,0x52,0x05,0x50,0x00,0x01,0x02,0x6c,0x07,0xb0,0x00,0x01, +0x05,0x00,0x06,0xa4,0x00,0x01,0x01,0xf4,0x06,0x54,0x00,0x01,0x03,0xe8,0x05,0x50,0x00,0x01,0x02,0x3c,0x06,0x94,0x00,0x01,0x04,0x79,0x05,0xf4,0x00,0x01,0x02,0x3c,0xff,0xe7,0x00,0x01,0x02,0x44,0x07,0xb0,0x00,0x01,0x01,0xf9,0x06,0x54,0x00,0x01,0x02,0x3d,0x06,0x3a,0x00,0x01,0x04,0x7b,0x04,0xfa,0x00,0x01,0x02,0x3d,0xff,0xf1, +0x00,0x01,0x02,0x5a,0x06,0x8c,0x00,0x01,0x04,0xb4,0x05,0x4c,0x00,0x01,0x02,0x5a,0xfe,0x2a,0x00,0x01,0x03,0x20,0x07,0xb0,0x00,0x01,0x05,0x50,0x06,0x7c,0x00,0x01,0x04,0x88,0x05,0x50,0x00,0x01,0x01,0x1d,0x07,0x08,0x00,0x01,0x02,0x21,0x06,0x42,0x00,0x01,0x02,0x26,0xfe,0x48,0x00,0x01,0x01,0xae,0xfe,0x48,0x00,0x01,0x02,0xee, +0x07,0xb0,0x00,0x01,0x05,0x14,0x06,0xa4,0x00,0x01,0x03,0x0c,0x07,0xb0,0x00,0x01,0x03,0x0c,0xff,0xe7,0x00,0x01,0x02,0x44,0x06,0x54,0x00,0x01,0x02,0x44,0xff,0xe7,0x00,0x01,0x02,0x9e,0x06,0x40,0x00,0x01,0x02,0x9e,0xfe,0xa2,0x00,0x01,0x02,0x08,0xfe,0xa2,0x00,0x01,0x02,0xa8,0x07,0xb0,0x00,0x01,0x05,0x1e,0x06,0xa4,0x00,0x01, +0x02,0xa8,0xff,0xf1,0x00,0x01,0x02,0x58,0xfe,0xa2,0x00,0x01,0x02,0x3a,0xfe,0xa2,0x00,0x01,0x02,0x4e,0x07,0xb0,0x00,0x01,0x03,0x84,0x06,0xa4,0x00,0x01,0x00,0xfa,0x08,0x02,0x00,0x01,0x01,0xf4,0x06,0xe0,0x00,0x01,0x03,0xc4,0x05,0xdc,0x00,0x01,0x02,0x75,0x06,0x40,0x00,0x01,0x05,0x78,0x06,0xa4,0x00,0x01,0x02,0x4e,0x06,0x54, +0x00,0x01,0x03,0x02,0xff,0xf1,0x00,0x01,0x05,0x8c,0x06,0xa4,0x00,0x01,0x02,0x62,0x07,0xb0,0x00,0x01,0x04,0x60,0x06,0xa4,0x00,0x01,0x01,0xcc,0x06,0x54,0x00,0x01,0x03,0x34,0x05,0x50,0x00,0x01,0x01,0xae,0x06,0x54,0x00,0x01,0x02,0x3a,0x07,0xb0,0x00,0x01,0x01,0x80,0xfe,0x48,0x00,0x01,0x04,0x9c,0x06,0xa4,0x00,0x01,0x01,0x2c, +0x06,0x0e,0x00,0x01,0x02,0x30,0x06,0x18,0x00,0x01,0x05,0x64,0x06,0xa4,0x00,0x01,0x02,0x8a,0x07,0x80,0x00,0x01,0x04,0xb0,0x06,0xa4,0x00,0x01,0x01,0xe0,0x06,0x54,0x00,0x01,0x02,0x4e,0x07,0x80,0x00,0x01,0x04,0xb0,0x06,0x7c,0x00,0x01,0x01,0xe0,0x06,0x04,0x00,0x01,0x03,0xf8,0x06,0x3a,0x00,0x01,0x04,0xac,0x06,0x3a,0x00,0x01, +0x03,0x7a,0xff,0xe7,0x00,0x01,0x03,0x0c,0x06,0x79,0x00,0x01,0x03,0xf6,0x06,0x29,0x00,0x01,0x02,0x8a,0xfe,0x2a,0x00,0x01,0x02,0xe8,0x05,0xb2,0x00,0x01,0x04,0x39,0x04,0xb0,0x00,0x01,0x02,0xe8,0xff,0xf1,0x00,0x01,0x02,0x9e,0x07,0x30,0x00,0x01,0x02,0xf8,0x07,0xb0,0x00,0x01,0x02,0xf8,0xff,0xe7,0x00,0x01,0x04,0xc4,0x06,0x7c, +0x00,0x01,0x02,0x44,0x07,0x30,0x00,0x01,0x03,0xfc,0x05,0x50,0x00,0x01,0x02,0x1c,0x07,0xb0,0x00,0x01,0x02,0x26,0x07,0x80,0x00,0x01,0x03,0xd4,0x06,0x40,0x00,0x01,0x05,0x50,0x06,0xa4,0x00,0x01,0x02,0x44,0xfe,0x2a,0x00,0x01,0x03,0x20,0xfe,0x70,0x00,0x01,0x02,0x3a,0x06,0x16,0x00,0x01,0x04,0x66,0x05,0xa0,0x00,0x01,0x02,0xd0, +0x07,0xb0,0x00,0x01,0x02,0x6c,0x07,0xb2,0x00,0x01,0x04,0x1a,0x06,0x18,0x00,0x01,0x02,0xd7,0x06,0x3a,0x00,0x01,0x05,0x5e,0x05,0xea,0x00,0x01,0x02,0xd7,0xff,0xf1,0x00,0x01,0x02,0x43,0x06,0x3c,0x00,0x01,0x04,0x37,0x05,0x4c,0x00,0x01,0x02,0x43,0xff,0xf1,0x00,0x01,0x01,0x0e,0x07,0x80,0x00,0x01,0x00,0xfa,0x06,0x0e,0x00,0x01, +0x01,0x09,0x07,0x30,0x00,0x01,0x00,0xfa,0x05,0xd2,0x00,0x01,0x01,0x0e,0x07,0xb0,0x00,0x01,0x00,0xe1,0x06,0x72,0x00,0x01,0x01,0x0e,0x06,0x40,0x00,0x01,0x01,0x0e,0xfe,0xa2,0x00,0x01,0x00,0xfa,0xfe,0xa2,0x00,0x01,0x01,0xd6,0x07,0xb0,0x00,0x01,0x02,0xd0,0x06,0xa4,0x00,0x01,0x01,0xf4,0x05,0x6e,0x00,0x01,0x02,0x8a,0xfe,0x70, +0x00,0x01,0x02,0x4e,0xfe,0x70,0x00,0x01,0x01,0xfd,0x04,0xa0,0x00,0x01,0x03,0xfa,0x04,0xa0,0x00,0x01,0x01,0xfd,0xff,0xf1,0x00,0x01,0x02,0x4e,0xfe,0x48,0x00,0x01,0x00,0xfa,0xfe,0x48,0x00,0x01,0x03,0x20,0xfe,0x2a,0x00,0x01,0x03,0x02,0x07,0x30,0x00,0x01,0x02,0x9e,0xfe,0x70,0x00,0x01,0x00,0xfa,0xfe,0x70,0x00,0x01,0x02,0x18, +0x05,0xea,0x00,0x01,0x04,0x81,0x05,0xea,0x00,0x01,0x02,0x18,0xff,0xf1,0x00,0x01,0x01,0x2c,0x05,0x7f,0x00,0x01,0x02,0xb6,0x05,0x2f,0x00,0x01,0x02,0xbc,0x07,0x30,0x00,0x01,0x02,0xbc,0xfe,0xa2,0x00,0x01,0x02,0x26,0xfe,0xa2,0x00,0x01,0x03,0xd4,0x07,0xb0,0x00,0x01,0x07,0x9e,0x06,0x7c,0x00,0x01,0x02,0xf8,0x06,0x54,0x00,0x01, +0x05,0xf0,0x05,0x50,0x00,0x01,0x02,0x08,0xfe,0x2a,0x00,0x01,0x01,0x7c,0x06,0x72,0x00,0x01,0x02,0x8e,0x06,0x52,0x00,0x01,0x03,0xca,0x07,0xb0,0x00,0x01,0x02,0xf3,0x06,0x54,0x00,0x01,0x03,0xca,0x07,0x80,0x00,0x01,0x02,0xf3,0x06,0x04,0x00,0x01,0x04,0x1a,0x05,0x50,0x00,0x01,0x06,0x1a,0x06,0x7c,0x00,0x01,0x04,0xc7,0x04,0xb0, +0x00,0x01,0x02,0xbc,0x06,0xd6,0x00,0x01,0x05,0xfa,0x06,0x7c,0x00,0x01,0x02,0x26,0x05,0x46,0x00,0x01,0x05,0x04,0x05,0x00,0x00,0x01,0x02,0xb2,0xfe,0xc0,0x00,0x01,0x02,0x12,0x05,0x14,0x00,0x01,0x02,0x12,0xfe,0xc0,0x00,0x01,0x02,0x44,0xfe,0xc0,0x00,0x01,0x02,0x4e,0xfe,0xc0,0x00,0x01,0x02,0x30,0x06,0xc2,0x00,0x01,0x01,0xf4, +0x05,0x82,0x00,0x01,0x01,0x09,0xfe,0xc0,0x00,0x01,0x00,0xfa,0xfe,0xc0,0x00,0x01,0x03,0x02,0xfe,0xc0,0x00,0x01,0x02,0x58,0xfe,0xc0,0x00,0x01,0x02,0xbc,0xfe,0xc0,0x00,0x01,0x02,0x26,0xfe,0xc0,0x00,0x01,0x02,0x26,0xfe,0x84,0x00,0x01,0x01,0x80,0xfe,0x84,0x00,0x01,0x02,0xe2,0x06,0x52,0x00,0x01,0x05,0x74,0x05,0x62,0x00,0x01, +0x02,0xe2,0xff,0xe7,0x00,0x01,0x02,0x03,0x04,0xb8,0x00,0x01,0x03,0xdf,0x03,0xc8,0x00,0x01,0x02,0x03,0xff,0xe7,0x00,0x01,0x02,0x58,0xfe,0x48,0x00,0x01,0x02,0x9e,0xfe,0x02,0x00,0x01,0x02,0x08,0xfe,0x02,0x00,0x01,0x02,0x1c,0x07,0x80,0x00,0x01,0x03,0xe8,0x06,0x7c,0x00,0x01,0x02,0x30,0x06,0x40,0x00,0x01,0x02,0x30,0xfe,0xc0, +0x00,0x01,0x02,0x6c,0xfe,0xc0,0x00,0x01,0x02,0x44,0xff,0x24,0x00,0x01,0x02,0x6c,0xff,0x24,0x00,0x01,0x05,0x1e,0x06,0x7c,0x00,0x01,0x02,0xa8,0x06,0x40,0x00,0x01,0x02,0xa8,0xfe,0xc0,0x00,0x01,0x02,0x58,0x06,0x72,0x00,0x01,0x02,0x8a,0xff,0x24,0x00,0x01,0x02,0x4e,0xff,0x24,0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x02,0x1c, +0xfe,0x70,0x00,0x01,0x02,0xb2,0x06,0x40,0x00,0x01,0x02,0xb2,0xfe,0x2a,0x00,0x01,0x02,0x44,0x05,0x14,0x00,0x01,0x02,0x30,0xfe,0xa2,0x00,0x01,0x02,0x12,0x07,0x80,0x00,0x01,0x02,0x12,0xff,0xf1,0x00,0x01,0x01,0xe0,0x07,0x62,0x00,0x01,0x02,0xee,0x06,0xe0,0x00,0x01,0x03,0x20,0x07,0x30,0x00,0x01,0x02,0xd0,0x07,0x80,0x00,0x01, +0x05,0x28,0x06,0x7c,0x00,0x01,0x02,0x4e,0x06,0xd6,0x00,0x01,0x03,0xca,0x06,0x18,0x00,0x01,0x02,0xee,0xfe,0xc0,0x00,0x01,0x02,0x3a,0x06,0x72,0x00,0x01,0x02,0x3a,0xfe,0xc0,0x00,0x01,0x02,0x80,0x07,0xb2,0x00,0x01,0x04,0x1a,0x06,0x54,0x00,0x01,0x02,0xd0,0xfe,0x2a,0x00,0x01,0x02,0xd0,0xfe,0x84,0x00,0x01,0x02,0x4e,0xfe,0x84, +0x00,0x01,0x01,0x09,0xfe,0xa2,0x00,0x01,0x02,0x8a,0x07,0xb0,0x00,0x01,0x02,0x4e,0x07,0xb2,0x00,0x01,0x02,0x80,0xfe,0xc0,0x00,0x01,0x02,0x26,0x06,0x72,0x00,0x01,0x02,0x30,0x06,0x72,0x00,0x01,0x02,0x30,0xff,0x24,0x00,0x01,0x02,0x26,0x07,0x30,0x00,0x01,0x03,0xd4,0x06,0x7c,0x00,0x01,0x00,0xfa,0x07,0x12,0x00,0x01,0x00,0xfa, +0xff,0x24,0x00,0x01,0x02,0x2b,0x06,0x40,0x00,0x01,0x02,0x2b,0xfe,0x2a,0x00,0x01,0x00,0xfa,0xfe,0x2a,0x00,0x01,0x03,0x93,0x07,0xb0,0x00,0x01,0x06,0xa4,0x06,0xa4,0x00,0x01,0x03,0x7a,0x06,0x54,0x00,0x01,0x06,0x40,0x05,0x50,0x00,0x01,0x03,0x5c,0x07,0x80,0x00,0x01,0x06,0xa4,0x06,0x7c,0x00,0x01,0x03,0x5c,0xfe,0xc0,0x00,0x01, +0x03,0x7a,0xfe,0xc0,0x00,0x01,0x02,0xf8,0x07,0x80,0x00,0x01,0x02,0xf8,0xff,0xf1,0x00,0x01,0x02,0xf8,0x06,0x40,0x00,0x01,0x02,0xf8,0xfe,0xc0,0x00,0x01,0x02,0xf8,0xff,0x24,0x00,0x01,0x02,0x58,0xff,0x24,0x00,0x01,0x03,0x02,0xfe,0x2a,0x00,0x01,0x04,0x38,0x06,0xa4,0x00,0x01,0x04,0x38,0x06,0x7c,0x00,0x01,0x02,0x6c,0x06,0x04, +0x00,0x01,0x02,0x6c,0xfe,0x2a,0x00,0x01,0x02,0x58,0x07,0x80,0x00,0x01,0x04,0x60,0x06,0x7c,0x00,0x01,0x01,0x90,0x06,0x04,0x00,0x01,0x02,0x8a,0xfe,0xc0,0x00,0x01,0x02,0x9e,0xff,0x24,0x00,0x01,0x02,0x4e,0xff,0xe7,0x00,0x01,0x01,0xcc,0xff,0xe7,0x00,0x01,0x01,0xc2,0x05,0x14,0x00,0x01,0x01,0xc2,0xfe,0xc0,0x00,0x01,0x04,0x24, +0x07,0x1c,0x00,0x01,0x03,0x52,0x05,0xf0,0x00,0x01,0x02,0x44,0x07,0xd0,0x00,0x01,0x01,0xae,0x06,0xa4,0x00,0x01,0x02,0x62,0x07,0x80,0x00,0x01,0x02,0x62,0xfe,0xc0,0x00,0x01,0x01,0xd6,0xfe,0xc0,0x00,0x01,0x01,0x2c,0x07,0x1c,0x00,0x01,0x01,0x68,0xfe,0xc0,0x00,0x01,0x02,0x26,0xff,0x24,0x00,0x01,0x01,0x80,0xff,0x24,0x00,0x01, +0x02,0x26,0xfe,0x2a,0x00,0x01,0x01,0x68,0xfe,0x2a,0x00,0x01,0x02,0x1c,0x05,0x14,0x00,0x01,0x02,0x1c,0xfe,0xc0,0x00,0x01,0x02,0x2b,0x05,0x14,0x00,0x01,0x02,0x80,0x07,0x80,0x00,0x01,0x05,0x14,0x06,0x7c,0x00,0x01,0x04,0x60,0x05,0x50,0x00,0x01,0x01,0xf4,0xfe,0xc0,0x00,0x01,0x03,0xde,0x07,0x80,0x00,0x01,0x07,0xee,0x06,0x7c, +0x00,0x01,0x02,0xf8,0x06,0x04,0x00,0x01,0x03,0xca,0xfe,0xc0,0x00,0x01,0x02,0xf3,0xfe,0xc0,0x00,0x01,0x02,0x6c,0x07,0x80,0x00,0x01,0x04,0xce,0x06,0x7c,0x00,0x01,0x01,0xd6,0x06,0x24,0x00,0x01,0x03,0xca,0x05,0x50,0x00,0x01,0x01,0xe0,0xff,0xf1,0x00,0x01,0x01,0xe0,0xfe,0xc0,0x00,0x01,0x01,0xcc,0xff,0x24,0x00,0x01,0x01,0x54, +0x07,0x1c,0x00,0x01,0x02,0xd0,0x06,0x18,0x00,0x01,0x03,0xd4,0x05,0x82,0x00,0x01,0x01,0x8b,0x07,0xb2,0x00,0x01,0x02,0x8e,0x06,0x92,0x00,0x01,0x00,0xf7,0xff,0xf1,0x00,0x01,0x04,0x64,0x05,0x4c,0x00,0x01,0x02,0x5a,0xff,0xe7,0x00,0x01,0x02,0x74,0x06,0x3a,0x00,0x01,0x04,0x98,0x05,0x4a,0x00,0x01,0x02,0x74,0xff,0xf1,0x00,0x01, +0x02,0x49,0x06,0x3a,0x00,0x01,0x04,0x93,0x05,0x9a,0x00,0x01,0x02,0x49,0xff,0xe7,0x00,0x01,0x04,0xb4,0x05,0xec,0x00,0x01,0x02,0x4f,0x06,0x52,0x00,0x01,0x04,0x4e,0x05,0x12,0x00,0x01,0x02,0x4f,0xff,0xe7,0x00,0x01,0x02,0x12,0x06,0x52,0x00,0x01,0x04,0xa6,0x05,0x62,0x00,0x01,0x02,0x12,0xff,0xe7,0x00,0x01,0x02,0xfa,0x06,0xd6, +0x00,0x01,0x05,0x96,0x06,0x83,0x00,0x01,0x02,0xfa,0xff,0xe7,0x00,0x01,0x02,0x3c,0x05,0x46,0x00,0x01,0x04,0x5a,0x05,0x25,0x00,0x01,0x02,0xce,0x06,0x3a,0x00,0x01,0x05,0x4c,0x05,0x4a,0x00,0x01,0x03,0x2a,0x06,0x3a,0x00,0x01,0x05,0x9e,0x05,0x4a,0x00,0x01,0x03,0x2a,0xff,0xf1,0x00,0x01,0x02,0x4a,0x06,0x3a,0x00,0x01,0x04,0x44, +0x05,0xea,0x00,0x01,0x02,0x4a,0xff,0xe7,0x00,0x01,0x04,0xb4,0x06,0x3c,0x00,0x01,0x02,0x5e,0x04,0xb8,0x00,0x01,0x04,0x6c,0x03,0xc8,0x00,0x01,0x02,0x5e,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x06,0x3a,0x00,0x01,0x03,0xbe,0x05,0xea,0x00,0x01,0x02,0x58,0x06,0x52,0x00,0x01,0x04,0x04,0x05,0xb2,0x00,0x01,0x02,0x44,0x06,0x3a,0x00,0x01, +0x03,0xe8,0x05,0xea,0x00,0x01,0x01,0x2c,0xfe,0x84,0x00,0x01,0x03,0x20,0x06,0xd6,0x00,0x01,0x05,0xd9,0x06,0x83,0x00,0x01,0x02,0x7c,0x06,0x3a,0x00,0x01,0x05,0x48,0x05,0xea,0x00,0x01,0x02,0x7c,0xfe,0x2a,0x00,0x01,0x03,0x7f,0x06,0x8c,0x00,0x01,0x06,0xae,0x05,0x4c,0x00,0x01,0x03,0x7f,0xff,0xe7,0x00,0x01,0x01,0x36,0x06,0x72, +0x00,0x01,0x01,0xfe,0x05,0xea,0x00,0x01,0x01,0x1d,0x06,0x3a,0x00,0x01,0x02,0x3a,0x05,0xea,0x00,0x01,0x02,0x52,0x06,0x52,0x00,0x01,0x04,0xf4,0x06,0x02,0x00,0x01,0x02,0x52,0xff,0xf1,0x00,0x01,0x01,0xfe,0x06,0xa2,0x00,0x01,0x03,0xfc,0x06,0xa2,0x00,0x01,0x01,0xfe,0xff,0xf1,0x00,0x01,0x00,0xf8,0x06,0x8c,0x00,0x01,0x01,0xa0, +0x06,0x3c,0x00,0x01,0x00,0xf8,0xff,0xf1,0x00,0x01,0x01,0xfe,0x06,0x8e,0x00,0x01,0x03,0xac,0x05,0x4e,0x00,0x01,0x03,0x91,0x06,0x3a,0x00,0x01,0x06,0xd3,0x05,0xea,0x00,0x01,0x03,0x91,0xff,0xe7,0x00,0x01,0x02,0xfe,0x06,0x3a,0x00,0x01,0x05,0xac,0x05,0xea,0x00,0x01,0x03,0x97,0xff,0xf1,0x00,0x01,0x02,0x4d,0x04,0xb8,0x00,0x01, +0x04,0x4a,0x04,0x18,0x00,0x01,0x02,0x4d,0xfe,0x70,0x00,0x01,0x03,0x04,0x06,0x52,0x00,0x01,0x05,0xb8,0x05,0x62,0x00,0x01,0x03,0x04,0xff,0xe7,0x00,0x01,0x03,0xe0,0x06,0x52,0x00,0x01,0x07,0x48,0x06,0x02,0x00,0x01,0x03,0xe0,0xff,0xe7,0x00,0x01,0x03,0x29,0x04,0xb8,0x00,0x01,0x06,0x02,0x04,0x68,0x00,0x01,0x03,0x29,0xff,0xe7, +0x00,0x01,0x02,0x67,0x06,0x3a,0x00,0x01,0x04,0x7f,0x05,0x9a,0x00,0x01,0x02,0x67,0xff,0xf1,0x00,0x01,0x02,0x5a,0x06,0xa2,0x00,0x01,0x04,0x64,0x05,0x62,0x00,0x01,0x02,0x4e,0x06,0x3a,0x00,0x01,0x04,0x4c,0x04,0xfa,0x00,0x01,0x02,0x4e,0xff,0x51,0x00,0x01,0x02,0x10,0x06,0x3a,0x00,0x01,0x03,0xd1,0x05,0xea,0x00,0x01,0x02,0x10, +0xff,0xf1,0x00,0x01,0x00,0xaa,0x06,0xa2,0x00,0x01,0x02,0x0e,0x05,0xb2,0x00,0x01,0x01,0x6b,0xfe,0x2a,0x00,0x01,0x01,0x5c,0x05,0xcf,0x00,0x01,0x02,0xb8,0x05,0x2f,0x00,0x01,0x01,0x5c,0xfe,0x84,0x00,0x01,0x02,0x19,0x06,0x3a,0x00,0x01,0x04,0x33,0x05,0xea,0x00,0x01,0x02,0x19,0xff,0xf1,0x00,0x01,0x01,0x5c,0x06,0xa2,0x00,0x01, +0x03,0x08,0x06,0x52,0x00,0x01,0x01,0x5c,0xff,0xe7,0x00,0x01,0x02,0x19,0xfe,0x84,0x00,0x01,0x03,0x05,0x06,0x3a,0x00,0x01,0x06,0x0a,0x05,0xea,0x00,0x01,0x03,0x05,0xff,0xe7,0x00,0x01,0x02,0xd9,0x06,0x52,0x00,0x01,0x05,0x12,0x06,0x02,0x00,0x01,0x02,0xd9,0xff,0xe7,0x00,0x01,0x02,0x81,0x06,0x52,0x00,0x01,0x04,0xde,0x06,0x02, +0x00,0x01,0x02,0x81,0xff,0xf1,0x00,0x01,0x02,0x7b,0x05,0x14,0x00,0x01,0x04,0xc3,0x04,0x18,0x00,0x01,0x02,0x7b,0xfe,0x2a,0x00,0x01,0x02,0xee,0xfe,0x2a,0x00,0x01,0x02,0x28,0x06,0x3a,0x00,0x01,0x03,0xb0,0x06,0x3a,0x00,0x01,0x02,0x28,0xff,0xe7,0x00,0x01,0x01,0x85,0x04,0xa0,0x00,0x01,0x02,0xba,0x04,0xa0,0x00,0x01,0x01,0x85, +0xff,0xe7,0x00,0x01,0x02,0x2f,0x04,0xb8,0x00,0x01,0x04,0x5e,0x04,0x18,0x00,0x01,0x01,0x4b,0xfe,0x2a,0x00,0x01,0x07,0xbc,0x07,0xb0,0x00,0x01,0x09,0xe8,0x06,0xa4,0x00,0x01,0x07,0xbc,0xff,0xf1,0x00,0x01,0x07,0x6c,0x06,0x54,0x00,0x01,0x09,0x1c,0x05,0x50,0x00,0x01,0x07,0x6c,0xff,0xf1,0x00,0x01,0x06,0x86,0x06,0x54,0x00,0x01, +0x08,0x33,0x05,0x50,0x00,0x01,0x06,0x86,0xff,0xf1,0x00,0x01,0x05,0xd2,0x06,0x3a,0x00,0x01,0x06,0x89,0x05,0xdc,0x00,0x01,0x05,0x7b,0xff,0xe7,0x00,0x01,0x04,0xc4,0x06,0x79,0x00,0x01,0x05,0x72,0x06,0x0e,0x00,0x01,0x04,0x6e,0xfe,0x2a,0x00,0x01,0x03,0x0c,0x06,0x8c,0x00,0x01,0x03,0xb1,0x06,0x0e,0x00,0x01,0x02,0xa8,0xfe,0x2a, +0x00,0x01,0x07,0x8f,0x06,0x3a,0x00,0x01,0x08,0x44,0x05,0xdc,0x00,0x01,0x07,0x40,0xff,0xe7,0x00,0x01,0x06,0xc2,0x06,0x79,0x00,0x01,0x07,0x6e,0x06,0x0e,0x00,0x01,0x06,0x72,0xfe,0x2a,0x00,0x01,0x05,0x78,0x06,0x79,0x00,0x01,0x06,0x27,0x06,0x0e,0x00,0x01,0x05,0x23,0xfe,0x2a,0x00,0x01,0x01,0xfe,0x06,0x54,0x00,0x01,0x01,0xfe, +0xff,0xe7,0x00,0x01,0x02,0x44,0x05,0x82,0x00,0x01,0x02,0xc6,0x07,0xb0,0x00,0x01,0x02,0xc6,0xff,0xe7,0x00,0x01,0x04,0x92,0x07,0x30,0x00,0x01,0x06,0x92,0x06,0x7c,0x00,0x01,0x04,0x92,0xff,0xf1,0x00,0x01,0x03,0x50,0x06,0x04,0x00,0x01,0x06,0x50,0x05,0x50,0x00,0x01,0x03,0x50,0xff,0xe7,0x00,0x01,0x02,0xda,0x07,0xb0,0x00,0x01, +0x02,0xda,0xff,0xe7,0x00,0x01,0x01,0xfe,0x07,0xb2,0x00,0x01,0x03,0x02,0xfe,0x70,0x00,0x01,0x02,0x58,0xfe,0x70,0x00,0x01,0x02,0x08,0x07,0xb0,0x00,0x01,0x01,0x7c,0x06,0x54,0x00,0x01,0x01,0x7c,0xfe,0x2a,0x00,0x01,0x02,0x94,0x06,0x0e,0x00,0x01,0x07,0xda,0x06,0xe0,0x00,0x01,0x09,0xe8,0x05,0xdc,0x00,0x01,0x07,0xda,0xff,0xf1, +0x00,0x01,0x07,0x6c,0x05,0xb4,0x00,0x01,0x09,0x1c,0x04,0xb0,0x00,0x01,0x06,0x86,0x05,0xb4,0x00,0x01,0x08,0x33,0x04,0xb0,0x00,0x01,0x07,0xae,0x05,0xdc,0x00,0x01,0x02,0xc1,0x06,0x52,0x00,0x01,0x05,0x83,0x05,0xb2,0x00,0x01,0x01,0x62,0xfe,0x2a,0x00,0x01,0x04,0x83,0x06,0xa4,0x00,0x01,0x04,0x4c,0x06,0xa4,0x00,0x01,0x02,0x30, +0x06,0xa4,0x00,0x01,0x01,0xf4,0x05,0x50,0x00,0x01,0x01,0xb8,0x06,0x54,0x00,0x01,0x01,0xb8,0x06,0x52,0x00,0x01,0x03,0xb8,0x05,0x62,0x00,0x01,0x01,0xb8,0xfe,0x2a,0x00,0x01,0x01,0x90,0x04,0xb8,0x00,0x01,0x03,0x20,0x03,0xc8,0x00,0x01,0x01,0x90,0xfe,0x2a,0x00,0x01,0x04,0x1a,0x06,0xa4,0x00,0x01,0x02,0xef,0x06,0x52,0x00,0x01, +0x05,0x3f,0x05,0xb2,0x00,0x01,0x02,0xef,0xfe,0x2a,0x00,0x01,0x02,0x5c,0x06,0x3a,0x00,0x01,0x04,0x68,0x05,0x9a,0x00,0x01,0x02,0x5c,0xff,0xe7,0x00,0x01,0x02,0x44,0x06,0x8c,0x00,0x01,0x04,0x39,0x05,0xec,0x00,0x01,0x02,0x48,0xff,0x24,0x00,0x01,0x01,0xcf,0xff,0x24,0x00,0x01,0x02,0x05,0x04,0xb8,0x00,0x01,0x03,0xba,0x03,0xc8, +0x00,0x01,0x02,0x05,0xff,0xe7,0x00,0x01,0x02,0x79,0x04,0xb8,0x00,0x01,0x04,0xa2,0x04,0x68,0x00,0x01,0x02,0x79,0xff,0xe7,0x00,0x01,0x04,0xa2,0x04,0x18,0x00,0x01,0x02,0x5b,0x06,0xa2,0x00,0x01,0x04,0x66,0x05,0xaa,0x00,0x01,0x02,0x5b,0xff,0xe7,0x00,0x01,0x01,0xab,0x04,0xb8,0x00,0x01,0x03,0x6a,0x03,0xc8,0x00,0x01,0x01,0xab, +0xff,0xe7,0x00,0x01,0x02,0x08,0x04,0xb8,0x00,0x01,0x02,0x08,0xff,0x51,0x00,0x01,0x02,0x5b,0x06,0x8c,0x00,0x01,0x04,0x66,0x05,0xec,0x00,0x01,0x02,0x5b,0xfe,0x2a,0x00,0x01,0x05,0x56,0x06,0x52,0x00,0x01,0x02,0x17,0x04,0xb8,0x00,0x01,0x02,0x17,0xff,0xe7,0x00,0x01,0x01,0xf5,0x04,0xb8,0x00,0x01,0x04,0x96,0x03,0xc8,0x00,0x01, +0x01,0xf5,0xff,0xe7,0x00,0x01,0x01,0xbb,0x04,0xb8,0x00,0x01,0x02,0xfe,0x03,0xc8,0x00,0x01,0x01,0xbb,0xff,0xe7,0x00,0x01,0x01,0x93,0x04,0xb8,0x00,0x01,0x01,0x93,0xff,0xe7,0x00,0x01,0x03,0xa0,0x03,0xc8,0x00,0x01,0x02,0x34,0x04,0xb8,0x00,0x01,0x04,0x18,0x03,0xc8,0x00,0x01,0x02,0x34,0xff,0xe7,0x00,0x01,0x01,0x1c,0x04,0xa0, +0x00,0x01,0x02,0x38,0x04,0x50,0x00,0x01,0x01,0x1c,0xfe,0x2a,0x00,0x01,0x02,0x5b,0x06,0x72,0x00,0x01,0x02,0x1e,0x04,0xb8,0x00,0x01,0x03,0xec,0x04,0x18,0x00,0x01,0x02,0x1e,0xff,0xe7,0x00,0x01,0x01,0xea,0x04,0xa0,0x00,0x01,0x03,0xd5,0x04,0x50,0x00,0x01,0x01,0xea,0xfe,0x2a,0x00,0x01,0x01,0xd4,0x04,0xb8,0x00,0x01,0x03,0xa8, +0x04,0x68,0x00,0x01,0x01,0xd4,0xff,0xe7,0x00,0x01,0x02,0x43,0x04,0xe2,0x00,0x01,0x04,0x37,0x04,0x50,0x00,0x01,0x02,0x43,0xfe,0x2a,0x00,0x01,0x02,0x43,0x06,0xa2,0x00,0x01,0x04,0x1a,0x05,0x78,0x00,0x01,0x01,0x0c,0x06,0x29,0x00,0x01,0x01,0xc8,0x05,0x89,0x00,0x01,0x01,0x0c,0xff,0xf1,0x00,0x01,0x00,0xe1,0x04,0xa0,0x00,0x01, +0x01,0xea,0x04,0x50,0x00,0x01,0x01,0x40,0x04,0xa0,0x00,0x01,0x02,0x90,0x04,0x50,0x00,0x01,0x01,0x40,0xff,0xf1,0x00,0x01,0x01,0x18,0x06,0x8c,0x00,0x01,0x02,0x3e,0x05,0x9c,0x00,0x01,0x01,0x18,0xff,0xf1,0x00,0x01,0x01,0x9a,0x06,0x8c,0x00,0x01,0x03,0x02,0x05,0x9c,0x00,0x01,0x01,0x9a,0xff,0xf1,0x00,0x01,0x00,0xf7,0x06,0x8c, +0x00,0x01,0x01,0xee,0x05,0x9c,0x00,0x01,0x01,0x3f,0xfe,0x2a,0x00,0x01,0x02,0xf8,0x06,0x72,0x00,0x01,0x04,0xd3,0x04,0xb0,0x00,0x01,0x02,0xf8,0xfe,0x2a,0x00,0x01,0x03,0x7a,0x04,0xa0,0x00,0x01,0x06,0x94,0x04,0x50,0x00,0x01,0x03,0x7a,0xfe,0x2a,0x00,0x01,0x02,0x11,0xff,0xf1,0x00,0x01,0x02,0x58,0x04,0xa0,0x00,0x01,0x04,0x60, +0x04,0x50,0x00,0x01,0x02,0x58,0x04,0xb8,0x00,0x01,0x04,0x60,0x03,0xc8,0x00,0x01,0x03,0x6b,0x04,0xb6,0x00,0x01,0x05,0x96,0x04,0x66,0x00,0x01,0x03,0x6b,0xff,0xe7,0x00,0x01,0x02,0xdf,0x04,0xb8,0x00,0x01,0x05,0x74,0x03,0xc8,0x00,0x01,0x02,0xdf,0xff,0xe7,0x00,0x01,0x02,0x8d,0x06,0x8c,0x00,0x01,0x04,0xca,0x05,0x4c,0x00,0x01, +0x02,0x8d,0xfe,0x2a,0x00,0x01,0x01,0xd1,0x04,0xa0,0x00,0x01,0x02,0x78,0x04,0x50,0x00,0x01,0x01,0x64,0xff,0xe7,0x00,0x01,0x01,0xd1,0x06,0x8c,0x00,0x01,0x02,0x78,0x06,0x3c,0x00,0x01,0x01,0x64,0xfe,0x2a,0x00,0x01,0x01,0xcc,0x04,0xb2,0x00,0x01,0x01,0x86,0x04,0xb8,0x00,0x01,0x02,0xfe,0x04,0x68,0x00,0x01,0x00,0xe1,0xff,0xf1, +0x00,0x01,0x01,0x18,0x04,0xb8,0x00,0x01,0x02,0x5e,0x04,0x18,0x00,0x01,0x01,0xcc,0xff,0xf1,0x00,0x01,0x01,0xef,0x04,0xa0,0x00,0x01,0x03,0xa2,0x04,0x00,0x00,0x01,0x01,0xef,0xff,0xf1,0x00,0x01,0x03,0xa2,0x04,0x50,0x00,0x01,0x01,0xae,0xfe,0xa2,0x00,0x01,0x01,0x4a,0x06,0xa2,0x00,0x01,0x02,0x9a,0x06,0x52,0x00,0x01,0x00,0xb4, +0xfe,0x2a,0x00,0x01,0x01,0x5e,0x06,0xa2,0x00,0x01,0x02,0xb0,0x06,0x52,0x00,0x01,0x00,0xc8,0xfe,0x2a,0x00,0x01,0x00,0xb4,0x06,0xa2,0x00,0x01,0x01,0xfe,0x05,0xb2,0x00,0x01,0x01,0x4a,0xff,0xe7,0x00,0x01,0x01,0x68,0x06,0xa2,0x00,0x01,0x02,0xe4,0x06,0x52,0x00,0x01,0x00,0xdc,0xfe,0x2a,0x00,0x01,0x01,0x2c,0x04,0xb6,0x00,0x01, +0x02,0x68,0x03,0xc6,0x00,0x01,0x01,0x90,0xfe,0xd4,0x00,0x01,0x01,0x80,0xfe,0x2a,0x00,0x01,0x02,0x65,0x04,0xa0,0x00,0x01,0x04,0x7b,0x04,0x50,0x00,0x01,0x02,0x65,0xff,0xe7,0x00,0x01,0x02,0x61,0x04,0xa0,0x00,0x01,0x04,0xc2,0x04,0x50,0x00,0x01,0x02,0x61,0xff,0xe7,0x00,0x01,0x02,0x3b,0x04,0xb8,0x00,0x01,0x04,0x27,0x04,0x68, +0x00,0x01,0x02,0x3b,0xff,0xe7,0x00,0x01,0x01,0xf4,0x04,0xa0,0x00,0x01,0x03,0x35,0x04,0x50,0x00,0x01,0x02,0xe4,0x04,0xa0,0x00,0x01,0x05,0x28,0x04,0x50,0x00,0x01,0x02,0xe4,0xff,0xf1,0x00,0x01,0x01,0xef,0x06,0x8c,0x00,0x01,0x03,0xdf,0x05,0x9c,0x00,0x01,0x01,0xab,0x04,0xa0,0x00,0x01,0x03,0x56,0x04,0x50,0x00,0x01,0x01,0xab, +0xff,0xf1,0x00,0x01,0x01,0xc2,0xfe,0xd4,0x00,0x01,0x02,0x0c,0xff,0x51,0x00,0x01,0x01,0x90,0x05,0x14,0x00,0x01,0x01,0x76,0x06,0xa2,0x00,0x01,0x03,0x3c,0x05,0xb2,0x00,0x01,0x01,0x2c,0xff,0xf1,0x00,0x01,0x02,0xec,0x05,0xb2,0x00,0x01,0x01,0xa4,0xff,0xf1,0x00,0x01,0x02,0x9c,0x05,0x4c,0x00,0x01,0x01,0x58,0xff,0xe7,0x00,0x01, +0x02,0x3a,0x04,0xb8,0x00,0x01,0x03,0xba,0x04,0x68,0x00,0x01,0x02,0x71,0x06,0xa4,0x00,0x01,0x04,0x74,0x05,0xdc,0x00,0x01,0x02,0x71,0xff,0xe7,0x00,0x01,0x03,0x8f,0x04,0x00,0x00,0x01,0x02,0x31,0x04,0xb8,0x00,0x01,0x04,0x12,0x03,0xc8,0x00,0x01,0x02,0x31,0xff,0xe7,0x00,0x01,0x02,0x8a,0x05,0x46,0x00,0x01,0x04,0xdc,0x04,0xe2, +0x00,0x01,0x02,0x8a,0xff,0xe7,0x00,0x01,0x02,0x43,0x04,0xa0,0x00,0x01,0x01,0x04,0x06,0x79,0x00,0x01,0x01,0x9e,0x05,0x89,0x00,0x01,0x00,0x62,0xfe,0x2a,0x00,0x01,0x01,0xfe,0x04,0xa0,0x00,0x01,0x03,0xac,0x04,0x50,0x00,0x01,0x01,0xfe,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x04,0xa0,0x00,0x01,0x03,0x14,0x03,0xb0,0x00,0x01,0x05,0x56, +0x06,0x02,0x00,0x01,0x05,0xaa,0x06,0x72,0x00,0x01,0x07,0x54,0x04,0xb0,0x00,0x01,0x05,0xaa,0xff,0xf1,0x00,0x01,0x07,0x98,0x04,0xb0,0x00,0x01,0x05,0xaa,0xfe,0x2a,0x00,0x01,0x07,0x7f,0x04,0xb0,0x00,0x01,0x05,0xaa,0xff,0x51,0x00,0x01,0x03,0x6f,0x05,0x78,0x00,0x01,0x04,0x98,0x04,0xb0,0x00,0x01,0x03,0x6f,0xff,0xf1,0x00,0x01, +0x02,0xaa,0x06,0x52,0x00,0x01,0x04,0x6f,0x06,0x52,0x00,0x01,0x02,0xaa,0xfe,0x2a,0x00,0x01,0x04,0x05,0x05,0x78,0x00,0x01,0x05,0x6e,0x04,0x8f,0x00,0x01,0x04,0x05,0xff,0xe7,0x00,0x01,0x04,0x70,0x06,0x72,0x00,0x01,0x04,0x70,0xfe,0x2a,0x00,0x01,0x03,0x3f,0x06,0x72,0x00,0x01,0x04,0x54,0x04,0xb0,0x00,0x01,0x03,0x3f,0xff,0xe7, +0x00,0x01,0x02,0xee,0x06,0x72,0x00,0x01,0x04,0x8e,0x04,0xb0,0x00,0x01,0x02,0xee,0xff,0xf1,0x00,0x01,0x02,0x08,0x06,0x3a,0x00,0x01,0x04,0x44,0x05,0x9a,0x00,0x01,0x01,0xfa,0xff,0xf1,0x00,0x01,0x01,0xfa,0x06,0x3a,0x00,0x01,0x00,0xf0,0x05,0x14,0x00,0x01,0x01,0xa4,0x04,0xb0,0x00,0x01,0x01,0x09,0x05,0x14,0x00,0x01,0x02,0x1c, +0x06,0x8c,0x00,0x01,0x04,0x87,0x06,0x8c,0x00,0x01,0x02,0x1c,0xfe,0x2a,0x00,0x01,0x00,0xfa,0x06,0x8c,0x00,0x01,0x01,0x96,0x06,0x8c,0x00,0x01,0x02,0x4e,0x04,0xb8,0x00,0x01,0x03,0xec,0x04,0xb8,0x00,0x01,0x01,0x2c,0x05,0xcf,0x00,0x01,0x01,0xe5,0x05,0x7f,0x00,0x01,0x01,0x2c,0xfe,0x2a,0x00,0x01,0x04,0x6c,0x04,0x68,0x00,0x01, +0x03,0xbd,0x06,0x72,0x00,0x01,0x06,0xba,0x05,0x78,0x00,0x01,0x03,0xbd,0xff,0xe7,0x00,0x01,0x03,0xbd,0x05,0x14,0x00,0x01,0x06,0xba,0x04,0xb0,0x00,0x01,0x03,0xbd,0xfe,0x2a,0x00,0x01,0x02,0x8c,0x06,0x90,0x00,0x01,0x03,0x93,0x06,0x7c,0x00,0x01,0x02,0x9e,0xff,0xa1,0x00,0x01,0x02,0xee,0x06,0x90,0x00,0x01,0x04,0x7c,0x06,0x2c, +0x00,0x01,0x02,0xee,0xff,0x97,0x00,0x01,0x02,0x26,0x05,0xb4,0x00,0x01,0x04,0x52,0x04,0xd1,0x00,0x01,0x02,0x3a,0xff,0x97,0x00,0x01,0x02,0x26,0x06,0x90,0x00,0x01,0x04,0x9c,0x06,0x2c,0x00,0x01,0x02,0x26,0xff,0xa1,0x00,0x01,0x01,0xae,0xfe,0x8e,0x00,0x01,0x01,0xc2,0xfe,0x8e,0x00,0x01,0x02,0x0b,0x06,0x7a,0x00,0x01,0x03,0xc6, +0x06,0x02,0x00,0x01,0x01,0x9b,0x05,0x14,0x00,0x01,0x02,0xd6,0x04,0xb0,0x00,0x01,0x00,0xe6,0xff,0xf1,0x00,0x01,0x02,0x5b,0x04,0xb8,0x00,0x01,0x04,0xb6,0x04,0x18,0x00,0x01,0x01,0xd8,0x06,0x3a,0x00,0x01,0x03,0xb1,0x05,0x9a,0x00,0x01,0x01,0xd8,0xff,0xf1,0x00,0x01,0x02,0x4f,0x04,0xa0,0x00,0x01,0x04,0x9f,0x04,0x50,0x00,0x01, +0x02,0x4f,0xfe,0x2a,0x00,0x01,0x05,0x11,0x06,0xc2,0x00,0x01,0x06,0x83,0x05,0x78,0x00,0x01,0x05,0x11,0xff,0xf1,0x00,0x01,0x01,0x48,0x04,0xa0,0x00,0x01,0x01,0x48,0xff,0xf1,0x00,0x01,0x01,0xa4,0x04,0xa0,0x00,0x01,0x02,0x23,0x04,0xa0,0x00,0x01,0x03,0xf6,0x04,0x50,0x00,0x01,0x02,0x23,0xff,0xe7,0x00,0x01,0x02,0x6c,0xfe,0xa2, +0x00,0x01,0x02,0x1c,0xfe,0xa2,0x00,0x01,0x01,0x36,0xfe,0xa2,0x00,0x01,0x02,0x4e,0xfe,0xa2,0x00,0x01,0x03,0x7a,0xfe,0xa2,0x00,0x01,0x01,0xf4,0xfe,0xa2,0x00,0x01,0x01,0xd6,0xfe,0xa2,0x00,0x01,0x01,0xc2,0xfe,0xa2,0x00,0x01,0x01,0xbb,0xfe,0xa2,0x00,0x01,0x01,0x93,0xfe,0xa2,0x00,0x01,0x01,0xdd,0x05,0x14,0x00,0x01,0x01,0xdd, +0xfe,0xa2,0x00,0x01,0x01,0xc4,0x04,0xa0,0x00,0x01,0x03,0x89,0x04,0x50,0x00,0x01,0x01,0xc4,0xfe,0x2a,0x00,0x01,0x02,0x60,0x04,0xee,0x00,0x01,0x04,0x71,0x04,0x4e,0x00,0x01,0x02,0x60,0xff,0xe7,0x00,0x01,0x01,0x7a,0x05,0xd0,0x00,0x01,0x02,0xa4,0x05,0x30,0x00,0x01,0x02,0x58,0xff,0x6a,0x00,0x01,0x02,0x3a,0x05,0x8d,0x00,0x01, +0x04,0x2f,0x05,0x00,0x00,0x01,0x03,0x00,0x06,0x52,0x00,0x01,0x05,0x4d,0x06,0x02,0x00,0x01,0x03,0x00,0xff,0x06,0x00,0x01,0x02,0x5b,0x05,0x14,0x00,0x01,0x04,0x34,0x04,0x68,0x00,0x01,0x02,0x5b,0xff,0x06,0x00,0x01,0x01,0xce,0x04,0xa1,0x00,0x01,0x03,0x20,0x04,0xa1,0x00,0x01,0x01,0xce,0xff,0xf1,0x00,0x01,0x01,0x22,0x06,0x72, +0x00,0x01,0x01,0x22,0xff,0xf1,0x00,0x01,0x02,0x9e,0xfe,0x8e,0x00,0x01,0x02,0x08,0x05,0x8d,0x00,0x01,0x03,0x9a,0x05,0x00,0x00,0x01,0x01,0x2c,0x05,0xea,0x00,0x01,0x02,0x66,0x05,0xc8,0x00,0x01,0x01,0x80,0xff,0x06,0x00,0x01,0x04,0x4c,0x04,0xb0,0x00,0x01,0x02,0xcc,0x04,0xb8,0x00,0x01,0x04,0xb0,0x04,0xb0,0x00,0x01,0x02,0xcc, +0xff,0xe7,0x00,0x01,0x01,0x18,0x04,0xba,0x00,0x01,0x01,0x04,0x04,0xba,0x00,0x01,0x00,0x00,0x04,0xba,0x00,0x01,0xff,0xf6,0x04,0xb0,0x00,0x01,0x02,0x26,0x07,0x33,0x00,0x01,0x02,0x58,0x07,0x62,0x00,0x01,0x02,0x76,0x07,0xa8,0x00,0x01,0x02,0x94,0x06,0x3a,0x00,0x01,0x02,0x06,0x06,0x3a,0x00,0x01,0x02,0xff,0x06,0x3a,0x00,0x01, +0x02,0xee,0x07,0x4a,0x00,0x01,0x03,0x0c,0x07,0xa8,0x00,0x01,0x03,0x04,0x06,0x6a,0x00,0x01,0x03,0x04,0x06,0x3a,0x00,0x01,0x02,0x40,0x06,0x52,0x00,0x01,0x02,0x40,0x06,0x3a,0x00,0x01,0x03,0x22,0x06,0x3a,0x00,0x01,0x02,0x77,0x06,0x6a,0x00,0x01,0x02,0x58,0x06,0x3a,0x00,0x01,0x04,0x13,0x06,0x6a,0x00,0x01,0x03,0xd4,0x06,0x3a, +0x00,0x01,0x02,0x09,0x04,0xd0,0x00,0x01,0x02,0x08,0x04,0xd0,0x00,0x01,0x02,0x17,0x04,0xd0,0x00,0x01,0x02,0x53,0x04,0xa0,0x00,0x01,0x02,0x53,0x04,0xd0,0x00,0x01,0x02,0x3f,0x05,0xee,0x00,0x01,0x02,0x58,0x06,0x5e,0x00,0x01,0x02,0x58,0x04,0xd0,0x00,0x01,0x01,0xef,0x05,0x4a,0x00,0x01,0x01,0xef,0x04,0xd0,0x00,0x01,0x02,0xd6, +0x04,0xa0,0x00,0x01,0x02,0xd0,0x04,0xd0,0x00,0x01,0x01,0xd9,0x04,0xd0,0x00,0x01,0x03,0x40,0x04,0xd0,0x00,0x01,0x03,0x20,0x04,0xd0,0x00,0x01,0x02,0x03,0x04,0xa0,0x00,0x01,0x02,0x03,0x04,0xd0,0x00,0x01,0x02,0x17,0x05,0x9f,0x00,0x01,0x02,0x17,0x06,0x2c,0x00,0x01,0x01,0xdc,0x06,0x19,0x00,0x01,0x01,0xf4,0x06,0x5e,0x00,0x01, +0x02,0xe2,0x06,0x6a,0x00,0x01,0x02,0xe2,0x06,0x3a,0x00,0x01,0x00,0xc8,0x02,0xf8,0x00,0x01,0x03,0x0c,0x05,0x9a,0x00,0x01,0x03,0xc0,0x05,0x22,0x00,0x01,0x04,0x8e,0x05,0x82,0x00,0x01,0x04,0xaf,0x05,0x07,0x00,0x01,0x03,0x94,0x05,0x9a,0x00,0x01,0x03,0x9d,0x05,0x9a,0x00,0x01,0x04,0xcf,0x05,0x40,0x00,0x01,0x04,0xf7,0x05,0x9a, +0x00,0x01,0x01,0xe0,0x05,0x9a,0x00,0x01,0x02,0x2d,0x05,0xa0,0x00,0x01,0x04,0x2c,0x05,0x9a,0x00,0x01,0x01,0x6a,0x05,0x9a,0x00,0x01,0x06,0x6d,0x05,0x9a,0x00,0x01,0x05,0x45,0x05,0x9a,0x00,0x01,0x05,0x51,0x04,0x94,0x00,0x01,0x04,0x03,0x05,0x22,0x00,0x01,0x03,0xf7,0x05,0x22,0x00,0x01,0x03,0xad,0x05,0x82,0x00,0x01,0x04,0x01, +0x05,0x9a,0x00,0x01,0x04,0xd1,0x05,0xa0,0x00,0x01,0x04,0xd1,0x05,0x9a,0x00,0x01,0x07,0x47,0x05,0x9a,0x00,0x01,0x04,0x38,0x05,0x9a,0x00,0x01,0x04,0x4c,0x05,0x9a,0x00,0x01,0x03,0x70,0x03,0x8e,0x00,0x01,0x04,0x0f,0x03,0x92,0x00,0x01,0x03,0x5d,0x03,0xdf,0x00,0x01,0x04,0x08,0x05,0xe9,0x00,0x01,0x03,0x98,0x03,0x8e,0x00,0x01, +0x02,0xa2,0x05,0xf0,0x00,0x01,0x04,0x08,0x03,0xff,0x00,0x01,0x03,0xe2,0x03,0x35,0x00,0x01,0x01,0x4a,0x03,0xfc,0x00,0x01,0x01,0x4b,0x03,0xf8,0x00,0x01,0x03,0x82,0x04,0x02,0x00,0x01,0x01,0x40,0x05,0xe9,0x00,0x01,0x06,0x40,0x03,0xa0,0x00,0x01,0x03,0xd4,0x03,0xa0,0x00,0x01,0x03,0xfc,0x03,0x8e,0x00,0x01,0x03,0xfc,0x03,0xaf, +0x00,0x01,0x04,0x08,0x04,0x03,0x00,0x01,0x02,0xb3,0x04,0x06,0x00,0x01,0x02,0xe4,0x03,0xfc,0x00,0x01,0x02,0x74,0x03,0xfe,0x00,0x01,0x03,0xde,0x03,0xfc,0x00,0x01,0x03,0xc1,0x04,0x00,0x00,0x01,0x05,0xa0,0x04,0x00,0x00,0x01,0x03,0x66,0x04,0x00,0x00,0x01,0x03,0xc0,0x03,0xfc,0x00,0x01,0x03,0x52,0x04,0x00,0x00,0x01,0x06,0x30, +0x03,0x8e,0x00,0x01,0x04,0x3e,0x03,0x07,0x00,0x01,0x06,0xf4,0x03,0x8e,0x00,0x01,0x01,0x40,0x04,0x06,0x00,0x01,0x03,0x84,0x03,0xb8,0x00,0x01,0x03,0x6e,0x04,0x0c,0x00,0x01,0x04,0x9e,0x04,0x0c,0x00,0x01,0x03,0xd8,0x03,0xf1,0x00,0x01,0x02,0xf1,0x03,0xb8,0x00,0x01,0x03,0x42,0x03,0xe8,0x00,0x01,0x02,0xd6,0x03,0xfc,0x00,0x01, +0x02,0x80,0x03,0xfc,0x00,0x01,0x03,0xde,0x03,0xb8,0x00,0x01,0x03,0x9c,0x04,0x1a,0x00,0x01,0x01,0x61,0x03,0xfc,0x00,0x01,0x02,0x33,0x04,0x00,0x00,0x01,0x05,0x39,0x04,0x08,0x00,0x01,0x04,0x02,0x03,0xfc,0x00,0x01,0x04,0x5c,0x04,0x0f,0x00,0x01,0x02,0x56,0x03,0xfd,0x00,0x01,0x00,0x00,0x02,0x21,0x00,0x01,0x00,0x00,0x02,0x12, +0x00,0x01,0x00,0x00,0x02,0x58,0x00,0x01,0x02,0x94,0x02,0xcd,0x00,0x01,0x02,0x4b,0x02,0xcd,0x00,0x01,0x02,0xde,0x02,0xe5,0x00,0x01,0x02,0xee,0x02,0xcd,0x00,0x01,0x02,0x06,0x02,0xcd,0x00,0x01,0x01,0xf4,0x02,0xcd,0x00,0x01,0x02,0xbe,0x02,0xe5,0x00,0x01,0x02,0xd7,0x02,0xcd,0x00,0x01,0x01,0x10,0x02,0xcd,0x00,0x01,0x01,0xd1, +0x02,0xd9,0x00,0x01,0x00,0xed,0x03,0xeb,0x00,0x01,0x01,0x0e,0x02,0xcd,0x00,0x01,0x03,0xa2,0x03,0x42,0x00,0x01,0x02,0xfe,0x02,0xcd,0x00,0x01,0x03,0x04,0x02,0xe5,0x00,0x01,0x02,0x64,0x03,0xeb,0x00,0x01,0x03,0x04,0x02,0xe2,0x00,0x01,0x02,0x20,0x02,0xe5,0x00,0x01,0x02,0x18,0x02,0xcd,0x00,0x01,0x02,0xbf,0x02,0xd9,0x00,0x01, +0x02,0x7c,0x02,0xcd,0x00,0x01,0x03,0xbc,0x02,0xcd,0x00,0x01,0x02,0x5c,0x02,0xcd,0x00,0x01,0x02,0x36,0x01,0xae,0x00,0x01,0x02,0x48,0x02,0xcd,0x00,0x01,0x02,0x09,0x01,0x41,0x00,0x01,0x02,0x80,0x01,0xce,0x00,0x01,0x02,0x3d,0x02,0x18,0x00,0x01,0x02,0x44,0x02,0x1b,0x00,0x01,0x02,0x35,0x02,0x58,0x00,0x01,0x01,0x40,0x02,0x67, +0x00,0x01,0x02,0x37,0x01,0xfc,0x00,0x01,0x01,0x01,0x04,0x71,0x00,0x01,0x01,0x03,0x02,0x26,0x00,0x01,0x00,0xf8,0x01,0xef,0x00,0x01,0x00,0xfa,0x04,0x25,0x00,0x01,0x00,0xfa,0x02,0xf9,0x00,0x01,0x03,0x72,0x02,0x0c,0x00,0x01,0x02,0x4c,0x02,0x0c,0x00,0x01,0x02,0x53,0x02,0x18,0x00,0x01,0x02,0x7c,0x01,0xef,0x00,0x01,0x02,0x3d, +0x02,0x13,0x00,0x01,0x01,0x01,0x01,0xe5,0x00,0x01,0x01,0xb2,0x02,0x18,0x00,0x01,0x01,0x2c,0x02,0x1b,0x00,0x01,0x02,0x39,0x02,0x0c,0x00,0x01,0x02,0x17,0x02,0x6c,0x00,0x01,0x02,0xe4,0x02,0x00,0x00,0x01,0x01,0xd6,0x02,0x00,0x00,0x01,0x01,0xef,0x02,0x5a,0x00,0x01,0x01,0xcf,0x02,0x00,0x00,0x01,0x02,0x58,0x01,0xd7,0x00,0x01, +0x03,0x04,0x02,0xff,0x00,0x01,0x01,0xb2,0x01,0xd7,0x00,0x01,0x01,0x9d,0x01,0xd0,0x00,0x01,0x02,0x3c,0x01,0xcf,0x00,0x01,0x00,0xe5,0x02,0x0c,0x00,0x01,0x00,0xfd,0x03,0x28,0x00,0x01,0x02,0xf6,0x00,0x6f,0x00,0x01,0x00,0x00,0x05,0xc8,0x00,0x01,0x00,0x00,0x05,0xbe,0x00,0x01,0x00,0x00,0xff,0x6a,0x00,0x01,0x05,0x12,0x07,0x6c, +0x00,0x01,0x05,0x12,0xfe,0x5c,0x00,0x01,0x04,0x2f,0x07,0x6c,0x00,0x01,0x04,0x2f,0xfe,0x5c,0x00,0x01,0x04,0x8c,0x07,0x6c,0x00,0x01,0x04,0x8c,0xfe,0x5c,0x00,0x01,0x05,0x3e,0x07,0x6c,0x00,0x01,0x05,0x3e,0xfe,0x5c,0x00,0x01,0x03,0xb4,0x07,0x6c,0x00,0x01,0x03,0xb4,0xfe,0x5c,0x00,0x01,0x03,0x94,0x07,0x6c,0x00,0x01,0x03,0x94, +0xfe,0x5c,0x00,0x01,0x04,0xec,0x07,0x6c,0x00,0x01,0x04,0xec,0xfe,0x5c,0x00,0x01,0x04,0xf2,0x07,0x6c,0x00,0x01,0x04,0xf2,0xfe,0x5c,0x00,0x01,0x01,0xf0,0x07,0x6c,0x00,0x01,0x01,0xf0,0xfe,0x5c,0x00,0x01,0x02,0x2b,0x07,0x6c,0x00,0x01,0x02,0x2b,0xfe,0x5c,0x00,0x01,0x04,0xa2,0x07,0x6c,0x00,0x01,0x04,0xa2,0xfe,0x5c,0x00,0x01, +0x03,0xa4,0x07,0x6c,0x00,0x01,0x03,0xa4,0xfe,0x5c,0x00,0x01,0x06,0x72,0x07,0x6c,0x00,0x01,0x06,0x72,0xfe,0x5c,0x00,0x01,0x05,0x40,0x07,0x6c,0x00,0x01,0x05,0x40,0xfe,0x5c,0x00,0x01,0x05,0xaa,0x07,0x6c,0x00,0x01,0x05,0xaa,0xfe,0x5c,0x00,0x01,0x04,0x29,0x07,0x6c,0x00,0x01,0x04,0x29,0xfe,0x5c,0x00,0x01,0x05,0xcc,0x07,0x6c, +0x00,0x01,0x05,0xcc,0xfe,0x5c,0x00,0x01,0x04,0xc0,0x07,0x6c,0x00,0x01,0x04,0xc0,0xfe,0x5c,0x00,0x01,0x03,0xde,0x07,0x6c,0x00,0x01,0x03,0xde,0xfe,0x5c,0x00,0x01,0x04,0x0c,0x07,0x6c,0x00,0x01,0x04,0x0c,0xfe,0x5c,0x00,0x01,0x04,0xd5,0x07,0x6c,0x00,0x01,0x04,0xd5,0xfe,0x5c,0x00,0x01,0x04,0xe6,0x07,0x6c,0x00,0x01,0x04,0xe6, +0xfe,0x5c,0x00,0x01,0x07,0x60,0x07,0x6c,0x00,0x01,0x07,0x60,0xfe,0x5c,0x00,0x01,0x04,0x9a,0x07,0x6c,0x00,0x01,0x04,0x9a,0xfe,0x5c,0x00,0x01,0x04,0x60,0x07,0x6c,0x00,0x01,0x04,0x60,0xfe,0x5c,0x00,0x01,0x04,0x64,0x07,0x6c,0x00,0x01,0x04,0x64,0xfe,0x5c,0x00,0x01,0x03,0x83,0x07,0x6c,0x00,0x01,0x03,0x83,0xfe,0x5c,0x00,0x01, +0x04,0x54,0x07,0x6c,0x00,0x01,0x04,0x54,0xfe,0x5c,0x00,0x01,0x03,0x62,0x07,0x6c,0x00,0x01,0x03,0x62,0xfe,0x5c,0x00,0x01,0x04,0x10,0x07,0x6c,0x00,0x01,0x04,0x10,0xfe,0x5c,0x00,0x01,0x03,0xdd,0x07,0x6c,0x00,0x01,0x03,0xdd,0xfe,0x5c,0x00,0x01,0x02,0xa0,0x07,0x6c,0x00,0x01,0x02,0xa0,0xfe,0x5c,0x00,0x01,0x03,0xf8,0x07,0x6c, +0x00,0x01,0x03,0xf8,0xfe,0x5c,0x00,0x01,0x01,0x66,0x07,0x6c,0x00,0x01,0x01,0x66,0xfe,0x5c,0x00,0x01,0x01,0x4a,0x07,0x6c,0x00,0x01,0x01,0x4a,0xfe,0x5c,0x00,0x01,0x06,0x54,0x07,0x6c,0x00,0x01,0x06,0x54,0xfe,0x5c,0x00,0x01,0x04,0x50,0x07,0x6c,0x00,0x01,0x04,0x50,0xfe,0x5c,0x00,0x01,0x02,0xbc,0x07,0x6c,0x00,0x01,0x02,0xbc, +0xfe,0x5c,0x00,0x01,0x03,0x0f,0x07,0x6c,0x00,0x01,0x03,0x0f,0xfe,0x5c,0x00,0x01,0x02,0x81,0x07,0x6c,0x00,0x01,0x02,0x81,0xfe,0x5c,0x00,0x01,0x03,0xe2,0x07,0x6c,0x00,0x01,0x03,0xe2,0xfe,0x5c,0x00,0x01,0x03,0xcb,0x07,0x6c,0x00,0x01,0x03,0xcb,0xfe,0x5c,0x00,0x01,0x05,0xb0,0x07,0x6c,0x00,0x01,0x05,0xb0,0xfe,0x5c,0x00,0x01, +0x03,0x92,0x07,0x6c,0x00,0x01,0x03,0x92,0xfe,0x5c,0x00,0x01,0x03,0xd5,0x07,0x6c,0x00,0x01,0x03,0xd5,0xfe,0x5c,0x00,0x01,0x03,0x70,0x07,0x6c,0x00,0x01,0x03,0x70,0xfe,0x5c,0x00,0x01,0x05,0x12,0x08,0x34,0x00,0x01,0x05,0x40,0x08,0x34,0x00,0x01,0x05,0xaa,0x08,0x34,0x00,0x01,0x04,0xd5,0x08,0x34,0x00,0x01,0x01,0xdd,0x07,0x6c, +0x00,0x01,0x01,0xdd,0xfe,0x5c,0x00,0x01,0x01,0x71,0x07,0x6c,0x00,0x01,0x01,0x71,0xfe,0x5c,0x00,0x01,0x02,0x07,0x07,0x6c,0x00,0x01,0x02,0x07,0xfe,0x5c,0x00,0x01,0x02,0x10,0x07,0x6c,0x00,0x01,0x02,0x10,0xfe,0x5c,0x00,0x01,0x04,0x14,0x07,0x6c,0x00,0x01,0x04,0x14,0xfe,0x5c,0x00,0x01,0x06,0x83,0x07,0x6c,0x00,0x01,0x06,0x83, +0xfe,0x5c,0x00,0x01,0x06,0x56,0x07,0x6c,0x00,0x01,0x06,0x56,0xfe,0x5c,0x00,0x01,0x04,0x96,0x07,0x6c,0x00,0x01,0x04,0x96,0xfe,0x5c,0x00,0x01,0x03,0xb8,0x07,0x6c,0x00,0x01,0x03,0xb8,0xfe,0x5c,0x00,0x01,0x07,0x12,0x07,0x6c,0x00,0x01,0x07,0x12,0xfe,0x5c,0x00,0x01,0x07,0x21,0x07,0x6c,0x00,0x01,0x07,0x21,0xfe,0x5c,0x00,0x01, +0x03,0xb4,0x08,0x34,0x00,0x01,0x01,0xfd,0x08,0x34,0x00,0x01,0x01,0xfd,0xfe,0x5c,0x00,0x01,0x02,0x30,0x08,0x34,0x00,0x01,0x02,0x30,0xfe,0x5c,0x00,0x01,0x02,0x38,0x08,0x34,0x00,0x01,0x02,0x38,0xfe,0x5c,0x00,0x01,0x01,0xf0,0x08,0x34,0x00,0x01,0x02,0x12,0x07,0x6c,0x00,0x01,0x02,0x12,0xfe,0x5c,0x00,0x01,0x03,0xde,0x08,0x34, +0x00,0x01,0x04,0x64,0x08,0x34,0x00,0x01,0x04,0x18,0x07,0x6c,0x00,0x01,0x04,0x18,0xfe,0x5c,0x00,0x01,0x04,0x60,0x08,0x34,0x00,0x01,0x04,0xec,0x08,0x34,0x00,0x01,0x04,0x8c,0x08,0x34,0x00,0x01,0x04,0x98,0x07,0x6c,0x00,0x01,0x04,0x98,0xfe,0x5c,0x00,0x01,0x05,0x3e,0x08,0x34,0x00,0x01,0x05,0xb3,0x07,0x6c,0x00,0x01,0x05,0xb3, +0xfe,0x5c,0x00,0x01,0x03,0xa4,0x08,0x34,0x00,0x01,0x02,0x13,0x07,0x6c,0x00,0x01,0x02,0x13,0xfe,0x5c,0x00,0x01,0x02,0xc3,0x07,0x6c,0x00,0x01,0x02,0xc3,0xfe,0x5c,0x00,0x01,0x02,0x87,0x07,0x6c,0x00,0x01,0x02,0x87,0xfe,0x5c,0x00,0x01,0x04,0xc0,0x08,0x34,0x00,0x01,0x02,0xc9,0x07,0x6c,0x00,0x01,0x02,0xc9,0xfe,0x5c,0x00,0x01, +0x02,0x9a,0x07,0x6c,0x00,0x01,0x02,0x9a,0xfe,0x5c,0x00,0x01,0x04,0x0c,0x08,0x34,0x00,0x01,0x03,0xd3,0x07,0x6c,0x00,0x01,0x03,0xd3,0xfe,0x5c,0x00,0x01,0x04,0x4e,0x07,0x6c,0x00,0x01,0x04,0x4e,0xfe,0x5c,0x00,0x01,0x03,0x6c,0x07,0x6c,0x00,0x01,0x03,0x6c,0xfe,0x5c,0x00,0x01,0x04,0x4a,0x07,0x6c,0x00,0x01,0x04,0x4a,0xfe,0x5c, +0x00,0x01,0x04,0xf2,0x08,0x34,0x00,0x01,0x03,0xf8,0x08,0x34,0x00,0x01,0x05,0x92,0x07,0x6c,0x00,0x01,0x05,0x92,0xfe,0x5c,0x00,0x01,0x02,0x51,0x07,0x6c,0x00,0x01,0x02,0x51,0xfe,0x5c,0x00,0x01,0x02,0x2e,0x07,0x6c,0x00,0x01,0x02,0x2e,0xfe,0x5c,0x00,0x01,0x02,0x0f,0x07,0x6c,0x00,0x01,0x02,0x0f,0xfe,0x5c,0x00,0x01,0x01,0xeb, +0x07,0x6c,0x00,0x01,0x01,0xeb,0xfe,0x5c,0x00,0x01,0x02,0x23,0x08,0x34,0x00,0x01,0x02,0x23,0xfe,0x5c,0x00,0x01,0x02,0x00,0x07,0x6c,0x00,0x01,0x02,0x00,0xfe,0x5c,0x00,0x01,0x02,0xf2,0x07,0x6c,0x00,0x01,0x02,0xf2,0xfe,0x5c,0x00,0x01,0x02,0x62,0x07,0x6c,0x00,0x01,0x02,0x62,0xfe,0x5c,0x00,0x01,0x07,0x60,0x08,0x34,0x00,0x01, +0x06,0x3a,0x07,0x6c,0x00,0x01,0x06,0x3a,0xfe,0x5c,0x00,0x01,0x04,0xa9,0x07,0x6c,0x00,0x01,0x04,0xa9,0xfe,0x5c,0x00,0x01,0x05,0xd0,0x07,0x6c,0x00,0x01,0x05,0xd0,0xfe,0x5c,0x00,0x01,0x04,0xc7,0x07,0x6c,0x00,0x01,0x04,0xc7,0xfe,0x5c,0x00,0x01,0x04,0x52,0x07,0x6c,0x00,0x01,0x04,0x52,0xfe,0x5c,0x00,0x01,0x03,0xe9,0x07,0x6c, +0x00,0x01,0x03,0xe9,0xfe,0x5c,0x00,0x01,0x03,0x83,0x08,0x34,0x00,0x01,0x04,0x6f,0x08,0x34,0x00,0x01,0x04,0x6f,0xfe,0x5c,0x00,0x01,0x04,0x5a,0x07,0x6c,0x00,0x01,0x04,0x5a,0xfe,0x5c,0x00,0x01,0x04,0x20,0x08,0x34,0x00,0x01,0x04,0x20,0xfe,0x5c,0x00,0x01,0x04,0x32,0x07,0x6c,0x00,0x01,0x04,0x32,0xfe,0x5c,0x00,0x01,0x03,0xdd, +0x08,0x34,0x00,0x01,0x01,0xa1,0x07,0x6c,0x00,0x01,0x01,0xa1,0xfe,0x5c,0x00,0x01,0x04,0x50,0x08,0x34,0x00,0x01,0x06,0x3a,0x08,0x34,0x00,0x01,0x05,0xd0,0x08,0x34,0x00,0x01,0x05,0x66,0x07,0x6c,0x00,0x01,0x05,0x66,0xfe,0x5c,0x00,0x01,0x03,0xcf,0x07,0x6c,0x00,0x01,0x03,0xcf,0xfe,0x5c,0x00,0x01,0x04,0x2f,0x08,0x34,0x00,0x01, +0x03,0x94,0x08,0x34,0x00,0x01,0x02,0xa0,0x08,0x34,0x00,0x01,0x02,0x50,0x07,0x6c,0x00,0x01,0x02,0x50,0xfe,0x5c,0x00,0x01,0x02,0x3a,0x07,0x6c,0x00,0x01,0x02,0x3a,0xfe,0x5c,0x00,0x01,0x02,0x39,0x08,0x34,0x00,0x01,0x02,0x39,0xfe,0x5c,0x00,0x01,0x02,0x1b,0x08,0x34,0x00,0x01,0x02,0x1b,0xfe,0x5c,0x00,0x01,0x04,0xa2,0x08,0x34, +0x00,0x01,0x01,0x5b,0x07,0x6c,0x00,0x01,0x01,0x5b,0xfe,0x5c,0x00,0x01,0x01,0xf6,0x08,0x34,0x00,0x01,0x01,0xf6,0xfe,0x5c,0x00,0x01,0x01,0xf8,0x07,0x6c,0x00,0x01,0x01,0xf8,0xfe,0x5c,0x00,0x01,0x06,0x72,0x08,0x34,0x00,0x01,0x04,0x29,0x08,0x34,0x00,0x01,0x02,0xc7,0x07,0x6c,0x00,0x01,0x02,0xc7,0xfe,0x5c,0x00,0x01,0x03,0x0f, +0x08,0x34,0x00,0x01,0x02,0x95,0x07,0x6c,0x00,0x01,0x02,0x95,0xfe,0x5c,0x00,0x01,0x02,0x86,0x07,0x6c,0x00,0x01,0x02,0x86,0xfe,0x5c,0x00,0x01,0x03,0xe2,0x08,0x34,0x00,0x01,0x04,0xe6,0x08,0x34,0x00,0x01,0x04,0x9a,0x08,0x34,0x00,0x01,0x02,0x62,0x08,0x34,0x00,0x01,0x04,0x81,0x07,0x6c,0x00,0x01,0x04,0x81,0xfe,0x5c,0x00,0x01, +0x04,0x38,0x07,0x6c,0x00,0x01,0x04,0x38,0xfe,0x5c,0x00,0x01,0x05,0x42,0x07,0x6c,0x00,0x01,0x05,0x42,0xfe,0x5c,0x00,0x01,0x04,0x0e,0x07,0x6c,0x00,0x01,0x04,0x0e,0xfe,0x5c,0x00,0x01,0x05,0x90,0x07,0x6c,0x00,0x01,0x05,0x90,0xfe,0x5c,0x00,0x01,0x03,0xd7,0x07,0x6c,0x00,0x01,0x03,0xd7,0xfe,0x5c,0x00,0x01,0x04,0x5c,0x07,0x6c, +0x00,0x01,0x04,0x5c,0xfe,0x5c,0x00,0x01,0x03,0x52,0x07,0x6c,0x00,0x01,0x03,0x52,0xfe,0x5c,0x00,0x01,0x03,0xf4,0x07,0x6c,0x00,0x01,0x03,0xf4,0xfe,0x5c,0x00,0x01,0x05,0x85,0x07,0x6c,0x00,0x01,0x05,0x85,0xfe,0x5c,0x00,0x01,0x06,0x87,0x07,0x6c,0x00,0x01,0x06,0x87,0xfe,0x5c,0x00,0x01,0x02,0x25,0x07,0x6c,0x00,0x01,0x02,0x25, +0xfe,0x5c,0x00,0x01,0x01,0xdb,0x07,0x6c,0x00,0x01,0x01,0xdb,0xfe,0x5c,0x00,0x01,0x03,0xdf,0x07,0x6c,0x00,0x01,0x03,0xdf,0xfe,0x5c,0x00,0x01,0x06,0x66,0x07,0x6c,0x00,0x01,0x06,0x66,0xfe,0x5c,0x00,0x01,0x07,0x04,0x07,0x6c,0x00,0x01,0x07,0x04,0xfe,0x5c,0x00,0x01,0x05,0xac,0x07,0x6c,0x00,0x01,0x05,0xac,0xfe,0x5c,0x00,0x01, +0x04,0x7b,0x07,0x6c,0x00,0x01,0x04,0x7b,0xfe,0x5c,0x00,0x01,0x04,0x62,0x07,0x6c,0x00,0x01,0x04,0x62,0xfe,0x5c,0x00,0x01,0x03,0xc7,0x07,0x6c,0x00,0x01,0x03,0xc7,0xfe,0x5c,0x00,0x01,0x02,0xfd,0x07,0x6c,0x00,0x01,0x02,0xfd,0xfe,0x5c,0x00,0x01,0x03,0xf0,0x07,0x6c,0x00,0x01,0x03,0xf0,0xfe,0x5c,0x00,0x01,0x05,0xa8,0x07,0x6c, +0x00,0x01,0x05,0xa8,0xfe,0x5c,0x00,0x01,0x05,0x54,0x07,0x6c,0x00,0x01,0x05,0x54,0xfe,0x5c,0x00,0x01,0x04,0x7f,0x07,0x6c,0x00,0x01,0x04,0x7f,0xfe,0x5c,0x00,0x01,0x04,0x83,0x07,0x6c,0x00,0x01,0x04,0x83,0xfe,0x5c,0x00,0x01,0x04,0xd7,0x07,0x6c,0x00,0x01,0x04,0xd7,0xfe,0x5c,0x00,0x01,0x03,0xc8,0x07,0x6c,0x00,0x01,0x03,0xc8, +0xfe,0x5c,0x00,0x01,0x02,0xcd,0x07,0x6c,0x00,0x01,0x02,0xcd,0xfe,0x5c,0x00,0x01,0x02,0xe4,0x07,0x6c,0x00,0x01,0x02,0xe4,0xfe,0x5c,0x00,0x01,0x04,0x16,0x07,0x6c,0x00,0x01,0x04,0x16,0xfe,0x5c,0x00,0x01,0x09,0xbc,0x08,0x34,0x00,0x01,0x09,0xbc,0xfe,0x5c,0x00,0x01,0x08,0xef,0x07,0x6c,0x00,0x01,0x08,0xef,0xfe,0x5c,0x00,0x01, +0x08,0x05,0x07,0x6c,0x00,0x01,0x08,0x05,0xfe,0x5c,0x00,0x01,0x06,0x29,0x07,0x6c,0x00,0x01,0x06,0x29,0xfe,0x5c,0x00,0x01,0x05,0x39,0x07,0x6c,0x00,0x01,0x05,0x39,0xfe,0x5c,0x00,0x01,0x03,0x77,0x07,0x6c,0x00,0x01,0x03,0x77,0xfe,0x5c,0x00,0x01,0x07,0xe4,0x07,0x6c,0x00,0x01,0x07,0xe4,0xfe,0x5c,0x00,0x01,0x07,0x34,0x07,0x6c, +0x00,0x01,0x07,0x34,0xfe,0x5c,0x00,0x01,0x05,0xed,0x07,0x6c,0x00,0x01,0x05,0xed,0xfe,0x5c,0x00,0x01,0x03,0x7b,0x07,0x6c,0x00,0x01,0x03,0x7b,0xfe,0x5c,0x00,0x01,0x02,0x29,0x08,0x34,0x00,0x01,0x02,0x29,0xfe,0x5c,0x00,0x01,0x02,0x11,0x07,0x6c,0x00,0x01,0x02,0x11,0xfe,0x5c,0x00,0x01,0x06,0x83,0x08,0x34,0x00,0x01,0x06,0x4e, +0x07,0x6c,0x00,0x01,0x06,0x4e,0xfe,0x5c,0x00,0x01,0x05,0x7d,0x07,0x6c,0x00,0x01,0x05,0x7d,0xfe,0x5c,0x00,0x01,0x04,0xb6,0x07,0x6c,0x00,0x01,0x04,0xb6,0xfe,0x5c,0x00,0x01,0x04,0x83,0x08,0x34,0x00,0x01,0x03,0x68,0x07,0x6c,0x00,0x01,0x03,0x68,0xfe,0x5c,0x00,0x01,0x09,0xbc,0x07,0x6c,0x00,0x01,0x08,0xf0,0x07,0x6c,0x00,0x01, +0x08,0xf0,0xfe,0x5c,0x00,0x01,0x08,0x06,0x07,0x6c,0x00,0x01,0x08,0x06,0xfe,0x5c,0x00,0x01,0x07,0x79,0x07,0x6c,0x00,0x01,0x07,0x79,0xfe,0x5c,0x00,0x01,0x05,0x27,0x07,0x6c,0x00,0x01,0x05,0x27,0xfe,0x5c,0x00,0x01,0x01,0xb6,0x07,0x6c,0x00,0x01,0x01,0xb6,0xfe,0x5c,0x00,0x01,0x02,0x28,0x08,0x34,0x00,0x01,0x02,0x28,0xfe,0x5c, +0x00,0x01,0x02,0x0a,0x07,0x6c,0x00,0x01,0x02,0x0a,0xfe,0x5c,0x00,0x01,0x02,0xca,0x07,0x6c,0x00,0x01,0x02,0xca,0xfe,0x5c,0x00,0x01,0x03,0x3e,0x07,0x6c,0x00,0x01,0x03,0x3e,0xfe,0x5c,0x00,0x01,0x04,0x42,0x07,0x6c,0x00,0x01,0x04,0x42,0xfe,0x5c,0x00,0x01,0x03,0x9e,0x07,0x6c,0x00,0x01,0x03,0x9e,0xfe,0x5c,0x00,0x01,0x04,0x56, +0x07,0x6c,0x00,0x01,0x04,0x56,0xfe,0x5c,0x00,0x01,0x03,0x5a,0x07,0x6c,0x00,0x01,0x03,0x5a,0xfe,0x5c,0x00,0x01,0x03,0xa0,0x07,0x6c,0x00,0x01,0x03,0xa0,0xfe,0x5c,0x00,0x01,0x05,0x21,0x07,0x6c,0x00,0x01,0x05,0x21,0xfe,0x5c,0x00,0x01,0x05,0x16,0x07,0x6c,0x00,0x01,0x05,0x16,0xfe,0x5c,0x00,0x01,0x02,0xf4,0x07,0x6c,0x00,0x01, +0x02,0xf4,0xfe,0x5c,0x00,0x01,0x02,0xee,0x07,0x6c,0x00,0x01,0x02,0xee,0xfe,0x5c,0x00,0x01,0x04,0x35,0x07,0x6c,0x00,0x01,0x04,0x35,0xfe,0x5c,0x00,0x01,0x02,0x1c,0x07,0x6c,0x00,0x01,0x02,0x1c,0xfe,0x5c,0x00,0x01,0x03,0xcd,0x07,0x6c,0x00,0x01,0x03,0xcd,0xfe,0x5c,0x00,0x01,0x03,0xc6,0x07,0x6c,0x00,0x01,0x03,0xc6,0xfe,0x5c, +0x00,0x01,0x02,0x0e,0x07,0x6c,0x00,0x01,0x02,0x0e,0xfe,0x5c,0x00,0x01,0x02,0x2f,0x07,0x6c,0x00,0x01,0x02,0x2f,0xfe,0x5c,0x00,0x01,0x02,0x44,0x07,0x6c,0x00,0x01,0x02,0x44,0xfe,0x5c,0x00,0x01,0x02,0x52,0x07,0x6c,0x00,0x01,0x02,0x52,0xfe,0x5c,0x00,0x01,0x02,0x5a,0x07,0x6c,0x00,0x01,0x02,0x5a,0xfe,0x5c,0x00,0x01,0x04,0xb2, +0x07,0x6c,0x00,0x01,0x04,0xb2,0xfe,0x5c,0x00,0x01,0x05,0x08,0x07,0x6c,0x00,0x01,0x05,0x08,0xfe,0x5c,0x00,0x01,0x04,0x0a,0x07,0x6c,0x00,0x01,0x04,0x0a,0xfe,0x5c,0x00,0x01,0x05,0x60,0x07,0x6c,0x00,0x01,0x05,0x60,0xfe,0x5c,0x00,0x01,0x05,0x64,0x07,0x6c,0x00,0x01,0x05,0x64,0xfe,0x5c,0x00,0x01,0x04,0xba,0x07,0x6c,0x00,0x01, +0x04,0xba,0xfe,0x5c,0x00,0x01,0x02,0x23,0x07,0x6c,0x00,0x01,0x03,0x33,0x07,0x6c,0x00,0x01,0x03,0x33,0xfe,0x5c,0x00,0x01,0x02,0xa2,0x07,0x6c,0x00,0x01,0x02,0xa2,0xfe,0x5c,0x00,0x01,0x02,0x1e,0x07,0x6c,0x00,0x01,0x02,0x1e,0xfe,0x5c,0x00,0x01,0x02,0xdb,0x07,0x6c,0x00,0x01,0x02,0xdb,0xfe,0x5c,0x00,0x01,0x02,0x68,0x07,0x6c, +0x00,0x01,0x02,0x68,0xfe,0x5c,0x00,0x01,0x02,0x72,0x07,0x6c,0x00,0x01,0x02,0x72,0xfe,0x5c,0x00,0x01,0x02,0x48,0x07,0x6c,0x00,0x01,0x02,0x48,0xfe,0x5c,0x00,0x01,0x02,0x8e,0x07,0x6c,0x00,0x01,0x02,0x8e,0xfe,0x5c,0x00,0x01,0x04,0xa4,0x07,0x6c,0x00,0x01,0x04,0xa4,0xfe,0x5c,0x00,0x01,0x03,0xd1,0x07,0x6c,0x00,0x01,0x03,0xd1, +0xfe,0x5c,0x00,0x01,0x03,0x4c,0x07,0x6c,0x00,0x01,0x03,0x4c,0xfe,0x5c,0x00,0x01,0x03,0xfe,0x07,0x6c,0x00,0x01,0x03,0xfe,0xfe,0x5c,0x00,0x01,0x04,0x25,0x07,0x6c,0x00,0x01,0x04,0x25,0xfe,0x5c,0x00,0x01,0x03,0x8c,0x07,0x6c,0x00,0x01,0x03,0x8c,0xfe,0x5c,0x00,0x01,0x02,0xe8,0x07,0x6c,0x00,0x01,0x02,0xe8,0xfe,0x5c,0x00,0x01, +0x02,0xcf,0x07,0x6c,0x00,0x01,0x02,0xcf,0xfe,0x5c,0x00,0x01,0x02,0xcb,0x07,0x6c,0x00,0x01,0x02,0xcb,0xfe,0x5c,0x00,0x01,0x03,0x60,0x07,0x6c,0x00,0x01,0x03,0x60,0xfe,0x5c,0x00,0x01,0x04,0x92,0x07,0x6c,0x00,0x01,0x04,0x92,0xfe,0x5c,0x00,0x01,0x03,0x7f,0x07,0x6c,0x00,0x01,0x03,0x7f,0xfe,0x5c,0x00,0x01,0x04,0x02,0x07,0x6c, +0x00,0x01,0x04,0x02,0xfe,0x5c,0x00,0x01,0x02,0x38,0x07,0x6c,0x00,0x01,0x03,0x56,0x07,0x6c,0x00,0x01,0x03,0x56,0xfe,0x5c,0x00,0x01,0x02,0xf8,0x07,0x6c,0x00,0x01,0x02,0xf8,0xfe,0x5c,0x00,0x01,0x07,0x27,0x07,0x6c,0x00,0x01,0x07,0x27,0xfe,0x5c,0x00,0x01,0x07,0x77,0x07,0x6c,0x00,0x01,0x07,0x77,0xfe,0x5c,0x00,0x01,0x07,0xdb, +0x07,0x6c,0x00,0x01,0x07,0xdb,0xfe,0x5c,0x00,0x01,0x04,0x94,0x07,0x6c,0x00,0x01,0x04,0x94,0xfe,0x5c,0x00,0x01,0x04,0x3e,0x07,0x6c,0x00,0x01,0x04,0x3e,0xfe,0x5c,0x00,0x01,0x05,0xc8,0x07,0x6c,0x00,0x01,0x05,0xc8,0xfe,0x5c,0x00,0x01,0x03,0xc2,0x07,0x6c,0x00,0x01,0x03,0xc2,0xfe,0x5c,0x00,0x01,0x06,0x1c,0x07,0x6c,0x00,0x01, +0x06,0x1c,0xfe,0x5c,0x00,0x01,0x06,0x04,0x07,0x6c,0x00,0x01,0x06,0x04,0xfe,0x5c,0x00,0x01,0x07,0x1a,0x07,0x6c,0x00,0x01,0x07,0x1a,0xfe,0x5c,0x00,0x01,0x04,0xf0,0x07,0x6c,0x00,0x01,0x04,0xf0,0xfe,0x5c,0x00,0x01,0x04,0x0b,0x07,0x6c,0x00,0x01,0x04,0x0b,0xfe,0x5c,0x00,0x01,0x04,0xc9,0x07,0x6c,0x00,0x01,0x04,0xc9,0xfe,0x5c, +0x00,0x01,0x03,0xf6,0x07,0x6c,0x00,0x01,0x03,0xf6,0xfe,0x5c,0x00,0x01,0x04,0xff,0x07,0x6c,0x00,0x01,0x04,0xff,0xfe,0x5c,0x00,0x01,0x04,0xdc,0x07,0x6c,0x00,0x01,0x04,0xdc,0xfe,0x5c,0x00,0x01,0x03,0xac,0x07,0x6c,0x00,0x01,0x03,0xac,0xfe,0x5c,0x00,0x01,0x03,0x37,0x07,0x6c,0x00,0x01,0x03,0x37,0xfe,0x5c,0x00,0x01,0x04,0x3f, +0x07,0x6c,0x00,0x01,0x04,0x3f,0xfe,0x5c,0x00,0x01,0x06,0xae,0x07,0x6c,0x00,0x01,0x06,0xae,0xfe,0x5c,0x00,0x01,0x02,0x46,0x07,0x6c,0x00,0x01,0x02,0x46,0xfe,0x5c,0x00,0x01,0x02,0x08,0x07,0x6c,0x00,0x01,0x02,0x08,0xfe,0x5c,0x00,0x01,0x04,0x24,0x07,0x6c,0x00,0x01,0x04,0x24,0xfe,0x5c,0x00,0x01,0x04,0xae,0x07,0x6c,0x00,0x01, +0x04,0xae,0xfe,0x5c,0x00,0x01,0x05,0xfc,0x07,0x6c,0x00,0x01,0x05,0xfc,0xfe,0x5c,0x00,0x01,0x03,0xf9,0x07,0x6c,0x00,0x01,0x03,0xf9,0xfe,0x5c,0x00,0x01,0x01,0xe3,0x07,0x6c,0x00,0x01,0x01,0xe3,0xfe,0x5c,0x00,0x01,0x06,0xed,0x07,0x6c,0x00,0x01,0x06,0xed,0xfe,0x5c,0x00,0x01,0x04,0x91,0x07,0x6c,0x00,0x01,0x04,0x91,0xfe,0x5c, +0x00,0x01,0x03,0xad,0x07,0x6c,0x00,0x01,0x03,0xad,0xfe,0x5c,0x00,0x01,0x03,0x4b,0x07,0x6c,0x00,0x01,0x03,0x4b,0xfe,0x5c,0x00,0x01,0x04,0x06,0x07,0x6c,0x00,0x01,0x04,0x06,0xfe,0x5c,0x00,0x01,0x04,0x71,0x07,0x6c,0x00,0x01,0x04,0x71,0xfe,0x5c,0x00,0x01,0x04,0xfe,0x07,0x6c,0x00,0x01,0x04,0xfe,0xfe,0x5c,0x00,0x01,0x04,0x84, +0x07,0x6c,0x00,0x01,0x04,0x84,0xfe,0x5c,0x00,0x01,0x03,0x3b,0x07,0x6c,0x00,0x01,0x03,0x3b,0xfe,0x5c,0x00,0x01,0x05,0xe0,0x07,0x6c,0x00,0x01,0x05,0xe0,0xfe,0x5c,0x00,0x01,0x02,0xd1,0x07,0x6c,0x00,0x01,0x02,0xd1,0xfe,0x5c,0x00,0x01,0x04,0xd0,0x07,0x6c,0x00,0x01,0x04,0xd0,0xfe,0x5c,0x00,0x01,0x04,0xc1,0x07,0x6c,0x00,0x01, +0x04,0xc1,0xfe,0x5c,0x00,0x01,0x05,0x7f,0x07,0x6c,0x00,0x01,0x05,0x7f,0xfe,0x5c,0x00,0x01,0x05,0x07,0x07,0x6c,0x00,0x01,0x05,0x07,0xfe,0x5c,0x00,0x01,0x06,0x01,0x07,0x6c,0x00,0x01,0x06,0x01,0xfe,0x5c,0x00,0x01,0x02,0xc8,0x07,0x6c,0x00,0x01,0x02,0xc8,0xfe,0x5c,0x00,0x01,0x04,0x6c,0x07,0x6c,0x00,0x01,0x04,0x6c,0xfe,0x5c, +0x00,0x01,0x03,0x9c,0x07,0x6c,0x00,0x01,0x03,0x9c,0xfe,0x5c,0x00,0x01,0x03,0xc4,0x07,0x6c,0x00,0x01,0x03,0xc4,0xfe,0x5c,0x00,0x01,0x02,0x4a,0x07,0x6c,0x00,0x01,0x02,0x4a,0xfe,0x5c,0x00,0x01,0x04,0x19,0x07,0x6c,0x00,0x01,0x04,0x19,0xfe,0x5c,0x00,0x01,0x04,0x12,0x07,0x6c,0x00,0x01,0x04,0x12,0xfe,0x5c,0x00,0x01,0x02,0xb6, +0x07,0x6c,0x00,0x01,0x02,0xb6,0xfe,0x5c,0x00,0x01,0x04,0x8d,0x07,0x6c,0x00,0x01,0x04,0x8d,0xfe,0x5c,0x00,0x01,0x05,0x98,0x07,0x6c,0x00,0x01,0x05,0x98,0xfe,0x5c,0x00,0x01,0xff,0x9c,0x05,0x14,0x00,0x01,0x03,0x34,0x05,0x9a,0x00,0x01,0x03,0xf6,0x04,0xfa,0x00,0x01,0x04,0x81,0x05,0x79,0x00,0x01,0x04,0xb0,0x04,0xfa,0x00,0x01, +0x03,0x70,0x05,0x9a,0x00,0x01,0x04,0xd4,0x05,0x69,0x00,0x01,0x05,0x0e,0x05,0x9a,0x00,0x01,0x01,0xfe,0x05,0x9a,0x00,0x01,0x02,0x3b,0x05,0x9a,0x00,0x01,0x04,0x04,0x05,0x9a,0x00,0x01,0x01,0x42,0x05,0x9a,0x00,0x01,0x06,0xae,0x05,0x9a,0x00,0x01,0x05,0x5c,0x05,0x9a,0x00,0x01,0x04,0xd8,0x05,0x28,0x00,0x01,0x03,0xdb,0x04,0xfa, +0x00,0x01,0x04,0x29,0x04,0xfa,0x00,0x01,0x03,0xa0,0x05,0x94,0x00,0x01,0x04,0x06,0x05,0xa3,0x00,0x01,0x04,0xda,0x05,0x9f,0x00,0x01,0x04,0xa9,0x05,0x9a,0x00,0x01,0x07,0x58,0x05,0x9a,0x00,0x01,0x03,0x20,0x03,0xf1,0x00,0x01,0x04,0x14,0x03,0xb6,0x00,0x01,0x03,0x59,0x03,0xf1,0x00,0x01,0x04,0x04,0x05,0xf2,0x00,0x01,0x03,0x71, +0x03,0xcd,0x00,0x01,0x02,0x9e,0x06,0x02,0x00,0x01,0x04,0x0d,0x04,0x04,0x00,0x01,0x03,0xd5,0x03,0xaa,0x00,0x01,0x01,0x59,0x04,0x01,0x00,0x01,0x01,0x50,0x04,0x01,0x00,0x01,0x03,0xb4,0x04,0x0b,0x00,0x01,0x01,0x67,0x05,0xf2,0x00,0x01,0x06,0x44,0x03,0x78,0x00,0x01,0x03,0xe7,0x03,0x78,0x00,0x01,0x03,0xde,0x03,0x84,0x00,0x01, +0x04,0x14,0x03,0x87,0x00,0x01,0x04,0x04,0x04,0x03,0x00,0x01,0x02,0xc1,0x04,0x02,0x00,0x01,0x02,0xe0,0x03,0xf3,0x00,0x01,0x02,0x70,0x04,0x03,0x00,0x01,0x03,0xd4,0x03,0xfc,0x00,0x01,0x03,0xb3,0x04,0x00,0x00,0x01,0x05,0xa6,0x04,0x00,0x00,0x01,0x03,0x6f,0x04,0x00,0x00,0x01,0x03,0xb4,0x04,0x0c,0x00,0x01,0x03,0x34,0x04,0x00, +0x00,0x01,0x02,0x94,0xff,0xce,0x00,0x01,0x02,0xde,0xff,0xf1,0x00,0x01,0x02,0x52,0xff,0xce,0x00,0x01,0x02,0xfe,0xff,0xce,0x00,0x01,0x03,0x04,0xff,0xf1,0x00,0x01,0x02,0x64,0xff,0xce,0x00,0x01,0x02,0x20,0xff,0xf1,0x00,0x01,0x02,0xbf,0xff,0xf1,0x00,0x01,0x02,0x3a,0xff,0xf1,0x00,0x01,0x02,0x2b,0xff,0xf1,0x00,0x01,0x02,0x44, +0xfe,0x3e,0x00,0x01,0x00,0xfa,0x00,0x14,0x00,0x01,0x01,0xfd,0xff,0xce,0x00,0x01,0x00,0xfa,0x00,0x00,0x00,0x01,0x02,0x43,0xff,0xce,0x00,0x01,0x00,0xf6,0x00,0x00,0x00,0x01,0x01,0xa8,0xff,0xf1,0x00,0x01,0x01,0xbf,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf6,0x00,0x01,0x04,0x65,0x00,0x00,0x00,0x01,0x02,0x58,0x00,0x00,0x00,0x01, +0x03,0x5c,0xff,0xf1,0x00,0x01,0x00,0xe6,0x00,0x00,0x00,0x01,0x03,0xa7,0x00,0x00,0x00,0x01,0x04,0x4c,0x00,0x00,0x00,0x01,0x00,0xc8,0x00,0x00,0x00,0x01,0x03,0xca,0x00,0x00,0x00,0x01,0x02,0xda,0x00,0x00,0x00,0x01,0x05,0xd2,0x00,0x00,0x00,0x01,0x04,0x88,0x00,0x00,0x00,0x01,0x03,0x3e,0xff,0xf1,0x00,0x01,0x03,0x70,0xff,0x4c, +0x00,0x01,0x04,0x10,0x00,0x00,0x00,0x01,0x02,0x62,0x00,0x00,0x00,0x01,0x01,0xcc,0x00,0x00,0x00,0x01,0x05,0x19,0x00,0x00,0x00,0x01,0x01,0xf4,0x00,0x00,0x00,0x01,0x03,0x8e,0x00,0x00,0x00,0x01,0x02,0xc6,0x00,0x00,0x00,0x01,0x02,0x94,0x00,0x00,0x00,0x01,0x03,0x66,0x00,0x00,0x00,0x01,0x02,0xd2,0xfe,0x70,0x00,0x01,0x03,0x5c, +0x00,0x00,0x00,0x01,0x00,0x32,0xfe,0x5c,0x00,0x01,0x03,0x16,0x00,0x00,0x00,0x01,0x05,0xaa,0x00,0x00,0x00,0x01,0x00,0xaa,0xfe,0x20,0x00,0x01,0x03,0x70,0xfe,0x20,0x00,0x01,0x01,0xb8,0xff,0xf1,0x00,0x01,0x03,0x3e,0x00,0x00,0x00,0x01,0x01,0xa4,0x00,0x00,0x00,0x01,0x03,0xde,0x00,0x00,0x00,0x01,0x02,0xd0,0x00,0x00,0x00,0x01, +0x00,0xdc,0xfe,0x48,0x00,0x01,0x02,0xf8,0xfe,0x70,0x00,0x01,0x04,0x6a,0x00,0x00,0x00,0x01,0x02,0x44,0xfe,0x70,0x00,0x01,0x05,0x80,0x00,0x27,0x00,0x01,0x00,0xf1,0xff,0x0e,0x00,0x01,0x06,0x4a,0x00,0x00,0x00,0x01,0x05,0xf0,0x00,0x00,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x02,0xf0,0x00,0x1b,0x00,0x01,0x02,0x9a,0x00,0x09, +0x00,0x01,0x00,0xaa,0xfe,0x2a,0x00,0x01,0x02,0x3a,0xfe,0x70,0x00,0x01,0x01,0xcc,0xfe,0x70,0x00,0x01,0x04,0x4c,0xfe,0x84,0x00,0x01,0x02,0xe4,0xfe,0x84,0x00,0x01,0x02,0x76,0xfe,0x84,0x00,0x01,0x01,0xb8,0xfe,0x5c,0x00,0x01,0x02,0xeb,0x00,0x03,0x00,0x01,0x02,0x4e,0xfe,0x5c,0x00,0x01,0x03,0xb2,0x00,0x00,0x00,0x01,0x02,0x76, +0xfe,0x99,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x84,0x00,0x01,0x01,0x18,0xfe,0x70,0x00,0x01,0x03,0xd6,0xfe,0x5c,0x00,0x01,0x02,0xa3,0xfe,0x5c,0x00,0x01,0x03,0x66,0xfe,0x84,0x00,0x01,0x03,0x20,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x3f,0x00,0x01,0x00,0xfd,0xfe,0xee,0x00,0x01,0x00,0xdc,0xfe,0xdc,0x00,0x01, +0x02,0xed,0xfe,0xec,0x00,0x01,0x02,0x4d,0xfe,0xfb,0x00,0x01,0x02,0xdb,0xfe,0xec,0x00,0x01,0x02,0x44,0xfe,0xf2,0x00,0x01,0x02,0xf6,0xfe,0xf5,0x00,0x01,0x02,0x3b,0xfe,0xf2,0x00,0x01,0x02,0xab,0xfe,0xfb,0x00,0x01,0x02,0x99,0xfe,0xf2,0x00,0x01,0x02,0x0f,0xfe,0xe5,0x00,0x01,0x01,0x00,0xfe,0x67,0x00,0x01,0x01,0x86,0xfe,0x98, +0x00,0x01,0x01,0x18,0xfe,0x98,0x00,0x01,0x02,0x17,0xfe,0x5c,0x00,0x01,0x02,0x08,0xfe,0xd4,0x00,0x01,0x02,0x48,0xfe,0xd4,0x00,0x01,0x02,0x2a,0xff,0x24,0x00,0x01,0x02,0x63,0xff,0x24,0x00,0x01,0x02,0x26,0xfe,0x5c,0x00,0x01,0x02,0x72,0xfe,0xd4,0x00,0x01,0x02,0x60,0xff,0x24,0x00,0x01,0x02,0x3d,0xff,0x24,0x00,0x01,0x02,0x3e, +0xfe,0x92,0x00,0x01,0x02,0x9e,0xfe,0x48,0x00,0x01,0x02,0x35,0xfe,0x48,0x00,0x01,0x02,0x2a,0xfe,0xd4,0x00,0x01,0x02,0x4e,0xfe,0xd4,0x00,0x01,0x02,0x2a,0xfe,0x5c,0x00,0x01,0x02,0xe4,0xfe,0xa2,0x00,0x01,0x02,0x76,0xfe,0xa2,0x00,0x01,0x01,0x22,0xfe,0xd4,0x00,0x01,0x00,0xf0,0xfe,0xd4,0x00,0x01,0x03,0x7a,0x00,0x00,0x00,0x01, +0x04,0x3f,0x00,0x00,0x00,0x01,0x02,0x23,0xff,0x24,0x00,0x01,0x00,0xd2,0xfe,0xd4,0x00,0x01,0x00,0xc8,0xfe,0xd4,0x00,0x01,0x02,0x1c,0xff,0x24,0x00,0x01,0x02,0x17,0xfe,0x48,0x00,0x01,0x00,0xe6,0xfe,0x48,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x02,0xf3,0xff,0x24,0x00,0x01,0x02,0x44,0xfe,0x48,0x00,0x01,0x00,0xb4,0xfe,0x20, +0x00,0x01,0x02,0x84,0xff,0x24,0x00,0x01,0x01,0x9e,0xff,0x24,0x00,0x01,0x01,0xf9,0xfe,0xd4,0x00,0x01,0x01,0x9a,0xfe,0xd4,0x00,0x01,0x02,0x2b,0xfe,0xd4,0x00,0x01,0x01,0xa9,0xfe,0xd4,0x00,0x01,0x01,0xf4,0xfe,0xd4,0x00,0x01,0x01,0x3b,0xfe,0xd4,0x00,0x01,0x01,0xf0,0xff,0x24,0x00,0x01,0x01,0x82,0xff,0x24,0x00,0x01,0x02,0x12, +0xfe,0x48,0x00,0x01,0x01,0x54,0xfe,0x48,0x00,0x01,0x02,0xb2,0xfe,0xac,0x00,0x01,0x02,0x1c,0xfe,0xac,0x00,0x01,0x02,0xb4,0xfe,0xd4,0x00,0x01,0x02,0x4b,0xfe,0xd4,0x00,0x01,0x04,0x1a,0x00,0x00,0x00,0x01,0x02,0x26,0xfe,0xd4,0x00,0x01,0x01,0xae,0xfe,0xd4,0x00,0x01,0x02,0x3a,0xff,0x24,0x00,0x01,0x01,0xc2,0xff,0x24,0x00,0x01, +0x02,0x9c,0x00,0x00,0x00,0x01,0x02,0x0d,0x00,0x00,0x00,0x01,0x01,0xd7,0xff,0xf1,0x00,0x01,0x02,0x7d,0xff,0xf1,0x00,0x01,0x03,0x54,0x00,0x00,0x00,0x01,0x03,0x74,0x00,0x00,0x00,0x01,0x02,0xe4,0xfe,0x70,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x01,0x02,0xca,0x00,0x00,0x00,0x01,0x00,0x5c,0xfe,0xb6,0x00,0x01,0x05,0x00,0x00,0x00, +0x00,0x01,0x01,0x54,0xff,0xf1,0x00,0x01,0x03,0x52,0xfe,0x70,0x00,0x01,0x06,0x72,0x00,0x00,0x00,0x01,0x05,0x0a,0x00,0x00,0x00,0x01,0x01,0x25,0x00,0x00,0x00,0x01,0x00,0xb9,0xfe,0x2a,0x00,0x01,0x03,0x98,0xff,0x74,0x00,0x01,0x02,0x08,0x00,0x00,0x00,0x01,0x01,0xe4,0xfe,0x2a,0x00,0x01,0x01,0x78,0xfe,0xab,0x00,0x01,0x02,0xe8, +0xfe,0x9b,0x00,0x01,0x03,0x39,0xff,0xf1,0x00,0x01,0x02,0xe9,0xff,0xfa,0x00,0x01,0x02,0x58,0xfe,0x3a,0x00,0x01,0x03,0x66,0xfe,0x2f,0x00,0x01,0x01,0x90,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x00,0x00,0x01,0x08,0xde,0x00,0x00,0x00,0x01,0x08,0x20,0x00,0x00,0x00,0x01,0x07,0x30,0x00,0x00,0x00,0x01,0x04,0xce,0x00,0x00,0x00,0x01, +0x06,0x86,0x00,0x00,0x00,0x01,0x05,0xfa,0xfe,0x5c,0x00,0x01,0x04,0xb0,0xfe,0x5c,0x00,0x01,0x05,0xa2,0x00,0x00,0x00,0x01,0x05,0x14,0x00,0x00,0x00,0x01,0x02,0xda,0xfe,0x84,0x00,0x01,0x02,0x3a,0xfe,0x84,0x00,0x01,0x01,0xcc,0xfe,0x48,0x00,0x01,0x06,0x18,0x00,0x00,0x00,0x01,0x00,0xbe,0xfe,0x2a,0x00,0x01,0x04,0x88,0xfe,0x2a, +0x00,0x01,0x02,0x66,0x00,0x00,0x00,0x01,0x03,0x70,0x00,0x00,0x00,0x01,0x01,0xa5,0xff,0xf7,0x00,0x01,0x04,0x4c,0xfe,0x2a,0x00,0x01,0x02,0x22,0x00,0x00,0x00,0x01,0x01,0xb6,0x00,0x00,0x00,0x01,0x02,0xc2,0x00,0x00,0x00,0x01,0x00,0x8c,0xfe,0x75,0x00,0x01,0x01,0xd8,0xfe,0x5c,0x00,0x01,0x01,0xd4,0x00,0x00,0x00,0x01,0x03,0x47, +0xfe,0x2a,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x01,0x48,0x00,0x00,0x00,0x01,0x03,0x0c,0xfe,0x48,0x00,0x01,0x05,0xa4,0x00,0x00,0x00,0x01,0x05,0xa4,0xfe,0x2a,0x00,0x01,0x04,0xff,0xfe,0x35,0x00,0x01,0x04,0x3d,0xfe,0x2a,0x00,0x01,0x04,0x9c,0x00,0x00,0x00,0x01,0x01,0x91,0x00,0x00,0x00,0x01,0x01,0x88,0x00,0x00,0x00,0x01, +0x01,0x84,0x00,0x09,0x00,0x01,0x02,0xde,0x00,0x09,0x00,0x01,0x01,0x8d,0xfe,0xe0,0x00,0x01,0x00,0x91,0xfe,0x7e,0x00,0x01,0x00,0x8a,0xfe,0x63,0x00,0x01,0x00,0xa4,0xfe,0x5c,0x00,0x01,0x01,0x5c,0xfe,0xfb,0x00,0x01,0x02,0x76,0x00,0x00,0x00,0x01,0x01,0x6c,0x00,0x09,0x00,0x01,0x03,0x52,0xff,0x06,0x00,0x01,0x01,0xc2,0xfe,0x41, +0x00,0x01,0x01,0xc2,0xfe,0x4a,0x00,0x01,0x01,0x5b,0x00,0x00,0x00,0x01,0x01,0x47,0x00,0x00,0x00,0x01,0x02,0x7d,0xfe,0x48,0x00,0x01,0x02,0xa5,0xff,0xfa,0x00,0x01,0x00,0x43,0xfe,0x41,0x00,0x01,0x02,0xbc,0xfe,0x16,0x00,0x01,0x03,0x76,0xfe,0x2a,0x00,0x01,0x01,0x64,0x00,0x00,0x00,0x01,0x06,0x5e,0x00,0x00,0x00,0x01,0x05,0xb4, +0xfe,0x36,0x00,0x01,0x02,0x14,0xfe,0x4a,0x00,0x01,0x04,0xb0,0x00,0x00,0x00,0x01,0x04,0xb0,0xfe,0x48,0x00,0x01,0x03,0x02,0x00,0x00,0x00,0x01,0x01,0xf4,0xfe,0x5c,0x00,0x01,0x04,0x9c,0xfe,0x5c,0x00,0x01,0x03,0x84,0xfe,0x2a,0x00,0x01,0x05,0x82,0x00,0x00,0x00,0x01,0x03,0x7a,0xfe,0x20,0x00,0x01,0x02,0x1f,0xfe,0xd4,0x00,0x01, +0x02,0x9e,0xfe,0x2a,0x00,0x01,0x02,0xd0,0x01,0xf6,0x00,0x01,0x06,0x1a,0x00,0x00,0x00,0x01,0x01,0x22,0x00,0x00,0x00,0x01,0x02,0x6c,0x00,0x00,0x00,0x01,0x02,0xd0,0xfe,0xa2,0x00,0x01,0x03,0x98,0xfe,0xa2,0x00,0x01,0x02,0xee,0xfe,0xa2,0x00,0x01,0x00,0xd2,0xfe,0xa2,0x00,0x01,0x05,0xdc,0xfe,0xa2,0x00,0x01,0x03,0x84,0xfe,0xa2, +0x00,0x01,0x02,0x80,0xfe,0xa2,0x00,0x01,0x03,0xa2,0xfe,0xa2,0x00,0x01,0x04,0x2e,0xfe,0xa2,0x00,0x01,0x04,0x38,0xfe,0xa2,0x00,0x01,0x03,0xb6,0xfe,0xc0,0x00,0x01,0x03,0x52,0xfe,0xa2,0x00,0x01,0x02,0x7f,0x00,0x46,0x00,0x01,0x03,0xfc,0xfe,0xa2,0x00,0x01,0x04,0x21,0x00,0x00,0x00,0x01,0x00,0xe6,0x00,0x8c,0x00,0x01,0x04,0x42, +0x00,0x00,0x00,0x01,0x05,0xbe,0xfe,0xa2,0x00,0x01,0x04,0xba,0xfe,0xa2,0x00,0x01,0x00,0xc8,0xfe,0x48,0x00,0x01,0x03,0xa2,0x00,0x0f,0x00,0x01,0x00,0x8c,0x00,0x1e,0x00,0x01,0xff,0x6a,0x00,0x1e,0x00,0x01,0x03,0x4a,0x00,0x50,0x00,0x01,0x02,0xd5,0x00,0x1a,0x00,0x01,0x03,0xbc,0x00,0x09,0x00,0x01,0x03,0xbc,0x00,0x00,0x00,0x01, +0x01,0x40,0x00,0x00,0x00,0x01,0x03,0x3a,0xfe,0x93,0x00,0x01,0x03,0x48,0xfe,0xc0,0x00,0x01,0x03,0xa8,0x00,0x00,0x00,0x01,0x00,0x83,0xfe,0x89,0x00,0x01,0x03,0x5a,0x00,0x00,0x00,0x01,0x05,0xfc,0x00,0x00,0x00,0x01,0x03,0xa2,0x00,0x09,0x00,0x01,0x03,0x5c,0x00,0x3f,0x00,0x01,0x03,0xb3,0xfe,0x42,0x00,0x01,0x00,0xf8,0x00,0x00, +0x00,0x01,0x02,0x60,0x00,0x50,0x00,0x01,0x01,0xea,0x00,0x00,0x00,0x01,0x04,0x27,0x00,0x09,0x00,0x01,0x04,0x27,0x00,0x00,0x00,0x01,0x03,0x07,0xff,0xf7,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x01,0x02,0x58,0x06,0xea,0x00,0x01,0xff,0x6f,0x06,0xea,0x00,0x01,0x00,0xaa,0x06,0x40,0x00,0x01,0xff,0x7e,0x06,0x40,0x00,0x01,0x05,0x29, +0x08,0x34,0x00,0x01,0x00,0x00,0x08,0x34,0x00,0x01,0x04,0x96,0x08,0x34,0x00,0x01,0x04,0xf4,0x08,0x34,0x00,0x01,0x05,0x9c,0x08,0x34,0x00,0x01,0x03,0xe8,0x08,0x34,0x00,0x01,0x05,0x7d,0x08,0x34,0x00,0x01,0x05,0xae,0x08,0x34,0x00,0x01,0x02,0x21,0x08,0x34,0x00,0x01,0x02,0xdb,0x08,0x34,0x00,0x01,0x04,0xa4,0x08,0x34,0x00,0x01, +0x03,0xc4,0x08,0x34,0x00,0x01,0x07,0x2f,0x08,0x34,0x00,0x01,0x05,0xfc,0x08,0x34,0x00,0x01,0x06,0x08,0x08,0x34,0x00,0x01,0x04,0x7b,0x08,0x34,0x00,0x01,0x04,0xc9,0x08,0x34,0x00,0x01,0x04,0x40,0x08,0x34,0x00,0x01,0x04,0x31,0x08,0x34,0x00,0x01,0x05,0x7f,0x08,0x34,0x00,0x01,0x04,0xf8,0x08,0x34,0x00,0x01,0x07,0x79,0x08,0x34, +0x00,0x01,0x04,0xb8,0x08,0x34,0x00,0x01,0x04,0x6c,0x08,0x34,0x00,0x01,0x04,0x90,0x08,0x34,0x00,0x01,0x04,0x12,0x08,0x34,0x00,0x01,0x04,0xb4,0x08,0x34,0x00,0x01,0x03,0xb2,0x08,0x34,0x00,0x01,0x04,0xb6,0x08,0x34,0x00,0x01,0x02,0x81,0x08,0x34,0x00,0x01,0x04,0x87,0x08,0x34,0x00,0x01,0x03,0xfa,0x08,0x34,0x00,0x01,0x06,0xe4, +0x08,0x34,0x00,0x01,0x04,0xb0,0x08,0x34,0x00,0x01,0x02,0xc8,0x08,0x34,0x00,0x01,0x03,0x65,0x08,0x34,0x00,0x01,0x02,0xb6,0x08,0x34,0x00,0x01,0x03,0xd5,0x08,0x34,0x00,0x01,0x05,0xc8,0x08,0x34,0x00,0x01,0x03,0xac,0x08,0x34,0x00,0x01,0x03,0xdf,0x08,0x34,0x00,0x01,0x03,0x9e,0x08,0x34,0x00,0x01,0x04,0x5a,0x08,0x34,0x00,0x01, +0x06,0xe2,0x08,0x34,0x00,0x01,0x06,0xa8,0x08,0x34,0x00,0x01,0x07,0x72,0x08,0x34,0x00,0x01,0x07,0x6c,0x08,0x34,0x00,0x01,0x02,0x31,0x08,0x34,0x00,0x01,0x04,0x79,0x08,0x34,0x00,0x01,0x05,0x65,0x08,0x34,0x00,0x01,0x02,0x75,0x08,0x34,0x00,0x01,0x02,0x85,0x08,0x34,0x00,0x01,0x03,0x85,0x08,0x34,0x00,0x01,0x04,0xfc,0x08,0x34, +0x00,0x01,0x03,0xf6,0x08,0x34,0x00,0x01,0x04,0xd9,0x08,0x34,0x00,0x01,0x01,0xee,0x08,0x34,0x00,0x01,0x06,0x1a,0x08,0x34,0x00,0x01,0x04,0xc7,0x08,0x34,0x00,0x01,0x05,0xc4,0x08,0x34,0x00,0x01,0x06,0x8e,0x08,0x34,0x00,0x01,0x04,0xe8,0x08,0x34,0x00,0x01,0x04,0x93,0x08,0x34,0x00,0x01,0x04,0x9e,0x08,0x34,0x00,0x01,0x04,0xf6, +0x08,0x34,0x00,0x01,0x03,0xba,0x08,0x34,0x00,0x01,0x05,0xee,0x08,0x34,0x00,0x01,0x04,0x94,0x08,0x34,0x00,0x01,0x04,0xbc,0x08,0x34,0x00,0x01,0x04,0x0e,0x08,0x34,0x00,0x01,0x04,0x54,0x08,0x34,0x00,0x01,0x05,0x89,0x08,0x34,0x00,0x01,0x06,0xfe,0x08,0x34,0x00,0x01,0x02,0x4e,0x08,0x34,0x00,0x01,0x02,0x3a,0x08,0x34,0x00,0x01, +0x03,0xfc,0x08,0x34,0x00,0x01,0x07,0x23,0x08,0x34,0x00,0x01,0x07,0xc0,0x08,0x34,0x00,0x01,0x06,0x52,0x08,0x34,0x00,0x01,0x04,0xcf,0x08,0x34,0x00,0x01,0x04,0x9c,0x08,0x34,0x00,0x01,0x04,0x21,0x08,0x34,0x00,0x01,0x02,0x5e,0x08,0x34,0x00,0x01,0x02,0xb8,0x08,0x34,0x00,0x01,0x04,0x33,0x08,0x34,0x00,0x01,0x06,0x0a,0x08,0x34, +0x00,0x01,0x05,0xb2,0x08,0x34,0x00,0x01,0x04,0x8e,0x08,0x34,0x00,0x01,0x04,0x23,0x08,0x34,0x00,0x01,0x04,0xe2,0x08,0x34,0x00,0x01,0x03,0x0a,0x08,0x34,0x00,0x01,0x03,0x27,0x08,0x34,0x00,0x01,0x04,0x5e,0x08,0x34,0x00,0x01,0x09,0xe8,0x08,0x34,0x00,0x01,0x09,0x1c,0x08,0x34,0x00,0x01,0x08,0x33,0x08,0x34,0x00,0x01,0x06,0xd9, +0x08,0x34,0x00,0x01,0x05,0xc2,0x08,0x34,0x00,0x01,0x04,0x01,0x08,0x34,0x00,0x01,0x08,0x94,0x08,0x34,0x00,0x01,0x07,0xbe,0x08,0x34,0x00,0x01,0x06,0x77,0x08,0x34,0x00,0x01,0x04,0x0a,0x08,0x34,0x00,0x01,0x06,0xa0,0x08,0x34,0x00,0x01,0x03,0x89,0x08,0x34,0x00,0x01,0x07,0xfe,0x08,0x34,0x00,0x01,0x05,0x83,0x08,0x34,0x00,0x01, +0x04,0x08,0x08,0x34,0x00,0x01,0x03,0x70,0x08,0x34,0x00,0x01,0x05,0xdf,0x08,0x34,0x00,0x01,0x04,0x89,0x08,0x34,0x00,0x01,0x03,0x4e,0x08,0x34,0x00,0x01,0x04,0x68,0x08,0x34,0x00,0x01,0x04,0x3c,0x08,0x34,0x00,0x01,0x03,0xa8,0x08,0x34,0x00,0x01,0x02,0x18,0x08,0x34,0x00,0x01,0x02,0x90,0x08,0x34,0x00,0x01,0x02,0x3e,0x08,0x34, +0x00,0x01,0x03,0x02,0x08,0x34,0x00,0x01,0x04,0xd3,0x08,0x34,0x00,0x01,0x04,0x72,0x08,0x34,0x00,0x01,0x05,0x96,0x08,0x34,0x00,0x01,0x05,0x1a,0x08,0x34,0x00,0x01,0x02,0xae,0x08,0x34,0x00,0x01,0x03,0xa2,0x08,0x34,0x00,0x01,0x03,0x2f,0x08,0x34,0x00,0x01,0x01,0xfa,0x08,0x34,0x00,0x01,0x02,0x10,0x08,0x34,0x00,0x01,0x02,0x44, +0x08,0x34,0x00,0x01,0x04,0xcb,0x08,0x34,0x00,0x01,0x04,0xc2,0x08,0x34,0x00,0x01,0x04,0x77,0x08,0x34,0x00,0x01,0x03,0x56,0x08,0x34,0x00,0x01,0x04,0x18,0x08,0x34,0x00,0x01,0x02,0xec,0x08,0x34,0x00,0x01,0x04,0x62,0x08,0x34,0x00,0x01,0x03,0x14,0x08,0x34,0x00,0x01,0x07,0x54,0x08,0x34,0x00,0x01,0x07,0x98,0x08,0x34,0x00,0x01, +0x07,0xcf,0x08,0x34,0x00,0x01,0x03,0xcf,0x08,0x34,0x00,0x01,0x05,0xbe,0x08,0x34,0x00,0x01,0x06,0x58,0x08,0x34,0x00,0x01,0x03,0xf4,0x08,0x34,0x00,0x01,0x05,0x27,0x08,0x34,0x00,0x01,0x02,0x60,0x08,0x34,0x00,0x01,0x05,0x0e,0x08,0x34,0x00,0x01,0x07,0x7a,0x08,0x34,0x00,0x01,0x04,0x16,0x08,0x34,0x00,0x01,0x03,0xb5,0x08,0x34, +0x00,0x01,0x03,0xb1,0x08,0x34,0x00,0x01,0x04,0x9f,0x08,0x34,0x00,0x01,0x07,0x3d,0x08,0x34,0x00,0x01,0x02,0x22,0x08,0x34,0x00,0x01,0x04,0x46,0x08,0x34,0x00,0x01,0x03,0x76,0x08,0x34,0x00,0x01,0x03,0x81,0x08,0x34,0x00,0x01,0x03,0x91,0x08,0x34,0x00,0x01,0x05,0xe0,0x08,0x34,0x00,0x01,0x04,0xc1,0x08,0x34,0x00,0x01,0x02,0xf4, +0x08,0x34,0x00,0x01,0x05,0x07,0x08,0x34,0x00,0x01,0x06,0x01,0x08,0x34,0x00,0x01,0x03,0x9c,0x08,0x34,0x00,0x01,0x02,0x4a,0x08,0x34,0x00,0x01,0x04,0x19,0x08,0x34,0x00,0x01,0x04,0x8d,0x08,0x34,0x00,0x01,0x05,0x98,0x08,0x34,0x00,0x01,0x01,0x90,0x01,0xfa,0x00,0x01,0x00,0x0c,0x01,0x0e,0x00,0x40,0x00,0x00,0x2b,0xce,0x00,0x00, +0x2b,0xd4,0x00,0x00,0x2b,0xd4,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xe0,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xe6,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xec,0x00,0x00,0x2b,0xec,0x00,0x00,0x2b,0xf2,0x00,0x00,0x2b,0xda,0x00,0x00, +0x2b,0xda,0x00,0x00,0x2b,0xf8,0x00,0x00,0x2b,0xfe,0x00,0x00,0x2c,0x04,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x10,0x00,0x00,0x2b,0xe0,0x00,0x00,0x2c,0x16,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x1c,0x00,0x00,0x2c,0x22,0x00,0x00, +0x2c,0x28,0x00,0x00,0x2c,0x2e,0x00,0x00,0x2c,0x2e,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00, +0x2c,0x3a,0x00,0x00,0x2c,0x40,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x46,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x4c,0x00,0x00,0x2c,0x52,0x00,0x00,0x2c,0x52,0x00,0x00,0x2c,0x58,0x00,0x00,0x2c,0x58,0x00,0x00,0x2c,0x5e,0x00,0x00,0x2c,0x5e,0x00,0x00,0x2c,0x64,0x00,0x40,0x2b,0x68,0x2b,0x6e, +0x2b,0x74,0x2b,0x7a,0x2b,0x80,0x2b,0x86,0x2b,0x8c,0x2b,0x92,0x2b,0x98,0x2b,0x9e,0x2b,0xa4,0x2b,0xaa,0x2b,0xb0,0x2b,0xaa,0x2b,0xaa,0x2b,0xaa,0x2b,0xb6,0x2b,0x92,0x2b,0xbc,0x2b,0xc2,0x2b,0xc2,0x2b,0xb6,0x2b,0xc8,0x2b,0xce,0x2b,0xd4,0x2b,0xda,0x2b,0xe0,0x2b,0xaa,0x2b,0xe6,0x2b,0xec,0x2b,0xf2,0x2b,0xf8,0x2b,0xfe,0x2c,0x04, +0x2c,0x0a,0x2c,0x0a,0x2c,0x10,0x2c,0x10,0x2c,0x16,0x2c,0x10,0x2c,0x10,0x2c,0x10,0x2c,0x1c,0x2c,0x1c,0x2c,0x10,0x2c,0x10,0x2c,0x22,0x2c,0x10,0x2c,0x10,0x2c,0x28,0x2c,0x2e,0x2b,0xb6,0x2c,0x2e,0x2c,0x34,0x2c,0x3a,0x2c,0x3a,0x2b,0x92,0x2c,0x40,0x2c,0x40,0x2c,0x46,0x2c,0x46,0x2c,0x4c,0x2c,0x4c,0x2c,0x52,0x00,0x02,0x00,0x11, +0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79,0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57, +0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f,0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x02,0x00,0x11,0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79, +0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57,0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f, +0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x01,0x01,0x12,0x01,0x6a,0x00,0x01,0x00,0x0c,0x00,0xba,0x00,0x2b,0x00,0x00,0x2a,0xf6,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x02,0x00,0x00,0x2b,0x08,0x00,0x00,0x2b,0x0e,0x00,0x00,0x2b,0x14,0x00,0x00,0x2b,0x14,0x00,0x00, +0x2b,0x14,0x00,0x00,0x2b,0x1a,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x20,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x20,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x26,0x00,0x00,0x2b,0x2c,0x00,0x00,0x2b,0x32,0x00,0x00, +0x2b,0x38,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x3e,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x44,0x00,0x00,0x2b,0x4a,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x50,0x00,0x00,0x2b,0x56,0x00,0x00,0x2b,0x5c,0x00,0x00,0x2b,0x62,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x6e,0x00,0x00,0x2b,0x26,0x00,0x00, +0x2b,0x74,0x00,0x00,0x2b,0x7a,0x00,0x00,0x2b,0x80,0x00,0x2b,0x2a,0xd8,0x2a,0xde,0x2a,0xde,0x2a,0xde,0x2a,0xde,0x2a,0xe4,0x2a,0xde,0x2a,0xde,0x2a,0xe4,0x2a,0xea,0x2a,0xf0,0x2a,0xf6,0x2a,0xe4,0x2a,0xfc,0x2a,0xe4,0x2b,0x02,0x2a,0xde,0x2a,0xde,0x2b,0x08,0x2b,0x0e,0x2b,0x14,0x2b,0x1a,0x2b,0x20,0x2b,0x26,0x2a,0xe4,0x2a,0xe4, +0x2b,0x2c,0x2b,0x14,0x2b,0x32,0x2b,0x38,0x2a,0xfc,0x2a,0xde,0x2a,0xe4,0x2a,0xe4,0x2b,0x3e,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xde,0x2b,0x44,0x2b,0x4a,0x00,0x02,0x00,0x0e,0x02,0x45,0x02,0x45,0x00,0x00,0x04,0x75,0x04,0x78,0x00,0x01,0x04,0x7b,0x04,0x7f,0x00,0x05,0x04,0x82,0x04,0x84,0x00,0x0a,0x04,0x87, +0x04,0x91,0x00,0x0d,0x04,0x97,0x04,0x9a,0x00,0x18,0x04,0xa3,0x04,0xa3,0x00,0x1c,0x04,0xa5,0x04,0xa7,0x00,0x1d,0x04,0xab,0x04,0xac,0x00,0x20,0x07,0x58,0x07,0x5b,0x00,0x22,0x07,0xed,0x07,0xee,0x00,0x26,0x08,0x4e,0x08,0x4e,0x00,0x28,0x0a,0xe1,0x0a,0xe1,0x00,0x29,0x0a,0xe3,0x0a,0xe3,0x00,0x2a,0x00,0x02,0x00,0x0e,0x02,0x45, +0x02,0x45,0x00,0x00,0x04,0x75,0x04,0x78,0x00,0x01,0x04,0x7b,0x04,0x7f,0x00,0x05,0x04,0x82,0x04,0x84,0x00,0x0a,0x04,0x87,0x04,0x91,0x00,0x0d,0x04,0x97,0x04,0x9a,0x00,0x18,0x04,0xa3,0x04,0xa3,0x00,0x1c,0x04,0xa5,0x04,0xa7,0x00,0x1d,0x04,0xab,0x04,0xac,0x00,0x20,0x07,0x58,0x07,0x5b,0x00,0x22,0x07,0xed,0x07,0xee,0x00,0x26, +0x08,0x4e,0x08,0x4e,0x00,0x28,0x0a,0xe1,0x0a,0xe1,0x00,0x29,0x0a,0xe3,0x0a,0xe3,0x00,0x2a,0x00,0x01,0x00,0x18,0x00,0x1e,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x27,0xb4,0x00,0x02,0x2a,0x36,0x2a,0x3c,0x00,0x01,0x00,0x01,0x04,0x64,0x00,0x01,0x00,0x02,0x02,0xcf,0x02,0xd0,0x00,0x01,0x0e,0xec,0x0f,0x62,0x00,0x02, +0x00,0x0c,0x01,0xca,0x00,0x6f,0x00,0x00,0x2a,0x22,0x00,0x00,0x2a,0x28,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0x34,0x00,0x00,0x2a,0x3a,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0x40,0x00,0x00,0x2a,0x40,0x00,0x00,0x2a,0x46,0x00,0x00,0x2a,0x22,0x00,0x00,0x2a,0x4c,0x00,0x00,0x2a,0x52,0x00,0x01,0x2a,0x58,0x00,0x00,0x2a,0x5e,0x00,0x01, +0x2a,0x64,0x00,0x00,0x2a,0x4c,0x00,0x00,0x2a,0x52,0x00,0x00,0x2a,0x6a,0x00,0x00,0x2a,0x70,0x00,0x00,0x2a,0x76,0x00,0x00,0x2a,0x7c,0x00,0x00,0x2a,0x82,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0x8e,0x00,0x01,0x2a,0x94,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0x9a,0x00,0x00,0x2a,0x88,0x00,0x01,0x2a,0xa0,0x00,0x00,0x2a,0xa6,0x00,0x01, +0x2a,0xac,0x00,0x00,0x2a,0xb2,0x00,0x00,0x2a,0xb8,0x00,0x00,0x2a,0xbe,0x00,0x00,0x2a,0xc4,0x00,0x00,0x2a,0xca,0x00,0x01,0x2a,0xd0,0x00,0x00,0x2a,0x3a,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0xd6,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xe2,0x00,0x00,0x2a,0xe8,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xe8,0x00,0x00,0x2a,0x22,0x00,0x00, +0x2a,0x22,0x00,0x00,0x2a,0x22,0x00,0x01,0x2a,0xee,0x00,0x00,0x2a,0xf4,0x00,0x00,0x2a,0xfa,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x06,0x00,0x00,0x2a,0x22,0x00,0x00,0x2b,0x0c,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2b,0x12,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2b,0x18,0x00,0x00,0x2b,0x1e,0x00,0x00, +0x2b,0x18,0x00,0x00,0x2b,0x1e,0x00,0x00,0x2b,0x1e,0x00,0x01,0x2b,0x24,0x00,0x01,0x2b,0x24,0x00,0x00,0x2b,0x2a,0x00,0x00,0x2b,0x2a,0x00,0x01,0x2b,0x30,0x00,0x00,0x2b,0x36,0x00,0x00,0x2b,0x3c,0x00,0x01,0x2b,0x42,0x00,0x00,0x2b,0x48,0x00,0x00,0x2b,0x4e,0x00,0x00,0x2b,0x54,0x00,0x01,0x2b,0x5a,0x00,0x01,0x2b,0x60,0x00,0x01, +0x2b,0x66,0x00,0x00,0x2b,0x6c,0x00,0x00,0x2b,0x72,0x00,0x01,0x2b,0x78,0x00,0x00,0x2b,0x7e,0x00,0x00,0x2b,0x54,0x00,0x00,0x2b,0x54,0x00,0x01,0x2b,0x84,0x00,0x00,0x2b,0x48,0x00,0x00,0x2b,0x8a,0x00,0x01,0x2b,0x90,0x00,0x01,0x2b,0x90,0x00,0x00,0x2b,0x36,0x00,0x00,0x2b,0x96,0x00,0x00,0x2b,0x9c,0x00,0x00,0x2b,0x6c,0x00,0x00, +0x2b,0xa2,0x00,0x00,0x2b,0xa8,0x00,0x00,0x2b,0xae,0x00,0x00,0x2b,0xb4,0x00,0x00,0x2b,0xba,0x00,0x00,0x2b,0xc0,0x00,0x00,0x2b,0xc6,0x00,0x01,0x2b,0xcc,0x00,0x00,0x2b,0xd2,0x00,0x00,0x2b,0xd8,0x00,0x00,0x2b,0xde,0x00,0x00,0x2b,0xe4,0x00,0x00,0x2b,0xea,0x00,0x00,0x2b,0xf0,0x00,0x00,0x2b,0xf6,0x00,0x00,0x2b,0xfc,0x00,0x01, +0x2c,0x02,0x03,0x48,0x2a,0x4a,0x2a,0x50,0x2a,0x56,0x2a,0x50,0x2a,0x5c,0x2a,0x50,0x2a,0x4a,0x2a,0x62,0x2a,0x68,0x2a,0x6e,0x2a,0x74,0x2a,0x7a,0x2a,0x80,0x2a,0x7a,0x2a,0x86,0x2a,0x8c,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0xa4,0x2a,0x9e,0x2a,0xaa,0x2a,0x98,0x2a,0xb0,0x2a,0xb6,0x2a,0xbc,0x2a,0xb6, +0x2a,0xc2,0x2a,0xc8,0x2a,0xc2,0x2a,0xc8,0x2a,0xce,0x2a,0xd4,0x2a,0xda,0x2a,0xd4,0x2a,0xe0,0x2a,0xe6,0x2a,0xec,0x2a,0xd4,0x2a,0xf2,0x2a,0xd4,0x2a,0xf8,0x2a,0xe6,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2b,0x0a,0x2b,0x04,0x2b,0x0a,0x2b,0x04,0x2b,0x10,0x2b,0x16,0x2b,0x1c,0x2b,0x22,0x2b,0x28,0x2b,0x2e,0x2b,0x34,0x2a,0x7a, +0x2b,0x3a,0x2b,0x40,0x2b,0x46,0x2b,0x4c,0x2b,0x52,0x2b,0x58,0x2a,0x68,0x2b,0x5e,0x2b,0x64,0x2b,0x6a,0x2b,0x70,0x2b,0x58,0x2b,0x64,0x2b,0x76,0x2b,0x7c,0x2a,0x7a,0x2b,0x82,0x2b,0x88,0x2b,0x8e,0x2b,0x94,0x2a,0x5c,0x2b,0x9a,0x2a,0x56,0x2b,0x9a,0x2b,0xa0,0x2b,0xa6,0x2a,0x4a,0x2a,0x62,0x2b,0xac,0x2b,0xb2,0x2a,0x4a,0x2b,0x9a, +0x2b,0xb8,0x2b,0xbe,0x2b,0xc4,0x2b,0xca,0x2b,0xd0,0x2b,0xd6,0x2b,0xdc,0x2b,0xd6,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0xaa,0x2a,0x98,0x2b,0xe2,0x2b,0xe8,0x2b,0xee,0x2b,0xe8,0x2b,0xf4,0x2b,0xfa,0x2c,0x00,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x2c,0x12,0x2c,0x18,0x2c,0x12,0x2c,0x18,0x2c,0x1e,0x2c,0x24, +0x2c,0x1e,0x2c,0x24,0x2c,0x2a,0x2a,0xe6,0x2c,0x30,0x2a,0xe6,0x2c,0x36,0x2c,0x3c,0x2c,0x42,0x2c,0x48,0x2c,0x4e,0x2c,0x54,0x2c,0x5a,0x2c,0x60,0x2c,0x66,0x2c,0x6c,0x2c,0x72,0x2c,0x78,0x2c,0x7e,0x2c,0x84,0x2c,0x8a,0x2b,0xca,0x2c,0x90,0x2b,0xa6,0x2c,0x96,0x2c,0x9c,0x2c,0x96,0x2c,0xa2,0x2a,0x68,0x2a,0x7a,0x2c,0xa8,0x2b,0x04, +0x2c,0xa8,0x2b,0x04,0x2b,0xb8,0x2b,0xd6,0x2b,0x1c,0x2b,0x16,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2c,0xb4,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba,0x2c,0xc0,0x2b,0xfa,0x2c,0xc6,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x2c,0x96,0x2c,0x9c,0x2b,0x64,0x2b,0x76,0x2a,0x68,0x2b,0x5e, +0x2c,0xde,0x2b,0x58,0x2c,0xe4,0x2b,0xca,0x2c,0x66,0x2c,0x6c,0x2c,0xea,0x2b,0xd6,0x2c,0xf0,0x2a,0x7a,0x2c,0xf6,0x2b,0xe8,0x2c,0xfc,0x2b,0xfa,0x2d,0x02,0x2c,0x84,0x2d,0x08,0x2b,0xca,0x2a,0x68,0x2d,0x0e,0x2d,0x14,0x2d,0x1a,0x2c,0xe4,0x2b,0xca,0x2b,0xc4,0x2b,0xca,0x2d,0x20,0x2d,0x26,0x2d,0x2c,0x2d,0x32,0x2d,0x38,0x2d,0x26, +0x2d,0x3e,0x2d,0x32,0x2d,0x44,0x2c,0x48,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x2d,0x50,0x2d,0x56,0x2d,0x5c,0x2c,0x54,0x2d,0x62,0x2b,0x9a,0x2d,0x62,0x2a,0x50,0x2a,0x56,0x2b,0x9a,0x2a,0x56,0x2a,0x50,0x2a,0x4a,0x2d,0x68,0x2a,0x4a,0x2d,0x68,0x2a,0x4a,0x2b,0x9a,0x2a,0x4a,0x2a,0x50,0x2d,0x6e,0x2b,0xa6,0x2d,0x74,0x2d,0x7a, +0x2d,0x80,0x2c,0x9c,0x2d,0x86,0x2b,0x76,0x2d,0x8c,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2d,0x98,0x2b,0xd0,0x2d,0x9e,0x2a,0x74,0x2d,0xa4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2d,0x98,0x2d,0xb0,0x2a,0x98,0x2d,0xb0,0x2a,0x98, +0x2d,0xb6,0x2a,0x9e,0x2d,0xbc,0x2a,0x98,0x2d,0xbc,0x2a,0x98,0x2d,0xc2,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2a,0x8c,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba,0x2d,0xc8,0x2a,0x98,0x2d,0xc8,0x2a,0x98,0x2d,0xc2,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba, +0x2b,0xe2,0x2d,0xce,0x2b,0xe2,0x2d,0xd4,0x2b,0xee,0x2d,0xd4,0x2b,0xee,0x2b,0xe8,0x2b,0xe2,0x2d,0xd4,0x2d,0xda,0x2b,0xe8,0x2d,0xda,0x2b,0xe8,0x2d,0xda,0x2b,0xe8,0x2d,0xe0,0x2b,0xfa,0x2b,0xf4,0x2b,0xfa,0x2b,0xf4,0x2d,0xe6,0x2b,0xf4,0x2d,0xec,0x2c,0x00,0x2d,0xe6,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0x06,0x2d,0xf2, +0x2d,0xf8,0x2d,0xfe,0x2c,0x06,0x2e,0x04,0x2a,0xb0,0x2e,0x0a,0x2c,0x06,0x2e,0x04,0x2a,0xbc,0x2e,0x0a,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2e,0x16,0x2e,0x1c,0x2c,0x18,0x2e,0x22,0x2a,0xc8,0x2e,0x28,0x2c,0x24,0x2e,0x2e,0x2a,0xe6,0x2e,0x34,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4,0x2e,0x40,0x2a,0xd4,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48, +0x2c,0xa8,0x2e,0x46,0x2c,0xa8,0x2e,0x46,0x2c,0x42,0x2c,0x48,0x2a,0xfe,0x2e,0x46,0x2a,0xfe,0x2e,0x46,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x4c,0x2c,0xa8,0x2e,0x4c,0x2d,0x44,0x2c,0x48,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x2e,0x52,0x2c,0x54,0x2e,0x58,0x2c,0x54,0x2e,0x5e,0x2e,0x64,0x2e,0x6a,0x2e,0x70,0x2c,0xc6,0x2c,0xcc, +0x2b,0x10,0x2b,0x16,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x82,0x2c,0x60,0x2e,0x88,0x2b,0x16,0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2d,0x98,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x2e,0x8e,0x2c,0xcc,0x2e,0x94,0x2b,0x16,0x2c,0xd2,0x2e,0x9a,0x2c,0xd8,0x2e,0xa0,0x2c,0xd2,0x2e,0xa6,0x2c,0xd8,0x2d,0x98,0x2e,0xac,0x2c,0xcc, +0x2e,0xb2,0x2b,0x16,0x2c,0x66,0x2c,0x6c,0x2e,0xb8,0x2b,0x22,0x2c,0x66,0x2c,0x6c,0x2e,0xbe,0x2b,0x22,0x2c,0x66,0x2c,0x6c,0x2e,0xc4,0x2b,0x22,0x2c,0x66,0x2e,0xca,0x2b,0x1c,0x2e,0xd0,0x2e,0xd6,0x2e,0xdc,0x2b,0x34,0x2a,0x6e,0x2e,0xe2,0x2c,0x84,0x2e,0xd6,0x2e,0xe8,0x2b,0x34,0x2d,0xa4,0x2e,0xee,0x2c,0x84,0x2a,0xaa,0x2a,0x98, +0x2a,0xaa,0x2a,0x98,0x2a,0xa4,0x2c,0xba,0x2c,0x90,0x2b,0xa6,0x2e,0xf4,0x2e,0xfa,0x2f,0x00,0x2b,0xa6,0x2f,0x06,0x2b,0xa6,0x2f,0x0c,0x2b,0xa6,0x2f,0x00,0x2b,0xa6,0x2f,0x12,0x2b,0xa6,0x2f,0x18,0x2b,0xa6,0x2f,0x1e,0x2f,0x24,0x2f,0x2a,0x2b,0x88,0x2f,0x30,0x2c,0x9c,0x2f,0x36,0x2b,0x76,0x2f,0x3c,0x2b,0x5e,0x2f,0x12,0x2b,0xa6, +0x2f,0x42,0x2f,0x48,0x2f,0x4e,0x2f,0x54,0x2f,0x42,0x2f,0x5a,0x2f,0x4e,0x2f,0x60,0x2c,0x06,0x2d,0xf2,0x2a,0xbc,0x2d,0xfe,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2f,0x66,0x2c,0x30,0x2a,0xe6,0x2f,0x6c,0x2a,0xe6,0x2a,0xec,0x2f,0x72,0x2a,0xf2,0x2f,0x72,0x2c,0x72,0x2f,0x78,0x2f,0x7e,0x2c,0xcc,0x2f,0x7e,0x2c,0xcc,0x2f,0x84,0x2f,0x8a, +0x2f,0x90,0x2b,0xe8,0x2f,0x96,0x2b,0xe8,0x2d,0xe0,0x2b,0xfa,0x2d,0xe0,0x2b,0xfa,0x2f,0x9c,0x2b,0x40,0x2f,0xa2,0x2b,0x4c,0x2f,0xa8,0x2f,0xae,0x2f,0xb4,0x2f,0xba,0x2e,0xb8,0x2b,0x16,0x2e,0xbe,0x2b,0x16,0x2e,0xc4,0x2b,0x16,0x2b,0x1c,0x2e,0xd0,0x2b,0xb8,0x2f,0xc0,0x2a,0x68,0x2f,0xc6,0x2b,0xdc,0x2b,0xbe,0x2a,0x80,0x2a,0x6e, +0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2c,0xb4,0x2b,0xd0,0x2d,0x92,0x2a,0x74,0x2c,0xb4,0x2b,0xd0,0x2e,0x9a,0x2b,0x34,0x2f,0xcc,0x2b,0xb8,0x2f,0xd2,0x2a,0x68,0x2f,0xd8,0x2f,0xde,0x2b,0xd6,0x2f,0x3c,0x2a,0x7a,0x2a,0xaa,0x2a,0x98,0x2a,0xaa,0x2a,0x98,0x2a,0xa4,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba, +0x2b,0xe2,0x2f,0xe4,0x2b,0xe2,0x2f,0xea,0x2b,0xf4,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2f,0xf0,0x2a,0xb6,0x2f,0xf6,0x2a,0xe6,0x2f,0xfc,0x2a,0xe6,0x2a,0xec,0x2a,0xd4,0x2a,0xf2,0x2a,0xd4,0x30,0x02,0x2a,0xe6,0x30,0x08,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4,0x2e,0x40,0x2a,0xd4,0x30,0x02,0x2a,0xe6,0x30,0x08,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4, +0x2e,0x40,0x2a,0xd4,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x30,0x0e,0x2c,0xa8,0x30,0x0e,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x4c,0x2c,0xa8,0x30,0x14,0x30,0x1a,0x2c,0xcc,0x2e,0x7c,0x2b,0x16,0x2e,0x7c,0x2b,0x16,0x30,0x20,0x2c,0xcc,0x2e,0x88,0x2b,0x16,0x2e,0x88,0x2b,0x16,0x2c,0xc6,0x2c,0xae,0x2b,0x10,0x30,0x26,0x2b,0x10,0x30,0x26, +0x30,0x2c,0x2c,0x78,0x30,0x32,0x2b,0x2e,0x2c,0x72,0x30,0x38,0x2b,0x28,0x30,0x3e,0x2e,0xd6,0x30,0x44,0x2b,0x34,0x2b,0x5e,0x30,0x4a,0x2c,0x84,0x30,0x50,0x2a,0x7a,0x30,0x56,0x2c,0x84,0x30,0x5c,0x2a,0x7a,0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2c,0x6c,0x2b,0x1c,0x2b,0x22,0x2b,0x1c,0x2b,0x16,0x2c,0xc0,0x2b,0xfa,0x30,0x62,0x2b,0xfa, +0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2b,0xf4,0x2b,0xfa,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0xfc,0x2b,0xfa,0x2d,0xe0,0x2b,0xfa,0x2b,0xf4,0x2b,0xfa,0x2b,0xf4,0x2d,0xe6,0x2b,0xf4,0x2d,0xec,0x2c,0x00,0x2d,0xe6,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x30,0x62,0x2b,0xfa,0x30,0x68,0x30,0x6e, +0x2b,0x64,0x30,0x74,0x2a,0x68,0x2d,0xa4,0x2a,0x68,0x2d,0xa4,0x2b,0xa0,0x2b,0xa6,0x2b,0x7c,0x2a,0x7a,0x2b,0xb8,0x2b,0xbe,0x2a,0x68,0x2a,0x6e,0x2b,0xd0,0x2b,0xd6,0x2a,0x74,0x2a,0x7a,0x2b,0xdc,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2a,0x86,0x2a,0x8c,0x2a,0x86,0x2a,0x9e,0x2a,0xa4,0x2a,0x9e,0x30,0x7a,0x2b,0xe8,0x30,0x80,0x2b,0xe8, +0x2c,0x06,0x2c,0x0c,0x2a,0xb0,0x2a,0xb6,0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2c,0x12,0x2c,0x18,0x2a,0xc2,0x2a,0xc8,0x2c,0x12,0x2c,0x18,0x2a,0xc2,0x2a,0xc8,0x2c,0x1e,0x2c,0x24,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x2c,0x24,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x30,0x86,0x30,0x8c,0x2c,0x9c,0x30,0x92,0x2b,0x76, +0x2a,0x74,0x2b,0x5e,0x2a,0x74,0x2b,0x5e,0x30,0x98,0x2c,0x9c,0x30,0x9e,0x2b,0x76,0x2a,0x80,0x2b,0x5e,0x2a,0x80,0x2b,0x5e,0x2c,0x42,0x2c,0x48,0x2c,0x4e,0x2c,0x54,0x2c,0x5a,0x2c,0x60,0x2b,0x10,0x2b,0x16,0x2c,0x72,0x2c,0x78,0x2b,0x28,0x2b,0x2e,0x2c,0x7e,0x2c,0x84,0x2b,0x34,0x2a,0x7a,0x30,0xa4,0x2a,0x9e,0x30,0xaa,0x2b,0x40, +0x30,0xb0,0x30,0xb6,0x2c,0x90,0x2b,0xa6,0x2a,0x68,0x2a,0x7a,0x2a,0x68,0x2a,0x7a,0x2a,0x68,0x2b,0x5e,0x2b,0xb8,0x2b,0xd6,0x2a,0x68,0x2a,0x7a,0x2d,0x5c,0x2c,0x54,0x2c,0xa8,0x2b,0x04,0x2c,0xa8,0x2b,0x04,0x2d,0x6e,0x2b,0xa6,0x2d,0x74,0x2d,0x7a,0x30,0xbc,0x2a,0x7a,0x30,0xbc,0x2a,0x7a,0x2c,0xea,0x2b,0xd6,0x2c,0xf0,0x2a,0x7a, +0x2d,0x8c,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2d,0x98,0x2b,0xd0,0x2d,0x9e,0x2a,0x74,0x2d,0xa4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2c,0xb4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2d,0x98,0x2d,0xb6,0x2a,0x9e,0x2d,0xc2,0x2a,0x9e, +0x2a,0x86,0x2a,0x8c,0x2a,0x86,0x2c,0xba,0x2d,0xc2,0x2a,0x9e,0x2a,0x86,0x2c,0xba,0x2a,0x86,0x2c,0xba,0x30,0xc2,0x2b,0xe8,0x30,0x7a,0x2d,0xce,0x30,0x7a,0x2d,0xd4,0x30,0x80,0x2d,0xd4,0x30,0x80,0x2b,0xe8,0x30,0x7a,0x2d,0xd4,0x30,0xc8,0x2b,0xe8,0x30,0xc8,0x2b,0xe8,0x30,0xc8,0x2b,0xe8,0x2c,0x06,0x2d,0xf2,0x2d,0xf8,0x2d,0xfe, +0x2c,0x06,0x2e,0x04,0x2a,0xb0,0x2e,0x0a,0x2c,0x06,0x2e,0x04,0x2a,0xbc,0x2e,0x0a,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2e,0x16,0x2e,0x1c,0x2c,0x18,0x2e,0x22,0x2a,0xc8,0x2e,0x28,0x2c,0x24,0x2e,0x28,0x30,0x86,0x2e,0x28,0x30,0x86,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x2d,0x44,0x2c,0x48,0x2c,0x42,0x2c,0x48, +0x2d,0x44,0x2c,0x48,0x2e,0x52,0x2c,0x54,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2e,0x58,0x2c,0x54,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x30,0xce,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2e,0x5e,0x2e,0x64,0x2e,0x6a,0x2e,0x70,0x30,0xce,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x82,0x2c,0x60, +0x2e,0x88,0x2b,0x16,0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2d,0x98,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x30,0xd4,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x30,0xda,0x2c,0xcc,0x2e,0x94,0x2b,0x16,0x30,0xd4,0x2e,0x9a,0x2c,0xd8,0x2e,0xa0,0x30,0xd4,0x2e,0xa6,0x2c,0xd8,0x2d,0x98,0x30,0xe0,0x2c,0xcc,0x2e,0xb2,0x2b,0x16,0x2c,0x66,0x2c,0x6c, +0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2e,0xca,0x30,0xe6,0x30,0xec,0x2b,0x34,0x2a,0x6e,0x2d,0x02,0x2c,0x84,0x2e,0xe2,0x2c,0x84,0x2c,0xf0,0x2a,0x7a,0x2c,0xf0,0x2a,0x7a,0x30,0xe6,0x2e,0xe8,0x2b,0x34,0x2d,0xa4,0x2e,0xee,0x2c,0x84,0x30,0xa4,0x2a,0x9e,0x30,0xb0,0x30,0xb6,0x2a,0xa4,0x2c,0xba,0x30,0xf2,0x2d,0x56, +0x30,0xf8,0x2d,0x56,0x2c,0x90,0x2b,0xa6,0x2e,0xf4,0x2e,0xfa,0x2f,0x00,0x2b,0xa6,0x2f,0x06,0x2b,0xa6,0x2f,0x0c,0x2b,0xa6,0x2f,0x00,0x2b,0xa6,0x2f,0x12,0x2b,0xa6,0x2f,0x18,0x2b,0xa6,0x2a,0x68,0x2b,0x5e,0x2f,0x3c,0x2b,0x5e,0x2f,0x12,0x2b,0xa6,0x2a,0x68,0x2d,0x98,0x2a,0x68,0x2d,0x98,0x2a,0x68,0x2c,0xb4,0x2a,0x68,0x2c,0xb4, +0x2c,0x06,0x2d,0xf2,0x2a,0xbc,0x2d,0xfe,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2f,0x66,0x2b,0xb8,0x2f,0xc0,0x2a,0x68,0x2a,0x6e,0x2b,0xdc,0x2b,0xbe,0x2a,0x80,0x2a,0x6e,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2c,0xb4,0x2b,0xd0,0x2d,0x92,0x2a,0x74,0x2c,0xb4,0x2b,0xd0,0x2e,0x9a,0x2b,0x34,0x2f,0xcc,0x2b,0xb8,0x2f,0xd2,0x2a,0x68,0x2f,0xd8, +0x2f,0xde,0x2b,0xd6,0x2f,0x3c,0x2a,0x7a,0x2a,0xa4,0x2a,0x9e,0x2a,0x86,0x2c,0xba,0x30,0xfe,0x2f,0xe4,0x30,0x7a,0x2f,0xea,0x2b,0xf4,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2f,0xf0,0x2a,0xb6,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x31,0x04,0x2c,0xcc,0x31,0x0a,0x2c,0xcc,0x30,0xce,0x2c,0xae,0x30,0x2c,0x2c,0x78,0x30,0x32,0x2b,0x2e, +0x2c,0x72,0x30,0x38,0x2b,0x28,0x30,0x3e,0x30,0xe6,0x31,0x10,0x2b,0x34,0x2b,0x5e,0x30,0x4a,0x2c,0x84,0x30,0x50,0x2a,0x7a,0x30,0x56,0x2c,0x84,0x30,0x5c,0x2a,0x7a,0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2a,0x92,0x31,0x16,0x2a,0x92,0x31,0x16,0x2a,0x86,0x31,0x1c,0x2a,0x86,0x31,0x1c,0x2a,0x92,0x31,0x22,0x2a,0x92,0x31,0x22, +0x31,0x28,0x31,0x2e,0x31,0x28,0x31,0x2e,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0x34,0x2a,0xb6,0x31,0x34,0x2a,0xb6,0x31,0x3a,0x2b,0xfa,0x31,0x3a,0x2b,0xfa,0x31,0x40,0x2a,0x98,0x31,0x40,0x2a,0x98,0x31,0x46,0x2a,0x9e,0x31,0x46,0x2a,0x9e,0x31,0x4c,0x31,0x52,0x31,0x4c,0x31,0x58,0x31,0x4c,0x31,0x52,0x31,0x4c,0x31,0x58, +0x31,0x5e,0x2c,0x9c,0x31,0x64,0x2b,0x76,0x31,0x6a,0x2b,0x5e,0x31,0x6a,0x2b,0x5e,0x31,0x5e,0x2c,0x9c,0x31,0x64,0x2b,0x76,0x31,0x6a,0x2b,0x5e,0x31,0x6a,0x2b,0x5e,0x2f,0x42,0x31,0x70,0x31,0x76,0x31,0x70,0x2a,0x68,0x31,0x7c,0x2a,0x68,0x31,0x7c,0x31,0x82,0x31,0x88,0x31,0x82,0x31,0x88,0x31,0x8e,0x31,0x94,0x31,0x8e,0x31,0x94, +0x31,0x9a,0x2d,0x26,0x31,0xa0,0x2d,0x32,0x31,0x9a,0x2d,0x26,0x31,0xa0,0x2d,0x32,0x2a,0x92,0x31,0x16,0x2a,0x92,0x31,0x16,0x2a,0x86,0x31,0xa6,0x2a,0x86,0x31,0xa6,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0xac,0x2a,0xb6,0x31,0xac,0x2a,0xb6,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0xb2,0x2a,0xb6,0x31,0xb2,0x2a,0xb6, +0x2e,0x76,0x2c,0x60,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x7c,0x2b,0x16,0x31,0xb8,0x31,0xbe,0x31,0xc4,0x31,0xbe,0x31,0xca,0x31,0xd0,0x31,0xca,0x31,0xbe,0x31,0xd6,0x31,0xbe,0x31,0xd6,0x31,0xbe,0x31,0xca,0x31,0xd0,0x31,0xdc,0x31,0xbe,0x31,0xe2,0x31,0xbe,0x31,0xe2,0x31,0xbe,0x31,0xe8,0x2a,0xd4,0x31,0xe8,0x2a,0xd4, +0x31,0xee,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x31,0xf4,0x31,0xfa,0x31,0xf4,0x31,0xfa,0x31,0xe8,0x32,0x00,0x31,0xe8,0x32,0x00,0x31,0xee,0x32,0x00,0x31,0xee,0x32,0x00,0x31,0xee,0x31,0xfa,0x31,0xee,0x31,0xfa,0x32,0x06,0x2a,0xd4,0x32,0x06,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x32,0x0c,0x2a,0xd4,0x32,0x0c,0x2a,0xd4, +0x32,0x12,0x2a,0xd4,0x32,0x12,0x2a,0xd4,0x32,0x18,0x2a,0xd4,0x32,0x18,0x2a,0xd4,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x32,0x24,0x32,0x1e,0x32,0x24,0x32,0x2a,0x2a,0xc8,0x32,0x2a,0x2a,0xc8,0x32,0x1e,0x2e,0x16,0x32,0x1e,0x2e,0x16,0x32,0x30,0x32,0x36,0x32,0x30,0x32,0x3c, +0x32,0x42,0x32,0x36,0x32,0x42,0x32,0x3c,0x32,0x48,0x32,0x36,0x32,0x48,0x32,0x3c,0x32,0x4e,0x32,0x36,0x32,0x4e,0x32,0x3c,0x32,0x30,0x32,0x54,0x32,0x30,0x32,0x5a,0x32,0x30,0x32,0x36,0x32,0x30,0x32,0x3c,0x32,0x60,0x32,0x66,0x32,0x6c,0x32,0x66,0x32,0x72,0x32,0x66,0x32,0x78,0x32,0x66,0x32,0x60,0x32,0x66,0x32,0x60,0x32,0x7e, +0x32,0x60,0x32,0x84,0x32,0x6c,0x32,0x7e,0x32,0x6c,0x32,0x66,0x32,0x8a,0x32,0x66,0x32,0x78,0x32,0x66,0x32,0x60,0x32,0x66,0x32,0x8a,0x32,0x66,0x32,0x90,0x32,0x66,0x32,0x96,0x32,0x66,0x2b,0x82,0x2b,0x88,0x32,0x9c,0x2b,0x76,0x32,0xa2,0x2b,0x76,0x32,0xa8,0x2b,0x76,0x32,0xae,0x2b,0x76,0x32,0xae,0x32,0xb4,0x2d,0x86,0x2b,0x76, +0x32,0xba,0x2b,0x88,0x2f,0x36,0x2b,0x76,0x31,0x76,0x32,0xc0,0x31,0x64,0x2b,0x76,0x31,0x64,0x2b,0x76,0x31,0x76,0x32,0xc6,0x31,0x76,0x32,0xcc,0x32,0xd2,0x2d,0x32,0x32,0xd2,0x2d,0x32,0x2d,0x3e,0x2d,0x32,0x2d,0x3e,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x32,0xae,0x2b,0x76, +0x31,0x76,0x32,0xd8,0x32,0xae,0x32,0xde,0x32,0xe4,0x32,0xea,0x32,0xf0,0x32,0xf6,0x2b,0x52,0x2b,0x58,0x32,0x8a,0x32,0x66,0x32,0xfc,0x33,0x02,0x2a,0x68,0x33,0x08,0x32,0xfc,0x33,0x02,0x2a,0x68,0x33,0x08,0x33,0x0e,0x33,0x14,0x33,0x0e,0x33,0x14,0x33,0x1a,0x2a,0x8c,0x33,0x1a,0x2a,0x8c,0x33,0x20,0x2c,0x24,0x33,0x20,0x2c,0x24, +0x33,0x20,0x2c,0x24,0x33,0x20,0x2c,0x24,0x2c,0x42,0x33,0x26,0x33,0x2c,0x33,0x32,0x33,0x2c,0x33,0x32,0x33,0x38,0x33,0x26,0x33,0x3e,0x33,0x44,0x33,0x4a,0x33,0x32,0x33,0x4a,0x33,0x32,0x33,0x3e,0x33,0x44,0x33,0x50,0x33,0x56,0x33,0x5c,0x32,0xea,0x33,0x5c,0x2b,0x16,0x33,0x50,0x33,0x56,0x33,0x62,0x33,0x68,0x33,0x6e,0x2b,0x2e, +0x33,0x6e,0x2b,0x2e,0x33,0x62,0x33,0x68,0x33,0x74,0x33,0x7a,0x33,0x80,0x33,0x86,0x33,0x80,0x33,0x8c,0x33,0x92,0x33,0x98,0x33,0x9e,0x33,0x7a,0x33,0xa4,0x33,0x8c,0x33,0xa4,0x33,0x8c,0x33,0xaa,0x33,0x98,0x33,0xb0,0x33,0xb6,0x33,0xb0,0x33,0xb6,0x2c,0x90,0x33,0xbc,0x2c,0x90,0x33,0xbc,0x33,0xc2,0x33,0xc8,0x33,0xc2,0x33,0xc8, +0x2b,0xd0,0x33,0x02,0x33,0x80,0x33,0x8c,0x33,0x80,0x33,0x8c,0x2b,0xd0,0x33,0x02,0x30,0x7a,0x33,0xce,0x30,0x7a,0x33,0xce,0x2c,0x12,0x33,0xd4,0x2a,0xc2,0x33,0xda,0x2a,0xc2,0x33,0xda,0x2c,0x12,0x33,0xd4,0x2c,0xd2,0x2c,0xcc,0x33,0xe0,0x2b,0x16,0x33,0xe0,0x2b,0x16,0x2c,0xd2,0x2c,0xcc,0x2c,0x90,0x33,0xe6,0x2c,0x90,0x33,0xe6, +0x33,0xec,0x2b,0xfa,0x33,0xec,0x2b,0xfa,0x2c,0x2a,0x2a,0xe6,0x2c,0x5a,0x2c,0xae,0x33,0xf2,0x2b,0xbe,0x33,0xf2,0x2c,0xae,0x33,0xf2,0x2b,0xd6,0x33,0xf8,0x2b,0xfa,0x33,0xfe,0x2c,0xa2,0x2c,0x42,0x2c,0x48,0x2d,0x5c,0x2c,0x54,0x2d,0x02,0x2c,0x84,0x34,0x04,0x27,0x56,0x2a,0xe0,0x2a,0xe6,0x2a,0xda,0x34,0x0a,0x2a,0xce,0x34,0x10, +0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2e,0xa0,0x2b,0x10,0x2e,0xa0,0x33,0xf2,0x2b,0xbe,0x34,0x16,0x2a,0x6e,0x34,0x16,0x2a,0x6e,0x33,0xf2,0x2c,0xae,0x34,0x16,0x2c,0xb4,0x34,0x16,0x2c,0xb4,0x33,0xf2,0x2b,0xd6,0x34,0x1c,0x2b,0x16,0x34,0x1c,0x2b,0x16,0x33,0xf8,0x2b,0xfa,0x34,0x22,0x2b,0x6a,0x2a,0x80,0x2b,0x5e,0x2a,0x80,0x2b,0x5e, +0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x46,0x2c,0xa8,0x2e,0x46,0x2d,0x5c,0x2c,0x54,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2d,0x02,0x2c,0x84,0x27,0x56,0x27,0x56,0x27,0x56,0x27,0x56,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c, +0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44, +0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x25,0x08,0xc7,0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe9,0x00,0x10,0x08,0xeb,0x08,0xf7,0x00,0x19,0x08,0xf9,0x08,0xf9,0x00,0x26,0x09,0x02,0x09,0x02,0x00,0x27,0x09,0x07,0x09,0x2b, +0x00,0x28,0x09,0x3b,0x09,0x4e,0x00,0x4d,0x09,0x59,0x09,0x59,0x00,0x61,0x09,0x5b,0x09,0x68,0x00,0x62,0x09,0x6c,0x09,0x6e,0x00,0x70,0x09,0x72,0x09,0x72,0x00,0x73,0x09,0x7c,0x09,0x7c,0x00,0x74,0x09,0x80,0x09,0xf8,0x00,0x75,0x09,0xfa,0x0a,0x0e,0x00,0xee,0x0a,0x24,0x0a,0x2b,0x01,0x03,0x0a,0x2d,0x0a,0x2d,0x01,0x0b,0x0a,0x3e, +0x0a,0x3f,0x01,0x0c,0x0a,0x43,0x0a,0x43,0x01,0x0e,0x0a,0x54,0x0a,0x5b,0x01,0x0f,0x0a,0x5f,0x0a,0x62,0x01,0x17,0x0a,0x72,0x0a,0xb7,0x01,0x1b,0x0b,0x0c,0x0b,0x18,0x01,0x61,0x0e,0x20,0x0e,0x3e,0x01,0x6e,0x0e,0x4b,0x0e,0x61,0x01,0x8d,0x0e,0x6e,0x0e,0x72,0x01,0xa4,0x0e,0x74,0x0e,0xd5,0x01,0xa9,0x0e,0xd7,0x0e,0xea,0x02,0x0b, +0x0e,0xec,0x0f,0x4f,0x02,0x1f,0x0f,0x62,0x0f,0xc3,0x02,0x83,0x13,0x00,0x13,0x29,0x02,0xe5,0x14,0x04,0x14,0x07,0x03,0x0f,0x14,0x09,0x14,0x16,0x03,0x13,0x14,0x53,0x14,0x5c,0x03,0x21,0x14,0x6b,0x14,0x6b,0x03,0x2b,0x14,0x6d,0x14,0x7b,0x03,0x2c,0x14,0x7d,0x14,0x87,0x03,0x3b,0x14,0xad,0x14,0xae,0x03,0x46,0x00,0x01,0x02,0x2c, +0x02,0xa2,0x00,0x02,0x00,0x0c,0x01,0xca,0x00,0x6f,0x00,0x00,0x19,0xde,0x00,0x00,0x19,0xe4,0x00,0x01,0x19,0xea,0x00,0x00,0x19,0xf0,0x00,0x00,0x19,0xf6,0x00,0x01,0x19,0xea,0x00,0x00,0x19,0xfc,0x00,0x00,0x19,0xfc,0x00,0x00,0x1a,0x02,0x00,0x00,0x19,0xde,0x00,0x00,0x1a,0x08,0x00,0x00,0x1a,0x0e,0x00,0x01,0x1a,0x14,0x00,0x00, +0x1a,0x1a,0x00,0x01,0x1a,0x20,0x00,0x00,0x1a,0x08,0x00,0x00,0x1a,0x0e,0x00,0x00,0x1a,0x26,0x00,0x00,0x1a,0x2c,0x00,0x00,0x1a,0x32,0x00,0x00,0x1a,0x38,0x00,0x00,0x1a,0x3e,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x4a,0x00,0x01,0x1a,0x50,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x56,0x00,0x00,0x1a,0x44,0x00,0x01,0x1a,0x5c,0x00,0x00, +0x1a,0x62,0x00,0x01,0x1a,0x68,0x00,0x00,0x1a,0x6e,0x00,0x00,0x1a,0x74,0x00,0x00,0x1a,0x7a,0x00,0x00,0x1a,0x80,0x00,0x00,0x1a,0x86,0x00,0x01,0x1a,0x8c,0x00,0x00,0x19,0xf6,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x92,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0x9e,0x00,0x00,0x1a,0xa4,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xa4,0x00,0x00, +0x19,0xde,0x00,0x00,0x19,0xde,0x00,0x00,0x19,0xde,0x00,0x01,0x1a,0xaa,0x00,0x00,0x1a,0xb0,0x00,0x00,0x1a,0xb6,0x00,0x00,0x1a,0xbc,0x00,0x00,0x1a,0xc2,0x00,0x00,0x19,0xde,0x00,0x00,0x1a,0xc8,0x00,0x01,0x19,0xea,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xce,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xd4,0x00,0x00, +0x1a,0xda,0x00,0x00,0x1a,0xd4,0x00,0x00,0x1a,0xda,0x00,0x00,0x1a,0xda,0x00,0x01,0x1a,0xe0,0x00,0x01,0x1a,0xe0,0x00,0x00,0x1a,0xe6,0x00,0x00,0x1a,0xe6,0x00,0x01,0x1a,0xec,0x00,0x00,0x1a,0xf2,0x00,0x00,0x1a,0xf8,0x00,0x01,0x1a,0xfe,0x00,0x00,0x1b,0x04,0x00,0x00,0x1b,0x0a,0x00,0x00,0x1b,0x10,0x00,0x01,0x1b,0x16,0x00,0x01, +0x1b,0x1c,0x00,0x01,0x1b,0x22,0x00,0x00,0x1b,0x28,0x00,0x00,0x1b,0x2e,0x00,0x01,0x1b,0x34,0x00,0x00,0x1b,0x3a,0x00,0x00,0x1b,0x10,0x00,0x00,0x1b,0x10,0x00,0x01,0x1b,0x40,0x00,0x00,0x1b,0x04,0x00,0x00,0x1b,0x46,0x00,0x01,0x1b,0x4c,0x00,0x01,0x1b,0x4c,0x00,0x00,0x1a,0xf2,0x00,0x00,0x1b,0x52,0x00,0x00,0x1b,0x58,0x00,0x00, +0x1b,0x28,0x00,0x00,0x1b,0x5e,0x00,0x00,0x1b,0x64,0x00,0x00,0x1b,0x6a,0x00,0x00,0x1b,0x70,0x00,0x00,0x1b,0x76,0x00,0x00,0x1b,0x7c,0x00,0x00,0x1b,0x82,0x00,0x01,0x1b,0x88,0x00,0x00,0x1b,0x8e,0x00,0x00,0x1b,0x94,0x00,0x00,0x1b,0x9a,0x00,0x00,0x1b,0xa0,0x00,0x00,0x1b,0xa6,0x00,0x00,0x1b,0xac,0x00,0x00,0x1b,0xb2,0x00,0x00, +0x1b,0xb8,0x00,0x01,0x1b,0xbe,0x00,0x05,0x00,0x0c,0x00,0x1a,0x00,0x2c,0x00,0x3e,0x00,0x50,0x00,0x03,0x23,0xd8,0x23,0xde,0x23,0xe4,0x23,0xea,0x1b,0x02,0x1b,0x08,0x00,0x04,0x23,0xe2,0x23,0xe8,0x23,0xca,0x23,0xd0,0x23,0xd6,0x23,0xdc,0x1a,0xf4,0x1a,0xfa,0x00,0x04,0x23,0xdc,0x23,0xe2,0x23,0xe8,0x23,0xee,0x23,0xf4,0x23,0xfa, +0x1b,0xf6,0x1b,0xfc,0x00,0x04,0x23,0xee,0x23,0xf4,0x23,0xa6,0x23,0xac,0x23,0xb2,0x23,0xb8,0x1a,0xd0,0x1a,0xd6,0x00,0x04,0x23,0xdc,0x23,0xe2,0x23,0xe8,0x23,0x9a,0x23,0xee,0x23,0xa6,0x1a,0xbe,0x1a,0xc4,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77, +0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38, +0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x03,0x09,0x71,0x09,0x71,0x00,0x00,0x0a,0x63,0x0a,0x64,0x00,0x01,0x14,0x97,0x14,0x98,0x00,0x03,0x00,0x01,0x02,0x20,0x02,0xd2,0x00,0x01,0x00,0x0c,0x01,0x6e, +0x00,0x58,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x2c,0x00,0x00,0x17,0x38,0x00,0x00,0x17,0x3e,0x00,0x00,0x17,0x44,0x00,0x00,0x17,0x44,0x00,0x00,0x17,0x4a,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x50,0x00,0x00,0x17,0x56,0x00,0x00,0x17,0x62,0x00,0x00,0x17,0x50,0x00,0x00,0x17,0x56,0x00,0x00,0x17,0x6e,0x00,0x00,0x17,0x74,0x00,0x00, +0x17,0x7a,0x00,0x00,0x17,0x80,0x00,0x00,0x17,0x86,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0x92,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0x9e,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0xaa,0x00,0x00,0x17,0xb6,0x00,0x00,0x17,0xbc,0x00,0x00,0x17,0xc2,0x00,0x00,0x17,0xc8,0x00,0x00,0x17,0xce,0x00,0x00,0x17,0x3e,0x00,0x00,0x17,0x8c,0x00,0x00, +0x17,0xda,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xe6,0x00,0x00,0x17,0xec,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xec,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0xf8,0x00,0x00,0x17,0xfe,0x00,0x00,0x18,0x04,0x00,0x00,0x18,0x0a,0x00,0x00,0x17,0x26,0x00,0x00,0x18,0x10,0x00,0x00,0x17,0xe0,0x00,0x00, +0x18,0x16,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xe0,0x00,0x00,0x18,0x1c,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x1c,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x2e,0x00,0x00,0x18,0x2e,0x00,0x00,0x18,0x3a,0x00,0x00,0x18,0x40,0x00,0x00,0x18,0x4c,0x00,0x00,0x18,0x52,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x70,0x00,0x00, +0x18,0x76,0x00,0x00,0x18,0x82,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x4c,0x00,0x00,0x18,0x8e,0x00,0x00,0x18,0x3a,0x00,0x00,0x18,0x9a,0x00,0x00,0x18,0xa0,0x00,0x00,0x18,0x70,0x00,0x00,0x18,0xa6,0x00,0x00,0x18,0xac,0x00,0x00,0x18,0xb2,0x00,0x00,0x18,0xb8,0x00,0x00,0x18,0xbe,0x00,0x00,0x18,0xc4,0x00,0x00, +0x18,0xca,0x00,0x00,0x18,0xd6,0x00,0x00,0x18,0xdc,0x00,0x00,0x18,0xe2,0x00,0x00,0x18,0xe8,0x00,0x00,0x18,0xee,0x00,0x00,0x18,0xf4,0x00,0x00,0x18,0xfa,0x00,0x00,0x19,0x00,0x00,0x58,0x21,0xe8,0x21,0xee,0x21,0xf4,0x21,0xfa,0x21,0xe8,0x22,0x00,0x22,0x06,0x22,0x0c,0x22,0x12,0x22,0x18,0x22,0x1e,0x22,0x24,0x22,0x2a,0x22,0x30, +0x22,0x36,0x22,0x3c,0x22,0x42,0x22,0x36,0x22,0x48,0x22,0x4e,0x22,0x06,0x22,0x54,0x22,0x5a,0x22,0x0c,0x22,0x60,0x22,0x66,0x22,0x6c,0x22,0x72,0x22,0x78,0x22,0x7e,0x22,0x84,0x22,0x8a,0x22,0x90,0x22,0x96,0x22,0x90,0x22,0x84,0x22,0x9c,0x22,0xa2,0x22,0x42,0x22,0x42,0x22,0xa8,0x22,0xae,0x22,0xb4,0x22,0xba,0x22,0xc0,0x22,0xc6, +0x22,0x9c,0x22,0xcc,0x22,0xcc,0x22,0x84,0x22,0xd2,0x22,0xd8,0x22,0xde,0x22,0xe4,0x22,0xea,0x22,0xf0,0x22,0xf6,0x22,0xfc,0x23,0x02,0x23,0x08,0x23,0x0e,0x23,0x14,0x23,0x1a,0x23,0x20,0x23,0x26,0x23,0x2c,0x23,0x32,0x23,0x38,0x23,0x3e,0x23,0x44,0x23,0x4a,0x23,0x50,0x23,0x56,0x23,0x5c,0x22,0xe4,0x23,0x62,0x23,0x68,0x23,0x6e, +0x23,0x74,0x23,0x7a,0x23,0x80,0x23,0x86,0x23,0x8c,0x23,0x92,0x23,0x98,0x23,0x9e,0x23,0xa4,0x23,0xaa,0x00,0x02,0x00,0x1d,0x09,0x2c,0x09,0x2d,0x00,0x00,0x09,0x2f,0x09,0x30,0x00,0x02,0x09,0x32,0x09,0x33,0x00,0x04,0x09,0x37,0x09,0x37,0x00,0x06,0x09,0x73,0x09,0x75,0x00,0x07,0x09,0x7e,0x09,0x7e,0x00,0x0a,0x0a,0x0f,0x0a,0x13, +0x00,0x0b,0x0a,0x16,0x0a,0x19,0x00,0x10,0x0a,0x1b,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x15,0x0a,0x22,0x0a,0x22,0x00,0x17,0x0a,0x4b,0x0a,0x4f,0x00,0x18,0x0a,0x51,0x0a,0x53,0x00,0x1d,0x0a,0x65,0x0a,0x69,0x00,0x20,0x0a,0x6c,0x0a,0x6e,0x00,0x25,0x0a,0x70,0x0a,0x71,0x00,0x28,0x0e,0x1a,0x0e,0x1d,0x00,0x2a,0x0e,0x62, +0x0e,0x6a,0x00,0x2e,0x13,0x2a,0x13,0x2b,0x00,0x37,0x13,0x2d,0x13,0x2e,0x00,0x39,0x13,0x30,0x13,0x32,0x00,0x3b,0x13,0x36,0x13,0x37,0x00,0x3e,0x13,0x39,0x13,0x3b,0x00,0x40,0x13,0x3d,0x13,0x3e,0x00,0x43,0x13,0x41,0x13,0x44,0x00,0x45,0x13,0xe9,0x13,0xe9,0x00,0x49,0x14,0x17,0x14,0x17,0x00,0x4a,0x14,0x5d,0x14,0x61,0x00,0x4b, +0x14,0x63,0x14,0x6a,0x00,0x50,0x00,0x02,0x00,0x1d,0x09,0x2c,0x09,0x2d,0x00,0x00,0x09,0x2f,0x09,0x30,0x00,0x02,0x09,0x32,0x09,0x33,0x00,0x04,0x09,0x37,0x09,0x37,0x00,0x06,0x09,0x73,0x09,0x75,0x00,0x07,0x09,0x7e,0x09,0x7e,0x00,0x0a,0x0a,0x0f,0x0a,0x13,0x00,0x0b,0x0a,0x16,0x0a,0x19,0x00,0x10,0x0a,0x1b,0x0a,0x1b,0x00,0x14, +0x0a,0x1e,0x0a,0x1f,0x00,0x15,0x0a,0x22,0x0a,0x22,0x00,0x17,0x0a,0x4b,0x0a,0x4f,0x00,0x18,0x0a,0x51,0x0a,0x53,0x00,0x1d,0x0a,0x65,0x0a,0x69,0x00,0x20,0x0a,0x6c,0x0a,0x6e,0x00,0x25,0x0a,0x70,0x0a,0x71,0x00,0x28,0x0e,0x1a,0x0e,0x1d,0x00,0x2a,0x0e,0x62,0x0e,0x6a,0x00,0x2e,0x13,0x2a,0x13,0x2b,0x00,0x37,0x13,0x2d,0x13,0x2e, +0x00,0x39,0x13,0x30,0x13,0x32,0x00,0x3b,0x13,0x36,0x13,0x37,0x00,0x3e,0x13,0x39,0x13,0x3b,0x00,0x40,0x13,0x3d,0x13,0x3e,0x00,0x43,0x13,0x41,0x13,0x44,0x00,0x45,0x13,0xe9,0x13,0xe9,0x00,0x49,0x14,0x17,0x14,0x17,0x00,0x4a,0x14,0x5d,0x14,0x61,0x00,0x4b,0x14,0x63,0x14,0x6a,0x00,0x50,0x00,0x01,0x00,0x9a,0x01,0x10,0x00,0x01, +0x00,0x0c,0x00,0x6a,0x00,0x17,0x00,0x00,0x13,0xae,0x00,0x00,0x13,0xae,0x00,0x00,0x13,0xd8,0x00,0x00,0x13,0xe4,0x00,0x00,0x14,0x14,0x00,0x00,0x14,0x20,0x00,0x00,0x14,0x2c,0x00,0x00,0x14,0x50,0x00,0x00,0x14,0x6e,0x00,0x00,0x13,0xae,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xb0,0x00,0x00,0x14,0xc2,0x00,0x00, +0x14,0xda,0x00,0x00,0x14,0xe0,0x00,0x00,0x14,0xe6,0x00,0x00,0x14,0xf8,0x00,0x00,0x15,0x04,0x00,0x00,0x15,0x10,0x00,0x00,0x15,0x10,0x00,0x00,0x15,0x4c,0x00,0x00,0x15,0x82,0x00,0x17,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x42,0x21,0x4e,0x21,0x42,0x21,0x54,0x21,0x36,0x21,0x42,0x21,0x5a,0x21,0x60,0x21,0x66, +0x21,0x6c,0x21,0x72,0x21,0x78,0x21,0x7e,0x21,0x84,0x21,0x8a,0x21,0x8a,0x21,0x90,0x21,0x96,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06, +0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f,0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62, +0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06,0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f, +0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62,0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x01, +0x00,0x32,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x11,0x0e,0x00,0x0f,0x20,0x6e,0x20,0x74,0x20,0x7a,0x20,0x80,0x20,0x86,0x20,0x8c,0x20,0x92,0x20,0x98,0x20,0x9e,0x20,0xa4,0x20,0xaa,0x20,0xb0,0x20,0x7a,0x20,0xb6,0x20,0xbc,0x00,0x01,0x00,0x01,0x0b,0x5e,0x00,0x02,0x00,0x07,0x0a,0x43,0x0a,0x43,0x00,0x00, +0x0b,0x6f,0x0b,0x6f,0x00,0x01,0x0b,0x75,0x0b,0x75,0x00,0x02,0x0b,0x77,0x0b,0x77,0x00,0x03,0x0b,0x7a,0x0b,0x7a,0x00,0x04,0x0b,0x7d,0x0b,0x7d,0x00,0x05,0x0b,0x8d,0x0b,0x95,0x00,0x06,0x00,0x01,0x02,0xc8,0x02,0xe4,0x00,0x04,0x00,0x0c,0x00,0x46,0x00,0x0e,0x00,0x00,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x02, +0x10,0xa8,0x00,0x00,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x50,0x20,0x28,0x20,0x2e,0x20,0x34,0x20,0x3a,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x58,0x20,0x5e, +0x20,0x64,0x20,0x6a,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x20,0xb8,0x20,0xbe,0x20,0xc4,0x20,0xca,0x20,0xd0,0x20,0xd6,0x20,0xdc,0x20,0xe2,0x20,0xe8,0x20,0xee,0x20,0xf4,0x20,0xfa,0x21,0x00,0x21,0x06,0x21,0x0c,0x21,0x12,0x20,0xb8,0x20,0xbe, +0x20,0xc4,0x20,0xca,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x20,0xc4,0x21,0x78,0x21,0x7e,0x21,0x84,0x21,0x8a,0x21,0x90,0x21,0x42,0x21,0x96,0x21,0x9c,0x21,0xa2, +0x21,0xa8,0x21,0xae,0x21,0xb4,0x21,0xba,0x21,0x72,0x21,0xc0,0x21,0xc6,0x21,0xa8,0x21,0xcc,0x21,0xd2,0x21,0xd8,0x21,0xde,0x21,0xe4,0x21,0xea,0x21,0xf0,0x21,0xf6,0x21,0xfc,0x22,0x02,0x22,0x08,0x22,0x0e,0x21,0xc0,0x20,0x9a,0x22,0x14,0x22,0x1a,0x22,0x20,0x22,0x26,0x22,0x2c,0x22,0x32,0x22,0x38,0x22,0x3e,0x22,0x44,0x22,0x4a, +0x22,0x50,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x48,0x21,0x4e, +0x21,0x54,0x21,0x5a,0x22,0x86,0x22,0x8c,0x22,0x92,0x22,0x98,0x22,0x9e,0x22,0xa4,0x22,0xaa,0x22,0xb0,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x10,0x68,0x22,0xb6,0x20,0x9a,0x22,0xbc,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66, +0x21,0x6c,0x21,0x72,0x22,0x2c,0x22,0x32,0x22,0xc2,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x58,0x20,0x5e, +0x20,0x64,0x20,0x6a,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x22,0xc8,0x22,0xce,0x22,0xd4,0x22,0xda,0x22,0xe0,0x22,0xe6,0x22,0xec,0x20,0xdc,0x21,0x00,0x21,0x06,0x21,0x0c,0x21,0x12,0x22,0xc8,0x22,0xce,0x22,0xd4,0x22,0xda,0x21,0x18,0x21,0x1e, +0x21,0x24,0x21,0x2a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x21,0x8a,0x21,0x90,0x21,0x42,0x21,0x96,0x21,0x9c,0x21,0xa2,0x21,0xa8,0x21,0xae,0x21,0xc6,0x21,0xa8,0x21,0xcc,0x21,0xd2,0x21,0xd8,0x21,0xde,0x21,0xe4,0x21,0xea,0x22,0x08,0x22,0x0e, +0x21,0xc0,0x20,0x9a,0x22,0x14,0x22,0x1a,0x22,0x20,0x22,0x26,0x22,0x2c,0x22,0x32,0x22,0x38,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x20,0xb8,0x20,0xbe,0x20,0xc4,0x20,0xca,0x20,0x58,0x20,0x5e,0x20,0x64,0x20,0x6a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0xd8,0x21,0xde, +0x21,0xe4,0x21,0xea,0x22,0x9e,0x22,0xa4,0x22,0xaa,0x22,0xb0,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x00,0x02,0x00,0x04,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9, +0x00,0x0a,0x12,0x59,0x12,0x5b,0x00,0x0b,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00, +0x0d,0x9c,0x00,0x50,0x20,0x1a,0x1d,0x5c,0x1f,0xba,0x20,0x20,0x20,0x26,0x20,0x2c,0x20,0x32,0x20,0x38,0x20,0x3e,0x20,0x44,0x20,0x32,0x20,0x4a,0x20,0x50,0x20,0x56,0x20,0x3e,0x20,0x5c,0x20,0x32,0x20,0x62,0x1e,0xd6,0x20,0x68,0x20,0x6e,0x1e,0xd6,0x20,0x74,0x20,0x7a,0x20,0x5c,0x20,0x4a,0x20,0x80,0x20,0x86,0x20,0x32,0x20,0x32, +0x20,0x32,0x20,0x4a,0x20,0x4a,0x20,0x56,0x20,0x56,0x20,0x32,0x20,0x68,0x1d,0x5c,0x20,0x26,0x20,0x2c,0x20,0x50,0x20,0x56,0x20,0x3e,0x20,0x4a,0x20,0x86,0x20,0x80,0x20,0x8c,0x20,0x80,0x20,0x8c,0x1d,0x5c,0x1f,0xba,0x20,0x20,0x20,0x26,0x20,0x2c,0x20,0x92,0x20,0x6e,0x20,0x44,0x20,0x92,0x20,0x4a,0x20,0x50,0x20,0x56,0x20,0x5c, +0x20,0x62,0x1e,0xd6,0x20,0x6e,0x1e,0xd6,0x20,0x7a,0x20,0x5c,0x20,0x4a,0x20,0x80,0x20,0x86,0x20,0x98,0x20,0x9e,0x20,0xa4,0x20,0xaa,0x20,0x56,0x20,0xb0,0x20,0x9e,0x20,0xb6,0x20,0xbc,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f, +0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x04,0xda,0x05,0x14,0x00,0x07,0x00,0x0c,0x00,0x6a,0x00,0x17,0x00,0x01,0x0c,0xba,0x00,0x00,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x06,0x0c,0xba, +0x00,0x01,0x0c,0xba,0x00,0x04,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x03,0x0c,0xba,0x00,0x02,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x00,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x05,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x51,0x1f,0x88, +0x1f,0x8e,0x1f,0x94,0x1f,0x8e,0x1f,0x9a,0x1f,0xa0,0x1f,0xa6,0x1f,0xac,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x1f,0xc4,0x1f,0xc4,0x1f,0xca,0x1f,0xd0,0x1f,0xd6,0x1f,0xd0,0x1f,0xdc,0x1f,0xe2,0x1f,0xe2,0x1f,0xe8,0x1f,0xee,0x1f,0xf4,0x1f,0xee,0x1f,0xfa,0x20,0x00,0x20,0x06,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18, +0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x20,0x42,0x1e,0xf8,0x20,0x48,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x20,0x5a,0x1e,0x92,0x20,0x60,0x1e,0x92,0x20,0x66,0x20,0x6c,0x20,0x24,0x1d,0x78,0x1b,0xc8,0x20,0x72,0x1b,0xc8,0x20,0x78,0x20,0x7e,0x1d,0xf6,0x1f,0x28,0x20,0x84, +0x20,0x8a,0x20,0x84,0x20,0x90,0x20,0x96,0x20,0x7e,0x20,0x42,0x1e,0xf8,0x20,0x9c,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90,0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea, +0x20,0xf0,0x20,0xf6,0x20,0xfc,0x21,0x02,0x20,0xfc,0x21,0x08,0x20,0x7e,0x1d,0xf6,0x1f,0x88,0x21,0x0e,0x21,0x14,0x21,0x0e,0x21,0x1a,0x1c,0x7c,0x21,0x20,0x20,0x42,0x1e,0xf8,0x20,0x9c,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x21,0x26,0x21,0x2c,0x21,0x32,0x21,0x2c,0x21,0x38,0x21,0x3e,0x21,0x44,0x21,0x4a,0x21,0x50,0x21,0x56, +0x21,0x50,0x21,0x5c,0x1d,0x1e,0x21,0x62,0x21,0x68,0x21,0x6e,0x21,0x74,0x21,0x6e,0x21,0x7a,0x21,0x80,0x21,0x86,0x21,0x8c,0x1c,0x76,0x21,0x92,0x1c,0x76,0x21,0x98,0x1e,0x7a,0x21,0x9e,0x21,0x4a,0x21,0xa4,0x21,0xaa,0x21,0xa4,0x21,0xb0,0x1d,0x1e,0x21,0x62,0x21,0xb6,0x21,0xbc,0x21,0xc2,0x21,0xbc,0x21,0xc8,0x1e,0xf2,0x20,0x06, +0x21,0xce,0x21,0xd4,0x21,0xda,0x21,0xd4,0x21,0xe0,0x21,0xe6,0x21,0xec,0x21,0xf2,0x21,0xf8,0x21,0xfe,0x21,0xf8,0x22,0x04,0x1c,0x7c,0x20,0x3c,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1f,0x34,0x22,0x0a,0x22,0x10,0x22,0x0a,0x22,0x16,0x22,0x1c,0x21,0xe6,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22, +0x22,0x2e,0x21,0x20,0x1c,0x7c,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xbc, +0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x22,0x46,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x22,0x4c,0x22,0x52,0x22,0x46,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x22,0x4c,0x22,0x52,0x20,0x42,0x22,0x58,0x22,0x5e,0x22,0x58,0x22,0x64,0x20,0x7e,0x1d,0xf6,0x21,0x68,0x21,0x6e,0x21,0x74,0x21,0x6e,0x21,0x7a, +0x21,0x80,0x21,0x86,0x1f,0xac,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x1f,0xc4,0x1f,0xc4,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18,0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90,0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2, +0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea,0x20,0xf0,0x20,0xf6,0x20,0xfc,0x21,0x02,0x20,0xfc,0x21,0x08,0x20,0x7e,0x1d,0xf6,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22,0x22,0x2e,0x21,0x20,0x1c,0x7c,0x1f,0x34,0x22,0x0a,0x22,0x6a,0x22,0x70,0x22,0x76,0x22,0x1c, +0x21,0xe6,0x22,0x7c,0x22,0x0a,0x22,0x10,0x22,0x82,0x22,0x16,0x22,0x88,0x22,0x8e,0x1f,0x34,0x22,0x0a,0x22,0x6a,0x22,0x70,0x22,0x76,0x22,0x1c,0x21,0xe6,0x22,0x7c,0x22,0x0a,0x22,0x10,0x22,0x82,0x22,0x16,0x22,0x88,0x22,0x8e,0x22,0x94,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x22,0x9a,0x22,0x9a,0x1f,0xca,0x1f,0xd0,0x1f,0xd6, +0x1f,0xd0,0x1f,0xdc,0x22,0xa0,0x1f,0xe2,0x1f,0xe8,0x1f,0xee,0x1f,0xf4,0x1f,0xee,0x1f,0xfa,0x20,0x00,0x20,0x06,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18,0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x1e,0xe6,0x1f,0x58,0x22,0xa6,0x1f,0x58,0x22,0xac,0x22,0xb2,0x22,0xb8, +0x22,0xbe,0x22,0xc4,0x21,0x32,0x22,0xc4,0x1c,0x16,0x1d,0x5a,0x21,0x44,0x1f,0x28,0x20,0x84,0x20,0x8a,0x20,0x84,0x20,0x90,0x20,0x96,0x20,0x7e,0x1e,0xe6,0x1f,0x58,0x22,0xa6,0x1f,0x58,0x22,0xac,0x22,0xb2,0x22,0xb8,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90, +0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea,0x20,0xf0,0x1f,0x88,0x21,0x0e,0x21,0x14,0x21,0x0e,0x21,0x1a,0x1c,0x7c,0x21,0x20,0x21,0x26,0x21,0x2c,0x21,0x32,0x21,0x2c,0x21,0x38,0x21,0x3e,0x21,0x44,0x21,0x4a,0x21,0x50,0x21,0x56,0x21,0x50,0x21,0x5c,0x1d,0x1e,0x21,0x62,0x21,0x8c, +0x1c,0x76,0x21,0x92,0x1c,0x76,0x21,0x98,0x1e,0x7a,0x21,0x9e,0x21,0x4a,0x21,0xa4,0x21,0xaa,0x21,0xa4,0x21,0xb0,0x1d,0x1e,0x21,0x62,0x21,0xce,0x21,0xd4,0x21,0xda,0x21,0xd4,0x21,0xe0,0x21,0xe6,0x21,0xec,0x21,0xf2,0x21,0xf8,0x21,0xfe,0x21,0xf8,0x22,0x04,0x1c,0x7c,0x20,0x3c,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae, +0x20,0xb4,0x20,0xb4,0x1f,0x34,0x22,0x0a,0x22,0x10,0x22,0x0a,0x22,0x16,0x22,0x1c,0x21,0xe6,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22,0x22,0x2e,0x21,0x20,0x1c,0x7c,0x22,0xca,0x20,0xea,0x22,0xd0,0x22,0xd6,0x22,0xdc,0x22,0xe2,0x22,0xe8,0x22,0xee,0x22,0xf4,0x22,0xfa,0x22,0xf4,0x23,0x00,0x23,0x06,0x1e,0x98,0x23,0x0c,0x23,0x12, +0x23,0x18,0x23,0x12,0x23,0x1e,0x23,0x24,0x23,0x2a,0x23,0x30,0x23,0x36,0x23,0x3c,0x23,0x36,0x21,0xb0,0x22,0xbe,0x23,0x42,0x20,0xcc,0x23,0x48,0x23,0x4e,0x23,0x54,0x23,0x5a,0x20,0xea,0x20,0xf0,0x23,0x60,0x23,0x66,0x1b,0xc8,0x23,0x66,0x23,0x6c,0x23,0x72,0x1c,0x34,0x23,0x78,0x23,0x7e,0x23,0x84,0x23,0x7e,0x23,0x8a,0x23,0x90, +0x23,0x96,0x22,0xee,0x22,0xf4,0x22,0xfa,0x22,0xf4,0x23,0x00,0x23,0x06,0x1e,0x98,0x23,0x9c,0x23,0xa2,0x23,0xa8,0x23,0xa2,0x20,0x36,0x23,0xae,0x23,0xb4,0x1e,0xec,0x23,0xba,0x23,0xc0,0x23,0xba,0x22,0x2e,0x20,0xc6,0x1c,0x7c,0x00,0x02,0x00,0x09,0x0b,0x61,0x0b,0x61,0x00,0x00,0x0b,0xc0,0x0b,0xc3,0x00,0x01,0x0b,0xc5,0x0b,0xc7, +0x00,0x05,0x0b,0xca,0x0b,0xcf,0x00,0x08,0x0b,0xd6,0x0b,0xd7,0x00,0x0e,0x0b,0xd9,0x0b,0xda,0x00,0x10,0x0b,0xdc,0x0b,0xdd,0x00,0x12,0x0b,0xe1,0x0b,0xe1,0x00,0x14,0x12,0x5c,0x12,0x5d,0x00,0x15,0x00,0x02,0x00,0x07,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a, +0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x0b,0xdf,0x0b,0xdf,0x00,0x4c,0x12,0x5f,0x12,0x62,0x00,0x4d,0x00,0x01,0x01,0x88,0x01,0xbc,0x00,0x02,0x00,0x0c,0x00,0x46,0x00,0x0e,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00, +0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x50,0x1a,0x70,0x1a,0x7c,0x1e,0xa8,0x1e,0xae,0x1e,0xb4,0x1e,0xba,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x19,0xda,0x1b,0x30,0x1c,0x1a,0x1e,0xd8,0x16,0xaa,0x1e,0xde, +0x1e,0xe4,0x1e,0xea,0x19,0xda,0x1b,0x30,0x1e,0xf0,0x1e,0xf6,0x18,0xea,0x1c,0xaa,0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x08,0x1b,0xf0,0x1f,0x0e,0x1f,0x14,0x1f,0x1a,0x1c,0x0e,0x17,0x5e,0x1c,0x32,0x1f,0x20,0x1f,0x26,0x1f,0x2c,0x1f,0x32,0x1f,0x38,0x1f,0x3e,0x1f,0x44,0x1f,0x4a,0x1c,0x50,0x1f,0x50,0x1f,0x56,0x1c,0xda,0x1f,0x5c, +0x1f,0x62,0x1f,0x02,0x1f,0x68,0x1f,0x6e,0x1f,0x74,0x1f,0x7a,0x1d,0x16,0x1f,0x80,0x1d,0x16,0x1f,0x80,0x1d,0x16,0x1f,0x80,0x1e,0xf0,0x1e,0xf6,0x1e,0xf0,0x1e,0xf6,0x1e,0xfc,0x1f,0x02,0x1e,0xfc,0x1f,0x02,0x1d,0x3a,0x1f,0x86,0x1f,0x8c,0x1f,0x2c,0x1e,0xa8,0x1e,0xae,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1f,0x92,0x1f,0x98,0x1c,0xaa, +0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x9e,0x1f,0x62,0x1f,0x02,0x1f,0x74,0x1f,0x7a,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1e,0xa8,0x1e,0xae,0x1e,0xb4,0x1e,0xba,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x1a,0x3a,0x1d,0x8e,0x18,0xf0,0x17,0x5e,0x1e,0xe4,0x1e,0xea, +0x1a,0x3a,0x1d,0x8e,0x1e,0xf0,0x1e,0xf6,0x18,0xea,0x1c,0xaa,0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x0e,0x1c,0x0e,0x17,0x5e,0x1c,0x32,0x1f,0x20,0x1f,0x32,0x1f,0x38,0x1f,0x3e,0x1f,0x44,0x1f,0x50,0x1f,0x56,0x1c,0xda,0x1f,0x5c,0x1f,0x62,0x1f,0x02,0x1f,0x68,0x1f,0x6e,0x1f,0x74,0x1f,0x7a,0x19,0xda,0x1b,0x30,0x1e,0xb4,0x1e,0xba, +0x18,0xea,0x1c,0xaa,0x1f,0x3e,0x1f,0x44,0x1f,0x8c,0x1f,0xa4,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x1f,0x74,0x1f,0x7a,0x00,0x02,0x00,0x08,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc8,0x0b,0xc9,0x00,0x04,0x0b,0xd0, +0x0b,0xd5,0x00,0x06,0x0b,0xd8,0x0b,0xd8,0x00,0x0c,0x0b,0xdb,0x0b,0xdb,0x00,0x0d,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x40,0x00,0x56,0x00,0x01, +0x00,0x0c,0x00,0x3a,0x00,0x0b,0x00,0x00,0x05,0x94,0x00,0x00,0x1e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x05,0x94,0x00,0x00,0x18,0x2a,0x00,0x00,0x18,0x2a,0x00,0x00,0x1e,0x06,0x00,0x00,0x1e,0x06,0x00,0x00,0x17,0x46,0x00,0x00,0x1e,0x06,0x00,0x02,0x1d,0xde,0x16,0x70,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b, +0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x01,0x00,0xb4,0x00,0xe8,0x00,0x04,0x00,0x0c,0x00,0x42,0x00,0x0d,0x00,0x00,0x05,0x36,0x00,0x00,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x03,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x01,0x05,0x36, +0x00,0x01,0x1d,0xb4,0x00,0x01,0x05,0x36,0x00,0x02,0x05,0x36,0x00,0x01,0x1d,0xba,0x00,0x01,0x05,0x36,0x00,0x03,0x1d,0xc0,0x00,0x0e,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x17,0xa2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x15,0xf2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xa2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xa8,0x1d,0x90,0x1d,0x96,0x1d,0x9c, +0x17,0xa2,0x1d,0x90,0x1d,0xae,0x1d,0x9c,0x1d,0xb4,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xb4,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0x90,0x1d,0xae,0x1d,0x9c,0x1d,0xba,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0xc0,0x1d,0xae,0x1d,0xc6,0x1d,0x06,0x1d,0xc0,0x1d,0xcc,0x1d,0xc6, +0x1a,0x84,0x1d,0xc0,0x1d,0xcc,0x1d,0xc6,0x1a,0x84,0x00,0x02,0x00,0x08,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc8,0x0b,0xc9,0x00,0x04,0x0b,0xd1,0x0b,0xd5,0x00,0x06,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x0b,0xdb,0x0b,0xdb,0x00,0x0c,0x00,0x02, +0x00,0x04,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x12,0x59,0x12,0x5b,0x00,0x0b,0x00,0x01,0x00,0x78,0x00,0x8e,0x00,0x02,0x00,0x0c,0x00,0x1e,0x00,0x04,0x00,0x00,0x04,0x32,0x00,0x00,0x04,0x32,0x00,0x01,0x04,0x32,0x00,0x01,0x04,0x32,0x00,0x16,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2, +0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0x98,0x1c,0xfe,0x1c,0xf2,0x1c,0xf8,0x1d,0x04,0x1d,0x0a,0x1d,0x04,0x1d,0x10,0x1d,0x16,0x1d,0x10,0x1d,0x1c,0x1d,0x22,0x1d,0x28,0x1d,0x2e,0x1d,0x28, +0x1d,0x34,0x1d,0x3a,0x1c,0xfe,0x1d,0x40,0x1d,0x46,0x1d,0x4c,0x1d,0x52,0x1d,0x04,0x1d,0x22,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x57,0x0b,0x58,0x00,0x01,0x0b,0x5a,0x0b,0x5a,0x00,0x03,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x67,0x0b,0x67,0x00,0x0a,0x0b,0xb9, +0x0b,0xb9,0x00,0x0b,0x0b,0xbf,0x0b,0xbf,0x00,0x0c,0x0b,0xc4,0x0b,0xc4,0x00,0x0d,0x0b,0xc9,0x0b,0xc9,0x00,0x0e,0x0b,0xd0,0x0b,0xd5,0x00,0x0f,0x0b,0xd8,0x0b,0xd8,0x00,0x15,0x00,0x01,0x00,0x70,0x00,0x9e,0x00,0x02,0x00,0x0c,0x00,0x3e,0x00,0x0c,0x00,0x00,0x1b,0xe8,0x00,0x00,0x03,0x6a,0x00,0x00,0x16,0xf6,0x00,0x00,0x1c,0xa2, +0x00,0x00,0x1c,0xa2,0x00,0x00,0x1c,0xa2,0x00,0x00,0x1c,0xa8,0x00,0x00,0x1c,0xa8,0x00,0x00,0x1c,0xa2,0x00,0x01,0x03,0x6a,0x00,0x00,0x1c,0xae,0x00,0x00,0x1c,0xa2,0x00,0x0c,0x1c,0x82,0x1c,0x52,0x1c,0x88,0x1c,0x2e,0x1c,0x8e,0x1c,0x94,0x1c,0x8e,0x1c,0x10,0x1c,0x8e,0x1c,0x10,0x1c,0x8e,0x1c,0x9a,0x14,0x42,0x1c,0xa0,0x1c,0xa6, +0x1c,0xac,0x1c,0x8e,0x1c,0xa0,0x1c,0xb2,0x1c,0xb8,0x14,0x42,0x1c,0xbe,0x1c,0x8e,0x1c,0x9a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b, +0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x7c,0x00,0xb6,0x00,0x01,0x00,0x0c,0x00,0x56,0x00,0x12,0x00,0x00,0x1b,0x1c, +0x00,0x00,0x1a,0x74,0x00,0x00,0x02,0x9e,0x00,0x00,0x1c,0x2a,0x00,0x00,0x17,0xf8,0x00,0x00,0x1c,0x2a,0x00,0x00,0x16,0x2a,0x00,0x00,0x1c,0x30,0x00,0x00,0x1b,0xe2,0x00,0x00,0x15,0xac,0x00,0x00,0x02,0x9e,0x00,0x00,0x02,0x9e,0x00,0x00,0x1c,0x2a,0x00,0x00,0x02,0x9e,0x00,0x00,0x1b,0xe2,0x00,0x00,0x1c,0x36,0x00,0x00,0x1b,0x1c, +0x00,0x00,0x1c,0x36,0x00,0x12,0x1b,0x6e,0x1b,0x80,0x1b,0xf2,0x1b,0x38,0x1b,0xf8,0x1b,0xc8,0x1b,0xfe,0x1c,0x04,0x1c,0x0a,0x1c,0x0a,0x1c,0x0a,0x1c,0x10,0x1b,0x6e,0x1b,0x4a,0x1b,0xc8,0x1b,0xfe,0x1b,0x80,0x1b,0xd4,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05, +0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06, +0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x01,0x00,0x1a,0x00,0x22,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x01,0xae,0x00,0x00,0x01,0xae,0x00,0x01,0x1b,0x66,0x00,0x01,0x00,0x02,0x0b,0x63,0x0b,0x64, +0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x01,0x04,0x04,0xb0,0x00,0x01,0x01,0x13,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0xb0,0x00,0x01,0x00,0x00,0x05,0x64,0x00,0x01,0xff,0xce,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x88,0x00,0x01,0x00,0x46,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x60,0x00,0x01,0x00,0x00,0x03,0xde,0x00,0x01,0x00,0x00, +0x03,0xe8,0x00,0x01,0x00,0x00,0x04,0x7e,0x00,0x01,0x00,0x00,0x04,0xec,0x00,0x01,0x00,0x00,0xff,0xec,0x00,0x01,0x00,0x1e,0x04,0xb0,0x00,0x01,0x01,0x93,0x04,0xb0,0x00,0x01,0x01,0xa6,0x04,0xb0,0x00,0x01,0x01,0xa8,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x6f,0x00,0x01,0x00,0x00,0x04,0xa6,0x00,0x01,0x00,0x0f,0x04,0x7e,0x00,0x01, +0xff,0xf1,0x04,0x7e,0x00,0x01,0x00,0x00,0x04,0xc4,0x00,0x01,0x01,0xd9,0x04,0xba,0x00,0x01,0x01,0xd9,0x03,0xca,0x00,0x01,0x02,0x07,0x04,0x74,0x00,0x01,0x01,0x53,0x04,0x06,0x00,0x01,0x01,0x18,0x06,0x77,0x00,0x01,0x00,0xe1,0x06,0x08,0x00,0x01,0x01,0x0e,0x06,0x08,0x00,0x01,0x00,0x00,0x06,0x5e,0x00,0x01,0x00,0x00,0x05,0xdc, +0x00,0x01,0x00,0x00,0x05,0x7f,0x00,0x01,0x00,0x00,0x06,0x3c,0x00,0x01,0x00,0x00,0x06,0x0e,0x00,0x01,0x00,0x00,0x05,0xd5,0x00,0x01,0x00,0x00,0x05,0xd7,0x00,0x01,0x00,0x00,0x06,0x6c,0x00,0x01,0x00,0x00,0x06,0x50,0x00,0x01,0x00,0x00,0x06,0x5c,0x00,0x01,0x00,0x00,0x06,0xb8,0x00,0x01,0x00,0x00,0x06,0x73,0x00,0x01,0x00,0x00, +0x05,0xf0,0x00,0x01,0x00,0x00,0x06,0xb5,0x00,0x01,0x00,0x00,0x07,0x6c,0x00,0x01,0x00,0x00,0x07,0x54,0x00,0x01,0x00,0x00,0x01,0x4d,0x00,0x01,0x00,0x00,0x06,0x3a,0x00,0x01,0x00,0x00,0x06,0x40,0x00,0x01,0x00,0x00,0x06,0xc4,0x00,0x01,0x00,0x00,0x07,0xb2,0x00,0x01,0x00,0x00,0x06,0xf0,0x00,0x01,0x01,0x93,0x06,0x22,0x00,0x01, +0x01,0xa6,0x06,0x18,0x00,0x01,0x01,0xa8,0x06,0x4a,0x00,0x01,0x00,0x00,0x06,0xfe,0x00,0x01,0x00,0x00,0x07,0xda,0x00,0x01,0x00,0x00,0x07,0xe4,0x00,0x01,0x00,0x00,0x07,0x80,0x00,0x01,0x00,0x00,0x06,0xa8,0x00,0x01,0x00,0x00,0x06,0x54,0x00,0x01,0x00,0x00,0x06,0xc2,0x00,0x01,0x00,0x00,0x06,0x27,0x00,0x01,0x01,0xd9,0x06,0x5a, +0x00,0x01,0x01,0xd9,0x05,0x80,0x00,0x01,0x02,0x07,0x06,0x22,0x00,0x01,0x01,0x53,0x06,0xc9,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x41,0x00,0x01,0x00,0x0a,0x00,0x41,0x00,0x01,0x00,0x0f,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x41,0x00,0x01,0xff,0xfb,0x00,0x32,0x00,0x01,0x00,0x00, +0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0xff,0xc9,0x00,0x01,0x00,0x00,0xff,0xe2,0x00,0x01,0xff,0xf1,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0xff,0xa6,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x82,0x00,0x01,0x00,0x00,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01, +0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0xd9,0x00,0x82,0x00,0x01,0x02,0x80,0x00,0x82,0x00,0x01,0x01,0x54,0xfe,0xc0,0x00,0x01,0x00,0x00,0xfe,0x48,0x00,0x01,0x00,0x00,0xfe,0x5c,0x00,0x01,0xff,0xfb,0xff,0x4c,0x00,0x01,0x00,0x00,0xfe,0xc0, +0x00,0x01,0x00,0x00,0xfe,0x7a,0x00,0x01,0x00,0x00,0xfe,0x20,0x00,0x01,0x00,0x00,0xfe,0xb6,0x00,0x01,0x00,0x00,0xfe,0x84,0x00,0x01,0x00,0x00,0xff,0x10,0x00,0x01,0x00,0x00,0xfe,0xa2,0x00,0x01,0x00,0x00,0xff,0x56,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x01,0x00,0x00,0xfd,0xf8,0x00,0x01,0x00,0x00,0xfe,0x16,0x00,0x01,0x00,0x00, +0xfe,0x3e,0x00,0x01,0x01,0xa9,0xfe,0xa2,0x00,0x01,0x00,0x00,0xfe,0x0c,0x00,0x01,0x00,0xd9,0xfe,0x02,0x00,0x01,0x02,0x80,0xfe,0x02,0x00,0x01,0x03,0x16,0x06,0x0e,0x00,0x01,0x02,0x67,0x04,0xb0,0x00,0x01,0x01,0x03,0x06,0x7c,0x00,0x01,0x00,0x7e,0x06,0x73,0x00,0x01,0x01,0x03,0xff,0x71,0x00,0x01,0x01,0x03,0x06,0x5e,0x00,0x01, +0x00,0xc4,0x06,0x73,0x00,0x01,0x01,0x03,0x06,0x76,0x00,0x01,0x01,0x03,0x06,0x62,0x00,0x01,0x01,0x03,0x06,0x1d,0x00,0x01,0x00,0xef,0x06,0x71,0x00,0x01,0x00,0xb2,0xff,0x6b,0x00,0x01,0x00,0xf5,0x06,0x7c,0x00,0x01,0x01,0x03,0xff,0x6b,0x00,0x01,0x00,0xe9,0x06,0x1e,0x00,0x01,0x01,0x03,0x06,0x70,0x00,0x01,0x00,0xec,0x06,0x1f, +0x00,0x01,0x01,0x03,0x06,0x8f,0x00,0x01,0x01,0x03,0x06,0x7b,0x00,0x01,0x01,0x03,0x06,0x71,0x00,0x01,0x01,0x1f,0x06,0x65,0x00,0x01,0x00,0xec,0x00,0x05,0x00,0x01,0x01,0x0c,0x06,0x70,0x00,0x01,0x01,0x03,0xff,0xc1,0x00,0x01,0x01,0x03,0x06,0x35,0x00,0x01,0x01,0x1f,0x00,0x34,0x00,0x01,0x00,0xf9,0x06,0x55,0x00,0x01,0x00,0xeb, +0x06,0x55,0x00,0x01,0x01,0x11,0x06,0x1f,0x00,0x01,0x01,0x1c,0x06,0x1f,0x00,0x01,0x00,0xf3,0x06,0x71,0x00,0x01,0x01,0x03,0xff,0x7e,0x00,0x01,0x00,0xf9,0x06,0x7c,0x00,0x01,0x01,0x03,0x05,0x16,0x00,0x01,0x01,0x03,0x05,0x20,0x00,0x01,0x01,0x03,0x05,0x28,0x00,0x01,0x01,0x03,0xff,0x69,0x00,0x01,0x01,0x42,0x06,0x73,0x00,0x01, +0x01,0x03,0x06,0x67,0x00,0x01,0x00,0xf8,0x06,0x1d,0x00,0x01,0x00,0xd7,0x06,0x1f,0x00,0x01,0x00,0xe1,0x06,0x7a,0x00,0x01,0x01,0x03,0x06,0x60,0x00,0x01,0x01,0x03,0x05,0x26,0x00,0x01,0x00,0xfa,0x05,0x26,0x00,0x01,0x01,0x03,0x00,0xc1,0x00,0x01,0x01,0x18,0x06,0x72,0x00,0x01,0x00,0xfa,0xff,0xce,0x00,0x01,0x01,0x40,0x06,0x72, +0x00,0x01,0x01,0x7c,0x06,0x72,0x00,0x01,0x01,0x2c,0xff,0xce,0x00,0x01,0x00,0xc8,0x06,0x72,0x00,0x01,0x01,0x68,0x06,0x72,0x00,0x01,0x00,0xfa,0x06,0x72,0x00,0x01,0x00,0xbe,0xff,0x74,0x00,0x01,0x01,0x5e,0xff,0x74,0x00,0x01,0x00,0xc8,0xff,0x74,0x00,0x01,0x01,0x2c,0x06,0x72,0x00,0x01,0x01,0xe0,0x06,0x72,0x00,0x01,0x01,0x7c, +0xff,0x74,0x00,0x01,0x00,0xdc,0x06,0x72,0x00,0x01,0x01,0x04,0xff,0x74,0x00,0x01,0x00,0xa0,0x06,0x72,0x00,0x01,0x00,0x8c,0xff,0x4c,0x00,0x01,0x02,0x80,0x06,0x72,0x00,0x01,0x01,0x4a,0x06,0x72,0x00,0x01,0x01,0x03,0x03,0xb8,0x00,0x01,0x00,0xfa,0x06,0x5e,0x00,0x01,0x02,0x5a,0x06,0x71,0x00,0x01,0x01,0x05,0x06,0x1f,0x00,0x01, +0x00,0xdd,0x06,0x1e,0x00,0x01,0x00,0xfa,0x06,0x71,0x00,0x01,0x01,0x03,0x05,0xd1,0x00,0x01,0x01,0x03,0xff,0x90,0x00,0x01,0x00,0x1d,0x07,0x1d,0x00,0x01,0xff,0x8e,0x07,0x1d,0x00,0x01,0xff,0x97,0x07,0x1d,0x00,0x01,0xff,0x47,0x07,0x1d,0x00,0x01,0xff,0x79,0x07,0x1d,0x00,0x01,0xff,0xcd,0x07,0x1d,0x00,0x01,0x01,0x7a,0x06,0x71, +0x00,0x01,0x01,0x93,0x06,0x71,0x00,0x01,0xff,0xda,0x00,0x0c,0x00,0x01,0x00,0xfa,0x06,0x1e,0x00,0x01,0x00,0xfa,0xff,0x5c,0x00,0x01,0x00,0xfa,0x08,0x1b,0x00,0x01,0x00,0xfa,0x07,0x62,0x00,0x01,0x00,0xfa,0xfd,0xcc,0x00,0x01,0x00,0xfa,0x04,0x09,0x00,0x01,0x01,0x2c,0xfe,0x42,0x00,0x01,0x01,0x90,0x05,0x48,0x00,0x01,0x00,0xfa, +0xff,0x2a,0x00,0x01,0x01,0x90,0x06,0x2e,0x00,0x01,0x01,0xf4,0x04,0x09,0x00,0x01,0x02,0x26,0xfe,0x42,0x00,0x01,0x02,0x0e,0x04,0x4e,0x00,0x01,0x02,0xa4,0xfd,0xcd,0x00,0x01,0x02,0x26,0xff,0x2a,0x00,0x01,0x01,0xf4,0x04,0xf7,0x00,0x01,0x02,0x0e,0x05,0x3e,0x00,0x01,0x01,0xc2,0x04,0x3b,0x00,0x01,0x02,0x58,0xff,0x2a,0x00,0x01, +0x01,0x5e,0x04,0x89,0x00,0x01,0x01,0x2c,0x03,0xd2,0x00,0x01,0x02,0xbc,0xff,0x22,0x00,0x01,0x01,0xc2,0x04,0xb6,0x00,0x01,0x01,0xf4,0xff,0x2a,0x00,0x01,0x01,0xf4,0x04,0x8a,0x00,0x01,0x01,0xf5,0x04,0x5d,0x00,0x01,0x02,0x8b,0xfd,0xcd,0x00,0x01,0x01,0xc2,0x05,0x48,0x00,0x01,0x01,0xf4,0x05,0x16,0x00,0x01,0x01,0xf5,0x05,0x65, +0x00,0x01,0x01,0x90,0x05,0x88,0x00,0x01,0x01,0x90,0xff,0x2a,0x00,0x01,0x01,0xc2,0x05,0x88,0x00,0x01,0x00,0xfa,0x05,0x9e,0x00,0x01,0x01,0x5e,0xff,0x2a,0x00,0x01,0x01,0x5e,0x06,0x1e,0x00,0x01,0x01,0x2c,0xff,0x2a,0x00,0x01,0x01,0x4a,0x03,0xdb,0x00,0x01,0x02,0x44,0xfe,0xf8,0x00,0x01,0x01,0x5e,0x05,0x48,0x00,0x01,0x01,0x7f, +0x04,0xe9,0x00,0x01,0x02,0x79,0xff,0x2a,0x00,0x01,0x01,0xc5,0x04,0x50,0x00,0x01,0x03,0x55,0xfd,0xcd,0x00,0x01,0x01,0xff,0x04,0x9f,0x00,0x01,0x02,0x31,0xff,0x2a,0x00,0x01,0x01,0x40,0xfe,0x42,0x00,0x01,0x01,0xc6,0x03,0x3f,0x00,0x01,0x00,0x64,0xfe,0xff,0x00,0x01,0x01,0xff,0x05,0xc8,0x00,0x01,0x01,0xf8,0xfe,0x9e,0x00,0x01, +0x01,0x5e,0x05,0xd4,0x00,0x01,0x01,0xae,0x04,0xb7,0x00,0x01,0x01,0xe0,0xfe,0x9e,0x00,0x01,0x01,0x22,0x03,0x7c,0x00,0x01,0x01,0x81,0xff,0x38,0x00,0x01,0x00,0xfa,0xff,0x9c,0x00,0x01,0x01,0x90,0x05,0xa2,0x00,0x01,0x01,0x90,0xfd,0xcd,0x00,0x01,0x01,0xae,0x05,0x62,0x00,0x01,0x01,0xe0,0xfe,0xf1,0x00,0x01,0x02,0x3b,0x03,0xd7, +0x00,0x01,0x01,0x73,0xff,0x0a,0x00,0x01,0x01,0xa5,0x05,0xc1,0x00,0x01,0x02,0x09,0xff,0x22,0x00,0x01,0x02,0x3b,0x05,0x48,0x00,0x01,0x01,0xd7,0xff,0x22,0x00,0x01,0x01,0x73,0x05,0x02,0x00,0x01,0x01,0x1a,0x04,0x82,0x00,0x01,0x01,0xb0,0xff,0x22,0x00,0x01,0x01,0x1a,0x05,0xc1,0x00,0x01,0x01,0x90,0x03,0x26,0x00,0x01,0x01,0x2c, +0xfd,0xcd,0x00,0x01,0x01,0x90,0x04,0x6b,0x00,0x01,0x02,0x8f,0x03,0xd7,0x00,0x01,0x06,0x13,0xff,0x2b,0x00,0x01,0x02,0x8f,0x03,0xd2,0x00,0x01,0x06,0xdb,0xff,0x2b,0x00,0x01,0x03,0xe8,0x05,0x24,0x00,0x01,0x02,0xee,0xff,0x22,0x00,0x01,0x01,0x91,0x04,0xf2,0x00,0x01,0x01,0x91,0x05,0xf3,0x00,0x01,0x00,0x96,0x02,0x29,0x00,0x01, +0x00,0x96,0xfe,0x62,0x00,0x01,0x02,0x9f,0x04,0x2a,0x00,0x01,0x02,0x3b,0xff,0x22,0x00,0x01,0x01,0x31,0x04,0x79,0x00,0x01,0x02,0xc1,0xfd,0xcd,0x00,0x01,0x02,0x3b,0x05,0x24,0x00,0x01,0x03,0x03,0xff,0x22,0x00,0x01,0x01,0xc7,0x05,0x24,0x00,0x01,0x02,0x8f,0xfe,0x48,0x00,0x01,0x01,0x33,0x03,0x81,0x00,0x01,0x02,0x5f,0xff,0x2b, +0x00,0x01,0x02,0x5d,0x04,0x24,0x00,0x01,0x02,0x8f,0xfd,0xcd,0x00,0x01,0x01,0xa5,0x04,0x96,0x00,0x01,0x01,0xc2,0x03,0xe3,0x00,0x01,0x01,0xc6,0x04,0x15,0x00,0x01,0x01,0xf8,0xfe,0xf1,0x00,0x01,0x00,0x64,0xff,0x27,0x00,0x01,0x01,0x90,0x04,0x5c,0x00,0x01,0x01,0x41,0xff,0x27,0x00,0x01,0x01,0x72,0xfd,0x97,0x00,0x01,0x02,0x26, +0xfd,0x97,0x00,0x01,0x01,0x90,0x05,0x83,0x00,0x01,0x01,0xd7,0x04,0xa4,0x00,0x01,0x03,0x67,0xff,0x22,0x00,0x01,0x01,0xd7,0x05,0x76,0x00,0x01,0x00,0xfa,0x06,0xa2,0x00,0x01,0x01,0xff,0x06,0x7d,0x00,0x01,0x01,0xa5,0x06,0x76,0x00,0x01,0x01,0x73,0x04,0x8d,0x00,0x01,0x01,0x5e,0x06,0x96,0x00,0x01,0x00,0xe8,0x07,0x41,0x00,0x01, +0x01,0x5e,0x06,0x1d,0x00,0x01,0x02,0x5d,0x02,0xed,0x00,0x01,0x01,0xa5,0x04,0xc8,0x00,0x01,0x00,0xfa,0xfd,0xd8,0x00,0x01,0x01,0x5e,0x03,0x2d,0x00,0x01,0x01,0x90,0xfd,0xc8,0x00,0x01,0x01,0x6c,0x03,0xf1,0x00,0x01,0x02,0x66,0xff,0x22,0x00,0x01,0x01,0x6c,0x01,0x2f,0x00,0x01,0x02,0x66,0xfd,0xf6,0x00,0x01,0x01,0x6c,0x05,0xa2, +0x00,0x01,0x01,0x6c,0x03,0xa1,0x00,0x01,0x02,0x9f,0x04,0xf2,0x00,0x01,0x01,0xc2,0x06,0xa0,0x00,0x01,0x01,0x83,0x02,0xe7,0x00,0x01,0x02,0x19,0xff,0x19,0x00,0x01,0x01,0xf9,0x03,0x7f,0x00,0x01,0x00,0xfa,0x08,0x1a,0x00,0x01,0x00,0x96,0xfd,0xcc,0x00,0x01,0x01,0xc2,0x05,0xa2,0x00,0x01,0x01,0xa9,0x05,0xc7,0x00,0x01,0x01,0x77, +0xfd,0xcd,0x00,0x01,0x01,0xc6,0x04,0x8b,0x00,0x01,0x01,0xc6,0x03,0x4a,0x00,0x01,0x01,0x73,0x04,0x9e,0x00,0x01,0x01,0x73,0xff,0x27,0x00,0x01,0x01,0x5e,0xfd,0x97,0x00,0x01,0x01,0xd7,0xff,0x20,0x00,0x01,0x00,0xfa,0xfe,0xa1,0x00,0x01,0x01,0x41,0x04,0x9e,0x00,0x01,0x02,0x0e,0x05,0xf3,0x00,0x01,0x01,0xf4,0x05,0x7a,0x00,0x01, +0x02,0x0e,0x06,0x56,0x00,0x01,0x01,0xf4,0x05,0xdd,0x00,0x01,0x01,0xdc,0x06,0x56,0x00,0x01,0x01,0xb0,0xfe,0x90,0x00,0x01,0x01,0xb0,0xfe,0x42,0x00,0x01,0x01,0x1a,0x06,0xd9,0x00,0x01,0x01,0x90,0x05,0x13,0x00,0x01,0x01,0x2c,0xfd,0xc9,0x00,0x01,0x01,0x2c,0xfd,0xaf,0x00,0x01,0x06,0x13,0xfe,0x63,0x00,0x01,0x01,0xc2,0x04,0x39, +0x00,0x01,0x01,0xc2,0xff,0x3c,0x00,0x01,0x06,0x13,0xfd,0x97,0x00,0x01,0x01,0x5e,0xff,0x27,0x00,0x01,0x07,0x3f,0xfe,0x63,0x00,0x01,0x02,0x26,0xff,0x0a,0x00,0x01,0x02,0x8f,0x04,0x68,0x00,0x01,0x01,0x2c,0x04,0x68,0x00,0x01,0x03,0xe8,0x06,0x1e,0x00,0x01,0x01,0x91,0x06,0xd9,0x00,0x01,0x01,0xf5,0x06,0x74,0x00,0x01,0x01,0xc2, +0x06,0x60,0x00,0x01,0x01,0xf4,0x06,0x2e,0x00,0x01,0x01,0x90,0xfe,0x42,0x00,0x01,0x01,0xc2,0xfd,0x97,0x00,0x01,0x01,0x95,0x04,0x47,0x00,0x01,0x01,0x63,0x04,0xc9,0x00,0x01,0x01,0xdb,0x04,0x4b,0x00,0x01,0x03,0x6b,0xfe,0xf0,0x00,0x01,0x01,0x5e,0x04,0x7d,0x00,0x01,0x02,0x8a,0xfe,0xf0,0x00,0x01,0x02,0x3b,0x06,0xe5,0x00,0x01, +0x01,0x2c,0x06,0xe5,0x00,0x01,0x01,0xa5,0x07,0x35,0x00,0x01,0x01,0x2c,0x07,0xfd,0x00,0x01,0x01,0xd7,0x05,0x9d,0x00,0x01,0x01,0x2c,0x07,0xf5,0x00,0x01,0x01,0x41,0xff,0x0a,0x00,0x01,0x01,0x5e,0xfe,0x42,0x00,0x01,0x01,0xa5,0xff,0x27,0x00,0x01,0x01,0xd7,0x05,0x6b,0x00,0x01,0x00,0xfa,0x08,0xef,0x00,0x01,0x01,0x90,0x08,0x40, +0x00,0x01,0x01,0x5e,0x07,0x99,0x00,0x01,0x01,0x90,0x08,0xb1,0x00,0x01,0x02,0x8f,0xfd,0x92,0x00,0x01,0x01,0x2c,0xfd,0x97,0x00,0x01,0x02,0x5d,0x05,0x7a,0x00,0x01,0x00,0xcd,0xfe,0xf5,0x00,0x01,0x02,0x5d,0x05,0x72,0x00,0x01,0x00,0xcd,0xfe,0xb9,0x00,0x01,0x02,0x5d,0x05,0x0a,0x00,0x01,0x01,0xc2,0x04,0x48,0x00,0x01,0x01,0x90, +0xfd,0xcc,0x00,0x01,0x01,0xc2,0x05,0x95,0x00,0x01,0x01,0xc2,0x05,0xc7,0x00,0x01,0x01,0xc2,0x05,0xbd,0x00,0x01,0x01,0xc2,0x04,0xdd,0x00,0x01,0x01,0x90,0x05,0xf5,0x00,0x01,0x01,0xc2,0x04,0x15,0x00,0x01,0x01,0xf4,0xfe,0xf1,0x00,0x01,0x01,0xae,0x03,0x3f,0x00,0x01,0x01,0xc6,0x06,0x40,0x00,0x01,0x01,0xc6,0x04,0x90,0x00,0x01, +0x01,0x90,0x05,0xbe,0x00,0x01,0x01,0xc6,0x04,0xdc,0x00,0x01,0x01,0x2c,0xff,0x27,0x00,0x01,0x01,0xc6,0x03,0xe9,0x00,0x01,0x00,0xfa,0xff,0x22,0x00,0x01,0x00,0xc8,0xff,0x27,0x00,0x01,0x00,0xc8,0xff,0x22,0x00,0x01,0x02,0x8a,0xff,0x0a,0x00,0x01,0x01,0xf5,0x05,0x8e,0x00,0x01,0x01,0xf4,0xfe,0x42,0x00,0x01,0x02,0x5f,0xfd,0xcd, +0x00,0x01,0x01,0xd7,0x05,0x41,0x00,0x01,0x02,0x62,0x05,0x16,0x00,0x01,0x02,0x62,0xff,0x92,0x00,0x01,0x01,0x1a,0x06,0x69,0x00,0x01,0x01,0x7e,0x06,0x69,0x00,0x01,0x01,0x7f,0x06,0x40,0x00,0x01,0x01,0xc5,0x05,0xaa,0x00,0x01,0x00,0xe6,0x06,0x40,0x00,0x01,0x01,0xe0,0xff,0x2a,0x00,0x01,0x01,0x18,0x06,0x0e,0x00,0x01,0x02,0x12, +0xfd,0xcd,0x00,0x01,0x01,0x0f,0xff,0x3c,0x00,0x01,0x00,0xfa,0xfe,0x42,0x00,0x01,0x01,0x72,0xfe,0x42,0x00,0x01,0x01,0x41,0xff,0x0d,0x00,0x01,0x01,0x5e,0xfd,0xe1,0x00,0x01,0x02,0x3b,0x05,0xbe,0x00,0x01,0x01,0xb0,0xfd,0x97,0x00,0x01,0x01,0xb0,0xfd,0xe1,0x00,0x01,0x01,0x2c,0x04,0x89,0x00,0x01,0x01,0x91,0x06,0x07,0x00,0x01, +0x01,0xf5,0x05,0x84,0x00,0x01,0x01,0x91,0x06,0xed,0x00,0x01,0x01,0xf5,0x06,0x6a,0x00,0x01,0x01,0xc2,0xfe,0x42,0x00,0x01,0x01,0xf4,0xfd,0x83,0x00,0x01,0x01,0xd7,0x05,0x55,0x00,0x01,0x01,0xd7,0x04,0xdd,0x00,0x01,0x01,0x90,0xfd,0x97,0x00,0x01,0x01,0x01,0x04,0xdd,0x00,0x01,0x01,0x4a,0x04,0xdd,0x00,0x01,0x02,0x5f,0xfe,0x63, +0x00,0x01,0x02,0x44,0xfe,0x42,0x00,0x01,0x00,0x9b,0xfe,0x91,0x00,0x01,0x02,0x5d,0x06,0xc8,0x00,0x01,0x01,0x5e,0x08,0x1e,0x00,0x01,0x02,0x5d,0x05,0xc7,0x00,0x01,0x01,0x90,0x07,0x1d,0x00,0x01,0x01,0x90,0x05,0x20,0x00,0x01,0x01,0xc6,0x04,0x47,0x00,0x01,0x00,0xfa,0xff,0x2b,0x00,0x01,0x00,0xfa,0xfe,0xd6,0x00,0x01,0x01,0x7e, +0x04,0x82,0x00,0x01,0x01,0x7e,0x05,0xc1,0x00,0x01,0x02,0xee,0xff,0x25,0x00,0x01,0x02,0x2a,0x05,0x78,0x00,0x01,0x02,0x2a,0x04,0x2c,0x00,0x01,0x02,0x2a,0x06,0x84,0x00,0x01,0x02,0x2a,0x05,0x58,0x00,0x01,0x01,0x5e,0x04,0xe9,0x00,0x01,0x01,0x7f,0x05,0x1b,0x00,0x01,0x01,0x5e,0x04,0x50,0x00,0x01,0x02,0x26,0xfd,0xcd,0x00,0x01, +0x00,0xfa,0x05,0x70,0x00,0x01,0x01,0x7e,0x07,0x41,0x00,0x01,0x01,0x7e,0x06,0xd9,0x00,0x01,0x02,0x09,0x04,0xa4,0x00,0x01,0x02,0x09,0x05,0x76,0x00,0x01,0x02,0x09,0x05,0x9d,0x00,0x01,0x02,0x09,0x05,0x6b,0x00,0x01,0x02,0x5d,0x05,0x7e,0x00,0x01,0x00,0xcd,0xfe,0xf0,0x00,0x01,0x01,0x83,0x04,0x75,0x00,0x01,0x01,0x83,0x03,0xc0, +0x00,0x01,0x01,0x7e,0x06,0x40,0x00,0x01,0x02,0x09,0x05,0x55,0x00,0x01,0x02,0x09,0x04,0xdd,0x00,0x01,0x00,0x9b,0xfe,0x8c,0x00,0x01,0x02,0xa4,0xfd,0xcc,0x00,0x01,0x02,0x26,0xfd,0xd1,0x00,0x01,0x02,0xa4,0xfd,0xc8,0x00,0x01,0x01,0xf4,0x03,0xd5,0x00,0x01,0x02,0x26,0xfd,0xc8,0x00,0x01,0x01,0x2c,0x05,0xaf,0x00,0x01,0x01,0x90, +0x07,0x3f,0x00,0x01,0x01,0xaa,0x06,0xbe,0x00,0x01,0x01,0xf4,0x06,0x77,0x00,0x01,0x00,0xfa,0x07,0xa0,0x00,0x01,0x01,0x90,0xff,0x9c,0x00,0x01,0x01,0x90,0xff,0x5c,0x00,0x01,0x01,0xc6,0x05,0xee,0x00,0x01,0x01,0xc6,0x05,0x43,0x00,0x01,0x01,0x90,0x06,0x5a,0x00,0x01,0x00,0xc8,0xff,0x08,0x00,0x01,0x01,0xc6,0x03,0xb7,0x00,0x01, +0x00,0xfa,0xfd,0x46,0x00,0x01,0x01,0xd9,0x05,0x27,0x00,0x01,0x02,0x3d,0xfd,0xcd,0x00,0x01,0x01,0xd8,0x05,0x27,0x00,0x01,0x02,0x3c,0xfd,0xcd,0x00,0x01,0x01,0x6c,0x05,0xd2,0x00,0x01,0x01,0x6c,0x03,0xd1,0x00,0x01,0x02,0x26,0xfd,0x46,0x00,0x01,0x01,0x2c,0x04,0xba,0x00,0x01,0x01,0x5e,0x04,0x54,0x00,0x01,0x00,0xc8,0x06,0xf1, +0x00,0x01,0x01,0x2c,0xff,0x2c,0x00,0x01,0x00,0xc8,0x07,0xaa,0x00,0x01,0x00,0xc8,0x05,0x8a,0x00,0x01,0x01,0x2c,0xfd,0xcc,0x00,0x01,0x00,0xc8,0x07,0xa9,0x00,0x01,0x00,0xc8,0x06,0x1b,0x00,0x01,0x00,0xc8,0x07,0x28,0x00,0x01,0x01,0x5e,0x04,0x3b,0x00,0x01,0x00,0xfa,0x04,0x89,0x00,0x01,0x01,0x5e,0x04,0x39,0x00,0x01,0x01,0x5e, +0xff,0x0a,0x00,0x01,0x00,0xfa,0xff,0x27,0x00,0x01,0x01,0x5e,0x05,0x83,0x00,0x01,0x00,0xfa,0x05,0xaf,0x00,0x01,0x00,0xfa,0x04,0xec,0x00,0x01,0x00,0xfa,0x04,0x54,0x00,0x01,0x01,0x2c,0x04,0x36,0x00,0x01,0x01,0x90,0xff,0x0a,0x00,0x01,0x01,0x2c,0x04,0xfe,0x00,0x01,0x00,0xf8,0x06,0x1e,0x00,0x01,0x00,0x94,0xff,0x86,0x00,0x01, +0x00,0xc6,0xff,0x86,0x00,0x01,0x00,0xf8,0x08,0x40,0x00,0x01,0x00,0xf8,0x07,0x99,0x00,0x01,0x00,0xf8,0x08,0xb1,0x00,0x01,0x00,0x94,0xfd,0x97,0x00,0x01,0x00,0xc6,0xfd,0x97,0x00,0x01,0x01,0xc9,0x02,0xd2,0x00,0x01,0x01,0x65,0xfd,0xcd,0x00,0x01,0x01,0xc9,0x04,0x6b,0x00,0x01,0x01,0x97,0x06,0x1d,0x00,0x01,0x01,0xc9,0x05,0x13, +0x00,0x01,0x01,0x65,0xfd,0xc9,0x00,0x01,0x01,0x65,0xfd,0xaf,0x00,0x01,0x01,0xc9,0x05,0x83,0x00,0x01,0x01,0xc9,0x05,0x20,0x00,0x01,0x01,0xc9,0x07,0x3f,0x00,0x01,0x01,0xc6,0x04,0xc2,0x00,0x01,0x01,0xc6,0x04,0x4f,0x00,0x01,0x01,0xc6,0x05,0x67,0x00,0x01,0x01,0xc6,0x03,0x04,0x00,0x01,0x00,0xcc,0xfe,0xcd,0x00,0x01,0x01,0xae, +0x03,0x04,0x00,0x01,0x00,0x9a,0xfe,0xf0,0x00,0x01,0x00,0x9a,0xff,0x08,0x00,0x01,0x01,0xf8,0xff,0x6e,0x00,0x01,0x01,0x6c,0x01,0xc5,0x00,0x01,0x00,0xcc,0xff,0x22,0x00,0x01,0x01,0x30,0xfe,0xa4,0x00,0x01,0x00,0xc8,0x05,0xe2,0x00,0x01,0x00,0xc8,0xff,0x2a,0x00,0x01,0x00,0x64,0x05,0x4c,0x00,0x01,0x00,0xb4,0xff,0x2a,0x00,0x01, +0x02,0x3a,0x03,0xd7,0x00,0x01,0x01,0x40,0xff,0x24,0x00,0x01,0x01,0x86,0xfd,0x8a,0x00,0x01,0x02,0x58,0x05,0x32,0x00,0x01,0x02,0xbc,0xfd,0xcd,0x00,0x01,0x02,0x26,0x05,0x32,0x00,0x01,0x03,0xde,0x05,0x50,0x00,0x01,0x02,0x3a,0xff,0x22,0x00,0x01,0x01,0xe0,0x06,0xc2,0x00,0x01,0x01,0xe0,0xfe,0x52,0x00,0x01,0x02,0x9e,0x04,0x2a, +0x00,0x01,0x01,0x68,0x04,0x47,0x00,0x01,0x02,0xe4,0xfc,0x7c,0x00,0x01,0x01,0xd6,0x05,0xaa,0x00,0x01,0x01,0x68,0x05,0x24,0x00,0x01,0x02,0x8a,0xfe,0x48,0x00,0x01,0x01,0x7c,0x06,0x54,0x00,0x01,0x02,0x9e,0x05,0xfa,0x00,0x01,0x02,0x6c,0xff,0x2b,0x00,0x01,0x02,0x94,0x06,0x0e,0x00,0x01,0x01,0x36,0x05,0x1e,0x00,0x01,0x00,0x6e, +0xff,0x10,0x00,0x01,0x01,0x72,0x05,0x96,0x00,0x01,0x01,0x40,0xfe,0x52,0x00,0x01,0x01,0x4a,0xfe,0x52,0x00,0x01,0x01,0x40,0x04,0xf6,0x00,0x01,0x00,0x64,0xfe,0xd4,0x00,0x01,0x02,0x08,0x05,0x0a,0x00,0x01,0x01,0x72,0x05,0x64,0x00,0x01,0x01,0xf4,0x04,0x38,0x00,0x01,0x01,0x90,0x03,0x20,0x00,0x01,0x00,0xdc,0xfd,0xcd,0x00,0x01, +0x01,0x72,0xfd,0xcd,0x00,0x01,0x01,0xea,0x04,0x10,0x00,0x01,0x02,0x58,0xfe,0x52,0x00,0x01,0x01,0xce,0xfd,0x94,0x00,0x01,0x07,0x43,0xfd,0x6c,0x00,0x01,0x04,0xa4,0xfd,0x6c,0x00,0x01,0x01,0x6b,0x05,0xd8,0x00,0x01,0x01,0xc3,0xfe,0xe2,0x00,0x01,0x01,0x90,0x06,0x40,0x00,0x01,0x02,0x3b,0x04,0xb0,0x00,0x01,0x01,0x90,0x05,0xc3, +0x00,0x01,0x02,0x2a,0x06,0x40,0x00,0x01,0x02,0x32,0x05,0x46,0x00,0x01,0x02,0x8a,0xfd,0x7a,0x00,0x01,0x02,0x26,0xfd,0x7a,0x00,0x01,0x01,0x90,0x05,0xaa,0x00,0x01,0x01,0x5e,0x05,0x91,0x00,0x01,0x02,0x2a,0x04,0x90,0x00,0x01,0x06,0xf4,0x06,0xc2,0x00,0x01,0x06,0xf4,0xff,0x2a,0x00,0x01,0x05,0x0a,0x08,0x7a,0x00,0x01,0x04,0xb0, +0xff,0x2a,0x00,0x01,0x08,0xfc,0x06,0x32,0x00,0x01,0x08,0xfc,0xff,0x9c,0x00,0x01,0x0a,0x0a,0x03,0x26,0x00,0x01,0x09,0xa6,0xfd,0xcd,0x00,0x01,0x07,0xd0,0x03,0xe8,0x00,0x01,0x07,0x62,0xfe,0x3e,0x00,0x01,0x06,0x5e,0x06,0x54,0x00,0x01,0x05,0x46,0xfe,0x70,0x00,0x01,0x09,0x92,0x05,0x88,0x00,0x01,0x09,0x92,0xff,0x2a,0x00,0x01, +0x07,0x08,0x06,0x5e,0x00,0x01,0x04,0xe2,0x05,0xbe,0x00,0x01,0x01,0x03,0x07,0xda,0x00,0x01,0x00,0x7e,0x08,0x52,0x00,0x01,0x01,0x03,0x07,0x26,0x00,0x01,0x00,0xc4,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0x2a,0x00,0x01,0x01,0x03,0x07,0x6c,0x00,0x01,0x01,0x03,0x08,0x3e,0x00,0x01,0x01,0x03,0x08,0x98,0x00,0x01,0x00,0xef,0x09,0x24, +0x00,0x01,0x00,0xf5,0x08,0x3e,0x00,0x01,0x01,0x03,0x09,0x38,0x00,0x01,0x00,0xef,0x08,0x5c,0x00,0x01,0x00,0xe9,0x08,0x98,0x00,0x01,0x01,0x03,0x08,0x66,0x00,0x01,0x00,0xec,0x08,0x2a,0x00,0x01,0x01,0x03,0x08,0x16,0x00,0x01,0x01,0x03,0x07,0xf8,0x00,0x01,0x01,0x1f,0x08,0x8e,0x00,0x01,0x01,0x0c,0x08,0x66,0x00,0x01,0x01,0x03, +0x08,0xde,0x00,0x01,0x00,0xf9,0x08,0x34,0x00,0x01,0x00,0xeb,0x08,0x34,0x00,0x01,0x01,0x11,0x08,0x3e,0x00,0x01,0x01,0x1c,0x08,0xd4,0x00,0x01,0x00,0xf3,0x07,0xf8,0x00,0x01,0x00,0xc4,0x08,0x70,0x00,0x01,0x01,0x03,0x08,0x34,0x00,0x01,0x00,0xf9,0x09,0x1a,0x00,0x01,0x01,0x03,0x07,0x30,0x00,0x01,0x01,0x03,0x08,0x48,0x00,0x01, +0x01,0x03,0x07,0xe4,0x00,0x01,0x01,0x03,0x07,0x3a,0x00,0x01,0x01,0x42,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0x7a,0x00,0x01,0x00,0xf8,0x09,0x1a,0x00,0x01,0x00,0xd7,0x08,0xfc,0x00,0x01,0x01,0x03,0x07,0x12,0x00,0x01,0x00,0xe1,0x08,0x34,0x00,0x01,0x01,0x03,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0xb6,0x00,0x01,0x00,0xfa,0x07,0x9e, +0x00,0x01,0x01,0x03,0x08,0xca,0x00,0x01,0x00,0xfa,0x08,0x52,0x00,0x01,0x00,0xfa,0x08,0x98,0x00,0x01,0x01,0x18,0x07,0xd0,0x00,0x01,0x01,0x18,0x08,0x61,0x00,0x01,0x01,0x40,0x08,0x98,0x00,0x01,0x01,0x7c,0x09,0x47,0x00,0x01,0x00,0xc8,0x07,0x78,0x00,0x01,0x01,0x68,0x07,0x78,0x00,0x01,0x00,0xfa,0x08,0x27,0x00,0x01,0x01,0x2c, +0x08,0x98,0x00,0x01,0x01,0xe0,0x08,0x5b,0x00,0x01,0x00,0xdc,0x09,0x2a,0x00,0x01,0x00,0xfa,0x08,0x69,0x00,0x01,0x00,0xfa,0x08,0x2c,0x00,0x01,0x00,0xc8,0x08,0x95,0x00,0x01,0x00,0xa0,0x08,0x95,0x00,0x01,0x01,0x40,0x08,0x95,0x00,0x01,0x02,0x80,0x08,0x95,0x00,0x01,0x01,0x4a,0x08,0x95,0x00,0x01,0x01,0x2c,0x08,0x5b,0x00,0x01, +0x01,0x03,0x06,0xf4,0x00,0x01,0x02,0x5a,0x09,0xc4,0x00,0x01,0x01,0x05,0x08,0x65,0x00,0x01,0x00,0xc9,0x09,0x2a,0x00,0x01,0x00,0xfa,0x09,0x8b,0x00,0x01,0x01,0x03,0x08,0xd9,0x00,0x01,0x00,0x1d,0x0a,0x5b,0x00,0x01,0xff,0x8e,0x09,0xe7,0x00,0x01,0xff,0x97,0x09,0xe7,0x00,0x01,0xff,0x47,0x09,0xff,0x00,0x01,0xff,0x79,0x09,0xa9, +0x00,0x01,0xff,0xcd,0x09,0xa9,0x00,0x01,0x01,0x7a,0x08,0x53,0x00,0x01,0x01,0x93,0x08,0x38,0x00,0x01,0x01,0x03,0xfe,0x0c,0x00,0x01,0x01,0x03,0xfe,0xd4,0x00,0x01,0x00,0xb2,0xfd,0xbc,0x00,0x01,0x01,0x03,0xfd,0xbc,0x00,0x01,0x00,0xec,0xfd,0xc6,0x00,0x01,0x01,0x1f,0xfd,0xc6,0x00,0x01,0x01,0x03,0xfe,0x48,0x00,0x01,0x01,0x03, +0xfe,0x70,0x00,0x01,0x00,0xfa,0xfe,0x53,0x00,0x01,0x01,0x2c,0xfd,0x8b,0x00,0x01,0x00,0xbe,0xfe,0x5c,0x00,0x01,0x01,0x5e,0xfe,0x5c,0x00,0x01,0x00,0xc8,0xfd,0xa5,0x00,0x01,0x01,0x7c,0xfd,0x5e,0x00,0x01,0x01,0x04,0xfd,0xbd,0x00,0x01,0x00,0x8c,0xfd,0x3a,0x00,0x01,0x01,0x03,0xfc,0x8b,0x00,0x01,0x00,0x00,0xfe,0x09,0x00,0x01, +0x02,0x62,0xff,0xe2,0x00,0x01,0x02,0xb7,0x00,0x00,0x00,0x01,0x02,0xc9,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x02,0xad,0x00,0x50,0x00,0x01,0x00,0xdf,0xff,0x44,0x00,0x01,0x02,0xb2,0x00,0x50,0x00,0x01,0x02,0x3a,0xfe,0x42,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x02,0xb8,0x00,0x00,0x00,0x01,0x01,0xa4,0x00,0x00, +0x00,0x01,0x01,0xc6,0x00,0x00,0x00,0x01,0x01,0xb3,0x00,0x00,0x00,0x01,0x03,0x20,0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x01,0x01,0x75,0x00,0x00,0x00,0x01,0x00,0xef,0x00,0x00,0x00,0x01,0x00,0x95,0x00,0x00,0x00,0x01,0x02,0x2a,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x01,0x15,0x00,0x00,0x00,0x01,0x00,0xbb, +0x00,0x00,0x00,0x01,0x01,0xd9,0x00,0x00,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x01,0x00,0xc4,0x00,0x00,0x00,0x01,0x00,0x6a,0x00,0x00,0x00,0x01,0x01,0x50,0x00,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00,0x00,0x01,0xff,0xe1,0x00,0x00,0x00,0x01,0x02,0x26,0x00,0x00,0x00,0x01,0x01,0x97,0x00,0x00,0x00,0x01, +0x00,0xdf,0x00,0x00,0x00,0x01,0x00,0x3f,0x00,0x00,0x00,0x01,0x02,0x5d,0x00,0x00,0x00,0x01,0x01,0xce,0x00,0x00,0x00,0x01,0x01,0x48,0x00,0x00,0x00,0x01,0x00,0xee,0x00,0x00,0x00,0x01,0x00,0xb6,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x01,0xff,0xa1,0x00,0x00,0x00,0x01,0xff,0x47,0x00,0x00,0x00,0x01,0x01,0x3a,0x00,0x00, +0x00,0x01,0x00,0xab,0x00,0x00,0x00,0x01,0xff,0xf3,0x00,0x00,0x00,0x01,0xff,0xcb,0x00,0x00,0x00,0x01,0x02,0x5b,0x00,0x00,0x00,0x01,0x01,0xcc,0x00,0x00,0x00,0x01,0x01,0x46,0x00,0x00,0x00,0x01,0x00,0xec,0x00,0x00,0x00,0x01,0x02,0x5a,0x00,0x00,0x00,0x01,0x01,0xcb,0x00,0x00,0x00,0x01,0x01,0x45,0x00,0x00,0x00,0x01,0x00,0xeb, +0x00,0x00,0x00,0x01,0x01,0x49,0x00,0x00,0x00,0x01,0x00,0xba,0x00,0x00,0x00,0x01,0xff,0xf5,0x00,0x00,0x00,0x01,0xff,0x3b,0x00,0x00,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x00,0xd9,0x00,0x00,0x00,0x01,0x00,0x53,0x00,0x00,0x00,0x01,0xff,0xf9,0x00,0x00,0x00,0x01,0x01,0x6d,0x00,0x00,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x01, +0x00,0x58,0x00,0x00,0x00,0x01,0xff,0xfe,0x00,0x00,0x00,0x01,0x02,0x62,0x00,0x00,0x00,0x01,0x01,0xd3,0x00,0x00,0x00,0x01,0x01,0x4d,0x00,0x00,0x00,0x01,0x00,0xf3,0x00,0x00,0x00,0x01,0xfe,0x98,0x00,0x00,0x00,0x01,0xfd,0x91,0x00,0x00,0x00,0x01,0xfc,0xd7,0x00,0x00,0x00,0x01,0x01,0x0e,0x00,0x00,0x00,0x01,0x00,0x7f,0x00,0x00, +0x00,0x01,0xff,0x9f,0x00,0x00,0x00,0x01,0x02,0x57,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x01,0x42,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x00,0x01,0x02,0x08,0x00,0x00,0x00,0x01,0x01,0x79,0x00,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x00,0x01,0x01,0xd1,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x01,0xff,0xa7, +0x00,0x00,0x00,0x01,0x01,0xef,0x00,0x00,0x00,0x01,0x01,0x60,0x00,0x00,0x00,0x01,0x00,0xda,0x00,0x00,0x00,0x01,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0xbf,0x00,0x00,0x00,0x01,0xff,0xb6,0x00,0x00,0x00,0x01,0xfe,0xaf,0x00,0x00,0x00,0x01,0xfd,0xf5,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x00,0x00,0x01,0x01,0x1f,0x00,0x00,0x00,0x01, +0x02,0x53,0x00,0x00,0x00,0x01,0x01,0xc4,0x00,0x00,0x00,0x01,0x01,0xbe,0x00,0x00,0x00,0x01,0x01,0xaa,0x00,0x00,0x00,0x01,0x03,0x1b,0x00,0x00,0x00,0x01,0x02,0x8c,0x00,0x00,0x00,0x01,0x01,0xc0,0x00,0x00,0x00,0x01,0x01,0x34,0x00,0x00,0x00,0x01,0x02,0xa3,0x00,0x00,0x00,0x01,0x02,0x14,0x00,0x00,0x00,0x01,0x01,0x8e,0x00,0x00, +0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x02,0x0f,0x00,0x00,0x00,0x01,0x01,0x89,0x00,0x00,0x00,0x01,0x01,0x2f,0x00,0x00,0x00,0x01,0x01,0xbb,0x00,0x00,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01,0x01,0x3e,0x00,0x00,0x00,0x01,0x00,0xb8, +0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x00,0x01,0x01,0xe5,0x00,0x00,0x00,0x01,0x01,0x56,0x00,0x00,0x00,0x01,0x00,0xd0,0x00,0x00,0x00,0x01,0x00,0x76,0x00,0x00,0x00,0x01,0x00,0xc5,0x00,0x00,0x00,0x01,0xff,0xe5,0x00,0x00,0x00,0x01,0x01,0xd4,0x00,0x00,0x00,0x01,0x00,0xfc,0x00,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x00,0x01, +0xff,0xe7,0x00,0x00,0x00,0x01,0xff,0x8d,0x00,0x00,0x00,0x01,0x01,0x62,0x00,0x00,0x00,0x01,0x00,0xd3,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0xe6,0xff,0x9c,0x00,0x01,0x00,0xca,0x00,0x00,0x00,0x01,0x00,0x8a,0x00,0x00,0x00,0x01,0x01,0x1d,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00, +0x00,0x01,0x01,0x10,0x00,0x00,0x00,0x01,0x00,0xf2,0x00,0x00,0x00,0x01,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x01,0xff,0xac,0x00,0x00,0x00,0x01,0x01,0x17,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0xb5,0x00,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x98, +0x00,0x00,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x00,0x00,0x01,0xff,0xb4,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x01,0xff,0xc4,0x00,0x00,0x00,0x01,0x00,0xd2,0x00,0x00,0x00,0x01, +0x01,0x18,0x00,0x00,0x00,0x01,0x00,0xed,0x00,0x00,0x00,0x01,0x02,0x60,0x00,0x00,0x00,0x01,0x03,0xd5,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x01,0x01,0xa6,0x00,0x00,0x00,0x01,0x01,0x98,0x00,0x00,0x00,0x01,0x00,0xe4,0x00,0x00,0x00,0x01,0x02,0xa8,0x00,0x00,0x00,0x01,0x04,0x6c,0x00,0x00,0x00,0x01,0x03,0x7a,0x00,0x00, +0x00,0x01,0x01,0x9d,0x00,0x00,0x00,0x01,0x00,0x8e,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0x00,0x00,0x01,0x03,0xee,0x00,0x00,0x00,0x01,0x02,0xfc,0x00,0x00,0x00,0x01,0x01,0x47,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x02,0xf8,0x00,0x00,0x00,0x01,0x02,0x0d,0x00,0x00,0x00,0x01,0x00,0xf5, +0x00,0x00,0x00,0x01,0x01,0x13,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x00,0x01,0x03,0xa2,0x00,0x00,0x00,0x01,0x02,0xba,0x00,0x00,0x00,0x01,0x01,0x19,0x00,0x00,0x00,0x01,0x01,0x11,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0x00,0x00,0x01,0x04,0xc1,0x00,0x00,0x00,0x01,0x03,0xcf,0x00,0x00,0x00,0x01,0x01,0xb5,0x00,0x00,0x00,0x01, +0x00,0x84,0x00,0x00,0x00,0x01,0x02,0x3b,0x00,0x00,0x00,0x01,0x01,0x0c,0x00,0x00,0x00,0x01,0x01,0x3d,0x00,0x00,0x00,0x01,0x00,0x6c,0x00,0x00,0x00,0x01,0x02,0xc4,0x00,0x00,0x00,0x01,0x01,0xdc,0x00,0x00,0x00,0x01,0x01,0x25,0x00,0x00,0x00,0x01,0x04,0xbb,0x00,0x00,0x00,0x01,0x03,0xc9,0x00,0x00,0x00,0x01,0x01,0x90,0x00,0x00, +0x00,0x01,0x02,0xc1,0x00,0x00,0x00,0x01,0x05,0x02,0x00,0x00,0x00,0x01,0x04,0x10,0x00,0x00,0x00,0x01,0x01,0x72,0x00,0x00,0x00,0x01,0x02,0x3c,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x03,0xce,0x00,0x00,0x00,0x01,0x02,0xdc,0x00,0x00,0x00,0x01,0x01,0x26,0x00,0x00,0x00,0x01,0x03,0xc4,0x00,0x00,0x00,0x01,0x02,0xd2, +0x00,0x00,0x00,0x01,0x01,0x43,0x00,0x00,0x00,0x01,0xff,0x1e,0x00,0x00,0x00,0x01,0x02,0x2b,0x00,0x00,0x00,0x01,0x03,0xec,0x00,0x00,0x00,0x01,0x03,0x38,0x00,0x00,0x00,0x01,0x02,0xe6,0x00,0x00,0x00,0x01,0xff,0xd7,0x00,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x00,0x01,0x01,0x04,0x00,0x00,0x00,0x01,0x02,0xbf,0x00,0x00,0x00,0x01, +0x04,0xe3,0x00,0x00,0x00,0x01,0x03,0xf1,0x00,0x00,0x00,0x01,0x02,0xbe,0x00,0x00,0x00,0x01,0x04,0xe9,0x00,0x00,0x00,0x01,0x03,0xf7,0x00,0x00,0x00,0x01,0x01,0xab,0x00,0x00,0x00,0x01,0x00,0x62,0x00,0x00,0x00,0x01,0x01,0x6a,0x00,0x00,0x00,0x01,0x02,0xec,0x00,0x00,0x00,0x01,0x01,0x96,0x00,0x00,0x00,0x01,0x01,0x1b,0x00,0x00, +0x00,0x01,0x01,0x39,0x00,0x00,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x02,0xb3,0x00,0x00,0x00,0x01,0x04,0xd0,0x00,0x00,0x00,0x01,0x03,0xde,0x00,0x00,0x00,0x01,0x01,0x86,0x00,0x00,0x00,0x01,0x00,0xb3,0x00,0x00,0x00,0x01,0x02,0x71,0x00,0x00,0x00,0x01,0x04,0x2c,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x01,0x01,0x6c, +0x00,0x00,0x00,0x01,0x01,0x4e,0x00,0x00,0x00,0x01,0x00,0xb2,0x00,0x00,0x00,0x01,0x04,0x3a,0x00,0x00,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x01,0x5c,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0x00,0x00,0x01,0x04,0x75,0x00,0x00,0x00,0x01,0x03,0x83,0x00,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x02,0x33,0x00,0x00,0x00,0x01, +0x04,0x04,0x00,0x00,0x00,0x01,0x02,0xd3,0x00,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00,0x00,0x01,0x04,0x26,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x01,0x63,0x00,0x00,0x00,0x01,0x01,0x4f,0x00,0x00,0x00,0x01,0x01,0x0b,0x00,0x00,0x00,0x01,0x02,0xaf,0x00,0x00,0x00,0x01,0x04,0xd3,0x00,0x00, +0x00,0x01,0x03,0xcd,0x00,0x00,0x00,0x01,0x03,0x1f,0x00,0x00,0x00,0x01,0x05,0xd9,0x00,0x00,0x00,0x01,0x04,0xe5,0x00,0x00,0x00,0x01,0x01,0x77,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0x00,0x00,0x01,0x05,0x24,0x00,0x00,0x00,0x01,0x04,0x32,0x00,0x00,0x00,0x01,0x02,0x17,0x00,0x00,0x00,0x01,0x03,0x71,0x00,0x00,0x00,0x01,0x02,0x7f, +0x00,0x00,0x00,0x01,0xff,0x1e,0x01,0x04,0x00,0x01,0xff,0xd7,0x00,0xdc,0x00,0x01,0x00,0x59,0x00,0xf0,0x00,0x01,0x02,0x29,0x00,0x00,0x00,0x01,0x03,0x96,0x00,0x00,0x00,0x01,0x02,0xa4,0x00,0x00,0x00,0x01,0x07,0x17,0x00,0x00,0x00,0x01,0x02,0xf1,0x00,0x00,0x00,0x01,0x05,0xca,0x00,0x00,0x00,0x01,0xff,0x26,0x00,0x00,0x00,0x01, +0x03,0x4e,0x00,0x00,0x00,0x01,0x01,0x77,0x00,0xdc,0x00,0x01,0x00,0x75,0x00,0x00,0x00,0x01,0x00,0xe3,0x00,0x00,0x00,0x01,0x01,0x9c,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x01,0x02,0x82,0x00,0x00,0x00,0x01,0x01,0x52,0x00,0x00,0x00,0x01,0x01,0x83,0x00,0x00,0x00,0x01,0x01,0x8d,0x00,0x00,0x00,0x01,0x00,0x94,0x00,0x00, +0x00,0x01,0x01,0x7f,0x00,0x00,0x00,0x01,0xff,0x7a,0x00,0x00,0x00,0x01,0x02,0xa7,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0xf0,0x00,0x01,0x01,0x5a,0x00,0x00,0x00,0x01,0x01,0x3d,0x00,0xdc,0x00,0x01,0x00,0xc9,0x00,0x00,0x00,0x01,0xff,0x81,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0xdc,0x00,0x01,0x04,0x54,0x00,0x00,0x00,0x01,0x03,0x07, +0x00,0x00,0x00,0x01,0x00,0x3a,0x00,0x00,0x00,0x01,0xff,0x5e,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0xdc,0x00,0x01,0x04,0x31,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0xad,0x00,0x00,0x00,0x01,0xff,0xdb,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0xdc,0x00,0x01,0x04,0xae,0x00,0x00,0x00,0x01, +0x01,0x2a,0x00,0x00,0x00,0x01,0x02,0x91,0x00,0x00,0x00,0x01,0x04,0x8a,0x00,0x00,0x00,0x01,0x03,0x39,0x00,0x00,0x00,0x01,0x03,0x98,0x00,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x00,0x01,0x01,0xe0,0x00,0x00,0x00,0x01,0x02,0x0b,0x00,0x00,0x00,0x01,0x01,0x7d,0x00,0x00,0x00,0x01,0xff,0x36,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0xdc, +0x00,0x01,0x04,0x09,0x00,0x00,0x00,0x01,0x02,0xbc,0x00,0x00,0x00,0x01,0xff,0xef,0x00,0x00,0x00,0x01,0x00,0x85,0x00,0x00,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0xdc,0x00,0x01,0x05,0x17,0x00,0x00,0x00,0x01,0x00,0xfd,0x00,0x00,0x00,0x01,0x01,0x93,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0xdc,0x00,0x01,0x05,0x5d, +0x00,0x00,0x00,0x01,0x02,0x86,0x00,0x00,0x00,0x01,0x03,0x99,0x00,0x00,0x00,0x01,0x02,0x35,0x00,0x00,0x00,0x01,0x03,0x36,0x00,0x00,0x00,0x01,0x01,0xac,0x00,0x00,0x00,0x01,0x02,0x2c,0x00,0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x00,0x01,0x02,0xb9,0x00,0x00,0x00,0x01,0x01,0x6f,0x00,0x00,0x00,0x01,0x03,0xca,0x00,0x00,0x00,0x01, +0x02,0xb6,0x00,0x00,0x00,0x01,0x04,0x11,0x00,0x00,0x00,0x01,0x01,0xa5,0x00,0x00,0x00,0x01,0x03,0xb9,0x00,0x00,0x00,0x01,0x01,0xc9,0x00,0x00,0x00,0x01,0x02,0xdd,0x00,0x00,0x00,0x01,0x03,0xf0,0x00,0x00,0x00,0x01,0x03,0xf8,0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x00,0x00,0x01,0x01,0x53,0x00,0x00,0x00,0x01,0x03,0xdf,0x00,0x00, +0x00,0x01,0x02,0x64,0x00,0x00,0x00,0x01,0x03,0x3b,0x00,0x00,0x00,0x01,0x02,0x2d,0x00,0x00,0x00,0x01,0x04,0x25,0x00,0x00,0x00,0x01,0x02,0x4b,0x00,0x00,0x00,0x01,0x03,0x84,0x00,0x00,0x00,0x01,0x00,0xce,0x00,0x00,0x00,0x01,0x02,0x0a,0x00,0x00,0x00,0x01,0x02,0xed,0x00,0x00,0x00,0x01,0x03,0xba,0x00,0x00,0x00,0x01,0x03,0x77, +0x00,0x00,0x00,0x01,0x02,0xff,0x00,0x00,0x00,0x01,0x04,0x51,0x00,0x00,0x00,0x01,0x02,0xfa,0x00,0x00,0x00,0x01,0x04,0x33,0x00,0x00,0x00,0x01,0x02,0x80,0x00,0x00,0x00,0x01,0x02,0xa5,0x00,0x00,0x00,0x01,0x02,0x41,0x00,0x00,0x00,0x01,0x03,0xd0,0x00,0x00,0x00,0x01,0x01,0xb0,0x00,0x00,0x00,0x01,0x03,0xf2,0x00,0x00,0x00,0x01, +0x03,0xb2,0x00,0x00,0x00,0x01,0x02,0x24,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0xfe,0xac,0x00,0x00,0x00,0x01,0xff,0xce,0x00,0x00,0x00,0x01,0xff,0xd8,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x00,0x00,0x01,0xff,0x74,0x00,0x00,0x00,0x01,0xfe,0xf2,0x00,0x00,0x00,0x01,0xfe,0xca,0x00,0x00,0x00,0x01,0x02,0x3a,0x00,0x00, +0x00,0x01,0x02,0x44,0x00,0x00,0x00,0x01,0xff,0x06,0x00,0x00,0x00,0x01,0x01,0x9a,0x00,0x00,0x00,0x01,0x02,0x4e,0x00,0x00,0x00,0x01,0xff,0x6a,0x00,0x00,0x00,0x01,0xfe,0xa2,0x00,0x00,0x00,0x01,0xff,0x1a,0x00,0x00,0x00,0x01,0xfe,0xe8,0x00,0x00,0x00,0x01,0xfd,0xd0,0x00,0x00,0x00,0x01,0xfd,0x76,0x00,0x00,0x00,0x01,0xfe,0x34, +0x00,0x00,0x00,0x01,0xfd,0x44,0x00,0x00,0x00,0x01,0xfd,0x1c,0x00,0x00,0x00,0x01,0xfe,0x2a,0x00,0x00,0x00,0x01,0xfe,0x52,0x00,0x00,0x00,0x01,0xfd,0x12,0x00,0x00,0x00,0x01,0xfe,0x66,0x00,0x00,0x00,0x01,0xfd,0x80,0x00,0x00,0x00,0x01,0xfd,0x62,0x00,0x00,0x00,0x01,0xfe,0x3e,0x00,0x00,0x00,0x01,0xfd,0xe4,0x00,0x00,0x00,0x01, +0xfd,0x3a,0x00,0x00,0x00,0x01,0xfe,0x5c,0x00,0x00,0x00,0x01,0xfd,0x4e,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0xfe,0xd4,0x00,0x00,0x00,0x01,0xfe,0xc0,0x00,0x00,0x00,0x01,0xfe,0x70,0x00,0x00,0x00,0x01,0xfd,0xda,0x00,0x00,0x00,0x01,0xfd,0xc6,0x00,0x00, +0x00,0x01,0xfe,0x20,0x00,0x00,0x00,0x01,0xfe,0x8e,0x00,0x00,0x00,0x01,0xfd,0xf8,0x00,0x00,0x00,0x01,0xfe,0x16,0x00,0x00,0x00,0x01,0xfd,0xbc,0x00,0x00,0x00,0x01,0xfe,0x02,0x00,0x00,0x00,0x01,0xff,0xe2,0x00,0x00,0x00,0x01,0x00,0xfa,0x00,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x00,0x01,0xfd,0xf1,0x00,0x00,0x00,0x01,0xfd,0x8a, +0x00,0x00,0x00,0x01,0xfd,0xa8,0x00,0x00,0x00,0x01,0xfc,0xe0,0x00,0x00,0x00,0x01,0xfe,0x0c,0x00,0x00,0x00,0x01,0xfd,0xee,0x00,0x00,0x00,0x01,0x02,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x02,0xbc,0x0a,0x6a,0x00,0x15,0x61,0x72,0x61,0x62,0x00,0x80,0x62,0x6e,0x67,0x32,0x01,0x3c,0x63,0x79,0x72,0x6c,0x01,0x48,0x64,0x65, +0x76,0x32,0x01,0x70,0x67,0x6a,0x72,0x32,0x01,0xa4,0x67,0x72,0x65,0x6b,0x01,0x7c,0x67,0x75,0x72,0x32,0x01,0xb0,0x68,0x65,0x62,0x72,0x01,0xbc,0x6b,0x68,0x6d,0x72,0x01,0xd8,0x6b,0x6e,0x64,0x32,0x01,0xcc,0x6c,0x61,0x6f,0x20,0x01,0xe4,0x6c,0x61,0x74,0x6e,0x01,0xf0,0x6d,0x6c,0x6d,0x32,0x02,0x46,0x6d,0x6f,0x6e,0x67,0x02,0x52, +0x6d,0x79,0x6d,0x72,0x02,0x5e,0x6f,0x72,0x79,0x32,0x02,0x76,0x74,0x61,0x6c,0x75,0x02,0x6a,0x74,0x65,0x6c,0x32,0x02,0x8e,0x74,0x68,0x61,0x69,0x02,0x9a,0x74,0x69,0x62,0x74,0x02,0xa6,0x74,0x6d,0x6c,0x32,0x02,0x82,0x00,0x3c,0x00,0x05,0x41,0x52,0x41,0x20,0x00,0x22,0x4d,0x4c,0x59,0x20,0x00,0x54,0x4d,0x4f,0x52,0x20,0x00,0x6e, +0x53,0x4e,0x44,0x20,0x00,0x88,0x55,0x52,0x44,0x20,0x00,0xa2,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x04,0x00,0x13,0x00,0x0a,0x00,0x28,0x00,0x2e,0x00,0x3d,0x00,0x4b,0x00,0x51,0x00,0x2f,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x09,0x00,0x05,0x00,0x14,0x00,0x0b,0x00,0x29,0x00,0x3e,0x00,0x4c,0x00,0x52,0x00,0x30,0x00,0x1f,0x00,0x00, +0xff,0xff,0x00,0x0a,0x00,0x06,0x00,0x15,0x00,0x0c,0x00,0x2a,0x00,0x39,0x00,0x3f,0x00,0x4d,0x00,0x53,0x00,0x31,0x00,0x20,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x07,0x00,0x16,0x00,0x0d,0x00,0x2b,0x00,0x3a,0x00,0x40,0x00,0x4e,0x00,0x54,0x00,0x32,0x00,0x21,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x08,0x00,0x17,0x00,0x0e,0x00,0x2c, +0x00,0x3b,0x00,0x41,0x00,0x4f,0x00,0x55,0x00,0x33,0x00,0x22,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x09,0x00,0x18,0x00,0x0f,0x00,0x2d,0x00,0x3c,0x00,0x42,0x00,0x50,0x00,0x56,0x00,0x34,0x00,0x23,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x78,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x19,0x00,0x24, +0x00,0x35,0x00,0x43,0x00,0x47,0x00,0x5c,0x00,0x00,0x00,0x58,0x00,0x60,0x00,0x64,0x00,0x68,0x00,0x6c,0x00,0x70,0x00,0x74,0x00,0x79,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7a,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x1a,0x00,0x25,0x00,0x36,0x00,0x44,0x00,0x48,0x00,0x5d,0x00,0x01,0x00,0x59, +0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x7b,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7c,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x1b,0x00,0x10,0x00,0x57,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01, +0x00,0x7e,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7f,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x80,0x00,0x0a,0x00,0x01,0x54,0x52,0x4b,0x20,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x1c,0x00,0x26,0x00,0x11,0x00,0x37,0x00,0x45,0x00,0x49,0x00,0x5e,0x00,0x02,0x00,0x5a,0x00,0x62,0x00,0x66, +0x00,0x6a,0x00,0x6e,0x00,0x72,0x00,0x76,0x00,0x81,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x1d,0x00,0x27,0x00,0x12,0x00,0x38,0x00,0x46,0x00,0x4a,0x00,0x5f,0x00,0x03,0x00,0x5b,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73,0x00,0x77,0x00,0x82,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x83,0x00,0x04,0x00,0x00, +0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x84,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x85,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x86,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x87,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x88,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff, +0x00,0x01,0x00,0x89,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x8a,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x8b,0x00,0x8c,0x63,0x32,0x73,0x63,0x03,0x4a,0x63,0x32,0x73,0x63,0x03,0x50,0x63,0x32,0x73,0x63,0x03,0x56,0x63,0x32,0x73,0x63,0x03,0x60,0x63,0x61,0x6c,0x74,0x03,0x6a,0x63,0x61,0x6c,0x74, +0x03,0x70,0x63,0x61,0x6c,0x74,0x03,0x76,0x63,0x61,0x6c,0x74,0x03,0x7c,0x63,0x61,0x6c,0x74,0x03,0x82,0x63,0x61,0x6c,0x74,0x03,0x88,0x63,0x63,0x6d,0x70,0x03,0x8e,0x63,0x63,0x6d,0x70,0x03,0x98,0x63,0x63,0x6d,0x70,0x03,0xaa,0x63,0x63,0x6d,0x70,0x03,0xb4,0x63,0x63,0x6d,0x70,0x03,0xbe,0x63,0x63,0x6d,0x70,0x03,0xc8,0x63,0x63, +0x6d,0x70,0x03,0xda,0x63,0x63,0x6d,0x70,0x04,0x0c,0x63,0x63,0x6d,0x70,0x04,0x1a,0x64,0x6c,0x69,0x67,0x04,0x24,0x64,0x6c,0x69,0x67,0x04,0x2a,0x64,0x6c,0x69,0x67,0x04,0x30,0x64,0x6c,0x69,0x67,0x04,0x36,0x64,0x6c,0x69,0x67,0x04,0x3c,0x64,0x6c,0x69,0x67,0x04,0x42,0x64,0x6c,0x69,0x67,0x04,0x48,0x64,0x6c,0x69,0x67,0x04,0x4e, +0x64,0x6c,0x69,0x67,0x04,0x54,0x64,0x6c,0x69,0x67,0x04,0x5a,0x64,0x6c,0x69,0x67,0x04,0x62,0x66,0x69,0x6e,0x61,0x04,0x68,0x66,0x69,0x6e,0x61,0x04,0x6e,0x66,0x69,0x6e,0x61,0x04,0x74,0x66,0x69,0x6e,0x61,0x04,0x7a,0x66,0x69,0x6e,0x61,0x04,0x80,0x66,0x69,0x6e,0x61,0x04,0x86,0x66,0x72,0x61,0x63,0x04,0x8c,0x66,0x72,0x61,0x63, +0x04,0x96,0x66,0x72,0x61,0x63,0x04,0xa0,0x66,0x72,0x61,0x63,0x04,0xaa,0x69,0x6e,0x69,0x74,0x04,0xb4,0x69,0x6e,0x69,0x74,0x04,0xba,0x69,0x6e,0x69,0x74,0x04,0xc0,0x69,0x6e,0x69,0x74,0x04,0xc6,0x69,0x6e,0x69,0x74,0x04,0xcc,0x69,0x6e,0x69,0x74,0x04,0xd2,0x69,0x73,0x6f,0x6c,0x04,0xd8,0x6c,0x69,0x67,0x61,0x04,0xde,0x6c,0x69, +0x67,0x61,0x04,0xe8,0x6c,0x69,0x67,0x61,0x04,0xf2,0x6c,0x69,0x67,0x61,0x04,0xfa,0x6c,0x69,0x67,0x61,0x05,0x04,0x6c,0x69,0x67,0x61,0x05,0x0c,0x6c,0x6e,0x75,0x6d,0x05,0x16,0x6c,0x6e,0x75,0x6d,0x05,0x1e,0x6c,0x6e,0x75,0x6d,0x05,0x26,0x6c,0x6e,0x75,0x6d,0x05,0x2e,0x6c,0x6f,0x63,0x6c,0x05,0x36,0x6c,0x6f,0x63,0x6c,0x05,0x3c, +0x6c,0x6f,0x63,0x6c,0x05,0x42,0x6c,0x6f,0x63,0x6c,0x05,0x48,0x6d,0x65,0x64,0x69,0x05,0x4e,0x6d,0x65,0x64,0x69,0x05,0x54,0x6d,0x65,0x64,0x69,0x05,0x5a,0x6d,0x65,0x64,0x69,0x05,0x60,0x6d,0x65,0x64,0x69,0x05,0x66,0x6d,0x65,0x64,0x69,0x05,0x6c,0x6f,0x6e,0x75,0x6d,0x05,0x72,0x6f,0x6e,0x75,0x6d,0x05,0x7a,0x6f,0x6e,0x75,0x6d, +0x05,0x82,0x6f,0x6e,0x75,0x6d,0x05,0x8a,0x70,0x6e,0x75,0x6d,0x05,0x92,0x70,0x6e,0x75,0x6d,0x05,0x9a,0x70,0x6e,0x75,0x6d,0x05,0xa2,0x70,0x6e,0x75,0x6d,0x05,0xaa,0x72,0x63,0x6c,0x74,0x05,0xb2,0x72,0x63,0x6c,0x74,0x05,0xb8,0x72,0x63,0x6c,0x74,0x05,0xbe,0x72,0x63,0x6c,0x74,0x05,0xc4,0x72,0x63,0x6c,0x74,0x05,0xca,0x72,0x63, +0x6c,0x74,0x05,0xd0,0x72,0x6c,0x69,0x67,0x05,0xd6,0x72,0x6c,0x69,0x67,0x05,0xde,0x72,0x6c,0x69,0x67,0x05,0xe6,0x72,0x6c,0x69,0x67,0x05,0xee,0x72,0x6c,0x69,0x67,0x05,0xf6,0x72,0x6c,0x69,0x67,0x05,0xfe,0x72,0x6c,0x69,0x67,0x06,0x06,0x73,0x61,0x6c,0x74,0x06,0x0c,0x73,0x61,0x6c,0x74,0x06,0x18,0x73,0x61,0x6c,0x74,0x06,0x24, +0x73,0x61,0x6c,0x74,0x06,0x30,0x73,0x6d,0x63,0x70,0x06,0x3c,0x73,0x6d,0x63,0x70,0x06,0x42,0x73,0x6d,0x63,0x70,0x06,0x48,0x73,0x6d,0x63,0x70,0x06,0x54,0x73,0x73,0x30,0x31,0x06,0x60,0x73,0x73,0x30,0x31,0x06,0x66,0x73,0x73,0x30,0x31,0x06,0x6c,0x73,0x73,0x30,0x31,0x06,0x72,0x73,0x73,0x31,0x38,0x06,0x78,0x73,0x73,0x31,0x38, +0x06,0x80,0x73,0x73,0x31,0x38,0x06,0x88,0x73,0x73,0x31,0x38,0x06,0x90,0x73,0x73,0x31,0x39,0x06,0x98,0x73,0x73,0x31,0x39,0x06,0x9e,0x73,0x73,0x31,0x39,0x06,0xa4,0x73,0x73,0x31,0x39,0x06,0xaa,0x73,0x73,0x32,0x30,0x06,0xb0,0x73,0x73,0x32,0x30,0x06,0xba,0x73,0x73,0x32,0x30,0x06,0xc4,0x73,0x73,0x32,0x30,0x06,0xce,0x73,0x75, +0x62,0x73,0x06,0xd8,0x73,0x75,0x62,0x73,0x06,0xde,0x73,0x75,0x62,0x73,0x06,0xe4,0x73,0x75,0x62,0x73,0x06,0xea,0x73,0x75,0x70,0x73,0x06,0xf0,0x73,0x75,0x70,0x73,0x06,0xf6,0x73,0x75,0x70,0x73,0x06,0xfc,0x73,0x75,0x70,0x73,0x07,0x02,0x74,0x6e,0x75,0x6d,0x07,0x08,0x74,0x6e,0x75,0x6d,0x07,0x0e,0x74,0x6e,0x75,0x6d,0x07,0x16, +0x74,0x6e,0x75,0x6d,0x07,0x1c,0x74,0x6e,0x75,0x6d,0x07,0x24,0x74,0x6e,0x75,0x6d,0x07,0x2a,0x74,0x6e,0x75,0x6d,0x07,0x30,0x74,0x6e,0x75,0x6d,0x07,0x36,0x74,0x6e,0x75,0x6d,0x07,0x3c,0x74,0x6e,0x75,0x6d,0x07,0x42,0x74,0x6e,0x75,0x6d,0x07,0x6e,0x74,0x6e,0x75,0x6d,0x07,0x76,0x74,0x6e,0x75,0x6d,0x07,0x7c,0x74,0x6e,0x75,0x6d, +0x07,0x82,0x74,0x6e,0x75,0x6d,0x07,0x8a,0x74,0x6e,0x75,0x6d,0x07,0x90,0x74,0x6e,0x75,0x6d,0x07,0x96,0x74,0x6e,0x75,0x6d,0x07,0x9c,0x74,0x6e,0x75,0x6d,0x07,0xa2,0x74,0x6e,0x75,0x6d,0x07,0xa8,0x00,0x00,0x00,0x01,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x1f,0x00,0x00,0x00,0x03,0x00,0x1d,0x00,0x1f,0x00,0x21,0x00,0x00,0x00,0x03, +0x00,0x1d,0x00,0x1f,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x05,0x00,0x08,0x00,0x09,0x00,0x0a, +0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x05,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x17,0x00,0x4e,0x00,0x4f,0x00,0x50, +0x00,0x51,0x00,0x52,0x00,0x53,0x00,0x54,0x00,0x55,0x00,0x56,0x00,0x57,0x00,0x58,0x00,0x59,0x00,0x5a,0x00,0x5b,0x00,0x5c,0x00,0x5d,0x00,0x5e,0x00,0x5f,0x00,0x60,0x00,0x61,0x00,0x62,0x00,0x63,0x00,0x64,0x00,0x00,0x00,0x05,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x39,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x18,0x00,0x19,0x00,0x1a, +0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x4d,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x26,0x00,0x00, +0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03, +0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x13, +0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x13,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x13,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f, +0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01, +0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00, +0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11, +0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37, +0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x04,0x00,0x1e,0x00,0x20,0x00,0x22,0x00,0x23,0x00,0x00,0x00,0x04,0x00,0x1e,0x00,0x20,0x00,0x22,0x00,0x24,0x00,0x00,0x00,0x01, +0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0x36, +0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1b, +0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x3d,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30, +0x00,0x00,0x00,0x01,0x00,0x3e,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x45,0x00,0x00,0x00,0x14,0x00,0x2d,0x00,0x30,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47, +0x00,0x48,0x00,0x49,0x00,0x4a,0x00,0x4b,0x00,0x4c,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x00,0x01,0x00,0x4a,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x00,0x01,0x00,0x3f,0x00,0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00, +0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x46,0x00,0x84,0x01,0x0a,0x01,0x1a,0x01,0x2a,0x01,0x3a,0x01,0x4a,0x01,0x64,0x01,0x74,0x01,0x84,0x01,0x94,0x01,0xb8,0x01,0xe6,0x02,0x00,0x02,0x1a,0x02,0x2a,0x02,0x44,0x02,0x54,0x02,0x64,0x02,0x74,0x02,0x84,0x02,0x94,0x02,0xa4,0x02,0xb4,0x02,0xc4,0x02,0xd4,0x02,0xf8,0x03,0x08, +0x03,0x18,0x03,0x28,0x03,0x38,0x03,0x48,0x03,0x58,0x03,0x68,0x03,0x78,0x03,0x88,0x03,0x98,0x03,0xa8,0x03,0xb8,0x03,0xc8,0x03,0xd8,0x03,0xe8,0x03,0xf8,0x04,0x08,0x04,0x18,0x04,0x28,0x04,0x38,0x04,0x48,0x04,0x58,0x04,0x68,0x04,0x78,0x04,0x88,0x04,0x98,0x04,0xa8,0x04,0xb8,0x04,0xc8,0x04,0xd8,0x04,0xe8,0x04,0xf8,0x05,0x08, +0x05,0x18,0x05,0x28,0x05,0x38,0x05,0x48,0x05,0x58,0x05,0x68,0x05,0x78,0x05,0x88,0x05,0x98,0x05,0xa8,0x05,0xb8,0x05,0xc8,0x05,0xd8,0x05,0xe8,0x05,0xf8,0x06,0x08,0x06,0x18,0x06,0x28,0x06,0x38,0x06,0x48,0x06,0x58,0x06,0x68,0x06,0x96,0x07,0xbe,0x07,0xce,0x07,0xde,0x07,0xee,0x07,0xfe,0x08,0x0e,0x08,0x1e,0x08,0x2e,0x08,0x3e, +0x08,0x4e,0x08,0x5e,0x08,0x6e,0x08,0x7e,0x08,0x8e,0x09,0x84,0x09,0x94,0x09,0xa4,0x0a,0x72,0x0a,0x82,0x0a,0x92,0x0b,0x06,0x0b,0x98,0x0b,0xa8,0x0b,0xb8,0x0b,0xc8,0x0b,0xd8,0x0b,0xe8,0x0b,0xf8,0x0c,0x08,0x0c,0x18,0x0c,0x28,0x0c,0x38,0x0c,0x48,0x0c,0x58,0x0c,0x68,0x0c,0x78,0x0c,0x88,0x0c,0x98,0x0c,0xa8,0x0c,0xb8,0x0c,0xc8, +0x0c,0xd8,0x0c,0xe8,0x0c,0xf8,0x0d,0x08,0x0d,0x18,0x0d,0x28,0x0d,0x38,0x0d,0x48,0x0d,0x58,0x0d,0x68,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x66,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x80,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01, +0x00,0x00,0x0c,0x7e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x80,0x00,0x07,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00,0x0c,0x92,0x00,0x01,0x00,0x06,0x00,0x00,0x0c,0x98,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x11,0x58,0x00,0x07, +0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x12,0x72,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x12,0x82,0x00,0x07,0x00,0x09,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x12,0xc6,0x00,0x01,0x00,0x06,0x00,0x00,0x12,0xd0,0x00,0x01,0x00,0x06,0x00,0x00, +0x12,0xdc,0x00,0x07,0x00,0x09,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x0a,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x14,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x2e,0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00, +0x13,0x6a,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x74,0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xa2,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xac,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xde,0x00,0x07,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01, +0x00,0x06,0x00,0x00,0x14,0x0e,0x00,0x01,0x00,0x06,0x00,0x00,0x14,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x14,0x44,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x19,0x4e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x1d,0x54,0x00,0x07, +0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x21,0x62,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x21,0xc6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x22,0x68,0x00,0x07, +0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x22,0xa2,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x23,0xcc,0x00,0x07,0x01,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x24,0x5c,0x00,0x01,0x00,0x06,0x00,0x00,0x27,0x74,0x00,0x01,0x00,0x06,0x00,0x00, +0x27,0x80,0x00,0x07,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x2f,0x74,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x2f,0xf6,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x35,0x5a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x36,0xf2,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x06,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x2a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x94,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x37,0xfe,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x38,0x52,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x38,0xa8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3b,0x78,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x3e,0x4c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0x4a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3e,0x48,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3e,0x62,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x3e,0x82,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x3e,0x80,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0x9c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xb0,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x3e,0xc4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xd8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xec,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x3f,0x14,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x28,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x3c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3f,0x50,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x3f,0xf6,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x41,0x0c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x41,0x62,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x42,0x9a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x43,0x42,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0x40,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0x48,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0xd2,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x44,0x5c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x70,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x84,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x98,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x44,0xac,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xc0,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xd4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xe8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x44,0xfc,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x10,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x24,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x38,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x45,0x4c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x60,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x74,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x88,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x45,0x9c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0xb0,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x45,0xc4,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x45,0xcc,0x00,0x07,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26, +0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xd0,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xda,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xe6,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xf2,0x00,0x07,0x00,0x01,0x00,0x1d,0x00,0x40,0x00,0x48,0x00,0x50,0x00,0x58,0x00,0x60,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0, +0x00,0xa8,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x00,0xc8,0x00,0xd0,0x00,0xd8,0x00,0xe0,0x00,0xe8,0x00,0xf0,0x00,0xf8,0x01,0x00,0x01,0x08,0x01,0x10,0x01,0x18,0x01,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x44,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x52,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x62,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x72, +0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x84,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x90,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x9e,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xac,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xbc,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xcc,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xde,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xee, +0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x0c,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x1a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x2a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x3a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x48,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x58,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x6a, +0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x7c,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x9a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xaa,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xba,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xcc,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xde,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xf2, +0x00,0x01,0x00,0x06,0x00,0x00,0x48,0x04,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x48,0xde,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x48,0xdc,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x48,0xe8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08, +0x00,0x01,0x00,0x04,0x00,0x00,0x49,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x49,0x36,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x4a,0xd6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x4b,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08, +0x00,0x01,0x00,0x04,0x00,0x00,0x4b,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x59,0xc8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5a,0x70,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5b,0xe2,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08, +0x00,0x01,0x00,0x04,0x00,0x00,0x5c,0x08,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x5c,0x10,0x00,0x07,0x00,0x01,0x00,0x18,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6, +0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe6,0x00,0xee,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xe0,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xec,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xfa,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x0a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x2a,0x00,0x01, +0x00,0x06,0x00,0x00,0x5c,0x3a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x4c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x60,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x6c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x7a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x9c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xaa,0x00,0x01, +0x00,0x06,0x00,0x00,0x5c,0xb8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xc8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xd8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xea,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xfc,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x10,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x30,0x00,0x01, +0x00,0x06,0x00,0x00,0x5d,0x3e,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x4a,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5e,0x3a,0x00,0x07,0x00,0x01,0x00,0x14,0x00,0x2e,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56, +0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x34,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x42,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x52,0x00,0x01,0x00,0x06, +0x00,0x00,0x5e,0x60,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x70,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x7e,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x8e,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x9c,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xac,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xba,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xca,0x00,0x01,0x00,0x06, +0x00,0x00,0x5e,0xd8,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xe8,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xf6,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x06,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x14,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x32,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x42,0x00,0x07,0x00,0x01, +0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x60,0x46,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x60,0xc4,0x00,0x07,0x00,0x01,0x00,0x0b,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x44,0x00,0x4c,0x00,0x54,0x00,0x5c,0x00,0x64,0x00,0x6c,0x00,0x01,0x00,0x06,0x00,0x00,0x60,0xec, +0x00,0x01,0x00,0x06,0x00,0x00,0x60,0xfc,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x0c,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x1a,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x28,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x36,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x44,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x52,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x60, +0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x6e,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x7c,0x00,0x07,0x00,0x01,0x00,0x0e,0x00,0x22,0x00,0x2a,0x00,0x32,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x62,0x5e,0x00,0x01,0x00,0x06,0x00,0x00, +0x62,0x6a,0x00,0x01,0x00,0x06,0x00,0x00,0x63,0x06,0x00,0x01,0x00,0x06,0x00,0x00,0x63,0x2e,0x00,0x01,0x00,0x06,0x00,0x00,0x64,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x64,0x42,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0x22,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0x36,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0xee,0x00,0x01,0x00,0x06,0x00,0x00, +0x66,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x66,0xb0,0x00,0x01,0x00,0x06,0x00,0x00,0x66,0xe0,0x00,0x01,0x00,0x06,0x00,0x00,0x67,0xd6,0x00,0x01,0x00,0x06,0x00,0x00,0x68,0x00,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x68,0xe2,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x68,0xe0,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x69,0x18,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x69,0x50,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6a,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00, +0x6a,0xc8,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6b,0x84,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6b,0xa8,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6b,0xea,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x6c,0x22,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6c,0xfe,0x00,0x07,0x01,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6d,0xc0,0x00,0x07,0x01,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6d,0xda,0x00,0x07,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x6d,0xf4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x08,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x1a,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00, +0x6e,0x18,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x16,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x2c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6e,0x34,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00, +0x6e,0xb8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6f,0x58,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0xb4,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0xc0,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00, +0x74,0x38,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0x9e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xc6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xea,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00, +0x75,0x1a,0x00,0x02,0x00,0x0e,0x00,0x04,0x0e,0x19,0x0e,0x1f,0x0e,0x63,0x0e,0x64,0x00,0x02,0x00,0x04,0x08,0xf8,0x08,0xf8,0x00,0x00,0x09,0x05,0x09,0x05,0x00,0x01,0x09,0x2d,0x09,0x2d,0x00,0x02,0x0a,0x68,0x0a,0x68,0x00,0x03,0x00,0x02,0x00,0x08,0x00,0x01,0x0a,0x3e,0x00,0x01,0x00,0x01,0x09,0xdd,0x00,0x02,0x00,0x0a,0x00,0x02, +0x0e,0x19,0x0e,0x1f,0x00,0x01,0x00,0x02,0x08,0xf8,0x09,0x05,0x00,0x02,0x00,0x0e,0x00,0x04,0x0a,0x3c,0x08,0xdd,0x0a,0x3d,0x0e,0x15,0x00,0x02,0x00,0x03,0x09,0x53,0x09,0x53,0x00,0x00,0x09,0x55,0x09,0x56,0x00,0x01,0x0e,0x14,0x0e,0x14,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x1e,0x00,0x01,0x04,0xd8,0x00,0x00,0x00,0x00,0x00,0x03, +0x00,0x00,0x00,0x01,0x04,0xca,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x02,0x00,0xc9,0x08,0xc7,0x08,0xca,0x00,0x00,0x08,0xcf,0x08,0xcf,0x00,0x04,0x08,0xd1,0x08,0xd1,0x00,0x05,0x08,0xd3,0x08,0xd3,0x00,0x06,0x08,0xe4,0x08,0xe4,0x00,0x07,0x08,0xe7,0x08,0xe7,0x00,0x08,0x08,0xf1,0x08,0xf3,0x00,0x09,0x08,0xf5,0x08,0xf7, +0x00,0x0c,0x08,0xfa,0x08,0xfb,0x00,0x0f,0x08,0xff,0x09,0x00,0x00,0x11,0x09,0x02,0x09,0x02,0x00,0x13,0x09,0x08,0x09,0x20,0x00,0x14,0x09,0x22,0x09,0x2b,0x00,0x2d,0x09,0x34,0x09,0x35,0x00,0x37,0x09,0x3e,0x09,0x3e,0x00,0x39,0x09,0x40,0x09,0x40,0x00,0x3a,0x09,0x42,0x09,0x43,0x00,0x3b,0x09,0x45,0x09,0x46,0x00,0x3d,0x09,0x48, +0x09,0x48,0x00,0x3f,0x09,0x4a,0x09,0x4b,0x00,0x40,0x09,0x4d,0x09,0x4e,0x00,0x42,0x09,0x59,0x09,0x59,0x00,0x44,0x09,0x5b,0x09,0x5b,0x00,0x45,0x09,0x5d,0x09,0x60,0x00,0x46,0x09,0x63,0x09,0x68,0x00,0x4a,0x09,0x6c,0x09,0x6c,0x00,0x50,0x09,0x72,0x09,0x72,0x00,0x51,0x09,0x7c,0x09,0x7c,0x00,0x52,0x09,0x80,0x09,0x8c,0x00,0x53, +0x09,0x8e,0x09,0x8e,0x00,0x60,0x09,0x90,0x09,0x90,0x00,0x61,0x09,0x92,0x09,0x92,0x00,0x62,0x09,0x94,0x09,0x94,0x00,0x63,0x09,0x96,0x09,0x96,0x00,0x64,0x09,0x98,0x09,0x99,0x00,0x65,0x09,0x9b,0x09,0x9c,0x00,0x67,0x09,0x9e,0x09,0x9f,0x00,0x69,0x09,0xa1,0x09,0xa2,0x00,0x6b,0x09,0xa4,0x09,0xa5,0x00,0x6d,0x09,0xa7,0x09,0xa8, +0x00,0x6f,0x09,0xaa,0x09,0xb9,0x00,0x71,0x09,0xbb,0x09,0xbb,0x00,0x81,0x09,0xbd,0x09,0xbd,0x00,0x82,0x09,0xbf,0x09,0xbf,0x00,0x83,0x09,0xc1,0x09,0xc1,0x00,0x84,0x09,0xc3,0x09,0xc5,0x00,0x85,0x09,0xc8,0x09,0xc9,0x00,0x88,0x09,0xcc,0x09,0xcc,0x00,0x8a,0x09,0xcf,0x09,0xcf,0x00,0x8b,0x09,0xd2,0x09,0xd2,0x00,0x8c,0x09,0xd5, +0x09,0xd7,0x00,0x8d,0x09,0xd9,0x09,0xd9,0x00,0x90,0x09,0xdb,0x09,0xdb,0x00,0x91,0x09,0xdd,0x09,0xdd,0x00,0x92,0x09,0xdf,0x09,0xdf,0x00,0x93,0x09,0xe1,0x09,0xe1,0x00,0x94,0x09,0xe3,0x09,0xe3,0x00,0x95,0x09,0xe5,0x09,0xe5,0x00,0x96,0x09,0xe7,0x09,0xe7,0x00,0x97,0x09,0xe9,0x09,0xe9,0x00,0x98,0x09,0xeb,0x09,0xeb,0x00,0x99, +0x09,0xed,0x09,0xed,0x00,0x9a,0x09,0xef,0x09,0xef,0x00,0x9b,0x09,0xf1,0x09,0xf1,0x00,0x9c,0x09,0xf3,0x09,0xf3,0x00,0x9d,0x09,0xf5,0x09,0xf6,0x00,0x9e,0x09,0xf8,0x09,0xf8,0x00,0xa0,0x09,0xfa,0x09,0xfb,0x00,0xa1,0x09,0xfd,0x0a,0x08,0x00,0xa3,0x0a,0x0a,0x0a,0x0e,0x00,0xaf,0x0a,0x24,0x0a,0x24,0x00,0xb4,0x0a,0x26,0x0a,0x26, +0x00,0xb5,0x0a,0x28,0x0a,0x29,0x00,0xb6,0x0a,0x32,0x0a,0x3b,0x00,0xb8,0x0a,0x3e,0x0a,0x3f,0x00,0xc2,0x0a,0x41,0x0a,0x42,0x00,0xc4,0x0a,0x54,0x0a,0x59,0x00,0xc6,0x0a,0x72,0x0a,0x72,0x00,0xcc,0x0a,0x74,0x0a,0x74,0x00,0xcd,0x0a,0x76,0x0a,0x76,0x00,0xce,0x0a,0x78,0x0a,0x78,0x00,0xcf,0x0a,0x7a,0x0a,0x7a,0x00,0xd0,0x0a,0x7c, +0x0a,0x7c,0x00,0xd1,0x0a,0x7e,0x0a,0x7e,0x00,0xd2,0x0a,0x80,0x0a,0x81,0x00,0xd3,0x0a,0x83,0x0a,0x84,0x00,0xd5,0x0a,0x86,0x0a,0x89,0x00,0xd7,0x0a,0x8b,0x0a,0x8c,0x00,0xdb,0x0a,0x8f,0x0a,0x90,0x00,0xdd,0x0a,0x93,0x0a,0x94,0x00,0xdf,0x0a,0x97,0x0a,0x97,0x00,0xe1,0x0a,0x9a,0x0a,0x9a,0x00,0xe2,0x0a,0x9d,0x0a,0x9d,0x00,0xe3, +0x0a,0xa0,0x0a,0xa0,0x00,0xe4,0x0a,0xa3,0x0a,0xa3,0x00,0xe5,0x0a,0xa6,0x0a,0xa6,0x00,0xe6,0x0a,0xa8,0x0a,0xa8,0x00,0xe7,0x0a,0xaa,0x0a,0xaa,0x00,0xe8,0x0a,0xac,0x0a,0xac,0x00,0xe9,0x0a,0xae,0x0a,0xae,0x00,0xea,0x0a,0xb0,0x0a,0xb1,0x00,0xeb,0x0a,0xb4,0x0a,0xb6,0x00,0xed,0x0a,0xb9,0x0a,0xba,0x00,0xf0,0x0b,0x0c,0x0b,0x1a, +0x00,0xf2,0x0e,0x20,0x0e,0x21,0x01,0x01,0x0e,0x24,0x0e,0x24,0x01,0x03,0x0e,0x26,0x0e,0x26,0x01,0x04,0x0e,0x28,0x0e,0x28,0x01,0x05,0x0e,0x2a,0x0e,0x2a,0x01,0x06,0x0e,0x2f,0x0e,0x31,0x01,0x07,0x0e,0x33,0x0e,0x33,0x01,0x0a,0x0e,0x35,0x0e,0x35,0x01,0x0b,0x0e,0x37,0x0e,0x37,0x01,0x0c,0x0e,0x39,0x0e,0x39,0x01,0x0d,0x0e,0x3c, +0x0e,0x3c,0x01,0x0e,0x0e,0x3f,0x0e,0x40,0x01,0x0f,0x0e,0x43,0x0e,0x44,0x01,0x11,0x0e,0x47,0x0e,0x48,0x01,0x13,0x0e,0x4b,0x0e,0x4c,0x01,0x15,0x0e,0x4f,0x0e,0x50,0x01,0x17,0x0e,0x53,0x0e,0x55,0x01,0x19,0x0e,0x57,0x0e,0x57,0x01,0x1c,0x0e,0x59,0x0e,0x59,0x01,0x1d,0x0e,0x5e,0x0e,0x5e,0x01,0x1e,0x0e,0x6e,0x0e,0x6e,0x01,0x1f, +0x0e,0x70,0x0e,0x70,0x01,0x20,0x0e,0x74,0x0e,0x75,0x01,0x21,0x0e,0x78,0x0e,0x78,0x01,0x23,0x0e,0x7a,0x0e,0x7a,0x01,0x24,0x0e,0x7c,0x0e,0x7c,0x01,0x25,0x0e,0x7e,0x0e,0x7e,0x01,0x26,0x0e,0x80,0x0e,0x80,0x01,0x27,0x0e,0x82,0x0e,0x82,0x01,0x28,0x0e,0x84,0x0e,0x84,0x01,0x29,0x0e,0x86,0x0e,0x86,0x01,0x2a,0x0e,0x8f,0x0e,0x98, +0x01,0x2b,0x0e,0x9a,0x0e,0x9a,0x01,0x35,0x0e,0x9c,0x0e,0x9c,0x01,0x36,0x0e,0x9e,0x0e,0x9e,0x01,0x37,0x0e,0xa0,0x0e,0xa0,0x01,0x38,0x0e,0xa2,0x0e,0xa2,0x01,0x39,0x0e,0xa5,0x0e,0xab,0x01,0x3a,0x0e,0xae,0x0e,0xae,0x01,0x41,0x0e,0xb1,0x0e,0xb1,0x01,0x42,0x0e,0xb3,0x0e,0xb3,0x01,0x43,0x0e,0xb5,0x0e,0xb5,0x01,0x44,0x0e,0xb7, +0x0e,0xb7,0x01,0x45,0x0e,0xb9,0x0e,0xb9,0x01,0x46,0x0e,0xbb,0x0e,0xbb,0x01,0x47,0x0e,0xbd,0x0e,0xbd,0x01,0x48,0x0e,0xbf,0x0e,0xbf,0x01,0x49,0x0e,0xc1,0x0e,0xc1,0x01,0x4a,0x0e,0xc3,0x0e,0xc3,0x01,0x4b,0x0e,0xc5,0x0e,0xc5,0x01,0x4c,0x0e,0xc7,0x0e,0xc7,0x01,0x4d,0x0e,0xc9,0x0e,0xcd,0x01,0x4e,0x0e,0xcf,0x0e,0xd0,0x01,0x53, +0x0e,0xd3,0x0e,0xd3,0x01,0x55,0x0e,0xd5,0x0e,0xd5,0x01,0x56,0x0e,0xda,0x0e,0xe3,0x01,0x57,0x0e,0xe6,0x0e,0xe6,0x01,0x61,0x0e,0xec,0x0e,0xec,0x01,0x62,0x0e,0xee,0x0e,0xee,0x01,0x63,0x0e,0xf0,0x0e,0xf0,0x01,0x64,0x0e,0xf2,0x0e,0xf2,0x01,0x65,0x0e,0xf4,0x0e,0xf4,0x01,0x66,0x0e,0xf6,0x0e,0xf6,0x01,0x67,0x0e,0xf8,0x0e,0xf8, +0x01,0x68,0x0e,0xfa,0x0e,0xfa,0x01,0x69,0x0e,0xfc,0x0e,0xfc,0x01,0x6a,0x0f,0x00,0x0f,0x03,0x01,0x6b,0x0f,0x05,0x0f,0x0a,0x01,0x6f,0x0f,0x0c,0x0f,0x0c,0x01,0x75,0x0f,0x0e,0x0f,0x0e,0x01,0x76,0x0f,0x10,0x0f,0x10,0x01,0x77,0x0f,0x12,0x0f,0x12,0x01,0x78,0x0f,0x14,0x0f,0x14,0x01,0x79,0x0f,0x16,0x0f,0x17,0x01,0x7a,0x0f,0x1a, +0x0f,0x1b,0x01,0x7c,0x0f,0x1e,0x0f,0x1f,0x01,0x7e,0x0f,0x22,0x0f,0x25,0x01,0x80,0x0f,0x28,0x0f,0x2d,0x01,0x84,0x0f,0x30,0x0f,0x31,0x01,0x8a,0x0f,0x34,0x0f,0x35,0x01,0x8c,0x0f,0x38,0x0f,0x41,0x01,0x8e,0x0f,0x44,0x0f,0x45,0x01,0x98,0x0f,0x48,0x0f,0x49,0x01,0x9a,0x0f,0x4c,0x0f,0x4d,0x01,0x9c,0x0f,0x62,0x0f,0x6b,0x01,0x9e, +0x0f,0x98,0x0f,0xa4,0x01,0xa8,0x0f,0xa6,0x0f,0xb3,0x01,0xb5,0x0f,0xb5,0x0f,0xbc,0x01,0xc3,0x14,0x55,0x14,0x5c,0x01,0xcb,0x14,0x73,0x14,0x73,0x01,0xd3,0x14,0x76,0x14,0x76,0x01,0xd4,0x14,0x79,0x14,0x79,0x01,0xd5,0x14,0x7d,0x14,0x7e,0x01,0xd6,0x14,0x81,0x14,0x81,0x01,0xd8,0x14,0x84,0x14,0x84,0x01,0xd9,0x14,0x87,0x14,0x87, +0x01,0xda,0x14,0xad,0x14,0xae,0x01,0xdb,0x00,0x01,0x00,0x01,0x09,0x28,0x00,0x01,0x01,0x0e,0x00,0x0c,0x00,0x1e,0x00,0x30,0x00,0x42,0x00,0x4c,0x00,0x5e,0x00,0x70,0x00,0x7a,0x00,0xb4,0x00,0xbe,0x00,0xd0,0x00,0xf2,0x01,0x04,0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x62,0x00,0x02,0x09,0x32,0x0e,0x69,0x00,0x02,0x09,0x7e,0x00,0x02, +0x00,0x06,0x00,0x0c,0x0a,0x68,0x00,0x02,0x09,0x32,0x0e,0x66,0x00,0x02,0x09,0x7e,0x00,0x01,0x00,0x04,0x0e,0x6b,0x00,0x02,0x09,0x7f,0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x65,0x00,0x02,0x09,0x32,0x0e,0x67,0x00,0x02,0x09,0x7e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x66,0x00,0x02,0x09,0x32,0x0e,0x68,0x00,0x02,0x09,0x7e,0x00,0x01, +0x00,0x04,0x0e,0x6c,0x00,0x02,0x09,0x7f,0x00,0x07,0x00,0x10,0x00,0x16,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x2e,0x00,0x34,0x0a,0x65,0x00,0x02,0x09,0x2f,0x0a,0x66,0x00,0x02,0x09,0x30,0x0a,0x68,0x00,0x02,0x09,0x2d,0x0e,0x62,0x00,0x02,0x09,0x2c,0x0e,0x64,0x00,0x02,0x0e,0x63,0x0e,0x65,0x00,0x02,0x09,0x73,0x13,0xe9,0x00,0x02, +0x09,0x73,0x00,0x01,0x00,0x04,0x0e,0x6a,0x00,0x02,0x09,0x7e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x65,0x00,0x02,0x09,0x32,0x13,0xe9,0x00,0x02,0x09,0x32,0x00,0x04,0x00,0x0a,0x00,0x10,0x00,0x16,0x00,0x1c,0x0e,0x66,0x00,0x02,0x09,0x2d,0x0e,0x67,0x00,0x02,0x09,0x2f,0x0e,0x68,0x00,0x02,0x09,0x30,0x0e,0x6a,0x00,0x02,0x09,0x33, +0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x6b,0x00,0x02,0x09,0x2e,0x0e,0x6c,0x00,0x02,0x09,0x31,0x00,0x01,0x00,0x04,0x0e,0x64,0x00,0x02,0x09,0x32,0x00,0x02,0x00,0x04,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x73,0x09,0x73,0x00,0x08,0x09,0x7e,0x09,0x7f,0x00,0x09,0x0e,0x63,0x0e,0x63,0x00,0x0b,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x08, +0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x67,0x00,0x02,0x09,0x31,0x0a,0x69,0x00,0x02,0x09,0x2e,0x00,0x01,0x00,0x01,0x09,0x32,0x00,0x01,0x00,0x52,0x00,0x01,0x00,0x08,0x00,0x09,0x00,0x14,0x00,0x1a,0x00,0x20,0x00,0x26,0x00,0x2c,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x11,0x9a,0x00,0x02,0x08,0xd8,0x11,0x9b,0x00,0x02,0x08,0xd9, +0x11,0x9c,0x00,0x02,0x08,0xda,0x11,0x9d,0x00,0x02,0x08,0xdb,0x11,0x9e,0x00,0x02,0x08,0xdc,0x11,0x9f,0x00,0x02,0x08,0xdd,0x11,0xa0,0x00,0x02,0x08,0xde,0x11,0xa1,0x00,0x02,0x08,0xdf,0x11,0xa2,0x00,0x02,0x08,0xe0,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x00, +0x00,0x67,0x00,0x03,0x00,0x02,0x00,0x48,0x00,0x52,0x00,0x01,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x03,0x00,0x03,0x00,0x34,0x00,0x34,0x00,0x3e,0x00,0x01,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x01,0x00,0x02,0x0a,0x14,0x14,0x6b,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f, +0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x6a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x03,0x00,0x02,0x00,0x6e,0x00,0x42,0x00,0x01,0x00,0x58,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68, +0x00,0x03,0x00,0x03,0x00,0x5a,0x00,0x5a,0x00,0x2e,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x03,0x00,0x04,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x18,0x00,0x01,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x00,0x03,0x0a,0x44,0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45, +0x13,0x45,0x00,0x02,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x26,0x00,0x01,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x03,0x00,0x02,0x00,0x30,0x00,0x3a,0x00,0x01, +0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x01,0x0a,0x45,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x14,0x9a,0x00,0x03,0x00,0x01,0x00,0x26,0x00,0x01,0x00,0x2e, +0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x03,0x00,0x02,0x00,0x32,0x00,0x3c,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x01,0x00,0x02,0x0a,0x45,0x0a,0x46,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e, +0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x14,0x9a,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x24,0x00,0x01,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x02,0x00,0x02,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x53,0x09,0x55,0x00,0x0a,0x00,0x01,0x00,0x02,0x14,0x03,0x14,0x2b,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00, +0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x2e,0x00,0x2e,0x00,0x2e,0x00,0x2e,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x02,0x00,0x03,0x0a,0x44, +0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45,0x13,0x45,0x00,0x02,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x02,0x01,0xc8,0x00,0xe1,0x08,0xf2,0x08,0xc9,0x08,0xc8,0x0e,0x24,0x08,0xca,0x09,0x02,0x08,0xc7,0x0e,0x26,0x08,0xf6,0x0e,0x28,0x0e,0x2a,0x08,0xcf,0x08,0xd1,0x08,0xd3,0x0e,0x2f,0x0e,0x30, +0x0b,0x0c,0x0b,0x0d,0x0e,0x31,0x0e,0x33,0x0e,0x35,0x0e,0x37,0x0e,0x39,0x0e,0x3c,0x08,0xe4,0x08,0xe7,0x0e,0x53,0x0e,0x54,0x0e,0x55,0x09,0x59,0x0e,0x57,0x0e,0x59,0x08,0xf3,0x0e,0x5e,0x08,0xf7,0x08,0xf5,0x0e,0x6e,0x0e,0x82,0x09,0x43,0x0b,0x0e,0x0e,0xb1,0x0e,0xbd,0x09,0x4b,0x09,0x4d,0x0e,0x78,0x0e,0x8f,0x0b,0x0f,0x0e,0xcf, +0x09,0x72,0x0e,0xda,0x0e,0xdb,0x09,0x66,0x09,0x68,0x0e,0xa8,0x0e,0x70,0x09,0x81,0x09,0x83,0x09,0x85,0x09,0x87,0x0e,0x74,0x0e,0x75,0x09,0x8b,0x0e,0x7a,0x0e,0x7c,0x0e,0x7e,0x0e,0x80,0x0e,0x84,0x0e,0x86,0x09,0x99,0x09,0x9c,0x09,0x9f,0x09,0xa2,0x09,0xa5,0x09,0xa8,0x0e,0x90,0x0e,0x91,0x0e,0x92,0x0e,0x93,0x0e,0x94,0x0e,0x95, +0x0e,0x96,0x0e,0x97,0x0b,0x10,0x0b,0x11,0x0b,0x12,0x0b,0x13,0x0b,0x14,0x0b,0x15,0x0b,0x16,0x0e,0x98,0x0e,0x9a,0x0e,0x9c,0x0e,0x9e,0x0e,0xa0,0x0e,0xa2,0x09,0xc5,0x0e,0xa5,0x0e,0xa6,0x0e,0xa7,0x0e,0xa9,0x0e,0xaa,0x0e,0xab,0x0e,0xae,0x0e,0xb3,0x0e,0xb5,0x0e,0xb7,0x0e,0xb9,0x0e,0xbb,0x0e,0xbf,0x0e,0xc1,0x0e,0xc3,0x0e,0xc5, +0x0e,0xc7,0x0e,0xc9,0x0e,0xca,0x0e,0xcb,0x0e,0xcc,0x0e,0xcd,0x0e,0xd0,0x0e,0xd3,0x0e,0xd5,0x09,0xfb,0x0e,0xdc,0x0e,0xdd,0x0e,0xde,0x0e,0xdf,0x0e,0xe0,0x0e,0xe1,0x0e,0xe2,0x0e,0xe3,0x0a,0x06,0x0a,0x08,0x0e,0xe6,0x0a,0x0c,0x0a,0x0e,0x0e,0xec,0x0e,0xee,0x0a,0x29,0x0a,0x3f,0x0a,0x55,0x0a,0x57,0x0a,0x59,0x0e,0xf0,0x0e,0xf2, +0x0e,0xf4,0x0e,0xf6,0x0e,0xf8,0x0e,0xfa,0x0e,0xfc,0x0a,0x81,0x0a,0x84,0x0f,0x00,0x0f,0x01,0x0f,0x02,0x0f,0x03,0x0a,0x8c,0x0a,0x90,0x0a,0x94,0x0f,0x05,0x0f,0x06,0x0f,0x07,0x0f,0x08,0x0f,0x09,0x0f,0x0a,0x0f,0x0c,0x0f,0x0e,0x0f,0x10,0x0f,0x12,0x0a,0xb1,0x0b,0x17,0x0b,0x18,0x0f,0x14,0x0b,0x1a,0x0e,0x21,0x0e,0x40,0x0e,0x44, +0x0e,0x48,0x0e,0x4c,0x0e,0x50,0x0f,0x17,0x0f,0x1b,0x0f,0x1f,0x0f,0x23,0x0f,0x25,0x0f,0x29,0x0f,0x2b,0x0f,0x2d,0x0f,0x31,0x0f,0x35,0x0f,0x39,0x0f,0x3b,0x0f,0x3d,0x0f,0x3f,0x0f,0x41,0x0f,0x45,0x0f,0x49,0x0f,0x4d,0x13,0x00,0x13,0x05,0x13,0x0b,0x13,0x0f,0x13,0x13,0x13,0x17,0x13,0x1b,0x13,0x1f,0x13,0x23,0x13,0x25,0x13,0x27, +0x13,0x29,0x14,0x07,0x14,0x0a,0x14,0x0e,0x14,0x12,0x14,0x14,0x14,0x16,0x14,0x6d,0x14,0x70,0x14,0x73,0x14,0x76,0x14,0x79,0x14,0x7d,0x14,0x7e,0x14,0x81,0x14,0x84,0x14,0x87,0x00,0x02,0x00,0x8d,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x08,0x09,0x20,0x00,0x01,0x09,0x22,0x09,0x2b,0x00,0x1a,0x09,0x3e,0x09,0x3e,0x00,0x24,0x09,0x40, +0x09,0x40,0x00,0x25,0x09,0x42,0x09,0x42,0x00,0x26,0x09,0x45,0x09,0x46,0x00,0x27,0x09,0x48,0x09,0x48,0x00,0x29,0x09,0x4a,0x09,0x4a,0x00,0x2a,0x09,0x4e,0x09,0x4e,0x00,0x2b,0x09,0x5b,0x09,0x5b,0x00,0x2c,0x09,0x5d,0x09,0x60,0x00,0x2d,0x09,0x63,0x09,0x65,0x00,0x31,0x09,0x67,0x09,0x67,0x00,0x34,0x09,0x6c,0x09,0x6c,0x00,0x35, +0x09,0x7c,0x09,0x7c,0x00,0x36,0x09,0x80,0x09,0x80,0x00,0x37,0x09,0x82,0x09,0x82,0x00,0x38,0x09,0x84,0x09,0x84,0x00,0x39,0x09,0x86,0x09,0x86,0x00,0x3a,0x09,0x88,0x09,0x8a,0x00,0x3b,0x09,0x8c,0x09,0x8c,0x00,0x3e,0x09,0x8e,0x09,0x8e,0x00,0x3f,0x09,0x90,0x09,0x90,0x00,0x40,0x09,0x92,0x09,0x92,0x00,0x41,0x09,0x94,0x09,0x94, +0x00,0x42,0x09,0x96,0x09,0x96,0x00,0x43,0x09,0x98,0x09,0x98,0x00,0x44,0x09,0x9b,0x09,0x9b,0x00,0x45,0x09,0x9e,0x09,0x9e,0x00,0x46,0x09,0xa1,0x09,0xa1,0x00,0x47,0x09,0xa4,0x09,0xa4,0x00,0x48,0x09,0xa7,0x09,0xa7,0x00,0x49,0x09,0xaa,0x09,0xb9,0x00,0x4a,0x09,0xbb,0x09,0xbb,0x00,0x5a,0x09,0xbd,0x09,0xbd,0x00,0x5b,0x09,0xbf, +0x09,0xbf,0x00,0x5c,0x09,0xc1,0x09,0xc1,0x00,0x5d,0x09,0xc3,0x09,0xc4,0x00,0x5e,0x09,0xc8,0x09,0xc9,0x00,0x60,0x09,0xcc,0x09,0xcc,0x00,0x62,0x09,0xcf,0x09,0xcf,0x00,0x63,0x09,0xd2,0x09,0xd2,0x00,0x64,0x09,0xd5,0x09,0xd7,0x00,0x65,0x09,0xd9,0x09,0xd9,0x00,0x68,0x09,0xdb,0x09,0xdb,0x00,0x69,0x09,0xdd,0x09,0xdd,0x00,0x6a, +0x09,0xdf,0x09,0xdf,0x00,0x6b,0x09,0xe1,0x09,0xe1,0x00,0x6c,0x09,0xe3,0x09,0xe3,0x00,0x6d,0x09,0xe5,0x09,0xe5,0x00,0x6e,0x09,0xe7,0x09,0xe7,0x00,0x6f,0x09,0xe9,0x09,0xe9,0x00,0x70,0x09,0xeb,0x09,0xeb,0x00,0x71,0x09,0xed,0x09,0xed,0x00,0x72,0x09,0xef,0x09,0xef,0x00,0x73,0x09,0xf1,0x09,0xf1,0x00,0x74,0x09,0xf3,0x09,0xf3, +0x00,0x75,0x09,0xf5,0x09,0xf6,0x00,0x76,0x09,0xf8,0x09,0xf8,0x00,0x78,0x09,0xfa,0x09,0xfa,0x00,0x79,0x09,0xfd,0x0a,0x05,0x00,0x7a,0x0a,0x07,0x0a,0x07,0x00,0x83,0x0a,0x0a,0x0a,0x0b,0x00,0x84,0x0a,0x0d,0x0a,0x0d,0x00,0x86,0x0a,0x24,0x0a,0x24,0x00,0x87,0x0a,0x26,0x0a,0x26,0x00,0x88,0x0a,0x28,0x0a,0x28,0x00,0x89,0x0a,0x3e, +0x0a,0x3e,0x00,0x8a,0x0a,0x54,0x0a,0x54,0x00,0x8b,0x0a,0x56,0x0a,0x56,0x00,0x8c,0x0a,0x58,0x0a,0x58,0x00,0x8d,0x0a,0x72,0x0a,0x72,0x00,0x8e,0x0a,0x74,0x0a,0x74,0x00,0x8f,0x0a,0x76,0x0a,0x76,0x00,0x90,0x0a,0x78,0x0a,0x78,0x00,0x91,0x0a,0x7a,0x0a,0x7a,0x00,0x92,0x0a,0x7c,0x0a,0x7c,0x00,0x93,0x0a,0x7e,0x0a,0x7e,0x00,0x94, +0x0a,0x80,0x0a,0x80,0x00,0x95,0x0a,0x83,0x0a,0x83,0x00,0x96,0x0a,0x86,0x0a,0x89,0x00,0x97,0x0a,0x8b,0x0a,0x8b,0x00,0x9b,0x0a,0x8f,0x0a,0x8f,0x00,0x9c,0x0a,0x93,0x0a,0x93,0x00,0x9d,0x0a,0x97,0x0a,0x97,0x00,0x9e,0x0a,0x9a,0x0a,0x9a,0x00,0x9f,0x0a,0x9d,0x0a,0x9d,0x00,0xa0,0x0a,0xa0,0x0a,0xa0,0x00,0xa1,0x0a,0xa3,0x0a,0xa3, +0x00,0xa2,0x0a,0xa6,0x0a,0xa6,0x00,0xa3,0x0a,0xa8,0x0a,0xa8,0x00,0xa4,0x0a,0xaa,0x0a,0xaa,0x00,0xa5,0x0a,0xac,0x0a,0xac,0x00,0xa6,0x0a,0xae,0x0a,0xae,0x00,0xa7,0x0a,0xb0,0x0a,0xb0,0x00,0xa8,0x0a,0xb4,0x0a,0xb6,0x00,0xa9,0x0b,0x19,0x0b,0x19,0x00,0xac,0x0e,0x20,0x0e,0x20,0x00,0xad,0x0e,0x3f,0x0e,0x3f,0x00,0xae,0x0e,0x43, +0x0e,0x43,0x00,0xaf,0x0e,0x47,0x0e,0x47,0x00,0xb0,0x0e,0x4b,0x0e,0x4b,0x00,0xb1,0x0e,0x4f,0x0e,0x4f,0x00,0xb2,0x0f,0x16,0x0f,0x16,0x00,0xb3,0x0f,0x1a,0x0f,0x1a,0x00,0xb4,0x0f,0x1e,0x0f,0x1e,0x00,0xb5,0x0f,0x22,0x0f,0x22,0x00,0xb6,0x0f,0x24,0x0f,0x24,0x00,0xb7,0x0f,0x28,0x0f,0x28,0x00,0xb8,0x0f,0x2a,0x0f,0x2a,0x00,0xb9, +0x0f,0x2c,0x0f,0x2c,0x00,0xba,0x0f,0x30,0x0f,0x30,0x00,0xbb,0x0f,0x34,0x0f,0x34,0x00,0xbc,0x0f,0x38,0x0f,0x38,0x00,0xbd,0x0f,0x3a,0x0f,0x3a,0x00,0xbe,0x0f,0x3c,0x0f,0x3c,0x00,0xbf,0x0f,0x3e,0x0f,0x3e,0x00,0xc0,0x0f,0x40,0x0f,0x40,0x00,0xc1,0x0f,0x44,0x0f,0x44,0x00,0xc2,0x0f,0x48,0x0f,0x48,0x00,0xc3,0x0f,0x4c,0x0f,0x4c, +0x00,0xc4,0x13,0x02,0x13,0x02,0x00,0xc5,0x13,0x04,0x13,0x04,0x00,0xc6,0x13,0x08,0x13,0x08,0x00,0xc7,0x13,0x0c,0x13,0x0c,0x00,0xc8,0x13,0x10,0x13,0x10,0x00,0xc9,0x13,0x14,0x13,0x14,0x00,0xca,0x13,0x18,0x13,0x18,0x00,0xcb,0x13,0x1c,0x13,0x1c,0x00,0xcc,0x13,0x20,0x13,0x20,0x00,0xcd,0x13,0x24,0x13,0x24,0x00,0xce,0x13,0x26, +0x13,0x26,0x00,0xcf,0x13,0x28,0x13,0x28,0x00,0xd0,0x14,0x04,0x14,0x04,0x00,0xd1,0x14,0x09,0x14,0x09,0x00,0xd2,0x14,0x0b,0x14,0x0b,0x00,0xd3,0x14,0x0f,0x14,0x0f,0x00,0xd4,0x14,0x13,0x14,0x13,0x00,0xd5,0x14,0x15,0x14,0x15,0x00,0xd6,0x14,0x53,0x14,0x5c,0x00,0xd7,0x00,0x02,0x01,0x36,0x00,0x98,0x0e,0xd8,0x0e,0x25,0x0e,0x27, +0x0e,0x29,0x0e,0x2b,0x0e,0x2c,0x0e,0x2d,0x0e,0x2e,0x0e,0x32,0x0e,0x34,0x0e,0x36,0x0e,0x38,0x0e,0x3b,0x0e,0x3e,0x08,0xe3,0x08,0xe6,0x08,0xe9,0x08,0xec,0x0e,0x56,0x09,0x3f,0x0e,0x58,0x0e,0x5a,0x0e,0x5d,0x0e,0x60,0x0e,0x61,0x09,0x3b,0x0e,0x83,0x0e,0x8d,0x0e,0xb2,0x0e,0xbe,0x0e,0xe4,0x0e,0x79,0x09,0x62,0x09,0x6e,0x0e,0x72, +0x0e,0x77,0x0e,0x7b,0x0e,0x7d,0x0e,0x7f,0x0e,0x81,0x0e,0x85,0x0e,0x87,0x0e,0x88,0x0e,0x89,0x0e,0x8a,0x0e,0x8b,0x0e,0x8c,0x0e,0x8e,0x0e,0x99,0x0e,0x9b,0x0e,0x9d,0x0e,0x9f,0x0e,0xa1,0x0e,0xa4,0x09,0xc7,0x09,0x3d,0x09,0xcb,0x09,0xce,0x09,0xd1,0x09,0xd4,0x0e,0xad,0x0e,0xb0,0x0e,0xb4,0x0e,0xb6,0x0e,0xb8,0x0e,0xba,0x0e,0xbc, +0x0e,0xc0,0x0e,0xc2,0x0e,0xc4,0x0e,0xc6,0x0e,0xc8,0x0a,0x5f,0x0a,0x60,0x0a,0x61,0x0a,0x62,0x0e,0xce,0x0e,0xd2,0x0e,0xd4,0x0e,0xd6,0x0e,0xd9,0x0e,0xe5,0x0e,0xe8,0x0e,0xea,0x0e,0xed,0x0e,0xef,0x0a,0x2b,0x0e,0xba,0x0a,0x5b,0x0e,0xf1,0x0e,0xf3,0x0e,0xf5,0x0e,0xf7,0x0e,0xf9,0x0e,0xfb,0x0e,0xfd,0x0e,0xfe,0x0e,0xff,0x0f,0x04, +0x0a,0x8e,0x0a,0x92,0x0a,0x96,0x0a,0x99,0x0a,0x9c,0x0a,0x9f,0x0a,0xa2,0x0a,0xa5,0x0f,0x0b,0x0f,0x0d,0x0f,0x0f,0x0f,0x11,0x0f,0x13,0x0a,0xb3,0x0f,0x15,0x0e,0x23,0x0e,0x42,0x0e,0x46,0x0e,0x4a,0x0e,0x4e,0x0e,0x52,0x0f,0x19,0x0f,0x1d,0x0f,0x21,0x0f,0x27,0x0f,0x2f,0x0f,0x33,0x0f,0x37,0x0f,0x43,0x0f,0x47,0x0f,0x4b,0x0f,0x4f, +0x13,0x01,0x13,0x07,0x13,0x0a,0x13,0x0e,0x13,0x12,0x13,0x16,0x13,0x1a,0x13,0x1e,0x13,0x22,0x14,0x06,0x14,0x0d,0x14,0x11,0x14,0x6e,0x14,0x71,0x14,0x74,0x14,0x77,0x14,0x7a,0x14,0x7f,0x14,0x82,0x14,0x85,0x0e,0x5a,0x00,0x02,0x00,0x7a,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x0c,0x09,0x0c,0x00,0x01,0x09,0x0e,0x09,0x0e,0x00,0x02, +0x09,0x10,0x09,0x14,0x00,0x03,0x09,0x19,0x09,0x20,0x00,0x08,0x09,0x22,0x09,0x28,0x00,0x10,0x09,0x2a,0x09,0x2b,0x00,0x17,0x09,0x3e,0x09,0x3e,0x00,0x19,0x09,0x40,0x09,0x40,0x00,0x1a,0x09,0x42,0x09,0x42,0x00,0x1b,0x09,0x46,0x09,0x46,0x00,0x1c,0x09,0x48,0x09,0x48,0x00,0x1d,0x09,0x4a,0x09,0x4a,0x00,0x1e,0x09,0x5b,0x09,0x5b, +0x00,0x1f,0x09,0x60,0x09,0x60,0x00,0x20,0x09,0x6c,0x09,0x6c,0x00,0x21,0x09,0x7c,0x09,0x7c,0x00,0x22,0x09,0x8a,0x09,0x8a,0x00,0x23,0x09,0x8c,0x09,0x8c,0x00,0x24,0x09,0x8e,0x09,0x8e,0x00,0x25,0x09,0x90,0x09,0x90,0x00,0x26,0x09,0x92,0x09,0x92,0x00,0x27,0x09,0x94,0x09,0x94,0x00,0x28,0x09,0x96,0x09,0x96,0x00,0x29,0x09,0x98, +0x09,0x98,0x00,0x2a,0x09,0x9b,0x09,0x9b,0x00,0x2b,0x09,0x9e,0x09,0x9e,0x00,0x2c,0x09,0xa1,0x09,0xa1,0x00,0x2d,0x09,0xa4,0x09,0xa4,0x00,0x2e,0x09,0xa7,0x09,0xa7,0x00,0x2f,0x09,0xb9,0x09,0xb9,0x00,0x30,0x09,0xbb,0x09,0xbb,0x00,0x31,0x09,0xbd,0x09,0xbd,0x00,0x32,0x09,0xbf,0x09,0xbf,0x00,0x33,0x09,0xc1,0x09,0xc1,0x00,0x34, +0x09,0xc3,0x09,0xc4,0x00,0x35,0x09,0xc8,0x09,0xc9,0x00,0x37,0x09,0xcc,0x09,0xcc,0x00,0x39,0x09,0xcf,0x09,0xcf,0x00,0x3a,0x09,0xd2,0x09,0xd2,0x00,0x3b,0x09,0xd5,0x09,0xd7,0x00,0x3c,0x09,0xd9,0x09,0xd9,0x00,0x3f,0x09,0xdb,0x09,0xdb,0x00,0x40,0x09,0xdd,0x09,0xdd,0x00,0x41,0x09,0xdf,0x09,0xdf,0x00,0x42,0x09,0xe1,0x09,0xe1, +0x00,0x43,0x09,0xe3,0x09,0xe3,0x00,0x44,0x09,0xe5,0x09,0xe5,0x00,0x45,0x09,0xe7,0x09,0xe7,0x00,0x46,0x09,0xe9,0x09,0xe9,0x00,0x47,0x09,0xeb,0x09,0xeb,0x00,0x48,0x09,0xed,0x09,0xed,0x00,0x49,0x09,0xef,0x09,0xef,0x00,0x4a,0x09,0xf1,0x09,0xf1,0x00,0x4b,0x09,0xf3,0x09,0xf3,0x00,0x4c,0x09,0xf5,0x09,0xf6,0x00,0x4d,0x09,0xf8, +0x09,0xf8,0x00,0x4f,0x09,0xfa,0x09,0xfa,0x00,0x50,0x0a,0x07,0x0a,0x07,0x00,0x51,0x0a,0x0b,0x0a,0x0b,0x00,0x52,0x0a,0x0d,0x0a,0x0d,0x00,0x53,0x0a,0x24,0x0a,0x24,0x00,0x54,0x0a,0x26,0x0a,0x26,0x00,0x55,0x0a,0x28,0x0a,0x28,0x00,0x56,0x0a,0x3e,0x0a,0x3e,0x00,0x57,0x0a,0x58,0x0a,0x58,0x00,0x58,0x0a,0x72,0x0a,0x72,0x00,0x59, +0x0a,0x74,0x0a,0x74,0x00,0x5a,0x0a,0x76,0x0a,0x76,0x00,0x5b,0x0a,0x78,0x0a,0x78,0x00,0x5c,0x0a,0x7a,0x0a,0x7a,0x00,0x5d,0x0a,0x7c,0x0a,0x7c,0x00,0x5e,0x0a,0x7e,0x0a,0x7e,0x00,0x5f,0x0a,0x80,0x0a,0x80,0x00,0x60,0x0a,0x83,0x0a,0x83,0x00,0x61,0x0a,0x89,0x0a,0x89,0x00,0x62,0x0a,0x8b,0x0a,0x8b,0x00,0x63,0x0a,0x8f,0x0a,0x8f, +0x00,0x64,0x0a,0x93,0x0a,0x93,0x00,0x65,0x0a,0x97,0x0a,0x97,0x00,0x66,0x0a,0x9a,0x0a,0x9a,0x00,0x67,0x0a,0x9d,0x0a,0x9d,0x00,0x68,0x0a,0xa0,0x0a,0xa0,0x00,0x69,0x0a,0xa3,0x0a,0xa3,0x00,0x6a,0x0a,0xa6,0x0a,0xa6,0x00,0x6b,0x0a,0xa8,0x0a,0xa8,0x00,0x6c,0x0a,0xaa,0x0a,0xaa,0x00,0x6d,0x0a,0xac,0x0a,0xac,0x00,0x6e,0x0a,0xae, +0x0a,0xae,0x00,0x6f,0x0a,0xb0,0x0a,0xb0,0x00,0x70,0x0a,0xb6,0x0a,0xb6,0x00,0x71,0x0e,0x20,0x0e,0x20,0x00,0x72,0x0e,0x3f,0x0e,0x3f,0x00,0x73,0x0e,0x43,0x0e,0x43,0x00,0x74,0x0e,0x47,0x0e,0x47,0x00,0x75,0x0e,0x4b,0x0e,0x4b,0x00,0x76,0x0e,0x4f,0x0e,0x4f,0x00,0x77,0x0f,0x16,0x0f,0x16,0x00,0x78,0x0f,0x1a,0x0f,0x1a,0x00,0x79, +0x0f,0x1e,0x0f,0x1e,0x00,0x7a,0x0f,0x24,0x0f,0x24,0x00,0x7b,0x0f,0x2c,0x0f,0x2c,0x00,0x7c,0x0f,0x30,0x0f,0x30,0x00,0x7d,0x0f,0x34,0x0f,0x34,0x00,0x7e,0x0f,0x40,0x0f,0x40,0x00,0x7f,0x0f,0x44,0x0f,0x44,0x00,0x80,0x0f,0x48,0x0f,0x48,0x00,0x81,0x0f,0x4c,0x0f,0x4c,0x00,0x82,0x13,0x02,0x13,0x02,0x00,0x83,0x13,0x04,0x13,0x04, +0x00,0x84,0x13,0x08,0x13,0x08,0x00,0x85,0x13,0x0c,0x13,0x0c,0x00,0x86,0x13,0x10,0x13,0x10,0x00,0x87,0x13,0x14,0x13,0x14,0x00,0x88,0x13,0x18,0x13,0x18,0x00,0x89,0x13,0x1c,0x13,0x1c,0x00,0x8a,0x13,0x20,0x13,0x20,0x00,0x8b,0x14,0x04,0x14,0x04,0x00,0x8c,0x14,0x0b,0x14,0x0b,0x00,0x8d,0x14,0x0f,0x14,0x0f,0x00,0x8e,0x14,0x53, +0x14,0x57,0x00,0x8f,0x14,0x59,0x14,0x5c,0x00,0x94,0x00,0x02,0x01,0x38,0x00,0x99,0x0e,0xd7,0x08,0xf9,0x08,0xcb,0x08,0xcc,0x08,0xcd,0x08,0xce,0x08,0xd0,0x08,0xd2,0x08,0xd4,0x08,0xd5,0x08,0xd6,0x08,0xe1,0x0e,0x3a,0x0e,0x3d,0x08,0xe2,0x08,0xe5,0x08,0xe8,0x08,0xeb,0x08,0xed,0x08,0xee,0x08,0xef,0x08,0xf0,0x0e,0x5b,0x0e,0x5f, +0x08,0xf4,0x0e,0x6f,0x09,0x41,0x09,0x44,0x09,0x47,0x09,0x49,0x09,0x4c,0x09,0x5c,0x09,0x61,0x09,0x6d,0x0e,0x71,0x0e,0x76,0x09,0x8d,0x09,0x8f,0x09,0x91,0x09,0x93,0x09,0x95,0x09,0x97,0x09,0x9a,0x09,0x9d,0x09,0xa0,0x09,0xa3,0x09,0xa6,0x09,0xa9,0x09,0xba,0x09,0xbc,0x09,0xbe,0x09,0xc0,0x09,0xc2,0x0e,0xa3,0x09,0xc6,0x09,0x3c, +0x09,0xca,0x09,0xcd,0x09,0xd0,0x09,0xd3,0x0e,0xac,0x0e,0xaf,0x09,0xd8,0x09,0xda,0x09,0xdc,0x09,0xde,0x09,0xe0,0x09,0xe2,0x09,0xe4,0x09,0xe6,0x09,0xe8,0x09,0xea,0x09,0xec,0x09,0xee,0x09,0xf0,0x09,0xf2,0x09,0xf4,0x0e,0xd1,0x09,0xf7,0x09,0xf9,0x09,0xfc,0x0a,0x09,0x0e,0xe7,0x0e,0xe9,0x0a,0x10,0x0a,0x25,0x0a,0x27,0x0a,0x2a, +0x09,0xde,0x0a,0x5a,0x0a,0x73,0x0a,0x75,0x0a,0x77,0x0a,0x79,0x0a,0x7b,0x0a,0x7d,0x0a,0x7f,0x0a,0x82,0x0a,0x85,0x0a,0x8a,0x0a,0x8d,0x0a,0x91,0x0a,0x95,0x0a,0x98,0x0a,0x9b,0x0a,0x9e,0x0a,0xa1,0x0a,0xa4,0x0a,0xa7,0x0a,0xa9,0x0a,0xab,0x0a,0xad,0x0a,0xaf,0x0a,0xb2,0x0a,0xb7,0x0e,0x22,0x0e,0x41,0x0e,0x45,0x0e,0x49,0x0e,0x4d, +0x0e,0x51,0x0f,0x18,0x0f,0x1c,0x0f,0x20,0x0f,0x26,0x0f,0x2e,0x0f,0x32,0x0f,0x36,0x0f,0x42,0x0f,0x46,0x0f,0x4a,0x0f,0x4e,0x13,0x03,0x13,0x06,0x13,0x09,0x13,0x0d,0x13,0x11,0x13,0x15,0x13,0x19,0x13,0x1d,0x13,0x21,0x14,0x05,0x14,0x0c,0x14,0x10,0x14,0x6f,0x14,0x72,0x14,0x75,0x14,0x78,0x14,0x7b,0x14,0x80,0x14,0x83,0x14,0x86, +0x08,0xf0,0x00,0x02,0x00,0x7b,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x0c,0x09,0x0c,0x00,0x01,0x09,0x0e,0x09,0x0e,0x00,0x02,0x09,0x10,0x09,0x14,0x00,0x03,0x09,0x19,0x09,0x20,0x00,0x08,0x09,0x22,0x09,0x28,0x00,0x10,0x09,0x2a,0x09,0x2b,0x00,0x17,0x09,0x3e,0x09,0x3e,0x00,0x19,0x09,0x40,0x09,0x40,0x00,0x1a,0x09,0x42,0x09,0x42, +0x00,0x1b,0x09,0x46,0x09,0x46,0x00,0x1c,0x09,0x48,0x09,0x48,0x00,0x1d,0x09,0x4a,0x09,0x4a,0x00,0x1e,0x09,0x5b,0x09,0x5b,0x00,0x1f,0x09,0x60,0x09,0x60,0x00,0x20,0x09,0x6c,0x09,0x6c,0x00,0x21,0x09,0x7c,0x09,0x7c,0x00,0x22,0x09,0x8a,0x09,0x8a,0x00,0x23,0x09,0x8c,0x09,0x8c,0x00,0x24,0x09,0x8e,0x09,0x8e,0x00,0x25,0x09,0x90, +0x09,0x90,0x00,0x26,0x09,0x92,0x09,0x92,0x00,0x27,0x09,0x94,0x09,0x94,0x00,0x28,0x09,0x96,0x09,0x96,0x00,0x29,0x09,0x98,0x09,0x98,0x00,0x2a,0x09,0x9b,0x09,0x9b,0x00,0x2b,0x09,0x9e,0x09,0x9e,0x00,0x2c,0x09,0xa1,0x09,0xa1,0x00,0x2d,0x09,0xa4,0x09,0xa4,0x00,0x2e,0x09,0xa7,0x09,0xa7,0x00,0x2f,0x09,0xb9,0x09,0xb9,0x00,0x30, +0x09,0xbb,0x09,0xbb,0x00,0x31,0x09,0xbd,0x09,0xbd,0x00,0x32,0x09,0xbf,0x09,0xbf,0x00,0x33,0x09,0xc1,0x09,0xc1,0x00,0x34,0x09,0xc3,0x09,0xc4,0x00,0x35,0x09,0xc8,0x09,0xc9,0x00,0x37,0x09,0xcc,0x09,0xcc,0x00,0x39,0x09,0xcf,0x09,0xcf,0x00,0x3a,0x09,0xd2,0x09,0xd2,0x00,0x3b,0x09,0xd5,0x09,0xd7,0x00,0x3c,0x09,0xd9,0x09,0xd9, +0x00,0x3f,0x09,0xdb,0x09,0xdb,0x00,0x40,0x09,0xdd,0x09,0xdd,0x00,0x41,0x09,0xdf,0x09,0xdf,0x00,0x42,0x09,0xe1,0x09,0xe1,0x00,0x43,0x09,0xe3,0x09,0xe3,0x00,0x44,0x09,0xe5,0x09,0xe5,0x00,0x45,0x09,0xe7,0x09,0xe7,0x00,0x46,0x09,0xe9,0x09,0xe9,0x00,0x47,0x09,0xeb,0x09,0xeb,0x00,0x48,0x09,0xed,0x09,0xed,0x00,0x49,0x09,0xef, +0x09,0xef,0x00,0x4a,0x09,0xf1,0x09,0xf1,0x00,0x4b,0x09,0xf3,0x09,0xf3,0x00,0x4c,0x09,0xf5,0x09,0xf6,0x00,0x4d,0x09,0xf8,0x09,0xf8,0x00,0x4f,0x09,0xfa,0x09,0xfa,0x00,0x50,0x0a,0x07,0x0a,0x07,0x00,0x51,0x0a,0x0b,0x0a,0x0b,0x00,0x52,0x0a,0x0d,0x0a,0x0d,0x00,0x53,0x0a,0x10,0x0a,0x10,0x00,0x54,0x0a,0x24,0x0a,0x24,0x00,0x55, +0x0a,0x26,0x0a,0x26,0x00,0x56,0x0a,0x28,0x0a,0x28,0x00,0x57,0x0a,0x3e,0x0a,0x3e,0x00,0x58,0x0a,0x58,0x0a,0x58,0x00,0x59,0x0a,0x72,0x0a,0x72,0x00,0x5a,0x0a,0x74,0x0a,0x74,0x00,0x5b,0x0a,0x76,0x0a,0x76,0x00,0x5c,0x0a,0x78,0x0a,0x78,0x00,0x5d,0x0a,0x7a,0x0a,0x7a,0x00,0x5e,0x0a,0x7c,0x0a,0x7c,0x00,0x5f,0x0a,0x7e,0x0a,0x7e, +0x00,0x60,0x0a,0x80,0x0a,0x80,0x00,0x61,0x0a,0x83,0x0a,0x83,0x00,0x62,0x0a,0x89,0x0a,0x89,0x00,0x63,0x0a,0x8b,0x0a,0x8b,0x00,0x64,0x0a,0x8f,0x0a,0x8f,0x00,0x65,0x0a,0x93,0x0a,0x93,0x00,0x66,0x0a,0x97,0x0a,0x97,0x00,0x67,0x0a,0x9a,0x0a,0x9a,0x00,0x68,0x0a,0x9d,0x0a,0x9d,0x00,0x69,0x0a,0xa0,0x0a,0xa0,0x00,0x6a,0x0a,0xa3, +0x0a,0xa3,0x00,0x6b,0x0a,0xa6,0x0a,0xa6,0x00,0x6c,0x0a,0xa8,0x0a,0xa8,0x00,0x6d,0x0a,0xaa,0x0a,0xaa,0x00,0x6e,0x0a,0xac,0x0a,0xac,0x00,0x6f,0x0a,0xae,0x0a,0xae,0x00,0x70,0x0a,0xb0,0x0a,0xb0,0x00,0x71,0x0a,0xb6,0x0a,0xb6,0x00,0x72,0x0e,0x20,0x0e,0x20,0x00,0x73,0x0e,0x3f,0x0e,0x3f,0x00,0x74,0x0e,0x43,0x0e,0x43,0x00,0x75, +0x0e,0x47,0x0e,0x47,0x00,0x76,0x0e,0x4b,0x0e,0x4b,0x00,0x77,0x0e,0x4f,0x0e,0x4f,0x00,0x78,0x0f,0x16,0x0f,0x16,0x00,0x79,0x0f,0x1a,0x0f,0x1a,0x00,0x7a,0x0f,0x1e,0x0f,0x1e,0x00,0x7b,0x0f,0x24,0x0f,0x24,0x00,0x7c,0x0f,0x2c,0x0f,0x2c,0x00,0x7d,0x0f,0x30,0x0f,0x30,0x00,0x7e,0x0f,0x34,0x0f,0x34,0x00,0x7f,0x0f,0x40,0x0f,0x40, +0x00,0x80,0x0f,0x44,0x0f,0x44,0x00,0x81,0x0f,0x48,0x0f,0x48,0x00,0x82,0x0f,0x4c,0x0f,0x4c,0x00,0x83,0x13,0x02,0x13,0x02,0x00,0x84,0x13,0x04,0x13,0x04,0x00,0x85,0x13,0x08,0x13,0x08,0x00,0x86,0x13,0x0c,0x13,0x0c,0x00,0x87,0x13,0x10,0x13,0x10,0x00,0x88,0x13,0x14,0x13,0x14,0x00,0x89,0x13,0x18,0x13,0x18,0x00,0x8a,0x13,0x1c, +0x13,0x1c,0x00,0x8b,0x13,0x20,0x13,0x20,0x00,0x8c,0x14,0x04,0x14,0x04,0x00,0x8d,0x14,0x0b,0x14,0x0b,0x00,0x8e,0x14,0x0f,0x14,0x0f,0x00,0x8f,0x14,0x53,0x14,0x57,0x00,0x90,0x14,0x59,0x14,0x5c,0x00,0x95,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x6d,0x00,0x02,0x00,0x08,0x08,0xee, +0x08,0xee,0x00,0x00,0x09,0x3f,0x09,0x3f,0x00,0x01,0x09,0xec,0x09,0xec,0x00,0x02,0x09,0xee,0x09,0xee,0x00,0x03,0x09,0xf0,0x09,0xf0,0x00,0x04,0x09,0xf2,0x09,0xf2,0x00,0x05,0x0a,0x5f,0x0a,0x62,0x00,0x06,0x0a,0xb2,0x0a,0xb3,0x00,0x0a,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca,0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83, +0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x02,0x00,0x01,0x0f,0x8c,0x0f,0x97,0x00,0x00,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca, +0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83,0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x01,0x00,0x62,0x00,0x03,0x00,0x0c,0x00,0x2a,0x00,0x44,0x00,0x02,0x00,0x06,0x00,0x14,0x14,0x97,0x00,0x06,0x09,0x3f,0x09,0x3f, +0x09,0x32,0x09,0x73,0x08,0xf3,0x14,0x97,0x00,0x04,0x09,0x3f,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x06,0x00,0x12,0x09,0x71,0x00,0x05,0x09,0x3f,0x09,0x32,0x09,0x73,0x08,0xf3,0x09,0x71,0x00,0x03,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x06,0x00,0x14,0x0a,0x63,0x00,0x06,0x08,0xee,0x09,0x3f,0x09,0x32,0x09,0x73,0x08,0xf3,0x0a,0x63, +0x00,0x04,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x03,0x08,0xe8,0x08,0xe8,0x00,0x00,0x08,0xee,0x08,0xee,0x00,0x01,0x09,0x0d,0x09,0x0d,0x00,0x02,0x00,0x01,0x00,0x34,0x00,0x03,0x00,0x0c,0x00,0x1a,0x00,0x26,0x00,0x01,0x00,0x04,0x14,0x97,0x00,0x04,0x09,0x3f,0x09,0x3f,0x09,0x72,0x00,0x01,0x00,0x04,0x09,0x71,0x00,0x03, +0x09,0x3f,0x09,0x72,0x00,0x01,0x00,0x04,0x0a,0x63,0x00,0x04,0x08,0xee,0x09,0x3f,0x09,0x72,0x00,0x02,0x00,0x03,0x08,0xe8,0x08,0xe8,0x00,0x00,0x08,0xee,0x08,0xee,0x00,0x01,0x09,0x0d,0x09,0x0d,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0xb8,0x00,0x01,0x00,0x00,0x00,0x6f,0x00,0x02,0x00,0x1b,0x08,0xd4, +0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe1,0x00,0x03,0x09,0xba,0x09,0xba,0x00,0x04,0x09,0xbc,0x09,0xbc,0x00,0x05,0x09,0xbe,0x09,0xbe,0x00,0x06,0x09,0xc0,0x09,0xc0,0x00,0x07,0x09,0xc2,0x09,0xc2,0x00,0x08,0x0a,0x25,0x0a,0x25,0x00,0x09,0x0a,0x27,0x0a,0x27,0x00,0x0a,0x0a,0x8a,0x0a,0x8a,0x00,0x0b,0x0a,0xb7,0x0a,0xb7,0x00,0x0c, +0x0e,0x32,0x0e,0x32,0x00,0x0d,0x0e,0x34,0x0e,0x34,0x00,0x0e,0x0e,0x36,0x0e,0x36,0x00,0x0f,0x0e,0x38,0x0e,0x38,0x00,0x10,0x0e,0x99,0x0e,0x99,0x00,0x11,0x0e,0x9b,0x0e,0x9b,0x00,0x12,0x0e,0x9d,0x0e,0x9d,0x00,0x13,0x0e,0x9f,0x0e,0x9f,0x00,0x14,0x0e,0xa1,0x0e,0xa1,0x00,0x15,0x0e,0xed,0x0e,0xed,0x00,0x16,0x0e,0xef,0x0e,0xef, +0x00,0x17,0x0f,0x04,0x0f,0x04,0x00,0x18,0x0f,0x15,0x0f,0x15,0x00,0x19,0x0f,0x20,0x0f,0x21,0x00,0x1a,0x0f,0x46,0x0f,0x47,0x00,0x1c,0x0f,0x4a,0x0f,0x4b,0x00,0x1e,0x00,0x02,0x00,0x15,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b, +0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06,0x0a,0x0e,0x0a,0x0e,0x00,0x07,0x0a,0x57,0x0a,0x57,0x00,0x08,0x0a,0xb5,0x0a,0xb5,0x00,0x09,0x0b,0x0c,0x0b,0x0d,0x00,0x0a,0x0b,0x0f,0x0b,0x17,0x00,0x0c,0x0e,0x48,0x0e,0x48,0x00,0x15,0x0e,0x4c,0x0e,0x4c,0x00,0x16,0x0e,0x50,0x0e,0x50,0x00,0x17,0x0f,0x02, +0x0f,0x02,0x00,0x18,0x0f,0x23,0x0f,0x23,0x00,0x19,0x0f,0x2d,0x0f,0x2d,0x00,0x1a,0x0f,0x31,0x0f,0x31,0x00,0x1b,0x0f,0x35,0x0f,0x35,0x00,0x1c,0x14,0x7d,0x14,0x7e,0x00,0x1d,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x02,0x00,0x01,0x0f,0x6c,0x0f,0x8b,0x00,0x00,0x00,0x02, +0x00,0x16,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b,0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06,0x0a,0x0c,0x0a,0x0c,0x00,0x07,0x0a,0x0e,0x0a,0x0e,0x00,0x08,0x0a,0x57,0x0a,0x57,0x00,0x09,0x0a,0xb5, +0x0a,0xb5,0x00,0x0a,0x0b,0x0c,0x0b,0x17,0x00,0x0b,0x0e,0x21,0x0e,0x21,0x00,0x17,0x0e,0x48,0x0e,0x48,0x00,0x18,0x0e,0x4c,0x0e,0x4c,0x00,0x19,0x0e,0x50,0x0e,0x50,0x00,0x1a,0x0f,0x02,0x0f,0x02,0x00,0x1b,0x0f,0x23,0x0f,0x23,0x00,0x1c,0x0f,0x2d,0x0f,0x2d,0x00,0x1d,0x0f,0x31,0x0f,0x31,0x00,0x1e,0x0f,0x35,0x0f,0x35,0x00,0x1f, +0x14,0x7d,0x14,0x7e,0x00,0x20,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x03,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x71,0x00,0x02,0x00,0x7d,0x08,0xca,0x08,0xcb,0x00,0x00,0x08,0xce,0x08,0xce,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x03,0x09,0x0a,0x09,0x0b,0x00,0x04,0x09,0x17,0x09,0x18,0x00,0x06,0x09,0x29,0x09,0x29,0x00,0x08, +0x09,0x2e,0x09,0x2e,0x00,0x09,0x09,0x31,0x09,0x31,0x00,0x0a,0x09,0x41,0x09,0x41,0x00,0x0b,0x09,0x44,0x09,0x45,0x00,0x0c,0x09,0x4c,0x09,0x4c,0x00,0x0e,0x09,0x5e,0x09,0x5e,0x00,0x0f,0x09,0x61,0x09,0x62,0x00,0x10,0x09,0x77,0x09,0x77,0x00,0x12,0x09,0x7f,0x09,0x7f,0x00,0x13,0x09,0x84,0x09,0x85,0x00,0x14,0x09,0x88,0x09,0x89, +0x00,0x16,0x09,0x8f,0x09,0x8f,0x00,0x18,0x09,0x91,0x09,0x91,0x00,0x19,0x09,0x97,0x09,0x97,0x00,0x1a,0x09,0xa0,0x09,0xa0,0x00,0x1b,0x09,0xa3,0x09,0xa3,0x00,0x1c,0x09,0xa9,0x09,0xac,0x00,0x1d,0x09,0xae,0x09,0xae,0x00,0x21,0x09,0xb2,0x09,0xb8,0x00,0x22,0x09,0xba,0x09,0xba,0x00,0x29,0x09,0xbc,0x09,0xbc,0x00,0x2a,0x09,0xbe, +0x09,0xbe,0x00,0x2b,0x09,0xc0,0x09,0xc0,0x00,0x2c,0x09,0xca,0x09,0xcb,0x00,0x2d,0x09,0xcd,0x09,0xce,0x00,0x2f,0x09,0xd0,0x09,0xd1,0x00,0x31,0x09,0xe0,0x09,0xe0,0x00,0x33,0x09,0xe6,0x09,0xe6,0x00,0x34,0x09,0xe8,0x09,0xe8,0x00,0x35,0x09,0xf2,0x09,0xf2,0x00,0x36,0x09,0xf4,0x09,0xf4,0x00,0x37,0x09,0xf7,0x09,0xf7,0x00,0x38, +0x09,0xfc,0x0a,0x04,0x00,0x39,0x0a,0x0a,0x0a,0x0a,0x00,0x42,0x0a,0x1a,0x0a,0x1a,0x00,0x43,0x0a,0x21,0x0a,0x21,0x00,0x44,0x0a,0x23,0x0a,0x23,0x00,0x45,0x0a,0x25,0x0a,0x25,0x00,0x46,0x0a,0x27,0x0a,0x27,0x00,0x47,0x0a,0x2a,0x0a,0x2b,0x00,0x48,0x0a,0x50,0x0a,0x50,0x00,0x4a,0x0a,0x56,0x0a,0x57,0x00,0x4b,0x0a,0x5b,0x0a,0x5b, +0x00,0x4d,0x0a,0x62,0x0a,0x62,0x00,0x4e,0x0a,0x6f,0x0a,0x6f,0x00,0x4f,0x0a,0x73,0x0a,0x73,0x00,0x50,0x0a,0x75,0x0a,0x75,0x00,0x51,0x0a,0x77,0x0a,0x77,0x00,0x52,0x0a,0x79,0x0a,0x79,0x00,0x53,0x0a,0x7b,0x0a,0x7b,0x00,0x54,0x0a,0x7d,0x0a,0x7d,0x00,0x55,0x0a,0x85,0x0a,0x88,0x00,0x56,0x0a,0x98,0x0a,0x99,0x00,0x5a,0x0a,0x9b, +0x0a,0x9c,0x00,0x5c,0x0a,0xa4,0x0a,0xa5,0x00,0x5e,0x0a,0xa9,0x0a,0xa9,0x00,0x60,0x0a,0xab,0x0a,0xab,0x00,0x61,0x0a,0xb4,0x0a,0xb5,0x00,0x62,0x0b,0x0c,0x0b,0x18,0x00,0x64,0x0e,0x1e,0x0e,0x1e,0x00,0x71,0x0e,0x22,0x0e,0x23,0x00,0x72,0x0e,0x27,0x0e,0x27,0x00,0x74,0x0e,0x2c,0x0e,0x2c,0x00,0x75,0x0e,0x45,0x0e,0x46,0x00,0x76, +0x0e,0x49,0x0e,0x4a,0x00,0x78,0x0e,0x4d,0x0e,0x4e,0x00,0x7a,0x0e,0x51,0x0e,0x52,0x00,0x7c,0x0e,0x61,0x0e,0x61,0x00,0x7e,0x0e,0x6b,0x0e,0x6c,0x00,0x7f,0x0e,0x74,0x0e,0x75,0x00,0x81,0x0e,0x7d,0x0e,0x7d,0x00,0x83,0x0e,0x7f,0x0e,0x7f,0x00,0x84,0x0e,0x83,0x0e,0x83,0x00,0x85,0x0e,0x87,0x0e,0x87,0x00,0x86,0x0e,0x8a,0x0e,0x8b, +0x00,0x87,0x0e,0x8d,0x0e,0x8e,0x00,0x89,0x0e,0x90,0x0e,0x92,0x00,0x8b,0x0e,0x94,0x0e,0x94,0x00,0x8e,0x0e,0x99,0x0e,0x99,0x00,0x8f,0x0e,0x9b,0x0e,0x9b,0x00,0x90,0x0e,0x9d,0x0e,0x9d,0x00,0x91,0x0e,0x9f,0x0e,0x9f,0x00,0x92,0x0e,0xbc,0x0e,0xbc,0x00,0x93,0x0e,0xc4,0x0e,0xc4,0x00,0x94,0x0e,0xc6,0x0e,0xc6,0x00,0x95,0x0e,0xce, +0x0e,0xce,0x00,0x96,0x0e,0xd4,0x0e,0xd4,0x00,0x97,0x0e,0xd8,0x0e,0xd9,0x00,0x98,0x0e,0xdc,0x0e,0xe4,0x00,0x9a,0x0e,0xe6,0x0e,0xea,0x00,0xa3,0x0e,0xed,0x0e,0xed,0x00,0xa8,0x0e,0xef,0x0e,0xef,0x00,0xa9,0x0e,0xf1,0x0e,0xf1,0x00,0xaa,0x0e,0xf3,0x0e,0xf3,0x00,0xab,0x0e,0xf5,0x0e,0xf5,0x00,0xac,0x0e,0xf7,0x0e,0xf7,0x00,0xad, +0x0e,0xf9,0x0e,0xf9,0x00,0xae,0x0e,0xfb,0x0e,0xfb,0x00,0xaf,0x0e,0xff,0x0f,0x02,0x00,0xb0,0x0f,0x0d,0x0f,0x0d,0x00,0xb4,0x0f,0x0f,0x0f,0x0f,0x00,0xb5,0x0f,0x18,0x0f,0x19,0x00,0xb6,0x0f,0x1c,0x0f,0x1d,0x00,0xb8,0x0f,0x22,0x0f,0x23,0x00,0xba,0x0f,0x2e,0x0f,0x2f,0x00,0xbc,0x0f,0x32,0x0f,0x33,0x00,0xbe,0x0f,0x36,0x0f,0x3b, +0x00,0xc0,0x0f,0x42,0x0f,0x43,0x00,0xc6,0x0f,0x64,0x0f,0x64,0x00,0xc8,0x0f,0x68,0x0f,0x68,0x00,0xc9,0x0f,0x98,0x0f,0xa6,0x00,0xca,0x13,0x2c,0x13,0x2c,0x00,0xd9,0x13,0x2f,0x13,0x2f,0x00,0xda,0x13,0x33,0x13,0x35,0x00,0xdb,0x13,0x38,0x13,0x38,0x00,0xde,0x13,0x3c,0x13,0x3c,0x00,0xdf,0x13,0x3f,0x13,0x40,0x00,0xe0,0x14,0x62, +0x14,0x62,0x00,0xe2,0x14,0x6c,0x14,0x6c,0x00,0xe3,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x03,0x00,0x02,0x00,0x28,0x04,0xfa,0x00,0x01,0x07,0x86,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x03,0x00,0x02,0x00,0x14, +0x07,0x8e,0x00,0x01,0x07,0x72,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x02,0x00,0xcd,0x08,0xcb,0x08,0xce,0x00,0x00,0x08,0xd0,0x08,0xd0,0x00,0x04,0x08,0xd2,0x08,0xd2,0x00,0x05,0x08,0xd4,0x08,0xd6,0x00,0x06,0x08,0xe1,0x08,0xe3,0x00,0x09,0x08,0xe5,0x08,0xe6,0x00,0x0c,0x08,0xe8,0x08,0xe9,0x00,0x0e,0x08,0xeb,0x08,0xf0, +0x00,0x10,0x08,0xf4,0x08,0xf4,0x00,0x16,0x08,0xf9,0x08,0xfb,0x00,0x17,0x08,0xff,0x09,0x00,0x00,0x1a,0x09,0x21,0x09,0x21,0x00,0x1c,0x09,0x34,0x09,0x35,0x00,0x1d,0x09,0x3b,0x09,0x3d,0x00,0x1f,0x09,0x3f,0x09,0x3f,0x00,0x22,0x09,0x41,0x09,0x41,0x00,0x23,0x09,0x44,0x09,0x44,0x00,0x24,0x09,0x47,0x09,0x47,0x00,0x25,0x09,0x49, +0x09,0x49,0x00,0x26,0x09,0x4c,0x09,0x4c,0x00,0x27,0x09,0x5c,0x09,0x5c,0x00,0x28,0x09,0x61,0x09,0x62,0x00,0x29,0x09,0x6d,0x09,0x6e,0x00,0x2b,0x09,0x8d,0x09,0x8d,0x00,0x2d,0x09,0x8f,0x09,0x8f,0x00,0x2e,0x09,0x91,0x09,0x91,0x00,0x2f,0x09,0x93,0x09,0x93,0x00,0x30,0x09,0x95,0x09,0x95,0x00,0x31,0x09,0x97,0x09,0x97,0x00,0x32, +0x09,0x9a,0x09,0x9a,0x00,0x33,0x09,0x9d,0x09,0x9d,0x00,0x34,0x09,0xa0,0x09,0xa0,0x00,0x35,0x09,0xa3,0x09,0xa3,0x00,0x36,0x09,0xa6,0x09,0xa6,0x00,0x37,0x09,0xa9,0x09,0xa9,0x00,0x38,0x09,0xba,0x09,0xba,0x00,0x39,0x09,0xbc,0x09,0xbc,0x00,0x3a,0x09,0xbe,0x09,0xbe,0x00,0x3b,0x09,0xc0,0x09,0xc0,0x00,0x3c,0x09,0xc2,0x09,0xc2, +0x00,0x3d,0x09,0xc6,0x09,0xc7,0x00,0x3e,0x09,0xca,0x09,0xcb,0x00,0x40,0x09,0xcd,0x09,0xce,0x00,0x42,0x09,0xd0,0x09,0xd1,0x00,0x44,0x09,0xd3,0x09,0xd4,0x00,0x46,0x09,0xd8,0x09,0xd8,0x00,0x48,0x09,0xda,0x09,0xda,0x00,0x49,0x09,0xdc,0x09,0xdc,0x00,0x4a,0x09,0xde,0x09,0xde,0x00,0x4b,0x09,0xe0,0x09,0xe0,0x00,0x4c,0x09,0xe2, +0x09,0xe2,0x00,0x4d,0x09,0xe4,0x09,0xe4,0x00,0x4e,0x09,0xe6,0x09,0xe6,0x00,0x4f,0x09,0xe8,0x09,0xe8,0x00,0x50,0x09,0xea,0x09,0xea,0x00,0x51,0x09,0xec,0x09,0xec,0x00,0x52,0x09,0xee,0x09,0xee,0x00,0x53,0x09,0xf0,0x09,0xf0,0x00,0x54,0x09,0xf2,0x09,0xf2,0x00,0x55,0x09,0xf4,0x09,0xf4,0x00,0x56,0x09,0xf7,0x09,0xf7,0x00,0x57, +0x09,0xf9,0x09,0xf9,0x00,0x58,0x09,0xfc,0x09,0xfc,0x00,0x59,0x0a,0x09,0x0a,0x09,0x00,0x5a,0x0a,0x10,0x0a,0x10,0x00,0x5b,0x0a,0x25,0x0a,0x25,0x00,0x5c,0x0a,0x27,0x0a,0x27,0x00,0x5d,0x0a,0x2a,0x0a,0x2b,0x00,0x5e,0x0a,0x32,0x0a,0x3b,0x00,0x60,0x0a,0x41,0x0a,0x42,0x00,0x6a,0x0a,0x5a,0x0a,0x5b,0x00,0x6c,0x0a,0x5f,0x0a,0x62, +0x00,0x6e,0x0a,0x73,0x0a,0x73,0x00,0x72,0x0a,0x75,0x0a,0x75,0x00,0x73,0x0a,0x77,0x0a,0x77,0x00,0x74,0x0a,0x79,0x0a,0x79,0x00,0x75,0x0a,0x7b,0x0a,0x7b,0x00,0x76,0x0a,0x7d,0x0a,0x7d,0x00,0x77,0x0a,0x7f,0x0a,0x7f,0x00,0x78,0x0a,0x82,0x0a,0x82,0x00,0x79,0x0a,0x85,0x0a,0x85,0x00,0x7a,0x0a,0x8a,0x0a,0x8a,0x00,0x7b,0x0a,0x8d, +0x0a,0x8e,0x00,0x7c,0x0a,0x91,0x0a,0x92,0x00,0x7e,0x0a,0x95,0x0a,0x96,0x00,0x80,0x0a,0x98,0x0a,0x99,0x00,0x82,0x0a,0x9b,0x0a,0x9c,0x00,0x84,0x0a,0x9e,0x0a,0x9f,0x00,0x86,0x0a,0xa1,0x0a,0xa2,0x00,0x88,0x0a,0xa4,0x0a,0xa5,0x00,0x8a,0x0a,0xa7,0x0a,0xa7,0x00,0x8c,0x0a,0xa9,0x0a,0xa9,0x00,0x8d,0x0a,0xab,0x0a,0xab,0x00,0x8e, +0x0a,0xad,0x0a,0xad,0x00,0x8f,0x0a,0xaf,0x0a,0xaf,0x00,0x90,0x0a,0xb2,0x0a,0xb3,0x00,0x91,0x0a,0xb7,0x0a,0xb7,0x00,0x93,0x0a,0xb9,0x0a,0xba,0x00,0x94,0x0e,0x22,0x0e,0x23,0x00,0x96,0x0e,0x25,0x0e,0x25,0x00,0x98,0x0e,0x27,0x0e,0x27,0x00,0x99,0x0e,0x29,0x0e,0x29,0x00,0x9a,0x0e,0x2b,0x0e,0x2e,0x00,0x9b,0x0e,0x32,0x0e,0x32, +0x00,0x9f,0x0e,0x34,0x0e,0x34,0x00,0xa0,0x0e,0x36,0x0e,0x36,0x00,0xa1,0x0e,0x38,0x0e,0x38,0x00,0xa2,0x0e,0x3a,0x0e,0x3b,0x00,0xa3,0x0e,0x3d,0x0e,0x3e,0x00,0xa5,0x0e,0x41,0x0e,0x42,0x00,0xa7,0x0e,0x45,0x0e,0x46,0x00,0xa9,0x0e,0x49,0x0e,0x4a,0x00,0xab,0x0e,0x4d,0x0e,0x4e,0x00,0xad,0x0e,0x51,0x0e,0x52,0x00,0xaf,0x0e,0x56, +0x0e,0x56,0x00,0xb1,0x0e,0x58,0x0e,0x58,0x00,0xb2,0x0e,0x5a,0x0e,0x5b,0x00,0xb3,0x0e,0x5d,0x0e,0x5d,0x00,0xb5,0x0e,0x5f,0x0e,0x61,0x00,0xb6,0x0e,0x6f,0x0e,0x6f,0x00,0xb9,0x0e,0x71,0x0e,0x72,0x00,0xba,0x0e,0x76,0x0e,0x77,0x00,0xbc,0x0e,0x79,0x0e,0x79,0x00,0xbe,0x0e,0x7b,0x0e,0x7b,0x00,0xbf,0x0e,0x7d,0x0e,0x7d,0x00,0xc0, +0x0e,0x7f,0x0e,0x7f,0x00,0xc1,0x0e,0x81,0x0e,0x81,0x00,0xc2,0x0e,0x83,0x0e,0x83,0x00,0xc3,0x0e,0x85,0x0e,0x85,0x00,0xc4,0x0e,0x87,0x0e,0x8e,0x00,0xc5,0x0e,0x99,0x0e,0x99,0x00,0xcd,0x0e,0x9b,0x0e,0x9b,0x00,0xce,0x0e,0x9d,0x0e,0x9d,0x00,0xcf,0x0e,0x9f,0x0e,0x9f,0x00,0xd0,0x0e,0xa1,0x0e,0xa1,0x00,0xd1,0x0e,0xa3,0x0e,0xa4, +0x00,0xd2,0x0e,0xac,0x0e,0xad,0x00,0xd4,0x0e,0xaf,0x0e,0xb0,0x00,0xd6,0x0e,0xb2,0x0e,0xb2,0x00,0xd8,0x0e,0xb4,0x0e,0xb4,0x00,0xd9,0x0e,0xb6,0x0e,0xb6,0x00,0xda,0x0e,0xb8,0x0e,0xb8,0x00,0xdb,0x0e,0xba,0x0e,0xba,0x00,0xdc,0x0e,0xbc,0x0e,0xbc,0x00,0xdd,0x0e,0xbe,0x0e,0xbe,0x00,0xde,0x0e,0xc0,0x0e,0xc0,0x00,0xdf,0x0e,0xc2, +0x0e,0xc2,0x00,0xe0,0x0e,0xc4,0x0e,0xc4,0x00,0xe1,0x0e,0xc6,0x0e,0xc6,0x00,0xe2,0x0e,0xc8,0x0e,0xc8,0x00,0xe3,0x0e,0xce,0x0e,0xce,0x00,0xe4,0x0e,0xd1,0x0e,0xd2,0x00,0xe5,0x0e,0xd4,0x0e,0xd4,0x00,0xe7,0x0e,0xd6,0x0e,0xd9,0x00,0xe8,0x0e,0xe4,0x0e,0xe5,0x00,0xec,0x0e,0xe7,0x0e,0xea,0x00,0xee,0x0e,0xed,0x0e,0xed,0x00,0xf2, +0x0e,0xef,0x0e,0xef,0x00,0xf3,0x0e,0xf1,0x0e,0xf1,0x00,0xf4,0x0e,0xf3,0x0e,0xf3,0x00,0xf5,0x0e,0xf5,0x0e,0xf5,0x00,0xf6,0x0e,0xf7,0x0e,0xf7,0x00,0xf7,0x0e,0xf9,0x0e,0xf9,0x00,0xf8,0x0e,0xfb,0x0e,0xfb,0x00,0xf9,0x0e,0xfd,0x0e,0xff,0x00,0xfa,0x0f,0x04,0x0f,0x04,0x00,0xfd,0x0f,0x0b,0x0f,0x0b,0x00,0xfe,0x0f,0x0d,0x0f,0x0d, +0x00,0xff,0x0f,0x0f,0x0f,0x0f,0x01,0x00,0x0f,0x11,0x0f,0x11,0x01,0x01,0x0f,0x13,0x0f,0x13,0x01,0x02,0x0f,0x15,0x0f,0x15,0x01,0x03,0x0f,0x18,0x0f,0x19,0x01,0x04,0x0f,0x1c,0x0f,0x1d,0x01,0x06,0x0f,0x20,0x0f,0x21,0x01,0x08,0x0f,0x26,0x0f,0x27,0x01,0x0a,0x0f,0x2e,0x0f,0x2f,0x01,0x0c,0x0f,0x32,0x0f,0x33,0x01,0x0e,0x0f,0x36, +0x0f,0x37,0x01,0x10,0x0f,0x42,0x0f,0x43,0x01,0x12,0x0f,0x46,0x0f,0x47,0x01,0x14,0x0f,0x4a,0x0f,0x4b,0x01,0x16,0x0f,0x4e,0x0f,0x4f,0x01,0x18,0x0f,0x6c,0x0f,0x6c,0x01,0x1a,0x0f,0x6e,0x0f,0x6e,0x01,0x1b,0x0f,0x70,0x0f,0x70,0x01,0x1c,0x0f,0x72,0x0f,0x72,0x01,0x1d,0x0f,0x74,0x0f,0x74,0x01,0x1e,0x0f,0x76,0x0f,0x76,0x01,0x1f, +0x0f,0x78,0x0f,0x78,0x01,0x20,0x0f,0x7a,0x0f,0x7a,0x01,0x21,0x0f,0x7c,0x0f,0x7c,0x01,0x22,0x0f,0x7e,0x0f,0x7e,0x01,0x23,0x0f,0x80,0x0f,0x80,0x01,0x24,0x0f,0x82,0x0f,0x82,0x01,0x25,0x0f,0x84,0x0f,0x84,0x01,0x26,0x0f,0x86,0x0f,0x86,0x01,0x27,0x0f,0x88,0x0f,0x88,0x01,0x28,0x0f,0x8a,0x0f,0x8a,0x01,0x29,0x0f,0x8c,0x0f,0x8c, +0x01,0x2a,0x0f,0x8e,0x0f,0x8e,0x01,0x2b,0x0f,0x90,0x0f,0x90,0x01,0x2c,0x0f,0x92,0x0f,0x92,0x01,0x2d,0x0f,0x94,0x0f,0x94,0x01,0x2e,0x0f,0x96,0x0f,0x96,0x01,0x2f,0x00,0x02,0x00,0x6c,0x08,0xca,0x08,0xcb,0x00,0x00,0x08,0xce,0x08,0xce,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x03,0x09,0x0a,0x09,0x0b,0x00,0x04,0x09,0x17,0x09,0x18, +0x00,0x06,0x09,0x29,0x09,0x29,0x00,0x08,0x09,0x41,0x09,0x41,0x00,0x09,0x09,0x44,0x09,0x45,0x00,0x0a,0x09,0x4c,0x09,0x4c,0x00,0x0c,0x09,0x5e,0x09,0x5e,0x00,0x0d,0x09,0x61,0x09,0x62,0x00,0x0e,0x09,0x77,0x09,0x77,0x00,0x10,0x09,0x7f,0x09,0x7f,0x00,0x11,0x09,0x84,0x09,0x85,0x00,0x12,0x09,0x88,0x09,0x89,0x00,0x14,0x09,0x8f, +0x09,0x8f,0x00,0x16,0x09,0x91,0x09,0x91,0x00,0x17,0x09,0x97,0x09,0x97,0x00,0x18,0x09,0xa0,0x09,0xa0,0x00,0x19,0x09,0xa3,0x09,0xa3,0x00,0x1a,0x09,0xa9,0x09,0xac,0x00,0x1b,0x09,0xae,0x09,0xae,0x00,0x1f,0x09,0xb2,0x09,0xb8,0x00,0x20,0x09,0xba,0x09,0xba,0x00,0x27,0x09,0xbc,0x09,0xbc,0x00,0x28,0x09,0xbe,0x09,0xbe,0x00,0x29, +0x09,0xc0,0x09,0xc0,0x00,0x2a,0x09,0xca,0x09,0xcb,0x00,0x2b,0x09,0xcd,0x09,0xce,0x00,0x2d,0x09,0xd0,0x09,0xd1,0x00,0x2f,0x09,0xe0,0x09,0xe0,0x00,0x31,0x09,0xe6,0x09,0xe6,0x00,0x32,0x09,0xe8,0x09,0xe8,0x00,0x33,0x09,0xf2,0x09,0xf2,0x00,0x34,0x09,0xf4,0x09,0xf4,0x00,0x35,0x09,0xf7,0x09,0xf7,0x00,0x36,0x09,0xfc,0x0a,0x04, +0x00,0x37,0x0a,0x0a,0x0a,0x0a,0x00,0x40,0x0a,0x25,0x0a,0x25,0x00,0x41,0x0a,0x27,0x0a,0x27,0x00,0x42,0x0a,0x2a,0x0a,0x2b,0x00,0x43,0x0a,0x56,0x0a,0x57,0x00,0x45,0x0a,0x5b,0x0a,0x5b,0x00,0x47,0x0a,0x62,0x0a,0x62,0x00,0x48,0x0a,0x73,0x0a,0x73,0x00,0x49,0x0a,0x75,0x0a,0x75,0x00,0x4a,0x0a,0x77,0x0a,0x77,0x00,0x4b,0x0a,0x79, +0x0a,0x79,0x00,0x4c,0x0a,0x7b,0x0a,0x7b,0x00,0x4d,0x0a,0x7d,0x0a,0x7d,0x00,0x4e,0x0a,0x85,0x0a,0x88,0x00,0x4f,0x0a,0x98,0x0a,0x99,0x00,0x53,0x0a,0x9b,0x0a,0x9c,0x00,0x55,0x0a,0xa4,0x0a,0xa5,0x00,0x57,0x0a,0xa9,0x0a,0xa9,0x00,0x59,0x0a,0xab,0x0a,0xab,0x00,0x5a,0x0a,0xb4,0x0a,0xb5,0x00,0x5b,0x0b,0x0c,0x0b,0x18,0x00,0x5d, +0x0e,0x22,0x0e,0x23,0x00,0x6a,0x0e,0x27,0x0e,0x27,0x00,0x6c,0x0e,0x2c,0x0e,0x2c,0x00,0x6d,0x0e,0x45,0x0e,0x46,0x00,0x6e,0x0e,0x49,0x0e,0x4a,0x00,0x70,0x0e,0x4d,0x0e,0x4e,0x00,0x72,0x0e,0x51,0x0e,0x52,0x00,0x74,0x0e,0x61,0x0e,0x61,0x00,0x76,0x0e,0x74,0x0e,0x75,0x00,0x77,0x0e,0x7d,0x0e,0x7d,0x00,0x79,0x0e,0x7f,0x0e,0x7f, +0x00,0x7a,0x0e,0x83,0x0e,0x83,0x00,0x7b,0x0e,0x87,0x0e,0x87,0x00,0x7c,0x0e,0x8a,0x0e,0x8b,0x00,0x7d,0x0e,0x8d,0x0e,0x8e,0x00,0x7f,0x0e,0x90,0x0e,0x92,0x00,0x81,0x0e,0x94,0x0e,0x94,0x00,0x84,0x0e,0x99,0x0e,0x99,0x00,0x85,0x0e,0x9b,0x0e,0x9b,0x00,0x86,0x0e,0x9d,0x0e,0x9d,0x00,0x87,0x0e,0x9f,0x0e,0x9f,0x00,0x88,0x0e,0xbc, +0x0e,0xbc,0x00,0x89,0x0e,0xc4,0x0e,0xc4,0x00,0x8a,0x0e,0xc6,0x0e,0xc6,0x00,0x8b,0x0e,0xce,0x0e,0xce,0x00,0x8c,0x0e,0xd4,0x0e,0xd4,0x00,0x8d,0x0e,0xd8,0x0e,0xd9,0x00,0x8e,0x0e,0xdc,0x0e,0xe4,0x00,0x90,0x0e,0xe6,0x0e,0xea,0x00,0x99,0x0e,0xed,0x0e,0xed,0x00,0x9e,0x0e,0xef,0x0e,0xef,0x00,0x9f,0x0e,0xf1,0x0e,0xf1,0x00,0xa0, +0x0e,0xf3,0x0e,0xf3,0x00,0xa1,0x0e,0xf5,0x0e,0xf5,0x00,0xa2,0x0e,0xf7,0x0e,0xf7,0x00,0xa3,0x0e,0xf9,0x0e,0xf9,0x00,0xa4,0x0e,0xfb,0x0e,0xfb,0x00,0xa5,0x0e,0xff,0x0f,0x02,0x00,0xa6,0x0f,0x0d,0x0f,0x0d,0x00,0xaa,0x0f,0x0f,0x0f,0x0f,0x00,0xab,0x0f,0x18,0x0f,0x19,0x00,0xac,0x0f,0x1c,0x0f,0x1d,0x00,0xae,0x0f,0x22,0x0f,0x23, +0x00,0xb0,0x0f,0x2e,0x0f,0x2f,0x00,0xb2,0x0f,0x32,0x0f,0x33,0x00,0xb4,0x0f,0x36,0x0f,0x3b,0x00,0xb6,0x0f,0x42,0x0f,0x43,0x00,0xbc,0x0f,0x64,0x0f,0x64,0x00,0xbe,0x0f,0x68,0x0f,0x68,0x00,0xbf,0x0f,0x98,0x0f,0xa6,0x00,0xc0,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d, +0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06,0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f, +0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62,0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x03, +0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x02,0x00,0x03,0x00,0x4c,0x00,0x4d,0x00,0x00,0x01,0x62,0x01,0x62,0x00,0x02,0x05,0x6d,0x05,0x6d,0x00,0x03,0x00,0x02,0x00,0x11,0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79, +0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57,0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f, +0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x01,0x05,0x6a,0x00,0x05,0x00,0x10,0x01,0x22,0x02,0x34,0x03,0x46,0x04,0x58,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0,0x00,0xa8, +0x00,0xb0,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xae,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xaf,0x00,0x03,0x06,0xa2,0x06,0xa4,0x06,0xb0,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xb1,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xb2,0x00,0x03,0x06,0xa3, +0x06,0xa2,0x06,0xb3,0x00,0x03,0x06,0xa3,0x06,0xa3,0x06,0xb4,0x00,0x03,0x06,0xa3,0x06,0xa4,0x06,0xb5,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xb6,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xb7,0x00,0x02,0x06,0xa3,0x06,0xb8,0x00,0x03,0x06,0xa4,0x06,0xa2,0x06,0xb9,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xba,0x00,0x03,0x06,0xa4,0x06,0xa4, +0x06,0xbb,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xbc,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xbd,0x00,0x02,0x06,0xa4,0x06,0xbe,0x00,0x03,0x06,0xa5,0x06,0xa2,0x06,0xbf,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xc0,0x00,0x03,0x06,0xa5,0x06,0xa4,0x06,0xc1,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xc2,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xc3, +0x00,0x02,0x06,0xa5,0x06,0xc4,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xc5,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xc6,0x00,0x03,0x06,0xa6,0x06,0xa4,0x06,0xc7,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xc8,0x00,0x03,0x06,0xa6,0x06,0xa6,0x06,0xc9,0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62, +0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0,0x00,0xa8,0x00,0xb0,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xca,0x00,0x03,0x06,0xa2,0x06,0xa2,0x06,0xcb,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xcc,0x00,0x03, +0x06,0xa2,0x06,0xa4,0x06,0xcd,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xce,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xcf,0x00,0x02,0x06,0xa2,0x06,0xd0,0x00,0x03,0x06,0xa3,0x06,0xa2,0x06,0xd1,0x00,0x03,0x06,0xa3,0x06,0xa4,0x06,0xd2,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xd3,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xd4,0x00,0x03,0x06,0xa4, +0x06,0xa2,0x06,0xd5,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xd6,0x00,0x03,0x06,0xa4,0x06,0xa4,0x06,0xd7,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xd8,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xd9,0x00,0x02,0x06,0xa4,0x06,0xda,0x00,0x03,0x06,0xa5,0x06,0xa2,0x06,0xdb,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xdc,0x00,0x03,0x06,0xa5,0x06,0xa4, +0x06,0xdd,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xde,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xdf,0x00,0x02,0x06,0xa5,0x06,0xe0,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xe1,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xe2,0x00,0x03,0x06,0xa6,0x06,0xa4,0x06,0xe3,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xe4,0x00,0x03,0x06,0xa6,0x06,0xa6,0x06,0xe5, +0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xe6, +0x00,0x03,0x06,0xa2,0x06,0xa2,0x06,0xe7,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xe8,0x00,0x03,0x06,0xa2,0x06,0xa4,0x06,0xe9,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xea,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xeb,0x00,0x02,0x06,0xa2,0x06,0xeb,0x00,0x03,0x06,0xa3,0x06,0xa2,0x06,0xec,0x00,0x03,0x06,0xa3,0x06,0xa3,0x06,0xed,0x00,0x03, +0x06,0xa3,0x06,0xa4,0x06,0xee,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xef,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xf0,0x00,0x02,0x06,0xa3,0x06,0xf1,0x00,0x03,0x06,0xa4,0x06,0xa2,0x06,0xf2,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xf3,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xf4,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xf5,0x00,0x03,0x06,0xa5, +0x06,0xa2,0x06,0xf6,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xf7,0x00,0x03,0x06,0xa5,0x06,0xa4,0x06,0xf8,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xf9,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xfa,0x00,0x02,0x06,0xa5,0x06,0xfb,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xfc,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xfd,0x00,0x03,0x06,0xa6,0x06,0xa4, +0x06,0xfe,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xff,0x00,0x03,0x06,0xa6,0x06,0xa6,0x07,0x00,0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc4,0x00,0xcc, +0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xea,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x07,0x01,0x00,0x03,0x06,0xa2,0x06,0xa2,0x07,0x02,0x00,0x03,0x06,0xa2,0x06,0xa3,0x07,0x03,0x00,0x03,0x06,0xa2,0x06,0xa4,0x07,0x04,0x00,0x03,0x06,0xa2,0x06,0xa5,0x07,0x05,0x00,0x03,0x06,0xa2,0x06,0xa6,0x07,0x06,0x00,0x02,0x06,0xa2,0x07,0x07, +0x00,0x03,0x06,0xa3,0x06,0xa2,0x07,0x08,0x00,0x03,0x06,0xa3,0x06,0xa3,0x07,0x09,0x00,0x03,0x06,0xa3,0x06,0xa4,0x07,0x0a,0x00,0x03,0x06,0xa3,0x06,0xa5,0x07,0x0b,0x00,0x03,0x06,0xa3,0x06,0xa6,0x07,0x0c,0x00,0x02,0x06,0xa3,0x07,0x0d,0x00,0x03,0x06,0xa4,0x06,0xa2,0x07,0x0e,0x00,0x03,0x06,0xa4,0x06,0xa3,0x07,0x0f,0x00,0x03, +0x06,0xa4,0x06,0xa4,0x07,0x10,0x00,0x03,0x06,0xa4,0x06,0xa5,0x07,0x11,0x00,0x03,0x06,0xa4,0x06,0xa6,0x07,0x12,0x00,0x02,0x06,0xa4,0x07,0x13,0x00,0x03,0x06,0xa5,0x06,0xa2,0x07,0x14,0x00,0x03,0x06,0xa5,0x06,0xa3,0x07,0x15,0x00,0x03,0x06,0xa5,0x06,0xa4,0x07,0x16,0x00,0x03,0x06,0xa5,0x06,0xa6,0x07,0x1c,0x00,0x02,0x06,0xa6, +0x07,0x17,0x00,0x03,0x06,0xa6,0x06,0xa2,0x07,0x18,0x00,0x03,0x06,0xa6,0x06,0xa3,0x07,0x19,0x00,0x03,0x06,0xa6,0x06,0xa4,0x07,0x1a,0x00,0x03,0x06,0xa6,0x06,0xa5,0x07,0x1b,0x00,0x03,0x06,0xa6,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88, +0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc4,0x00,0xcc,0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xec,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x07,0x1d,0x00,0x03,0x06,0xa2,0x06,0xa2,0x07,0x1e,0x00,0x03,0x06,0xa2,0x06,0xa3,0x07,0x1f,0x00,0x03,0x06,0xa2,0x06,0xa4,0x07,0x20,0x00,0x03,0x06,0xa2, +0x06,0xa5,0x07,0x21,0x00,0x03,0x06,0xa2,0x06,0xa6,0x07,0x22,0x00,0x02,0x06,0xa2,0x07,0x23,0x00,0x03,0x06,0xa3,0x06,0xa2,0x07,0x24,0x00,0x03,0x06,0xa3,0x06,0xa3,0x07,0x25,0x00,0x03,0x06,0xa3,0x06,0xa4,0x07,0x26,0x00,0x03,0x06,0xa3,0x06,0xa5,0x07,0x27,0x00,0x03,0x06,0xa3,0x06,0xa6,0x07,0x28,0x00,0x02,0x06,0xa3,0x07,0x29, +0x00,0x03,0x06,0xa4,0x06,0xa2,0x07,0x2a,0x00,0x03,0x06,0xa4,0x06,0xa3,0x07,0x2b,0x00,0x03,0x06,0xa4,0x06,0xa4,0x07,0x2c,0x00,0x03,0x06,0xa4,0x06,0xa5,0x07,0x2d,0x00,0x03,0x06,0xa4,0x06,0xa6,0x07,0x2e,0x00,0x02,0x06,0xa4,0x07,0x2f,0x00,0x03,0x06,0xa5,0x06,0xa2,0x07,0x30,0x00,0x03,0x06,0xa5,0x06,0xa3,0x07,0x31,0x00,0x03, +0x06,0xa5,0x06,0xa4,0x07,0x32,0x00,0x03,0x06,0xa5,0x06,0xa5,0x07,0x33,0x00,0x03,0x06,0xa5,0x06,0xa6,0x07,0x34,0x00,0x02,0x06,0xa5,0x07,0x35,0x00,0x03,0x06,0xa6,0x06,0xa2,0x07,0x36,0x00,0x03,0x06,0xa6,0x06,0xa3,0x07,0x37,0x00,0x03,0x06,0xa6,0x06,0xa4,0x07,0x38,0x00,0x03,0x06,0xa6,0x06,0xa5,0x00,0x02,0x00,0x01,0x06,0xa2, +0x06,0xa6,0x00,0x00,0x00,0x01,0x01,0x92,0x00,0x03,0x00,0x0c,0x00,0x6e,0x01,0x00,0x00,0x08,0x00,0x12,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x08,0x62,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x63,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x64,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46, +0x08,0x65,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x66,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x67,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x68,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x69,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x00,0x0c,0x00,0x1a,0x00,0x24,0x00,0x2e,0x00,0x38,0x00,0x42,0x00,0x4c, +0x00,0x56,0x00,0x60,0x00,0x6a,0x00,0x74,0x00,0x7e,0x00,0x88,0x08,0x6a,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x6b,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x6c,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46,0x08,0x6d,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x6e,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x6f, +0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x70,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x71,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x08,0x7a,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x46,0x08,0x7b,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x47,0x08,0x7c,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x46,0x08,0x7d,0x00,0x04,0x04,0x68, +0x04,0x66,0x02,0x47,0x00,0x0c,0x00,0x1a,0x00,0x24,0x00,0x2e,0x00,0x38,0x00,0x42,0x00,0x4c,0x00,0x56,0x00,0x60,0x00,0x6a,0x00,0x74,0x00,0x7e,0x00,0x88,0x08,0x72,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x73,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x74,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46,0x08,0x75,0x00,0x04, +0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x76,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x77,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x78,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x79,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x08,0x7e,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x46,0x08,0x7f,0x00,0x04,0x04,0x68,0x04,0x64, +0x02,0x47,0x08,0x80,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x46,0x08,0x81,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x47,0x00,0x02,0x00,0x03,0x01,0x2f,0x01,0x2f,0x00,0x00,0x01,0xc9,0x01,0xc9,0x00,0x01,0x01,0xd2,0x01,0xd2,0x00,0x02,0x00,0x02,0x00,0x1a,0x00,0x0a,0x08,0xa5,0x08,0xa6,0x08,0xa7,0x08,0xa8,0x08,0xa9,0x08,0xaa,0x08,0xab, +0x08,0xac,0x08,0xad,0x08,0xae,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x0c,0x08,0x99,0x08,0x98,0x08,0x96,0x08,0x97,0x08,0x9a,0x08,0x9b,0x08,0x9c,0x08,0x9d,0x08,0x9e,0x08,0x9f,0x08,0x95,0x01,0x37,0x00,0x02,0x00,0x03,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x4c,0x00,0x4c,0x00,0x0a,0x00,0x51, +0x00,0x51,0x00,0x0b,0x00,0x02,0x00,0x64,0x00,0x2f,0x0d,0x8a,0x0d,0x8b,0x0d,0x8c,0x0d,0x8d,0x0d,0x8e,0x0d,0x90,0x0d,0x92,0x0d,0x93,0x0d,0x94,0x0d,0x95,0x0d,0x96,0x0d,0x97,0x0d,0x98,0x0d,0x99,0x0d,0x9a,0x0d,0x9b,0x0d,0x9c,0x0d,0x9d,0x0d,0x9e,0x0d,0x9f,0x0d,0xa0,0x0d,0xa1,0x0d,0xa2,0x0d,0xa3,0x0d,0xa4,0x0d,0xa5,0x0d,0xa6, +0x0d,0xa7,0x0d,0xa8,0x0d,0xa9,0x0d,0xaa,0x0d,0xab,0x0d,0xac,0x0d,0xad,0x0d,0xae,0x0d,0xaf,0x0d,0xb0,0x0d,0xb1,0x0d,0xb2,0x0d,0xb3,0x0d,0xb4,0x0d,0xb5,0x0d,0xb6,0x0d,0xb7,0x0d,0xb8,0x0d,0x8f,0x0d,0x91,0x00,0x02,0x00,0x03,0x01,0xdb,0x02,0x06,0x00,0x00,0x02,0x33,0x02,0x33,0x00,0x2c,0x02,0xb5,0x02,0xb6,0x00,0x2d,0x00,0x02, +0x00,0x64,0x00,0x2f,0x0d,0x98,0x0d,0x99,0x0d,0x9a,0x0d,0x9b,0x0d,0x9c,0x0d,0x9d,0x0d,0x9e,0x0d,0x9f,0x0d,0xa0,0x0d,0xa1,0x0d,0xa2,0x0d,0xa3,0x0d,0xa4,0x0d,0xa5,0x0d,0xa6,0x0d,0xa7,0x0d,0xa8,0x0d,0xa9,0x0d,0xaa,0x0d,0xab,0x0d,0xac,0x0d,0xad,0x0d,0xae,0x0d,0xaf,0x0d,0xb0,0x0d,0xb1,0x0d,0xb2,0x0d,0xb3,0x0d,0xb4,0x0d,0xb5, +0x0d,0xb6,0x0d,0xb7,0x0d,0x8a,0x0d,0x8b,0x0d,0x8c,0x0d,0x8d,0x0d,0x8e,0x0d,0x90,0x0d,0x92,0x0d,0x93,0x0d,0x94,0x0d,0x95,0x0d,0x96,0x0d,0x97,0x0d,0xb8,0x0d,0x8f,0x0d,0x91,0x00,0x02,0x00,0x03,0x02,0x07,0x02,0x32,0x00,0x00,0x02,0x34,0x02,0x34,0x00,0x2c,0x02,0xb7,0x02,0xb8,0x00,0x2d,0x00,0x02,0x00,0x48,0x00,0x21,0x0d,0x6c, +0x0d,0x6b,0x0d,0x70,0x0d,0x7d,0x0d,0x81,0x0d,0x82,0x0d,0x83,0x0d,0x84,0x0d,0x85,0x0d,0x86,0x0d,0x87,0x0d,0x69,0x0d,0x6a,0x0d,0x6d,0x0d,0x6e,0x0d,0x6f,0x0d,0x71,0x0d,0x72,0x0d,0x73,0x0d,0x74,0x0d,0x75,0x0d,0x76,0x0d,0x77,0x0d,0x78,0x0d,0x79,0x0d,0x7a,0x0d,0x7b,0x0d,0x7c,0x0d,0x7e,0x0d,0x7f,0x0d,0x80,0x0d,0x88,0x0d,0x89, +0x00,0x02,0x00,0x04,0x00,0xa9,0x00,0xa9,0x00,0x00,0x01,0x2c,0x01,0x2e,0x00,0x01,0x01,0xa1,0x01,0xa7,0x00,0x04,0x01,0xa9,0x01,0xbe,0x00,0x0b,0x00,0x02,0x00,0x4a,0x00,0x22,0x0d,0x69,0x0d,0x6c,0x0d,0x6d,0x0d,0x7a,0x0d,0x7b,0x0d,0x7d,0x0d,0x81,0x0d,0x82,0x0d,0x83,0x0d,0x84,0x0d,0x6a,0x0d,0x6b,0x0d,0x6e,0x0d,0x6f,0x0d,0x70, +0x0d,0x71,0x0d,0x72,0x0d,0x73,0x0d,0x74,0x0d,0x75,0x0d,0x76,0x0d,0x77,0x0d,0x79,0x0d,0x7a,0x0d,0x7c,0x0d,0x7e,0x0d,0x7f,0x0d,0x80,0x0d,0x88,0x0d,0x89,0x0d,0x85,0x0d,0x86,0x0d,0x87,0x0d,0x78,0x00,0x02,0x00,0x04,0x01,0x2f,0x01,0x34,0x00,0x00,0x01,0xbf,0x01,0xc2,0x00,0x06,0x01,0xc4,0x01,0xda,0x00,0x0a,0x02,0x37,0x02,0x37, +0x00,0x21,0x00,0x02,0x01,0x08,0x00,0x81,0x0d,0xbe,0x0c,0xeb,0x0c,0xec,0x0c,0xed,0x0c,0xee,0x0c,0xef,0x0c,0xf0,0x0c,0xf1,0x0c,0xf2,0x0c,0xf3,0x0c,0xf4,0x0c,0xf5,0x0c,0xf6,0x0c,0xf7,0x0c,0xf8,0x0c,0xf9,0x0c,0xfa,0x0c,0xfb,0x0c,0xfc,0x0c,0xfd,0x0c,0xfe,0x0c,0xff,0x0d,0x00,0x0d,0x01,0x0d,0x02,0x0d,0x03,0x0d,0x04,0x0d,0x10, +0x0d,0x11,0x0d,0x12,0x0d,0x14,0x0d,0x1b,0x0d,0x20,0x0d,0x24,0x0d,0x05,0x0d,0x08,0x0d,0x0c,0x0d,0x0f,0x0d,0x1f,0x0d,0x06,0x0d,0x61,0x0d,0x0e,0x0d,0x15,0x0d,0x0d,0x0d,0x16,0x0d,0x13,0x0d,0x18,0x0d,0x19,0x0d,0x1a,0x0d,0x17,0x0d,0x1d,0x0d,0x1e,0x0d,0x1c,0x0d,0x22,0x0d,0x23,0x0d,0x21,0x0d,0x07,0x0d,0x51,0x0d,0x65,0x0d,0x0a, +0x0d,0x25,0x0d,0x09,0x0d,0x33,0x0d,0x3c,0x0d,0x50,0x0d,0x29,0x0d,0x2a,0x0d,0x27,0x0d,0x28,0x0d,0x2c,0x0d,0x2d,0x0d,0x31,0x0d,0x32,0x0d,0x40,0x0d,0x42,0x0d,0x43,0x0d,0x44,0x0d,0x46,0x0d,0x4a,0x0d,0x4b,0x0d,0x4d,0x0d,0x4e,0x0d,0x52,0x0d,0x54,0x0d,0x59,0x0d,0x5a,0x0d,0x63,0x0d,0x64,0x0d,0x3d,0x0d,0x26,0x0d,0xbf,0x0d,0x35, +0x0d,0x2e,0x0d,0x2f,0x0d,0x30,0x0d,0xc0,0x0d,0x2b,0x0d,0x34,0x0d,0x36,0x0d,0x37,0x0d,0x38,0x0d,0x39,0x0d,0x3a,0x0d,0x3b,0x0d,0x3e,0x0d,0x3f,0x0d,0x41,0x0d,0x45,0x0d,0x47,0x0d,0x48,0x0d,0x49,0x0d,0x4c,0x0d,0x4f,0x0d,0x55,0x0d,0x56,0x0d,0x57,0x0d,0x58,0x0d,0x5b,0x0d,0x5c,0x0d,0x60,0x0d,0x66,0x0d,0x67,0x0d,0x68,0x0d,0x5d, +0x0d,0x5e,0x0d,0x5f,0x0d,0x62,0x0d,0xc1,0x0d,0x0b,0x00,0x02,0x00,0x4e,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x24,0x00,0x3d,0x00,0x01,0x00,0x62,0x00,0x68,0x00,0x1b,0x00,0x91,0x00,0x92,0x00,0x22,0x00,0xad,0x00,0xb0,0x00,0x24,0x00,0xbb,0x00,0xbb,0x00,0x28,0x00,0xc7,0x00,0xd5,0x00,0x29,0x00,0xe1,0x00,0xe1,0x00,0x38,0x00,0xe3, +0x00,0xe3,0x00,0x39,0x00,0xe5,0x00,0xe5,0x00,0x3a,0x00,0xe8,0x00,0xe8,0x00,0x3b,0x00,0xea,0x00,0xea,0x00,0x3c,0x00,0xec,0x00,0xec,0x00,0x3d,0x00,0xf7,0x00,0xf7,0x00,0x3e,0x00,0xf9,0x00,0xfa,0x00,0x3f,0x00,0xfc,0x00,0xfc,0x00,0x41,0x00,0xfe,0x00,0xfe,0x00,0x42,0x01,0x03,0x01,0x03,0x00,0x43,0x01,0x05,0x01,0x05,0x00,0x44, +0x01,0x07,0x01,0x07,0x00,0x45,0x01,0x09,0x01,0x0a,0x00,0x46,0x01,0x0c,0x01,0x0c,0x00,0x48,0x01,0x0e,0x01,0x0e,0x00,0x49,0x01,0x10,0x01,0x10,0x00,0x4a,0x01,0x12,0x01,0x12,0x00,0x4b,0x01,0x14,0x01,0x14,0x00,0x4c,0x01,0x16,0x01,0x16,0x00,0x4d,0x01,0x18,0x01,0x18,0x00,0x4e,0x01,0x1a,0x01,0x1a,0x00,0x4f,0x01,0x1c,0x01,0x1c, +0x00,0x50,0x01,0x1e,0x01,0x1e,0x00,0x51,0x01,0x20,0x01,0x20,0x00,0x52,0x01,0x22,0x01,0x22,0x00,0x53,0x01,0x24,0x01,0x24,0x00,0x54,0x01,0x26,0x01,0x26,0x00,0x55,0x01,0x28,0x01,0x28,0x00,0x56,0x01,0x2a,0x01,0x2a,0x00,0x57,0x01,0x39,0x01,0x39,0x00,0x58,0x01,0x45,0x01,0x45,0x00,0x59,0x01,0x47,0x01,0x47,0x00,0x5a,0x01,0x49, +0x01,0x49,0x00,0x5b,0x01,0x4b,0x01,0x4b,0x00,0x5c,0x01,0x4d,0x01,0x4d,0x00,0x5d,0x01,0x4f,0x01,0x4f,0x00,0x5e,0x01,0x51,0x01,0x51,0x00,0x5f,0x01,0x53,0x01,0x53,0x00,0x60,0x01,0x55,0x01,0x55,0x00,0x61,0x01,0x57,0x01,0x57,0x00,0x62,0x01,0x59,0x01,0x59,0x00,0x63,0x01,0x5b,0x01,0x5b,0x00,0x64,0x01,0x5d,0x01,0x5d,0x00,0x65, +0x01,0x5f,0x01,0x5f,0x00,0x66,0x01,0x61,0x01,0x61,0x00,0x67,0x01,0x63,0x01,0x63,0x00,0x68,0x01,0x65,0x01,0x65,0x00,0x69,0x01,0x68,0x01,0x68,0x00,0x6a,0x01,0x6a,0x01,0x6a,0x00,0x6b,0x01,0x6c,0x01,0x6c,0x00,0x6c,0x01,0x6e,0x01,0x6e,0x00,0x6d,0x01,0x70,0x01,0x70,0x00,0x6e,0x01,0x72,0x01,0x72,0x00,0x6f,0x01,0x74,0x01,0x74, +0x00,0x70,0x01,0x76,0x01,0x76,0x00,0x71,0x01,0x78,0x01,0x78,0x00,0x72,0x01,0x7a,0x01,0x7a,0x00,0x73,0x01,0x7c,0x01,0x7c,0x00,0x74,0x01,0x7e,0x01,0x7e,0x00,0x75,0x01,0x80,0x01,0x80,0x00,0x76,0x01,0x82,0x01,0x82,0x00,0x77,0x01,0x85,0x01,0x85,0x00,0x78,0x01,0x87,0x01,0x87,0x00,0x79,0x01,0x89,0x01,0x89,0x00,0x7a,0x01,0x8c, +0x01,0x8c,0x00,0x7b,0x01,0x8e,0x01,0x8e,0x00,0x7c,0x01,0x90,0x01,0x90,0x00,0x7d,0x01,0x92,0x01,0x92,0x00,0x7e,0x02,0x3d,0x02,0x3d,0x00,0x7f,0x0b,0x21,0x0b,0x21,0x00,0x80,0x00,0x02,0x01,0x06,0x00,0x80,0x0d,0xbe,0x0c,0xeb,0x0c,0xec,0x0c,0xed,0x0c,0xee,0x0c,0xef,0x0c,0xf0,0x0c,0xf1,0x0c,0xf2,0x0c,0xf4,0x0c,0xf5,0x0c,0xf6, +0x0c,0xf7,0x0c,0xf8,0x0c,0xf9,0x0c,0xfa,0x0c,0xfb,0x0c,0xfc,0x0c,0xfd,0x0c,0xfe,0x0c,0xff,0x0d,0x00,0x0d,0x01,0x0d,0x02,0x0d,0x03,0x0d,0x04,0x0d,0x0d,0x0d,0x0c,0x0d,0x0e,0x0d,0x10,0x0d,0x0f,0x0d,0x11,0x0d,0x12,0x0d,0x14,0x0d,0x13,0x0d,0x15,0x0d,0x16,0x0d,0x18,0x0d,0x17,0x0d,0x19,0x0d,0x1a,0x0d,0x1b,0x0d,0x1d,0x0d,0x1c, +0x0d,0x1e,0x0d,0x20,0x0d,0x1f,0x0d,0x22,0x0d,0x21,0x0d,0x23,0x0d,0x24,0x0d,0x0b,0x0d,0x05,0x0d,0x08,0x0d,0x06,0x0d,0x61,0x0c,0xf3,0x0d,0x07,0x0d,0x51,0x0d,0x65,0x0d,0x0a,0x0d,0x25,0x0d,0x09,0x0d,0x33,0x0d,0x50,0x0d,0x29,0x0d,0x2a,0x0d,0x2d,0x0d,0x27,0x0d,0x28,0x0d,0x2c,0x0d,0x31,0x0d,0x32,0x0d,0x40,0x0d,0x42,0x0d,0x43, +0x0d,0x44,0x0d,0x46,0x0d,0x4a,0x0d,0x4b,0x0d,0x4d,0x0d,0x4e,0x0d,0x52,0x0d,0x54,0x0d,0x59,0x0d,0x5a,0x0d,0x63,0x0d,0x64,0x0d,0x3d,0x0d,0x26,0x0d,0xbf,0x0d,0x35,0x0d,0x2e,0x0d,0x2f,0x0d,0x30,0x0d,0xc0,0x0d,0x2b,0x0d,0x34,0x0d,0x36,0x0d,0x37,0x0d,0x38,0x0d,0x39,0x0d,0x3a,0x0d,0x3b,0x0d,0x3e,0x0d,0x3f,0x0d,0x41,0x0d,0x45, +0x0d,0x47,0x0d,0x48,0x0d,0x49,0x0d,0x4c,0x0d,0x4f,0x0d,0x55,0x0d,0x56,0x0d,0x57,0x0d,0x58,0x0d,0x5b,0x0d,0x5c,0x0d,0x60,0x0d,0x66,0x0d,0x67,0x0d,0x68,0x0d,0x5d,0x0d,0x5e,0x0d,0x5f,0x0d,0x62,0x0d,0xc1,0x00,0x02,0x00,0x4f,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x44,0x00,0x4b,0x00,0x01,0x00,0x4d,0x00,0x5d,0x00,0x09,0x00,0x69, +0x00,0x81,0x00,0x1a,0x00,0x89,0x00,0x89,0x00,0x33,0x00,0xa0,0x00,0xa1,0x00,0x34,0x00,0xb1,0x00,0xb1,0x00,0x36,0x00,0xba,0x00,0xba,0x00,0x37,0x00,0xd6,0x00,0xd6,0x00,0x38,0x00,0xe2,0x00,0xe2,0x00,0x39,0x00,0xe4,0x00,0xe4,0x00,0x3a,0x00,0xe6,0x00,0xe6,0x00,0x3b,0x00,0xe9,0x00,0xe9,0x00,0x3c,0x00,0xeb,0x00,0xeb,0x00,0x3d, +0x00,0xed,0x00,0xed,0x00,0x3e,0x00,0xf8,0x00,0xf8,0x00,0x3f,0x00,0xfb,0x00,0xfb,0x00,0x40,0x00,0xfd,0x00,0xfd,0x00,0x41,0x00,0xff,0x01,0x00,0x00,0x42,0x01,0x04,0x01,0x04,0x00,0x44,0x01,0x06,0x01,0x06,0x00,0x45,0x01,0x08,0x01,0x08,0x00,0x46,0x01,0x0b,0x01,0x0b,0x00,0x47,0x01,0x0d,0x01,0x0d,0x00,0x48,0x01,0x0f,0x01,0x0f, +0x00,0x49,0x01,0x11,0x01,0x11,0x00,0x4a,0x01,0x13,0x01,0x13,0x00,0x4b,0x01,0x15,0x01,0x15,0x00,0x4c,0x01,0x17,0x01,0x17,0x00,0x4d,0x01,0x19,0x01,0x19,0x00,0x4e,0x01,0x1b,0x01,0x1b,0x00,0x4f,0x01,0x1d,0x01,0x1d,0x00,0x50,0x01,0x1f,0x01,0x1f,0x00,0x51,0x01,0x21,0x01,0x21,0x00,0x52,0x01,0x23,0x01,0x23,0x00,0x53,0x01,0x25, +0x01,0x25,0x00,0x54,0x01,0x27,0x01,0x27,0x00,0x55,0x01,0x29,0x01,0x29,0x00,0x56,0x01,0x2b,0x01,0x2b,0x00,0x57,0x01,0x3a,0x01,0x3a,0x00,0x58,0x01,0x46,0x01,0x46,0x00,0x59,0x01,0x48,0x01,0x48,0x00,0x5a,0x01,0x4a,0x01,0x4a,0x00,0x5b,0x01,0x4c,0x01,0x4c,0x00,0x5c,0x01,0x4e,0x01,0x4e,0x00,0x5d,0x01,0x50,0x01,0x50,0x00,0x5e, +0x01,0x52,0x01,0x52,0x00,0x5f,0x01,0x54,0x01,0x54,0x00,0x60,0x01,0x56,0x01,0x56,0x00,0x61,0x01,0x58,0x01,0x58,0x00,0x62,0x01,0x5a,0x01,0x5a,0x00,0x63,0x01,0x5c,0x01,0x5c,0x00,0x64,0x01,0x5e,0x01,0x5e,0x00,0x65,0x01,0x60,0x01,0x60,0x00,0x66,0x01,0x62,0x01,0x62,0x00,0x67,0x01,0x64,0x01,0x64,0x00,0x68,0x01,0x66,0x01,0x66, +0x00,0x69,0x01,0x69,0x01,0x69,0x00,0x6a,0x01,0x6b,0x01,0x6b,0x00,0x6b,0x01,0x6d,0x01,0x6d,0x00,0x6c,0x01,0x6f,0x01,0x6f,0x00,0x6d,0x01,0x71,0x01,0x71,0x00,0x6e,0x01,0x73,0x01,0x73,0x00,0x6f,0x01,0x75,0x01,0x75,0x00,0x70,0x01,0x77,0x01,0x77,0x00,0x71,0x01,0x79,0x01,0x79,0x00,0x72,0x01,0x7b,0x01,0x7b,0x00,0x73,0x01,0x7d, +0x01,0x7d,0x00,0x74,0x01,0x7f,0x01,0x7f,0x00,0x75,0x01,0x81,0x01,0x81,0x00,0x76,0x01,0x83,0x01,0x83,0x00,0x77,0x01,0x86,0x01,0x86,0x00,0x78,0x01,0x88,0x01,0x88,0x00,0x79,0x01,0x8a,0x01,0x8a,0x00,0x7a,0x01,0x8d,0x01,0x8d,0x00,0x7b,0x01,0x8f,0x01,0x8f,0x00,0x7c,0x01,0x91,0x01,0x91,0x00,0x7d,0x01,0x93,0x01,0x93,0x00,0x7e, +0x02,0x3e,0x02,0x3e,0x00,0x7f,0x00,0x02,0x00,0x08,0x00,0x01,0x0c,0xf3,0x00,0x01,0x00,0x01,0x00,0x4c,0x00,0x02,0x00,0x08,0x00,0x01,0x0d,0x3c,0x00,0x01,0x00,0x01,0x00,0x4c,0x00,0x01,0x00,0x24,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x10,0x00,0x16,0x0d,0xbd,0x00,0x03,0x00,0x49,0x00,0x4f,0x0d,0xbb,0x00,0x02,0x00,0x49, +0x0d,0xba,0x00,0x02,0x00,0x4f,0x00,0x01,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x28,0x00,0x02,0x00,0x0a,0x00,0x1e,0x00,0x02,0x00,0x06,0x00,0x0e,0x0d,0xbc,0x00,0x03,0x00,0x49,0x00,0x4c,0x0d,0xb9,0x00,0x02,0x00,0x4c,0x00,0x01,0x00,0x04,0x0d,0xbc,0x00,0x02,0x00,0x4c,0x00,0x01,0x00,0x02,0x00,0x49,0x0d,0xbb,0x00,0x02,0x00,0x08, +0x00,0x01,0x00,0xbc,0x00,0x01,0x00,0x01,0x00,0x12,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x74,0x00,0x02,0x00,0x02,0x00,0xbc,0x00,0xbc,0x00,0x00,0x0c,0xe1,0x0c,0xea,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x08,0x8d,0x00,0xf0, +0x00,0xf1,0x00,0xf2,0x02,0x38,0x02,0x39,0x08,0x8e,0x02,0x3a,0x02,0x3b,0x08,0x8f,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xc3,0x0c,0xc4,0x0c,0xc5,0x0c,0xc6,0x0c,0xc7,0x0c,0xc8,0x0c,0xc9,0x0c,0xca,0x0c,0xcb,0x0c,0xcc,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02, +0x00,0x1a,0x00,0x0a,0x0c,0xb9,0x0c,0xba,0x0c,0xbb,0x0c,0xbc,0x0c,0xbd,0x0c,0xbe,0x0c,0xbf,0x0c,0xc0,0x0c,0xc1,0x0c,0xc2,0x00,0x02,0x00,0x01,0x0c,0xcd,0x0c,0xd6,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x01, +0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x02,0x00,0x01,0x0c,0xcd,0x0c,0xd6,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xb9,0x0c,0xba,0x0c,0xbb,0x0c,0xbc,0x0c,0xbd,0x0c,0xbe,0x0c,0xbf,0x0c,0xc0, +0x0c,0xc1,0x0c,0xc2,0x00,0x02,0x00,0x01,0x0c,0xc3,0x0c,0xcc,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x02,0x00,0x01,0x0c,0xc3,0x0c,0xcc,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xc3,0x0c,0xc4,0x0c,0xc5,0x0c,0xc6, +0x0c,0xc7,0x0c,0xc8,0x0c,0xc9,0x0c,0xca,0x0c,0xcb,0x0c,0xcc,0x00,0x02,0x00,0x01,0x0c,0xb9,0x0c,0xc2,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x01,0x0c,0xb9,0x0c,0xc2,0x00,0x00,0x00,0x01,0x00,0x9a,0x00,0x06, +0x00,0x12,0x00,0x38,0x00,0x44,0x00,0x50,0x00,0x6a,0x00,0x76,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1c,0x10,0xb9,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x14,0x10,0xba,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x15,0x10,0xbb,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x16,0x00,0x01,0x00,0x04,0x08,0xc5,0x00,0x03,0x00,0x35,0x00,0x30,0x00,0x01, +0x00,0x04,0x10,0xbc,0x00,0x03,0x00,0x39,0x00,0x36,0x00,0x02,0x00,0x06,0x00,0x10,0x10,0xfb,0x00,0x04,0x00,0x25,0x00,0x36,0x00,0x33,0x10,0xfd,0x00,0x04,0x00,0x31,0x00,0x25,0x00,0x36,0x00,0x01,0x00,0x04,0x08,0xc6,0x00,0x03,0x00,0x2f,0x00,0x30,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1a,0x10,0xfc,0x00,0x04,0x00,0x3a,0x00,0x36, +0x00,0x33,0x08,0xc4,0x00,0x03,0x00,0x3a,0x00,0x2d,0x08,0xc3,0x00,0x04,0x00,0x3a,0x00,0x31,0x00,0x2d,0x00,0x02,0x00,0x04,0x00,0x29,0x00,0x29,0x00,0x00,0x00,0x2f,0x00,0x31,0x00,0x01,0x00,0x35,0x00,0x35,0x00,0x04,0x00,0x3d,0x00,0x3d,0x00,0x05,0x00,0x02,0x00,0x80,0x00,0x3d,0x10,0xe5,0x10,0xbd,0x10,0xbe,0x10,0xbf,0x10,0xe6, +0x10,0xe7,0x10,0xe8,0x10,0xe9,0x10,0xea,0x10,0xeb,0x10,0xec,0x10,0xed,0x10,0xc0,0x10,0xc1,0x10,0xf9,0x10,0xc2,0x10,0xc3,0x10,0xc4,0x10,0xee,0x10,0xef,0x10,0xf0,0x10,0xf1,0x10,0xf2,0x10,0xf3,0x10,0xf4,0x10,0xc5,0x10,0xf5,0x10,0xf6,0x10,0xc6,0x10,0xc7,0x10,0xc8,0x10,0xc9,0x10,0xca,0x10,0xf7,0x10,0xcb,0x10,0xcc,0x10,0xcd, +0x10,0xce,0x10,0xcf,0x10,0xd0,0x10,0xd1,0x10,0xd2,0x10,0xd3,0x10,0xd4,0x10,0xd5,0x10,0xd6,0x10,0xd7,0x10,0xd8,0x10,0xd9,0x10,0xda,0x10,0xdb,0x10,0xdc,0x10,0xdd,0x10,0xde,0x10,0xdf,0x10,0xe0,0x10,0xe1,0x10,0xf8,0x10,0xe2,0x10,0xe3,0x10,0xe4,0x00,0x02,0x00,0x1b,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x0a,0x00,0x01, +0x00,0x0d,0x00,0x0d,0x00,0x05,0x00,0x0f,0x00,0x11,0x00,0x06,0x00,0x1d,0x00,0x1e,0x00,0x09,0x00,0x42,0x00,0x42,0x00,0x0b,0x00,0x85,0x00,0x86,0x00,0x0c,0x00,0x8c,0x00,0x8c,0x00,0x0e,0x00,0x97,0x00,0x98,0x00,0x0f,0x00,0x9a,0x00,0x9a,0x00,0x11,0x00,0xaa,0x00,0xab,0x00,0x12,0x00,0xb2,0x00,0xb2,0x00,0x14,0x00,0xb4,0x00,0xb7, +0x00,0x15,0x00,0xbd,0x00,0xbd,0x00,0x19,0x00,0xc4,0x00,0xc5,0x00,0x1a,0x00,0xf3,0x00,0xf6,0x00,0x1c,0x01,0x38,0x01,0x38,0x00,0x20,0x01,0x94,0x01,0x94,0x00,0x21,0x01,0x96,0x01,0x96,0x00,0x22,0x01,0x98,0x01,0x9b,0x00,0x23,0x07,0xd2,0x07,0xd8,0x00,0x27,0x07,0xda,0x07,0xdf,0x00,0x2e,0x08,0x56,0x08,0x59,0x00,0x34,0x08,0x8c, +0x08,0x8c,0x00,0x38,0x08,0xbd,0x08,0xbd,0x00,0x39,0x0a,0x64,0x0a,0x64,0x00,0x3a,0x0b,0x2a,0x0b,0x2b,0x00,0x3b,0x00,0x02,0x00,0x56,0x00,0x28,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4, +0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x02,0x00,0x13,0x00,0x1c,0x00,0x00,0x0c,0xb9,0x0c,0xd6,0x00,0x0a,0x00,0x02,0x00,0xa2, +0x00,0x4e,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0d,0xf2,0x0d,0xf3,0x10,0x9a,0x10,0x9b,0x10,0xa5,0x10,0xaf,0x10,0xb6,0x10,0xac,0x10,0xad,0x10,0xb7,0x10,0xb8,0x10,0xa9,0x10,0xb1,0x10,0x99,0x10,0xa6,0x10,0xa7,0x10,0xab,0x10,0xae,0x10,0xa8,0x10,0x96,0x10,0xb2, +0x10,0xa3,0x10,0xa2,0x10,0x9c,0x10,0x9e,0x10,0x9d,0x10,0xa0,0x10,0x9f,0x10,0xa1,0x10,0xa4,0x10,0xb4,0x10,0xb5,0x10,0xb0,0x10,0xb3,0x10,0x98,0x10,0x97,0x10,0xaa,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc, +0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x10,0x95,0x00,0x02,0x00,0x1b,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x2c,0x00,0x2c,0x00,0x0a,0x00,0x34,0x00,0x34,0x00,0x0b,0x00,0xcc,0x00,0xcf,0x00,0x0c,0x00,0xf9,0x00,0xf9,0x00,0x10, +0x01,0x39,0x01,0x39,0x00,0x11,0x01,0x5b,0x01,0x5b,0x00,0x12,0x01,0x5d,0x01,0x5d,0x00,0x13,0x01,0x5f,0x01,0x5f,0x00,0x14,0x01,0x61,0x01,0x61,0x00,0x15,0x01,0xa4,0x01,0xa4,0x00,0x16,0x01,0xae,0x01,0xae,0x00,0x17,0x01,0xbd,0x01,0xbd,0x00,0x18,0x01,0xe0,0x01,0xe0,0x00,0x19,0x02,0x7f,0x02,0x7f,0x00,0x1a,0x02,0x81,0x02,0x81, +0x00,0x1b,0x02,0xb5,0x02,0xb5,0x00,0x1c,0x03,0x0f,0x03,0x0f,0x00,0x1d,0x03,0x11,0x03,0x11,0x00,0x1e,0x03,0xad,0x03,0xb4,0x00,0x1f,0x04,0x3f,0x04,0x42,0x00,0x27,0x04,0xf9,0x04,0xf9,0x00,0x2b,0x05,0x2c,0x05,0x2c,0x00,0x2c,0x05,0x2e,0x05,0x2e,0x00,0x2d,0x06,0x21,0x06,0x21,0x00,0x2e,0x0c,0xb9,0x0c,0xd6,0x00,0x2f,0x0d,0xe4, +0x0d,0xe4,0x00,0x4d,0x00,0x02,0x00,0x42,0x00,0x1e,0x0d,0xf5,0x0d,0xf6,0x0d,0xf7,0x0d,0xf8,0x0d,0xf9,0x0d,0xfa,0x0d,0xfb,0x0d,0xfc,0x0d,0xfd,0x0d,0xfe,0x0d,0xff,0x0e,0x00,0x0e,0x01,0x0e,0x0b,0x0e,0x02,0x0e,0x03,0x0e,0x04,0x0e,0x05,0x0e,0x06,0x0e,0x07,0x0e,0x08,0x0e,0x09,0x0e,0x0a,0x0e,0x0f,0x0e,0x10,0x0e,0x0e,0x0e,0x0c, +0x0e,0x0d,0x0e,0x11,0x0e,0x12,0x00,0x02,0x00,0x13,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x01,0x00,0x1e,0x00,0x1e,0x00,0x02,0x00,0x22,0x00,0x22,0x00,0x03,0x00,0xb4,0x00,0xb7,0x00,0x04,0x00,0xc4,0x00,0xc5,0x00,0x08,0x01,0x08,0x01,0x08,0x00,0x0a,0x01,0x10,0x01,0x11,0x00,0x0b,0x01,0x23,0x01,0x23,0x00,0x0d, +0x01,0x3b,0x01,0x3b,0x00,0x0e,0x01,0x55,0x01,0x56,0x00,0x0f,0x01,0x65,0x01,0x66,0x00,0x11,0x01,0x6a,0x01,0x6b,0x00,0x13,0x01,0x72,0x01,0x73,0x00,0x15,0x01,0x94,0x01,0x94,0x00,0x17,0x01,0x9c,0x01,0x9c,0x00,0x18,0x01,0x9e,0x01,0x9e,0x00,0x19,0x02,0x3d,0x02,0x3e,0x00,0x1a,0x02,0xaf,0x02,0xb0,0x00,0x1c,0x00,0x02,0x00,0x08, +0x00,0x01,0x0d,0xf4,0x00,0x01,0x00,0x01,0x00,0x09,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x11,0x84,0x00,0x02,0x11,0x83,0x00,0x01,0x00,0x01,0x11,0x82,0x00,0x01,0x00,0x8a,0x00,0x0b,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x00,0x62,0x00,0x6c,0x00,0x76,0x00,0x80,0x00,0x01, +0x00,0x04,0x11,0x8e,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x98,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x8f,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x90,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x91,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x92,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x93, +0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x94,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x95,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x96,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x97,0x00,0x02,0x11,0x8d,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x00,0x0c,0xcd,0x0c,0xd6,0x00,0x01,0x00,0x01,0x00,0x8a, +0x00,0x0b,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x00,0x62,0x00,0x6c,0x00,0x76,0x00,0x80,0x00,0x01,0x00,0x04,0x11,0x8e,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x98,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x8f,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x90,0x00,0x02,0x11,0x8d, +0x00,0x01,0x00,0x04,0x11,0x91,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x92,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x93,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x94,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x95,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x96,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04, +0x11,0x97,0x00,0x02,0x11,0x8d,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x13,0x00,0x1c,0x00,0x01,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xa4,0x11,0xa5,0x11,0xa6,0x11,0xa7,0x11,0xa8,0x11,0xa9,0x11,0xaa,0x11,0xab,0x11,0xac,0x11,0xad,0x00,0x02,0x00,0x01,0x0f,0xd6,0x0f,0xdf,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a, +0x11,0xb8,0x11,0xb9,0x11,0xba,0x11,0xbb,0x11,0xbc,0x11,0xbd,0x11,0xbe,0x11,0xbf,0x11,0xc0,0x11,0xc1,0x00,0x02,0x00,0x01,0x0f,0xea,0x0f,0xf3,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xae,0x11,0xaf,0x11,0xb0,0x11,0xb1,0x11,0xb2,0x11,0xb3,0x11,0xb4,0x11,0xb5,0x11,0xb6,0x11,0xb7,0x00,0x02,0x00,0x01,0x0f,0xe0,0x0f,0xe9, +0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xc2,0x11,0xc3,0x11,0xc4,0x11,0xc5,0x11,0xc6,0x11,0xc7,0x11,0xc8,0x11,0xc9,0x11,0xca,0x11,0xcb,0x00,0x02,0x00,0x01,0x0f,0xf4,0x0f,0xfd,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xcc,0x11,0xcd,0x11,0xce,0x11,0xcf,0x11,0xd0,0x11,0xd1,0x11,0xd2,0x11,0xd3,0x11,0xd4,0x11,0xd5, +0x00,0x02,0x00,0x01,0x0f,0xfe,0x10,0x07,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xd6,0x11,0xd7,0x11,0xd8,0x11,0xd9,0x11,0xda,0x11,0xdb,0x11,0xdc,0x11,0xdd,0x11,0xde,0x11,0xdf,0x00,0x02,0x00,0x01,0x10,0x08,0x10,0x11,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xe0,0x11,0xe1,0x11,0xe2,0x11,0xe3,0x11,0xe4,0x11,0xe5, +0x11,0xe6,0x11,0xe7,0x11,0xe8,0x11,0xe9,0x00,0x02,0x00,0x01,0x10,0x12,0x10,0x1b,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xea,0x11,0xeb,0x11,0xec,0x11,0xed,0x11,0xee,0x11,0xef,0x11,0xf0,0x11,0xf1,0x11,0xf2,0x11,0xf3,0x00,0x02,0x00,0x01,0x10,0x1c,0x10,0x25,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xf4,0x11,0xf5, +0x11,0xf6,0x11,0xf7,0x11,0xf8,0x11,0xf9,0x11,0xfa,0x11,0xfb,0x11,0xfc,0x11,0xfd,0x00,0x02,0x00,0x01,0x10,0x26,0x10,0x2f,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xfe,0x11,0xff,0x12,0x00,0x12,0x01,0x12,0x02,0x12,0x03,0x12,0x04,0x12,0x05,0x12,0x06,0x12,0x07,0x00,0x02,0x00,0x01,0x10,0x30,0x10,0x39,0x00,0x00,0x00,0x02, +0x00,0x1a,0x00,0x0a,0x12,0x08,0x12,0x09,0x12,0x0a,0x12,0x0b,0x12,0x0c,0x12,0x0d,0x12,0x0e,0x12,0x0f,0x12,0x10,0x12,0x11,0x00,0x02,0x00,0x01,0x10,0x3a,0x10,0x43,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x12,0x12,0x13,0x12,0x14,0x12,0x15,0x12,0x16,0x12,0x17,0x12,0x18,0x12,0x19,0x12,0x1a,0x12,0x1b,0x00,0x02,0x00,0x01, +0x10,0x44,0x10,0x4d,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x1c,0x12,0x1d,0x12,0x1e,0x12,0x1f,0x12,0x20,0x12,0x21,0x12,0x22,0x12,0x23,0x12,0x24,0x12,0x25,0x00,0x02,0x00,0x01,0x10,0x4e,0x10,0x57,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x26,0x12,0x27,0x12,0x28,0x12,0x29,0x12,0x2a,0x12,0x2b,0x12,0x2c,0x12,0x2d, +0x12,0x2e,0x12,0x2f,0x00,0x02,0x00,0x01,0x10,0x58,0x10,0x61,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x30,0x12,0x31,0x12,0x32,0x12,0x33,0x12,0x34,0x12,0x35,0x12,0x36,0x12,0x37,0x12,0x38,0x12,0x39,0x00,0x02,0x00,0x01,0x10,0x62,0x10,0x6b,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x3a,0x12,0x3b,0x12,0x3c,0x12,0x3d, +0x12,0x3e,0x12,0x3f,0x12,0x40,0x12,0x41,0x12,0x42,0x12,0x43,0x00,0x02,0x00,0x01,0x10,0x6c,0x10,0x75,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x44,0x12,0x45,0x12,0x46,0x12,0x47,0x12,0x48,0x12,0x49,0x12,0x4a,0x12,0x4b,0x12,0x4c,0x12,0x4d,0x00,0x02,0x00,0x01,0x10,0x76,0x10,0x7f,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a, +0x12,0x4f,0x12,0x50,0x12,0x51,0x12,0x52,0x12,0x53,0x12,0x54,0x12,0x55,0x12,0x56,0x12,0x57,0x12,0x58,0x00,0x02,0x00,0x01,0x10,0x81,0x10,0x8a,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0xb7,0x00,0x02,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x08,0x00,0x01, +0x00,0x04,0x0b,0xb7,0x00,0x03,0x08,0xc4,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x02,0x00,0x82,0x00,0x88,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x02, +0x00,0x6e,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x02,0x00,0x5a,0x00,0x94,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x00,0x01,0x0b,0x7a,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b, +0x0b,0xb9,0x0b,0xb9,0x00,0x0c,0x0b,0xbf,0x0b,0xbf,0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02, +0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0xc8,0x00,0x03,0x00,0x02,0x02,0xbc,0x02,0xea,0x00,0x01,0x02,0xf0,0x00,0x01,0x02,0xf6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x02,0xa6, +0x02,0xa6,0x02,0xd4,0x00,0x01,0x02,0xda,0x00,0x01,0x02,0xe0,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x02,0x8e,0x02,0xf0,0x02,0xbc,0x00,0x01,0x02,0xc2,0x00,0x01,0x02,0xc8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x02,0x76,0x02,0x76,0x02,0xd8,0x02,0xa4,0x00,0x01,0x02,0xaa,0x00,0x01,0x02,0xb0,0x00,0x01, +0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0xc6,0x00,0x01,0x02,0x90,0x00,0x01,0x02,0xcc,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x02,0x48,0x02,0xb2,0x00,0x01,0x02,0x7c,0x00,0x01,0x02,0xb8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x9c,0x00,0x01,0x02,0x66,0x00,0x02,0x02,0xdc,0x02,0x32,0x00,0x01, +0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x02,0x1c,0x02,0x86,0x00,0x01,0x02,0x50,0x00,0x02,0x02,0xc6,0x02,0x1c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x6e,0x00,0x01,0x02,0x38,0x00,0x03,0x02,0xae,0x02,0xb4,0x02,0xba,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0xec,0x02,0x56,0x00,0x01,0x02,0x20, +0x00,0x03,0x02,0x96,0x02,0x9c,0x02,0xa2,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x3c,0x00,0x01,0x02,0x06,0x00,0x03,0x02,0x7c,0x02,0x82,0x02,0x3c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0xba,0x02,0x24,0x00,0x01,0x01,0xee,0x00,0x03,0x02,0x64,0x02,0x6a,0x02,0x24,0x00,0x01,0x00,0x00,0x00,0x76, +0x00,0x03,0x00,0x01,0x02,0x5c,0x00,0x01,0x01,0xd4,0x00,0x01,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x48,0x00,0x01,0x01,0xc0,0x00,0x02,0x02,0x36,0x01,0x8c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x32,0x00,0x01,0x01,0xaa,0x00,0x03,0x02,0x20,0x02,0x26,0x01,0xe0,0x00,0x01,0x00,0x00, +0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x1a,0x00,0x01,0x01,0x92,0x00,0x03,0x02,0x08,0x02,0x0e,0x02,0x14,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x46,0x02,0x02,0x00,0x01,0x01,0x7a,0x00,0x01,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x30,0x01,0xec,0x00,0x01,0x01,0x64,0x00,0x02,0x01,0xda, +0x01,0x30,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x18,0x01,0xd4,0x00,0x01,0x01,0x4c,0x00,0x03,0x01,0xc2,0x01,0xc8,0x01,0x82,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x00,0xfe,0x01,0xba,0x00,0x01,0x01,0x32,0x00,0x03,0x01,0xa8,0x01,0xae,0x01,0xb4,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02, +0x01,0xa6,0x01,0xac,0x00,0x01,0x01,0x18,0x00,0x01,0x01,0x1e,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x01,0x90,0x01,0x84,0x01,0x96,0x00,0x01,0x01,0x02,0x00,0x01,0x01,0x08,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x01,0x6c,0x01,0x78,0x01,0x7e,0x00,0x01,0x00,0xea,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0x00, +0x00,0x76,0x00,0x03,0x00,0x03,0x00,0x9e,0x01,0x60,0x01,0x66,0x00,0x01,0x00,0xd2,0x00,0x01,0x00,0xd8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x86,0x00,0x86,0x01,0x48,0x01,0x4e,0x00,0x01,0x00,0xba,0x00,0x01,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x6c,0x01,0x2e,0x01,0x22,0x01,0x34, +0x00,0x01,0x00,0xa0,0x00,0x01,0x00,0xa6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x05,0x00,0x52,0x00,0x52,0x01,0x14,0x01,0x08,0x01,0x1a,0x00,0x01,0x00,0x86,0x00,0x01,0x00,0x8c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x36,0x00,0xec,0x00,0xf8,0x00,0xfe,0x00,0x01,0x00,0x6a,0x00,0x01,0x00,0x70,0x00,0x01, +0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x05,0x00,0x1c,0x00,0x1c,0x00,0xd2,0x00,0xde,0x00,0xe4,0x00,0x01,0x00,0x50,0x00,0x01,0x00,0x56,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd, +0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62, +0x00,0x4c,0x00,0x01,0x00,0x02,0x0b,0x5e,0x0b,0x61,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0, +0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0x5e,0x00,0x01,0x00,0x01,0x0b,0xde,0x00,0x01,0x00,0x01,0x0b,0x64,0x00,0x01,0x00,0x01,0x0b,0x81,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0xd8,0x00,0x01,0x00,0x01,0x0b,0xd0,0x00,0x01,0x00,0x16, +0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0x8c,0x00,0x04,0x08,0xc4,0x0b,0x71,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x71,0x00,0x01,0x00,0x2a,0x00,0x03,0x00,0x0c,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x04,0x12,0x59,0x00,0x02,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5a,0x00,0x02,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5b,0x00,0x02, +0x0b,0x5f,0x00,0x02,0x00,0x01,0x0b,0x54,0x0b,0x56,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x03,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x01,0x00,0x04,0x12,0x59,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5a,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5b,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x02,0x00,0x01, +0x0b,0x54,0x0b,0x56,0x00,0x00,0x00,0x01,0x01,0xaa,0x00,0x01,0x00,0x08,0x00,0x34,0x00,0x6a,0x00,0x70,0x00,0x76,0x00,0x7c,0x00,0x82,0x00,0x88,0x00,0x8e,0x00,0x94,0x00,0x9a,0x00,0xa0,0x00,0xa6,0x00,0xac,0x00,0xb2,0x00,0xb8,0x00,0xbe,0x00,0xc4,0x00,0xca,0x00,0xd0,0x00,0xd6,0x00,0xdc,0x00,0xe2,0x00,0xe8,0x00,0xee,0x00,0xf4, +0x00,0xfa,0x01,0x00,0x01,0x06,0x01,0x0c,0x01,0x12,0x01,0x18,0x01,0x1e,0x01,0x24,0x01,0x2a,0x01,0x30,0x01,0x36,0x01,0x3c,0x01,0x42,0x01,0x48,0x01,0x4e,0x01,0x54,0x01,0x5a,0x01,0x60,0x01,0x66,0x01,0x6c,0x01,0x72,0x01,0x78,0x01,0x7e,0x01,0x84,0x01,0x8a,0x01,0x90,0x01,0x96,0x01,0x9c,0x0b,0x53,0x00,0x02,0x0b,0x53,0x0b,0x54, +0x00,0x02,0x0b,0x54,0x0b,0x55,0x00,0x02,0x0b,0x55,0x0b,0x56,0x00,0x02,0x0b,0x56,0x0b,0x57,0x00,0x02,0x0b,0x57,0x0b,0x58,0x00,0x02,0x0b,0x58,0x0b,0x59,0x00,0x02,0x0b,0x59,0x0b,0x5a,0x00,0x02,0x0b,0x5a,0x0b,0x5b,0x00,0x02,0x0b,0x5b,0x0b,0x5c,0x00,0x02,0x0b,0x5c,0x0b,0x5d,0x00,0x02,0x0b,0x5d,0x0b,0x5e,0x00,0x02,0x0b,0x5e, +0x0b,0x5f,0x00,0x02,0x0b,0x5f,0x0b,0x61,0x00,0x02,0x0b,0x61,0x0b,0x66,0x00,0x02,0x0b,0x66,0x0b,0x67,0x00,0x02,0x0b,0x67,0x0b,0xb9,0x00,0x02,0x0b,0xb9,0x0b,0xbf,0x00,0x02,0x0b,0xbf,0x0b,0xc0,0x00,0x02,0x0b,0xc0,0x0b,0xc1,0x00,0x02,0x0b,0xc1,0x0b,0xc2,0x00,0x02,0x0b,0xc2,0x0b,0xc3,0x00,0x02,0x0b,0xc3,0x0b,0xc4,0x00,0x02, +0x0b,0xc4,0x0b,0xc5,0x00,0x02,0x0b,0xc5,0x0b,0xc6,0x00,0x02,0x0b,0xc6,0x0b,0xc7,0x00,0x02,0x0b,0xc7,0x0b,0xc8,0x00,0x02,0x0b,0xc8,0x0b,0xc9,0x00,0x02,0x0b,0xc9,0x0b,0xca,0x00,0x02,0x0b,0xca,0x0b,0xcb,0x00,0x02,0x0b,0xcb,0x0b,0xcc,0x00,0x02,0x0b,0xcc,0x0b,0xcd,0x00,0x02,0x0b,0xcd,0x0b,0xce,0x00,0x02,0x0b,0xce,0x0b,0xcf, +0x00,0x02,0x0b,0xcf,0x0b,0xd0,0x00,0x02,0x0b,0xd0,0x0b,0xd1,0x00,0x02,0x0b,0xd1,0x0b,0xd2,0x00,0x02,0x0b,0xd2,0x0b,0xd3,0x00,0x02,0x0b,0xd3,0x0b,0xd4,0x00,0x02,0x0b,0xd4,0x0b,0xd5,0x00,0x02,0x0b,0xd5,0x0b,0xd6,0x00,0x02,0x0b,0xd6,0x0b,0xd7,0x00,0x02,0x0b,0xd7,0x0b,0xd8,0x00,0x02,0x0b,0xd8,0x0b,0xd9,0x00,0x02,0x0b,0xd9, +0x0b,0xda,0x00,0x02,0x0b,0xda,0x0b,0xdb,0x00,0x02,0x0b,0xdb,0x0b,0xdc,0x00,0x02,0x0b,0xdc,0x0b,0xdd,0x00,0x02,0x0b,0xdd,0x0b,0xe1,0x00,0x02,0x0b,0xe1,0x12,0x5c,0x00,0x02,0x12,0x5c,0x12,0x5d,0x00,0x02,0x12,0x5d,0x12,0x5e,0x00,0x02,0x12,0x5e,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01, +0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x1a, +0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xdf,0x00,0x02,0x07,0x39,0x0b,0xdf,0x00,0x02,0x08,0xc4,0x00,0x01,0x00,0x01,0x0b,0x78,0x00,0x01,0x0e,0x76,0x00,0x84,0x01,0x0e,0x01,0x28,0x01,0x42,0x01,0x5c,0x01,0x76,0x01,0x90,0x01,0xaa,0x01,0xc4,0x01,0xde,0x01,0xf8,0x02,0x12,0x02,0x2c,0x02,0x46,0x02,0x60,0x02,0x7a, +0x02,0x94,0x02,0xae,0x02,0xc8,0x02,0xe2,0x02,0xfc,0x03,0x16,0x03,0x30,0x03,0x4a,0x03,0x64,0x03,0x7e,0x03,0x98,0x03,0xb2,0x03,0xcc,0x03,0xe6,0x04,0x00,0x04,0x1a,0x04,0x34,0x04,0x4e,0x04,0x68,0x04,0x82,0x04,0x9c,0x04,0xb6,0x04,0xd0,0x04,0xea,0x05,0x04,0x05,0x1e,0x05,0x38,0x05,0x52,0x05,0x6c,0x05,0x86,0x05,0xa0,0x05,0xba, +0x05,0xd4,0x05,0xee,0x06,0x08,0x06,0x22,0x06,0x3c,0x06,0x56,0x06,0x70,0x06,0x8a,0x06,0xa4,0x06,0xbe,0x06,0xd8,0x06,0xf2,0x07,0x0c,0x07,0x26,0x07,0x40,0x07,0x5a,0x07,0x74,0x07,0x8e,0x07,0xa8,0x07,0xc2,0x07,0xdc,0x07,0xf6,0x08,0x10,0x08,0x2a,0x08,0x44,0x08,0x5e,0x08,0x78,0x08,0x92,0x08,0xac,0x08,0xc6,0x08,0xe0,0x08,0xfa, +0x09,0x14,0x09,0x2e,0x09,0x48,0x09,0x62,0x09,0x7c,0x09,0x96,0x09,0xb0,0x09,0xca,0x09,0xe4,0x09,0xfe,0x0a,0x18,0x0a,0x32,0x0a,0x4c,0x0a,0x66,0x0a,0x80,0x0a,0x9a,0x0a,0xb4,0x0a,0xce,0x0a,0xe8,0x0b,0x02,0x0b,0x1c,0x0b,0x36,0x0b,0x50,0x0b,0x6a,0x0b,0x84,0x0b,0x9e,0x0b,0xb8,0x0b,0xd2,0x0b,0xec,0x0c,0x06,0x0c,0x20,0x0c,0x3a, +0x0c,0x54,0x0c,0x6e,0x0c,0x88,0x0c,0xa2,0x0c,0xbc,0x0c,0xd6,0x0c,0xf0,0x0d,0x0a,0x0d,0x24,0x0d,0x3e,0x0d,0x58,0x0d,0x72,0x0d,0x8c,0x0d,0xa6,0x0d,0xc0,0x0d,0xda,0x0d,0xf4,0x0e,0x0e,0x0e,0x28,0x0e,0x42,0x0e,0x5c,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0a,0x43,0x00,0x02,0x07,0x39,0x0a,0x43,0x00,0x02,0x08,0xc4,0x0a,0x43, +0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x53,0x00,0x02,0x07,0x39,0x0b,0x53,0x00,0x02,0x08,0xc4,0x0b,0x53,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x54,0x00,0x02,0x07,0x39,0x0b,0x54,0x00,0x02,0x08,0xc4,0x0b,0x54,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, +0x0b,0x55,0x00,0x02,0x07,0x39,0x0b,0x55,0x00,0x02,0x08,0xc4,0x0b,0x55,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x56,0x00,0x02,0x07,0x39,0x0b,0x56,0x00,0x02,0x08,0xc4,0x0b,0x56,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x57,0x00,0x02,0x07,0x39,0x0b,0x57,0x00,0x02,0x08,0xc4, +0x0b,0x57,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x58,0x00,0x02,0x07,0x39,0x0b,0x58,0x00,0x02,0x08,0xc4,0x0b,0x58,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x59,0x00,0x02,0x07,0x39,0x0b,0x59,0x00,0x02,0x08,0xc4,0x0b,0x59,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e, +0x00,0x14,0x0b,0x5a,0x00,0x02,0x07,0x39,0x0b,0x5a,0x00,0x02,0x08,0xc4,0x0b,0x5a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5b,0x00,0x02,0x07,0x39,0x0b,0x5b,0x00,0x02,0x08,0xc4,0x0b,0x5b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5c,0x00,0x02,0x07,0x39,0x0b,0x5c,0x00,0x02, +0x08,0xc4,0x0b,0x5c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5d,0x00,0x02,0x07,0x39,0x0b,0x5d,0x00,0x02,0x08,0xc4,0x0b,0x5d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5e,0x00,0x02,0x07,0x39,0x0b,0x5e,0x00,0x02,0x08,0xc4,0x0b,0x5e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08, +0x00,0x0e,0x00,0x14,0x0b,0x5f,0x00,0x02,0x07,0x39,0x0b,0x5f,0x00,0x02,0x08,0xc4,0x0b,0x5f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x61,0x00,0x02,0x07,0x39,0x0b,0x61,0x00,0x02,0x08,0xc4,0x0b,0x61,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x66,0x00,0x02,0x07,0x39,0x0b,0x66, +0x00,0x02,0x08,0xc4,0x0b,0x66,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x67,0x00,0x02,0x07,0x39,0x0b,0x67,0x00,0x02,0x08,0xc4,0x0b,0x67,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x68,0x00,0x02,0x07,0x39,0x0b,0x68,0x00,0x02,0x08,0xc4,0x0b,0x68,0x00,0x02,0x08,0xc3,0x00,0x03, +0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x69,0x00,0x02,0x07,0x39,0x0b,0x69,0x00,0x02,0x08,0xc4,0x0b,0x69,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6a,0x00,0x02,0x07,0x39,0x0b,0x6a,0x00,0x02,0x08,0xc4,0x0b,0x6a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6b,0x00,0x02,0x07,0x39, +0x0b,0x6b,0x00,0x02,0x08,0xc4,0x0b,0x6b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6c,0x00,0x02,0x07,0x39,0x0b,0x6c,0x00,0x02,0x08,0xc4,0x0b,0x6c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6d,0x00,0x02,0x07,0x39,0x0b,0x6d,0x00,0x02,0x08,0xc4,0x0b,0x6d,0x00,0x02,0x08,0xc3, +0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6e,0x00,0x02,0x07,0x39,0x0b,0x6e,0x00,0x02,0x08,0xc4,0x0b,0x6e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6f,0x00,0x02,0x07,0x39,0x0b,0x6f,0x00,0x02,0x08,0xc4,0x0b,0x6f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x70,0x00,0x02, +0x07,0x39,0x0b,0x70,0x00,0x02,0x08,0xc4,0x0b,0x70,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x71,0x00,0x02,0x07,0x39,0x0b,0x71,0x00,0x02,0x08,0xc4,0x0b,0x71,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x72,0x00,0x02,0x07,0x39,0x0b,0x72,0x00,0x02,0x08,0xc4,0x0b,0x72,0x00,0x02, +0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x73,0x00,0x02,0x07,0x39,0x0b,0x73,0x00,0x02,0x08,0xc4,0x0b,0x73,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x74,0x00,0x02,0x07,0x39,0x0b,0x74,0x00,0x02,0x08,0xc4,0x0b,0x74,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x75, +0x00,0x02,0x07,0x39,0x0b,0x75,0x00,0x02,0x08,0xc4,0x0b,0x75,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x76,0x00,0x02,0x07,0x39,0x0b,0x76,0x00,0x02,0x08,0xc4,0x0b,0x76,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x77,0x00,0x02,0x07,0x39,0x0b,0x77,0x00,0x02,0x08,0xc4,0x0b,0x77, +0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x78,0x00,0x02,0x07,0x39,0x0b,0x78,0x00,0x02,0x08,0xc4,0x0b,0x78,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x79,0x00,0x02,0x07,0x39,0x0b,0x79,0x00,0x02,0x08,0xc4,0x0b,0x79,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, +0x0b,0x7a,0x00,0x02,0x07,0x39,0x0b,0x7a,0x00,0x02,0x08,0xc4,0x0b,0x7a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7b,0x00,0x02,0x07,0x39,0x0b,0x7b,0x00,0x02,0x08,0xc4,0x0b,0x7b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7c,0x00,0x02,0x07,0x39,0x0b,0x7c,0x00,0x02,0x08,0xc4, +0x0b,0x7c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7d,0x00,0x02,0x07,0x39,0x0b,0x7d,0x00,0x02,0x08,0xc4,0x0b,0x7d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7e,0x00,0x02,0x07,0x39,0x0b,0x7e,0x00,0x02,0x08,0xc4,0x0b,0x7e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e, +0x00,0x14,0x0b,0x7f,0x00,0x02,0x07,0x39,0x0b,0x7f,0x00,0x02,0x08,0xc4,0x0b,0x7f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x80,0x00,0x02,0x07,0x39,0x0b,0x80,0x00,0x02,0x08,0xc4,0x0b,0x80,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x81,0x00,0x02,0x07,0x39,0x0b,0x81,0x00,0x02, +0x08,0xc4,0x0b,0x81,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x82,0x00,0x02,0x07,0x39,0x0b,0x82,0x00,0x02,0x08,0xc4,0x0b,0x82,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x83,0x00,0x02,0x07,0x39,0x0b,0x83,0x00,0x02,0x08,0xc4,0x0b,0x83,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08, +0x00,0x0e,0x00,0x14,0x0b,0x84,0x00,0x02,0x07,0x39,0x0b,0x84,0x00,0x02,0x08,0xc4,0x0b,0x84,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x85,0x00,0x02,0x07,0x39,0x0b,0x85,0x00,0x02,0x08,0xc4,0x0b,0x85,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x88,0x00,0x02,0x07,0x39,0x0b,0x88, +0x00,0x02,0x08,0xc4,0x0b,0x88,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x89,0x00,0x02,0x07,0x39,0x0b,0x89,0x00,0x02,0x08,0xc4,0x0b,0x89,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8a,0x00,0x02,0x07,0x39,0x0b,0x8a,0x00,0x02,0x08,0xc4,0x0b,0x8a,0x00,0x02,0x08,0xc3,0x00,0x03, +0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8b,0x00,0x02,0x07,0x39,0x0b,0x8b,0x00,0x02,0x08,0xc4,0x0b,0x8b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8c,0x00,0x02,0x07,0x39,0x0b,0x8c,0x00,0x02,0x08,0xc4,0x0b,0x8c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8d,0x00,0x02,0x07,0x39, +0x0b,0x8d,0x00,0x02,0x08,0xc4,0x0b,0x8d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8e,0x00,0x02,0x07,0x39,0x0b,0x8e,0x00,0x02,0x08,0xc4,0x0b,0x8e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8f,0x00,0x02,0x07,0x39,0x0b,0x8f,0x00,0x02,0x08,0xc4,0x0b,0x8f,0x00,0x02,0x08,0xc3, +0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x90,0x00,0x02,0x07,0x39,0x0b,0x90,0x00,0x02,0x08,0xc4,0x0b,0x90,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x91,0x00,0x02,0x07,0x39,0x0b,0x91,0x00,0x02,0x08,0xc4,0x0b,0x91,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x92,0x00,0x02, +0x07,0x39,0x0b,0x92,0x00,0x02,0x08,0xc4,0x0b,0x92,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x93,0x00,0x02,0x07,0x39,0x0b,0x93,0x00,0x02,0x08,0xc4,0x0b,0x93,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x94,0x00,0x02,0x07,0x39,0x0b,0x94,0x00,0x02,0x08,0xc4,0x0b,0x94,0x00,0x02, +0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x95,0x00,0x02,0x07,0x39,0x0b,0x95,0x00,0x02,0x08,0xc4,0x0b,0x95,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x97,0x00,0x02,0x07,0x39,0x0b,0x97,0x00,0x02,0x08,0xc4,0x0b,0x97,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x98, +0x00,0x02,0x07,0x39,0x0b,0x98,0x00,0x02,0x08,0xc4,0x0b,0x98,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x99,0x00,0x02,0x07,0x39,0x0b,0x99,0x00,0x02,0x08,0xc4,0x0b,0x99,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9a,0x00,0x02,0x07,0x39,0x0b,0x9a,0x00,0x02,0x08,0xc4,0x0b,0x9a, +0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9d,0x00,0x02,0x07,0x39,0x0b,0x9d,0x00,0x02,0x08,0xc4,0x0b,0x9d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9e,0x00,0x02,0x07,0x39,0x0b,0x9e,0x00,0x02,0x08,0xc4,0x0b,0x9e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, +0x0b,0x9f,0x00,0x02,0x07,0x39,0x0b,0x9f,0x00,0x02,0x08,0xc4,0x0b,0x9f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa0,0x00,0x02,0x07,0x39,0x0b,0xa0,0x00,0x02,0x08,0xc4,0x0b,0xa0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa1,0x00,0x02,0x07,0x39,0x0b,0xa1,0x00,0x02,0x08,0xc4, +0x0b,0xa1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa2,0x00,0x02,0x07,0x39,0x0b,0xa2,0x00,0x02,0x08,0xc4,0x0b,0xa2,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa3,0x00,0x02,0x07,0x39,0x0b,0xa3,0x00,0x02,0x08,0xc4,0x0b,0xa3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e, +0x00,0x14,0x0b,0xa4,0x00,0x02,0x07,0x39,0x0b,0xa4,0x00,0x02,0x08,0xc4,0x0b,0xa4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa5,0x00,0x02,0x07,0x39,0x0b,0xa5,0x00,0x02,0x08,0xc4,0x0b,0xa5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa6,0x00,0x02,0x07,0x39,0x0b,0xa6,0x00,0x02, +0x08,0xc4,0x0b,0xa6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa7,0x00,0x02,0x07,0x39,0x0b,0xa7,0x00,0x02,0x08,0xc4,0x0b,0xa7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa8,0x00,0x02,0x07,0x39,0x0b,0xa8,0x00,0x02,0x08,0xc4,0x0b,0xa8,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08, +0x00,0x0e,0x00,0x14,0x0b,0xa9,0x00,0x02,0x07,0x39,0x0b,0xa9,0x00,0x02,0x08,0xc4,0x0b,0xa9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xaa,0x00,0x02,0x07,0x39,0x0b,0xaa,0x00,0x02,0x08,0xc4,0x0b,0xaa,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xab,0x00,0x02,0x07,0x39,0x0b,0xab, +0x00,0x02,0x08,0xc4,0x0b,0xab,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xac,0x00,0x02,0x07,0x39,0x0b,0xac,0x00,0x02,0x08,0xc4,0x0b,0xac,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xad,0x00,0x02,0x07,0x39,0x0b,0xad,0x00,0x02,0x08,0xc4,0x0b,0xad,0x00,0x02,0x08,0xc3,0x00,0x03, +0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xae,0x00,0x02,0x07,0x39,0x0b,0xae,0x00,0x02,0x08,0xc4,0x0b,0xae,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xaf,0x00,0x02,0x07,0x39,0x0b,0xaf,0x00,0x02,0x08,0xc4,0x0b,0xaf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb0,0x00,0x02,0x07,0x39, +0x0b,0xb0,0x00,0x02,0x08,0xc4,0x0b,0xb0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb1,0x00,0x02,0x07,0x39,0x0b,0xb1,0x00,0x02,0x08,0xc4,0x0b,0xb1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb2,0x00,0x02,0x07,0x39,0x0b,0xb2,0x00,0x02,0x08,0xc4,0x0b,0xb2,0x00,0x02,0x08,0xc3, +0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb3,0x00,0x02,0x07,0x39,0x0b,0xb3,0x00,0x02,0x08,0xc4,0x0b,0xb3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb4,0x00,0x02,0x07,0x39,0x0b,0xb4,0x00,0x02,0x08,0xc4,0x0b,0xb4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb5,0x00,0x02, +0x07,0x39,0x0b,0xb5,0x00,0x02,0x08,0xc4,0x0b,0xb5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb6,0x00,0x02,0x07,0x39,0x0b,0xb6,0x00,0x02,0x08,0xc4,0x0b,0xb6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb7,0x00,0x02,0x07,0x39,0x0b,0xb7,0x00,0x02,0x08,0xc4,0x0b,0xb7,0x00,0x02, +0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb9,0x00,0x02,0x07,0x39,0x0b,0xb9,0x00,0x02,0x08,0xc4,0x0b,0xb9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xbf,0x00,0x02,0x07,0x39,0x0b,0xbf,0x00,0x02,0x08,0xc4,0x0b,0xbf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc0, +0x00,0x02,0x07,0x39,0x0b,0xc0,0x00,0x02,0x08,0xc4,0x0b,0xc0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc1,0x00,0x02,0x07,0x39,0x0b,0xc1,0x00,0x02,0x08,0xc4,0x0b,0xc1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc2,0x00,0x02,0x07,0x39,0x0b,0xc2,0x00,0x02,0x08,0xc4,0x0b,0xc2, +0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc3,0x00,0x02,0x07,0x39,0x0b,0xc3,0x00,0x02,0x08,0xc4,0x0b,0xc3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc4,0x00,0x02,0x07,0x39,0x0b,0xc4,0x00,0x02,0x08,0xc4,0x0b,0xc4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, +0x0b,0xc5,0x00,0x02,0x07,0x39,0x0b,0xc5,0x00,0x02,0x08,0xc4,0x0b,0xc5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc6,0x00,0x02,0x07,0x39,0x0b,0xc6,0x00,0x02,0x08,0xc4,0x0b,0xc6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc7,0x00,0x02,0x07,0x39,0x0b,0xc7,0x00,0x02,0x08,0xc4, +0x0b,0xc7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc8,0x00,0x02,0x07,0x39,0x0b,0xc8,0x00,0x02,0x08,0xc4,0x0b,0xc8,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc9,0x00,0x02,0x07,0x39,0x0b,0xc9,0x00,0x02,0x08,0xc4,0x0b,0xc9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e, +0x00,0x14,0x0b,0xca,0x00,0x02,0x07,0x39,0x0b,0xca,0x00,0x02,0x08,0xc4,0x0b,0xca,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcb,0x00,0x02,0x07,0x39,0x0b,0xcb,0x00,0x02,0x08,0xc4,0x0b,0xcb,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcc,0x00,0x02,0x07,0x39,0x0b,0xcc,0x00,0x02, +0x08,0xc4,0x0b,0xcc,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcd,0x00,0x02,0x07,0x39,0x0b,0xcd,0x00,0x02,0x08,0xc4,0x0b,0xcd,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xce,0x00,0x02,0x07,0x39,0x0b,0xce,0x00,0x02,0x08,0xc4,0x0b,0xce,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08, +0x00,0x0e,0x00,0x14,0x0b,0xcf,0x00,0x02,0x07,0x39,0x0b,0xcf,0x00,0x02,0x08,0xc4,0x0b,0xcf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd0,0x00,0x02,0x07,0x39,0x0b,0xd0,0x00,0x02,0x08,0xc4,0x0b,0xd0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd1,0x00,0x02,0x07,0x39,0x0b,0xd1, +0x00,0x02,0x08,0xc4,0x0b,0xd1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd2,0x00,0x02,0x07,0x39,0x0b,0xd2,0x00,0x02,0x08,0xc4,0x0b,0xd2,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd3,0x00,0x02,0x07,0x39,0x0b,0xd3,0x00,0x02,0x08,0xc4,0x0b,0xd3,0x00,0x02,0x08,0xc3,0x00,0x03, +0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd4,0x00,0x02,0x07,0x39,0x0b,0xd4,0x00,0x02,0x08,0xc4,0x0b,0xd4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd5,0x00,0x02,0x07,0x39,0x0b,0xd5,0x00,0x02,0x08,0xc4,0x0b,0xd5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd6,0x00,0x02,0x07,0x39, +0x0b,0xd6,0x00,0x02,0x08,0xc4,0x0b,0xd6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd7,0x00,0x02,0x07,0x39,0x0b,0xd7,0x00,0x02,0x08,0xc4,0x0b,0xd7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd8,0x00,0x02,0x07,0x39,0x0b,0xd8,0x00,0x02,0x08,0xc4,0x0b,0xd8,0x00,0x02,0x08,0xc3, +0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd9,0x00,0x02,0x07,0x39,0x0b,0xd9,0x00,0x02,0x08,0xc4,0x0b,0xd9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xda,0x00,0x02,0x07,0x39,0x0b,0xda,0x00,0x02,0x08,0xc4,0x0b,0xda,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdb,0x00,0x02, +0x07,0x39,0x0b,0xdb,0x00,0x02,0x08,0xc4,0x0b,0xdb,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdc,0x00,0x02,0x07,0x39,0x0b,0xdc,0x00,0x02,0x08,0xc4,0x0b,0xdc,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdd,0x00,0x02,0x07,0x39,0x0b,0xdd,0x00,0x02,0x08,0xc4,0x0b,0xdd,0x00,0x02, +0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xe1,0x00,0x02,0x07,0x39,0x0b,0xe1,0x00,0x02,0x08,0xc4,0x0b,0xe1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5c,0x00,0x02,0x07,0x39,0x12,0x5c,0x00,0x02,0x08,0xc4,0x12,0x5c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5d, +0x00,0x02,0x07,0x39,0x12,0x5d,0x00,0x02,0x08,0xc4,0x12,0x5d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5e,0x00,0x02,0x07,0x39,0x12,0x5e,0x00,0x02,0x08,0xc4,0x12,0x5e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5f,0x00,0x02,0x07,0x39,0x12,0x5f,0x00,0x02,0x08,0xc4,0x12,0x5f, +0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x60,0x00,0x02,0x07,0x39,0x12,0x60,0x00,0x02,0x08,0xc4,0x12,0x60,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x61,0x00,0x02,0x07,0x39,0x12,0x61,0x00,0x02,0x08,0xc4,0x12,0x61,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14, +0x12,0x62,0x00,0x02,0x07,0x39,0x12,0x62,0x00,0x02,0x08,0xc4,0x12,0x62,0x00,0x02,0x08,0xc3,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a,0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41, +0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd,0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x01,0x00,0xa2,0x00,0x0d,0x00,0x20,0x00,0x2a,0x00,0x34,0x00,0x3e,0x00,0x48,0x00,0x52,0x00,0x5c,0x00,0x66,0x00,0x70,0x00,0x7a,0x00,0x84,0x00,0x8e,0x00,0x98,0x00,0x01,0x00,0x04,0x0b,0x53,0x00,0x02, +0x0b,0x53,0x00,0x01,0x00,0x04,0x0b,0x54,0x00,0x02,0x0b,0x54,0x00,0x01,0x00,0x04,0x0b,0x55,0x00,0x02,0x0b,0x55,0x00,0x01,0x00,0x04,0x0b,0x56,0x00,0x02,0x0b,0x56,0x00,0x01,0x00,0x04,0x0b,0x57,0x00,0x02,0x0b,0x57,0x00,0x01,0x00,0x04,0x0b,0x58,0x00,0x02,0x0b,0x58,0x00,0x01,0x00,0x04,0x0b,0x59,0x00,0x02,0x0b,0x59,0x00,0x01, +0x00,0x04,0x0b,0x5a,0x00,0x02,0x0b,0x5a,0x00,0x01,0x00,0x04,0x0b,0x5b,0x00,0x02,0x0b,0x5b,0x00,0x01,0x00,0x04,0x0b,0x5c,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x04,0x0b,0x5d,0x00,0x02,0x0b,0x5d,0x00,0x01,0x00,0x04,0x0b,0xb9,0x00,0x02,0x0b,0xb9,0x00,0x01,0x00,0x04,0x0b,0xde,0x00,0x02,0x0b,0xde,0x00,0x02,0x00,0x03,0x0b,0x53, +0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x0b,0xde,0x0b,0xde,0x00,0x0c,0x00,0x01,0x01,0x5a,0x00,0x16,0x00,0x32,0x00,0x3c,0x00,0x4e,0x00,0x60,0x00,0x72,0x00,0x84,0x00,0x8e,0x00,0x98,0x00,0xa2,0x00,0xac,0x00,0xb6,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x01,0x0c,0x01,0x16,0x01,0x20,0x01,0x2a, +0x01,0x48,0x00,0x01,0x00,0x04,0x0b,0x9d,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x9e,0x00,0x02,0x0b,0x5e,0x0b,0xb4,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x9f,0x00,0x02,0x0b,0x5e,0x12,0x5f,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa0,0x00,0x02,0x0b,0x5e,0x12,0x60,0x00,0x02, +0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa1,0x00,0x02,0x0b,0x5e,0x12,0x61,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xa2,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa3,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa4,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa5,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04, +0x0b,0xa6,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa7,0x00,0x02,0x0b,0x5e,0x0b,0xb5,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xa8,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa9,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xaa,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xab,0x00,0x02,0x0b,0x5e, +0x00,0x01,0x00,0x04,0x0b,0xac,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xad,0x00,0x02,0x0b,0x5e,0x0b,0xb6,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xae,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xaf,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xb0,0x00,0x02,0x0b,0x5e,0x00,0x03,0x00,0x08,0x00,0x0e, +0x00,0x16,0x0b,0xb1,0x00,0x02,0x0b,0x5e,0x0b,0x99,0x00,0x03,0x0b,0x63,0x0b,0x5e,0x0b,0x9a,0x00,0x03,0x0b,0x64,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xb2,0x00,0x02,0x0b,0x5e,0x12,0x62,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x0b,0x68,0x0b,0x6e,0x00,0x00,0x0b,0x70,0x0b,0x74,0x00,0x07,0x0b,0x76,0x0b,0x76,0x00,0x0c, +0x0b,0x78,0x0b,0x79,0x00,0x0d,0x0b,0x7b,0x0b,0x7c,0x00,0x0f,0x0b,0x7e,0x0b,0x82,0x00,0x11,0x00,0x01,0x00,0x2e,0x00,0x02,0x00,0x0a,0x00,0x1c,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x97,0x00,0x02,0x0b,0x63,0x0b,0x98,0x00,0x02,0x0b,0x64,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x99,0x00,0x02,0x0b,0x63,0x0b,0x9a,0x00,0x02,0x0b,0x64, +0x00,0x01,0x00,0x02,0x0b,0x81,0x0b,0xb1,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0xb3,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0xde,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x38,0x02,0x40,0x00,0x01,0x02,0x46,0x00,0x01,0x00,0x00, +0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x24,0x02,0x2c,0x00,0x02,0x02,0x6c,0x02,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x0e,0x02,0x16,0x00,0x03,0x02,0x56,0x02,0x56,0x02,0x1c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xf6,0x01,0xfe,0x00,0x04,0x02,0x3e,0x02,0x3e, +0x02,0x3e,0x02,0x04,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xdc,0x01,0xe4,0x00,0x02,0x02,0x46,0x02,0x4c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xc6,0x01,0xce,0x00,0x03,0x02,0x0e,0x02,0x30,0x02,0x36,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xae, +0x01,0xb6,0x00,0x04,0x01,0xf6,0x01,0xf6,0x02,0x18,0x02,0x1e,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x94,0x01,0x9c,0x00,0x05,0x01,0xdc,0x01,0xdc,0x01,0xdc,0x01,0xfe,0x02,0x04,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x78,0x01,0x80,0x00,0x01,0x01,0xf8,0x00,0x01,0x00,0x00, +0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x64,0x01,0x6c,0x00,0x02,0x01,0xac,0x01,0xe4,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x4e,0x01,0x56,0x00,0x03,0x01,0x96,0x01,0x96,0x01,0xce,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x36,0x01,0x3e,0x00,0x04,0x01,0x7e,0x01,0x7e, +0x01,0x7e,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x1c,0x01,0x24,0x00,0x02,0x01,0x86,0x01,0xa2,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x06,0x01,0x0e,0x00,0x02,0x01,0x70,0x01,0x92,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xf0,0x00,0xf8, +0x00,0x03,0x01,0x38,0x01,0x5a,0x01,0x76,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0xe0,0x00,0x03,0x01,0x20,0x01,0x42,0x01,0x64,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xc0,0x00,0xc8,0x00,0x04,0x01,0x08,0x01,0x08,0x01,0x2a,0x01,0x46,0x00,0x01,0x00,0x00,0x00,0x78, +0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0xae,0x00,0x04,0x00,0xee,0x00,0xee,0x01,0x10,0x01,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x94,0x00,0x05,0x00,0xd4,0x00,0xd4,0x00,0xd4,0x00,0xf6,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x78, +0x00,0x05,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xda,0x00,0xfc,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x5c,0x00,0x01,0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x48,0x00,0x02,0x00,0xd8,0x00,0xd2,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00, +0x00,0x02,0x00,0x2a,0x00,0x32,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x16,0x00,0x1e,0x00,0x02,0x00,0xae,0x00,0xdc,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x00,0x02,0x0b,0x74,0x0b,0xa8,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69, +0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, +0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02, +0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0xdc,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x1c,0x00,0x02,0x00,0x22,0x00,0x28, +0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x79,0x00,0x01,0x00,0x01,0x0b,0x53,0x00,0x01,0x00,0x01,0x0b,0x7e,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x88,0x00,0x02,0x0b,0x53,0x0b,0x89,0x00,0x02,0x0b,0x5b,0x00,0x01,0x00,0x01,0x0b,0x72, +0x00,0x03,0x00,0x02,0x01,0xcc,0x01,0xe8,0x00,0x01,0x01,0xee,0x00,0x02,0x02,0x1c,0x02,0x56,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0xb4,0x01,0xd0,0x00,0x01,0x01,0xd6,0x00,0x01,0x02,0x54,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x9e,0x02,0x66,0x00,0x01,0x01,0xc0,0x00,0x02,0x01,0xee,0x02,0x28, +0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x86,0x02,0x4e,0x00,0x01,0x01,0xa8,0x00,0x01,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x70,0x02,0x3e,0x00,0x01,0x01,0x92,0x00,0x02,0x01,0xc0,0x01,0xfa,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x58,0x02,0x26,0x00,0x01,0x01,0x7a, +0x00,0x01,0x01,0xf8,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x42,0x02,0x16,0x00,0x01,0x01,0x64,0x00,0x02,0x01,0x92,0x01,0xcc,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x2a,0x01,0xfe,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0xca,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x14,0x01,0xee, +0x00,0x01,0x01,0x36,0x00,0x02,0x01,0x64,0x01,0x9e,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xfc,0x01,0xd6,0x00,0x01,0x01,0x1e,0x00,0x01,0x01,0x9c,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xe6,0x01,0xc6,0x00,0x01,0x01,0x08,0x00,0x02,0x01,0x36,0x01,0x70,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03, +0x00,0x02,0x00,0xce,0x01,0xae,0x00,0x01,0x00,0xf0,0x00,0x01,0x01,0x6e,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xb8,0x01,0x9e,0x00,0x01,0x00,0xda,0x00,0x02,0x01,0x08,0x01,0x42,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xa0,0x01,0x86,0x00,0x01,0x00,0xc2,0x00,0x01,0x01,0x40,0x00,0x01,0x00,0x00, +0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x8a,0x01,0x76,0x00,0x01,0x00,0xac,0x00,0x02,0x00,0xda,0x01,0x14,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x72,0x01,0x5e,0x00,0x01,0x00,0x94,0x00,0x01,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x5c,0x01,0x4e,0x00,0x01,0x00,0x7e,0x00,0x02,0x00,0xac, +0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x44,0x01,0x36,0x00,0x01,0x00,0x66,0x00,0x01,0x00,0xe4,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x2e,0x01,0x26,0x00,0x01,0x00,0x50,0x00,0x02,0x00,0x7e,0x00,0xb8,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x16,0x01,0x0e,0x00,0x01, +0x00,0x38,0x00,0x01,0x00,0xb6,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x02,0x00,0x04,0x0b,0x54,0x0b,0x56,0x00,0x00,0x0b,0x58,0x0b,0x5b,0x00,0x03,0x0b,0x5d,0x0b,0x5d,0x00,0x07,0x0b,0xb9,0x0b,0xb9,0x00,0x08,0x00,0x01,0x00,0x01,0x0b,0x6a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf, +0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6b,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x02,0x0b,0x71,0x0b,0x71,0x00,0x04,0x0b,0x7d,0x0b,0x7d,0x00,0x05,0x0b,0x7f,0x0b,0x80,0x00,0x06,0x0b,0x9f, +0x0b,0xa0,0x00,0x08,0x0b,0xa2,0x0b,0xa3,0x00,0x0a,0x0b,0xa5,0x0b,0xa5,0x00,0x0c,0x0b,0xaf,0x0b,0xb0,0x00,0x0d,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x06,0x0b,0x72,0x0b,0x72,0x00,0x00,0x0b,0x77,0x0b,0x77,0x00,0x01,0x0b,0x7b,0x0b,0x7b, +0x00,0x02,0x0b,0x88,0x0b,0x89,0x00,0x03,0x0b,0xa6,0x0b,0xa6,0x00,0x05,0x0b,0xac,0x0b,0xac,0x00,0x06,0x00,0x01,0x00,0x01,0x0b,0x9f,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x71,0x00,0x01,0x00,0x01,0x0b,0xa5,0x00,0x01,0x00,0x01,0x0b,0x78,0x00,0x01,0x00,0x01,0x0b,0xaa,0x00,0x01, +0x00,0x01,0x0b,0x6e,0x00,0x01,0x00,0x01,0x0b,0xa3,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x14,0x00,0x01,0x00,0x54,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b,0x0b,0xb9,0x0b,0xb9,0x00,0x0c, +0x0b,0xbf,0x0b,0xbf,0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x5a,0x0b,0x5a,0x00,0x01,0x0b,0x5f,0x0b,0x5f,0x00,0x02,0x0b,0x67,0x0b,0x67,0x00,0x03,0x0b,0xbf,0x0b,0xbf,0x00,0x04, +0x0b,0xc4,0x0b,0xc4,0x00,0x05,0x0b,0xc9,0x0b,0xc9,0x00,0x06,0x0b,0xd0,0x0b,0xd5,0x00,0x07,0x0b,0xd8,0x0b,0xd8,0x00,0x0d,0x00,0x01,0x00,0x36,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x26,0x00,0x2e,0x00,0x01,0x00,0x04,0x0b,0x67,0x00,0x01,0x00,0x02,0x00,0x06,0x00,0x0c,0x12,0x5d,0x00,0x02,0x04,0x67,0x12,0x5c,0x00,0x01,0x00,0x01, +0x00,0x04,0x12,0x5d,0x00,0x01,0x00,0x01,0x00,0x04,0x12,0x5c,0x00,0x01,0x00,0x02,0x00,0x03,0x02,0x45,0x02,0x45,0x00,0x00,0x04,0x67,0x04,0x68,0x00,0x01,0x0b,0x66,0x0b,0x66,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf6,0x00,0x04,0x01,0x3c,0x01,0x76,0x01,0x76,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00, +0x00,0x01,0x00,0xde,0x00,0x04,0x01,0x24,0x01,0x5e,0x01,0x5e,0x01,0xa4,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xc6,0x00,0x03,0x01,0x0c,0x01,0x92,0x01,0x86,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xb0,0x00,0x03,0x00,0xf6,0x01,0x7c,0x01,0x76,0x00,0x01,0x00,0x00,0x00,0x7c, +0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x9a,0x00,0x03,0x00,0xe0,0x01,0x6c,0x01,0x5a,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x84,0x00,0x03,0x00,0xca,0x01,0x56,0x01,0x4a,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x03,0x00,0xb4,0x01,0x46,0x01,0x2e,0x00,0x01,0x00,0x00, +0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x58,0x00,0x03,0x00,0x9e,0x01,0x30,0x01,0x1e,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x03,0x00,0x88,0x01,0x20,0x01,0x26,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2c,0x00,0x03,0x00,0x72,0x01,0x0a,0x01,0x16,0x00,0x01, +0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x03,0x00,0x5c,0x00,0xf4,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a, +0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41,0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd,0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f, +0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b,0x0b,0xb9,0x0b,0xb9,0x00,0x0c,0x0b,0xbf,0x0b,0xbf, +0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x01,0x00,0x01,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0xc8,0x00,0x01,0x00,0x01,0x12,0x5b,0x00,0x01,0x00,0x01,0x12,0x59,0x00,0x01,0x00,0x01,0x12,0x5a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x01, +0x00,0x01,0x0b,0x55,0x00,0x01,0x00,0x01,0x0b,0x54,0x00,0x01,0x00,0x01,0x0b,0x56,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x2a,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x16,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x01,0x00,0x01,0x08,0xef, +0x00,0x01,0x00,0x01,0x0e,0x2d,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x2f,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14, +0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a, +0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x12,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x76,0x00,0x7c,0x00,0x82,0x00,0x68,0x00,0x88,0x00,0x76,0x00,0x90,0x00,0x68,0x00,0x96,0x00,0x9c,0x00,0x76,0x00,0xa2,0x00,0xa8,0x00,0x68,0x00,0xae,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x12,0x00,0x32, +0x00,0x38,0x00,0x3e,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x38,0x00,0x58,0x00,0x46,0x00,0x60,0x00,0x38,0x00,0x66,0x00,0x6c,0x00,0x46,0x00,0x72,0x00,0x78,0x00,0x38,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x02,0x08,0xf7,0x09,0x4b,0x00,0x01, +0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xe2,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x01,0x00,0x01,0x08,0xf3,0x00,0x01,0x00,0x01,0x09,0x29,0x00,0x01,0x00,0x01,0x08,0xd4,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x02,0x00,0x13, +0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69, +0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x0f,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x6a, +0x00,0x70,0x00,0x6a,0x00,0x76,0x00,0x5c,0x00,0x7c,0x00,0x82,0x00,0x6a,0x00,0x8a,0x00,0x90,0x00,0x5c,0x00,0x96,0x00,0x01,0x00,0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0f,0x00,0x2c,0x00,0x32,0x00,0x38,0x00,0x40,0x00,0x46,0x00,0x40,0x00,0x4c,0x00,0x32,0x00,0x52,0x00,0x58,0x00,0x40,0x00,0x60,0x00,0x66,0x00,0x32,0x00,0x6c, +0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x02,0x08,0xf7,0x09,0x4b,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x0a,0x63,0x00,0x01,0x00,0x01,0x08,0xe2,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x01,0x00,0x01, +0x09,0x29,0x00,0x01,0x00,0x01,0x08,0xd4,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f, +0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c, +0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x3a,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x1e,0x00,0x24,0x00,0x2a,0x00,0x1e,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x01, +0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x01,0x09,0x59,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x01,0x08,0xc7,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09, +0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c, +0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x36,0x00,0x48,0x00,0x4e,0x00,0x54,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07, +0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x1c,0x00,0x2e,0x00,0x34,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x01,0x09,0x59,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x08,0xfb,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x02,0x00,0x13, +0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69, +0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x16,0x00,0x72,0x00,0x78,0x00,0x7e,0x00,0x84, +0x00,0x8a,0x00,0x90,0x00,0x96,0x00,0x9c,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0xa2,0x00,0xa8,0x00,0xae,0x00,0xb4,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0xa2,0x00,0xa8,0x00,0xba,0x00,0x7e,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x16,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64, +0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x6a,0x00,0x70,0x00,0x76,0x00,0x7c,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x6a,0x00,0x70,0x00,0x82,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x82,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x01,0x0e,0x32,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01, +0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x01,0x08,0xf3,0x00,0x01,0x00,0x01,0x0b,0x0c,0x00,0x01,0x00,0x01,0x08,0xd0,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x59,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37, +0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a, +0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x13,0x00,0x66,0x00,0x6c,0x00,0x72,0x00,0x78,0x00,0x7e,0x00,0x78,0x00,0x84,0x00,0x8a,0x00,0x90, +0x00,0x96,0x00,0x9c,0x00,0xa2,0x00,0x78,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0x96,0x00,0xa8,0x00,0x72,0x00,0x01,0x00,0xae,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x13,0x00,0x34,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x46,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64,0x00,0x6a,0x00,0x70,0x00,0x46,0x00,0x52,0x00,0x58,0x00,0x5e, +0x00,0x64,0x00,0x76,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x01,0x0e,0x32,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x0a,0x63,0x00,0x01,0x00,0x01,0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x01,0x0b,0x0c,0x00,0x01, +0x00,0x01,0x08,0xd0,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x59,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16, +0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f, +0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x08,0x00,0x01,0x0e,0x5c,0x00,0x01,0x00,0x01,0x09,0x28,0x00,0x02,0x00,0x32,0x00,0x16,0x14,0x88,0x14,0x89,0x14,0x8a,0x14,0x8b,0x14,0x8c,0x14,0x8d,0x14,0x8e,0x14,0x8f,0x14,0x90,0x14,0x91,0x14,0x88,0x14,0x89,0x14,0x8a,0x14,0x8b,0x14,0x92,0x14,0x93, +0x14,0x94,0x14,0x8f,0x14,0x90,0x14,0x91,0x14,0x95,0x14,0x96,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x32,0x00,0x16,0x14,0x9e,0x14,0x9f,0x14,0xa0,0x14,0xa1,0x14,0xa2,0x14,0xa3,0x14,0xa4,0x14,0xa5,0x14,0xa6,0x14,0xa7,0x14,0x9e,0x14,0x9f, +0x14,0xa0,0x14,0xa1,0x14,0xa8,0x14,0xa9,0x14,0xaa,0x14,0xa5,0x14,0xa6,0x14,0xa7,0x14,0xab,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c, +0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a,0x14,0xa2,0x00,0x02,0x14,0x9a,0x14,0xa3, +0x00,0x02,0x14,0x9a,0x14,0xa4,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a,0x14,0xa8,0x00,0x02,0x14,0x9a,0x14,0xa9,0x00,0x02,0x14,0x9a, +0x14,0xaa,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0xab,0x00,0x02,0x14,0x9a,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38, +0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1, +0x00,0x02,0x14,0x9a,0x14,0xa2,0x00,0x02,0x14,0x9a,0x14,0xa3,0x00,0x02,0x14,0x9a,0x14,0xa4,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a, +0x14,0xa8,0x00,0x02,0x14,0x9a,0x14,0xa9,0x00,0x02,0x14,0x9a,0x14,0xaa,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0xab,0x00,0x02,0x14,0x9a,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d, +0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x2b,0x08,0xd7,0x00,0x02,0x14,0x2b,0x08,0xd8, +0x00,0x02,0x14,0x2b,0x08,0xd9,0x00,0x02,0x14,0x2b,0x08,0xda,0x00,0x02,0x14,0x2b,0x08,0xdb,0x00,0x02,0x14,0x2b,0x08,0xdc,0x00,0x02,0x14,0x2b,0x08,0xdd,0x00,0x02,0x14,0x2b,0x08,0xde,0x00,0x02,0x14,0x2b,0x08,0xdf,0x00,0x02,0x14,0x2b,0x08,0xe0,0x00,0x02,0x14,0x2b,0x08,0xd7,0x00,0x02,0x14,0x2b,0x08,0xd8,0x00,0x02,0x14,0x2b, +0x08,0xd9,0x00,0x02,0x14,0x2b,0x08,0xda,0x00,0x02,0x14,0x2b,0x09,0x53,0x00,0x02,0x14,0x2b,0x09,0x54,0x00,0x02,0x14,0x2b,0x09,0x55,0x00,0x02,0x14,0x2b,0x08,0xde,0x00,0x02,0x14,0x2b,0x08,0xdf,0x00,0x02,0x14,0x2b,0x08,0xe0,0x00,0x02,0x14,0x2b,0x0a,0x3c,0x00,0x02,0x14,0x2b,0x0a,0x3d,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0, +0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x02,0x14,0x99,0x0a,0x44,0x00,0x02,0x14,0x9c,0x0a,0x47,0x00,0x02,0x14,0x9d,0x13,0x45,0x00,0x02,0x00,0x03,0x0a,0x44,0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45,0x13,0x45, +0x00,0x02,0x00,0x02,0x00,0x1e,0x00,0x0c,0x0f,0x8c,0x0f,0x8d,0x0f,0x8e,0x0f,0x90,0x0f,0x92,0x0f,0x94,0x0f,0x8f,0x0f,0x91,0x0f,0x93,0x0f,0x95,0x0f,0x96,0x0f,0x97,0x00,0x02,0x00,0x08,0x08,0xee,0x08,0xee,0x00,0x00,0x09,0x3f,0x09,0x3f,0x00,0x01,0x09,0xec,0x09,0xec,0x00,0x02,0x09,0xee,0x09,0xee,0x00,0x03,0x09,0xf0,0x09,0xf0, +0x00,0x04,0x09,0xf2,0x09,0xf2,0x00,0x05,0x0a,0x5f,0x0a,0x62,0x00,0x06,0x0a,0xb2,0x0a,0xb3,0x00,0x0a,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0f,0x65,0x0f,0x63,0x0f,0x62,0x0f,0x64,0x0f,0x66,0x0f,0x67,0x0f,0x68,0x0f,0x69,0x0f,0x6a,0x0f,0x6b,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca,0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83, +0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x02,0x00,0x46,0x00,0x20,0x0f,0x6c,0x0f,0x6e,0x0f,0x82,0x0f,0x84,0x0f,0x70,0x0f,0x72,0x0f,0x74,0x0f,0x86,0x0f,0x88,0x0f,0x76,0x0f,0x8a,0x0f,0x78,0x0f,0x7a,0x0f,0x6d,0x0f,0x6f, +0x0f,0x83,0x0f,0x85,0x0f,0x71,0x0f,0x73,0x0f,0x75,0x0f,0x87,0x0f,0x89,0x0f,0x77,0x0f,0x8b,0x0f,0x79,0x0f,0x7b,0x0f,0x7c,0x0f,0x7d,0x0f,0x7e,0x0f,0x7f,0x0f,0x80,0x0f,0x81,0x00,0x02,0x00,0x1b,0x08,0xd4,0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe1,0x00,0x03,0x09,0xba,0x09,0xba,0x00,0x04,0x09,0xbc,0x09,0xbc,0x00,0x05,0x09,0xbe, +0x09,0xbe,0x00,0x06,0x09,0xc0,0x09,0xc0,0x00,0x07,0x09,0xc2,0x09,0xc2,0x00,0x08,0x0a,0x25,0x0a,0x25,0x00,0x09,0x0a,0x27,0x0a,0x27,0x00,0x0a,0x0a,0x8a,0x0a,0x8a,0x00,0x0b,0x0a,0xb7,0x0a,0xb7,0x00,0x0c,0x0e,0x32,0x0e,0x32,0x00,0x0d,0x0e,0x34,0x0e,0x34,0x00,0x0e,0x0e,0x36,0x0e,0x36,0x00,0x0f,0x0e,0x38,0x0e,0x38,0x00,0x10, +0x0e,0x99,0x0e,0x99,0x00,0x11,0x0e,0x9b,0x0e,0x9b,0x00,0x12,0x0e,0x9d,0x0e,0x9d,0x00,0x13,0x0e,0x9f,0x0e,0x9f,0x00,0x14,0x0e,0xa1,0x0e,0xa1,0x00,0x15,0x0e,0xed,0x0e,0xed,0x00,0x16,0x0e,0xef,0x0e,0xef,0x00,0x17,0x0f,0x04,0x0f,0x04,0x00,0x18,0x0f,0x15,0x0f,0x15,0x00,0x19,0x0f,0x20,0x0f,0x21,0x00,0x1a,0x0f,0x46,0x0f,0x47, +0x00,0x1c,0x0f,0x4a,0x0f,0x4b,0x00,0x1e,0x00,0x02,0x00,0x4a,0x00,0x22,0x0f,0xac,0x0f,0xab,0x0f,0xa7,0x0f,0xbd,0x0f,0xad,0x0f,0xae,0x0f,0xaf,0x0f,0xbe,0x0f,0xb0,0x0f,0xa2,0x0f,0xa5,0x0f,0x98,0x0f,0x99,0x0f,0xc3,0x0f,0x9a,0x0f,0x9b,0x0f,0x9c,0x0f,0x9d,0x0f,0x9e,0x0f,0x9f,0x0f,0xa0,0x0f,0xa1,0x0f,0xa4,0x0f,0xbf,0x0f,0xa8, +0x0f,0xa9,0x0f,0xaa,0x0f,0xa3,0x0f,0xa6,0x0f,0xb1,0x0f,0xb2,0x0f,0xb3,0x14,0xad,0x14,0xae,0x00,0x02,0x00,0x16,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b,0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06, +0x0a,0x0c,0x0a,0x0c,0x00,0x07,0x0a,0x0e,0x0a,0x0e,0x00,0x08,0x0a,0x57,0x0a,0x57,0x00,0x09,0x0a,0xb5,0x0a,0xb5,0x00,0x0a,0x0b,0x0c,0x0b,0x17,0x00,0x0b,0x0e,0x21,0x0e,0x21,0x00,0x17,0x0e,0x48,0x0e,0x48,0x00,0x18,0x0e,0x4c,0x0e,0x4c,0x00,0x19,0x0e,0x50,0x0e,0x50,0x00,0x1a,0x0f,0x02,0x0f,0x02,0x00,0x1b,0x0f,0x23,0x0f,0x23, +0x00,0x1c,0x0f,0x2d,0x0f,0x2d,0x00,0x1d,0x0f,0x31,0x0f,0x31,0x00,0x1e,0x0f,0x35,0x0f,0x35,0x00,0x1f,0x14,0x7d,0x14,0x7e,0x00,0x20,0x00,0x02,0x00,0x0e,0x00,0x04,0x0f,0xb6,0x0f,0xb8,0x0f,0xba,0x0f,0xbc,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f, +0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x0e,0x00,0x04,0x0f,0xb5,0x0f,0xb7,0x0f,0xb9,0x0f,0xbb,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x0e,0x00,0x04,0x00,0xd6,0x06,0xac,0x11,0x8c,0x06,0xad,0x00,0x02,0x00,0x03, +0x00,0x4c,0x00,0x4d,0x00,0x00,0x01,0x62,0x01,0x62,0x00,0x02,0x05,0x6d,0x05,0x6d,0x00,0x03,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xe1,0x0c,0xe2,0x0c,0xe3,0x0c,0xe4,0x0c,0xe5,0x0c,0xe6,0x0c,0xe7,0x0c,0xe8,0x0c,0xe9,0x0c,0xea,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0x8d,0x00,0x01, +0x00,0x01,0x0b,0x7a,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0xd6,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02,0x00,0x08,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x1e,0x00,0x02,0x00,0x0a,0x00,0x14,0x00,0x01,0x00,0x04,0x0b,0x8a,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x04,0x0b,0x8b,0x00,0x02,0x0b,0x5c,0x00,0x01, +0x00,0x02,0x0b,0x74,0x0b,0xa8,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0x57,0x00,0x02,0x0b,0x57,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x66,0x00,0x0c,0x00,0x1e,0x00,0x24,0x00,0x2a,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x48,0x00,0x4e,0x00,0x54,0x00,0x5a,0x00,0x60,0x00,0x02,0x0b,0x5f, +0x0b,0x07,0x00,0x02,0x0b,0x67,0x0b,0x07,0x00,0x02,0x0b,0xbf,0x0b,0x07,0x00,0x02,0x0b,0xc4,0x0b,0x07,0x00,0x02,0x0b,0xc9,0x0b,0x07,0x00,0x02,0x0b,0xd0,0x0b,0x07,0x00,0x02,0x0b,0xd1,0x0b,0x07,0x00,0x02,0x0b,0xd2,0x0b,0x07,0x00,0x02,0x0b,0xd3,0x0b,0x07,0x00,0x02,0x0b,0xd4,0x0b,0x07,0x00,0x02,0x0b,0xd5,0x0b,0x07,0x00,0x02, +0x0b,0xd8,0x0b,0x07,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x76,0x00,0x0e,0x00,0x22,0x00,0x28,0x00,0x2e,0x00,0x34, +0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64,0x00,0x6a,0x00,0x70,0x00,0x02,0x0b,0x53,0x11,0x86,0x00,0x02,0x0b,0x5a,0x11,0x86,0x00,0x02,0x0b,0x5f,0x11,0x86,0x00,0x02,0x0b,0x67,0x11,0x86,0x00,0x02,0x0b,0xbf,0x11,0x86,0x00,0x02,0x0b,0xc4,0x11,0x86,0x00,0x02,0x0b,0xc9,0x11,0x86,0x00,0x02, +0x0b,0xd0,0x11,0x86,0x00,0x02,0x0b,0xd1,0x11,0x86,0x00,0x02,0x0b,0xd2,0x11,0x86,0x00,0x02,0x0b,0xd3,0x11,0x86,0x00,0x02,0x0b,0xd4,0x11,0x86,0x00,0x02,0x0b,0xd5,0x11,0x86,0x00,0x02,0x0b,0xd8,0x11,0x86,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x5a,0x0b,0x5a,0x00,0x01,0x0b,0x5f,0x0b,0x5f,0x00,0x02,0x0b,0x67, +0x0b,0x67,0x00,0x03,0x0b,0xbf,0x0b,0xbf,0x00,0x04,0x0b,0xc4,0x0b,0xc4,0x00,0x05,0x0b,0xc9,0x0b,0xc9,0x00,0x06,0x0b,0xd0,0x0b,0xd5,0x00,0x07,0x0b,0xd8,0x0b,0xd8,0x00,0x0d,0x00,0x01,0x04,0x26,0x00,0x84,0x01,0x0e,0x01,0x14,0x01,0x1a,0x01,0x20,0x01,0x26,0x01,0x2c,0x01,0x32,0x01,0x38,0x01,0x3e,0x01,0x44,0x01,0x4a,0x01,0x50, +0x01,0x56,0x01,0x5c,0x01,0x62,0x01,0x68,0x01,0x6e,0x01,0x74,0x01,0x7a,0x01,0x80,0x01,0x86,0x01,0x8c,0x01,0x92,0x01,0x98,0x01,0x9e,0x01,0xa4,0x01,0xaa,0x01,0xb0,0x01,0xb6,0x01,0xbc,0x01,0xc2,0x01,0xc8,0x01,0xce,0x01,0xd4,0x01,0xda,0x01,0xe0,0x01,0xe6,0x01,0xec,0x01,0xf2,0x01,0xf8,0x01,0xfe,0x02,0x04,0x02,0x0a,0x02,0x10, +0x02,0x16,0x02,0x1c,0x02,0x22,0x02,0x28,0x02,0x2e,0x02,0x34,0x02,0x3a,0x02,0x40,0x02,0x46,0x02,0x4c,0x02,0x52,0x02,0x58,0x02,0x5e,0x02,0x64,0x02,0x6a,0x02,0x70,0x02,0x76,0x02,0x7c,0x02,0x82,0x02,0x88,0x02,0x8e,0x02,0x94,0x02,0x9a,0x02,0xa0,0x02,0xa6,0x02,0xac,0x02,0xb2,0x02,0xb8,0x02,0xbe,0x02,0xc4,0x02,0xca,0x02,0xd0, +0x02,0xd6,0x02,0xdc,0x02,0xe2,0x02,0xe8,0x02,0xee,0x02,0xf4,0x02,0xfa,0x03,0x00,0x03,0x06,0x03,0x0c,0x03,0x12,0x03,0x18,0x03,0x1e,0x03,0x24,0x03,0x2a,0x03,0x30,0x03,0x36,0x03,0x3c,0x03,0x42,0x03,0x48,0x03,0x4e,0x03,0x54,0x03,0x5a,0x03,0x60,0x03,0x66,0x03,0x6c,0x03,0x72,0x03,0x78,0x03,0x7e,0x03,0x84,0x03,0x8a,0x03,0x90, +0x03,0x96,0x03,0x9c,0x03,0xa2,0x03,0xa8,0x03,0xae,0x03,0xb4,0x03,0xba,0x03,0xc0,0x03,0xc6,0x03,0xcc,0x03,0xd2,0x03,0xd8,0x03,0xde,0x03,0xe4,0x03,0xea,0x03,0xf0,0x03,0xf6,0x03,0xfc,0x04,0x02,0x04,0x08,0x04,0x0e,0x04,0x14,0x04,0x1a,0x04,0x20,0x00,0x02,0x0a,0x43,0x11,0x86,0x00,0x02,0x0b,0x53,0x11,0x86,0x00,0x02,0x0b,0x54, +0x11,0x86,0x00,0x02,0x0b,0x55,0x11,0x86,0x00,0x02,0x0b,0x56,0x11,0x86,0x00,0x02,0x0b,0x57,0x11,0x86,0x00,0x02,0x0b,0x58,0x11,0x86,0x00,0x02,0x0b,0x59,0x11,0x86,0x00,0x02,0x0b,0x5a,0x11,0x86,0x00,0x02,0x0b,0x5b,0x11,0x86,0x00,0x02,0x0b,0x5c,0x11,0x86,0x00,0x02,0x0b,0x5d,0x11,0x86,0x00,0x02,0x0b,0x5e,0x11,0x86,0x00,0x02, +0x0b,0x5f,0x11,0x86,0x00,0x02,0x0b,0x61,0x11,0x86,0x00,0x02,0x0b,0x66,0x11,0x86,0x00,0x02,0x0b,0x67,0x11,0x86,0x00,0x02,0x0b,0x68,0x11,0x86,0x00,0x02,0x0b,0x69,0x11,0x86,0x00,0x02,0x0b,0x6a,0x11,0x86,0x00,0x02,0x0b,0x6b,0x11,0x86,0x00,0x02,0x0b,0x6c,0x11,0x86,0x00,0x02,0x0b,0x6d,0x11,0x86,0x00,0x02,0x0b,0x6e,0x11,0x86, +0x00,0x02,0x0b,0x6f,0x11,0x86,0x00,0x02,0x0b,0x70,0x11,0x86,0x00,0x02,0x0b,0x71,0x11,0x86,0x00,0x02,0x0b,0x72,0x11,0x86,0x00,0x02,0x0b,0x73,0x11,0x86,0x00,0x02,0x0b,0x74,0x11,0x86,0x00,0x02,0x0b,0x75,0x11,0x86,0x00,0x02,0x0b,0x76,0x11,0x86,0x00,0x02,0x0b,0x77,0x11,0x86,0x00,0x02,0x0b,0x78,0x11,0x86,0x00,0x02,0x0b,0x79, +0x11,0x86,0x00,0x02,0x0b,0x7a,0x11,0x86,0x00,0x02,0x0b,0x7b,0x11,0x86,0x00,0x02,0x0b,0x7c,0x11,0x86,0x00,0x02,0x0b,0x7d,0x11,0x86,0x00,0x02,0x0b,0x7e,0x11,0x86,0x00,0x02,0x0b,0x7f,0x11,0x86,0x00,0x02,0x0b,0x80,0x11,0x86,0x00,0x02,0x0b,0x81,0x11,0x86,0x00,0x02,0x0b,0x82,0x11,0x86,0x00,0x02,0x0b,0x83,0x11,0x86,0x00,0x02, +0x0b,0x84,0x11,0x86,0x00,0x02,0x0b,0x85,0x11,0x86,0x00,0x02,0x0b,0x88,0x11,0x86,0x00,0x02,0x0b,0x89,0x11,0x86,0x00,0x02,0x0b,0x8a,0x11,0x86,0x00,0x02,0x0b,0x8b,0x11,0x86,0x00,0x02,0x0b,0x8c,0x11,0x86,0x00,0x02,0x0b,0x8d,0x11,0x86,0x00,0x02,0x0b,0x8e,0x11,0x86,0x00,0x02,0x0b,0x8f,0x11,0x86,0x00,0x02,0x0b,0x90,0x11,0x86, +0x00,0x02,0x0b,0x91,0x11,0x86,0x00,0x02,0x0b,0x92,0x11,0x86,0x00,0x02,0x0b,0x93,0x11,0x86,0x00,0x02,0x0b,0x94,0x11,0x86,0x00,0x02,0x0b,0x95,0x11,0x86,0x00,0x02,0x0b,0x97,0x11,0x86,0x00,0x02,0x0b,0x98,0x11,0x86,0x00,0x02,0x0b,0x99,0x11,0x86,0x00,0x02,0x0b,0x9a,0x11,0x86,0x00,0x02,0x0b,0x9d,0x11,0x86,0x00,0x02,0x0b,0x9e, +0x11,0x86,0x00,0x02,0x0b,0x9f,0x11,0x86,0x00,0x02,0x0b,0xa0,0x11,0x86,0x00,0x02,0x0b,0xa1,0x11,0x86,0x00,0x02,0x0b,0xa2,0x11,0x86,0x00,0x02,0x0b,0xa3,0x11,0x86,0x00,0x02,0x0b,0xa4,0x11,0x86,0x00,0x02,0x0b,0xa5,0x11,0x86,0x00,0x02,0x0b,0xa6,0x11,0x86,0x00,0x02,0x0b,0xa7,0x11,0x86,0x00,0x02,0x0b,0xa8,0x11,0x86,0x00,0x02, +0x0b,0xa9,0x11,0x86,0x00,0x02,0x0b,0xaa,0x11,0x86,0x00,0x02,0x0b,0xab,0x11,0x86,0x00,0x02,0x0b,0xac,0x11,0x86,0x00,0x02,0x0b,0xad,0x11,0x86,0x00,0x02,0x0b,0xae,0x11,0x86,0x00,0x02,0x0b,0xaf,0x11,0x86,0x00,0x02,0x0b,0xb0,0x11,0x86,0x00,0x02,0x0b,0xb1,0x11,0x86,0x00,0x02,0x0b,0xb2,0x11,0x86,0x00,0x02,0x0b,0xb3,0x11,0x86, +0x00,0x02,0x0b,0xb4,0x11,0x86,0x00,0x02,0x0b,0xb5,0x11,0x86,0x00,0x02,0x0b,0xb6,0x11,0x86,0x00,0x02,0x0b,0xb7,0x11,0x86,0x00,0x02,0x0b,0xb9,0x11,0x86,0x00,0x02,0x0b,0xbf,0x11,0x86,0x00,0x02,0x0b,0xc0,0x11,0x86,0x00,0x02,0x0b,0xc1,0x11,0x86,0x00,0x02,0x0b,0xc2,0x11,0x86,0x00,0x02,0x0b,0xc3,0x11,0x86,0x00,0x02,0x0b,0xc4, +0x11,0x86,0x00,0x02,0x0b,0xc5,0x11,0x86,0x00,0x02,0x0b,0xc6,0x11,0x86,0x00,0x02,0x0b,0xc7,0x11,0x86,0x00,0x02,0x0b,0xc8,0x11,0x86,0x00,0x02,0x0b,0xc9,0x11,0x86,0x00,0x02,0x0b,0xca,0x11,0x86,0x00,0x02,0x0b,0xcb,0x11,0x86,0x00,0x02,0x0b,0xcc,0x11,0x86,0x00,0x02,0x0b,0xcd,0x11,0x86,0x00,0x02,0x0b,0xce,0x11,0x86,0x00,0x02, +0x0b,0xcf,0x11,0x86,0x00,0x02,0x0b,0xd0,0x11,0x86,0x00,0x02,0x0b,0xd1,0x11,0x86,0x00,0x02,0x0b,0xd2,0x11,0x86,0x00,0x02,0x0b,0xd3,0x11,0x86,0x00,0x02,0x0b,0xd4,0x11,0x86,0x00,0x02,0x0b,0xd5,0x11,0x86,0x00,0x02,0x0b,0xd6,0x11,0x86,0x00,0x02,0x0b,0xd7,0x11,0x86,0x00,0x02,0x0b,0xd8,0x11,0x86,0x00,0x02,0x0b,0xd9,0x11,0x86, +0x00,0x02,0x0b,0xda,0x11,0x86,0x00,0x02,0x0b,0xdb,0x11,0x86,0x00,0x02,0x0b,0xdc,0x11,0x86,0x00,0x02,0x0b,0xdd,0x11,0x86,0x00,0x02,0x0b,0xe1,0x11,0x86,0x00,0x02,0x12,0x5c,0x11,0x86,0x00,0x02,0x12,0x5d,0x11,0x86,0x00,0x02,0x12,0x5e,0x11,0x86,0x00,0x02,0x12,0x5f,0x11,0x86,0x00,0x02,0x12,0x60,0x11,0x86,0x00,0x02,0x12,0x61, +0x11,0x86,0x00,0x02,0x12,0x62,0x11,0x86,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a,0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41,0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd, +0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xef,0x00,0x04,0x0e,0x2d,0x0e,0x58,0x0e,0x2f,0x00,0x01,0x00,0x01,0x08,0xef,0x00,0x01,0x00,0x82,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x2e,0x00,0x54,0x13,0xf0,0x00,0x12,0x09,0x3f, +0x08,0xf7,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x12,0x09,0x3f,0x09,0x4b,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29, +0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x12,0x09,0x3f,0x09,0x4b,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x09,0x60,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x28, +0x00,0x48,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x08,0xf7,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x09,0x4b,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f, +0x0e,0x57,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x09,0x4b,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x09,0x60,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x32,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x18,0x13,0xf1,0x00,0x08,0x09,0x59,0x00,0x03,0x08,0xce, +0x09,0x3f,0x08,0xc7,0x08,0xee,0x08,0xf3,0x13,0xf1,0x00,0x08,0x09,0x59,0x00,0x03,0x08,0xce,0x09,0x3f,0x08,0xc7,0x08,0xee,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x2e,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x16,0x13,0xf1,0x00,0x07,0x09,0x59,0x00,0x03,0x08,0xce,0x08,0xfb,0x08,0xee,0x08,0xf3,0x13,0xf1, +0x00,0x07,0x09,0x59,0x00,0x03,0x08,0xce,0x08,0xfb,0x08,0xee,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x3a,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xf2,0x00,0x16,0x0e,0x32,0x0e,0x57,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x58,0x0e,0x59, +0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x61,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x34,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xf2,0x00,0x13,0x0e,0x32,0x0e,0x57,0x00,0x03,0x0a,0x63,0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x58,0x0e,0x59,0x00,0x03,0x09,0x0d,0x08,0xee, +0x0b,0x0c,0x08,0xd0,0x0e,0x61,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x02,0x64,0x6c,0x6e,0x67,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x2c,0x73,0x6c,0x6e,0x67,0x00,0x00,0x00,0x54, +0x00,0x00,0x00,0x2c,0x4c,0x61,0x74,0x6e,0x2c,0x47,0x72,0x65,0x6b,0x2c,0x43,0x79,0x72,0x6c,0x2c,0x41,0x72,0x6d,0x6e,0x2c,0x47,0x65,0x6f,0x72,0x2c,0x47,0x65,0x6f,0x6b,0x2c,0x41,0x72,0x61,0x62,0x2c,0x48,0x65,0x62,0x72,0x2c,0x4c,0x69,0x73,0x75,0x4c,0x61,0x74,0x6e,0x2c,0x47,0x72,0x65,0x6b,0x2c,0x43,0x79,0x72,0x6c,0x2c,0x41, +0x72,0x6d,0x6e,0x2c,0x47,0x65,0x6f,0x72,0x2c,0x47,0x65,0x6f,0x6b,0x2c,0x41,0x72,0x61,0x62,0x2c,0x48,0x65,0x62,0x72,0x2c,0x4c,0x69,0x73,0x75, +}; + +read_only global String8 rd_default_main_font_bytes = {rd_default_main_font_bytes__data, sizeof(rd_default_main_font_bytes__data)}; +read_only global U8 rd_default_code_font_bytes__data[] = +{ +0x00,0x01,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x04,0x00,0x10,0x47,0x44,0x45,0x46,0x14,0xdc,0x05,0x92,0x00,0x03,0xa6,0x14,0x00,0x00,0x02,0x2a,0x47,0x50,0x4f,0x53,0x68,0xe9,0x9a,0x47,0x00,0x03,0xa8,0x40,0x00,0x00,0x23,0x96,0x47,0x53,0x55,0x42,0x28,0xdb,0xc9,0x88,0x00,0x03,0xcb,0xd8,0x00,0x00,0x62,0x14,0x4f,0x53,0x2f,0x32, +0x12,0x35,0x0b,0x84,0x00,0x00,0x01,0x98,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0x5a,0x24,0x58,0xda,0x00,0x00,0x1d,0x34,0x00,0x00,0x42,0x6a,0x63,0x76,0x74,0x20,0x27,0x58,0x0f,0x1a,0x00,0x00,0x6e,0x84,0x00,0x00,0x00,0xa8,0x66,0x70,0x67,0x6d,0x62,0x2f,0x03,0x7f,0x00,0x00,0x5f,0xa0,0x00,0x00,0x0e,0x0c,0x67,0x61,0x73,0x70, +0x00,0x00,0x00,0x10,0x00,0x03,0xa6,0x0c,0x00,0x00,0x00,0x08,0x67,0x6c,0x79,0x66,0x6c,0x17,0x21,0x7d,0x00,0x00,0x8a,0x6c,0x00,0x02,0xc9,0x3c,0x68,0x65,0x61,0x64,0x1b,0x2b,0x60,0x84,0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,0x00,0x35,0x07,0x57,0x00,0x00,0x01,0x54,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78, +0x54,0xf6,0x4a,0x0f,0x00,0x00,0x01,0xf8,0x00,0x00,0x1b,0x3c,0x6c,0x6f,0x63,0x61,0x08,0x34,0x21,0x64,0x00,0x00,0x6f,0x2c,0x00,0x00,0x1b,0x40,0x6d,0x61,0x78,0x70,0x0f,0xc8,0x14,0x44,0x00,0x00,0x01,0x78,0x00,0x00,0x00,0x20,0x6e,0x61,0x6d,0x65,0x94,0x4b,0x4e,0x5d,0x00,0x03,0x53,0xa8,0x00,0x00,0x06,0x2f,0x70,0x6f,0x73,0x74, +0x5d,0x5a,0x9a,0x04,0x00,0x03,0x59,0xd8,0x00,0x00,0x4c,0x33,0x70,0x72,0x65,0x70,0x8a,0xcd,0x9c,0x1e,0x00,0x00,0x6d,0xac,0x00,0x00,0x00,0xd6,0x00,0x01,0x00,0x00,0x00,0x02,0x4d,0xd3,0x13,0x13,0x3d,0xf7,0x5f,0x0f,0x3c,0xf5,0x00,0x0f,0x03,0xe8,0x00,0x00,0x00,0x00,0xdf,0xe8,0x66,0x79,0x00,0x00,0x00,0x00,0xdf,0xe8,0x68,0x84, +0xf9,0x39,0xfe,0x70,0x02,0xfd,0x04,0x60,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0xfc,0xfe,0xd4,0x00,0x00,0x02,0x58,0xf9,0x39,0xff,0x5b,0x02,0xfd,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xcf,0x00,0x01,0x00,0x00,0x06,0xcf,0x01,0xb8, +0x00,0x6e,0x00,0x87,0x00,0x06,0x00,0x02,0x02,0x94,0x03,0xf6,0x00,0x8d,0x00,0x00,0x05,0x60,0x0e,0x0c,0x00,0x03,0x00,0x01,0x00,0x04,0x02,0x58,0x01,0x90,0x00,0x05,0x00,0x00,0x02,0x8a,0x02,0x58,0x00,0x00,0x00,0x4b,0x02,0x8a,0x02,0x58,0x00,0x00,0x01,0x5e,0x00,0x32,0x01,0x40,0x00,0x00,0x02,0x00,0x00,0x09,0x00,0x00,0x00,0x00, +0x00,0x00,0xa0,0x04,0x02,0xff,0x12,0x00,0xf9,0xfb,0x02,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x4a,0x42,0x00,0x00,0x00,0xc0,0x00,0x0d,0xff,0xff,0x03,0xfc,0xfe,0xd4,0x00,0x00,0x03,0xfc,0x01,0x2c,0x20,0x00,0x01,0x9f,0xdf,0xd7,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x00,0x00,0x20,0x00,0x06,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x32, +0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32, +0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c, +0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64, +0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x0a, +0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x5c, +0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x75,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58, +0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58, +0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x48, +0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, +0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x32, +0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x55, +0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43, +0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43, +0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3f,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x54, +0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x58, +0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xd4,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55, +0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x61,0x02,0x58,0x00,0x61, +0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c, +0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54, +0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x70,0x02,0x58,0x00,0x70, +0x02,0x58,0x00,0x70,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x5a, +0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, +0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36, +0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41, +0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, +0x02,0x58,0x00,0x5a,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64, +0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, +0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a, +0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0xaf,0x02,0x58,0x00,0xb9,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x06, +0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x2e, +0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5e,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69, +0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x38,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x51,0x02,0x58,0x00,0x59,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x06,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x5a, +0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x56,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x82, +0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58, +0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x30,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x55, +0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3f,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5b,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x49,0x02,0x58,0x00,0x64, +0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32, +0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c, +0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0xb0,0x02,0x58,0xff,0x83,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x23, +0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x36, +0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x5a, +0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x30,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x1a,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x4b, +0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b, +0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4b, +0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e, +0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4c,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x40,0x02,0x58,0x00,0x52,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x40,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x49, +0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b, +0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b, +0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84, +0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x05, +0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x91,0x02,0x58,0x00,0x4c,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xd9,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xe1,0x02,0x58,0x00,0xe1,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x73, +0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x24,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xda,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xd9,0x00,0x00,0xff,0x1a, +0x00,0x00,0xff,0x79,0x02,0x58,0x00,0xb9,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x6e,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x87, +0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xdc,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xd2, +0x02,0x58,0x00,0xdc,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0xf9,0x02,0x58,0xfe,0x34,0x02,0x58,0xfb,0xdc,0x02,0x58,0xf9,0x4d,0x02,0x58,0xfb,0xa6,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfd,0xfd, +0x02,0x58,0xfb,0xa5,0x02,0x58,0xfd,0xfd,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfe,0x11,0x02,0x58,0xfe,0x0c,0x02,0x58,0xf9,0x7f,0x02,0x58,0xf9,0x7f,0x02,0x58,0xfc,0x09,0x02,0x58,0xfe,0x43,0x02,0x58,0xfe,0x34,0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0x8e,0x02,0x58,0xfe,0x3e,0x02,0x58,0xfe,0xd4,0x02,0x58,0xfc,0x90,0x02,0x58,0xfc,0x71, +0x02,0x58,0xfe,0x82,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfe,0xd1,0x02,0x58,0xfc,0xc9,0x02,0x58,0xfc,0x44,0x02,0x58,0xfe,0xb3,0x02,0x58,0xfc,0x2c,0x02,0x58,0xfe,0x52,0x02,0x58,0xfe,0x81,0x02,0x58,0xfe,0x81,0x02,0x58,0xfe,0xc5,0x02,0x58,0xfc,0xbd,0x02,0x58,0xfe,0xc5,0x02,0x58,0xfc,0x68,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa5, +0x02,0x58,0xfe,0x90,0x02,0x58,0xfe,0x90,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfb,0xfa,0x02,0x58,0xfe,0x52,0x02,0x58,0xfb,0x9c,0x02,0x58,0xfd,0xe5,0x02,0x58,0xfd,0xcc,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xe9,0x02,0x58,0xfb,0x91, +0x02,0x58,0xf9,0x39,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfb,0x73,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x11,0x02,0x58,0xfb,0xa0,0x02,0x58,0xfe,0x16,0x02,0x58,0xfe,0x3e,0x02,0x58,0xfb,0xfa,0x02,0x58,0xfc,0x13,0x02,0x58,0xfe,0x66,0x02,0x58,0xfe,0x66,0x02,0x58,0xfc,0x22,0x02,0x58,0xfd,0xe4, +0x02,0x58,0xfe,0x5c,0x02,0x58,0xfc,0x0e,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x13,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x1d, +0x02,0x58,0x00,0x9e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x9b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x9f,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xf6, +0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0xe6,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0x97,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x2d, +0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x41,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x46,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2d, +0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55, +0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x64, +0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x9b, +0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0e,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0xd9,0x02,0x58,0x00,0x23, +0x02,0x58,0x00,0x1e,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00, +0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00, +0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x1d,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x28, +0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x6e, +0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x6e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x0a, +0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0xd8,0x02,0x58,0xff,0xd8,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00, +0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x01,0x2c,0x02,0x58,0x02,0x0d,0x02,0x58,0x00,0x00,0x02,0x58,0x01,0x2c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00, +0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x01,0x2c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6, +0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0xb4,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6, +0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x96, +0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x8c,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, +0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa, +0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec, +0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, +0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x19, +0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, +0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, +0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa, +0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x44,0x02,0x58,0x00,0x44,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32, +0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x1e, +0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00, +0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xaa,0x02,0x58,0x00,0x7d, +0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x58,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x27, +0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x46, +0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xc3,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xc3,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d, +0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x51, +0x02,0x58,0x00,0x14,0x02,0x58,0xff,0x5b,0x02,0x58,0xff,0xc9,0x02,0x58,0xff,0xa9,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x52,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec, +0x02,0x58,0x00,0xf5,0x02,0x58,0x00,0x06,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x49,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0f, +0x02,0x58,0x00,0x37,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0xfe,0x13,0x02,0x58,0xfe,0x07,0x02,0x58,0xfb,0xc8,0x02,0x58,0xfd,0xda,0x02,0x58,0xfb,0x82,0x02,0x58,0xfd,0xdf,0x02,0x58,0xfd,0xd5,0x02,0x58,0xfd,0xc6,0x02,0x58,0xfb,0x73,0x02,0x58,0xfd,0xd5,0x02,0x58,0xfe,0xa7,0x02,0x58,0xfb,0xd2,0x02,0x58,0xfe,0xbb, +0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0xe3,0x02,0x58,0xfc,0xa4,0x02,0x58,0xfc,0xc7,0x02,0x58,0xfa,0xc9,0x02,0x58,0xfc,0xa4,0x02,0x58,0xfc,0xd6,0x02,0x58,0xfe,0xa7,0x02,0x58,0xfb,0xd2,0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0x13,0x02,0x58,0xfe,0x20,0x02,0x58,0xfb,0xff,0x02,0x58,0xfd,0xda,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xa0, +0x02,0x58,0xfb,0xa0,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfd,0xfd,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa1,0x02,0x58,0xfe,0x0c,0x02,0x58,0xfb,0xb3,0x02,0x58,0xfe,0x61,0x02,0x58,0xfe,0x89,0x02,0x58,0xfe,0xcf,0x02,0x58,0xfb,0xb3,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xb3, +0x02,0x58,0xfb,0xb3,0x02,0x58,0xfc,0x6d,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x89,0x02,0x58,0xfb,0xcd,0x02,0x58,0xf9,0x43,0x02,0x58,0xfd,0xee,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfe,0x98,0x02,0x58,0xfc,0x77,0x02,0x58,0xfa,0x7e,0x02,0x58,0xfb,0xe6, +0x02,0x58,0xfe,0x07,0x02,0x58,0xfb,0xbe,0x02,0x58,0xf9,0x43,0x02,0x58,0xfd,0xee,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfe,0xcf,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xf9,0x43,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x34,0x02,0x58,0xfe,0x47,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0xf5, +0x02,0x58,0xfb,0x9b,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xf5,0x02,0x58,0xfe,0x11,0x02,0x58,0xfd,0xee,0x02,0x58,0xfd,0xee,0x02,0x58,0xfe,0x57,0x02,0x58,0xfb,0x96,0x02,0x58,0xfe,0x39,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa0,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x41, +0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xa5,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x4a,0x00,0x00,0xfe,0x90,0x00,0x00,0xfe,0x3b,0x00,0x00,0xff,0x60,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x5c, +0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xfd,0xf0,0x00,0x00,0xfe,0x7a,0x00,0x00,0xff,0x18,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x5c,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x75,0x00,0x00,0xfe,0x61,0x00,0x00,0xfd,0x8a,0x00,0x00,0xfd,0xcb,0x00,0x00,0xfe,0x16,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0xe5, +0x02,0x58,0x00,0xa2,0x02,0x58,0x00,0xe8,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0xb9,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x4a,0x00,0x00,0xfe,0x90, +0x00,0x00,0xfe,0x3b,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x5c,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xfd,0xf0,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xff,0x1b,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x75, +0x00,0x00,0xfe,0x61,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0xe5,0x02,0x58,0x00,0xa2,0x02,0x58,0x00,0xe8,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xe1, +0x02,0x58,0x00,0x7d,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20, +0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xd8,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x00,0x00,0x00,0x00,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x24, +0x00,0x00,0x00,0x04,0x00,0x00,0x0f,0x12,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x03,0x00,0x0a,0x00,0x00,0x0f,0x12,0x00,0x04,0x0e,0xee,0x00,0x00,0x01,0xa8,0x01,0x00,0x00,0x07,0x00,0xa8,0x00,0x0d,0x00,0x2f,0x00,0x39,0x00,0x7e,0x01,0x31,0x01,0x7f,0x01,0x90,0x01,0x92,0x01,0x9b,0x01,0xa1,0x01,0xb0,0x01,0xce,0x01,0xd0, +0x01,0xd2,0x01,0xd4,0x01,0xd6,0x01,0xd8,0x01,0xda,0x01,0xdc,0x01,0xe7,0x01,0xeb,0x01,0xf5,0x01,0xff,0x02,0x1b,0x02,0x33,0x02,0x37,0x02,0x59,0x02,0xba,0x02,0xbc,0x02,0xc7,0x02,0xc9,0x02,0xdd,0x02,0xf3,0x02,0xf7,0x03,0x04,0x03,0x0c,0x03,0x0f,0x03,0x12,0x03,0x1b,0x03,0x23,0x03,0x28,0x03,0x38,0x03,0x75,0x03,0x7e,0x03,0x8a, +0x03,0x8c,0x03,0x90,0x03,0xa1,0x03,0xa9,0x03,0xb0,0x03,0xc9,0x03,0xcf,0x03,0xd7,0x04,0x0c,0x04,0x1a,0x04,0x23,0x04,0x3a,0x04,0x43,0x04,0x4f,0x04,0x5c,0x04,0x5f,0x04,0x93,0x04,0x9b,0x04,0xa3,0x04,0xb1,0x04,0xb7,0x04,0xbb,0x04,0xd9,0x04,0xdf,0x04,0xe9,0x04,0xf5,0x0a,0xea,0x1e,0x85,0x1e,0x9e,0x1e,0xf9,0x20,0x01,0x20,0x0b, +0x20,0x10,0x20,0x14,0x20,0x16,0x20,0x22,0x20,0x24,0x20,0x26,0x20,0x30,0x20,0x34,0x20,0x3a,0x20,0x3f,0x20,0x46,0x20,0x70,0x20,0x79,0x20,0x7a,0x20,0x7c,0x20,0x89,0x20,0xac,0x20,0xae,0x20,0xb4,0x20,0xbd,0x20,0xbf,0x21,0x02,0x21,0x0d,0x21,0x13,0x21,0x16,0x21,0x1a,0x21,0x1d,0x21,0x22,0x21,0x24,0x21,0x2e,0x21,0x40,0x21,0x8b, +0x21,0x99,0x21,0x9e,0x21,0xa0,0x21,0xa3,0x21,0xa7,0x21,0xaa,0x21,0xad,0x21,0xbe,0x21,0xc9,0x21,0xd4,0x21,0xdb,0x21,0xdf,0x21,0xe5,0x21,0xe8,0x21,0xea,0x22,0x0c,0x22,0x13,0x22,0x15,0x22,0x1a,0x22,0x1e,0x22,0x25,0x22,0x2b,0x22,0x39,0x22,0x3c,0x22,0x3e,0x22,0x43,0x22,0x45,0x22,0x49,0x22,0x4b,0x22,0x4d,0x22,0x54,0x22,0x57, +0x22,0x65,0x22,0x73,0x22,0x7c,0x22,0x89,0x22,0x99,0x22,0xa5,0x22,0xb4,0x22,0xb8,0x22,0xbd,0x22,0xc4,0x22,0xc6,0x22,0xca,0x22,0xce,0x22,0xd0,0x22,0xe2,0x22,0xf1,0x23,0x05,0x23,0x0b,0x23,0x18,0x23,0x1f,0x23,0x26,0x23,0x28,0x23,0x2b,0x23,0x7a,0x23,0x8b,0x23,0x95,0x23,0xad,0x23,0xce,0x23,0xfe,0x24,0x21,0x24,0x24,0x25,0x94, +0x25,0x9f,0x25,0xa1,0x25,0xab,0x25,0xcc,0x25,0xcf,0x25,0xd5,0x25,0xe6,0x25,0xeb,0x25,0xef,0x25,0xf6,0x26,0x6d,0x26,0x6f,0x26,0x87,0x26,0xa1,0x27,0x13,0x27,0x15,0x27,0x17,0x27,0x36,0x27,0x71,0x27,0x94,0x27,0x9e,0x27,0xc6,0x27,0xdc,0x27,0xeb,0x27,0xf7,0x29,0x16,0x29,0x4a,0x29,0x88,0x2a,0x00,0x2a,0x06,0x2b,0x58,0xe0,0xa2, +0xe0,0xb3,0xfe,0x62,0xfe,0xff,0xff,0x5b,0xff,0x5d,0xff,0xfd,0xff,0xff,0x00,0x00,0x00,0x0d,0x00,0x20,0x00,0x30,0x00,0x3a,0x00,0xa0,0x01,0x34,0x01,0x8f,0x01,0x92,0x01,0x9b,0x01,0xa0,0x01,0xaf,0x01,0xcd,0x01,0xd0,0x01,0xd2,0x01,0xd4,0x01,0xd6,0x01,0xd8,0x01,0xda,0x01,0xdc,0x01,0xe6,0x01,0xea,0x01,0xf4,0x01,0xfc,0x02,0x18, +0x02,0x32,0x02,0x37,0x02,0x59,0x02,0xb9,0x02,0xbc,0x02,0xc6,0x02,0xc9,0x02,0xd8,0x02,0xf3,0x02,0xf7,0x03,0x00,0x03,0x06,0x03,0x0f,0x03,0x12,0x03,0x1b,0x03,0x23,0x03,0x25,0x03,0x36,0x03,0x74,0x03,0x7e,0x03,0x84,0x03,0x8c,0x03,0x8e,0x03,0x91,0x03,0xa3,0x03,0xaa,0x03,0xb1,0x03,0xca,0x03,0xd5,0x04,0x01,0x04,0x0e,0x04,0x1b, +0x04,0x24,0x04,0x3b,0x04,0x44,0x04,0x51,0x04,0x5e,0x04,0x90,0x04,0x9a,0x04,0xa2,0x04,0xae,0x04,0xb6,0x04,0xba,0x04,0xd8,0x04,0xdc,0x04,0xe4,0x04,0xf4,0x0a,0xea,0x1e,0x80,0x1e,0x9e,0x1e,0xa0,0x20,0x01,0x20,0x0b,0x20,0x10,0x20,0x13,0x20,0x16,0x20,0x18,0x20,0x24,0x20,0x26,0x20,0x30,0x20,0x32,0x20,0x39,0x20,0x3c,0x20,0x44, +0x20,0x70,0x20,0x74,0x20,0x7a,0x20,0x7c,0x20,0x80,0x20,0xab,0x20,0xae,0x20,0xb4,0x20,0xbd,0x20,0xbf,0x21,0x02,0x21,0x0d,0x21,0x13,0x21,0x15,0x21,0x19,0x21,0x1d,0x21,0x22,0x21,0x24,0x21,0x2e,0x21,0x40,0x21,0x8a,0x21,0x90,0x21,0x9d,0x21,0xa0,0x21,0xa2,0x21,0xa5,0x21,0xa9,0x21,0xad,0x21,0xbe,0x21,0xc9,0x21,0xd0,0x21,0xdb, +0x21,0xde,0x21,0xe5,0x21,0xe7,0x21,0xea,0x22,0x00,0x22,0x0e,0x22,0x15,0x22,0x18,0x22,0x1e,0x22,0x23,0x22,0x27,0x22,0x34,0x22,0x3c,0x22,0x3e,0x22,0x43,0x22,0x45,0x22,0x47,0x22,0x4b,0x22,0x4d,0x22,0x54,0x22,0x57,0x22,0x5f,0x22,0x6a,0x22,0x7a,0x22,0x82,0x22,0x8e,0x22,0x9b,0x22,0xb4,0x22,0xb8,0x22,0xbb,0x22,0xc2,0x22,0xc6, +0x22,0xc8,0x22,0xce,0x22,0xd0,0x22,0xe2,0x22,0xee,0x23,0x02,0x23,0x08,0x23,0x18,0x23,0x1c,0x23,0x24,0x23,0x28,0x23,0x2b,0x23,0x36,0x23,0x89,0x23,0x95,0x23,0x9b,0x23,0xce,0x23,0xfb,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x95,0x25,0xa0,0x25,0xaa,0x25,0xb2,0x25,0xce,0x25,0xd4,0x25,0xe6,0x25,0xe7,0x25,0xef,0x25,0xf6,0x26,0x6d, +0x26,0x6f,0x26,0x87,0x26,0xa0,0x27,0x13,0x27,0x15,0x27,0x17,0x27,0x36,0x27,0x6e,0x27,0x94,0x27,0x9c,0x27,0xc5,0x27,0xdc,0x27,0xe6,0x27,0xf5,0x29,0x16,0x29,0x4a,0x29,0x87,0x2a,0x00,0x2a,0x05,0x2b,0x58,0xe0,0xa0,0xe0,0xb0,0xfe,0x62,0xfe,0xff,0xff,0x5b,0xff,0x5d,0xff,0xfd,0xff,0xff,0x03,0xb3,0x00,0x00,0x02,0xa4,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x36,0xff,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x33,0xff,0x53,0xff,0x80,0xff,0x84,0xff,0x7f,0xff,0x7e,0xff,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xd7,0xfe,0x9a,0x00,0x00,0x03,0xa8,0x03,0xbf,0x03,0x9d,0x00,0x00,0x03,0x10,0x03,0x0d,0x00,0x00,0x00,0x00, +0x03,0x66,0x03,0x64,0x03,0x5c,0x03,0x55,0x03,0x54,0x03,0x47,0x02,0xee,0x00,0x3d,0x00,0x00,0xfe,0xe1,0x00,0x00,0xfe,0xc0,0xfe,0xbf,0x00,0x00,0xfe,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0xbc,0x00,0x00,0xfd,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x3e,0x00,0x00,0xe1,0xe9,0x00,0x00,0xe3,0xbb,0xe3,0xb2,0xe3,0x4b,0xe3,0x46,0xe3,0x21,0x00,0x00,0xe3,0x17,0xe3,0x07,0xe4,0x09,0x00,0x00,0xe3,0x2e,0x00,0x00,0x00,0x00,0xe2,0x92,0xe2,0x92,0xe3,0xc1,0xe3,0x6a,0xe2,0x64,0xe3,0x1b,0xe3,0x1e,0xe3,0x15,0xe3,0x0d,0xe3,0x03,0xe1,0xa0,0xe1,0x9a, +0xe4,0xae,0x00,0x00,0xe1,0x96,0xe1,0x94,0xe4,0x98,0xe1,0x95,0xe4,0x96,0xe3,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0xde,0xe2,0xdd,0xe2,0xdc,0xe2,0xdc,0xe2,0xcf,0xe2,0xc9,0xe2,0xbf,0x00,0x00,0xe2,0xb3,0x00,0x00,0xe2,0x9f,0xe2,0xa8,0xe3,0xf8,0x00,0x00,0x00,0x00,0xe1,0xc8,0x00,0x00,0xe2,0x06,0x00,0x00,0xe1,0xff,0x00,0x00, +0xe2,0x12,0xe1,0xaf,0xe1,0x8d,0xe1,0x92,0x00,0x00,0xe2,0x19,0xe1,0x9b,0xe1,0x81,0xe1,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x54,0xe1,0x44,0x00,0x00,0x00,0x00,0xe1,0x93,0x00,0x00,0xe1,0x0c,0xe1,0x10,0xe1,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0xd1,0x00,0x00,0x00,0x00,0xe2,0xbd,0xe2,0xb8, +0x00,0x00,0x00,0x00,0xe1,0xf0,0x00,0x00,0xe2,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x17,0xdf,0x28,0xdf,0x20,0x00,0x00,0x00,0x00,0xde,0xe9,0xde,0xdd,0xde,0xe5,0xde,0xcd,0xde,0xc9,0xdf,0xf3,0xdf,0xf2,0xdf,0x24,0xdf,0x0c,0xde,0x9b,0xde,0x9a,0xde,0x99,0xde,0x7b,0x00,0x00,0xdc,0xff,0xdc,0xf8,0x00,0x00,0xdc,0x13, +0x00,0x00,0xdc,0xa2,0xdb,0x2d,0xda,0xa4,0xd9,0xce,0xd9,0xfe,0xd9,0xfa,0xda,0x99,0x26,0x24,0x26,0x17,0x05,0xd8,0x04,0xc2,0x03,0xee,0x03,0xed,0x05,0xf9,0x00,0x01,0x00,0x00,0x01,0xa6,0x00,0x00,0x01,0xc2,0x02,0x4a,0x03,0x6c,0x04,0x02,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xf8,0x03,0xfa,0x03,0xfc,0x03,0xfe,0x04,0x04,0x04,0x0a,0x00,0x00,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x04,0x0a,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0e,0x00,0x00,0x04,0x18,0x00,0x00, +0x00,0x00,0x04,0x18,0x00,0x00,0x04,0x22,0x04,0x2c,0x04,0x30,0x04,0x46,0x00,0x00,0x04,0x5c,0x00,0x00,0x04,0x86,0x04,0x9c,0x04,0xb2,0x04,0xb4,0x04,0xba,0x04,0xbc,0x04,0xbe,0x04,0xc4,0x04,0xc6,0x04,0xc8,0x04,0xca,0x04,0xd0,0x04,0xda,0x00,0x00,0x04,0xda,0x00,0x00,0x04,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x05,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x98,0x00,0x00,0x05,0x9a,0x05,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x80,0x05,0x82,0x05,0x94,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x88,0x00,0x00,0x05,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x8a,0x05,0xa2,0x00,0x00,0x05,0xaa,0x00,0x00,0x05,0xac,0x00,0x00,0x05,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xac,0x05,0xb8,0x05,0xca, +0x05,0xce,0x05,0xdc,0x05,0xf2,0x00,0x00,0x00,0x00,0x06,0x02,0x06,0x06,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x0c,0x06,0x12,0x00,0x00,0x06,0x16,0x06,0x1c,0x00,0x00,0x00,0x00,0x06,0x1c,0x06,0xa4,0x00,0x00,0x06,0xa6,0x00,0x00,0x06,0xc8,0x06,0xce,0x07,0x10,0x07,0x12,0x00,0x00,0x00,0x00,0x00,0x00, +0x08,0x34,0x08,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x50,0x00,0x00,0x00,0x00,0x08,0x52,0x00,0x00,0x08,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xbe,0x03,0x2e,0x03,0x6a,0x03,0x3a,0x03,0xc5,0x04,0x38,0x05,0xb5,0x03,0x6b,0x03,0x43,0x03,0x44,0x03,0x34,0x04,0x15,0x03,0x2a,0x03,0x57,0x03,0x29,0x03,0x3d,0x03,0x2b,0x03,0x2c,0x04,0x1c,0x04,0x19,0x04,0x1b,0x03,0x30,0x05,0xb4,0x00,0x01,0x00,0x1a,0x00,0x1b,0x00,0x21,0x00,0x25, +0x00,0x38,0x00,0x39,0x00,0x40,0x00,0x43,0x00,0x4f,0x00,0x51,0x00,0x53,0x00,0x59,0x00,0x5a,0x00,0x60,0x00,0x7a,0x00,0x7c,0x00,0x7d,0x00,0x81,0x00,0x89,0x00,0x8e,0x00,0xa1,0x00,0xa2,0x00,0xa7,0x00,0xa8,0x00,0xb1,0x03,0x47,0x03,0x3e,0x03,0x48,0x04,0x23,0x03,0x5c,0x06,0x82,0x00,0xbd,0x00,0xd6,0x00,0xd7,0x00,0xdd,0x00,0xe1, +0x00,0xf4,0x00,0xf5,0x00,0xfc,0x00,0xff,0x01,0x0d,0x01,0x10,0x01,0x13,0x01,0x1a,0x01,0x1b,0x01,0x22,0x01,0x3d,0x01,0x3f,0x01,0x40,0x01,0x44,0x01,0x4c,0x01,0x51,0x01,0x69,0x01,0x6a,0x01,0x6f,0x01,0x70,0x01,0x79,0x03,0x45,0x05,0xbe,0x03,0x46,0x04,0x22,0x03,0xbf,0x03,0x2f,0x03,0xc3,0x03,0xcb,0x03,0xc4,0x03,0xcd,0x05,0xbf, +0x05,0xb7,0x06,0x80,0x05,0xb8,0x01,0xc6,0x03,0x65,0x04,0x21,0x03,0x58,0x05,0xb9,0x06,0x8a,0x05,0xbb,0x04,0x1f,0x03,0x04,0x03,0x05,0x06,0x83,0x04,0x30,0x05,0xb6,0x03,0x32,0x06,0x8b,0x03,0x03,0x01,0xc7,0x03,0x66,0x03,0x22,0x03,0x21,0x03,0x23,0x03,0x31,0x00,0x12,0x00,0x02,0x00,0x0a,0x00,0x17,0x00,0x10,0x00,0x16,0x00,0x18, +0x00,0x1e,0x00,0x32,0x00,0x26,0x00,0x29,0x00,0x2f,0x00,0x4a,0x00,0x44,0x00,0x46,0x00,0x47,0x00,0x22,0x00,0x5f,0x00,0x6b,0x00,0x61,0x00,0x63,0x00,0x78,0x00,0x69,0x04,0x17,0x00,0x76,0x00,0x94,0x00,0x8f,0x00,0x91,0x00,0x92,0x00,0xa9,0x00,0x7b,0x01,0x4a,0x00,0xce,0x00,0xbe,0x00,0xc6,0x00,0xd3,0x00,0xcc,0x00,0xd2,0x00,0xd4, +0x00,0xda,0x00,0xee,0x00,0xe2,0x00,0xe5,0x00,0xeb,0x01,0x08,0x01,0x01,0x01,0x04,0x01,0x05,0x00,0xde,0x01,0x21,0x01,0x2e,0x01,0x23,0x01,0x26,0x01,0x3b,0x01,0x2c,0x04,0x18,0x01,0x39,0x01,0x5c,0x01,0x52,0x01,0x55,0x01,0x56,0x01,0x71,0x01,0x3e,0x01,0x73,0x00,0x14,0x00,0xd0,0x00,0x03,0x00,0xbf,0x00,0x15,0x00,0xd1,0x00,0x1c, +0x00,0xd8,0x00,0x1f,0x00,0xdb,0x00,0x20,0x00,0xdc,0x00,0x1d,0x00,0xd9,0x00,0x23,0x00,0xdf,0x00,0x24,0x00,0xe0,0x00,0x34,0x00,0xf0,0x00,0x27,0x00,0xe3,0x00,0x30,0x00,0xec,0x00,0x35,0x00,0xf1,0x00,0x28,0x00,0xe4,0x00,0x3d,0x00,0xf9,0x00,0x3b,0x00,0xf7,0x00,0x3f,0x00,0xfb,0x00,0x3e,0x00,0xfa,0x00,0x42,0x00,0xfe,0x00,0x41, +0x00,0xfd,0x00,0x4e,0x01,0x0c,0x00,0x4c,0x01,0x0a,0x00,0x45,0x01,0x02,0x00,0x4d,0x01,0x0b,0x00,0x48,0x01,0x00,0x00,0x50,0x01,0x0f,0x00,0x52,0x01,0x11,0x01,0x12,0x00,0x54,0x01,0x14,0x00,0x56,0x01,0x17,0x00,0x55,0x01,0x16,0x00,0x57,0x01,0x18,0x00,0x58,0x01,0x19,0x00,0x5b,0x01,0x1c,0x00,0x5d,0x01,0x1f,0x00,0x5c,0x01,0x1e, +0x01,0x1d,0x00,0x5e,0x01,0x20,0x00,0x74,0x01,0x37,0x00,0x62,0x01,0x24,0x00,0x73,0x01,0x36,0x00,0x79,0x01,0x3c,0x00,0x7e,0x01,0x41,0x00,0x80,0x01,0x43,0x00,0x7f,0x01,0x42,0x00,0x82,0x01,0x45,0x00,0x85,0x01,0x48,0x00,0x84,0x01,0x47,0x00,0x83,0x01,0x46,0x00,0x8c,0x01,0x4f,0x00,0x8b,0x01,0x4e,0x00,0x8a,0x01,0x4d,0x00,0xa0, +0x01,0x68,0x00,0x9d,0x01,0x65,0x00,0x90,0x01,0x53,0x00,0x9f,0x01,0x67,0x00,0x9c,0x01,0x64,0x00,0x9e,0x01,0x66,0x00,0xa4,0x01,0x6c,0x00,0xaa,0x01,0x72,0x00,0xab,0x00,0xb2,0x01,0x7a,0x00,0xb4,0x01,0x7c,0x00,0xb3,0x01,0x7b,0x01,0x4b,0x00,0x88,0x00,0x36,0x00,0x6d,0x01,0x30,0x00,0x96,0x01,0x5e,0x00,0x09,0x00,0xc5,0x00,0x3c, +0x00,0xf8,0x00,0x75,0x01,0x38,0x00,0x3a,0x00,0xf6,0x00,0x19,0x00,0xd5,0x00,0x77,0x01,0x3a,0x00,0x86,0x01,0x49,0x00,0x8d,0x01,0x50,0x00,0xaf,0x01,0x77,0x06,0x67,0x06,0x65,0x06,0x87,0x06,0x81,0x06,0x88,0x06,0x8c,0x06,0x89,0x06,0x84,0x06,0x6a,0x06,0x6b,0x06,0x6e,0x06,0x72,0x06,0x73,0x06,0x70,0x06,0x69,0x06,0x68,0x06,0x74, +0x06,0x71,0x06,0x6c,0x06,0x6f,0x06,0xb0,0x06,0xb2,0x02,0x69,0x03,0xba,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6e,0x02,0x6f,0x02,0x90,0x02,0x70,0x02,0x71,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x8e,0x02,0x93,0x02,0x8f,0x02,0x92,0x02,0x94,0x02,0x91,0x02,0x95,0x02,0x72,0x02,0x9a,0x02,0x9b,0x02,0x99,0x01,0xd0,0x01,0xf6,0x01,0xcc, +0x01,0xee,0x01,0xed,0x01,0xf0,0x01,0xf1,0x01,0xf2,0x01,0xeb,0x01,0xec,0x01,0xf3,0x01,0xd6,0x01,0xe0,0x01,0xe7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xce,0x01,0xcf,0x01,0xd1,0x01,0xd2,0x01,0xd3,0x01,0xd4,0x01,0xd5,0x01,0xe1,0x01,0xe2,0x01,0xe4,0x01,0xe3,0x01,0xe5,0x01,0xe6,0x01,0xe9,0x01,0xea,0x01,0xe8,0x01,0xef, +0x01,0xf4,0x01,0xf5,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x12,0x02,0x13,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x25,0x02,0x26,0x02,0x28,0x02,0x27,0x02,0x29,0x02,0x2a,0x02,0x2d,0x02,0x2e,0x02,0x2c,0x02,0x33,0x02,0x38,0x02,0x39,0x02,0x14,0x02,0x3a,0x02,0x10,0x02,0x32,0x02,0x31,0x02,0x34,0x02,0x35, +0x02,0x36,0x02,0x2f,0x02,0x30,0x02,0x37,0x02,0x1a,0x02,0x24,0x02,0x2b,0x01,0xcd,0x02,0x11,0x01,0xf7,0x02,0x3b,0x01,0xf8,0x02,0x3c,0x01,0xf9,0x02,0x3d,0x01,0xfa,0x02,0x3e,0x01,0xfb,0x02,0x3f,0x01,0xfc,0x02,0x40,0x01,0xfd,0x02,0x41,0x01,0xfe,0x02,0x42,0x01,0xff,0x02,0x43,0x02,0x00,0x02,0x44,0x02,0x01,0x02,0x45,0x02,0x02, +0x02,0x46,0x02,0x03,0x02,0x47,0x02,0x04,0x02,0x48,0x00,0xa6,0x01,0x6e,0x00,0xa3,0x01,0x6b,0x00,0xa5,0x01,0x6d,0x00,0x11,0x00,0xcd,0x00,0x13,0x00,0xcf,0x00,0x0b,0x00,0xc7,0x00,0x0d,0x00,0xc9,0x00,0x0e,0x00,0xca,0x00,0x0f,0x00,0xcb,0x00,0x0c,0x00,0xc8,0x00,0x04,0x00,0xc0,0x00,0x06,0x00,0xc2,0x00,0x07,0x00,0xc3,0x00,0x08, +0x00,0xc4,0x00,0x05,0x00,0xc1,0x00,0x31,0x00,0xed,0x00,0x33,0x00,0xef,0x00,0x37,0x00,0xf2,0x00,0x2a,0x00,0xe6,0x00,0x2c,0x00,0xe8,0x00,0x2d,0x00,0xe9,0x00,0x2e,0x00,0xea,0x00,0x2b,0x00,0xe7,0x00,0x4b,0x01,0x09,0x00,0x49,0x01,0x07,0x00,0x6a,0x01,0x2d,0x00,0x6c,0x01,0x2f,0x00,0x64,0x01,0x27,0x00,0x66,0x01,0x29,0x00,0x67, +0x01,0x2a,0x00,0x68,0x01,0x2b,0x00,0x65,0x01,0x28,0x00,0x6e,0x01,0x31,0x00,0x70,0x01,0x33,0x00,0x71,0x01,0x34,0x00,0x72,0x01,0x35,0x00,0x6f,0x01,0x32,0x00,0x93,0x01,0x5b,0x00,0x95,0x01,0x5d,0x00,0x97,0x01,0x5f,0x00,0x99,0x01,0x61,0x00,0x9a,0x01,0x62,0x00,0x9b,0x01,0x63,0x00,0x98,0x01,0x60,0x00,0xad,0x01,0x75,0x00,0xac, +0x01,0x74,0x00,0xae,0x01,0x76,0x00,0xb0,0x01,0x78,0x03,0x61,0x03,0x62,0x03,0x5d,0x03,0x63,0x03,0x5f,0x03,0x60,0x03,0x5e,0x03,0x64,0x05,0xc0,0x05,0xc2,0x03,0x33,0x05,0xbc,0x05,0xbd,0x03,0x69,0x03,0x38,0x03,0x39,0x03,0x3c,0x03,0x3f,0x03,0x20,0x03,0x35,0x03,0x36,0x02,0xad,0x05,0xc3,0x05,0xff,0x05,0xfe,0x04,0x77,0x04,0x71, +0x04,0x73,0x04,0x75,0x04,0x79,0x04,0x7a,0x04,0x78,0x04,0x72,0x04,0x74,0x04,0x76,0x04,0x7b,0x04,0x7d,0x04,0x8c,0x04,0x89,0x04,0x8a,0x04,0x8b,0x04,0x8d,0x05,0xe8,0x05,0xe7,0x04,0x65,0x03,0xd6,0x04,0x2f,0x03,0xea,0x04,0x62,0x04,0x25,0x04,0x2b,0x03,0xeb,0x03,0xe2,0x04,0x0b,0x03,0xe3,0x04,0x5d,0x04,0x0a,0x03,0xe5,0x04,0x2c, +0x03,0xd8,0x04,0x2d,0x04,0x16,0x03,0xf9,0x04,0x4d,0x03,0xd4,0x04,0x2e,0x03,0xdc,0x03,0xde,0x04,0x31,0x04,0x63,0x03,0xd1,0x04,0x40,0x04,0x3e,0x03,0xdf,0x03,0xe9,0x04,0x04,0x04,0x20,0x04,0x09,0x04,0x3f,0x04,0x1a,0x03,0xe7,0x04,0x0f,0x04,0x5a,0x04,0x1e,0x04,0x1d,0x03,0xfb,0x03,0xfa,0x03,0xd2,0x04,0x0c,0x04,0x10,0x04,0x0d, +0x04,0x11,0x04,0x0e,0x03,0xf7,0x03,0xec,0x04,0x3c,0x04,0x5c,0x04,0x3d,0x04,0x5b,0x04,0x5f,0x04,0x13,0x04,0x14,0x04,0x41,0x04,0x42,0x04,0x05,0x04,0x06,0x03,0xfd,0x04,0x55,0x04,0x57,0x04,0x56,0x04,0x58,0x04,0x4f,0x04,0x50,0x04,0x70,0x04,0x6d,0x04,0x6e,0x04,0x6c,0x04,0x6f,0x04,0x69,0x04,0x6b,0x04,0x6a,0x04,0x53,0x04,0x52, +0x04,0x54,0x04,0x51,0x04,0x4b,0x04,0x61,0x04,0x60,0x04,0x67,0x04,0x68,0x04,0x01,0x04,0x07,0x04,0x02,0x04,0x03,0x03,0xdb,0x03,0xd3,0x03,0xf3,0x04,0x47,0x03,0xe4,0x03,0xf8,0x04,0x66,0x03,0xe1,0x05,0xe1,0x05,0xca,0x04,0x91,0x05,0xf4,0x03,0x4f,0x03,0x52,0x03,0x50,0x03,0x53,0x05,0xce,0x05,0xcd,0x05,0xcb,0x05,0xcc,0x04,0x92, +0x05,0xe6,0x05,0xe4,0x05,0x65,0x05,0xa0,0x05,0x8f,0x05,0x8c,0x05,0x8b,0x05,0x91,0x05,0x87,0x05,0x6d,0x05,0x6b,0x05,0x9f,0x05,0x68,0x05,0x97,0x05,0x86,0x05,0x93,0x05,0x90,0x05,0x82,0x05,0x9d,0x05,0x92,0x05,0x96,0x05,0x69,0x05,0x79,0x05,0x72,0x05,0x8e,0x05,0x8a,0x05,0x78,0x05,0xa9,0x05,0x98,0x05,0xa8,0x05,0x71,0x05,0x99, +0x05,0x89,0x05,0xa7,0x05,0x7a,0x05,0x8d,0x05,0x9b,0x05,0x73,0x05,0x75,0x05,0x80,0x05,0x6e,0x05,0xa5,0x05,0x9a,0x05,0x6c,0x05,0x88,0x05,0xa6,0x05,0x70,0x05,0xa1,0x05,0x7f,0x05,0x6a,0x05,0x77,0x05,0x81,0x05,0xa3,0x05,0x7c,0x05,0x6f,0x05,0x74,0x05,0xaa,0x05,0xa2,0x05,0x9e,0x05,0x94,0x05,0x95,0x05,0x76,0x05,0xa4,0x05,0x7d, +0x05,0x9c,0x05,0x83,0x05,0x67,0x05,0x7b,0x05,0x7e,0x05,0x84,0x05,0x66,0x05,0xe0,0x05,0xd5,0x05,0xc7,0x04,0x34,0x04,0x32,0x04,0x33,0x04,0x37,0x04,0x35,0x04,0x36,0x03,0xf6,0x03,0xf4,0x03,0xf5,0x04,0x4a,0x04,0x48,0x04,0x49,0x03,0xf2,0x03,0xf1,0x03,0xf0,0x03,0xd9,0x04,0x46,0x04,0x45,0x04,0x44,0x05,0xef,0x05,0xf0,0x05,0xf2, +0x05,0xf3,0x05,0xee,0x05,0xfa,0x05,0xfb,0x05,0xd7,0x05,0xd8,0x05,0xda,0x05,0xb2,0x05,0xc5,0x05,0xb3,0x05,0xdf,0x05,0xeb,0x06,0x01,0x05,0xdd,0x05,0xc9,0x05,0xf8,0x05,0xf7,0x05,0xcf,0x05,0xd2,0x05,0xd4,0x05,0xd3,0x05,0xd1,0x05,0xec,0x05,0xfd,0x05,0xd9,0x05,0xc8,0x05,0xd6,0x05,0xfc,0x05,0xdb,0x05,0xdc,0x05,0xde,0x05,0xf5, +0x06,0x00,0x05,0xf9,0x05,0xd0,0x05,0xc6,0x05,0xed,0x05,0x2e,0x05,0x08,0x05,0x3b,0x05,0x15,0x05,0x34,0x05,0x0e,0x05,0x35,0x05,0x0f,0x05,0x31,0x05,0x0b,0x05,0x32,0x05,0x0c,0x05,0x2d,0x04,0xfc,0x04,0xf6,0x05,0x07,0x05,0x2c,0x04,0xfa,0x04,0xf4,0x05,0x06,0x05,0x3a,0x05,0x55,0x05,0x4f,0x05,0x14,0x05,0x39,0x05,0x53,0x05,0x4d, +0x05,0x12,0x05,0x3e,0x05,0x61,0x05,0x4e,0x04,0xf7,0x05,0x5e,0x04,0xfd,0x05,0x54,0x05,0x18,0x05,0x3d,0x05,0x60,0x05,0x4c,0x04,0xf5,0x05,0x5d,0x04,0xfb,0x05,0x52,0x05,0x17,0x05,0x2b,0x05,0x1a,0x05,0x40,0x04,0xf9,0x04,0xf3,0x05,0x43,0x05,0x1d,0x05,0x05,0x05,0x38,0x05,0x1b,0x05,0x41,0x05,0x51,0x05,0x4b,0x05,0x44,0x05,0x1e, +0x05,0x11,0x05,0x3c,0x05,0x1c,0x05,0x42,0x05,0x5f,0x05,0x4a,0x04,0xf8,0x05,0x5c,0x05,0x20,0x05,0x46,0x05,0x19,0x05,0x3f,0x04,0xfe,0x05,0x50,0x05,0x45,0x05,0x1f,0x05,0x16,0x05,0x28,0x05,0x02,0x05,0x29,0x05,0x03,0x04,0xe8,0x04,0xec,0x05,0x01,0x04,0xf2,0x04,0xe7,0x05,0x00,0x04,0xf1,0x04,0xe6,0x05,0x58,0x05,0x49,0x04,0xeb, +0x05,0x57,0x05,0x48,0x04,0xea,0x05,0x64,0x05,0x5b,0x04,0xef,0x05,0x63,0x05,0x5a,0x04,0xee,0x04,0xff,0x04,0xf0,0x04,0xe5,0x05,0x56,0x05,0x47,0x04,0xe9,0x05,0x62,0x05,0x59,0x04,0xed,0x05,0x22,0x05,0x21,0x05,0x23,0x05,0x24,0x05,0x27,0x05,0x26,0x05,0x25,0x05,0x2f,0x05,0x36,0x05,0x33,0x05,0x2a,0x05,0x09,0x05,0x10,0x05,0x0d, +0x05,0x04,0x05,0x30,0x05,0x37,0x05,0x0a,0x05,0x13,0x04,0xa2,0x04,0x9a,0x04,0x9b,0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xaa,0x04,0xa9,0x04,0xa8,0x04,0xa7,0x04,0xa6,0x04,0xa5,0x04,0xa4,0x04,0xab,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xa3,0x04,0xd1,0x04,0xd5,0x04,0xdd,0x04,0xe1,0x04,0xd2,0x04,0xd6, +0x04,0xde,0x04,0xe2,0x04,0xd9,0x04,0xdb,0x04,0xd3,0x04,0xd7,0x04,0xdf,0x04,0xe3,0x04,0xd4,0x04,0xd8,0x04,0xe0,0x04,0xe4,0x04,0xda,0x04,0xdc,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc1,0x04,0xc7,0x04,0xbb,0x04,0xc0,0x04,0xc2,0x04,0xba,0x03,0x4c,0x03,0x4e,0x03,0x4b,0x03,0x4d,0x03,0x51,0x03,0x54,0x03,0xb6,0x03,0xb9,0x03,0xb4, +0x03,0xb7,0x03,0xb5,0x03,0xb8,0x00,0x0c,0x00,0x00,0x00,0x00,0x33,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x46,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x03,0xc0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x03,0xbe,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x03,0x2e,0x00,0x00,0x00,0x22,0x00,0x00, +0x00,0x22,0x00,0x00,0x03,0x6a,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x03,0x3a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x03,0xc5,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x25,0x00,0x00,0x04,0x38,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x05,0xb5,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x00, +0x03,0x6b,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x29,0x00,0x00,0x03,0x43,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x03,0x34,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x04,0x15,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x2c,0x00,0x00,0x03,0x2a,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x00,0x00,0x03,0x57,0x00,0x00, +0x00,0x2e,0x00,0x00,0x00,0x2e,0x00,0x00,0x03,0x29,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x2f,0x00,0x00,0x03,0x3d,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x39,0x00,0x00,0x02,0xd4,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x3b,0x00,0x00,0x03,0x2b,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3c,0x00,0x00,0x04,0x1c,0x00,0x00,0x00,0x3d,0x00,0x00, +0x00,0x3d,0x00,0x00,0x04,0x19,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3e,0x00,0x00,0x04,0x1b,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x03,0x30,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x05,0xb4,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x43,0x00,0x00, +0x00,0x1a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x43,0x00,0x00, +0x00,0x4a,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x50,0x00,0x00, +0x00,0x50,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x57,0x00,0x00, +0x00,0xa1,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x5b,0x00,0x00,0x03,0x47,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x5c,0x00,0x00,0x03,0x3e,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5d,0x00,0x00,0x03,0x48,0x00,0x00, +0x00,0x5e,0x00,0x00,0x00,0x5e,0x00,0x00,0x04,0x23,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x5f,0x00,0x00,0x03,0x5c,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x64,0x00,0x00, +0x00,0x64,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x6a,0x00,0x00, +0x01,0x0d,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x6b,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x6c,0x00,0x00,0x01,0x13,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x6e,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x6f,0x00,0x00,0x01,0x22,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0x3d,0x00,0x00, +0x00,0x71,0x00,0x00,0x00,0x72,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x01,0x44,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x74,0x00,0x00,0x01,0x4c,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x75,0x00,0x00,0x01,0x51,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x77,0x00,0x00,0x01,0x69,0x00,0x00,0x00,0x78,0x00,0x00, +0x00,0x79,0x00,0x00,0x01,0x6f,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x7a,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x03,0x45,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x7c,0x00,0x00,0x05,0xbe,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x7d,0x00,0x00,0x03,0x46,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x7e,0x00,0x00, +0x04,0x22,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xa0,0x00,0x00,0x03,0xbf,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0xa1,0x00,0x00,0x03,0x2f,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xa2,0x00,0x00,0x03,0xc3,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xa3,0x00,0x00,0x03,0xcb,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x03,0xc4,0x00,0x00, +0x00,0xa5,0x00,0x00,0x00,0xa5,0x00,0x00,0x03,0xcd,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xa6,0x00,0x00,0x05,0xbf,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xa7,0x00,0x00,0x05,0xb7,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xa8,0x00,0x00,0x06,0x80,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xa9,0x00,0x00,0x05,0xb8,0x00,0x00,0x00,0xaa,0x00,0x00, +0x00,0xaa,0x00,0x00,0x01,0xc6,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xab,0x00,0x00,0x03,0x65,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xac,0x00,0x00,0x04,0x21,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0xad,0x00,0x00,0x03,0x58,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x05,0xb9,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0xaf,0x00,0x00, +0x06,0x8a,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xb0,0x00,0x00,0x05,0xbb,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0xb1,0x00,0x00,0x04,0x1f,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xb3,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xb4,0x00,0x00,0x06,0x83,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0xb5,0x00,0x00,0x04,0x30,0x00,0x00, +0x00,0xb6,0x00,0x00,0x00,0xb6,0x00,0x00,0x05,0xb6,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xb8,0x00,0x00,0x06,0x8b,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xb9,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0xba,0x00,0x00,0x01,0xc7,0x00,0x00,0x00,0xbb,0x00,0x00, +0x00,0xbb,0x00,0x00,0x03,0x66,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbc,0x00,0x00,0x03,0x22,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xbd,0x00,0x00,0x03,0x21,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0xbe,0x00,0x00,0x03,0x23,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xbf,0x00,0x00,0x03,0x31,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00, +0x00,0x12,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x16,0x00,0x00, +0x00,0xc6,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0xcb,0x00,0x00, +0x00,0xcb,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0xd1,0x00,0x00, +0x00,0x5f,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x69,0x00,0x00, +0x00,0xd7,0x00,0x00,0x00,0xd7,0x00,0x00,0x04,0x17,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0xdd,0x00,0x00, +0x00,0xdd,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0xdf,0x00,0x00,0x01,0x4a,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0xe2,0x00,0x00, +0x00,0xc6,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0xda,0x00,0x00, +0x00,0xe8,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x08,0x00,0x00,0x00,0xed,0x00,0x00, +0x00,0xed,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0xef,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0xf1,0x00,0x00,0x01,0x21,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0xf2,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0xf3,0x00,0x00, +0x01,0x23,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0xf4,0x00,0x00,0x01,0x26,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0xf5,0x00,0x00,0x01,0x3b,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xf6,0x00,0x00,0x01,0x2c,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0xf7,0x00,0x00,0x04,0x18,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x00,0x00,0x01,0x39,0x00,0x00, +0x00,0xf9,0x00,0x00,0x00,0xf9,0x00,0x00,0x01,0x5c,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xfa,0x00,0x00,0x01,0x52,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xfc,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0xfd,0x00,0x00,0x01,0x71,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0xff,0x00,0x00, +0x00,0xff,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x01,0x04,0x00,0x00,0x01,0x04,0x00,0x00, +0x00,0x15,0x00,0x00,0x01,0x05,0x00,0x00,0x01,0x05,0x00,0x00,0x00,0xd1,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x1c,0x00,0x00,0x01,0x07,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0xd8,0x00,0x00,0x01,0x08,0x00,0x00,0x01,0x08,0x00,0x00,0x00,0x1f,0x00,0x00,0x01,0x09,0x00,0x00,0x01,0x09,0x00,0x00,0x00,0xdb,0x00,0x00, +0x01,0x0a,0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x0b,0x00,0x00,0x00,0xdc,0x00,0x00,0x01,0x0c,0x00,0x00,0x01,0x0c,0x00,0x00,0x00,0x1d,0x00,0x00,0x01,0x0d,0x00,0x00,0x01,0x0d,0x00,0x00,0x00,0xd9,0x00,0x00,0x01,0x0e,0x00,0x00,0x01,0x0e,0x00,0x00,0x00,0x23,0x00,0x00,0x01,0x0f,0x00,0x00, +0x01,0x0f,0x00,0x00,0x00,0xdf,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x11,0x00,0x00,0x00,0xe0,0x00,0x00,0x01,0x12,0x00,0x00,0x01,0x12,0x00,0x00,0x00,0x34,0x00,0x00,0x01,0x13,0x00,0x00,0x01,0x13,0x00,0x00,0x00,0xf0,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x14,0x00,0x00, +0x00,0x27,0x00,0x00,0x01,0x15,0x00,0x00,0x01,0x15,0x00,0x00,0x00,0xe3,0x00,0x00,0x01,0x16,0x00,0x00,0x01,0x16,0x00,0x00,0x00,0x30,0x00,0x00,0x01,0x17,0x00,0x00,0x01,0x17,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0x18,0x00,0x00,0x00,0x35,0x00,0x00,0x01,0x19,0x00,0x00,0x01,0x19,0x00,0x00,0x00,0xf1,0x00,0x00, +0x01,0x1a,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x28,0x00,0x00,0x01,0x1b,0x00,0x00,0x01,0x1b,0x00,0x00,0x00,0xe4,0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x3d,0x00,0x00,0x01,0x1d,0x00,0x00,0x01,0x1d,0x00,0x00,0x00,0xf9,0x00,0x00,0x01,0x1e,0x00,0x00,0x01,0x1e,0x00,0x00,0x00,0x3b,0x00,0x00,0x01,0x1f,0x00,0x00, +0x01,0x1f,0x00,0x00,0x00,0xf7,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,0x01,0x21,0x00,0x00,0x00,0xfb,0x00,0x00,0x01,0x22,0x00,0x00,0x01,0x22,0x00,0x00,0x00,0x3e,0x00,0x00,0x01,0x23,0x00,0x00,0x01,0x23,0x00,0x00,0x00,0xfa,0x00,0x00,0x01,0x24,0x00,0x00,0x01,0x24,0x00,0x00, +0x00,0x42,0x00,0x00,0x01,0x25,0x00,0x00,0x01,0x25,0x00,0x00,0x00,0xfe,0x00,0x00,0x01,0x26,0x00,0x00,0x01,0x26,0x00,0x00,0x00,0x41,0x00,0x00,0x01,0x27,0x00,0x00,0x01,0x27,0x00,0x00,0x00,0xfd,0x00,0x00,0x01,0x28,0x00,0x00,0x01,0x28,0x00,0x00,0x00,0x4e,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x0c,0x00,0x00, +0x01,0x2a,0x00,0x00,0x01,0x2a,0x00,0x00,0x00,0x4c,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x0a,0x00,0x00,0x01,0x2c,0x00,0x00,0x01,0x2c,0x00,0x00,0x00,0x45,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x2e,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0x4d,0x00,0x00,0x01,0x2f,0x00,0x00, +0x01,0x2f,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x30,0x00,0x00,0x01,0x30,0x00,0x00,0x00,0x48,0x00,0x00,0x01,0x31,0x00,0x00,0x01,0x31,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x34,0x00,0x00,0x01,0x34,0x00,0x00,0x00,0x50,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x0f,0x00,0x00,0x01,0x36,0x00,0x00,0x01,0x36,0x00,0x00, +0x00,0x52,0x00,0x00,0x01,0x37,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x39,0x00,0x00,0x01,0x39,0x00,0x00,0x00,0x54,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x3b,0x00,0x00,0x01,0x3b,0x00,0x00,0x00,0x56,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x17,0x00,0x00, +0x01,0x3d,0x00,0x00,0x01,0x3d,0x00,0x00,0x00,0x55,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x16,0x00,0x00,0x01,0x3f,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x57,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0x41,0x00,0x00,0x01,0x41,0x00,0x00,0x00,0x58,0x00,0x00,0x01,0x42,0x00,0x00, +0x01,0x42,0x00,0x00,0x01,0x19,0x00,0x00,0x01,0x43,0x00,0x00,0x01,0x43,0x00,0x00,0x00,0x5b,0x00,0x00,0x01,0x44,0x00,0x00,0x01,0x44,0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x45,0x00,0x00,0x01,0x45,0x00,0x00,0x00,0x5d,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x1f,0x00,0x00,0x01,0x47,0x00,0x00,0x01,0x47,0x00,0x00, +0x00,0x5c,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x1e,0x00,0x00,0x01,0x49,0x00,0x00,0x01,0x49,0x00,0x00,0x01,0x1d,0x00,0x00,0x01,0x4a,0x00,0x00,0x01,0x4a,0x00,0x00,0x00,0x5e,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x4c,0x00,0x00,0x01,0x4c,0x00,0x00,0x00,0x74,0x00,0x00, +0x01,0x4d,0x00,0x00,0x01,0x4d,0x00,0x00,0x01,0x37,0x00,0x00,0x01,0x4e,0x00,0x00,0x01,0x4e,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x24,0x00,0x00,0x01,0x50,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x73,0x00,0x00,0x01,0x51,0x00,0x00,0x01,0x51,0x00,0x00,0x01,0x36,0x00,0x00,0x01,0x52,0x00,0x00, +0x01,0x52,0x00,0x00,0x00,0x79,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x54,0x00,0x00,0x01,0x54,0x00,0x00,0x00,0x7e,0x00,0x00,0x01,0x55,0x00,0x00,0x01,0x55,0x00,0x00,0x01,0x41,0x00,0x00,0x01,0x56,0x00,0x00,0x01,0x56,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x57,0x00,0x00,0x01,0x57,0x00,0x00, +0x01,0x43,0x00,0x00,0x01,0x58,0x00,0x00,0x01,0x58,0x00,0x00,0x00,0x7f,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0x42,0x00,0x00,0x01,0x5a,0x00,0x00,0x01,0x5a,0x00,0x00,0x00,0x82,0x00,0x00,0x01,0x5b,0x00,0x00,0x01,0x5b,0x00,0x00,0x01,0x45,0x00,0x00,0x01,0x5c,0x00,0x00,0x01,0x5c,0x00,0x00,0x00,0x85,0x00,0x00, +0x01,0x5d,0x00,0x00,0x01,0x5d,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x5e,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x84,0x00,0x00,0x01,0x5f,0x00,0x00,0x01,0x5f,0x00,0x00,0x01,0x47,0x00,0x00,0x01,0x60,0x00,0x00,0x01,0x60,0x00,0x00,0x00,0x83,0x00,0x00,0x01,0x61,0x00,0x00,0x01,0x61,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x62,0x00,0x00, +0x01,0x62,0x00,0x00,0x00,0x8c,0x00,0x00,0x01,0x63,0x00,0x00,0x01,0x63,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x64,0x00,0x00,0x01,0x64,0x00,0x00,0x00,0x8b,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x4e,0x00,0x00,0x01,0x66,0x00,0x00,0x01,0x66,0x00,0x00,0x00,0x8a,0x00,0x00,0x01,0x67,0x00,0x00,0x01,0x67,0x00,0x00, +0x01,0x4d,0x00,0x00,0x01,0x68,0x00,0x00,0x01,0x68,0x00,0x00,0x00,0xa0,0x00,0x00,0x01,0x69,0x00,0x00,0x01,0x69,0x00,0x00,0x01,0x68,0x00,0x00,0x01,0x6a,0x00,0x00,0x01,0x6a,0x00,0x00,0x00,0x9d,0x00,0x00,0x01,0x6b,0x00,0x00,0x01,0x6b,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x6c,0x00,0x00,0x00,0x90,0x00,0x00, +0x01,0x6d,0x00,0x00,0x01,0x6d,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x6e,0x00,0x00,0x01,0x6e,0x00,0x00,0x00,0x9f,0x00,0x00,0x01,0x6f,0x00,0x00,0x01,0x6f,0x00,0x00,0x01,0x67,0x00,0x00,0x01,0x70,0x00,0x00,0x01,0x70,0x00,0x00,0x00,0x9c,0x00,0x00,0x01,0x71,0x00,0x00,0x01,0x71,0x00,0x00,0x01,0x64,0x00,0x00,0x01,0x72,0x00,0x00, +0x01,0x72,0x00,0x00,0x00,0x9e,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x66,0x00,0x00,0x01,0x74,0x00,0x00,0x01,0x74,0x00,0x00,0x00,0xa4,0x00,0x00,0x01,0x75,0x00,0x00,0x01,0x75,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x76,0x00,0x00,0x01,0x76,0x00,0x00,0x00,0xaa,0x00,0x00,0x01,0x77,0x00,0x00,0x01,0x77,0x00,0x00, +0x01,0x72,0x00,0x00,0x01,0x78,0x00,0x00,0x01,0x78,0x00,0x00,0x00,0xab,0x00,0x00,0x01,0x79,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0xb2,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7b,0x00,0x00,0x01,0x7b,0x00,0x00,0x00,0xb4,0x00,0x00,0x01,0x7c,0x00,0x00,0x01,0x7c,0x00,0x00,0x01,0x7c,0x00,0x00, +0x01,0x7d,0x00,0x00,0x01,0x7d,0x00,0x00,0x00,0xb3,0x00,0x00,0x01,0x7e,0x00,0x00,0x01,0x7e,0x00,0x00,0x01,0x7b,0x00,0x00,0x01,0x7f,0x00,0x00,0x01,0x7f,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x8f,0x00,0x00,0x01,0x8f,0x00,0x00,0x00,0x88,0x00,0x00,0x01,0x90,0x00,0x00,0x01,0x90,0x00,0x00,0x00,0x36,0x00,0x00,0x01,0x92,0x00,0x00, +0x01,0x92,0x00,0x00,0x03,0xc8,0x00,0x00,0x01,0x9b,0x00,0x00,0x01,0x9b,0x00,0x00,0x01,0x15,0x00,0x00,0x01,0xa0,0x00,0x00,0x01,0xa0,0x00,0x00,0x00,0x6d,0x00,0x00,0x01,0xa1,0x00,0x00,0x01,0xa1,0x00,0x00,0x01,0x30,0x00,0x00,0x01,0xaf,0x00,0x00,0x01,0xaf,0x00,0x00,0x00,0x96,0x00,0x00,0x01,0xb0,0x00,0x00,0x01,0xb0,0x00,0x00, +0x01,0x5e,0x00,0x00,0x01,0xcd,0x00,0x00,0x01,0xcd,0x00,0x00,0x00,0x09,0x00,0x00,0x01,0xce,0x00,0x00,0x01,0xce,0x00,0x00,0x00,0xc5,0x00,0x00,0x01,0xd0,0x00,0x00,0x01,0xd0,0x00,0x00,0x01,0x03,0x00,0x00,0x01,0xd2,0x00,0x00,0x01,0xd2,0x00,0x00,0x01,0x25,0x00,0x00,0x01,0xd4,0x00,0x00,0x01,0xd4,0x00,0x00,0x01,0x54,0x00,0x00, +0x01,0xd6,0x00,0x00,0x01,0xd6,0x00,0x00,0x01,0x5a,0x00,0x00,0x01,0xd8,0x00,0x00,0x01,0xd8,0x00,0x00,0x01,0x57,0x00,0x00,0x01,0xda,0x00,0x00,0x01,0xda,0x00,0x00,0x01,0x58,0x00,0x00,0x01,0xdc,0x00,0x00,0x01,0xdc,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0xe6,0x00,0x00,0x01,0xe6,0x00,0x00,0x00,0x3c,0x00,0x00,0x01,0xe7,0x00,0x00, +0x01,0xe7,0x00,0x00,0x00,0xf8,0x00,0x00,0x01,0xea,0x00,0x00,0x01,0xea,0x00,0x00,0x00,0x75,0x00,0x00,0x01,0xeb,0x00,0x00,0x01,0xeb,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0xf4,0x00,0x00,0x01,0xf4,0x00,0x00,0x00,0x3a,0x00,0x00,0x01,0xf5,0x00,0x00,0x01,0xf5,0x00,0x00,0x00,0xf6,0x00,0x00,0x01,0xfc,0x00,0x00,0x01,0xfc,0x00,0x00, +0x00,0x19,0x00,0x00,0x01,0xfd,0x00,0x00,0x01,0xfd,0x00,0x00,0x00,0xd5,0x00,0x00,0x01,0xfe,0x00,0x00,0x01,0xfe,0x00,0x00,0x00,0x77,0x00,0x00,0x01,0xff,0x00,0x00,0x01,0xff,0x00,0x00,0x01,0x3a,0x00,0x00,0x02,0x18,0x00,0x00,0x02,0x18,0x00,0x00,0x00,0x86,0x00,0x00,0x02,0x19,0x00,0x00,0x02,0x19,0x00,0x00,0x01,0x49,0x00,0x00, +0x02,0x1a,0x00,0x00,0x02,0x1a,0x00,0x00,0x00,0x8d,0x00,0x00,0x02,0x1b,0x00,0x00,0x02,0x1b,0x00,0x00,0x01,0x50,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x00,0xaf,0x00,0x00,0x02,0x33,0x00,0x00,0x02,0x33,0x00,0x00,0x01,0x77,0x00,0x00,0x02,0x37,0x00,0x00,0x02,0x37,0x00,0x00,0x01,0x0e,0x00,0x00,0x02,0x59,0x00,0x00, +0x02,0x59,0x00,0x00,0x00,0xf3,0x00,0x00,0x02,0xb9,0x00,0x00,0x02,0xb9,0x00,0x00,0x06,0x67,0x00,0x00,0x02,0xba,0x00,0x00,0x02,0xba,0x00,0x00,0x06,0x65,0x00,0x00,0x02,0xbc,0x00,0x00,0x02,0xbc,0x00,0x00,0x06,0x64,0x00,0x00,0x02,0xc6,0x00,0x00,0x02,0xc7,0x00,0x00,0x06,0x85,0x00,0x00,0x02,0xc9,0x00,0x00,0x02,0xc9,0x00,0x00, +0x06,0x66,0x00,0x00,0x02,0xd8,0x00,0x00,0x02,0xd8,0x00,0x00,0x06,0x87,0x00,0x00,0x02,0xd9,0x00,0x00,0x02,0xd9,0x00,0x00,0x06,0x81,0x00,0x00,0x02,0xda,0x00,0x00,0x02,0xda,0x00,0x00,0x06,0x88,0x00,0x00,0x02,0xdb,0x00,0x00,0x02,0xdb,0x00,0x00,0x06,0x8c,0x00,0x00,0x02,0xdc,0x00,0x00,0x02,0xdc,0x00,0x00,0x06,0x89,0x00,0x00, +0x02,0xdd,0x00,0x00,0x02,0xdd,0x00,0x00,0x06,0x84,0x00,0x00,0x02,0xf3,0x00,0x00,0x02,0xf3,0x00,0x00,0x06,0x03,0x00,0x00,0x02,0xf7,0x00,0x00,0x02,0xf7,0x00,0x00,0x06,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x06,0x6a,0x00,0x00,0x03,0x02,0x00,0x00,0x03,0x02,0x00,0x00,0x06,0x6e,0x00,0x00,0x03,0x03,0x00,0x00, +0x03,0x04,0x00,0x00,0x06,0x72,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x06,0x70,0x00,0x00,0x03,0x07,0x00,0x00,0x03,0x07,0x00,0x00,0x06,0x69,0x00,0x00,0x03,0x08,0x00,0x00,0x03,0x08,0x00,0x00,0x06,0x68,0x00,0x00,0x03,0x09,0x00,0x00,0x03,0x09,0x00,0x00,0x06,0x74,0x00,0x00,0x03,0x0a,0x00,0x00,0x03,0x0a,0x00,0x00, +0x06,0x71,0x00,0x00,0x03,0x0b,0x00,0x00,0x03,0x0b,0x00,0x00,0x06,0x6c,0x00,0x00,0x03,0x0c,0x00,0x00,0x03,0x0c,0x00,0x00,0x06,0x6f,0x00,0x00,0x03,0x0f,0x00,0x00,0x03,0x0f,0x00,0x00,0x06,0x75,0x00,0x00,0x03,0x12,0x00,0x00,0x03,0x12,0x00,0x00,0x06,0x76,0x00,0x00,0x03,0x1b,0x00,0x00,0x03,0x1b,0x00,0x00,0x06,0x77,0x00,0x00, +0x03,0x23,0x00,0x00,0x03,0x23,0x00,0x00,0x06,0x78,0x00,0x00,0x03,0x25,0x00,0x00,0x03,0x28,0x00,0x00,0x06,0x79,0x00,0x00,0x03,0x36,0x00,0x00,0x03,0x38,0x00,0x00,0x06,0x7d,0x00,0x00,0x03,0x74,0x00,0x00,0x03,0x75,0x00,0x00,0x06,0x62,0x00,0x00,0x03,0x7e,0x00,0x00,0x03,0x7e,0x00,0x00,0x03,0xbb,0x00,0x00,0x03,0x84,0x00,0x00, +0x03,0x84,0x00,0x00,0x06,0xb0,0x00,0x00,0x03,0x85,0x00,0x00,0x03,0x85,0x00,0x00,0x06,0xb2,0x00,0x00,0x03,0x86,0x00,0x00,0x03,0x86,0x00,0x00,0x02,0x69,0x00,0x00,0x03,0x87,0x00,0x00,0x03,0x87,0x00,0x00,0x03,0xba,0x00,0x00,0x03,0x88,0x00,0x00,0x03,0x8a,0x00,0x00,0x02,0x6a,0x00,0x00,0x03,0x8c,0x00,0x00,0x03,0x8c,0x00,0x00, +0x02,0x6d,0x00,0x00,0x03,0x8e,0x00,0x00,0x03,0x8f,0x00,0x00,0x02,0x6e,0x00,0x00,0x03,0x90,0x00,0x00,0x03,0x90,0x00,0x00,0x02,0x90,0x00,0x00,0x03,0x91,0x00,0x00,0x03,0xa1,0x00,0x00,0x02,0x51,0x00,0x00,0x03,0xa3,0x00,0x00,0x03,0xa9,0x00,0x00,0x02,0x62,0x00,0x00,0x03,0xaa,0x00,0x00,0x03,0xab,0x00,0x00,0x02,0x70,0x00,0x00, +0x03,0xac,0x00,0x00,0x03,0xae,0x00,0x00,0x02,0x96,0x00,0x00,0x03,0xaf,0x00,0x00,0x03,0xaf,0x00,0x00,0x02,0x8e,0x00,0x00,0x03,0xb0,0x00,0x00,0x03,0xb0,0x00,0x00,0x02,0x93,0x00,0x00,0x03,0xb1,0x00,0x00,0x03,0xc9,0x00,0x00,0x02,0x75,0x00,0x00,0x03,0xca,0x00,0x00,0x03,0xca,0x00,0x00,0x02,0x8f,0x00,0x00,0x03,0xcb,0x00,0x00, +0x03,0xcb,0x00,0x00,0x02,0x92,0x00,0x00,0x03,0xcc,0x00,0x00,0x03,0xcc,0x00,0x00,0x02,0x94,0x00,0x00,0x03,0xcd,0x00,0x00,0x03,0xcd,0x00,0x00,0x02,0x91,0x00,0x00,0x03,0xce,0x00,0x00,0x03,0xce,0x00,0x00,0x02,0x95,0x00,0x00,0x03,0xcf,0x00,0x00,0x03,0xcf,0x00,0x00,0x02,0x72,0x00,0x00,0x03,0xd5,0x00,0x00,0x03,0xd6,0x00,0x00, +0x02,0x9a,0x00,0x00,0x03,0xd7,0x00,0x00,0x03,0xd7,0x00,0x00,0x02,0x99,0x00,0x00,0x04,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0x01,0xd0,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x01,0xf6,0x00,0x00,0x04,0x03,0x00,0x00,0x04,0x03,0x00,0x00,0x01,0xcc,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x01,0xee,0x00,0x00, +0x04,0x05,0x00,0x00,0x04,0x05,0x00,0x00,0x01,0xed,0x00,0x00,0x04,0x06,0x00,0x00,0x04,0x08,0x00,0x00,0x01,0xf0,0x00,0x00,0x04,0x09,0x00,0x00,0x04,0x0a,0x00,0x00,0x01,0xeb,0x00,0x00,0x04,0x0b,0x00,0x00,0x04,0x0b,0x00,0x00,0x01,0xf3,0x00,0x00,0x04,0x0c,0x00,0x00,0x04,0x0c,0x00,0x00,0x01,0xd6,0x00,0x00,0x04,0x0e,0x00,0x00, +0x04,0x0e,0x00,0x00,0x01,0xe0,0x00,0x00,0x04,0x0f,0x00,0x00,0x04,0x0f,0x00,0x00,0x01,0xe7,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x13,0x00,0x00,0x01,0xc8,0x00,0x00,0x04,0x14,0x00,0x00,0x04,0x15,0x00,0x00,0x01,0xce,0x00,0x00,0x04,0x16,0x00,0x00,0x04,0x1a,0x00,0x00,0x01,0xd1,0x00,0x00,0x04,0x1b,0x00,0x00,0x04,0x23,0x00,0x00, +0x01,0xd7,0x00,0x00,0x04,0x24,0x00,0x00,0x04,0x25,0x00,0x00,0x01,0xe1,0x00,0x00,0x04,0x26,0x00,0x00,0x04,0x26,0x00,0x00,0x01,0xe4,0x00,0x00,0x04,0x27,0x00,0x00,0x04,0x27,0x00,0x00,0x01,0xe3,0x00,0x00,0x04,0x28,0x00,0x00,0x04,0x29,0x00,0x00,0x01,0xe5,0x00,0x00,0x04,0x2a,0x00,0x00,0x04,0x2b,0x00,0x00,0x01,0xe9,0x00,0x00, +0x04,0x2c,0x00,0x00,0x04,0x2c,0x00,0x00,0x01,0xe8,0x00,0x00,0x04,0x2d,0x00,0x00,0x04,0x2d,0x00,0x00,0x01,0xef,0x00,0x00,0x04,0x2e,0x00,0x00,0x04,0x2f,0x00,0x00,0x01,0xf4,0x00,0x00,0x04,0x30,0x00,0x00,0x04,0x33,0x00,0x00,0x02,0x0c,0x00,0x00,0x04,0x34,0x00,0x00,0x04,0x35,0x00,0x00,0x02,0x12,0x00,0x00,0x04,0x36,0x00,0x00, +0x04,0x3a,0x00,0x00,0x02,0x15,0x00,0x00,0x04,0x3b,0x00,0x00,0x04,0x43,0x00,0x00,0x02,0x1b,0x00,0x00,0x04,0x44,0x00,0x00,0x04,0x45,0x00,0x00,0x02,0x25,0x00,0x00,0x04,0x46,0x00,0x00,0x04,0x46,0x00,0x00,0x02,0x28,0x00,0x00,0x04,0x47,0x00,0x00,0x04,0x47,0x00,0x00,0x02,0x27,0x00,0x00,0x04,0x48,0x00,0x00,0x04,0x49,0x00,0x00, +0x02,0x29,0x00,0x00,0x04,0x4a,0x00,0x00,0x04,0x4b,0x00,0x00,0x02,0x2d,0x00,0x00,0x04,0x4c,0x00,0x00,0x04,0x4c,0x00,0x00,0x02,0x2c,0x00,0x00,0x04,0x4d,0x00,0x00,0x04,0x4d,0x00,0x00,0x02,0x33,0x00,0x00,0x04,0x4e,0x00,0x00,0x04,0x4f,0x00,0x00,0x02,0x38,0x00,0x00,0x04,0x51,0x00,0x00,0x04,0x51,0x00,0x00,0x02,0x14,0x00,0x00, +0x04,0x52,0x00,0x00,0x04,0x52,0x00,0x00,0x02,0x3a,0x00,0x00,0x04,0x53,0x00,0x00,0x04,0x53,0x00,0x00,0x02,0x10,0x00,0x00,0x04,0x54,0x00,0x00,0x04,0x54,0x00,0x00,0x02,0x32,0x00,0x00,0x04,0x55,0x00,0x00,0x04,0x55,0x00,0x00,0x02,0x31,0x00,0x00,0x04,0x56,0x00,0x00,0x04,0x58,0x00,0x00,0x02,0x34,0x00,0x00,0x04,0x59,0x00,0x00, +0x04,0x5a,0x00,0x00,0x02,0x2f,0x00,0x00,0x04,0x5b,0x00,0x00,0x04,0x5b,0x00,0x00,0x02,0x37,0x00,0x00,0x04,0x5c,0x00,0x00,0x04,0x5c,0x00,0x00,0x02,0x1a,0x00,0x00,0x04,0x5e,0x00,0x00,0x04,0x5e,0x00,0x00,0x02,0x24,0x00,0x00,0x04,0x5f,0x00,0x00,0x04,0x5f,0x00,0x00,0x02,0x2b,0x00,0x00,0x04,0x90,0x00,0x00,0x04,0x90,0x00,0x00, +0x01,0xcd,0x00,0x00,0x04,0x91,0x00,0x00,0x04,0x91,0x00,0x00,0x02,0x11,0x00,0x00,0x04,0x92,0x00,0x00,0x04,0x92,0x00,0x00,0x01,0xf7,0x00,0x00,0x04,0x93,0x00,0x00,0x04,0x93,0x00,0x00,0x02,0x3b,0x00,0x00,0x04,0x9a,0x00,0x00,0x04,0x9a,0x00,0x00,0x01,0xf8,0x00,0x00,0x04,0x9b,0x00,0x00,0x04,0x9b,0x00,0x00,0x02,0x3c,0x00,0x00, +0x04,0xa2,0x00,0x00,0x04,0xa2,0x00,0x00,0x01,0xf9,0x00,0x00,0x04,0xa3,0x00,0x00,0x04,0xa3,0x00,0x00,0x02,0x3d,0x00,0x00,0x04,0xae,0x00,0x00,0x04,0xae,0x00,0x00,0x01,0xfa,0x00,0x00,0x04,0xaf,0x00,0x00,0x04,0xaf,0x00,0x00,0x02,0x3e,0x00,0x00,0x04,0xb0,0x00,0x00,0x04,0xb0,0x00,0x00,0x01,0xfb,0x00,0x00,0x04,0xb1,0x00,0x00, +0x04,0xb1,0x00,0x00,0x02,0x3f,0x00,0x00,0x04,0xb6,0x00,0x00,0x04,0xb6,0x00,0x00,0x01,0xfc,0x00,0x00,0x04,0xb7,0x00,0x00,0x04,0xb7,0x00,0x00,0x02,0x40,0x00,0x00,0x04,0xba,0x00,0x00,0x04,0xba,0x00,0x00,0x01,0xfd,0x00,0x00,0x04,0xbb,0x00,0x00,0x04,0xbb,0x00,0x00,0x02,0x41,0x00,0x00,0x04,0xd8,0x00,0x00,0x04,0xd8,0x00,0x00, +0x01,0xfe,0x00,0x00,0x04,0xd9,0x00,0x00,0x04,0xd9,0x00,0x00,0x02,0x42,0x00,0x00,0x04,0xdc,0x00,0x00,0x04,0xdc,0x00,0x00,0x01,0xff,0x00,0x00,0x04,0xdd,0x00,0x00,0x04,0xdd,0x00,0x00,0x02,0x43,0x00,0x00,0x04,0xde,0x00,0x00,0x04,0xde,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0xdf,0x00,0x00,0x04,0xdf,0x00,0x00,0x02,0x44,0x00,0x00, +0x04,0xe4,0x00,0x00,0x04,0xe4,0x00,0x00,0x02,0x01,0x00,0x00,0x04,0xe5,0x00,0x00,0x04,0xe5,0x00,0x00,0x02,0x45,0x00,0x00,0x04,0xe6,0x00,0x00,0x04,0xe6,0x00,0x00,0x02,0x02,0x00,0x00,0x04,0xe7,0x00,0x00,0x04,0xe7,0x00,0x00,0x02,0x46,0x00,0x00,0x04,0xe8,0x00,0x00,0x04,0xe8,0x00,0x00,0x02,0x03,0x00,0x00,0x04,0xe9,0x00,0x00, +0x04,0xe9,0x00,0x00,0x02,0x47,0x00,0x00,0x04,0xf4,0x00,0x00,0x04,0xf4,0x00,0x00,0x02,0x04,0x00,0x00,0x04,0xf5,0x00,0x00,0x04,0xf5,0x00,0x00,0x02,0x48,0x00,0x00,0x0a,0xea,0x00,0x00,0x0a,0xea,0x00,0x00,0x03,0x28,0x00,0x00,0x1e,0x80,0x00,0x00,0x1e,0x80,0x00,0x00,0x00,0xa6,0x00,0x00,0x1e,0x81,0x00,0x00,0x1e,0x81,0x00,0x00, +0x01,0x6e,0x00,0x00,0x1e,0x82,0x00,0x00,0x1e,0x82,0x00,0x00,0x00,0xa3,0x00,0x00,0x1e,0x83,0x00,0x00,0x1e,0x83,0x00,0x00,0x01,0x6b,0x00,0x00,0x1e,0x84,0x00,0x00,0x1e,0x84,0x00,0x00,0x00,0xa5,0x00,0x00,0x1e,0x85,0x00,0x00,0x1e,0x85,0x00,0x00,0x01,0x6d,0x00,0x00,0x1e,0x9e,0x00,0x00,0x1e,0x9e,0x00,0x00,0x00,0x87,0x00,0x00, +0x1e,0xa0,0x00,0x00,0x1e,0xa0,0x00,0x00,0x00,0x11,0x00,0x00,0x1e,0xa1,0x00,0x00,0x1e,0xa1,0x00,0x00,0x00,0xcd,0x00,0x00,0x1e,0xa2,0x00,0x00,0x1e,0xa2,0x00,0x00,0x00,0x13,0x00,0x00,0x1e,0xa3,0x00,0x00,0x1e,0xa3,0x00,0x00,0x00,0xcf,0x00,0x00,0x1e,0xa4,0x00,0x00,0x1e,0xa4,0x00,0x00,0x00,0x0b,0x00,0x00,0x1e,0xa5,0x00,0x00, +0x1e,0xa5,0x00,0x00,0x00,0xc7,0x00,0x00,0x1e,0xa6,0x00,0x00,0x1e,0xa6,0x00,0x00,0x00,0x0d,0x00,0x00,0x1e,0xa7,0x00,0x00,0x1e,0xa7,0x00,0x00,0x00,0xc9,0x00,0x00,0x1e,0xa8,0x00,0x00,0x1e,0xa8,0x00,0x00,0x00,0x0e,0x00,0x00,0x1e,0xa9,0x00,0x00,0x1e,0xa9,0x00,0x00,0x00,0xca,0x00,0x00,0x1e,0xaa,0x00,0x00,0x1e,0xaa,0x00,0x00, +0x00,0x0f,0x00,0x00,0x1e,0xab,0x00,0x00,0x1e,0xab,0x00,0x00,0x00,0xcb,0x00,0x00,0x1e,0xac,0x00,0x00,0x1e,0xac,0x00,0x00,0x00,0x0c,0x00,0x00,0x1e,0xad,0x00,0x00,0x1e,0xad,0x00,0x00,0x00,0xc8,0x00,0x00,0x1e,0xae,0x00,0x00,0x1e,0xae,0x00,0x00,0x00,0x04,0x00,0x00,0x1e,0xaf,0x00,0x00,0x1e,0xaf,0x00,0x00,0x00,0xc0,0x00,0x00, +0x1e,0xb0,0x00,0x00,0x1e,0xb0,0x00,0x00,0x00,0x06,0x00,0x00,0x1e,0xb1,0x00,0x00,0x1e,0xb1,0x00,0x00,0x00,0xc2,0x00,0x00,0x1e,0xb2,0x00,0x00,0x1e,0xb2,0x00,0x00,0x00,0x07,0x00,0x00,0x1e,0xb3,0x00,0x00,0x1e,0xb3,0x00,0x00,0x00,0xc3,0x00,0x00,0x1e,0xb4,0x00,0x00,0x1e,0xb4,0x00,0x00,0x00,0x08,0x00,0x00,0x1e,0xb5,0x00,0x00, +0x1e,0xb5,0x00,0x00,0x00,0xc4,0x00,0x00,0x1e,0xb6,0x00,0x00,0x1e,0xb6,0x00,0x00,0x00,0x05,0x00,0x00,0x1e,0xb7,0x00,0x00,0x1e,0xb7,0x00,0x00,0x00,0xc1,0x00,0x00,0x1e,0xb8,0x00,0x00,0x1e,0xb8,0x00,0x00,0x00,0x31,0x00,0x00,0x1e,0xb9,0x00,0x00,0x1e,0xb9,0x00,0x00,0x00,0xed,0x00,0x00,0x1e,0xba,0x00,0x00,0x1e,0xba,0x00,0x00, +0x00,0x33,0x00,0x00,0x1e,0xbb,0x00,0x00,0x1e,0xbb,0x00,0x00,0x00,0xef,0x00,0x00,0x1e,0xbc,0x00,0x00,0x1e,0xbc,0x00,0x00,0x00,0x37,0x00,0x00,0x1e,0xbd,0x00,0x00,0x1e,0xbd,0x00,0x00,0x00,0xf2,0x00,0x00,0x1e,0xbe,0x00,0x00,0x1e,0xbe,0x00,0x00,0x00,0x2a,0x00,0x00,0x1e,0xbf,0x00,0x00,0x1e,0xbf,0x00,0x00,0x00,0xe6,0x00,0x00, +0x1e,0xc0,0x00,0x00,0x1e,0xc0,0x00,0x00,0x00,0x2c,0x00,0x00,0x1e,0xc1,0x00,0x00,0x1e,0xc1,0x00,0x00,0x00,0xe8,0x00,0x00,0x1e,0xc2,0x00,0x00,0x1e,0xc2,0x00,0x00,0x00,0x2d,0x00,0x00,0x1e,0xc3,0x00,0x00,0x1e,0xc3,0x00,0x00,0x00,0xe9,0x00,0x00,0x1e,0xc4,0x00,0x00,0x1e,0xc4,0x00,0x00,0x00,0x2e,0x00,0x00,0x1e,0xc5,0x00,0x00, +0x1e,0xc5,0x00,0x00,0x00,0xea,0x00,0x00,0x1e,0xc6,0x00,0x00,0x1e,0xc6,0x00,0x00,0x00,0x2b,0x00,0x00,0x1e,0xc7,0x00,0x00,0x1e,0xc7,0x00,0x00,0x00,0xe7,0x00,0x00,0x1e,0xc8,0x00,0x00,0x1e,0xc8,0x00,0x00,0x00,0x4b,0x00,0x00,0x1e,0xc9,0x00,0x00,0x1e,0xc9,0x00,0x00,0x01,0x09,0x00,0x00,0x1e,0xca,0x00,0x00,0x1e,0xca,0x00,0x00, +0x00,0x49,0x00,0x00,0x1e,0xcb,0x00,0x00,0x1e,0xcb,0x00,0x00,0x01,0x07,0x00,0x00,0x1e,0xcc,0x00,0x00,0x1e,0xcc,0x00,0x00,0x00,0x6a,0x00,0x00,0x1e,0xcd,0x00,0x00,0x1e,0xcd,0x00,0x00,0x01,0x2d,0x00,0x00,0x1e,0xce,0x00,0x00,0x1e,0xce,0x00,0x00,0x00,0x6c,0x00,0x00,0x1e,0xcf,0x00,0x00,0x1e,0xcf,0x00,0x00,0x01,0x2f,0x00,0x00, +0x1e,0xd0,0x00,0x00,0x1e,0xd0,0x00,0x00,0x00,0x64,0x00,0x00,0x1e,0xd1,0x00,0x00,0x1e,0xd1,0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0xd2,0x00,0x00,0x1e,0xd2,0x00,0x00,0x00,0x66,0x00,0x00,0x1e,0xd3,0x00,0x00,0x1e,0xd3,0x00,0x00,0x01,0x29,0x00,0x00,0x1e,0xd4,0x00,0x00,0x1e,0xd4,0x00,0x00,0x00,0x67,0x00,0x00,0x1e,0xd5,0x00,0x00, +0x1e,0xd5,0x00,0x00,0x01,0x2a,0x00,0x00,0x1e,0xd6,0x00,0x00,0x1e,0xd6,0x00,0x00,0x00,0x68,0x00,0x00,0x1e,0xd7,0x00,0x00,0x1e,0xd7,0x00,0x00,0x01,0x2b,0x00,0x00,0x1e,0xd8,0x00,0x00,0x1e,0xd8,0x00,0x00,0x00,0x65,0x00,0x00,0x1e,0xd9,0x00,0x00,0x1e,0xd9,0x00,0x00,0x01,0x28,0x00,0x00,0x1e,0xda,0x00,0x00,0x1e,0xda,0x00,0x00, +0x00,0x6e,0x00,0x00,0x1e,0xdb,0x00,0x00,0x1e,0xdb,0x00,0x00,0x01,0x31,0x00,0x00,0x1e,0xdc,0x00,0x00,0x1e,0xdc,0x00,0x00,0x00,0x70,0x00,0x00,0x1e,0xdd,0x00,0x00,0x1e,0xdd,0x00,0x00,0x01,0x33,0x00,0x00,0x1e,0xde,0x00,0x00,0x1e,0xde,0x00,0x00,0x00,0x71,0x00,0x00,0x1e,0xdf,0x00,0x00,0x1e,0xdf,0x00,0x00,0x01,0x34,0x00,0x00, +0x1e,0xe0,0x00,0x00,0x1e,0xe0,0x00,0x00,0x00,0x72,0x00,0x00,0x1e,0xe1,0x00,0x00,0x1e,0xe1,0x00,0x00,0x01,0x35,0x00,0x00,0x1e,0xe2,0x00,0x00,0x1e,0xe2,0x00,0x00,0x00,0x6f,0x00,0x00,0x1e,0xe3,0x00,0x00,0x1e,0xe3,0x00,0x00,0x01,0x32,0x00,0x00,0x1e,0xe4,0x00,0x00,0x1e,0xe4,0x00,0x00,0x00,0x93,0x00,0x00,0x1e,0xe5,0x00,0x00, +0x1e,0xe5,0x00,0x00,0x01,0x5b,0x00,0x00,0x1e,0xe6,0x00,0x00,0x1e,0xe6,0x00,0x00,0x00,0x95,0x00,0x00,0x1e,0xe7,0x00,0x00,0x1e,0xe7,0x00,0x00,0x01,0x5d,0x00,0x00,0x1e,0xe8,0x00,0x00,0x1e,0xe8,0x00,0x00,0x00,0x97,0x00,0x00,0x1e,0xe9,0x00,0x00,0x1e,0xe9,0x00,0x00,0x01,0x5f,0x00,0x00,0x1e,0xea,0x00,0x00,0x1e,0xea,0x00,0x00, +0x00,0x99,0x00,0x00,0x1e,0xeb,0x00,0x00,0x1e,0xeb,0x00,0x00,0x01,0x61,0x00,0x00,0x1e,0xec,0x00,0x00,0x1e,0xec,0x00,0x00,0x00,0x9a,0x00,0x00,0x1e,0xed,0x00,0x00,0x1e,0xed,0x00,0x00,0x01,0x62,0x00,0x00,0x1e,0xee,0x00,0x00,0x1e,0xee,0x00,0x00,0x00,0x9b,0x00,0x00,0x1e,0xef,0x00,0x00,0x1e,0xef,0x00,0x00,0x01,0x63,0x00,0x00, +0x1e,0xf0,0x00,0x00,0x1e,0xf0,0x00,0x00,0x00,0x98,0x00,0x00,0x1e,0xf1,0x00,0x00,0x1e,0xf1,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0xf2,0x00,0x00,0x1e,0xf2,0x00,0x00,0x00,0xad,0x00,0x00,0x1e,0xf3,0x00,0x00,0x1e,0xf3,0x00,0x00,0x01,0x75,0x00,0x00,0x1e,0xf4,0x00,0x00,0x1e,0xf4,0x00,0x00,0x00,0xac,0x00,0x00,0x1e,0xf5,0x00,0x00, +0x1e,0xf5,0x00,0x00,0x01,0x74,0x00,0x00,0x1e,0xf6,0x00,0x00,0x1e,0xf6,0x00,0x00,0x00,0xae,0x00,0x00,0x1e,0xf7,0x00,0x00,0x1e,0xf7,0x00,0x00,0x01,0x76,0x00,0x00,0x1e,0xf8,0x00,0x00,0x1e,0xf8,0x00,0x00,0x00,0xb0,0x00,0x00,0x1e,0xf9,0x00,0x00,0x1e,0xf9,0x00,0x00,0x01,0x78,0x00,0x00,0x20,0x01,0x00,0x00,0x20,0x01,0x00,0x00, +0x03,0xbc,0x00,0x00,0x20,0x0b,0x00,0x00,0x20,0x0b,0x00,0x00,0x03,0xbd,0x00,0x00,0x20,0x10,0x00,0x00,0x20,0x10,0x00,0x00,0x03,0x5b,0x00,0x00,0x20,0x13,0x00,0x00,0x20,0x14,0x00,0x00,0x03,0x59,0x00,0x00,0x20,0x16,0x00,0x00,0x20,0x16,0x00,0x00,0x03,0x37,0x00,0x00,0x20,0x18,0x00,0x00,0x20,0x19,0x00,0x00,0x03,0x61,0x00,0x00, +0x20,0x1a,0x00,0x00,0x20,0x1a,0x00,0x00,0x03,0x5d,0x00,0x00,0x20,0x1b,0x00,0x00,0x20,0x1b,0x00,0x00,0x03,0x63,0x00,0x00,0x20,0x1c,0x00,0x00,0x20,0x1d,0x00,0x00,0x03,0x5f,0x00,0x00,0x20,0x1e,0x00,0x00,0x20,0x1e,0x00,0x00,0x03,0x5e,0x00,0x00,0x20,0x1f,0x00,0x00,0x20,0x1f,0x00,0x00,0x03,0x64,0x00,0x00,0x20,0x20,0x00,0x00, +0x20,0x20,0x00,0x00,0x05,0xc0,0x00,0x00,0x20,0x21,0x00,0x00,0x20,0x21,0x00,0x00,0x05,0xc2,0x00,0x00,0x20,0x22,0x00,0x00,0x20,0x22,0x00,0x00,0x03,0x33,0x00,0x00,0x20,0x24,0x00,0x00,0x20,0x24,0x00,0x00,0x03,0x3b,0x00,0x00,0x20,0x26,0x00,0x00,0x20,0x26,0x00,0x00,0x03,0x2d,0x00,0x00,0x20,0x30,0x00,0x00,0x20,0x30,0x00,0x00, +0x04,0x39,0x00,0x00,0x20,0x32,0x00,0x00,0x20,0x33,0x00,0x00,0x05,0xbc,0x00,0x00,0x20,0x34,0x00,0x00,0x20,0x34,0x00,0x00,0x03,0x69,0x00,0x00,0x20,0x39,0x00,0x00,0x20,0x3a,0x00,0x00,0x03,0x67,0x00,0x00,0x20,0x3c,0x00,0x00,0x20,0x3d,0x00,0x00,0x03,0x38,0x00,0x00,0x20,0x3e,0x00,0x00,0x20,0x3e,0x00,0x00,0x03,0x3c,0x00,0x00, +0x20,0x3f,0x00,0x00,0x20,0x3f,0x00,0x00,0x03,0x3f,0x00,0x00,0x20,0x44,0x00,0x00,0x20,0x44,0x00,0x00,0x03,0x20,0x00,0x00,0x20,0x45,0x00,0x00,0x20,0x46,0x00,0x00,0x03,0x35,0x00,0x00,0x20,0x70,0x00,0x00,0x20,0x70,0x00,0x00,0x03,0x02,0x00,0x00,0x20,0x74,0x00,0x00,0x20,0x79,0x00,0x00,0x03,0x06,0x00,0x00,0x20,0x7a,0x00,0x00, +0x20,0x7a,0x00,0x00,0x04,0x3b,0x00,0x00,0x20,0x7c,0x00,0x00,0x20,0x7c,0x00,0x00,0x03,0xe6,0x00,0x00,0x20,0x80,0x00,0x00,0x20,0x89,0x00,0x00,0x02,0xe4,0x00,0x00,0x20,0xab,0x00,0x00,0x20,0xac,0x00,0x00,0x03,0xc6,0x00,0x00,0x20,0xae,0x00,0x00,0x20,0xae,0x00,0x00,0x03,0xcc,0x00,0x00,0x20,0xb4,0x00,0x00,0x20,0xb4,0x00,0x00, +0x03,0xc9,0x00,0x00,0x20,0xbd,0x00,0x00,0x20,0xbd,0x00,0x00,0x03,0xca,0x00,0x00,0x20,0xbf,0x00,0x00,0x20,0xbf,0x00,0x00,0x03,0xc2,0x00,0x00,0x21,0x02,0x00,0x00,0x21,0x02,0x00,0x00,0x02,0xa2,0x00,0x00,0x21,0x0d,0x00,0x00,0x21,0x0d,0x00,0x00,0x02,0xa7,0x00,0x00,0x21,0x13,0x00,0x00,0x21,0x13,0x00,0x00,0x05,0xc1,0x00,0x00, +0x21,0x15,0x00,0x00,0x21,0x15,0x00,0x00,0x02,0xad,0x00,0x00,0x21,0x16,0x00,0x00,0x21,0x16,0x00,0x00,0x05,0xc3,0x00,0x00,0x21,0x19,0x00,0x00,0x21,0x1a,0x00,0x00,0x02,0xaf,0x00,0x00,0x21,0x1d,0x00,0x00,0x21,0x1d,0x00,0x00,0x02,0xb1,0x00,0x00,0x21,0x22,0x00,0x00,0x21,0x22,0x00,0x00,0x05,0xba,0x00,0x00,0x21,0x24,0x00,0x00, +0x21,0x24,0x00,0x00,0x02,0xb9,0x00,0x00,0x21,0x2e,0x00,0x00,0x21,0x2e,0x00,0x00,0x05,0xc4,0x00,0x00,0x21,0x40,0x00,0x00,0x21,0x40,0x00,0x00,0x04,0x5e,0x00,0x00,0x21,0x8a,0x00,0x00,0x21,0x8a,0x00,0x00,0x05,0xff,0x00,0x00,0x21,0x8b,0x00,0x00,0x21,0x8b,0x00,0x00,0x05,0xfe,0x00,0x00,0x21,0x90,0x00,0x00,0x21,0x90,0x00,0x00, +0x04,0x77,0x00,0x00,0x21,0x91,0x00,0x00,0x21,0x91,0x00,0x00,0x04,0x71,0x00,0x00,0x21,0x92,0x00,0x00,0x21,0x92,0x00,0x00,0x04,0x73,0x00,0x00,0x21,0x93,0x00,0x00,0x21,0x93,0x00,0x00,0x04,0x75,0x00,0x00,0x21,0x94,0x00,0x00,0x21,0x95,0x00,0x00,0x04,0x79,0x00,0x00,0x21,0x96,0x00,0x00,0x21,0x96,0x00,0x00,0x04,0x78,0x00,0x00, +0x21,0x97,0x00,0x00,0x21,0x97,0x00,0x00,0x04,0x72,0x00,0x00,0x21,0x98,0x00,0x00,0x21,0x98,0x00,0x00,0x04,0x74,0x00,0x00,0x21,0x99,0x00,0x00,0x21,0x99,0x00,0x00,0x04,0x76,0x00,0x00,0x21,0x9d,0x00,0x00,0x21,0x9d,0x00,0x00,0x04,0x7b,0x00,0x00,0x21,0x9e,0x00,0x00,0x21,0x9e,0x00,0x00,0x04,0x7d,0x00,0x00,0x21,0xa0,0x00,0x00, +0x21,0xa0,0x00,0x00,0x04,0x7e,0x00,0x00,0x21,0xa2,0x00,0x00,0x21,0xa3,0x00,0x00,0x04,0x7f,0x00,0x00,0x21,0xa5,0x00,0x00,0x21,0xa7,0x00,0x00,0x04,0x81,0x00,0x00,0x21,0xa9,0x00,0x00,0x21,0xaa,0x00,0x00,0x04,0x85,0x00,0x00,0x21,0xad,0x00,0x00,0x21,0xad,0x00,0x00,0x04,0x7c,0x00,0x00,0x21,0xbe,0x00,0x00,0x21,0xbe,0x00,0x00, +0x04,0x87,0x00,0x00,0x21,0xc9,0x00,0x00,0x21,0xc9,0x00,0x00,0x04,0x88,0x00,0x00,0x21,0xd0,0x00,0x00,0x21,0xd0,0x00,0x00,0x04,0x8c,0x00,0x00,0x21,0xd1,0x00,0x00,0x21,0xd3,0x00,0x00,0x04,0x89,0x00,0x00,0x21,0xd4,0x00,0x00,0x21,0xd4,0x00,0x00,0x04,0x8d,0x00,0x00,0x21,0xdb,0x00,0x00,0x21,0xdb,0x00,0x00,0x04,0x8e,0x00,0x00, +0x21,0xde,0x00,0x00,0x21,0xde,0x00,0x00,0x05,0xe8,0x00,0x00,0x21,0xdf,0x00,0x00,0x21,0xdf,0x00,0x00,0x05,0xe7,0x00,0x00,0x21,0xe5,0x00,0x00,0x21,0xe5,0x00,0x00,0x04,0x84,0x00,0x00,0x21,0xe7,0x00,0x00,0x21,0xe8,0x00,0x00,0x04,0x8f,0x00,0x00,0x21,0xea,0x00,0x00,0x21,0xea,0x00,0x00,0x05,0xe2,0x00,0x00,0x22,0x00,0x00,0x00, +0x22,0x00,0x00,0x00,0x04,0x65,0x00,0x00,0x22,0x01,0x00,0x00,0x22,0x01,0x00,0x00,0x03,0xd6,0x00,0x00,0x22,0x02,0x00,0x00,0x22,0x02,0x00,0x00,0x04,0x2f,0x00,0x00,0x22,0x03,0x00,0x00,0x22,0x03,0x00,0x00,0x03,0xea,0x00,0x00,0x22,0x04,0x00,0x00,0x22,0x04,0x00,0x00,0x04,0x62,0x00,0x00,0x22,0x05,0x00,0x00,0x22,0x05,0x00,0x00, +0x04,0x25,0x00,0x00,0x22,0x06,0x00,0x00,0x22,0x06,0x00,0x00,0x04,0x2b,0x00,0x00,0x22,0x07,0x00,0x00,0x22,0x07,0x00,0x00,0x03,0xeb,0x00,0x00,0x22,0x08,0x00,0x00,0x22,0x08,0x00,0x00,0x03,0xe2,0x00,0x00,0x22,0x09,0x00,0x00,0x22,0x09,0x00,0x00,0x04,0x0b,0x00,0x00,0x22,0x0a,0x00,0x00,0x22,0x0a,0x00,0x00,0x03,0xe3,0x00,0x00, +0x22,0x0b,0x00,0x00,0x22,0x0b,0x00,0x00,0x04,0x5d,0x00,0x00,0x22,0x0c,0x00,0x00,0x22,0x0c,0x00,0x00,0x04,0x0a,0x00,0x00,0x22,0x0e,0x00,0x00,0x22,0x0e,0x00,0x00,0x03,0xe5,0x00,0x00,0x22,0x0f,0x00,0x00,0x22,0x0f,0x00,0x00,0x04,0x2c,0x00,0x00,0x22,0x10,0x00,0x00,0x22,0x10,0x00,0x00,0x03,0xd8,0x00,0x00,0x22,0x11,0x00,0x00, +0x22,0x11,0x00,0x00,0x04,0x2d,0x00,0x00,0x22,0x12,0x00,0x00,0x22,0x12,0x00,0x00,0x04,0x16,0x00,0x00,0x22,0x13,0x00,0x00,0x22,0x13,0x00,0x00,0x03,0xf9,0x00,0x00,0x22,0x15,0x00,0x00,0x22,0x15,0x00,0x00,0x03,0xdd,0x00,0x00,0x22,0x18,0x00,0x00,0x22,0x18,0x00,0x00,0x04,0x4d,0x00,0x00,0x22,0x19,0x00,0x00,0x22,0x19,0x00,0x00, +0x03,0xd4,0x00,0x00,0x22,0x1a,0x00,0x00,0x22,0x1a,0x00,0x00,0x04,0x2e,0x00,0x00,0x22,0x1e,0x00,0x00,0x22,0x1e,0x00,0x00,0x04,0x24,0x00,0x00,0x22,0x23,0x00,0x00,0x22,0x23,0x00,0x00,0x03,0xdc,0x00,0x00,0x22,0x24,0x00,0x00,0x22,0x24,0x00,0x00,0x03,0xde,0x00,0x00,0x22,0x25,0x00,0x00,0x22,0x25,0x00,0x00,0x04,0x31,0x00,0x00, +0x22,0x27,0x00,0x00,0x22,0x2b,0x00,0x00,0x04,0x26,0x00,0x00,0x22,0x34,0x00,0x00,0x22,0x34,0x00,0x00,0x04,0x63,0x00,0x00,0x22,0x35,0x00,0x00,0x22,0x35,0x00,0x00,0x03,0xd1,0x00,0x00,0x22,0x36,0x00,0x00,0x22,0x36,0x00,0x00,0x04,0x40,0x00,0x00,0x22,0x37,0x00,0x00,0x22,0x37,0x00,0x00,0x04,0x3e,0x00,0x00,0x22,0x38,0x00,0x00, +0x22,0x38,0x00,0x00,0x03,0xdf,0x00,0x00,0x22,0x39,0x00,0x00,0x22,0x39,0x00,0x00,0x03,0xe9,0x00,0x00,0x22,0x3c,0x00,0x00,0x22,0x3c,0x00,0x00,0x04,0x4e,0x00,0x00,0x22,0x3e,0x00,0x00,0x22,0x3e,0x00,0x00,0x03,0xed,0x00,0x00,0x22,0x43,0x00,0x00,0x22,0x43,0x00,0x00,0x03,0xd0,0x00,0x00,0x22,0x45,0x00,0x00,0x22,0x45,0x00,0x00, +0x03,0xd7,0x00,0x00,0x22,0x47,0x00,0x00,0x22,0x47,0x00,0x00,0x04,0x04,0x00,0x00,0x22,0x48,0x00,0x00,0x22,0x48,0x00,0x00,0x04,0x20,0x00,0x00,0x22,0x49,0x00,0x00,0x22,0x49,0x00,0x00,0x04,0x09,0x00,0x00,0x22,0x4b,0x00,0x00,0x22,0x4b,0x00,0x00,0x04,0x64,0x00,0x00,0x22,0x4d,0x00,0x00,0x22,0x4d,0x00,0x00,0x03,0xe8,0x00,0x00, +0x22,0x54,0x00,0x00,0x22,0x54,0x00,0x00,0x03,0xd5,0x00,0x00,0x22,0x57,0x00,0x00,0x22,0x57,0x00,0x00,0x04,0x4c,0x00,0x00,0x22,0x5f,0x00,0x00,0x22,0x5f,0x00,0x00,0x04,0x3f,0x00,0x00,0x22,0x60,0x00,0x00,0x22,0x60,0x00,0x00,0x04,0x1a,0x00,0x00,0x22,0x61,0x00,0x00,0x22,0x61,0x00,0x00,0x03,0xe7,0x00,0x00,0x22,0x62,0x00,0x00, +0x22,0x62,0x00,0x00,0x04,0x0f,0x00,0x00,0x22,0x63,0x00,0x00,0x22,0x63,0x00,0x00,0x04,0x5a,0x00,0x00,0x22,0x64,0x00,0x00,0x22,0x64,0x00,0x00,0x04,0x1e,0x00,0x00,0x22,0x65,0x00,0x00,0x22,0x65,0x00,0x00,0x04,0x1d,0x00,0x00,0x22,0x6a,0x00,0x00,0x22,0x6a,0x00,0x00,0x03,0xfb,0x00,0x00,0x22,0x6b,0x00,0x00,0x22,0x6b,0x00,0x00, +0x03,0xfa,0x00,0x00,0x22,0x6c,0x00,0x00,0x22,0x6c,0x00,0x00,0x03,0xd2,0x00,0x00,0x22,0x6d,0x00,0x00,0x22,0x6d,0x00,0x00,0x04,0x0c,0x00,0x00,0x22,0x6e,0x00,0x00,0x22,0x6e,0x00,0x00,0x04,0x10,0x00,0x00,0x22,0x6f,0x00,0x00,0x22,0x6f,0x00,0x00,0x04,0x0d,0x00,0x00,0x22,0x70,0x00,0x00,0x22,0x70,0x00,0x00,0x04,0x11,0x00,0x00, +0x22,0x71,0x00,0x00,0x22,0x71,0x00,0x00,0x04,0x0e,0x00,0x00,0x22,0x72,0x00,0x00,0x22,0x72,0x00,0x00,0x03,0xf7,0x00,0x00,0x22,0x73,0x00,0x00,0x22,0x73,0x00,0x00,0x03,0xec,0x00,0x00,0x22,0x7a,0x00,0x00,0x22,0x7a,0x00,0x00,0x04,0x3c,0x00,0x00,0x22,0x7b,0x00,0x00,0x22,0x7b,0x00,0x00,0x04,0x5c,0x00,0x00,0x22,0x7c,0x00,0x00, +0x22,0x7c,0x00,0x00,0x04,0x3d,0x00,0x00,0x22,0x82,0x00,0x00,0x22,0x82,0x00,0x00,0x04,0x5b,0x00,0x00,0x22,0x83,0x00,0x00,0x22,0x83,0x00,0x00,0x04,0x5f,0x00,0x00,0x22,0x84,0x00,0x00,0x22,0x85,0x00,0x00,0x04,0x13,0x00,0x00,0x22,0x86,0x00,0x00,0x22,0x87,0x00,0x00,0x04,0x41,0x00,0x00,0x22,0x88,0x00,0x00,0x22,0x89,0x00,0x00, +0x04,0x05,0x00,0x00,0x22,0x8e,0x00,0x00,0x22,0x8e,0x00,0x00,0x03,0xfd,0x00,0x00,0x22,0x8f,0x00,0x00,0x22,0x8f,0x00,0x00,0x04,0x55,0x00,0x00,0x22,0x90,0x00,0x00,0x22,0x90,0x00,0x00,0x04,0x57,0x00,0x00,0x22,0x91,0x00,0x00,0x22,0x91,0x00,0x00,0x04,0x56,0x00,0x00,0x22,0x92,0x00,0x00,0x22,0x92,0x00,0x00,0x04,0x58,0x00,0x00, +0x22,0x93,0x00,0x00,0x22,0x94,0x00,0x00,0x04,0x4f,0x00,0x00,0x22,0x95,0x00,0x00,0x22,0x95,0x00,0x00,0x04,0x70,0x00,0x00,0x22,0x96,0x00,0x00,0x22,0x97,0x00,0x00,0x04,0x6d,0x00,0x00,0x22,0x98,0x00,0x00,0x22,0x98,0x00,0x00,0x04,0x6c,0x00,0x00,0x22,0x99,0x00,0x00,0x22,0x99,0x00,0x00,0x04,0x6f,0x00,0x00,0x22,0x9b,0x00,0x00, +0x22,0x9b,0x00,0x00,0x04,0x69,0x00,0x00,0x22,0x9c,0x00,0x00,0x22,0x9c,0x00,0x00,0x04,0x6b,0x00,0x00,0x22,0x9d,0x00,0x00,0x22,0x9d,0x00,0x00,0x04,0x6a,0x00,0x00,0x22,0x9e,0x00,0x00,0x22,0x9e,0x00,0x00,0x04,0x53,0x00,0x00,0x22,0x9f,0x00,0x00,0x22,0x9f,0x00,0x00,0x04,0x52,0x00,0x00,0x22,0xa0,0x00,0x00,0x22,0xa0,0x00,0x00, +0x04,0x54,0x00,0x00,0x22,0xa1,0x00,0x00,0x22,0xa1,0x00,0x00,0x04,0x51,0x00,0x00,0x22,0xa2,0x00,0x00,0x22,0xa2,0x00,0x00,0x04,0x4b,0x00,0x00,0x22,0xa3,0x00,0x00,0x22,0xa3,0x00,0x00,0x04,0x61,0x00,0x00,0x22,0xa4,0x00,0x00,0x22,0xa4,0x00,0x00,0x04,0x60,0x00,0x00,0x22,0xa5,0x00,0x00,0x22,0xa5,0x00,0x00,0x04,0x67,0x00,0x00, +0x22,0xb4,0x00,0x00,0x22,0xb4,0x00,0x00,0x04,0x08,0x00,0x00,0x22,0xb8,0x00,0x00,0x22,0xb8,0x00,0x00,0x03,0xfc,0x00,0x00,0x22,0xbb,0x00,0x00,0x22,0xbb,0x00,0x00,0x04,0x68,0x00,0x00,0x22,0xbc,0x00,0x00,0x22,0xbc,0x00,0x00,0x04,0x01,0x00,0x00,0x22,0xbd,0x00,0x00,0x22,0xbd,0x00,0x00,0x04,0x07,0x00,0x00,0x22,0xc2,0x00,0x00, +0x22,0xc3,0x00,0x00,0x04,0x02,0x00,0x00,0x22,0xc4,0x00,0x00,0x22,0xc4,0x00,0x00,0x03,0xdb,0x00,0x00,0x22,0xc6,0x00,0x00,0x22,0xc6,0x00,0x00,0x04,0x59,0x00,0x00,0x22,0xc8,0x00,0x00,0x22,0xc8,0x00,0x00,0x03,0xd3,0x00,0x00,0x22,0xc9,0x00,0x00,0x22,0xc9,0x00,0x00,0x03,0xf3,0x00,0x00,0x22,0xca,0x00,0x00,0x22,0xca,0x00,0x00, +0x04,0x47,0x00,0x00,0x22,0xce,0x00,0x00,0x22,0xce,0x00,0x00,0x03,0xda,0x00,0x00,0x22,0xd0,0x00,0x00,0x22,0xd0,0x00,0x00,0x03,0xe0,0x00,0x00,0x22,0xe2,0x00,0x00,0x22,0xe2,0x00,0x00,0x04,0x12,0x00,0x00,0x22,0xee,0x00,0x00,0x22,0xee,0x00,0x00,0x03,0xe4,0x00,0x00,0x22,0xef,0x00,0x00,0x22,0xef,0x00,0x00,0x03,0xf8,0x00,0x00, +0x22,0xf0,0x00,0x00,0x22,0xf0,0x00,0x00,0x04,0x66,0x00,0x00,0x22,0xf1,0x00,0x00,0x22,0xf1,0x00,0x00,0x03,0xe1,0x00,0x00,0x23,0x02,0x00,0x00,0x23,0x02,0x00,0x00,0x05,0xe1,0x00,0x00,0x23,0x03,0x00,0x00,0x23,0x03,0x00,0x00,0x05,0xca,0x00,0x00,0x23,0x04,0x00,0x00,0x23,0x04,0x00,0x00,0x04,0x91,0x00,0x00,0x23,0x05,0x00,0x00, +0x23,0x05,0x00,0x00,0x05,0xf4,0x00,0x00,0x23,0x08,0x00,0x00,0x23,0x08,0x00,0x00,0x03,0x4f,0x00,0x00,0x23,0x09,0x00,0x00,0x23,0x09,0x00,0x00,0x03,0x52,0x00,0x00,0x23,0x0a,0x00,0x00,0x23,0x0a,0x00,0x00,0x03,0x50,0x00,0x00,0x23,0x0b,0x00,0x00,0x23,0x0b,0x00,0x00,0x03,0x53,0x00,0x00,0x23,0x18,0x00,0x00,0x23,0x18,0x00,0x00, +0x05,0xe9,0x00,0x00,0x23,0x1c,0x00,0x00,0x23,0x1c,0x00,0x00,0x05,0xce,0x00,0x00,0x23,0x1d,0x00,0x00,0x23,0x1d,0x00,0x00,0x05,0xcd,0x00,0x00,0x23,0x1e,0x00,0x00,0x23,0x1f,0x00,0x00,0x05,0xcb,0x00,0x00,0x23,0x24,0x00,0x00,0x23,0x24,0x00,0x00,0x04,0x92,0x00,0x00,0x23,0x25,0x00,0x00,0x23,0x25,0x00,0x00,0x05,0xe6,0x00,0x00, +0x23,0x26,0x00,0x00,0x23,0x26,0x00,0x00,0x05,0xe4,0x00,0x00,0x23,0x28,0x00,0x00,0x23,0x28,0x00,0x00,0x05,0xe5,0x00,0x00,0x23,0x2b,0x00,0x00,0x23,0x2b,0x00,0x00,0x05,0xe3,0x00,0x00,0x23,0x36,0x00,0x00,0x23,0x36,0x00,0x00,0x05,0x65,0x00,0x00,0x23,0x37,0x00,0x00,0x23,0x37,0x00,0x00,0x05,0xa0,0x00,0x00,0x23,0x38,0x00,0x00, +0x23,0x38,0x00,0x00,0x05,0x8f,0x00,0x00,0x23,0x39,0x00,0x00,0x23,0x39,0x00,0x00,0x05,0x8c,0x00,0x00,0x23,0x3a,0x00,0x00,0x23,0x3a,0x00,0x00,0x05,0x8b,0x00,0x00,0x23,0x3b,0x00,0x00,0x23,0x3b,0x00,0x00,0x05,0x91,0x00,0x00,0x23,0x3c,0x00,0x00,0x23,0x3c,0x00,0x00,0x05,0x87,0x00,0x00,0x23,0x3d,0x00,0x00,0x23,0x3d,0x00,0x00, +0x05,0x6d,0x00,0x00,0x23,0x3e,0x00,0x00,0x23,0x3e,0x00,0x00,0x05,0x6b,0x00,0x00,0x23,0x3f,0x00,0x00,0x23,0x3f,0x00,0x00,0x05,0x9f,0x00,0x00,0x23,0x40,0x00,0x00,0x23,0x40,0x00,0x00,0x05,0x68,0x00,0x00,0x23,0x41,0x00,0x00,0x23,0x41,0x00,0x00,0x05,0x97,0x00,0x00,0x23,0x42,0x00,0x00,0x23,0x42,0x00,0x00,0x05,0x86,0x00,0x00, +0x23,0x43,0x00,0x00,0x23,0x43,0x00,0x00,0x05,0x93,0x00,0x00,0x23,0x44,0x00,0x00,0x23,0x44,0x00,0x00,0x05,0x90,0x00,0x00,0x23,0x45,0x00,0x00,0x23,0x45,0x00,0x00,0x05,0x82,0x00,0x00,0x23,0x46,0x00,0x00,0x23,0x46,0x00,0x00,0x05,0x9d,0x00,0x00,0x23,0x47,0x00,0x00,0x23,0x47,0x00,0x00,0x05,0x92,0x00,0x00,0x23,0x48,0x00,0x00, +0x23,0x48,0x00,0x00,0x05,0x96,0x00,0x00,0x23,0x49,0x00,0x00,0x23,0x49,0x00,0x00,0x05,0x69,0x00,0x00,0x23,0x4a,0x00,0x00,0x23,0x4a,0x00,0x00,0x05,0x79,0x00,0x00,0x23,0x4b,0x00,0x00,0x23,0x4b,0x00,0x00,0x05,0x72,0x00,0x00,0x23,0x4c,0x00,0x00,0x23,0x4c,0x00,0x00,0x05,0x8e,0x00,0x00,0x23,0x4d,0x00,0x00,0x23,0x4d,0x00,0x00, +0x05,0x8a,0x00,0x00,0x23,0x4e,0x00,0x00,0x23,0x4e,0x00,0x00,0x05,0x78,0x00,0x00,0x23,0x4f,0x00,0x00,0x23,0x4f,0x00,0x00,0x05,0xa9,0x00,0x00,0x23,0x50,0x00,0x00,0x23,0x50,0x00,0x00,0x05,0x98,0x00,0x00,0x23,0x51,0x00,0x00,0x23,0x51,0x00,0x00,0x05,0xa8,0x00,0x00,0x23,0x52,0x00,0x00,0x23,0x52,0x00,0x00,0x05,0x71,0x00,0x00, +0x23,0x53,0x00,0x00,0x23,0x53,0x00,0x00,0x05,0x99,0x00,0x00,0x23,0x54,0x00,0x00,0x23,0x54,0x00,0x00,0x05,0x89,0x00,0x00,0x23,0x55,0x00,0x00,0x23,0x55,0x00,0x00,0x05,0xa7,0x00,0x00,0x23,0x56,0x00,0x00,0x23,0x56,0x00,0x00,0x05,0x7a,0x00,0x00,0x23,0x57,0x00,0x00,0x23,0x57,0x00,0x00,0x05,0x8d,0x00,0x00,0x23,0x58,0x00,0x00, +0x23,0x58,0x00,0x00,0x05,0x9b,0x00,0x00,0x23,0x59,0x00,0x00,0x23,0x59,0x00,0x00,0x05,0x73,0x00,0x00,0x23,0x5a,0x00,0x00,0x23,0x5a,0x00,0x00,0x05,0x75,0x00,0x00,0x23,0x5b,0x00,0x00,0x23,0x5b,0x00,0x00,0x05,0x80,0x00,0x00,0x23,0x5c,0x00,0x00,0x23,0x5c,0x00,0x00,0x05,0x6e,0x00,0x00,0x23,0x5d,0x00,0x00,0x23,0x5d,0x00,0x00, +0x05,0xa5,0x00,0x00,0x23,0x5e,0x00,0x00,0x23,0x5e,0x00,0x00,0x05,0x9a,0x00,0x00,0x23,0x5f,0x00,0x00,0x23,0x5f,0x00,0x00,0x05,0x6c,0x00,0x00,0x23,0x60,0x00,0x00,0x23,0x60,0x00,0x00,0x05,0x88,0x00,0x00,0x23,0x61,0x00,0x00,0x23,0x61,0x00,0x00,0x05,0xa6,0x00,0x00,0x23,0x62,0x00,0x00,0x23,0x62,0x00,0x00,0x05,0x70,0x00,0x00, +0x23,0x63,0x00,0x00,0x23,0x63,0x00,0x00,0x05,0xa1,0x00,0x00,0x23,0x64,0x00,0x00,0x23,0x64,0x00,0x00,0x05,0x7f,0x00,0x00,0x23,0x65,0x00,0x00,0x23,0x65,0x00,0x00,0x05,0x6a,0x00,0x00,0x23,0x66,0x00,0x00,0x23,0x66,0x00,0x00,0x05,0x77,0x00,0x00,0x23,0x67,0x00,0x00,0x23,0x67,0x00,0x00,0x05,0x81,0x00,0x00,0x23,0x68,0x00,0x00, +0x23,0x68,0x00,0x00,0x05,0xa3,0x00,0x00,0x23,0x69,0x00,0x00,0x23,0x69,0x00,0x00,0x05,0x7c,0x00,0x00,0x23,0x6a,0x00,0x00,0x23,0x6a,0x00,0x00,0x05,0x6f,0x00,0x00,0x23,0x6b,0x00,0x00,0x23,0x6b,0x00,0x00,0x05,0x74,0x00,0x00,0x23,0x6c,0x00,0x00,0x23,0x6c,0x00,0x00,0x05,0xaa,0x00,0x00,0x23,0x6d,0x00,0x00,0x23,0x6d,0x00,0x00, +0x05,0xa2,0x00,0x00,0x23,0x6e,0x00,0x00,0x23,0x6e,0x00,0x00,0x05,0x9e,0x00,0x00,0x23,0x6f,0x00,0x00,0x23,0x70,0x00,0x00,0x05,0x94,0x00,0x00,0x23,0x71,0x00,0x00,0x23,0x71,0x00,0x00,0x05,0x76,0x00,0x00,0x23,0x72,0x00,0x00,0x23,0x72,0x00,0x00,0x05,0xa4,0x00,0x00,0x23,0x73,0x00,0x00,0x23,0x73,0x00,0x00,0x05,0x7d,0x00,0x00, +0x23,0x74,0x00,0x00,0x23,0x74,0x00,0x00,0x05,0x9c,0x00,0x00,0x23,0x75,0x00,0x00,0x23,0x75,0x00,0x00,0x05,0x83,0x00,0x00,0x23,0x76,0x00,0x00,0x23,0x76,0x00,0x00,0x05,0x67,0x00,0x00,0x23,0x77,0x00,0x00,0x23,0x77,0x00,0x00,0x05,0x7b,0x00,0x00,0x23,0x78,0x00,0x00,0x23,0x78,0x00,0x00,0x05,0x7e,0x00,0x00,0x23,0x79,0x00,0x00, +0x23,0x79,0x00,0x00,0x05,0x84,0x00,0x00,0x23,0x7a,0x00,0x00,0x23,0x7a,0x00,0x00,0x05,0x66,0x00,0x00,0x23,0x89,0x00,0x00,0x23,0x89,0x00,0x00,0x05,0xe0,0x00,0x00,0x23,0x8a,0x00,0x00,0x23,0x8a,0x00,0x00,0x05,0xd5,0x00,0x00,0x23,0x8b,0x00,0x00,0x23,0x8b,0x00,0x00,0x05,0xc7,0x00,0x00,0x23,0x95,0x00,0x00,0x23,0x95,0x00,0x00, +0x05,0x85,0x00,0x00,0x23,0x9b,0x00,0x00,0x23,0x9b,0x00,0x00,0x04,0x34,0x00,0x00,0x23,0x9c,0x00,0x00,0x23,0x9d,0x00,0x00,0x04,0x32,0x00,0x00,0x23,0x9e,0x00,0x00,0x23,0x9e,0x00,0x00,0x04,0x37,0x00,0x00,0x23,0x9f,0x00,0x00,0x23,0xa0,0x00,0x00,0x04,0x35,0x00,0x00,0x23,0xa1,0x00,0x00,0x23,0xa1,0x00,0x00,0x03,0xf6,0x00,0x00, +0x23,0xa2,0x00,0x00,0x23,0xa3,0x00,0x00,0x03,0xf4,0x00,0x00,0x23,0xa4,0x00,0x00,0x23,0xa4,0x00,0x00,0x04,0x4a,0x00,0x00,0x23,0xa5,0x00,0x00,0x23,0xa6,0x00,0x00,0x04,0x48,0x00,0x00,0x23,0xa7,0x00,0x00,0x23,0xa7,0x00,0x00,0x03,0xf2,0x00,0x00,0x23,0xa8,0x00,0x00,0x23,0xa8,0x00,0x00,0x03,0xf1,0x00,0x00,0x23,0xa9,0x00,0x00, +0x23,0xa9,0x00,0x00,0x03,0xf0,0x00,0x00,0x23,0xaa,0x00,0x00,0x23,0xaa,0x00,0x00,0x03,0xd9,0x00,0x00,0x23,0xab,0x00,0x00,0x23,0xab,0x00,0x00,0x04,0x46,0x00,0x00,0x23,0xac,0x00,0x00,0x23,0xac,0x00,0x00,0x04,0x45,0x00,0x00,0x23,0xad,0x00,0x00,0x23,0xad,0x00,0x00,0x04,0x44,0x00,0x00,0x23,0xce,0x00,0x00,0x23,0xce,0x00,0x00, +0x05,0xea,0x00,0x00,0x23,0xfb,0x00,0x00,0x23,0xfc,0x00,0x00,0x05,0xef,0x00,0x00,0x23,0xfd,0x00,0x00,0x23,0xfe,0x00,0x00,0x05,0xf2,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x05,0xee,0x00,0x00,0x24,0x01,0x00,0x00,0x24,0x02,0x00,0x00,0x05,0xfa,0x00,0x00,0x24,0x03,0x00,0x00,0x24,0x04,0x00,0x00,0x05,0xd7,0x00,0x00, +0x24,0x05,0x00,0x00,0x24,0x05,0x00,0x00,0x05,0xda,0x00,0x00,0x24,0x06,0x00,0x00,0x24,0x06,0x00,0x00,0x05,0xb2,0x00,0x00,0x24,0x07,0x00,0x00,0x24,0x07,0x00,0x00,0x05,0xc5,0x00,0x00,0x24,0x08,0x00,0x00,0x24,0x08,0x00,0x00,0x05,0xb3,0x00,0x00,0x24,0x09,0x00,0x00,0x24,0x09,0x00,0x00,0x05,0xdf,0x00,0x00,0x24,0x0a,0x00,0x00, +0x24,0x0a,0x00,0x00,0x05,0xeb,0x00,0x00,0x24,0x0b,0x00,0x00,0x24,0x0b,0x00,0x00,0x06,0x01,0x00,0x00,0x24,0x0c,0x00,0x00,0x24,0x0c,0x00,0x00,0x05,0xdd,0x00,0x00,0x24,0x0d,0x00,0x00,0x24,0x0d,0x00,0x00,0x05,0xc9,0x00,0x00,0x24,0x0e,0x00,0x00,0x24,0x0e,0x00,0x00,0x05,0xf8,0x00,0x00,0x24,0x0f,0x00,0x00,0x24,0x0f,0x00,0x00, +0x05,0xf7,0x00,0x00,0x24,0x10,0x00,0x00,0x24,0x10,0x00,0x00,0x05,0xcf,0x00,0x00,0x24,0x11,0x00,0x00,0x24,0x11,0x00,0x00,0x05,0xd2,0x00,0x00,0x24,0x12,0x00,0x00,0x24,0x12,0x00,0x00,0x05,0xd4,0x00,0x00,0x24,0x13,0x00,0x00,0x24,0x13,0x00,0x00,0x05,0xd3,0x00,0x00,0x24,0x14,0x00,0x00,0x24,0x14,0x00,0x00,0x05,0xd1,0x00,0x00, +0x24,0x15,0x00,0x00,0x24,0x15,0x00,0x00,0x05,0xec,0x00,0x00,0x24,0x16,0x00,0x00,0x24,0x16,0x00,0x00,0x05,0xfd,0x00,0x00,0x24,0x17,0x00,0x00,0x24,0x17,0x00,0x00,0x05,0xd9,0x00,0x00,0x24,0x18,0x00,0x00,0x24,0x18,0x00,0x00,0x05,0xc8,0x00,0x00,0x24,0x19,0x00,0x00,0x24,0x19,0x00,0x00,0x05,0xd6,0x00,0x00,0x24,0x1a,0x00,0x00, +0x24,0x1a,0x00,0x00,0x05,0xfc,0x00,0x00,0x24,0x1b,0x00,0x00,0x24,0x1c,0x00,0x00,0x05,0xdb,0x00,0x00,0x24,0x1d,0x00,0x00,0x24,0x1d,0x00,0x00,0x05,0xde,0x00,0x00,0x24,0x1e,0x00,0x00,0x24,0x1e,0x00,0x00,0x05,0xf5,0x00,0x00,0x24,0x1f,0x00,0x00,0x24,0x1f,0x00,0x00,0x06,0x00,0x00,0x00,0x24,0x20,0x00,0x00,0x24,0x20,0x00,0x00, +0x05,0xf9,0x00,0x00,0x24,0x21,0x00,0x00,0x24,0x21,0x00,0x00,0x05,0xd0,0x00,0x00,0x24,0x23,0x00,0x00,0x24,0x23,0x00,0x00,0x05,0xc6,0x00,0x00,0x24,0x24,0x00,0x00,0x24,0x24,0x00,0x00,0x05,0xed,0x00,0x00,0x25,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x05,0x2e,0x00,0x00,0x25,0x01,0x00,0x00,0x25,0x01,0x00,0x00,0x05,0x08,0x00,0x00, +0x25,0x02,0x00,0x00,0x25,0x02,0x00,0x00,0x05,0x3b,0x00,0x00,0x25,0x03,0x00,0x00,0x25,0x03,0x00,0x00,0x05,0x15,0x00,0x00,0x25,0x04,0x00,0x00,0x25,0x04,0x00,0x00,0x05,0x34,0x00,0x00,0x25,0x05,0x00,0x00,0x25,0x05,0x00,0x00,0x05,0x0e,0x00,0x00,0x25,0x06,0x00,0x00,0x25,0x06,0x00,0x00,0x05,0x35,0x00,0x00,0x25,0x07,0x00,0x00, +0x25,0x07,0x00,0x00,0x05,0x0f,0x00,0x00,0x25,0x08,0x00,0x00,0x25,0x08,0x00,0x00,0x05,0x31,0x00,0x00,0x25,0x09,0x00,0x00,0x25,0x09,0x00,0x00,0x05,0x0b,0x00,0x00,0x25,0x0a,0x00,0x00,0x25,0x0a,0x00,0x00,0x05,0x32,0x00,0x00,0x25,0x0b,0x00,0x00,0x25,0x0b,0x00,0x00,0x05,0x0c,0x00,0x00,0x25,0x0c,0x00,0x00,0x25,0x0c,0x00,0x00, +0x05,0x2d,0x00,0x00,0x25,0x0d,0x00,0x00,0x25,0x0d,0x00,0x00,0x04,0xfc,0x00,0x00,0x25,0x0e,0x00,0x00,0x25,0x0e,0x00,0x00,0x04,0xf6,0x00,0x00,0x25,0x0f,0x00,0x00,0x25,0x0f,0x00,0x00,0x05,0x07,0x00,0x00,0x25,0x10,0x00,0x00,0x25,0x10,0x00,0x00,0x05,0x2c,0x00,0x00,0x25,0x11,0x00,0x00,0x25,0x11,0x00,0x00,0x04,0xfa,0x00,0x00, +0x25,0x12,0x00,0x00,0x25,0x12,0x00,0x00,0x04,0xf4,0x00,0x00,0x25,0x13,0x00,0x00,0x25,0x13,0x00,0x00,0x05,0x06,0x00,0x00,0x25,0x14,0x00,0x00,0x25,0x14,0x00,0x00,0x05,0x3a,0x00,0x00,0x25,0x15,0x00,0x00,0x25,0x15,0x00,0x00,0x05,0x55,0x00,0x00,0x25,0x16,0x00,0x00,0x25,0x16,0x00,0x00,0x05,0x4f,0x00,0x00,0x25,0x17,0x00,0x00, +0x25,0x17,0x00,0x00,0x05,0x14,0x00,0x00,0x25,0x18,0x00,0x00,0x25,0x18,0x00,0x00,0x05,0x39,0x00,0x00,0x25,0x19,0x00,0x00,0x25,0x19,0x00,0x00,0x05,0x53,0x00,0x00,0x25,0x1a,0x00,0x00,0x25,0x1a,0x00,0x00,0x05,0x4d,0x00,0x00,0x25,0x1b,0x00,0x00,0x25,0x1b,0x00,0x00,0x05,0x12,0x00,0x00,0x25,0x1c,0x00,0x00,0x25,0x1c,0x00,0x00, +0x05,0x3e,0x00,0x00,0x25,0x1d,0x00,0x00,0x25,0x1d,0x00,0x00,0x05,0x61,0x00,0x00,0x25,0x1e,0x00,0x00,0x25,0x1e,0x00,0x00,0x05,0x4e,0x00,0x00,0x25,0x1f,0x00,0x00,0x25,0x1f,0x00,0x00,0x04,0xf7,0x00,0x00,0x25,0x20,0x00,0x00,0x25,0x20,0x00,0x00,0x05,0x5e,0x00,0x00,0x25,0x21,0x00,0x00,0x25,0x21,0x00,0x00,0x04,0xfd,0x00,0x00, +0x25,0x22,0x00,0x00,0x25,0x22,0x00,0x00,0x05,0x54,0x00,0x00,0x25,0x23,0x00,0x00,0x25,0x23,0x00,0x00,0x05,0x18,0x00,0x00,0x25,0x24,0x00,0x00,0x25,0x24,0x00,0x00,0x05,0x3d,0x00,0x00,0x25,0x25,0x00,0x00,0x25,0x25,0x00,0x00,0x05,0x60,0x00,0x00,0x25,0x26,0x00,0x00,0x25,0x26,0x00,0x00,0x05,0x4c,0x00,0x00,0x25,0x27,0x00,0x00, +0x25,0x27,0x00,0x00,0x04,0xf5,0x00,0x00,0x25,0x28,0x00,0x00,0x25,0x28,0x00,0x00,0x05,0x5d,0x00,0x00,0x25,0x29,0x00,0x00,0x25,0x29,0x00,0x00,0x04,0xfb,0x00,0x00,0x25,0x2a,0x00,0x00,0x25,0x2a,0x00,0x00,0x05,0x52,0x00,0x00,0x25,0x2b,0x00,0x00,0x25,0x2b,0x00,0x00,0x05,0x17,0x00,0x00,0x25,0x2c,0x00,0x00,0x25,0x2c,0x00,0x00, +0x05,0x2b,0x00,0x00,0x25,0x2d,0x00,0x00,0x25,0x2d,0x00,0x00,0x05,0x1a,0x00,0x00,0x25,0x2e,0x00,0x00,0x25,0x2e,0x00,0x00,0x05,0x40,0x00,0x00,0x25,0x2f,0x00,0x00,0x25,0x2f,0x00,0x00,0x04,0xf9,0x00,0x00,0x25,0x30,0x00,0x00,0x25,0x30,0x00,0x00,0x04,0xf3,0x00,0x00,0x25,0x31,0x00,0x00,0x25,0x31,0x00,0x00,0x05,0x43,0x00,0x00, +0x25,0x32,0x00,0x00,0x25,0x32,0x00,0x00,0x05,0x1d,0x00,0x00,0x25,0x33,0x00,0x00,0x25,0x33,0x00,0x00,0x05,0x05,0x00,0x00,0x25,0x34,0x00,0x00,0x25,0x34,0x00,0x00,0x05,0x38,0x00,0x00,0x25,0x35,0x00,0x00,0x25,0x35,0x00,0x00,0x05,0x1b,0x00,0x00,0x25,0x36,0x00,0x00,0x25,0x36,0x00,0x00,0x05,0x41,0x00,0x00,0x25,0x37,0x00,0x00, +0x25,0x37,0x00,0x00,0x05,0x51,0x00,0x00,0x25,0x38,0x00,0x00,0x25,0x38,0x00,0x00,0x05,0x4b,0x00,0x00,0x25,0x39,0x00,0x00,0x25,0x39,0x00,0x00,0x05,0x44,0x00,0x00,0x25,0x3a,0x00,0x00,0x25,0x3a,0x00,0x00,0x05,0x1e,0x00,0x00,0x25,0x3b,0x00,0x00,0x25,0x3b,0x00,0x00,0x05,0x11,0x00,0x00,0x25,0x3c,0x00,0x00,0x25,0x3c,0x00,0x00, +0x05,0x3c,0x00,0x00,0x25,0x3d,0x00,0x00,0x25,0x3d,0x00,0x00,0x05,0x1c,0x00,0x00,0x25,0x3e,0x00,0x00,0x25,0x3e,0x00,0x00,0x05,0x42,0x00,0x00,0x25,0x3f,0x00,0x00,0x25,0x3f,0x00,0x00,0x05,0x5f,0x00,0x00,0x25,0x40,0x00,0x00,0x25,0x40,0x00,0x00,0x05,0x4a,0x00,0x00,0x25,0x41,0x00,0x00,0x25,0x41,0x00,0x00,0x04,0xf8,0x00,0x00, +0x25,0x42,0x00,0x00,0x25,0x42,0x00,0x00,0x05,0x5c,0x00,0x00,0x25,0x43,0x00,0x00,0x25,0x43,0x00,0x00,0x05,0x20,0x00,0x00,0x25,0x44,0x00,0x00,0x25,0x44,0x00,0x00,0x05,0x46,0x00,0x00,0x25,0x45,0x00,0x00,0x25,0x45,0x00,0x00,0x05,0x19,0x00,0x00,0x25,0x46,0x00,0x00,0x25,0x46,0x00,0x00,0x05,0x3f,0x00,0x00,0x25,0x47,0x00,0x00, +0x25,0x47,0x00,0x00,0x04,0xfe,0x00,0x00,0x25,0x48,0x00,0x00,0x25,0x48,0x00,0x00,0x05,0x50,0x00,0x00,0x25,0x49,0x00,0x00,0x25,0x49,0x00,0x00,0x05,0x45,0x00,0x00,0x25,0x4a,0x00,0x00,0x25,0x4a,0x00,0x00,0x05,0x1f,0x00,0x00,0x25,0x4b,0x00,0x00,0x25,0x4b,0x00,0x00,0x05,0x16,0x00,0x00,0x25,0x4c,0x00,0x00,0x25,0x4c,0x00,0x00, +0x05,0x28,0x00,0x00,0x25,0x4d,0x00,0x00,0x25,0x4d,0x00,0x00,0x05,0x02,0x00,0x00,0x25,0x4e,0x00,0x00,0x25,0x4e,0x00,0x00,0x05,0x29,0x00,0x00,0x25,0x4f,0x00,0x00,0x25,0x4f,0x00,0x00,0x05,0x03,0x00,0x00,0x25,0x50,0x00,0x00,0x25,0x50,0x00,0x00,0x04,0xe8,0x00,0x00,0x25,0x51,0x00,0x00,0x25,0x51,0x00,0x00,0x04,0xec,0x00,0x00, +0x25,0x52,0x00,0x00,0x25,0x52,0x00,0x00,0x05,0x01,0x00,0x00,0x25,0x53,0x00,0x00,0x25,0x53,0x00,0x00,0x04,0xf2,0x00,0x00,0x25,0x54,0x00,0x00,0x25,0x54,0x00,0x00,0x04,0xe7,0x00,0x00,0x25,0x55,0x00,0x00,0x25,0x55,0x00,0x00,0x05,0x00,0x00,0x00,0x25,0x56,0x00,0x00,0x25,0x56,0x00,0x00,0x04,0xf1,0x00,0x00,0x25,0x57,0x00,0x00, +0x25,0x57,0x00,0x00,0x04,0xe6,0x00,0x00,0x25,0x58,0x00,0x00,0x25,0x58,0x00,0x00,0x05,0x58,0x00,0x00,0x25,0x59,0x00,0x00,0x25,0x59,0x00,0x00,0x05,0x49,0x00,0x00,0x25,0x5a,0x00,0x00,0x25,0x5a,0x00,0x00,0x04,0xeb,0x00,0x00,0x25,0x5b,0x00,0x00,0x25,0x5b,0x00,0x00,0x05,0x57,0x00,0x00,0x25,0x5c,0x00,0x00,0x25,0x5c,0x00,0x00, +0x05,0x48,0x00,0x00,0x25,0x5d,0x00,0x00,0x25,0x5d,0x00,0x00,0x04,0xea,0x00,0x00,0x25,0x5e,0x00,0x00,0x25,0x5e,0x00,0x00,0x05,0x64,0x00,0x00,0x25,0x5f,0x00,0x00,0x25,0x5f,0x00,0x00,0x05,0x5b,0x00,0x00,0x25,0x60,0x00,0x00,0x25,0x60,0x00,0x00,0x04,0xef,0x00,0x00,0x25,0x61,0x00,0x00,0x25,0x61,0x00,0x00,0x05,0x63,0x00,0x00, +0x25,0x62,0x00,0x00,0x25,0x62,0x00,0x00,0x05,0x5a,0x00,0x00,0x25,0x63,0x00,0x00,0x25,0x63,0x00,0x00,0x04,0xee,0x00,0x00,0x25,0x64,0x00,0x00,0x25,0x64,0x00,0x00,0x04,0xff,0x00,0x00,0x25,0x65,0x00,0x00,0x25,0x65,0x00,0x00,0x04,0xf0,0x00,0x00,0x25,0x66,0x00,0x00,0x25,0x66,0x00,0x00,0x04,0xe5,0x00,0x00,0x25,0x67,0x00,0x00, +0x25,0x67,0x00,0x00,0x05,0x56,0x00,0x00,0x25,0x68,0x00,0x00,0x25,0x68,0x00,0x00,0x05,0x47,0x00,0x00,0x25,0x69,0x00,0x00,0x25,0x69,0x00,0x00,0x04,0xe9,0x00,0x00,0x25,0x6a,0x00,0x00,0x25,0x6a,0x00,0x00,0x05,0x62,0x00,0x00,0x25,0x6b,0x00,0x00,0x25,0x6b,0x00,0x00,0x05,0x59,0x00,0x00,0x25,0x6c,0x00,0x00,0x25,0x6c,0x00,0x00, +0x04,0xed,0x00,0x00,0x25,0x6d,0x00,0x00,0x25,0x6d,0x00,0x00,0x05,0x22,0x00,0x00,0x25,0x6e,0x00,0x00,0x25,0x6e,0x00,0x00,0x05,0x21,0x00,0x00,0x25,0x6f,0x00,0x00,0x25,0x70,0x00,0x00,0x05,0x23,0x00,0x00,0x25,0x71,0x00,0x00,0x25,0x71,0x00,0x00,0x05,0x27,0x00,0x00,0x25,0x72,0x00,0x00,0x25,0x72,0x00,0x00,0x05,0x26,0x00,0x00, +0x25,0x73,0x00,0x00,0x25,0x73,0x00,0x00,0x05,0x25,0x00,0x00,0x25,0x74,0x00,0x00,0x25,0x74,0x00,0x00,0x05,0x2f,0x00,0x00,0x25,0x75,0x00,0x00,0x25,0x75,0x00,0x00,0x05,0x36,0x00,0x00,0x25,0x76,0x00,0x00,0x25,0x76,0x00,0x00,0x05,0x33,0x00,0x00,0x25,0x77,0x00,0x00,0x25,0x77,0x00,0x00,0x05,0x2a,0x00,0x00,0x25,0x78,0x00,0x00, +0x25,0x78,0x00,0x00,0x05,0x09,0x00,0x00,0x25,0x79,0x00,0x00,0x25,0x79,0x00,0x00,0x05,0x10,0x00,0x00,0x25,0x7a,0x00,0x00,0x25,0x7a,0x00,0x00,0x05,0x0d,0x00,0x00,0x25,0x7b,0x00,0x00,0x25,0x7b,0x00,0x00,0x05,0x04,0x00,0x00,0x25,0x7c,0x00,0x00,0x25,0x7c,0x00,0x00,0x05,0x30,0x00,0x00,0x25,0x7d,0x00,0x00,0x25,0x7d,0x00,0x00, +0x05,0x37,0x00,0x00,0x25,0x7e,0x00,0x00,0x25,0x7e,0x00,0x00,0x05,0x0a,0x00,0x00,0x25,0x7f,0x00,0x00,0x25,0x7f,0x00,0x00,0x05,0x13,0x00,0x00,0x25,0x80,0x00,0x00,0x25,0x80,0x00,0x00,0x04,0xa2,0x00,0x00,0x25,0x81,0x00,0x00,0x25,0x88,0x00,0x00,0x04,0x9a,0x00,0x00,0x25,0x89,0x00,0x00,0x25,0x89,0x00,0x00,0x04,0xaa,0x00,0x00, +0x25,0x8a,0x00,0x00,0x25,0x8a,0x00,0x00,0x04,0xa9,0x00,0x00,0x25,0x8b,0x00,0x00,0x25,0x8b,0x00,0x00,0x04,0xa8,0x00,0x00,0x25,0x8c,0x00,0x00,0x25,0x8c,0x00,0x00,0x04,0xa7,0x00,0x00,0x25,0x8d,0x00,0x00,0x25,0x8d,0x00,0x00,0x04,0xa6,0x00,0x00,0x25,0x8e,0x00,0x00,0x25,0x8e,0x00,0x00,0x04,0xa5,0x00,0x00,0x25,0x8f,0x00,0x00, +0x25,0x8f,0x00,0x00,0x04,0xa4,0x00,0x00,0x25,0x90,0x00,0x00,0x25,0x90,0x00,0x00,0x04,0xab,0x00,0x00,0x25,0x91,0x00,0x00,0x25,0x93,0x00,0x00,0x04,0xb7,0x00,0x00,0x25,0x94,0x00,0x00,0x25,0x94,0x00,0x00,0x04,0xa3,0x00,0x00,0x25,0x95,0x00,0x00,0x25,0x9f,0x00,0x00,0x04,0xac,0x00,0x00,0x25,0xa0,0x00,0x00,0x25,0xa1,0x00,0x00, +0x04,0xc8,0x00,0x00,0x25,0xaa,0x00,0x00,0x25,0xab,0x00,0x00,0x04,0xca,0x00,0x00,0x25,0xb2,0x00,0x00,0x25,0xb2,0x00,0x00,0x04,0xd1,0x00,0x00,0x25,0xb3,0x00,0x00,0x25,0xb3,0x00,0x00,0x04,0xd5,0x00,0x00,0x25,0xb4,0x00,0x00,0x25,0xb4,0x00,0x00,0x04,0xdd,0x00,0x00,0x25,0xb5,0x00,0x00,0x25,0xb5,0x00,0x00,0x04,0xe1,0x00,0x00, +0x25,0xb6,0x00,0x00,0x25,0xb6,0x00,0x00,0x04,0xd2,0x00,0x00,0x25,0xb7,0x00,0x00,0x25,0xb7,0x00,0x00,0x04,0xd6,0x00,0x00,0x25,0xb8,0x00,0x00,0x25,0xb8,0x00,0x00,0x04,0xde,0x00,0x00,0x25,0xb9,0x00,0x00,0x25,0xb9,0x00,0x00,0x04,0xe2,0x00,0x00,0x25,0xba,0x00,0x00,0x25,0xba,0x00,0x00,0x04,0xd9,0x00,0x00,0x25,0xbb,0x00,0x00, +0x25,0xbb,0x00,0x00,0x04,0xdb,0x00,0x00,0x25,0xbc,0x00,0x00,0x25,0xbc,0x00,0x00,0x04,0xd3,0x00,0x00,0x25,0xbd,0x00,0x00,0x25,0xbd,0x00,0x00,0x04,0xd7,0x00,0x00,0x25,0xbe,0x00,0x00,0x25,0xbe,0x00,0x00,0x04,0xdf,0x00,0x00,0x25,0xbf,0x00,0x00,0x25,0xbf,0x00,0x00,0x04,0xe3,0x00,0x00,0x25,0xc0,0x00,0x00,0x25,0xc0,0x00,0x00, +0x04,0xd4,0x00,0x00,0x25,0xc1,0x00,0x00,0x25,0xc1,0x00,0x00,0x04,0xd8,0x00,0x00,0x25,0xc2,0x00,0x00,0x25,0xc2,0x00,0x00,0x04,0xe0,0x00,0x00,0x25,0xc3,0x00,0x00,0x25,0xc3,0x00,0x00,0x04,0xe4,0x00,0x00,0x25,0xc4,0x00,0x00,0x25,0xc4,0x00,0x00,0x04,0xda,0x00,0x00,0x25,0xc5,0x00,0x00,0x25,0xc5,0x00,0x00,0x04,0xdc,0x00,0x00, +0x25,0xc6,0x00,0x00,0x25,0xc8,0x00,0x00,0x04,0xc4,0x00,0x00,0x25,0xc9,0x00,0x00,0x25,0xc9,0x00,0x00,0x04,0xc1,0x00,0x00,0x25,0xca,0x00,0x00,0x25,0xca,0x00,0x00,0x04,0xc7,0x00,0x00,0x25,0xcb,0x00,0x00,0x25,0xcb,0x00,0x00,0x04,0xbb,0x00,0x00,0x25,0xcc,0x00,0x00,0x25,0xcc,0x00,0x00,0x04,0xc0,0x00,0x00,0x25,0xce,0x00,0x00, +0x25,0xce,0x00,0x00,0x04,0xc2,0x00,0x00,0x25,0xcf,0x00,0x00,0x25,0xcf,0x00,0x00,0x04,0xba,0x00,0x00,0x25,0xd4,0x00,0x00,0x25,0xd5,0x00,0x00,0x04,0xbd,0x00,0x00,0x25,0xe6,0x00,0x00,0x25,0xe6,0x00,0x00,0x04,0xc3,0x00,0x00,0x25,0xe7,0x00,0x00,0x25,0xeb,0x00,0x00,0x04,0xcc,0x00,0x00,0x25,0xef,0x00,0x00,0x25,0xef,0x00,0x00, +0x04,0xbc,0x00,0x00,0x25,0xf6,0x00,0x00,0x25,0xf6,0x00,0x00,0x04,0xbf,0x00,0x00,0x26,0x6d,0x00,0x00,0x26,0x6d,0x00,0x00,0x06,0x60,0x00,0x00,0x26,0x6f,0x00,0x00,0x26,0x6f,0x00,0x00,0x06,0x61,0x00,0x00,0x26,0x87,0x00,0x00,0x26,0x87,0x00,0x00,0x05,0xab,0x00,0x00,0x26,0xa0,0x00,0x00,0x26,0xa1,0x00,0x00,0x05,0xac,0x00,0x00, +0x27,0x13,0x00,0x00,0x27,0x13,0x00,0x00,0x05,0xae,0x00,0x00,0x27,0x15,0x00,0x00,0x27,0x15,0x00,0x00,0x05,0xaf,0x00,0x00,0x27,0x17,0x00,0x00,0x27,0x17,0x00,0x00,0x05,0xb0,0x00,0x00,0x27,0x36,0x00,0x00,0x27,0x36,0x00,0x00,0x05,0xb1,0x00,0x00,0x27,0x6e,0x00,0x00,0x27,0x6e,0x00,0x00,0x03,0x4c,0x00,0x00,0x27,0x6f,0x00,0x00, +0x27,0x6f,0x00,0x00,0x03,0x4e,0x00,0x00,0x27,0x70,0x00,0x00,0x27,0x70,0x00,0x00,0x03,0x4b,0x00,0x00,0x27,0x71,0x00,0x00,0x27,0x71,0x00,0x00,0x03,0x4d,0x00,0x00,0x27,0x94,0x00,0x00,0x27,0x94,0x00,0x00,0x04,0x93,0x00,0x00,0x27,0x9c,0x00,0x00,0x27,0x9e,0x00,0x00,0x04,0x94,0x00,0x00,0x27,0xc5,0x00,0x00,0x27,0xc5,0x00,0x00, +0x03,0x51,0x00,0x00,0x27,0xc6,0x00,0x00,0x27,0xc6,0x00,0x00,0x03,0x54,0x00,0x00,0x27,0xdc,0x00,0x00,0x27,0xdc,0x00,0x00,0x03,0xef,0x00,0x00,0x27,0xe6,0x00,0x00,0x27,0xe6,0x00,0x00,0x03,0xb6,0x00,0x00,0x27,0xe7,0x00,0x00,0x27,0xe7,0x00,0x00,0x03,0xb9,0x00,0x00,0x27,0xe8,0x00,0x00,0x27,0xe8,0x00,0x00,0x03,0xb4,0x00,0x00, +0x27,0xe9,0x00,0x00,0x27,0xe9,0x00,0x00,0x03,0xb7,0x00,0x00,0x27,0xea,0x00,0x00,0x27,0xea,0x00,0x00,0x03,0xb5,0x00,0x00,0x27,0xeb,0x00,0x00,0x27,0xeb,0x00,0x00,0x03,0xb8,0x00,0x00,0x27,0xf5,0x00,0x00,0x27,0xf7,0x00,0x00,0x04,0x97,0x00,0x00,0x29,0x16,0x00,0x00,0x29,0x16,0x00,0x00,0x04,0x43,0x00,0x00,0x29,0x4a,0x00,0x00, +0x29,0x4a,0x00,0x00,0x03,0xee,0x00,0x00,0x29,0x87,0x00,0x00,0x29,0x88,0x00,0x00,0x03,0x55,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x03,0xfe,0x00,0x00,0x2a,0x05,0x00,0x00,0x2a,0x06,0x00,0x00,0x03,0xff,0x00,0x00,0x2b,0x58,0x00,0x00,0x2b,0x58,0x00,0x00,0x05,0xf1,0x00,0x00,0xe0,0xa0,0x00,0x00,0xe0,0xa2,0x00,0x00, +0x06,0xc4,0x00,0x00,0xe0,0xb0,0x00,0x00,0xe0,0xb3,0x00,0x00,0x06,0xc7,0x00,0x00,0xfe,0x62,0x00,0x00,0xfe,0x62,0x00,0x00,0x04,0x3a,0x00,0x00,0xfe,0xff,0x00,0x00,0xfe,0xff,0x00,0x00,0x03,0xc1,0x00,0x00,0xff,0x5b,0x00,0x00,0xff,0x5b,0x00,0x00,0x03,0x49,0x00,0x00,0xff,0x5d,0x00,0x00,0xff,0x5d,0x00,0x00,0x03,0x4a,0x00,0x00, +0xff,0xfd,0x00,0x00,0xff,0xfd,0x00,0x00,0x05,0xf6,0x00,0x01,0x69,0x10,0x00,0x01,0x69,0x10,0x00,0x00,0x02,0x9f,0x00,0x01,0xd5,0x38,0x00,0x01,0xd5,0x39,0x00,0x00,0x02,0xa0,0x00,0x01,0xd5,0x3b,0x00,0x01,0xd5,0x3e,0x00,0x00,0x02,0xa3,0x00,0x01,0xd5,0x40,0x00,0x01,0xd5,0x44,0x00,0x00,0x02,0xa8,0x00,0x01,0xd5,0x46,0x00,0x01, +0xd5,0x46,0x00,0x00,0x02,0xae,0x00,0x01,0xd5,0x4a,0x00,0x01,0xd5,0x50,0x00,0x00,0x02,0xb2,0x00,0x01,0xd5,0x52,0x00,0x01,0xd5,0x6b,0x00,0x00,0x02,0xba,0x00,0x00,0xb0,0x00,0x2c,0x20,0xb0,0x00,0x55,0x58,0x45,0x59,0x20,0x20,0x4b,0xb8,0x00,0x0e,0x51,0x4b,0xb0,0x06,0x53,0x5a,0x58,0xb0,0x34,0x1b,0xb0,0x28,0x59,0x60,0x66,0x20, +0x8a,0x55,0x58,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x62,0x1b,0x21,0x21,0xb0,0x00,0x59,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x01,0x2c,0xb0,0x20,0x60,0x66,0x2d,0xb0,0x02,0x2c,0x23,0x21,0x23,0x21,0x2d,0xb0,0x03,0x2c,0x20,0x64,0xb3,0x03,0x14,0x15,0x00,0x42,0x43,0xb0, +0x13,0x43,0x20,0x60,0x60,0x42,0xb1,0x02,0x14,0x43,0x42,0xb1,0x25,0x03,0x43,0xb0,0x02,0x43,0x54,0x78,0x20,0xb0,0x0c,0x23,0xb0,0x02,0x43,0x43,0x61,0x64,0xb0,0x04,0x50,0x78,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb0,0x21,0x65,0x1c,0x21,0xb0,0x02,0x43,0x43,0xb2,0x0e,0x15,0x01,0x42,0x1c,0x20,0xb0,0x02,0x43,0x23,0x42,0xb2,0x13, +0x01,0x13,0x43,0x60,0x42,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb2,0x16,0x01,0x02,0x43,0x60,0x42,0x2d,0xb0,0x04,0x2c,0xb0,0x03,0x2b,0xb0,0x15,0x43,0x58,0x23,0x21,0x23,0x21,0xb0,0x16,0x43,0x43,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x1b,0x20,0x64,0x20,0xb0,0xc0,0x50,0xb0,0x04,0x26,0x5a,0xb2,0x28,0x01,0x0d,0x43,0x45,0x63,0x45, +0xb0,0x06,0x45,0x58,0x21,0xb0,0x03,0x25,0x59,0x52,0x5b,0x58,0x21,0x23,0x21,0x1b,0x8a,0x58,0x20,0xb0,0x50,0x50,0x58,0x21,0xb0,0x40,0x59,0x1b,0x20,0xb0,0x38,0x50,0x58,0x21,0xb0,0x38,0x59,0x59,0x20,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x61,0x64,0xb0,0x28,0x50,0x58,0x21,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x20,0xb0,0x30,0x50, +0x58,0x21,0xb0,0x30,0x59,0x1b,0x20,0xb0,0xc0,0x50,0x58,0x20,0x66,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x0a,0x50,0x58,0x60,0x1b,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x0a,0x60,0x1b,0x20,0xb0,0x36,0x50,0x58,0x21,0xb0,0x36,0x60,0x1b,0x60,0x59,0x59,0x59,0x1b,0xb0,0x02,0x25,0xb0,0x0c,0x43,0x63,0xb0,0x00,0x52,0x58,0xb0,0x00,0x4b,0xb0, +0x0a,0x50,0x58,0x21,0xb0,0x0c,0x43,0x1b,0x4b,0xb0,0x1e,0x50,0x58,0x21,0xb0,0x1e,0x4b,0x61,0xb8,0x10,0x00,0x63,0xb0,0x0c,0x43,0x63,0xb8,0x05,0x00,0x62,0x59,0x59,0x64,0x61,0x59,0xb0,0x01,0x2b,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x59,0x20,0x64,0xb0,0x16,0x43,0x23,0x42,0x59,0x2d,0xb0,0x05,0x2c,0x20,0x45,0x20,0xb0, +0x04,0x25,0x61,0x64,0x20,0xb0,0x07,0x43,0x50,0x58,0xb0,0x07,0x23,0x42,0xb0,0x08,0x23,0x42,0x1b,0x21,0x21,0x59,0xb0,0x01,0x60,0x2d,0xb0,0x06,0x2c,0x23,0x21,0x23,0x21,0xb0,0x03,0x2b,0x20,0x64,0xb1,0x07,0x62,0x42,0x20,0xb0,0x08,0x23,0x42,0xb0,0x06,0x45,0x58,0x1b,0xb1,0x01,0x0d,0x43,0x45,0x63,0xb1,0x01,0x0d,0x43,0xb0,0x05, +0x60,0x45,0x63,0xb0,0x05,0x2a,0x21,0x20,0xb0,0x08,0x43,0x20,0x8a,0x20,0x8a,0xb0,0x01,0x2b,0xb1,0x30,0x05,0x25,0xb0,0x04,0x26,0x51,0x58,0x60,0x50,0x1b,0x61,0x52,0x59,0x58,0x23,0x59,0x21,0x59,0x20,0xb0,0x40,0x53,0x58,0xb0,0x01,0x2b,0x1b,0x21,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x2d,0xb0,0x07,0x2c,0xb0,0x09, +0x43,0x2b,0xb2,0x00,0x02,0x00,0x43,0x60,0x42,0x2d,0xb0,0x08,0x2c,0xb0,0x09,0x23,0x42,0x23,0x20,0xb0,0x00,0x23,0x42,0x61,0xb0,0x02,0x62,0x66,0xb0,0x01,0x63,0xb0,0x01,0x60,0xb0,0x07,0x2a,0x2d,0xb0,0x09,0x2c,0x20,0x20,0x45,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0, +0x01,0x63,0x60,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0a,0x2c,0xb2,0x09,0x0e,0x00,0x43,0x45,0x42,0x2a,0x21,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0b,0x2c,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0c,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45, +0x8a,0x23,0x61,0x20,0x64,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x00,0x1b,0xb0,0x30,0x50,0x58,0xb0,0x20,0x1b,0xb0,0x40,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0d,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a, +0x23,0x61,0x20,0x64,0xb0,0x24,0x50,0x58,0xb0,0x00,0x1b,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0e,0x2c,0x20,0xb0,0x00,0x23,0x42,0xb3,0x0d,0x0c,0x00,0x03,0x45,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x2a,0x21,0x2d,0xb0,0x0f,0x2c,0xb1,0x02,0x02,0x45,0xb0, +0x64,0x61,0x44,0x2d,0xb0,0x10,0x2c,0xb0,0x01,0x60,0x20,0x20,0xb0,0x0f,0x43,0x4a,0xb0,0x00,0x50,0x58,0x20,0xb0,0x0f,0x23,0x42,0x59,0xb0,0x10,0x43,0x4a,0xb0,0x00,0x52,0x58,0x20,0xb0,0x10,0x23,0x42,0x59,0x2d,0xb0,0x11,0x2c,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0x20,0xb8,0x04,0x00,0x63,0x8a,0x23,0x61,0xb0,0x11,0x43,0x60, +0x20,0x8a,0x60,0x20,0xb0,0x11,0x23,0x42,0x23,0x2d,0xb0,0x12,0x2c,0x4b,0x54,0x58,0xb1,0x04,0x64,0x44,0x59,0x24,0xb0,0x0d,0x65,0x23,0x78,0x2d,0xb0,0x13,0x2c,0x4b,0x51,0x58,0x4b,0x53,0x58,0xb1,0x04,0x64,0x44,0x59,0x1b,0x21,0x59,0x24,0xb0,0x13,0x65,0x23,0x78,0x2d,0xb0,0x14,0x2c,0xb1,0x00,0x12,0x43,0x55,0x58,0xb1,0x12,0x12, +0x43,0xb0,0x01,0x61,0x42,0xb0,0x11,0x2b,0x59,0xb0,0x00,0x43,0xb0,0x02,0x25,0x42,0xb1,0x0f,0x02,0x25,0x42,0xb1,0x10,0x02,0x25,0x42,0xb0,0x01,0x16,0x23,0x20,0xb0,0x03,0x25,0x50,0x58,0xb1,0x01,0x00,0x43,0x60,0xb0,0x04,0x25,0x42,0x8a,0x8a,0x20,0x8a,0x23,0x61,0xb0,0x10,0x2a,0x21,0x23,0xb0,0x01,0x61,0x20,0x8a,0x23,0x61,0xb0, +0x10,0x2a,0x21,0x1b,0xb1,0x01,0x00,0x43,0x60,0xb0,0x02,0x25,0x42,0xb0,0x02,0x25,0x61,0xb0,0x10,0x2a,0x21,0x59,0xb0,0x0f,0x43,0x47,0xb0,0x10,0x43,0x47,0x60,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60, +0x59,0x66,0xb0,0x01,0x63,0x60,0xb1,0x00,0x00,0x13,0x23,0x44,0xb0,0x01,0x43,0xb0,0x00,0x3e,0xb2,0x01,0x01,0x01,0x43,0x60,0x42,0x2d,0xb0,0x15,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x05,0x60,0x42,0x20,0x60,0xb7,0x18,0x18,0x01,0x00,0x11,0x00,0x13,0x00, +0x42,0x42,0x42,0x8a,0x60,0x20,0xb0,0x14,0x23,0x42,0xb0,0x01,0x61,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x16,0x2c,0xb1,0x00,0x15,0x2b,0x2d,0xb0,0x17,0x2c,0xb1,0x01,0x15,0x2b,0x2d,0xb0,0x18,0x2c,0xb1,0x02,0x15,0x2b,0x2d,0xb0,0x19,0x2c,0xb1,0x03,0x15,0x2b,0x2d,0xb0,0x1a,0x2c,0xb1,0x04,0x15,0x2b,0x2d, +0xb0,0x1b,0x2c,0xb1,0x05,0x15,0x2b,0x2d,0xb0,0x1c,0x2c,0xb1,0x06,0x15,0x2b,0x2d,0xb0,0x1d,0x2c,0xb1,0x07,0x15,0x2b,0x2d,0xb0,0x1e,0x2c,0xb1,0x08,0x15,0x2b,0x2d,0xb0,0x1f,0x2c,0xb1,0x09,0x15,0x2b,0x2d,0xb0,0x2b,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x06,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x5d, +0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2c,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x16,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x71,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2d,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x26,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x72,0x1b,0x21,0x21,0x59,0x2d,0xb0, +0x20,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x05,0x60,0x42,0x20,0x60,0xb0,0x01,0x61,0xb5,0x18,0x18,0x01,0x00,0x11,0x00,0x42,0x42,0x8a,0x60,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x21,0x2c,0xb1,0x00,0x20,0x2b,0x2d, +0xb0,0x22,0x2c,0xb1,0x01,0x20,0x2b,0x2d,0xb0,0x23,0x2c,0xb1,0x02,0x20,0x2b,0x2d,0xb0,0x24,0x2c,0xb1,0x03,0x20,0x2b,0x2d,0xb0,0x25,0x2c,0xb1,0x04,0x20,0x2b,0x2d,0xb0,0x26,0x2c,0xb1,0x05,0x20,0x2b,0x2d,0xb0,0x27,0x2c,0xb1,0x06,0x20,0x2b,0x2d,0xb0,0x28,0x2c,0xb1,0x07,0x20,0x2b,0x2d,0xb0,0x29,0x2c,0xb1,0x08,0x20,0x2b,0x2d, +0xb0,0x2a,0x2c,0xb1,0x09,0x20,0x2b,0x2d,0xb0,0x2e,0x2c,0x20,0x3c,0xb0,0x01,0x60,0x2d,0xb0,0x2f,0x2c,0x20,0x60,0xb0,0x18,0x60,0x20,0x43,0x23,0xb0,0x01,0x60,0x43,0xb0,0x02,0x25,0x61,0xb0,0x01,0x60,0xb0,0x2e,0x2a,0x21,0x2d,0xb0,0x30,0x2c,0xb0,0x2f,0x2b,0xb0,0x2f,0x2a,0x2d,0xb0,0x31,0x2c,0x20,0x20,0x47,0x20,0x20,0xb0,0x0e, +0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x23,0x20,0x8a,0x55,0x58,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x1b,0x21,0x59,0x2d,0xb0,0x32,0x2c, +0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x33,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22, +0x59,0x2d,0xb0,0x34,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0xb0,0x35,0x2c,0x00,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x45,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01, +0x63,0xb0,0x01,0x2b,0xb0,0x00,0x16,0xb4,0x00,0x00,0x00,0x00,0x00,0x44,0x3e,0x23,0x38,0xb1,0x34,0x01,0x15,0x2a,0x21,0x2d,0xb0,0x36,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0x38,0x2d,0xb0,0x37,0x2c,0x2e, +0x17,0x3c,0x2d,0xb0,0x38,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0xb0,0x01,0x43,0x63,0x38,0x2d,0xb0,0x39,0x2c,0xb1,0x02,0x00,0x16,0x25,0x20,0x2e,0x20,0x47,0xb0,0x00,0x23,0x42,0xb0,0x02,0x25,0x49,0x8a, +0x8a,0x47,0x23,0x47,0x23,0x61,0x20,0x58,0x62,0x1b,0x21,0x59,0xb0,0x01,0x23,0x42,0xb2,0x38,0x01,0x01,0x15,0x14,0x2a,0x2d,0xb0,0x3a,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x65,0x8a,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0, +0x3b,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0xb0,0x0a,0x43, +0x20,0x8a,0x23,0x47,0x23,0x47,0x23,0x61,0x23,0x46,0x60,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0, +0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x1b,0x23,0xb0,0x0a,0x43,0x46,0xb0,0x02,0x25,0xb0,0x0a,0x43,0x47,0x23,0x47,0x23,0x61,0x60,0x20,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66, +0xb0,0x01,0x63,0x60,0x23,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x06,0x43,0x60,0xb0,0x01,0x2b,0xb0,0x05,0x25,0x61,0xb0,0x05,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x04,0x26,0x61,0x20,0xb0,0x04,0x25,0x60,0x64,0x23,0xb0,0x03,0x25,0x60,0x64,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x23, +0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x59,0x2d,0xb0,0x3c,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0x20,0x20,0xb0,0x05,0x26,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x23,0x3c,0x38,0x2d,0xb0,0x3d,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x23,0x42,0x20,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61, +0x38,0x2d,0xb0,0x3e,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x03,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x00,0x54,0x58,0x2e,0x20,0x3c,0x23,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x05,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x06,0x25,0xb0,0x05,0x25,0x49,0xb0, +0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x20,0x58,0x62,0x1b,0x21,0x59,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x23,0x21,0x59,0x2d,0xb0,0x3f,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x43,0x20,0x2e, +0x47,0x23,0x47,0x23,0x61,0x20,0x60,0xb0,0x20,0x60,0x66,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x40,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d, +0xb0,0x41,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x42,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43, +0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x43,0x2c,0xb0,0x3a,0x2b,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x44,0x2c,0xb0,0x3b,0x2b,0x8a,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x8a, +0x38,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x45,0x2c,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x26,0x20,0x20,0x20,0x46,0x23,0x47,0x61,0xb0,0x0c,0x23,0x42,0x2e,0x47,0x23,0x47,0x23,0x61, +0xb0,0x0b,0x43,0x2b,0x23,0x20,0x3c,0x20,0x2e,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x46,0x2c,0xb1,0x0a,0x04,0x25,0x42,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58, +0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0x47,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b, +0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0xb0,0x02,0x25,0x46,0x61,0x38,0x23,0x20,0x3c,0x23,0x38,0x1b,0x21,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x21,0x59,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x47,0x2c,0xb1,0x00,0x3a,0x2b, +0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x48,0x2c,0xb1,0x00,0x3b,0x2b,0x21,0x23,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x49,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4a, +0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4b,0x2c,0xb1,0x00,0x01,0x14,0x13,0xb0,0x37,0x2a,0x2d,0xb0,0x4c,0x2c,0xb0,0x39,0x2a,0x2d,0xb0,0x4d,0x2c,0xb0,0x00,0x16,0x45,0x23,0x20,0x2e,0x20,0x46,0x8a,0x23,0x61,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0, +0x4e,0x2c,0xb0,0x0a,0x23,0x42,0xb0,0x4d,0x2b,0x2d,0xb0,0x4f,0x2c,0xb2,0x00,0x00,0x46,0x2b,0x2d,0xb0,0x50,0x2c,0xb2,0x00,0x01,0x46,0x2b,0x2d,0xb0,0x51,0x2c,0xb2,0x01,0x00,0x46,0x2b,0x2d,0xb0,0x52,0x2c,0xb2,0x01,0x01,0x46,0x2b,0x2d,0xb0,0x53,0x2c,0xb2,0x00,0x00,0x47,0x2b,0x2d,0xb0,0x54,0x2c,0xb2,0x00,0x01,0x47,0x2b,0x2d, +0xb0,0x55,0x2c,0xb2,0x01,0x00,0x47,0x2b,0x2d,0xb0,0x56,0x2c,0xb2,0x01,0x01,0x47,0x2b,0x2d,0xb0,0x57,0x2c,0xb3,0x00,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x58,0x2c,0xb3,0x00,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x59,0x2c,0xb3,0x01,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x5a,0x2c,0xb3,0x01,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x5b,0x2c,0xb3,0x00,0x00, +0x01,0x43,0x2b,0x2d,0xb0,0x5c,0x2c,0xb3,0x00,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5d,0x2c,0xb3,0x01,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5e,0x2c,0xb3,0x01,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5f,0x2c,0xb2,0x00,0x00,0x45,0x2b,0x2d,0xb0,0x60,0x2c,0xb2,0x00,0x01,0x45,0x2b,0x2d,0xb0,0x61,0x2c,0xb2,0x01,0x00,0x45,0x2b,0x2d,0xb0,0x62,0x2c, +0xb2,0x01,0x01,0x45,0x2b,0x2d,0xb0,0x63,0x2c,0xb2,0x00,0x00,0x48,0x2b,0x2d,0xb0,0x64,0x2c,0xb2,0x00,0x01,0x48,0x2b,0x2d,0xb0,0x65,0x2c,0xb2,0x01,0x00,0x48,0x2b,0x2d,0xb0,0x66,0x2c,0xb2,0x01,0x01,0x48,0x2b,0x2d,0xb0,0x67,0x2c,0xb3,0x00,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x68,0x2c,0xb3,0x00,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x69, +0x2c,0xb3,0x01,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x6a,0x2c,0xb3,0x01,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x6b,0x2c,0xb3,0x00,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6c,0x2c,0xb3,0x00,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6d,0x2c,0xb3,0x01,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6e,0x2c,0xb3,0x01,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6f,0x2c,0xb1,0x00,0x3c, +0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x70,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x71,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x72,0x2c,0xb0,0x00,0x16,0xb1,0x00,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x73,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x74,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x41, +0x2b,0x2d,0xb0,0x75,0x2c,0xb0,0x00,0x16,0xb1,0x01,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x76,0x2c,0xb1,0x00,0x3d,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x77,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x78,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x79,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0, +0x7a,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7b,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x7c,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7d,0x2c,0xb1,0x00,0x3e,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x7e,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7f,0x2c,0xb1,0x00,0x3e,0x2b, +0xb0,0x41,0x2b,0x2d,0xb0,0x80,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x81,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x82,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x83,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x84,0x2c,0xb1,0x00,0x3f,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x85, +0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x86,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x87,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x88,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x89,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x8a,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x42,0x2b,0x2d, +0xb0,0x8b,0x2c,0xb2,0x0b,0x00,0x03,0x45,0x50,0x58,0xb0,0x06,0x1b,0xb2,0x04,0x02,0x03,0x45,0x58,0x23,0x21,0x1b,0x21,0x59,0x59,0x42,0x2b,0xb0,0x08,0x65,0xb0,0x03,0x24,0x50,0x78,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x2d,0x00,0x4b,0xb8,0x00,0xc8,0x52,0x58,0xb1,0x01,0x01,0x8e,0x59,0xb0,0x01,0xb9,0x08,0x00,0x08,0x00,0x63, +0x70,0xb1,0x00,0x07,0x42,0xb6,0x00,0x00,0x41,0x31,0x21,0x05,0x00,0x2a,0xb1,0x00,0x07,0x42,0x40,0x0c,0x4e,0x04,0x46,0x04,0x36,0x08,0x26,0x08,0x18,0x07,0x05,0x0a,0x2a,0xb1,0x00,0x07,0x42,0x40,0x0c,0x52,0x02,0x4a,0x02,0x3e,0x06,0x2e,0x06,0x1f,0x05,0x05,0x0a,0x2a,0xb1,0x00,0x0c,0x42,0xbe,0x13,0xc0,0x11,0xc0,0x0d,0xc0,0x09, +0xc0,0x06,0x40,0x00,0x05,0x00,0x0b,0x2a,0xb1,0x00,0x11,0x42,0xbe,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x05,0x00,0x0b,0x2a,0xb9,0x00,0x03,0x00,0x00,0x44,0xb1,0x24,0x01,0x88,0x51,0x58,0xb0,0x40,0x88,0x58,0xb9,0x00,0x03,0x00,0x64,0x44,0xb1,0x28,0x01,0x88,0x51,0x58,0xb8,0x08,0x00,0x88,0x58,0xb9,0x00,0x03, +0x00,0x00,0x44,0x59,0x1b,0xb1,0x27,0x01,0x88,0x51,0x58,0xba,0x08,0x80,0x00,0x01,0x04,0x40,0x88,0x63,0x54,0x58,0xb9,0x00,0x03,0x00,0x00,0x44,0x59,0x59,0x59,0x59,0x59,0x40,0x0c,0x50,0x02,0x48,0x02,0x38,0x06,0x28,0x06,0x1a,0x05,0x05,0x0e,0x2a,0xb8,0x01,0xff,0x85,0xb0,0x04,0x8d,0xb1,0x02,0x00,0x44,0xb3,0x05,0x64,0x06,0x00, +0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0x26,0x00,0x00, +0xff,0x4c,0x02,0xe4,0xff,0xf6,0x02,0x30,0xff,0xf8,0xff,0x4c,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0xda,0x02,0x26,0x00,0x00,0xff,0x4c,0x02,0xe4,0xff,0xf6,0x02,0xe4,0x02,0x2e,0xff,0xf8,0xff,0x4c,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0xda,0x02,0x26,0x00,0x00,0xff,0x4c, +0x02,0xe4,0xff,0xf6,0x03,0x09,0x02,0x30,0xff,0xf8,0xff,0x4c,0x00,0x47,0x00,0x47,0x00,0x40,0x00,0x40,0x01,0x3b,0xff,0x7b,0x01,0x40,0xff,0x76,0x00,0x47,0x00,0x47,0x00,0x40,0x00,0x40,0x03,0x3e,0x01,0x7e,0x03,0x43,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x04, +0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x54,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x84,0x00,0x00,0x01,0x9c,0x00,0x00,0x01,0xb4,0x00,0x00,0x01,0xcc,0x00,0x00,0x01,0xec,0x00,0x00,0x02,0x04,0x00,0x00,0x02,0x1c,0x00,0x00,0x02,0x34,0x00,0x00,0x02,0x4c,0x00,0x00,0x02,0x64,0x00,0x00,0x02,0x7c,0x00,0x00,0x02,0x94, +0x00,0x00,0x02,0xac,0x00,0x00,0x03,0x78,0x00,0x00,0x03,0x90,0x00,0x00,0x03,0xa8,0x00,0x00,0x04,0x28,0x00,0x00,0x04,0x40,0x00,0x00,0x04,0xe0,0x00,0x00,0x05,0x70,0x00,0x00,0x05,0x88,0x00,0x00,0x05,0xa0,0x00,0x00,0x06,0xb8,0x00,0x00,0x06,0xd0,0x00,0x00,0x06,0xe8,0x00,0x00,0x07,0x58,0x00,0x00,0x07,0xe8,0x00,0x00,0x08,0x00, +0x00,0x00,0x08,0x90,0x00,0x00,0x08,0xec,0x00,0x00,0x09,0x04,0x00,0x00,0x09,0x1c,0x00,0x00,0x09,0x34,0x00,0x00,0x09,0x4c,0x00,0x00,0x09,0x64,0x00,0x00,0x09,0x84,0x00,0x00,0x09,0x9c,0x00,0x00,0x09,0xb4,0x00,0x00,0x09,0xcc,0x00,0x00,0x09,0xe4,0x00,0x00,0x09,0xfc,0x00,0x00,0x0a,0x14,0x00,0x00,0x0a,0x2c,0x00,0x00,0x0a,0x44, +0x00,0x00,0x0a,0x5c,0x00,0x00,0x0b,0x20,0x00,0x00,0x0b,0xf0,0x00,0x00,0x0c,0x08,0x00,0x00,0x0c,0x5c,0x00,0x00,0x0c,0xf4,0x00,0x00,0x0d,0x0c,0x00,0x00,0x0d,0x24,0x00,0x00,0x0d,0x3c,0x00,0x00,0x0d,0x54,0x00,0x00,0x0d,0x6c,0x00,0x00,0x0d,0x84,0x00,0x00,0x0d,0xd8,0x00,0x00,0x0e,0x58,0x00,0x00,0x0e,0x70,0x00,0x00,0x0e,0xc4, +0x00,0x00,0x0e,0xdc,0x00,0x00,0x0e,0xf4,0x00,0x00,0x0f,0x0c,0x00,0x00,0x0f,0x24,0x00,0x00,0x0f,0x3c,0x00,0x00,0x0f,0x54,0x00,0x00,0x0f,0x6c,0x00,0x00,0x0f,0x84,0x00,0x00,0x0f,0x9c,0x00,0x00,0x10,0x50,0x00,0x00,0x10,0x68,0x00,0x00,0x10,0xcc,0x00,0x00,0x10,0xe4,0x00,0x00,0x11,0x44,0x00,0x00,0x11,0x5c,0x00,0x00,0x11,0x98, +0x00,0x00,0x11,0xb0,0x00,0x00,0x11,0xc8,0x00,0x00,0x11,0xe0,0x00,0x00,0x12,0x04,0x00,0x00,0x12,0x64,0x00,0x00,0x12,0xdc,0x00,0x00,0x13,0x40,0x00,0x00,0x13,0x58,0x00,0x00,0x13,0x70,0x00,0x00,0x13,0x88,0x00,0x00,0x14,0x08,0x00,0x00,0x14,0x20,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xbc,0x00,0x00,0x14,0xd4,0x00,0x00,0x14,0xec, +0x00,0x00,0x15,0x04,0x00,0x00,0x15,0x24,0x00,0x00,0x15,0x3c,0x00,0x00,0x15,0x54,0x00,0x00,0x15,0x6c,0x00,0x00,0x15,0x84,0x00,0x00,0x15,0x9c,0x00,0x00,0x15,0xb4,0x00,0x00,0x15,0xcc,0x00,0x00,0x16,0x74,0x00,0x00,0x16,0x8c,0x00,0x00,0x16,0xa4,0x00,0x00,0x16,0xbc,0x00,0x00,0x16,0xd4,0x00,0x00,0x16,0xec,0x00,0x00,0x17,0x04, +0x00,0x00,0x17,0x1c,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0xec,0x00,0x00,0x19,0x04,0x00,0x00,0x19,0x1c,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1a,0xe8,0x00,0x00,0x1b,0x5c,0x00,0x00,0x1b,0xfc,0x00,0x00,0x1c,0x7c,0x00,0x00,0x1c,0x94,0x00,0x00,0x1c,0xac,0x00,0x00,0x1c,0xc4,0x00,0x00,0x1d,0x78,0x00,0x00,0x1d,0x90,0x00,0x00,0x1d,0xa8, +0x00,0x00,0x1e,0xe4,0x00,0x00,0x1e,0xfc,0x00,0x00,0x1f,0x14,0x00,0x00,0x1f,0xac,0x00,0x00,0x20,0x4c,0x00,0x00,0x20,0x90,0x00,0x00,0x20,0xf4,0x00,0x00,0x21,0x0c,0x00,0x00,0x21,0xc8,0x00,0x00,0x21,0xe0,0x00,0x00,0x22,0x40,0x00,0x00,0x22,0x58,0x00,0x00,0x22,0x70,0x00,0x00,0x22,0x88,0x00,0x00,0x22,0xa0,0x00,0x00,0x22,0xb8, +0x00,0x00,0x22,0xd0,0x00,0x00,0x22,0xe8,0x00,0x00,0x23,0x6c,0x00,0x00,0x23,0x84,0x00,0x00,0x23,0x9c,0x00,0x00,0x23,0xb4,0x00,0x00,0x23,0xcc,0x00,0x00,0x23,0xe4,0x00,0x00,0x23,0xfc,0x00,0x00,0x24,0x14,0x00,0x00,0x24,0xcc,0x00,0x00,0x24,0xe4,0x00,0x00,0x24,0xfc,0x00,0x00,0x25,0x54,0x00,0x00,0x25,0xe8,0x00,0x00,0x26,0x00, +0x00,0x00,0x26,0x18,0x00,0x00,0x26,0x30,0x00,0x00,0x26,0x48,0x00,0x00,0x26,0xc4,0x00,0x00,0x27,0x24,0x00,0x00,0x27,0x3c,0x00,0x00,0x27,0x54,0x00,0x00,0x27,0x6c,0x00,0x00,0x27,0x84,0x00,0x00,0x27,0x9c,0x00,0x00,0x27,0xb4,0x00,0x00,0x27,0xcc,0x00,0x00,0x27,0xe4,0x00,0x00,0x28,0x3c,0x00,0x00,0x28,0x54,0x00,0x00,0x28,0x6c, +0x00,0x00,0x28,0x84,0x00,0x00,0x29,0x10,0x00,0x00,0x29,0x28,0x00,0x00,0x29,0x40,0x00,0x00,0x29,0x58,0x00,0x00,0x29,0x70,0x00,0x00,0x29,0xcc,0x00,0x00,0x29,0xe4,0x00,0x00,0x2a,0x94,0x00,0x00,0x2b,0x88,0x00,0x00,0x2b,0xa0,0x00,0x00,0x2b,0xb8,0x00,0x00,0x2b,0xd0,0x00,0x00,0x2b,0xf0,0x00,0x00,0x2c,0x08,0x00,0x00,0x2c,0x20, +0x00,0x00,0x2c,0x38,0x00,0x00,0x2c,0x50,0x00,0x00,0x2c,0x68,0x00,0x00,0x2c,0x80,0x00,0x00,0x2c,0xa0,0x00,0x00,0x2c,0xb8,0x00,0x00,0x2c,0xd0,0x00,0x00,0x2c,0xe8,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x18,0x00,0x00,0x2d,0x30,0x00,0x00,0x2d,0x48,0x00,0x00,0x2d,0x60,0x00,0x00,0x2e,0xe0,0x00,0x00,0x2e,0xf8,0x00,0x00,0x2f,0x10, +0x00,0x00,0x30,0x6c,0x00,0x00,0x30,0x84,0x00,0x00,0x31,0x54,0x00,0x00,0x31,0xe4,0x00,0x00,0x31,0xfc,0x00,0x00,0x32,0x14,0x00,0x00,0x33,0x2c,0x00,0x00,0x33,0x44,0x00,0x00,0x33,0x5c,0x00,0x00,0x34,0x2c,0x00,0x00,0x35,0x00,0x00,0x00,0x35,0xf8,0x00,0x00,0x36,0xf0,0x00,0x00,0x37,0x94,0x00,0x00,0x37,0xac,0x00,0x00,0x37,0xc4, +0x00,0x00,0x37,0xdc,0x00,0x00,0x37,0xf4,0x00,0x00,0x38,0x0c,0x00,0x00,0x38,0x2c,0x00,0x00,0x38,0x44,0x00,0x00,0x38,0x5c,0x00,0x00,0x38,0x74,0x00,0x00,0x38,0x8c,0x00,0x00,0x38,0xa4,0x00,0x00,0x38,0xbc,0x00,0x00,0x38,0xd4,0x00,0x00,0x38,0xec,0x00,0x00,0x39,0x04,0x00,0x00,0x3a,0x0c,0x00,0x00,0x3a,0x24,0x00,0x00,0x3a,0xc4, +0x00,0x00,0x3b,0x28,0x00,0x00,0x3c,0x10,0x00,0x00,0x3c,0x28,0x00,0x00,0x3c,0x40,0x00,0x00,0x3c,0x58,0x00,0x00,0x3c,0x70,0x00,0x00,0x3c,0x88,0x00,0x00,0x3c,0xa0,0x00,0x00,0x3d,0x10,0x00,0x00,0x3d,0x20,0x00,0x00,0x3d,0x44,0x00,0x00,0x3d,0x5c,0x00,0x00,0x3d,0xa8,0x00,0x00,0x3d,0xc0,0x00,0x00,0x3d,0xd8,0x00,0x00,0x3d,0xf0, +0x00,0x00,0x3e,0x08,0x00,0x00,0x3e,0x20,0x00,0x00,0x3e,0x38,0x00,0x00,0x3e,0x58,0x00,0x00,0x3e,0x70,0x00,0x00,0x3e,0x88,0x00,0x00,0x3e,0xa0,0x00,0x00,0x3f,0xc8,0x00,0x00,0x3f,0xe0,0x00,0x00,0x3f,0xf8,0x00,0x00,0x40,0x50,0x00,0x00,0x40,0x68,0x00,0x00,0x40,0xcc,0x00,0x00,0x40,0xe4,0x00,0x00,0x40,0xf4,0x00,0x00,0x41,0x4c, +0x00,0x00,0x41,0x64,0x00,0x00,0x41,0xe0,0x00,0x00,0x41,0xf8,0x00,0x00,0x42,0x10,0x00,0x00,0x42,0x34,0x00,0x00,0x42,0xa4,0x00,0x00,0x43,0x64,0x00,0x00,0x43,0xf4,0x00,0x00,0x44,0x0c,0x00,0x00,0x44,0x30,0x00,0x00,0x44,0x48,0x00,0x00,0x44,0x60,0x00,0x00,0x45,0x14,0x00,0x00,0x45,0x2c,0x00,0x00,0x45,0xac,0x00,0x00,0x45,0xc4, +0x00,0x00,0x45,0xdc,0x00,0x00,0x45,0xf4,0x00,0x00,0x46,0x0c,0x00,0x00,0x46,0x24,0x00,0x00,0x46,0x44,0x00,0x00,0x46,0x5c,0x00,0x00,0x46,0x74,0x00,0x00,0x46,0x8c,0x00,0x00,0x46,0xa4,0x00,0x00,0x46,0xbc,0x00,0x00,0x46,0xd4,0x00,0x00,0x46,0xec,0x00,0x00,0x47,0xc8,0x00,0x00,0x47,0xe0,0x00,0x00,0x47,0xf8,0x00,0x00,0x48,0x10, +0x00,0x00,0x48,0x28,0x00,0x00,0x48,0x40,0x00,0x00,0x48,0x58,0x00,0x00,0x48,0x70,0x00,0x00,0x49,0x54,0x00,0x00,0x4a,0x18,0x00,0x00,0x4a,0x30,0x00,0x00,0x4a,0x48,0x00,0x00,0x4b,0x50,0x00,0x00,0x4c,0x1c,0x00,0x00,0x4c,0xf0,0x00,0x00,0x4d,0xc0,0x00,0x00,0x4e,0x58,0x00,0x00,0x4e,0x70,0x00,0x00,0x4e,0x88,0x00,0x00,0x4e,0xa0, +0x00,0x00,0x4f,0x50,0x00,0x00,0x4f,0x68,0x00,0x00,0x4f,0x80,0x00,0x00,0x50,0xb4,0x00,0x00,0x50,0xcc,0x00,0x00,0x50,0xe4,0x00,0x00,0x51,0x90,0x00,0x00,0x51,0xdc,0x00,0x00,0x52,0x4c,0x00,0x00,0x52,0xd4,0x00,0x00,0x52,0xf8,0x00,0x00,0x53,0xe8,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x60,0x00,0x00,0x54,0x78,0x00,0x00,0x54,0x90, +0x00,0x00,0x54,0xa8,0x00,0x00,0x54,0xc0,0x00,0x00,0x54,0xd8,0x00,0x00,0x55,0x04,0x00,0x00,0x55,0x30,0x00,0x00,0x55,0x5c,0x00,0x00,0x55,0x88,0x00,0x00,0x55,0xa0,0x00,0x00,0x55,0xb8,0x00,0x00,0x55,0xd0,0x00,0x00,0x56,0x6c,0x00,0x00,0x56,0x84,0x00,0x00,0x56,0x9c,0x00,0x00,0x56,0xb4,0x00,0x00,0x56,0xcc,0x00,0x00,0x56,0xe4, +0x00,0x00,0x56,0xfc,0x00,0x00,0x57,0x14,0x00,0x00,0x57,0xc8,0x00,0x00,0x57,0xe0,0x00,0x00,0x57,0xf8,0x00,0x00,0x58,0x50,0x00,0x00,0x58,0xe8,0x00,0x00,0x59,0x00,0x00,0x00,0x59,0x18,0x00,0x00,0x59,0x30,0x00,0x00,0x59,0x48,0x00,0x00,0x59,0xc4,0x00,0x00,0x5a,0x24,0x00,0x00,0x5a,0x3c,0x00,0x00,0x5a,0x54,0x00,0x00,0x5a,0x6c, +0x00,0x00,0x5a,0x84,0x00,0x00,0x5a,0x9c,0x00,0x00,0x5a,0xb4,0x00,0x00,0x5a,0xcc,0x00,0x00,0x5a,0xe4,0x00,0x00,0x5b,0x3c,0x00,0x00,0x5b,0x54,0x00,0x00,0x5b,0x6c,0x00,0x00,0x5b,0x84,0x00,0x00,0x5b,0x94,0x00,0x00,0x5b,0xe0,0x00,0x00,0x5b,0xf8,0x00,0x00,0x5c,0x10,0x00,0x00,0x5c,0x28,0x00,0x00,0x5c,0x4c,0x00,0x00,0x5c,0xbc, +0x00,0x00,0x5d,0x48,0x00,0x00,0x5d,0xe8,0x00,0x00,0x5e,0x0c,0x00,0x00,0x5f,0x20,0x00,0x00,0x5f,0x38,0x00,0x00,0x60,0xbc,0x00,0x00,0x60,0xd4,0x00,0x00,0x60,0xec,0x00,0x00,0x61,0x04,0x00,0x00,0x61,0x1c,0x00,0x00,0x61,0x34,0x00,0x00,0x61,0x4c,0x00,0x00,0x61,0x64,0x00,0x00,0x62,0x04,0x00,0x00,0x62,0x1c,0x00,0x00,0x62,0x90, +0x00,0x00,0x62,0xa8,0x00,0x00,0x62,0xc0,0x00,0x00,0x62,0xd8,0x00,0x00,0x63,0x7c,0x00,0x00,0x64,0x04,0x00,0x00,0x64,0xd0,0x00,0x00,0x65,0x5c,0x00,0x00,0x65,0x74,0x00,0x00,0x65,0x8c,0x00,0x00,0x65,0xa4,0x00,0x00,0x65,0xbc,0x00,0x00,0x66,0x1c,0x00,0x00,0x66,0x34,0x00,0x00,0x66,0x44,0x00,0x00,0x66,0xb8,0x00,0x00,0x67,0x64, +0x00,0x00,0x67,0x7c,0x00,0x00,0x67,0x94,0x00,0x00,0x67,0xac,0x00,0x00,0x68,0x1c,0x00,0x00,0x68,0x34,0x00,0x00,0x68,0x4c,0x00,0x00,0x68,0x64,0x00,0x00,0x68,0x7c,0x00,0x00,0x68,0x94,0x00,0x00,0x68,0xac,0x00,0x00,0x68,0xc4,0x00,0x00,0x68,0xdc,0x00,0x00,0x69,0x6c,0x00,0x00,0x6a,0x28,0x00,0x00,0x6b,0x0c,0x00,0x00,0x6b,0xdc, +0x00,0x00,0x6d,0x00,0x00,0x00,0x6d,0xcc,0x00,0x00,0x6e,0x8c,0x00,0x00,0x6f,0x9c,0x00,0x00,0x70,0x80,0x00,0x00,0x70,0x98,0x00,0x00,0x70,0xb0,0x00,0x00,0x70,0xc8,0x00,0x00,0x70,0xe0,0x00,0x00,0x70,0xf8,0x00,0x00,0x71,0xd0,0x00,0x00,0x72,0xb8,0x00,0x00,0x73,0xc0,0x00,0x00,0x74,0xc8,0x00,0x00,0x76,0x48,0x00,0x00,0x76,0xcc, +0x00,0x00,0x77,0x44,0x00,0x00,0x77,0xac,0x00,0x00,0x78,0xa8,0x00,0x00,0x79,0x30,0x00,0x00,0x79,0x40,0x00,0x00,0x79,0xb8,0x00,0x00,0x79,0xc8,0x00,0x00,0x7a,0x08,0x00,0x00,0x7a,0x20,0x00,0x00,0x7a,0x8c,0x00,0x00,0x7b,0x0c,0x00,0x00,0x7b,0x1c,0x00,0x00,0x7b,0x34,0x00,0x00,0x7b,0xb8,0x00,0x00,0x7c,0x88,0x00,0x00,0x7c,0xec, +0x00,0x00,0x7d,0x04,0x00,0x00,0x7d,0x14,0x00,0x00,0x7d,0x2c,0x00,0x00,0x7d,0xb4,0x00,0x00,0x7d,0xc4,0x00,0x00,0x7d,0xd4,0x00,0x00,0x7d,0xe4,0x00,0x00,0x7e,0x28,0x00,0x00,0x7e,0x38,0x00,0x00,0x7e,0x48,0x00,0x00,0x7e,0x58,0x00,0x00,0x7e,0xb4,0x00,0x00,0x7e,0xcc,0x00,0x00,0x7f,0xf0,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x5c, +0x00,0x00,0x80,0xb4,0x00,0x00,0x81,0x08,0x00,0x00,0x81,0x6c,0x00,0x00,0x81,0xe4,0x00,0x00,0x82,0x54,0x00,0x00,0x82,0xd0,0x00,0x00,0x83,0x58,0x00,0x00,0x84,0x28,0x00,0x00,0x84,0xb4,0x00,0x00,0x84,0xc4,0x00,0x00,0x85,0x68,0x00,0x00,0x85,0xfc,0x00,0x00,0x86,0x0c,0x00,0x00,0x86,0x24,0x00,0x00,0x86,0x34,0x00,0x00,0x86,0xb0, +0x00,0x00,0x87,0x8c,0x00,0x00,0x88,0x14,0x00,0x00,0x88,0xac,0x00,0x00,0x89,0x08,0x00,0x00,0x89,0x7c,0x00,0x00,0x89,0xe0,0x00,0x00,0x89,0xf0,0x00,0x00,0x8a,0x68,0x00,0x00,0x8a,0xd4,0x00,0x00,0x8b,0x30,0x00,0x00,0x8b,0xd0,0x00,0x00,0x8b,0xe8,0x00,0x00,0x8c,0x00,0x00,0x00,0x8c,0x18,0x00,0x00,0x8c,0x30,0x00,0x00,0x8c,0xcc, +0x00,0x00,0x8c,0xe4,0x00,0x00,0x8d,0x64,0x00,0x00,0x8d,0x74,0x00,0x00,0x8d,0x8c,0x00,0x00,0x8d,0xfc,0x00,0x00,0x8e,0x70,0x00,0x00,0x8e,0x88,0x00,0x00,0x8f,0x60,0x00,0x00,0x8f,0x70,0x00,0x00,0x90,0x14,0x00,0x00,0x90,0xb4,0x00,0x00,0x90,0xf4,0x00,0x00,0x91,0x0c,0x00,0x00,0x91,0x78,0x00,0x00,0x91,0xf8,0x00,0x00,0x92,0x08, +0x00,0x00,0x92,0x20,0x00,0x00,0x92,0x9c,0x00,0x00,0x93,0x68,0x00,0x00,0x93,0xc8,0x00,0x00,0x93,0xe0,0x00,0x00,0x94,0x3c,0x00,0x00,0x94,0x54,0x00,0x00,0x94,0xdc,0x00,0x00,0x95,0x4c,0x00,0x00,0x95,0x9c,0x00,0x00,0x95,0xac,0x00,0x00,0x95,0xf0,0x00,0x00,0x96,0x00,0x00,0x00,0x96,0x10,0x00,0x00,0x96,0x54,0x00,0x00,0x96,0x64, +0x00,0x00,0x96,0x7c,0x00,0x00,0x97,0x34,0x00,0x00,0x97,0x44,0x00,0x00,0x97,0x9c,0x00,0x00,0x97,0xf4,0x00,0x00,0x98,0x48,0x00,0x00,0x98,0xac,0x00,0x00,0x99,0x24,0x00,0x00,0x99,0x90,0x00,0x00,0x9a,0x04,0x00,0x00,0x9a,0x88,0x00,0x00,0x9b,0x8c,0x00,0x00,0x9c,0x14,0x00,0x00,0x9c,0x24,0x00,0x00,0x9c,0xc8,0x00,0x00,0x9d,0x6c, +0x00,0x00,0x9d,0x84,0x00,0x00,0x9d,0x9c,0x00,0x00,0x9d,0xb4,0x00,0x00,0x9e,0x40,0x00,0x00,0x9f,0x18,0x00,0x00,0x9f,0x98,0x00,0x00,0xa0,0x40,0x00,0x00,0xa0,0x9c,0x00,0x00,0xa1,0x08,0x00,0x00,0xa1,0x68,0x00,0x00,0xa1,0x78,0x00,0x00,0xa1,0xf0,0x00,0x00,0xa2,0x5c,0x00,0x00,0xa2,0xb8,0x00,0x00,0xa3,0x5c,0x00,0x00,0xa3,0x74, +0x00,0x00,0xa3,0x8c,0x00,0x00,0xa3,0xa4,0x00,0x00,0xa3,0xbc,0x00,0x00,0xa4,0x58,0x00,0x00,0xa4,0x70,0x00,0x00,0xa4,0x88,0x00,0x00,0xa5,0x08,0x00,0x00,0xa5,0x64,0x00,0x00,0xa5,0x7c,0x00,0x00,0xa5,0xe8,0x00,0x00,0xa5,0xf8,0x00,0x00,0xa6,0x10,0x00,0x00,0xa6,0xbc,0x00,0x00,0xa6,0xcc,0x00,0x00,0xa6,0xdc,0x00,0x00,0xa6,0xec, +0x00,0x00,0xa7,0x50,0x00,0x00,0xa7,0x60,0x00,0x00,0xa7,0x70,0x00,0x00,0xa7,0x80,0x00,0x00,0xa8,0x20,0x00,0x00,0xa8,0x30,0x00,0x00,0xa8,0x40,0x00,0x00,0xa8,0x90,0x00,0x00,0xa8,0xa0,0x00,0x00,0xa8,0xb0,0x00,0x00,0xa9,0x24,0x00,0x00,0xa9,0x34,0x00,0x00,0xa9,0x44,0x00,0x00,0xa9,0x54,0x00,0x00,0xa9,0xbc,0x00,0x00,0xa9,0xcc, +0x00,0x00,0xa9,0xdc,0x00,0x00,0xa9,0xec,0x00,0x00,0xa9,0xfc,0x00,0x00,0xaa,0x78,0x00,0x00,0xab,0x44,0x00,0x00,0xab,0x5c,0x00,0x00,0xab,0x74,0x00,0x00,0xab,0x8c,0x00,0x00,0xab,0xa4,0x00,0x00,0xab,0xbc,0x00,0x00,0xab,0xd4,0x00,0x00,0xab,0xec,0x00,0x00,0xac,0x04,0x00,0x00,0xac,0x1c,0x00,0x00,0xac,0xac,0x00,0x00,0xac,0xbc, +0x00,0x00,0xad,0x48,0x00,0x00,0xae,0x14,0x00,0x00,0xae,0xe8,0x00,0x00,0xaf,0x48,0x00,0x00,0xaf,0xf4,0x00,0x00,0xb0,0xc4,0x00,0x00,0xb1,0x40,0x00,0x00,0xb1,0x50,0x00,0x00,0xb1,0xec,0x00,0x00,0xb2,0x44,0x00,0x00,0xb2,0x54,0x00,0x00,0xb2,0xb0,0x00,0x00,0xb3,0x54,0x00,0x00,0xb3,0x64,0x00,0x00,0xb4,0x2c,0x00,0x00,0xb4,0x3c, +0x00,0x00,0xb4,0xd4,0x00,0x00,0xb5,0x6c,0x00,0x00,0xb5,0xf0,0x00,0x00,0xb6,0x88,0x00,0x00,0xb6,0xe8,0x00,0x00,0xb6,0xf8,0x00,0x00,0xb7,0xa8,0x00,0x00,0xb7,0xb8,0x00,0x00,0xb8,0x30,0x00,0x00,0xb8,0xe4,0x00,0x00,0xb8,0xfc,0x00,0x00,0xb9,0x14,0x00,0x00,0xb9,0x2c,0x00,0x00,0xb9,0x44,0x00,0x00,0xb9,0x5c,0x00,0x00,0xb9,0x74, +0x00,0x00,0xb9,0x8c,0x00,0x00,0xb9,0xa4,0x00,0x00,0xba,0x9c,0x00,0x00,0xbc,0x6c,0x00,0x00,0xbc,0x84,0x00,0x00,0xbd,0x10,0x00,0x00,0xbd,0x20,0x00,0x00,0xbd,0xe4,0x00,0x00,0xbd,0xf4,0x00,0x00,0xbe,0x6c,0x00,0x00,0xbf,0x20,0x00,0x00,0xbf,0x20,0x00,0x00,0xbf,0xac,0x00,0x00,0xc0,0x98,0x00,0x00,0xc1,0x48,0x00,0x00,0xc1,0xe8, +0x00,0x00,0xc2,0x58,0x00,0x00,0xc2,0xc0,0x00,0x00,0xc3,0x90,0x00,0x00,0xc4,0x18,0x00,0x00,0xc4,0x7c,0x00,0x00,0xc5,0x0c,0x00,0x00,0xc5,0xa0,0x00,0x00,0xc5,0xf4,0x00,0x00,0xc6,0x9c,0x00,0x00,0xc7,0x1c,0x00,0x00,0xc7,0xd8,0x00,0x00,0xc8,0x78,0x00,0x00,0xc9,0x50,0x00,0x00,0xca,0x20,0x00,0x00,0xcb,0x18,0x00,0x00,0xcb,0x70, +0x00,0x00,0xcb,0xf0,0x00,0x00,0xcc,0x64,0x00,0x00,0xcd,0x3c,0x00,0x00,0xcd,0xb8,0x00,0x00,0xce,0x3c,0x00,0x00,0xce,0xb8,0x00,0x00,0xd0,0x00,0x00,0x00,0xd1,0x24,0x00,0x00,0xd1,0xd0,0x00,0x00,0xd2,0xf0,0x00,0x00,0xd3,0xc4,0x00,0x00,0xd4,0x54,0x00,0x00,0xd5,0x88,0x00,0x00,0xd6,0x24,0x00,0x00,0xd7,0x24,0x00,0x00,0xd8,0x30, +0x00,0x00,0xd8,0xc4,0x00,0x00,0xd9,0x30,0x00,0x00,0xda,0x80,0x00,0x00,0xdb,0x54,0x00,0x00,0xdc,0x0c,0x00,0x00,0xdd,0x28,0x00,0x00,0xde,0x48,0x00,0x00,0xdf,0x14,0x00,0x00,0xe0,0x10,0x00,0x00,0xe0,0xac,0x00,0x00,0xe1,0x2c,0x00,0x00,0xe1,0xa0,0x00,0x00,0xe2,0x80,0x00,0x00,0xe2,0xf4,0x00,0x00,0xe3,0x84,0x00,0x00,0xe3,0xf0, +0x00,0x00,0xe4,0xa8,0x00,0x00,0xe4,0xfc,0x00,0x00,0xe5,0x80,0x00,0x00,0xe6,0x18,0x00,0x00,0xe6,0x78,0x00,0x00,0xe7,0x08,0x00,0x00,0xe7,0xac,0x00,0x00,0xe8,0x28,0x00,0x00,0xe9,0x0c,0x00,0x00,0xe9,0xac,0x00,0x00,0xea,0x50,0x00,0x00,0xea,0xe4,0x00,0x00,0xeb,0xa4,0x00,0x00,0xec,0x68,0x00,0x00,0xed,0x48,0x00,0x00,0xed,0xf8, +0x00,0x00,0xee,0x18,0x00,0x00,0xee,0x38,0x00,0x00,0xee,0x58,0x00,0x00,0xee,0x78,0x00,0x00,0xee,0x98,0x00,0x00,0xee,0xb8,0x00,0x00,0xee,0xd8,0x00,0x00,0xee,0xf8,0x00,0x00,0xef,0x18,0x00,0x00,0xef,0x38,0x00,0x00,0xef,0x58,0x00,0x00,0xef,0x78,0x00,0x00,0xef,0x98,0x00,0x00,0xef,0xb8,0x00,0x00,0xef,0xd8,0x00,0x00,0xef,0xf8, +0x00,0x00,0xf0,0x18,0x00,0x00,0xf0,0x38,0x00,0x00,0xf0,0x58,0x00,0x00,0xf0,0x78,0x00,0x00,0xf0,0x94,0x00,0x00,0xf0,0xb0,0x00,0x00,0xf0,0xcc,0x00,0x00,0xf0,0xe8,0x00,0x00,0xf1,0x04,0x00,0x00,0xf1,0x20,0x00,0x00,0xf1,0x3c,0x00,0x00,0xf1,0x58,0x00,0x00,0xf1,0x74,0x00,0x00,0xf1,0x90,0x00,0x00,0xf2,0x14,0x00,0x00,0xf2,0x68, +0x00,0x00,0xf2,0xf0,0x00,0x00,0xf3,0x84,0x00,0x00,0xf3,0xe4,0x00,0x00,0xf4,0x70,0x00,0x00,0xf5,0x04,0x00,0x00,0xf5,0x80,0x00,0x00,0xf6,0x58,0x00,0x00,0xf6,0xec,0x00,0x00,0xf7,0x0c,0x00,0x00,0xf7,0x2c,0x00,0x00,0xf7,0x4c,0x00,0x00,0xf7,0x6c,0x00,0x00,0xf7,0x8c,0x00,0x00,0xf7,0xac,0x00,0x00,0xf7,0xc8,0x00,0x00,0xf7,0xe4, +0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x88,0x00,0x00,0xf9,0x48,0x00,0x00,0xfa,0x04,0x00,0x00,0xfa,0x24,0x00,0x00,0xfa,0x44,0x00,0x00,0xfa,0x60,0x00,0x00,0xfb,0x44,0x00,0x00,0xfb,0x64,0x00,0x00,0xfb,0x80,0x00,0x00,0xfb,0x9c,0x00,0x00,0xfc,0x4c,0x00,0x00,0xfc,0x84,0x00,0x00,0xfd,0x78,0x00,0x00,0xfe,0x44,0x00,0x00,0xff,0x98, +0x00,0x00,0xff,0xb8,0x00,0x00,0xff,0xc8,0x00,0x00,0xff,0xe8,0x00,0x01,0x00,0x70,0x00,0x01,0x01,0x10,0x00,0x01,0x01,0x58,0x00,0x01,0x01,0xa8,0x00,0x01,0x02,0x24,0x00,0x01,0x02,0xb4,0x00,0x01,0x03,0x5c,0x00,0x01,0x03,0xc8,0x00,0x01,0x04,0x38,0x00,0x01,0x05,0x0c,0x00,0x01,0x05,0xe8,0x00,0x01,0x06,0x08,0x00,0x01,0x06,0x54, +0x00,0x01,0x07,0x00,0x00,0x01,0x07,0x5c,0x00,0x01,0x07,0xb4,0x00,0x01,0x07,0xfc,0x00,0x01,0x08,0x14,0x00,0x01,0x08,0xbc,0x00,0x01,0x09,0x60,0x00,0x01,0x09,0x70,0x00,0x01,0x09,0xb0,0x00,0x01,0x09,0xe4,0x00,0x01,0x0a,0x1c,0x00,0x01,0x0a,0x74,0x00,0x01,0x0a,0xf4,0x00,0x01,0x0b,0x14,0x00,0x01,0x0b,0x34,0x00,0x01,0x0b,0x78, +0x00,0x01,0x0b,0xbc,0x00,0x01,0x0c,0x6c,0x00,0x01,0x0d,0x1c,0x00,0x01,0x0d,0x68,0x00,0x01,0x0d,0xb4,0x00,0x01,0x0d,0xc4,0x00,0x01,0x0d,0xd4,0x00,0x01,0x0e,0x14,0x00,0x01,0x0e,0x58,0x00,0x01,0x0e,0x94,0x00,0x01,0x0e,0xd0,0x00,0x01,0x0f,0x14,0x00,0x01,0x0f,0x58,0x00,0x01,0x10,0x24,0x00,0x01,0x10,0x68,0x00,0x01,0x10,0xac, +0x00,0x01,0x11,0x70,0x00,0x01,0x11,0xbc,0x00,0x01,0x12,0x04,0x00,0x01,0x12,0x3c,0x00,0x01,0x12,0x4c,0x00,0x01,0x12,0x84,0x00,0x01,0x12,0xbc,0x00,0x01,0x12,0xcc,0x00,0x01,0x13,0x0c,0x00,0x01,0x13,0x7c,0x00,0x01,0x13,0x94,0x00,0x01,0x14,0x20,0x00,0x01,0x14,0x50,0x00,0x01,0x14,0xa4,0x00,0x01,0x14,0xc4,0x00,0x01,0x15,0x14, +0x00,0x01,0x15,0x94,0x00,0x01,0x15,0xfc,0x00,0x01,0x16,0x64,0x00,0x01,0x16,0xac,0x00,0x01,0x16,0xf0,0x00,0x01,0x17,0x30,0x00,0x01,0x17,0x48,0x00,0x01,0x17,0x80,0x00,0x01,0x17,0xd0,0x00,0x01,0x18,0x38,0x00,0x01,0x19,0xa4,0x00,0x01,0x1a,0x04,0x00,0x01,0x1a,0x70,0x00,0x01,0x1a,0xd8,0x00,0x01,0x1b,0x78,0x00,0x01,0x1b,0xd4, +0x00,0x01,0x1c,0x58,0x00,0x01,0x1d,0x1c,0x00,0x01,0x1d,0x34,0x00,0x01,0x1e,0xa8,0x00,0x01,0x20,0x1c,0x00,0x01,0x20,0x3c,0x00,0x01,0x21,0x00,0x00,0x01,0x21,0x18,0x00,0x01,0x21,0x7c,0x00,0x01,0x21,0xa0,0x00,0x01,0x22,0x74,0x00,0x01,0x22,0x8c,0x00,0x01,0x22,0xac,0x00,0x01,0x22,0xd0,0x00,0x01,0x22,0xe8,0x00,0x01,0x23,0x0c, +0x00,0x01,0x23,0x24,0x00,0x01,0x23,0x48,0x00,0x01,0x23,0x7c,0x00,0x01,0x23,0x94,0x00,0x01,0x25,0xa8,0x00,0x01,0x26,0x8c,0x00,0x01,0x26,0xb0,0x00,0x01,0x26,0xd4,0x00,0x01,0x26,0xec,0x00,0x01,0x27,0x10,0x00,0x01,0x27,0x28,0x00,0x01,0x27,0x48,0x00,0x01,0x27,0xc4,0x00,0x01,0x28,0x70,0x00,0x01,0x28,0x88,0x00,0x01,0x28,0xa0, +0x00,0x01,0x28,0xb8,0x00,0x01,0x28,0xd8,0x00,0x01,0x2a,0x04,0x00,0x01,0x2a,0x30,0x00,0x01,0x2a,0x48,0x00,0x01,0x2a,0x6c,0x00,0x01,0x2b,0x50,0x00,0x01,0x2c,0xe8,0x00,0x01,0x2d,0xc0,0x00,0x01,0x2f,0x0c,0x00,0x01,0x30,0x54,0x00,0x01,0x32,0x24,0x00,0x01,0x33,0x30,0x00,0x01,0x34,0xa8,0x00,0x01,0x36,0x88,0x00,0x01,0x37,0xe0, +0x00,0x01,0x38,0x98,0x00,0x01,0x39,0x88,0x00,0x01,0x39,0xac,0x00,0x01,0x39,0xe0,0x00,0x01,0x3a,0x48,0x00,0x01,0x3a,0xb0,0x00,0x01,0x3b,0x1c,0x00,0x01,0x3b,0x34,0x00,0x01,0x3b,0xb8,0x00,0x01,0x3b,0xd8,0x00,0x01,0x3c,0x28,0x00,0x01,0x3c,0x78,0x00,0x01,0x3c,0xe0,0x00,0x01,0x3d,0x18,0x00,0x01,0x3d,0xc0,0x00,0x01,0x3e,0x94, +0x00,0x01,0x3e,0xdc,0x00,0x01,0x3f,0x50,0x00,0x01,0x3f,0xb0,0x00,0x01,0x3f,0xf8,0x00,0x01,0x40,0x5c,0x00,0x01,0x40,0xbc,0x00,0x01,0x40,0xdc,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x41,0xc4,0x00,0x01,0x42,0x78, +0x00,0x01,0x43,0x68,0x00,0x01,0x44,0x40,0x00,0x01,0x45,0x5c,0x00,0x01,0x46,0x2c,0x00,0x01,0x46,0xa8,0x00,0x01,0x47,0x94,0x00,0x01,0x48,0x30,0x00,0x01,0x48,0xe8,0x00,0x01,0x49,0x68,0x00,0x01,0x4a,0x00,0x00,0x01,0x4a,0xa8,0x00,0x01,0x4b,0x68,0x00,0x01,0x4c,0x48,0x00,0x01,0x4c,0xf0,0x00,0x01,0x4d,0x8c,0x00,0x01,0x4d,0xd4, +0x00,0x01,0x4d,0xf0,0x00,0x01,0x4e,0xa8,0x00,0x01,0x4f,0x74,0x00,0x01,0x50,0x7c,0x00,0x01,0x50,0xd4,0x00,0x01,0x51,0x08,0x00,0x01,0x51,0x64,0x00,0x01,0x51,0x98,0x00,0x01,0x51,0xc8,0x00,0x01,0x51,0xd8,0x00,0x01,0x52,0x34,0x00,0x01,0x52,0xa0,0x00,0x01,0x53,0x5c,0x00,0x01,0x54,0x08,0x00,0x01,0x54,0x94,0x00,0x01,0x55,0x10, +0x00,0x01,0x55,0xbc,0x00,0x01,0x55,0xec,0x00,0x01,0x56,0x44,0x00,0x01,0x56,0xb8,0x00,0x01,0x57,0x5c,0x00,0x01,0x57,0xf8,0x00,0x01,0x58,0x58,0x00,0x01,0x58,0xc0,0x00,0x01,0x59,0xb8,0x00,0x01,0x5a,0x50,0x00,0x01,0x5a,0xa0,0x00,0x01,0x5b,0x2c,0x00,0x01,0x5b,0x7c,0x00,0x01,0x5b,0xf8,0x00,0x01,0x5c,0x48,0x00,0x01,0x5c,0x90, +0x00,0x01,0x5c,0xc4,0x00,0x01,0x5d,0x08,0x00,0x01,0x5d,0x4c,0x00,0x01,0x5e,0x04,0x00,0x01,0x5e,0xa4,0x00,0x01,0x5f,0x04,0x00,0x01,0x5f,0x68,0x00,0x01,0x5f,0xd0,0x00,0x01,0x60,0x60,0x00,0x01,0x61,0x00,0x00,0x01,0x61,0xc4,0x00,0x01,0x62,0x0c,0x00,0x01,0x62,0x58,0x00,0x01,0x62,0xdc,0x00,0x01,0x63,0x40,0x00,0x01,0x63,0xa0, +0x00,0x01,0x64,0xe8,0x00,0x01,0x66,0x2c,0x00,0x01,0x67,0x3c,0x00,0x01,0x67,0xc0,0x00,0x01,0x68,0x30,0x00,0x01,0x69,0xc0,0x00,0x01,0x6a,0xd4,0x00,0x01,0x6b,0xe4,0x00,0x01,0x6c,0xb0,0x00,0x01,0x6d,0x2c,0x00,0x01,0x6e,0x08,0x00,0x01,0x6f,0x24,0x00,0x01,0x6f,0xa8,0x00,0x01,0x70,0x84,0x00,0x01,0x71,0xa8,0x00,0x01,0x72,0x50, +0x00,0x01,0x72,0xfc,0x00,0x01,0x73,0x74,0x00,0x01,0x73,0x84,0x00,0x01,0x73,0xbc,0x00,0x01,0x74,0x58,0x00,0x01,0x74,0xb0,0x00,0x01,0x75,0x2c,0x00,0x01,0x75,0x68,0x00,0x01,0x75,0xa8,0x00,0x01,0x76,0x14,0x00,0x01,0x76,0x84,0x00,0x01,0x77,0x08,0x00,0x01,0x77,0x34,0x00,0x01,0x77,0x98,0x00,0x01,0x78,0x50,0x00,0x01,0x78,0xb0, +0x00,0x01,0x79,0x9c,0x00,0x01,0x7a,0x78,0x00,0x01,0x7a,0xd0,0x00,0x01,0x7b,0x28,0x00,0x01,0x7b,0x8c,0x00,0x01,0x7b,0xec,0x00,0x01,0x7c,0x50,0x00,0x01,0x7c,0x60,0x00,0x01,0x7c,0xb8,0x00,0x01,0x7d,0x28,0x00,0x01,0x7d,0x94,0x00,0x01,0x7e,0x48,0x00,0x01,0x7e,0x58,0x00,0x01,0x7e,0xa0,0x00,0x01,0x7e,0xd4,0x00,0x01,0x7f,0x10, +0x00,0x01,0x7f,0x54,0x00,0x01,0x7f,0x64,0x00,0x01,0x7f,0xa0,0x00,0x01,0x7f,0xdc,0x00,0x01,0x81,0x28,0x00,0x01,0x82,0xd8,0x00,0x01,0x83,0x30,0x00,0x01,0x83,0x88,0x00,0x01,0x83,0xfc,0x00,0x01,0x84,0x94,0x00,0x01,0x85,0x68,0x00,0x01,0x86,0x88,0x00,0x01,0x86,0x98,0x00,0x01,0x87,0x28,0x00,0x01,0x87,0xb4,0x00,0x01,0x88,0x94, +0x00,0x01,0x88,0xe4,0x00,0x01,0x89,0x58,0x00,0x01,0x89,0xa0,0x00,0x01,0x89,0xe4,0x00,0x01,0x89,0xf4,0x00,0x01,0x8a,0x30,0x00,0x01,0x8a,0x6c,0x00,0x01,0x8a,0xb8,0x00,0x01,0x8b,0x70,0x00,0x01,0x8b,0xec,0x00,0x01,0x8b,0xfc,0x00,0x01,0x8c,0x48,0x00,0x01,0x8c,0x90,0x00,0x01,0x8d,0x14,0x00,0x01,0x8d,0x84,0x00,0x01,0x8e,0x00, +0x00,0x01,0x8e,0x98,0x00,0x01,0x8e,0xe4,0x00,0x01,0x8f,0x50,0x00,0x01,0x8f,0x98,0x00,0x01,0x90,0x04,0x00,0x01,0x90,0x48,0x00,0x01,0x90,0xdc,0x00,0x01,0x91,0x4c,0x00,0x01,0x91,0xc0,0x00,0x01,0x92,0x48,0x00,0x01,0x92,0xcc,0x00,0x01,0x93,0x38,0x00,0x01,0x93,0x80,0x00,0x01,0x93,0xc8,0x00,0x01,0x94,0xb8,0x00,0x01,0x95,0x60, +0x00,0x01,0x97,0x44,0x00,0x01,0x97,0xb8,0x00,0x01,0x98,0x68,0x00,0x01,0x98,0xac,0x00,0x01,0x99,0x2c,0x00,0x01,0x9a,0x64,0x00,0x01,0x9b,0x18,0x00,0x01,0x9b,0xec,0x00,0x01,0x9c,0xa0,0x00,0x01,0x9d,0x54,0x00,0x01,0x9e,0x3c,0x00,0x01,0x9f,0x00,0x00,0x01,0x9f,0xd0,0x00,0x01,0xa0,0x24,0x00,0x01,0xa0,0x88,0x00,0x01,0xa0,0xf4, +0x00,0x01,0xa1,0x54,0x00,0x01,0xa1,0xa8,0x00,0x01,0xa2,0x10,0x00,0x01,0xa2,0x74,0x00,0x01,0xa2,0xd4,0x00,0x01,0xa3,0x60,0x00,0x01,0xa3,0xc4,0x00,0x01,0xa4,0xa0,0x00,0x01,0xa5,0x8c,0x00,0x01,0xa6,0x34,0x00,0x01,0xa6,0xd4,0x00,0x01,0xa7,0x6c,0x00,0x01,0xa8,0x00,0x00,0x01,0xa8,0x64,0x00,0x01,0xa8,0xf8,0x00,0x01,0xa9,0x58, +0x00,0x01,0xa9,0xd0,0x00,0x01,0xaa,0x6c,0x00,0x01,0xab,0x00,0x00,0x01,0xab,0x38,0x00,0x01,0xab,0xf0,0x00,0x01,0xac,0x48,0x00,0x01,0xac,0xec,0x00,0x01,0xad,0x38,0x00,0x01,0xad,0xd4,0x00,0x01,0xae,0x98,0x00,0x01,0xaf,0x54,0x00,0x01,0xaf,0xd0,0x00,0x01,0xb0,0x48,0x00,0x01,0xb0,0x70,0x00,0x01,0xb0,0xe8,0x00,0x01,0xb1,0x64, +0x00,0x01,0xb2,0x18,0x00,0x01,0xb2,0x60,0x00,0x01,0xb2,0xa8,0x00,0x01,0xb3,0x30,0x00,0x01,0xb3,0xb8,0x00,0x01,0xb4,0x7c,0x00,0x01,0xb4,0xb4,0x00,0x01,0xb4,0xe8,0x00,0x01,0xb5,0x1c,0x00,0x01,0xb5,0x50,0x00,0x01,0xb5,0x84,0x00,0x01,0xb5,0xb8,0x00,0x01,0xb5,0xec,0x00,0x01,0xb6,0x20,0x00,0x01,0xb6,0x54,0x00,0x01,0xb6,0x8c, +0x00,0x01,0xb6,0xbc,0x00,0x01,0xb6,0xec,0x00,0x01,0xb7,0x1c,0x00,0x01,0xb7,0x50,0x00,0x01,0xb7,0x84,0x00,0x01,0xb7,0xb8,0x00,0x01,0xb7,0xec,0x00,0x01,0xb8,0x20,0x00,0x01,0xb8,0x54,0x00,0x01,0xb8,0x88,0x00,0x01,0xb8,0xbc,0x00,0x01,0xb8,0xf0,0x00,0x01,0xb9,0x30,0x00,0x01,0xb9,0x84,0x00,0x01,0xb9,0xc4,0x00,0x01,0xba,0x04, +0x00,0x01,0xba,0x38,0x00,0x01,0xba,0x90,0x00,0x01,0xba,0xd0,0x00,0x01,0xbd,0x1c,0x00,0x01,0xc1,0xbc,0x00,0x01,0xc4,0x08,0x00,0x01,0xc4,0x58,0x00,0x01,0xc4,0xec,0x00,0x01,0xc5,0x80,0x00,0x01,0xc6,0x1c,0x00,0x01,0xc6,0x98,0x00,0x01,0xc7,0x4c,0x00,0x01,0xc8,0x80,0x00,0x01,0xc9,0x58,0x00,0x01,0xca,0x64,0x00,0x01,0xca,0xe0, +0x00,0x01,0xcb,0x08,0x00,0x01,0xcb,0x40,0x00,0x01,0xcb,0x88,0x00,0x01,0xcc,0x10,0x00,0x01,0xcc,0x40,0x00,0x01,0xcc,0x94,0x00,0x01,0xcc,0xc8,0x00,0x01,0xcd,0x18,0x00,0x01,0xcd,0x6c,0x00,0x01,0xcd,0xc0,0x00,0x01,0xce,0x10,0x00,0x01,0xce,0x64,0x00,0x01,0xce,0xc8,0x00,0x01,0xce,0xf8,0x00,0x01,0xcf,0x18,0x00,0x01,0xcf,0x3c, +0x00,0x01,0xcf,0x60,0x00,0x01,0xcf,0xac,0x00,0x01,0xcf,0xdc,0x00,0x01,0xd0,0x1c,0x00,0x01,0xd0,0x50,0x00,0x01,0xd0,0x70,0x00,0x01,0xd0,0x90,0x00,0x01,0xd0,0xc0,0x00,0x01,0xd0,0xec,0x00,0x01,0xd1,0x1c,0x00,0x01,0xd1,0x3c,0x00,0x01,0xd1,0x64,0x00,0x01,0xd1,0x84,0x00,0x01,0xd1,0xcc,0x00,0x01,0xd1,0xf8,0x00,0x01,0xd2,0x34, +0x00,0x01,0xd2,0x60,0x00,0x01,0xd2,0xe4,0x00,0x01,0xd3,0x50,0x00,0x01,0xd3,0xbc,0x00,0x01,0xd4,0x14,0x00,0x01,0xd4,0x94,0x00,0x01,0xd4,0xfc,0x00,0x01,0xd5,0x64,0x00,0x01,0xd5,0xb0,0x00,0x01,0xd6,0x60,0x00,0x01,0xd6,0xec,0x00,0x01,0xd7,0x74,0x00,0x01,0xd7,0xcc,0x00,0x01,0xd8,0x20,0x00,0x01,0xd8,0x74,0x00,0x01,0xd8,0xc0, +0x00,0x01,0xd9,0x04,0x00,0x01,0xd9,0x5c,0x00,0x01,0xd9,0xa0,0x00,0x01,0xd9,0xf8,0x00,0x01,0xda,0x58,0x00,0x01,0xda,0xa4,0x00,0x01,0xda,0xe8,0x00,0x01,0xdb,0x40,0x00,0x01,0xdb,0x84,0x00,0x01,0xdb,0xdc,0x00,0x01,0xdc,0x3c,0x00,0x01,0xdc,0xa8,0x00,0x01,0xdd,0x00,0x00,0x01,0xdd,0x58,0x00,0x01,0xdd,0xa8,0x00,0x01,0xdd,0xfc, +0x00,0x01,0xde,0x30,0x00,0x01,0xde,0x7c,0x00,0x01,0xde,0xc0,0x00,0x01,0xdf,0x04,0x00,0x01,0xdf,0x3c,0x00,0x01,0xdf,0x74,0x00,0x01,0xdf,0xc0,0x00,0x01,0xe0,0x3c,0x00,0x01,0xe0,0xcc,0x00,0x01,0xe1,0x04,0x00,0x01,0xe1,0x68,0x00,0x01,0xe1,0xdc,0x00,0x01,0xe2,0x10,0x00,0x01,0xe2,0x5c,0x00,0x01,0xe2,0xa0,0x00,0x01,0xe2,0xe4, +0x00,0x01,0xe3,0x28,0x00,0x01,0xe3,0x5c,0x00,0x01,0xe3,0xb8,0x00,0x01,0xe4,0x08,0x00,0x01,0xe4,0x58,0x00,0x01,0xe4,0xc0,0x00,0x01,0xe5,0x18,0x00,0x01,0xe5,0x70,0x00,0x01,0xe5,0xd4,0x00,0x01,0xe6,0x2c,0x00,0x01,0xe6,0x80,0x00,0x01,0xe6,0xe0,0x00,0x01,0xe7,0x48,0x00,0x01,0xe7,0xa0,0x00,0x01,0xe7,0xf8,0x00,0x01,0xe8,0x50, +0x00,0x01,0xe8,0xac,0x00,0x01,0xe9,0x18,0x00,0x01,0xe9,0x58,0x00,0x01,0xe9,0x98,0x00,0x01,0xe9,0xe8,0x00,0x01,0xea,0x3c,0x00,0x01,0xea,0x70,0x00,0x01,0xea,0xbc,0x00,0x01,0xeb,0x00,0x00,0x01,0xeb,0x44,0x00,0x01,0xeb,0x7c,0x00,0x01,0xeb,0xb4,0x00,0x01,0xec,0x00,0x00,0x01,0xec,0x7c,0x00,0x01,0xed,0x0c,0x00,0x01,0xed,0x44, +0x00,0x01,0xed,0xa8,0x00,0x01,0xee,0x1c,0x00,0x01,0xee,0x50,0x00,0x01,0xee,0x94,0x00,0x01,0xee,0xe0,0x00,0x01,0xef,0x24,0x00,0x01,0xef,0x68,0x00,0x01,0xef,0x9c,0x00,0x01,0xef,0xfc,0x00,0x01,0xf0,0x4c,0x00,0x01,0xf0,0x9c,0x00,0x01,0xf1,0x04,0x00,0x01,0xf1,0x5c,0x00,0x01,0xf1,0xb4,0x00,0x01,0xf2,0x18,0x00,0x01,0xf2,0x70, +0x00,0x01,0xf2,0xc4,0x00,0x01,0xf3,0x24,0x00,0x01,0xf3,0x8c,0x00,0x01,0xf3,0xe4,0x00,0x01,0xf4,0x38,0x00,0x01,0xf4,0x8c,0x00,0x01,0xf4,0xec,0x00,0x01,0xf5,0x38,0x00,0x01,0xf5,0x90,0x00,0x01,0xf5,0xd4,0x00,0x01,0xf6,0x2c,0x00,0x01,0xf6,0x70,0x00,0x01,0xf6,0xd0,0x00,0x01,0xf7,0x1c,0x00,0x01,0xf7,0x74,0x00,0x01,0xf7,0xb8, +0x00,0x01,0xf8,0x10,0x00,0x01,0xf8,0x54,0x00,0x01,0xf8,0xbc,0x00,0x01,0xf9,0x14,0x00,0x01,0xf9,0x6c,0x00,0x01,0xf9,0xe4,0x00,0x01,0xfa,0x48,0x00,0x01,0xfa,0xb0,0x00,0x01,0xfb,0x0c,0x00,0x01,0xfb,0x5c,0x00,0x01,0xfb,0xac,0x00,0x01,0xfc,0x0c,0x00,0x01,0xfc,0x5c,0x00,0x01,0xfc,0xac,0x00,0x01,0xfd,0x30,0x00,0x01,0xfd,0x94, +0x00,0x01,0xfd,0xf8,0x00,0x01,0xfe,0x54,0x00,0x01,0xff,0x0c,0x00,0x01,0xff,0xe0,0x00,0x02,0x00,0x40,0x00,0x02,0x00,0x58,0x00,0x02,0x01,0x48,0x00,0x02,0x02,0x3c,0x00,0x02,0x03,0x08,0x00,0x02,0x03,0xac,0x00,0x02,0x04,0x60,0x00,0x02,0x04,0xc0,0x00,0x02,0x05,0x7c,0x00,0x02,0x06,0x04,0x00,0x02,0x06,0x88,0x00,0x02,0x07,0x0c, +0x00,0x02,0x08,0x20,0x00,0x02,0x08,0x84,0x00,0x02,0x08,0x9c,0x00,0x02,0x09,0x14,0x00,0x02,0x09,0xd8,0x00,0x02,0x0a,0x3c,0x00,0x02,0x0a,0x98,0x00,0x02,0x0b,0x84,0x00,0x02,0x0b,0x9c,0x00,0x02,0x0b,0xac,0x00,0x02,0x0c,0x28,0x00,0x02,0x0d,0x00,0x00,0x02,0x0d,0x9c,0x00,0x02,0x0e,0x3c,0x00,0x02,0x0e,0xa8,0x00,0x02,0x0f,0x58, +0x00,0x02,0x10,0x24,0x00,0x02,0x10,0x78,0x00,0x02,0x10,0xe0,0x00,0x02,0x11,0xb0,0x00,0x02,0x12,0x64,0x00,0x02,0x13,0x10,0x00,0x02,0x13,0xc0,0x00,0x02,0x14,0x44,0x00,0x02,0x15,0x1c,0x00,0x02,0x15,0xc8,0x00,0x02,0x16,0x58,0x00,0x02,0x16,0xe8,0x00,0x02,0x17,0x80,0x00,0x02,0x17,0xa0,0x00,0x02,0x18,0x60,0x00,0x02,0x18,0xf4, +0x00,0x02,0x19,0xc4,0x00,0x02,0x1a,0xec,0x00,0x02,0x1b,0xac,0x00,0x02,0x1c,0x20,0x00,0x02,0x1c,0xd0,0x00,0x02,0x1d,0x6c,0x00,0x02,0x1d,0xf0,0x00,0x02,0x1e,0x54,0x00,0x02,0x1e,0xf0,0x00,0x02,0x1f,0x60,0x00,0x02,0x1f,0xf8,0x00,0x02,0x20,0x58,0x00,0x02,0x20,0xa8,0x00,0x02,0x21,0x54,0x00,0x02,0x22,0x4c,0x00,0x02,0x22,0x70, +0x00,0x02,0x22,0x88,0x00,0x02,0x23,0x4c,0x00,0x02,0x23,0xf4,0x00,0x02,0x24,0xbc,0x00,0x02,0x25,0x14,0x00,0x02,0x25,0x74,0x00,0x02,0x26,0x54,0x00,0x02,0x27,0x44,0x00,0x02,0x27,0xdc,0x00,0x02,0x28,0x20,0x00,0x02,0x28,0x4c,0x00,0x02,0x28,0x84,0x00,0x02,0x28,0xbc,0x00,0x02,0x28,0xf4,0x00,0x02,0x29,0xbc,0x00,0x02,0x2a,0xfc, +0x00,0x02,0x2b,0xdc,0x00,0x02,0x2d,0x04,0x00,0x02,0x2d,0x64,0x00,0x02,0x2e,0x78,0x00,0x02,0x2f,0x90,0x00,0x02,0x30,0x98,0x00,0x02,0x31,0x60,0x00,0x02,0x31,0xe8,0x00,0x02,0x32,0x08,0x00,0x02,0x32,0x38,0x00,0x02,0x32,0x68,0x00,0x02,0x32,0xc0,0x00,0x02,0x33,0x18,0x00,0x02,0x33,0xc8,0x00,0x02,0x34,0x40,0x00,0x02,0x35,0x5c, +0x00,0x02,0x36,0x18,0x00,0x02,0x36,0xe0,0x00,0x02,0x37,0x4c,0x00,0x02,0x37,0xfc,0x00,0x02,0x38,0xe4,0x00,0x02,0x39,0xe4,0x00,0x02,0x3a,0x20,0x00,0x02,0x3a,0x5c,0x00,0x02,0x3a,0xa0,0x00,0x02,0x3a,0xdc,0x00,0x02,0x3b,0x20,0x00,0x02,0x3b,0xd8,0x00,0x02,0x3c,0x74,0x00,0x02,0x3d,0x30,0x00,0x02,0x3d,0xe0,0x00,0x02,0x3f,0x0c, +0x00,0x02,0x3f,0xe8,0x00,0x02,0x40,0xc4,0x00,0x02,0x41,0x98,0x00,0x02,0x42,0x64,0x00,0x02,0x42,0xf4,0x00,0x02,0x43,0xd4,0x00,0x02,0x45,0x18,0x00,0x02,0x45,0xf4,0x00,0x02,0x46,0xf0,0x00,0x02,0x47,0x88,0x00,0x02,0x48,0xc0,0x00,0x02,0x49,0x50,0x00,0x02,0x4a,0x34,0x00,0x02,0x4a,0x8c,0x00,0x02,0x4b,0x3c,0x00,0x02,0x4b,0xbc, +0x00,0x02,0x4c,0x3c,0x00,0x02,0x4d,0x3c,0x00,0x02,0x4d,0xa0,0x00,0x02,0x4e,0x20,0x00,0x02,0x4e,0xa4,0x00,0x02,0x50,0x10,0x00,0x02,0x50,0xa8,0x00,0x02,0x51,0x28,0x00,0x02,0x51,0xe0,0x00,0x02,0x52,0x74,0x00,0x02,0x53,0x28,0x00,0x02,0x54,0x00,0x00,0x02,0x54,0xd8,0x00,0x02,0x55,0x74,0x00,0x02,0x55,0xc0,0x00,0x02,0x56,0x28, +0x00,0x02,0x56,0x90,0x00,0x02,0x57,0xb8,0x00,0x02,0x58,0xa8,0x00,0x02,0x59,0xa8,0x00,0x02,0x5a,0xd4,0x00,0x02,0x5b,0xe8,0x00,0x02,0x5c,0xec,0x00,0x02,0x5e,0x14,0x00,0x02,0x5f,0x54,0x00,0x02,0x60,0x64,0x00,0x02,0x61,0x00,0x00,0x02,0x61,0x84,0x00,0x02,0x62,0x88,0x00,0x02,0x63,0x10,0x00,0x02,0x63,0xbc,0x00,0x02,0x63,0xd0, +0x00,0x02,0x64,0x88,0x00,0x02,0x65,0x70,0x00,0x02,0x66,0x5c,0x00,0x02,0x67,0x68,0x00,0x02,0x68,0x80,0x00,0x02,0x6a,0x00,0x00,0x02,0x6a,0xc8,0x00,0x02,0x6b,0xcc,0x00,0x02,0x6d,0x9c,0x00,0x02,0x70,0x14,0x00,0x02,0x71,0x70,0x00,0x02,0x71,0xdc,0x00,0x02,0x72,0x54,0x00,0x02,0x73,0x14,0x00,0x02,0x73,0x78,0x00,0x02,0x73,0x90, +0x00,0x02,0x74,0x18,0x00,0x02,0x74,0x78,0x00,0x02,0x75,0x34,0x00,0x02,0x75,0xd8,0x00,0x02,0x76,0x78,0x00,0x02,0x77,0x00,0x00,0x02,0x77,0x98,0x00,0x02,0x78,0x1c,0x00,0x02,0x79,0x14,0x00,0x02,0x79,0xa8,0x00,0x02,0x7a,0x60,0x00,0x02,0x7a,0xf0,0x00,0x02,0x7b,0xcc,0x00,0x02,0x7c,0xe4,0x00,0x02,0x7d,0xbc,0x00,0x02,0x7e,0x14, +0x00,0x02,0x7e,0x88,0x00,0x02,0x7f,0x40,0x00,0x02,0x7f,0xf8,0x00,0x02,0x80,0xb0,0x00,0x02,0x81,0x4c,0x00,0x02,0x81,0xc8,0x00,0x02,0x82,0x30,0x00,0x02,0x82,0xc0,0x00,0x02,0x82,0xe4,0x00,0x02,0x83,0x08,0x00,0x02,0x83,0x58,0x00,0x02,0x83,0xfc,0x00,0x02,0x84,0x20,0x00,0x02,0x84,0xa0,0x00,0x02,0x85,0x38,0x00,0x02,0x85,0x58, +0x00,0x02,0x85,0xc4,0x00,0x02,0x86,0x30,0x00,0x02,0x86,0x98,0x00,0x02,0x87,0x08,0x00,0x02,0x87,0x78,0x00,0x02,0x87,0x9c,0x00,0x02,0x87,0xc8,0x00,0x02,0x88,0xa4,0x00,0x02,0x88,0xbc,0x00,0x02,0x88,0xdc,0x00,0x02,0x89,0x60,0x00,0x02,0x8a,0x00,0x00,0x02,0x8a,0xbc,0x00,0x02,0x8b,0x60,0x00,0x02,0x8c,0x68,0x00,0x02,0x8d,0x94, +0x00,0x02,0x8e,0x9c,0x00,0x02,0x8f,0x30,0x00,0x02,0x8f,0xf4,0x00,0x02,0x90,0x44,0x00,0x02,0x90,0xc8,0x00,0x02,0x91,0x6c,0x00,0x02,0x92,0x34,0x00,0x02,0x92,0xfc,0x00,0x02,0x93,0x8c,0x00,0x02,0x93,0xe4,0x00,0x02,0x93,0xfc,0x00,0x02,0x94,0x7c,0x00,0x02,0x95,0x14,0x00,0x02,0x95,0x34,0x00,0x02,0x96,0xb8,0x00,0x02,0x98,0x00, +0x00,0x02,0x99,0x80,0x00,0x02,0x9b,0x3c,0x00,0x02,0x9b,0xa8,0x00,0x02,0x9c,0x44,0x00,0x02,0x9d,0x0c,0x00,0x02,0x9e,0xb0,0x00,0x02,0x9f,0xf4,0x00,0x02,0xa0,0xfc,0x00,0x02,0xa2,0xec,0x00,0x02,0xa3,0x74,0x00,0x02,0xa3,0xf8,0x00,0x02,0xa4,0xa8,0x00,0x02,0xa5,0x20,0x00,0x02,0xa5,0xc0,0x00,0x02,0xa5,0xf8,0x00,0x02,0xa6,0x08, +0x00,0x02,0xa6,0x44,0x00,0x02,0xa6,0x9c,0x00,0x02,0xa6,0xb0,0x00,0x02,0xa6,0xec,0x00,0x02,0xa7,0x6c,0x00,0x02,0xa7,0xc0,0x00,0x02,0xa7,0xfc,0x00,0x02,0xa8,0x38,0x00,0x02,0xa8,0x94,0x00,0x02,0xa8,0xc8,0x00,0x02,0xa9,0x14,0x00,0x02,0xa9,0x60,0x00,0x02,0xa9,0xc4,0x00,0x02,0xaa,0x4c,0x00,0x02,0xab,0x04,0x00,0x02,0xab,0x44, +0x00,0x02,0xab,0xc8,0x00,0x02,0xac,0x14,0x00,0x02,0xac,0x50,0x00,0x02,0xac,0xc8,0x00,0x02,0xad,0x1c,0x00,0x02,0xad,0xa0,0x00,0x02,0xad,0xdc,0x00,0x02,0xae,0x50,0x00,0x02,0xae,0xb8,0x00,0x02,0xae,0xf8,0x00,0x02,0xaf,0x38,0x00,0x02,0xaf,0x78,0x00,0x02,0xaf,0x8c,0x00,0x02,0xaf,0xa0,0x00,0x02,0xaf,0xb4,0x00,0x02,0xaf,0xc8, +0x00,0x02,0xaf,0xdc,0x00,0x02,0xaf,0xf0,0x00,0x02,0xb0,0x04,0x00,0x02,0xb0,0x18,0x00,0x02,0xb0,0x2c,0x00,0x02,0xb0,0x40,0x00,0x02,0xb0,0x54,0x00,0x02,0xb0,0x68,0x00,0x02,0xb0,0x7c,0x00,0x02,0xb0,0x8c,0x00,0x02,0xb1,0x04,0x00,0x02,0xb1,0x50,0x00,0x02,0xb1,0x84,0x00,0x02,0xb1,0xb8,0x00,0x02,0xb2,0x0c,0x00,0x02,0xb2,0x50, +0x00,0x02,0xb2,0x94,0x00,0x02,0xb2,0xf0,0x00,0x02,0xb3,0x70,0x00,0x02,0xb4,0x20,0x00,0x02,0xb4,0x58,0x00,0x02,0xb4,0xd4,0x00,0x02,0xb5,0x18,0x00,0x02,0xb5,0x70,0x00,0x02,0xb5,0xac,0x00,0x02,0xb6,0x14,0x00,0x02,0xb6,0x60,0x00,0x02,0xb6,0xd4,0x00,0x02,0xb7,0x08,0x00,0x02,0xb7,0x94,0x00,0x02,0xb8,0x10,0x00,0x02,0xb8,0x6c, +0x00,0x02,0xb8,0xa4,0x00,0x02,0xb8,0xb8,0x00,0x02,0xb8,0xcc,0x00,0x02,0xb8,0xe0,0x00,0x02,0xb8,0xf4,0x00,0x02,0xb9,0x08,0x00,0x02,0xb9,0x1c,0x00,0x02,0xb9,0x30,0x00,0x02,0xb9,0x44,0x00,0x02,0xb9,0x58,0x00,0x02,0xb9,0x6c,0x00,0x02,0xb9,0x80,0x00,0x02,0xb9,0xbc,0x00,0x02,0xb9,0xf0,0x00,0x02,0xba,0xc0,0x00,0x02,0xbb,0x1c, +0x00,0x02,0xbb,0x98,0x00,0x02,0xbc,0x14,0x00,0x02,0xbc,0xe8,0x00,0x02,0xbd,0xec,0x00,0x02,0xbe,0x50,0x00,0x02,0xbe,0xc0,0x00,0x02,0xbf,0x80,0x00,0x02,0xc0,0x74,0x00,0x02,0xc0,0xf4,0x00,0x02,0xc1,0x74,0x00,0x02,0xc2,0x4c,0x00,0x02,0xc3,0x18,0x00,0x02,0xc3,0x7c,0x00,0x02,0xc3,0xec,0x00,0x02,0xc4,0xac,0x00,0x02,0xc5,0x68, +0x00,0x02,0xc5,0xec,0x00,0x02,0xc6,0x9c,0x00,0x02,0xc7,0x70,0x00,0x02,0xc7,0xa8,0x00,0x02,0xc7,0xf0,0x00,0x02,0xc8,0x30,0x00,0x02,0xc8,0x78,0x00,0x02,0xc9,0x24,0x00,0x02,0xc9,0x3c,0x00,0x02,0xc9,0x3c,0x00,0x02,0xc9,0x3c,0x00,0x03,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x31,0x40,0x2e, +0x09,0x04,0x02,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x33,0x11,0x21,0x11,0x25,0x01,0x21,0x13,0x21,0x11,0x5a,0x01,0xa4,0xfe,0x8e,0x01,0x2c, +0xfe,0xd4,0x14,0x01,0x2c,0x02,0xda,0xfd,0x26,0x6d,0x02,0x3b,0xfd,0x8a,0x02,0x3b,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x2c,0x40,0x29,0x0d,0x01,0x04,0x00,0x01,0x4c,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x68,0x00,0x00,0x00,0x38,0x4d,0x05,0x03,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x09, +0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x06,0x09,0x19,0x2b,0x33,0x13,0x33,0x13,0x23,0x27,0x23,0x07,0x13,0x33,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x32,0xbe,0x79,0xbd,0x5b,0x30,0xdd,0x30,0x42,0xb8,0x38,0x10,0x12,0x02,0x02,0x12,0x10,0x02,0xda,0xfd,0x26,0xc2,0xc2,0x01,0x0e,0xe1,0x40,0x56,0x0d,0x0d,0x56,0x3f,0x00,0x00,0x00, +0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x00,0x27,0x06,0xbc,0x02,0x58, +0x00,0x00,0x02,0x06,0x00,0x01,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26,0x03,0xb6,0x00,0x27,0x06,0x95,0x02,0x58,0x00,0x00,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbd,0x02,0x58,0x00,0x00, +0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbe,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbf,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00, +0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x67,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26, +0x03,0xb6,0x00,0x27,0x06,0x93,0x02,0x58,0x00,0x00,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc1,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00, +0x00,0x07,0x06,0xc2,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb1,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26, +0x02,0xda,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xd4,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00, +0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0x93,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x32,0xff,0x35,0x02,0x49,0x02,0xda,0x00,0x16,0x00,0x1f,0x00,0x65,0x40,0x0a,0x1c,0x01,0x06,0x00,0x13,0x01,0x01,0x04,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1f,0x00,0x06,0x00,0x04,0x01, +0x06,0x04,0x68,0x00,0x00,0x00,0x38,0x4d,0x07,0x05,0x02,0x01,0x01,0x39,0x4d,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x1c,0x00,0x06,0x00,0x04,0x01,0x06,0x04,0x68,0x00,0x02,0x00,0x03,0x02,0x03,0x63,0x00,0x00,0x00,0x38,0x4d,0x07,0x05,0x02,0x01,0x01,0x39,0x01,0x4e,0x59,0x40,0x10,0x00,0x00,0x18,0x17, +0x00,0x16,0x00,0x16,0x16,0x21,0x25,0x11,0x11,0x08,0x09,0x1b,0x2b,0x33,0x13,0x33,0x13,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x27,0x23,0x07,0x13,0x33,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x32,0xbe,0x79,0xbd,0x11,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x21,0x29,0x30,0xdd,0x30,0x42, +0xb8,0x38,0x10,0x12,0x02,0x02,0x12,0x10,0x02,0xda,0xfd,0x26,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1b,0x36,0x1f,0xc0,0xc2,0x01,0x0e,0xe1,0x40,0x56,0x0d,0x0d,0x56,0x3f,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xe2,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x96,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32, +0x00,0x00,0x02,0x26,0x03,0xb1,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0f,0x00,0x13,0x00,0x3f,0x40,0x3c,0x00,0x02,0x00,0x03,0x08,0x02,0x03,0x67,0x00,0x08,0x00,0x06,0x04,0x08,0x06,0x67,0x09,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38, +0x4d,0x00,0x04,0x04,0x05,0x5f,0x0a,0x07,0x02,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x13,0x12,0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1d,0x2b,0x33,0x13,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x21,0x35,0x23,0x07,0x13,0x33,0x11,0x23,0x1e,0x91,0x01,0x8b,0xb6,0x9d,0x9d,0xb6,0xfe, +0xf4,0x8d,0x28,0x36,0x7f,0x38,0x02,0xda,0x52,0xe4,0x52,0xff,0x00,0x52,0xcb,0xcb,0x01,0x16,0x01,0x72,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x3a,0x03,0xb6,0x02,0x26,0x00,0x18,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0x00,0x03,0x00,0x5d,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x10,0x00,0x19,0x00,0x22,0x00,0x39,0x40,0x36, +0x08,0x01,0x05,0x02,0x01,0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x01,0x5f,0x06,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x22,0x20,0x1c,0x1a,0x19,0x17,0x13,0x11,0x00,0x10,0x00,0x0f,0x21,0x07,0x09,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07, +0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5d,0xcf,0x64,0x71,0x47,0x39,0x2b,0x41,0x25,0x73,0x64,0x86,0x76,0x3a,0x43,0x42,0x3a,0x77,0x7c,0x3f,0x49,0x49,0x3f,0x7c,0x02,0xda,0x64,0x59,0x38,0x5a,0x0b,0x03,0x05,0x32,0x4d,0x2e,0x5e,0x6d,0x01, +0xa3,0x3e,0x35,0x35,0x3e,0xfd,0xc8,0x43,0x3a,0x3c,0x4b,0x00,0x00,0x01,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x1b,0x00,0x3b,0x40,0x38,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00, +0x4e,0x01,0x00,0x19,0x18,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b, +0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26, +0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x5d,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x35,0x02,0x0a,0x02,0xe4,0x00,0x2f,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x05,0x28,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00, +0x07,0x01,0x72,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09, +0x01,0x08,0x00,0x08,0x63,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x2f,0x00,0x2e,0x12,0x12,0x25,0x22,0x12,0x27,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x34,0x36,0x33, +0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd2,0x46,0x16,0x1b,0x37,0x32,0x18,0x49,0x53,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x62,0x03,0x01,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb, +0x37,0x17,0x0d,0x11,0x1a,0x41,0x10,0x6a,0x52,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x43,0x3e,0x61,0x71,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x5c, +0xff,0xf6,0x02,0x0a,0x03,0xb0,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0b,0x00,0x15,0x00,0x27,0x40,0x24,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x15,0x13, +0x0e,0x0c,0x00,0x0b,0x00,0x0a,0x21,0x05,0x09,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x5c,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x02,0xda,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41, +0x4a,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0f,0x00,0x1d,0x00,0x37,0x40,0x34,0x06,0x01,0x01,0x07,0x01,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x08,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x17,0x12,0x10, +0x00,0x0f,0x00,0x0e,0x21,0x11,0x11,0x09,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x15,0x33,0x15,0x23,0x5c,0x52,0x52,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x6c,0x6c,0x01,0x4f,0x4b,0x01, +0x40,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41,0x4a,0xf0,0x4b,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x21,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0f,0x00,0x1d,0x00,0x37,0x40,0x34,0x06,0x01, +0x01,0x07,0x01,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x08,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x17,0x12,0x10,0x00,0x0f,0x00,0x0e,0x21,0x11,0x11,0x09,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14, +0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x15,0x33,0x15,0x23,0x5c,0x52,0x52,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x6c,0x6c,0x01,0x4f,0x4b,0x01,0x40,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41,0x4a,0xf0,0x4b,0x00,0x00,0x00,0x01,0x00,0x64, +0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x06,0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21, +0x15,0x21,0x11,0x21,0x15,0x64,0x01,0xa4,0xfe,0xb5,0x01,0x28,0xfe,0xd8,0x01,0x4b,0x02,0xda,0x52,0xe2,0x50,0xfe,0xfc,0x52,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00, +0x00,0x07,0x06,0x95,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x71, +0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x2b,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x27,0x06,0x9e,0x02,0x62,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00, +0x00,0x07,0x06,0xc1,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x30,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc2,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08, +0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb0,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x2b,0x02,0x08,0x02,0xda,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x62,0x00,0x00, +0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xd4,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0x93,0x02,0x26,0x00,0x25,0x00,0x00, +0x00,0x07,0x06,0x98,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0x35,0x02,0x0d,0x02,0xda,0x00,0x1b,0x00,0x6e,0x4b,0xb0,0x15,0x50,0x58,0x40,0x29,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x4d,0x00,0x06,0x06,0x07,0x5f, +0x00,0x07,0x07,0x3d,0x07,0x4e,0x1b,0x40,0x26,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x06,0x00,0x07,0x06,0x07,0x63,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x05,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x1b,0x00,0x1b,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x11, +0x0a,0x09,0x1e,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x21,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x64,0x01,0xa4,0xfe,0xb5,0x01,0x28,0xfe,0xd8,0x01,0x4b,0x2f,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x02,0xda,0x52,0xe2,0x50,0xfe,0xfc,0x52,0x1b,0x2d, +0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0x00,0x01,0x00,0x42,0xff,0xf6,0x02,0x24,0x02,0xe4,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x07,0x01,0x05,0x04,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00, +0x01,0x01,0x3e,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x2a,0x29,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x16,0x14,0x13,0x10,0x0e,0x00,0x2d,0x01,0x2d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23, +0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x0e,0x02,0x01,0x35,0x48,0x6d,0x3e,0x4e,0x3e,0x34,0x41,0x37,0x61,0x40,0x42,0x65,0x38,0x5a,0x4a,0x3b,0x38,0x46,0x47,0x39,0x57,0x56,0x43,0x53,0x53,0x43,0x41,0x54,0x01,0x5a,0x01,0x3d,0x6b,0x0a,0x35,0x5e,0x3e,0x47,0x67,0x0b,0x03, +0x0d,0x5b,0x3c,0x38,0x55,0x30,0x35,0x5e,0x3f,0x3a,0x48,0x41,0x35,0x36,0x44,0x50,0x4b,0x3c,0x3c,0x4b,0x48,0x3a,0x3e,0x5f,0x35,0x00,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x5f,0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x09, +0x00,0x29,0x40,0x26,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x5f,0x01,0xae,0xfe,0xaa,0x01,0x3c,0xfe,0xc6,0x02,0xda, +0x52,0xf2,0x52,0xfe,0xbc,0x00,0x00,0x00,0x00,0x01,0x00,0x58,0xff,0xf6,0x02,0x06,0x02,0xe4,0x00,0x1f,0x00,0x3e,0x40,0x3b,0x00,0x02,0x03,0x06,0x03,0x02,0x06,0x80,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00, +0x1c,0x1b,0x1a,0x19,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f,0x01,0x1f,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x15,0x14,0x06,0x01,0x30,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b, +0x43,0x43,0x3b,0x3b,0x41,0x94,0xee,0x74,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x42,0x3e,0xfe,0xb5,0x3e,0x44,0x44,0x3e,0x64,0x52,0xb6,0x61,0x71,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06, +0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00, +0xff,0xff,0x00,0x58,0xff,0x10,0x02,0x06,0x02,0xe4,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x5c,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb0,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x00,0x0b,0x00,0x27,0x40,0x24, +0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x38,0x4d,0x06,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x5d,0x5a,0xea,0x5a,0x5a,0xea,0x02,0xda,0xfe,0xc8,0x01,0x38,0xfd,0x26,0x01, +0x50,0xfe,0xb0,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x13,0x00,0x17,0x00,0x3b,0x40,0x38,0x05,0x03,0x02,0x01,0x0b,0x06,0x02,0x00,0x0a,0x01,0x00,0x67,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x67,0x04,0x01,0x02,0x02,0x38,0x4d,0x0c,0x09,0x02,0x07,0x07,0x39,0x07,0x4e,0x00,0x00,0x17,0x16,0x15,0x14,0x00,0x13, +0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1f,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x11,0x33,0x35,0x23,0x5d,0x53,0x53,0x5a,0xea,0x5a,0x53,0x53,0x5a,0xea,0xea,0xea,0x02,0x0d,0x4b,0x82,0x82,0x82,0x82,0x4b,0xfd,0xf3,0x01,0x50,0xfe, +0xb0,0x01,0xa2,0x6b,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x03,0xb6,0x02,0x26,0x00,0x40,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x00,0x0b,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x06,0x01,0x05, +0x05,0x39,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x69,0x95,0x95,0x01,0x86,0x95,0x95,0x52,0x02,0x36,0x52,0x52,0xfd,0xca,0x52,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00, +0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef, +0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb0,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0xff,0x2b,0x01,0xef,0x02,0xda,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00, +0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xd4,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0x93,0x02,0x26,0x00,0x43,0x00,0x00, +0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x35,0x01,0xef,0x02,0xda,0x00,0x1b,0x00,0x62,0x4b,0xb0,0x15,0x50,0x58,0x40,0x23,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x4d,0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x07,0x3d,0x07,0x4e, +0x1b,0x40,0x20,0x00,0x06,0x00,0x07,0x06,0x07,0x63,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x05,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x1b,0x00,0x1b,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15, +0x23,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x69,0x95,0x95,0x01,0x86,0x95,0x95,0xa2,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x52,0x02,0x36,0x52,0x52,0xfd,0xca,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x69, +0x00,0x00,0x01,0xef,0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x2d,0xff,0xf6,0x01,0xef,0x02,0xda,0x00,0x0f,0x00,0x2b,0x40,0x28,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x03,0x03,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0c, +0x0b,0x08,0x06,0x04,0x03,0x00,0x0f,0x01,0x0f,0x05,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x0e,0x69,0x78,0x5a,0x47,0x40,0x40,0x47,0x5a,0x79,0x0a,0x76,0x66,0x43,0x49,0x49,0x43,0x02,0x08,0xfd,0xf8,0x66,0x76,0x00,0x00,0x00,0xff,0xff,0x00,0x2d,0xff,0xf6,0x02,0x77, +0x03,0xb6,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0xee,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x0c,0x00,0x2d,0x40,0x2a,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x38,0x4d,0x06,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0c, +0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x23,0x03,0x23,0x11,0x5c,0x5a,0x6c,0xa2,0x62,0xb5,0xbf,0x67,0xaa,0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0x86,0x01,0x51,0xfe,0xaf,0xff,0xff,0x00,0x5c,0xff,0x10,0x02,0x30,0x02,0xda,0x02,0x26,0x00,0x51,0x00,0x00, +0x00,0x07,0x06,0xa0,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x05,0x00,0x1f,0x40,0x1c,0x00,0x00,0x00,0x38,0x4d,0x00,0x01,0x01,0x02,0x60,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x09,0x18,0x2b,0x33,0x11,0x33,0x11,0x21,0x15,0x82,0x5a,0x01,0x4a,0x02, +0xda,0xfd,0x78,0x52,0xff,0xff,0x00,0x75,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x06,0x91,0x01,0xe5,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x06,0x6d,0x01,0xf9,0x00,0x00,0xff,0xff,0x00,0x82,0xff,0x10,0x02,0x26,0x02,0xda,0x02,0x26, +0x00,0x53,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x80,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x03,0x29,0x00,0xa5,0x01,0x13,0x00,0x09,0xb1,0x01,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x2c,0x40,0x29, +0x0a,0x09,0x08,0x07,0x04,0x03,0x02,0x01,0x08,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x01,0x01,0x02,0x60,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x15,0x15,0x04,0x09,0x18,0x2b,0x33,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x21,0x15,0x82,0x6e,0x6e,0x5a,0xaa,0xaa,0x01,0x4a, +0x01,0x30,0x4a,0x50,0x4a,0x01,0x5a,0xfe,0xe3,0x73,0x50,0x73,0xfe,0xe5,0x52,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0xda,0x00,0x13,0x00,0x2e,0x40,0x2b,0x0f,0x0c,0x03,0x03,0x03,0x00,0x01,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x01,0x01,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00, +0x00,0x13,0x00,0x13,0x16,0x11,0x12,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x13,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x36,0x37,0x03,0x23,0x03,0x16,0x16,0x15,0x11,0x48,0x85,0x5d,0x61,0x85,0x57,0x03,0x06,0x04,0x76,0x4e,0x71,0x08,0x06,0x02,0xda,0xfe,0xc4,0x01,0x3c,0xfd,0x26,0x01,0x59,0x31,0x7f,0x82,0x34,0xfe,0x87,0x01,0x70, +0x4a,0xb0,0x63,0xfe,0xa7,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x11,0x00,0x24,0x40,0x21,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x05,0x09,0x19,0x2b,0x33,0x11,0x33,0x13,0x2e,0x02, +0x35,0x11,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x11,0x5a,0x78,0xdf,0x02,0x05,0x03,0x57,0x78,0xde,0x02,0x04,0x03,0x02,0xda,0xfd,0x8f,0x19,0x49,0x51,0x24,0x01,0x9a,0xfd,0x26,0x02,0x71,0x18,0x49,0x51,0x25,0xfe,0x66,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x91, +0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x10,0x01,0xfe,0x02,0xda,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x4c,0x01,0xfe,0x02,0xda,0x00,0x19, +0x00,0x2f,0x40,0x2c,0x0f,0x06,0x05,0x03,0x01,0x02,0x01,0x4c,0x03,0x01,0x02,0x02,0x38,0x4d,0x00,0x01,0x01,0x39,0x4d,0x00,0x00,0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x3d,0x04,0x4e,0x00,0x00,0x00,0x19,0x00,0x18,0x16,0x11,0x18,0x21,0x06,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x03,0x1e,0x02,0x15,0x11,0x23,0x11,0x33,0x13, +0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0xf0,0x41,0x35,0x3e,0xfc,0x02,0x04,0x03,0x57,0x78,0xdf,0x02,0x05,0x03,0x57,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x02,0x62,0x18,0x49,0x51,0x25,0xfe,0x66,0x02,0xda,0xfd,0xdb,0x19,0x49,0x52,0x24,0x01,0x4d,0xfd,0x35,0x58,0x6b,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb1,0x02,0x26, +0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08, +0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x0a,0x72,0x6a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe, +0xc9,0x6a,0x72,0x51,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00, +0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x67,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00, +0x00,0x27,0x06,0x9e,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x1c,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc1,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc2,0x02,0x58,0x00,0x00, +0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x00,0x02,0xe4,0x02,0x26,0x00,0x60,0x00,0x00, +0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xd4,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0xf6,0x02,0x12, +0x03,0x2a,0x00,0x15,0x00,0x23,0x00,0x3e,0x40,0x3b,0x09,0x01,0x04,0x01,0x10,0x01,0x03,0x04,0x02,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x0d,0x0c,0x08,0x06,0x00,0x15, +0x01,0x15,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x35,0x33,0x15,0x14,0x07,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x50,0x35,0x16,0x4b,0x30,0x1e,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x0a, +0x72,0x6a,0x01,0x36,0x6a,0x72,0x26,0x07,0x1a,0x4b,0x50,0x3a,0x19,0x33,0x4b,0xfe,0xc9,0x6a,0x72,0x51,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb6,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x12, +0x03,0x2a,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb6,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x44,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xd4,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x4e,0x00,0x00, +0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb1,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0x93,0x02,0x26,0x00,0x60,0x00,0x00, +0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0xe4,0x00,0x1d,0x00,0x2b,0x00,0x64,0x4b,0xb0,0x15,0x50,0x58,0x40,0x21,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x03,0x03,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e, +0x1b,0x40,0x1e,0x00,0x03,0x06,0x01,0x00,0x03,0x00,0x63,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x17,0x1f,0x1e,0x01,0x00,0x26,0x24,0x1e,0x2b,0x1f,0x2b,0x1c,0x1a,0x0e,0x0c,0x07,0x05,0x00,0x1d,0x01,0x1d,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35, +0x34,0x37,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x7b,0x37,0x43,0x38,0x0d,0x62,0x72,0x72,0x62,0x62,0x72,0x2b,0x27,0x1d,0x21,0x1a,0x1e,0x19,0x3c,0x9d,0x3b,0x3f,0x3f, +0x3b,0x3a,0x40,0x40,0xcb,0x35,0x28,0x2e,0x36,0x70,0x62,0x01,0x4a,0x62,0x70,0x6f,0x62,0xfe,0xb5,0x3b,0x5a,0x1a,0x18,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x01,0x12,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x00,0x00,0x03,0x00,0x23,0xff,0xd8,0x02,0x35,0x02,0xee,0x00,0x15,0x00,0x1c,0x00,0x23,0x00,0x75,0x40,0x13, +0x09,0x01,0x04,0x00,0x22,0x21,0x18,0x17,0x0c,0x01,0x06,0x05,0x04,0x14,0x01,0x02,0x05,0x03,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x01,0x01,0x00,0x00,0x3e,0x4d,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x1b,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x06, +0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3e,0x4d,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x59,0x40,0x14,0x1e,0x1d,0x00,0x00,0x1d,0x23,0x1e,0x23,0x1b,0x19,0x00,0x15,0x00,0x15,0x26,0x12,0x26,0x08,0x09,0x19,0x2b,0x17,0x37,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x37,0x33,0x07, +0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x07,0x13,0x11,0x13,0x26,0x23,0x22,0x06,0x13,0x32,0x36,0x35,0x11,0x03,0x16,0x23,0x4c,0x17,0x72,0x62,0x5c,0x38,0x21,0x54,0x46,0x11,0x72,0x62,0x55,0x37,0x29,0x3b,0xe0,0x1f,0x47,0x3a,0x40,0x7a,0x3b,0x3f,0xda,0x20,0x28,0x86,0x2d,0x3d,0x01,0x4a,0x62,0x70,0x31,0x3b,0x7d,0x29,0x35,0xfe, +0xb5,0x62,0x70,0x2b,0x49,0x02,0x3a,0xfe,0xc3,0x01,0x8d,0x31,0x43,0xfd,0xf7,0x43,0x3e,0x01,0x29,0xfe,0x7e,0x28,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0xd8,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0x76,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00, +0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x28,0xff,0xf6,0x02,0x3f,0x02,0xe4,0x00,0x1d,0x00,0x2b,0x00,0xe3,0x4b,0xb0,0x15,0x50,0x58,0x40,0x0a,0x0b,0x01,0x03,0x01,0x19,0x01,0x00,0x06,0x02,0x4c,0x1b,0x40,0x0a,0x0b,0x01,0x03,0x09,0x19,0x01,0x08,0x06,0x02,0x4c,0x59,0x4b,0xb0,0x15,0x50,0x58,0x40,0x23,0x00,0x04, +0x00,0x05,0x06,0x04,0x05,0x67,0x09,0x01,0x03,0x03,0x01,0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x0b,0x08,0x02,0x06,0x06,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x38,0x00,0x04,0x00,0x05,0x06,0x04,0x05,0x67,0x00,0x09,0x09,0x01,0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x00,0x03,0x03,0x01, +0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x00,0x06,0x06,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x33,0x00,0x04,0x00,0x05,0x06,0x04,0x05,0x67,0x00,0x09,0x09,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d, +0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x1f,0x1f,0x1e,0x01,0x00,0x26,0x24,0x1e,0x2b,0x1f,0x2b,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1d,0x01,0x1d,0x0c,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x11, +0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x33,0x35,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x21,0x35,0x23,0x0e,0x02,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0xc3,0x48,0x53,0x53,0x48,0x23,0x2e,0x1a,0x03,0x05,0x01,0x09,0xb1,0x98,0x98,0xb1,0xfe,0xf7,0x05,0x03,0x1a,0x2e,0x0a,0x2a,0x30,0x30, +0x2a,0x2a,0x30,0x30,0x0a,0x66,0x58,0x01,0x72,0x58,0x66,0x1d,0x29,0x14,0x50,0x52,0xe6,0x52,0xfe,0x52,0x50,0x13,0x2a,0x1d,0x50,0x3b,0x33,0x01,0x72,0x33,0x3b,0x3b,0x33,0xfe,0x8e,0x33,0x3b,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2b,0x40,0x28,0x00,0x03,0x00,0x01,0x02,0x03, +0x01,0x67,0x00,0x04,0x04,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x0a,0x24,0x21,0x06,0x09,0x18,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5c,0xeb,0x66,0x79,0x79,0x66,0x91,0x91,0x3b, +0x47,0x47,0x3b,0x91,0x02,0xda,0x75,0x62,0x62,0x75,0xfe,0xd4,0x01,0x7d,0x49,0x3d,0x3e,0x48,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x2f,0x40,0x2c,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x67,0x00,0x04,0x00,0x02,0x03,0x04,0x02,0x67,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x03,0x03,0x39, +0x03,0x4e,0x00,0x00,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0d,0x25,0x21,0x11,0x07,0x09,0x19,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5a,0x5a,0x99,0x42,0x61,0x36,0x76,0x63,0x99,0x99,0x3a,0x42,0x43,0x39,0x99,0x02,0xda,0x96,0x32,0x5a,0x3c,0x5b, +0x6d,0xb4,0x01,0x04,0x41,0x37,0x38,0x40,0x00,0x02,0x00,0x50,0xff,0x4c,0x02,0x0e,0x02,0xe4,0x00,0x13,0x00,0x21,0x00,0x38,0x40,0x35,0x12,0x01,0x00,0x03,0x01,0x4c,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x05,0x01,0x02,0x02,0x3d,0x02,0x4e,0x15,0x14,0x00,0x00, +0x1c,0x1a,0x14,0x21,0x15,0x21,0x00,0x13,0x00,0x13,0x25,0x23,0x07,0x09,0x18,0x2b,0x05,0x27,0x22,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x17,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0xa6,0x67,0x04,0x0a,0x05,0x65,0x77,0x77,0x65,0x65,0x77,0x3a,0x35, +0x75,0xe2,0x3b,0x47,0x47,0x3b,0x3b,0x47,0x47,0xb4,0xab,0x01,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x43,0x64,0x19,0xc1,0xfa,0x4a,0x3d,0x01,0x40,0x3e,0x49,0x49,0x3e,0xfe,0xc0,0x3d,0x4a,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x02,0x21,0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x33,0x40,0x30,0x09,0x01,0x02,0x04,0x01,0x4c, +0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x03,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x17,0x15,0x11,0x0f,0x00,0x0e,0x00,0x0e,0x11,0x17,0x21,0x07,0x09,0x19,0x2b,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x23,0x03,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34, +0x26,0x23,0x23,0x5d,0xe1,0x41,0x62,0x36,0x4c,0x3f,0x95,0x63,0x8f,0x79,0x88,0x38,0x44,0x44,0x38,0x88,0x02,0xda,0x35,0x5e,0x3f,0x4a,0x6a,0x15,0xfe,0xc1,0x01,0x36,0xfe,0xca,0x01,0x87,0x47,0x3a,0x3b,0x46,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00, +0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5d,0xff,0x10,0x02,0x21,0x02,0xda,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0xf6,0x02,0x10,0x02,0xe4,0x00,0x29,0x00,0x3b,0x40,0x38, +0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3e,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1c,0x1a,0x19,0x16,0x14,0x08,0x06,0x04,0x03,0x00,0x29,0x01,0x29,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16, +0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x01,0x30,0x6a,0x7e,0x5a,0x4e,0x40,0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x34,0x5e,0x3d,0x3e,0x5f,0x36,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49, +0x51,0x7a,0x0a,0x70,0x62,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x3a,0x58,0x31,0x31,0x57,0x39,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x60,0x72,0x00,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x48, +0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0x35,0x02,0x10,0x02,0xe4,0x00,0x3d,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x03,0x36,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03, +0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3e,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07, +0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3e,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x3d,0x00,0x3c,0x1b,0x22,0x13,0x2c,0x22,0x14,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23, +0x37,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xcd,0x46,0x16,0x1b,0x37,0x32,0x18,0x4f,0x5c,0x5a,0x4e,0x40, +0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x34,0x5e,0x3d,0x3e,0x5f,0x36,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49,0x51,0x7a,0x66,0x03,0x02,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x40,0x0f,0x6b,0x53,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x3a,0x58,0x31,0x31,0x57,0x39,0x32,0x3f,0x3f,0x32, +0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x60,0x72,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x48,0xff,0x10,0x02,0x10,0x02,0xe4,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00, +0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x20,0x00,0x38,0x40,0x35,0x1a,0x07,0x02,0x01,0x05,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x61,0x07,0x06,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x20,0x00,0x20,0x22,0x24,0x21,0x25, +0x12,0x24,0x08,0x09,0x1c,0x2b,0x33,0x11,0x34,0x36,0x36,0x33,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x22,0x06,0x15,0x11,0x5c,0x34,0x5f,0x3f,0xe3,0xa2,0x4e,0x5f,0x36,0x60,0x41,0x43,0x39,0x3c,0x46,0x46,0x3c,0x2d,0xa4,0x84,0x37,0x41,0x02,0x0c,0x3e, +0x5d,0x33,0x58,0xdb,0x05,0x70,0x5b,0x40,0x61,0x36,0x52,0x48,0x3d,0x3c,0x46,0x4e,0xe1,0x42,0x3a,0xfd,0xf4,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x16,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02,0x02,0x04,0x61,0x00, +0x04,0x04,0x3e,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x11,0x0f,0x0d,0x0c,0x0a,0x08,0x05,0x04,0x00,0x16,0x01,0x16,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x11, +0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x61,0x71,0x01,0x4a,0x3d,0x3b,0x3a,0x3e,0x5a,0x70,0x62,0x64,0x6e,0x70,0x62,0x3e,0x3a,0xf0,0x3b,0x0a,0x73,0x5f,0xc8,0x83,0x3e,0x43,0x44,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x5f,0x73,0x4b,0x46,0x41,0x82,0x82,0x41,0x46,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x21, +0x02,0xda,0x00,0x07,0x00,0x21,0x40,0x1e,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xc8,0x01,0xea,0xc8,0x02,0x88,0x52,0x52,0xfd,0x78,0x00,0x00,0x00,0x01,0x00,0x37, +0x00,0x00,0x02,0x21,0x02,0xda,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x05,0x01,0x01,0x06,0x01,0x00,0x07,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x08,0x01,0x07,0x07,0x39,0x07,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x23, +0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0xff,0x91,0x91,0xc8,0x01,0xea,0xc8,0x91,0x91,0x01,0x27,0x4b,0x01,0x16,0x52,0x52,0xfe,0xea,0x4b,0xfe,0xd9,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x89,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0x35,0x02,0x21, +0x02,0xda,0x00,0x19,0x00,0x6f,0x40,0x0b,0x08,0x01,0x05,0x06,0x01,0x4c,0x07,0x01,0x06,0x01,0x4b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x24,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x4d,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40, +0x21,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x00,0x04,0x00,0x03,0x04,0x03,0x63,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x59,0x40,0x0f,0x00,0x00,0x00,0x19,0x00,0x19,0x14,0x21,0x28,0x11,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x07,0x1e,0x02, +0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0xff,0xc8,0x01,0xea,0xc8,0x0c,0x1a,0x38,0x26,0x42,0x36,0x55,0x46,0x16,0x1b,0x37,0x32,0x19,0x02,0x88,0x52,0x52,0xfd,0x78,0x23,0x03,0x14,0x24,0x1a,0x22,0x31,0x37,0x17,0x0d,0x11,0x1a,0x45,0x00,0xff,0xff,0x00,0x37,0xff,0x10,0x02,0x21,0x02,0xda,0x02,0x26, +0x00,0x89,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x11,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x05,0x09,0x16,0x2b,0x05,0x22, +0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x2c,0x66,0x6c,0x5a,0x3b,0x3d,0x3c,0x3c,0x5a,0x6b,0x0a,0x71,0x61,0x02,0x12,0xfd,0xee,0x3c,0x46,0x46,0x3c,0x02,0x12,0xfd,0xee,0x62,0x70,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x91, +0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb1,0x02,0x26, +0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x01,0xfe,0x02,0xda,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a, +0xff,0xf6,0x01,0xfe,0x03,0xd4,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0x48,0x00,0x1a,0x00,0x31,0x40,0x2e,0x17,0x01,0x02,0x01,0x01,0x4c,0x00,0x04,0x01,0x04,0x85,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00, +0x4e,0x01,0x00,0x13,0x12,0x0f,0x0d,0x0a,0x08,0x05,0x04,0x00,0x1a,0x01,0x1a,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x11,0x14,0x06,0x01,0x2c,0x66,0x6c,0x5a,0x3b,0x3d,0x3c,0x3c,0x41,0x10,0x13,0x4b,0x2e,0x27,0x6b,0x0a,0x71, +0x61,0x02,0x12,0xfd,0xee,0x3c,0x46,0x46,0x3c,0x02,0x12,0x13,0x10,0x4b,0x50,0x27,0x31,0x06,0xfe,0x2e,0x62,0x70,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xb6,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x53,0x03,0x48,0x02,0x26,0x00,0x96,0x00,0x00, +0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xb6,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xd4,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53, +0x03,0xb1,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x93,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00, +0x00,0x01,0x00,0x5a,0xff,0x35,0x01,0xfe,0x02,0xda,0x00,0x20,0x00,0x56,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x19,0x00,0x05,0x06,0x01,0x00,0x05,0x00,0x63,0x04,0x01,0x02,0x02, +0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x13,0x01,0x00,0x1f,0x1d,0x14,0x13,0x10,0x0e,0x0b,0x0a,0x07,0x05,0x00,0x20,0x01,0x20,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x37,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x07,0x07,0x06,0x06,0x15, +0x14,0x16,0x33,0x33,0x15,0x01,0x7b,0x37,0x43,0x38,0x0d,0x62,0x70,0x5a,0x3e,0x3a,0x3b,0x3d,0x5a,0x50,0x1d,0x21,0x1a,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x2e,0x36,0x70,0x62,0x02,0x12,0xfd,0xee,0x3e,0x43,0x43,0x3e,0x02,0x12,0xfd,0xee,0x79,0x36,0x18,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe, +0x03,0xe2,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x96,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb1,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x21,0x40,0x1e,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01, +0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xee,0xbc,0x5c,0x7d,0x0d,0x11,0x04,0x04,0x13,0x0d,0x78,0x5d,0xbd,0x02,0xda,0xfe,0x0f,0x34,0x58,0x17,0x17,0x59,0x34,0x01,0xf0,0xfd,0x26,0x00, +0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x1e,0x00,0x26,0x40,0x23,0x1a,0x06,0x02,0x03,0x00,0x01,0x4c,0x02,0x01,0x02,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x1e,0x00,0x1e,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33, +0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x6b,0x57,0x53,0x39,0x04,0x04,0x01,0x02,0x07,0x04,0x48,0x61,0x42,0x04,0x08,0x02,0x02,0x05,0x04,0x3b,0x4f,0x59,0x71,0x42,0x04,0x04,0x02,0x02,0x04,0x05,0x47,0x02,0xda,0xfd,0xe4,0x21,0x47,0x15,0x15,0x47,0x21,0x02,0x1c,0xfd,0xe4, +0x21,0x47,0x15,0x15,0x47,0x21,0x02,0x1c,0xfd,0x26,0x02,0x26,0x22,0x41,0x12,0x12,0x41,0x22,0xfd,0xda,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x93, +0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb1,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x17, +0x00,0x26,0x40,0x23,0x13,0x0d,0x07,0x01,0x04,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x18,0x12,0x05,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x13,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07, +0x28,0xd2,0xc7,0x68,0x71,0x09,0x13,0x06,0x05,0x13,0x09,0x73,0x63,0xc7,0xd2,0x67,0x7d,0x09,0x13,0x05,0x05,0x13,0x09,0x7e,0x01,0x72,0x01,0x68,0xd8,0x11,0x27,0x0b,0x0b,0x27,0x11,0xd8,0xfe,0x9e,0xfe,0x88,0xe8,0x11,0x27,0x0c,0x0c,0x26,0x11,0xe9,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x0e,0x00,0x23,0x40,0x20, +0x0d,0x07,0x01,0x03,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x18,0x12,0x04,0x09,0x18,0x2b,0x33,0x11,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x11,0xff,0xdc,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xdc,0x01,0x11,0x01, +0xc9,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x37,0xfe,0xef,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00, +0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb1,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x2b,0x02,0x35,0x02,0xda,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00, +0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xd4,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0x93,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35, +0x03,0xb1,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xda,0x00,0x09,0x00,0x2c,0x40,0x29,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00, +0x09,0x00,0x09,0x12,0x11,0x12,0x05,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x55,0x01,0x49,0xfe,0xbc,0x01,0x9f,0xfe,0xb7,0x01,0x53,0x5a,0x02,0x2e,0x52,0x5a,0xfd,0xd2,0x52,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb6,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00, +0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb6,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb0,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x19,0x00,0x00,0x02,0x3f,0x02,0xda,0x00,0x18,0x00,0x2d,0x40,0x2a, +0x17,0x06,0x02,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x02,0x01,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33, +0x03,0x23,0x03,0x03,0x62,0x49,0x53,0x30,0x03,0x03,0x01,0x02,0x04,0x07,0x4c,0x66,0x45,0x06,0x07,0x01,0x01,0x05,0x03,0x32,0x4f,0x4b,0x73,0x53,0x59,0x02,0xda,0xfd,0xe4,0x21,0x3d,0x15,0x15,0x3c,0x22,0x01,0x90,0xfe,0x70,0x22,0x3c,0x15,0x15,0x3d,0x21,0x02,0x1c,0xfd,0x26,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x00,0xff,0xff,0x00,0x19, +0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb1,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x8e, +0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x38,0x4d,0x05,0x03,0x04,0x03,0x01, +0x01,0x39,0x01,0x4e,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x11,0x33,0x11,0x01,0xbf,0xf9,0xf9,0x67,0xf0,0xfa,0xfe,0x2d,0x5a,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0x84,0x02,0xda,0xfd,0x26,0x00,0xff,0xff,0x00,0x5d,0xff,0x10,0x02,0x30, +0x02,0xda,0x02,0x26,0x00,0xba,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x4c,0x02,0x00,0x02,0xe4,0x00,0x18,0x00,0x26,0x00,0x3e,0x40,0x3b,0x12,0x04,0x02,0x02,0x03,0x01,0x4c,0x06,0x01,0x03,0x04,0x02,0x04,0x03,0x02,0x80,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x02,0x02,0x00, +0x60,0x05,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1a,0x19,0x01,0x00,0x21,0x1f,0x19,0x26,0x1a,0x26,0x17,0x15,0x0c,0x0a,0x00,0x18,0x01,0x18,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x15,0x14,0x16,0x33,0x33,0x15,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22, +0x06,0x15,0x11,0x14,0x16,0x01,0x8b,0x44,0x52,0x4a,0x53,0x72,0x62,0x62,0x72,0x5e,0x53,0x21,0x1b,0x6e,0xcd,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0xb4,0x4f,0x42,0x1e,0x0f,0x6e,0x5a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe,0xc9,0x60,0x70,0x0a,0x1b,0x1c,0x23,0x52,0xfb,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x00, +0x00,0x02,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0x30,0x00,0x1b,0x00,0x26,0x00,0x84,0xb5,0x18,0x01,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x28,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x05,0x08, +0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x05,0x05,0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1b,0x1d,0x1c,0x01,0x00,0x22,0x20,0x1c,0x26, +0x1d,0x26,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x0a,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x35,0x34,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xfc,0x55,0x64,0x2e,0x52, +0x35,0xaa,0x75,0x34,0x40,0x02,0x5a,0x05,0x6f,0x5c,0x64,0x6b,0x59,0x02,0x08,0x56,0x31,0x42,0x4e,0xa0,0x2c,0x37,0x3d,0x0a,0x5f,0x4d,0x33,0x4c,0x2b,0x2b,0x6b,0x26,0x22,0x41,0x55,0x60,0x56,0xfe,0x86,0x64,0x33,0x3b,0x4c,0x40,0x37,0x4d,0x35,0x2c,0x2e,0x35,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26, +0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x7a,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb4,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43, +0xff,0x2b,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x5d,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x7a,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb5,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0xa2,0x02,0x26, +0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb6,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0xa0,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb7,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43, +0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x76,0x03,0x84,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0x2b,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x27,0x06,0x78, +0x02,0x5d,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x26,0x03,0x84,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb9,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x2b,0x03,0xa2,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xba,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43, +0xff,0xf6,0x01,0xfc,0x03,0xa0,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x09,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0x2b,0x01,0xfc,0x02,0x30,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x78, +0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x53,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x39,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0xe9,0x02,0x26, +0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x43,0xff,0x35,0x02,0x31,0x02,0x30,0x00,0x2b,0x00,0x36,0x00,0xea,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0a,0x28,0x01,0x08,0x09,0x16,0x01,0x00,0x08,0x02,0x4c,0x1b,0x40,0x0b,0x28,0x01,0x08,0x09,0x01,0x4c,0x16,0x01,0x07,0x01,0x4b,0x59,0x4b,0xb0,0x15,0x50, +0x58,0x40,0x32,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x4d,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3d,0x06,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2f,0x00,0x03,0x02, +0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00,0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00, +0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x1f,0x2d,0x2c,0x01,0x00,0x32,0x30,0x2c,0x36,0x2d,0x36,0x27,0x26,0x21,0x1f,0x1e,0x1c,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x08,0x06,0x00,0x2b, +0x01,0x2b,0x0c,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x35,0x34,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xfc,0x55,0x64, +0x2e,0x52,0x35,0xaa,0x75,0x34,0x40,0x02,0x5a,0x05,0x6f,0x5c,0x64,0x6b,0x02,0x22,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x0d,0x02,0x08,0x56,0x31,0x42,0x4e,0xa0,0x2c,0x37,0x3d,0x0a,0x5f,0x4d,0x33,0x4c,0x2b,0x2b,0x6b,0x26,0x22,0x41,0x55,0x60,0x56,0xfe,0x86,0x1c,0x2c,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x64, +0x33,0x3b,0x4c,0x40,0x37,0x4d,0x35,0x2c,0x2e,0x35,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x44,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x71,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x0c,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x5d,0x00,0x00,0x00,0x03,0x00,0x1f, +0xff,0xf6,0x02,0x35,0x02,0x30,0x00,0x2d,0x00,0x36,0x00,0x41,0x00,0xa9,0x40,0x0a,0x15,0x01,0x03,0x02,0x2b,0x01,0x07,0x08,0x02,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x72,0x00,0x08,0x06,0x07,0x07,0x08,0x72,0x0a,0x01,0x01,0x0d,0x01,0x06,0x08,0x01,0x06,0x67,0x0b,0x01,0x02,0x02,0x04,0x61,0x05, +0x01,0x04,0x04,0x41,0x4d,0x0f,0x0c,0x02,0x07,0x07,0x00,0x62,0x09,0x0e,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x35,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x0a,0x01,0x01,0x0d,0x01,0x06,0x08,0x01,0x06,0x67,0x0b,0x01,0x02,0x02,0x04,0x61,0x05,0x01,0x04,0x04,0x41,0x4d,0x0f,0x0c,0x02, +0x07,0x07,0x00,0x62,0x09,0x0e,0x02,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x27,0x38,0x37,0x01,0x00,0x3d,0x3b,0x37,0x41,0x38,0x41,0x34,0x32,0x2f,0x2e,0x29,0x27,0x25,0x24,0x22,0x20,0x1d,0x1c,0x19,0x17,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x2d,0x01,0x2d,0x10,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35, +0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x13,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x03,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xb2,0x41,0x52,0x54,0x43,0x51,0x24, +0x20,0x1f,0x26,0x4f,0x4b,0x3c,0x31,0x44,0x05,0x05,0x41,0x2e,0x41,0x50,0xde,0x25,0x20,0x20,0x25,0x54,0x50,0x41,0x2b,0x41,0x08,0x08,0x46,0x75,0x8a,0x25,0x20,0x1f,0x26,0x98,0x21,0x27,0x4f,0x1f,0x26,0x29,0x0a,0x5e,0x4b,0x4a,0x5b,0x4b,0x29,0x2d,0x27,0x20,0x41,0x51,0x31,0x28,0x28,0x31,0x59,0x47,0x90,0x6a,0x28,0x2d,0x28,0x20, +0x41,0x52,0x32,0x28,0x28,0x32,0x01,0x4e,0x4c,0x27,0x2e,0x2e,0x27,0xfe,0xb1,0x2e,0x27,0x6a,0x34,0x2c,0x2b,0x34,0x00,0x00,0xff,0xff,0x00,0x1f,0xff,0xf6,0x02,0x35,0x03,0x11,0x02,0x26,0x00,0xd4,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0x00,0x02,0x00,0x5c,0xff,0xf6,0x02,0x01,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6b, +0xb6,0x0a,0x03,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x01,0x06,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x01, +0x01,0x39,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x17,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x0f,0x0d,0x08,0x07,0x06,0x05,0x00,0x14,0x01,0x14,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06, +0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x4c,0x3e,0x50,0x07,0x01,0x5a,0x5a,0x02,0x01,0x08,0x51,0x3e,0x53,0x62,0x62,0x71,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0x0a,0x3d,0x36,0x69,0x02,0xda,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5e,0x6e,0x4e,0x3c,0x43,0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46, +0x00,0x01,0x00,0x58,0xff,0xf6,0x02,0x0b,0x02,0x30,0x00,0x1b,0x00,0x3b,0x40,0x38,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x19,0x18,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08, +0x06,0x00,0x1b,0x01,0x1b,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x34,0x64,0x78,0x78,0x64,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x0a,0x70,0x62,0x96, +0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x58,0x66,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x6a,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x60,0x00,0x00, +0x00,0x01,0x00,0x58,0xff,0x35,0x02,0x0b,0x02,0x30,0x00,0x2f,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x05,0x28,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x41, +0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x04,0x04,0x02,0x61,0x00,0x02, +0x02,0x41,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x2f,0x00,0x2e,0x12,0x12,0x25,0x22,0x12,0x27,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14, +0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd1,0x46,0x16,0x1b,0x37,0x32,0x18,0x49,0x56,0x78,0x64,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x5f,0x03,0x02,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x41,0x10,0x6a, +0x52,0x96,0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x58,0x66,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x60,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x09,0x02,0x26,0x00,0xd7,0x00,0x00, +0x00,0x07,0x06,0x69,0x02,0x60,0x00,0x00,0x00,0x02,0x00,0x57,0xff,0xf6,0x01,0xfc,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6b,0xb6,0x11,0x0a,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x03,0x06,0x02,0x00, +0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x39,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x17,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x14,0x01,0x14,0x08, +0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x63,0x62,0x53,0x3e,0x51,0x08,0x01,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x40,0x40,0x0a,0x6e, +0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xfd,0x26,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46,0x3b,0x44,0xa0,0x43,0x3c,0x00,0x02,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0xdf,0x00,0x20,0x00,0x2c,0x00,0x4c,0x40,0x49,0x19,0x18,0x16,0x13,0x12,0x11,0x10,0x07,0x01,0x03,0x01,0x4c,0x17,0x01,0x03,0x4a,0x00,0x02,0x01,0x05,0x01,0x02, +0x05,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x6a,0x00,0x03,0x03,0x38,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x22,0x21,0x01,0x00,0x28,0x26,0x21,0x2c,0x22,0x2c,0x15,0x14,0x0c,0x0b,0x09,0x07,0x00,0x20,0x01,0x20,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17, +0x33,0x26,0x26,0x27,0x27,0x07,0x35,0x37,0x27,0x33,0x17,0x37,0x15,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2b,0x44,0x68,0x39,0x35,0x5f,0x3f,0x2c,0x3b,0x0b,0x0e,0x04,0x20,0x1c,0x41,0xa3,0x78,0x48,0x68,0x2c,0x94,0x6a,0x4e,0x2c,0x35,0x3a,0x67,0x46,0x40,0x4d, +0x4d,0x40,0x3e,0x4d,0x4d,0x0a,0x38,0x66,0x43,0x43,0x63,0x37,0x26,0x12,0x0a,0x35,0x25,0x5b,0x4c,0x50,0x38,0x63,0x40,0x45,0x50,0x31,0x71,0x40,0x8e,0x40,0x46,0x69,0x3a,0x50,0x50,0x41,0x41,0x50,0x50,0x41,0x41,0x50,0x00,0x00,0x00,0x03,0x00,0x3f,0xff,0xf6,0x02,0x5c,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x26,0x00,0x81,0xb6,0x11, +0x0a,0x02,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x09,0x01,0x05,0x05,0x02,0x5f,0x04,0x01,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x0a,0x01,0x06,0x06,0x00,0x61,0x03,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x28,0x09,0x01,0x05,0x05,0x02,0x5f,0x04,0x01,0x02,0x02,0x38,0x4d, +0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x39,0x4d,0x0a,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1f,0x1a,0x19,0x15,0x15,0x01,0x00,0x21,0x1f,0x19,0x26,0x1a,0x26,0x15,0x18,0x15,0x18,0x17,0x16,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x14,0x01,0x14,0x0b,0x09,0x16,0x2b,0x17, +0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x13,0x37,0x33,0x07,0x01,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xe4,0x4c,0x59,0x59,0x4c,0x39,0x47,0x06,0x03,0x02,0x5a,0x5a,0x01,0x06,0x47,0xdc,0x0f,0x54,0x18,0xfe,0xbe,0x32,0x37,0x37,0x32,0x31, +0x38,0x38,0x0a,0x6c,0x5b,0xab,0x5c,0x6c,0x3e,0x35,0x7d,0xa0,0xfd,0x26,0x69,0x35,0x3e,0x02,0x30,0xb4,0xb4,0xfe,0x1e,0x43,0x3c,0xa0,0x3c,0x43,0x43,0x3c,0xa0,0x3c,0x43,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x02,0x58,0x02,0xda,0x00,0x1c,0x00,0x2a,0x00,0x83,0xb6,0x19,0x0a,0x02,0x08,0x09,0x01,0x4c,0x4b,0xb0,0x18,0x50, +0x58,0x40,0x25,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x00,0x04,0x04,0x38,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x29,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x00,0x04,0x04, +0x38,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1f,0x1e,0x1d,0x01,0x00,0x25,0x23,0x1d,0x2a,0x1e,0x2a,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1c,0x01,0x1c,0x0c,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32, +0x16,0x17,0x33,0x27,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x60,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0xa6,0xa6,0x5a,0x5e,0x5e,0x5a,0x01,0x07,0x4e,0x20,0x38,0x3e,0x3e,0x38,0x39,0x3d,0x3d,0x0a,0x6e, +0x5e,0x65,0x5f,0x6e,0x3e,0x35,0x7d,0x3c,0x4b,0x55,0x55,0x4b,0xfd,0xc6,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x5a,0x3e,0x46,0x44,0x40,0x5a,0x40,0x44,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x00,0x17,0x00,0x20,0x00,0x3e,0x40,0x3b,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x06, +0x06,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1c,0x19,0x18,0x15,0x14,0x12,0x10,0x0d,0x0c,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x21,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33, +0x06,0x06,0x03,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x2c,0x61,0x77,0x77,0x61,0x41,0x61,0x36,0xfe,0xa8,0x46,0x3a,0x32,0x41,0x07,0x5a,0x09,0x74,0xd7,0x01,0x00,0x43,0x3d,0x3d,0x43,0x0a,0x75,0x67,0x82,0x67,0x75,0x34,0x5e,0x40,0x62,0x34,0x3d,0x47,0x27,0x21,0x45,0x51,0x01,0x4c,0x1c,0x41,0x47,0x47,0x41,0x00,0x00,0x00, +0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00, +0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x71,0x03,0x84,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04, +0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x21,0x03,0x84,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xb9,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x26,0x03,0xa2,0x02,0x26,0x00,0xe1,0x00,0x00, +0x00,0x07,0x06,0xba,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0xa0,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x09,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04, +0x03,0x09,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x02,0x30,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00, +0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x39,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0xe9,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0x30,0x00,0x25,0x00,0x2e,0x00,0x84, +0x4b,0xb0,0x15,0x50,0x58,0x40,0x30,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x07,0x00,0x03,0x05,0x07,0x03,0x67,0x00,0x08,0x08,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x06,0x06,0x00,0x60,0x09,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x2d,0x00,0x05,0x03,0x04,0x03,0x05, +0x04,0x80,0x00,0x07,0x00,0x03,0x05,0x07,0x03,0x67,0x00,0x06,0x09,0x01,0x00,0x06,0x00,0x64,0x00,0x08,0x08,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x19,0x01,0x00,0x2c,0x2a,0x27,0x26,0x24,0x22,0x19,0x18,0x17,0x15,0x12,0x11,0x0e,0x0c,0x07,0x05,0x00,0x25,0x01,0x25, +0x0a,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x37,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x14,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x75,0x37,0x43,0x3b,0x0a,0x61,0x73,0x73,0x61,0x62,0x72,0xfe, +0xb0,0x3f,0x3d,0x69,0x0f,0x5a,0x05,0x32,0x27,0x10,0x22,0x1e,0x1e,0x19,0x3c,0xfe,0xed,0xf8,0x3e,0x3e,0x3d,0x3f,0xcb,0x35,0x28,0x2f,0x35,0x73,0x5f,0x96,0x5f,0x73,0x73,0x5f,0x61,0x35,0x41,0x45,0x4a,0x2b,0x40,0x13,0x0d,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x02,0x0c,0x1d,0x41,0x46,0x46,0x41,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04, +0x03,0x0c,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x30,0x00,0x15,0x00,0x1e,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x08,0x01,0x05,0x05, +0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1b,0x1a,0x16,0x1e,0x17,0x1e,0x10,0x0e,0x0c,0x0b,0x0a,0x08,0x05,0x04,0x00,0x15,0x01,0x15,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15, +0x14,0x16,0x01,0x2c,0x61,0x71,0x01,0x4c,0x3c,0x3e,0x67,0x0f,0x5a,0x09,0x70,0x57,0x62,0x70,0x70,0x62,0x3e,0x3c,0xf4,0x3d,0x0a,0x73,0x5f,0x61,0x35,0x41,0x45,0x4a,0x45,0x51,0x73,0x5f,0x96,0x5f,0x73,0x4b,0x46,0x41,0x1d,0x1d,0x41,0x46,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x12,0x00,0x2d,0x40,0x2a, +0x04,0x01,0x01,0x05,0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x12,0x21,0x23,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0xd7,0xa0, +0xa0,0x52,0x48,0xa1,0xa1,0x40,0xe1,0xe1,0x01,0x89,0x52,0x73,0x41,0x4b,0x52,0x3a,0x73,0x52,0xfe,0x77,0x00,0x02,0x00,0x58,0xff,0x4c,0x01,0xfb,0x02,0x30,0x00,0x1c,0x00,0x2a,0x00,0x6f,0xb6,0x15,0x07,0x02,0x05,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x20,0x08,0x01,0x05,0x00,0x01,0x00,0x05,0x01,0x69,0x00,0x06,0x06,0x02, +0x61,0x03,0x01,0x02,0x02,0x41,0x4d,0x00,0x00,0x00,0x04,0x5f,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x1b,0x40,0x24,0x08,0x01,0x05,0x00,0x01,0x00,0x05,0x01,0x69,0x00,0x03,0x03,0x3b,0x4d,0x00,0x06,0x06,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x00,0x00,0x04,0x5f,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x59,0x40,0x15,0x1e,0x1d,0x00, +0x00,0x25,0x23,0x1d,0x2a,0x1e,0x2a,0x00,0x1c,0x00,0x1b,0x14,0x25,0x27,0x21,0x09,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x35,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x33,0x11,0x14,0x06,0x23,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xa1,0x9b, +0x2f,0x36,0x02,0x03,0x08,0x4e,0x3b,0x55,0x62,0x62,0x55,0x3b,0x4e,0x08,0x02,0x59,0x67,0x59,0x11,0x38,0x40,0x40,0x38,0x39,0x3f,0x3f,0xb4,0x52,0x35,0x2d,0x32,0x5a,0x31,0x35,0x6c,0x5e,0x74,0x5e,0x6e,0x38,0x31,0x5f,0xfd,0xda,0x53,0x61,0x01,0x25,0x46,0x3e,0x69,0x3e,0x46,0x42,0x38,0x7d,0x38,0x42,0x00,0x00,0xff,0xff,0x00,0x58, +0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x5f,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6f, +0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x70,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x76,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x09,0x02,0x26, +0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x55,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x14,0x00,0x2d,0x40,0x2a,0x03,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x23, +0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x5c,0x5a,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x02,0xda,0xfe,0xe3,0x37,0x3c,0x66,0x58,0xfe,0x8e,0x01,0x63,0x3e,0x43,0x46,0x40,0xfe,0xa2,0x00,0xff,0xff,0x00,0x00, +0x00,0x00,0x01,0xfe,0x02,0xda,0x02,0x06,0x02,0x37,0x00,0x00,0xff,0xff,0xff,0xd4,0x00,0x00,0x01,0xfe,0x03,0xc5,0x02,0x26,0x00,0xfc,0x00,0x00,0x01,0x07,0x06,0x6e,0x01,0xb5,0x00,0xb4,0x00,0x08,0xb1,0x01,0x01,0xb0,0xb4,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00, +0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0x00,0x01,0x00,0x55,0x00,0x00,0x02,0x2b,0x02,0x26,0x00,0x09,0x00,0x27,0x40,0x24,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33, +0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x55,0xc3,0xaf,0x01,0x09,0xb9,0x52,0x01,0x82,0x52,0xfe,0x2c,0x52,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x71,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x70, +0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26, +0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x2b,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x27,0x06,0x69,0x02,0x67,0x00,0x00,0x00,0x07,0x06,0x78, +0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x39,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x02,0xe9,0x02,0x26, +0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x67,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0x35,0x02,0x2b,0x03,0x09,0x00,0x0b,0x00,0x25,0x00,0xb6,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2d,0x0a,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09, +0x02,0x06,0x06,0x39,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x2b,0x00,0x01,0x0a,0x01,0x00,0x04,0x01,0x00,0x69,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09,0x02,0x06,0x06,0x39,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08, +0x3d,0x08,0x4e,0x1b,0x40,0x28,0x00,0x01,0x0a,0x01,0x00,0x04,0x01,0x00,0x69,0x00,0x07,0x00,0x08,0x07,0x08,0x63,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09,0x02,0x06,0x06,0x39,0x06,0x4e,0x59,0x59,0x40,0x1f,0x0c,0x0c,0x01,0x00,0x0c,0x25,0x0c,0x25,0x20,0x1e,0x1d,0x1b,0x16,0x15, +0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x01,0x3b,0x21,0x26,0x26,0x21,0x21,0x26, +0x26,0xfe,0xf9,0xc3,0xaf,0x01,0x09,0xb9,0xcf,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x77,0x52,0x01,0x82,0x52,0xfe,0x2c,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x0c,0x02,0x26, +0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x4c,0x01,0xc3,0x03,0x09,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x4c,0x01,0xb3,0x02,0x26,0x00,0x0d,0x00,0x25,0x40,0x22,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x00,0x00, +0x00,0x03,0x5f,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0c,0x11,0x13,0x21,0x05,0x09,0x19,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11,0x21,0x35,0x21,0x11,0x14,0x06,0x23,0x5a,0x7c,0x3e,0x45,0xfe,0xfc,0x01,0x5e,0x78,0x65,0xb4,0x52,0x44,0x3d,0x01,0xb5,0x52,0xfd,0xf9,0x61,0x72,0x00,0x00,0xff,0xff,0x00,0x55, +0xff,0x4c,0x02,0x31,0x03,0x11,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x02,0x2f,0x02,0xda,0x00,0x0c,0x00,0x31,0x40,0x2e,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x06,0x05,0x02,0x03, +0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x61,0x5a,0x69,0x9a,0x67,0xb1,0xbb,0x69,0xa0,0x6b,0x02,0xda,0xfe,0x69,0xe3,0xfe,0xfa,0xfe,0xe0,0xf5,0xf5,0x00,0x00,0x00,0xff,0xff,0x00,0x61,0xff,0x10,0x02,0x2f, +0x02,0xda,0x02,0x26,0x01,0x10,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x02,0x06,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x28,0x40,0x25,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x5f,0x04, +0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x7c,0x49,0x57,0xbe,0x01,0x18,0x26,0x20,0xaa,0x55,0x46,0x01,0xed,0x52,0xfd,0xc1,0x22,0x27,0x52,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x26, +0x03,0xb6,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x26,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xe4,0x00,0x15,0x00,0x2c,0x40,0x29,0x11,0x0b,0x0a,0x08,0x05,0x04,0x03,0x02,0x08,0x01,0x00,0x01,0x4c,0x09,0x01,0x00,0x4a,0x00,0x00,0x00,0x38,0x4d,0x03,0x02,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00, +0x00,0x15,0x00,0x15,0x15,0x16,0x04,0x09,0x18,0x2b,0x33,0x13,0x27,0x07,0x35,0x37,0x27,0x33,0x17,0x37,0x15,0x07,0x13,0x23,0x03,0x26,0x26,0x27,0x14,0x06,0x07,0x03,0x32,0xcc,0x04,0xa0,0x86,0x2c,0x60,0x1b,0xa7,0x8d,0xdd,0x60,0x83,0x0d,0x0c,0x05,0x08,0x0c,0x7e,0x02,0x1d,0x09,0x50,0x50,0x43,0x71,0x49,0x53,0x50,0x47,0xfd,0xb3, +0x01,0x65,0x23,0x36,0x0f,0x0f,0x36,0x23,0xfe,0x9b,0x00,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x6d,0x02,0x3a,0x00,0x00,0xff,0xff,0x00,0x1e,0xff,0x10,0x02,0x26,0x02,0xda,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x0a, +0x00,0x00,0x02,0x75,0x02,0xda,0x00,0x26,0x01,0x13,0xec,0x00,0x01,0x07,0x03,0x29,0x00,0xf7,0x01,0x13,0x00,0x09,0xb1,0x01,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x15,0x00,0x2c,0x40,0x29,0x15,0x0a,0x09,0x08,0x07,0x02,0x01,0x00,0x08,0x02,0x00,0x01,0x4c,0x00,0x00,0x00, +0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x39,0x03,0x4e,0x21,0x27,0x11,0x13,0x04,0x09,0x1a,0x2b,0x37,0x35,0x37,0x11,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x35,0x64,0x78,0xbe,0x01,0x18,0xa0,0xa0,0x26,0x20,0xaa,0xaa,0x49,0x57,0xe6,0x50,0x51, +0x01,0x01,0x52,0xfe,0xea,0x6c,0x50,0x6c,0xd9,0x22,0x27,0x52,0x55,0x46,0x9c,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x30,0x00,0x24,0x00,0x56,0xb6,0x0a,0x03,0x02,0x03,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x16,0x06,0x01,0x04,0x04,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x08,0x07,0x05,0x03,0x03,0x03, +0x39,0x03,0x4e,0x1b,0x40,0x1a,0x00,0x00,0x00,0x3b,0x4d,0x06,0x01,0x04,0x04,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x08,0x07,0x05,0x03,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x10,0x00,0x00,0x00,0x24,0x00,0x24,0x23,0x13,0x23,0x13,0x25,0x24,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33, +0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x3c,0x4e,0x02,0x05,0x31,0x26,0x24,0x32,0x0b,0x01,0x07,0x31,0x26,0x35,0x3f,0x54,0x20,0x1c,0x1b,0x20,0x4a,0x20,0x1b,0x1c,0x20,0x02,0x26,0x49,0x25,0x2e,0x2a,0x24,0x24,0x2a,0x4f,0x3f,0xfe,0x5e,0x01, +0xa3,0x21,0x27,0x26,0x21,0xfe,0x5c,0x01,0xa3,0x21,0x27,0x26,0x21,0xfe,0x5c,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0x30,0x00,0x14,0x00,0x4c,0xb5,0x03,0x01,0x02,0x03,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x13,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x1b, +0x40,0x17,0x00,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x5c, +0x5a,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x02,0x26,0x69,0x37,0x3c,0x66,0x58,0xfe,0x8e,0x01,0x62,0x3f,0x43,0x46,0x40,0xfe,0xa2,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x67,0x00,0x00,0xff,0xff,0xff,0xf6,0x00,0x00,0x01,0xfe, +0x03,0x16,0x02,0x26,0x01,0x1b,0x00,0x00,0x01,0x07,0x06,0x7a,0x01,0x90,0x03,0x75,0x00,0x09,0xb1,0x01,0x01,0xb8,0x03,0x75,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0x10,0x01,0xfe,0x02,0x30,0x02,0x26, +0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5e,0xff,0x4c,0x01,0xfc,0x02,0x30,0x00,0x1c,0x00,0x5f,0xb5,0x11,0x01,0x02,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1c,0x00,0x01,0x01,0x03,0x61,0x04,0x01,0x03,0x03,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05, +0x05,0x3d,0x05,0x4e,0x1b,0x40,0x20,0x00,0x03,0x03,0x3b,0x4d,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x1c,0x00,0x1b,0x24,0x11,0x13,0x25,0x21,0x07,0x09,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11, +0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0xf0,0x3f,0x35,0x3e,0x3d,0x36,0x38,0x3f,0x5a,0x5a,0x01,0x06,0x4b,0x3f,0x53,0x60,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x01,0x59,0x3b,0x41,0x46,0x40,0xfe,0xa2,0x02,0x26,0x69,0x37,0x3c,0x66,0x58,0xfe,0x9d,0x58,0x6b,0x00, +0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x0c,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x42,0x00, +0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x63,0x75,0x74,0x64,0x64,0x74,0x75,0x63,0x3b,0x43,0x43,0x3b,0x3a, +0x44,0x44,0x08,0x74,0x68,0x7e,0x69,0x73,0x73,0x69,0x7e,0x68,0x74,0x50,0x42,0x40,0x92,0x40,0x42,0x42,0x40,0x92,0x40,0x42,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00, +0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x71, +0x03,0x84,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x21,0x03,0x84,0x02,0x26,0x01,0x22,0x00,0x00, +0x00,0x07,0x06,0xb9,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x26,0x03,0xa2,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xba,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0xa0,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04, +0x03,0x09,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x02,0x2e,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00, +0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x39,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf8,0x02,0x1c,0x02,0x80,0x00,0x17,0x00,0x25,0x00,0x71,0xb5,0x12,0x01,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x21,0x00,0x03,0x01,0x03,0x85,0x00,0x02,0x02,0x3b,0x4d, +0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00,0x4e,0x1b,0x40,0x24,0x00,0x03,0x01,0x03,0x85,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00,0x4e,0x59,0x40, +0x17,0x19,0x18,0x01,0x00,0x20,0x1e,0x18,0x25,0x19,0x25,0x0e,0x0d,0x0b,0x09,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01, +0x2c,0x63,0x75,0x74,0x64,0x45,0x32,0x0b,0x23,0x4b,0x20,0x1c,0x24,0x75,0x63,0x3b,0x43,0x43,0x3b,0x3a,0x44,0x44,0x08,0x74,0x68,0x7e,0x69,0x73,0x1c,0x23,0x4b,0x50,0x1f,0x2e,0x0a,0x36,0x51,0x7e,0x68,0x74,0x50,0x42,0x40,0x92,0x40,0x42,0x42,0x40,0x92,0x40,0x42,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x11,0x02,0x26, +0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x1c,0x02,0x80,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x11,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x44,0x00,0x00,0xff,0xff,0x00,0x54, +0xff,0xf8,0x02,0x1c,0x03,0x39,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x0c,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x10,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6c, +0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0xe9,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0x30,0x00,0x1e,0x00,0x2c,0x00,0x64,0x4b,0xb0,0x15,0x50,0x58,0x40,0x21,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x07,0x01,0x04, +0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x03,0x03,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x1e,0x00,0x03,0x06,0x01,0x00,0x03,0x00,0x63,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x17,0x20,0x1f,0x01,0x00,0x27,0x25,0x1f,0x2c, +0x20,0x2c,0x1d,0x1b,0x0f,0x0d,0x08,0x06,0x00,0x1e,0x01,0x1e,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x74,0x37, +0x43,0x19,0x22,0x09,0x62,0x72,0x72,0x62,0x62,0x72,0x2e,0x2b,0x18,0x22,0x1e,0x1e,0x19,0x3c,0x96,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0xcb,0x35,0x28,0x16,0x2f,0x1f,0x70,0x62,0x96,0x62,0x70,0x6f,0x62,0x97,0x3e,0x5b,0x1a,0x14,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x01,0x11,0x42,0x40,0x96,0x40,0x42,0x42,0x40,0x96,0x40,0x42,0x00,0x00, +0x00,0x03,0x00,0x23,0xff,0xe2,0x02,0x35,0x02,0x4e,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x4a,0x40,0x47,0x09,0x01,0x04,0x00,0x26,0x25,0x19,0x0c,0x01,0x05,0x05,0x04,0x14,0x01,0x02,0x05,0x03,0x4c,0x00,0x01,0x00,0x01,0x85,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x41,0x4d,0x07,0x01,0x05,0x05,0x02, +0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x20,0x1f,0x00,0x00,0x1f,0x27,0x20,0x27,0x1c,0x1a,0x00,0x15,0x00,0x15,0x26,0x12,0x26,0x08,0x09,0x19,0x2b,0x17,0x37,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x33,0x07,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x37,0x14,0x17,0x13,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35, +0x34,0x27,0x03,0x16,0x23,0x51,0x1c,0x72,0x62,0x4c,0x34,0x2e,0x5b,0x54,0x1f,0x72,0x62,0x50,0x36,0x29,0x30,0x03,0xcc,0x20,0x30,0x3c,0x43,0x7f,0x3c,0x43,0x04,0xd0,0x20,0x1e,0x72,0x31,0x43,0x96,0x62,0x70,0x22,0x40,0x76,0x32,0x47,0x97,0x62,0x70,0x26,0x3a,0xe6,0x11,0x0e,0x01,0x20,0x17,0x44,0x3e,0xfe,0xe8,0x45,0x3d,0x96,0x15, +0x13,0xfe,0xdb,0x1b,0xff,0xff,0x00,0x23,0xff,0xe2,0x02,0x35,0x03,0x11,0x02,0x26,0x01,0x39,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x0c,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x23,0xff,0xf6,0x02,0x35,0x02,0x30,0x00,0x28, +0x00,0x36,0x00,0x3f,0x00,0x59,0x40,0x56,0x0b,0x01,0x09,0x08,0x24,0x01,0x04,0x05,0x02,0x4c,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x09,0x00,0x03,0x05,0x09,0x03,0x67,0x0a,0x01,0x08,0x08,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0c,0x07,0x02,0x04,0x04,0x00,0x61,0x06,0x0b,0x02,0x00,0x00,0x3f,0x00,0x4e,0x2a,0x29,0x01, +0x00,0x3d,0x3b,0x38,0x37,0x31,0x2f,0x29,0x36,0x2a,0x36,0x21,0x1f,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x11,0x0f,0x08,0x06,0x00,0x28,0x01,0x28,0x0d,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x33,0x3e,0x02,0x33,0x32,0x16,0x15,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22, +0x26,0x26,0x27,0x23,0x0e,0x02,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x13,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xb4,0x43,0x4e,0x4e,0x43,0x28,0x33,0x1a,0x01,0x04,0x02,0x19,0x33,0x28,0x43,0x4e,0xde,0x24,0x1f,0x1a,0x25,0x04,0x55,0x0a,0x4c,0x38,0x28,0x33,0x19,0x02,0x04,0x01,0x1a,0x33,0x1e, +0x1f,0x24,0x24,0x1f,0x20,0x26,0x26,0xb9,0x89,0x26,0x20,0x1f,0x24,0x0a,0x57,0x49,0xfa,0x4a,0x56,0x1a,0x25,0x11,0x11,0x25,0x1a,0x56,0x4a,0x96,0x64,0x26,0x2d,0x20,0x1a,0x3e,0x49,0x1a,0x25,0x11,0x11,0x25,0x1a,0x4d,0x2d,0x26,0xfa,0x26,0x2d,0x2d,0x26,0xfa,0x26,0x2d,0x01,0x00,0x4d,0x26,0x2d,0x2d,0x26,0x00,0x00,0x02,0x00,0x5c, +0xff,0x4c,0x02,0x01,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x68,0xb6,0x11,0x03,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x05,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x00,0x00,0x00,0x3b,0x4d, +0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x14,0x16,0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x25,0x24,0x11,0x08,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15, +0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5c,0x5a,0x01,0x07,0x50,0x3e,0x53,0x62,0x62,0x53,0x3e,0x50,0x07,0x03,0x02,0x78,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0xb4,0x02,0xda,0x69,0x36,0x3d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x3c,0x43, +0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46,0x00,0x02,0x00,0x57,0xff,0x56,0x01,0xfc,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6c,0xb6,0x12,0x04,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x31,0x50,0x58,0x40,0x21,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f, +0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x59,0x40,0x14,0x16,0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x25,0x25,0x11, +0x08,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x11,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x57,0x5a,0x02,0x01,0x08,0x51,0x3e,0x53,0x62,0x62,0x53,0x3e,0x50,0x07,0x01,0x78,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0xaa,0x03, +0x84,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5e,0x6e,0x3d,0x36,0xfe,0xed,0xee,0x3c,0x43,0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0xff,0x4c,0x01,0xfc,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x68,0xb6,0x10,0x02,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x05,0x01,0x61, +0x02,0x01,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x3b,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x14,0x16, +0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x14,0x25,0x25,0x08,0x09,0x19,0x2b,0x05,0x35,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x33,0x11,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0xa2,0x02,0x03,0x07,0x50,0x3e,0x53,0x62, +0x63,0x52,0x3e,0x50,0x07,0x01,0x5a,0xd2,0x38,0x40,0x40,0x38,0x39,0x40,0x40,0xb4,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5f,0x6d,0x3d,0x36,0x69,0xfd,0x26,0xf8,0x46,0x3e,0x96,0x3e,0x46,0x3a,0x40,0xaa,0x40,0x3a,0x00,0x00,0x00,0x00,0x01,0x00,0x70,0x00,0x00,0x02,0x12,0x02,0x30,0x00,0x13,0x00,0x5a,0xb5,0x03,0x01,0x02,0x03,0x01, +0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x1e,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x04,0x04, +0x39,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x13,0x00,0x13,0x22,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x23,0x22,0x06,0x15,0x11,0x70,0x5a,0x02,0x07,0x4c,0x40,0x56,0x5d,0x5a,0x75,0x3b,0x3e,0x02,0x26,0x69,0x35,0x3e,0x67,0x5f,0x2f,0x2f,0x78,0x44,0x40, +0xfe,0xa2,0x00,0x00,0xff,0xff,0x00,0x70,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x76,0x00,0x00,0xff,0xff,0x00,0x70,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x10,0x02,0x12,0x02,0x30,0x02,0x26, +0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x7a,0x01,0xbd,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xf8,0x02,0x03,0x02,0x2e,0x00,0x28,0x00,0x3b,0x40,0x38,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00, +0x4e,0x01,0x00,0x1e,0x1b,0x19,0x18,0x16,0x13,0x09,0x06,0x04,0x03,0x00,0x28,0x01,0x27,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x15,0x14,0x06,0x23,0x01,0x16, +0x5c,0x65,0x5a,0x36,0x31,0x2c,0x32,0x37,0x41,0x98,0x38,0x3e,0x63,0x57,0x2c,0x50,0x65,0x04,0x5b,0x02,0x33,0x29,0x2c,0x2e,0x34,0x35,0x8e,0x8c,0x65,0x5c,0x08,0x53,0x4c,0x26,0x2b,0x2c,0x28,0x47,0x09,0x16,0x08,0x4d,0x3f,0x48,0x52,0x4f,0x40,0x1d,0x26,0x2a,0x24,0x3a,0x08,0x14,0x14,0x90,0x4d,0x55,0x00,0x00,0xff,0xff,0x00,0x55, +0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x35,0x02,0x03,0x02,0x2e,0x00,0x3a,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x03, +0x33,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x42,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08, +0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x42,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00, +0x3a,0x00,0x39,0x29,0x32,0x12,0x3a,0x32,0x14,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x15,0x14,0x06, +0x23,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd7,0x46,0x16,0x1b,0x37,0x32,0x17,0x50,0x57,0x5a,0x36,0x31,0x2c,0x32,0x37,0x41,0x98,0x38,0x3e,0x63,0x57,0x2c,0x50,0x65,0x04,0x5b,0x02,0x33,0x29,0x2c,0x2e,0x34,0x35,0x8e,0x8c,0x65,0x5c,0x0d,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x3e,0x06,0x51,0x47,0x26, +0x2b,0x2c,0x28,0x47,0x09,0x16,0x08,0x4d,0x3f,0x48,0x52,0x4f,0x40,0x1d,0x26,0x2a,0x24,0x3a,0x08,0x14,0x14,0x90,0x4d,0x55,0x1b,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x10,0x02,0x03, +0x02,0x2e,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x18,0x02,0xe4,0x00,0x2a,0x00,0x37,0x40,0x34,0x0c,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x69,0x00,0x05,0x05,0x00,0x61,0x00,0x00,0x00,0x3e,0x4d,0x00,0x02,0x02,0x01,0x61,0x07,0x06,0x02, +0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x00,0x2a,0x00,0x2a,0x24,0x21,0x24,0x21,0x2d,0x24,0x08,0x09,0x1c,0x2b,0x33,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11, +0x5c,0x35,0x5f,0x3f,0x3f,0x5e,0x35,0x41,0x34,0x3e,0x4e,0x38,0x63,0x42,0x3a,0x30,0x3e,0x4d,0x48,0x3a,0x39,0x2e,0x35,0x43,0x43,0x35,0x36,0x43,0x02,0x16,0x3d,0x5d,0x34,0x2f,0x52,0x37,0x3b,0x5a,0x0d,0x03,0x0b,0x68,0x48,0x3c,0x5c,0x34,0x52,0x48,0x3a,0x3a,0x48,0x50,0x42,0x35,0x35,0x42,0x46,0x38,0xfd,0xea,0x00,0x01,0x00,0xa5, +0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x0b,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x21,0x23,0x04,0x09,0x18,0x2b,0x33,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x11,0xa5,0x5d,0x4c,0xb0,0xb0,0x23,0x2c,0x02,0x3b,0x47,0x58, +0x50,0x2c,0x24,0xfd,0xc6,0x00,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08,0x02,0xc1,0x00,0x13,0x00,0x35,0x40,0x32,0x00,0x03,0x02,0x03,0x85,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x60,0x07,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x12,0x10,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07, +0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x08,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x63,0x44,0x52,0x9e,0x9e,0x5a,0xe1,0xe1,0x21,0x1b,0xa0,0x4f,0x42,0x01,0x43,0x52,0x9b,0x9b,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08, +0x02,0xc1,0x00,0x1b,0x00,0x3e,0x40,0x3b,0x00,0x03,0x02,0x03,0x85,0x06,0x01,0x00,0x0b,0x0a,0x02,0x07,0x08,0x00,0x07,0x67,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x08,0x08,0x09,0x60,0x00,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x1b,0x00,0x1b,0x18,0x16,0x23,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +0x0c,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x35,0x55,0x78,0x9e,0x9e,0x5a,0xe1,0xe1,0xb4,0xb4,0x21,0x1b,0xa0,0xa0,0x44,0x52,0xef,0x4b,0x9a,0x52,0x9b,0x9b,0x52,0x9a,0x4b,0x5e,0x1c,0x23,0x52,0x4f,0x42,0x5e,0x00, +0xff,0xff,0x00,0x2f,0x00,0x00,0x02,0x08,0x03,0x21,0x02,0x26,0x01,0x4c,0x00,0x00,0x01,0x07,0x06,0x6d,0x02,0x12,0x00,0x47,0x00,0x08,0xb1,0x01,0x01,0xb0,0x47,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0x2f,0xff,0x35,0x02,0x08,0x02,0xc1,0x00,0x25,0x00,0x87,0x40,0x0a,0x09,0x01,0x08,0x07,0x1e,0x01,0x01,0x08,0x02,0x4c,0x4b,0xb0, +0x15,0x50,0x58,0x40,0x2f,0x00,0x04,0x03,0x04,0x85,0x00,0x01,0x08,0x00,0x08,0x01,0x00,0x80,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x39,0x4d,0x00,0x00,0x00,0x09,0x5f,0x0a,0x01,0x09,0x09,0x3d,0x09,0x4e,0x1b,0x40,0x2c,0x00,0x04,0x03,0x04,0x85,0x00,0x01,0x08,0x00, +0x08,0x01,0x00,0x80,0x00,0x00,0x0a,0x01,0x09,0x00,0x09,0x63,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x39,0x08,0x4e,0x59,0x40,0x12,0x00,0x00,0x00,0x25,0x00,0x24,0x11,0x23,0x11,0x11,0x11,0x11,0x15,0x14,0x21,0x0b,0x09,0x1f,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34, +0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0x01,0x09,0x46,0x16,0x1b,0x37,0x32,0x1c,0x30,0x36,0x9e,0x9e,0x5a,0xe1,0xe1,0x21,0x1b,0xa0,0x99,0x0c,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x4b,0x0d,0x49, +0x35,0x01,0x43,0x52,0x9b,0x9b,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x23,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0xff,0xff,0x00,0x2f,0xff,0x10,0x02,0x08,0x02,0xc1,0x02,0x26,0x01,0x4c,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x94,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x26,0x00,0x11,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x01, +0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x05,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x2b,0x5f,0x72,0x5a,0x40,0x37,0x38,0x41,0x5a,0x74,0x0a,0x71,0x61,0x01,0x5e, +0xfe,0xa2,0x3c,0x47,0x47,0x3c,0x01,0x5e,0xfe,0xa2,0x61,0x71,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a, +0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x68, +0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6b,0x02,0x62,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00, +0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6f,0x02,0x58,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6a,0x02,0x4e,0x00,0xe3,0x00,0x08,0xb1,0x03, +0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xcc,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x73,0x02,0x58,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x01,0xfe,0x02,0x26,0x02,0x26, +0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x39,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a, +0xff,0xf6,0x02,0x58,0x02,0x94,0x00,0x19,0x00,0x4e,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1c,0x00,0x03,0x00,0x00,0x03,0x70,0x00,0x04,0x04,0x00,0x61,0x02,0x01,0x00,0x00,0x3b,0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x00,0x03,0x85,0x00,0x04,0x04,0x00,0x61,0x02,0x01,0x00,0x00,0x3b,0x4d, +0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x09,0x23,0x13,0x12,0x23,0x23,0x11,0x06,0x09,0x1c,0x2b,0x37,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x11,0x14,0x06,0x23,0x22,0x26,0x5a,0x5a,0x40,0x37,0x38,0x41,0x46,0x23,0x4b,0x2b,0x2f,0x74,0x5f,0x5f, +0x72,0xc8,0x01,0x5e,0xfe,0xa2,0x3e,0x45,0x45,0x3e,0x01,0x5e,0x23,0x4b,0x50,0x2b,0x34,0xfe,0xe3,0x61,0x71,0x71,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x58,0x02,0x94,0x02,0x26,0x01,0x5e,0x00,0x00, +0x00,0x07,0x06,0x78,0x02,0x57,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x39,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58, +0x03,0x0c,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6c,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe9,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00, +0x00,0x01,0x00,0x5a,0xff,0x35,0x01,0xfe,0x02,0x26,0x00,0x1f,0x00,0x56,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x05,0x05,0x00,0x60,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x19,0x00,0x05,0x06,0x01,0x00,0x05,0x00,0x64,0x04,0x01,0x02,0x02, +0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x13,0x01,0x00,0x1e,0x1c,0x13,0x12,0x10,0x0e,0x0c,0x0b,0x08,0x06,0x00,0x1f,0x01,0x1f,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x07,0x07,0x06,0x06,0x15,0x14, +0x16,0x33,0x33,0x15,0x01,0x74,0x37,0x43,0x19,0x22,0x09,0x62,0x70,0x5a,0x78,0x78,0x5a,0x57,0x18,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x16,0x2f,0x1f,0x70,0x62,0x01,0x5e,0xfe,0xa2,0x82,0x82,0x01,0x5e,0xfe,0xa2,0x7f,0x34,0x14,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x44,0x02,0x26, +0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x71,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x0c,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0x26,0x00,0x0c,0x00,0x21,0x40,0x1e,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d, +0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xf1,0xbb,0x61,0x78,0x0b,0x10,0x04,0x05,0x0e,0x0a,0x78,0x5f,0xbb,0x02,0x26,0xfe,0x8e,0x21,0x3d,0x11,0x11,0x3d,0x21,0x01,0x72,0xfd,0xda,0x00,0x00,0x01,0x00,0x1f, +0x00,0x00,0x02,0x39,0x02,0x26,0x00,0x1e,0x00,0x27,0x40,0x24,0x1a,0x0f,0x06,0x03,0x03,0x00,0x01,0x4c,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x1e,0x00,0x1e,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16, +0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x79,0x5a,0x4e,0x38,0x03,0x06,0x01,0x02,0x05,0x04,0x45,0x5a,0x45,0x04,0x07,0x01,0x02,0x06,0x03,0x3a,0x4a,0x5e,0x63,0x3f,0x04,0x07,0x02,0x01,0x08,0x05,0x42,0x02,0x26,0xfe,0x7c,0x16,0x35,0x11,0x11,0x35,0x16,0x01,0x84,0xfe,0x7c,0x16,0x35,0x11, +0x11,0x35,0x16,0x01,0x84,0xfd,0xda,0x01,0x7c,0x1c,0x3f,0x11,0x11,0x3f,0x1c,0xfe,0x84,0x00,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6e, +0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x09,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x00,0x17, +0x00,0x26,0x40,0x23,0x13,0x0d,0x07,0x01,0x04,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x18,0x12,0x05,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x13,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07, +0x32,0xc3,0xb7,0x6a,0x6d,0x07,0x0d,0x04,0x03,0x0d,0x07,0x6d,0x6a,0xb7,0xc2,0x6a,0x76,0x07,0x0d,0x05,0x04,0x0f,0x08,0x76,0x01,0x1b,0x01,0x0b,0xaa,0x0b,0x1a,0x08,0x08,0x1a,0x0b,0xaa,0xfe,0xf4,0xfe,0xe6,0xb4,0x0b,0x1d,0x09,0x09,0x1d,0x0b,0xb4,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x0d,0x00,0x22,0x40,0x1f, +0x07,0x01,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d,0x03,0x01,0x02,0x02,0x3d,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x18,0x12,0x04,0x09,0x18,0x2b,0x17,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x01,0xb2,0x51,0xcd,0x61,0x82,0x08,0x0e,0x03,0x03,0x0e,0x07,0x79,0x5f,0xfe,0xee,0xb4,0xd6,0x02, +0x04,0xfe,0xac,0x14,0x2c,0x10,0x10,0x2c,0x14,0x01,0x54,0xfd,0x26,0x00,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00, +0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x09,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x2b,0x02,0x22,0x02,0x26,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0xf8,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00, +0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x39,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0xe9,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22, +0x03,0x0c,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0x26,0x00,0x09,0x00,0x2c,0x40,0x29,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00, +0x09,0x00,0x09,0x12,0x11,0x12,0x05,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x5a,0x01,0x34,0xfe,0xd4,0x01,0x91,0xfe,0xc6,0x01,0x45,0x5a,0x01,0x7a,0x52,0x5a,0xfe,0x86,0x52,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00, +0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x1c,0x02,0xda,0x02,0x06,0x00,0x87,0x00,0x00, +0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x09,0x00,0x27,0x40,0x24,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x41, +0xc8,0xb4,0x01,0x0e,0xc8,0x52,0x02,0x36,0x52,0xfd,0x78,0x52,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0x2b,0x03,0xb6,0x02,0x26,0x01,0x7e,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x53,0x00,0x00,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0x2b,0x02,0xda,0x02,0x26,0x01,0x7e,0x00,0x00,0x00,0x07,0x06,0x6d,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x41, +0xff,0x10,0x02,0x2b,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x5d,0x00,0x00,0x02,0x06,0x01,0x7e,0x00,0x00,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0xa7,0x02,0xda,0x00,0x27,0x03,0x29,0x01,0x29,0x01,0x13,0x03,0x06,0x01,0x7e,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x2b, +0x02,0xda,0x00,0x11,0x00,0x34,0x40,0x31,0x0e,0x0d,0x0c,0x0b,0x06,0x05,0x04,0x03,0x08,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x15,0x11,0x15,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33,0x35,0x07,0x35, +0x37,0x35,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x11,0x33,0x15,0x41,0xc8,0x8c,0x8c,0xb4,0x01,0x0e,0x8c,0x8c,0xc8,0x52,0xf3,0x5f,0x50,0x5f,0xf3,0x52,0xfe,0xf7,0x5f,0x50,0x5f,0xfe,0xd1,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0xf6,0x02,0x24,0x02,0xc1,0x00,0x19,0x00,0x3f,0x40,0x3c,0x00,0x03,0x02,0x03,0x85,0x00,0x07,0x01, +0x06,0x01,0x07,0x06,0x80,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x16,0x14,0x12,0x10,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x19,0x01,0x19,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15, +0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x70,0x54,0x63,0x96,0x96,0x5a,0xe1,0xe1,0x32,0x2b,0x2b,0x31,0x58,0x61,0x0a,0x62,0x54,0x01,0x28,0x52,0x9b,0x9b,0x52,0xfe,0xd8,0x2f,0x37,0x37,0x2f,0x03,0x03,0x54,0x62,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0xf6,0x02,0x24,0x02,0xc1,0x00,0x21, +0x00,0x48,0x40,0x45,0x00,0x03,0x02,0x03,0x85,0x00,0x09,0x07,0x08,0x07,0x09,0x08,0x80,0x06,0x01,0x00,0x0c,0x0b,0x02,0x07,0x09,0x00,0x07,0x67,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x08,0x08,0x0a,0x61,0x00,0x0a,0x0a,0x3f,0x0a,0x4e,0x00,0x00,0x00,0x21,0x00,0x21,0x1e,0x1c,0x19,0x17,0x23,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x55,0x64,0x96,0x96,0x5a,0xe1,0xe1,0xc8,0xc8,0x32,0x2b,0x2b,0x31,0x58,0x61,0x53,0x54,0x63,0xef,0x4b, +0x9a,0x52,0x9b,0x9b,0x52,0x9a,0x4b,0x43,0x2f,0x37,0x37,0x2f,0x03,0x03,0x54,0x62,0x62,0x54,0x43,0x00,0xff,0xff,0x00,0x23,0xff,0xf6,0x02,0x24,0x03,0x21,0x02,0x26,0x01,0x84,0x00,0x00,0x01,0x07,0x06,0x6d,0x02,0x12,0x00,0x47,0x00,0x08,0xb1,0x01,0x01,0xb0,0x47,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0x35,0x02,0x24, +0x02,0xc1,0x00,0x2d,0x00,0x98,0x40,0x0a,0x09,0x01,0x09,0x07,0x26,0x01,0x01,0x09,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x04,0x03,0x04,0x85,0x00,0x08,0x02,0x07,0x02,0x08,0x07,0x80,0x00,0x01,0x09,0x00,0x09,0x01,0x72,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x09,0x61,0x00,0x09, +0x09,0x3f,0x4d,0x00,0x00,0x00,0x0a,0x5f,0x0b,0x01,0x0a,0x0a,0x3d,0x0a,0x4e,0x1b,0x40,0x34,0x00,0x04,0x03,0x04,0x85,0x00,0x08,0x02,0x07,0x02,0x08,0x07,0x80,0x00,0x01,0x09,0x00,0x09,0x01,0x00,0x80,0x00,0x00,0x0b,0x01,0x0a,0x00,0x0a,0x63,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x09,0x61, +0x00,0x09,0x09,0x3f,0x09,0x4e,0x59,0x40,0x14,0x00,0x00,0x00,0x2d,0x00,0x2c,0x25,0x22,0x22,0x23,0x11,0x11,0x11,0x11,0x15,0x14,0x21,0x0c,0x09,0x1f,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14, +0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0x01,0x09,0x46,0x16,0x1b,0x37,0x32,0x19,0x38,0x3f,0x96,0x96,0x5a,0xe1,0xe1,0x32,0x2b,0x2b,0x31,0x58,0x61,0x53,0x05,0x04,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x44,0x10,0x5a,0x43,0x01,0x28,0x52,0x9b,0x9b,0x52,0xfe,0xd8,0x2f,0x37,0x37,0x2f,0x03, +0x03,0x54,0x62,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x10,0x02,0x24,0x02,0xc1,0x02,0x26,0x01,0x84,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x94,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0x42,0x02,0x46,0x02,0x30,0x00,0x26,0x00,0x32,0x00,0x40,0x00,0xd1,0x40,0x0a,0x08,0x01,0x04,0x06,0x07,0x01,0x09,0x05, +0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2a,0x0b,0x01,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09,0x67,0x07,0x01,0x03,0x03,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0c,0x01,0x08,0x08,0x00,0x5f,0x0a,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x4b,0xb0,0x31,0x50,0x58,0x40,0x32,0x0b,0x01,0x06,0x00,0x04, +0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09,0x67,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x0c,0x01,0x08,0x08,0x00,0x5f,0x0a,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x2f,0x0b,0x01,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09, +0x67,0x0c,0x01,0x08,0x0a,0x01,0x00,0x08,0x00,0x63,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x3b,0x03,0x4e,0x59,0x59,0x40,0x23,0x35,0x33,0x28,0x27,0x01,0x00,0x3c,0x39,0x33,0x40,0x35,0x40,0x2e,0x2c,0x27,0x32,0x28,0x32,0x1f,0x1d,0x1b,0x19,0x13,0x12,0x11,0x10,0x0f,0x0d,0x00, +0x26,0x01,0x25,0x0d,0x09,0x16,0x2b,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x15,0x23,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x23,0x15,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x33,0x32,0x36,0x35,0x34, +0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0xe2,0x33,0x50,0x2d,0x51,0x40,0x34,0x3a,0x6e,0x5e,0x2e,0x19,0xde,0xb9,0x29,0x33,0x6c,0x5c,0x09,0x08,0x77,0x34,0x4f,0x2e,0x2e,0x4f,0x34,0x66,0x38,0x40,0x40,0x38,0x38,0x42,0x42,0x07,0xa6,0x26,0x31,0x31,0x26,0xa6,0x25,0x32,0x32,0xbe,0x29,0x49,0x30,0x42,0x57,0x0a,0x5f,0x13,0x50,0x39, +0x50,0x5e,0x0a,0x4a,0x01,0x05,0x2d,0x30,0x4b,0x57,0x4e,0x2a,0x4a,0x31,0x30,0x49,0x29,0x01,0xdc,0x36,0x2e,0x2e,0x36,0x36,0x2e,0x2e,0x36,0xfe,0x72,0x30,0x27,0x27,0x30,0x30,0x27,0x27,0x30,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00, +0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00, +0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x70,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x76,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x09,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x01,0xfe, +0x03,0x09,0x02,0x26,0x01,0x91,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xe3,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x42,0x01,0xee,0x02,0x26,0x00,0x15,0x00,0x58,0x4b,0xb0,0x31,0x50,0x58,0x40,0x1e,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00, +0x3d,0x00,0x4e,0x1b,0x40,0x1b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x02,0x05,0x01,0x00,0x02,0x00,0x65,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x03,0x4e,0x59,0x40,0x11,0x01,0x00,0x11,0x10,0x0f,0x0e,0x0b,0x09,0x06,0x05,0x00,0x15,0x01,0x15,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x33,0x15,0x14,0x16, +0x33,0x32,0x36,0x35,0x11,0x21,0x35,0x21,0x11,0x14,0x06,0x06,0x01,0x24,0x3c,0x5b,0x33,0x5a,0x3f,0x31,0x32,0x3e,0xfe,0xf3,0x01,0x67,0x33,0x5b,0xbe,0x32,0x58,0x3a,0x4a,0x4a,0x34,0x40,0x40,0x34,0x01,0xce,0x52,0xfd,0xe0,0x3a,0x58,0x32,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x02,0x6c,0x03,0x11,0x02,0x26,0x01,0x91,0x00,0x00, +0x00,0x07,0x06,0x6e,0x02,0xe3,0x00,0x00,0x00,0x01,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x13,0x00,0x32,0x40,0x2f,0x00,0x04,0x01,0x03,0x01,0x04,0x03,0x80,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04, +0x00,0x13,0x01,0x13,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x60,0x58,0x67,0xa6,0x01,0x00,0x36,0x2f,0x2f,0x36,0x5a,0x66,0x0a,0x66,0x57,0x01,0xd5,0x52,0xfd,0xd9,0x31,0x3c,0x3c,0x31,0x4b,0x4b,0x57,0x66,0x00,0x00,0x00,0xff,0xff,0xff,0xfb, +0xff,0xf6,0x02,0x1f,0x03,0xb6,0x02,0x26,0x01,0x93,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x30,0x00,0x00,0xff,0xff,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x27,0x06,0x6d,0x02,0x58,0x00,0x00,0x02,0x06,0x01,0x93,0x00,0x00,0xff,0xff,0xff,0xfb,0xff,0x10,0x02,0x1f,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x5d,0x00,0x00,0x02,0x06, +0x01,0x93,0x00,0x00,0x00,0x02,0xff,0xfb,0xff,0xf6,0x02,0x4d,0x02,0xda,0x00,0x13,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x04,0x05,0x03,0x05,0x04,0x03,0x80,0x00,0x06,0x08,0x01,0x05,0x04,0x06,0x05,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x15,0x14,0x01, +0x00,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x61,0x58,0x68,0xa6,0x01,0x00,0x37,0x2f, +0x2f,0x37,0x5a,0x67,0x41,0x25,0x2d,0x2d,0x25,0x25,0x2d,0x2d,0x0a,0x66,0x57,0x01,0xd5,0x52,0xfd,0xd9,0x31,0x3a,0x3a,0x31,0x29,0x29,0x57,0x66,0x01,0x23,0x2c,0x23,0x25,0x2e,0x2e,0x25,0x23,0x2c,0x00,0x00,0x00,0x01,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x1b,0x00,0x38,0x40,0x35,0x1b,0x0a,0x09,0x08,0x07,0x02,0x01,0x07, +0x03,0x00,0x00,0x01,0x02,0x03,0x02,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x3f,0x04,0x4e,0x23,0x13,0x27,0x11,0x13,0x05,0x09,0x1b,0x2b,0x37,0x35,0x37,0x35,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0x35, +0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x23,0x7e,0xa6,0x01,0x00,0x9a,0x9a,0x36,0x2f,0x2f,0x36,0x5a,0x66,0x59,0x58,0x67,0xe6,0x50,0x55,0xfd,0x52,0xfe,0xee,0x68,0x50,0x68,0xc5,0x31,0x3c,0x3c,0x31,0x4b,0x4b,0x57,0x66,0x66,0x57,0x88,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x30,0x00,0x23,0x00,0x64,0xb6,0x0a, +0x03,0x02,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x06,0x01,0x04,0x04,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x08,0x07,0x02,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x21,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x00,0x00,0x00,0x3b,0x4d,0x06,0x01,0x04,0x04,0x01,0x61, +0x02,0x01,0x01,0x01,0x41,0x4d,0x08,0x07,0x02,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x10,0x00,0x00,0x00,0x23,0x00,0x23,0x23,0x13,0x23,0x13,0x24,0x24,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x33,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34, +0x26,0x23,0x22,0x06,0x15,0x11,0x3c,0x51,0x02,0x01,0x05,0x2e,0x25,0x24,0x32,0x0b,0x07,0x31,0x26,0x35,0x40,0x56,0x1d,0x1a,0x1b,0x20,0x50,0x1f,0x1a,0x1a,0x1f,0x02,0x26,0x49,0x26,0x2d,0x29,0x23,0x23,0x29,0x4f,0x3f,0xfe,0x5e,0x01,0xa3,0x21,0x27,0x26,0x21,0xcd,0xcc,0x21,0x27,0x26,0x21,0xfe,0x5c,0x00,0x00,0x00,0x01,0x00,0x22, +0x00,0x00,0x02,0x36,0x02,0x26,0x00,0x18,0x00,0x2e,0x40,0x2b,0x17,0x0f,0x06,0x03,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x02,0x01,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36, +0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x03,0x6c,0x4a,0x52,0x2f,0x03,0x06,0x01,0x02,0x08,0x06,0x45,0x58,0x43,0x05,0x0c,0x01,0x02,0x06,0x03,0x2e,0x4e,0x4b,0x67,0x57,0x5a,0x02,0x26,0xfe,0x84,0x16,0x39,0x0b,0x0b,0x39,0x16,0x01,0x0f,0xfe,0xf1,0x16,0x37,0x0c,0x0c,0x37,0x16,0x01,0x7c, +0xfd,0xda,0x01,0x5f,0xfe,0xa1,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36, +0x03,0x09,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0xda,0x00,0x03,0x00,0x09,0x00,0x2f,0x40,0x2c,0x08,0x05,0x02,0x01,0x02,0x01, +0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x05,0x03,0x04,0x03,0x01,0x01,0x39,0x01,0x4e,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x33,0x11,0x33,0x11,0x21,0x03,0x13,0x33,0x03,0x13,0x64,0x5a,0x01,0x04,0xf6,0xe6,0x71,0xe5,0xf9,0x02,0xda,0xfd,0x26,0x01,0x22, +0x01,0x04,0xfe,0xfd,0xfe,0xdd,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x10,0x02,0x37,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x58,0x00,0x00,0x02,0x06,0x01,0x9f,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x02,0x06,0x02,0x4b,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x09,0x02,0xda,0x00,0x16,0x00,0x35,0x40,0x32, +0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x07,0x01,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x11,0x11,0x12,0x21,0x23,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15, +0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x41,0x9b,0x9b,0x9b,0x52,0x48,0x93,0x93,0x40,0xd3,0xd3,0xd3,0x52,0x01,0x39,0x50,0x75,0x41,0x49,0x50,0x3a,0x75,0x50,0xfe,0xc7,0x52,0x00,0x01,0x00,0x46,0x00,0x00,0x02,0x23,0x02,0x27,0x00,0x14,0x00,0x6e,0x4b,0xb0,0x1e,0x50,0x58,0xb5,0x07,0x01,0x00,0x01,0x01,0x4c,0x1b,0xb5, +0x07,0x01,0x00,0x04,0x01,0x4c,0x59,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x19,0x04,0x01,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d,0x05,0x01,0x00,0x00,0x06,0x5f,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x40,0x23,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d,0x00,0x04,0x04,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d, +0x05,0x01,0x00,0x00,0x06,0x5f,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x59,0x40,0x0f,0x00,0x00,0x00,0x14,0x00,0x14,0x13,0x21,0x24,0x11,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x15,0x33,0x36,0x36,0x37,0x37,0x15,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x46,0x91,0x87,0xda,0x01,0x0d,0x4e,0x39,0x64,0x63,0x42, +0x4d,0xd3,0x52,0x01,0x82,0x52,0x88,0x3e,0x49,0x01,0x01,0x5b,0x43,0x3a,0xfd,0x52,0xff,0xff,0x00,0x46,0x00,0x00,0x02,0x23,0x03,0x11,0x00,0x27,0x06,0x6b,0x02,0x76,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00,0xff,0xff,0x00,0x46,0x00,0x00,0x02,0x23,0x03,0x11,0x00,0x27,0x06,0x6f,0x02,0x6c,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00, +0xff,0xff,0x00,0x46,0xff,0x10,0x02,0x23,0x02,0x27,0x00,0x27,0x06,0x7a,0x02,0x1c,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x15,0x00,0x22,0x40,0x1f,0x0b,0x05,0x02,0x00,0x01,0x01,0x4c,0x02,0x01,0x01,0x01,0x3b,0x4d,0x00,0x00,0x00,0x03,0x60,0x00,0x03,0x03,0x3d,0x03,0x4e, +0x23,0x18,0x14,0x20,0x04,0x09,0x1a,0x2b,0x17,0x33,0x32,0x36,0x37,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x06,0x06,0x23,0x23,0x42,0x66,0x19,0x25,0x0b,0x12,0xcd,0x61,0x82,0x07,0x0f,0x03,0x03,0x0e,0x07,0x79,0x5f,0xdb,0x13,0x4c,0x31,0x75,0x61,0x1e,0x19,0x2a,0x02,0x26,0xfe,0x8a,0x14,0x2c,0x10,0x10, +0x2c,0x14,0x01,0x76,0xfd,0x9a,0x37,0x3d,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22, +0x03,0x09,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x2b,0x02,0x22,0x02,0x26,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0xf8,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00, +0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x39,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0xe9,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x0c,0x02,0x26,0x01,0xa7,0x00,0x00, +0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x02,0x26,0x00,0x14,0x00,0x4c,0xb5,0x03,0x01,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x13,0x05,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x39,0x00,0x4e,0x1b,0x40,0x17,0x05,0x04,0x02,0x02,0x02,0x3b, +0x4d,0x00,0x00,0x00,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x01,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0xfc,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63, +0x5a,0x3f,0x36,0x38,0x41,0x02,0x26,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x14,0x00,0x18,0x00,0x6a,0xb5,0x03,0x01,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x00,0x05,0x06,0x05,0x85,0x08,0x01,0x06,0x02,0x06, +0x85,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x39,0x00,0x4e,0x1b,0x40,0x22,0x00,0x05,0x06,0x05,0x85,0x08,0x01,0x06,0x02,0x06,0x85,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x00,0x00,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x15,0x15,0x15,0x00,0x00, +0x15,0x18,0x15,0x18,0x17,0x16,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x09,0x09,0x1a,0x2b,0x01,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x27,0x37,0x33,0x07,0x01,0xfc,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0xb0,0x6a,0x61,0x6f,0x02,0x26,0xfd, +0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x5f,0x8c,0x8c,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x0d,0x00,0x22,0x00,0x7a,0xb5,0x11,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x22,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x09,0x01,0x00,0x06,0x02,0x00, +0x69,0x0a,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x62,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x0a,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x62,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x1d, +0x0e,0x0e,0x01,0x00,0x0e,0x22,0x0e,0x22,0x1f,0x1d,0x1a,0x19,0x16,0x14,0x10,0x0f,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x0b,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35, +0x11,0x01,0x2c,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x88,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x80,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x5a,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc, +0x03,0x11,0x00,0x06,0x00,0x1b,0x00,0x75,0x40,0x0a,0x05,0x01,0x01,0x00,0x0a,0x01,0x06,0x05,0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x00,0x00,0x01,0x00,0x85,0x08,0x02,0x02,0x01,0x05,0x01,0x85,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x62,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x23,0x00,0x00,0x01, +0x00,0x85,0x08,0x02,0x02,0x01,0x05,0x01,0x85,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x03,0x03,0x39,0x4d,0x00,0x06,0x06,0x04,0x62,0x00,0x04,0x04,0x3f,0x04,0x4e,0x59,0x40,0x19,0x07,0x07,0x00,0x00,0x07,0x1b,0x07,0x1b,0x18,0x16,0x13,0x12,0x0f,0x0d,0x09,0x08,0x00,0x06,0x00,0x06,0x11,0x11,0x0a,0x09,0x18,0x2b,0x13,0x37,0x33, +0x17,0x23,0x27,0x07,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x77,0x8b,0x53,0x8c,0x63,0x52,0x50,0x01,0x20,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x4e,0x4e,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e, +0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x2c,0x00,0xa2,0xb5,0x1b,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x21,0x0a,0x02,0x09,0x03,0x00,0x00,0x01,0x61,0x03,0x01,0x01,0x01,0x40,0x4d,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07, +0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x03,0x01,0x01,0x0a,0x02,0x09,0x03,0x00,0x06,0x01,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x23,0x03,0x01,0x01,0x0a,0x02,0x09,0x03,0x00,0x06,0x01,0x00,0x69,0x0b, +0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x2c,0x18,0x2c,0x29,0x27,0x24,0x23,0x20,0x1e,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35, +0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x01,0x22,0x5a,0x01,0x07,0x4c, +0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x63,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x02,0x00,0x5a,0xff,0x2b,0x01,0xfc,0x02,0x26,0x00,0x0b,0x00,0x20,0x00,0x68,0xb5,0x0f,0x01,0x05, +0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1b,0x00,0x01,0x07,0x01,0x00,0x01,0x00,0x65,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x61,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x1f,0x00,0x01,0x07,0x01,0x00,0x01,0x00,0x65,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03, +0x61,0x00,0x03,0x03,0x3f,0x03,0x4e,0x59,0x40,0x19,0x0c,0x0c,0x01,0x00,0x0c,0x20,0x0c,0x20,0x1d,0x1b,0x18,0x17,0x14,0x12,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16, +0x33,0x32,0x36,0x35,0x11,0x01,0x2c,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xaf,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x02,0xfb,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc, +0x03,0x11,0x00,0x03,0x00,0x18,0x00,0x6d,0xb5,0x07,0x01,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x04,0x01,0x85,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x62,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x22,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x04, +0x01,0x85,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x62,0x00,0x03,0x03,0x3f,0x03,0x4e,0x59,0x40,0x18,0x04,0x04,0x00,0x00,0x04,0x18,0x04,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x17,0x11,0x23,0x35,0x23,0x06,0x06, +0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x0b,0x73,0x64,0x6e,0x92,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc, +0x03,0x39,0x00,0x0e,0x00,0x23,0x00,0xa6,0xb5,0x12,0x01,0x06,0x05,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x23,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x72,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x61,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40, +0x24,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x61,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x28,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d, +0x00,0x03,0x03,0x39,0x4d,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3f,0x04,0x4e,0x59,0x59,0x40,0x19,0x0f,0x0f,0x00,0x00,0x0f,0x23,0x0f,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x0a,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x17,0x11,0x23, +0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x02,0x32,0x0e,0x20,0x50,0x69,0x26,0x2f,0x11,0x28,0xa5,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x3f,0x13,0x0d,0x14,0x41,0x27,0x23,0x20,0x16,0x34,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72, +0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x01,0x00,0x5a,0xff,0xf6,0x02,0x58,0x02,0x94,0x00,0x1c,0x00,0x8f,0xb5,0x19,0x01,0x02,0x05,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1e,0x00,0x04,0x01,0x01,0x04,0x70,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x07,0x02,0x00,0x00,0x3f, +0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x04,0x01,0x04,0x85,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x07,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x04,0x01,0x04,0x85,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00, +0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x15,0x01,0x00,0x18,0x17,0x16,0x15,0x12,0x11,0x0f,0x0d,0x0a,0x08,0x05,0x04,0x00,0x1c,0x01,0x1c,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x11,0x23,0x35,0x23, +0x06,0x06,0x01,0x0f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x48,0x23,0x4b,0x2d,0x2f,0x5a,0x01,0x07,0x4c,0x0a,0x66,0x58,0x01,0x72,0xfe,0x98,0x3a,0x40,0x44,0x40,0x01,0x5e,0x23,0x4b,0x50,0x2b,0x34,0xfe,0x1b,0x69,0x37,0x3c,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x6b, +0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x58,0x02,0x94,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x57,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x39,0x02,0x26, +0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x0c,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0x11,0x00,0x03,0x00,0x07,0x00,0x1c,0x00,0x77,0xb5,0x0b,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18, +0x50,0x58,0x40,0x1f,0x02,0x01,0x00,0x0a,0x03,0x09,0x03,0x01,0x06,0x00,0x01,0x67,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x23,0x02,0x01,0x00,0x0a,0x03,0x09,0x03,0x01,0x06,0x00,0x01,0x67,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07, +0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x20,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x1c,0x08,0x1c,0x19,0x17,0x14,0x13,0x10,0x0e,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35, +0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x46,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x01,0x12,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x8c,0x8c,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a, +0xff,0xf6,0x01,0xfc,0x02,0xe9,0x00,0x03,0x00,0x18,0x00,0x96,0xb5,0x07,0x01,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x61,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x22, +0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3f,0x03,0x4e,0x1b,0x40,0x20,0x00,0x00,0x07,0x01,0x01,0x04,0x00,0x01,0x67,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x61,0x00, +0x03,0x03,0x3f,0x03,0x4e,0x59,0x59,0x40,0x18,0x04,0x04,0x00,0x00,0x04,0x18,0x04,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x8c,0x01,0x40,0x30,0x5a, +0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x9e,0x4b,0x4b,0x78,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x35,0x02,0x20,0x02,0x26,0x00,0x23,0x00,0xa0,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0a,0x07,0x01,0x03,0x02,0x06,0x01,0x01, +0x03,0x02,0x4c,0x1b,0x40,0x0a,0x07,0x01,0x03,0x02,0x06,0x01,0x05,0x03,0x02,0x4c,0x59,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1d,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x05,0x01,0x01,0x01,0x3f,0x4d,0x00,0x06,0x06,0x00,0x5f,0x07,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x00,0x06,0x07, +0x01,0x00,0x06,0x00,0x63,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x05,0x01,0x01,0x01,0x3f,0x01,0x4e,0x1b,0x40,0x1e,0x00,0x06,0x07,0x01,0x00,0x06,0x00,0x63,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x05,0x05,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x59,0x40,0x15,0x01,0x00,0x22,0x20, +0x1b,0x1a,0x19,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x00,0x23,0x01,0x23,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0xd2,0x37,0x43,0x21,0x29,0x01,0x07,0x4c,0x3f, +0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x5a,0x10,0x21,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1b,0x37,0x1e,0x67,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0xfd,0xda,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x44,0x00,0x0b,0x00,0x17,0x00,0x2c,0x00,0x84,0xb5,0x1b, +0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x25,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x29,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09, +0x01,0x00,0x06,0x02,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x2c,0x18,0x2c,0x29,0x27,0x24,0x23,0x20,0x1e,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09, +0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x2c,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21, +0xeb,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x60,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x6f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x0c,0x00,0x19, +0x00,0x2e,0x00,0xfc,0xb5,0x1d,0x01,0x09,0x08,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2a,0x00,0x01,0x01,0x03,0x61,0x05,0x01,0x03,0x03,0x40,0x4d,0x02,0x0b,0x02,0x00,0x00,0x04,0x61,0x00,0x04,0x04,0x38,0x4d,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x09,0x09,0x06,0x61,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x4b,0xb0,0x18, +0x50,0x58,0x40,0x28,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x02,0x0b,0x02,0x00,0x00,0x04,0x61,0x00,0x04,0x04,0x38,0x4d,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x09,0x09,0x06,0x61,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2a,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02, +0x0b,0x02,0x00,0x08,0x04,0x00,0x6a,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00,0x09,0x09,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x40,0x38,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x0b,0x01,0x00,0x08,0x04, +0x00,0x6a,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00,0x09,0x09,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x59,0x59,0x40,0x21,0x1a,0x1a,0x01,0x00,0x1a,0x2e,0x1a,0x2e,0x2b,0x29,0x26,0x25,0x22,0x20,0x1c,0x1b,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0d,0x09,0x16,0x2b, +0x01,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31, +0x61,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x8a,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x64,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x2e,0x02,0xe4,0x00,0x17, +0x00,0x3d,0x40,0x3a,0x00,0x01,0x02,0x03,0x02,0x01,0x03,0x80,0x07,0x01,0x03,0x06,0x01,0x04,0x05,0x03,0x04,0x67,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x3e,0x4d,0x00,0x05,0x05,0x39,0x05,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x08,0x06,0x04,0x03,0x00,0x17,0x01,0x17,0x09,0x09,0x16,0x2b,0x01, +0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x01,0x75,0x53,0x66,0x58,0x36,0x2b,0x2b,0x37,0xe1,0xe1,0x5a,0x96,0x96,0x68,0x02,0xe4,0x62,0x54,0x2f,0x37,0x37,0x2f,0x8f,0x52,0xfe,0xb3,0x01,0x4d,0x52,0x8f,0x54,0x62,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x09, +0x02,0xda,0x00,0x16,0x00,0x37,0x40,0x34,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x06,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x3b,0x4d,0x07,0x01,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x11,0x11,0x12,0x21,0x23,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33, +0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x41,0x9b,0x9b,0x9b,0x52,0x48,0x93,0x93,0x40,0xd3,0xd3,0xd3,0x52,0x01,0x84,0x50,0x2a,0x41,0x49,0x50,0x3a,0x2a,0x50,0xfe,0x7c,0x52,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x12,0x00,0x2f,0x40,0x2c, +0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x05,0x01,0x00,0x00,0x01,0x5f,0x04,0x01,0x01,0x01,0x3b,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x12,0x21,0x23,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11, +0xd7,0xa0,0xa0,0x52,0x48,0xa1,0xa1,0x40,0xe1,0xe1,0x01,0xd4,0x52,0x28,0x41,0x4b,0x52,0x3a,0x28,0x52,0xfe,0x2c,0x00,0x00,0x00,0x02,0x00,0xaf,0x01,0xc2,0x01,0xa4,0x02,0xe4,0x00,0x1b,0x00,0x25,0x00,0x8f,0xb5,0x18,0x01,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x04, +0x00,0x02,0x03,0x04,0x02,0x69,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x09,0x01,0x06,0x00,0x00,0x06,0x59,0x09,0x01,0x06,0x06,0x00,0x61,0x05,0x08,0x02,0x00,0x06,0x00,0x51,0x1b,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x05,0x06,0x00,0x06,0x05,0x00,0x80,0x00,0x04,0x00,0x02,0x03,0x04,0x02,0x69,0x00,0x01,0x00, +0x07,0x06,0x01,0x07,0x67,0x09,0x01,0x06,0x05,0x00,0x06,0x59,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x06,0x00,0x51,0x59,0x40,0x1b,0x1d,0x1c,0x01,0x00,0x22,0x20,0x1c,0x25,0x1d,0x25,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x1b,0x01,0x1b,0x0a,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35, +0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x15,0x14,0x16,0x01,0x12,0x2d,0x36,0x38,0x31,0x5a,0x23,0x1e,0x1a,0x24,0x03,0x32,0x05,0x3d,0x31,0x35,0x3e,0x2f,0x03,0x0a,0x33,0x16,0x27,0x2c,0x5a,0x37,0x22,0x01,0xc2,0x2f,0x27,0x27,0x2e,0x1d, +0x17,0x1b,0x16,0x12,0x26,0x2a,0x30,0x2a,0xc3,0x37,0x1c,0x20,0x26,0x24,0x1f,0x1a,0x2d,0x16,0x1a,0x00,0x00,0x02,0x00,0xb9,0x01,0xbd,0x01,0x9f,0x02,0xdf,0x00,0x0d,0x00,0x1b,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00, +0x51,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x34,0x3f,0x3f,0x34,0x34,0x3f,0x3f,0x34,0x1d,0x24,0x24,0x1d,0x1d, +0x24,0x24,0x01,0xbd,0x3a,0x2f,0x50,0x2f,0x3a,0x3a,0x2f,0x50,0x2f,0x3a,0x28,0x24,0x1d,0x50,0x1d,0x24,0x24,0x1d,0x50,0x1d,0x24,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x0c,0x00,0x15,0x00,0x31,0x40,0x2e,0x00,0x02, +0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x15,0x13,0x0f,0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x11,0x07,0x07,0x19,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34, +0x26,0x23,0x23,0x5e,0x01,0x96,0xfe,0xc4,0x79,0x68,0x79,0x79,0x68,0x79,0x79,0x3e,0x46,0x46,0x3e,0x79,0x02,0xda,0x52,0xd8,0x76,0x62,0x61,0x77,0x52,0x49,0x3d,0x3e,0x48,0x00,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x12,0x02,0xda,0x02,0x06,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x05, +0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x07,0x18,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x82,0x01,0xa9,0xfe,0xb1,0x02,0xda,0x52,0xfd,0x78,0x00,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x2b,0x03,0xb6,0x02,0x26, +0x01,0xcb,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x76,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x2b,0x03,0x39,0x00,0x07,0x00,0x47,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85, +0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x35,0x33,0x15,0x21,0x11,0x82,0x01,0x54,0x55,0xfe,0xb1,0x02,0xda,0x5f,0xb1,0xfd,0x78,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0xff,0x74,0x02,0x3f, +0x02,0xda,0x00,0x0e,0x00,0x15,0x00,0x33,0x40,0x30,0x08,0x05,0x02,0x03,0x00,0x03,0x53,0x00,0x07,0x07,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x02,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x00,0x0e,0x00,0x0e,0x11,0x11,0x11,0x14,0x11,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x36,0x36, +0x37,0x13,0x21,0x11,0x33,0x15,0x23,0x35,0x21,0x15,0x37,0x33,0x11,0x23,0x03,0x06,0x06,0x19,0x2d,0x11,0x24,0x01,0x07,0x01,0x76,0x46,0x50,0xfe,0x7a,0x3b,0xfb,0xc6,0x05,0x01,0x20,0x8c,0xd9,0x1e,0x79,0x46,0x01,0xb0,0xfd,0x73,0xd9,0x8c,0x8c,0xd9,0x02,0x3d,0xfe,0xa0,0x4d,0x76,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08, +0x02,0xda,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x02,0x52,0x02,0xda,0x00,0x15,0x00,0x36,0x40,0x33,0x0c,0x01,0x02,0x06,0x01,0x01,0x4c,0x03,0x01,0x01,0x08,0x01,0x06,0x05,0x01,0x06, +0x67,0x04,0x02,0x02,0x00,0x00,0x1a,0x4d,0x0a,0x09,0x07,0x03,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x15,0x00,0x15,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x0b,0x07,0x1f,0x2b,0x33,0x13,0x03,0x33,0x13,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x23,0x03,0x23,0x11,0x23,0x11,0x23,0x03,0x06,0x86,0x7c,0x5e,0x6a,0x2e, +0x4c,0x30,0x68,0x5e,0x7d,0x87,0x5d,0x75,0x2e,0x4c,0x30,0x74,0x01,0x7b,0x01,0x5f,0xfe,0xc1,0x01,0x3f,0xfe,0xc1,0x01,0x3f,0xfe,0xa0,0xfe,0x86,0x01,0x57,0xfe,0xa9,0x01,0x57,0xfe,0xa9,0x00,0x01,0x00,0x34,0xff,0xf6,0x02,0x16,0x02,0xe4,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x26,0x01,0x03,0x04,0x01,0x4c,0x00,0x06,0x05,0x04,0x05,0x06, +0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x1f,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x20,0x1e,0x1b,0x1a,0x18,0x16,0x12,0x10,0x0f,0x0d,0x09,0x07,0x05,0x04,0x00,0x2d,0x01,0x2d,0x09,0x07,0x16,0x2b, +0x05,0x22,0x26,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x23,0x46,0x6b,0x3d,0x01,0x5a,0x02,0x53,0x41,0x43,0x53,0x53,0x43,0x56,0x57,0x39,0x47, +0x46,0x38,0x3b,0x4a,0x5a,0x39,0x64,0x42,0x40,0x61,0x37,0x41,0x34,0x3e,0x4e,0x3d,0x6e,0x0a,0x35,0x5f,0x3e,0x3a,0x48,0x4b,0x3c,0x3c,0x4b,0x50,0x44,0x36,0x35,0x41,0x48,0x3a,0x3f,0x5e,0x35,0x30,0x55,0x38,0x3c,0x5b,0x0d,0x03,0x0b,0x67,0x47,0x3e,0x5e,0x35,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x11, +0x00,0x24,0x40,0x21,0x10,0x07,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1a,0x4d,0x04,0x03,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x06,0x07,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x36,0x37,0x03,0x5a,0x57,0x03,0x04,0x02,0xde,0x78,0x57, +0x03,0x05,0x02,0xdf,0x02,0xda,0xfe,0x66,0x24,0x51,0x49,0x19,0x02,0x71,0xfd,0x26,0x01,0x9a,0x25,0x51,0x49,0x18,0xfd,0x8f,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x01,0xd3,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0x51,0x00,0x00, +0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x03,0xb6,0x02,0x26,0x00,0x51,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x14,0xff,0xfb,0x01,0xfa,0x02,0xda,0x00,0x0f,0x00,0x4d,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x17,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x00,0x00,0x02,0x61,0x05,0x04,0x02,0x02, +0x02,0x1b,0x02,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x22,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x0f,0x00,0x0e,0x11,0x11,0x13,0x21,0x06,0x07,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x23,0x11,0x23,0x03, +0x06,0x06,0x23,0x14,0x12,0x2c,0x27,0x01,0x08,0x01,0x78,0x5a,0xc5,0x07,0x02,0x51,0x56,0x05,0x54,0x4f,0x60,0x01,0xdc,0xfd,0x26,0x02,0x88,0xfe,0x76,0x86,0x7d,0x00,0xff,0xff,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0xda,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x02,0x06,0x00,0x40,0x00,0x00, +0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x02,0x06,0x00,0x60,0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x01,0xfa,0x02,0xda,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33, +0x11,0x21,0x11,0x23,0x11,0x23,0x11,0x5e,0x01,0x9c,0x5a,0xe8,0x02,0xda,0xfd,0x26,0x02,0x88,0xfd,0x78,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x7a,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x02,0x06,0x00,0x1b,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x02,0xda,0x02,0x06, +0x00,0x89,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x22,0x40,0x1f,0x07,0x01,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1a,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x18,0x12,0x04,0x07,0x18,0x2b,0x33,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13, +0x33,0x01,0xbf,0x4a,0xd7,0x62,0x83,0x0d,0x10,0x02,0x02,0x0e,0x0b,0x73,0x62,0xfe,0xf9,0xbd,0x02,0x1d,0xfe,0x9b,0x22,0x3d,0x0f,0x0f,0x3d,0x22,0x01,0x65,0xfd,0x26,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x01,0xdf,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x2e,0xff,0xe7,0x02,0x2a, +0x03,0x02,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0xb2,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x2c,0x00,0x02,0x01,0x01,0x02,0x70,0x0a,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x1b,0x4b,0xb0, +0x11,0x50,0x58,0x40,0x2b,0x00,0x02,0x01,0x01,0x02,0x70,0x0a,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x1b,0x40,0x2a,0x00,0x02,0x01,0x02,0x85,0x0a,0x01,0x05,0x00,0x05,0x86,0x03,0x01, +0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x59,0x59,0x40,0x1a,0x18,0x18,0x00,0x00,0x27,0x26,0x21,0x20,0x18,0x1f,0x18,0x1f,0x1a,0x19,0x00,0x17,0x00,0x17,0x17,0x11,0x11,0x17,0x11,0x0c,0x07,0x1b,0x2b,0x17,0x35,0x22,0x26, +0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x35,0x33,0x15,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x15,0x27,0x11,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0xff,0x3c,0x5e,0x37,0x36,0x5f,0x3c,0x5a,0x3d,0x5e,0x36,0x37,0x5e,0x3c,0x56,0x38,0x49,0x49,0x8a,0x38,0x49,0x49,0x38,0x19,0x50,0x34,0x5d,0x3f, +0xdb,0x41,0x5f,0x35,0x4b,0x4b,0x35,0x5f,0x41,0xdb,0x3f,0x5d,0x34,0x50,0x9c,0x01,0xe8,0x49,0x40,0xdb,0x3d,0x47,0x47,0x3d,0xdb,0x40,0x49,0x00,0xff,0xff,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xa7,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x01,0xf9,0x02,0xda,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x02,0x00,0x00, +0x04,0x02,0x00,0x67,0x03,0x01,0x01,0x01,0x1a,0x4d,0x05,0x01,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x21,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x01,0x9f,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x01,0x0f,0x60,0x54,0x01,0x17,0xfe, +0xe9,0x30,0x34,0x01,0x7b,0xfd,0x26,0x00,0x00,0x01,0x00,0x5e,0xff,0x74,0x02,0x35,0x02,0xda,0x00,0x0b,0x00,0x29,0x40,0x26,0x06,0x01,0x05,0x02,0x05,0x54,0x03,0x01,0x01,0x01,0x1a,0x4d,0x04,0x01,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x05, +0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0xe5,0xfe,0x79,0x5a,0xd8,0x5a,0x4b,0x8c,0x8c,0x02,0xda,0xfd,0x76,0x02,0x8a,0xfd,0x76,0xdc,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x25,0x40,0x22,0x04,0x02,0x02,0x00,0x00,0x1a,0x4d,0x03,0x01,0x01,0x01,0x05,0x60,0x06,0x01,0x05, +0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x03,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x3e,0x02,0x55,0x77,0x4a,0x76,0x54,0x02,0xda,0xfd,0x74,0x02,0x8c,0xfd,0x74,0x02,0x8c,0xfd,0x26,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x74,0x02,0x53,0x02,0xda,0x00,0x0f, +0x00,0x2d,0x40,0x2a,0x08,0x01,0x07,0x02,0x07,0x54,0x05,0x03,0x02,0x01,0x01,0x1a,0x4d,0x06,0x04,0x02,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x02, +0x03,0xfe,0x39,0x51,0x78,0x46,0x78,0x51,0x3f,0x8c,0x8c,0x02,0xda,0xfd,0x74,0x02,0x8c,0xfd,0x74,0x02,0x8c,0xfd,0x74,0xda,0x00,0x01,0x00,0x5e,0xff,0x83,0x01,0xfa,0x02,0xda,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x19,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x00,0x60,0x04, +0x01,0x00,0x00,0x1b,0x00,0x4e,0x1b,0x40,0x18,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x00,0x60,0x04,0x01,0x00,0x00,0x1b,0x00,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x17,0x35,0x23,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x15,0xff, +0xa1,0x5a,0xe8,0x5a,0xa1,0x7d,0x7d,0x02,0xda,0xfd,0x78,0x02,0x88,0xfd,0x26,0x7d,0x00,0x02,0x00,0x5e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x15,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x1a,0x4d,0x00,0x03,0x03,0x02,0x60,0x05,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x15,0x13,0x0f, +0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x06,0x07,0x18,0x2b,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5e,0x5a,0x92,0x42,0x63,0x37,0x37,0x63,0x42,0x92,0x8d,0x3b,0x49,0x49,0x3b,0x8d,0x02,0xda,0xfe,0xd4,0x36,0x60,0x41,0x40,0x61,0x36,0x52,0x49,0x3c,0x3c,0x49, +0x00,0x02,0xff,0xfb,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x17,0x15,0x11,0x0f,0x00,0x0e,0x00,0x0d,0x21,0x11,0x11,0x07,0x07,0x19, +0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x87,0x8c,0xe6,0x69,0x42,0x63,0x37,0x37,0x63,0x42,0x69,0x64,0x3b,0x49,0x49,0x3b,0x64,0x02,0x88,0x52,0xfe,0xd4,0x36,0x60,0x41,0x40,0x61,0x36,0x52,0x49,0x3c,0x3c,0x49,0x00,0x00,0x00,0x03,0x00,0x3c, +0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x19,0x00,0x36,0x40,0x33,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x03,0x01,0x00,0x00,0x1a,0x4d,0x00,0x05,0x05,0x02,0x60,0x08,0x04,0x07,0x03,0x02,0x02,0x1b,0x02,0x4e,0x0c,0x0c,0x00,0x00,0x19,0x17,0x12,0x10,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0a,0x21,0x11, +0x09,0x07,0x18,0x2b,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x3c,0x54,0x2e,0x5a,0x6a,0x6a,0x5a,0x01,0x0a,0x54,0xfe,0x74,0x2e,0x33,0x3d,0x3d,0x33,0x2e,0x02,0xda,0xfe,0xd4,0x66,0x58,0x33,0x57,0x66,0x02,0xda,0xfd,0x26,0x4f,0x3c,0x33, +0x32,0x33,0x3c,0x00,0x00,0x02,0xff,0xfb,0xff,0xfb,0x02,0x44,0x02,0xda,0x00,0x17,0x00,0x21,0x00,0x6a,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x20,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x01,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x2a,0x00,0x02, +0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x1b,0x4d,0x06,0x01,0x00,0x00,0x05,0x61,0x08,0x01,0x05,0x05,0x22,0x05,0x4e,0x59,0x40,0x12,0x00,0x00,0x21,0x1f,0x1a,0x18,0x00,0x17,0x00,0x16,0x11,0x25,0x21,0x13,0x21,0x09,0x07,0x1b,0x2b,0x07,0x35, +0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x03,0x06,0x06,0x23,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x05,0x12,0x1d,0x1a,0x01,0x05,0x01,0x1e,0x3c,0x48,0x58,0x58,0x48,0x8c,0x7b,0x04,0x01,0x46,0x48,0x01,0x5e,0x3c,0x24,0x28,0x28,0x24,0x3c,0x05,0x50,0x39,0x3e,0x02, +0x18,0xfe,0xd4,0x55,0x46,0x78,0x46,0x55,0x02,0x8f,0xfe,0x33,0x68,0x5f,0x50,0x2c,0x24,0x78,0x24,0x2c,0x00,0x02,0x00,0x35,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x13,0x00,0x1d,0x00,0x33,0x40,0x30,0x03,0x01,0x01,0x08,0x01,0x05,0x07,0x01,0x05,0x69,0x02,0x01,0x00,0x00,0x1a,0x4d,0x00,0x07,0x07,0x04,0x60,0x09,0x06,0x02,0x04,0x04, +0x1b,0x04,0x4e,0x00,0x00,0x1d,0x1b,0x16,0x14,0x00,0x13,0x00,0x13,0x11,0x25,0x21,0x11,0x11,0x11,0x0a,0x07,0x1c,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x37,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x35,0x50,0x93,0x50,0x3c,0x4a,0x56,0x56,0x4a,0x8c,0x93, +0xe3,0x3c,0x26,0x2a,0x2a,0x26,0x3c,0x02,0xda,0xfe,0xd4,0x01,0x2c,0xfe,0xd4,0x54,0x47,0x78,0x47,0x54,0x01,0x63,0xfe,0x9d,0x4b,0x2b,0x25,0x78,0x26,0x2a,0x00,0x00,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x02,0xe4,0x02,0x06,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x1f,0x00,0x48,0x40,0x45, +0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x1f,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x13,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f, +0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0xdf,0xdf,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62,0x01,0x4a, +0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0x6f,0x52,0x89,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x00,0x00,0x00,0x01,0x00,0x4e,0xff,0xf6,0x01,0xfc,0x02,0xe4,0x00,0x1f,0x00,0x3b,0x40,0x38,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x00,0x00,0x02,0x01,0x02,0x00,0x01,0x80,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x04,0x04,0x06, +0x61,0x00,0x06,0x06,0x1f,0x4d,0x00,0x01,0x01,0x07,0x61,0x00,0x07,0x07,0x20,0x07,0x4e,0x25,0x22,0x12,0x23,0x11,0x13,0x22,0x10,0x08,0x07,0x1e,0x2b,0x37,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x4e,0x5a,0x42, +0x3a,0x3b,0x43,0xdf,0xdf,0x43,0x3b,0x3a,0x42,0x5a,0x74,0x62,0x64,0x74,0x74,0x64,0x62,0x74,0xc8,0x3e,0x43,0x43,0x3e,0x89,0x52,0x6f,0x3e,0x43,0x43,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x62,0x70,0x71,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef, +0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x2d,0xff,0xf6,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x4f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x16,0x00,0x34,0x40,0x31,0x15,0x07,0x02,0x04,0x05,0x01,0x4c,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x02, +0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x07,0x06,0x02,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x22,0x13,0x23,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x07,0x11,0x6e,0x6e,0x01,0x40,0x78,0x10,0x4c, +0x57,0x47,0x55,0x5a,0x57,0x31,0x3a,0x33,0x02,0x8b,0x4f,0x4f,0xfa,0x11,0x52,0x61,0x52,0xfe,0xbf,0x01,0x2d,0x77,0x3d,0x36,0xfe,0xcf,0x00,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x3a,0x02,0xe4,0x00,0x15,0x00,0x23,0x00,0x73,0x4b,0xb0,0x18,0x50,0x58,0x40,0x21,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x07,0x07,0x03,0x61, +0x05,0x01,0x03,0x03,0x1a,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x02,0x08,0x02,0x00,0x00,0x20,0x00,0x4e,0x1b,0x40,0x29,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x03,0x03,0x1a,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x1f,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e, +0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x15,0x01,0x15,0x0a,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15, +0x11,0x14,0x16,0x01,0x90,0x4b,0x58,0x5e,0x53,0x53,0x5e,0x58,0x4b,0x4e,0x5c,0x5c,0x4e,0x29,0x2e,0x2e,0x29,0x29,0x2e,0x2e,0x0a,0x64,0x55,0xa2,0xfe,0xaf,0x02,0xda,0xfe,0xc7,0x8a,0x56,0x63,0x63,0x56,0xfe,0x84,0x55,0x64,0x4a,0x3a,0x35,0x01,0x7c,0x35,0x3a,0x3a,0x35,0xfe,0x84,0x35,0x3a,0x00,0x02,0x00,0x38,0x00,0x00,0x01,0xf9, +0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x38,0x40,0x35,0x01,0x01,0x02,0x04,0x01,0x4c,0x07,0x01,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x06,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x10,0x0f,0x00,0x00,0x13,0x11,0x0f,0x17,0x10,0x17,0x00,0x0e,0x00,0x0e,0x11,0x11,0x27,0x08,0x07,0x19,0x2b, +0x33,0x13,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x11,0x23,0x11,0x23,0x03,0x13,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x38,0x96,0x42,0x4c,0x36,0x62,0x41,0xe0,0x5a,0x74,0x8b,0x79,0x86,0x86,0x37,0x45,0x44,0x01,0x40,0x14,0x6a,0x4a,0x3f,0x5e,0x35,0xfd,0x26,0x01,0x36,0xfe,0xca,0x01,0x86,0x01,0x04,0x47,0x3b,0x3a,0x48,0x00, +0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x1e,0x00,0x3e,0x40,0x3b,0x14,0x0b,0x02,0x02,0x01,0x01,0x4c,0x00,0x06,0x00,0x01,0x02,0x06,0x01,0x69,0x05,0x01,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x07,0x61,0x08,0x01,0x07,0x07,0x1e,0x07,0x4e,0x00,0x00,0x00,0x1e,0x00, +0x1d,0x23,0x11,0x11,0x11,0x13,0x24,0x21,0x09,0x07,0x1d,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x23,0x22,0x07,0x07,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x04,0x46,0x35,0x3e,0x57,0x31,0x3a,0x33,0x5a,0x6e,0x01,0x40,0x78,0x10,0x4c,0x57,0x47,0x55,0x70,0x5d, +0xb4,0x52,0x3d,0x34,0x01,0x1e,0x77,0x3d,0x36,0xfe,0xcf,0x02,0x8b,0x4f,0x4f,0xfa,0x11,0x52,0x61,0x52,0xfe,0xce,0x58,0x6b,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x04,0x01,0x01,0x05,0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x1a,0x4d,0x07,0x01,0x06,0x06, +0x1b,0x06,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x15,0x33,0x15,0x23,0x11,0x82,0x64,0x64,0x01,0xa9,0xfe,0xb1,0xa0,0xa0,0x01,0x46,0x50,0x01,0x44,0x52,0xf2,0x50,0xfe,0xba,0x00,0x01,0x00,0x51,0xff,0x74,0x02,0x49,0x02,0xda,0x00,0x10, +0x00,0x36,0x40,0x33,0x07,0x01,0x06,0x01,0x01,0x4c,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1a,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x10,0x00,0x10,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03, +0x13,0x33,0x15,0x23,0x35,0x23,0x03,0x23,0x11,0x51,0x5a,0x6c,0xa2,0x62,0xb5,0x97,0x4c,0x50,0x3b,0xaa,0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0xd6,0xdc,0x8c,0x01,0x51,0xfe,0xaf,0x00,0x00,0x00,0x00,0x01,0x00,0x59,0xff,0x74,0x02,0x26,0x02,0xda,0x00,0x0f,0x00,0x30,0x40,0x2d,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67, +0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1a,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x23,0x11,0x23,0x11,0x59,0x5a,0xea,0x5a,0x2f,0x50,0x39,0xea,0x02,0xda, +0xfe,0xc8,0x01,0x38,0xfd,0x76,0xdc,0x8c,0x01,0x50,0xfe,0xb0,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x02,0x06,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x14,0x00,0x2f,0x40,0x2c,0x08,0x01,0x00,0x01,0x01,0x4c,0x03,0x01,0x00,0x07,0x06,0x02,0x04,0x05,0x00,0x04,0x68,0x02,0x01,0x01, +0x01,0x1a,0x4d,0x00,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x18,0x11,0x11,0x08,0x07,0x1c,0x2b,0x37,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x23,0x35,0x7d,0x82,0xdc,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xdc,0x82,0x82,0x5a,0xc6, +0x4b,0x01,0xc9,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x37,0x4b,0xc6,0xc6,0x00,0x00,0x00,0x01,0x00,0x41,0xff,0x74,0x02,0x1e,0x02,0xda,0x00,0x13,0x00,0x2e,0x40,0x2b,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x00,0x05,0x04,0x05,0x63,0x03,0x01,0x01,0x01,0x1a,0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e, +0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x23,0x13,0x21,0x08,0x07,0x1c,0x2b,0x21,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x01,0x95,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x2f,0x50,0x01,0x0f,0x60,0x54,0x01,0x17,0xfe,0xe9,0x30,0x34,0x01,0x7b,0xfd,0x76,0xdc,0x8c, +0x00,0x01,0x00,0x5f,0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x67,0x05,0x01,0x04,0x04,0x1a,0x4d,0x03,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23, +0x11,0x23,0x11,0xb9,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x02,0xda,0xfe,0xf1,0x60,0x54,0xfe,0xe9,0x01,0x17,0x30,0x34,0xfe,0x85,0x02,0xda,0x00,0x02,0x00,0x54,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x16,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02, +0x02,0x04,0x61,0x00,0x04,0x04,0x1f,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x11,0x0f,0x0d,0x0c,0x0a,0x08,0x05,0x04,0x00,0x16,0x01,0x16,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33, +0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x29,0x62,0x73,0x01,0x50,0x42,0x39,0x39,0x42,0x5a,0x73,0x62,0x62,0x73,0x73,0x62,0x39,0x42,0xf6,0x42,0x0a,0x71,0x61,0xd1,0x7a,0x3b,0x46,0x46,0x3c,0x61,0x71,0x71,0x61,0xfe,0xb6,0x61,0x71,0x50,0x46,0x3c,0x7f,0x7f,0x3c,0x46,0xff,0xff,0x00,0x06, +0x00,0x00,0x02,0x52,0x03,0xb1,0x02,0x26,0x01,0xd1,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xf6,0x02,0x16,0x03,0xb1,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb1,0x02,0x26,0x01,0xd3,0x00,0x00,0x00,0x07,0x06,0x8e, +0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01, +0x1f,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00,0x0d,0x01,0x0d,0x08,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32, +0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x62,0x70,0x70,0x62,0x62,0x70,0x70,0xdb,0xf2,0x3e,0x3b,0x3b,0x3e,0x79,0x3b,0x3e,0xf2,0x3f,0x0a,0x71,0x62,0x01,0x49,0x62,0x70,0x70,0x62,0xfe,0xb7,0x61,0x72,0x01,0xa8,0x74,0x40,0x43,0x43,0x40,0xfe,0x33,0x44,0x40,0x85,0x85,0x40,0x44,0x00,0xff,0xff,0x00,0x4b,0x00,0x00,0x01,0xf9, +0x03,0xb1,0x02,0x26,0x01,0xe3,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x38,0x40,0x35,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x04,0x02,0x02,0x00,0x00,0x38,0x4d,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x39,0x01,0x4e,0x0c, +0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x09,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x13,0x03,0x33,0x13,0x03,0x33,0x11,0x33,0x11,0x01,0xf1,0x8b,0x8b,0x53,0x88,0x92,0xfd,0xbc,0x92,0x88,0x54,0x8a,0x8b,0x9f,0x4c,0x01,0x7c,0x01,0x5e,0xfe,0xa2, +0xfe,0x84,0x01,0x7e,0x01,0x5c,0xfe,0xa2,0xfe,0x84,0x02,0xda,0xfd,0x26,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xba,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x03,0xb6,0x00,0x27,0x06,0x91,0x02,0x62,0x00,0x00,0x02,0x06,0x00,0xba,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x74,0x02,0x47, +0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x34,0x40,0x31,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x38,0x4d,0x07,0x05,0x06,0x03,0x03,0x03,0x39,0x03,0x4e,0x0b,0x0b,0x00,0x00,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x0a,0x11,0x22,0x12,0x08,0x09,0x19,0x2b,0x21,0x03,0x13,0x33, +0x03,0x13,0x35,0x33,0x15,0x23,0x35,0x21,0x11,0x33,0x11,0x01,0xba,0xf9,0xf9,0x67,0xf0,0xc6,0x50,0x50,0xfe,0x61,0x5a,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0xd3,0x01,0xdc,0x8c,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x14,0x00,0x28,0x40,0x25,0x0b,0x05,0x02,0x00,0x01,0x01,0x4c,0x02, +0x01,0x01,0x01,0x38,0x4d,0x00,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x14,0x00,0x13,0x18,0x13,0x21,0x05,0x09,0x19,0x2b,0x33,0x35,0x33,0x32,0x37,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x06,0x06,0x23,0x42,0x6a,0x33,0x16,0x14,0xd7,0x62,0x83,0x0d,0x10,0x02,0x02,0x0e, +0x0b,0x73,0x62,0xda,0x13,0x4d,0x31,0x53,0x37,0x33,0x02,0x1d,0xfe,0x9b,0x22,0x3d,0x0f,0x0f,0x3d,0x22,0x01,0x65,0xfd,0x9a,0x37,0x3d,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x02,0x09,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03, +0x00,0x1f,0x00,0x77,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x08,0x01,0x01,0x02,0x01,0x63,0x00,0x03,0x03,0x06,0x5f,0x00,0x06,0x06,0x3b,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x06,0x00,0x03,0x04,0x06, +0x03,0x67,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x01,0x01,0x02,0x59,0x09,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x59,0x40,0x1a,0x05,0x04,0x00,0x00,0x1a,0x18,0x16,0x15,0x13,0x11,0x0c,0x0a,0x08,0x07,0x04,0x1f,0x05,0x1f,0x00,0x03,0x00,0x03,0x11,0x0a,0x09,0x17,0x2b,0x11,0x11,0x21,0x11,0x01, +0x32,0x36,0x35,0x23,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x33,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x02,0x58,0xfe,0xdc,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x62,0x64,0x74,0x74,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x01,0x22,0x71,0x61,0x3e,0x43,0x43,0x3e,0x01,0x4a, +0x3e,0x43,0x43,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x62,0x70,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0x30,0x02,0x06,0x00,0xbd,0x00,0x00,0x00,0x02,0x00,0x56,0xff,0xf6,0x02,0x02,0x02,0xe4,0x00,0x16,0x00,0x24,0x00,0x36,0x40,0x33,0x0d,0x01,0x02,0x03,0x01,0x4c,0x09,0x08,0x02,0x01,0x4a,0x00,0x01,0x00,0x03,0x02,0x01,0x03, +0x69,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1f,0x1d,0x17,0x24,0x18,0x24,0x11,0x0f,0x00,0x16,0x01,0x16,0x06,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x37,0x15,0x07,0x06,0x15,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26, +0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x63,0x73,0x6d,0x6a,0xb6,0xa8,0x9a,0x0c,0x51,0x3e,0x5f,0x67,0x73,0x63,0x3a,0x42,0x42,0x3a,0x3a,0x42,0x42,0x0a,0x74,0x63,0xfd,0x79,0x86,0x0a,0x11,0x59,0x0f,0x0e,0xa4,0x2d,0x30,0x37,0x74,0x61,0x62,0x63,0x74,0x50,0x49,0x3e,0x62,0x3e,0x49,0x49,0x3e,0x62,0x3e,0x49,0x00,0x00,0x00, +0x00,0x03,0x00,0x5c,0x00,0x00,0x02,0x0d,0x02,0x26,0x00,0x0f,0x00,0x18,0x00,0x21,0x00,0x39,0x40,0x36,0x08,0x01,0x05,0x02,0x01,0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x00,0x04,0x04,0x01,0x5f,0x06,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x21,0x1f,0x1b,0x19,0x18,0x16, +0x12,0x10,0x00,0x0f,0x00,0x0e,0x21,0x07,0x07,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5c,0xf1,0x53,0x60,0x3f,0x32,0x3c,0x42,0x66,0x57,0x9c,0x99,0x2a,0x30,0x30,0x2a,0x99,0x9c,0x2f, +0x35,0x35,0x2f,0x9c,0x02,0x26,0x4a,0x40,0x2e,0x3f,0x04,0x04,0x04,0x4c,0x3c,0x47,0x54,0x01,0x40,0x28,0x24,0x23,0x28,0xfe,0x78,0x2c,0x28,0x27,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x87,0x00,0x00,0x02,0x12,0x02,0x26,0x00,0x05,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02, +0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x07,0x18,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x87,0x01,0x8b,0xfe,0xcf,0x02,0x26,0x52,0xfe,0x2c,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x02,0x0f,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x80,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x0d, +0x02,0x8f,0x00,0x07,0x00,0x47,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x59,0x40,0x0c, +0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x35,0x33,0x15,0x21,0x11,0x82,0x01,0x36,0x55,0xfe,0xcf,0x02,0x26,0x69,0xbb,0xfe,0x2c,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x0f,0x00,0x17,0x00,0x33,0x40,0x30,0x08,0x05,0x02,0x03,0x00,0x03,0x53,0x00,0x07,0x07, +0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x06,0x02,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x13,0x12,0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x15,0x11,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x3e,0x02,0x37,0x37,0x21,0x11,0x33,0x15,0x23,0x35,0x21,0x15,0x37,0x33,0x11,0x23,0x07,0x0e,0x02,0x1b,0x2a,0x0d, +0x19,0x12,0x01,0x04,0x01,0x6d,0x4b,0x50,0xfe,0x81,0x34,0xf6,0xbe,0x02,0x01,0x10,0x17,0x8c,0xdc,0x0c,0x31,0x58,0x48,0xf9,0xfe,0x2a,0xdc,0x8c,0x8c,0xdc,0x01,0x88,0xad,0x47,0x58,0x31,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x02,0x06,0x00,0xe1,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x09,0x02,0x26, +0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0x26,0x00,0x15,0x00,0x36,0x40,0x33,0x0c,0x01,0x02,0x06,0x01,0x01,0x4c,0x03,0x01,0x01,0x08,0x01,0x06,0x05,0x01,0x06,0x67,0x04,0x02,0x02,0x00,0x00,0x1c,0x4d,0x0a,0x09,0x07,0x03,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00, +0x15,0x00,0x15,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x0b,0x07,0x1f,0x2b,0x33,0x13,0x03,0x33,0x17,0x33,0x35,0x33,0x15,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x23,0x35,0x23,0x07,0x0f,0x7b,0x73,0x56,0x65,0x35,0x4a,0x33,0x68,0x55,0x73,0x7b,0x59,0x69,0x36,0x4a,0x36,0x6a,0x01,0x1c,0x01,0x0a,0xed,0xed,0xed,0xed, +0xfe,0xf9,0xfe,0xe1,0xfb,0xfb,0xfb,0xfb,0x00,0x01,0x00,0x46,0xff,0xf9,0x02,0x0d,0x02,0x2d,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x26,0x01,0x03,0x04,0x01,0x4c,0x00,0x06,0x05,0x04,0x05,0x06,0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x21,0x4d, +0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x22,0x00,0x4e,0x01,0x00,0x21,0x1e,0x1c,0x1b,0x19,0x16,0x12,0x10,0x0f,0x0d,0x09,0x06,0x04,0x03,0x00,0x2d,0x01,0x2c,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x22,0x06,0x07, +0x23,0x36,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x01,0x0a,0x5a,0x6a,0x5a,0x39,0x31,0x35,0x34,0x3c,0x3c,0x34,0x78,0x75,0x2f,0x37,0x36,0x2f,0x2f,0x2c,0x35,0x02,0x5a,0x02,0x66,0x55,0x2f,0x5a,0x69,0x3f,0x32,0x3c,0x42,0x6f,0x5f,0x07,0x55,0x49,0x23,0x2a,0x2d,0x27,0x29,0x2f,0x4e,0x2a, +0x24,0x23,0x29,0x22,0x1d,0x41,0x4d,0x4a,0x45,0x2e,0x3f,0x04,0x04,0x04,0x4c,0x3c,0x4b,0x59,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x0f,0x00,0x24,0x40,0x21,0x0e,0x06,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1c,0x4d,0x04,0x03,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11, +0x15,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x07,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x37,0x03,0x5c,0x56,0x03,0x08,0xe5,0x70,0x56,0x03,0x08,0xe5,0x02,0x26,0xfe,0xd8,0x2b,0x5c,0x1d,0x01,0xcc,0xfd,0xda,0x01,0x29,0x2c,0x5c,0x1d,0xfe,0x32,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfc,0x03,0x11,0x02,0x26, +0x02,0x17,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x00,0x0c,0x00,0x2d,0x40,0x2a,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x1c,0x4d,0x06,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x12, +0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x11,0x33,0x15,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x67,0x5a,0x6b,0x98,0x67,0xb2,0xbc,0x69,0x9f,0x6c,0x02,0x26,0xe3,0xe3,0xfe,0xf8,0xfe,0xe2,0xf1,0xf1,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x03,0x11,0x02,0x26,0x02,0x19,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x65,0x00,0x00, +0x00,0x01,0x00,0x19,0xff,0xf9,0x01,0xfc,0x02,0x26,0x00,0x0f,0x00,0x4d,0x4b,0xb0,0x21,0x50,0x58,0x40,0x17,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x00,0x00,0x02,0x61,0x05,0x04,0x02,0x02,0x02,0x1b,0x02,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00, +0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x22,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x0f,0x00,0x0e,0x11,0x11,0x13,0x21,0x06,0x07,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x23,0x11,0x23,0x07,0x06,0x06,0x23,0x19,0x0f,0x2e,0x25,0x01,0x06,0x01,0x7a,0x5a,0xc7,0x05,0x03,0x4e,0x58,0x07,0x54,0x48,0x5d,0x01,0x34,0xfd, +0xda,0x01,0xd4,0xe6,0x83,0x72,0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0x26,0x00,0x12,0x00,0x2e,0x40,0x2b,0x0e,0x0b,0x03,0x03,0x03,0x00,0x01,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x01,0x01,0x00,0x00,0x1c,0x4d,0x05,0x04,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x15,0x11,0x12,0x11, +0x06,0x07,0x1a,0x2b,0x33,0x11,0x33,0x13,0x13,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x03,0x23,0x03,0x16,0x16,0x15,0x15,0x48,0x76,0x6c,0x6d,0x79,0x56,0x03,0x0a,0x75,0x52,0x6e,0x09,0x03,0x02,0x26,0xfe,0xf3,0x01,0x0d,0xfd,0xda,0x55,0x8f,0xd0,0x46,0xfe,0xdd,0x01,0x13,0x3e,0xc0,0x97,0x55,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc, +0x02,0x26,0x00,0x0b,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x1c,0x4d,0x06,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x15,0x5c,0x5a,0xec,0x5a,0x5a,0xec,0x02, +0x26,0xe3,0xe3,0xfd,0xda,0xf1,0xf1,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x02,0x06,0x01,0x22,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x07,0x00,0x07, +0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x11,0x23,0x11,0x23,0x11,0x5c,0x01,0xa0,0x5a,0xec,0x02,0x26,0xfd,0xda,0x01,0xd4,0xfe,0x2c,0xff,0xff,0x00,0x5c,0xff,0x4c,0x02,0x01,0x02,0x30,0x02,0x06,0x01,0x3d,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x02,0x30,0x02,0x06,0x00,0xd7,0x00,0x00,0x00,0x01,0x00,0x37, +0x00,0x00,0x02,0x21,0x02,0x26,0x00,0x07,0x00,0x21,0x40,0x1e,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xc8,0x01,0xea,0xc8,0x01,0xd4,0x52,0x52,0xfe,0x2c,0x00,0x00, +0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0x70,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x30,0xff,0x4c,0x02,0x28,0x02,0xda,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x42,0x40,0x3f,0x00,0x02,0x02,0x1a, +0x4d,0x09,0x01,0x06,0x06,0x01,0x61,0x03,0x01,0x01,0x01,0x1c,0x4d,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x00,0x1b,0x4d,0x0a,0x01,0x05,0x05,0x1e,0x05,0x4e,0x18,0x18,0x00,0x00,0x27,0x26,0x21,0x20,0x18,0x1f,0x18,0x1f,0x1a,0x19,0x00,0x17,0x00,0x17,0x17,0x11,0x11,0x17,0x11,0x0c,0x07,0x1b,0x2b,0x17,0x35,0x2e,0x02, +0x35,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x1e,0x02,0x15,0x15,0x14,0x06,0x06,0x07,0x15,0x27,0x11,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0xff,0x3d,0x5e,0x34,0x34,0x5e,0x3d,0x5a,0x3e,0x5d,0x34,0x34,0x5d,0x3e,0x53,0x3c,0x45,0x45,0x88,0x3c,0x45,0x45,0x3c,0xb4,0xb4,0x02,0x36,0x5f,0x3d,0x80, +0x3d,0x5e,0x36,0x01,0xb4,0xb4,0x01,0x36,0x5e,0x3d,0x80,0x3d,0x5f,0x36,0x02,0xb4,0xfb,0x01,0x98,0x46,0x3b,0x94,0x3c,0x47,0x47,0x3c,0x94,0x3b,0x46,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x01,0xf4,0x02,0x26,0x00,0x0f,0x00,0x25,0x40,0x22, +0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x03,0x01,0x01,0x01,0x1c,0x4d,0x05,0x01,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x21,0x35,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x01,0x9a,0x93,0x55,0x64,0x5a,0x35,0x2d,0x90,0x5a,0xbf,0x5a,0x4c, +0xc1,0xc1,0x27,0x2e,0x01,0x16,0xfd,0xda,0x00,0x01,0x00,0x5c,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x0b,0x00,0x29,0x40,0x26,0x06,0x01,0x05,0x02,0x05,0x54,0x03,0x01,0x01,0x01,0x1c,0x4d,0x04,0x01,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x05, +0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0xea,0xfe,0x72,0x5a,0xdf,0x5a,0x4b,0x8c,0x8c,0x02,0x26,0xfe,0x2a,0x01,0xd6,0xfe,0x2a,0xdc,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x26,0x00,0x0b,0x00,0x25,0x40,0x22,0x04,0x02,0x02,0x00,0x00,0x1c,0x4d,0x03,0x01,0x01,0x01,0x05,0x60,0x06,0x01,0x05, +0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x03,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x3e,0x02,0x55,0x77,0x4a,0x76,0x54,0x02,0x26,0xfe,0x26,0x01,0xda,0xfe,0x26,0x01,0xda,0xfd,0xda,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x74,0x02,0x53,0x02,0x26,0x00,0x0f, +0x00,0x2d,0x40,0x2a,0x08,0x01,0x07,0x02,0x07,0x54,0x05,0x03,0x02,0x01,0x01,0x1c,0x4d,0x06,0x04,0x02,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x02, +0x03,0xfe,0x39,0x51,0x76,0x46,0x76,0x51,0x43,0x8c,0x8c,0x02,0x26,0xfe,0x26,0x01,0xda,0xfe,0x26,0x01,0xda,0xfe,0x26,0xd8,0x00,0x01,0x00,0x5c,0xff,0x83,0x01,0xfc,0x02,0x26,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x19,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x00,0x60,0x04, +0x01,0x00,0x00,0x1b,0x00,0x4e,0x1b,0x40,0x18,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x00,0x60,0x04,0x01,0x00,0x00,0x1b,0x00,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x17,0x35,0x23,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x15,0xff, +0xa3,0x5a,0xec,0x5a,0xa3,0x7d,0x7d,0x02,0x26,0xfe,0x2c,0x01,0xd4,0xfd,0xda,0x7d,0x00,0x02,0x00,0x69,0x00,0x00,0x02,0x28,0x02,0x26,0x00,0x0a,0x00,0x13,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x1c,0x4d,0x00,0x03,0x03,0x02,0x60,0x05,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x13,0x11,0x0d, +0x0b,0x00,0x0a,0x00,0x09,0x21,0x11,0x06,0x07,0x18,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x69,0x5a,0x9d,0x5d,0x6b,0x6c,0x5c,0x9d,0x9d,0x34,0x37,0x37,0x34,0x9d,0x02,0x26,0xca,0x5d,0x51,0x50,0x5e,0x52,0x2f,0x2d,0x2d,0x2f,0x00,0x00,0x00,0x00,0x02,0x00,0x19, +0x00,0x00,0x02,0x3a,0x02,0x26,0x00,0x0c,0x00,0x15,0x00,0x31,0x40,0x2e,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x15,0x13,0x0f,0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x11,0x07,0x07,0x19,0x2b,0x33,0x11,0x23, +0x35,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xa5,0x8c,0xe6,0x73,0x5d,0x6b,0x6c,0x5c,0x73,0x73,0x34,0x37,0x37,0x34,0x73,0x01,0xd6,0x50,0xca,0x5d,0x51,0x50,0x5e,0x52,0x2f,0x2d,0x2d,0x2f,0x00,0x00,0x03,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x26,0x00,0x0a,0x00,0x0e,0x00,0x17, +0x00,0x36,0x40,0x33,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x03,0x01,0x00,0x00,0x1c,0x4d,0x00,0x05,0x05,0x02,0x60,0x08,0x04,0x07,0x03,0x02,0x02,0x1b,0x02,0x4e,0x0b,0x0b,0x00,0x00,0x17,0x15,0x11,0x0f,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x09,0x21,0x11,0x09,0x07,0x18,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15, +0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x3c,0x54,0x37,0x59,0x67,0x67,0x59,0x01,0x01,0x54,0xfe,0x74,0x37,0x34,0x3c,0x3c,0x34,0x37,0x02,0x26,0xca,0x5e,0x50,0x50,0x5e,0x02,0x26,0xfd,0xda,0x48,0x37,0x2f,0x2f,0x37,0x00,0x00,0x00,0x02,0x00,0x05,0xff,0xfb,0x02,0x42,0x02,0x26,0x00,0x17, +0x00,0x21,0x00,0x9c,0x4b,0xb0,0x27,0x50,0x58,0x40,0x20,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x06,0x01,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2b,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f, +0x00,0x01,0x01,0x1c,0x4d,0x00,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x4d,0x00,0x06,0x06,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x28,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x06,0x06,0x03,0x5f,0x00,0x03,0x03,0x1b,0x4d,0x00,0x00,0x00, +0x05,0x61,0x08,0x01,0x05,0x05,0x22,0x05,0x4e,0x59,0x59,0x40,0x12,0x00,0x00,0x21,0x1f,0x1a,0x18,0x00,0x17,0x00,0x16,0x11,0x25,0x21,0x13,0x21,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x15,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x03,0x06,0x06,0x23,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26, +0x23,0x23,0x05,0x12,0x19,0x1e,0x01,0x04,0x01,0x11,0x3e,0x48,0x58,0x58,0x48,0x8b,0x71,0x03,0x01,0x4d,0x41,0x01,0x50,0x3e,0x24,0x27,0x27,0x24,0x3e,0x05,0x55,0x3e,0x34,0x01,0x64,0xc8,0x55,0x45,0x2a,0x45,0x55,0x01,0xd9,0xfe,0xe9,0x5b,0x6c,0x4f,0x2c,0x24,0x2a,0x24,0x2c,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x02,0x42, +0x02,0x26,0x00,0x13,0x00,0x1d,0x00,0x33,0x40,0x30,0x03,0x01,0x01,0x08,0x01,0x05,0x07,0x01,0x05,0x69,0x02,0x01,0x00,0x00,0x1c,0x4d,0x00,0x07,0x07,0x04,0x60,0x09,0x06,0x02,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x1d,0x1b,0x16,0x14,0x00,0x13,0x00,0x13,0x11,0x25,0x21,0x11,0x11,0x11,0x0a,0x07,0x1c,0x2b,0x33,0x11,0x33,0x15,0x33, +0x35,0x33,0x15,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x37,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x3e,0x53,0x8b,0x49,0x3d,0x48,0x58,0x58,0x48,0x86,0x8b,0xd4,0x3d,0x24,0x29,0x29,0x24,0x3d,0x02,0x26,0xc8,0xc8,0xc8,0x55,0x46,0x28,0x46,0x55,0x01,0x13,0xfe,0xed,0x4b,0x2c,0x24,0x28,0x24,0x2c,0x00, +0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x02,0x2e,0x02,0x06,0x01,0x44,0x00,0x00,0x00,0x01,0x00,0x57,0xff,0xf6,0x02,0x08,0x02,0x30,0x00,0x1f,0x00,0x48,0x40,0x45,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01, +0x21,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x13,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f,0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33, +0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x32,0x64,0x77,0x77,0x64,0x5f,0x74,0x03,0x5a,0x03,0x41,0x38,0x3b,0x46,0xb7,0xb7,0x46,0x3b,0x38,0x41,0x03,0x5a,0x03,0x74,0x0a,0x70,0x62,0x96,0x62,0x70,0x65,0x54,0x31,0x38,0x44,0x3e,0x1e,0x50,0x29,0x3d,0x44,0x39,0x31,0x55,0x65,0x00,0x01,0x00,0x50,0xff,0xf6,0x02,0x01,0x02,0x30,0x00,0x1f, +0x00,0x48,0x40,0x45,0x00,0x06,0x05,0x04,0x05,0x06,0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x21,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1a,0x18,0x16,0x15,0x13,0x11,0x0e,0x0d,0x0c,0x0b,0x08,0x06, +0x04,0x03,0x00,0x1f,0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x26,0x5f,0x74,0x03,0x5a,0x03,0x42,0x37,0x3b,0x46,0xb7,0xb7,0x46,0x3b,0x37,0x42,0x03,0x5a,0x03,0x74,0x5f, +0x64,0x77,0x77,0x0a,0x65,0x55,0x31,0x39,0x44,0x3d,0x29,0x50,0x1e,0x3e,0x44,0x38,0x31,0x54,0x65,0x70,0x62,0x96,0x62,0x70,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00, +0x00,0x07,0x06,0x68,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x4c,0x01,0xc3,0x03,0x09,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x1c,0x00,0x39,0x40,0x36,0x09,0x01,0x05,0x06,0x01,0x4c,0x02,0x01,0x00,0x09,0x08,0x02,0x03,0x04,0x00,0x03, +0x67,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x00,0x01,0x01,0x1a,0x4d,0x07,0x01,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x1c,0x00,0x1c,0x13,0x23,0x13,0x24,0x11,0x11,0x11,0x11,0x0a,0x07,0x1e,0x2b,0x11,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06, +0x15,0x11,0x23,0x11,0x5c,0x5a,0xa8,0xa8,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x5a,0x02,0x3a,0x4b,0x55,0x55,0x4b,0xb9,0x37,0x3c,0x66,0x58,0xfe,0xca,0x01,0x2c,0x3b,0x41,0x46,0x40,0xfe,0xde,0x02,0x3a,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x30,0x02,0x30,0x00,0x15,0x00,0x23,0x00,0x73,0x4b,0xb0,0x18,0x50, +0x58,0x40,0x21,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x07,0x07,0x03,0x61,0x05,0x01,0x03,0x03,0x1c,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x02,0x08,0x02,0x00,0x00,0x20,0x00,0x4e,0x1b,0x40,0x29,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x03,0x03,0x1c,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x21,0x4d,0x00,0x02, +0x02,0x1b,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x15,0x01,0x15,0x0a,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x35,0x34,0x36,0x33,0x32, +0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x8b,0x47,0x53,0x62,0x53,0x53,0x62,0x53,0x47,0x4c,0x59,0x59,0x4b,0x26,0x2b,0x2b,0x26,0x25,0x2a,0x2a,0x0a,0x5c,0x4e,0x53,0xf3,0x02,0x26,0xeb,0x4b,0x4e,0x5c,0x5c,0x4e,0xe6,0x4e,0x5c,0x46,0x36,0x2e,0xe6,0x2e,0x36,0x36,0x2e, +0xe6,0x2e,0x36,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x0d,0x00,0x16,0x00,0x38,0x40,0x35,0x01,0x01,0x02,0x04,0x01,0x4c,0x07,0x01,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x06,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x0f,0x0e,0x00,0x00,0x12,0x10,0x0e,0x16,0x0f, +0x16,0x00,0x0d,0x00,0x0d,0x11,0x11,0x26,0x08,0x07,0x19,0x2b,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x23,0x35,0x23,0x07,0x13,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x3f,0x8d,0x3a,0x46,0x6c,0x5c,0xe8,0x5a,0x74,0x82,0x68,0x8e,0x8e,0x31,0x3b,0x3b,0xd6,0x0e,0x59,0x3d,0x50,0x5c,0xfd,0xda,0xd0,0xd0,0x01,0x1e,0xb9, +0x31,0x2c,0x2b,0x31,0x00,0x01,0x00,0x00,0xff,0x4c,0x01,0xfc,0x02,0xda,0x00,0x24,0x00,0x43,0x40,0x40,0x19,0x01,0x02,0x01,0x01,0x4c,0x06,0x01,0x04,0x07,0x01,0x03,0x08,0x04,0x03,0x67,0x00,0x08,0x00,0x01,0x02,0x08,0x01,0x69,0x00,0x05,0x05,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x09,0x61,0x0a,0x01,0x09,0x09,0x1e, +0x09,0x4e,0x00,0x00,0x00,0x24,0x00,0x23,0x24,0x11,0x11,0x11,0x11,0x11,0x13,0x25,0x21,0x0b,0x07,0x1f,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0xfa,0x25,0x3e,0x45,0x3d,0x36, +0x38,0x3f,0x5a,0x5e,0x5e,0x5a,0xa6,0xa6,0x01,0x06,0x4b,0x3f,0x53,0x60,0x78,0x65,0xb4,0x53,0x43,0x3d,0x01,0x0d,0x3b,0x41,0x46,0x40,0xfe,0xde,0x02,0x3a,0x4b,0x55,0x55,0x4b,0xb9,0x37,0x3c,0x66,0x58,0xfe,0xe9,0x61,0x72,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x21,0x02,0x26,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x04,0x01,0x01,0x05, +0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x1c,0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x35,0x23,0x35,0x33,0x35,0x21,0x15,0x21,0x15,0x33,0x15,0x23,0x15,0x96,0x64,0x64,0x01,0x8b,0xfe,0xcf,0xaf,0xaf,0xeb,0x52, +0xe9,0x52,0x97,0x52,0xeb,0x00,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x10,0x00,0x36,0x40,0x33,0x07,0x01,0x06,0x01,0x01,0x4c,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1c,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x10,0x00, +0x10,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x37,0x33,0x03,0x17,0x33,0x15,0x23,0x35,0x23,0x27,0x23,0x15,0x5c,0x5a,0x62,0xa0,0x67,0xb9,0x88,0x4c,0x50,0x31,0xa0,0x63,0x02,0x26,0xe3,0xe3,0xfe,0xfa,0xd0,0xdc,0x8c,0xf5,0xf5,0x00,0x01,0x00,0x5b,0xff,0x74,0x02,0x26,0x02,0x26,0x00,0x0f, +0x00,0x30,0x40,0x2d,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1c,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x33,0x15,0x23,0x35,0x23,0x35, +0x23,0x15,0x5b,0x5a,0xe8,0x5a,0x2f,0x50,0x39,0xe8,0x02,0x26,0xe5,0xe5,0xfe,0x2a,0xdc,0x8c,0xef,0xef,0xff,0xff,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x02,0x06,0x02,0x77,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x00,0x14,0x00,0x2f,0x40,0x2c,0x08,0x01,0x00,0x01,0x01,0x4c,0x03,0x01,0x00,0x07,0x06,0x02, +0x04,0x05,0x00,0x04,0x68,0x02,0x01,0x01,0x01,0x1c,0x4d,0x00,0x05,0x05,0x1e,0x05,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x18,0x11,0x11,0x08,0x07,0x1c,0x2b,0x17,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x23,0x35,0x7d,0x82,0xc3,0x5f,0x7c,0x0c,0x0a,0x03,0x03,0x09, +0x0b,0x79,0x5c,0xc3,0x82,0x82,0x5a,0x4b,0x4b,0x02,0x26,0xfe,0x93,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0x4b,0x69,0x69,0x00,0x00,0x00,0x01,0x00,0x49,0xff,0x74,0x02,0x1c,0x02,0x26,0x00,0x13,0x00,0x2e,0x40,0x2b,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x00,0x05,0x04,0x05,0x63,0x03,0x01,0x01,0x01,0x1c, +0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x23,0x13,0x21,0x08,0x07,0x1c,0x2b,0x21,0x35,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x01,0x95,0x93,0x55,0x64,0x5a,0x35,0x2d,0x90,0x5a,0x2d,0x50,0xbf,0x5a,0x4c,0xc1,0xc1,0x27,0x2e,0x01, +0x16,0xfe,0x2a,0xdc,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x02,0x0a,0x02,0x26,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x67,0x05,0x01,0x04,0x04,0x1c,0x4d,0x03,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x13,0x15,0x33,0x32,0x16, +0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0xbe,0x93,0x56,0x63,0x5a,0x35,0x2d,0x90,0x5a,0x02,0x26,0xbf,0x59,0x4d,0xc1,0xc1,0x27,0x2e,0xfe,0xea,0x02,0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x00,0x17,0x00,0x20,0x00,0x3e,0x40,0x3b,0x00,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x02, +0x00,0x05,0x06,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x21,0x4d,0x00,0x06,0x06,0x01,0x61,0x00,0x01,0x01,0x20,0x01,0x4e,0x01,0x00,0x1e,0x1c,0x19,0x18,0x15,0x14,0x12,0x10,0x0d,0x0c,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x07,0x16,0x2b,0x01,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x35,0x21, +0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x13,0x21,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x01,0x2c,0x62,0x76,0x76,0x62,0x41,0x61,0x36,0x01,0x58,0x45,0x3b,0x32,0x41,0x07,0x5a,0x09,0x74,0xd7,0xff,0x00,0x43,0x3d,0x3d,0x43,0x02,0x30,0x75,0x67,0x82,0x67,0x75,0x34,0x5f,0x3f,0x62,0x34,0x3d,0x47,0x27,0x21,0x45,0x51,0xfe, +0xb4,0x1c,0x41,0x47,0x47,0x41,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x00,0x02,0x49,0x03,0x09,0x02,0x26,0x02,0x15,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x46,0xff,0xf9,0x02,0x0d,0x03,0x09,0x02,0x26,0x02,0x16,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfc, +0x03,0x09,0x02,0x26,0x02,0x17,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x09,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x30,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05, +0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x21,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00,0x0d,0x01,0x0d,0x08,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14, +0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x61,0x71,0x71,0x61,0x60,0x72,0x72,0xda,0xf4,0x3f,0x3b,0x3a,0x40,0x7a,0x3b,0x3f,0xf4,0x40,0x0a,0x72,0x61,0x95,0x62,0x70,0x72,0x5f,0x96,0x61,0x72,0x01,0x45,0x23,0x3f,0x44,0x44,0x3f,0xfe,0xe7,0x44,0x40,0x27,0x27,0x40, +0x44,0x00,0x00,0x00,0xff,0xff,0x00,0x4e,0x00,0x00,0x01,0xf4,0x03,0x09,0x02,0x26,0x02,0x27,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x91,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xe3,0x00,0x00,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0x26,0x00,0x05, +0x00,0x0b,0x00,0x0f,0x00,0x38,0x40,0x35,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x04,0x02,0x02,0x00,0x00,0x3b,0x4d,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x39,0x01,0x4e,0x0c,0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x09,0x09,0x17,0x2b,0x21,0x03, +0x13,0x33,0x03,0x13,0x21,0x13,0x03,0x33,0x13,0x03,0x33,0x11,0x33,0x11,0x01,0xf7,0x97,0x87,0x53,0x86,0x9a,0xfd,0xbc,0x9a,0x86,0x53,0x87,0x97,0xa5,0x4c,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xfe,0xe5,0x01,0x1b,0x01,0x0b,0xfe,0xf4,0xfe,0xe6,0x02,0x26,0xfd,0xda,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x00,0x05, +0x00,0x09,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x3b,0x4d,0x05,0x03,0x04,0x03,0x01,0x01,0x39,0x01,0x4e,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x11,0x33,0x11,0x01,0xc2,0xf6,0xe6,0x71,0xe5,0xf9, +0xfe,0x2d,0x5a,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xfe,0xe5,0x02,0x26,0xfd,0xda,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x03,0x11,0x02,0x26,0x02,0x4b,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0x00,0x02,0x00,0x64,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x09,0x00,0x0d,0x00,0x34,0x40,0x31,0x04,0x01,0x02,0x01,0x00,0x01, +0x4c,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x3b,0x4d,0x07,0x05,0x06,0x03,0x03,0x03,0x39,0x03,0x4e,0x0a,0x0a,0x00,0x00,0x0a,0x0d,0x0a,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x11,0x12,0x12,0x08,0x09,0x19,0x2b,0x21,0x03,0x13,0x33,0x03,0x17,0x33,0x15,0x23,0x35,0x21,0x11,0x33,0x11,0x01,0xc2,0xf6,0xe6,0x71,0xe5, +0xb3,0x49,0x50,0xfe,0x7a,0x5a,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xcb,0xdc,0x8c,0x02,0x26,0xfd,0xda,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0xa7,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x00, +0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x1f,0x00,0x48,0x40,0x45,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x06,0x00,0x03,0x04,0x06,0x03,0x67,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x01,0x01,0x02,0x59,0x09,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x05,0x04,0x00,0x00,0x1a,0x18,0x16, +0x15,0x13,0x11,0x0c,0x0a,0x08,0x07,0x04,0x1f,0x05,0x1f,0x00,0x03,0x00,0x03,0x11,0x0a,0x09,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x32,0x36,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x02,0x58,0xfe,0xdc,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b, +0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x5f,0x64,0x78,0x78,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x01,0x22,0x66,0x58,0x34,0x3a,0x44,0x3e,0x97,0x3e,0x43,0x39,0x35,0x58,0x66,0x70,0x62,0x96,0x62,0x70,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x01,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x12, +0x02,0xda,0x02,0x06,0x00,0x1a,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x2b,0x02,0xda,0x02,0x06,0x01,0xcb,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x03,0x00,0x0c,0x00,0x26,0x40,0x23,0x0a,0x01,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x28,0x4d,0x00,0x02,0x02,0x01,0x60,0x03,0x01,0x01,0x01,0x29,0x01, +0x4e,0x00,0x00,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x04,0x08,0x17,0x2b,0x33,0x13,0x33,0x13,0x01,0x03,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x32,0xbe,0x79,0xbd,0xfe,0xe2,0x66,0x01,0x15,0x67,0x0d,0x12,0x05,0x04,0x13,0x02,0xda,0xfd,0x26,0x01,0xf0,0xfe,0x60,0x01,0x9f,0x34,0x5b,0x16,0x16,0x5a,0x00,0x00,0x00,0xff,0xff,0x00,0x64, +0x00,0x00,0x02,0x08,0x02,0xda,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xda,0x02,0x06,0x00,0xb1,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x02,0x06,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1b,0x00,0x1f,0x00,0x3e,0x40,0x3b, +0x00,0x04,0x08,0x01,0x05,0x02,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x1c,0x1c,0x0f,0x0e,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x09,0x08,0x16,0x2b,0x05,0x22,0x26,0x35, +0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x27,0x35,0x33,0x15,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x20,0xb4,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x6f,0x62,0xfe,0xb5,0x62,0x70,0x51,0x43,0x3e,0x01, +0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xfe,0x52,0x52,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x1b,0x40,0x18,0x00,0x00,0x00,0x28, +0x4d,0x03,0x02,0x02,0x01,0x01,0x29,0x01,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x08,0x18,0x2b,0x33,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x31,0x30,0x06,0x07,0x03,0x32,0xbe,0x79,0xbd,0x5b,0x7b,0x11,0x13,0x13,0x11,0x7a,0x02,0xda,0xfd,0x26,0x01,0xef,0x47,0x5e,0x5d,0x47,0xfe,0x10,0x00,0x00,0x00,0xff,0xff,0x00,0x48, +0x00,0x00,0x02,0x10,0x02,0xda,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x02,0x06,0x00,0x5a,0x00,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x06,0x01,0x01,0x01,0x00,0x5f,0x00, +0x00,0x00,0x28,0x4d,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x05,0x29,0x05,0x4e,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x08,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x35,0x21,0x15,0x01,0x35,0x21,0x15,0x50,0x01,0xb8,0xfe,0x66,0x01,0x7c,0xfe,0x66, +0x01,0xb8,0x02,0x88,0x52,0x52,0xfe,0xc1,0x52,0x52,0xfe,0xb7,0x52,0x52,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x02,0x06,0x00,0x60,0x00,0x00,0xff,0xff,0x00,0x5e,0x00,0x00,0x01,0xfa,0x02,0xda,0x02,0x06,0x01,0xdb,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x7a,0x00,0x00, +0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0b,0x00,0x34,0x40,0x31,0x08,0x02,0x02,0x02,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x01,0x02,0x02,0x4b,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x28,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x29,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x05,0x08, +0x19,0x2b,0x33,0x35,0x13,0x03,0x35,0x21,0x15,0x21,0x13,0x03,0x21,0x15,0x4b,0xe8,0xe8,0x01,0xdb,0xfe,0x8f,0xeb,0xec,0x01,0x72,0x50,0x01,0x23,0x01,0x17,0x50,0x50,0xfe,0xed,0xfe,0xd9,0x50,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x02,0xda,0x02,0x06,0x00,0x89,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35, +0x02,0xda,0x02,0x06,0x00,0xa8,0x00,0x00,0xff,0xff,0x00,0x2e,0xff,0xe7,0x02,0x2a,0x03,0x02,0x02,0x06,0x01,0xe1,0x00,0x00,0xff,0xff,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xa7,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0xda,0x00,0x19,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x06,0x01,0x00,0x07,0x02, +0x00,0x6a,0x05,0x03,0x02,0x01,0x01,0x28,0x4d,0x08,0x01,0x07,0x07,0x29,0x07,0x4e,0x00,0x00,0x00,0x19,0x00,0x19,0x14,0x13,0x11,0x11,0x13,0x14,0x11,0x09,0x08,0x1d,0x2b,0x33,0x35,0x22,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x11,0x33,0x11,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x15,0xff,0x3c,0x5a,0x33,0x54, +0x43,0x38,0x4e,0x38,0x43,0x54,0x32,0x5b,0x3c,0xaa,0x34,0x5d,0x3f,0x01,0x60,0xfe,0xa0,0x3d,0x45,0x01,0xe2,0xfe,0x1e,0x45,0x3d,0x01,0x60,0xfe,0xa0,0x3f,0x5d,0x34,0xaa,0x00,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x27,0x02,0xe4,0x00,0x27,0x00,0x5f,0x4b,0xb0,0x2a,0x50,0x58,0x40,0x20,0x06,0x01,0x04,0x05,0x00,0x00,0x04, +0x72,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x08,0x07,0x02,0x03,0x03,0x29,0x03,0x4e,0x1b,0x40,0x21,0x06,0x01,0x04,0x05,0x00,0x05,0x04,0x00,0x80,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x08,0x07,0x02,0x03,0x03,0x29,0x03,0x4e,0x59,0x40,0x10, +0x00,0x00,0x00,0x27,0x00,0x27,0x15,0x25,0x11,0x11,0x27,0x28,0x11,0x09,0x08,0x1d,0x2b,0x33,0x35,0x33,0x35,0x2e,0x02,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x07,0x15,0x33,0x15,0x23,0x35,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x15,0x32,0x91,0x18,0x36,0x25,0x77,0x65,0x65, +0x77,0x25,0x35,0x19,0x92,0xd3,0x28,0x32,0x47,0x3b,0x3b,0x47,0x32,0x28,0x50,0x05,0x03,0x23,0x45,0x35,0x01,0x18,0x62,0x75,0x75,0x62,0xfe,0xe8,0x35,0x44,0x23,0x03,0x06,0x50,0x6e,0x49,0x39,0x01,0x1d,0x3e,0x49,0x49,0x3e,0xfe,0xe3,0x39,0x49,0x6e,0xff,0xff,0x00,0x0a,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x01,0x00,0x00, +0x00,0x07,0x06,0xb1,0xff,0x29,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x02,0x08,0x02,0xda,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xb1,0xfe,0xac,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x01,0xfb,0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xac,0x00,0x00,0x02,0x06,0x00,0x40,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x01,0xef, +0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xac,0x00,0x00,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0xff,0xb0,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x27,0x06,0xb1,0xfe,0xcf,0x00,0x00,0x02,0x06,0x00,0x60,0x00,0x00,0xff,0xff,0xff,0x83,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xa2,0x00,0x00,0x02,0x06,0x00,0xa8,0x00,0x00, +0xff,0xff,0xff,0xb0,0x00,0x00,0x02,0x27,0x02,0xe4,0x02,0x26,0x02,0x68,0x00,0x00,0x00,0x07,0x06,0xb1,0xfe,0xcf,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb1,0x00,0x27,0x06,0x8e,0x02,0x58,0x00,0x00,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb1,0x00,0x27,0x06,0x8e,0x02,0x58, +0x00,0x00,0x02,0x06,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x4c,0x02,0x44,0x02,0xda,0x00,0x17,0x00,0x42,0x40,0x3f,0x07,0x01,0x07,0x01,0x01,0x4c,0x00,0x03,0x07,0x06,0x07,0x03,0x06,0x80,0x00,0x01,0x00,0x07,0x03,0x01,0x07,0x67,0x02,0x01,0x00,0x00,0x28,0x4d,0x09,0x08,0x02,0x06,0x06,0x29,0x4d,0x00,0x05,0x05,0x04,0x61, +0x00,0x04,0x04,0x2d,0x04,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x12,0x21,0x23,0x12,0x11,0x11,0x11,0x0a,0x08,0x1e,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x33,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x23,0x03,0x23,0x11,0x5c,0x5a,0x6c,0xa2,0x62,0xb5,0x9b,0x38,0x5f,0x5c,0x1d,0x1d,0x2d,0x38,0x25,0xaa, +0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0xcd,0x47,0x58,0x5c,0x4f,0x37,0x2e,0x01,0x51,0xfe,0xaf,0x00,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xba,0x00,0x00,0x00,0x02,0x00,0x5d,0xff,0x4c,0x02,0x44,0x02,0xda,0x00,0x10,0x00,0x14,0x00,0x40,0x40,0x3d,0x0a,0x07,0x02,0x03,0x02,0x01, +0x4c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x05,0x01,0x02,0x02,0x38,0x4d,0x08,0x06,0x02,0x01,0x01,0x39,0x4d,0x00,0x00,0x00,0x04,0x61,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x11,0x11,0x00,0x00,0x11,0x14,0x11,0x14,0x13,0x12,0x00,0x10,0x00,0x0f,0x12,0x12,0x12,0x21,0x09,0x09,0x1a,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x23,0x03, +0x13,0x33,0x03,0x13,0x33,0x15,0x14,0x06,0x23,0x25,0x11,0x33,0x11,0x01,0x6c,0x1d,0x2d,0x38,0x2f,0xf9,0xf9,0x67,0xf0,0xcb,0x43,0x5f,0x5c,0xfe,0xd4,0x5a,0xb4,0x4f,0x37,0x2e,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0xcb,0x47,0x58,0x5c,0xb4,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xf6,0x01,0xfc,0x02,0x30,0x00,0x13, +0x00,0x21,0x00,0x67,0xb6,0x10,0x0a,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x19,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x31,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x03,0x06,0x02,0x00,0x00,0x2f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x2b,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x31,0x4d,0x00,0x03, +0x03,0x29,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x59,0x40,0x17,0x15,0x14,0x01,0x00,0x1c,0x1a,0x14,0x21,0x15,0x21,0x0f,0x0e,0x0d,0x0c,0x08,0x06,0x00,0x13,0x01,0x13,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27, +0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x65,0x64,0x53,0x3e,0x50,0x07,0x03,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x42,0x42,0x0a,0x6e,0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x69,0xfd,0xda,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46,0x44,0x40,0x96,0x40,0x44,0x00,0x00, +0x00,0x02,0x00,0x5c,0xff,0x4c,0x02,0x1a,0x02,0xe4,0x00,0x1b,0x00,0x31,0x00,0x48,0x40,0x45,0x0c,0x01,0x04,0x05,0x18,0x01,0x03,0x04,0x02,0x4c,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x69,0x00,0x06,0x06,0x00,0x61,0x00,0x00,0x00,0x2e,0x4d,0x08,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2f,0x4d,0x07,0x01,0x02,0x02,0x2d,0x02,0x4e, +0x1d,0x1c,0x00,0x00,0x2c,0x2a,0x26,0x24,0x23,0x21,0x1c,0x31,0x1d,0x31,0x00,0x1b,0x00,0x1b,0x2e,0x24,0x09,0x08,0x18,0x2b,0x17,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35, +0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x5c,0x34,0x5e,0x3d,0x3d,0x5b,0x34,0x40,0x33,0x2d,0x43,0x26,0x35,0x60,0x3f,0x3c,0x4d,0x07,0x03,0x03,0x86,0x3a,0x48,0x48,0x3b,0x37,0x27,0x34,0x40,0x40,0x34,0x34,0x41,0x4b,0xb4,0x02,0xc5,0x3f,0x5f,0x35,0x2d,0x51,0x35,0x38,0x56,0x0d,0x03,0x06,0x36,0x53,0x33,0x41,0x63,0x37,0x3c, +0x34,0x7a,0xa0,0xfc,0x4f,0x3f,0x3f,0x4f,0x4c,0x3f,0x33,0x33,0x3f,0x48,0x3b,0xfe,0xc5,0x3f,0x4f,0x00,0x00,0x01,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x00,0x0e,0x00,0x23,0x40,0x20,0x0d,0x07,0x01,0x03,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x2b,0x4d,0x03,0x01,0x02,0x02,0x2d,0x02,0x4e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x18, +0x12,0x04,0x08,0x18,0x2b,0x17,0x35,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x15,0xff,0xc3,0x5f,0x7c,0x0c,0x0a,0x03,0x03,0x09,0x0b,0x79,0x5c,0xc3,0xb4,0xb4,0x02,0x26,0xfe,0x93,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0xb4,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0xda,0x00,0x16, +0x00,0x24,0x00,0x3f,0x40,0x3c,0x0c,0x01,0x01,0x03,0x01,0x4c,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x28,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1f,0x1d,0x17,0x24,0x18,0x24,0x10,0x0f,0x0e,0x0d,0x08,0x07,0x00,0x16,0x01,0x16,0x08, +0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x26,0x26,0x27,0x35,0x21,0x15,0x21,0x1e,0x02,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x61,0x77,0x31,0x58,0x3a,0x06,0x22,0x57,0x38,0x01,0x89,0xfe,0xdc,0x61,0x89,0x49,0x76,0x62,0x39,0x43,0x1b,0x23,0x3f, +0x37,0x46,0x45,0x0a,0x73,0x64,0x61,0x3f,0x5e,0x35,0x1c,0x42,0x2a,0x52,0x4b,0x43,0x78,0x86,0x59,0x82,0x7d,0x50,0x51,0x5e,0x3f,0x58,0x29,0x4b,0x3c,0x61,0x40,0x47,0x00,0x01,0x00,0x4b,0xff,0xf9,0x02,0x12,0x02,0x2d,0x00,0x2d,0x00,0x52,0x40,0x4f,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80, +0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x09,0x01,0x00,0x00,0x32,0x00,0x4e,0x02,0x00,0x2b,0x2a,0x28,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x15,0x13,0x12,0x10,0x0d,0x07,0x06,0x00,0x2d,0x02,0x2d,0x0a,0x08,0x16,0x2b, +0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x4e,0x35,0x5f,0x6f,0x42,0x3c,0x32,0x3f,0x69,0x5a,0x2f,0x56,0x66,0x01,0x5a,0x01,0x36, +0x2c,0x2f,0x2e,0x37,0x37,0x2f,0x75,0x78,0x34,0x3c,0x3c,0x34,0x35,0x31,0x39,0x5a,0x6a,0x07,0x59,0x4b,0x3c,0x4c,0x04,0x04,0x04,0x3f,0x2e,0x45,0x4a,0x4d,0x41,0x1d,0x22,0x29,0x23,0x24,0x2a,0x4e,0x2f,0x29,0x27,0x2d,0x2a,0x23,0x49,0x55,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x47,0x02,0x30,0x02,0xda,0x00,0x1e,0x00,0x18,0x40,0x15, +0x12,0x01,0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x28,0x00,0x4e,0x11,0x1e,0x02,0x08,0x18,0x2b,0x05,0x27,0x37,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x21,0x35,0x21,0x15,0x07,0x06,0x06,0x15,0x14,0x17,0x17,0x16,0x16,0x15,0x14,0x07,0x01,0xe4,0x46,0x2e,0x0a,0x22,0x84,0x65,0x62,0x62,0x6d, +0x86,0xfe,0xba,0x01,0xb3,0xba,0x5a,0x52,0x89,0x81,0x2f,0x32,0x1b,0xb9,0x2a,0x49,0x10,0x0e,0x1a,0x0b,0x26,0x1d,0x62,0x49,0x43,0x8d,0x5c,0x71,0x52,0x5a,0xa6,0x50,0x6f,0x2f,0x4d,0x28,0x25,0x0d,0x3c,0x26,0x27,0x29,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0x30,0x02,0x06,0x01,0x1b,0x00,0x00,0x00,0x03,0x00,0x58, +0xff,0xf6,0x02,0x00,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x28,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00, +0x0d,0x01,0x0d,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0xdc,0xf4,0x3f,0x3b,0x3a,0x40,0x7a,0x3b,0x3f,0xf4,0x40,0x0a,0x70,0x62,0x01,0x40, +0x62,0x70,0x6f,0x62,0xfe,0xbf,0x62,0x70,0x01,0x9d,0x75,0x40,0x42,0x42,0x40,0xfe,0x3e,0x42,0x40,0x7d,0x7d,0x40,0x42,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x26,0x02,0x26,0x00,0x0d,0x00,0x28,0x40,0x25,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x00,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x00,0x29,0x00,0x4e,0x01,0x00, +0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x05,0x08,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x9a,0x49,0x57,0xc3,0x01,0x1d,0x26,0x20,0x8c,0x55,0x46,0x01,0x39,0x52,0xfe,0x75,0x22,0x27,0x52,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x02,0x06,0x02,0x19,0x00,0x00, +0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x22,0x40,0x1f,0x09,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x28,0x4d,0x03,0x02,0x02,0x01,0x01,0x29,0x01,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x04,0x08,0x18,0x2b,0x33,0x13,0x27,0x33,0x01,0x23,0x03,0x26,0x26,0x27,0x14,0x06,0x07,0x03,0x32,0xcc, +0x4a,0x60,0x01,0x12,0x60,0x83,0x0d,0x0c,0x05,0x08,0x0c,0x7e,0x02,0x1d,0xbd,0xfd,0x26,0x01,0x65,0x23,0x36,0x0f,0x0f,0x36,0x23,0xfe,0x9b,0x00,0x00,0x01,0x00,0x5d,0xff,0x4c,0x01,0xfb,0x02,0x26,0x00,0x18,0x00,0x57,0xb5,0x0e,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x18,0x02,0x01,0x00,0x00,0x2b,0x4d,0x00,0x01, +0x01,0x03,0x61,0x04,0x01,0x03,0x03,0x29,0x4d,0x06,0x01,0x05,0x05,0x2d,0x05,0x4e,0x1b,0x40,0x1c,0x02,0x01,0x00,0x00,0x2b,0x4d,0x00,0x03,0x03,0x29,0x4d,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x2f,0x4d,0x06,0x01,0x05,0x05,0x2d,0x05,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x18,0x00,0x18,0x24,0x11,0x13,0x23,0x11,0x07,0x08,0x1b, +0x2b,0x17,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x5d,0x5a,0x3c,0x37,0x38,0x3f,0x5a,0x58,0x03,0x03,0x36,0x3e,0x3e,0x30,0x03,0x03,0x02,0xb4,0x02,0xda,0xfe,0xa2,0x3e,0x46,0x46,0x3e,0x01,0x5e,0xfd,0xda,0x69,0x35,0x3e,0x3e,0x35,0x7d,0xa0,0x00, +0xff,0xff,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0x69,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x47,0x02,0x1f,0x02,0xe4,0x00,0x2e,0x00,0x3a,0x40,0x37,0x1f,0x01,0x02,0x01,0x01,0x4c,0x14,0x13,0x02,0x02,0x49,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x80,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x05,0x01,0x00,0x00,0x03,0x61, +0x00,0x03,0x03,0x2e,0x00,0x4e,0x01,0x00,0x2c,0x2b,0x28,0x26,0x0a,0x08,0x07,0x05,0x00,0x2e,0x01,0x2e,0x06,0x08,0x16,0x2b,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x16,0x07,0x07,0x27,0x37,0x36,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33, +0x32,0x16,0x16,0x17,0x23,0x26,0x26,0x01,0x45,0x37,0x44,0x44,0x37,0x92,0x8e,0x42,0x53,0x74,0x8f,0x4a,0x1e,0x2a,0x29,0x46,0x2b,0x0e,0x0a,0x1c,0x8b,0x5e,0x5b,0x4e,0x3e,0x34,0x41,0x37,0x62,0x40,0x40,0x5e,0x36,0x02,0x5a,0x04,0x40,0x02,0x92,0x42,0x32,0x31,0x39,0x50,0x46,0x38,0x4e,0x23,0x2c,0x17,0x65,0x44,0x42,0x27,0x46,0x18, +0x24,0x09,0x2c,0x1e,0x5e,0x45,0x42,0x60,0x0b,0x03,0x0d,0x51,0x39,0x35,0x53,0x2f,0x2d,0x4e,0x33,0x29,0x33,0x00,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x02,0x06,0x01,0x22,0x00,0x00,0x00,0x01,0x00,0x19,0xff,0xfb,0x02,0x2b,0x02,0x26,0x00,0x13,0x00,0x59,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x19,0x05,0x03,0x02, +0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x2b,0x4d,0x00,0x06,0x06,0x00,0x61,0x02,0x07,0x02,0x00,0x00,0x32,0x00,0x4e,0x1b,0x40,0x1d,0x05,0x03,0x02,0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x2b,0x4d,0x00,0x02,0x02,0x29,0x4d,0x00,0x06,0x06,0x00,0x61,0x07,0x01,0x00,0x00,0x32,0x00,0x4e,0x59,0x40,0x15,0x01,0x00,0x12,0x10,0x0d,0x0c,0x0b, +0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x02,0x18,0x4c,0x5b,0xad,0x57,0x54,0x02,0x11,0x63,0x29,0x23,0x18,0x05,0x60,0x4f,0x01,0x2c,0xfe,0x2a,0x01,0xd6,0x50,0x50,0xfe,0xce,0x29,0x2c,0x54, +0x00,0x02,0x00,0x5e,0xff,0x4c,0x01,0xfe,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x38,0x40,0x35,0x0e,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x31,0x4d,0x06,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2f,0x4d,0x05,0x01,0x02,0x02,0x2d,0x02,0x4e,0x13,0x12,0x00,0x00,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11, +0x00,0x11,0x25,0x23,0x07,0x08,0x18,0x2b,0x17,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5e,0x70,0x61,0x61,0x6e,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x76,0x39,0x3d,0x3d,0x39,0x39,0x3d,0x3f,0xb4,0x02,0x18,0x5f, +0x6d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x44,0x40,0x96,0x40,0x44,0x44,0x40,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x47,0x02,0x0b,0x02,0x30,0x00,0x1f,0x00,0x1d,0x40,0x1a,0x1f,0x01,0x01,0x49,0x00,0x01,0x02,0x01,0x86,0x00,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x31,0x02,0x4e,0x22,0x12,0x2b,0x03, +0x08,0x19,0x2b,0x05,0x37,0x36,0x26,0x27,0x27,0x26,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x07,0x07,0x01,0x59,0x2b,0x0e,0x0a,0x1c,0x76,0x4a,0x52,0x77,0x64,0x5f,0x74,0x03,0x5a,0x03,0x41,0x38,0x3b,0x46,0x31,0x2b,0x7a,0x4a,0x1e,0x2a,0x29,0x92,0x46, +0x18,0x24,0x09,0x25,0x17,0x63,0x44,0x82,0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x83,0x25,0x3a,0x0e,0x26,0x17,0x65,0x44,0x42,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xf6,0x02,0x3a,0x02,0x26,0x00,0x14,0x00,0x22,0x00,0x30,0x40,0x2d,0x04,0x01,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x2b,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05, +0x01,0x00,0x00,0x2f,0x00,0x4e,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x0c,0x0b,0x0a,0x08,0x00,0x14,0x01,0x14,0x07,0x08,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x23,0x15,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01, +0x29,0x40,0x5f,0x35,0x35,0x5f,0x40,0x01,0x11,0xa9,0x32,0x3a,0x35,0x5f,0x40,0x39,0x41,0x41,0x39,0x39,0x41,0x41,0x0a,0x35,0x5e,0x3f,0x8c,0x3f,0x5f,0x34,0x52,0x03,0x04,0x43,0x36,0x8c,0x3f,0x5e,0x35,0x50,0x46,0x3c,0x8c,0x3c,0x46,0x46,0x3c,0x8c,0x3c,0x46,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08,0x02,0x26,0x00,0x0f, +0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x00,0x04,0x04,0x00,0x5f,0x05,0x01,0x00,0x00,0x29,0x00,0x4e,0x01,0x00,0x0e,0x0c,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x0f,0x01,0x0f,0x06,0x08,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x6d,0x44, +0x52,0xa8,0x01,0xd9,0xd7,0x21,0x1b,0x96,0x4f,0x42,0x01,0x43,0x52,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x26,0x02,0x06,0x01,0x51,0x00,0x00,0x00,0x02,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x2b,0x00,0x1e,0x00,0x27,0x00,0x3b,0x40,0x38,0x0b,0x01,0x01,0x06,0x01,0x4c,0x0a,0x01,0x02,0x4a, +0x00,0x06,0x06,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x05,0x01,0x01,0x01,0x00,0x61,0x03,0x01,0x00,0x00,0x29,0x4d,0x07,0x01,0x04,0x04,0x2d,0x04,0x4e,0x00,0x00,0x26,0x25,0x20,0x1f,0x00,0x1e,0x00,0x1e,0x17,0x21,0x1f,0x11,0x08,0x08,0x1a,0x2b,0x17,0x35,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x15,0x06,0x06,0x15,0x07,0x06, +0x16,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x15,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0xff,0x3b,0x5b,0x33,0x22,0x3e,0x28,0x16,0x1d,0x01,0x01,0x46,0x38,0x50,0x3c,0x5b,0x34,0x33,0x5a,0x3c,0x08,0x38,0x45,0x42,0x35,0x06,0xb4,0xb4,0x34,0x5e,0x3d,0x92,0x34,0x56,0x39,0x07,0x5f,0x05,0x3b,0x26,0x9c, +0x3a,0x49,0x01,0xdf,0x32,0x58,0x3b,0x92,0x3d,0x5e,0x34,0xb4,0xfb,0x49,0x3a,0x9c,0x36,0x44,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x17,0x00,0x2d,0x40,0x2a,0x05,0x03,0x02,0x01,0x01,0x2b,0x4d,0x04,0x01,0x02,0x02,0x00, +0x62,0x06,0x01,0x00,0x00,0x29,0x4d,0x08,0x01,0x07,0x07,0x2d,0x07,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x13,0x13,0x11,0x11,0x13,0x13,0x11,0x09,0x08,0x1d,0x2b,0x17,0x35,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x11,0x33,0x11,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x15,0xff,0x5c,0x6d,0x54,0x3e,0x3d,0x4e,0x3d,0x3e, +0x54,0x6d,0x5c,0xb4,0xb4,0x6c,0x5e,0x01,0x5c,0xfe,0xa4,0x3d,0x44,0x01,0xdd,0xfe,0x23,0x44,0x3d,0x01,0x5c,0xfe,0xa4,0x5e,0x6c,0xb4,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0xf6,0x02,0x22,0x02,0x30,0x00,0x2d,0x00,0x34,0x40,0x31,0x2a,0x01,0x01,0x02,0x01,0x4c,0x20,0x1f,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01, +0x01,0x01,0x00,0x61,0x04,0x05,0x02,0x00,0x00,0x2f,0x00,0x4e,0x01,0x00,0x28,0x26,0x19,0x17,0x14,0x13,0x10,0x0e,0x00,0x2d,0x01,0x2d,0x06,0x08,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x27,0x35,0x16, +0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0xb5,0x3a,0x45,0x4c,0x41,0x19,0x1f,0x22,0x1c,0x1c,0x20,0x4e,0x20,0x1c,0x1d,0x21,0x21,0x1c,0x44,0x4e,0x44,0x3b,0x31,0x41,0x05,0x02,0x04,0x40,0x0a,0x5c,0x4f,0xbb,0x57,0x73,0x0a,0x5f,0x05,0x3c,0x2e,0xc7,0x29,0x30,0x30,0x29,0xbe,0xbe,0x29,0x30,0x30,0x29,0xc7,0x2b, +0x39,0x06,0x5f,0x0a,0x70,0x55,0xbb,0x4f,0x5c,0x3f,0x35,0x35,0x3f,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x11,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x06,0x06,0xb0,0x19,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x09,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x53,0x00,0x00, +0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x84,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x06,0x06,0xb2,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x06,0x06,0xb0,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x51,0x00,0x00, +0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x84,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x06,0x06,0xb2,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x06,0x06,0xb0,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0xf6,0x02,0x22, +0x03,0x11,0x02,0x26,0x02,0x8d,0x00,0x00,0x00,0x06,0x06,0xb0,0x14,0x00,0x00,0x00,0x00,0x03,0x00,0x55,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x03,0x00,0x17,0x00,0x25,0x00,0x84,0xb6,0x14,0x0e,0x02,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x00,0x01,0x00,0x85,0x08,0x01,0x01,0x03,0x01,0x85,0x00,0x07,0x07,0x03, +0x61,0x04,0x01,0x03,0x03,0x31,0x4d,0x0a,0x01,0x06,0x06,0x02,0x61,0x05,0x09,0x02,0x02,0x02,0x2f,0x02,0x4e,0x1b,0x40,0x2c,0x00,0x00,0x01,0x00,0x85,0x08,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x04,0x2b,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x31,0x4d,0x00,0x05,0x05,0x29,0x4d,0x0a,0x01,0x06,0x06,0x02,0x61,0x09,0x01,0x02, +0x02,0x2f,0x02,0x4e,0x59,0x40,0x1e,0x19,0x18,0x05,0x04,0x00,0x00,0x20,0x1e,0x18,0x25,0x19,0x25,0x13,0x12,0x11,0x10,0x0c,0x0a,0x04,0x17,0x05,0x17,0x00,0x03,0x00,0x03,0x11,0x0b,0x08,0x17,0x2b,0x13,0x37,0x33,0x07,0x03,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32, +0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xea,0x6a,0x64,0x6f,0x3d,0x52,0x65,0x64,0x53,0x3e,0x50,0x07,0x03,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x42,0x42,0x02,0x85,0x8c,0x8c,0xfd,0x71,0x6e,0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x69,0xfd,0xda,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46, +0x44,0x40,0x96,0x40,0x44,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0xff,0xf9,0x02,0x12,0x03,0x11,0x00,0x2d,0x00,0x31,0x01,0x43,0x4b,0xb0,0x13,0x50,0x58,0x40,0x40,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04,0x03,0x72,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07, +0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x4b,0xb0,0x14,0x50,0x58,0x40,0x41,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01, +0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x40,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04, +0x03,0x72,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x40,0x41,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03, +0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x59,0x59,0x59,0x40,0x21,0x2e,0x2e,0x02,0x00,0x2e,0x31,0x2e, +0x31,0x30,0x2f,0x2b,0x2a,0x28,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x15,0x13,0x12,0x10,0x0d,0x07,0x06,0x00,0x2d,0x02,0x2d,0x0d,0x08,0x16,0x2b,0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14, +0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x03,0x37,0x33,0x07,0x01,0x4e,0x35,0x5f,0x6f,0x42,0x3c,0x32,0x3f,0x69,0x5a,0x2f,0x56,0x66,0x01,0x5a,0x01,0x36,0x2c,0x2f,0x2e,0x37,0x37,0x2f,0x75,0x78,0x34,0x3c,0x3c,0x34,0x35,0x31,0x39,0x5a,0x6a,0xb8,0x6a,0x64,0x6f,0x07,0x59,0x4b,0x3c,0x4c,0x04,0x04,0x04,0x3f,0x2e,0x45,0x4a, +0x4d,0x41,0x1d,0x22,0x29,0x23,0x24,0x2a,0x4e,0x2f,0x29,0x27,0x2d,0x2a,0x23,0x49,0x55,0x02,0x8c,0x8c,0x8c,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x06,0x06,0xb0,0x23,0x00,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x4c,0x02,0x26,0x02,0x26,0x00,0x1a,0x00,0x39,0x40,0x36, +0x19,0x06,0x02,0x02,0x00,0x01,0x4c,0x00,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x01,0x01,0x00,0x00,0x2b,0x4d,0x07,0x06,0x02,0x05,0x05,0x29,0x4d,0x00,0x04,0x04,0x03,0x61,0x00,0x03,0x03,0x2d,0x03,0x4e,0x00,0x00,0x00,0x1a,0x00,0x1a,0x12,0x21,0x23,0x11,0x15,0x11,0x08,0x08,0x1c,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x07,0x13,0x33, +0x11,0x33,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x23,0x11,0x34,0x36,0x37,0x03,0x5c,0x56,0x03,0x08,0xe5,0x70,0x2a,0x5f,0x5c,0x1d,0x1d,0x2d,0x38,0x2a,0x03,0x08,0xe5,0x02,0x26,0xfe,0xd8,0x2b,0x5c,0x1d,0x01,0xcc,0xfe,0x21,0x47,0x58,0x5c,0x4f,0x37,0x2e,0x01,0x29,0x2c,0x5c,0x1d,0xfe,0x32,0x00,0xff,0xff,0x00,0x30, +0xff,0x4c,0x02,0x28,0x02,0xda,0x02,0x06,0x02,0x25,0x00,0x00,0x00,0x02,0x00,0x0f,0xff,0xf6,0x02,0x49,0x02,0x26,0x00,0x18,0x00,0x2c,0x00,0x49,0x40,0x46,0x16,0x01,0x05,0x06,0x01,0x4c,0x00,0x06,0x01,0x05,0x01,0x06,0x05,0x80,0x08,0x03,0x02,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x07,0x0a,0x02,0x05,0x05,0x00,0x61,0x04, +0x09,0x02,0x00,0x00,0x2f,0x00,0x4e,0x1a,0x19,0x01,0x00,0x29,0x26,0x23,0x21,0x1e,0x1d,0x19,0x2c,0x1a,0x2c,0x14,0x12,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x00,0x18,0x01,0x18,0x0b,0x08,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x23,0x35,0x21,0x15,0x23,0x16,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x27,0x32, +0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x23,0x23,0x22,0x15,0x15,0x14,0xb5,0x3a,0x44,0x27,0x24,0x73,0x02,0x3a,0x73,0x24,0x27,0x43,0x3b,0x31,0x3e,0x08,0x07,0x3e,0x1e,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x3d,0xc6,0x3d,0x0a,0x56,0x4b,0xbc,0x2e,0x42,0x11,0x52,0x52,0x11,0x42,0x2e,0xbc,0x4b,0x56,0x39,0x32,0x32, +0x39,0x4c,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xea,0x54,0x54,0xea,0x54,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x02,0x06,0x02,0x4b,0x00,0x00,0x00,0x01,0x00,0x1a,0xff,0x4c,0x02,0x21,0x02,0x2a,0x00,0x15,0x00,0x29,0x40,0x26,0x14,0x0e,0x01,0x03,0x03,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x61,0x02,0x01,0x01, +0x01,0x3b,0x4d,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x00,0x15,0x00,0x15,0x1a,0x21,0x23,0x05,0x09,0x19,0x2b,0x05,0x35,0x03,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x15,0x01,0x09,0x8b,0x11,0x35,0x1e,0x1e,0x3a,0x51,0x10,0x4e,0x0b,0x09,0x03,0x03,0x0b,0x0b,0x74,0x5c, +0xbe,0xb4,0xb4,0x01,0xa7,0x31,0x52,0x36,0x35,0xfe,0xfa,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0xb4,0x00,0x00,0x00,0x01,0x00,0x2f,0xff,0xfb,0x02,0x44,0x02,0xdf,0x00,0x1a,0x00,0x59,0xb6,0x0d,0x07,0x02,0x04,0x02,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x17,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00, +0x04,0x04,0x00,0x61,0x01,0x05,0x02,0x00,0x00,0x42,0x00,0x4e,0x1b,0x40,0x1b,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00,0x01,0x01,0x39,0x4d,0x00,0x04,0x04,0x00,0x61,0x05,0x01,0x00,0x00,0x42,0x00,0x4e,0x59,0x40,0x11,0x01,0x00,0x19,0x17,0x14,0x12,0x11,0x0f,0x0c,0x0b,0x00,0x1a,0x01,0x1a,0x06,0x09,0x16,0x2b,0x05, +0x22,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x23,0x13,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x17,0x13,0x16,0x33,0x33,0x15,0x02,0x1c,0x3a,0x50,0x11,0x48,0x07,0x0b,0x03,0x03,0x0c,0x08,0x7d,0x61,0xca,0x23,0x12,0x30,0x3c,0x4b,0x66,0x24,0xa9,0x11,0x35,0x28,0x05,0x37,0x34,0xea,0x19,0x2b,0x10,0x10,0x2c,0x14,0xfe,0xac, +0x02,0x04,0x5b,0x2d,0x53,0x6a,0xfe,0x09,0x31,0x52,0x00,0x00,0x00,0x03,0x00,0x2e,0x00,0x00,0x02,0x2a,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x14,0x00,0x3a,0x40,0x37,0x11,0x01,0x06,0x05,0x01,0x4c,0x00,0x06,0x00,0x02,0x04,0x06,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x01,0x5f,0x07,0x03,0x02, +0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x33,0x13,0x33,0x13,0x23,0x27,0x23,0x07,0x25,0x33,0x03,0x23,0x03,0x33,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x2e,0xaa,0xa8,0xaa,0x98,0x32,0xd4,0x32,0x01,0x5c,0x3e,0x98,0x3d,0x8a,0xc1,0x43,0x0c,0x0e,0x02, +0x02,0x10,0x0c,0x02,0xda,0xfd,0x26,0xd5,0xd5,0x28,0x02,0x8a,0xfe,0x4b,0x01,0x29,0x37,0x46,0x0d,0x0b,0x49,0x36,0x00,0x00,0x00,0x06,0x00,0x4b,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x0e,0x00,0x12,0x00,0x1c,0x00,0x23,0x00,0x2b,0x00,0x32,0x00,0x4d,0x40,0x4a,0x23,0x1d,0x18,0x17,0x04,0x04,0x03,0x08,0x01,0x07,0x04,0x32,0x2c,0x28, +0x27,0x04,0x02,0x07,0x03,0x4c,0x00,0x04,0x00,0x07,0x02,0x04,0x07,0x67,0x05,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x2b,0x29,0x26,0x24,0x1c,0x1a,0x15,0x13,0x12,0x11,0x10,0x0f,0x00,0x0e,0x00,0x0d,0x21,0x09,0x09,0x17,0x2b,0x33,0x11,0x33, +0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x4b,0xf2,0x5c,0x6c,0x3c,0x35,0x3e,0x45,0x74,0x63,0xcb,0x3c,0x3c,0x66,0x67,0x0d, +0x18,0x0a,0x0a,0x18,0x0d,0x67,0xbf,0x1f,0x22,0x22,0x1f,0xbf,0x6a,0x19,0x13,0x13,0x19,0x6a,0xbf,0x27,0x2c,0x2c,0x27,0x02,0xda,0x64,0x56,0x43,0x58,0x0e,0x0d,0x5c,0x47,0x5b,0x6c,0x28,0x02,0x8a,0xfe,0xd9,0x03,0x02,0x01,0x1d,0x02,0x03,0xfe,0xef,0x12,0x41,0x2b,0x2b,0x40,0x12,0xfd,0x8c,0x04,0x01,0x33,0x04,0xfe,0xd6,0x13,0x48, +0x32,0x32,0x47,0x13,0x00,0x02,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x19,0x00,0x21,0x00,0x4a,0x40,0x47,0x1b,0x10,0x02,0x02,0x03,0x1a,0x11,0x02,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00, +0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x04,0x00,0x51,0x01,0x00,0x17,0x16,0x14,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x19,0x01,0x19,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16, +0x01,0x2c,0x67,0x7b,0x7b,0x67,0x69,0x79,0x2a,0x62,0x56,0x2e,0x24,0x24,0x2e,0x56,0x62,0x2a,0x79,0xe5,0x1c,0x20,0x20,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0x53,0x61,0x0f,0xfd,0x80,0x0f,0x61,0x53,0x65,0x77,0x4f,0x02,0x50,0x18,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x00,0x04,0x00,0x4b,0x00,0x00,0x02,0x0e,0x02,0xda,0x00,0x09, +0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x36,0x40,0x33,0x1f,0x18,0x13,0x12,0x04,0x02,0x03,0x01,0x4c,0x05,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x04,0x01,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x17,0x15,0x10,0x0e,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x08,0x21,0x07,0x09,0x17,0x2b,0x33,0x11, +0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x4b,0xdb,0x6b,0x7d,0x7d,0x6b,0xb1,0x3c,0x3c,0x66,0x4b,0x19,0x2c,0x13,0x13,0x2c,0x19,0x4b,0xcd,0x1d,0x1f,0x1f,0x1d,0x02,0xda,0x77,0x65,0xfe,0xde,0x65,0x77,0x28,0x02,0x8a, +0xfd,0x76,0x09,0x07,0x02,0x6a,0x08,0x08,0xfd,0x9f,0x17,0x47,0x2d,0x01,0x22,0x2d,0x47,0x17,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x35,0x40,0x32,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x04,0x04,0x05,0x5f,0x08, +0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1b,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x25,0x33,0x11,0x23,0x55,0x01,0xbd,0xfe,0xd5,0x01,0x08,0xfe,0xf8,0x01,0x2b,0xfe,0x6e,0x3c,0x3c,0x02,0xda,0x28,0xfe,0xdf,0x28,0xfe,0xbf, +0x28,0x28,0x02,0x8a,0x00,0x02,0x00,0x5a,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x09,0x00,0x0d,0x00,0x33,0x40,0x30,0x00,0x02,0x00,0x03,0x05,0x02,0x03,0x67,0x06,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x04,0x5f,0x07,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x09,0x11, +0x11,0x11,0x11,0x08,0x09,0x1a,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x27,0x33,0x11,0x23,0x5a,0x01,0xbd,0xfe,0xd5,0x01,0x08,0xfe,0xf8,0x67,0x3c,0x3c,0x02,0xda,0x28,0xfe,0xdf,0x28,0xfe,0x97,0x28,0x02,0x8a,0x00,0x03,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x1c,0x00,0x24,0x00,0x2a,0x00,0x4f,0x40,0x4c, +0x1e,0x10,0x02,0x02,0x03,0x25,0x1d,0x15,0x11,0x04,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x06,0x03,0x02,0x06,0x80,0x00,0x06,0x07,0x01,0x05,0x04,0x06,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x2a,0x29,0x19,0x18,0x17,0x16,0x14,0x12,0x0f, +0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1c,0x01,0x1c,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x33,0x15,0x14,0x06,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x35,0x23,0x01,0x2c,0x67,0x7b,0x7b,0x67,0x69,0x79, +0x2a,0x62,0x56,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x50,0xe0,0x7a,0xe4,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x3c,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0x53,0x61,0x0f,0xfd,0x80,0x0f,0x0f,0x01,0x1d,0x28,0xa0,0x65,0x77,0x4f,0x02,0x50,0x18,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x18,0x18,0x47,0x2e,0x78,0x00,0x00,0x00,0x03,0x00,0x4b, +0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x3f,0x40,0x3c,0x02,0x01,0x00,0x09,0x01,0x07,0x01,0x00,0x07,0x67,0x00,0x01,0x00,0x04,0x06,0x01,0x04,0x67,0x08,0x01,0x06,0x03,0x03,0x06,0x57,0x08,0x01,0x06,0x06,0x03,0x5f,0x0a,0x05,0x02,0x03,0x06,0x03,0x4f,0x00,0x00,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c, +0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x23,0x4b,0x90,0xa2,0x90,0x90,0xa2,0x66,0x3c,0x3c,0x01,0x32,0x3c,0x3c,0x02,0xda,0xfe,0xb5,0x01,0x4b,0xfd,0x26,0x01,0x67,0xfe,0x99,0x28,0x02,0x8a,0xfd,0x76,0x02, +0x8a,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x07,0x03,0x02,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x06,0x04,0x02,0x00,0x00,0x05,0x5f,0x08,0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09, +0x09,0x1b,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x27,0x33,0x11,0x23,0x50,0x95,0x95,0x01,0xb8,0x93,0x93,0xf9,0x3c,0x3c,0x28,0x02,0x8a,0x28,0x28,0xfd,0x76,0x28,0x28,0x02,0x8a,0x00,0x02,0x00,0x1b,0xff,0xf6,0x02,0x49,0x02,0xda,0x00,0x12,0x00,0x18,0x00,0x3f,0x40,0x3c,0x13,0x09,0x02,0x02,0x01,0x01, +0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x06,0x05,0x02,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x18,0x17,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x12,0x01,0x12,0x08,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32, +0x37,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x06,0x37,0x36,0x36,0x35,0x11,0x23,0xff,0x69,0x7b,0x2a,0x65,0x55,0x30,0x24,0xa1,0x01,0x97,0x66,0x7b,0x15,0x1d,0x1f,0x3c,0x0a,0x77,0x65,0x53,0x61,0x0f,0x02,0x85,0x28,0x28,0xfe,0x20,0x65,0x77,0x50,0x17,0x47,0x2e,0x01,0xe0,0x00,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x45, +0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x43,0x40,0x40,0x13,0x07,0x02,0x01,0x07,0x14,0x01,0x04,0x01,0x02,0x4c,0x00,0x01,0x00,0x04,0x06,0x01,0x04,0x67,0x00,0x07,0x07,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x4d,0x08,0x01,0x06,0x06,0x03,0x60,0x09,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x0e,0x0d, +0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x07,0x13,0x23,0x03,0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x03,0x07,0x4b,0x90,0x3a,0xe3,0x33,0xa1,0xbb,0xa0,0x7e,0x4c,0x66,0x3c,0x3c,0x01,0x50,0x42,0x99,0x29,0x02,0xda,0xfe,0xad,0x01,0x53,0xf0,0xfe,0x16,0x01,0x5f,0xfe, +0xa1,0x28,0x02,0x8a,0xfd,0x76,0x01,0x98,0x3d,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x29,0x40,0x26,0x00,0x04,0x04,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x03,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x09,0x08,0x07,0x06,0x00,0x05,0x00,0x05,0x11, +0x11,0x06,0x09,0x18,0x2b,0x33,0x11,0x33,0x11,0x21,0x15,0x25,0x33,0x11,0x23,0x64,0x90,0x01,0x32,0xfe,0x68,0x3c,0x3c,0x02,0xda,0xfd,0x4e,0x28,0x28,0x02,0x8a,0x00,0x00,0x03,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x1c,0x00,0x43,0x40,0x40,0x0f,0x0c,0x02,0x05,0x00,0x16,0x03,0x02,0x03,0x05,0x02,0x4c, +0x00,0x03,0x05,0x06,0x05,0x03,0x06,0x80,0x07,0x01,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x00,0x14,0x00,0x14,0x16,0x11,0x12,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x17,0x37,0x33,0x11,0x23,0x11,0x34,0x36, +0x36,0x37,0x03,0x23,0x03,0x1e,0x02,0x15,0x11,0x13,0x37,0x27,0x23,0x01,0x33,0x11,0x23,0x32,0xad,0x50,0x4f,0xa8,0x90,0x02,0x02,0x01,0x88,0x32,0x8b,0x02,0x02,0x02,0x9f,0x20,0x57,0x40,0x01,0x3c,0x3c,0x3c,0x02,0xda,0xdf,0xdf,0xfd,0x26,0x01,0xb8,0x33,0x65,0x56,0x1b,0xfe,0x84,0x01,0x7c,0x1b,0x56,0x65,0x33,0xfe,0x48,0x01,0x68, +0x59,0xf1,0xfd,0x76,0x02,0x8a,0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x01,0xf9,0x02,0xda,0x00,0x0f,0x00,0x13,0x00,0x35,0x40,0x32,0x0b,0x03,0x02,0x04,0x05,0x01,0x4c,0x01,0x01,0x00,0x00,0x05,0x04,0x00,0x05,0x67,0x00,0x04,0x02,0x02,0x04,0x57,0x00,0x04,0x04,0x02,0x5f,0x06,0x03,0x02,0x02,0x04,0x02,0x4f,0x00,0x00,0x13,0x12, +0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x15,0x11,0x07,0x06,0x19,0x2b,0x33,0x11,0x33,0x13,0x26,0x26,0x35,0x11,0x33,0x11,0x23,0x03,0x16,0x16,0x15,0x11,0x25,0x33,0x01,0x23,0x5f,0x7c,0xf9,0x03,0x02,0x2a,0x7e,0xf7,0x02,0x02,0x01,0x10,0x43,0xfe,0xe4,0x42,0x02,0xda,0xfd,0xc7,0x20,0x50,0x1b,0x01,0xae,0xfd,0x26,0x02,0x3a,0x21,0x4f, +0x1c,0xfe,0x52,0x27,0x02,0x8c,0x00,0x00,0x00,0x04,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x3a,0x40,0x37,0x27,0x20,0x19,0x18,0x16,0x15,0x11,0x10,0x08,0x02,0x03,0x01,0x4c,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f, +0x00,0x4e,0x0f,0x0e,0x01,0x00,0x14,0x12,0x0e,0x17,0x0f,0x17,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x2c, +0x68,0x7a,0x7a,0x68,0x68,0x7a,0x7a,0x68,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x4e,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x1f,0x1d,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0xfe,0xca,0x65,0x77,0x28,0x0f,0x02,0x80,0x0f,0x0f,0xfd,0x80,0x0f,0x27,0x02,0x50,0x17,0x48,0x2e,0xfe,0xca,0x2e,0x48,0x17,0x17,0x48,0x2e,0x01,0x36,0x2e, +0x48,0x17,0x00,0x00,0x00,0x04,0x00,0x4b,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x16,0x00,0x1b,0x00,0x41,0x40,0x3e,0x1b,0x17,0x13,0x12,0x04,0x05,0x04,0x01,0x4c,0x00,0x00,0x06,0x01,0x04,0x05,0x00,0x04,0x67,0x00,0x05,0x00,0x01,0x03,0x05,0x01,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x07, +0x01,0x02,0x03,0x02,0x4f,0x00,0x00,0x16,0x14,0x11,0x0f,0x0e,0x0d,0x0c,0x0b,0x00,0x0a,0x00,0x0a,0x24,0x21,0x08,0x06,0x18,0x2b,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x13,0x36,0x35,0x34,0x27,0x4b,0x01,0x09,0x60,0x72,0x73,0x5f,0x79,0x66,0x3c,0x3c, +0x66,0x79,0x1e,0x16,0x16,0x1e,0x79,0xd7,0x42,0x42,0x02,0xda,0x6e,0x5c,0x5c,0x6e,0xfe,0xba,0x28,0x02,0x8a,0xfe,0xbc,0x07,0x01,0x36,0x07,0xfe,0xd6,0x2c,0x5c,0x5e,0x2a,0x00,0x00,0x00,0x00,0x04,0x00,0x4a,0xff,0x4c,0x02,0x0e,0x02,0xe4,0x00,0x12,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x47,0x40,0x44,0x2c,0x25,0x1e,0x1d,0x1b,0x1a, +0x16,0x15,0x08,0x03,0x04,0x11,0x01,0x00,0x03,0x02,0x4c,0x05,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x00,0x00,0x03,0x00,0x51,0x14,0x13,0x00,0x00,0x19,0x17,0x13,0x1c,0x14,0x1c,0x00,0x12,0x00,0x12,0x25,0x22,0x07,0x06,0x18,0x2b,0x05, +0x27,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x17,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0xc1,0x6a,0x13,0x18,0x67,0x7b,0x7b,0x67,0x67,0x7b,0x43,0x3e,0x71,0xd2,0x2e,0x24,0x24,0x2e,0x2e, +0x24,0x24,0x4e,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x1f,0x1d,0xb4,0xad,0x03,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0xfe,0xca,0x4b,0x6a,0x17,0xba,0xd2,0x0f,0x02,0x80,0x0f,0x0f,0xfd,0x80,0x0f,0x28,0x02,0x4e,0x17,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x17,0x17,0x47,0x2e,0x01,0x36,0x2e,0x47,0x17,0x00,0x00,0x00,0x00,0x05,0x00,0x4b, +0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0d,0x00,0x11,0x00,0x19,0x00,0x20,0x00,0x26,0x00,0x4e,0x40,0x4b,0x1e,0x1d,0x16,0x15,0x04,0x06,0x05,0x08,0x01,0x02,0x06,0x02,0x4c,0x00,0x00,0x07,0x01,0x05,0x06,0x00,0x05,0x67,0x00,0x06,0x09,0x01,0x02,0x04,0x06,0x02,0x69,0x08,0x01,0x04,0x01,0x01,0x04,0x57,0x08,0x01,0x04,0x04,0x01,0x5f, +0x0a,0x03,0x02,0x01,0x04,0x01,0x4f,0x00,0x00,0x26,0x24,0x22,0x21,0x19,0x17,0x14,0x12,0x11,0x10,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x16,0x21,0x0b,0x06,0x19,0x2b,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x13,0x23,0x03,0x23,0x11,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x05,0x34,0x26,0x27,0x11,0x36, +0x36,0x03,0x33,0x03,0x06,0x23,0x23,0x4b,0x01,0x04,0x60,0x72,0x4e,0x44,0xab,0xa7,0x9e,0x1a,0x66,0x3c,0x3c,0x66,0x74,0x1e,0x1a,0x1a,0x1e,0x74,0x01,0x1c,0x25,0x21,0x20,0x26,0x46,0x43,0x8f,0x0b,0x0b,0x2d,0x02,0xda,0x6e,0x5c,0x4c,0x66,0x11,0xfe,0xb3,0x01,0x46,0xfe,0xba,0x28,0x02,0x8a,0xfe,0xbc,0x08,0x01,0x34,0x08,0xa2,0x2d, +0x45,0x15,0xfe,0xf2,0x15,0x46,0xfe,0x44,0x01,0x1f,0x01,0x00,0x00,0x02,0x00,0x41,0xff,0xf6,0x02,0x17,0x02,0xe4,0x00,0x27,0x00,0x41,0x00,0x3a,0x40,0x37,0x3f,0x01,0x03,0x04,0x32,0x01,0x01,0x00,0x02,0x4c,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x00,0x01,0x04,0x00,0x01,0x7e,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e, +0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x2b,0x22,0x12,0x2b,0x22,0x10,0x06,0x09,0x1c,0x2b,0x37,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x13,0x14, +0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x06,0x06,0x41,0x2a,0x61,0x52,0x3a,0x44,0x31,0x2b,0x6d,0x3e,0x49,0x81,0x6d,0x5c,0x6b,0x2a,0x57,0x4a,0x37,0x40,0x32,0x2b,0x6e,0x41,0x4c,0x86,0x73,0x66,0x77,0x35,0x3b,0x33,0x6d,0x36,0x3f,0x23,0x1f,0x31,0x39,0x3f, +0x35,0x6c,0x38,0x41,0x27,0x20,0x2f,0x37,0xc0,0x4a,0x57,0x4c,0x40,0x24,0x40,0x13,0x31,0x1c,0x67,0x3d,0x60,0x71,0x65,0x56,0x44,0x4f,0x3f,0x36,0x1f,0x39,0x13,0x31,0x1d,0x72,0x46,0x67,0x79,0x6d,0x01,0xb5,0x31,0x55,0x17,0x32,0x19,0x53,0x2f,0x2b,0x4a,0x14,0x12,0x5e,0x3e,0x3a,0x5f,0x17,0x30,0x19,0x4e,0x2a,0x29,0x3d,0x0b,0x0b, +0x54,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x2b,0x40,0x28,0x05,0x02,0x02,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x07,0x09,0x19,0x2b,0x33, +0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x27,0x33,0x11,0x23,0xe5,0xb3,0x01,0xf4,0xb1,0x66,0x3c,0x3c,0x02,0xb2,0x28,0x28,0xfd,0x4e,0x28,0x02,0x8a,0x00,0x02,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xda,0x00,0x10,0x00,0x16,0x00,0x32,0x40,0x2f,0x11,0x06,0x02,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d, +0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x13,0x12,0x0d,0x0c,0x09,0x07,0x05,0x04,0x00,0x10,0x01,0x10,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x27,0x11,0x23,0x11,0x14,0x16,0x01,0x2c,0x67,0x7b,0x90,0x24,0x2e,0x56,0x62,0x2a,0x7a, +0xe4,0x3c,0x20,0x0a,0x77,0x65,0x02,0x08,0xfd,0x53,0x0f,0x61,0x53,0x02,0x08,0xfd,0xf8,0x65,0x77,0x4f,0x02,0x6d,0xfe,0x20,0x2e,0x47,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x02,0x2a,0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x2f,0x40,0x2c,0x06,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00, +0x03,0x03,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x18,0x11,0x06,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x27,0x33,0x03,0x23,0xdd,0xaf,0x98,0x7f,0x0d,0x0e,0x01,0x02,0x0f,0x0d,0x7f,0x2c,0xaf,0x7b,0x3d,0x9a,0x3e,0x02,0xda,0xfd, +0xe4,0x37,0x42,0x11,0x11,0x43,0x36,0x02,0x1c,0xfd,0x26,0x28,0x02,0x8a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x1f,0x00,0x23,0x00,0x2d,0x00,0x3a,0x40,0x37,0x2d,0x29,0x1a,0x0f,0x06,0x05,0x05,0x06,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x02,0x01,0x02,0x00,0x00,0x38,0x4d,0x07,0x01,0x05,0x05,0x03,0x60, +0x08,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x11,0x18,0x18,0x11,0x09,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x27,0x26,0x26,0x35,0x23,0x06,0x06,0x07,0x07,0x27,0x33,0x03,0x23, +0x01,0x33,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x59,0x59,0x92,0x45,0x04,0x01,0x03,0x05,0x04,0x04,0x56,0x38,0x5f,0x05,0x04,0x03,0x04,0x02,0x03,0x40,0x2a,0x5d,0x8e,0x28,0x08,0x0d,0x02,0x02,0x0b,0x08,0x30,0x69,0x3c,0x51,0x3c,0x01,0x5f,0x3e,0x59,0x07,0x09,0x04,0x04,0x0b,0x05,0x08,0x02,0xda,0xfd,0xe4,0x1b,0x25,0x22,0x22, +0x25,0x1b,0x02,0x1c,0xfd,0xe4,0x1b,0x25,0x22,0x22,0x25,0x1b,0x02,0x1c,0xfd,0x26,0xd5,0x2e,0x65,0x21,0x28,0x66,0x26,0xd5,0x27,0x02,0x8c,0xfd,0x74,0x01,0xeb,0x27,0x46,0x1e,0x1c,0x48,0x27,0x3b,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x34,0x40,0x31,0x0a,0x07,0x04,0x01,0x04,0x04, +0x05,0x01,0x4c,0x00,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x02,0x60,0x06,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x07,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x13,0x13,0x33,0x03,0x13,0x23,0x03,0x03,0x25,0x33,0x01,0x23,0x22,0xcb,0xcf,0xa9, +0x85,0xa2,0x31,0xbd,0xd8,0xa9,0x8e,0xb1,0x01,0x5c,0x46,0xfe,0xb6,0x45,0x01,0x43,0x01,0x97,0xfe,0xfb,0x01,0x05,0xfe,0xcf,0xfe,0x57,0x01,0x17,0xfe,0xe9,0x28,0x02,0x8a,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x0e,0x00,0x14,0x00,0x33,0x40,0x30,0x14,0x11,0x0d,0x07,0x01,0x05,0x03,0x04,0x01,0x4c, +0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x13,0x12,0x10,0x0f,0x00,0x0e,0x00,0x0e,0x18,0x12,0x06,0x09,0x18,0x2b,0x33,0x11,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x11,0x27,0x33,0x35,0x03,0x23,0x13,0xe6,0xd2,0xa2,0x92, +0x0a,0x0f,0x03,0x03,0x12,0x0a,0x92,0x2f,0xce,0x66,0x3c,0xb4,0x42,0xba,0x01,0x04,0x01,0xd6,0xfe,0xba,0x16,0x2a,0x0a,0x0b,0x2c,0x16,0x01,0x43,0xfe,0x45,0xfe,0xe1,0x28,0xf7,0x01,0x93,0xfe,0x60,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x09,0x00,0x0d,0x00,0x3c,0x40,0x39,0x06,0x01,0x02,0x02,0x00,0x01, +0x4c,0x00,0x01,0x04,0x01,0x00,0x02,0x01,0x00,0x67,0x07,0x05,0x02,0x02,0x03,0x03,0x02,0x57,0x07,0x05,0x02,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x0a,0x0a,0x00,0x00,0x0a,0x0d,0x0a,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x12,0x11,0x12,0x08,0x06,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x25,0x01, +0x23,0x01,0x46,0x01,0x2e,0xfe,0xdc,0x01,0xbd,0xfe,0xd2,0x01,0x33,0xfe,0xa0,0x01,0x30,0x41,0xfe,0xd0,0x2c,0x02,0x86,0x28,0x2c,0xfd,0x7a,0x28,0x28,0x02,0x8a,0xfd,0x76,0x00,0x00,0x00,0x00,0x04,0x00,0x36,0xff,0xf6,0x02,0x10,0x02,0x30,0x00,0x1a,0x00,0x23,0x00,0x2d,0x00,0x32,0x00,0xb2,0x4b,0xb0,0x18,0x50,0x58,0x40,0x11,0x20, +0x01,0x02,0x04,0x2f,0x2e,0x2b,0x18,0x04,0x06,0x08,0x2c,0x01,0x00,0x06,0x03,0x4c,0x1b,0x40,0x11,0x20,0x01,0x02,0x04,0x2f,0x2e,0x2b,0x18,0x04,0x06,0x08,0x2c,0x01,0x07,0x06,0x03,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x29,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x06,0x01,0x08,0x67,0x00,0x02,0x02,0x04, +0x61,0x00,0x04,0x04,0x41,0x4d,0x0a,0x07,0x02,0x06,0x06,0x00,0x61,0x05,0x09,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x31,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x06,0x01,0x08,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x06,0x06,0x05,0x5f,0x00,0x05,0x05,0x39,0x4d,0x0a,0x01,0x07,0x07, +0x00,0x61,0x09,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1d,0x25,0x24,0x01,0x00,0x2a,0x28,0x24,0x2d,0x25,0x2d,0x1c,0x1b,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x1a,0x01,0x1a,0x0b,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15, +0x11,0x23,0x35,0x06,0x06,0x37,0x33,0x11,0x34,0x26,0x27,0x16,0x16,0x15,0x03,0x32,0x36,0x35,0x35,0x23,0x22,0x07,0x15,0x16,0x27,0x35,0x06,0x15,0x14,0xe7,0x52,0x5f,0x5e,0x52,0x9a,0x44,0x3b,0x39,0x49,0x03,0x2a,0x03,0x68,0x67,0x73,0x79,0x90,0x10,0x50,0x8a,0x3c,0x4a,0x44,0x26,0x2c,0xc0,0x45,0x51,0x9a,0x11,0x0f,0x11,0x3b,0x3c, +0x0a,0x5a,0x4d,0x4b,0x57,0x38,0x44,0x4a,0x45,0x3a,0x4a,0x60,0x5f,0x5a,0xfe,0x89,0x53,0x2b,0x32,0x32,0x01,0x4f,0x3e,0x4e,0x0a,0x10,0x51,0x35,0xfe,0xa7,0x4a,0x3f,0x70,0x03,0xf3,0x03,0x11,0xd8,0x20,0x4a,0x4e,0x00,0x00,0x00,0x00,0x04,0x00,0x4b,0xff,0xf6,0x02,0x17,0x02,0xda,0x00,0x11,0x00,0x15,0x00,0x23,0x00,0x2a,0x00,0x9e, +0x4b,0xb0,0x18,0x50,0x58,0x40,0x0e,0x2a,0x24,0x1a,0x08,0x03,0x05,0x04,0x07,0x19,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0e,0x2a,0x24,0x1a,0x08,0x03,0x05,0x04,0x07,0x19,0x01,0x06,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03, +0x41,0x4d,0x09,0x06,0x02,0x04,0x04,0x00,0x61,0x01,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59, +0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x15,0x14,0x13,0x12,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x11,0x01,0x11,0x0a,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x25,0x33,0x11,0x23,0x13,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x06,0x15,0x15, +0x14,0x16,0x37,0x36,0x35,0x35,0x34,0x26,0x27,0x01,0x6e,0x37,0x4c,0x10,0x90,0x90,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0xfe,0xb9,0x3c,0x3c,0xef,0x09,0x12,0x08,0x08,0x12,0x09,0x3f,0x4a,0x4a,0x8c,0x3c,0x1f,0x1d,0x0a,0x30,0x2a,0x50,0x02,0xda,0xfe,0xfc,0x2a,0x30,0x6c,0x5c,0xab,0x5b,0x6c,0x32,0x02,0x8a,0xfd,0x6c,0x02,0x02,0x01,0xe2, +0x02,0x02,0x56,0x4a,0xab,0x49,0x56,0x16,0x29,0x60,0xab,0x2f,0x47,0x14,0x00,0x00,0x00,0x02,0x00,0x4b,0xff,0xf6,0x02,0x0d,0x02,0x30,0x00,0x19,0x00,0x21,0x00,0x47,0x40,0x44,0x1b,0x10,0x02,0x02,0x03,0x1a,0x11,0x02,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03, +0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x17,0x16,0x14,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x33,0x14, +0x06,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x01,0x2f,0x69,0x7b,0x7b,0x69,0x66,0x78,0x2a,0x61,0x53,0x2f,0x25,0x25,0x2f,0x53,0x61,0x2a,0x78,0xe4,0x1c,0x20,0x20,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x4e,0x5c,0x0e,0xfe,0x32,0x0e,0x5b,0x4e,0x60,0x71,0x4d,0x01,0x9f,0x16,0x43,0x2b,0x97,0x2b,0x42,0x00,0x00,0x04,0x00,0x41, +0xff,0xf6,0x02,0x0d,0x02,0xda,0x00,0x11,0x00,0x15,0x00,0x23,0x00,0x2a,0x00,0x9e,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0e,0x25,0x24,0x20,0x0f,0x0a,0x05,0x04,0x07,0x21,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0e,0x25,0x24,0x20,0x0f,0x0a,0x05,0x04,0x07,0x21,0x01,0x06,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x05, +0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x09,0x06,0x02,0x04,0x04,0x00,0x61,0x03,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03, +0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x15,0x14,0x13,0x12,0x0e,0x0d,0x0c,0x0b,0x08,0x06,0x00,0x11,0x01,0x11,0x0a,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x23,0x35,0x06,0x06, +0x37,0x33,0x11,0x23,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x16,0x16,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0xea,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x90,0x90,0x10,0x4c,0x86,0x3c,0x3c,0xb3,0x3f,0x4a,0x4a,0x3f,0x09,0x12,0x08,0x08,0x12,0x44,0x1c,0x20,0x0a,0x6c,0x5b,0xab,0x5c,0x6c,0x30,0x2a,0x01,0x04,0xfd, +0x26,0x50,0x2a,0x30,0x32,0x02,0x8a,0xfd,0x6c,0x56,0x49,0xab,0x4a,0x56,0x02,0x02,0xfe,0x1e,0x02,0x02,0x16,0x01,0xbe,0x14,0x47,0x2f,0xab,0x60,0x00,0x04,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0x30,0x00,0x15,0x00,0x1c,0x00,0x22,0x00,0x2a,0x00,0x4f,0x40,0x4c,0x24,0x22,0x1c,0x18,0x04,0x05,0x06,0x23,0x0d,0x02,0x03,0x04,0x02,0x4c, +0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x07,0x01,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x06,0x06,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1d,0x1b,0x19,0x17,0x16,0x13,0x12,0x10,0x0e,0x0c,0x0b,0x08,0x06,0x00,0x15,0x01,0x15,0x09,0x09,0x16,0x2b,0x05, +0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x33,0x35,0x26,0x23,0x22,0x07,0x17,0x33,0x35,0x34,0x26,0x27,0x01,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x01,0x2e,0x6b,0x7d,0x7d,0x6b,0x69,0x7b,0xfe,0xc4,0x26,0x32,0x53,0x64,0x03,0x2a,0x03,0x7b,0xbe,0xac,0x25,0x2f, +0x32,0x26,0xd6,0x3c,0x1f,0x1d,0xff,0x00,0x1c,0x20,0x20,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x5a,0xd7,0x0f,0x56,0x49,0x5b,0x6c,0x01,0x36,0xce,0x0e,0x0f,0xcd,0x32,0x2b,0x43,0x16,0xfe,0x62,0x01,0x9d,0x16,0x42,0x2b,0x97,0x2b,0x42,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x14,0x00,0x1a,0x00,0x40, +0x40,0x3d,0x17,0x01,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x06,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x3b,0x4d,0x09,0x07,0x02,0x00,0x00,0x08,0x5f,0x0a,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x16,0x15,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x11,0x23,0x11,0x11,0x11,0x0b,0x09,0x1e,0x2b, +0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x25,0x33,0x11,0x06,0x06,0x15,0x41,0x8d,0x8d,0x8d,0x3d,0x3d,0xca,0xb4,0xb4,0xb4,0xb4,0xfe,0xe6,0x3c,0x1d,0x1f,0x28,0x01,0xd6,0x28,0x37,0x3b,0x42,0x28,0x8c,0x28,0xfe,0x2a,0x28,0x28,0x02,0x89,0x04,0x2f,0x21,0x00,0x00, +0x00,0x04,0x00,0x41,0xff,0x4c,0x02,0x0d,0x02,0x30,0x00,0x19,0x00,0x25,0x00,0x2a,0x00,0x32,0x00,0x9f,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x2c,0x2b,0x24,0x23,0x13,0x06,0x06,0x05,0x06,0x26,0x01,0x00,0x01,0x02,0x4c,0x1b,0x40,0x12,0x23,0x01,0x07,0x06,0x2c,0x2b,0x24,0x13,0x06,0x05,0x05,0x07,0x26,0x01,0x00,0x01,0x03,0x4c,0x59, +0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x06,0x06,0x02,0x61,0x03,0x01,0x02,0x02,0x41,0x4d,0x09,0x01,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x00,0x00,0x04,0x5f,0x08,0x01,0x04,0x04,0x3d,0x04,0x4e,0x1b,0x40,0x2b,0x00,0x06,0x06,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x07,0x07,0x03,0x5f,0x00,0x03,0x03,0x3b, +0x4d,0x09,0x01,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x00,0x00,0x04,0x5f,0x08,0x01,0x04,0x04,0x3d,0x04,0x4e,0x59,0x40,0x17,0x1b,0x1a,0x00,0x00,0x2a,0x29,0x22,0x20,0x1a,0x25,0x1b,0x25,0x00,0x19,0x00,0x18,0x13,0x25,0x24,0x31,0x0a,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x32,0x37,0x35,0x06,0x06,0x23,0x22,0x26,0x35, +0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x11,0x14,0x06,0x23,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x17,0x36,0x35,0x11,0x23,0x01,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x6d,0xfd,0x05,0x0a,0x04,0x10,0x4a,0x37,0x4f,0x5c,0x5c,0x4f,0x37,0x4a,0x10,0x90,0x58,0x4b,0x74,0x40,0x47,0x47,0x40,0x15,0x10,0x10, +0xc6,0x3c,0x3c,0xff,0x00,0x1c,0x20,0x20,0xb4,0x28,0x01,0xd8,0x29,0x2e,0x6c,0x5b,0xab,0x5c,0x6c,0x2e,0x29,0x4d,0xfd,0xcb,0x4c,0x59,0xd2,0x56,0x49,0xab,0x4a,0x56,0x04,0xfe,0x1e,0x04,0x9c,0x1e,0x51,0x02,0x0d,0xfe,0x37,0x01,0xbc,0x14,0x46,0x2f,0xab,0x2f,0x45,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x10,0x02,0xda,0x00,0x12, +0x00,0x16,0x00,0x1b,0x00,0x40,0x40,0x3d,0x1b,0x0c,0x03,0x03,0x05,0x03,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x12,0x00,0x12,0x22,0x13, +0x23,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x26,0x23,0x22,0x06,0x15,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x34,0x27,0x4b,0x90,0x11,0x48,0x34,0x4d,0x5b,0x90,0x0f,0x13,0x3d,0x46,0x66,0x3c,0x3c,0x01,0x35,0x3c,0x3c,0x02,0xda,0xfe,0xfe,0x2a,0x2e,0x6c,0x5c,0xfe,0x98,0x02, +0x04,0x04,0x56,0x4a,0xfe,0x98,0x28,0x02,0x8a,0xfd,0x76,0x01,0x40,0x60,0x29,0x00,0x00,0x04,0x00,0x41,0x00,0x00,0x02,0x26,0x03,0x19,0x00,0x0b,0x00,0x17,0x00,0x21,0x00,0x25,0x00,0x8b,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2d,0x0c,0x01,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x0a, +0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x09,0x07,0x02,0x04,0x04,0x08,0x5f,0x0d,0x01,0x08,0x08,0x39,0x08,0x4e,0x1b,0x40,0x2b,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0c,0x01,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x0a,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x09,0x07,0x02,0x04,0x04,0x08,0x5f,0x0d, +0x01,0x08,0x08,0x39,0x08,0x4e,0x59,0x40,0x25,0x18,0x18,0x0d,0x0c,0x01,0x00,0x25,0x24,0x23,0x22,0x18,0x21,0x18,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0e,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34, +0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x25,0x33,0x11,0x23,0x01,0x3b,0x29,0x31,0x31,0x29,0x29,0x31,0x31,0x29,0x17,0x1b,0x1b,0x17,0x17,0x1b,0x1b,0xe3,0xb3,0x9a,0x01,0x2a,0xa2,0xfe,0xf8,0x3c,0x3c,0x02,0x7d,0x2a,0x24,0x24,0x2a,0x2a,0x24,0x24,0x2a,0x23,0x18,0x13,0x14,0x17,0x17, +0x14,0x13,0x18,0xfd,0x60,0x28,0x01,0xd6,0x28,0xfe,0x02,0x28,0x28,0x01,0xd6,0x00,0x00,0x04,0x00,0x4b,0xff,0x4c,0x01,0xbd,0x03,0x19,0x00,0x0b,0x00,0x17,0x00,0x24,0x00,0x29,0x00,0x8b,0xb6,0x25,0x1c,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2b,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x03,0x03, +0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x08,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x07,0x5f,0x0b,0x01,0x07,0x07,0x3d,0x07,0x4e,0x1b,0x40,0x29,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x08,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x00,0x04, +0x04,0x07,0x5f,0x0b,0x01,0x07,0x07,0x3d,0x07,0x4e,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x29,0x28,0x18,0x24,0x18,0x23,0x20,0x1f,0x1e,0x1d,0x1b,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34, +0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x35,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x11,0x14,0x06,0x23,0x37,0x36,0x35,0x11,0x23,0x01,0x63,0x29,0x31,0x31,0x29,0x29,0x31,0x31,0x29,0x17,0x1b,0x1b,0x17,0x17,0x1b,0x1b,0xfe,0xff,0x9f,0x1c,0x16,0xbd,0x01,0x4d,0x66,0x5c,0x5c,0x3c,0x3c,0x02,0x7d,0x2a,0x24,0x24,0x2a,0x2a,0x24,0x24, +0x2a,0x23,0x18,0x13,0x14,0x17,0x17,0x14,0x13,0x18,0xfc,0xac,0x28,0x06,0x02,0x84,0x28,0xfd,0xe4,0x59,0x65,0x40,0x26,0x58,0x01,0xf4,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x32,0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x47,0x40,0x44,0x13,0x07,0x02,0x01,0x02,0x14,0x01,0x04,0x01,0x02,0x4c,0x00,0x01,0x00,0x04,0x06, +0x01,0x04,0x67,0x00,0x07,0x07,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x08,0x01,0x06,0x06,0x03,0x60,0x09,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x07,0x13,0x23,0x03, +0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x03,0x07,0x4b,0x90,0x37,0xd6,0x3e,0x99,0xa5,0xa8,0x67,0x48,0x66,0x3c,0x3c,0x01,0x36,0x44,0x82,0x2a,0x02,0xda,0xfe,0x51,0xfb,0xaf,0xfe,0x89,0x01,0x03,0xfe,0xfd,0x28,0x02,0x8a,0xfd,0x76,0x01,0x2a,0x2f,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x0f,0x00,0x31, +0x40,0x2e,0x0b,0x01,0x03,0x01,0x01,0x4c,0x04,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x5f,0x05,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x0d,0x0c,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x0a,0x01,0x0a,0x06,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x27,0x11,0x23,0x11, +0x14,0x01,0x6a,0x43,0x49,0xac,0x01,0x3d,0xb7,0xe1,0x3c,0x47,0x40,0x02,0x26,0x2d,0xfd,0x53,0x2d,0x30,0x02,0x7d,0xfd,0xda,0x48,0x00,0x00,0x00,0x00,0x04,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0x30,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x2c,0x00,0xc1,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x0e,0x28,0x22,0x09,0x03,0x04,0x07,0x05,0x01,0x4c, +0x12,0x01,0x05,0x01,0x4b,0x1b,0x40,0x11,0x28,0x22,0x02,0x0a,0x05,0x09,0x03,0x02,0x07,0x0a,0x02,0x4c,0x12,0x01,0x05,0x01,0x4b,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x0a,0x01,0x05,0x05,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x4b, +0xb0,0x1a,0x50,0x58,0x40,0x27,0x0a,0x01,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0a,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x25,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x00,0x0a,0x0a,0x00,0x5f, +0x00,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x59,0x59,0x40,0x17,0x00,0x00,0x2c,0x2b,0x2a,0x29,0x24,0x23,0x1e,0x1d,0x00,0x1c,0x00,0x1c,0x11,0x15,0x13,0x24,0x23,0x11,0x0c,0x09,0x1c,0x2b,0x33,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16, +0x15,0x11,0x23,0x11,0x06,0x06,0x15,0x11,0x23,0x11,0x06,0x06,0x15,0x11,0x25,0x33,0x11,0x34,0x26,0x27,0x03,0x33,0x11,0x34,0x26,0x27,0x03,0x33,0x11,0x23,0x0f,0x8c,0x07,0x34,0x29,0x26,0x38,0x0a,0x06,0x39,0x2d,0x36,0x40,0x8e,0x24,0x2a,0x82,0x24,0x2a,0x01,0x46,0x3c,0x20,0x1c,0xd0,0x32,0x1b,0x17,0xda,0x3c,0x3c,0x02,0x26,0x42, +0x23,0x29,0x2a,0x24,0x24,0x2a,0x46,0x3b,0xfe,0x51,0x02,0x07,0x04,0x32,0x28,0xfe,0x57,0x02,0x08,0x02,0x34,0x29,0xfe,0x57,0x28,0x01,0x81,0x23,0x31,0x07,0xfe,0x24,0x01,0x81,0x21,0x2e,0x0a,0xfe,0x26,0x01,0xd6,0x00,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x10,0x02,0x30,0x00,0x12,0x00,0x16,0x00,0x1b,0x00,0x7a,0x4b,0xb0, +0x18,0x50,0x58,0xb7,0x1b,0x0c,0x03,0x03,0x05,0x03,0x01,0x4c,0x1b,0x40,0x0b,0x0c,0x01,0x06,0x03,0x1b,0x03,0x02,0x05,0x06,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x06,0x01,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x22,0x00, +0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x06,0x06,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x13,0x00,0x00,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x12,0x00,0x12,0x22,0x13,0x23,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x36,0x36,0x33,0x32, +0x16,0x15,0x11,0x23,0x11,0x26,0x23,0x22,0x06,0x15,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x34,0x27,0x4b,0x90,0x11,0x48,0x34,0x4d,0x5b,0x90,0x0f,0x13,0x3d,0x46,0x66,0x3c,0x3c,0x01,0x35,0x3c,0x3c,0x02,0x26,0x4b,0x29,0x2c,0x6c,0x5c,0xfe,0x98,0x02,0x04,0x04,0x56,0x4a,0xfe,0x98,0x28,0x01,0xd6,0xfe,0x2a,0x01,0x40,0x60,0x29, +0x00,0x04,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0x30,0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x3a,0x40,0x37,0x27,0x20,0x19,0x18,0x16,0x15,0x11,0x10,0x08,0x02,0x03,0x01,0x4c,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x14,0x12, +0x0e,0x17,0x0f,0x17,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x05,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x01,0x2c,0x6a,0x7c,0x7c,0x6a,0x6a,0x7c,0x7c,0x6a, +0x31,0x25,0x25,0x31,0x30,0x26,0x26,0x50,0x1c,0x20,0x20,0x01,0x1c,0x1d,0x1f,0x1f,0x1d,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x97,0x60,0x71,0x28,0x0f,0x01,0xcc,0x0f,0x0f,0xfe,0x34,0x0f,0x26,0x01,0x9e,0x16,0x43,0x2b,0x97,0x2b,0x42,0x16,0x16,0x42,0x2b,0x97,0x2b,0x43,0x16,0x00,0x00,0x00,0x04,0x00,0x4b,0xff,0x4c,0x02,0x17, +0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x23,0x00,0x2a,0x00,0x98,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x2a,0x24,0x16,0x15,0x10,0x03,0x06,0x04,0x05,0x01,0x4c,0x1b,0x40,0x0e,0x16,0x01,0x07,0x05,0x2a,0x24,0x15,0x10,0x03,0x05,0x04,0x07,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x05,0x05,0x00,0x61,0x01,0x01,0x00, +0x00,0x3b,0x4d,0x09,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x07,0x07,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x09,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x00,0x06,0x06,0x03, +0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x18,0x13,0x12,0x00,0x00,0x23,0x22,0x21,0x20,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11,0x00,0x11,0x25,0x23,0x11,0x0a,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x37,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x06, +0x15,0x15,0x14,0x16,0x07,0x33,0x11,0x23,0x01,0x36,0x36,0x35,0x35,0x34,0x27,0x4b,0x90,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x89,0x09,0x12,0x08,0x08,0x12,0x09,0x3f,0x4a,0x4a,0xb0,0x3c,0x3c,0x01,0x3c,0x1d,0x1f,0x3c,0xb4,0x02,0xda,0x50,0x2a,0x30,0x6b,0x5c,0xab,0x5c,0x6c,0x30,0x2a,0xfe,0xfc,0xd2,0x02,0x02,0x01, +0xe2,0x02,0x02,0x55,0x4a,0xab,0x49,0x57,0xaa,0x02,0x8a,0xfe,0x36,0x14,0x47,0x2f,0xab,0x60,0x29,0x00,0x00,0x04,0x00,0x41,0xff,0x4c,0x02,0x0d,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x23,0x00,0x2a,0x00,0x98,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x25,0x24,0x1d,0x1c,0x0e,0x01,0x06,0x04,0x05,0x01,0x4c,0x1b,0x40,0x0e,0x1c,0x01,0x07, +0x05,0x25,0x24,0x1d,0x0e,0x01,0x05,0x04,0x07,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x09,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x01,0x61,0x00,0x01, +0x01,0x41,0x4d,0x00,0x07,0x07,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x09,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x18,0x13,0x12,0x00,0x00,0x23,0x22,0x21,0x20,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11,0x00,0x11,0x13,0x25,0x23,0x0a,0x09,0x19,0x2b, +0x05,0x11,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x11,0x25,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x16,0x16,0x17,0x33,0x11,0x23,0x01,0x11,0x06,0x15,0x15,0x14,0x16,0x01,0x7d,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x90,0xfe,0xe7,0x3f,0x4a,0x4a,0x3f,0x09,0x12, +0x08,0x08,0x12,0xbc,0x3c,0x3c,0xff,0x00,0x3c,0x20,0xb4,0x01,0x04,0x2a,0x30,0x6c,0x5c,0xab,0x5c,0x6b,0x30,0x2a,0x50,0xfd,0x26,0xd2,0x57,0x49,0xab,0x4a,0x55,0x02,0x02,0xfe,0x1e,0x02,0x02,0xaa,0x02,0x8a,0xfe,0x36,0x01,0xbe,0x29,0x60,0xab,0x2f,0x47,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x30,0x02,0x30,0x00,0x19, +0x00,0x1d,0x00,0x77,0xb5,0x07,0x01,0x04,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x04,0x01,0x00,0x01,0x04,0x00,0x80,0x09,0x05,0x02,0x01,0x01,0x02,0x61,0x03,0x01,0x02,0x02,0x3b,0x4d,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x0a,0x01,0x07,0x07,0x39,0x07,0x4e,0x1b,0x40,0x2b,0x00,0x04,0x01,0x00,0x01,0x04,0x00,0x80, +0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x09,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x0a,0x01,0x07,0x07,0x39,0x07,0x4e,0x59,0x40,0x14,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x00,0x19,0x00,0x19,0x13,0x23,0x13,0x23,0x11,0x11,0x11,0x0b,0x09,0x1d,0x2b,0x33,0x35,0x33,0x11,0x23, +0x35,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x33,0x15,0x27,0x33,0x11,0x23,0x2d,0x5f,0x5f,0xef,0x0f,0x40,0x2f,0x4e,0x48,0x2a,0x35,0x3f,0x3b,0x3b,0x78,0xde,0x3c,0x3c,0x28,0x01,0xd6,0x28,0x48,0x27,0x2b,0x6c,0x5c,0x23,0x23,0x4a,0x56,0x56,0x4a,0xfe,0xc0,0x28,0x28,0x01,0xd6, +0x00,0x02,0x00,0x4b,0xff,0xf6,0x02,0x0d,0x02,0x30,0x00,0x27,0x00,0x41,0x00,0x3b,0x40,0x38,0x3f,0x01,0x04,0x02,0x01,0x4c,0x32,0x01,0x01,0x01,0x4b,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x00,0x01,0x04,0x00,0x01,0x7e,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05, +0x4e,0x2b,0x22,0x12,0x2b,0x22,0x10,0x06,0x09,0x1c,0x2b,0x37,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x13,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x36,0x36, +0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x06,0x06,0x4b,0x2a,0x05,0x5b,0x48,0x34,0x3c,0x22,0x1d,0x8f,0x33,0x3b,0x77,0x65,0x56,0x6f,0x0a,0x2a,0x09,0x4f,0x39,0x34,0x3c,0x1e,0x19,0x86,0x3b,0x44,0x7c,0x6b,0x60,0x76,0x2b,0x2b,0x25,0x90,0x2b,0x31,0x1d,0x17,0x2c,0x34,0x35,0x2d,0x85,0x27,0x2e,0x21,0x1a,0x2e,0x39, +0x8f,0x34,0x3c,0x2d,0x26,0x1c,0x2a,0x09,0x2b,0x0f,0x52,0x37,0x50,0x5c,0x4b,0x41,0x2f,0x35,0x2d,0x26,0x18,0x25,0x08,0x27,0x11,0x5c,0x3d,0x4e,0x5b,0x53,0x01,0x42,0x2b,0x3f,0x0b,0x2b,0x0d,0x3c,0x26,0x1f,0x32,0x0c,0x09,0x42,0x2f,0x30,0x49,0x0d,0x27,0x0b,0x37,0x24,0x1d,0x34,0x0d,0x0a,0x44,0x00,0x00,0x00,0x00,0x03,0x00,0x37, +0x00,0x00,0x02,0x12,0x02,0xc1,0x00,0x10,0x00,0x14,0x00,0x1a,0x00,0x46,0x40,0x43,0x15,0x01,0x06,0x01,0x01,0x4c,0x00,0x03,0x00,0x08,0x02,0x03,0x08,0x67,0x09,0x05,0x02,0x01,0x01,0x02,0x5f,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x5f,0x0a,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x17,0x16,0x14,0x13,0x12,0x11, +0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x10,0x01,0x10,0x0b,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x01,0x33,0x35,0x23,0x13,0x11,0x23,0x11,0x14,0x16,0x01,0x3b,0x3f,0x3b,0x8a,0x8a,0x90,0xc1,0xc1,0xbc,0xfe,0xde,0x3c,0x3c,0x3c,0x3c,0x1f, +0x40,0x3d,0x01,0x81,0x28,0x9b,0x9b,0x28,0xfe,0x2a,0x28,0x02,0x26,0x73,0xfd,0x91,0x01,0xd4,0xfe,0x7f,0x22,0x2c,0x00,0x00,0x00,0x02,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0x26,0x00,0x10,0x00,0x16,0x00,0x32,0x40,0x2f,0x11,0x06,0x02,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00, +0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x13,0x12,0x0d,0x0c,0x09,0x07,0x05,0x04,0x00,0x10,0x01,0x10,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x27,0x11,0x23,0x11,0x14,0x16,0x01,0x2d,0x66,0x77,0x90,0x24,0x29,0x52,0x5f,0x2a,0x76,0xdc,0x3c,0x20,0x0a, +0x77,0x65,0x01,0x54,0xfe,0x06,0x0e,0x61,0x53,0x01,0x54,0xfe,0xac,0x65,0x77,0x4e,0x01,0xba,0xfe,0xd4,0x2e,0x49,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0x26,0x00,0x0c,0x00,0x10,0x00,0x2f,0x40,0x2c,0x06,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x02,0x5f, +0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x18,0x11,0x06,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x27,0x33,0x03,0x23,0xdc,0xaf,0x99,0x76,0x11,0x14,0x02,0x02,0x15,0x10,0x75,0x2c,0xae,0x81,0x3e,0x94,0x3f,0x02,0x26,0xfe,0x8e,0x35,0x48,0x0b, +0x0b,0x49,0x34,0x01,0x72,0xfd,0xda,0x28,0x01,0xd6,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x26,0x00,0x21,0x00,0x25,0x00,0x30,0x00,0x39,0x40,0x36,0x30,0x2b,0x10,0x06,0x04,0x05,0x06,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x03,0x60,0x08,0x04,0x02,0x03,0x03, +0x39,0x03,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x00,0x21,0x00,0x21,0x11,0x1a,0x19,0x11,0x09,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x3e,0x02,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x26,0x36,0x37,0x13,0x33,0x03,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x27,0x33,0x03,0x23,0x01,0x33,0x03,0x26, +0x26,0x27,0x23,0x06,0x06,0x07,0x07,0x62,0x62,0x92,0x49,0x04,0x05,0x02,0x01,0x03,0x06,0x04,0x4c,0x34,0x5f,0x05,0x06,0x02,0x03,0x01,0x02,0x01,0x03,0x44,0x2e,0x61,0x98,0x24,0x04,0x0b,0x02,0x01,0x09,0x05,0x20,0x75,0x3d,0x55,0x3d,0x01,0x50,0x3d,0x50,0x06,0x0b,0x02,0x02,0x02,0x0c,0x05,0x0b,0x02,0x26,0xfe,0x71,0x16,0x21,0x15, +0x0e,0x10,0x17,0x16,0x01,0x90,0xfe,0x70,0x16,0x20,0x15,0x14,0x10,0x09,0x0e,0x11,0x01,0x8f,0xfd,0xda,0xa2,0x12,0x41,0x1e,0x16,0x43,0x18,0xa2,0x28,0x01,0xd6,0xfe,0x2a,0x01,0x5f,0x1b,0x43,0x16,0x16,0x43,0x1b,0x3a,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0x26,0x00,0x0b,0x00,0x0f,0x00,0x34,0x40,0x31,0x0a,0x07, +0x04,0x01,0x04,0x04,0x05,0x01,0x4c,0x00,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x3b,0x4d,0x00,0x04,0x04,0x02,0x60,0x06,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x07,0x09,0x19,0x2b,0x33,0x37,0x03,0x33,0x17,0x37,0x33,0x07,0x13,0x23,0x27,0x07,0x25,0x33,0x01,0x23, +0x3a,0xb2,0xce,0xb2,0x7e,0x8b,0x35,0xa9,0xd5,0xb2,0x84,0x94,0x01,0x30,0x4a,0xfe,0xcc,0x48,0xed,0x01,0x39,0xbf,0xbf,0xe3,0xfe,0xbd,0xc8,0xc8,0x28,0x01,0xd6,0x00,0x00,0x02,0x00,0x2d,0xff,0x4c,0x02,0x2b,0x02,0x26,0x00,0x0f,0x00,0x19,0x00,0x31,0x40,0x2e,0x13,0x10,0x09,0x06,0x04,0x00,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f, +0x02,0x01,0x01,0x01,0x3b,0x4d,0x00,0x00,0x00,0x03,0x61,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x15,0x14,0x00,0x0f,0x00,0x0e,0x12,0x14,0x21,0x06,0x09,0x19,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x37,0x03,0x33,0x13,0x13,0x33,0x01,0x06,0x06,0x23,0x37,0x36,0x36,0x37,0x03,0x23,0x13,0x1e,0x02,0x4f,0x2b,0x2f,0x3d,0x13,0x1e, +0xea,0x9f,0x99,0x98,0x2e,0xfe,0xf1,0x18,0x54,0x36,0xb4,0x05,0x10,0x0a,0x9e,0x42,0x8e,0x08,0x14,0x13,0xb4,0x28,0x31,0x2b,0x44,0x02,0x12,0xfe,0xa5,0x01,0x5b,0xfd,0x9b,0x36,0x3f,0xf9,0x0c,0x2c,0x18,0x01,0x69,0xfe,0xb7,0x12,0x2c,0x27,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0x26,0x00,0x09,0x00,0x0d,0x00,0x32, +0x40,0x2f,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x05,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x3b,0x4d,0x04,0x01,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x09,0x12,0x11,0x12,0x07,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x25,0x33,0x01,0x23, +0x46,0x01,0x1e,0xfe,0xeb,0x01,0xb6,0xfe,0xe4,0x01,0x29,0xfe,0x62,0x47,0x01,0x1d,0x46,0x29,0x01,0xd5,0x28,0x2a,0xfe,0x2c,0x28,0x28,0x01,0xd6,0x00,0x03,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0xe4,0x00,0x0e,0x00,0x1c,0x00,0x28,0x00,0x3e,0x40,0x3b,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01, +0x01,0x3e,0x4d,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1e,0x1d,0x10,0x0f,0x01,0x00,0x24,0x22,0x1d,0x28,0x1e,0x28,0x17,0x15,0x0f,0x1c,0x10,0x1c,0x08,0x06,0x00,0x0e,0x01,0x0e,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x11, +0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x65,0x77,0x77,0x65,0x65,0x77,0x36,0x63,0x43,0x3c,0x49,0x49,0x3c,0x3c,0x49,0x49,0x3c,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0x0a,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x41,0x61,0x35,0x4d,0x4d,0x3d, +0x01,0x40,0x3d,0x4d,0x4d,0x3d,0xfe,0xc0,0x3d,0x4d,0xf3,0x1e,0x1c,0x1b,0x1d,0x1d,0x1b,0x1c,0x1e,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0a,0x00,0x29,0x40,0x26,0x05,0x04,0x03,0x03,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x38,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00, +0x00,0x0a,0x00,0x0a,0x11,0x14,0x11,0x05,0x09,0x19,0x2b,0x33,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x5a,0xc6,0xc6,0xa5,0x7b,0xa2,0x52,0x02,0x3a,0x94,0x67,0x7b,0xfd,0x78,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x02,0x0f,0x02,0xe4,0x00,0x18,0x00,0x34,0x40,0x31,0x01,0x01,0x03,0x01,0x01,0x4c,0x00,0x01, +0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x16,0x22,0x12,0x27,0x06,0x09,0x1a,0x2b,0x33,0x35,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07, +0x07,0x21,0x15,0x56,0xf3,0x35,0x2c,0x45,0x3b,0x3d,0x47,0x5a,0x03,0x78,0x63,0x65,0x77,0x39,0x45,0xc5,0x01,0x4c,0x53,0x01,0x04,0x38,0x58,0x2a,0x3c,0x47,0x49,0x3e,0x63,0x74,0x72,0x62,0x34,0x74,0x48,0xce,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x46,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x1c,0x00,0x43,0x40,0x40,0x16,0x15,0x10,0x03, +0x03,0x04,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x02,0x04,0x01,0x02,0x7e,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1c,0x01,0x1c,0x07,0x09,0x16,0x2b,0x05,0x22,0x26, +0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x21,0x35,0x21,0x15,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x01,0x21,0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x46,0x3c,0x4f,0xb3,0xfe,0xd4,0x01,0x92,0xb0,0x5a,0x68,0x77,0x0a,0x71,0x61,0x3c,0x46,0x46,0x3c,0x32,0x3c,0x46,0x4e,0xbe,0x52,0x54,0xbb,0x07,0x6f, +0x5b,0x32,0x61,0x71,0x00,0x01,0x00,0x46,0x00,0x00,0x01,0xea,0x02,0xda,0x00,0x0b,0x00,0x30,0x40,0x2d,0x06,0x03,0x02,0x02,0x03,0x01,0x4c,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x68,0x00,0x01,0x01,0x38,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x12,0x12,0x11,0x06,0x09, +0x1a,0x2b,0x21,0x35,0x21,0x35,0x01,0x33,0x01,0x15,0x33,0x35,0x33,0x11,0x01,0x90,0xfe,0xb6,0x01,0x0a,0x66,0xfe,0xea,0xf0,0x5a,0xa0,0x8d,0x01,0xad,0xfe,0x3f,0x27,0xb2,0xfe,0x5c,0x00,0x00,0x01,0x00,0x4b,0xff,0xf6,0x02,0x03,0x02,0xda,0x00,0x1b,0x00,0x3e,0x40,0x3b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x06,0x00,0x03, +0x01,0x06,0x03,0x67,0x00,0x05,0x05,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x16,0x14,0x13,0x12,0x11,0x10,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1b,0x01,0x1b,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23, +0x11,0x21,0x15,0x21,0x17,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x26,0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x44,0x3a,0xc7,0x01,0x85,0xfe,0xcf,0x02,0x76,0x65,0x6e,0x77,0x0a,0x71,0x61,0x3c,0x46,0x46,0x3c,0x2d,0x3c,0x46,0x01,0x63,0x52,0xbf,0x6f,0x65,0x2d,0x61,0x71,0x00,0x02,0x00,0x40,0xff,0xf6,0x02,0x18,0x02,0xda,0x00,0x15, +0x00,0x21,0x00,0x38,0x40,0x35,0x0a,0x01,0x04,0x02,0x01,0x4c,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x6a,0x00,0x01,0x01,0x38,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1d,0x1b,0x16,0x21,0x17,0x21,0x0f,0x0d,0x09,0x08,0x00,0x15,0x01,0x15,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x26, +0x35,0x34,0x36,0x37,0x13,0x33,0x03,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2d,0x46,0x6b,0x3c,0x24,0x1f,0xa9,0x64,0xb4,0x03,0x0d,0x34,0x1f,0x41,0x61,0x37,0x3c,0x69,0x47,0x41,0x51,0x51,0x41,0x41,0x51,0x51,0x0a,0x3b,0x69,0x45,0x30,0x65,0x37, +0x01,0x2f,0xfe,0xc7,0x02,0x11,0x12,0x39,0x64,0x42,0x46,0x6b,0x3c,0x50,0x56,0x45,0x45,0x56,0x56,0x45,0x45,0x56,0x00,0x00,0x00,0x01,0x00,0x52,0x00,0x00,0x02,0x22,0x02,0xda,0x00,0x08,0x00,0x52,0xb5,0x07,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x18,0x00,0x01,0x00,0x03,0x00,0x01,0x72,0x00,0x00,0x00,0x02,0x5f, +0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x19,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x0c,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x33,0x01,0x21,0x15,0x23,0x35,0x21,0x15, +0x01,0xbe,0x01,0x04,0xfe,0xea,0x5a,0x01,0xd0,0xfe,0xfe,0x02,0x88,0x76,0xc8,0x54,0xfd,0x7a,0x00,0x00,0x00,0x03,0x00,0x42,0xff,0xf6,0x02,0x16,0x02,0xe4,0x00,0x1d,0x00,0x29,0x00,0x35,0x00,0x45,0x40,0x42,0x16,0x07,0x02,0x05,0x02,0x01,0x4c,0x07,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01, +0x3e,0x4d,0x08,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x2b,0x2a,0x1f,0x1e,0x01,0x00,0x31,0x2f,0x2a,0x35,0x2b,0x35,0x25,0x23,0x1e,0x29,0x1f,0x29,0x10,0x0e,0x00,0x1d,0x01,0x1d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14, +0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x45,0x6a,0x3b,0x4f,0x42,0x39,0x44,0x36,0x61,0x3f,0x40,0x60,0x36,0x44,0x39,0x42,0x4f,0x3b,0x69,0x46,0x38,0x44,0x44,0x38,0x37,0x45,0x45,0x37,0x40, +0x50,0x50,0x40,0x40,0x50,0x50,0x0a,0x36,0x61,0x3f,0x45,0x64,0x0b,0x03,0x0d,0x59,0x3a,0x39,0x57,0x31,0x31,0x57,0x39,0x3a,0x59,0x0d,0x03,0x0b,0x64,0x45,0x3f,0x61,0x36,0x01,0xb0,0x42,0x35,0x35,0x42,0x42,0x35,0x35,0x42,0xfe,0xa1,0x4b,0x3c,0x3d,0x4b,0x4b,0x3d,0x3c,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x02,0x18, +0x02,0xe4,0x00,0x15,0x00,0x21,0x00,0x36,0x40,0x33,0x01,0x01,0x00,0x03,0x01,0x4c,0x06,0x01,0x03,0x00,0x00,0x02,0x03,0x00,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x17,0x16,0x00,0x00,0x1d,0x1b,0x16,0x21,0x17,0x21,0x00,0x15,0x00,0x15,0x26,0x24,0x07,0x09,0x18,0x2b,0x33,0x13, +0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x03,0x11,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xc3,0xb4,0x03,0x0a,0x36,0x20,0x3f,0x5f,0x36,0x3c,0x6a,0x45,0x47,0x6a,0x3c,0x24,0x1f,0xa9,0x41,0x51,0x51,0x41,0x41,0x51,0x51,0x01,0x39,0x02,0x10,0x13,0x39,0x64, +0x42,0x47,0x6a,0x3c,0x3b,0x69,0x45,0x30,0x65,0x37,0xfe,0xd1,0x01,0x5e,0x56,0x45,0x45,0x56,0x56,0x45,0x45,0x56,0x00,0x00,0x00,0x03,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0xe4,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x36,0x40,0x33,0x1c,0x1b,0x11,0x10,0x04,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05, +0x01,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x18,0x17,0x01,0x00,0x17,0x1e,0x18,0x1e,0x15,0x13,0x08,0x06,0x00,0x0e,0x01,0x0e,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x03,0x11,0x01,0x26,0x26,0x23,0x22,0x06,0x13,0x32,0x36,0x35,0x11,0x01,0x16,0x16,0x01, +0x2c,0x65,0x77,0x77,0x65,0x65,0x77,0x36,0x63,0xc8,0x01,0x05,0x0b,0x44,0x31,0x3c,0x49,0x85,0x3c,0x49,0xfe,0xfb,0x0b,0x44,0x0a,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x41,0x61,0x35,0x02,0x17,0xfe,0xec,0x01,0x3c,0x2d,0x35,0x4d,0xfd,0xf9,0x4d,0x3d,0x01,0x14,0xfe,0xc4,0x2d,0x35,0x00,0x00,0x00,0x00,0x01,0x00,0x58, +0x00,0x00,0x02,0x13,0x02,0xe4,0x00,0x22,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x22,0x00,0x22,0x1b,0x23,0x12,0x2b,0x06,0x09,0x1a,0x2b,0x33,0x35,0x34,0x36,0x36,0x37,0x37,0x36, +0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x3e,0x02,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x15,0x21,0x15,0x59,0x2b,0x4a,0x2d,0x64,0x28,0x2f,0x48,0x3a,0x3a,0x48,0x5a,0x02,0x39,0x62,0x3f,0x42,0x64,0x38,0x4a,0x40,0x66,0x2b,0x44,0x01,0x60,0x80,0x34,0x57,0x42,0x13,0x2b,0x11,0x48,0x29,0x3c,0x4b,0x4b, +0x3c,0x40,0x60,0x37,0x37,0x60,0x40,0x44,0x72,0x1c,0x2c,0x13,0x4c,0x35,0x29,0x52,0x00,0x02,0x00,0x55,0xff,0xf6,0x02,0x11,0x02,0xe4,0x00,0x1b,0x00,0x29,0x00,0x49,0x40,0x46,0x12,0x01,0x05,0x06,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01, +0x3e,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x36,0x33,0x32, +0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x34,0x67,0x78,0x76,0x65,0x5b,0x72,0x07,0x5a,0x05,0x43,0x33,0x3b,0x45,0x0b,0x4f,0x3d,0x5e,0x6d,0x77,0x67,0x3d,0x47,0x47,0x3d,0x3d,0x47,0x47,0x0a,0x74,0x63,0x01,0x40,0x63,0x74,0x59,0x47,0x22,0x2e,0x49,0x3e,0xa5,0x30,0x37, +0x74,0x63,0x2b,0x63,0x74,0x50,0x49,0x3e,0x2b,0x3e,0x49,0x49,0x3e,0x2b,0x3e,0x49,0x00,0x02,0x00,0x49,0xff,0xf6,0x02,0x03,0x02,0xe4,0x00,0x1b,0x00,0x29,0x00,0x49,0x40,0x46,0x0b,0x01,0x05,0x06,0x01,0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x08,0x01,0x05,0x00,0x03,0x01,0x05,0x03,0x69,0x00,0x06,0x06,0x04,0x61,0x00,0x04, +0x04,0x3e,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32, +0x16,0x15,0x11,0x14,0x06,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x28,0x5b,0x72,0x07,0x5a,0x05,0x43,0x33,0x3b,0x45,0x0a,0x4e,0x3e,0x5e,0x6c,0x76,0x66,0x67,0x77,0x76,0x67,0x3d,0x46,0x46,0x3d,0x3d,0x46,0x46,0x0a,0x5b,0x4a,0x25,0x30,0x49,0x3e,0xb8,0x32,0x39,0x74,0x63,0x1c,0x63,0x74,0x74, +0x63,0xfe,0xc0,0x63,0x74,0x01,0x74,0x49,0x3e,0x1c,0x3e,0x49,0x49,0x3e,0x1c,0x3e,0x49,0x00,0x00,0x00,0x00,0x03,0x00,0x42,0xff,0xf6,0x02,0x16,0x02,0xe5,0x00,0x1b,0x00,0x29,0x00,0x37,0x00,0x36,0x40,0x33,0x31,0x1d,0x15,0x07,0x04,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x03,0x03,0x00, +0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x2b,0x2a,0x01,0x00,0x2a,0x37,0x2b,0x37,0x25,0x23,0x0f,0x0d,0x00,0x1b,0x01,0x1b,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x17,0x37,0x36,0x36,0x35,0x34,0x26, +0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x01,0x2c,0x46,0x6a,0x3a,0x4f,0x42,0x41,0x40,0x39,0x62,0x3f,0x3f,0x63,0x38,0x40,0x41,0x42,0x4f,0x3a,0x69,0x64,0x1d,0x19,0x2f,0x3a,0x48,0x3a,0x3a,0x48,0x38,0x4a,0x42,0x50,0x36,0x31,0x2b,0x2e,0x30,0x34,0x50,0x0a,0x31,0x57, +0x39,0x3e,0x6b,0x1e,0x20,0x59,0x33,0x37,0x54,0x30,0x30,0x54,0x37,0x32,0x59,0x21,0x1e,0x6b,0x3e,0x39,0x57,0x31,0x01,0xb5,0x0b,0x0a,0x12,0x43,0x28,0x31,0x3d,0x3e,0x30,0x29,0x42,0xfe,0x8a,0x45,0x38,0x2c,0x47,0x13,0x11,0x12,0x13,0x47,0x2b,0x38,0x45,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xf6,0x02,0x03,0x02,0xda,0x00,0x20, +0x00,0x4d,0x40,0x4a,0x17,0x01,0x03,0x07,0x01,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x07,0x00,0x03,0x04,0x07,0x03,0x69,0x00,0x06,0x06,0x05,0x5f,0x00,0x05,0x05,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1b,0x19,0x16,0x15,0x14,0x13,0x12, +0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x20,0x01,0x20,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x11,0x21,0x15,0x21,0x17,0x36,0x36,0x33,0x36,0x16,0x15,0x15,0x14,0x06,0x01,0x2a,0x5b,0x73,0x07,0x5a,0x05,0x43,0x34,0x3a,0x44,0x44,0x3a,0x27,0x39,0x0d, +0x5a,0x01,0x85,0xfe,0xcf,0x02,0x0d,0x48,0x35,0x5b,0x64,0x75,0x0a,0x5c,0x4e,0x29,0x31,0x46,0x3c,0x47,0x3c,0x46,0x28,0x1e,0x01,0x8f,0x52,0xf5,0x24,0x29,0x01,0x6f,0x63,0x47,0x61,0x71,0xff,0xff,0x00,0x89,0xff,0x76,0x01,0xcf,0x01,0x40,0x03,0x07,0x03,0x02,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0x7b,0x01,0xe0,0x01,0x3b,0x03,0x07,0x03,0x03,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0xff,0x7b,0x01,0xc9,0x01,0x40,0x03,0x07,0x03,0x04,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x76,0x01,0xce,0x01,0x3b,0x03,0x07,0x03,0x05,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8f,0xff,0x7b,0x01,0xbd,0x01,0x3b,0x03,0x07,0x03,0x06,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8d,0xff,0x76,0x01,0xcf,0x01,0x3b,0x03,0x07,0x03,0x07,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x86,0xff,0x76,0x01,0xd2,0x01,0x3b,0x03,0x07,0x03,0x08,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x94,0xff,0x7b,0x01,0xce,0x01,0x3b,0x03,0x07,0x03,0x09,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0x6c,0x01,0xd1,0x01,0x36,0x03,0x07,0x03,0x0a,0x00,0x00,0xfd,0xf3,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfd,0xf3,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x7b,0x01,0xcd,0x01,0x40,0x03,0x07,0x03,0x0b,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0xfb,0x01,0xcf,0x01,0xc5,0x03,0x07,0x03,0x02,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x96,0x00,0x00,0x01,0xe0,0x01,0xc0,0x03,0x07,0x03,0x03,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x00,0x00,0x01,0xc9,0x01,0xc5,0x03,0x07,0x03,0x04,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0xfb,0x01,0xce,0x01,0xc0,0x03,0x07,0x03,0x05,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8f,0x00,0x00,0x01,0xbd,0x01,0xc0,0x03,0x07,0x03,0x06,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8d,0xff,0xfb,0x01,0xcf,0x01,0xc0,0x03,0x07,0x03,0x07,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x86,0xff,0xfb,0x01,0xd2,0x01,0xc0,0x03,0x07,0x03,0x08,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x94,0x00,0x00,0x01,0xce,0x01,0xc0,0x03,0x07,0x03,0x09,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xfb,0x01,0xd1,0x01,0xc5,0x03,0x07,0x03,0x0a,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfe,0x82,0xb0,0x35, +0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0x00,0x00,0x01,0xcd,0x01,0xc5,0x03,0x07,0x03,0x0b,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0x01,0x15,0x01,0xcf,0x02,0xdf,0x03,0x06,0x03,0x02,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00, +0xff,0xff,0x00,0x96,0x01,0x1a,0x01,0xe0,0x02,0xda,0x03,0x06,0x03,0x03,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x93,0x01,0x1a,0x01,0xc9,0x02,0xdf,0x03,0x06,0x03,0x04,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8b,0x01,0x15,0x01,0xce, +0x02,0xda,0x03,0x06,0x03,0x05,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8f,0x01,0x1a,0x01,0xbd,0x02,0xda,0x03,0x06,0x03,0x06,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8d,0x01,0x15,0x01,0xcf,0x02,0xda,0x03,0x06,0x03,0x07,0x00,0x9c, +0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x86,0x01,0x15,0x01,0xd2,0x02,0xda,0x03,0x06,0x03,0x08,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x94,0x01,0x1a,0x01,0xce,0x02,0xda,0x03,0x06,0x03,0x09,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c, +0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x87,0x01,0x15,0x01,0xd1,0x02,0xdf,0x03,0x06,0x03,0x0a,0x00,0x9c,0x00,0x09,0xb1,0x00,0x03,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8b,0x01,0x1a,0x01,0xcd,0x02,0xdf,0x03,0x06,0x03,0x0b,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0x00,0x02,0x00,0x89, +0x01,0x79,0x01,0xcf,0x03,0x43,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x53,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36, +0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x49,0x5a,0x5a,0x49,0x49,0x5a,0x5a,0x49,0x29,0x33,0x33,0x29,0x29,0x33,0x33,0x01,0x79,0x5c,0x49,0x81,0x49,0x5b,0x5b,0x49,0x81,0x49,0x5c,0x40,0x38,0x2d,0x81,0x2c,0x38,0x38,0x2c,0x81,0x2d,0x38,0x00,0x00,0x00, +0x00,0x01,0x00,0x96,0x01,0x7e,0x01,0xe0,0x03,0x3e,0x00,0x0a,0x00,0x29,0x40,0x26,0x05,0x04,0x03,0x03,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x50,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x51,0x03,0x4e,0x00,0x00,0x00,0x0a,0x00,0x0a,0x11,0x14,0x11,0x05,0x0b,0x19,0x2b,0x13,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x11, +0x33,0x15,0x96,0x90,0x8d,0x74,0x60,0x73,0x01,0x7e,0x41,0x01,0x44,0x55,0x49,0x47,0xfe,0x81,0x41,0x00,0x00,0x01,0x00,0x93,0x01,0x7e,0x01,0xc9,0x03,0x43,0x00,0x1a,0x00,0x34,0x40,0x31,0x01,0x01,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x52,0x4d,0x00,0x03,0x03,0x04, +0x5f,0x05,0x01,0x04,0x04,0x51,0x04,0x4e,0x00,0x00,0x00,0x1a,0x00,0x1a,0x17,0x23,0x12,0x27,0x06,0x0b,0x1a,0x2b,0x13,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x3e,0x02,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x9c,0xb7,0x14,0x18,0x2f,0x23,0x22,0x31,0x47,0x02,0x2a,0x45,0x29,0x2c,0x45,0x29, +0x2a,0x24,0x8c,0xdc,0x01,0x7e,0x4d,0x9e,0x11,0x25,0x16,0x23,0x2b,0x2c,0x24,0x2b,0x40,0x25,0x23,0x3f,0x2a,0x24,0x3e,0x1f,0x77,0x41,0x00,0x00,0x00,0x01,0x00,0x8b,0x01,0x79,0x01,0xce,0x03,0x3e,0x00,0x1a,0x00,0x43,0x40,0x40,0x15,0x14,0x0f,0x03,0x03,0x04,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x02,0x04, +0x01,0x02,0x7e,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x50,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x53,0x00,0x4e,0x01,0x00,0x13,0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x07,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35, +0x21,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x01,0x2c,0x47,0x5a,0x47,0x32,0x28,0x28,0x32,0x32,0x28,0x29,0x73,0xd5,0x01,0x1d,0x75,0x3c,0x49,0x5a,0x01,0x79,0x52,0x42,0x25,0x2f,0x2f,0x25,0x25,0x2e,0x45,0x58,0x41,0x48,0x5c,0x07,0x4c,0x3a,0x42,0x52,0x00,0x01,0x00,0x8f,0x01,0x7e,0x01,0xbd,0x03,0x3e,0x00,0x0b,0x00,0x30,0x40,0x2d, +0x06,0x03,0x02,0x02,0x03,0x01,0x4c,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x68,0x00,0x01,0x01,0x50,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x51,0x04,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x12,0x12,0x11,0x06,0x0b,0x1a,0x2b,0x01,0x35,0x23,0x35,0x37,0x33,0x03,0x15,0x33,0x35,0x33,0x11,0x01,0x76,0xe7,0xae,0x50,0xb8, +0xa1,0x47,0x01,0x7e,0x69,0x5d,0xfa,0xfe,0xf6,0x0d,0x72,0xfe,0xe5,0x00,0x00,0x00,0x00,0x01,0x00,0x8d,0x01,0x79,0x01,0xcf,0x03,0x3e,0x00,0x19,0x00,0x3e,0x40,0x3b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x06,0x00,0x03,0x01,0x06,0x03,0x67,0x00,0x05,0x05,0x04,0x5f,0x00,0x04,0x04,0x50,0x4d,0x00,0x02,0x02,0x00,0x61,0x07, +0x01,0x00,0x00,0x53,0x00,0x4e,0x01,0x00,0x15,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x19,0x01,0x19,0x08,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2f,0x49,0x59,0x46,0x32,0x2a,0x28,0x30,0x30, +0x28,0x8b,0x01,0x1a,0xd7,0x48,0x4a,0x56,0x58,0x01,0x79,0x50,0x44,0x28,0x2c,0x2f,0x25,0x26,0x2e,0xdd,0x3f,0x62,0x4e,0x42,0x42,0x52,0x00,0x00,0x00,0x02,0x00,0x86,0x01,0x79,0x01,0xd2,0x03,0x3e,0x00,0x10,0x00,0x1c,0x00,0x38,0x40,0x35,0x08,0x01,0x04,0x02,0x01,0x4c,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x6a,0x00,0x01,0x01,0x50, +0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x53,0x00,0x4e,0x12,0x11,0x01,0x00,0x18,0x16,0x11,0x1c,0x12,0x1c,0x0c,0x0a,0x07,0x06,0x00,0x10,0x01,0x10,0x07,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x37,0x37,0x33,0x07,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14, +0x16,0x01,0x2d,0x4b,0x5c,0x24,0x7e,0x4d,0x81,0x04,0x1b,0x31,0x40,0x4e,0x5b,0x4b,0x2a,0x34,0x34,0x2a,0x29,0x35,0x34,0x01,0x79,0x55,0x43,0x32,0x39,0xc2,0xc5,0x25,0x4e,0x3f,0x43,0x55,0x40,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x94,0x01,0x7e,0x01,0xce,0x03,0x3e,0x00,0x08,0x00,0x52,0xb5,0x07, +0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x18,0x00,0x01,0x00,0x03,0x00,0x01,0x72,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x50,0x4d,0x04,0x01,0x03,0x03,0x51,0x03,0x4e,0x1b,0x40,0x19,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x50,0x4d,0x04,0x01,0x03,0x03,0x51,0x03,0x4e, +0x59,0x40,0x0c,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x11,0x05,0x0b,0x19,0x2b,0x13,0x13,0x23,0x15,0x23,0x35,0x21,0x15,0x03,0xd8,0xb1,0xaf,0x46,0x01,0x3a,0xa8,0x01,0x7e,0x01,0x80,0x4e,0x8e,0x4c,0xfe,0x8c,0x00,0x00,0x00,0x00,0x03,0x00,0x87,0x01,0x79,0x01,0xd1,0x03,0x43,0x00,0x19,0x00,0x25,0x00,0x31,0x00,0x45,0x40,0x42, +0x13,0x06,0x02,0x05,0x02,0x01,0x4c,0x07,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x08,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x53,0x00,0x4e,0x27,0x26,0x1b,0x1a,0x01,0x00,0x2d,0x2b,0x26,0x31,0x27,0x31,0x21,0x1f,0x1a,0x25,0x1b,0x25,0x0e,0x0c,0x00,0x19,0x01,0x19,0x09, +0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x49,0x5c,0x3a,0x2e,0x2a,0x33,0x55,0x45,0x46, +0x56,0x34,0x2c,0x2f,0x3a,0x5b,0x4a,0x27,0x30,0x30,0x27,0x26,0x2f,0x2f,0x26,0x2a,0x36,0x36,0x2a,0x2a,0x36,0x36,0x01,0x79,0x49,0x3a,0x2e,0x3d,0x04,0x04,0x08,0x34,0x22,0x35,0x41,0x41,0x35,0x22,0x34,0x08,0x04,0x04,0x3d,0x2e,0x3a,0x49,0x01,0x0b,0x24,0x1d,0x1d,0x25,0x25,0x1d,0x1d,0x24,0xce,0x29,0x21,0x21,0x29,0x29,0x21,0x21, +0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x7e,0x01,0xcd,0x03,0x43,0x00,0x12,0x00,0x1e,0x00,0x36,0x40,0x33,0x01,0x01,0x00,0x03,0x01,0x4c,0x06,0x01,0x03,0x00,0x00,0x02,0x03,0x00,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x05,0x01,0x02,0x02,0x51,0x02,0x4e,0x14,0x13,0x00,0x00,0x1a,0x18,0x13,0x1e,0x14,0x1e, +0x00,0x12,0x00,0x12,0x24,0x24,0x07,0x0b,0x18,0x2b,0x13,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xe7,0x7e,0x04,0x0a,0x26,0x1d,0x3f,0x4a,0x57,0x49,0x4a,0x58,0x16,0x16,0x6d,0x08,0x26,0x33,0x30,0x29,0x29,0x30,0x30, +0x01,0x7e,0xc5,0x10,0x15,0x4f,0x3e,0x44,0x54,0x54,0x44,0x21,0x3c,0x23,0xad,0xd5,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0xff,0xff,0x00,0x9a,0xff,0x7b,0x01,0xce,0x01,0x40,0x03,0x07,0x03,0x15,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0x76,0x01,0xd4, +0x01,0x40,0x03,0x07,0x03,0x16,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x84,0xff,0x76,0x01,0xc8,0x01,0x40,0x03,0x07,0x03,0x17,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x9a,0x00,0x00,0x01,0xce, +0x01,0xc5,0x03,0x07,0x03,0x15,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0xfb,0x01,0xd4,0x01,0xc5,0x03,0x07,0x03,0x16,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x84,0xff,0xfb,0x01,0xc8, +0x01,0xc5,0x03,0x07,0x03,0x17,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x9a,0x01,0x1a,0x01,0xce,0x02,0xdf,0x03,0x06,0x03,0x15,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x90,0x01,0x15,0x01,0xd4,0x02,0xdf,0x03,0x06, +0x03,0x16,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x84,0x01,0x15,0x01,0xc8,0x02,0xdf,0x03,0x06,0x03,0x17,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x9a,0x01,0x7e,0x01,0xce,0x03,0x43,0x00,0x1e,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03, +0x00,0x01,0x03,0x80,0x00,0x02,0x00,0x00,0x01,0x02,0x00,0x69,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x1e,0x00,0x1e,0x19,0x22,0x12,0x2a,0x06,0x09,0x1a,0x2b,0x13,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e, +0x04,0x15,0x33,0x15,0xa0,0x21,0x35,0x3a,0x35,0x21,0x2d,0x23,0x26,0x2e,0x48,0x56,0x46,0x43,0x55,0x22,0x34,0x3c,0x34,0x22,0xe7,0x01,0x7e,0x39,0x2f,0x3b,0x26,0x1b,0x1a,0x24,0x1c,0x20,0x27,0x2d,0x23,0x40,0x50,0x4a,0x3d,0x29,0x34,0x22,0x1a,0x1c,0x28,0x20,0x41,0x00,0x00,0x02,0x00,0x90,0x01,0x79,0x01,0xd4,0x03,0x43,0x00,0x1a, +0x00,0x26,0x00,0x4d,0x40,0x4a,0x12,0x01,0x05,0x06,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x08,0x01,0x05,0x00,0x00,0x05,0x59,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x05,0x00,0x51,0x1c,0x1b,0x01,0x00,0x22,0x20,0x1b,0x26,0x1c, +0x26,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x32,0x49,0x59,0x56,0x4c,0x44,0x56, +0x04,0x45,0x04,0x31,0x24,0x2b,0x32,0x01,0x16,0x54,0x41,0x53,0x59,0x49,0x29,0x32,0x32,0x2a,0x2a,0x32,0x33,0x01,0x79,0x54,0x43,0x94,0x4a,0x55,0x45,0x37,0x1b,0x23,0x34,0x2d,0x50,0x4c,0x4f,0x41,0x43,0x54,0x3f,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x79,0x01,0xc8,0x03,0x43,0x00,0x1a, +0x00,0x26,0x00,0x4c,0x40,0x49,0x0b,0x01,0x05,0x06,0x01,0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x08,0x01,0x05,0x00,0x03,0x01,0x05,0x03,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x02,0x00,0x51,0x1c,0x1b,0x01,0x00,0x22,0x20,0x1b,0x26,0x1c,0x26, +0x15,0x13,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x31,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x26,0x43,0x57,0x04,0x45,0x05,0x30,0x24, +0x2c,0x31,0x16,0x55,0x41,0x53,0x59,0x49,0x49,0x59,0x56,0x4b,0x2a,0x32,0x33,0x2a,0x29,0x32,0x32,0x01,0x79,0x44,0x34,0x18,0x21,0x34,0x2c,0x55,0x4c,0x4e,0x40,0x42,0x52,0x52,0x42,0x97,0x49,0x56,0xe0,0x2f,0x27,0x26,0x30,0x30,0x26,0x26,0x30,0x00,0xff,0xff,0x00,0x87,0xff,0x6c,0x01,0xd1,0x01,0x36,0x03,0x07,0x03,0x1b,0x00,0x00, +0xfd,0xf3,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfd,0xf3,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xfb,0x01,0xd1,0x01,0xc5,0x03,0x07,0x03,0x1b,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0x01,0x10,0x01,0xd1,0x02,0xda,0x03,0x06,0x03,0x1b,0x00,0x97, +0x00,0x09,0xb1,0x00,0x03,0xb8,0xff,0x97,0xb0,0x35,0x2b,0x00,0x00,0x03,0x00,0x87,0x01,0x79,0x01,0xd1,0x03,0x43,0x00,0x1b,0x00,0x29,0x00,0x37,0x00,0x3a,0x40,0x37,0x31,0x1d,0x15,0x07,0x04,0x03,0x02,0x01,0x4c,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x69,0x05,0x01,0x03,0x00,0x00,0x03,0x59,0x05,0x01,0x03,0x03,0x00,0x61,0x04,0x01, +0x00,0x03,0x00,0x51,0x2b,0x2a,0x01,0x00,0x2a,0x37,0x2b,0x37,0x25,0x23,0x0f,0x0d,0x00,0x1b,0x01,0x1b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x37,0x37,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x03,0x17,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15, +0x14,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x01,0x2c,0x49,0x5c,0x28,0x20,0x26,0x1a,0x1f,0x2a,0x56,0x44,0x44,0x56,0x25,0x1d,0x1c,0x20,0x22,0x27,0x5b,0x72,0x2a,0x2b,0x11,0x17,0x2f,0x26,0x25,0x30,0x1a,0x3b,0x2b,0x35,0x19,0x14,0x31,0x35,0x14,0x19,0x35,0x01,0x79,0x49,0x3a,0x1f,0x2d,0x0e, +0x10,0x0c,0x0e,0x2f,0x1b,0x36,0x43,0x43,0x36,0x1e,0x2e,0x0d,0x0c,0x0f,0x0f,0x2d,0x1e,0x3a,0x49,0x01,0x19,0x13,0x12,0x08,0x1c,0x13,0x1c,0x23,0x23,0x1c,0x12,0x1b,0xe4,0x25,0x1e,0x14,0x1e,0x09,0x17,0x17,0x08,0x1e,0x14,0x1e,0x26,0x00,0x00,0x00,0xff,0xff,0x00,0x8a,0xff,0x76,0x01,0xcc,0x01,0x3b,0x03,0x07,0x03,0x1f,0x00,0x00, +0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8a,0x01,0x15,0x01,0xcc,0x02,0xda,0x03,0x06,0x03,0x1f,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8a,0x01,0x10,0x01,0xcc,0x02,0xd5,0x03,0x06,0x03,0x1f,0x00,0x97,0x00,0x09,0xb1,0x00, +0x01,0xb8,0xff,0x97,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x8a,0x01,0x79,0x01,0xcc,0x03,0x3e,0x00,0x1e,0x00,0x50,0x40,0x4d,0x16,0x01,0x03,0x07,0x01,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x00,0x03,0x04,0x07,0x03,0x69,0x00,0x02,0x00, +0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x1a,0x18,0x15,0x14,0x13,0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1e,0x01,0x1e,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x11,0x21,0x15,0x23,0x15,0x36,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x01,0x2a,0x40,0x59,0x07,0x48,0x05,0x31,0x22,0x28,0x32,0x32,0x28,0x1b,0x29,0x0b,0x41,0x01,0x1c,0xd9,0x0d,0x34,0x22,0x3e,0x4e,0x5a,0x01,0x79,0x43,0x35,0x19,0x1f,0x33,0x25,0x26,0x32,0x1a,0x12,0x01,0x01,0x40,0x88,0x14,0x1a,0x53,0x40,0x42,0x56,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x02,0x53, +0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x00,0x00,0x00,0x38,0x4d,0x02,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x33,0x01,0x33,0x01,0x05,0x01,0xf9,0x55,0xfe,0x07,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x12,0x00,0x2e,0x00,0x6a, +0xb1,0x06,0x64,0x44,0x40,0x5f,0x0a,0x09,0x05,0x03,0x01,0x02,0x28,0x14,0x02,0x09,0x07,0x29,0x01,0x05,0x09,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85,0x00,0x07,0x06,0x09,0x06,0x07,0x09,0x80,0x03,0x01,0x01,0x00,0x00,0x08,0x01,0x00,0x68,0x00,0x08,0x00,0x06,0x07,0x08,0x06,0x69,0x00,0x09,0x05,0x05,0x09,0x57,0x00,0x09,0x09,0x05, +0x5f,0x0c,0x0a,0x0b,0x03,0x05,0x09,0x05,0x4f,0x13,0x13,0x00,0x00,0x13,0x2e,0x13,0x2e,0x2d,0x2b,0x22,0x20,0x1e,0x1d,0x1b,0x19,0x00,0x12,0x00,0x12,0x12,0x11,0x17,0x11,0x11,0x0d,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x33,0x01,0x23,0x35,0x33,0x35,0x06,0x06,0x07,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x13,0x33,0x01,0x33,0x35,0x37, +0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x15,0x36,0x36,0x33,0x33,0x15,0x05,0x01,0x18,0xff,0x76,0x04,0x12,0x0b,0x3e,0x46,0x55,0x6b,0xc3,0x55,0xfe,0x07,0xe1,0x78,0x46,0x24,0x1d,0x1d,0x24,0x3c,0x02,0x45,0x36,0x38,0x45,0x2d,0x29,0x5d,0x0b,0x2a,0x16,0x6d,0x01,0x95,0x32, +0xec,0x07,0x15,0x0a,0x36,0x46,0x3d,0xfe,0xed,0x07,0x01,0x1a,0xfd,0x26,0x40,0x45,0x28,0x2b,0x1d,0x23,0x23,0x1d,0x34,0x3e,0x3e,0x32,0x1f,0x3c,0x17,0x34,0x0a,0x02,0x06,0x32,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x12,0x00,0x1e,0x00,0x6a,0xb1,0x06,0x64,0x44,0x40,0x5f,0x0a,0x09,0x05,0x03,0x01,0x02, +0x0f,0x01,0x00,0x01,0x19,0x16,0x02,0x08,0x09,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85,0x00,0x07,0x00,0x09,0x00,0x07,0x09,0x80,0x03,0x01,0x01,0x00,0x00,0x07,0x01,0x00,0x68,0x00,0x09,0x08,0x05,0x09,0x57,0x00,0x08,0x00,0x06,0x05,0x08,0x06,0x68,0x00,0x09,0x09,0x05,0x5f,0x0c,0x0a,0x0b,0x03,0x05,0x09,0x05,0x4f,0x13,0x13,0x00, +0x00,0x13,0x1e,0x13,0x1e,0x1d,0x1c,0x1b,0x1a,0x18,0x17,0x15,0x14,0x00,0x12,0x00,0x12,0x12,0x11,0x17,0x11,0x11,0x0d,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x33,0x01,0x23,0x35,0x33,0x35,0x06,0x06,0x07,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x13,0x33,0x01,0x21,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15,0x05,0x01,0x18, +0xff,0x76,0x04,0x12,0x0b,0x3e,0x46,0x55,0x61,0xcd,0x55,0xfe,0x07,0x01,0x86,0xaf,0x7e,0x45,0x87,0x73,0x3c,0x01,0x95,0x32,0xec,0x07,0x15,0x0a,0x36,0x46,0x3d,0xfe,0xed,0x15,0x01,0x28,0xfd,0x26,0x46,0x50,0xaf,0xbd,0x10,0x59,0xd1,0x00,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x1a,0x00,0x1e,0x00,0x2a, +0x00,0xd3,0xb1,0x06,0x64,0x44,0x40,0x0d,0x15,0x14,0x0f,0x03,0x03,0x04,0x25,0x22,0x02,0x0a,0x0b,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x42,0x00,0x03,0x04,0x01,0x04,0x03,0x72,0x00,0x09,0x00,0x0b,0x00,0x09,0x0b,0x80,0x06,0x01,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x01,0x02,0x07,0x01,0x57,0x00,0x02,0x0d,0x01,0x00,0x09, +0x02,0x00,0x69,0x00,0x0b,0x0a,0x07,0x0b,0x57,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x68,0x00,0x0b,0x0b,0x07,0x60,0x0f,0x0c,0x0e,0x03,0x07,0x0b,0x07,0x50,0x1b,0x40,0x43,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x09,0x00,0x0b,0x00,0x09,0x0b,0x80,0x06,0x01,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x01,0x02,0x07,0x01,0x57, +0x00,0x02,0x0d,0x01,0x00,0x09,0x02,0x00,0x69,0x00,0x0b,0x0a,0x07,0x0b,0x57,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x68,0x00,0x0b,0x0b,0x07,0x60,0x0f,0x0c,0x0e,0x03,0x07,0x0b,0x07,0x50,0x59,0x40,0x29,0x1f,0x1f,0x1b,0x1b,0x01,0x00,0x1f,0x2a,0x1f,0x2a,0x29,0x28,0x27,0x26,0x24,0x23,0x21,0x20,0x1b,0x1e,0x1b,0x1e,0x1d,0x1c,0x13, +0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x10,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x13,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x21,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15, +0x9a,0x3a,0x46,0x3c,0x25,0x1f,0x1e,0x25,0x25,0x1d,0x1e,0x51,0x9c,0xd7,0x55,0x2d,0x38,0x46,0xce,0x01,0xf9,0x55,0xfe,0x07,0x01,0x86,0xaf,0x7e,0x45,0x87,0x73,0x3c,0x01,0x90,0x3a,0x2f,0x19,0x1e,0x1e,0x19,0x19,0x1e,0x39,0x3f,0x32,0x37,0x42,0x06,0x38,0x2a,0x2f,0x3a,0xfe,0x70,0x02,0xda,0xfd,0x26,0x46,0x50,0xaf,0xbd,0x10,0x59, +0xd1,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0x76,0x01,0xcf,0x01,0x40,0x03,0x07,0x03,0x02,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0x01,0x79,0x01,0xcf,0x03,0x43,0x02,0x06,0x03,0x02,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0xe4,0x01,0xcf,0x01,0xae,0x03,0x07, +0x03,0x02,0x00,0x00,0xfe,0x6b,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x6b,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x01,0x8b,0x01,0xc7,0x03,0x48,0x00,0x0d,0x00,0x1b,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00, +0x51,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x48,0x53,0x53,0x48,0x48,0x53,0x53,0x48,0x28,0x2d,0x2d,0x28,0x28, +0x2d,0x2d,0x01,0x8b,0x4f,0x46,0x94,0x45,0x4f,0x4f,0x45,0x94,0x46,0x4f,0x3f,0x2e,0x28,0x94,0x28,0x2d,0x2d,0x28,0x94,0x28,0x2e,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0xff,0xf6,0x02,0x0c,0x02,0x8a,0x00,0x15,0x00,0x22,0x00,0x32,0x40,0x2f,0x1f,0x0e,0x0b,0x08,0x04,0x03,0x01,0x01,0x4c,0x02,0x01,0x01,0x03,0x01,0x85,0x00,0x03,0x00, +0x00,0x03,0x59,0x00,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x03,0x00,0x51,0x01,0x00,0x1a,0x18,0x0d,0x0c,0x0a,0x09,0x00,0x15,0x01,0x15,0x05,0x06,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x27,0x33,0x17,0x37,0x33,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x07,0x06, +0x06,0x01,0x2c,0x43,0x63,0x36,0x2b,0x22,0x5b,0xac,0x68,0x79,0x79,0x66,0xac,0x5d,0x23,0x28,0x36,0x62,0xc6,0x46,0x3c,0x3c,0x46,0x30,0x52,0x53,0x16,0x19,0x0a,0x32,0x56,0x34,0x2e,0x51,0x28,0x69,0xc8,0x8b,0x8b,0xc7,0x6b,0x29,0x51,0x2c,0x34,0x56,0x32,0xc4,0x30,0x44,0x44,0x30,0x37,0x36,0x60,0x60,0x19,0x37,0x00,0x01,0x00,0xda, +0xff,0xf6,0x01,0x7e,0x00,0x98,0x00,0x0b,0x00,0x1a,0x40,0x17,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2d,0x2d,0x25,0x25,0x2d,0x2d,0x0a,0x2c,0x23,0x25,0x2e,0x2e,0x25, +0x23,0x2c,0x00,0x00,0x00,0x01,0x00,0xd2,0xff,0x60,0x01,0x75,0x00,0x92,0x00,0x03,0x00,0x35,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x3d,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x03, +0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x17,0x13,0x33,0x03,0xd2,0x37,0x6c,0x46,0xa0,0x01,0x32,0xfe,0xce,0x00,0x02,0x00,0xd9,0xff,0xf6,0x01,0x7f,0x02,0x30,0x00,0x0b,0x00,0x17,0x00,0x2d,0x40,0x2a,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x02,0x3f,0x02,0x4e,0x0d,0x0c,0x01, +0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x01,0x9c,0x28,0x22,0x22,0x28, +0x28,0x22,0x22,0x28,0xfe,0x5a,0x28,0x22,0x22,0x28,0x28,0x22,0x22,0x28,0x00,0x00,0x00,0x02,0x00,0xcd,0xff,0x60,0x01,0x81,0x02,0x30,0x00,0x0d,0x00,0x11,0x00,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x17,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40, +0x14,0x00,0x02,0x05,0x01,0x03,0x02,0x03,0x63,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x13,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x13,0x33,0x03,0x01,0x22, +0x21,0x2a,0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x69,0x37,0x6c,0x46,0x01,0x9a,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfd,0xc6,0x01,0x32,0xfe,0xce,0x00,0x00,0x00,0x00,0x03,0x00,0x3c,0xff,0xf6,0x02,0x1c,0x00,0xaa,0x00,0x0d,0x00,0x1b,0x00,0x29,0x00,0x30,0x40,0x2d,0x05,0x03,0x02,0x01,0x01,0x00,0x61,0x08,0x04,0x07,0x02,0x06, +0x05,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x0f,0x0e,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x33,0x22, +0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0xea,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0xfe,0x6d,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0xa7,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0x0a,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e, +0x1e,0x19,0x46,0x19,0x1e,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0xff,0xfb,0x01,0x77,0x02,0xda,0x00,0x03,0x00,0x11,0x00,0x2c,0x40,0x29,0x04,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x02,0x42,0x02,0x4e,0x05,0x04,0x00,0x00,0x0c,0x09,0x04,0x11,0x05,0x10,0x00,0x03,0x00,0x03,0x11, +0x06,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x03,0x0c,0x6a,0x0c,0x38,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xdc,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0xe1,0xff,0x4c,0x01,0x77,0x02,0x2b,0x00,0x0d, +0x00,0x11,0x00,0x2d,0x40,0x2a,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03, +0x13,0x33,0x13,0x01,0x1d,0x1a,0x22,0x22,0x1a,0x1e,0x1a,0x22,0x1f,0x1d,0x44,0x0c,0x52,0x0c,0x01,0xb3,0x22,0x1a,0x1a,0x22,0x23,0x1a,0x19,0x22,0xfd,0x99,0x02,0x03,0xfd,0xfd,0x00,0x00,0x00,0x02,0x00,0x82,0xff,0xfb,0x01,0xe5,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x70,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x26,0x07,0x01,0x04,0x03,0x06, +0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x06,0x06,0x05,0x61,0x08,0x01,0x05,0x05,0x42,0x05,0x4e,0x1b,0x40,0x27,0x07,0x01,0x04,0x03,0x06,0x03,0x04,0x06,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00, +0x06,0x06,0x05,0x61,0x08,0x01,0x05,0x05,0x42,0x05,0x4e,0x59,0x40,0x15,0x16,0x15,0x00,0x00,0x1d,0x1a,0x15,0x22,0x16,0x21,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x09,0x09,0x1a,0x2b,0x37,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33, +0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xce,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x3d,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0xdc,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0x73,0xff,0x4c,0x01,0xd6, +0x02,0x2b,0x00,0x0d,0x00,0x22,0x00,0x74,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x26,0x00,0x04,0x00,0x03,0x03,0x04,0x72,0x00,0x03,0x00,0x05,0x06,0x03,0x05,0x6a,0x07,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x01,0x02,0x02,0x3d,0x02,0x4e,0x1b,0x40,0x27,0x00,0x04,0x00,0x03,0x00,0x04,0x03,0x80, +0x00,0x03,0x00,0x05,0x06,0x03,0x05,0x6a,0x07,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x01,0x02,0x02,0x3d,0x02,0x4e,0x59,0x40,0x19,0x0f,0x0e,0x01,0x00,0x21,0x1f,0x1b,0x19,0x18,0x17,0x16,0x15,0x0e,0x22,0x0f,0x22,0x08,0x05,0x00,0x0d,0x01,0x0c,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35, +0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x4f,0x1c,0x20,0x22,0x1a,0x1e,0x1a,0x22,0x22,0x1a,0x14,0x46,0x67,0x39,0x30,0x55,0x38,0x5a,0x32,0x40,0x4b,0x4c,0x40,0x7d,0x01,0xb3,0x22,0x19,0x1a,0x23,0x22,0x1a, +0x1a,0x22,0xfd,0x99,0x35,0x61,0x41,0x3a,0x5a,0x36,0x03,0x5f,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x00,0x00,0xff,0xff,0x00,0xda,0x01,0x04,0x01,0x7e,0x01,0xa6,0x03,0x07,0x03,0x29,0x00,0x00,0x01,0x0e,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x0e,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0xf5,0x01,0xa4,0x01,0xe5,0x00,0x0b, +0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0xf5,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x00, +0x00,0x01,0x00,0x24,0x00,0x67,0x02,0x34,0x02,0x6c,0x00,0x2c,0x00,0x1b,0x40,0x18,0x29,0x25,0x24,0x20,0x1c,0x1b,0x17,0x0e,0x0a,0x09,0x05,0x01,0x0c,0x00,0x49,0x00,0x00,0x00,0x76,0x13,0x12,0x01,0x09,0x16,0x2b,0x37,0x27,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x37,0x17,0x16,0x16,0x17,0x26,0x26,0x35,0x35,0x33,0x15,0x14,0x06, +0x07,0x36,0x36,0x37,0x37,0x17,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x07,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0xb1,0x45,0x41,0x0d,0x2d,0x14,0x1c,0x3e,0x12,0x6b,0x1c,0x6c,0x11,0x38,0x17,0x05,0x05,0x54,0x06,0x05,0x18,0x37,0x12,0x6c,0x1c,0x6b,0x12,0x3e,0x1c,0x14,0x2e,0x0c,0x41,0x45,0x41,0x0c,0x22,0x0c,0x0c,0x22,0x0c,0x67, +0x31,0x5d,0x12,0x34,0x14,0x04,0x10,0x07,0x28,0x4f,0x28,0x06,0x1a,0x0e,0x1a,0x37,0x13,0x7d,0x7d,0x13,0x37,0x1a,0x0e,0x1a,0x06,0x28,0x4f,0x28,0x07,0x10,0x04,0x14,0x35,0x11,0x5d,0x31,0x5e,0x11,0x3c,0x1a,0x1a,0x3b,0x12,0x00,0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x0b,0x00,0x32,0x40,0x2f,0x00,0x00,0x00,0x01, +0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x06,0x01,0x05,0x04,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x17,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0xcd,0xf5,0x9b,0x9b,0x9b,0x96,0x6e,0x03, +0xac,0x50,0xfe,0xb1,0x50,0xfe,0x93,0x50,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x0b,0x00,0x2c,0x40,0x29,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x11,0x11,0x10,0x06,0x09, +0x1c,0x2b,0x05,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x8b,0xf0,0x96,0x9b,0x9b,0x9b,0xf5,0x6e,0x50,0x01,0x6d,0x50,0x01,0x4f,0x50,0x00,0x00,0x00,0x02,0x00,0x7d,0xff,0x92,0x01,0xdb,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04, +0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x7d,0x5a,0xaa,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x00,0xff,0xff,0x00,0x69,0xff,0xfb,0x01,0xef,0x02,0xda,0x00,0x26,0x03,0x2e,0x88,0x00,0x00,0x06,0x03,0x2e,0x78,0x00,0x00,0x00, +0x00,0x02,0x00,0x87,0xff,0xfb,0x01,0xea,0x02,0xda,0x00,0x16,0x00,0x24,0x00,0x3f,0x40,0x3c,0x15,0x05,0x02,0x03,0x00,0x01,0x4c,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x06,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x00,0x05,0x05,0x04,0x61,0x07,0x01,0x04,0x04,0x42,0x04,0x4e,0x18,0x17,0x00,0x00,0x1f,0x1c, +0x17,0x24,0x18,0x23,0x00,0x16,0x00,0x16,0x21,0x27,0x12,0x08,0x09,0x19,0x2b,0x37,0x27,0x35,0x33,0x15,0x07,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xdf,0x0d,0x5a,0x03,0x30,0x37,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39, +0x6a,0x5b,0x06,0x2f,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xcd,0xf5,0x64,0x64,0x3e,0x0a,0x43,0x32,0x3b,0x47,0x55,0x35,0x60,0x42,0x57,0x6e,0x07,0x6a,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x1b,0x00,0x1f,0x00,0x47,0x40,0x44,0x07,0x05,0x02,0x03,0x0f,0x08, +0x02,0x02,0x01,0x03,0x02,0x68,0x0e,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x0b,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x10,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x00,0x00,0x1f,0x1e,0x1d,0x1c,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x1f,0x2b,0x33, +0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x53,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xd2,0x41,0xb4,0x41,0xd2, +0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xff,0xff,0x00,0xda,0xff,0xf6,0x01,0x7e,0x00,0x98,0x02,0x06,0x03,0x29,0x00,0x00,0x00,0x01,0xff,0xf6,0x02,0xee,0x02,0x62,0x03,0x3e,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01, +0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x03,0x35,0x21,0x15,0x0a,0x02,0x6c,0x02,0xee,0x50,0x50,0x00,0x00,0x01,0x00,0x4b,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17, +0x2b,0x17,0x01,0x33,0x01,0x4b,0x01,0x63,0x5f,0xfe,0x9d,0x6e,0x03,0xac,0xfc,0x54,0x00,0x01,0x00,0x4b,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x01,0x33,0x01,0x01,0xae,0xfe,0x9d,0x5f,0x01,0x63, +0x6e,0x03,0xac,0xfc,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0xff,0x4c,0x02,0x4e,0x00,0x00,0x00,0x0f,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x02,0x00,0x5f,0x04,0x01,0x00,0x00,0x3d,0x00,0x4e,0x01,0x00,0x0c,0x0b,0x09,0x06,0x04,0x03,0x00,0x0f,0x01,0x0e,0x05,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x33,0x14, +0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xb4,0x4e,0x5c,0x5a,0x31,0x29,0xdc,0x29,0x31,0x5a,0x5c,0x4e,0xb4,0x61,0x53,0x2e,0x36,0x36,0x2e,0x53,0x61,0x00,0x00,0x02,0x00,0xd9,0x00,0x46,0x01,0x7f,0x02,0x80,0x00,0x0b,0x00,0x17,0x00,0x30,0x40,0x2d,0x00,0x01,0x04,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x02,0x02,0x03, +0x59,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x03,0x02,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d, +0x2d,0x26,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x01,0xea,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xfe,0x5c,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0xff,0xff,0xff,0x1a,0x01,0x09,0xff,0xbe,0x01,0xab,0x01,0x07,0x03,0x29,0xfe,0x40,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00, +0xff,0xff,0xff,0x79,0x01,0x09,0x00,0x1d,0x01,0xab,0x01,0x07,0x03,0x29,0xfe,0x9f,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xb9,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x11,0x00,0x06,0xb3,0x07,0x00,0x01,0x32,0x2b,0x05,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x0e,0x02,0x15, +0x15,0x14,0x16,0x16,0x17,0x01,0xe5,0x8f,0x9d,0x9d,0x8f,0x40,0x5f,0x33,0x33,0x5f,0x40,0x78,0x20,0xcc,0x9a,0xb4,0x9a,0xcc,0x20,0x57,0x0f,0x54,0x7d,0x4f,0xb4,0x4e,0x7e,0x54,0x0f,0x00,0x00,0x01,0x00,0x73,0xff,0x88,0x01,0x9f,0x03,0x48,0x00,0x11,0x00,0x06,0xb3,0x0b,0x00,0x01,0x32,0x2b,0x17,0x35,0x3e,0x02,0x35,0x35,0x34,0x26, +0x26,0x27,0x35,0x16,0x16,0x15,0x15,0x14,0x06,0x73,0x41,0x5e,0x33,0x33,0x5e,0x41,0x8f,0x9d,0x9d,0x78,0x57,0x0f,0x54,0x7e,0x4e,0xb4,0x4f,0x7d,0x54,0x0f,0x57,0x20,0xcc,0x9a,0xb4,0x9a,0xcc,0x00,0x00,0x00,0x00,0x01,0x00,0x4b,0xff,0x92,0x01,0xf9,0x03,0x3e,0x00,0x24,0x00,0x3d,0x40,0x3a,0x1b,0x01,0x01,0x02,0x01,0x4c,0x00,0x03, +0x00,0x04,0x02,0x03,0x04,0x69,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x00,0x05,0x59,0x00,0x05,0x05,0x00,0x61,0x06,0x01,0x00,0x05,0x00,0x51,0x01,0x00,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36, +0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0xcc,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x05,0x42,0x4b,0x4b,0x42,0x05,0x0f,0x04,0x34,0x2f,0x2d,0x6e,0x57,0x4f,0xa4,0x35, +0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x3b,0x47,0x07,0x07,0x4e,0x3a,0xa4,0x2b,0x2b,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x5f,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x26,0x00,0x38,0x40,0x35,0x09,0x01,0x04,0x03,0x01,0x4c,0x00,0x02,0x00,0x01,0x03,0x02,0x01,0x69,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x00, +0x05,0x05,0x00,0x59,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05,0x00,0x05,0x51,0x00,0x00,0x00,0x26,0x00,0x25,0x21,0x26,0x21,0x2c,0x21,0x07,0x09,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17, +0x17,0x16,0x06,0x06,0x23,0x5f,0x2d,0x2f,0x37,0x07,0x19,0x09,0x3a,0x33,0x33,0x3a,0x09,0x19,0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x6e,0x50,0x2b,0x2b,0xa4,0x39,0x4f,0x09,0x08,0x46,0x39,0xa4,0x2b,0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f, +0x35,0xa4,0x34,0x4b,0x27,0x00,0x00,0x00,0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x17,0x11, +0x33,0x15,0x23,0x11,0x33,0x15,0xcd,0xf5,0x9b,0x9b,0x6e,0x03,0xac,0x50,0xfc,0xf4,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00, +0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x17,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x96,0x9b,0x9b,0xf5,0x6e,0x50,0x03,0x0c,0x50,0xfc,0x54,0x00,0x00,0x00,0xff,0xff,0x00,0x4b,0xff,0x92,0x01,0xf9,0x03,0x3e,0x02,0x06,0x03,0x45,0x00,0x00,0xff,0xff,0x00,0x5f,0xff,0x92,0x02,0x0d,0x03,0x3e,0x02,0x06,0x03,0x46,0x00,0x00, +0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xef,0x02,0xda,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x33,0x03,0x13,0x33,0x03,0x13,0xf3,0x85,0x85,0xfc,0x85,0x85,0x01,0x6b,0x01,0x6f,0xfe,0x93,0xfe,0x93, +0x00,0x01,0x00,0x96,0x00,0x00,0x01,0xc5,0x02,0xda,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x01,0x1d,0x87,0x87,0xa8,0x87,0x87,0x01,0x6b,0x01,0x6f,0xfe,0x93,0xfe, +0x93,0x00,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x01,0xea,0x02,0xda,0x00,0x05,0x00,0x18,0x40,0x15,0x05,0x02,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x12,0x10,0x02,0x06,0x18,0x2b,0x21,0x23,0x13,0x03,0x33,0x13,0x01,0x65,0xfc,0x85,0x85,0xfc,0x85,0x01,0x6d,0x01,0x6d,0xfe,0x91,0x00,0x00,0x00, +0x00,0x01,0x00,0x93,0x00,0x00,0x01,0xc2,0x02,0xda,0x00,0x05,0x00,0x18,0x40,0x15,0x05,0x02,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x12,0x10,0x02,0x06,0x18,0x2b,0x21,0x23,0x13,0x03,0x33,0x13,0x01,0x3b,0xa8,0x87,0x87,0xa8,0x87,0x01,0x6d,0x01,0x6d,0xfe,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0xcd, +0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x15,0x23,0x11,0xcd,0xf5,0x9b,0x6e,0x03,0xac,0x50,0xfc,0xa4,0x00,0x00,0x00, +0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x11,0x33,0x15,0xcd,0x5a,0x9b,0x6e,0x03,0xac,0xfc,0xa4, +0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x87,0xff,0x92,0x01,0xea,0x03,0x48,0x00,0x26,0x00,0x5c,0x4b,0xb0,0x0e,0x50,0x58,0x40,0x20,0x05,0x01,0x04,0x03,0x01,0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x1b,0x40,0x21,0x05,0x01,0x04,0x03, +0x01,0x03,0x04,0x01,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x59,0x40,0x0d,0x00,0x00,0x00,0x26,0x00,0x26,0x2c,0x21,0x2b,0x23,0x06,0x06,0x1a,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33, +0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0xb9,0x54,0x46,0x45,0x52,0x22,0x14,0x79,0x36,0x24,0x41,0x37,0x87,0x87,0x5f,0x73,0x09,0x21,0x25,0x85,0x21,0x14,0x1e,0x1f,0x1c,0x24,0x02,0x9c,0x1b,0x42,0x4f,0x4e,0x41,0x2b,0x53,0x21,0xca,0x5a,0x6e,0x25,0x3c,0x45,0x50, +0x70,0x5f,0x10,0x43,0x61,0x3b,0xd6,0x35,0x49,0x13,0x1a,0x27,0x24,0x1d,0x1b,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06, +0x18,0x2b,0x05,0x11,0x23,0x35,0x33,0x11,0x01,0x31,0x9b,0xf5,0x6e,0x03,0x5c,0x50,0xfc,0x54,0x00,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05, +0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x35,0x33,0x11,0x33,0x11,0x96,0x9b,0x5a,0x6e,0x50,0x03,0x5c,0xfc,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x78,0xff,0x92,0x01,0xdb,0x03,0x48,0x00,0x26,0x00,0x54,0x4b,0xb0,0x0e,0x50,0x58,0x40,0x1f,0x00,0x00,0x01,0x03,0x01,0x00,0x72,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x69,0x00,0x03,0x02,0x02, +0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x1b,0x40,0x20,0x00,0x00,0x01,0x03,0x01,0x00,0x03,0x80,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x69,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x59,0xb7,0x2b,0x21,0x2c,0x23,0x10,0x05,0x06,0x1b,0x2b,0x01,0x23,0x35,0x34,0x26,0x23, +0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x01,0xa9,0x5a,0x23,0x1d,0x1f,0x1e,0x14,0x21,0x85,0x25,0x21,0x09,0x73,0x5f,0x87,0x87,0x37,0x41,0x24,0x36,0x79,0x14,0x22,0x52,0x45,0x46,0x54,0x02,0x9c,0x1b,0x1d, +0x24,0x27,0x1a,0x13,0x49,0x35,0xd6,0x3b,0x61,0x43,0x10,0x5f,0x70,0x50,0x45,0x3c,0x25,0x6e,0x5a,0xca,0x21,0x53,0x2b,0x41,0x4e,0x4f,0x42,0x00,0x00,0x02,0x00,0xa0,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x09,0x00,0x11,0x00,0x08,0xb5,0x0b,0x0a,0x09,0x00,0x02,0x32,0x2b,0x05,0x2e,0x02,0x35,0x35,0x34,0x36,0x36,0x37,0x03,0x11,0x06, +0x06,0x15,0x15,0x14,0x16,0x01,0xe5,0x62,0x93,0x50,0x50,0x93,0x62,0x55,0x46,0x50,0x50,0x78,0x10,0x6b,0xa5,0x66,0xb4,0x67,0xa4,0x6b,0x10,0xfc,0xb3,0x02,0xde,0x24,0x92,0x61,0xb4,0x5f,0x91,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0xff,0x88,0x01,0xb8,0x03,0x48,0x00,0x09,0x00,0x11,0x00,0x08,0xb5,0x11,0x0a,0x01,0x00,0x02,0x32,0x2b, +0x17,0x11,0x1e,0x02,0x15,0x15,0x14,0x06,0x06,0x27,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x73,0x63,0x92,0x50,0x50,0x92,0x0e,0x46,0x50,0x50,0x46,0x78,0x03,0xc0,0x10,0x6b,0xa4,0x67,0xb4,0x66,0xa5,0x6b,0x63,0x23,0x91,0x5f,0xb4,0x61,0x92,0x24,0x00,0x00,0x01,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b, +0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x8c,0x01,0x40,0x01,0x22,0x50,0x50,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x50,0x01,0x22,0x02,0x08, +0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x50,0x01,0xb8,0x01,0x22,0x50,0x50,0x00,0x00,0x01,0x00,0x00,0x01,0x22,0x02,0x58,0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b, +0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0x01,0x22,0x50,0x50,0x00,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x9c,0x02,0x1c, +0xff,0xe7,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x17,0x35,0x21,0x15,0x3c,0x01,0xe0,0x64,0x4b,0x4b,0x00,0x00,0x00,0x01,0x00,0xdc,0xff,0x60,0x01,0x86, +0x00,0x91,0x00,0x0f,0x00,0x35,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x3d,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x0f,0x00,0x0f,0x17,0x03,0x09,0x17,0x2b,0x17,0x37,0x36,0x36,0x35, +0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0xdc,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0xa0,0x7b,0x14,0x2a,0x0f,0x1d,0x39,0x13,0x14,0x38,0x1d,0x14,0x38,0x19,0x63,0x00,0x00,0xff,0xff,0x00,0x69,0xff,0x60,0x02,0x05,0x00,0x91,0x00,0x26,0x03,0x5d,0x8d,0x00,0x00,0x06,0x03,0x5d,0x7f,0x00,0x00,0x00, +0x00,0x02,0x00,0x69,0x01,0xa9,0x01,0xed,0x02,0xda,0x00,0x0f,0x00,0x1f,0x00,0x24,0x40,0x21,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x01,0x38,0x00,0x4e,0x10,0x10,0x00,0x00,0x10,0x1f,0x10,0x1f,0x18,0x17,0x00,0x0f,0x00,0x0f,0x17,0x06,0x09,0x17,0x2b,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35, +0x34,0x36,0x37,0x37,0x23,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0xed,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0x76,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0x02,0xda,0x7b,0x13,0x2b,0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0x7b,0x13,0x2b, +0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0x00,0xff,0xff,0x00,0x69,0x01,0xaf,0x01,0xef,0x02,0xe0,0x00,0x27,0x03,0x5d,0xff,0x8d,0x02,0x4f,0x01,0x07,0x03,0x5d,0x00,0x69,0x02,0x4f,0x00,0x12,0xb1,0x00,0x01,0xb8,0x02,0x4f,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x4f,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0xd2, +0x01,0xa9,0x01,0x7c,0x02,0xda,0x00,0x0f,0x00,0x19,0x40,0x16,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x38,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x17,0x03,0x09,0x17,0x2b,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0x7c,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d, +0x02,0xda,0x7b,0x13,0x2b,0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0xff,0xff,0x00,0xdc,0x01,0xa9,0x01,0x86,0x02,0xda,0x03,0x07,0x03,0x5d,0x00,0x00,0x02,0x49,0x00,0x09,0xb1,0x00,0x01,0xb8,0x02,0x49,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xd2,0x01,0xa9,0x01,0x7c,0x02,0xda,0x00,0x0f,0x00,0x13,0x40,0x10, +0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x00,0x4e,0x17,0x10,0x02,0x09,0x18,0x2b,0x01,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x7c,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0x01,0xa9,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x00,0x00,0x00, +0x00,0x02,0x00,0x69,0x01,0xa9,0x01,0xef,0x02,0xda,0x00,0x0f,0x00,0x1f,0x00,0x17,0x40,0x14,0x02,0x01,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x00,0x4e,0x17,0x17,0x17,0x10,0x04,0x09,0x1a,0x2b,0x01,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37, +0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0xef,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0xa4,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0x01,0xa9,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x7b,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x00,0x00,0x00, +0x00,0x02,0x00,0x1e,0x00,0x28,0x02,0x33,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x33,0x40,0x30,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x06, +0x09,0x17,0x2b,0x25,0x27,0x37,0x33,0x07,0x17,0x21,0x27,0x37,0x33,0x07,0x17,0x01,0xcc,0xc0,0xbf,0x68,0xc4,0xc4,0xfe,0xab,0xc0,0xbf,0x6a,0xc4,0xc4,0x28,0xf0,0xf0,0xee,0xf2,0xf0,0xf0,0xee,0xf2,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x28,0x02,0x3a,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x33,0x40,0x30,0x0a,0x07,0x04,0x01,0x04,0x01, +0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x25,0x37,0x27,0x33,0x17,0x07,0x21,0x37,0x27,0x33,0x17,0x07,0x01,0x12,0xc0,0xc1,0x69,0xc0,0xbf,0xfe,0xab, +0xc0,0xc1,0x67,0xc0,0xbf,0x28,0xf1,0xef,0xf0,0xf0,0xf1,0xef,0xf0,0xf0,0x00,0x00,0x00,0x01,0x00,0x93,0x00,0x28,0x01,0xc6,0x02,0x08,0x00,0x05,0x00,0x25,0x40,0x22,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03, +0x09,0x17,0x2b,0x25,0x27,0x37,0x33,0x07,0x17,0x01,0x5d,0xca,0xca,0x66,0xcc,0xcf,0x28,0xf0,0xf0,0xee,0xf2,0x00,0x00,0x00,0x00,0x01,0x00,0x93,0x00,0x28,0x01,0xc6,0x02,0x08,0x00,0x05,0x00,0x25,0x40,0x22,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f, +0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x09,0x17,0x2b,0x37,0x37,0x27,0x33,0x17,0x07,0x96,0xcc,0xcf,0x69,0xca,0xca,0x28,0xee,0xf2,0xf0,0xf0,0xff,0xff,0x00,0x14,0x01,0xa3,0x02,0x44,0x02,0xd5,0x00,0x27,0x03,0x2a,0xff,0x42,0x02,0x43,0x00,0x27,0x03,0x2a,0x00,0x09,0x02,0x43,0x01,0x07,0x03,0x2a,0x00,0xcf,0x02,0x43,0x00,0x1b, +0xb1,0x00,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0xb1,0x02,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8f,0x01,0xae,0x01,0xc9,0x02,0xda,0x00,0x26,0x03,0x6b,0x96,0x00,0x00,0x06,0x03,0x6b,0x6a,0x00,0x00,0x00,0x00,0x01,0x00,0xf9,0x01,0xae,0x01,0x5f,0x02,0xda,0x00,0x03, +0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x03,0x33,0x03,0x01,0x01,0x08,0x66,0x07,0x01,0xae,0x01,0x2c,0xfe,0xd4,0x00,0x00,0x00,0x02,0xfe,0x34,0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01, +0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x2d,0x01,0x9f,0xfc,0x68,0x01,0x9f,0x01,0x22,0x50,0x50,0x50,0x50,0x00,0x00,0x03,0xfb,0xdc, +0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11, +0x09,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x0f,0x01,0xbd,0xfa,0x10,0x01,0xbd,0x5f,0x01,0xb8,0x01,0x22,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x02,0xf9,0x4d,0xff,0x74,0x01,0xf4,0x03,0x20,0x00,0x29,0x00,0x50,0x00,0x84,0xb5,0x33,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58, +0x40,0x24,0x0b,0x05,0x02,0x02,0x0c,0x06,0x02,0x01,0x00,0x02,0x01,0x67,0x08,0x01,0x00,0x0f,0x0d,0x0e,0x03,0x07,0x00,0x07,0x65,0x09,0x01,0x03,0x03,0x04,0x61,0x0a,0x01,0x04,0x04,0x40,0x03,0x4e,0x1b,0x40,0x2b,0x0a,0x01,0x04,0x09,0x01,0x03,0x02,0x04,0x03,0x69,0x0b,0x05,0x02,0x02,0x0c,0x06,0x02,0x01,0x00,0x02,0x01,0x67,0x08, +0x01,0x00,0x07,0x07,0x00,0x59,0x08,0x01,0x00,0x00,0x07,0x61,0x0f,0x0d,0x0e,0x03,0x07,0x00,0x07,0x51,0x59,0x40,0x20,0x2a,0x2a,0x00,0x00,0x2a,0x50,0x2a,0x4f,0x49,0x47,0x46,0x44,0x3e,0x3c,0x3b,0x39,0x2d,0x2b,0x00,0x29,0x00,0x28,0x21,0x26,0x21,0x26,0x11,0x16,0x21,0x10,0x09,0x1d,0x2b,0x05,0x35,0x33,0x32,0x36,0x27,0x27,0x26, +0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x06,0x23,0x21,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15, +0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x06,0x23,0xfe,0x34,0x2d,0x2f,0x37,0x07,0x19,0x04,0x0c,0x0f,0xfa,0x8f,0x05,0x75,0x11,0x0f,0x05,0x19,0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x01,0xe5,0x2d,0x2f,0x37,0x07,0x19,0x09,0x3a,0x33,0x33,0x3a,0x09,0x19, +0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x8c,0x50,0x2b,0x2b,0xa4,0x1e,0x33,0x13,0x50,0x11,0x33,0x20,0xa4,0x2b,0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x34,0x4b,0x27,0x50,0x2b,0x2b,0xa4,0x39,0x4f,0x09,0x08,0x46,0x39,0xa4,0x2b, +0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x34,0x4b,0x27,0x00,0x00,0x01,0xfb,0xa6,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0c,0x00,0x2a,0x40,0x27,0x02,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x03,0x00,0x85,0x00,0x01,0x02,0x01,0x86,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x60,0x00,0x02,0x03,0x02,0x50, +0x11,0x13,0x12,0x10,0x04,0x09,0x1a,0x2b,0x13,0x33,0x13,0x03,0x23,0x37,0x36,0x37,0x21,0x35,0x21,0x26,0x27,0xbc,0x6a,0xe7,0xe8,0x69,0xbe,0x08,0x08,0xfa,0x1c,0x05,0xe4,0x0a,0x0a,0x02,0x71,0xfe,0xd9,0xfe,0xd9,0xef,0x0a,0x06,0x50,0x08,0x0c,0x00,0x00,0x01,0xfe,0x5c,0xff,0xab,0x01,0x59,0x02,0xee,0x00,0x07,0x00,0x47,0x4b,0xb0, +0x18,0x50,0x58,0x40,0x14,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x04,0x01,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x03,0x4e,0x1b,0x40,0x19,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11, +0x11,0x05,0x09,0x19,0x2b,0x17,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xff,0xfd,0x5d,0x02,0xa3,0x5a,0x55,0x01,0x77,0x50,0x01,0x7c,0xfc,0xbd,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0e,0x00,0x2a,0x40,0x27,0x02,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x03,0x00,0x85,0x00,0x01,0x02,0x01,0x86,0x00,0x03,0x02,0x02, +0x03,0x57,0x00,0x03,0x03,0x02,0x60,0x00,0x02,0x03,0x02,0x50,0x11,0x23,0x12,0x10,0x04,0x09,0x1a,0x2b,0x13,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0xbc,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfc,0x76,0x03,0x8a,0x04,0x08,0x05,0x02,0x71,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0x50,0x05,0x0a, +0x05,0x00,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0e,0x00,0x1a,0x00,0x3c,0x40,0x39,0x19,0x13,0x0d,0x03,0x00,0x01,0x01,0x4c,0x04,0x01,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x68,0x04,0x01,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x0f,0x0f,0x00,0x00,0x0f, +0x1a,0x0f,0x1a,0x18,0x17,0x00,0x0e,0x00,0x0e,0x14,0x11,0x23,0x08,0x09,0x19,0x2b,0x27,0x37,0x36,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x33,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x70,0xbe,0x03,0x07,0x03,0xfb,0x4a,0x04,0xb6,0x04,0x08,0x05,0xba,0x6a,0xe7,0xe8,0xc3,0xbe,0x13,0x1a,0x05, +0x05,0x1c,0x15,0xba,0x6a,0xe7,0xe8,0x23,0xef,0x04,0x08,0x04,0x50,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0a,0x00,0x2e,0x40,0x2b,0x08,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x03,0x02,0x57, +0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x0a,0x00,0x0a,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x25,0x27,0x21,0x35,0x21,0x37,0x33,0x07,0x07,0x17,0x17,0x01,0x8a,0xc8,0xfd,0x3b,0x02,0xc5,0xc9,0x69,0xbe,0x2e,0x32,0xba,0x23,0xff,0x50,0xff,0xef,0x37,0x3d,0xeb, +0x00,0x02,0xfb,0xa5,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0a,0x00,0x12,0x00,0x3c,0x40,0x39,0x10,0x0c,0x08,0x03,0x00,0x01,0x01,0x4c,0x04,0x01,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x0b,0x0b,0x00,0x00,0x0b,0x12,0x0b,0x12,0x0e, +0x0d,0x00,0x0a,0x00,0x0a,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x37,0x27,0x21,0x35,0x21,0x37,0x33,0x07,0x07,0x17,0x17,0x33,0x03,0x13,0x33,0x07,0x07,0x17,0x17,0x5e,0xc8,0xfc,0x0f,0x03,0xf1,0xc9,0x69,0xbe,0x2e,0x32,0xba,0xc2,0xe7,0xe8,0x69,0xbe,0x2e,0x32,0xba,0x23,0xff,0x50,0xff,0xef,0x37,0x3d,0xeb,0x01,0x27,0x01,0x27,0xef, +0x37,0x3d,0xeb,0x00,0x00,0x01,0xfe,0x11,0x00,0xdc,0x01,0xef,0x01,0xb8,0x00,0x1d,0x00,0x6e,0x4b,0xb0,0x11,0x50,0x58,0x40,0x22,0x00,0x04,0x00,0x06,0x03,0x04,0x06,0x69,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x03,0x03,0x00,0x61,0x05,0x07,0x02,0x00,0x03,0x00,0x51,0x1b,0x40,0x29,0x00,0x05, +0x01,0x00,0x01,0x05,0x00,0x80,0x00,0x04,0x00,0x06,0x03,0x04,0x06,0x69,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x59,0x40,0x15,0x01,0x00,0x19,0x17,0x14,0x13,0x10,0x0e,0x0a,0x08,0x05,0x04,0x03,0x02,0x00,0x1d,0x01,0x1d,0x08,0x09,0x16,0x2b, +0x37,0x22,0x27,0x21,0x35,0x21,0x15,0x14,0x16,0x33,0x32,0x3e,0x03,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x03,0x64,0x62,0x27,0xfe,0x36,0x02,0x0d,0x27,0x1f,0x1a,0x27,0x23,0x29,0x39,0x2a,0x46,0x55,0x55,0x26,0x20,0x1b,0x27,0x24,0x29,0x38,0xdc,0x46,0x50,0x05,0x22,0x24,0x1d,0x2b,0x2c,0x1d,0x50,0x41,0x3c, +0x3c,0x20,0x26,0x1d,0x2b,0x2c,0x1d,0x00,0xff,0xff,0xfe,0x0c,0xff,0x92,0x01,0xcc,0x03,0x3e,0x00,0x27,0x03,0x45,0xfd,0xc1,0x00,0x00,0x00,0x06,0x03,0x45,0xd3,0x00,0x00,0x03,0xf9,0x7f,0xff,0x74,0x02,0x03,0x03,0x20,0x00,0x24,0x00,0x4a,0x00,0x4f,0x00,0x8d,0xb7,0x4e,0x4d,0x1b,0x03,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58, +0x40,0x24,0x0b,0x08,0x02,0x02,0x0c,0x07,0x02,0x01,0x05,0x02,0x01,0x67,0x0d,0x01,0x05,0x0f,0x06,0x0e,0x03,0x00,0x05,0x00,0x65,0x0a,0x01,0x04,0x04,0x03,0x61,0x09,0x01,0x03,0x03,0x40,0x04,0x4e,0x1b,0x40,0x2b,0x09,0x01,0x03,0x0a,0x01,0x04,0x02,0x03,0x04,0x69,0x0b,0x08,0x02,0x02,0x0c,0x07,0x02,0x01,0x05,0x02,0x01,0x67,0x0d, +0x01,0x05,0x00,0x00,0x05,0x59,0x0d,0x01,0x05,0x05,0x00,0x61,0x0f,0x06,0x0e,0x03,0x00,0x05,0x00,0x51,0x59,0x40,0x27,0x26,0x25,0x01,0x00,0x49,0x47,0x42,0x41,0x40,0x3f,0x3a,0x38,0x37,0x35,0x30,0x2e,0x2d,0x2b,0x25,0x4a,0x26,0x4a,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x10,0x09,0x16,0x2b,0x05, +0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x21,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x07,0x21, +0x15,0x21,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0x16,0x17,0x35,0x06,0xfb,0x00,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x05,0x42,0x4b,0x4b,0x42,0x05,0x0f,0x04,0x34,0x2f,0x2d,0x01,0xe8,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05, +0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x06,0x27,0x05,0x5f,0xfa,0xa3,0x25,0x06,0x0f,0x04,0x34,0x2f,0x2d,0xfe,0xfb,0x17,0x14,0x14,0x8c,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x3b,0x47,0x07,0x07,0x4e,0x3a,0xa4,0x2b,0x2b,0x50,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f, +0x57,0x50,0x2b,0x2b,0xa4,0x41,0x23,0x50,0x25,0x3f,0xa4,0x2b,0x2b,0x50,0x01,0xd9,0x02,0x06,0x0f,0x05,0x00,0x05,0xf9,0x7f,0xff,0x74,0x02,0x03,0x03,0x20,0x00,0x25,0x00,0x29,0x00,0x2d,0x00,0x32,0x00,0x40,0x00,0xaf,0xb6,0x30,0x2e,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x36,0x0a,0x05,0x02,0x02,0x10,0x0b,0x06, +0x03,0x01,0x09,0x02,0x01,0x67,0x00,0x07,0x0e,0x01,0x00,0x07,0x00,0x65,0x00,0x04,0x04,0x03,0x61,0x00,0x03,0x03,0x40,0x4d,0x0f,0x01,0x09,0x09,0x08,0x5f,0x00,0x08,0x08,0x38,0x4d,0x00,0x0d,0x0d,0x0c,0x61,0x11,0x01,0x0c,0x0c,0x42,0x0c,0x4e,0x1b,0x40,0x34,0x00,0x03,0x00,0x04,0x02,0x03,0x04,0x69,0x0a,0x05,0x02,0x02,0x10,0x0b, +0x06,0x03,0x01,0x09,0x02,0x01,0x67,0x00,0x07,0x0e,0x01,0x00,0x07,0x00,0x65,0x0f,0x01,0x09,0x09,0x08,0x5f,0x00,0x08,0x08,0x38,0x4d,0x00,0x0d,0x0d,0x0c,0x61,0x11,0x01,0x0c,0x0c,0x42,0x0c,0x4e,0x59,0x40,0x2f,0x34,0x33,0x2a,0x2a,0x26,0x26,0x01,0x00,0x3b,0x38,0x33,0x40,0x34,0x3f,0x2a,0x2d,0x2a,0x2d,0x2c,0x2b,0x26,0x29,0x26, +0x29,0x28,0x27,0x24,0x22,0x1d,0x1c,0x1b,0x1a,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x25,0x01,0x25,0x12,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x07,0x21,0x15,0x21,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01, +0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x25,0x16,0x17,0x35,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfb,0x00,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x06,0x27,0x01,0x25,0xfe,0xdd,0x25,0x06,0x0f,0x04,0x34,0x2f,0x2d,0x01, +0x28,0x0c,0x6a,0x0c,0x9d,0x04,0xbf,0xf8,0x25,0x0e,0x0c,0x0c,0x02,0x39,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0x8c,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x41,0x23,0x50,0x25,0x3f,0xa4,0x2b,0x2b,0x50,0x01,0x63,0x02,0x03,0xfd,0xfd,0x4b,0x50,0x50,0x2b,0x01,0x03,0x08,0x02,0xfe,0xac, +0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0xff,0xff,0xfc,0x09,0xff,0x92,0x01,0x40,0x03,0x3e,0x00,0x27,0x03,0x45,0xfb,0xbe,0x00,0x00,0x00,0x27,0x03,0x2e,0xfd,0xf3,0x00,0x00,0x00,0x06,0x03,0x2e,0xc9,0x00,0x00,0x02,0xfe,0x43,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x24,0x00,0x28,0x00,0x48,0x40,0x45,0x1b,0x01,0x01,0x02,0x01,0x4c, +0x06,0x01,0x03,0x00,0x04,0x02,0x03,0x04,0x67,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x09,0x07,0x08,0x03,0x00,0x05,0x00,0x4f,0x25,0x25,0x01,0x00,0x25,0x28,0x25,0x28,0x27,0x26,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x0a,0x09,0x16,0x2b, +0x07,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x33,0x11,0x33,0x11,0x3c,0x58,0x65,0x04,0x0a,0x03,0x26,0x41,0x6e,0x6e,0x41,0x26,0x03,0x0a,0x04,0x65,0x58,0x73,0x73,0x2f,0x32,0x02,0x0a, +0x03,0x35,0x32,0x31,0x36,0x03,0x0a,0x02,0x32,0x2f,0x73,0xb4,0x5a,0x6e,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x39,0x4a,0x09,0x09,0x4a,0x39,0xa4,0x2b,0x2b,0x50,0x03,0xac,0xfc,0x54,0x00,0xff,0xff,0xfe,0x34,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x27,0x03,0x46,0xfd,0xd5,0x00,0x00,0x00,0x06, +0x03,0x46,0xe7,0x00,0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07, +0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x05,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x33,0x11,0x33,0x11,0xfe,0xbb,0x01,0x81,0xfe,0xd9,0x01,0x27,0xaf,0x5a,0x6e,0x03,0xac,0x50,0xfc,0xf4,0x50,0x03,0xac,0xfc,0x54,0xff,0xff,0xfe,0x8e,0xff,0x92,0x01,0x9f,0x03,0x3e,0x00,0x27,0x03,0x47,0xfd,0xc1,0x00,0x00,0x01,0x06,0x04,0x1c,0x9c,0x0f, +0x00,0x08,0xb1,0x01,0x01,0xb0,0x0f,0xb0,0x35,0x2b,0x00,0x00,0x00,0x03,0xfe,0x3e,0xff,0x92,0x02,0x35,0x03,0x3e,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x5e,0x40,0x5b,0x00,0x04,0x00,0x03,0x06,0x04,0x03,0x67,0x09,0x07,0x02,0x05,0x13,0x10,0x02,0x0a,0x0b,0x05,0x0a,0x68,0x12,0x11,0x02,0x0b,0x0e,0x0c,0x02,0x00,0x0d,0x0b,0x00,0x67, +0x00,0x02,0x00,0x01,0x02,0x01,0x63,0x08,0x01,0x06,0x06,0x38,0x4d,0x14,0x0f,0x02,0x0d,0x0d,0x39,0x0d,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x15,0x09,0x1f,0x2b,0x33,0x37,0x21,0x11, +0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x21,0x15,0x21,0x33,0x33,0x37,0x23,0x53,0x27,0xfe,0xb9,0xf5,0x9b,0x9b,0xf5,0x01,0x7f,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x0e, +0xfe,0x8c,0x01,0x52,0x46,0xa0,0x22,0xa0,0xd2,0xfe,0xc0,0x50,0x03,0x0c,0x50,0xfe,0xca,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0xc7,0xb4,0xb4,0x00,0xff,0xff,0xfe,0xd4,0xff,0xf6,0x01,0x2e,0x00,0x98,0x00,0x27,0x03,0x29,0xfd,0xfa,0x00,0x00,0x00,0x06,0x03,0x29,0xb0,0x00,0xff,0xff,0xfc,0x90,0xff,0xf6,0x01,0x1a, +0x00,0x98,0x00,0x27,0x03,0x29,0xfb,0xb6,0x00,0x00,0x00,0x27,0x03,0x29,0xfd,0xa9,0x00,0x00,0x00,0x06,0x03,0x29,0x9c,0x00,0xff,0xff,0xfc,0x71,0xff,0xf6,0x01,0x45,0x02,0x53,0x00,0x27,0x04,0x1c,0xff,0x42,0x00,0x00,0x00,0x27,0x03,0x29,0xfb,0x97,0x00,0x00,0x00,0x07,0x03,0x29,0xfd,0x4d,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0x82, +0xff,0xf6,0x01,0x81,0x02,0xda,0x00,0x27,0x03,0x29,0xfd,0xa8,0x00,0x00,0x00,0x06,0x03,0x30,0x9c,0x00,0xff,0xff,0xfe,0x5c,0x00,0xaa,0x02,0x03,0x01,0xea,0x00,0x27,0x03,0x33,0xfd,0xa8,0xff,0xdd,0x03,0x06,0x04,0x19,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0xdd,0xb0,0x35,0x2b,0x00,0xff,0xff,0xfe,0xd1,0xff,0xf6,0x01,0x2f, +0x02,0x30,0x00,0x27,0x03,0x2b,0xfd,0xf8,0x00,0x00,0x00,0x06,0x03,0x2b,0xb0,0x00,0xff,0xff,0xfc,0xc9,0xff,0xf6,0x00,0xdf,0x02,0x30,0x00,0x27,0x03,0x2b,0xfb,0xf0,0x00,0x00,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x00,0x00,0x07,0x03,0x2b,0xff,0x60,0x00,0x00,0x00,0x00,0xff,0xff,0xfc,0x44,0x00,0x2d,0x01,0x81,0x02,0x67,0x00,0x27, +0x03,0x2b,0xfb,0x6b,0x00,0x37,0x00,0x27,0x03,0x2b,0xfd,0x2f,0x00,0x37,0x01,0x07,0x04,0x19,0xff,0x7e,0x00,0x00,0x00,0x10,0xb1,0x00,0x02,0xb0,0x37,0xb0,0x35,0x2b,0xb1,0x02,0x02,0xb0,0x37,0xb0,0x35,0x2b,0xff,0xff,0xfe,0xb3,0xff,0xf6,0x01,0x81,0x02,0xda,0x00,0x26,0x03,0x30,0x9c,0x00,0x00,0x07,0x03,0x2b,0xfd,0xda,0x00,0x00, +0x00,0x05,0xfc,0x2c,0xff,0xf6,0x01,0xae,0x02,0xda,0x00,0x14,0x00,0x21,0x00,0x2f,0x00,0x3d,0x00,0x4b,0x01,0x3b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x1f,0x01,0x06,0x01,0x1e,0x01,0x05,0x06,0x20,0x1a,0x02,0x03,0x00,0x21,0x01,0x04,0x03,0x16,0x01,0x08,0x04,0x15,0x01,0x07,0x0a,0x06,0x4c,0x1b,0x40,0x1b,0x1f,0x01,0x06,0x01,0x1e, +0x01,0x05,0x06,0x20,0x1a,0x02,0x03,0x00,0x21,0x01,0x04,0x03,0x16,0x01,0x08,0x04,0x15,0x01,0x09,0x0a,0x06,0x4c,0x59,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x40,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06, +0x06,0x41,0x4d,0x00,0x08,0x08,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x4d,0x00,0x0a,0x0a,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x41,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38, +0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06,0x06,0x41,0x4d,0x00,0x08,0x08,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x4d,0x00,0x0a,0x0a,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x40,0x3d,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f, +0x00,0x02,0x02,0x38,0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06,0x06,0x41,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x4d,0x00,0x08,0x08,0x07,0x61,0x0d,0x01,0x07,0x07,0x3f,0x07,0x4e,0x59,0x59,0x40,0x25,0x3f,0x3e,0x31,0x30,0x23,0x22,0x00,0x00,0x46,0x43,0x3e,0x4b,0x3f,0x4a,0x38,0x35,0x30,0x3d,0x31,0x3c,0x2a, +0x27,0x22,0x2f,0x23,0x2e,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x0f,0x09,0x1a,0x2b,0x25,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06, +0x23,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0x09,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x01,0x9d,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfa,0xc9,0x21,0x2a,0x2b,0x20, +0x14,0x20,0x2b,0x2a,0x21,0x14,0x21,0x2a,0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x01,0x9b,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0x96,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0xd7,0x64,0x82,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfe, +0x5c,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0x05,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x00,0x04,0xfe,0x52,0x00,0x64,0x01,0xd6,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x7b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x02,0x00,0x00,0x02,0x57,0x0b,0x01,0x07,0x04,0x05,0x07,0x57,0x06,0x01,0x05,0x0a, +0x01,0x04,0x05,0x04,0x65,0x09,0x03,0x08,0x03,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01,0x4e,0x1b,0x40,0x26,0x00,0x02,0x09,0x01,0x03,0x00,0x02,0x03,0x67,0x00,0x06,0x0b,0x01,0x07,0x04,0x06,0x07,0x67,0x00,0x05,0x0a,0x01,0x04,0x05,0x04,0x65,0x08,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x23,0x1c, +0x1c,0x11,0x10,0x0c,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37, +0x35,0x21,0x15,0xfe,0xa2,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xea,0x02,0x26,0xfc,0xcc,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xea,0x02,0x26,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0x50,0xfe,0xca,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x46,0x50,0x50,0x00,0x00,0x00,0xff,0xff,0xfe,0x81,0x00,0x2d,0x01,0x9f, +0x02,0x67,0x00,0x26,0x04,0x1b,0x9c,0x00,0x01,0x07,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfe,0x81,0x00,0x2d,0x01,0x77,0x02,0x67,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x01,0x07,0x04,0x1c,0xff,0x74,0x00,0x00,0x00,0x08,0xb1,0x00,0x02,0xb0,0x37,0xb0,0x35,0x2b, +0xff,0xff,0xfe,0xc5,0xff,0x60,0x01,0x31,0x02,0x30,0x00,0x27,0x03,0x2c,0xfd,0xf8,0x00,0x00,0x00,0x06,0x03,0x2c,0xb0,0x00,0xff,0xff,0xfc,0xbd,0xff,0x60,0x00,0xe1,0x02,0x30,0x00,0x27,0x03,0x2c,0xfd,0xa8,0x00,0x00,0x00,0x27,0x03,0x2c,0xff,0x60,0x00,0x00,0x00,0x07,0x03,0x2c,0xfb,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0xc5, +0xff,0xfb,0x01,0x3b,0x02,0xda,0x00,0x27,0x03,0x2e,0xfd,0xe4,0x00,0x00,0x00,0x06,0x03,0x2e,0xc4,0x00,0xff,0xff,0xfc,0x68,0xff,0x92,0x01,0x9f,0x03,0x3e,0x00,0x27,0x03,0x2e,0xfb,0x87,0x00,0x00,0x00,0x27,0x03,0x2e,0xfd,0x5d,0x00,0x00,0x00,0x06,0x03,0x46,0x92,0x00,0x00,0x01,0xfd,0xf8,0x00,0x00,0x02,0x08,0x02,0x99,0x00,0x13, +0x00,0x35,0x40,0x32,0x00,0x04,0x03,0x04,0x85,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x68,0x07,0x01,0x01,0x08,0x01,0x00,0x09,0x01,0x00,0x67,0x0a,0x01,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x23,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21, +0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x98,0x3e,0xfe,0x52,0x01,0xcc,0x3a,0xfd,0xfa,0x02,0x24,0x40,0x46,0x40,0x01,0xa6,0xfe,0x3c,0x3a,0x01,0xfe,0xfd,0xe4,0x3e,0xaa,0x50,0xa0,0x50,0xaf,0xaf,0x50,0xa0,0x50,0xaa,0x00,0x00,0x00,0x00,0x01,0xfb,0xa5,0xff,0x92,0x02,0x03,0x03,0x3e,0x00,0x1b,0x00,0x4f,0x40,0x4c, +0x00,0x06,0x05,0x06,0x85,0x0e,0x01,0x0d,0x00,0x0d,0x86,0x07,0x01,0x05,0x08,0x01,0x04,0x03,0x05,0x04,0x68,0x09,0x01,0x03,0x0a,0x01,0x02,0x01,0x03,0x02,0x67,0x0b,0x01,0x01,0x00,0x00,0x01,0x57,0x0b,0x01,0x01,0x01,0x00,0x5f,0x0c,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x09,0x1f,0x2b,0x05,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0xfe,0x1f,0x44,0xfd,0x42,0x02,0xda,0x34,0xfc,0xf2,0x03,0x29,0x34,0xfc,0xa3,0x03,0x79,0x5a,0x46,0x5a,0x02,0x9f,0xfd, +0x45,0x34,0x02,0xef,0xfc,0xf6,0x34,0x03,0x3e,0xfc,0xa6,0x44,0x6e,0xba,0x4c,0x8c,0x4c,0x8c,0x4c,0xf6,0xf6,0x4c,0x8c,0x4c,0x8c,0x4c,0xba,0x00,0xff,0xff,0xfe,0x90,0xff,0xf6,0x01,0x2d,0x02,0xda,0x00,0x27,0x03,0x30,0xfe,0x0e,0x00,0x00,0x00,0x06,0x03,0x29,0xaf,0x00,0xff,0xff,0xfe,0x90,0xff,0xf6,0x01,0x4d,0x02,0xda,0x00,0x27, +0x03,0x30,0xfe,0x0e,0x00,0x00,0x00,0x06,0x03,0x2b,0xce,0x00,0xff,0xff,0xfe,0x5c,0xff,0xfb,0x01,0xb8,0x02,0xda,0x00,0x27,0x03,0x30,0xfd,0xda,0x00,0x00,0x00,0x06,0x03,0x30,0xd3,0x00,0xff,0xff,0xfb,0xfa,0xff,0xfb,0x01,0xbd,0x02,0xda,0x00,0x27,0x03,0x30,0xfb,0x78,0x00,0x00,0x00,0x27,0x03,0x30,0xfd,0xa8,0x00,0x00,0x00,0x06, +0x03,0x30,0xd8,0x00,0x00,0x04,0xfe,0x52,0xff,0xfb,0x01,0xcc,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x1e,0x00,0x2c,0x00,0xa5,0xb5,0x1a,0x01,0x04,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x32,0x00,0x05,0x0c,0x01,0x06,0x00,0x05,0x06,0x67,0x00,0x00,0x00,0x03,0x07,0x00,0x03,0x69,0x00,0x07,0x0d,0x08,0x0b,0x03,0x04,0x0a,0x07, +0x04,0x67,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x09,0x4e,0x1b,0x40,0x39,0x0b,0x01,0x04,0x07,0x08,0x07,0x04,0x08,0x80,0x00,0x05,0x0c,0x01,0x06,0x00,0x05,0x06,0x67,0x00,0x00,0x00,0x03,0x07,0x00,0x03,0x69,0x00,0x07,0x0d,0x01,0x08,0x0a,0x07,0x08,0x67,0x00,0x01, +0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x09,0x4e,0x59,0x40,0x25,0x20,0x1f,0x19,0x19,0x15,0x15,0x00,0x00,0x27,0x24,0x1f,0x2c,0x20,0x2b,0x19,0x1e,0x19,0x1e,0x1d,0x1c,0x15,0x18,0x15,0x18,0x17,0x16,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x0f,0x09,0x1a,0x2b,0x25,0x35,0x33, +0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x25,0x35,0x21,0x15,0x05,0x35,0x36,0x37,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0x9e,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x01,0x1c,0x01,0xb8,0xfd,0xa8,0x27, +0x09,0x02,0x28,0xfc,0xef,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0xe6,0x50,0x50,0xf0,0x24,0x13,0x19,0x50,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0xff,0xff,0xfb,0x9c,0x00,0x67,0x02,0x0c,0x03,0x0c,0x00,0x27,0x03,0x34,0xfb,0x78, +0x00,0x00,0x00,0x27,0x03,0x34,0xfd,0xa8,0x00,0xa0,0x01,0x06,0x03,0x34,0xd8,0x00,0x00,0x08,0xb1,0x01,0x01,0xb0,0xa0,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfd,0xe5,0x00,0x41,0x02,0x12,0x02,0x6c,0x00,0x26,0x04,0x1b,0x0f,0x00,0x00,0x07,0x03,0x34,0xfd,0xc1,0x00,0x00,0xff,0xff,0xfd,0xcc,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x27, +0x03,0x34,0xfd,0xa8,0xff,0xb0,0x03,0x06,0x03,0x3d,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0xb0,0xb0,0x35,0x2b,0x00,0x00,0x03,0xfd,0xcb,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x27,0x00,0x2d,0x00,0x31,0x00,0x4c,0x40,0x49,0x1e,0x1d,0x02,0x08,0x4a,0x27,0x00,0x02,0x01,0x49,0x0b,0x09,0x02,0x07,0x0f,0x0d,0x02,0x06,0x05,0x07, +0x06,0x68,0x0e,0x0c,0x02,0x05,0x04,0x02,0x02,0x00,0x01,0x05,0x00,0x67,0x0a,0x01,0x08,0x08,0x38,0x4d,0x03,0x01,0x01,0x01,0x39,0x01,0x4e,0x31,0x30,0x2f,0x2e,0x2d,0x2a,0x29,0x28,0x1a,0x19,0x18,0x17,0x16,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x10,0x09,0x1f,0x2b,0x05,0x26,0x26,0x27,0x21,0x07,0x23,0x37,0x23,0x07, +0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x36,0x36,0x37,0x15,0x0e,0x02,0x15,0x15,0x14,0x16,0x16,0x17,0x01,0x21,0x35,0x34,0x35,0x21,0x05,0x33,0x37,0x23,0x01,0xe5,0x81,0x99,0x0f,0xfe,0x92,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46, +0x27,0x01,0x38,0x10,0x99,0x7e,0x40,0x5f,0x33,0x33,0x5f,0x40,0xfd,0x74,0x01,0x60,0xfe,0xc2,0xfe,0xf8,0xa0,0x22,0xa0,0x78,0x1d,0xac,0x81,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x7d,0xa7,0x1c,0x57,0x0f,0x54,0x7d,0x4f,0xb4,0x4e,0x7e,0x54,0x0f,0x01,0x34,0xaf,0x03,0x02,0xb4,0xb4,0x00,0x00,0x00,0x03,0xfd,0xcb, +0xff,0x92,0x02,0x03,0x03,0x3e,0x00,0x33,0x00,0x3f,0x00,0x43,0x00,0xd3,0xb5,0x26,0x01,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x44,0x00,0x0f,0x13,0x12,0x07,0x0f,0x72,0x00,0x0d,0x00,0x0e,0x09,0x0d,0x0e,0x69,0x0c,0x0a,0x02,0x08,0x16,0x14,0x02,0x07,0x13,0x08,0x07,0x68,0x00,0x13,0x00,0x12,0x06,0x13,0x12,0x67,0x15, +0x11,0x02,0x06,0x05,0x03,0x02,0x01,0x02,0x06,0x01,0x67,0x00,0x10,0x17,0x01,0x00,0x10,0x00,0x65,0x0b,0x01,0x09,0x09,0x38,0x4d,0x04,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x45,0x00,0x0f,0x13,0x12,0x13,0x0f,0x12,0x80,0x00,0x0d,0x00,0x0e,0x09,0x0d,0x0e,0x69,0x0c,0x0a,0x02,0x08,0x16,0x14,0x02,0x07,0x13,0x08,0x07,0x68,0x00, +0x13,0x00,0x12,0x06,0x13,0x12,0x67,0x15,0x11,0x02,0x06,0x05,0x03,0x02,0x01,0x02,0x06,0x01,0x67,0x00,0x10,0x17,0x01,0x00,0x10,0x00,0x65,0x0b,0x01,0x09,0x09,0x38,0x4d,0x04,0x01,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x35,0x01,0x00,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3c,0x3a,0x39,0x37,0x35,0x34,0x32,0x30,0x29,0x28,0x23,0x21,0x20, +0x1e,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x33,0x01,0x33,0x18,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x27,0x26,0x36, +0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x15,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0x21,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x37,0x21,0x05,0x33,0x37,0x23,0x01,0xd6,0x58,0x65,0x04,0x09,0xfe,0x28,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27, +0x01,0xa0,0x09,0x05,0x66,0x58,0x2d,0x2d,0x2f,0x33,0x03,0x0a,0x04,0x3c,0x3b,0x3c,0x3a,0x03,0x0a,0x02,0x32,0x2f,0x2d,0xfd,0x56,0x01,0xcb,0x06,0x2c,0x2f,0x4b,0x4b,0x2e,0x2d,0x06,0xfe,0x57,0xfe,0xf8,0xa0,0x22,0xa0,0x6e,0x57,0x4f,0x9a,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x90,0x4f,0x57,0x50,0x2b,0x2b,0x9f, +0x37,0x4f,0x02,0x05,0x02,0x52,0x37,0xa9,0x2b,0x2b,0x50,0x01,0x81,0x1a,0x18,0x50,0x18,0x1a,0xb4,0xb4,0x00,0x03,0xfd,0xcb,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x5e,0x40,0x5b,0x00,0x0c,0x00,0x0d,0x08,0x0c,0x0d,0x67,0x0b,0x09,0x02,0x07,0x13,0x11,0x02,0x06,0x05,0x07,0x06,0x68,0x12,0x10,0x02,0x05, +0x04,0x02,0x02,0x00,0x01,0x05,0x00,0x67,0x00,0x0e,0x14,0x01,0x0f,0x0e,0x0f,0x63,0x0a,0x01,0x08,0x08,0x38,0x4d,0x03,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +0x15,0x09,0x1f,0x2b,0x17,0x11,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x01,0x21,0x35,0x21,0x05,0x33,0x37,0x23,0xcd,0xfe,0x81,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27, +0x46,0x27,0x01,0x47,0xf5,0x9b,0x9b,0xfd,0x97,0x01,0x74,0xfe,0xae,0xfe,0xf8,0xa0,0x22,0xa0,0x6e,0x01,0x40,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x01,0x36,0x50,0xfc,0xf4,0x50,0x01,0x81,0xb4,0xb4,0xb4,0x00,0x00,0x04,0xfd,0xcb,0x00,0x00,0x01,0x7c,0x02,0xda,0x00,0x1b,0x00,0x27,0x00,0x2b,0x00,0x37,0x00,0xab, +0x4b,0xb0,0x11,0x50,0x58,0x40,0x37,0x07,0x05,0x02,0x03,0x11,0x08,0x02,0x02,0x0e,0x03,0x02,0x68,0x00,0x0f,0x15,0x01,0x0e,0x01,0x0f,0x0e,0x69,0x0c,0x0a,0x02,0x00,0x12,0x01,0x00,0x57,0x13,0x10,0x09,0x03,0x01,0x16,0x01,0x12,0x0b,0x01,0x12,0x69,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x40, +0x38,0x07,0x05,0x02,0x03,0x11,0x08,0x02,0x02,0x0e,0x03,0x02,0x68,0x00,0x0f,0x15,0x01,0x0e,0x13,0x0f,0x0e,0x69,0x10,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x12,0x01,0x00,0x67,0x00,0x13,0x16,0x01,0x12,0x0b,0x13,0x12,0x69,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x59,0x40,0x2e,0x2d,0x2c,0x1d,0x1c, +0x00,0x00,0x33,0x31,0x2c,0x37,0x2d,0x37,0x2b,0x2a,0x29,0x28,0x23,0x21,0x1c,0x27,0x1d,0x27,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33, +0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x33,0x37,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x02,0xeb,0x24,0x2c, +0x2c,0x24,0x24,0x2c,0x2c,0xfd,0x23,0xa0,0x22,0xa0,0x02,0x97,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0xae,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x9b,0xb4,0xfe,0xbb,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x00,0x00,0x04,0xfd,0xcb,0xff,0xfb,0x01,0x8b, +0x02,0xda,0x00,0x03,0x00,0x1f,0x00,0x23,0x00,0x31,0x00,0xaf,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x30,0x09,0x07,0x02,0x05,0x11,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x10,0x0b,0x02,0x03,0x0e,0x0c,0x02,0x14,0x04,0x01,0x13,0x03,0x01,0x67,0x08,0x06,0x02,0x00,0x00,0x38,0x4d,0x00,0x13,0x13,0x0d,0x5f,0x16,0x12,0x15,0x0f,0x04,0x0d,0x0d, +0x39,0x0d,0x4e,0x1b,0x40,0x3b,0x14,0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x09,0x07,0x02,0x05,0x11,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x10,0x0b,0x02,0x03,0x0e,0x0c,0x02,0x02,0x13,0x03,0x02,0x67,0x08,0x06,0x02,0x00,0x00,0x38,0x4d,0x15,0x0f,0x02,0x0d,0x0d,0x39,0x4d,0x00,0x13,0x13,0x12,0x61,0x16,0x01,0x12,0x12,0x42,0x12, +0x4e,0x59,0x40,0x36,0x25,0x24,0x04,0x04,0x00,0x00,0x2c,0x29,0x24,0x31,0x25,0x30,0x23,0x22,0x21,0x20,0x04,0x1f,0x04,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x17,0x09,0x17,0x2b,0x37,0x13,0x33,0x03,0x05, +0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x01,0x22,0x26,0x37,0x36,0x36,0x33,0x33,0x32,0x16,0x07,0x06,0x06,0x23,0xc9,0x58,0x6a,0x70,0xfc,0xe0,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27, +0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0x02,0x23,0x1a,0x1b,0x05,0x05,0x28,0x1a,0x1e,0x1d,0x19,0x05,0x05,0x29,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xd7,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xfe,0x34,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00, +0x00,0x03,0xfd,0xcb,0xff,0xfb,0x02,0x08,0x02,0xe4,0x00,0x34,0x00,0x38,0x00,0x46,0x01,0x0e,0x4b,0xb0,0x18,0x50,0x58,0x40,0x3c,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01,0x11,0x0f,0x0a,0x03,0x00,0x16,0x01,0x00,0x67,0x00,0x0c,0x0c,0x04,0x5f,0x08, +0x06,0x02,0x04,0x04,0x38,0x4d,0x00,0x16,0x16,0x10,0x5f,0x18,0x15,0x17,0x12,0x04,0x10,0x10,0x39,0x10,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x40,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01,0x11,0x0f,0x0a,0x03,0x00,0x16,0x01,0x00,0x67,0x06,0x01, +0x04,0x04,0x38,0x4d,0x00,0x0c,0x0c,0x08,0x61,0x00,0x08,0x08,0x3e,0x4d,0x00,0x16,0x16,0x10,0x5f,0x18,0x15,0x17,0x12,0x04,0x10,0x10,0x39,0x10,0x4e,0x1b,0x40,0x4b,0x00,0x0a,0x00,0x16,0x00,0x0a,0x16,0x80,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01, +0x11,0x0f,0x02,0x00,0x0a,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x00,0x0c,0x0c,0x08,0x61,0x00,0x08,0x08,0x3e,0x4d,0x17,0x12,0x02,0x10,0x10,0x39,0x4d,0x00,0x16,0x16,0x15,0x61,0x18,0x01,0x15,0x15,0x42,0x15,0x4e,0x59,0x59,0x40,0x30,0x3a,0x39,0x00,0x00,0x41,0x3e,0x39,0x46,0x3a,0x45,0x38,0x37,0x36,0x35,0x00,0x34,0x00, +0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x27,0x25,0x21,0x1f,0x1e,0x1d,0x1c,0x1b,0x24,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35, +0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xa2,0x3d,0x6c,0x47,0x49,0x6c,0x3b,0x67,0x56,0x5a, +0x32,0x41,0x48,0x50,0x44,0x45,0x51,0xfe,0xf9,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0x02,0x7e,0x1d,0x24,0x24,0x1d,0x14,0x1d,0x24,0x24,0x1d,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x01,0x41,0x63,0x37,0x36,0x63,0x43,0x5b,0x76,0x06,0x64,0xaf,0x4a,0x42,0x41,0x4b,0x4b,0x41,0x41,0xb4,0x41,0xd2,0xd2,0xd2, +0x01,0x13,0xb4,0xfe,0x34,0x1f,0x1c,0x1b,0x22,0x22,0x1b,0x1b,0x20,0x00,0x00,0x00,0x00,0x04,0xfd,0xe9,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6b,0x40,0x68,0x0b,0x09,0x07,0x05,0x04,0x03,0x1b,0x19,0x17,0x0c,0x04,0x02,0x01,0x03,0x02,0x68,0x1a,0x18,0x16,0x0d,0x04,0x01,0x14,0x12,0x10,0x0e, +0x04,0x00,0x0f,0x01,0x00,0x67,0x0a,0x08,0x06,0x03,0x04,0x04,0x38,0x4d,0x1c,0x15,0x13,0x11,0x04,0x0f,0x0f,0x39,0x0f,0x4e,0x00,0x00,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x00,0x2b,0x00,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15, +0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1d,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x17, +0x33,0x37,0x23,0x05,0x33,0x37,0x23,0xfe,0x19,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xf0,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xf0,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0xf0,0x22,0xf0,0x01,0x14,0xa0,0x22,0xa0,0xd2,0x41,0xb4, +0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x00,0x06,0xfb,0x91,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x8f,0x40,0x8c,0x0f,0x0d,0x0b,0x09,0x07,0x05,0x06,0x03,0x27,0x25, +0x23,0x21,0x1f,0x10,0x06,0x02,0x01,0x03,0x02,0x68,0x26,0x24,0x22,0x20,0x1e,0x11,0x06,0x01,0x1c,0x1a,0x18,0x16,0x14,0x12,0x06,0x00,0x13,0x01,0x00,0x67,0x0e,0x0c,0x0a,0x08,0x06,0x05,0x04,0x04,0x38,0x4d,0x28,0x1d,0x1b,0x19,0x17,0x15,0x06,0x13,0x13,0x39,0x13,0x4e,0x00,0x00,0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46, +0x45,0x44,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x00,0x3b,0x00,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x29, +0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x13, +0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0xfb,0xc1,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x0e,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x0e,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27, +0xfe,0xf2,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xf2,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x0e,0x22,0xfe,0xf2,0x01,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x0e,0x22,0xfe,0xf2,0x01,0x32,0xa0,0x22,0xa0,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2, +0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x08,0xf9,0x39,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b,0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0xb3,0x40,0xb0,0x13,0x11,0x0f,0x0d,0x0b,0x09,0x07,0x05,0x08,0x03,0x33,0x31,0x2f,0x2d, +0x2b,0x29,0x27,0x14,0x08,0x02,0x01,0x03,0x02,0x68,0x32,0x30,0x2e,0x2c,0x2a,0x28,0x26,0x15,0x08,0x01,0x24,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x08,0x00,0x17,0x01,0x00,0x67,0x12,0x10,0x0e,0x0c,0x0a,0x08,0x06,0x07,0x04,0x04,0x38,0x4d,0x34,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x08,0x17,0x17,0x39,0x17,0x4e,0x00,0x00,0x67,0x66, +0x65,0x64,0x63,0x62,0x61,0x60,0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x58,0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,0x4f,0x4e,0x4d,0x4c,0x00,0x4b,0x00,0x4b,0x4a,0x49,0x48,0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29, +0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x35,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33, +0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05, +0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0xf9,0x69,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46, +0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xd2, +0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x04,0xfd,0xcb,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x1b, +0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0xdf,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2c,0x0e,0x07,0x05,0x03,0x03,0x11,0x15,0x0f,0x08,0x04,0x02,0x01,0x03,0x02,0x68,0x12,0x10,0x09,0x03,0x01,0x16,0x13,0x0c,0x0a,0x04,0x00,0x0b,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x4b,0xb0,0x2e,0x50, +0x58,0x40,0x36,0x00,0x0e,0x03,0x02,0x0e,0x57,0x07,0x05,0x02,0x03,0x11,0x15,0x0f,0x08,0x04,0x02,0x01,0x03,0x02,0x68,0x0c,0x0a,0x02,0x00,0x13,0x01,0x00,0x57,0x12,0x10,0x09,0x03,0x01,0x16,0x01,0x13,0x0b,0x01,0x13,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x40,0x38,0x07,0x05,0x02,0x03, +0x11,0x08,0x02,0x02,0x0f,0x03,0x02,0x68,0x00,0x0e,0x15,0x01,0x0f,0x12,0x0e,0x0f,0x67,0x10,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x13,0x01,0x00,0x67,0x00,0x12,0x16,0x01,0x13,0x0b,0x12,0x13,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x59,0x59,0x40,0x2e,0x24,0x24,0x1c,0x1c,0x00,0x00,0x24,0x27, +0x24,0x27,0x26,0x25,0x23,0x22,0x21,0x20,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23, +0x37,0x23,0x07,0x01,0x35,0x21,0x15,0x05,0x33,0x37,0x23,0x05,0x35,0x21,0x15,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x02,0x0f,0x01,0xb8,0xfc,0x6b,0xa0,0x22,0xa0,0x01,0xbb,0x01,0xb8,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41, +0xd2,0xd2,0xd2,0x01,0xc2,0x50,0x50,0xaf,0xb4,0xff,0x50,0x50,0x00,0x02,0xfd,0xcb,0xff,0x9c,0x02,0x1c,0x02,0xda,0x00,0x1d,0x00,0x21,0x00,0x4f,0x40,0x4c,0x09,0x07,0x02,0x05,0x10,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x0f,0x0b,0x02,0x03,0x0c,0x02,0x02,0x00,0x01,0x03,0x00,0x67,0x00,0x0d,0x11,0x01,0x0e,0x0d,0x0e,0x63,0x08,0x01, +0x06,0x06,0x38,0x4d,0x00,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x21,0x20,0x1f,0x1e,0x00,0x1d,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x09,0x1f,0x2b,0x05,0x13,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33, +0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x21,0x15,0x01,0x33,0x37,0x23,0xfe,0xce,0x3a,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x2c,0x02,0xfa,0xfc,0x57,0xa0,0x22,0xa0,0x64,0x01,0x36,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xeb,0x4b,0x01,0x77, +0xb4,0x00,0x00,0x00,0x00,0x02,0xfb,0x73,0xff,0x9c,0x01,0xdb,0x03,0x43,0x00,0x2f,0x00,0x33,0x00,0x59,0x40,0x56,0x2e,0x01,0x0d,0x01,0x4b,0x25,0x24,0x02,0x06,0x4a,0x09,0x07,0x02,0x05,0x10,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x0f,0x0b,0x02,0x03,0x0c,0x02,0x02,0x00,0x01,0x03,0x00,0x67,0x00,0x0d,0x11,0x01,0x0e,0x0d,0x0e,0x63, +0x08,0x01,0x06,0x06,0x38,0x4d,0x00,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x33,0x32,0x31,0x30,0x00,0x2f,0x00,0x2f,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x09,0x1f,0x2b,0x05,0x13,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33, +0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x21,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x15,0x0e,0x02,0x15,0x15,0x14,0x16,0x16,0x17,0x15,0x01,0x33,0x37,0x23,0xfc,0x76,0x3a,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x2c,0x04,0x73,0x42,0x4c,0x49,0x87,0x5c, +0x40,0x5e,0x34,0x32,0x5d,0x3f,0xfa,0x44,0xa0,0x22,0xa0,0x64,0x01,0x36,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xeb,0x2a,0x9f,0x63,0xaa,0x62,0x9f,0x6e,0x17,0x55,0x0f,0x55,0x7e,0x4f,0xaa,0x4c,0x7c,0x54,0x10,0x4b,0x01,0x77,0xb4,0x00,0x00,0x00,0xff,0xff,0xfd,0xf3,0xff,0x92,0x02,0x34,0x03,0x3e,0x00,0x27, +0x03,0x3d,0xfd,0xa8,0x00,0x00,0x03,0x07,0x03,0x34,0x00,0x00,0x00,0x82,0x00,0x08,0xb1,0x01,0x01,0xb0,0x82,0xb0,0x35,0x2b,0xff,0xff,0xfb,0x9b,0xff,0x92,0x02,0x34,0x03,0x3e,0x00,0x27,0x03,0x3d,0xfb,0x50,0x00,0x00,0x00,0x27,0x03,0x34,0xfd,0xa8,0x00,0x82,0x03,0x07,0x03,0x34,0x00,0x00,0x00,0x82,0x00,0x10,0xb1,0x01,0x01,0xb0, +0x82,0xb0,0x35,0x2b,0xb1,0x02,0x01,0xb0,0x82,0xb0,0x35,0x2b,0x00,0x01,0xfe,0x11,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00, +0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x03,0xfe,0x11,0x01,0x63,0x5f,0x80,0x02,0x97,0xfd,0x4a,0x3c,0x02,0xf2,0xfc,0xf0,0x6a,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x00,0x01,0xfb,0xa0,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x0b, +0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15, +0x21,0x03,0xfb,0xa0,0x01,0x63,0x5f,0x80,0x05,0x08,0xfa,0xd9,0x3c,0x05,0x63,0xfa,0x7f,0x6a,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x00,0x01,0xfe,0x16,0xff,0x92,0x01,0xd6,0x03,0x3e,0x00,0x10,0x00,0x23,0x40,0x20,0x0f,0x0b,0x07,0x06,0x05,0x04,0x03,0x07,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, +0x01,0x76,0x00,0x00,0x00,0x10,0x00,0x10,0x11,0x03,0x09,0x17,0x2b,0x05,0x01,0x33,0x07,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x01,0xfe,0x16,0x01,0x63,0x5f,0x41,0x02,0x3f,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x21,0x12,0xfe,0x1d,0xfe,0xfa,0x6e,0x03,0xac,0xad,0xfe,0xeb,0x64,0xd7,0x5a,0x97,0x09,0x0b, +0x02,0x02,0x0b,0x09,0xe9,0xfd,0x4b,0x00,0xff,0xff,0xfe,0x3e,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x26,0x03,0x3d,0xb5,0x00,0x00,0x07,0x03,0x3d,0xfd,0xf3,0x00,0x00,0x00,0x02,0xfb,0xfa,0xff,0x92,0x01,0xd6,0x03,0x3e,0x00,0x0b,0x00,0x0f,0x00,0x3f,0x40,0x3c,0x06,0x01,0x00,0x01,0x00,0x85,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x86, +0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x03,0x21,0x01,0x33,0x01,0xfd, +0xbd,0x01,0x63,0x5f,0x80,0x02,0xd7,0xfd,0x0a,0x3c,0x03,0x32,0xfc,0xb0,0x6a,0xfd,0xde,0x01,0x63,0x5f,0xfe,0x9d,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x03,0xac,0xfc,0x54,0xff,0xff,0xfc,0x13,0xff,0x92,0x01,0x95,0x03,0x3e,0x00,0x27,0x03,0x3d,0xfb,0xc8,0x00,0x00,0x00,0x27,0x03,0x3d,0xfd,0xa8,0x00,0x00,0x00,0x06, +0x03,0x3d,0x88,0x00,0x00,0x01,0xfe,0x66,0xff,0x92,0x01,0x9a,0x03,0x3e,0x00,0x08,0x00,0x1f,0x40,0x1c,0x06,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x04,0x09,0x18,0x2b,0x05,0x01,0x33,0x01,0x23,0x01,0x27,0x07,0x01,0xfe,0x66,0x01,0x63,0x6e,0x01, +0x63,0x5f,0xfe,0xdc,0x17,0x16,0xfe,0xdc,0x6e,0x03,0xac,0xfc,0x54,0x03,0x0a,0x44,0x44,0xfc,0xf6,0x00,0x00,0x01,0xfe,0x66,0xff,0x92,0x01,0x9a,0x03,0x3e,0x00,0x08,0x00,0x1f,0x40,0x1c,0x04,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x08,0x00,0x08,0x14,0x11,0x04,0x09,0x18, +0x2b,0x07,0x01,0x33,0x01,0x17,0x37,0x01,0x33,0x01,0x37,0xfe,0x9d,0x5f,0x01,0x24,0x17,0x16,0x01,0x24,0x60,0xfe,0x9d,0x6e,0x03,0xac,0xfc,0xf6,0x44,0x44,0x03,0x0a,0xfc,0x54,0x00,0x00,0x00,0x01,0xfc,0x22,0xff,0x9c,0x01,0x86,0x02,0xee,0x00,0x07,0x00,0x41,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x02,0x01,0x00,0x04,0x01,0x03,0x00, +0x03,0x63,0x00,0x01,0x01,0x38,0x01,0x4e,0x1b,0x40,0x18,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0xfc,0x22,0x02,0x85,0x5a, +0x02,0x85,0x64,0x4b,0x03,0x07,0xfc,0xf9,0x4b,0x00,0x00,0x00,0x00,0x01,0xfd,0xe4,0xff,0x9c,0x02,0x1c,0xff,0xe7,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x35,0x21,0x15,0xfd,0xe4,0x04,0x38, +0x64,0x4b,0x4b,0x00,0x00,0x04,0xfe,0x5c,0xff,0xfb,0x01,0x90,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x19,0x00,0x4e,0x40,0x4b,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x07,0x04,0x05,0x67,0x08,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x07,0x07,0x06,0x61,0x0b,0x01,0x06,0x06, +0x42,0x06,0x4e,0x0d,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x14,0x11,0x0c,0x19,0x0d,0x18,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23, +0xfe,0x7e,0x0c,0x6a,0x0c,0xcc,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfd,0x08,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0xf0,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x06,0xfc,0x0e,0xff,0xfb,0x01,0x90,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13, +0x00,0x21,0x00,0x64,0x40,0x61,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x06,0x02,0x03,0x67,0x08,0x01,0x06,0x10,0x09,0x0f,0x03,0x07,0x0b,0x06,0x07,0x67,0x0c,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x0b,0x0b,0x0a,0x61,0x11,0x01,0x0a,0x0a,0x42,0x0a,0x4e,0x15,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00, +0x00,0x1c,0x19,0x14,0x21,0x15,0x20,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x22,0x26,0x35, +0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfc,0x30,0x0c,0x6a,0x0c,0xcc,0x01,0xe5,0x78,0x01,0xe5,0xfb,0xbe,0x01,0xe5,0x78,0x01,0xe5,0xfa,0xba,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00, +0x00,0x01,0x00,0x7d,0xff,0x8d,0x01,0xe5,0x03,0x2f,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x02,0x01,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x13,0x03,0x06,0x17,0x2b,0x05,0x03,0x35,0x13,0x33,0x01,0x01,0x01,0x79,0xfc,0xfc,0x66,0xfe,0xe8,0x01,0x1e,0x73,0x01,0x95, +0x7a,0x01,0x93,0xfe,0x2d,0xfe,0x31,0x00,0x00,0x02,0x00,0x64,0xff,0x92,0x02,0x2a,0x03,0x3e,0x00,0x06,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x0c,0x09,0x08,0x05,0x02,0x01,0x06,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x07,0x07,0x00,0x00,0x07,0x0d,0x07,0x0d,0x0b,0x0a,0x00,0x06,0x00,0x06, +0x13,0x06,0x06,0x17,0x2b,0x05,0x01,0x35,0x01,0x33,0x01,0x01,0x33,0x01,0x35,0x01,0x33,0x01,0x01,0x01,0x75,0xfe,0xef,0x01,0x11,0x37,0xfe,0xe2,0x01,0x1e,0x47,0xfe,0xef,0x01,0x11,0x37,0xfe,0xe2,0x01,0x1e,0x6e,0x01,0xbc,0x33,0x01,0xbd,0xfe,0x2a,0xfe,0x2a,0x01,0xbc,0x33,0x01,0xbd,0xfe,0x2a,0xfe,0x2a,0x00,0x00,0x02,0x00,0xa0, +0xff,0x92,0x01,0xef,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x00,0x01,0x06,0x05,0x02,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x00,0x00,0x03,0x57,0x04,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x08,0x08,0x08,0x0b,0x08,0x0b,0x12,0x11,0x11,0x11,0x10,0x07,0x06,0x1b,0x2b,0x05,0x21,0x11,0x21,0x15,0x23,0x11, +0x33,0x01,0x11,0x33,0x11,0x01,0xef,0xfe,0xb1,0x01,0x4f,0xaf,0xaf,0xfe,0xe3,0x3c,0x6e,0x03,0xac,0x2d,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x00,0x01,0x00,0x73,0xff,0x8d,0x01,0xdb,0x03,0x2f,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x04,0x01,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, +0x00,0x06,0x00,0x06,0x12,0x03,0x06,0x17,0x2b,0x17,0x01,0x01,0x33,0x13,0x15,0x03,0x73,0x01,0x1e,0xfe,0xe8,0x66,0xfc,0xfc,0x73,0x01,0xcf,0x01,0xd3,0xfe,0x6d,0x7a,0xfe,0x6b,0x00,0x00,0x00,0x02,0x00,0x2e,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x06,0x00,0x0d,0x00,0x20,0x40,0x1d,0x0d,0x0c,0x09,0x06,0x05,0x02,0x06,0x00,0x01,0x01, +0x4c,0x03,0x01,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x12,0x13,0x12,0x10,0x04,0x06,0x1a,0x2b,0x17,0x23,0x01,0x01,0x33,0x01,0x15,0x01,0x23,0x01,0x01,0x33,0x01,0x15,0xe3,0x37,0x01,0x1e,0xfe,0xe2,0x37,0x01,0x11,0xfe,0x71,0x37,0x01,0x1e,0xfe,0xe2,0x37,0x01,0x11,0x6e,0x01,0xd6,0x01,0xd6,0xfe,0x43,0x33,0xfe,0x44,0x01, +0xd6,0x01,0xd6,0xfe,0x43,0x33,0x00,0x00,0x00,0x02,0x00,0x69,0xff,0x92,0x01,0xb8,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x04,0x01,0x01,0x00,0x02,0x01,0x67,0x05,0x01,0x00,0x03,0x03,0x00,0x57,0x05,0x01,0x00,0x00,0x03,0x5f,0x06,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07, +0x11,0x11,0x11,0x07,0x06,0x19,0x2b,0x17,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x03,0x23,0x11,0x33,0x69,0xaf,0xaf,0x01,0x4f,0x32,0x3c,0x3c,0x6e,0x2d,0x03,0x52,0x2d,0xfc,0x54,0x03,0x7f,0xfc,0xae,0x00,0x00,0xff,0xff,0x00,0xda,0x01,0x09,0x01,0x7e,0x01,0xab,0x03,0x07,0x03,0x29,0x00,0x00,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8, +0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0xcd,0xff,0x60,0x01,0x81,0x02,0x30,0x02,0x06,0x03,0x2c,0x00,0x00,0x00,0x03,0x00,0x5d,0xff,0x74,0x02,0x12,0x03,0x67,0x00,0x1c,0x00,0x25,0x00,0x2e,0x00,0x55,0x40,0x52,0x0b,0x01,0x09,0x01,0x11,0x01,0x0b,0x08,0x17,0x01,0x00,0x0a,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85, +0x0c,0x07,0x02,0x05,0x00,0x05,0x86,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x09,0x09,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x0a,0x0a,0x00,0x5f,0x06,0x01,0x00,0x00,0x39,0x00,0x4e,0x00,0x00,0x2e,0x2c,0x28,0x26,0x25,0x23,0x1f,0x1d,0x00,0x1c,0x00,0x1c,0x11,0x1e,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1d,0x2b,0x17, +0x35,0x23,0x11,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x23,0x15,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xb3,0x56,0x56,0x3c,0x46,0x3c,0x44,0x4c,0x3a,0x34,0x3b,0x44,0x55,0x4c,0x3c,0x46,0x3a,0x76, +0x3a,0x43,0x42,0x3a,0x77,0x7c,0x3f,0x49,0x49,0x3f,0x7c,0x8c,0x8c,0x02,0xda,0x8d,0x8d,0x8d,0x94,0x10,0x5e,0x48,0x3b,0x52,0x0e,0x10,0x60,0x47,0x50,0x68,0x0e,0x91,0x8c,0x8c,0x02,0x2f,0x3e,0x35,0x35,0x3e,0xfd,0xc8,0x43,0x3a,0x3c,0x4b,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x74,0x02,0x0b,0x02,0xb2,0x00,0x1b,0x00,0x23,0x00,0x3f, +0x40,0x3c,0x20,0x12,0x0b,0x08,0x04,0x01,0x00,0x1f,0x1a,0x13,0x01,0x04,0x03,0x02,0x02,0x4c,0x00,0x01,0x00,0x02,0x00,0x01,0x02,0x80,0x00,0x02,0x03,0x00,0x02,0x03,0x7e,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1b,0x17,0x14,0x19,0x05,0x09,0x19,0x2b,0x05, +0x35,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x26,0x26,0x27,0x11,0x36,0x36,0x37,0x33,0x06,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x11,0x06,0x06,0x15,0x01,0x11,0x55,0x64,0x64,0x55,0x3c,0x55,0x66,0x03,0x5a,0x03,0x34,0x2d,0x2d,0x34,0x03,0x5a,0x03,0x66,0x55,0x9b,0x33,0x2c,0x2c,0x33,0x8c,0x84,0x0a, +0x6d,0x59,0x96,0x59,0x6d,0x0a,0x84,0x83,0x07,0x64,0x52,0x2e,0x38,0x06,0xfe,0x6a,0x06,0x38,0x2e,0x52,0x64,0x07,0x83,0x01,0x54,0x34,0x41,0x0a,0x01,0x94,0x0a,0x40,0x34,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x71,0x02,0x2e,0x02,0x7b,0x00,0x1c,0x00,0x2a,0x00,0x6a,0x40,0x20,0x15,0x13,0x0f,0x0d,0x04,0x03,0x01,0x1b,0x16,0x0c, +0x08,0x04,0x02,0x03,0x1c,0x07,0x05,0x01,0x04,0x00,0x02,0x03,0x4c,0x14,0x0e,0x02,0x01,0x4a,0x06,0x01,0x00,0x49,0x4b,0xb0,0x21,0x50,0x58,0x40,0x13,0x04,0x01,0x02,0x00,0x00,0x02,0x00,0x65,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x03,0x4e,0x1b,0x40,0x1a,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x04,0x01,0x02,0x00,0x00, +0x02,0x59,0x04,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x02,0x00,0x51,0x59,0x40,0x0d,0x1e,0x1d,0x24,0x22,0x1d,0x2a,0x1e,0x2a,0x2c,0x22,0x05,0x09,0x18,0x2b,0x25,0x27,0x06,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x17,0x37,0x17,0x07,0x16,0x15,0x14,0x06,0x07,0x17,0x25,0x32,0x36,0x35,0x34, +0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0xef,0x57,0x2e,0x3d,0x3e,0x2f,0x55,0x3e,0x53,0x21,0x22,0x56,0x3f,0x58,0x30,0x3b,0x3f,0x30,0x54,0x3d,0x53,0x1f,0x11,0x0f,0x55,0xfe,0xff,0x38,0x4a,0x4a,0x38,0x25,0x3c,0x23,0x23,0x3c,0x71,0x57,0x1d,0x1d,0x55,0x3e,0x54,0x31,0x3f,0x40,0x31,0x56,0x3f,0x58,0x1c,0x1f,0x54,0x3d, +0x53,0x32,0x3d,0x1f,0x39,0x18,0x55,0x40,0x4c,0x39,0x39,0x4c,0x23,0x3c,0x26,0x26,0x3c,0x23,0x00,0x00,0x00,0x03,0x00,0x48,0xff,0x74,0x02,0x10,0x03,0x66,0x00,0x23,0x00,0x2a,0x00,0x32,0x00,0x3a,0x40,0x37,0x28,0x1a,0x13,0x10,0x04,0x02,0x01,0x32,0x27,0x1b,0x09,0x04,0x00,0x02,0x2b,0x22,0x08,0x01,0x04,0x03,0x00,0x03,0x4c,0x00, +0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x02,0x85,0x00,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x23,0x00,0x23,0x14,0x1c,0x14,0x05,0x09,0x19,0x2b,0x05,0x35,0x26,0x26,0x27,0x33,0x14,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x34,0x26,0x27,0x15,0x17,0x16,0x16,0x15, +0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x01,0x13,0x5e,0x6b,0x02,0x5a,0x3b,0x36,0x1b,0x4b,0x51,0x63,0x54,0x3c,0x53,0x64,0x01,0x5a,0x31,0x2d,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x2f,0x2c,0x0c,0x8c,0x83,0x08,0x69,0x56,0x31,0x3e,0x07,0x01, +0x06,0x08,0x17,0x6c,0x49,0x50,0x68,0x08,0x84,0x83,0x08,0x68,0x52,0x2f,0x3b,0x07,0xf8,0x0d,0x17,0x6e,0x4a,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x41,0x0e,0x04,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xb0,0x02,0x58,0x02,0xda,0x00,0x1c,0x00,0x2a,0x00,0x2e,0x00,0x9a,0xb6,0x19, +0x0a,0x02,0x08,0x09,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2e,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x0d,0x01,0x08,0x00,0x00,0x08,0x59,0x00,0x0a,0x0e,0x01,0x0b,0x0a,0x0b,0x63,0x07,0x0c,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x38,0x04,0x4e,0x1b,0x40,0x2f,0x05,0x01, +0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x0d,0x01,0x08,0x0c,0x01,0x00,0x0a,0x08,0x00,0x69,0x00,0x0a,0x0e,0x01,0x0b,0x0a,0x0b,0x63,0x00,0x07,0x07,0x04,0x5f,0x00,0x04,0x04,0x38,0x07,0x4e,0x59,0x40,0x27,0x2b,0x2b,0x1e,0x1d,0x01,0x00,0x2b,0x2e,0x2b,0x2e,0x2d,0x2c,0x25,0x23,0x1d,0x2a, +0x1e,0x2a,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1c,0x01,0x1c,0x0f,0x09,0x16,0x2b,0x25,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15, +0x15,0x14,0x16,0x07,0x35,0x21,0x15,0x01,0x0c,0x52,0x60,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x74,0x74,0x5a,0x5e,0x5e,0x5a,0x01,0x07,0x4e,0x20,0x38,0x3e,0x3e,0x38,0x39,0x3d,0x3d,0x97,0x01,0xa4,0x32,0x6e,0x5e,0x29,0x5f,0x6e,0x3e,0x35,0x7d,0x3c,0x4b,0x55,0x55,0x4b,0xfe,0x02,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x1e,0x3e,0x46,0x44, +0x40,0x1e,0x40,0x44,0xd0,0x50,0x50,0x00,0x00,0x01,0x00,0x13,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x2b,0x00,0x60,0x40,0x5d,0x00,0x06,0x07,0x04,0x07,0x06,0x04,0x80,0x00,0x0d,0x01,0x0c,0x01,0x0d,0x0c,0x80,0x08,0x01,0x04,0x09,0x01,0x03,0x02,0x04,0x03,0x67,0x0a,0x01,0x02,0x0b,0x01,0x01,0x0d,0x02,0x01,0x67,0x00,0x07,0x07,0x05, +0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x0c,0x0c,0x00,0x61,0x0e,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x29,0x28,0x26,0x24,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x17,0x15,0x13,0x12,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x2b,0x01,0x2b,0x0f,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x35,0x33,0x35,0x23, +0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x49,0x49,0x49,0x49,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0xad,0xad,0xad,0xad,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62, +0x2d,0x41,0x64,0x41,0x37,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0x37,0x41,0x64,0x41,0x2d,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x1a,0x00,0x33,0x40,0x30,0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00,0x00,0x00,0x07, +0x5f,0x08,0x01,0x07,0x07,0x3d,0x07,0x4e,0x00,0x00,0x00,0x1a,0x00,0x19,0x11,0x12,0x21,0x23,0x11,0x13,0x21,0x09,0x09,0x1d,0x2b,0x15,0x35,0x33,0x32,0x36,0x35,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x14,0x06,0x23,0x69,0x35,0x3e,0xa0,0xa0,0x51,0x49,0xa1,0xa1,0x40,0xe1,0xe1, +0x70,0x5d,0xb4,0x52,0x3d,0x34,0x01,0x2a,0x52,0xc4,0x42,0x49,0x50,0x3c,0xc3,0x52,0xfe,0xd6,0x58,0x6b,0x00,0x02,0x00,0x32,0xff,0xf6,0x02,0x26,0x02,0xe4,0x00,0x19,0x00,0x31,0x00,0x5a,0x40,0x57,0x00,0x02,0x01,0x00,0x01,0x02,0x00,0x80,0x00,0x09,0x07,0x08,0x07,0x09,0x08,0x80,0x04,0x01,0x00,0x0c,0x01,0x05,0x06,0x00,0x05,0x67, +0x00,0x06,0x0d,0x0b,0x02,0x07,0x09,0x06,0x07,0x67,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x03,0x3e,0x4d,0x00,0x08,0x08,0x0a,0x61,0x00,0x0a,0x0a,0x3f,0x0a,0x4e,0x1a,0x1a,0x00,0x00,0x1a,0x31,0x1a,0x31,0x2d,0x2b,0x29,0x28,0x26,0x24,0x1e,0x1d,0x1c,0x1b,0x00,0x19,0x00,0x19,0x16,0x22,0x12,0x26,0x11,0x0e,0x09,0x1b,0x2b,0x13,0x35, +0x21,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x05,0x35,0x21,0x15,0x21,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x32,0x01,0x17,0x25,0x15,0x1c,0x38,0x31,0x38,0x41,0x59,0x02,0x6e,0x61,0x59,0x69, +0x25,0x1e,0x09,0x7b,0xfe,0x0c,0x01,0xf4,0xfe,0xd2,0x10,0x16,0x1b,0x3b,0x31,0x38,0x44,0x59,0x01,0x72,0x61,0x59,0x6c,0x33,0x01,0x8e,0x46,0x20,0x12,0x2b,0x18,0x26,0x27,0x35,0x31,0x55,0x5f,0x4e,0x48,0x22,0x35,0x1b,0x08,0x46,0x92,0x46,0x46,0x0c,0x10,0x2d,0x18,0x25,0x32,0x3f,0x31,0x55,0x69,0x58,0x48,0x3b,0x2b,0x00,0x00,0x00, +0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x18,0x00,0x21,0x00,0x3d,0x40,0x3a,0x09,0x01,0x03,0x05,0x01,0x02,0x01,0x03,0x02,0x67,0x06,0x01,0x01,0x07,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x0a,0x0a,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x0b,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x21,0x1f,0x1b,0x19,0x00,0x18,0x00, +0x18,0x11,0x11,0x26,0x21,0x11,0x11,0x11,0x11,0x0c,0x09,0x1e,0x2b,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x15,0x33,0x15,0x23,0x15,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x6e,0x50,0x50,0x50,0x50,0xdf,0x42,0x61,0x36,0x36,0x61,0x42,0x85,0xe6,0xe6,0x85,0x39, +0x43,0x43,0x39,0x85,0x9b,0x50,0x55,0x50,0x01,0x4a,0x33,0x5c,0x3e,0x3d,0x5d,0x33,0x55,0x50,0x9b,0x01,0x90,0x44,0x39,0x39,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x17,0x02,0xe4,0x00,0x2a,0x00,0x42,0x40,0x3f,0x01,0x01,0x07,0x00,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x05,0x01,0x01,0x06,0x01,0x00, +0x07,0x01,0x00,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x07,0x07,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x2a,0x00,0x2a,0x16,0x11,0x16,0x22,0x12,0x26,0x11,0x17,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x3e,0x02,0x35,0x34,0x27,0x23,0x35,0x33,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23, +0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x06,0x07,0x21,0x15,0x4b,0x18,0x32,0x23,0x05,0x68,0x4b,0x0e,0x1e,0x14,0x74,0x62,0x63,0x73,0x01,0x5f,0x42,0x37,0x3a,0x40,0x18,0x22,0x0f,0xb9,0xa3,0x03,0x23,0x33,0x18,0x01,0x72,0x64,0x13,0x35,0x39,0x19,0x1b,0x18,0x50,0x1a,0x31,0x39,0x26, +0x55,0x64,0x65,0x59,0x32,0x3c,0x39,0x35,0x23,0x33,0x30,0x1f,0x50,0x14,0x16,0x2b,0x49,0x35,0x0e,0x50,0x00,0x01,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x17,0x00,0x36,0x40,0x33,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x10,0x03,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x01,0x5f,0x00, +0x01,0x01,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x19,0x05,0x09,0x19,0x2b,0x21,0x35,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x15,0x07,0x15,0x37,0x15,0x07,0x15,0x01,0x00,0xb0,0xb0,0xb0,0xb0,0xd3,0x01,0xfe,0xd3,0xb0,0xb0,0xb0,0xb0,0xb7,0x30, +0x4b,0x30,0x64,0x30,0x4b,0x30,0xda,0x4f,0x4f,0xc2,0x30,0x4b,0x30,0x64,0x30,0x4b,0x30,0xcf,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x1c,0x00,0x3e,0x40,0x3b,0x0c,0x01,0x02,0x03,0x01,0x4c,0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x68,0x07,0x01,0x00,0x0b,0x0a,0x02,0x08,0x09,0x00,0x08,0x67,0x04, +0x01,0x03,0x03,0x38,0x4d,0x00,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x1c,0x00,0x1c,0x1b,0x1a,0x11,0x11,0x11,0x11,0x18,0x11,0x11,0x11,0x11,0x0c,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x3c,0xc3,0xc3, +0xa0,0xb9,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xb9,0xa0,0xc3,0xc3,0xc3,0x5a,0x78,0x4b,0x4b,0x4b,0x01,0x81,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x7f,0x4b,0x4b,0x4b,0x78,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x58,0xff,0x4c,0x02,0x0b,0x02,0xda,0x00,0x21,0x00,0x42,0x40,0x3f,0x0b,0x08,0x02,0x02, +0x00,0x20,0x01,0x02,0x05,0x03,0x02,0x4c,0x00,0x01,0x02,0x04,0x02,0x01,0x04,0x80,0x00,0x04,0x03,0x02,0x04,0x03,0x7e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x05,0x5f,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x00,0x00,0x00,0x21,0x00,0x21,0x12,0x25,0x22,0x14,0x19,0x07,0x09,0x1b,0x2b,0x05,0x35,0x26,0x26, +0x35,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x07,0x15,0x01,0x02,0x4e,0x5c,0x5c,0x4e,0x5a,0x4e,0x5e,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x5e,0x4e,0xb4,0xae,0x0d,0x6c,0x55,0x96,0x55,0x6c,0x0d, +0xae,0xad,0x0a,0x63,0x4e,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x4e,0x63,0x0a,0xad,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0x4c,0x02,0x10,0x03,0x84,0x00,0x2d,0x00,0x3a,0x40,0x37,0x2d,0x02,0x02,0x02,0x00,0x19,0x16,0x02,0x03,0x05,0x02,0x4c,0x00,0x01,0x02,0x04,0x02,0x01,0x04,0x80,0x00,0x04,0x05,0x02,0x04,0x05,0x7e,0x00, +0x00,0x00,0x02,0x01,0x00,0x02,0x69,0x00,0x05,0x05,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x22,0x14,0x1d,0x22,0x14,0x10,0x06,0x09,0x1c,0x2b,0x01,0x33,0x15,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35, +0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x05,0x5a,0x47,0x56,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49,0x51,0x5f,0x52,0x5a,0x57,0x66,0x5a,0x4e,0x40,0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x5e,0x4d,0x03,0x84,0xa5,0x0f,0x65,0x48,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x54,0x6e,0x0c,0xae,0xad, +0x0b,0x6c,0x58,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0xaa,0x02,0x12,0x02,0x39,0x00,0x1b,0x00,0x1f,0x00,0x86,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x08,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00, +0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x1b,0x40,0x32,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x08,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00, +0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x59,0x40,0x16,0x1c,0x1c,0x00,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x0a,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22, +0x15,0x15,0x07,0x35,0x21,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x01,0xcc,0x01,0x71,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0xc7,0x50,0x50,0x00,0x03,0x00,0x1d,0xff,0xf6,0x02,0x3b,0x02,0x30,0x00,0x0b, +0x00,0x17,0x00,0x23,0x00,0x3b,0x40,0x38,0x03,0x01,0x01,0x07,0x02,0x06,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16, +0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x64,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0x6f,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xe9,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0xb0, +0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0x46,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x02,0x00,0x9e,0xff,0xc9,0x01,0xc6,0x02,0x5d,0x00,0x21,0x00,0x2f,0x00,0x08,0xb5,0x2c,0x25,0x0d,0x00,0x02,0x32,0x2b,0x17,0x35,0x36,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x26, +0x27,0x35,0x16,0x17,0x36,0x37,0x15,0x06,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x07,0x16,0x17,0x15,0x26,0x27,0x06,0x03,0x14,0x16,0x17,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0xa8,0x34,0x29,0x38,0x2f,0x2f,0x38,0x29,0x34,0x50,0x3a,0x3a,0x50,0x34,0x29,0x38,0x2f,0x2f,0x38,0x29,0x34,0x50,0x3a,0x3a,0x28,0x2b,0x37,0x37, +0x2b,0x2b,0x37,0x37,0x2b,0x37,0x2d,0x0b,0x12,0x2d,0x7e,0x4b,0x14,0x4b,0x7e,0x2d,0x12,0x0b,0x2d,0x0e,0x1f,0x1f,0x0e,0x2d,0x0b,0x12,0x2d,0x7e,0x4b,0x14,0x4b,0x7e,0x2d,0x12,0x0b,0x2d,0x0e,0x1f,0x1f,0x01,0x32,0x43,0x71,0x28,0x28,0x71,0x43,0x14,0x43,0x71,0x28,0x28,0x71,0x43,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x32,0x02,0x58, +0x02,0x9b,0x00,0x05,0x00,0x08,0x00,0x0b,0x00,0x0a,0xb7,0x0b,0x09,0x07,0x06,0x01,0x00,0x03,0x32,0x2b,0x35,0x11,0x01,0x01,0x11,0x01,0x17,0x11,0x07,0x05,0x37,0x27,0x01,0x2c,0x01,0x2c,0xfe,0xd3,0xfb,0xd6,0xfe,0xe2,0xd5,0xd5,0x32,0x02,0x69,0xfe,0xef,0x01,0x11,0xfd,0x97,0x01,0x13,0xa0,0x01,0x86,0xc3,0xc5,0xc4,0xc2,0x00,0x00, +0xff,0xff,0x00,0xda,0x00,0xf0,0x01,0x7e,0x01,0x92,0x03,0x07,0x03,0x29,0x00,0x00,0x00,0xfa,0x00,0x08,0xb1,0x00,0x01,0xb0,0xfa,0xb0,0x35,0x2b,0x00,0x04,0x00,0x00,0x00,0x64,0x02,0x58,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x52,0x40,0x4f,0x00,0x02,0x09,0x01,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x08,0x01,0x00, +0x05,0x01,0x00,0x69,0x00,0x05,0x06,0x04,0x05,0x59,0x00,0x06,0x0b,0x01,0x07,0x04,0x06,0x07,0x67,0x00,0x05,0x05,0x04,0x61,0x0a,0x01,0x04,0x05,0x04,0x51,0x1c,0x1c,0x11,0x10,0x0c,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06, +0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x50,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x86,0x01,0x5e,0xfd,0xf8,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x86,0x01,0x5e,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c, +0x24,0x25,0x2b,0x0a,0x50,0x50,0xfe,0xca,0x2c,0x24,0x25,0x2b,0x2b,0x25,0x24,0x2c,0x46,0x50,0x50,0x00,0x00,0x01,0x00,0x9b,0xff,0xf6,0x01,0xc7,0x02,0x30,0x00,0x1f,0x00,0x6f,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x26,0x00,0x02,0x03,0x05,0x03,0x02,0x72,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04, +0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x1b,0x40,0x28,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x1c, +0x1b,0x18,0x16,0x11,0x0f,0x0c,0x0b,0x08,0x06,0x00,0x1f,0x01,0x1f,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x31,0x44,0x52,0x52,0x44,0x44,0x52,0x5a,0x21,0x1b,0x1b,0x21,0x21,0x1b, +0x1b,0x21,0x5a,0x52,0x0a,0x52,0x44,0x01,0x0e,0x44,0x52,0x52,0x44,0x28,0x32,0x1b,0x21,0x21,0x1b,0xfe,0xde,0x1b,0x21,0x21,0x1b,0x32,0x28,0x44,0x52,0x00,0x00,0x00,0x00,0x03,0x00,0x46,0x00,0x4c,0x02,0x12,0x02,0x9e,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0xa0,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x39,0x00,0x02,0x00,0x04,0x01,0x02,0x72, +0x0a,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x0b,0x01,0x07,0x08,0x06,0x07,0x67,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0c,0x01,0x09,0x08,0x09,0x4f,0x1b,0x40,0x3b,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x0a,0x01,0x05, +0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x0b,0x01,0x07,0x08,0x06,0x07,0x67,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0c,0x01,0x09,0x08,0x09,0x4f,0x59,0x40,0x1e,0x20,0x20,0x1c,0x1c,0x00,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x1c, +0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x0d,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25, +0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x01,0xcc,0xfe,0x34,0x01,0xcc,0x01,0xd6,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0xb2,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x02,0xda,0x00,0x0b,0x00,0x2c,0x40,0x29,0x03,0x01,0x01,0x00,0x01,0x85,0x04,0x02, +0x02,0x00,0x05,0x05,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x17,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x28,0x41,0x5a,0xd2,0x5a,0x41,0xb4,0x52,0x03,0x3c,0xfc,0xc4,0x03,0x3c,0xfc,0xc4,0x52,0x00, +0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x02,0x3c,0x02,0x2a,0x00,0x14, +0x00,0x13,0x40,0x10,0x14,0x10,0x0c,0x0b,0x00,0x05,0x00,0x4a,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x01,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x26,0x26,0x27,0x35,0x1e,0x02,0x17,0x3e,0x02,0x37,0x02,0x3c,0x44,0x66,0x37,0x64,0x36,0x63,0x43,0x4d,0x76,0x45,0x06,0x07,0x47,0x78,0x4d,0x01,0xd0,0x08,0x63,0xa2,0x69,0x5a,0x5a, +0x69,0xa2,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x00,0xbe,0x01,0xb9,0x01,0xd8,0x00,0x03,0x00,0x07,0x00,0x08,0xb5,0x06,0x04,0x02,0x00,0x02,0x32,0x2b,0x25,0x27,0x37,0x17,0x07,0x37,0x27,0x07,0x01,0x2c,0x8d,0x8d,0x8d,0x8d,0x54,0x54,0x54,0xbe,0x8d,0x8d,0x8d,0x54,0x54,0x54, +0x54,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0x00,0x00,0x01,0x59,0x02,0xda,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x33,0x11,0x33,0x11,0xff,0x5a,0x02,0xda,0xfd,0x26,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x02,0x06, +0x03,0x20,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x01,0xdb,0x02,0xda,0x00,0x0b,0x00,0x2c,0x40,0x29,0x0a,0x07,0x04,0x01,0x04,0x03,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x01,0x85,0x04,0x01,0x03,0x02,0x03,0x85,0x00,0x02,0x02,0x76,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x05,0x06,0x19,0x2b,0x37,0x37, +0x11,0x33,0x15,0x37,0x33,0x07,0x11,0x23,0x35,0x07,0x7d,0x82,0x5a,0x3c,0x46,0x82,0x5a,0x3c,0x8c,0xd1,0x01,0x7d,0xec,0x60,0xd1,0xfe,0x83,0xec,0x60,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0xaa,0x01,0xcc,0x01,0xea,0x00,0x0b,0x00,0x0f,0x00,0x30,0x40,0x2d,0x00,0x01,0x04,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x03,0x03,0x02, +0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x0c,0x0c,0x01,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xc6,0x01,0x40,0x01,0x54,0x29,0x22, +0x22,0x29,0x29,0x22,0x22,0x29,0xaa,0x50,0x50,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x46,0x02,0x35,0x02,0x8a,0x00,0x15,0x00,0x29,0x00,0x48,0x40,0x45,0x00,0x01,0x00,0x02,0x05,0x01,0x02,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x09,0x01,0x04,0x03,0x07,0x04,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03, +0x00,0x5f,0x08,0x01,0x00,0x03,0x00,0x4f,0x17,0x16,0x01,0x00,0x28,0x26,0x21,0x1f,0x1e,0x1c,0x16,0x29,0x17,0x29,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x0a,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x27,0x22,0x26,0x35,0x35,0x34, +0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x18,0x4a,0x6f,0x3c,0x3c,0x6f,0x4a,0x01,0x1d,0xfe,0xe3,0x4b,0x5a,0x5a,0x4b,0x01,0x1d,0xf4,0x38,0x40,0x40,0x38,0xf4,0xea,0x17,0x1b,0x1b,0x17,0xea,0x46,0x3c,0x6c,0x48,0x64,0x49,0x6b,0x3c,0x46,0x5d,0x4d,0x64,0x4d,0x5d,0x46,0x9b,0x3d,0x36,0x28,0x36, +0x3d,0x46,0x1b,0x17,0x1e,0x17,0x1b,0x46,0x00,0x03,0xff,0xf6,0x00,0x19,0x02,0x62,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19, +0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x3d, +0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xd0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xcf,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x01,0x00,0x23,0x00,0x46,0x02,0x3a,0x02,0x8a,0x00,0x1b, +0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x05,0x00,0x4f,0x01,0x00,0x1a,0x18,0x14,0x13,0x12,0x11,0x0d,0x0b,0x0a,0x08,0x00,0x1b,0x01,0x1b,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34, +0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x06,0x15,0x15,0x21,0x15,0x21,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x01,0x09,0x3e,0x69,0x3f,0x3f,0x69,0x3e,0x01,0x31,0xfe,0xcf,0x27,0x40,0x25,0x01,0xbd,0xfe,0x43,0x25,0x40,0x27,0x01,0x31,0x46,0x39,0x63,0x3e,0x90,0x3e,0x63,0x39,0x50,0x27,0x40,0x25,0x1e,0x50,0x1e,0x25,0x40,0x27,0x50, +0x00,0x01,0x00,0xa5,0x00,0xb6,0x01,0xbd,0x01,0xe2,0x00,0x17,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x05,0x00,0x4f,0x01,0x00,0x16,0x14,0x11,0x10,0x0f,0x0e,0x0b,0x09,0x08,0x06,0x00,0x17,0x01, +0x17,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x1a,0x36,0x3f,0x3f,0x36,0xa3,0xa3,0x1f,0x24,0xe6,0xe6,0x24,0x1f,0xa3,0xb6,0x3f,0x36,0x42,0x36,0x3f,0x2d,0x24,0x1f,0x11,0x2a,0x11,0x1f,0x24,0x2d,0x00,0x00,0x03,0x00,0xe6, +0x00,0x19,0x01,0x73,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13, +0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2d,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x20,0x20,0x27,0x27, +0x20,0x20,0x26,0x26,0x20,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x01,0x00,0x78,0x00,0x00,0x01,0xe0,0x01,0xfe,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, +0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x33,0x11,0x21,0x11,0x78,0x01,0x68,0x01,0xfe,0xfe,0x02,0x00,0x02,0x00,0x97,0x01,0xd2,0x01,0xc4,0x02,0xb2,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01, +0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x0b,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x97,0x01,0x2d,0xfe,0xd3,0x01,0x2d,0x02,0x7a,0x38,0x38,0xa8,0x38,0x38,0x00,0x00,0x00,0x00,0x03,0x00,0x55,0x00,0x4c,0x02,0x03,0x02,0x48,0x00,0x03,0x00,0x07,0x00,0x0b, +0x00,0x40,0x40,0x3d,0x00,0x00,0x06,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06, +0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0x01,0xfc,0x4c,0x4c,0xd8,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x02,0x00,0x2d,0x00,0x73,0x02,0x2b,0x02,0x21,0x00,0x0f,0x00,0x1f,0x00,0x44,0x40,0x41,0x03,0x01,0x01,0x02,0x01,0x85,0x09,0x07,0x02,0x05, +0x06,0x05,0x86,0x00,0x02,0x08,0x01,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x00,0x06,0x04,0x06,0x4f,0x10,0x10,0x01,0x00,0x10,0x1f,0x10,0x1f,0x1d,0x1a,0x18,0x17,0x15,0x12,0x0c,0x0b,0x09,0x06,0x04,0x03,0x00,0x0f,0x01,0x0e,0x0a,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x33,0x14,0x16,0x33, +0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x01,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0xf5,0x5c,0x6c,0x5a,0x3b,0x33,0x6e,0x33,0x3b,0x5a,0x6c,0x5c,0xfe,0xca,0x6c,0x5c,0x6e,0x5c,0x6c,0x5a,0x3b,0x33,0x6e,0x33,0x3b,0x01,0x77,0x5c,0x4e,0x29,0x31,0x31,0x29,0x4e,0x5c,0xfe,0xfc,0x4e,0x5c,0x5c, +0x4e,0x29,0x31,0x31,0x29,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x69,0x02,0x58,0x02,0x2b,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x07,0x01,0x03,0x05,0x02,0x03,0x67,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x11, +0x10,0x0c,0x0c,0x01,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x35,0x21,0x15,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x08,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c, +0xfd,0xd4,0x01,0x5e,0xaa,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x01,0x95,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x73,0x50,0x50,0xb9,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x01,0xf4,0x02,0xda,0x00,0x0b,0x00,0x32,0x40,0x2f,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x00,0x02,0x00,0x01, +0x00,0x02,0x01,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x21,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x50,0x01,0x4a,0xfe,0xd9,0x01,0x27,0xfe,0xb6,0x01,0xa4,0x52,0x01,0x02,0x52,0xe2, +0x52,0xfd,0x26,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x03,0x00,0x0c,0x00,0x2a,0x40,0x27,0x08,0x01,0x01,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x04,0x04,0x04,0x0c,0x04,0x0c,0x11,0x10,0x04,0x06,0x18,0x2b,0x13,0x21, +0x03,0x23,0x03,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x32,0x01,0xf4,0xbd,0x7b,0x4c,0x69,0x0d,0x11,0x04,0x04,0x13,0x0d,0x65,0x02,0xda,0xfd,0x26,0x02,0x8a,0xfe,0x5f,0x34,0x58,0x17,0x17,0x59,0x34,0x01,0xa0,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0xff,0xfb,0x02,0x08,0x02,0xd0,0x00,0x0c,0x00,0x28,0x00,0x7d,0x40,0x0a,0x0c,0x0b, +0x0a,0x09,0x05,0x01,0x00,0x07,0x00,0x4a,0x4b,0xb0,0x11,0x50,0x58,0x40,0x27,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x06,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x1b,0x40,0x29,0x00,0x02,0x00,0x04,0x00,0x02,0x04, +0x80,0x06,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x59,0x40,0x13,0x0d,0x0d,0x0d,0x28,0x0d,0x28,0x25,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x12,0x10,0x07,0x06,0x16,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26, +0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfe,0x4d,0x47,0x3b,0x23,0x30,0x26,0x23,0x16,0x16,0x19,0x55,0x47,0x3b,0x23,0x31,0x25,0x24,0x15, +0x16,0x19,0xbe,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0xfe,0x6b,0x14,0x3b,0x47,0x18,0x20,0x18,0x19,0x16,0x1c,0x14,0x3b,0x47,0x18,0x20,0x18,0x19,0x16,0x1c,0x00,0x00,0x01,0x00,0x23,0x00,0xb5,0x02,0x34,0x01,0xdf,0x00,0x25,0x00,0x2b,0x40,0x28,0x04,0x01,0x01,0x06,0x01,0x03,0x02,0x01,0x03,0x69,0x07,0x01, +0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x02,0x00,0x51,0x14,0x24,0x24,0x11,0x14,0x24,0x24,0x10,0x08,0x06,0x1e,0x2b,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x23,0x22,0x06,0x15, +0x14,0x16,0x33,0xb1,0x43,0x4b,0x4a,0x43,0x35,0x4d,0x13,0x16,0x16,0x36,0x20,0x22,0x23,0x20,0x44,0x4a,0x49,0x44,0x37,0x50,0x12,0x17,0x14,0x33,0x1f,0x23,0x23,0x20,0xb5,0x4e,0x46,0x47,0x4f,0x39,0x34,0x3d,0x3d,0x2b,0x28,0x26,0x2a,0x44,0x4d,0x47,0x47,0x4f,0x3a,0x34,0x42,0x38,0x2c,0x28,0x26,0x2a,0x00,0x00,0x00,0x01,0xff,0xb0, +0x00,0x71,0x02,0xa8,0x02,0x24,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x01,0x02,0x01,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x60,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x25,0x37,0x21,0x37,0x33,0x07,0x21,0x07,0x01,0x7f,0xbd,0xfd, +0x74,0xe9,0x40,0xbd,0x02,0x8c,0xe9,0x71,0xc3,0xf0,0xc3,0xf0,0x00,0x02,0x00,0x0a,0x00,0xeb,0x02,0x44,0x01,0xa9,0x00,0x0e,0x00,0x1a,0x00,0x34,0x40,0x31,0x00,0x02,0x00,0x05,0x03,0x02,0x05,0x69,0x00,0x03,0x00,0x00,0x04,0x03,0x00,0x67,0x06,0x01,0x04,0x01,0x01,0x04,0x59,0x06,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x04,0x01,0x51, +0x10,0x0f,0x16,0x14,0x0f,0x1a,0x10,0x1a,0x12,0x24,0x22,0x10,0x07,0x06,0x1a,0x2b,0x01,0x21,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x21,0x05,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x44,0xfe,0x82,0x07,0x33,0x23,0x28,0x37,0x37,0x28,0x23,0x33,0x07,0x01,0x7e,0xfe,0x25,0x18,0x1f,0x1f, +0x18,0x18,0x1f,0x1f,0x01,0x35,0x21,0x29,0x37,0x28,0x29,0x36,0x29,0x21,0x4c,0x1f,0x18,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0xe5,0x03,0xfc,0x00,0x0a,0x00,0x26,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x01,0x00, +0x09,0x07,0x05,0x04,0x00,0x0a,0x01,0x0a,0x04,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x33,0x15,0x01,0xb8,0x58,0x61,0x5a,0x5f,0x2d,0x6e,0x57,0x4f,0x03,0xc4,0xfc,0x3c,0x56,0x50,0x00,0x00,0x01,0x00,0x2d,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x16,0x00,0x30,0x40,0x2d,0x12,0x01,0x00,0x01,0x01,0x4c,0x00,0x02, +0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x14,0x21,0x24,0x05,0x06,0x19,0x2b,0x13,0x11,0x34,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x07,0x16,0x16,0x15,0x11,0xff,0x0e,0x2b, +0x2b,0x6e,0x6e,0x2c,0x2a,0x0e,0x5a,0x33,0x32,0x31,0x34,0xfe,0xd4,0x02,0x08,0x24,0x2c,0x14,0x50,0x14,0x2d,0x23,0x02,0x08,0xfd,0xf8,0x39,0x4a,0x09,0x09,0x4a,0x39,0xfd,0xf8,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0xe5,0x03,0x3e,0x00,0x0a,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x59, +0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x00,0x00,0x00,0x0a,0x00,0x0a,0x21,0x23,0x04,0x06,0x18,0x2b,0x13,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x11,0xff,0x61,0x58,0x2d,0x2d,0x5f,0xfe,0xd4,0x03,0xc4,0x4f,0x57,0x50,0x56,0xfc,0x3c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x58,0x02,0x9b,0x00,0x08, +0x00,0x0b,0x00,0x08,0xb5,0x0b,0x09,0x04,0x03,0x02,0x32,0x2b,0x25,0x07,0x25,0x01,0x11,0x01,0x25,0x17,0x05,0x05,0x37,0x27,0x02,0x58,0x22,0xfe,0xf5,0xfe,0xd5,0x01,0x2c,0x01,0x0b,0x21,0xfe,0xf8,0xfe,0xe2,0xd5,0xd5,0x75,0x26,0xf6,0xfe,0xed,0x02,0x69,0xfe,0xef,0xf2,0x24,0xf0,0xc5,0xc4,0xc2,0x00,0x00,0x00,0x00,0x01,0x00,0xff, +0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0xf4,0x03,0xfc,0x00,0x05,0x00,0x24,0x40,0x21, +0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x11,0x33,0x15,0xff,0x5a,0x9b,0x6e,0x04,0x6a,0xfb,0xe6,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0xf4,0x03,0x3e,0x00,0x05, +0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x15,0x23,0x11,0xff,0xf5,0x9b,0xfe,0xd4,0x04,0x6a,0x50,0xfb,0xe6,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x17, +0x02,0xd0,0x00,0x0c,0x00,0x28,0x00,0x3b,0x40,0x38,0x0c,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x01,0x04,0x03,0x01,0x59,0x02,0x01,0x00,0x00,0x04,0x03,0x00,0x04,0x69,0x00,0x01,0x01,0x03,0x62,0x06,0x05,0x02,0x03,0x01,0x03,0x52,0x0d,0x0d,0x0d,0x28,0x0d,0x28,0x25,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x12,0x10,0x07, +0x06,0x16,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0xfe,0x3e,0x47,0x3b,0x23,0x39, +0x32,0x2c,0x16,0x16,0x19,0x55,0x47,0x3b,0x23,0x3a,0x31,0x2d,0x15,0x16,0x19,0xbe,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0xfe,0xe8,0x0f,0x3b,0x47,0x15,0x1c,0x15,0x19,0x16,0x17,0x0f,0x3b,0x47,0x15,0x1c,0x15,0x19,0x16,0x17,0x00,0x03,0xff,0xf6,0x01,0x08,0x02,0x62,0x01,0x94,0x00,0x0b,0x00,0x17,0x00,0x23, +0x00,0x37,0x40,0x34,0x05,0x03,0x02,0x01,0x00,0x00,0x01,0x59,0x05,0x03,0x02,0x01,0x01,0x00,0x61,0x08,0x04,0x07,0x02,0x06,0x05,0x00,0x01,0x00,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x3d,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xd0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xcf,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0x08,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x27, +0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x01,0x00,0x41,0xff,0xec,0x02,0x17,0x02,0x26,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x00,0x04,0x03,0x04,0x86,0x00,0x00,0x07,0x01,0x01,0x02,0x00,0x01,0x67,0x06,0x01,0x02,0x03,0x03,0x02,0x57,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03, +0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x08,0x06,0x1e,0x2b,0x13,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x23,0x46,0x01,0xcc,0xba,0xbf,0xbf,0x58,0xbf,0xbf,0xba,0x02,0x26,0x46,0xe1,0x50,0xc3,0xc3,0x50,0xe1,0x00,0x02,0x00,0x00,0x00,0x41,0x02,0x58,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x08, +0xb5,0x17,0x0d,0x0a,0x00,0x02,0x32,0x2b,0x25,0x35,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x35,0x05,0x15,0x05,0x35,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x35,0x05,0x15,0x01,0x0e,0xd2,0x11,0x21,0x0a,0x0a,0x21,0x11,0xd2,0x01,0x4a,0xfd,0xa8,0xd2,0x11,0x21,0x0a,0x0a,0x21,0x11,0xd2,0x01,0x4a,0x41,0x53,0x96,0x0c,0x11,0x04, +0x04,0x14,0x0b,0x8f,0x56,0xe0,0x4e,0xe4,0x53,0x96,0x0c,0x11,0x04,0x04,0x14,0x0b,0x8f,0x56,0xe0,0x4e,0x00,0x02,0x00,0x00,0x00,0x41,0x02,0x58,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x08,0xb5,0x10,0x0d,0x03,0x00,0x02,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x05,0x25,0x35,0x25,0x15,0x07,0x06, +0x06,0x07,0x16,0x16,0x17,0x17,0x02,0x58,0xfe,0xb6,0x01,0x4a,0xd2,0x10,0x22,0x0a,0x0a,0x21,0x11,0xd2,0xfe,0xf2,0xfe,0xb6,0x01,0x4a,0xd2,0x10,0x22,0x0a,0x0a,0x21,0x11,0xd2,0x41,0xe4,0x4e,0xe0,0x56,0x8f,0x0b,0x14,0x04,0x04,0x11,0x0c,0x96,0x53,0xe4,0x4e,0xe0,0x56,0x8f,0x0b,0x14,0x04,0x04,0x11,0x0c,0x96,0x00,0x02,0x00,0x14, +0x00,0xeb,0x02,0x4e,0x01,0xa9,0x00,0x0e,0x00,0x1a,0x00,0x3a,0x40,0x37,0x00,0x01,0x00,0x05,0x00,0x01,0x05,0x69,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x07,0x01,0x04,0x02,0x02,0x04,0x59,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x04,0x02,0x51,0x10,0x0f,0x00,0x00,0x16,0x14,0x0f,0x1a,0x10,0x1a,0x00,0x0e,0x00,0x0e,0x24, +0x22,0x11,0x08,0x06,0x19,0x2b,0x13,0x35,0x21,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x14,0x01,0x7e,0x07,0x33,0x23,0x29,0x36,0x36,0x29,0x23,0x33,0x07,0x5d,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x1f,0x01,0x35,0x2a,0x21,0x29,0x36,0x29,0x28,0x37,0x29, +0x21,0x22,0x1f,0x18,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x13,0x00,0x1f,0x00,0x43,0x40,0x40,0x02,0x01,0x00,0x06,0x00,0x85,0x00,0x06,0x05,0x06,0x85,0x0a,0x01,0x09,0x04,0x01,0x04,0x09,0x01,0x80,0x07,0x01,0x05,0x08,0x01,0x04,0x09,0x05,0x04,0x67,0x00,0x01,0x03,0x03, +0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x14,0x14,0x14,0x1f,0x14,0x1f,0x11,0x11,0x11,0x11,0x14,0x33,0x13,0x33,0x10,0x0b,0x06,0x1f,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x17,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x46, +0x32,0x51,0x4a,0x32,0x4a,0x51,0x32,0x68,0x63,0x36,0x63,0x68,0xd2,0x78,0x78,0x28,0x78,0x78,0x02,0xda,0xfd,0xee,0x4a,0x51,0x51,0x4a,0x02,0x12,0xfd,0xee,0x61,0x67,0x67,0x61,0x73,0x79,0x26,0x79,0x79,0x26,0x79,0x00,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x42,0x40,0x3f, +0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b, +0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a, +0x4a,0x76,0x44,0x44,0x76,0x4a,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xcc,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x07,0x00,0x20,0x40,0x1d, +0x03,0x01,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x00,0x02,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x2b,0x02,0x02,0x5a,0xfe,0xb2,0x5a,0x02,0xda,0xfd,0x26,0x02,0x88,0xfd,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d, +0x02,0xda,0x00,0x07,0x00,0x26,0x40,0x23,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x5f,0x04,0x01,0x03,0x01,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x2b,0x5a,0x01,0x4e,0x5a,0x02,0xda,0xfd,0x78,0x02,0x88,0xfd, +0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x50,0x02,0x2b,0x02,0xf0,0x00,0x03,0x00,0x10,0x00,0x3c,0x40,0x39,0x0c,0x01,0x03,0x02,0x01,0x4c,0x00,0x02,0x01,0x03,0x01,0x02,0x03,0x80,0x06,0x04,0x02,0x03,0x03,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x05,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04, +0x10,0x04,0x10,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x2d,0x01,0xfe,0xfe,0x11,0xb3,0x7a,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x02,0xa5,0x4b,0x4b,0xfd,0xab,0x01,0xf4,0xfe,0x0c,0x01,0x40,0x20,0x3f, +0x10,0x10,0x3f,0x20,0xfe,0xc0,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x13,0x00,0x13,0x33,0x13,0x33,0x05,0x06,0x19,0x2b,0x33,0x11,0x34,0x36, +0x33,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x11,0x2b,0x75,0x6f,0x3a,0x6f,0x75,0x5a,0x48,0x44,0x36,0x44,0x48,0x01,0xfe,0x6b,0x71,0x71,0x6b,0xfe,0x02,0x01,0xfe,0x44,0x48,0x48,0x44,0xfe,0x02,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01, +0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x33,0x13,0x33,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x2b,0x5a,0x48,0x44,0x36,0x44,0x48,0x5a,0x75,0x6f,0x3a,0x6f,0x75,0x02,0xda,0xfe,0x02,0x44, +0x48,0x48,0x44,0x01,0xfe,0xfe,0x02,0x6b,0x71,0x71,0x6b,0x00,0x00,0x01,0x00,0x46,0xff,0x9c,0x02,0x12,0x03,0x0c,0x00,0x2f,0x00,0xc6,0x40,0x0a,0x17,0x01,0x07,0x03,0x07,0x01,0x04,0x07,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x46,0x00,0x06,0x05,0x06,0x85,0x00,0x08,0x05,0x03,0x07,0x08,0x72,0x00,0x04,0x07,0x09,0x03,0x04,0x72, +0x00,0x0e,0x0d,0x0e,0x86,0x00,0x05,0x00,0x03,0x07,0x05,0x03,0x69,0x00,0x07,0x00,0x09,0x02,0x07,0x09,0x6a,0x0a,0x01,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x0d,0x0d,0x00,0x57,0x0c,0x01,0x00,0x00,0x0d,0x5f,0x10,0x0f,0x02,0x0d,0x00,0x0d,0x4f,0x1b,0x40,0x48,0x00,0x06,0x05,0x06,0x85,0x00,0x08,0x05,0x03,0x05, +0x08,0x03,0x80,0x00,0x04,0x07,0x09,0x07,0x04,0x09,0x80,0x00,0x0e,0x0d,0x0e,0x86,0x00,0x05,0x00,0x03,0x07,0x05,0x03,0x69,0x00,0x07,0x00,0x09,0x02,0x07,0x09,0x6a,0x0a,0x01,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x0d,0x0d,0x00,0x57,0x0c,0x01,0x00,0x00,0x0d,0x5f,0x10,0x0f,0x02,0x0d,0x00,0x0d,0x4f,0x59,0x40, +0x1e,0x00,0x00,0x00,0x2f,0x00,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x23,0x21,0x12,0x11,0x14,0x23,0x12,0x24,0x11,0x11,0x11,0x11,0x06,0x1f,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x37,0x33,0x07,0x36,0x35,0x35,0x33,0x15,0x14, +0x06,0x23,0x22,0x27,0x07,0x33,0x15,0x23,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x46,0x87,0x2f,0xb6,0xd0,0x29,0x1a,0x22,0x21,0x18,0x2f,0x55,0x47,0x3b,0x2b,0x35,0x23,0x0f,0x47,0x3f,0x51,0x2e,0x55,0x47,0x3b,0x0e,0x0c,0x21,0xbd,0xd7,0x2f,0x01,0x06,0xfe,0xe0,0x3b,0x3f,0x3b,0x4c,0x4c,0x8c,0x4c,0x7a,0x13,0x31,0x25,0x37,0x46,0x46, +0x3b,0x47,0x21,0x2f,0x13,0xd1,0xf0,0x01,0x36,0x46,0x46,0x3a,0x48,0x02,0x63,0x4c,0x8c,0x4c,0xb0,0xb0,0x00,0x02,0x00,0x23,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x1d,0x00,0x26,0x00,0xcc,0x40,0x0a,0x21,0x01,0x06,0x05,0x05,0x01,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x32,0x00,0x03,0x02,0x02,0x03,0x70,0x0c,0x01,0x0a, +0x00,0x00,0x0a,0x71,0x04,0x01,0x02,0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06,0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x1b,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x31,0x00,0x03,0x02,0x03,0x85,0x0c,0x01,0x0a,0x00,0x00,0x0a,0x71,0x04,0x01,0x02, +0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06,0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x1b,0x40,0x30,0x00,0x03,0x02,0x03,0x85,0x0c,0x01,0x0a,0x00,0x0a,0x86,0x04,0x01,0x02,0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06, +0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x59,0x59,0x40,0x16,0x00,0x00,0x24,0x22,0x00,0x1d,0x00,0x1d,0x1c,0x1b,0x11,0x11,0x11,0x11,0x11,0x11,0x28,0x11,0x11,0x0d,0x06,0x1f,0x2b,0x17,0x37,0x23,0x35,0x33,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37, +0x33,0x07,0x33,0x15,0x23,0x03,0x33,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x03,0x14,0x16,0x17,0x13,0x23,0x22,0x06,0x15,0x66,0x28,0x5c,0x7a,0x2d,0x53,0x63,0x3a,0x67,0x45,0x7f,0x37,0x46,0x37,0x6c,0x8a,0x74,0xfe,0xfe,0xe4,0x2c,0x01,0x48,0xfe,0x9a,0x28,0x2f,0x3f,0x3a,0x74,0x61,0x43,0x49,0x6e,0x6e,0x52,0x7a,0x0d,0x73,0x56,0x2c, +0x42,0x62,0x36,0x96,0x96,0x52,0xfe,0xc4,0x52,0x76,0x52,0x6e,0x02,0x12,0x3d,0x47,0x05,0x01,0x3b,0x48,0x42,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0xff,0x92,0x02,0x35,0x03,0x3e,0x00,0x21,0x00,0x29,0x00,0x91,0x40,0x0a,0x11,0x01,0x03,0x04,0x24,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x31,0x00,0x05,0x04,0x05,0x85, +0x00,0x09,0x08,0x08,0x09,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0b,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x69,0x07,0x01,0x00,0x08,0x08,0x00,0x57,0x07,0x01,0x00,0x00,0x08,0x5f,0x0c,0x0a,0x02,0x08,0x00,0x08,0x4f,0x1b,0x40,0x30,0x00,0x05,0x04,0x05,0x85,0x00,0x09,0x08,0x09,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03, +0x67,0x0b,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x69,0x07,0x01,0x00,0x08,0x08,0x00,0x57,0x07,0x01,0x00,0x00,0x08,0x5f,0x0c,0x0a,0x02,0x08,0x00,0x08,0x4f,0x59,0x40,0x16,0x00,0x00,0x27,0x25,0x00,0x21,0x00,0x21,0x20,0x1f,0x11,0x11,0x28,0x12,0x21,0x22,0x11,0x11,0x11,0x0d,0x06,0x1f,0x2b,0x33,0x35,0x33,0x37,0x23,0x35,0x33, +0x13,0x26,0x23,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x01,0x34,0x27,0x03,0x33,0x32,0x36,0x35,0x1e,0x8e,0x2c,0xba,0xd8,0x73,0x0c,0x0e,0xfe,0xcf,0x01,0x31,0x1d,0x1a,0x39,0x46,0x40,0x34,0x3c,0x3a,0x67,0x45,0x31,0x2c,0x01,0x34,0xfe,0xae,0x28, +0x46,0x28,0x01,0x4d,0x34,0x6b,0x13,0x43,0x49,0x52,0x76,0x52,0x01,0x3a,0x02,0x52,0x05,0x9b,0xb0,0x1a,0x63,0x43,0x2c,0x41,0x63,0x36,0x76,0x52,0x6e,0x6e,0x01,0xcc,0x4f,0x23,0xfe,0xdc,0x48,0x42,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x50,0x02,0x2b,0x02,0xf0,0x00,0x03,0x00,0x10,0x00,0x3c,0x40,0x39,0x0a,0x01,0x04,0x02,0x01,0x4c, +0x03,0x01,0x02,0x01,0x04,0x01,0x02,0x04,0x80,0x06,0x01,0x04,0x04,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x05,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x10,0x04,0x10,0x0f,0x0e,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x03,0x33,0x13,0x16,0x16,0x17,0x36, +0x36,0x37,0x13,0x33,0x03,0x2d,0x01,0xfe,0xfe,0xc4,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x5b,0xb3,0x02,0xa5,0x4b,0x4b,0xfd,0xab,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0x00,0x00,0x00,0x03,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x03,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25, +0x09,0x05,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x25,0x25,0x35,0x25,0x03,0x11,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x03,0x35,0x21,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0x4c,0xea,0x13, +0x21,0x08,0x09,0x22,0x11,0x78,0x01,0xae,0xbe,0xd7,0x64,0xd7,0xfe,0x6f,0x01,0x13,0x72,0x09,0x0c,0x02,0x02,0x0e,0x08,0xfe,0x4f,0x50,0x50,0x00,0x00,0x01,0x00,0x46,0xff,0xc4,0x02,0x12,0x03,0x0c,0x00,0x3f,0x00,0xe4,0x40,0x18,0x15,0x01,0x01,0x06,0x18,0x01,0x05,0x01,0x26,0x07,0x02,0x02,0x05,0x27,0x06,0x02,0x0c,0x09,0x37,0x01, +0x08,0x0c,0x05,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x4f,0x00,0x04,0x03,0x04,0x85,0x00,0x06,0x03,0x01,0x05,0x06,0x72,0x00,0x02,0x05,0x07,0x01,0x02,0x72,0x00,0x09,0x00,0x0c,0x08,0x09,0x72,0x0e,0x01,0x0d,0x08,0x0a,0x0c,0x0d,0x72,0x00,0x0b,0x0a,0x0b,0x86,0x00,0x03,0x00,0x01,0x05,0x03,0x01,0x69,0x00,0x05,0x00,0x07,0x00,0x05, +0x07,0x6a,0x00,0x00,0x00,0x0c,0x08,0x00,0x0c,0x69,0x00,0x08,0x0d,0x0a,0x08,0x59,0x00,0x08,0x08,0x0a,0x62,0x00,0x0a,0x08,0x0a,0x52,0x1b,0x40,0x53,0x00,0x04,0x03,0x04,0x85,0x00,0x06,0x03,0x01,0x03,0x06,0x01,0x80,0x00,0x02,0x05,0x07,0x05,0x02,0x07,0x80,0x00,0x09,0x00,0x0c,0x00,0x09,0x0c,0x80,0x0e,0x01,0x0d,0x08,0x0a,0x08, +0x0d,0x0a,0x80,0x00,0x0b,0x0a,0x0b,0x86,0x00,0x03,0x00,0x01,0x05,0x03,0x01,0x69,0x00,0x05,0x00,0x07,0x00,0x05,0x07,0x6a,0x00,0x00,0x00,0x0c,0x08,0x00,0x0c,0x69,0x00,0x08,0x0d,0x0a,0x08,0x59,0x00,0x08,0x08,0x0a,0x62,0x00,0x0a,0x08,0x0a,0x52,0x59,0x40,0x1a,0x00,0x00,0x00,0x3f,0x00,0x3f,0x3d,0x3b,0x39,0x38,0x34,0x32,0x2f, +0x2e,0x26,0x23,0x12,0x23,0x13,0x23,0x12,0x24,0x23,0x0f,0x06,0x1f,0x2b,0x37,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x26,0x26,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x13,0x33,0x03,0x16,0x16,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x07,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06, +0x23,0x22,0x26,0x26,0x27,0x07,0x23,0x13,0x26,0x23,0x22,0x15,0x15,0x46,0x48,0x3a,0x1a,0x16,0x25,0x15,0x23,0x1b,0x2f,0x55,0x48,0x3a,0x2c,0x36,0x12,0x65,0x3f,0x78,0x08,0x13,0x0b,0x2f,0x55,0x47,0x3b,0x14,0x21,0x0d,0x23,0x13,0x1d,0x1e,0x15,0x2f,0x55,0x47,0x3b,0x24,0x30,0x21,0x0e,0x56,0x3f,0x67,0x0a,0x0b,0x2f,0x6e,0x46,0x3b, +0x47,0x08,0x6a,0x1a,0x2e,0x37,0x46,0x46,0x3b,0x47,0x25,0x17,0x01,0x1d,0xfe,0xad,0x07,0x09,0x37,0x46,0x46,0x3a,0x48,0x09,0x07,0x61,0x13,0x29,0x1d,0x37,0x46,0x46,0x3a,0x48,0x18,0x25,0x12,0xf4,0x01,0x22,0x05,0x37,0x46,0x00,0x00,0x03,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x1c,0x00,0x22,0x00,0x2a,0x00,0x92,0x40,0x0a, +0x10,0x01,0x03,0x04,0x20,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x31,0x00,0x05,0x04,0x05,0x85,0x00,0x07,0x06,0x06,0x07,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x09,0x01,0x02,0x0a,0x01,0x01,0x00,0x02,0x01,0x67,0x0b,0x01,0x00,0x06,0x06,0x00,0x57,0x0b,0x01,0x00,0x00,0x06,0x5f,0x0c,0x08,0x02,0x06,0x00, +0x06,0x4f,0x1b,0x40,0x30,0x00,0x05,0x04,0x05,0x85,0x00,0x07,0x06,0x07,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x09,0x01,0x02,0x0a,0x01,0x01,0x00,0x02,0x01,0x67,0x0b,0x01,0x00,0x06,0x06,0x00,0x57,0x0b,0x01,0x00,0x00,0x06,0x5f,0x0c,0x08,0x02,0x06,0x00,0x06,0x4f,0x59,0x40,0x17,0x00,0x00,0x27,0x25,0x24,0x23,0x22,0x21, +0x00,0x1c,0x00,0x1c,0x11,0x28,0x12,0x21,0x21,0x11,0x11,0x11,0x0d,0x06,0x1e,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x23,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x01,0x34,0x26,0x27,0x07,0x33,0x15,0x23,0x07,0x33,0x32,0x36,0x36,0x35,0x23,0x9f,0x3c,0xdb,0xf8, +0x3c,0x03,0xfe,0xcf,0x01,0x31,0x0f,0x0f,0x2f,0x3f,0x34,0x3e,0x50,0x3f,0x68,0x3f,0x6f,0x2e,0x3f,0x2e,0x01,0x3a,0x2c,0x23,0x37,0x86,0xa3,0x3c,0x53,0x28,0x3f,0x25,0x46,0x50,0xaa,0x50,0xaa,0x50,0x02,0x84,0x92,0x19,0x6b,0x46,0x90,0x3e,0x63,0x39,0x82,0x82,0x01,0x68,0x28,0x45,0x11,0x9c,0x50,0xaa,0x27,0x40,0x25,0x00,0x00,0x00, +0x00,0x03,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x1d,0x00,0x25,0x00,0x2b,0x00,0x90,0x40,0x0a,0x29,0x01,0x06,0x05,0x01,0x01,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x00,0x01,0x00,0x00,0x01,0x70,0x0c,0x01,0x08,0x07,0x08,0x86,0x02,0x01,0x00,0x0a,0x01,0x03,0x04,0x00,0x03,0x68,0x09,0x01,0x04,0x0b,0x01, +0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x06,0x07,0x4f,0x1b,0x40,0x2f,0x00,0x01,0x00,0x01,0x85,0x0c,0x01,0x08,0x07,0x08,0x86,0x02,0x01,0x00,0x0a,0x01,0x03,0x04,0x00,0x03,0x68,0x09,0x01,0x04,0x0b,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06, +0x07,0x5f,0x00,0x07,0x06,0x07,0x4f,0x59,0x40,0x17,0x00,0x00,0x2b,0x2a,0x22,0x20,0x1f,0x1e,0x00,0x1d,0x00,0x1d,0x21,0x31,0x11,0x11,0x11,0x11,0x11,0x28,0x0d,0x06,0x1e,0x2b,0x17,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x32,0x33,0x21,0x15,0x21,0x22,0x27,0x07, +0x03,0x33,0x37,0x23,0x22,0x06,0x06,0x15,0x15,0x14,0x16,0x17,0x37,0x23,0x78,0x34,0x3c,0x4d,0x3f,0x69,0x3e,0x6a,0x2e,0x3f,0x2e,0x88,0xa4,0x3c,0xe0,0xfd,0x3c,0x04,0x04,0x01,0x31,0xfe,0xcf,0x12,0x11,0x2f,0x3a,0x9e,0x3c,0x4e,0x27,0x40,0x25,0x29,0x22,0x36,0x81,0x3c,0x94,0x19,0x6a,0x45,0x90,0x3e,0x63,0x39,0x82,0x82,0x50,0xaa, +0x50,0xaa,0x50,0x03,0x85,0x01,0xcc,0xaa,0x27,0x40,0x25,0x8c,0x27,0x43,0x12,0x9a,0x00,0x01,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0x99,0x00,0x29,0x00,0x57,0x40,0x54,0x11,0x01,0x03,0x02,0x26,0x01,0x08,0x09,0x02,0x4c,0x00,0x04,0x02,0x04,0x85,0x05,0x01,0x02,0x03,0x02,0x85,0x0c,0x0b,0x02,0x08,0x09,0x0a,0x09,0x08,0x0a,0x80,0x00, +0x0a,0x0a,0x84,0x00,0x03,0x06,0x01,0x01,0x00,0x03,0x01,0x69,0x07,0x01,0x00,0x09,0x09,0x00,0x59,0x07,0x01,0x00,0x00,0x09,0x61,0x00,0x09,0x00,0x09,0x51,0x00,0x00,0x00,0x29,0x00,0x29,0x25,0x24,0x23,0x21,0x12,0x22,0x12,0x14,0x11,0x22,0x12,0x22,0x12,0x0d,0x06,0x1f,0x2b,0x37,0x34,0x36,0x33,0x33,0x37,0x23,0x22,0x26,0x35,0x33, +0x14,0x16,0x33,0x33,0x37,0x33,0x07,0x36,0x36,0x35,0x33,0x14,0x06,0x23,0x23,0x07,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x23,0x07,0x23,0x37,0x06,0x06,0x15,0x2d,0x6c,0x5c,0x04,0x21,0x25,0x5c,0x6c,0x5a,0x3b,0x33,0x42,0x4d,0x46,0x4c,0x27,0x2c,0x5a,0x6c,0x5c,0x03,0x21,0x24,0x5c,0x6c,0x5a,0x3b,0x33,0x42,0x4b,0x46,0x4b,0x28, +0x2c,0x73,0x4e,0x5c,0x5a,0x5c,0x4e,0x29,0x31,0xd2,0xd0,0x06,0x2e,0x24,0x4e,0x5c,0x5a,0x5c,0x4e,0x29,0x31,0xcd,0xcb,0x06,0x2e,0x24,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xba,0x02,0x03,0x02,0xda,0x00,0x0f,0x00,0x18,0x00,0x23,0x40,0x20,0x16,0x12,0x11,0x0f,0x0b,0x0a,0x09,0x06,0x05,0x04,0x03,0x01,0x00,0x0d,0x01,0x00,0x01,0x4c, +0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x15,0x17,0x02,0x06,0x18,0x2b,0x37,0x35,0x37,0x37,0x27,0x35,0x17,0x37,0x33,0x03,0x17,0x15,0x07,0x07,0x23,0x37,0x37,0x27,0x07,0x37,0x36,0x36,0x37,0x26,0x26,0x55,0x87,0x41,0xc8,0xe2,0x56,0x3f,0x5f,0x96,0xff,0x4d,0x3f,0x40,0xd3,0x38,0x2b,0x63,0x13,0x21,0x08,0x09,0x22,0x41,0x57, +0x42,0xbc,0x63,0x5a,0x71,0xf8,0xfe,0xed,0x4b,0x64,0x7f,0xdf,0xb8,0xee,0x1c,0x7d,0x31,0x09,0x0d,0x02,0x02,0x0e,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0x92,0x02,0x03,0x03,0x0c,0x00,0x17,0x00,0x20,0x00,0x6d,0x40,0x12,0x1e,0x1a,0x19,0x0f,0x0e,0x0d,0x0a,0x09,0x08,0x07,0x05,0x04,0x03,0x0d,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x0c,0x50, +0x58,0x40,0x1f,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x03,0x04,0x71,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x1b,0x40,0x1e,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03, +0x00,0x03,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x15,0x19,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x33,0x37,0x07,0x35,0x37,0x37,0x27,0x35,0x05,0x37,0x33,0x07,0x17,0x15,0x07,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x13,0x27,0x07,0x37,0x36,0x36,0x37,0x26,0x26,0x55,0x63,0x40,0xa3,0xc5,0x2d,0xf2,0x01,0x0c,0x40, +0x3f,0x49,0x6c,0xc0,0x4c,0x01,0x0c,0xfe,0xd9,0x25,0x3f,0x25,0xee,0x0e,0x18,0x26,0x13,0x21,0x08,0x09,0x22,0x52,0xbe,0x51,0x57,0x60,0x89,0x78,0x5a,0x86,0xc1,0xdc,0x36,0x64,0x60,0xe4,0x52,0x6e,0x6e,0x01,0xde,0x07,0x4a,0x13,0x09,0x0d,0x02,0x02,0x0e,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xc4,0x02,0x03,0x02,0xd9,0x00,0x1b, +0x00,0xca,0x4b,0xb0,0x09,0x50,0x58,0x40,0x34,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x0c,0x0b,0x0b,0x0c,0x71,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x1b,0x4b,0xb0, +0x0a,0x50,0x58,0x40,0x33,0x00,0x05,0x04,0x05,0x85,0x00,0x0c,0x0b,0x0b,0x0c,0x71,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x1b,0x40,0x32,0x00,0x05,0x04,0x05,0x85, +0x00,0x0c,0x0b,0x0c,0x86,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x59,0x59,0x40,0x1a,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x21,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x21,0x07,0x23,0x37,0x55,0x7c,0x2e,0xaa,0xc2,0x2e,0xf0,0x01,0x09,0x2f,0x3f,0x2f,0x66,0x7f,0x2e,0xad,0xc5,0x2e,0xf3,0xfe,0xf4,0x2c,0x3f,0x2c, +0x4c,0x4c,0x8c,0x4c,0x8c,0x4c,0x91,0x91,0x4c,0x8c,0x4c,0x8c,0x4c,0x88,0x88,0x00,0x00,0x02,0x00,0x55,0xff,0xba,0x02,0x03,0x02,0xda,0x00,0x0f,0x00,0x18,0x00,0x29,0x40,0x26,0x16,0x12,0x11,0x0e,0x0d,0x0c,0x0b,0x09,0x08,0x07,0x03,0x02,0x01,0x0d,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, +0x00,0x0f,0x00,0x0f,0x15,0x03,0x06,0x17,0x2b,0x17,0x13,0x27,0x35,0x37,0x37,0x33,0x07,0x37,0x15,0x07,0x07,0x17,0x15,0x27,0x03,0x13,0x17,0x37,0x07,0x06,0x06,0x07,0x16,0x16,0x78,0x62,0x85,0xe7,0x51,0x3f,0x44,0x7b,0x9f,0x3a,0xd9,0xf3,0x59,0x16,0x27,0x24,0x4b,0x13,0x21,0x08,0x09,0x22,0x46,0x01,0x1b,0x43,0x64,0x73,0xeb,0xc5, +0x3e,0x57,0x4e,0xa8,0x6b,0x5a,0x7a,0xfe,0xff,0x01,0x7a,0x13,0x68,0x25,0x09,0x0d,0x02,0x02,0x0d,0x00,0x00,0x02,0x00,0x55,0xff,0x92,0x02,0x03,0x03,0x0c,0x00,0x17,0x00,0x20,0x00,0x6d,0x40,0x12,0x1e,0x1a,0x19,0x10,0x0f,0x0e,0x0d,0x0b,0x0a,0x09,0x05,0x04,0x03,0x0d,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1f,0x00, +0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x03,0x04,0x71,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x1b,0x40,0x1e,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x59, +0x40,0x0e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x19,0x15,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x33,0x37,0x27,0x35,0x25,0x37,0x33,0x07,0x37,0x15,0x07,0x07,0x17,0x15,0x27,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x13,0x17,0x37,0x07,0x06,0x06,0x07,0x16,0x16,0x55,0x63,0x4e,0xb1,0x01,0x20,0x2c,0x3f,0x1f,0x42,0x64,0x49,0xad,0xc7, +0x45,0x01,0x0c,0xfe,0xd9,0x25,0x3f,0x25,0x30,0x53,0x33,0x86,0x13,0x21,0x08,0x09,0x22,0x52,0xea,0x59,0x64,0x90,0x83,0x5d,0x21,0x57,0x31,0xda,0x56,0x5a,0x63,0xcf,0x52,0x6e,0x6e,0x01,0xb1,0x29,0x9b,0x42,0x09,0x0d,0x02,0x02,0x0d,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x17,0x00,0x1b,0x00,0xca, +0x4b,0xb0,0x09,0x50,0x58,0x40,0x34,0x00,0x03,0x02,0x02,0x03,0x70,0x00,0x0a,0x09,0x09,0x0a,0x71,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x1b,0x4b,0xb0,0x0c,0x50, +0x58,0x40,0x33,0x00,0x03,0x02,0x03,0x85,0x00,0x0a,0x09,0x09,0x0a,0x71,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x1b,0x40,0x32,0x00,0x03,0x02,0x03,0x85,0x00,0x0a, +0x09,0x0a,0x86,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x59,0x59,0x40,0x1a,0x00,0x00,0x1b,0x1a,0x19,0x18,0x00,0x17,0x00,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x33,0x35,0x33,0x37,0x23,0x11,0x21,0x37,0x33,0x07,0x33,0x15,0x23,0x03,0x33,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x03,0x33,0x13,0x23,0x23,0x88,0x2c,0xb4,0x01,0x64,0x37,0x46,0x37,0x6d,0x8b,0x74,0xff,0xfe,0xe3,0x2c,0x01,0x49,0xfe,0x99,0x28,0x46,0x28,0x10,0x78,0x74, +0xec,0x52,0x76,0x01,0xe0,0x96,0x96,0x52,0xfe,0xc4,0x52,0x76,0x52,0x6e,0x6e,0x01,0x1a,0x01,0x3c,0x00,0x00,0x02,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x17,0x00,0x1f,0x00,0x43,0x40,0x40,0x1a,0x01,0x04,0x03,0x01,0x01,0x05,0x04,0x02,0x4c,0x00,0x01,0x00,0x01,0x85,0x08,0x01,0x06,0x05,0x06,0x86,0x02,0x01,0x00,0x07,0x01, +0x03,0x04,0x00,0x03,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x00,0x00,0x1d,0x1b,0x00,0x17,0x00,0x17,0x21,0x11,0x11,0x11,0x11,0x28,0x09,0x06,0x1c,0x2b,0x17,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x03,0x21,0x15,0x21,0x22,0x27,0x07,0x03, +0x14,0x17,0x13,0x23,0x22,0x06,0x15,0x78,0x43,0x46,0x52,0x3a,0x67,0x45,0x58,0x40,0x3f,0x40,0x9a,0xb7,0x6f,0x01,0x26,0xfe,0xcf,0x09,0x09,0x40,0x3a,0x5a,0x6d,0x3b,0x43,0x49,0x3c,0xbe,0x14,0x6e,0x4e,0x2c,0x42,0x62,0x36,0xb4,0xb4,0x52,0xfe,0xc4,0x52,0x01,0xb5,0x01,0x90,0x6b,0x19,0x01,0x36,0x48,0x42,0x00,0x00,0x02,0x00,0x1e, +0xff,0xc4,0x02,0x35,0x03,0x0c,0x00,0x17,0x00,0x1f,0x00,0x44,0x40,0x41,0x0b,0x01,0x01,0x02,0x1a,0x01,0x00,0x01,0x02,0x4c,0x00,0x03,0x02,0x03,0x85,0x00,0x05,0x04,0x05,0x86,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x07,0x01,0x00,0x04,0x04,0x00,0x59,0x07,0x01,0x00,0x00,0x04,0x5f,0x08,0x06,0x02,0x04,0x00,0x04,0x4f,0x00,0x00, +0x1d,0x1b,0x00,0x17,0x00,0x17,0x11,0x28,0x12,0x21,0x11,0x11,0x09,0x06,0x1c,0x2b,0x37,0x35,0x33,0x13,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x01,0x34,0x27,0x03,0x33,0x32,0x36,0x35,0x1e,0xb7,0x6f,0xfe,0xda,0x01,0x31,0x09,0x09,0x40,0x3f,0x43,0x46,0x52,0x3a,0x67, +0x45,0x58,0x40,0x3f,0x40,0x01,0x23,0x5a,0x6d,0x3b,0x43,0x49,0x78,0x52,0x01,0x3c,0x52,0x01,0xb5,0xbe,0x14,0x6e,0x4e,0x2c,0x41,0x63,0x36,0xb4,0xb4,0x01,0x04,0x6b,0x19,0xfe,0xca,0x48,0x42,0x00,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x5f,0x02,0x17,0x02,0x35,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x21,0x50,0x58,0x40,0x16,0x03,0x01,0x01, +0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x3b,0x05,0x4e,0x1b,0x40,0x1b,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07, +0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x00,0xbf,0xbf,0x58,0xbf,0xbf,0x5f,0xc3,0x50,0xc3,0xc3,0x50,0xc3,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x88,0x01,0xee,0x02,0x0e,0x00,0x0b,0x00,0x06,0xb3,0x06, +0x00,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x9c,0x33,0x8d,0x8d,0x33,0x8e,0x91,0x33,0x91,0x8e,0x34,0x8d,0x88,0x34,0x8d,0x8e,0x33,0x8d,0x91,0x34,0x91,0x8d,0x34,0x8e,0x00,0x03,0x00,0x64,0x00,0x37,0x01,0xf4,0x02,0x62,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01, +0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x07,0x01,0x03,0x05,0x02,0x03,0x67,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x11,0x10,0x0c,0x0c,0x01,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34, +0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xee,0x01,0x90,0xc8,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x01,0xcc,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xa5,0x4b,0x4b,0xf0,0x29,0x22,0x22,0x29,0x29,0x22,0x22, +0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0xaa,0x02,0x03,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06, +0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0x01,0x9a,0x50,0x50,0xf0,0x50,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xc4,0x02,0x03,0x03,0x0c,0x00,0x13,0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02, +0x67,0x07,0x01,0x01,0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x17,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x78,0x51,0x74,0x91,0x38, +0xc9,0xe5,0x67,0x3f,0x67,0x8a,0xa6,0x38,0xde,0xfb,0x51,0x3c,0xe6,0x50,0xa0,0x50,0x01,0x22,0xfe,0xde,0x50,0xa0,0x50,0xe6,0x00,0x01,0x00,0x55,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x0c,0x00,0x06,0xb3,0x0a,0x00,0x01,0x32,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09, +0x22,0x11,0xfe,0xca,0x01,0xae,0x41,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x00,0x01,0x00,0x55,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x0c,0x00,0x06,0xb3,0x03,0x00,0x01,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08, +0x09,0x22,0x11,0x01,0x36,0x41,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25,0x0c,0x0b,0x0a,0x09,0x05,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01, +0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x21,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfe,0x52,0x01,0xae,0xbe,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0xfe,0x6b,0x50,0x50,0x00, +0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25,0x0c,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06, +0x07,0x16,0x16,0x17,0x05,0x01,0x35,0x21,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0xfe,0x52,0x01,0xae,0xbe,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0xfe,0xe8,0x50,0x50,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x17,0x02,0x3a,0x00,0x0f,0x00,0x56,0x4b,0xb0, +0x18,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x03,0x03,0x3b,0x4d,0x06,0x01,0x00,0x00,0x07,0x60,0x08,0x01,0x07,0x07,0x39,0x07,0x4e,0x1b,0x40,0x1c,0x00,0x03,0x02,0x03,0x85,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x06,0x01,0x00,0x00,0x07,0x60,0x08,0x01,0x07,0x07,0x39,0x07,0x4e, +0x59,0x40,0x10,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x46,0xba,0xbf,0xbf,0x58,0xbf,0xbf,0xba,0x46,0xe1,0x50,0xc3,0xc3,0x50,0xe1,0x46,0xff,0xff,0x00,0x46,0x00,0x69,0x02,0x12,0x02,0x2b,0x02,0x26, +0x04,0x22,0x00,0x64,0x01,0x07,0x04,0x22,0x00,0x00,0xff,0x6f,0x00,0x11,0xb1,0x00,0x01,0xb0,0x64,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0xff,0x6f,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x64,0x00,0xb9,0x01,0xf4,0x01,0x8b,0x00,0x05,0x00,0x46,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00, +0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x09,0x18,0x2b,0x25,0x35,0x21,0x35,0x21,0x15,0x01,0x9f,0xfe,0xc5,0x01,0x90, +0xb9,0x82,0x50,0xd2,0x00,0x01,0x00,0x46,0x00,0xfa,0x02,0x12,0x01,0xc7,0x00,0x1b,0x00,0x68,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x02,0x01,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x06,0x05,0x02,0x03,0x01,0x03,0x52,0x1b,0x40,0x29,0x00,0x02,0x00,0x04,0x00, +0x02,0x04,0x80,0x06,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x59,0x40,0x0e,0x00,0x00,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x07,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x37,0x35,0x34,0x36,0x33,0x32, +0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0xff,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x50, +0x01,0x54,0x02,0x08,0x02,0xda,0x00,0x0c,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x08,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x50,0xb3, +0x54,0xb1,0x51,0x70,0x08,0x0d,0x03,0x04,0x0e,0x09,0x73,0x01,0x54,0x01,0x86,0xfe,0x7a,0x01,0x02,0x14,0x25,0x0a,0x0a,0x25,0x14,0xfe,0xfe,0x00,0x00,0x03,0x00,0x23,0x00,0xa0,0x02,0x35,0x01,0xf9,0x00,0x1b,0x00,0x2a,0x00,0x39,0x00,0x4b,0x40,0x48,0x17,0x09,0x02,0x04,0x05,0x01,0x4c,0x02,0x01,0x01,0x07,0x01,0x05,0x04,0x01,0x05, +0x69,0x0a,0x06,0x09,0x03,0x04,0x00,0x00,0x04,0x59,0x0a,0x06,0x09,0x03,0x04,0x04,0x00,0x61,0x03,0x08,0x02,0x00,0x04,0x00,0x51,0x2c,0x2b,0x1d,0x1c,0x01,0x00,0x33,0x31,0x2b,0x39,0x2c,0x39,0x25,0x23,0x1c,0x2a,0x1d,0x2a,0x16,0x14,0x0f,0x0d,0x08,0x06,0x00,0x1b,0x01,0x1b,0x0b,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x35,0x34,0x36, +0x33,0x32,0x17,0x33,0x3e,0x02,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x0e,0x02,0x27,0x32,0x3e,0x02,0x37,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x17,0x16,0xa6,0x3b,0x48,0x4c,0x3d,0x66,0x24,0x03,0x05,0x1d,0x33,0x24,0x3b,0x48,0x4b,0x3e,0x66, +0x24,0x03,0x04,0x1e,0x32,0x1c,0x1d,0x24,0x15,0x0a,0x01,0x1f,0x16,0x2c,0x1f,0x27,0x27,0x01,0x19,0x20,0x26,0x26,0x20,0x1c,0x25,0x15,0x0a,0x01,0x1f,0x16,0xa0,0x4a,0x3d,0x4b,0x3d,0x4a,0x63,0x16,0x2d,0x20,0x4a,0x3d,0x4b,0x3d,0x4a,0x63,0x15,0x2e,0x20,0x3c,0x17,0x20,0x1c,0x06,0x54,0x34,0x29,0x22,0x4b,0x22,0x29,0x29,0x22,0x4b, +0x22,0x29,0x17,0x20,0x1c,0x06,0x54,0x34,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x18,0x00,0x22,0x00,0x2c,0x00,0x4f,0x40,0x4c,0x0d,0x0a,0x02,0x04,0x00,0x2b,0x2a,0x1d,0x1c,0x04,0x05,0x04,0x17,0x01,0x02,0x02,0x05,0x03,0x4c,0x00,0x01,0x00,0x01,0x85,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x00,0x00,0x04,0x05,0x00, +0x04,0x69,0x07,0x01,0x05,0x02,0x02,0x05,0x59,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x05,0x02,0x51,0x24,0x23,0x00,0x00,0x23,0x2c,0x24,0x2c,0x20,0x1e,0x00,0x18,0x00,0x18,0x27,0x12,0x27,0x08,0x06,0x19,0x2b,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26, +0x27,0x07,0x03,0x14,0x16,0x17,0x13,0x26,0x23,0x22,0x06,0x06,0x13,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x16,0x14,0x50,0x33,0x3b,0x51,0x8d,0x58,0x4f,0x43,0x3f,0x47,0x54,0x35,0x3d,0x51,0x8c,0x59,0x2a,0x4c,0x21,0x3a,0x0b,0x24,0x20,0xfc,0x2e,0x36,0x3f,0x63,0x3a,0xdc,0x3f,0x63,0x3a,0x27,0x21,0xfd,0x30,0x77,0x2a,0x7d,0x4a, +0x59,0x8c,0x51,0x22,0x5e,0x7e,0x2a,0x7e,0x4c,0x58,0x8d,0x51,0x13,0x12,0x57,0x01,0x68,0x33,0x57,0x1f,0x01,0x78,0x17,0x3c,0x68,0xfe,0xd8,0x3c,0x69,0x41,0x35,0x59,0x1f,0xfe,0x87,0x1a,0x00,0x01,0x00,0x3c,0x00,0x32,0x02,0x1c,0x02,0x26,0x00,0x0c,0x00,0x1f,0x40,0x1c,0x08,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03, +0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x06,0x18,0x2b,0x37,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x3c,0xb3,0x7a,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x32,0x01,0xf4,0xfe,0x0c,0x01,0x40,0x20,0x3f,0x10,0x10,0x3f,0x20,0xfe,0xc0,0x00,0x00,0x00,0x01,0x00,0x3c, +0x00,0x32,0x02,0x1c,0x02,0x26,0x00,0x0c,0x00,0x1f,0x40,0x1c,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x06,0x18,0x2b,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xef,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b, +0x72,0x5b,0xb3,0x32,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x13,0x00, +0x13,0x33,0x13,0x33,0x05,0x06,0x19,0x2b,0x33,0x11,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x11,0x2b,0x75,0x6f,0x3a,0x6f,0x75,0x5a,0x48,0x44,0x36,0x44,0x48,0x01,0xfe,0x6b,0x71,0x71,0x6b,0xfe,0x02,0x01,0xfe,0x44,0x48,0x48,0x44,0xfe,0x02,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d, +0x02,0xda,0x00,0x13,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x33,0x13,0x33,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x2b,0x5a,0x48,0x44,0x36,0x44, +0x48,0x5a,0x75,0x6f,0x3a,0x6f,0x75,0x02,0xda,0xfe,0x02,0x44,0x48,0x48,0x44,0x01,0xfe,0xfe,0x02,0x6b,0x71,0x71,0x6b,0x00,0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x12,0x00,0x28,0x40,0x25,0x00,0x01,0x00,0x02,0x00,0x01,0x02,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03, +0x4f,0x00,0x00,0x00,0x12,0x00,0x11,0x21,0x25,0x21,0x05,0x06,0x19,0x2b,0x15,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x69,0x35,0x3e,0x51,0x49,0xa1,0xa1,0x40,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x02,0x40,0x42,0x49,0x50,0x3c,0xfd,0xc1,0x58,0x6b,0x00,0x00,0x00,0xff,0xff,0x00,0x32, +0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x02,0x54,0x00,0x00,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x02,0xda,0x00,0x0b,0x00,0x2a,0x40,0x27,0x06,0x05,0x02,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11, +0x07,0x06,0x1b,0x2b,0x17,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x6e,0x46,0x02,0x08,0x46,0x5a,0xc8,0xb4,0x03,0x3c,0x52,0x52,0xfc,0xc4,0x03,0x3c,0xfc,0xc4,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0x4c,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x37,0x40,0x34,0x08,0x02,0x02,0x02,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x01, +0x02,0x02,0x4b,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x05,0x06,0x19,0x2b,0x17,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x15,0x37,0x01,0x13,0xfe,0xed,0x01,0xe5,0xfe,0x89,0x01,0x12, +0xfe,0xec,0x01,0x79,0xb4,0x52,0x01,0x75,0x01,0x75,0x52,0x52,0xfe,0x8b,0xfe,0x8b,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0f,0x00,0x2e,0x40,0x2b,0x00,0x03,0x01,0x03,0x85,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x00,0x02,0x04,0x04,0x02,0x57,0x00,0x02,0x02,0x04,0x5f,0x05,0x01,0x04,0x02, +0x04,0x4f,0x00,0x00,0x00,0x0f,0x00,0x0f,0x14,0x14,0x11,0x11,0x06,0x06,0x1a,0x2b,0x21,0x03,0x23,0x35,0x33,0x13,0x16,0x16,0x07,0x33,0x26,0x36,0x37,0x13,0x33,0x03,0x01,0x0c,0x7f,0x6f,0xaf,0x63,0x08,0x06,0x01,0x09,0x01,0x07,0x09,0xa0,0x54,0xd4,0x01,0xd6,0x50,0xfe,0x7b,0x22,0x33,0x0b,0x0b,0x34,0x21,0x02,0x39,0xfd,0x26,0x00, +0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x1b,0x00,0x29,0x00,0x3f,0x40,0x3c,0x0c,0x0a,0x02,0x03,0x04,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x03,0x00,0x51,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c, +0x29,0x1d,0x29,0x12,0x11,0x08,0x06,0x00,0x1b,0x01,0x1b,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x2e,0x02,0x27,0x33,0x30,0x1e,0x03,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x62,0x70,0x61,0x57,0x3e,0x4b,0x07,0x02, +0x31,0x4e,0x5a,0x2a,0x87,0x2b,0x40,0x40,0x2b,0x70,0x62,0x3a,0x3e,0x3d,0x3b,0x3a,0x3e,0x3e,0x0a,0x73,0x64,0x50,0x62,0x70,0x37,0x32,0x19,0x36,0x62,0x52,0x3e,0x13,0x1b,0x36,0x4e,0x67,0x3f,0xc8,0x64,0x73,0x50,0x46,0x41,0x50,0x42,0x45,0x46,0x41,0x50,0x41,0x46,0x00,0xff,0xff,0x00,0x5d,0xff,0x4c,0x01,0xfb,0x02,0x26,0x02,0x06, +0x02,0x80,0x00,0x00,0x00,0x02,0x00,0x9b,0x00,0x00,0x01,0xbd,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x63, +0x5a,0xfe,0xde,0x5a,0x02,0xda,0xfd,0x26,0x02,0xda,0xfd,0x26,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00, +0x00,0x01,0x00,0xff,0xff,0x88,0x02,0x2b,0x03,0xfc,0x00,0x0a,0x00,0x10,0x40,0x0d,0x0a,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x05,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x02,0x2b,0x5d,0x86,0x49,0x5a,0x71,0x61,0x78,0x17,0x6e,0xa0,0x61,0x02,0xee,0xfd,0x12,0x75,0xa2,0x17,0x00,0x01,0x00,0xff, +0xfe,0xd4,0x02,0x2b,0x03,0x48,0x00,0x0a,0x00,0x16,0x40,0x13,0x06,0x05,0x02,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x0a,0x00,0x0a,0x02,0x06,0x16,0x2b,0x13,0x11,0x34,0x36,0x36,0x37,0x15,0x06,0x06,0x15,0x11,0xff,0x49,0x86,0x5d,0x61,0x71,0xfe,0xd4,0x02,0xee,0x62,0x9f,0x6e,0x17,0x58,0x17,0xa2,0x75,0xfd,0x12,0x00, +0xff,0xff,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x02,0x06,0x04,0x32,0x00,0x00,0x00,0x01,0x00,0x2d,0xff,0x88,0x01,0x59,0x03,0xfc,0x00,0x0a,0x00,0x10,0x40,0x0d,0x01,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x17,0x35,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x2d,0x62,0x70,0x5a,0x48,0x87,0x78, +0x58,0x17,0xa2,0x75,0x02,0xee,0xfd,0x12,0x61,0xa0,0x6e,0x00,0x00,0x01,0x00,0x2d,0xfe,0xd4,0x01,0x59,0x03,0x48,0x00,0x0a,0x00,0x10,0x40,0x0d,0x06,0x05,0x02,0x00,0x4a,0x00,0x00,0x00,0x76,0x10,0x01,0x06,0x17,0x2b,0x01,0x23,0x11,0x34,0x26,0x27,0x35,0x1e,0x02,0x15,0x01,0x59,0x5a,0x70,0x62,0x5d,0x87,0x48,0xfe,0xd4,0x02,0xee, +0x75,0xa2,0x17,0x58,0x17,0x6e,0x9f,0x62,0x00,0x05,0x00,0x0e,0xff,0xfb,0x02,0x4a,0x02,0xdf,0x00,0x0d,0x00,0x11,0x00,0x1f,0x00,0x2d,0x00,0x3b,0x00,0x99,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2c,0x0c,0x01,0x04,0x0a,0x01,0x00,0x07,0x04,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01, +0x38,0x4d,0x0e,0x01,0x08,0x08,0x03,0x61,0x0d,0x06,0x0b,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x34,0x0c,0x01,0x04,0x0a,0x01,0x00,0x07,0x04,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x38,0x4d,0x0b,0x01,0x03,0x03,0x39,0x4d,0x0e,0x01,0x08,0x08,0x06, +0x61,0x0d,0x01,0x06,0x06,0x42,0x06,0x4e,0x59,0x40,0x2b,0x2f,0x2e,0x21,0x20,0x13,0x12,0x0e,0x0e,0x01,0x00,0x36,0x34,0x2e,0x3b,0x2f,0x3b,0x28,0x26,0x20,0x2d,0x21,0x2d,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x0f,0x09,0x16,0x2b,0x13,0x22,0x26,0x37,0x35,0x26,0x36,0x33,0x32, +0x16,0x17,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x13,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x22,0x26,0x35,0x35,0x26,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x99,0x40,0x4b,0x01,0x01,0x4b,0x40,0x40,0x4b,0x01,0x4b,0xcc,0x01, +0xf2,0x4a,0xfe,0x0e,0x42,0x1e,0x23,0x23,0x1e,0x1e,0x23,0x23,0x01,0x42,0x40,0x4b,0x01,0x4c,0x40,0x40,0x4b,0x4b,0x40,0x1e,0x23,0x23,0x1f,0x1d,0x23,0x01,0x23,0x01,0x90,0x49,0x3e,0x41,0x3e,0x49,0x49,0x3e,0x41,0x3e,0x49,0xfe,0x70,0x02,0xda,0xfd,0x26,0x01,0xd4,0x24,0x1f,0x41,0x1f,0x24,0x24,0x1f,0x41,0x1f,0x24,0xfe,0x27,0x49, +0x3e,0x41,0x3e,0x49,0x49,0x3e,0x41,0x3e,0x49,0x45,0x23,0x1f,0x41,0x1f,0x24,0x24,0x1f,0x41,0x1f,0x23,0x00,0x06,0xff,0xfb,0xff,0xfb,0x02,0x72,0x02,0xdf,0x00,0x0d,0x00,0x11,0x00,0x1f,0x00,0x39,0x00,0x47,0x00,0x55,0x00,0xb7,0xb6,0x37,0x2a,0x02,0x0a,0x0b,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x31,0x10,0x01,0x04,0x0e,0x01, +0x00,0x07,0x04,0x00,0x69,0x08,0x01,0x07,0x0d,0x01,0x0b,0x0a,0x07,0x0b,0x6a,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x38,0x4d,0x13,0x0c,0x12,0x03,0x0a,0x0a,0x03,0x61,0x09,0x11,0x06,0x0f,0x04,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x39,0x10,0x01,0x04,0x0e,0x01,0x00,0x07,0x04,0x00,0x69,0x08,0x01,0x07,0x0d,0x01,0x0b,0x0a, +0x07,0x0b,0x6a,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x38,0x4d,0x0f,0x01,0x03,0x03,0x39,0x4d,0x13,0x0c,0x12,0x03,0x0a,0x0a,0x06,0x61,0x09,0x11,0x02,0x06,0x06,0x42,0x06,0x4e,0x59,0x40,0x37,0x49,0x48,0x3b,0x3a,0x21,0x20,0x13,0x12,0x0e,0x0e,0x01,0x00,0x50,0x4e,0x48,0x55,0x49,0x55,0x42,0x40,0x3a, +0x47,0x3b,0x47,0x35,0x33,0x2e,0x2c,0x28,0x26,0x20,0x39,0x21,0x39,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x14,0x09,0x16,0x2b,0x13,0x22,0x26,0x27,0x35,0x26,0x36,0x33,0x32,0x16,0x17,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x13,0x32,0x36,0x35,0x35,0x26,0x26,0x23,0x22,0x06,0x15, +0x15,0x14,0x16,0x13,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x27,0x32,0x36,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x33,0x32,0x36,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x7d,0x37,0x40,0x01,0x01,0x41,0x37, +0x37,0x41,0x01,0x40,0xba,0x01,0xb6,0x43,0xfe,0x4a,0x3f,0x1a,0x1f,0x01,0x1e,0x1a,0x1a,0x1f,0x1f,0xf6,0x32,0x3b,0x01,0x3b,0x31,0x26,0x2e,0x02,0x03,0x2f,0x25,0x32,0x3a,0x3a,0x32,0x26,0x2e,0x02,0x04,0x2f,0x1f,0x17,0x1b,0x01,0x1c,0x17,0x17,0x1c,0x01,0x1c,0xbb,0x17,0x1b,0x01,0x1c,0x17,0x17,0x1c,0x01,0x1c,0x01,0xb8,0x3e,0x35, +0x41,0x35,0x3e,0x3e,0x35,0x41,0x35,0x3e,0xfe,0x48,0x02,0xda,0xfd,0x26,0x01,0xf3,0x1f,0x19,0x41,0x1a,0x1e,0x1e,0x1a,0x41,0x19,0x1f,0xfe,0x08,0x40,0x37,0x38,0x38,0x40,0x26,0x20,0x20,0x26,0x40,0x38,0x38,0x37,0x40,0x26,0x20,0x20,0x26,0x35,0x23,0x1f,0x38,0x1f,0x24,0x24,0x1f,0x38,0x1f,0x23,0x23,0x1f,0x38,0x1f,0x24,0x24,0x1f, +0x38,0x1f,0x23,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x01,0xe0,0x01,0x65,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b, +0x2b,0x21,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x07,0x8f,0x8f,0x4a,0x8f,0x8f,0x93,0x40,0x92,0x92,0x40,0x93,0x00,0x00,0x00,0x01,0x00,0xa0,0x01,0x31,0x01,0xb8,0x02,0x49,0x00,0x0b,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05, +0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x0b,0x1b,0x2b,0x01,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x04,0x64,0x64,0x50,0x64,0x64,0x01,0x31,0x69,0x46,0x69,0x69,0x46,0x69,0x00,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x37,0x02,0x08,0x02,0x58,0x00,0x12, +0x00,0x33,0x40,0x30,0x00,0x02,0x01,0x02,0x85,0x00,0x03,0x01,0x00,0x01,0x03,0x00,0x80,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x03,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x00,0x00,0x00,0x12,0x00,0x12,0x13,0x13,0x11,0x13,0x06,0x06,0x1a,0x2b,0x25,0x2e,0x02,0x23,0x35,0x32,0x36,0x36,0x37,0x33,0x0e, +0x02,0x07,0x1e,0x02,0x17,0x01,0xae,0x08,0x63,0xa3,0x69,0x69,0xa3,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x37,0x45,0x65,0x37,0x64,0x36,0x63,0x43,0x4c,0x73,0x45,0x05,0x07,0x48,0x7a,0x4f,0x00,0x02,0x00,0x37,0x00,0x00,0x02,0x08,0x02,0xd5,0x00,0x12,0x00,0x16,0x00,0x47,0x40,0x44,0x00,0x02,0x01,0x02,0x85,0x00, +0x03,0x01,0x00,0x01,0x03,0x00,0x80,0x07,0x01,0x04,0x00,0x05,0x00,0x04,0x05,0x80,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x13,0x13,0x00,0x00,0x13,0x16,0x13,0x16,0x15,0x14,0x00,0x12,0x00,0x12,0x13,0x13,0x11,0x13,0x09,0x06,0x1a,0x2b,0x25, +0x2e,0x02,0x23,0x35,0x32,0x36,0x36,0x37,0x33,0x0e,0x02,0x07,0x1e,0x02,0x17,0x05,0x35,0x21,0x15,0x01,0xae,0x08,0x63,0xa3,0x69,0x69,0xa3,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0xfe,0x2f,0x01,0xcc,0xb4,0x45,0x65,0x37,0x64,0x36,0x63,0x43,0x4c,0x73,0x45,0x05,0x07,0x48,0x7a,0x4f,0xb4,0x50,0x50,0x00,0x00,0x00, +0x00,0x04,0x00,0x37,0xff,0xf6,0x02,0x20,0x01,0xfe,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x47,0x40,0x44,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x07,0x01,0x05,0x04,0x04,0x05,0x59,0x07,0x01,0x05,0x05,0x04,0x61,0x0b,0x06,0x0a,0x03,0x04,0x05,0x04,0x51,0x25,0x24,0x19,0x18,0x0d,0x0c,0x01,0x00,0x2b, +0x29,0x24,0x2f,0x25,0x2f,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21, +0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xce,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0xfe,0x97,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x01,0x21,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x01,0x5c,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d, +0xfe,0x9a,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x00,0x00,0x00,0x04,0x00,0x55,0x00,0x4c,0x02,0x03,0x03,0x17,0x00,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0xaa,0x4b,0xb0,0x24,0x50,0x58,0x40,0x3b,0x0b,0x01,0x04,0x03,0x06,0x03,0x04,0x72,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00, +0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x06,0x0c,0x01,0x05,0x07,0x06,0x05,0x69,0x00,0x07,0x0d,0x01,0x08,0x09,0x07,0x08,0x67,0x00,0x09,0x0a,0x0a,0x09,0x57,0x00,0x09,0x09,0x0a,0x5f,0x0e,0x01,0x0a,0x09,0x0a,0x4f,0x1b,0x40,0x3c,0x0b,0x01,0x04,0x03,0x06,0x03,0x04,0x06,0x80,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00, +0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x06,0x0c,0x01,0x05,0x07,0x06,0x05,0x69,0x00,0x07,0x0d,0x01,0x08,0x09,0x07,0x08,0x67,0x00,0x09,0x0a,0x0a,0x09,0x57,0x00,0x09,0x09,0x0a,0x5f,0x0e,0x01,0x0a,0x09,0x0a,0x4f,0x59,0x40,0x25,0x24,0x24,0x20,0x20,0x15,0x14,0x00,0x00,0x24,0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x22,0x21, +0x1b,0x19,0x14,0x1f,0x15,0x1f,0x00,0x13,0x00,0x13,0x24,0x21,0x24,0x21,0x0f,0x06,0x1a,0x2b,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xff,0x49,0x18,0x1d,0x1d,0x18, +0x86,0x87,0x33,0x3d,0x3d,0x33,0x13,0x1c,0x12,0x15,0x15,0x12,0x12,0x15,0x15,0xd7,0x01,0xae,0xfe,0x52,0x01,0xae,0x02,0x21,0x55,0x1d,0x18,0x18,0x1d,0x37,0x3a,0x32,0x2f,0x38,0x23,0x73,0x14,0x10,0x11,0x13,0x13,0x11,0x10,0x14,0x8a,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0xff,0xff,0x00,0xd9,0xff,0xf6,0x01,0x7f,0x02,0x30,0x02,0x06, +0x03,0x2b,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x3a,0x02,0xa8,0x00,0x15,0x00,0x19,0x00,0x3c,0x40,0x39,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x06,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x16,0x16,0x01,0x00,0x16,0x19,0x16,0x19, +0x18,0x17,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x08,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x05,0x35,0x21,0x15,0x01,0x09,0x45,0x67,0x3a,0x3a,0x67,0x45,0x01,0x31,0xfe,0xcf,0x43,0x49,0x49,0x43,0x01,0x31,0xfd,0xf8,0x02,0x08, +0xc8,0x36,0x63,0x41,0x2c,0x42,0x62,0x36,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0xc8,0x52,0x52,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x35,0x02,0xa8,0x00,0x15,0x00,0x19,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04, +0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x16,0x16,0x00,0x00,0x16,0x19,0x16,0x19,0x18,0x17,0x00,0x15,0x00,0x14,0x21,0x25,0x21,0x08,0x06,0x19,0x2b,0x37,0x35,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x05,0x35,0x21,0x15,0x1e,0x01,0x31,0x43,0x49,0x49,0x43,0xfe,0xcf, +0x01,0x31,0x45,0x67,0x3a,0x3a,0x67,0x45,0xfe,0xcf,0x02,0x08,0xc8,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x36,0x62,0x42,0x2c,0x41,0x63,0x36,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x4b,0x02,0xa8,0x01,0xdb,0x00,0x31,0x00,0x4c,0x40,0x49,0x14,0x09,0x02,0x01,0x00,0x2c,0x21,0x1a,0x13,0x08,0x01,0x06,0x06,0x01,0x2b,0x20, +0x02,0x05,0x06,0x03,0x4c,0x04,0x02,0x02,0x00,0x01,0x00,0x85,0x0a,0x09,0x07,0x03,0x05,0x06,0x05,0x86,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06,0x01,0x06,0x52,0x00,0x00,0x00,0x31,0x00,0x31,0x27,0x11,0x27,0x12,0x17,0x21,0x17,0x21,0x12,0x0b,0x06,0x1f,0x2b,0x27,0x37,0x27,0x33,0x17,0x33, +0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x33,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x07,0x50,0x9f,0x9f,0x6a,0x7d,0x88,0x11,0x28,0x0d,0x07,0x19,0x0d,0x57,0x6a,0x7d,0x18,0x11,0x28,0x0d,0x07, +0x19,0x0d,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0x18,0x7d,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0x88,0x7d,0x4b,0xc8,0xc8,0xa0,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xa0,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xc8,0xc8,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0xa0,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0xa0,0x00, +0x00,0x01,0x00,0x73,0xff,0x92,0x01,0x59,0x03,0xfc,0x00,0x0a,0x00,0x26,0x40,0x23,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x03,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x06,0x04,0x02,0x00,0x0a,0x01,0x0a,0x04,0x06,0x16,0x2b,0x17,0x23,0x35,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x06,0xa0, +0x2d,0x2d,0x5f,0x5a,0x60,0x6e,0x50,0x56,0x03,0xc4,0xfc,0x3c,0x4f,0x57,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x02,0x2b,0x03,0xfc,0x00,0x16,0x00,0x2a,0x40,0x27,0x05,0x01,0x03,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x03,0x00,0x86,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f, +0x21,0x24,0x18,0x10,0x04,0x06,0x1a,0x2b,0x01,0x23,0x11,0x34,0x36,0x37,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x01,0x59,0x5a,0x34,0x31,0x32,0x33,0x5a,0x0e,0x2b,0x2b,0x6e,0x6e,0x2b,0x2b,0x0e,0xfe,0xd4,0x02,0x08,0x39,0x4a,0x09,0x09,0x4a,0x39,0x02,0x08,0xfd,0xf8,0x23,0x2d,0x14, +0x50,0x14,0x2c,0x24,0x00,0x01,0x00,0x73,0xfe,0xd4,0x01,0x59,0x03,0x3e,0x00,0x0a,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x59,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x02,0x01,0x51,0x21,0x22,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x11,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x01,0x59,0x5a,0x5f,0x2d, +0x2d,0x59,0x60,0xfe,0xd4,0x03,0xc4,0x56,0x50,0x57,0x4f,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x58,0x02,0x9b,0x00,0x08,0x00,0x0b,0x00,0x08,0xb5,0x0a,0x09,0x04,0x03,0x02,0x32,0x2b,0x11,0x37,0x05,0x01,0x11,0x01,0x05,0x27,0x25,0x05,0x11,0x07,0x23,0x01,0x09,0x01,0x2c,0xfe,0xd3,0xfe,0xf7,0x22,0x01,0x07,0x01,0x1f,0xd6,0x02, +0x58,0x25,0xf3,0x01,0x11,0xfd,0x97,0x01,0x13,0xf1,0x23,0xf0,0xc2,0x01,0x86,0xc3,0xff,0xff,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x02,0x06,0x03,0xf4,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0x92,0x01,0x59,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f, +0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x05,0x23,0x35,0x33,0x11,0x33,0x01,0x59,0xf5,0x9b,0x5a,0x6e,0x50,0x04,0x1a,0x00,0x00,0x01,0x00,0x64,0xfe,0xd4,0x01,0x59,0x03,0x3e,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01, +0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x11,0x23,0x35,0x33,0x01,0x59,0x5a,0x9b,0xf5,0xfe,0xd4,0x04,0x1a,0x50,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02, +0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x31,0x11,0x33,0x15,0x21,0x15,0x21,0x11,0x5a,0x01,0xfe,0xfe,0x02,0x02,0x58,0xff,0x50,0xfe,0xf7,0x00,0x00,0x04,0x00,0x55,0x00,0x4c,0x02,0x03,0x02,0xd1,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x52,0x40,0x4f,0x00,0x01,0x00,0x03,0x02,0x01, +0x03,0x69,0x09,0x01,0x02,0x08,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x1c,0x1c,0x18,0x18,0x0d,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17, +0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x01,0x2c,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0xbc,0x01,0xae,0xfe,0x52, +0x01,0xae,0x01,0xed,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0xfe,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x02,0x00,0xb4,0x00,0xd2,0x01,0xa4,0x01,0xc2,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02, +0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23, +0x2d,0x2d,0x23,0x23,0x2d,0x2d,0xd2,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0xff,0xff,0x00,0x46,0x00,0xfa,0x02,0x12,0x01,0xc7,0x02,0x06,0x04,0x22,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x17,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00, +0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x3c,0x01,0xe0,0x5a,0xfe,0xd4,0x02,0x17,0xfd,0xe9,0x01,0xc5,0xfe,0x3b,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x17,0x00,0x07, +0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x5f,0x00,0x03,0x01,0x03,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x3c,0x5a,0x01,0x2c,0x5a,0xfe,0x20,0x02,0x17,0xfe,0x3b,0x01,0xc5,0xfd,0xe9,0x00,0x00,0x00,0x00,0x03,0x00,0x00, +0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x07,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x09,0x08,0x00,0x00,0x0f,0x0d,0x08,0x13,0x09,0x13,0x07,0x06,0x05,0x04, +0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xfa,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x1e,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0xce,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00, +0x00,0x03,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3b,0x40,0x38,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x07,0x01,0x05,0x02,0x04,0x05,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09, +0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x35,0x21,0x15,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x5a,0x01,0x40,0x1e,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0xde,0x50,0x50,0x00,0x05,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x06,0x00,0x09, +0x00,0x0c,0x00,0x0f,0x00,0x33,0x40,0x30,0x0c,0x0b,0x09,0x08,0x04,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x0f,0x0e,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x01,0x37,0x21, +0x17,0x17,0x11,0x05,0x27,0x11,0x37,0x07,0x21,0x02,0x58,0xfe,0xd2,0xc2,0xfe,0x7a,0xf7,0xc9,0xfe,0xd0,0xc4,0xf8,0xcb,0x01,0x94,0x1e,0x02,0x58,0xfd,0xa8,0x01,0x64,0xc2,0xf6,0xc7,0x01,0x90,0xc9,0xc6,0xfe,0x76,0x91,0xcb,0x00,0x00,0x05,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13, +0x00,0x4e,0x40,0x4b,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x04,0x0b,0x02,0x03,0x09,0x01,0x06,0x07,0x03,0x06,0x67,0x08,0x0c,0x02,0x07,0x01,0x01,0x07,0x57,0x08,0x0c,0x02,0x07,0x07,0x01,0x5f,0x0a,0x01,0x01,0x07,0x01,0x4f,0x0c,0x0c,0x04,0x04,0x00,0x00,0x13,0x12,0x11,0x10,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x0b,0x0a,0x09, +0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0d,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x01,0x35,0x23,0x15,0x21,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x21,0x33,0x35,0x23,0x02,0x58,0xfe,0xa8,0xce,0x01,0x26,0xce,0xce,0xce,0xce,0xfe,0xda,0xce,0xce,0x1e,0x02,0x58,0xfd,0xa8,0x01,0x54,0xd2,0xd2,0xd2,0xfe,0x0c,0xd2, +0xd2,0xd2,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x5a,0x02,0x3a,0x02,0x3a,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x37,0x11,0x21,0x15,0x21,0x11, +0x21,0x15,0x23,0x02,0x17,0xfe,0x43,0x01,0xbd,0x5a,0x01,0xe0,0x52,0xfe,0xc4,0x52,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x3a,0x02,0xa8,0x00,0x07,0x00,0x0b,0x00,0x39,0x40,0x36,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x06,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01, +0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x37,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x05,0x35,0x21,0x15,0x23,0x02,0x17,0xfe,0x43,0x01,0xbd,0xfd,0xe9,0x02,0x17,0xc8,0x01,0xe0,0x52,0xfe,0xc4,0x52,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0x00,0x1e, +0x00,0x5a,0x02,0x35,0x02,0x3a,0x00,0x07,0x00,0x22,0x40,0x1f,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x25,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x02,0x35,0xfd,0xe9,0x01,0xbd,0xfe,0x43,0x02,0x17,0x5a,0x52, +0x01,0x3c,0x52,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x35,0x02,0xa8,0x00,0x07,0x00,0x0b,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b, +0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x37,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x05,0x35,0x21,0x15,0x1e,0x01,0xbd,0xfe,0x43,0x02,0x17,0xfd,0xe9,0x02,0x17,0xc8,0x52,0x01,0x3c,0x52,0xfe,0x20,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0xda,0x01,0xa4,0x01,0xd0,0x00,0x09,0x00,0x18,0x40,0x15, +0x04,0x01,0x00,0x4a,0x09,0x08,0x07,0x01,0x04,0x00,0x49,0x01,0x01,0x00,0x00,0x76,0x12,0x12,0x02,0x06,0x18,0x2b,0x37,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0xe3,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0xda,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43,0x00,0x00,0x00,0x04,0x00,0x55,0x00,0x54,0x02,0x03,0x02,0x40,0x00,0x03, +0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00,0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f, +0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0x02,0x04,0x3c,0x3c,0x90,0x3c,0x3c,0x90, +0x3c,0x3c,0x90,0x3c,0x3c,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x78,0x02,0x3a,0x02,0x58,0x00,0x15,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x03,0x00,0x4f,0x01,0x00,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x05,0x06,0x16, +0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x09,0x45,0x67,0x3a,0x3a,0x67,0x45,0x01,0x31,0xfe,0xcf,0x43,0x49,0x49,0x43,0x01,0x31,0x78,0x36,0x63,0x41,0x2c,0x42,0x62,0x36,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x00,0x01,0x00,0x50,0x00,0x37,0x02,0x21, +0x02,0x58,0x00,0x12,0x00,0x33,0x40,0x30,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x02,0x03,0x02,0x00,0x03,0x80,0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x00,0x03,0x02,0x59,0x00,0x02,0x02,0x03,0x61,0x00,0x03,0x02,0x03,0x51,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x13,0x13,0x14,0x06,0x06,0x1a,0x2b,0x37,0x3e,0x02,0x37,0x2e,0x02,0x27, +0x33,0x1e,0x02,0x33,0x15,0x22,0x06,0x06,0x07,0x50,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x5a,0x09,0x62,0xa3,0x69,0x69,0xa3,0x62,0x09,0x37,0x4f,0x7a,0x48,0x07,0x05,0x45,0x73,0x4c,0x43,0x63,0x36,0x64,0x37,0x65,0x45,0x00,0x00,0x01,0x00,0x23,0x00,0x46,0x02,0x3a,0x02,0x8a,0x00,0x1b,0x00,0x32,0x40,0x2f,0x00,0x04,0x00,0x03, +0x02,0x04,0x03,0x67,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1a,0x21,0x24,0x11,0x14,0x21,0x07,0x06,0x1b,0x2b,0x37,0x35,0x21,0x32,0x36,0x36,0x35,0x35,0x21,0x35,0x21,0x35,0x34,0x26,0x26,0x23,0x21,0x35,0x21,0x32, +0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x01,0x31,0x28,0x3f,0x25,0xfe,0x43,0x01,0xbd,0x25,0x3f,0x28,0xfe,0xcf,0x01,0x31,0x3f,0x68,0x3f,0x3f,0x68,0x3f,0x46,0x50,0x27,0x40,0x25,0x1e,0x50,0x1e,0x25,0x40,0x27,0x50,0x39,0x63,0x3e,0x90,0x3e,0x63,0x39,0x00,0x00,0x00,0x02,0x00,0x37,0xff,0x4c,0x02,0x1c,0x02,0xda,0x00,0x0b, +0x00,0x11,0x00,0x3a,0x40,0x37,0x11,0x0e,0x08,0x03,0x02,0x01,0x06,0x02,0x01,0x01,0x4c,0x00,0x00,0x05,0x01,0x01,0x02,0x00,0x01,0x67,0x04,0x01,0x02,0x03,0x03,0x02,0x57,0x04,0x01,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x10,0x0f,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x07,0x06,0x19,0x2b,0x17,0x35, +0x13,0x03,0x35,0x21,0x15,0x21,0x13,0x03,0x21,0x15,0x25,0x33,0x13,0x03,0x23,0x13,0x37,0xfa,0xfa,0x01,0xe5,0xfe,0xb4,0xfa,0xfa,0x01,0x4c,0xfe,0x46,0x41,0xfd,0xfd,0x41,0xfc,0xb4,0x32,0x01,0x94,0x01,0x96,0x32,0x2e,0xfe,0x62,0xfe,0x6c,0x2e,0x2e,0x01,0x98,0x01,0x9a,0xfe,0x66,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x78,0x02,0x35, +0x02,0x58,0x00,0x15,0x00,0x28,0x40,0x25,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x15,0x00,0x14,0x21,0x25,0x21,0x05,0x06,0x19,0x2b,0x37,0x35,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x15, +0x14,0x06,0x06,0x23,0x1e,0x01,0x31,0x43,0x49,0x49,0x43,0xfe,0xcf,0x01,0x31,0x45,0x67,0x3a,0x3a,0x67,0x45,0x78,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x36,0x62,0x42,0x2c,0x41,0x63,0x36,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57, +0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xff,0x02,0x58,0xff,0x02,0x08,0x50,0x50,0xfd,0xf8,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x24,0x40,0x21,0x00,0x03,0x02,0x03, +0x85,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x21,0x23,0x11,0x21,0x35,0x21,0x35,0x33,0x02,0x58,0x5a,0xfe,0x02,0x01,0xfe,0x5a,0x01,0x09,0x50,0xff,0x00,0x00,0x00,0x03,0x00,0x43,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x13, +0x00,0x16,0x00,0x1a,0x00,0x96,0xb5,0x15,0x01,0x02,0x03,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x33,0x00,0x05,0x04,0x05,0x85,0x00,0x08,0x07,0x07,0x08,0x71,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0e,0x0a,0x02,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x07,0x07,0x00,0x57,0x0c,0x01,0x00,0x00,0x07,0x5f, +0x0d,0x09,0x02,0x07,0x00,0x07,0x4f,0x1b,0x40,0x32,0x00,0x05,0x04,0x05,0x85,0x00,0x08,0x07,0x08,0x86,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0e,0x0a,0x02,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x07,0x07,0x00,0x57,0x0c,0x01,0x00,0x00,0x07,0x5f,0x0d,0x09,0x02,0x07,0x00,0x07,0x4f,0x59,0x40,0x1c,0x14, +0x14,0x00,0x00,0x1a,0x19,0x18,0x17,0x14,0x16,0x14,0x16,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x33,0x35,0x33,0x13,0x23,0x35,0x33,0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x33,0x11,0x21,0x07,0x23,0x37,0x01,0x35,0x07,0x17,0x23,0x03,0x33,0x50,0x39,0x5f,0x75,0x93,0x53,0xfe,0xf7,0x01, +0x27,0x25,0x46,0x25,0x37,0xfe,0xbd,0x28,0x46,0x28,0x01,0x2f,0x4e,0x4e,0x6c,0x5f,0xcb,0x52,0x01,0x02,0x52,0xe2,0x52,0x64,0x64,0xfd,0x26,0x6e,0x6e,0x01,0xa6,0xd4,0xd4,0x52,0xfe,0xfe,0x00,0x03,0x00,0x1d,0xff,0xf6,0x02,0x3b,0x02,0x30,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3c,0x40,0x39,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00, +0x69,0x05,0x01,0x03,0x02,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x61,0x08,0x04,0x07,0x03,0x02,0x03,0x02,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22, +0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xe9,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0x6f,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0xb0,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0xfe,0x46,0x23,0x1e,0x1d,0x22, +0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x00,0x03,0x00,0x41,0x00,0x26,0x02,0x17,0x02,0x6f,0x00,0x1b,0x00,0x37,0x00,0x53,0x01,0x0c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x65,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x12,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x08,0x06,0x0a,0x07,0x08,0x72,0x13,0x01,0x0b,0x07,0x09, +0x0a,0x0b,0x72,0x00,0x0e,0x0c,0x10,0x0d,0x0e,0x72,0x14,0x01,0x11,0x0d,0x0f,0x10,0x11,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x00,0x0a,0x07,0x06,0x0a,0x69,0x00,0x07,0x00,0x09,0x0c,0x07,0x09,0x6a,0x00,0x0c,0x00,0x10,0x0d,0x0c,0x10,0x69,0x00,0x0d,0x11,0x0f,0x0d,0x59, +0x00,0x0d,0x0d,0x0f,0x62,0x00,0x0f,0x0d,0x0f,0x52,0x1b,0x40,0x6b,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x12,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x08,0x06,0x0a,0x06,0x08,0x0a,0x80,0x13,0x01,0x0b,0x07,0x09,0x07,0x0b,0x09,0x80,0x00,0x0e,0x0c,0x10,0x0c,0x0e,0x10,0x80,0x14,0x01,0x11,0x0d,0x0f,0x0d,0x11,0x0f,0x80, +0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x00,0x0a,0x07,0x06,0x0a,0x69,0x00,0x07,0x00,0x09,0x0c,0x07,0x09,0x6a,0x00,0x0c,0x00,0x10,0x0d,0x0c,0x10,0x69,0x00,0x0d,0x11,0x0f,0x0d,0x59,0x00,0x0d,0x0d,0x0f,0x62,0x00,0x0f,0x0d,0x0f,0x52,0x59,0x40,0x2e,0x38,0x38,0x1c,0x1c,0x00, +0x00,0x38,0x53,0x38,0x53,0x50,0x4e,0x4b,0x49,0x46,0x45,0x42,0x40,0x3d,0x3b,0x1c,0x37,0x1c,0x37,0x34,0x32,0x2f,0x2d,0x2a,0x29,0x26,0x24,0x21,0x1f,0x00,0x1b,0x00,0x1b,0x23,0x23,0x13,0x23,0x23,0x15,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23, +0x22,0x06,0x15,0x15,0x07,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x07,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x41,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18, +0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x01,0xd9,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f, +0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0xd7,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0xd7,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x33, +0x40,0x30,0x0b,0x01,0x03,0x04,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x01,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x01,0x04,0x4f,0x00,0x00,0x10,0x0f,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x06,0x06,0x19,0x2b,0x33,0x03,0x33,0x17,0x33,0x37,0x33,0x03,0x27,0x16,0x16,0x17,0x36, +0x36,0x37,0x37,0x23,0xef,0xbd,0x5b,0x32,0xd9,0x32,0x5c,0xbe,0x60,0x0d,0x13,0x04,0x05,0x12,0x0d,0x36,0xb4,0x02,0xda,0xca,0xca,0xfd,0x26,0xeb,0x34,0x5a,0x17,0x17,0x59,0x34,0xda,0x00,0x00,0x03,0xff,0xf6,0x00,0x19,0x02,0x62,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00, +0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16, +0x15,0x14,0x06,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x1c,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xfe,0xf1,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xfe,0xf0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27, +0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x02,0x02,0x01,0x57,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x11,0x11,0x11,0x10,0x04, +0x06,0x1a,0x2b,0x13,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0xff,0x5a,0xff,0xfd,0xa8,0xff,0x02,0x58,0xfd,0xf8,0x50,0x50,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xbc,0x00,0x0c,0x00,0x10,0x00,0x39,0x40,0x36,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x05,0x01,0x02,0x03,0x02,0x85,0x00,0x03,0x04,0x04, +0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x06,0x01,0x04,0x03,0x04,0x4f,0x0d,0x0d,0x00,0x00,0x0d,0x10,0x0d,0x10,0x0f,0x0e,0x00,0x0c,0x00,0x0c,0x18,0x11,0x07,0x06,0x18,0x2b,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x05,0x35,0x21,0x15,0xef,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x5b,0xb3,0xfe, +0xec,0x01,0xae,0xc8,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0xc8,0x50,0x50,0x00,0x00,0x00,0x00,0x06,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x1a,0x00,0x25,0x00,0x32,0x00,0x3f,0x00,0x4b,0x00,0x40,0x40,0x3d,0x4a,0x46,0x42,0x3e,0x3a,0x36,0x30,0x2c,0x27,0x25,0x22,0x1e,0x1a,0x17, +0x13,0x0f,0x02,0x01,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x04,0x01,0x02,0x00,0x00,0x02,0x59,0x04,0x01,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x41,0x40,0x01,0x00,0x40,0x4b,0x41,0x4b,0x09,0x07,0x00,0x0f,0x01,0x0f,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06, +0x03,0x16,0x16,0x17,0x26,0x26,0x35,0x35,0x06,0x06,0x07,0x25,0x14,0x06,0x07,0x36,0x36,0x37,0x37,0x26,0x26,0x27,0x13,0x17,0x36,0x36,0x35,0x34,0x27,0x07,0x06,0x06,0x07,0x16,0x16,0x25,0x14,0x16,0x17,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x06,0x01,0x32,0x37,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x16,0x01,0x2c,0x58,0x8d, +0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xd9,0x11,0x38,0x17,0x05,0x05,0x3c,0x60,0x1c,0x01,0x0c,0x06,0x05,0x18,0x37,0x12,0x62,0x1c,0x60,0x3c,0x55,0x3b,0x23,0x27,0x05,0x62,0x12,0x3e,0x1c,0x14,0x2e,0xfe,0x89,0x27,0x23,0x3b,0x0d,0x2d,0x14,0x1c,0x3e,0x12,0x62,0x05,0x01,0x04,0x3f,0x36,0x3b,0x0c,0x22,0x0c,0x0c,0x22,0x0c, +0x3b,0x36,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x96,0x06,0x1a,0x0e,0x1a,0x37,0x13,0x6b,0x09,0x42,0x32,0x12,0x13,0x37,0x1a,0x0e,0x1a,0x06,0x24,0x32,0x42,0x09,0xfe,0x9b,0x55,0x23,0x5f,0x37,0x1b,0x1b,0x25,0x07,0x10,0x04,0x14,0x35,0x53,0x37,0x5f,0x23,0x55,0x12,0x34,0x14,0x04,0x10,0x07,0x25, +0x1b,0xfe,0xe1,0x1a,0x56,0x11,0x3c,0x1a,0x1a,0x3b,0x12,0x56,0x1a,0x00,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x18,0x00,0x21,0x00,0x42,0x40,0x3f,0x00,0x01,0x07,0x01,0x02,0x03,0x01,0x02,0x69,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x67,0x08,0x01,0x04,0x00,0x00,0x04,0x59,0x08,0x01,0x04,0x04, +0x00,0x61,0x06,0x01,0x00,0x04,0x00,0x51,0x1a,0x19,0x11,0x10,0x01,0x00,0x1e,0x1d,0x19,0x21,0x1a,0x21,0x15,0x14,0x10,0x18,0x11,0x18,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x06,0x07,0x21,0x2e,0x02,0x03,0x32,0x36,0x36, +0x37,0x21,0x1e,0x02,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x43,0x6e,0x47,0x09,0x02,0x02,0x09,0x47,0x6e,0x43,0x43,0x6e,0x47,0x09,0xfd,0xfe,0x09,0x47,0x6e,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x39,0x63,0x40,0x40,0x63,0x39,0xfd,0xf8,0x39,0x63,0x40,0x40, +0x63,0x39,0x00,0x00,0x00,0x04,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x16,0x00,0x20,0x00,0x27,0x00,0x4e,0x40,0x4b,0x00,0x01,0x09,0x01,0x02,0x03,0x01,0x02,0x69,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x67,0x0a,0x01,0x06,0x00,0x00,0x06,0x59,0x0a,0x01,0x06,0x06,0x00,0x61, +0x08,0x01,0x00,0x06,0x00,0x51,0x22,0x21,0x11,0x10,0x01,0x00,0x25,0x24,0x21,0x27,0x22,0x27,0x1f,0x1e,0x1a,0x19,0x14,0x13,0x10,0x16,0x11,0x16,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0b,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x21,0x26,0x26,0x01,0x14,0x17, +0x21,0x36,0x35,0x34,0x27,0x21,0x06,0x01,0x32,0x36,0x37,0x21,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4b,0x78,0x20,0x01,0xc6,0x20,0x78,0xfe,0xb1,0x04,0x02,0x00,0x04,0x04,0xfe,0x00,0x04,0x01,0x04,0x4b,0x78,0x20,0xfe,0x3a,0x20,0x78,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59, +0x58,0x8d,0x51,0x02,0x3a,0x47,0x3b,0x3b,0x47,0xfe,0xfc,0x1a,0x18,0x18,0x1a,0x1a,0x18,0x18,0xfe,0xe2,0x47,0x3b,0x3b,0x47,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x19,0x00,0x23,0x00,0x3a,0x40,0x37,0x22,0x21,0x14,0x13,0x04,0x03,0x02,0x01,0x4c,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x69,0x05,0x01,0x03, +0x00,0x00,0x03,0x59,0x05,0x01,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x03,0x00,0x51,0x1b,0x1a,0x01,0x00,0x1a,0x23,0x1b,0x23,0x17,0x15,0x09,0x07,0x00,0x0f,0x01,0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x14,0x16,0x17,0x01,0x26,0x23,0x22,0x06,0x06,0x01,0x32, +0x36,0x36,0x35,0x34,0x26,0x27,0x01,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xfe,0xa3,0x2f,0x28,0x01,0x21,0x36,0x3e,0x4a,0x76,0x44,0x01,0x04,0x4a,0x76,0x44,0x33,0x2b,0xfe,0xde,0x39,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36,0x3c,0x66,0x23,0x01,0xaf,0x1a,0x44, +0x76,0xfe,0xb2,0x44,0x76,0x4a,0x3f,0x69,0x23,0xfe,0x4f,0x1e,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x42,0x40,0x3f,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x00,0x04,0x08,0x01,0x05,0x02,0x04,0x05,0x67,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01, +0x00,0x02,0x00,0x51,0x20,0x20,0x11,0x10,0x01,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16, +0x27,0x35,0x21,0x15,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x56,0x01,0x40,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xdc,0x50,0x50,0x00,0x00,0x00, +0x00,0x05,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x2f,0x00,0x46,0x40,0x43,0x2d,0x2c,0x2b,0x25,0x24,0x23,0x1f,0x19,0x15,0x14,0x13,0x0b,0x03,0x02,0x01,0x4c,0x00,0x01,0x05,0x01,0x02,0x03,0x01,0x02,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x04,0x01, +0x00,0x03,0x00,0x51,0x29,0x28,0x11,0x10,0x01,0x00,0x28,0x2f,0x29,0x2f,0x10,0x17,0x11,0x17,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x17,0x37,0x26,0x26,0x13,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x05,0x14,0x16,0x17, +0x37,0x27,0x06,0x06,0x01,0x32,0x36,0x37,0x27,0x07,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x2e,0x51,0x21,0x9e,0x9f,0x20,0x50,0x04,0x9f,0x19,0x1b,0x1b,0x18,0xfe,0x2b,0x1a,0x18,0x9c,0x9c,0x18,0x1a,0x01,0x04,0x2d,0x4f,0x20,0x9e,0x9d,0x21,0x50,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51, +0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x1b,0x19,0x9d,0x9f,0x18,0x1a,0xfe,0xfb,0x9e,0x20,0x51,0x2e,0x2e,0x50,0x21,0x9f,0x2d,0x50,0x20,0x9c,0x9d,0x20,0x4f,0xfe,0xcf,0x1a,0x17,0x9f,0x9d,0x18,0x1b,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0x6c,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x42,0x40,0x3f,0x00,0x01,0x00,0x03, +0x05,0x01,0x03,0x69,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x21,0x22,0x26,0x26, +0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44, +0x76,0x4a,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xcc,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x00,0x05,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x15,0x00,0x1b,0x00,0x21,0x00,0x27, +0x00,0x4b,0x40,0x48,0x17,0x15,0x02,0x02,0x01,0x27,0x1d,0x02,0x00,0x04,0x02,0x4c,0x00,0x01,0x02,0x01,0x85,0x06,0x01,0x00,0x04,0x00,0x86,0x07,0x03,0x02,0x02,0x04,0x04,0x02,0x57,0x07,0x03,0x02,0x02,0x02,0x04,0x5f,0x05,0x08,0x02,0x04,0x02,0x04,0x4f,0x1c,0x1c,0x16,0x16,0x01,0x00,0x23,0x22,0x1c,0x21,0x1c,0x21,0x16,0x1b,0x16, +0x1b,0x11,0x10,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x33,0x2e,0x02,0x27,0x07,0x35,0x0e,0x02,0x07,0x05,0x15,0x3e,0x02,0x37,0x21,0x23,0x1e,0x02,0x17,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x2d,0xd5, +0x08,0x3a,0x5b,0x38,0x58,0x38,0x5b,0x3a,0x08,0x01,0x2d,0x38,0x5b,0x3a,0x08,0xfe,0xd3,0xd5,0x08,0x3a,0x5b,0x38,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x5e,0x39,0x5b,0x3c,0x09,0xd9,0xd9,0x09,0x3c,0x5b,0x39,0x50,0xd9,0x09,0x3c,0x5b,0x39,0x39,0x5b,0x3c,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x28, +0x00,0x00,0x02,0x30,0x02,0xe4,0x00,0x0e,0x00,0x15,0x40,0x12,0x0e,0x0d,0x0c,0x0b,0x07,0x04,0x00,0x07,0x00,0x4a,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x01,0x27,0x26,0x26,0x27,0x11,0x23,0x11,0x06,0x06,0x07,0x07,0x35,0x25,0x05,0x02,0x30,0xb4,0x10,0x16,0x02,0x50,0x04,0x14,0x0e,0xb6,0x01,0x03,0x01,0x05,0x01,0x99,0xa0, +0x0e,0x1c,0x07,0xfd,0x96,0x02,0x6a,0x09,0x1c,0x0c,0xa2,0x6b,0xe2,0xe1,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0xed,0x02,0x1c,0x02,0xda,0x00,0x0e,0x00,0x26,0x40,0x23,0x0a,0x09,0x08,0x04,0x03,0x05,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0c,0x11, +0x03,0x06,0x17,0x2b,0x13,0x37,0x21,0x11,0x07,0x11,0x34,0x36,0x37,0x01,0x27,0x01,0x06,0x06,0x23,0x4c,0x4f,0x01,0x81,0x53,0x05,0x05,0xfe,0x95,0x39,0x01,0x6e,0x0a,0x24,0x14,0x02,0x8b,0x4f,0xfe,0x7b,0x53,0x01,0x1a,0x10,0x22,0x0b,0xfe,0x94,0x39,0x01,0x6e,0x07,0x02,0x00,0x01,0x00,0x14,0x00,0x32,0x02,0x4e,0x02,0x62,0x00,0x0d, +0x00,0x30,0x40,0x2d,0x0c,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x14,0x11,0x13,0x05,0x06,0x19,0x2b,0x25,0x37,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03, +0x01,0x0a,0x9e,0x1a,0x1a,0xfe,0x38,0x01,0xc3,0x0c,0x19,0x0a,0x9e,0x69,0xdb,0xdc,0x32,0xc9,0x22,0x05,0x50,0x05,0x14,0x0d,0xca,0xfe,0xe9,0xfe,0xe7,0x00,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x1c,0x01,0xed,0x00,0x0e,0x00,0x20,0x40,0x1d,0x0c,0x0b,0x07,0x06,0x05,0x05,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, +0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x1a,0x30,0x02,0x06,0x18,0x2b,0x37,0x21,0x32,0x16,0x17,0x01,0x37,0x01,0x26,0x26,0x35,0x11,0x17,0x11,0x21,0x4c,0x01,0x0f,0x14,0x24,0x0a,0xfe,0x92,0x39,0x01,0x6b,0x05,0x05,0x53,0xfe,0x7f,0x4f,0x02,0x07,0x01,0x6e,0x39,0xfe,0x94,0x0b,0x22,0x10,0x01,0x1a,0x53,0xfe,0x7b,0x00,0x00,0x00, +0x00,0x01,0x00,0x28,0xff,0xf6,0x02,0x30,0x02,0xda,0x00,0x0e,0x00,0x15,0x40,0x12,0x0b,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x49,0x00,0x00,0x00,0x76,0x19,0x01,0x06,0x17,0x2b,0x01,0x15,0x05,0x25,0x35,0x17,0x16,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x37,0x02,0x30,0xfe,0xfb,0xfe,0xfd,0xb6,0x0e,0x14,0x04,0x50,0x02,0x16,0x10, +0x01,0x41,0x6a,0xe1,0xe2,0x6b,0xa2,0x0c,0x1c,0x09,0x02,0x6a,0xfd,0x96,0x08,0x1b,0x0e,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x29,0x01,0xed,0x00,0x0e,0x00,0x27,0x40,0x24,0x0a,0x09,0x08,0x04,0x03,0x05,0x01,0x4a,0x02,0x01,0x01,0x00,0x00,0x01,0x57,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00, +0x00,0x0e,0x00,0x0c,0x11,0x03,0x06,0x17,0x2b,0x25,0x07,0x21,0x11,0x37,0x11,0x14,0x06,0x07,0x01,0x17,0x01,0x36,0x36,0x33,0x02,0x0c,0x4f,0xfe,0x7f,0x53,0x05,0x05,0x01,0x6b,0x39,0xfe,0x92,0x0b,0x23,0x14,0x4f,0x4f,0x01,0x85,0x53,0xfe,0xe6,0x10,0x22,0x0b,0x01,0x6c,0x39,0xfe,0x92,0x07,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x0a, +0x00,0x32,0x02,0x44,0x02,0x62,0x00,0x0d,0x00,0x2a,0x40,0x27,0x02,0x01,0x03,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x03,0x00,0x86,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x11,0x14,0x12,0x10,0x04,0x06,0x1a,0x2b,0x25,0x23,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21, +0x16,0x17,0x01,0x4e,0x68,0xdc,0xdb,0x69,0x9e,0x0a,0x19,0x0c,0x01,0xc3,0xfe,0x38,0x1a,0x1a,0x32,0x01,0x19,0x01,0x17,0xca,0x0d,0x14,0x05,0x50,0x05,0x22,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0xed,0x02,0x29,0x02,0xda,0x00,0x0e,0x00,0x20,0x40,0x1d,0x0c,0x0b,0x07,0x06,0x05,0x05,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01, +0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1a,0x30,0x02,0x06,0x18,0x2b,0x01,0x21,0x22,0x26,0x27,0x01,0x07,0x01,0x16,0x16,0x15,0x11,0x27,0x11,0x21,0x02,0x0c,0xfe,0xf1,0x14,0x23,0x0b,0x01,0x6e,0x39,0xfe,0x95,0x05,0x05,0x53,0x01,0x81,0x02,0x8b,0x02,0x07,0xfe,0x92,0x39,0x01,0x6c,0x0b,0x22,0x10,0xfe,0xe6,0x53,0x01,0x85,0x00, +0x00,0x01,0xff,0xb0,0x00,0x32,0x02,0xa8,0x02,0x62,0x00,0x17,0x00,0x35,0x40,0x32,0x12,0x05,0x02,0x05,0x02,0x01,0x4c,0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x14,0x14,0x12,0x13,0x07, +0x06,0x1b,0x2b,0x13,0x16,0x17,0x17,0x23,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x37,0x22,0x1a,0x1a,0x9e,0x68,0xdc,0xdb,0x69,0x9e,0x0a,0x19,0x0c,0x02,0x0a,0x0c,0x19,0x0a,0x9e,0x69,0xdb,0xdc,0x68,0x9e,0x1a,0x1a,0x01,0x22,0x05,0x22,0xc9,0x01,0x19,0x01,0x17,0xca,0x0d,0x14, +0x05,0x05,0x14,0x0d,0xca,0xfe,0xe9,0xfe,0xe7,0xc9,0x22,0x05,0x00,0x01,0x00,0x28,0xff,0x56,0x02,0x30,0x03,0x84,0x00,0x19,0x00,0x06,0xb3,0x19,0x0c,0x01,0x32,0x2b,0x37,0x35,0x17,0x16,0x16,0x17,0x11,0x06,0x06,0x07,0x07,0x35,0x25,0x05,0x15,0x27,0x26,0x26,0x27,0x11,0x36,0x36,0x37,0x37,0x15,0x05,0x28,0xb6,0x0e,0x14,0x04,0x04, +0x14,0x0e,0xb6,0x01,0x03,0x01,0x05,0xb4,0x10,0x16,0x02,0x02,0x16,0x10,0xb4,0xfe,0xfb,0x38,0x6b,0xa2,0x0c,0x1c,0x09,0x03,0x3a,0x09,0x1c,0x0c,0xa2,0x6b,0xe2,0xe1,0x6a,0xa0,0x0e,0x1c,0x07,0xfc,0xc6,0x08,0x1b,0x0e,0xa0,0x6a,0xe1,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0xa0,0x02,0x4e,0x01,0xbd,0x00,0x21,0x00,0x7d,0x40,0x0a, +0x11,0x01,0x02,0x03,0x14,0x01,0x06,0x00,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x29,0x08,0x01,0x07,0x01,0x04,0x06,0x07,0x72,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x00,0x00,0x06,0x01,0x00,0x06,0x69,0x00,0x01,0x07,0x04,0x01,0x59,0x00,0x01,0x01,0x04,0x61,0x05,0x01,0x04,0x01,0x04,0x51,0x1b,0x40,0x2a,0x08,0x01,0x07, +0x01,0x04,0x01,0x07,0x04,0x80,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x00,0x00,0x06,0x01,0x00,0x06,0x69,0x00,0x01,0x07,0x04,0x01,0x59,0x00,0x01,0x01,0x04,0x61,0x05,0x01,0x04,0x01,0x04,0x51,0x59,0x40,0x10,0x00,0x00,0x00,0x21,0x00,0x21,0x24,0x23,0x12,0x11,0x12,0x24,0x23,0x09,0x06,0x1d,0x2b,0x37,0x35,0x34,0x36,0x33, +0x32,0x1e,0x03,0x33,0x32,0x37,0x37,0x23,0x35,0x33,0x17,0x15,0x23,0x35,0x07,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x0a,0x4c,0x3a,0x23,0x2c,0x1d,0x15,0x17,0x11,0x1d,0x1c,0x55,0x8c,0xcd,0x46,0x50,0x4d,0x33,0x47,0x22,0x2c,0x1c,0x16,0x18,0x12,0x14,0x1f,0xa5,0x31,0x3d,0x4b,0x17,0x21,0x21,0x17,0x21,0x60,0x4e,0x46, +0xd7,0xa1,0x60,0x41,0x17,0x21,0x21,0x17,0x20,0x1a,0x31,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x25,0x00,0x7f,0x40,0x0c,0x14,0x02,0x02,0x01,0x07,0x15,0x01,0x02,0x06,0x01,0x02,0x4c,0x4b,0xb0,0x0b,0x50,0x58,0x40,0x29,0x04,0x01,0x00,0x02,0x00,0x85,0x0a,0x09,0x02,0x05,0x06,0x06,0x05,0x71,0x00,0x02,0x00, +0x07,0x01,0x02,0x07,0x69,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06,0x01,0x06,0x52,0x1b,0x40,0x28,0x04,0x01,0x00,0x02,0x00,0x85,0x0a,0x09,0x02,0x05,0x06,0x05,0x86,0x00,0x02,0x00,0x07,0x01,0x02,0x07,0x69,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06, +0x01,0x06,0x52,0x59,0x40,0x12,0x00,0x00,0x00,0x25,0x00,0x25,0x23,0x23,0x21,0x13,0x11,0x23,0x23,0x21,0x13,0x0b,0x06,0x1f,0x2b,0x37,0x27,0x35,0x37,0x33,0x07,0x33,0x32,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x33,0x27,0x33,0x17,0x15,0x07,0x23,0x37,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x23,0x17,0x8d,0x83,0x83,0x5e,0x98, +0x34,0x11,0x1e,0x22,0x2b,0x1f,0x1f,0x2b,0x22,0x1e,0x11,0x47,0x98,0x69,0x79,0x79,0x68,0x6e,0x1e,0x24,0x2b,0x1c,0x1b,0x15,0x15,0x1b,0x1b,0x29,0x23,0x0d,0x6e,0x5f,0x91,0x46,0x91,0xa5,0x20,0x2b,0x20,0x20,0x2b,0x20,0xa5,0x91,0x46,0x91,0x74,0x20,0x29,0x20,0x20,0x29,0x20,0x74,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e, +0x01,0xc7,0x00,0x11,0x00,0x68,0xb6,0x04,0x03,0x02,0x05,0x02,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x22,0x03,0x01,0x01,0x02,0x02,0x01,0x70,0x06,0x01,0x00,0x05,0x05,0x00,0x71,0x04,0x01,0x02,0x05,0x05,0x02,0x57,0x04,0x01,0x02,0x02,0x05,0x60,0x08,0x07,0x02,0x05,0x02,0x05,0x50,0x1b,0x40,0x20,0x03,0x01,0x01,0x02,0x01,0x85, +0x06,0x01,0x00,0x05,0x00,0x86,0x04,0x01,0x02,0x05,0x05,0x02,0x57,0x04,0x01,0x02,0x02,0x05,0x60,0x08,0x07,0x02,0x05,0x02,0x05,0x50,0x59,0x40,0x10,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x11,0x09,0x06,0x1d,0x2b,0x37,0x17,0x23,0x27,0x35,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x15,0x21,0x17,0x23,0x27, +0x69,0x82,0x5e,0x83,0x83,0x5f,0x83,0x81,0x81,0x61,0x88,0x01,0x0a,0xfe,0xf5,0x88,0x60,0x81,0xeb,0x8c,0x91,0x46,0x91,0x8c,0x8c,0x8c,0x50,0x8c,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x11,0x00,0x61,0xb6,0x0f,0x0e,0x02,0x00,0x03,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x21,0x06,0x01,0x04, +0x03,0x03,0x04,0x70,0x07,0x01,0x01,0x00,0x00,0x01,0x71,0x05,0x01,0x03,0x00,0x00,0x03,0x57,0x05,0x01,0x03,0x03,0x00,0x60,0x02,0x01,0x00,0x03,0x00,0x50,0x1b,0x40,0x1f,0x06,0x01,0x04,0x03,0x04,0x85,0x07,0x01,0x01,0x00,0x01,0x86,0x05,0x01,0x03,0x00,0x00,0x03,0x57,0x05,0x01,0x03,0x03,0x00,0x60,0x02,0x01,0x00,0x03,0x00,0x50, +0x59,0x40,0x0b,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x08,0x06,0x1e,0x2b,0x25,0x23,0x07,0x23,0x37,0x21,0x35,0x21,0x27,0x33,0x17,0x33,0x27,0x33,0x17,0x15,0x07,0x23,0x01,0xef,0x81,0x81,0x60,0x88,0xfe,0xf5,0x01,0x0a,0x88,0x61,0x81,0x81,0x83,0x5f,0x83,0x83,0x5e,0xeb,0x8c,0x8c,0x50,0x8c,0x8c,0x8c,0x91,0x46,0x91,0x00,0x00, +0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0e,0x00,0x61,0xb7,0x0b,0x04,0x03,0x03,0x05,0x02,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1f,0x03,0x01,0x01,0x02,0x02,0x01,0x70,0x04,0x01,0x00,0x05,0x05,0x00,0x71,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x06,0x01,0x05,0x02,0x05,0x50,0x1b,0x40,0x1d, +0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x06,0x01,0x05,0x02,0x05,0x50,0x59,0x40,0x0e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x12,0x11,0x11,0x13,0x11,0x07,0x06,0x1b,0x2b,0x37,0x17,0x23,0x27,0x35,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x17,0x23,0x27,0x69,0x82, +0x5e,0x83,0x83,0x5f,0x83,0x01,0x00,0x7d,0x68,0x9c,0x9c,0x67,0x7d,0xeb,0x8c,0x91,0x46,0x91,0x8c,0x8c,0xb3,0xb5,0x8c,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0e,0x00,0x5a,0xb7,0x0c,0x0b,0x04,0x03,0x00,0x03,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1e,0x04,0x01,0x02,0x03,0x03,0x02,0x70,0x05,0x01,0x01, +0x00,0x00,0x01,0x71,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x60,0x00,0x00,0x03,0x00,0x50,0x1b,0x40,0x1c,0x04,0x01,0x02,0x03,0x02,0x85,0x05,0x01,0x01,0x00,0x01,0x86,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x60,0x00,0x00,0x03,0x00,0x50,0x59,0x40,0x09,0x13,0x11,0x11,0x12,0x11,0x10,0x06,0x06,0x1c,0x2b, +0x25,0x21,0x07,0x23,0x37,0x27,0x33,0x17,0x21,0x27,0x33,0x17,0x15,0x07,0x23,0x01,0xef,0xfe,0xff,0x7d,0x67,0x9c,0x9c,0x68,0x7d,0x01,0x00,0x83,0x5f,0x83,0x83,0x5e,0xeb,0x8c,0xb5,0xb3,0x8c,0x8c,0x91,0x46,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xea,0x02,0x26,0x00,0x0d,0x00,0x32,0x40,0x2f,0x0a,0x09,0x08,0x05, +0x04,0x03,0x06,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x14,0x14,0x11,0x05,0x06,0x19,0x2b,0x33,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x17,0x15,0x27,0x11,0x33,0x15,0x6e,0x92,0x92,0x9c,0x46,0x9a, +0x92,0x92,0x50,0x01,0x6a,0x84,0x65,0x8b,0x8a,0x66,0x83,0xfe,0x97,0x50,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0d,0x00,0x60,0xb6,0x08,0x07,0x02,0x04,0x01,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1f,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x06,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x04,0x04, +0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x1b,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x13,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x37,0x11, +0x33,0x15,0x21,0x27,0x33,0x17,0x15,0x07,0x23,0x37,0x21,0x15,0x0a,0x52,0x01,0x93,0x83,0x5f,0x83,0x83,0x5e,0x82,0xfe,0x6d,0x5f,0x01,0x68,0x8c,0x8c,0x91,0x46,0x91,0x8c,0x8c,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xea,0x02,0x26,0x00,0x0d,0x00,0x2b,0x40,0x28,0x0b,0x0a,0x09,0x06,0x05,0x04,0x06,0x02,0x01,0x01,0x4c,0x00, +0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x14,0x14,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x21,0x15,0x23,0x11,0x37,0x15,0x07,0x23,0x27,0x35,0x17,0x11,0x23,0x6e,0x01,0x7c,0x92,0x92,0x9a,0x46,0x9c,0x92,0x92,0x02,0x26,0x50,0xfe,0x97,0x83,0x66,0x8a,0x8b,0x65,0x84, +0x01,0x6a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x82,0x02,0x44,0x02,0x12,0x00,0x03,0x00,0x12,0x00,0x2e,0x40,0x2b,0x0b,0x01,0x05,0x02,0x01,0x4c,0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x00,0x05,0x02,0x05,0x50,0x14,0x12,0x14,0x11,0x11,0x10,0x06,0x06, +0x1c,0x2b,0x25,0x23,0x11,0x33,0x05,0x21,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x21,0x02,0x44,0x55,0x55,0xfd,0xbc,0x01,0x57,0x05,0x15,0x0b,0x65,0x61,0xa0,0xa0,0x61,0x66,0x08,0x14,0x08,0xfe,0xa9,0x82,0x01,0x90,0xa0,0x02,0x14,0x0d,0x7d,0xc8,0xc8,0x80,0x0a,0x12,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x0a, +0x00,0x6e,0x02,0x4e,0x02,0xda,0x00,0x1e,0x00,0x3d,0x40,0x3a,0x01,0x01,0x04,0x01,0x01,0x4c,0x00,0x00,0x02,0x01,0x02,0x00,0x01,0x80,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x69,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x00,0x00,0x00,0x1e,0x00,0x1e,0x26,0x21, +0x24,0x33,0x12,0x07,0x06,0x1b,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x16,0x16,0x17,0x17,0xaa,0xa0,0xa0,0x61,0x65,0x0a,0x16,0x05,0xcb,0x4b,0x5d,0x5d,0x4b,0x1e,0x1e,0x4d,0x74,0x41,0x41,0x74,0x4d,0xcb,0x08,0x14,0x08,0x66, +0x6e,0xc8,0xc8,0x7d,0x0d,0x14,0x02,0x50,0x46,0x45,0x51,0x50,0x3f,0x69,0x3e,0x46,0x68,0x38,0x04,0x12,0x0a,0x80,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x6e,0x02,0x4e,0x02,0xda,0x00,0x1e,0x00,0x37,0x40,0x34,0x1e,0x01,0x01,0x04,0x01,0x4c,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x00,0x03,0x05, +0x02,0x03,0x69,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x60,0x00,0x01,0x04,0x01,0x50,0x14,0x24,0x21,0x26,0x24,0x10,0x06,0x06,0x1c,0x2b,0x25,0x23,0x37,0x36,0x36,0x37,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x27,0x27,0x33,0x17,0x01,0xae,0x61,0x66, +0x08,0x14,0x08,0xcb,0x4c,0x75,0x41,0x41,0x75,0x4c,0x1e,0x1e,0x4b,0x5d,0x5d,0x4b,0xcb,0x05,0x15,0x0b,0x65,0x61,0xa0,0x6e,0x80,0x0a,0x12,0x04,0x38,0x68,0x46,0x3e,0x69,0x3f,0x50,0x51,0x45,0x46,0x50,0x02,0x14,0x0d,0x7d,0xc8,0x00,0x01,0x00,0xff,0xff,0x4c,0x01,0xf4,0x03,0x47,0x00,0x05,0x00,0x18,0x40,0x15,0x04,0x03,0x02,0x01, +0x04,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x02,0x06,0x16,0x2b,0x17,0x11,0x17,0x15,0x27,0x11,0xff,0xf5,0xc3,0xb4,0x03,0xfb,0xee,0x41,0xbd,0xfc,0x77,0x00,0x00,0x01,0x00,0x0a,0xff,0xd9,0x02,0x4e,0x02,0x52,0x00,0x11,0x00,0x77,0x40,0x11,0x0d,0x0c,0x02,0x02,0x03,0x0e,0x05,0x02,0x01,0x02,0x10,0x0f, +0x02,0x00,0x01,0x03,0x4c,0x4b,0xb0,0x0b,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00, +0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x12,0x11,0x11,0x07,0x06,0x1b,0x2b,0x05,0x37,0x21,0x35,0x21,0x27,0x37,0x21,0x35,0x21,0x27,0x33,0x17,0x15,0x07,0x17,0x15,0x07,0x01,0x8b,0x62,0xfe,0x1d, +0x01,0xe3,0x62,0x62,0xfe,0x1d,0x01,0xe3,0x62,0x62,0x61,0x61,0x61,0x61,0x27,0x77,0x50,0x77,0x74,0x50,0x77,0x7d,0x44,0x7a,0x7d,0x44,0x7d,0x00,0x00,0x02,0xff,0xf6,0xff,0x4c,0x02,0x62,0x03,0x47,0x00,0x05,0x00,0x0b,0x00,0x24,0x40,0x21,0x0a,0x09,0x08,0x07,0x04,0x03,0x02,0x01,0x08,0x00,0x4a,0x03,0x01,0x02,0x03,0x00,0x00,0x76, +0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x00,0x05,0x00,0x05,0x04,0x06,0x16,0x2b,0x05,0x11,0x17,0x15,0x27,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x01,0x6d,0xf5,0xc3,0xe6,0xc3,0xf5,0xb4,0x03,0xfb,0xee,0x41,0xbd,0xfc,0x77,0x03,0x89,0xbd,0x41,0xee,0xfc,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x0d, +0x00,0x6c,0xb6,0x0c,0x05,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01, +0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x12,0x11,0x11,0x07,0x06,0x1b,0x2b,0x25,0x37,0x21,0x35,0x21,0x37,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x01,0x07,0x6a,0xfe, +0x8f,0x01,0xb0,0x3f,0x3f,0xfe,0x50,0x01,0x71,0x6a,0x69,0xe8,0xe7,0x23,0x87,0x50,0x50,0x50,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x02,0xff,0xf6,0xff,0x42,0x02,0x62,0x03,0x3d,0x00,0x05,0x00,0x0b,0x00,0x18,0x40,0x15,0x0b,0x0a,0x09,0x08,0x05,0x04,0x03,0x02,0x08,0x00,0x49,0x01,0x01,0x00,0x00,0x76,0x15,0x10,0x02,0x06,0x18,0x2b, +0x01,0x33,0x11,0x37,0x15,0x07,0x03,0x33,0x11,0x27,0x35,0x17,0x01,0x6d,0x32,0xc3,0xf5,0xb4,0x32,0xf5,0xc3,0x03,0x3d,0xfc,0x77,0xbd,0x41,0xee,0x03,0xfb,0xfc,0x05,0xee,0x41,0xbd,0x00,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x0d,0x00,0x65,0xb6,0x09,0x02,0x02,0x04,0x03,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40, +0x24,0x00,0x01,0x02,0x02,0x01,0x70,0x00,0x00,0x05,0x05,0x00,0x71,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x68,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x1b,0x40,0x22,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x05,0x00,0x86,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x68,0x00,0x04,0x05,0x05,0x04,0x57, +0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x59,0x40,0x09,0x11,0x12,0x11,0x11,0x12,0x10,0x06,0x06,0x1c,0x2b,0x25,0x23,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x01,0x51,0x6a,0xe7,0xe8,0x69,0x6a,0x01,0x71,0xfe,0x50,0x3f,0x3f,0x01,0xb0,0xfe,0x8f,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x50,0x50,0x50, +0x00,0x02,0xff,0xb0,0x00,0x23,0x02,0xa8,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00, +0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12, +0x11,0x11,0x12,0x09,0x06,0x1b,0x2b,0x37,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0x97,0xe7,0xe8,0x69,0x6a,0x01,0x2a,0x6a,0x69,0xe8,0xe7,0x6a,0x6a,0xfe,0xd6,0x6a,0xa9,0x01,0xa8,0x3f,0x3f,0xfe,0x58,0x3f,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87, +0xd7,0x50,0x50,0x50,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x10,0x00,0x7d,0xb5,0x0d,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x2d,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x06,0x07,0x07,0x06,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x68,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x07,0x07, +0x00,0x57,0x00,0x00,0x00,0x07,0x5f,0x08,0x01,0x07,0x00,0x07,0x4f,0x1b,0x40,0x2b,0x00,0x05,0x04,0x05,0x85,0x00,0x06,0x07,0x06,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x68,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x07,0x07,0x00,0x57,0x00,0x00,0x00,0x07,0x5f,0x08,0x01,0x07,0x00,0x07,0x4f,0x59,0x40,0x10,0x00,0x00, +0x00,0x10,0x00,0x10,0x12,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x06,0x1d,0x2b,0x35,0x35,0x21,0x37,0x21,0x35,0x21,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x01,0x87,0x49,0xfe,0x30,0x01,0xd0,0x49,0xfe,0x79,0x01,0x4a,0x43,0x69,0xe8,0xe7,0x6a,0x43,0x78,0x4e,0x5d,0x4e,0x5d,0x4e,0x55,0xfe,0xd9,0xfe,0xd9,0x55,0x00,0x00, +0x00,0x02,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0x16,0x00,0x0c,0x00,0x13,0x00,0x31,0x40,0x2e,0x0e,0x0c,0x02,0x03,0x4a,0x06,0x05,0x02,0x03,0x02,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x04,0x01,0x4f,0x0d,0x0d,0x0d,0x13,0x0d,0x13,0x11,0x14,0x13,0x33,0x10,0x07,0x06,0x1b, +0x2b,0x01,0x23,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x11,0x23,0x01,0x13,0x27,0x07,0x33,0x11,0x33,0x11,0x02,0x44,0x9b,0x21,0x1b,0x82,0x1b,0x21,0x9b,0x01,0x18,0xc0,0xbf,0xbf,0x70,0x9c,0x01,0xe5,0xfe,0x57,0x1b,0x21,0x21,0x1b,0x01,0xa9,0x01,0x31,0xfe,0xf4,0xcf,0xcf,0xfe,0x21,0x01,0xdf,0x00,0x00,0x00,0x00,0x02,0x00,0x00, +0x00,0x32,0x02,0x58,0x02,0x6c,0x00,0x0c,0x00,0x13,0x00,0x33,0x40,0x30,0x0e,0x0c,0x02,0x03,0x02,0x01,0x4c,0x0f,0x0b,0x02,0x01,0x4a,0x0d,0x00,0x02,0x00,0x49,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x11,0x16,0x25,0x21,0x04,0x06,0x1a,0x2b,0x25, +0x35,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x35,0x01,0x05,0x37,0x27,0x15,0x21,0x15,0x21,0x01,0x27,0xeb,0x1b,0x21,0x21,0x1b,0xeb,0x01,0x31,0xfe,0xfb,0xc7,0xc7,0xfe,0xdc,0x01,0x24,0x32,0xa4,0x21,0x1b,0x7a,0x1b,0x21,0xa4,0xfe,0xe3,0xbb,0xbb,0xba,0x6c,0x9c,0x00,0x01,0x00,0x0a,0xff,0xf6,0x02,0x4e,0x01,0x56,0x00,0x05, +0x00,0x06,0xb3,0x04,0x00,0x01,0x32,0x2b,0x05,0x25,0x35,0x05,0x25,0x15,0x01,0x2b,0xfe,0xdf,0x01,0x27,0x01,0x1d,0x0a,0xf6,0x69,0xf9,0xfa,0x69,0x00,0x03,0xff,0xf6,0x01,0xae,0x02,0x62,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x3e,0x40,0x3b,0x0c,0x01,0x04,0x01,0x01,0x4c,0x09,0x01,0x00,0x4a,0x07,0x05,0x02,0x04,0x01,0x04, +0x86,0x03,0x01,0x00,0x01,0x01,0x00,0x57,0x03,0x01,0x00,0x00,0x01,0x5f,0x02,0x06,0x02,0x01,0x00,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0b,0x0a,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x03,0x35,0x33,0x15,0x21,0x23,0x35,0x33,0x01,0x13,0x13,0x23,0x27,0x07,0x0a,0xb4,0x01,0xb8,0xb4,0xb4, +0xfd,0xd5,0xf5,0xf5,0x5f,0x96,0x96,0x02,0x8a,0x50,0x50,0x50,0xfe,0xd4,0x01,0x2c,0xfe,0xd4,0xb9,0xb9,0x00,0x01,0x00,0x0a,0x00,0x78,0x02,0x4e,0x02,0x1c,0x00,0x16,0x00,0x2f,0x40,0x2c,0x16,0x01,0x01,0x02,0x01,0x4c,0x05,0x01,0x01,0x01,0x4b,0x00,0x03,0x02,0x03,0x85,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00, +0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x16,0x31,0x27,0x10,0x04,0x06,0x1a,0x2b,0x25,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x01,0x9e,0x95,0x56,0x0c,0x1c,0x0c,0x13,0x26,0x0b,0xfe,0xbb,0x01,0x41,0x1a,0x26,0x06,0x05,0x18,0x10,0x57,0x91,0xb0,0x78, +0x68,0x0f,0x1c,0x08,0x04,0x01,0x03,0x6e,0x01,0x02,0x04,0x05,0x19,0x13,0x69,0xd2,0x00,0x01,0x00,0x05,0x00,0x64,0x02,0x4e,0x02,0x30,0x00,0x27,0x00,0x39,0x40,0x36,0x25,0x18,0x02,0x01,0x02,0x01,0x4c,0x09,0x01,0x01,0x01,0x4b,0x00,0x03,0x02,0x03,0x85,0x04,0x01,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02, +0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x01,0x00,0x23,0x21,0x17,0x13,0x0f,0x0c,0x00,0x27,0x01,0x27,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x17,0x07,0x06,0x01, +0x75,0x17,0x22,0x0e,0x08,0x1a,0x26,0x06,0x13,0x28,0x11,0xfe,0xf5,0x19,0x23,0x23,0x19,0x01,0x07,0x1a,0x2a,0x0c,0x0a,0x23,0x14,0x11,0x0d,0x22,0x17,0x1d,0x11,0xae,0xad,0x10,0x64,0x22,0x17,0x14,0x10,0x09,0x1e,0x27,0x04,0x04,0x01,0x03,0x20,0x17,0x17,0x20,0x02,0x02,0x04,0x09,0x23,0x15,0x13,0x10,0x14,0x17,0x20,0x19,0xcd,0xcf, +0x17,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x69,0x02,0x4e,0x02,0x2b,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x00,0x01,0x01,0x4c,0x05,0x01,0x01,0x4a,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x02,0x06,0x18,0x2b,0x25,0x35,0x21,0x35,0x21,0x35,0x17,0x01, +0x8f,0xfe,0x7b,0x01,0x85,0xbf,0x69,0xbe,0x46,0xbe,0xe1,0x00,0x00,0x01,0x00,0x0a,0x00,0x69,0x02,0x4e,0x02,0x2b,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x00,0x01,0x01,0x4c,0x05,0x01,0x01,0x4a,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x02,0x06,0x18,0x2b, +0x25,0x35,0x21,0x35,0x21,0x35,0x17,0x01,0x8f,0xfe,0x7b,0x01,0x85,0xbf,0x69,0xaa,0x6e,0xaa,0xe1,0x00,0x00,0x01,0xff,0xd8,0x00,0x4b,0x02,0x80,0x02,0x49,0x00,0x16,0x00,0x3a,0x40,0x37,0x07,0x01,0x01,0x00,0x11,0x08,0x01,0x03,0x02,0x01,0x12,0x01,0x03,0x02,0x03,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00, +0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x21,0x36,0x12,0x05,0x06,0x19,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x26,0x27,0x15,0x16,0x16,0x17,0x17,0xa7,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x29,0x10,0x01,0xe0, +0xfe,0x20,0x10,0x29,0x0d,0x07,0x19,0x0d,0x89,0x4b,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x02,0x02,0x50,0x04,0x01,0x09,0x06,0x1a,0x0f,0xa4,0x00,0x00,0x01,0xff,0xd8,0x00,0x4b,0x02,0x80,0x02,0x49,0x00,0x16,0x00,0x3a,0x40,0x37,0x0f,0x01,0x01,0x02,0x15,0x0e,0x05,0x03,0x00,0x01,0x04,0x01,0x03,0x00,0x03,0x4c,0x00,0x02,0x01,0x02, +0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x17,0x21,0x27,0x05,0x06,0x19,0x2b,0x25,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x01,0x4b,0x86,0x0a,0x1a, +0x09,0x0d,0x28,0x11,0xfe,0x20,0x01,0xe0,0x11,0x28,0x0d,0x07,0x19,0x0d,0x89,0x69,0xcf,0xce,0x4b,0xa5,0x0c,0x1a,0x07,0x09,0x01,0x03,0x50,0x03,0x02,0x09,0x06,0x1a,0x0f,0xa4,0xff,0xff,0x00,0x01,0xff,0xb0,0x00,0x4b,0x02,0xa8,0x02,0x49,0x00,0x29,0x00,0x43,0x40,0x40,0x10,0x07,0x02,0x01,0x00,0x24,0x1d,0x16,0x0f,0x08,0x01,0x06, +0x04,0x01,0x25,0x1c,0x02,0x03,0x04,0x03,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x01,0x04,0x4f,0x00,0x00,0x00,0x29,0x00,0x29,0x37,0x12,0x17,0x46,0x12,0x07,0x06,0x1b,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36, +0x33,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x22,0x26,0x27,0x15,0x16,0x16,0x17,0x17,0x7f,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x29,0x10,0x01,0x68,0x11,0x28,0x0d,0x07,0x19,0x0d,0x89,0x69,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x28,0x11,0xfe,0x98, +0x10,0x29,0x0d,0x07,0x19,0x0d,0x89,0x4b,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x02,0x02,0x03,0x02,0x09,0x06,0x1a,0x0f,0xa4,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x01,0x03,0x04,0x01,0x09,0x06,0x1a,0x0f,0xa4,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0xff,0x79,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, +0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0xfe,0xd4,0xa5,0xa5,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x00,0x1e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03, +0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x01,0x4a,0xfe,0xb6,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x00,0xc3,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe, +0xd4,0x01,0xef,0xfe,0x11,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x01,0x68,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00, +0xfe,0xd4,0x02,0x58,0x02,0x0d,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x03,0x39,0xfc,0xc7,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x02,0xb2,0x00,0x03,0x00,0x17,0x40,0x14, +0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x03,0xde,0xfc,0x22,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0x57,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, +0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x04,0x83,0xfb,0x7d,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21, +0x11,0x02,0x58,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x68,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00, +0x00,0x01,0x00,0x00,0x03,0x57,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0x03,0x57,0xa5,0xa5,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x4b, +0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33,0x11,0x4b,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x96,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, +0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33,0x11,0x96,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0xc8,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33, +0x11,0xc8,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0x2c,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00, +0xfe,0xd4,0x01,0x77,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x77,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0xc2,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14, +0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0xc2,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x0d,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, +0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x0d,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x01,0x2c,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21, +0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x01,0x02,0x0d,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x33,0x11,0x02,0x0d,0x4b,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00, +0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0x2c,0x01,0x68,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x01,0x2c,0xfe,0xd4,0x02,0x58,0x01,0x68,0x00,0x03, +0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x01,0x00,0x00,0x01,0x68,0x01,0x2c,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, +0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x01,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00, +0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01, +0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x11,0x11,0x21,0x19,0x02,0x21,0x11,0x01,0x2c,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0xfd,0x6c,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a, +0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x01,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a, +0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x01,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0xfe,0xca,0x02,0x62,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x01,0x01,0x2c,0x01,0x68,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14, +0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01, +0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfd,0xa8,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0xfd,0x6c,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x01,0x00,0x00, +0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x00,0x00,0x37,0x00,0x3c, +0xff,0x10,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b,0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73, +0x00,0x77,0x00,0x7b,0x00,0x7f,0x00,0x83,0x00,0x87,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xa3,0x00,0xa7,0x00,0xab,0x00,0xaf,0x00,0xb3,0x00,0xb7,0x00,0xbb,0x00,0xbf,0x00,0xc3,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0xd3,0x00,0xd7,0x00,0xdb,0x00,0x00,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35, +0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35, +0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35, +0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35, +0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x02,0x1c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x03,0xc0,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x6e,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b, +0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73,0x00,0x77,0x00,0x7b,0x00,0x7f,0x00,0x83,0x00,0x87,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xa3,0x00,0xa7,0x00,0xab,0x00,0xaf,0x00,0xb3,0x00,0xb7,0x00,0xbb,0x00,0xbf,0x00,0xc3,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0xd3,0x00,0xd7,0x00,0xdb, +0x00,0xdf,0x00,0xe3,0x00,0xe7,0x00,0xeb,0x00,0xef,0x00,0xf3,0x00,0xf7,0x00,0xfb,0x00,0xff,0x01,0x03,0x01,0x07,0x01,0x0b,0x01,0x0f,0x01,0x13,0x01,0x17,0x01,0x1b,0x01,0x1f,0x01,0x23,0x01,0x27,0x01,0x2b,0x01,0x2f,0x01,0x33,0x01,0x37,0x01,0x3b,0x01,0x3f,0x01,0x43,0x01,0x47,0x01,0x4b,0x01,0x4f,0x01,0x53,0x01,0x57,0x01,0x5b, +0x01,0x5f,0x01,0x63,0x01,0x67,0x01,0x6b,0x01,0x6f,0x01,0x73,0x01,0x77,0x01,0x7b,0x01,0x7f,0x01,0x83,0x01,0x87,0x01,0x8b,0x01,0x8f,0x01,0x93,0x01,0x97,0x01,0x9b,0x01,0x9f,0x01,0xa3,0x01,0xa7,0x01,0xab,0x01,0xaf,0x01,0xb3,0x01,0xb7,0x00,0x00,0x01,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15, +0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15, +0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15, +0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15, +0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15, +0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15, +0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15, +0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x02,0x1c,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x68,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0xe0, +0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xf0,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x78,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0x78,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0x3c, +0x3c,0xb4,0x3c,0xfd,0xe4,0x3c,0xf0,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0xfe,0x20,0x3c,0x01,0xa4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0xf0,0x3c,0x3c,0x3c,0xfe,0x5c,0x3c,0x3c,0x3c,0x01,0x2c,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0x01,0x2c, +0x3c,0xb4,0x3c,0x78,0x3c,0xfe,0xd4,0x3c,0x01,0x2c,0x3c,0xfe,0xd4,0x3c,0xfe,0xd4,0x3c,0x01,0x68,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0xb4,0x3c,0xfd,0xe4,0x3c,0x01,0x68,0x3c,0xfd,0xe4,0x3c,0xb4,0x3c,0x3c,0x3c,0xfe,0xd4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0x78,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c, +0xb4,0x3c,0x01,0x68,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x01,0xe0,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x78,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0x03,0xc0,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x3d,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x51,0x00,0x55, +0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99,0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0xad,0x00,0xb1,0x00,0xb5,0x00,0xb9,0x00,0xbd,0x00,0xc1,0x00,0xc5,0x00,0xc9,0x00,0xcd,0x00,0xd1,0x00,0xd5, +0x00,0xd9,0x00,0xdd,0x00,0x00,0x11,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15, +0x33,0x35,0x33,0x11,0x03,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x17,0x33,0x35,0x23, +0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23, +0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0xfe,0x98,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0xf0,0x3c,0x3c,0x78, +0x3c,0x3c,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0xfe,0x98,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0xfe,0xd4, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfa,0xd8,0x04,0x74,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f, +0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x09,0x07,0x00,0x0f,0x01,0x0f,0x03,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c, +0x59,0x58,0x8d,0x51,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01, +0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x32,0x51, +0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04, +0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d, +0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1d,0x00,0x3b,0x40,0x38,0x00,0x03, +0x04,0x02,0x04,0x03,0x02,0x80,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x02,0x00,0x00,0x02,0x59,0x06,0x01,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x17,0x16,0x15,0x14,0x10,0x1d,0x11,0x1d,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33, +0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x21,0x11,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0xfe,0xfc,0x4a,0x76,0x44,0x44,0x76,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x01,0x04, +0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x15,0x00,0x2f,0x40,0x2c,0x00,0x02,0x03,0x00,0x03,0x02,0x00,0x80,0x04,0x01,0x00,0x00,0x84,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x01,0x00,0x13,0x12,0x11,0x10,0x09,0x07,0x00, +0x0f,0x01,0x0f,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x21,0x11,0x22,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xfe,0xa3,0x01,0x04,0x4a,0x76,0x44,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36, +0x01,0x04,0x44,0x76,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1d,0x00,0x23,0x00,0x3e,0x40,0x3b,0x1f,0x14,0x02,0x00,0x04,0x01,0x4c,0x05,0x01,0x00,0x04,0x00,0x86,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x02,0x04,0x04,0x02,0x57,0x00,0x02,0x02,0x04,0x5f,0x06,0x01,0x04,0x02,0x04,0x4f,0x1e,0x1e, +0x01,0x00,0x1e,0x23,0x1e,0x23,0x1b,0x19,0x16,0x15,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x14,0x16,0x16,0x17,0x11,0x21,0x2e,0x02,0x23,0x22,0x06,0x06,0x05,0x15,0x3e,0x02,0x37,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c, +0x51,0x51,0x8c,0xfe,0xa3,0x3d,0x6a,0x44,0x01,0x1c,0x06,0x46,0x71,0x46,0x4a,0x76,0x44,0x01,0x1d,0x40,0x65,0x3f,0x06,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36,0x46,0x71,0x46,0x06,0x01,0x1c,0x44,0x6a,0x3d,0x44,0x76,0x63,0xea,0x06,0x3f,0x65,0x40,0x00,0x00,0x08,0xff,0xf6,0x00,0x32,0x02,0x62, +0x02,0x9e,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x35,0x00,0x3b,0x00,0x47,0x00,0x48,0x40,0x45,0x13,0x0e,0x04,0x03,0x01,0x00,0x43,0x3d,0x39,0x38,0x33,0x31,0x2f,0x2b,0x2a,0x22,0x21,0x1b,0x1a,0x16,0x15,0x11,0x0f,0x0b,0x05,0x13,0x02,0x01,0x44,0x3b,0x34,0x03,0x03,0x02,0x03,0x4c,0x00,0x00,0x00,0x01,0x02,0x00, +0x01,0x69,0x00,0x02,0x03,0x03,0x02,0x59,0x00,0x02,0x02,0x03,0x61,0x00,0x03,0x02,0x03,0x51,0x47,0x45,0x41,0x3f,0x24,0x21,0x04,0x06,0x18,0x2b,0x13,0x36,0x33,0x32,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x07,0x07,0x36,0x37,0x17,0x06,0x07,0x25,0x37,0x16,0x17,0x07,0x26,0x05,0x34,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26, +0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x15,0x14,0x07,0x05,0x37,0x16,0x17,0x07,0x26,0x25,0x36,0x37,0x17,0x06,0x07,0x07,0x37,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0xdb,0x25,0x2c,0x2c,0x25,0x0d,0x10,0x22,0x12,0x12,0x21,0x11,0xcb,0x29,0x4a,0x19,0x3d,0x23,0x01,0x66,0x19,0x4a,0x29,0x2c,0x23,0xfe,0x0a,0x0a, +0x30,0x04,0x04,0x04,0x04,0x30,0x0a,0x02,0x32,0x04,0x04,0x04,0x04,0x30,0x0a,0x0a,0xfd,0xc5,0x2c,0x23,0x3d,0x19,0x4a,0x01,0x69,0x3d,0x23,0x2c,0x29,0x4a,0xed,0x0d,0x11,0x21,0x12,0x12,0x22,0x10,0x0d,0x25,0x2c,0x2c,0x02,0x94,0x0a,0x0a,0x30,0x04,0x04,0x04,0x04,0x60,0x4a,0x29,0x2c,0x23,0x3d,0x60,0x2c,0x29,0x4a,0x19,0x3d,0xc0, +0x2c,0x25,0x0d,0x10,0x22,0x12,0x12,0x21,0x11,0x0d,0x25,0x18,0x11,0x21,0x12,0x12,0x22,0x10,0x0d,0x25,0x2c,0x2c,0x25,0x4b,0x19,0x3d,0x23,0x2c,0x29,0x03,0x23,0x3d,0x19,0x4a,0x29,0x1d,0x30,0x04,0x04,0x04,0x04,0x30,0x0a,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x49,0x40,0x46, +0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x08,0x01,0x04,0x02,0x03,0x04,0x02,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x29,0x27,0x20,0x2f,0x21,0x2f,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00, +0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59, +0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x37,0x59,0x35,0x35,0x59,0x37,0x39,0x59,0x33,0x35,0x59,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x3f,0x35,0x59,0x37,0x37,0x59,0x35,0x33,0x59,0x39, +0x37,0x59,0x35,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x53,0x40,0x50,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x0a,0x01,0x04,0x02,0x06,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00, +0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x31,0x30,0x21,0x20,0x11,0x10,0x01,0x00,0x39,0x37,0x30,0x3f,0x31,0x3f,0x29,0x27,0x20,0x2f,0x21,0x2f,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35, +0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a, +0x76,0x44,0x44,0x76,0x4a,0x37,0x59,0x35,0x35,0x59,0x37,0x39,0x59,0x33,0x35,0x59,0x37,0x2b,0x44,0x27,0x27,0x44,0x2b,0x2b,0x44,0x27,0x27,0x44,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x3f,0x35,0x59,0x37,0x37,0x59,0x35,0x33,0x59,0x39, +0x37,0x59,0x35,0x2f,0x27,0x44,0x2b,0x2b,0x44,0x27,0x27,0x44,0x2b,0x2b,0x44,0x27,0x00,0x02,0x00,0xb4,0x00,0xf5,0x01,0xa4,0x01,0xe5,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01, +0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0xf5,0x44,0x34,0x35,0x43,0x43, +0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x25,0x09,0x02,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03, +0x00,0x07,0x00,0x08,0xb5,0x06,0x04,0x02,0x00,0x02,0x32,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0a,0xb7,0x0a, +0x08,0x06,0x04,0x02,0x00,0x03,0x32,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x17,0x27,0x37,0x17,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0xe8,0x8d,0x8d,0x8d,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0x8d,0x8d,0x8d,0x8d,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xd0,0x00,0x07, +0x00,0x1b,0x00,0x25,0x40,0x22,0x18,0x17,0x12,0x0e,0x0d,0x06,0x05,0x02,0x01,0x09,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x13,0x03,0x06,0x17,0x2b,0x33,0x03,0x35,0x13,0x33,0x13,0x15,0x03,0x27,0x33,0x36,0x36,0x37,0x37,0x35,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07, +0x07,0x15,0x17,0x16,0x16,0xf0,0xb4,0xb4,0x7e,0xae,0xae,0x43,0x04,0x07,0x1b,0x0f,0x62,0x62,0x0f,0x1b,0x07,0x04,0x07,0x1c,0x0f,0x63,0x63,0x10,0x1b,0x01,0x44,0x47,0x01,0x45,0xfe,0xbb,0x47,0xfe,0xbc,0x3c,0x0e,0x36,0x1d,0xbb,0x1f,0xbc,0x1d,0x36,0x0e,0x0e,0x36,0x1d,0xbc,0x1f,0xbb,0x1e,0x35,0x00,0x00,0x00,0x00,0x01,0x00,0x00, +0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x02,0x58,0x3c,0x02,0x58,0xfd,0xa8,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00, +0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x00, +0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x37,0x11,0x21,0x11,0x96,0x01,0x2c,0xd2,0x01,0x2c,0xfe,0xd4,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x03, +0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x37,0x11,0x21,0x11,0x27,0x33,0x35,0x23,0x96,0x01,0x2c,0xfa,0xc8,0xc8,0xd2,0x01,0x2c,0xfe, +0xd4,0x32,0xc8,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x29,0x40,0x26,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x00,0x00,0x03,0x57,0x04,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x04,0x04,0x04,0x07,0x04,0x07,0x12,0x11,0x10,0x05,0x06,0x19,0x2b,0x25,0x21,0x11, +0x21,0x03,0x11,0x21,0x11,0x02,0x58,0xfd,0xa8,0x02,0x58,0x32,0xfe,0xfc,0x3c,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01, +0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0x04,0xfe,0xfc,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x06,0x00,0x2b,0x40,0x28,0x06,0x01, +0x02,0x00,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x03,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x04,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x02,0x58,0xfd,0xda,0x01,0xf4,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x02,0x00,0x00, +0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x06,0x00,0x2c,0x40,0x29,0x06,0x01,0x00,0x02,0x01,0x4c,0x00,0x00,0x02,0x00,0x86,0x03,0x01,0x01,0x02,0x02,0x01,0x57,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x04,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x05,0x21,0x11,0x02, +0x58,0xfd,0xa8,0x02,0x26,0xfe,0x0c,0x02,0x94,0xfd,0xa8,0x02,0x58,0x32,0xfe,0x0c,0x00,0x03,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x31,0x40,0x2e,0x00,0x00,0x04,0x01,0x03,0x02,0x00,0x03,0x67,0x05,0x01,0x02,0x01,0x01,0x02,0x57,0x05,0x01,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f, +0x00,0x00,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x33,0x11,0x23,0x21,0x23,0x11,0x33,0x02,0x58,0xfd,0xda,0xe1,0xe1,0x01,0xf4,0xe1,0xe1,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x01,0xff,0xf6,0x00,0x3c,0x02,0x62,0x02,0x9e,0x00,0x02, +0x00,0x15,0x40,0x12,0x01,0x01,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x06,0x16,0x2b,0x27,0x01,0x01,0x0a,0x01,0x36,0x01,0x36,0x3c,0x02,0x62,0xfd,0x9e,0x00,0x01,0x00,0x00,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x35,0x11,0x01,0x02,0x62,0x32,0x02,0x6c, +0xfe,0xca,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x94,0x00,0x02,0x00,0x0a,0xb7,0x00,0x00,0x00,0x76,0x11,0x01,0x06,0x17,0x2b,0x25,0x01,0x21,0x01,0x2c,0xfe,0xca,0x02,0x6c,0x32,0x02,0x62,0x00,0x01,0xff,0xf6,0x00,0x31,0x02,0x58,0x02,0x9e,0x00,0x02,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x25,0x01,0x01,0x02, +0x58,0xfd,0x9e,0x02,0x62,0x31,0x01,0x37,0x01,0x36,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x3c,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x24,0x40,0x21,0x05,0x01,0x02,0x01,0x4a,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x04,0x03,0x00,0x02,0x00,0x02,0x03,0x06,0x16,0x2b, +0x27,0x01,0x01,0x25,0x21,0x03,0x0a,0x01,0x36,0x01,0x36,0xfd,0xe7,0x01,0xc6,0xe3,0x3c,0x02,0x62,0xfd,0x9e,0x32,0x01,0xbf,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x35,0x11,0x01,0x05,0x25,0x25,0x02,0x62,0xfd,0xd0,0x01,0xc0,0xfe,0x40,0x32,0x02, +0x6c,0xfe,0xca,0xe3,0xe3,0xe3,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x94,0x00,0x02,0x00,0x05,0x00,0x18,0x40,0x15,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x25,0x01,0x21,0x01,0x13,0x21,0x01,0x2c,0xfe,0xca,0x02,0x6c,0xfe,0xca,0xe3,0xfe, +0x3a,0x32,0x02,0x62,0xfe,0x0f,0x01,0xbf,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x58,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02,0x00,0x02,0x32,0x2b,0x25,0x01,0x01,0x03,0x11,0x05,0x02,0x58,0xfd,0x9e,0x02,0x62,0x32,0xfe,0x40,0x32,0x01,0x36,0x01,0x36,0xfd,0xe7,0x01,0xc6,0xe3,0x00,0x00,0x00,0x00,0x01,0x00,0x00, +0x00,0xd2,0x02,0x62,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x35,0x11,0x05,0x02,0x62,0xd2,0x01,0x2c,0x96,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0xd2,0x02,0x58,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x2d,0x02,0x02,0x58,0xfd,0x9e,0x02,0x62,0xd2,0x96,0x96,0x00,0x00,0x02,0x00,0x00, +0x00,0xd2,0x02,0x62,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x35,0x11,0x05,0x05,0x25,0x25,0x02,0x62,0xfd,0xd0,0x01,0x8e,0xfe,0x72,0xd2,0x01,0x2c,0x96,0x56,0x56,0x56,0x00,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0xd2,0x02,0x58,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02, +0x00,0x02,0x32,0x2b,0x2d,0x02,0x07,0x35,0x05,0x02,0x58,0xfd,0x9e,0x02,0x62,0x32,0xfe,0x72,0xd2,0x96,0x96,0xec,0xac,0x56,0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xc2,0x02,0x08,0x00,0x02,0x00,0x15,0x40,0x12,0x01,0x01,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x06,0x16,0x2b,0x37,0x13,0x13,0x96,0x96, +0x96,0xd2,0x01,0x36,0xfe,0xca,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xcc,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x37,0x11,0x05,0x96,0x01,0x36,0xd2,0x01,0x2c,0x96,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0xc8,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x0f,0x40,0x0c,0x02,0x01,0x00,0x49,0x00,0x00,0x00,0x76, +0x10,0x01,0x06,0x17,0x2b,0x13,0x21,0x03,0x96,0x01,0x2c,0x96,0x01,0xfe,0xfe,0xca,0x00,0x01,0x00,0x8c,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x01,0x11,0x25,0x01,0xc2,0xfe,0xca,0x01,0xfe,0xfe,0xd4,0x96,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xc2,0x02,0x08,0x00,0x02,0x00,0x05,0x00,0x24, +0x40,0x21,0x05,0x01,0x02,0x01,0x4a,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x04,0x03,0x00,0x02,0x00,0x02,0x03,0x06,0x16,0x2b,0x37,0x13,0x13,0x27,0x33,0x27,0x96,0x96,0x96,0xec,0xac,0x56,0xd2,0x01,0x36,0xfe,0xca,0x28,0xb2,0x00,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xcc, +0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x37,0x11,0x05,0x05,0x37,0x27,0x96,0x01,0x36,0xfe,0xf2,0xb2,0xb2,0xd2,0x01,0x2c,0x96,0x56,0x56,0x56,0x00,0x02,0x00,0x96,0x00,0xc8,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x18,0x40,0x15,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01, +0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x25,0x03,0x21,0x07,0x37,0x23,0x01,0x2c,0x96,0x01,0x2c,0x96,0x56,0xac,0xc8,0x01,0x36,0xda,0xb2,0x00,0x00,0x02,0x00,0x8c,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02,0x00,0x02,0x32,0x2b,0x2d,0x02,0x07,0x35,0x07,0x01,0xc2,0xfe, +0xca,0x01,0x36,0x28,0xb2,0xd2,0x96,0x96,0xec,0xac,0x56,0x00,0x00,0x03,0xff,0xec,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x45,0x40,0x42,0x0a,0x07,0x09,0x03,0x04,0x03,0x04,0x86,0x00,0x00,0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x06,0x01,0x02,0x03,0x03,0x02,0x57,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01, +0x03,0x02,0x03,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x01,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x14,0x02,0x80,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0xd4,0xaa,0x01,0x0e, +0x01,0xa4,0x64,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x02,0x6c,0x64,0xfd,0x30,0x00,0x02,0xff,0xec,0xfe,0x70,0x01,0xc2,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x07,0x05,0x06,0x03,0x02,0x03,0x02,0x86,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x04,0x03,0x03,0x04,0x57,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x04, +0x03,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x01,0x11,0x21,0x35,0x21,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x01,0x5e,0xfe,0x8e,0x01,0xd6,0xfe,0xd4,0xaa,0x01,0x0e,0xfe,0x70,0x03,0x34,0x64,0xfc,0x68,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x02,0x00,0x96, +0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x07,0x05,0x06,0x03,0x02,0x04,0x02,0x86,0x00,0x00,0x00,0x01,0x03,0x00,0x01,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11, +0x08,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0x96,0x01,0xd6,0xfe,0x8e,0x64,0x01,0x0e,0xaa,0xfe,0x70,0x03,0x98,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0x00,0xdc,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02, +0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x14,0x02,0x80,0xfd,0x80,0x02,0x80,0x01,0xa4,0x64,0x64,0xc8,0x64,0x64,0x00,0x00,0x00, +0x00,0x03,0xff,0xec,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x43,0x40,0x40,0x04,0x01,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x09,0x05,0x08,0x03,0x02,0x06,0x01,0x02,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0a,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c, +0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0b,0x06,0x18,0x2b,0x01,0x11,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x33,0x11,0x05,0x35,0x21,0x15,0x01,0x5e,0x64,0xaa,0xfd,0x80,0xaa,0x64,0xfe,0xf2,0x02,0x80,0x01,0xa4,0x02,0xbc,0xfd,0xa8,0x64,0x64,0x02,0x58,0xfd,0x44,0xc8,0x64,0x64, +0x00,0x02,0xff,0xec,0x00,0xdc,0x01,0xc2,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x04,0x01,0x01,0x03,0x01,0x85,0x00,0x03,0x07,0x01,0x05,0x00,0x03,0x05,0x67,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x06,0x01,0x02,0x00,0x02,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05, +0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x27,0x35,0x21,0x11,0x33,0x11,0x25,0x35,0x33,0x11,0x33,0x11,0x14,0x01,0x72,0x64,0xfe,0x2a,0xaa,0x64,0xdc,0x64,0x03,0x20,0xfc,0x7c,0xc8,0x64,0x02,0x58,0xfd,0x44,0x00,0x02,0x00,0x96,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x03,0x01,0x00,0x04,0x00,0x85, +0x00,0x04,0x07,0x01,0x05,0x01,0x04,0x05,0x67,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x06,0x01,0x02,0x01,0x02,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x37,0x11,0x33,0x11,0x21,0x15,0x25,0x11,0x33,0x11,0x33,0x15,0x96,0x64,0x01,0x72, +0xfe,0xf2,0x64,0xaa,0xdc,0x03,0x84,0xfc,0xe0,0x64,0xc8,0x02,0xbc,0xfd,0xa8,0x64,0x00,0x02,0x00,0x96,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06, +0x17,0x2b,0x01,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x5e,0x64,0xfe,0xd4,0x64,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x04,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x59,0x40,0x56,0x03,0x01,0x01,0x00,0x01,0x85,0x0f,0x0b,0x0e,0x03,0x08,0x07,0x08,0x86, +0x04,0x01,0x00,0x0d,0x05,0x0c,0x03,0x02,0x06,0x00,0x02,0x67,0x0a,0x01,0x06,0x07,0x07,0x06,0x57,0x0a,0x01,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x12,0x12,0x0c,0x0c,0x06,0x06,0x00,0x00,0x12,0x17,0x12,0x17,0x16,0x15,0x14,0x13,0x0c,0x11,0x0c,0x11,0x10,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00, +0x05,0x00,0x05,0x11,0x11,0x10,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x14,0xaa,0x64,0x64,0x64,0xaa,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0xd4,0xaa,0x01,0x0e,0x01,0xa4,0x64,0x02,0x58,0xfd,0x44,0x02,0xbc,0xfd,0xa8,0x64,0xfc,0xcc,0x02, +0xd0,0x64,0xfd,0x94,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x03,0xff,0xec,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x48,0x40,0x45,0x03,0x01,0x00,0x02,0x00,0x85,0x0a,0x07,0x08,0x03,0x01,0x05,0x01,0x86,0x00,0x02,0x09,0x01,0x04,0x06,0x02,0x04,0x67,0x00,0x06,0x05,0x05,0x06,0x57,0x00,0x06,0x06, +0x05,0x5f,0x00,0x05,0x06,0x05,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x01,0x11,0x33,0x11,0x01,0x35,0x33,0x11,0x33,0x11,0x03,0x11,0x23,0x35,0x21,0x11,0x01,0x5e,0x64,0xfe,0x2a,0xaa,0x64,0x64,0xaa,0x01, +0x0e,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x03,0x34,0x64,0x02,0x58,0xfd,0x44,0xfc,0xcc,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x03,0x00,0x96,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x48,0x40,0x45,0x02,0x01,0x00,0x03,0x00,0x85,0x0a,0x07,0x08,0x03,0x01,0x06,0x01,0x86,0x00,0x03,0x09,0x01,0x04,0x05, +0x03,0x04,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x05,0x06,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x13,0x11,0x33,0x11,0x33,0x15,0x01,0x11,0x21,0x15, +0x23,0x11,0x96,0x64,0x64,0x64,0xaa,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x03,0x34,0x02,0xbc,0xfd,0xa8,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x0b,0x00,0x2a,0x40,0x27,0x06,0x05,0x02,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01, +0x00,0x5f,0x04,0x02,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0x02,0x80,0xaa,0x64,0x64,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0xc2, +0x01,0xa4,0x00,0x09,0x00,0x28,0x40,0x25,0x05,0x04,0x02,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0x01,0xd6,0x64,0x64,0xfe,0x70, +0x02,0xd0,0x64,0xfc,0xcc,0x02,0xd0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x09,0x00,0x28,0x40,0x25,0x05,0x04,0x02,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06, +0x1a,0x2b,0x13,0x11,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0x01,0xd6,0xaa,0x64,0x64,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00, +0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0x02,0x80,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00, +0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0xc8,0xdc,0x01,0xa4,0xfe,0x70,0x02,0xd0,0x64,0xfc,0xcc,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x03,0xfc,0x00,0x09,0x00,0x2d,0x40,0x2a, +0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xfe,0x70,0x02,0xd0,0x64, +0x02,0x58,0xfd,0xa8,0xfc,0xcc,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x11, +0xc8,0x01,0xa4,0xdc,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x01,0x00,0x01,0x85,0x05,0x01,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11, +0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x03,0x34,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03, +0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd, +0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x11, +0xfa,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06, +0x18,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0x9e,0xc8,0xfc,0x9a,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f, +0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfc,0xae,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01, +0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0xfe,0x70,0x03,0x66,0xc8,0xfd,0x62,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29, +0x00,0x01,0x02,0x01,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x5f,0x03,0x01,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0x32,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0x03,0x52, +0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11, +0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x0b,0x00,0x39,0x40,0x36,0x07,0x01,0x05,0x02,0x05,0x86, +0x00,0x00,0x06,0x01,0x01,0x03,0x00,0x01,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x04,0x01,0x02,0x03,0x02,0x4f,0x04,0x04,0x00,0x00,0x04,0x0b,0x04,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x01,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x02,0x80, +0xfe,0x8e,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0x01,0xa4,0x64,0x64,0xfc,0xcc,0x02,0x6c,0x64,0x64,0xfd,0x94,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x02,0x08,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01, +0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0xfc,0x68,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x03, +0x04,0x86,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x03,0x98,0x64, +0x64,0x64,0xfd,0x94,0x00,0x02,0x00,0x4b,0x01,0x0e,0x02,0x0d,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x35, +0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x77,0x96,0xfe,0x3e,0x96,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0x00,0x00,0x00,0x02,0x00,0xc8,0xff,0x6f,0x01,0x90,0x03,0x69,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04, +0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xc8,0xc8,0xc8,0xc8,0x01,0xcc,0x01,0x9d,0xfe,0x63,0xfd,0xa3,0x01,0x9f,0xfe,0x61,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x01,0xa4,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, +0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0xfe,0x70,0x03,0x34,0xfc,0xcc,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00, +0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0x02,0x80,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01, +0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0xc8,0xdc,0x01,0xa4,0xfe,0x70,0x02,0x9e,0xc8,0xfc,0x9a,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01, +0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x11,0xc8,0x01,0xa4,0xdc,0xfe,0x70,0x03,0x66,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b, +0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x02,0x80,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x5e,0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, +0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x01,0x72,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00, +0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x15,0x21,0x15,0x21,0x15,0x14,0x01,0x72,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xc8,0x32,0x64,0x32,0x00,0x00,0x04,0x00,0x19,0x01,0x0e,0x02,0x3f,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x42, +0x40,0x3f,0x06,0x04,0x02,0x03,0x00,0x01,0x01,0x00,0x57,0x06,0x04,0x02,0x03,0x00,0x00,0x01,0x5f,0x0b,0x07,0x0a,0x05,0x09,0x03,0x08,0x07,0x01,0x00,0x01,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06, +0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0xdb,0x64,0xfd,0xda,0x64,0x32,0x64,0x32,0x64,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x00,0x00,0x00,0x04,0x00,0xc8,0xff,0x3d,0x01,0x90,0x03,0xa7,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00, +0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07, +0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x02,0xd0,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0x01,0x0e,0x02,0x6c, +0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0xfa,0x01,0x72,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x03,0x00,0x25,0x01,0x0e,0x02,0x33,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x0b, +0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15, +0x33,0x35,0x33,0x15,0x01,0xb5,0x7e,0xfd,0xf2,0x7e,0x4a,0x7e,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x00,0x03,0x00,0xc8,0xff,0x25,0x01,0x90,0x03,0xaa,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x07,0x01,0x03,0x04,0x03,0x85,0x00,0x04, +0x05,0x04,0x85,0x08,0x01,0x05,0x05,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x02,0x64,0x01,0x46,0xfe,0xba,0xfe,0x52,0x01,0x65,0xfe, +0x9b,0xfe,0x6f,0x01,0x46,0xfe,0xba,0x00,0x00,0x01,0x00,0xc8,0x01,0x40,0x01,0x90,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0x01,0x40,0x03,0x20,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0xff,0xec, +0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xdc,0xc8,0xdc,0x01,0x0e,0xc8, +0x02,0x8a,0xfd,0x76,0xc8,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x90,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11, +0x14,0xdc,0xc8,0x01,0x0e,0xc8,0x02,0x8a,0xfc,0xae,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x11,0x33,0x11,0x23, +0x11,0xfa,0x32,0xc8,0x32,0xfe,0x70,0x02,0xd0,0x03,0x20,0xfc,0xe0,0xfd,0x30,0x00,0x00,0x01,0x00,0xc8,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06, +0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0xc8,0xc8,0xdc,0x01,0x0e,0x03,0x52,0xfd,0x76,0xc8,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0xfe, +0x70,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11, +0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00, +0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0xc8,0xdc,0xdc,0xc8,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07, +0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xc8,0xdc,0xdc,0xfe,0x70,0x05,0xf0,0xfd,0x76,0xc8,0xfd, +0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x37,0x40,0x34,0x00,0x02,0x01,0x02,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x03,0x01,0x01,0x04,0x00,0x01,0x57,0x00,0x04,0x00,0x05,0x00,0x04,0x05,0x67,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11, +0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x15,0x33,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0x32,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00, +0x04,0x86,0x00,0x01,0x02,0x00,0x01,0x57,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8, +0x32,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x04,0x00,0x57,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b, +0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00, +0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0xfd,0x30, +0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35, +0x33,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0xdc,0x01,0xa4,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x32,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f, +0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xc8,0xdc,0xdc,0xc8,0xdc,0x01,0x0e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x03,0x02, +0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc, +0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x36,0x40,0x33,0x00,0x02,0x01,0x02,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x05,0x01,0x00,0x01,0x00,0x4f, +0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xdc,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x0d, +0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x21,0x24,0x04,0x06,0x18,0x2b,0x13,0x11,0x34,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x11,0xfa,0x3a,0x69,0x48,0x23,0x23,0x66,0x96,0x53,0xfe,0x70,0x01, +0xe0,0x49,0x6c,0x3b,0x64,0x54,0x99,0x67,0xfe,0x20,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x0d,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x59,0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x21,0x24,0x04,0x06,0x18,0x2b,0x13,0x11, +0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x11,0xfa,0x53,0x97,0x65,0x23,0x23,0x47,0x6a,0x3a,0xfe,0x70,0x01,0xe0,0x67,0x99,0x54,0x64,0x3b,0x6c,0x49,0xfe,0x20,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x0d,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x59,0x00, +0x00,0x00,0x02,0x61,0x03,0x01,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x0d,0x00,0x0c,0x14,0x21,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x32,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x14,0x23,0x48,0x69,0x3a,0x64,0x53,0x96,0x66,0x01,0x40,0x64,0x3b,0x6c,0x49,0x01,0xcc,0xfe,0x34,0x67,0x99,0x54,0x00,0x00,0x00,0x01,0x00,0xfa, +0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x26,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0c,0x0a,0x06,0x05,0x00,0x0d,0x01,0x0d,0x04,0x06,0x16,0x2b,0x01,0x22,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x16,0x33,0x33,0x15,0x02,0x49, +0x65,0x97,0x53,0x64,0x3a,0x6a,0x47,0x23,0x01,0x40,0x54,0x99,0x67,0x01,0xcc,0xfe,0x34,0x49,0x6c,0x3b,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x0f,0x00,0x28,0x40,0x25,0x0e,0x0b,0x0a,0x09,0x06,0x03,0x02,0x01,0x08,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x04,0x03,0x02,0x02,0x02, +0x76,0x00,0x00,0x00,0x0f,0x00,0x0f,0x14,0x12,0x14,0x05,0x06,0x19,0x2b,0x07,0x35,0x01,0x01,0x35,0x33,0x13,0x13,0x33,0x15,0x01,0x01,0x15,0x23,0x03,0x03,0x14,0x01,0x0d,0xfe,0xf3,0x50,0xf0,0xf0,0x50,0xfe,0xf3,0x01,0x0d,0x50,0xf0,0xf0,0xa0,0x28,0x01,0xe0,0x01,0xe0,0x28,0xfe,0x57,0x01,0xa9,0x28,0xfe,0x20,0xfe,0x20,0x28,0x01, +0xa9,0xfe,0x57,0x00,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x05,0x01,0x35,0x33,0x01,0x15,0x02,0x1c,0xfd,0xd0,0x50,0x02,0x30,0xa0,0x03,0xe8, +0x28,0xfc,0x18,0x28,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x07,0x35,0x01,0x33,0x15,0x01,0x14,0x02,0x30,0x50,0xfd,0xd0,0xa0,0x28,0x03,0xe8, +0x28,0xfc,0x18,0x00,0x00,0x02,0x00,0x46,0x01,0x40,0x02,0x12,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x35, +0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x72,0xa0,0xfe,0x34,0xa0,0x01,0x40,0x64,0x64,0x64,0x64,0x00,0x00,0x00,0x02,0x00,0xfa,0xff,0x5b,0x01,0x5e,0x03,0x7d,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04, +0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xfa,0x64,0x64,0x64,0x01,0xb8,0x01,0xc5,0xfe,0x3b,0xfd,0xa3,0x01,0xc7,0xfe,0x39,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, +0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0xfe,0x70,0x03,0x34,0xfc,0xcc,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00, +0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01, +0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0xd0,0x64,0xfc,0xcc,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01, +0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b, +0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x02,0x80,0x01,0x40,0x64,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, +0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x01,0x72,0x01,0x40,0x64,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02, +0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x35,0x21,0x35,0x21,0x35,0x21,0x15,0xfa,0xfe,0xf2,0x01,0x0e,0x01,0x72,0x01,0x0e,0x32,0x64,0x32,0xc8,0x00,0x00,0x04,0x00,0x19,0x01,0x40,0x02,0x3f,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x42, +0x40,0x3f,0x06,0x04,0x02,0x03,0x00,0x01,0x01,0x00,0x57,0x06,0x04,0x02,0x03,0x00,0x00,0x01,0x5f,0x0b,0x07,0x0a,0x05,0x09,0x03,0x08,0x07,0x01,0x00,0x01,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06, +0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0xdb,0x64,0xfd,0xda,0x64,0x32,0x64,0x32,0x64,0x01,0x40,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x00,0x00,0x00,0x04,0x00,0xfa,0xff,0x3d,0x01,0x5e,0x03,0xa7,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00, +0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07, +0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0xfa,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x02,0xd0,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x02,0x6c, +0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0xfa,0x01,0x72,0x01,0x40,0x64,0x64,0x00,0x00,0x03,0x00,0x25,0x01,0x40,0x02,0x33,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x0b, +0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15, +0x33,0x35,0x33,0x15,0x01,0xb5,0x7e,0xfd,0xf2,0x7e,0x4a,0x7e,0x01,0x40,0x64,0x64,0x64,0x64,0x64,0x64,0x00,0x03,0x00,0xfa,0xff,0x25,0x01,0x5e,0x03,0xaa,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x07,0x01,0x03,0x04,0x03,0x85,0x00,0x04, +0x05,0x04,0x85,0x08,0x01,0x05,0x05,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xfa,0x64,0x64,0x64,0x64,0x64,0x02,0x58,0x01,0x52,0xfe,0xae,0xfe,0x69,0x01,0x4e,0xfe, +0xb2,0xfe,0x64,0x01,0x51,0xfe,0xaf,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0x01,0x40,0x03,0x20,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0x00,0xc8, +0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0xc8,0x32,0x64,0x32,0xfe,0x70,0x03,0x34,0x02,0xbc,0xfd,0x44,0xfc,0xcc,0x00, +0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x14,0x01,0x0e, +0x64,0x01,0x0e,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35, +0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0x64,0x01,0x40,0x64,0x02,0xbc,0xfc,0xe0,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06, +0x18,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0xfa,0x64,0x01,0x0e,0x01,0x40,0x03,0x20,0xfd,0x44,0x64,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0xfe, +0x70,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11, +0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03, +0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfa,0x10,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c, +0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70, +0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x37,0x40,0x34,0x00,0x03,0x02,0x03,0x85,0x07,0x01,0x06,0x05,0x06,0x86,0x04,0x01,0x02,0x01,0x05,0x02,0x57,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x05,0x5f,0x00,0x05,0x02,0x05,0x4f,0x00,0x00,0x00, +0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x33,0x35,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0xdc,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x32,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b, +0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x01,0x72,0xfe,0xf2,0xfe, +0x70,0x02,0xd0,0x64,0x32,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11, +0x06,0x06,0x1a,0x2b,0x13,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0x01,0x0e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x03,0x02,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x01,0x04,0x03, +0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd, +0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x02,0x00,0x01,0x57,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b, +0x13,0x11,0x23,0x35,0x21,0x15,0x33,0x15,0x23,0x11,0xc8,0xdc,0x01,0xa4,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x32,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x04,0x00,0x57,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00, +0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x14,0xdc,0xc8,0xdc,0xdc,0x01,0x0e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31, +0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc, +0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x36,0x40,0x33,0x00,0x03,0x04,0x03,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x00,0x04,0x02,0x00,0x04,0x57,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x00,0x5f,0x05,0x01, +0x00,0x04,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0x32,0xdc,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c, +0x04,0x60,0x00,0x0b,0x00,0x2c,0x40,0x29,0x03,0x01,0x01,0x00,0x01,0x85,0x04,0x02,0x02,0x00,0x05,0x05,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xaa, +0x64,0x64,0x64,0xaa,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0xc2,0x04,0x60,0x00,0x09,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x04,0x04,0x00,0x57,0x02,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11, +0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x14,0xaa,0x64,0x64,0x64,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x29,0x40,0x26,0x02,0x01,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x04,0x04,0x01, +0x57,0x03,0x01,0x01,0x01,0x04,0x5f,0x05,0x01,0x04,0x01,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x96,0x64,0x64,0x64,0xaa,0x01,0x40,0x03,0x20,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c, +0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21, +0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f, +0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xdc,0xc8,0xdc,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00, +0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0x32,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfc,0xe0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec, +0x01,0x40,0x01,0x90,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x14,0xdc,0xc8,0x01,0x40,0x64,0x02,0xbc,0xfc,0xe0,0x00,0x00, +0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x01,0x02,0x01,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x5f,0x03,0x01,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x11,0x33,0x11, +0x33,0x15,0x21,0x11,0xfa,0x32,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x03,0x20,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00, +0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0xc8,0xc8,0xdc,0x01,0x40,0x03,0x20,0xfd,0x44,0x64,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01, +0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec, +0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0x01, +0x0e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06, +0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xfc,0x9a,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x5e,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f, +0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0x64,0x01,0x0e,0xc8,0x02,0x8a,0xfc,0xae,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x01,0x00,0x01,0x85,0x05,0x01,0x04,0x03,0x04,0x86,0x02, +0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x03,0x66,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x01,0x00,0xfa, +0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0xfa,0x64,0x01,0x0e,0x01,0x0e,0x03,0x52,0xfd,0x76,0xc8,0x00, +0x00,0x02,0xff,0xec,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x0b,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07, +0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x05,0x35,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0xfd,0x80,0x02,0x80,0x01,0xa4,0x64,0x02,0x58,0xfd,0xa8,0x64,0xc8,0x64,0x64,0x00,0x01,0xff,0xec,0x00,0xdc,0x01,0x5e,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x03,0x02,0x03,0x85,0x00,0x02,0x00, +0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x04,0x04,0x00,0x57,0x00,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x27,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0x64,0xdc,0x64,0x64,0x64,0x02,0x58,0xfc,0x7c,0x00,0x00, +0x00,0x01,0x00,0xfa,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x37,0x11,0x33,0x11, +0x21,0x15,0x21,0x15,0x21,0x15,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xdc,0x03,0x84,0xfd,0xa8,0x64,0x64,0x64,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x13,0x00,0x38,0x40,0x35,0x04,0x01,0x02,0x01,0x02,0x85,0x0a,0x09,0x02,0x07,0x00,0x07,0x86,0x05,0x03,0x02,0x01,0x00,0x00,0x01,0x57,0x05,0x03,0x02, +0x01,0x01,0x00,0x5f,0x08,0x06,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0xaa,0x64,0x64,0x64,0xaa,0xaa,0x64,0x64,0xfe,0x70,0x02,0xd0, +0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x02,0xff,0xec,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x07,0x00,0x0b,0x00,0x35,0x40,0x32,0x04,0x01,0x02,0x01,0x02,0x85,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f, +0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x96,0xaa,0xaa,0x64,0x64,0x64,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfa,0x10,0x05,0xf0,0xfa,0x10,0x00,0x02,0x00,0x96,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07, +0x00,0x0b,0x00,0x35,0x40,0x32,0x04,0x01,0x00,0x01,0x00,0x85,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x01,0x11,0x33,0x11,0x33,0x15,0x23, +0x11,0x21,0x11,0x33,0x11,0x01,0x5e,0x64,0xaa,0xaa,0xfe,0xd4,0x64,0xfe,0x70,0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01, +0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90, +0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0xc8,0xdc,0xdc,0xc8,0xfe,0x70,0x02,0xd0, +0x64,0x02,0xbc,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b, +0x13,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xc8,0xdc,0xdc,0xfe,0x70,0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f, +0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e, +0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70, +0x02,0x9e,0xc8,0x02,0x8a,0xfa,0x10,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b, +0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x05,0xf0,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x13,0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01, +0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x0e, +0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0x02,0x58,0xfd,0xa8,0x64,0x64,0x64,0xfd,0x94,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00, +0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0x02,0x58,0xfa,0x10,0x00, +0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06, +0x1b,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x05,0xf0,0xfd,0xa8,0x64,0x64,0x64,0xfd,0x94,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x00,0x02,0x03,0x01,0x01,0x00,0x02,0x01,0x67,0x04,0x01,0x00, +0x05,0x05,0x00,0x57,0x04,0x01,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x31,0x35,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x15,0x01,0x13,0xfe,0xed,0x02,0x58,0xfe,0xed,0x01,0x13,0x2d,0x02,0x80,0x2d,0x2d,0xfd,0x80,0x2d,0x00,0x00,0x00, +0x00,0x02,0x00,0x44,0xff,0xf5,0x02,0x2e,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x4d,0x40,0x4a,0x11,0x0e,0x0a,0x03,0x04,0x05,0x01,0x4c,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x07,0x01,0x04,0x03,0x00,0x04,0x59,0x07,0x01,0x04,0x04,0x00,0x61,0x06, +0x01,0x00,0x04,0x00,0x51,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0d,0x0c,0x08,0x06,0x00,0x14,0x01,0x14,0x08,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16, +0xf9,0x50,0x65,0x65,0x50,0x45,0x59,0x05,0x02,0x36,0x53,0x65,0x6c,0x55,0x3c,0x01,0x06,0x59,0x3f,0x2c,0x34,0x34,0x2c,0x2c,0x34,0x34,0x0b,0x67,0x57,0xbf,0x57,0x67,0x58,0x48,0x96,0xfe,0xf5,0xfe,0xe5,0xa6,0x50,0x61,0x4e,0x3c,0x34,0xbf,0x34,0x3c,0x3c,0x34,0xbf,0x34,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x44,0xff,0x5b,0x02,0x2e, +0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x26,0x00,0x5d,0x40,0x5a,0x11,0x0e,0x0a,0x03,0x04,0x05,0x01,0x4c,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x09,0x01,0x04,0x08,0x01,0x00,0x06,0x04,0x00,0x69,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07, +0x5f,0x0a,0x01,0x07,0x06,0x07,0x4f,0x23,0x23,0x16,0x15,0x01,0x00,0x23,0x26,0x23,0x26,0x25,0x24,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0d,0x0c,0x08,0x06,0x00,0x14,0x01,0x14,0x0b,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x06,0x06,0x27,0x32,0x36,0x35, +0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x07,0x35,0x21,0x15,0xf9,0x50,0x65,0x65,0x50,0x45,0x59,0x05,0x02,0x36,0x53,0x65,0x6c,0x55,0x3c,0x01,0x06,0x59,0x3f,0x2c,0x34,0x34,0x2c,0x2c,0x34,0x34,0x87,0x01,0xe0,0x0b,0x67,0x57,0xbf,0x57,0x67,0x58,0x48,0x96,0xfe,0xf5,0xfe,0xe5,0xa6,0x50,0x61,0x4e,0x3c,0x34,0xbf,0x34, +0x3c,0x3c,0x34,0xbf,0x34,0x3c,0xe8,0x4b,0x4b,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x92,0x02,0x1c,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b, +0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x35,0x33,0x03,0x33,0x13,0x33,0x15,0x23,0x13,0x23,0x03,0x3c,0xbd,0xae,0x5f,0xae,0xc4,0xa6,0x97,0x5f,0x97,0x01,0x22,0x50,0x01,0xcc,0xfe,0x34,0x50,0xfe,0x70,0x01,0x90,0x00,0xff,0xff,0xff,0xf6,0xff,0x92,0x02,0x62,0x03,0x3e,0x02,0x26,0x03,0x3e,0x00,0x00,0x00,0x06,0x04,0xbb, +0x00,0x00,0x00,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x27,0x00,0x37,0x00,0x4d,0x40,0x4a,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x04,0x04,0x06,0x59,0x0b,0x01,0x06,0x06,0x04,0x61,0x0a,0x01,0x04,0x06,0x04, +0x51,0x29,0x28,0x19,0x18,0x0d,0x0c,0x01,0x00,0x31,0x2f,0x28,0x37,0x29,0x37,0x21,0x1f,0x18,0x27,0x19,0x27,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26, +0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x52,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76, +0x4a,0x4a,0x76,0x44,0x44,0x76,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x01,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f, +0x00,0x1f,0x00,0x2b,0x00,0x37,0x00,0x53,0x40,0x50,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x0a,0x01,0x04,0x02,0x06,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x2d,0x2c,0x21,0x20,0x11,0x10,0x01,0x00,0x33, +0x31,0x2c,0x37,0x2d,0x37,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34, +0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x36,0x49,0x49,0x36,0x36,0x49,0x49,0x36,0x23,0x2e,0x2e,0x23,0x22,0x2f,0x2f,0x32,0x51,0x8d,0x58, +0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x85,0x49,0x36,0x36,0x49,0x49,0x36,0x36,0x49,0x2e,0x2f,0x22,0x23,0x2e,0x2e,0x23,0x22,0x2f,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x29,0x00,0x4b,0x40,0x48,0x24,0x01,0x04,0x03, +0x29,0x28,0x27,0x21,0x04,0x02,0x04,0x02,0x4c,0x05,0x01,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x26,0x25,0x23,0x22,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01, +0x0f,0x08,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44, +0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x01,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x95,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43,0x00,0x03,0xff,0xf6,0xff,0x92,0x02,0x62,0x03,0x3e,0x00,0x15, +0x00,0x1e,0x00,0x27,0x00,0x24,0x40,0x21,0x24,0x23,0x1b,0x1a,0x14,0x0c,0x09,0x01,0x08,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x15,0x00,0x15,0x1a,0x03,0x06,0x17,0x2b,0x05,0x35,0x2e,0x02,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x1e,0x02,0x15,0x14,0x06,0x06,0x07,0x15,0x01,0x14, +0x16,0x16,0x17,0x11,0x0e,0x02,0x05,0x34,0x26,0x26,0x27,0x11,0x3e,0x02,0x01,0x13,0x52,0x81,0x4a,0x4a,0x81,0x52,0x32,0x52,0x81,0x4a,0x4a,0x81,0x52,0xfe,0xe3,0x3d,0x6a,0x44,0x44,0x6a,0x3d,0x02,0x08,0x3d,0x6a,0x44,0x44,0x6a,0x3d,0x6e,0xa1,0x06,0x53,0x88,0x54,0x54,0x88,0x53,0x06,0xa1,0xa1,0x06,0x53,0x88,0x54,0x54,0x88,0x53, +0x06,0xa1,0x01,0xd6,0x46,0x71,0x46,0x06,0x02,0x06,0x06,0x46,0x71,0x46,0x46,0x71,0x46,0x06,0xfd,0xfa,0x06,0x46,0x71,0x00,0x00,0x03,0xff,0xf6,0xff,0x5b,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x07,0x01,0x02,0x06,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04, +0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x20,0x20,0x11,0x10,0x01,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35, +0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x03,0x35,0x21,0x15,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0xce,0x02,0x30,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44, +0x76,0x4a,0x4a,0x76,0x44,0xfe,0xf7,0x4b,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x68,0x01,0xcc,0x02,0x26,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x30,0x00,0x02,0x01,0x03,0x01,0x02,0x03,0x80,0x05,0x01,0x03,0x03,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x04,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00, +0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x13,0x33,0x03,0x8c,0x01,0x40,0xfe,0xd9,0x50,0x82,0x82,0x01,0xdb,0x4b,0x4b,0xfe,0x8d,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0x00,0x04,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x24,0x00,0x42, +0x40,0x3f,0x09,0x01,0x05,0x06,0x05,0x86,0x03,0x01,0x01,0x08,0x02,0x07,0x03,0x00,0x04,0x01,0x00,0x69,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x00,0x06,0x04,0x06,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x21,0x20,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0a,0x06, +0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x03,0x21,0x03,0x27,0x36,0x36,0x37,0x13,0x21,0x13,0x16,0x16,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xc1,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xca,0xbc,0x01,0xf4,0xbd,0x3c,0x04,0x13,0x0d, +0x65,0xfe,0xec,0x69,0x0d,0x11,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfc,0xcf,0x02,0xda,0xfd,0x26,0x46,0x17,0x59,0x34,0x01,0xa0,0xfe,0x5f,0x34,0x58,0x00,0x03,0x00,0x32,0xff,0x92,0x02,0x26,0x03,0x3e,0x00,0x0b,0x00,0x0e,0x00,0x11,0x00,0x42,0x40,0x3f,0x0f,0x0c,0x02,0x00, +0x06,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x00,0x06,0x05,0x06,0x00,0x05,0x80,0x08,0x01,0x05,0x05,0x84,0x03,0x01,0x01,0x06,0x06,0x01,0x57,0x03,0x01,0x01,0x01,0x06,0x5f,0x07,0x01,0x06,0x01,0x06,0x4f,0x00,0x00,0x11,0x10,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x06,0x1b,0x2b,0x05,0x35,0x23,0x03, +0x33,0x35,0x33,0x15,0x33,0x03,0x23,0x15,0x03,0x03,0x23,0x13,0x13,0x23,0x01,0x13,0x25,0xbc,0xe1,0x32,0xe1,0xbd,0x24,0x2d,0x04,0x72,0xa2,0x72,0x72,0x6e,0x6e,0x02,0xda,0x64,0x64,0xfd,0x26,0x6e,0x01,0x21,0x01,0xd7,0xfe,0x29,0x01,0xd7,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0x92,0x02,0x26,0x03,0x3e,0x00,0x0b,0x00,0x0e,0x00,0x11, +0x00,0x40,0x40,0x3d,0x11,0x0e,0x02,0x06,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x06,0x01,0x85,0x08,0x01,0x05,0x00,0x05,0x86,0x07,0x01,0x06,0x00,0x00,0x06,0x57,0x07,0x01,0x06,0x06,0x00,0x5f,0x04,0x01,0x00,0x06,0x00,0x4f,0x00,0x00,0x10,0x0f,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x06, +0x1b,0x2b,0x05,0x35,0x23,0x13,0x33,0x35,0x33,0x15,0x33,0x13,0x23,0x15,0x27,0x33,0x11,0x13,0x33,0x03,0x01,0x13,0xe1,0xbe,0x23,0x32,0x24,0xbd,0xe1,0xa3,0x72,0x30,0x73,0x73,0x6e,0x6e,0x02,0xda,0x64,0x64,0xfd,0x26,0x6e,0xbe,0x01,0xd3,0xfe,0x2d,0x01,0xd2,0x00,0x00,0x00,0x03,0x00,0x2d,0xff,0x5b,0x02,0x2b,0x02,0xda,0x00,0x03, +0x00,0x0c,0x00,0x10,0x00,0x3c,0x40,0x39,0x09,0x01,0x02,0x00,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x05,0x01,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x06,0x01,0x04,0x03,0x04,0x4f,0x0d,0x0d,0x00,0x00,0x0d,0x10,0x0d,0x10,0x0f,0x0e,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x07,0x06, +0x17,0x2b,0x33,0x13,0x33,0x13,0x25,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x35,0x21,0x15,0x32,0xbe,0x79,0xbd,0xfe,0x7c,0x01,0x15,0x67,0x0d,0x12,0x05,0x04,0x13,0x0d,0xdb,0x01,0xfe,0x02,0xda,0xfd,0x26,0x50,0x01,0x9f,0x34,0x5a,0x17,0x16,0x5a,0x34,0xfd,0x6b,0x4b,0x4b,0x00,0x00,0x00,0x03,0x00,0x32,0x00,0x00,0x02,0x26, +0x03,0xb1,0x00,0x19,0x00,0x1d,0x00,0x26,0x00,0x97,0x4b,0xb0,0x14,0x50,0x58,0x40,0x35,0x00,0x05,0x03,0x01,0x04,0x05,0x72,0x00,0x02,0x04,0x00,0x01,0x02,0x72,0x0a,0x01,0x07,0x08,0x07,0x86,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x09,0x01,0x00,0x06,0x04,0x00,0x6a,0x00,0x06,0x08,0x08,0x06,0x57,0x00,0x06,0x06,0x08, +0x5f,0x00,0x08,0x06,0x08,0x4f,0x1b,0x40,0x37,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x0a,0x01,0x07,0x08,0x07,0x86,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x09,0x01,0x00,0x06,0x04,0x00,0x6a,0x00,0x06,0x08,0x08,0x06,0x57,0x00,0x06,0x06,0x08,0x5f,0x00,0x08,0x06,0x08,0x4f, +0x59,0x40,0x1d,0x1a,0x1a,0x01,0x00,0x23,0x22,0x1a,0x1d,0x1a,0x1d,0x1c,0x1b,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0b,0x06,0x16,0x2b,0x01,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x03,0x03,0x21,0x03,0x27,0x36,0x36, +0x37,0x13,0x21,0x13,0x16,0x16,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0xad,0xbc,0x01,0xf4,0xbd,0x3c,0x04,0x13,0x0d,0x65,0xfe,0xec,0x69,0x0d,0x11,0x03,0x2f,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0xfc,0xd1,0x02,0xda,0xfd,0x26, +0x46,0x17,0x59,0x34,0x01,0xa0,0xfe,0x5f,0x34,0x58,0x00,0x00,0x00,0x03,0xff,0xf6,0xff,0x5b,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x27,0x40,0x24,0x07,0x06,0x05,0x03,0x02,0x01,0x06,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x08,0x08,0x08,0x0b,0x08,0x0b, +0x19,0x03,0x06,0x17,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x03,0x35,0x21,0x15,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0x30,0x02,0x30,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0xfd,0xf3,0x4b,0x4b,0x00,0xff,0xff,0x00,0x3c,0x00,0x32,0x02,0x1c,0x03,0x0c,0x00,0x27,0x06,0x72,0x02,0x58, +0x00,0x00,0x02,0x06,0x04,0x27,0x00,0x00,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x17,0x00,0x28,0x40,0x25,0x16,0x0d,0x0a,0x01,0x04,0x03,0x00,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x17,0x00,0x17,0x15,0x15,0x15,0x05,0x06,0x19,0x2b,0x05,0x35, +0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x07,0x15,0x01,0x13,0x5a,0x69,0x32,0x4e,0x43,0x32,0x43,0x4e,0x32,0x69,0x5a,0x6e,0xc9,0x08,0x75,0x5e,0x01,0x40,0xfe,0xbb,0x47,0x5a,0x08,0x02,0xb6,0xfd,0x4a,0x08,0x5a,0x47,0x01,0x45,0xfe,0xc0,0x5e,0x75,0x08,0xc9,0x00,0x00, +0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x4b,0x40,0x48,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x0b,0x0c,0x02,0x08,0x09,0x01,0x08,0x69,0x0d,0x0a,0x02,0x09,0x06,0x01,0x02,0x03,0x09,0x02,0x69,0x05,0x01,0x03,0x04,0x04,0x03,0x57,0x05,0x01,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04, +0x4f,0x24,0x23,0x1b,0x1a,0x29,0x28,0x23,0x2b,0x24,0x2b,0x20,0x1f,0x1a,0x22,0x1b,0x22,0x14,0x21,0x11,0x11,0x12,0x14,0x21,0x10,0x0e,0x06,0x1e,0x2b,0x13,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x07,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x35, +0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0xff,0x5a,0x05,0x35,0x43,0x43,0x35,0x05,0xff,0xfd,0xa8,0xff,0x05,0x34,0x44,0x44,0x34,0x05,0x05,0x23,0x2d,0x2d,0x23,0x05,0x5f,0x23,0x2d,0x2d,0x23,0x05,0x02,0x58,0x91,0x43,0x35,0x34,0x44,0x87,0x50,0x50,0x87,0x44,0x34,0x35,0x43,0x28,0x2d,0x23,0x23,0x2d,0xa0,0xa0,0x2d,0x23,0x23, +0x2d,0xa0,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x5b,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x0b,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09, +0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x31,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x05,0x35,0x21,0x15,0xff,0x5a,0xff,0xfd,0xa8,0x02,0x58,0x50,0x02,0x08,0xfd,0xf8,0x50,0xa5,0x4b,0x4b,0x00,0x00,0x01,0x00,0x00,0xff,0xf6,0x02,0x58,0x02,0xda,0x00,0x0e,0x00,0x2b,0x40,0x28,0x00,0x03,0x02,0x03,0x85,0x06,0x01,0x00, +0x01,0x00,0x86,0x04,0x01,0x02,0x01,0x01,0x02,0x57,0x04,0x01,0x02,0x02,0x01,0x5f,0x05,0x01,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1d,0x2b,0x05,0x27,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x01,0x2d,0xc9,0x9b,0xff,0xff,0x5a,0xff,0xff,0x9b,0x0a,0xa9,0xa6,0x50,0x01,0x45, +0xfe,0xbb,0x50,0xa6,0x00,0x02,0x00,0x50,0xff,0x5b,0x02,0x17,0x02,0x2d,0x00,0x2c,0x00,0x30,0x00,0x62,0x40,0x5f,0x07,0x01,0x05,0x04,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x06,0x0a,0x01, +0x00,0x08,0x06,0x00,0x69,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0b,0x01,0x09,0x08,0x09,0x4f,0x2d,0x2d,0x02,0x00,0x2d,0x30,0x2d,0x30,0x2f,0x2e,0x2a,0x29,0x27,0x24,0x20,0x1e,0x1d,0x1b,0x18,0x15,0x13,0x12,0x10,0x0d,0x00,0x2c,0x02,0x2c,0x0c,0x06,0x16,0x2b,0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26, +0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x05,0x35,0x21,0x15,0x01,0x4b,0x34,0x5b,0x6c,0x41,0x46,0x3a,0x3b,0x64,0x58,0x2e,0x53,0x6b,0x09,0x5f,0x05,0x38,0x2b,0x2e,0x5d,0x30,0x2e,0x7b,0x83, +0x33,0x35,0x37,0x31,0x34,0x2e,0x3b,0x04,0x5f,0x0a,0x6d,0xfe,0xc2,0x01,0x9e,0x07,0x58,0x49,0x3e,0x47,0x05,0x04,0x04,0x3a,0x31,0x47,0x4f,0x4c,0x42,0x1d,0x21,0x4b,0x24,0x2a,0x4e,0x30,0x28,0x25,0x30,0x1f,0x1a,0x40,0x49,0x9e,0x4b,0x4b,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x41,0x02,0x03,0x03,0x09,0x02,0x26,0x04,0x1b,0x00,0x00, +0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x02,0x7d,0x00,0x00,0x00,0x02,0x00,0x37,0xff,0x5b,0x02,0x26,0x02,0x26,0x00,0x0d,0x00,0x11,0x00,0x3c,0x40,0x39,0x00,0x02,0x00,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x06,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x05,0x05,0x04, +0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x08,0x06,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x05,0x35,0x21,0x15,0x01,0x9f,0x49,0x57,0xc8,0x01,0x22,0x26,0x20,0x87, +0xfe,0x16,0x01,0xea,0x55,0x46,0x01,0x39,0x52,0xfe,0x75,0x22,0x27,0x52,0xa5,0x4b,0x4b,0x00,0x00,0x00,0x00,0x04,0x00,0x7d,0x00,0xd2,0x01,0xdb,0x02,0xaf,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x4d,0x40,0x4a,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01, +0x06,0x04,0x04,0x06,0x59,0x0b,0x01,0x06,0x06,0x04,0x61,0x0a,0x01,0x04,0x06,0x04,0x51,0x25,0x24,0x19,0x18,0x0d,0x0c,0x01,0x00,0x2b,0x29,0x24,0x2f,0x25,0x2f,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14, +0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x52,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23, +0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x02,0x2f,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0xa3,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x00,0x03,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x01,0xc2,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x41,0x40,0x3e, +0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x07,0x01,0x02,0x06,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x25, +0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x35,0x21,0x15,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x7d,0x01,0x40,0xd2,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23, +0x2d,0xfe,0x61,0x4b,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x14,0x00,0x1d,0x00,0x45,0x40,0x42,0x00,0x02,0x01,0x02,0x85,0x0a,0x01,0x07,0x00,0x07,0x86,0x03,0x01,0x01,0x09,0x01,0x04,0x05,0x01,0x04,0x69,0x0b,0x08,0x02,0x05,0x00,0x00,0x05,0x59,0x0b,0x08,0x02,0x05,0x05,0x00,0x61,0x06,0x01, +0x00,0x05,0x00,0x51,0x16,0x15,0x00,0x00,0x19,0x17,0x15,0x1d,0x16,0x1d,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x11,0x11,0x24,0x21,0x0c,0x06,0x1d,0x2b,0x05,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x03,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2a,0x30,0x65,0x77, +0x77,0x65,0x30,0x32,0xde,0xde,0xde,0xde,0x67,0x35,0x35,0x4c,0x59,0x59,0x6e,0x01,0x04,0x75,0x62,0x62,0x75,0xfa,0xfa,0x2d,0xfe,0xac,0x2d,0xfe,0xfc,0x01,0x31,0x01,0x54,0x5c,0x4e,0x4e,0x5c,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x0e,0x00,0x37,0x40,0x34,0x06,0x01,0x02,0x03,0x05,0x01,0x01,0x02, +0x04,0x01,0x00,0x01,0x03,0x4c,0x00,0x03,0x02,0x03,0x85,0x00,0x00,0x01,0x00,0x86,0x04,0x01,0x02,0x01,0x01,0x02,0x57,0x04,0x01,0x02,0x02,0x01,0x5f,0x05,0x01,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x14,0x11,0x10,0x06,0x06,0x1c,0x2b,0x21,0x23,0x11,0x23,0x15,0x27,0x37,0x15,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x01,0x59,0x5a,0x77, +0x9c,0x9c,0x77,0x5a,0xff,0xff,0x01,0x45,0xa0,0xc8,0xc8,0xa0,0x01,0x45,0xfe,0xbb,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0xf6,0x02,0x21,0x02,0x30,0x00,0x2a,0x00,0x3a,0x40,0x37,0x28,0x01,0x01,0x02,0x01,0x4c,0x1e,0x1d,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01, +0x01,0x00,0x61,0x04,0x05,0x02,0x00,0x01,0x00,0x51,0x01,0x00,0x26,0x24,0x18,0x16,0x13,0x12,0x0f,0x0d,0x00,0x2a,0x01,0x2a,0x06,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x26,0x27,0x35,0x16,0x16,0x15,0x15,0x14, +0x06,0x23,0x22,0x26,0x27,0x06,0x06,0xb5,0x3a,0x44,0x4b,0x41,0x1a,0x1d,0x3d,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x1f,0x1d,0x44,0x4d,0x43,0x3b,0x31,0x3f,0x07,0x07,0x3f,0x0a,0x56,0x4b,0xcf,0x53,0x6d,0x0a,0x5f,0x05,0x3a,0x2c,0xd0,0x54,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xd0,0x29,0x37,0x06,0x5f,0x0a,0x6a,0x51,0xcf,0x4b,0x56,0x39, +0x32,0x32,0x39,0x00,0x00,0x02,0x00,0x37,0xff,0x5b,0x02,0x21,0x02,0x30,0x00,0x2a,0x00,0x2e,0x00,0x4a,0x40,0x47,0x28,0x01,0x01,0x02,0x01,0x4c,0x1e,0x1d,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x04,0x07,0x02,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01, +0x06,0x05,0x06,0x4f,0x2b,0x2b,0x01,0x00,0x2b,0x2e,0x2b,0x2e,0x2d,0x2c,0x26,0x24,0x18,0x16,0x13,0x12,0x0f,0x0d,0x00,0x2a,0x01,0x2a,0x09,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x26,0x27,0x35,0x16,0x16,0x15, +0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x07,0x35,0x21,0x15,0xb5,0x3a,0x44,0x4b,0x41,0x1a,0x1d,0x3d,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x1f,0x1d,0x44,0x4d,0x43,0x3b,0x31,0x3f,0x07,0x07,0x3f,0xaf,0x01,0xea,0x0a,0x56,0x4b,0xcf,0x53,0x6d,0x0a,0x5f,0x05,0x3a,0x2c,0xd0,0x54,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xd0,0x29,0x37, +0x06,0x5f,0x0a,0x6a,0x51,0xcf,0x4b,0x56,0x39,0x32,0x32,0x39,0x9b,0x4b,0x4b,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05, +0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x31,0x40,0x2e,0x09,0x06,0x02,0x03,0x02,0x01,0x4c,0x00, +0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x08,0x07,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x03,0x21,0x01,0x05,0x21,0x01,0x02,0x58,0x32,0xfe,0x2a,0x01,0xd6,0xfe,0x0c,0x01,0xd8,0xfe,0x28,0x6f,0x03, +0xad,0xfc,0x53,0x03,0x80,0xfc,0xda,0x2d,0x03,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x0c,0x00,0x1c,0x00,0x25,0x00,0x55,0x40,0x52,0x25,0x1f,0x0a,0x07,0x04,0x04,0x05,0x01,0x4c,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x09,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x0a,0x01,0x04,0x00, +0x07,0x06,0x04,0x07,0x69,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x08,0x01,0x01,0x06,0x01,0x4f,0x0e,0x0d,0x05,0x04,0x00,0x00,0x23,0x21,0x1e,0x1d,0x16,0x14,0x0d,0x1c,0x0e,0x1c,0x09,0x08,0x04,0x0c,0x05,0x0c,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x32,0x16,0x17,0x35,0x21,0x15, +0x36,0x36,0x13,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x07,0x21,0x35,0x06,0x06,0x23,0x22,0x26,0x27,0x02,0x58,0xfe,0xd4,0x50,0x83,0x27,0xfe,0x0c,0x28,0x82,0x50,0x48,0x71,0x41,0x41,0x71,0x48,0x47,0x71,0x42,0x42,0x71,0xb3,0x01,0xf4,0x27,0x83,0x50,0x50,0x82,0x28,0x6f,0x03,0xad,0xfc,0x53, +0x03,0x04,0x46,0x3b,0xfd,0xfd,0x3c,0x45,0xfd,0xd9,0x42,0x71,0x47,0x47,0x71,0x42,0x42,0x71,0x47,0x47,0x71,0x42,0xb0,0xfe,0x3b,0x46,0x45,0x3c,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x13,0x00,0x1f,0x00,0x4c,0x40,0x49,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x09,0x01,0x04,0x07, +0x05,0x04,0x69,0x00,0x07,0x0a,0x01,0x06,0x02,0x07,0x06,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x15,0x14,0x09,0x08,0x00,0x00,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x0f,0x0d,0x08,0x13,0x09,0x13,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x15,0x11,0x21,0x11, +0x25,0x21,0x11,0x21,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x26,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfe,0xde,0x29,0x22, +0x22,0x29,0x29,0x22,0x22,0x29,0xfe,0x5c,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x4c,0x40,0x49,0x0d,0x0a,0x02,0x06,0x02,0x01,0x4c,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x00,0x00,0x08,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x02, +0x00,0x06,0x05,0x02,0x06,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x07,0x01,0x01,0x04,0x01,0x4f,0x04,0x04,0x00,0x00,0x13,0x12,0x0c,0x0b,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x21,0x35,0x01,0x21,0x11,0x03,0x23,0x03,0x13,0x36, +0x36,0x37,0x13,0x21,0x13,0x16,0x16,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xbd,0x79,0xbe,0xfe,0x05,0x0f,0x0e,0x70,0xfe,0xd9,0x6f,0x0e,0x14,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0x37,0x37,0xfc,0xad,0x02,0xf7,0xfd,0x4b,0x02,0xb6,0xfd,0x90,0x17,0x5a,0x34,0x01,0x9f,0xfe,0x60,0x34,0x59,0x00,0x00,0x00,0x04,0x00,0x00, +0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x16,0x00,0x50,0x40,0x4d,0x0f,0x01,0x04,0x02,0x08,0x05,0x02,0x06,0x04,0x02,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x00,0x08,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x67,0x00,0x05,0x01,0x01,0x05,0x57,0x00,0x05,0x05,0x01, +0x5f,0x07,0x01,0x01,0x05,0x01,0x4f,0x04,0x04,0x00,0x00,0x16,0x15,0x14,0x13,0x0b,0x0a,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x13,0x33,0x13,0x11,0x01,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x21,0x35,0x21,0x02,0x58,0xfd,0xda,0xbe,0x79,0xbd,0xfe,0x73, +0x01,0x27,0x70,0x0d,0x12,0x05,0x04,0x12,0x0e,0xd6,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfd,0x14,0x02,0xb5,0xfd,0x4b,0x02,0xec,0xfd,0x3f,0x01,0x9f,0x34,0x5b,0x16,0x16,0x5a,0x34,0xfd,0xce,0x42,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x08,0x00,0x0c,0x00,0x11,0x00,0x37, +0x40,0x34,0x11,0x10,0x0f,0x0c,0x0b,0x0a,0x08,0x05,0x08,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x0e,0x0d,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x17,0x11,0x21,0x11, +0x13,0x37,0x27,0x07,0x03,0x21,0x11,0x07,0x27,0x02,0x58,0xfe,0xd4,0xfa,0xfe,0x0c,0xfa,0xe8,0xe8,0xe8,0x12,0x01,0xf4,0xfa,0xfa,0x6f,0x03,0xad,0xfc,0x53,0x03,0x0e,0xfb,0x01,0x6d,0xfe,0x93,0xfe,0xdc,0xe8,0xe9,0xe9,0xfe,0x56,0x01,0x6e,0xfa,0xfa,0x00,0x05,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x13, +0x00,0x17,0x00,0x23,0x00,0x5d,0x40,0x5a,0x00,0x00,0x0b,0x01,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x0c,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x02,0x00,0x07,0x09,0x02,0x07,0x67,0x00,0x09,0x0d,0x01,0x08,0x06,0x09,0x08,0x69,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x0a,0x01,0x01,0x06,0x01,0x4f,0x19,0x18,0x09,0x08, +0x04,0x04,0x00,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x17,0x16,0x15,0x14,0x0f,0x0d,0x08,0x13,0x09,0x13,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0e,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x21,0x11,0x21,0x17,0x22,0x26,0x35,0x34, +0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xfe,0xe0,0x01,0xf4,0xfe,0x0c,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0x7c,0x01,0x84,0xfe,0xd4,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xfd,0xd9,0x01,0x84,0xf2,0x29,0x22,0x22, +0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x47,0x40,0x44,0x14,0x13,0x11,0x10,0x04,0x04,0x03,0x12,0x01,0x02,0x04,0x02,0x4c,0x05,0x01,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00, +0x02,0x02,0x01,0x60,0x07,0x01,0x01,0x02,0x01,0x50,0x00,0x00,0x1e,0x1d,0x19,0x18,0x0c,0x0b,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x23,0x11,0x14,0x06,0x07,0x33,0x36,0x36,0x37,0x37,0x15,0x07,0x27,0x35,0x17,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x23,0x02,0x58, +0xfd,0xda,0x01,0xf4,0xcd,0x03,0x02,0x0a,0x05,0x1b,0x16,0x60,0xc7,0xc9,0x5f,0x16,0x1d,0x04,0x0a,0x01,0x04,0xcd,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfd,0xc1,0x16,0x2d,0x0d,0x06,0x1d,0x12,0x51,0x69,0xa9,0xa9,0x69,0x50,0x12,0x1d,0x07,0x0d,0x2d,0x16,0x02,0x3f,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03, +0x00,0x0e,0x00,0x14,0x00,0x3e,0x40,0x3b,0x14,0x11,0x0e,0x0b,0x07,0x05,0x04,0x02,0x01,0x4c,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x00,0x00,0x02,0x04,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x05,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x00,0x03,0x00,0x03,0x11, +0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x35,0x21,0x15,0x11,0x21,0x11,0x03,0x23,0x03,0x02,0x58,0xfe,0xb4,0x0b,0x12,0x04,0x05,0x13,0x0a,0xd7,0xfe,0x0c,0x01,0xf4,0xdb,0x3e,0xdb,0x6f,0x03,0xad,0xfc,0x53,0xf0,0x1c,0x3a,0x11,0x11,0x3b,0x1b,0x02,0x49,0x47,0x3c,0xfc,0xe9,0x02,0x8f,0xfd, +0xa8,0x02,0x58,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x47,0x40,0x44,0x00,0x00,0x09,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x67,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x08,0x01, +0x01,0x06,0x01,0x4f,0x04,0x04,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0a,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x01,0x21,0x35,0x21,0x11,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfe,0x0c,0x6f, +0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0xf7,0x01,0x09,0xfe,0x07,0xa0,0xfe,0x06,0x01,0x0a,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x10,0x00,0x14,0x00,0x3b,0x40,0x38,0x14,0x13,0x0e,0x0a,0x09,0x06,0x05,0x07,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x00, +0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x04,0x04,0x00,0x00,0x12,0x11,0x04,0x07,0x04,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x05,0x11,0x03,0x25,0x11,0x25,0x36,0x36,0x37,0x26,0x26,0x01,0x21,0x11,0x05,0x02,0x58,0xfd,0xda,0x01,0xf4,0x78,0xfe, +0x84,0x01,0x7c,0x13,0x21,0x08,0x09,0x22,0xfe,0x73,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0x7c,0xfa,0x01,0x76,0xfe,0x6e,0xbc,0xfe,0x59,0xbb,0x09,0x0d,0x02,0x02,0x0e,0xfe,0x47,0x01,0x79,0xfa,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x02,0x26,0x04,0x4d,0x00,0x28,0x01,0x06,0x05,0x85, +0x00,0x00,0x00,0x08,0xb1,0x00,0x02,0xb0,0x28,0xb0,0x35,0x2b,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x5a,0x40,0x57,0x17,0x01,0x06,0x05,0x18,0x11,0x0a,0x03,0x03,0x06,0x0b,0x01,0x04,0x03,0x03,0x4c,0x00,0x05,0x07,0x06,0x07,0x05,0x06,0x80,0x00,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x00, +0x00,0x07,0x05,0x00,0x07,0x67,0x00,0x06,0x00,0x03,0x04,0x06,0x03,0x68,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1d,0x1c,0x1a,0x13,0x12,0x10,0x0f,0x08,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x23,0x22,0x26, +0x27,0x15,0x16,0x16,0x17,0x17,0x23,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36,0x33,0x33,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xf4,0x10,0x29,0x0d,0x09,0x1a,0x0a,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0d,0x19,0x07,0x0d,0x29,0x10,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x01,0x82,0x03,0x01,0x09,0x07,0x19,0x0d,0x6e, +0xc8,0xc8,0x6d,0x10,0x19,0x06,0x09,0x02,0x03,0x01,0x81,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x10,0x00,0x14,0x00,0x3b,0x40,0x38,0x14,0x13,0x0e,0x0a,0x09,0x06,0x05,0x07,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03, +0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x04,0x04,0x00,0x00,0x12,0x11,0x04,0x07,0x04,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x25,0x35,0x01,0x05,0x11,0x05,0x06,0x06,0x07,0x16,0x16,0x03,0x21,0x35,0x25,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x84,0x01,0x7c,0xfe,0x84,0x13,0x21,0x08,0x09, +0x22,0x67,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0x89,0xfa,0x7d,0xfe,0x41,0xbc,0x01,0xa7,0xbb,0x09,0x0d,0x02,0x02,0x0e,0xfe,0x64,0x7e,0xfa,0x00,0x05,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x1b,0x00,0x67,0x40,0x64,0x0f,0x01,0x05,0x03,0x02,0x03,0x05,0x02, +0x80,0x00,0x0c,0x0b,0x0a,0x0b,0x0c,0x0a,0x80,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x04,0x01,0x02,0x09,0x01,0x07,0x06,0x02,0x07,0x67,0x08,0x01,0x06,0x0d,0x01,0x0b,0x0c,0x06,0x0b,0x67,0x00,0x0a,0x01,0x01,0x0a,0x57,0x00,0x0a,0x0a,0x01,0x5f,0x0e,0x01,0x01,0x0a,0x01,0x4f,0x04,0x04,0x00,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16, +0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x04,0x0b,0x04,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x10,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x03,0x07,0x33,0x11,0x21,0x11,0x21,0x37,0x01,0x33,0x37,0x23,0x05,0x33,0x35,0x23,0x01,0x21,0x11,0x21,0x07,0x23,0x37,0x23,0x02,0x58,0x8e,0x40,0x9c,0xfe,0x0c, +0x01,0x12,0x40,0xfe,0xae,0xba,0x3a,0xf4,0x01,0x00,0xf4,0xba,0xfe,0xc6,0x01,0xf4,0xfe,0xee,0x3e,0x46,0x3e,0x9c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x26,0xaf,0x01,0x09,0xfe,0xf7,0xaf,0xfe,0x61,0xa0,0xa0,0xa0,0xfe,0x06,0x01,0x0a,0xaa,0xaa,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x1c, +0x00,0x2a,0x00,0xa7,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x3a,0x0c,0x01,0x08,0x07,0x0a,0x07,0x08,0x72,0x00,0x00,0x00,0x03,0x06,0x00,0x03,0x67,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x04,0x00,0x07,0x08,0x04,0x07,0x69,0x00,0x0a,0x0d,0x01,0x09,0x02,0x0a,0x09,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x0b, +0x01,0x01,0x02,0x01,0x4f,0x1b,0x40,0x3b,0x0c,0x01,0x08,0x07,0x0a,0x07,0x08,0x0a,0x80,0x00,0x00,0x00,0x03,0x06,0x00,0x03,0x67,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x04,0x00,0x07,0x08,0x04,0x07,0x69,0x00,0x0a,0x0d,0x01,0x09,0x02,0x0a,0x09,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x0b,0x01,0x01, +0x02,0x01,0x4f,0x59,0x40,0x24,0x1e,0x1d,0x08,0x08,0x00,0x00,0x25,0x22,0x1d,0x2a,0x1e,0x29,0x08,0x1c,0x08,0x1c,0x1b,0x1a,0x14,0x12,0x11,0x0f,0x0b,0x09,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x0e,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32, +0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x95,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x3d,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfd,0xbc, +0xb4,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x69,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x5a,0x40,0x57,0x0d,0x01,0x04,0x05,0x1a,0x13,0x0c,0x03,0x07,0x04,0x19,0x01,0x06,0x07,0x03,0x4c,0x00,0x05,0x03,0x04,0x03,0x05, +0x04,0x80,0x00,0x06,0x07,0x02,0x07,0x06,0x02,0x80,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x68,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1c,0x15,0x14,0x12,0x11,0x0a,0x08,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x09,0x06, +0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x11,0x33,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xf4,0x11,0x28,0x0d,0x07,0x19,0x0d,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0xf4,0x6f,0x03,0xad, +0xfc,0x53,0x2d,0x03,0x53,0xfe,0x7f,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xc8,0xc8,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x3c,0x40,0x39,0x08,0x05,0x02,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x06,0x01,0x03,0x01, +0x01,0x03,0x57,0x06,0x01,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x07,0x07,0x04,0x04,0x00,0x00,0x07,0x09,0x07,0x09,0x04,0x06,0x04,0x06,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x01,0x13,0x11,0x01,0x02,0x58,0xfd,0xda,0x01,0xd8,0x1c,0xfe,0x28,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80, +0xfc,0xd6,0x03,0x2a,0xfc,0xad,0x03,0x29,0xfc,0xd7,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x48,0x40,0x45,0x10,0x01,0x03,0x06,0x12,0x11,0x0f,0x0e,0x04,0x02,0x03,0x02,0x4c,0x04,0x01,0x03,0x06,0x02,0x06,0x03,0x02,0x80,0x00,0x00,0x00,0x06,0x03,0x00,0x06,0x67,0x05,0x01,0x02,0x01, +0x01,0x02,0x57,0x05,0x01,0x02,0x02,0x01,0x5f,0x07,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1d,0x1c,0x1b,0x17,0x16,0x0a,0x09,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x33,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x35,0x37,0x17,0x15,0x27,0x26,0x26,0x27,0x23,0x16,0x16,0x15,0x11, +0x33,0x11,0x21,0x02,0x58,0xfd,0xda,0xcd,0x04,0x01,0x0a,0x04,0x1d,0x16,0x5f,0xc9,0xc7,0x60,0x16,0x1b,0x05,0x0a,0x02,0x03,0xcd,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x02,0x40,0x16,0x2d,0x0d,0x07,0x1d,0x12,0x50,0x69,0xa9,0xa9,0x69,0x51,0x12,0x1d,0x06,0x0d,0x2d,0x16,0xfd,0xc0,0x03,0x53,0x00,0x00,0x00,0x00,0x03,0x00,0x00, +0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x09,0x00,0x14,0x00,0x43,0x40,0x40,0x14,0x10,0x0c,0x08,0x05,0x05,0x04,0x03,0x01,0x4c,0x06,0x01,0x03,0x02,0x04,0x02,0x03,0x04,0x80,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x05,0x01,0x01,0x04,0x01,0x4f,0x04,0x04,0x00,0x00, +0x0b,0x0a,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x13,0x11,0x21,0x11,0x13,0x03,0x21,0x35,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x02,0x58,0xfe,0xf3,0xdb,0xfe,0x0c,0xdb,0xdb,0x01,0xf4,0xd9,0x0a,0x13,0x05,0x04,0x12,0x0b,0xd8,0x6f,0x03,0xad,0xfc,0x53,0x03,0x49, +0xfd,0xa8,0x02,0x8f,0xfd,0x71,0x02,0x58,0xfc,0xe4,0x42,0x02,0x4e,0x1b,0x3b,0x11,0x11,0x3a,0x1c,0xfd,0xb2,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x49,0x40,0x46,0x0c,0x09,0x02,0x05,0x04,0x01,0x4c,0x00,0x04,0x03,0x05,0x03,0x04,0x05,0x80,0x07,0x01,0x05,0x02,0x03, +0x05,0x02,0x7e,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0b,0x0a,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x27,0x35,0x33,0x15, +0x07,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xd6,0x0c,0x60,0x0b,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfe,0x9d,0x96,0x96,0x96,0x96,0x00,0x00,0x02,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x38,0x40,0x35,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85, +0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x06,0x17,0x2b,0x01,0x27,0x35,0x33,0x15,0x07,0x03,0x35,0x21,0x15,0x01,0x08,0x0c,0x60,0x0b,0xc5,0x01,0x40,0x01,0xae,0x96,0x96,0x96,0x96,0xfd,0xad,0x4b,0x4b, +0x00,0x02,0x00,0x5e,0xff,0x4c,0x01,0xfe,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x3c,0x40,0x39,0x0e,0x01,0x03,0x04,0x01,0x4c,0x05,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x00,0x04,0x03,0x00,0x04,0x69,0x06,0x01,0x03,0x01,0x01,0x03,0x59,0x06,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x03,0x01,0x51,0x13,0x12,0x00,0x00,0x1a,0x18,0x12,0x1f, +0x13,0x1f,0x00,0x11,0x00,0x11,0x25,0x23,0x07,0x06,0x18,0x2b,0x17,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5e,0x70,0x61,0x61,0x6e,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x76,0x39,0x3d,0x3d,0x39,0x39,0x3d,0x3f, +0xb4,0x02,0x18,0x5f,0x6d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x44,0x40,0x96,0x40,0x44,0x44,0x40,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x6c,0x02,0xda,0x00,0x0e,0x00,0x3d,0x40,0x3a,0x09,0x01,0x01,0x02,0x0a,0x01,0x00,0x01,0x0b,0x01,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x02,0x85,0x06, +0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0e,0x14,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x35,0x17,0x07,0x35,0x23,0x11,0xff,0xff,0xff,0x5a,0x77,0x9c,0x9c,0x77,0x01,0x45, +0x50,0x01,0x45,0xfe,0xbb,0xa0,0xc8,0xc8,0xa0,0xfe,0xbb,0x00,0x00,0x03,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x02,0xe4,0x00,0x0d,0x00,0x11,0x00,0x15,0x00,0x48,0x40,0x45,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x80,0x07,0x01,0x03,0x04,0x00,0x03,0x04,0x7e,0x00,0x01,0x06,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00, +0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x12,0x12,0x0e,0x0e,0x01,0x00,0x12,0x15,0x12,0x15,0x14,0x13,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x13,0x33,0x03,0x07,0x35,0x21,0x15,0x01,0x22,0x21,0x2a, +0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x8c,0x50,0x82,0x82,0x6e,0x01,0x40,0x02,0x4e,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfd,0xc6,0x01,0x37,0xfe,0xc9,0xb9,0x4b,0x4b,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x92,0x02,0x1c,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03, +0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x17,0x13,0x23,0x35,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x03,0x4b,0x97,0xa6,0xc4,0xae,0x5f,0xae,0xbd,0xdb,0x97,0x6e,0x01,0x90,0x50,0x01,0xcc,0xfe,0x34,0x50, +0xfe,0x70,0x00,0x00,0x00,0x02,0x00,0xaa,0xff,0x91,0x01,0xae,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x17,0x11, +0x21,0x11,0x27,0x33,0x11,0x23,0xaa,0x01,0x04,0xd2,0xa0,0xa0,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0x00,0x03,0x00,0x7d,0x00,0xda,0x01,0xdb,0x02,0xaf,0x00,0x0b,0x00,0x17,0x00,0x21,0x00,0x42,0x40,0x3f,0x1c,0x01,0x04,0x00,0x01,0x4c,0x21,0x20,0x1f,0x19,0x04,0x04,0x49,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00, +0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x07,0x02,0x06,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x1e,0x1d,0x1b,0x1a,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x08,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06, +0x13,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x09,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0x02,0x2f,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0xab,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43, +0x00,0x01,0x00,0x41,0xff,0x92,0x02,0x17,0x03,0x3e,0x00,0x23,0x00,0x90,0x40,0x0c,0x0a,0x07,0x02,0x06,0x03,0x1c,0x19,0x02,0x07,0x02,0x02,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x31,0x00,0x01,0x00,0x01,0x85,0x00,0x03,0x00,0x06,0x02,0x03,0x72,0x08,0x01,0x07,0x02,0x04,0x06,0x07,0x72,0x00,0x05,0x04,0x05,0x86,0x00,0x00,0x00,0x06, +0x02,0x00,0x06,0x69,0x00,0x02,0x07,0x04,0x02,0x59,0x00,0x02,0x02,0x04,0x62,0x00,0x04,0x02,0x04,0x52,0x1b,0x40,0x33,0x00,0x01,0x00,0x01,0x85,0x00,0x03,0x00,0x06,0x00,0x03,0x06,0x80,0x08,0x01,0x07,0x02,0x04,0x02,0x07,0x04,0x80,0x00,0x05,0x04,0x05,0x86,0x00,0x00,0x00,0x06,0x02,0x00,0x06,0x69,0x00,0x02,0x07,0x04,0x02,0x59, +0x00,0x02,0x02,0x04,0x62,0x00,0x04,0x02,0x04,0x52,0x59,0x40,0x10,0x00,0x00,0x00,0x23,0x00,0x23,0x23,0x13,0x23,0x13,0x23,0x13,0x23,0x09,0x06,0x1d,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x23,0x11,0x26,0x26,0x23,0x22,0x06, +0x15,0x15,0x41,0x46,0x3c,0x17,0x28,0x11,0x32,0x14,0x25,0x15,0x16,0x19,0x55,0x46,0x3c,0x17,0x28,0x11,0x32,0x14,0x26,0x14,0x16,0x19,0x01,0x02,0x0f,0x3e,0x49,0x0b,0x08,0x01,0xb9,0xfe,0x2a,0x0d,0x13,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x0a,0x08,0xfe,0x83,0x01,0x9a,0x0d,0x14,0x18,0x15,0x1e,0xff,0xff,0x00,0x46,0x00,0xfa,0x02,0x12, +0x02,0xaf,0x02,0x26,0x04,0x22,0x00,0x00,0x01,0x07,0x06,0x68,0x02,0x58,0xff,0xa6,0x00,0x09,0xb1,0x01,0x02,0xb8,0xff,0xa6,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x3c,0x00,0x32,0x02,0x1c,0x03,0x0c,0x00,0x27,0x06,0x72,0x02,0x58,0x00,0x00,0x02,0x06,0x04,0x26,0x00,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0x30,0x00,0x11, +0x00,0x1d,0x00,0x29,0x00,0x49,0x40,0x46,0x08,0x03,0x02,0x01,0x04,0x01,0x86,0x00,0x00,0x00,0x02,0x05,0x00,0x02,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0a,0x01,0x06,0x04,0x04,0x06,0x59,0x0a,0x01,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04,0x51,0x1f,0x1e,0x13,0x12,0x00,0x00,0x25,0x23,0x1e,0x29,0x1f,0x29,0x19,0x17, +0x12,0x1d,0x13,0x1d,0x00,0x11,0x00,0x11,0x23,0x13,0x23,0x0b,0x06,0x19,0x2b,0x33,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x50,0x77,0x65,0x65,0x77,0x32,0x5c, +0x4e,0x4e,0x5c,0xaa,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x01,0x54,0x65,0x77,0x77,0x65,0xfe,0xac,0x01,0x59,0x4e,0x5c,0x5c,0x4e,0xfe,0xa7,0xe6,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58, +0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x1f,0x00,0x45,0x40,0x42,0x0a,0x01,0x07,0x04,0x07,0x86,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x04,0x04,0x05,0x57,0x00,0x05,0x05,0x04,0x5f,0x06,0x01,0x04,0x05,0x04,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x1f,0x18,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x13, +0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0b,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23, +0x25,0xff,0x02,0x58,0xff,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x77,0x02,0x08,0x50,0x50,0xfd,0xf8,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x52,0x40,0x4f,0x0c,0x01,0x07,0x00,0x07,0x86,0x00,0x03,0x04,0x01,0x02,0x01, +0x03,0x02,0x67,0x05,0x01,0x01,0x0e,0x0b,0x02,0x08,0x09,0x01,0x08,0x69,0x0a,0x0d,0x02,0x09,0x00,0x00,0x09,0x59,0x0a,0x0d,0x02,0x09,0x09,0x00,0x61,0x06,0x01,0x00,0x09,0x00,0x51,0x23,0x23,0x1a,0x1a,0x00,0x00,0x23,0x2b,0x23,0x2b,0x27,0x25,0x1a,0x22,0x1a,0x22,0x1e,0x1c,0x00,0x19,0x00,0x19,0x14,0x21,0x11,0x11,0x12,0x14,0x21, +0x0f,0x06,0x1d,0x2b,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x27,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x37,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0xff,0x05,0x34,0x44,0x44,0x34,0x05,0xff,0x02,0x58,0xff,0x05,0x35,0x43,0x43,0x35, +0x05,0x5f,0x05,0x05,0x23,0x2d,0x2d,0x87,0x05,0x05,0x23,0x2d,0x2d,0x91,0x44,0x34,0x35,0x43,0x87,0x50,0x50,0x87,0x43,0x35,0x34,0x44,0x91,0xb9,0xa0,0x2d,0x23,0x23,0x2d,0xa0,0xa0,0x2d,0x23,0x23,0x2d,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xfd,0x00,0x07,0x00,0x0b,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x86,0x00, +0x04,0x00,0x05,0x00,0x04,0x05,0x67,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x11,0x11,0x11,0x11,0x11,0x10,0x06,0x06,0x1c,0x2b,0x11,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x21,0x02,0x58,0xff,0x5a,0xff,0x02,0x58,0xfd,0xa8,0x02,0x58,0x50,0xfd,0xf8,0x02,0x08,0xf5,0x4b, +0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xe4,0x00,0x0e,0x00,0x2b,0x40,0x28,0x06,0x01,0x00,0x01,0x00,0x85,0x00,0x03,0x02,0x03,0x86,0x05,0x01,0x01,0x02,0x02,0x01,0x57,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x01,0x02,0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1d,0x2b,0x01,0x17,0x23,0x15,0x33,0x15,0x23, +0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x01,0x2d,0xc7,0x9b,0xff,0xff,0x5a,0xff,0xff,0x9b,0x02,0xe4,0xa9,0xa6,0x50,0xfe,0xbb,0x01,0x45,0x50,0xa6,0x00,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1e,0x00,0x2f,0x00,0x58,0x40,0x55,0x1d,0x01,0x07,0x02,0x23,0x01,0x06,0x03,0x02,0x4c,0x00,0x01, +0x00,0x04,0x02,0x01,0x04,0x69,0x09,0x01,0x02,0x00,0x07,0x03,0x02,0x07,0x69,0x00,0x03,0x00,0x06,0x05,0x03,0x06,0x69,0x0a,0x01,0x05,0x00,0x00,0x05,0x59,0x0a,0x01,0x05,0x05,0x00,0x61,0x08,0x01,0x00,0x05,0x00,0x51,0x20,0x1f,0x0f,0x0e,0x01,0x00,0x2b,0x29,0x26,0x24,0x1f,0x2f,0x20,0x2f,0x1a,0x18,0x14,0x12,0x0e,0x1e,0x0f,0x1e, +0x08,0x06,0x00,0x0d,0x01,0x0d,0x0b,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x13,0x32,0x36,0x35,0x35,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72, +0x72,0x9a,0x1a,0x23,0x1b,0x1e,0x14,0x28,0x3f,0x3b,0x3a,0x40,0x0e,0x6c,0x3b,0x3f,0x0e,0x34,0x1a,0x23,0x1b,0x1e,0x14,0x28,0x40,0x0a,0x72,0x6a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe,0xc9,0x6a,0x72,0x01,0xd3,0x1d,0x25,0x1d,0x2d,0x7b,0x3e,0x43,0x43,0x3e,0x8c,0x43,0xfe,0x7e,0x43,0x3e,0x9a,0x43,0x1d,0x25,0x1d,0x2d,0x89,0x3e,0x43, +0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x37,0x00,0x4d,0x40,0x4a,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x05,0x0b,0x06,0x0a,0x03,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x2d,0x2c,0x21, +0x20,0x11,0x10,0x01,0x00,0x33,0x31,0x2c,0x37,0x2d,0x37,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16, +0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0xda,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0xfe,0xc8,0x18,0x20,0x20,0x18, +0x18,0x20,0x20,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xd1,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0xe4,0x00,0x0e,0x00,0x14,0x00,0x1c, +0x00,0x3d,0x40,0x3a,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x07,0x01,0x04,0x00,0x00,0x04,0x59,0x07,0x01,0x04,0x04,0x00,0x5f,0x06,0x01,0x00,0x04,0x00,0x4f,0x16,0x15,0x01,0x00,0x1a,0x18,0x15,0x1c,0x16,0x1c,0x13,0x12,0x10,0x0f,0x08,0x06,0x00,0x0e,0x01,0x0d,0x08,0x06,0x16,0x2b,0x33, +0x22,0x35,0x34,0x37,0x13,0x36,0x33,0x32,0x17,0x13,0x16,0x15,0x14,0x23,0x25,0x33,0x13,0x35,0x23,0x15,0x13,0x32,0x35,0x34,0x23,0x22,0x15,0x14,0x3b,0x45,0x13,0xf2,0x10,0x21,0x21,0x10,0xf1,0x14,0x45,0xfe,0xf6,0x31,0x0a,0x44,0x21,0x2c,0x2c,0x2c,0x38,0x1a,0x2e,0x02,0x3e,0x26,0x26,0xfd,0xc2,0x2e,0x1a,0x38,0xc8,0x01,0x17,0x47, +0x47,0xfe,0x5e,0x2a,0x2a,0x2a,0x2a,0x00,0x00,0x01,0x00,0x14,0xff,0x92,0x02,0x44,0x03,0x48,0x00,0x05,0x00,0x1c,0x40,0x19,0x03,0x01,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x01,0x03,0x21,0x01,0x13,0x21,0x01,0xd6,0xb4,0x01,0x22,0xfd,0xee,0xf5, +0xfe,0xed,0x03,0x48,0xfe,0x70,0xfd,0xda,0x01,0xa4,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x73,0x02,0x34,0x02,0x6e,0x00,0x05,0x00,0x06,0xb3,0x05,0x03,0x01,0x32,0x2b,0x13,0x37,0x17,0x13,0x17,0x01,0x25,0x3f,0x90,0xfb,0x45,0xfe,0xc9,0x01,0x48,0x42,0x8e,0x01,0x72,0x30,0xfe,0x35,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x64,0x02,0x16, +0x02,0x38,0x00,0x0b,0x00,0x06,0xb3,0x0a,0x04,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x7b,0x38,0xb0,0xb1,0x3a,0xb1,0xb0,0x38,0xb0,0xb1,0x3a,0xb1,0x65,0x38,0xb0,0xb1,0x3a,0xb1,0xb0,0x38,0xb0,0xb1,0x3a,0xb1,0x00,0x01,0x00,0x1f,0x00,0x5b,0x02,0x39,0x02,0x75,0x00,0x0b,0x00,0x06,0xb3,0x0a, +0x04,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x59,0x39,0xd3,0xd4,0x3a,0xd4,0xd2,0x39,0xd3,0xd4,0x3a,0xd4,0x5c,0x39,0xd2,0xd4,0x3a,0xd4,0xd3,0x39,0xd2,0xd4,0x3a,0xd4,0x00,0x01,0x00,0x27,0x00,0x3c,0x02,0x30,0x02,0x94,0x00,0x0b,0x00,0x06,0xb3,0x0a,0x04,0x01,0x32,0x2b,0x37,0x37,0x27,0x17, +0x37,0x17,0x37,0x07,0x17,0x27,0x07,0x27,0x27,0xab,0xaa,0xd7,0x2d,0x2c,0xd7,0xaa,0xab,0xd7,0x2d,0x2d,0xd2,0x96,0x96,0x49,0xdf,0xde,0x48,0x96,0x96,0x49,0xdf,0xdf,0x00,0x03,0x00,0x0f,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x1d,0x00,0x61,0x40,0x5e,0x0b,0x01,0x04,0x02,0x18,0x01,0x09,0x06,0x02,0x4c,0x00,0x02, +0x04,0x02,0x85,0x0b,0x03,0x02,0x01,0x00,0x05,0x00,0x01,0x05,0x80,0x07,0x01,0x05,0x06,0x00,0x05,0x06,0x7e,0x0c,0x0a,0x02,0x08,0x09,0x08,0x86,0x00,0x04,0x00,0x00,0x01,0x04,0x00,0x67,0x00,0x06,0x09,0x09,0x06,0x57,0x00,0x06,0x06,0x09,0x5f,0x00,0x09,0x06,0x09,0x4f,0x11,0x11,0x00,0x00,0x11,0x1d,0x11,0x1d,0x1c,0x1b,0x1a,0x19, +0x17,0x16,0x15,0x14,0x13,0x12,0x10,0x0f,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x0d,0x06,0x19,0x2b,0x01,0x27,0x23,0x07,0x23,0x13,0x33,0x13,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x33,0x03,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x17,0x23,0x27,0x23,0x15,0x01,0x3c,0x1c,0xb0,0x1b,0x46,0x94,0x4a,0x94,0x9e,0x08,0x12,0x02,0x02,0x12, +0x08,0x22,0x7d,0x11,0x42,0x4f,0x60,0x4a,0x71,0x7b,0x4e,0x66,0x4f,0x01,0x8b,0x41,0x41,0x01,0x4f,0xfe,0xb1,0xce,0x13,0x2a,0x0d,0x0d,0x2a,0x13,0x52,0xfd,0xf9,0x01,0x4f,0x86,0x86,0xa1,0xae,0x8f,0x8f,0x00,0x00,0x04,0x00,0x2d,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x4b,0x00,0x6c,0x40,0x69,0x07,0x01, +0x05,0x02,0x01,0x4c,0x00,0x0a,0x0b,0x07,0x0b,0x0a,0x07,0x80,0x00,0x07,0x08,0x0b,0x07,0x08,0x7e,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x0c,0x01,0x01,0x09,0x04,0x01,0x67,0x00,0x09,0x00,0x0b,0x0a,0x09,0x0b,0x69,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0d, +0x01,0x06,0x08,0x06,0x51,0x21,0x20,0x00,0x00,0x3f,0x3c,0x3a,0x39,0x37,0x34,0x29,0x26,0x24,0x23,0x20,0x4b,0x21,0x4a,0x1f,0x1d,0x19,0x17,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0c,0x21,0x0e,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15, +0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x2d,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14, +0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0x15,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13, +0x19,0xdb,0x19,0x13,0x13,0x17,0xfd,0xe1,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x2d,0xff,0x4c,0x02,0x30,0x02,0xe4,0x00,0x27,0x00,0x35,0x00,0x4b,0x40,0x48,0x19,0x01,0x07,0x03,0x01,0x4c, +0x00,0x03,0x00,0x07,0x06,0x03,0x07,0x69,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x05,0x05,0x00,0x5f,0x08,0x01,0x00,0x00,0x3d,0x00,0x4e,0x29,0x28,0x01,0x00,0x30,0x2e,0x28,0x35,0x29,0x35,0x26,0x24,0x1f,0x1d,0x17,0x15,0x10,0x0e,0x09,0x07,0x00,0x27,0x01,0x27,0x0a, +0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x45,0x55,0x7e,0x45,0x90,0x7e, +0x72,0x83,0x56,0x4a,0x49,0x57,0x46,0x40,0x29,0x36,0x09,0x02,0x55,0x50,0x5a,0x64,0x6b,0x5d,0x6e,0x23,0x26,0x2a,0x2a,0x26,0x26,0x2a,0x2a,0xb4,0x47,0x83,0x58,0x01,0x54,0x87,0x9b,0x83,0x72,0xfe,0xf1,0x4e,0x5b,0x58,0x47,0x74,0x4a,0x51,0x20,0x1c,0x46,0x55,0x5a,0x74,0x68,0xfe,0xac,0x64,0x73,0x4b,0x01,0x2e,0x31,0x2b,0x75,0x2c, +0x2f,0x30,0x2c,0x74,0x2b,0x31,0x00,0x00,0x00,0x02,0x00,0x19,0xff,0xf7,0x02,0x67,0x02,0xe4,0x00,0x24,0x00,0x30,0x00,0x9b,0x40,0x09,0x28,0x21,0x1e,0x1b,0x04,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x34,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x07,0x01,0x08,0x69,0x00,0x04,0x04,0x02,0x61,0x00, +0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x00,0x61,0x06,0x09,0x02,0x00,0x00,0x3f,0x4d,0x0a,0x01,0x07,0x07,0x00,0x61,0x06,0x09,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x31,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x07,0x01,0x08,0x69,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f, +0x00,0x06,0x06,0x39,0x4d,0x0a,0x01,0x07,0x07,0x00,0x61,0x09,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1d,0x26,0x25,0x01,0x00,0x2b,0x29,0x25,0x30,0x26,0x30,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x0b,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36, +0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x27,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xd7,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63,0x61,0x2b,0x22,0x53, +0x26,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x00,0x00,0x02,0x00,0x41,0xff,0x4c,0x01,0xf9,0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x2a, +0x40,0x27,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d,0x06,0x04,0x05,0x03,0x02,0x02,0x3d,0x02,0x4e,0x0b,0x0b,0x00,0x00,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x0a,0x25,0x11,0x07,0x09,0x18,0x2b,0x17,0x11,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x11,0x33,0x11,0x33,0x11,0xff,0x55,0x69,0x69,0x55,0x50,0x5a, +0x50,0xb4,0x01,0xea,0x5e,0x4c,0x50,0x4d,0x5d,0xfc,0x72,0x03,0x8e,0xfc,0x72,0x00,0x00,0x02,0x00,0x4d,0xff,0x66,0x02,0x0b,0x02,0xe4,0x00,0x3b,0x00,0x49,0x00,0x47,0x40,0x44,0x16,0x01,0x06,0x04,0x01,0x4c,0x00,0x04,0x05,0x06,0x05,0x04,0x06,0x80,0x00,0x06,0x01,0x05,0x06,0x01,0x7e,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x02, +0x07,0x01,0x00,0x02,0x00,0x65,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3e,0x05,0x4e,0x01,0x00,0x33,0x32,0x27,0x24,0x22,0x21,0x1f,0x1c,0x09,0x06,0x04,0x03,0x00,0x3b,0x01,0x3a,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02,0x35,0x34,0x36,0x37,0x35,0x26,0x26, +0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x13,0x16,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x06,0x15,0x14,0x16,0x17,0x01,0x13,0x5b,0x6b,0x5f,0x38,0x2f,0x32,0x32,0x39,0x33,0x32,0x5c,0x2e,0x44,0x26,0x3b, +0x34,0x34,0x38,0x66,0x57,0x32,0x4f,0x66,0x07,0x5f,0x04,0x32,0x27,0x32,0x2e,0x35,0x24,0x20,0x78,0x47,0x51,0x44,0x2f,0x15,0x37,0x2a,0x6a,0x5c,0x05,0x2c,0x38,0x2c,0x23,0x4a,0x2c,0x38,0x2b,0x22,0x9a,0x53,0x47,0x22,0x28,0x2e,0x28,0x24,0x33,0x08,0x0f,0x08,0x34,0x4a,0x28,0x3a,0x48,0x07,0x02,0x0c,0x4c,0x38,0x4a,0x57,0x4e,0x43, +0x1e,0x23,0x2c,0x26,0x21,0x2e,0x06,0x17,0x0d,0x62,0x3d,0x3a,0x45,0x03,0x02,0x02,0x21,0x41,0x33,0x4e,0x5b,0x01,0x55,0x07,0x42,0x35,0x23,0x36,0x06,0x0d,0x08,0x40,0x33,0x26,0x38,0x06,0x00,0x03,0x00,0x2d,0x00,0x6e,0x02,0x2b,0x02,0xe4,0x00,0x11,0x00,0x23,0x00,0x3f,0x00,0x69,0xb1,0x06,0x64,0x44,0x40,0x5e,0x00,0x06,0x07,0x09, +0x07,0x06,0x09,0x80,0x00,0x09,0x08,0x07,0x09,0x08,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x00,0x08,0x0c,0x01,0x04,0x02,0x08,0x04,0x69,0x0b,0x01,0x02,0x00,0x00,0x02,0x59,0x0b,0x01,0x02,0x02,0x00,0x62,0x0a,0x01,0x00,0x02,0x00,0x52,0x25,0x24,0x13,0x12,0x01,0x00,0x3d,0x3c,0x3a, +0x38,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x24,0x3f,0x25,0x3f,0x1c,0x1a,0x12,0x23,0x13,0x23,0x0a,0x08,0x00,0x11,0x01,0x11,0x0d,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x15, +0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x2c,0x4c,0x73,0x40,0x40,0x73,0x4c,0x4d,0x72,0x40,0x40,0x72,0x4d,0x3c,0x5a,0x32,0x32,0x5a,0x3c,0x3c,0x5a,0x32,0x32,0x5a,0x41,0x38,0x45,0x45,0x38,0x38,0x44,0x41, +0x21,0x1a,0x1b,0x21,0x21,0x1b,0x1a,0x21,0x41,0x44,0x6e,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x32,0x2f,0x56,0x39,0x96,0x39,0x55,0x30,0x30,0x55,0x39,0x96,0x39,0x56,0x2f,0x55,0x3f,0x34,0x82,0x34,0x3f,0x3f,0x34,0x1b,0x21,0x21,0x1b,0x82,0x1b,0x21,0x21,0x1b,0x34,0x3f,0x00,0x00,0x04,0x00,0x2d, +0x00,0x6e,0x02,0x2b,0x02,0xe4,0x00,0x11,0x00,0x23,0x00,0x30,0x00,0x39,0x00,0x63,0xb1,0x06,0x64,0x44,0x40,0x58,0x2b,0x01,0x06,0x08,0x01,0x4c,0x0b,0x07,0x02,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x00,0x04,0x00,0x09,0x08,0x04,0x09,0x69,0x00,0x08,0x00,0x06,0x05,0x08,0x06,0x67,0x00,0x02, +0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x24,0x24,0x01,0x00,0x39,0x37,0x33,0x31,0x24,0x30,0x24,0x30,0x2f,0x2e,0x2d,0x2c,0x27,0x25,0x20,0x1e,0x17,0x15,0x0a,0x08,0x00,0x11,0x01,0x11,0x0c,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16, +0x15,0x15,0x14,0x06,0x06,0x25,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x17,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x2c,0x4c,0x73,0x40,0x40,0x73,0x4c,0x4d,0x72,0x40,0x40,0x72,0xfe,0xeb,0x32,0x5a,0x3c,0x3c, +0x5a,0x32,0x32,0x5a,0x3c,0x3c,0x5a,0x32,0x5a,0x72,0x36,0x3f,0x3c,0x42,0x40,0x3b,0x36,0x36,0x1a,0x1e,0x1e,0x1a,0x36,0x6e,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0xf0,0x39,0x56,0x2f,0x2f,0x56,0x39,0x96,0x39,0x55,0x30,0x30,0x55,0x39,0xfa,0x01,0x5e,0x39,0x30,0x45,0x1a,0x96,0x8c,0x8c,0xbe,0x1d, +0x1a,0x1a,0x1d,0x00,0x00,0x02,0x00,0x0f,0x01,0x72,0x02,0x35,0x02,0xda,0x00,0x07,0x00,0x26,0x00,0x4d,0x40,0x4a,0x22,0x19,0x02,0x00,0x01,0x0e,0x01,0x07,0x00,0x02,0x4c,0x00,0x07,0x00,0x03,0x00,0x07,0x03,0x80,0x0a,0x08,0x06,0x09,0x04,0x03,0x03,0x84,0x05,0x04,0x02,0x01,0x00,0x00,0x01,0x57,0x05,0x04,0x02,0x01,0x01,0x00,0x5f, +0x02,0x01,0x00,0x01,0x00,0x4f,0x08,0x08,0x00,0x00,0x08,0x26,0x08,0x26,0x1e,0x1d,0x15,0x14,0x13,0x12,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x0b,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x11,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x06,0x06,0x07,0x07,0x23, +0x27,0x26,0x26,0x27,0x16,0x16,0x15,0x15,0x73,0x64,0x01,0x04,0x64,0x87,0x50,0x22,0x05,0x09,0x02,0x02,0x07,0x05,0x21,0x4e,0x37,0x05,0x02,0x06,0x0e,0x03,0x1e,0x33,0x21,0x03,0x0e,0x06,0x02,0x06,0x01,0x72,0x01,0x36,0x32,0x32,0xfe,0xca,0x01,0x68,0x66,0x0e,0x2b,0x0e,0x0e,0x2b,0x0e,0x66,0xfe,0x98,0xdd,0x1c,0x3e,0x13,0x14,0x33, +0x09,0x67,0x68,0x09,0x32,0x14,0x13,0x3e,0x1c,0xdd,0x00,0x00,0x00,0x02,0x00,0x96,0x01,0xc2,0x01,0xc2,0x02,0xe4,0x00,0x0b,0x00,0x17,0x00,0x39,0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01, +0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x43,0x53,0x53,0x43,0x43,0x53,0x53,0x43,0x26,0x2f,0x2f,0x26,0x25,0x30,0x30,0x01,0xc2, +0x51,0x40,0x41,0x50,0x50,0x41,0x40,0x51,0x38,0x31,0x28,0x28,0x32,0x32,0x28,0x28,0x31,0x00,0x00,0x00,0xff,0xff,0x00,0xd2,0x01,0xa3,0x01,0x75,0x02,0xd5,0x03,0x07,0x03,0x2a,0x00,0x00,0x02,0x43,0x00,0x09,0xb1,0x00,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x69,0x01,0xa4,0x01,0xef,0x02,0xd6,0x00,0x27, +0x03,0x2a,0xff,0x97,0x02,0x44,0x01,0x07,0x03,0x2a,0x00,0x7a,0x02,0x44,0x00,0x12,0xb1,0x00,0x01,0xb8,0x02,0x44,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x44,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00, +0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0xff,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x00,0x02,0x00,0xff,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f, +0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xff,0x5a,0x5a,0x5a,0x01,0xc2,0x01,0x7c,0xfe,0x84,0xfd,0xd0,0x01,0x7c,0xfe,0x84,0x00,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02, +0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x17,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0xff,0xaf,0xaf,0x5a,0xaf,0xaf,0x6e,0x02,0x76,0x50,0xe6, +0xe6,0x50,0xfd,0x8a,0x00,0x02,0x00,0x46,0x00,0x00,0x01,0xf4,0x02,0xe4,0x00,0x1e,0x00,0x28,0x00,0x38,0x40,0x35,0x20,0x1b,0x1a,0x13,0x07,0x06,0x05,0x04,0x08,0x02,0x03,0x01,0x4c,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x27,0x25, +0x18,0x16,0x0c,0x0a,0x00,0x1e,0x01,0x1e,0x05,0x06,0x16,0x2b,0x21,0x22,0x26,0x35,0x35,0x07,0x27,0x37,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x0e,0x02,0x03,0x15,0x37,0x36,0x35,0x35,0x34,0x23,0x22,0x06,0x01,0x51,0x4d,0x5a,0x46,0x1e,0x64,0x58,0x48,0x49,0x57,0x4f, +0x46,0x51,0x29,0x24,0x22,0x32,0x0b,0x44,0x09,0x2d,0x42,0x78,0x35,0x57,0x46,0x21,0x25,0x57,0x49,0x4a,0x1b,0x51,0x25,0x01,0x04,0x46,0x55,0x54,0x47,0x55,0x43,0x6c,0x1a,0x1f,0x6c,0x25,0x29,0x2a,0x13,0x2a,0x15,0x2f,0x21,0x02,0x49,0xe3,0x13,0x21,0x5a,0x55,0x49,0x26,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x13, +0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01,0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x17, +0x35,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x15,0xff,0xaf,0xaf,0xaf,0xaf,0x5a,0xaf,0xaf,0xaf,0xaf,0x6e,0xfa,0x50,0x01,0x22,0x50,0xf0,0xf0,0x50,0xfe,0xde,0x50,0xfa,0x00,0x00,0x00,0x03,0x00,0x1e,0x00,0x00,0x02,0x58,0x02,0xe4,0x00,0x0d,0x00,0x27,0x00,0x35,0x00,0x79,0x40,0x0a, +0x22,0x01,0x06,0x07,0x15,0x01,0x04,0x00,0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x0a,0x01,0x06,0x08,0x01,0x00,0x04,0x06,0x00,0x69,0x00,0x07,0x07,0x01,0x5f,0x03,0x02,0x02,0x01,0x01,0x38,0x4d,0x09,0x05,0x02,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x22,0x0a,0x01,0x06,0x08,0x01,0x00,0x04,0x06,0x00,0x69,0x03,0x01,0x02,0x02, +0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x09,0x05,0x02,0x04,0x04,0x39,0x04,0x4e,0x59,0x40,0x1f,0x29,0x28,0x0e,0x0e,0x01,0x00,0x30,0x2e,0x28,0x35,0x29,0x35,0x0e,0x27,0x0e,0x27,0x1d,0x1c,0x1b,0x1a,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x0b,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32, +0x16,0x15,0x15,0x14,0x06,0x01,0x11,0x33,0x13,0x1e,0x02,0x17,0x2e,0x02,0x35,0x11,0x33,0x11,0x23,0x03,0x2e,0x02,0x27,0x1e,0x02,0x15,0x11,0x01,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0xf9,0x28,0x37,0x37,0x28,0x29,0x36,0x36,0xfd,0xfc,0x5f,0x75,0x06,0x10,0x11,0x06,0x02,0x06,0x04,0x46,0x5f,0x72, +0x05,0x11,0x11,0x07,0x02,0x05,0x03,0x01,0x95,0x0e,0x15,0x15,0x0e,0x0d,0x16,0x16,0x01,0x2c,0x3a,0x2f,0xe6,0x2f,0x3a,0x3a,0x2f,0xe6,0x2f,0x3a,0xfe,0xd4,0x02,0xda,0xfe,0x3b,0x15,0x44,0x4a,0x1d,0x1d,0x4c,0x4b,0x19,0x01,0xb8,0xfd,0x26,0x01,0xc6,0x17,0x44,0x49,0x1c,0x1c,0x4b,0x4b,0x1c,0xfe,0x48,0x01,0x63,0x12,0x16,0xfa,0x12, +0x16,0x16,0x12,0xfa,0x16,0x12,0x00,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x1c,0x02,0xe4,0x00,0x1a,0x00,0x23,0x00,0x4c,0x40,0x49,0x1e,0x1b,0x02,0x05,0x06,0x10,0x01,0x03,0x04,0x02,0x4c,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x00,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x03,0x00, +0x00,0x03,0x59,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x01,0x00,0x22,0x20,0x1d,0x1c,0x17,0x16,0x14,0x12,0x0f,0x0e,0x0a,0x08,0x00,0x1a,0x01,0x1a,0x08,0x06,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x21,0x11,0x16,0x16,0x33,0x32,0x36,0x37,0x33,0x0e,0x02,0x03,0x15, +0x21,0x35,0x26,0x26,0x23,0x22,0x06,0x01,0x2c,0x47,0x6d,0x3c,0x3c,0x6d,0x47,0x49,0x6b,0x3c,0xfe,0x84,0x0c,0x49,0x37,0x3b,0x62,0x14,0x32,0x10,0x44,0x5b,0xc0,0x01,0x18,0x0c,0x48,0x38,0x37,0x49,0x0a,0x41,0x76,0x4d,0xe6,0x4e,0x75,0x41,0x41,0x74,0x4f,0x79,0xfe,0xfd,0x15,0x2c,0x3d,0x31,0x2e,0x46,0x27,0x02,0x80,0xdd,0xdd,0x15, +0x2c,0x2c,0x00,0x00,0x00,0x04,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x25,0x00,0x57,0x40,0x54,0x07,0x01,0x05,0x02,0x01,0x4c,0x00,0x06,0x01,0x07,0x01,0x06,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x09,0x01,0x01,0x06,0x04,0x01, +0x67,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01,0x08,0x07,0x08,0x4f,0x20,0x20,0x00,0x00,0x20,0x25,0x20,0x25,0x24,0x23,0x22,0x21,0x1f,0x1d,0x19,0x17,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0c,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32, +0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0xab,0x42,0xde,0x01,0x8b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19, +0xdb,0x19,0x13,0x13,0x17,0xfd,0xe5,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x00,0x00,0x00,0x07,0x00,0x49,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x18,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x60,0x04,0x01,0x03,0x01,0x03,0x50,0x1b,0x40,0x17,0x02,0x01,0x00,0x01, +0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x60,0x04,0x01,0x03,0x01,0x03,0x50,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x28,0x5a,0x01,0x54,0x5a,0xb4,0xb4,0x64,0x64,0xb4,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,0x56,0x02,0x4e, +0x02,0x89,0x00,0x06,0x00,0x20,0x00,0x47,0x40,0x44,0x05,0x02,0x01,0x03,0x02,0x04,0x06,0x01,0x03,0x02,0x02,0x4c,0x00,0x00,0x05,0x00,0x85,0x00,0x02,0x04,0x03,0x04,0x02,0x03,0x80,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x00,0x03,0x01,0x01,0x03,0x59,0x00,0x03,0x03,0x01,0x61,0x06,0x01,0x01,0x03,0x01,0x51,0x08,0x07,0x1a,0x19, +0x18,0x17,0x11,0x0f,0x0c,0x0b,0x07,0x20,0x08,0x20,0x13,0x07,0x06,0x17,0x2b,0x01,0x27,0x07,0x35,0x33,0x07,0x17,0x07,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x55,0xe1,0x60,0xf9,0x65,0xe2,0x4f,0x4e,0x7d,0x48,0x4e,0x33,0x5a,0x38,0x39, +0x59,0x33,0x33,0x59,0x39,0x4f,0x7c,0x48,0x48,0x7c,0x01,0x18,0xd8,0x60,0xf9,0x65,0xd8,0xf6,0x47,0x7c,0x4d,0x39,0x5a,0x35,0x35,0x5a,0x39,0x39,0x5b,0x34,0x47,0x47,0x7a,0x4e,0x4d,0x7c,0x47,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x02,0x2b,0x02,0xdf,0x00,0x1b,0x00,0x2d,0x00,0x60,0x40,0x5d,0x28,0x1f,0x02,0x08,0x06,0x01, +0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x61,0x0a,0x01,0x00,0x04,0x00,0x51,0x1c,0x1c,0x01,0x00,0x1c,0x2d,0x1c,0x2d, +0x27,0x26,0x25,0x24,0x1e,0x1d,0x19,0x18,0x16,0x14,0x10,0x0e,0x0c,0x0b,0x09,0x07,0x00,0x1b,0x01,0x1b,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03, +0x1e,0x02,0x15,0x15,0xcf,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a,0x13,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x86,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0xfe,0x7a,0x01,0x4f, +0xfe,0xf7,0x1e,0x26,0x30,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0x00,0x03,0x00,0x20,0x00,0x00,0x02,0x3f,0x02,0xdf,0x00,0x1b,0x00,0x29,0x00,0x32,0x00,0x6b,0x40,0x68,0x24,0x01,0x08,0x0a,0x01,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x0d,0x09,0x02,0x07,0x08,0x07,0x86, +0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x0c,0x01,0x00,0x06,0x04,0x00,0x69,0x00,0x06,0x00,0x0b,0x0a,0x06,0x0b,0x68,0x00,0x0a,0x08,0x08,0x0a,0x57,0x00,0x0a,0x0a,0x08,0x5f,0x00,0x08,0x0a,0x08,0x4f,0x1c,0x1c,0x01,0x00,0x32,0x30,0x2c,0x2a,0x1c,0x29,0x1c,0x29,0x28,0x27,0x26,0x25,0x1f,0x1d,0x19,0x18,0x16,0x14,0x10, +0x0e,0x0c,0x0b,0x09,0x07,0x00,0x1b,0x01,0x1b,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23, +0xcf,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a,0x13,0xc6,0x38,0x44,0x34,0x2b,0x67,0x50,0x64,0x54,0x85,0x19,0x1f,0x1e,0x19,0x86,0x01,0x86,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0xfe,0x7a,0x01,0x4f, +0x3d,0x2f,0x28,0x32,0x06,0x83,0x81,0x81,0xb3,0x1b,0x15,0x16,0x1c,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0xd6,0x02,0x35,0x02,0xe4,0x00,0x05,0x00,0x18,0x40,0x15,0x04,0x01,0x02,0x00,0x4a,0x02,0x01,0x02,0x00,0x00,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x13,0x01,0x01,0x23,0x27,0x07,0x23,0x01,0x09,0x01, +0x09,0x6e,0x9a,0x9e,0x01,0xd6,0x01,0x0e,0xfe,0xf2,0xa2,0xa2,0x00,0x01,0x00,0xc3,0xff,0x92,0x01,0xef,0x00,0xbe,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x37,0x33,0x15,0x33,0x15,0x21,0xc3,0x5a, +0xd2,0xfe,0xd4,0xbe,0xdc,0x50,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x92,0x01,0x95,0x00,0xbe,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x25,0x11,0x21,0x35,0x33,0x35, +0x01,0x95,0xfe,0xd4,0xd2,0xbe,0xfe,0xd4,0x50,0xdc,0x00,0x00,0x00,0x01,0x00,0x69,0x02,0x12,0x01,0x95,0x03,0x3e,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x35,0x23,0x35,0x21,0x01,0x95, +0x5a,0xd2,0x01,0x2c,0x02,0x12,0xdc,0x50,0x00,0x01,0x00,0xc3,0x02,0x12,0x01,0xef,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x15, +0xc3,0x01,0x2c,0xd2,0x02,0x12,0x01,0x2c,0x50,0xdc,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1f,0x00,0x54,0x40,0x51,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x0a,0x01,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x00,0x08,0x09,0x07,0x08, +0x67,0x0b,0x01,0x09,0x04,0x04,0x09,0x57,0x0b,0x01,0x09,0x09,0x04,0x5f,0x00,0x04,0x09,0x04,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0c,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32, +0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x01,0xb7,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x9a,0x3a,0x01,0x4f,0x3a,0x56, +0x2f,0x56,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x19,0x00,0x45,0x40,0x42,0x00,0x04,0x01,0x05,0x01,0x04,0x05,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x07,0x01,0x01,0x04,0x02,0x01,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01,0x06,0x05, +0x06,0x4f,0x14,0x14,0x00,0x00,0x14,0x19,0x14,0x19,0x18,0x17,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d, +0x3e,0x3e,0x2d,0x54,0xab,0x42,0xde,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x0e,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1f,0x00,0x58,0x40,0x55,0x1a,0x17,0x02,0x06,0x07,0x01,0x4c,0x00,0x05,0x01,0x07,0x01, +0x05,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x09,0x01,0x01,0x05,0x02,0x01,0x67,0x00,0x07,0x06,0x08,0x07,0x57,0x00,0x06,0x00,0x04,0x08,0x06,0x04,0x67,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01,0x08,0x07,0x08,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1e,0x1d,0x1c,0x1b,0x19,0x18,0x16,0x15,0x13,0x11,0x0d, +0x0b,0x00,0x0a,0x00,0x09,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x01,0x5f,0xcd,0xa3,0x4e,0xb2,0x8e, +0x40,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60,0x42,0x59,0xb4,0xc7,0x0a,0x63,0xe1,0x00,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1e,0x00,0x51,0x40,0x4e,0x19,0x18,0x17,0x03,0x04,0x05,0x01,0x4c,0x00,0x05,0x01,0x04,0x01,0x05,0x04,0x80, +0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x08,0x01,0x01,0x05,0x02,0x01,0x67,0x06,0x01,0x04,0x07,0x07,0x04,0x57,0x06,0x01,0x04,0x04,0x07,0x5f,0x09,0x01,0x07,0x04,0x07,0x4f,0x14,0x14,0x00,0x00,0x14,0x1e,0x14,0x1e,0x1d,0x1c,0x1b,0x1a,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0a,0x06,0x17,0x2b,0x13, +0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x35,0x33,0x35,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x94,0x83,0x7a,0x61,0x5b,0x68,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31, +0x31,0x3d,0xfd,0x60,0x3c,0xd8,0x57,0x4b,0x47,0xfe,0xed,0x3c,0x00,0x03,0x00,0x2d,0xff,0xfb,0x02,0x15,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2e,0x00,0xa6,0xb7,0x29,0x28,0x23,0x03,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x38,0x00,0x07,0x08,0x05,0x08,0x07,0x72,0x00,0x05,0x06,0x08,0x05,0x06,0x7e,0x00,0x00,0x00,0x03, +0x02,0x00,0x03,0x67,0x00,0x02,0x0a,0x01,0x01,0x09,0x02,0x01,0x67,0x00,0x09,0x00,0x08,0x07,0x09,0x08,0x67,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x1b,0x40,0x39,0x00,0x07,0x08,0x05,0x08,0x07,0x05,0x80,0x00,0x05,0x06,0x08,0x05,0x06,0x7e,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67, +0x00,0x02,0x0a,0x01,0x01,0x09,0x02,0x01,0x67,0x00,0x09,0x00,0x08,0x07,0x09,0x08,0x67,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x59,0x40,0x1e,0x15,0x14,0x00,0x00,0x27,0x26,0x25,0x24,0x22,0x20,0x1c,0x1a,0x18,0x17,0x14,0x2e,0x15,0x2e,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21, +0x0c,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e, +0x2d,0x54,0x01,0x11,0x42,0x52,0x42,0x2d,0x25,0x25,0x2e,0x2d,0x25,0x1e,0x56,0xba,0xfa,0x4c,0x2f,0x39,0x53,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x5b,0x4a,0x3a,0x21,0x29,0x20,0x19,0x19,0x1e,0x35,0x39,0x3c,0x46,0x34,0x08,0x37,0x28,0x32,0x41,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x22, +0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2c,0x00,0x57,0x40,0x54,0x15,0x01,0x07,0x05,0x01,0x4c,0x00,0x05,0x04,0x07,0x04,0x05,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x09,0x01,0x01,0x06,0x02,0x01,0x67,0x00,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01, +0x08,0x07,0x08,0x4f,0x14,0x14,0x00,0x00,0x14,0x2c,0x14,0x2c,0x2b,0x2a,0x24,0x22,0x20,0x1f,0x1d,0x1b,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06, +0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x9b,0x9a,0x17,0x1c,0x26,0x23,0x25,0x2c,0x42,0x03,0x50,0x40,0x41,0x4a,0x2c,0x24,0x54,0xad,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60, +0x3e,0x5b,0x0e,0x20,0x11,0x1e,0x23,0x2a,0x24,0x3f,0x4a,0x42,0x38,0x23,0x3a,0x14,0x2d,0x3c,0x00,0x00,0x00,0x05,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x16,0x00,0x1f,0x00,0x26,0x00,0x2d,0x00,0x40,0x40,0x3d,0x2c,0x2b,0x23,0x22,0x04,0x00,0x04,0x01,0x4c,0x05,0x01,0x00,0x04,0x00,0x86,0x00,0x01,0x06,0x01,0x02, +0x03,0x01,0x02,0x69,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x11,0x10,0x01,0x00,0x1c,0x1b,0x14,0x13,0x10,0x16,0x11,0x16,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x21,0x26, +0x26,0x03,0x36,0x36,0x37,0x37,0x21,0x17,0x16,0x16,0x25,0x34,0x27,0x03,0x3e,0x02,0x25,0x14,0x16,0x16,0x17,0x03,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x45,0x70,0x23,0x01,0xb0,0x23,0x70,0x45,0x0c,0x1b,0x0d,0x88,0xfe,0x89,0x88,0x0d,0x1a,0x01,0x10,0x14,0xd6,0x43,0x6a,0x3d,0xfd,0xf8,0x3c, +0x68,0x42,0xd3,0x13,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x3c,0x33,0x33,0x3c,0xfe,0x20,0x17,0x2f,0x16,0xe8,0xe8,0x16,0x2f,0xc5,0x37,0x30,0xfe,0x96,0x06,0x47,0x70,0x46,0x45,0x70,0x46,0x07,0x01,0x67,0x2f,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x25,0x00,0x5f, +0x40,0x5c,0x20,0x1d,0x12,0x03,0x09,0x06,0x01,0x4c,0x07,0x01,0x06,0x00,0x09,0x00,0x06,0x09,0x80,0x00,0x09,0x08,0x00,0x09,0x08,0x7e,0x0c,0x0a,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0b,0x01,0x05,0x00,0x00,0x05,0x57,0x0b,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05, +0x00,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x25,0x0c,0x25,0x1f,0x1e,0x19,0x18,0x17,0x16,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0d,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x07,0x23,0x27, +0x1e,0x02,0x15,0x15,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x70,0x5b,0x37,0x0a,0x0b,0x04,0x04,0x0c,0x0a,0x35,0x5a,0x40,0x04,0x0a,0x56,0x43,0x58,0x05,0x07,0x04,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x4f,0x7b,0x16,0x1b,0x11,0x11,0x1a,0x18,0x7a,0xfe,0xb1,0x5f,0x44,0x61,0x26,0xca,0xc7,0x19,0x35, +0x46,0x34,0x5f,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x23,0x00,0x57,0x40,0x54,0x1f,0x19,0x13,0x0d,0x04,0x08,0x06,0x01,0x4c,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0a,0x01, +0x05,0x00,0x00,0x05,0x57,0x0a,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05,0x00,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x23,0x0c,0x23,0x1b,0x1a,0x18,0x17,0x0f,0x0e,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x37,0x27,0x33,0x17,0x16,0x16,0x17,0x36, +0x36,0x37,0x37,0x33,0x07,0x17,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x70,0x7e,0x7d,0x4e,0x42,0x0d,0x08,0x07,0x05,0x09,0x0c,0x40,0x4d,0x7d,0x7d,0x4f,0x41,0x0d,0x0a,0x06,0x05,0x06,0x0d,0x42,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0xa9,0xa6,0x56,0x10,0x18, +0x0e,0x0e,0x18,0x10,0x56,0xa8,0xa7,0x55,0x11,0x1a,0x0d,0x0d,0x19,0x11,0x56,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0b,0x00,0x13,0x00,0x4d,0x40,0x4a,0x0b,0x01,0x09,0x06,0x09,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0a,0x01,0x05,0x00,0x00,0x07,0x05,0x00, +0x67,0x00,0x07,0x06,0x06,0x07,0x57,0x00,0x07,0x07,0x06,0x5f,0x08,0x01,0x06,0x07,0x06,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x13,0x0c,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x23,0x35,0x21,0x15,0x23, +0x11,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0xf9,0x98,0x01,0x72,0x98,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x04,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x61,0x40,0x5e,0x13,0x01,0x0b,0x08,0x01,0x4c,0x00,0x01,0x00,0x02, +0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x06,0x05,0x00,0x67,0x00,0x06,0x00,0x09,0x08,0x06,0x09,0x67,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x0a,0x07,0x07,0x0a,0x57,0x00,0x0a,0x0a,0x07,0x5f,0x0d,0x01,0x07,0x0a,0x07,0x4f,0x0c,0x0c,0x00,0x00,0x2b,0x29,0x25,0x23,0x22,0x20, +0x1c,0x1a,0x0c,0x19,0x0c,0x18,0x0f,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23, +0x23,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x7f,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19,0xdb,0x19,0x13,0x13,0x17, +0x00,0x02,0x00,0x34,0xff,0xc6,0x02,0x46,0x02,0xda,0x00,0x0b,0x00,0x2f,0x00,0xb7,0x40,0x0c,0x29,0x1b,0x1a,0x03,0x09,0x0a,0x2e,0x01,0x06,0x09,0x02,0x4c,0x4b,0xb0,0x12,0x50,0x58,0x40,0x3e,0x00,0x0a,0x08,0x09,0x09,0x0a,0x72,0x00,0x0b,0x06,0x0b,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04, +0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07,0x00,0x08,0x0a,0x07,0x08,0x69,0x00,0x09,0x06,0x06,0x09,0x59,0x00,0x09,0x09,0x06,0x62,0x0d,0x01,0x06,0x09,0x06,0x52,0x1b,0x40,0x3f,0x00,0x0a,0x08,0x09,0x08,0x0a,0x09,0x80,0x00,0x0b,0x06,0x0b,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05, +0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07,0x00,0x08,0x0a,0x07,0x08,0x69,0x00,0x09,0x06,0x06,0x09,0x59,0x00,0x09,0x09,0x06,0x62,0x0d,0x01,0x06,0x09,0x06,0x52,0x59,0x40,0x1e,0x0d,0x0c,0x00,0x00,0x2d,0x2c,0x2b,0x2a,0x28,0x26,0x22,0x20,0x15,0x13,0x0c,0x2f,0x0d,0x2f,0x00,0x0b,0x00,0x0b,0x11,0x11, +0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x27,0x33,0x17,0x23,0x27,0x06,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca, +0x01,0x1a,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x32,0x4f,0x2e,0x21,0x2d,0x05,0x05,0x3e,0x2d,0x2d,0x3e,0x3e,0x2d,0x0a,0x09,0x36,0x4b,0x8e,0x4b,0x30,0x1c,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x36,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x2d,0x4e,0x32,0x3a,0x2e,0x36,0x0b,0x1a,0x0d,0x31,0x41,0x41,0x31,0x31,0x41,0x02,0x46,0xb7, +0x3e,0x09,0x00,0x00,0x00,0x02,0x00,0x34,0xff,0xfb,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x27,0x00,0x62,0x40,0x5f,0x00,0x08,0x09,0x0b,0x09,0x08,0x0b,0x80,0x00,0x0b,0x0a,0x09,0x0b,0x0a,0x7e,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07, +0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x0a,0x06,0x06,0x0a,0x59,0x00,0x0a,0x0a,0x06,0x61,0x0d,0x01,0x06,0x0a,0x06,0x51,0x0d,0x0c,0x00,0x00,0x25,0x24,0x22,0x20,0x1c,0x1a,0x18,0x17,0x15,0x13,0x0c,0x27,0x0d,0x27,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15, +0x23,0x15,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x01,0x21,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a, +0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x36,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x09,0x00,0x35,0x00,0x61,0x40,0x5e,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x09,0x0a,0x06,0x0a, +0x09,0x06,0x80,0x00,0x06,0x07,0x0a,0x06,0x07,0x7e,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x08,0x00,0x0a,0x09,0x08,0x0a,0x69,0x00,0x07,0x05,0x05,0x07,0x59,0x00,0x07,0x07,0x05,0x61,0x0c,0x01,0x05,0x07,0x05,0x51,0x0b,0x0a,0x00,0x00,0x29,0x26,0x24,0x23,0x21,0x1e,0x13,0x10,0x0e, +0x0d,0x0a,0x35,0x0b,0x34,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x0d,0x06,0x1a,0x2b,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17, +0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x3e,0x01,0x2a,0xe8,0xca,0xca,0x01,0x04,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x3a,0x56,0x3a,0x85,0xfe,0x71,0x3a,0x31,0x16,0x1b, +0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x09,0x00,0x13,0x00,0x55,0x40,0x52,0x0a,0x01,0x04,0x03,0x05,0x03,0x04,0x05,0x80,0x0b,0x01,0x09,0x08,0x09,0x86,0x00,0x00,0x00, +0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x07,0x08,0x4f,0x0a,0x0a,0x00,0x00,0x0a,0x13,0x0a,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x0c,0x06,0x1a, +0x2b,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x3e,0x01,0x2a,0xe8,0xca,0xca,0x86,0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0x3a,0x56,0x3a,0x85,0xfe,0x75,0x01,0x4f,0x3a,0x56,0x3a,0x85,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0xff,0xfc,0x02,0x2f,0x02,0xdf,0x00,0x1f, +0x00,0x4b,0x00,0x65,0x40,0x62,0x00,0x01,0x02,0x05,0x02,0x01,0x05,0x80,0x00,0x0b,0x0c,0x08,0x0c,0x0b,0x08,0x80,0x00,0x08,0x09,0x0c,0x08,0x09,0x7e,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x69,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x03,0x00,0x06,0x0a,0x03,0x06,0x69,0x00,0x0a,0x00,0x0c,0x0b,0x0a,0x0c,0x69,0x00,0x09,0x07, +0x07,0x09,0x59,0x00,0x09,0x09,0x07,0x61,0x0d,0x01,0x07,0x09,0x07,0x51,0x21,0x20,0x3f,0x3c,0x3a,0x39,0x37,0x34,0x29,0x26,0x24,0x23,0x20,0x4b,0x21,0x4a,0x24,0x11,0x12,0x24,0x22,0x12,0x23,0x0e,0x06,0x1d,0x2b,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x23,0x35, +0x33,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x2e,0x4f,0x32,0x39,0x59,0x10,0x44,0x0b,0x34,0x1f, +0x2e,0x3d,0x3d,0x2e,0x20,0x36,0x0d,0x63,0xa7,0x2c,0x4b,0x30,0x32,0x4f,0x2e,0x01,0x64,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x02,0x32,0x32,0x4e,0x2d,0x3d,0x2d,0x14,0x1c,0x41,0x32,0x31, +0x41,0x20,0x27,0x39,0x0e,0x33,0x4d,0x2c,0x2d,0x4e,0xfd,0xfb,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0b,0x00,0x13,0x00,0x4c,0x40,0x49,0x02,0x01, +0x00,0x01,0x00,0x85,0x0a,0x05,0x02,0x03,0x04,0x07,0x04,0x03,0x07,0x80,0x0b,0x01,0x09,0x06,0x09,0x86,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x07,0x06,0x06,0x07,0x57,0x00,0x07,0x07,0x06,0x5f,0x08,0x01,0x06,0x07,0x06,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x13,0x0c,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11, +0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x13,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x15,0x01,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x2d,0x42,0xb2,0x42,0x42,0xb2,0x01,0x00,0x98,0x01,0x72,0x98,0x01,0x8b,0x01,0x4f,0x84,0x84,0xfe,0xb1,0x8f,0x8f,0xfe,0x75,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x00,0x00,0x04,0xff,0xf6, +0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x21,0x00,0x27,0x00,0x2d,0x00,0x50,0x40,0x4d,0x2c,0x23,0x19,0x03,0x00,0x05,0x01,0x4c,0x07,0x01,0x00,0x05,0x00,0x86,0x00,0x01,0x08,0x01,0x02,0x03,0x01,0x02,0x69,0x04,0x01,0x03,0x05,0x05,0x03,0x57,0x04,0x01,0x03,0x03,0x05,0x5f,0x0a,0x06,0x09,0x03,0x05,0x03,0x05,0x4f,0x28,0x28, +0x22,0x22,0x11,0x10,0x01,0x00,0x28,0x2d,0x28,0x2d,0x22,0x27,0x22,0x27,0x1e,0x1d,0x15,0x14,0x10,0x21,0x11,0x21,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0b,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x06,0x07,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x2e, +0x02,0x13,0x07,0x3e,0x02,0x37,0x21,0x1e,0x02,0x17,0x27,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x46,0x71,0x47,0x05,0x77,0x59,0x0e,0x19,0x0c,0x0c,0x1b,0x0d,0x59,0x76,0x05,0x47,0x71,0x60,0x8c,0x40,0x66,0x3e,0x05,0xfd,0xfa,0x05,0x3d,0x64,0x3f,0x8b,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c, +0x59,0x58,0x8d,0x51,0x02,0x3a,0x3e,0x6b,0x44,0x97,0x16,0x2f,0x17,0x17,0x2f,0x16,0x97,0x44,0x6b,0x3e,0xfe,0xe6,0xed,0x06,0x40,0x67,0x40,0x40,0x66,0x40,0x06,0xec,0x00,0x02,0x00,0x51,0x00,0x00,0x02,0x07,0x02,0x30,0x00,0x04,0x00,0x09,0x00,0x28,0x40,0x25,0x09,0x08,0x07,0x03,0x02,0x01,0x06,0x01,0x4a,0x00,0x01,0x00,0x00,0x01, +0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x06,0x05,0x00,0x04,0x00,0x04,0x03,0x06,0x16,0x2b,0x33,0x11,0x37,0x17,0x11,0x25,0x21,0x11,0x27,0x07,0x51,0xdb,0xdb,0xfe,0x7c,0x01,0x52,0xa9,0xa9,0x01,0x5b,0xd5,0xd5,0xfe,0xa5,0x32,0x01,0x11,0xa5,0xa5,0x00,0x00,0x00,0x04,0x00,0x14,0x00,0x00,0x02,0x44, +0x03,0x16,0x00,0x06,0x00,0x0d,0x00,0x17,0x00,0x1b,0x00,0x53,0x40,0x50,0x08,0x06,0x02,0x03,0x4a,0x0a,0x05,0x02,0x03,0x02,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x00,0x01,0x07,0x04,0x01,0x67,0x0b,0x01,0x07,0x0c,0x01,0x09,0x08,0x07,0x09,0x67,0x00,0x08,0x06,0x06,0x08,0x57,0x00,0x08,0x08,0x06,0x5f,0x00,0x06,0x08,0x06,0x4f, +0x18,0x18,0x0e,0x0e,0x07,0x07,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x0e,0x17,0x0e,0x17,0x14,0x11,0x07,0x0d,0x07,0x0d,0x11,0x14,0x11,0x11,0x10,0x0d,0x06,0x1b,0x2b,0x01,0x23,0x15,0x23,0x35,0x23,0x01,0x13,0x27,0x07,0x33,0x15,0x33,0x35,0x13,0x15,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x35,0x17,0x15,0x33,0x35,0x02,0x44,0x9b,0xfa,0x9b, +0x01,0x18,0xba,0xba,0xba,0x6c,0x9c,0x2f,0x21,0x1b,0x82,0x1b,0x21,0x2f,0x9c,0x01,0xe5,0xd6,0xd6,0x01,0x31,0xfe,0xf5,0xcd,0xcd,0xd6,0xd6,0xfe,0xb4,0x83,0x1b,0x21,0x21,0x1b,0x83,0x26,0x71,0x71,0x00,0x00,0x00,0x02,0xff,0x5b,0x00,0x41,0x02,0x8f,0x02,0xa3,0x00,0x0a,0x00,0x16,0x00,0x29,0x40,0x26,0x16,0x15,0x14,0x13,0x12,0x11, +0x10,0x0f,0x0e,0x0d,0x0c,0x02,0x0c,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x05,0x03,0x00,0x0a,0x01,0x0a,0x03,0x06,0x16,0x2b,0x25,0x21,0x01,0x01,0x21,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x27,0x37,0x27,0x07,0x27,0x07,0x17,0x07,0x17,0x37,0x17,0x02,0x2e,0xfe,0x5c,0xfe,0xd1,0x01,0x33, +0x01,0xa0,0x2c,0x35,0x35,0x17,0x9e,0x9b,0x43,0x9b,0x9a,0x48,0x9c,0x99,0x45,0x98,0x9b,0x41,0x01,0x2c,0x01,0x36,0x36,0x2c,0xfe,0x62,0x2b,0x37,0x96,0x9c,0x9c,0x43,0x9b,0x9b,0x47,0x9c,0x99,0x44,0x99,0x9b,0x00,0x02,0xff,0xc9,0x00,0x41,0x02,0xfd,0x02,0xa3,0x00,0x0a,0x00,0x16,0x00,0x29,0x40,0x26,0x16,0x15,0x14,0x13,0x12,0x11, +0x10,0x0f,0x0e,0x0d,0x0c,0x09,0x0c,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x08,0x06,0x00,0x0a,0x01,0x0a,0x03,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x01,0x01,0x25,0x17,0x37,0x17,0x37,0x27,0x37,0x27,0x07,0x27,0x07,0x17,0x2a,0x2b,0x36,0x36,0x2b,0x01,0xa0,0x01, +0x33,0xfe,0xd1,0xfe,0x47,0x48,0x9b,0x98,0x45,0x99,0x9c,0x48,0x9a,0x9b,0x43,0x9b,0x41,0x37,0x2b,0x01,0x9e,0x2c,0x36,0xfe,0xca,0xfe,0xd4,0x96,0x47,0x9b,0x99,0x44,0x99,0x9c,0x47,0x9b,0x9b,0x43,0x9c,0x00,0x00,0x09,0xff,0xa9,0x00,0x41,0x02,0xaf,0x02,0xa3,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1d,0x00,0x21,0x00,0x25,0x00,0x29, +0x00,0x2d,0x00,0x31,0x00,0x64,0x40,0x61,0x00,0x01,0x0a,0x07,0x05,0x03,0x03,0x02,0x01,0x03,0x67,0x09,0x08,0x04,0x03,0x02,0x10,0x0e,0x02,0x0c,0x06,0x02,0x0c,0x67,0x0f,0x0d,0x0b,0x03,0x06,0x00,0x12,0x11,0x06,0x12,0x67,0x00,0x11,0x00,0x00,0x11,0x57,0x00,0x11,0x11,0x00,0x60,0x13,0x01,0x00,0x11,0x00,0x50,0x01,0x00,0x31,0x30, +0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x09,0x06,0x00,0x0f,0x01,0x0e,0x14,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x33,0x35,0x23,0x17,0x33, +0x35,0x23,0x01,0x33,0x11,0x23,0x15,0x33,0x23,0x33,0x35,0x23,0x03,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x01,0x21,0x35,0x21,0x14,0x2f,0x3c,0x36,0x2b,0x02,0x44,0x2c,0x35,0x35,0x2c,0xfd,0x9f,0x6c,0x6c,0x98,0x6c,0x6c,0x01,0x7a,0x6c,0xb6,0x4a,0xe2,0x6c,0x6c,0xe6,0x6c,0x6c,0x98,0x6c,0x6c,0x98,0x6c,0x6c,0xfe, +0x86,0x01,0xe6,0xfe,0x1a,0x41,0x3c,0x2f,0x01,0x95,0x2c,0x36,0x36,0x2c,0xfe,0x61,0x2b,0x36,0x01,0x9e,0x80,0x80,0x80,0xfe,0xd4,0x01,0x2c,0x80,0x80,0xfe,0xd4,0x80,0x80,0x80,0x80,0x80,0xfe,0xd4,0x80,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x01,0x07,0x05,0x02, +0x00,0x02,0x01,0x00,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x21,0x03,0x23,0x35,0x33,0x13,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x69,0xbc,0xa3,0xe5,0xbd,0xa2,0xcc,0xcc, +0x02,0x8a,0x50,0xfd,0x76,0x50,0x02,0x8a,0x50,0x50,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0xe2,0x01,0xf4,0x02,0xdb,0x00,0x16,0x00,0x3f,0x40,0x3c,0x12,0x01,0x08,0x49,0x00,0x03,0x02,0x03,0x85,0x09,0x01,0x08,0x07,0x08,0x86,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x06,0x01,0x00,0x07,0x07,0x00,0x57,0x06,0x01,0x00,0x00, +0x07,0x5f,0x0a,0x01,0x07,0x00,0x07,0x4f,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x0b,0x06,0x1f,0x2b,0x13,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x07,0x27,0x33,0x35,0x23,0x6e,0x93,0x93,0x93,0x56,0x93,0x93,0x93,0x93,0x9d,0xc2,0xce,0x9d,0x93,0x01,0x94, +0x59,0x50,0x9e,0x9e,0x50,0x59,0x50,0x7e,0xe4,0xe4,0x7e,0x00,0x00,0x01,0x00,0x64,0xff,0xff,0x01,0xf4,0x02,0xf8,0x00,0x16,0x00,0x44,0x40,0x41,0x05,0x01,0x01,0x4a,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x07,0x06,0x07,0x86,0x03,0x01,0x00,0x0b,0x0a,0x02,0x04,0x05,0x00,0x04,0x67,0x09,0x01,0x05,0x06,0x06,0x05,0x57,0x09,0x01,0x05, +0x05,0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x15,0x14,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x0c,0x06,0x1f,0x2b,0x13,0x35,0x33,0x35,0x23,0x37,0x17,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x6e,0x93,0x9d,0xce,0xc2,0x9d,0x93,0x93,0x93,0x93,0x56, +0x93,0x93,0x01,0x46,0x50,0x7e,0xe4,0xe4,0x7e,0x50,0x59,0x50,0x9e,0x9e,0x50,0x59,0x00,0x06,0x00,0x00,0x00,0x48,0x02,0x58,0x02,0x9c,0x00,0x0a,0x00,0x0e,0x00,0x19,0x00,0x24,0x00,0x2f,0x00,0x5f,0x00,0x6e,0x40,0x6b,0x0f,0x01,0x0d,0x05,0x01,0x01,0x00,0x0d,0x01,0x69,0x0e,0x14,0x04,0x03,0x00,0x10,0x0c,0x02,0x03,0x02,0x00,0x03, +0x69,0x11,0x0b,0x02,0x02,0x13,0x08,0x15,0x03,0x06,0x07,0x02,0x06,0x69,0x09,0x01,0x07,0x0a,0x0a,0x07,0x59,0x09,0x01,0x07,0x07,0x0a,0x61,0x12,0x16,0x02,0x0a,0x07,0x0a,0x51,0x31,0x30,0x1b,0x1a,0x10,0x0f,0x5c,0x5b,0x58,0x56,0x52,0x50,0x4f,0x4d,0x49,0x47,0x44,0x43,0x40,0x3e,0x3a,0x38,0x37,0x35,0x30,0x5f,0x31,0x5f,0x2e,0x2c, +0x28,0x26,0x20,0x1e,0x1a,0x24,0x1b,0x24,0x15,0x13,0x0f,0x19,0x10,0x19,0x11,0x12,0x24,0x21,0x17,0x06,0x1a,0x2b,0x01,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x33,0x35,0x23,0x27,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x35,0x23,0x22,0x06, +0x15,0x14,0x16,0x33,0x32,0x36,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x23,0x15,0x14,0x06,0x01,0x9c,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0xa6, +0x6c,0x6c,0x7b,0x41,0x25,0x1c,0x1c,0x25,0x25,0x01,0x7e,0x41,0x25,0x1c,0x1c,0x25,0x25,0xfe,0xc3,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0x41,0x34,0x47,0x47,0x34,0x41,0x41,0x34,0x47,0x47,0x34,0x35,0x46,0x6c,0x47,0x34,0x35,0x46,0x46,0x35,0x41,0x41,0x35,0x46,0x46,0x35,0x34,0x47,0x6c,0x46,0x02,0x24,0x41,0x25,0x1c,0x1c,0x25,0x25, +0xfe,0xf8,0x74,0x37,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0xe2,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0x41,0x41,0x25,0x1c,0x1c,0x25,0x25,0x5c,0x44,0x34,0x34,0x44,0x74,0x44,0x34,0x34,0x44,0x44,0x34,0x41,0x41,0x34,0x44,0x44,0x34,0x34,0x44,0x74,0x44,0x34,0x34,0x44,0x44,0x34,0x41,0x41,0x34,0x44,0x00,0x00,0x00,0x00,0x02,0xff,0xec, +0x00,0x32,0x02,0x67,0x02,0xda,0x00,0x11,0x00,0x1a,0x00,0x3d,0x40,0x3a,0x19,0x02,0x02,0x00,0x04,0x1a,0x01,0x02,0x03,0x05,0x02,0x4c,0x12,0x00,0x02,0x02,0x49,0x00,0x01,0x00,0x04,0x00,0x01,0x04,0x67,0x00,0x00,0x00,0x05,0x03,0x00,0x05,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x11, +0x11,0x12,0x25,0x33,0x13,0x06,0x06,0x1c,0x2b,0x25,0x01,0x01,0x15,0x33,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x21,0x07,0x35,0x21,0x11,0x23,0x11,0x23,0x35,0x07,0x01,0x1d,0xfe,0xcf,0x01,0x31,0x4c,0x21,0x1b,0x86,0x1b,0x21,0x21,0x1b,0xfe,0xf2,0x2c,0x01,0x47,0xa0,0xa7,0xc5,0x32,0x01,0x1d,0x01,0x1d,0xa5, +0xd7,0x1b,0x21,0x21,0x1b,0xfe,0x76,0x1b,0x21,0x40,0x6b,0x01,0xaa,0xfe,0xee,0x6c,0xb8,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x05,0x00,0x0f,0x00,0x48,0x40,0x45,0x00,0x00,0x01,0x00,0x85,0x09,0x01,0x07,0x06,0x07,0x86,0x00,0x01,0x08,0x01,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03, +0x04,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x05,0x06,0x4f,0x06,0x06,0x00,0x00,0x06,0x0f,0x06,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0a,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x03,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x52,0x42,0xde,0x6c, +0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0xfe,0xed,0x3c,0xfe,0x75,0x01,0x4f,0x3a,0x56,0x3a,0x85,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x11,0x00,0x1e,0x00,0x54,0x40,0x51,0x0c,0x03,0x02,0x02,0x00,0x19,0x01,0x08,0x05,0x02,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x0a,0x03,0x02,0x02,0x04,0x02,0x85,0x06,0x01, +0x04,0x05,0x04,0x85,0x0b,0x09,0x02,0x07,0x08,0x07,0x86,0x00,0x05,0x08,0x08,0x05,0x57,0x00,0x05,0x05,0x08,0x5f,0x00,0x08,0x05,0x08,0x4f,0x12,0x12,0x00,0x00,0x12,0x1e,0x12,0x1e,0x1d,0x1c,0x1b,0x1a,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x0c,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35, +0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0x13,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x17,0x23,0x27,0x23,0x15,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x87,0x42,0x4f,0x60,0x4a,0x71,0x7b,0x4e,0x66,0x4f,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0xfe, +0x75,0x01,0x4f,0x86,0x86,0xa1,0xae,0x8f,0x8f,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x11,0x00,0x17,0x00,0x43,0x40,0x40,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x07,0x03,0x02,0x02,0x04,0x02,0x85,0x00,0x04,0x05,0x04,0x85,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05, +0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x12,0x12,0x00,0x00,0x12,0x17,0x12,0x17,0x16,0x15,0x14,0x13,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x09,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05, +0x02,0xac,0x42,0xde,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0xfe,0x75,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x00,0x02,0x00,0x2d,0xff,0xf6,0x02,0x2b,0x02,0xda,0x00,0x11,0x00,0x23,0x00,0x46,0x40,0x43,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x08, +0x03,0x02,0x02,0x05,0x02,0x85,0x07,0x01,0x05,0x06,0x05,0x85,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04,0x51,0x13,0x12,0x00,0x00,0x20,0x1f,0x1c,0x1a,0x17,0x16,0x12,0x23,0x13,0x23,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x0a,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11, +0x23,0x03,0x1e,0x02,0x15,0x15,0x01,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x22,0x45,0x56,0x42,0x31,0x28,0x28,0x31,0x42,0x56,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26, +0x31,0x2d,0x69,0xfe,0x6b,0x53,0x47,0xbf,0xbf,0x2c,0x32,0x32,0x2c,0xbf,0xbf,0x47,0x53,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0xd5,0x00,0x0d,0x00,0x37,0x00,0x32,0x40,0x2f,0x00,0x01,0x00,0x01,0x85,0x04,0x01,0x00,0x03,0x00,0x85,0x00,0x03,0x02,0x02,0x03,0x59,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x03, +0x02,0x51,0x0f,0x0e,0x01,0x00,0x24,0x22,0x0e,0x37,0x0f,0x37,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x36,0x17,0x16,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27, +0x26,0x26,0x37,0x36,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x01,0x2c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x17,0x43,0x74,0x58,0x31,0x32,0x2a,0x15,0x33,0x10,0x10,0x07,0x14,0x19,0x1d,0x34,0x5d,0x3c,0x3c,0x5d,0x34,0x1c,0x1a,0x14,0x07,0x10,0x11,0x32,0x15,0x2b,0x31,0x31,0x58,0x74,0xe1,0x23,0x19,0x01,0x7c,0x19,0x23,0x23,0x19, +0xfe,0x84,0x19,0x23,0xeb,0x30,0x57,0x72,0x42,0x41,0x72,0x2b,0x16,0x07,0x11,0x10,0x30,0x17,0x1c,0x4b,0x2c,0x3d,0x5f,0x36,0x36,0x5f,0x3d,0x2c,0x4b,0x1c,0x17,0x30,0x10,0x11,0x07,0x16,0x2a,0x73,0x41,0x42,0x72,0x57,0x30,0x00,0x00,0x03,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0x6c,0x00,0x13,0x00,0x23,0x00,0x31,0x00,0x49,0x40,0x46, +0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x08,0x01,0x04,0x02,0x03,0x04,0x02,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x25,0x24,0x15,0x14,0x01,0x00,0x2c,0x2a,0x24,0x31,0x25,0x31,0x1d,0x1b,0x14,0x23,0x15,0x23,0x0b,0x09,0x00, +0x13,0x01,0x13,0x09,0x06,0x16,0x2b,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x2c,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x43, +0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x3c,0x62,0x39,0x39,0x62,0x3c,0x3c,0x61,0x3a,0x3a,0x61,0x3c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x0a,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x5f,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x46,0x23,0x19,0xb4,0x19,0x23,0x23,0x19, +0xb4,0x19,0x23,0x00,0x00,0x02,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0x6c,0x00,0x13,0x00,0x23,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x15,0x14,0x01,0x00,0x1d,0x1b,0x14,0x23,0x15,0x23,0x0b,0x09,0x00,0x13,0x01, +0x13,0x06,0x06,0x16,0x2b,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x3c,0x62,0x39,0x39,0x62,0x3c,0x3c,0x61,0x3a, +0x3a,0x61,0x0a,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x5f,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x00,0x01,0x00,0xf5,0xff,0xfb,0x01,0x63,0x02,0x67,0x00,0x0d,0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x08,0x06,0x00,0x0d, +0x01,0x0d,0x03,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x01,0x2c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x05,0x23,0x19,0x01,0xf4,0x19,0x23,0x23,0x19,0xfe,0x0c,0x19,0x23,0x00,0x00,0x00,0x01,0x00,0x06,0xff,0xf7,0x02,0x66,0x02,0x57,0x00,0x15,0x00,0x16,0x40,0x13,0x0f,0x07,0x02,0x00, +0x4a,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x15,0x1d,0x02,0x06,0x18,0x2b,0x37,0x26,0x26,0x36,0x36,0x37,0x36,0x37,0x06,0x06,0x16,0x17,0x16,0x16,0x36,0x37,0x06,0x07,0x0e,0x02,0x26,0x64,0x2f,0x2f,0x01,0x30,0x30,0x27,0x2b,0x1e,0x05,0x2e,0x2e,0x2f,0x82,0x89,0x3a,0x16,0x27,0x30,0x75,0x7c,0x75,0x55,0x2f,0x75,0x7c,0x75, +0x30,0x27,0x16,0x39,0x8a,0x82,0x2e,0x2f,0x2e,0x05,0x1e,0x2b,0x27,0x30,0x30,0x01,0x2f,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x4a,0x02,0x35,0x02,0xda,0x00,0x03,0x00,0x09,0x00,0x34,0x40,0x31,0x08,0x05,0x02,0x02,0x01,0x01,0x4c,0x05,0x03,0x02,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x04, +0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x09,0x02,0x23,0x27,0x07,0x37,0x01,0xea,0xfe,0x02,0x01,0x09,0x01,0x09,0x6e,0x9a,0x9e,0x02,0x8a,0x50,0x50,0xfe,0xc0,0x01,0x0e,0xfe,0xf2,0xa2,0xa2,0x00,0x00,0x00,0x00,0x03,0x00,0x2d, +0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x42,0x00,0x6b,0x40,0x68,0x08,0x01,0x02,0x04,0x01,0x4c,0x0c,0x03,0x02,0x01,0x02,0x09,0x02,0x01,0x09,0x80,0x00,0x0a,0x0b,0x07,0x0b,0x0a,0x07,0x80,0x00,0x07,0x08,0x0b,0x07,0x08,0x7e,0x00,0x00,0x00,0x05,0x04,0x00,0x05,0x67,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00, +0x09,0x00,0x0b,0x0a,0x09,0x0b,0x69,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0d,0x01,0x06,0x08,0x06,0x51,0x18,0x17,0x00,0x00,0x36,0x33,0x31,0x30,0x2e,0x2b,0x20,0x1d,0x1b,0x1a,0x17,0x42,0x18,0x41,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x16,0x21,0x0e,0x06,0x19,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14, +0x06,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x2d,0xc6,0x38,0x44, +0x34,0x2b,0x67,0x50,0x64,0x54,0x85,0x19,0x1f,0x1e,0x19,0x86,0x01,0x15,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x3d,0x2f,0x28,0x32,0x06,0x83,0x81,0x81,0xb3,0x1b,0x15, +0x16,0x1c,0xfd,0x5c,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x03,0xff,0xf6,0xff,0xf5,0x02,0x62,0x02,0xe4,0x00,0x14,0x00,0x27,0x00,0x35,0x00,0x53,0x40,0x50,0x00,0x03,0x06,0x02,0x06,0x03,0x02,0x80, +0x00,0x01,0x00,0x04,0x05,0x01,0x04,0x69,0x00,0x05,0x00,0x06,0x03,0x05,0x06,0x69,0x00,0x02,0x00,0x08,0x07,0x02,0x08,0x69,0x0a,0x01,0x07,0x00,0x00,0x07,0x59,0x0a,0x01,0x07,0x07,0x00,0x61,0x09,0x01,0x00,0x07,0x00,0x51,0x2a,0x28,0x01,0x00,0x31,0x2e,0x28,0x35,0x2a,0x35,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x17,0x16,0x15,0x0b, +0x09,0x00,0x14,0x01,0x14,0x0b,0x06,0x16,0x2b,0x05,0x22,0x27,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x33,0x32,0x17,0x13,0x16,0x16,0x15,0x14,0x07,0x03,0x06,0x03,0x33,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x01, +0x2c,0x23,0x23,0xd4,0x1c,0x1b,0xd5,0x23,0x23,0x23,0x23,0xd5,0x0e,0x0d,0x1c,0xd4,0x22,0x48,0x35,0x2c,0x33,0x3e,0x35,0x3f,0x3f,0x1c,0x21,0x21,0x1c,0x21,0x13,0x12,0x0e,0x11,0x11,0x0e,0x12,0x0d,0x11,0x11,0x0b,0x2a,0x01,0x03,0x23,0x23,0x24,0x22,0x01,0x0b,0x2b,0x2b,0xfe,0xf5,0x11,0x24,0x11,0x23,0x23,0xfe,0xfd,0x2a,0x01,0x20, +0x35,0x02,0x38,0x2d,0x32,0x3a,0x32,0x20,0x1d,0x1c,0x23,0xc5,0x13,0x0d,0x0e,0x12,0x12,0x0e,0x0d,0x13,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2e,0x02,0xde,0x00,0x2b,0x00,0x37,0x00,0x62,0x40,0x5f,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c, +0x01,0x00,0x08,0x02,0x00,0x69,0x00,0x08,0x09,0x01,0x07,0x06,0x08,0x07,0x67,0x0a,0x01,0x06,0x0b,0x0b,0x06,0x57,0x0a,0x01,0x06,0x06,0x0b,0x5f,0x0d,0x01,0x0b,0x06,0x0b,0x4f,0x2c,0x2c,0x01,0x00,0x2c,0x37,0x2c,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b, +0x01,0x2a,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x35,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x15,0xbc,0x40, +0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x1d,0x7d,0x7d,0x01,0x3c,0x7d,0x7d,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11, +0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x3c,0xd7,0x3c,0x3c,0xd7,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x25,0xff,0xfb,0x02,0x3f,0x02,0xde,0x00,0x2b,0x00,0x3b,0x00,0x47,0x00,0x61,0x40,0x5e,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00, +0x02,0x0a,0x01,0x00,0x07,0x02,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x0c,0x01,0x08,0x06,0x06,0x08,0x59,0x0c,0x01,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x3d,0x3c,0x2d,0x2c,0x01,0x00,0x43,0x41,0x3c,0x47,0x3d,0x47,0x35,0x33,0x2c,0x3b,0x2d,0x3b,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00, +0x2b,0x01,0x2a,0x0d,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15, +0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0xbb,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x32,0x4f,0x2e,0x2e,0x4f,0x32, +0x2d,0x3e,0x3e,0x2d,0x2d,0x3e,0x3e,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x74,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x2d,0x4e,0x32,0x31,0x4e,0x2d,0x3a,0x41,0x31,0x31,0x42,0x42,0x31,0x31,0x41,0x00,0x00, +0x00,0x03,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x36,0x00,0x3f,0x00,0x62,0x40,0x5f,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x0c,0x01,0x08,0x07,0x08,0x86,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x06,0x00,0x0a,0x09,0x06, +0x0a,0x67,0x00,0x09,0x07,0x07,0x09,0x57,0x00,0x09,0x09,0x07,0x5f,0x00,0x07,0x09,0x07,0x4f,0x2c,0x2c,0x01,0x00,0x3f,0x3d,0x39,0x37,0x2c,0x36,0x2c,0x36,0x35,0x33,0x2f,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0d,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35, +0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c, +0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x2a,0xbf,0x38,0x44,0x44,0x38,0x7d,0x7e,0x19,0x1f,0x1e,0x19,0x7f,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a, +0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x3f,0x2f,0x2e,0x3e,0x75,0xaf,0x1d,0x15,0x16,0x1e,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2b,0x02,0xde,0x00,0x2b,0x00,0x37,0x00,0x66,0x40,0x63,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x08,0x01,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0d,0x0b, +0x02,0x09,0x0a,0x09,0x86,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x07,0x0a,0x0a,0x07,0x57,0x00,0x07,0x07,0x0a,0x5f,0x00,0x0a,0x07,0x0a,0x4f,0x2c,0x2c,0x01,0x00,0x2c,0x37,0x2c,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06, +0x04,0x03,0x00,0x2b,0x01,0x2a,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35, +0x23,0x15,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0x42,0xb2,0x42,0x42,0xb2,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11, +0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x84,0x84,0xfe,0xb1,0x8f,0x8f,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x43,0x00,0x62,0x40,0x5f,0x3f,0x39,0x33,0x2d,0x04,0x08,0x06,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01, +0x02,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x2c,0x2c,0x01,0x00,0x2c,0x43,0x2c,0x43,0x3b,0x3a,0x38,0x37,0x2f,0x2e,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06, +0x04,0x03,0x00,0x2b,0x01,0x2a,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x37,0x27,0x33,0x17,0x16,0x16,0x17,0x36,0x36, +0x37,0x37,0x33,0x07,0x17,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x11,0x7e,0x7d,0x4e,0x42,0x0d,0x08,0x07,0x05,0x09,0x0c,0x40,0x4d,0x7d, +0x7d,0x4f,0x41,0x0d,0x0a,0x06,0x05,0x06,0x0d,0x42,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0xa9,0xa6,0x56,0x10,0x18,0x0e,0x0e,0x18,0x10,0x56,0xa8,0xa7,0x55,0x11,0x1a,0x0d,0x0d,0x19,0x11,0x56, +0x00,0x04,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x39,0x00,0x42,0x00,0x4b,0x00,0x6d,0x40,0x6a,0x33,0x01,0x0b,0x08,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x06,0x00,0x09, +0x08,0x06,0x09,0x67,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x0a,0x07,0x07,0x0a,0x57,0x00,0x0a,0x0a,0x07,0x5f,0x0d,0x01,0x07,0x0a,0x07,0x4f,0x2c,0x2c,0x01,0x00,0x4b,0x49,0x45,0x43,0x42,0x40,0x3c,0x3a,0x2c,0x39,0x2c,0x38,0x2f,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0e,0x06,0x16, +0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35, +0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14, +0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19,0xdb,0x19,0x13,0x13,0x17,0x00,0x00, +0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2b,0x02,0xde,0x00,0x2b,0x00,0x3d,0x00,0x60,0x40,0x5d,0x38,0x2f,0x02,0x08,0x06,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00, +0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x2c,0x2c,0x01,0x00,0x2c,0x3d,0x2c,0x3d,0x37,0x36,0x35,0x34,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27, +0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d, +0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f, +0xfe,0xf7,0x1e,0x26,0x30,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0x12,0x02,0xe4,0x00,0x1c,0x00,0x43,0x40,0x40,0x16,0x15,0x10,0x03,0x04,0x03,0x01,0x4c,0x00,0x01,0x02,0x03,0x02,0x01,0x03,0x80,0x00,0x03,0x04,0x02,0x03,0x04,0x7e,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00, +0x3e,0x4d,0x00,0x04,0x04,0x05,0x60,0x00,0x05,0x05,0x39,0x05,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1c,0x01,0x1c,0x07,0x09,0x16,0x2b,0x01,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x33,0x15,0x07,0x21,0x15,0x21,0x35,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x01,0x37, +0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x46,0x3c,0x4f,0xb3,0x01,0x2c,0xfe,0x6e,0xb0,0x5a,0x68,0x77,0x02,0xe4,0x71,0x61,0x3c,0x46,0x46,0x3c,0x32,0x3c,0x46,0x4e,0xbe,0x52,0x54,0xbb,0x07,0x6f,0x5b,0x32,0x61,0x71,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0xff,0xf6,0x02,0x0c,0x02,0xda,0x00,0x18,0x00,0x34,0x40,0x31,0x01,0x01,0x01,0x03, +0x01,0x4c,0x00,0x01,0x03,0x00,0x03,0x01,0x00,0x80,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x38,0x4d,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x16,0x22,0x12,0x27,0x06,0x09,0x1a,0x2b,0x01,0x15,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x26, +0x35,0x34,0x36,0x37,0x37,0x21,0x35,0x02,0x02,0xf3,0x34,0x2d,0x45,0x3b,0x3d,0x47,0x5a,0x03,0x78,0x63,0x65,0x77,0x39,0x45,0xc5,0xfe,0xb4,0x02,0xda,0x53,0xfe,0xfc,0x37,0x59,0x2a,0x3c,0x47,0x49,0x3e,0x63,0x74,0x73,0x61,0x35,0x73,0x48,0xce,0x52,0x00,0x02,0x00,0x2d,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x11,0x00,0x3d,0x00,0x59, +0x40,0x56,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x08,0x09,0x05,0x09,0x08,0x05,0x80,0x00,0x05,0x06,0x09,0x05,0x06,0x7e,0x00,0x02,0x0a,0x01,0x00,0x07,0x02,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x13,0x12,0x01,0x00,0x31,0x2e,0x2c, +0x2b,0x29,0x26,0x1b,0x18,0x16,0x15,0x12,0x3d,0x13,0x3c,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36, +0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0xc8,0x45,0x56,0x42,0x31,0x28,0x28,0x31,0x42,0x56,0x77,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16, +0x58,0x33,0x3b,0x4e,0x44,0x01,0x81,0x53,0x47,0xbf,0xbf,0x2c,0x32,0x32,0x2c,0xbf,0xbf,0x47,0x53,0xfe,0x7b,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x02,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0c, +0x00,0x14,0x00,0x3a,0x40,0x37,0x03,0x01,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x04,0x01,0x85,0x07,0x01,0x06,0x03,0x06,0x86,0x00,0x04,0x03,0x03,0x04,0x57,0x00,0x04,0x04,0x03,0x5f,0x05,0x01,0x03,0x04,0x03,0x4f,0x0d,0x0d,0x0d,0x14,0x0d,0x14,0x11,0x11,0x12,0x11,0x11,0x17,0x08,0x06,0x1c,0x2b,0x13,0x16, +0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x23,0x03,0x33,0x01,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xad,0x08,0x12,0x02,0x02,0x10,0x07,0x57,0x48,0x94,0x4a,0x94,0x45,0x01,0x1b,0x98,0x01,0x72,0x98,0x02,0x0c,0x13,0x29,0x0e,0x0e,0x29,0x13,0xce,0xfe,0xb1,0x01,0x4f,0xfd,0x26,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x00,0x02,0x00,0x37, +0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x1a,0x00,0x23,0x00,0x42,0x40,0x3f,0x06,0x01,0x04,0x03,0x01,0x4c,0x00,0x03,0x06,0x01,0x04,0x05,0x03,0x04,0x67,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x08,0x01,0x05,0x05,0x00,0x5f,0x07,0x01,0x00,0x00,0x39,0x00,0x4e,0x1c,0x1b,0x01,0x00,0x1f,0x1d,0x1b,0x23,0x1c,0x23,0x19,0x18, +0x17,0x15,0x11,0x0f,0x0e,0x0c,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23,0x11,0x27,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x17,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xad,0xad,0x35,0x3e, +0x3f,0x36,0x01,0x3c,0x73,0xca,0x70,0x70,0x3c,0x47,0x47,0x70,0x5f,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x56,0x66,0x52,0x3d,0x35,0x34,0x3e,0x50,0xfe,0xac,0x52,0x01,0x02,0x46,0x3b,0x3b,0x46,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0xff,0x06,0x01,0xa4,0xff,0xce,0x00,0x07,0x06,0x79,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x8c, +0xff,0x2e,0x01,0xcc,0xff,0xb0,0x00,0x19,0x00,0x6d,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04, +0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23, +0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0xd2,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x13,0xff,0x4c,0x01,0xf9,0x03,0x84,0x00,0x36, +0x00,0x41,0x40,0x3e,0x36,0x02,0x02,0x01,0x00,0x0c,0x06,0x05,0x03,0x03,0x01,0x08,0x01,0x04,0x03,0x22,0x1f,0x07,0x03,0x02,0x04,0x04,0x4c,0x00,0x03,0x01,0x04,0x01,0x03,0x04,0x80,0x00,0x00,0x00,0x01,0x03,0x00,0x01,0x69,0x00,0x04,0x04,0x02,0x5f,0x00,0x02,0x02,0x3d,0x02,0x4e,0x2a,0x28,0x26,0x25,0x21,0x20,0x13,0x11,0x10,0x05, +0x09,0x17,0x2b,0x01,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0xfe,0xd0,0x5a,0x40,0x41,0x02, +0x4e,0xfe,0x61,0x01,0x27,0x13,0x20,0x08,0x09,0x21,0x11,0xfe,0x08,0x4c,0x49,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5f,0x52,0x5a,0x57,0x66,0x5a,0x4e,0x40,0x3e,0x4a,0x31,0x2a,0x6f,0x45,0x4f,0x5e,0x4d,0x03,0x84,0xa4,0x0b,0x23,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09,0x01,0x0a,0x2a,0x3f,0x32,0x28,0x39,0x0b, +0x20,0x14,0x71,0x4d,0x52,0x6d,0x0c,0xae,0xad,0x0b,0x6c,0x58,0x3d,0x45,0x47,0x38,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0x00,0x00,0x00,0x01,0xfe,0x07,0xff,0x4c,0x02,0x01,0x03,0x84,0x00,0x36,0x00,0x48,0x40,0x45,0x21,0x1e,0x02,0x04,0x02,0x06,0x01,0x03,0x04,0x0b,0x07,0x05,0x04,0x04,0x01,0x03,0x35,0x01,0x00,0x01, +0x04,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x69,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x4d,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x00,0x00,0x00,0x36,0x00,0x36,0x22,0x14,0x1d,0x2e,0x11,0x07,0x09,0x1b,0x2b,0x17,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16, +0x17,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0xf6,0x6d,0x90,0xfe,0x0e,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0x9b,0x8e,0x65,0x48,0x54,0x31,0x2a, +0x6f,0x45,0x4f,0x5e,0x4d,0x5a,0x47,0x56,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5e,0x53,0xb4,0xab,0x06,0x3f,0xdc,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0a,0x08,0xb3,0x3e,0x45,0x3a,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0xa2,0xa5,0x0f,0x65,0x48,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x71, +0x4d,0x50,0x6a,0x0f,0xb0,0x00,0x00,0x00,0x00,0x01,0xfb,0xc8,0xff,0x4c,0x01,0xe0,0x03,0x84,0x00,0x40,0x00,0x42,0x40,0x3f,0x21,0x1e,0x02,0x03,0x02,0x2b,0x27,0x25,0x24,0x0b,0x07,0x06,0x05,0x04,0x09,0x01,0x03,0x3f,0x26,0x02,0x00,0x01,0x03,0x4c,0x00,0x02,0x00,0x03,0x01,0x02,0x03,0x69,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00, +0x42,0x4d,0x05,0x01,0x04,0x04,0x3d,0x04,0x4e,0x00,0x00,0x00,0x40,0x00,0x40,0x33,0x31,0x1d,0x2e,0x11,0x06,0x09,0x19,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35, +0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0xfe,0xb7,0x6d,0x90,0xfe,0x0e,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0x9b,0x8e,0x65,0x4d,0x4f,0x31,0x2a,0x6f,0x45,0x4f,0x5e,0x4d,0x5a,0x3f,0x42,0x02,0x4e,0xfe,0x61,0x01,0x27,0x13, +0x20,0x08,0x09,0x21,0x11,0xfe,0x08,0x26,0x4c,0x23,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5c,0x55,0xb4,0xab,0x06,0x3f,0xdc,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0a,0x08,0xb3,0x3e,0x47,0x38,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0xa2,0xa5,0x0a,0x23,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09, +0x01,0x0a,0x14,0x16,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x71,0x4d,0x4f,0x6b,0x0f,0xb0,0x00,0x00,0x00,0x00,0x03,0xfd,0xda,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x32,0x00,0x3b,0x00,0x44,0x00,0x5c,0x40,0x59,0x0e,0x01,0x01,0x05,0x01,0x4c,0x08,0x01,0x05,0x0d,0x0b,0x09,0x03,0x01,0x0a,0x05,0x01,0x67,0x07,0x01,0x04,0x04,0x03,0x5f, +0x06,0x01,0x03,0x03,0x38,0x4d,0x10,0x0c,0x0f,0x03,0x0a,0x0a,0x00,0x5f,0x02,0x0e,0x02,0x00,0x00,0x39,0x00,0x4e,0x3d,0x3c,0x34,0x33,0x01,0x00,0x40,0x3e,0x3c,0x44,0x3d,0x44,0x37,0x35,0x33,0x3b,0x34,0x3b,0x31,0x30,0x2f,0x2d,0x29,0x27,0x26,0x24,0x1f,0x1d,0x19,0x17,0x16,0x14,0x09,0x07,0x06,0x05,0x00,0x32,0x01,0x32,0x11,0x09, +0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23,0x11,0x25,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33, +0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x12,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xaa,0xaa,0x35,0x3e,0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e,0x41,0x34,0x01,0x50,0x74,0xfc,0xcb,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e, +0x61,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x50,0xfe,0xac,0x50,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x00,0x00,0x00,0x00,0x04,0xfb,0x82,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x4a,0x00,0x53,0x00,0x5c,0x00,0x65,0x00,0x76, +0x40,0x73,0x16,0x01,0x01,0x07,0x01,0x4c,0x0d,0x0a,0x02,0x07,0x14,0x12,0x10,0x0e,0x03,0x05,0x01,0x0f,0x07,0x01,0x67,0x0c,0x09,0x02,0x06,0x06,0x05,0x5f,0x0b,0x08,0x02,0x05,0x05,0x38,0x4d,0x18,0x13,0x17,0x11,0x16,0x05,0x0f,0x0f,0x00,0x5f,0x04,0x02,0x15,0x03,0x00,0x00,0x39,0x00,0x4e,0x5e,0x5d,0x55,0x54,0x4c,0x4b,0x01,0x00, +0x61,0x5f,0x5d,0x65,0x5e,0x65,0x58,0x56,0x54,0x5c,0x55,0x5c,0x4f,0x4d,0x4b,0x53,0x4c,0x53,0x49,0x48,0x47,0x45,0x41,0x3f,0x3e,0x3c,0x37,0x35,0x31,0x2f,0x2e,0x2c,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x11,0x0f,0x0e,0x0d,0x09,0x07,0x06,0x05,0x00,0x4a,0x01,0x4a,0x19,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22, +0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23, +0x11,0x25,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x12,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xaa,0xaa,0x35,0x3e,0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e, +0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e,0x41,0x34,0x01,0x50,0x74,0xfa,0x73,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e,0x61,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x59,0x63,0x50,0x3b,0x38, +0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x50,0xfe,0xac,0x50,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x00,0x03,0xfd,0xdf,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x1a,0x00,0x23,0x00,0x27,0x00,0x53,0x40,0x50, +0x06,0x01,0x04,0x03,0x01,0x4c,0x00,0x03,0x06,0x01,0x04,0x07,0x03,0x04,0x67,0x00,0x07,0x0b,0x01,0x08,0x05,0x07,0x08,0x67,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x0a,0x01,0x05,0x05,0x00,0x5f,0x09,0x01,0x00,0x00,0x39,0x00,0x4e,0x24,0x24,0x1c,0x1b,0x01,0x00,0x24,0x27,0x24,0x27,0x26,0x25,0x1f,0x1d,0x1b,0x23,0x1c, +0x23,0x19,0x18,0x17,0x15,0x11,0x0f,0x0e,0x0c,0x00,0x1a,0x01,0x1a,0x0c,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x11,0x27,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x25,0x35,0x21,0x15,0xfe,0xbf,0x67,0x79,0x51,0x40,0x39, +0x47,0x6f,0x5e,0xad,0xad,0x35,0x3e,0x3f,0x36,0x03,0x49,0xfd,0x80,0xca,0x70,0x70,0x3c,0x47,0x47,0x01,0xab,0x01,0xdb,0x70,0x5f,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x56,0x66,0x52,0x3d,0x35,0x34,0x3e,0x50,0xfe,0xac,0x52,0x01,0x02,0x46,0x3b,0x3b,0x46,0x12,0x50,0x50,0x00,0x02,0xfd,0xd5,0xff,0x9c,0x02,0x1c,0x02,0xe4,0x00,0x27, +0x00,0x31,0x00,0x7a,0xb5,0x19,0x01,0x07,0x03,0x01,0x4c,0x4b,0xb0,0x21,0x50,0x58,0x40,0x26,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x05,0x08,0x01,0x00,0x05,0x00,0x63,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x3b,0x07,0x4e,0x1b,0x40,0x24,0x00,0x03,0x00,0x07,0x06, +0x03,0x07,0x69,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x05,0x08,0x01,0x00,0x05,0x00,0x63,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x04,0x4e,0x59,0x40,0x1b,0x29,0x28,0x01,0x00,0x2e,0x2c,0x28,0x31,0x29,0x31,0x26,0x24,0x1f,0x1d,0x17,0x15,0x10,0x0e,0x09,0x07,0x00,0x27,0x01,0x27,0x0a,0x09,0x16,0x2b,0x05,0x22, +0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x15,0x01,0x32,0x35,0x35,0x34,0x23,0x22,0x15,0x15,0x14,0xfe,0xed,0x55,0x7e,0x45,0x90,0x7e,0x75,0x80,0x56,0x4a,0x49,0x57,0x46,0x40,0x29, +0x36,0x09,0x02,0x56,0x4f,0x5a,0x64,0x6b,0x5d,0x03,0x2f,0xfd,0x1c,0x50,0x50,0x50,0x64,0x47,0x83,0x58,0x01,0x04,0x87,0x9b,0x7d,0x73,0xe2,0x4e,0x5b,0x56,0x49,0x74,0x4a,0x51,0x20,0x1c,0x23,0x4d,0x53,0x74,0x68,0xfe,0xfc,0x64,0x73,0x4b,0x01,0x10,0x5c,0x75,0x5b,0x5c,0x74,0x5c,0x00,0x00,0x00,0x04,0xfd,0xc6,0xff,0xf7,0x02,0x62, +0x02,0xe4,0x00,0x24,0x00,0x45,0x00,0x51,0x00,0x5d,0x00,0xcc,0x40,0x0b,0x55,0x49,0x42,0x21,0x1e,0x1b,0x06,0x0d,0x0e,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x41,0x0a,0x01,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x08,0x01,0x01,0x10,0x01,0x0e,0x0d,0x01,0x0e,0x69,0x0b,0x01,0x04,0x04,0x02,0x61,0x09,0x01,0x02,0x02,0x3e,0x4d,0x00, +0x05,0x05,0x00,0x61,0x0c,0x12,0x07,0x06,0x11,0x05,0x00,0x00,0x3f,0x4d,0x14,0x0f,0x13,0x03,0x0d,0x0d,0x00,0x61,0x0c,0x12,0x07,0x06,0x11,0x05,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x3b,0x0a,0x01,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x08,0x01,0x01,0x10,0x01,0x0e,0x0d,0x01,0x0e,0x69,0x0b,0x01,0x04,0x04,0x02,0x61,0x09,0x01,0x02, +0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f,0x0c,0x01,0x06,0x06,0x39,0x4d,0x14,0x0f,0x13,0x03,0x0d,0x0d,0x00,0x61,0x12,0x07,0x11,0x03,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x35,0x53,0x52,0x47,0x46,0x26,0x25,0x01,0x00,0x58,0x56,0x52,0x5d,0x53,0x5d,0x4c,0x4a,0x46,0x51,0x47,0x51,0x41,0x40,0x3b,0x39,0x37,0x36,0x33,0x31,0x2c,0x2b, +0x25,0x45,0x26,0x45,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x15,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x21,0x22,0x26, +0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23,0x27,0x07,0x06,0x06,0x25,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xd2,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37, +0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63,0x61,0x2b,0x22,0x53,0xfd,0x86,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0x02,0x28,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0xfd,0xe3,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b, +0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b, +0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x00,0x06,0xfb,0x73,0xff,0xf7,0x02,0x5d,0x02,0xe4,0x00,0x24,0x00,0x45,0x00,0x66,0x00,0x72,0x00,0x7e,0x00,0x8a,0x00,0xfd,0x40,0x0d,0x82,0x76,0x6a,0x63,0x42,0x21,0x1e,0x1b,0x08,0x13,0x14,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x4e,0x10,0x0a,0x02,0x03,0x04,0x01,0x04,0x03,0x01,0x80, +0x0e,0x08,0x02,0x01,0x18,0x16,0x02,0x14,0x13,0x01,0x14,0x69,0x11,0x0b,0x02,0x04,0x04,0x02,0x61,0x0f,0x09,0x02,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x00,0x61,0x12,0x1b,0x0d,0x0c,0x1a,0x07,0x06,0x19,0x08,0x00,0x00,0x3f,0x4d,0x1e,0x17,0x1d,0x15,0x1c,0x05,0x13,0x13,0x00,0x61,0x12,0x1b,0x0d,0x0c,0x1a,0x07,0x06,0x19,0x08,0x00, +0x00,0x3f,0x00,0x4e,0x1b,0x40,0x45,0x10,0x0a,0x02,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x0e,0x08,0x02,0x01,0x18,0x16,0x02,0x14,0x13,0x01,0x14,0x69,0x11,0x0b,0x02,0x04,0x04,0x02,0x61,0x0f,0x09,0x02,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f,0x12,0x0c,0x02,0x06,0x06,0x39,0x4d,0x1e,0x17,0x1d,0x15,0x1c,0x05,0x13,0x13,0x00, +0x61,0x1b,0x0d,0x1a,0x07,0x19,0x05,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x4d,0x80,0x7f,0x74,0x73,0x68,0x67,0x47,0x46,0x26,0x25,0x01,0x00,0x85,0x83,0x7f,0x8a,0x80,0x8a,0x79,0x77,0x73,0x7e,0x74,0x7e,0x6d,0x6b,0x67,0x72,0x68,0x72,0x62,0x61,0x5c,0x5a,0x58,0x57,0x54,0x52,0x4d,0x4c,0x46,0x66,0x47,0x66,0x41,0x40,0x3b,0x39,0x37, +0x36,0x33,0x31,0x2c,0x2b,0x25,0x45,0x26,0x45,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x1f,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07, +0x06,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23,0x27,0x07,0x06,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23, +0x27,0x07,0x06,0x06,0x25,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xcd,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63, +0x61,0x2b,0x22,0x53,0xfb,0x38,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0x02,0x22,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0xfd,0x8c,0x39,0x28,0x34,0x7d,0x1e,0x2f, +0x37,0x3b,0x02,0x7f,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x02,0x7f,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55, +0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b, +0x00,0x03,0xfd,0xd5,0xff,0xf7,0x02,0x1c,0x02,0xe4,0x00,0x26,0x00,0x32,0x00,0x36,0x00,0xbc,0x40,0x0f,0x1b,0x01,0x0a,0x09,0x2a,0x20,0x02,0x0b,0x0a,0x23,0x01,0x08,0x0b,0x03,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x39,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x05,0x00,0x06,0x09,0x05,0x06,0x67,0x00,0x01,0x00,0x09,0x0a,0x01, +0x09,0x69,0x00,0x0a,0x0e,0x01,0x0b,0x08,0x0a,0x0b,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x0d,0x01,0x08,0x08,0x00,0x61,0x07,0x0c,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x3d,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x05,0x00,0x06,0x09,0x05,0x06,0x67,0x00,0x01,0x00,0x09,0x0a,0x01,0x09,0x69,0x00,0x0a, +0x0e,0x01,0x0b,0x08,0x0a,0x0b,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0d,0x01,0x08,0x08,0x00,0x61,0x0c,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x27,0x33,0x33,0x28,0x27,0x01,0x00,0x33,0x36,0x33,0x36,0x35,0x34,0x2d,0x2b,0x27,0x32,0x28,0x32,0x22,0x21,0x1f,0x1e,0x1d,0x1c,0x16,0x14, +0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x26,0x01,0x26,0x0f,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x21,0x15,0x21,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x27,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14, +0x16,0x25,0x35,0x21,0x15,0xfe,0x93,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0xbf,0x01,0xfb,0xfe,0x2a,0xb4,0x91,0x63,0x61,0x2b,0x22,0x53,0x26,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x01,0xd9,0x01,0xdb,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55, +0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0xef,0x50,0xdd,0xbd,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x62,0x50,0x50,0x00,0x01,0xfe,0xa7,0xff,0xab,0x01,0xa4,0x02,0xee,0x00,0x07,0x00,0x47,0x4b,0xb0,0x18,0x50,0x58,0x40,0x14,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x03,0x00,0x5f,0x00, +0x00,0x00,0x38,0x03,0x4e,0x1b,0x40,0x19,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfe,0xa7,0x5a,0x02,0xa3,0xfd,0x5d, +0x55,0x03,0x43,0xfe,0x84,0x50,0xfe,0x89,0x00,0x01,0xfb,0xd2,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x12,0x00,0x33,0x40,0x30,0x0a,0x01,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x12,0x00,0x12, +0x23,0x12,0x14,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x11,0x33,0x15,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x15,0xfb,0xd2,0x5a,0x05,0x5b,0x04,0x08,0x05,0xba,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfa,0xa5,0x23,0x02,0x4e,0xff,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0xff, +0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0xbd,0x03,0x3e,0x00,0x24,0x00,0x28,0x00,0x43,0x40,0x40,0x09,0x01,0x04,0x03,0x01,0x4c,0x06,0x01,0x02,0x00,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x25,0x25,0x00,0x00, +0x25,0x28,0x25,0x28,0x27,0x26,0x00,0x24,0x00,0x23,0x21,0x25,0x21,0x2c,0x21,0x0a,0x09,0x1b,0x2b,0x07,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x23,0x21,0x11,0x33,0x11,0x37,0x73,0x2f,0x32, +0x02,0x0a,0x03,0x36,0x31,0x32,0x35,0x03,0x0a,0x02,0x32,0x2f,0x73,0x73,0x59,0x65,0x05,0x0a,0x03,0x26,0x41,0x6e,0x6e,0x40,0x27,0x03,0x0a,0x05,0x65,0x59,0xfe,0x7f,0x5a,0x6e,0x50,0x2b,0x2b,0xa4,0x39,0x4a,0x09,0x09,0x4a,0x39,0xa4,0x2b,0x2b,0x50,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x03,0xac,0xfc,0x54,0x00, +0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08, +0x09,0x19,0x2b,0x07,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x11,0x33,0x11,0x3c,0x01,0x27,0xfe,0xd9,0x01,0x81,0xfd,0x76,0x5a,0x6e,0x50,0x03,0x0c,0x50,0xfc,0x54,0x03,0xac,0xfc,0x54,0xff,0xff,0xfe,0xe3,0xff,0x92,0x01,0x1d,0x03,0x3e,0x00,0x26,0x05,0xbe,0xc4,0x00,0x00,0x07,0x05,0xbe,0xfd,0xe4,0x00,0x00,0x00,0x02,0xfc,0xa4, +0xff,0xab,0x01,0x72,0x02,0xee,0x00,0x07,0x00,0x0b,0x00,0x56,0x4b,0xb0,0x18,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x07,0x05,0x06,0x03,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x00,0x38,0x03,0x4e,0x1b,0x40,0x1d,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x00,0x00, +0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x59,0x40,0x14,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0xfe,0x52,0x5a,0x02,0xc6,0xfd,0x3a,0xfd,0xf8,0x5a,0x55,0x03,0x43,0xfe,0x84,0x50,0xfe,0x89, +0x03,0x43,0xfc,0xbd,0x00,0x03,0xfc,0xc7,0xff,0x92,0x00,0xe1,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x04,0x02,0x02,0x00,0x01,0x00,0x85,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09, +0x06,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x87,0x5a,0xfb,0xe6,0x5a,0x01,0x86,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x00,0x04,0xfa,0xc9,0xff,0xab,0x00,0xd2,0x02,0xee,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x5f,0x40,0x0a,0x16,0x12,0x0e,0x0c,0x0b,0x05, +0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x12,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x19,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x59,0x40,0x1a,0x08,0x08,0x04,0x04, +0x00,0x00,0x08,0x0d,0x08,0x0d,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfc,0x77,0x5a,0xfd,0xf8,0x5a,0x03,0x02,0x5a,0x02,0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a, +0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e,0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x02,0xfc,0xa4,0xff,0xab,0x01,0x72,0x02,0xee,0x00,0x0b,0x00,0x0f,0x00,0x68,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00, +0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x09,0x07,0x08,0x03,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x00,0x38,0x05,0x4e,0x1b,0x40,0x25,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x59,0x40, +0x16,0x0c,0x0c,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x33,0x11,0xfe,0x52,0x5a,0x02,0xc6,0xfd,0x3a,0x02,0xc6,0xfd,0x3a,0xfd,0xf8,0x5a,0x55,0x03,0x43,0xfe,0xfc,0x50,0xa0,0x50,0xff,0x03, +0x43,0xfc,0xbd,0x00,0x00,0x03,0xfc,0xd6,0xff,0xab,0x01,0x31,0x02,0xee,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x50,0x40,0x0a,0x12,0x0e,0x0a,0x08,0x07,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x05,0x03,0x04,0x03,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x15,0x02,0x01,0x00,0x01,0x01, +0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x59,0x40,0x12,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x21,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfc,0xd6,0x5a,0x01,0x54,0x5a,0x02, +0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a,0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e,0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x01,0xfe,0xa7,0xff,0xab,0x01,0xa4,0x02,0xee,0x00,0x0b,0x00,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1c,0x00,0x01,0x00,0x02,0x03,0x01,0x02, +0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x05,0x4e,0x1b,0x40,0x21,0x00,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b, +0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0xfe,0xa7,0x5a,0x02,0xa3,0xfd,0x5d,0x02,0xa3,0xfd,0x5d,0x55,0x03,0x43,0xfe,0xfc,0x50,0xa0,0x50,0xff,0x00,0x00,0x02,0xfb,0xd2,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0c,0x00,0x17,0x00,0x40,0x40,0x3d,0x12,0x07, +0x02,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x17,0x16,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x09,0x09,0x1b,0x2b,0x25,0x11,0x33,0x15, +0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x15,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0xfb,0xd2,0x5a,0x04,0xfb,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x05,0x05,0x3b,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfa,0xc6,0x23,0x02,0x4e,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19, +0x14,0x00,0x00,0x00,0x00,0x02,0xfe,0xbb,0xff,0xab,0x01,0x68,0x02,0xee,0x00,0x05,0x00,0x0e,0x00,0x41,0x40,0x0a,0x0e,0x0a,0x06,0x04,0x03,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01, +0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x03,0x09,0x17,0x2b,0x05,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfe,0xbb,0x5a,0x02,0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a,0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e, +0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x03,0xfe,0x13,0xff,0x74,0x01,0xf9,0x03,0x66,0x00,0x2d,0x00,0x34,0x00,0x3c,0x00,0x36,0x40,0x33,0x3c,0x32,0x31,0x25,0x24,0x1d,0x17,0x16,0x13,0x10,0x09,0x0b,0x00,0x01,0x35,0x2c,0x19,0x18,0x08,0x01,0x06,0x02,0x00,0x02,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03, +0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x2d,0x00,0x2d,0x1c,0x14,0x04,0x09,0x18,0x2b,0x05,0x35,0x26,0x26,0x27,0x33,0x14,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14, +0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0xfe,0xde,0x5e,0x6b,0x02,0x5a,0x3b,0x36,0x1b,0x4b,0x51,0x63,0x54,0x3c,0x44,0x4d,0x02,0x4e,0xfe,0x61,0x01,0x27,0x13,0x20,0x08,0x09,0x21,0x11,0xfe,0x0d,0x26,0x35,0x19,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x2f,0x2c,0x0c,0x8c,0x83, +0x08,0x69,0x56,0x31,0x3e,0x07,0x01,0x06,0x08,0x17,0x6c,0x49,0x50,0x68,0x08,0x84,0x84,0x08,0x28,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09,0x01,0x08,0x14,0x14,0x02,0xf8,0x0d,0x17,0x6e,0x4a,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x42,0x0d,0x04,0x00,0x00, +0x00,0x01,0xfe,0x20,0x00,0x5f,0x01,0xe0,0x02,0x35,0x00,0x13,0x00,0x5a,0x4b,0xb0,0x21,0x50,0x58,0x40,0x1a,0x05,0x03,0x02,0x01,0x08,0x06,0x02,0x00,0x07,0x01,0x00,0x67,0x0a,0x09,0x02,0x07,0x07,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x07,0x4e,0x1b,0x40,0x20,0x04,0x01,0x02,0x01,0x07,0x02,0x57,0x05,0x03,0x02,0x01,0x08,0x06,0x02, +0x00,0x07,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x07,0x5f,0x0a,0x09,0x02,0x07,0x02,0x07,0x4f,0x59,0x40,0x12,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x21,0x15,0xfe,0xdf,0xbf,0xbf, +0x58,0x01,0x92,0x58,0xbf,0xbf,0x58,0xfe,0x6e,0x5f,0xc3,0x50,0xc3,0xc3,0xc3,0xc3,0x50,0xc3,0xc3,0xc3,0x00,0x01,0xfb,0xff,0x00,0x5f,0x01,0xa9,0x02,0x35,0x00,0x1b,0x00,0x6b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x1e,0x07,0x05,0x03,0x03,0x01,0x0c,0x0a,0x08,0x03,0x00,0x09,0x01,0x00,0x67,0x0e,0x0d,0x0b,0x03,0x09,0x09,0x02,0x5f,0x06, +0x04,0x02,0x02,0x02,0x3b,0x09,0x4e,0x1b,0x40,0x25,0x06,0x04,0x02,0x02,0x01,0x09,0x02,0x57,0x07,0x05,0x03,0x03,0x01,0x0c,0x0a,0x08,0x03,0x00,0x09,0x01,0x00,0x67,0x06,0x04,0x02,0x02,0x02,0x09,0x5f,0x0e,0x0d,0x0b,0x03,0x09,0x02,0x09,0x4f,0x59,0x40,0x1a,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x09,0x1f,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x21,0x15,0x23,0x35,0x21,0x15,0xfc,0xbe,0xbf,0xbf,0x58,0x01,0x92,0x58,0x01,0x92,0x58,0xbf,0xbf,0x58,0xfe,0x6e,0x58,0xfe,0x6e,0x5f,0xc3,0x50,0xc3, +0xc3,0xc3,0xc3,0xc3,0xc3,0x50,0xc3,0xc3,0xc3,0xc3,0xc3,0x00,0x00,0x02,0xfd,0xda,0x00,0x2d,0x02,0x12,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x3e,0x40,0x3b,0x17,0x16,0x15,0x03,0x01,0x02,0x11,0x01,0x00,0x01,0x18,0x0d,0x0c,0x03,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67, +0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0xfe,0xcb,0xf1,0xf1,0x58,0xf1,0xf1,0x01,0x41,0x01,0x36,0x13,0x21, +0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0x2d,0xf5,0x50,0xf5,0xf5,0x50,0xf5,0x14,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x04,0xfe,0x2a,0x00,0x64,0x01,0xae,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x6f,0x4b,0xb0,0x18,0x50,0x58,0x40,0x22,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x06,0x04, +0x05,0x06,0x57,0x07,0x01,0x05,0x09,0x01,0x04,0x05,0x04,0x65,0x02,0x08,0x02,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01,0x4e,0x1b,0x40,0x24,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x07,0x00,0x06,0x04,0x07,0x06,0x67,0x00,0x05,0x09,0x01,0x04,0x05,0x04,0x65,0x08,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e, +0x59,0x40,0x1b,0x11,0x10,0x01,0x00,0x1f,0x1e,0x1d,0x1c,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0f,0x0e,0x0d,0x0c,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0a,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x21,0x35,0x21,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x21,0x35,0x21,0x01, +0x5e,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfe,0xce,0xfd,0xda,0x02,0x26,0x01,0x0e,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfe,0xce,0xfd,0xda,0x02,0x26,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0xfe,0x7a,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x46,0x50,0x00,0x00,0x00,0x00,0x06,0xfb,0xa0,0x00,0x64,0x02,0x08, +0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x97,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2a,0x04,0x01,0x02,0x00,0x00,0x02,0x57,0x11,0x0b,0x10,0x03,0x09,0x06,0x07,0x09,0x57,0x0a,0x08,0x02,0x07,0x0f,0x01,0x06,0x07,0x06,0x65,0x0e,0x05,0x0d,0x03,0x0c,0x05,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01, +0x4e,0x1b,0x40,0x2c,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x00,0x02,0x03,0x67,0x0a,0x01,0x08,0x11,0x0b,0x10,0x03,0x09,0x06,0x08,0x09,0x67,0x00,0x07,0x0f,0x01,0x06,0x07,0x06,0x65,0x0c,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x33,0x24,0x24,0x20,0x20,0x15,0x14,0x10,0x10,0x0c,0x0c,0x01,0x00,0x24, +0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x22,0x21,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x12,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34, +0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0xfe,0xd4,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xef,0x02,0x21,0xf9,0x98,0x02,0x21,0x01,0x13,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfc,0xa8,0x02,0x21,0x02,0x26,0x02,0x21,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0x50,0x50,0x50,0xfe, +0xca,0x2c,0x24,0x25,0x2b,0x2b,0x25,0x24,0x2c,0x46,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x06,0xfb,0xa0,0xff,0xfb,0x02,0x08,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x21,0x00,0x64,0x40,0x61,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x06,0x02,0x03,0x67,0x08,0x01,0x06,0x10,0x09,0x0f,0x03,0x07,0x0b,0x06, +0x07,0x67,0x0c,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x0b,0x0b,0x0a,0x61,0x11,0x01,0x0a,0x0a,0x42,0x0a,0x4e,0x15,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x1c,0x19,0x14,0x21,0x15,0x20,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04, +0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0xab,0x0c,0x6a,0x0c,0xea,0x02,0x21,0xf9,0x98,0x02,0x21,0xfd,0xdf,0x02,0x21,0x02,0x26, +0x02,0x21,0xfc,0xbd,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x00,0x00,0x02,0xfd,0xf8,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02, +0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xfd,0xf8,0x04,0x10,0xfb,0xf0,0x04,0x10,0x01,0x9a,0x50,0x50,0xf0,0x50,0x50,0x00,0x00, +0x00,0x03,0xfb,0xa5,0x00,0x4c,0x02,0x03,0x02,0x48,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x40,0x40,0x3d,0x00,0x00,0x06,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08, +0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xfb,0xa5,0x06,0x5e,0xf9,0xa2,0x06,0x5e,0xf9,0xa2,0x06,0x5e,0x01,0xfc,0x4c,0x4c,0xd8,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x01,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13, +0x00,0x6c,0xb6,0x12,0x08,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01, +0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x37,0x21,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33, +0x13,0x03,0xbc,0x6b,0xfa,0x7e,0x05,0xc2,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfa,0x3f,0x05,0x82,0x6b,0x6a,0xe7,0xe8,0x23,0x87,0x50,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13,0x00,0x6c,0xb6,0x12,0x08,0x02,0x01,0x02, +0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02, +0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x37,0x21,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0xbc,0x6b,0xfc,0xd6,0x03,0x6a, +0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfc,0x97,0x03,0x2a,0x6b,0x6a,0xe7,0xe8,0x23,0x87,0x50,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13,0x00,0x1f,0x00,0x47,0x40,0x44,0x1e,0x18,0x12,0x08,0x04,0x01,0x02,0x01,0x4c,0x06, +0x01,0x04,0x03,0x05,0x04,0x57,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1d,0x1c,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x27,0x37,0x21,0x35,0x21, +0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x33,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x70,0x6b,0xfb,0xaa,0x04,0x96,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfb,0x6b,0x04,0x56,0x6b,0x6a,0xe7,0xe8,0xc3,0xbe,0x13,0x1a,0x05,0x05,0x1c,0x15,0xba,0x6a,0xe7,0xe8,0x23,0x87,0x50, +0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0f,0x00,0x17,0x00,0x47,0x40,0x44,0x15,0x11,0x0d,0x05,0x04,0x01,0x02,0x01,0x4c,0x06,0x01,0x04,0x03,0x05,0x04,0x57,0x00,0x03, +0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x4f,0x10,0x10,0x00,0x00,0x10,0x17,0x10,0x17,0x13,0x12,0x00,0x0f,0x00,0x0f,0x11,0x11,0x12,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x37,0x27,0x21,0x35,0x21,0x27,0x37,0x21,0x35,0x21,0x37,0x33,0x07, +0x07,0x17,0x17,0x33,0x03,0x13,0x33,0x07,0x07,0x17,0x17,0x72,0x6a,0xfb,0x9d,0x04,0x25,0x3f,0x3f,0xfb,0xdb,0x04,0x64,0x6a,0x69,0xbe,0x2e,0x32,0xba,0xae,0xe7,0xe8,0x69,0xbe,0x2e,0x32,0xba,0x23,0x87,0x50,0x50,0x50,0x50,0x87,0xef,0x37,0x3d,0xeb,0x01,0x27,0x01,0x27,0xef,0x37,0x3d,0xeb,0x00,0x01,0xfb,0xa1,0x00,0x00,0x02,0x09, +0x02,0x99,0x00,0x13,0x00,0x35,0x40,0x32,0x00,0x04,0x03,0x04,0x85,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x68,0x07,0x01,0x01,0x08,0x01,0x00,0x09,0x01,0x00,0x67,0x0a,0x01,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x21,0x37,0x21,0x35,0x21, +0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0xfe,0x53,0x3e,0xfd,0x10,0x03,0x0e,0x3a,0xfc,0xb8,0x03,0x66,0x40,0x48,0x40,0x02,0xba,0xfd,0x28,0x3a,0x03,0x12,0xfc,0xd0,0x3e,0xaa,0x50,0xa0,0x50,0xaf,0xaf,0x50,0xa0,0x50,0xaa,0x00,0x00,0x00,0x01,0xfe,0x0c,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0e, +0x00,0x2e,0x40,0x2b,0x04,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x11,0x18,0x05,0x09,0x19,0x2b,0x25,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x17,0x21,0x15,0x21,0x07,0xfe, +0x0c,0xbe,0x13,0x1a,0x05,0x05,0x1c,0x15,0xba,0x6a,0xc8,0x02,0xc5,0xfd,0x3b,0xc9,0x23,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xff,0x50,0xff,0x00,0x01,0xfb,0xb3,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x19,0x00,0x34,0x40,0x31,0x11,0x04,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01, +0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x19,0x00,0x19,0x23,0x12,0x14,0x11,0x18,0x07,0x09,0x1b,0x2b,0x25,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x17,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x07,0xfb,0xb3,0xbe,0x13,0x1a,0x05,0x05,0x1d, +0x14,0xba,0x6a,0xc8,0x04,0xa1,0x04,0x07,0x05,0xba,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfb,0x5e,0xc9,0x23,0xef,0x17,0x1c,0x04,0x05,0x1e,0x1a,0xeb,0xff,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0xff,0xff,0xff,0xfe,0x61,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x27,0x04,0x1b,0xfe,0x0c,0x00,0x0f,0x01,0x06, +0x03,0x48,0xce,0x00,0x00,0x08,0xb1,0x00,0x01,0xb0,0x0f,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfe,0x89,0x00,0x2d,0x01,0x7f,0x02,0x67,0x00,0x27,0x04,0x1b,0xfe,0x34,0x00,0x00,0x03,0x06,0x03,0x2b,0x00,0x37,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0x00,0x02,0xfe,0xcf,0xff,0xb6,0x01,0x31,0x02,0xbc,0x00,0x0d, +0x00,0x11,0x00,0x08,0xb5,0x10,0x0e,0x0b,0x00,0x02,0x32,0x2b,0x25,0x35,0x25,0x36,0x36,0x37,0x35,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x25,0x15,0xfe,0xcf,0x01,0xea,0x11,0x1f,0x07,0x07,0x1f,0x11,0xfe,0x16,0x02,0x62,0xfd,0x9e,0x02,0x62,0x96,0x5a,0xa8,0x06,0x06,0x01,0x07,0x01,0x06,0x06,0xab,0x58,0xe1,0x64,0xfe,0x3f, +0x5a,0xe1,0x5a,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x19,0x00,0x42,0x40,0x3f,0x19,0x13,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03, +0x00,0x03,0x4f,0x00,0x00,0x18,0x17,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x07,0x37,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x17,0xfb,0xb3,0xeb,0xeb,0x6a,0x6a,0x04,0xa0,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x5f, +0x6a,0xa9,0x04,0xa2,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfb,0x5f,0x3f,0x23,0x01,0x26,0x01,0x28,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x00,0x00,0xff,0xff,0xfe,0x2a,0x00,0x40,0x01,0xd7,0x02,0x53,0x00,0x26,0x04,0x1b,0xd4,0x00,0x01,0x07,0x04,0x1b,0xfd,0xd5,0xff,0xff, +0x00,0x09,0xb1,0x01,0x01,0xb8,0xff,0xff,0xb0,0x35,0x2b,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x08,0x00,0x0e,0x00,0x3c,0x40,0x39,0x0d,0x0a,0x01,0x03,0x02,0x01,0x01,0x4c,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03, +0x00,0x03,0x4f,0x09,0x09,0x00,0x00,0x09,0x0e,0x09,0x0e,0x0c,0x0b,0x00,0x08,0x00,0x08,0x11,0x11,0x12,0x08,0x09,0x19,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x15,0x21,0x07,0x21,0x13,0x03,0x33,0x13,0x03,0xfc,0xdf,0xeb,0xeb,0x6a,0xc8,0x03,0xf2,0xfc,0x0e,0xc9,0xfe,0x6b,0xeb,0xeb,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x01,0x28,0xff,0x50, +0xff,0x01,0x26,0x01,0x28,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x47,0x40,0x44,0x12,0x0f,0x08,0x01,0x04,0x03,0x02,0x01,0x4c,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01, +0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x0e,0x0e,0x00,0x00,0x0e,0x13,0x0e,0x13,0x11,0x10,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x0a,0x09,0x1b,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x15,0x21,0x17,0x07,0x21,0x15,0x21,0x07,0x21,0x13,0x03,0x33,0x13,0x03,0xfc,0xdf,0xeb,0xeb,0x6a,0x6a,0x04,0x50,0xfb, +0xee,0x3f,0x3f,0x04,0x12,0xfb,0xaf,0x6a,0xfe,0x6b,0xeb,0xeb,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x01,0x28,0x87,0x50,0x50,0x50,0x50,0x87,0x01,0x26,0x01,0x28,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0xff,0xff,0xfc,0x6d,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x27,0x04,0x1b,0xfc,0x18,0x00,0x00,0x00,0x27,0x04,0x1b,0xfe,0x0c,0x00,0x00,0x02,0x06, +0x04,0x1b,0x00,0x00,0x00,0x01,0xfd,0xf3,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0e,0x00,0x30,0x40,0x2d,0x01,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x23,0x12,0x05,0x09, +0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x17,0x17,0xfe,0xda,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0x03,0x7b,0xfc,0x86,0x04,0x08,0x04,0xba,0x23,0x01,0x27,0x01,0x27,0xef,0x04,0x08,0x04,0x50,0x04,0x0b,0x05,0xeb,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0e,0x00,0x30,0x40,0x2d, +0x01,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x23,0x12,0x05,0x09,0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x17,0x17,0xfc,0x82,0xe7, +0xe8,0x69,0xbe,0x03,0x07,0x03,0x05,0xe2,0xfa,0x1a,0x05,0x0a,0x06,0xba,0x23,0x01,0x27,0x01,0x27,0xef,0x04,0x08,0x04,0x4b,0x05,0x0d,0x07,0xeb,0x00,0x01,0xfb,0x9b,0x00,0x23,0x01,0xd6,0x02,0x71,0x00,0x0c,0x00,0x33,0x40,0x30,0x09,0x01,0x02,0x05,0x01,0x4c,0x04,0x01,0x00,0x05,0x01,0x00,0x57,0x06,0x01,0x05,0x00,0x02,0x01,0x05, +0x02,0x68,0x04,0x01,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x0c,0x00,0x0c,0x12,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x01,0x35,0x33,0x11,0x23,0x35,0x21,0x17,0x23,0x03,0x13,0x33,0x07,0x01,0x7c,0x5a,0x5a,0xfa,0xa6,0xca,0x6a,0xe7,0xe8,0x69,0xcb,0x01,0x72,0xff,0xfd,0xb2,0xff,0xff,0x01,0x27,0x01, +0x27,0xff,0x00,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x35,0x40,0x32,0x08,0x01,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12, +0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0xfc,0x82,0xe7,0xe8,0x69,0xcb,0x05,0x66,0xcb,0x6a,0xe7,0xe8,0x69,0xcb,0xfa,0x9b,0xca,0x23,0x01,0x27,0x01,0x27,0xff,0xff,0xfe,0xd9,0xfe,0xd9,0xff,0xff,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0d, +0x00,0x34,0x40,0x31,0x08,0x01,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x37,0x33,0x03,0x13, +0x23,0x27,0x21,0x17,0xfc,0x82,0xe7,0xe8,0x69,0xcb,0x04,0xa1,0xc9,0x69,0xe7,0xe7,0x6a,0xc8,0xfb,0x60,0xca,0x23,0x01,0x27,0x01,0x27,0xff,0xff,0xfe,0xda,0xfe,0xd8,0xff,0xff,0x00,0x00,0xff,0xff,0xfe,0x89,0x00,0x2d,0x01,0x7f,0x02,0x67,0x00,0x27,0x04,0x1c,0xfe,0x34,0x00,0x00,0x03,0x06,0x03,0x2b,0x00,0x37,0x00,0x08,0xb1,0x01, +0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfb,0xcd,0x00,0x2d,0x01,0xa9,0x02,0x67,0x00,0x27,0x04,0x1c,0xfb,0x78,0x00,0x00,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x01,0x06,0x04,0x1c,0xa6,0x00,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0x00,0x04,0xf9,0x43,0xff,0xfb,0x02,0x03,0x02,0xda,0x00,0x03, +0x00,0x10,0x00,0x14,0x00,0x22,0x00,0x62,0x40,0x5f,0x05,0x01,0x04,0x03,0x01,0x4c,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x80,0x0b,0x01,0x05,0x09,0x08,0x09,0x05,0x08,0x80,0x06,0x01,0x03,0x0c,0x07,0x02,0x04,0x01,0x03,0x04,0x68,0x0a,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x09,0x09,0x08,0x61,0x0d,0x01,0x08,0x08, +0x42,0x08,0x4e,0x16,0x15,0x11,0x11,0x04,0x04,0x00,0x00,0x1d,0x1a,0x15,0x22,0x16,0x21,0x11,0x14,0x11,0x14,0x13,0x12,0x04,0x10,0x04,0x10,0x0d,0x0c,0x0b,0x0a,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x0e,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x05,0x03,0x13,0x33,0x07,0x06,0x07,0x21,0x15,0x21,0x16,0x17,0x17,0x25,0x35,0x21,0x15,0x01, +0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfc,0x53,0x0c,0x6a,0x0c,0xfd,0x85,0xe7,0xe8,0x69,0xbe,0x07,0x06,0x01,0xeb,0xfe,0x16,0x08,0x08,0xba,0x02,0xb0,0x04,0xbf,0xfa,0x6a,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xb4,0x01,0x27,0x01,0x27,0xef,0x08,0x08,0x50,0x0a,0x0a, +0xeb,0xff,0x50,0x50,0xfe,0xd9,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0xff,0xff,0xfd,0xee,0x00,0x41,0x02,0x20,0x02,0x6c,0x00,0x27,0x04,0x1c,0xfd,0x99,0x00,0x00,0x00,0x06,0x03,0x34,0xec,0x00,0xff,0xff,0xfb,0xb4,0x00,0x41,0x01,0xf4,0x02,0x6c,0x00,0x27,0x04,0x1c,0xfb,0x5f,0x00,0x00,0x00,0x26,0x04,0x1b,0xf1,0x00, +0x00,0x07,0x03,0x34,0xfd,0xa8,0x00,0x00,0x00,0x02,0xfe,0x98,0xff,0xab,0x01,0x45,0x02,0xee,0x00,0x05,0x00,0x0e,0x00,0x41,0x40,0x0a,0x0b,0x07,0x06,0x02,0x01,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57, +0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x05,0x00,0x05,0x13,0x03,0x09,0x17,0x2b,0x17,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16,0x17,0xeb,0xfd,0xad,0x02,0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68, +0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x03,0xfc,0x77,0xff,0xab,0x00,0xd2,0x02,0xee,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x50,0x40,0x0a,0x0f,0x0b,0x0a,0x06,0x05,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x05,0x03,0x04,0x03,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x01,0x4e, +0x1b,0x40,0x15,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x59,0x40,0x12,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x08,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16, +0x17,0x78,0x5a,0xfd,0xf8,0xfd,0xad,0x02,0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x03,0x43,0xfc,0xbd,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68,0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x04,0xfa,0x7e,0xff,0xab,0x00,0x87,0x02,0xee,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x5f, +0x40,0x0a,0x13,0x0f,0x0e,0x0a,0x09,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x12,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x19,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01, +0x4f,0x59,0x40,0x1a,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0c,0x0b,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16,0x17,0x2d,0x5a,0xfd,0xf8,0x5a,0xfd,0xf8,0xfd,0xad,0x02, +0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfc,0xbd,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68,0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x03,0xfb,0xe6,0xff,0x92,0x01,0xc2,0x03,0x0c,0x00,0x03,0x00,0x10,0x00,0x1d,0x00,0x2a,0x40,0x27,0x1d,0x19,0x15,0x14, +0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x09,0x05,0x04,0x0e,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x37,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x35,0x01,0x15,0x01,0x01,0x35,0x01,0x15,0x01,0x06,0x06,0x07,0x16,0x16, +0x17,0x01,0xfe,0xa7,0x5a,0x6e,0x01,0xbd,0x14,0x27,0x0a,0x0a,0x27,0x14,0xfe,0x43,0x02,0x53,0xfc,0x77,0xfd,0xad,0x02,0x53,0xfe,0x43,0x13,0x26,0x0b,0x0b,0x26,0x13,0x01,0xbd,0x6e,0x03,0x7a,0xfc,0x86,0x18,0x6b,0x01,0x10,0x0c,0x15,0x04,0x05,0x16,0x0c,0x01,0x16,0x67,0xfe,0x8e,0x64,0xfe,0x91,0x01,0x6f,0x64,0x01,0x72,0x6b,0xfe, +0xeb,0x0c,0x16,0x05,0x05,0x15,0x0b,0xfe,0xee,0x00,0x00,0x00,0x00,0x03,0xfe,0x07,0xff,0x74,0x02,0x01,0x03,0x66,0x00,0x2d,0x00,0x34,0x00,0x3c,0x00,0x49,0x40,0x46,0x32,0x24,0x1d,0x1a,0x06,0x05,0x03,0x02,0x3c,0x31,0x25,0x13,0x0b,0x07,0x05,0x04,0x08,0x01,0x03,0x2c,0x01,0x04,0x00,0x03,0x4c,0x35,0x01,0x01,0x01,0x4b,0x00,0x02, +0x03,0x02,0x85,0x00,0x03,0x01,0x03,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x00,0x4e,0x00,0x00,0x00,0x2d,0x00,0x2d,0x14,0x19,0x1f,0x11,0x06,0x09,0x1a,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34, +0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x34,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x01,0x04,0x79,0x69,0xfd,0xe5,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0xc5,0x2c,0x5d,0x37,0x1b,0x4a,0x52,0x63,0x54,0x3c,0x53, +0x64,0x01,0x5a,0x31,0x2d,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x30,0x2b,0x0c,0x8c,0x83,0x04,0x2f,0xee,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0c,0x08,0xc4,0x13,0x15,0x02,0x01,0x07,0x08,0x17,0x6b,0x4a,0x50,0x68,0x08,0x84,0x83,0x08,0x68,0x52,0x2f,0x3b,0x07,0xf8,0x0d,0x17,0x6d,0x4b,0x52,0x6c, +0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x42,0x0d,0x04,0x00,0x00,0x03,0xfb,0xbe,0xff,0x74,0x01,0xea,0x03,0x66,0x00,0x37,0x00,0x3e,0x00,0x46,0x00,0x48,0x40,0x45,0x46,0x3c,0x3b,0x2f,0x2e,0x28,0x24,0x22,0x21,0x1d,0x1a,0x13,0x0b,0x07,0x06,0x05,0x04,0x11,0x01,0x02,0x23,0x01,0x00,0x01, +0x36,0x01,0x03,0x00,0x03,0x4c,0x3f,0x01,0x01,0x01,0x4b,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x00,0x4e,0x00,0x00,0x00,0x37,0x00,0x37,0x19,0x1f,0x11,0x05,0x09,0x19,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x16, +0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0xfe,0xbb,0x79,0x69,0xfd,0xe5,0x01,0xae,0xfe,0xca,0x13, +0x21,0x08,0x09,0x21,0x12,0x01,0xc5,0x2c,0x5d,0x37,0x1b,0x4a,0x52,0x63,0x54,0x3c,0x23,0x50,0x25,0x02,0x5b,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfd,0xf8,0x3f,0x34,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x30,0x2b,0x0c,0x8c,0x83,0x04,0x2f,0xee,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03, +0x0c,0x08,0xc4,0x13,0x15,0x02,0x01,0x07,0x08,0x16,0x6c,0x4a,0x50,0x67,0x08,0x85,0x85,0x04,0x19,0x13,0xfe,0xcb,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x01,0x0a,0x20,0x08,0xf8,0x0d,0x17,0x6d,0x4b,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x41,0x0e,0x04,0x00,0x00, +0x00,0x04,0xf9,0x43,0x00,0x00,0x02,0x03,0x02,0xda,0x00,0x1b,0x00,0x24,0x00,0x28,0x00,0x2c,0x00,0x7d,0x40,0x7a,0x1d,0x01,0x10,0x0f,0x01,0x4c,0x00,0x0e,0x04,0x03,0x04,0x0e,0x03,0x80,0x17,0x01,0x11,0x00,0x0b,0x00,0x11,0x0b,0x80,0x07,0x05,0x02,0x03,0x13,0x08,0x02,0x02,0x0f,0x03,0x02,0x68,0x14,0x01,0x0f,0x18,0x15,0x02,0x10, +0x01,0x0f,0x10,0x68,0x12,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x11,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x16,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x29,0x29,0x1c,0x1c,0x00,0x00,0x29,0x2c,0x29,0x2c,0x2b,0x2a,0x28,0x27,0x26,0x25,0x1c,0x24,0x1c,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17, +0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x17,0x25,0x33,0x37,0x23,0x05,0x35,0x21,0x15,0xfb,0xa3, +0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0xfe,0x41,0xe7,0xe8,0x69,0xcb,0x01,0x69,0xfe,0x98,0xca,0x01,0x87,0xa0,0x22,0xa0,0x01,0x93,0x04,0x33,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x23,0x01,0x27,0x01,0x27,0xff,0x50, +0xff,0xf0,0xb4,0xa5,0x50,0x50,0x00,0x00,0x00,0x02,0xfd,0xee,0x00,0x2d,0x02,0x26,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x3e,0x40,0x3b,0x10,0x0f,0x0e,0x03,0x01,0x02,0x14,0x01,0x00,0x01,0x18,0x0d,0x0c,0x03,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05, +0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0xdd,0xf1,0xf1,0x58,0xf1,0xf1,0xfe,0x67,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08, +0x09,0x22,0x11,0x01,0x36,0x2d,0xf5,0x50,0xf5,0xf5,0x50,0xf5,0x14,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x00,0x00,0x00,0x00,0x03,0xfb,0xb4,0x00,0x2d,0x01,0xf4,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x25,0x00,0x45,0x40,0x42,0x24,0x23,0x22,0x10,0x0f,0x0e,0x06,0x01,0x02,0x1e,0x14,0x02,0x00,0x01,0x25,0x1a, +0x19,0x18,0x0d,0x0c,0x06,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25, +0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0xfe,0xa8,0xf1,0xf1,0x58,0xf1,0xf1,0xfe,0x62,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0x02,0xe4,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0x2d,0xf5, +0x50,0xf5,0xf5,0x50,0xf5,0x14,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x00,0x02,0xfe,0xcf,0xff,0xb6,0x01,0x31,0x02,0xbc,0x00,0x0d,0x00,0x11,0x00,0x08,0xb5,0x10,0x0e,0x03,0x00,0x02,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06, +0x07,0x15,0x32,0x16,0x17,0x05,0x11,0x25,0x35,0x05,0x01,0x31,0xfd,0x9e,0x02,0x62,0xfe,0x16,0x11,0x1e,0x08,0x08,0x1e,0x11,0x01,0xea,0xfd,0x9e,0x02,0x62,0x96,0xe1,0x64,0xe1,0x5a,0xa8,0x06,0x06,0x01,0x07,0x06,0x06,0xab,0xfe,0xc7,0xe2,0x58,0xe2,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xd6,0x02,0x71,0x00,0x0c,0x00,0x11,0x00,0x40, +0x40,0x3d,0x11,0x01,0x02,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x11,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b, +0x25,0x03,0x13,0x33,0x07,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x17,0x27,0x21,0x35,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69,0x6b,0x04,0xfb,0x5a,0x5a,0xfb,0x05,0x6b,0xaa,0x05,0x3a,0xfa,0xc5,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfd,0xb2,0x87,0x87,0xd7,0xa0,0x4f,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0d, +0x00,0x6c,0xb6,0x08,0x01,0x02,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x00,0x01,0x01,0x00,0x70,0x06,0x01,0x05,0x04,0x04,0x05,0x71,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x1b,0x40,0x23,0x00,0x00,0x01,0x00,0x85,0x06,0x01, +0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x17,0xfc,0x82,0xe7,0xe8, +0x69,0x6b,0x05,0x82,0xfa,0x3e,0x3d,0x3e,0x05,0xc1,0xfa,0x7e,0x6b,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x4f,0x51,0x50,0x87,0x00,0x02,0xf9,0x43,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00, +0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00, +0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0xfa,0x2a,0xe7,0xe8,0x69,0x6b,0x06,0xfe,0x6b,0x6a,0xe7,0xe8,0x69, +0x6b,0xf9,0x02,0x6b,0xaa,0x07,0x7d,0x41,0x42,0xf8,0x83,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x4f,0x51,0x4f,0x00,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58, +0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07, +0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69, +0x6b,0x04,0xa6,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x5a,0x6b,0xaa,0x05,0x25,0x41,0x42,0xfa,0xdb,0x3e,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x4f,0x51,0x4f,0x00,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x42,0x40,0x3f,0x13,0x10,0x08,0x01,0x04,0x06, +0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21, +0x37,0x33,0x03,0x13,0x23,0x27,0x21,0x17,0x27,0x21,0x27,0x37,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69,0x6b,0x04,0xa0,0x6a,0x69,0xe8,0xe8,0x6a,0x6a,0xfb,0x61,0x6b,0xaa,0x04,0xa0,0x3f,0x3f,0xfb,0x5f,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xda,0xfe,0xd8,0x87,0x87,0xd7,0x50,0x50,0x4f,0x00,0x02,0xfe,0x34,0x00,0x28,0x01,0xcc, +0x02,0x6c,0x00,0x05,0x00,0x13,0x00,0x08,0xb5,0x0e,0x06,0x03,0x00,0x02,0x32,0x2b,0x35,0x25,0x35,0x25,0x05,0x15,0x05,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x05,0x06,0x07,0x16,0x17,0xfe,0x34,0x01,0xcc,0x01,0xcc,0xfe,0x38,0x01,0x4e,0x14,0x17,0x04,0x04,0x18,0x11,0xfe,0xab,0xfe,0xb7,0x25,0x0c,0x0c,0x25,0x28,0xf0,0x64,0xf0, +0xf0,0x64,0x91,0xaa,0x0a,0x0c,0x02,0x02,0x0a,0x09,0xb0,0xac,0x13,0x03,0x03,0x13,0xff,0xff,0xfe,0x47,0x00,0x41,0x01,0xd6,0x02,0x53,0x00,0x27,0x04,0x1c,0xfd,0xf2,0x00,0x00,0x00,0x06,0x04,0x1c,0xd3,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x08,0x00,0x0e,0x00,0x3c,0x40,0x39,0x0d,0x0a,0x01,0x03,0x02,0x01, +0x01,0x4c,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x04,0x01,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x09,0x09,0x00,0x00,0x09,0x0e,0x09,0x0e,0x0c,0x0b,0x00,0x08,0x00,0x08,0x11,0x11,0x12,0x08,0x09,0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x13,0x21,0x03,0x13, +0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0xcb,0x04,0xb6,0xfb,0x46,0xcf,0xfe,0x6a,0xe7,0xe8,0x69,0xea,0xea,0x23,0x01,0x27,0x01,0x27,0xff,0x4b,0xfe,0xfc,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xdb,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x47,0x40,0x44,0x12,0x0f,0x08,0x01,0x04,0x03, +0x02,0x01,0x4c,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x0e,0x0e,0x00,0x00,0x0e,0x13,0x0e,0x13,0x11,0x10,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x0a,0x09,0x1b,0x2b,0x25, +0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x17,0x21,0x03,0x13,0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0x6b,0x04,0x2e,0xfb,0x92,0x3f,0x40,0x04,0x6d,0xfb,0xd2,0x6b,0xfe,0x6a,0xe7,0xe8,0x69,0xe9,0xe9,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x4f,0x51,0x50,0x87,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x00, +0xff,0xff,0xfb,0xf5,0x00,0x41,0x01,0xbd,0x02,0x53,0x00,0x27,0x04,0x1c,0xfb,0xa0,0x00,0x00,0x00,0x27,0x04,0x1c,0xfd,0xad,0x00,0x00,0x00,0x06,0x04,0x1c,0xba,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x4c,0x00,0x52,0x00,0xa6,0x40,0x09,0x51,0x4e,0x4b,0x01,0x04,0x02,0x09,0x01,0x4c,0x4b,0xb0,0x0d,0x50,0x58, +0x40,0x34,0x00,0x07,0x01,0x09,0x02,0x07,0x72,0x0f,0x01,0x00,0x01,0x0e,0x00,0x57,0x05,0x03,0x02,0x01,0x0d,0x0b,0x02,0x09,0x02,0x01,0x09,0x6a,0x06,0x04,0x02,0x02,0x0c,0x0a,0x02,0x08,0x0e,0x02,0x08,0x6a,0x0f,0x01,0x00,0x00,0x0e,0x5f,0x12,0x10,0x11,0x03,0x0e,0x00,0x0e,0x4f,0x1b,0x40,0x35,0x00,0x07,0x01,0x09,0x01,0x07,0x09, +0x80,0x0f,0x01,0x00,0x01,0x0e,0x00,0x57,0x05,0x03,0x02,0x01,0x0d,0x0b,0x02,0x09,0x02,0x01,0x09,0x6a,0x06,0x04,0x02,0x02,0x0c,0x0a,0x02,0x08,0x0e,0x02,0x08,0x6a,0x0f,0x01,0x00,0x00,0x0e,0x5f,0x12,0x10,0x11,0x03,0x0e,0x00,0x0e,0x4f,0x59,0x40,0x24,0x4d,0x4d,0x00,0x00,0x4d,0x52,0x4d,0x52,0x50,0x4f,0x00,0x4c,0x00,0x4c,0x4a, +0x48,0x44,0x42,0x3e,0x3c,0x38,0x36,0x32,0x30,0x23,0x12,0x24,0x24,0x24,0x24,0x24,0x21,0x12,0x13,0x09,0x1f,0x2b,0x25,0x03,0x13,0x33,0x07,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23, +0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x23,0x07,0x13,0x21,0x03,0x13,0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0x98,0x1e,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32, +0x21,0x1b,0x1e,0x15,0x15,0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x26,0x31,0x22,0x1c,0x1e,0x15,0x5a,0x16,0xea,0xfe,0x6a,0xe7,0xe8,0x69,0xe9,0xe9,0x23,0x01,0x27,0x01,0x27,0xbf,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a, +0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1c,0xfe,0xd8,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x01,0xfd,0xf3,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x3d,0x00,0xa0,0x40,0x0b,0x3c,0x01,0x07,0x03,0x01,0x4c,0x01,0x01,0x01,0x01,0x4b,0x4b, +0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x00,0x02,0x00,0x85,0x00,0x06,0x02,0x08,0x03,0x06,0x72,0x00,0x01,0x08,0x03,0x08,0x01,0x03,0x80,0x0c,0x01,0x0b,0x07,0x0b,0x86,0x04,0x01,0x02,0x0a,0x01,0x08,0x01,0x02,0x08,0x6a,0x05,0x01,0x03,0x07,0x07,0x03,0x59,0x05,0x01,0x03,0x03,0x07,0x62,0x09,0x01,0x07,0x03,0x07,0x52,0x1b,0x40,0x38, +0x00,0x00,0x02,0x00,0x85,0x00,0x06,0x02,0x08,0x02,0x06,0x08,0x80,0x00,0x01,0x08,0x03,0x08,0x01,0x03,0x80,0x0c,0x01,0x0b,0x07,0x0b,0x86,0x04,0x01,0x02,0x0a,0x01,0x08,0x01,0x02,0x08,0x6a,0x05,0x01,0x03,0x07,0x07,0x03,0x59,0x05,0x01,0x03,0x03,0x07,0x62,0x09,0x01,0x07,0x03,0x07,0x52,0x59,0x40,0x16,0x00,0x00,0x00,0x3d,0x00, +0x3d,0x38,0x36,0x32,0x30,0x24,0x23,0x12,0x24,0x24,0x24,0x24,0x21,0x12,0x0d,0x09,0x1f,0x2b,0x25,0x03,0x13,0x33,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x02,0x07, +0x17,0xfe,0xda,0xe7,0xe8,0x69,0xeb,0x0d,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15,0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x17,0x22,0x20,0x29,0x1e,0xb6,0x23,0x01,0x27,0x01, +0x27,0xfe,0xd9,0x15,0x1f,0x1f,0x15,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x38,0x28,0x28,0x3a,0x49,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x17,0x21,0x1f,0x07,0xe6,0x00,0x00,0x00,0x00,0x03,0xfb,0xb4,0x00,0x41,0x01,0xf4,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x4d,0x00,0xa4,0x40,0x1f, +0x18,0x02,0x02,0x01,0x07,0x12,0x08,0x02,0x04,0x01,0x19,0x01,0x02,0x02,0x04,0x03,0x4c,0x17,0x16,0x04,0x03,0x04,0x03,0x4a,0x0e,0x0d,0x0c,0x00,0x04,0x00,0x49,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x2c,0x00,0x07,0x03,0x01,0x04,0x07,0x72,0x00,0x02,0x04,0x00,0x01,0x02,0x72,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01, +0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x2e,0x00,0x07,0x03,0x01,0x03,0x07,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01,0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00, +0x04,0x00,0x52,0x59,0x40,0x1b,0x1b,0x1a,0x49,0x47,0x43,0x41,0x3e,0x3d,0x3b,0x39,0x35,0x33,0x2f,0x2d,0x29,0x27,0x24,0x23,0x21,0x1f,0x1a,0x4d,0x1b,0x4d,0x0b,0x09,0x16,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x05,0x22,0x2e,0x03, +0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0xfd,0x62,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0x02,0xe4,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca, +0x01,0xae,0xfc,0x81,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x48,0x3a,0x25,0x31,0x22,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x32,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x31,0x41,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0x57,0x98,0x09, +0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x33,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x66,0x00,0xb3,0x40,0x0b,0x12,0x01,0x0a,0x04, +0x0f,0x06,0x02,0x03,0x0c,0x02,0x4c,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x02,0x04,0x02,0x85,0x00,0x0a,0x04,0x0c,0x03,0x0a,0x72,0x00,0x01,0x00,0x01,0x86,0x08,0x06,0x02,0x04,0x10,0x0e,0x02,0x0c,0x03,0x04,0x0c,0x69,0x09,0x07,0x05,0x03,0x03,0x00,0x00,0x03,0x59,0x09,0x07,0x05,0x03,0x03,0x03,0x00,0x62,0x0f,0x0d,0x0b,0x11, +0x04,0x00,0x03,0x00,0x52,0x1b,0x40,0x38,0x00,0x02,0x04,0x02,0x85,0x00,0x0a,0x04,0x0c,0x04,0x0a,0x0c,0x80,0x00,0x01,0x00,0x01,0x86,0x08,0x06,0x02,0x04,0x10,0x0e,0x02,0x0c,0x03,0x04,0x0c,0x69,0x09,0x07,0x05,0x03,0x03,0x00,0x00,0x03,0x59,0x09,0x07,0x05,0x03,0x03,0x03,0x00,0x62,0x0f,0x0d,0x0b,0x11,0x04,0x00,0x03,0x00,0x52, +0x59,0x40,0x29,0x01,0x00,0x62,0x60,0x5c,0x5a,0x56,0x54,0x50,0x4e,0x4a,0x48,0x44,0x42,0x3f,0x3e,0x3c,0x3a,0x36,0x34,0x30,0x2e,0x2a,0x28,0x24,0x22,0x1e,0x1c,0x18,0x16,0x11,0x10,0x0e,0x0d,0x00,0x66,0x01,0x66,0x12,0x09,0x16,0x2b,0x25,0x22,0x2e,0x03,0x27,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x23,0x03,0x13,0x33,0x07,0x1e,0x03, +0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0xfc,0xd6,0x24,0x30,0x22,0x1b,0x1b,0x13, +0x09,0x0c,0x02,0x04,0x19,0x15,0xba,0x6a,0xe7,0xe8,0x69,0xa2,0x1a,0x23,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15, +0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x31,0xe5,0x18,0x24,0x26,0x1c,0x03,0x0b,0x0d,0x03,0x04,0x1f,0x1a,0xeb,0x01,0x27,0x01,0x27,0xcc,0x0c,0x27,0x27,0x1b,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27, +0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x00,0x01,0xfe,0x2a,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x10,0x00,0x23,0x40,0x20,0x0d,0x09,0x05,0x04,0x03,0x02,0x01,0x07, +0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x10,0x00,0x10,0x1e,0x03,0x09,0x17,0x2b,0x17,0x37,0x01,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x33,0x01,0x28,0x2b,0xfd,0xd7,0x01,0xae,0xfe,0xca,0x11,0x1c,0x07,0x07,0x1c,0x11,0x01,0xcd,0x01,0x1c,0x5f,0xfe,0x9d,0x6e, +0x71,0x01,0x15,0x64,0xd7,0x5a,0x97,0x09,0x0c,0x02,0x02,0x0c,0x09,0xe6,0x02,0xf0,0xfc,0x54,0x00,0x00,0x00,0x01,0xfb,0xf5,0xff,0x92,0x01,0xb3,0x03,0x3e,0x00,0x1d,0x00,0x2a,0x40,0x27,0x1c,0x18,0x14,0x13,0x12,0x11,0x10,0x0d,0x09,0x05,0x04,0x03,0x02,0x01,0x0e,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01, +0x76,0x00,0x00,0x00,0x1d,0x00,0x1d,0x1e,0x03,0x09,0x17,0x2b,0x05,0x37,0x01,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x33,0x07,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x01,0xfd,0xf3,0x2b,0xfd,0xd7,0x01,0xae,0xfe,0xca,0x11,0x1c,0x07,0x07,0x1c,0x11,0x01,0xcd,0x01,0x1c,0x5f,0x3d,0x02, +0x3b,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0x20,0xfe,0xf7,0x6e,0x71,0x01,0x15,0x64,0xd7,0x5a,0x97,0x09,0x0c,0x02,0x02,0x0c,0x09,0xe6,0x02,0xf0,0xa3,0xfe,0xe1,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0xf0,0xfd,0x42,0x00,0x01,0xfe,0x11,0x00,0xdc,0x01,0xf4,0x01,0xb8,0x00,0x1e,0x00,0x6e,0x4b,0xb0, +0x11,0x50,0x58,0x40,0x22,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x06,0x00,0x04,0x59,0x00,0x05,0x00,0x06,0x00,0x05,0x06,0x67,0x00,0x04,0x04,0x00,0x61,0x02,0x07,0x02,0x00,0x04,0x00,0x51,0x1b,0x40,0x29,0x00,0x02,0x06,0x00,0x06,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x06,0x00,0x04,0x59, +0x00,0x05,0x00,0x06,0x02,0x05,0x06,0x67,0x00,0x04,0x04,0x00,0x61,0x07,0x01,0x00,0x04,0x00,0x51,0x59,0x40,0x15,0x01,0x00,0x1c,0x1b,0x1a,0x18,0x16,0x14,0x10,0x0e,0x0b,0x0a,0x07,0x05,0x00,0x1e,0x01,0x1e,0x08,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x36, +0x35,0x35,0x21,0x15,0x21,0x06,0x06,0x64,0x29,0x38,0x29,0x24,0x27,0x1b,0x1f,0x27,0x55,0x55,0x46,0x2a,0x39,0x29,0x23,0x27,0x1a,0x20,0x26,0x02,0x12,0xfe,0x2f,0x13,0x46,0xdc,0x1d,0x2b,0x2c,0x1d,0x26,0x20,0x3c,0x3c,0x41,0x50,0x1d,0x2b,0x2c,0x1d,0x28,0x1e,0x05,0x50,0x21,0x25,0x00,0x00,0x00,0x02,0xfd,0xee,0xff,0x4c,0x02,0x30, +0x02,0xe4,0x00,0x44,0x00,0x52,0x00,0xcb,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x0b,0x2e,0x19,0x02,0x0c,0x03,0x42,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0b,0x2e,0x19,0x02,0x0c,0x03,0x42,0x01,0x02,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x38,0x00,0x07,0x00,0x0c,0x01,0x07,0x0c,0x69,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69, +0x00,0x04,0x02,0x0d,0x02,0x00,0x0b,0x04,0x00,0x69,0x0e,0x01,0x0b,0x00,0x06,0x09,0x0b,0x06,0x69,0x00,0x08,0x08,0x05,0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x09,0x09,0x0a,0x5f,0x00,0x0a,0x0a,0x3d,0x0a,0x4e,0x1b,0x40,0x3f,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x07,0x00,0x0c,0x01,0x07,0x0c,0x69,0x00,0x03,0x00,0x01,0x04, +0x03,0x01,0x69,0x00,0x04,0x0d,0x01,0x00,0x0b,0x04,0x00,0x69,0x0e,0x01,0x0b,0x00,0x06,0x09,0x0b,0x06,0x69,0x00,0x08,0x08,0x05,0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x09,0x09,0x0a,0x5f,0x00,0x0a,0x0a,0x3d,0x0a,0x4e,0x59,0x40,0x25,0x46,0x45,0x01,0x00,0x4d,0x4b,0x45,0x52,0x46,0x52,0x3e,0x3c,0x3b,0x39,0x34,0x32,0x2c,0x2a,0x25, +0x23,0x1e,0x1c,0x17,0x15,0x11,0x0f,0x0b,0x0a,0x07,0x05,0x00,0x44,0x01,0x44,0x0f,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x36,0x37,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35, +0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x35,0x06,0x06,0x05,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x62,0x31,0x45,0x32,0x29,0x2a,0x1a,0x1e,0x28,0x55,0x28,0x46,0x2b,0x2c,0x3c,0x2e,0x2a,0x33,0x24,0x39,0x4c,0x0a,0x90,0x7e,0x72,0x83,0x56,0x4a,0x49,0x57, +0x46,0x40,0x29,0x36,0x09,0x02,0x55,0x50,0x5a,0x64,0x6b,0x5d,0x6e,0x6e,0x55,0x7e,0x45,0x19,0x49,0x01,0xc5,0x26,0x2a,0x2a,0x26,0x26,0x2a,0x2a,0xfa,0x1a,0x27,0x27,0x1a,0x25,0x1c,0x3c,0x3c,0x28,0x3f,0x25,0x1a,0x27,0x27,0x1a,0x3e,0x33,0x0c,0x87,0x9b,0x83,0x72,0xfe,0xf1,0x4e,0x5b,0x58,0x47,0x74,0x4a,0x51,0x20,0x1c,0x46,0x55, +0x5a,0x74,0x68,0xfe,0xac,0x64,0x73,0x4b,0x47,0x83,0x58,0xcf,0x20,0x23,0x80,0x31,0x2b,0x75,0x2c,0x2f,0x30,0x2c,0x74,0x2b,0x31,0x00,0x00,0x00,0x00,0x01,0xfd,0xee,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x3d,0x00,0xa0,0x40,0x0b,0x01,0x01,0x01,0x05,0x01,0x4c,0x3c,0x01,0x09,0x01,0x4b,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x0a, +0x06,0x0a,0x85,0x00,0x04,0x06,0x00,0x05,0x04,0x72,0x00,0x09,0x00,0x05,0x00,0x09,0x05,0x80,0x0c,0x01,0x0b,0x01,0x0b,0x86,0x08,0x01,0x06,0x02,0x01,0x00,0x09,0x06,0x00,0x6a,0x07,0x01,0x05,0x01,0x01,0x05,0x59,0x07,0x01,0x05,0x05,0x01,0x62,0x03,0x01,0x01,0x05,0x01,0x52,0x1b,0x40,0x38,0x00,0x0a,0x06,0x0a,0x85,0x00,0x04,0x06, +0x00,0x06,0x04,0x00,0x80,0x00,0x09,0x00,0x05,0x00,0x09,0x05,0x80,0x0c,0x01,0x0b,0x01,0x0b,0x86,0x08,0x01,0x06,0x02,0x01,0x00,0x09,0x06,0x00,0x6a,0x07,0x01,0x05,0x01,0x01,0x05,0x59,0x07,0x01,0x05,0x05,0x01,0x62,0x03,0x01,0x01,0x05,0x01,0x52,0x59,0x40,0x16,0x00,0x00,0x00,0x3d,0x00,0x3d,0x3b,0x3a,0x39,0x37,0x24,0x24,0x24, +0x22,0x13,0x24,0x24,0x24,0x25,0x0d,0x09,0x1f,0x2b,0x37,0x37,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x33,0x03,0x33,0x13,0x03,0xbc,0xb6,0x1e,0x29,0x20,0x22,0x17,0x15, +0x1f,0x1d,0x24,0x32,0x26,0x25,0x34,0x24,0x1e,0x1f,0x15,0x15,0x1e,0x1b,0x21,0x31,0x26,0x3a,0x48,0x55,0x2f,0x14,0x1e,0x1b,0x22,0x32,0x25,0x25,0x33,0x24,0x1d,0x1f,0x15,0x14,0x1f,0x1d,0x24,0x34,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x10,0xee,0x6a,0xe7,0xe8,0x23,0xe5,0x08,0x1e,0x22,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a, +0x1a,0x27,0x27,0x1a,0x48,0x3a,0x28,0x28,0x37,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x15,0x1f,0x1f,0x15,0x01,0x27,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x01,0xfe,0x57,0x00,0xe6,0x01,0xae,0x01,0xb3,0x00,0x33,0x00,0x83,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x2c,0x00,0x07,0x03,0x01,0x04,0x07,0x72,0x00,0x02,0x04,0x00, +0x01,0x02,0x72,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01,0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x2e,0x00,0x07,0x03,0x01,0x03,0x07,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01, +0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x59,0x40,0x1b,0x01,0x00,0x2f,0x2d,0x29,0x27,0x24,0x23,0x21,0x1f,0x1b,0x19,0x15,0x13,0x0f,0x0d,0x0a,0x09,0x07,0x05,0x00,0x33,0x01,0x33,0x0b,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e, +0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x5f,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x48,0x3a,0x25,0x31,0x22,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x32,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15, +0x15,0x1d,0x1b,0x21,0x31,0xe6,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x01,0xfb,0x96,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x61,0x00,0xf7,0x40,0x0b,0x5d,0x01,0x08,0x0a,0x60,0x01,0x02,0x09, +0x00,0x02,0x4c,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x38,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x00,0x09,0x08,0x72,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x03,0x00,0x09,0x0a,0x00,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05,0x03,0x03,0x01,0x09, +0x01,0x52,0x1b,0x4b,0xb0,0x17,0x50,0x58,0x40,0x39,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x00,0x0a,0x08,0x00,0x80,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x03,0x00,0x09,0x0a,0x00,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05,0x03,0x03,0x01, +0x09,0x01,0x52,0x1b,0x40,0x40,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x02,0x0a,0x08,0x02,0x80,0x00,0x00,0x02,0x09,0x02,0x00,0x09,0x80,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x02,0x00,0x0a,0x02,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05, +0x03,0x03,0x01,0x09,0x01,0x52,0x59,0x59,0x40,0x22,0x00,0x00,0x00,0x61,0x00,0x61,0x5f,0x5e,0x59,0x57,0x53,0x51,0x4d,0x4b,0x47,0x45,0x41,0x3f,0x3b,0x39,0x35,0x33,0x13,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x12,0x13,0x09,0x1f,0x2b,0x37,0x13,0x27,0x0e,0x04,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22, +0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x27,0x33,0x13,0x03,0xbc,0xee,0x12,0x14,0x1e,0x1b,0x22,0x32,0x25,0x25,0x32,0x22,0x1c, +0x1e,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x25,0x32,0x22,0x1c,0x1e,0x15,0x15,0x1f,0x1d,0x24,0x32,0x26,0x25,0x34,0x24,0x1e,0x1f,0x15,0x15,0x1e,0x1b,0x21,0x31,0x26,0x3a,0x48,0x55,0x2f,0x14,0x1e,0x1b,0x22,0x32,0x25,0x26,0x32,0x24,0x1d,0x1f,0x15,0x14,0x1f,0x1d,0x24,0x34,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22, +0x32,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x16,0x1e,0x1d,0x24,0x1c,0xa7,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x14,0x01,0x18,0x24,0x23,0x18,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x48,0x3a,0x28,0x28,0x37,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a, +0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x25,0x25,0x0a,0xd3,0xfe,0xd9,0xfe,0xd9,0x00,0x02,0xfe,0x39,0x00,0xaa,0x01,0x9f,0x02,0xf8,0x00,0x0e,0x00,0x12,0x00,0x3d,0x40,0x3a,0x0a,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x06,0x03,0x02,0x02,0x04,0x01,0x02,0x67,0x00, +0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x0f,0x0f,0x00,0x00,0x0f,0x12,0x0f,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x01,0x13,0x33,0x13,0x21,0x15,0x21,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x05,0x35,0x21,0x15,0xfe,0x39,0xc8,0x54,0x9b,0x01,0xaf,0xfe, +0x1b,0x77,0x0a,0x0b,0x02,0x02,0x0d,0x0b,0x7c,0x01,0x24,0x01,0xe5,0x01,0x9a,0x01,0x5e,0xfe,0xf2,0x50,0xe1,0x14,0x1e,0x07,0x07,0x1e,0x14,0xe1,0xf0,0x50,0x50,0x00,0x00,0x04,0xfd,0xf8,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x46,0x40,0x43,0x02,0x01,0x00,0x09,0x03,0x08,0x03,0x01,0x04,0x00, +0x01,0x67,0x06,0x01,0x04,0x05,0x05,0x04,0x57,0x06,0x01,0x04,0x04,0x05,0x5f,0x0b,0x07,0x0a,0x03,0x05,0x04,0x05,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x33,0x35, +0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0xfd,0xf8,0x01,0xcc,0x78,0x01,0xcc,0xfb,0xf0,0x01,0xcc,0x78,0x01,0xcc,0x01,0x9a,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0x00,0x00,0x06,0xfb,0xa0,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x5d,0x40,0x5a,0x04,0x02, +0x02,0x00,0x0e,0x05,0x0d,0x03,0x0c,0x05,0x01,0x06,0x00,0x01,0x67,0x0a,0x08,0x02,0x06,0x07,0x07,0x06,0x57,0x0a,0x08,0x02,0x06,0x06,0x07,0x5f,0x11,0x0b,0x10,0x09,0x0f,0x05,0x07,0x06,0x07,0x4f,0x14,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x14,0x17,0x14,0x17,0x16,0x15,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f, +0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x3c,0x01,0xcc,0xf9,0x98,0x01,0xcc,0x8c,0x01,0xcc,0xfb,0xdc,0x01,0xcc,0x8c, +0x01,0xcc,0x78,0x01,0xcc,0x01,0x9a,0x50,0x50,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x02,0x00,0x8c,0xff,0xf6,0x01,0xcc,0x02,0xda,0x00,0x0e,0x00,0x1a,0x00,0x24,0x40,0x21,0x0f,0x03,0x00,0x03,0x02,0x49,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x59,0x00,0x01,0x01,0x02,0x61,0x00,0x02,0x01,0x02, +0x51,0x2e,0x24,0x11,0x03,0x06,0x19,0x2b,0x17,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x8c,0x5a,0x01,0x06,0x36,0x29,0x3a,0x46,0x4f,0x46,0x51,0x35,0x29,0x2e,0x25,0x21,0x21,0x25,0x0a,0x02,0xe4,0xfe,0xc0,0x27,0x2f,0x54,0x47,0x55,0x43, +0x6c,0x1a,0x3a,0x14,0x10,0x40,0x2b,0x55,0x23,0x26,0x26,0x23,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x1b,0x00,0x1f,0x00,0x40,0x40,0x3d,0x0e,0x01,0x00,0x01,0x1f,0x1e,0x1d,0x1c,0x1b,0x18,0x17,0x14,0x13,0x12,0x11,0x10,0x0f,0x0d,0x0a,0x09,0x06,0x05,0x04,0x03,0x02,0x01,0x16,0x02,0x00,0x00,0x01,0x03,0x02,0x03, +0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x03,0x76,0x13,0x19,0x13,0x17,0x04,0x06,0x1a,0x2b,0x37,0x35,0x37,0x35,0x07,0x35,0x37,0x35,0x33,0x15,0x37,0x35,0x33,0x15,0x37,0x15,0x07,0x15,0x37,0x15,0x07,0x15,0x23,0x35,0x07,0x15,0x23,0x35,0x13,0x15,0x37,0x35,0x41,0x69,0x69,0x69, +0x3c,0x8c,0x3c,0x69,0x69,0x69,0x69,0x3c,0x8c,0x3c,0x3c,0x8c,0x50,0x41,0x37,0xc1,0x37,0x41,0x37,0xb6,0x96,0x49,0xa7,0x87,0x37,0x41,0x37,0xc1,0x37,0x41,0x37,0xb6,0x96,0x49,0xa7,0x87,0x01,0x22,0xc1,0x49,0xc1,0x00,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0x9a,0x01,0x77,0x02,0xd1,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x00, +0x01,0x86,0x00,0x00,0x00,0x28,0x00,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x08,0x17,0x2b,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0x9a,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0xff,0xff,0x00,0xd2,0xff,0x60,0x01,0x75,0x00,0x92,0x02,0x06,0x03,0x2a,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0xd1,0x01,0x77,0x03,0x08,0x00,0x03, +0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0xd1,0x01,0x37,0xfe,0xc9,0x00,0x00,0x02,0x00,0x37,0x01,0x99,0x02,0x1c,0x02,0xd0,0x00,0x03,0x00,0x07,0x00,0x2a, +0xb1,0x06,0x64,0x44,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x13,0x33,0x03,0x21,0x13,0x33,0x03,0x01,0x4a,0x50,0x82,0x82,0xfe,0x9d,0x50,0x82,0x82,0x01,0x99,0x01,0x37, +0xfe,0xc9,0x01,0x37,0xfe,0xc9,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x9e,0x01,0xcc,0x02,0xe9,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0x9a,0x01,0x77,0x02,0xd1,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03, +0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0x9a,0x01,0x37,0xfe,0xc9,0x00,0x00,0x02,0xfe,0x25,0x02,0x89,0xff,0x83,0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x33,0xb1,0x06,0x64,0x44,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00, +0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d, +0x1d,0x23,0x23,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0x02,0x89,0xff,0x1b,0x03,0x09,0x00,0x0b,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07, +0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x01,0xfe,0x4a,0x02,0x85,0xff,0x1c,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14, +0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x27,0x33,0x17,0xfe,0xbd,0x73,0x64,0x6e,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x90,0x02,0x85,0xff,0x5b,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00, +0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0xfe,0x90,0x6a,0x61,0x6f,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x02,0xfe,0x3b,0x02,0x85,0xff,0xb8,0x03,0x11,0x00,0x03,0x00,0x07,0x00,0x32,0xb1,0x06,0x64,0x44,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00, +0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0xfe,0xee,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x02,0x85,0x8c,0x8c,0x8c,0x8c,0x00,0x00, +0x00,0x01,0xff,0x60,0x02,0x26,0xff,0xc3,0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0xa0,0x0f,0x54,0x18,0x02,0x26,0xb4,0xb4,0x00,0x00,0x01,0xfe,0x1f,0x02,0x85,0xff,0x89,0x03,0x11,0x00,0x06, +0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x05,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x17,0x23,0x27,0x07,0xfe,0x1f,0x8b,0x53,0x8c,0x63,0x52,0x50,0x02,0x85,0x8c,0x8c,0x4e,0x4e,0x00,0x00, +0x00,0x01,0xfe,0x1f,0x02,0x85,0xff,0x89,0x03,0x11,0x00,0x06,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x03,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x12,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x27,0x33,0x17,0x37,0x33,0x07,0xfe,0xab,0x8c,0x63, +0x52,0x50,0x65,0x8b,0x02,0x85,0x8c,0x4e,0x4e,0x8c,0x00,0x00,0x00,0x01,0xfe,0x34,0x02,0x80,0xff,0x74,0x03,0x11,0x00,0x0d,0x00,0x31,0xb1,0x06,0x64,0x44,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00, +0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x02,0x80,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x5c,0x02,0x60,0xff,0x4c,0x03,0x44,0x00,0x0b,0x00,0x17,0x00,0x39, +0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33, +0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0x02,0x60,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0x02,0x8a,0xff,0x74, +0x03,0x0c,0x00,0x19,0x00,0x6d,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00, +0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33, +0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0xe6,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0x02,0x8a,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x34,0x02,0x9e,0xff,0x74,0x02,0xe9,0x00,0x03,0x00,0x26,0xb1,0x06, +0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x35,0x21,0x15,0xfe,0x34,0x01,0x40,0x02,0x9e,0x4b,0x4b,0x00,0x01,0xfe,0x7a,0x02,0x85,0xff,0x38,0x03,0x39,0x00,0x0e,0x00,0x4e,0xb1,0x06, +0x64,0x44,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x0e, +0x00,0x0e,0x21,0x24,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0xfe,0xaa,0x32,0x0e,0x20,0x50,0x69,0x26,0x2f,0x11,0x28,0x02,0x85,0x3f,0x13,0x0d,0x14,0x41,0x27,0x23,0x20,0x16,0x34,0x00,0x00,0x00,0x02,0xfd,0xf0,0x02,0x85,0xff,0x6d,0x03,0x11,0x00,0x03, +0x00,0x07,0x00,0x25,0xb1,0x06,0x64,0x44,0x40,0x1a,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x09,0x1a,0x2b,0xb1,0x06,0x00,0x44,0x01,0x23,0x27,0x33,0x05,0x23,0x27,0x33,0xfe,0xba,0x57,0x73,0x5c,0x01,0x21,0x57,0x73,0x5c,0x02,0x85,0x8c,0x8c,0x8c, +0x00,0x01,0xfe,0x7a,0x02,0x85,0xff,0x47,0x03,0x70,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x03,0x07,0x23,0x37,0xb9,0x50,0x7d,0x82,0x03,0x70,0xeb,0xeb,0x00,0x00,0x00,0x00,0x01,0xff,0x18, +0x01,0xe5,0xff,0xa0,0x02,0x94,0x00,0x0a,0x00,0x4e,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x62,0x03,0x01,0x02,0x00,0x02,0x52,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x62,0x03, +0x01,0x02,0x00,0x02,0x52,0x59,0x40,0x0b,0x00,0x00,0x00,0x0a,0x00,0x09,0x12,0x21,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x03,0x35,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0xe8,0x1a,0x23,0x4b,0x3a,0x2f,0x01,0xe5,0x41,0x23,0x4b,0x50,0x2b,0x34,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0xff,0x2b,0xff,0x1b,0xff,0xab,0x00,0x0b, +0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xd5,0x22, +0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x02,0xfe,0x5c,0xff,0x06,0xff,0x4c,0xff,0xce,0x00,0x0b,0x00,0x17,0x00,0x39,0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c, +0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x37,0x1c,0x21,0x20,0x1d,0x1a,0x21,0x21,0xfa,0x37,0x2d,0x2d,0x37,0x37, +0x2d,0x2d,0x37,0x33,0x1b,0x16,0x1a,0x18,0x1b,0x17,0x16,0x1b,0x00,0x01,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x37,0x33,0x07,0xfe,0x66,0x5f, +0x69,0x69,0xf0,0x91,0x91,0x00,0x00,0x00,0x00,0x01,0xfe,0x75,0xff,0x35,0xff,0x42,0x00,0x1a,0x00,0x12,0x00,0x36,0xb1,0x06,0x64,0x44,0x40,0x2b,0x0b,0x01,0x01,0x02,0x01,0x4c,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x03,0x03,0x00,0x59,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x12,0x00, +0x11,0x11,0x14,0x21,0x05,0x09,0x19,0x2b,0xb1,0x06,0x00,0x44,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x33,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xfe,0x75,0x46,0x16,0x1b,0x37,0x32,0x23,0x39,0x15,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x5f,0x3d,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0x01,0xfe,0x61, +0xff,0x35,0xff,0x29,0x00,0x0a,0x00,0x10,0x00,0x2e,0xb1,0x06,0x64,0x44,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x02,0x00,0x50,0x01,0x00,0x0f,0x0d,0x07,0x06,0x00,0x10,0x01,0x10,0x04,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x33, +0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0xfe,0xdb,0x37,0x43,0x26,0x2f,0x4b,0x0b,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1d,0x3a,0x21,0x09,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x01,0xfd,0x8a,0x01,0x22,0x00,0x1e,0x01,0x68,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00, +0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x35,0x21,0x15,0xfd,0x8a,0x02,0x94,0x01,0x22,0x46,0x46,0x00,0x01,0xfd,0xcb,0xff,0xe2,0xff,0xdd,0x02,0x4e,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, +0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x01,0x33,0x01,0xfd,0xcb,0x01,0xb7,0x5b,0xfe,0x48,0x1e,0x02,0x6c,0xfd,0x94,0x00,0x00,0x00,0x00,0x01,0xfe,0x16,0xff,0x92,0xff,0x92,0x02,0x94,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01, +0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x01,0x33,0x01,0xfe,0x16,0x01,0x3d,0x3f,0xfe,0xc3,0x6e,0x03,0x02,0xfc,0xfe,0x00,0x00,0x00,0xff,0xff,0x00,0x7d,0x02,0x89,0x01,0xdb,0x03,0x09,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe5,0x02,0x89,0x01,0x73, +0x03,0x09,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa2,0x02,0x85,0x01,0x74,0x03,0x11,0x00,0x07,0x06,0x6a,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe8,0x02,0x85,0x01,0xb3,0x03,0x11,0x00,0x07,0x06,0x6b,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x02,0x85,0x02,0x10,0x03,0x11,0x00,0x07, +0x06,0x6c,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x02,0x85,0x01,0xe1,0x03,0x11,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x02,0x85,0x01,0xe1,0x03,0x11,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x80,0x01,0xcc,0x03,0x11,0x00,0x07,0x06,0x70,0x02,0x58, +0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0x02,0x60,0x01,0xa4,0x03,0x44,0x00,0x07,0x06,0x71,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x8a,0x01,0xcc,0x03,0x0c,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x9e,0x01,0xcc,0x02,0xe9,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x00, +0xff,0xff,0x00,0xcd,0xff,0x35,0x01,0x9a,0x00,0x1a,0x00,0x07,0x06,0x7b,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb9,0xff,0x35,0x01,0x81,0x00,0x0a,0x00,0x07,0x06,0x7c,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x02,0x06,0x06,0x7a,0x00,0x00,0x00,0x02,0xfe,0x25,0x03,0x31,0xff,0x83, +0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23, +0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0x03,0x30,0xff,0x1b,0x03,0xb0,0x00,0x0b,0x00,0x1f,0x40,0x1c, +0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x03,0x30,0x23,0x1d,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x00,0x01,0xfe,0x4a, +0x03,0x2a,0xff,0x1c,0x03,0xb6,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0xfe,0xbd,0x73,0x64,0x6e,0x03,0x2a,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x90,0x03,0x2a,0xff,0x5b,0x03,0xb6,0x00,0x03,0x00,0x17,0x40,0x14, +0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0xfe,0x90,0x6a,0x61,0x6f,0x03,0x2a,0x8c,0x8c,0x00,0x00,0x00,0x02,0xfe,0x3b,0x03,0x2a,0xff,0xb8,0x03,0xb6,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00, +0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0xfe,0xee,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x03,0x2a,0x8c,0x8c,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x1f,0x03,0x2a,0xff,0x89, +0x03,0xb6,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x11,0x04,0x09,0x18,0x2b,0x01,0x37,0x33,0x17,0x23,0x27,0x07,0xfe,0x1f,0x8b,0x53,0x8c,0x63,0x52,0x50,0x03,0x2a,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x01,0xfe,0x1f, +0x03,0x2a,0xff,0x89,0x03,0xb6,0x00,0x06,0x00,0x1f,0x40,0x1c,0x03,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x12,0x11,0x04,0x09,0x18,0x2b,0x01,0x27,0x33,0x17,0x37,0x33,0x07,0xfe,0xab,0x8c,0x63,0x52,0x50,0x65,0x8b,0x03,0x2a,0x8c,0x4e,0x4e,0x8c,0x00,0x00, +0x00,0x01,0xfe,0x34,0x03,0x25,0xff,0x74,0x03,0xb6,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32, +0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x03,0x25,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x5c,0x02,0xfe,0xff,0x4c,0x03,0xe2,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02, +0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b, +0x21,0x21,0x1b,0x1b,0x21,0x21,0x02,0xfe,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0x03,0x2f,0xff,0x74,0x03,0xb1,0x00,0x19,0x00,0x65,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59, +0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13, +0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0xe6,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0x03,0x2f,0x15,0x1c,0x15,0x23,0x1e, +0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x34,0x03,0x48,0xff,0x74,0x03,0x93,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0xfe,0x34,0x01,0x40, +0x03,0x48,0x4b,0x4b,0x00,0x01,0xfe,0x7a,0x03,0x20,0xff,0x33,0x03,0xd4,0x00,0x0e,0x00,0x46,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00, +0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x0e,0x00,0x0e,0x21,0x24,0x04,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0xfe,0xaa,0x2d,0x0e,0x20,0x4b,0x50,0x2f,0x3a,0x11,0x23,0x03,0x20,0x3f,0x14,0x0c,0x14,0x41,0x29,0x22,0x1c,0x19,0x34,0x00,0x00, +0x00,0x02,0xfd,0xf0,0x03,0x2a,0xff,0x6d,0x03,0xb6,0x00,0x03,0x00,0x07,0x00,0x1d,0x40,0x1a,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x09,0x1a,0x2b,0x01,0x23,0x27,0x33,0x05,0x23,0x27,0x33,0xfe,0xba,0x57,0x73,0x5c,0x01,0x21,0x57,0x73,0x5c,0x03, +0x2a,0x8c,0x8c,0x8c,0x00,0x01,0xfe,0x34,0x03,0x25,0xff,0x74,0x03,0xb6,0x00,0x0d,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x22,0x12,0x22,0x05,0x06,0x19,0x2b,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x23, +0x34,0x26,0x23,0x22,0x06,0x15,0xfe,0x34,0x58,0x48,0x48,0x58,0x47,0x31,0x29,0x28,0x30,0x03,0x25,0x41,0x50,0x50,0x41,0x27,0x30,0x30,0x27,0x00,0x00,0x01,0xfe,0x7a,0x03,0x2a,0xff,0x38,0x03,0xfc,0x00,0x03,0x00,0x1f,0x40,0x1c,0x02,0x01,0x01,0x00,0x00,0x01,0x57,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00, +0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x03,0x07,0x23,0x37,0xc8,0x41,0x7d,0x73,0x03,0xfc,0xd2,0xd2,0x00,0x00,0x00,0x00,0x01,0xff,0x1b,0x02,0x99,0xff,0xa6,0x03,0x48,0x00,0x0b,0x00,0x3c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x12,0x00,0x01,0x00,0x00,0x01,0x70,0x03,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x38,0x02,0x4e,0x1b, +0x40,0x11,0x00,0x01,0x00,0x01,0x85,0x03,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x38,0x02,0x4e,0x59,0x40,0x0b,0x00,0x00,0x00,0x0b,0x00,0x0a,0x13,0x21,0x04,0x09,0x18,0x2b,0x03,0x35,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0xe5,0x1d,0x10,0x13,0x4b,0x39,0x30,0x02,0x99,0x41,0x13,0x10,0x4b,0x50,0x2b,0x34,0x00,0x00, +0x00,0x01,0xfe,0x8d,0xff,0x2b,0xff,0x1b,0xff,0xab,0x00,0x0b,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21, +0x26,0x26,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x02,0xfe,0x25,0xff,0x2b,0xff,0x83,0xff,0xab,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00, +0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22, +0x00,0x01,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x37,0x33,0x07,0xfe,0x66,0x5f,0x69,0x69,0xf0,0x91,0x91,0x00,0x00,0x00,0x00,0x01,0xfe,0x75,0xff,0x35,0xff,0x42,0x00,0x1a,0x00,0x12, +0x00,0x4e,0xb5,0x0b,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x14,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x19,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x03,0x03,0x00,0x59,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f, +0x59,0x40,0x0c,0x00,0x00,0x00,0x12,0x00,0x11,0x11,0x14,0x21,0x05,0x09,0x19,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x33,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xfe,0x75,0x46,0x16,0x1b,0x37,0x32,0x23,0x39,0x15,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x5f,0x3d,0x03,0x14,0x24,0x1a,0x22,0x31,0x00, +0x00,0x01,0xfe,0x61,0xff,0x35,0xff,0x29,0x00,0x0a,0x00,0x10,0x00,0x42,0x4b,0xb0,0x15,0x50,0x58,0x40,0x11,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x16,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x02,0x00,0x50,0x59, +0x40,0x0d,0x01,0x00,0x0f,0x0d,0x07,0x06,0x00,0x10,0x01,0x10,0x04,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x33,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0xfe,0xdb,0x37,0x43,0x26,0x2f,0x4b,0x0b,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1d,0x3a,0x21,0x09,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x01,0xfe,0x34, +0xff,0x10,0xff,0x74,0xff,0xa1,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14, +0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0xf0,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0xff,0x3d,0xff,0x74,0xff,0x88,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11, +0x03,0x06,0x17,0x2b,0x05,0x35,0x21,0x15,0xfe,0x34,0x01,0x40,0xc3,0x4b,0x4b,0x00,0xff,0xff,0x00,0x7d,0x03,0x31,0x01,0xdb,0x03,0xb1,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe5,0x03,0x30,0x01,0x73,0x03,0xb0,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa2,0x03,0x2a,0x01,0x74, +0x03,0xb6,0x00,0x07,0x06,0x90,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe8,0x03,0x2a,0x01,0xb3,0x03,0xb6,0x00,0x07,0x06,0x91,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x03,0x2a,0x02,0x10,0x03,0xb6,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x03,0x2a,0x01,0xe1,0x03,0xb6,0x00,0x07, +0x06,0x93,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x03,0x2a,0x01,0xe1,0x03,0xb6,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x25,0x01,0xcc,0x03,0xb6,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0x02,0xfe,0x01,0xa4,0x03,0xe2,0x00,0x07,0x06,0x96,0x02,0x58, +0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x2f,0x01,0xcc,0x03,0xb1,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x48,0x01,0xcc,0x03,0x93,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xd2,0x02,0x85,0x01,0xa0,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14, +0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x08,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x37,0x33,0x07,0xd2,0x6a,0x64,0x6f,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0xe1,0x02,0x3a,0x01,0x77,0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00, +0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x37,0x33,0x07,0xe1,0x38,0x5e,0x40,0x02,0x3a,0xa0,0xa0,0x00,0x00,0x03,0x00,0x7d,0x02,0x89,0x01,0xdb,0x03,0x84,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x77,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x24,0x00,0x00,0x03,0x03,0x00,0x70,0x06, +0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x05,0x01,0x03,0x01,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x62,0x08,0x04,0x07,0x03,0x02,0x03,0x02,0x52,0x1b,0x40,0x23,0x00,0x00,0x03,0x00,0x85,0x06,0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x05,0x01,0x03,0x01,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x62,0x08,0x04,0x07,0x03,0x02, +0x03,0x02,0x52,0x59,0x40,0x1a,0x11,0x10,0x05,0x04,0x00,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0b,0x09,0x04,0x0f,0x05,0x0f,0x00,0x03,0x00,0x03,0x11,0x09,0x08,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14, +0x06,0x01,0x03,0x4e,0x50,0x58,0x52,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x03,0x01,0x83,0x83,0x78,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x01,0xfe,0x34,0x02,0x80,0xff,0x74,0x03,0x11,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02, +0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x02,0x80,0x50,0x41, +0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0x7a,0x00,0x03,0x00,0x11,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01,0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00, +0x0f,0x0e,0x0c,0x0a,0x08,0x07,0x04,0x11,0x05,0x11,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0x95,0x73,0x60,0x78,0x1c,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x82,0x82,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a, +0x48,0x00,0x00,0x00,0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0x7a,0x00,0x03,0x00,0x11,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01,0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x0f,0x0e,0x0c,0x0a, +0x08,0x07,0x04,0x11,0x05,0x11,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xb8,0x78,0x60,0x73,0x3f,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x82,0x82,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a,0x48,0x00,0x00,0x00, +0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0xa2,0x00,0x0f,0x00,0x1d,0x00,0x78,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x29,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x70,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51, +0x1b,0x40,0x2a,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x05,0x7e,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x59,0x40,0x17,0x11,0x10,0x00,0x00,0x1b,0x1a,0x18,0x16,0x14,0x13,0x10,0x1d,0x11,0x1d,0x00,0x0f, +0x00,0x0f,0x21,0x24,0x09,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xa5,0x2d,0x09,0x1b,0x37,0x41,0x2b,0x33,0x09,0x08,0x23,0x20,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x3d,0x0c,0x0d, +0x18,0x3c,0x27,0x20,0x0d,0x19,0x0b,0x32,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a,0x48,0x00,0x00,0x00,0x00,0x02,0xfe,0x34,0x02,0x85,0xff,0x74,0x03,0xa0,0x00,0x19,0x00,0x27,0x00,0x95,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x2d,0x09,0x01,0x07,0x00,0x08,0x00,0x07,0x08,0x80,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02, +0x0a,0x02,0x00,0x07,0x04,0x00,0x6a,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x1b,0x40,0x3b,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x09,0x01,0x07,0x00,0x08,0x00,0x07,0x08,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x0a,0x01, +0x00,0x07,0x04,0x00,0x6a,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x59,0x40,0x1f,0x1b,0x1a,0x01,0x00,0x25,0x24,0x22,0x20,0x1e,0x1d,0x1a,0x27,0x1b,0x27,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0c,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15, +0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xea,0x1f,0x25,0x18,0x16,0x11,0x1e,0x41,0x34,0x2a,0x20,0x25,0x17,0x16,0x11,0x1e,0x41,0x34,0x6c,0x48,0x58,0x41,0x34,0x2a,0x2b,0x35,0x41,0x58,0x03,0x2c,0x13,0x19,0x13, +0x1e,0x19,0x14,0x28,0x30,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0xa7,0x48,0x3a,0x1f,0x28,0x28,0x1f,0x3a,0x48,0x00,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0x00,0x19,0x03,0x84,0x00,0x03,0x00,0x0a,0x00,0x33,0x40,0x30,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x01,0x03,0x01,0x85, +0x06,0x04,0x02,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xbe,0x73,0x64,0x78,0xfe,0x7f,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x8c,0x8c,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20, +0x02,0x85,0xff,0xc9,0x03,0x84,0x00,0x03,0x00,0x0a,0x00,0x3f,0x40,0x3c,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x80,0x05,0x01,0x01,0x03,0x00,0x01,0x03,0x7e,0x00,0x00,0x02,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x06,0x04,0x02,0x03,0x00,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07, +0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x27,0x33,0x17,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0x96,0x82,0x64,0x7d,0xfe,0x57,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x8c,0x8c,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0xff,0xce,0x03,0xa2,0x00,0x0e,0x00,0x15,0x00,0x75,0xb5,0x14,0x01,0x04, +0x02,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x25,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02,0x70,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1b,0x40,0x26,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02, +0x04,0x7e,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x59,0x40,0x15,0x0f,0x0f,0x00,0x00,0x0f,0x15,0x0f,0x15,0x13,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x08,0x09,0x18,0x2b,0x03,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07, +0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xb1,0x2d,0x09,0x20,0x32,0x37,0x2e,0x36,0x11,0x23,0xfe,0x86,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x3d,0x0e,0x0a,0x19,0x3c,0x28,0x23,0x15,0x18,0x32,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0xff,0x89,0x03,0xa0,0x00,0x19,0x00,0x20,0x00,0x92,0xb5,0x1f,0x01,0x07, +0x06,0x01,0x4c,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x29,0x00,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0a,0x08,0x02,0x07,0x07,0x84,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x09,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x37,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02, +0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0a,0x08,0x02,0x07,0x07,0x84,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x09,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x1d,0x1a,0x1a,0x01,0x00,0x1a,0x20,0x1a,0x20,0x1e,0x1d,0x1c,0x1b,0x16,0x15,0x13,0x11, +0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0b,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xea,0x1f,0x25,0x18,0x16,0x11,0x1e,0x41,0x34,0x2a,0x20,0x25,0x17,0x16,0x11,0x1e,0x41,0x34,0xfe, +0xe0,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x2c,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0xa7,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x03,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01, +0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x10,0x0f,0x0d,0x0a,0x08,0x07,0x04,0x13,0x05,0x12,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe, +0x95,0x69,0x60,0x6e,0x35,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x84,0x78,0x78,0x78,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x03,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01, +0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x10,0x0f,0x0d,0x0a,0x08,0x07,0x04,0x13,0x05,0x12,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe, +0xb8,0x64,0x60,0x5f,0x58,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x84,0x78,0x78,0x78,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x0f,0x00,0x1f,0x00,0x78,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x29,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80, +0x07,0x01,0x02,0x05,0x00,0x02,0x70,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x1b,0x40,0x2a,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x05,0x7e,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x03,0x03, +0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x59,0x40,0x17,0x11,0x10,0x00,0x00,0x1c,0x1b,0x19,0x16,0x14,0x13,0x10,0x1f,0x11,0x1e,0x00,0x0f,0x00,0x0f,0x21,0x24,0x09,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33, +0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe,0xa6,0x2f,0x07,0x0a,0x49,0x61,0x1a,0x1d,0x08,0x08,0x20,0x36,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x70,0x38,0x08,0x08,0x08,0x3c,0x19,0x17,0x0d,0x1c,0x0b,0x28,0x64,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79, +0x03,0xfc,0x00,0x1b,0x00,0x2b,0x00,0x55,0x40,0x52,0x18,0x16,0x02,0x03,0x02,0x0a,0x08,0x02,0x00,0x01,0x02,0x4c,0x07,0x01,0x05,0x00,0x06,0x00,0x05,0x06,0x80,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x03,0x08,0x01,0x00,0x05,0x03,0x00,0x69,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04, +0x51,0x1d,0x1c,0x01,0x00,0x28,0x27,0x25,0x22,0x20,0x1f,0x1c,0x2b,0x1d,0x2a,0x14,0x12,0x0f,0x0d,0x06,0x04,0x00,0x1b,0x01,0x1b,0x0a,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33, +0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xdf,0x1f,0x2a,0x1e,0x1b,0x11,0x0d,0x11,0x41,0x31,0x29,0x20,0x29,0x1d,0x1a,0x11,0x0e,0x10,0x41,0x2f,0x8f,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x98,0x0e,0x13,0x0e,0x10,0x0e,0x07,0x07,0x26,0x2d,0x0e,0x13,0x0e,0x11,0x0d,0x07,0x07,0x26,0x2d,0x8c,0x3c,0x3c,0x20,0x1c, +0x1c,0x20,0x3c,0x3c,0x00,0x02,0xfe,0x20,0x03,0x0c,0x00,0x0f,0x03,0xfc,0x00,0x03,0x00,0x0a,0x00,0x33,0x40,0x30,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x01,0x03,0x01,0x85,0x06,0x04,0x02,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03, +0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xc0,0x69,0x66,0x6e,0xfe,0x7f,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x84,0x78,0x78,0x78,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0xc4,0x03,0xfc,0x00,0x03,0x00,0x0a,0x00,0x3f,0x40,0x3c,0x09,0x01,0x03,0x01,0x01,0x4c, +0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x80,0x05,0x01,0x01,0x03,0x00,0x01,0x03,0x7e,0x00,0x00,0x02,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x06,0x04,0x02,0x03,0x00,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x27,0x33,0x17,0x05,0x37,0x33,0x17,0x23, +0x27,0x07,0x9b,0x78,0x64,0x73,0xfe,0x5c,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x84,0x78,0x78,0x78,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0xce,0x03,0xfc,0x00,0x0e,0x00,0x15,0x00,0x75,0xb5,0x14,0x01,0x04,0x02,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x25,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01, +0x02,0x04,0x00,0x02,0x70,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1b,0x40,0x26,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02,0x04,0x7e,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00, +0x00,0x01,0x00,0x51,0x59,0x40,0x15,0x0f,0x0f,0x00,0x00,0x0f,0x15,0x0f,0x15,0x13,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x08,0x09,0x18,0x2b,0x03,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xb4,0x30,0x08,0x0f,0x42,0x55,0x20,0x26,0x10,0x24,0xfe,0x86,0x8a, +0x54,0x8b,0x65,0x50,0x51,0x03,0x70,0x2f,0x08,0x0b,0x10,0x3a,0x22,0x1c,0x1c,0x10,0x22,0x64,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0x88,0x03,0xfc,0x00,0x1b,0x00,0x22,0x00,0x53,0x40,0x50,0x18,0x16,0x02,0x03,0x02,0x0a,0x08,0x02,0x00,0x01,0x21,0x01,0x05,0x04,0x03,0x4c,0x00,0x04,0x00,0x05,0x00,0x04, +0x05,0x80,0x08,0x06,0x02,0x05,0x05,0x84,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x1c,0x1c,0x01,0x00,0x1c,0x22,0x1c,0x22,0x20,0x1f,0x1e,0x1d,0x14,0x12,0x0f,0x0d,0x06,0x04,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23, +0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xdf,0x1f,0x2a,0x1e,0x1b,0x11,0x0d,0x11,0x41,0x31,0x29,0x20,0x29,0x1d,0x1a,0x11,0x0e,0x10,0x41,0x2f,0xfe,0xd6,0x74,0x80,0x74,0x65,0x4f,0x51,0x03,0x98,0x0e,0x13,0x0e,0x10,0x0e,0x07, +0x07,0x26,0x2d,0x0e,0x13,0x0e,0x11,0x0d,0x07,0x07,0x26,0x2d,0x8c,0x6e,0x6e,0x49,0x49,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xfe,0xf2,0x02,0x58,0x03,0xca,0x00,0x03,0x00,0x1a,0x00,0x2a,0x40,0x27,0x0f,0x01,0x01,0x00,0x03,0x00,0x02,0x03,0x01,0x02,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x03,0x01,0x85,0x04,0x01,0x03,0x03, +0x76,0x04,0x04,0x04,0x1a,0x04,0x1a,0x12,0x1b,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x34,0x36,0x37,0x37,0x36,0x36,0x35,0x35,0x23,0x37,0x17,0x23,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x11,0x5a,0x78,0x78,0x2c,0x25,0x91,0x19,0x1d,0x6e,0xaa,0xaa,0x6e,0x28,0x20,0x9b,0x19,0x1c,0x01,0x6c,0x02,0x5e,0xfd,0xfb, +0xfd,0x2d,0x01,0x7d,0x2c,0x59,0x1b,0x6c,0x12,0x2d,0x13,0xaa,0xaa,0xaa,0xb4,0x25,0x4b,0x18,0x73,0x13,0x34,0x1d,0xfe,0x8e,0x00,0x02,0x00,0x69,0xff,0x42,0x01,0xef,0x03,0x7a,0x00,0x05,0x00,0x1e,0x00,0x47,0x40,0x44,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x09,0x01,0x02,0x03,0x01,0x02,0x67,0x05,0x01,0x03,0x00,0x07,0x04,0x03,0x07, +0x67,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x0a,0x08,0x02,0x06,0x04,0x06,0x4f,0x06,0x06,0x00,0x00,0x06,0x1e,0x06,0x1e,0x1a,0x19,0x15,0x14,0x13,0x12,0x0d,0x0c,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0b,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x03,0x11,0x33,0x13,0x16,0x16,0x17,0x33,0x32,0x26,0x26, +0x35,0x11,0x33,0x11,0x23,0x03,0x26,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0x69,0x50,0xdd,0xf1,0x5d,0x81,0x0c,0x15,0x05,0x0a,0x01,0x08,0x08,0x4b,0x5c,0x80,0x0c,0x17,0x06,0x0a,0x05,0x0b,0x01,0x90,0x01,0xea,0xfe,0x61,0x4b,0xfd,0xb2,0x01,0xea,0xfe,0xdb,0x1c,0x47,0x17,0x30,0x41,0x1b,0x01,0x13,0xfe,0x16,0x01,0x25,0x1c,0x47,0x17, +0x1b,0x51,0x20,0xfe,0xed,0x00,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0xb0,0x02,0x26,0x03,0x6b,0x00,0x1a,0x00,0x23,0x00,0x32,0x00,0x44,0x40,0x41,0x32,0x26,0x02,0x06,0x07,0x01,0x4c,0x00,0x02,0x00,0x05,0x01,0x02,0x05,0x69,0x04,0x03,0x02,0x01,0x00,0x07,0x06,0x01,0x07,0x69,0x00,0x06,0x00,0x00,0x06,0x57,0x00,0x06,0x06,0x00,0x5f, +0x08,0x01,0x00,0x06,0x00,0x4f,0x01,0x00,0x2d,0x2b,0x25,0x24,0x21,0x1f,0x1c,0x1b,0x14,0x12,0x0e,0x0c,0x08,0x06,0x00,0x1a,0x01,0x19,0x09,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x33,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x33,0x35,0x34,0x26,0x23,0x22, +0x06,0x15,0x13,0x33,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x6e,0x19,0x23,0x23,0x19,0x0a,0x30,0x51,0x33,0x35,0x51,0x2e,0x0a,0x19,0x23,0x23,0x19,0xfe,0xde,0xc8,0x37,0x2d,0x2d,0x37,0x37,0x59,0x12,0x26,0x37,0x2d,0x2d,0x37,0x25,0x12,0x50,0x23,0x19,0x01,0xb2,0x19,0x23,0xe7,0x33,0x4d,0x2a,0x2c,0x4c, +0x32,0xe7,0x23,0x19,0xfe,0x4e,0x19,0x23,0x02,0x2b,0xe6,0x2d,0x37,0x37,0x2d,0xfd,0x71,0xa0,0x07,0x28,0x22,0x28,0x31,0x31,0x28,0x22,0x28,0x07,0x00,0x01,0xff,0xd8,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x04,0x00,0x17,0x40,0x14,0x04,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x11,0x10,0x02,0x06,0x18, +0x2b,0x13,0x23,0x11,0x33,0x01,0x0a,0x32,0x32,0x02,0x4e,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b, +0x11,0x01,0x01,0x33,0x01,0x01,0x01,0xe2,0xfe,0x24,0x70,0x01,0xe2,0xfe,0x1e,0xfe,0xd4,0x02,0x92,0x02,0x96,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x80,0x03,0xfc,0x00,0x04,0x00,0x1d,0x40,0x1a,0x01,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x04, +0x00,0x04,0x12,0x03,0x06,0x17,0x2b,0x09,0x02,0x33,0x11,0x02,0x4e,0xfd,0xb2,0x02,0x4e,0x32,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00, +0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x09,0x02,0x33,0x01,0x01,0x01,0xe2,0xfe,0x1e,0x01,0xe2,0x70,0xfe,0x24,0x01,0xe2,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfd,0x6a,0xfd,0x6e,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x35,0x02,0x2b,0x02,0x26,0x00,0x19,0x00,0x5f,0x4b,0xb0,0x15,0x50,0x58,0x40,0x22,0x00,0x01,0x01,0x02,0x5f,0x00,0x02, +0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x08,0x07,0x02,0x04,0x04,0x39,0x4d,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3d,0x06,0x4e,0x1b,0x40,0x1f,0x00,0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x08,0x07,0x02,0x04,0x04,0x39,0x04,0x4e,0x59,0x40,0x10, +0x00,0x00,0x00,0x19,0x00,0x19,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x55,0xc3,0xaf,0x01,0x09,0xb9,0xcf,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x52,0x01,0x82,0x52, +0xfe,0x2c,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x2b,0x02,0x2b,0x02,0x26,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x67,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x0e,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00, +0x01,0x01,0x00,0x13,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x17,0x00,0x27,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x0b,0x00,0x3e,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x00,0x00,0xbc,0x00,0x49,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x1c,0x01,0x05,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e, +0x01,0x21,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x3c,0x01,0x2f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x2c,0x01,0x6b,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x54,0x01,0x97,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x2a,0x01,0xeb,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x07,0x00,0x62,0x02,0x15,0x00,0x03, +0x00,0x01,0x04,0x09,0x00,0x08,0x00,0x12,0x02,0x77,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x09,0x00,0x4a,0x02,0x89,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x32,0x02,0xd3,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0c,0x00,0x32,0x03,0x05,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0d,0x01,0x22,0x03,0x37,0x00,0x03,0x00,0x01,0x04,0x09, +0x00,0x0e,0x00,0x36,0x04,0x59,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x00,0x00,0x28,0x04,0x8f,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x01,0x00,0x26,0x04,0xb7,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x02,0x00,0x2e,0x04,0xdd,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x03,0x00,0x16,0x05,0x0b,0x43,0x6c,0x61,0x73,0x73,0x69,0x63,0x20,0x63,0x6f, +0x6e,0x73,0x74,0x72,0x75,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6c,0x6f,0x73,0x65,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x72,0x75,0x63,0x74,0x69,0x6f,0x6e,0x42,0x72,0x6f,0x6b,0x65,0x6e,0x20,0x65,0x71,0x75,0x61,0x6c,0x73,0x20,0x6c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x73,0x52,0x61,0x73,0x65,0x64,0x20,0x62,0x61,0x72,0x20,0x66,0x00, +0x43,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x32,0x00,0x30,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00, +0x6f,0x00,0x20,0x00,0x50,0x00,0x72,0x00,0x6f,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x20,0x00,0x41,0x00,0x75,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x72,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x67,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x75,0x00, +0x62,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x2f,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2f,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x29,0x00,0x4a,0x00,0x65,0x00, +0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x32,0x00,0x2e,0x00,0x33,0x00,0x30,0x00,0x34,0x00,0x3b,0x00,0x4a,0x00,0x42,0x00,0x3b,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00, +0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x2d,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x20,0x00, +0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x32,0x00,0x2e,0x00,0x33,0x00,0x30,0x00,0x34,0x00,0x3b,0x00,0x20,0x00,0x74,0x00,0x74,0x00,0x66,0x00,0x61,0x00,0x75,0x00,0x74,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x6e,0x00, +0x74,0x00,0x20,0x00,0x28,0x00,0x76,0x00,0x31,0x00,0x2e,0x00,0x38,0x00,0x2e,0x00,0x34,0x00,0x2e,0x00,0x37,0x00,0x2d,0x00,0x35,0x00,0x64,0x00,0x35,0x00,0x62,0x00,0x29,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x2d,0x00,0x52,0x00, +0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x74,0x00,0x72,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x6d,0x00, +0x61,0x00,0x72,0x00,0x6b,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x73,0x00,0x2e,0x00,0x72,0x00,0x2e,0x00,0x6f,0x00,0x2e,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00, +0x50,0x00,0x68,0x00,0x69,0x00,0x6c,0x00,0x69,0x00,0x70,0x00,0x70,0x00,0x20,0x00,0x4e,0x00,0x75,0x00,0x72,0x00,0x75,0x00,0x6c,0x00,0x6c,0x00,0x69,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x4b,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x42,0x00,0x75,0x00,0x6c,0x00, +0x65,0x00,0x6e,0x00,0x6b,0x00,0x6f,0x00,0x76,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,0x77,0x00,0x77,0x00,0x2e,0x00,0x6a,0x00,0x65,0x00,0x74,0x00,0x62,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x68,0x00,0x74,0x00, +0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,0x77,0x00,0x77,0x00,0x2e,0x00,0x6a,0x00,0x65,0x00,0x74,0x00,0x62,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00, +0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00, +0x53,0x00,0x49,0x00,0x4c,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x31,0x00, +0x2e,0x00,0x31,0x00,0x2e,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x76,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x61,0x00,0x62,0x00,0x6c,0x00,0x65,0x00,0x20,0x00,0x77,0x00,0x69,0x00, +0x74,0x00,0x68,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x46,0x00,0x41,0x00,0x51,0x00,0x20,0x00,0x61,0x00,0x74,0x00,0x3a,0x00,0x20,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x73,0x00,0x2e,0x00,0x73,0x00,0x69,0x00,0x6c,0x00, +0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x4f,0x00,0x46,0x00,0x4c,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x73,0x00,0x2e,0x00,0x73,0x00,0x69,0x00,0x6c,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00, +0x4f,0x00,0x46,0x00,0x4c,0x00,0x43,0x00,0x6c,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x43,0x00,0x6c,0x00,0x6f,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x63,0x00,0x6f,0x00, +0x6e,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x42,0x00,0x72,0x00,0x6f,0x00,0x6b,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x65,0x00,0x71,0x00,0x75,0x00,0x61,0x00,0x6c,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x67,0x00,0x61,0x00,0x74,0x00,0x75,0x00,0x72,0x00,0x65,0x00, +0x73,0x00,0x52,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x72,0x00,0x20,0x00,0x66,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x65,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xcf,0x00,0x00,0x00,0x24,0x00,0xc9, +0x01,0x02,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x01,0x07,0x01,0x08,0x00,0xc7,0x01,0x09,0x01,0x0a,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x00,0x62,0x01,0x0e,0x00,0xad,0x01,0x0f,0x01,0x10,0x01,0x11,0x00,0x63,0x00,0xae,0x00,0x90,0x01,0x12,0x00,0x25,0x00,0x26,0x00,0xfd,0x00,0xff,0x00,0x64,0x01,0x13,0x01,0x14,0x00,0x27,0x00,0xe9, +0x01,0x15,0x01,0x16,0x00,0x28,0x00,0x65,0x01,0x17,0x01,0x18,0x00,0xc8,0x01,0x19,0x01,0x1a,0x01,0x1b,0x01,0x1c,0x01,0x1d,0x00,0xca,0x01,0x1e,0x01,0x1f,0x00,0xcb,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x24,0x00,0x29,0x00,0x2a,0x01,0x25,0x00,0xf8,0x01,0x26,0x01,0x27,0x01,0x28,0x01,0x29,0x00,0x2b,0x01,0x2a,0x01,0x2b, +0x00,0x2c,0x00,0xcc,0x01,0x2c,0x00,0xcd,0x00,0xce,0x00,0xfa,0x01,0x2d,0x00,0xcf,0x01,0x2e,0x01,0x2f,0x01,0x30,0x01,0x31,0x00,0x2d,0x01,0x32,0x00,0x2e,0x01,0x33,0x00,0x2f,0x01,0x34,0x01,0x35,0x01,0x36,0x01,0x37,0x00,0xe2,0x00,0x30,0x00,0x31,0x01,0x38,0x01,0x39,0x01,0x3a,0x01,0x3b,0x00,0x66,0x00,0x32,0x00,0xd0,0x01,0x3c, +0x00,0xd1,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01,0x40,0x01,0x41,0x00,0x67,0x01,0x42,0x00,0xd3,0x01,0x43,0x01,0x44,0x01,0x45,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x01,0x4b,0x01,0x4c,0x00,0x91,0x01,0x4d,0x00,0xaf,0x00,0xb0,0x00,0x33,0x00,0xed,0x00,0x34,0x00,0x35,0x01,0x4e,0x01,0x4f,0x01,0x50,0x00,0x36,0x01,0x51, +0x00,0xe4,0x00,0xfb,0x01,0x52,0x01,0x53,0x01,0x54,0x01,0x55,0x00,0x37,0x01,0x56,0x01,0x57,0x01,0x58,0x01,0x59,0x00,0x38,0x00,0xd4,0x01,0x5a,0x00,0xd5,0x00,0x68,0x01,0x5b,0x00,0xd6,0x01,0x5c,0x01,0x5d,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x61,0x01,0x62,0x01,0x63,0x01,0x64,0x01,0x65,0x01,0x66,0x01,0x67,0x00,0x39,0x00,0x3a, +0x01,0x68,0x01,0x69,0x01,0x6a,0x01,0x6b,0x00,0x3b,0x00,0x3c,0x00,0xeb,0x01,0x6c,0x00,0xbb,0x01,0x6d,0x01,0x6e,0x01,0x6f,0x01,0x70,0x01,0x71,0x00,0x3d,0x01,0x72,0x00,0xe6,0x01,0x73,0x01,0x74,0x01,0x75,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0x79,0x01,0x7a,0x01,0x7b,0x00,0x44,0x00,0x69,0x01,0x7c,0x01,0x7d,0x01,0x7e,0x01,0x7f, +0x01,0x80,0x01,0x81,0x01,0x82,0x00,0x6b,0x01,0x83,0x01,0x84,0x01,0x85,0x01,0x86,0x01,0x87,0x00,0x6c,0x01,0x88,0x00,0x6a,0x01,0x89,0x01,0x8a,0x01,0x8b,0x00,0x6e,0x00,0x6d,0x00,0xa0,0x01,0x8c,0x00,0x45,0x00,0x46,0x00,0xfe,0x01,0x00,0x00,0x6f,0x01,0x8d,0x01,0x8e,0x00,0x47,0x00,0xea,0x01,0x8f,0x01,0x01,0x00,0x48,0x00,0x70, +0x01,0x90,0x01,0x91,0x00,0x72,0x01,0x92,0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x00,0x73,0x01,0x97,0x01,0x98,0x00,0x71,0x01,0x99,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x00,0x49,0x00,0x4a,0x01,0x9e,0x00,0xf9,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0xa2,0x00,0x4b,0x01,0xa3,0x01,0xa4,0x00,0x4c,0x00,0xd7,0x00,0x74,0x01,0xa5, +0x01,0xa6,0x00,0x76,0x00,0x77,0x01,0xa7,0x01,0xa8,0x00,0x75,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x00,0x4d,0x01,0xad,0x01,0xae,0x00,0x4e,0x01,0xaf,0x01,0xb0,0x00,0x4f,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4,0x01,0xb5,0x00,0xe3,0x00,0x50,0x00,0x51,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x00,0x78,0x00,0x52, +0x00,0x79,0x01,0xbb,0x01,0xbc,0x00,0x7b,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x00,0x7c,0x01,0xc2,0x00,0x7a,0x01,0xc3,0x01,0xc4,0x01,0xc5,0x01,0xc6,0x01,0xc7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xcc,0x00,0xa1,0x01,0xcd,0x00,0x7d,0x00,0xb1,0x00,0x53,0x00,0xee,0x00,0x54,0x00,0x55,0x01,0xce,0x01,0xcf, +0x01,0xd0,0x00,0x56,0x01,0xd1,0x00,0xe5,0x00,0xfc,0x01,0xd2,0x01,0xd3,0x00,0x89,0x01,0xd4,0x00,0x57,0x01,0xd5,0x01,0xd6,0x01,0xd7,0x01,0xd8,0x00,0x58,0x00,0x7e,0x01,0xd9,0x01,0xda,0x00,0x80,0x00,0x81,0x01,0xdb,0x01,0xdc,0x01,0xdd,0x01,0xde,0x01,0xdf,0x00,0x7f,0x01,0xe0,0x01,0xe1,0x01,0xe2,0x01,0xe3,0x01,0xe4,0x01,0xe5, +0x01,0xe6,0x01,0xe7,0x01,0xe8,0x01,0xe9,0x01,0xea,0x01,0xeb,0x00,0x59,0x00,0x5a,0x01,0xec,0x01,0xed,0x01,0xee,0x01,0xef,0x00,0x5b,0x00,0x5c,0x00,0xec,0x01,0xf0,0x00,0xba,0x01,0xf1,0x01,0xf2,0x01,0xf3,0x01,0xf4,0x01,0xf5,0x00,0x5d,0x01,0xf6,0x00,0xe7,0x01,0xf7,0x01,0xf8,0x01,0xf9,0x01,0xfa,0x01,0xfb,0x01,0xfc,0x01,0xfd, +0x01,0xfe,0x01,0xff,0x02,0x00,0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x04,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x09,0x02,0x0a,0x02,0x0b,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x10,0x02,0x11,0x02,0x12,0x02,0x13,0x02,0x14,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x1a,0x02,0x1b,0x02,0x1c,0x02,0x1d, +0x02,0x1e,0x02,0x1f,0x02,0x20,0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x24,0x02,0x25,0x02,0x26,0x02,0x27,0x02,0x28,0x02,0x29,0x02,0x2a,0x02,0x2b,0x02,0x2c,0x02,0x2d,0x02,0x2e,0x02,0x2f,0x02,0x30,0x02,0x31,0x02,0x32,0x02,0x33,0x02,0x34,0x02,0x35,0x02,0x36,0x02,0x37,0x02,0x38,0x02,0x39,0x02,0x3a,0x02,0x3b,0x02,0x3c,0x02,0x3d, +0x02,0x3e,0x02,0x3f,0x02,0x40,0x00,0x9d,0x00,0x9e,0x02,0x41,0x02,0x42,0x02,0x43,0x02,0x44,0x02,0x45,0x02,0x46,0x02,0x47,0x02,0x48,0x02,0x49,0x02,0x4a,0x02,0x4b,0x02,0x4c,0x02,0x4d,0x02,0x4e,0x02,0x4f,0x02,0x50,0x02,0x51,0x02,0x52,0x02,0x53,0x02,0x54,0x02,0x55,0x02,0x56,0x02,0x57,0x02,0x58,0x02,0x59,0x02,0x5a,0x02,0x5b, +0x02,0x5c,0x02,0x5d,0x02,0x5e,0x02,0x5f,0x02,0x60,0x02,0x61,0x02,0x62,0x02,0x63,0x02,0x64,0x02,0x65,0x02,0x66,0x02,0x67,0x02,0x68,0x02,0x69,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6d,0x02,0x6e,0x02,0x6f,0x02,0x70,0x02,0x71,0x02,0x72,0x02,0x73,0x02,0x74,0x02,0x75,0x02,0x76,0x02,0x77,0x02,0x78,0x02,0x79,0x02,0x7a,0x02,0x7b, +0x02,0x7c,0x02,0x7d,0x02,0x7e,0x02,0x7f,0x02,0x80,0x02,0x81,0x02,0x82,0x02,0x83,0x02,0x84,0x02,0x85,0x02,0x86,0x02,0x87,0x02,0x88,0x02,0x89,0x02,0x8a,0x02,0x8b,0x02,0x8c,0x02,0x8d,0x02,0x8e,0x02,0x8f,0x02,0x90,0x02,0x91,0x02,0x92,0x02,0x93,0x02,0x94,0x02,0x95,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x99,0x02,0x9a,0x02,0x9b, +0x02,0x9c,0x02,0x9d,0x02,0x9e,0x02,0x9f,0x02,0xa0,0x02,0xa1,0x02,0xa2,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x02,0xa6,0x02,0xa7,0x02,0xa8,0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xac,0x02,0xad,0x02,0xae,0x02,0xaf,0x02,0xb0,0x02,0xb1,0x02,0xb2,0x02,0xb3,0x02,0xb4,0x02,0xb5,0x02,0xb6,0x02,0xb7,0x02,0xb8,0x02,0xb9,0x02,0xba,0x02,0xbb, +0x02,0xbc,0x02,0xbd,0x02,0xbe,0x02,0xbf,0x02,0xc0,0x02,0xc1,0x02,0xc2,0x02,0xc3,0x02,0xc4,0x02,0xc5,0x02,0xc6,0x02,0xc7,0x02,0xc8,0x02,0xc9,0x02,0xca,0x02,0xcb,0x02,0xcc,0x02,0xcd,0x02,0xce,0x02,0xcf,0x02,0xd0,0x02,0xd1,0x02,0xd2,0x02,0xd3,0x02,0xd4,0x02,0xd5,0x02,0xd6,0x02,0xd7,0x02,0xd8,0x02,0xd9,0x02,0xda,0x02,0xdb, +0x02,0xdc,0x02,0xdd,0x02,0xde,0x02,0xdf,0x02,0xe0,0x02,0xe1,0x02,0xe2,0x02,0xe3,0x02,0xe4,0x02,0xe5,0x02,0xe6,0x02,0xe7,0x02,0xe8,0x02,0xe9,0x02,0xea,0x02,0xeb,0x02,0xec,0x02,0xed,0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x02,0xf8,0x02,0xf9,0x02,0xfa,0x02,0xfb, +0x02,0xfc,0x00,0x9b,0x02,0xfd,0x02,0xfe,0x02,0xff,0x03,0x00,0x03,0x01,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,0x03,0x0a,0x03,0x0b,0x03,0x0c,0x03,0x0d,0x03,0x0e,0x03,0x0f,0x03,0x10,0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x1a, +0x03,0x1b,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x03,0x20,0x03,0x21,0x03,0x22,0x03,0x23,0x03,0x24,0x03,0x25,0x03,0x26,0x03,0x27,0x03,0x28,0x03,0x29,0x03,0x2a,0x03,0x2b,0x03,0x2c,0x03,0x2d,0x03,0x2e,0x03,0x2f,0x03,0x30,0x03,0x31,0x03,0x32,0x03,0x33,0x03,0x34,0x03,0x35,0x03,0x36,0x03,0x37,0x03,0x38,0x03,0x39,0x03,0x3a, +0x03,0x3b,0x03,0x3c,0x03,0x3d,0x03,0x3e,0x03,0x3f,0x03,0x40,0x03,0x41,0x03,0x42,0x03,0x43,0x03,0x44,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x49,0x03,0x4a,0x03,0x4b,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x03,0x4c,0x03,0x4d,0x03,0x4e,0x03,0x4f,0x03,0x50, +0x03,0x51,0x03,0x52,0x03,0x53,0x03,0x54,0x03,0x55,0x03,0x56,0x03,0x57,0x03,0x58,0x03,0x59,0x03,0x5a,0x03,0x5b,0x03,0x5c,0x03,0x5d,0x03,0x5e,0x03,0x5f,0x03,0x60,0x03,0x61,0x03,0x62,0x03,0x63,0x03,0x64,0x03,0x65,0x03,0x66,0x03,0x67,0x03,0x68,0x03,0x69,0x03,0x6a,0x03,0x6b,0x03,0x6c,0x03,0x6d,0x03,0x6e,0x03,0x6f,0x03,0x70, +0x03,0x71,0x03,0x72,0x03,0x73,0x03,0x74,0x03,0x75,0x03,0x76,0x03,0x77,0x03,0x78,0x03,0x79,0x03,0x7a,0x03,0x7b,0x03,0x7c,0x03,0x7d,0x03,0x7e,0x03,0x7f,0x03,0x80,0x03,0x81,0x03,0x82,0x03,0x83,0x03,0x84,0x03,0x85,0x03,0x86,0x03,0x87,0x03,0x88,0x03,0x89,0x03,0x8a,0x03,0x8b,0x03,0x8c,0x03,0x8d,0x00,0xbc,0x00,0xf4,0x00,0xf5, +0x00,0xf6,0x03,0x8e,0x03,0x8f,0x03,0x90,0x03,0x91,0x03,0x92,0x00,0x11,0x00,0x0f,0x00,0x1d,0x00,0x1e,0x00,0xab,0x00,0x04,0x00,0xa3,0x00,0x22,0x00,0xa2,0x00,0xc3,0x00,0x87,0x00,0x0d,0x03,0x93,0x03,0x94,0x03,0x95,0x03,0x96,0x03,0x97,0x00,0x06,0x03,0x98,0x03,0x99,0x00,0x12,0x00,0x3f,0x03,0x9a,0x03,0x9b,0x03,0x9c,0x03,0x9d, +0x00,0x0b,0x00,0x0c,0x00,0x5e,0x00,0x60,0x00,0x3e,0x00,0x40,0x03,0x9e,0x03,0x9f,0x03,0xa0,0x03,0xa1,0x03,0xa2,0x03,0xa3,0x03,0xa4,0x03,0xa5,0x03,0xa6,0x03,0xa7,0x03,0xa8,0x03,0xa9,0x03,0xaa,0x03,0xab,0x00,0x10,0x03,0xac,0x00,0xb2,0x00,0xb3,0x03,0xad,0x00,0x42,0x00,0xc4,0x00,0xc5,0x00,0xb4,0x00,0xb5,0x00,0xb6,0x00,0xb7, +0x03,0xae,0x03,0xaf,0x00,0xa9,0x00,0xaa,0x00,0xbe,0x00,0xbf,0x03,0xb0,0x00,0x05,0x00,0x0a,0x03,0xb1,0x03,0xb2,0x03,0xb3,0x03,0xb4,0x03,0xb5,0x03,0xb6,0x03,0xb7,0x03,0xb8,0x03,0xb9,0x03,0xba,0x03,0xbb,0x03,0xbc,0x03,0xbd,0x03,0xbe,0x03,0xbf,0x03,0xc0,0x03,0xc1,0x03,0xc2,0x03,0xc3,0x03,0xc4,0x03,0xc5,0x03,0xc6,0x03,0xc7, +0x03,0xc8,0x03,0xc9,0x03,0xca,0x03,0xcb,0x03,0xcc,0x03,0xcd,0x03,0xce,0x03,0xcf,0x03,0xd0,0x03,0xd1,0x03,0xd2,0x03,0xd3,0x03,0xd4,0x03,0xd5,0x03,0xd6,0x03,0xd7,0x03,0xd8,0x03,0xd9,0x03,0xda,0x03,0xdb,0x03,0xdc,0x03,0xdd,0x03,0xde,0x03,0xdf,0x03,0xe0,0x03,0xe1,0x03,0xe2,0x03,0xe3,0x03,0xe4,0x03,0xe5,0x03,0xe6,0x03,0xe7, +0x03,0xe8,0x03,0xe9,0x03,0xea,0x03,0xeb,0x03,0xec,0x03,0xed,0x03,0xee,0x03,0xef,0x03,0xf0,0x03,0xf1,0x03,0xf2,0x03,0xf3,0x03,0xf4,0x03,0xf5,0x03,0xf6,0x03,0xf7,0x03,0xf8,0x03,0xf9,0x03,0xfa,0x03,0xfb,0x03,0xfc,0x03,0xfd,0x03,0xfe,0x03,0xff,0x04,0x00,0x04,0x01,0x04,0x02,0x00,0x03,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x06, +0x00,0x84,0x00,0xbd,0x00,0x07,0x04,0x07,0x04,0x08,0x00,0xa6,0x04,0x09,0x04,0x0a,0x00,0x85,0x04,0x0b,0x00,0x96,0x04,0x0c,0x04,0x0d,0x04,0x0e,0x04,0x0f,0x04,0x10,0x04,0x11,0x04,0x12,0x04,0x13,0x04,0x14,0x04,0x15,0x04,0x16,0x04,0x17,0x04,0x18,0x04,0x19,0x04,0x1a,0x04,0x1b,0x04,0x1c,0x04,0x1d,0x04,0x1e,0x04,0x1f,0x04,0x20, +0x04,0x21,0x04,0x22,0x04,0x23,0x04,0x24,0x04,0x25,0x04,0x26,0x04,0x27,0x04,0x28,0x04,0x29,0x04,0x2a,0x04,0x2b,0x04,0x2c,0x04,0x2d,0x04,0x2e,0x04,0x2f,0x04,0x30,0x04,0x31,0x04,0x32,0x04,0x33,0x04,0x34,0x04,0x35,0x04,0x36,0x04,0x37,0x04,0x38,0x04,0x39,0x04,0x3a,0x04,0x3b,0x04,0x3c,0x04,0x3d,0x04,0x3e,0x04,0x3f,0x04,0x40, +0x04,0x41,0x04,0x42,0x04,0x43,0x04,0x44,0x04,0x45,0x04,0x46,0x04,0x47,0x04,0x48,0x04,0x49,0x04,0x4a,0x04,0x4b,0x04,0x4c,0x04,0x4d,0x04,0x4e,0x04,0x4f,0x04,0x50,0x04,0x51,0x04,0x52,0x00,0x0e,0x00,0xef,0x00,0xf0,0x00,0xb8,0x00,0x20,0x00,0x8f,0x00,0x21,0x00,0x1f,0x00,0x95,0x00,0x94,0x00,0x93,0x00,0xa7,0x00,0xa4,0x00,0x61, +0x00,0x41,0x00,0x92,0x04,0x53,0x04,0x54,0x04,0x55,0x04,0x56,0x04,0x57,0x00,0x9c,0x04,0x58,0x00,0x9a,0x00,0x99,0x00,0xa5,0x00,0x98,0x04,0x59,0x04,0x5a,0x04,0x5b,0x04,0x5c,0x04,0x5d,0x04,0x5e,0x04,0x5f,0x04,0x60,0x00,0x08,0x00,0xc6,0x04,0x61,0x04,0x62,0x04,0x63,0x04,0x64,0x04,0x65,0x04,0x66,0x04,0x67,0x04,0x68,0x04,0x69, +0x04,0x6a,0x04,0x6b,0x04,0x6c,0x04,0x6d,0x04,0x6e,0x04,0x6f,0x04,0x70,0x04,0x71,0x04,0x72,0x04,0x73,0x04,0x74,0x04,0x75,0x04,0x76,0x04,0x77,0x04,0x78,0x04,0x79,0x04,0x7a,0x04,0x7b,0x04,0x7c,0x04,0x7d,0x04,0x7e,0x04,0x7f,0x04,0x80,0x04,0x81,0x04,0x82,0x04,0x83,0x04,0x84,0x04,0x85,0x04,0x86,0x04,0x87,0x04,0x88,0x04,0x89, +0x04,0x8a,0x04,0x8b,0x04,0x8c,0x04,0x8d,0x04,0x8e,0x04,0x8f,0x04,0x90,0x04,0x91,0x04,0x92,0x04,0x93,0x04,0x94,0x04,0x95,0x04,0x96,0x04,0x97,0x04,0x98,0x04,0x99,0x04,0x9a,0x04,0x9b,0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xa2,0x04,0xa3,0x04,0xa4,0x04,0xa5,0x04,0xa6,0x04,0xa7,0x04,0xa8,0x04,0xa9, +0x04,0xaa,0x04,0xab,0x04,0xac,0x04,0xad,0x04,0xae,0x04,0xaf,0x04,0xb0,0x04,0xb1,0x04,0xb2,0x04,0xb3,0x04,0xb4,0x04,0xb5,0x04,0xb6,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xba,0x04,0xbb,0x04,0xbc,0x04,0xbd,0x04,0xbe,0x04,0xbf,0x04,0xc0,0x04,0xc1,0x04,0xc2,0x04,0xc3,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc7,0x04,0xc8,0x04,0xc9, +0x04,0xca,0x04,0xcb,0x04,0xcc,0x04,0xcd,0x04,0xce,0x04,0xcf,0x04,0xd0,0x04,0xd1,0x04,0xd2,0x04,0xd3,0x04,0xd4,0x04,0xd5,0x04,0xd6,0x04,0xd7,0x04,0xd8,0x04,0xd9,0x04,0xda,0x04,0xdb,0x04,0xdc,0x04,0xdd,0x04,0xde,0x04,0xdf,0x04,0xe0,0x04,0xe1,0x04,0xe2,0x04,0xe3,0x04,0xe4,0x04,0xe5,0x04,0xe6,0x04,0xe7,0x04,0xe8,0x04,0xe9, +0x04,0xea,0x04,0xeb,0x04,0xec,0x04,0xed,0x00,0xb9,0x04,0xee,0x04,0xef,0x04,0xf0,0x04,0xf1,0x04,0xf2,0x04,0xf3,0x04,0xf4,0x04,0xf5,0x04,0xf6,0x04,0xf7,0x04,0xf8,0x04,0xf9,0x04,0xfa,0x04,0xfb,0x04,0xfc,0x04,0xfd,0x04,0xfe,0x04,0xff,0x05,0x00,0x05,0x01,0x05,0x02,0x05,0x03,0x05,0x04,0x05,0x05,0x05,0x06,0x05,0x07,0x05,0x08, +0x05,0x09,0x05,0x0a,0x05,0x0b,0x05,0x0c,0x05,0x0d,0x05,0x0e,0x05,0x0f,0x05,0x10,0x05,0x11,0x05,0x12,0x05,0x13,0x05,0x14,0x05,0x15,0x05,0x16,0x05,0x17,0x05,0x18,0x05,0x19,0x05,0x1a,0x05,0x1b,0x05,0x1c,0x05,0x1d,0x05,0x1e,0x05,0x1f,0x05,0x20,0x05,0x21,0x05,0x22,0x05,0x23,0x05,0x24,0x05,0x25,0x05,0x26,0x05,0x27,0x05,0x28, +0x05,0x29,0x05,0x2a,0x05,0x2b,0x05,0x2c,0x05,0x2d,0x05,0x2e,0x05,0x2f,0x05,0x30,0x05,0x31,0x05,0x32,0x05,0x33,0x05,0x34,0x05,0x35,0x05,0x36,0x05,0x37,0x05,0x38,0x05,0x39,0x05,0x3a,0x05,0x3b,0x05,0x3c,0x05,0x3d,0x05,0x3e,0x05,0x3f,0x05,0x40,0x05,0x41,0x05,0x42,0x05,0x43,0x05,0x44,0x05,0x45,0x05,0x46,0x05,0x47,0x05,0x48, +0x05,0x49,0x05,0x4a,0x05,0x4b,0x05,0x4c,0x05,0x4d,0x05,0x4e,0x05,0x4f,0x05,0x50,0x05,0x51,0x05,0x52,0x05,0x53,0x05,0x54,0x05,0x55,0x05,0x56,0x05,0x57,0x05,0x58,0x05,0x59,0x05,0x5a,0x05,0x5b,0x05,0x5c,0x05,0x5d,0x05,0x5e,0x05,0x5f,0x05,0x60,0x05,0x61,0x05,0x62,0x05,0x63,0x05,0x64,0x05,0x65,0x05,0x66,0x05,0x67,0x05,0x68, +0x05,0x69,0x05,0x6a,0x05,0x6b,0x05,0x6c,0x05,0x6d,0x05,0x6e,0x05,0x6f,0x05,0x70,0x05,0x71,0x05,0x72,0x05,0x73,0x05,0x74,0x05,0x75,0x05,0x76,0x05,0x77,0x05,0x78,0x05,0x79,0x05,0x7a,0x05,0x7b,0x05,0x7c,0x05,0x7d,0x05,0x7e,0x05,0x7f,0x05,0x80,0x05,0x81,0x05,0x82,0x05,0x83,0x05,0x84,0x05,0x85,0x05,0x86,0x05,0x87,0x05,0x88, +0x05,0x89,0x05,0x8a,0x05,0x8b,0x05,0x8c,0x05,0x8d,0x05,0x8e,0x05,0x8f,0x05,0x90,0x05,0x91,0x05,0x92,0x05,0x93,0x05,0x94,0x05,0x95,0x05,0x96,0x05,0x97,0x05,0x98,0x05,0x99,0x05,0x9a,0x05,0x9b,0x05,0x9c,0x05,0x9d,0x05,0x9e,0x05,0x9f,0x05,0xa0,0x05,0xa1,0x05,0xa2,0x05,0xa3,0x05,0xa4,0x05,0xa5,0x05,0xa6,0x05,0xa7,0x05,0xa8, +0x05,0xa9,0x05,0xaa,0x05,0xab,0x05,0xac,0x05,0xad,0x05,0xae,0x05,0xaf,0x05,0xb0,0x05,0xb1,0x05,0xb2,0x05,0xb3,0x05,0xb4,0x05,0xb5,0x05,0xb6,0x05,0xb7,0x05,0xb8,0x05,0xb9,0x05,0xba,0x05,0xbb,0x05,0xbc,0x05,0xbd,0x05,0xbe,0x05,0xbf,0x05,0xc0,0x05,0xc1,0x05,0xc2,0x05,0xc3,0x05,0xc4,0x05,0xc5,0x05,0xc6,0x05,0xc7,0x05,0xc8, +0x05,0xc9,0x05,0xca,0x05,0xcb,0x05,0xcc,0x05,0xcd,0x05,0xce,0x05,0xcf,0x05,0xd0,0x05,0xd1,0x05,0xd2,0x05,0xd3,0x05,0xd4,0x05,0xd5,0x05,0xd6,0x05,0xd7,0x05,0xd8,0x05,0xd9,0x00,0x23,0x00,0x09,0x00,0x88,0x00,0x86,0x00,0x8b,0x00,0x8a,0x00,0x8c,0x00,0x83,0x05,0xda,0x05,0xdb,0x00,0x5f,0x00,0xe8,0x00,0x82,0x05,0xdc,0x00,0xc2, +0x05,0xdd,0x05,0xde,0x05,0xdf,0x05,0xe0,0x05,0xe1,0x05,0xe2,0x05,0xe3,0x05,0xe4,0x05,0xe5,0x05,0xe6,0x05,0xe7,0x05,0xe8,0x05,0xe9,0x05,0xea,0x05,0xeb,0x05,0xec,0x05,0xed,0x05,0xee,0x05,0xef,0x05,0xf0,0x05,0xf1,0x05,0xf2,0x05,0xf3,0x05,0xf4,0x05,0xf5,0x05,0xf6,0x05,0xf7,0x05,0xf8,0x05,0xf9,0x05,0xfa,0x05,0xfb,0x05,0xfc, +0x05,0xfd,0x05,0xfe,0x05,0xff,0x06,0x00,0x06,0x01,0x06,0x02,0x06,0x03,0x06,0x04,0x06,0x05,0x06,0x06,0x06,0x07,0x06,0x08,0x06,0x09,0x06,0x0a,0x06,0x0b,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x06,0x0f,0x06,0x10,0x06,0x11,0x06,0x12,0x06,0x13,0x06,0x14,0x06,0x15,0x06,0x16,0x06,0x17,0x06,0x18,0x06,0x19,0x06,0x1a,0x06,0x1b,0x06,0x1c, +0x06,0x1d,0x06,0x1e,0x06,0x1f,0x06,0x20,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x25,0x06,0x26,0x06,0x27,0x06,0x28,0x06,0x29,0x06,0x2a,0x06,0x2b,0x06,0x2c,0x06,0x2d,0x06,0x2e,0x06,0x2f,0x06,0x30,0x06,0x31,0x06,0x32,0x06,0x33,0x06,0x34,0x06,0x35,0x06,0x36,0x06,0x37,0x06,0x38,0x06,0x39,0x06,0x3a,0x06,0x3b,0x06,0x3c, +0x06,0x3d,0x06,0x3e,0x06,0x3f,0x06,0x40,0x06,0x41,0x06,0x42,0x06,0x43,0x06,0x44,0x06,0x45,0x06,0x46,0x06,0x47,0x06,0x48,0x06,0x49,0x06,0x4a,0x06,0x4b,0x06,0x4c,0x06,0x4d,0x06,0x4e,0x06,0x4f,0x06,0x50,0x06,0x51,0x06,0x52,0x06,0x53,0x06,0x54,0x06,0x55,0x06,0x56,0x06,0x57,0x06,0x58,0x06,0x59,0x06,0x5a,0x06,0x5b,0x06,0x5c, +0x06,0x5d,0x06,0x5e,0x06,0x5f,0x06,0x60,0x06,0x61,0x06,0x62,0x06,0x63,0x06,0x64,0x06,0x65,0x06,0x66,0x06,0x67,0x06,0x68,0x06,0x69,0x06,0x6a,0x06,0x6b,0x06,0x6c,0x06,0x6d,0x06,0x6e,0x06,0x6f,0x06,0x70,0x06,0x71,0x06,0x72,0x06,0x73,0x06,0x74,0x06,0x75,0x06,0x76,0x06,0x77,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x7c, +0x06,0x7d,0x06,0x7e,0x06,0x7f,0x06,0x80,0x06,0x81,0x06,0x82,0x06,0x83,0x06,0x84,0x06,0x85,0x06,0x86,0x06,0x87,0x06,0x88,0x06,0x89,0x06,0x8a,0x06,0x8b,0x06,0x8c,0x06,0x8d,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x00,0x8e,0x00,0xdc,0x00,0x43, +0x00,0x8d,0x00,0xdf,0x00,0xd8,0x00,0xe1,0x00,0xdb,0x00,0xdd,0x00,0xd9,0x00,0xda,0x00,0xde,0x00,0xe0,0x06,0x9a,0x06,0x9b,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa3,0x06,0xa4,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf, +0x06,0xb0,0x06,0xb1,0x06,0xb2,0x06,0xb3,0x06,0xb4,0x06,0xb5,0x06,0xb6,0x06,0xb7,0x06,0xb8,0x06,0xb9,0x06,0xba,0x06,0xbb,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x06,0xc4,0x06,0xc5,0x06,0xc6,0x06,0xc7,0x06,0xc8,0x06,0xc9,0x06,0xca,0x06,0xcb,0x06,0xcc,0x06,0xcd,0x06,0xce,0x06,0xcf, +0x06,0xd0,0x06,0xd1,0x06,0xd2,0x06,0xd3,0x06,0xd4,0x06,0xd5,0x06,0xd6,0x06,0xd7,0x06,0xd8,0x06,0xd9,0x06,0xda,0x06,0xdb,0x06,0x41,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x32,0x07, +0x75,0x6e,0x69,0x31,0x45,0x42,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x30,0x07, +0x75,0x6e,0x69,0x31,0x45,0x41,0x32,0x07,0x41,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x41,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x41,0x45,0x61,0x63,0x75,0x74,0x65,0x0b,0x43,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0a,0x43,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x44,0x63,0x61,0x72,0x6f,0x6e,0x06,0x44,0x63, +0x72,0x6f,0x61,0x74,0x06,0x45,0x62,0x72,0x65,0x76,0x65,0x06,0x45,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x34,0x0a,0x45,0x64,0x6f,0x74,0x61, +0x63,0x63,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x41,0x07,0x45,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x45,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x34,0x06,0x47,0x63, +0x61,0x72,0x6f,0x6e,0x0b,0x47,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x32,0x32,0x0a,0x47,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x04,0x48,0x62,0x61,0x72,0x0b,0x48,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x06,0x49,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31, +0x45,0x43,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x38,0x07,0x49,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x49,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x06,0x49,0x74,0x69,0x6c,0x64,0x65,0x0b,0x4a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x36,0x06,0x4c,0x61,0x63,0x75,0x74,0x65,0x06,0x4c,0x63, +0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x42,0x04,0x4c,0x64,0x6f,0x74,0x06,0x4e,0x61,0x63,0x75,0x74,0x65,0x06,0x4e,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x34,0x35,0x03,0x45,0x6e,0x67,0x06,0x4f,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x30,0x07,0x75,0x6e,0x69,0x31,0x45, +0x44,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x45,0x05,0x4f,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x32, +0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x30,0x0d,0x4f,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x4f,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x41,0x0b,0x4f,0x73,0x6c,0x61,0x73,0x68,0x61,0x63,0x75, +0x74,0x65,0x06,0x52,0x61,0x63,0x75,0x74,0x65,0x06,0x52,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x35,0x36,0x06,0x53,0x61,0x63,0x75,0x74,0x65,0x0b,0x53,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x45,0x07,0x75,0x6e,0x69,0x30, +0x31,0x38,0x46,0x04,0x54,0x62,0x61,0x72,0x06,0x54,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x36,0x32,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x41,0x06,0x55,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x36,0x05,0x55,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69, +0x31,0x45,0x45,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x45,0x0d,0x55,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x55,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x55,0x6f,0x67,0x6f,0x6e, +0x65,0x6b,0x05,0x55,0x72,0x69,0x6e,0x67,0x06,0x55,0x74,0x69,0x6c,0x64,0x65,0x06,0x57,0x61,0x63,0x75,0x74,0x65,0x0b,0x57,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x09,0x57,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x06,0x57,0x67,0x72,0x61,0x76,0x65,0x0b,0x59,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07, +0x75,0x6e,0x69,0x31,0x45,0x46,0x34,0x06,0x59,0x67,0x72,0x61,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x36,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x38,0x06,0x5a,0x61,0x63,0x75,0x74,0x65,0x0a,0x5a,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x57,0x2e,0x63,0x76,0x30,0x37,0x0b, +0x57,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x37,0x10,0x57,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x37,0x0e,0x57,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x30,0x37,0x0b,0x57,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x30,0x37,0x06,0x4b,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75, +0x6e,0x69,0x30,0x31,0x33,0x36,0x2e,0x63,0x76,0x30,0x38,0x06,0x51,0x2e,0x63,0x76,0x31,0x36,0x06,0x61,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x42, +0x35,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x41, +0x33,0x07,0x61,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x61,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x61,0x65,0x61,0x63,0x75,0x74,0x65,0x0b,0x63,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0a,0x63,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x64,0x63,0x61,0x72,0x6f,0x6e,0x06,0x65,0x62,0x72,0x65,0x76,0x65,0x06,0x65, +0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x35,0x0a,0x65,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x39, +0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x42,0x07,0x65,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x65,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x39,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x35,0x06,0x67,0x63,0x61,0x72,0x6f,0x6e,0x0b,0x67,0x63,0x69,0x72,0x63,0x75,0x6d,0x66, +0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x32,0x33,0x0a,0x67,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x04,0x68,0x62,0x61,0x72,0x0b,0x68,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x06,0x69,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x30,0x09,0x69,0x2e,0x6c,0x6f,0x63,0x6c,0x54,0x52,0x4b, +0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x39,0x07,0x69,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x69,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x06,0x69,0x74,0x69,0x6c,0x64,0x65,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x37,0x0b,0x6a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30, +0x31,0x33,0x37,0x0c,0x6b,0x67,0x72,0x65,0x65,0x6e,0x6c,0x61,0x6e,0x64,0x69,0x63,0x06,0x6c,0x61,0x63,0x75,0x74,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x42,0x06,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x43,0x04,0x6c,0x64,0x6f,0x74,0x06,0x6e,0x61,0x63,0x75,0x74,0x65,0x0b,0x6e,0x61,0x70,0x6f,0x73, +0x74,0x72,0x6f,0x70,0x68,0x65,0x06,0x6e,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x34,0x36,0x03,0x65,0x6e,0x67,0x06,0x6f,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x33, +0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x46,0x05,0x6f,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x44,0x07,0x75, +0x6e,0x69,0x31,0x45,0x44,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x31,0x0d,0x6f,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x6f,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x42,0x0b,0x6f,0x73,0x6c,0x61,0x73,0x68,0x61,0x63,0x75,0x74,0x65,0x06,0x72,0x61,0x63,0x75,0x74,0x65,0x06, +0x72,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x35,0x37,0x06,0x73,0x61,0x63,0x75,0x74,0x65,0x0b,0x73,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x39,0x05,0x6c,0x6f,0x6e,0x67,0x73,0x04,0x74,0x62,0x61,0x72,0x06,0x74,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30, +0x31,0x36,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x42,0x06,0x75,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x41,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x36,0x07,0x75,0x6e,0x69,0x31,0x45, +0x45,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x37,0x05,0x75,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x46,0x0d,0x75,0x68,0x75,0x6e,0x67,0x61,0x72, +0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x75,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x05,0x75,0x72,0x69,0x6e,0x67,0x06,0x75,0x74,0x69,0x6c,0x64,0x65,0x06,0x77,0x61,0x63,0x75,0x74,0x65,0x0b,0x77,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x09,0x77,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73, +0x06,0x77,0x67,0x72,0x61,0x76,0x65,0x0b,0x79,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x35,0x06,0x79,0x67,0x72,0x61,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x39,0x06,0x7a,0x61,0x63,0x75,0x74, +0x65,0x0a,0x7a,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x0f,0x67,0x65,0x72,0x6d,0x61,0x6e,0x64,0x62,0x6c,0x73,0x2e,0x63,0x61,0x6c,0x74,0x06,0x6c,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x31,0x0c,0x75,0x6e,0x69,0x30, +0x31,0x33,0x43,0x2e,0x63,0x76,0x30,0x31,0x09,0x6c,0x64,0x6f,0x74,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x73,0x6c,0x61,0x73,0x68,0x2e,0x63,0x76,0x30,0x31,0x06,0x74,0x2e,0x63,0x76,0x30,0x32,0x09,0x74,0x62,0x61,0x72,0x2e,0x63,0x76,0x30,0x32,0x0b,0x74,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x32,0x0c,0x75,0x6e,0x69,0x30, +0x31,0x36,0x33,0x2e,0x63,0x76,0x30,0x32,0x0c,0x75,0x6e,0x69,0x30,0x32,0x31,0x42,0x2e,0x63,0x76,0x30,0x32,0x06,0x67,0x2e,0x63,0x76,0x30,0x33,0x0c,0x75,0x6e,0x69,0x30,0x31,0x46,0x35,0x2e,0x63,0x76,0x30,0x33,0x0b,0x67,0x62,0x72,0x65,0x76,0x65,0x2e,0x63,0x76,0x30,0x33,0x0b,0x67,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30, +0x33,0x10,0x67,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x33,0x0c,0x75,0x6e,0x69,0x30,0x31,0x32,0x33,0x2e,0x63,0x76,0x30,0x33,0x0f,0x67,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x2e,0x63,0x76,0x30,0x33,0x06,0x6a,0x2e,0x63,0x76,0x30,0x34,0x0c,0x75,0x6e,0x69,0x30,0x32,0x33,0x37,0x2e,0x63, +0x76,0x30,0x34,0x10,0x6a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x34,0x06,0x6c,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x35,0x0c,0x75,0x6e,0x69,0x30,0x31,0x33,0x43,0x2e,0x63,0x76,0x30,0x35, +0x09,0x6c,0x64,0x6f,0x74,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x73,0x6c,0x61,0x73,0x68,0x2e,0x63,0x76,0x30,0x35,0x06,0x6d,0x2e,0x63,0x76,0x30,0x36,0x06,0x77,0x2e,0x63,0x76,0x30,0x37,0x0b,0x77,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x37,0x10,0x77,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30, +0x37,0x0e,0x77,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x30,0x37,0x0b,0x77,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x30,0x37,0x06,0x6b,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x31,0x33,0x37,0x2e,0x63,0x76,0x30,0x38,0x11,0x6b,0x67,0x72,0x65,0x65,0x6e,0x6c,0x61,0x6e,0x64,0x69,0x63,0x2e,0x63,0x76, +0x30,0x38,0x06,0x66,0x2e,0x63,0x76,0x30,0x39,0x06,0x72,0x2e,0x63,0x76,0x31,0x30,0x0b,0x72,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x30,0x0b,0x72,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x31,0x30,0x0c,0x75,0x6e,0x69,0x30,0x31,0x35,0x37,0x2e,0x63,0x76,0x31,0x30,0x06,0x79,0x2e,0x63,0x76,0x31,0x31,0x0b,0x79,0x61,0x63, +0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x31,0x10,0x79,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x31,0x31,0x0e,0x79,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x35,0x2e,0x63,0x76,0x31,0x31,0x0b,0x79,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x31, +0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x37,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x32,0x33,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x39,0x2e,0x63,0x76,0x31,0x31,0x06,0x75,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x62,0x72,0x65, +0x76,0x65,0x2e,0x63,0x76,0x31,0x32,0x10,0x75,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x31,0x32,0x0e,0x75,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x35,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x31,0x32, +0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x37,0x2e,0x63,0x76,0x31,0x32,0x0a,0x75,0x68,0x6f,0x72,0x6e,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x39,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x31,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x42,0x2e,0x63,0x76,0x31,0x32,0x0c, +0x75,0x6e,0x69,0x31,0x45,0x45,0x44,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x46,0x2e,0x63,0x76,0x31,0x32,0x12,0x75,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6f,0x67,0x6f,0x6e,0x65, +0x6b,0x2e,0x63,0x76,0x31,0x32,0x0a,0x75,0x72,0x69,0x6e,0x67,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x74,0x69,0x6c,0x64,0x65,0x2e,0x63,0x76,0x31,0x32,0x06,0x66,0x2e,0x63,0x76,0x31,0x37,0x0b,0x66,0x2e,0x63,0x76,0x30,0x39,0x2e,0x73,0x73,0x32,0x30,0x06,0x66,0x2e,0x73,0x73,0x32,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x30,0x07, +0x75,0x6e,0x69,0x30,0x34,0x31,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x31,0x07, +0x75,0x6e,0x69,0x30,0x34,0x31,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x43,0x07, +0x75,0x6e,0x69,0x30,0x34,0x31,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x45,0x07, +0x75,0x6e,0x69,0x30,0x34,0x32,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x43,0x07, +0x75,0x6e,0x69,0x30,0x34,0x32,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x36,0x07, +0x75,0x6e,0x69,0x30,0x34,0x30,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x41,0x07, +0x75,0x6e,0x69,0x30,0x34,0x41,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x45,0x07, +0x75,0x6e,0x69,0x30,0x34,0x45,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x34,0x0c,0x75,0x6e,0x69,0x30,0x34,0x31,0x36,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x31,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x30, +0x43,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x39,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x32,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x30,0x45,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x32,0x31,0x2e,0x63,0x76,0x39,0x39,0x07,0x75,0x6e,0x69,0x30,0x34, +0x33,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x35,0x07,0x75,0x6e,0x69,0x30,0x34, +0x35,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x42,0x07,0x75,0x6e,0x69,0x30,0x34, +0x33,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x33,0x07,0x75,0x6e,0x69,0x30,0x34, +0x35,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x46,0x07,0x75,0x6e,0x69,0x30,0x34, +0x34,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x44,0x07,0x75,0x6e,0x69,0x30,0x34, +0x35,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x33,0x07,0x75,0x6e,0x69,0x30,0x34, +0x39,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x44,0x07,0x75,0x6e,0x69,0x30,0x34, +0x44,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x35,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x38,0x2e,0x63,0x76,0x30,0x34,0x0c,0x75,0x6e,0x69,0x30,0x34,0x33,0x36,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69, +0x30,0x34,0x33,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x43,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x39,0x42,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x34,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x45,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e, +0x69,0x30,0x34,0x34,0x31,0x2e,0x63,0x76,0x39,0x39,0x05,0x41,0x6c,0x70,0x68,0x61,0x04,0x42,0x65,0x74,0x61,0x05,0x47,0x61,0x6d,0x6d,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x39,0x34,0x07,0x45,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x04,0x5a,0x65,0x74,0x61,0x03,0x45,0x74,0x61,0x05,0x54,0x68,0x65,0x74,0x61,0x04,0x49,0x6f,0x74,0x61,0x05, +0x4b,0x61,0x70,0x70,0x61,0x06,0x4c,0x61,0x6d,0x62,0x64,0x61,0x02,0x4d,0x75,0x02,0x4e,0x75,0x02,0x58,0x69,0x07,0x4f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x02,0x50,0x69,0x03,0x52,0x68,0x6f,0x05,0x53,0x69,0x67,0x6d,0x61,0x03,0x54,0x61,0x75,0x07,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x03,0x50,0x68,0x69,0x03,0x43,0x68,0x69,0x03,0x50, +0x73,0x69,0x07,0x75,0x6e,0x69,0x30,0x33,0x41,0x39,0x0a,0x41,0x6c,0x70,0x68,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x45,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x08,0x45,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x09,0x49,0x6f,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x4f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x74,0x6f,0x6e, +0x6f,0x73,0x0c,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x4f,0x6d,0x65,0x67,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x49,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x0f,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x07,0x75,0x6e,0x69,0x30,0x33,0x43,0x46,0x0a, +0x4b,0x61,0x70,0x70,0x61,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x33,0x43,0x46,0x2e,0x63,0x76,0x30,0x38,0x05,0x61,0x6c,0x70,0x68,0x61,0x04,0x62,0x65,0x74,0x61,0x05,0x67,0x61,0x6d,0x6d,0x61,0x05,0x64,0x65,0x6c,0x74,0x61,0x07,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x04,0x7a,0x65,0x74,0x61,0x03,0x65,0x74,0x61,0x05, +0x74,0x68,0x65,0x74,0x61,0x04,0x69,0x6f,0x74,0x61,0x05,0x6b,0x61,0x70,0x70,0x61,0x06,0x6c,0x61,0x6d,0x62,0x64,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x42,0x43,0x02,0x6e,0x75,0x02,0x78,0x69,0x07,0x6f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x03,0x72,0x68,0x6f,0x07,0x75,0x6e,0x69,0x30,0x33,0x43,0x32,0x05,0x73,0x69,0x67,0x6d,0x61,0x03, +0x74,0x61,0x75,0x07,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x03,0x70,0x68,0x69,0x03,0x63,0x68,0x69,0x03,0x70,0x73,0x69,0x05,0x6f,0x6d,0x65,0x67,0x61,0x09,0x69,0x6f,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x69,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x11,0x69,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69, +0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x0f,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x14,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x6f,0x6d,0x69,0x63,0x72,0x6f,0x6e, +0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x6f,0x6d,0x65,0x67,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x61,0x6c,0x70,0x68,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x08,0x65,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x44, +0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x36,0x0a,0x6b,0x61,0x70,0x70,0x61,0x2e,0x63,0x76,0x30,0x38,0x0a,0x67,0x61,0x6d,0x6d,0x61,0x2e,0x63,0x76,0x31,0x31,0x0b,0x6c,0x61,0x6d,0x62,0x64,0x61,0x2e,0x63,0x76,0x31,0x31,0x06,0x75,0x31,0x36,0x39,0x31,0x30,0x06,0x75,0x31,0x44,0x35,0x33,0x38,0x06,0x75,0x31,0x44,0x35,0x33,0x39, +0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x32,0x06,0x75,0x31,0x44,0x35,0x33,0x42,0x06,0x75,0x31,0x44,0x35,0x33,0x43,0x06,0x75,0x31,0x44,0x35,0x33,0x44,0x06,0x75,0x31,0x44,0x35,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x30,0x06,0x75,0x31,0x44,0x35,0x34,0x31,0x06,0x75,0x31,0x44,0x35,0x34, +0x32,0x06,0x75,0x31,0x44,0x35,0x34,0x33,0x06,0x75,0x31,0x44,0x35,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x35,0x06,0x75,0x31,0x44,0x35,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x41,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x41,0x06,0x75,0x31, +0x44,0x35,0x34,0x42,0x06,0x75,0x31,0x44,0x35,0x34,0x43,0x06,0x75,0x31,0x44,0x35,0x34,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x45,0x06,0x75,0x31,0x44,0x35,0x34,0x46,0x06,0x75,0x31,0x44,0x35,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x32,0x34,0x06,0x75,0x31,0x44,0x35,0x35,0x32,0x06,0x75,0x31,0x44,0x35,0x35,0x33,0x06,0x75,0x31, +0x44,0x35,0x35,0x34,0x06,0x75,0x31,0x44,0x35,0x35,0x35,0x06,0x75,0x31,0x44,0x35,0x35,0x36,0x06,0x75,0x31,0x44,0x35,0x35,0x37,0x06,0x75,0x31,0x44,0x35,0x35,0x38,0x06,0x75,0x31,0x44,0x35,0x35,0x39,0x06,0x75,0x31,0x44,0x35,0x35,0x41,0x06,0x75,0x31,0x44,0x35,0x35,0x42,0x06,0x75,0x31,0x44,0x35,0x35,0x43,0x06,0x75,0x31,0x44, +0x35,0x35,0x44,0x06,0x75,0x31,0x44,0x35,0x35,0x45,0x06,0x75,0x31,0x44,0x35,0x35,0x46,0x06,0x75,0x31,0x44,0x35,0x36,0x30,0x06,0x75,0x31,0x44,0x35,0x36,0x31,0x06,0x75,0x31,0x44,0x35,0x36,0x32,0x06,0x75,0x31,0x44,0x35,0x36,0x33,0x06,0x75,0x31,0x44,0x35,0x36,0x34,0x06,0x75,0x31,0x44,0x35,0x36,0x35,0x06,0x75,0x31,0x44,0x35, +0x36,0x36,0x06,0x75,0x31,0x44,0x35,0x36,0x37,0x06,0x75,0x31,0x44,0x35,0x36,0x38,0x06,0x75,0x31,0x44,0x35,0x36,0x39,0x06,0x75,0x31,0x44,0x35,0x36,0x41,0x06,0x75,0x31,0x44,0x35,0x36,0x42,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x7a,0x65,0x72,0x6f,0x08,0x74,0x77,0x6f,0x2e,0x63,0x76,0x31,0x38,0x08,0x73,0x69,0x78,0x2e,0x63,0x76,0x31, +0x38,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x63,0x76,0x31,0x38,0x0a,0x65,0x69,0x67,0x68,0x74,0x2e,0x63,0x76,0x31,0x39,0x09,0x66,0x69,0x76,0x65,0x2e,0x63,0x76,0x32,0x30,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x30,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x33, +0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x39,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x08,0x6f,0x6e,0x65,0x2e,0x64, +0x6e,0x6f,0x6d,0x08,0x74,0x77,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x0a,0x74,0x68,0x72,0x65,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x66,0x6f,0x75,0x72,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x66,0x69,0x76,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x08,0x73,0x69,0x78,0x2e,0x64,0x6e,0x6f,0x6d,0x0a,0x73,0x65,0x76,0x65,0x6e,0x2e,0x64,0x6e,0x6f,0x6d,0x0a, +0x65,0x69,0x67,0x68,0x74,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x6f,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x74,0x77,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x74,0x68,0x72,0x65,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x09,0x66,0x6f,0x75,0x72, +0x2e,0x6e,0x75,0x6d,0x72,0x09,0x66,0x69,0x76,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x73,0x69,0x78,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x73,0x65,0x76,0x65,0x6e,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x65,0x69,0x67,0x68,0x74,0x2e,0x6e,0x75,0x6d,0x72,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x30, +0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x39,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x32,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x33,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x38, +0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x32,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x36,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x39,0x2e,0x63,0x76,0x31,0x38,0x0d,0x74,0x77,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0d,0x73,0x69, +0x78,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0e,0x6e,0x69,0x6e,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0d,0x74,0x77,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x38,0x0d,0x73,0x69,0x78,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x38,0x0e,0x6e,0x69,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72, +0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x30,0x30,0x42,0x32,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x36,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x39,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x38,0x2e,0x63,0x76,0x31,0x39,0x0f,0x65,0x69,0x67,0x68,0x74,0x2e, +0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x39,0x0f,0x65,0x69,0x67,0x68,0x74,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x38,0x2e,0x63,0x76,0x31,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x35,0x2e,0x63,0x76,0x32,0x30,0x0e,0x66,0x69,0x76,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76, +0x32,0x30,0x0e,0x66,0x69,0x76,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x32,0x30,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x35,0x2e,0x63,0x76,0x32,0x30,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x30,0x2e,0x7a,0x65,0x72,0x6f,0x0e,0x7a,0x65,0x72,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x7a,0x65,0x72,0x6f,0x0e,0x7a,0x65,0x72,0x6f,0x2e, +0x6e,0x75,0x6d,0x72,0x2e,0x7a,0x65,0x72,0x6f,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x30,0x2e,0x7a,0x65,0x72,0x6f,0x07,0x75,0x6e,0x69,0x30,0x41,0x45,0x41,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x36,0x09,0x65,0x78,0x63,0x6c,0x61,0x6d,0x64,0x62,0x6c, +0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x44,0x0e,0x6f,0x6e,0x65,0x64,0x6f,0x74,0x65,0x6e,0x6c,0x65,0x61,0x64,0x65,0x72,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x46,0x0a,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x1b,0x70,0x65,0x72,0x69,0x6f,0x64,0x63,0x65,0x6e,0x74,0x65,0x72,0x65, +0x64,0x2e,0x6c,0x6f,0x63,0x6c,0x43,0x41,0x54,0x2e,0x63,0x61,0x73,0x65,0x16,0x70,0x65,0x72,0x69,0x6f,0x64,0x63,0x65,0x6e,0x74,0x65,0x72,0x65,0x64,0x2e,0x6c,0x6f,0x63,0x6c,0x43,0x41,0x54,0x07,0x75,0x6e,0x69,0x46,0x46,0x35,0x42,0x07,0x75,0x6e,0x69,0x46,0x46,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x30,0x07,0x75,0x6e, +0x69,0x32,0x37,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x43,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x42,0x07,0x75,0x6e, +0x69,0x32,0x37,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x39,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x39,0x38,0x38,0x07,0x75,0x6e,0x69,0x30,0x30,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x30,0x0d,0x71,0x75,0x6f,0x74,0x65,0x72,0x65,0x76,0x65,0x72,0x73,0x65,0x64,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x46,0x07,0x75,0x6e,0x69,0x32, +0x30,0x33,0x34,0x12,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x19,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x28,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x62, +0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x62,0x61,0x72,0x2e, +0x6c,0x69,0x67,0x61,0x13,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73, +0x2e,0x6c,0x69,0x67,0x61,0x15,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x16,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x18,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x72,0x61, +0x63,0x65,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x26,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x23,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x65,0x78,0x63, +0x6c,0x61,0x6d,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x12,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x61, +0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65,0x66,0x74,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65, +0x66,0x74,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x19,0x70,0x65,0x72, +0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x17,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x14,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c, +0x69,0x67,0x61,0x11,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x10,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x63,0x6f, +0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e, +0x6c,0x69,0x67,0x61,0x10,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x12,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x18,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c, +0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x22,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c, +0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x1d,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x11,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x17,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65, +0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x14,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x13,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x71,0x75,0x65,0x73,0x74,0x69,0x6f, +0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x13,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c, +0x69,0x67,0x61,0x1f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x15,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x61,0x73,0x74,0x65,0x72,0x69, +0x73,0x6b,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x70,0x61,0x72,0x65,0x6e,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67, +0x61,0x1b,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x65, +0x78,0x63,0x6c,0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x25,0x6e, +0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x30,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65, +0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72, +0x65,0x2e,0x6c,0x69,0x67,0x61,0x24,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x70,0x61,0x72,0x65,0x6e,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x13,0x73,0x6c,0x61,0x73,0x68,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x1c, +0x73,0x6c,0x61,0x73,0x68,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x10,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e, +0x6c,0x69,0x67,0x61,0x12,0x73,0x6c,0x61,0x73,0x68,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x16,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16, +0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x14,0x73,0x6c,0x61,0x73,0x68,0x5f,0x62,0x61,0x63,0x6b,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x61,0x63,0x6b,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61, +0x1e,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x62,0x61,0x72,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x78,0x63,0x6c,0x61, +0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x1c,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x41,0x07,0x75, +0x6e,0x69,0x32,0x37,0x45,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x37,0x09,0x61,0x6e,0x6f,0x74,0x65,0x6c,0x65,0x69,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x37,0x45,0x06,0x45,0x4d,0x71,0x75,0x61,0x64,0x0e,0x5a,0x45,0x52,0x4f,0x57,0x49,0x44,0x54, +0x48,0x53,0x50,0x41,0x43,0x45,0x07,0x75,0x6e,0x69,0x30,0x30,0x41,0x30,0x02,0x43,0x52,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x46,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x46,0x04,0x64,0x6f,0x6e,0x67,0x04,0x45,0x75,0x72,0x6f,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x44,0x07,0x75,0x6e,0x69,0x32, +0x30,0x41,0x45,0x09,0x63,0x65,0x6e,0x74,0x2e,0x63,0x76,0x31,0x34,0x0b,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x63,0x76,0x31,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x31, +0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x31,0x09,0x63,0x6f,0x6e,0x67,0x72,0x75,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x34,0x07,0x75,0x6e,0x69,0x32, +0x32,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x44,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x46,0x31,0x07,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x41,0x07,0x75,0x6e,0x69,0x32, +0x32,0x45,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x43,0x0b,0x65,0x71,0x75,0x69,0x76,0x61,0x6c,0x65,0x6e,0x63,0x65,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x39,0x0b,0x65,0x78,0x69,0x73,0x74,0x65,0x6e,0x74,0x69,0x61,0x6c,0x08,0x67,0x72,0x61,0x64, +0x69,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x39,0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x44,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x37,0x07,0x75,0x6e,0x69, +0x32,0x32,0x43,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x45,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x42,0x07,0x75,0x6e,0x69, +0x32,0x32,0x36,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x30,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x35,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x32,0x07,0x75,0x6e,0x69, +0x32,0x32,0x43,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x43,0x0a,0x6e,0x6f,0x74, +0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x45,0x32,0x09, +0x6e,0x6f,0x74,0x73,0x75,0x62,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x35,0x08,0x65,0x6d,0x70,0x74,0x79,0x73,0x65,0x74,0x0a,0x6c,0x6f,0x67,0x69,0x63,0x61,0x6c,0x61,0x6e,0x64,0x09,0x6c,0x6f,0x67,0x69,0x63,0x61,0x6c,0x6f,0x72,0x0c,0x69,0x6e,0x74,0x65,0x72,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x05,0x75,0x6e,0x69, +0x6f,0x6e,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x36,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x46,0x07,0x75,0x6e,0x69,0x32,0x33, +0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x32, +0x33,0x36,0x0c,0x72,0x65,0x66,0x6c,0x65,0x78,0x73,0x75,0x62,0x73,0x65,0x74,0x0e,0x72,0x65,0x66,0x6c,0x65,0x78,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x39,0x31,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x42,0x07,0x75, +0x6e,0x69,0x32,0x32,0x43,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x38,0x07,0x73,0x69,0x6d,0x69,0x6c,0x61,0x72,0x07,0x75, +0x6e,0x69,0x32,0x32,0x39,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x31,0x07,0x75, +0x6e,0x69,0x32,0x32,0x39,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x33,0x0c,0x70,0x72,0x6f,0x70,0x65,0x72,0x73,0x75,0x62,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x42,0x08,0x73,0x75,0x63,0x68,0x74,0x68,0x61,0x74,0x07,0x75,0x6e,0x69, +0x32,0x31,0x34,0x30,0x0e,0x70,0x72,0x6f,0x70,0x65,0x72,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x34,0x09,0x74,0x68,0x65,0x72,0x65,0x66,0x6f,0x72,0x65,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x42,0x09,0x75,0x6e, +0x69,0x76,0x65,0x72,0x73,0x61,0x6c,0x07,0x75,0x6e,0x69,0x32,0x32,0x46,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x42,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x38,0x07, +0x75,0x6e,0x69,0x32,0x32,0x39,0x36,0x0e,0x63,0x69,0x72,0x63,0x6c,0x65,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x39,0x0a,0x63,0x69,0x72,0x63,0x6c,0x65,0x70,0x6c,0x75,0x73,0x07,0x61,0x72,0x72,0x6f,0x77,0x75,0x70,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x37,0x0a,0x61,0x72,0x72,0x6f,0x77,0x72, +0x69,0x67,0x68,0x74,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x38,0x09,0x61,0x72,0x72,0x6f,0x77,0x64,0x6f,0x77,0x6e,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x39,0x09,0x61,0x72,0x72,0x6f,0x77,0x6c,0x65,0x66,0x74,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x36,0x09,0x61,0x72,0x72,0x6f,0x77,0x62,0x6f,0x74,0x68,0x09,0x61,0x72,0x72,0x6f,0x77, +0x75,0x70,0x64,0x6e,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x35,0x07,0x75,0x6e,0x69, +0x32,0x31,0x41,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x39,0x0a,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x75,0x70,0x0d, +0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x72,0x69,0x67,0x68,0x74,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x64,0x6f,0x77,0x6e,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x6c,0x65,0x66,0x74,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x62,0x6f,0x74,0x68,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x42,0x07,0x75,0x6e,0x69, +0x32,0x31,0x45,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x45,0x07,0x75,0x6e,0x69, +0x32,0x37,0x46,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,0x46,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x46,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x33,0x07,0x64,0x6e,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x35,0x07,0x75,0x6e,0x69, +0x32,0x35,0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x37,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x70,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x44,0x07,0x6c,0x66,0x62,0x6c,0x6f, +0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x39,0x07,0x72,0x74,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x37,0x07,0x75,0x6e,0x69,0x32,0x35, +0x39,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x46,0x07,0x6c,0x74,0x73,0x68,0x61, +0x64,0x65,0x05,0x73,0x68,0x61,0x64,0x65,0x07,0x64,0x6b,0x73,0x68,0x61,0x64,0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x46,0x06,0x63,0x69,0x72,0x63,0x6c,0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x36,0x07, +0x75,0x6e,0x69,0x32,0x35,0x43,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x45,0x0a,0x6f,0x70,0x65,0x6e,0x62,0x75,0x6c,0x6c,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x38,0x09,0x66,0x69,0x6c,0x6c,0x65, +0x64,0x62,0x6f,0x78,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x41,0x07,0x75,0x6e,0x69, +0x32,0x35,0x45,0x42,0x07,0x74,0x72,0x69,0x61,0x67,0x75,0x70,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x36,0x07,0x74,0x72,0x69,0x61,0x67,0x64,0x6e,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x44,0x07,0x75,0x6e,0x69, +0x32,0x35,0x43,0x31,0x07,0x74,0x72,0x69,0x61,0x67,0x72,0x74,0x07,0x74,0x72,0x69,0x61,0x67,0x6c,0x66,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x45,0x07,0x75,0x6e,0x69, +0x32,0x35,0x43,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x34,0x07,0x75,0x6e,0x69, +0x32,0x35,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x30,0x07,0x75,0x6e,0x69, +0x32,0x35,0x36,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x46,0x07,0x75,0x6e,0x69, +0x32,0x35,0x34,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x34,0x07,0x75,0x6e,0x69, +0x32,0x35,0x35,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x46,0x07,0x75,0x6e,0x69, +0x32,0x35,0x30,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x37,0x07,0x75,0x6e,0x69, +0x32,0x35,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x42,0x07,0x75,0x6e,0x69, +0x32,0x35,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x41,0x07,0x75,0x6e,0x69, +0x32,0x35,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x31,0x07,0x75,0x6e,0x69, +0x32,0x35,0x34,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x34,0x07,0x75,0x6e,0x69, +0x32,0x35,0x37,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x44,0x07,0x75,0x6e,0x69, +0x32,0x35,0x33,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x36,0x07,0x75,0x6e,0x69, +0x32,0x35,0x32,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x38,0x07,0x75,0x6e,0x69, +0x32,0x35,0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x36,0x07,0x75,0x6e,0x69, +0x32,0x35,0x34,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x42,0x07,0x75,0x6e,0x69, +0x32,0x35,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x46,0x07,0x75,0x6e,0x69, +0x32,0x35,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x36,0x07,0x75,0x6e,0x69, +0x32,0x33,0x34,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x41,0x07,0x75,0x6e,0x69, +0x32,0x33,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x36,0x07,0x75,0x6e,0x69, +0x32,0x33,0x34,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x34,0x07,0x75,0x6e,0x69, +0x32,0x33,0x35,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x43,0x07,0x75,0x6e,0x69, +0x32,0x33,0x36,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x38,0x07,0x75,0x6e,0x69, +0x32,0x33,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x31,0x07,0x75,0x6e,0x69, +0x32,0x33,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x46,0x07,0x75,0x6e,0x69, +0x32,0x33,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x35,0x07,0x75,0x6e,0x69, +0x32,0x33,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x36,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x35,0x07,0x75,0x6e,0x69, +0x32,0x37,0x31,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x36,0x12,0x61,0x63,0x6b,0x6e,0x6f,0x77,0x6c,0x65,0x64,0x67,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x10,0x62,0x61,0x63,0x6b,0x73,0x70,0x61,0x63,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x06,0x6d,0x69,0x6e,0x75,0x74,0x65,0x06,0x73,0x65,0x63,0x6f,0x6e,0x64,0x07,0x75, +0x6e,0x69,0x32,0x31,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x36,0x09,0x65,0x73,0x74,0x69,0x6d,0x61,0x74,0x65,0x64,0x0b,0x62,0x65,0x6c,0x6c,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x34,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x42,0x0d,0x63,0x61,0x6e,0x63,0x65,0x6c,0x63,0x6f,0x6e,0x74,0x72, +0x6f,0x6c,0x15,0x63,0x61,0x72,0x72,0x69,0x61,0x67,0x65,0x52,0x65,0x74,0x75,0x72,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x43, +0x15,0x64,0x61,0x74,0x61,0x4c,0x69,0x6e,0x6b,0x45,0x73,0x63,0x61,0x70,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0d,0x64,0x65,0x6c,0x65,0x74,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x18,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x46,0x6f,0x75,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x17,0x64,0x65, +0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x4f,0x6e,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x19,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x54,0x68,0x72,0x65,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x17,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x54,0x77,0x6f, +0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x41,0x12,0x65,0x6e,0x64,0x4f,0x66,0x4d,0x65,0x64,0x69,0x75,0x6d,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x10,0x65,0x6e,0x64,0x4f,0x66,0x54,0x65,0x78,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x18,0x65,0x6e,0x64,0x4f,0x66,0x54,0x72,0x61,0x6e,0x73,0x6d,0x69, +0x73,0x73,0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x1d,0x65,0x6e,0x64,0x4f,0x66,0x54,0x72,0x61,0x6e,0x73,0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0x42,0x6c,0x6f,0x63,0x6b,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x65,0x6e,0x71,0x75,0x69,0x72,0x79,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0d,0x65,0x73,0x63,0x61,0x70,0x65, +0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x14,0x66,0x69,0x6c,0x65,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0f,0x66,0x6f,0x72,0x6d,0x46,0x65,0x65,0x64,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x15,0x67,0x72,0x6f,0x75,0x70,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72, +0x6f,0x6c,0x1b,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x54,0x61,0x62,0x75,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x39,0x05,0x68,0x6f,0x75,0x73,0x65,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x42,0x07,0x75,0x6e,0x69, +0x32,0x33,0x32,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x46,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x43,0x45,0x0f,0x6c,0x69,0x6e,0x65,0x46,0x65,0x65,0x64,0x63,0x6f,0x6e, +0x74,0x72,0x6f,0x6c,0x1a,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,0x41,0x63,0x6b,0x6e,0x6f,0x77,0x6c,0x65,0x64,0x67,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x6e,0x65,0x77,0x6c,0x69,0x6e,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0b,0x6e,0x75,0x6c,0x6c,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33, +0x46,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x43,0x07,0x75,0x6e,0x69,0x32,0x42,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x35,0x16,0x72,0x65,0x63,0x6f,0x72,0x64,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f, +0x6c,0x0b,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x6d,0x65,0x6e,0x74,0x0e,0x73,0x68,0x69,0x66,0x74,0x49,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0f,0x73,0x68,0x69,0x66,0x74,0x4f,0x75,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0c,0x73,0x70,0x61,0x63,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x15,0x73,0x74,0x61,0x72,0x74,0x4f, +0x66,0x48,0x65,0x61,0x64,0x69,0x6e,0x67,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x12,0x73,0x74,0x61,0x72,0x74,0x4f,0x66,0x54,0x65,0x78,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x11,0x73,0x75,0x62,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x16,0x73,0x79,0x6e,0x63,0x68,0x72,0x6f,0x6e,0x6f,0x75,0x73, +0x49,0x64,0x6c,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x31,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x31,0x38,0x41,0x14,0x75,0x6e,0x69,0x74,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x19,0x76,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x54,0x61,0x62,0x75,0x6c,0x61,0x74, +0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x63,0x76,0x31,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x46,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x46,0x37,0x18,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76, +0x31,0x34,0x15,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x34,0x1d,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x34,0x1d,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64, +0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x27,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x19,0x61,0x6d,0x70, +0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x12,0x61,0x74,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x18,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69, +0x67,0x61,0x22,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x14,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x62,0x61,0x72,0x5f,0x68, +0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x17,0x62,0x61,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x62,0x61,0x72,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x15,0x62,0x61,0x72,0x5f,0x62,0x72,0x61,0x63,0x6b, +0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x0c,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x10,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x62, +0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x12,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0e, +0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72, +0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0e,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x13,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x11,0x70,0x6c,0x75,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10, +0x65,0x71,0x75,0x61,0x6c,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x17,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x10, +0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x18,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61, +0x12,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x65,0x71,0x75,0x61,0x6c,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c, +0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72, +0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x19,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x12,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f, +0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x67,0x72,0x65,0x61,0x74, +0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65, +0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70, +0x68,0x65,0x6e,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65,0x73,0x73, +0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x1e,0x6c,0x65,0x73,0x73,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12, +0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0d,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x11,0x6c,0x65,0x73,0x73, +0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x6c,0x65,0x73,0x73,0x5f,0x64, +0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x22,0x6c,0x65,0x73,0x73,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65, +0x6e,0x2e,0x6c,0x69,0x67,0x61,0x0e,0x6c,0x65,0x73,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x16,0x6c,0x65,0x73,0x73,0x5f,0x70,0x6c,0x75,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x6c,0x65,0x73, +0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1d,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e, +0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x11,0x6c,0x65,0x73,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c, +0x69,0x67,0x61,0x0e,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x6c,0x65, +0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61, +0x1c,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1f,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65, +0x73,0x73,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x16,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x61,0x73,0x63, +0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x74,0x2e,0x6c,0x69,0x67,0x61,0x17,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69, +0x67,0x61,0x22,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x16,0x61,0x73,0x63,0x69,0x69,0x63,0x69,0x72,0x63,0x75,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x15,0x65,0x71,0x75, +0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x1b,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x46,0x07,0x75, +0x6e,0x69,0x30,0x33,0x37,0x34,0x07,0x75,0x6e,0x69,0x30,0x33,0x37,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x43,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x41,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x38,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x37,0x09,0x67, +0x72,0x61,0x76,0x65,0x63,0x6f,0x6d,0x62,0x09,0x61,0x63,0x75,0x74,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x42,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x2e,0x61,0x6c,0x74,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x07,0x75, +0x6e,0x69,0x30,0x33,0x30,0x41,0x09,0x74,0x69,0x6c,0x64,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x0d,0x68,0x6f,0x6f,0x6b,0x61,0x62,0x6f,0x76,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x46,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x32,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x42,0x0c,0x64, +0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x38,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x36,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x37,0x07,0x75,0x6e,0x69,0x30, +0x33,0x33,0x38,0x0b,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x2e,0x61,0x6c,0x74,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x38,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x37,0x2e,0x63,0x61,0x73,0x65,0x0e,0x67,0x72,0x61,0x76,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0e,0x61,0x63,0x75,0x74,0x65,0x63,0x6f, +0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x42,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30, +0x33,0x30,0x41,0x2e,0x63,0x61,0x73,0x65,0x0e,0x74,0x69,0x6c,0x64,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x2e,0x63,0x61,0x73,0x65,0x12,0x68,0x6f,0x6f,0x6b,0x61,0x62,0x6f,0x76,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x46,0x2e, +0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x31,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x32,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x42,0x2e,0x63,0x61,0x73,0x65,0x11,0x64,0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e, +0x69,0x30,0x33,0x32,0x34,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x37,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x38,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x45,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75, +0x6e,0x69,0x30,0x33,0x33,0x31,0x2e,0x63,0x61,0x73,0x65,0x0d,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x61,0x73,0x65,0x0e,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x2e,0x63,0x61,0x73,0x65,0x0a,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x61,0x73,0x65,0x0a,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x61,0x73,0x65,0x11,0x68, +0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x2e,0x63,0x61,0x73,0x65,0x0f,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x61,0x73,0x65,0x0a,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x0a,0x62,0x72,0x65,0x76,0x65,0x2e,0x63,0x61,0x73,0x65,0x09,0x72,0x69,0x6e,0x67,0x2e,0x63,0x61,0x73,0x65, +0x0a,0x74,0x69,0x6c,0x64,0x65,0x2e,0x63,0x61,0x73,0x65,0x0b,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x05,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x74,0x6f,0x6e,0x6f,0x73,0x2e,0x63,0x61,0x73,0x65,0x0d,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0b,0x62,0x72,0x65,0x76,0x65,0x63,0x6f,0x6d,0x62, +0x63,0x79,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x31,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x39,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x33,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x31,0x0b,0x75, +0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x39,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x33,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x31,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x30,0x2e, +0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x39,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x33,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x31,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30, +0x33,0x30,0x30,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x39,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x33,0x2e,0x63,0x61,0x73,0x65,0x07,0x75,0x6e,0x69,0x45,0x30,0x41,0x30,0x07,0x75,0x6e,0x69,0x45,0x30,0x41,0x31,0x07,0x75,0x6e,0x69,0x45,0x30, +0x41,0x32,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x30,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x31,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x32,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x33,0x0e,0x69,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x64,0x6f,0x74,0x6c,0x65,0x73,0x73,0x10,0x69,0x64,0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x64,0x6f,0x74,0x6c,0x65, +0x73,0x73,0x04,0x4e,0x55,0x4c,0x4c,0x03,0x53,0x50,0x43,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x0f,0x00,0x01,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x02,0x00,0x4d,0x00,0x01,0x00,0x5d,0x00,0x01,0x00,0x5f,0x00,0x78,0x00,0x01,0x00,0x7a,0x00,0x7a,0x00,0x01,0x00,0x7c,0x00,0x86,0x00,0x01,0x00,0x89, +0x00,0xdd,0x00,0x01,0x00,0xe1,0x00,0xf2,0x00,0x01,0x00,0xf4,0x00,0xfc,0x00,0x01,0x00,0xfe,0x01,0x14,0x00,0x01,0x01,0x16,0x01,0x1f,0x00,0x01,0x01,0x21,0x01,0x3b,0x00,0x01,0x01,0x3d,0x01,0x49,0x00,0x01,0x01,0x4c,0x01,0x7c,0x00,0x01,0x01,0x7e,0x01,0xc2,0x00,0x01,0x01,0xc4,0x01,0xc5,0x00,0x01,0x01,0xc8,0x01,0xc8,0x00,0x01, +0x01,0xca,0x01,0xcc,0x00,0x01,0x01,0xcf,0x01,0xd6,0x00,0x01,0x01,0xd8,0x01,0xda,0x00,0x01,0x01,0xdc,0x01,0xe0,0x00,0x01,0x01,0xe2,0x01,0xe3,0x00,0x01,0x01,0xe9,0x01,0xea,0x00,0x01,0x01,0xed,0x01,0xf2,0x00,0x01,0x01,0xf4,0x01,0xf5,0x00,0x01,0x01,0xf7,0x01,0xfd,0x00,0x01,0x01,0xff,0x02,0x02,0x00,0x01,0x02,0x04,0x02,0x04, +0x00,0x01,0x02,0x06,0x02,0x0a,0x00,0x01,0x02,0x0c,0x02,0x0c,0x00,0x01,0x02,0x0f,0x02,0x10,0x00,0x01,0x02,0x13,0x02,0x1a,0x00,0x01,0x02,0x1e,0x02,0x1e,0x00,0x01,0x02,0x20,0x02,0x24,0x00,0x01,0x02,0x26,0x02,0x27,0x00,0x01,0x02,0x2e,0x02,0x2e,0x00,0x01,0x02,0x31,0x02,0x36,0x00,0x01,0x02,0x38,0x02,0x39,0x00,0x01,0x02,0x3b, +0x02,0x3b,0x00,0x01,0x02,0x3d,0x02,0x3d,0x00,0x01,0x02,0x40,0x02,0x46,0x00,0x01,0x02,0x48,0x02,0x49,0x00,0x01,0x02,0x4b,0x02,0x4f,0x00,0x01,0x02,0x51,0x02,0x53,0x00,0x01,0x02,0x55,0x02,0x57,0x00,0x01,0x02,0x59,0x02,0x5a,0x00,0x01,0x02,0x5c,0x02,0x5d,0x00,0x01,0x02,0x5f,0x02,0x5f,0x00,0x01,0x02,0x61,0x02,0x61,0x00,0x01, +0x02,0x63,0x02,0x64,0x00,0x01,0x02,0x66,0x02,0x66,0x00,0x01,0x02,0x69,0x02,0x6e,0x00,0x01,0x02,0x70,0x02,0x75,0x00,0x01,0x02,0x79,0x02,0x79,0x00,0x01,0x02,0x7b,0x02,0x7b,0x00,0x01,0x02,0x7d,0x02,0x7e,0x00,0x01,0x02,0x81,0x02,0x81,0x00,0x01,0x02,0x83,0x02,0x83,0x00,0x01,0x02,0x89,0x02,0x89,0x00,0x01,0x02,0x8b,0x02,0x8b, +0x00,0x01,0x02,0x8e,0x02,0x94,0x00,0x01,0x02,0x96,0x02,0x99,0x00,0x01,0x02,0x9c,0x02,0x9c,0x00,0x01,0x02,0xb0,0x02,0xb0,0x00,0x01,0x02,0xcc,0x02,0xcc,0x00,0x01,0x03,0xc3,0x03,0xc3,0x00,0x01,0x03,0xc7,0x03,0xc7,0x00,0x01,0x03,0xcd,0x03,0xcf,0x00,0x01,0x05,0x7d,0x05,0x7e,0x00,0x01,0x05,0xaa,0x05,0xaa,0x00,0x01,0x05,0xc5, +0x05,0xc5,0x00,0x01,0x05,0xd0,0x05,0xd0,0x00,0x01,0x05,0xeb,0x05,0xeb,0x00,0x01,0x05,0xed,0x05,0xed,0x00,0x01,0x06,0x05,0x06,0x06,0x00,0x02,0x06,0x68,0x06,0x7f,0x00,0x03,0x06,0x8d,0x06,0xa4,0x00,0x03,0x06,0xb3,0x06,0xc3,0x00,0x03,0x06,0xcb,0x06,0xcc,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x2a, +0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x0b,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x8d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa3,0x06,0xa4,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x76,0x00,0x00,0x06,0x8e,0x06,0x9c,0x00,0x0f,0x06,0xb3,0x06,0xc3,0x00,0x1e,0x00,0x01,0x00,0x03,0x06,0x6d,0x06,0x77,0x06,0x9d,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x24,0x00,0x0a,0x00,0x05,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x46,0x00,0x50,0x00,0x02,0x44,0x46,0x4c,0x54,0x00,0x1c,0x6c,0x61,0x74,0x6e,0x00,0x60,0x00,0x02,0x6d,0x61,0x72,0x6b,0x00,0x40,0x6d,0x6b,0x6d,0x6b,0x00,0x48,0x00,0x78,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x7e,0x00,0x04, +0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x86,0x00,0x00,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x88,0x00,0x01,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x8a,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x34,0x00,0x08,0x41,0x5a,0x45,0x20,0x00,0x34, +0x43,0x41,0x54,0x20,0x00,0x34,0x43,0x52,0x54,0x20,0x00,0x34,0x4b,0x41,0x5a,0x20,0x00,0x34,0x4d,0x4f,0x4c,0x20,0x00,0x34,0x52,0x4f,0x4d,0x20,0x00,0x34,0x54,0x41,0x54,0x20,0x00,0x34,0x54,0x52,0x4b,0x20,0x00,0x34,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x42,0x01,0x66,0x00,0x01,0x00,0x54,0x02,0xca, +0x00,0x01,0x00,0x56,0x04,0xc6,0x00,0x05,0x03,0xc0,0x06,0x68,0x00,0x01,0x00,0x8e,0x00,0x8e,0x00,0x01,0x00,0xc4,0x00,0x76,0x00,0x01,0x00,0x54,0x00,0x9c,0x00,0x01,0x01,0xe8,0x00,0xe6,0x00,0x01,0x00,0x12,0x00,0x1c,0x00,0x01,0x00,0x24,0x00,0x0c,0x00,0x02,0x1d,0x1e,0x1d,0x24,0x00,0x01,0x00,0x03,0x06,0x6d,0x06,0x77,0x06,0x9d, +0x00,0x01,0x00,0x02,0x06,0x77,0x06,0x9d,0x00,0x03,0x00,0x00,0x1d,0x12,0x00,0x00,0x1d,0x18,0x00,0x00,0x1d,0x1e,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x7f,0x00,0x00,0x06,0x8d,0x06,0xa4,0x00,0x18,0x06,0xb3,0x06,0xc3,0x00,0x30,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x76,0x00,0x00,0x06,0x8e,0x06,0x9c,0x00,0x0f,0x06,0xb3,0x06,0xc3, +0x00,0x1e,0x00,0x0b,0x1c,0xf0,0x1c,0xea,0x1c,0xf6,0x1c,0xfc,0x1c,0xf6,0x1c,0xf0,0x1c,0xf0,0x1c,0xf6,0x1c,0xfc,0x1d,0x02,0x1d,0x08,0x00,0x01,0x00,0x0b,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x8d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa3,0x06,0xa4,0x00,0x02,0x00,0x04,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e, +0x06,0x76,0x00,0x05,0x06,0x8e,0x06,0x9c,0x00,0x0e,0x06,0xb4,0x06,0xc3,0x00,0x1d,0x00,0x0b,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc0,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x2d, +0x1c,0x9e,0x1c,0x9e,0x1c,0xa4,0x1c,0xaa,0x1c,0xb0,0x1c,0xb6,0x1c,0xb6,0x1c,0xb6,0x1c,0xbc,0x1c,0xc2,0x1c,0xc8,0x1c,0xce,0x1c,0xd4,0x1c,0xda,0x1c,0xfe,0x1c,0xe0,0x1c,0xe6,0x1c,0xec,0x1c,0xf2,0x1d,0x16,0x1d,0x16,0x1d,0x16,0x1c,0xf8,0x1c,0xfe,0x1d,0x04,0x1d,0x0a,0x1d,0x10,0x1d,0x16,0x1d,0x1c,0x1d,0x22,0x1d,0x22,0x1d,0x28, +0x1d,0x40,0x1d,0x2e,0x1d,0x34,0x1d,0x3a,0x1d,0x40,0x1d,0x58,0x1d,0x58,0x1d,0x58,0x1d,0x58,0x1d,0x46,0x1d,0x4c,0x1d,0x52,0x1d,0x58,0x00,0x02,0x00,0x1b,0x00,0x60,0x00,0x74,0x00,0x00,0x00,0x78,0x00,0x78,0x00,0x15,0x00,0x8e,0x00,0x9d,0x00,0x16,0x00,0x9f,0x00,0xa0,0x00,0x26,0x00,0xbc,0x00,0xbc,0x00,0x28,0x00,0xdd,0x00,0xdd, +0x00,0x29,0x01,0x22,0x01,0x37,0x00,0x2a,0x01,0x3b,0x01,0x3b,0x00,0x40,0x01,0x4c,0x01,0x5d,0x00,0x41,0x01,0x64,0x01,0x65,0x00,0x53,0x01,0x67,0x01,0x68,0x00,0x55,0x01,0x84,0x01,0x88,0x00,0x57,0x01,0xb0,0x01,0xc2,0x00,0x5c,0x01,0xda,0x01,0xda,0x00,0x6f,0x02,0x02,0x02,0x02,0x00,0x70,0x02,0x1e,0x02,0x1e,0x00,0x71,0x02,0x46, +0x02,0x46,0x00,0x72,0x02,0x5f,0x02,0x5f,0x00,0x73,0x02,0x6d,0x02,0x6d,0x00,0x74,0x02,0x83,0x02,0x83,0x00,0x75,0x02,0x89,0x02,0x89,0x00,0x76,0x02,0x91,0x02,0x94,0x00,0x77,0x05,0xaa,0x05,0xaa,0x00,0x7b,0x05,0xc5,0x05,0xc5,0x00,0x7c,0x05,0xd0,0x05,0xd0,0x00,0x7d,0x05,0xeb,0x05,0xeb,0x00,0x7e,0x05,0xed,0x05,0xed,0x00,0x7f, +0x00,0x2f,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x5c,0x00,0x00,0x1c,0x62,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x68,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00, +0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x6e,0x00,0x00,0x1c,0x74,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x7a,0x00,0x00, +0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x80, +0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4, +0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce, +0x1b,0xce,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce, +0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xe0,0x1b,0xe0,0x1b,0xda,0x1b,0xe0, +0x00,0x41,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0x9c,0x00,0x00,0x1a,0xa2,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xa8,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x01, +0x1a,0xe4,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x03,0x19,0xd6,0x00,0x04,0x1a,0xea,0x00,0x04,0x1a,0xf0,0x00,0x04,0x1a,0xf6,0x00,0x02,0x19,0xd0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xae,0x00,0x00,0x1a,0xb4,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00, +0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x01,0x1a,0xc0,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x03,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02, +0x19,0xd6,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00, +0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x02,0x00,0x45,0x00,0x01,0x00,0x5d,0x00,0x00,0x00,0x5f,0x00,0x78,0x00,0x5d,0x00,0x7a,0x00,0x7a,0x00,0x77,0x00,0x7c,0x00,0x86,0x00,0x78,0x00,0x89,0x00,0xdd,0x00,0x83,0x00,0xe1,0x00,0xf2,0x00,0xd8,0x00,0xf4,0x00,0xfc,0x00,0xea,0x00,0xfe,0x01,0x14,0x00,0xf3,0x01,0x16,0x01,0x1f,0x01,0x0a, +0x01,0x21,0x01,0x3b,0x01,0x14,0x01,0x3d,0x01,0x49,0x01,0x2f,0x01,0x4c,0x01,0x7c,0x01,0x3c,0x01,0x7e,0x01,0xc2,0x01,0x6d,0x01,0xc4,0x01,0xc5,0x01,0xb2,0x01,0xc8,0x01,0xc8,0x01,0xb4,0x01,0xca,0x01,0xcc,0x01,0xb5,0x01,0xcf,0x01,0xd6,0x01,0xb8,0x01,0xd8,0x01,0xda,0x01,0xc0,0x01,0xdc,0x01,0xe0,0x01,0xc3,0x01,0xe2,0x01,0xe3, +0x01,0xc8,0x01,0xe9,0x01,0xea,0x01,0xca,0x01,0xed,0x01,0xf2,0x01,0xcc,0x01,0xf4,0x01,0xf5,0x01,0xd2,0x01,0xf7,0x01,0xfd,0x01,0xd4,0x01,0xff,0x02,0x02,0x01,0xdb,0x02,0x04,0x02,0x04,0x01,0xdf,0x02,0x06,0x02,0x0a,0x01,0xe0,0x02,0x0c,0x02,0x0c,0x01,0xe5,0x02,0x0f,0x02,0x10,0x01,0xe6,0x02,0x13,0x02,0x1a,0x01,0xe8,0x02,0x1e, +0x02,0x1e,0x01,0xf0,0x02,0x20,0x02,0x21,0x01,0xf1,0x02,0x23,0x02,0x24,0x01,0xf3,0x02,0x26,0x02,0x27,0x01,0xf5,0x02,0x2e,0x02,0x2e,0x01,0xf7,0x02,0x31,0x02,0x36,0x01,0xf8,0x02,0x38,0x02,0x39,0x01,0xfe,0x02,0x3b,0x02,0x3b,0x02,0x00,0x02,0x40,0x02,0x46,0x02,0x01,0x02,0x48,0x02,0x49,0x02,0x08,0x02,0x4b,0x02,0x4f,0x02,0x0a, +0x02,0x51,0x02,0x53,0x02,0x0f,0x02,0x55,0x02,0x57,0x02,0x12,0x02,0x59,0x02,0x5a,0x02,0x15,0x02,0x5c,0x02,0x5d,0x02,0x17,0x02,0x5f,0x02,0x5f,0x02,0x19,0x02,0x61,0x02,0x61,0x02,0x1a,0x02,0x63,0x02,0x64,0x02,0x1b,0x02,0x66,0x02,0x66,0x02,0x1d,0x02,0x69,0x02,0x6e,0x02,0x1e,0x02,0x70,0x02,0x75,0x02,0x24,0x02,0x79,0x02,0x79, +0x02,0x2a,0x02,0x7b,0x02,0x7b,0x02,0x2b,0x02,0x7d,0x02,0x7e,0x02,0x2c,0x02,0x81,0x02,0x81,0x02,0x2e,0x02,0x83,0x02,0x83,0x02,0x2f,0x02,0x89,0x02,0x89,0x02,0x30,0x02,0x8b,0x02,0x8b,0x02,0x31,0x02,0x8e,0x02,0x94,0x02,0x32,0x02,0x96,0x02,0x99,0x02,0x39,0x02,0x9c,0x02,0x9c,0x02,0x3d,0x02,0xb0,0x02,0xb0,0x02,0x3e,0x02,0xcc, +0x02,0xcc,0x02,0x3f,0x03,0xc3,0x03,0xc3,0x02,0x40,0x03,0xc7,0x03,0xc7,0x02,0x41,0x03,0xcd,0x03,0xcf,0x02,0x42,0x05,0x7d,0x05,0x7e,0x02,0x45,0x05,0xaa,0x05,0xaa,0x02,0x47,0x06,0xcb,0x06,0xcc,0x02,0x48,0x02,0x4a,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66, +0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44, +0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xd2,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x18,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xde,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00, +0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x08,0x00,0x00, +0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x54,0x00,0x00,0x1c,0x1a,0x00,0x00, +0x00,0x00,0x18,0x5a,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x5a,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x60,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66, +0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x66,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6, +0x1b,0xcc,0x00,0x00,0x18,0x6c,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x18,0x90,0x1b,0xcc,0x00,0x00,0x18,0x78,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x7e,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x84,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00, +0x18,0x8a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0xc0,0x00,0x00,0x18,0x90,0x1b,0xcc,0x00,0x00,0x18,0x96,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x9c,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0xa2,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00, +0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00, +0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x18,0xa8,0x00,0x00,0x00,0x00,0x19,0x20,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38, +0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x20,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8, +0x1b,0xd2,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x30,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, +0x18,0xb4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xba,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00, +0x18,0xc0,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00, +0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x54,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xd2, +0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1a,0xe8,0x1c,0x4a,0x1c,0x50,0x18,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xde,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xe4,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x1c,0x3e,0x1a,0xe8, +0x1c,0x4a,0x1c,0x50,0x19,0x26,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x14,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x4e,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xea,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x4e,0x1c,0x3e,0x1a,0xe8,0x1c,0x4a,0x1c,0x50,0x18,0xf0,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50, +0x18,0xf6,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xfc,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x02,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x1a,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x1c,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x1b,0xb4,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x1b,0xb4, +0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00, +0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38, +0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x1c,0x50,0x1c,0x38,0x19,0x0e,0x1c,0x44, +0x1c,0x4a,0x00,0x00,0x1b,0x54,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x66,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x66,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x19,0x26,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00, +0x19,0x14,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x54,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x19,0x26,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x14,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e, +0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x02,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x1a,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00, +0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38, +0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44, +0x00,0x00,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x19,0x20,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50, +0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00, +0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0xfe,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x2c,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x19,0x56,0x1b,0x6c, +0x00,0x00,0x19,0x2c,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x32,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x4a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x38,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a, +0x00,0x00,0x19,0x56,0x1b,0x6c,0x00,0x00,0x19,0x3e,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x44,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x4a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x50,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x02,0x00,0x00,0x19,0x56,0x1b,0x6c,0x00,0x00,0x19,0x5c,0x00,0x00,0x1c,0x1a, +0x1b,0x6c,0x00,0x00,0x19,0x62,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x68,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x6e,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x10,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1b,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x74,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x7a,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x7a,0x00,0x00, +0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x80,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a, +0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x16,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0x1c,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x22,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x28,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea, +0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x86,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x8c,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00, +0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x98,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x9e,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0xa4,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x19,0xaa,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x84,0x00,0x00,0x1c,0x44,0x1c,0x68,0x00,0x00,0x1c,0x5c,0x00,0x00, +0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb0,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68, +0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x62,0x1c,0x68,0x00,0x00,0x19,0xbc,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xc2,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xc8,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xce,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x8a, +0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x19,0xd4,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x19,0xda,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xf8,0x00,0x00,0x1b,0xd2, +0x00,0x00,0x1c,0x50,0x19,0xe0,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x19,0xf8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x19,0xf8,0x00,0x00,0x19,0xe6,0x00,0x00,0x1c,0x50,0x19,0xec,0x00,0x00,0x1c,0x44,0x00,0x00,0x19,0xf2,0x19,0xf8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, +0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0xfe,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1a,0x04,0x00,0x00,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1a,0x10,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6, +0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xa8,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x16,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a, +0x1b,0xfc,0x1a,0x1c,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x22,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x28,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xea,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a,0x1b,0xfc,0x1a,0xf4,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0xfa, +0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x34,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x2e,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x34,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a,0x1b,0xfc,0x1a,0x3a,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x40,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x46,0x1b,0xf6,0x1c,0x44, +0x1c,0x4a,0x1b,0xfc,0x1b,0x06,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0x0c,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x1b,0xf6,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc, +0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x5a,0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xc4,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xca,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00, +0x1a,0x52,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xbe,0x00,0x00, +0x00,0x00,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x88,0x00,0x00,0x1b,0xfc,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xa8, +0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x5e,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x64,0x1b,0xf0,0x1c,0x44, +0x1c,0x4a,0x00,0x00,0x1a,0x6a,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x70,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00, +0x1b,0xa8,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xee,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1b,0x06,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x0c,0x1b,0xf0, +0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x12,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00, +0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae, +0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe2,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44, +0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x76,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00, +0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1a,0xb2,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00, +0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x88,0x00,0x00,0x1a,0x8e,0x1c,0x32,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00, +0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1a,0x94,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0x9c,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xa0,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xa6,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xb8, +0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xac,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1a,0xb2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44, +0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, +0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xc4,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xca,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00, +0x1a,0xdc,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe2,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00, +0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xa8,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xae, +0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xe8,0x1b,0x1e,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0xa8,0x1b,0xf0,0x1b,0x00, +0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xee,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0x06,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x0c,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00, +0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x12,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00, +0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00, +0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38, +0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44, +0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1b,0x5a,0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00, +0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x30,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x36,0x00,0x00, +0x1b,0x3c,0x00,0x00,0x00,0x00,0x1b,0x42,0x00,0x00,0x1c,0x0e,0x00,0x00,0x1b,0x48,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x5a, +0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1b,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44, +0x1c,0x4a,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x1b,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00, +0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68, +0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x8a,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x32,0x1b,0x96,0x00,0x00,0x1b,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xea,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xea,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x1b,0x9c,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, +0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00, +0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00, +0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38, +0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44, +0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00, +0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf0, +0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00, +0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x1c,0x0e,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38, +0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x5c,0x00,0x00,0x1c,0x56, +0x1c,0x68,0x00,0x00,0x1c,0x5c,0x00,0x00,0x1c,0x62,0x1c,0x68,0x00,0x00,0x00,0x01,0xff,0xb4,0x02,0x94,0x00,0x01,0xff,0xba,0x03,0x48,0x00,0x01,0xff,0x51,0x02,0x26,0x00,0x01,0xff,0x04,0x02,0x26,0x00,0x01,0xff,0x07,0x02,0xda,0x00,0x01,0xfe,0xd4,0xff,0x06,0x00,0x01,0xfe,0xd4,0xff,0x2b,0x00,0x01,0xfe,0xca,0xff,0x10,0x00,0x01, +0xfe,0xdb,0xff,0x35,0x00,0x01,0xfe,0xd4,0xff,0x10,0x00,0x01,0xfe,0xd4,0xff,0x3d,0x00,0x01,0xfe,0xca,0x00,0x00,0x00,0x01,0xfe,0xd4,0x00,0x00,0x00,0x01,0xfe,0xd4,0x03,0x09,0x00,0x01,0xfe,0xb3,0x03,0x11,0x00,0x01,0xfe,0xf5,0x03,0x11,0x00,0x01,0xfe,0xf9,0x03,0x11,0x00,0x01,0xfe,0xd4,0x03,0x11,0x00,0x01,0xfe,0xd4,0x03,0x44, +0x00,0x01,0xfe,0xd4,0x03,0x0c,0x00,0x01,0xfe,0xd4,0x02,0xe9,0x00,0x01,0xfe,0xd9,0x03,0x39,0x00,0x01,0xfe,0xae,0x03,0x11,0x00,0x01,0xfe,0xe0,0x03,0x70,0x00,0x01,0xfe,0xd4,0x03,0xb0,0x00,0x01,0xfe,0xb3,0x03,0xb6,0x00,0x01,0xfe,0xf5,0x03,0xb6,0x00,0x01,0xfe,0xf9,0x03,0xb6,0x00,0x01,0xfe,0xd4,0x03,0xe2,0x00,0x01,0xfe,0xd4, +0x03,0xb1,0x00,0x01,0xfe,0xd4,0x03,0x93,0x00,0x01,0xfe,0xd6,0x03,0xd4,0x00,0x01,0xfe,0xae,0x03,0xb6,0x00,0x01,0xfe,0xd4,0x03,0xb6,0x00,0x01,0xfe,0xd9,0x03,0xfc,0x00,0x01,0xfe,0xd4,0x03,0x7a,0x00,0x01,0xfe,0xd4,0x03,0xa2,0x00,0x01,0xff,0x1c,0x03,0x84,0x00,0x01,0xfe,0xf4,0x03,0x84,0x00,0x01,0xfe,0xf7,0x03,0xa2,0x00,0x01, +0xfe,0xd4,0x03,0xa0,0x00,0x01,0xff,0x17,0x03,0xfc,0x00,0x01,0xfe,0xf2,0x03,0xfc,0x00,0x01,0xfe,0xf7,0x03,0xfc,0x00,0x01,0xfe,0xd4,0x03,0xfc,0x00,0x01,0xfe,0xde,0x02,0x26,0x00,0x01,0xfe,0xca,0x02,0x26,0x00,0x01,0xfe,0xb6,0x02,0xda,0x00,0x01,0xfe,0xde,0x02,0xda,0x00,0x01,0xfe,0xca,0x02,0xda,0x00,0x01,0xfe,0xd4,0x02,0x26, +0x00,0x01,0xfe,0xd4,0x02,0xda,0x00,0x01,0x01,0x63,0x02,0x6d,0x00,0x01,0x02,0x44,0x02,0x26,0x00,0x01,0x02,0x44,0x02,0xda,0x00,0x01,0x02,0x44,0x04,0x65,0x00,0x01,0x03,0x0c,0x02,0xda,0x00,0x01,0xfe,0xec,0x02,0x26,0x00,0x01,0xfe,0xd4,0x01,0x45,0x00,0x01,0xfe,0xd4,0x01,0x18,0x00,0x01,0xfe,0xd4,0x01,0x13,0x00,0x01,0x01,0x5c, +0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0xb0,0x00,0x01,0x01,0x61,0x03,0xb6,0x00,0x01,0x01,0x79,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xb6,0x00,0x01,0x01,0x54,0x03,0xfc,0x00,0x01,0x01,0x59,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xb0,0x00,0x01,0x01,0x36,0xff,0x2b,0x00,0x01, +0x01,0x0b,0x03,0xb6,0x00,0x01,0x01,0x38,0x03,0xd4,0x00,0x01,0x01,0x36,0x03,0x93,0x00,0x01,0x01,0x26,0xff,0x10,0x00,0x01,0x01,0x30,0x00,0x00,0x00,0x01,0x01,0xc2,0x03,0xb6,0x00,0x01,0x00,0xda,0x03,0xb6,0x00,0x01,0x01,0x4a,0xff,0x10,0x00,0x01,0x00,0xaf,0x02,0xda,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x01,0x6f,0x03,0xfc, +0x00,0x01,0x01,0x4a,0x03,0xfc,0x00,0x01,0x01,0x4f,0x03,0xfc,0x00,0x01,0x01,0x2c,0x03,0xfc,0x00,0x01,0x01,0x4d,0x03,0xb6,0x00,0x01,0x00,0xf7,0x03,0xb6,0x00,0x01,0x01,0x24,0x03,0xd4,0x00,0x01,0x01,0x22,0x03,0xb1,0x00,0x01,0x01,0x51,0x03,0xb6,0x00,0x01,0x01,0x2c,0x03,0xe2,0x00,0x01,0x01,0x81,0x02,0xda,0x00,0x01,0x01,0x2e, +0x03,0xd4,0x00,0x01,0x01,0x2c,0x03,0x93,0x00,0x01,0x01,0x2c,0x03,0xb0,0x00,0x01,0x01,0x01,0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0x7a,0x00,0x01,0x01,0x31,0x03,0xa2,0x00,0x01,0x01,0x79,0x03,0x84,0x00,0x01,0x01,0x51,0x03,0x84,0x00,0x01,0x01,0x54,0x03,0xa2,0x00,0x01,0x01,0x31,0x03,0xa0,0x00,0x01,0x01,0x31,0x03,0x09,0x00,0x01, +0x01,0x31,0xff,0x2b,0x00,0x01,0x01,0x06,0x03,0x11,0x00,0x01,0x01,0x36,0x03,0x39,0x00,0x01,0x01,0x31,0x02,0xe9,0x00,0x01,0x01,0x31,0x03,0x44,0x00,0x01,0x01,0x5f,0x03,0x11,0x00,0x01,0x01,0x34,0x03,0x11,0x00,0x01,0x01,0x34,0x03,0x09,0x00,0x01,0x01,0x29,0x02,0x26,0x00,0x01,0x01,0x54,0x03,0x11,0x00,0x01,0x01,0x29,0x03,0x11, +0x00,0x01,0x01,0x35,0x03,0x70,0x00,0x01,0x01,0x29,0x03,0x09,0x00,0x01,0x00,0x89,0x02,0xda,0x00,0x01,0x00,0x89,0x03,0xc5,0x00,0x01,0x01,0x66,0x03,0x11,0x00,0x01,0x01,0x3b,0x03,0x11,0x00,0x01,0x01,0x10,0x03,0x11,0x00,0x01,0x01,0x40,0x03,0x39,0x00,0x01,0x01,0x3b,0x02,0xe9,0x00,0x01,0x01,0x3b,0x03,0x0c,0x00,0x01,0x01,0x7c, +0x02,0x26,0x00,0x01,0x01,0x7c,0x03,0x11,0x00,0x01,0x01,0x1b,0x03,0xb6,0x00,0x01,0x01,0x36,0xff,0x10,0x00,0x01,0x00,0xdc,0x02,0xda,0x00,0x01,0x01,0x18,0x01,0x6d,0x00,0x01,0x00,0xf0,0x02,0xda,0x00,0x01,0x01,0x5c,0x03,0x11,0x00,0x01,0x00,0x5a,0x02,0x85,0x00,0x01,0x01,0x31,0x03,0x11,0x00,0x01,0x01,0x31,0x03,0x0c,0x00,0x01, +0x01,0x74,0x03,0x84,0x00,0x01,0x01,0x4c,0x03,0x84,0x00,0x01,0x01,0x4f,0x03,0xa2,0x00,0x01,0x01,0x2c,0x03,0xa0,0x00,0x01,0x01,0x4d,0x03,0x11,0x00,0x01,0x01,0x22,0x02,0x26,0x00,0x01,0x00,0xf7,0x03,0x11,0x00,0x01,0x01,0x27,0x03,0x39,0x00,0x01,0x01,0x22,0x03,0x0c,0x00,0x01,0x00,0x91,0x00,0x00,0x00,0x01,0x00,0x87,0xff,0x10, +0x00,0x01,0x00,0xfa,0x02,0xc1,0x00,0x01,0x01,0x57,0x03,0xf4,0x00,0x01,0x01,0x2c,0x03,0xf4,0x00,0x01,0x01,0x01,0x03,0xf4,0x00,0x01,0x01,0x2c,0x03,0xcc,0x00,0x01,0x01,0x48,0x03,0xb6,0x00,0x01,0x01,0x1d,0x02,0xda,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x01,0x5e,0xff,0x10,0x00,0x01,0x01,0x13,0x01,0x13,0x00,0x01,0x01,0x38, +0x03,0x70,0x00,0x01,0x01,0x2c,0xfe,0xf2,0x00,0x01,0x01,0xb7,0x02,0x26,0x00,0x01,0x01,0xb7,0x03,0x11,0x00,0x01,0x01,0x25,0x03,0xb6,0x00,0x01,0x01,0x27,0xff,0x10,0x00,0x01,0x00,0xfa,0x02,0xda,0x00,0x01,0x01,0x22,0xff,0x10,0x00,0x01,0x01,0x6b,0x03,0x11,0x00,0x01,0x01,0x40,0x03,0x11,0x00,0x01,0x00,0xf5,0x00,0x00,0x00,0x01, +0x01,0x40,0x02,0x26,0x00,0x01,0x00,0xe6,0xff,0x10,0x00,0x01,0x01,0xcc,0xff,0x2b,0x00,0x01,0x01,0x2c,0xff,0x2b,0x00,0x01,0x01,0x2b,0xff,0x2b,0x00,0x01,0x01,0x01,0x03,0x11,0x00,0x01,0x01,0x31,0x03,0x39,0x00,0x01,0x01,0x2b,0x00,0x00,0x00,0x01,0x01,0x51,0x03,0x11,0x00,0x01,0x01,0x2c,0x02,0xe9,0x00,0x01,0x01,0x2c,0x03,0x44, +0x00,0x01,0x01,0x2c,0x03,0x0c,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01,0x01,0x6b,0x03,0xb6,0x00,0x01,0x01,0x36,0x03,0xb1,0x00,0x01,0x01,0xc2,0x02,0xda,0x00,0x01,0x01,0x21,0x02,0xda,0x00,0x01,0x01,0x21,0x00,0x00,0x00,0x01,0x01,0x28,0x02,0xda,0x00,0x01,0x01,0x28,0x01,0x6d,0x00,0x01,0x01,0x22,0x02,0xda,0x00,0x01,0x01,0x57, +0x03,0xb6,0x00,0x01,0x01,0x27,0x02,0xda,0x00,0x01,0x01,0x27,0x00,0x00,0x00,0x01,0x01,0x2c,0x03,0xb6,0x00,0x01,0x01,0xd1,0x00,0x00,0x00,0x01,0x01,0x4a,0x02,0x26,0x00,0x01,0x01,0x75,0x03,0x11,0x00,0x01,0x01,0x5a,0x03,0x11,0x00,0x01,0x01,0x3b,0x03,0x09,0x00,0x01,0x01,0x7c,0x03,0x09,0x00,0x01,0x01,0x4f,0x02,0x26,0x00,0x01, +0x00,0xfa,0x02,0x26,0x00,0x01,0x01,0xb7,0x03,0x09,0x00,0x01,0x01,0x27,0xfe,0xf2,0x00,0x01,0x01,0x57,0x03,0x11,0x00,0x01,0x01,0x2c,0x03,0x11,0x00,0x01,0x01,0x40,0x02,0xda,0x00,0x01,0x01,0xf4,0x00,0x00,0x00,0x01,0x01,0x36,0x02,0xda,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0x40,0x00,0x00, +0x00,0x01,0x01,0x2c,0x03,0xb1,0x00,0x01,0x01,0x2f,0x02,0x26,0x00,0x01,0x01,0x27,0x03,0x09,0x00,0x01,0x01,0x2c,0x03,0x09,0x00,0x01,0x01,0xa4,0x02,0x26,0x00,0x01,0x01,0x4c,0x02,0x26,0x00,0x01,0x01,0x2c,0x01,0x13,0x00,0x01,0x01,0x31,0x02,0x26,0x00,0x01,0x01,0x28,0x02,0x26,0x00,0x01,0x01,0x28,0x00,0x00,0x00,0x01,0x01,0x31, +0x02,0xda,0x00,0x01,0x01,0x31,0x00,0x00,0x00,0x01,0x01,0x34,0x02,0x26,0x00,0x01,0x01,0x34,0x00,0x00,0x00,0x01,0x01,0x27,0x02,0x26,0x00,0x01,0x01,0x2c,0x02,0x26,0x00,0x01,0x01,0x2c,0x02,0xda,0x00,0x01,0x01,0x40,0x02,0xbc,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x01,0x5e,0x00,0x00,0x00,0x01,0x01,0x2c,0x01,0x6d,0x00,0x01, +0x01,0x3b,0x00,0x00,0x00,0x01,0x01,0x3b,0x02,0x26,0x00,0x01,0x01,0x3b,0xff,0x2b,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x18,0x01,0x1c,0x00,0x02,0x44,0x46,0x4c,0x54,0x04,0xac,0x6c,0x61,0x74,0x6e,0x04,0xb0,0x00,0x2b,0x61,0x61,0x6c,0x74,0x05,0xb4,0x63,0x61,0x6c,0x74,0x05,0xe4,0x63,0x61, +0x73,0x65,0x04,0xd6,0x63,0x63,0x6d,0x70,0x05,0xc4,0x63,0x63,0x6d,0x70,0x05,0xd8,0x63,0x76,0x30,0x31,0x04,0xdc,0x63,0x76,0x30,0x32,0x04,0xe2,0x63,0x76,0x30,0x33,0x04,0xe8,0x63,0x76,0x30,0x34,0x04,0xee,0x63,0x76,0x30,0x35,0x04,0xf4,0x63,0x76,0x30,0x36,0x04,0xfa,0x63,0x76,0x30,0x37,0x05,0x00,0x63,0x76,0x30,0x38,0x05,0x06, +0x63,0x76,0x30,0x39,0x05,0x0c,0x63,0x76,0x31,0x30,0x05,0x12,0x63,0x76,0x31,0x31,0x05,0x18,0x63,0x76,0x31,0x32,0x05,0x1e,0x63,0x76,0x31,0x34,0x05,0x24,0x63,0x76,0x31,0x35,0x05,0x2a,0x63,0x76,0x31,0x36,0x05,0x30,0x63,0x76,0x31,0x37,0x05,0x36,0x63,0x76,0x31,0x38,0x05,0x3c,0x63,0x76,0x31,0x39,0x05,0x42,0x63,0x76,0x32,0x30, +0x05,0x48,0x63,0x76,0x39,0x39,0x05,0x4e,0x66,0x72,0x61,0x63,0x05,0xce,0x6c,0x6f,0x63,0x6c,0x05,0x54,0x6c,0x6f,0x63,0x6c,0x05,0x5a,0x6c,0x6f,0x63,0x6c,0x05,0x60,0x6c,0x6f,0x63,0x6c,0x05,0x66,0x6c,0x6f,0x63,0x6c,0x05,0x6c,0x6c,0x6f,0x63,0x6c,0x05,0x72,0x6c,0x6f,0x63,0x6c,0x05,0x78,0x6c,0x6f,0x63,0x6c,0x05,0x7e,0x6f,0x72, +0x64,0x6e,0x05,0xbc,0x73,0x69,0x6e,0x66,0x05,0x84,0x73,0x73,0x30,0x31,0x05,0x8a,0x73,0x73,0x30,0x32,0x05,0x90,0x73,0x73,0x31,0x39,0x05,0x96,0x73,0x73,0x32,0x30,0x05,0x9c,0x73,0x75,0x62,0x73,0x05,0xa2,0x73,0x75,0x70,0x73,0x05,0xa8,0x7a,0x65,0x72,0x6f,0x05,0xae,0x01,0xcc,0x06,0x18,0x06,0x20,0x06,0x28,0x06,0x30,0x06,0x38, +0x06,0x40,0x06,0x40,0x06,0x48,0x06,0x50,0x06,0x58,0x06,0x60,0x06,0x68,0x06,0x70,0x06,0x78,0x06,0x80,0x06,0x88,0x06,0x90,0x06,0x98,0x06,0xa0,0x06,0xa8,0x06,0xb0,0x0a,0x90,0x06,0xb8,0x06,0xc0,0x0a,0x90,0x06,0xc8,0x06,0xd0,0x0c,0x60,0x06,0xd8,0x06,0xe0,0x06,0xe8,0x06,0xf0,0x06,0xf8,0x07,0x00,0x07,0x28,0x07,0x08,0x07,0x10, +0x07,0x28,0x07,0x28,0x07,0x18,0x07,0x20,0x07,0x28,0x07,0x28,0x07,0x28,0x07,0x30,0x07,0x38,0x07,0x40,0x07,0x48,0x07,0x50,0x07,0x58,0x07,0x60,0x07,0x68,0x07,0x70,0x07,0x78,0x11,0xb0,0x07,0x80,0x11,0xba,0x07,0x88,0x07,0x90,0x07,0x98,0x07,0xd0,0x07,0xa0,0x07,0xa8,0x07,0xd0,0x07,0xd0,0x07,0xb0,0x07,0xb8,0x07,0xc0,0x07,0xc8, +0x07,0xd0,0x07,0xd8,0x07,0xe0,0x0d,0x70,0x07,0xe8,0x07,0xf0,0x07,0xf8,0x08,0x00,0x08,0x28,0x08,0x08,0x08,0x10,0x08,0x18,0x08,0x20,0x08,0x28,0x08,0x28,0x08,0x30,0x08,0x38,0x08,0x50,0x08,0x40,0x08,0x48,0x08,0x50,0x08,0x50,0x08,0x58,0x08,0x60,0x08,0x68,0x08,0x70,0x08,0x98,0x08,0x78,0x08,0x80,0x08,0x98,0x08,0x98,0x08,0x88, +0x08,0x90,0x08,0x98,0x08,0xa0,0x08,0xa8,0x0c,0x60,0x08,0xb0,0x08,0xb8,0x0e,0x40,0x08,0xc0,0x08,0xc8,0x08,0xd0,0x08,0xd8,0x0c,0x60,0x08,0xe0,0x08,0xe8,0x08,0xf0,0x08,0xf8,0x09,0x00,0x09,0x08,0x0e,0x40,0x09,0x10,0x09,0x18,0x0e,0x40,0x09,0x20,0x09,0x28,0x0e,0x40,0x0e,0x40,0x09,0x30,0x09,0x38,0x0e,0x40,0x09,0x40,0x09,0x48, +0x09,0x50,0x09,0x58,0x09,0x60,0x09,0x68,0x0c,0x28,0x0c,0x28,0x09,0x70,0x09,0x78,0x0c,0x28,0x09,0x80,0x09,0x88,0x09,0x90,0x09,0x98,0x09,0xa0,0x09,0xa8,0x0d,0xd8,0x09,0xb0,0x09,0xb8,0x0c,0x60,0x09,0xc0,0x09,0xc8,0x09,0xd0,0x09,0xd8,0x0d,0xd8,0x09,0xe0,0x09,0xe8,0x0d,0xd8,0x0d,0xd8,0x09,0xf0,0x09,0xf8,0x0a,0x00,0x0a,0x08, +0x0a,0x10,0x0a,0x18,0x0a,0x20,0x0a,0x28,0x0a,0x30,0x0a,0x38,0x0e,0x40,0x0a,0x40,0x0a,0x48,0x0d,0x70,0x0a,0x50,0x0a,0x58,0x0a,0x60,0x0a,0x68,0x0d,0x18,0x0a,0x70,0x0a,0x78,0x0a,0x80,0x0a,0x88,0x0a,0x90,0x0a,0x98,0x0a,0xa0,0x0d,0x70,0x0a,0xa8,0x0a,0xb0,0x0d,0x70,0x0a,0xb8,0x0a,0xc0,0x0a,0xc8,0x0a,0xd0,0x0d,0x70,0x0a,0xd8, +0x0a,0xe0,0x0d,0x70,0x0d,0x70,0x0a,0xe8,0x0a,0xf0,0x0d,0x70,0x0a,0xf8,0x0b,0x00,0x0b,0x08,0x0b,0x10,0x0b,0x18,0x0b,0x20,0x0b,0x28,0x0b,0x30,0x0b,0xa0,0x0b,0x38,0x0b,0x40,0x0b,0x58,0x0b,0x48,0x0b,0x50,0x0b,0x58,0x0b,0x58,0x0b,0x60,0x0b,0x68,0x0b,0xa0,0x0b,0xa0,0x0b,0x70,0x0b,0x78,0x0b,0x80,0x0b,0x88,0x0b,0x90,0x0b,0x98, +0x0b,0xa0,0x0b,0xa8,0x0b,0xb0,0x0c,0x28,0x0c,0x28,0x0b,0xb8,0x0b,0xc0,0x0c,0x28,0x0b,0xc8,0x0b,0xd0,0x0b,0xd8,0x0b,0xe0,0x0c,0x28,0x0b,0xe8,0x0b,0xf0,0x0c,0x28,0x0b,0xf8,0x0c,0x00,0x0c,0x08,0x0c,0x10,0x0c,0x18,0x0c,0x20,0x0c,0x28,0x0c,0x30,0x0c,0x38,0x0c,0x60,0x0c,0x40,0x0c,0x48,0x0c,0x60,0x0c,0x50,0x0c,0x58,0x0c,0x60, +0x0c,0x60,0x0c,0x68,0x0c,0x70,0x0c,0x88,0x0c,0x78,0x0c,0x80,0x0c,0x88,0x0c,0x88,0x0c,0x90,0x0c,0x98,0x0c,0xa0,0x0c,0xa8,0x0c,0xb0,0x0c,0xb8,0x0c,0xc0,0x0c,0xc8,0x0c,0xf0,0x0c,0xd0,0x0c,0xd8,0x0c,0xe0,0x0c,0xe8,0x0c,0xf0,0x0c,0xf0,0x0c,0xf8,0x0d,0x00,0x0d,0x08,0x0d,0x10,0x0d,0x18,0x0d,0x20,0x0d,0x28,0x0d,0x70,0x0d,0x30, +0x0d,0x38,0x0e,0x40,0x0d,0x40,0x0d,0x48,0x0e,0x40,0x0d,0x50,0x0d,0x58,0x0d,0x70,0x0d,0x60,0x0d,0x68,0x0d,0x70,0x0d,0x78,0x0d,0x80,0x0d,0xd8,0x0d,0x88,0x0d,0x90,0x0d,0xd8,0x0d,0x98,0x0d,0xa0,0x0d,0xd8,0x0d,0xa8,0x0d,0xb0,0x0d,0xd8,0x0d,0xb8,0x0d,0xc0,0x0d,0xc8,0x0d,0xd0,0x0d,0xd8,0x0d,0xe0,0x0d,0xe8,0x0d,0xf0,0x0d,0xf8, +0x0e,0xb8,0x0e,0x00,0x0e,0x08,0x0e,0x10,0x0e,0x18,0x0e,0x20,0x0e,0x28,0x0e,0x40,0x0e,0x30,0x0e,0x38,0x0e,0x40,0x0e,0x48,0x0e,0x50,0x0e,0x58,0x0e,0x60,0x0e,0x68,0x0e,0x70,0x0e,0x78,0x0e,0x80,0x0e,0x88,0x0e,0x90,0x0e,0xb8,0x0e,0x98,0x0e,0xa0,0x0e,0xa8,0x0e,0xb0,0x0e,0xb8,0x0e,0xc0,0x0e,0xc8,0x0e,0xd0,0x0e,0xd8,0x0e,0xe0, +0x0e,0xe8,0x0e,0xf0,0x0e,0xf8,0x0f,0x00,0x0f,0x08,0x0f,0x10,0x0f,0x18,0x0f,0x20,0x0f,0x28,0x0f,0x30,0x0f,0x38,0x0f,0x40,0x0f,0x48,0x0f,0x50,0x0f,0x58,0x0f,0x60,0x0f,0x68,0x0f,0x70,0x0f,0x78,0x0f,0x80,0x0f,0x88,0x0f,0x90,0x0f,0x98,0x0f,0xa0,0x0f,0xa8,0x0f,0xb0,0x0f,0xb8,0x0f,0xc0,0x0f,0xc8,0x0f,0xd0,0x0f,0xd8,0x0f,0xe0, +0x0f,0xe8,0x0f,0xf0,0x0f,0xf8,0x10,0x00,0x10,0x08,0x10,0x10,0x10,0x18,0x10,0x20,0x10,0x28,0x10,0x30,0x10,0x38,0x10,0x40,0x10,0x48,0x10,0x50,0x10,0x58,0x11,0xd8,0x10,0x60,0x10,0x60,0x10,0x68,0x10,0x70,0x10,0x70,0x10,0x78,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x88,0x10,0x88,0x10,0x90,0x10,0xa0,0x10,0x98, +0x10,0xa0,0x10,0xa0,0x10,0xa8,0x10,0xa8,0x10,0xb0,0x10,0xb8,0x10,0xc0,0x11,0xc4,0x10,0xc8,0x10,0xc8,0x11,0xce,0x10,0xd0,0x10,0xd8,0x10,0xe0,0x10,0xe8,0x10,0xf0,0x10,0xf8,0x11,0x00,0x11,0x08,0x11,0x10,0x11,0x18,0x11,0x20,0x11,0x28,0x11,0x30,0x11,0x38,0x11,0x40,0x11,0x48,0x11,0x50,0x11,0x58,0x11,0x60,0x11,0x68,0x11,0x70, +0x11,0x78,0x11,0x80,0x11,0x88,0x11,0x90,0x11,0x98,0x11,0xa0,0x11,0xa8,0x0e,0x4c,0x00,0x00,0x0e,0x92,0x00,0x08,0x41,0x5a,0x45,0x20,0x0e,0xdc,0x43,0x41,0x54,0x20,0x0f,0x28,0x43,0x52,0x54,0x20,0x0f,0x74,0x4b,0x41,0x5a,0x20,0x0f,0xc0,0x4d,0x4f,0x4c,0x20,0x10,0x0c,0x52,0x4f,0x4d,0x20,0x10,0x58,0x54,0x41,0x54,0x20,0x10,0xa4, +0x54,0x52,0x4b,0x20,0x10,0xf0,0x00,0x00,0x00,0x01,0x01,0xb2,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0xb9,0x00,0x00,0x00,0x01,0x01,0xba,0x00,0x00,0x00,0x01,0x01,0xbb,0x00,0x00,0x00,0x01,0x01,0xbc,0x00,0x00,0x00,0x01,0x01,0xbd,0x00,0x00,0x00,0x01,0x01,0xbe,0x00,0x00,0x00,0x01,0x01,0xbf,0x00,0x00,0x00,0x01, +0x01,0xc0,0x00,0x00,0x00,0x01,0x01,0xc1,0x00,0x00,0x00,0x01,0x01,0xc2,0x00,0x00,0x00,0x01,0x01,0xc3,0x00,0x00,0x00,0x01,0x01,0xc4,0x00,0x00,0x00,0x01,0x01,0xc5,0x00,0x00,0x00,0x01,0x01,0xc6,0x00,0x00,0x00,0x01,0x01,0xc7,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x01,0xc9,0x00,0x00,0x00,0x01,0x01,0xca,0x00,0x00, +0x00,0x01,0x01,0xcb,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x01,0xa2,0x00,0x00,0x00,0x01,0x01,0x9c,0x00,0x00,0x00,0x01,0x01,0x9d,0x00,0x00,0x00,0x01,0x01,0xa1,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x01,0x9e,0x00,0x00,0x00,0x01,0x01,0x9f,0x00,0x00,0x00,0x01,0x01,0xa8,0x10,0x54,0x00,0x01,0x01,0xb4, +0x10,0x52,0x00,0x01,0x01,0xb5,0x10,0x50,0x00,0x01,0x01,0xb6,0x10,0x4e,0x00,0x01,0x01,0xb7,0x00,0x00,0x00,0x01,0x01,0xa7,0x00,0x00,0x00,0x01,0x01,0xa9,0x00,0x00,0x00,0x01,0x01,0xb3,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x01,0xaf,0x01,0xb1,0x00,0x00,0x00,0x03,0x01,0x94,0x01,0x97,0x01,0x9a,0x00,0x00, +0x00,0x03,0x01,0xaa,0x01,0xab,0x01,0xac,0x00,0x00,0x00,0x04,0x01,0x94,0x01,0x97,0x01,0x9a,0x01,0x9a,0x00,0x00,0x00,0x9a,0x00,0x02,0x00,0x04,0x00,0x07,0x00,0x0a,0x00,0x0d,0x00,0x10,0x00,0x13,0x00,0x16,0x00,0x19,0x00,0x1c,0x00,0x1e,0x00,0x20,0x00,0x23,0x00,0x27,0x00,0x2c,0x00,0x2e,0x00,0x30,0x00,0x32,0x00,0x34,0x00,0x36, +0x00,0x38,0x00,0x3a,0x00,0x3d,0x00,0x41,0x00,0x43,0x00,0x46,0x00,0x49,0x00,0x4b,0x00,0x4e,0x00,0x50,0x00,0x54,0x00,0x57,0x00,0x5b,0x00,0x5d,0x00,0x60,0x00,0x64,0x00,0x67,0x00,0x6a,0x00,0x6d,0x00,0x6f,0x00,0x72,0x00,0x74,0x00,0x76,0x00,0x79,0x00,0x7c,0x00,0x80,0x00,0x83,0x00,0x85,0x00,0x87,0x00,0x8b,0x00,0x8e,0x00,0x90, +0x00,0x92,0x00,0x95,0x00,0x98,0x00,0x9a,0x00,0x9d,0x00,0xa1,0x00,0xa3,0x00,0xa5,0x00,0xa7,0x00,0xa9,0x00,0xac,0x00,0xaf,0x00,0xb1,0x00,0xb4,0x00,0xb6,0x00,0xb9,0x00,0xbc,0x00,0xbf,0x00,0xc1,0x00,0xc4,0x00,0xc8,0x00,0xcb,0x00,0xcd,0x00,0xcf,0x00,0xd1,0x00,0xd4,0x00,0xd7,0x00,0xdb,0x00,0xdf,0x00,0xe1,0x00,0xe3,0x00,0xe6, +0x00,0xea,0x00,0xed,0x00,0xef,0x00,0xf2,0x00,0xf5,0x00,0xf7,0x00,0xf9,0x00,0xfc,0x00,0xff,0x01,0x02,0x01,0x06,0x01,0x09,0x01,0x0d,0x01,0x0f,0x01,0x11,0x01,0x13,0x01,0x16,0x01,0x18,0x01,0x1c,0x01,0x1e,0x01,0x21,0x01,0x24,0x01,0x27,0x01,0x2a,0x01,0x2d,0x01,0x30,0x01,0x33,0x01,0x36,0x01,0x39,0x01,0x3c,0x01,0x3e,0x01,0x41, +0x01,0x43,0x01,0x46,0x01,0x48,0x01,0x4a,0x01,0x4d,0x01,0x50,0x01,0x52,0x01,0x54,0x01,0x56,0x01,0x58,0x01,0x5b,0x01,0x5d,0x01,0x60,0x01,0x62,0x01,0x64,0x01,0x66,0x01,0x68,0x01,0x6a,0x01,0x6c,0x01,0x6e,0x01,0x70,0x01,0x72,0x01,0x74,0x01,0x76,0x01,0x78,0x01,0x7a,0x01,0x7c,0x01,0x7e,0x01,0x80,0x01,0x82,0x01,0x84,0x01,0x86, +0x01,0x88,0x01,0x8a,0x01,0x8c,0x01,0x8e,0x01,0x90,0x01,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x1d,0xcc,0x00,0x06,0x00,0x00,0x00,0x01,0x1b,0xf6,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xba,0x00,0x06,0x00,0x00,0x00,0x01,0x1b,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xb0,0x00,0x06,0x00,0x00, +0x00,0x01,0x10,0x3a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xa6,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xa4,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x2a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x98,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x1c,0x00,0x01,0x00,0x00, +0x00,0x01,0x11,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x26,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x28,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x2a,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x2c,0x00,0x06,0x00,0x00, +0x00,0x01,0x18,0xcc,0x00,0x01,0x00,0x00,0x00,0x01,0x18,0xd0,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x1e,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x20,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x0e,0x00,0x06,0x00,0x00, +0x00,0x01,0x0f,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x04,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xf2,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0xf4,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xf6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xfc,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xfe,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x02,0x00,0x01,0x00,0x00, +0x00,0x01,0x11,0x04,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x8e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x84,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xe8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x62,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xe8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xec,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00, +0x00,0x01,0x10,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf4,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0xa2,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x0c,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x8a,0x00,0x01,0x00,0x00, +0x00,0x01,0x0d,0x02,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xb6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xb8,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xe6,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x62,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xdc,0x00,0x06,0x00,0x00, +0x00,0x01,0x10,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xca,0x00,0x06,0x00,0x00,0x00,0x01,0x17,0x0c,0x00,0x01,0x00,0x00,0x00,0x01,0x17,0x10,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x86,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x88,0x00,0x06,0x00,0x00,0x00,0x01,0x19,0x28,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0x82,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x16,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x74,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x76,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x78,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x7a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x7c,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0x7e,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0xd2,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0x50,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0xca,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x62,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0x9c,0x00,0x01,0x00,0x00, +0x00,0x01,0x16,0xa0,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0xa4,0x00,0x01,0x00,0x00,0x00,0x01,0x16,0xa8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x44,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x50,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x5a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x5c,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0x5e,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x0b,0x9c,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x0b,0x92,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x42,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x44,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x50,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x15,0xbc,0x00,0x01,0x00,0x00,0x00,0x01,0x15,0xc0,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x0c,0x82,0x00,0x01,0x00,0x00, +0x00,0x01,0x0a,0xf8,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xf6,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x38,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x3a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x3c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x3e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x42,0x00,0x06,0x00,0x00, +0x00,0x01,0x0c,0x42,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xbc,0x00,0x06,0x00,0x00,0x00,0x01,0x0c,0x3a,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xb2,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x2a,0x00,0x06,0x00,0x00, +0x00,0x01,0x10,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x2e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x30,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x32,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x68,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x5e,0x00,0x06,0x00,0x00, +0x00,0x01,0x0b,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xd2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x48,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xee,0x00,0x06,0x00,0x00,0x00,0x01,0x14,0xa4,0x00,0x01,0x00,0x00, +0x00,0x01,0x14,0xa8,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xdc,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xde,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe2,0x00,0x06,0x00,0x00, +0x00,0x01,0x0f,0xe4,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe6,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe8,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xea,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xee,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xf0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xf2,0x00,0x06,0x00,0x00, +0x00,0x01,0x0f,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xf6,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x90,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xd0,0x00,0x01,0x00,0x00, +0x00,0x01,0x0f,0xd2,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x76,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x74,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x60,0x00,0x01,0x00,0x00, +0x00,0x01,0x09,0x5e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x94,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x96,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x98,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x9e,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xa2,0x00,0x01,0x00,0x00, +0x00,0x01,0x09,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x90,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x92,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x0a,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x08,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x7c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x7e,0x00,0x06,0x00,0x00, +0x00,0x01,0x0a,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0xec,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x68,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x6c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00, +0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x64,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x66,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x62,0x00,0x06,0x00,0x00, +0x00,0x01,0x0f,0x64,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x66,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x68,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x6c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00, +0x00,0x01,0x0f,0x74,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x76,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x38,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00,0x00,0x01,0x09,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x54,0x00,0x01,0x00,0x00, +0x00,0x01,0x12,0x58,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x5a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x5c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x5e,0x00,0x01,0x00,0x00,0x00,0x01,0x07,0xdc,0x00,0x06,0x00,0x00, +0x00,0x01,0x12,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x28,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x30,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x34,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x38,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x3c,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x40,0x00,0x06,0x00,0x00, +0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x07,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00, +0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x2a,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0xcc,0x00,0x01,0x00,0x00, +0x00,0x01,0x11,0xd0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0xb4,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xb8,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x14,0x00,0x01,0x00,0x00, +0x00,0x01,0x0f,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xa0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x0c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x0e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x10,0x00,0x01,0x00,0x00, +0x00,0x01,0x0f,0x12,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x84,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x88,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x04,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x06,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x08,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x0a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x0c,0x00,0x01,0x00,0x00, +0x00,0x01,0x0f,0x0e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x10,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x12,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x14,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00, +0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x2a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xec,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0xd8,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0x1c,0x00,0x04,0x00,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0xa8,0x00,0x01,0x00,0x00, +0x00,0x01,0x10,0xca,0x00,0x06,0x00,0x00,0x00,0x01,0x06,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x96,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x94,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x86,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x88,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x86,0x00,0x01,0x00,0x00, +0x00,0x01,0x05,0x84,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x90,0x00,0x04,0x00,0x00,0x00,0x01,0x06,0xb2,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0xac,0x00,0x01,0x00,0x00,0x00,0x01,0x13,0x42,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x6e,0x00,0x01,0x00,0x00, +0x00,0x01,0x0e,0x78,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x3e,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xdc,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xc8,0x00,0x01,0x00,0x00, +0x00,0x01,0x12,0x52,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x04,0xf6,0x00,0x01,0x00,0x00, +0x00,0x01,0x04,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x30,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x38,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xe2,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0xca,0x10,0xe0,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0xec,0x11,0x02,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0x6e, +0x10,0x80,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0x88,0x10,0x9a,0x00,0x06,0x00,0x00,0x00,0x04,0x10,0xfa,0x11,0x4a,0x11,0x0c,0x11,0x1e,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10, +0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b, +0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06, +0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23, +0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1b,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27, +0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1c, +0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14, +0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1d,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e, +0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1e,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08, +0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1f,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01, +0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x20,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29, +0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x21,0x00,0x22,0x00,0x23, +0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x03,0x00,0x01,0x12,0x42,0x00,0x15,0x00,0x01,0x12,0x36,0x00,0x33,0x00,0x01,0x11,0xc0,0x00,0x31,0x00,0x01,0x11,0xba,0x03,0x89,0x00,0x01,0x11,0xba,0x00,0x35,0x00,0x01,0x11,0xb4, +0x03,0x88,0x00,0x01,0x11,0xb4,0x00,0x66,0x00,0x01,0x11,0xae,0x00,0x67,0x00,0x01,0x11,0xa8,0x00,0x68,0x00,0x01,0x11,0xa2,0x03,0x94,0x00,0x01,0x12,0x0c,0x00,0x6e,0x00,0x01,0x12,0x06,0x00,0x70,0x00,0x01,0x12,0x00,0x03,0x91,0x00,0x01,0x11,0x90,0x00,0x63,0x00,0x01,0x11,0x8a,0x03,0x9a,0x00,0x01,0x11,0x8a,0x02,0x08,0x00,0x01, +0x11,0x84,0x02,0x09,0x00,0x01,0x11,0x7e,0x02,0xb9,0x00,0x01,0x11,0x7e,0x00,0x56,0x00,0x01,0x11,0x78,0x00,0x57,0x00,0x01,0x11,0x72,0x03,0xa5,0x00,0x01,0x11,0x72,0x02,0x32,0x00,0x01,0x11,0x6c,0x02,0x35,0x00,0x01,0x11,0x6c,0x02,0x15,0x00,0x01,0x11,0x66,0x02,0x18,0x00,0x01,0x11,0x66,0x00,0x60,0x00,0x01,0x11,0x60,0x03,0xa0, +0x00,0x01,0x11,0x60,0x02,0x0a,0x00,0x01,0x11,0x5a,0x02,0x0b,0x00,0x01,0x11,0x94,0x00,0x59,0x00,0x01,0x11,0x54,0x00,0x60,0x00,0x01,0x11,0x4e,0x00,0x61,0x00,0x01,0x11,0x48,0x03,0xa2,0x00,0x01,0x11,0x7c,0x00,0x5a,0x00,0x01,0x11,0x76,0x03,0xa3,0x00,0x01,0x11,0x3c,0x00,0x55,0x00,0x01,0x11,0x36,0x01,0x10,0x00,0x01,0x11,0x36, +0x00,0x15,0x00,0x01,0x11,0x30,0x00,0x16,0x00,0x01,0x11,0x2a,0x03,0x77,0x00,0x01,0x11,0x2a,0x00,0x64,0x00,0x01,0x11,0x24,0x00,0x65,0x00,0x01,0x11,0x1e,0x03,0x9e,0x00,0x01,0x11,0x1e,0x00,0x57,0x00,0x01,0x11,0x18,0x00,0x58,0x00,0x01,0x11,0x12,0x01,0x19,0x00,0x01,0x11,0x12,0x00,0x55,0x00,0x01,0x11,0x0c,0x03,0x72,0x00,0x01, +0x10,0xe2,0x02,0xb5,0x00,0x01,0x10,0xd0,0x02,0xb3,0x00,0x01,0x11,0x00,0x02,0x39,0x00,0x01,0x10,0xbe,0x02,0xb2,0x00,0x01,0x10,0xf4,0x02,0xac,0x00,0x01,0x10,0x70,0x00,0x07,0x00,0x01,0x10,0xee,0x00,0x0f,0x00,0x01,0x10,0xe8,0x00,0x10,0x00,0x01,0x13,0x50,0x00,0x10,0x00,0x01,0x10,0xf2,0xff,0xe3,0x00,0x01,0x13,0x44,0x00,0x24, +0x00,0x01,0x13,0x34,0xff,0xf6,0x00,0x01,0x10,0x4c,0x00,0x0a,0x00,0x01,0x12,0x30,0x00,0x38,0x00,0x01,0x12,0x34,0x00,0x94,0x00,0x01,0x10,0x40,0x00,0x7f,0x00,0x01,0x10,0x46,0x00,0xae,0x00,0x01,0x12,0x2c,0x00,0x63,0x00,0x01,0x10,0x34,0x00,0x40,0x00,0x01,0x10,0x34,0x00,0xcf,0x00,0x01,0x10,0x34,0x00,0x01,0x13,0x12,0x00,0x01, +0x10,0x32,0x00,0x01,0x13,0x14,0x00,0x01,0x10,0x30,0x00,0x01,0x13,0x16,0x00,0x01,0x10,0x28,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x20,0x00,0x01,0x18,0xee,0x00,0x01,0x10,0x88,0x00,0x01,0x16,0x72,0x00,0x01,0x10,0x80,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x0e,0x00,0x01,0x16,0x7a,0x00,0x01,0x10,0x0c,0x00,0x01,0x12,0xf0,0x00,0x01, +0x10,0x04,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x02,0x00,0x01,0x16,0x7a,0x00,0x01,0x0f,0xfa,0x00,0x01,0x16,0x7e,0x00,0x01,0x0f,0xf8,0x00,0x01,0x1b,0x08,0x00,0x01,0x0f,0xf0,0x00,0x01,0x16,0x7a,0x00,0x01,0x0f,0xee,0x00,0x01,0x1b,0x0a,0x00,0x01,0x0f,0xe6,0x00,0x01,0x16,0x76,0x00,0x01,0x0f,0xe4,0x00,0x01,0x18,0x9c,0x00,0x01, +0x0f,0xe2,0x00,0x01,0x1a,0x4a,0x00,0x01,0x0f,0xda,0x00,0x01,0x1a,0xfc,0x00,0x01,0x10,0x12,0x00,0x01,0x16,0x62,0x00,0x01,0x0f,0xd0,0x00,0x01,0x12,0x9a,0x00,0x01,0x0f,0xc8,0x00,0x01,0x16,0x5e,0x00,0x01,0x0f,0xfa,0x00,0x01,0x16,0x62,0x00,0x01,0x0f,0xbe,0x00,0x01,0x18,0x72,0x00,0x01,0x0f,0xbc,0x00,0x01,0x1a,0x22,0x00,0x01, +0x0f,0xb4,0x00,0x01,0x18,0x70,0x00,0x01,0x0f,0xb2,0x00,0x01,0x12,0x74,0x00,0x01,0x0f,0xaa,0x00,0x01,0x16,0x46,0x00,0x01,0x0f,0xa8,0x00,0x01,0x12,0x6e,0x00,0x01,0x0f,0xa0,0x00,0x01,0x16,0x42,0x00,0x01,0x0f,0x9e,0x00,0x01,0x12,0x68,0x00,0x01,0x0f,0x9c,0x00,0x01,0x18,0x4e,0x00,0x01,0x0f,0x9a,0x00,0x01,0x12,0x62,0x00,0x01, +0x21,0xd0,0x00,0x01,0x0f,0x98,0x00,0x01,0x12,0x6c,0x00,0x02,0x12,0x5c,0x12,0x64,0x00,0x02,0x12,0x62,0x00,0x02,0x06,0xce,0x03,0x77,0x00,0x02,0x12,0x58,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x12,0x56,0x00,0x02,0x10,0xf6,0x16,0x08,0x00,0x02,0x12,0x4c,0x00,0x02,0x03,0x6e,0x06,0xce,0x00,0x02,0x12,0x42,0x00,0x02,0x06,0xce, +0x06,0xce,0x00,0x01,0x12,0x48,0x00,0x02,0x10,0xde,0x12,0x40,0x00,0x02,0x12,0x3e,0x00,0x02,0x03,0x79,0x06,0xce,0x00,0x01,0x12,0x3c,0x00,0x02,0x15,0xe0,0x0f,0x56,0x00,0x02,0x12,0x32,0x00,0x02,0x06,0xce,0x03,0x8f,0x00,0x01,0x13,0x08,0x00,0x02,0x0f,0x46,0x15,0xd6,0x00,0x02,0x12,0xfe,0x00,0x02,0x06,0x20,0x06,0xce,0x00,0x01, +0x12,0x24,0x00,0x02,0x0f,0x36,0x12,0x1c,0x00,0x02,0x12,0x1a,0x00,0x02,0x06,0x0b,0x06,0xce,0x00,0x01,0x12,0x20,0x00,0x02,0x0f,0x26,0x12,0x18,0x00,0x02,0x12,0x16,0x00,0x02,0x06,0x11,0x06,0xce,0x00,0x01,0x12,0x14,0x00,0x02,0x10,0x80,0x0f,0x16,0x00,0x02,0x12,0x0a,0x00,0x02,0x06,0xce,0x03,0x7c,0x00,0x01,0x12,0x08,0x00,0x02, +0x0f,0x06,0x10,0x72,0x00,0x02,0x11,0xfe,0x00,0x02,0x06,0x12,0x06,0xce,0x00,0x01,0x11,0xfc,0x00,0x02,0x1a,0x28,0x0e,0xf6,0x00,0x02,0x11,0xf2,0x00,0x02,0x06,0xce,0x03,0x7d,0x00,0x01,0x11,0xf8,0x00,0x02,0x11,0xf0,0x0e,0xe6,0x00,0x02,0x11,0xee,0x00,0x02,0x06,0xce,0x03,0x7a,0x00,0x02,0x11,0xec,0x00,0x02,0x03,0xaf,0x06,0xce, +0x00,0x02,0x11,0xe2,0x00,0x02,0x06,0xce,0x03,0xae,0x00,0x01,0x12,0xd0,0x00,0x02,0x15,0x40,0x0e,0xc2,0x00,0x02,0x12,0xc6,0x00,0x02,0x06,0xce,0x03,0xa8,0x00,0x01,0x12,0xbc,0x00,0x02,0x17,0x2c,0x0e,0xb2,0x00,0x02,0x12,0xb2,0x00,0x02,0x06,0xce,0x03,0xac,0x00,0x01,0x12,0xa8,0x00,0x02,0x11,0xb8,0x10,0x00,0x00,0x02,0x12,0x9e, +0x00,0x02,0x06,0xce,0x03,0xa9,0x00,0x01,0x11,0xac,0x00,0x02,0x0e,0x8e,0x18,0xa2,0x00,0x02,0x11,0xa2,0x00,0x02,0x03,0xa6,0x06,0xce,0x00,0x01,0x11,0x98,0x00,0x02,0x0f,0xde,0x18,0x9c,0x00,0x02,0x11,0x8e,0x00,0x02,0x03,0xa7,0x06,0xce,0x00,0x01,0x11,0x84,0x00,0x02,0x18,0x96,0x0e,0x6a,0x00,0x02,0x11,0x7a,0x00,0x02,0x06,0xce, +0x03,0x99,0x00,0x01,0x12,0x38,0x00,0x02,0x11,0x78,0x0e,0x5a,0x00,0x02,0x12,0x2e,0x00,0x02,0x06,0xce,0x03,0x82,0x00,0x01,0x11,0x6c,0x00,0x02,0x14,0xbe,0x0e,0x4a,0x00,0x02,0x11,0x62,0x00,0x02,0x06,0xce,0x03,0x81,0x00,0x01,0x13,0xd0,0x00,0x02,0x0e,0x3a,0x14,0xb4,0x00,0x02,0x13,0xc6,0x00,0x02,0x06,0x4f,0x06,0xce,0x00,0x02, +0x13,0xbc,0x00,0x02,0x06,0x34,0x06,0xce,0x00,0x01,0x11,0x4a,0x00,0x02,0x0e,0x20,0x11,0x42,0x00,0x02,0x11,0x40,0x00,0x02,0x06,0x4d,0x06,0xce,0x00,0x01,0x11,0x8e,0x00,0x02,0x0e,0x10,0x14,0x8c,0x00,0x02,0x11,0x84,0x00,0x02,0x06,0x39,0x06,0xce,0x00,0x01,0x11,0x7a,0x00,0x02,0x0e,0x00,0x14,0x82,0x00,0x02,0x11,0x70,0x00,0x02, +0x06,0xce,0x06,0x3a,0x00,0x01,0x11,0xfe,0x00,0x02,0x14,0x78,0x0d,0xf0,0x00,0x02,0x11,0xf4,0x00,0x02,0x06,0xce,0x06,0x52,0x00,0x01,0x11,0x12,0x00,0x02,0x11,0x02,0x11,0x0a,0x00,0x02,0x11,0x08,0x00,0x02,0x06,0xce,0x06,0x40,0x00,0x01,0x10,0xfe,0x00,0x02,0x14,0x5a,0x0f,0x12,0x00,0x02,0x10,0xf4,0x00,0x02,0x06,0xce,0x06,0x3f, +0x00,0x01,0x10,0xea,0x00,0x02,0x14,0x50,0x0d,0xb8,0x00,0x02,0x10,0xe0,0x00,0x02,0x06,0xce,0x06,0x3e,0x00,0x01,0x11,0x36,0x00,0x02,0x14,0x46,0x0d,0xa8,0x00,0x02,0x11,0x2c,0x00,0x02,0x06,0xce,0x03,0x70,0x00,0x01,0x11,0x82,0x00,0x02,0x10,0xca,0x0e,0xdc,0x00,0x02,0x11,0x78,0x00,0x02,0x06,0xce,0x03,0x72,0x00,0x01,0x11,0x6e, +0x00,0x02,0x15,0xda,0x0d,0x84,0x00,0x02,0x11,0x64,0x00,0x02,0x06,0xce,0x03,0x6f,0x00,0x01,0x11,0x5a,0x00,0x02,0x18,0x04,0x0d,0x74,0x00,0x02,0x11,0x50,0x00,0x02,0x06,0xce,0x03,0x71,0x00,0x01,0x11,0x3e,0x00,0x02,0x0d,0x64,0x15,0xbe,0x00,0x02,0x11,0x34,0x00,0x02,0x06,0x2e,0x06,0xce,0x00,0x01,0x10,0xaa,0x00,0x02,0x0d,0x54, +0x10,0x82,0x00,0x02,0x10,0xa0,0x00,0x02,0x06,0x2d,0x06,0xce,0x00,0x01,0x10,0x76,0x00,0x02,0x0d,0x44,0x18,0x3c,0x00,0x02,0x10,0x6c,0x00,0x02,0x06,0x2c,0x06,0xce,0x00,0x01,0x11,0x1a,0x00,0x02,0x0d,0x34,0x17,0x32,0x00,0x02,0x11,0x10,0x00,0x02,0x06,0x47,0x06,0xce,0x00,0x01,0x11,0x06,0x00,0x02,0x0d,0x24,0x13,0xb0,0x00,0x02, +0x10,0xfc,0x00,0x02,0x06,0x50,0x06,0xce,0x00,0x01,0x10,0xf2,0x00,0x02,0x0e,0x42,0x15,0x66,0x00,0x02,0x10,0xe8,0x00,0x02,0x06,0x49,0x06,0xce,0x00,0x01,0x10,0x2e,0x00,0x02,0x13,0x92,0x0d,0x00,0x00,0x02,0x10,0x24,0x00,0x02,0x03,0xb0,0x06,0xce,0x00,0x01,0x10,0x22,0x00,0x02,0x16,0xf0,0x0c,0xf0,0x00,0x02,0x10,0x18,0x00,0x02, +0x06,0xce,0x03,0x90,0x00,0x01,0x10,0x0e,0x00,0x02,0x15,0x36,0x0e,0x0c,0x00,0x02,0x10,0x04,0x00,0x02,0x06,0xce,0x03,0x91,0x00,0x01,0x0f,0xfa,0x00,0x02,0x0c,0xcc,0x15,0x2e,0x00,0x02,0x0f,0xf0,0x00,0x02,0x06,0xce,0x06,0x22,0x00,0x01,0x10,0x76,0x00,0x02,0x17,0xd0,0x0c,0xbc,0x00,0x02,0x10,0x6c,0x00,0x02,0x06,0xce,0x06,0x26, +0x00,0x01,0x0f,0xf2,0x00,0x02,0x0c,0xac,0x15,0x12,0x00,0x02,0x0f,0xe8,0x00,0x02,0x06,0xce,0x06,0x21,0x00,0x01,0x0f,0xde,0x00,0x02,0x13,0x24,0x0c,0x9c,0x00,0x02,0x0f,0xd4,0x00,0x02,0x06,0xce,0x03,0x89,0x00,0x01,0x0f,0xba,0x00,0x02,0x0f,0xb2,0x0c,0x8c,0x00,0x02,0x0f,0xb0,0x00,0x02,0x06,0xce,0x03,0x8a,0x00,0x01,0x0f,0xae, +0x00,0x02,0x13,0x06,0x0c,0x7c,0x00,0x02,0x0f,0xa4,0x00,0x02,0x06,0xce,0x03,0x8b,0x00,0x01,0x0f,0xd2,0x00,0x02,0x12,0xfc,0x0c,0x6c,0x00,0x02,0x0f,0xc8,0x00,0x02,0x06,0xce,0x03,0x87,0x00,0x01,0x0f,0x8e,0x00,0x02,0x12,0xf2,0x0c,0x5c,0x00,0x02,0x0f,0x84,0x00,0x02,0x06,0xce,0x03,0x86,0x00,0x01,0x0f,0x8a,0x00,0x02,0x0c,0x4c, +0x14,0xa6,0x00,0x02,0x0f,0x80,0x00,0x02,0x06,0x16,0x06,0xce,0x00,0x01,0x0f,0x76,0x00,0x02,0x0c,0x3c,0x14,0x9e,0x00,0x02,0x0f,0x6c,0x00,0x02,0x06,0x18,0x06,0xce,0x00,0x01,0x0f,0x62,0x00,0x02,0x0c,0x2c,0x0f,0x5a,0x00,0x02,0x0f,0x58,0x00,0x02,0x06,0x1b,0x06,0xce,0x00,0x01,0x0f,0x56,0x00,0x02,0x0c,0x1c,0x12,0xac,0x00,0x02, +0x0f,0x4c,0x00,0x02,0x06,0x14,0x06,0xce,0x00,0x01,0x0f,0x4a,0x00,0x02,0x0c,0x0c,0x12,0xa2,0x00,0x02,0x0f,0x40,0x00,0x02,0x06,0x17,0x06,0xce,0x00,0x01,0x0f,0x2e,0x00,0x02,0x0b,0xfc,0x12,0x98,0x00,0x02,0x0f,0x24,0x00,0x02,0x06,0x0f,0x06,0xce,0x00,0x01,0x0f,0x22,0x00,0x02,0x0b,0xec,0x12,0x8e,0x00,0x02,0x0f,0x18,0x00,0x02, +0x06,0x19,0x06,0xce,0x00,0x01,0x10,0xf6,0x00,0x02,0x0c,0xd2,0x0f,0x16,0x00,0x02,0x10,0xec,0x00,0x02,0x06,0x35,0x06,0xce,0x00,0x01,0x0f,0x0a,0x00,0x02,0x0b,0xc8,0x12,0x70,0x00,0x02,0x0f,0x00,0x00,0x02,0x03,0x93,0x06,0xce,0x00,0x01,0x0e,0xfe,0x00,0x02,0x16,0x6e,0x0b,0xb8,0x00,0x02,0x0e,0xf4,0x00,0x02,0x06,0xce,0x03,0x96, +0x00,0x01,0x0e,0xfa,0x00,0x02,0x0b,0xa8,0x0e,0xf2,0x00,0x02,0x0e,0xf0,0x00,0x02,0x03,0x92,0x06,0xce,0x00,0x01,0x0e,0xee,0x00,0x02,0x0b,0x98,0x12,0x3e,0x00,0x02,0x0e,0xe4,0x00,0x02,0x06,0x0e,0x06,0xce,0x00,0x01,0x0e,0xea,0x00,0x02,0x0e,0xe2,0x0b,0x88,0x00,0x02,0x0e,0xe0,0x00,0x02,0x06,0xce,0x03,0x83,0x00,0x01,0x0e,0xde, +0x00,0x02,0x0b,0x78,0x13,0xba,0x00,0x02,0x0e,0xd4,0x00,0x02,0x06,0xce,0x06,0x29,0x00,0x01,0x10,0x6a,0x00,0x02,0x0b,0x68,0x12,0x0c,0x00,0x02,0x10,0x60,0x00,0x02,0x06,0xce,0x06,0x38,0x00,0x01,0x0e,0xd6,0x00,0x02,0x0b,0x58,0x13,0x9e,0x00,0x02,0x0e,0xcc,0x00,0x02,0x06,0xce,0x06,0x4c,0x00,0x01,0x0e,0xaa,0x00,0x02,0x15,0x6c, +0x0b,0x48,0x00,0x02,0x0e,0xa0,0x00,0x02,0x06,0xce,0x06,0x25,0x00,0x01,0x0e,0x96,0x00,0x02,0x11,0xda,0x0c,0x10,0x00,0x02,0x0e,0x8c,0x00,0x02,0x06,0xce,0x06,0x27,0x00,0x01,0x0e,0x82,0x00,0x02,0x0b,0x24,0x11,0xd0,0x00,0x02,0x0e,0x78,0x00,0x02,0x06,0xce,0x06,0x2f,0x00,0x01,0x0e,0x6e,0x00,0x02,0x0b,0x14,0x11,0xc6,0x00,0x02, +0x0e,0x64,0x00,0x02,0x06,0x32,0x06,0xce,0x00,0x01,0x0e,0x62,0x00,0x02,0x0b,0x04,0x11,0xbc,0x00,0x02,0x0e,0x58,0x00,0x02,0x06,0x31,0x06,0xce,0x00,0x01,0x0e,0x4e,0x00,0x02,0x0a,0xf4,0x13,0x32,0x00,0x02,0x0e,0x44,0x00,0x02,0x06,0x2a,0x06,0xce,0x00,0x01,0x0e,0x3a,0x00,0x02,0x0a,0xe4,0x11,0x9e,0x00,0x02,0x0e,0x30,0x00,0x02, +0x06,0xce,0x06,0x2b,0x00,0x01,0x0e,0x3e,0x00,0x02,0x11,0x94,0x0a,0xd4,0x00,0x02,0x0e,0x34,0x00,0x02,0x06,0xce,0x06,0x53,0x00,0x01,0x0f,0xa2,0x00,0x02,0x13,0x02,0x0a,0xc4,0x00,0x02,0x0f,0x98,0x00,0x02,0x06,0xce,0x03,0x73,0x00,0x01,0x0f,0x8e,0x00,0x02,0x0e,0x06,0x0b,0x76,0x00,0x02,0x0f,0x84,0x00,0x02,0x06,0xce,0x03,0x74, +0x00,0x01,0x0d,0xfa,0x00,0x02,0x11,0x62,0x0b,0x68,0x00,0x02,0x0d,0xf0,0x00,0x02,0x06,0xce,0x06,0x28,0x00,0x01,0x0d,0xee,0x00,0x02,0x11,0x58,0x0b,0x5a,0x00,0x02,0x0d,0xe4,0x00,0x02,0x06,0xce,0x06,0x55,0x00,0x01,0x0d,0xfa,0x00,0x02,0x11,0x4e,0x0a,0x78,0x00,0x02,0x0d,0xf0,0x00,0x02,0x06,0xce,0x03,0x75,0x00,0x01,0x0d,0xd6, +0x00,0x02,0x0a,0x68,0x11,0x44,0x00,0x02,0x0d,0xcc,0x00,0x02,0x06,0x5c,0x06,0xce,0x00,0x01,0x0d,0xc2,0x00,0x02,0x0a,0x58,0x0d,0xba,0x00,0x02,0x0d,0xb8,0x00,0x02,0x06,0x5a,0x06,0xce,0x00,0x01,0x0d,0xbe,0x00,0x02,0x0a,0x48,0x0d,0xb6,0x00,0x02,0x0d,0xb4,0x00,0x02,0x06,0x58,0x06,0xce,0x00,0x01,0x0d,0xba,0x00,0x02,0x0d,0xb2, +0x0a,0x38,0x00,0x02,0x0d,0xb0,0x00,0x02,0x06,0xce,0x06,0x59,0x00,0x01,0x0d,0xb6,0x00,0x02,0x0a,0x28,0x0d,0xae,0x00,0x02,0x0d,0xac,0x00,0x02,0x06,0x5d,0x06,0xce,0x00,0x01,0x0d,0xb2,0x00,0x02,0x0a,0x18,0x0d,0xaa,0x00,0x02,0x0d,0xa8,0x00,0x02,0x06,0x42,0x06,0xce,0x00,0x01,0x0d,0xae,0x00,0x02,0x0d,0xa6,0x0a,0x08,0x00,0x02, +0x0d,0xa4,0x00,0x02,0x06,0xce,0x06,0x1c,0x00,0x01,0x0d,0xaa,0x00,0x02,0x09,0xf8,0x0d,0xa2,0x00,0x02,0x0d,0xa0,0x00,0x02,0x06,0x45,0x06,0xce,0x00,0x01,0x0d,0xa6,0x00,0x02,0x0d,0x9e,0x09,0xe8,0x00,0x02,0x0d,0x9c,0x00,0x02,0x06,0xce,0x06,0x1f,0x00,0x01,0x0d,0xa2,0x00,0x02,0x09,0xd8,0x0d,0x9a,0x00,0x02,0x0d,0x98,0x00,0x02, +0x06,0x3c,0x06,0xce,0x00,0x01,0x0d,0x9e,0x00,0x02,0x0d,0x96,0x09,0xc8,0x00,0x02,0x0d,0x94,0x00,0x02,0x06,0xce,0x03,0x98,0x00,0x01,0x0d,0x9a,0x00,0x02,0x09,0xb8,0x0d,0x92,0x00,0x02,0x0d,0x90,0x00,0x02,0x06,0x56,0x06,0xce,0x00,0x01,0x0d,0x96,0x00,0x02,0x0d,0x8e,0x09,0xa8,0x00,0x02,0x0d,0x8c,0x00,0x02,0x06,0xce,0x03,0xaa, +0x00,0x01,0x0d,0x92,0x00,0x02,0x0d,0x8a,0x09,0x98,0x00,0x02,0x0d,0x88,0x00,0x02,0x06,0xce,0x03,0x9b,0x00,0x01,0x0d,0x8e,0x00,0x02,0x0d,0x86,0x09,0x88,0x00,0x02,0x0d,0x84,0x00,0x02,0x06,0xce,0x03,0x9c,0x00,0x01,0x0d,0x8a,0x00,0x02,0x0d,0x82,0x09,0x78,0x00,0x02,0x0d,0x80,0x00,0x02,0x06,0xce,0x03,0x9a,0x00,0x01,0x0d,0x86, +0x00,0x02,0x09,0x68,0x0d,0x7e,0x00,0x02,0x0d,0x7c,0x00,0x02,0x03,0x9f,0x06,0xce,0x00,0x01,0x0d,0x7a,0x00,0x02,0x0f,0xfa,0x09,0x58,0x00,0x02,0x0d,0x70,0x00,0x02,0x06,0xce,0x03,0xa4,0x00,0x01,0x0d,0x76,0x00,0x02,0x09,0x48,0x0d,0x6e,0x00,0x02,0x0d,0x6c,0x00,0x02,0x03,0x9e,0x06,0xce,0x00,0x01,0x0d,0x72,0x00,0x02,0x09,0x38, +0x0d,0x6a,0x00,0x02,0x0d,0x68,0x00,0x02,0x03,0x9d,0x06,0xce,0x00,0x01,0x0d,0x6e,0x00,0x02,0x0d,0x66,0x09,0x28,0x00,0x02,0x0d,0x64,0x00,0x02,0x06,0xce,0x03,0xa3,0x00,0x01,0x0d,0x6a,0x00,0x02,0x09,0x18,0x0d,0x62,0x00,0x02,0x0d,0x60,0x00,0x02,0x03,0x7e,0x06,0xce,0x00,0x02,0x0d,0x5e,0x00,0x02,0x01,0xc5,0x01,0xc4,0x00,0x02, +0x0d,0x5c,0x00,0x02,0x02,0x0b,0x02,0x50,0x00,0x01,0x10,0xde,0x00,0x03,0x09,0x6c,0x0f,0x8c,0x0d,0x5a,0x00,0x02,0x10,0xd2,0x00,0x03,0x06,0xce,0x06,0xce,0x03,0x78,0x00,0x01,0x10,0xda,0x00,0x03,0x09,0x58,0x0d,0x48,0x10,0xd0,0x00,0x02,0x10,0xce,0x00,0x03,0x06,0xce,0x06,0x3b,0x06,0xce,0x00,0x01,0x10,0xcc,0x00,0x03,0x09,0x44, +0x0d,0x36,0x0f,0x64,0x00,0x02,0x10,0xc0,0x00,0x03,0x06,0xce,0x06,0x44,0x06,0xce,0x00,0x01,0x10,0xf0,0x00,0x03,0x09,0x30,0x09,0x34,0x10,0xbe,0x00,0x02,0x10,0xe4,0x00,0x03,0x06,0xce,0x06,0x4b,0x06,0xce,0x00,0x01,0x10,0xb0,0x00,0x03,0x09,0x20,0x09,0x24,0x0f,0x3c,0x00,0x02,0x10,0xa4,0x00,0x03,0x06,0xce,0x06,0x37,0x06,0xce, +0x00,0x01,0x10,0xa2,0x00,0x03,0x09,0x10,0x0f,0x2c,0x09,0x14,0x00,0x02,0x10,0x96,0x00,0x03,0x06,0x41,0x06,0xce,0x06,0xce,0x00,0x01,0x10,0x94,0x00,0x03,0x0f,0x1c,0x09,0x00,0x09,0x04,0x00,0x02,0x10,0x88,0x00,0x03,0x06,0xce,0x06,0xce,0x03,0x88,0x00,0x01,0x10,0x90,0x00,0x03,0x0c,0xc4,0x08,0xf0,0x10,0x86,0x00,0x02,0x10,0x84, +0x00,0x03,0x06,0xce,0x06,0x4a,0x06,0xce,0x00,0x01,0x10,0x82,0x00,0x03,0x08,0xdc,0x0e,0xf4,0x08,0xe0,0x00,0x02,0x10,0x76,0x00,0x03,0x06,0x54,0x06,0xce,0x06,0xce,0x00,0x01,0x10,0x74,0x00,0x03,0x08,0xcc,0x0e,0xe4,0x08,0xd0,0x00,0x02,0x10,0x68,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0x36,0x00,0x01,0x10,0x70,0x00,0x03,0x08,0xbc, +0x10,0x66,0x08,0xc0,0x00,0x02,0x10,0x64,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0x48,0x00,0x01,0x10,0x62,0x00,0x03,0x08,0xac,0x08,0xb0,0x0e,0xbc,0x00,0x02,0x10,0x56,0x00,0x03,0x06,0xce,0x06,0x1a,0x06,0xce,0x00,0x01,0x10,0x54,0x00,0x03,0x08,0x9c,0x08,0xa0,0x0e,0xac,0x00,0x02,0x10,0x48,0x00,0x03,0x06,0xce,0x06,0x10,0x06,0xce, +0x00,0x01,0x10,0x46,0x00,0x03,0x08,0x8c,0x08,0x90,0x0e,0x9c,0x00,0x02,0x10,0x3a,0x00,0x03,0x06,0xce,0x06,0x43,0x06,0xce,0x00,0x01,0x10,0x38,0x00,0x03,0x08,0x7c,0x08,0x80,0x0e,0x8c,0x00,0x02,0x10,0x2c,0x00,0x03,0x06,0xce,0x06,0x46,0x06,0xce,0x00,0x01,0x10,0x2a,0x00,0x03,0x08,0x6c,0x08,0x70,0x0e,0x7c,0x00,0x02,0x10,0x1e, +0x00,0x03,0x06,0xce,0x06,0x3d,0x06,0xce,0x00,0x01,0x10,0x1c,0x00,0x03,0x08,0x5c,0x08,0x60,0x0e,0x6c,0x00,0x02,0x10,0x10,0x00,0x03,0x06,0xce,0x06,0x57,0x06,0xce,0x00,0x01,0x10,0x0e,0x00,0x03,0x0e,0x5c,0x08,0x4c,0x08,0x50,0x00,0x02,0x10,0x02,0x00,0x03,0x06,0xce,0x03,0xa5,0x06,0xce,0x00,0x01,0x20,0x08,0x00,0x04,0x10,0x76, +0x10,0x80,0x10,0x8a,0x10,0x94,0x00,0x02,0x10,0xee,0x00,0x04,0x00,0x86,0x00,0x8d,0x01,0x49,0x01,0x50,0x00,0x02,0x10,0xec,0x00,0x04,0x01,0xc6,0x01,0xc7,0x01,0xc6,0x01,0xc7,0x00,0x02,0x10,0xea,0x00,0x04,0x03,0xb2,0x03,0xb3,0x06,0x5e,0x06,0x5f,0x00,0x02,0x10,0xe8,0x00,0x04,0x01,0x90,0x01,0x91,0x01,0x92,0x02,0x49,0x00,0x02, +0x10,0xe6,0x00,0x04,0x06,0x02,0x06,0x08,0x06,0x09,0x06,0x0a,0x00,0x02,0x05,0x8e,0x12,0x4c,0x10,0x4a,0x12,0x4c,0x00,0x02,0x0b,0x76,0x0f,0xac,0x00,0x02,0x12,0xb4,0x12,0x8c,0x12,0x64,0x12,0x8c,0x00,0x02,0x0b,0x66,0x0f,0xa2,0x00,0x02,0x11,0x24,0x00,0x05,0x03,0xce,0x03,0xcf,0x06,0x05,0x06,0x06,0x06,0x07,0x00,0x02,0x11,0x22, +0x00,0x05,0x02,0xe2,0x03,0x18,0x03,0x19,0x03,0x1a,0x03,0x1b,0x00,0x02,0x11,0x20,0x00,0x05,0x02,0xe3,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x00,0x02,0x0b,0x1e,0x11,0x34,0x11,0x44,0x11,0xda,0x00,0x03,0x0b,0x26,0x11,0x64,0x0f,0x68,0x00,0x02,0x11,0x42,0x00,0x06,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83, +0x00,0x02,0x11,0x30,0x00,0x06,0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x01,0x97,0x01,0x98,0x00,0x03,0x00,0x01,0x12,0x8e,0x00,0x01,0x05,0x0e,0x00,0x01,0x12,0x8e,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x01,0x10,0x4a,0x00,0x01,0x07,0x4e,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xad,0x00,0x03,0x00,0x01,0x10,0xc2,0x00,0x01, +0x07,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xae,0x00,0x03,0x00,0x01,0x07,0x34,0x00,0x01,0x10,0x62,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xb0,0x00,0x03,0x00,0x01,0x07,0x22,0x00,0x01,0x10,0x58,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xb0,0x00,0x03,0x00,0x02,0x10,0x96,0x10,0xe6,0x00,0x01,0x04,0xb8,0x00,0x01,0x10,0xe6,0x00,0x01, +0x00,0x00,0x00,0x37,0x00,0x03,0x00,0x01,0x10,0xd0,0x00,0x01,0x10,0x86,0x00,0x02,0x04,0xa2,0x10,0xd0,0x00,0x01,0x00,0x00,0x00,0x37,0x00,0x03,0x00,0x02,0x10,0x6a,0x10,0xba,0x00,0x01,0x10,0x70,0x00,0x01,0x10,0xba,0x00,0x01,0x00,0x00,0x00,0x39,0x00,0x03,0x00,0x01,0x10,0xa4,0x00,0x01,0x04,0x76,0x00,0x02,0x10,0x5a,0x10,0xa4, +0x00,0x01,0x00,0x00,0x00,0x39,0x00,0x03,0x00,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x10,0x9c,0x00,0x01,0x00,0x00,0x01,0x95,0x00,0x03,0x00,0x01,0x11,0x78,0x00,0x01,0x11,0x78,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x95,0x00,0x03,0x00,0x01,0x11,0x8e,0x00,0x01,0x11,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x96,0x00,0x02,0x10,0x76, +0x00,0x0a,0x00,0xb5,0x00,0xb6,0x00,0xb7,0x00,0xb8,0x00,0xb9,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x01,0x9e,0x00,0x03,0x00,0x00,0x00,0x01,0x10,0x7c,0x00,0x02,0x10,0x6c,0x10,0x4c,0x00,0x01,0x00,0x00,0x01,0x96,0x00,0x02,0x10,0x7c,0x00,0x0b,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09, +0x03,0x0a,0x03,0x0b,0x04,0x3b,0x00,0x02,0x11,0x9e,0x00,0x0f,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x09,0x02,0x0a,0x02,0x4e,0x02,0x4f,0x02,0x9d,0x02,0x9e,0x00,0x02,0x11,0x9c,0x00,0x0f,0x02,0xdf,0x02,0xe0,0x02,0xe1,0x03,0x0c,0x03,0x0d,0x03,0x0e,0x03,0x0f,0x03,0x10, +0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x00,0x02,0x11,0x9a,0x00,0x10,0x00,0xba,0x00,0xbb,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x4a,0x02,0x4b,0x02,0x4c,0x02,0x4d,0x02,0x73,0x02,0x74,0x02,0x9c,0x00,0x02,0x11,0x1a,0x00,0x13,0x01,0xb0,0x01,0xb1,0x01,0xb2, +0x01,0xb3,0x01,0xb4,0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x00,0x01,0x13,0xd6,0x00,0x24,0x11,0xf8,0x11,0x90,0x11,0x98,0x11,0xa0,0x11,0xa8,0x11,0xb0,0x11,0xb8,0x11,0xc0,0x11,0xc8,0x11,0xd0,0x12,0x02,0x12,0x7e,0x11,0xd8, +0x12,0x0c,0x12,0x52,0x11,0x6c,0x12,0x16,0x12,0x22,0x12,0x6e,0x11,0x72,0x11,0x78,0x11,0xe0,0x12,0x2e,0x11,0x7e,0x11,0xe8,0x12,0xc2,0x12,0x3a,0x11,0x84,0x12,0x46,0x12,0xe2,0x13,0x4a,0x12,0xa8,0x12,0x60,0x11,0x8a,0x11,0xf0,0x12,0x92,0x00,0x02,0x13,0x42,0x00,0x26,0x00,0xb5,0x00,0xb6,0x00,0xb7,0x00,0xb8,0x00,0xb9,0x01,0xc3, +0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x01,0x97,0x01,0x98,0x01,0x99,0x01,0x84,0x01,0x85,0x01,0x86,0x01,0x87,0x01,0x88,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x01,0x9e,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x09,0x02,0x0a,0x02,0x4e,0x02,0x4f,0x02,0x9d,0x02,0x9e, +0x00,0x02,0x0f,0xd0,0x00,0x27,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae, +0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0x22,0x00,0x29,0x03,0x40,0x03,0x41,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0, +0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0xd6,0x00,0x2f,0x01,0x00,0x06,0xcc,0x06,0xcb,0x01,0x0e,0x01,0x91,0x01,0x00,0x01,0x0e, +0x01,0x91,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1, +0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0xca,0x00,0x3b,0x00,0xba,0x00,0xbb,0x01,0xa2,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x01,0xa3,0x01,0xa4,0x01,0xa5,0x01,0xa6,0x01,0xb0,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4, +0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x09,0x02,0x0a,0x02,0x08,0x02,0x4a,0x02,0x4b,0x02,0x4c, +0x02,0x4e,0x02,0x4f,0x02,0x4d,0x02,0x9d,0x02,0x9c,0x02,0x9e,0x00,0x02,0x12,0xc4,0x00,0x3d,0x01,0xc6,0x01,0xc7,0x00,0x86,0x00,0x8d,0x01,0xc6,0x01,0x06,0x01,0xc7,0x01,0x49,0x01,0x7d,0x01,0x50,0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x03,0x41,0x06,0xce,0x06,0x8e, +0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd, +0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x01,0x00,0x01,0x00,0xff,0x00,0x01,0x00,0x01,0x02,0xd4,0x00,0x01,0x00,0x01,0x01,0x1a,0x00,0x01,0x00,0x01,0x00,0x7c,0x00,0x01,0x00,0x01,0x00,0xf4,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01, +0x03,0x34,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01, +0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x03,0x32,0x00,0x01,0x12,0x30,0x00,0x01,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x15,0x88,0x00,0x01,0x12,0x24,0x00,0x01,0x12,0x2e,0x00,0x01,0x12,0x38,0x00,0x01,0x12,0x42, +0x00,0x01,0x12,0x4c,0x00,0x01,0x12,0x56,0x00,0x01,0x12,0x60,0x00,0x01,0x12,0x6a,0x00,0x01,0x15,0x74,0x00,0x01,0x12,0x70,0x00,0x01,0x12,0x7a,0x00,0x01,0x12,0x84,0x00,0x01,0x15,0x74,0x00,0x01,0x15,0x80,0x00,0x01,0x12,0x86,0x00,0x01,0x12,0x90,0x00,0x01,0x15,0x84,0x00,0x01,0x15,0x90,0x00,0x01,0x12,0x92,0x00,0x01,0x12,0x9c, +0x00,0x01,0x15,0x94,0x00,0x01,0x12,0xa2,0x00,0x01,0x12,0xac,0x00,0x01,0x12,0xb6,0x00,0x01,0x12,0xc0,0x00,0x01,0x12,0xca,0x00,0x01,0x12,0xd4,0x00,0x01,0x15,0x88,0x00,0x01,0x12,0xda,0x00,0x01,0x15,0x90,0x00,0x01,0x12,0xe0,0x00,0x01,0x15,0x98,0x00,0x01,0x12,0xe6,0x00,0x01,0x12,0xf0,0x00,0x01,0x12,0xfa,0x00,0x01,0x13,0x04, +0x00,0x01,0x15,0x94,0x00,0x01,0x19,0xc4,0x00,0x01,0x15,0x9c,0x00,0x01,0x13,0x02,0x00,0x01,0x15,0xa4,0x00,0x01,0x15,0xb0,0x00,0x01,0x13,0x04,0x00,0x01,0x13,0x0e,0x00,0x01,0x13,0x18,0x00,0x01,0x13,0x22,0x00,0x01,0x13,0x2c,0x00,0x01,0x13,0x36,0x00,0x01,0x13,0x40,0x00,0x01,0x15,0xa0,0x00,0x01,0x15,0xac,0x00,0x01,0x15,0xb8, +0x00,0x01,0x15,0xc4,0x00,0x01,0x15,0xd0,0x00,0x01,0x15,0xdc,0x00,0x01,0x15,0xe8,0x00,0x01,0x13,0x2e,0x00,0x01,0x15,0xf0,0x00,0x01,0x13,0x34,0x00,0x01,0x13,0x3e,0x00,0x01,0x13,0x48,0x00,0x01,0x15,0xf0,0x00,0x01,0x13,0x4e,0x00,0x01,0x13,0x58,0x00,0x01,0x13,0x62,0x00,0x01,0x13,0x6c,0x00,0x01,0x13,0x76,0x00,0x01,0x13,0x80, +0x00,0x01,0x13,0x8a,0x00,0x01,0x13,0x94,0x00,0x01,0x13,0x9e,0x00,0x01,0x13,0xa8,0x00,0x01,0x13,0xb2,0x00,0x01,0x13,0xbc,0x00,0x01,0x13,0xc6,0x00,0x01,0x13,0xd0,0x00,0x01,0x13,0xda,0x00,0x01,0x13,0xe4,0x00,0x01,0x13,0xee,0x00,0x01,0x13,0xf8,0x00,0x01,0x14,0x02,0x00,0x01,0x14,0x0c,0x00,0x01,0x14,0x16,0x00,0x02,0x00,0x01, +0x01,0x4c,0x01,0x50,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0xf5,0x00,0xfb,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0x40,0x01,0x43,0x00,0x00,0x00,0x02,0x20,0xe0,0x20,0xf2,0x00,0x02,0x18,0xfa,0x19,0x0a,0x00,0x02,0x13,0xf6,0x15,0x7e,0x00,0x02,0x13,0xfc,0x15,0x86,0x00,0x02,0x19,0x08,0x19,0x18,0x00,0x02,0x19,0x22,0x19,0x32,0x00,0x02, +0x19,0x3c,0x19,0x4c,0x00,0x02,0x19,0x56,0x19,0x66,0x00,0x02,0x19,0x70,0x19,0x80,0x00,0x02,0x19,0x8a,0x19,0x9a,0x00,0x02,0x19,0xa4,0x19,0xb4,0x00,0x02,0x19,0xbe,0x19,0xce,0x00,0x02,0x19,0xd8,0x19,0xe8,0x00,0x02,0x19,0xf2,0x1a,0x02,0x00,0x02,0x1a,0x0c,0x1a,0x1c,0x00,0x01,0x20,0xaa,0x00,0x01,0x20,0xb8,0x00,0x01,0x20,0xc6, +0x00,0x01,0x1a,0x1a,0x00,0x01,0x1a,0x26,0x00,0x01,0x1a,0x32,0x00,0x01,0x1a,0x3e,0x00,0x01,0x1a,0x4a,0x00,0x01,0x1a,0x56,0x00,0x01,0x1a,0x62,0x00,0x01,0x1a,0x6e,0x00,0x01,0x1a,0x7a,0x00,0x01,0x1a,0x86,0x00,0x01,0x1a,0x92,0x00,0x01,0x1a,0x9e,0x00,0x01,0x1a,0xaa,0x00,0x01,0x1a,0xb6,0x00,0x01,0x1a,0xc2,0x00,0x01,0x1a,0xce, +0x00,0x01,0x1a,0xda,0x00,0x01,0x1a,0xe6,0x00,0x01,0x1a,0xf2,0x00,0x01,0x1a,0xfe,0x00,0x01,0x1b,0x0a,0x00,0x01,0x1b,0x16,0x00,0x01,0x1b,0x22,0x00,0x01,0x1b,0x2e,0x00,0x01,0x1b,0x3a,0x00,0x01,0x1b,0x46,0x00,0x01,0x1b,0x52,0x00,0x01,0x1b,0x5e,0x00,0x01,0x1b,0x6a,0x00,0x02,0x00,0x01,0x02,0xf8,0x03,0x01,0x00,0x00,0x00,0x02, +0x00,0x01,0x02,0xd4,0x02,0xdd,0x00,0x00,0x00,0x04,0x14,0xb8,0x14,0xc4,0x1b,0x62,0x1b,0x70,0x00,0x04,0x14,0xc6,0x14,0xd2,0x1b,0x74,0x1b,0x82,0x00,0x04,0x14,0xd4,0x16,0xcc,0x1b,0x86,0x1b,0x94,0x00,0x04,0x14,0xd6,0x16,0x0e,0x1b,0x98,0x1b,0xa6,0x00,0x04,0x14,0xd8,0x14,0xe4,0x1b,0xaa,0x1b,0xb8,0x00,0x04,0x14,0xe6,0x16,0xc6, +0x1b,0xbc,0x1b,0xca,0x00,0x04,0x14,0xe8,0x14,0xf4,0x1b,0xce,0x1b,0xdc,0x00,0x04,0x14,0xf6,0x16,0xca,0x1b,0xe0,0x1b,0xee,0x00,0x04,0x1f,0xfc,0x20,0x0c,0x20,0x1c,0x20,0x2c,0x00,0x03,0x20,0x32,0x26,0xa4,0x26,0xb6,0x00,0x03,0x20,0x3a,0x26,0xc0,0x26,0xd2,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x46, +0x03,0x57,0x00,0x03,0x1b,0xc8,0x1b,0xd6,0x20,0x32,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x45,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x03,0x14,0xb6,0x16,0x7e,0x1b,0xcc,0x00,0x01,0x00,0x02,0x03,0x5c,0x05,0xb4,0x00,0x03,0x14,0xb2,0x14,0xbe,0x1b,0xca,0x00,0x01,0x00,0x02,0x03,0x46,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x47, +0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x48,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x47,0x04,0x1c,0x00,0x03,0x14,0xa2,0x16,0x5e,0x1b,0xb0,0x00,0x01,0x00,0x02,0x03,0x45,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3e,0x00,0x03,0x1b,0xa6,0x1e,0xf6,0x1f,0xda,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x3d,0x00,0x03,0x14,0x86,0x16,0x06, +0x1b,0xa4,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x03,0x14,0x82,0x16,0xf2,0x1b,0xa2,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1c,0x00,0x03,0x1f,0xba,0x1f,0xca,0x26,0x34,0x00,0x03,0x26,0x3e,0x26,0x50,0x26,0x62,0x00,0x01,0x00,0x02,0x04,0x1c,0x05,0xbe,0x00,0x03,0x1b,0x88,0x1e,0x00,0x1f,0xc2,0x00,0x03,0x14,0x5e,0x15,0xd2, +0x1b,0x8e,0x00,0x01,0x00,0x02,0x03,0x48,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x5c,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x03,0x14,0x4a,0x16,0xa2,0x1b,0x7c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x03,0x16,0x76,0x16,0x82, +0x1b,0x6a,0x00,0x01,0x00,0x02,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x03,0x1b,0x58,0x1d,0xd8,0x1f,0x6a,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x30,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x19,0x00,0x03,0x13,0xfe,0x15,0x42,0x1b,0x4e,0x00,0x01,0x00,0x02,0x03,0x29, +0x03,0x30,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xb5,0x00,0x03,0x13,0xf2,0x16,0x1a,0x1b,0x44,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x03,0x1b,0x2a,0x1d,0x4e,0x1f,0x22,0x00,0x01,0x00,0x02,0x04,0x19, +0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x03,0x13,0xbe,0x15,0xf2,0x1b,0x20,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x22,0x00,0x03,0x13,0xba,0x15,0x22,0x1b,0x1e,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x22,0x00,0x03,0x13,0xb6,0x13,0xc2,0x1b,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x05,0xb4,0x00,0x03,0x13,0xbe,0x15,0xaa, +0x1b,0x1a,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x23,0x00,0x03,0x13,0xba,0x13,0xc6,0x1b,0x18,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1c,0x00,0x03,0x13,0xc2,0x15,0xa2,0x1b,0x16,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b,0x00,0x03,0x13,0xbe,0x13,0xca,0x1b,0x14,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1c,0x00,0x03,0x15,0x5e,0x15,0x82, +0x1b,0x12,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x03,0x13,0xb6,0x14,0xbe,0x1b,0x10,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1c,0x00,0x03,0x13,0xb2,0x15,0x62,0x1b,0x0e,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x03,0x13,0xae,0x14,0xaa,0x1b,0x0c,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1c,0x00,0x03,0x15,0x12,0x15,0x42, +0x1b,0x0a,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b,0x00,0x03,0x13,0x9a,0x13,0xa6,0x1b,0x08,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x45,0x00,0x03,0x13,0xa2,0x13,0xae,0x1b,0x06,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x47,0x00,0x03,0x13,0xaa,0x13,0xb6,0x1b,0x04,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x43,0x00,0x03,0x13,0xb2,0x14,0x06, +0x1b,0x02,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x5c,0x00,0x03,0x13,0xa6,0x14,0x12,0x1a,0xf8,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x3a,0x00,0x03,0x13,0xa2,0x13,0xea,0x1a,0xf6,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x3a,0x00,0x03,0x13,0x9e,0x14,0xb2,0x1a,0xf4,0x00,0x01,0x00,0x02,0x03,0x3a, +0x04,0x19,0x00,0x03,0x13,0x9a,0x13,0xa6,0x1a,0xf2,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x48,0x00,0x01,0x00,0x02,0x00,0xf4,0x01,0xa2,0x00,0x01,0x00,0x02,0x01,0xdd,0x02,0x21,0x00,0x02,0x24,0x34,0x24,0x46,0x00,0x02,0x24,0x52,0x24,0x64,0x00,0x02,0x24,0x70,0x24,0x82,0x00,0x02,0x24,0x8e,0x24,0xa0,0x00,0x01,0x00,0x02,0x03,0x57, +0x04,0x1c,0x00,0x00,0x00,0x05,0x1d,0xa0,0x1d,0xae,0x24,0xa2,0x24,0xb2,0x24,0xc2,0x00,0x05,0x1c,0x2c,0x13,0xc4,0x1a,0xb2,0x1d,0xb0,0x1d,0xbe,0x00,0x05,0x1d,0xc0,0x1d,0xce,0x24,0xba,0x24,0xca,0x24,0xda,0x00,0x05,0x23,0x1c,0x23,0x2a,0x24,0xde,0x24,0xee,0x24,0xfe,0x00,0x05,0x1d,0xc4,0x1d,0xd2,0x25,0x02,0x25,0x12,0x25,0x22, +0x00,0x05,0x1a,0x8e,0x13,0x34,0x1a,0x9a,0x1d,0xd4,0x1d,0xe2,0x00,0x05,0x1d,0xe4,0x1d,0xf2,0x25,0x1a,0x25,0x2a,0x25,0x3a,0x00,0x05,0x1d,0xf4,0x1b,0x68,0x25,0x3e,0x25,0x4e,0x25,0x5e,0x00,0x05,0x1d,0xf6,0x1b,0x4e,0x25,0x62,0x25,0x72,0x25,0x82,0x00,0x05,0x1a,0x76,0x13,0x1c,0x1b,0x2a,0x1d,0xf8,0x1e,0x06,0x00,0x05,0x1e,0x08, +0x1e,0x16,0x25,0x7a,0x25,0x8a,0x25,0x9a,0x00,0x05,0x1e,0x18,0x1e,0x26,0x25,0x9e,0x25,0xae,0x25,0xbe,0x00,0x05,0x1e,0x28,0x1e,0x36,0x25,0xc2,0x25,0xd2,0x25,0xe2,0x00,0x05,0x1e,0x38,0x1e,0x46,0x25,0xe6,0x25,0xf6,0x26,0x06,0x00,0x04,0x26,0x0a,0x26,0x1a,0x2b,0xfa,0x2c,0x0c,0x00,0x04,0x1e,0x3e,0x1e,0x4c,0x26,0x20,0x26,0x30, +0x00,0x04,0x1a,0x32,0x12,0xcc,0x1a,0xda,0x1e,0x50,0x00,0x04,0x1a,0x34,0x1b,0x7e,0x13,0x9a,0x1e,0x54,0x00,0x04,0x1e,0x58,0x1e,0x66,0x26,0x22,0x26,0x32,0x00,0x04,0x1e,0x6a,0x1e,0x78,0x26,0x38,0x26,0x48,0x00,0x04,0x1a,0x22,0x1a,0x2e,0x12,0xa4,0x1e,0x7c,0x00,0x04,0x1e,0x80,0x1e,0x8e,0x26,0x44,0x26,0x54,0x00,0x04,0x1e,0x92, +0x1e,0xa0,0x26,0x5a,0x26,0x6a,0x00,0x04,0x1e,0xa4,0x1e,0xc0,0x1e,0xb2,0x26,0x70,0x00,0x04,0x1a,0x2a,0x1e,0xb6,0x1a,0x12,0x1e,0xc4,0x00,0x04,0x1a,0x14,0x1a,0x20,0x12,0x96,0x1e,0xc8,0x00,0x04,0x1e,0xcc,0x1e,0xda,0x26,0x62,0x26,0x72,0x00,0x04,0x1e,0xde,0x1e,0xec,0x26,0x78,0x26,0x88,0x00,0x04,0x1b,0x10,0x1a,0x0e,0x13,0x2c, +0x1e,0xf0,0x00,0x04,0x1a,0x10,0x1b,0x12,0x1b,0x2c,0x1e,0xf4,0x00,0x04,0x1a,0x12,0x12,0x34,0x1a,0x1e,0x1e,0xf8,0x00,0x04,0x1e,0xfc,0x21,0xa0,0x26,0x70,0x26,0x80,0x00,0x04,0x26,0x86,0x1f,0x00,0x26,0x96,0x26,0xa6,0x00,0x04,0x26,0xac,0x1f,0x04,0x26,0xbc,0x26,0xcc,0x00,0x04,0x1a,0x02,0x12,0x48,0x1a,0xb0,0x1f,0x08,0x00,0x04, +0x1a,0x04,0x1a,0xb2,0x12,0xe6,0x1f,0x0c,0x00,0x04,0x1a,0x06,0x12,0x04,0x1a,0x12,0x1f,0x10,0x00,0x04,0x1a,0x14,0x12,0xd2,0x1a,0x9e,0x1f,0x14,0x00,0x04,0x1f,0x18,0x1f,0x26,0x26,0xaa,0x26,0xba,0x00,0x04,0x1f,0x2a,0x26,0xc0,0x1a,0x0c,0x26,0xd0,0x00,0x04,0x1f,0x2e,0x21,0xc8,0x26,0xd6,0x26,0xe6,0x00,0x04,0x1f,0x32,0x1f,0x40, +0x26,0xec,0x26,0xfc,0x00,0x04,0x1f,0x44,0x1f,0x52,0x27,0x02,0x27,0x12,0x00,0x04,0x1f,0x56,0x21,0x0e,0x27,0x18,0x27,0x28,0x00,0x04,0x1a,0x28,0x1a,0x34,0x1a,0x40,0x1f,0x5a,0x00,0x04,0x1f,0x5e,0x27,0x24,0x19,0xde,0x27,0x34,0x00,0x04,0x1f,0x62,0x1f,0x70,0x1f,0x7e,0x27,0x3a,0x00,0x04,0x19,0xd8,0x1a,0x16,0x1a,0x22,0x1f,0x82, +0x00,0x04,0x1f,0x86,0x1f,0xda,0x27,0x36,0x27,0x46,0x00,0x04,0x19,0xd0,0x11,0x8e,0x19,0xdc,0x1f,0x8a,0x00,0x03,0x27,0x42,0x29,0x66,0x2a,0xb6,0x00,0x03,0x27,0x4a,0x27,0x5a,0x2a,0xc0,0x00,0x03,0x1f,0x7e,0x20,0xb8,0x27,0x62,0x00,0x03,0x20,0xd8,0x20,0xe6,0x27,0x6a,0x00,0x03,0x1f,0x7c,0x1f,0x8a,0x27,0x72,0x00,0x03,0x1f,0x90, +0x1f,0x9e,0x27,0x7a,0x00,0x03,0x1f,0xa4,0x1f,0xb2,0x27,0x82,0x00,0x03,0x1f,0xb8,0x21,0x2c,0x27,0x8a,0x00,0x03,0x1f,0xbe,0x20,0x88,0x27,0x92,0x00,0x03,0x1f,0xc4,0x1f,0xd2,0x27,0x9a,0x00,0x03,0x1f,0xd8,0x1f,0xe6,0x27,0xa2,0x00,0x03,0x1f,0xec,0x1f,0xfa,0x27,0xaa,0x00,0x03,0x20,0x00,0x20,0x0e,0x27,0xb2,0x00,0x03,0x20,0x14, +0x20,0x22,0x27,0xba,0x00,0x06,0x2a,0x6a,0x2a,0x7a,0x2d,0xde,0x2d,0xf0,0x2e,0x02,0x2e,0x14,0x00,0x06,0x20,0x1a,0x27,0xb4,0x2a,0x7c,0x11,0x12,0x27,0xc2,0x27,0xd0,0x00,0x06,0x20,0x18,0x11,0x10,0x0c,0xfc,0x20,0x24,0x27,0xd0,0x27,0xde,0x00,0x06,0x2a,0x70,0x27,0xde,0x19,0x44,0x2a,0x80,0x2a,0x90,0x2a,0xa0,0x00,0x06,0x20,0x14, +0x19,0x44,0x19,0x50,0x19,0x5c,0x27,0xde,0x27,0xec,0x00,0x05,0x27,0xec,0x28,0x5c,0x28,0x6a,0x2a,0x94,0x2a,0xa4,0x00,0x05,0x29,0x16,0x27,0xee,0x20,0x06,0x2a,0xa8,0x2a,0xb8,0x00,0x05,0x20,0x08,0x11,0x82,0x19,0x4e,0x20,0x7e,0x27,0xf0,0x00,0x05,0x29,0x9c,0x2d,0x0c,0x19,0x72,0x29,0xaa,0x2a,0xb0,0x00,0x05,0x27,0xe6,0x2d,0x00, +0x2d,0xb0,0x19,0x66,0x2a,0xb4,0x00,0x05,0x27,0xe8,0x2a,0xb8,0x27,0xf6,0x2a,0xc8,0x2a,0xd8,0x00,0x05,0x27,0xf8,0x2a,0xdc,0x1f,0xe4,0x2a,0xec,0x2a,0xfc,0x00,0x05,0x2b,0x00,0x2b,0x10,0x2d,0x9e,0x2d,0xb0,0x2d,0xc2,0x00,0x05,0x27,0xee,0x1f,0xda,0x1f,0xe8,0x2b,0x14,0x2b,0x24,0x00,0x05,0x27,0xf0,0x2b,0x28,0x27,0xfe,0x2b,0x38, +0x2b,0x48,0x00,0x05,0x28,0x00,0x2b,0x4c,0x28,0x0e,0x2b,0x5c,0x2b,0x6c,0x00,0x05,0x1f,0xd2,0x10,0x6e,0x18,0xd6,0x1f,0xde,0x28,0x10,0x00,0x05,0x20,0x12,0x18,0xfa,0x1f,0xde,0x19,0x14,0x28,0x12,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x45,0x03,0x57,0x00,0x04,0x2b,0x4e,0x2d,0x82,0x28,0x0a,0x2d,0x94,0x00,0x01,0x00,0x03,0x03,0x2e, +0x03,0x57,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x04,0x1c,0x00,0x04,0x27,0xfc,0x2c,0x88,0x1f,0xea,0x2b,0x40,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1c,0x05,0xbe,0x00,0x01,0x00,0x03,0x03,0x2b,0x03,0x30,0x04,0x1b,0x00,0x04,0x2b,0x28,0x2d,0x60,0x2b,0x38,0x2d,0x72, +0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1c,0x04,0x22,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1c,0x05,0xbe,0x00,0x04,0x27,0xba,0x2b,0x20,0x27,0xc8,0x2b,0x30,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x05,0xbe,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x03, +0x03,0x57,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x03,0x03,0xc5,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x34,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x43,0x03,0x5c,0x00,0x02,0x2a,0xe6,0x27,0x7c,0x00,0x02, +0x27,0x84,0x27,0x92,0x00,0x01,0x27,0x9a,0x00,0x07,0x18,0x00,0x2d,0x02,0x2b,0x72,0x10,0x1c,0x17,0xe8,0x2a,0xe6,0x2a,0xf4,0x00,0x07,0x27,0x94,0x2e,0x02,0x27,0xa2,0x27,0xae,0x0f,0x64,0x2a,0xf2,0x2b,0x00,0x00,0x06,0x27,0xaa,0x27,0xb6,0x0f,0x60,0x27,0xc2,0x27,0xce,0x2a,0xfe,0x00,0x06,0x2a,0xfe,0x1e,0xce,0x1e,0xdc,0x2b,0x0c, +0x2b,0x1a,0x2c,0xc4,0x00,0x06,0x27,0xbe,0x17,0xb8,0x27,0xca,0x0f,0x50,0x27,0xd6,0x2b,0x1a,0x00,0x06,0x1e,0xce,0x27,0xd4,0x27,0xe0,0x2b,0x28,0x0f,0xd2,0x2b,0x1a,0x00,0x06,0x27,0xde,0x2b,0x1a,0x2c,0xaa,0x17,0xa8,0x0f,0xc4,0x2b,0x28,0x00,0x04,0x0f,0x32,0x0f,0x38,0x0f,0x3e,0x0f,0x44,0x00,0x04,0x0f,0x40,0x0f,0x46,0x0f,0x4c, +0x0f,0x52,0x00,0x04,0x0f,0x4e,0x0f,0x54,0x0f,0x5a,0x0f,0x60,0x00,0x04,0x0f,0x5c,0x0f,0x62,0x0f,0x68,0x0f,0x6e,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x01,0x00,0x08,0x17,0x76,0x1e,0x8e,0x2a,0xf8,0x17,0x90,0x2b,0x48,0x2b,0x04,0x2c,0x7c,0x2c,0x8a,0x00,0x08,0x2b,0x5a,0x0f,0x8c,0x2b,0x66,0x2a,0xfe,0x2b,0x4e,0x0f,0x5c,0x2c,0x86, +0x2c,0x94,0x00,0x08,0x2c,0x90,0x2a,0xf8,0x27,0x88,0x17,0x5e,0x27,0x96,0x2d,0x6a,0x2d,0x7a,0x2d,0x8a,0x00,0x07,0x2b,0x1e,0x2a,0xf6,0x2b,0x36,0x0f,0x5c,0x0f,0x68,0x0f,0x44,0x2c,0x8c,0x00,0x07,0x2c,0x8a,0x2c,0x98,0x2d,0xd0,0x2a,0xf2,0x1e,0x54,0x2d,0x78,0x2d,0x88,0x00,0x01,0x00,0x04,0x00,0x84,0x00,0x8c,0x01,0x47,0x01,0x4f, +0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x60,0x00,0xbd,0x01,0x22,0x00,0x01,0x00,0x04,0x03,0x90,0x03,0x91,0x06,0x23,0x06,0x24,0x00,0x01,0x00,0x04,0x01,0x0d,0x01,0x0e,0x01,0x0f,0x02,0x36,0x00,0x01,0x00,0x04,0x05,0xb5,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x00,0x01,0x00,0x01,0x03,0x20,0x00,0x08,0x2c,0x54,0x16,0xf8,0x2c,0x60,0x2c,0x6c, +0x2c,0x78,0x2c,0x84,0x2a,0xb0,0x2d,0x46,0x00,0x08,0x2c,0x7e,0x2c,0x8a,0x2c,0x96,0x2c,0xa2,0x2c,0xae,0x2c,0xba,0x0a,0x20,0x2d,0x42,0x00,0x08,0x2c,0xb4,0x0e,0xca,0x2d,0x6c,0x2d,0x7c,0x2d,0x8c,0x2d,0x9c,0x2d,0x3e,0x2d,0x4c,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0xbd,0x00,0x01,0x00,0x02,0x00,0x60,0x01,0x22,0x00,0x09,0x2a,0x76, +0x2a,0x82,0x2a,0x8e,0x0e,0xb4,0x2d,0xa6,0x2d,0x8a,0x2a,0x9a,0x0e,0xc0,0x2d,0x98,0x00,0x01,0x00,0x05,0x03,0xc3,0x03,0xc5,0x06,0x1c,0x06,0x42,0x06,0x43,0x00,0x01,0x00,0x05,0x02,0xdc,0x02,0xec,0x02,0xf6,0x03,0x00,0x03,0x0a,0x00,0x01,0x00,0x05,0x02,0xd9,0x02,0xe9,0x02,0xf3,0x02,0xfd,0x03,0x07,0x00,0x02,0x00,0x01,0x02,0xee, +0x02,0xf7,0x00,0x00,0x00,0x01,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3e,0x00,0x02,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x06,0xce,0x06,0xce,0x00,0x02,0x00,0x02,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x01,0x00,0x06,0x01,0x13,0x01,0x14,0x01,0x16,0x01,0x17,0x01,0x18,0x01,0x19, +0x00,0x09,0x2d,0x32,0x2d,0x3e,0x2d,0x6e,0x2d,0x8a,0x2d,0x9a,0x2d,0x4a,0x2d,0x56,0x2d,0x62,0x2d,0x7c,0x00,0x01,0x00,0x05,0x03,0x29,0x03,0x32,0x03,0x33,0x03,0xbe,0x05,0xc6,0x00,0x02,0x00,0x02,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e,0x06,0x76,0x00,0x05,0x00,0x02,0x00,0x02,0x00,0xa2,0x00,0xa6,0x00,0x00,0x01,0x6a,0x01,0x6e, +0x00,0x05,0x00,0x02,0x00,0x02,0x06,0x77,0x06,0x79,0x00,0x00,0x06,0x7b,0x06,0x7f,0x00,0x03,0x00,0x01,0x00,0x08,0x00,0xff,0x01,0x07,0x01,0x0b,0x01,0x0d,0x01,0x90,0x02,0x34,0x02,0x36,0x02,0x49,0x00,0x02,0x00,0x02,0x02,0xd4,0x02,0xdd,0x00,0x00,0x04,0x15,0x04,0x15,0x00,0x0a,0x00,0x02,0x00,0x05,0x02,0xd4,0x02,0xde,0x00,0x01, +0x03,0x57,0x03,0x57,0x00,0x03,0x04,0x1b,0x04,0x1b,0x00,0x04,0x04,0x1c,0x04,0x1c,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x05,0x00,0x02,0x00,0x06,0x00,0x01,0x00,0xbc,0x00,0x01,0x01,0xc8,0x01,0xfe,0x00,0x01,0x02,0x03,0x02,0x03,0x00,0x01,0x02,0x05,0x02,0x0a,0x00,0x01,0x02,0x51,0x02,0x74,0x00,0x01,0x02,0xa0,0x02,0xb9,0x00,0x01, +0x00,0x02,0x00,0x06,0x06,0x68,0x06,0x6c,0x00,0x01,0x06,0x6e,0x06,0x78,0x00,0x01,0x06,0x7a,0x06,0x7c,0x00,0x01,0x06,0x80,0x06,0x8a,0x00,0x01,0x06,0xb0,0x06,0xb0,0x00,0x01,0x06,0xb4,0x06,0xbb,0x00,0x01,0x00,0x02,0x00,0x06,0x06,0x8e,0x06,0x9a,0x00,0x01,0x06,0x9c,0x06,0x9e,0x00,0x01,0x06,0xa0,0x06,0xa2,0x00,0x01,0x06,0xa5, +0x06,0xaf,0x00,0x01,0x06,0xb1,0x06,0xb1,0x00,0x01,0x06,0xbc,0x06,0xc3,0x00,0x01,0x00,0x02,0x00,0x06,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e,0x06,0x78,0x00,0x05,0x06,0x7a,0x06,0x7c,0x00,0x10,0x06,0x80,0x06,0x8a,0x00,0x13,0x06,0xb0,0x06,0xb0,0x00,0x1e,0x06,0xb4,0x06,0xbb,0x00,0x1f,0x00,0x02,0x00,0x06,0x00,0x01,0x00,0xbc, +0x00,0x00,0x01,0xc8,0x01,0xfe,0x00,0xbc,0x02,0x03,0x02,0x03,0x00,0xf3,0x02,0x05,0x02,0x0a,0x00,0xf4,0x02,0x51,0x02,0x74,0x00,0xfa,0x02,0xa0,0x02,0xb9,0x01,0x1e,0x00,0x02,0x00,0x07,0x00,0x01,0x00,0xbc,0x00,0x00,0x01,0xc8,0x01,0xfe,0x00,0xbc,0x02,0x03,0x02,0x03,0x00,0xf3,0x02,0x05,0x02,0x0a,0x00,0xf4,0x02,0x51,0x02,0x74, +0x00,0xfa,0x02,0xa0,0x02,0xb9,0x01,0x1e,0x02,0xd4,0x02,0xde,0x01,0x38,0x00,0x02,0x00,0x03,0x01,0x51,0x01,0x53,0x00,0x00,0x01,0x55,0x01,0x56,0x00,0x03,0x01,0x5b,0x01,0x68,0x00,0x05,0x00,0x01,0x00,0x0f,0x01,0x70,0x01,0x71,0x01,0x72,0x01,0x73,0x01,0x74,0x01,0x75,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0xdf,0x01,0xe0,0x02,0x23, +0x02,0x24,0x02,0x77,0x02,0x7f,0x00,0x01,0x00,0x0f,0x02,0xd6,0x02,0xda,0x02,0xdd,0x02,0xe6,0x02,0xea,0x02,0xed,0x02,0xf0,0x02,0xf4,0x02,0xf7,0x02,0xfa,0x02,0xfe,0x03,0x01,0x03,0x04,0x03,0x08,0x03,0x0b,0x00,0x01,0x00,0x10,0x00,0x51,0x00,0x52,0x01,0x10,0x01,0x11,0x01,0x12,0x01,0xd1,0x01,0xd5,0x01,0xd6,0x01,0xf8,0x02,0x15, +0x02,0x19,0x02,0x1a,0x02,0x3c,0x02,0x5a,0x02,0x72,0x02,0x7e,0x00,0x02,0x03,0x41,0x03,0x42,0x00,0x02,0x03,0xae,0x06,0xce,0x00,0x02,0x03,0x9a,0x03,0xa5,0x00,0x02,0x03,0x9c,0x06,0xce,0x00,0x02,0x06,0x42,0x06,0xce,0x00,0x02,0x06,0x59,0x06,0xce,0x00,0x03,0x02,0xe5,0x02,0xf9,0x03,0x03,0x00,0x03,0x02,0xe6,0x02,0xfa,0x03,0x04, +0x00,0x03,0x02,0xe7,0x02,0xfb,0x03,0x05,0x00,0x03,0x02,0xe8,0x02,0xfc,0x03,0x06,0x00,0x03,0x02,0xe9,0x02,0xfd,0x03,0x07,0x00,0x03,0x02,0xea,0x02,0xfe,0x03,0x08,0x00,0x03,0x02,0xeb,0x02,0xff,0x03,0x09,0x00,0x03,0x02,0xec,0x03,0x00,0x03,0x0a,0x00,0x03,0x02,0xed,0x03,0x01,0x03,0x0b,0x00,0x03,0x03,0x8c,0x03,0x8d,0x06,0xce, +0x00,0x03,0x03,0x76,0x03,0x9b,0x06,0xce,0x00,0x03,0x06,0x12,0x06,0x2c,0x06,0xce,0x00,0x03,0x06,0x0c,0x06,0x0d,0x06,0xce,0x00,0x04,0x02,0xde,0x02,0xe4,0x02,0xf8,0x03,0x02,0x00,0x04,0x03,0x7f,0x03,0x80,0x03,0x92,0x06,0xce,0x00,0x04,0x03,0x79,0x03,0x8e,0x03,0x9e,0x06,0xce,0x00,0x05,0x03,0x97,0x03,0xa6,0x03,0xa7,0x06,0x3c, +0x06,0xce,0x00,0x05,0x03,0x7e,0x03,0xa0,0x03,0xa1,0x03,0xa2,0x06,0xce,0x00,0x05,0x03,0x6e,0x03,0x7b,0x03,0x8f,0x06,0x11,0x06,0xce,0x00,0x05,0x03,0xa4,0x03,0xb0,0x03,0xb1,0x06,0x0b,0x06,0xce,0x00,0x05,0x04,0x3b,0x06,0x1d,0x06,0x1e,0x06,0x45,0x06,0xce,0x00,0x06,0x03,0x82,0x03,0x87,0x03,0x94,0x03,0x95,0x03,0x9f,0x06,0xce, +0x00,0x06,0x03,0x75,0x06,0x52,0x06,0x53,0x06,0x55,0x06,0x5b,0x06,0xce,0x00,0x07,0x03,0x20,0x03,0x99,0x03,0xab,0x03,0xad,0x03,0xaf,0x06,0x56,0x06,0xce,0x00,0x09,0x03,0x40,0x03,0x84,0x03,0x85,0x03,0x93,0x03,0x9d,0x06,0x20,0x06,0x2d,0x06,0x39,0x06,0xce,0x00,0x0a,0x03,0x70,0x03,0x7a,0x03,0x7c,0x06,0x13,0x06,0x36,0x06,0x3e, +0x06,0x3f,0x06,0x40,0x06,0x48,0x06,0xce,0x00,0x0c,0x03,0x73,0x03,0x74,0x03,0x7d,0x03,0x81,0x03,0x8b,0x06,0x28,0x06,0x38,0x06,0x3a,0x06,0x4c,0x06,0x4e,0x06,0x51,0x06,0xce,0x00,0x0f,0x03,0x6c,0x03,0x6d,0x03,0x77,0x03,0x78,0x06,0x0f,0x06,0x14,0x06,0x2a,0x06,0x31,0x06,0x34,0x06,0x35,0x06,0x3b,0x06,0x44,0x06,0x4f,0x06,0x58, +0x06,0xce,0x00,0x19,0x03,0x83,0x03,0x86,0x03,0x89,0x03,0x90,0x03,0x91,0x03,0x96,0x03,0xa3,0x03,0xa8,0x03,0xa9,0x03,0xac,0x06,0x0e,0x06,0x17,0x06,0x19,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x29,0x06,0x2e,0x06,0x32,0x06,0x47,0x06,0x49,0x06,0x50,0x06,0x5d,0x06,0xce,0x00,0x02,0x00,0x08,0x03,0x2b,0x03,0x2b,0x00,0x00, +0x03,0x42,0x03,0x42,0x00,0x01,0x06,0x68,0x06,0x6c,0x00,0x02,0x06,0x6e,0x06,0x78,0x00,0x07,0x06,0x7a,0x06,0x7c,0x00,0x12,0x06,0x80,0x06,0x8a,0x00,0x15,0x06,0xb0,0x06,0xb0,0x00,0x20,0x06,0xb4,0x06,0xbb,0x00,0x21,0x00,0x22,0x03,0x6f,0x03,0x71,0x03,0x72,0x03,0x88,0x03,0x8a,0x03,0x98,0x03,0xaa,0x06,0x10,0x06,0x16,0x06,0x18, +0x06,0x1a,0x06,0x1b,0x06,0x1c,0x06,0x1f,0x06,0x25,0x06,0x26,0x06,0x27,0x06,0x2b,0x06,0x2f,0x06,0x30,0x06,0x33,0x06,0x37,0x06,0x3d,0x06,0x41,0x06,0x43,0x06,0x46,0x06,0x4a,0x06,0x4b,0x06,0x4d,0x06,0x54,0x06,0x57,0x06,0x5a,0x06,0x5c,0x06,0xce,0x00,0x02,0x00,0x0b,0x00,0xa2,0x00,0xa6,0x00,0x00,0x00,0xf4,0x00,0xf4,0x00,0x05, +0x01,0x13,0x01,0x14,0x00,0x06,0x01,0x16,0x01,0x1a,0x00,0x08,0x01,0x4c,0x01,0x50,0x00,0x0d,0x01,0x6a,0x01,0x6e,0x00,0x12,0x01,0x70,0x01,0x78,0x00,0x17,0x01,0xdf,0x01,0xe0,0x00,0x20,0x02,0x23,0x02,0x24,0x00,0x22,0x02,0x77,0x02,0x77,0x00,0x24,0x02,0x7f,0x02,0x7f,0x00,0x25,0x00,0x01,0x00,0x24,0x02,0xd4,0x02,0xd5,0x02,0xd6, +0x02,0xd7,0x02,0xd8,0x02,0xd9,0x02,0xda,0x02,0xdb,0x02,0xdc,0x02,0xdd,0x03,0x29,0x03,0x2b,0x03,0x2c,0x03,0x2e,0x03,0x30,0x03,0x32,0x03,0x34,0x03,0x3a,0x03,0x3d,0x03,0x3e,0x03,0x43,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x57,0x03,0x5c,0x03,0xc5,0x04,0x15,0x04,0x19,0x04,0x1b,0x04,0x1c,0x04,0x22,0x05,0xb4,0x05,0xb5, +0x05,0xbe,0x00,0x02,0x00,0x0e,0x00,0xff,0x00,0xff,0x00,0x00,0x01,0x07,0x01,0x07,0x00,0x01,0x01,0x0b,0x01,0x0b,0x00,0x02,0x01,0x0d,0x01,0x0d,0x00,0x03,0x01,0x90,0x01,0x90,0x00,0x04,0x02,0x34,0x02,0x34,0x00,0x05,0x02,0x36,0x02,0x36,0x00,0x06,0x02,0x49,0x02,0x49,0x00,0x07,0x06,0x68,0x06,0x6c,0x00,0x08,0x06,0x6e,0x06,0x78, +0x00,0x0d,0x06,0x7a,0x06,0x7c,0x00,0x18,0x06,0x80,0x06,0x8a,0x00,0x1b,0x06,0xb0,0x06,0xb0,0x00,0x26,0x06,0xb4,0x06,0xbb,0x00,0x27,0x00,0x02,0x00,0x13,0x00,0x51,0x00,0x52,0x00,0x00,0x00,0xf4,0x00,0xf4,0x00,0x02,0x01,0x10,0x01,0x14,0x00,0x03,0x01,0x16,0x01,0x19,0x00,0x08,0x01,0x40,0x01,0x43,0x00,0x0c,0x01,0x51,0x01,0x53, +0x00,0x10,0x01,0x55,0x01,0x56,0x00,0x13,0x01,0x5b,0x01,0x68,0x00,0x15,0x01,0x70,0x01,0x78,0x00,0x23,0x01,0xd1,0x01,0xd1,0x00,0x2c,0x01,0xd5,0x01,0xd6,0x00,0x2d,0x01,0xdf,0x01,0xe0,0x00,0x2f,0x01,0xf8,0x01,0xf8,0x00,0x31,0x02,0x15,0x02,0x15,0x00,0x32,0x02,0x19,0x02,0x1a,0x00,0x33,0x02,0x23,0x02,0x24,0x00,0x35,0x02,0x3c, +0x02,0x3c,0x00,0x37,0x02,0x77,0x02,0x77,0x00,0x38,0x02,0x7e,0x02,0x7f,0x00,0x39,0x00,0x02,0x00,0x13,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x01,0x00,0x84,0x00,0x84,0x00,0x02,0x00,0x8c,0x00,0x8c,0x00,0x03,0x00,0xbd,0x00,0xbd,0x00,0x04,0x00,0xff,0x00,0xff,0x00,0x05,0x01,0x22,0x01,0x22,0x00,0x06,0x01,0x47, +0x01,0x47,0x00,0x07,0x01,0x4a,0x01,0x4a,0x00,0x08,0x01,0x4f,0x01,0x4f,0x00,0x09,0x02,0xf8,0x03,0x01,0x00,0x0a,0x03,0x42,0x03,0x42,0x00,0x14,0x04,0x23,0x04,0x23,0x00,0x15,0x06,0x68,0x06,0x6c,0x00,0x16,0x06,0x6e,0x06,0x78,0x00,0x1b,0x06,0x7a,0x06,0x7c,0x00,0x26,0x06,0x80,0x06,0x8a,0x00,0x29,0x06,0xb0,0x06,0xb0,0x00,0x34, +0x06,0xb4,0x06,0xbb,0x00,0x35,0x05,0xc3,0x00,0x03,0x01,0x22,0x03,0x29,0x00,0x01,0x00,0x01,0x00,0x5a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2d,0x00,0x01, +0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x31,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0x42,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x99,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00, +0x00,0xa2,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa4,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xaa,0x00,0x01,0x06,0xce,0x00,0x01, +0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb5,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xcc,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xce,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd0, +0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xee,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00, +0x00,0x01,0x00,0x00,0x01,0x0e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x10,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x12,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x17,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x1d,0x00,0x01, +0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x3d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x42,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x49,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x5c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, +0x00,0x00,0x01,0x61,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x63,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x65,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x67,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6b,0x00,0x01,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x71,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x73,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x77,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00, +0x01,0x79,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x81,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x83,0x00,0x01,0x06,0xce,0x00,0x01, +0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x85,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x87,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x89,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8d, +0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x93,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x48,0x03,0x48,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0x17,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x44,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01, +0x00,0x00,0x00,0x77,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x96,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x00,0xb2,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01, +0x00,0x00,0x00,0xbd,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc9,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe4,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xeb,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0xf0,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x22,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x25,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01, +0x00,0x00,0x01,0x28,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x2e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x34,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x37,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, +0x00,0x00,0x01,0x3a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x3f,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x00,0x00,0x31, +0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x57,0x00,0x00,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x01,0x04,0x15, +0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb5, +0x05,0xb5,0x00,0x00,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x01,0x05,0xb4,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00, +0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x01,0x03,0x29, +0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x05,0xb4,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb4,0x05,0xb4,0x00,0x00,0x00,0x01,0x04,0x23,0x00,0x01,0x00,0x01, +0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0xc5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0xc5,0x03,0xc5,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x15,0x00,0x00, +0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x45,0x00,0x00,0x00,0x01,0x03,0x3a, +0x00,0x01,0x00,0x01,0x03,0x47,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x47,0x03,0x47,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x43,0x03,0x43,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01, +0x03,0x2e,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01, +0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d,0x00,0x00,0x06,0xb8,0x00,0x02,0x06,0x6b,0x06,0xb9,0x00,0x02,0x06,0x6a,0x06,0xba,0x00,0x02,0x06,0x74,0x06,0xbb,0x00,0x02,0x06,0x72,0x06,0xb4,0x00,0x02,0x06,0x6b,0x06,0xb5, +0x00,0x02,0x06,0x6a,0x06,0xb6,0x00,0x02,0x06,0x74,0x06,0xb7,0x00,0x02,0x06,0x72,0x06,0xc0,0x00,0x02,0x06,0x91,0x06,0xc1,0x00,0x02,0x06,0x90,0x06,0xc2,0x00,0x02,0x06,0x99,0x06,0xc3,0x00,0x02,0x06,0x97,0x06,0xbc,0x00,0x02,0x06,0x91,0x06,0xbd,0x00,0x02,0x06,0x90,0x06,0xbe,0x00,0x02,0x06,0x99,0x06,0xbf,0x00,0x02,0x06,0x97, +0x00,0x01,0x00,0x04,0x06,0x6e,0x06,0x70,0x06,0x93,0x06,0x95,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01, +0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe7,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x47,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x48,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4d,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8d,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x93,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x94,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xad,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xae,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xba,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xbb,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x01,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x31,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x32,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x4b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x4e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4f,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x5a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x01,0x06,0xce,0x00,0x01, +0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x01,0x06,0xce,0x00,0x01, +0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x01,0x06,0xce,0x00,0x01, +0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x02,0x06,0xce,0x06,0xce, +0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x45, +0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x01, +0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xd6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, +0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x08,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x15,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x1f,0x00,0x00,0x00,0x01, +0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x01,0x20,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00, +0x00,0x2d,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x03,0x57,0x00,0x01, +0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xee,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x00,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x1d,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x61,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57, +0x00,0x01,0x00,0x00,0x01,0x63,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xb4,0x00,0x01,0x00,0x00,0x01,0x65,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x00,0x01,0x6b,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6d,0x00,0x00, +0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x01,0x71,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x73,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x01,0x77,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01, +0x00,0x00,0x01,0x7d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x00,0x01,0x81,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x00,0x01,0x85,0x00,0x00,0x00,0x01, +0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x01,0x8b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x01,0x8d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x8f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x00, +0x01,0x93,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01, +0x03,0x3d,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01, +0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x57, +0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1b,0x04,0x1b,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x03,0x57,0x03,0x57,0x00,0x00, +0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x3d, +0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce, +0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00, +0x00,0x68,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x01,0x01,0x13,0x00,0x01,0x00,0x01,0x01,0x13,0x00,0x01,0x00,0x00,0x01,0xa3,0x00,0x01,0x00,0x53,0x00,0x01,0x00,0x01,0x00,0x53,0x00,0x01,0x00,0x00,0x01,0xa4,0x00,0x01,0x01,0x7e,0x00,0x01,0x00,0x01,0x01,0x7e,0x00,0x01, +0x00,0x00,0x01,0xa5,0x00,0x01,0x01,0x93,0x00,0x01,0x00,0x01,0x01,0x93,0x00,0x01,0x00,0x00,0x01,0xa6,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x03,0x03,0x45,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x03,0x03,0x57,0x03,0x45,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x01, +0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x47,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x01, +0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4b,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00, +0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x03,0x3d,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x02, +0x04,0x15,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x15,0x04,0x15,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x00,0x00,0x5f,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x00,0x00,0x00, +0x00,0x01,0x00,0x03,0x03,0x29,0x03,0x29,0x03,0x29,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01, +0x00,0x00,0x00,0xd3,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2c,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x30, +0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x30,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x02,0x05,0xb5,0x05,0xb5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xb5,0x05,0xb5,0x05,0xb5,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x03,0x46,0x03,0x46, +0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x42,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03, +0x03,0x29,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe, +0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01, +0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x03,0x5c,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01, +0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x00,0xe0,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01, +0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x01,0x0e,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x17,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c, +0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03, +0x04,0x1b,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1b,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x42, +0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22, +0x00,0x01,0x00,0x00,0x01,0x5c,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x01,0x89,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x00,0x00,0x00, +0x00,0x01,0x00,0x03,0x03,0x30,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x05,0xbe, +0x05,0xbe,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0xc5,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c, +0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b, +0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x5c,0x03,0x43,0x03,0x43,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01, +0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x48,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x04,0x19, +0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01, +0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19, +0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x45,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x02,0x06,0xce, +0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x88,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x88,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01, +0x00,0x00,0x00,0x89,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8a,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1b,0x00,0x03,0x06,0xce,0x06,0xce, +0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00, +0x00,0x71,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3a, +0x00,0x01,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d, +0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x58,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x5a,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x61,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x29, +0x00,0x01,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x01,0x00,0x00,0x00,0x63,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c, +0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xa0,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0xd8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xda,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xdc,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2b, +0x00,0x01,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0xde,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x0a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x0b,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30, +0x00,0x01,0x00,0x00,0x01,0x0c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x19,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb5,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x1b,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x03,0x03,0x57, +0x03,0x46,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x57,0x03,0x46,0x03,0x46,0x03,0x46,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c, +0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x01,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe, +0x00,0x01,0x00,0x00,0x00,0x8c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xab,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x5c, +0x00,0x01,0x00,0x00,0x00,0xb3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xe5,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57, +0x00,0x01,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xf1,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x19, +0x00,0x01,0x00,0x00,0x00,0xf4,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x25,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x26,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b, +0x00,0x01,0x00,0x00,0x01,0x31,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x34,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x35,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x37,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19, +0x00,0x01,0x00,0x00,0x01,0x38,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3a,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b, +0x00,0x01,0x00,0x00,0x01,0x40,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b, +0x00,0x01,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x3a,0x03,0x57, +0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b, +0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b, +0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43, +0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0xb8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfa,0x00,0x00, +0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0xfb,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x44,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x45,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x3d, +0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xa2,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01, +0x00,0x03,0x03,0x2e,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x19,0x04,0x19, +0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x49,0x00,0x00,0x00,0x01,0x00,0x04, +0x03,0x2e,0x03,0x57,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00, +0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x01,0x98,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x99,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01, +0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x29, +0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01, +0x03,0x2e,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x46,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57, +0x03,0x46,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00, +0x00,0x01,0x00,0x04,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x03,0x03,0x57,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x03,0x00,0x01, +0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x05,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x45,0x00,0x01, +0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xba,0x00,0x02, +0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xbe,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x02, +0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xca,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01, +0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xec,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x22,0x00,0x00, +0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x23,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x28,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x29,0x00,0x01, +0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x19,0x04,0x19,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x02, +0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x01, +0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34, +0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xa8,0x00,0x02,0x03,0x30,0x03,0x43, +0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xb5,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43, +0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01, +0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3a, +0x00,0x01,0x00,0x00,0x00,0x29,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x2b,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce, +0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe7,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe9,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57, +0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x01,0x00,0x02, +0x03,0x34,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x9c,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x99,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x19, +0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0xc5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02, +0x04,0x1c,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x03,0x48, +0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x04,0x03,0x2e,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc5,0x00,0x01,0x06,0xce, +0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc7,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2f,0x00,0x00,0x00,0x01, +0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x00,0x00,0xa6,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x10,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02, +0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19, +0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00, +0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01, +0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x04,0x00,0x00, +}; + +read_only global String8 rd_default_code_font_bytes = {rd_default_code_font_bytes__data, sizeof(rd_default_code_font_bytes__data)}; +read_only global U8 rd_icon_file_bytes__data[] = +{ +0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x00,0x02,0x1e,0x00,0x00,0x16,0x00,0x00,0x00,0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x00,0x00,0x5c,0x72,0xa8,0x66,0x00,0x00,0x1d,0xc9,0x49,0x44,0x41,0x54,0x78, +0x9c,0xed,0xdd,0x7b,0x7c,0x14,0xe5,0xbd,0xc7,0xf1,0xcf,0x6e,0xb2,0x9b,0x04,0x12,0x20,0x10,0xae,0xe2,0x25,0x52,0x06,0x05,0xe5,0x12,0x14,0x6f,0xc7,0x56,0x99,0x5a,0xd4,0xaa,0xd5,0xda,0x8b,0xb7,0xa2,0x55,0x4f,0x6d,0x6b,0xab,0xb5,0xf6,0x72,0x7a,0xb1,0xb5,0x1e,0x41,0xce,0xd1,0xb6,0x5a,0x4f,0xeb,0xa9,0x56,0x8b,0x37,0xb4,0x5a, +0xfb,0xaa,0x56,0x5a,0xa4,0x1d,0xb5,0x20,0x2d,0x95,0x8a,0x8a,0xf5,0xa0,0x83,0x8a,0x37,0x10,0x08,0x90,0x70,0x0b,0xe4,0xb6,0x7b,0xfe,0x98,0x8d,0x44,0x48,0x42,0x36,0xf3,0xcc,0xfc,0x66,0x77,0x7e,0xef,0xd7,0x8b,0x57,0xbc,0x24,0xcf,0xf3,0xcb,0x32,0xcf,0x77,0x9f,0x99,0x9d,0x79,0x1e,0x50,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5, +0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x54,0xe1,0x4a,0x48,0x17,0xa0,0x82,0xe5,0x58,0x54,0x01,0xd5,0xc0,0xa0,0x4e,0x5f,0x3b,0xff,0x33,0x40,0x23,0xd0,0x90,0xfb,0xda,0xf9,0x9f,0x1b,0x6c,0x97,0x6d,0x61,0xd7,0xac,0xc2,0xa3,0x01,0x50,0xa0,0x1c,0x8b,0xa1,0xc0,0x54,0x60,0x0a,0x70,0x30,0x7b, +0x0f,0xec,0x6a,0x60,0x20,0x50,0xe2,0xb3,0xab,0x76,0x60,0x0b,0x9d,0x42,0x81,0xdd,0x41,0xf1,0x06,0xf0,0x3c,0xf0,0x9c,0xed,0x52,0xef,0xb3,0x1f,0x25,0x40,0x03,0xa0,0x00,0x38,0x16,0xfb,0x03,0x75,0x78,0x83,0xbd,0x2e,0xf7,0x67,0x3f,0xd1,0xa2,0xf6,0xb6,0x06,0x58,0xde,0xf9,0x8f,0xed,0xf2,0xae,0x6c,0x49,0x6a,0x5f,0x34,0x00,0x22, +0xc4,0xb1,0x48,0xe0,0xbd,0x9b,0xd7,0x75,0xfa,0x33,0x05,0x18,0x2a,0x59,0x97,0x0f,0xf5,0x78,0x33,0x84,0xce,0xa1,0xf0,0xba,0x6c,0x49,0xaa,0x33,0x0d,0x80,0x88,0x70,0x2c,0x7e,0x0f,0x9c,0x80,0x37,0x6d,0x2f,0x66,0x5b,0x80,0xa7,0x6d,0x97,0x33,0xa5,0x0b,0x51,0x1a,0x00,0x91,0xe0,0x58,0xd4,0xe2,0x9d,0x4f,0xc7,0x49,0xad,0xed,0xf2, +0xa6,0x74,0x11,0x71,0x97,0x94,0x2e,0x40,0x01,0x30,0x5d,0xba,0x00,0x01,0x71,0xfc,0x9d,0x23,0x47,0x03,0x20,0x1a,0xe2,0x38,0x18,0xe2,0xf8,0x3b,0x47,0x8e,0x06,0x40,0x34,0x9c,0x28,0x5d,0x80,0x80,0x38,0xfe,0xce,0x91,0xa3,0x01,0x20,0xcc,0xb1,0x38,0x04,0x18,0x29,0x5d,0x87,0x80,0x51,0x8e,0xc5,0x38,0xe9,0x22,0xe2,0x4e,0x03,0x40, +0x5e,0x9c,0xa7,0xc2,0x71,0xfe,0xdd,0x23,0x41,0x03,0x40,0x5e,0x9c,0x07,0x41,0x9c,0x7f,0xf7,0x48,0xd0,0x8f,0x01,0x05,0xe5,0x6e,0xfc,0xa9,0x07,0x86,0x48,0xd7,0x22,0x64,0x23,0x30,0xcc,0x76,0xc9,0x4a,0x17,0x12,0x57,0x3a,0x03,0x90,0x35,0x91,0xf8,0x0e,0x7e,0x80,0x1a,0xe0,0x70,0xe9,0x22,0xe2,0x4c,0x03,0x40,0x96,0x4e,0x81,0xf5, +0x35,0x10,0xa5,0x01,0x20,0x4b,0x0f,0x7e,0x7d,0x0d,0x44,0xe9,0x35,0x00,0x21,0x8e,0x45,0x09,0xb0,0x19,0x18,0x20,0x5d,0x8b,0xb0,0x2d,0xc0,0x10,0xdb,0xa5,0x5d,0xba,0x90,0x38,0xd2,0x19,0x80,0x9c,0xa9,0xe8,0xe0,0x07,0xef,0xe1,0xa7,0x3a,0xe9,0x22,0xe2,0x4a,0x03,0x40,0x8e,0x4e,0x7d,0x77,0xd3,0xd7,0x42,0x88,0x06,0x80,0x1c,0x3d, +0xe8,0x77,0xd3,0xd7,0x42,0x88,0x5e,0x03,0x10,0xe0,0x58,0xa4,0xf1,0x96,0xd6,0xea,0x27,0x5d,0x4b,0x44,0x34,0x01,0x83,0x6c,0x97,0x56,0xe9,0x42,0xe2,0x46,0x67,0x00,0x32,0x8e,0x42,0x07,0x7f,0x67,0xfd,0xf0,0x5e,0x13,0x15,0x32,0x0d,0x00,0x19,0x3a,0xe5,0xdd,0x9b,0xbe,0x26,0x02,0x34,0x00,0x64,0xe8,0xc1,0xbe,0x37,0x7d,0x4d,0x04, +0xe8,0x35,0x80,0x90,0x39,0x16,0x15,0x78,0x4b,0x6a,0xa7,0xa5,0x6b,0x89,0x98,0x66,0xa0,0xda,0x76,0xd9,0x29,0x5d,0x48,0x9c,0xe8,0x0c,0x20,0x7c,0xc7,0xa1,0x83,0xbf,0x2b,0x65,0xc0,0xb1,0xd2,0x45,0xc4,0x8d,0x06,0x40,0xf8,0x74,0xaa,0xdb,0x3d,0x7d,0x6d,0x42,0xa6,0x01,0x10,0x3e,0x3d,0xc8,0xbb,0xa7,0xaf,0x4d,0xc8,0xf4,0x1a,0x40, +0x88,0x1c,0x8b,0x01,0x78,0xf7,0xff,0xfb,0xdd,0xae,0xab,0x58,0xb5,0x01,0x83,0x75,0x3f,0xc2,0xf0,0xe8,0x0c,0x20,0x5c,0xc7,0xa3,0x83,0xbf,0x27,0xa5,0x78,0xaf,0x91,0x0a,0x89,0xce,0x00,0x42,0xe0,0x58,0x94,0x03,0x5f,0x00,0xbe,0x0d,0x8c,0x12,0x2e,0x27,0xea,0xd6,0x02,0x73,0x80,0x3b,0x6c,0x97,0x5d,0xd2,0xc5,0x14,0x3b,0x0d,0x80, +0x00,0xe5,0x3e,0xf2,0xfb,0x22,0xf0,0x2d,0x60,0x84,0x70,0x39,0x85,0xe6,0x3d,0xe0,0x46,0xe0,0x7f,0xf5,0xa3,0xc1,0xe0,0x68,0x00,0x04,0xc0,0xb1,0xe8,0x0f,0x7c,0x19,0xb8,0x1a,0x18,0x2e,0x5c,0x4e,0xa1,0x5b,0x0f,0xdc,0x04,0xdc,0x66,0xbb,0xec,0x90,0x2e,0xa6,0xd8,0x68,0x00,0x18,0xe4,0x58,0x54,0x02,0x5f,0x01,0xbe,0x4e,0xe1,0xee, +0xe8,0x1b,0x55,0xf5,0xc0,0x4f,0x80,0xff,0xb1,0x5d,0xb6,0x4b,0x17,0x53,0x2c,0x34,0x00,0x0c,0xc8,0x5d,0xdd,0xbf,0x02,0xf8,0x1a,0xf1,0x5e,0xe4,0x33,0x0c,0x9b,0x80,0x9b,0x81,0x9f,0xd9,0x2e,0x5b,0xa5,0x8b,0x29,0x74,0x05,0x15,0x00,0x8e,0x45,0x12,0xf8,0x11,0xb0,0x1a,0x58,0x60,0xbb,0xac,0x15,0xae,0x27,0x0d,0x7c,0x13,0xf8,0x06, +0x30,0x48,0xb2,0x96,0x18,0x6a,0x00,0x7e,0x0c,0xdc,0x68,0xbb,0xb4,0x48,0x16,0xe2,0x58,0x8c,0x02,0x4e,0x06,0x0e,0x02,0xae,0xb5,0x5d,0x32,0x92,0xf5,0xe4,0xa3,0xd0,0x02,0xe0,0x66,0xe0,0xca,0x4e,0xff,0xe9,0x5f,0xc0,0x02,0xe0,0x09,0x60,0xb1,0xed,0xd2,0x1c,0x62,0x2d,0x75,0xc0,0x5c,0x74,0x59,0x6b,0x69,0x2f,0x01,0x17,0xda,0x2e, +0xcf,0x87,0xd5,0xa1,0x63,0x51,0x86,0xf7,0x71,0xe5,0x0c,0xbc,0x81,0x7f,0x58,0xa7,0xff,0x7d,0xb3,0xed,0x72,0x55,0x58,0xb5,0xf8,0x55,0x30,0x01,0xe0,0x58,0x5c,0x89,0x37,0xf5,0xeb,0x4e,0x13,0xf0,0x34,0xb9,0x40,0xb0,0x5d,0xdc,0x80,0xea,0x48,0x01,0xd7,0x00,0xdf,0xc1,0xfb,0xdc,0x5a,0xc9,0x6b,0x03,0x6e,0x00,0xfe,0x33,0xa8,0x45, +0x45,0x1c,0x0b,0x8b,0xdd,0x03,0xfe,0x04,0x7a,0x5e,0xcf,0xe1,0x4a,0xdb,0xe5,0x67,0x41,0xd4,0x61,0x5a,0x41,0x04,0x80,0x63,0x71,0x26,0xf0,0x08,0xf9,0xdd,0xb8,0xb4,0x1a,0x6f,0x66,0xb0,0x00,0x78,0xd2,0xc4,0xdd,0x65,0x8e,0xc5,0x14,0xbc,0x77,0xfd,0x89,0x7e,0xdb,0x52,0x81,0x58,0x01,0x5c,0x64,0x62,0x36,0xe0,0x58,0x54,0x01,0x36, +0xde,0xa0,0x9f,0x01,0xd4,0xe6,0xf1,0xe3,0x19,0xe0,0x93,0xb6,0xcb,0xa3,0x7e,0xeb,0x08,0x5a,0xe4,0x03,0xc0,0xb1,0x98,0x86,0xf7,0xce,0x5e,0xe1,0xa3,0x99,0x56,0xe0,0x6f,0xec,0x0e,0x84,0x17,0xf2,0xd9,0x8e,0x2a,0xf7,0xae,0xff,0x7d,0xe0,0xbb,0xe8,0xbb,0x7e,0xd4,0xb5,0x02,0xb3,0x81,0x59,0xf9,0xcc,0x06,0x72,0xdb,0xb4,0x4d,0x61, +0xf7,0xbb,0xfc,0x31,0x40,0xca,0x47,0x1d,0x4d,0xc0,0x09,0xb6,0xcb,0x32,0x1f,0x6d,0x04,0x2e,0xd2,0x01,0xe0,0x58,0xd4,0x02,0x4b,0x81,0x61,0x86,0x9b,0x5e,0x0f,0x2c,0xc4,0x0b,0x84,0x85,0xb6,0x4b,0x7d,0x0f,0x35,0x4c,0xc6,0x7b,0xd7,0x9f,0x64,0xb8,0x06,0x15,0xac,0x17,0xf1,0xae,0x0d,0xbc,0xd8,0xdd,0x37,0x38,0x16,0x43,0x81,0x8f, +0xe1,0x0d,0xf8,0x93,0x30,0x7f,0xcf,0xc6,0x06,0xe0,0x68,0xdb,0x65,0xb5,0xe1,0x76,0x8d,0x89,0x6c,0x00,0x38,0x16,0xd5,0x78,0xef,0xda,0x87,0x04,0xdc,0x55,0x16,0x58,0xce,0xee,0xd9,0xc1,0xdf,0x6d,0x97,0xb6,0xdc,0xbb,0xfe,0xf7,0xf0,0xde,0xf5,0xfd,0xbc,0x13,0x28,0x39,0xad,0xc0,0x2c,0x60,0xb6,0xed,0xd2,0xea,0x58,0x94,0xe2,0xbd, +0xb3,0x9f,0x8c,0xf7,0x4e,0x5f,0x47,0xf0,0x63,0xe0,0x15,0xe0,0x58,0xdb,0xa5,0x21,0xe0,0x7e,0xfa,0x24,0x92,0x01,0x90,0xbb,0xca,0xba,0x10,0xf8,0xb0,0x40,0xf7,0x5b,0x01,0x07,0xef,0x9c,0x6f,0xb2,0x40,0xff,0xca,0xbc,0x17,0xf0,0xae,0x09,0xd9,0xc8,0x6c,0xc6,0xb2,0x08,0x38,0x49,0xfa,0xe3,0xca,0xae,0x44,0x2e,0x00,0x72,0xe7,0x62, +0xf7,0x03,0xe7,0x4a,0xd7,0xa2,0x94,0x41,0xf3,0x80,0x0b,0xa2,0xb6,0x15,0x7a,0x14,0x1f,0x07,0xbe,0x1e,0x1d,0xfc,0xaa,0xf8,0x9c,0x07,0xfc,0xa7,0x74,0x11,0x7b,0x8a,0xd4,0x0c,0xc0,0xb1,0xb8,0x14,0xb8,0x43,0xba,0x0e,0xa5,0x02,0x74,0xa9,0xed,0x72,0xa7,0x74,0x11,0x1d,0x22,0x13,0x00,0x8e,0xc5,0x47,0x81,0x3f,0xa1,0x1f,0xb3,0xa9, +0xe2,0xd6,0x06,0x9c,0x62,0xbb,0xfc,0x45,0xba,0x10,0x88,0x48,0x00,0xe4,0xae,0xf8,0xbf,0x0c,0x8c,0x94,0xae,0x45,0xa9,0x10,0xbc,0x07,0x4c,0x88,0xc2,0x27,0x03,0x51,0xb9,0x06,0xf0,0x33,0x74,0xf0,0xab,0xf8,0x18,0x09,0xdc,0x22,0x5d,0x04,0x44,0x60,0x06,0xe0,0x58,0x9c,0x0e,0x3c,0x26,0x5d,0x87,0x52,0x02,0x4e,0xb7,0x5d,0x1e,0x97, +0x2c,0x40,0x34,0x00,0x74,0xea,0xaf,0x62,0x4e,0xfc,0x54,0x40,0xfa,0x14,0xe0,0x16,0x74,0xf0,0xab,0xf8,0x1a,0x49,0xcf,0x4f,0xb8,0x06,0x4e,0x6c,0x06,0xa0,0x53,0x7f,0xa5,0xde,0x27,0x76,0x2a,0x20,0x12,0x00,0x3a,0xf5,0x57,0xea,0x03,0xd6,0xe2,0x9d,0x0a,0x34,0x86,0xdd,0xb1,0xd4,0x29,0x80,0x4e,0xfd,0x95,0xda,0x6d,0x14,0x42,0x9f, +0x0a,0x84,0x3e,0x03,0xd0,0xa9,0xbf,0x52,0xdd,0x0a,0xfd,0x54,0x20,0xd4,0x00,0xd0,0xa9,0xbf,0x52,0x3d,0x0a,0xfd,0x54,0x20,0xec,0x53,0x00,0x9d,0xfa,0x2b,0xd5,0xbd,0xd0,0x4f,0x05,0x42,0x9b,0x01,0x38,0x16,0xa7,0x01,0x7f,0x08,0xab,0x3f,0xa5,0x0a,0x58,0x68,0xa7,0x02,0xa1,0x04,0x40,0x6e,0x81,0x8f,0x55,0xc0,0xfe,0x61,0xf4,0xa7, +0x54,0x81,0x7b,0x07,0xf8,0x50,0x18,0x0b,0x88,0x84,0x75,0x0a,0x70,0x09,0x3a,0xf8,0x95,0xea,0xad,0xfd,0xf1,0xc6,0x4c,0xe0,0x02,0x9f,0x01,0xe4,0x76,0xcf,0x79,0x0d,0x0d,0x00,0xa5,0xf2,0xf1,0x36,0x30,0x36,0xe8,0x59,0x40,0x18,0x33,0x80,0xcf,0xa3,0x83,0x5f,0xa9,0x7c,0x1d,0x00,0x5c,0x14,0x74,0x27,0x81,0xce,0x00,0x72,0x2b,0xeb, +0xae,0x02,0x0e,0x0c,0xb2,0x1f,0xa5,0x8a,0xd4,0x5b,0x78,0xb3,0x80,0x40,0x76,0x3b,0x82,0xe0,0x67,0x00,0x17,0xa2,0x83,0x5f,0xa9,0xbe,0x3a,0x10,0x98,0x19,0x64,0x07,0x81,0xcd,0x00,0x72,0x6b,0xb0,0xbb,0xe4,0xb7,0xa5,0x92,0x52,0xea,0x83,0x56,0x03,0x96,0xed,0xd2,0x16,0x44,0xe3,0x41,0xce,0x00,0x66,0xa2,0x83,0x5f,0x29,0xbf,0x6a, +0x81,0xcf,0x05,0xd5,0x78,0x20,0x33,0x80,0xdc,0xbb,0xff,0xab,0xc0,0xc1,0x41,0xb4,0xaf,0x54,0xcc,0xbc,0x0e,0x8c,0xb3,0x5d,0xda,0x4d,0x37,0x1c,0xd4,0x0c,0xe0,0x7c,0x74,0xf0,0x2b,0x65,0xca,0x18,0xbc,0x31,0x65,0x9c,0xf1,0x19,0x80,0x63,0x51,0x82,0xb7,0x1f,0xda,0x87,0x4c,0xb7,0xad,0x54,0x8c,0xad,0x02,0x0e,0x35,0x3d,0x0b,0x08, +0x62,0x0d,0xfe,0xf3,0xd0,0xc1,0xdf,0xa3,0x64,0x2a,0xcd,0x90,0xe9,0xa7,0x33,0xea,0xd3,0x97,0x52,0x7d,0xe4,0x47,0x00,0xc8,0x66,0xb3,0x40,0x16,0x32,0x19,0xef,0x9f,0x73,0x7f,0xb2,0xd9,0xcc,0xfb,0xff,0x4c,0x36,0x4b,0x36,0x93,0xf1,0xbe,0x2f,0x9b,0xf5,0xbe,0xaf,0xf3,0xf7,0x93,0xfb,0xff,0xdd,0xfc,0x7c,0xc7,0xf7,0x43,0x76,0xf7, +0xcf,0x7c,0xa0,0xbf,0x3d,0xfa,0xee,0xa2,0x2f,0xb2,0x59,0xb2,0x74,0xf5,0xb3,0xbd,0xab,0xb5,0xf3,0xcf,0xaf,0x7b,0xf4,0x3e,0x36,0x3e,0xa9,0x4f,0x86,0xf7,0xd2,0x58,0xbc,0x1d,0xb3,0xee,0x33,0xd9,0xa8,0xd1,0x19,0x80,0x63,0x91,0x04,0x56,0x02,0x96,0xc9,0x76,0x8b,0x59,0xbf,0x03,0xc7,0x32,0xf2,0x33,0x97,0x32,0xf2,0xac,0x8b,0x48, +0x0f,0x31,0xbd,0x0b,0x7a,0xb4,0x65,0xdb,0x5a,0x59,0xf1,0xc5,0x33,0xd8,0xb4,0x78,0x81,0x74,0x29,0x85,0xe2,0x55,0x60,0xbc,0xed,0x92,0x31,0xd5,0xa0,0xe9,0x00,0x38,0x07,0x78,0xc0,0x64,0x9b,0x71,0x91,0x4c,0xa5,0x19,0x72,0xe2,0x69,0x1c,0x70,0xf1,0x37,0x18,0x38,0xe5,0x18,0xe9,0x72,0x42,0x93,0x69,0xde,0xc5,0x8b,0x97,0x9e,0x42, +0xc3,0xb3,0x4f,0x4b,0x97,0x52,0x28,0xce,0xb5,0x5d,0x1e,0x34,0xd5,0x98,0xe9,0x8b,0x80,0xa1,0x3c,0xc0,0x50,0x8c,0x32,0xad,0x2d,0xd4,0x2f,0xfc,0x1d,0xcb,0xcf,0x3f,0x9e,0x55,0x37,0x7c,0x9d,0x4c,0xf3,0x2e,0xe9,0x92,0x42,0x91,0x2c,0x2b,0x67,0xe2,0xed,0x8f,0x33,0x60,0xf2,0xd1,0xd2,0xa5,0x14,0x8a,0x8b,0x4d,0x36,0x66,0x6c,0x06, +0xe0,0x58,0x0c,0xc3,0x5b,0xd1,0xa4,0xc4,0x54,0x9b,0x71,0xd6,0xef,0xe0,0x43,0x18,0x3f,0x67,0x2e,0x03,0x26,0x1d,0x25,0x5d,0x4a,0x28,0xda,0xb6,0x36,0xb2,0x7c,0xe6,0x89,0x6c,0x5f,0xf9,0x82,0x74,0x29,0x51,0xd7,0x0e,0x8c,0xb4,0x5d,0xea,0x4d,0x34,0x66,0x72,0x06,0xf0,0x69,0x74,0xf0,0x1b,0xd3,0xf4,0xc6,0x2b,0x3c,0x77,0xee,0xbf, +0xf1,0xfa,0x8f,0xbf,0x43,0xa6,0x35,0xf0,0xc7,0xc2,0xc5,0x95,0x0e,0x18,0xc4,0x94,0x5f,0xff,0x99,0xfe,0x1f,0x1a,0x2f,0x5d,0x4a,0xd4,0x95,0xe0,0x8d,0x35,0x23,0x4c,0x06,0xc0,0x39,0x06,0xdb,0x52,0x40,0xb6,0xbd,0x8d,0xb7,0x6e,0x9f,0xc3,0xb2,0xb3,0xa6,0xd2,0xb4,0xfa,0x55,0xe9,0x72,0x02,0x97,0xaa,0xae,0x61,0xca,0xdc,0xbf,0x50, +0x71,0xc0,0x18,0xe9,0x52,0xa2,0xce,0xd8,0x58,0x33,0x72,0x0a,0xe0,0x58,0x8c,0xc6,0x7b,0x7e,0x59,0x7c,0xaf,0xc1,0x62,0x55,0x36,0x7c,0x3f,0xea,0xe6,0x2d,0xa6,0x62,0x74,0xf1,0xdf,0x5d,0xbd,0x6b,0xed,0x5b,0x2c,0x3f,0xff,0xc3,0xec,0x5a,0xfb,0xb6,0x74,0x29,0x51,0x95,0x05,0xf6,0xb7,0x5d,0xd6,0xf8,0x6d,0xc8,0x54,0x00,0x5c,0x0d, +0xdc,0x64,0xa2,0xad,0x42,0x52,0x5a,0x99,0xa0,0xfa,0xb0,0x34,0xe5,0x43,0x4b,0x28,0xab,0x4e,0x92,0xae,0x4e,0x52,0x36,0x38,0x49,0x32,0x95,0xa0,0x79,0x73,0x86,0x96,0xcd,0x19,0x9a,0x1b,0xda,0x69,0xde,0x94,0xa1,0x71,0x65,0x2b,0xbb,0xea,0xfd,0xdd,0xc3,0x51,0x31,0xba,0x96,0xba,0x79,0x8b,0x29,0x1b,0xbe,0x9f,0xa1,0xdf,0x20,0xba, +0x9a,0xde,0x5a,0xc5,0xf2,0xf3,0x3e,0x4c,0xcb,0xc6,0x75,0xd2,0xa5,0x44,0xd5,0xd5,0xb6,0xcb,0x4f,0xfc,0x36,0x62,0x2a,0x00,0x96,0x01,0x47,0x98,0x68,0x2b,0xea,0xca,0x6b,0x4a,0xa8,0x99,0x96,0x66,0xe8,0xb4,0x32,0x06,0x8d,0x4f,0x93,0xc8,0xe3,0xaa,0xc7,0xf6,0xd5,0x6d,0xd4,0x3f,0xdb,0x4c,0xfd,0xb2,0x66,0xb6,0xbf,0xd9,0xe6,0xe5, +0x78,0x9e,0xfa,0xd5,0x8e,0xa3,0xee,0xfe,0x45,0xb1,0xb8,0x67,0x60,0xc7,0xaa,0x97,0x59,0xfe,0xb9,0x13,0x68,0x6d,0xd8,0x28,0x5d,0x4a,0x14,0x2d,0xb3,0x5d,0xa6,0xf9,0x6d,0xc4,0x77,0x00,0x38,0x16,0x63,0xf0,0x96,0xfc,0x2a,0x6a,0xfd,0x46,0x95,0x30,0xe6,0x82,0x4a,0x86,0x1e,0x55,0x66,0xa4,0xbd,0x6d,0xaf,0xb7,0xf1,0xda,0xbd,0xdb, +0x69,0x78,0x29,0xff,0x0b,0x7c,0x95,0xe3,0x26,0x52,0x77,0xdf,0xd3,0x94,0x0e,0xa8,0x36,0x52,0x4b,0x94,0x6d,0x7b,0x79,0x39,0xcf,0x5f,0x38,0x9d,0xb6,0x6d,0x5b,0xa4,0x4b,0x89,0xa2,0x31,0xb6,0xcb,0x1b,0x7e,0x1a,0x30,0x71,0x11,0xb0,0xa8,0x2f,0xfe,0xa5,0xab,0x93,0x8c,0xbb,0xac,0x8a,0xa3,0x6e,0x19,0x62,0x6c,0xf0,0x03,0x54,0x8d, +0x29,0x65,0xca,0xb5,0x83,0x98,0x7c,0xcd,0x20,0x2a,0x0f,0xca,0xef,0x8e,0xec,0xed,0xaf,0xae,0xe0,0x85,0x4b,0x4e,0x8e,0xc5,0xbd,0x02,0x55,0x13,0xea,0x98,0x74,0xc7,0x1f,0x29,0xe9,0x57,0x29,0x5d,0x4a,0x14,0xf9,0x1e,0x7b,0xbe,0x3f,0xb6,0xbb,0x70,0x08,0xbf,0x00,0x8a,0x72,0x3e,0x3a,0xfc,0xdf,0xca,0x99,0x72,0xed,0x20,0x06,0x8e, +0x4b,0x91,0x08,0xe8,0xf2,0x66,0xc5,0x88,0x12,0xf6,0xfb,0x58,0x05,0xc9,0x74,0x82,0xc6,0x7f,0xb5,0xf4,0xfa,0xb4,0xa0,0x79,0xfd,0x1a,0x48,0x24,0xa8,0x3e,0x7a,0x7a,0x30,0x85,0x45,0x48,0xf9,0xc8,0xfd,0x19,0x38,0xf9,0x68,0x36,0x2c,0x78,0x98,0x6c,0x5b,0x20,0xeb,0x62,0x14,0xaa,0x61,0xf7,0x6c,0xe2,0x36,0x3f,0x0d,0xf8,0x3a,0xac, +0x1d,0x8b,0x09,0xc0,0xbf,0xfc,0xb4,0x11,0x45,0x89,0x04,0xd4,0x9e,0xdb,0x9f,0x83,0xce,0xee,0x1f,0x6a,0xbf,0x9b,0x9e,0x6b,0xe1,0xe5,0x9f,0x6e,0xa1,0x6d,0x67,0xef,0x52,0x20,0x99,0x2e,0x63,0xda,0xe3,0x2f,0xd1,0xef,0xc0,0xb1,0x01,0x57,0x16,0x0d,0x9b,0xfe,0xfa,0x47,0x5e,0xba,0xfc,0xac,0x58,0xdc,0x17,0x91,0x87,0x09,0xb6,0xcb, +0xff,0xf5,0xf5,0x87,0xfd,0x9e,0x02,0x14,0xdd,0xf4,0xbf,0xa4,0x3c,0xc1,0x61,0xdf,0x1a,0x18,0xfa,0xe0,0x07,0x18,0x32,0x35,0xcd,0xd4,0x39,0xd5,0x54,0x0c,0xef,0xdd,0xc4,0x2c,0xd3,0xd2,0x8c,0x7b,0xdd,0x57,0x02,0xae,0x2a,0x3a,0x86,0x7c,0xe4,0x54,0xc6,0xff,0xf8,0x7e,0x12,0x25,0x41,0x3c,0xc4,0x5a,0xb0,0x7c,0x8d,0x41,0xbf,0x01, +0xf0,0x59,0x9f,0x3f,0x1f,0x29,0x89,0x12,0x98,0xf8,0x9d,0x81,0x0c,0x9d,0x66,0xee,0x5c,0x3f,0x5f,0xfd,0x47,0x97,0x52,0x77,0x7d,0x35,0x65,0x83,0x7b,0xf7,0x57,0xb3,0xf9,0x99,0x85,0x6c,0x58,0xf0,0x70,0xc0,0x55,0x45,0xc7,0xb0,0x19,0x9f,0xe2,0xd0,0x1b,0xee,0x22,0x91,0x94,0xda,0xd9,0x3e,0x72,0x7c,0x8d,0xc1,0x3e,0xbf,0x8a,0x8e, +0x45,0x1d,0xde,0x33,0xca,0x45,0xc3,0xba,0xa4,0x8a,0xea,0xc3,0xd2,0xd2,0x65,0x50,0x36,0x38,0xc9,0xe1,0xdf,0x1e,0x48,0x32,0xdd,0xbb,0x33,0xb4,0x55,0xb3,0xaf,0xa2,0xbd,0x69,0x7b,0xc0,0x55,0x45,0xc7,0x88,0x4f,0x7c,0x0e,0xeb,0x07,0x3f,0x27,0xb0,0x0b,0x33,0x85,0xc5,0xca,0x8d,0xc5,0x3e,0xe9,0xf3,0x45,0xc0,0x0b,0x87,0xd0,0x04, +0x9c,0x08,0x8c,0xee,0x6b,0x1b,0x51,0xb2,0xdf,0xc9,0x15,0xd4,0x7e,0x26,0xfc,0x69,0x7f,0x77,0xca,0x06,0x97,0x50,0x31,0xbc,0x84,0xfa,0x7f,0x34,0xef,0xf3,0x7b,0xdb,0x77,0x6c,0xa3,0x75,0xd3,0x06,0x4a,0xaa,0x06,0xd0,0xb2,0x61,0x2d,0xad,0x9b,0xd6,0xd3,0xda,0xb0,0x91,0xb6,0xad,0x0d,0xb4,0x6d,0xdf,0x4a,0x66,0xe7,0x0e,0x32,0xcd, +0xbb,0xc8,0xb6,0xb5,0x92,0xcd,0x64,0x48,0x24,0x13,0x05,0xff,0x0e,0x3a,0xe0,0xf0,0x23,0x28,0xe9,0x5f,0xc5,0xe6,0x25,0x7f,0x96,0x2e,0x45,0xda,0x52,0xe0,0xd6,0x7b,0x36,0xb1,0xef,0x03,0xa5,0x0b,0x7e,0x2f,0x02,0x0e,0x00,0xfe,0x04,0x1c,0xeb,0xa7,0x1d,0x69,0x03,0xac,0x14,0x53,0x67,0x55,0x93,0x88,0xe0,0x98,0x58,0x75,0xd7,0x76, +0xde,0x99,0xdf,0x64,0xbc,0xdd,0x44,0x32,0x49,0xa2,0x34,0x45,0x22,0x95,0x26,0x99,0x4a,0xbf,0xff,0x35,0x99,0x4a,0x93,0x48,0x7f,0xf0,0xbf,0x75,0xf7,0x3d,0x89,0xd2,0xd4,0xee,0x7f,0xcf,0x7d,0x4d,0x0d,0x1a,0xc2,0x7e,0xe7,0x5f,0x4e,0xa2,0x24,0x9c,0xe7,0xc2,0x56,0x7c,0xf1,0x74,0x36,0x3e,0x15,0xca,0x46,0xba,0x51,0xb4,0x04,0x38, +0xc5,0x76,0xd9,0xd6,0xd7,0x06,0x7c,0x5d,0x4d,0xb1,0x5d,0xb6,0x3a,0x16,0x33,0x80,0xf9,0xc0,0x87,0xfd,0xb4,0x25,0x26,0x01,0x63,0x2f,0xaa,0x8c,0xe4,0xe0,0x07,0xa8,0x3d,0xa7,0x3f,0xeb,0x16,0xed,0xa2,0x75,0x9b,0xb1,0x45,0x60,0x00,0xc8,0x66,0x32,0x64,0x5b,0x9a,0xa1,0xa5,0xd9,0xd8,0x22,0x73,0x65,0xc3,0x46,0x31,0xe9,0xf6,0xf9, +0xa1,0x0d,0xfe,0x77,0xef,0xbd,0x95,0x8d,0x4f,0xcf,0x0f,0xa5,0xaf,0x08,0xfa,0x2b,0x70,0x9a,0xed,0xe2,0xeb,0xdc,0xcf,0xf7,0x61,0x9f,0x2b,0xe0,0x14,0xe0,0x49,0xbf,0x6d,0x49,0x18,0x3a,0xad,0x8c,0x81,0xe3,0x52,0xd2,0x65,0x74,0xab,0xb4,0x5f,0x82,0x03,0xcf,0xee,0x27,0x5d,0xc6,0x3e,0xf5,0x1f,0x7b,0x18,0x53,0x1f,0x5a,0x4a,0xe5, +0xa1,0x93,0x43,0xe9,0xef,0xdd,0x7b,0x6f,0xc5,0x9d,0x75,0x65,0x6e,0x2d,0xc4,0xd8,0x71,0x80,0x53,0xfd,0x0e,0x7e,0x30,0xf4,0x38,0xb0,0xed,0xd2,0x04,0x9c,0x06,0x2c,0x34,0xd1,0x5e,0x58,0x12,0x25,0x30,0xe6,0x82,0xe8,0xdf,0x61,0x36,0xfa,0x94,0x0a,0xca,0x87,0x45,0x77,0xa9,0x85,0xea,0x63,0x6c,0xa6,0x3e,0xb8,0x84,0xf2,0x91,0xe1, +0xec,0x01,0x1b,0xf3,0xc1,0xff,0x04,0x70,0x7a,0x6e,0xcc,0xf9,0x66,0x6c,0xe2,0x6b,0xbb,0xec,0x04,0xce,0x00,0xfe,0x68,0xaa,0xcd,0xa0,0x0d,0x3f,0xbe,0x9c,0x7e,0xa3,0xa2,0x3b,0xb0,0x3a,0x24,0x4b,0x13,0x1c,0xf4,0xc9,0x68,0xce,0x02,0x46,0x9c,0x39,0x93,0xc9,0x77,0x2e,0xa0,0xb4,0x72,0x40,0x28,0xfd,0xc5,0x7c,0xf0,0xcf,0x07,0x3e, +0x91,0x1b,0x6b,0x46,0x18,0x3d,0xf3,0xb5,0x5d,0x9a,0x81,0xb3,0x80,0x82,0x58,0xeb,0x79,0xd8,0x31,0x72,0x9f,0xf7,0xe7,0x6b,0xe8,0xd1,0x65,0x79,0x3d,0x79,0x18,0xb8,0x44,0x82,0xda,0xcb,0x7f,0xc0,0xf8,0xff,0xba,0x3b,0xb4,0x1b,0x73,0x62,0x3e,0xf8,0x1f,0x05,0x3e,0x99,0x1b,0x63,0xc6,0x18,0xbf,0xf4,0x65,0xbb,0xb4,0x00,0x9f,0x02, +0x1e,0x31,0xdd,0xb6,0x49,0x25,0xe5,0x09,0x06,0x4f,0x92,0xff,0xcc,0xbf,0xb7,0x52,0x55,0xc9,0xc8,0x5c,0xab,0x48,0x94,0xa6,0x38,0x74,0xd6,0x9d,0xd4,0x5e,0xf1,0xa3,0xd0,0xfa,0x8c,0xf9,0xe0,0x7f,0x04,0xf8,0x74,0x6e,0x6c,0x19,0x15,0xc8,0xb5,0xef,0xdc,0x7e,0xe6,0xe7,0x00,0x0f,0x05,0xd1,0xbe,0x09,0x83,0x27,0xa7,0x49,0xa6,0x0a, +0xeb,0x46,0x12,0xc9,0x3b,0x14,0x3b,0x94,0x56,0x0e,0x60,0xd2,0xed,0xf3,0x19,0x79,0xf6,0xe7,0x43,0xeb,0x33,0xe6,0x83,0xff,0x37,0xc0,0x39,0xb9,0x31,0x65,0x5c,0x60,0x1f,0x7e,0xe5,0xb6,0x33,0x3e,0x0f,0xb8,0x3f,0xa8,0x3e,0xfc,0xa8,0x39,0x52,0x7e,0x30,0xe5,0xab,0x46,0x38,0x00,0xca,0x46,0x8c,0xa6,0x6e,0xde,0x62,0x06,0x1f,0x77, +0x52,0x68,0x7d,0xc6,0x7c,0xf0,0xdf,0x07,0x9c,0x1f,0xd4,0xd6,0xe0,0x10,0xec,0xf6,0xe0,0xe4,0xf6,0x31,0x9b,0x09,0xcc,0x0d,0xb2,0x9f,0xbe,0xa8,0xdc,0xbf,0xf0,0x1e,0x28,0xa9,0x18,0x5e,0xd2,0xeb,0xdb,0x83,0x4d,0xab,0x1c,0x37,0x91,0x23,0x1e,0x5a,0x4a,0xe5,0xb8,0x89,0xa1,0xf5,0x19,0xf3,0xc1,0xff,0x6b,0xe0,0xc2,0x20,0x76,0x04, +0xee,0x2c,0xf0,0xdb,0x5f,0x72,0xdb,0x18,0x5d,0x0c,0xdc,0x11,0x74,0x5f,0xf9,0xe8,0xed,0xc3,0x36,0x51,0x53,0x56,0x1d,0x7e,0xdd,0x83,0x8f,0x3b,0x89,0xa9,0x0f,0x3c,0x13,0xea,0x5a,0x84,0x31,0x1f,0xfc,0x77,0x00,0x97,0x98,0xdc,0x02,0xac,0x3b,0xa1,0x1c,0x4d,0xb6,0x4b,0x16,0xb8,0x0c,0xf8,0x45,0x18,0xfd,0xed,0x4b,0xa2,0x04,0x52, +0x83,0x0a,0x34,0x00,0x42,0x0e,0xae,0x91,0x67,0x7f,0xde,0x5b,0x91,0xa7,0x7f,0x55,0x68,0x7d,0xc6,0x7c,0xf0,0xff,0x02,0xb8,0x2c,0x37,0x66,0x02,0x17,0xda,0x3c,0x38,0xf7,0x0b,0x5d,0xee,0x58,0xb4,0x02,0x57,0x86,0xd5,0x6f,0x57,0xd2,0x03,0x93,0x05,0xfb,0x20,0x59,0x3a,0xac,0x19,0x40,0x22,0x41,0xed,0x57,0xaf,0xa5,0xf6,0xf2,0x1f, +0x84,0xd3,0x5f,0x4e,0xcc,0x07,0xff,0xcd,0xb6,0xcb,0x55,0x61,0x76,0x18,0xfa,0xdb,0xa0,0xed,0xf2,0x35,0x84,0x97,0x10,0x4f,0x55,0x15,0xe6,0xbb,0x3f,0x40,0x6a,0x40,0xf0,0xb5,0x27,0x53,0x69,0xc6,0xcf,0x99,0xab,0x83,0x3f,0x5c,0x37,0x86,0x3d,0xf8,0x41,0x20,0x00,0x00,0x6c,0x97,0x6f,0x02,0x37,0x48,0xf4,0x0d,0x18,0x7f,0xb0,0x26, +0x4c,0xad,0x5b,0x83,0xad,0xbd,0xb4,0x6a,0x20,0x93,0x7e,0xf5,0x27,0x46,0x9c,0x39,0x33,0xd0,0x7e,0xf6,0x14,0xf3,0xc1,0x3f,0xdb,0x76,0xf9,0x96,0x44,0xc7,0x62,0x6f,0x85,0xb6,0xcb,0x77,0x81,0xeb,0x24,0xfa,0x6e,0xd9,0x92,0xe9,0xd3,0x9a,0xfc,0x51,0xd0,0xd2,0x10,0x5c,0x00,0x94,0x8f,0xdc,0x9f,0xa9,0x0f,0x3c,0x13,0xfa,0x42,0xa3, +0x31,0x1f,0xfc,0x3f,0xb2,0x5d,0xbe,0x27,0xd5,0xb9,0xe8,0x5c,0xd8,0x76,0xf9,0x21,0x70,0x4d,0xd8,0xfd,0x66,0xdb,0x73,0x21,0x50,0x80,0x9a,0x03,0x0a,0x80,0xca,0x43,0x27,0x33,0xf5,0xa1,0xa5,0xf4,0x1f,0x7b,0x58,0x20,0xed,0x77,0x27,0xe6,0x83,0xff,0xfb,0xb6,0xcb,0xb5,0x92,0x05,0x88,0x9f,0x0c,0xdb,0x2e,0xd7,0x03,0xb7,0x84,0xdd, +0x6f,0xf3,0xe6,0xc2,0x0c,0x80,0x20,0x66,0x00,0x43,0x8e,0x3f,0x99,0xa9,0xf3,0x16,0x53,0x36,0x6c,0x94,0xf1,0xb6,0x7b,0x12,0xf3,0xc1,0x7f,0xb3,0xed,0x32,0x4b,0xba,0x08,0xf1,0x00,0xc8,0x79,0x27,0xec,0x0e,0x77,0xbc,0x5b,0x78,0xeb,0xcb,0xef,0xda,0xd0,0x4e,0x7b,0xb3,0xd9,0xc1,0x32,0xea,0xd3,0x97,0x32,0xf1,0x97,0x8f,0x87,0xbe, +0xf1,0x46,0xcc,0x07,0x3f,0x08,0x1c,0xf3,0x5d,0x89,0x4a,0x00,0x0c,0x0a,0xbb,0xc3,0x8d,0xcb,0x8c,0x3e,0x54,0x15,0x8a,0x8d,0xcb,0x0c,0x3e,0x0b,0x92,0x48,0x70,0xf0,0xd7,0xae,0xe7,0x90,0xeb,0xef,0x08,0x6d,0x05,0x9f,0x0e,0x3a,0xf8,0x01,0x81,0x63,0xbe,0x2b,0x51,0xb9,0x1f,0x36,0xf4,0x4d,0xee,0x36,0x3d,0xdf,0x42,0xa6,0x2d,0x4b, +0xb2,0xb4,0x70,0x6e,0x08,0xa8,0x7f,0xd6,0x4c,0x68,0x25,0x53,0x69,0x0e,0x99,0x7d,0x27,0x23,0xce,0xb8,0xc0,0x48,0x7b,0xf9,0xd0,0xc1,0xff,0xbe,0x48,0x6c,0xec,0x18,0x95,0x19,0x40,0xe8,0x2f,0x46,0xfb,0xce,0x2c,0x0d,0x2b,0x02,0x79,0xc0,0x2a,0x10,0x6d,0xdb,0xb3,0x34,0xae,0xf4,0x3f,0x03,0x28,0x1d,0x30,0x88,0x49,0x77,0x2e,0xd0, +0xc1,0x2f,0x4f,0x03,0xa0,0x13,0x91,0x17,0x63,0xc3,0xdf,0x0b,0x67,0x73,0xcd,0xfa,0x67,0x9b,0xc9,0xfa,0x7c,0x2c,0xa4,0x7c,0xd4,0x81,0x4c,0x7d,0x60,0x09,0xd5,0x47,0x9d,0x68,0xa6,0xa8,0x3c,0xe8,0xe0,0xdf,0x8b,0x06,0x40,0x27,0x22,0xe7,0x43,0xeb,0x17,0x35,0xb3,0x73,0x5d,0xa0,0x0f,0x5b,0x19,0x91,0x6d,0x87,0x37,0x7f,0xbb,0xc3, +0x57,0x1b,0x55,0x13,0xea,0x38,0xe2,0xe1,0xa5,0xf4,0xff,0xd0,0x78,0x43,0x55,0xf5,0x9e,0x0e,0xfe,0x2e,0x45,0xe2,0x1a,0x40,0x54,0x02,0x40,0x24,0x0d,0x33,0x6d,0x59,0x5e,0xbf,0x3f,0xfa,0x3b,0xea,0xac,0x59,0xb0,0x93,0x9d,0xeb,0xfb,0x1e,0x54,0x43,0x3e,0x72,0x2a,0x75,0xf7,0x2f,0x22,0x5d,0x33,0xc2,0x60,0x55,0xbd,0xa3,0x83,0xbf, +0x5b,0x3a,0x03,0xe8,0x44,0xec,0xc5,0xd8,0xf0,0xf7,0x66,0xb6,0xbe,0x16,0xdd,0x6b,0x01,0xed,0x3b,0xb3,0xac,0xf6,0xf1,0xee,0x3f,0xea,0xb3,0x5f,0x60,0xe2,0x6d,0x8f,0x51,0x52,0x11,0xfe,0xae,0x47,0x3a,0xf8,0x7b,0xa4,0x01,0xd0,0x89,0xdc,0x74,0x28,0x0b,0xaf,0xcd,0xdd,0x1e,0xd9,0x63,0x74,0xf5,0xc3,0x3b,0xfa,0x74,0xff,0x7f,0x22, +0x99,0x64,0xcc,0xd7,0x67,0x73,0xc8,0x75,0xbf,0x0c,0xfd,0x63,0x3e,0xd0,0xc1,0xdf,0x0b,0x1a,0x00,0x00,0x8e,0x45,0x05,0x20,0xba,0xd6,0x55,0xe3,0xca,0x56,0x5e,0x9b,0x1b,0xbd,0x53,0x81,0x0d,0x7f,0x6f,0xe6,0x9d,0xc7,0xf2,0x5f,0xfe,0x3d,0x99,0x2e,0x63,0xfc,0x8d,0xf7,0x71,0xe0,0x65,0xdf,0x09,0xa0,0xaa,0x7d,0xd3,0xc1,0xdf,0x2b, +0x65,0x8e,0x45,0xb9,0x74,0x11,0xe2,0x01,0x40,0x44,0x92,0xf0,0x9d,0xf9,0x4d,0xbc,0xf7,0x64,0x74,0x3e,0x15,0xd8,0xb6,0xba,0x8d,0x95,0xb7,0x6e,0xcd,0x7b,0x0c,0xa5,0x06,0x0e,0x66,0xf2,0x5d,0x0b,0x19,0x7e,0xda,0xb9,0xc1,0x14,0xb6,0x0f,0x3a,0xf8,0xf3,0x22,0x7e,0xec,0x6b,0x00,0x74,0xc8,0xc2,0xab,0xb7,0x6f,0xa3,0x71,0xa5,0xfc, +0xf5,0x80,0x96,0xc6,0x0c,0x2f,0xcd,0xd9,0x92,0xf7,0x6d,0xbf,0x15,0xa3,0x6b,0x99,0xfa,0xe0,0x12,0x06,0x1d,0x29,0xb3,0x4d,0xa3,0x0e,0xfe,0xbc,0x89,0x1f,0xfb,0x51,0x08,0x80,0xc8,0xc8,0xb4,0x66,0x59,0x31,0xbb,0x91,0x4d,0xcb,0x8d,0x2f,0xbf,0xde,0x6b,0x4d,0xef,0xb5,0xb3,0xfc,0x07,0x0d,0xec,0xda,0x98,0xdf,0x55,0xff,0xaa,0xc3, +0x8e,0x60,0xea,0x43,0x4b,0xe9,0x77,0xf0,0x21,0x01,0x55,0xd6,0x33,0x1d,0xfc,0x85,0x29,0x0a,0x01,0xd0,0x20,0x5d,0x40,0x67,0x6d,0x4d,0x59,0x56,0xdc,0xd0,0xc8,0xdb,0x7d,0x38,0xf7,0xf6,0x6b,0xf3,0x8b,0x2d,0xfc,0xf3,0x3f,0x36,0xd3,0xb4,0x26,0xbf,0xc1,0x5f,0x33,0xfd,0x74,0xea,0xee,0xfb,0x2b,0xe9,0x21,0xc3,0x02,0xaa,0xac,0x67, +0x3a,0xf8,0xfb,0x4c,0xfc,0xd8,0xd7,0x00,0xe8,0x42,0x36,0x03,0xaf,0xdd,0xbd,0x9d,0x95,0xff,0xb3,0x95,0x4c,0x6b,0x38,0x07,0xf5,0x3b,0xf3,0x9b,0x78,0x71,0x56,0x23,0x6d,0xdb,0xf3,0xeb,0x6f,0xbf,0xf3,0xbe,0xcc,0xe1,0x3f,0xff,0x3d,0x25,0x15,0x32,0x7b,0x07,0xae,0xfb,0xfd,0x3d,0x3a,0xf8,0xfb,0x4e,0xfc,0xd8,0x8f,0xc4,0x93,0x30, +0x8e,0xc5,0x2e,0x84,0x3f,0x09,0xe8,0x4e,0x79,0x4d,0x09,0xb5,0xe7,0xf4,0x67,0xe4,0x09,0xe5,0x81,0xbc,0x5a,0x8d,0x2f,0xb7,0xf2,0xda,0xbd,0xdb,0xd9,0xba,0x2a,0xbf,0x6b,0x0f,0x89,0x64,0x92,0x31,0x57,0xcf,0xe1,0x80,0x4b,0xbf,0x69,0xbe,0xa8,0x3c,0xb4,0x6c,0x5c,0xc7,0xf2,0xcf,0x9d,0x48,0xd3,0x1b,0xaf,0x88,0xd6,0x51,0x80,0x9a, +0x6d,0x57,0xfe,0x53,0x80,0xa8,0x04,0xc0,0x3a,0x60,0xb8,0x74,0x1d,0x3d,0xa9,0x3c,0xb0,0x94,0x31,0x17,0x54,0x32,0xa4,0xce,0xcc,0x7e,0x82,0x3b,0xde,0x6e,0xe3,0xb5,0x7b,0xb7,0xb3,0xe9,0xf9,0x96,0xbc,0x97,0x27,0x4b,0x96,0x95,0x33,0xfe,0xbf,0xee,0x66,0xd8,0x29,0x9f,0x31,0x52,0x8b,0x5f,0x1a,0x02,0x7d,0xb2,0xce,0x76,0x19,0x29, +0x5d,0x44,0x54,0x02,0x60,0x25,0x20,0x73,0xf5,0x2a,0x4f,0xfd,0x46,0x95,0x50,0x73,0x64,0x19,0x43,0xa7,0x95,0x79,0x9b,0x75,0xe6,0xf1,0x0a,0x36,0xad,0x69,0xa7,0xfe,0xd9,0x66,0xea,0x9f,0x6d,0x66,0xdb,0xaa,0xd6,0x3e,0xcd,0x9a,0x4b,0xab,0x06,0x32,0xf1,0xb6,0xc7,0xc4,0xae,0xf4,0x77,0x47,0x43,0x20,0x6f,0x2b,0x6d,0x97,0xf0,0x1f, +0xcc,0xd8,0x43,0x54,0x02,0xe0,0x6f,0xc0,0x31,0xd2,0x75,0xe4,0x2b,0x3d,0x28,0xc9,0xe0,0x89,0x69,0xca,0x6a,0x92,0x94,0x0d,0x2e,0xa1,0xac,0x3a,0x49,0xba,0x3a,0x49,0x32,0x95,0xa0,0x79,0x73,0x3b,0x2d,0x0d,0x19,0x9a,0x37,0x67,0x68,0x6e,0xc8,0xd0,0xf8,0x72,0x0b,0x4d,0x6b,0xfd,0x3d,0x78,0x94,0xaa,0xae,0x61,0xf2,0x9d,0x4f,0x50, +0x35,0xa1,0xce,0xd0,0x6f,0x60,0x96,0x86,0x40,0x5e,0xfe,0x66,0xbb,0x1c,0x27,0x5d,0x44,0x54,0x16,0x04,0x69,0x94,0x2e,0xa0,0x2f,0x5a,0x1a,0x33,0xac,0x5b,0x14,0xce,0xcd,0x43,0x65,0xc3,0x46,0x31,0xf9,0xd7,0x7f,0x16,0x79,0x9a,0xaf,0xb7,0xd2,0x35,0x23,0xa8,0xbb,0xf7,0x29,0x0d,0x81,0xde,0x89,0xc4,0x31,0x1f,0x85,0x4f,0x01,0x20, +0x02,0x57,0x43,0xa3,0xac,0x62,0x74,0x2d,0x75,0xf3,0x16,0x47,0x7a,0xf0,0x77,0xe8,0x08,0x01,0xa9,0xfb,0x11,0x0a,0x48,0x24,0x8e,0x79,0x0d,0x80,0x28,0x4b,0x24,0x18,0x7e,0xea,0x67,0x39,0xe2,0x91,0x65,0x54,0xec,0x7f,0xb0,0x74,0x35,0xbd,0xa6,0x21,0xd0,0x2b,0x91,0x38,0xe6,0x35,0x00,0x22,0x2a,0x35,0x78,0x28,0x87,0xdd,0xf2,0x10, +0x13,0x7e,0xfa,0x20,0xa9,0x41,0x43,0xa4,0xcb,0xc9,0x9b,0x86,0xc0,0x3e,0x45,0xe2,0x98,0x8f,0x4a,0x00,0x44,0xe2,0x7c,0x28,0x2a,0x86,0xce,0x38,0x9b,0xa3,0xe7,0xbf,0xcc,0xb0,0x19,0x9f,0x92,0x2e,0xc5,0x17,0x0d,0x81,0x1e,0x45,0xe2,0x98,0x8f,0x4a,0x00,0xec,0x2f,0x5d,0x80,0xb4,0x44,0x32,0x49,0xcd,0xf4,0x33,0xa8,0x9b,0xb7,0x98, +0xc3,0x7f,0xf6,0x5b,0x52,0x83,0x87,0x4a,0x97,0x64,0x84,0x86,0x40,0xb7,0x22,0x71,0xcc,0x8b,0x7f,0x0c,0xe8,0x58,0x5c,0x83,0xd0,0x1e,0x81,0x51,0x90,0x2c,0x2b,0x67,0xc4,0x99,0x33,0x39,0xe0,0xe2,0xab,0xe9,0x77,0x90,0x25,0x5d,0x4e,0x60,0xf4,0x23,0xc2,0x2e,0x5d,0x93,0xdb,0x19,0x4b,0x8c,0x68,0x00,0x38,0x16,0xd7,0x21,0xb0,0x37, +0xa0,0xb4,0x54,0x75,0x0d,0xd5,0x47,0x9d,0xc8,0xe0,0x63,0x3f,0x4a,0xcd,0x47,0xcf,0x14,0x7b,0x88,0x27,0x6c,0x1a,0x02,0x5d,0xba,0x2e,0xb7,0x47,0xa6,0x08,0xb1,0x00,0x70,0x2c,0x66,0x03,0x32,0x4b,0xd6,0x98,0x92,0x48,0xf4,0xfa,0x21,0x98,0x44,0x49,0x09,0x55,0xe3,0xeb,0xa8,0x3e,0xf6,0xa3,0x54,0x1d,0x3a,0xd9,0xfb,0xd9,0x8e,0x36, +0xf6,0xfc,0xde,0xae,0xfe,0x5a,0xba,0xf8,0x3e,0x12,0x09,0x12,0x25,0x25,0x24,0x52,0x69,0x92,0xa5,0x29,0xef,0x6b,0x2a,0x9d,0xfb,0xba,0xc7,0xbf,0xef,0xf1,0xff,0x25,0x96,0x09,0x03,0x0d,0x81,0x6e,0xcc,0x96,0xda,0x21,0x58,0x24,0x00,0x1c,0x8b,0x9b,0x80,0xab,0x25,0xfa,0x56,0x9e,0x44,0x32,0x49,0xa2,0x53,0x28,0x54,0x1f,0x3d,0x9d, +0x09,0x3f,0x99,0x47,0xa2,0x24,0xf8,0x7b,0xc3,0x34,0x04,0xba,0x74,0x93,0xed,0x12,0xfa,0x93,0x5d,0xa1,0x07,0x80,0x63,0x71,0x0b,0x70,0x45,0xd8,0xfd,0xaa,0x7d,0xab,0xb1,0x3f,0xc1,0xe1,0xb7,0xfe,0x56,0x43,0x40,0xce,0x2d,0xb6,0xcb,0xd7,0xc2,0xec,0x30,0xb4,0x00,0x70,0x2c,0x12,0xc0,0xcf,0x81,0x2f,0x85,0xd5,0xa7,0xca,0x9f,0x86, +0x80,0xb8,0x5f,0x00,0x5f,0xb1,0xdd,0x7c,0x9f,0x11,0xed,0x9b,0x50,0x02,0xc0,0xb1,0x48,0x02,0xbf,0x04,0x2e,0x0d,0xa3,0x3f,0xe5,0x8f,0x86,0x80,0xb8,0x3b,0x80,0xcb,0xc2,0x08,0x81,0xc0,0x03,0x20,0x37,0xf8,0xef,0x02,0x2e,0x0c,0xba,0x2f,0x65,0x8e,0x86,0x80,0xb8,0xb9,0xc0,0x25,0xb6,0x4b,0xfe,0x9b,0x42,0xe4,0x21,0xd0,0x00,0x70, +0x2c,0x4a,0x80,0xbb,0x81,0xf3,0x83,0xec,0x47,0x05,0x43,0x43,0x40,0xdc,0xfd,0xc0,0x85,0xb6,0x4b,0x60,0x1b,0x58,0x06,0x16,0x00,0x8e,0x45,0x29,0xde,0x2f,0x10,0x8d,0x65,0x6b,0x54,0x9f,0x68,0x08,0x88,0xfb,0x0d,0x70,0x81,0xed,0xd2,0x16,0x44,0xe3,0x81,0x04,0x80,0x63,0x91,0x02,0x1e,0x04,0x3e,0x19,0x44,0xfb,0x2a,0x5c,0x1a,0x02, +0xe2,0x1e,0x01,0xce,0xb5,0x5d,0x8c,0x6f,0x5a,0x61,0x3c,0x00,0x1c,0x8b,0x34,0xf0,0x30,0x70,0x86,0xe9,0xb6,0x95,0x1c,0x0d,0x01,0x71,0x8f,0x02,0x9f,0xb1,0x5d,0x8c,0x6e,0x5a,0x61,0x34,0x00,0x1c,0x8b,0x32,0xe0,0x77,0xc0,0xa9,0x26,0xdb,0x55,0xd1,0xa0,0x21,0x20,0x6e,0x3e,0x70,0xb6,0xed,0xd2,0x6c,0xaa,0x41,0x63,0x01,0x90,0xdb, +0xe4,0xf3,0xf7,0xc0,0xc7,0x4c,0xb5,0xa9,0xa2,0x47,0x43,0x40,0xdc,0x42,0xe0,0x4c,0xdb,0x65,0xa7,0x89,0xc6,0x8c,0x04,0x80,0x63,0xd1,0x0f,0xf8,0x03,0x30,0xdd,0x44,0x7b,0x2a,0xda,0x34,0x04,0xc4,0x3d,0x09,0x9c,0x6e,0xbb,0xf8,0xde,0xbe,0xca,0x77,0x00,0x38,0x16,0x95,0x78,0x53,0x93,0x68,0xad,0x53,0xad,0x02,0xa5,0x21,0x20,0x6e, +0x11,0xf0,0x71,0xdb,0xc5,0xd7,0xbe,0xf6,0xbe,0x02,0xc0,0xb1,0x18,0x00,0xfc,0x09,0x38,0xd6,0x4f,0x3b,0xaa,0x30,0x69,0x08,0x88,0x5b,0x02,0x9c,0x62,0xbb,0x6c,0xeb,0x6b,0x03,0x7d,0x0e,0x00,0xc7,0x62,0x20,0xf0,0x04,0x70,0x54,0x5f,0xdb,0x50,0x85,0x4f,0x43,0x40,0xdc,0x3f,0x80,0x19,0xb6,0xcb,0x96,0xbe,0xfc,0xb0,0x9f,0x25,0xc1, +0xc6,0xa0,0x83,0x3f,0xf6,0x36,0x3a,0x8f,0xf2,0xd2,0x57,0x3f,0x45,0xb6,0x3d,0x90,0xfb,0x54,0x3e,0x40,0x97,0x17,0xeb,0xd2,0x51,0x78,0x63,0xb1,0x4f,0xfc,0x9e,0x02,0xb8,0xc0,0x58,0x3f,0x6d,0xa8,0xe2,0xa0,0x33,0x01,0x31,0xae,0xed,0x32,0xae,0xaf,0x3f,0xec,0x77,0x51,0xd0,0xdf,0xf8,0xfc,0x79,0x55,0x24,0x74,0x26,0x20,0xc6,0xd7, +0x18,0xf4,0x1b,0x00,0x0f,0xf8,0xfc,0x79,0x55,0x44,0x34,0x04,0x44,0xf8,0x1a,0x83,0xbe,0x02,0xc0,0x76,0xf9,0x3f,0xe0,0x5f,0x7e,0xda,0x50,0xc5,0x25,0xec,0x10,0x18,0x79,0x56,0xac,0x9f,0x32,0x7f,0xc9,0x76,0x59,0xe9,0xa7,0x01,0x13,0xfb,0x02,0x3c,0x68,0xa0,0x0d,0x55,0x44,0xc2,0x0c,0x81,0x4c,0xab,0xd1,0x5b,0xe3,0x0b,0x8d,0xef, +0xb1,0xa7,0x01,0xa0,0x02,0x11,0x56,0x08,0x64,0x35,0x00,0x7c,0xf1,0x1d,0x00,0xb6,0xcb,0xeb,0xc0,0x3f,0xfd,0xb6,0xa3,0x8a,0x4f,0x18,0x21,0x10,0xe3,0x19,0xc0,0x32,0xdb,0xe5,0x0d,0xbf,0x8d,0x98,0xda,0x1a,0x4c,0x67,0x01,0xaa,0x4b,0x41,0x87,0x40,0xb6,0xd5,0xf8,0x23,0xf2,0x85,0xc2,0xc8,0x98,0x33,0x15,0x00,0xbf,0x81,0x70,0x56, +0x31,0x55,0x85,0x27,0xc8,0x10,0x88,0xe9,0x0c,0x20,0x8b,0xa1,0x8f,0xe0,0x8d,0x04,0x80,0xed,0xf2,0x2e,0xde,0x7d,0xc9,0x4a,0x75,0x29,0xa8,0x10,0x88,0xe9,0x35,0x80,0x67,0x6c,0x97,0x35,0x26,0x1a,0x32,0xb9,0x3b,0xb0,0x9e,0x06,0xa8,0x1e,0x05,0x11,0x02,0x31,0x9d,0x01,0x18,0x1b,0x6b,0x26,0x03,0xe0,0x61,0x08,0x6e,0xf5,0x52,0x55, +0x1c,0x4c,0x87,0x40,0xb6,0x2d,0x76,0xd7,0x00,0xda,0xf1,0xc6,0x9a,0x11,0xc6,0x02,0xc0,0x76,0xd9,0x00,0x3c,0x65,0xaa,0x3d,0x55,0xbc,0x4c,0x86,0x40,0x0c,0x67,0x00,0x4f,0xda,0x2e,0xf5,0xa6,0x1a,0x33,0x39,0x03,0x00,0xb8,0xd3,0x70,0x7b,0xaa,0x48,0x99,0x0a,0x81,0x18,0x5e,0x03,0xb8,0xcb,0x64,0x63,0xa6,0x03,0xe0,0x21,0xe0,0x55, +0xc3,0x6d,0xaa,0x22,0x65,0x22,0x04,0x32,0x2d,0xb1,0x0a,0x80,0x57,0xf1,0xc6,0x98,0x31,0x46,0x03,0x20,0xb7,0x8d,0xd1,0x2c,0x93,0x6d,0xaa,0xe2,0xe6,0x37,0x04,0x62,0x76,0x0d,0xe0,0x7a,0xd3,0x5b,0x85,0x99,0x9e,0x01,0x00,0xcc,0x03,0x56,0x05,0xd0,0xae,0x2a,0x52,0x7e,0x42,0x20,0x46,0xa7,0x00,0xab,0x08,0xe0,0xe9,0x5b,0xe3,0x01, +0x90,0xdb,0xc7,0x4c,0x67,0x01,0x2a,0x2f,0x7d,0x0d,0x81,0x18,0x5d,0x04,0xbc,0x3e,0x88,0x3d,0x02,0x83,0x98,0x01,0x80,0xb7,0x27,0xe0,0xeb,0x01,0xb5,0xad,0x8a,0x54,0x5f,0x42,0x20,0x26,0x01,0xf0,0x3a,0xde,0x98,0x32,0x2e,0x90,0x00,0xc8,0x6d,0x64,0x38,0x3b,0x88,0xb6,0x55,0x71,0xcb,0x37,0x04,0x62,0x72,0x0a,0x30,0x2b,0xa8,0x1d, +0x82,0x83,0x9a,0x01,0x00,0xdc,0x03,0xac,0x0e,0xb0,0x7d,0x55,0xa4,0xf2,0x09,0x81,0x18,0x3c,0x0c,0xf4,0x06,0x70,0x6f,0x50,0x8d,0x07,0x16,0x00,0x3a,0x0b,0x50,0x7e,0xf4,0x36,0x04,0x62,0x70,0x0a,0x30,0x3b,0xa8,0xad,0xc1,0x21,0xd8,0x19,0x00,0xc0,0xdd,0xc0,0x5b,0x01,0xf7,0xa1,0x8a,0x54,0x6f,0x42,0xa0,0xc8,0x03,0xe0,0x4d,0xbc, +0x99,0x74,0x60,0x02,0x0d,0x80,0xdc,0x7e,0xe6,0x37,0x04,0xd9,0x87,0x2a,0x6e,0xfb,0x0a,0x81,0x22,0xbf,0x06,0x70,0x43,0x6e,0x0c,0x05,0x26,0xe8,0x19,0x00,0xc0,0xaf,0x81,0x77,0x42,0xe8,0x47,0x15,0xa9,0x9e,0x42,0xa0,0x88,0x6f,0x04,0x7a,0x1b,0x6f,0xec,0x04,0x2a,0xf0,0x00,0xb0,0x5d,0x5a,0x80,0x39,0x41,0xf7,0xa3,0x8a,0x5b,0x77, +0x21,0x50,0xc4,0xa7,0x00,0x73,0x82,0x7e,0xf7,0x87,0x70,0x66,0x00,0xe0,0x3d,0x24,0xa4,0xb3,0x00,0xe5,0x4b,0x57,0x21,0x50,0xa4,0x33,0x80,0x77,0x08,0xe9,0xc1,0xba,0x50,0x02,0xc0,0x76,0x69,0x06,0xbe,0x1c,0x46,0x5f,0xaa,0xb8,0x75,0x0e,0x81,0x6c,0x7b,0x3b,0xd9,0xf6,0xa2,0x5c,0x82,0xe2,0x4b,0xb9,0x99,0x73,0xe0,0xc2,0x9a,0x01, +0x60,0xbb,0x3c,0x4e,0x80,0x9f,0x67,0xaa,0xf8,0xe8,0x08,0x81,0xf6,0x9d,0x3b,0xa4,0x4b,0x09,0xc2,0x3d,0xb6,0xcb,0xfc,0xb0,0x3a,0xf3,0xb5,0x39,0x68,0xbe,0x1c,0x8b,0x6a,0xe0,0x65,0x60,0x64,0x98,0xfd,0xaa,0xe2,0x34,0xf8,0xb8,0x93,0xd8,0xbc,0xe4,0xcf,0xd2,0x65,0x98,0xb4,0x16,0x98,0x60,0xbb,0x34,0x86,0xd5,0x61,0xa8,0x01,0x00, +0xe0,0x58,0x9c,0x06,0xfc,0x21,0xec,0x7e,0x95,0x2a,0x00,0xa7,0xe7,0x66,0xca,0xa1,0x09,0xed,0x14,0xa0,0x83,0x9e,0x0a,0x28,0xd5,0xa5,0x7b,0xc2,0x1e,0xfc,0x20,0x10,0x00,0x39,0x57,0x02,0xef,0x09,0xf5,0xad,0x54,0xd4,0xac,0xc5,0x1b,0x13,0xa1,0x13,0x09,0x00,0xdb,0xa5,0x01,0xf8,0x82,0x44,0xdf,0x4a,0x45,0xd0,0x65,0x61,0x9e,0xf7, +0x77,0x26,0x35,0x03,0xd0,0x53,0x01,0xa5,0x3c,0x22,0x53,0xff,0x0e,0x62,0x01,0x90,0xa3,0xa7,0x02,0x2a,0xce,0xc4,0xa6,0xfe,0x1d,0x44,0x03,0x20,0x77,0x2a,0x70,0x99,0x64,0x0d,0x4a,0x09,0x12,0x9b,0xfa,0x77,0x90,0x9e,0x01,0x60,0xbb,0xfc,0x01,0xb8,0x4f,0xba,0x0e,0xa5,0x42,0x76,0xaf,0xe4,0xd4,0xbf,0x83,0x78,0x00,0xe4,0x5c,0x81, +0x9e,0x0a,0xa8,0xf8,0x78,0x0f,0xe1,0xa9,0x7f,0x87,0x48,0x04,0x40,0xee,0x54,0x60,0x26,0x04,0xb7,0xf2,0x89,0x52,0x11,0xd1,0x06,0xcc,0xcc,0x1d,0xf3,0xe2,0x22,0x11,0x00,0x00,0xb6,0xcb,0x5f,0x80,0x2f,0x49,0xd7,0xa1,0x54,0xc0,0xbe,0x98,0x3b,0xd6,0x23,0x21,0x32,0x01,0x00,0x60,0xbb,0xfc,0x0a,0x5d,0x47,0x50,0x15,0xaf,0x59,0xb6, +0x1b,0xad,0xfd,0x33,0x23,0x15,0x00,0x39,0xdf,0xc7,0xdb,0x5d,0x48,0xa9,0x62,0x72,0xbf,0xed,0xf2,0x7d,0xe9,0x22,0xf6,0x14,0xb9,0x00,0xb0,0x5d,0xb2,0xc0,0xc5,0xc0,0x22,0xa1,0x12,0xb6,0x00,0xbf,0x03,0x5e,0x10,0xea,0x5f,0x99,0xf7,0x02,0xde,0xdf,0xe9,0x16,0xa1,0xfe,0xff,0x8a,0x77,0x4c,0x47,0x4e,0xe4,0x02,0x00,0xde,0x5f,0x40, +0xe4,0x4c,0xe0,0x95,0x10,0xba,0xcb,0x02,0xff,0xc4,0xdb,0xce,0xec,0x78,0xa0,0xc6,0x76,0x39,0x1b,0x98,0x06,0x5c,0x0b,0xc1,0x2f,0xcb,0xa4,0x02,0xd3,0x0a,0xfc,0x10,0x38,0x32,0xf7,0x77,0x5a,0x83,0xf7,0x77,0x3c,0x0b,0xef,0xef,0x3c,0x1b,0x42,0x0d,0xaf,0x00,0x67,0x85,0xb5,0xc0,0x47,0xbe,0x42,0x7f,0x1c,0x38,0x1f,0x8e,0x45,0x2d, +0xb0,0x14,0x18,0x66,0xb8,0xe9,0xf5,0xc0,0x13,0xb9,0x3f,0x0b,0x6d,0x97,0x8d,0x3d,0xd4,0x30,0x19,0x98,0x0b,0x4c,0x32,0x5c,0x83,0x0a,0xd6,0x0b,0xc0,0x45,0xb6,0xcb,0x8b,0xdd,0x7d,0x83,0x63,0x31,0x14,0x38,0x09,0x38,0x19,0xf8,0x18,0x30,0xdc,0x70,0x0d,0xeb,0x81,0xa3,0x6d,0x97,0x37,0x0d,0xb7,0x6b,0x4c,0xa4,0x03,0x00,0xc0,0xb1, +0x98,0x06,0x3c,0x05,0xf4,0xf3,0xd1,0x4c,0x2b,0xb0,0x04,0x6f,0xc0,0x2f,0x00,0x5e,0xcc,0x9d,0x6a,0xf4,0xb6,0x86,0x14,0xf0,0x3d,0xe0,0xbb,0x40,0xca,0x47,0x1d,0x2a,0x78,0xad,0x78,0xef,0xf0,0xb3,0xf3,0x59,0x54,0xd3,0xb1,0x48,0x00,0x93,0x81,0x19,0x78,0x81,0x70,0x2c,0xfe,0xfe,0xae,0x9b,0x80,0x13,0x6c,0x97,0x65,0x3e,0xda,0x08, +0x5c,0xe4,0x03,0x00,0xc0,0xb1,0xf8,0x04,0xde,0x39,0x5c,0x3e,0xa7,0x2c,0x6f,0xb0,0x7b,0xc0,0x3f,0x65,0xbb,0x6c,0x33,0x50,0xc7,0x64,0xbc,0xcd,0x4e,0x26,0xfa,0x6d,0x4b,0x05,0xe2,0x45,0xbc,0x77,0x7d,0xdf,0xd7,0x6f,0x1c,0x8b,0x2a,0x60,0x3a,0x5e,0x20,0xcc,0x00,0x0e,0xce,0xe3,0xc7,0x33,0x78,0xd3,0xfe,0xc7,0xfc,0xd6,0x11,0xb4, +0x82,0x08,0x00,0x00,0xc7,0xe2,0x4a,0xe0,0xe6,0x1e,0xbe,0x65,0x07,0xf0,0x34,0xde,0x80,0x7f,0xc2,0x76,0x59,0x15,0x50,0x1d,0x29,0xbc,0x4f,0x2a,0xbe,0x0b,0x94,0x06,0xd1,0x87,0xca,0x5b,0xc7,0x36,0x74,0xd7,0x07,0xb5,0x94,0xb6,0x63,0x31,0x96,0xdd,0xb3,0x83,0x13,0x80,0xfe,0x3d,0x7c,0xfb,0x15,0xb6,0xcb,0xad,0x41,0xd4,0x61,0x5a, +0xc1,0x04,0x00,0x80,0x63,0x71,0x33,0x1f,0xbc,0x85,0xf2,0x25,0x72,0x03,0x1e,0x58,0x1c,0xe6,0x85,0x16,0xc7,0xa2,0x0e,0xef,0xda,0xc0,0xe1,0x61,0xf5,0xa9,0xba,0xb4,0x02,0xef,0x5d,0xff,0xf9,0xb0,0x3a,0x74,0x2c,0xd2,0x78,0x17,0x13,0x3b,0x02,0xa1,0xf3,0x31,0x70,0xb3,0xed,0x72,0x55,0x58,0xb5,0xf8,0x55,0x68,0x01,0x90,0xc4,0xbb, +0x32,0xbf,0x1a,0xef,0x5d,0x7e,0xad,0x70,0x3d,0x69,0xe0,0x9b,0xc0,0xd5,0x40,0xb5,0x64,0x2d,0x31,0xd4,0x00,0xdc,0x04,0xdc,0x18,0xc6,0x06,0x1a,0x3d,0x71,0x2c,0x46,0xe1,0x85,0x41,0x2d,0x70,0xad,0xed,0x92,0x91,0xac,0x27,0x1f,0x05,0x15,0x00,0x51,0xe5,0x58,0x0c,0x00,0xbe,0x0a,0x5c,0x05,0x0c,0x11,0x2e,0xa7,0xd8,0x6d,0x02,0x7e, +0x0a,0xdc,0x6a,0xbb,0x6c,0x95,0x2e,0xa6,0xd0,0x69,0x00,0x18,0xe4,0x58,0x54,0x02,0x97,0xe3,0xcd,0x08,0x86,0x0a,0x97,0x53,0x6c,0xea,0x81,0x1f,0x03,0x3f,0xb7,0x5d,0xb6,0x4b,0x17,0x53,0x2c,0x34,0x00,0x02,0xe0,0x58,0xf4,0xc7,0x7b,0xb0,0xe9,0x1b,0x98,0xff,0x6c,0x39,0x6e,0xd6,0x03,0x37,0x02,0xb7,0xd9,0x2e,0x4d,0xd2,0xc5,0x14, +0x1b,0x0d,0x80,0x00,0x39,0x16,0x15,0x78,0x2b,0x1e,0x7d,0x0b,0xdd,0x0c,0x25,0x5f,0xef,0x01,0xff,0x0d,0xfc,0xd2,0x76,0xd9,0x29,0x5d,0x4c,0xb1,0xd2,0x00,0x08,0x81,0x63,0x51,0x0e,0xfc,0x3b,0xf0,0x6d,0x60,0x3f,0xe1,0x72,0xa2,0x6e,0x0d,0xde,0x6e,0xd2,0xbf,0xb2,0x5d,0x76,0x49,0x17,0x53,0xec,0x34,0x00,0x42,0xe4,0x58,0x7c,0x1c, +0xe4,0x97,0x81,0x8a,0xb8,0x8f,0xdb,0x2e,0x7f,0x94,0x2e,0x22,0x2e,0x22,0xf9,0x30,0x50,0x11,0x5b,0x84,0xae,0x7a,0xd4,0x93,0x36,0x60,0xb1,0x74,0x11,0x71,0xa2,0x01,0x10,0xa2,0xdc,0xed,0xc8,0xcf,0x49,0xd7,0x11,0x61,0xff,0x34,0x71,0xcb,0xb6,0xea,0x3d,0x0d,0x80,0xf0,0x3d,0x29,0x5d,0x40,0x84,0xe9,0x6b,0x13,0x32,0x0d,0x80,0xf0, +0xe9,0x41,0xde,0x3d,0x7d,0x6d,0x42,0xa6,0x01,0x10,0xbe,0x25,0x10,0xcd,0xc5,0x21,0x84,0x35,0x03,0x7f,0x93,0x2e,0x22,0x6e,0x34,0x00,0x42,0x96,0xfb,0x4c,0x7b,0xa9,0x74,0x1d,0x11,0xb4,0x54,0x3f,0xef,0x0f,0x9f,0x06,0x80,0x0c,0x9d,0xea,0xee,0x4d,0x5f,0x13,0x01,0x1a,0x00,0x32,0xf4,0x60,0xdf,0x9b,0xbe,0x26,0x02,0x34,0x00,0x64, +0xfc,0x03,0xf4,0xbe,0xf6,0x4e,0x9a,0xf0,0x5e,0x13,0x15,0x32,0x0d,0x00,0x01,0xb9,0x85,0x4b,0x96,0x48,0xd7,0x11,0x21,0xcf,0x48,0x3f,0xd3,0x1f,0x57,0x1a,0x00,0x72,0x74,0xca,0xbb,0x9b,0xbe,0x16,0x42,0x34,0x00,0xe4,0xe8,0x41,0xbf,0x9b,0xbe,0x16,0x42,0x34,0x00,0xe4,0x3c,0x07,0xba,0xa2,0x0d,0xde,0x6e,0x3d,0xcb,0xa5,0x8b,0x88, +0x2b,0x0d,0x00,0x21,0xb6,0x4b,0x3b,0x72,0xdb,0x9f,0x45,0xc9,0xa2,0xdc,0x6b,0xa1,0x04,0x68,0x00,0xc8,0xd2,0xa9,0xaf,0xbe,0x06,0xa2,0x34,0x00,0x64,0xe9,0xc1,0xaf,0xaf,0x81,0x28,0x0d,0x00,0x59,0x2b,0xf0,0x56,0xb9,0x8d,0xab,0x8d,0x78,0x7b,0x3b,0x28,0x21,0x1a,0x00,0x82,0x72,0xfb,0x13,0x3e,0x2d,0x5d,0x87,0xa0,0xa7,0xf3,0xd9, +0xa3,0x51,0x99,0xa7,0x01,0x20,0x2f,0xce,0x53,0xe0,0x38,0xff,0xee,0x91,0xa0,0x01,0x20,0x2f,0xce,0x83,0x20,0xce,0xbf,0x7b,0x24,0xe8,0xa2,0xa0,0x11,0xe0,0x58,0xac,0x25,0x7e,0xcb,0x86,0xaf,0xb5,0x5d,0x5d,0x21,0x59,0x9a,0xce,0x00,0xa2,0xe1,0x29,0xe9,0x02,0x04,0xc4,0xf1,0x77,0x8e,0x1c,0x0d,0x80,0x68,0x88,0xe3,0x54,0x38,0x8e, +0xbf,0x73,0xe4,0x68,0x00,0x44,0x43,0x1c,0x07,0x83,0x23,0x5d,0x80,0xd2,0x00,0x88,0x04,0xdb,0x65,0x35,0xf0,0x28,0xde,0x7d,0xf1,0xc5,0xae,0x11,0x78,0xd4,0x76,0x79,0x4b,0xba,0x10,0xa5,0x17,0x01,0x23,0xc5,0xb1,0x48,0xe0,0xed,0x31,0x5f,0xb7,0xc7,0x9f,0x42,0xdd,0x69,0x78,0x03,0xf0,0x3c,0xde,0xc3,0x3e,0xcb,0x81,0xe5,0xb6,0xcb, +0x1b,0xb2,0x25,0xa9,0xce,0x34,0x00,0x0a,0x80,0x63,0x31,0x1a,0x2f,0x08,0xa6,0xb0,0x3b,0x14,0x46,0x8b,0x16,0xb5,0xb7,0x77,0xe9,0x34,0xd0,0xf1,0x06,0xfb,0x1a,0xd9,0x92,0xd4,0xbe,0x68,0x00,0x14,0x28,0xc7,0x62,0x28,0xbb,0xc3,0xa0,0x16,0x18,0x94,0xfb,0x53,0xdd,0xe9,0xeb,0x40,0xa0,0xd4,0x67,0x57,0x6d,0x78,0xa7,0x26,0x0d,0x78, +0xd3,0xf7,0x8e,0xaf,0x8d,0xc0,0x6a,0x76,0x0f,0xf6,0x7a,0x9f,0xfd,0x28,0x01,0x1a,0x00,0x45,0xce,0xb1,0xa8,0xe4,0x83,0xa1,0xb0,0x67,0x50,0xc0,0xde,0x03,0xfb,0xfd,0xc1,0x6e,0xbb,0x6c,0x0f,0xbb,0x66,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29, +0xd5,0x1b,0xff,0x0f,0x5c,0x56,0xd9,0x0b,0x64,0x90,0x3b,0x82,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, +}; + +read_only global String8 rd_icon_file_bytes = {rd_icon_file_bytes__data, sizeof(rd_icon_file_bytes__data)}; + +C_LINKAGE_END + +#endif // RADDBG_META_H From 5e2ae50214e8557b5b3d6417b1318a9b2d6b7d1d Mon Sep 17 00:00:00 2001 From: Martins Mozeiko Date: Wed, 20 May 2026 13:05:05 -0700 Subject: [PATCH 671/850] cleanup atomic wrappers * use iso_volatile_load for just a load of u64/u32 from memory on msvc * use intrin.h _interlocked* intrinsics instead of defines from windows.h * use better suited fetch_xyz instead of xyz_fetch ones on gcc/clang --- src/base/base_core.h | 46 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index 01e56b26..73d265c5 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -252,42 +252,42 @@ #if COMPILER_MSVC # include # if ARCH_X64 -# define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)InterlockedCompareExchange128((__int64 *)(x), ((__int64 *)&(k))[1], ((__int64 *)&(k))[0], (__int64 *)c) -# define ins_atomic_u64_eval(x) InterlockedAdd64((__int64 *)(x), 0) -# define ins_atomic_u64_inc_eval(x) InterlockedIncrement64((__int64 *)(x)) -# define ins_atomic_u64_dec_eval(x) InterlockedDecrement64((__int64 *)(x)) -# define ins_atomic_u64_eval_assign(x,c) InterlockedExchange64((__int64 *)(x),(c)) -# define ins_atomic_u64_add_eval(x,c) InterlockedAdd64((__int64 *)(x), c) -# define ins_atomic_u64_eval_cond_assign(x,k,c) InterlockedCompareExchange64((__int64 *)(x),(k),(c)) -# define ins_atomic_u32_eval(x) InterlockedAdd((LONG *)(x), 0) -# define ins_atomic_u32_inc_eval(x) InterlockedIncrement((LONG *)(x)) -# define ins_atomic_u32_dec_eval(x) InterlockedDecrement((LONG *)(x)) -# define ins_atomic_u32_eval_assign(x,c) InterlockedExchange((LONG *)(x),(c)) -# define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((LONG *)(x),(k),(c)) -# define ins_atomic_u32_add_eval(x,c) InterlockedAdd((LONG *)(x), (c)) -# define ins_atomic_u8_eval_assign(x,c) InterlockedExchange8((CHAR *)(x), (c)) -# define ins_atomic_u8_or(x,c) InterlockedOr8((char *)(x), (char)c) -# define ins_atomic_u32_or(x,c) InterlockedOr((LONG *)(x), (LONG)c) +# define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)_InterlockedCompareExchange128((__int64 *)(x), ((__int64 *)&(k))[1], ((__int64 *)&(k))[0], (__int64 *)(c)) +# define ins_atomic_u64_eval(x) (U64)__iso_volatile_load64((__int64*)(x)) +# define ins_atomic_u64_inc_eval(x) _InterlockedIncrement64((__int64 *)(x)) +# define ins_atomic_u64_dec_eval(x) _InterlockedDecrement64((__int64 *)(x)) +# define ins_atomic_u64_eval_assign(x,c) _InterlockedExchange64((__int64 *)(x), (c)) +# define ins_atomic_u64_add_eval(x,c) _interlockedadd64((__int64 *)(x), (c)) +# define ins_atomic_u64_eval_cond_assign(x,k,c) _InterlockedCompareExchange64((__int64 *)(x), (k), (c)) +# define ins_atomic_u32_eval(x) (U32)__iso_volatile_load32((__int32*)(x)) +# define ins_atomic_u32_inc_eval(x) _InterlockedIncrement((long *)(x)) +# define ins_atomic_u32_dec_eval(x) _InterlockedDecrement((long *)(x)) +# define ins_atomic_u32_eval_assign(x,c) _InterlockedExchange((long *)(x), (c)) +# define ins_atomic_u32_eval_cond_assign(x,k,c) _InterlockedCompareExchange((long *)(x), (k), (c)) +# define ins_atomic_u32_add_eval(x,c) _interlockedadd((long *)(x), (c)) +# define ins_atomic_u8_eval_assign(x,c) _InterlockedExchange8((char *)(x), (char)(c)) +# define ins_atomic_u8_or(x,c) _InterlockedOr8((char *)(x), (char)(c)) +# define ins_atomic_u32_or(x,c) _InterlockedOr((long *)(x), (long)(c)) # else # error Atomic intrinsics not defined for this compiler / architecture combination. # endif #elif COMPILER_CLANG || COMPILER_GCC # define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)__atomic_compare_exchange_n((__int128 *)(x),(__int128 *)(c),*(__int128 *)(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST) # define ins_atomic_u64_eval(x) __atomic_load_n((U64 *)(x), __ATOMIC_SEQ_CST) -# define ins_atomic_u64_inc_eval(x) (__atomic_fetch_add((U64 *)(x), 1, __ATOMIC_SEQ_CST) + 1) -# define ins_atomic_u64_dec_eval(x) (__atomic_fetch_sub((U64 *)(x), 1, __ATOMIC_SEQ_CST) - 1) +# define ins_atomic_u64_inc_eval(x) __atomic_add_fetch((U64 *)(x), 1, __ATOMIC_SEQ_CST) +# define ins_atomic_u64_dec_eval(x) __atomic_sub_fetch((U64 *)(x), 1, __ATOMIC_SEQ_CST) # define ins_atomic_u64_eval_assign(x,c) __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST) -# define ins_atomic_u64_add_eval(x,c) (__atomic_fetch_add((U64 *)(x), c, __ATOMIC_SEQ_CST) + (c)) +# define ins_atomic_u64_add_eval(x,c) __atomic_add_fetch((U64 *)(x), c, __ATOMIC_SEQ_CST) # define ins_atomic_u64_eval_cond_assign(x,k,c) ({ U64 _new = (c); __atomic_compare_exchange_n((U64 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) # define ins_atomic_u32_eval(x) __atomic_load_n(x, __ATOMIC_SEQ_CST) -# define ins_atomic_u32_inc_eval(x) (__atomic_fetch_add((U32 *)(x), 1, __ATOMIC_SEQ_CST) + 1) -# define ins_atomic_u32_dec_eval(x) (__atomic_fetch_sub((U32 *)(x), 1, __ATOMIC_SEQ_CST) - 1) -# define ins_atomic_u32_add_eval(x,c) (__atomic_fetch_add((U32 *)(x), c, __ATOMIC_SEQ_CST) + (c)) +# define ins_atomic_u32_inc_eval(x) __atomic_add_fetch((U32 *)(x), 1, __ATOMIC_SEQ_CST) +# define ins_atomic_u32_dec_eval(x) __atomic_sub_fetch((U32 *)(x), 1, __ATOMIC_SEQ_CST) +# define ins_atomic_u32_add_eval(x,c) __atomic_add_fetch((U32 *)(x), c, __ATOMIC_SEQ_CST) # define ins_atomic_u32_eval_assign(x,c) __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST) # define ins_atomic_u32_eval_cond_assign(x,k,c) ({ U32 _new = (c); __atomic_compare_exchange_n((U32 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; }) # define ins_atomic_u8_eval_assign(x,c) __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST) # define ins_atomic_u8_or(x,c) __atomic_fetch_or((U8 *)(x), (U8)(c), __ATOMIC_SEQ_CST) -# define ins_atomic_u32_or(x,c) __atomic_fetch_or((U32 *)(x), (U32)(c), __ATOMIC_SEQ_CST) +# define ins_atomic_u32_or(x,c) __atomic_fetch_or((U32 *)(x), (U32)(c), __ATOMIC_SEQ_CST) #else # error Atomic intrinsics not defined for this compiler / architecture. #endif From a72d284058d2022083129db430b16e769d0094c9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 20 May 2026 14:43:56 -0700 Subject: [PATCH 672/850] more aggressively use scratch & limit temporary allocations in rdi baker --- src/rdi_make/rdi_make_local.c | 228 +++++++++++++++++++--------------- 1 file changed, 126 insertions(+), 102 deletions(-) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 638e456f..838d217d 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -387,11 +387,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 scope_vmap_records_count = 0; ProfScope("gather unsorted scope vmap records") { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + //- rjf: calculate per-lane-chunk counts U64 *lane_chunk_range_counts = 0; if(lane_idx() == 0) { - lane_chunk_range_counts = push_array(scratch.arena, U64, all_scopes->chunk_count * lane_count()); + lane_chunk_range_counts = push_array(scratch2.arena, U64, all_scopes->chunk_count * lane_count()); } lane_sync_u64(&lane_chunk_range_counts, 0); { @@ -414,7 +416,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 total_range_count = 0; if(lane_idx() == 0) { - lane_chunk_range_offs = push_array(scratch.arena, U64, all_scopes->chunk_count * lane_count()); + lane_chunk_range_offs = push_array(scratch2.arena, U64, all_scopes->chunk_count * lane_count()); U64 off = 0; U64 chunk_idx = 0; for EachNode(n, RDIM_ScopeChunkNode, all_scopes->first) @@ -463,8 +465,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) chunk_idx += 1; } } + lane_sync(); + scratch_end(scratch2); } - lane_sync(); //////////////////////////// //- rjf: gather unsorted global vmap records @@ -473,11 +476,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 global_vmap_records_count = 0; ProfScope("gather unsorted global vmap records") { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + //- rjf: calculate per-lane-chunk counts U64 *lane_chunk_range_counts = 0; if(lane_idx() == 0) { - lane_chunk_range_counts = push_array(scratch.arena, U64, all_global_variables->chunk_count * lane_count()); + lane_chunk_range_counts = push_array(scratch2.arena, U64, all_global_variables->chunk_count * lane_count()); } lane_sync_u64(&lane_chunk_range_counts, 0); { @@ -504,7 +509,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 total_range_count = 0; if(lane_idx() == 0) { - lane_chunk_range_offs = push_array(scratch.arena, U64, all_global_variables->chunk_count * lane_count()); + lane_chunk_range_offs = push_array(scratch2.arena, U64, all_global_variables->chunk_count * lane_count()); U64 off = 0; U64 chunk_idx = 0; for EachNode(n, RDIM_SymbolChunkNode, all_global_variables->first) @@ -556,8 +561,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) chunk_idx += 1; } } + lane_sync(); + scratch_end(scratch2); } - lane_sync(); //////////////////////////// //- rjf: gather unsorted unit vmap records @@ -566,6 +572,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U64 unit_vmap_records_count = 0; ProfScope("gather unsorted unit vmap records") { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + //- rjf: calculate per-lane-chunk counts U64 *lane_chunk_range_counts = 0; if(lane_idx() == 0) @@ -645,8 +653,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) chunk_idx += 1; } } + + lane_sync(); + scratch_end(scratch2); } - lane_sync(); //////////////////////////// //- rjf: sort & bake all vmaps @@ -677,6 +687,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // ProfScope("sort") { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + //- rjf: set up constants U64 bytes_per_digit = 1; U64 num_possible_values_per_digit = 1<<(bytes_per_digit*8); @@ -688,15 +700,15 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) U32 **lane_digit_offs = 0; if(lane_idx() == 0) { - records__swap = push_array_no_zero(scratch.arena, VMapRecord, records_count); - lane_digit_counts = push_array_no_zero(scratch.arena, U32 *, lane_count()); - lane_digit_offs = push_array_no_zero(scratch.arena, U32 *, lane_count()); + records__swap = push_array_no_zero(scratch2.arena, VMapRecord, records_count); + lane_digit_counts = push_array_no_zero(scratch2.arena, U32 *, lane_count()); + lane_digit_offs = push_array_no_zero(scratch2.arena, U32 *, lane_count()); } lane_sync_u64(&records__swap, 0); lane_sync_u64(&lane_digit_counts, 0); lane_sync_u64(&lane_digit_offs, 0); - lane_digit_counts[lane_idx()] = push_array_no_zero(scratch.arena, U32, num_possible_values_per_digit); - lane_digit_offs[lane_idx()] = push_array_no_zero(scratch.arena, U32, num_possible_values_per_digit); + lane_digit_counts[lane_idx()] = push_array_no_zero(scratch2.arena, U32, num_possible_values_per_digit); + lane_digit_offs[lane_idx()] = push_array_no_zero(scratch2.arena, U32, num_possible_values_per_digit); //- rjf: do all sort passes { @@ -769,8 +781,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Swap(VMapRecord *, src, dst); } } + + lane_sync(); + scratch_end(scratch2); } - lane_sync(); //////////////////////// //- rjf: bake @@ -789,6 +803,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: bake if(lane_idx() == 0) { + Temp scratch2 = scratch_begin(&scratch.arena, 1); typedef struct RangeNode RangeNode; struct RangeNode { @@ -847,7 +862,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } else { - r = push_array(scratch.arena, RangeNode, 1); + r = push_array(scratch2.arena, RangeNode, 1); } SLLStackPush(top_range, r); r->voff_range = voff_range; @@ -866,6 +881,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) vmap_ptr += 1; } vmap_count = (vmap_ptr - vmap); + scratch_end(scratch2); } lane_sync_u64(&vmap_count, 0); } @@ -893,8 +909,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) ProfScope("build interned path tree") { //- rjf: set up tree - path_tree = rdim_push_array(arena, RDIM_BakePathTree, 1); - rdim_bake_path_tree_insert(arena, path_tree, rdim_str8_lit("")); + path_tree = rdim_push_array(scratch.arena, RDIM_BakePathTree, 1); + rdim_bake_path_tree_insert(scratch.arena, path_tree, rdim_str8_lit("")); //- rjf: bake unit file paths RDIM_ProfScope("bake unit file paths") @@ -903,10 +919,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].source_file); - rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].object_file); - rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].archive_file); - rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].build_path); + rdim_bake_path_tree_insert(scratch.arena, path_tree, n->v[idx].source_file); + rdim_bake_path_tree_insert(scratch.arena, path_tree, n->v[idx].object_file); + rdim_bake_path_tree_insert(scratch.arena, path_tree, n->v[idx].archive_file); + rdim_bake_path_tree_insert(scratch.arena, path_tree, n->v[idx].build_path); } } } @@ -918,7 +934,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for(RDI_U64 idx = 0; idx < n->count; idx += 1) { - RDIM_BakePathNode *node = rdim_bake_path_tree_insert(arena, path_tree, n->v[idx].path); + RDIM_BakePathNode *node = rdim_bake_path_tree_insert(scratch.arena, path_tree, n->v[idx].path); node->src_file = &n->v[idx]; } } @@ -955,7 +971,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) { line_tables_count = params->line_tables.total_count; - src_line_tables = push_array(arena, RDIM_LineTable *, line_tables_count); + src_line_tables = push_array(scratch.arena, RDIM_LineTable *, line_tables_count); ProfScope("flatten chunk list") { U64 joined_idx = 0; @@ -983,11 +999,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { if(lane_idx() == lane_from_task_idx(0)) { - unsorted_joined_line_tables = push_array(arena, RDIM_UnsortedJoinedLineTable, line_tables_count); + unsorted_joined_line_tables = push_array(scratch.arena, RDIM_UnsortedJoinedLineTable, line_tables_count); } if(lane_idx() == lane_from_task_idx(1)) { - sorted_line_table_keys = push_array(arena, RDIM_SortKey *, line_tables_count); + sorted_line_table_keys = push_array(scratch.arena, RDIM_SortKey *, line_tables_count); } if(lane_idx() == lane_from_task_idx(2)) { @@ -1031,7 +1047,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: wide bake ProfScope("wide bake") { - U64 *line_table_block_take_counter = push_array(scratch.arena, U64, 1); + U64 line_table_block_take_counter_ = 0; + U64 *line_table_block_take_counter = &line_table_block_take_counter_; lane_sync_u64(&line_table_block_take_counter, 0); U64 line_table_block_size = 4096; U64 line_table_block_count = (line_tables_count + line_table_block_size - 1) / line_table_block_size; @@ -1118,6 +1135,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } + lane_sync(); } } lane_sync(); @@ -1164,15 +1182,15 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: push small top-level strings if(lane_idx() == 0) ProfScope("push small top-level strings") { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, params->top_level_info.exe_name); - rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, params->top_level_info.producer_name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 1, params->top_level_info.exe_name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 1, params->top_level_info.producer_name); for(RDIM_BinarySectionNode *n = params->binary_sections.first; n != 0; n = n->next) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, n->v.name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 1, n->v.name); } for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, n->name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 1, n->name); } } @@ -1184,8 +1202,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - RDIM_String8 normalized_path = rdim_normalize_path_str8(arena, n->v[n_idx].path); - rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, normalized_path); + RDIM_String8 normalized_path = rdim_normalize_path_str8(scratch.arena, n->v[n_idx].path); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 1, normalized_path); } } } @@ -1198,12 +1216,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].unit_name); - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].compiler_name); - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].source_file); - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].object_file); - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].archive_file); - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].build_path); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].unit_name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].compiler_name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].source_file); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].object_file); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].archive_file); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].build_path); } } } @@ -1216,7 +1234,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].name); } } } @@ -1229,7 +1247,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].name); } } } @@ -1244,11 +1262,11 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for EachNode(mem, RDIM_UDTMember, n->v[idx].first_member) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, mem->name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, mem->name); } for EachNode(enum_val, RDIM_UDTEnumVal, n->v[idx].first_enum_val) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, enum_val->name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, enum_val->name); } } } @@ -1271,8 +1289,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].name); - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].link_name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].link_name); } } } @@ -1286,7 +1304,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, n->v[n_idx].name); } } } @@ -1303,7 +1321,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { for EachIndex(local_n_idx, local_n->count) { - rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, local_n->v[local_n_idx].name); + rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 4, local_n->v[local_n_idx].name); } } } @@ -1344,7 +1362,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { if(map->slots[slot_idx] != 0) { - *map->slots[slot_idx] = rdim_bake_string_chunk_list_sorted_from_unsorted(arena, map->slots[slot_idx]); + *map->slots[slot_idx] = rdim_bake_string_chunk_list_sorted_from_unsorted(scratch.arena, map->slots[slot_idx]); } } } @@ -1356,9 +1374,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_BakeStringMapLoose *map = map__loose; if(lane_idx() == 0) ProfScope("calc base indices, set up tight map") { - RDIM_BakeStringMapBaseIndices bake_string_map_base_indices = rdim_bake_string_map_base_indices_from_map_loose(arena, top, map); + RDIM_BakeStringMapBaseIndices bake_string_map_base_indices = rdim_bake_string_map_base_indices_from_map_loose(scratch.arena, top, map); bake_strings->slots_count = top->slots_count; - bake_strings->slots = rdim_push_array(arena, RDIM_BakeStringChunkList, bake_strings->slots_count); + bake_strings->slots = rdim_push_array(scratch.arena, RDIM_BakeStringChunkList, bake_strings->slots_count); bake_strings->slots_base_idxs = bake_string_map_base_indices.slots_base_idxs; bake_strings->total_count = bake_strings->slots_base_idxs[bake_strings->slots_count]; } @@ -1397,15 +1415,15 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_BakeNameMap **bake_name_maps = 0; ProfScope("build name maps") { - Temp scratch = scratch_begin(&arena, 1); + Temp scratch2 = scratch_begin(&scratch.arena, 1); //- rjf: set up RDIM_BakeNameMap ***lane_maps = 0; if(lane_idx() == 0) { - bake_name_maps_tops = push_array(arena, RDIM_BakeNameMapTopology, RDI_NameMapKind_COUNT); - bake_name_maps = push_array(arena, RDIM_BakeNameMap *, RDI_NameMapKind_COUNT); - lane_maps = push_array(scratch.arena, RDIM_BakeNameMap **, RDI_NameMapKind_COUNT); + bake_name_maps_tops = push_array(scratch.arena, RDIM_BakeNameMapTopology, RDI_NameMapKind_COUNT); + bake_name_maps = push_array(scratch.arena, RDIM_BakeNameMap *, RDI_NameMapKind_COUNT); + lane_maps = push_array(scratch2.arena, RDIM_BakeNameMap **, RDI_NameMapKind_COUNT); for EachNonZeroEnumVal(RDI_NameMapKind, k) { U64 slot_count = 0; @@ -1424,7 +1442,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Case(NormalSourcePaths, params->src_files.total_count); #undef Case } - lane_maps[k] = push_array(arena, RDIM_BakeNameMap *, lane_count()); + lane_maps[k] = push_array(scratch2.arena, RDIM_BakeNameMap *, lane_count()); bake_name_maps_tops[k].slots_count = slot_count; } } @@ -1437,7 +1455,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { if(!name_maps_need_build[k]) { continue; } RDIM_BakeNameMapTopology *top = &bake_name_maps_tops[k]; - lane_maps[k][lane_idx()] = rdim_bake_name_map_make(scratch.arena, top); + lane_maps[k][lane_idx()] = rdim_bake_name_map_make(scratch2.arena, top); RDIM_BakeNameMap *map = lane_maps[k][lane_idx()]; B32 link_names = 0; RDIM_SymbolChunkList *symbols = 0; @@ -1485,7 +1503,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, n_range) { RDIM_SrcFile *src_file = &n->v[n_idx]; - RDIM_String8 normalized_path = rdim_normalize_path_str8(arena, src_file->path); + RDIM_String8 normalized_path = rdim_normalize_path_str8(scratch.arena, src_file->path); rdim_bake_name_map_insert(scratch.arena, top, map, 4, normalized_path, rdim_idx_from_src_file(src_file)); } } @@ -1500,7 +1518,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachNonZeroEnumVal(RDI_NameMapKind, k) { if(!name_maps_need_build[k]) { continue; } - bake_name_maps[k] = rdim_bake_name_map_make(arena, &bake_name_maps_tops[k]); + bake_name_maps[k] = rdim_bake_name_map_make(scratch.arena, &bake_name_maps_tops[k]); } } lane_sync(); @@ -1541,15 +1559,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(map->slots[slot_idx] != 0) { RDIM_BakeNameChunkList *scratch_og_unsorted = map->slots[slot_idx]; - map->slots[slot_idx] = push_array(arena, RDIM_BakeNameChunkList, 1); - *map->slots[slot_idx] = rdim_bake_name_chunk_list_sorted_from_unsorted(arena, scratch_og_unsorted); + map->slots[slot_idx] = push_array(scratch.arena, RDIM_BakeNameChunkList, 1); + *map->slots[slot_idx] = rdim_bake_name_chunk_list_sorted_from_unsorted(scratch.arena, scratch_og_unsorted); } } } } lane_sync(); - - scratch_end(scratch); + scratch_end(scratch2); } lane_sync(); @@ -1566,7 +1583,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) !!(params->subset_flags & RDIM_SubsetFlag_Types)); if(need_index_runs) ProfScope("build index runs") { - Temp scratch = scratch_begin(&arena, 1); + Temp scratch2 = scratch_begin(&scratch.arena, 1); //- rjf: set up per-lane outputs RDIM_BakeIdxRunMapTopology *top = 0; @@ -1574,13 +1591,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_BakeIdxRunMapLoose *map__loose = 0; if(lane_idx() == 0) ProfScope("set up per-lane outputs") { - top = push_array(scratch.arena, RDIM_BakeIdxRunMapTopology, 1); + top = push_array(scratch2.arena, RDIM_BakeIdxRunMapTopology, 1); top->slots_count = 64 + ((all_procedures->total_count + all_global_variables->total_count + all_thread_variables->total_count + params->udts.total_count) * 3) / 4; - lane_maps__loose = push_array(scratch.arena, RDIM_BakeIdxRunMapLoose *, lane_count()); - map__loose = rdim_bake_idx_run_map_loose_make(scratch.arena, top); + lane_maps__loose = push_array(scratch2.arena, RDIM_BakeIdxRunMapLoose *, lane_count()); + map__loose = rdim_bake_idx_run_map_loose_make(scratch2.arena, top); } lane_sync_u64(&top, 0); lane_sync_u64(&lane_maps__loose, 0); @@ -1589,7 +1606,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: set up this lane's map ProfScope("set up this lane's map") { - lane_maps__loose[lane_idx()] = rdim_bake_idx_run_map_loose_make(scratch.arena, top); + lane_maps__loose[lane_idx()] = rdim_bake_idx_run_map_loose_make(scratch2.arena, top); } RDIM_BakeIdxRunMapLoose *lane_map = lane_maps__loose[lane_idx()]; @@ -1617,7 +1634,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(type->param_types[idx]); // TODO(rjf): @u64_to_u32 } - rdim_bake_idx_run_map_loose_insert(scratch.arena, top, lane_map, 4, param_idx_run, param_idx_run_count); + rdim_bake_idx_run_map_loose_insert(scratch2.arena, top, lane_map, 4, param_idx_run, param_idx_run_count); } } } @@ -1680,7 +1697,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) write_idx += 1; } } - rdim_bake_idx_run_map_loose_insert(scratch.arena, top, lane_map, 4, idxs, idxs_count); + rdim_bake_idx_run_map_loose_insert(scratch2.arena, top, lane_map, 4, idxs, idxs_count); } active_string = string; first_idx_run_node = 0; @@ -1691,7 +1708,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: new element matches the active list -> push if(active_string.size != 0 && str8_match(string, active_string, 0)) { - IdxRunNode *idx_run_n = push_array(scratch.arena, IdxRunNode, 1); + IdxRunNode *idx_run_n = push_array(scratch2.arena, IdxRunNode, 1); idx_run_n->idx = idx; SLLQueuePush(first_idx_run_node, last_idx_run_node, idx_run_n); active_idx_count += 1; @@ -1745,7 +1762,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { if(map->slots[slot_idx] != 0) { - *map->slots[slot_idx] = rdim_bake_idx_run_chunk_list_sorted_from_unsorted(arena, map->slots[slot_idx]); + *map->slots[slot_idx] = rdim_bake_idx_run_chunk_list_sorted_from_unsorted(scratch.arena, map->slots[slot_idx]); map->slots_idx_counts[slot_idx] = 0; for EachNode(n, RDIM_BakeIdxRunChunkNode, map->slots[slot_idx]->first) { @@ -1766,8 +1783,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) ProfScope("calc base indices, set up tight map") { bake_idx_runs->slots_count = top->slots_count; - bake_idx_runs->slots = rdim_push_array(arena, RDIM_BakeIdxRunChunkList, bake_idx_runs->slots_count); - bake_idx_runs->slots_base_idxs = rdim_push_array(arena, RDI_U64, bake_idx_runs->slots_count+1); + bake_idx_runs->slots = rdim_push_array(scratch.arena, RDIM_BakeIdxRunChunkList, bake_idx_runs->slots_count); + bake_idx_runs->slots_base_idxs = rdim_push_array(scratch.arena, RDI_U64, bake_idx_runs->slots_count+1); RDI_U64 encoding_idx_off = 0; for(RDI_U64 slot_idx = 0; slot_idx < top->slots_count; slot_idx += 1) { @@ -1793,8 +1810,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } lane_sync(); - - scratch_end(scratch); + scratch_end(scratch2); } lane_sync(); @@ -1919,6 +1935,8 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) BakedNameMaps *baked_name_maps = 0; ProfScope("bake name maps") { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + // rjf: count unique names in all name maps; lay out baked nodes U64 **lane_name_map_node_counts = 0; // [RDI_NameMapKind_COUNT][..] U64 **lane_name_map_node_offs = 0; // [RDI_NameMapKind_COUNT][..] @@ -1928,13 +1946,13 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) { if(lane_idx() == 0) { - lane_name_map_node_counts = push_array(scratch.arena, U64 *, RDI_NameMapKind_COUNT); - lane_name_map_node_offs = push_array(scratch.arena, U64 *, RDI_NameMapKind_COUNT); - name_map_node_counts = push_array(scratch.arena, U64, RDI_NameMapKind_COUNT); + lane_name_map_node_counts = push_array(scratch2.arena, U64 *, RDI_NameMapKind_COUNT); + lane_name_map_node_offs = push_array(scratch2.arena, U64 *, RDI_NameMapKind_COUNT); + name_map_node_counts = push_array(scratch2.arena, U64, RDI_NameMapKind_COUNT); for EachNonZeroEnumVal(RDI_NameMapKind, k) { - lane_name_map_node_counts[k] = push_array(scratch.arena, U64, lane_count()); - lane_name_map_node_offs[k] = push_array(scratch.arena, U64, lane_count()); + lane_name_map_node_counts[k] = push_array(scratch2.arena, U64, lane_count()); + lane_name_map_node_offs[k] = push_array(scratch2.arena, U64, lane_count()); } } lane_sync_u64(&lane_name_map_node_counts, 0); @@ -2127,6 +2145,9 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } } + + lane_sync(); + scratch_end(scratch2); } lane_sync(); @@ -2152,7 +2173,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: set up map map->slots_count = Max(n->v[n_idx].total_line_count, 1); - map->slots = push_array(arena, RDIM_BakeSrcLineMapSlot, map->slots_count); + map->slots = push_array(scratch.arena, RDIM_BakeSrcLineMapSlot, map->slots_count); // rjf: gather line-bucketed info for EachNode(frag, RDIM_SrcFileLineMapFragment, n->v[n_idx].first_line_map_fragment) @@ -2181,7 +2202,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: construct new node if unseen if(line_node == 0) { - line_node = push_array(arena, RDIM_BakeSrcLineMapNode, 1); + line_node = push_array(scratch.arena, RDIM_BakeSrcLineMapNode, 1); SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, line_node); line_node->line_num = line_num; map->line_count += 1; @@ -2189,7 +2210,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: push this voff range RDIM_Rng1U64 voff_range = {voff_first, voff_opl}; - rdim_rng1u64_list_push(arena, &line_node->voff_ranges, voff_range); + rdim_rng1u64_list_push(scratch.arena, &line_node->voff_ranges, voff_range); map->voff_range_count += 1; } } @@ -2205,13 +2226,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_SortKey **bake_src_line_map_keys = 0; ProfScope("sort line-bucketed src line map data") { - U64 *map_take_idx = push_array(scratch.arena, U64, 1); U64 map_count = params->src_files.total_count; if(lane_idx() == 0) { - bake_src_line_map_keys = push_array(arena, RDIM_SortKey *, map_count); + bake_src_line_map_keys = push_array(scratch.arena, RDIM_SortKey *, map_count); } lane_sync_u64(&bake_src_line_map_keys, 0); + U64 map_take_idx_ = 0; + U64 *map_take_idx = &map_take_idx_; lane_sync_u64(&map_take_idx, 0); for(;;) { @@ -2224,7 +2246,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDIM_BakeSrcLineMap *map = &bake_src_line_maps[map_idx]; // rjf: gather keys - bake_src_line_map_keys[map_idx] = push_array_no_zero(arena, RDIM_SortKey, map->line_count); + bake_src_line_map_keys[map_idx] = push_array_no_zero(scratch.arena, RDIM_SortKey, map->line_count); RDIM_SortKey *keys = bake_src_line_map_keys[map_idx]; { U64 key_idx = 0; @@ -2271,16 +2293,16 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) { src_map_layout = push_array(scratch.arena, SrcMapLayout, 1); - src_map_layout->lane_chunk_src_file_num_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - src_map_layout->lane_chunk_src_file_voff_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - src_map_layout->lane_chunk_src_file_map_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - src_map_layout->lane_chunk_src_file_num_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - src_map_layout->lane_chunk_src_file_voff_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - src_map_layout->lane_chunk_src_file_map_offs = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_num_counts = push_array(scratch.arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_voff_counts = push_array(scratch.arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_map_counts = push_array(scratch.arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_num_offs = push_array(scratch.arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_voff_offs = push_array(scratch.arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_map_offs = push_array(scratch.arena, U64, lane_count()*params->src_files.chunk_count); for EachEnumVal(RDI_ChecksumKind, k) { - src_map_layout->lane_chunk_src_file_checksum_counts[k] = push_array(arena, U64, lane_count()*params->src_files.chunk_count); - src_map_layout->lane_chunk_src_file_checksum_offs[k] = push_array(arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_checksum_counts[k] = push_array(scratch.arena, U64, lane_count()*params->src_files.chunk_count); + src_map_layout->lane_chunk_src_file_checksum_offs[k] = push_array(scratch.arena, U64, lane_count()*params->src_files.chunk_count); } } lane_sync_u64(&src_map_layout, 0); @@ -2604,10 +2626,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) { mem_layout = push_array(scratch.arena, MemberLayout, 1); - mem_layout->member_chunk_lane_counts = push_array(arena, U64, lane_count() * params->udts.chunk_count); - mem_layout->member_chunk_lane_offs = push_array(arena, U64, lane_count() * params->udts.chunk_count); - mem_layout->enum_val_chunk_lane_counts = push_array(arena, U64, lane_count() * params->udts.chunk_count); - mem_layout->enum_val_chunk_lane_offs = push_array(arena, U64, lane_count() * params->udts.chunk_count); + mem_layout->member_chunk_lane_counts = push_array(scratch.arena, U64, lane_count() * params->udts.chunk_count); + mem_layout->member_chunk_lane_offs = push_array(scratch.arena, U64, lane_count() * params->udts.chunk_count); + mem_layout->enum_val_chunk_lane_counts = push_array(scratch.arena, U64, lane_count() * params->udts.chunk_count); + mem_layout->enum_val_chunk_lane_offs = push_array(scratch.arena, U64, lane_count() * params->udts.chunk_count); } lane_sync_u64(&mem_layout, 0); @@ -2790,10 +2812,10 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) if(lane_idx() == 0) { scope_layout = push_array(scratch.arena, ScopeLayout, 1); - scope_layout->scope_local_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * all_scopes->chunk_count); - scope_layout->scope_local_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * all_scopes->chunk_count); - scope_layout->scope_voff_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * all_scopes->chunk_count); - scope_layout->scope_voff_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * all_scopes->chunk_count); + scope_layout->scope_local_chunk_lane_counts = push_array(scratch.arena, RDI_U64, lane_count() * all_scopes->chunk_count); + scope_layout->scope_local_chunk_lane_offs = push_array(scratch.arena, RDI_U64, lane_count() * all_scopes->chunk_count); + scope_layout->scope_voff_chunk_lane_counts = push_array(scratch.arena, RDI_U64, lane_count() * all_scopes->chunk_count); + scope_layout->scope_voff_chunk_lane_offs = push_array(scratch.arena, RDI_U64, lane_count() * all_scopes->chunk_count); } lane_sync_u64(&scope_layout, 0); @@ -3066,13 +3088,15 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->constructed.count = src->count; if(dst->kind == RDI_TypeKind_Function || dst->kind == RDI_TypeKind_Method) { + Temp scratch2 = scratch_begin(&scratch.arena, 1); RDI_U32 param_idx_run_count = src->count; - RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count); + RDI_U32 *param_idx_run = rdim_push_array_no_zero(scratch2.arena, RDI_U32, param_idx_run_count); for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1) { param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(src->param_types[idx]); // TODO(rjf): @u64_to_u32 } dst->constructed.param_idx_run_first = rdim_bake_idx_from_idx_run(bake_idx_runs, param_idx_run, param_idx_run_count); + scratch_end(scratch2); } else if(dst->kind == RDI_TypeKind_MemberPtr) { @@ -3450,7 +3474,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) baked_file_paths = push_array(scratch.arena, BakedFilePaths, 1); baked_file_paths->nodes_count = path_tree->count; baked_file_paths->nodes = push_array(arena, RDI_FilePathNode, baked_file_paths->nodes_count); - baked_file_path_src_nodes = push_array(arena, RDIM_BakePathNode *, baked_file_paths->nodes_count); + baked_file_path_src_nodes = push_array(scratch.arena, RDIM_BakePathNode *, baked_file_paths->nodes_count); { U64 idx = 0; for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order) From 56ee3bbf7b526a0f9cba2e8157f93ee55a435d46 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 20 May 2026 16:27:14 -0700 Subject: [PATCH 673/850] eval: use resolution qualifiers to express disambiguating debug info, or module, or unit, and use in debug info resolution matching path; automatically prefer selected thread voff's unit --- src/dbg_info/dbg_info.c | 58 +++++- src/dbg_info/dbg_info.h | 2 +- src/eval/eval_core.c | 35 ++-- src/eval/eval_core.h | 4 + src/eval/eval_ir.c | 355 ++++++++++++++++++++-------------- src/eval/eval_parse.c | 61 ++++-- src/lib_rdi/rdi.h | 4 +- src/raddbg/raddbg_core.c | 130 +++++++------ src/raddbg/raddbg_main.c | 9 +- src/rdi/rdi.mdesk | 3 +- src/rdi_make/rdi_make_local.c | 15 ++ 11 files changed, 423 insertions(+), 253 deletions(-) diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 3859cfd8..9e6519e9 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1500,12 +1500,16 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g Temp scratch = scratch_begin(0, 0); //- rjf: unpack key - U64 index = 0; + U32 index = 0; + U32 unit_idx = 0; + B32 allow_other_dbgis = 0; String8 name = {0}; DI_Key preferred_key = {0}; { U64 key_read_off = 0; key_read_off += str8_deserial_read_struct(key, key_read_off, &index); + key_read_off += str8_deserial_read_struct(key, key_read_off, &unit_idx); + key_read_off += str8_deserial_read_struct(key, key_read_off, &allow_other_dbgis); key_read_off += str8_deserial_read_struct(key, key_read_off, &preferred_key); key_read_off += str8_deserial_read_struct(key, key_read_off, &name.size); name.str = push_array_no_zero(scratch.arena, U8, name.size); @@ -1623,10 +1627,15 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g Rng1U64 range = lane_range(dbgi_keys.count); for EachInRange(dbgi_idx, range) { + DI_Key dbgi_key = dbgi_keys.v[dbgi_idx]; + if(!allow_other_dbgis && !di_key_match(preferred_key, dbgi_key)) + { + continue; + } Access *access = access_open(); { - DI_Key dbgi_key = dbgi_keys.v[dbgi_idx]; RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx); for EachElement(name_map_kind_idx, name_map_kinds) { // rjf: unpack name map @@ -1685,12 +1694,43 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g } // rjf: do we have a specific unit queried? -> filter matches according to containing unit -#if 0 - if(target_unit_index != 0) + if(unit_idx != 0) { - + U32 *unit_filtered_matches = push_array(scratch.arena, U32, filtered_matches_count); + U32 unit_filtered_matches_count = 0; + for EachIndex(match_idx, filtered_matches_count) + { + U32 match = filtered_matches[match_idx]; + B32 hits_filter = 1; + switch(name_map_section_kinds[name_map_kind_idx]) + { + default:{}break; + case RDI_SectionKind_GlobalVariables: + { + hits_filter = (unit->global_variables_first_idx <= match && match < unit->global_variables_first_idx+unit->global_variables_count); + }break; + case RDI_SectionKind_ThreadVariables: + { + hits_filter = (unit->thread_variables_first_idx <= match && match < unit->thread_variables_first_idx+unit->thread_variables_count); + }break; + case RDI_SectionKind_Constants: + { + hits_filter = (unit->constants_first_idx <= match && match < unit->constants_first_idx+unit->constants_count); + }break; + case RDI_SectionKind_Procedures: + { + hits_filter = (unit->procedures_first_idx <= match && match < unit->procedures_first_idx+unit->procedures_count); + }break; + } + if(hits_filter) + { + unit_filtered_matches[unit_filtered_matches_count] = match; + unit_filtered_matches_count += 1; + } + } + filtered_matches = unit_filtered_matches; + filtered_matches_count = unit_filtered_matches_count; } -#endif // rjf: given matches, pick selected & return as result if(filtered_matches_count != 0) @@ -1743,7 +1783,7 @@ di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g } internal DI_Match -di_match_from_string(String8 string, U64 match_index, DI_Key preferred_dbgi_key, U64 endt_us) +di_match_from_string(String8 string, U32 match_index, U32 unit_idx, B32 allow_other_dbgis, DI_Key preferred_dbgi_key, U64 endt_us) { DI_Match result = {0}; Access *access = access_open(); @@ -1751,12 +1791,14 @@ di_match_from_string(String8 string, U64 match_index, DI_Key preferred_dbgi_key, { String8List key_parts = {0}; str8_list_push(scratch.arena, &key_parts, str8_struct(&match_index)); + str8_list_push(scratch.arena, &key_parts, str8_struct(&unit_idx)); + str8_list_push(scratch.arena, &key_parts, str8_struct(&allow_other_dbgis)); str8_list_push(scratch.arena, &key_parts, str8_struct(&preferred_dbgi_key)); str8_list_push(scratch.arena, &key_parts, str8_struct(&string.size)); str8_list_push(scratch.arena, &key_parts, string); String8 key = str8_list_join(scratch.arena, &key_parts, 0); U64 dbgi_count = di_load_count(); - B32 wide = (dbgi_count > 256); + B32 wide = (dbgi_count > 256 && allow_other_dbgis); AC_Artifact artifact = ac_artifact_from_key(access, key, di_match_artifact_create, 0, endt_us, .flags = wide ? AC_Flag_Wide : 0, .gen = di_load_gen(), .evict_threshold_us = wide ? 20000000 : 10000000); result.key.u64[0] = artifact.u64[0]; result.key.u64[1] = artifact.u64[1]; diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 26e821bf..0cff1bea 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -361,6 +361,6 @@ internal DI_SearchItemArray di_search_item_array_from_target_query(Access *acces //~ rjf: Match Artifact Cache Hooks / Lookups internal AC_Artifact di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal DI_Match di_match_from_string(String8 string, U64 match_index, DI_Key preferred_dbgi_key, U64 endt_us); +internal DI_Match di_match_from_string(String8 string, U32 match_index, U32 unit_idx, B32 allow_other_dbgis, DI_Key preferred_dbgi_key, U64 endt_us); #endif // DBG_INFO_H diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 6adc6193..615944cd 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -213,25 +213,28 @@ e_string2num_map_make(Arena *arena, U64 slot_count) internal void e_string2num_map_insert(Arena *arena, E_String2NumMap *map, String8 string, U64 num) { - U64 hash = e_hash_from_string(5381, string); - U64 slot_idx = hash%map->slots_count; - E_String2NumMapNode *existing_node = 0; - for(E_String2NumMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) + if(string.size != 0) { - if(str8_match(node->string, string, 0) && node->num == num) + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + E_String2NumMapNode *existing_node = 0; + for(E_String2NumMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next) { - existing_node = node; - break; + if(str8_match(node->string, string, 0) && node->num == num) + { + existing_node = node; + break; + } + } + if(existing_node == 0) + { + E_String2NumMapNode *node = push_array(arena, E_String2NumMapNode, 1); + SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next); + SLLQueuePush_N(map->first, map->last, node, order_next); + node->string = push_str8_copy(arena, string); + node->num = num; + map->node_count += 1; } - } - if(existing_node == 0) - { - E_String2NumMapNode *node = push_array(arena, E_String2NumMapNode, 1); - SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next); - SLLQueuePush_N(map->first, map->last, node, order_next); - node->string = push_str8_copy(arena, string); - node->num = num; - map->node_count += 1; } } diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 82128bc2..3108cdbc 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -575,6 +575,7 @@ struct E_DbgInfo { DI_Key dbgi_key; RDI_Parsed *rdi; + String8 name; }; //////////////////////////////// @@ -587,6 +588,7 @@ struct E_Module U32 dbg_info_num; Arch arch; E_Space space; + String8 name; }; //////////////////////////////// @@ -794,11 +796,13 @@ struct E_BaseCtx E_DbgInfo *dbg_infos; U64 dbg_infos_count; E_DbgInfo *primary_dbg_info; + E_String2NumMap *dbg_info_from_name_map; // rjf: modules E_Module *modules; U64 modules_count; E_Module *primary_module; + E_String2NumMap *module_from_name_map; // rjf: space hooks E_SpaceGenFunction *space_gen; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 5fd76795..34b1742a 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1713,19 +1713,52 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I void *mapped_user_data = 0; B32 generated = 0; + //- rjf: determine the allowed identifier resolution path, if any + B32 do_limit_resolve_path = 0; + E_IdentifierResolutionPath limit_resolve_path = E_IdentifierResolutionPath_Local; + if(qualifier.size != 0) + { + do_limit_resolve_path = 1; + if(str8_match(qualifier, s("member"), 0)) + { + limit_resolve_path = E_IdentifierResolutionPath_ImplicitThisMember; + } + else if(str8_match(qualifier, s("local"), 0)) + { + limit_resolve_path = E_IdentifierResolutionPath_Local; + } + else if(str8_match(qualifier, s("symbol"), 0)) + { + limit_resolve_path = E_IdentifierResolutionPath_DebugInfoMatch; + } + else if(str8_match(qualifier, s("reg"), 0)) + { + limit_resolve_path = E_IdentifierResolutionPath_Registers; + } + else if(str8_match(qualifier, s("query"), 0) || + str8_match(qualifier, s("macro"), 0)) + { + limit_resolve_path = E_IdentifierResolutionPath_Macros; + } + else + { + do_limit_resolve_path = 0; + } + } + //- rjf: iterate identifier resolution rule paths, try to resolve // identifier in that order. for(U64 path_idx = 0; !generated && path_idx < identifier_resolution_rule->count; path_idx += 1) { //- rjf: try to map identifier via this path E_IdentifierResolutionPath path = identifier_resolution_rule->paths[path_idx]; - ProfScope("identifier resolution %i", path) switch(path) + ProfScope("identifier resolution %i", path) if(!do_limit_resolve_path || limit_resolve_path == path) switch(path) { default:{}break; //- rjf: try to map name as a wildcard instance case E_IdentifierResolutionPath_WildcardInst: - if(!generated && qualifier.size == 0 && !string_mapped && e_cache->first_wildcard_inst != 0) + if(!generated && !string_mapped && e_cache->first_wildcard_inst != 0) { for(E_AutoHookWildcardInst *inst = e_cache->first_wildcard_inst; inst != 0; inst = inst->next) { @@ -1740,7 +1773,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I //- rjf: try to map name as parent expression signifier ('$') case E_IdentifierResolutionPath_ParentExpr: - if(qualifier.size == 0 && !string_mapped && str8_match(string, str8_lit("$"), 0) && parent != 0 && (parent->root != &e_irnode_nil || parent->msgs.first != 0)) + if(!string_mapped && str8_match(string, str8_lit("$"), 0) && parent != 0 && (parent->root != &e_irnode_nil || parent->msgs.first != 0)) { E_IRTreeAndType *parent_irtree = parent; { @@ -1770,7 +1803,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I //- rjf: try to map name as implicit access of overridden expression ('$.member_name', where the $. prefix is omitted) case E_IdentifierResolutionPath_ParentExprMember: - if(qualifier.size == 0 && !string_mapped && parent != 0 && parent->root != &e_irnode_nil) + if(!string_mapped && parent != 0 && parent->root != &e_irnode_nil) { for(E_IRTreeAndType *prev = parent; prev != 0; prev = prev->prev) { @@ -1796,7 +1829,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I //- rjf: try to map name as member of `this` - if found, string__redirected := "this", and turn // on later implicit-member-lookup generation case E_IdentifierResolutionPath_ImplicitThisMember: - if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("member"), 0))) + if(!string_mapped) { E_Module *module = e_base_ctx->primary_module; E_DbgInfo *dbg_info = e_dbg_info_from_module(module); @@ -1815,7 +1848,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I //- rjf: try locals case E_IdentifierResolutionPath_Local: - if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("local"), 0))) + if(!string_mapped) { E_Module *module = e_base_ctx->primary_module; E_DbgInfo *dbg_info = e_dbg_info_from_module(module); @@ -1852,9 +1885,10 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I //- rjf: built-in constants case E_IdentifierResolutionPath_BuiltInConstants: + if(!string_mapped) { // rjf: "true" - if(!string_mapped && str8_match(string, str8_lit("true"), 0)) + if(str8_match(string, str8_lit("true"), 0)) { string_mapped = 1; E_OpList oplist = {0}; @@ -1865,7 +1899,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I } // rjf: "false" - if(!string_mapped && str8_match(string, str8_lit("false"), 0)) + else if(str8_match(string, str8_lit("false"), 0)) { string_mapped = 1; E_OpList oplist = {0}; @@ -1878,6 +1912,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I //- rjf: built-in types case E_IdentifierResolutionPath_BuiltInTypes: + if(!string_mapped) { mapped_type_key = e_leaf_builtin_type_key_from_name(string); string_mapped = !e_type_key_match(mapped_type_key, e_type_key_zero()); @@ -1885,161 +1920,195 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I //- rjf: debug info matches case E_IdentifierResolutionPath_DebugInfoMatch: + if(!string_mapped) { - if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("symbol"), 0))) + Access *access = access_open(); + + // rjf: unpack qualifier (module / debug info / unit info) + U64 qualifier_module_num = 0; + U64 qualifier_dbg_info_num = 0; + String8 leftover = {0}; { - Access *access = access_open(); - - // rjf: determine disambiguating index - U64 match_disambiguating_idx = 0; - if(disambiguator.size != 0) + U64 piece_start_off = 0; + for(U64 off = 0; off <= qualifier.size; off += 1) { - try_u64_from_str8_c_rules(disambiguator, &match_disambiguating_idx); + if(off == qualifier.size || qualifier.str[off] == ':' || qualifier.str[off] == '!') + { + String8 piece = str8_substr(qualifier, r1u64(piece_start_off, off)); + + // rjf: try to match this piece as a module + B32 was_module = 0; + if(qualifier_module_num == 0) + { + qualifier_module_num = e_num_from_string(e_base_ctx->module_from_name_map, piece); + was_module = (qualifier_module_num != 0); + } + + // rjf: try to match this piece as a debug info + B32 was_dbg_info = 0; + if(qualifier_dbg_info_num == 0) + { + qualifier_dbg_info_num = e_num_from_string(e_base_ctx->dbg_info_from_name_map, piece); + was_dbg_info = (qualifier_dbg_info_num != 0); + } + + // rjf: wasn't a debug info or module name -> keep as leftover + if(!was_module && !was_dbg_info) + { + leftover = piece; + } + + piece_start_off = off+1; + } } - - // rjf: find match - DI_Match match = di_match_from_string(string, match_disambiguating_idx, e_base_ctx->primary_dbg_info->dbgi_key, 0); - - // rjf: match -> RDI - RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0); - - // rjf: ambiguous global/thread variable in primary debug info -> try fully qualifying the name implicitly. - if((match.section_kind == RDI_SectionKind_GlobalVariables || - match.section_kind == RDI_SectionKind_ThreadVariables) && - match.count != 1 && - rdi == e_base_ctx->primary_dbg_info->rdi) + } + + // rjf: unpack selected debug info + B32 allow_other_dbg_infos = 1; + E_DbgInfo *target_dbg_info = e_base_ctx->primary_dbg_info; + if(1 <= qualifier_dbg_info_num && qualifier_dbg_info_num <= e_base_ctx->dbg_infos_count) + { + target_dbg_info = &e_base_ctx->dbg_infos[qualifier_dbg_info_num-1]; + allow_other_dbg_infos = 0; + } + else if(1 <= qualifier_module_num && qualifier_module_num <= e_base_ctx->modules_count) + { + E_Module *module = &e_base_ctx->modules[qualifier_module_num-1]; + target_dbg_info = e_dbg_info_from_module(module); + allow_other_dbg_infos = 0; + } + + // rjf: if we have a leftover -> try to match as a unit name + U64 unit_idx = 0; + if(leftover.size != 0 && target_dbg_info != &e_dbg_info_nil) + { + RDI_Parsed *rdi = target_dbg_info->rdi; + RDI_NameMap *unit_name_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Units); + RDI_ParsedNameMap unit_name_map_parsed = {0}; + rdi_parsed_from_name_map(rdi, unit_name_map, &unit_name_map_parsed); + RDI_NameMapNode *match_node = rdi_name_map_lookup(rdi, &unit_name_map_parsed, leftover.str, leftover.size); + U32 unit_idx_match_count = 0; + U32 *unit_idx_matches = rdi_matches_from_map_node(rdi, match_node, &unit_idx_match_count); + if(unit_idx_match_count != 0) + { + unit_idx = unit_idx_matches[0]; + allow_other_dbg_infos = 0; + } + } + + // rjf: determine disambiguating index + U64 match_disambiguating_idx = 0; + if(disambiguator.size != 0) + { + try_u64_from_str8_c_rules(disambiguator, &match_disambiguating_idx); + } + + // rjf: find match + DI_Match match = di_match_from_string(string, match_disambiguating_idx, (U32)unit_idx, allow_other_dbg_infos, target_dbg_info->dbgi_key, 0); + + // rjf: match -> RDI + RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0); + + // rjf: ambiguous global/thread variable in primary debug info -> try fully qualifying the name implicitly. + if((match.section_kind == RDI_SectionKind_GlobalVariables || + match.section_kind == RDI_SectionKind_ThreadVariables) && + match.count != 1 && + rdi == e_base_ctx->primary_dbg_info->rdi) + { + U64 voff = e_base_ctx->thread_ip_voff; + U32 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, voff); + String8 fully_qualified_name = string; + RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); + B32 symbol_is_contained = (symbol->container_idx != 0); + if(symbol_is_contained) { - U64 voff = e_base_ctx->thread_ip_voff; RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); String8 procedure_name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, procedure); - String8 fully_qualified_name = str8f(scratch.arena, "%S.%S", procedure_name, string); - DI_Match fully_qualified_match_maybe = di_match_from_string(fully_qualified_name, match_disambiguating_idx, e_base_ctx->primary_dbg_info->dbgi_key, 0); - if(fully_qualified_match_maybe.idx != 0) - { - match = fully_qualified_match_maybe; - } + fully_qualified_name = str8f(scratch.arena, "%S.%S", procedure_name, string); } - -#if 0 - //~ TODO(rjf): vvvvv this used to be used for namespaceifying partially-qualified strings. - // now, the debugger just stores partially-qualified strings, so we instead need to do the - // reverse: given a fully-qualified name, try to parse out the leaf, and look up the partial - // qualified name. - if(match.idx == 0) + DI_Match fully_qualified_match_maybe = di_match_from_string(fully_qualified_name, match_disambiguating_idx, unit_idx, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0); + if(fully_qualified_match_maybe.idx != 0) { - String8List namespaceified_strings = {0}; - { - E_Module *module = e_base_ctx->primary_module; - E_DbgInfo *dbg_info = e_dbg_info_from_module(module); - RDI_Parsed *rdi = dbg_info->rdi; - RDI_Symbol *procedure = e_cache->thread_ip_procedure; - U64 name_size = 0; - U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size); - String8 containing_procedure_name = str8(name_ptr, name_size); - U64 last_past_scope_resolution_pos = 0; - for(;;) - { - U64 past_next_dbl_colon_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("::"), 0)+2; - U64 past_next_dot_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit("."), 0)+1; - U64 past_next_scope_resolution_pos = Min(past_next_dbl_colon_pos, past_next_dot_pos); - if(past_next_scope_resolution_pos >= containing_procedure_name.size) - { - break; - } - String8 new_namespace_prefix_possibility = str8_prefix(containing_procedure_name, past_next_scope_resolution_pos); - String8 namespaceified_string = push_str8f(scratch.arena, "%S%S", new_namespace_prefix_possibility, string); - str8_list_push_front(scratch.arena, &namespaceified_strings, namespaceified_string); - last_past_scope_resolution_pos = past_next_scope_resolution_pos; - } - } - for(String8Node *n = namespaceified_strings.first; n != 0; n = n->next) - { - match = di_match_from_string(n->string, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0); - if(match.idx != 0) - { - break; - } - } + match = fully_qualified_match_maybe; } -#endif - - // rjf: find dbg info from rdi - E_DbgInfo *dbg_info = &e_dbg_info_nil; - U32 dbg_info_num = 0; - for EachIndex(idx, e_base_ctx->dbg_infos_count) + } + + // rjf: find dbg info from rdi + E_DbgInfo *dbg_info = &e_dbg_info_nil; + U32 dbg_info_num = 0; + for EachIndex(idx, e_base_ctx->dbg_infos_count) + { + if(e_base_ctx->dbg_infos[idx].rdi == rdi) { - if(e_base_ctx->dbg_infos[idx].rdi == rdi) + dbg_info = &e_base_ctx->dbg_infos[idx]; + dbg_info_num = idx+1; + break; + } + } + + // rjf: find module from dbgi key + E_Module *module = &e_module_nil; + for EachIndex(idx, e_base_ctx->modules_count) + { + if(e_base_ctx->modules[idx].dbg_info_num == dbg_info_num) + { + module = &e_base_ctx->modules[idx]; + if(module == e_base_ctx->primary_module || e_space_match(module->space, e_base_ctx->primary_module->space)) { - dbg_info = &e_base_ctx->dbg_infos[idx]; - dbg_info_num = idx+1; break; } } - - // rjf: find module from dbgi key - E_Module *module = &e_module_nil; - for EachIndex(idx, e_base_ctx->modules_count) - { - if(e_base_ctx->modules[idx].dbg_info_num == dbg_info_num) - { - module = &e_base_ctx->modules[idx]; - if(module == e_base_ctx->primary_module || e_space_match(module->space, e_base_ctx->primary_module->space)) - { - break; - } - } - } - - // rjf: form result - if(match.idx != 0 && dbg_info != &e_dbg_info_nil) - { - switch(match.section_kind) - { - default:{}break; - case RDI_SectionKind_GlobalVariables: - case RDI_SectionKind_ThreadVariables: - case RDI_SectionKind_Constants: - { - RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); - U64 ip_voff = e_base_ctx->thread_ip_voff; - RDI_Location location = rdi_location_from_location_voff(rdi, symbol->location, ip_voff); - U32 type_idx = symbol->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); - string_mapped = 1; - mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); - mapped_location = location; - mapped_dbg_info = dbg_info; - mapped_location_module = module; - mapped_bytecode_mode = E_Mode_Offset; - }break; - case RDI_SectionKind_Procedures: - { - RDI_Symbol *procedure = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); - U64 procedure_base_voff = rdi_first_voff_from_procedure(rdi, procedure); - mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, dbg_info_num); - mapped_location = rdi_location_voff(procedure_base_voff); - mapped_dbg_info = dbg_info; - mapped_location_module = module; - mapped_bytecode_mode = E_Mode_Value; - }break; - case RDI_SectionKind_TypeNodes: - { - U32 type_idx = match.idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); - mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); - mapped_dbg_info = dbg_info; - string_mapped = 1; - }break; - } - } - access_close(access); } + + // rjf: form result + if(match.idx != 0 && dbg_info != &e_dbg_info_nil) + { + switch(match.section_kind) + { + default:{}break; + case RDI_SectionKind_GlobalVariables: + case RDI_SectionKind_ThreadVariables: + case RDI_SectionKind_Constants: + { + RDI_Symbol *symbol = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); + U64 ip_voff = e_base_ctx->thread_ip_voff; + RDI_Location location = rdi_location_from_location_voff(rdi, symbol->location, ip_voff); + U32 type_idx = symbol->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); + string_mapped = 1; + mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); + mapped_location = location; + mapped_dbg_info = dbg_info; + mapped_location_module = module; + mapped_bytecode_mode = E_Mode_Offset; + }break; + case RDI_SectionKind_Procedures: + { + RDI_Symbol *procedure = (RDI_Symbol *)rdi_section_raw_element_from_kind_idx(rdi, match.section_kind, match.idx); + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); + U64 procedure_base_voff = rdi_first_voff_from_procedure(rdi, procedure); + mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, dbg_info_num); + mapped_location = rdi_location_voff(procedure_base_voff); + mapped_dbg_info = dbg_info; + mapped_location_module = module; + mapped_bytecode_mode = E_Mode_Value; + }break; + case RDI_SectionKind_TypeNodes: + { + U32 type_idx = match.idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx); + mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num); + mapped_dbg_info = dbg_info; + string_mapped = 1; + }break; + } + } + access_close(access); }break; //- rjf: try registers case E_IdentifierResolutionPath_Registers: - if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit("reg"), 0))) + if(!string_mapped) { U64 reg_num = e_num_from_string(e_ir_ctx->regs_map, string); if(reg_num != 0) diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index bb44589f..0bdb04c1 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -621,7 +621,7 @@ e_leaf_type_key_from_name(String8 name) E_TypeKey key = e_leaf_builtin_type_key_from_name(name); if(!e_type_key_match(e_type_key_zero(), key)) { - DI_Match match = di_match_from_string(name, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0); + DI_Match match = di_match_from_string(name, 0, 0, 1, e_base_ctx->primary_dbg_info->dbgi_key, 0); if(match.section_kind == RDI_SectionKind_TypeNodes) { Access *access = access_open(); @@ -855,32 +855,51 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // String8 resolution_qualifier = {0}; { - E_Token token = e_token_at_it(it, &tokens); - String8 token_string = str8_substr(text, token.range); - if(token.kind == E_TokenKind_Identifier || token.kind == E_TokenKind_StringLiteral) + Rng1U64 resolution_qualifier_chain_range = {0}; + for(B32 resolution_qualifiers_done = 0; !resolution_qualifiers_done;) { - // rjf: look for extensions - for qualifiers of the form `foo.dll!bar` - U64 token_ext_count = 0; - E_Token dot_maybe_token = e_token_at_it(it+1, &tokens); - String8 dot_maybe_token_string = str8_substr(text, dot_maybe_token.range); - E_Token ext_maybe_token = e_token_at_it(it+2, &tokens); - String8 ext_maybe_token_string = str8_substr(text, ext_maybe_token.range); - if(dot_maybe_token.kind == E_TokenKind_Symbol && - ext_maybe_token.kind == E_TokenKind_Identifier && - str8_match(dot_maybe_token_string, str8_lit("."), 0)) + B32 is_qualifier = 0; + E_Token token = e_token_at_it(it, &tokens); + String8 token_string = str8_substr(text, token.range); + if(token.kind == E_TokenKind_Identifier || token.kind == E_TokenKind_StringLiteral) { - token_ext_count = 2; + // rjf: look for extensions - for qualifiers of the form `foo.dll!bar` + U64 token_ext_count = 0; + E_Token dot_maybe_token = e_token_at_it(it+1, &tokens); + String8 dot_maybe_token_string = str8_substr(text, dot_maybe_token.range); + E_Token ext_maybe_token = e_token_at_it(it+2, &tokens); + String8 ext_maybe_token_string = str8_substr(text, ext_maybe_token.range); + if(dot_maybe_token.kind == E_TokenKind_Symbol && + ext_maybe_token.kind == E_TokenKind_Identifier && + str8_match(dot_maybe_token_string, str8_lit("."), 0)) + { + token_ext_count = 2; + } + + // rjf: look for : or ! + E_Token next_token = e_token_at_it(it+1+token_ext_count, &tokens); + String8 next_token_string = str8_substr(text, next_token.range); + if(next_token.kind == E_TokenKind_Symbol && (str8_match(next_token_string, str8_lit(":"), 0) || str8_match(next_token_string, str8_lit("!"), 0))) + { + is_qualifier = 1; + it += 2 + token_ext_count; + Rng1U64 qualifier_range = union_1u64(token.range, r1u64(token.range.min, next_token.range.min)); + if(resolution_qualifier_chain_range.max == resolution_qualifier_chain_range.min) + { + resolution_qualifier_chain_range = qualifier_range; + } + else + { + resolution_qualifier_chain_range = union_1u64(qualifier_range, resolution_qualifier_chain_range); + } + } } - - // rjf: look for : or ! - E_Token next_token = e_token_at_it(it+1+token_ext_count, &tokens); - String8 next_token_string = str8_substr(text, next_token.range); - if(next_token.kind == E_TokenKind_Symbol && (str8_match(next_token_string, str8_lit(":"), 0) || str8_match(next_token_string, str8_lit("!"), 0))) + if(!is_qualifier) { - it += 2 + token_ext_count; - resolution_qualifier = str8_substr(text, union_1u64(token.range, r1u64(token.range.min, next_token.range.min))); + resolution_qualifiers_done = 1; } } + resolution_qualifier = str8_substr(text, resolution_qualifier_chain_range); } //////////////////////// diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 17098d15..f5c65910 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -507,7 +507,8 @@ RDI_NameMapKind_Procedures = 4, RDI_NameMapKind_Types = 5, RDI_NameMapKind_LinkNameProcedures = 6, RDI_NameMapKind_NormalSourcePaths = 7, -RDI_NameMapKind_COUNT = 8, +RDI_NameMapKind_Units = 8, +RDI_NameMapKind_COUNT = 9, } RDI_NameMapKindEnum; #define RDI_Header_XList \ @@ -1010,6 +1011,7 @@ X(Procedures)\ X(Types)\ X(LinkNameProcedures)\ X(NormalSourcePaths)\ +X(Units)\ #define RDI_NameMap_XList \ X(RDI_U32, bucket_base_idx)\ diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 9178874e..d8360a3f 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9599,7 +9599,7 @@ rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 // rjf: try to map using asynchronous matching system if(!mapped && kind == TXT_TokenKind_Identifier) { - DI_Match match = di_match_from_string(string, 0, di_key_zero(), 0); + DI_Match match = di_match_from_string(string, 0, 0, 1, di_key_zero(), 0); RDI_SectionKind section_kind = match.section_kind; mapped = 1; switch(section_kind) @@ -10416,8 +10416,8 @@ rd_ipc_make_reply_ack(Arena *arena, String8 cmd, B32 ok) { String8List s = {0}; rd_ipc_reply_block_begin(arena, &s, "cmd_reply"); - rd_ipc_reply_push_b32(arena, &s, "ok", ok); - rd_ipc_reply_push (arena, &s, "cmd", cmd); + rd_ipc_reply_push_b32(arena, &s, "ok", ok); + rd_ipc_reply_push (arena, &s, "cmd", cmd); rd_ipc_reply_block_end(arena, &s); return str8_list_join(arena, &s, 0); } @@ -10428,10 +10428,10 @@ rd_ipc_make_reply_status(Arena *arena) Temp scratch = scratch_begin(&arena, 1); String8List s = {0}; rd_ipc_reply_block_begin(arena, &s, "status"); - rd_ipc_reply_push_b32 (arena, &s, "ok", 1); - rd_ipc_reply_push_b32 (arena, &s, "running", d_ctrl_targets_running()); - rd_ipc_reply_push_u64 (arena, &s, "run_gen", d_run_gen()); - rd_ipc_reply_push_u64 (arena, &s, "ip", d_ctrl_last_stop_event().rip_vaddr); + rd_ipc_reply_push_b32 (arena, &s, "ok", 1); + rd_ipc_reply_push_b32 (arena, &s, "running", d_ctrl_targets_running()); + rd_ipc_reply_push_u64 (arena, &s, "run_gen", d_run_gen()); + rd_ipc_reply_push_u64 (arena, &s, "ip", d_ctrl_last_stop_event().rip_vaddr); rd_ipc_reply_block_end(arena, &s); scratch_end(scratch); return str8_list_join(arena, &s, 0); @@ -10441,34 +10441,34 @@ internal String8 rd_ipc_make_reply_stop_event(Arena *arena) { Temp scratch = scratch_begin(&arena, 1); - + D_Event e = d_ctrl_last_stop_event(); - + String8List stop_cause_list = {0}; DR_FStrList stop_cause_fstr = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &e); for EachNode (n, DR_FStrNode, stop_cause_fstr.first) { str8_list_push(scratch.arena, &stop_cause_list, n->v.string); } String8 stop_cause = str8_list_join(arena, &stop_cause_list, &(StringJoin){.sep=str8_lit(" ")}); - + String8List s = {0}; rd_ipc_reply_block_begin(arena, &s, "stop_event"); - rd_ipc_reply_push_b32 (arena, &s, "ok", 1); - rd_ipc_reply_push_u64 (arena, &s, "arch", e.arch); - rd_ipc_reply_push_u64 (arena, &s, "vaddr_min", e.vaddr_rng.min); - rd_ipc_reply_push_u64 (arena, &s, "vaddr_max", e.vaddr_rng.max); - rd_ipc_reply_push_u64 (arena, &s, "ip_vaddr", e.rip_vaddr); - rd_ipc_reply_push_u64 (arena, &s, "sp_base", e.stack_base); - rd_ipc_reply_push_u64 (arena, &s, "tls_root", e.tls_root); - rd_ipc_reply_push_u64 (arena, &s, "tls_index", e.tls_index); - rd_ipc_reply_push_u64 (arena, &s, "tls_offset", e.tls_offset); - rd_ipc_reply_push_u64 (arena, &s, "timestamp", e.timestamp); - rd_ipc_reply_push_u64 (arena, &s, "exception_code", e.exception_code); - rd_ipc_reply_push_u64 (arena, &s, "bp_flags", e.bp_flags); - rd_ipc_reply_push_str8(arena, &s, "string", e.string); - rd_ipc_reply_push_u64 (arena, &s, "target_os", e.target_os); - rd_ipc_reply_push_u64 (arena, &s, "tls_model", e.tls_model); - rd_ipc_reply_push_str8(arena, &s, "stop_cause", stop_cause); + rd_ipc_reply_push_b32 (arena, &s, "ok", 1); + rd_ipc_reply_push_u64 (arena, &s, "arch", e.arch); + rd_ipc_reply_push_u64 (arena, &s, "vaddr_min", e.vaddr_rng.min); + rd_ipc_reply_push_u64 (arena, &s, "vaddr_max", e.vaddr_rng.max); + rd_ipc_reply_push_u64 (arena, &s, "ip_vaddr", e.rip_vaddr); + rd_ipc_reply_push_u64 (arena, &s, "sp_base", e.stack_base); + rd_ipc_reply_push_u64 (arena, &s, "tls_root", e.tls_root); + rd_ipc_reply_push_u64 (arena, &s, "tls_index", e.tls_index); + rd_ipc_reply_push_u64 (arena, &s, "tls_offset", e.tls_offset); + rd_ipc_reply_push_u64 (arena, &s, "timestamp", e.timestamp); + rd_ipc_reply_push_u64 (arena, &s, "exception_code", e.exception_code); + rd_ipc_reply_push_u64 (arena, &s, "bp_flags", e.bp_flags); + rd_ipc_reply_push_str8(arena, &s, "string", e.string); + rd_ipc_reply_push_u64 (arena, &s, "target_os", e.target_os); + rd_ipc_reply_push_u64 (arena, &s, "tls_model", e.tls_model); + rd_ipc_reply_push_str8(arena, &s, "stop_cause", stop_cause); rd_ipc_reply_block_end(arena, &s); - + String8 result = str8_list_join(arena, &s, 0); scratch_end(scratch); return result; @@ -10478,7 +10478,7 @@ internal String8 rd_ipc_make_reply_eval(Arena *arena, String8 expr, E_Eval eval, U64 cap) { Temp scratch = scratch_begin(&arena, 1); - + // gather value & type EV_StringParams string_params = { @@ -10487,23 +10487,23 @@ rd_ipc_make_reply_eval(Arena *arena, String8 expr, E_Eval eval, U64 cap) }; String8 value_string = rd_value_string_from_eval2(scratch.arena, str8_zero(), &string_params, cap, eval); String8 type_string = e_type_string_from_key(scratch.arena, eval.irtree.type_key); - + String8List errors = {0}; for EachNode(msg, E_Msg, eval.msgs.first) { str8_list_push(scratch.arena, &errors, msg->text); } String8 error_string = str8_list_join(scratch.arena, &errors, &(StringJoin){.sep = str8_lit("; ")}); - + // format reply String8List reply = {0}; rd_ipc_reply_block_begin(arena, &reply, "eval"); - rd_ipc_reply_push_b32 (arena, &reply, "ok", 1); - rd_ipc_reply_push (arena, &reply, "cmd", str8_lit("eval")); - rd_ipc_reply_push (arena, &reply, "expr", expr); - rd_ipc_reply_push (arena, &reply, "value", value_string); - rd_ipc_reply_push (arena, &reply, "type", type_string); - rd_ipc_reply_push (arena, &reply, "error", error_string); + rd_ipc_reply_push_b32 (arena, &reply, "ok", 1); + rd_ipc_reply_push (arena, &reply, "cmd", str8_lit("eval")); + rd_ipc_reply_push (arena, &reply, "expr", expr); + rd_ipc_reply_push (arena, &reply, "value", value_string); + rd_ipc_reply_push (arena, &reply, "type", type_string); + rd_ipc_reply_push (arena, &reply, "error", error_string); rd_ipc_reply_block_end(arena, &reply); String8 result = str8_list_join(arena, &reply, 0); - + scratch_end(scratch); return result; } @@ -10512,14 +10512,14 @@ internal String8 rd_ipc_make_reply_source_location_from_address(Arena *arena, U64 vaddr) { Temp scratch = scratch_begin(&arena, 1); - + D_Entity *process = d_entity_from_handle(rd_base_regs()->process); if(process == &d_entity_nil) { D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); } - + D_Entity *module = &d_entity_nil; DI_Key dbgi_key = {0}; U64 voff = 0; @@ -10539,22 +10539,22 @@ rd_ipc_make_reply_source_location_from_address(Arena *arena, U64 vaddr) { line = lines.first->v; } - + B32 is_ok = (process != &d_entity_nil && module != &d_entity_nil && lines.first != 0); - + String8List reply = {0}; rd_ipc_reply_block_begin(arena, &reply, "source_location_from_address"); - rd_ipc_reply_push_b32 (arena, &reply, "ok", is_ok); - rd_ipc_reply_push_u64 (arena, &reply, "vaddr", vaddr); - rd_ipc_reply_push_u64 (arena, &reply, "voff", voff); - rd_ipc_reply_push_str8(arena, &reply, "file_path", line.file_path); - rd_ipc_reply_push_u64 (arena, &reply, "line", line.pt.line); - rd_ipc_reply_push_u64 (arena, &reply, "column", line.pt.column); - rd_ipc_reply_push_u64 (arena, &reply, "voff_min", line.voff_range.min); - rd_ipc_reply_push_u64 (arena, &reply, "voff_max", line.voff_range.max); + rd_ipc_reply_push_b32 (arena, &reply, "ok", is_ok); + rd_ipc_reply_push_u64 (arena, &reply, "vaddr", vaddr); + rd_ipc_reply_push_u64 (arena, &reply, "voff", voff); + rd_ipc_reply_push_str8(arena, &reply, "file_path", line.file_path); + rd_ipc_reply_push_u64 (arena, &reply, "line", line.pt.line); + rd_ipc_reply_push_u64 (arena, &reply, "column", line.pt.column); + rd_ipc_reply_push_u64 (arena, &reply, "voff_min", line.voff_range.min); + rd_ipc_reply_push_u64 (arena, &reply, "voff_max", line.voff_range.max); rd_ipc_reply_block_end(arena, &reply); String8 result = str8_list_join(arena, &reply, 0); - + scratch_end(scratch); return result; } @@ -11603,6 +11603,7 @@ rd_frame(void) DbgInfoNode *order_next; DI_Key key; U64 idx; + String8 path; }; U64 dbg_info_slots_count = 4096; DbgInfoNode **dbg_info_slots = push_array(scratch.arena, DbgInfoNode *, dbg_info_slots_count); @@ -11638,6 +11639,7 @@ rd_frame(void) SLLQueuePush_N(first_dbg_info, last_dbg_info, node, order_next); node->key = key; node->idx = dbg_infos_count; + node->path = path; dbg_infos_count += 1; } } @@ -11664,6 +11666,8 @@ rd_frame(void) U64 eval_dbg_infos_count = Max(1, dbg_infos_count); E_DbgInfo *eval_dbg_infos = push_array(scratch.arena, E_DbgInfo, eval_dbg_infos_count); E_DbgInfo *eval_dbg_infos_primary = &eval_dbg_infos[0]; + E_String2NumMap *eval_dbg_info_from_name_map = push_array(scratch.arena, E_String2NumMap, 1); + eval_dbg_info_from_name_map[0] = e_string2num_map_make(scratch.arena, eval_dbg_infos_count*2); MemoryCopyStruct(eval_dbg_infos_primary, &e_dbg_info_nil); { U64 idx = 0; @@ -11671,6 +11675,9 @@ rd_frame(void) { eval_dbg_infos[idx].dbgi_key = n->key; eval_dbg_infos[idx].rdi = di_rdi_from_key(rd_state->frame_access, n->key, 0, 0); + eval_dbg_infos[idx].name = n->path; + e_string2num_map_insert(scratch.arena, eval_dbg_info_from_name_map, n->path, idx+1); + e_string2num_map_insert(scratch.arena, eval_dbg_info_from_name_map, str8_skip_last_slash(n->path), idx+1); idx += 1; } } @@ -11682,6 +11689,8 @@ rd_frame(void) U64 eval_modules_count = Max(1, all_modules.count); E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &e_module_nil; + E_String2NumMap *eval_module_from_name_map = push_array(scratch.arena, E_String2NumMap, 1); + eval_module_from_name_map[0] = e_string2num_map_make(scratch.arena, eval_modules_count*2); ProfScope("produce all eval modules") { for EachIndex(eval_module_idx, all_modules.count) @@ -11709,11 +11718,14 @@ rd_frame(void) eval_modules[eval_module_idx].arch = m->arch; eval_modules[eval_module_idx].dbg_info_num = dbg_info_num; eval_modules[eval_module_idx].space = rd_eval_space_from_ctrl_entity(d_entity_ancestor_from_kind(m, D_EntityKind_Process), D_EvalSpaceKind_Entity); + eval_modules[eval_module_idx].name = m->string; if(module == m) { eval_modules_primary = &eval_modules[eval_module_idx]; eval_dbg_infos_primary = (0 < dbg_info_num && dbg_info_num <= eval_dbg_infos_count) ? &eval_dbg_infos[dbg_info_num-1] : &e_dbg_info_nil; } + e_string2num_map_insert(scratch.arena, eval_module_from_name_map, m->string, eval_module_idx+1); + e_string2num_map_insert(scratch.arena, eval_module_from_name_map, str8_skip_last_slash(m->string), eval_module_idx+1); } } @@ -11738,14 +11750,16 @@ rd_frame(void) ctx->thread_unwind_count = unwind_count; //- rjf: fill debug infos - ctx->dbg_infos = eval_dbg_infos; - ctx->dbg_infos_count = eval_dbg_infos_count; - ctx->primary_dbg_info = eval_dbg_infos_primary; + ctx->dbg_infos = eval_dbg_infos; + ctx->dbg_infos_count = eval_dbg_infos_count; + ctx->primary_dbg_info = eval_dbg_infos_primary; + ctx->dbg_info_from_name_map = eval_dbg_info_from_name_map; //- rjf: fill modules - ctx->modules = eval_modules; - ctx->modules_count = eval_modules_count; - ctx->primary_module = eval_modules_primary; + ctx->modules = eval_modules; + ctx->modules_count = eval_modules_count; + ctx->primary_module = eval_modules_primary; + ctx->module_from_name_map = eval_module_from_name_map; //- rjf: fill space hooks ctx->space_gen = rd_eval_space_gen; @@ -14668,11 +14682,11 @@ rd_frame(void) DI_Match match = {0}; if(match.idx == 0) { - match = di_match_from_string(name, 0, e_base_ctx->primary_dbg_info->dbgi_key, rd_state->frame_eval_memread_endt_us); + match = di_match_from_string(name, 0, 0, 1, e_base_ctx->primary_dbg_info->dbgi_key, rd_state->frame_eval_memread_endt_us); } if(match.idx == 0) { - match = di_match_from_string(name, 0, di_key_zero(), rd_state->frame_eval_memread_endt_us); + match = di_match_from_string(name, 0, 0, 1, di_key_zero(), rd_state->frame_eval_memread_endt_us); } if(match.section_kind == RDI_SectionKind_Procedures) { diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index efaab158..fcf4b477 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -10,7 +10,6 @@ // [ ] memory_size(...) view for quickly evaluating memory sizes // [ ] value coloring view in watch window, so you can quickly scroll & see values outside of a threshold // -// [ ] PDB -> RDI conversion memory usage // [ ] more things should move to user data, but project-tagged - like // recent files, watches?, etc. // @@ -21,6 +20,8 @@ // [ ] many threads hitting conditional breakpoints -> causes 0x8000003 exception! // [ ] string conditional breakpoints -> size != 0 check seems to fail, can test w/ "rd_init" subprogram type gen in d2r2 // +// [ ] PDB -> RDI conversion memory usage +// //- evaluation space coverage pass // [ ] need concrete ways of referring into a space at any offset - e.g. `process.memory + 0x1234`, `file:"foo".data + 0x1234`, `thread.regs + 0x80`, etc. // [ ] memory view needs to take advantage of above when peeking; ensure peeking works on files etc. @@ -499,7 +500,7 @@ internal void entry_point(CmdLine *cmd_line) { Temp scratch = scratch_begin(0, 0); - + //- rjf: unpack command line arguments ExecMode exec_mode = ExecMode_Normal; B32 auto_run = 0; @@ -532,7 +533,7 @@ entry_point(CmdLine *cmd_line) try_u64_from_str8_c_rules(jit_addr_string, &jit_addr); jit_attach = (jit_addr != 0); } - + // init log g_logs_folder = cmd_line_string(cmd_line, str8_lit("logs")); if(g_logs_folder.size == 0) @@ -541,7 +542,7 @@ entry_point(CmdLine *cmd_line) g_logs_folder = push_str8f(scratch.arena, "%S/%Sraddbg/logs", program_data_folder_prefix_from_os(OperatingSystem_CURRENT), user_program_data_path); } make_directory(g_logs_folder); - + //- rjf: dispatch to top-level codepath based on execution mode switch(exec_mode) { diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 4952cf50..28baa269 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1347,7 +1347,8 @@ RDI_NameMapKindTable: {Types 5} {LinkNameProcedures 6} {NormalSourcePaths 7} - {COUNT 8} + {Units 8} + {COUNT 9} } @table(name type desc) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 838d217d..7006d2f1 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1410,6 +1410,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) name_maps_need_build[RDI_NameMapKind_Types] = !!(params->subset_flags & RDIM_SubsetFlag_TypeNameMap); name_maps_need_build[RDI_NameMapKind_LinkNameProcedures] = !!(params->subset_flags & RDIM_SubsetFlag_LinkNameProcedureNameMap); name_maps_need_build[RDI_NameMapKind_NormalSourcePaths] = !!(params->subset_flags & RDIM_SubsetFlag_NormalSourcePathNameMap); + name_maps_need_build[RDI_NameMapKind_Units] = !!(params->subset_flags & RDIM_SubsetFlag_Units); } RDIM_BakeNameMapTopology *bake_name_maps_tops = 0; RDIM_BakeNameMap **bake_name_maps = 0; @@ -1440,6 +1441,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Case(LinkNameProcedures, all_procedures->total_count); Case(Types, params->types.total_count); Case(NormalSourcePaths, params->src_files.total_count); + Case(Units, params->units.total_count); #undef Case } lane_maps[k] = push_array(scratch2.arena, RDIM_BakeNameMap *, lane_count()); @@ -1508,6 +1510,19 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) } } }break; + case RDI_NameMapKind_Units: + { + RDIM_UnitChunkList *units = ¶ms->units; + for EachNode(n, RDIM_UnitChunkNode, units->first) + { + Rng1U64 n_range = lane_range(n->count); + for EachInRange(n_idx, n_range) + { + RDIM_Unit *unit = &n->v[n_idx]; + rdim_bake_name_map_insert(scratch.arena, top, map, 4, unit->unit_name, rdim_idx_from_unit(unit)); + } + } + }break; } } lane_sync(); From 09afff7957ae7054d43e83fbbd868a5a02824d8d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 May 2026 17:27:21 -0700 Subject: [PATCH 674/850] improve error handling in the debugger harness (source file + line number for error reports and allow scripts without header) --- src/torture/torture.c | 61 +++++++++-- src/torture/torture.h | 18 +++- src/torture/torture_dbg.c | 215 ++++++++++++++++++++++---------------- src/torture/torture_dbg.h | 2 + 4 files changed, 193 insertions(+), 103 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index 754c05b4..66e65d64 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -14,6 +14,7 @@ global String8 g_test_data; U64 g_torture_test_count; T_Test **g_torture_tests; T_Test g_torture_tests_[0xffffff]; +B32 g_is_first_print; // invoke global U64 g_last_exit_code; @@ -159,21 +160,27 @@ internal void t_run_caller(void *raw_ctx) { Temp scratch = scratch_begin(0,0); + + g_is_first_print = 1; + T_RunCtx *ctx = raw_ctx; - String8List test_out = {0}; ctx->result.status = T_RunStatus_Pass; + + String8List test_out = {0}; ctx->run(scratch.arena, ctx->user_data, &ctx->result, &test_out); + if (ctx->result.status == T_RunStatus_Fail || ctx->result.status == T_RunStatus_Crash) { for EachNode(n, String8Node, test_out.first) { - fprintf(stderr, "%.*s", str8_varg(n->string)); + t_errorf("%S", n->string); } if (g_errors.size) { - fprintf(stderr, "stderr: \"%.*s\"\n", str8_varg(g_errors)); + t_errorf("stderr: \"%S\"\n", g_errors); } if (g_output.size) { - fprintf(stderr, "stdout: \"%.*s\"\n", str8_varg(g_output)); + t_errorf("stdout: \"%S\"\n", g_output); } } + scratch_end(scratch); } @@ -479,11 +486,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) }; str8_list_push_front(scratch.arena, &launch_opts.cmd_line, exe_path); - if (g_verbose) { - String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(" ") }); - fprintf(stdout, "Command Line: %.*s\n", str8_varg(full_cmd_line)); - fprintf(stdout, "Working Dir: %.*s\n", str8_varg(g_wdir)); - } + String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(" ") }); // invoke exe Process process_handle = process_launch(&launch_opts); @@ -757,6 +760,12 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) } #endif + t_infof("Invoke: {\n"); + t_infof(" CMDL: %S\n", full_cmd_line); + t_infof(" WDIR: %S\n", g_wdir); + t_infof(" Exit: %u\n", g_last_exit_code); + t_infof("}\n"); + // update output global g_output = str8_list_join(g_output_arena, &stdout_parts, 0); g_errors = str8_list_join(g_output_arena, &stderr_parts, 0); @@ -971,6 +980,40 @@ t_match_folders(String8 a, String8 b) return is_match; } +internal void +t_infof(char *fmt, ...) +{ + if (g_verbose) { + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 result = push_str8fv(scratch.arena, fmt, args); + if (g_is_first_print) { + g_is_first_print = 0; + fprintf(stderr, "\n"); + } + fprintf(stderr, "%.*s", str8_varg(result)); + va_end(args); + scratch_end(scratch); + } +} + +internal void +t_errorf(char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 result = push_str8fv(scratch.arena, fmt, args); + if (g_is_first_print) { + g_is_first_print = 0; + fprintf(stderr, "\n"); + } + fprintf(stderr, "%.*s", str8_varg(result)); + va_end(args); + scratch_end(scratch); +} + internal void t_entry_point(CmdLine *cmdline) { diff --git a/src/torture/torture.h b/src/torture/torture.h index 9007056c..80a5995d 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -101,7 +101,7 @@ internal void t_break_if_debugger_present(void); #define ENDT_MS(x) TIMEOUT_US((x)*1000ull) #define ENDT_SEC(x) TIMEOUT_MS((x)*1000ull) -//////////////////////////////// +//////////////////////////////////////////////////////////////// // output directory internal B32 t_write_file_list(String8 name, String8List data); @@ -115,6 +115,7 @@ internal void t_run_caller(void *raw_ctx); internal void t_run_fail_handler(void *raw_ctx); internal T_RunResult t_run(T_Run run, String8 user_data); +// tools internal String8 t_radbin_path(void); internal String8 t_cl_path(void); internal String8 t_clang_path(void); @@ -128,7 +129,20 @@ internal B32 t_invoke_cl(char *fmt, ...); internal B32 t_invoke_linkerf(char *fmt, ...); internal B32 t_invoke_radbin(char *fmt, ...); internal void t_kill_all(String8 pattern); - #define t_invoke_linker_timeout(c, t) T_Ok(t_invoke(t_radlink_path(), c, t)) #define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(arena, f, ##__VA_ARGS__), t) #define t_invoke_linker(c) t_invoke_linker_timeout(c, max_U64) + +internal void t_kill_all(String8 pattern); + +internal String8 t_chop_line(String8 *string); +internal B32 t_match_line(String8 *output, String8 expected_line); +internal B32 t_match_linef(String8 *output, char *fmt, ...); + +// files helper +internal String8List t_file_paths_from_dir(Arena *arena, String8 dir); + +// printer +internal void t_infof(char *fmt, ...); +internal void t_errorf(char *fmt, ...); + diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index e60d1591..b52c8880 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -86,15 +86,15 @@ t_dbg_status(T_DbgStatus *status_out, U64 timeout_us) if ( ! t_dbg_send_cmd(str8_lit("status"), timeout_us, scratch.arena, &reply)) { goto exit; } // parse reply - if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("ok"), &is_ok)) { fprintf(stderr, "ERROR: failed to parse reply member: ok\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("running"), &status.running)) { fprintf(stderr, "ERROR: failed to parse reply member: running\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_int(reply.msg, str8_lit("run_gen"), &status.run_gen)) { fprintf(stderr, "ERROR: failed to parse reply member: run_gen\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_int(reply.msg, str8_lit("ip"), &status.ip)) { fprintf(stderr, "ERROR: failed to parse reply member: ip\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("ok"), &is_ok)) { t_errorf("ERROR: failed to parse reply member: ok\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("running"), &status.running)) { t_errorf("ERROR: failed to parse reply member: running\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_int(reply.msg, str8_lit("run_gen"), &status.run_gen)) { t_errorf("ERROR: failed to parse reply member: run_gen\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_int(reply.msg, str8_lit("ip"), &status.ip)) { t_errorf("ERROR: failed to parse reply member: ip\n"); Assert(0); goto exit; } if (status_out != 0) { *status_out = status; } exit:; if ( ! is_ok && reply.parse.root) { - fprintf(stderr, "\tReply: %.*s\n", str8_varg(reply.parse.root->raw_string)); + t_errorf("\tReply: %S\n", reply.parse.root->raw_string); } scratch_end(scratch); return is_ok; @@ -319,10 +319,10 @@ t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) B32 is_ok = t_dbg_send_cmd(cmd, T_Dbg_DefaultTimeout, arena, &reply); T_Eval e = {0}; - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { fprintf(stderr, "ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("value"), &e.value)) { fprintf(stderr, "ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("type"), &e.type)) { fprintf(stderr, "ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("error"), &e.error)) { fprintf(stderr, "ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { t_errorf("ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("value"), &e.value)) { t_errorf("ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("type"), &e.type)) { t_errorf("ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.msg, str8_lit("error"), &e.error)) { t_errorf("ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } if (eval_out) { *eval_out = e; } exit:; @@ -346,29 +346,44 @@ t_dbg_script_program_is_before(void *raw_a, void *raw_b) return t_dbg_script_program_compar(raw_a, raw_b) < 0; } +internal String8 +t_string_from_dbg_script_cmd_kind(T_DbgScriptCmdKind v) +{ + switch (v) { + case T_DbgScriptCmdKind_Null: return str8_zero(); + case T_DbgScriptCmdKind_Breakpoint: return str8_lit("bp"); + case T_DbgScriptCmdKind_ClearBreakpoints: return str8_lit("bp_clear"); + case T_DbgScriptCmdKind_Run: return str8_lit("run"); + case T_DbgScriptCmdKind_Halt: return str8_lit("halt"); + case T_DbgScriptCmdKind_StepOver: return str8_lit("step_over"); + case T_DbgScriptCmdKind_StepInto: return str8_lit("step_into"); + case T_DbgScriptCmdKind_StepOut: return str8_lit("step_out"); + case T_DbgScriptCmdKind_StepOverInst: return str8_lit("step_over_inst"); + case T_DbgScriptCmdKind_StepIntoInst: return str8_lit("step_into_inst"); + case T_DbgScriptCmdKind_StepOverLine: return str8_lit("step_over_line"); + case T_DbgScriptCmdKind_StepIntoLine: return str8_lit("step_into_line"); + case T_DbgScriptCmdKind_KillAll: return str8_lit("kill_all"); + case T_DbgScriptCmdKind_At: return str8_lit("at"); + case T_DbgScriptCmdKind_Eval: return str8_lit("eval"); + default: InvalidPath; + } + return str8_zero(); +} + internal T_DbgScriptCmdKind t_dbg_script_cmd_kind_from_string(String8 cmd) { - if (str8_matchi(cmd, str8_lit("bp"))) { return T_DbgScriptCmdKind_Breakpoint; } - else if (str8_matchi(cmd, str8_lit("bp_clear"))) { return T_DbgScriptCmdKind_ClearBreakpoints; } - else if (str8_matchi(cmd, str8_lit("run"))) { return T_DbgScriptCmdKind_Run; } - else if (str8_matchi(cmd, str8_lit("halt"))) { return T_DbgScriptCmdKind_Halt; } - else if (str8_matchi(cmd, str8_lit("step_over"))) { return T_DbgScriptCmdKind_StepOver; } - else if (str8_matchi(cmd, str8_lit("step_into"))) { return T_DbgScriptCmdKind_StepInto; } - else if (str8_matchi(cmd, str8_lit("step_out"))) { return T_DbgScriptCmdKind_StepOut; } - else if (str8_matchi(cmd, str8_lit("step_over_inst"))) { return T_DbgScriptCmdKind_StepOverInst; } - else if (str8_matchi(cmd, str8_lit("step_into_inst"))) { return T_DbgScriptCmdKind_StepIntoInst; } - else if (str8_matchi(cmd, str8_lit("step_over_line"))) { return T_DbgScriptCmdKind_StepOverLine; } - else if (str8_matchi(cmd, str8_lit("step_into_line"))) { return T_DbgScriptCmdKind_StepIntoLine; } - else if (str8_matchi(cmd, str8_lit("at"))) { return T_DbgScriptCmdKind_At; } - else if (str8_matchi(cmd, str8_lit("eval"))) { return T_DbgScriptCmdKind_Eval; } + for EachIndex(i, T_DbgScriptCmdKind_Count) { + if (str8_matchi(t_string_from_dbg_script_cmd_kind(i), cmd)) { return i; } + } return T_DbgScriptCmdKind_Null; } -internal T_DbgScript -t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source) +internal B32 +t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgScript *script_out) { Temp scratch = scratch_begin(&arena, 1); + B32 is_ok = 0; T_DbgScript script = { .file_path = push_str8_copy(arena, file_path) }; @@ -409,43 +424,44 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source) { MD_Node *test = script_parse.root->first; AssertAlways( ! md_node_is_nil(test)); - AssertAlways(str8_matchi(test->string, str8_lit("test"))); + if (str8_matchi(test->string, str8_lit("test"))) { + for MD_EachNode(n, test->first) { + OperatingSystem os = operating_system_from_string(n->string); + AssertAlways(os != OperatingSystem_Null); - String8 os_name = string_from_operating_system(OperatingSystem_CURRENT); + for MD_EachNode(field, n->first) { + T_DbgScriptDirectiveKind kind = T_DbgScriptDirectiveKind_Null; + if (str8_matchi(field->string, str8_lit("compile"))) { kind = T_DbgScriptDirectiveKind_Compile; } + else if (str8_matchi(field->string, str8_lit("link"))) { kind = T_DbgScriptDirectiveKind_Link; } + else if (str8_matchi(field->string, str8_lit("launch"))) { kind = T_DbgScriptDirectiveKind_Launch; } + AssertAlways(kind != T_DbgScriptDirectiveKind_Null); - for MD_EachNode(n, test->first) { - OperatingSystem os = operating_system_from_string(n->string); - AssertAlways(os != OperatingSystem_Null); + // syntax check + AssertAlways( !md_node_is_nil(field->first)); + AssertAlways(md_node_is_nil(field->first->next)); + Assert(field->first->flags & MD_NodeFlag_StringLiteral); - for MD_EachNode(field, n->first) { - T_DbgScriptDirectiveKind kind = T_DbgScriptDirectiveKind_Null; - if (str8_matchi(field->string, str8_lit("compile"))) { kind = T_DbgScriptDirectiveKind_Compile; } - else if (str8_matchi(field->string, str8_lit("link"))) { kind = T_DbgScriptDirectiveKind_Link; } - else if (str8_matchi(field->string, str8_lit("launch"))) { kind = T_DbgScriptDirectiveKind_Launch; } - AssertAlways(kind != T_DbgScriptDirectiveKind_Null); + // src_offset -> line + // + // TODO: super silly!! mdesk should export line numbers + U64 line = 1; + String8 text_before_src = str8_prefix(source, field->src_offset); + for EachIndex(idx, text_before_src.size) { line += (text_before_src.str[idx] == '\n'); } - // syntax check - AssertAlways( !md_node_is_nil(field->first)); - AssertAlways(md_node_is_nil(field->first->next)); - Assert(field->first->flags & MD_NodeFlag_StringLiteral); + T_DbgScriptDirective *n = push_array(arena, T_DbgScriptDirective, 1); + n->kind = kind; + n->line = line; + n->args = str8_copy(arena, field->first->string); + // TODO: expand % in compile: and link: to current source file name and esacpe with %% - // src_offset -> line - // - // TODO: super silly!! mdesk should export line numbers - U64 line = 1; - String8 text_before_src = str8_prefix(source, field->src_offset); - for EachIndex(idx, text_before_src.size) { line += (text_before_src.str[idx] == '\n'); } - - T_DbgScriptDirective *n = push_array(arena, T_DbgScriptDirective, 1); - n->kind = kind; - n->line = line; - n->args = str8_copy(arena, field->first->string); - // TODO: expand % in compile: and link: to current source file name and esacpe with %% - - T_DbgScriptDirectiveList *list = &script.directives[os][kind]; - SLLQueuePush(list->first, list->last, n); - list->count += 1; + T_DbgScriptDirectiveList *list = &script.directives[os][kind]; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + } } + } else { + t_errorf("ERROR: %S: missing test header\n", file_path); + goto exit; } } @@ -523,28 +539,28 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source) p->file = file; hash_table_push_u64_raw(scratch.arena, ht, order, p); } else { - fprintf(stderr, "ERROR: duplicate order number %llu found on line %llu\n", (unsigned long long)order, (unsigned long long)p->line); + t_errorf("ERROR: duplicate order number %llu found on line %llu\n", (unsigned long long)order, (unsigned long long)p->line); } - MD_Node *cmd_name = n->first; - MD_Node *cmd_arg = cmd_name->first; - AssertAlways(!md_node_is_nil(cmd_name)); + for MD_EachNode(cmd_n, n->first) { + // push new cmd + T_DbgScriptCmd *cmd = push_array(arena, T_DbgScriptCmd, 1); + cmd->kind = t_dbg_script_cmd_kind_from_string(cmd_n->string); + cmd->line = line; + Assert(cmd->kind != T_DbgScriptCmdKind_Null); + SLLQueuePush(p->first, p->last, cmd); + p->count += 1; - // push new cmd - T_DbgScriptCmd *cmd = push_array(arena, T_DbgScriptCmd, 1); - cmd->kind = t_dbg_script_cmd_kind_from_string(cmd_name->string); - AssertAlways(cmd->kind != T_DbgScriptCmdKind_Null); - SLLQueuePush(p->first, p->first, cmd); - p->count += 1; - - // parse cmd args - if ( ! md_node_is_nil(cmd_arg)) { - if (cmd->kind == T_DbgScriptCmdKind_At) { - AssertAlways(try_s64_from_str8_c_rules(cmd_arg->string, &cmd->at.delta)); - } else if (cmd->kind == T_DbgScriptCmdKind_Eval) { - NotImplemented; - } else if (cmd->kind == T_DbgScriptCmdKind_Breakpoint) { - NotImplemented; + // parse cmd args + MD_Node *cmd_arg = cmd_n->first; + if ( ! md_node_is_nil(cmd_arg)) { + if (cmd->kind == T_DbgScriptCmdKind_At) { + AssertAlways(try_s64_from_str8_c_rules(cmd_arg->string, &cmd->at.delta)); + } else if (cmd->kind == T_DbgScriptCmdKind_Eval) { + NotImplemented; + } else if (cmd->kind == T_DbgScriptCmdKind_Breakpoint) { + NotImplemented; + } } } } @@ -555,8 +571,13 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source) radsort(script.programs, script.program_count, t_dbg_script_program_is_before); } + is_ok = 1; + exit:; + if (script_out) { + *script_out = script; + } scratch_end(scratch); - return script; + return is_ok; } internal B32 @@ -571,6 +592,8 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) if (program->os == OperatingSystem_CURRENT) { for EachNode(cmd, T_DbgScriptCmd, program->first) { + t_infof("[%llu] Command: %S:%llu %S\n", program->order, script->file_path, (unsigned long long)cmd->line, t_string_from_dbg_script_cmd_kind(cmd->kind)); + switch (cmd->kind) { case T_DbgScriptCmdKind_Null: break; case T_DbgScriptCmdKind_Halt: t_dbg_send_cmd_and_wait_stop(str8_lit("halt"), timeout_us); break; // NOTE: does not auto-magically select main thread on stop @@ -597,7 +620,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) #else T_DbgStatus temp_status = {0}; if ( ! t_dbg_status(&temp_status, T_Dbg_DefaultTimeout)) { - fprintf(stderr, "ERROR: failed to query IP\n"); + t_errorf("ERROR: %S:%llu: failed to query IP\n", script->file_path, (unsigned long long)cmd->line); goto exit; } U64 ip = temp_status.ip; @@ -606,7 +629,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) // map IP -> source location T_DbgSourceLocation loc = {0}; if (t_dbg_src_line(scratch.arena, ip, &loc, T_Dbg_DefaultTimeout) == 0) { - fprintf(stderr, "ERROR: failed to map IP (0x%llx) to source location\n", (unsigned long long)ip); + t_errorf("ERROR: %S:%llu: IP (0x%llx) does not map to a source line\n", script->file_path, (unsigned long long)cmd->line, (unsigned long long)ip); goto exit; } @@ -619,11 +642,10 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) B32 mismatch = loc.pt.line != at_line_u64 || !str8_match(loc.file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); if (mismatch) { - fprintf(stderr, "ERROR: location check did not pass:\n"); - fprintf(stderr, " Script : %.*s\n", str8_varg(script->file_path)); - fprintf(stderr, " Expected: %.*s:%llu\n", str8_varg(program->file->path), (unsigned long long)at_line_u64); - fprintf(stderr, " Got : %.*s:%llu\n", str8_varg(loc.file_path), (unsigned long long)loc.pt.line); - fprintf(stderr, " IP : 0x%llx\n", (unsigned long long)ip); + t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, (unsigned long long)cmd->line); + t_errorf(" Expected: %S:%llu\n", program->file->path, (unsigned long long)at_line_u64); + t_errorf(" Got : %S:%llu\n", loc.file_path, (unsigned long long)loc.pt.line); + t_errorf(" IP : 0x%llx\n", (unsigned long long)ip); goto exit; } } break; @@ -645,24 +667,27 @@ internal T_RunSig(dbg_script_runner) { if ( ! file_path_exists(t_raddbg_path())) { - fprintf(stderr, "ERROR: failed to find debugger \"%.*s\"\n", str8_varg(t_raddbg_path())); + t_errorf("ERROR: failed to find debugger \"%S\"\n", t_raddbg_path()); T_Ok(0); } // read source file String8 source = data_from_file_path(arena, user_data); if (source.size == 0) { - fprintf(stderr, "ERROR: failed to read script: \"%.*s\"\n", str8_varg(user_data)); + t_errorf("ERROR: failed to read script: \"%S\"\n", user_data); T_Ok(0); } // source -> script - T_DbgScript script = t_dbg_script_from_source(arena, user_data, source); + T_DbgScript script = {0}; + if ( ! t_dbg_script_from_source(arena, user_data, source, &script)) { + goto exit; + } // write source files to test folder for EachNode(file, T_DbgScriptFile, script.files.first) { if (write_data_to_file_path(file->path, file->source) == 0) { - fprintf(stderr, "ERROR: %.*s:%llu: failed to write: \"%.*s\"\n", str8_varg(user_data), (unsigned long long)file->line, str8_varg(file->path)); + t_errorf("ERROR: %S:%llu: failed to write: \"%S\"\n", user_data, (unsigned long long)file->line, file->path); T_Ok(0); } } @@ -695,11 +720,11 @@ T_RunSig(dbg_script_runner) // invoke compiler with arguments from directive String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); if (t_invoke(compiler_path, expanded_args, max_U64) == 0) { - fprintf(stderr, "ERROR: failed to launch compiler: \"%.*s %.*s\"\n", str8_varg(compiler_path), str8_varg(expanded_args)); + t_errorf("ERROR: failed to launch compiler: \"%S %S\"\n", compiler_path, expanded_args); T_Ok(0); } if (g_last_exit_code) { - fprintf(stderr, "ERROR: %.*s\n", str8_varg(g_output)); + t_errorf("ERROR: %S:%llu: %S\n", script.file_path, (unsigned long long)directive->line, g_errors); if (g_stop_on_first_fail_or_crash) { T_Ok(0); } @@ -711,7 +736,11 @@ T_RunSig(dbg_script_runner) for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Link].first) { String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); if (t_invoke(linker_path, expanded_args, max_U64) == 0) { - fprintf(stderr, "ERROR: failed to launch linker: \"%.*s %.*s\"\n", str8_varg(linker_path), str8_varg(expanded_args)); + t_errorf("ERROR: failed to launch linker: \"%S %S\"\n", linker_path, expanded_args); + T_Ok(0); + } + if (g_last_exit_code != 0) { + t_errorf("ERROR: %S:%llu: %S\n", script.file_path, (unsigned long long)directive->line, g_errors); T_Ok(0); } } @@ -721,14 +750,14 @@ T_RunSig(dbg_script_runner) String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); String8 cmdl = str8f(arena, "--user:%S.raddbg_user %S", t_make_file_path(arena, str8_lit("temp")), expanded_args); if (t_dbg_launch(cmdl, T_Dbg_DefaultTimeout) == 0) { - fprintf(stderr, "ERROR: failed to launch debugger with command line \"%.*s %.*s\"; work dir \"%.*s\"\n", str8_varg(t_raddbg_path()), str8_varg(cmdl), str8_varg(g_wdir)); + t_errorf("ERROR: failed to launch debugger with command line \"%S %S\"; work dir \"%S\"\n", t_raddbg_path(), cmdl, g_wdir); T_Ok(0); } } // debugger is ready -- now invoke script if (t_dbg_script_invoke(&script, T_Dbg_DefaultTimeout) == 0) { - fprintf(stderr, "ERROR: %.*s: failed to run to completion\n", str8_varg(user_data)); + t_errrof("ERROR: %S: failed to run to completion\n", user_data); T_Ok(0); } @@ -742,6 +771,8 @@ T_RunSig(dbg_script_runner) #else kill(g_dbg_pid, SIGKILL); #endif + + exit:; g_dbg_pid = 0; } @@ -751,7 +782,7 @@ t_dbg_register_script_tests(Arena *arena, String8 folder_path) Temp scratch = scratch_begin(&arena, 1); if ( ! folder_path_exists(folder_path)) { - fprintf(stderr, "ERROR: this folder does not exists: %.*s\n", str8_varg(folder_path)); + t_errof("ERROR: this folder does not exists: %S\n", folder_path); return; } diff --git a/src/torture/torture_dbg.h b/src/torture/torture_dbg.h index 85366d9b..c61f878d 100644 --- a/src/torture/torture_dbg.h +++ b/src/torture/torture_dbg.h @@ -38,6 +38,7 @@ typedef enum T_DbgScriptCmdKind_KillAll, T_DbgScriptCmdKind_At, T_DbgScriptCmdKind_Eval, + T_DbgScriptCmdKind_Count } T_DbgScriptCmdKind; typedef struct T_DbgScriptCmd @@ -107,6 +108,7 @@ typedef struct T_DbgScriptFileList files; U64 program_count; T_DbgScriptProgram **programs; + B32 skip; } T_DbgScript; //////////////////////////////// From 79cb6c3c5e316a6c8dac3183615bec7a16133796 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 May 2026 17:28:06 -0700 Subject: [PATCH 675/850] step into tests --- .../dbg_tests/step_into_lazy_module_func.c | 40 +++++++++++++++++++ .../dbg_tests/step_into_static_module_func.c | 37 +++++++++++++++++ src/torture/torture_dbg.c | 4 +- 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/torture/dbg_tests/step_into_lazy_module_func.c create mode 100644 src/torture/dbg_tests/step_into_static_module_func.c diff --git a/src/torture/dbg_tests/step_into_lazy_module_func.c b/src/torture/dbg_tests/step_into_lazy_module_func.c new file mode 100644 index 00000000..07a6b089 --- /dev/null +++ b/src/torture/dbg_tests/step_into_lazy_module_func.c @@ -0,0 +1,40 @@ +// TODO: step into alg needs to detect that it is about to step into a thunk and place breakpoint, respective to OS, +// where thunk calls into resolved function +// +// test: { +// windows: { +// compile: "/Od /Z7 /c main.c module.c" +// link: "/fixed /debug:full /dll module.obj" +// link: "/fixed /debug:full /entry:main kernel32.lib module.lib delayimp.lib main.obj /out:main.exe /delayload:module.dll /incremental:no" +// launch: "main.exe" +// } +// linux: { +// compile: "-O0 -g module.c -fPIC -shared -o libmodule.so" +// compile: "-O0 -g main.c -L. -lmodule -o main -Wl,-rpath,%CWD%" +// launch: "./main" +// } +// } +// + +/// file: "module.c" + +#if _WIN32 +__declspec(dllexport) +#endif +int foo(int a) +{ /// 6: { at, run } + return a + 1; +} + +/// file: "main.c" + +#if _WIN32 +__declspec(dllimport) +#endif +int foo(); + +int main() +{ /// 1: { step_into, at, step_over } + foo(123); /// 2: { at, step_into } +} + diff --git a/src/torture/dbg_tests/step_into_static_module_func.c b/src/torture/dbg_tests/step_into_static_module_func.c new file mode 100644 index 00000000..0c3f4937 --- /dev/null +++ b/src/torture/dbg_tests/step_into_static_module_func.c @@ -0,0 +1,37 @@ +/// test: { +/// windows: { +/// compile: "/Od /Z7 /c main.c module.c" +/// link: "/fixed /debug:full /dll module.obj" +/// link: "/fixed /debug:full module.lib main.obj /out:main.exe /incremental:no" +/// launch: "main.exe" +/// } +/// linux: { +/// compile: "-O0 -g module.c -fPIC -shared -o libmodule.so" +/// compile: "-O0 -g main.c -L. -lmodule -o main -Wl,-rpath,%CWD%,-z,now -fno-plt" +/// launch: "./main" +/// } +/// } +/// + +/// file: "module.c" + +#if _WIN32 +__declspec(dllexport) +#endif +int foo(int a) +{ /// 3: at + return a + 1; +} + +/// file: "main.c" + +#if _WIN32 +__declspec(dllimport) +#endif +int foo(); + +int main() +{ /// 1: { step_into, at, step_over } + foo(123); /// 2: { at, step_into } +} + diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index b52c8880..6472810f 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -757,7 +757,7 @@ T_RunSig(dbg_script_runner) // debugger is ready -- now invoke script if (t_dbg_script_invoke(&script, T_Dbg_DefaultTimeout) == 0) { - t_errrof("ERROR: %S: failed to run to completion\n", user_data); + t_errorf("ERROR: %S: failed to run to completion\n", user_data); T_Ok(0); } @@ -782,7 +782,7 @@ t_dbg_register_script_tests(Arena *arena, String8 folder_path) Temp scratch = scratch_begin(&arena, 1); if ( ! folder_path_exists(folder_path)) { - t_errof("ERROR: this folder does not exists: %S\n", folder_path); + t_errorf("ERROR: this folder does not exists: %S\n", folder_path); return; } From e637149ae3a43cc7e059a022fe77b9cb5af5798d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 May 2026 17:53:52 -0700 Subject: [PATCH 676/850] broadcasting a stack pointer and then leaving scope in optimized mode may cause use-after-free --- src/rdi_make/rdi_make_local.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 7006d2f1..b40298f9 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -2281,6 +2281,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) radsort(keys, map->line_count, rdim_sort_key_is_before); } } + lane_sync(); } ////////////////////////////////////////////////////////////// From b2318803a194864c082da82a86e442a48f307743 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 May 2026 17:56:10 -0700 Subject: [PATCH 677/850] report radbin errors --- src/torture/torture_d2r.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 1382ed41..bdc43c3d 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -11,6 +11,8 @@ internal RDI_Parsed * d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) { Temp scratch = scratch_begin(&arena, 1); + + RDI_Parsed *rdi = push_array(arena, RDI_Parsed, 1); String8 raw_coff; { @@ -33,15 +35,18 @@ d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) Assert(was_pdb_deleted); t_invoke(t_radbin_path(), str8_lit("-rdi a.exe -out:a.rdi"), max_U64); - Assert(g_last_exit_code == 0); + if (g_last_exit_code != 0) { + t_errorf("ERROR: failed to invoke radbin: %S\n", g_errors); + goto exit; + } String8 raw_rdi = t_read_file(arena, str8_lit("a.rdi")); Assert(raw_rdi.size > 0); - RDI_Parsed *rdi = push_array(arena, RDI_Parsed, 1); RDI_ParseStatus rdi_parse_status = rdi_parse(raw_rdi.str, raw_rdi.size, rdi); Assert(rdi_parse_status == RDI_ParseStatus_Good); + exit:; scratch_end(scratch); return rdi; } From eb90ddc739172182d1ac7bace2da9947880d3c31 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 20 May 2026 17:59:19 -0700 Subject: [PATCH 678/850] remove eval_compiler_basics --- src/torture/torture_eval.c | 105 ------------------------------------- src/torture/torture_main.c | 1 - 2 files changed, 106 deletions(-) delete mode 100644 src/torture/torture_eval.c diff --git a/src/torture/torture_eval.c b/src/torture/torture_eval.c deleted file mode 100644 index 617974b7..00000000 --- a/src/torture/torture_eval.c +++ /dev/null @@ -1,105 +0,0 @@ -#define T_Group "eval" - -TEST(eval_compiler_basics) -{ - E_Cache *eval_cache = e_cache_alloc(); - e_select_cache(eval_cache); - E_BaseCtx *base_ctx = push_array(arena, E_BaseCtx, 1); - e_select_base_ctx(base_ctx); - E_IRCtx *ir_ctx = push_array(arena, E_IRCtx, 1); - e_select_ir_ctx(ir_ctx); - E_InterpretCtx *interpret_ctx = push_array(arena, E_InterpretCtx, 1); - e_select_interpret_ctx(interpret_ctx, 0, 0); - - String8 exprs[] = - { - str8_lit("123"), - str8_lit("1 + 2"), - str8_lit("foo"), - str8_lit("foo(bar)"), - str8_lit("foo(bar(baz))"), - }; - String8List logs = {0}; - for EachElement(idx, exprs) - { - String8 log = e_debug_log_from_expr_string(arena, exprs[idx]); - str8_list_push(arena, &logs, log); - } - String8 log = str8_list_join(arena, &logs, 0); - - String8 expected_log = str8_lit( -"`123`\n" -" tokens:\n" -" Numeric: `123`\n" -" expr:\n" -" LeafU64 (123)\n" -" type:\n" -" int32\n" -" ir_tree:\n" -" ConstU8 (123)\n" -"\n" -"`1 + 2`\n" -" tokens:\n" -" Numeric: `1`\n" -" Symbol: `+`\n" -" Numeric: `2`\n" -" expr:\n" -" Add\n" -" LeafU64 (1)\n" -" LeafU64 (2)\n" -" type:\n" -" int32\n" -" ir_tree:\n" -" Add (1026)\n" -" ConstU8 (1)\n" -" ConstU8 (2)\n" -"\n" -"`foo`\n" -" tokens:\n" -" Identifier: `foo`\n" -" expr:\n" -" LeafIdentifier (`foo`)\n" -" type:\n" -" ir_tree:\n" -" Stop\n" -"\n" -"`foo(bar)`\n" -" tokens:\n" -" Identifier: `foo`\n" -" Symbol: `(`\n" -" Identifier: `bar`\n" -" Symbol: `)`\n" -" expr:\n" -" Call\n" -" LeafIdentifier (`foo`)\n" -" LeafIdentifier (`bar`)\n" -" type:\n" -" ir_tree:\n" -" Stop\n" -"\n" -"`foo(bar(baz))`\n" -" tokens:\n" -" Identifier: `foo`\n" -" Symbol: `(`\n" -" Identifier: `bar`\n" -" Symbol: `(`\n" -" Identifier: `baz`\n" -" Symbol: `)`\n" -" Symbol: `)`\n" -" expr:\n" -" Call\n" -" LeafIdentifier (`foo`)\n" -" Call\n" -" LeafIdentifier (`bar`)\n" -" LeafIdentifier (`baz`)\n" -" type:\n" -" ir_tree:\n" -" Stop\n" -"\n" -); - - T_Ok(str8_match(log, expected_log, 0)); -} - -#undef T_Group - diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 4017869d..04f3ba3e 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -172,7 +172,6 @@ #include "torture_dwarf.c" #include "torture_d2r.c" #include "torture_p2r.c" -#include "torture_eval.c" #include "torture_dbg.c" internal B32 frame(void) { return 0; } From 1c29112e9cc53b917803099332e352891c05a246 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 20 May 2026 19:17:11 -0700 Subject: [PATCH 679/850] first pass at per-target output log labels --- project.4coder | 2 +- project.raddbg | 12 +-- src/dbg_engine/dbg_engine.mdesk | 1 + src/dbg_engine/dbg_engine_core.c | 3 +- src/dbg_engine/dbg_engine_core.h | 2 + src/dbg_engine/dbg_engine_ctrl.c | 32 +++++-- src/dbg_engine/dbg_engine_user.c | 20 +--- src/dbg_engine/dbg_engine_user.h | 4 +- src/dbg_engine/generated/dbg_engine.meta.c | 6 +- src/dbg_engine/generated/dbg_engine.meta.h | 5 +- src/eval/eval_core.h | 1 + src/raddbg/generated/raddbg.meta.c | 5 +- src/raddbg/generated/raddbg.meta.h | 2 +- src/raddbg/raddbg.mdesk | 2 + src/raddbg/raddbg_core.c | 103 +++++++++++++++++---- src/win32/demon/win32_demon.c | 22 ++++- 16 files changed, 161 insertions(+), 61 deletions(-) diff --git a/project.4coder b/project.4coder index dae43a1f..e793b63f 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 74ff8bda..4019e3e2 100644 --- a/project.raddbg +++ b/project.raddbg @@ -6,6 +6,7 @@ target: executable: "build/raddbg.exe" working_directory: build arguments: "--user:raddbg_test.user --project:raddbg_test.project" + enabled: 1 } target: { @@ -26,14 +27,13 @@ target: } target: { - executable: "build/raddbg.exe" - working_directory: "build/dwarf" - arguments: "--bin --rdi a.exe" + executable: "build/radbin.exe" + working_directory: build + arguments: "--rdi chrome.dll.pdb --capture" } target: { executable: "build/radbin.exe" - working_directory: "build/" - enabled: 1 - arguments: "--rdi chrome.dll.pdb" + working_directory: build + arguments: "--rdi raddbg.pdb" } diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 61e65300..1114816d 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -104,6 +104,7 @@ D_EntityKindTable: {Thread thread "Thread" } {Module module "Module" } {EntryPoint entry_point "Entry Point" } + {LaunchMsgID launch_msg_id "Launch Message ID" } {DebugInfoPath debug_info_path "Debug Info Path" } {PendingThreadName pending_thread_name "Pending Thread Name" } {PendingThreadColor pending_thread_color "Pending Thread Color" } diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 652379e8..dbf192bb 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -86,8 +86,7 @@ d_init(void) d_user_state = push_array(arena, D_UserState, 1); d_user_state->arena = arena; d_user_state->cmds_arena = arena_alloc(); - d_user_state->output_log_key = c_key_make(c_root_alloc(), c_id_make(0, 0)); - c_submit_data(d_user_state->output_log_key, 0, str8_zero()); + d_user_state->output_log_root = c_root_alloc(); d_user_state->ctrl_entity_store = d_entity_ctx_rw_store_alloc(); d_user_state->ctrl_stop_arena = arena_alloc(); d_user_state->ctrl_msg_arena = arena_alloc(); diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 74c991da..d9676383 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -140,6 +140,7 @@ struct D_Entity U64 tls_index; U64 tls_offset; OperatingSystem target_os; + D_MsgID src_msg_id; }; typedef struct D_EntityNode D_EntityNode; @@ -248,6 +249,7 @@ struct D_Target String8 stdout_path; String8 stderr_path; String8 stdin_path; + D_MsgID msg_id; B32 debug_subprocesses; String8List env; }; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 7314c462..12cdba0b 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1302,6 +1302,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) D_Entity *process = d_entity_alloc(store, machine, D_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); process->tls_model = event->tls_model; process->target_os = event->target_os; + process->src_msg_id = event->msg_id; d_entity_equip_string(store, process, event->string); } }break; @@ -1314,7 +1315,8 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) entry = next) { next = entry->next; - if(entry->kind == D_EntityKind_EntryPoint && entry->id == process->id) + if(entry->id == process->id && + (entry->kind == D_EntityKind_EntryPoint || entry->kind == D_EntityKind_LaunchMsgID)) { d_entity_release(store, entry); } @@ -4536,9 +4538,21 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D default:{}break; case DMN_EventKind_CreateProcess: { + D_MsgID msg_id = 0; + for(D_Entity *entry = d_ctrl_state->ctrl_thread_entity_store->ctx.root->first; + entry != &d_entity_nil; + entry = entry->next) + { + if(entry->id == event->code && entry->kind == D_EntityKind_LaunchMsgID) + { + msg_id = entry->src_msg_id; + d_entity_release(d_ctrl_state->ctrl_thread_entity_store, entry); + break; + } + } D_Event *out_evt = d_event_list_push(scratch.arena, &evts); out_evt->kind = D_EventKind_NewProc; - out_evt->msg_id = msg->msg_id; + out_evt->msg_id = msg_id; out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; @@ -5081,15 +5095,21 @@ d_ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) file_close(stderr_handle); file_close(stdin_handle); - //- rjf: record (id -> entry points), so that we know custom entry points for this PID + //- rjf: record (id -> entry points), and (id -> msg_id) so that we know custom entry points for this PID D_EntityCtxRWStore *entity_ctx_rw_store = d_ctrl_state->ctrl_thread_entity_store; MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) { for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) { - String8 string = n->string; - D_Entity *entry = d_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, D_EntityKind_EntryPoint, Arch_Null, d_handle_zero(), (U64)id); - d_entity_equip_string(entity_ctx_rw_store, entry, string); + { + String8 string = n->string; + D_Entity *entry = d_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, D_EntityKind_EntryPoint, Arch_Null, d_handle_zero(), (U64)id); + d_entity_equip_string(entity_ctx_rw_store, entry, string); + } + { + D_Entity *entry = d_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, D_EntityKind_LaunchMsgID, Arch_Null, d_handle_zero(), (U64)id); + entry->src_msg_id = msg->msg_id; + } } } diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index ae1f5d13..c520e007 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -377,7 +377,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) rng1u64_list_push(scratch.arena, &all_vaddr_ranges_on_same_line, vaddr_range); } } - + // extend trap-net range across contiguous same-source-line, possibly unsorted, ranges // // TODO: @ns: converter should never produce these ranges in the first place, @@ -1628,23 +1628,6 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P d_user_state->ctrl_last_stop_event.string = push_str8_copy(d_user_state->ctrl_stop_arena, d_user_state->ctrl_last_stop_event.string); } }break; - - case D_EventKind_NewProc: - { - // rjf: the first process? -> clear session output - D_EntityArray existing_processes = d_entity_array_from_kind(D_EntityKind_Process); - if(existing_processes.count == 1) - { - MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; - mtx_push_op(d_user_state->output_log_key, op); - } - }break; - - case D_EventKind_DebugString: - { - MTX_Op op = {r1u64(max_U64, max_U64), event->string}; - mtx_push_op(d_user_state->output_log_key, op); - }break; } log_infof("}\n\n"); } @@ -1822,6 +1805,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: push message to launch { D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); + msg->msg_id = target->msg_id; msg->kind = D_MsgKind_Launch; msg->path = str8_copy(scratch.arena, working_directory); msg->cmd_line_string_list = str8_list_copy(scratch.arena, &cmdln_strings); diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index eac970b6..5bffd3f4 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -344,8 +344,8 @@ struct D_UserState Arena *cmds_arena; D_CmdList cmds; - // rjf: output log key - C_Key output_log_key; + // rjf: output log root + C_Root output_log_root; // rjf: per-run caches U64 tls_base_cache_reggen_idx; diff --git a/src/dbg_engine/generated/dbg_engine.meta.c b/src/dbg_engine/generated/dbg_engine.meta.c index 2d300773..e322fded 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.c +++ b/src/dbg_engine/generated/dbg_engine.meta.c @@ -4,7 +4,7 @@ //- GENERATED CODE C_LINKAGE_BEGIN -String8 d_entity_kind_code_name_table[12] = +String8 d_entity_kind_code_name_table[13] = { {0}, str8_lit_comp("root"), @@ -13,6 +13,7 @@ str8_lit_comp("process"), str8_lit_comp("thread"), str8_lit_comp("module"), str8_lit_comp("entry_point"), +str8_lit_comp("launch_msg_id"), str8_lit_comp("debug_info_path"), str8_lit_comp("pending_thread_name"), str8_lit_comp("pending_thread_color"), @@ -20,7 +21,7 @@ str8_lit_comp("breakpoint"), str8_lit_comp("address_range_annotation"), }; -String8 d_entity_kind_display_string_table[12] = +String8 d_entity_kind_display_string_table[13] = { {0}, str8_lit_comp("Root"), @@ -29,6 +30,7 @@ str8_lit_comp("Process"), str8_lit_comp("Thread"), str8_lit_comp("Module"), str8_lit_comp("EntryPoint"), +str8_lit_comp("LaunchMsgID"), str8_lit_comp("DebugInfoPath"), str8_lit_comp("PendingThreadName"), str8_lit_comp("PendingThreadColor"), diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index 31d446fe..d6983b68 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -54,6 +54,7 @@ D_EntityKind_Process, D_EntityKind_Thread, D_EntityKind_Module, D_EntityKind_EntryPoint, +D_EntityKind_LaunchMsgID, D_EntityKind_DebugInfoPath, D_EntityKind_PendingThreadName, D_EntityKind_PendingThreadColor, @@ -127,8 +128,8 @@ struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] = {&DEV_updating_indicator, str8_lit_comp("updating_indicator")}, }; C_LINKAGE_BEGIN -extern String8 d_entity_kind_code_name_table[12]; -extern String8 d_entity_kind_display_string_table[12]; +extern String8 d_entity_kind_code_name_table[13]; +extern String8 d_entity_kind_display_string_table[13]; extern U32 d_exception_code_kind_code_table[38]; extern String8 d_exception_code_kind_display_string_table[38]; extern String8 d_exception_code_kind_lowercase_code_string_table[38]; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 3108cdbc..925f48f9 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -74,6 +74,7 @@ enum E_IRExtKind_Bytecode = RDI_EvalOp_COUNT, E_IRExtKind_SetSpace, E_IRExtKind_SetBaseOff, + E_IRExtKind_SetTLSOff, E_IRExtKind_COUNT }; diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 176d3d8e..07150263 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[360] = +RD_VocabInfo rd_vocab_info_table[361] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -176,6 +176,7 @@ RD_VocabInfo rd_vocab_info_table[360] = {str8_lit_comp("path"), str8_lit_comp(""), str8_lit_comp("Path"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("guid"), str8_lit_comp(""), str8_lit_comp("GUID"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("peek_type"), str8_lit_comp("peek_types"), str8_lit_comp("Peek Type"), str8_lit_comp("Peek Types"), RD_IconKind_Null}, +{str8_lit_comp("output_label"), str8_lit_comp("output_labels"), str8_lit_comp("Output Label"), str8_lit_comp("Output Labels"), RD_IconKind_List}, {str8_lit_comp("launch_and_run"), str8_lit_comp(""), str8_lit_comp("Launch and Run"), str8_lit_comp(""), RD_IconKind_Play}, {str8_lit_comp("launch_and_step_into"), str8_lit_comp(""), str8_lit_comp("Launch and Step Into"), str8_lit_comp(""), RD_IconKind_PlayStepForward}, {str8_lit_comp("kill"), str8_lit_comp(""), str8_lit_comp("Kill"), str8_lit_comp(""), RD_IconKind_X}, @@ -456,7 +457,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[39] = {str8_lit_comp("color"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\n 'expression': expr_string,\n}\n")}, {str8_lit_comp("geo3d"), 1, str8_lit_comp("@inherit(tab) x:\n{\n @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\n 'expression': expr_string,\n 'count': expr_string,\n 'vtx': expr_string,\n 'vtx_size': expr_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, {str8_lit_comp("getting_started"), 0, str8_lit_comp("@inherit(tab) x:\n{\n}\n")}, -{str8_lit_comp("target"), 0, str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': set,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, +{str8_lit_comp("target"), 0, str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n @default(\"output\") 'output_label': code_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': set,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, {str8_lit_comp("breakpoint"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\nx:\n{\n 'label': code_string,\n 'condition': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n 'hit_count': u64,\n 'address_range_size': @or(0, 1, 2, 4, 8) u64,\n 'break_on_write': bool,\n 'break_on_read': bool,\n 'break_on_execute': bool,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, {str8_lit_comp("watch_pin"), 0, str8_lit_comp("@row_commands(duplicate_cfg, remove_cfg)\n@collection_commands(add_watch_pin, toggle_watch_pin)\nx:\n{\n 'expression': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n}\n")}, {str8_lit_comp("debug_info"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @query 'guid': string,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index a8b6ab71..1440f4db 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -603,7 +603,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[360]; +extern RD_VocabInfo rd_vocab_info_table[361]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 08d4c374..273c78c3 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -201,6 +201,7 @@ RD_VocabTable: {path "" "Path" "" FileOutline } {guid "" "GUID" "" Null } {peek_type _ "Peek Type" _ Null } + {output_label _ "Output Label" _ List } } @struct RD_VocabInfo: @@ -707,6 +708,7 @@ RD_VocabTable: 'arguments': string, 'working_directory': path, 'entry_point': expr_string, + @default("output") 'output_label': code_string, 'stdout_path': @no_relativize path, 'stderr_path': @no_relativize path, 'stdin_path': @no_relativize path, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index d8360a3f..43163711 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -270,6 +270,7 @@ rd_target_from_cfg(Arena *arena, CFG_Node *cfg) target.stdout_path = cfg_node_child_from_string(cfg, str8_lit("stdout_path"))->first->string; target.stderr_path = cfg_node_child_from_string(cfg, str8_lit("stderr_path"))->first->string; target.stdin_path = cfg_node_child_from_string(cfg, str8_lit("stdin_path"))->first->string; + target.msg_id = cfg->id; target.debug_subprocesses = !!e_value_from_string(cfg_node_child_from_string(cfg, str8_lit("debug_subprocesses"))->first->string).u64; for(CFG_Node *child = cfg->first; child != &cfg_nil_node; child = child->next) { @@ -12332,21 +12333,33 @@ rd_frame(void) e_string2expr_map_insert(scratch.arena, macro_map, name, expr); } - //- rjf: add macro for output log + //- rjf: add macro for output logs { - Access *access = access_open(); - C_Key key = d_user_state->output_log_key; - U128 hash = c_hash_from_key(key, 0); - String8 data = c_data_from_hash(access, hash); - E_Space space = e_space_make(E_SpaceKind_HashStoreKey); - space.u64_0 = key.root.u64[0]; - space.u128 = key.id.u128[0]; - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); - expr->space = space; - expr->mode = E_Mode_Offset; - expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size, 0); - e_string2expr_map_insert(scratch.arena, macro_map, str8_lit("output"), expr); - access_close(access); + CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, s("target")); + for EachNode(n, CFG_NodePtrNode, targets.first) + { + Access *access = access_open(); + CFG_Node *target = n->v; + CFG_Node *output_label = cfg_node_child_from_string(target, s("output_label")); + String8 output_label_string = output_label->first->string; + if(output_label_string.size == 0) + { + output_label_string = rd_default_setting_from_names(s("target"), s("output_label")); + } + C_ID id = {u128_hash_from_str8(output_label_string)}; + C_Key key = c_key_make(d_user_state->output_log_root, id); + U128 hash = c_hash_from_key(key, 0); + String8 data = c_data_from_hash(access, hash); + E_Space space = e_space_make(E_SpaceKind_HashStoreKey); + space.u64_0 = key.root.u64[0]; + space.u128 = key.id.u128[0]; + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); + expr->space = space; + expr->mode = E_Mode_Offset; + expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size, 0); + e_string2expr_map_insert(scratch.arena, macro_map, output_label_string, expr); + access_close(access); + } } //- rjf: (DEBUG) add macro for cfg strings @@ -15810,8 +15823,16 @@ rd_frame(void) //- rjf: output case RD_CmdKind_ClearOutput: { + // rjf: get output label + String8 output_label = rd_regs()->string; + + // rjf: output label -> key + C_ID id = {u128_hash_from_str8(output_label)}; + C_Key key = c_key_make(d_user_state->output_log_root, id); + + // rjf: clear MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("")}; - mtx_push_op(d_user_state->output_log_key, op); + mtx_push_op(key, op); }break; //- rjf: watch pins @@ -16955,6 +16976,11 @@ rd_frame(void) //////////////////////////// //- rjf: tick debug engine // + U64 process_count_pre_tick = 0; + { + D_EntityArray all_processes = d_entity_array_from_kind(D_EntityKind_Process); + process_count_pre_tick = all_processes.count; + } U64 cmd_count_pre_tick = rd_state->cmds[0].count; B32 soft_halt_issued = d_user_state->ctrl_soft_halt_issued; D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters); @@ -16971,9 +16997,34 @@ rd_frame(void) case D_EventKind_NewProc: { D_EntityArray all_processes = d_entity_array_from_kind(D_EntityKind_Process); - if(all_processes.count == 1) + + // rjf: no processes before this one -> new session + if(process_count_pre_tick == 0) { + D_Entity *process = all_processes.v[0]; + CFG_Node *target = cfg_node_from_id(process->src_msg_id); + + // rjf: target -> output label + String8 output_label = cfg_node_child_from_string(target, s("output_label"))->first->string; + if(output_label.size == 0) + { + output_label = rd_default_setting_from_names(s("target"), s("output_label")); + } + + // rjf: output label -> key + C_ID id = {u128_hash_from_str8(output_label)}; + C_Key key = c_key_make(d_user_state->output_log_root, id); + + // rjf: reset output log for associated target + { + MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; + mtx_push_op(key, op); + } + + // rjf: reset external window MemoryZeroStruct(&rd_state->prestop_focused_window); + + // rjf: eliminate all previously loaded debug infos CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("debug_info")); for EachNode(n, CFG_NodePtrNode, dbg_infos.first) { @@ -17138,6 +17189,26 @@ rd_frame(void) rd_state->last_stop_selected_thread_sp = new_sp; } }break; + case D_EventKind_DebugString: + { + // rjf: process -> src target's output label + D_Entity *process = d_entity_from_handle(evt->parent); + D_MsgID src_msg_id = process->src_msg_id; + CFG_Node *target = cfg_node_from_id(src_msg_id); + String8 output_label = cfg_node_child_from_string(target, s("output_label"))->first->string; + if(output_label.size == 0) + { + output_label = rd_default_setting_from_names(s("target"), s("output_label")); + } + + // rjf: output label -> key + C_ID id = {u128_hash_from_str8(output_label)}; + C_Key key = c_key_make(d_user_state->output_log_root, id); + + // rjf: push to keyed output + MTX_Op op = {r1u64(max_U64, max_U64), evt->string}; + mtx_push_op(key, op); + }break; } } diff --git a/src/win32/demon/win32_demon.c b/src/win32/demon/win32_demon.c index 329d0dfd..78f7d38f 100644 --- a/src/win32/demon/win32_demon.c +++ b/src/win32/demon/win32_demon.c @@ -2474,6 +2474,8 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: unpack event W32_DMN_Entity *process = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Process, evt.dwProcessId); W32_DMN_Entity *thread = w32_dmn_entity_from_kind_id(W32_DMN_EntityKind_Thread, evt.dwThreadId); + DMN_Handle process_handle = w32_dmn_handle_from_entity(process); + DMN_Handle thread_handle = w32_dmn_handle_from_entity(thread); U64 string_address = (U64)evt.u.DebugString.lpDebugStringData; U64 string_size = (U64)evt.u.DebugString.nDebugStringLength; @@ -2489,9 +2491,23 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) debug_string.size -= 1; } - // rjf: make debug string event - debug_strings_event = dmn_event_list_push(arena, &events); - debug_strings_event->kind = DMN_EventKind_DebugString; + // rjf: complete last debug string event, if we need to + if(debug_strings_event != 0 && !dmn_handle_match(process_handle, debug_strings_event->process)) + { + String8 debug_strings_joined = str8_list_join(arena, &debug_strings, 0); + debug_strings_event->string = debug_strings_joined; + debug_strings_event = 0; + MemoryZeroStruct(&debug_strings); + } + + // rjf: make debug string event if we need one + if(debug_strings_event == 0) + { + debug_strings_event = dmn_event_list_push(arena, &events); + debug_strings_event->kind = DMN_EventKind_DebugString; + debug_strings_event->process = process_handle; + debug_strings_event->thread = thread_handle; + } // rjf: push into debug strings str8_list_push(scratch.arena, &debug_strings, debug_string); From e1782d08cf4646b80c9757070b1a48e9de0f8143 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 20 May 2026 19:38:46 -0700 Subject: [PATCH 680/850] show line info on visualizing function evaluations --- src/raddbg/raddbg_views.c | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 59f942f0..3ce62e0d 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1817,6 +1817,65 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla dr_fstrs_push_new(arena, &eval_fstrs, ¶ms, string); result.flags |= RD_WatchCellFlag_IsNonCode; } + + // rjf: equip line info for functions + { + E_TypeKey undecorated_type_key = e_type_key_unwrap(cell->eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); + E_TypeKey direct_type_key = e_type_key_unwrap(undecorated_type_key, E_TypeUnwrapFlag_All); + E_TypeKey fn_type_key = {0}; + if(e_type_kind_from_key(undecorated_type_key) == E_TypeKind_Function) + { + fn_type_key = undecorated_type_key; + } + else if(e_type_kind_from_key(undecorated_type_key) == E_TypeKind_Ptr && + e_type_kind_from_key(direct_type_key) == E_TypeKind_Function) + { + fn_type_key = direct_type_key; + } + if(e_type_kind_from_key(fn_type_key) == E_TypeKind_Function) + { + Access *access = access_open(); + + // rjf: eval -> voff / dbgi key + E_Eval eval = cell->eval; + U64 voff = 0; + DI_Key dbgi_key = {0}; + if(eval.space.kind == D_EvalSpaceKind_Entity) + { + U64 vaddr = eval.value.u64; + D_Entity *process = rd_ctrl_entity_from_eval_space(eval.space); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + dbgi_key = d_dbgi_key_from_module(module); + voff = d_voff_from_vaddr(module, vaddr); + } + else + { + voff = eval.value.u64; + E_DbgInfo *dbg_info = e_dbg_info_from_type_key(eval.irtree.type_key); + dbgi_key = dbg_info->dbgi_key; + } + + // rjf: dbgi key -> rdi + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + + // rjf: voff -> line + RDI_Line line = rdi_line_from_voff(rdi, voff); + RDI_SourceFile *src_file = rdi_element_from_name_idx(rdi, SourceFiles, line.file_idx); + RDI_FilePathNode *path_node = rdi_element_from_name_idx(rdi, FilePathNodes, src_file->file_path_node_idx); + String8 file_name = str8_from_rdi_string_idx(rdi, path_node->name_string_idx); + + // rjf: push line location + if(file_name.size != 0) UI_TagF("weak") + { + String8 loc = str8f(arena, "%S:%i", file_name, line.line_num); + DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit("text")), font_size*0.85f, 0, 0}; + dr_fstrs_push_new(arena, &eval_fstrs, ¶ms, str8_lit(" @ ")); + dr_fstrs_push_new(arena, &eval_fstrs, ¶ms, loc); + } + + access_close(access); + } + } } //- rjf: if we have only the expression, then use the expression as the value From 4e44a3c2718f2df9cc21c4ba22a7c12e9cd9a72c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 20 May 2026 20:57:49 -0700 Subject: [PATCH 681/850] get default symbol path as part of process info; sketch out windows-style path for local symbol server cache --- src/base/base_processes.h | 1 + src/dbg_engine/dbg_engine_ctrl.c | 32 +++++++++++++++++++++++++++--- src/dbg_engine/dbg_engine_ctrl.h | 4 +++- src/raddbg/generated/raddbg.meta.c | 4 ++-- src/raddbg/raddbg.mdesk | 6 +++--- src/win32/base/win32_base.c | 18 +++++++++++++++++ 6 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/base/base_processes.h b/src/base/base_processes.h index 57a48aa1..c1250fc1 100644 --- a/src/base/base_processes.h +++ b/src/base/base_processes.h @@ -13,6 +13,7 @@ struct ProcessInfo String8 binary_path; String8 initial_path; String8 user_program_data_path; + String8 symbol_cache_path; String8List module_load_paths; String8List environment; }; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 12cdba0b..3bc802e1 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1834,7 +1834,7 @@ d_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle) { if(d_handle_match(n->module, module_handle)) { - result = push_str8_copy(arena, n->initial_debug_info_path); + result = str8_copy(arena, n->local_debug_info_path); break; } } @@ -4110,12 +4110,37 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang FileProperties props = properties_from_file_path(candidate_path); if(props.modified != 0 && props.size != 0) { - initial_debug_info_path = push_str8_copy(arena, path_normalized_from_string(scratch.arena, candidate_path)); + initial_debug_info_path = str8_copy(arena, path_normalized_from_string(scratch.arena, candidate_path)); break; } } } + ////////////////////////////// + //- rjf: determine debug info unique identifier + // + String8 debug_info_unique_identifier = {0}; + if(pdb_dbg_path.size != 0) + { + Guid guid = pdb_dbg_guid; + debug_info_unique_identifier = str8f(scratch.arena, "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x", + guid.data1, guid.data2, guid.data3, guid.data4[0], guid.data4[1], guid.data4[2], guid.data4[3], guid.data4[4], guid.data4[5], guid.data4[6], guid.data4[7], pdb_dbg_age); + } + + ////////////////////////////// + //- rjf: build local server cache debug info path + // + String8 local_server_cache_debug_info_path = {0}; + if(debug_info_unique_identifier.size != 0 && pdb_dbg_path.size != 0) + { + // TODO(rjf): this is not complete - assuming stripped etc. - just following pattern from ntdll.dll for now + String8 symbol_cache_path = get_process_info()->symbol_cache_path; + String8 module_name = str8_skip_last_slash(path); + String8 dbg_name = str8_skip_last_slash(pdb_dbg_path); + String8 path = str8f(scratch.arena, "%S/%S/%S/stripped/%S", symbol_cache_path, module_name, debug_info_unique_identifier, dbg_name); + local_server_cache_debug_info_path = path_normalized_from_string(arena, path); + } + ////////////////////////////// //- rjf: insert info into cache // @@ -4149,7 +4174,8 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang node->eh_frame_hdr = eh_frame_hdr; node->eh_ptr_ctx = eh_ptr_ctx; node->entry_point_voff = entry_point_voff; - node->initial_debug_info_path = initial_debug_info_path; + node->local_debug_info_path = initial_debug_info_path; + node->debug_info_unique_identifier= debug_info_unique_identifier; node->raddbg_attached_marker_voff = raddbg_is_attached_section_voff_range.min; node->raddbg_data = str8_copy(arena, raddbg_data); } diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 7463567c..05d418e6 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -186,7 +186,9 @@ struct D_ModuleImageInfoCacheNode EH_FrameHdr eh_frame_hdr; EH_PtrCtx eh_ptr_ctx; U64 entry_point_voff; - String8 initial_debug_info_path; + String8 local_debug_info_path; + String8 local_server_cache_debug_info_path; + String8 debug_info_unique_identifier; U64 raddbg_attached_marker_voff; String8 raddbg_data; }; diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 07150263..5945b106 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -460,7 +460,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[39] = {str8_lit_comp("target"), 0, str8_lit_comp("@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': expr_string,\n @default(\"output\") 'output_label': code_string,\n 'stdout_path': @no_relativize path,\n 'stderr_path': @no_relativize path,\n 'stdin_path': @no_relativize path,\n 'environment': set,\n 'debug_subprocesses': bool,\n @no_revert @no_expand @default(0) 'enabled': bool,\n}\n")}, {str8_lit_comp("breakpoint"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\nx:\n{\n 'label': code_string,\n 'condition': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n 'hit_count': u64,\n 'address_range_size': @or(0, 1, 2, 4, 8) u64,\n 'break_on_write': bool,\n 'break_on_read': bool,\n 'break_on_execute': bool,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, {str8_lit_comp("watch_pin"), 0, str8_lit_comp("@row_commands(duplicate_cfg, remove_cfg)\n@collection_commands(add_watch_pin, toggle_watch_pin)\nx:\n{\n 'expression': expr_string,\n 'source_location': path_pt,\n 'address_location': expr_string,\n}\n")}, -{str8_lit_comp("debug_info"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @query 'guid': string,\n @no_revert @no_expand @default(1) 'enabled': bool,\n}\n")}, +{str8_lit_comp("debug_info"), 0, str8_lit_comp("@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\n@collection_commands(load_debug_info)\nx:\n{\n 'path': @no_relativize path,\n @no_revert @no_expand @default(1) 'enabled': bool,\n @query 'guid': string,\n}\n")}, {str8_lit_comp("file_path_map"), 0, str8_lit_comp("@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}")}, {str8_lit_comp("type_view"), 0, str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, {str8_lit_comp("recent_project"), 0, str8_lit_comp("x:{'path':path, 'name':string}")}, @@ -1102,7 +1102,7 @@ str8_lit_comp("far_manager"), String8 rd_theme_preset_cfg_string_table[11] = { -str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x1f1f1fff}\n theme_color:{tags: \"alt background\", value: 0x222222ff}\n theme_color:{tags: \"pop background\", value: 0x675331ff}\n theme_color:{tags: \"fresh background\", value: 0x3d3631ff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x404040ff}\n theme_color:{tags: text, value: 0xe5e5e5ff}\n theme_color:{tags: \"weak text\", value: 0xa4a4a4ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xabdeffff}\n theme_color:{tags: \"focus overlay\", value: 0x2292eb14}\n theme_color:{tags: \"focus border\", value: 0x2392ebff}\n theme_color:{tags: cursor, value: 0x8aff00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x16}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xecececff}\n theme_color:{tags: code_symbol, value: 0xebb624ff}\n theme_color:{tags: code_type, value: 0xebb624ff}\n theme_color:{tags: code_local, value: 0xa7dae8ff}\n theme_color:{tags: code_register, value: 0xb7afd5ff}\n theme_color:{tags: code_keyword, value: 0x838b8fff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x838b8fff}\n theme_color:{tags: code_numeric, value: 0x9cb198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x6d8e67ff}\n theme_color:{tags: code_string, value: 0x9cb198ff}\n theme_color:{tags: code_meta, value: 0xb9819aff}\n theme_color:{tags: code_comment, value: 0x627b5eff}\n theme_color:{tags: line_info_0, value: 0x3c2d25ff}\n theme_color:{tags: line_info_1, value: 0x3c3925ff}\n theme_color:{tags: line_info_2, value: 0x2e4837ff}\n theme_color:{tags: line_info_3, value: 0x2e3d48ff}\n theme_color:{tags: line_info_4, value: 0x3c2d25ff}\n theme_color:{tags: line_info_5, value: 0x3c3925ff}\n theme_color:{tags: line_info_6, value: 0x2e4837ff}\n theme_color:{tags: line_info_7, value: 0x2e3d48ff}\n theme_color:{tags: thread_0, value: 0xebb624ff}\n theme_color:{tags: thread_1, value: 0x26d0d2ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x1b1b1baf}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\n theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x333333ff}\n theme_color:{tags: \"tab border\", value: 0x2392ebff}\n theme_color:{tags: \"tab inactive background\", value: 0}\n theme_color:{tags: \"tab inactive border\", value: 0x42494eff}\n theme_color:{tags: \"tab auto background\", value: 0x3e4d6eff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x3e4d6e39}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x1f1f1fff}\n theme_color:{tags: \"alt background\", value: 0x222222ff}\n theme_color:{tags: \"pop background\", value: 0x675331ff}\n theme_color:{tags: \"fresh background\", value: 0x3d3631ff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x404040ff}\n theme_color:{tags: text, value: 0xe5e5e5ff}\n theme_color:{tags: \"weak text\", value: 0xa4a4a4ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xabdeffff}\n theme_color:{tags: \"focus overlay\", value: 0x2292eb14}\n theme_color:{tags: \"focus border\", value: 0x2392ebff}\n theme_color:{tags: cursor, value: 0x8aff00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x16}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xecececff}\n theme_color:{tags: code_symbol, value: 0xceaf64ff}\n theme_color:{tags: code_type, value: 0xceaf64ff}\n theme_color:{tags: code_local, value: 0xa7dae8ff}\n theme_color:{tags: code_register, value: 0xb7afd5ff}\n theme_color:{tags: code_keyword, value: 0x838b8fff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x838b8fff}\n theme_color:{tags: code_numeric, value: 0x9cb198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x6d8e67ff}\n theme_color:{tags: code_string, value: 0x9cb198ff}\n theme_color:{tags: code_meta, value: 0xb9819aff}\n theme_color:{tags: code_comment, value: 0x627b5eff}\n theme_color:{tags: line_info_0, value: 0x3c2d25ff}\n theme_color:{tags: line_info_1, value: 0x3c3925ff}\n theme_color:{tags: line_info_2, value: 0x2e4837ff}\n theme_color:{tags: line_info_3, value: 0x2e3d48ff}\n theme_color:{tags: line_info_4, value: 0x3c2d25ff}\n theme_color:{tags: line_info_5, value: 0x3c3925ff}\n theme_color:{tags: line_info_6, value: 0x2e4837ff}\n theme_color:{tags: line_info_7, value: 0x2e3d48ff}\n theme_color:{tags: thread_0, value: 0xebb624ff}\n theme_color:{tags: thread_1, value: 0x26d0d2ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x1b1b1baf}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\n theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x333333ff}\n theme_color:{tags: \"tab border\", value: 0x2392ebff}\n theme_color:{tags: \"tab inactive background\", value: 0}\n theme_color:{tags: \"tab inactive border\", value: 0x42494eff}\n theme_color:{tags: \"tab auto background\", value: 0x3e4d6eff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x3e4d6e39}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0xffffffff }\n theme_color:{ tags: \"alt background\" , value: 0xf8f8f8ff }\n theme_color:{ tags: \"pop background\" , value: 0xcbe4f2ff }\n theme_color:{ tags: \"menu_bar pop background\" , value: 0x5aabd9ff }\n theme_color:{ tags: \"fresh background\" , value: 0xeaddceff }\n theme_color:{ tags: \"match background\" , value: 0xc1e9c4ff }\n theme_color:{ tags: border , value: 0xcbcbcbff }\n theme_color:{ tags: text , value: 0xff }\n theme_color:{ tags: \"weak text\" , value: 0x727272ff }\n theme_color:{ tags: \"good text\" , value: 0x217538ff }\n theme_color:{ tags: \"neutral text\" , value: 0x1a5b7cff }\n theme_color:{ tags: \"bad text\" , value: 0x972717ff }\n theme_color:{ tags: hover , value: 0xff }\n theme_color:{ tags: \"focus overlay\" , value: 0x67ff4b }\n theme_color:{ tags: \"focus border\" , value: 0x67ffff }\n theme_color:{ tags: cursor , value: 0xff }\n theme_color:{ tags: selection , value: 0x283d5166 }\n theme_color:{ tags: \"inactive background\" , value: 0x8 }\n theme_color:{ tags: drop_shadow , value: 0xb }\n theme_color:{ tags: \"good_pop background\" , value: 0x90c09aff }\n theme_color:{ tags: \"good_pop border\" , value: 0x1e7231ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0xa93620ff }\n theme_color:{ tags: \"bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar bad_pop background\" , value: 0xff2a00ff }\n theme_color:{ tags: \"menu_bar bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0x80808ff }\n theme_color:{ tags: code_symbol , value: 0x4ac3ff }\n theme_color:{ tags: code_type , value: 0xf46200ff }\n theme_color:{ tags: code_local , value: 0x317c00ff }\n theme_color:{ tags: code_register , value: 0x9a00ffff }\n theme_color:{ tags: code_keyword , value: 0xff0600ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x8a8a8aff }\n theme_color:{ tags: code_numeric , value: 0x7d49ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0xb56aff }\n theme_color:{ tags: code_string , value: 0x63549fff }\n theme_color:{ tags: code_meta , value: 0xd96759ff }\n theme_color:{ tags: code_comment , value: 0x717171ff }\n theme_color:{ tags: line_info_0 , value: 0xe6d5cdff }\n theme_color:{ tags: line_info_1 , value: 0xdbcfb2ff }\n theme_color:{ tags: line_info_2 , value: 0xddeac1ff }\n theme_color:{ tags: line_info_3 , value: 0xddc4bdff }\n theme_color:{ tags: line_info_4 , value: 0xba917eff }\n theme_color:{ tags: thread_0 , value: 0xffa700ff }\n theme_color:{ tags: thread_1 , value: 0xb41fff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xff2800ff }\n theme_color:{ tags: \"floating background\" , value: 0xffffffc7 }\n theme_color:{ tags: \"floating background alt\" , value: 0x23 }\n theme_color:{ tags: \"floating background fresh\" , value: 0xeaddceff }\n theme_color:{ tags: \"floating border\" , value: 0x88888884 }\n theme_color:{ tags: \"scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"menu_bar background\" , value: 0x2b6b9aff }\n theme_color:{ tags: \"menu_bar border\" , value: 0x4d }\n theme_color:{ tags: \"menu_bar text\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"good menu_bar text\" , value: 0x70db8dff }\n theme_color:{ tags: \"bad menu_bar text\" , value: 0xffa79bff }\n theme_color:{ tags: \"neutral menu_bar text\" , value: 0xc4dbe7ff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab text\" , value: 0xffffffff }\n theme_color:{ tags: \"tab text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"tab background\" , value: 0xb67e48ff }\n theme_color:{ tags: \"tab border\" , value: 0x875b31ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0xcacacaff }\n theme_color:{ tags: \"tab inactive border\" , value: 0xb5b5b5ff }\n theme_color:{ tags: \"tab auto background\" , value: 0xc41c69ff }\n theme_color:{ tags: \"tab auto border\" , value: 0x981039ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x9b88a3ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x373737ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0x1f1f1fff }\n theme_color:{ tags: \"alt background\" , value: 0x222222ff }\n theme_color:{ tags: \"pop background\" , value: 0x383167ff }\n theme_color:{ tags: \"fresh background\" , value: 0x31393dff }\n theme_color:{ tags: \"match background\" , value: 0x31393dff }\n theme_color:{ tags: border , value: 0x404040ff }\n theme_color:{ tags: text , value: 0xe5e5e5ff }\n theme_color:{ tags: \"weak text\" , value: 0xa4a4a4ff }\n theme_color:{ tags: \"good text\" , value: 0x32a852ff }\n theme_color:{ tags: \"neutral text\" , value: 0x3a90bbff }\n theme_color:{ tags: \"bad text\" , value: 0xcf5242ff }\n theme_color:{ tags: hover , value: 0xffffffff }\n theme_color:{ tags: \"focus overlay\" , value: 0x7160e81e }\n theme_color:{ tags: \"focus border\" , value: 0x7160e8ff }\n theme_color:{ tags: cursor , value: 0x8aff00ff }\n theme_color:{ tags: selection , value: 0x99ccff0f }\n theme_color:{ tags: \"inactive background\" , value: 0x0000002f }\n theme_color:{ tags: drop_shadow , value: 0x0000007f }\n theme_color:{ tags: \"good_pop background\" , value: 0x2c5b36ff }\n theme_color:{ tags: \"good_pop border\" , value: 0x568761ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0x803425ff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0xe0e0e0ff }\n theme_color:{ tags: code_symbol , value: 0xdcdcaaff }\n theme_color:{ tags: code_type , value: 0x4ec9b0ff }\n theme_color:{ tags: code_local , value: 0x9cdcfeff }\n theme_color:{ tags: code_register , value: 0xb7afd5ff }\n theme_color:{ tags: code_keyword , value: 0x569cd6ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x767676ff }\n theme_color:{ tags: code_numeric , value: 0xb5cea8ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0x7c986dff }\n theme_color:{ tags: code_string , value: 0xd69d85ff }\n theme_color:{ tags: code_meta , value: 0x9b9b9bff }\n theme_color:{ tags: code_comment , value: 0x51a644ff }\n theme_color:{ tags: line_info_0 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_1 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_2 , value: 0x434e2aff }\n theme_color:{ tags: line_info_3 , value: 0x36241fff }\n theme_color:{ tags: line_info_4 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_5 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_6 , value: 0x434e2aff }\n theme_color:{ tags: line_info_7 , value: 0x36241fff }\n theme_color:{ tags: thread_0 , value: 0xffdc48ff }\n theme_color:{ tags: thread_1 , value: 0xb2ff65ff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xa72911ff }\n theme_color:{ tags: \"floating background\" , value: 0x1b1b1baf }\n theme_color:{ tags: \"floating background alt\" , value: 0x0000005f }\n theme_color:{ tags: \"floating background fresh\" , value: 0x31393d5f }\n theme_color:{ tags: \"floating border\" , value: 0xbfbfbf1f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0x3b3b3b5f }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"scroll_bar background\" , value: 0x2b2b2bff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x3f3f3fff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab background\" , value: 0x333333ff }\n theme_color:{ tags: \"tab border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0x171717ff }\n theme_color:{ tags: \"tab inactive border\" , value: 0x3e4c57ff }\n theme_color:{ tags: \"tab auto background\" , value: 0x3f386dff }\n theme_color:{ tags: \"tab auto border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x2f2633ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x685073ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0xffffffff}\n theme_color:{tags: \"alt background\", value: 0xefefefff}\n theme_color:{tags: \"pop background\", value: 0xe3eaf2ff}\n theme_color:{tags: \"fresh background\", value: 0xeccbbeff}\n theme_color:{tags: \"match background\", value: 0xedcbf9ff}\n theme_color:{tags: border, value: 0xe7e7e7ff}\n theme_color:{tags: text, value: 0xff}\n theme_color:{tags: \"weak text\", value: 0x353535ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xa7ffff}\n theme_color:{tags: \"focus overlay\", value: 0x8eff3f}\n theme_color:{tags: \"focus border\", value: 0x8effff}\n theme_color:{tags: cursor, value: 0xff}\n theme_color:{tags: selection, value: 0x56aaff77}\n theme_color:{tags: \"inactive background\", value: 0x17}\n theme_color:{tags: drop_shadow, value: 0xe7b27}\n theme_color:{tags: \"good_pop background\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop border\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0xcb3f23ff}\n theme_color:{tags: \"bad_pop text\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop text weak\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0x000000ff}\n theme_color:{tags: code_symbol, value: 0x74531fff}\n theme_color:{tags: code_type, value: 0x2b91afff}\n theme_color:{tags: code_local, value: 0x1f377fff}\n theme_color:{tags: code_register, value: 0x8a1bffff}\n theme_color:{tags: code_keyword, value: 0x0000ffff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\n theme_color:{tags: code_numeric, value: 0xff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x1d1d1dff}\n theme_color:{tags: code_string, value: 0xa61515ff}\n theme_color:{tags: code_meta, value: 0x808080ff}\n theme_color:{tags: code_comment, value: 0x008000ff}\n theme_color:{tags: line_info_0, value: 0xb5d9c8ff}\n theme_color:{tags: line_info_1, value: 0xa9c1d0ff}\n theme_color:{tags: line_info_2, value: 0x99abc5ff}\n theme_color:{tags: line_info_3, value: 0xc6bcd5ff}\n theme_color:{tags: thread_0, value: 0xffb141ff}\n theme_color:{tags: thread_1, value: 0x66c407ff}\n theme_color:{tags: thread_unwound, value: 0x67b3d7ff}\n theme_color:{tags: thread_error, value: 0xff2900ff}\n theme_color:{tags: breakpoint, value: 0xff2800ff}\n theme_color:{tags: \"floating background\", value: 0xffffffff}\n theme_color:{tags: \"floating background alt\", value: 0x11}\n theme_color:{tags: \"floating background fresh\", value: 0xa0c2d318}\n theme_color:{tags: \"floating border\", value: 0x50}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"menu_bar background\", value: 0xccd5f0ff}\n theme_color:{tags: \"menu_bar border\", value: 0xbabdc3ff}\n theme_color:{tags: \"scroll_bar background\", value: 0xe4e4e4ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0xf5cc84ff}\n theme_color:{tags: \"tab border\", value: 0xae7718ff}\n theme_color:{tags: \"tab inactive background\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab inactive text\", value: 0xffffffff}\n theme_color:{tags: \"tab inactive border\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab auto background\", value: 0xe99595ff}\n theme_color:{tags: \"tab auto border\", value: 0xff6262ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0xac6060ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0xff6262ff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xa7ffff}\n}\n"), diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 273c78c3..b0168d61 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -765,8 +765,8 @@ RD_VocabTable: x: { 'path': @no_relativize path, - @query 'guid': string, @no_revert @no_expand @default(1) 'enabled': bool, + @query 'guid': string, } ```, } @@ -1594,8 +1594,8 @@ RD_ThemePresetTable: theme_color:{tags: "bad_pop background", value: 0x803425ff} theme_color:{tags: "bad_pop hover", value: 0xff825cff} theme_color:{tags: code_default, value: 0xecececff} - theme_color:{tags: code_symbol, value: 0xebb624ff} - theme_color:{tags: code_type, value: 0xebb624ff} + theme_color:{tags: code_symbol, value: 0xceaf64ff} + theme_color:{tags: code_type, value: 0xceaf64ff} theme_color:{tags: code_local, value: 0xa7dae8ff} theme_color:{tags: code_register, value: 0xb7afd5ff} theme_color:{tags: code_keyword, value: 0x838b8fff} diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index f7f1e38f..4e6add41 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1923,12 +1923,30 @@ w32_entry_point_caller(int argc, WCHAR **wargv) { String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); String8 string = str8_from_16(arena, string16); + if(str8_match(string, s("_NT_SYMBOL_PATH="), StringMatchFlag_RightSideSloppy)) + { + info->symbol_cache_path = str8_skip(string, 16); + info->symbol_cache_path = str8_skip_chop_whitespace(info->symbol_cache_path); + } str8_list_push(arena, &info->environment, string); start_idx = idx+1; } } } } + if(info->symbol_cache_path.size == 0) + { + Temp scratch = scratch_begin(0, 0); + U64 size = KB(32); + U16 *buffer = push_array_no_zero(scratch.arena, U16, size); + if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_LOCAL_APPDATA, 0, 0, (WCHAR*)buffer))) + { + String8 local_appdata = str8_from_16(scratch.arena, str16_cstring(buffer)); + info->symbol_cache_path = str8f(arena, "%S\\Temp\\SymbolCache", local_appdata); + + } + scratch_end(scratch); + } } //- rjf: set up entity storage From 4ff6d2cc6cf5cc622a921e2c77ecbe856cb96c19 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 21 May 2026 17:42:57 -0700 Subject: [PATCH 682/850] use the make library to generate RDI --- src/linker/lnk.c | 133 +- src/linker/lnk.h | 8 + src/linker/lnk_config.c | 12 +- src/linker/lnk_config.h | 1 + src/linker/lnk_debug_info.c | 2262 +-------- src/linker/lnk_debug_info.h | 157 - src/linker/rdi/rdi_builder.c | 5584 ---------------------- src/linker/rdi/rdi_builder.h | 1231 ----- src/linker/rdi/rdi_coff.c | 53 - src/linker/rdi/rdi_coff.h | 7 - src/linker/rdi/rdi_cv.c | 237 - src/linker/rdi/rdi_cv.h | 14 - src/linker/rdi/rdi_overrides.h | 20 - src/linker/scripts/obj_paths_from_pdb.py | 16 - 14 files changed, 100 insertions(+), 9635 deletions(-) delete mode 100644 src/linker/rdi/rdi_builder.c delete mode 100644 src/linker/rdi/rdi_builder.h delete mode 100644 src/linker/rdi/rdi_coff.c delete mode 100644 src/linker/rdi/rdi_coff.h delete mode 100644 src/linker/rdi/rdi_cv.c delete mode 100644 src/linker/rdi/rdi_cv.h delete mode 100644 src/linker/rdi/rdi_overrides.h delete mode 100644 src/linker/scripts/obj_paths_from_pdb.py diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 13fb8d1a..7054990c 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -58,13 +58,6 @@ #include "llvm/llvm.c" #include "dwarf/x64/dwarf_x64.c" -// --- RDI --------------------------------------------------------------------- - -#include "rdi/rdi_local.h" -#include "arch/arch_inc.h" -#include "rdi/rdi_local.c" -#include "arch/arch_inc.c" - // --- Code Base Extensions ---------------------------------------------------- #include "base_ext/base_inc.h" @@ -83,15 +76,21 @@ #include "pdb_ext/pdb_helpers.c" #include "pdb_ext/pdb_builder.c" -// --- RDI Builder ------------------------------------------------------------- +// --- RDI --------------------------------------------------------------------- -#include "rdi/rdi_builder.h" -#include "rdi/rdi_coff.h" -#include "rdi/rdi_cv.h" +#include "pdb/pdb_parse.h" +#include "rdi/rdi_local.h" +#include "rdi_make/rdi_make_local.h" +#include "rdi_from_coff/rdi_from_coff.h" +#include "rdi_from_pdb/rdi_from_pdb.h" +#include "arch/arch_inc.h" -#include "rdi/rdi_builder.c" -#include "rdi/rdi_coff.c" -#include "rdi/rdi_cv.c" +#include "pdb/pdb_parse.c" +#include "rdi/rdi_local.c" +#include "rdi_make/rdi_make_local.c" +#include "rdi_from_coff/rdi_from_coff.c" +#include "rdi_from_pdb/rdi_from_pdb.c" +#include "arch/arch_inc.c" // --- Linker ------------------------------------------------------------------ @@ -5259,6 +5258,40 @@ lnk_log_timers(void) scratch_end(scratch); } +internal +THREAD_POOL_TASK_FUNC(lnk_p2r_worker) +{ + Temp scratch = scratch_begin(&arena, 1); + + LNK_P2R *ctx = raw_task; + + P2R_ConvertParams p2r_params = {0}; + if (task_id == 0) { + p2r_params.input_pdb_name = lnk_get_pdb_name(ctx->config); + p2r_params.input_pdb_data = ctx->pdb_data; + p2r_params.input_exe_name = lnk_get_image_name(ctx->config); + p2r_params.input_exe_data = ctx->image_data; + p2r_params.subset_flags = max_U32; + } + tp_broadcast(&p2r_params); + + LaneCtx lctx = { .lane_idx = task_id, .lane_count = tp->worker_count, .barrier = tp->barrier, .broadcast_memory = tp->broadcast }; + lane_ctx(lctx); + + Arena *bake_arena = arena_alloc(); + RDIM_BakeParams bake_params = p2r_convert(bake_arena, &p2r_params); + barrier_wait(tp->barrier); + + RDIM_BakeResults bake_results = rdim_bake(arena, &bake_params); + barrier_wait(tp->barrier); + + if (task_id == 0) { + ctx->bake_results = bake_results; + } + + scratch_end(scratch); +} + internal void lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) { @@ -5349,51 +5382,45 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv); // - // RDI - // - if (config->rad_debug == LNK_SwitchState_Yes) { - lnk_timer_begin(LNK_Timer_Rdi); - - String8List rdi_data = lnk_build_rad_debug_info(tp, - arena, - OperatingSystem_Windows, - rdi_arch_from_coff_machine(config->machine), - lnk_get_image_name(config), - image_ctx.image_data, - debug_info_objs_count, - debug_info_objs, - cv.debug_s_arr, - cv.symbol_input_count, - cv.symbol_inputs, - (CV_SymbolListArray[]){0}, - cv_types); - - lnk_write_data_list_to_file_path(config->rad_debug_name, config->temp_rad_debug_name, rdi_data); - - lnk_timer_end(LNK_Timer_Rdi); - } - - // - // PDB + // Debug Info // // TODO: Parallel debug info builds are currently blocked by the patch // strings in $$FILE_CHECKSUM step in `lnk_process_c13_data_task`. - if (config->debug_mode == LNK_DebugMode_Full) { - lnk_timer_begin(LNK_Timer_Pdb); + if (config->debug_mode == LNK_DebugMode_Full || config->rad_debug == LNK_SwitchState_Yes) { + Temp huge_arena_temp = temp_begin(lnk_get_huge_arena()); - if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) { - lnk_replace_type_names_with_hashes(tp, - arena, - cv_types.count[CV_TypeIndexSource_TPI], - cv_types.v [CV_TypeIndexSource_TPI], - config->pdb_hash_type_names, - config->pdb_hash_type_name_length, - config->pdb_hash_type_name_map); + String8List pdb_data = {0}; + { + lnk_timer_begin(LNK_Timer_Pdb); + if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) { + lnk_replace_type_names_with_hashes(tp, + arena, + cv_types.count[CV_TypeIndexSource_TPI], + cv_types.v [CV_TypeIndexSource_TPI], + config->pdb_hash_type_names, + config->pdb_hash_type_name_length, + config->pdb_hash_type_name_map); + } + pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &cv, cv_types); + if (config->debug_mode == LNK_DebugMode_Full) { + lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data); + } + lnk_timer_end(LNK_Timer_Pdb); } - String8List pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &cv, cv_types); - lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data); - lnk_timer_end(LNK_Timer_Pdb); + if (config->rad_debug == LNK_SwitchState_Yes) { + lnk_timer_begin(LNK_Timer_Rdi); + + LNK_P2R p2r = { .config = config, .pdb_data = str8_list_join(lnk_get_huge_arena(), &pdb_data, 0), .image_data = image_ctx.image_data }; + tp_for_parallel(tp, arena, tp->worker_count, lnk_p2r_worker, &p2r); + + String8List rdi_blobs = rdim_file_blobs_from_section_bundle(scratch.arena, &p2r.bake_results.section_bundle); + lnk_write_data_list_to_file_path(config->rad_debug_name, config->temp_rad_debug_name, rdi_blobs); + + lnk_timer_end(LNK_Timer_Rdi); + } + + temp_end(huge_arena_temp); } // diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 95210356..5b2d20e3 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -309,6 +309,14 @@ typedef struct U128 *hashes; } LNK_Blake3Hasher; +typedef struct +{ + RDIM_BakeResults bake_results; + LNK_Config *config; + String8 pdb_data; + String8 image_data; +} LNK_P2R; + // --- Config ----------------------------------------------------------------- internal LNK_Config * lnk_config_from_argcv(Arena *arena, int argc, char **argv); diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 9f92dfad..2e5a8f1a 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -753,11 +753,19 @@ lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_Me internal String8 lnk_get_image_name(LNK_Config *config) { - String8 image_name = config->image_alt_path.size ? config->image_alt_path : config->out_path; - image_name = str8_skip_last_slash(image_name); + String8 image_path = config->image_alt_path.size ? config->image_alt_path : config->out_path; + String8 image_name = str8_skip_last_slash(image_path); return image_name; } +internal String8 +lnk_get_pdb_name(LNK_Config *config) +{ + String8 pdb_path = config->pdb_alt_path.size ? config->pdb_alt_path : config->pdb_name; + String8 pdb_name = str8_skip_last_slash(pdb_path); + return pdb_name; +} + internal U64 lnk_get_default_function_pad_min(COFF_MachineType machine) { diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 6e7e7951..2f0f34cf 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -542,6 +542,7 @@ internal LNK_MergeDirectiveNode * lnk_merge_directive_list_push(Arena *arena, LN // --- Getters ----------------------------------------------------------------- internal String8 lnk_get_image_name (LNK_Config *config); +internal String8 lnk_get_pdb_name (LNK_Config *config); internal U64 lnk_get_default_function_pad_min (COFF_MachineType machine); internal U64 lnk_get_base_addr (LNK_Config *config); internal Version lnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 7176e96e..da6ab1bd 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -2464,15 +2464,13 @@ internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types) { ProfBeginFunction(); - Temp scratch = scratch_begin(tp_arena->v, tp_arena->count); - Temp huge_arena_temp = temp_begin(lnk_get_huge_arena()); LNK_BuildPdb task = { .image_data = image_data, .symtab = symtab, .cv = cv, - .pdb = pdb_alloc_(huge_arena_temp.arena, config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), + .pdb = pdb_alloc_(lnk_get_huge_arena(), config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), .mod_arr = push_array(scratch.arena, PDB_DbiModule *, cv->obj_count), .pe = pe_bin_info_from_data(scratch.arena, image_data), .image_section_table = coff_section_table_from_data(scratch.arena, image_data, task.pe.section_table_range), @@ -2594,2266 +2592,8 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config ProfEnd(); #endif - temp_end(huge_arena_temp); scratch_end(scratch); ProfEnd(); return page_data_list; } -internal U64 -lnk_udt_name_hash_table_hash(String8 string) -{ - return XXH3_64bits(string.str, string.size); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_build_udt_name_hash_table_task) -{ - LNK_BuildUDTNameHashTableTask *task = raw_task; - - LNK_UDTNameBucket *new_bucket = 0; - for EachInRange(leaf_idx, task->ranges[task_id]) { - String8 leaf_data = str8(task->leaf_arr[leaf_idx], max_U64); - - CV_Leaf leaf; - cv_read_leaf(leaf_data, 0, 1, &leaf); - - // is this UDT? - if ( ! cv_is_udt(leaf.kind)) { continue; } - - // skip forward references - CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); - if (udt_info.props & CV_TypeProp_FwdRef) { continue; } - - // skip anon UDT - if (cv_is_udt_name_anon(udt_info.name)) { continue; } - - // UDT name -> bucket index - String8 name = cv_name_from_udt_info(udt_info); - U64 hash = lnk_udt_name_hash_table_hash(name); - U64 best_idx = hash % task->buckets_cap; - U64 bucket_idx = best_idx; - - // push and fill bucket - if (new_bucket == 0) { new_bucket = push_array(arena, LNK_UDTNameBucket, 1); } - new_bucket->name = name; - new_bucket->leaf_idx = leaf_idx; - - B32 is_inserted_or_updated = 0; - do { - retry:; - LNK_UDTNameBucket *curr_bucket = task->buckets[bucket_idx]; - - if (curr_bucket == 0) { - LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); - - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - is_inserted_or_updated = 1; - break; - } - - // another thread took the bucket... - goto retry; - } else if (str8_match(curr_bucket->name, name, 0)) { - // there is more than one UDT with identical name, pick most recent and ignore others - - if (leaf_idx < curr_bucket->leaf_idx) { - LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - is_inserted_or_updated = 1; - break; - } - } else { - // don't need to update, more recent leaf is in the bucket - break; - } - - // another thread took the bucket... - goto retry; - } - - // advance - bucket_idx = (bucket_idx + 1) % task->buckets_cap; - } while (bucket_idx != best_idx); - - if (is_inserted_or_updated) { - new_bucket = 0; - } - } -} - - -internal LNK_UDTNameBucket ** -lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, - TP_Arena *arena, - U64 leaf_count, - U8 **leaf_arr, - U64 *buckets_cap_out) -{ - Temp scratch = scratch_begin(&arena->v[0], 1); - LNK_BuildUDTNameHashTableTask task = {0}; - task.leaf_count = leaf_count; - task.leaf_arr = leaf_arr; - task.buckets_cap = (leaf_count * 13) / 10; - task.buckets = push_array(arena->v[0], LNK_UDTNameBucket *, task.buckets_cap); - task.ranges = tp_divide_work(scratch.arena, leaf_count, tp->worker_count); - tp_for_parallel(tp, arena, tp->worker_count, lnk_build_udt_name_hash_table_task, &task); - *buckets_cap_out = task.buckets_cap; - scratch_end(scratch); - return task.buckets; -} - -internal LNK_UDTNameBucket * -lnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name) -{ - U64 hash = lnk_udt_name_hash_table_hash(name); - U64 best_idx = hash % cap; - U64 bucket_idx = best_idx; - do { - if (buckets[bucket_idx] == 0) { - break; - } - if (str8_match(buckets[bucket_idx]->name, name, 0)) { - return buckets[bucket_idx]; - } - bucket_idx = (bucket_idx + 1) % cap; - } while (bucket_idx != best_idx); - return 0; -} - -internal CV_TypeIndex -lnk_udt_name_hash_table_lookup_itype(LNK_UDTNameBucket **buckets, U64 cap, String8 name) -{ - LNK_UDTNameBucket *bucket = lnk_udt_name_hash_table_lookup(buckets, cap, name); - if (bucket != 0) { - return CV_MinComplexTypeIndex + bucket->leaf_idx; - } - return 0; -} - -internal RDIB_Type * -lnk_push_converted_codeview_type(Arena *arena, RDIB_TypeChunkList *list, RDIB_Type **itype_map, CV_TypeIndex itype) -{ - RDIB_Type *type = rdib_type_chunk_list_push(arena, list, 8196); - type->final_idx = 0; - type->itype = itype; - - Assert(itype_map[itype] == 0); - itype_map[itype] = type; - - return type; -} - -internal void -lnk_push_basic_itypes(Arena *arena, RDIB_DataModel data_model, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list) -{ - RDI_TypeKind short_type = rdib_short_type_from_data_model(data_model); - RDI_TypeKind ushort_type = rdib_unsigned_short_type_from_data_model(data_model); - RDI_TypeKind int_type = rdib_int_type_from_data_model(data_model); - RDI_TypeKind uint_type = rdib_unsigned_int_type_from_data_model(data_model); - RDI_TypeKind long_type = rdib_long_type_from_data_model(data_model); - RDI_TypeKind ulong_type = rdib_unsigned_long_type_from_data_model(data_model); - RDI_TypeKind long_long_type = rdib_long_long_type_from_data_model(data_model); - RDI_TypeKind ulong_long_type = rdib_unsigned_long_long_type_from_data_model(data_model); - RDI_TypeKind ptr_type = rdib_pointer_size_t_type_from_data_model(data_model); - - struct { - char * name; - RDI_TypeKind kind_rdi; - CV_LeafKind kind_cv; - B32 make_pointer_near; - B32 make_pointer_32; - B32 make_pointer_64; - } table[] = { - { "void" , RDI_TypeKind_Void , CV_BasicType_VOID , 1, 1, 1 }, - { "HRESULT" , RDI_TypeKind_Handle , CV_BasicType_HRESULT , 0, 1, 1 }, - { "signed char" , RDI_TypeKind_Char8 , CV_BasicType_CHAR , 1, 1, 1 }, // TODO: we need Signed Char8 in RDI - { "short" , short_type , CV_BasicType_SHORT , 1, 1, 1 }, - { "long" , long_type , CV_BasicType_LONG , 1, 1, 1 }, - { "long long" , long_long_type , CV_BasicType_QUAD , 1, 1, 1 }, - { "__int128" , RDI_TypeKind_S128 , CV_BasicType_OCT , 1, 1, 1 }, // GCC/Clang type - { "unsigned char" , RDI_TypeKind_UChar8 , CV_BasicType_UCHAR , 1, 1, 1 }, - { "unsigned short" , ushort_type , CV_BasicType_USHORT , 1, 1, 1 }, - { "unsigned long" , ulong_type , CV_BasicType_ULONG , 1, 1, 1 }, - { "unsigned long long" , ulong_long_type , CV_BasicType_UQUAD , 1, 1, 1 }, - { "__uint128" , RDI_TypeKind_U128 , CV_BasicType_UOCT , 1, 1, 1 }, // GCC/Clang type - { "bool" , RDI_TypeKind_S8 , CV_BasicType_BOOL8 , 1, 1, 1 }, // TODO: we need a actual boolean type in RDI so we can format value as true/false. - { "__bool16" , RDI_TypeKind_S16 , CV_BasicType_BOOL16 , 1, 1, 1 }, // not real C type - { "__bool32" , RDI_TypeKind_S32 , CV_BasicType_BOOL32 , 1, 1, 1 }, // not real C type - { "float" , RDI_TypeKind_F32 , CV_BasicType_FLOAT32 , 1, 1, 1 }, - { "double" , RDI_TypeKind_F64 , CV_BasicType_FLOAT64 , 1, 1, 1 }, - { "long double" , RDI_TypeKind_F80 , CV_BasicType_FLOAT80 , 1, 1, 1 }, - { "__float128" , RDI_TypeKind_F128 , CV_BasicType_FLOAT128 , 1, 1, 1 }, // GCC/Clang type - { "__float48" , RDI_TypeKind_F48 , CV_BasicType_FLOAT48 , 1, 1, 1 }, // not real C type - { "__float32pp" , RDI_TypeKind_F32PP , CV_BasicType_FLOAT32PP , 1, 1, 1 }, // not real C type - { "_Complex float" , RDI_TypeKind_ComplexF32 , CV_BasicType_COMPLEX32 , 0, 0, 0 }, - { "_Complex double" , RDI_TypeKind_ComplexF64 , CV_BasicType_COMPLEX64 , 0, 0, 0 }, - { "_Complex long double" , RDI_TypeKind_ComplexF80 , CV_BasicType_COMPLEX80 , 0, 0, 0 }, - { "_Complex __float128" , RDI_TypeKind_ComplexF128, CV_BasicType_COMPLEX128 , 0, 0, 0 }, - { "__int8" , RDI_TypeKind_S8 , CV_BasicType_INT8 , 1, 1, 1 }, - { "__uint8" , RDI_TypeKind_U8 , CV_BasicType_UINT8 , 1, 1, 1 }, - { "__int16" , RDI_TypeKind_S16 , CV_BasicType_INT16 , 1, 1, 1 }, - { "__uint16" , RDI_TypeKind_U16 , CV_BasicType_UINT16 , 1, 1, 1 }, - { "int" , int_type , CV_BasicType_INT32 , 1, 1, 1 }, - { "unsigned int" , uint_type , CV_BasicType_UINT32 , 1, 1, 1 }, - { "__int64" , RDI_TypeKind_S64 , CV_BasicType_INT64 , 1, 1, 1 }, - { "__uint64" , RDI_TypeKind_U64 , CV_BasicType_UINT64 , 1, 1, 1 }, - { "__int128" , RDI_TypeKind_S128 , CV_BasicType_INT128 , 1, 1, 1 }, - { "__uint128" , RDI_TypeKind_U128 , CV_BasicType_UINT128 , 1, 1, 1 }, - { "char" , RDI_TypeKind_Char8 , CV_BasicType_RCHAR , 1, 1, 1 }, // always ASCII - { "wchar_t" , RDI_TypeKind_UChar16 , CV_BasicType_WCHAR , 1, 1, 1 }, // on windows always UTF-16 - { "char8_t" , RDI_TypeKind_Char8 , CV_BasicType_CHAR8 , 1, 1, 1 }, // always UTF-8 - { "char16_t" , RDI_TypeKind_Char16 , CV_BasicType_CHAR16 , 1, 1, 1 }, // always UTF-16 - { "char32_t" , RDI_TypeKind_Char32 , CV_BasicType_CHAR32 , 1, 1, 1 }, // always UTF-32 - { "__pointer" , ptr_type , CV_BasicType_PTR , 0, 0, 0 } - }; - - for (U64 i = 0; i < ArrayCount(table); ++i) { - U64 builtin_size; - if (table[i].kind_rdi == RDI_TypeKind_Void || table[i].kind_rdi == RDI_TypeKind_Handle) { - builtin_size = rdi_size_from_basic_type_kind(ptr_type); - } else { - builtin_size = rdi_size_from_basic_type_kind(table[i].kind_rdi); - } - - RDIB_Type *builtin = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv); - builtin->kind = table[i].kind_rdi; - builtin->builtin.name = str8_cstring(table[i].name); - builtin->builtin.size = builtin_size; - - RDIB_Type **wrapper = push_array(arena, RDIB_Type *, 1); - *wrapper = builtin; - - if (table[i].make_pointer_near) { - RDIB_Type *ptr_near = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x100); - ptr_near->kind = RDI_TypeKind_Ptr; - ptr_near->ptr.size = rdi_size_from_basic_type_kind(ptr_type); - ptr_near->ptr.type_ref = wrapper; - } - if (table[i].make_pointer_32) { - RDIB_Type *ptr_32 = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x400); - ptr_32->kind = RDI_TypeKind_Ptr; - ptr_32->ptr.size = 4; - ptr_32->ptr.type_ref = wrapper; - } - if (table[i].make_pointer_64) { - RDIB_Type *ptr_64 = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x600); - ptr_64->kind = RDI_TypeKind_Ptr; - ptr_64->ptr.size = 8; - ptr_64->ptr.type_ref = wrapper; - } - -#if 0 - RDIB_Type *ptr_far = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x200); - RDIB_Type *ptr_huge = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x300); - RDIB_Type *ptr_16_32 = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x500); - - ptr_far->kind = RDI_TypeKind_Ptr; - ptr_far->ptr.size = rdi_size_from_basic_type_kind(ptr_type); - ptr_far->ptr.type_ref = wrapper; - - ptr_huge->kind = RDI_TypeKind_Ptr; - ptr_huge->ptr.size = 4; - ptr_huge->ptr.type_ref = wrapper; - - - ptr_16_32->kind = RDI_TypeKind_Ptr; - ptr_16_32->ptr.size = 6; - ptr_16_32->ptr.type_ref = wrapper; -#endif - } -} - -internal RDIB_TypeRef -lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype) -{ - RDIB_TypeRef result = &task->tpi_itype_map[0]; - Rng1U64 tpi_range = task->itype_ranges[CV_TypeIndexSource_TPI]; - - if (itype < tpi_range.min) { - // check for supported CodeView pointer formats: - AssertAlways(BitExtract(itype, 8, 8) == /* near */ 0x1 || - BitExtract(itype, 8, 8) == /* 32 bit */ 0x4 || - BitExtract(itype, 8, 8) == /* 64 bit */ 0x6 || - BitExtract(itype, 8, 8) == /* regular */ 0x0); - } - - if (itype < tpi_range.max) { - CV_TypeIndex final_itype = itype; - - // try to resovle forward reference (defn might be missing) - if (itype >= tpi_range.min) { - CV_Leaf leaf; - cv_read_leaf(str8(task->leaf_arr[CV_TypeIndexSource_TPI][itype - tpi_range.min], max_U64), 0, 1, &leaf); - if (cv_is_udt(leaf.kind)) { - CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data); - if (udt_info.props & CV_TypeProp_FwdRef) { - String8 name = cv_name_from_udt_info(udt_info); - CV_TypeIndex resolved_itype = lnk_udt_name_hash_table_lookup_itype(task->udt_name_buckets, task->udt_name_bucket_cap, name); - if (resolved_itype != 0) { - final_itype = resolved_itype; - } - } - } - } - - result = &task->tpi_itype_map[final_itype]; - } - - return result; -} - -internal RDI_MemberKind -lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop) -{ - switch (prop) { - case CV_MethodProp_Vanilla: return RDI_MemberKind_Method; - case CV_MethodProp_Virtual: return RDI_MemberKind_VirtualMethod; - case CV_MethodProp_Static: return RDI_MemberKind_StaticMethod; - case CV_MethodProp_Friend: NotImplemented; - case CV_MethodProp_Intro: return RDI_MemberKind_VirtualMethod; - case CV_MethodProp_PureVirtual: return RDI_MemberKind_VirtualMethod; - case CV_MethodProp_PureIntro: return RDI_MemberKind_VirtualMethod; - } - return RDI_MemberKind_NULL; -} - -internal -THREAD_POOL_TASK_FUNC(lnk_convert_types_to_rdi_task) -{ - ProfBeginFunction(); - LNK_ConvertTypesToRDI *task = raw_task; - - // upfront push output type array - U64 leaf_count = dim_1u64(task->ranges[task_id]); - rdib_type_chunk_list_reserve(arena, &task->rdib_types_lists[task_id], leaf_count); - - for(U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) { - U64 itype = task->itype_ranges[CV_TypeIndexSource_TPI].min + leaf_idx; - CV_Leaf src = cv_leaf_from_ptr(task->leaf_arr[CV_TypeIndexSource_TPI][leaf_idx]); - - switch (src.kind) { - case CV_LeafKind_MODIFIER: { - CV_LeafModifier *modifier = (CV_LeafModifier *) src.data.str; - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); - dst->kind = RDI_TypeKind_Modifier; - dst->modifier.flags = rdi_type_modifier_flags_from_cv_modifier_flags(modifier->flags); - dst->modifier.type_ref = lnk_rdib_type_from_itype(task, modifier->itype); - } break; - case CV_LeafKind_POINTER: { - CV_LeafPointer *ptr = (CV_LeafPointer *) src.data.str; - CV_PointerKind ptr_kind = CV_PointerAttribs_Extract_Kind(ptr->attribs); - CV_PointerMode ptr_mode = CV_PointerAttribs_Extract_Mode(ptr->attribs); - U32 ptr_size = CV_PointerAttribs_Extract_Size(ptr->attribs); - (void)ptr_kind; - - // parse ahead type chain and squash modifiers - RDI_TypeModifierFlags modifier_flags = rdi_type_modifier_flags_from_cv_pointer_attribs(ptr->attribs); - CV_TypeIndex next_itype; - for (next_itype = ptr->itype; task->itype_ranges[CV_TypeIndexSource_TPI].min <= next_itype && next_itype < task->itype_ranges[CV_TypeIndexSource_TPI].max;) { - U64 next_leaf_idx = next_itype - task->itype_ranges[CV_TypeIndexSource_TPI].min; - CV_Leaf next_leaf = cv_leaf_from_ptr(task->leaf_arr[CV_TypeIndexSource_TPI][next_leaf_idx]); - if (next_leaf.kind != CV_LeafKind_MODIFIER) { - break; - } - - // parse LF_MODIFIER - CV_LeafModifier *sym_modifier = (CV_LeafModifier *) next_leaf.data.str; - RDI_TypeModifierFlags flags = rdi_type_modifier_flags_from_cv_modifier_flags(sym_modifier->flags); - - // accumulate modifier flags - modifier_flags |= flags; - - // advance - next_itype = sym_modifier->itype; - } - - if (modifier_flags == 0) { - // No modifer just generate pointer type. - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); - dst->kind = rdi_type_kind_from_pointer(ptr->attribs, ptr_mode); - dst->ptr.size = ptr_size; - dst->ptr.type_ref = lnk_rdib_type_from_itype(task, ptr->itype); - } else { - // CodeView embeds modifier in pointer struct, we don't have an equivalent - // so generate a modifier type in pointer slot and link with pointer type. - - RDIB_Type *ptr_type = rdib_type_chunk_list_push(arena, &task->rdib_types_lists[task_id], task->type_cap); - ptr_type->kind = rdi_type_kind_from_pointer(ptr->attribs, ptr_mode); - ptr_type->ptr.type_ref = lnk_rdib_type_from_itype(task, next_itype); - RDIB_Type **indirect_ptr_type = push_array(arena, RDIB_Type *, 1); - *indirect_ptr_type = ptr_type; - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); - dst->kind = RDI_TypeKind_Modifier; - dst->modifier.flags = modifier_flags; - dst->modifier.type_ref = indirect_ptr_type; - } - } break; - case CV_LeafKind_PROCEDURE: { - CV_LeafProcedure *proc = (CV_LeafProcedure *) src.data.str; - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); - dst->kind = RDI_TypeKind_Function; - dst->func.return_type = lnk_rdib_type_from_itype(task, proc->ret_itype); - dst->func.params_type = lnk_rdib_type_from_itype(task, proc->arg_itype); - } break; - case CV_LeafKind_MFUNCTION: { - CV_LeafMFunction *mfunc = (CV_LeafMFunction *) src.data.str; - B32 is_static_method = mfunc->this_itype == 0; - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); - - if (is_static_method) { - dst->kind = RDI_TypeKindExt_StaticMethod; - dst->static_method.class_type = lnk_rdib_type_from_itype(task, mfunc->class_itype); - dst->static_method.return_type = lnk_rdib_type_from_itype(task, mfunc->ret_itype); - dst->static_method.params_type = lnk_rdib_type_from_itype(task, mfunc->arg_itype); - } else { - dst->kind = RDI_TypeKind_Method; - dst->method.class_type = lnk_rdib_type_from_itype(task, mfunc->class_itype); - dst->method.this_type = lnk_rdib_type_from_itype(task, mfunc->this_itype); - dst->method.return_type = lnk_rdib_type_from_itype(task, mfunc->ret_itype); - dst->method.params_type = lnk_rdib_type_from_itype(task, mfunc->arg_itype); - } - } break; - case CV_LeafKind_BITFIELD: { - CV_LeafBitField *bitfield = (CV_LeafBitField *) src.data.str; - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); - dst->kind = RDI_TypeKind_Bitfield; - dst->bitfield.off = bitfield->pos; - dst->bitfield.count = bitfield->len; - dst->bitfield.value_type = lnk_rdib_type_from_itype(task, bitfield->itype); - } break; - case CV_LeafKind_ARRAY: { - CV_LeafArray *array = (CV_LeafArray *) src.data.str; - CV_NumericParsed size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafArray), src.data.str + src.data.size); - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); - dst->kind = RDI_TypeKind_Array; - dst->array.entry_type = lnk_rdib_type_from_itype(task, array->entry_itype); - dst->array.size = cv_u64_from_numeric(&size); - } break; - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: { - CV_LeafStruct *udt = (CV_LeafStruct *) src.data.str; - CV_NumericParsed size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafStruct), src.data.str + src.data.size); - - String8 name; - String8 link_name; - if (udt->props & CV_TypeProp_HasUniqueName) { - name = str8_cstring_capped(src.data.str + sizeof(CV_LeafStruct) + size.encoded_size, src.data.str + src.data.size); - link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size); - } else { - name = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafStruct) + size.encoded_size, src.data.str + src.data.size); - link_name = name; - } - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_struct_lists[task_id], task->tpi_itype_map, itype); - dst->udt.name = name; - dst->udt.link_name = link_name; - dst->udt.members = lnk_rdib_type_from_itype(task, udt->field_itype); - dst->udt.struct_type.size = cv_u64_from_numeric(&size); - dst->udt.struct_type.derived = lnk_rdib_type_from_itype(task, udt->derived_itype); - dst->udt.struct_type.vtshape = lnk_rdib_type_from_itype(task, udt->vshape_itype); - - if (udt->props & CV_TypeProp_FwdRef) { - dst->kind = src.kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct; - } else { - dst->kind = src.kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct; - } - } break; - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: { - CV_LeafStruct2 *udt = (CV_LeafStruct2 *) src.data.str; - CV_NumericParsed size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafStruct2), src.data.str + src.data.size); - - String8 name; - String8 link_name; - if (udt->props & CV_TypeProp_HasUniqueName) { - name = str8_cstring_capped(src.data.str + sizeof(CV_LeafStruct2) + size.encoded_size, src.data.str + src.data.size); - link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size); - } else { - name = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafStruct2) + size.encoded_size, src.data.str + src.data.size); - link_name = name; - } - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_struct_lists[task_id], task->tpi_itype_map, itype); - dst->udt.name = name; - dst->udt.link_name = link_name; - dst->udt.members = lnk_rdib_type_from_itype(task, udt->field_itype); - dst->udt.struct_type.size = cv_u64_from_numeric(&size); - dst->udt.struct_type.derived = lnk_rdib_type_from_itype(task, udt->derived_itype); - dst->udt.struct_type.vtshape = lnk_rdib_type_from_itype(task, udt->vshape_itype); - - if (udt->props & CV_TypeProp_FwdRef) { - dst->kind = src.kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct; - } else { - dst->kind = src.kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct; - } - } break; - case CV_LeafKind_UNION: { - CV_LeafUnion *udt = (CV_LeafUnion *) src.data.str; - CV_NumericParsed size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafUnion), src.data.str + src.data.size); - - String8 name; - String8 link_name; - if (udt->props & CV_TypeProp_HasUniqueName) { - name = str8_cstring_capped(src.data.str + sizeof(CV_LeafUnion) + size.encoded_size, src.data.str + src.data.size); - link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size); - } else { - name = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafUnion) + size.encoded_size, src.data.str + src.data.size); - link_name = name; - } - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_union_lists[task_id], task->tpi_itype_map, itype); - dst->udt.name = name; - dst->udt.link_name = link_name; - dst->udt.members = lnk_rdib_type_from_itype(task, udt->field_itype); - dst->udt.union_type.size = cv_u64_from_numeric(&size); - - if (udt->props & CV_TypeProp_FwdRef) { - dst->kind = RDI_TypeKind_IncompleteUnion; - } else { - dst->kind = RDI_TypeKind_Union; - } - } break; - case CV_LeafKind_ENUM: { - CV_LeafEnum *udt = (CV_LeafEnum *) src.data.str; - - String8 name; - String8 link_name; - if (udt->props & CV_TypeProp_HasUniqueName) { - name = str8_cstring_capped(src.data.str + sizeof(*udt), src.data.str + src.data.size); - link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size); - } else { - name = str8_cstring_capped_reverse(src.data.str + sizeof(*udt), src.data.str + src.data.size); - link_name = name; - } - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_enum_lists[task_id], task->tpi_itype_map, itype); - dst->kind = (RDI_TypeKindExt)RDI_TypeKind_Enum; - dst->udt.name = name; - dst->udt.link_name = link_name; - dst->udt.members = lnk_rdib_type_from_itype(task, udt->field_itype); - dst->udt.enum_type.base_type = lnk_rdib_type_from_itype(task, udt->base_itype); - - if (udt->props & CV_TypeProp_FwdRef) { - dst->kind = RDI_TypeKind_IncompleteEnum; - } else { - dst->kind = (RDI_TypeKindExt)RDI_TypeKind_Enum; - } - } break; - case CV_LeafKind_ARGLIST: { - CV_LeafArgList *arglist = (CV_LeafArgList *) src.data.str; - CV_TypeIndex *itypes = (CV_TypeIndex *) (arglist + 1); - - if (arglist->count * sizeof(CV_TypeIndex) + sizeof(CV_LeafArgList) > src.data.size) { - AssertAlways("error: ill-formed LF_ARGLIST"); - break; - } - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_params_lists[task_id], task->tpi_itype_map, itype); - dst->kind = RDI_TypeKindExt_Params; // there is no Params kind in RDI - dst->params.count = arglist->count; - dst->params.types = push_array(arena, RDIB_TypeRef, arglist->count); - for (U64 param_idx = 0; param_idx < arglist->count; ++param_idx) { - // strange way to encode variadic params, when outside LF_ARGLIST LF_NOTYPE actually means null... - if (itypes[param_idx] == CV_LeafKind_NOTYPE) { - dst->params.types[param_idx] = task->variadic_type_ref; - } else { - dst->params.types[param_idx] = lnk_rdib_type_from_itype(task, itypes[param_idx]); - } - } - } break; - case CV_LeafKind_FIELDLIST: { - RDIB_UDTMemberChunkList *rdib_member_list; - RDIB_TypeChunkList *rdib_member_types; - B32 is_enum = sizeof(CV_LeafKind) <= src.data.size && (*(CV_LeafKind *)src.data.str == CV_LeafKind_ENUMERATE); - if (is_enum) { - rdib_member_list = &task->rdib_enum_members_lists[worker_id]; - rdib_member_types = &task->rdib_types_enum_members_lists[worker_id]; - } else { - rdib_member_list = &task->rdib_udt_members_lists[worker_id]; - rdib_member_types = &task->rdib_types_udt_members_lists[worker_id]; - } - - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, rdib_member_types, task->tpi_itype_map, itype); - dst->kind = RDI_TypeKindExt_Members; - - for (U64 cursor = 0; cursor + sizeof(CV_LeafKind) <= src.data.size; ) { - CV_LeafKind field_kind = *(CV_LeafKind *) (src.data.str + cursor); - cursor += sizeof(field_kind); - - // do we have bytes to read? - U64 header_size = cv_header_struct_size_from_leaf_kind(field_kind); - if (cursor + header_size > src.data.size) { - break; - } - - switch (field_kind) { - case CV_LeafKind_INDEX: { - CV_LeafIndex *index = (CV_LeafIndex *) (src.data.str + cursor); - cursor += sizeof(*index); - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB member list pointer - member->kind = RDI_MemberKindExt_MemberListPointer; - member->member_list_pointer = lnk_rdib_type_from_itype(task, index->itype); - } break; - case CV_LeafKind_MEMBER: { - // prase CodeView struct/class/union data member - CV_LeafMember *leaf_member = (CV_LeafMember *) (src.data.str + cursor); - CV_NumericParsed offset = cv_numeric_from_data_range((U8 *)(leaf_member + 1), src.data.str + src.data.size); - String8 name = str8_cstring_capped(src.data.str + cursor + sizeof(CV_LeafMember) + offset.encoded_size, src.data.str + src.data.size); - cursor += sizeof(CV_LeafMember); - cursor += offset.encoded_size; - cursor += name.size + 1; - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB data member - member->kind = RDI_MemberKind_DataField; - member->data_field.name = name; - member->data_field.type_ref = lnk_rdib_type_from_itype(task, leaf_member->itype); - member->data_field.offset = cv_u64_from_numeric(&offset); - } break; - case CV_LeafKind_STMEMBER: { - // parse CodeView static member - CV_LeafStMember *st_member = (CV_LeafStMember *) (src.data.str + cursor); - String8 name = str8_cstring_capped(st_member + 1, src.data.str + src.data.size); - cursor += sizeof(CV_LeafStMember); - cursor += name.size + 1; - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB static member - member->kind = RDI_MemberKind_StaticData; - member->static_data.name = name; - member->static_data.type_ref = lnk_rdib_type_from_itype(task, st_member->itype); - } break; - case CV_LeafKind_METHOD: { - // parse CodeView over-loaded method - CV_LeafMethod *method = (CV_LeafMethod *) (src.data.str + cursor); - String8 name = str8_cstring_capped(method + 1, src.data.str + src.data.size); - cursor += sizeof(CV_LeafMethod); - cursor += name.size + 1; - - if (contains_1u64(task->itype_ranges[CV_TypeIndexSource_TPI], method->list_itype)) { - U64 method_list_leaf_idx = method->list_itype - task->itype_ranges[CV_TypeIndexSource_TPI].min; - CV_Leaf method_list_leaf = cv_leaf_from_ptr(task->leaf_arr[CV_TypeIndexSource_TPI][method_list_leaf_idx]); - if (method_list_leaf.kind == CV_LeafKind_METHODLIST) { - for (U64 cursor = 0; cursor + sizeof(CV_LeafMethodListMember) <= method_list_leaf.data.size; ) { - // parse CodeView method overload info - CV_LeafMethodListMember *list_member = (CV_LeafMethodListMember *) (method_list_leaf.data.str + cursor); - CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(list_member->attribs); - cursor += sizeof(CV_LeafMethodListMember); - U32 vftable_offset = 0; - if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) { - str8_deserial_read_struct(src.data, cursor, &vftable_offset); - cursor += sizeof(vftable_offset); - } - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB method - member->kind = RDI_MemberKind_Method; - member->method.kind = lnk_rdib_method_kind_from_cv_prop(prop); - member->method.name = name; - member->method.type_ref = lnk_rdib_type_from_itype(task, list_member->itype); - member->method.vftable_offset = vftable_offset; - } - } else { - Assert(!"error: expected LF_METHODLIST"); - } - } - } break; - case CV_LeafKind_ONEMETHOD: { - // parse CodeView method - CV_LeafOneMethod *one_method = (CV_LeafOneMethod *) (src.data.str + cursor); - CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(one_method->attribs); - cursor += sizeof(CV_LeafOneMethod); - U32 vftable_offset = 0; - if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) { - str8_deserial_read_struct(src.data, cursor, &vftable_offset); - cursor += sizeof(vftable_offset); - } - String8 name = str8_cstring_capped(src.data.str + cursor, src.data.str + src.data.size); - cursor += name.size + 1; - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB member - member->kind = RDI_MemberKind_Method; - member->method.kind = lnk_rdib_method_kind_from_cv_prop(prop); - member->method.name = name; - member->method.type_ref = lnk_rdib_type_from_itype(task, one_method->itype); - member->method.vftable_offset = vftable_offset; - } break; - case CV_LeafKind_NESTTYPE: { - // parse CodeView nested type - CV_LeafNestType *nest_type = (CV_LeafNestType *) (src.data.str + cursor); - String8 name = str8_cstring_capped(nest_type + 1, src.data.str + src.data.size); - cursor += sizeof(CV_LeafNestType); - cursor += name.size + 1; - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB nested type member - member->kind = RDI_MemberKind_NestedType; - member->nested_type.name = name; - member->nested_type.type_ref = lnk_rdib_type_from_itype(task, nest_type->itype); - } break; - case CV_LeafKind_NESTTYPEEX: { - // parse CodeView nested type extended - CV_LeafNestTypeEx *nest_type_ex = (CV_LeafNestTypeEx *) (src.data.str + cursor); - String8 name = str8_cstring_capped(nest_type_ex + 1, src.data.str + src.data.size); - cursor += sizeof(CV_LeafNestTypeEx); - cursor += name.size + 1; - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB nested type member - member->kind = RDI_MemberKind_NestedType; - member->nested_type.name = name; - member->nested_type.type_ref = lnk_rdib_type_from_itype(task, nest_type_ex->itype); - } break; - case CV_LeafKind_BCLASS: { - // parse CodeView base class member - CV_LeafBClass *bclass = (CV_LeafBClass *) (src.data.str + cursor); - CV_NumericParsed offset = cv_numeric_from_data_range((U8 *)(bclass + 1), src.data.str + src.data.size); - cursor += sizeof(CV_LeafBClass); - cursor += offset.encoded_size; - - U64 offset64 = cv_u64_from_numeric(&offset); - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB base class member - member->kind = RDI_MemberKind_Base; - member->base_class.type_ref = lnk_rdib_type_from_itype(task, bclass->itype); - member->base_class.offset = offset64; - } break; - case CV_LeafKind_VBCLASS: - case CV_LeafKind_IVBCLASS: { - // parse CodeView virtual base class - CV_LeafVBClass *vbclass = (CV_LeafVBClass *) (src.data.str + cursor); - CV_NumericParsed vbptr_off = cv_numeric_from_data_range(src.data.str + cursor + sizeof(*vbclass), src.data.str + src.data.size); - CV_NumericParsed vtable_off = cv_numeric_from_data_range(src.data.str + cursor + sizeof(*vbclass) + vbptr_off.encoded_size, src.data.str + src.data.size); - cursor += sizeof(CV_LeafVBClass); - cursor += vbptr_off.encoded_size; - cursor += vtable_off.encoded_size; - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB virtual base class member - member->kind = RDI_MemberKind_VirtualBase; - member->virtual_base_class.type_ref = lnk_rdib_type_from_itype(task, vbclass->itype); - member->virtual_base_class.vbptr_off = cv_u64_from_numeric(&vbptr_off); - member->virtual_base_class.vtable_off = cv_u64_from_numeric(&vtable_off); - } break; - case CV_LeafKind_VFUNCTAB: { - // parse CodeView virtual function table - CV_LeafVFuncTab *vfunc_tab = (CV_LeafVFuncTab *) (src.data.str + cursor); - cursor += sizeof(*vfunc_tab); - - // TODO: we don't have an equivalent in RDI - } break; - case CV_LeafKind_ENUMERATE: { - // parse CodeView enum member - CV_LeafEnumerate *enumerate = (CV_LeafEnumerate *) (src.data.str + cursor); - CV_NumericParsed value = cv_numeric_from_data_range((U8 *) (enumerate + 1), src.data.str + src.data.size); - String8 name = str8_cstring_capped(src.data.str + cursor + sizeof(CV_LeafEnumerate) + value.encoded_size, src.data.str + src.data.size); - cursor += sizeof(CV_LeafEnumerate); - cursor += value.encoded_size; - cursor += name.size + 1; - - // push new node - RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap); - rdib_udt_member_list_push_node(&dst->members.list, member); - - // fill out RDIB enum member - member->kind = RDI_MemberKind_NULL; - member->enumerate.name = name; - member->enumerate.value = cv_u64_from_numeric(&value); - } break; - default: InvalidPath; - } - - cursor = AlignPow2(cursor, 4); - } - } break; - case CV_LeafKind_METHODLIST: { - // see CV_LeafKind_METHOD - } break; - case CV_LeafKind_LABEL: { - // ??? - } break; - case CV_LeafKind_VTSHAPE: { - RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype); - dst->kind = RDI_TypeKindExt_VirtualTable; - // ??? - } break; - case CV_LeafKind_VFTABLE: { - // ??? - } break; - default: InvalidPath; break; - } - -#undef push_converted_type - } - ProfEnd(); -} - -internal U64 -lnk_src_file_hash_cv(String8 normal_full_path, CV_C13ChecksumKind checksum_kind, String8 checksum) -{ - XXH3_state_t state; - XXH3_INITSTATE(&state); - XXH3_64bits_reset(&state); - XXH3_64bits_update(&state, normal_full_path.str, normal_full_path.size); - XXH3_64bits_update(&state, &checksum_kind, sizeof(checksum_kind)); - XXH3_64bits_update(&state, checksum.str, checksum.size); - XXH64_hash_t result = XXH3_64bits_digest(&state); - return result; -} - -internal String8 -lnk_normalize_src_file_path(Arena *arena, String8 file_path) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 result = file_path; - result = lower_from_str8(scratch.arena, result); - result = path_convert_slashes(scratch.arena, result, PathStyle_UnixAbsolute); - result = push_str8_copy(arena, result); - scratch_end(scratch); - return result; -} - -internal LNK_SourceFileBucket * -lnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **buckets, - U64 cap, - U64 hash, - String8 normal_path, - CV_C13ChecksumKind checksum_kind, - String8 checksum) -{ - U64 best_idx = hash % cap; - U64 bucket_idx = best_idx; - - RDIB_SourceFile temp = {0}; - temp.normal_full_path = normal_path; - temp.checksum_kind = checksum_kind; - temp.checksum = checksum; - - do { - if (buckets[bucket_idx] == 0) { - break; - } - if (rdib_source_file_match(buckets[bucket_idx]->src_file, &temp, OperatingSystem_CURRENT)) { - return buckets[bucket_idx]; - } - bucket_idx = (bucket_idx + 1) % cap; - } while (bucket_idx != best_idx); - - return 0; -} - - -internal LNK_SourceFileBucket * -lnk_src_file_insert_or_update(LNK_SourceFileBucket **buckets, U64 cap, U64 hash, LNK_SourceFileBucket *new_bucket) -{ - LNK_SourceFileBucket *result = 0; - - U64 best_idx = hash % cap; - U64 idx = best_idx; - do { - retry:; - LNK_SourceFileBucket *curr_bucket = buckets[idx]; - - if (curr_bucket == 0) { - LNK_SourceFileBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); - - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - result = curr_bucket; - break; - } - - // another thread took the bucket... - goto retry; - } else if (rdib_source_file_match(curr_bucket->src_file, new_bucket->src_file, OperatingSystem_CURRENT)) { - // do we need to update value in the bucket? - int cmp = u64_compar(&curr_bucket->obj_idx, &new_bucket->obj_idx); - if (cmp <= 0) { - // are we inserting bucket that was already inserterd? - Assert(cmp < 0); - - // don't need to update, more recent value is in the bucket - break; - } - - LNK_SourceFileBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); - - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - result = compare_bucket; - break; - } - - // another thread took the bucket... - goto retry; - } - - // advance - idx = (idx + 1); - idx = idx == cap ? 0 : idx; - } while (idx != best_idx); - - return result; -} - -internal -THREAD_POOL_TASK_FUNC(lnk_count_source_files_task) -{ - U64 unit_idx = task_id; - LNK_ConvertSourceFilesToRDITask *task = raw_task; - CV_DebugS debug_s = task->debug_s_arr[unit_idx]; - String8List raw_chksms_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); - - U64 count = 0; - - for (String8Node *raw_chksms_n = raw_chksms_list.first; raw_chksms_n != 0; raw_chksms_n = raw_chksms_n->next) { - for(U64 cursor = 0; cursor + sizeof(CV_C13Checksum) <= raw_chksms_n->string.size; ) { - // parse header - CV_C13Checksum *header = (CV_C13Checksum *) (raw_chksms_n->string.str + cursor); - - // update count - ++count; - - // advance cursor - cursor += sizeof(*header); - cursor += header->len; - cursor = AlignPow2(cursor, CV_FileCheckSumsAlign); - } - } - - // update total count - ins_atomic_u64_add_eval(&task->total_src_file_count, count); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_insert_src_files_task) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - U64 obj_idx = task_id; - LNK_ConvertSourceFilesToRDITask *task = raw_task; - CV_DebugS debug_s = task->debug_s_arr[obj_idx]; - String8List raw_chksms_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms); - String8List raw_strtab_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable); - - if (raw_strtab_list.node_count > 1) { - lnk_error_obj(LNK_Warning_IllData, task->obj_arr[obj_idx], "Multiple string table sub-sections, picking first one."); - } - if (raw_chksms_list.node_count > 1) { - lnk_error_obj(LNK_Warning_IllData, task->obj_arr[obj_idx], "Multiple file checksum sub-sections, picking first one."); - } - - String8 string_table = cv_string_table_from_debug_s(debug_s); - LNK_SourceFileBucket *curr_bucket = 0; - - for (String8Node *raw_chksms_n = raw_chksms_list.first; raw_chksms_n != 0; raw_chksms_n = raw_chksms_n->next) { - for (U64 cursor = 0; cursor + sizeof(CV_C13Checksum) <= raw_chksms_n->string.size; ) { - // parse header - CV_C13Checksum *header = (CV_C13Checksum *) (raw_chksms_n->string.str + cursor); - - // grab checksum - String8 checksum = str8_substr(raw_chksms_n->string, rng_1u64(cursor + sizeof(CV_C13Checksum), - cursor + sizeof(CV_C13Checksum) + header->len)); - - // grab file path - Assert(header->name_off < string_table.size); - String8 file_path = str8_cstring_capped(string_table.str + header->name_off, string_table.str + string_table.size); - - // normalize file path - String8 normal_path = lnk_normalize_src_file_path(arena, file_path); - - // push new bucket - if (curr_bucket == 0) { - curr_bucket = push_array(arena, LNK_SourceFileBucket, 1); - curr_bucket->src_file = push_array(arena, RDIB_SourceFile, 1); - } - - // fill out obj idx so we can decide which source file to keep in the hash table - curr_bucket->obj_idx = obj_idx; - - // fill out part with source file info - curr_bucket->src_file->file_path = file_path; - curr_bucket->src_file->normal_full_path = normal_path; - curr_bucket->src_file->checksum_kind = rdi_checksum_from_cv_c13(header->kind); - curr_bucket->src_file->checksum = checksum; - curr_bucket->src_file->line_table_frags = 0; - - // insert bucket - U64 normal_path_hash = lnk_src_file_hash_cv(normal_path, header->kind, checksum); - LNK_SourceFileBucket *insert_result = lnk_src_file_insert_or_update(task->src_file_buckets, task->src_file_buckets_cap, normal_path_hash, curr_bucket); - - if (curr_bucket == insert_result) { - // bucket was inserted into empty slot, reset current bucket - curr_bucket = 0; - } else if (curr_bucket != insert_result) { - // reuse evicted bucket - curr_bucket = insert_result; - } - - // advance cursor - cursor += sizeof(*header); - cursor += header->len; - cursor = AlignPow2(cursor, CV_FileCheckSumsAlign); - } - } - - scratch_end(scratch); - ProfEnd(); -} - -internal RDIB_Type * -lnk_find_container_type(String8 name, Rng1U64 tpi_itype_range, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap, RDIB_Type **tpi_itype_map) -{ - CV_TypeIndex container_itype = 0; - - String8 delim = str8_lit("::"); - U64 delim_pos = str8_find_needle_reverse(name, 0, delim, 0); - if (delim_pos > 0) { - U64 container_name_size = delim_pos - delim.size; - String8 container_name = str8_prefix(name, container_name_size); - container_itype = lnk_udt_name_hash_table_lookup_itype(udt_name_buckets, udt_name_buckets_cap, container_name); - } - - RDIB_Type *container = 0; - if (container_itype > 0) { - Assert(container_itype < tpi_itype_range.max); - container = tpi_itype_map[container_itype]; - } - - return container; -} - -internal RDIB_Type * -lnk_type_from_itype(CV_TypeIndex itype, Rng1U64 tpi_itype_range, RDIB_Type **tpi_itype_map, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset) -{ - RDIB_Type *type = 0; - if (itype < tpi_itype_range.max) { - type = tpi_itype_map[itype]; - } else { - lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Out of bounds type index 0x%x in S_%S @ 0x%llx.", - itype, cv_string_from_sym_kind(symbol_kind), symbol_offset); - } - return type; -} - -internal U64 -lnk_voff_from_sect_off(U64 sect_idx, U64 sect_off, COFF_SectionHeaderArray image_sects, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset) -{ - U64 voff = 0; - if (sect_idx < image_sects.count) { - voff = image_sects.v[sect_idx].voff + sect_off; - } else { - lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Out of bounds section index 0x%x in S_%S @ 0x%llx.", - sect_idx, cv_string_from_sym_kind(symbol_kind), symbol_offset); - } - return voff; -} - -internal Rng1U64 -lnk_virt_range_from_sect_off_size(U64 sect_idx, U64 sect_off, U64 size, COFF_SectionHeaderArray image_sects, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset) -{ - Rng1U64 virt_range = {0}; - if (sect_idx < image_sects.count) { - U64 voff = image_sects.v[sect_idx].voff + sect_off; - virt_range = rng_1u64(voff, voff + size); - } else { - lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Out of bounds section index 0x%x in S_%S @ 0x%llx.", - sect_idx, cv_string_from_sym_kind(symbol_kind), symbol_offset); - } - return virt_range; -} - -internal void -lnk_error_on_invalid_defrange_symbol(LNK_Obj *obj, CV_Symbol symbol) -{ - lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Unable to parse symbol stream, unexpected S_%S without preceding S_LOCAL @ 0x%llx.", - cv_string_from_sym_kind(symbol.kind), symbol.offset); -} - -internal void -lnk_error_on_missing_cv_frameproc(LNK_Obj *obj, CV_Symbol symbol) -{ - lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Missing S_FRAMEPROC, unable to parse S_%S @ 0x%llx.", - cv_string_from_sym_kind(symbol.kind), symbol.offset); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_find_obj_compiler_info_task) -{ - ProfBeginFunction(); - - LNK_ConvertUnitToRDITask *task = raw_task; - LNK_CodeViewCompilerInfo *comp_info = &task->comp_info_arr[task_id]; - - comp_info->arch = (CV_Arch)~0u; - comp_info->language = (CV_Language)~0u; - comp_info->compiler_name = str8_zero(); - - String8List symbols = cv_sub_section_from_debug_s(task->debug_s_arr[task_id], CV_C13SubSectionKind_Symbols); - - // infer unit compiler data from S_COMPILE* which always follows S_OBJ - for EachNode(n, String8Node, symbols.first) { - for (U64 cursor = 0; cursor < n->string.size; ) { - CV_Symbol symbol = {0}; NotImplemented; // TODO: @symbol_pass - if (symbol.kind == CV_SymKind_COMPILE) { - AssertAlways(sizeof(CV_SymCompile) <= symbol.data.size); - CV_SymCompile *compile = (CV_SymCompile *)symbol.data.str; - comp_info->arch = compile->machine; - comp_info->language = CV_CompileFlags_Extract_Language(compile->flags); - comp_info->compiler_name = str8_cstring_capped(compile + 1, symbol.data.str + symbol.data.size); - goto exit; - } else if (symbol.kind == CV_SymKind_COMPILE2) { - AssertAlways(sizeof(CV_SymCompile2) <= symbol.data.size); - CV_SymCompile2 *compile2 = (CV_SymCompile2 *)symbol.data.str; - comp_info->arch = compile2->machine; - comp_info->language = CV_Compile2Flags_Extract_Language(compile2->flags); - comp_info->compiler_name = str8_cstring_capped(compile2 + 1, symbol.data.str + symbol.data.size); - goto exit; - } else if (symbol.kind == CV_SymKind_COMPILE3) { - AssertAlways(sizeof(CV_SymCompile3) <= symbol.data.size); - CV_SymCompile3 *compile3 = (CV_SymCompile3 *)symbol.data.str; - comp_info->arch = compile3->machine; - comp_info->language = CV_Compile3Flags_Extract_Language(compile3->flags); - comp_info->compiler_name = str8_cstring_capped(compile3 + 1, symbol.data.str + symbol.data.size); - goto exit; - } - } - } - exit:; - - LNK_Obj *obj = task->obj_arr[task_id]; - - // fill out unit info - U64 unit_chunk_idx = task_id / task->unit_chunk_cap; - U64 local_unit_idx = task_id - unit_chunk_idx * task->unit_chunk_cap; - - RDIB_Unit *dst = &task->units[unit_chunk_idx].v[local_unit_idx]; - dst->arch = rdi_arch_from_cv_arch(comp_info->arch); - dst->unit_name = str8_skip_last_slash(obj->path); - dst->compiler_name = comp_info->compiler_name; - dst->source_file = str8_zero(); - dst->object_file = push_str8_copy(arena, obj->path); - dst->archive_file = lnk_obj_get_lib_path(obj); - dst->build_path = str8_zero(); - dst->language = rdi_language_from_cv_language(comp_info->language); - - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_convert_line_tables_to_rdi_task) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - U64 unit_idx = task_id; - LNK_ConvertUnitToRDITask *task = raw_task; - LNK_Obj *obj = task->obj_arr[unit_idx]; - CV_DebugS debug_s = task->debug_s_arr[unit_idx]; - - U64 unit_chunk_idx = unit_idx / task->unit_chunk_cap; - U64 local_unit_idx = unit_idx - unit_chunk_idx * task->unit_chunk_cap; - RDIB_Unit *dst = &task->units[unit_chunk_idx].v[local_unit_idx]; - - // find sub sections - String8 raw_string_table = cv_string_table_from_debug_s(debug_s); - String8 raw_file_chksms = cv_file_chksms_from_debug_s(debug_s); - String8List raw_lines_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines); - - // emit line table fragments for each source file from C13 line info - dst->line_table = rdib_line_table_chunk_list_push(arena, &task->line_tables[worker_id], task->line_table_cap); - - for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) { - String8 raw_lines = raw_lines_node->string; - CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(scratch.arena, raw_lines, rng_1u64(0, raw_lines.size)); - for (CV_C13LinesHeaderNode *lines_node = parsed_list.first; lines_node != 0; lines_node = lines_node->next) { - CV_C13LinesHeader parsed_lines = lines_node->v; - - // parse checksum header - if (parsed_lines.file_off + sizeof(CV_C13Checksum) > raw_file_chksms.size) { - lnk_error_obj(LNK_Warning_IllData, obj, "Out of bounds $$FILE_CHECKSUM offset (0x%llx) in line table header.", parsed_lines.file_off); - continue; - } - CV_C13Checksum *checksum_header = (CV_C13Checksum *) (raw_file_chksms.str + parsed_lines.file_off); - if (parsed_lines.file_off + sizeof(CV_C13Checksum) + checksum_header->len > raw_file_chksms.size) { - lnk_error_obj(LNK_Warning_IllData, obj, "Not enough bytes to read file checksum @ 0x%llx.", parsed_lines.file_off); - continue; - } - String8 file_path = str8_cstring_capped(raw_string_table.str + checksum_header->name_off, raw_string_table.str + raw_string_table.size); - String8 checksum_bytes = str8((U8 *) (checksum_header + 1), checksum_header->len); - - // read out lines - if (0 == parsed_lines.sec_idx || parsed_lines.sec_idx > task->image_sects.count) { - lnk_error_obj(LNK_Warning_IllData, obj, "Out of bounds section index (%u) in $$LINES; skip line info for \"%S\".", parsed_lines.sec_idx, file_path); - continue; - } - COFF_SectionHeader *sect = &task->image_sects.v[parsed_lines.sec_idx]; - CV_LineArray lines = cv_c13_line_array_from_data(arena, raw_lines, sect->voff, parsed_lines); - - // find source file for this line table - String8 normal_path = lnk_normalize_src_file_path(scratch.arena, file_path); - U64 src_file_hash = lnk_src_file_hash_cv(normal_path, checksum_header->kind, checksum_bytes); - LNK_SourceFileBucket *src_file_bucket = lnk_src_file_hash_table_lookup_slot(task->src_file_buckets, task->src_file_buckets_cap, src_file_hash, normal_path, checksum_header->kind, checksum_bytes); - if (src_file_bucket == 0) { - lnk_error_obj(LNK_Error_UnexpectedCodePath, obj, "Unable to find source file in the hash table: \"%S\".", file_path); - continue; - } - RDIB_SourceFile *src_file = src_file_bucket->src_file; - - // fill out line table fragment and atomically insert - RDIB_LineTableFragment *frag = rdib_line_table_push(arena, dst->line_table); - frag->src_file = src_file; - frag->voffs = lines.voffs; - frag->line_nums = lines.line_nums; - frag->col_nums = lines.col_nums; - frag->line_count = lines.line_count; - frag->col_count = lines.col_count; - - // build list of line table fragments per file - frag->next_src_file = ins_atomic_ptr_eval_assign(&src_file->line_table_frags, frag); - } - } - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_build_inlinee_lines_accels_task) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - LNK_ConvertUnitToRDITask *task = raw_task; - CV_DebugS debug_s = task->debug_s_arr[task_id]; - - String8List raw_inlinee_lines = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines); - CV_C13InlineeLinesParsedList inlinee_lines = cv_c13_inlinee_lines_from_sub_sections(arena, raw_inlinee_lines); - CV_InlineeLinesAccel *inlinee_lines_accel = cv_c13_make_inlinee_lines_accel(arena, inlinee_lines); - - task->inlinee_lines_accel_arr[task_id] = inlinee_lines_accel; - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - LNK_ConvertUnitToRDITask *task = raw_task; - LNK_SymbolInput symbols_input = task->symbol_inputs[task_id]; - LNK_Obj *obj = task->obj_arr[symbols_input.obj_idx]; - LNK_CodeViewCompilerInfo comp_info = task->comp_info_arr[symbols_input.obj_idx]; - CV_InlineeLinesAccel *inlinee_lines_accel = task->inlinee_lines_accel_arr[symbols_input.obj_idx]; - - RDI_Arch arch_rdi = rdi_arch_from_cv_arch(comp_info.arch); - - struct ScopeFrame { - struct ScopeFrame *prev; - RDIB_Scope *scope; - RDIB_Procedure *proc; - CV_ProcFlags proc_flags; - CV_SymFrameproc *frameproc; - U64 param_count; - U64 regrel32_idx; - RDIB_Variable *defrange_target; - }; -#define push_scope_frame() do { \ - struct ScopeFrame *frame; \ - if (free_scope_stack != 0) { \ - frame = free_scope_stack; \ - SLLStackPop_N(free_scope_stack, prev); \ - } else { \ - frame = push_array(scratch.arena, struct ScopeFrame, 1); \ - } \ - SLLStackPush_N(scope_stack, frame, prev); \ -} while (0) - - struct ScopeFrame *scope_stack = 0; - struct ScopeFrame *free_scope_stack = 0; - - // root frame - push_scope_frame(); - - for (U64 cursor = 0; cursor + sizeof(CV_SymbolHeader) <= symbols_input.raw_symbols.size; ) { - CV_Symbol symbol = {0}; - TryReadBreak(cv_read_symbol(symbols_input.raw_symbols, cursor, CV_SymbolAlign, &symbol), cursor); - - switch (symbol.kind) { - case CV_SymKind_COMPILE: - case CV_SymKind_COMPILE2: - case CV_SymKind_COMPILE3: { - // handled above - } break; - case CV_SymKind_INLINESITE_END: - case CV_SymKind_END: { - if (scope_stack != 0) { - // move top frame to free stack - struct ScopeFrame *free_frame = scope_stack; - SLLStackPop_N(scope_stack, prev); - SLLStackPush_N(free_scope_stack, free_frame, prev); - } else { - lnk_error_obj(LNK_Error_CvIllSymbolData, obj, "Encountered unbalanced blocks. Unable to finish symbol parse."); - goto exit; - } - } break; - case CV_SymKind_BLOCK32: { - CV_SymBlock32 *block32 = (CV_SymBlock32 *) symbol.data.str; - Rng1U64 virt_range = lnk_virt_range_from_sect_off_size(block32->sec, block32->off, block32->len, task->image_sects, obj, symbol.kind, symbol.offset); - - // push new scope node - RDIB_Scope *scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap); - - // fill out scope - scope->container_proc = scope_stack->proc; - scope->parent = scope_stack->scope; - SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, scope, next_sibling); - rng1u64_list_push(arena, &scope->ranges, virt_range); - -#if 0 - if (scope->parent) { - Assert(virt_range.min >= scope->parent->ranges.first->v.min); - Assert(virt_range.max <= scope->parent->ranges.first->v.max); - } -#endif - - // push new scope stack frame - push_scope_frame(); - scope_stack->scope = scope; - scope_stack->proc = scope->container_proc; - scope_stack->proc_flags = scope_stack->proc_flags; - scope_stack->frameproc = scope_stack->prev->frameproc; - } break; - case CV_SymKind_GDATA32: - case CV_SymKind_LDATA32: { - CV_SymData32 *data32 = (CV_SymData32 *) symbol.data.str; - String8 name = str8_cstring_capped(data32 + 1, symbol.data.str + symbol.data.size); - RDIB_Type *type = lnk_type_from_itype(data32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - RDIB_Type *container_type = lnk_find_container_type(name, task->tpi_itype_range, task->udt_name_buckets, task->udt_name_buckets_cap, task->tpi_itype_map); - U64 data_voff = lnk_voff_from_sect_off(data32->sec, data32->off, task->image_sects, obj, symbol.kind, symbol.offset); - - B32 is_comp_gen = symbol.kind == CV_SymKind_LDATA32 && name.size == 0 && type == 0; - if (!is_comp_gen) { - - // get link name through virtual offset look up - String8 link_name = {0}; - if (symbol.kind == CV_SymKind_GDATA32) { - BucketNode *pair = hash_table_search_u64(task->extern_symbol_voff_ht, data_voff); - if (pair != 0) { - LNK_Symbol *link_symbol = pair->v.value_raw; - link_name = link_symbol->name; - } - } - - // make module relative location - RDIB_LocationList locations = {0}; - { - RDIB_EvalBytecode bytecode = {0}; - rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_ModuleOff, data_voff); - - U64 data_size = rdib_size_from_type(type); - if (data_size == 0) { - data_size = max_U64; - } - - Rng1U64List ranges = {0}; - rng1u64_list_push(arena, &ranges, rng_1u64(data_voff, data_voff + data_size)); - - RDIB_Location location = rdib_make_location_addr_byte_stream(ranges, bytecode); - rdib_location_list_push(arena, &locations, location); - } - - RDIB_VariableChunkList *var_chunk_list = symbol.kind == CV_SymKind_GDATA32 ? - &task->extern_gvars[worker_id] : &task->static_gvars[worker_id]; - - // push new node - RDIB_Variable *gvar = rdib_variable_chunk_list_push(arena, var_chunk_list, task->symbol_chunk_cap); - gvar->name = name; - gvar->link_name = link_name; - gvar->type = type; - gvar->container_type = container_type; - gvar->container_proc = scope_stack->proc; - gvar->locations = locations; - } - } break; - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: { - CV_SymThread32 *thread32 = (CV_SymThread32 *) symbol.data.str; - String8 name = str8_cstring_capped(thread32 + 1, symbol.data.str + symbol.data.size); - RDIB_Type *type = lnk_type_from_itype(thread32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - RDIB_Type *container_type = lnk_find_container_type(name, task->tpi_itype_range, task->udt_name_buckets, task->udt_name_buckets_cap, task->tpi_itype_map); - - // make TLS offset location - RDIB_LocationList locations = {0}; - { - RDIB_EvalBytecode bytecode = {0}; - rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_TLSOff, thread32->tls_off); - - Rng1U64List ranges = {0}; - rng1u64_list_push(arena, &ranges, rng_1u64(0, max_U64)); - - RDIB_Location location = rdib_make_location_addr_byte_stream(ranges, bytecode); - rdib_location_list_push(arena, &locations, location); - } - - // push new node - RDIB_VariableChunkList *tvar_list = symbol.kind == CV_SymKind_GTHREAD32 ? &task->extern_tvars[worker_id] : &task->static_tvars[worker_id]; - RDIB_Variable *tvar = rdib_variable_chunk_list_push(arena, tvar_list, task->symbol_chunk_cap); - - // fill out thread variable - tvar->name = name; - tvar->link_name = str8(0,0); - tvar->type = type; - tvar->container_type = container_type; - tvar->container_proc = scope_stack->proc; - tvar->locations = locations; - } break; - case CV_SymKind_LPROC32_ID: - case CV_SymKind_GPROC32_ID: { - AssertAlways(!"linker converts *_ID symbols in post-process step, if we ever get to this case then we have a bug in post-process step"); - } break; - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: { - CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol.data.str; - String8 name = str8_cstring_capped(proc32 + 1, symbol.data.str + symbol.data.size); - RDIB_Type *type = lnk_type_from_itype(proc32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - Rng1U64 virt_range = lnk_virt_range_from_sect_off_size(proc32->sec, proc32->off, proc32->len, task->image_sects, obj, symbol.kind, symbol.offset); - - // infer container type for method - RDIB_Type *container_type = 0; - if (type != 0) { - if (type->kind == RDI_TypeKind_Method) { - container_type = (RDIB_Type *) type->method.class_type; - } else if (type->kind == RDI_TypeKindExt_StaticMethod) { - container_type = (RDIB_Type *) type->static_method.class_type; - } - } - - // get link name through virtual offset look up - String8 link_name = str8(0,0); - if (symbol.kind == CV_SymKind_GPROC32) { - LNK_Symbol *link_symbol = hash_table_search_u64_raw(task->extern_symbol_voff_ht, virt_range.min); - if (link_symbol) { - link_name = link_symbol->name; - } - } - - // scan ahead for context S_FRAMEPROC (must be defined in scope of PROC symbol) - CV_SymFrameproc *frameproc = 0; - { - U64 depth = 1; - for (U64 lookahead_off = cursor; lookahead_off + sizeof(CV_SymbolHeader) <= symbols_input.raw_symbols.size; ) { - CV_Symbol lookahead = {0}; - TryReadBreak(cv_read_symbol(symbols_input.raw_symbols, lookahead_off, CV_SymbolAlign, &lookahead), lookahead_off); - - if (lookahead.kind == CV_SymKind_FRAMEPROC) { - frameproc = str8_deserial_get_raw_ptr(lookahead.data, 0, sizeof(*frameproc)); - break; - } - if (cv_is_scope_symbol(lookahead.kind)) { - ++depth; - } else if (cv_is_end_symbol(lookahead.kind)) { - --depth; - if (depth == 0) { - break; - } - } - } - } - - // push new procedure node - RDIB_ProcedureChunkList *proc_list = symbol.kind == CV_SymKind_GPROC32 ? &task->extern_procs[worker_id] : &task->static_procs[worker_id]; - RDIB_Procedure *proc = rdib_procedure_chunk_list_push(arena, proc_list, task->symbol_chunk_cap); - - // push new scope node - RDIB_Scope *root_scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap); - root_scope->container_proc = proc; - root_scope->parent = scope_stack->scope; - if (scope_stack->scope != 0) { - SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, root_scope, next_sibling); - } - rng1u64_list_push(arena, &root_scope->ranges, virt_range); - - // fill out procedure - proc->name = name; - proc->link_name = link_name; - proc->type = type; - proc->container_type = container_type; - proc->container_proc = scope_stack->proc; - proc->scope = root_scope; - - // push scope frame - push_scope_frame(); - scope_stack->scope = root_scope; - scope_stack->proc = proc; - scope_stack->proc_flags = proc32->flags; - scope_stack->frameproc = frameproc; - - // set number of params for procedure on scope so we can figure out which S_REGREL32 is param - { - B32 is_proc_scope = (scope_stack->proc->scope == scope_stack->scope); - if (is_proc_scope) { - RDIB_Type *params = 0; - if (scope_stack->proc != 0) { - RDIB_Type *proc_type = scope_stack->proc->type; - if (proc_type != 0) { - if (proc_type->kind == RDI_TypeKind_NULL) { - // compiler generates procedures with no type for __try/__except, lambdas, and etc. - } else if (proc_type->kind == RDI_TypeKind_Function) { - params = (RDIB_Type *)proc_type->func.params_type; - } else if (proc_type->kind == RDI_TypeKind_Method) { - params = (RDIB_Type *)proc_type->method.params_type; - } else if (proc_type->kind == RDI_TypeKindExt_StaticMethod) { - params = (RDIB_Type *)proc_type->static_method.params_type; - } else { - InvalidPath; - } - } - } - if (params != 0) { - AssertAlways(params->kind == RDI_TypeKindExt_Params); - scope_stack->param_count = params->params.count; - scope_stack->regrel32_idx = 0; - } - } - } - } break; - case CV_SymKind_THUNK32: { - CV_SymThunk32 *thunk32 = (CV_SymThunk32 *) symbol.data.str; - String8 name = str8_cstring_capped(thunk32 + 1, symbol.data.str + symbol.data.size); - Rng1U64 virt_range = lnk_virt_range_from_sect_off_size(thunk32->sec, thunk32->off, thunk32->len, task->image_sects, obj, symbol.kind, symbol.offset); - - // scan ahead for context S_FRAMEPROC (must be defined in scope of PROC symbol) - CV_SymFrameproc *frameproc = 0; - { - U64 depth = 1; - for (U64 lookahead_off = cursor; lookahead_off + sizeof(CV_SymbolHeader) <= symbols_input.raw_symbols.size; ) { - CV_Symbol lookahead = {0}; - TryReadBreak(cv_read_symbol(symbols_input.raw_symbols, lookahead_off, CV_SymbolAlign, &lookahead), lookahead_off); - - if (lookahead.kind == CV_SymKind_FRAMEPROC) { - frameproc = str8_deserial_get_raw_ptr(lookahead.data, 0, sizeof(*frameproc)); - break; - } - if (cv_is_scope_symbol(lookahead.kind)) { - ++depth; - } else if (cv_is_end_symbol(lookahead.kind)) { - --depth; - if (depth == 0) { - break; - } - } - } - } - - // push new procedure node - RDIB_ProcedureChunkList *proc_list = &task->static_procs[worker_id]; - RDIB_Procedure *thunk = rdib_procedure_chunk_list_push(arena, proc_list, task->symbol_chunk_cap); - - // push new scope node - RDIB_Scope *root_scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap); - root_scope->container_proc = thunk; - root_scope->parent = scope_stack->scope; - if (scope_stack->scope != 0) { - SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, root_scope, next_sibling); - } - rng1u64_list_push(arena, &root_scope->ranges, virt_range); - - // fill out procedure - thunk->name = name; - thunk->type = 0; - thunk->scope = root_scope; - - // push scope frame - push_scope_frame(); - scope_stack->scope = root_scope; - scope_stack->proc = thunk; - scope_stack->proc_flags = 0; - scope_stack->frameproc = frameproc; - } break; - case CV_SymKind_REGREL32: { - if (~scope_stack->proc_flags & CV_ProcFlag_OptDbgInfo) { - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *) symbol.data.str; - String8 name = str8_cstring_capped(regrel32 + 1, symbol.data.str + symbol.data.size); - RDIB_Type *type = lnk_type_from_itype(regrel32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - - B32 is_ref = 0; - if (scope_stack->regrel32_idx < scope_stack->param_count) { - if (type != 0) { - U64 byte_size = rdib_size_from_type(type); - switch (comp_info.arch) { - case CV_Arch_8086: is_ref = byte_size > 4 || !IsPow2OrZero(byte_size); break; - case CV_Arch_X64: is_ref = byte_size > 8 || !IsPow2OrZero(byte_size); break; - default: NotImplemented; - } - } - } - - // push node - RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap); - SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local); - ++scope_stack->scope->local_count; - - // fill out local - local->name = name; - local->type = type; - - // encode location - RDI_RegCode reg_code = rdi_reg_code_from_cv(comp_info.arch, regrel32->reg); - U32 value_size = 8; - U32 value_pos = 0; - rdib_push_location_addr_reg_off(arena, &local->locations, arch_rdi, reg_code, value_size, value_pos, (S64)regrel32->reg_off, is_ref, scope_stack->scope->ranges); - - // advance reg rel index - ++scope_stack->regrel32_idx; - } - } break; - case CV_SymKind_LOCAL: { - CV_SymLocal *sym_local = (CV_SymLocal *) symbol.data.str; - String8 name = str8_cstring_capped(sym_local + 1, symbol.data.str + symbol.data.size); - RDIB_Type *type = lnk_type_from_itype(sym_local->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - - // reset defrange target - scope_stack->defrange_target = 0; - - if (sym_local->flags & CV_LocalFlag_Global) { - // TODO: apply global modifications - } else if (sym_local->flags & CV_LocalFlag_Static) { - // TODO: apply local modifications - } - - // push New node - RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap); - SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local); - ++scope_stack->scope->local_count; - - // fill out local - local->name = name; - local->type = type; - - scope_stack->defrange_target = local; - } break; - case CV_SymKind_FILESTATIC: { - CV_SymFileStatic *file_static = (CV_SymFileStatic *) symbol.data.str; - String8 name = str8_cstring_capped(file_static + 1, symbol.data.str + symbol.data.size); - RDIB_Type *type = lnk_type_from_itype(file_static->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - - // push New node - RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap); - SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local); - ++scope_stack->scope->local_count; - - // fill out local - local->name = name; - local->type = type; - - // set target for following defrange modifications - scope_stack->defrange_target = local; - } break; - case CV_SymKind_DEFRANGE_REGISTER: { - if (scope_stack->defrange_target == 0) { - lnk_error_on_invalid_defrange_symbol(obj, symbol); - break; - } - - CV_SymDefrangeRegister *defrange_reg = (CV_SymDefrangeRegister *) symbol.data.str; - RDI_RegCode reg_code = rdi_reg_code_from_cv(comp_info.arch, defrange_reg->reg); - CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_reg + 1); - U64 gap_count = (symbol.data.size - sizeof(*defrange_reg)) / sizeof(*gaps); - - Rng1U64 defrange = lnk_virt_range_from_sect_off_size(defrange_reg->range.sec, defrange_reg->range.off, defrange_reg->range.len, task->image_sects, obj, symbol.kind, symbol.offset); - Rng1U64List ranges = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count); - RDIB_Location location = rdib_make_location_val_reg(ranges, reg_code); - - rdib_location_list_push(arena, &scope_stack->defrange_target->locations, location); - } break; - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: { - if (scope_stack->defrange_target == 0) { - lnk_error_on_invalid_defrange_symbol(obj, symbol); - break; - } - if (scope_stack->frameproc == 0) { - lnk_error_on_missing_cv_frameproc(obj, symbol); - break; - } - - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel *)symbol.data.str; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_fprel + 1); - U64 gap_count = (symbol.data.size - sizeof(*defrange_fprel)) / sizeof(gaps[0]); - - B32 is_local_param = 0; - CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(scope_stack->frameproc, is_local_param); - CV_Reg fp_reg = cv_decode_fp_reg(comp_info.arch, encoded_fp_reg); - RDI_RegCode fp_reg_rdi = rdi_reg_code_from_cv(comp_info.arch, fp_reg); - Rng1U64 defrange = lnk_virt_range_from_sect_off_size(defrange_fprel->range.sec, defrange_fprel->range.off, defrange_fprel->range.len, task->image_sects, obj, symbol.kind, symbol.offset); - Rng1U64List ranges = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count); - U32 value_pos = 0; - U32 value_size = rdi_addr_size_from_arch(arch_rdi); - - rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, fp_reg_rdi, value_size, value_pos, (S64)defrange_fprel->off, 0, ranges); - } break; - case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: { - if (scope_stack->defrange_target == 0) { - lnk_error_on_invalid_defrange_symbol(obj, symbol); - break; - } - - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister *) symbol.data.str; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_subfield_register + 1); - U64 gap_count = (symbol.data.size - sizeof(*defrange_subfield_register)) / sizeof(gaps[0]); - RDI_RegCode reg_rdi = rdi_reg_code_from_cv(comp_info.arch, defrange_subfield_register->reg); - U32 value_pos = CV_DefrangeSubfieldRegister_Extract_ParentOffset(defrange_subfield_register->field_offset); - U32 value_size = cv_size_from_reg(comp_info.arch, defrange_subfield_register->reg) - value_pos; - Rng1U64 defrange = lnk_virt_range_from_sect_off_size(defrange_subfield_register->range.sec, defrange_subfield_register->range.off, defrange_subfield_register->range.len, task->image_sects, obj, symbol.kind, symbol.offset); - Rng1U64List ranges = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count); - - rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, reg_rdi, value_size, value_pos, 0, 0, ranges); - } break; - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: { - if (scope_stack->defrange_target == 0) { - lnk_error_on_invalid_defrange_symbol(obj, symbol); - break; - } - if (scope_stack->frameproc == 0) { - lnk_error_on_missing_cv_frameproc(obj, symbol); - break; - } - - CV_SymDefrangeFramepointerRelFullScope *defrange_fprelfs = (CV_SymDefrangeFramepointerRelFullScope *) symbol.data.str; - B32 is_local_param = 0; //scope_stack->defrange_target->kind == RDI_LocalKind_Parameter; - CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(scope_stack->frameproc, is_local_param); - CV_Reg fp_reg = cv_decode_fp_reg(comp_info.arch, encoded_fp_reg); - RDI_RegCode fp_reg_rdi = rdi_reg_code_from_cv(comp_info.arch, fp_reg); - U32 value_size = cv_size_from_reg(comp_info.arch, fp_reg); - U32 value_pos = 0; - Rng1U64List ranges = scope_stack->scope->ranges; // variable is available everywhere in the scope - - rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, fp_reg_rdi, value_size, value_pos, (S64)defrange_fprelfs->off, 0, ranges); - } break; - case CV_SymKind_DEFRANGE_REGISTER_REL: { - if (scope_stack->defrange_target == 0) { - lnk_error_on_invalid_defrange_symbol(obj, symbol); - break; - } - - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel *) symbol.data.str; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap *) (defrange_register_rel + 1); - U64 gap_count = (symbol.data.size - sizeof(*defrange_register_rel)) / sizeof(gaps[0]); - RDI_RegCode reg_rdi = rdi_reg_code_from_cv(comp_info.arch, defrange_register_rel->reg); - U64 value_size = cv_size_from_reg(comp_info.arch, defrange_register_rel->reg); - U64 value_pos = 0; - Rng1U64 defrange = lnk_virt_range_from_sect_off_size(defrange_register_rel->range.sec, defrange_register_rel->range.off, defrange_register_rel->range.len, task->image_sects, obj, symbol.kind, symbol.offset); - Rng1U64List ranges = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count); - - rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, reg_rdi, value_size, value_pos, (S64)defrange_register_rel->reg_off, 0, ranges); - } break; - case CV_SymKind_INLINESITE: { - CV_SymInlineSite *sym_inline_site = (CV_SymInlineSite *) symbol.data.str; - String8 binary_annots = str8_skip(symbol.data, sizeof(*sym_inline_site)); - - U64 parent_voff = 0; - if (scope_stack != 0) { - RDIB_Scope *proc_scope = scope_stack->proc->scope; - Assert(proc_scope->ranges.count == 1); - Rng1U64 scope_vrange = proc_scope->ranges.first->v; - parent_voff = scope_vrange.min; - } else { - Assert(!"S_INLINESITE doesn't have a parent procedure symbol"); - } - - // parse binary annots - CV_C13InlineeLinesParsed *inlinee_parsed = cv_c13_inlinee_lines_accel_find(inlinee_lines_accel, sym_inline_site->inlinee); - CV_InlineBinaryAnnotsParsed binary_annots_parsed = cv_c13_parse_inline_binary_annots(arena, parent_voff, inlinee_parsed, binary_annots); - - String8 name = str8_zero(); - RDIB_Type *type = 0; - RDIB_Type *owner = 0; - if (task->ipi_itype_range.min <= sym_inline_site->inlinee && sym_inline_site->inlinee < task->ipi_itype_range.max) { - U64 leaf_idx = sym_inline_site->inlinee - task->tpi_itype_range.min; - CV_Leaf leaf = cv_leaf_from_ptr(task->leaf_arr_ipi[leaf_idx]); - if (leaf.kind == CV_LeafKind_MFUNC_ID) { - if (sizeof(CV_LeafMFuncId) <= leaf.data.size) { - CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId *) leaf.data.str; - name = str8_cstring_capped_reverse(mfunc_id + 1, leaf.data.str + leaf.data.size); - type = lnk_type_from_itype(mfunc_id->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - owner = lnk_type_from_itype(mfunc_id->owner_itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - } else { - Assert(!"invalid leaf size"); - } - } else if (leaf.kind == CV_LeafKind_FUNC_ID) { - if (sizeof(CV_LeafFuncId) <= leaf.data.size) { - CV_LeafFuncId *func_id = (CV_LeafFuncId *) leaf.data.str; - name = str8_cstring_capped_reverse(func_id + 1, leaf.data.str + leaf.data.size); - type = lnk_type_from_itype(func_id->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - owner = lnk_type_from_itype(func_id->scope_string_id, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset); - } else { - Assert(!"invalid leaf size"); - } - } else { - Assert(!"inlinee must pointer to LF_FUNC_ID or LF_MFUNC_ID"); - } - } else { - Assert(!"out of bounds inlinee"); - } - - // fill out inline site - RDIB_InlineSite *inline_site = rdib_inline_site_chunk_list_push(arena, &task->inline_sites[worker_id], task->inline_site_cap); - inline_site->name = name; - inline_site->type = type; - inline_site->owner = owner; - - inline_site->convert_ref.ud0 = binary_annots_parsed.lines; - inline_site->convert_ref.ud1 = binary_annots_parsed.lines_count; - inline_site->convert_ref.ud2 = symbols_input.obj_idx; - - // fill out scope - RDIB_Scope *scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap); - scope->container_proc = scope_stack->proc; - scope->parent = scope_stack->scope; - scope->inline_site = inline_site; - scope->ranges = binary_annots_parsed.code_ranges; - - // push new scope stack frame - push_scope_frame(); - scope_stack->scope = scope; - scope_stack->proc = scope->container_proc; - scope_stack->proc_flags = scope_stack->proc_flags; - scope_stack->frameproc = scope_stack->prev->frameproc; - } break; - default: break; - } - } - exit:; - -#undef push_scope_frame - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_convert_inline_site_line_tables_task) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - LNK_ConvertUnitToRDITask *task = raw_task; - RDIB_InlineSiteChunk *chunk = task->inline_site_chunks[task_id]; - - RDIB_LineTableFragmentChunkList frag_chunk_list = {0}; - - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_InlineSite *inline_site = &chunk->v[i]; - - CV_LineArray *lines_arr = inline_site->convert_ref.ud0; - U64 lines_count = inline_site->convert_ref.ud1; - U64 obj_idx = inline_site->convert_ref.ud2; - - CV_DebugS debug_s = task->debug_s_arr[obj_idx]; - String8 raw_string_table = cv_string_table_from_debug_s(debug_s); - String8 raw_file_chksms = cv_file_chksms_from_debug_s(debug_s); - - if (lines_count > 0) { - inline_site->line_table = rdib_line_table_chunk_list_push(arena, &task->line_tables[worker_id], task->line_table_cap); - } else { - inline_site->line_table = task->null_line_table; - } - - // emit line tables for each file (yes, it is possbile to split inline site among two or more files via #include) - for (U64 file_idx = 0; file_idx < lines_count; ++file_idx) { - CV_LineArray lines = lines_arr[file_idx]; - - // prase checksum header - CV_C13Checksum *checksum_header = (CV_C13Checksum *) (raw_file_chksms.str + lines.file_off); - if (lines.file_off + sizeof(CV_C13Checksum) + checksum_header->len > raw_file_chksms.size) { - lnk_error_obj(LNK_Warning_IllData, task->obj_arr[obj_idx], "Not enough bytes to read file checksum @ 0x%llx.", lines.file_off); - continue; - } - String8 file_path = str8_cstring_capped(raw_string_table.str + checksum_header->name_off, raw_string_table.str + raw_string_table.size); - String8 checksum_bytes = str8((U8 *) (checksum_header + 1), checksum_header->len); - - // find source file for this line table - String8 normal_path = lnk_normalize_src_file_path(scratch.arena, file_path); - U64 src_file_hash = lnk_src_file_hash_cv(normal_path, checksum_header->kind, checksum_bytes); - LNK_SourceFileBucket *src_file_bucket = lnk_src_file_hash_table_lookup_slot(task->src_file_buckets, task->src_file_buckets_cap, src_file_hash, normal_path, checksum_header->kind, checksum_bytes); - if (src_file_bucket == 0) { - lnk_error_obj(LNK_Error_UnexpectedCodePath, task->obj_arr[obj_idx], "Unable to find source file in the hash table: \"%S\".", file_path); - continue; - } - RDIB_SourceFile *src_file = src_file_bucket->src_file; - - // fill out line table fragment - RDIB_LineTableFragment *frag = rdib_line_table_fragment_chunk_list_push(arena, &frag_chunk_list, chunk->count); - frag->src_file = src_file; - frag->voffs = lines.voffs; - frag->line_nums = lines.line_nums; - frag->col_nums = lines.col_nums; - frag->line_count = lines.line_count; - frag->col_count = lines.col_count; - - // build list of fragments per line table - rdib_line_table_push_fragment_node(inline_site->line_table, frag); - - // build list of line table fragments per file - frag->next_src_file = ins_atomic_ptr_eval_assign(&src_file->line_table_frags, frag); - } - } - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(lnk_collect_obj_virtual_ranges_task) -{ - ProfBeginFunction(); - - LNK_ConvertUnitToRDITask *task = raw_task; - - U64 unit_idx = task_id; - LNK_Obj *obj = task->obj_arr[unit_idx]; - - U64 unit_chunk_idx = unit_idx / task->unit_chunk_cap; - U64 local_unit_idx = unit_idx - unit_chunk_idx * task->unit_chunk_cap; - - RDIB_Unit *dst = &task->units[unit_chunk_idx].v[local_unit_idx]; - dst->virt_range_count = 0; - dst->virt_ranges = push_array_no_zero(arena, Rng1U64, obj->header.section_count_no_null); - - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; - - for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { - COFF_SectionHeader *sect_header = §ion_table[sect_idx]; - - if (sect_header->flags & COFF_SectionFlag_LnkRemove) { - continue; - } - if (sect_header->vsize == 0) { - continue; - } - - dst->virt_ranges[dst->virt_range_count] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize); - ++dst->virt_range_count; - } - - // free unused memory - arena_pop(arena, sizeof(dst->virt_ranges[0]) * (obj->header.section_count_no_null - dst->virt_range_count)); - - ProfEnd(); -} - -internal String8List -lnk_build_rad_debug_info(TP_Context *tp, - TP_Arena *tp_arena, - OperatingSystem os, - RDI_Arch arch, - String8 image_name, - String8 image_data, - U64 obj_count, - LNK_Obj **obj_arr, - CV_DebugS *debug_s_arr, - U64 symbol_input_count, - LNK_SymbolInput *symbol_inputs, - CV_SymbolListArray *parsed_symbols, - LNK_MergedTypes types) -{ - ProfBegin("RDI"); - Temp scratch = scratch_begin(tp_arena->v,tp_arena->count); - - RDIB_Input input = rdib_init_input(scratch.arena); - - COFF_SectionHeaderArray image_sects; - String8 image_strtab; - { - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, image_data); - image_sects.count = pe.section_count; - image_sects.v = (COFF_SectionHeader *)str8_substr(image_data, pe.section_table_range).str; - image_strtab = str8_substr(image_data, pe.string_table_range); - } - - ProfBegin("Top Level Info"); - { - U64 image_vsize = 0; - for (U64 sect_idx = 0; sect_idx < image_sects.count; sect_idx++) { - COFF_SectionHeader *sect = &image_sects.v[sect_idx]; - image_vsize = Max(image_vsize, sect->voff + sect->vsize); - } - - input.top_level_info.arch = arch; - input.top_level_info.exe_name = image_name; - input.top_level_info.exe_hash = rdi_hash(image_data.str, image_data.size); - input.top_level_info.voff_max = image_vsize; - input.top_level_info.producer_string = push_str8f(scratch.arena, "%s [Debug Info: CodeView]", BUILD_VERSION_STRING_LITERAL); - } - ProfEnd(); - - ProfBegin("Sections"); - { - input.sect_count = image_sects.count; - input.sections = push_array(scratch.arena, RDIB_BinarySection, image_sects.count); - for (U64 sect_idx = 0; sect_idx < image_sects.count; ++sect_idx) { - COFF_SectionHeader *src = &image_sects.v[sect_idx]; - RDIB_BinarySection *dst = &input.sections[sect_idx]; - String8 sect_name = coff_name_from_section_header(image_strtab, src); - - dst->name = push_str8_copy(scratch.arena, sect_name); - dst->flags = rdi_binary_section_flags_from_coff_section_flags(src->flags); - dst->voff_first = src->voff; - dst->voff_opl = src->voff + src->vsize; - dst->foff_first = src->foff; - dst->foff_opl = src->foff + src->fsize; - } - } - ProfEnd(); - - // assing low and high type indices per source - Rng1U64 itype_ranges[CV_TypeIndexSource_COUNT]; - for (U64 i = 0; i < ArrayCount(itype_ranges); ++i) { - itype_ranges[i] = rng_1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + types.count[i]); - } - - ProfBegin("Convert Types"); - U64 udt_name_buckets_cap; - LNK_UDTNameBucket **udt_name_buckets; - RDIB_Type **tpi_itype_map; - { - ProfBegin("Push TPI itype -> RDIB Type map"); - tpi_itype_map = push_array(scratch.arena, RDIB_Type *, itype_ranges[CV_TypeIndexSource_TPI].max); - ProfEnd(); - - ProfBegin("Push Built-in Types"); - RDIB_DataModel data_model = rdib_infer_data_model(os, arch); - lnk_push_basic_itypes(scratch.arena, data_model, tpi_itype_map, &input.types); - ProfEnd(); - - Assert(tpi_itype_map[0] == 0); - tpi_itype_map[0] = input.null_type; - - ProfBegin("Build UDT Name Hash Table"); - // TODO: fix memory life-time - udt_name_buckets_cap = 0; - udt_name_buckets = lnk_udt_name_hash_table_from_leaf_arr(tp, tp_arena, types.count[CV_TypeIndexSource_TPI], types.v[CV_TypeIndexSource_TPI], &udt_name_buckets_cap); - ProfEnd(); - - - ProfBegin("Convert CodeView types to RDIB Types"); - LNK_ConvertTypesToRDI task = {0}; - MemoryCopyTyped(task.leaf_count, types.count, CV_TypeIndexSource_COUNT); - MemoryCopyTyped(task.leaf_arr, types.v, CV_TypeIndexSource_COUNT); - task.type_cap = input.type_cap; - task.udt_cap = input.udt_cap; - task.variadic_type_ref = rdib_make_type_ref(scratch.arena, input.variadic_type); - task.itype_ranges = itype_ranges; - task.tpi_itype_map = tpi_itype_map; - task.udt_name_bucket_cap = udt_name_buckets_cap; - task.udt_name_buckets = udt_name_buckets; - task.rdib_types_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); - task.rdib_types_struct_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); - task.rdib_types_union_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); - task.rdib_types_enum_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); - task.rdib_types_udt_members_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); - task.rdib_types_enum_members_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); - task.rdib_types_params_lists = push_array(scratch.arena, RDIB_TypeChunkList, tp->worker_count); - task.rdib_udt_members_lists = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count); - task.rdib_enum_members_lists = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count); - task.ranges = tp_divide_work(scratch.arena, types.count[CV_TypeIndexSource_TPI], tp->worker_count); - tp_for_parallel(tp, tp_arena, tp->worker_count, lnk_convert_types_to_rdi_task, &task); - ProfEnd(); - - ProfBegin("Concat converted types"); - rdib_type_chunk_list_concat_in_place_many (&input.types, task.rdib_types_lists, tp->worker_count); - rdib_type_chunk_list_concat_in_place_many (&input.struct_list, task.rdib_types_struct_lists, tp->worker_count); - rdib_type_chunk_list_concat_in_place_many (&input.union_list, task.rdib_types_union_lists, tp->worker_count); - rdib_type_chunk_list_concat_in_place_many (&input.enum_list, task.rdib_types_enum_lists, tp->worker_count); - rdib_type_chunk_list_concat_in_place_many (&input.param_types, task.rdib_types_params_lists, tp->worker_count); - rdib_type_chunk_list_concat_in_place_many (&input.member_types, task.rdib_types_udt_members_lists, tp->worker_count); - rdib_type_chunk_list_concat_in_place_many (&input.enum_types, task.rdib_types_enum_members_lists, tp->worker_count); - rdib_udt_member_chunk_list_concat_in_place_many(&input.udt_members, task.rdib_udt_members_lists, tp->worker_count); - rdib_udt_member_chunk_list_concat_in_place_many(&input.enum_members, task.rdib_enum_members_lists, tp->worker_count); - ProfEnd(); - - // types are converted and we can remove indirection and release 'itype_map' - ProfBegin("Deref Type Refs"); - rdib_deref_type_refs(tp, &input.types); - rdib_deref_type_refs(tp, &input.struct_list); - rdib_deref_type_refs(tp, &input.union_list); - rdib_deref_type_refs(tp, &input.enum_list); - rdib_deref_type_refs(tp, &input.param_types); - rdib_deref_type_refs(tp, &input.member_types); - rdib_deref_type_refs(tp, &input.enum_types); - ProfEnd(); - } - ProfEnd(); - - // Loop over source files in objs and build a hash table - // for path -> source file maps. During symbol conversion - // we use the hash table to lookup source files and append - // inline site line tables. - U64 src_file_buckets_cap; - LNK_SourceFileBucket **src_file_buckets; - { - ProfBegin("Build Source File Hash Table"); - - LNK_ConvertSourceFilesToRDITask task = {0}; - task.obj_arr = obj_arr; - task.debug_s_arr = debug_s_arr; - - ProfBegin("Count Source Files"); - tp_for_parallel(tp, 0, obj_count, lnk_count_source_files_task, &task); - ProfEnd(); - - ProfBeginDynamic("Insert Source Files [Count %llu]", task.total_src_file_count); - task.src_file_buckets_cap = (U64)(task.total_src_file_count * 1.3); - task.src_file_buckets = push_array(tp_arena->v[0], LNK_SourceFileBucket*, task.src_file_buckets_cap); - tp_for_parallel(tp, tp_arena, obj_count, lnk_insert_src_files_task, &task); - ProfEnd(); - - src_file_buckets_cap = task.src_file_buckets_cap; - src_file_buckets = task.src_file_buckets; - - ProfEnd(); - } - - // Copy source files to a contiguous array and update source file pointers - // in buckets so we can do lookup and compute source file index in output array - // with a pointer subtraction. - ProfBegin("Source Files"); - for (U64 bucket_idx = 0; bucket_idx < src_file_buckets_cap; ++bucket_idx) { - LNK_SourceFileBucket *bucket = src_file_buckets[bucket_idx]; - if (bucket != 0) { - RDIB_SourceFile *new_src_file = rdib_source_file_chunk_list_push(scratch.arena, &input.src_files, input.src_file_chunk_cap); - - // restore chunk pointer after copy - RDIB_SourceFileChunk *new_src_file_chunk = new_src_file->chunk; - *new_src_file = *bucket->src_file; - new_src_file->chunk = new_src_file_chunk; - - bucket->src_file = new_src_file; - } - } - ProfEnd(); - - ProfBegin("Units"); - { - LNK_ConvertUnitToRDITask task = {0}; - task.image_sects = image_sects; - task.obj_arr = obj_arr; - task.debug_s_arr = debug_s_arr; - task.leaf_arr_count_ipi = types.count[CV_TypeIndexSource_IPI]; - task.leaf_arr_ipi = types.v[CV_TypeIndexSource_IPI]; - task.symbol_inputs = symbol_inputs; - task.ipi_itype_range = itype_ranges[CV_TypeIndexSource_IPI]; - task.tpi_itype_range = itype_ranges[CV_TypeIndexSource_TPI]; - task.tpi_itype_map = tpi_itype_map; - task.src_file_buckets_cap = src_file_buckets_cap; - task.src_file_buckets = src_file_buckets; - task.udt_name_buckets = udt_name_buckets; - task.udt_name_buckets_cap = udt_name_buckets_cap; - task.src_file_chunk_cap = input.src_file_chunk_cap; - task.line_table_cap = input.line_table_cap; - task.symbol_chunk_cap = input.symbol_chunk_cap; - task.unit_chunk_cap = input.unit_chunk_cap; - task.inline_site_cap = input.inline_site_cap; - task.null_line_table = input.null_line_table; - task.extern_symbol_voff_ht = hash_table_init(scratch.arena, 256); - task.units = rdib_unit_chunk_list_reserve_ex(scratch.arena, &input.units, input.unit_chunk_cap, obj_count); - task.scopes = push_array(scratch.arena, RDIB_ScopeChunkList, tp->worker_count); - task.locals = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); - task.extern_gvars = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); - task.static_gvars = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); - task.extern_tvars = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); - task.static_tvars = push_array(scratch.arena, RDIB_VariableChunkList, tp->worker_count); - task.extern_procs = push_array(scratch.arena, RDIB_ProcedureChunkList, tp->worker_count); - task.static_procs = push_array(scratch.arena, RDIB_ProcedureChunkList, tp->worker_count); - task.inline_sites = push_array(scratch.arena, RDIB_InlineSiteChunkList, tp->worker_count); - task.line_tables = push_array(scratch.arena, RDIB_LineTableChunkList, tp->worker_count); - - ProfBegin("Gather Compiler Info"); - task.comp_info_arr = push_array(scratch.arena, LNK_CodeViewCompilerInfo, obj_count); - tp_for_parallel(tp, tp_arena, obj_count, lnk_find_obj_compiler_info_task, &task); - ProfEnd(); - - ProfBegin("Convert Line Tables"); - tp_for_parallel(tp, tp_arena, obj_count, lnk_convert_line_tables_to_rdi_task, &task); - ProfEnd(); - - ProfBegin("Build Inlinee Lines Accels"); - task.inlinee_lines_accel_arr = push_array(scratch.arena, CV_InlineeLinesAccel *, obj_count); - tp_for_parallel(tp, tp_arena, obj_count, lnk_build_inlinee_lines_accels_task, &task); - ProfEnd(); - - ProfBegin("Convert Symbols"); - tp_for_parallel(tp, tp_arena, symbol_input_count, lnk_convert_symbols_to_rdi_task, &task); - ProfEnd(); - - ProfBegin("Convert Inline Sites Line Tables"); - rdib_inline_site_chunk_list_concat_in_place_many(&input.inline_sites, task.inline_sites, tp->worker_count); - task.inline_site_chunks = rdib_array_from_inline_site_chunk_list(scratch.arena, input.inline_sites); - tp_for_parallel(tp, tp_arena, input.inline_sites.count, lnk_convert_inline_site_line_tables_task, &task); - ProfEnd(); - - ProfBegin("Collect Units Virtual Ranges"); - tp_for_parallel(tp, tp_arena, obj_count, lnk_collect_obj_virtual_ranges_task, &task); - ProfEnd(); - - rdib_line_table_chunk_list_concat_in_place_many(&input.line_tables, task.line_tables, tp->worker_count); - rdib_scope_chunk_list_concat_in_place_many(&input.scopes, task.scopes, tp->worker_count); - rdib_variable_chunk_list_concat_in_place_many(&input.locals, task.locals, tp->worker_count); - rdib_variable_chunk_list_concat_in_place_many(&input.extern_gvars, task.extern_gvars, tp->worker_count); - rdib_variable_chunk_list_concat_in_place_many(&input.static_gvars, task.static_gvars, tp->worker_count); - rdib_variable_chunk_list_concat_in_place_many(&input.extern_tvars, task.extern_tvars, tp->worker_count); - rdib_variable_chunk_list_concat_in_place_many(&input.static_tvars, task.static_tvars, tp->worker_count); - rdib_procedure_chunk_list_concat_in_place_many(&input.extern_procs, task.extern_procs, tp->worker_count); - rdib_procedure_chunk_list_concat_in_place_many(&input.static_procs, task.static_procs, tp->worker_count); - } - ProfEnd(); - - String8List rdi_data = rdib_finish(tp, tp_arena, &input); - - scratch_end(scratch); - ProfEnd(); - return rdi_data; -} - diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 1f97fa23..d93c66eb 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -162,120 +162,6 @@ typedef struct String8List *maps; } LNK_TypeNameReplacer; -//////////////////////////////// -// RDI - -typedef struct -{ - String8 name; - U64 leaf_idx; -} LNK_UDTNameBucket; - -typedef struct -{ - U64 leaf_count; - U8 **leaf_arr; - Rng1U64 *ranges; - U64 buckets_cap; - LNK_UDTNameBucket **buckets; -} LNK_BuildUDTNameHashTableTask; - -typedef struct -{ - CV_DebugT debug_t; - CV_TypeIndex ti_lo; - Rng1U64 *ranges; - U64 udt_name_buckets_cap; - LNK_UDTNameBucket **udt_name_buckets; - CV_TypeIndex *fwdmap; -} LNK_BuildUDTFwdMapTask; - -typedef struct -{ - U64 leaf_count[CV_TypeIndexSource_COUNT]; - U8 **leaf_arr[CV_TypeIndexSource_COUNT]; - U64 type_cap; - U64 udt_cap; - RDIB_TypeRef variadic_type_ref; - Rng1U64 *itype_ranges; - U64 udt_name_bucket_cap; - LNK_UDTNameBucket **udt_name_buckets; - RDIB_Type **tpi_itype_map; - RDIB_TypeChunkList *rdib_types_lists; - RDIB_TypeChunkList *rdib_types_struct_lists; - RDIB_TypeChunkList *rdib_types_union_lists; - RDIB_TypeChunkList *rdib_types_enum_lists; - RDIB_TypeChunkList *rdib_types_params_lists; - RDIB_TypeChunkList *rdib_types_udt_members_lists; - RDIB_TypeChunkList *rdib_types_enum_members_lists; - RDIB_UDTMemberChunkList *rdib_udt_members_lists; - RDIB_UDTMemberChunkList *rdib_enum_members_lists; - Rng1U64 *ranges; -} LNK_ConvertTypesToRDI; - -typedef struct -{ - U64 obj_idx; - RDIB_SourceFile *src_file; -} LNK_SourceFileBucket; - -typedef struct -{ - LNK_Obj **obj_arr; - CV_DebugS *debug_s_arr; - U64 total_src_file_count; - LNK_SourceFileBucket **src_file_buckets; - U64 src_file_buckets_cap; -} LNK_ConvertSourceFilesToRDITask; - -typedef struct -{ - CV_Arch arch; - CV_Language language; - String8 compiler_name; -} LNK_CodeViewCompilerInfo; - -typedef struct -{ - COFF_SectionHeaderArray image_sects; - LNK_Obj **obj_arr; - CV_DebugS *debug_s_arr; - U64 leaf_arr_count_ipi; - U8 **leaf_arr_ipi; - LNK_SymbolInput *symbol_inputs; - Rng1U64 ipi_itype_range; - Rng1U64 tpi_itype_range; - RDIB_Type **tpi_itype_map; - U64 src_file_buckets_cap; - LNK_SourceFileBucket **src_file_buckets; - LNK_UDTNameBucket **udt_name_buckets; - U64 line_table_cap; - U64 udt_name_buckets_cap; - U64 src_file_chunk_cap; - U64 symbol_chunk_cap; - U64 unit_chunk_cap; - U64 inline_site_cap; - RDIB_LineTable *null_line_table; - HashTable *extern_symbol_voff_ht; - LNK_CodeViewCompilerInfo *comp_info_arr; - CV_InlineeLinesAccel **inlinee_lines_accel_arr; - - RDIB_InlineSiteChunk **inline_site_chunks; - - // output - RDIB_UnitChunk *units; - RDIB_VariableChunkList *locals; - RDIB_ScopeChunkList *scopes; - RDIB_VariableChunkList *extern_gvars; - RDIB_VariableChunkList *static_gvars; - RDIB_VariableChunkList *extern_tvars; - RDIB_VariableChunkList *static_tvars; - RDIB_ProcedureChunkList *extern_procs; - RDIB_ProcedureChunkList *static_procs; - RDIB_InlineSiteChunkList *inline_sites; - RDIB_LineTableChunkList *line_tables; -} LNK_ConvertUnitToRDITask; - //////////////////////////////// // CodeView @@ -296,46 +182,3 @@ internal void lnk_replace_type_names_with_hashes (TP_Context *tp, TP internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types); -//////////////////////////////// -// RDI - -internal U64 lnk_udt_name_hash_table_hash (String8 string); -internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out); -internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name); -internal CV_TypeIndex * lnk_build_udt_fwdmap (TP_Context *tp, Arena *arena, CV_DebugT debug_t, CV_TypeIndex ti_lo, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap); - -internal RDIB_TypeRef lnk_rdib_type_from_itype (LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); -internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop (CV_MethodProp prop); -internal LNK_SourceFileBucket * lnk_src_file_hash_table_hash (String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); -internal LNK_SourceFileBucket * lnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **src_file_buckets, U64 src_file_buckets_cap, U64 hash, String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes); - -internal String8List -lnk_build_rad_debug_info(TP_Context *tp, - TP_Arena *tp_arena, - OperatingSystem os, - RDI_Arch arch, - String8 image_name, - String8 image_data, - U64 obj_count, - LNK_Obj **obj_arr, - CV_DebugS *debug_s_arr, - U64 symbol_input_count, - LNK_SymbolInput *symbol_inputs, - CV_SymbolListArray *parsed_symbols, - LNK_MergedTypes types); - -internal U64 lnk_udt_name_hash_table_hash (String8 string); -internal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_leaf_arr(TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, U64 *buckets_cap_out); -internal LNK_UDTNameBucket * lnk_udt_name_hash_table_lookup (LNK_UDTNameBucket **buckets, U64 cap, String8 name); - -internal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context *tp, - Arena *arena, - CV_DebugT debug_t, - CV_TypeIndex ti_lo, - LNK_UDTNameBucket **udt_name_buckets, - U64 udt_name_buckets_cap); - -internal void lnk_init_rdib_itype_map (Arena *arena, RDI_Arch arch, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list); -internal RDIB_TypeRef lnk_rdib_type_from_itype (LNK_ConvertTypesToRDI *task, CV_TypeIndex itype); -internal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop); - diff --git a/src/linker/rdi/rdi_builder.c b/src/linker/rdi/rdi_builder.c deleted file mode 100644 index 710bfa19..00000000 --- a/src/linker/rdi/rdi_builder.c +++ /dev/null @@ -1,5584 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal RDIB_DataModel -rdib_infer_data_model(OperatingSystem os, RDI_Arch arch) -{ - RDIB_DataModel data_model = RDIB_DataModel_Null; - switch (os) { - case OperatingSystem_Null: break; - case OperatingSystem_Windows: { - switch (arch) { - case RDI_Arch_X64: - data_model = RDIB_DataModel_LLP64; break; - default: NotImplemented; - } - } break; - case OperatingSystem_Linux: { - switch (arch) { - case RDI_Arch_X64: data_model = RDIB_DataModel_LLP64; break; - default: NotImplemented; - } - } break; - case OperatingSystem_Mac: { - switch (arch) { - case RDI_Arch_X64: data_model = RDIB_DataModel_LP64; break; - } - } break; - default: InvalidPath; - } - return data_model; -} - -internal RDI_TypeKind -rdib_short_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_S16; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_S16; - case RDIB_DataModel_LP64 : return RDI_TypeKind_S16; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_S16; - case RDIB_DataModel_SILP64: return RDI_TypeKind_S64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -internal RDI_TypeKind -rdib_unsigned_short_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_U16; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_U16; - case RDIB_DataModel_LP64 : return RDI_TypeKind_U16; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_U16; - case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -internal RDI_TypeKind -rdib_int_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_S32; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_S32; - case RDIB_DataModel_LP64 : return RDI_TypeKind_S32; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64; - case RDIB_DataModel_SILP64: return RDI_TypeKind_S64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -internal RDI_TypeKind -rdib_unsigned_int_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_U32; - case RDIB_DataModel_LP64 : return RDI_TypeKind_U32; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -internal RDI_TypeKind -rdib_long_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_S32; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_S32; - case RDIB_DataModel_LP64 : return RDI_TypeKind_S64; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64; - case RDIB_DataModel_SILP64: return RDI_TypeKind_S64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -internal RDI_TypeKind -rdib_unsigned_long_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_U32; - case RDIB_DataModel_LP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -internal RDI_TypeKind -rdib_long_long_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_S64; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_S64; - case RDIB_DataModel_LP64 : return RDI_TypeKind_S64; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64; - case RDIB_DataModel_SILP64: return RDI_TypeKind_S64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -internal RDI_TypeKind -rdib_unsigned_long_long_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_U64; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_LP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -internal RDI_TypeKind -rdib_pointer_size_t_type_from_data_model(RDIB_DataModel data_model) -{ - switch (data_model) { - case RDIB_DataModel_Null : break; - case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32; - case RDIB_DataModel_LLP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_LP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64; - case RDIB_DataModel_SILP64: return RDI_TypeKind_U64; - default: InvalidPath; - } - return RDI_TypeKind_NULL; -} - -//////////////////////////////// - -internal void -rdib_udt_member_list_push_node(RDIB_UDTMemberList *list, RDIB_UDTMember *node) -{ - SLLQueuePushCount(list, node); -} - -internal void -rdib_udt_member_list_concat_in_place(RDIB_UDTMemberList *list, RDIB_UDTMemberList *to_concat) -{ - SLLConcatInPlace(list, to_concat); -} - -internal void -rdib_line_table_push_fragment_node(RDIB_LineTable *list, RDIB_LineTableFragment *n) -{ - SLLQueuePush_N(list->first, list->last, n, next_line_table); - ++list->count; -} - -internal RDIB_LineTableFragment * -rdib_line_table_push(Arena *arena, RDIB_LineTable *list) -{ - RDIB_LineTableFragment *n = push_array(arena, RDIB_LineTableFragment, 1); - rdib_line_table_push_fragment_node(list, n); - return n; -} - -//////////////////////////////// - -internal RDIB_LineTableFragment * -rdib_line_table_fragment_chunk_list_push(Arena *arena, RDIB_LineTableFragmentChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_LineTableFragment); - return SLLChunkListLastItem(list); -} - -internal RDIB_Unit * -rdib_unit_chunk_list_push(Arena *arena, RDIB_UnitChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_Unit); - return SLLChunkListLastItem(list); -} - -internal RDIB_Scope * -rdib_scope_chunk_list_push(Arena *arena, RDIB_ScopeChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_Scope); - return SLLChunkListLastItem(list); -} - -internal RDIB_Procedure * -rdib_procedure_chunk_list_push(Arena *arena, RDIB_ProcedureChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_Procedure); - return SLLChunkListLastItem(list); -} - -internal RDIB_Variable * -rdib_variable_chunk_list_push(Arena *arena, RDIB_VariableChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_Variable); - return SLLChunkListLastItem(list); -} - -internal RDIB_LineTable * -rdib_line_table_chunk_list_push(Arena *arena, RDIB_LineTableChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_LineTable); - return SLLChunkListLastItem(list); -} - -internal RDIB_Type * -rdib_type_chunk_list_push(Arena *arena, RDIB_TypeChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_Type); - RDIB_Type *type = SLLChunkListLastItem(list); - type->final_idx = 0; - return type; -} - -internal RDIB_UDTMember * -rdib_udt_member_chunk_list_push(Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_UDTMember); - return SLLChunkListLastItem(list); -} - -internal RDIB_SourceFile * -rdib_source_file_chunk_list_push(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_SourceFile); - return SLLChunkListLastItem(list); -} - -internal RDIB_InlineSite * -rdib_inline_site_chunk_list_push(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap) -{ - SLLChunkListPush(arena, list, cap, RDIB_InlineSite); - return SLLChunkListLastItem(list); -} - -internal RDIB_Unit * -rdib_unit_chunk_list_push_zero(Arena *arena, RDIB_UnitChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_Unit); - return SLLChunkListLastItem(list); -} - -internal RDIB_Scope * -rdib_scope_chunk_list_push_zero(Arena *arena, RDIB_ScopeChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_Scope); - return SLLChunkListLastItem(list); -} - -internal RDIB_Procedure * -rdib_procedure_chunk_list_push_zero(Arena *arena, RDIB_ProcedureChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_Procedure); - return SLLChunkListLastItem(list); -} - -internal RDIB_Variable * -rdib_variable_chunk_list_push_zero(Arena *arena, RDIB_VariableChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_Variable); - return SLLChunkListLastItem(list); -} - -internal RDIB_LineTable * -rdib_line_table_chunk_list_push_zero(Arena *arena, RDIB_LineTableChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_LineTable); - return SLLChunkListLastItem(list); -} - -internal RDIB_Type * -rdib_type_chunk_list_push_zero(Arena *arena, RDIB_TypeChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_Type); - return SLLChunkListLastItem(list); -} - -internal RDIB_UDTMember * -rdib_udt_member_chunk_list_push_zero(Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_UDTMember); - return SLLChunkListLastItem(list); -} - -internal RDIB_SourceFile * -rdib_source_file_chunk_list_push_zero(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_SourceFile); - return SLLChunkListLastItem(list); -} - -internal RDIB_InlineSite * -rdib_inline_site_chunk_list_push_zero(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap) -{ - SLLChunkListPushZero(arena, list, cap, RDIB_InlineSite); - return SLLChunkListLastItem(list); -} - -internal RDIB_UnitChunk * -rdib_unit_chunk_list_reserve_ex(Arena *arena, RDIB_UnitChunkList *list, U64 count_per_chunk, U64 item_count) -{ - U64 chunk_count = CeilIntegerDiv(item_count, count_per_chunk); - RDIB_UnitChunk *chunks = push_array(arena, RDIB_UnitChunk, chunk_count); - U64 base = list->last ? list->last->base : 0; - - for (U64 i = 0; i+1 < chunk_count; i += 1, item_count -= count_per_chunk, base += count_per_chunk) { - chunks[i].base = base; - chunks[i].count = count_per_chunk; - chunks[i].cap = count_per_chunk; - chunks[i].v = push_array(arena, RDIB_Unit, count_per_chunk); - SLLQueuePush(list->first, list->last, &chunks[i]); - - for (U64 k = 0; k < count_per_chunk; ++k) { - chunks[i].v[k].chunk = &chunks[i]; - } - } - - chunks[chunk_count-1].base = base; - chunks[chunk_count-1].count = item_count; - chunks[chunk_count-1].cap = item_count; - chunks[chunk_count-1].v = push_array(arena, RDIB_Unit, item_count); - for (U64 k = 0; k < item_count; ++k) { - chunks[chunk_count-1].v[k].chunk = &chunks[chunk_count-1]; - } - - SLLQueuePush(list->first, list->last, &chunks[chunk_count-1]); - list->count += chunk_count; - - return chunks; -} - -internal void -rdib_unit_chunk_list_reserve(Arena *arena, RDIB_UnitChunkList *list, U64 cap) -{ - // fill out node - RDIB_UnitChunk *chunk = push_array(arena, RDIB_UnitChunk, 1); - chunk->cap = cap; - chunk->v = push_array(arena, RDIB_Unit, cap); - - // push node to list - SLLQueuePush(list->first, list->last, chunk); - list->count += 1; -} - -internal void -rdib_type_chunk_list_reserve(Arena *arena, RDIB_TypeChunkList *list, U64 cap) -{ - // fill out node - RDIB_TypeChunk *chunk = push_array(arena, RDIB_TypeChunk, 1); - chunk->cap = cap; - chunk->v = push_array(arena, RDIB_Type, cap); - - // push node to list - SLLQueuePush(list->first, list->last, chunk); - list->count += 1; -} - -internal void -rdib_source_file_list_reserve(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap) -{ - // fill out node - RDIB_SourceFileChunk *chunk = push_array(arena, RDIB_SourceFileChunk, 1); - chunk->cap = cap; - chunk->v = push_array(arena, RDIB_SourceFile, cap); - - // push node to list - SLLQueuePush(list->first, list->last, chunk); - list->count += 1; -} - -internal void -rdib_unit_chunk_list_concat_in_place(RDIB_UnitChunkList *list, RDIB_UnitChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_UnitChunk); -} - -internal void -rdib_scope_chunk_list_concat_in_place(RDIB_ScopeChunkList *list, RDIB_ScopeChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_ScopeChunk); -} - -internal void -rdib_udt_member_chunk_list_concat_in_place(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_UDTMemberChunk); -} - -internal void -rdib_procedure_chunk_list_concat_in_place(RDIB_ProcedureChunkList *list, RDIB_ProcedureChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_ProcedureChunk); -} - -internal void -rdib_variable_chunk_list_concat_in_place(RDIB_VariableChunkList *list, RDIB_VariableChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_VariableChunk); -} - -internal void -rdib_line_table_chunk_list_concat_in_place(RDIB_LineTableChunkList *list, RDIB_LineTableChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_LineTableChunk); -} - -internal void -rdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_InlineSiteChunk); -} - -internal void -rdib_type_chunk_list_concat_in_place(RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_TypeChunk); -} - -internal void -rdib_source_file_chunk_list_concat_in_place(RDIB_SourceFileChunkList *list, RDIB_SourceFileChunkList *to_concat) -{ - SLLConcatInPlaceChunkList(list, to_concat, RDIB_SourceFileChunk); -} - -internal void -rdib_line_table_chunk_list_concat_in_place_many(RDIB_LineTableChunkList *list, RDIB_LineTableChunkList *to_concat, U64 count) -{ - SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_LineTableChunk, count); -} - -internal void -rdib_scope_chunk_list_concat_in_place_many(RDIB_ScopeChunkList *list, RDIB_ScopeChunkList *to_concat, U64 count) -{ - SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_ScopeChunk, count); -} - -internal void -rdib_variable_chunk_list_concat_in_place_many(RDIB_VariableChunkList *list, RDIB_VariableChunkList *to_concat, U64 count) -{ - SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_VariableChunk, count); -} - -internal void -rdib_procedure_chunk_list_concat_in_place_many(RDIB_ProcedureChunkList *list, RDIB_ProcedureChunkList *to_concat, U64 count) -{ - SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_ProcedureChunk, count); -} - -internal void -rdib_inline_site_chunk_list_concat_in_place_many(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat, U64 count) -{ - SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_InlineSiteChunk, count); -} - -internal void -rdib_type_chunk_list_concat_in_place_many(RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat, U64 count) -{ - SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_TypeChunk, count); -} - -internal void -rdib_udt_member_chunk_list_concat_in_place_many(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat, U64 count) -{ - SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_UDTMemberChunk, count); -} - -internal RDIB_UnitChunk ** -rdib_array_from_unit_chunk_list(Arena *arena, RDIB_UnitChunkList list) -{ - ProfBeginFunction(); - RDIB_UnitChunk **result = push_array_no_zero(arena, RDIB_UnitChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_UnitChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { - result[chunk_idx] = chunk; - } - ProfEnd(); - return result; -} - -internal RDIB_ScopeChunk ** -rdib_array_from_scope_chunk_list(Arena *arena, RDIB_ScopeChunkList list) -{ - ProfBeginFunction(); - RDIB_ScopeChunk **result = push_array_no_zero(arena, RDIB_ScopeChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_ScopeChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { - result[chunk_idx] = chunk; - } - ProfEnd(); - return result; -} - -internal RDIB_VariableChunk ** -rdib_array_from_variable_chunk_list(Arena *arena, RDIB_VariableChunkList list) -{ - ProfBeginFunction(); - RDIB_VariableChunk **result = push_array_no_zero(arena, RDIB_VariableChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_VariableChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { - result[chunk_idx] = chunk; - } - ProfEnd(); - return result; -} - -internal RDIB_LineTableChunk ** -rdib_array_from_line_table_chunk_list(Arena *arena, RDIB_LineTableChunkList list) -{ - ProfBeginFunction(); - RDIB_LineTableChunk **result = push_array_no_zero(arena, RDIB_LineTableChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_LineTableChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { - result[chunk_idx] = chunk; - } - ProfEnd(); - return result; -} - -internal RDIB_ProcedureChunk ** -rdib_array_from_procedure_chunk_list(Arena *arena, RDIB_ProcedureChunkList list) -{ - ProfBeginFunction(); - RDIB_ProcedureChunk **result = push_array_no_zero(arena, RDIB_ProcedureChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_ProcedureChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { - result[chunk_idx] = chunk; - } - ProfEnd(); - return result; -} - -internal RDIB_InlineSiteChunk ** -rdib_array_from_inline_site_chunk_list(Arena *arena, RDIB_InlineSiteChunkList list) -{ - ProfBeginFunction(); - RDIB_InlineSiteChunk **result = push_array_no_zero(arena, RDIB_InlineSiteChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_InlineSiteChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { - result[chunk_idx] = chunk; - } - ProfEnd(); - return result; -} - -internal RDIB_UDTMemberChunk ** -rdib_array_from_udt_member_chunk_list(Arena *arena, RDIB_UDTMemberChunkList list) -{ - ProfBeginFunction(); - RDIB_UDTMemberChunk **result = push_array_no_zero(arena, RDIB_UDTMemberChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_UDTMemberChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { - result[chunk_idx] = chunk; - } - ProfEnd(); - return result; -} - -internal RDIB_TypeChunk ** -rdib_array_from_type_chunk_list(Arena *arena, RDIB_TypeChunkList list) -{ - ProfBeginFunction(); - RDIB_TypeChunk **result = push_array_no_zero(arena, RDIB_TypeChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_TypeChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) { - result[chunk_idx] = chunk; - } - ProfEnd(); - return result; -} - -internal RDIB_SourceFileChunk ** -rdib_array_from_source_file_chunk_list(Arena *arena, RDIB_SourceFileChunkList list) -{ - ProfBeginFunction(); - RDIB_SourceFileChunk **result = push_array_no_zero(arena, RDIB_SourceFileChunk *, list.count); - U64 chunk_idx = 0; - for (RDIB_SourceFileChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - result[chunk_idx++] = chunk; - } - ProfEnd(); - return result; -} - -internal U64 -rdib_unit_chunk_list_total_count(RDIB_UnitChunkList list) -{ - U64 total_count = 0; - for (RDIB_UnitChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U64 -rdib_scope_chunk_list_total_count(RDIB_ScopeChunkList list) -{ - U64 total_count = 0; - for (RDIB_ScopeChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U64 -rdib_variable_chunk_list_total_count(RDIB_VariableChunkList list) -{ - U64 total_count = 0; - for (RDIB_VariableChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U64 -rdib_line_table_chunk_list_total_count(RDIB_LineTableChunkList list) -{ - U64 total_count = 0; - for (RDIB_LineTableChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U64 -rdib_procedure_chunk_list_total_count(RDIB_ProcedureChunkList list) -{ - U64 total_count = 0; - for (RDIB_ProcedureChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U64 -rdib_inline_site_chunk_list_total_count(RDIB_InlineSiteChunkList list) -{ - U64 total_count = 0; - for (RDIB_InlineSiteChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U64 -rdib_udt_member_chunk_list_total_count(RDIB_UDTMemberChunkList list) -{ - U64 total_count = 0; - for (RDIB_UDTMemberChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U64 -rdib_type_chunk_list_total_count(RDIB_TypeChunkList list) -{ - U64 total_count = 0; - for (RDIB_TypeChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U64 -rdib_source_file_chunk_list_total_count(RDIB_SourceFileChunkList list) -{ - U64 total_count = 0; - for (RDIB_SourceFileChunk *chunk = list.first; chunk != 0; chunk = chunk->next) { - total_count += chunk->count; - } - return total_count; -} - -internal U32 -rdib_idx_from_unit(RDIB_Unit *n) -{ - U32 idx = 0; - if (n) { - Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); - idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); - Assert(idx - n->chunk->base < n->chunk->count); - } - return idx; -} - -internal U32 -rdib_idx_from_scope(RDIB_Scope *n) -{ - U32 idx = 0; - if (n) { - Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); - idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); - Assert(idx - n->chunk->base < n->chunk->count); - } - return idx; -} - -internal U32 -rdib_idx_from_inline_site(RDIB_InlineSite *n) -{ - U32 idx = 0; - if (n) { - Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); - idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); - Assert(idx - n->chunk->base < n->chunk->count); - } - return idx; -} - -internal U32 -rdib_idx_from_variable(RDIB_Variable *n) -{ - U32 idx = 0; - if (n) { - Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); - idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); - Assert(idx - n->chunk->base < n->chunk->count); - } - return idx; -} - -internal U32 -rdib_idx_from_procedure(RDIB_Procedure *n) -{ - U32 idx = 0; - if (n) { - Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); - idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); - Assert(idx - n->chunk->base < n->chunk->count); - } - return idx; -} - -internal U32 -rdib_idx_from_source_file(RDIB_SourceFile *n) -{ - U32 idx = 0; - if (n) { - Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); - idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); - Assert(idx - n->chunk->base < n->chunk->count); - } - return idx; -} - -internal U32 -rdib_idx_from_line_table(RDIB_LineTable *n) -{ - U32 idx = 0; - if (n) { - Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count)); - idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v)); - Assert(idx - n->chunk->base < n->chunk->count); - } - return idx; -} - -internal U32 -rdib_idx_from_type(RDIB_Type *n) -{ - U32 idx = 0; - if (n) { - idx = safe_cast_u32(n->final_idx); - } - return idx; -} - -internal U32 -rdib_idx_from_udt_type(RDIB_Type *n) -{ - U32 idx = 0; - if (n && RDI_IsUserDefinedType(n->kind)) { - idx = safe_cast_u32(n->udt.udt_idx); - } - return idx; -} - -//////////////////////////////// -// Source File - -internal B32 -rdib_source_file_match(RDIB_SourceFile *a, RDIB_SourceFile *b, OperatingSystem os) -{ - StringMatchFlags match_flags = path_match_flags_from_os(os); - if (str8_match(a->normal_full_path, b->normal_full_path, match_flags)) { - if (a->checksum_kind == b->checksum_kind) { - if (str8_match(a->checksum, b->checksum, 0)) { - return 1; - } - } - } - return 0; -} - -//////////////////////////////// -// Eval Ops - -internal RDIB_EvalBytecodeOp * -rdib_bytecode_push_op(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p) -{ - RDIB_EvalBytecodeOp *node = push_array(arena, RDIB_EvalBytecodeOp, 1); - node->op = op; - node->p_size = RDI_DECODEN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[op]); - node->p = p; - - SLLQueuePush(bytecode->first, bytecode->last, node); - bytecode->count += 1; - bytecode->size += 1 + node->p_size; - - return node; -} - -internal void -rdib_bytecode_push_ucsont(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_U64 uconst) -{ - if (uconst <= max_U8) { - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, uconst); - } else if (uconst <= max_U16) { - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, uconst); - } else if (uconst <= max_U32) { - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, uconst); - } else { - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, uconst); - } -} - -internal void -rdib_bytecode_push_sconst(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_S64 sconst) -{ - if (min_S8 <= sconst && sconst <= max_S8) { - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)sconst); - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8); - } else if (min_S16 <= sconst && sconst <= max_S16) { - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)sconst); - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16); - } else if (min_S32 <= sconst && sconst <= max_S32) { - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)sconst); - } else { - rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)sconst); - } -} - -//////////////////////////////// -// Location - -internal RDIB_Location -rdib_make_location_addr_byte_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode) -{ - RDIB_Location loc = {0}; - loc.ranges = ranges; - loc.kind = RDI_LocationKind_AddrBytecodeStream; - loc.bytecode = bytecode; - return loc; -} - -internal RDIB_Location -rdib_make_location_addr_bytecode_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode) -{ - RDIB_Location loc = {0}; - loc.ranges = ranges; - loc.kind = RDI_LocationKind_AddrBytecodeStream; - loc.bytecode = bytecode; - return loc; -} - -internal RDIB_Location -rdib_make_location_val_bytecode_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode) -{ - RDIB_Location loc = {0}; - loc.ranges = ranges; - loc.kind = RDI_LocationKind_ValBytecodeStream; - loc.bytecode = bytecode; - return loc; -} - -internal RDIB_Location -rdib_make_location_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset) -{ - RDIB_Location loc = {0}; - loc.ranges = ranges; - loc.kind = RDI_LocationKind_AddrRegPlusOff; - loc.reg_code = reg_code; - loc.offset = offset; - return loc; -} - -internal RDIB_Location -rdib_make_location_addr_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset) -{ - RDIB_Location loc = {0}; - loc.kind = RDI_LocationKind_AddrAddrRegPlusOff; - loc.ranges = ranges; - loc.reg_code = reg_code; - loc.offset = offset; - return loc; -} - -internal RDIB_Location -rdib_make_location_val_reg(Rng1U64List ranges, RDI_RegCode reg_code) -{ - RDIB_Location loc = {0}; - loc.kind = RDI_LocationKind_ValReg; - loc.ranges = ranges; - loc.reg_code = reg_code; - return loc; -} - -internal RDIB_LocationNode * -rdib_location_list_push(Arena *arena, RDIB_LocationList *list, RDIB_Location v) -{ - RDIB_LocationNode *node = push_array(arena, RDIB_LocationNode, 1); - node->v = v; - SLLQueuePush(list->first, list->last, node); - ++list->count; - return node; -} - -internal RDIB_LocationNode * -rdib_push_location_addr_reg_off(Arena *arena, RDIB_LocationList *list, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 is_reference, Rng1U64List ranges) -{ - RDIB_Location loc; - - if (0 <= offset && offset <= (S64)max_U16) { - if (is_reference) { - loc = rdib_make_location_addr_addr_reg_plus_u16(ranges, reg_code, (U16)offset); - } else { - loc = rdib_make_location_addr_reg_plus_u16(ranges, reg_code, (U16)offset); - } - } - - // long offset, emit byte code - else { - RDIB_EvalBytecode bytecode = {0}; - U32 reg_read_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); - rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, reg_read_param); - rdib_bytecode_push_sconst(arena, &bytecode, offset); - rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); - - if (is_reference) { - U64 addr_size = rdi_addr_size_from_arch(arch); - rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size); - } - - loc = rdib_make_location_addr_bytecode_stream(ranges, bytecode); - } - - RDIB_LocationNode *node = rdib_location_list_push(arena, list, loc); - return node; -} - -internal void -rdib_variable_list_push_node(RDIB_VariableList *list, RDIB_VariableNode *node) -{ - SLLQueuePush(list->first, list->last, node); - ++list->count; -} - -internal RDIB_VariableNode * -rdib_variable_list_push(Arena *arena, RDIB_VariableList *list) -{ - RDIB_VariableNode *node = push_array(arena, RDIB_VariableNode, 1); - rdib_variable_list_push_node(list, node); - return node; -} - -//////////////////////////////// -// Types - -internal U64 -rdib_size_from_type(RDIB_Type *type) -{ - if (type) { - switch (type->kind) { - case RDI_TypeKind_Void: - case RDI_TypeKind_Char8: - case RDI_TypeKind_Char16: - case RDI_TypeKind_Char32: - case RDI_TypeKind_UChar8: - case RDI_TypeKind_UChar16: - case RDI_TypeKind_UChar32: - case RDI_TypeKind_U8: - case RDI_TypeKind_U16: - case RDI_TypeKind_U32: - case RDI_TypeKind_U64: - case RDI_TypeKind_U128: - case RDI_TypeKind_U256: - case RDI_TypeKind_U512: - case RDI_TypeKind_S8: - case RDI_TypeKind_S16: - case RDI_TypeKind_S32: - case RDI_TypeKind_S64: - case RDI_TypeKind_S128: - case RDI_TypeKind_S256: - case RDI_TypeKind_S512: - case RDI_TypeKind_Bool: - case RDI_TypeKind_F16: - case RDI_TypeKind_F32: - case RDI_TypeKind_F32PP: - case RDI_TypeKind_F48: - case RDI_TypeKind_F64: - case RDI_TypeKind_F80: - case RDI_TypeKind_F128: - case RDI_TypeKind_ComplexF32: - case RDI_TypeKind_ComplexF64: - case RDI_TypeKind_ComplexF80: - case RDI_TypeKind_ComplexF128: - case RDI_TypeKind_Handle: - return type->builtin.size; - case RDI_TypeKind_Modifier: - return rdib_size_from_type((RDIB_Type *)type->modifier.type_ref); - case RDI_TypeKind_Ptr: - case RDI_TypeKind_LRef: - case RDI_TypeKind_RRef: - return type->ptr.size; - case RDI_TypeKind_Array: - return type->array.size; - - case RDI_TypeKind_Function: - case RDI_TypeKind_Method: - case RDI_TypeKindExt_StaticMethod: { - Assert(!"check"); - return 0; - } - case RDI_TypeKind_Struct: - case RDI_TypeKind_Class: - case RDI_TypeKind_IncompleteStruct: - case RDI_TypeKind_IncompleteClass: - return type->udt.struct_type.size; - - case RDI_TypeKind_Union: - case RDI_TypeKind_IncompleteUnion: - return type->udt.union_type.size; - - case RDI_TypeKind_Alias: - Assert(!"check"); - - case RDI_TypeKind_Enum: - case RDI_TypeKind_IncompleteEnum: - return rdib_size_from_type(type->udt.enum_type.base_type); - - case RDI_TypeKind_MemberPtr: - case RDI_TypeKind_Bitfield: - case RDI_TypeKind_Variadic: - case RDI_TypeKindExt_Members: - case RDI_TypeKindExt_Params: - InvalidPath; // no size - } - } - return 0; -} - -internal RDIB_TypeRef -rdib_make_type_ref(Arena *arena, RDIB_Type *type) -{ - RDIB_Type **ref = push_array(arena, RDIB_Type *, 1); - ref[0] = type; - return ref; -} - -internal void -rdib_deref_type_refs(TP_Context *tp, RDIB_TypeChunkList *list) -{ - for (RDIB_TypeChunk *chunk = list->first; chunk != 0; chunk = chunk->next) { - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Type *type = &chunk->v[i]; - if (type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Class || - type->kind == RDI_TypeKind_IncompleteStruct || type->kind == RDI_TypeKind_IncompleteClass) { - type->udt.members = *(RDIB_Type **)type->udt.members; - type->udt.struct_type.derived = *(RDIB_Type **)type->udt.struct_type.derived; - type->udt.struct_type.vtshape = *(RDIB_Type **)type->udt.struct_type.vtshape; - } else if (type->kind == RDI_TypeKind_Enum || type->kind == RDI_TypeKind_IncompleteEnum) { - type->udt.members = *(RDIB_Type **)type->udt.members; - type->udt.enum_type.base_type = *(RDIB_Type **)type->udt.enum_type.base_type; - } else if (type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_IncompleteUnion) { - type->udt.members = *(RDIB_Type **)type->udt.members; - } else if (type->kind == RDI_TypeKind_Array) { - type->array.entry_type = *(RDIB_Type **)type->array.entry_type; - } else if (type->kind == RDI_TypeKind_Function) { - type->func.return_type = *(RDIB_Type **)type->func.return_type; - type->func.params_type = *(RDIB_Type **)type->func.params_type; - } else if (type->kind == RDI_TypeKind_Method) { - type->method.class_type = *(RDIB_Type **)type->method.class_type; - type->method.this_type = *(RDIB_Type **)type->method.this_type; - type->method.return_type = *(RDIB_Type **)type->method.return_type; - type->method.params_type = *(RDIB_Type **)type->method.params_type; - } else if (type->kind == RDI_TypeKindExt_StaticMethod) { - type->static_method.class_type = *(RDIB_Type **)type->static_method.class_type; - type->static_method.return_type = *(RDIB_Type **)type->static_method.return_type; - type->static_method.params_type = *(RDIB_Type **)type->static_method.params_type; - } else if (type->kind == RDI_TypeKind_Ptr || type->kind == RDI_TypeKind_LRef || type->kind == RDI_TypeKind_RRef) { - type->ptr.type_ref = *(RDIB_Type **)type->ptr.type_ref; - } else if (type->kind == RDI_TypeKind_Modifier) { - type->modifier.type_ref = *(RDIB_Type **)type->modifier.type_ref; - } else if (type->kind == RDI_TypeKind_Bitfield) { - type->bitfield.value_type = *(RDIB_Type **)type->bitfield.value_type; - } else if (type->kind == RDI_TypeKindExt_Params) { - for (U64 i = 0; i < type->params.count; ++i) { - type->params.types[i] = *(RDIB_Type **)type->params.types[i]; - } - } else if (type->kind == RDI_TypeKindExt_Members) { - for (RDIB_UDTMember *member = type->members.list.first; member != 0; member = member->next) { - switch (member->kind) { - case RDI_MemberKind_NULL: break; - case RDI_MemberKind_DataField: { - member->data_field.type_ref = *(RDIB_Type **)member->data_field.type_ref; - } break; - case RDI_MemberKind_StaticData: { - member->static_data.type_ref = *(RDIB_Type **)member->static_data.type_ref; - } break; - case RDI_MemberKind_Method: { - member->method.type_ref = *(RDIB_Type **)member->method.type_ref; - } break; - case RDI_MemberKind_NestedType: { - member->nested_type.type_ref = *(RDIB_Type **)member->nested_type.type_ref; - } break; - case RDI_MemberKind_Base: { - member->base_class.type_ref = *(RDIB_Type **)member->base_class.type_ref; - } break; - case RDI_MemberKind_VirtualBase: { - member->virtual_base_class.type_ref = *(RDIB_Type **)member->virtual_base_class.type_ref; - } break; - case RDI_MemberKindExt_MemberListPointer: { - member->member_list_pointer = *(RDIB_Type **)member->member_list_pointer; - } break; -#if 0 - case RDI_MemberKind_Enumerate: { - // no types - } break; -#endif - default: InvalidPath; - } - } - } - } - } -} - -internal U64 -rdib_sizeof_type(RDIB_Type *type) -{ - U64 size = 0; - if (RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind < RDI_TypeKind_LastBuiltIn) { - size = type->builtin.size; - } else if (type->kind == RDI_TypeKind_Modifier) { - size = rdib_sizeof_type(type->modifier.type_ref); - } else if (type->kind == RDI_TypeKind_Ptr || type->kind == RDI_TypeKind_LRef || type->kind == RDI_TypeKind_RRef) { - size = type->ptr.size; - } else if (type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Class || - type->kind == RDI_TypeKind_IncompleteStruct || type->kind == RDI_TypeKind_IncompleteClass) { - size = type->udt.struct_type.size; - } else if (type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_IncompleteUnion) { - size = type->udt.union_type.size; - } else if (type->kind == RDI_TypeKind_Enum || type->kind == RDI_TypeKind_IncompleteEnum) { - size = rdib_sizeof_type(type->udt.enum_type.base_type); - } else if (type->kind == RDI_TypeKind_Bitfield) { - size = rdib_sizeof_type(type->bitfield.value_type); - } else if (type->kind == RDI_TypeKind_Array) { - size = type->array.size; - } else { - Assert(!"error: type doens't have a size"); - } - return size; -} - -internal U64 -rdib_count_members_deep(RDIB_Type *type) -{ - U64 member_count = 0; - for (RDIB_UDTMember *member = type->members.list.first; member != 0; member = member->next) { - if (member->kind == RDI_MemberKindExt_MemberListPointer) { - member_count += rdib_count_members_deep(member->member_list_pointer); - } else { - member_count += 1; - } - } - return member_count; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_type_stats_task) -{ - ProfBeginFunction(); - - RDIB_TypeStatsTask *task = raw_task; - RDIB_TypeChunk *chunk = task->chunks[task_id]; - - for (U64 itype = 0; itype < chunk->count; ++itype) { - RDIB_Type *type = chunk->v + itype; - - if (type->kind == RDI_TypeKind_Class || type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_Enum) { - task->type_stats->udt_counts[task_id] += 1; - } - } - - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_concat_members_task) -{ - ProfBeginFunction(); - RDIB_MembersTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Type *type = &chunk->v[i]; - RDIB_UDTMemberList acc = {0}; - - for (RDIB_Type *curr = type; ;) { - // concat members - rdib_udt_member_list_concat_in_place(&acc, &curr->members.list); - - // does this type continue member list? - if (acc.count == 0 || acc.last->kind != RDI_MemberKindExt_MemberListPointer) { - break; - } - - // remove member list pointer - RDIB_UDTMember *continuation = acc.last; - SLLQueuePop(acc.first, acc.last); - --acc.count; - - // advance to next type - curr = continuation->member_list_pointer; - - // other types should not reference any part of member list except for head type. - Assert(curr->kind == RDI_TypeKindExt_Members); - curr->kind = RDI_TypeKind_NULL; - } - - // update member list - type->members.list = acc; - } - } - - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_count_head_members_task) -{ - ProfBeginFunction(); - RDIB_MembersTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Type *type = &chunk->v[i]; - if (type->kind == RDI_TypeKindExt_Members) { - task->counts[task_id] += type->members.list.count; - } - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_assign_head_member_indices_task) -{ - ProfBeginFunction(); - RDIB_MembersTask *task = raw_task; - U64 cursor = task->offsets[task_id]; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Type *type = &chunk->v[i]; - if (type->kind == RDI_TypeKindExt_Members) { - type->members.first_member_idx = cursor; - cursor += type->members.list.count; - } - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_fill_udt_members_task) -{ - ProfBeginFunction(); - RDIB_MembersTask *task = raw_task; - RDIB_TypeChunk *chunk = task->type_chunks[task_id]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Type *type = chunk->v + i; - Assert(type->kind == RDI_TypeKindExt_Members); - - U64 member_idx = 0; - for (RDIB_UDTMember *src = type->members.list.first; src != 0; src = src->next, ++member_idx) { - U64 idx = type->members.first_member_idx + member_idx; - RDI_Member *dst = &task->udt_members_rdi[idx]; - - switch (src->kind) { - case RDI_MemberKind_NULL: { - MemoryZeroStruct(dst); - } break; - case RDI_MemberKind_DataField: { - dst->kind = RDI_MemberKind_DataField; - dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->data_field.name); - dst->type_idx = rdib_idx_from_type(src->data_field.type_ref); - dst->off = src->data_field.offset; - } break; - case RDI_MemberKind_StaticData: { - dst->kind = RDI_MemberKind_StaticData; - dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->static_data.name); - dst->type_idx = rdib_idx_from_type(src->static_data.type_ref); - } break; - case RDI_MemberKind_Method: - case RDI_MemberKind_StaticMethod: - case RDI_MemberKind_VirtualMethod: { - dst->kind = src->kind; - dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->method.name); - dst->type_idx = rdib_idx_from_type(src->method.type_ref); - dst->off = src->method.vftable_offset; - } break; - case RDI_MemberKind_Base: { - dst->kind = RDI_MemberKind_Base; - dst->name_string_idx = 0; - dst->type_idx = rdib_idx_from_type(src->base_class.type_ref); - dst->off = src->base_class.offset; - } break; - case RDI_MemberKind_VirtualBase: { - dst->kind = RDI_MemberKind_VirtualBase; - dst->name_string_idx = 0; - dst->type_idx = rdib_idx_from_type(src->virtual_base_class.type_ref); - dst->off = 0; // TODO: ??? - } break; - case RDI_MemberKind_NestedType: { - dst->kind = RDI_MemberKind_NestedType; - dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->nested_type.name); - dst->type_idx = rdib_idx_from_type(src->nested_type.type_ref); - dst->off = 0; - } break; - case RDI_MemberKindExt_MemberListPointer: { - InvalidPath; - } break; - } - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_fill_enum_members_task) -{ - ProfBeginFunction(); - RDIB_MembersTask *task = raw_task; - RDIB_TypeChunk *chunk = task->type_chunks[task_id]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Type *type = chunk->v + i; - - if (type->kind != RDI_TypeKindExt_Members) continue; - - U64 member_idx = 0; - for (RDIB_UDTMember *src = type->members.list.first; src != 0; src = src->next, ++member_idx) { - U64 idx = type->members.first_member_idx + member_idx; - RDI_EnumMember *dst = &task->enum_members_rdi[idx]; - dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->enumerate.name); - dst->val = src->enumerate.value; - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_fill_udts_task) -{ - ProfBeginFunction(); - RDIB_UserDefinesTask *task = raw_task; - - U64 ichunk = task_id; - RDIB_TypeChunk *chunk = task->type_chunks[ichunk]; - U64 udt_cursor = task->udt_base_idx[ichunk]; - U64 udt_cap = task->type_stats.udt_counts[ichunk]; - - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Type *type = &chunk->v[i]; - - if (RDI_IsCompleteUserDefinedTypeKind(type->kind)) { - RDIB_Type *members_type = type->udt.members; - - // assign UDT idx - type->udt.udt_idx = udt_cursor; - - // fill out struct/class UDT - Assert(udt_cursor < task->udt_base_idx[ichunk] + udt_cap); - RDI_UDT *udt = &task->udts[udt_cursor++]; - udt->self_type_idx = rdib_idx_from_type(type); - udt->flags = type->kind == RDI_TypeKind_Enum ? RDI_UDTFlag_EnumMembers : 0; - if (members_type->members.list.count > 0) { - udt->member_first = members_type->members.first_member_idx; - udt->member_count = members_type->members.list.count; - } else { - udt->member_first = 0; - udt->member_count = 0; - } - udt->file_idx = 0; - udt->line = 0; - udt->col = 0; - } - } - - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_type_nodes_task) -{ - Temp scratch = scratch_begin(0, 0); - - U64 ichunk = task_id; - RDIB_TypeNodesTask *task = raw_task; - RDIB_TypeChunk *chunk = task->type_chunks[ichunk]; - - for (U64 itype = 0; itype < chunk->count; ++itype) { - RDIB_Type *src = &chunk->v[itype]; - U64 dst_idx = rdib_idx_from_type(src); - RDI_TypeNode *dst = &task->type_nodes[dst_idx]; - - if (src->kind == RDI_TypeKind_NULL) { - MemoryZeroStruct(dst); - dst->kind = RDI_TypeKind_NULL; - } else if (RDI_TypeKind_FirstBuiltIn <= src->kind && src->kind <= RDI_TypeKind_LastBuiltIn) { - dst->kind = src->kind; - dst->flags = 0; - dst->byte_size = src->builtin.size; - dst->built_in.name_string_idx = rdib_idx_from_string_map(task->string_map, src->builtin.name); - } else if (src->kind == RDI_TypeKind_Modifier) { - dst->kind = RDI_TypeKind_Modifier; - dst->byte_size = rdib_sizeof_type(src->modifier.type_ref); - dst->flags = src->modifier.flags; - dst->constructed.direct_type_idx = rdib_idx_from_type(src->modifier.type_ref); - } else if (src->kind == RDI_TypeKind_Ptr || src->kind == RDI_TypeKind_LRef || src->kind == RDI_TypeKind_RRef) { - dst->kind = src->kind; - dst->byte_size = src->ptr.size; - dst->flags = 0; - dst->constructed.direct_type_idx = rdib_idx_from_type(src->ptr.type_ref); - } else if (src->kind == RDI_TypeKind_Method) { - RDIB_Type *params_type = src->method.params_type; - Assert(params_type->kind == RDI_TypeKindExt_Params); - RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->method.param_idx_run_bucket_idx]; - - dst->kind = RDI_TypeKind_Method; - dst->flags = 0; - dst->byte_size = 0; - dst->constructed.direct_type_idx = rdib_idx_from_type(src->method.return_type); - dst->constructed.count = param_idx_run->indices.count; - dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array; - } else if (src->kind == RDI_TypeKindExt_StaticMethod) { - RDIB_Type *params_type = src->static_method.params_type; - Assert(params_type->kind == RDI_TypeKindExt_Params); - RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->static_method.param_idx_run_bucket_idx]; - - dst->kind = RDI_TypeKind_Method; - dst->flags = 0; - dst->byte_size = 0; - dst->constructed.direct_type_idx = rdib_idx_from_type(src->static_method.return_type); - dst->constructed.count = param_idx_run->indices.count; - dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array; - } else if (src->kind == RDI_TypeKind_Function) { - RDIB_Type *params_type = src->func.params_type; - Assert(params_type->kind == RDI_TypeKindExt_Params); - RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->func.param_idx_run_bucket_idx]; - - dst->kind = RDI_TypeKind_Function; - dst->flags = 0; - dst->byte_size = 0; - dst->constructed.direct_type_idx = rdib_idx_from_type(src->func.return_type); - dst->constructed.count = param_idx_run->indices.count; - dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array; - } else if (src->kind == RDI_TypeKind_Array) { - U64 entry_size = rdib_size_from_type(src->array.entry_type); - U64 array_size = src->array.size; - U64 array_count = entry_size > 0 ? array_size / entry_size : 0; - - dst->kind = src->kind; - dst->flags = 0; - dst->byte_size = array_size; - dst->constructed.direct_type_idx = rdib_idx_from_type(src->array.entry_type); - dst->constructed.count = array_count; - } else if (src->kind == RDI_TypeKind_Bitfield) { - dst->kind = RDI_TypeKind_Bitfield; - dst->flags = 0; - dst->byte_size = rdib_sizeof_type(src->bitfield.value_type); - dst->bitfield.direct_type_idx = rdib_idx_from_type(src->bitfield.value_type); - dst->bitfield.off = src->bitfield.off; - dst->bitfield.size = src->bitfield.count; - } else if (src->kind == RDI_TypeKind_Struct || src->kind == RDI_TypeKind_Class || - src->kind == RDI_TypeKind_IncompleteStruct || src->kind == RDI_TypeKind_IncompleteClass) { - dst->kind = src->kind; - dst->flags = 0; - dst->byte_size = src->udt.struct_type.size; - dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name); - dst->user_defined.udt_idx = src->udt.udt_idx; - dst->user_defined.direct_type_idx = 0; - } else if (src->kind == RDI_TypeKind_Union || src->kind == RDI_TypeKind_IncompleteUnion) { - dst->kind = src->kind; - dst->flags = 0; - dst->byte_size = src->udt.union_type.size; - dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name); - dst->user_defined.udt_idx = src->udt.udt_idx; - dst->user_defined.direct_type_idx = 0; - } else if (src->kind == RDI_TypeKind_Enum || src->kind == RDI_TypeKind_IncompleteEnum) { - dst->kind = RDI_TypeKind_Enum; - dst->flags = 0; - dst->byte_size = rdib_size_from_type(src->udt.enum_type.base_type); - dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name); - dst->user_defined.udt_idx = src->udt.udt_idx; - dst->user_defined.direct_type_idx = rdib_idx_from_type(src->udt.enum_type.base_type); - } else if (src->kind == RDI_TypeKind_Alias) { - // TODO - NotImplemented; - } else if (src->kind == RDI_TypeKind_MemberPtr) { - // TODO - NotImplemented; - } else if (src->kind == RDI_TypeKind_Variadic) { - MemoryZeroStruct(dst); - dst->kind = RDI_TypeKind_Variadic; - } else if (src->kind == RDI_TypeKindExt_VirtualTable) { - // TODO - MemoryZeroStruct(dst); - dst->kind = RDI_TypeKind_NULL; - } else { - InvalidPath; - } - } - - scratch_end(scratch); -} - -internal void -rdib_data_sections_from_types(TP_Context *tp, - Arena *arena, - RDIB_DataSectionList *sect_list, - RDI_Arch arch, - RDIB_StringMap *string_map, - RDIB_IndexRunMap *idx_run_map, - U64 udt_member_chunk_count, - RDIB_TypeChunk **udt_member_type_chunks, - U64 enum_member_chunk_count, - RDIB_TypeChunk **enum_member_type_chunks, - U64 total_type_node_count, - U64 type_chunk_count, - RDIB_TypeChunk **type_chunks, - RDIB_TypeStats type_stats) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - ProfBegin("UDT Members"); - U64 udt_member_count_rdi; - RDI_Member *udt_members_rdi; - { - RDIB_MembersTask task = {0}; - - ProfBegin("Concat"); - task.ranges = tp_divide_work(scratch.arena, udt_member_chunk_count, tp->worker_count); - task.type_chunks = udt_member_type_chunks; - tp_for_parallel(tp, 0, tp->worker_count, rdib_concat_members_task, &task); - ProfEnd(); - - ProfBegin("Count"); - task.counts = push_array(scratch.arena, U64, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_count_head_members_task, &task); - ProfEnd(); - - ProfBegin("Assign Indices"); - task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_assign_head_member_indices_task, &task); - ProfEnd(); - - udt_member_count_rdi = sum_array_u64(tp->worker_count, task.counts); - udt_members_rdi = push_array_no_zero(arena, RDI_Member, udt_member_count_rdi); - - ProfBegin("Fill"); - task.string_map = string_map; - task.udt_members_rdi = udt_members_rdi; - tp_for_parallel(tp, 0, udt_member_chunk_count, rdib_fill_udt_members_task, &task); - ProfEnd(); - } - ProfEnd(); - - ProfBegin("Enum Members"); - U64 enum_member_count_rdi; - RDI_EnumMember *enum_members_rdi; - { - RDIB_MembersTask task = {0}; - - ProfBegin("Concat"); - task.ranges = tp_divide_work(scratch.arena, enum_member_chunk_count, tp->worker_count); - task.type_chunks = enum_member_type_chunks; - tp_for_parallel(tp, 0, tp->worker_count, rdib_concat_members_task, &task); - ProfEnd(); - - ProfBegin("Count"); - task.counts = push_array(scratch.arena, U64, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_count_head_members_task, &task); - ProfEnd(); - - ProfBegin("Assign Indices"); - task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_assign_head_member_indices_task, &task); - ProfEnd(); - - enum_member_count_rdi = sum_array_u64(tp->worker_count, task.counts); - enum_members_rdi = push_array_no_zero(arena, RDI_EnumMember, enum_member_count_rdi); - - ProfBegin("Fill"); - task.string_map = string_map; - task.enum_members_rdi = enum_members_rdi; - tp_for_parallel(tp, 0, enum_member_chunk_count, rdib_fill_enum_members_task, &task); - ProfEnd(); - } - ProfEnd(); - - ProfBegin("Sum type stats"); - U64 total_udt_count = sum_array_u64(type_chunk_count, type_stats.udt_counts); - ProfEnd(); - - ProfBegin("Up front pushes"); - RDI_UDT *udts = push_array_no_zero(arena, RDI_UDT, total_udt_count ); - RDI_TypeNode *type_nodes = push_array_no_zero(arena, RDI_TypeNode, total_type_node_count); - ProfEnd(); - - ProfBegin("Fill out UDTs"); - RDIB_UserDefinesTask udts_task = {0}; - udts_task.type_chunks = type_chunks; - udts_task.type_stats = type_stats; - udts_task.udt_base_idx = offsets_from_counts_array_u64(scratch.arena, type_stats.udt_counts, type_chunk_count); - udts_task.udts = udts; - tp_for_parallel(tp, 0, type_chunk_count, rdib_fill_udts_task, &udts_task); - ProfEnd(); - - ProfBegin("Fill out type nodes"); - RDIB_TypeNodesTask type_nodes_task = {0}; - type_nodes_task.addr_size = rdi_addr_size_from_arch(arch); - type_nodes_task.string_map = string_map; - type_nodes_task.idx_run_map = idx_run_map; - type_nodes_task.type_chunks = type_chunks; - type_nodes_task.type_stats = type_stats; - type_nodes_task.type_nodes = type_nodes; - tp_for_parallel(tp, 0, type_chunk_count, rdib_type_nodes_task, &type_nodes_task); - ProfEnd(); - - RDIB_DataSection udt_member_sect = { .tag = RDI_SectionKind_Members }; - RDIB_DataSection enum_member_sect = { .tag = RDI_SectionKind_EnumMembers }; - RDIB_DataSection udt_sect = { .tag = RDI_SectionKind_UDTs }; - RDIB_DataSection type_nodes_sect = { .tag = RDI_SectionKind_TypeNodes }; - - str8_list_push(arena, &udt_member_sect.data, str8_array(udt_members_rdi, udt_member_count_rdi )); - str8_list_push(arena, &enum_member_sect.data, str8_array(enum_members_rdi, enum_member_count_rdi)); - str8_list_push(arena, &udt_sect.data, str8_array(udts, total_udt_count )); - str8_list_push(arena, &type_nodes_sect.data, str8_array(type_nodes, total_type_node_count)); - - rdib_data_section_list_push(arena, sect_list, enum_member_sect); - rdib_data_section_list_push(arena, sect_list, udt_member_sect ); - rdib_data_section_list_push(arena, sect_list, udt_sect ); - rdib_data_section_list_push(arena, sect_list, type_nodes_sect ); - - scratch_end(scratch); - ProfEnd(); -} - -//////////////////////////////// - -internal RDIB_PathTree * -rdib_path_tree_init(Arena *arena, U64 list_count) -{ - RDIB_PathTree *tree = push_array(arena, RDIB_PathTree, 1); - tree->root = push_array(arena, RDIB_PathTreeNode, 1); - tree->list_count = list_count; - tree->node_lists = push_array(arena, RDIB_PathTreeNodeList, list_count); - return tree; -} - -internal void -rdib_path_tree_insert(Arena *arena, RDIB_PathTree *tree, String8 path, RDIB_SourceFile *src_file) -{ - Temp scratch = scratch_begin(&arena, 1); - - RDIB_PathTreeNode *curr_sub_path = tree->root; - String8List sub_paths = str8_split_path(scratch.arena, path); - str8_path_list_resolve_dots_in_place(&sub_paths, path_style_from_str8(path)); - - for (String8Node *n = sub_paths.first; n != 0; n = n->next) { - RDIB_PathTreeNode *sub_child; - - // is there directory or file defined on this level? - for (sub_child = curr_sub_path->first_child; sub_child != 0; sub_child = sub_child->next_sibling) { - if (str8_match(sub_child->sub_path, n->string, 0)) { - break; - } - } - - // new directory/file - if (sub_child == 0) { - sub_child = push_array(arena, RDIB_PathTreeNode, 1); - sub_child->node_idx = tree->node_count; - sub_child->parent = curr_sub_path; - sub_child->sub_path = n->string; - sub_child->src_file = 0; - SLLQueuePush_N(curr_sub_path->first_child, curr_sub_path->last_child, sub_child, next_sibling); - ++tree->node_count; - - // last node, insert file - if (n->next == 0) { - sub_child->src_file = src_file; - } - - // HACK: setup node list per thread for serialization step - U64 list_idx = tree->next_list_idx % tree->list_count; - SLLQueuePush_N(tree->node_lists[list_idx].first, tree->node_lists[list_idx].last, sub_child, next_order); - ++tree->next_list_idx; - } - - // descend to sub node - curr_sub_path = sub_child; - } - - scratch_end(scratch); -} - -internal U32 -rdib_idx_from_path_tree(RDIB_PathTree *tree, String8 path) -{ - Temp scratch = scratch_begin(0,0); - - // redirect to special nil string - if (path.size == 0) { - path = RDIB_PATH_TREE_NIL_STRING; - } - - // begin traverse from tree root - RDIB_PathTreeNode *curr_sub_path = tree->root; - - // split path & resolve dots - String8List sub_paths = str8_split_path(scratch.arena, path); - str8_path_list_resolve_dots_in_place(&sub_paths, path_style_from_str8(path)); - - for (String8Node *n = sub_paths.first; n != 0; n = n->next) { - // scan children sub-path match - RDIB_PathTreeNode *sub_child; - for (sub_child = curr_sub_path->first_child; sub_child != 0; sub_child = sub_child->next_sibling) { - if (str8_match(sub_child->sub_path, n->string, 0)) { - break; - } - } - - // found match? - if (sub_child == 0) { - break; - } - - // descend to sub directory - curr_sub_path = sub_child; - } - - // did we find source file? - U64 idx = 0; - if (curr_sub_path != 0 && curr_sub_path->src_file != 0) { - idx = curr_sub_path->node_idx; - } else { - Assert(!"unable to find source file path"); - } - - scratch_end(scratch); - return safe_cast_u32(idx); -} - - -//////////////////////////////// - -internal U64 -rdib_string_map_hash(String8 string) -{ - XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); - return hash64; -} - -internal RDIB_StringMap * -rdib_init_string_map(Arena *arena, U64 cap) -{ - RDIB_StringMap *string_map = push_array(arena, RDIB_StringMap, 1); - string_map->cap = (U64)((F64)cap * 1.3); - string_map->buckets = push_array(arena, RDIB_StringMapBucket *, string_map->cap); - return string_map; -} - -internal U32 -rdib_idx_from_string_map(RDIB_StringMap *string_map, String8 string) -{ - U64 hash = rdib_string_map_hash(string); - U64 best_idx = hash % string_map->cap; - U64 idx = best_idx; - - do { - RDIB_StringMapBucket *bucket = string_map->buckets[idx]; - - if (bucket == 0) { - break; - } - - if (str8_match(bucket->string, string, 0)) { - return safe_cast_u32(bucket->idx); - } - - idx = (idx + 1) % string_map->cap; - } while (idx != best_idx); - - Assert(!"incomplete string map"); - return max_U32; -} - -internal RDIB_StringMapBucket * -rdib_string_map_insert_or_update(RDIB_StringMapBucket **buckets, U64 cap, U64 hash, RDIB_StringMapBucket *new_bucket, RDIB_StringMapUpdateFunc *update_func) -{ - RDIB_StringMapBucket *result = 0; - B32 was_bucket_inserted_or_updated = 0; - - U64 best_idx = hash % cap; - U64 idx = best_idx; - - do { - retry:; - RDIB_StringMapBucket *curr_bucket = buckets[idx]; - - if (curr_bucket == 0) { - RDIB_StringMapBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); - - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - was_bucket_inserted_or_updated = 1; - break; - } - - // another thread took the bucket... - goto retry; - } else if (str8_match(curr_bucket->string, new_bucket->string, 0)) { - if (curr_bucket->sorter.v <= new_bucket->sorter.v) { - if (new_bucket->raw_values != 0) { - void_node_concat_atomic(&curr_bucket->raw_values, new_bucket->raw_values); - new_bucket->raw_values = 0; - } - - // recycle bucket - result = new_bucket; - - // don't need to update, more recent leaf is in the bucket - was_bucket_inserted_or_updated = 1; - - break; - } - - if (new_bucket->raw_values) { - new_bucket->raw_values->next = buckets[idx]->raw_values; - } - - RDIB_StringMapBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); - - if (compare_bucket == curr_bucket) { - - // recycle bucket - result = compare_bucket; - - // new bucket is in the hash table, exit - was_bucket_inserted_or_updated = 1; - break; - } - - if (new_bucket->raw_values) { - new_bucket->raw_values->next = 0; - } - - // another thread took the bucket... - goto retry; - } - - // advance - idx = (idx + 1) % cap; - } while (idx != best_idx); - - // are there enough free buckets? - Assert(was_bucket_inserted_or_updated); - - return result; -} - -internal void -rdib_string_map_insert_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, void *value) -{ - // do we have a free bucket? - RDIB_StringMapBucket **bucket = &task->free_buckets[task_id]; - if (*bucket == 0) { - *bucket = push_array(arena, RDIB_StringMapBucket, 1); - } - - // fill out bucket - (*bucket)->string = string; - (*bucket)->raw_values = value; - (*bucket)->sorter.hi = safe_cast_u32(task_id); - (*bucket)->sorter.lo = safe_cast_u32(task->element_indices[task_id]); - - // insert bucket into string map - U64 hash = rdib_string_map_hash(string); - RDIB_StringMapBucket *insert_or_update = rdib_string_map_insert_or_update(task->string_map->buckets, task->string_map->cap, hash, *bucket, task->string_map_update_func); - - // advance element index - if (insert_or_update != *bucket) { - ++task->element_indices[task_id]; - } - - // recycle bucket - *bucket = insert_or_update; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_count_extant_buckets_string_map_task) -{ - ProfBeginFunction(); - RDIB_GetExtantBucketsStringMapTask *task = raw_task; - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - if (task->string_map->buckets[bucket_idx] != 0) { - task->counts[task_id] += 1; - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_get_extant_buckets_string_map_task) -{ - ProfBeginFunction(); - RDIB_GetExtantBucketsStringMapTask *task = raw_task; - for (U64 bucket_idx = task->ranges[task_id].min, cursor = task->offsets[task_id]; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_StringMapBucket *bucket = task->string_map->buckets[bucket_idx]; - if (bucket != 0) { - task->result[cursor] = bucket; - ++cursor; - } - } - ProfEnd(); -} - -internal RDIB_StringMapBucket ** -rdib_extant_buckets_from_string_map(TP_Context *tp, Arena *arena, RDIB_StringMap *string_map, U64 *bucket_count_out) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - RDIB_GetExtantBucketsStringMapTask task = {0}; - task.string_map = string_map; - - ProfBegin("Count Extant Buckets"); - task.counts = push_array(scratch.arena, U64, tp->worker_count); - task.ranges = tp_divide_work(scratch.arena, string_map->cap, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_count_extant_buckets_string_map_task, &task); - ProfEnd(); - - *bucket_count_out = sum_array_u64(tp->worker_count, task.counts); - - ProfBegin("Copy Extant Buckets"); - task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); - task.result = push_array(arena, RDIB_StringMapBucket *, *bucket_count_out); - tp_for_parallel(tp, 0, tp->worker_count, rdib_get_extant_buckets_string_map_task, &task); - ProfEnd(); - - scratch_end(scratch); - ProfEnd(); - return task.result; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_string_map_bucket_chunk_idx_histo_task) -{ - ProfBeginFunction(); - RDIB_StringMapRadixSort *task = raw_task; - Temp scratch = scratch_begin(0,0); - - U32 *range_histo = push_array(scratch.arena, U32, task->chunk_idx_opl); - - // count items per sorter - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_StringMapBucket *bucket = task->src[bucket_idx]; - U64 chunk_idx = bucket->sorter.hi; - Assert(chunk_idx < task->chunk_idx_opl); - ++range_histo[chunk_idx]; - } - - // add in per thread sorter counts - for (U64 i = 0; i < task->chunk_idx_opl; ++i) { - ins_atomic_u32_add_eval(&task->chunk_histo[i], range_histo[i]); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_string_map_radix_sort_chunk_idx_task) -{ - ProfBeginFunction(); - RDIB_StringMapRadixSort *task = raw_task; - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_StringMapBucket *bucket = task->src[bucket_idx]; - U32 chunk_idx = bucket->sorter.hi; - U32 dst_idx = ins_atomic_u32_inc_eval(&task->chunk_offsets[chunk_idx]) - 1; - task->dst[dst_idx] = bucket; - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_string_map_radix_sort_element_idx_task) -{ - ProfBeginFunction(); - RDIB_StringMapRadixSort *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - U64 range_lo = task->chunk_offsets[chunk_idx]; - U64 range_hi = task->chunk_offsets[chunk_idx] + task->chunk_histo[chunk_idx]; - - ProfBegin("Zero out Histogram"); - U32 histo_bot[1 << 10]; MemoryZeroArray(histo_bot); - U32 histo_mid[1 << 11]; MemoryZeroArray(histo_mid); - U32 histo_top[1 << 11]; MemoryZeroArray(histo_top); - ProfEnd(); - - ProfBegin("Element Histogram"); - for (U64 i = range_lo; i < range_hi; ++i) { - RDIB_StringMapBucket *elem = task->dst[i]; - U32 elem_idx = elem->sorter.lo; - U32 digit_bot = (elem_idx >> 0) % ArrayCount(histo_bot); - U32 digit_mid = (elem_idx >> 10) % ArrayCount(histo_mid); - U32 digit_top = (elem_idx >> 21) % ArrayCount(histo_top); - histo_bot[digit_bot] += 1; - histo_mid[digit_mid] += 1; - histo_top[digit_top] += 1; - } - ProfEnd(); - - ProfBegin("Histogram Counts -> Offsets"); - u32_array_counts_to_offsets(ArrayCount(histo_bot), &histo_bot[0]); - u32_array_counts_to_offsets(ArrayCount(histo_mid), &histo_mid[0]); - u32_array_counts_to_offsets(ArrayCount(histo_top), &histo_top[0]); - ProfEnd(); - - ProfBegin("Sort Bot"); - for (U64 i = range_lo; i < range_hi; ++i) { - RDIB_StringMapBucket *elem = task->dst[i]; - U32 elem_idx = elem->sorter.lo; - U32 digit = (elem_idx >> 0) % ArrayCount(histo_bot); - U32 src_idx = range_lo + histo_bot[digit]++; - task->src[src_idx] = elem; - } - ProfEnd(); - - ProfBegin("Sort Mid"); - for (U64 i = range_lo; i < range_hi; ++i) { - RDIB_StringMapBucket *elem = task->src[i]; - U32 elem_idx = elem->sorter.lo; - U32 digit = (elem_idx >> 10) % ArrayCount(histo_mid); - U32 dst_idx = range_lo + histo_mid[digit]++; - task->dst[dst_idx] = elem; - } - ProfEnd(); - - ProfBegin("Sort Top"); - for (U64 i = range_lo; i < range_hi; ++i) { - RDIB_StringMapBucket *elem = task->dst[i]; - U32 elem_idx = elem->sorter.lo; - U32 digit = (elem_idx >> 21) % ArrayCount(histo_top); - U32 src_idx = range_lo + histo_top[digit]++; - task->src[src_idx] = elem; - } - ProfEnd(); - } - - ProfEnd(); -} - -internal void -rdib_string_map_sort_buckets(TP_Context *tp, RDIB_StringMapBucket **buckets, U64 bucket_count, U64 chunk_idx_opl) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - RDIB_StringMapRadixSort task = {0}; - task.chunk_idx_opl = chunk_idx_opl; - task.ranges = tp_divide_work(scratch.arena, bucket_count, tp->worker_count); - task.src = buckets; - task.dst = push_array_no_zero(scratch.arena, RDIB_StringMapBucket *, bucket_count); - - ProfBegin("Chunk Index Histogram"); - task.chunk_histo = push_array(scratch.arena, U32, chunk_idx_opl); - tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_bucket_chunk_idx_histo_task, &task); - ProfEnd(); - - // sort correctness check on chunk index -#if 0 - for (U64 i = 1; i < bucket_count; ++i) { - RDIB_StringMapBucket *prev = buckets[i - 1]; - RDIB_StringMapBucket *curr = buckets[i + 0]; - U32 prev_chunk_idx = prev->sorter.hi; - U32 curr_chunk_idx = curr->sorter.hi; - AssertAlways(prev_chunk_idx <= curr_chunk_idx); - } -#endif - - ProfBegin("Chunk Histo -> Offsets"); - task.chunk_offsets = u32_array_offsets_from_counts(scratch.arena, task.chunk_histo, chunk_idx_opl); - ProfEnd(); - - ProfBegin("Sort on chunk index"); - tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_radix_sort_chunk_idx_task, &task); - ProfEnd(); - - ProfBegin("Sort on element index"); - task.chunk_offsets = u32_array_offsets_from_counts(scratch.arena, task.chunk_histo, chunk_idx_opl); - task.ranges = tp_divide_work(scratch.arena, chunk_idx_opl, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_radix_sort_element_idx_task, &task); - ProfEnd(); - - // sort correctness check on element index -#if 0 - { - for (U64 i = 1; i < bucket_count; ++i) { - RDIB_StringMapBucket *prev = buckets[i - 1]; - RDIB_StringMapBucket *curr = buckets[i + 0]; - U32 prev_chunk_idx = prev->sorter.hi; - U32 curr_chunk_idx = curr->sorter.hi; - if (prev_chunk_idx == curr_chunk_idx) { - U32 prev_elem_idx = prev->sorter.lo; - U32 curr_elem_idx = curr->sorter.lo; - AssertAlways(prev_elem_idx < curr_elem_idx); - } - } - } -#endif - - scratch_end(scratch); - ProfEnd(); -} - -internal void -rdib_string_map_assign_indices(RDIB_StringMapBucket **buckets, U64 bucket_count) -{ - ProfBeginFunction(); - for (U64 idx = 0; idx < bucket_count; ++idx) { - buckets[idx]->idx = idx; - } - ProfEnd(); -} - -// Specialized Inserts - -internal void -rdib_string_map_insert_string_table_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string) -{ - rdib_string_map_insert_item(arena, task, task_id, string, 0); -} - -internal void -rdib_string_map_insert_name_map_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, VoidNode *node) -{ - rdib_string_map_insert_item(arena, task, task_id, string, node); -} - -internal -RDIB_STRING_MAP_UPDATE_FUNC(rdib_string_map_update_null) -{ - // null update -} - -internal -RDIB_STRING_MAP_UPDATE_FUNC(rdib_string_map_update_concat_void_list_atomic) -{ - node->next = ins_atomic_ptr_eval_assign(head, node); -} - -//////////////////////////////// -// String Table Tasks - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_sects_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 sect_idx = task->ranges[task_id].min; sect_idx < task->ranges[task_id].max; ++sect_idx) { - RDIB_BinarySection *sect = &task->sects[sect_idx]; - rdib_string_map_insert_string_table_item(arena, task, task_id, sect->name); - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_units_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_UnitChunk *chunk = task->units[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Unit *unit = &chunk->v[i]; - rdib_string_map_insert_string_table_item(arena, task, task_id, unit->unit_name); - rdib_string_map_insert_string_table_item(arena, task, task_id, unit->compiler_name); - rdib_string_map_insert_string_table_item(arena, task, task_id, unit->source_file); - rdib_string_map_insert_string_table_item(arena, task, task_id, unit->object_file); - rdib_string_map_insert_string_table_item(arena, task, task_id, unit->archive_file); - rdib_string_map_insert_string_table_item(arena, task, task_id, unit->build_path); - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_source_files_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_SourceFile *src_file = chunk->v + i; - rdib_string_map_insert_string_table_item(arena, task, task_id, src_file->normal_full_path); - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_vars_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_VariableChunk *chunk = task->vars[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Variable *var = &chunk->v[i]; - rdib_string_map_insert_string_table_item(arena, task, task_id, var->name); - rdib_string_map_insert_string_table_item(arena, task, task_id, var->link_name); - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_procs_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_ProcedureChunk *chunk = task->procs[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Procedure *proc = &chunk->v[i]; - rdib_string_map_insert_string_table_item(arena, task, task_id, proc->name); - rdib_string_map_insert_string_table_item(arena, task, task_id, proc->link_name); - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_inline_sites_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_InlineSiteChunk *chunk = task->inline_sites[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_InlineSite *inline_site = &chunk->v[i]; - rdib_string_map_insert_string_table_item(arena, task, task_id, inline_site->name); - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_udt_members_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_UDTMemberChunk *chunk = task->udt_members[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_UDTMember *udt_member = &chunk->v[i]; - switch (udt_member->kind) { - case RDI_MemberKind_NULL : break; - case RDI_MemberKind_DataField : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->data_field.name ); break; - case RDI_MemberKind_StaticData : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->static_data.name); break; - case RDI_MemberKind_Method : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->method.name ); break; - case RDI_MemberKind_NestedType : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->nested_type.name); break; - case RDI_MemberKind_Base : break; - case RDI_MemberKind_VirtualBase : break; - //case RDI_MemberKind_Enumerate : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->enumerate.name); break; - case RDI_MemberKindExt_MemberListPointer: break; - default: InvalidPath; - } - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_enum_members_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_UDTMemberChunk *chunk = task->enum_members[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - rdib_string_map_insert_string_table_item(arena, task, task_id, chunk->v[i].enumerate.name); - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_types_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_TypeChunk *chunk = task->types[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Type *type = &chunk->v[i]; - if (RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind <= RDI_TypeKind_LastBuiltIn) { - rdib_string_map_insert_string_table_item(arena, task, task_id, type->builtin.name); - } else if (RDI_IsUserDefinedType(type->kind)) { - rdib_string_map_insert_string_table_item(arena, task, task_id, type->udt.name); - } - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_collect_strings_path_nodes_task) -{ - ProfBeginFunction(); - RDIB_CollectStringsTask *task = raw_task; - for (RDIB_PathTreeNode *n = task->path_node_lists[task_id].first; n != 0; n = n->next_order) { - rdib_string_map_insert_string_table_item(arena, task, task_id, n->sub_path); - } - ProfEnd(); -} - -//////////////////////////////// -// Name Map Tasks - -internal -THREAD_POOL_TASK_FUNC(rdib_name_map_var_task) -{ - RDIB_CollectStringsTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_VariableChunk *chunk = task->vars[chunk_idx]; - VoidNode *nodes = push_array(arena, VoidNode, chunk->count); - for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) { - RDIB_Variable *n = &chunk->v[var_idx]; - nodes[var_idx].v = n; - rdib_string_map_insert_name_map_item(arena, task, task_id, n->name, &nodes[var_idx]); - } - } -} - -internal -THREAD_POOL_TASK_FUNC(rdib_name_map_var_link_name_task) -{ - RDIB_CollectStringsTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_VariableChunk *chunk = task->vars[chunk_idx]; - VoidNode *nodes = push_array(arena, VoidNode, chunk->count); - for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) { - RDIB_Variable *n = &chunk->v[var_idx]; - nodes[var_idx].v = n; - rdib_string_map_insert_name_map_item(arena, task, task_id, n->link_name, &nodes[var_idx]); - } - } -} - -internal -THREAD_POOL_TASK_FUNC(rdib_name_map_procedure_task) -{ - RDIB_CollectStringsTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_ProcedureChunk *chunk = task->procs[chunk_idx]; - VoidNode *nodes = push_array(arena, VoidNode, chunk->count); - for (U64 proc_idx = 0; proc_idx < chunk->count; ++proc_idx) { - RDIB_Procedure *n = &chunk->v[proc_idx]; - nodes[proc_idx].v = n; - rdib_string_map_insert_name_map_item(arena, task, task_id, n->name, &nodes[proc_idx]); - } - } -} - -internal -THREAD_POOL_TASK_FUNC(rdib_name_map_procedures_link_name_task) -{ - RDIB_CollectStringsTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_ProcedureChunk *chunk = task->procs[chunk_idx]; - VoidNode *nodes = push_array(arena, VoidNode, chunk->count); - for (U64 proc_idx = 0; proc_idx < chunk->count; ++proc_idx) { - RDIB_Procedure *n = &chunk->v[proc_idx]; - nodes[proc_idx].v = n; - rdib_string_map_insert_name_map_item(arena, task, task_id, n->link_name, &nodes[proc_idx]); - } - } -} - -internal -THREAD_POOL_TASK_FUNC(rdib_name_map_types_task) -{ - RDIB_CollectStringsTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_TypeChunk *chunk = task->types[chunk_idx]; - VoidNode *nodes = push_array(arena, VoidNode, chunk->count); - VoidNode *node_cursor = nodes; - for (U64 type_idx = 0; type_idx < chunk->count; ++type_idx) { - RDIB_Type *type = &chunk->v[type_idx]; - node_cursor->v = type; - - if (RDI_IsUserDefinedType(type->kind)) { - rdib_string_map_insert_name_map_item(arena, task, task_id, type->udt.name, node_cursor); - ++node_cursor; - } - } - } -} - -internal -THREAD_POOL_TASK_FUNC(rdib_name_map_normal_paths_task) -{ - RDIB_CollectStringsTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx]; - VoidNode *nodes = push_array(arena, VoidNode, chunk->count); - VoidNode *node_cursor = nodes; - for (U64 i = 0; i < chunk->count; ++i, ++node_cursor) { - node_cursor->v = &chunk->v[i]; - rdib_string_map_insert_name_map_item(arena, task, task_id, chunk->v[i].normal_full_path, node_cursor); - } - } -} - -//////////////////////////////// -// Index Run Map - -internal U64 -rdib_index_run_hash(U32 count, U32 *idxs) -{ - XXH64_hash_t hash64 = XXH3_64bits(idxs, count * sizeof(idxs[0])); - return hash64; -} - -internal RDIB_IndexRunMap * -rdib_init_index_run_map(Arena *arena, U64 cap) -{ - ProfBeginFunction(); - RDIB_IndexRunMap *map = push_array(arena, RDIB_IndexRunMap, 1); - map->cap = cap; - map->buckets = push_array(arena, RDIB_IndexRunBucket *, cap); - ProfEnd(); - return map; -} - -internal RDIB_IndexRunBucket * -rdib_index_run_map_insert_or_update(Arena *arena, RDIB_IndexRunBucket **buckets, U64 cap, U64 hash, RDIB_IndexRunBucket *new_bucket, U64 *bucket_idx_out) -{ - B32 was_bucket_inserted_or_updated = 0; - - RDIB_IndexRunBucket *result = 0; - - U64 best_idx = hash % cap; - U64 idx = best_idx; - - do { - retry:; - RDIB_IndexRunBucket *curr_bucket = buckets[idx]; - - if (curr_bucket == 0) { - RDIB_IndexRunBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); - - if (compare_bucket == curr_bucket) { - // success, bucket was inserted - was_bucket_inserted_or_updated = 1; - break; - } - - // another thread took the bucket... - goto retry; - } else if (u32_array_compare(curr_bucket->indices, new_bucket->indices)) { - if (curr_bucket->sorter.v <= new_bucket->sorter.v) { - // recycle bucket - result = new_bucket; - - // don't need to update, more recent leaf is in the bucket - was_bucket_inserted_or_updated = 1; - break; - } - - RDIB_IndexRunBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket); - if (compare_bucket == curr_bucket) { - // recycle bucket - result = compare_bucket; - - // new bucket is in the hash table, exit - was_bucket_inserted_or_updated = 1; - break; - } - - // another thread took the bucket... - goto retry; - } - - // advance - idx = (idx + 1) % cap; - } while (idx != best_idx); - - // are there enough free buckets? - Assert(was_bucket_inserted_or_updated); - - // output bucket index - *bucket_idx_out = idx; - - return result; -} - -internal U32 -rdib_idx_run_from_bucket_idx(RDIB_IndexRunMap *map, U64 bucket_idx) -{ - RDIB_IndexRunBucket *bucket = map->buckets[bucket_idx]; - U32 idx_run32 = safe_cast_u32(bucket->index_in_output_array); - return idx_run32; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_count_extant_buckets_index_run_map_task) -{ - ProfBeginFunction(); - RDIB_GetExtantBucketsIndexRunMapTask *task = raw_task; - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - if (task->idx_run_map->buckets[bucket_idx] != 0) { - task->counts[task_id] += 1; - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_get_extant_buckets_index_run_map_task) -{ - ProfBeginFunction(); - RDIB_GetExtantBucketsIndexRunMapTask *task = raw_task; - for (U64 bucket_idx = task->ranges[task_id].min, cursor = task->offsets[task_id]; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_IndexRunBucket *bucket = task->idx_run_map->buckets[bucket_idx]; - if (bucket != 0) { - task->result[cursor] = bucket; - ++cursor; - } - } - ProfEnd(); -} - -internal RDIB_IndexRunBucket ** -rdib_extant_buckets_from_index_run_map(TP_Context *tp, Arena *arena, RDIB_IndexRunMap *idx_run_map, U64 *bucket_count_out) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - RDIB_GetExtantBucketsIndexRunMapTask task = {0}; - task.idx_run_map = idx_run_map; - - ProfBegin("Count Extant Buckets"); - task.counts = push_array(scratch.arena, U64, tp->worker_count); - task.ranges = tp_divide_work(scratch.arena, idx_run_map->cap, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_count_extant_buckets_index_run_map_task, &task); - ProfEnd(); - - *bucket_count_out = sum_array_u64(tp->worker_count, task.counts); - - ProfBegin("Copy Extant Buckets"); - task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); - task.result = push_array(arena, RDIB_IndexRunBucket *, *bucket_count_out); - tp_for_parallel(tp, 0, tp->worker_count, rdib_get_extant_buckets_index_run_map_task, &task); - ProfEnd(); - - scratch_end(scratch); - ProfEnd(); - return task.result; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_index_run_map_bucket_chunk_idx_histo_task) -{ - ProfBeginFunction(); - RDIB_IndexRunMapRadixSort *task = raw_task; - Temp scratch = scratch_begin(0,0); - - U32 *range_histo = push_array(scratch.arena, U32, task->chunk_idx_opl); - - // count items per sorter - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_IndexRunBucket *bucket = task->src[bucket_idx]; - U32 chunk_idx = bucket->sorter.hi; - Assert(chunk_idx < task->chunk_idx_opl); - ++range_histo[chunk_idx]; - } - - // add in per thread sorter counts - for (U64 i = 0; i < task->chunk_idx_opl; ++i) { - ins_atomic_u32_add_eval(&task->chunk_histo[i], range_histo[i]); - } - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_index_run_map_radix_sort_chunk_idx_task) -{ - ProfBeginFunction(); - RDIB_IndexRunMapRadixSort *task = raw_task; - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_IndexRunBucket *bucket = task->src[bucket_idx]; - U32 chunk_idx = bucket->sorter.hi; - U32 dst_idx = ins_atomic_u32_inc_eval(&task->chunk_offsets[chunk_idx]) - 1; - task->dst[dst_idx] = bucket; - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_index_run_map_radix_sort_element_idx_task) -{ - ProfBeginFunction(); - RDIB_IndexRunMapRadixSort *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - U64 range_lo = task->chunk_offsets[chunk_idx]; - U64 range_hi = task->chunk_offsets[chunk_idx] + task->chunk_histo[chunk_idx]; - - ProfBegin("Zero out Histogram"); - U32 histo_bot[1 << 10]; MemoryZeroArray(histo_bot); - U32 histo_mid[1 << 11]; MemoryZeroArray(histo_mid); - U32 histo_top[1 << 11]; MemoryZeroArray(histo_top); - ProfEnd(); - - ProfBegin("Element Histogram"); - for (U64 i = range_lo; i < range_hi; ++i) { - RDIB_IndexRunBucket *elem = task->dst[i]; - U32 elem_idx = elem->sorter.lo; - U32 digit_bot = (elem_idx >> 0) % ArrayCount(histo_bot); - U32 digit_mid = (elem_idx >> 10) % ArrayCount(histo_mid); - U32 digit_top = (elem_idx >> 21) % ArrayCount(histo_top); - histo_bot[digit_bot] += 1; - histo_mid[digit_mid] += 1; - histo_top[digit_top] += 1; - } - ProfEnd(); - - ProfBegin("Histogram Counts -> Offsets"); - u32_array_counts_to_offsets(ArrayCount(histo_bot), &histo_bot[0]); - u32_array_counts_to_offsets(ArrayCount(histo_mid), &histo_mid[0]); - u32_array_counts_to_offsets(ArrayCount(histo_top), &histo_top[0]); - ProfEnd(); - - ProfBegin("Sort Bot"); - for (U64 i = range_lo; i < range_hi; ++i) { - RDIB_IndexRunBucket *elem = task->dst[i]; - U32 elem_idx = elem->sorter.lo; - U32 digit = (elem_idx >> 0) % ArrayCount(histo_bot); - U32 src_idx = range_lo + histo_bot[digit]++; - task->src[src_idx] = elem; - } - ProfEnd(); - - ProfBegin("Sort Mid"); - for (U64 i = range_lo; i < range_hi; ++i) { - RDIB_IndexRunBucket *elem = task->src[i]; - U32 elem_idx = elem->sorter.lo; - U32 digit = (elem_idx >> 10) % ArrayCount(histo_mid); - U32 dst_idx = range_lo + histo_mid[digit]++; - task->dst[dst_idx] = elem; - } - ProfEnd(); - - ProfBegin("Sort Top"); - for (U64 i = range_lo; i < range_hi; ++i) { - RDIB_IndexRunBucket *elem = task->dst[i]; - U32 elem_idx = elem->sorter.lo; - U32 digit = (elem_idx >> 21) % ArrayCount(histo_top); - U32 src_idx = range_lo + histo_top[digit]++; - task->src[src_idx] = elem; - } - ProfEnd(); - } - - ProfEnd(); -} - -internal void -rdib_index_run_map_sort_buckets(TP_Context *tp, RDIB_IndexRunBucket **buckets, U64 bucket_count, U64 chunk_idx_opl) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - RDIB_IndexRunMapRadixSort task = {0}; - task.chunk_idx_opl = chunk_idx_opl; - task.ranges = tp_divide_work(scratch.arena, bucket_count, tp->worker_count); - task.src = buckets; - task.dst = push_array_no_zero(scratch.arena, RDIB_IndexRunBucket *, bucket_count); - - ProfBegin("Chunk Index Histogram"); - task.chunk_histo = push_array(scratch.arena, U32, chunk_idx_opl); - tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_bucket_chunk_idx_histo_task, &task); - ProfEnd(); - - // sort correctness check on chunk index -#if 0 - for (U64 i = 1; i < bucket_count; ++i) { - RDIB_StringMapBucket *prev = buckets[i - 1]; - RDIB_StringMapBucket *curr = buckets[i + 0]; - U32 prev_chunk_idx = RDIB_StringMap_ChunkIdx32FromSorter(prev->sorter); - U32 curr_chunk_idx = RDIB_StringMap_ChunkIdx32FromSorter(curr->sorter); - AssertAlways(prev_chunk_idx <= curr_chunk_idx); - } -#endif - - ProfBegin("Chunk Histo -> Offsets"); - task.chunk_offsets = u32_array_offsets_from_counts(scratch.arena, task.chunk_histo, chunk_idx_opl); - ProfEnd(); - - ProfBegin("Sort on chunk index"); - tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_radix_sort_chunk_idx_task, &task); - ProfEnd(); - - ProfBegin("Sort on element index"); - task.chunk_offsets = u32_array_offsets_from_counts(scratch.arena, task.chunk_histo, chunk_idx_opl); - task.ranges = tp_divide_work(scratch.arena, chunk_idx_opl, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_radix_sort_element_idx_task, &task); - ProfEnd(); - - // sort correctness check on element index -#if 0 - { - for (U64 i = 1; i < bucket_count; ++i) { - RDIB_IndexRunBucket *prev = buckets[i - 1]; - RDIB_IndexRunBucket *curr = buckets[i + 0]; - U32 prev_chunk_idx = prev->sorter.hi; - U32 curr_chunk_idx = curr->sorter.hi; - if (prev_chunk_idx == curr_chunk_idx) { - U32 prev_elem_idx = prev->sorter.lo; - U32 curr_elem_idx = curr->sorter.lo; - AssertAlways(prev_elem_idx < curr_elem_idx); - } - } - } -#endif - - scratch_end(scratch); - ProfEnd(); -} - -internal void -rdib_index_run_map_assign_indices(RDIB_IndexRunBucket **buckets, U64 bucket_count) -{ - ProfBeginFunction(); - for (U64 bucket_idx = 0, cursor = 0; bucket_idx < bucket_count; ++bucket_idx) { - buckets[bucket_idx]->index_in_output_array = cursor; - cursor += buckets[bucket_idx]->indices.count; - } - ProfEnd(); -} - -// index run map specialization - -internal U64 -rdib_index_run_map_insert_item(Arena *arena, RDIB_BuildIndexRunsTask *task, U64 worker_id, U64 item_idx, U64 count, U32 *idxs) -{ - Assert(item_idx < max_U32); - - // do we have a free bucket? - RDIB_IndexRunBucket *bucket = task->free_buckets[worker_id]; - if (bucket == 0) { - bucket = push_array(arena, RDIB_IndexRunBucket, 1); - } - - // fill out bucket - bucket->indices.count = count; - bucket->indices.v = idxs; - bucket->sorter.v = task->sorter_idx << 32 | (U32)item_idx; - - // insert bucket - U64 hash = rdib_index_run_hash(count, idxs); - U64 bucket_idx = max_U64; - RDIB_IndexRunBucket *free_bucket = rdib_index_run_map_insert_or_update(arena, - task->idx_run_map->buckets, - task->idx_run_map->cap, - hash, - bucket, - &bucket_idx); - Assert(bucket_idx != max_U64); - - // recycle bucket - task->free_buckets[worker_id] = free_bucket; - - return bucket_idx; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_idx_runs_params_task) -{ - ProfBeginFunction(); - - RDIB_BuildIndexRunsTask *task = raw_task; - RDIB_TypeChunk *chunk = task->type_chunks[task_id]; - - for (RDIB_Type *type = &chunk->v[0], *opl = chunk->v + chunk->count; type < opl; ++type) { - if (type->kind == RDI_TypeKind_Function) { - RDIB_Type *params = type->func.params_type; - - // pack params - U64 type_index_count = params->params.count; - U32 *type_indices = push_array_no_zero(arena, U32, type_index_count); - for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) { - type_indices[param_idx] = rdib_idx_from_type(params->params.types[param_idx]); - } - - // insert type indices - U32 func_type_idx = rdib_idx_from_type(type); - type->func.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, func_type_idx, type_index_count, type_indices); - } else if (type->kind == RDI_TypeKind_Method) { - RDIB_Type *params = type->method.params_type; - - U64 type_index_count = params->params.count + 1; - U32 *type_indices = push_array_no_zero(arena, U32, type_index_count); - U64 type_idx_cursor = 0; - - // pack 'this' type - type_indices[type_idx_cursor++] = rdib_idx_from_type(type->method.this_type); - - // pack params - for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) { - type_indices[type_idx_cursor++] = rdib_idx_from_type(params->params.types[param_idx]); - } - - // insert type indices - U32 method_type_idx = rdib_idx_from_type(type); - type->method.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, method_type_idx, type_index_count, type_indices); - } else if (type->kind == RDI_TypeKindExt_StaticMethod) { - RDIB_Type *params = type->static_method.params_type; - - U64 type_index_count = params->params.count + 1; - U32 *type_indices = push_array_no_zero(arena, U32, type_index_count); - U64 type_idx_cursor = 0; - - // static methods don't have 'this' - type_indices[type_idx_cursor++] = 0; - - // pack params - for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) { - type_indices[type_idx_cursor++] = rdib_idx_from_type(params->params.types[param_idx]); - } - - // insert type indices - U32 static_method_type_idx = rdib_idx_from_type(type); - type->static_method.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, static_method_type_idx, type_index_count, type_indices); - } - } - - ProfEnd(); -} - -internal U32 -rdib_idx_from_name_map_void_node(RDIB_BuildIndexRunsTask *task, VoidNode *node) -{ - U64 idx = 0; - switch (task->name_map_kind) { - case RDI_NameMapKind_NULL : break; - case RDI_NameMapKind_GlobalVariables : idx = rdib_idx_from_variable ((RDIB_Variable* ) node); break; - case RDI_NameMapKind_ThreadVariables : idx = rdib_idx_from_variable ((RDIB_Variable * ) node); break; - case RDI_NameMapKind_Procedures : idx = rdib_idx_from_procedure ((RDIB_Procedure * ) node); break; - case RDI_NameMapKind_Types : idx = rdib_idx_from_type ((RDIB_Type * ) node); break; - case RDI_NameMapKind_LinkNameProcedures: idx = rdib_idx_from_procedure ((RDIB_Procedure * ) node); break; - case RDI_NameMapKind_NormalSourcePaths : idx = rdib_idx_from_source_file((RDIB_SourceFile *) node); break; - default: InvalidPath; - } - U32 idx32 = safe_cast_u32(idx); - return idx32; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_idx_runs_name_map_buckets_task) -{ - ProfBeginFunction(); - - RDIB_BuildIndexRunsTask *task = raw_task; - - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_StringMapBucket *bucket = task->name_map_buckets[bucket_idx]; - U64 count = void_list_count_nodes(bucket->raw_values); - - if (count > 1) { - // build array of indices that point to name map respective arrays - U32 *idxs = push_array_no_zero(arena, U32, count); - { - U64 curr_idx = 0; - for (VoidNode *curr = bucket->raw_values; curr != 0; curr = curr->next, ++curr_idx) { - idxs[curr_idx] = rdib_idx_from_name_map_void_node(task, curr->v); - } - } - - // make index array deterministic - u32_array_sort(count, idxs); // TODO: we don't need to sort with one worker thread - - // :string_map_bucket_sorter_copy - U64 idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, bucket_idx, count, idxs); // TODO: fix `idx` leak when we insert same runs - - // fill out bucket - bucket->count = count; - bucket->idx_run_bucket_idx = idx_run_bucket_idx; - } if (count == 1) { - U32 match_idx = rdib_idx_from_name_map_void_node(task, bucket->raw_values->v); - - // fill out bucket - bucket->count = 1; - bucket->match_idx = match_idx; - } - } - - ProfEnd(); -} - -//////////////////////////////// - -#if 0 -internal U32 -rdib_idx_from_params(RDIB_IndexRunMap *map, RDIB_Type *params) -{ - Assert(params->kind == RDI_TypeKindExt_Params); - U32 idx = params->params.idx_run_bucket->index_in_output_array; - return idx; -} -#endif - -//////////////////////////////// -// Data Sections - -internal void -rdib_data_section_list_push_node(RDIB_DataSectionList *list, RDIB_DataSectionNode *node) -{ - SLLQueuePushCount(list, node); -} - -internal RDIB_DataSectionNode * -rdib_data_section_list_push(Arena *arena, RDIB_DataSectionList *list, RDIB_DataSection v) -{ - RDIB_DataSectionNode *node = push_array(arena, RDIB_DataSectionNode, 1); - node->v = v; - rdib_data_section_list_push_node(list, node); - return node; -} - -internal void -rdib_data_section_list_concat_in_place(RDIB_DataSectionList *list, RDIB_DataSectionList *to_concat) -{ - SLLConcatInPlace(list, to_concat); -} - -internal void -rdib_data_sections_from_top_level_info(Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_TopLevelInfo *src) -{ - ProfBeginFunction(); - - RDI_TopLevelInfo *dst = push_array(arena, RDI_TopLevelInfo, 1); - dst->arch = src->arch; - dst->exe_name_string_idx = rdib_idx_from_string_map(string_map, src->exe_name); - dst->exe_hash = src->exe_hash; - dst->voff_max = src->voff_max; - dst->producer_name_string_idx = rdib_idx_from_string_map(string_map, src->producer_string); - - RDIB_DataSection sect = { .tag = RDI_SectionKind_TopLevelInfo }; - str8_list_push(arena, §.data, str8_struct(dst)); - rdib_data_section_list_push(arena, sect_list, sect); - - ProfEnd(); -} - -internal void -rdib_data_sections_from_binary_sections(Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_BinarySection *binary_sects, U64 binary_sects_count) -{ - ProfBeginFunction(); - - RDI_BinarySection *dst_arr = push_array(arena, RDI_BinarySection, binary_sects_count); - - for (U64 sect_idx = 0; sect_idx < binary_sects_count; ++sect_idx) { - RDIB_BinarySection *src = &binary_sects[sect_idx]; - RDI_BinarySection *dst = &dst_arr[sect_idx]; - - dst->name_string_idx = rdib_idx_from_string_map(string_map, src->name); - dst->flags = src->flags; - dst->voff_first = src->voff_first; - dst->voff_opl = src->voff_opl; - dst->foff_first = src->foff_first; - dst->foff_opl = src->foff_opl; - } - - RDIB_DataSection sect = { .tag = RDI_SectionKind_BinarySections }; - str8_list_push(arena, §.data, str8_array(dst_arr, binary_sects_count)); - rdib_data_section_list_push(arena, sect_list, sect); - - ProfEnd(); -} - -internal void -rdib_data_sections_from_units(Arena *arena, - RDIB_DataSectionList *sect_list, - RDIB_StringMap *string_map, - RDIB_PathTree *path_tree, - U64 total_unit_count, - U64 unit_chunk_count, - RDIB_UnitChunk **unit_chunks) -{ - ProfBeginFunction(); - - RDI_Unit *dst_arr = push_array(arena, RDI_Unit, total_unit_count); - for (U64 chunk_idx = 0; chunk_idx < unit_chunk_count; chunk_idx += 1) { - RDIB_UnitChunk *chunk = unit_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; i += 1) { - RDIB_Unit *src = &chunk->v[i]; - U64 unit_idx = rdib_idx_from_unit(src); - RDI_Unit *dst = &dst_arr[unit_idx]; - dst->unit_name_string_idx = rdib_idx_from_string_map(string_map, src->unit_name); - dst->compiler_name_string_idx = rdib_idx_from_string_map(string_map, src->compiler_name); - dst->source_file_path_node = rdib_idx_from_path_tree(path_tree, src->source_file); - dst->object_file_path_node = rdib_idx_from_path_tree(path_tree, src->object_file); - dst->archive_file_path_node = rdib_idx_from_path_tree(path_tree, src->archive_file); - dst->build_path_node = rdib_idx_from_path_tree(path_tree, src->build_path); - dst->language = src->language; - dst->line_table_idx = src->line_table->output_array_idx; - } - } - - RDIB_DataSection sect = { .tag = RDI_SectionKind_Units }; - str8_list_push(arena, §.data, str8_array(dst_arr, total_unit_count)); - rdib_data_section_list_push(arena, sect_list, sect); - - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_unit_task) -{ - ProfBeginFunction(); - RDIB_VMapBuilderTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_UnitChunk *chunk = task->unit_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Unit *unit = &chunk->v[i]; - task->counts[task_id] += unit->virt_range_count; - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_gvar_task) -{ - ProfBeginFunction(); - RDIB_VMapBuilderTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_VariableChunk *chunk = task->gvar_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Variable *var = &chunk->v[i]; - for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) { - task->counts[task_id] += loc_n->v.ranges.count; - } - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_scope_task) -{ - ProfBeginFunction(); - RDIB_VMapBuilderTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_ScopeChunk *chunk = task->scope_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - task->counts[task_id] += chunk->v[i].ranges.count; - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_unit_task) -{ - ProfBeginFunction(); - RDIB_VMapBuilderTask *task = raw_task; - U64 range_cursor = task->offsets[task_id]; - U64 range_cursor_opl = task->offsets[task_id] + task->counts[task_id]; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_UnitChunk *chunk = task->unit_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Unit *unit = &chunk->v[i]; - for (Rng1U64 *range_ptr = unit->virt_ranges, *range_opl = unit->virt_ranges + unit->virt_range_count; - range_ptr < range_opl; ++range_ptr) { - Assert(range_cursor < range_cursor_opl); - Assert(range_ptr->min <= range_ptr->max); - - RDIB_VMapRange *vmap_range = task->vmap + range_cursor; - vmap_range->voff = range_ptr->min; - vmap_range->size = range_ptr->max - range_ptr->min; - vmap_range->idx = rdib_idx_from_unit(unit); - range_cursor += 1; - } - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_gvar_task) -{ - ProfBeginFunction(); - RDIB_VMapBuilderTask *task = raw_task; - - U64 range_cursor = task->offsets[task_id]; - U64 range_cursor_opl = task->offsets[task_id] + task->counts[task_id]; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_VariableChunk *chunk = task->gvar_chunks[chunk_idx]; - for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) { - RDIB_Variable *var = &chunk->v[var_idx]; - for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) { - for (Rng1U64Node *range_n = loc_n->v.ranges.first; range_n != 0; range_n = range_n->next) { - Assert(range_cursor < range_cursor_opl); - Assert(range_n->v.min <= range_n->v.max); - U64 size = range_n->v.max - range_n->v.min; - - RDIB_VMapRange *vmap_range = task->vmap + range_cursor; - vmap_range->voff = range_n->v.min; - vmap_range->size = size; - vmap_range->idx = rdib_idx_from_variable(var); - range_cursor += 1; - } - } - } - } - - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_scope_task) -{ - ProfBeginFunction(); - RDIB_VMapBuilderTask *task = raw_task; - - U64 range_cursor = task->offsets[task_id]; - U64 range_cursor_opl = task->offsets[task_id] + task->counts[task_id]; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_ScopeChunk *chunk = task->scope_chunks[chunk_idx]; - for (U64 scope_idx = 0; scope_idx < chunk->count; ++scope_idx) { - RDIB_Scope *scope = &chunk->v[scope_idx]; - for (Rng1U64Node *range_n = scope->ranges.first; range_n != 0; range_n = range_n->next) { - Assert(range_cursor < range_cursor_opl); - Assert(range_n->v.min <= range_n->v.max); - - RDIB_VMapRange *vmap_range = task->vmap + range_cursor; - vmap_range->voff = range_n->v.min; - vmap_range->size = range_n->v.max - range_n->v.min; - vmap_range->idx = rdib_idx_from_scope(scope); - range_cursor += 1; - } - } - } - - ProfEnd(); -} - -internal void -rdib_sort_procs_radix_32(RDIB_Procedure **v, U64 count) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - RDIB_Procedure **temp = push_array_no_zero(scratch.arena, RDIB_Procedure *, count); - RDIB_Procedure **src = v; - RDIB_Procedure **dst = temp; - - ProfBegin("Count Memzero"); - U32 count_8lo[256]; MemoryZeroArray(count_8lo); - U32 count_8hi[256]; MemoryZeroArray(count_8hi); - U32 count_16[1 << 16]; MemoryZeroArray(count_16); - ProfEnd(); - - ProfBegin("Histogram"); - for (U64 i = 0; i < count; i += 1) { - RDIB_Procedure *p = src[i]; - - U64 digit_8lo = (p->scope->ranges.first->v.min >> 0) % ArrayCount(count_8lo); - U64 digit_8hi = (p->scope->ranges.first->v.min >> 8) % ArrayCount(count_8hi); - U64 digit_16 = (p->scope->ranges.first->v.min >> 16) % ArrayCount(count_16); - - count_8lo[digit_8lo] += 1; - count_8hi[digit_8hi] += 1; - count_16[digit_16] += 1; - } - ProfEnd(); - - ProfBegin("Counts -> Offsets"); - u32_array_counts_to_offsets(ArrayCount(count_8lo), count_8lo); - u32_array_counts_to_offsets(ArrayCount(count_8hi), count_8hi); - u32_array_counts_to_offsets(ArrayCount(count_16), count_16 ); - ProfEnd(); - - ProfBegin("Order 8 Lo"); - for (U64 i = 0; i < count; i += 1) { - RDIB_Procedure *p = src[i]; - U64 digit = (p->scope->ranges.first->v.min >> 0) % ArrayCount(count_8lo); - dst[count_8lo[digit]++] = p; - } - ProfEnd(); - - ProfBegin("Order 8 Hi"); - for (U64 i = 0; i < count; i += 1) { - RDIB_Procedure *p = dst[i]; - U64 digit = (p->scope->ranges.first->v.min >> 8) % ArrayCount(count_8hi); - src[count_8hi[digit]++] = p; - } - ProfEnd(); - - ProfBegin("Order 16"); - for (U64 i = 0; i < count; i += 1) { - RDIB_Procedure *p = src[i]; - U64 digit = (p->scope->ranges.first->v.min >> 16) % ArrayCount(count_16); - dst[count_16[digit]++] = p; - } - ProfEnd(); - - MemoryCopyTyped(src, dst, count); - - scratch_end(scratch); - ProfEnd(); -} - -internal String8List -rdib_data_from_vmap(Arena *arena, U64 range_count, RDIB_VMapRange *ranges) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - const U64 size_bit_count0 = 8; - const U64 size_bit_count1 = 8; - const U64 size_bit_count2 = 16; - - const U64 voff_bit_count0 = 11; - const U64 voff_bit_count1 = 11; - const U64 voff_bit_count2 = 10; - - ProfBegin("Push shared buffer"); - U64 radix_memory_size = sizeof(RDIB_VMapRange) * range_count + - sizeof(U32) * ((1 << size_bit_count0) + (1 << size_bit_count1) + (1 << size_bit_count2)) + - sizeof(U32) * ((1 << voff_bit_count0) + (1 << voff_bit_count1) + (1 << voff_bit_count2)); - U8 *radix_memory = push_array_no_zero(arena, U8, radix_memory_size); - ProfEnd(); - - // TODO: windows caps images at 4GiB so we use 32-bit radix sort, but on linux - // images can have > 4GiB and we need to detect when vmap uses upper 32bits - // in voffs do a 64-bit radix sort. - ProfBegin("Sort"); - { - RDIB_VMapRange *src = ranges; - RDIB_VMapRange *dst = (RDIB_VMapRange *)radix_memory; - - U32 *size_count0 = (U32 *)(dst + range_count); - U32 *size_count1 = size_count0 + (1 << size_bit_count0); - U32 *size_count2 = size_count1 + (1 << size_bit_count1); - - U32 *voff_count0 = size_count2 + (1 << size_bit_count2); - U32 *voff_count1 = voff_count0 + (1 << voff_bit_count0); - U32 *voff_count2 = voff_count1 + (1 << voff_bit_count1); - - // - // Build histogram - // - - MemoryZeroTyped(size_count0, 1 << size_bit_count0); - MemoryZeroTyped(size_count1, 1 << size_bit_count1); - MemoryZeroTyped(size_count2, 1 << size_bit_count2); - - MemoryZeroTyped(voff_count0, 1 << voff_bit_count0); - MemoryZeroTyped(voff_count1, 1 << voff_bit_count1); - MemoryZeroTyped(voff_count2, 1 << voff_bit_count2); - - for (U64 i = 0; i < range_count; ++i) { - RDIB_VMapRange *r = src+i; - - U32 size_digit0 = (-r->size >> 0) % (1 << size_bit_count0); - U32 size_digit1 = (-r->size >> size_bit_count0) % (1 << size_bit_count1); - U32 size_digit2 = (-r->size >> (size_bit_count0 + size_bit_count1)) % (1 << size_bit_count2); - - U64 voff_digit0 = (r->voff >> 0) % (1 << voff_bit_count0); - U64 voff_digit1 = (r->voff >> voff_bit_count0) % (1 << voff_bit_count1); - U64 voff_digit2 = (r->voff >> (voff_bit_count0 + voff_bit_count1)) % (1 << voff_bit_count2); - - ++size_count0[size_digit0]; - ++size_count1[size_digit1]; - ++size_count2[size_digit2]; - - ++voff_count0[voff_digit0]; - ++voff_count1[voff_digit1]; - ++voff_count2[voff_digit2]; - } - - u32_array_counts_to_offsets((1 << size_bit_count0), size_count0); - u32_array_counts_to_offsets((1 << size_bit_count1), size_count1); - u32_array_counts_to_offsets((1 << size_bit_count2), size_count2); - - u32_array_counts_to_offsets((1 << voff_bit_count0), voff_count0); - u32_array_counts_to_offsets((1 << voff_bit_count1), voff_count1); - u32_array_counts_to_offsets((1 << voff_bit_count2), voff_count2); - - // - // Sort on range size (high to low) - // - - for (U64 i = 0; i < range_count; ++i) { - RDIB_VMapRange r = src[i]; - U32 digit = (-r.size >> 0) % (1 << size_bit_count0); - dst[size_count0[digit]++] = r; - } - - for (U64 i = 0; i < range_count; ++i) { - RDIB_VMapRange r = dst[i]; - U32 digit = (-r.size >> size_bit_count0) % (1 << size_bit_count1); - src[size_count1[digit]++] = r; - } - - for (U64 i = 0; i < range_count; ++i) { - RDIB_VMapRange r = src[i]; - U32 digit = (-r.size >> (size_bit_count0 + size_bit_count1)) % (1 << size_bit_count2); - dst[size_count2[digit]++] = r; - } - - // - // Sort on range voff (low to high) - // - - for (U64 i = 0; i < range_count; ++i) { - RDIB_VMapRange r = dst[i]; - U32 digit = (r.voff >> 0) % (1 << voff_bit_count0); - src[voff_count0[digit]++] = r; - } - - for (U64 i = 0; i < range_count; ++i) { - RDIB_VMapRange r = src[i]; - U32 digit = (r.voff >> voff_bit_count0) % (1 << voff_bit_count1); - dst[voff_count1[digit]++] = r; - } - - for (U64 i = 0; i < range_count; ++i) { - RDIB_VMapRange r = dst[i]; - U32 digit = (r.voff >> (voff_bit_count0 + voff_bit_count1)) % (1 << voff_bit_count2); - src[voff_count2[digit]++] = r; - } - } - ProfEnd(); - - ProfBegin("Layout virtual map"); - String8List raw_vmap = {0}; - { - U64 default_vme_cap = 4096; - U64 vme_block_cap = radix_memory_size / sizeof(RDI_VMapEntry); - U64 vme_block_size = 0; - RDI_VMapEntry *vme_block = (RDI_VMapEntry *)radix_memory; - - // Recycle radix sort memory - str8_list_push(arena, &raw_vmap, str8_array(vme_block, vme_block_cap)); - -#define push_vme() (vme_block_size < raw_vmap.last->string.size/sizeof(vme_block[0])) ? &vme_block[vme_block_size++] : \ - (vme_block = push_array(arena, RDI_VMapEntry, vme_block_cap), \ - vme_block_cap = default_vme_cap, \ - vme_block_size = 0, \ - str8_list_push(arena, &raw_vmap, str8_array(vme_block, vme_block_cap)), \ - &vme_block[vme_block_size++]) - - struct Stack { - RDIB_VMapRange *range; - struct Stack *next; - }; - struct Stack *stack = 0; - struct Stack *free_stack = 0; - stack = push_array(scratch.arena, struct Stack, 1); - stack->range = &ranges[0]; - - for (U64 range_idx = 1; range_idx < range_count; ++range_idx) { - RDIB_VMapRange *r = ranges+range_idx; - RDIB_VMapRange *last_bot_range = stack->range; - RDIB_VMapRange *last_pop_range = 0; - while (stack->range->idx != 0) { - if (r->voff < stack->range->voff + stack->range->size) { - // Current range is a subset, keep building stack - break; - } - - struct Stack *frame = stack; - SLLStackPop(stack); - - // Did we reach bottom most range? - if (last_pop_range == 0) { - // Don't push VME for index with adjacent ranges - if (vme_block_size > 0 && vme_block[vme_block_size-1].idx != frame->range->idx) { - RDI_VMapEntry *vme = push_vme(); - vme->voff = frame->range->voff; - vme->idx = frame->range->idx; - } - } - - // Reopen parent range - // - // Does parent range extend past child range? - if (stack->range->voff + stack->range->size != frame->range->voff + frame->range->size && - // Does next range open on where stack range ends? - r->voff != frame->range->voff + frame->range->size) { - RDI_VMapEntry *vme = push_vme(); - vme->idx = stack->range->idx; - vme->voff = frame->range->voff + frame->range->size; - } - - last_pop_range = stack->range; - - // Recycle stack frame - SLLStackPush(free_stack, frame); - } - - // Prefix - if (last_pop_range == 0 && last_bot_range->voff != r->voff) { - RDI_VMapEntry* vme = push_vme(); - vme->voff = last_bot_range->voff; - vme->idx = last_bot_range->idx; - } - - struct Stack *frame; - if (free_stack == 0) { - frame = push_array(scratch.arena, struct Stack, 1); - } else { - frame = free_stack; - SLLStackPop(free_stack); - } - frame->range = r; - SLLStackPush(stack, frame); - } - - // Empty stack - { - RDIB_VMapRange *last_pop_range = 0; - while (stack->range->idx != 0) { - struct Stack *frame = stack; - SLLStackPop(stack); - - if (last_pop_range == 0) { - if (vme_block_size > 0 && vme_block[vme_block_size-1].idx != frame->range->idx) { - RDI_VMapEntry *vme = push_vme(); - vme->voff = frame->range->voff; - vme->idx = frame->range->idx; - } - } - - if (stack->range->voff + stack->range->size != frame->range->voff + frame->range->size) { - RDI_VMapEntry *vme = push_vme(); - vme->voff = frame->range->voff + frame->range->size; - vme->idx = stack->range->idx; - } - - last_pop_range = stack->range; - } - } - - // Subtract unsued vmap entries - U64 last_vme_unused = raw_vmap.last->string.size - sizeof(vme_block[0]) * vme_block_size; - raw_vmap.last->string.size -= last_vme_unused; - raw_vmap.total_size -= last_vme_unused; - -#undef push_vme - } - ProfEnd(); - - - // duplicate voff check -#if 0 - U64 prev = max_U64; - for (String8Node *node = raw_vmap.first; node != 0; node = node->next) { - RDI_VMapEntry *e = (RDI_VMapEntry*)node->string.str; - for (U64 i = 0, c = node->string.size / sizeof(RDI_VMapEntry); i < c; ++i) { - Assert(e[i].voff != prev); - prev = e[i].voff; - } - } -#endif - - scratch_end(scratch); - ProfEnd(); - return raw_vmap; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_fill_scope_vmaps_task) -{ - ProfBeginFunction(); - RDIB_VMapBuilderTask *task = raw_task; - task->raw_vmaps[task_id] = rdib_data_from_vmap(arena, task->vmap_counts[task_id], task->vmaps[task_id]); - ProfEnd(); -} - -internal void -rdib_data_sections_from_unit_gvar_scope_vmaps(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - U64 unit_chunk_count, RDIB_UnitChunk **unit_chunks, - U64 gvar_chunk_count, RDIB_VariableChunk **gvar_chunks, - U64 scope_chunk_count, RDIB_ScopeChunk **scope_chunks) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(arena->v, arena->count); - - RDIB_VMapBuilderTask task = {0}; - task.counts = push_array(scratch.arena, U64, tp->worker_count); - task.ranges = tp_divide_work(scratch.arena, unit_chunk_count, tp->worker_count); - - ProfBegin("Unit VMap"); - U64 unit_vmap_count; - RDIB_VMapRange *unit_vmaps; - { - ProfBegin("Count Ranges"); - MemoryZeroTyped(task.counts, tp->worker_count); - task.unit_chunks = unit_chunks; - task.ranges = tp_divide_work(scratch.arena, unit_chunk_count, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_unit_task, &task); - ProfEnd(); - - ProfBegin("Push"); - unit_vmap_count = sum_array_u64(tp->worker_count, task.counts); - unit_vmaps = push_array_no_zero(scratch.arena, RDIB_VMapRange, unit_vmap_count); - ProfEnd(); - - ProfBegin("Fill"); - task.vmap = unit_vmaps; - task.unit_chunks = unit_chunks; - task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_unit_task, &task); - ProfEnd(); - } - ProfEnd(); - - ProfBegin("Global Variables"); - U64 gvar_vmap_count; - RDIB_VMapRange *gvar_vmaps; - { - ProfBegin("Count"); - MemoryZeroTyped(task.counts, tp->worker_count); - task.ranges = tp_divide_work(scratch.arena, gvar_chunk_count, tp->worker_count); - task.gvar_chunks = gvar_chunks; - tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_gvar_task, &task); - ProfEnd(); - - ProfBegin("Push"); - gvar_vmap_count = sum_array_u64(tp->worker_count, task.counts); - gvar_vmaps = push_array_no_zero(scratch.arena, RDIB_VMapRange, gvar_vmap_count); - ProfEnd(); - - ProfBegin("Fill"); - task.vmap = gvar_vmaps; - task.gvar_chunks = gvar_chunks; - task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_gvar_task, &task); - ProfEnd(); - } - ProfEnd(); - - ProfBegin("Scopes"); - U64 scope_vmap_count; - RDIB_VMapRange *scope_vmaps; - { - ProfBegin("Count"); - MemoryZeroTyped(task.counts, tp->worker_count); - task.ranges = tp_divide_work(scratch.arena, scope_chunk_count, tp->worker_count); - task.scope_chunks = scope_chunks; - tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_scope_task, &task); - ProfEnd(); - - ProfBegin("Push"); - scope_vmap_count = sum_array_u64(tp->worker_count, task.counts); - scope_vmaps = push_array_no_zero(scratch.arena, RDIB_VMapRange, scope_vmap_count); - ProfEnd(); - - ProfBegin("Fill"); - task.vmap = scope_vmaps; - task.scope_chunks = scope_chunks; - task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_scope_task, &task); - ProfEnd(); - } - ProfEnd(); - - task.vmap_counts[0] = unit_vmap_count; - task.vmap_counts[1] = gvar_vmap_count; - task.vmap_counts[2] = scope_vmap_count; - task.vmaps[0] = unit_vmaps; - task.vmaps[1] = gvar_vmaps; - task.vmaps[2] = scope_vmaps; - - ProfBegin("Fill RDI VMaps"); - MemoryZeroArray(task.raw_vmaps); - tp_for_parallel(tp, arena, 3, rdib_fill_scope_vmaps_task, &task); - ProfEnd(); - - RDIB_DataSection unit_vmap_sect = { .tag = RDI_SectionKind_UnitVMap, .data = task.raw_vmaps[0] }; - RDIB_DataSection gvar_vmap_sect = { .tag = RDI_SectionKind_GlobalVMap, .data = task.raw_vmaps[1] }; - RDIB_DataSection scope_vmap_sect = { .tag = RDI_SectionKind_ScopeVMap, .data = task.raw_vmaps[2] }; - rdib_data_section_list_push(arena->v[0], sect_list, unit_vmap_sect ); - rdib_data_section_list_push(arena->v[0], sect_list, gvar_vmap_sect ); - rdib_data_section_list_push(arena->v[0], sect_list, scope_vmap_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_copy_string_data_task) -{ - RDIB_CopyStringDataTask *task = raw_task; - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_StringMapBucket *bucket = task->buckets[bucket_idx]; - U64 string_table_offset = task->string_table[bucket_idx]; - Assert(string_table_offset + bucket->string.size <= task->string_data_size); - MemoryCopy(task->string_data + string_table_offset, bucket->string.str, bucket->string.size); - } -} - -internal void -rdib_data_sections_from_string_map(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - // assign string table offset for each bucket - U64 cursor = 0; - U32 *string_table = push_array_no_zero(arena, U32, bucket_count); - for (U64 bucket_idx = 0; bucket_idx < bucket_count; ++bucket_idx) { - string_table[bucket_idx] = cursor; - cursor += buckets[bucket_idx]->string.size; - } - - // populate string data buffer with bucket strings - RDIB_CopyStringDataTask task = {0}; - task.string_table = string_table; - task.string_data_size = cursor; - task.string_data = push_array_no_zero(arena, U8, task.string_data_size); - task.buckets = buckets; - task.ranges = tp_divide_work(scratch.arena, bucket_count, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_copy_string_data_task, &task); - - // fill out string table section - RDIB_DataSection string_table_sect = {0}; - string_table_sect.tag = RDI_SectionKind_StringTable; - str8_list_push(arena, &string_table_sect.data, str8((U8 *)task.string_table, sizeof(task.string_table[0]) * bucket_count)); - - // fill out string data section - RDIB_DataSection string_data_sect = { .tag = RDI_SectionKind_StringData }; - str8_list_push(arena, &string_data_sect.data, str8(task.string_data, task.string_data_size)); - - // push sections to list - rdib_data_section_list_push(arena, sect_list, string_table_sect); - rdib_data_section_list_push(arena, sect_list, string_data_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_idx_run_copy_task) -{ - RDIB_IdxRunCopyTask *task = raw_task; - for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) { - RDIB_IndexRunBucket *bucket = task->buckets[bucket_idx]; - MemoryCopyTyped(&task->output_array[bucket->index_in_output_array], bucket->indices.v, bucket->indices.count); - } -} - -internal void -rdib_data_sections_from_index_runs(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_IndexRunBucket **buckets, U64 bucket_count) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - ProfBegin("Count Indices"); - U64 total_index_count = 0; - for (U64 bucket_idx = 0; bucket_idx < bucket_count; ++bucket_idx) { - total_index_count += buckets[bucket_idx]->indices.count; - } - ProfEnd(); - - U32 *output_array = push_array_no_zero(arena, U32, total_index_count); - - RDIB_IdxRunCopyTask task = {0}; - task.buckets = buckets; - task.ranges = tp_divide_work(scratch.arena, bucket_count, tp->worker_count); - task.output_array = output_array; - tp_for_parallel(tp, 0, tp->worker_count, rdib_idx_run_copy_task, &task); - - RDIB_DataSection data_sect = { .tag = RDI_SectionKind_IndexRuns }; - str8_list_push(arena, &data_sect.data, str8_array(output_array, total_index_count)); - - rdib_data_section_list_push(arena, sect_list, data_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_file_path_nodes_task) -{ - ProfBeginFunction(); - RDIB_BuildFilePathNodesTask *task = raw_task; - RDIB_StringMap *string_map = task->string_map; - RDIB_PathTree *path_tree = task->path_tree; - for (RDIB_PathTreeNode *n = path_tree->node_lists[task_id].first; n != 0; n = n->next_order) { - RDI_FilePathNode *dst = task->nodes_dst + n->node_idx; - dst->name_string_idx = rdib_idx_from_string_map(string_map, n->sub_path); - - B32 is_source_file_node = (n->first_child == 0); - if (is_source_file_node) { - dst->source_file_idx = rdib_idx_from_source_file(n->src_file); - } else { - // directories don't have a source file - Assert(n->src_file == 0); - dst->source_file_idx = 0; - } - - if(n->parent) { - dst->parent_path_node = n->parent->node_idx; - } - if (n->first_child) { - dst->first_child = n->first_child->node_idx; - } - if (n->next_sibling) { - dst->next_sibling = n->next_sibling->node_idx; - } - } - ProfEnd(); -} - -internal void -rdib_data_sections_from_path_tree(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree) -{ - ProfBeginFunction(); - RDI_FilePathNode *nodes_dst = push_array_no_zero(arena, RDI_FilePathNode, path_tree->node_count); - - RDIB_BuildFilePathNodesTask task = {0}; - task.path_tree = path_tree; - task.string_map = string_map; - task.nodes_dst = nodes_dst; - tp_for_parallel(tp, 0, path_tree->list_count, rdib_build_file_path_nodes_task, &task); - - RDIB_DataSection data_sect = { .tag = RDI_SectionKind_FilePathNodes }; - str8_list_push(arena, &data_sect.data, str8_array(nodes_dst, path_tree->node_count)); - - rdib_data_section_list_push(arena, sect_list, data_sect); - - ProfEnd(); -} - -internal RDIB_PathTree * -rdib_build_path_tree(Arena *arena, - U64 worker_count, - RDIB_SourceFile *null_src_file, - U64 unit_chunk_count, - RDIB_UnitChunk **unit_chunks, - U64 src_file_chunk_count, - RDIB_SourceFileChunk **src_file_chunks) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - - RDIB_PathTree *tree = rdib_path_tree_init(arena, worker_count); - rdib_path_tree_insert(arena, tree, RDIB_PATH_TREE_NIL_STRING, null_src_file); - - ProfBegin("Units"); - for (U64 ichunk = 0; ichunk < unit_chunk_count; ++ichunk) { - RDIB_UnitChunk *chunk = unit_chunks[ichunk]; - for (U64 iunit = 0; iunit < chunk->count; ++iunit) { - RDIB_Unit *unit = &chunk->v[iunit]; - rdib_path_tree_insert(arena, tree, unit->source_file, null_src_file); - rdib_path_tree_insert(arena, tree, unit->object_file, null_src_file); - rdib_path_tree_insert(arena, tree, unit->archive_file, null_src_file); - rdib_path_tree_insert(arena, tree, unit->build_path, null_src_file); - } - } - ProfEnd(); - - ProfBegin("Source Files"); - for (U64 chunk_idx = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) { - RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_SourceFile *src_file = chunk->v + i; - rdib_path_tree_insert(arena, tree, src_file->file_path, src_file); - } - } - ProfEnd(); - - scratch_end(scratch); - ProfEnd(); - return tree; -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_var_section_task) -{ - ProfBeginDynamic("Global Variables Task %llu", task_id); - RDIB_BuildSymbolSectionTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_VariableChunk *chunk = task->gvars_rdib[chunk_idx]; - RDI_Symbol *vars = push_array_no_zero(arena, RDI_Symbol, chunk->count); - - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Variable *src = &chunk->v[i]; - RDI_Symbol *dst = &vars[i]; - - // TODO: temporary hack while we don't have bytecode eval in RDI_GlobalVariable - U64 voff = 0; - if (src->locations.first != 0) { - if (src->locations.first->v.kind == RDI_LocationKind_AddrBytecodeStream && src->locations.first->v.bytecode.first->op == RDI_EvalOp_ModuleOff) { - voff = src->locations.first->v.bytecode.first->p; - } - } - - dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); - dst->type_idx = rdib_idx_from_type(src->type); - - if (src->container_type != 0) { - Assert(!src->container_proc); - dst->container_idx = rdib_idx_from_udt_type(src->container_type); - } - if (src->container_proc != 0) { - Assert(!src->container_type); - dst->container_idx = rdib_idx_from_procedure(src->container_proc); - } - } - - str8_list_push(arena, &task->gvars_out[task_id], str8_array(vars, chunk->count)); - } - - ProfEnd(); -} - -internal void -rdib_data_sections_from_global_variables(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - RDIB_StringMap *string_map, - U64 total_count, - U64 chunk_count, - RDIB_VariableChunk **chunks) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(arena->v, arena->count); - - ProfBegin("Build"); - RDIB_BuildSymbolSectionTask task = {0}; - task.string_map = string_map; - task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); - task.gvars_rdib = chunks; - task.gvars_out = push_array(scratch.arena, String8List, tp->worker_count); - tp_for_parallel(tp, arena, tp->worker_count, rdib_build_var_section_task, &task); - ProfEnd(); - - RDIB_DataSection gvars_sect = { .tag = RDI_SectionKind_GlobalVariables }; - str8_list_concat_in_place_array(&gvars_sect.data, task.gvars_out, tp->worker_count); - rdib_data_section_list_push(arena->v[0], sect_list, gvars_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_tvar_section_task) -{ - RDIB_BuildSymbolSectionTask *task = raw_task; - ProfBeginDynamic("Thread Variables Task [Chunk Count: %llu]", task->ranges[task_id].max - task->ranges[task_id].min); - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_VariableChunk *chunk = task->tvars_rdib[chunk_idx]; - RDI_Symbol *vars = push_array_no_zero(arena, RDI_Symbol, chunk->count); - - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Variable *src = &chunk->v[i]; - RDI_Symbol *dst = &vars[i]; - - U32 tls_off = 0; - if (src->locations.first != 0) { - if (src->locations.first->v.kind == RDI_LocationKind_AddrBytecodeStream && src->locations.first->v.bytecode.first->op == RDI_EvalOp_TLSOff) { - tls_off = src->locations.first->v.bytecode.first->p; - } - } - - dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); - dst->type_idx = rdib_idx_from_type(src->type); - - if (src->container_type != 0) { - Assert(!src->container_proc); - dst->container_idx = rdib_idx_from_udt_type(src->container_type); - } - if (src->container_proc != 0) { - Assert(!src->container_type); - dst->container_idx = rdib_idx_from_procedure(src->container_proc); - } - } - - str8_list_push(arena, &task->tvars_out[task_id], str8_array(vars, chunk->count)); - } - - ProfEnd(); -} - -internal void -rdib_data_sections_from_thread_variables(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - RDIB_StringMap *string_map, - U64 total_count, - U64 chunk_count, - RDIB_VariableChunk **chunks) -{ - ProfBeginDynamic("Thread Variables [Chunk Count: %llu, Total Count %llu]", total_count, chunk_count); - Temp scratch = scratch_begin(arena->v, arena->count); - - ProfBegin("Build"); - RDIB_BuildSymbolSectionTask task = {0}; - task.string_map = string_map; - task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); - task.tvars_rdib = chunks; - task.tvars_out = push_array(scratch.arena, String8List, tp->worker_count); - tp_for_parallel(tp, arena, tp->worker_count, rdib_build_tvar_section_task, &task); - ProfEnd(); - - RDIB_DataSection tvars_sect = { .tag = RDI_SectionKind_ThreadVariables }; - str8_list_concat_in_place_array(&tvars_sect.data, task.tvars_out, tp->worker_count); - rdib_data_section_list_push(arena->v[0], sect_list, tvars_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_procs_section_task) -{ - RDIB_BuildSymbolSectionTask *task = raw_task; - ProfBeginDynamic("Procedures Task [Chunk Count: %llu]", task->ranges[task_id].max - task->ranges[task_id].min); - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_ProcedureChunk *chunk = task->procs_rdib[chunk_idx]; - RDI_Symbol *procs = push_array_no_zero(arena, RDI_Symbol, chunk->count); - - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_Procedure *src = &chunk->v[i]; - RDI_Symbol *dst = &procs[i]; - - dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name); - dst->link_name_string_idx = rdib_idx_from_string_map(task->string_map, src->link_name); - dst->type_idx = rdib_idx_from_type(src->type); - dst->root_scope_idx = rdib_idx_from_scope(src->scope); - - if (src->container_type != 0) { - AssertAlways(!src->container_proc); - dst->container_idx = rdib_idx_from_udt_type(src->container_type); - } - - if (src->container_proc != 0) { - AssertAlways(!src->container_type); - dst->container_idx = rdib_idx_from_procedure(0); Assert(!"TODO"); // src->container_proc - } - } - - str8_list_push(arena, &task->procs_out[task_id], str8_array(procs, chunk->count)); - } - - ProfEnd(); -} - -internal void -rdib_data_sections_from_procedures(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - RDIB_StringMap *string_map, - U64 total_count, - U64 chunk_count, - RDIB_ProcedureChunk **chunks) -{ - ProfBeginDynamic("Procedures [Total Count: %llu, Chunk Count: %llu]", total_count, chunk_count); - Temp scratch = scratch_begin(arena->v, arena->count); - - ProfBegin("Build"); - RDIB_BuildSymbolSectionTask task = {0}; - task.string_map = string_map; - task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); - task.procs_rdib = chunks; - task.procs_out = push_array(scratch.arena, String8List, tp->worker_count); - tp_for_parallel(tp, arena, tp->worker_count, rdib_build_procs_section_task, &task); - ProfEnd(); - - RDIB_DataSection procs_sect = { .tag = RDI_SectionKind_Procedures }; - str8_list_concat_in_place_array(&procs_sect.data, task.procs_out, tp->worker_count); - rdib_data_section_list_push(arena->v[0], sect_list, procs_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_count_scopes_task) -{ - ProfBeginFunction(); - RDIB_BuildSymbolSectionTask *task = raw_task; - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_ScopeChunk *chunk = task->scopes_rdib[chunk_idx]; - for (U64 scope_i = 0; scope_i < chunk->count; ++scope_i) { - RDIB_Scope *scope = &chunk->v[scope_i]; - - task->scope_voff_counts[task_id] += scope->ranges.count * 2; - task->local_counts[task_id] += scope->local_count; - - for (RDIB_Variable *var = scope->local_first; var != 0; var = var->next) { - for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) { - switch (loc_n->v.kind) { - case RDI_LocationKind_NULL: break; - case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_ValBytecodeStream: { - task->loc_data_sizes[task_id] += loc_n->v.bytecode.size + /* stream ender: */ 1; - } break; - case RDI_LocationKind_ValReg: { - //task->loc_data_sizes[task_id] += sizeof(RDI_LocationReg); - } break; - case RDI_LocationKind_AddrRegPlusOff: - case RDI_LocationKind_AddrAddrRegPlusOff: { - //task->loc_data_sizes[task_id] += sizeof(RDI_LocationRegPlusU16); - } break; - default: InvalidPath; - } - - task->loc_block_counts[task_id] += loc_n->v.ranges.count; - task->loc_data_sizes[task_id] += AlignPadPow2(task->loc_data_sizes[task_id], 8); - } - } - } - } - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_scopes_task) -{ -#if 0 - RDIB_BuildSymbolSectionTask *task = raw_task; - ProfBeginDynamic("Scopes [Chunk Count: %llu]", task->ranges[task_id].max - task->ranges[task_id].min); - - // scope voff fill info - U64 scope_voff_cursor = task->scope_voff_offsets[task_id]; - U64 scope_voff_max = task->scope_voff_offsets[task_id] + task->scope_voff_counts[task_id]; - U64 *scope_voff_ptr = task->scope_voffs_rdi; - - // local fill info - U64 local_cursor = task->local_offsets[task_id]; - U64 local_max = task->local_offsets[task_id] + task->local_counts[task_id]; - RDI_Symbol *locals = task->locals_rdi; - - // location data fill info - U64 loc_data_max = task->loc_data_offsets[task_id] + task->loc_data_sizes[task_id]; - U64 loc_data_cursor = task->loc_data_offsets[task_id]; - U8 *loc_data = task->loc_data_rdi; - - // location block fill info - U64 loc_block_cursor = task->loc_block_offsets[task_id]; - U64 loc_block_max = task->loc_block_offsets[task_id] + task->loc_block_counts[task_id]; - void *loc_blocks = task->loc_blocks_rdi; - - for (U64 ichunk = task->ranges[task_id].min; ichunk < task->ranges[task_id].max; ++ichunk) { - RDIB_ScopeChunk *chunk = task->scopes_rdib[ichunk]; - for (U64 iscope = 0; iscope < chunk->count; ++iscope) { - RDIB_Scope *scope_src = &chunk->v[iscope]; - U64 scope_idx = rdib_idx_from_scope(scope_src); - RDI_Scope *scope_dst = &task->scopes_rdi[scope_idx]; - - scope_dst->proc_idx = rdib_idx_from_procedure(scope_src->container_proc); - scope_dst->parent_scope_idx = rdib_idx_from_scope(scope_src->parent); - scope_dst->first_child_scope_idx = rdib_idx_from_scope(scope_src->first_child); - scope_dst->next_sibling_scope_idx = rdib_idx_from_scope(scope_src->next_sibling); - scope_dst->voff_range_first = scope_voff_cursor; - scope_dst->voff_range_opl = scope_voff_cursor + scope_src->ranges.count * 2; - scope_dst->local_count = scope_src->local_count; - if (scope_src->local_count > 0) { - scope_dst->local_first = local_cursor; - } else { - scope_dst->local_first = 0; - } - // TODO: static locals can be exported as local variables - //scope_dst->static_local_idx_run_first = ???; - //scope_dst->static_local_count = ???; - scope_dst->inline_site_idx = rdib_idx_from_inline_site(scope_src->inline_site); - - // fill out scope voffs - for (Rng1U64Node *range_n = scope_src->ranges.first; range_n != 0; range_n = range_n->next) { - Assert(scope_voff_cursor + 2 <= scope_voff_max); - scope_voff_ptr[scope_voff_cursor + 0] = range_n->v.min; - scope_voff_ptr[scope_voff_cursor + 1] = range_n->v.max; - scope_voff_cursor += 2; - } - - // fill out locals & locations - for (RDIB_Variable *local_src = scope_src->local_first; local_src != 0; local_src = local_src->next, ++local_cursor) { - U64 loc_block_first = loc_block_cursor; - - for (RDIB_LocationNode *loc_n = local_src->locations.first; loc_n != 0; loc_n = loc_n->next) { - RDIB_Location *loc = &loc_n->v; - - // fill out location data - U64 location_data_off = loc_data_cursor; - switch (loc->kind) { - case RDI_LocationKind_NULL: break; - case RDI_LocationKind_AddrBytecodeStream: - case RDI_LocationKind_ValBytecodeStream: { - // write opcodes & operands - for (RDIB_EvalBytecodeOp *op_node = loc->bytecode.first; op_node != 0; op_node = op_node->next) { - // opcode - Assert(loc_data_cursor + sizeof(op_node->op) <= loc_data_max); - MemoryCopy(loc_data + loc_data_cursor, &op_node->op, sizeof(op_node->op)); - loc_data_cursor += sizeof(op_node->op); - - // operand - Assert(loc_data_cursor + op_node->p_size <= loc_data_max); - MemoryCopy(loc_data + loc_data_cursor, &op_node->p, op_node->p_size); - loc_data_cursor += op_node->p_size; - } - - // stream ender - Assert(loc_data_cursor + 1 <= loc_data_max); - loc_data[loc_data_cursor] = 0; - loc_data_cursor += 1; - } break; - case RDI_LocationKind_AddrRegPlusOff: - case RDI_LocationKind_AddrAddrRegPlusOff: { - Assert(loc_data_cursor + sizeof(RDI_LocationRegPlusOff) <= loc_data_max); - RDI_LocationRegPlusU16 *dst = (RDI_LocationRegPlusOff *) (loc_data + loc_data_cursor); - dst->kind = loc->kind; - dst->reg_code = loc->reg_code; - dst->offset = loc->offset; - - loc_data_cursor += sizeof(*dst); - } break; - case RDI_LocationKind_ValReg: { - Assert(loc_data_cursor + sizeof(RDI_LocationReg) <= loc_data_max); - RDI_LocationReg *dst = (RDI_LocationReg *) (loc_data + loc_data_cursor); - dst->kind = loc->kind; - dst->reg_code = loc->reg_code; - loc_data_cursor += sizeof(*dst); - } break; - default: InvalidPath; - } - - // zero out align bytes - U64 align_size = AlignPadPow2(loc_data_cursor, 8); - Assert(loc_data_cursor + align_size <= loc_data_max); - MemorySet(loc_data + loc_data_cursor, 0, align_size); - loc_data_cursor += align_size; - - // fill out location block - for (Rng1U64Node *range_n = loc->ranges.first; range_n != 0; range_n = range_n->next, ++loc_block_cursor) { - Assert(loc_block_cursor < loc_block_max); - RDI_LocationBlock *loc_block_dst = &loc_blocks[loc_block_cursor]; - loc_block_dst->scope_off_first = range_n->v.min; - loc_block_dst->scope_off_opl = range_n->v.max; - loc_block_dst->location_data_off = location_data_off; - } - } - - Assert(local_cursor <= local_max); - RDI_Local *local_dst = &locals[local_cursor]; - local_dst->kind = local_src->kind; - local_dst->name_string_idx = rdib_idx_from_string_map(task->string_map, local_src->name); - local_dst->type_idx = rdib_idx_from_type(local_src->type); - if (local_src->locations.count > 0) { - local_dst->location_first = loc_block_first; - local_dst->location_opl = loc_block_cursor; - } else { - local_dst->location_first = 0; - local_dst->location_opl = 0; - } - } - } - } - - Assert(scope_voff_cursor == scope_voff_max); - Assert(local_cursor == local_max); - Assert(loc_data_cursor == loc_data_max); - - ProfEnd(); -#endif -} - -internal void -rdib_data_sections_from_scopes(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - RDIB_StringMap *string_map, - U64 total_scope_count, - U64 chunk_count, - RDIB_ScopeChunk **scopes) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(arena->v, arena->count); - - RDIB_BuildSymbolSectionTask task = {0}; - task.string_map = string_map; - task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); - task.scopes_rdib = scopes; - - ProfBegin("Count Locals & Locations"); - task.scope_voff_counts = push_array(scratch.arena, U64, tp->worker_count); - task.local_counts = push_array(scratch.arena, U64, tp->worker_count); - task.loc_block_counts = push_array(scratch.arena, U64, tp->worker_count); - task.loc_data_sizes = push_array(scratch.arena, U64, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_count_scopes_task, &task); - ProfEnd(); - - U64 total_scope_voff_count = sum_array_u64(tp->worker_count, task.scope_voff_counts); - U64 total_local_count = sum_array_u64(tp->worker_count, task.local_counts ); - U64 total_loc_block_count = sum_array_u64(tp->worker_count, task.loc_block_counts ); - U64 total_loc_data_size = sum_array_u64(tp->worker_count, task.loc_data_sizes ); - - ProfBegin("Fill out scopes, locals, location blocks, and location data"); - task.scope_voff_offsets = offsets_from_counts_array_u64(scratch.arena, task.scope_voff_counts, tp->worker_count); - task.local_offsets = offsets_from_counts_array_u64(scratch.arena, task.local_counts, tp->worker_count); - task.loc_block_offsets = offsets_from_counts_array_u64(scratch.arena, task.loc_block_counts, tp->worker_count); - task.loc_data_offsets = offsets_from_counts_array_u64(scratch.arena, task.loc_data_sizes, tp->worker_count); - - ProfBegin("Push"); - task.scope_voffs_rdi = push_array_no_zero(arena->v[0], U64, total_scope_voff_count); - task.scopes_rdi = push_array_no_zero(arena->v[0], RDI_Scope, total_scope_count ); - //task.locals_rdi = push_array_no_zero(arena->v[0], RDI_Local, total_local_count ); - //task.loc_blocks_rdi = push_array_no_zero(arena->v[0], RDI_LocationBlock, total_loc_block_count ); - task.loc_data_rdi = push_array_no_zero(arena->v[0], U8, total_loc_data_size ); - ProfEnd(); - - tp_for_parallel(tp, 0, tp->worker_count, rdib_build_scopes_task, &task); - ProfEnd(); - - RDIB_DataSection scopes_sect = { .tag = RDI_SectionKind_Scopes }; - RDIB_DataSection scope_voffs_sect = { .tag = RDI_SectionKind_ScopeVOffData }; - RDIB_DataSection locals_sect = { .tag = RDI_SectionKind_NULL }; - RDIB_DataSection loc_blocks_sect = { .tag = RDI_SectionKind_NULL }; - RDIB_DataSection loc_data_sect = { .tag = RDI_SectionKind_NULL }; - - str8_list_push(arena->v[0], &scopes_sect.data, str8_array(task.scopes_rdi, total_scope_count )); - str8_list_push(arena->v[0], &scope_voffs_sect.data, str8_array(task.scope_voffs_rdi, total_scope_voff_count)); - str8_list_push(arena->v[0], &locals_sect.data, str8_array(task.locals_rdi, total_local_count )); - //str8_list_push(arena->v[0], &loc_blocks_sect.data, str8_array(task.loc_blocks_rdi, total_loc_block_count )); - str8_list_push(arena->v[0], &loc_data_sect.data, str8_array(task.loc_data_rdi, total_loc_data_size )); - - rdib_data_section_list_push(arena->v[0], sect_list, scopes_sect ); - rdib_data_section_list_push(arena->v[0], sect_list, scope_voffs_sect); - rdib_data_section_list_push(arena->v[0], sect_list, locals_sect ); - rdib_data_section_list_push(arena->v[0], sect_list, loc_blocks_sect ); - rdib_data_section_list_push(arena->v[0], sect_list, loc_data_sect ); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_name_map_task) -{ - ProfBeginFunction("Build Name Map"); - Temp scratch = scratch_begin(&arena, 1); - - RDIB_NameMapBuilderTask *task = raw_task; - RDI_NameMapKind name_map_idx = (RDI_NameMapKind)task_id; - - U64 out_node_count = task->in_bucket_counts[name_map_idx]; - U64 load_factor = 4; - U64 out_bucket_count = CeilIntegerDiv(out_node_count, load_factor); - - ProfBegin("Build temp hash map"); - struct Node { - struct Node *next; - RDIB_StringMapBucket *name; - }; - struct NodeList { - struct Node *first; - struct Node *last; - U64 node_count; - }; - struct NodeList *temp_map = push_array(scratch.arena, struct NodeList, out_bucket_count); - struct Node *temp_nodes = push_array_no_zero(scratch.arena, struct Node, out_node_count); - for (U64 i = 0; i < task->in_bucket_counts[name_map_idx]; ++i) { - RDIB_StringMapBucket *src_bucket = task->in_buckets[name_map_idx][i]; - - U64 hash = rdi_hash(src_bucket->string.str, src_bucket->string.size); - U64 bucket_idx = hash % out_bucket_count; - - struct Node *node = temp_nodes + i; - node->next = 0; - node->name = src_bucket; - - SLLQueuePush(temp_map[bucket_idx].first, temp_map[bucket_idx].last, node); - ++temp_map[bucket_idx].node_count; - } - ProfEnd(); - - ProfBegin("Push buckets and nodes"); - RDI_NameMapBucket *out_buckets = push_array_no_zero(arena, RDI_NameMapBucket, out_bucket_count); - RDI_NameMapNode *out_nodes = push_array_no_zero(arena, RDI_NameMapNode, out_node_count); - ProfEnd(); - - ProfBegin("Fill out buckets"); - for (U64 bucket_idx = 0, node_cursor = 0; bucket_idx < out_bucket_count; ++bucket_idx) { - struct NodeList *src_bucket = &temp_map[bucket_idx]; - RDI_NameMapBucket *dst_bucket = &out_buckets[bucket_idx]; - - if (src_bucket->node_count == 0) { - dst_bucket->first_node = 0; - dst_bucket->node_count = 0; - continue; - } - - dst_bucket->first_node = safe_cast_u32(node_cursor); - dst_bucket->node_count = src_bucket->node_count; - - for (struct Node *n = src_bucket->first; n != 0; n = n->next, ++node_cursor) { - RDIB_StringMapBucket *src_name = n->name; - - RDI_NameMapNode *dst_node = &out_nodes[node_cursor]; - dst_node->string_idx = rdib_idx_from_string_map(task->string_map, src_name->string); - dst_node->match_count = src_name->count; - if (src_name->count > 1) { - dst_node->match_idx_or_idx_run_first = task->idx_run_map->buckets[src_name->idx_run_bucket_idx]->index_in_output_array; - } else { - dst_node->match_idx_or_idx_run_first = src_name->match_idx; - } - } - } - ProfEnd(); - - // fill out output - task->out_buckets[name_map_idx] = out_buckets; - task->out_nodes[name_map_idx] = out_nodes; - task->out_bucket_counts[name_map_idx] = out_bucket_count; - task->out_node_counts[name_map_idx] = out_node_count; - - scratch_end(scratch); - ProfEnd(); -} - -internal void -rdib_data_sections_from_name_maps(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - RDIB_StringMap *string_map, - RDIB_IndexRunMap *idx_run_map, - RDIB_StringMapBucket **src_name_maps[RDI_NameMapKind_COUNT], - U64 src_name_map_counts[RDI_NameMapKind_COUNT]) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(arena->v, arena->count); - - ProfBegin("Build Name Maps"); - RDIB_NameMapBuilderTask task = {0}; - task.string_map = string_map; - task.idx_run_map = idx_run_map; - task.in_bucket_counts = src_name_map_counts; - task.in_buckets = src_name_maps; - task.out_buckets = push_array(scratch.arena, RDI_NameMapBucket *, RDI_NameMapKind_COUNT); - task.out_nodes = push_array(scratch.arena, RDI_NameMapNode *, RDI_NameMapKind_COUNT); - task.out_bucket_counts = push_array(scratch.arena, U64, RDI_NameMapKind_COUNT); - task.out_node_counts = push_array(scratch.arena, U64, RDI_NameMapKind_COUNT); - tp_for_parallel(tp, arena, RDI_NameMapKind_COUNT, rdib_build_name_map_task, &task); - ProfEnd(); - - U64 *bucket_offsets = offsets_from_counts_array_u64(scratch.arena, task.out_bucket_counts, RDI_NameMapKind_COUNT); - U64 *node_offsets = offsets_from_counts_array_u64(scratch.arena, task.out_node_counts, RDI_NameMapKind_COUNT); - - String8List raw_name_maps = {0}, raw_name_map_buckets = {0}, raw_name_map_nodes = {0}; - for (U64 i = 0; i < RDI_NameMapKind_COUNT; ++i) { - RDI_NameMap *dst_name_map = push_array(arena->v[0], RDI_NameMap, 1); - dst_name_map->bucket_base_idx = bucket_offsets[i]; - dst_name_map->node_base_idx = node_offsets[i]; - dst_name_map->bucket_count = task.out_bucket_counts[i]; - dst_name_map->node_count = task.out_node_counts[i]; - - str8_list_push(arena->v[0], &raw_name_maps, str8_struct(dst_name_map)); - str8_list_push(arena->v[0], &raw_name_map_buckets, str8_array(task.out_buckets[i], task.out_bucket_counts[i])); - str8_list_push(arena->v[0], &raw_name_map_nodes, str8_array(task.out_nodes[i], task.out_node_counts[i])); - } - - RDIB_DataSection name_maps_sect = { .tag = RDI_SectionKind_NameMaps, .data = raw_name_maps }; - RDIB_DataSection name_map_buckets_sect = { .tag = RDI_SectionKind_NameMapBuckets, .data = raw_name_map_buckets }; - RDIB_DataSection name_map_nodes_sect = { .tag = RDI_SectionKind_NameMapNodes, .data = raw_name_map_nodes }; - rdib_data_section_list_push(arena->v[0], sect_list, name_maps_sect); - rdib_data_section_list_push(arena->v[0], sect_list, name_map_buckets_sect); - rdib_data_section_list_push(arena->v[0], sect_list, name_map_nodes_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_src_line_map_task) -{ - // Line tables are ordered to perform 'virtual offset -> line number' maps, - // and thus we potentially can have multiple virtual offsets map to same line number. - // (e.g. in C/C++ if for-loop declaration site is on one line, intial-statment-condition - // and expression parts map to same line number). And so to make things easy on debugger - // we remove duplicates from source line map and reorient mapping to 'line number -> virtual offset' - // this way debugger can quickly compute virtual offsets when placing a breakpoint on a source line. - - Temp scratch = scratch_begin(&arena, 1); - RDIB_SrcLineMapsTask *task = raw_task; - - RDIB_SourceFile *src_file = task->src_file_arr[task_id]; - U64 src_file_idx = rdib_idx_from_source_file(src_file); - - //ProfBeginDynamic("Build Source Line Map [%.*s]", str8_varg(src_file->file_path)); - ProfBegin("Build Source Line Map"); - - ProfBegin("Count lines/virt offsets"); - U64 ln_voff_count = 0; - for (RDIB_LineTableFragment *frag = src_file->line_table_frags; frag != 0; frag = frag->next_src_file) { - ln_voff_count += frag->line_count; - } - ProfEnd(); - - ProfBegin("Push ln_voff_arr"); - PairU32 *ln_voff_arr = push_array_no_zero(scratch.arena, PairU32, ln_voff_count); - ProfEnd(); - - ProfBegin("Fill out ln_voff_arr"); - { - U64 cursor = 0; - for (RDIB_LineTableFragment *frag = src_file->line_table_frags; frag != 0; frag = frag->next_src_file) { - for (U64 line_idx = 0; line_idx < frag->line_count; ++line_idx) { - ln_voff_arr[cursor].v0 = frag->line_nums[line_idx]; - ln_voff_arr[cursor].v1 = frag->voffs[line_idx]; - ++cursor; - } - } - } - ProfEnd(); - - // sort on line number - ProfBegin("Sort"); - if (ln_voff_count < 512) { - // TODO: Radsort is buggy and inifte loops if we sort pair of u64. - // Check-in with Jeff on Monday about bugfix. For now workaround - // the bug wiht pair of u32s. There is no virtual offset larger - // than 4GiB in line table anyway. - radsort(ln_voff_arr, ln_voff_count, pair_u32_is_before_v0); - } else { - u32_pair_sort_radix(ln_voff_count, ln_voff_arr); - } - ProfEnd(); - - // TODO: leak, precompute unique line number count and push exact array lengths - U32 *line_nums = push_array_no_zero(arena, U32, ln_voff_count); - U32 *line_ranges = push_array_no_zero(arena, U32, ln_voff_count + 1); - U64 *voffs = push_array_no_zero(arena, U64, ln_voff_count); - - U64 voff_cursor = 0; - U64 line_num_cursor = 0; - if (ln_voff_count > 0) { - line_nums[line_num_cursor] = ln_voff_arr[0].v0; - voffs[voff_cursor] = ln_voff_arr[0].v1; - line_ranges[line_num_cursor] = voff_cursor; - - ++voff_cursor; - ++line_num_cursor; - - ProfBegin("Fill out output array"); - for (U64 i = 1; i < ln_voff_count; ++i) { - // does this voff belong to next line number? - if (ln_voff_arr[i].v0 != line_nums[line_num_cursor-1]) { - line_nums[line_num_cursor] = ln_voff_arr[i].v0; - line_ranges[line_num_cursor] = (U32)voff_cursor; - ++line_num_cursor; - } - voffs[voff_cursor++] = ln_voff_arr[i].v1; - } - ProfEnd(); - - // did we fill out voff array correctly? - Assert(voff_cursor == ln_voff_count); - - // close last line range - line_ranges[line_num_cursor] = voff_cursor; - } - - // fill out result - task->out_line_counts[src_file_idx] = line_num_cursor; - task->out_voff_counts[src_file_idx] = safe_cast_u32(voff_cursor); - task->out_line_nums[src_file_idx] = line_nums; - task->out_line_ranges[src_file_idx] = line_ranges; - task->out_voffs[src_file_idx] = voffs; - - scratch_end(scratch); - ProfEnd(); -} - -internal void -rdib_data_sections_from_source_line_maps(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - U64 total_src_file_count, - U64 src_file_chunk_count, - RDIB_SourceFileChunk **src_file_chunks) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(arena->v, arena->count); - - ProfBegin("Prepare Source File Array"); - RDIB_SourceFile **src_file_arr = push_array_no_zero(scratch.arena, RDIB_SourceFile *, total_src_file_count); - for (U64 chunk_idx = 0, cursor = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) { - RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - src_file_arr[cursor++] = &chunk->v[i]; - } - } - ProfEnd(); - - ProfBegin("Init Task Context"); - RDIB_SrcLineMapsTask task = {0}; - task.src_file_arr = src_file_arr; - task.out_line_counts = push_array_no_zero(scratch.arena, U32, total_src_file_count); - task.out_voff_counts = push_array_no_zero(scratch.arena, U32, total_src_file_count); - task.out_line_nums = push_array_no_zero(scratch.arena, U32 *, total_src_file_count); - task.out_line_ranges = push_array_no_zero(scratch.arena, U32 *, total_src_file_count); - task.out_voffs = push_array_no_zero(scratch.arena, U64 *, total_src_file_count); - ProfEnd(); - - ProfBegin("Build Source Line Maps"); - tp_for_parallel(tp, arena, total_src_file_count, rdib_build_src_line_map_task, &task); - ProfEnd(); - - ProfBegin("Fill out Source Line Maps"); - RDIB_DataSection src_line_maps_sect = { .tag = RDI_SectionKind_SourceLineMaps }; - RDIB_DataSection src_line_nums_sect = { .tag = RDI_SectionKind_SourceLineMapNumbers }; - RDIB_DataSection src_line_ranges_sect = { .tag = RDI_SectionKind_SourceLineMapRanges }; - RDIB_DataSection src_line_voffs_sect = { .tag = RDI_SectionKind_SourceLineMapVOffs }; - - ProfBegin("Push"); - RDI_SourceLineMap *src_line_maps = push_array_no_zero(arena->v[0], RDI_SourceLineMap, total_src_file_count + 1); - ProfEnd(); - - U64 src_line_map_cursor = 0; - U64 line_num_cursor = 0; - U64 line_range_cursor = 0; - U64 voff_cursor = 0; - - // zero-out null source line map - MemoryZeroStruct(&src_line_maps[src_line_map_cursor]); - ++src_line_map_cursor; - - for (U64 chunk_idx = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) { - RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_SourceFile *src_file = chunk->v + i; - U64 src_file_idx = rdib_idx_from_source_file(src_file); - - if (task.out_line_counts[src_file_idx] > 0) { - src_file->src_line_map_idx = src_line_map_cursor; - - RDI_SourceLineMap *sm = src_line_maps + src_line_map_cursor++; - sm->line_count = task.out_line_counts[src_file_idx]; - sm->voff_count = task.out_voff_counts[src_file_idx]; - sm->line_map_nums_base_idx = line_num_cursor; - sm->line_map_range_base_idx = line_range_cursor; - sm->line_map_voff_base_idx = voff_cursor; - - str8_list_push(arena->v[0], &src_line_nums_sect.data, str8_array(task.out_line_nums[src_file_idx], task.out_line_counts[src_file_idx])); - str8_list_push(arena->v[0], &src_line_ranges_sect.data, str8_array(task.out_line_ranges[src_file_idx], task.out_line_counts[src_file_idx] + 1)); - str8_list_push(arena->v[0], &src_line_voffs_sect.data, str8_array(task.out_voffs[src_file_idx], task.out_voff_counts[src_file_idx])); - - line_num_cursor += task.out_line_counts[src_file_idx]; - line_range_cursor += task.out_line_counts[src_file_idx] + 1; - voff_cursor += task.out_voff_counts[src_file_idx]; - } else { - src_file->src_line_map_idx = 0; - } - } - } - ProfEnd(); - - str8_list_push(arena->v[0], &src_line_maps_sect.data, str8_array(src_line_maps, src_line_map_cursor)); - - rdib_data_section_list_push(arena->v[0], sect_list, src_line_maps_sect); - rdib_data_section_list_push(arena->v[0], sect_list, src_line_nums_sect); - rdib_data_section_list_push(arena->v[0], sect_list, src_line_ranges_sect); - rdib_data_section_list_push(arena->v[0], sect_list, src_line_voffs_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_build_line_tables_task) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - RDIB_BuildLineTablesTask *task = raw_task; - Rng1U64 range = task->ranges[task_id]; - - for (U64 chunk_idx = range.min; chunk_idx < range.max; ++chunk_idx) { - RDIB_LineTableChunk *chunk = task->chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_LineTable *line_table = &chunk->v[i]; - U64 line_table_idx = chunk->base + i; - - U64 total_line_count = 0; - for (RDIB_LineTableFragment *frag = line_table->first; frag != 0; frag = frag->next_line_table) { - total_line_count += frag->line_count + /* range terminator */ 1; - } - - if (total_line_count > 0) { - struct Value { - U32 src_file_idx; - U32 line_num; - U16 col_first; - U16 col_opl; - }; - KeyValuePair *pairs = push_array_no_zero(scratch.arena, KeyValuePair, total_line_count); - struct Value *values = push_array_no_zero(scratch.arena, struct Value, total_line_count); - U64 pair_cursor = 0; - - for (RDIB_LineTableFragment *frag = line_table->first; frag != 0; frag = frag->next_line_table) { - for (U64 line_idx = 0; line_idx < frag->line_count; ++line_idx, ++pair_cursor) { - struct Value *value = &values[pair_cursor]; - KeyValuePair *pair = &pairs[pair_cursor]; - - value->src_file_idx = rdib_idx_from_source_file(frag->src_file); - value->line_num = frag->line_nums[line_idx]; - if (frag->col_count > 0) { - value->col_first = frag->col_nums[line_idx*2]; - value->col_opl = frag->col_nums[line_idx*2 + 1]; - } else { - value->col_first = 0; - value->col_opl = 0; - } - - pair->key_u64 = frag->voffs[line_idx]; - pair->value_raw = value; - } - - // emit terminator - { - KeyValuePair *pair = &pairs[pair_cursor]; - struct Value *value = &values[pair_cursor]; - pair_cursor += 1; - - value->src_file_idx = 0; - value->line_num = 0; - value->col_first = 0; - value->col_opl = 0; - - pair->key_u64 = frag->voffs[frag->line_count]; - pair->value_raw = value; - } - } - - // sort on virtual offset - sort_key_value_pairs_as_u64(pairs, pair_cursor); - - // fill out RDI_Line output - U64 line_count = pair_cursor + 1; - U64 *voffs = push_array_no_zero(arena, U64, line_count); - RDI_Line *lines = push_array_no_zero(arena, RDI_Line, line_count); - - U64 line_cursor = 0; - for (U64 line_idx = 0; line_idx < pair_cursor; ++line_idx) { - // remove terminator if there is a real line number - if (line_idx + 1 < pair_cursor && pairs[line_idx].key_u64 == pairs[line_idx+1].key_u64) { - continue; - } - struct Value *value = pairs[line_idx].value_raw; - voffs[line_cursor] = pairs[line_idx].key_u64; - lines[line_cursor].file_idx = value->src_file_idx; - lines[line_cursor].line_num = value->line_num; - line_cursor += 1; - } - - // fill out terminators - voffs[line_cursor] = ~0llu; - MemoryZeroStruct(&lines[line_cursor]); - line_cursor += 1; - - // fill out line table output - task->out_line_table_counts[line_table_idx] = line_cursor; - task->out_line_table_voffs[line_table_idx] = voffs; - task->out_line_table_lines[line_table_idx] = lines; - } else { - task->out_line_table_counts[line_table_idx] = 0; - task->out_line_table_voffs[line_table_idx] = 0; - task->out_line_table_lines[line_table_idx] = 0; - } - } - } - - scratch_end(scratch); - ProfEnd(); -} - -internal void -rdib_data_sections_from_line_tables(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - U64 total_line_table_count, - U64 chunk_count, - RDIB_LineTableChunk **chunks) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(0,0); - - ProfBegin("Build Line Tables"); - RDIB_BuildLineTablesTask task = {0}; - task.chunks = chunks; - task.ranges = tp_divide_work(scratch.arena, chunk_count, tp->worker_count); - task.out_line_table_counts = push_array_no_zero(scratch.arena, U64, total_line_table_count); - task.out_line_table_voffs = push_array_no_zero(scratch.arena, U64 *, total_line_table_count); - task.out_line_table_lines = push_array_no_zero(scratch.arena, RDI_Line *, total_line_table_count); - tp_for_parallel(tp, arena, tp->worker_count, rdib_build_line_tables_task, &task); - ProfEnd(); - - RDIB_DataSection line_tables_sect = { .tag = RDI_SectionKind_LineTables }; - RDIB_DataSection line_table_voffs_sect = { .tag = RDI_SectionKind_LineInfoVOffs }; - RDIB_DataSection line_table_lines_sect = { .tag = RDI_SectionKind_LineInfoLines }; - RDIB_DataSection line_table_cols_sect = { .tag = RDI_SectionKind_LineInfoColumns }; - - ProfBegin("Fill out Line Tables"); - - ProfBegin("Push"); - RDI_LineTable *line_tables_rdi = push_array_no_zero(arena->v[0], RDI_LineTable, total_line_table_count); - ProfEnd(); - - U64 line_table_cursor = 0; - U64 line_table_voff_cursor = 0; - U64 line_table_line_cursor = 0; - - for (U64 chunk_idx = 0; chunk_idx < chunk_count; ++chunk_idx) { - RDIB_LineTableChunk *chunk = chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_LineTable *src = &chunk->v[i]; - U64 src_idx = rdib_idx_from_line_table(src); - if (task.out_line_table_counts[src_idx] > 0) { - RDI_LineTable *dst = &line_tables_rdi[line_table_cursor]; - - src->output_array_idx = line_table_cursor; - - dst->voffs_base_idx = line_table_voff_cursor; - dst->lines_base_idx = line_table_line_cursor; - dst->cols_base_idx = 0; - dst->lines_count = task.out_line_table_counts[src_idx] - 1; - dst->cols_count = 0; - - str8_list_push(arena->v[0], &line_table_voffs_sect.data, str8_array(task.out_line_table_voffs[src_idx], task.out_line_table_counts[src_idx])); - str8_list_push(arena->v[0], &line_table_lines_sect.data, str8_array(task.out_line_table_lines[src_idx], task.out_line_table_counts[src_idx])); - - line_table_voff_cursor += task.out_line_table_counts[src_idx]; - line_table_line_cursor += task.out_line_table_counts[src_idx]; - - line_table_cursor += 1; - } else { - src->output_array_idx = 0; - } - } - } - - str8_list_push(arena->v[0], &line_tables_sect.data, str8_array(line_tables_rdi, line_table_cursor)); - - ProfEnd(); - - rdib_data_section_list_push(arena->v[0], sect_list, line_tables_sect); - rdib_data_section_list_push(arena->v[0], sect_list, line_table_voffs_sect); - rdib_data_section_list_push(arena->v[0], sect_list, line_table_lines_sect); - rdib_data_section_list_push(arena->v[0], sect_list, line_table_cols_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal -THREAD_POOL_TASK_FUNC(rdib_fill_src_files_task) -{ - RDIB_FillSourceFilesTask *task = raw_task; - - for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) { - RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_SourceFile *src = chunk->v + i; - U32 src_file_idx = rdib_idx_from_source_file(src); - RDI_SourceFile *dst = task->src_files_dst + src_file_idx; - - dst->file_path_node_idx = rdib_idx_from_path_tree(task->path_tree, src->file_path); - dst->normal_full_path_string_idx = rdib_idx_from_string_map(task->string_map, src->normal_full_path); - dst->source_line_map_idx = src->src_line_map_idx; - } - } -} - -internal void -rdib_data_sections_from_source_files(TP_Context *tp, - TP_Arena *arena, - RDIB_DataSectionList *sect_list, - RDIB_StringMap *string_map, - RDIB_PathTree *path_tree, - U64 total_src_file_count, - U64 src_file_chunk_count, - RDIB_SourceFileChunk **src_file_chunks) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(arena->v, arena->count); - - RDIB_FillSourceFilesTask task = {0}; - task.ranges = tp_divide_work(scratch.arena, src_file_chunk_count, tp->worker_count); - task.string_map = string_map; - task.path_tree = path_tree; - task.src_file_chunks = src_file_chunks; - task.src_files_dst = push_array_no_zero(arena->v[0], RDI_SourceFile, total_src_file_count); - tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_src_files_task, &task); - - RDIB_DataSection src_files_sect = { .tag = RDI_SectionKind_SourceFiles }; - str8_list_push(arena->v[0], &src_files_sect.data, str8_array(task.src_files_dst, total_src_file_count)); - rdib_data_section_list_push(arena->v[0], sect_list, src_files_sect); - - scratch_end(scratch); - ProfEnd(); -} - -internal void -rdib_data_sections_from_inline_sites(TP_Context *tp, - Arena *arena, - RDIB_DataSectionList *sect_list, - RDIB_StringMap *string_map, - U64 total_inline_site_count, - U64 inline_site_chunk_count, - RDIB_InlineSiteChunk **inline_site_chunks) -{ - ProfBeginFunction(); - - RDI_InlineSite *dst_arr = push_array(arena, RDI_InlineSite, total_inline_site_count); - - for (U64 chunk_idx = 0; chunk_idx < inline_site_chunk_count; ++chunk_idx) { - RDIB_InlineSiteChunk *chunk = inline_site_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - RDIB_InlineSite *src = &chunk->v[i]; - U64 idx = rdib_idx_from_inline_site(src); - RDI_InlineSite *dst = &dst_arr[idx]; - - dst->name_string_idx = rdib_idx_from_string_map(string_map, src->name); - dst->type_idx = rdib_idx_from_type(src->type); - dst->owner_type_idx = rdib_idx_from_type(src->owner); - dst->line_table_idx = src->line_table->output_array_idx; - } - } - - RDIB_DataSection inline_site_sect = { .tag = RDI_SectionKind_InlineSites }; - str8_list_push(arena, &inline_site_sect.data, str8_array(dst_arr, total_inline_site_count)); - rdib_data_section_list_push(arena, sect_list, inline_site_sect); - - ProfEnd(); -} - -internal void -rdib_data_sections_from_checksums(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list) -{ - NotImplemented; -} - -//////////////////////////////// - -internal RDIB_Input -rdib_init_input(Arena *arena) -{ - ProfBeginFunction(); - - RDIB_Input input = {0}; - input.unit_chunk_cap = 128; - input.src_file_chunk_cap = 4096; - input.symbol_chunk_cap = 4096; - input.line_table_cap = 4096; - input.inline_site_cap = 4096; - input.type_cap = 1024; - input.udt_cap = 4096; - - RDIB_SourceFile *null_src_file = rdib_source_file_chunk_list_push_zero(arena, &input.src_files, 1); - RDIB_LineTable *null_line_table = rdib_line_table_chunk_list_push_zero (arena, &input.line_tables, 1); - RDIB_LineTableFragment *null_frag = rdib_line_table_push (arena, null_line_table); - RDIB_Type *null_type = rdib_type_chunk_list_push_zero (arena, &input.types, 1); - RDIB_Scope *null_scope = rdib_scope_chunk_list_push_zero (arena, &input.scopes, 1); - RDIB_Unit *null_unit = rdib_unit_chunk_list_push_zero (arena, &input.units, 1); - RDIB_Procedure *null_proc = rdib_procedure_chunk_list_push_zero (arena, &input.procs, 1); - RDIB_Variable *null_local = rdib_variable_chunk_list_push_zero (arena, &input.locals, 1); - RDIB_Variable *null_gvar = rdib_variable_chunk_list_push_zero (arena, &input.gvars, 1); - RDIB_Variable *null_tvar = rdib_variable_chunk_list_push_zero (arena, &input.tvars, 1); - RDIB_UDTMember *null_udt_member = rdib_udt_member_chunk_list_push_zero (arena, &input.udt_members, 1); - RDIB_UDTMember *null_enum_member = rdib_udt_member_chunk_list_push_zero (arena, &input.enum_members, 1); - RDIB_InlineSite *null_inline_site = rdib_inline_site_chunk_list_push_zero(arena, &input.inline_sites, 1); - { - // Line Table Fragment - null_frag->src_file = null_src_file; - null_frag->voffs = push_array(arena, U64, 1); - - // Source File - null_src_file->line_table_frags = null_frag; - - // Unit - null_unit->arch = RDI_Arch_NULL; - null_unit->unit_name = str8_zero(); - null_unit->compiler_name = str8_zero(); - null_unit->source_file = str8_zero(); - null_unit->object_file = str8_zero(); - null_unit->archive_file = str8_zero(); - null_unit->build_path = str8_zero(); - null_unit->virt_range_count = 1; - null_unit->virt_ranges = push_array(arena, Rng1U64, 1); - null_unit->virt_ranges[0] = rng_1u64(0,0); - null_unit->line_table = null_line_table; - - // Scope - rng1u64_list_push(arena, &null_scope->ranges, rng_1u64(0,max_U32)); - - // Location - RDIB_Location null_loc = {0}; - rng1u64_list_push(arena, &null_loc.ranges, rng_1u64(0,0)); - RDIB_LocationList null_loc_list = {0}; - rdib_location_list_push(arena, &null_loc_list, null_loc); - - // Proc - null_proc->type = null_type; - null_proc->scope = null_scope; - - // Global Var - null_gvar->type = null_type; - null_gvar->locations = null_loc_list; - - // Thread Var - null_tvar->type = null_type; - null_tvar->locations = null_loc_list; - - // Local Var - null_local->type = null_type; - null_local->locations = null_loc_list; - - // Inline Site - null_inline_site->type = null_type; - null_inline_site->owner = 0; - null_inline_site->line_table = null_line_table; - } - - input.null_src_file = null_src_file; - input.null_line_table = null_line_table; - input.null_frag = null_frag; - input.null_type = null_type; - input.null_scope = null_scope; - input.null_unit = null_unit; - input.null_proc = null_proc; - input.null_local = null_local; - input.null_gvar = null_gvar; - input.null_tvar = null_tvar; - input.null_udt_member = null_udt_member; - input.null_enum_member = null_enum_member; - input.null_inline_site = null_inline_site; - - input.variadic_type = rdib_type_chunk_list_push(arena, &input.types, 1); - input.variadic_type->kind = RDI_TypeKind_Variadic; - - ProfEnd(); - return input; -} - -internal String8List -rdib_finish(TP_Context *tp, TP_Arena *arena, RDIB_Input *input) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(arena->v, arena->count); - - RDIB_UnitChunkList all_units = {0}; - RDIB_SourceFileChunkList all_src_files = {0}; - RDIB_LineTableChunkList all_line_tables = {0}; - RDIB_VariableChunkList all_locals = {0}; - RDIB_VariableChunkList all_tvars = {0}; - RDIB_VariableChunkList all_gvars = {0}; - RDIB_ProcedureChunkList all_procs = {0}; - RDIB_ScopeChunkList all_scopes = {0}; - RDIB_InlineSiteChunkList all_inline_sites = {0}; - RDIB_TypeChunkList all_types = {0}; - RDIB_TypeChunkList all_param_types = {0}; - RDIB_TypeChunkList all_udt_member_types = {0}; - RDIB_TypeChunkList all_enum_member_types = {0}; - RDIB_UDTMemberChunkList all_udt_members = {0}; - RDIB_UDTMemberChunkList all_enum_members = {0}; - - //U64 type_chunk_count = types.count; - //U64 struct_chunk_count = struct_list.count; - //U64 union_chunk_count = union_list.count; - //U64 enum_chunk_count = enum_list.count; - //U64 total_struct_count = rdib_type_chunk_list_total_count(struct_list); - //U64 total_union_count = rdib_type_chunk_list_total_count(union_list); - //U64 total_enum_count = rdib_type_chunk_list_total_count(enum_list); - //U64 extern_gvar_chunk_count = extern_gvars.count; - //U64 extern_tvar_chunk_count = extern_tvars.count; - //U64 extern_proc_chunk_count = extern_procs.count; - //U64 static_gvar_chunk_count = static_gvars.count; - //U64 static_tvar_chunk_count = static_tvars.count; - //U64 static_proc_chunk_count = static_procs.count; - //U64 total_extern_gvar_count = rdib_variable_chunk_list_total_count (extern_gvars); - //U64 total_extern_tvar_count = rdib_variable_chunk_list_total_count (extern_tvars); - //U64 total_extern_proc_count = rdib_procedure_chunk_list_total_count(extern_procs); - - ProfBegin("Concat Chunk Lists"); - rdib_unit_chunk_list_concat_in_place (&all_units, &input->units ); - rdib_source_file_chunk_list_concat_in_place(&all_src_files, &input->src_files ); - rdib_line_table_chunk_list_concat_in_place (&all_line_tables, &input->line_tables ); - rdib_scope_chunk_list_concat_in_place (&all_scopes, &input->scopes ); - rdib_variable_chunk_list_concat_in_place (&all_locals, &input->locals ); - rdib_variable_chunk_list_concat_in_place (&all_tvars, &input->tvars ); - rdib_variable_chunk_list_concat_in_place (&all_tvars, &input->extern_tvars ); - rdib_variable_chunk_list_concat_in_place (&all_tvars, &input->static_tvars ); - rdib_variable_chunk_list_concat_in_place (&all_gvars, &input->gvars ); - rdib_variable_chunk_list_concat_in_place (&all_gvars, &input->extern_gvars ); - rdib_variable_chunk_list_concat_in_place (&all_gvars, &input->static_gvars ); - rdib_procedure_chunk_list_concat_in_place (&all_procs, &input->procs ); - rdib_procedure_chunk_list_concat_in_place (&all_procs, &input->extern_procs ); - rdib_procedure_chunk_list_concat_in_place (&all_procs, &input->static_procs ); - rdib_inline_site_chunk_list_concat_in_place(&all_inline_sites, &input->inline_sites ); - rdib_type_chunk_list_concat_in_place (&all_types, &input->types ); - rdib_type_chunk_list_concat_in_place (&all_types, &input->struct_list ); - rdib_type_chunk_list_concat_in_place (&all_types, &input->union_list ); - rdib_type_chunk_list_concat_in_place (&all_types, &input->enum_list ); - rdib_type_chunk_list_concat_in_place (&all_param_types, &input->param_types ); - rdib_type_chunk_list_concat_in_place (&all_udt_member_types, &input->member_types ); - rdib_type_chunk_list_concat_in_place (&all_enum_member_types, &input->enum_types ); - rdib_udt_member_chunk_list_concat_in_place (&all_udt_members, &input->udt_members ); - rdib_udt_member_chunk_list_concat_in_place (&all_enum_members, &input->enum_members ); - ProfEnd(); - - ProfBegin("Chunk Lists -> Chunk Arrays"); - RDIB_UnitChunk **all_unit_chunks = rdib_array_from_unit_chunk_list (scratch.arena, all_units ); - RDIB_SourceFileChunk **all_src_file_chunks = rdib_array_from_source_file_chunk_list(scratch.arena, all_src_files ); - RDIB_LineTableChunk **all_line_table_chunks = rdib_array_from_line_table_chunk_list (scratch.arena, all_line_tables ); - RDIB_ScopeChunk **all_scope_chunks = rdib_array_from_scope_chunk_list (scratch.arena, all_scopes ); - RDIB_VariableChunk **all_local_chunks = rdib_array_from_variable_chunk_list (scratch.arena, all_locals ); - RDIB_VariableChunk **all_gvar_chunks = rdib_array_from_variable_chunk_list (scratch.arena, all_gvars ); - RDIB_VariableChunk **all_tvar_chunks = rdib_array_from_variable_chunk_list (scratch.arena, all_tvars ); - RDIB_ProcedureChunk **all_proc_chunks = rdib_array_from_procedure_chunk_list (scratch.arena, all_procs ); - RDIB_InlineSiteChunk **all_inline_site_chunks = rdib_array_from_inline_site_chunk_list(scratch.arena, all_inline_sites ); - RDIB_TypeChunk **all_type_chunks = rdib_array_from_type_chunk_list (scratch.arena, all_types ); - //RDIB_TypeChunk **all_param_type_chunks = rdib_array_from_type_chunk_list (scratch.arena, all_param_types ); - RDIB_TypeChunk **all_udt_member_type_chunks = rdib_array_from_type_chunk_list (scratch.arena, all_udt_member_types ); - RDIB_TypeChunk **all_enum_member_type_chunks = rdib_array_from_type_chunk_list (scratch.arena, all_enum_member_types); - RDIB_UDTMemberChunk **all_udt_member_chunks = rdib_array_from_udt_member_chunk_list (scratch.arena, all_udt_members ); - RDIB_UDTMemberChunk **all_enum_member_chunks = rdib_array_from_udt_member_chunk_list (scratch.arena, all_enum_members ); - ProfEnd(); - - ProfBegin("Count Symbols, Types, and etc."); - U64 total_unit_count = rdib_unit_chunk_list_total_count (all_units ); - U64 total_src_file_count = rdib_source_file_chunk_list_total_count(all_src_files ); - U64 total_line_table_count = rdib_line_table_chunk_list_total_count (all_line_tables ); - U64 total_scope_count = rdib_scope_chunk_list_total_count (all_scopes ); - U64 total_local_count = rdib_variable_chunk_list_total_count (all_locals ); - U64 total_inline_site_count = rdib_inline_site_chunk_list_total_count(all_inline_sites ); - U64 total_udt_member_count = rdib_udt_member_chunk_list_total_count (all_udt_members ); - U64 total_enum_member_count = rdib_udt_member_chunk_list_total_count (all_enum_members ); - U64 total_type_count = rdib_type_chunk_list_total_count (all_types ); - U64 total_param_type_count = rdib_type_chunk_list_total_count (all_param_types ); - //U64 total_udt_member_type_count = rdib_type_chunk_list_total_count (all_udt_member_types ); - //U64 total_enum_member_type_count = rdib_type_chunk_list_total_count (all_enum_member_types); - U64 total_tvar_count = rdib_variable_chunk_list_total_count (all_tvars ); - U64 total_gvar_count = rdib_variable_chunk_list_total_count (all_gvars ); - U64 total_proc_count = rdib_procedure_chunk_list_total_count (all_procs ); - ProfEnd(); - - // +1 to skip nulls - //RDIB_VariableChunk **extern_gvar_chunks = all_gvar_chunks + 1; - //RDIB_VariableChunk **extern_tvar_chunks = all_tvar_chunks + 1; - //RDIB_ProcedureChunk **extern_proc_chunks = all_proc_chunks + 1; - //RDIB_VariableChunk **static_gvar_chunks = extern_gvar_chunks + extern_gvar_chunk_count; - //RDIB_VariableChunk **static_tvar_chunks = extern_tvar_chunks + extern_tvar_chunk_count; - //RDIB_ProcedureChunk **static_proc_chunks = extern_proc_chunks + extern_proc_chunk_count; - //RDIB_TypeChunk **type_chunks = all_type_chunks + 1; - //RDIB_TypeChunk **struct_chunks = type_chunks + type_chunk_count; - //RDIB_TypeChunk **union_chunks = struct_chunks + struct_chunk_count; - //RDIB_TypeChunk **enum_chunks = union_chunks + union_chunk_count; - //RDIB_TypeChunk **udt_chunks = struct_chunks; - //U64 udt_chunk_count = struct_chunk_count + union_chunk_count + enum_chunk_count; - - ProfBegin("Assign Type Indices"); - U64 total_type_node_count = 1; - { - struct TypeNode { - struct TypeNode *next; - RDIB_Type *type; - }; - struct TypeNode *stack = 0; - struct TypeNode *free_nodes = 0; -#define push_node(t) do { \ -if (((RDIB_Type*)(t))->kind == RDI_TypeKindExt_VirtualTable) break; \ - struct TypeNode *n; \ - if (free_nodes == 0) { \ - n = push_array(scratch.arena, struct TypeNode, 1); \ - } else { \ - n = free_nodes; \ - SLLStackPop(free_nodes); \ - } \ - Assert(t); \ - n->type = t; \ - SLLStackPush(stack, n); \ -} while (0) - - for (U64 chunk_idx = 0; chunk_idx < all_types.count; ++chunk_idx) { - RDIB_TypeChunk *chunk = all_type_chunks[chunk_idx]; - for (U64 i = 0; i < chunk->count; ++i) { - push_node(&chunk->v[i]); - - for (struct TypeNode *cursor = stack; cursor != 0; cursor = cursor->next) { - if (cursor->type->kind == RDI_TypeKind_NULL){ - // no type refs - } else if (cursor->type->kind == RDI_TypeKind_Variadic) { - // no type refs - } else if (cursor->type->kind == RDI_TypeKind_Union) { - // no type refs - } else if (RDI_IsBuiltinType(cursor->type->kind)) { - // no type refs - } else if (cursor->type->kind == RDI_TypeKind_IncompleteStruct) { - // no type refs - } else if (cursor->type->kind == RDI_TypeKind_IncompleteUnion) { - // no type refs - } else if (cursor->type->kind == RDI_TypeKind_IncompleteClass) { - // no type refs - } else if (cursor->type->kind == RDI_TypeKind_IncompleteEnum) { - push_node(cursor->type->udt.enum_type.base_type); - } else if (cursor->type->kind == RDI_TypeKind_Modifier) { - push_node(cursor->type->modifier.type_ref); - } else if (RDI_IsPtrType(cursor->type->kind)) { - push_node(cursor->type->ptr.type_ref); - } else if (cursor->type->kind == RDI_TypeKind_Function) { - push_node(cursor->type->func.return_type); - push_node(cursor->type->func.params_type); - RDIB_Type *params = cursor->type->func.params_type; - for (U64 i = 0; i < params->params.count; ++i) { - push_node(params->params.types[i]); - } - } else if (cursor->type->kind == RDI_TypeKind_Method) { - push_node(cursor->type->method.class_type); - push_node(cursor->type->method.this_type); - push_node(cursor->type->method.return_type); - RDIB_Type *params = cursor->type->method.params_type; - for (U64 i = 0; i < params->params.count; ++i) { - push_node(params->params.types[i]); - } - } else if (cursor->type->kind == RDI_TypeKindExt_StaticMethod) { - push_node(cursor->type->static_method.class_type); - push_node(cursor->type->static_method.return_type); - RDIB_Type *params = cursor->type->static_method.params_type; - for (U64 i = 0; i < params->params.count; ++i) { - push_node(params->params.types[i]); - } - } else if (cursor->type->kind == RDI_TypeKind_Bitfield) { - push_node(cursor->type->bitfield.value_type); - } else if (cursor->type->kind == RDI_TypeKind_Array) { - push_node(cursor->type->array.entry_type); - } else if (cursor->type->kind == RDI_TypeKind_Struct || cursor->type->kind == RDI_TypeKind_Class) { - if (cursor->type->udt.struct_type.derived != 0) { - push_node(cursor->type->udt.struct_type.derived); - } - //push_node(cursor->type->udt.struct_type.vtshape); - } else if (cursor->type->kind == RDI_TypeKind_Enum) { - push_node(cursor->type->udt.enum_type.base_type); - } else if (cursor->type->kind > RDI_TypeKindExt_Lo) { - InvalidPath; - } else { - InvalidPath; - } - } - - for (struct TypeNode *cursor = stack; cursor != 0; cursor = cursor->next) { - // was this type visisted? - if (cursor->type != input->null_type && cursor->type->final_idx == 0) { - cursor->type->final_idx = total_type_node_count; - ++total_type_node_count; - } - } - - free_nodes = stack; - stack = 0; - } - } -#undef push_node - } - ProfEnd(); - - ProfBegin("Type Stats"); - RDIB_TypeStats type_stats = {0}; - { - type_stats.udt_counts = push_array(scratch.arena, U64, all_types.count); - RDIB_TypeStatsTask task = { .chunks = all_type_chunks, .type_stats = &type_stats }; - tp_for_parallel(tp, 0, all_types.count, rdib_type_stats_task, &task); - } - ProfEnd(); - - RDIB_PathTree *path_tree = rdib_build_path_tree(arena->v[0], - tp->worker_count, - input->null_src_file, - all_units.count, - all_unit_chunks, - all_src_files.count, - all_src_file_chunks); - - // loop over structs and build a map with every possible string - ProfBegin("String Map"); - RDIB_StringMap *string_map; - { - U64 top_level_string_count = 2; - U64 sect_string_count = 1; - U64 src_file_string_count = 1; - U64 unit_string_count = 6; - U64 variable_string_count = 2; - U64 procedure_string_count = 2; - U64 scope_string_count = 0; - U64 inline_site_string_count = 0; - U64 member_string_count = 2; - U64 type_string_count = 3; - U64 path_tree_node_count = 1; - - U64 total_string_count = 1 /* :string_map_null */ + - 1 * top_level_string_count + - input->sect_count * sect_string_count + - total_src_file_count * src_file_string_count + - total_unit_count * unit_string_count + - total_local_count * variable_string_count + - total_gvar_count * variable_string_count + - total_tvar_count * variable_string_count + - total_proc_count * procedure_string_count + - total_inline_site_count * inline_site_string_count + - total_udt_member_count * member_string_count + - total_enum_member_count * member_string_count + - total_type_count * type_string_count + - path_tree->node_count * path_tree_node_count + - total_scope_count * scope_string_count; - - string_map = rdib_init_string_map(arena->v[0], total_string_count); - - RDIB_CollectStringsTask task = {0}; - task.string_map = string_map; - task.string_map_update_func = rdib_string_map_update_null; - task.free_buckets = push_array(scratch.arena, RDIB_StringMapBucket *, tp->worker_count); - task.element_indices = push_array(scratch.arena, U64, tp->worker_count); - - // :string_map_null - rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, str8_lit("")); - - // top level info - rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, input->top_level_info.exe_name); - rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, input->top_level_info.producer_string); - - ProfBegin("Sections"); - task.ranges = tp_divide_work(scratch.arena, input->sect_count, tp->worker_count); - task.sects = input->sections; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_sects_task, &task); - ProfEnd(); - - ProfBegin("Units"); - task.ranges = tp_divide_work(scratch.arena, all_units.count, tp->worker_count); - task.units = all_unit_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_units_task, &task); - ProfEnd(); - - ProfBegin("Source Files"); - task.ranges = tp_divide_work(scratch.arena, all_src_files.count, tp->worker_count); - task.src_file_chunks = all_src_file_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_source_files_task, &task); - ProfEnd(); - - ProfBegin("Locals"); - task.ranges = tp_divide_work(scratch.arena, all_locals.count, tp->worker_count); - task.vars = all_local_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task); - ProfEnd(); - - ProfBegin("Global Variables"); - task.ranges = tp_divide_work(scratch.arena, all_gvars.count, tp->worker_count); - task.vars = all_gvar_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task); - ProfEnd(); - - ProfBegin("Thread Variables"); - task.ranges = tp_divide_work(scratch.arena, all_tvars.count, tp->worker_count); - task.vars = all_tvar_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task); - ProfEnd(); - - ProfBegin("Procedures"); - task.ranges = tp_divide_work(scratch.arena, all_procs.count, tp->worker_count); - task.procs = all_proc_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_procs_task, &task); - ProfEnd(); - - ProfBegin("Inline Sites"); - task.ranges = tp_divide_work(scratch.arena, all_inline_sites.count, tp->worker_count); - task.inline_sites = all_inline_site_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_inline_sites_task, &task); - ProfEnd(); - - ProfBegin("UDT Members"); - task.ranges = tp_divide_work(scratch.arena, all_udt_members.count, tp->worker_count); - task.udt_members = all_udt_member_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_udt_members_task, &task); - ProfEnd(); - - ProfBegin("Enum Members"); - task.ranges = tp_divide_work(scratch.arena, all_enum_members.count, tp->worker_count); - task.udt_members = all_enum_member_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_enum_members_task, &task); - ProfEnd(); - - ProfBegin("Types"); - task.ranges = tp_divide_work(scratch.arena, all_types.count, tp->worker_count); - task.types = all_type_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_types_task, &task); - ProfEnd(); - - ProfBegin("Path Tree"); - task.ranges = tp_divide_work(scratch.arena, path_tree->list_count, tp->worker_count); - task.path_node_lists = path_tree->node_lists; - tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_path_nodes_task, &task); - ProfEnd(); - } - ProfEnd(); - - ProfBegin("Name Maps"); - RDIB_StringMap *name_maps[RDI_NameMapKind_COUNT] = {0}; - { - name_maps[RDI_NameMapKind_NULL ] = rdib_init_string_map(scratch.arena, 1 ); - name_maps[RDI_NameMapKind_GlobalVariables ] = rdib_init_string_map(scratch.arena, total_gvar_count ); - name_maps[RDI_NameMapKind_ThreadVariables ] = rdib_init_string_map(scratch.arena, total_tvar_count ); - name_maps[RDI_NameMapKind_Procedures ] = rdib_init_string_map(scratch.arena, total_proc_count ); - name_maps[RDI_NameMapKind_Types ] = rdib_init_string_map(scratch.arena, total_type_count ); - name_maps[RDI_NameMapKind_LinkNameProcedures] = rdib_init_string_map(scratch.arena, total_proc_count ); - name_maps[RDI_NameMapKind_NormalSourcePaths ] = rdib_init_string_map(scratch.arena, total_src_file_count); - - RDIB_CollectStringsTask task = {0}; - task.string_map = 0; - task.string_map_update_func = rdib_string_map_update_concat_void_list_atomic; - task.free_buckets = push_array(scratch.arena, RDIB_StringMapBucket *, tp->worker_count); - task.element_indices = push_array(scratch.arena, U64, tp->worker_count); - - ProfBegin("Global Variables"); - task.string_map = name_maps[RDI_NameMapKind_GlobalVariables]; - task.ranges = tp_divide_work(scratch.arena, all_gvars.count, tp->worker_count); - task.vars = all_gvar_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_var_task, &task); - ProfEnd(); - - ProfBegin("Thread Variables"); - task.string_map = name_maps[RDI_NameMapKind_ThreadVariables]; - task.ranges = tp_divide_work(scratch.arena, all_tvars.count, tp->worker_count); - task.vars = all_tvar_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_var_task, &task); - ProfEnd(); - - ProfBegin("Procedure Names"); - task.string_map = name_maps[RDI_NameMapKind_Procedures]; - task.ranges = tp_divide_work(scratch.arena, all_procs.count, tp->worker_count); - task.procs = all_proc_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_procedure_task, &task); - ProfEnd(); - - ProfBegin("Types"); - task.string_map = name_maps[RDI_NameMapKind_Types]; - task.ranges = tp_divide_work(scratch.arena, all_types.count, tp->worker_count); - task.types = all_type_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_types_task, &task); - ProfEnd(); - - ProfBegin("Normal Source Paths"); - task.string_map = name_maps[RDI_NameMapKind_NormalSourcePaths]; - task.ranges = tp_divide_work(scratch.arena, all_src_files.count, tp->worker_count); - task.src_file_chunks = all_src_file_chunks; - tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_normal_paths_task, &task); - ProfEnd(); - } - ProfEnd(); - - ProfBeginDynamic("Extract String Table Buckets [Cap: %llu]", string_map->cap); - U64 string_map_bucket_count; - RDIB_StringMapBucket **string_map_buckets = rdib_extant_buckets_from_string_map(tp, scratch.arena, string_map, &string_map_bucket_count); - rdib_string_map_sort_buckets(tp, string_map_buckets, string_map_bucket_count, tp->worker_count); - rdib_string_map_assign_indices(string_map_buckets, string_map_bucket_count); - ProfEnd(); - - ProfBegin("Extract Name Maps Buckets"); - RDIB_StringMapBucket **name_map_buckets[RDI_NameMapKind_COUNT]; - U64 name_map_bucket_counts[RDI_NameMapKind_COUNT]; - for (U64 i = 0; i < ArrayCount(name_map_buckets); ++i) { - ProfBeginDynamic("Name Map: %.*s", str8_varg(rdi_string_from_name_map_kind(i))); - name_map_buckets[i] = rdib_extant_buckets_from_string_map(tp, scratch.arena, name_maps[i], &name_map_bucket_counts[i]); - rdib_string_map_sort_buckets(tp, name_map_buckets[i], name_map_bucket_counts[i], tp->worker_count); - rdib_string_map_assign_indices(name_map_buckets[i], name_map_bucket_counts[i]); - ProfEnd(); - } - ProfEnd(); - - ProfBegin("Index Run Map"); - RDIB_IndexRunMap *idx_run_map; - RDIB_IndexRunBucket **idx_run_buckets; - U64 idx_run_bucket_count; - { - // TODO: we over-allocate for name map index runs since not every bucket has > 1 value - U64 total_name_map_value_count = 0; - for (U64 i = 0; i < ArrayCount(name_map_bucket_counts); ++i) { - total_name_map_value_count += name_map_bucket_counts[i]; - } - - // rough bucket estimate - U64 idx_run_cap = (total_param_type_count + total_name_map_value_count) * 2; - idx_run_map = rdib_init_index_run_map(arena->v[0], idx_run_cap); - - // setup task context - RDIB_BuildIndexRunsTask task = {0}; - task.idx_run_map = idx_run_map; - task.free_buckets = push_array(scratch.arena, RDIB_IndexRunBucket *, tp->worker_count); - - ProfBegin("Type Params Pass"); - task.type_chunks = all_type_chunks; - tp_for_parallel(tp, arena, all_types.count, rdib_build_idx_runs_params_task, &task); - task.sorter_idx += 1; - ProfEnd(); - - ProfBegin("Name Maps Pass - Build Index Runs"); - for (U64 name_map_kind = 0; name_map_kind < ArrayCount(name_maps); ++name_map_kind) { - ProfBeginDynamic("Name Map: %.*s", str8_varg(rdi_string_from_name_map_kind(name_map_kind))); - task.name_map_kind = name_map_kind; - task.ranges = tp_divide_work(scratch.arena, name_map_bucket_counts[name_map_kind], tp->worker_count); - task.name_map_buckets = name_map_buckets[name_map_kind]; - tp_for_parallel(tp, arena, tp->worker_count, rdib_build_idx_runs_name_map_buckets_task, &task); - task.sorter_idx += 1; - ProfEnd(); - } - ProfEnd(); - - idx_run_buckets = rdib_extant_buckets_from_index_run_map(tp, arena->v[0], idx_run_map, &idx_run_bucket_count); - rdib_index_run_map_sort_buckets(tp, idx_run_buckets, idx_run_bucket_count, task.sorter_idx); - rdib_index_run_map_assign_indices(idx_run_buckets, idx_run_bucket_count); - } - ProfEnd(); - - ProfBegin("Serialize Data Sections"); - RDIB_DataSectionList sections = {0}; - rdib_data_sections_from_top_level_info(arena->v[0], §ions, string_map, &input->top_level_info); - rdib_data_sections_from_binary_sections(arena->v[0], §ions, string_map, input->sections, input->sect_count); - rdib_data_sections_from_path_tree(tp, arena->v[0], §ions, string_map, path_tree); - rdib_data_sections_from_string_map(tp, arena->v[0], §ions, string_map_buckets, string_map_bucket_count); - rdib_data_sections_from_index_runs(tp, arena->v[0], §ions, idx_run_buckets, idx_run_bucket_count); - rdib_data_sections_from_name_maps(tp, arena, §ions, string_map, idx_run_map, name_map_buckets, name_map_bucket_counts); - rdib_data_sections_from_types(tp, arena->v[0], §ions, input->top_level_info.arch, string_map, idx_run_map, all_udt_member_types.count, all_udt_member_type_chunks, all_enum_member_types.count, all_enum_member_type_chunks, total_type_node_count, all_types.count, all_type_chunks, type_stats); - rdib_data_sections_from_line_tables(tp, arena, §ions, total_line_table_count, all_line_tables.count, all_line_table_chunks); - rdib_data_sections_from_source_line_maps(tp, arena, §ions, total_src_file_count, all_src_files.count, all_src_file_chunks); - rdib_data_sections_from_source_files(tp, arena, §ions, string_map, path_tree, total_src_file_count, all_src_files.count, all_src_file_chunks); - rdib_data_sections_from_units(arena->v[0], §ions, string_map, path_tree, total_unit_count, all_units.count, all_unit_chunks); - rdib_data_sections_from_global_variables(tp, arena, §ions, string_map, total_gvar_count, all_gvars.count, all_gvar_chunks); - rdib_data_sections_from_thread_variables(tp, arena, §ions, string_map, total_tvar_count, all_tvars.count, all_tvar_chunks); - rdib_data_sections_from_procedures(tp, arena, §ions, string_map, total_proc_count, all_procs.count, all_proc_chunks); - rdib_data_sections_from_scopes(tp, arena, §ions, string_map, total_scope_count, all_scopes.count, all_scope_chunks); - rdib_data_sections_from_unit_gvar_scope_vmaps(tp, arena, §ions, all_units.count, all_unit_chunks, all_gvars.count, all_gvar_chunks, all_scopes.count, all_scope_chunks); - rdib_data_sections_from_inline_sites(tp, arena->v[0], §ions, string_map, total_inline_site_count, all_inline_sites.count, all_inline_site_chunks); - //rdib_data_sections_from_checksums(tp, arena->v[0], §ions); - ProfEnd(); - - ProfBegin("Make RDI header and sections"); - String8List rdi_data = {0}; - { - // concat section datas - String8List raw_section_datas[RDI_SectionKind_COUNT] = {0}; - for (RDIB_DataSectionNode *n = sections.first; n != 0; n = n->next) { - str8_list_concat_in_place(&raw_section_datas[n->v.tag], &n->v.data); - } - - RDI_Header *rdi_header = push_array(arena->v[0], RDI_Header, 1); - RDI_Section *rdi_sections = push_array(arena->v[0], RDI_Section, RDI_SectionKind_COUNT); - - rdi_header->magic = RDI_MAGIC_CONSTANT; - rdi_header->encoding_version = RDI_ENCODING_VERSION; - rdi_header->data_section_off = sizeof(*rdi_header); - rdi_header->data_section_count = RDI_SectionKind_COUNT; - - str8_list_push(arena->v[0], &rdi_data, str8_struct(rdi_header)); - str8_list_push(arena->v[0], &rdi_data, str8_array(rdi_sections, RDI_SectionKind_COUNT)); - - for (U64 sect_idx = 0; sect_idx < RDI_SectionKind_COUNT; ++sect_idx) { - RDI_Section *dst = &rdi_sections[sect_idx]; - dst->encoding = RDI_SectionEncoding_Unpacked; - dst->pad = 0; - dst->off = 0; - dst->encoded_size = 0; - dst->unpacked_size = 0; - - if (raw_section_datas[sect_idx].total_size > 0) { - str8_list_push_aligner(arena->v[0], &rdi_data, 0, 8); - - dst->off = rdi_data.total_size; - dst->encoded_size = raw_section_datas[sect_idx].total_size; - dst->unpacked_size = raw_section_datas[sect_idx].total_size; - - str8_list_concat_in_place(&rdi_data, &raw_section_datas[sect_idx]); - -#if BUILD_DEBUG - { - U64 expected_total_size = 0; - for (String8Node *n = rdi_data.first; n != 0; n = n->next) { - expected_total_size += n->string.size; - } - Assert(expected_total_size == rdi_data.total_size); - } -#endif - } - } - } - ProfEnd(); - - scratch_end(scratch); - ProfEnd(); - return rdi_data; -} - diff --git a/src/linker/rdi/rdi_builder.h b/src/linker/rdi/rdi_builder.h deleted file mode 100644 index 09532d49..00000000 --- a/src/linker/rdi/rdi_builder.h +++ /dev/null @@ -1,1231 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma once - -StaticAssert(sizeof(RDI_Header) == AlignPow2(sizeof(RDI_Header), 8), g_rdi_header_align_check); - -//////////////////////////////// -// TODO: move to rdi_format.h - -#define RDI_IsCompleteUserDefinedTypeKind(x) ((x) == RDI_TypeKind_Class || (x) == RDI_TypeKind_Struct || (x) == RDI_TypeKind_Union || (x) == RDI_TypeKind_Enum) -#define RDI_IsIncompleteUsedDefinedTypeKind(x) (RDI_TypeKind_FirstIncomplete <= (x) && (x) <= RDI_TypeKind_LastIncomplete) -#define RDI_IsUserDefinedType(x) (RDI_IsCompleteUserDefinedTypeKind(x) || RDI_IsIncompleteUsedDefinedTypeKind(x)) -#define RDI_IsBuiltinType(x) (RDI_TypeKind_FirstBuiltIn <= (x) && (x) <= RDI_TypeKind_LastBuiltIn) -#define RDI_IsPtrType(x) ((x) == RDI_TypeKind_Ptr || (x) == RDI_TypeKind_LRef || (x) == RDI_TypeKind_RRef) - -//////////////////////////////// - -typedef enum -{ - RDIB_DataModel_Null, - RDIB_DataModel_ILP32, - RDIB_DataModel_LLP64, - RDIB_DataModel_LP64, - RDIB_DataModel_ILP64, - RDIB_DataModel_SILP64 -} RDIB_DataModel; - -//////////////////////////////// - -typedef void * RDIB_TypeRef; - -typedef struct RDIB_EvalBytecodeOp -{ - struct RDIB_EvalBytecodeOp *next; - RDI_EvalOp op; - U64 p_size; - U64 p; -} RDIB_EvalBytecodeOp; - -typedef struct RDIB_EvalBytecode -{ - U64 count; - U64 size; - RDIB_EvalBytecodeOp *first; - RDIB_EvalBytecodeOp *last; -} RDIB_EvalBytecode; - -typedef struct RDIB_Location -{ - RDI_LocationKind kind; - Rng1U64List ranges; - union { - struct { - RDI_RegCode reg_code; - U64 offset; - }; - RDIB_EvalBytecode bytecode; - }; - - // used by RDI builder - U64 data_offset; -} RDIB_Location; - -typedef struct RDIB_LocationNode -{ - struct RDIB_LocationNode *next; - RDIB_Location v; -} RDIB_LocationNode; - -typedef struct RDIB_LocationList -{ - U64 count; - RDIB_LocationNode *first; - RDIB_LocationNode *last; -} RDIB_LocationList; - - -typedef struct RDIB_Variable -{ - String8 name; - String8 link_name; - struct RDIB_Type *type; - struct RDIB_Type *container_type; - struct RDIB_Procedure *container_proc; - RDIB_LocationList locations; - struct RDIB_VariableChunk *chunk; - struct RDIB_Variable *next; -} RDIB_Variable; - -typedef struct RDIB_VariableNode -{ - struct RDIB_VariableNode *next; - RDIB_Variable v; -} RDIB_VariableNode; - -typedef struct RDIB_VariableList -{ - U64 count; - RDIB_VariableNode *first; - RDIB_VariableNode *last; -} RDIB_VariableList; - -//////////////////////////////// - -typedef struct -{ - RDI_Arch arch; - U64 exe_hash; - U64 voff_max; - String8 exe_name; - String8 producer_string; -} RDIB_TopLevelInfo; - -typedef struct -{ - String8 name; - RDI_BinarySectionFlags flags; - U64 voff_first; - U64 voff_opl; - U64 foff_first; - U64 foff_opl; -} RDIB_BinarySection; - -typedef struct RDIB_LineTableFragment -{ - struct RDIB_SourceFile *src_file; - PairU32 ln_voff; - U64 *voffs; - U32 *line_nums; - U16 *col_nums; - U64 line_count; - U64 col_count; - struct RDIB_LineTableFragment *next_src_file; - struct RDIB_LineTableFragment *next_line_table; - struct RDIB_LineTableFragmentChunk *chunk; -} RDIB_LineTableFragment; - -typedef struct RDIB_LineTableFragmentChunk -{ - struct RDIB_LineTableFragmentChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_LineTableFragment *v; -} RDIB_LineTableFragmentChunk; - -typedef struct RDIB_LineTableFragmentChunkList -{ - U64 count; - RDIB_LineTableFragmentChunk *first; - RDIB_LineTableFragmentChunk *last; -} RDIB_LineTableFragmentChunkList; - -typedef struct RDIB_LineTable -{ - struct RDIB_LineTableChunk *chunk; - U64 count; - RDIB_LineTableFragment *first; - RDIB_LineTableFragment *last; - U32 output_array_idx; -} RDIB_LineTable; - -typedef struct RDIB_LineTableChunk -{ - struct RDIB_LineTableChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_LineTable *v; -} RDIB_LineTableChunk; - -typedef struct RDIB_LineTableChunkList -{ - U64 count; - RDIB_LineTableChunk *first; - RDIB_LineTableChunk *last; -} RDIB_LineTableChunkList; - -typedef struct RDIB_SourceFile -{ - String8 file_path; - String8 normal_full_path; - RDI_ChecksumKind checksum_kind; - String8 checksum; - RDIB_LineTableFragment *line_table_frags; - - U64 src_line_map_idx; - U64 line_table_idx; - - struct RDIB_SourceFileChunk *chunk; -} RDIB_SourceFile; - -typedef struct RDIB_SourceFileChunk -{ - struct RDIB_SourceFileChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_SourceFile *v; -} RDIB_SourceFileChunk; - -typedef struct RDIB_SourceFileChunkList -{ - U64 count; - RDIB_SourceFileChunk *first; - RDIB_SourceFileChunk *last; -} RDIB_SourceFileChunkList; - -typedef struct RDIB_Procedure -{ - String8 name; - String8 link_name; - struct RDIB_Type *type; - struct RDIB_Type *container_type; - struct RDIB_Procedure *container_proc; - - struct RDIB_Scope *scope; - struct RDIB_ScopeNode *scope_first; - struct RDIB_ScopeNode *scope_last; - - U64 scope_count; - struct RDIB_ProcedureChunk *chunk; -} RDIB_Procedure; - -typedef struct RDIB_Scope -{ - struct RDIB_Scope *parent; - struct RDIB_Scope *first_child; - struct RDIB_Scope *last_child; - struct RDIB_Scope *next_sibling; - struct RDIB_Procedure *container_proc; - Rng1U64List ranges; - RDIB_Variable *local_first; - RDIB_Variable *local_last; - U64 local_count; - struct RDIB_InlineSite *inline_site; - - // used by RDI builder - U64 local_first_idx; - - struct RDIB_ScopeChunk *chunk; -} RDIB_Scope; - -typedef struct RDIB_InlineSite -{ - String8 name; - struct RDIB_Type *type; - struct RDIB_Type *owner; - struct RDIB_InlineSiteChunk *chunk; - union { - struct RDIB_LineTable *line_table; - struct { - void *ud0; - U64 ud1; - U64 ud2; - } convert_ref; - }; -} RDIB_InlineSite; - -typedef RDI_MemberKind RDI_MemberKindExt; -enum -{ - RDI_MemberKind_COUNT = RDI_MemberKind_NestedType, - RDI_MemberKindExt_MemberListPointer // NOTE: must always be last in the list! -}; - -typedef struct RDIB_UDTMember -{ - RDI_MemberKindExt kind; - union { - struct { - String8 name; - U64 offset; - RDIB_TypeRef type_ref; - } data_field; - struct { - String8 name; - RDIB_TypeRef type_ref; - } static_data; - RDIB_TypeRef member_list_pointer; - struct { - RDI_MemberKind kind; - String8 name; - RDIB_TypeRef type_ref; - U64 vftable_offset; - } method; - struct { - String8 name; - RDIB_TypeRef type_ref; - } nested_type; - struct { - RDIB_TypeRef type_ref; - U64 offset; - } base_class; - struct { - RDIB_TypeRef type_ref; - U64 vbptr_off; - U64 vtable_off; - } virtual_base_class; - struct { - String8 name; - U64 value; - } enumerate; - }; - struct RDIB_UDTMember *next; - struct RDIB_UDTMemberChunk *chunk; -} RDIB_UDTMember; - -typedef struct RDIB_UDTMemberList -{ - U64 count; - RDIB_UDTMember *first; - RDIB_UDTMember *last; -} RDIB_UDTMemberList; - -typedef struct RDIB_UDT -{ - struct RDIB_Type *self_type; - struct RDIB_Type *members; - RDIB_SourceFile *decl_src_file; - U32 decl_line_num; - U32 decl_col_num; -} RDIB_UDT; - -enum -{ - RDI_TypeKindExt_Lo = RDI_TypeKind_COUNT, - RDI_TypeKindExt_VirtualTable, - RDI_TypeKindExt_StaticMethod, - RDI_TypeKindExt_Members, - RDI_TypeKindExt_Params, - RDI_TypeKindExt_Count, -}; -typedef RDI_TypeKind RDI_TypeKindExt; - -typedef struct RDIB_Type -{ - RDI_TypeKindExt kind; - U64 final_idx; - U64 itype; - union { - struct { - String8 name; - U64 size; - } builtin; - struct { - RDI_TypeModifierFlags flags; - RDIB_TypeRef type_ref; - } modifier; - struct { - RDIB_TypeRef type_ref; - U64 size; - } ptr; - struct { - RDIB_TypeRef return_type; - RDIB_TypeRef params_type; - - U64 param_idx_run_bucket_idx; - } func; - struct { - RDIB_TypeRef class_type; - RDIB_TypeRef this_type; - RDIB_TypeRef return_type; - RDIB_TypeRef params_type; - - U64 param_idx_run_bucket_idx; - } method; - struct { - RDIB_TypeRef class_type; - RDIB_TypeRef return_type; - RDIB_TypeRef params_type; - - U64 param_idx_run_bucket_idx; - } static_method; - struct { - U64 off; - U64 count; - RDIB_TypeRef value_type; - } bitfield; - struct { - RDIB_TypeRef entry_type; - U64 size; - } array; - struct { - String8 name; - String8 link_name; - RDIB_TypeRef members; - // assigned in UDT build step - U64 udt_idx; - union { - struct { - U64 size; - RDIB_TypeRef derived; - RDIB_TypeRef vtshape; - } struct_type; - struct { - U64 size; - } union_type; - struct { - String8 name; - RDIB_TypeRef base_type; - } enum_type; - }; - } udt; - struct { - U64 count; - RDIB_TypeRef *types; - } params; - struct { - RDIB_UDTMemberList list; - - // assigned in member build step - B32 is_head; - U64 first_member_idx; - } members, enum_members; - }; - struct RDIB_TypeChunk *chunk; -} RDIB_Type; - -typedef struct RDIB_Unit -{ - RDI_Arch arch; - String8 unit_name; - String8 compiler_name; - String8 source_file; - String8 object_file; - String8 archive_file; - String8 build_path; - RDI_Language language; - RDIB_LineTable *line_table; - U64 virt_range_count; - Rng1U64 *virt_ranges; - - struct RDIB_UnitChunk *chunk; -} RDIB_Unit; - -typedef struct RDIB_DataSection -{ - RDI_SectionKind tag; - String8List data; -} RDIB_DataSection; - -typedef struct RDIB_DataSectionNode -{ - struct RDIB_DataSectionNode *next; - RDIB_DataSection v; -} RDIB_DataSectionNode; - -typedef struct RDIB_DataSectionList -{ - U64 count; - RDIB_DataSectionNode *first; - RDIB_DataSectionNode *last; -} RDIB_DataSectionList; - - -typedef struct RDIB_UnitChunk -{ - U64 base; - U64 count; - U64 cap; - RDIB_Unit *v; - struct RDIB_UnitChunk *next; -} RDIB_UnitChunk; - -typedef struct RDIB_UnitChunkList -{ - U64 count; - RDIB_UnitChunk *first; - RDIB_UnitChunk *last; -} RDIB_UnitChunkList; - -typedef struct RDIB_VariableChunk -{ - struct RDIB_VariableChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_Variable *v; -} RDIB_VariableChunk; - -typedef struct RDIB_VariableChunkList -{ - U64 count; - RDIB_VariableChunk *first; - RDIB_VariableChunk *last; -} RDIB_VariableChunkList; - -typedef struct RDIB_ProcedureChunk -{ - struct RDIB_ProcedureChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_Procedure *v; -} RDIB_ProcedureChunk; - -typedef struct RDIB_ProcedureChunkList -{ - U64 count; - RDIB_ProcedureChunk *first; - RDIB_ProcedureChunk *last; -} RDIB_ProcedureChunkList; - -typedef struct RDIB_ScopeChunk -{ - struct RDIB_ScopeChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_Scope *v; -} RDIB_ScopeChunk; - -typedef struct RDIB_ScopeChunkList -{ - U64 count; - RDIB_ScopeChunk *first; - RDIB_ScopeChunk *last; -} RDIB_ScopeChunkList; - -typedef struct RDIB_ScopeNode -{ - struct RDIB_ScopeNode *next; - RDIB_Scope *v; -} RDIB_ScopeNode; - -typedef struct RDIB_ScopeList -{ - U64 count; - RDIB_Scope *first; - RDIB_Scope *last; -} RDIB_ScopeList; - -typedef struct RDIB_InlineSiteChunk -{ - struct RDIB_InlineSiteChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_InlineSite *v; -} RDIB_InlineSiteChunk; - -typedef struct RDIB_InlineSiteChunkList -{ - U64 count; - RDIB_InlineSiteChunk *first; - RDIB_InlineSiteChunk *last; -} RDIB_InlineSiteChunkList; - -typedef struct RDIB_TypeChunk -{ - struct RDIB_TypeChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_Type *v; -} RDIB_TypeChunk; - -typedef struct -{ - U64 count; - RDIB_TypeChunk *first; - RDIB_TypeChunk *last; -} RDIB_TypeChunkList; - -typedef struct RDIB_UDTMemberChunk -{ - struct RDIB_UDTMemberChunk *next; - U64 base; - U64 count; - U64 cap; - RDIB_UDTMember *v; -} RDIB_UDTMemberChunk; - -typedef struct RDIB_UDTMemberChunkList -{ - U64 count; - RDIB_UDTMemberChunk *first; - RDIB_UDTMemberChunk *last; -} RDIB_UDTMemberChunkList; - -//////////////////////////////// -// UDT Forward Ref Map - -typedef struct -{ - struct RDIB_Type *type; - U64 idx; -} RDIB_UDTFwdrefBucket; - -//////////////////////////////// -// String Map - -typedef struct RDIB_StringMapBucket -{ - String8 string; - - union { - // to get deterministic output we assign each bucket a unique index - union { - struct { - U32 lo; - U32 hi; - }; - U64 v; - } sorter; - - // after buckets are sorted we replace 'sorter' with indices into output array - U64 idx; - }; - - union { - // depending on the usage context sotres: pointers to variables, procedures, and etc. - VoidNode *raw_values; - - // during index-run-map build step 'raw_values' are replaced with index-run bucket index - struct { - U32 count; - // if we have single index - store it in the bucket - union { - U64 idx_run_bucket_idx; - U32 match_idx; - }; - }; - }; -} RDIB_StringMapBucket; - -typedef struct RDIB_StringMap -{ - U64 cap; - RDIB_StringMapBucket **buckets; -} RDIB_StringMap; - -#define RDIB_STRING_MAP_UPDATE_FUNC(name) void name(VoidNode **head, VoidNode *node) -typedef RDIB_STRING_MAP_UPDATE_FUNC(RDIB_StringMapUpdateFunc); - -typedef struct -{ - RDIB_StringMap *string_map; - Rng1U64 *ranges; - U64 *counts; - U64 *offsets; - RDIB_StringMapBucket **result; -} RDIB_GetExtantBucketsStringMapTask; - -typedef struct -{ - U32 *string_table; - U64 string_data_size; - U8 *string_data; - RDIB_StringMapBucket **buckets; - Rng1U64 *ranges; -} RDIB_CopyStringDataTask; - -typedef struct -{ - U64 chunk_idx_opl; - Rng1U64 *ranges; - RDIB_StringMapBucket **src; - RDIB_StringMapBucket **dst; - U32 *chunk_histo; - U32 *chunk_offsets; -} RDIB_StringMapRadixSort; - -//////////////////////////////// -// Index Run Map - -typedef struct RDIB_IndexRunBucket -{ - union { - struct { - U32 lo; - U32 hi; - }; - U64 v; - } sorter; - U32Array indices; - U64 index_in_output_array; -} RDIB_IndexRunBucket; - -typedef struct RDIB_IndexRunMap -{ - U64 cap; - RDIB_IndexRunBucket **buckets; -} RDIB_IndexRunMap; - -//////////////////////////////// - -typedef struct -{ - U64 voff; - U32 size; - U32 idx; -} RDIB_VMapRange; - -//////////////////////////////// - -#define RDIB_PATH_TREE_NIL_STRING str8_lit("") - -typedef struct RDIB_PathTreeNode -{ - struct RDIB_PathTreeNode *parent; - struct RDIB_PathTreeNode *next_order; - struct RDIB_PathTreeNode *next_sibling; - struct RDIB_PathTreeNode *first_child; - struct RDIB_PathTreeNode *last_child; - U64 node_idx; - String8 sub_path; - RDIB_SourceFile *src_file; -} RDIB_PathTreeNode; - -typedef struct RDIB_PathTreeNodeList -{ - U64 count; - RDIB_PathTreeNode *first; - RDIB_PathTreeNode *last; -} RDIB_PathTreeNodeList; - -typedef struct RDIB_PathTree -{ - RDIB_PathTreeNode *root; - U64 node_count; - U64 next_list_idx; - U64 list_count; - RDIB_PathTreeNodeList *node_lists; -} RDIB_PathTree; - -//////////////////////////////// - -typedef struct RDIB_Input -{ - U64 unit_chunk_cap; - U64 src_file_chunk_cap; - U64 symbol_chunk_cap; - U64 line_table_cap; - U64 inline_site_cap; - U64 type_cap; - U64 udt_cap; - - RDIB_TopLevelInfo top_level_info; - U64 sect_count; - RDIB_BinarySection *sections; - RDIB_UnitChunkList units; - RDIB_SourceFileChunkList src_files; - RDIB_LineTableChunkList line_tables; - RDIB_ScopeChunkList scopes; - RDIB_VariableChunkList locals; - RDIB_VariableChunkList gvars; - RDIB_VariableChunkList extern_gvars; - RDIB_VariableChunkList static_gvars; - RDIB_VariableChunkList tvars; - RDIB_VariableChunkList extern_tvars; - RDIB_VariableChunkList static_tvars; - RDIB_ProcedureChunkList procs; - RDIB_ProcedureChunkList extern_procs; - RDIB_ProcedureChunkList static_procs; - RDIB_InlineSiteChunkList inline_sites; - RDIB_TypeChunkList types; - RDIB_TypeChunkList struct_list; - RDIB_TypeChunkList union_list; - RDIB_TypeChunkList enum_list; - RDIB_TypeChunkList param_types; - RDIB_TypeChunkList member_types; - RDIB_TypeChunkList enum_types; - RDIB_UDTMemberChunkList udt_members; - RDIB_UDTMemberChunkList enum_members; - - RDIB_SourceFile *null_src_file; - RDIB_LineTable *null_line_table; - RDIB_LineTableFragment *null_frag; - RDIB_Type *null_type; - RDIB_Scope *null_scope; - RDIB_Unit *null_unit; - RDIB_Procedure *null_proc; - RDIB_Variable *null_local; - RDIB_Variable *null_gvar; - RDIB_Variable *null_tvar; - RDIB_UDTMember *null_udt_member; - RDIB_UDTMember *null_enum_member; - RDIB_InlineSite *null_inline_site; - - RDIB_Type *variadic_type; - - //RDIB_TypeChunkList struct_list; - //RDIB_TypeChunkList union_list; - //RDIB_TypeChunkList enum_list; - //RDIB_TypeChunkList param_types; -} RDIB_Input; - -//////////////////////////////// -// Parallel For Tasks - -typedef struct -{ - U64 *udt_counts; -} RDIB_TypeStats; - -typedef struct -{ - RDIB_TypeChunk **chunks; - RDIB_TypeStats *type_stats; -} RDIB_TypeStatsTask; - -typedef struct -{ - Rng1U64 *ranges; - U64 *counts; - U64 *offsets; - RDIB_TypeChunk **type_chunks; - RDIB_StringMap *string_map; - union { - RDI_Member *udt_members_rdi; - RDI_EnumMember *enum_members_rdi; - }; -} RDIB_MembersTask; - -typedef struct -{ - RDIB_TypeChunk **type_chunks; - RDIB_TypeStats type_stats; - U64 *udt_base_idx; - RDI_UDT *udts; -} RDIB_UserDefinesTask; - -typedef struct -{ - U64 addr_size; - RDIB_StringMap *string_map; - RDIB_IndexRunMap *idx_run_map; - RDIB_TypeChunk **type_chunks; - RDIB_TypeStats type_stats; - RDI_TypeNode *type_nodes; -} RDIB_TypeNodesTask; - -typedef struct -{ - RDIB_StringMap *string_map; - Rng1U64 *ranges; - RDIB_StringMapUpdateFunc *string_map_update_func; - RDIB_StringMapBucket **free_buckets; - U64 *insert_counts; - U64 *element_indices; - union - { - RDIB_UnitChunk **units; - RDIB_BinarySection *sects; - RDIB_SourceFileChunk **src_file_chunks; - RDIB_VariableChunk **vars; - RDIB_ProcedureChunk **procs; - RDIB_InlineSiteChunk **inline_sites; - RDIB_UDTMemberChunk **udt_members; - RDIB_UDTMemberChunk **enum_members; - RDIB_TypeChunk **types; - RDIB_PathTreeNodeList *path_node_lists; - }; -} RDIB_CollectStringsTask; - -typedef struct -{ - RDIB_StringMap *string_map; - Rng1U64 *ranges; - RDIB_TypeChunk **chunks; - String8List *data_lists; -} RDIB_BuildTypeDataTask; - -typedef struct -{ - RDIB_StringMap *string_map; - Rng1U64 *ranges; - union { - struct { - RDIB_VariableChunk **gvars_rdib; - String8List *gvars_out; - }; - struct { - RDIB_VariableChunk **tvars_rdib; - String8List *tvars_out; - }; - struct { - RDIB_ProcedureChunk **procs_rdib; - String8List *procs_out; - }; - struct { - RDIB_ScopeChunk **scopes_rdib; - U64 *scope_voff_counts; - U64 *loc_data_sizes; - U64 *local_counts; - U64 *loc_block_counts; - U64 *scope_voff_offsets; - U64 *local_offsets; - U64 *loc_block_offsets; - U64 *loc_data_offsets; - U64 *scope_voffs_rdi; - RDI_Scope *scopes_rdi; - RDI_Symbol *locals_rdi; - void *loc_blocks_rdi; - U8 *loc_data_rdi; - }; - }; -} RDIB_BuildSymbolSectionTask; - -typedef union -{ - struct { - U64 *counts; - U64 *offsets; - Rng1U64 *ranges; - RDIB_VMapRange *vmap; - union { - RDIB_UnitChunk **unit_chunks; - RDIB_VariableChunk **gvar_chunks; - RDIB_ScopeChunk **scope_chunks; - }; - }; - - struct { - U64 vmap_counts[3]; - RDIB_VMapRange *vmaps[3]; - String8List raw_vmaps[3]; - }; -} RDIB_VMapBuilderTask; - -typedef struct -{ - U64 sorter_idx; - RDI_NameMapKind name_map_kind; - RDIB_IndexRunMap *idx_run_map; - RDIB_IndexRunBucket **free_buckets; - Rng1U64 *ranges; - union { - RDIB_TypeChunk **type_chunks; - RDIB_StringMapBucket **name_map_buckets; - }; -} RDIB_BuildIndexRunsTask; - -typedef struct -{ - RDIB_IndexRunBucket **buckets; - Rng1U64 *ranges; - U32 *output_array; -} RDIB_IdxRunCopyTask; - -typedef struct -{ - RDIB_IndexRunMap *idx_run_map; - Rng1U64 *ranges; - U64 *counts; - U64 *offsets; - RDIB_IndexRunBucket **result; -} RDIB_GetExtantBucketsIndexRunMapTask; - -typedef struct -{ - U64 chunk_idx_opl; - Rng1U64 *ranges; - RDIB_IndexRunBucket **src; - RDIB_IndexRunBucket **dst; - U32 *chunk_histo; - U32 *chunk_offsets; -} RDIB_IndexRunMapRadixSort; - -typedef struct -{ - RDIB_StringMap *string_map; - RDIB_IndexRunMap *idx_run_map; - U64 *in_bucket_counts; - RDIB_StringMapBucket ***in_buckets; - - RDI_NameMapBucket **out_buckets; - RDI_NameMapNode **out_nodes; - U64 *out_bucket_counts; - U64 *out_node_counts; -} RDIB_NameMapBuilderTask; - -typedef struct -{ - RDIB_PathTree *path_tree; - RDIB_StringMap *string_map; - RDI_FilePathNode *nodes_dst; -} RDIB_BuildFilePathNodesTask; - -typedef struct -{ - RDIB_SourceFile **src_file_arr; - U32 *out_line_counts; - U32 *out_voff_counts; - U32 **out_line_nums; - U32 **out_line_ranges; - U64 **out_voffs; -} RDIB_SrcLineMapsTask; - -typedef struct -{ - RDIB_LineTableChunk **chunks; - Rng1U64 *ranges; - - U64 *out_line_table_counts; - U64 **out_line_table_voffs; - RDI_Line **out_line_table_lines; -} RDIB_BuildLineTablesTask; - -typedef struct -{ - Rng1U64 *ranges; - RDIB_StringMap *string_map; - RDIB_PathTree *path_tree; - RDIB_SourceFileChunk **src_file_chunks; - RDI_SourceFile *src_files_dst; -} RDIB_FillSourceFilesTask; - -//////////////////////////////// -// Data Model Helpers - -internal RDIB_DataModel rdib_infer_data_model(OperatingSystem os, RDI_Arch arch); - -internal RDI_TypeKind rdib_short_type_from_data_model (RDIB_DataModel data_model); -internal RDI_TypeKind rdib_unsigned_short_type_from_data_model (RDIB_DataModel data_model); -internal RDI_TypeKind rdib_int_type_from_data_model (RDIB_DataModel data_model); -internal RDI_TypeKind rdib_unsigned_int_type_from_data_model (RDIB_DataModel data_model); -internal RDI_TypeKind rdib_long_type_from_data_model (RDIB_DataModel data_model); -internal RDI_TypeKind rdib_unsigned_long_type_from_data_model (RDIB_DataModel data_model); -internal RDI_TypeKind rdib_long_long_type_from_data_model (RDIB_DataModel data_model); -internal RDI_TypeKind rdib_unsigned_long_long_type_from_data_model(RDIB_DataModel data_model); -internal RDI_TypeKind rdib_pointer_size_t_type_from_data_model (RDIB_DataModel data_model); - -//////////////////////////////// - -internal void rdib_udt_member_list_push_node (RDIB_UDTMemberList *list, RDIB_UDTMember *node); -internal void rdib_udt_member_list_concat_in_place(RDIB_UDTMemberList *list, RDIB_UDTMemberList *to_concat); - -internal RDIB_LineTableFragment * rdib_line_table_push(Arena *arena, RDIB_LineTable *list); - -//////////////////////////////// -// Chunk Lists - -// push -internal RDIB_Unit * rdib_unit_chunk_list_push (Arena *arena, RDIB_UnitChunkList *list, U64 cap); -internal RDIB_Scope * rdib_scope_chunk_list_push (Arena *arena, RDIB_ScopeChunkList *list, U64 cap); -internal RDIB_Procedure * rdib_procedure_chunk_list_push (Arena *arena, RDIB_ProcedureChunkList *list, U64 cap); -internal RDIB_Variable * rdib_variable_chunk_list_push (Arena *arena, RDIB_VariableChunkList *list, U64 cap); -internal RDIB_LineTable * rdib_line_table_chunk_list_push (Arena *arena, RDIB_LineTableChunkList *list, U64 cap); -internal RDIB_Type * rdib_type_chunk_list_push (Arena *arena, RDIB_TypeChunkList *list, U64 cap); -internal RDIB_UDTMember * rdib_udt_member_chunk_list_push (Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap); -internal RDIB_SourceFile * rdib_source_file_chunk_list_push(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap); -internal RDIB_InlineSite * rdib_inline_site_chunk_list_push(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap); - -internal RDIB_Scope * rdib_scope_chunk_list_push_zero (Arena *arena, RDIB_ScopeChunkList *list, U64 cap); -internal RDIB_Procedure * rdib_procedure_chunk_list_push_zero (Arena *arena, RDIB_ProcedureChunkList *list, U64 cap); -internal RDIB_Variable * rdib_variable_chunk_list_push_zero (Arena *arena, RDIB_VariableChunkList *list, U64 cap); -internal RDIB_LineTable * rdib_line_table_chunk_list_push_zero (Arena *arena, RDIB_LineTableChunkList *list, U64 cap); -internal RDIB_Type * rdib_type_chunk_list_push_zero (Arena *arena, RDIB_TypeChunkList *list, U64 cap); -internal RDIB_UDTMember * rdib_udt_member_chunk_list_push_zero (Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap); -internal RDIB_SourceFile * rdib_source_file_chunk_list_push_zero(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap); -internal RDIB_InlineSite * rdib_inline_site_chunk_list_push_zero(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap); - -// push many -internal RDIB_UnitChunk * rdib_unit_chunk_list_reserve_ex(Arena *arena, RDIB_UnitChunkList *list, U64 chunk_count, U64 item_count); - -internal void rdib_unit_chunk_list_reserve (Arena *arena, RDIB_UnitChunkList *list, U64 cap); -internal void rdib_type_chunk_list_reserve (Arena *arena, RDIB_TypeChunkList *list, U64 cap); -internal void rdib_source_file_chunk_list_reserve(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap); - -// concat in place -internal void rdib_scope_chunk_list_concat_in_place (RDIB_ScopeChunkList *list, RDIB_ScopeChunkList *to_concat); -internal void rdib_udt_member_chunk_list_concat_in_place (RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat); -internal void rdib_procedure_chunk_list_concat_in_place (RDIB_ProcedureChunkList *list, RDIB_ProcedureChunkList *to_concat); -internal void rdib_variable_chunk_list_concat_in_place (RDIB_VariableChunkList *list, RDIB_VariableChunkList *to_concat); -internal void rdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat); -internal void rdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat); -internal void rdib_type_chunk_list_concat_in_place (RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat); -internal void rdib_source_file_chunk_list_concat_in_place(RDIB_SourceFileChunkList *list, RDIB_SourceFileChunkList *to_concat); - -// concat in place many -internal void rdib_type_chunk_list_concat_in_place_many (RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat, U64 count); -internal void rdib_udt_member_chunk_list_concat_in_place_many(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat, U64 count); - -// array from chunk list -internal RDIB_UnitChunk ** rdib_array_from_unit_chunk_list (Arena *arena, RDIB_UnitChunkList list); -internal RDIB_ScopeChunk ** rdib_array_from_scope_chunk_list (Arena *arena, RDIB_ScopeChunkList list); -internal RDIB_ProcedureChunk ** rdib_array_from_procedure_chunk_list (Arena *arena, RDIB_ProcedureChunkList list); -internal RDIB_VariableChunk ** rdib_array_from_variable_chunk_list (Arena *arena, RDIB_VariableChunkList list); -internal RDIB_LineTableChunk ** rdib_array_from_line_table_chunk_list (Arena *arena, RDIB_LineTableChunkList list); -internal RDIB_InlineSiteChunk ** rdib_array_from_inline_site_chunk_list(Arena *arena, RDIB_InlineSiteChunkList list); -internal RDIB_UDTMemberChunk ** rdib_array_from_udt_member_chunk_list (Arena *arena, RDIB_UDTMemberChunkList list); -internal RDIB_TypeChunk ** rdib_array_from_type_chunk_list (Arena *arena, RDIB_TypeChunkList list); -internal RDIB_SourceFileChunk ** rdib_array_from_source_file_chunk_list(Arena *arena, RDIB_SourceFileChunkList list); - -// total count from chunk list -internal U64 rdib_unit_chunk_list_total_count (RDIB_UnitChunkList list); -internal U64 rdib_scope_chunk_list_total_count (RDIB_ScopeChunkList list); -internal U64 rdib_variable_chunk_list_total_count (RDIB_VariableChunkList list); -internal U64 rdib_line_table_chunk_list_total_count (RDIB_LineTableChunkList list); -internal U64 rdib_procedure_chunk_list_total_count (RDIB_ProcedureChunkList list); -internal U64 rdib_inline_site_chunk_list_total_count(RDIB_InlineSiteChunkList list); -internal U64 rdib_udt_member_chunk_list_total_count (RDIB_UDTMemberChunkList list); -internal U64 rdib_type_chunk_list_total_count (RDIB_TypeChunkList list); -internal U64 rdib_source_file_chunk_list_total_count(RDIB_SourceFileChunkList list); - -// pointer -> array index -internal U32 rdib_idx_from_unit (RDIB_Unit *n); -internal U32 rdib_idx_from_scope (RDIB_Scope *n); -internal U32 rdib_idx_from_variable (RDIB_Variable *n); -internal U32 rdib_idx_from_procedure (RDIB_Procedure *n); -internal U32 rdib_idx_from_source_file(RDIB_SourceFile *n); -internal U32 rdib_idx_from_line_table (RDIB_LineTable *n); -internal U32 rdib_idx_from_type (RDIB_Type *n); -internal U32 rdib_idx_from_udt_type (RDIB_Type *n); -internal U32 rdib_idx_from_inline_site(RDIB_InlineSite *n); - -//////////////////////////////// - -//- Source File - -internal B32 rdib_source_file_match(RDIB_SourceFile *a, RDIB_SourceFile *b, OperatingSystem os); - -//- Eval Ops - -internal RDIB_EvalBytecodeOp * rdib_bytecode_push_op (Arena *arena, RDIB_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p); -internal void rdib_bytecode_push_ucsont(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_U64 uconst); -internal void rdib_bytecode_push_sconst(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_S64 sconst); - -//- Location - -internal RDIB_Location rdib_make_location_addr_byte_stream (Rng1U64List ranges, RDIB_EvalBytecode bytecode); -internal RDIB_Location rdib_make_location_addr_bytecode_stream (Rng1U64List ranges, RDIB_EvalBytecode bytecode); -internal RDIB_Location rdib_make_location_val_bytecode_stream (Rng1U64List ranges, RDIB_EvalBytecode bytecode); -internal RDIB_Location rdib_make_location_addr_reg_plus_u16 (Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset); - -internal RDIB_Location rdib_make_location_addr_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset); -internal RDIB_Location rdib_make_location_addr_reg_plus_u16 (Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset); -internal RDIB_Location rdib_make_location_val_reg (Rng1U64List ranges, RDI_RegCode reg_code); - -internal RDIB_LocationNode * rdib_push_location_addr_reg_off(Arena *arena, RDIB_LocationList *list, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 is_reference, Rng1U64List ranges); - -//- UDT Fwdrefs - -internal U64 rdib_udt_fwdref_map_hash(String8 string); -internal RDIB_UDTFwdrefBucket * rdib_udt_fwdref_map_insert_or_update(RDIB_UDTFwdrefBucket **buckets, U64 cap, U64 hash, RDIB_UDTFwdrefBucket *new_bucket); -internal RDIB_UDTFwdrefBucket * rdib_udt_fwdrefmap_map_lookup(RDIB_UDTFwdrefBucket **buckets, U64 cap, U64 hash, String8 name); - -//- Types - -internal RDIB_TypeRef rdib_make_type_ref(Arena *arena, RDIB_Type *type); -internal void rdib_deref_type_refs(TP_Context *tp, RDIB_TypeChunkList *list); - -internal RDIB_TypeStats rdib_sum_type_stats (RDIB_TypeStats *stats, U64 count); -internal U64 rdib_udt_count_from_type_stats (RDIB_TypeStats *stats); -internal U64 rdib_type_node_count_from_type_stats(RDIB_TypeStats *stats); - -internal U64 rdib_size_from_type (RDIB_Type *type); -internal U64 rdib_count_members_deep(RDIB_Type *type); - -//- Path Tree - -internal RDIB_PathTree * rdib_path_tree_init (Arena *arena, U64 list_count); -internal void rdib_path_tree_insert (Arena *arena, RDIB_PathTree *tree, String8 path, RDIB_SourceFile *src_file); -internal U32 rdib_idx_from_path_tree(RDIB_PathTree *tree, String8 path); - - -//- String Map - -internal U64 rdib_string_map_hash (String8 string); -internal RDIB_StringMap * rdib_init_string_map (Arena *arena, U64 cap); -internal U32 rdib_idx_from_string_map (RDIB_StringMap *string_map, String8 string); -internal RDIB_StringMapBucket * rdib_string_map_insert_or_update (RDIB_StringMapBucket **buckets, U64 cap, U64 hash, RDIB_StringMapBucket *new_bucket, RDIB_StringMapUpdateFunc *update_func); -internal void rdib_string_map_assign_indices (RDIB_StringMapBucket **buckets, U64 bucket_count); -internal RDIB_StringMapBucket ** rdib_extant_buckets_from_string_map(TP_Context *tp, Arena *arena, RDIB_StringMap *string_map, U64 *bucket_count_out); -internal void rdib_string_map_sort_buckets (TP_Context *tp, RDIB_StringMapBucket **buckets, U64 bucket_count, U64 max_sorter); - -//- String Map Specialized Inserters - -internal void rdib_string_map_insert_item (Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, void *value); -internal void rdib_string_map_insert_string_table_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string); -internal void rdib_string_map_insert_name_map_item (Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, VoidNode *node); - -//- Index Run Map - -internal U64 rdib_index_run_hash (U32 count, U32 *idxs); -internal RDIB_IndexRunMap * rdib_init_index_run_map (Arena *arena, U64 cap); -internal RDIB_IndexRunBucket * rdib_index_run_map_insert_or_update (Arena *arena, RDIB_IndexRunBucket **buckets, U64 cap, U64 hash, RDIB_IndexRunBucket *new_bucket, U64 *bucket_idx_out); -internal U32 rdib_idx_run_from_bucket_idx (RDIB_IndexRunMap *map, U64 bucket_idx); -internal void rdib_index_run_map_assign_indices (RDIB_IndexRunBucket **buckets, U64 bucket_count); -internal RDIB_IndexRunBucket ** rdib_extant_buckets_from_index_run_map(TP_Context *tp, Arena *arena, RDIB_IndexRunMap *idx_run_map, U64 *bucket_count_out); -internal void rdib_index_run_map_sort_buckets (TP_Context *tp, RDIB_IndexRunBucket **buckets, U64 bucket_count, U64 chunk_idx_opl); - -//- Index Map Spesialized Query - -internal U32 rdib_idx_from_params(RDIB_IndexRunMap *map, RDIB_Type *params); - -//- Data Sections - -internal void rdib_data_section_list_push_node (RDIB_DataSectionList *list, RDIB_DataSectionNode *node); -internal RDIB_DataSectionNode * rdib_data_section_list_push (Arena *arena, RDIB_DataSectionList *list, RDIB_DataSection v); -internal void rdib_data_section_list_concat_in_place(RDIB_DataSectionList *list, RDIB_DataSectionList *to_concat); - -internal void rdib_data_sections_from_top_level_info (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_TopLevelInfo *src); -internal void rdib_data_sections_from_binary_sections (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_BinarySection *binary_sects, U64 binary_sects_count); -internal void rdib_data_sections_from_string_map (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count); -internal void rdib_data_sections_from_index_runs (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_IndexRunBucket **buckets, U64 bucket_count); -internal void rdib_data_sections_from_file_path_nodes (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_PathTree *tree); -internal void rdib_data_sections_from_source_files (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree, U64 total_src_file_count, U64 src_file_chunk_count, RDIB_SourceFileChunk **src_file_chunks); -internal void rdib_data_sections_from_units (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree, U64 total_unit_count, U64 unit_chunk_count, RDIB_UnitChunk **unit_chunks); -internal void rdib_data_sections_from_string_map (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count); -internal void rdib_data_sections_from_types(TP_Context *tp, - Arena *arena, - RDIB_DataSectionList *sect_list, - RDI_Arch arch, - RDIB_StringMap *string_map, - RDIB_IndexRunMap *idx_run_map, - U64 udt_member_chunk_count, - RDIB_TypeChunk **udt_member_type_chunks, - U64 enum_member_chunk_count, - RDIB_TypeChunk **enum_member_type_chunks, - U64 total_type_node_count, - U64 type_chunk_count, - RDIB_TypeChunk **type_chunks, - RDIB_TypeStats type_stats); -internal void rdib_data_sections_from_global_variables (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_VariableChunk **chunks); -internal void rdib_data_sections_from_thread_variables (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_VariableChunk **chunks); -internal void rdib_data_sections_from_procedures (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_ProcedureChunk **chunks); -internal void rdib_data_sections_from_scopes (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_ScopeChunk **chunks); -internal void rdib_data_sections_from_name_maps (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_IndexRunMap *idx_run_map, RDIB_StringMapBucket **src_name_maps[RDI_NameMapKind_COUNT], U64 src_name_map_counts[RDI_NameMapKind_COUNT]); -internal void rdib_data_sections_from_source_line_maps (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, U64 total_src_file_count, U64 src_file_chunk_count, RDIB_SourceFileChunk **src_fille_chunks); -internal void rdib_data_sections_from_unit_gvar_scope_vmaps(TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, U64 unit_chunk_count, RDIB_UnitChunk **unit_chunks, U64 gvar_chunk_count, RDIB_VariableChunk **gvar_chunks, U64 scope_chunk_count, RDIB_ScopeChunk **scope_chunks); -internal void rdib_data_sections_from_inline_sites (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_inline_site_count, U64 inline_site_chunk_count, RDIB_InlineSiteChunk **inline_site_chunks); -internal void rdib_data_sections_from_checksums (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list); - -internal RDIB_Input rdib_init_input(Arena *arena); -internal String8List rdib_finish(TP_Context *tp, TP_Arena *arena, RDIB_Input *input); - diff --git a/src/linker/rdi/rdi_coff.c b/src/linker/rdi/rdi_coff.c deleted file mode 100644 index 1227a480..00000000 --- a/src/linker/rdi/rdi_coff.c +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal RDI_Arch -rdi_arch_from_coff_machine(COFF_MachineType machine) -{ - switch (machine) { - case COFF_MachineType_X64: return RDI_Arch_X64; - - case COFF_MachineType_X86: - case COFF_MachineType_Unknown: - case COFF_MachineType_Am33: - case COFF_MachineType_Arm: - case COFF_MachineType_Arm64: - case COFF_MachineType_ArmNt: - case COFF_MachineType_Ebc: - case COFF_MachineType_Ia64: - case COFF_MachineType_M32R: - case COFF_MachineType_Mips16: - case COFF_MachineType_MipsFpu: - case COFF_MachineType_MipsFpu16: - case COFF_MachineType_PowerPc: - case COFF_MachineType_PowerPcFp: - case COFF_MachineType_R4000: - case COFF_MachineType_RiscV32: - case COFF_MachineType_RiscV64: - case COFF_MachineType_Sh3: - case COFF_MachineType_Sh3Dsp: - case COFF_MachineType_Sh4: - case COFF_MachineType_Sh5: - case COFF_MachineType_Thumb: - case COFF_MachineType_WceMipsV2: - NotImplemented; - default: - return RDI_Arch_NULL; - } -} - -internal RDI_BinarySectionFlags -rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) -{ - RDI_BinarySectionFlags result = 0; - if (flags & COFF_SectionFlag_MemRead) { - result |= RDI_BinarySectionFlag_Read; - } - if (flags & COFF_SectionFlag_MemWrite) { - result |= RDI_BinarySectionFlag_Write; - } - if (flags & COFF_SectionFlag_MemExecute) { - result |= RDI_BinarySectionFlag_Execute; - } - return result; -} diff --git a/src/linker/rdi/rdi_coff.h b/src/linker/rdi/rdi_coff.h deleted file mode 100644 index caefb833..00000000 --- a/src/linker/rdi/rdi_coff.h +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma once - -internal RDI_Arch rdi_arch_from_coff_machine(COFF_MachineType machine); - diff --git a/src/linker/rdi/rdi_cv.c b/src/linker/rdi/rdi_cv.c deleted file mode 100644 index 545777ab..00000000 --- a/src/linker/rdi/rdi_cv.c +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal RDI_Arch -rdi_arch_from_cv_arch(CV_Arch arch) -{ - switch (arch) { - case CV_Arch_X64: return RDI_Arch_X64; - - case CV_Arch_8086: - case CV_Arch_8080: - case CV_Arch_80286: - case CV_Arch_80386: - case CV_Arch_80486: - case CV_Arch_PENTIUM: - case CV_Arch_PENTIUMII: - case CV_Arch_PENTIUMIII: - case CV_Arch_MIPS: - case CV_Arch_MIPS16: - case CV_Arch_MIPS32: - case CV_Arch_MIPS64: - case CV_Arch_MIPSI: - case CV_Arch_MIPSII: - case CV_Arch_MIPSIII: - case CV_Arch_MIPSIV: - case CV_Arch_MIPSV: - case CV_Arch_M68000: - case CV_Arch_M68010: - case CV_Arch_M68020: - case CV_Arch_M68030: - case CV_Arch_M68040: - case CV_Arch_ALPHA: - case CV_Arch_ALPHA_21164: - case CV_Arch_ALPHA_21164A: - case CV_Arch_ALPHA_21264: - case CV_Arch_ALPHA_21364: - case CV_Arch_PPC601: - case CV_Arch_PPC603: - case CV_Arch_PPC604: - case CV_Arch_PPC620: - case CV_Arch_PPCFP: - case CV_Arch_PPCBE: - case CV_Arch_SH3: - case CV_Arch_SH3E: - case CV_Arch_SH3DSP: - case CV_Arch_SH4: - case CV_Arch_SHMEDIA: - case CV_Arch_ARM3: - case CV_Arch_ARM4: - case CV_Arch_ARM4T: - case CV_Arch_ARM5: - case CV_Arch_ARM5T: - case CV_Arch_ARM6: - case CV_Arch_ARM_XMAC: - case CV_Arch_ARM_WMMX: - case CV_Arch_ARM7: - case CV_Arch_OMNI: - case CV_Arch_IA64_1: - case CV_Arch_IA64_2: - case CV_Arch_CEE: - case CV_Arch_AM33: - case CV_Arch_M32R: - case CV_Arch_TRICORE: - case CV_Arch_EBC: - case CV_Arch_THUMB: - case CV_Arch_ARMNT: - case CV_Arch_ARM64: - case CV_Arch_D3D11_SHADER: - NotImplemented; - default: - return RDI_Arch_NULL; - } -} - -internal RDI_Language -rdi_language_from_cv_language(CV_Language language) -{ - switch (language) { - case CV_Language_C: return RDI_Language_C; - case CV_Language_CXX: return RDI_Language_CPlusPlus; - case CV_Language_MASM: return RDI_Language_Masm; - case CV_Language_LINK: return RDI_Language_NULL; - case CV_Language_CVTRES: return RDI_Language_NULL; - - case CV_Language_FORTRAN: - case CV_Language_PASCAL: - case CV_Language_BASIC: - case CV_Language_COBOL: - case CV_Language_CVTPGD: - case CV_Language_CSHARP: - case CV_Language_VB: - case CV_Language_ILASM: - case CV_Language_JAVA: - case CV_Language_JSCRIPT: - case CV_Language_MSIL: - case CV_Language_HLSL: - NotImplemented; - default: - return RDI_Language_NULL; - } -} - -internal RDI_TypeModifierFlags -rdi_type_modifier_flags_from_cv_modifier_flags(CV_ModifierFlags flags) -{ - RDI_TypeModifierFlags result = 0; - if (flags & CV_ModifierFlag_Const) { - result |= RDI_TypeModifierFlag_Const; - } - if (flags & CV_ModifierFlag_Volatile) { - result |= RDI_TypeModifierFlag_Volatile; - } - return result; -} - -internal RDI_TypeModifierFlags -rdi_type_modifier_flags_from_cv_pointer_attribs(CV_PointerAttribs attribs) -{ - RDI_TypeModifierFlags result = 0; - if (attribs & CV_PointerAttrib_Const) { - result |= RDI_TypeModifierFlag_Const; - } - if (attribs & CV_PointerAttrib_Volatile) { - result |= RDI_TypeModifierFlag_Volatile; - } - return result; -} - -internal RDI_TypeKind -rdi_type_kind_from_pointer(CV_PointerAttribs attribs, CV_PointerMode mode) -{ - RDI_TypeKind result = RDI_TypeKind_Ptr; - - if (attribs & CV_PointerAttrib_LRef) { - result = RDI_TypeKind_LRef; - } else if (attribs & CV_PointerAttrib_RRef) { - result = RDI_TypeKind_RRef; - } - - if (mode == CV_PointerMode_LRef) { - result = RDI_TypeKind_LRef; - } else if (mode == CV_PointerMode_RRef) { - result = RDI_TypeKind_RRef; - } - - return result; -} - -internal RDI_TypeKind -rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) -{ - switch (basic_type) { - case CV_BasicType_NOTYPE : return RDI_TypeKind_NULL; - case CV_BasicType_ABS : return RDI_TypeKind_NULL; - case CV_BasicType_SEGMENT : return RDI_TypeKind_NULL; - case CV_BasicType_VOID : return RDI_TypeKind_Void; - case CV_BasicType_CURRENCY : return RDI_TypeKind_NULL; - case CV_BasicType_NBASICSTR : return RDI_TypeKind_NULL; - case CV_BasicType_FBASICSTR : return RDI_TypeKind_NULL; - case CV_BasicType_HRESULT : return RDI_TypeKind_Handle; - case CV_BasicType_CHAR : return RDI_TypeKind_Char8; - case CV_BasicType_SHORT : return RDI_TypeKind_S16; - case CV_BasicType_LONG : return RDI_TypeKind_S32; - case CV_BasicType_QUAD : return RDI_TypeKind_S64; - case CV_BasicType_OCT : return RDI_TypeKind_S128; - case CV_BasicType_UCHAR : return RDI_TypeKind_UChar8; - case CV_BasicType_USHORT : return RDI_TypeKind_U16; - case CV_BasicType_ULONG : return RDI_TypeKind_U32; - case CV_BasicType_UQUAD : return RDI_TypeKind_U64; - case CV_BasicType_UOCT : return RDI_TypeKind_U128; - case CV_BasicType_BOOL8 : return RDI_TypeKind_S8; - case CV_BasicType_BOOL16 : return RDI_TypeKind_S16; - case CV_BasicType_BOOL32 : return RDI_TypeKind_S32; - case CV_BasicType_BOOL64 : return RDI_TypeKind_S64; - case CV_BasicType_FLOAT32 : return RDI_TypeKind_F32; - case CV_BasicType_FLOAT64 : return RDI_TypeKind_F64; - case CV_BasicType_FLOAT80 : return RDI_TypeKind_F80; - case CV_BasicType_FLOAT128 : return RDI_TypeKind_F128; - case CV_BasicType_FLOAT48 : return RDI_TypeKind_F48; - case CV_BasicType_FLOAT32PP : return RDI_TypeKind_F32PP; - case CV_BasicType_FLOAT16 : return RDI_TypeKind_F16; - case CV_BasicType_COMPLEX32 : return RDI_TypeKind_ComplexF32; - case CV_BasicType_COMPLEX64 : return RDI_TypeKind_ComplexF64; - case CV_BasicType_COMPLEX80 : return RDI_TypeKind_ComplexF80; - case CV_BasicType_COMPLEX128: return RDI_TypeKind_ComplexF128; - case CV_BasicType_BIT : return RDI_TypeKind_NULL; - case CV_BasicType_PASCHAR : return RDI_TypeKind_NULL; - case CV_BasicType_BOOL32FF : return RDI_TypeKind_NULL; - case CV_BasicType_INT8 : return RDI_TypeKind_S8; - case CV_BasicType_UINT8 : return RDI_TypeKind_U8; - case CV_BasicType_RCHAR : return RDI_TypeKind_Char8; - case CV_BasicType_WCHAR : return RDI_TypeKind_UChar16; - case CV_BasicType_CHAR16 : return RDI_TypeKind_Char16; - case CV_BasicType_CHAR32 : return RDI_TypeKind_Char32; - case CV_BasicType_INT16 : return RDI_TypeKind_S16; - case CV_BasicType_UINT16 : return RDI_TypeKind_U16; - case CV_BasicType_INT32 : return RDI_TypeKind_S32; - case CV_BasicType_UINT32 : return RDI_TypeKind_U32; - case CV_BasicType_INT64 : return RDI_TypeKind_S64; - case CV_BasicType_UINT64 : return RDI_TypeKind_U64; - case CV_BasicType_INT128 : return RDI_TypeKind_S128; - case CV_BasicType_UINT128 : return RDI_TypeKind_U128; - case CV_BasicType_CHAR8 : return RDI_TypeKind_Char8; - case CV_BasicType_PTR : return RDI_TypeKind_Ptr; - } - return RDI_TypeKind_NULL; -} - -internal RDI_RegCode -rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg) -{ - RDI_RegCode result = 0; - switch (arch) { - case CV_Arch_X64: { - switch (reg) { -#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break; - CV_Reg_X64_XList(X) -#undef X - } - } break; - case CV_Arch_8086: - default: NotImplemented; - } - return result; -} - -internal RDI_ChecksumKind -rdi_checksum_from_cv_c13(CV_C13ChecksumKind kind) -{ - switch (kind) { - case CV_C13ChecksumKind_Null: return RDI_ChecksumKind_NULL; - case CV_C13ChecksumKind_MD5: return RDI_ChecksumKind_MD5; - case CV_C13ChecksumKind_SHA1: return RDI_ChecksumKind_SHA1; - case CV_C13ChecksumKind_SHA256: return RDI_ChecksumKind_SHA256; - } - return RDI_ChecksumKind_NULL; -} diff --git a/src/linker/rdi/rdi_cv.h b/src/linker/rdi/rdi_cv.h deleted file mode 100644 index 98aa8244..00000000 --- a/src/linker/rdi/rdi_cv.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma once - -internal RDI_Arch rdi_arch_from_cv_arch(CV_Arch arch); -internal RDI_Language rdi_language_from_cv_language(CV_Language language); -internal RDI_TypeModifierFlags rdi_type_modifier_flags_from_cv_pointer_attribs(CV_PointerAttribs attribs); -internal RDI_TypeKind rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); -internal RDI_RegCode rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg); - -internal RDI_ChecksumKind rdi_checksum_from_cv_c13(CV_C13ChecksumKind kind); - - diff --git a/src/linker/rdi/rdi_overrides.h b/src/linker/rdi/rdi_overrides.h deleted file mode 100644 index b593000e..00000000 --- a/src/linker/rdi/rdi_overrides.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -typedef U8 RDI_U8; -typedef U16 RDI_U16; -typedef U32 RDI_U32; -typedef U64 RDI_U64; -typedef S8 RDI_S8; -typedef S16 RDI_S16; -typedef S32 RDI_S32; -typedef S64 RDI_S64; - -#define RDI_PROC internal -#define RDIM_MEMSET_OVERRIDE -#define rdim_memset MemorySet - -#define RDIM_MEMCPY_OVERRIDE -#define rdim_memcpy MemoryCopy - -#define rdim_vsnprintf raddbg_vsnprintf - diff --git a/src/linker/scripts/obj_paths_from_pdb.py b/src/linker/scripts/obj_paths_from_pdb.py deleted file mode 100644 index 2bd11b50..00000000 --- a/src/linker/scripts/obj_paths_from_pdb.py +++ /dev/null @@ -1,16 +0,0 @@ -import subprocess -import sys -import os - -def get_sorted_objs(pdb_path): - result = subprocess.run(["llvm-pdbutil", "dump", "--modules", pdb_path], stdout=subprocess.PIPE, text=True) - lines = result.stdout.strip().split('\n') - filtered_lines = [line for line in lines if line.lstrip().startswith("Mod ")] - # sort by the obj_path portion (line format: "Mod ") - def extract_path(line): return line.split(maxsplit=2)[2].lower() - #sorted_lines = sorted(filtered_lines, key=extract_path) - return filtered_lines - -if __name__ == "__main__": - sorted_objs = get_sorted_objs(sys.argv[1]) - for l in sorted_objs: print(l.lstrip()) From 568a77b73c480af9b912708b35e29ee09c1a0a6a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 21 May 2026 17:44:04 -0700 Subject: [PATCH 683/850] fix up scratch conflicts --- src/base/base_thread_context.c | 1 + src/rdi_from_pdb/rdi_from_pdb.c | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index 42163610..d87471e6 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -79,6 +79,7 @@ tctx_get_scratch(Arena **conflicts, U64 count) break; } } + Assert(result); return result; } diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index e6b37e15..560ce4a1 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -396,6 +396,8 @@ internal RDIM_BakeParams p2r_convert(Arena *arena, P2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); + + Arena *scratch_conflicts[2] = { scratch.arena, arena }; ////////////////////////////////////////////////////////////// //- rjf: do base MSF parse @@ -403,7 +405,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) MSF_Parsed *msf = 0; ProfScope("do base MSF parse") { - Temp scratch2 = scratch_begin(&scratch.arena, 1); + Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); // rjf: setup output buckets MSF_RawStreamTable *msf_raw_stream_table = 0; @@ -675,7 +677,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // U64 exe_voff_max = 0; { - Temp scratch2 = scratch_begin(&scratch.arena, 1); + Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); // rjf: set up U64 *lane_voff_maxes = 0; @@ -825,7 +827,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: do wide gather ProfScope("do wide gather") { - Temp scratch2 = scratch_begin(&scratch.arena, 1); + Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); //- rjf: build local hash table to dedup files within this lane U64 hit_path_slots_count = 4096; @@ -1756,7 +1758,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } //- rjf: walk dependent types, push to chain - Temp scratch2 = scratch_begin(&scratch.arena, 1); + Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); P2R_TypeIdChain start_walk_task = {0, itype}; P2R_TypeIdChain *first_walk_task = &start_walk_task; P2R_TypeIdChain *last_walk_task = &start_walk_task; @@ -2039,7 +2041,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 all_namespace_slots_count = 0; ProfScope("gather all unique namespaces from types") { - Temp scratch2 = scratch_begin(&scratch.arena, 1); + Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); //- rjf: find all unique namespaces on this lane U64 namespace_slots_count = (U64)itype_opl / lane_count(); @@ -2843,7 +2845,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_SubsetFlag_Types)) ProfScope("gather all namespaces which are only encoded in symbols (not found in types)") { - Temp scratch2 = scratch_begin(&scratch.arena, 1); + Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); U64 lane_namespace_slots_count = 4096; String8Node **lane_namespace_slots = push_array(scratch2.arena, String8Node *, lane_namespace_slots_count); From e3587dcb9fcaae35c86fdde483b4e16e40b3a042 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 22 May 2026 13:37:27 -0700 Subject: [PATCH 684/850] use GetForegroundWindow for foucs detection with parented debuggers --- src/win32/window_manager/win32_window_manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/win32/window_manager/win32_window_manager.c b/src/win32/window_manager/win32_window_manager.c index 3baaa28c..00886719 100644 --- a/src/win32/window_manager/win32_window_manager.c +++ b/src/win32/window_manager/win32_window_manager.c @@ -1164,7 +1164,7 @@ internal B32 wm_window_is_focused(WM_Window handle) { W32_WM_Window *window = w32_wm_window_from_handle(handle); - HWND active_hwnd = GetActiveWindow(); + HWND active_hwnd = GetForegroundWindow(); return active_hwnd == window->hwnd; } From 4bbed83eabb41ac3c1210c5f81dd38e443579682 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 May 2026 13:55:30 -0700 Subject: [PATCH 685/850] only send ack on catch-all path for external driver cmds --- src/raddbg/raddbg_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 43163711..d6c4f3b7 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12964,6 +12964,7 @@ rd_frame(void) } rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_kind_info->query.expr, primary_args_string); rd_push_cmd(cmd_kind_name, rd_regs()); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "ack:{cmd:%S}\n", cmd_kind_name); } else { From ec6f569181481b8412bd4e41ef9819bb84db2ea8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 22 May 2026 13:53:29 -0700 Subject: [PATCH 686/850] set CLOCK_MONOTONIC on conditional variables --- src/linux/base/linux_base.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 183d85e9..ce11d0eb 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -485,7 +485,11 @@ internal CondVar cond_var_alloc(void) { LNX_Entity *entity = lnx_entity_alloc(LNX_EntityKind_ConditionVariable); - int init_result = pthread_cond_init(&entity->cv.cond_handle, 0); + pthread_condattr_t attr; + pthread_condattr_init(&attr); + pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); + int init_result = pthread_cond_init(&entity->cv.cond_handle, &attr); + pthread_condattr_destroy(&attr); if(init_result == -1) { lnx_entity_release(entity); From 5f851ad1b0fc18dda669643e0261c7cbd2a3b3f3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 May 2026 14:04:37 -0700 Subject: [PATCH 687/850] simplify testing ipc driving stuff in raddbg layer; put in formal eval/line-from-vaddr commands --- project.raddbg | 1 + src/dbg_engine/dbg_engine_user.c | 4 +- .../eval_visualization_core.c | 24 + .../eval_visualization_core.h | 3 + src/lib_rdi_make/rdi_make.c | 2 +- src/lib_rdi_make/rdi_make.h | 2 +- src/radbin/radbin.c | 127 +---- src/radbin/radbin_main.c | 4 - src/raddbg/generated/raddbg.meta.c | 14 +- src/raddbg/generated/raddbg.meta.h | 6 +- src/raddbg/raddbg.mdesk | 10 +- src/raddbg/raddbg_core.c | 478 ++++-------------- src/raddbg/raddbg_core.h | 21 - src/raddbg/raddbg_main.c | 4 - src/raddbg/raddbg_views.c | 2 +- src/rdi_make/rdi_make_local.c | 6 +- src/torture/torture_dbg.c | 420 ++++++++------- 17 files changed, 434 insertions(+), 694 deletions(-) diff --git a/project.raddbg b/project.raddbg index 4019e3e2..e3cfcebd 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,6 +7,7 @@ target: working_directory: build arguments: "--user:raddbg_test.user --project:raddbg_test.project" enabled: 1 + debug_subprocesses: 0 } target: { diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index c520e007..7e3d2661 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -994,7 +994,7 @@ d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, override_n = override_n->next) { String8 file_path = override_n->string; - String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); + String8 file_path_normalized = rdim_normalized_from_path(scratch.arena, file_path); // rjf: binary -> rdi RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); @@ -1087,7 +1087,7 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 override_n = override_n->next) { String8 file_path = override_n->string; - String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); + String8 file_path_normalized = rdim_normalized_from_path(scratch.arena, file_path); for EachIndex(idx, dbgi_keys.count) { Access *access = access_open(); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 3b0794b5..58471d35 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -2294,3 +2294,27 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) return result; } + +//- rjf: eval -> string path + +internal String8 +ev_value_string_from_eval(Arena *arena, EV_StringParams *params, E_Eval eval, U64 cap) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strs = {0}; + EV_StringIter *iter = ev_string_iter_begin(scratch.arena, eval, params); + for(String8 string = {0}; ev_string_iter_next(scratch.arena, iter, &string);) + { + if(strs.total_size + string.size > cap) + { + String8 allowed_string = str8_chop(string, ((strs.total_size + string.size) - cap) + 3); + str8_list_push(scratch.arena, &strs, allowed_string); + str8_list_push(scratch.arena, &strs, str8_lit("...")); + break; + } + str8_list_push(scratch.arena, &strs, string); + } + String8 result = str8_list_join(arena, &strs, 0); + scratch_end(scratch); + return result; +} diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 4a7067af..301ae947 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -383,4 +383,7 @@ internal String8 ev_escaped_from_raw_string(Arena *arena, String8 raw); internal EV_StringIter *ev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params); internal B32 ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string); +//- rjf: eval -> string path +internal String8 ev_value_string_from_eval(Arena *arena, EV_StringParams *params, E_Eval eval, U64 cap); + #endif // EVAL_VISUALIZATION_CORE_H diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index ee96ff32..5f1e10b6 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -256,7 +256,7 @@ rdim_lower_from_str8(RDIM_Arena *arena, RDIM_String8 string) } RDI_PROC RDIM_String8 -rdim_normalize_path_str8(RDIM_Arena *arena, RDIM_String8 path) +rdim_normalized_from_path(RDIM_Arena *arena, RDIM_String8 path) { RDIM_String8 result = rdim_lower_from_str8(arena, path); for(RDI_U64 i = 0; i < result.RDIM_String8_SizeMember; i += 1) diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 52c24443..66d6c826 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -1333,7 +1333,7 @@ RDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatc #define rdim_str8_struct(S) rdim_str8((RDI_U8*)(S), sizeof(*(S))) #define rdim_str8_struct_array(S, C) rdim_str8((RDI_U8*)(S), sizeof(*(S)) * (C)) RDI_PROC RDIM_String8 rdim_lower_from_str8(RDIM_Arena *arena, RDIM_String8 string); -RDI_PROC RDIM_String8 rdim_normalize_path_str8(RDIM_Arena *arena, RDIM_String8 path); +RDI_PROC RDIM_String8 rdim_normalized_from_path(RDIM_Arena *arena, RDIM_String8 path); //- rjf: string lists RDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string); diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 74e7177b..edfc12a4 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -720,89 +720,7 @@ rb_thread_entry_point(void *p) else if(elf_w_dwarf) { log_infof("ELFs specified; converting DWARF data to RDI\n"); } // rjf: convert - D2R_ConvertParams convert_params = {0}; - { - B32 got_exe = 0; - B32 got_dbg = 0; - if(!got_exe && !got_dbg) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_PE].first; n != 0; n = n->next) - { - if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) - { - got_exe = 1; - got_dbg = 1; - convert_params.dbg_name = n->v->path; - convert_params.dbg_data = n->v->data; - convert_params.exe_name = n->v->path; - convert_params.exe_data = n->v->data; - convert_params.exe_kind = ExecutableImageKind_CoffPe; - break; - } - } - } - if(!got_exe) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next) - { - got_exe = 1; - convert_params.exe_name = n->v->path; - convert_params.exe_data = n->v->data; - convert_params.exe_kind = ExecutableImageKind_Elf32; - if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF)) - { - break; - } - } - } - if(!got_exe) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next) - { - got_exe = 1; - convert_params.exe_name = n->v->path; - convert_params.exe_data = n->v->data; - convert_params.exe_kind = ExecutableImageKind_Elf64; - if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF)) - { - break; - } - } - } - if(!got_dbg) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next) - { - if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) - { - got_dbg = 1; - convert_params.dbg_name = n->v->path; - convert_params.dbg_data = n->v->data; - break; - } - } - } - if(!got_dbg) - { - for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next) - { - if(n->v->format_flags & RB_FileFormatFlag_HasDWARF) - { - got_dbg = 1; - convert_params.dbg_name = n->v->path; - convert_params.dbg_data = n->v->data; - break; - } - } - } - convert_params.subset_flags = subset_flags; - convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); - convert_params.is_parse_relaxed = 1; // TODO: switch - } -#if DWARF_2 - - // rjf: convert [2] - D2R2_ConvertParams convert_params_2 = {0}; + D2R2_ConvertParams convert_params = {0}; { B32 got_exe = 0; B32 got_dbg = 0; @@ -892,11 +810,11 @@ rb_thread_entry_point(void *p) String8 raw_sections = str8_substr(exe_data, pe.section_table_range); COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); String8 string_table = str8_substr(exe_data, pe.string_table_range); - convert_params_2.arch = pe.arch; - convert_params_2.base_vaddr = pe.image_base; - convert_params_2.raw = dw_input_from_coff_section_table(scratch.arena, exe_data, string_table, pe.section_count, section_table); - convert_params_2.path_style = PathStyle_WindowsAbsolute; - convert_params_2.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, exe_data, string_table, pe.section_count, section_table); + convert_params.arch = pe.arch; + convert_params.base_vaddr = pe.image_base; + convert_params.raw = dw_input_from_coff_section_table(scratch.arena, exe_data, string_table, pe.section_count, section_table); + convert_params.path_style = PathStyle_WindowsAbsolute; + convert_params.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, exe_data, string_table, pe.section_count, section_table); scratch_end(scratch); }break; case ExecutableImageKind_Elf32: @@ -904,23 +822,20 @@ rb_thread_entry_point(void *p) { Temp scratch = scratch_begin(&arena, 1); ELF_Bin bin = elf_bin_from_data(scratch.arena, dbg_data); - convert_params_2.arch = arch_from_elf_machine(bin.hdr.e_machine); - convert_params_2.base_vaddr = elf_base_addr_from_bin(&bin); - convert_params_2.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); - convert_params_2.path_style = PathStyle_UnixAbsolute; - convert_params_2.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); + convert_params.arch = arch_from_elf_machine(bin.hdr.e_machine); + convert_params.base_vaddr = elf_base_addr_from_bin(&bin); + convert_params.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); + convert_params.path_style = PathStyle_UnixAbsolute; + convert_params.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); scratch_end(scratch); }break; } - convert_params_2.exe_name = exe_name; - convert_params_2.exe_data = exe_data; - convert_params_2.subset_flags = subset_flags; - convert_params_2.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); + convert_params.exe_name = exe_name; + convert_params.exe_data = exe_data; + convert_params.subset_flags = subset_flags; + convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } - ProfScope("convert [2]") dwarf_bake_params_2 = d2r2_convert(arena, &convert_params_2); -#else - ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); -#endif + ProfScope("convert") dwarf_bake_params = d2r2_convert(arena, &convert_params); } //- rjf: PDB inputs => PDB -> RDI conversion @@ -995,11 +910,7 @@ rb_thread_entry_point(void *p) { bake_params = push_array(arena, RDIM_BakeParams, 1); rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params); -#if DWARF_2 - rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params_2); -#else rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params); -#endif for EachNode(n, RDIM_BakeParamsNode, first_rdi_bake_params) { rdim_bake_params_concat_in_place(bake_params, &n->v); @@ -1334,14 +1245,14 @@ rb_thread_entry_point(void *p) PathStyle path_style = PathStyle_SystemAbsolute; if (str8_match_wildcard(top_part, str8_lit("?:"), 0)) { path_style = PathStyle_WindowsAbsolute; } else if(str8_match_wildcard(top_part, str8_lit("/*"), 0)) { path_style = PathStyle_UnixAbsolute; } - + String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, path_style, src_file->file_path_node_idx); str8_list_pushf(arena, &output_blobs, "[inlined] %S %S:%u\n", inline_name, path, inline_line.line_num); } } } } - + // TODO: remove 'path_style' from the str8_from_rdi_path_node_idx and detect // path style based on the top node [c:|d:] -> windows, / -> unix String8 top_part = {0}; @@ -1357,7 +1268,7 @@ rb_thread_entry_point(void *p) PathStyle path_style = PathStyle_SystemAbsolute; if (str8_match_wildcard(top_part, str8_lit("?:"), 0)) { path_style = PathStyle_WindowsAbsolute; } else if(str8_match_wildcard(top_part, str8_lit("/*"), 0)) { path_style = PathStyle_UnixAbsolute; } - + String8 path = str8_from_rdi_path_node_idx(scratch.arena, rdi, path_style, src_file->file_path_node_idx); str8_list_pushf(arena, &output_blobs, "%S:%u\n", path, line.line_num); scratch_end(scratch); diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 816544f6..fd1b2ad1 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -14,7 +14,6 @@ #include "base/base_inc.h" #include "x64/x64.h" #include "linker/hash_table.h" -#include "linker/lf_hash_table.h" #include "linker/base_ext/base_bit_array.h" #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" @@ -36,7 +35,6 @@ #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" -#include "rdi_from_dwarf/rdi_from_dwarf.h" #include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "radbin/radbin.h" @@ -44,7 +42,6 @@ #include "base/base_inc.c" #include "x64/x64.c" #include "linker/hash_table.c" -#include "linker/lf_hash_table.c" #include "linker/base_ext/base_bit_array.c" #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" @@ -66,7 +63,6 @@ #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" -#include "rdi_from_dwarf/rdi_from_dwarf.c" #include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "radbin/radbin.c" diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 5945b106..03b8a348 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[361] = +RD_VocabInfo rd_vocab_info_table[363] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -214,6 +214,9 @@ RD_VocabInfo rd_vocab_info_table[361] = {str8_lit_comp("open_palette"), str8_lit_comp(""), str8_lit_comp("Open Palette"), str8_lit_comp(""), RD_IconKind_List}, {str8_lit_comp("run_command"), str8_lit_comp(""), str8_lit_comp("Run Command"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp("Run External Driver Text Command"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp("State"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp("Eval"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp("Line From Virtual Address"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Thread}, {str8_lit_comp("select_unwind"), str8_lit_comp(""), str8_lit_comp("Select Unwind"), str8_lit_comp(""), RD_IconKind_Null}, @@ -365,7 +368,6 @@ RD_VocabInfo rd_vocab_info_table[361] = {str8_lit_comp("enable_breakpoint"), str8_lit_comp(""), str8_lit_comp("Enable Breakpoint"), str8_lit_comp(""), RD_IconKind_CheckFilled}, {str8_lit_comp("disable_breakpoint"), str8_lit_comp(""), str8_lit_comp("Disable Breakpoint"), str8_lit_comp(""), RD_IconKind_CheckHollow}, {str8_lit_comp("clear_breakpoints"), str8_lit_comp(""), str8_lit_comp("Clear Breakpoints"), str8_lit_comp(""), RD_IconKind_Trash}, -{str8_lit_comp("list_breakpoints"), str8_lit_comp(""), str8_lit_comp("List Breakpoints"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("clear_output"), str8_lit_comp(""), str8_lit_comp("Clear Output"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("add_watch_pin"), str8_lit_comp(""), str8_lit_comp("Add Watch Pin"), str8_lit_comp(""), RD_IconKind_Pin}, {str8_lit_comp("toggle_watch_pin"), str8_lit_comp(""), str8_lit_comp("Toggle Watch Pin"), str8_lit_comp(""), RD_IconKind_Pin}, @@ -576,7 +578,7 @@ Rng1U64 rd_reg_slot_range_table[49] = {OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[249] = +RD_CmdKindInfo rd_cmd_kind_info_table[251] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -615,7 +617,10 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, { str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -767,7 +772,6 @@ RD_CmdKindInfo rd_cmd_kind_info_table[249] = { str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("list_breakpoints"), str8_lit_comp("Lists all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 1440f4db..db003e8a 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -100,6 +100,9 @@ RD_CmdKind_Exit, RD_CmdKind_OpenPalette, RD_CmdKind_RunCommand, RD_CmdKind_RunExternalDriverTextCommand, +RD_CmdKind_State, +RD_CmdKind_Eval, +RD_CmdKind_LineFromVAddr, RD_CmdKind_WMEvent, RD_CmdKind_SelectThread, RD_CmdKind_SelectUnwind, @@ -251,7 +254,6 @@ RD_CmdKind_RemoveBreakpoint, RD_CmdKind_EnableBreakpoint, RD_CmdKind_DisableBreakpoint, RD_CmdKind_ClearBreakpoints, -RD_CmdKind_ListBreakpoints, RD_CmdKind_ClearOutput, RD_CmdKind_AddWatchPin, RD_CmdKind_ToggleWatchPin, @@ -603,7 +605,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[361]; +extern RD_VocabInfo rd_vocab_info_table[363]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index b0168d61..2fb9b4ef 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -942,9 +942,14 @@ RD_CmdTable: // | | | | //- rjf: palette {OpenPalette 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } - //- rjf: command runners + //- rjf: command fast-path {RunCommand 1 1 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } - {RunExternalDriverTextCommand 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 1 1 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } + + //- rjf: external drivers + {RunExternalDriverTextCommand 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } + {State 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } + {Eval 0 1 0 0 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } + {LineFromVAddr 0 1 0 0 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } //- rjf: os event passthrough {WMEvent 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } @@ -1152,7 +1157,6 @@ RD_CmdTable: // | | | | {EnableBreakpoint 1 1 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } {DisableBreakpoint 1 1 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } {ClearBreakpoints 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } - {ListBreakpoints 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "list_breakpoints" "List Breakpoints" "Lists all breakpoints." "" "" } //- rjf: output {ClearOutput 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index d6c4f3b7..525e4ecb 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9227,26 +9227,6 @@ rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringParams *params, return result; } -internal String8 -rd_value_string_from_eval2(Arena *arena, String8 filter, EV_StringParams *params, U64 cap, E_Eval eval) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List strs = {0}; - EV_StringIter *iter = ev_string_iter_begin(scratch.arena, eval, params); - for(String8 string = {0}; ev_string_iter_next(scratch.arena, iter, &string);) - { - if(strs.total_size + string.size > cap) - { - str8_list_push(scratch.arena, &strs, str8_lit("...")); - break; - } - str8_list_push(scratch.arena, &strs, string); - } - String8 result = str8_list_join(arena, &strs, 0); - scratch_end(scratch); - return result; -} - //////////////////////////////// //~ rjf: Hover Eval @@ -10302,264 +10282,6 @@ rd_next_view_cmd(RD_Cmd **cmd) return result; } -//////////////////////////////// -//~ IPC - -internal RD_IpcReply -rd_ipc_mdesk_reply_from_string(Arena *arena, String8 string) -{ - MD_ParseResult parse = md_parse_from_text(arena, str8_lit("ipc_reply"), string); - return (RD_IpcReply){ .parse = parse, .root = parse.root, parse.root->first }; -} - -internal B32 -rd_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out) -{ - MD_Node *child = md_child_from_string(node, child_name, 0); - if (!md_node_is_nil(child) && !md_node_is_nil(child->first)) - { - if (out) { *out = child->first->string; } - return 1; - } - return 0; -} - -internal B32 -rd_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out) -{ - String8 value = {0}; - if (rd_ipc_parse_string(node, child_name, &value)) - { - U64 v64 = 0; - if (try_u64_from_str8_c_rules(value, &v64)) - { - if (out) { *out = safe_cast_u32(v64); } - return 1; - } - } - return 0; -} - -internal B32 -rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out) -{ - String8 value = {0}; - if (rd_ipc_parse_string(node, child_name, &value)) - { - U64 v64 = 0; - if (try_u64_from_str8_c_rules(value, &v64)) - { - if (out) { MemoryCopy(out, &v64, out_size); } - return 1; - } - } - return 0; -} - -internal B32 -rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out) -{ - B32 is_ok = 0; - String8 s = {0}; - U64 value = 0; - if (rd_ipc_parse_string(node, child_name, &s)) - { - if (str8_matchi(s, str8_lit("true"))) { value = 1; is_ok = 1; } - else if (str8_matchi(s, str8_lit("false"))) { value = 0; is_ok = 1; } - else - { - is_ok = try_u64_from_str8_c_rules(s, &value); - value = !!value; - } - } - if (is_ok && out) { *out = value; } - return is_ok; -} - -internal void -rd_ipc_reply_push(Arena *arena, String8List *out, char *name, String8 value) -{ - str8_list_pushf(arena, out, "%s: \"%S\"\n", name, escaped_from_raw_str8(arena, value)); -} - -internal void -rd_ipc_reply_block_begin(Arena *arena, String8List *out, char *name) -{ - str8_list_pushf(arena, out, "%s: {\n", name); -} - -internal void -rd_ipc_reply_block_end(Arena *arena, String8List *out) -{ - str8_list_pushf(arena, out, "}\n"); -} - -internal void -rd_ipc_reply_push_u64(Arena *arena, String8List *out, char *name, U64 value) -{ - str8_list_pushf(arena, out, "%s: %I64u\n", name, value); -} - -internal void -rd_ipc_reply_push_str8(Arena *arena, String8List *out, char *name, String8 value) -{ - str8_list_pushf(arena, out, "%s: \"%S\"\n", name, escaped_from_raw_str8(arena, value)); -} - -internal void -rd_ipc_reply_push_b32(Arena *arena, String8List *out, char *name, B32 value) -{ - rd_ipc_reply_push_u64(arena, out, name, !!value); -} - -internal String8 -rd_ipc_make_reply_ack(Arena *arena, String8 cmd, B32 ok) -{ - String8List s = {0}; - rd_ipc_reply_block_begin(arena, &s, "cmd_reply"); - rd_ipc_reply_push_b32(arena, &s, "ok", ok); - rd_ipc_reply_push (arena, &s, "cmd", cmd); - rd_ipc_reply_block_end(arena, &s); - return str8_list_join(arena, &s, 0); -} - -internal String8 -rd_ipc_make_reply_status(Arena *arena) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List s = {0}; - rd_ipc_reply_block_begin(arena, &s, "status"); - rd_ipc_reply_push_b32 (arena, &s, "ok", 1); - rd_ipc_reply_push_b32 (arena, &s, "running", d_ctrl_targets_running()); - rd_ipc_reply_push_u64 (arena, &s, "run_gen", d_run_gen()); - rd_ipc_reply_push_u64 (arena, &s, "ip", d_ctrl_last_stop_event().rip_vaddr); - rd_ipc_reply_block_end(arena, &s); - scratch_end(scratch); - return str8_list_join(arena, &s, 0); -} - -internal String8 -rd_ipc_make_reply_stop_event(Arena *arena) -{ - Temp scratch = scratch_begin(&arena, 1); - - D_Event e = d_ctrl_last_stop_event(); - - String8List stop_cause_list = {0}; - DR_FStrList stop_cause_fstr = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &e); - for EachNode (n, DR_FStrNode, stop_cause_fstr.first) { str8_list_push(scratch.arena, &stop_cause_list, n->v.string); } - String8 stop_cause = str8_list_join(arena, &stop_cause_list, &(StringJoin){.sep=str8_lit(" ")}); - - String8List s = {0}; - rd_ipc_reply_block_begin(arena, &s, "stop_event"); - rd_ipc_reply_push_b32 (arena, &s, "ok", 1); - rd_ipc_reply_push_u64 (arena, &s, "arch", e.arch); - rd_ipc_reply_push_u64 (arena, &s, "vaddr_min", e.vaddr_rng.min); - rd_ipc_reply_push_u64 (arena, &s, "vaddr_max", e.vaddr_rng.max); - rd_ipc_reply_push_u64 (arena, &s, "ip_vaddr", e.rip_vaddr); - rd_ipc_reply_push_u64 (arena, &s, "sp_base", e.stack_base); - rd_ipc_reply_push_u64 (arena, &s, "tls_root", e.tls_root); - rd_ipc_reply_push_u64 (arena, &s, "tls_index", e.tls_index); - rd_ipc_reply_push_u64 (arena, &s, "tls_offset", e.tls_offset); - rd_ipc_reply_push_u64 (arena, &s, "timestamp", e.timestamp); - rd_ipc_reply_push_u64 (arena, &s, "exception_code", e.exception_code); - rd_ipc_reply_push_u64 (arena, &s, "bp_flags", e.bp_flags); - rd_ipc_reply_push_str8(arena, &s, "string", e.string); - rd_ipc_reply_push_u64 (arena, &s, "target_os", e.target_os); - rd_ipc_reply_push_u64 (arena, &s, "tls_model", e.tls_model); - rd_ipc_reply_push_str8(arena, &s, "stop_cause", stop_cause); - rd_ipc_reply_block_end(arena, &s); - - String8 result = str8_list_join(arena, &s, 0); - scratch_end(scratch); - return result; -} - -internal String8 -rd_ipc_make_reply_eval(Arena *arena, String8 expr, E_Eval eval, U64 cap) -{ - Temp scratch = scratch_begin(&arena, 1); - - // gather value & type - EV_StringParams string_params = - { - .flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags, - .radix = 10, - }; - String8 value_string = rd_value_string_from_eval2(scratch.arena, str8_zero(), &string_params, cap, eval); - String8 type_string = e_type_string_from_key(scratch.arena, eval.irtree.type_key); - - String8List errors = {0}; - for EachNode(msg, E_Msg, eval.msgs.first) { str8_list_push(scratch.arena, &errors, msg->text); } - String8 error_string = str8_list_join(scratch.arena, &errors, &(StringJoin){.sep = str8_lit("; ")}); - - // format reply - String8List reply = {0}; - rd_ipc_reply_block_begin(arena, &reply, "eval"); - rd_ipc_reply_push_b32 (arena, &reply, "ok", 1); - rd_ipc_reply_push (arena, &reply, "cmd", str8_lit("eval")); - rd_ipc_reply_push (arena, &reply, "expr", expr); - rd_ipc_reply_push (arena, &reply, "value", value_string); - rd_ipc_reply_push (arena, &reply, "type", type_string); - rd_ipc_reply_push (arena, &reply, "error", error_string); - rd_ipc_reply_block_end(arena, &reply); - String8 result = str8_list_join(arena, &reply, 0); - - scratch_end(scratch); - return result; -} - -internal String8 -rd_ipc_make_reply_source_location_from_address(Arena *arena, U64 vaddr) -{ - Temp scratch = scratch_begin(&arena, 1); - - D_Entity *process = d_entity_from_handle(rd_base_regs()->process); - if(process == &d_entity_nil) - { - D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); - process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); - } - - D_Entity *module = &d_entity_nil; - DI_Key dbgi_key = {0}; - U64 voff = 0; - D_LineList lines = {0}; - if(process != &d_entity_nil) - { - module = d_module_from_process_vaddr(process, vaddr); - if(module != &d_entity_nil) - { - dbgi_key = d_dbgi_key_from_module(module); - voff = d_voff_from_vaddr(module, vaddr); - lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); - } - } - D_Line line = {0}; - if(lines.first != 0) - { - line = lines.first->v; - } - - B32 is_ok = (process != &d_entity_nil && module != &d_entity_nil && lines.first != 0); - - String8List reply = {0}; - rd_ipc_reply_block_begin(arena, &reply, "source_location_from_address"); - rd_ipc_reply_push_b32 (arena, &reply, "ok", is_ok); - rd_ipc_reply_push_u64 (arena, &reply, "vaddr", vaddr); - rd_ipc_reply_push_u64 (arena, &reply, "voff", voff); - rd_ipc_reply_push_str8(arena, &reply, "file_path", line.file_path); - rd_ipc_reply_push_u64 (arena, &reply, "line", line.pt.line); - rd_ipc_reply_push_u64 (arena, &reply, "column", line.pt.column); - rd_ipc_reply_push_u64 (arena, &reply, "voff_min", line.voff_range.min); - rd_ipc_reply_push_u64 (arena, &reply, "voff_max", line.voff_range.max); - rd_ipc_reply_block_end(arena, &reply); - String8 result = str8_list_join(arena, &reply, 0); - - scratch_end(scratch); - return result; -} - //////////////////////////////// //~ rjf: Main Layer Top-Level Calls @@ -12857,91 +12579,15 @@ rd_frame(void) } }break; - //- rjf: external driver textual commands + //- rjf: external drivers case RD_CmdKind_RunExternalDriverTextCommand: { - String8 msg = rd_regs()->string; - String8List msg_parts = str8_split(scratch.arena, msg, (U8 *)" ", 1, 0); - CmdLine msg_cmd_line = cmd_line_from_string_list(scratch.arena, msg_parts); - String8 cmd_kind_name = str8_list_first(&msg_cmd_line.inputs); + String8 msg = rd_regs()->string; + String8List msg_parts = str8_split(scratch.arena, msg, (U8 *)" ", 1, 0); + CmdLine msg_cmd_line = cmd_line_from_string_list(scratch.arena, msg_parts); + String8 cmd_kind_name = str8_list_first(&msg_cmd_line.inputs); RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name); - U64 cmd_args_pos = str8_find_needle(msg, 0, cmd_kind_name, StringMatchFlag_CaseInsensitive); - String8 cmd_args = str8_skip_chop_whitespace(str8_skip(msg, cmd_args_pos + cmd_kind_name.size)); - if(str8_match(cmd_kind_name, str8_lit("status"), 0)) - { - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_status(rd_state->cmd_output_arena)); - } - else if(str8_match(cmd_kind_name, str8_lit("stop_event"), 0)) - { - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_stop_event(rd_state->cmd_output_arena)); - } - else if(str8_match(cmd_kind_name, str8_lit("run"), 0)) - { - rd_cmd(RD_CmdKind_Run); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("run"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("halt"), 0)) - { - rd_cmd(RD_CmdKind_Halt); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("halt"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("kill_all"), 0)) - { - rd_cmd(RD_CmdKind_KillAll); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("kill_all"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("step_over"), 0)) - { - rd_cmd(RD_CmdKind_StepOver); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_over"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("step_into"), 0)) - { - rd_cmd(RD_CmdKind_StepInto); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_into"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("step_out"), 0)) - { - rd_cmd(RD_CmdKind_StepOut); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_out"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("step_over_inst"), 0)) - { - rd_cmd(RD_CmdKind_StepOverInst); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_over_inst"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("step_into_inst"), 0)) - { - rd_cmd(RD_CmdKind_StepIntoInst); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_into_inst"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("step_over_line"), 0)) - { - rd_cmd(RD_CmdKind_StepOverLine); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_over_line"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("step_into_line"), 0)) - { - rd_cmd(RD_CmdKind_StepIntoLine); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_ack(rd_state->cmd_output_arena, str8_lit("step_into_line"), 1)); - } - else if(str8_match(cmd_kind_name, str8_lit("eval"), 0)) - { - U64 cap_end = str8_find_needle(cmd_args, 0, str8_lit(" "), 0); - String8 cap_str = str8_substr(cmd_args, r1u64(0, cap_end)); - U64 cap = 0; - try_u64_from_str8_c_rules(cap_str, &cap); - String8 expr = str8_skip(cmd_args, cap_str.size); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_eval(rd_state->cmd_output_arena, expr, e_eval_from_string(expr), cap)); - } - else if(str8_match(cmd_kind_name, str8_lit("source_location_from_address"), 0)) - { - String8 vaddr_str = str8_skip_chop_whitespace(cmd_args); - U64 vaddr = 0; - try_u64_from_str8_c_rules(vaddr_str, &vaddr); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, rd_ipc_make_reply_source_location_from_address(rd_state->cmd_output_arena, vaddr)); - } - else if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope() + if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope() { for EachNonZeroEnumVal(RD_RegSlot, s) { @@ -12971,6 +12617,108 @@ rd_frame(void) log_user_errorf("`%S` is not a command.", cmd_kind_name); } }break; + case RD_CmdKind_State: + { + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "state:\n{\n"); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " running: %i\n", d_ctrl_targets_running()); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " run_gen: %I64u\n", d_run_gen()); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip: 0x%I64x\n", d_ctrl_last_stop_event().rip_vaddr); + { + D_Event evt = d_ctrl_last_stop_event(); + DR_FStrList explanation_fstrs = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &evt); + String8 explanation_string = dr_string_from_fstrs(scratch.arena, &explanation_fstrs); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stop_event:\n {\n"); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " arch: %S\n", string_from_arch(evt.arch)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range: [0x%I64x, 0x%I64x)\n", evt.vaddr_rng.min, evt.vaddr_rng.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_vaddr: 0x%I64x\n", evt.rip_vaddr); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stack_base: 0x%I64x\n", evt.stack_base); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " tls_root: 0x%I64x\n", evt.tls_root); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " tls_index: 0x%I64x\n", evt.tls_index); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " timestamp: 0x%I64x\n", evt.timestamp); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " exception_code: 0x%I64x\n", (U64)evt.exception_code); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " bp_flags: 0x%I64x\n", (U64)evt.bp_flags); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " string: \"%S\"\n", escaped_from_raw_str8(scratch.arena, evt.string)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " tls_model: 0x%I64x\n", evt.tls_model); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " explanation: \"%S\"\n", escaped_from_raw_str8(scratch.arena, explanation_string)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + } + { + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " threads:\n {\n"); + D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); + for EachIndex(idx, threads.count) + { + D_Entity *thread = threads.v[idx]; + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " name: \"%S\"\n", escaped_from_raw_str8(scratch.arena, thread->string)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " id: %I64u\n", thread->id); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip: 0x%I64x\n", d_query_cached_rip_from_thread(thread)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + } + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + } + { + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " modules:\n {\n"); + D_EntityArray modules = d_entity_array_from_kind(D_EntityKind_Module); + for EachIndex(idx, modules.count) + { + D_Entity *module = modules.v[idx]; + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " name: \"%S\"\n", escaped_from_raw_str8(scratch.arena, module->string)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range: [0x%I64x, 0x%I64x)\n", module->vaddr_range.min, module->vaddr_range.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + } + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + } + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "}\n"); + }break; + case RD_CmdKind_Eval: + { + String8 expr = rd_regs()->expr; + E_Eval eval = e_eval_from_string(expr); + E_Eval type_eval = e_eval_from_stringf("typeof(%S)", expr); + EV_StringParams string_params = + { + .flags = EV_StringFlag_ReadOnlyDisplayRules | rd_state->eval_viz_base_string_flags, + .radix = 10, + }; + String8 value_string = ev_value_string_from_eval(scratch.arena, &string_params, eval, 512); + String8 type_value_string = ev_value_string_from_eval(scratch.arena, &string_params, type_eval, 512); + String8List msgs_strings = {0}; + for EachNode(msg, E_Msg, eval.msgs.first) + { + str8_list_push(scratch.arena, &msgs_strings, msg->text); + } + StringJoin join = {.sep = s(". ")}; + String8 msgs_string = str8_list_join(scratch.arena, &msgs_strings, &join); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "eval:\n{\n"); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " expr: %S\n", expr); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " value: \"%S\"\n", escaped_from_raw_str8(scratch.arena, value_string)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " type: \"%S\"\n", escaped_from_raw_str8(scratch.arena, type_value_string)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " msgs: \"%S\"\n", escaped_from_raw_str8(scratch.arena, msgs_string)); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "}\n"); + }break; + case RD_CmdKind_LineFromVAddr: + { + U64 vaddr = rd_regs()->vaddr; + D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + U64 voff = d_voff_from_vaddr(module, vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "lines:\n{\n"); + for EachNode(n, D_LineNode, lines.first) + { + D_Line line = n->v; + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " file_path: \"%S\"\n", line.file_path); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " line_num: %I64d\n", line.pt.line); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " column_num: %I64d\n", line.pt.column); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range: [0x%I64x, 0x%I64x)\n", line.voff_range.min, line.voff_range.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + } + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "}\n"); + }break; //- rjf: exiting case RD_CmdKind_Exit: @@ -15810,16 +15558,6 @@ rd_frame(void) cfg_node_release(rd_state->cfg, n->v); } }break; - case RD_CmdKind_ListBreakpoints: - { - CFG_NodePtrList list = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); - for(CFG_NodePtrNode *n = list.first; n != 0; n = n->next) - { - if(rd_cfg_is_project_filtered(n->v)){ continue; } - String8 string = cfg_string_from_tree(rd_state->cmd_output_arena, rd_state->cfg_schema_table, str8_zero(), n->v); - str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, string); - } - }break; //- rjf: output case RD_CmdKind_ClearOutput: diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 72ac095f..e278f87e 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -93,17 +93,6 @@ enum RD_CmdKindFlag_ListInTextRng = (1<<4), }; -//////////////////////////////// -//~ IPC - -typedef struct RD_IpcReply RD_IpcReply; -struct RD_IpcReply -{ - MD_ParseResult parse; - MD_Node *root; - MD_Node *msg; -}; - //////////////////////////////// //~ rjf: Autocompletion Cursor Info Type @@ -762,7 +751,6 @@ internal void rd_window_frame(void); //~ rjf: Eval Visualization internal String8 rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval); -internal String8 rd_value_string_from_eval2(Arena *arena, String8 filter, EV_StringParams *params, U64 cap, E_Eval eval); //////////////////////////////// //~ rjf: Hover Eval @@ -848,15 +836,6 @@ internal void rd_push_cmd(String8 name, RD_Regs *regs); internal B32 rd_next_cmd(RD_Cmd **cmd); internal B32 rd_next_view_cmd(RD_Cmd **cmd); -//////////////////////////////// -//~ IPC - -internal RD_IpcReply rd_ipc_mdesk_reply_from_string(Arena *arena, String8 string); -internal B32 rd_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out); -internal B32 rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out); -#define rd_ipc_parse_int(a, b, c) rd_ipc_parse_int_(a, b, sizeof(*c), c) -internal B32 rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out); - //////////////////////////////// //~ rjf: Main Layer Top-Level Calls diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index fcf4b477..ab8f14df 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -295,7 +295,6 @@ #include "x64/x64.h" #include "win32/win32_inc.h" #include "linker/hash_table.h" -#include "linker/lf_hash_table.h" #include "linker/base_ext/base_bit_array.h" #include "artifact_cache/artifact_cache.h" #include "rdi/rdi_local.h" @@ -328,7 +327,6 @@ #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" -#include "rdi_from_dwarf/rdi_from_dwarf.h" #include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "radbin/radbin.h" #include "arch/arch_inc.h" @@ -351,7 +349,6 @@ #include "x64/x64.c" #include "win32/win32_inc.c" #include "linker/hash_table.c" -#include "linker/lf_hash_table.c" #include "linker/base_ext/base_bit_array.c" #include "artifact_cache/artifact_cache.c" #include "rdi/rdi_local.c" @@ -384,7 +381,6 @@ #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" -#include "rdi_from_dwarf/rdi_from_dwarf.c" #include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "radbin/radbin.c" #include "arch/arch_inc.c" diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 3ce62e0d..0a532fc4 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2313,7 +2313,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) for EachNode(override_n, String8Node, overrides.first) { String8 file_path = override_n->string; - String8 file_path_normalized = rdim_normalize_path_str8(scratch.arena, file_path); + String8 file_path_normalized = rdim_normalized_from_path(scratch.arena, file_path); B32 good_src_id = 0; U32 src_id = 0; if(rdi != &rdi_parsed_nil) diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index b40298f9..c788c0fa 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1202,7 +1202,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) Rng1U64 range = lane_range(n->count); for EachInRange(n_idx, range) { - RDIM_String8 normalized_path = rdim_normalize_path_str8(scratch.arena, n->v[n_idx].path); + RDIM_String8 normalized_path = rdim_normalized_from_path(scratch.arena, n->v[n_idx].path); rdim_bake_string_map_loose_insert(scratch.arena, top, lane_map, 1, normalized_path); } } @@ -1505,7 +1505,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) for EachInRange(n_idx, n_range) { RDIM_SrcFile *src_file = &n->v[n_idx]; - RDIM_String8 normalized_path = rdim_normalize_path_str8(scratch.arena, src_file->path); + RDIM_String8 normalized_path = rdim_normalized_from_path(scratch.arena, src_file->path); rdim_bake_name_map_insert(scratch.arena, top, map, 4, normalized_path, rdim_idx_from_src_file(src_file)); } } @@ -2450,7 +2450,7 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) //- rjf: fill file info Temp scratch2 = scratch_begin(&scratch.arena, 1); - String8 normalized_path = rdim_normalize_path_str8(scratch2.arena, src->path); + String8 normalized_path = rdim_normalized_from_path(scratch2.arena, src->path); B32 has_checksum = (RDI_ChecksumKind_NULL < src->checksum_kind && src->checksum_kind < RDI_ChecksumKind_COUNT && src->checksum.size != 0); dst->file_path_node_idx = rdim_bake_path_node_idx_from_string(path_tree, src->path); dst->normal_full_path_string_idx = rdim_bake_idx_from_string(bake_strings, normalized_path); diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 6472810f..2a9f81c0 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -7,6 +7,88 @@ extern B32 g_stop_on_first_fail_or_crash; +//////////////////////////////// +// Debugger IPC Replies + +typedef struct RD_IpcReply RD_IpcReply; +struct RD_IpcReply +{ + MD_ParseResult parse; + MD_Node *root; + MD_Node *msg; +}; + +internal RD_IpcReply +rd_ipc_mdesk_reply_from_string(Arena *arena, String8 string) +{ + MD_ParseResult parse = md_parse_from_text(arena, str8_lit("ipc_reply"), string); + return (RD_IpcReply){ .parse = parse, .root = parse.root, parse.root->first }; +} + +internal B32 +rd_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out) +{ + MD_Node *child = md_child_from_string(node, child_name, 0); + if (!md_node_is_nil(child) && !md_node_is_nil(child->first)) + { + if (out) { *out = child->first->string; } + return 1; + } + return 0; +} + +internal B32 +rd_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out) +{ + String8 value = {0}; + if (rd_ipc_parse_string(node, child_name, &value)) + { + U64 v64 = 0; + if (try_u64_from_str8_c_rules(value, &v64)) + { + if (out) { *out = safe_cast_u32(v64); } + return 1; + } + } + return 0; +} + +internal B32 +rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out) +{ + String8 value = {0}; + if (rd_ipc_parse_string(node, child_name, &value)) + { + U64 v64 = 0; + if (try_u64_from_str8_c_rules(value, &v64)) + { + if (out) { MemoryCopy(out, &v64, out_size); } + return 1; + } + } + return 0; +} + +internal B32 +rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out) +{ + B32 is_ok = 0; + String8 s = {0}; + U64 value = 0; + if (rd_ipc_parse_string(node, child_name, &s)) + { + if (str8_matchi(s, str8_lit("true"))) { value = 1; is_ok = 1; } + else if (str8_matchi(s, str8_lit("false"))) { value = 0; is_ok = 1; } + else + { + is_ok = try_u64_from_str8_c_rules(s, &value); + value = !!value; + } + } + if (is_ok && out) { *out = value; } + return is_ok; +} + //////////////////////////////// // IPC Controller @@ -17,14 +99,14 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep { Temp scratch = scratch_begin(&reply_arena, 1); B32 is_sent = 0; - - + + // send command String8 cmdline = str8f(scratch.arena, "--gen_crash_dump --ipc --pid:%u %S", g_dbg_pid, cmd); if (t_invoke(t_raddbg_path(), cmdline, timeout_us) == 0) { goto exit; } - + B32 has_reply = 1; - + char *no_reply_cmds[] = { "add_breakpoint", "add_function_breakpoint", @@ -37,23 +119,23 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep break; } } - + if (has_reply) { // parse reply Arena *a = reply_arena ? reply_arena : scratch.arena; String8 reply_text = str8_copy(a, g_output); RD_IpcReply reply = rd_ipc_mdesk_reply_from_string(a, reply_text); - + //fprintf(stderr, "Reply: %.*s\n", str8_varg(reply_text)); - + // validate reply if (reply.parse.msgs.worst_message_kind >= MD_MsgKind_Error) { goto exit; } if (md_node_is_nil(reply.msg)) { goto exit; } //if ( ! str8_matchi(reply.parse.root->first->string, cmd)) { Assert(0); goto exit; } - + if (reply_arena && reply_out) { *reply_out = reply; } } - + is_sent = 1; exit:; scratch_end(scratch); @@ -77,21 +159,21 @@ internal B32 t_dbg_status(T_DbgStatus *status_out, U64 timeout_us) { Temp scratch = scratch_begin(0, 0); - + B32 is_ok = 0; T_DbgStatus status = {0}; - + // send status request RD_IpcReply reply = {0}; if ( ! t_dbg_send_cmd(str8_lit("status"), timeout_us, scratch.arena, &reply)) { goto exit; } - + // parse reply if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("ok"), &is_ok)) { t_errorf("ERROR: failed to parse reply member: ok\n"); Assert(0); goto exit; } if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("running"), &status.running)) { t_errorf("ERROR: failed to parse reply member: running\n"); Assert(0); goto exit; } if ( ! rd_ipc_parse_int(reply.msg, str8_lit("run_gen"), &status.run_gen)) { t_errorf("ERROR: failed to parse reply member: run_gen\n"); Assert(0); goto exit; } if ( ! rd_ipc_parse_int(reply.msg, str8_lit("ip"), &status.ip)) { t_errorf("ERROR: failed to parse reply member: ip\n"); Assert(0); goto exit; } if (status_out != 0) { *status_out = status; } - + exit:; if ( ! is_ok && reply.parse.root) { t_errorf("\tReply: %S\n", reply.parse.root->raw_string); @@ -104,14 +186,14 @@ internal B32 t_dbg_stop_event(Arena *arena, T_DbgStopEvent *out, U64 timeout_us) { Temp scratch = scratch_begin(0, 0); - + T_DbgStopEvent v = {0}; B32 is_ok = 0; - + // send status request RD_IpcReply reply = {0}; if ( ! t_dbg_send_cmd(str8_lit("stop_event"), timeout_us, arena ? arena : scratch.arena, &reply)) { goto exit; } - + // parse reply if ( ! rd_ipc_parse_b32 (reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_int (reply.msg, str8_lit("arch"), &v.arch)) { AssertAlways(0); goto exit; } @@ -129,9 +211,9 @@ t_dbg_stop_event(Arena *arena, T_DbgStopEvent *out, U64 timeout_us) if ( ! rd_ipc_parse_int (reply.msg, str8_lit("target_os"), &v.target_os)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_model"), &v.tls_model)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_string (reply.msg, str8_lit("stop_cause"), &v.stop_cause)) { AssertAlways(0); goto exit; } - + if (arena && out != 0) { *out = v; } - + exit:; return is_ok; } @@ -140,14 +222,14 @@ internal B32 t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgSourceLocation *loc_out, U64 timeout_us) { Temp scratch = scratch_begin(&arena, 1); - + B32 is_ok = 0; - + RD_IpcReply reply = {0}; if(!t_dbg_send_cmdf(timeout_us, arena, &reply, "source_location_from_address 0x%llx", vaddr)) { goto exit; } - + T_DbgSourceLocation loc = {0}; - + if ( ! rd_ipc_parse_b32 (reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_int (reply.msg, str8_lit("vaddr"), &loc.vaddr)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff"), &loc.voff)) { AssertAlways(0); goto exit; } @@ -156,9 +238,9 @@ t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgSourceLocation *loc_out, U64 timeou if ( ! rd_ipc_parse_int (reply.msg, str8_lit("column"), &loc.pt.column)) { AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff_min"), &loc.voff_range.min)){ AssertAlways(0); goto exit; } if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff_max"), &loc.voff_range.max)){ AssertAlways(0); goto exit; } - + if (loc_out != 0) { *loc_out = loc; } - + exit:; scratch_end(scratch); return is_ok; @@ -190,37 +272,37 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) { Temp scratch = scratch_begin(0,0); B32 is_stopped = 0; - + // snapshot status T_DbgStatus status_before = {0}; if (t_dbg_status(&status_before, max_U64) == 0) { Assert(0 && "failed to snapshot status"); goto exit; } - + // send command if (t_dbg_send_cmd(cmd, max_U64, 0, 0) == 0) { Assert(0 && "failed to the command"); goto exit; } - + // wait for debugger to stop U64 t = ENDT_US(timeout_us); for (;;) { // query debugger status T_DbgStatus status = {0}; if (t_dbg_status(&status, t) == 0) { Assert(0 && "failed to acquire debugger status"); goto exit; } - + // did state change? -> break if (!status.running && status.run_gen != status_before.run_gen) { is_stopped = 1; break; } - + // "solve" the wait problem if (now_time_us() >= t) { Assert(0 && "timeout"); goto exit; } sleep_ms(10); } - + //--- Status --------------------- if (0 && is_stopped) { T_DbgStatus status = {0}; AssertAlways(t_dbg_status(&status, T_Dbg_DefaultTimeout)); - + String8 process_id = str8_skip(str8_chop(t_dbg_value_from_exprf(scratch.arena, "query:current_process.id"), 2), 2); String8 process_label = str8_chop(str8_skip(t_dbg_value_from_exprf(scratch.arena, "query:current_process.label"), 2), 2); String8 process_active = t_dbg_value_from_exprf(scratch.arena, "query:current_process.active"); @@ -229,13 +311,13 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) String8 thread_label = str8_skip(str8_chop(t_dbg_value_from_exprf(scratch.arena, "query:current_thread.label"), 2), 2); String8 ip = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rip)"); String8 sp = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rsp)"); - + T_DbgStopEvent last_stop = {0}; AssertAlways(t_dbg_stop_event(scratch.arena, &last_stop, T_Dbg_DefaultTimeout)); - + T_DbgSourceLocation loc = {0}; AssertAlways(t_dbg_src_line(scratch.arena, last_stop.ip_vaddr, &loc, T_Dbg_DefaultTimeout)); - + printf("------------------------------------------------------------------------------------------------------------------------\n"); printf(" Process: %.*s [%.*s] (Active: %.*s)\n", str8_varg(process_id), str8_varg(process_label), str8_varg(process_active)); printf(" Thread: %.*s [%.*s] (Active: %.*s)\n", str8_varg(thread_id), str8_varg(thread_label), str8_varg(thread_active)); @@ -249,7 +331,7 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) fflush(stdout); } //-------------------------------- - + exit:; scratch_end(scratch); return is_stopped; @@ -265,11 +347,11 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) { Temp scratch = scratch_begin(0, 0); B32 dbg_ready = 0; - + String8 user_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_user")); String8 project_path = t_make_file_path(scratch.arena, str8_lit("test.raddbg_project")); cmdline = str8f(scratch.arena, "%S --gen_crash_dump --user:\"%S\" --project:\"%S\" --logs:\"%S\" %S", t_raddbg_path(), user_path, project_path, g_wdir, cmdline); - + // launch debugger ProcessLaunchParams launch_opts = { .path = g_wdir, @@ -279,7 +361,7 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) }; Process dbg_handle = process_launch(&launch_opts); if (process_match(dbg_handle, process_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } - + #if OS_WINDOWS // cache debugger PID g_dbg_pid = GetProcessId((HANDLE)dbg_handle.u64[0]); @@ -288,22 +370,22 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) #else # error NotImplemented #endif - + // close debugger handle process_detach(dbg_handle); - + // now wait for debugger to init U64 t = ENDT_US(timeout_us); for (;;) { // time the ping dbg_ready = t_dbg_ping(t); if (dbg_ready) { break; } - + // "solve" the wait problem if (now_time_us() >= t) { Assert(0 && "timeout"); break; } sleep_ms(10); } - + exit:; scratch_end(scratch); return dbg_ready; @@ -313,18 +395,18 @@ internal B32 t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) { Temp scratch = scratch_begin(&arena, 1); - + RD_IpcReply reply = {0}; String8 cmd = str8f(scratch.arena, "eval %llu %S", /* value char cap: */ 10000, expr); B32 is_ok = t_dbg_send_cmd(cmd, T_Dbg_DefaultTimeout, arena, &reply); - + T_Eval e = {0}; if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { t_errorf("ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } if ( ! rd_ipc_parse_string(reply.msg, str8_lit("value"), &e.value)) { t_errorf("ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } if ( ! rd_ipc_parse_string(reply.msg, str8_lit("type"), &e.type)) { t_errorf("ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } if ( ! rd_ipc_parse_string(reply.msg, str8_lit("error"), &e.error)) { t_errorf("ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } if (eval_out) { *eval_out = e; } - + exit:; scratch_end(scratch); return is_ok; @@ -350,22 +432,22 @@ internal String8 t_string_from_dbg_script_cmd_kind(T_DbgScriptCmdKind v) { switch (v) { - case T_DbgScriptCmdKind_Null: return str8_zero(); - case T_DbgScriptCmdKind_Breakpoint: return str8_lit("bp"); - case T_DbgScriptCmdKind_ClearBreakpoints: return str8_lit("bp_clear"); - case T_DbgScriptCmdKind_Run: return str8_lit("run"); - case T_DbgScriptCmdKind_Halt: return str8_lit("halt"); - case T_DbgScriptCmdKind_StepOver: return str8_lit("step_over"); - case T_DbgScriptCmdKind_StepInto: return str8_lit("step_into"); - case T_DbgScriptCmdKind_StepOut: return str8_lit("step_out"); - case T_DbgScriptCmdKind_StepOverInst: return str8_lit("step_over_inst"); - case T_DbgScriptCmdKind_StepIntoInst: return str8_lit("step_into_inst"); - case T_DbgScriptCmdKind_StepOverLine: return str8_lit("step_over_line"); - case T_DbgScriptCmdKind_StepIntoLine: return str8_lit("step_into_line"); - case T_DbgScriptCmdKind_KillAll: return str8_lit("kill_all"); - case T_DbgScriptCmdKind_At: return str8_lit("at"); - case T_DbgScriptCmdKind_Eval: return str8_lit("eval"); - default: InvalidPath; + case T_DbgScriptCmdKind_Null: return str8_zero(); + case T_DbgScriptCmdKind_Breakpoint: return str8_lit("bp"); + case T_DbgScriptCmdKind_ClearBreakpoints: return str8_lit("bp_clear"); + case T_DbgScriptCmdKind_Run: return str8_lit("run"); + case T_DbgScriptCmdKind_Halt: return str8_lit("halt"); + case T_DbgScriptCmdKind_StepOver: return str8_lit("step_over"); + case T_DbgScriptCmdKind_StepInto: return str8_lit("step_into"); + case T_DbgScriptCmdKind_StepOut: return str8_lit("step_out"); + case T_DbgScriptCmdKind_StepOverInst: return str8_lit("step_over_inst"); + case T_DbgScriptCmdKind_StepIntoInst: return str8_lit("step_into_inst"); + case T_DbgScriptCmdKind_StepOverLine: return str8_lit("step_over_line"); + case T_DbgScriptCmdKind_StepIntoLine: return str8_lit("step_into_line"); + case T_DbgScriptCmdKind_KillAll: return str8_lit("kill_all"); + case T_DbgScriptCmdKind_At: return str8_lit("at"); + case T_DbgScriptCmdKind_Eval: return str8_lit("eval"); + default: InvalidPath; } return str8_zero(); } @@ -386,7 +468,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS B32 is_ok = 0; T_DbgScript script = { .file_path = push_str8_copy(arena, file_path) }; - + // scrape MD comment tokens out of source while preserving original source offsets MD_TokenArray script_tokens = {0}; { @@ -415,11 +497,11 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS } script_tokens = md_token_array_from_chunk_list(scratch.arena, &script_token_chunks); } - + // script tokens -> mdesk tree MD_ParseResult script_parse = md_parse_from_text_tokens(scratch.arena, file_path, source, script_tokens); AssertAlways(script_parse.msgs.worst_message_kind < MD_MsgKind_Error); - + // test { MD_Node *test = script_parse.root->first; @@ -428,32 +510,32 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS for MD_EachNode(n, test->first) { OperatingSystem os = operating_system_from_string(n->string); AssertAlways(os != OperatingSystem_Null); - + for MD_EachNode(field, n->first) { T_DbgScriptDirectiveKind kind = T_DbgScriptDirectiveKind_Null; if (str8_matchi(field->string, str8_lit("compile"))) { kind = T_DbgScriptDirectiveKind_Compile; } else if (str8_matchi(field->string, str8_lit("link"))) { kind = T_DbgScriptDirectiveKind_Link; } else if (str8_matchi(field->string, str8_lit("launch"))) { kind = T_DbgScriptDirectiveKind_Launch; } AssertAlways(kind != T_DbgScriptDirectiveKind_Null); - + // syntax check AssertAlways( !md_node_is_nil(field->first)); AssertAlways(md_node_is_nil(field->first->next)); Assert(field->first->flags & MD_NodeFlag_StringLiteral); - + // src_offset -> line // // TODO: super silly!! mdesk should export line numbers U64 line = 1; String8 text_before_src = str8_prefix(source, field->src_offset); for EachIndex(idx, text_before_src.size) { line += (text_before_src.str[idx] == '\n'); } - + T_DbgScriptDirective *n = push_array(arena, T_DbgScriptDirective, 1); n->kind = kind; n->line = line; n->args = str8_copy(arena, field->first->string); // TODO: expand % in compile: and link: to current source file name and esacpe with %% - + T_DbgScriptDirectiveList *list = &script.directives[os][kind]; SLLQueuePush(list->first, list->last, n); list->count += 1; @@ -464,7 +546,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS goto exit; } } - + // file { MD_Node *last_file = 0; @@ -475,19 +557,19 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS AssertAlways( ! md_node_is_nil(n->first)); AssertAlways(md_node_is_nil(n->first->next)); } - + if (last_file) { // src_offset -> base_line // // TODO: super silly!! mdesk should export line numbers U64 line = 1; for EachIndex(idx, last_file->src_offset) { line += (source.str[idx] == '\n'); } - + String8 sub_source = str8_substr(source, r1u64(last_file->src_offset, is_end ? source.size : n->src_offset)); U64 file_dir_end = str8_find_needle(sub_source, 0, str8_lit("\n"), 0); U64 next_file_dir_begin = str8_find_needle_reverse(sub_source, 0, str8_lit("\n"), n->src_offset); sub_source = str8_substr(sub_source, r1u64(file_dir_end + 1, next_file_dir_begin)); - + T_DbgScriptFile *file = push_array(arena, T_DbgScriptFile, 1); file->path = t_make_file_path(arena, last_file->first->string); file->source = sub_source; @@ -495,11 +577,11 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS SLLQueuePush(script.files.first, script.files.last, file); script.files.count += 1; } - + last_file = n; } } - + // no file directives? assume script file as main source file if (last_file == 0) { T_DbgScriptFile *file = push_array(arena, T_DbgScriptFile, 1); @@ -509,7 +591,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS script.files.count += 1; } } - + // programs { HashTable *ht = hash_table_init(scratch.arena, 256); // @@ -523,7 +605,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS } } AssertAlways(file != 0); - + // src_offset -> line // // TODO: super silly!! mdesk should export line numbers @@ -541,7 +623,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS } else { t_errorf("ERROR: duplicate order number %llu found on line %llu\n", (unsigned long long)order, (unsigned long long)p->line); } - + for MD_EachNode(cmd_n, n->first) { // push new cmd T_DbgScriptCmd *cmd = push_array(arena, T_DbgScriptCmd, 1); @@ -550,7 +632,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS Assert(cmd->kind != T_DbgScriptCmdKind_Null); SLLQueuePush(p->first, p->last, cmd); p->count += 1; - + // parse cmd args MD_Node *cmd_arg = cmd_n->first; if ( ! md_node_is_nil(cmd_arg)) { @@ -565,12 +647,12 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS } } } - + script.program_count = ht->count; script.programs = values_from_hash_table_raw(arena, ht); radsort(script.programs, script.program_count, t_dbg_script_program_is_before); } - + is_ok = 1; exit:; if (script_out) { @@ -584,80 +666,80 @@ internal B32 t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) { Temp scratch = scratch_begin(0,0); - + B32 is_ok = 0; - + for EachIndex(i, script->program_count) { T_DbgScriptProgram *program = script->programs[i]; - + if (program->os == OperatingSystem_CURRENT) { for EachNode(cmd, T_DbgScriptCmd, program->first) { t_infof("[%llu] Command: %S:%llu %S\n", program->order, script->file_path, (unsigned long long)cmd->line, t_string_from_dbg_script_cmd_kind(cmd->kind)); - + switch (cmd->kind) { - case T_DbgScriptCmdKind_Null: break; - case T_DbgScriptCmdKind_Halt: t_dbg_send_cmd_and_wait_stop(str8_lit("halt"), timeout_us); break; // NOTE: does not auto-magically select main thread on stop - case T_DbgScriptCmdKind_StepOver: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over"), timeout_us); break; - case T_DbgScriptCmdKind_StepInto: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into"), timeout_us); break; - case T_DbgScriptCmdKind_StepOut: t_dbg_send_cmd_and_wait_stop(str8_lit("step_out"), timeout_us); break; - case T_DbgScriptCmdKind_StepOverInst: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over_inst"), timeout_us); break; - case T_DbgScriptCmdKind_StepIntoInst: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into_inst"), timeout_us); break; - case T_DbgScriptCmdKind_StepOverLine: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over_line"), timeout_us); break; - case T_DbgScriptCmdKind_StepIntoLine: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into_line"), timeout_us); break; - case T_DbgScriptCmdKind_KillAll: t_dbg_send_cmd_and_wait_stop(str8_lit("kill_all"), timeout_us); break; - case T_DbgScriptCmdKind_Breakpoint: NotImplemented; break; - case T_DbgScriptCmdKind_ClearBreakpoints: t_dbg_send_cmdf(0,0,0, "clear_breakpoints"); break; - case T_DbgScriptCmdKind_Run: t_dbg_send_cmd(str8_lit("run"), timeout_us, 0, 0); break; - case T_DbgScriptCmdKind_At: { - // TODO: debugger does not populate eval cache with registers before first frame, - // so this racy, for now use lower level option + case T_DbgScriptCmdKind_Null: break; + case T_DbgScriptCmdKind_Halt: t_dbg_send_cmd_and_wait_stop(str8_lit("halt"), timeout_us); break; // NOTE: does not auto-magically select main thread on stop + case T_DbgScriptCmdKind_StepOver: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over"), timeout_us); break; + case T_DbgScriptCmdKind_StepInto: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into"), timeout_us); break; + case T_DbgScriptCmdKind_StepOut: t_dbg_send_cmd_and_wait_stop(str8_lit("step_out"), timeout_us); break; + case T_DbgScriptCmdKind_StepOverInst: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over_inst"), timeout_us); break; + case T_DbgScriptCmdKind_StepIntoInst: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into_inst"), timeout_us); break; + case T_DbgScriptCmdKind_StepOverLine: t_dbg_send_cmd_and_wait_stop(str8_lit("step_over_line"), timeout_us); break; + case T_DbgScriptCmdKind_StepIntoLine: t_dbg_send_cmd_and_wait_stop(str8_lit("step_into_line"), timeout_us); break; + case T_DbgScriptCmdKind_KillAll: t_dbg_send_cmd_and_wait_stop(str8_lit("kill_all"), timeout_us); break; + case T_DbgScriptCmdKind_Breakpoint: NotImplemented; break; + case T_DbgScriptCmdKind_ClearBreakpoints: t_dbg_send_cmdf(0,0,0, "clear_breakpoints"); break; + case T_DbgScriptCmdKind_Run: t_dbg_send_cmd(str8_lit("run"), timeout_us, 0, 0); break; + case T_DbgScriptCmdKind_At: { + // TODO: debugger does not populate eval cache with registers before first frame, + // so this racy, for now use lower level option #if 0 - U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); - if (ip == 0) { - fprintf(stderr, "ERROR: invalid IP address: 0x%llx\n", (unsigned long long)ip); - goto exit; - } + U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); + if (ip == 0) { + fprintf(stderr, "ERROR: invalid IP address: 0x%llx\n", (unsigned long long)ip); + goto exit; + } #else - T_DbgStatus temp_status = {0}; - if ( ! t_dbg_status(&temp_status, T_Dbg_DefaultTimeout)) { - t_errorf("ERROR: %S:%llu: failed to query IP\n", script->file_path, (unsigned long long)cmd->line); - goto exit; - } - U64 ip = temp_status.ip; + T_DbgStatus temp_status = {0}; + if ( ! t_dbg_status(&temp_status, T_Dbg_DefaultTimeout)) { + t_errorf("ERROR: %S:%llu: failed to query IP\n", script->file_path, (unsigned long long)cmd->line); + goto exit; + } + U64 ip = temp_status.ip; #endif - - // map IP -> source location - T_DbgSourceLocation loc = {0}; - if (t_dbg_src_line(scratch.arena, ip, &loc, T_Dbg_DefaultTimeout) == 0) { - t_errorf("ERROR: %S:%llu: IP (0x%llx) does not map to a source line\n", script->file_path, (unsigned long long)cmd->line, (unsigned long long)ip); - goto exit; - } - - // compute line where debugger must be - S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta; - U64 at_line_u64 = at_line_s64 >= 0 ? (U64)at_line_s64 : 0; - AssertAlways(at_line_u64 > 0); - - // match expected vs current debugger locations - B32 mismatch = loc.pt.line != at_line_u64 || - !str8_match(loc.file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); - if (mismatch) { - t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, (unsigned long long)cmd->line); - t_errorf(" Expected: %S:%llu\n", program->file->path, (unsigned long long)at_line_u64); - t_errorf(" Got : %S:%llu\n", loc.file_path, (unsigned long long)loc.pt.line); - t_errorf(" IP : 0x%llx\n", (unsigned long long)ip); - goto exit; - } - } break; - case T_DbgScriptCmdKind_Eval: NotImplemented; break; - default: { InvalidPath; } + + // map IP -> source location + T_DbgSourceLocation loc = {0}; + if (t_dbg_src_line(scratch.arena, ip, &loc, T_Dbg_DefaultTimeout) == 0) { + t_errorf("ERROR: %S:%llu: IP (0x%llx) does not map to a source line\n", script->file_path, (unsigned long long)cmd->line, (unsigned long long)ip); + goto exit; + } + + // compute line where debugger must be + S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta; + U64 at_line_u64 = at_line_s64 >= 0 ? (U64)at_line_s64 : 0; + AssertAlways(at_line_u64 > 0); + + // match expected vs current debugger locations + B32 mismatch = loc.pt.line != at_line_u64 || + !str8_match(loc.file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); + if (mismatch) { + t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, (unsigned long long)cmd->line); + t_errorf(" Expected: %S:%llu\n", program->file->path, (unsigned long long)at_line_u64); + t_errorf(" Got : %S:%llu\n", loc.file_path, (unsigned long long)loc.pt.line); + t_errorf(" IP : 0x%llx\n", (unsigned long long)ip); + goto exit; + } + } break; + case T_DbgScriptCmdKind_Eval: NotImplemented; break; + default: { InvalidPath; } } } } - + is_ok = (i+1 == script->program_count); } - + exit:; scratch_end(scratch); return is_ok; @@ -670,20 +752,20 @@ T_RunSig(dbg_script_runner) t_errorf("ERROR: failed to find debugger \"%S\"\n", t_raddbg_path()); T_Ok(0); } - + // read source file String8 source = data_from_file_path(arena, user_data); if (source.size == 0) { t_errorf("ERROR: failed to read script: \"%S\"\n", user_data); T_Ok(0); } - + // source -> script T_DbgScript script = {0}; if ( ! t_dbg_script_from_source(arena, user_data, source, &script)) { goto exit; } - + // write source files to test folder for EachNode(file, T_DbgScriptFile, script.files.first) { if (write_data_to_file_path(file->path, file->source) == 0) { @@ -691,32 +773,32 @@ T_RunSig(dbg_script_runner) T_Ok(0); } } - + // compiler vars HashTable *script_vars = hash_table_init(arena, 1000); hash_table_push_path_string(arena, script_vars, str8_lit("CWD"), g_wdir); - + // run compilers for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Compile].first) { T_Compiler compiler = directive->compile.compiler; - + // pick default compiler if none selected if (compiler == T_Compiler_Null) { switch (OperatingSystem_CURRENT) { - case OperatingSystem_Windows: { compiler = T_Compiler_Cl; } break; - case OperatingSystem_Linux: { compiler = T_Compiler_Clang; } break; + case OperatingSystem_Windows: { compiler = T_Compiler_Cl; } break; + case OperatingSystem_Linux: { compiler = T_Compiler_Clang; } break; } } - + // get compiler path String8 compiler_path = {0}; switch (compiler) { - case T_Compiler_Null: break; - case T_Compiler_Cl: compiler_path = t_cl_path(); break; - case T_Compiler_Clang: compiler_path = t_clang_path(); break; - case T_Compiler_Gcc: compiler_path = t_gcc_path(); break; + case T_Compiler_Null: break; + case T_Compiler_Cl: compiler_path = t_cl_path(); break; + case T_Compiler_Clang: compiler_path = t_clang_path(); break; + case T_Compiler_Gcc: compiler_path = t_gcc_path(); break; } - + // invoke compiler with arguments from directive String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); if (t_invoke(compiler_path, expanded_args, max_U64) == 0) { @@ -730,7 +812,7 @@ T_RunSig(dbg_script_runner) } } } - + // run linkers String8 linker_path = t_radlink_path(); for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Link].first) { @@ -744,7 +826,7 @@ T_RunSig(dbg_script_runner) T_Ok(0); } } - + // launch targets for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Launch].first) { String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); @@ -754,13 +836,13 @@ T_RunSig(dbg_script_runner) T_Ok(0); } } - + // debugger is ready -- now invoke script if (t_dbg_script_invoke(&script, T_Dbg_DefaultTimeout) == 0) { t_errorf("ERROR: %S: failed to run to completion\n", user_data); T_Ok(0); } - + // clean up #if OS_WINDOWS HANDLE dbg_handle = OpenProcess(PROCESS_ALL_ACCESS, 0, g_dbg_pid); @@ -771,7 +853,7 @@ T_RunSig(dbg_script_runner) #else kill(g_dbg_pid, SIGKILL); #endif - + exit:; g_dbg_pid = 0; } @@ -780,31 +862,31 @@ internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path) { Temp scratch = scratch_begin(&arena, 1); - + if ( ! folder_path_exists(folder_path)) { t_errorf("ERROR: this folder does not exists: %S\n", folder_path); return; } - + // gather file paths in a folder String8List paths = t_file_paths_from_dir(arena, folder_path); - + // register a test for each file for EachNode(n, String8Node, paths.first) { String8 file_path = n->string; - + // test files may contain dots for extensions we have to escape them when creating output folder for a test String8List file_name_parts = str8_split_by_string_chars(scratch.arena, str8_skip_last_slash(file_path), str8_lit("."), 0); String8 file_name_escaped = str8_list_join(arena, &file_name_parts, &(StringJoin){.sep=str8_lit("-"), .post = str8_lit("\0") }); - + g_torture_tests_[g_torture_test_count++] = (T_Test){ - .group = T_Group, - .label = (char*)file_name_escaped.str, - .r = t_dbg_script_runner, - .user_data = str8_copy(arena, file_path), + .group = T_Group, + .label = (char*)file_name_escaped.str, + .r = t_dbg_script_runner, + .user_data = str8_copy(arena, file_path), }; } - + scratch_end(scratch); } From c723584bfa09c54ddb38477a1c54f275baab6d96 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 May 2026 14:06:36 -0700 Subject: [PATCH 688/850] send acks always --- src/raddbg/raddbg_core.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 525e4ecb..0a956ad3 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12382,6 +12382,12 @@ rd_frame(void) // rjf: request frame rd_request_frame(); + // rjf: record 'ack' for this command + if(kind != RD_CmdKind_Null) + { + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "ack:{cmd:%S}\n", cmd->name); + } + // rjf: process command CFG_Node *cfg = &cfg_nil_node; String8 dst_path = {0}; From c875c912d20bf5c90ed61f0bfdeac717aeda4e16 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 22 May 2026 13:44:05 -0700 Subject: [PATCH 689/850] update IPC parser --- src/raddbg/raddbg_core.c | 6 +- src/torture/torture_dbg.c | 241 +++++++++++++++++++------------------- src/torture/torture_dbg.h | 37 +++--- 3 files changed, 141 insertions(+), 143 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 0a956ad3..6bd20ab7 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12635,7 +12635,8 @@ rd_frame(void) String8 explanation_string = dr_string_from_fstrs(scratch.arena, &explanation_fstrs); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stop_event:\n {\n"); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " arch: %S\n", string_from_arch(evt.arch)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range: [0x%I64x, 0x%I64x)\n", evt.vaddr_rng.min, evt.vaddr_rng.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range_min: 0x%I64x\n", evt.vaddr_rng.min); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range_max: 0x%I64x\n", evt.vaddr_rng.max); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_vaddr: 0x%I64x\n", evt.rip_vaddr); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stack_base: 0x%I64x\n", evt.stack_base); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " tls_root: 0x%I64x\n", evt.tls_root); @@ -12670,7 +12671,8 @@ rd_frame(void) D_Entity *module = modules.v[idx]; str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " name: \"%S\"\n", escaped_from_raw_str8(scratch.arena, module->string)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range: [0x%I64x, 0x%I64x)\n", module->vaddr_range.min, module->vaddr_range.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range_min: 0x%I64x\n", module->vaddr_range.min); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range_max: 0x%I64x\n", module->vaddr_range.max); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); } str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 2a9f81c0..8df3d966 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -53,6 +53,7 @@ rd_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out) return 0; } +#define rd_ipc_parse_int(n, c, ptr) rd_ipc_parse_int_(n, c, sizeof(*ptr), ptr) internal B32 rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out) { @@ -95,7 +96,7 @@ rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out) internal U32 g_dbg_pid; internal B32 -t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *reply_out) +t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out) { Temp scratch = scratch_begin(&reply_arena, 1); B32 is_sent = 0; @@ -122,16 +123,15 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep if (has_reply) { // parse reply - Arena *a = reply_arena ? reply_arena : scratch.arena; - String8 reply_text = str8_copy(a, g_output); - RD_IpcReply reply = rd_ipc_mdesk_reply_from_string(a, reply_text); - - //fprintf(stderr, "Reply: %.*s\n", str8_varg(reply_text)); + Arena *a = reply_arena ? reply_arena : scratch.arena; + String8 reply_text = str8_copy(a, g_output); + + t_infof("IPC-Reply: \"%S\"\n", reply_text); + MD_ParseResult reply = md_parse_from_text(a, str8_lit("ipc_reply"), reply_text); // validate reply - if (reply.parse.msgs.worst_message_kind >= MD_MsgKind_Error) { goto exit; } - if (md_node_is_nil(reply.msg)) { goto exit; } - //if ( ! str8_matchi(reply.parse.root->first->string, cmd)) { Assert(0); goto exit; } + if (reply.msgs.worst_message_kind >= MD_MsgKind_Error) { goto exit; } + if (md_node_is_nil(reply.root)) { goto exit; } if (reply_arena && reply_out) { *reply_out = reply; } } @@ -143,7 +143,7 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, RD_IpcReply *rep } internal B32 -t_dbg_send_cmdf(U64 timeout_us, Arena *reply_arena, RD_IpcReply *reply_out, char *fmt, ...) +t_dbg_send_cmdf(U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out, char *fmt, ...) { Temp scratch = scratch_begin(&reply_arena, 1); va_list args; @@ -155,92 +155,73 @@ t_dbg_send_cmdf(U64 timeout_us, Arena *reply_arena, RD_IpcReply *reply_out, char return is_ok; } -internal B32 -t_dbg_status(T_DbgStatus *status_out, U64 timeout_us) +internal T_DbgState * +t_dbg_state(Arena *arena, U64 timeout_us) { - Temp scratch = scratch_begin(0, 0); - - B32 is_ok = 0; - T_DbgStatus status = {0}; + Temp scratch = scratch_begin(&arena, 1); + + T_DbgState *result = 0; // send status request - RD_IpcReply reply = {0}; - if ( ! t_dbg_send_cmd(str8_lit("status"), timeout_us, scratch.arena, &reply)) { goto exit; } - + MD_ParseResult reply = {0}; + if ( ! t_dbg_send_cmd(str8_lit("state"), timeout_us, arena ? arena : scratch.arena, &reply)) { goto exit; } + // parse reply - if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("ok"), &is_ok)) { t_errorf("ERROR: failed to parse reply member: ok\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_b32(reply.msg, str8_lit("running"), &status.running)) { t_errorf("ERROR: failed to parse reply member: running\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_int(reply.msg, str8_lit("run_gen"), &status.run_gen)) { t_errorf("ERROR: failed to parse reply member: run_gen\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_int(reply.msg, str8_lit("ip"), &status.ip)) { t_errorf("ERROR: failed to parse reply member: ip\n"); Assert(0); goto exit; } - if (status_out != 0) { *status_out = status; } + MD_Node *state_md = md_child_from_string(reply.root, str8_lit("state"), 0); + MD_Node *stop_event_md = md_child_from_string(state_md, str8_lit("stop_event"), 0); + MD_Node *threads_md = md_child_from_string(state_md, str8_lit("threads"), 0); + MD_Node *modules_md = md_child_from_string(state_md, str8_lit("modules"), 0); + T_DbgState v = {0}; + if (!rd_ipc_parse_int(state_md, str8_lit("running"), &v.running)) { Assert(0); goto exit; } + if (!rd_ipc_parse_int(state_md, str8_lit("run_gen"), &v.run_gen)) { Assert(0); goto exit; } + if (!rd_ipc_parse_int(state_md, str8_lit("ip"), &v.ip)) { Assert(0); goto exit; } + result = push_array(arena, T_DbgState, 1); + *result = v; exit:; - if ( ! is_ok && reply.parse.root) { - t_errorf("\tReply: %S\n", reply.parse.root->raw_string); - } - scratch_end(scratch); - return is_ok; + return result; } internal B32 -t_dbg_stop_event(Arena *arena, T_DbgStopEvent *out, U64 timeout_us) -{ - Temp scratch = scratch_begin(0, 0); - - T_DbgStopEvent v = {0}; - B32 is_ok = 0; - - // send status request - RD_IpcReply reply = {0}; - if ( ! t_dbg_send_cmd(str8_lit("stop_event"), timeout_us, arena ? arena : scratch.arena, &reply)) { goto exit; } - - // parse reply - if ( ! rd_ipc_parse_b32 (reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("arch"), &v.arch)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("vaddr_min"), &v.vaddr_min)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("vaddr_max"), &v.vaddr_max)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("ip_vaddr"), &v.ip_vaddr)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("sp_base"), &v.sp_base)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_root"), &v.tls_root)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_index"), &v.tls_index)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_offset"), &v.tls_offset)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("timestamp"), &v.timestamp)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("exception_code"), &v.exception_code)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("bp_flags"), &v.bp_flags)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_string (reply.msg, str8_lit("string"), &v.string)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("target_os"), &v.target_os)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("tls_model"), &v.tls_model)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_string (reply.msg, str8_lit("stop_cause"), &v.stop_cause)) { AssertAlways(0); goto exit; } - - if (arena && out != 0) { *out = v; } - - exit:; - return is_ok; -} - -internal B32 -t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgSourceLocation *loc_out, U64 timeout_us) +t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_us) { Temp scratch = scratch_begin(&arena, 1); B32 is_ok = 0; - RD_IpcReply reply = {0}; - if(!t_dbg_send_cmdf(timeout_us, arena, &reply, "source_location_from_address 0x%llx", vaddr)) { goto exit; } - - T_DbgSourceLocation loc = {0}; - - if ( ! rd_ipc_parse_b32 (reply.msg, str8_lit("ok"), &is_ok)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("vaddr"), &loc.vaddr)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff"), &loc.voff)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("file_path"), &loc.file_path)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("line"), &loc.pt.line)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("column"), &loc.pt.column)) { AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff_min"), &loc.voff_range.min)){ AssertAlways(0); goto exit; } - if ( ! rd_ipc_parse_int (reply.msg, str8_lit("voff_max"), &loc.voff_range.max)){ AssertAlways(0); goto exit; } - - if (loc_out != 0) { *loc_out = loc; } + // send line map request + MD_ParseResult reply = {0}; + if(!t_dbg_send_cmdf(timeout_us, arena, &reply, "line_from_vaddr 0x%llx", vaddr)) { goto exit; } + + // parse reply + MD_Node *lines_md = md_child_from_string(reply.root, str8_lit("lines"), 0); + + typedef struct Node { struct Node *next; T_DbgLine v; } Node; + Node *first_line = 0, *last_line = 0; + U64 line_count = 0; + for MD_EachNode(n, lines_md->first) { + T_DbgLine line = {0}; + if ( ! rd_ipc_parse_string(lines_md, str8_lit("file_path"), &line.file_path)) { Assert(0); goto exit; } + if ( ! rd_ipc_parse_int(lines_md, str8_lit("line_num"), &line.line_num)) { Assert(0); goto exit; } + if ( ! rd_ipc_parse_int(lines_md, str8_lit("column_num"), &line.column_num)) { Assert(0); goto exit; } + if ( ! rd_ipc_parse_int(lines_md, str8_lit("voff_range_min"), &line.voff_range.min)) { Assert(0); goto exit; } + if ( ! rd_ipc_parse_int(lines_md, str8_lit("voff_range_max"), &line.voff_range.max)) { Assert(0); goto exit; } + + Node *n = push_array(scratch.arena, Node, 1); + n->v = line; + SLLQueuePush(first_line, last_line, n); + line_count += 1; + } + + if (lines_out && line_count > 0) { + lines_out->count = 0; + lines_out->v = push_array(arena, T_DbgLine, line_count); + for EachNode(n, Node, first_line) { + lines_out->v[lines_out->count++] = n->v; + } + } + is_ok = 1; exit:; scratch_end(scratch); return is_ok; @@ -274,8 +255,8 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) B32 is_stopped = 0; // snapshot status - T_DbgStatus status_before = {0}; - if (t_dbg_status(&status_before, max_U64) == 0) { Assert(0 && "failed to snapshot status"); goto exit; } + T_DbgState *status_before = t_dbg_state(scratch.arena, max_U64); + if (status_before == 0) { Assert(0 && "failed to snapshot status"); goto exit; } // send command if (t_dbg_send_cmd(cmd, max_U64, 0, 0) == 0) { Assert(0 && "failed to the command"); goto exit; } @@ -284,11 +265,11 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) U64 t = ENDT_US(timeout_us); for (;;) { // query debugger status - T_DbgStatus status = {0}; - if (t_dbg_status(&status, t) == 0) { Assert(0 && "failed to acquire debugger status"); goto exit; } + T_DbgState *status = t_dbg_state(scratch.arena, t); + if (status == 0) { Assert(0 && "failed to acquire debugger status"); goto exit; } // did state change? -> break - if (!status.running && status.run_gen != status_before.run_gen) { + if (!status->running && status->run_gen != status_before->run_gen) { is_stopped = 1; break; } @@ -300,8 +281,7 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) //--- Status --------------------- if (0 && is_stopped) { - T_DbgStatus status = {0}; - AssertAlways(t_dbg_status(&status, T_Dbg_DefaultTimeout)); + T_DbgState *state = t_dbg_state(scratch.arena, T_Dbg_DefaultTimeout); String8 process_id = str8_skip(str8_chop(t_dbg_value_from_exprf(scratch.arena, "query:current_process.id"), 2), 2); String8 process_label = str8_chop(str8_skip(t_dbg_value_from_exprf(scratch.arena, "query:current_process.label"), 2), 2); @@ -312,22 +292,26 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) String8 ip = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rip)"); String8 sp = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rsp)"); - T_DbgStopEvent last_stop = {0}; - AssertAlways(t_dbg_stop_event(scratch.arena, &last_stop, T_Dbg_DefaultTimeout)); + T_DbgState *last_stop = t_dbg_state(scratch.arena, T_Dbg_DefaultTimeout); + AssertAlways(last_stop); - T_DbgSourceLocation loc = {0}; - AssertAlways(t_dbg_src_line(scratch.arena, last_stop.ip_vaddr, &loc, T_Dbg_DefaultTimeout)); + T_DbgLineArray lines = {0}; + AssertAlways(t_dbg_src_line(scratch.arena, last_stop->ip_vaddr, &lines, T_Dbg_DefaultTimeout)); - printf("------------------------------------------------------------------------------------------------------------------------\n"); - printf(" Process: %.*s [%.*s] (Active: %.*s)\n", str8_varg(process_id), str8_varg(process_label), str8_varg(process_active)); - printf(" Thread: %.*s [%.*s] (Active: %.*s)\n", str8_varg(thread_id), str8_varg(thread_label), str8_varg(thread_active)); - printf(" IP: %.*s\n", str8_varg(ip)); - printf(" SP: %.*s\n", str8_varg(sp)); - printf(" File Path: %.*s\n", str8_varg(loc.file_path)); - printf(" Line: %lld\n", (long long)loc.pt.line); - printf(" Column: %lld\n", (long long)loc.pt.column); - printf(" Run Gen: %llu\n", (unsigned long long)status.run_gen); - printf(" Stop Cause: \"%.*s\"\n", str8_varg(last_stop.stop_cause)); + t_infof("------------------------------------------------------------------------------------------------------------------------\n"); + t_infof(" Process: %.*s [%.*s] (Active: %.*s)\n", str8_varg(process_id), str8_varg(process_label), str8_varg(process_active)); + t_infof(" Thread: %.*s [%.*s] (Active: %.*s)\n", str8_varg(thread_id), str8_varg(thread_label), str8_varg(thread_active)); + t_infof(" IP: %.*s\n", str8_varg(ip)); + t_infof(" SP: %.*s\n", str8_varg(sp)); + t_infof(" Run Gen: %llu\n", (unsigned long long)state->run_gen); + t_infof(" Stop Cause: \"%.*s\"\n", str8_varg(last_stop->stop_cause)); + for EachIndex(i, lines.count) { + t_infof(" {\n"); + t_infof(" File Path: %.*s\n", str8_varg(lines.v[i].file_path)); + t_infof(" Line: %lld\n", (long long)lines.v[i].line_num); + t_infof(" Column: %lld\n", (long long)lines.v[i].column_num); + t_infof(" }\n"); + } fflush(stdout); } //-------------------------------- @@ -337,7 +321,15 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) return is_stopped; } -internal B32 t_dbg_ping (U64 timeout_us) { return t_dbg_status(0, timeout_us); } +internal B32 +t_dbg_ping(U64 timeout_us) +{ + Temp scratch = scratch_begin(0,0); + T_DbgState *state = t_dbg_state(scratch.arena, timeout_us); + B32 did_reply = state != 0; + scratch_end(scratch); + return did_reply; +} internal B32 t_dbg_bp_add_line(String8 file, U64 line) { return t_dbg_send_cmdf(0,0,0, "add_breakpoint \"%S\":%llu", file, line); } internal B32 t_dbg_bp_add_func(String8 func_name) { return t_dbg_send_cmdf(0,0,0, "add_function_breakpoint %S", func_name); } internal B32 t_dbg_bp_add_addr(U64 addr) { return t_dbg_send_cmdf(0,0,0, "add_address_breakpoint 0x%llx", addr); } @@ -396,15 +388,15 @@ t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) { Temp scratch = scratch_begin(&arena, 1); - RD_IpcReply reply = {0}; - String8 cmd = str8f(scratch.arena, "eval %llu %S", /* value char cap: */ 10000, expr); - B32 is_ok = t_dbg_send_cmd(cmd, T_Dbg_DefaultTimeout, arena, &reply); + MD_ParseResult reply = {0}; + String8 cmd = str8f(scratch.arena, "eval %llu %S", /* value char cap: */ 10000, expr); + B32 is_ok = t_dbg_send_cmd(cmd, T_Dbg_DefaultTimeout, arena, &reply); T_Eval e = {0}; - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("expr"), &e.expr)) { t_errorf("ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("value"), &e.value)) { t_errorf("ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("type"), &e.type)) { t_errorf("ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.msg, str8_lit("error"), &e.error)) { t_errorf("ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.root, str8_lit("expr"), &e.expr)) { t_errorf("ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.root, str8_lit("value"), &e.value)) { t_errorf("ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.root, str8_lit("type"), &e.type)) { t_errorf("ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(reply.root, str8_lit("error"), &e.error)) { t_errorf("ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } if (eval_out) { *eval_out = e; } exit:; @@ -700,17 +692,17 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) goto exit; } #else - T_DbgStatus temp_status = {0}; - if ( ! t_dbg_status(&temp_status, T_Dbg_DefaultTimeout)) { + T_DbgState *temp_status = t_dbg_state(scratch.arena, T_Dbg_DefaultTimeout); + if (temp_status == 0) { t_errorf("ERROR: %S:%llu: failed to query IP\n", script->file_path, (unsigned long long)cmd->line); goto exit; } - U64 ip = temp_status.ip; + U64 ip = temp_status->ip; #endif // map IP -> source location - T_DbgSourceLocation loc = {0}; - if (t_dbg_src_line(scratch.arena, ip, &loc, T_Dbg_DefaultTimeout) == 0) { + T_DbgLineArray lines = {0}; + if (t_dbg_src_line(scratch.arena, ip, &lines, T_Dbg_DefaultTimeout) == 0) { t_errorf("ERROR: %S:%llu: IP (0x%llx) does not map to a source line\n", script->file_path, (unsigned long long)cmd->line, (unsigned long long)ip); goto exit; } @@ -721,14 +713,17 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) AssertAlways(at_line_u64 > 0); // match expected vs current debugger locations - B32 mismatch = loc.pt.line != at_line_u64 || - !str8_match(loc.file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); - if (mismatch) { - t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, (unsigned long long)cmd->line); - t_errorf(" Expected: %S:%llu\n", program->file->path, (unsigned long long)at_line_u64); - t_errorf(" Got : %S:%llu\n", loc.file_path, (unsigned long long)loc.pt.line); - t_errorf(" IP : 0x%llx\n", (unsigned long long)ip); - goto exit; + + for EachIndex(i, lines.count) { + B32 mismatch = lines.v[i].line_num != at_line_u64 || + !str8_match(lines.v[i].file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); + if (mismatch) { + t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, (unsigned long long)cmd->line); + t_errorf(" Expected: %S:%llu\n", program->file->path, (unsigned long long)at_line_u64); + t_errorf(" Got : %S:%llu\n", lines.v[i].file_path, (unsigned long long)lines.v[i].line_num); + t_errorf(" IP : 0x%llx\n", (unsigned long long)ip); + goto exit; + } } } break; case T_DbgScriptCmdKind_Eval: NotImplemented; break; diff --git a/src/torture/torture_dbg.h b/src/torture/torture_dbg.h index c61f878d..1f22a318 100644 --- a/src/torture/torture_dbg.h +++ b/src/torture/torture_dbg.h @@ -116,22 +116,9 @@ typedef struct typedef struct { - B32 running; - U64 run_gen; - U64 ip; -} T_DbgStatus; - -typedef struct -{ - U64 vaddr; - U64 voff; - String8 file_path; - TxtPt pt; - Rng1U64 voff_range; -} T_DbgSourceLocation; - -typedef struct -{ + B32 running; + U64 run_gen; + U64 ip; Arch arch; U64 vaddr_min; U64 vaddr_max; @@ -147,7 +134,21 @@ typedef struct OperatingSystem target_os; U64 tls_model; String8 stop_cause; -} T_DbgStopEvent; +} T_DbgState; + +typedef struct +{ + String8 file_path; + U64 line_num; + U64 column_num; + Rng1U64 voff_range; +} T_DbgLine; + +typedef struct +{ + U64 count; + T_DbgLine *v; +} T_DbgLineArray; typedef struct { @@ -180,5 +181,5 @@ internal B32 t_dbg_step_into_line(U64 timeout_us); internal B32 t_dbg_launch(String8 cmdline, U64 timeout_us); internal B32 t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out); // TODO: need a source location query in eval -internal B32 t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgSourceLocation *loc_out, U64 timeout_us); +internal B32 t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines, U64 timeout_us); From e06e7f1c9f85be30d16b616029ad53d989f6b75d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 22 May 2026 14:11:13 -0700 Subject: [PATCH 690/850] split voff_range into two fields --- src/raddbg/raddbg_core.c | 3 ++- src/torture/torture_dbg.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 6bd20ab7..5a098328 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12722,7 +12722,8 @@ rd_frame(void) str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " file_path: \"%S\"\n", line.file_path); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " line_num: %I64d\n", line.pt.line); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " column_num: %I64d\n", line.pt.column); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range: [0x%I64x, 0x%I64x)\n", line.voff_range.min, line.voff_range.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range_min: 0x%I64x\n", line.voff_range.min); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range_max: 0x%I64x\n", line.voff_range.max); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); } str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "}\n"); diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 8df3d966..9b8b9bc0 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -172,9 +172,9 @@ t_dbg_state(Arena *arena, U64 timeout_us) MD_Node *threads_md = md_child_from_string(state_md, str8_lit("threads"), 0); MD_Node *modules_md = md_child_from_string(state_md, str8_lit("modules"), 0); T_DbgState v = {0}; - if (!rd_ipc_parse_int(state_md, str8_lit("running"), &v.running)) { Assert(0); goto exit; } - if (!rd_ipc_parse_int(state_md, str8_lit("run_gen"), &v.run_gen)) { Assert(0); goto exit; } - if (!rd_ipc_parse_int(state_md, str8_lit("ip"), &v.ip)) { Assert(0); goto exit; } + if (!rd_ipc_parse_int(state_md, str8_lit("running"), &v.running)) { t_infof("INFO: 'state' is missing 'running'\n"); goto exit; } + if (!rd_ipc_parse_int(state_md, str8_lit("run_gen"), &v.run_gen)) { t_infof("INFO: 'state' is missing 'run_gen'\n"); goto exit; } + if (!rd_ipc_parse_int(state_md, str8_lit("ip"), &v.ip)) { t_infof("INFO: 'state' is missing 'ip'\n"); goto exit; } result = push_array(arena, T_DbgState, 1); *result = v; @@ -201,11 +201,11 @@ t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_u U64 line_count = 0; for MD_EachNode(n, lines_md->first) { T_DbgLine line = {0}; - if ( ! rd_ipc_parse_string(lines_md, str8_lit("file_path"), &line.file_path)) { Assert(0); goto exit; } - if ( ! rd_ipc_parse_int(lines_md, str8_lit("line_num"), &line.line_num)) { Assert(0); goto exit; } - if ( ! rd_ipc_parse_int(lines_md, str8_lit("column_num"), &line.column_num)) { Assert(0); goto exit; } - if ( ! rd_ipc_parse_int(lines_md, str8_lit("voff_range_min"), &line.voff_range.min)) { Assert(0); goto exit; } - if ( ! rd_ipc_parse_int(lines_md, str8_lit("voff_range_max"), &line.voff_range.max)) { Assert(0); goto exit; } + if ( ! rd_ipc_parse_string(n, str8_lit("file_path"), &line.file_path)) { t_infof("INFO: 'lines' is missing 'file_path'\n"); goto exit; } + if ( ! rd_ipc_parse_int(n, str8_lit("line_num"), &line.line_num)) { t_infof("INFO: 'lines' is missing 'line_num'\n"); goto exit; } + if ( ! rd_ipc_parse_int(n, str8_lit("column_num"), &line.column_num)) { t_infof("INFO: 'lines' is missing 'column_num'\n"); goto exit; } + if ( ! rd_ipc_parse_int(n, str8_lit("voff_range_min"), &line.voff_range.min)) { t_infof("INFO: 'lines' is missing 'voff_range_min'\n"); goto exit; } + if ( ! rd_ipc_parse_int(n, str8_lit("voff_range_max"), &line.voff_range.max)) { t_infof("INFO: 'lines' is missing 'voff_range_max'\n"); goto exit; } Node *n = push_array(scratch.arena, Node, 1); n->v = line; From b1d58fb4f99aa27f79b009f35784008eabedbaf8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 22 May 2026 14:38:52 -0700 Subject: [PATCH 691/850] skip DWARF line table and checksum tests --- .github/workflows/builds.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index a675df2b..ffcc4f4d 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -8,6 +8,10 @@ on: paths-ignore: - '**.md' +# TODO: fix skips +env: + TORTURE_FLAGS: "--gen_crash_dump -s:d2r::d2r_line_table,d2r::d2r_checksums" + jobs: build-ubuntu-24-04: runs-on: ubuntu-24.04 @@ -94,7 +98,7 @@ jobs: - name: Run shell: bash run: | - CC="${{ matrix.compiler }}" ./run.sh clang "${{ matrix.mode }}" -- --gen_crash_dump + CC="${{ matrix.compiler }}" ./run.sh clang "${{ matrix.mode }}" -- $TORTURE_FLAGS - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 @@ -126,7 +130,7 @@ jobs: run: | for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do set "VS_INSTALL=%%i" call "%VS_INSTALL%\VC\Auxiliary\Build\vcvarsall.bat" x64 - call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- --gen_crash_dump || exit /b 1 + call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- %TORTURE_FLAGS% || exit /b 1 - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 From 3715021e0e313ee64bf8738bbc35304028f47be3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 22 May 2026 15:18:36 -0700 Subject: [PATCH 692/850] do not assume nonzero namespace table slots --- src/rdi_from_pdb/rdi_from_pdb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 560ce4a1..f3632ffa 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -396,7 +396,7 @@ internal RDIM_BakeParams p2r_convert(Arena *arena, P2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); - + Arena *scratch_conflicts[2] = { scratch.arena, arena }; ////////////////////////////////////////////////////////////// @@ -2045,6 +2045,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: find all unique namespaces on this lane U64 namespace_slots_count = (U64)itype_opl / lane_count(); + namespace_slots_count = Max(1, namespace_slots_count); String8Node **namespace_slots = push_array(scratch2.arena, String8Node *, namespace_slots_count); U64 namespace_count = 0; Rng1U64 range = lane_range(itype_opl); @@ -2170,6 +2171,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(lane_idx() == 0) { all_namespace_slots_count = *total_namespace_count_ptr / 3; + all_namespace_slots_count = Max(all_namespace_slots_count, 1); all_namespace_slots = push_array(scratch.arena, P2R_NamespaceNode *, all_namespace_slots_count); for EachIndex(l_idx, lane_count()) { From 3a7586e84b1efc5cd6d9d1950d627ca28bd40b0a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 22 May 2026 18:09:16 -0700 Subject: [PATCH 693/850] export line and column numbers from MD --- src/mdesk/mdesk.c | 168 ++++++++++++++++++++++--------------- src/mdesk/mdesk.h | 6 +- src/torture/torture_main.c | 1 + src/torture/torture_md.c | 146 ++++++++++++++++++++++++++++++++ 4 files changed, 253 insertions(+), 68 deletions(-) create mode 100644 src/torture/torture_md.c diff --git a/src/mdesk/mdesk.c b/src/mdesk/mdesk.c index efe2a52f..cab21d42 100644 --- a/src/mdesk/mdesk.c +++ b/src/mdesk/mdesk.c @@ -185,7 +185,7 @@ md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 //- rjf: tree building internal MD_Node * -md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset) +md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset, U64 line_num, U64 col_num) { MD_Node *node = push_array(arena, MD_Node, 1); node->first = node->last = node->parent = node->next = node->prev = node->first_tag = node->last_tag = &md_nil_node; @@ -194,6 +194,8 @@ md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, node->string = string; node->raw_string = raw_string; node->src_offset = src_offset; + node->line_num = line_num; + node->col_num = col_num; return node; } @@ -522,9 +524,24 @@ md_tokenize_from_text(Arena *arena, String8 text) Temp scratch = scratch_begin(&arena, 1); MD_TokenChunkList tokens = {0}; MD_MsgList msgs = {0}; + U8 *byte_first = text.str; U8 *byte_opl = byte_first + text.size; U8 *byte = byte_first; + + U64 line_num = 1; + U64 col_num = 1; + +#define Advance(n) do { \ + for(U64 i = 0; i < n && byte < byte_opl; i += 1) { \ + if(*byte == '\n') { \ + line_num += 1; \ + col_num = 0; \ + } \ + col_num += 1; \ + byte += 1; \ + } \ +} while(0) //- rjf: scan string & produce tokens for(;byte < byte_opl;) @@ -532,22 +549,22 @@ md_tokenize_from_text(Arena *arena, String8 text) MD_TokenFlags token_flags = 0; U8 *token_start = 0; U8 *token_opl = 0; + + U64 token_line_num = line_num; + U64 token_col_num = col_num; //- rjf: whitespace if(token_flags == 0 && (*byte == ' ' || *byte == '\t' || *byte == '\v' || *byte == '\r')) { token_flags = MD_TokenFlag_Whitespace; token_start = byte; - token_opl = byte; - byte += 1; - for(;byte <= byte_opl; byte += 1) + + for(; byte < byte_opl && (*byte == ' ' || *byte == '\t' || *byte == '\v' || *byte == '\r');) { - token_opl += 1; - if(byte == byte_opl || (*byte != ' ' && *byte != '\t' && *byte != '\v' && *byte != '\r')) - { - break; - } + Advance(1); } + + token_opl = byte; } //- rjf: newlines @@ -555,8 +572,8 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Newline; token_start = byte; - token_opl = byte+1; - byte += 1; + Advance(1); + token_opl = byte; } //- rjf: single-line comments @@ -564,16 +581,11 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Comment; token_start = byte; - token_opl = byte+2; - byte += 2; + Advance(2); + B32 escaped = 0; - for(;byte <= byte_opl; byte += 1) + for(;byte < byte_opl;) { - token_opl += 1; - if(byte == byte_opl) - { - break; - } if(escaped) { escaped = 0; @@ -589,7 +601,10 @@ md_tokenize_from_text(Arena *arena, String8 text) escaped = 1; } } + Advance(1); } + + token_opl = byte; } //- rjf: multi-line comments @@ -597,22 +612,27 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Comment; token_start = byte; - token_opl = byte+2; - byte += 2; - for(;byte <= byte_opl; byte += 1) + + Advance(2); + + B32 missing_close = 1; + for(;byte < byte_opl;) { - token_opl += 1; - if(byte == byte_opl) - { - token_flags |= MD_TokenFlag_BrokenComment; - break; - } if(byte+1 < byte_opl && byte[0] == '*' && byte[1] == '/') { - token_opl += 2; + missing_close = 0; + Advance(2); break; } + Advance(1); } + + if(missing_close) + { + token_flags |= MD_TokenFlag_BrokenComment; + } + + token_opl = byte; } //- rjf: identifiers @@ -623,11 +643,11 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Identifier; token_start = byte; - token_opl = byte; - byte += 1; - for(;byte <= byte_opl; byte += 1) + + Advance(1); + + for(;byte <= byte_opl; ) { - token_opl += 1; if(byte == byte_opl || (!('A' <= *byte && *byte <= 'Z') && !('a' <= *byte && *byte <= 'z') && @@ -637,7 +657,10 @@ md_tokenize_from_text(Arena *arena, String8 text) { break; } + Advance(1); } + + token_opl = byte; } //- rjf: numerics @@ -648,11 +671,11 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Numeric; token_start = byte; - token_opl = byte; - byte += 1; - for(;byte <= byte_opl; byte += 1) + + Advance(1); + + for(;byte <= byte_opl;) { - token_opl += 1; if(byte == byte_opl || (!('A' <= *byte && *byte <= 'Z') && !('a' <= *byte && *byte <= 'z') && @@ -662,7 +685,10 @@ md_tokenize_from_text(Arena *arena, String8 text) { break; } + Advance(1); } + + token_opl = byte; } //- rjf: triplet string literals @@ -677,9 +703,10 @@ md_tokenize_from_text(Arena *arena, String8 text) token_flags |= (literal_style == '"')*MD_TokenFlag_StringDoubleQuote; token_flags |= (literal_style == '`')*MD_TokenFlag_StringTick; token_start = byte; - token_opl = byte+3; - byte += 3; - for(;byte <= byte_opl; byte += 1) + + Advance(3); + + for(;byte <= byte_opl;) { if(byte == byte_opl) { @@ -689,11 +716,14 @@ md_tokenize_from_text(Arena *arena, String8 text) } if(byte+2 < byte_opl && (byte[0] == literal_style && byte[1] == literal_style && byte[2] == literal_style)) { - byte += 3; - token_opl = byte; + Advance(3); break; } + + Advance(1); } + + token_opl = byte; } //- rjf: singlet string literals @@ -705,14 +735,14 @@ md_tokenize_from_text(Arena *arena, String8 text) token_flags |= (literal_style == '"')*MD_TokenFlag_StringDoubleQuote; token_flags |= (literal_style == '`')*MD_TokenFlag_StringTick; token_start = byte; - token_opl = byte+1; - byte += 1; + + Advance(1); + B32 escaped = 0; - for(;byte <= byte_opl; byte += 1) + for(;byte <= byte_opl;) { if(byte == byte_opl || *byte == '\n') { - token_opl = byte; token_flags |= MD_TokenFlag_BrokenStringLiteral; break; } @@ -722,15 +752,17 @@ md_tokenize_from_text(Arena *arena, String8 text) } else if(!escaped && byte[0] == literal_style) { - token_opl = byte+1; - byte += 1; + Advance(1); break; } else if(escaped) { escaped = 0; } + Advance(1); } + + token_opl = byte; } //- rjf: non-reserved symbols @@ -741,11 +773,9 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Symbol; token_start = byte; - token_opl = byte; - byte += 1; - for(;byte <= byte_opl; byte += 1) + Advance(1); + for(;byte <= byte_opl;) { - token_opl += 1; if(byte == byte_opl || (*byte != '~' && *byte != '!' && *byte != '$' && *byte != '%' && *byte != '^' && *byte != '&' && *byte != '*' && *byte != '-' && *byte != '=' && *byte != '+' && @@ -754,7 +784,9 @@ md_tokenize_from_text(Arena *arena, String8 text) { break; } + Advance(1); } + token_opl = byte; } //- rjf: reserved symbols @@ -764,8 +796,8 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Reserved; token_start = byte; - token_opl = byte+1; - byte += 1; + Advance(1); + token_opl = byte; } //- rjf: bad characters in all other cases @@ -773,21 +805,21 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_BadCharacter; token_start = byte; - token_opl = byte+1; - byte += 1; + Advance(1); + token_opl = byte; } //- rjf; push token if formed if(token_flags != 0 && token_start != 0 && token_opl > token_start) { - MD_Token token = {{(U64)(token_start - byte_first), (U64)(token_opl - byte_first)}, token_flags}; + MD_Token token = {{(U64)(token_start - byte_first), (U64)(token_opl - byte_first)}, token_flags, token_line_num, token_col_num}; md_token_chunk_list_push(scratch.arena, &tokens, 4096, token); } //- rjf: push errors on unterminated comments if(token_flags & MD_TokenFlag_BrokenComment) { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first, token_line_num, token_col_num); String8 error_string = str8_lit("Unterminated comment."); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); } @@ -795,11 +827,13 @@ md_tokenize_from_text(Arena *arena, String8 text) //- rjf: push errors on unterminated strings if(token_flags & MD_TokenFlag_BrokenStringLiteral) { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first, token_line_num, token_col_num); String8 error_string = str8_lit("Unterminated string literal."); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); } } + +#undef Advance //- rjf: bake, fill & return MD_TokenizeResult result = {0}; @@ -821,7 +855,7 @@ md_parse_from_text_tokens(Arena *arena, String8 filename, String8 text, MD_Token //- rjf: set up outputs MD_MsgList msgs = {0}; - MD_Node *root = md_push_node(arena, MD_NodeKind_File, 0, filename, text, 0); + MD_Node *root = md_push_node(arena, MD_NodeKind_File, 0, filename, text, 0, 0, 0); //- rjf: set up parse rule stack typedef enum MD_ParseWorkKind @@ -942,7 +976,7 @@ if(work_top == 0) {work_top = &broken_work;}\ str8_match(token_string, str8_lit("\\"), 0) || str8_match(token_string, str8_lit(":"), 0))) { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min, token->line_num, token->col_num); String8 error_string = push_str8f(arena, "Unexpected reserved symbol \"%S\".", token_string); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); token += 1; @@ -956,7 +990,7 @@ if(work_top == 0) {work_top = &broken_work;}\ if(token+1 >= tokens_opl || !(token[1].flags & MD_TokenGroup_Label)) { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min, token->line_num, token->col_num); String8 error_string = str8_lit("Tag label expected after @ symbol."); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); token += 1; @@ -966,7 +1000,7 @@ if(work_top == 0) {work_top = &broken_work;}\ { String8 tag_name_raw = str8_substr(text, token[1].range); String8 tag_name = md_content_string_from_token_flags_str8(token[1].flags, tag_name_raw); - MD_Node *node = md_push_node(arena, MD_NodeKind_Tag, md_node_flags_from_token_flags(token[1].flags), tag_name, tag_name_raw, token[0].range.min); + MD_Node *node = md_push_node(arena, MD_NodeKind_Tag, md_node_flags_from_token_flags(token[1].flags), tag_name, tag_name_raw, token[0].range.min, token[0].line_num, token[0].col_num); DLLPushBack_NPZ(&md_nil_node, work_top->first_gathered_tag, work_top->last_gathered_tag, node, next, prev); if(token+2 < tokens_opl && token[2].flags & MD_TokenFlag_Reserved && (str8_match(str8_substr(text, token[2].range), str8_lit("("), 0) || @@ -992,7 +1026,7 @@ if(work_top == 0) {work_top = &broken_work;}\ String8 node_string = md_content_string_from_token_flags_str8(token->flags, node_string_raw); MD_NodeFlags flags = md_node_flags_from_token_flags(token->flags)|work_top->gathered_node_flags; work_top->gathered_node_flags = 0; - MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, node_string, node_string_raw, token[0].range.min); + MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, node_string, node_string_raw, token[0].range.min, token[0].line_num, token[0].col_num); node->first_tag = work_top->first_gathered_tag; node->last_tag = work_top->last_gathered_tag; for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next) @@ -1017,7 +1051,7 @@ if(work_top == 0) {work_top = &broken_work;}\ flags |= MD_NodeFlag_HasBracketLeft*!!str8_match(token_string, str8_lit("["), 0); flags |= MD_NodeFlag_HasParenLeft*!!str8_match(token_string, str8_lit("("), 0); work_top->gathered_node_flags = 0; - MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, str8_lit(""), str8_lit(""), token[0].range.min); + MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, str8_lit(""), str8_lit(""), token[0].range.min, token[0].line_num, token[0].col_num); node->first_tag = work_top->first_gathered_tag; node->last_tag = work_top->last_gathered_tag; for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next) @@ -1080,7 +1114,7 @@ if(work_top == 0) {work_top = &broken_work;}\ if(work_top->counted_newlines >= 2) { MD_Node *node = work_top->parent; - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min, token->line_num, token->col_num); String8 error_string = push_str8f(arena, "More than two newlines following \"%S\", which has implicitly-delimited children, resulting in an empty list of children.", node->string); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Warning, error_string); MD_ParseWorkPop(); @@ -1121,7 +1155,7 @@ if(work_top == 0) {work_top = &broken_work;}\ //- rjf: no consumption -> unexpected token! we don't know what to do with this. { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min, token->line_num, token->col_num); String8 error_string = push_str8f(arena, "Unexpected \"%S\" token.", token_string); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); token += 1; diff --git a/src/mdesk/mdesk.h b/src/mdesk/mdesk.h index e7a55473..984c471b 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -86,6 +86,8 @@ struct MD_Token { Rng1U64 range; MD_TokenFlags flags; + U64 line_num; + U64 col_num; }; typedef struct MD_TokenChunkNode MD_TokenChunkNode; @@ -182,6 +184,8 @@ struct MD_Node // rjf: source code info U64 src_offset; + U64 line_num; + U64 col_num; // rjf: user-controlled generation number // @@ -284,7 +288,7 @@ internal MD_NodeRec md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root #define md_node_rec_depth_first_pre_rev(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, last), OffsetOf(MD_Node, prev)) //- rjf: tree building -internal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset); +internal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset, U64 line_num, U64 col_num); internal void md_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node); internal void md_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node); internal void md_node_push_child(MD_Node *parent, MD_Node *node); diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 04f3ba3e..f6f505b9 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -168,6 +168,7 @@ #include "torture.c" #include "torture_base.c" +#include "torture_md.c" #include "torture_radlink.c" #include "torture_dwarf.c" #include "torture_d2r.c" diff --git a/src/torture/torture_md.c b/src/torture/torture_md.c new file mode 100644 index 00000000..58eac35c --- /dev/null +++ b/src/torture/torture_md.c @@ -0,0 +1,146 @@ +#define T_Group "MD" + +TEST(md_tokenizer) +{ + MD_TokenizeResult result; + + // empty + result = md_tokenize_from_text(arena, str8_lit("")); + T_Ok(result.tokens.count == 0); + T_Ok(result.msgs.count == 0); + + // identifiers + char *ids[] = { + "a", + "abc", + "_", + "_abc", + "abc123", + "abc_def123", + }; + for EachElement(i, ids) { + String8 in = str8_cstring(ids[i]); + result = md_tokenize_from_text(arena, in); + + T_Ok(result.tokens.count == 1); + T_Ok(result.tokens.v[0].range.min == 0); + T_Ok(result.tokens.v[0].range.max == in.size); + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Identifier); + T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Identifier) == 0); + T_Ok(result.tokens.v[0].line_num == 1); + T_Ok(result.tokens.v[0].col_num == 1); + T_Ok(result.msgs.count == 0); + } + + // numerics + char *numerics[] = { + "0", + "123", + "123.456", + ".5", + "-1", + "-123.45" + "123_abc", + "1.2.3", + }; + for EachElement(i, numerics) { + String8 in = str8_cstring(numerics[i]); + result = md_tokenize_from_text(arena, in); + + T_Ok(result.tokens.count == 1); + T_Ok(result.tokens.v[0].range.min == 0); + T_Ok(result.tokens.v[0].range.max == in.size); + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Numeric); + T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Numeric) == 0); + T_Ok(result.tokens.v[0].line_num == 1); + T_Ok(result.tokens.v[0].col_num == 1); + T_Ok(result.msgs.count == 0); + } + + // comments + char *good_comments[] = { + "/**/", + "/* */", + "/* abc */", + "/* ** */", + "/**/", + "/**************/", + "/*abc*/", + "//foo", + "// bar", + "//" + }; + B32 good_comments_passed = 0; + for EachElement(i, good_comments) { + String8 in = str8_cstring(good_comments[i]); + result = md_tokenize_from_text(arena, in); + + T_Ok(result.tokens.count == 1); + T_Ok(dim_1u64(result.tokens.v[0].range) == in.size); + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Comment); + T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Comment) == 0); + T_Ok(result.tokens.v[0].line_num == 1); + T_Ok(result.tokens.v[0].col_num == 1); + T_Ok(result.msgs.count == 0); + } + + char *broken_comments[] = { + "/*", + "/*/", + }; + for EachElement(i, broken_comments) { + String8 in = str8_cstring(broken_comments[i]); + result = md_tokenize_from_text(arena, in); + T_Ok(result.msgs.worst_message_kind == MD_MsgKind_Error); + T_Ok(result.msgs.count > 0); + } + + // unterminated string + result = md_tokenize_from_text(arena, str8_lit("\"abc\nc")); + T_Ok(result.msgs.worst_message_kind == MD_MsgKind_Error); + T_Ok(result.msgs.count > 0); + + // terminated string + // + // TODO: strings with \n in the middle are not correctly tokenized + result = md_tokenize_from_text(arena, str8_lit("\"abc\"")); + T_Ok(result.msgs.count == 0); + + // line column tracking + { + result = md_tokenize_from_text(arena, str8_lit("a\nb")); + T_Ok(result.tokens.count == 3); + + // verify 'a' + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Identifier); + T_Ok(result.tokens.v[0].line_num == 1); + T_Ok(result.tokens.v[0].col_num == 1); + + // verify '\n' + T_Ok(result.tokens.v[1].flags & MD_TokenFlag_Newline); + T_Ok(result.tokens.v[1].line_num == 1); + T_Ok(result.tokens.v[1].col_num == 2); + + // verify 'b' + T_Ok(result.tokens.v[2].flags & MD_TokenFlag_Identifier); + T_Ok(result.tokens.v[2].line_num == 2); + T_Ok(result.tokens.v[2].col_num == 1); + } + { + result = md_tokenize_from_text(arena, str8_lit(" abc")); + T_Ok(result.tokens.count == 2); + T_Ok(result.msgs.count == 0); + + // verify white space + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Whitespace); + T_Ok(result.tokens.v[0].line_num == 1); + T_Ok(result.tokens.v[0].col_num == 1); + + // verify identifier + T_Ok(result.tokens.v[1].flags & MD_TokenFlag_Identifier); + T_Ok(result.tokens.v[1].line_num == 1); + T_Ok(result.tokens.v[1].col_num == 5); + } +} + +#undef T_Group From 96c1ca549ce44b25ff2b201193f25be33c6afb83 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 23 May 2026 12:14:41 -0700 Subject: [PATCH 694/850] Revert "export line and column numbers from MD" This reverts commit 29becc3bfa6037a1ba5c5657f891a65a819b0997. --- src/mdesk/mdesk.c | 172 +++++++++++++++---------------------- src/mdesk/mdesk.h | 6 +- src/torture/torture_main.c | 1 - src/torture/torture_md.c | 146 ------------------------------- 4 files changed, 70 insertions(+), 255 deletions(-) delete mode 100644 src/torture/torture_md.c diff --git a/src/mdesk/mdesk.c b/src/mdesk/mdesk.c index cab21d42..efe2a52f 100644 --- a/src/mdesk/mdesk.c +++ b/src/mdesk/mdesk.c @@ -185,7 +185,7 @@ md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 //- rjf: tree building internal MD_Node * -md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset, U64 line_num, U64 col_num) +md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset) { MD_Node *node = push_array(arena, MD_Node, 1); node->first = node->last = node->parent = node->next = node->prev = node->first_tag = node->last_tag = &md_nil_node; @@ -194,8 +194,6 @@ md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, node->string = string; node->raw_string = raw_string; node->src_offset = src_offset; - node->line_num = line_num; - node->col_num = col_num; return node; } @@ -524,24 +522,9 @@ md_tokenize_from_text(Arena *arena, String8 text) Temp scratch = scratch_begin(&arena, 1); MD_TokenChunkList tokens = {0}; MD_MsgList msgs = {0}; - U8 *byte_first = text.str; U8 *byte_opl = byte_first + text.size; U8 *byte = byte_first; - - U64 line_num = 1; - U64 col_num = 1; - -#define Advance(n) do { \ - for(U64 i = 0; i < n && byte < byte_opl; i += 1) { \ - if(*byte == '\n') { \ - line_num += 1; \ - col_num = 0; \ - } \ - col_num += 1; \ - byte += 1; \ - } \ -} while(0) //- rjf: scan string & produce tokens for(;byte < byte_opl;) @@ -549,22 +532,22 @@ md_tokenize_from_text(Arena *arena, String8 text) MD_TokenFlags token_flags = 0; U8 *token_start = 0; U8 *token_opl = 0; - - U64 token_line_num = line_num; - U64 token_col_num = col_num; //- rjf: whitespace if(token_flags == 0 && (*byte == ' ' || *byte == '\t' || *byte == '\v' || *byte == '\r')) { token_flags = MD_TokenFlag_Whitespace; token_start = byte; - - for(; byte < byte_opl && (*byte == ' ' || *byte == '\t' || *byte == '\v' || *byte == '\r');) - { - Advance(1); - } - token_opl = byte; + byte += 1; + for(;byte <= byte_opl; byte += 1) + { + token_opl += 1; + if(byte == byte_opl || (*byte != ' ' && *byte != '\t' && *byte != '\v' && *byte != '\r')) + { + break; + } + } } //- rjf: newlines @@ -572,8 +555,8 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Newline; token_start = byte; - Advance(1); - token_opl = byte; + token_opl = byte+1; + byte += 1; } //- rjf: single-line comments @@ -581,11 +564,16 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Comment; token_start = byte; - Advance(2); - + token_opl = byte+2; + byte += 2; B32 escaped = 0; - for(;byte < byte_opl;) + for(;byte <= byte_opl; byte += 1) { + token_opl += 1; + if(byte == byte_opl) + { + break; + } if(escaped) { escaped = 0; @@ -601,10 +589,7 @@ md_tokenize_from_text(Arena *arena, String8 text) escaped = 1; } } - Advance(1); } - - token_opl = byte; } //- rjf: multi-line comments @@ -612,27 +597,22 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Comment; token_start = byte; - - Advance(2); - - B32 missing_close = 1; - for(;byte < byte_opl;) + token_opl = byte+2; + byte += 2; + for(;byte <= byte_opl; byte += 1) { - if(byte+1 < byte_opl && byte[0] == '*' && byte[1] == '/') + token_opl += 1; + if(byte == byte_opl) { - missing_close = 0; - Advance(2); + token_flags |= MD_TokenFlag_BrokenComment; + break; + } + if(byte+1 < byte_opl && byte[0] == '*' && byte[1] == '/') + { + token_opl += 2; break; } - Advance(1); } - - if(missing_close) - { - token_flags |= MD_TokenFlag_BrokenComment; - } - - token_opl = byte; } //- rjf: identifiers @@ -643,11 +623,11 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Identifier; token_start = byte; - - Advance(1); - - for(;byte <= byte_opl; ) + token_opl = byte; + byte += 1; + for(;byte <= byte_opl; byte += 1) { + token_opl += 1; if(byte == byte_opl || (!('A' <= *byte && *byte <= 'Z') && !('a' <= *byte && *byte <= 'z') && @@ -657,10 +637,7 @@ md_tokenize_from_text(Arena *arena, String8 text) { break; } - Advance(1); } - - token_opl = byte; } //- rjf: numerics @@ -671,11 +648,11 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Numeric; token_start = byte; - - Advance(1); - - for(;byte <= byte_opl;) + token_opl = byte; + byte += 1; + for(;byte <= byte_opl; byte += 1) { + token_opl += 1; if(byte == byte_opl || (!('A' <= *byte && *byte <= 'Z') && !('a' <= *byte && *byte <= 'z') && @@ -685,10 +662,7 @@ md_tokenize_from_text(Arena *arena, String8 text) { break; } - Advance(1); } - - token_opl = byte; } //- rjf: triplet string literals @@ -703,10 +677,9 @@ md_tokenize_from_text(Arena *arena, String8 text) token_flags |= (literal_style == '"')*MD_TokenFlag_StringDoubleQuote; token_flags |= (literal_style == '`')*MD_TokenFlag_StringTick; token_start = byte; - - Advance(3); - - for(;byte <= byte_opl;) + token_opl = byte+3; + byte += 3; + for(;byte <= byte_opl; byte += 1) { if(byte == byte_opl) { @@ -716,14 +689,11 @@ md_tokenize_from_text(Arena *arena, String8 text) } if(byte+2 < byte_opl && (byte[0] == literal_style && byte[1] == literal_style && byte[2] == literal_style)) { - Advance(3); + byte += 3; + token_opl = byte; break; } - - Advance(1); } - - token_opl = byte; } //- rjf: singlet string literals @@ -735,14 +705,14 @@ md_tokenize_from_text(Arena *arena, String8 text) token_flags |= (literal_style == '"')*MD_TokenFlag_StringDoubleQuote; token_flags |= (literal_style == '`')*MD_TokenFlag_StringTick; token_start = byte; - - Advance(1); - + token_opl = byte+1; + byte += 1; B32 escaped = 0; - for(;byte <= byte_opl;) + for(;byte <= byte_opl; byte += 1) { if(byte == byte_opl || *byte == '\n') { + token_opl = byte; token_flags |= MD_TokenFlag_BrokenStringLiteral; break; } @@ -752,17 +722,15 @@ md_tokenize_from_text(Arena *arena, String8 text) } else if(!escaped && byte[0] == literal_style) { - Advance(1); + token_opl = byte+1; + byte += 1; break; } else if(escaped) { escaped = 0; } - Advance(1); } - - token_opl = byte; } //- rjf: non-reserved symbols @@ -773,9 +741,11 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Symbol; token_start = byte; - Advance(1); - for(;byte <= byte_opl;) + token_opl = byte; + byte += 1; + for(;byte <= byte_opl; byte += 1) { + token_opl += 1; if(byte == byte_opl || (*byte != '~' && *byte != '!' && *byte != '$' && *byte != '%' && *byte != '^' && *byte != '&' && *byte != '*' && *byte != '-' && *byte != '=' && *byte != '+' && @@ -784,9 +754,7 @@ md_tokenize_from_text(Arena *arena, String8 text) { break; } - Advance(1); } - token_opl = byte; } //- rjf: reserved symbols @@ -796,8 +764,8 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_Reserved; token_start = byte; - Advance(1); - token_opl = byte; + token_opl = byte+1; + byte += 1; } //- rjf: bad characters in all other cases @@ -805,21 +773,21 @@ md_tokenize_from_text(Arena *arena, String8 text) { token_flags = MD_TokenFlag_BadCharacter; token_start = byte; - Advance(1); - token_opl = byte; + token_opl = byte+1; + byte += 1; } //- rjf; push token if formed if(token_flags != 0 && token_start != 0 && token_opl > token_start) { - MD_Token token = {{(U64)(token_start - byte_first), (U64)(token_opl - byte_first)}, token_flags, token_line_num, token_col_num}; + MD_Token token = {{(U64)(token_start - byte_first), (U64)(token_opl - byte_first)}, token_flags}; md_token_chunk_list_push(scratch.arena, &tokens, 4096, token); } //- rjf: push errors on unterminated comments if(token_flags & MD_TokenFlag_BrokenComment) { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first, token_line_num, token_col_num); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first); String8 error_string = str8_lit("Unterminated comment."); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); } @@ -827,13 +795,11 @@ md_tokenize_from_text(Arena *arena, String8 text) //- rjf: push errors on unterminated strings if(token_flags & MD_TokenFlag_BrokenStringLiteral) { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first, token_line_num, token_col_num); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(""), str8_lit(""), token_start - byte_first); String8 error_string = str8_lit("Unterminated string literal."); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); } } - -#undef Advance //- rjf: bake, fill & return MD_TokenizeResult result = {0}; @@ -855,7 +821,7 @@ md_parse_from_text_tokens(Arena *arena, String8 filename, String8 text, MD_Token //- rjf: set up outputs MD_MsgList msgs = {0}; - MD_Node *root = md_push_node(arena, MD_NodeKind_File, 0, filename, text, 0, 0, 0); + MD_Node *root = md_push_node(arena, MD_NodeKind_File, 0, filename, text, 0); //- rjf: set up parse rule stack typedef enum MD_ParseWorkKind @@ -976,7 +942,7 @@ if(work_top == 0) {work_top = &broken_work;}\ str8_match(token_string, str8_lit("\\"), 0) || str8_match(token_string, str8_lit(":"), 0))) { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min, token->line_num, token->col_num); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); String8 error_string = push_str8f(arena, "Unexpected reserved symbol \"%S\".", token_string); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); token += 1; @@ -990,7 +956,7 @@ if(work_top == 0) {work_top = &broken_work;}\ if(token+1 >= tokens_opl || !(token[1].flags & MD_TokenGroup_Label)) { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min, token->line_num, token->col_num); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); String8 error_string = str8_lit("Tag label expected after @ symbol."); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); token += 1; @@ -1000,7 +966,7 @@ if(work_top == 0) {work_top = &broken_work;}\ { String8 tag_name_raw = str8_substr(text, token[1].range); String8 tag_name = md_content_string_from_token_flags_str8(token[1].flags, tag_name_raw); - MD_Node *node = md_push_node(arena, MD_NodeKind_Tag, md_node_flags_from_token_flags(token[1].flags), tag_name, tag_name_raw, token[0].range.min, token[0].line_num, token[0].col_num); + MD_Node *node = md_push_node(arena, MD_NodeKind_Tag, md_node_flags_from_token_flags(token[1].flags), tag_name, tag_name_raw, token[0].range.min); DLLPushBack_NPZ(&md_nil_node, work_top->first_gathered_tag, work_top->last_gathered_tag, node, next, prev); if(token+2 < tokens_opl && token[2].flags & MD_TokenFlag_Reserved && (str8_match(str8_substr(text, token[2].range), str8_lit("("), 0) || @@ -1026,7 +992,7 @@ if(work_top == 0) {work_top = &broken_work;}\ String8 node_string = md_content_string_from_token_flags_str8(token->flags, node_string_raw); MD_NodeFlags flags = md_node_flags_from_token_flags(token->flags)|work_top->gathered_node_flags; work_top->gathered_node_flags = 0; - MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, node_string, node_string_raw, token[0].range.min, token[0].line_num, token[0].col_num); + MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, node_string, node_string_raw, token[0].range.min); node->first_tag = work_top->first_gathered_tag; node->last_tag = work_top->last_gathered_tag; for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next) @@ -1051,7 +1017,7 @@ if(work_top == 0) {work_top = &broken_work;}\ flags |= MD_NodeFlag_HasBracketLeft*!!str8_match(token_string, str8_lit("["), 0); flags |= MD_NodeFlag_HasParenLeft*!!str8_match(token_string, str8_lit("("), 0); work_top->gathered_node_flags = 0; - MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, str8_lit(""), str8_lit(""), token[0].range.min, token[0].line_num, token[0].col_num); + MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, str8_lit(""), str8_lit(""), token[0].range.min); node->first_tag = work_top->first_gathered_tag; node->last_tag = work_top->last_gathered_tag; for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next) @@ -1114,7 +1080,7 @@ if(work_top == 0) {work_top = &broken_work;}\ if(work_top->counted_newlines >= 2) { MD_Node *node = work_top->parent; - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min, token->line_num, token->col_num); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); String8 error_string = push_str8f(arena, "More than two newlines following \"%S\", which has implicitly-delimited children, resulting in an empty list of children.", node->string); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Warning, error_string); MD_ParseWorkPop(); @@ -1155,7 +1121,7 @@ if(work_top == 0) {work_top = &broken_work;}\ //- rjf: no consumption -> unexpected token! we don't know what to do with this. { - MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min, token->line_num, token->col_num); + MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min); String8 error_string = push_str8f(arena, "Unexpected \"%S\" token.", token_string); md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string); token += 1; diff --git a/src/mdesk/mdesk.h b/src/mdesk/mdesk.h index 984c471b..e7a55473 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -86,8 +86,6 @@ struct MD_Token { Rng1U64 range; MD_TokenFlags flags; - U64 line_num; - U64 col_num; }; typedef struct MD_TokenChunkNode MD_TokenChunkNode; @@ -184,8 +182,6 @@ struct MD_Node // rjf: source code info U64 src_offset; - U64 line_num; - U64 col_num; // rjf: user-controlled generation number // @@ -288,7 +284,7 @@ internal MD_NodeRec md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root #define md_node_rec_depth_first_pre_rev(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, last), OffsetOf(MD_Node, prev)) //- rjf: tree building -internal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset, U64 line_num, U64 col_num); +internal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset); internal void md_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node); internal void md_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node); internal void md_node_push_child(MD_Node *parent, MD_Node *node); diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index f6f505b9..04f3ba3e 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -168,7 +168,6 @@ #include "torture.c" #include "torture_base.c" -#include "torture_md.c" #include "torture_radlink.c" #include "torture_dwarf.c" #include "torture_d2r.c" diff --git a/src/torture/torture_md.c b/src/torture/torture_md.c deleted file mode 100644 index 58eac35c..00000000 --- a/src/torture/torture_md.c +++ /dev/null @@ -1,146 +0,0 @@ -#define T_Group "MD" - -TEST(md_tokenizer) -{ - MD_TokenizeResult result; - - // empty - result = md_tokenize_from_text(arena, str8_lit("")); - T_Ok(result.tokens.count == 0); - T_Ok(result.msgs.count == 0); - - // identifiers - char *ids[] = { - "a", - "abc", - "_", - "_abc", - "abc123", - "abc_def123", - }; - for EachElement(i, ids) { - String8 in = str8_cstring(ids[i]); - result = md_tokenize_from_text(arena, in); - - T_Ok(result.tokens.count == 1); - T_Ok(result.tokens.v[0].range.min == 0); - T_Ok(result.tokens.v[0].range.max == in.size); - T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Identifier); - T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Identifier) == 0); - T_Ok(result.tokens.v[0].line_num == 1); - T_Ok(result.tokens.v[0].col_num == 1); - T_Ok(result.msgs.count == 0); - } - - // numerics - char *numerics[] = { - "0", - "123", - "123.456", - ".5", - "-1", - "-123.45" - "123_abc", - "1.2.3", - }; - for EachElement(i, numerics) { - String8 in = str8_cstring(numerics[i]); - result = md_tokenize_from_text(arena, in); - - T_Ok(result.tokens.count == 1); - T_Ok(result.tokens.v[0].range.min == 0); - T_Ok(result.tokens.v[0].range.max == in.size); - T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Numeric); - T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Numeric) == 0); - T_Ok(result.tokens.v[0].line_num == 1); - T_Ok(result.tokens.v[0].col_num == 1); - T_Ok(result.msgs.count == 0); - } - - // comments - char *good_comments[] = { - "/**/", - "/* */", - "/* abc */", - "/* ** */", - "/**/", - "/**************/", - "/*abc*/", - "//foo", - "// bar", - "//" - }; - B32 good_comments_passed = 0; - for EachElement(i, good_comments) { - String8 in = str8_cstring(good_comments[i]); - result = md_tokenize_from_text(arena, in); - - T_Ok(result.tokens.count == 1); - T_Ok(dim_1u64(result.tokens.v[0].range) == in.size); - T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Comment); - T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Comment) == 0); - T_Ok(result.tokens.v[0].line_num == 1); - T_Ok(result.tokens.v[0].col_num == 1); - T_Ok(result.msgs.count == 0); - } - - char *broken_comments[] = { - "/*", - "/*/", - }; - for EachElement(i, broken_comments) { - String8 in = str8_cstring(broken_comments[i]); - result = md_tokenize_from_text(arena, in); - T_Ok(result.msgs.worst_message_kind == MD_MsgKind_Error); - T_Ok(result.msgs.count > 0); - } - - // unterminated string - result = md_tokenize_from_text(arena, str8_lit("\"abc\nc")); - T_Ok(result.msgs.worst_message_kind == MD_MsgKind_Error); - T_Ok(result.msgs.count > 0); - - // terminated string - // - // TODO: strings with \n in the middle are not correctly tokenized - result = md_tokenize_from_text(arena, str8_lit("\"abc\"")); - T_Ok(result.msgs.count == 0); - - // line column tracking - { - result = md_tokenize_from_text(arena, str8_lit("a\nb")); - T_Ok(result.tokens.count == 3); - - // verify 'a' - T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Identifier); - T_Ok(result.tokens.v[0].line_num == 1); - T_Ok(result.tokens.v[0].col_num == 1); - - // verify '\n' - T_Ok(result.tokens.v[1].flags & MD_TokenFlag_Newline); - T_Ok(result.tokens.v[1].line_num == 1); - T_Ok(result.tokens.v[1].col_num == 2); - - // verify 'b' - T_Ok(result.tokens.v[2].flags & MD_TokenFlag_Identifier); - T_Ok(result.tokens.v[2].line_num == 2); - T_Ok(result.tokens.v[2].col_num == 1); - } - { - result = md_tokenize_from_text(arena, str8_lit(" abc")); - T_Ok(result.tokens.count == 2); - T_Ok(result.msgs.count == 0); - - // verify white space - T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Whitespace); - T_Ok(result.tokens.v[0].line_num == 1); - T_Ok(result.tokens.v[0].col_num == 1); - - // verify identifier - T_Ok(result.tokens.v[1].flags & MD_TokenFlag_Identifier); - T_Ok(result.tokens.v[1].line_num == 1); - T_Ok(result.tokens.v[1].col_num == 5); - } -} - -#undef T_Group From 769bda0ed8d2bba6e6114b2afee9ba1a2aadfb06 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 23 May 2026 12:16:01 -0700 Subject: [PATCH 695/850] restore torture mdesk tests --- src/torture/torture_main.c | 1 + src/torture/torture_md.c | 130 +++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 src/torture/torture_md.c diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 04f3ba3e..f6f505b9 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -168,6 +168,7 @@ #include "torture.c" #include "torture_base.c" +#include "torture_md.c" #include "torture_radlink.c" #include "torture_dwarf.c" #include "torture_d2r.c" diff --git a/src/torture/torture_md.c b/src/torture/torture_md.c new file mode 100644 index 00000000..7b87e7ed --- /dev/null +++ b/src/torture/torture_md.c @@ -0,0 +1,130 @@ +#define T_Group "MD" + +TEST(md_tokenizer) +{ + MD_TokenizeResult result; + + // empty + result = md_tokenize_from_text(arena, str8_lit("")); + T_Ok(result.tokens.count == 0); + T_Ok(result.msgs.count == 0); + + // identifiers + char *ids[] = { + "a", + "abc", + "_", + "_abc", + "abc123", + "abc_def123", + }; + for EachElement(i, ids) { + String8 in = str8_cstring(ids[i]); + result = md_tokenize_from_text(arena, in); + + T_Ok(result.tokens.count == 1); + T_Ok(result.tokens.v[0].range.min == 0); + T_Ok(result.tokens.v[0].range.max == in.size); + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Identifier); + T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Identifier) == 0); + T_Ok(result.msgs.count == 0); + } + + // numerics + char *numerics[] = { + "0", + "123", + "123.456", + ".5", + "-1", + "-123.45" + "123_abc", + "1.2.3", + }; + for EachElement(i, numerics) { + String8 in = str8_cstring(numerics[i]); + result = md_tokenize_from_text(arena, in); + + T_Ok(result.tokens.count == 1); + T_Ok(result.tokens.v[0].range.min == 0); + T_Ok(result.tokens.v[0].range.max == in.size); + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Numeric); + T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Numeric) == 0); + T_Ok(result.msgs.count == 0); + } + + // comments + char *good_comments[] = { + "/**/", + "/* */", + "/* abc */", + "/* ** */", + "/**/", + "/**************/", + "/*abc*/", + "//foo", + "// bar", + "//" + }; + B32 good_comments_passed = 0; + for EachElement(i, good_comments) { + String8 in = str8_cstring(good_comments[i]); + result = md_tokenize_from_text(arena, in); + + T_Ok(result.tokens.count == 1); + T_Ok(dim_1u64(result.tokens.v[0].range) == in.size); + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Comment); + T_Ok((result.tokens.v[0].flags & ~MD_TokenFlag_Comment) == 0); + T_Ok(result.msgs.count == 0); + } + + char *broken_comments[] = { + "/*", + "/*/", + }; + for EachElement(i, broken_comments) { + String8 in = str8_cstring(broken_comments[i]); + result = md_tokenize_from_text(arena, in); + T_Ok(result.msgs.worst_message_kind == MD_MsgKind_Error); + T_Ok(result.msgs.count > 0); + } + + // unterminated string + result = md_tokenize_from_text(arena, str8_lit("\"abc\nc")); + T_Ok(result.msgs.worst_message_kind == MD_MsgKind_Error); + T_Ok(result.msgs.count > 0); + + // terminated string + // + // TODO: strings with \n in the middle are not correctly tokenized + result = md_tokenize_from_text(arena, str8_lit("\"abc\"")); + T_Ok(result.msgs.count == 0); + + // line column tracking + { + result = md_tokenize_from_text(arena, str8_lit("a\nb")); + T_Ok(result.tokens.count == 3); + + // verify 'a' + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Identifier); + + // verify '\n' + T_Ok(result.tokens.v[1].flags & MD_TokenFlag_Newline); + + // verify 'b' + T_Ok(result.tokens.v[2].flags & MD_TokenFlag_Identifier); + } + { + result = md_tokenize_from_text(arena, str8_lit(" abc")); + T_Ok(result.tokens.count == 2); + T_Ok(result.msgs.count == 0); + + // verify white space + T_Ok(result.tokens.v[0].flags & MD_TokenFlag_Whitespace); + + // verify identifier + T_Ok(result.tokens.v[1].flags & MD_TokenFlag_Identifier); + } +} + +#undef T_Group From a21a2563338436302a027334d5f0637d5d8fef62 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 22 May 2026 21:48:34 -0700 Subject: [PATCH 696/850] .gitattributes --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 4fc1dfa1..5281f032 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ *.sh text=auto eol=lf src/lib_rdi/rdi.h text=auto eol=lf src/lib_rdi/rdi.c text=auto eol=lf -generated/*.meta.* text=auto eol=lf +*.meta.* text=auto eol=lf From fe2778133f544369d1eef01398e1e8aa3f5af7b6 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 23 May 2026 18:31:02 -0700 Subject: [PATCH 697/850] rework file directive handling; remove T_Group; add SKIP to disable tests that are not passing; change command line syntax for easier test run/skip/force; updated help; shortened --dbg_graphical -> --gui; add 'skip' directive to the dbg scripts --- .github/workflows/builds.yml | 3 +- run.bat | 1 + run.sh | 4 + src/linker/hash_table.c | 4 +- src/torture/dbg_tests/step_into_for_goto.c | 25 ++ .../dbg_tests/step_into_lazy_module_func.c | 32 +- src/torture/torture.c | 323 ++++++++++-------- src/torture/torture.h | 54 ++- src/torture/torture_base.c | 3 - src/torture/torture_d2r.c | 7 +- src/torture/torture_dbg.c | 323 +++++++++++------- src/torture/torture_dbg.h | 41 ++- src/torture/torture_dwarf.c | 3 - src/torture/torture_md.c | 2 +- src/torture/torture_p2r.c | 4 - src/torture/torture_radlink.c | 5 +- 16 files changed, 494 insertions(+), 340 deletions(-) create mode 100644 src/torture/dbg_tests/step_into_for_goto.c diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index ffcc4f4d..31b8afbd 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -8,9 +8,8 @@ on: paths-ignore: - '**.md' -# TODO: fix skips env: - TORTURE_FLAGS: "--gen_crash_dump -s:d2r::d2r_line_table,d2r::d2r_checksums" + TORTURE_FLAGS: "* --gen_crash_dump" jobs: build-ubuntu-24-04: diff --git a/run.bat b/run.bat index 43a26831..a0f79b2e 100644 --- a/run.bat +++ b/run.bat @@ -27,6 +27,7 @@ if "%TORTURE_ARGS:~0,3%" == "-- " set "TORTURE_ARGS=%TORTURE_ARGS:~3%" && goto p set "TORTURE_ARGS=%TORTURE_ARGS:* -- =%" :parse_done +if not defined TORTURE_ARGS set "TORTURE_ARGS=* for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( setlocal diff --git a/run.sh b/run.sh index 39191afc..b7cb00c8 100755 --- a/run.sh +++ b/run.sh @@ -38,6 +38,10 @@ while [[ $# -gt 0 ]]; do esac done +if [[ "${#torture_args[@]}" == "0" ]]; then + torture_args=("*") +fi + for m in "${mode_values[@]}"; do for c in "${cc_values[@]}"; do # nuke artifacts from last run diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index a47e8929..48534e14 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -926,7 +926,9 @@ internal void * keys_from_hash_map_raw ( Arena *arena, HashMap *hm) { retur // values force_inline HASH_MAP_EXTRACT_FUNC(hash_map_extract_value_u64) { MemoryCopy(buffer, &kv->value.value_u64, sizeof(kv->value.value_u64)); } -internal U64 * values_from_hash_map_u64(Arena *arena, HashMap *hm) { return hash_map_extract(arena, hm, 0, 0, hash_map_extract_value_u64, sizeof(U64)).values; } +force_inline HASH_MAP_EXTRACT_FUNC(hash_map_extract_value_raw) { MemoryCopy(buffer, &kv->value.value_raw, sizeof(kv->value.value_raw)); } +internal U64 * values_from_hash_map_u64(Arena *arena, HashMap *hm) { return hash_map_extract(arena, hm, 0, 0, hash_map_extract_value_u64, sizeof(U64)).values; } +internal void * values_from_hash_map_raw(Arena *arena, HashMap *hm) {return hash_map_extract(arena, hm, 0, 0, hash_map_extract_value_raw, sizeof(void *)).values; } //////////////////////////////// diff --git a/src/torture/dbg_tests/step_into_for_goto.c b/src/torture/dbg_tests/step_into_for_goto.c new file mode 100644 index 00000000..5ff09613 --- /dev/null +++ b/src/torture/dbg_tests/step_into_for_goto.c @@ -0,0 +1,25 @@ +/// test: { +/// windows: { +/// skip: "" +/// compile: { +/// cc: "clang" +/// args: "-O0 -g -o main.exe %FILE%" +/// } +/// launch: "main.exe" +/// } +/// linux: { +/// skip: "" +/// compile: "-O0 -g -o main %FILE%" +/// launch: "./main" +/// } +/// } + +int main() +{ /// 1: { step_into step_into } + for (int i = 0; i < 1; /// 2: step_into + ++i, ({ goto exit; })) { /// 4: step_into + int x = 0; /// 3: step_into + } + exit:; +} /// 5: at + diff --git a/src/torture/dbg_tests/step_into_lazy_module_func.c b/src/torture/dbg_tests/step_into_lazy_module_func.c index 07a6b089..fe289ba1 100644 --- a/src/torture/dbg_tests/step_into_lazy_module_func.c +++ b/src/torture/dbg_tests/step_into_lazy_module_func.c @@ -1,20 +1,22 @@ // TODO: step into alg needs to detect that it is about to step into a thunk and place breakpoint, respective to OS, // where thunk calls into resolved function -// -// test: { -// windows: { -// compile: "/Od /Z7 /c main.c module.c" -// link: "/fixed /debug:full /dll module.obj" -// link: "/fixed /debug:full /entry:main kernel32.lib module.lib delayimp.lib main.obj /out:main.exe /delayload:module.dll /incremental:no" -// launch: "main.exe" -// } -// linux: { -// compile: "-O0 -g module.c -fPIC -shared -o libmodule.so" -// compile: "-O0 -g main.c -L. -lmodule -o main -Wl,-rpath,%CWD%" -// launch: "./main" -// } -// } -// + +/// test: { +/// windows: { +/// skip: "" +/// compile: "/Od /Z7 /c main.c module.c" +/// link: "/fixed /debug:full /dll module.obj" +/// link: "/fixed /debug:full /entry:main kernel32.lib module.lib delayimp.lib main.obj /out:main.exe /delayload:module.dll /incremental:no" +/// launch: "main.exe" +/// } +/// linux: { +/// skip: "" +/// compile: "-O0 -g module.c -fPIC -shared -o libmodule.so" +/// compile: "-O0 -g main.c -L. -lmodule -o main -Wl,-rpath,%CWD%" +/// launch: "./main" +/// } +/// } +/// /// file: "module.c" diff --git a/src/torture/torture.c b/src/torture/torture.c index 66e65d64..b399371f 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -23,19 +23,54 @@ global String8 g_output; global String8 g_errors; // tools -global B32 g_dbg_graphical; +global B32 g_gui; global String8 g_radbin_path; global String8 g_cl_path; global String8 g_clang_path; global String8 g_gcc_path; global String8 g_linker_path; +//////////////////////////////// + +internal String8 +t_group_from_test(T_Test *test) +{ + String8 file = str8_cstring(test->file); + String8 group = str8_chop_last_dot(str8_skip_last_slash(file)); + if (str8_match_wildcard(group, str8_lit("torture_*"), StringMatchFlag_CaseInsensitive)) { + group = str8_skip(group, str8_lit("torture_").size); + } + return group; +} + +internal String8 +t_group_from_test_idx(U64 test_idx) +{ + return t_group_from_test(g_torture_tests[test_idx]); +} + internal String8 t_test_name_from_idx(Arena *arena, U64 test_idx) { - return str8f(arena, "%s::%s", g_torture_tests[test_idx]->group, g_torture_tests[test_idx]->label); + return str8f(arena, "%.*s/%s", str8_varg(t_group_from_test_idx(test_idx)), g_torture_tests[test_idx]->label); } +internal String8List +t_test_group_from_name(Arena *arena, String8 pattern) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List matches = {0}; + for EachIndex(i, g_torture_test_count) { + if (str8_match_wildcard(t_test_name_from_idx(scratch.arena, i), pattern, 0)) { + str8_list_push(arena, &matches, t_group_from_test_idx(i)); + } + } + scratch_end(scratch); + return matches; +} + +//////////////////////////////// + internal char * t_string_from_result(T_RunStatus v) { @@ -43,10 +78,24 @@ t_string_from_result(T_RunStatus v) case T_RunStatus_Fail: return "FAIL"; case T_RunStatus_Crash: return "CRASH"; case T_RunStatus_Pass: return "PASS"; + case T_RunStatus_Skip: return "SKIP"; + default: break; } return 0; } +internal char * +t_color_from_result(T_RunStatus v) +{ + switch (v) { +#define X(n,c,...) case T_RunStatus_##n: return c; + T_Run_XList +#undef X + default: break; + } + return "null"; +} + internal void t_break_if_debugger_present(void) { @@ -167,17 +216,22 @@ t_run_caller(void *raw_ctx) ctx->result.status = T_RunStatus_Pass; String8List test_out = {0}; - ctx->run(scratch.arena, ctx->user_data, &ctx->result, &test_out); + + if (ctx->test->skip) { + ctx->result.status = T_RunStatus_Skip; + } else { + ctx->test->r(scratch.arena, ctx->user_data, &ctx->result, &test_out); + } if (ctx->result.status == T_RunStatus_Fail || ctx->result.status == T_RunStatus_Crash) { for EachNode(n, String8Node, test_out.first) { t_errorf("%S", n->string); } if (g_errors.size) { - t_errorf("stderr: \"%S\"\n", g_errors); + t_errorf("%S\n", g_errors); } if (g_output.size) { - t_errorf("stdout: \"%S\"\n", g_output); + t_errorf("%S\n", g_output); } } @@ -185,9 +239,9 @@ t_run_caller(void *raw_ctx) } internal T_RunResult -t_run(T_Run run, String8 user_data) +t_run(T_Test *test, String8 user_data) { - T_RunCtx ctx = { .run = run, .user_data = user_data, .result.status = T_RunStatus_Fail }; + T_RunCtx ctx = { .test = test, .user_data = user_data, .result.status = T_RunStatus_Fail }; t_run_caller(&ctx); fflush(stdout); fflush(stderr); @@ -332,7 +386,7 @@ t_raddbg_path(void) local_persist U8 buffer[4096]; ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); - String8 raddbg_base_name = g_dbg_graphical ? str8_lit("raddbg") : str8_lit("raddbg_non_graphical"); + String8 raddbg_base_name = g_gui ? str8_lit("raddbg") : str8_lit("raddbg_non_graphical"); #if OS_WINDOWS Temp scratch = scratch_begin(0, 0); path = full_path_from_path(arena, str8f(scratch.arena, "%S.exe", raddbg_base_name)); @@ -779,7 +833,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) exit:; for EachElement(i, read_capture_handles) { file_close(read_capture_handles[i]); } for EachElement(i, write_capture_handles) { file_close(write_capture_handles[i]); } - AssertAlways(is_ok); + scratch_end(scratch); return is_ok; } @@ -883,7 +937,9 @@ internal int t_test_compar(const void *raw_a, const void *raw_b) { const T_Test *a = raw_a, *b = raw_b; - int cmp = str8_compar(str8_cstring(a->group), str8_cstring(b->group), 0); + String8 group_a = t_group_from_test((T_Test *)a); + String8 group_b = t_group_from_test((T_Test *)b); + int cmp = str8_compar(group_a, group_b, 0); if (cmp == 0) { cmp = u64_compar(&a->decl_line, &b->decl_line); } @@ -1014,10 +1070,37 @@ t_errorf(char *fmt, ...) scratch_end(scratch); } +internal void +t_help(void) +{ + fprintf(stderr, "--- Help -------------------------------------------------------\n"); + fprintf(stderr, " %s\n\n", BUILD_TITLE_STRING_LITERAL); + fprintf(stderr, " Usage: torture [Options] \n\n"); + fprintf(stderr, " Options:\n"); + fprintf(stderr, " -list Print available test targets\n"); + fprintf(stderr, " --gui Launch debugger with window\n"); + fprintf(stderr, " -cl: Override default cl path\n"); + fprintf(stderr, " -clang: Override default clang path\n"); + fprintf(stderr, " -gcc: Override default gcc path\n"); + fprintf(stderr, " -linker: Path to PE/COFF linker\n"); + fprintf(stderr, " -print_stdout Print to console stdout and stderr of a run\n"); + fprintf(stderr, " -out: Directory path for test outputs (default \"%.*s\")\n", str8_varg(g_out)); + fprintf(stderr, " -verbose Enable verbose mode\n"); + fprintf(stderr, " -help Print help menu and exit\n"); + fprintf(stderr, "\nInputs are wildcard expressions. Prefix with ! to skip matches, or + to force-run matches.\n"); + fprintf(stderr, "\nExamples:\n"); + fprintf(stderr, " torture * Run all tests\n"); + fprintf(stderr, " torture bit_array Run 'bit_array' test\n"); + fprintf(stderr, " torture !* Skip all tests\n"); + fprintf(stderr, " torture * !bit_array Run all tests but skip 'bit_array'\n"); + fprintf(stderr, " torture +* Force-run all tests\n"); +} + internal void t_entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0,0); + U64 exit_code = max_U64; U64 dashes_size = 9999; U8 *dashes = push_array(scratch.arena, U8, dashes_size); @@ -1036,25 +1119,10 @@ t_entry_point(CmdLine *cmdline) // { B32 print_help = cmd_line_has_flag(cmdline, str8_lit("help")) || - cmd_line_has_flag(cmdline, str8_lit("h")); + cmd_line_has_flag(cmdline, str8_lit("h")); if (print_help) { - PrintHeader("Help"); - fprintf(stderr, " %s\n\n", BUILD_TITLE_STRING_LITERAL); - fprintf(stderr, " Usage: torture [Options] [Files]\n\n"); - fprintf(stderr, " Options:\n"); - fprintf(stderr, " -target:{name[,name]} Selects targets to test\n"); - fprintf(stderr, " -skip:{name[,name]} Selects targets to skip\n"); - fprintf(stderr, " -list Print available test targets and exit\n"); - fprintf(stderr, " -out:{path} Directory path for test outputs (default \"%.*s\")\n", str8_varg(g_out)); - fprintf(stderr, " -verbose Enable verbose mode\n"); - fprintf(stderr, " -cl:{path} Override default cl path\n"); - fprintf(stderr, " -clang:{path} Override default clang path\n"); - fprintf(stderr, " -gcc:{path} Override default gcc path\n"); - fprintf(stderr, " -linker:{path} Path to PE/COFF linker\n"); - fprintf(stderr, " --dbg_graphical Launch debugger with window\n"); - fprintf(stderr, " -print_stdout Print to console stdout and stderr of a run\n"); - fprintf(stderr, " -help Print help menu and exit\n"); - abort_self(0); + t_help(); + goto exit; } } @@ -1086,7 +1154,7 @@ t_entry_point(CmdLine *cmdline) // // Compiler overrides // - g_dbg_graphical = cmd_line_has_flag(cmdline, str8_lit("dbg_graphical")); + g_gui = cmd_line_has_flag(cmdline, str8_lit("gui")); g_cl_path = cmd_line_string(cmdline, str8_lit("cl")); g_clang_path = cmd_line_string(cmdline, str8_lit("clang")); g_gcc_path = cmd_line_string(cmdline, str8_lit("gcc")); @@ -1106,44 +1174,68 @@ t_entry_point(CmdLine *cmdline) // // Handle optional -target // - String8List target = cmdline->inputs; + U64List targets = {0}; { - CmdLineOpt *target_opt = cmd_line_opt_from_string(cmdline, str8_lit("target")); - if (target_opt == 0) { - target_opt = cmd_line_opt_from_string(cmdline, str8_lit("t")); - } + String8List inputs = {0}; + + CmdLineOpt *target_opt = 0; + if (target_opt == 0) { target_opt = cmd_line_opt_from_string(cmdline, str8_lit("target")); } + if (target_opt == 0) { target_opt = cmd_line_opt_from_string(cmdline, str8_lit("t")); } + + // handle explicit target switch if (target_opt) { - HashTable *ht = hash_table_init(scratch.arena, g_torture_test_count*2); + str8_list_concat_in_place(&inputs, &target_opt->value_strings); + } - String8List targets = target_opt->value_strings; - str8_list_concat_in_place(&targets, &cmdline->inputs); + // accept inputs from the command line as target tests to run + str8_list_concat_in_place(&inputs, &cmdline->inputs); - if (targets.node_count > 0) { - for EachNode(pattern_n, String8Node, targets.first) { - B32 do_namespace = str8_find_needle(pattern_n->string, 0, str8_lit("::"), 0) < pattern_n->string.size; - for EachIndex(test_idx, g_torture_test_count) { - String8 name = str8_cstring(g_torture_tests[test_idx]->label); - if (do_namespace) { - name = t_test_name_from_idx(scratch.arena, test_idx); - } - if (str8_match_wildcard(name, pattern_n->string, 0)) { - if ( ! hash_table_search_string(ht, name)) { - hash_table_push_string_raw(scratch.arena, ht, name, 0); - str8_list_push(scratch.arena, &target, str8_cstring(g_torture_tests[test_idx]->label)); - } - } + // no inputs -> print help and exit + if (inputs.node_count == 0) { + t_help(); + goto exit; + } + + HashMap hm = {0}; + for EachNode(input_n, String8Node, inputs.first) { + String8 t = input_n->string; + + // parse mode + typedef enum { Mode_Default, Mode_Skip, Mode_Force, } Mode; + Mode mode = Mode_Default; + if (str8_match_wildcard(t, str8_lit("+*"), 0)) { mode = Mode_Force; t = str8_skip(t, 1); } + else if (str8_match_wildcard(t, str8_lit("!*"), 0)) { mode = Mode_Skip; t = str8_skip(t, 1); } + + if (str8_find_needle(t, 0, str8_lit("/"), 0) >= t.size) { + t = str8f(scratch.arena, "*/%S", t); + } + + U64 match_count = 0; + + for EachIndex(test_idx, g_torture_test_count) { + // match test names + String8 test_name = t_test_name_from_idx(scratch.arena, test_idx); + + if (str8_match_wildcard(test_name, t, StringMatchFlag_CaseInsensitive)) { + // set skip flag + switch (mode) { + case Mode_Default: break; + case Mode_Skip: g_torture_tests[test_idx]->skip = 1; break; + case Mode_Force: g_torture_tests[test_idx]->skip = 0; break; } - } - - if (ht->count == 0) { - fprintf(stderr, "ERROR: -target matches not found for the following patterns: "); - for EachNode(n, String8Node, target_opt->value_strings.first) { - fprintf(stderr, "\"%.*s\"\n", str8_varg(n->string)); + + // append test when not in skipping mode + if ( ! hash_map_search_string_u64(&hm, test_name)) { + hash_map_push_string_u64(scratch.arena, &hm, test_name, 1); + u64_list_push(scratch.arena, &targets, test_idx); } - abort_self(1); + + match_count += 1; } - } else { - fprintf(stderr, "ERROR: -target has invalid number of arguments\n"); + } + + if (match_count == 0) { + fprintf(stderr, "WARNING: no matches found for input: %.*s\n", str8_varg(input_n->string)); } } } @@ -1199,62 +1291,17 @@ t_entry_point(CmdLine *cmdline) // Run tests // { - U64List target_indices_list = {0}; - if (target.node_count == 0) { - for EachIndex(i, g_torture_test_count) { u64_list_push(scratch.arena, &target_indices_list, i); } - } else { - for EachNode(target_n, String8Node, target.first) { - B32 is_target_unknown = 1; - for EachIndex(i, g_torture_test_count) { - if (str8_match(str8_cstring(g_torture_tests[i]->label), target_n->string, 0)) { - u64_list_push(scratch.arena, &target_indices_list, i); - is_target_unknown = 0; - break; - } - } - if (is_target_unknown) { - fprintf(stderr, "ERROR: unknown target \"%.*s\"\n", str8_varg(target_n->string)); - } - } - } - - // - // -skip - // - U64List final_target_list = {0}; - CmdLineOpt *skip_opt = cmd_line_opt_from_string(cmdline, str8_lit("skip")); - CmdLineOpt *s_opt = cmd_line_opt_from_string(cmdline, str8_lit("s")); - String8List skip_list = skip_opt ? skip_opt->value_strings : s_opt ? s_opt->value_strings : (String8List){0}; - for EachNode(n, U64Node, target_indices_list.first) { - // should test be skipped? - B32 include_test = 1; - String8 test_name = t_test_name_from_idx(scratch.arena, n->data); - for EachNode(pattern_n, String8Node, skip_list.first) { - if (str8_match_wildcard(test_name, pattern_n->string, 0)) { - include_test = 0; - break; - } - } - - if (include_test) { - u64_list_push(scratch.arena, &final_target_list, n->data); - } - } - - U64 skip_count = target_indices_list.count - final_target_list.count; - U64Array target_indices = u64_array_from_list(scratch.arena, &final_target_list); + U64Array target_indices = u64_array_from_list(scratch.arena, &targets); U64 max_label_size = 0; U64 max_group_size = 0; for EachIndex(i, target_indices.count) { U64 test_idx = target_indices.v[i]; max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[test_idx]->label)); - max_group_size = Max(max_group_size, cstring8_length((U8*)g_torture_tests[test_idx]->group)); + max_group_size = Max(max_group_size, t_group_from_test_idx(test_idx).size); } - U64 pass_count = 0; - U64 fail_count = 0; - U64 crash_count = 0; + U64 run_counters[T_RunStatus_Count] = {0}; U64 max_digit_count = count_digits_u64(target_indices.count, 10); U64 total_time_start = now_time_us(); @@ -1262,6 +1309,8 @@ t_entry_point(CmdLine *cmdline) Slowest slowest[5] = {0}; for EachElement(i, slowest) { slowest[i].target_idx = max_U64; } + U64List skipped_tests = {0}; + for EachIndex(i, target_indices.count) { if (i == 0) { PrintHeader("Tests"); } @@ -1274,7 +1323,7 @@ t_entry_point(CmdLine *cmdline) U64 curr_digit_count = count_digits_u64(i+1, 10); int idx_align_space_count = (int)(max_digit_count - curr_digit_count); fprintf(stdout, "[%.*s%llu/%llu] ", idx_align_space_count, spaces, (unsigned long long)i+1, (unsigned long long)target_indices.count); - fprintf(stdout, "%s %.*s:: %s", test->group, (int)(max_group_size - cstring8_length((U8*)test->group)), spaces, test->label); + fprintf(stdout, "%.*s %.*s/ %s", str8_varg(t_group_from_test(test)), (int)(max_group_size - t_group_from_test(test).size), spaces, test->label); fprintf(stdout, " %.*s ", (int)dots_count, dots); fflush(stdout); @@ -1295,19 +1344,14 @@ t_entry_point(CmdLine *cmdline) // run test U64 run_start_time = now_time_us(); - T_RunResult result = t_run(test->r, test->user_data); + T_RunResult result = t_run(test, test->user_data); U64 run_end_time = now_time_us(); - // print result - if (result.status == T_RunStatus_Pass) { - fprintf(stdout, "\x1b[32m" "%s" "\x1b[0m", t_string_from_result(result.status)); - pass_count += 1; - } else if (result.status == T_RunStatus_Fail) { - fprintf(stdout, "\x1b[31m" "%s" "\x1b[0m", t_string_from_result(result.status)); - fail_count += 1; - } else if (result.status == T_RunStatus_Crash) { - fprintf(stdout, "\x1b[33m" "%s" "\x1b[0m", t_string_from_result(result.status)); - crash_count += 1; - } + + // update + run_counters[result.status] += 1; + + // print run status + fprintf(stdout, "%s%s" T_RESET, t_color_from_result(result.status), t_string_from_result(result.status)); if (result.status == T_RunStatus_Pass) { U64 d = run_end_time - run_start_time; @@ -1341,18 +1385,23 @@ t_entry_point(CmdLine *cmdline) if (result.status == T_RunStatus_Fail || result.status == T_RunStatus_Crash) { if (g_stop_on_first_fail_or_crash) { goto exit; } } + + if (result.status == T_RunStatus_Skip) { + u64_list_push(scratch.arena, &skipped_tests, target_idx); + } } U64 total_time_end = now_time_us(); - if (target_indices.count > 0 && (pass_count > 0 || fail_count > 0 || crash_count > 0 || skip_count > 0)) { + if (target_indices.count > 0 && sum_array_u64(ArrayCount(run_counters), run_counters) > 0) { + U64 total_time_dt = total_time_end - total_time_start; + String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); + fprintf(stderr, "\n"); PrintHeader("Summary"); - U64 total_time_dt = total_time_end - total_time_start; - String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); - fprintf(stderr, " Passed %llu\n", (unsigned long long)pass_count); - fprintf(stderr, " Failed %llu\n", (unsigned long long)fail_count); - fprintf(stderr, " Crashed %llu\n", (unsigned long long)crash_count); - fprintf(stderr, " Skipped %llu\n", (unsigned long long)skip_count); + fprintf(stderr, " Passed %llu\n", (unsigned long long)run_counters[T_RunStatus_Pass]); + fprintf(stderr, " Failed %llu\n", (unsigned long long)run_counters[T_RunStatus_Fail]); + fprintf(stderr, " Crashed %llu\n", (unsigned long long)run_counters[T_RunStatus_Crash]); + fprintf(stderr, " Skipped %llu\n", (unsigned long long)run_counters[T_RunStatus_Skip]); fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); U64 slow_count = 0; @@ -1368,17 +1417,17 @@ t_entry_point(CmdLine *cmdline) for EachElement(i, slowest) { Slowest s = slowest[i]; label_max = Max(strlen(g_torture_tests[s.target_idx]->label), label_max); - group_max = Max(strlen(g_torture_tests[s.target_idx]->group), group_max); + group_max = Max(t_group_from_test_idx(s.target_idx).size, group_max); } - fprintf(stderr, " Slow Tests\n"); + fprintf(stderr, " \nSlow Tests\n"); for EachElement(i, slowest) { Slowest s = slowest[i]; if (s.target_idx >= g_torture_test_count) { break; } String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); - fprintf(stderr, " %s %.*s:: %s %.*s %.*s\n", - g_torture_tests[s.target_idx]->group, - (int)(group_max - strlen(g_torture_tests[s.target_idx]->group)), spaces, + fprintf(stderr, " %.*s %.*s/ %s %.*s %.*s\n", + str8_varg(t_group_from_test_idx(s.target_idx)), + (int)(group_max - t_group_from_test_idx(s.target_idx).size), spaces, g_torture_tests[s.target_idx]->label, (int)(label_max - strlen(g_torture_tests[s.target_idx]->label)) + 4, dots, str8_varg(elapsed_time)); @@ -1386,12 +1435,10 @@ t_entry_point(CmdLine *cmdline) } } + exit_code = run_counters[T_RunStatus_Fail] + run_counters[T_RunStatus_Crash]; exit:; - if (fail_count + crash_count != 0) { - fflush(stdout); - abort_self(fail_count + crash_count); - } } - + scratch_end(scratch); + // TODO: return exit_code; } diff --git a/src/torture/torture.h b/src/torture/torture.h index 80a5995d..fff10f90 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -5,11 +5,25 @@ //////////////////////////////// +#define T_RESET "\x1b[0m" +#define T_RED "\x1b[31m" +#define T_GREEN "\x1b[32m" +#define T_YELLOW "\x1b[33m" +#define T_BLUE "\x1b[34m" + +//#define X(n, c) +#define T_Run_XList \ + X(Fail, T_RED) \ + X(Crash, T_RED) \ + X(Pass, T_GREEN) \ + X(Skip, T_RESET) + typedef enum { - T_RunStatus_Fail, - T_RunStatus_Crash, - T_RunStatus_Pass, +#define X(n,...) T_RunStatus_##n, +T_Run_XList +#undef X + T_RunStatus_Count } T_RunStatus; typedef struct @@ -25,20 +39,21 @@ typedef void (*T_Run)(Arena *arena, String8 user_data, T_RunResul typedef struct { - T_Run run; - String8 user_data; - T_RunResult result; -} T_RunCtx; - -typedef struct -{ - char *group; + char *file; char *label; int decl_line; T_Run r; + B32 skip; String8 user_data; } T_Test; +typedef struct +{ + T_Test *test; + String8 user_data; + T_RunResult result; +} T_RunCtx; + typedef enum { T_Compiler_Null, @@ -61,25 +76,28 @@ extern T_Test g_torture_tests_[0xffffff]; internal void t_break_if_debugger_present(void); -#define T_AddTest(name, l, ...) \ +#define T_AddTest(name, f, l, skip, ...) \ T_RunSig(name); \ __VA_ARGS__ void t_add_test_##name(void) \ { \ - g_torture_tests_[g_torture_test_count++] = (T_Test){ .group = T_Group, .label = Stringify(name), .r = &t_##name, .decl_line = l }; \ + g_torture_tests_[g_torture_test_count++] = (T_Test){ f, Stringify(name), l, &t_##name, skip }; \ } #if COMPILER_MSVC # pragma section(".CRT$XCU", read) -# define TEST_(name) \ - T_AddTest(name, __LINE__) \ +# define TEST_(name, skip) \ + T_AddTest(name, __FILE__, __LINE__, skip) \ __declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ __pragma(comment(linker, "/include:" Stringify(r_##name))) #else -# define TEST_(name) T_AddTest(name, __LINE__, __attribute__((constructor))) +# define TEST_(name, skip) T_AddTest(name, __FILE__, __LINE__, skip, __attribute__((constructor))) #endif #define TEST(name) \ - TEST_(name) \ + TEST_(name, 0) \ + T_RunSig(name) +#define SKIP(name) \ + TEST_(name, 1) \ T_RunSig(name) #define T_Ok(c) do { if (!(c)) { \ @@ -113,7 +131,7 @@ internal String8 t_make_file_path(Arena *arena, String8 name); // test runner internal void t_run_caller(void *raw_ctx); internal void t_run_fail_handler(void *raw_ctx); -internal T_RunResult t_run(T_Run run, String8 user_data); +internal T_RunResult t_run(T_Test *test, String8 user_data); // tools internal String8 t_radbin_path(void); diff --git a/src/torture/torture_base.c b/src/torture/torture_base.c index 12929bf1..988378d8 100644 --- a/src/torture/torture_base.c +++ b/src/torture/torture_base.c @@ -1,8 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#define T_Group "Base" - TEST(str8_list_substr) { String8List zero_list = {0}; @@ -341,4 +339,3 @@ TEST(hash_map) } } -#undef T_Group diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index bdc43c3d..5576f7ea 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -5,8 +5,6 @@ // // [ ] d2r_types alias size and byte size on __float80 typedef mismatch -#define T_Group "d2r" - internal RDI_Parsed * d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) { @@ -232,7 +230,7 @@ T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), s dw_writer_end(&writer); } -TEST(d2r_line_table) +SKIP(d2r_line_table) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); String8 comp_dir = str8_lit("c:/DEVEL/"); @@ -303,7 +301,7 @@ TEST(d2r_line_table) dw_writer_end(&writer); } -TEST(d2r_checksums) +SKIP(d2r_checksums) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); @@ -553,4 +551,3 @@ TEST(d2r_general) dw_writer_end(&writer); } -#undef T_Group diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 9b8b9bc0..e92c6e51 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -1,32 +1,54 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#define T_Group "Dbg" - #define T_Dbg_DefaultTimeout TIMEOUT_SEC(5) extern B32 g_stop_on_first_fail_or_crash; +//////////////////////////////// + +internal void +t_find_line_and_col(String8 source, MD_Node *n, U64 *line_out, U64 *col_out) +{ + U64 line = 1; + U64 col = 1; + for (U64 cursor = 0; cursor < source.size && cursor < n->src_offset; cursor += 1) { + if (source.str[cursor] == '\n') { + line += 1; + col = 0; + } + col += 1; + } + if (line_out) { *line_out = line; } + if (col_out) { *col_out = col; } +} + +internal void +t_errorf_md(String8 file_name, String8 source, MD_Node *n, char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 result = push_str8fv(scratch.arena, fmt, args); + U64 line = 0, col = 0; + t_find_line_and_col(source, n, &line, &col); + t_errorf("ERROR: %S:%llu%llu: %S\n", file_name, (unsigned long long)line, (unsigned long long)col, result); + va_end(args); + scratch_end(scratch); +} + //////////////////////////////// // Debugger IPC Replies -typedef struct RD_IpcReply RD_IpcReply; -struct RD_IpcReply +typedef struct { MD_ParseResult parse; MD_Node *root; MD_Node *msg; -}; - -internal RD_IpcReply -rd_ipc_mdesk_reply_from_string(Arena *arena, String8 string) -{ - MD_ParseResult parse = md_parse_from_text(arena, str8_lit("ipc_reply"), string); - return (RD_IpcReply){ .parse = parse, .root = parse.root, parse.root->first }; -} +} T_IpcReply; internal B32 -rd_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out) +t_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out) { MD_Node *child = md_child_from_string(node, child_name, 0); if (!md_node_is_nil(child) && !md_node_is_nil(child->first)) @@ -38,10 +60,10 @@ rd_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out) } internal B32 -rd_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out) +t_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out) { String8 value = {0}; - if (rd_ipc_parse_string(node, child_name, &value)) + if (t_ipc_parse_string(node, child_name, &value)) { U64 v64 = 0; if (try_u64_from_str8_c_rules(value, &v64)) @@ -53,12 +75,12 @@ rd_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out) return 0; } -#define rd_ipc_parse_int(n, c, ptr) rd_ipc_parse_int_(n, c, sizeof(*ptr), ptr) +#define t_ipc_parse_int(n, c, ptr) t_ipc_parse_int_(n, c, sizeof(*ptr), ptr) internal B32 -rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out) +t_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out) { String8 value = {0}; - if (rd_ipc_parse_string(node, child_name, &value)) + if (t_ipc_parse_string(node, child_name, &value)) { U64 v64 = 0; if (try_u64_from_str8_c_rules(value, &v64)) @@ -71,12 +93,12 @@ rd_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out) } internal B32 -rd_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out) +t_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out) { B32 is_ok = 0; String8 s = {0}; U64 value = 0; - if (rd_ipc_parse_string(node, child_name, &s)) + if (t_ipc_parse_string(node, child_name, &s)) { if (str8_matchi(s, str8_lit("true"))) { value = 1; is_ok = 1; } else if (str8_matchi(s, str8_lit("false"))) { value = 0; is_ok = 1; } @@ -172,9 +194,9 @@ t_dbg_state(Arena *arena, U64 timeout_us) MD_Node *threads_md = md_child_from_string(state_md, str8_lit("threads"), 0); MD_Node *modules_md = md_child_from_string(state_md, str8_lit("modules"), 0); T_DbgState v = {0}; - if (!rd_ipc_parse_int(state_md, str8_lit("running"), &v.running)) { t_infof("INFO: 'state' is missing 'running'\n"); goto exit; } - if (!rd_ipc_parse_int(state_md, str8_lit("run_gen"), &v.run_gen)) { t_infof("INFO: 'state' is missing 'run_gen'\n"); goto exit; } - if (!rd_ipc_parse_int(state_md, str8_lit("ip"), &v.ip)) { t_infof("INFO: 'state' is missing 'ip'\n"); goto exit; } + if (!t_ipc_parse_int(state_md, str8_lit("running"), &v.running)) { t_infof("INFO: 'state' is missing 'running'\n"); goto exit; } + if (!t_ipc_parse_int(state_md, str8_lit("run_gen"), &v.run_gen)) { t_infof("INFO: 'state' is missing 'run_gen'\n"); goto exit; } + if (!t_ipc_parse_int(state_md, str8_lit("ip"), &v.ip)) { t_infof("INFO: 'state' is missing 'ip'\n"); goto exit; } result = push_array(arena, T_DbgState, 1); *result = v; @@ -201,11 +223,11 @@ t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_u U64 line_count = 0; for MD_EachNode(n, lines_md->first) { T_DbgLine line = {0}; - if ( ! rd_ipc_parse_string(n, str8_lit("file_path"), &line.file_path)) { t_infof("INFO: 'lines' is missing 'file_path'\n"); goto exit; } - if ( ! rd_ipc_parse_int(n, str8_lit("line_num"), &line.line_num)) { t_infof("INFO: 'lines' is missing 'line_num'\n"); goto exit; } - if ( ! rd_ipc_parse_int(n, str8_lit("column_num"), &line.column_num)) { t_infof("INFO: 'lines' is missing 'column_num'\n"); goto exit; } - if ( ! rd_ipc_parse_int(n, str8_lit("voff_range_min"), &line.voff_range.min)) { t_infof("INFO: 'lines' is missing 'voff_range_min'\n"); goto exit; } - if ( ! rd_ipc_parse_int(n, str8_lit("voff_range_max"), &line.voff_range.max)) { t_infof("INFO: 'lines' is missing 'voff_range_max'\n"); goto exit; } + if ( ! t_ipc_parse_string(n, str8_lit("file_path"), &line.file_path)) { t_infof("INFO: 'lines' is missing 'file_path'\n"); goto exit; } + if ( ! t_ipc_parse_int(n, str8_lit("line_num"), &line.line_num)) { t_infof("INFO: 'lines' is missing 'line_num'\n"); goto exit; } + if ( ! t_ipc_parse_int(n, str8_lit("column_num"), &line.column_num)) { t_infof("INFO: 'lines' is missing 'column_num'\n"); goto exit; } + if ( ! t_ipc_parse_int(n, str8_lit("voff_range_min"), &line.voff_range.min)) { t_infof("INFO: 'lines' is missing 'voff_range_min'\n"); goto exit; } + if ( ! t_ipc_parse_int(n, str8_lit("voff_range_max"), &line.voff_range.max)) { t_infof("INFO: 'lines' is missing 'voff_range_max'\n"); goto exit; } Node *n = push_array(scratch.arena, Node, 1); n->v = line; @@ -393,10 +415,10 @@ t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) B32 is_ok = t_dbg_send_cmd(cmd, T_Dbg_DefaultTimeout, arena, &reply); T_Eval e = {0}; - if ( ! rd_ipc_parse_string(reply.root, str8_lit("expr"), &e.expr)) { t_errorf("ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.root, str8_lit("value"), &e.value)) { t_errorf("ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.root, str8_lit("type"), &e.type)) { t_errorf("ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } - if ( ! rd_ipc_parse_string(reply.root, str8_lit("error"), &e.error)) { t_errorf("ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } + if ( ! t_ipc_parse_string(reply.root, str8_lit("expr"), &e.expr)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } + if ( ! t_ipc_parse_string(reply.root, str8_lit("value"), &e.value)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } + if ( ! t_ipc_parse_string(reply.root, str8_lit("type"), &e.type)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } + if ( ! t_ipc_parse_string(reply.root, str8_lit("error"), &e.error)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } if (eval_out) { *eval_out = e; } exit:; @@ -424,22 +446,11 @@ internal String8 t_string_from_dbg_script_cmd_kind(T_DbgScriptCmdKind v) { switch (v) { - case T_DbgScriptCmdKind_Null: return str8_zero(); - case T_DbgScriptCmdKind_Breakpoint: return str8_lit("bp"); - case T_DbgScriptCmdKind_ClearBreakpoints: return str8_lit("bp_clear"); - case T_DbgScriptCmdKind_Run: return str8_lit("run"); - case T_DbgScriptCmdKind_Halt: return str8_lit("halt"); - case T_DbgScriptCmdKind_StepOver: return str8_lit("step_over"); - case T_DbgScriptCmdKind_StepInto: return str8_lit("step_into"); - case T_DbgScriptCmdKind_StepOut: return str8_lit("step_out"); - case T_DbgScriptCmdKind_StepOverInst: return str8_lit("step_over_inst"); - case T_DbgScriptCmdKind_StepIntoInst: return str8_lit("step_into_inst"); - case T_DbgScriptCmdKind_StepOverLine: return str8_lit("step_over_line"); - case T_DbgScriptCmdKind_StepIntoLine: return str8_lit("step_into_line"); - case T_DbgScriptCmdKind_KillAll: return str8_lit("kill_all"); - case T_DbgScriptCmdKind_At: return str8_lit("at"); - case T_DbgScriptCmdKind_Eval: return str8_lit("eval"); - default: InvalidPath; +#define X(n,v) case T_DbgScriptCmdKind_##n: return str8_lit(v); + T_DbgScriptCmdKind_XList +#undef X + case T_DbgScriptCmdKind_Null: return str8_zero(); + default: InvalidPath; break; } return str8_zero(); } @@ -473,9 +484,9 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS String8 comment = str8_skip_chop_whitespace(token_string); String8 prefix = str8_lit("///"); if (str8_matchi(str8_prefix(comment, prefix.size), prefix)) { - String8 script_part = str8_skip(comment, prefix.size); - U64 script_part_base_off = (U64)(script_part.str - source.str); - MD_TokenizeResult script_part_tokenize = md_tokenize_from_text(scratch.arena, script_part); + String8 script_part = str8_skip(comment, prefix.size); + U64 script_part_base_off = (U64)(script_part.str - source.str); + MD_TokenizeResult script_part_tokenize = md_tokenize_from_text(scratch.arena, script_part); for EachIndex(script_token_idx, script_part_tokenize.tokens.count) { MD_Token script_token = script_part_tokenize.tokens.v[script_token_idx]; script_token.range.min += script_part_base_off; @@ -508,28 +519,65 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS if (str8_matchi(field->string, str8_lit("compile"))) { kind = T_DbgScriptDirectiveKind_Compile; } else if (str8_matchi(field->string, str8_lit("link"))) { kind = T_DbgScriptDirectiveKind_Link; } else if (str8_matchi(field->string, str8_lit("launch"))) { kind = T_DbgScriptDirectiveKind_Launch; } - AssertAlways(kind != T_DbgScriptDirectiveKind_Null); - - // syntax check - AssertAlways( !md_node_is_nil(field->first)); - AssertAlways(md_node_is_nil(field->first->next)); - Assert(field->first->flags & MD_NodeFlag_StringLiteral); - - // src_offset -> line - // - // TODO: super silly!! mdesk should export line numbers - U64 line = 1; - String8 text_before_src = str8_prefix(source, field->src_offset); - for EachIndex(idx, text_before_src.size) { line += (text_before_src.str[idx] == '\n'); } - - T_DbgScriptDirective *n = push_array(arena, T_DbgScriptDirective, 1); - n->kind = kind; - n->line = line; - n->args = str8_copy(arena, field->first->string); - // TODO: expand % in compile: and link: to current source file name and esacpe with %% - + else if (str8_matchi(field->string, str8_lit("skip"))) { kind = T_DbgScriptDirectiveKind_Skip; } + + if (kind == T_DbgScriptDirectiveKind_Null) { + t_errorf_md(file_path, source, n, "unknown field in test header \"%S\"\n", field->string); + goto exit; + } + + T_DbgScriptDirective *dir = push_array(arena, T_DbgScriptDirective, 1); + dir->kind = kind; + t_find_line_and_col(source, field, &dir->line, 0); + + if (field->flags & MD_NodeFlag_HasBraceLeft) { + if (kind == T_DbgScriptDirectiveKind_Compile) { + for MD_EachNode(sub_field, field->first) { + if (str8_matchi(sub_field->string, str8_lit("cc"))) { + MD_Node *cc = sub_field->first; + if (cc->flags & MD_NodeFlag_StringLiteral) { + if (str8_matchi(cc->string, str8_lit("clang"))) { dir->compile.cc = T_Compiler_Clang; } + else if (str8_matchi(cc->string, str8_lit("cl"))) { dir->compile.cc = T_Compiler_Cl; } + else { + t_errorf_md(file_path, source, cc, "unknown compiler name: \"%S\"\n", sub_field->string); + goto exit; + } + } else { + t_errorf_md(file_path, source, sub_field, "value of CC must be a string literal e.g. CC: \"clang\"\n"); + goto exit; + } + } else if (str8_matchi(sub_field->string, str8_lit("args"))) { + MD_Node *args = sub_field->first; + if (args->flags & MD_NodeFlag_StringLiteral) { + dir->args = str8_copy(arena, args->string); + } else { + t_errorf_md(file_path, source, args, "value of ARGS must be a string literal\n"); + goto exit; + } + } else { + t_errorf_md(file_path, source, sub_field, "unknown field \"%S\"\n", sub_field->string); + goto exit; + } + } + } + } else { + if (md_node_is_nil(field->first)) { + t_errorf_md(file_path, source, field, "missing value on field %S\n", field->string); + goto exit; + } + if ( ! md_node_is_nil(field->first->next)) { + t_errorf_md(file_path, source, field, "field %S accepts only one value\n", field->string); + goto exit; + } + if (~field->first->flags & MD_NodeFlag_StringLiteral) { + t_errorf_md(file_path, source, field, "field %S accepts only strings\n", field->string); + goto exit; + } + dir->args = str8_copy(arena, field->first->string); + } + T_DbgScriptDirectiveList *list = &script.directives[os][kind]; - SLLQueuePush(list->first, list->last, n); + SLLQueuePush(list->first, list->last, dir); list->count += 1; } } @@ -541,52 +589,59 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS // file { - MD_Node *last_file = 0; + MD_NodePtrList files = {0}; for MD_EachNode(n, script_parse.root->first->next) { - B32 is_end = (md_node_is_nil(n->next) && last_file != 0); - if (str8_matchi(n->string, str8_lit("file")) || is_end) { - if (!is_end) { - AssertAlways( ! md_node_is_nil(n->first)); - AssertAlways(md_node_is_nil(n->first->next)); + if (str8_matchi(n->string, str8_lit("file"))) { + AssertAlways( ! md_node_is_nil(n->first)); + + if ( ! md_node_is_nil(n->first->next) || ! (n->first->flags & MD_NodeFlag_StringLiteral)) { + U32 line = 0; + for EachIndex(idx, n->first->src_offset) { line += (source.str[idx] == '\n'); } + t_errorf_md(file_path, source, n, "value of the 'file' must be a string, (e.g. file: \"main.c\")\n", file_path, line); + goto exit; } - - if (last_file) { - // src_offset -> base_line - // - // TODO: super silly!! mdesk should export line numbers - U64 line = 1; - for EachIndex(idx, last_file->src_offset) { line += (source.str[idx] == '\n'); } - - String8 sub_source = str8_substr(source, r1u64(last_file->src_offset, is_end ? source.size : n->src_offset)); - U64 file_dir_end = str8_find_needle(sub_source, 0, str8_lit("\n"), 0); - U64 next_file_dir_begin = str8_find_needle_reverse(sub_source, 0, str8_lit("\n"), n->src_offset); - sub_source = str8_substr(sub_source, r1u64(file_dir_end + 1, next_file_dir_begin)); - - T_DbgScriptFile *file = push_array(arena, T_DbgScriptFile, 1); - file->path = t_make_file_path(arena, last_file->first->string); - file->source = sub_source; - file->line = line; - SLLQueuePush(script.files.first, script.files.last, file); - script.files.count += 1; - } - - last_file = n; + + md_node_ptr_list_push(scratch.arena, &files, n); } } - - // no file directives? assume script file as main source file - if (last_file == 0) { + + if (files.count == 0) { + MD_Node *whole_file = push_array(scratch.arena, MD_Node, 1); + whole_file->first = push_array(scratch.arena, MD_Node, 1); + whole_file->first->next = push_array(scratch.arena, MD_Node, 1); + whole_file->src_offset = 0; + whole_file->first->string = str8_skip_last_slash(file_path); + md_node_ptr_list_push(scratch.arena, &files, whole_file); + } + + HashMap files_hm = {0}; + for EachNode(n_ptr, MD_NodePtrNode, files.first) { + MD_Node *n = n_ptr->v; + + U64 src_opl = source.size; + if (n_ptr->next) { + src_opl = n_ptr->next->v->src_offset; + } + + String8 sub_source = str8_substr(source, r1u64(n->src_offset, src_opl)); + U64 file_min = str8_find_needle(sub_source, 0, str8_lit("\n"), 0) + 1; + U64 file_max = str8_find_needle_reverse(sub_source, 0, str8_lit("\n"), 0); + sub_source = str8_substr(sub_source, r1u64(file_min, file_max)); + T_DbgScriptFile *file = push_array(arena, T_DbgScriptFile, 1); - file->path = file_path; - file->source = source; + file->path = t_make_file_path(arena, n->first->string); + file->source = sub_source; + t_find_line_and_col(source, n, &file->line, 0); SLLQueuePush(script.files.first, script.files.last, file); script.files.count += 1; + + hash_map_push_raw_raw(scratch.arena, &files_hm, n, file); } } // programs { - HashTable *ht = hash_table_init(scratch.arena, 256); // + HashMap hm = {0}; // for MD_EachNode(n, script_parse.root->first->next) { U64 order = 0; if (try_u64_from_str8_c_rules(n->string, &order)) { @@ -598,20 +653,14 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS } AssertAlways(file != 0); - // src_offset -> line - // - // TODO: super silly!! mdesk should export line numbers - U64 line = 1; - for EachIndex(i, n->src_offset) { line += (source.str[i] == '\n'); } - - T_DbgScriptProgram *p = hash_table_search_u64_raw(ht, order); + T_DbgScriptProgram *p = hash_map_search_u64_raw(&hm, order); if (p == 0) { p = push_array(arena, T_DbgScriptProgram, 1); - p->line = line; + t_find_line_and_col(source, n, &p->line, 0); p->order = order; p->os = OperatingSystem_CURRENT; p->file = file; - hash_table_push_u64_raw(scratch.arena, ht, order, p); + hash_map_push_u64_raw(scratch.arena, &hm, order, p); } else { t_errorf("ERROR: duplicate order number %llu found on line %llu\n", (unsigned long long)order, (unsigned long long)p->line); } @@ -620,7 +669,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS // push new cmd T_DbgScriptCmd *cmd = push_array(arena, T_DbgScriptCmd, 1); cmd->kind = t_dbg_script_cmd_kind_from_string(cmd_n->string); - cmd->line = line; + t_find_line_and_col(source, n, &cmd->line_num, &cmd->col_num); Assert(cmd->kind != T_DbgScriptCmdKind_Null); SLLQueuePush(p->first, p->last, cmd); p->count += 1; @@ -640,8 +689,8 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS } } - script.program_count = ht->count; - script.programs = values_from_hash_table_raw(arena, ht); + script.program_count = hm.count; + script.programs = values_from_hash_map_raw(arena, &hm); radsort(script.programs, script.program_count, t_dbg_script_program_is_before); } @@ -666,7 +715,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) if (program->os == OperatingSystem_CURRENT) { for EachNode(cmd, T_DbgScriptCmd, program->first) { - t_infof("[%llu] Command: %S:%llu %S\n", program->order, script->file_path, (unsigned long long)cmd->line, t_string_from_dbg_script_cmd_kind(cmd->kind)); + t_infof("[%llu] Command: %S:%llu %S\n", program->order, script->file_path, (unsigned long long)cmd->line_num, t_string_from_dbg_script_cmd_kind(cmd->kind)); switch (cmd->kind) { case T_DbgScriptCmdKind_Null: break; @@ -694,7 +743,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) #else T_DbgState *temp_status = t_dbg_state(scratch.arena, T_Dbg_DefaultTimeout); if (temp_status == 0) { - t_errorf("ERROR: %S:%llu: failed to query IP\n", script->file_path, (unsigned long long)cmd->line); + t_errorf("ERROR: %S:%llu: failed to query IP\n", script->file_path, (unsigned long long)cmd->line_num); goto exit; } U64 ip = temp_status->ip; @@ -703,7 +752,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) // map IP -> source location T_DbgLineArray lines = {0}; if (t_dbg_src_line(scratch.arena, ip, &lines, T_Dbg_DefaultTimeout) == 0) { - t_errorf("ERROR: %S:%llu: IP (0x%llx) does not map to a source line\n", script->file_path, (unsigned long long)cmd->line, (unsigned long long)ip); + t_errorf("ERROR: %S:%llu: IP (0x%llx) does not map to a source line\n", script->file_path, (unsigned long long)cmd->line_num, (unsigned long long)ip); goto exit; } @@ -711,14 +760,18 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta; U64 at_line_u64 = at_line_s64 >= 0 ? (U64)at_line_s64 : 0; AssertAlways(at_line_u64 > 0); + + if (lines.count == 0) { + t_errorf("ERROR: %S:%llu:%llu: no source location maps for vaddr: 0x%llx\n", script->file_path, (unsigned long long)cmd->line_num, (unsigned long long)cmd->col_num, (unsigned long long)ip); + goto exit; + } // match expected vs current debugger locations - for EachIndex(i, lines.count) { B32 mismatch = lines.v[i].line_num != at_line_u64 || !str8_match(lines.v[i].file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); if (mismatch) { - t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, (unsigned long long)cmd->line); + t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, (unsigned long long)cmd->line_num); t_errorf(" Expected: %S:%llu\n", program->file->path, (unsigned long long)at_line_u64); t_errorf(" Got : %S:%llu\n", lines.v[i].file_path, (unsigned long long)lines.v[i].line_num); t_errorf(" IP : 0x%llx\n", (unsigned long long)ip); @@ -758,6 +811,7 @@ T_RunSig(dbg_script_runner) // source -> script T_DbgScript script = {0}; if ( ! t_dbg_script_from_source(arena, user_data, source, &script)) { + result_out->status = T_RunStatus_Fail; goto exit; } @@ -768,17 +822,23 @@ T_RunSig(dbg_script_runner) T_Ok(0); } } - + + if (script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Skip].count) { + result_out->status = T_RunStatus_Skip; + goto exit; + } + // compiler vars HashTable *script_vars = hash_table_init(arena, 1000); + hash_table_push_path_string(arena, script_vars, str8_lit("FILE"), user_data); hash_table_push_path_string(arena, script_vars, str8_lit("CWD"), g_wdir); // run compilers for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Compile].first) { - T_Compiler compiler = directive->compile.compiler; - + T_Compiler compiler = directive->compile.cc; + // pick default compiler if none selected - if (compiler == T_Compiler_Null) { + if (directive->compile.cc == T_Compiler_Null) { switch (OperatingSystem_CURRENT) { case OperatingSystem_Windows: { compiler = T_Compiler_Cl; } break; case OperatingSystem_Linux: { compiler = T_Compiler_Clang; } break; @@ -796,10 +856,16 @@ T_RunSig(dbg_script_runner) // invoke compiler with arguments from directive String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); + + if (compiler == T_Compiler_Cl) { expanded_args = str8f(arena, "/nologo %S", expanded_args); } + if (t_invoke(compiler_path, expanded_args, max_U64) == 0) { t_errorf("ERROR: failed to launch compiler: \"%S %S\"\n", compiler_path, expanded_args); T_Ok(0); } + + if (compiler == T_Compiler_Cl) { g_output = str8_skip(g_output, str8_chop_line(&g_output).size); } // file name print + if (g_last_exit_code) { t_errorf("ERROR: %S:%llu: %S\n", script.file_path, (unsigned long long)directive->line, g_errors); if (g_stop_on_first_fail_or_crash) { @@ -875,7 +941,7 @@ t_dbg_register_script_tests(Arena *arena, String8 folder_path) String8 file_name_escaped = str8_list_join(arena, &file_name_parts, &(StringJoin){.sep=str8_lit("-"), .post = str8_lit("\0") }); g_torture_tests_[g_torture_test_count++] = (T_Test){ - .group = T_Group, + .file = "raddbg", .label = (char*)file_name_escaped.str, .r = t_dbg_script_runner, .user_data = str8_copy(arena, file_path), @@ -885,4 +951,3 @@ t_dbg_register_script_tests(Arena *arena, String8 folder_path) scratch_end(scratch); } -#undef T_Group diff --git a/src/torture/torture_dbg.h b/src/torture/torture_dbg.h index 1f22a318..39e73b05 100644 --- a/src/torture/torture_dbg.h +++ b/src/torture/torture_dbg.h @@ -21,31 +21,37 @@ typedef struct T_DbgScriptFile *last; } T_DbgScriptFileList; +#define T_DbgScriptCmdKind_XList \ + X(Breakpoint, "bp") \ + X(ClearBreakpoints, "bp_clear") \ + X(Run, "run") \ + X(Halt, "halt") \ + X(StepOver, "step_over") \ + X(StepInto, "step_into") \ + X(StepOut, "step_out") \ + X(StepOverInst, "step_over_inst") \ + X(StepIntoInst, "step_over_inst") \ + X(StepOverLine, "step_over_line") \ + X(StepIntoLine, "step_into_line") \ + X(KillAll, "kll_all") \ + X(At, "at") \ + X(Eval, "eval") + typedef enum { T_DbgScriptCmdKind_Null, - T_DbgScriptCmdKind_Breakpoint, - T_DbgScriptCmdKind_ClearBreakpoints, - T_DbgScriptCmdKind_Run, - T_DbgScriptCmdKind_Halt, - T_DbgScriptCmdKind_StepOver, - T_DbgScriptCmdKind_StepInto, - T_DbgScriptCmdKind_StepOut, - T_DbgScriptCmdKind_StepOverInst, - T_DbgScriptCmdKind_StepIntoInst, - T_DbgScriptCmdKind_StepOverLine, - T_DbgScriptCmdKind_StepIntoLine, - T_DbgScriptCmdKind_KillAll, - T_DbgScriptCmdKind_At, - T_DbgScriptCmdKind_Eval, +#define X(n,...) T_DbgScriptCmdKind_##n, + T_DbgScriptCmdKind_XList +#undef X T_DbgScriptCmdKind_Count } T_DbgScriptCmdKind; typedef struct T_DbgScriptCmd { struct T_DbgScriptCmd *next; - T_DbgScriptCmdKind kind; - U64 line; + T_DbgScriptCmdKind kind; + U64 line_num; + U64 col_num; union { struct { S64 delta; @@ -78,6 +84,7 @@ typedef enum T_DbgScriptDirectiveKind_Compile, T_DbgScriptDirectiveKind_Link, T_DbgScriptDirectiveKind_Launch, + T_DbgScriptDirectiveKind_Skip, T_DbgScriptDirectiveKind_Count, } T_DbgScriptDirectiveKind; @@ -89,7 +96,7 @@ typedef struct T_DbgScriptDirective String8 args; union { struct { - T_Compiler compiler; + T_Compiler cc; } compile; }; } T_DbgScriptDirective; diff --git a/src/torture/torture_dwarf.c b/src/torture/torture_dwarf.c index 46d2d185..0649731a 100644 --- a/src/torture/torture_dwarf.c +++ b/src/torture/torture_dwarf.c @@ -1,8 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#define T_Group "Dwarf" - internal U64 t_dw_test_uleb128(U64 v, U64 expected_length) { @@ -1040,4 +1038,3 @@ TEST(reg_split_spill) } #endif -#undef T_Group diff --git a/src/torture/torture_md.c b/src/torture/torture_md.c index 7b87e7ed..5eabb69f 100644 --- a/src/torture/torture_md.c +++ b/src/torture/torture_md.c @@ -1,6 +1,6 @@ #define T_Group "MD" -TEST(md_tokenizer) +SKIP(md_tokenizer) { MD_TokenizeResult result; diff --git a/src/torture/torture_p2r.c b/src/torture/torture_p2r.c index a7804059..86ac00e1 100644 --- a/src/torture/torture_p2r.c +++ b/src/torture/torture_p2r.c @@ -1,5 +1,3 @@ -#define T_Group "p2r" - #if OS_WINDOWS // TODO: location is not baked consistently @@ -127,5 +125,3 @@ TEST(p2r_determ) #endif #endif -#undef T_Group - diff --git a/src/torture/torture_radlink.c b/src/torture/torture_radlink.c index 56dcd802..f7ec015f 100644 --- a/src/torture/torture_radlink.c +++ b/src/torture/torture_radlink.c @@ -433,8 +433,6 @@ t_write_entry_obj(void) //////////////////////////////// -#define T_Group "Linker" - TEST(machine_compat_check) { // unknown.obj @@ -4712,7 +4710,7 @@ TEST(relocate_undefined_section_symbol) T_Ok(t_write_def_obj(obj_name, (T_COFF_DefObj){ .machine = T_COFF_DefSetMachine(X64), .sections = (T_COFF_DefSection[]){ - { target_name, sect_name, target_name, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, + { target_name, sect_name, str8_cstring(target_name), .flags = "r:data@1", .raw_flags = COFF_SectionFlag_LnkCOMDAT }, {0} }, .symbols = (T_COFF_DefSymbol[]){ @@ -7203,4 +7201,3 @@ TEST(lib_member_reloc_apply_off_out_of_bounds) } #endif -#undef T_Group From e3fa8e483071125089ac7fc68b25d360d9d28407 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 23 May 2026 19:38:54 -0700 Subject: [PATCH 698/850] improve error reports in tests --- src/torture/torture.c | 12 +++++-- src/torture/torture_d2r.c | 76 ++++++++++++++++++++++++++++++--------- 2 files changed, 69 insertions(+), 19 deletions(-) diff --git a/src/torture/torture.c b/src/torture/torture.c index b399371f..385ab907 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -243,12 +243,18 @@ t_run(T_Test *test, String8 user_data) { T_RunCtx ctx = { .test = test, .user_data = user_data, .result.status = T_RunStatus_Fail }; t_run_caller(&ctx); + + if (ctx.result.status == T_RunStatus_Fail || ctx.result.status == T_RunStatus_Crash) { + if (g_output.size > 0 || g_errors.size > 0) { + t_errorf("Last captured output:\n"); + if (g_output.size) { t_errorf("%S\n", g_output); } + if (g_errors.size) { t_errorf("%S\n", g_errors); } + } + } + fflush(stdout); fflush(stderr); - if (ctx.result.status == T_RunStatus_Fail || ctx.result.status == T_RunStatus_Crash) { - fprintf(stderr, "Last captured output:\n%.*s\n", str8_varg(g_output)); - } return ctx.result; } diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 5576f7ea..0fc26099 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -280,18 +280,33 @@ SKIP(d2r_line_table) for EachElement(i, test_table) { for EachIndex(k, test_table[i].line_size) { - t_invoke_radbin("-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); - T_Ok(g_last_exit_code == 0); + String8 cmdl = str8f(arena, "-voff2line -voff:0x%llx %S", test_table[i].voff + k, t_make_file_path(arena, str8_lit("a.rdi"))); + t_invoke_radbin(cmdl.str); + + if (g_last_exit_code != 0) { + t_errorf("radbin exited with %llu on \"%S\"\n", (unsigned long long)g_last_exit_code, cmdl); + T_Ok(0); + } if ( ! t_match_linef(&g_output, "%S:%llu", test_table[i].file->path, test_table[i].ln)) { + t_errorf("ERROR: conversion produced unexpected output for \"radbin %S\"\n" \ + " Expected: %S:%llu\n" \ + " Got: %S\n", + cmdl, + test_table[i].file->path, (unsigned long long)test_table[i].ln, + g_output); - fprintf(stderr, - "ERROR: conversion produced unexpected lines for voff 0x%llx\n" \ - "\tExpected: %.*s:%llu\n" \ - "\tGot: %.*s\n", - (unsigned long long)test_table[i].voff, - str8_varg(test_table[i].file->path), (unsigned long long)test_table[i].ln, - str8_varg(g_output)); + if (g_verbose) { + t_invoke_radbin("-dump -only:line_tables a.rdi"); + t_errorf("\n================================================================================\n"); + t_errorf("RDI:\n%S\n", g_output); + + t_errorf("================================================================================\n"); + t_invoke_radbin("-dump -only:debug_line a.exe"); + t_errorf("DWARF:\n%S\n", g_output); + + g_output = str8_zero(); + } T_Ok(0); } @@ -304,6 +319,8 @@ SKIP(d2r_line_table) SKIP(d2r_checksums) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + + B32 is_ok = 0; DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/c/devel/foo.c")); DW_WriterFile *comp_file = dw_writer_new_file(writer, str8_lit("/home/main.c")); @@ -321,18 +338,45 @@ SKIP(d2r_checksums) RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); U64 checksum_count = 0; RDI_MD5 *checksums = rdi_table_from_name(rdi, MD5Checksums, &checksum_count); - T_Ok(checksum_count == writer->line.file_count + 1); + if (checksum_count != writer->line.file_count + 1) { goto exit; } RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)foo_file->path.str); - T_Ok(foo_src_file); - T_Ok(foo_src_file->checksum_kind == RDI_ChecksumKind_MD5); - T_Ok(MemoryMatch(&foo_file->md5, &checksums[foo_src_file->checksum_idx], sizeof(U128))); + if (foo_src_file == 0) { + t_errorf("ERROR: RDI is missing file %S\n", foo_file->path); + goto exit; + } + if (foo_src_file->checksum_kind != RDI_ChecksumKind_MD5) { + t_errorf("ERROR: File %S has unexpected checksum value %u, expected %u\n", foo_file->path, foo_src_file->checksum_kind, RDI_ChecksumKind_MD5); + goto exit; + } + if (MemoryMatch(&foo_file->md5, &checksums[foo_src_file->checksum_idx], sizeof(U128)) != 1) { + t_errorf("ERROR mismatched checksum in file %S\n", foo_file->path); + goto exit; + } RDI_SourceFile *comp_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)comp_file->path.str); - T_Ok(comp_src_file); - T_Ok(comp_src_file->checksum_kind == RDI_ChecksumKind_MD5); - T_Ok(MemoryMatch(&comp_file->md5, &checksums[comp_src_file->checksum_idx], sizeof(U128))); + if (comp_src_file == 0) { + t_errorf("ERROR: RDI is missing file %S\n", comp_file->path); + goto exit; + } + if (comp_src_file->checksum_kind != RDI_ChecksumKind_MD5) { + t_errorf("ERROR: File %S has unexpected checksum value %u, expected %u\n", comp_file->path, comp_src_file->checksum_kind, RDI_ChecksumKind_MD5); + goto exit; + } + if (MemoryMatch(&comp_file->md5, &checksums[comp_src_file->checksum_idx], sizeof(U128)) != 1) { + t_errorf("ERROR mismatched checksum in file %S\n", comp_file->path); + goto exit; + } + is_ok = 1; + exit:; + if ( ! is_ok) { + t_errorf("Converter repro: \"radbin -rdi %S\"\n", t_make_file_path(arena, str8_lit("a.exe"))); + t_invoke(t_radbin_path(), str8_lit("-dump -only:source_files a.rdi"), max_U64); + t_errorf("RDI:\n%S\n", g_output); + t_invoke(t_radbin_path(), str8_lit("-dump -only:debug_line a.exe"), max_U64); + t_errorf("DWARF:\n%S\n", g_output); + } dw_writer_end(&writer); } From 637a0f88b27e67d562964b66ba6985f6ba2e6cc8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 24 May 2026 12:07:54 -0700 Subject: [PATCH 699/850] add run_to_line command; clean up pass over script parser; changed harness to always compile and link tests to prevent code rotting --- src/torture/dbg_tests/mule.cpp | 3673 ++++++++++++++++++++++++++++++++ src/torture/torture.c | 26 +- src/torture/torture_d2r.c | 2 +- src/torture/torture_dbg.c | 617 +++--- src/torture/torture_dbg.h | 283 +-- src/torture/torture_main.c | 2 + 6 files changed, 4210 insertions(+), 393 deletions(-) create mode 100644 src/torture/dbg_tests/mule.cpp diff --git a/src/torture/dbg_tests/mule.cpp b/src/torture/dbg_tests/mule.cpp new file mode 100644 index 00000000..e81a9d52 --- /dev/null +++ b/src/torture/dbg_tests/mule.cpp @@ -0,0 +1,3673 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +/// test: { +/// windows: { +/// skip: "" +/// compile: "/Z7 /c /I%SRC% /EHsc mule_main.cpp mule_inline.cpp" +/// compile: "/Z7 /c /I%SRC% mule_c.c" +/// compile: "/Z7 /c /O2 mule_o2.cpp" +/// compile: "/Z7 /c mule_module.cpp" +/// link: "/DEBUG:FULL /out:mule_main.exe mule_main.obj mule_inline.obj mule_c.obj mule_o2.obj" +/// link: "/DEBUG:FULL /DLL mule_module.obj" +/// launch: "mule_main.exe" +/// } +/// } + +/// file: "mule_c.h" + +void c_type_coverage_eval_tests(void); +void c_type_with_bitfield_usage(void); + +/// file: "mule_c.c" + +/* +* Program to run in debugger organized to provide tests for +* single threaded stepping, breakpoints, evaluation. +*/ + +//////////////////////////////// +// NOTE(allen): Complex Types + +#include + +void +c_type_coverage_eval_tests(void){ +#if _WIN32 + _Fcomplex x = _FCbuild(0.f, 1.f); + _Dcomplex y = _Cbuild(0.f, -1.f); + +#else + float complex x = 0.f + 1.f*I; + double complex y = 0.0 - 1.0*I; + +#endif +} + +//////////////////////////////// +// NOTE(allen): Reuse Type Names From Another Module + +#include + +typedef struct Basics{ + double a; + float b; + unsigned long long c; + long long d; + unsigned int e; + int f; + unsigned short g; + short h; + unsigned char i; + char j; + + int z; +} Basics; + +typedef struct Basics_Stdint{ + double x1; + float x2; + uint64_t x3; + int64_t x4; + uint32_t x5; + int32_t x6; + uint16_t x7; + int16_t x8; + uint8_t x9; + int8_t x0; +} Basics_Stdint; + +typedef struct Pair{ + int i; + float f; +} Pair; + +void +c_versions_of_same_types(void){ + Basics basics = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; + Basics_Stdint basics_stdint = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; + Pair memory_[] = { + {100, 1.f}, + {101, 2.f}, + {102, 4.f}, + {103, 8.f}, + {104, 16.f}, + {105, 32.f}, + }; + + int x = memory_[3].i + basics.f; +} + +//////////////////////////////// +//~ NOTE(rjf): Bitfields + +typedef struct TypeWithBitfield TypeWithBitfield; +struct TypeWithBitfield +{ + int v : 14; + int w : 4; + int x : 32; + int y : 4; + int z : 10; +}; + +typedef struct BitfieldType64 BitfieldType64; +struct BitfieldType64 +{ + uint64_t size : 63; + uint64_t is_free : 1; +}; + +static int mut_xarray[4] = {100, 101, 102, 103}; +static float mut_farray[4] = {100.5f, 101.5f, 102.5f, 103.5f}; + +void +c_type_with_bitfield_usage(void) +{ + TypeWithBitfield b = {0}; + b.v = 100; + b.w = 6; + b.x = 434512; + b.y = 7; + b.z = 12; + int x = (b.v + b.x); + int y = (b.y - b.z); + int z = (b.w) + 5; + BitfieldType64 b64 = {0}; + b64.size = 524288; + b64.is_free = 1; + int abc = mut_xarray[0]; + mut_xarray[0] += 1; + abc += mut_xarray[0]; + abc += mut_xarray[1]; + abc += mut_xarray[2]; + float f = mut_farray[0] + mut_farray[1] + mut_farray[2] + mut_farray[3]; + int w = 0; +} + +/// file: "inline_body.cpp" + +bias = (bias^x)&7; +x -= bias; +x *= 2; +x *= x; +x += bias; + +/// file: "mule_inline.cpp" + +/* +** Make sure we have an inlined function +*/ + +#if defined(_MSC_VER) +# define FORCE_INLINE __forceinline +#elif defined(__clang__) || defined(__GNUC__) +# define FORCE_INLINE __attribute__((always_inline)) +#else +# error need force inline for this compiler +#endif + +//////////////////////////////// +// NOTE(allen): Inline Stepping + +unsigned int fixed_frac_bits = 5; +static unsigned int bias = 7; + +static FORCE_INLINE unsigned int +fixed_mul(unsigned int a, unsigned int b){ + unsigned int c = (((a - bias)*(b - bias)) >> fixed_frac_bits) + bias; + return(c); +} + +static FORCE_INLINE unsigned int +multi_file_inlinesite(unsigned int x){ + // force compiler to generate annotations for code that's inside another file +#include "inline_body.cpp" + return x >> fixed_frac_bits; +} + +static unsigned int test_value = 0; + +unsigned int +inline_stepping_tests(void){ + bias = 15; + + // NOTE(nick): Interesting that CL does not generate inline site symbols in order of apperance here unlike clang. + + // CL: + // BinaryAnnotations: CodeLengthAndCodeOffset d 0 + // BinaryAnnotation Length: 4 bytes (1 bytes padding) + // + // Clang: + // BinaryAnnotations: LineOffset 1 CodeLength d + // BinaryAnnotation Length: 4 bytes (0 bytes padding) + unsigned int x = fixed_mul(5001, 7121); + + // CL: + // BinaryAnnotations: CodeOffsetAndLineOffset d File 0 CodeOffsetAndLineOffset 22 LineOffset 1e + // CodeLengthAndCodeOffset 2 3 + // BinaryAnnotation Length: 12 bytes (1 bytes padding) + // + // Clang: + // BinaryAnnotations: File 18 LineOffset ffffffe6 CodeOffset d CodeOffsetAndLineOffset 22 + // File 0 LineOffset 1e CodeOffset 3 CodeLength 2 + // BinaryAnnotation Length: 16 bytes (0 bytes padding) + unsigned int z = multi_file_inlinesite(x); + return(z); +} + +/// file: "mule_o2.cpp" + +static int important_s32 = 0; +static float important_f32 = 0; + +#if _WIN32 +#include +#endif + +static void +do_something_with_intermediate_values(void) +{ + static int another_important_s32 = 0; + static float another_important_f32 = 0; + + another_important_s32 = (int)important_f32; + another_important_f32 = (float)important_s32; + +#if _WIN32 + char buffer[256] = "Hello, World!\n"; + buffer[0] += important_s32 + another_important_s32; + buffer[1] += (int)another_important_f32 * important_f32; + OutputDebugStringA(buffer); +#endif +} + +static void +store_important_s32(int *ptr) +{ + important_s32 = *ptr; +} + +static void +store_important_f32(float *ptr) +{ + important_f32 = *ptr; +} + +void +optimized_build_eval_tests(void) +{ + int simple_sum = 0; + for(int i = 0; i < 10000; i += 1) + { + simple_sum += i; + } + store_important_s32(&simple_sum); + + do_something_with_intermediate_values(); + + static struct {float x, y;} vec2s[] = + { + { 10.f, 76.f }, + { 40.f, 50.f }, + { -230.f, 20.f }, + { 27.f, 27.f }, + { 57.f, -57.f }, + { -37.f, 97.f }, + { 99.f, 67.f }, + { 99.f, 37.f }, + { 99.f, 57.f }, + }; + { + struct{float x, y;}sum = {0}; + int count = sizeof(vec2s)/sizeof(vec2s[0]); + for(int i = 0; i < count; i += 1) + { + sum.x += vec2s[i].x; + sum.y += vec2s[i].y; + } + struct{float x, y;}avg = {sum.x/count, sum.y/count}; + float f32 = avg.x * avg.y; + store_important_f32(&f32); + } + + do_something_with_intermediate_values(); + + int factorial = 1; + for(int i = 10; i > 0; i -= 1) + { + factorial *= i; + } + store_important_s32(&factorial); + + do_something_with_intermediate_values(); +} + +//////////////////////////////// +// NOTE(allen): Struct Parameters Eval + +struct OptimizedBasics{ + char a; + unsigned char b; + short c; + unsigned short d; + int e; + unsigned int f; + long long g; + unsigned long long h; + float i; + double j; +}; + +static void +optimized_struct_parameter_helper(int *ptr, OptimizedBasics basics) +{ + basics.a += *ptr; + basics.a += 1; + basics.a += 1; +} + +void +optimized_struct_parameters_eval_tests(void) +{ + int x = 10; + OptimizedBasics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + optimized_struct_parameter_helper(&x, basics); +} + +/// file: "mule_main.cpp" + +/* +** Program to run in debugger organized to provide tests for +** stepping, breakpoints, evaluation, cross-module calls. +*/ + +#define EvalTest(expr, match) + +#if _WIN32 && _DEBUG +#pragma comment(linker, "/nodefaultlib:libcmt") +#pragma comment(lib, "libcmtd") +#endif + +#include +#include +#include +#include +#if !_WIN32 +# define RADDBG_MARKUP_STUBS +#endif +#define RADDBG_MARKUP_IMPLEMENTATION +#include "lib_raddbg_markup/raddbg_markup.h" + +//////////////////////////////// +// NOTE(allen): System For DLL Testing + +typedef void TestFunction(void); + +static void mule_init(void); +static TestFunction* mule_get_module_function(char *name); + +#if _WIN32 + +#include + +HMODULE mule_dll = 0; + +static void +mule_init(void){ + mule_dll = LoadLibraryA("mule_module.dll"); +} + +static TestFunction* +mule_get_module_function(char *name){ + TestFunction *result = (TestFunction*)GetProcAddress(mule_dll, name); + return(result); +} + +#else + +static void +mule_init(void){ + // TODO(allen): implement +} + +static TestFunction* +mule_get_module_function(char *name){ + // TODO(allen): implement + return(0); +} + +#endif + + +//////////////////////////////// +// NOTE(nick): Entry Point + +int +mule_main(int argc, char **argv); + +#if _WIN32 +#include +#include +int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ + int argc = __argc; + char **argv = __argv; + int result = mule_main(argc, argv); + return(result); +} +#else +int main(int argc, char **argv){ + return(mule_main(argc, argv)); +} +#endif + +//////////////////////////////// +// NOTE(nick): BSS section test + +#if defined(__clang__) +# pragma clang section bss="muleBSS" +#elif defined(_MSC_VER) +// NOTE(nick): clang-cl is borken it allocates memory and sets Initialized Flag on the seciton. +// This is was reported by Jeff => https://bugs.llvm.org/show_bug.cgi?id=47939 +// +// This is still unresolved, last checked Sep 11, 2023. +# pragma bss_seg("muleBSS") +#else +# error "bss not defined" +#endif +char global_variable_in_bss[4096*10000]; + +//////////////////////////////// +// NOTE(allen): Inline Stepping (Built In Separate Unit) + +extern unsigned int fixed_frac_bits; +unsigned int inline_stepping_tests(void); + + +//////////////////////////////// +// NOTE(rjf): -O2 Optimized Code (Built In Separate Unit) + +void optimized_build_eval_tests(void); +void optimized_struct_parameters_eval_tests(void); + +//////////////////////////////// +// NOTE(allen): Type Coverage Eval + +#include + +struct Basics +{ + char a; + unsigned char b; + short c; + unsigned short d; + int e; + unsigned int f; + long long g; + unsigned long long h; + float i; + double j; + int z; +}; + +struct Basics_Stdint +{ + int8_t a; + uint8_t b; + int16_t c; + uint16_t d; + int32_t e; + uint32_t f; + int64_t g; + uint64_t h; + float i; + double j; +}; + +struct Pair +{ + int x; + float y; +}; + +struct Fixed_Array +{ + Pair pairs[10]; + int count; +}; + +struct Dynamic_Array +{ + Pair *pairs; + int count; +}; +raddbg_type_view(Dynamic_Array, slice($)); + +template +struct TemplatedDynamicArray +{ + T *v; + int count; +}; +raddbg_type_view(TemplatedDynamicArray, rows($, count, array(v, count))); + +template +struct OpaqueTemplatedDynamicArray +{ + void *v; + int count; +}; +raddbg_type_view(OpaqueTemplatedDynamicArray, array(cast(type *)v, count)); + +struct Struct_With_Embedded_Arrays +{ + int x; + float y; + Pair pairs[10]; + char z; +}; + +typedef unsigned int Custom_Index_Type; + +typedef void Function_No_Params_Type(void); +typedef void Function_Few_Params_Type(Pair *pairs, int count, Function_No_Params_Type *no_params_type); + +static Function_No_Params_Type *ty_no_params = 0; +static Function_Few_Params_Type *ty_few_params = 0; + +struct Callback{ + Function_Few_Params_Type *few_params; + Function_No_Params_Type *no_params; + Pair pair; +}; + +union Vector_R2 +{ + struct + { + float x; + float y; + }; + float v[2]; +}; +raddbg_type_view(Vector_R2, rows($, x, y)); + +typedef union Matrix4x4F32 Matrix4x4F32; +union Matrix4x4F32 +{ + float elements[4][4]; +}; +raddbg_type_view(Matrix4x4F32, columns($.elements, $[0], $[1], $[2], $[3])); + +union PackedF16 +{ + uint16_t v; + struct + { + uint16_t mantissa : 10; + uint16_t exponent : 5; + uint16_t sign : 1; + }; +}; +raddbg_type_view(PackedF16, + exponent == 0 ? (0.00006103515625f*mantissa/1024.f) : + (exponent == 31 && mantissa == 0 && sign == 1) ? "-infinity" : + (exponent == 31 && mantissa == 0 && sign == 1) ? "+infinity" : + (exponent == 31) ? "NaN" : + (exponent < 15) ? (1.f/(1<<(15 - exponent)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) : + (exponent > 15) ? ((1<<(exponent-15)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) : + ((sign * -2 + 1) * 1.f + mantissa/1024.f)); + +enum Kind +{ + Kind_Negative = -1, + Kind_None, + Kind_First, + Kind_Second, + Kind_Third, + Kind_Fourth, + Kind_COUNT, +}; + +enum Flag +{ + Flag_None = 0, + Flag_First = 1, + Flag_Second = 2, + Flag_Third = 4, + Flag_Fourth = 8, + Flag_AllMoreNarrow = 0xFF, + Flag_AllNarrow = 0xFFFF, + Flag_All = 0xFFFFFFFF, +}; + +struct Has_Enums +{ + Kind kind; + Flag flags; +}; + +struct Discriminated_Union +{ + Kind kind; + union + { + struct + { + int x; + int y; + Vector_R2 vector; + } first; + Pair second; + struct + { + Function_Few_Params_Type *few_params; + Pair pairs[4]; + } third; + struct + { + Kind sub_kind; + Flag flags; + } fourth; + }; +}; +raddbg_type_view(Discriminated_Union, + kind == Kind.First ? first : + kind == Kind.Second ? second : + kind == Kind.Third ? third : + kind == Kind.Fourth ? fourth : + $); + +struct Crazy_Union +{ + Kind kind; + union + { + struct + { + int first_and_third__x; + int first_and_third__y; + int first_and_third__z; + } first_and_third; + struct + { + char *second__name; + Pair second__pairs[16]; + } second; + }; + union + { + struct + { + char *first__name; + int first__x; + } first; + struct + { + char *third__name; + Function_Few_Params_Type *third__few_params; + } third; + }; +}; +raddbg_type_view(Crazy_Union, + kind == Kind.First ? rows($, first_and_third, first) : + kind == Kind.Second ? rows($, second) : + kind == Kind.Third ? rows($, first_and_third, third) : + kind == Kind.Fourth ? kind : + $); + +struct Linked_List{ + Linked_List *next; + Linked_List *prev; + int x; +}; + +enum{ + Anonymous_A, + Anonymous_B, + Anonymous_C, + Anonymous_D, +}; + +typedef uint32_t SizedKind; +enum SizedKindEnum +{ + SizedKind_A, + SizedKind_B, + SizedKind_C, + SizedKind_D, +}; + +typedef Kind Alias1; +typedef Flag Alias2; +typedef Has_Enums Alias3; +typedef Discriminated_Union Alias4; + +struct Has_A_Pre_Forward_Reference{ + struct Gets_Referenced_Forwardly *pointer; +}; + +struct Gets_Referenced_Forwardly{ + int x; + int y; +}; + +struct Has_A_Post_Forward_Reference{ + struct Gets_Referenced_Forwardly value; +}; + +struct TypeWithMemberFunction +{ + int x; + int y; + int z; + char *name; + __declspec(noinline) void SetInfo(int _x, int _y, char *_name) + { + x = _x; + y = _y; + z = 0; + name = _name; + OutputDebugStringA("setting info\n"); + } +}; + +static void +no_params1(void){ + +} + +static void +few_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){ + +} + +// +// NOTE(rjf): this doesn't work because MSVC - despite GENERATING DEBUG INFO +// FOR THE MyByte TYPEDEF - does not actually *reference* this typedef +// anywhere, and instead treats all `MyByte *`s as `char *`s, thus completely +// eliminating the point of the typedef and view. :( +// +typedef char MyByte; +raddbg_type_view(MyByte *, no_string($)); + +static void +variadic_params(char *fmt, ...) +{ + int x = 0; +} + +static void +type_coverage_eval_tests(void) +{ + Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + Basics_Stdint basics_stdint = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + + uint32_t a = (1<<31); + int32_t b = (1<<31); + + uint32_t abcd = 0xaabbccdd; + int64_t abcd64 = (int64_t)abcd; + + char string[] = "Hello World!"; + char longer_text[] = + "Suppose there was some text\n" + "With multiple lines in it\r\n" + "\t> What ways might it be rendered?\n" + "\t> How would it deal with line endings?\r\n"; + wchar_t a_wide_string[] = + L"This is a string, but instead of being encoded in a stream of bytes,\n" + L"it is encoded in a stream of 2-byte packages!\n"; + char some_data_with_a_string[] = + { + 'H', 'e', 'l', 'l', 'o', 27, 27, 2, 27, 125, + }; + struct SomeDataStructured + { + char data[4]; + }; + SomeDataStructured *some_data = (SomeDataStructured *)&some_data_with_a_string[0]; + char *string_ptr = &string[0]; + + const char *const_string = "Hello, World!"; + const char const_string_array[] = "Hello, World!"; + const char *const const_ptr_const_string = "Hello, World!"; + + MyByte *non_string_byte_ptr = "Hello, World!"; + + void *pointer = &basics; + Basics *pointer_to_basics = &basics; + Basics **pointer_to_pointer_to_basics = &pointer_to_basics; + + Fixed_Array fixed = + { + { + { 3, 4.f}, + { 5, 6.f}, + { 7, 8.f}, + { 9, 10.f}, + {11, 12.f}, + {13, 14.f}, + {15, 16.f}, + {17, 18.f}, + {19, 20.f}, + }, + 9 + }; + Pair memory_[] = + { + {100, 1.f}, + {101, 2.f}, + {102, 4.f}, + {103, 8.f}, + {104, 16.f}, + {105, 32.f}, + }; + Dynamic_Array dynamic = + { + memory_, + 6 + }; + EvalTest(dynamic[0].i, 100); EvalTest(dynamic[0].f, 1.f); + EvalTest(dynamic[1].i, 101); EvalTest(dynamic[1].f, 2.f); + EvalTest(dynamic[2].i, 102); EvalTest(dynamic[2].f, 4.f); + + TemplatedDynamicArray templated_dynamic = {dynamic.pairs, dynamic.count}; + TemplatedDynamicArray templated_dynamics[] = + { + {dynamic.pairs, dynamic.count}, + {dynamic.pairs, dynamic.count}, + {dynamic.pairs, dynamic.count}, + {dynamic.pairs, dynamic.count}, + {dynamic.pairs, dynamic.count}, + }; + + OpaqueTemplatedDynamicArray otd = {dynamic.pairs, dynamic.count}; + + raddbg_pin(columns(sequence(6), fixed.pairs[$], memory_[$])); + raddbg_pin(basics); + raddbg_pin(fixed); + raddbg_pin(pointer); + raddbg_pin(dynamic); + + Struct_With_Embedded_Arrays swea = {0}; + { + swea.x = 4; + swea.y = 23.5f; + swea.pairs[0].x = 100; + swea.pairs[0].y = 123.f; + swea.pairs[2].x = 300; + swea.pairs[2].y = 323.f; + swea.pairs[5].x = 600; + swea.pairs[5].y = 623.f; + swea.z = 'z'; + } + + Struct_With_Embedded_Arrays *swea_ptr = &swea; + int access_via_ptr_member = swea_ptr->x; + + Custom_Index_Type custom_index = 42; + Custom_Index_Type more_custom_indices[] = { + 04,13,22,31,40 + }; + + Function_No_Params_Type *ptr_no_params = no_params1; + Function_No_Params_Type **ptr_ptr_no_params = &ptr_no_params; + Function_Few_Params_Type *ptr_few_params = few_params1; + Function_Few_Params_Type **ptr_ptr_few_params = &ptr_few_params; + Callback callback = {few_params1, no_params1, {1, 2.f}}; + + Matrix4x4F32 matrix = + { + { + {1.f, 0.f, 0.f, 0.f}, + {0.f, 1.f, 0.f, 0.f}, + {0.f, 0.f, 1.f, 0.f}, + {0.f, 0.f, 0.f, 1.f}, + } + }; + + Vector_R2 vector = {1.f, 2.f}; + + Has_Enums has_enums = {(Kind)4, (Flag)7}; + + struct EnumBitfields + { + Kind k1 : 4; + Kind k2 : 3; + Kind k3 : 1; + Kind k4 : 16; + }; + + EnumBitfields enum_bitfields = {}; + enum_bitfields.k1 = Kind_First; + enum_bitfields.k2 = Kind_Second; + enum_bitfields.k3 = Kind_None; + enum_bitfields.k4 = Kind_Fourth; + + Crazy_Union crazy_union = {}; + + crazy_union.kind = Kind_First; + crazy_union.kind = Kind_Second; + crazy_union.kind = Kind_Third; + crazy_union.kind = Kind_Fourth; + + Discriminated_Union discriminated_union = {}; + + discriminated_union.kind = Kind_First; + discriminated_union.first.x = 16; + discriminated_union.first.y = 8; + discriminated_union.first.vector.x = 4.f; + discriminated_union.first.vector.y = 2.f; + + discriminated_union.kind = Kind_Second; + discriminated_union.second.x = 123; + discriminated_union.second.y = 3.14f; + + discriminated_union.kind = Kind_Third; + discriminated_union.third.few_params = few_params1; + discriminated_union.third.pairs[0] = memory_[0]; + discriminated_union.third.pairs[1] = memory_[1]; + discriminated_union.third.pairs[2] = memory_[2]; + discriminated_union.third.pairs[3] = memory_[3]; + + discriminated_union.kind = Kind_Fourth; + discriminated_union.fourth.sub_kind = Kind_First; + discriminated_union.fourth.flags = (Flag)7; + + Linked_List list = {&list, &list, 0}; + + struct SLLNode + { + SLLNode *next; + SLLNode *the_real_next_ptr; + int x; + }; + SLLNode node6 = {0, 0, 6}; + SLLNode node5 = {0, &node6, 5}; + SLLNode node4 = {0, &node5, 4}; + SLLNode node3 = {0, &node4, 3}; + SLLNode node2 = {0, &node3, 2}; + SLLNode node1 = {0, &node2, 1}; + raddbg_pin(list(node1, the_real_next_ptr)); + + node6.next = &node1; + + Alias1 a1 = has_enums.kind; + Alias2 a2 = has_enums.flags; + Alias3 a3 = has_enums; + Alias4 a4 = discriminated_union; + + Has_A_Pre_Forward_Reference r1 = {0}; + Has_A_Post_Forward_Reference r2 = {0}; + + Basics &basics_ref = basics; + const Basics *basics_const_ptr = &basics; + const Basics &basics_const_ref = basics; + + union + { + int x; + char y[4]; + } integer_slicing = {123456789}; + + typedef struct stks + { + void *left; + size_t len; + } stks; + stks stks_test[256] = {0}; + stks *stks_first = &stks_test[0]; + stks *stks_ptr = stks_first + 8; + + TypeWithMemberFunction twmf = {0}; + twmf.SetInfo(123, 456, "foobar"); + + TestFunction *function = mule_get_module_function("dll_type_eval_tests"); + function(); + + int abc = 0; + for(int i = 0; i < 1000; i += 1) + { + if(i == 500) + { + abc+= 1; + } + int a = i + abc; + int b = a*5; + } + + char *names[] = + { + "samwise gamgee", "mithrandir", "grima wormtongue", "theodred", "theoden", "eomer", "eowyn", + "arwen", "sauron", "baggins", "proudfoot", "hardbottle", "bag end", "hobbiton", + "bree", "imladris", "isengard", "moria", "mount doom", "helm's deep", "bracegirdle", + "buckleberry ferry", "amun sul", "frodo", "bilbo", "buckland", "fangorn", "elrond", + "numenor", "treebeard", "shadowfax", "brego", "erod", "azufel", "dunedain", + "saruman", "aragorn", "gandalf", "meriadoc brandybuck", "peregrine took", "faramir", "boromir", + "ecthelion", "denethor", "mithrandil", "isildur", "haldir", "elessar", "elendil", + "dead marsh", "rohan", "gondor", "anarion", "earendil", "cirith ungol", "minas morghul", + "minas tirith", "barad-dur", "rivendell", "pellenor", "ithilien", "anduril", "narsil", + "edoras", "mordor", "osgiliath", + }; + + for(int i = 0; i < sizeof(names)/sizeof(names[0]); i += 1) + { + OutputDebugStringA(names[i]); + OutputDebugStringA("\n"); + } + + if(1) + { + OutputDebugStringA("this is inside a branch!\n"); + OutputDebugStringA("foo"); + OutputDebugStringA("bar"); + OutputDebugStringA("baz"); + } + + const int32_t x1 = 3; + const int32_t y1 = -10; + const int32_t z1 = x1 + y1; + + std::string small_cplusplus_string = "smallstr"; + std::string cplusplus_string = "This is a C++ string!"; + + std::vector int_vector; + int_vector.push_back(1); + int_vector.push_back(2); + int_vector.push_back(3); + int_vector.push_back(4); + int_vector.push_back(5); + int_vector.push_back(6); + int_vector.push_back(7); + + std::unordered_map people = + { + {"Peter", 1}, + {"Oliver", 2}, + {"Jack", 3}, + }; + + std::vector *pint_vector = &int_vector; + std::vector &rint_vector = int_vector; + + std::vector dynamic_array_vector; + dynamic_array_vector.push_back(dynamic); + dynamic_array_vector.push_back(dynamic); + dynamic_array_vector.push_back(dynamic); + dynamic_array_vector.push_back(dynamic); + + SizedKind sized_kind = SizedKind_C; + + variadic_params("foo", 123, 456); + + int x = (int)(Anonymous_D); +} + +//////////////////////////////// +// NOTE(allen): Mutating Variables Eval + +static const int con_some_constant = 4; +static const float con_some_constant_f = 0.04f; + +static int mut_x = 0; +static int mut_y; +static int mut_xarray[4] = {0, 1, 2, 3}; +static int *mut_xptr; + +static float mut_f = 0; +static float mut_g; +static float mut_farray[4] = {0.5f, 1.5f, 2.5f, 3.5f}; +static float *mut_fptr; + +static float mut_arrayarray[3][3]; + +static Linked_List mut_link; + +static void +mutate_in_function(int *array, int count){ + for (int i = 0; i < count; i += 1){ + array[i] += 1; + } + + for (int i = 0; i < 4; i += 1){ + mut_farray[i] += 1.f; + } +} + +static void +mutating_variables_eval_tests(void){ + //////////////////////////////// + // NOTE(allen): Basics + + int array_literal[10] = { + 10, 20, 30, 40, 50, 60, 70, 80, 90, + }; + + Basics struct_literal = { + -1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001, + }; + + array_literal[0] = struct_literal.e = 9; + + int x = mut_x; + int y = x + 10 + con_some_constant; + mut_y = y; + mut_xarray[0] += 0; + mut_xarray[1] += x; + mut_xarray[2] += y; + mut_xarray[3] += x + y; + + mut_xptr = &mut_xarray[2]; + + *mut_xptr -= (y - x)/2; + *(mut_xptr - 1) += 11; + + float f = mut_f + .333f + con_some_constant_f; + float g = f + 10.1f; + mut_g = g; + mut_farray[0] += 0.000001f; + mut_farray[1] += f; + mut_farray[2] += g; + mut_farray[3] += f + g; + + mut_fptr = &mut_farray[3]; + + *mut_fptr -= (g - f)*0.5f; + *(mut_fptr - 1) += 1.f; + + float a = 0.777f; + for (int i = 0; i < 3; i += 1){ + float b = a*a - 1.f; + for (int j = 0; j < 3; j += 1){ + mut_arrayarray[i][j] = b; + b += 0.111f; + } + a += 0.333f; + } + + //////////////////////////////// + // NOTE(allen): Changes in functions + + mutate_in_function(array_literal, 10); + + mutate_in_function(array_literal, 10); + + //////////////////////////////// + // NOTE(allen): Changes through pointers + + Basics basic = struct_literal; + Basics advanced = struct_literal; + + Basics *struct_pointer = &basic; + + basic.a += 1; + advanced.a += 1; + struct_pointer->a += 1; + + struct_pointer = &advanced; + + basic.b += 1; + advanced.b += 1; + struct_pointer->b += 1; + + Linked_List links[5]; + for (int i = 0; i < 5; i += 1){ + links[i].next = &links[i + 1]; + links[i].prev = &links[i - 1]; + links[i].x = i; + } + links[0].prev = 0; + links[4].next = &mut_link; + mut_link.prev = &links[4]; + mut_link.next = 0; + mut_link.x = 1000; + + Linked_List *link_ptr = links; + + link_ptr = link_ptr->next; + + link_ptr = &links[4]; + link_ptr = &mut_link; + + Linked_List sentinel = {0}; + sentinel.x = -1; + sentinel.next = &links[0]; + links[0].prev = &sentinel; + sentinel.prev = &mut_link; + mut_link.next = &sentinel; + + link_ptr = &sentinel; +} + +//////////////////////////////// +// NOTE(allen): Global Eval + +struct NestedNodeInner{ + unsigned int small0; + unsigned int small1; + unsigned int big0; + unsigned int big1; +}; + +struct NestedNodeOuter{ + NestedNodeOuter *next; + NestedNodeInner *inner_nodes; + unsigned int inner_node_count; +}; + +static void +nested_types_eval_tests(void){ + // doing some setup + NestedNodeOuter *outer1 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); + NestedNodeOuter *outer2 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); + NestedNodeOuter *outer3 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); + + outer1->next = outer2; + outer2->next = outer3; + outer3->next = 0; + + outer1->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); + outer1->inner_node_count = 10; + + outer2->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); + outer2->inner_node_count = 10; + + outer3->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); + outer3->inner_node_count = 10; + + for (unsigned int i = 0; i < 10; i += 1){ + outer1->inner_nodes[i].small0 = i; + outer1->inner_nodes[i].small1 = 2*i; + outer1->inner_nodes[i].big0 = 0xFFFFFF + 0xF*i; + outer1->inner_nodes[i].big1 = 0xFFFFFF + 0xFF*i; + + outer2->inner_nodes[i].small0 = 1 + i; + outer2->inner_nodes[i].small1 = 3*i; + outer2->inner_nodes[i].big0 = 0x1000000 + 0x10*i; + outer2->inner_nodes[i].big1 = 0x1000000 + 0x101*i; + + outer3->inner_nodes[i].small0 = 2 + i; + outer3->inner_nodes[i].small1 = 4*i; + outer3->inner_nodes[i].big0 = 0x8000000 + 0xF0*i; + outer3->inner_nodes[i].big1 = 0x8000000 + 0xF0F*i; + } + + // okay eval it here + int x = 0; +} + +//////////////////////////////// +// NOTE(rjf): Struct Parameters Eval + +static void +struct_parameter_helper(Basics basics) +{ + basics.a += 1; + basics.a += 1; + basics.a += 1; +} + +static void +struct_parameters_eval_tests(void) +{ + Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + struct_parameter_helper(basics); +} + +//////////////////////////////// +// NOTE(allen): Global Eval + +static int g_abc = 100; +static float g_xyz = 21.f; +static Alias1 g_kind = Kind_First; + +static void +complicated_global_mutation(int *x){ + *x = (int)g_xyz; +} + +static void +cross_unit_global_mutation(void){ + fixed_frac_bits = 10; +} + +static int +function_with_duplicate_local_statics(void) +{ + static char *l_abc = "foobar"; + static int l_xyz = 123; + static Kind l_kind = Kind_First; + int x = l_xyz + (int)(int64_t)(l_abc); + return x; +} + +static void +global_eval_tests(void) +{ + g_abc = 11*11; + g_xyz = (float)g_abc - 21.f; + + int z = g_abc; + complicated_global_mutation(&z); + + complicated_global_mutation(&g_abc); + + if (g_kind == Kind_First){ + g_abc -= 1; + g_kind = Kind_None; + } + + cross_unit_global_mutation(); + + static int l_abc = 200; + static float l_xyz = 42.f; + static Alias1 l_kind = Kind_Second; + + l_abc = g_abc*2; + l_xyz = g_xyz*2; + l_kind = (Alias1)(g_kind + 1); + + function_with_duplicate_local_statics(); +} + +//////////////////////////////// +// NOTE(allen): Return Eval + +static int +complicated_return_expression(void){ + int x = 171717; + return((x % 13) <= 5?(x % 19)*11:(x - 500)%200); +} + +static void +return_eval_tests(void){ + complicated_return_expression(); +} + +//////////////////////////////// +// NOTE(allen): TLS Eval + +#if _WIN32 +# define thread_var __declspec(thread) +#else +# define thread_var __thread +#endif + +thread_var int tls_a = 100; +thread_var int tls_b = 999; + +static void +tls_eval_tests(void){ + tls_a = (tls_a + tls_b)/2; + tls_b = tls_b - tls_a; + + TestFunction *dll_tls_eval_test = mule_get_module_function("dll_tls_eval_test"); + if (dll_tls_eval_test != 0){ + dll_tls_eval_test(); + } +} + +//////////////////////////////// +// NOTE(allen): Complicated Type Coverage Eval + +struct Complicated_Type_Members{ + int x600[2][2][2][2]; + int *x601[2][2][2][2]; + int (*x602)[2][2][2][2]; + int (*x603[2])[2][2][2]; + int (*(*x604[2])[2])[2][2]; + int (*(*(*x605[2])[2])[2])[2]; + + int (*x33[2])(void); + int (*x34[3])(void); + int (*x35[2][2])(void); + + int (*(*z33)(void))[2]; + int (*(*z34)(void))[3]; + int (*(*z35)(void))[2][2]; + + int (*(*f2)(void))(void); + int (*(*(*f3)(void))(void))(void); + int (*(*f4)(int))(void); + int (*(*f5)(void))(int); + int (*(*f6)(int))(int); + int (*(*(*f7_growing)(char))(short))(int); + int (*(*(*f7_shrinking)(int))(short))(char); +}; + +static void +complicated_type_coverage_tests(void){ + Complicated_Type_Members m = {0}; + + int x1 = {0}; + int *x2 = {0}; + int **x3 = {0}; + + int x4a[2] = {0}; + int *x4[2] = {0}; + int x5a[3] = {0}; + int *x5[3] = {0}; + int *x6[2][2] = {0}; + int (*x7)[2] = {0}; + int (*x8)[3] = {0}; + int (*x9)[2][2] = {0}; + + int x600[2][2][2][2] = {0}; + int *x601[2][2][2][2] = {0}; + int (*x602)[2][2][2][2] = {0}; + int (*x603[2])[2][2][2] = {0}; + int (*(*x604[2])[2])[2][2] = {0}; + int (*(*(*x605[2])[2])[2])[2] = {0}; + + int x606_growing [2][3][4][5] = {0}; + int x606_shrinking[5][4][3][2] = {0}; + + int (*(*(*x607_growing [2])[3])[4])[5] = {0}; + int (*(*(*x607_shrinking[5])[4])[3])[2] = {0}; + + int **x10[2] = {0}; + int **x11[3] = {0}; + int **x12[2][2] = {0}; + int *(*x13)[2] = {0}; + int *(*x14)[3] = {0}; + int *(*x15)[2][2] = {0}; + int **x16[2] = {0}; + int **x17[3] = {0}; + int **x18[2][2] = {0}; + + int (*y1[2])[2] = {0}; + int (*y2[3])[2] = {0}; + int (*y3[2][2])[2] = {0}; + int (*y4[2])[3] = {0}; + int (*y5[3])[3] = {0}; + int (*y6[2][2])[3] = {0}; + int (*y7[2])[2][2] = {0}; + int (*y8[3])[2][2] = {0}; + int (*y9[2][2])[2][2] = {0}; + + int (*x19)(void) = {0}; + int (*x20)(int) = {0}; + int (*x21)(int, int) = {0}; + int (*x22)(int*, int) = {0}; + int (*x23)(int**, int) = {0}; + int (*x24)(int**, int*) = {0}; + int (*x25)(int**, int**) = {0}; + + int *(*x26)(void) = {0}; + int *(*x27)(int) = {0}; + int *(*x28)(int, int) = {0}; + int *(*x29)(int*, int) = {0}; + int *(*x30)(int**, int) = {0}; + int *(*x31)(int**, int*) = {0}; + int *(*x32)(int**, int**) = {0}; + + int (*x33[2])(void) = {0}; + int (*x34[3])(void) = {0}; + int (*x35[2][2])(void) = {0}; + + int (*x36[2])(int) = {0}; + int (*x37[3])(int) = {0}; + int (*x38[2][2])(int) = {0}; + + int (*x39[2])(int, int) = {0}; + int (*x40[3])(int, int) = {0}; + int (*x41[2][2])(int, int) = {0}; + + int (*x42[2])(int*, int) = {0}; + int (*x43[3])(int*, int) = {0}; + int (*x44[2][2])(int*, int) = {0}; + + int (*x45[2])(int**, int) = {0}; + int (*x46[3])(int**, int) = {0}; + int (*x47[2][2])(int**, int) = {0}; + + int (*x48[2])(int**, int*) = {0}; + int (*x49[3])(int**, int*) = {0}; + int (*x50[2][2])(int**, int*) = {0}; + + int (*x51[2])(int**, int**) = {0}; + int (*x52[3])(int**, int**) = {0}; + int (*x53[2][2])(int**, int**) = {0}; + + int (*(*z33)(void))[2] = {0}; + int (*(*z34)(void))[3] = {0}; + int (*(*z35)(void))[2][2] = {0}; + + int (*(*z36)(int))[2] = {0}; + int (*(*z37)(int))[3] = {0}; + int (*(*z38)(int))[2][2] = {0}; + + int (*(*z39)(int, int))[2] = {0}; + int (*(*z40)(int, int))[3] = {0}; + int (*(*z41)(int, int))[2][2] = {0}; + + int (*(*z42)(int*, int))[2] = {0}; + int (*(*z43)(int*, int))[3] = {0}; + int (*(*z44)(int*, int))[2][2] = {0}; + + int (*(*z45)(int**, int))[2] = {0}; + int (*(*z46)(int**, int))[3] = {0}; + int (*(*z47)(int**, int))[2][2] = {0}; + + int (*(*z48)(int**, int*))[2] = {0}; + int (*(*z49)(int**, int*))[3] = {0}; + int (*(*z50)(int**, int*))[2][2] = {0}; + + int (*(*z51)(int**, int**))[2] = {0}; + int (*(*z52)(int**, int**))[3] = {0}; + int (*(*z53)(int**, int**))[2][2] = {0}; + + int (*(*z303[2])(void)) = {0}; + int (*(*z304[3])(void)) = {0}; + int (*(*z305[2][2])(void)) = {0}; + + int (*(*z306[2])(int)) = {0}; + int (*(*z307[3])(int)) = {0}; + int (*(*z308[2][2])(int)) = {0}; + + int (*(*z309[2])(int, int)) = {0}; + int (*(*z400[3])(int, int)) = {0}; + int (*(*z401[2][2])(int, int)) = {0}; + + int (*(*z402[2])(int*, int)) = {0}; + int (*(*z403[3])(int*, int)) = {0}; + int (*(*z404[2][2])(int*, int)) = {0}; + + int (*(*z405[2])(int**, int)) = {0}; + int (*(*z406[3])(int**, int)) = {0}; + int (*(*z407[2][2])(int**, int)) = {0}; + + int (*(*z408[2])(int**, int*)) = {0}; + int (*(*z409[3])(int**, int*)) = {0}; + int (*(*z500[2][2])(int**, int*)) = {0}; + + int (*(*z501[2])(int**, int**)) = {0}; + int (*(*z502[3])(int**, int**)) = {0}; + int (*(*z503[2][2])(int**, int**)) = {0}; + + int (*(*f2)(void))(void) = {0}; + int (*(*(*f3)(void))(void))(void) = {0}; + int (*(*f4)(int))(void) = {0}; + int (*(*f5)(void))(int) = {0}; + int (*(*f6)(int))(int) = {0}; + int (*(*(*f7_growing)(char))(short))(int) = {0}; + int (*(*(*f7_shrinking)(int))(short))(char) = {0}; + + int (*f8)(int (*)(void)) = {0}; + int (*f9)(void (*)(int)) = {0}; + void (*f10)(int (*)(int)) = {0}; + int (*f11)(int, int (*)(void)) = {0}; + int (*f12)(int (*)(void), int) = {0}; + int (*f13)(int (*)(void), int (*)(void)) = {0}; + + int (*f14)(int (*)(void)) = {0}; + int (*f15)(int (*)(int (*)(void))) = {0}; + int (*f16)(int (*)(int (*)(int (*)(void)))) = {0}; + int (*f17)(int (*)(int (*)(int (*)(int (*)(void))))) = {0}; + + int (*f18)(int (*)(void)) = {0}; + int (*f19)(int (*(*)(void))(void)) = {0}; + int (*f20)(int (*(*(*)(void))(void))(void)) = {0}; + int (*f21)(int (*(*(*(*)(void))(void))(void))(void)) = {0}; + + int (*(*(*(*f22)(void))(void))(void))(void) = {0}; + int (*(*(*(*f23)(int [2]))(void))(void))(void) = {0}; + int (*(*(*(*f24)(int *[2]))(int [3]))(void))(void) = {0}; + int (*(*(*(*f25)(int (*)[2]))(int *[3]))(int [4]))(void) = {0}; + int (*(*(*(*f26)(int **(**)[2]))(int (*)[3]))(int *[4]))(int [5]) = {0}; + + int x = 0; +} + +//////////////////////////////// +// NOTE(allen): Extended Type Coverage Eval + +template +struct Template_Example{ + X x; + int y; +}; + +template +struct Template_Example2{ + X x; + Y y; +}; + +template +struct Template_Example3{ + X x; + Y y; + Template_Example3(X x, Y y) + { + this->x = x; + this->y = y; + } + ~Template_Example3() + { + int x = 2; + int y = 5; + int z = x + y; + } +}; + +struct SingleInheritanceBase +{ + int x; + int y; +}; + +struct SingleInheritanceDerived : SingleInheritanceBase +{ + int z; + int w; +}; + +struct Has_Members{ + int a; + int b; + uint64_t c; + uint64_t d; + Basics bas; + + int w(void){ return a; } + int x(void){ return b; } + uint64_t y(void){ return c; } + uint64_t z(void){ return d; } + Basics bas_f(void){ return bas; } +}; + +struct Has_Static_Members{ + int a; + int b; + static uint64_t c; + static uint64_t d; + + int w(void){ return a; } + int x(void){ return b; } + static uint64_t y(void){ return c; } + static uint64_t z(void){ return d; } +}; + +uint64_t Has_Static_Members::c = 0; +uint64_t Has_Static_Members::d = 0; + +struct Pointer_To_Member{ + int Has_Members::*member_ptr_int; + uint64_t Has_Members::*member_ptr_u64; + Basics Has_Members::*member_ptr_bas; + + int (Has_Members::*method_ptr_int)(void); + uint64_t (Has_Members::*method_ptr_u64)(void); + Basics (Has_Members::*method_ptr_bas)(void); +}; + +struct Has_Sub_Types{ + struct Sub_Type1{ + int x; + int y; + }; + + struct Sub_Type2{ + float x; + float y; + }; + + Sub_Type1 a; + Sub_Type2 b; +}; + +struct Conflicting_Type_Names{ + struct Sub_Type1{ + uint64_t z; + }; + + struct Sub_Type2{ + int64_t z; + }; + + Sub_Type1 a; + Sub_Type2 b; +}; + +struct Has_Private_Sub_Types{ + Has_Private_Sub_Types(char x1, char y1, + float x2, int y2, + int x3, float y3){ + this->a.x = x1; + this->a.y = y1; + this->b.x = x2; + this->b.y = y2; + this->c.x = x3; + this->c.y = y3; + } + + struct Public_Sub_Type{ + char x; + char y; + }; + Public_Sub_Type a; + + protected: + struct Protected_Sub_Type{ + float x; + int y; + }; + Protected_Sub_Type b; + + private: + struct Private_Sub_Type{ + int x; + float y; + }; + Private_Sub_Type c; +}; + +struct Vtable_Parent{ + virtual void a_virtual_function(void) = 0; + virtual void b_virtual_function(void) = 0; + virtual void c_virtual_function(void) = 0; + + void a_virtual_function(int r){ + for (int i = 0; i < r; i += 1){ + a_virtual_function(); + } + } +}; + +struct Vtable_Child : Vtable_Parent{ + int x; + int y; + + Vtable_Child(int a, int b){ + x = a; + y = b; + } + virtual void a_virtual_function(void){ + x = 0; + }; + virtual void b_virtual_function(void){ + y = 0; + }; + virtual void c_virtual_function(void){ + x = y; + }; +}; + +struct Vinheritance_Base{ + int x; + int y; + + virtual void a_virtual_function(void){ + x = 0; + }; + virtual void b_virtual_function(void){ + y = 0; + }; + virtual void x_virtual_function(void){ + y = x; + }; +}; + +struct Vinheritance_MidLeft : virtual Vinheritance_Base{ + float left; + + virtual void c1_virtual_function(void){ + left = 0; + }; + virtual void c2_virtual_function(void){ + left = 0; + }; +}; + +struct Vinheritance_MidRight : virtual Vinheritance_Base{ + float right; + + virtual void d_virtual_function(void){ + right = 0; + }; +}; + +struct Vinheritance_Child : Vinheritance_MidLeft, Vinheritance_MidRight{ + char *name; + + virtual void a_virtual_function(void){ + x = 1; + }; + virtual void c1_virtual_function(void){ + left = 1; + }; +}; + +struct Minheritance_Base{ + int x; + int y; +}; + +struct Minheritance_MidLeft : Minheritance_Base{ + float left; +}; + +struct Minheritance_MidRight : Minheritance_Base{ + float right; +}; + +struct Minheritance_Child : Minheritance_MidLeft, Minheritance_MidRight{ + char *name; +}; + +struct Pure +{ + virtual ~Pure() = default; + virtual void Foo() = 0; +}; + +struct PureChild : Pure +{ + virtual ~PureChild() = default; + virtual void Foo() {a += 1;} + double a = 0; +}; + +struct Base +{ + int x; + int y; + int z; + Base(){x = 1; y = 2; z = 3;} + virtual ~Base() = default; + virtual void Foo() = 0; +}; + +struct Derived : Base +{ + int r; + int g; + int b; + int a; + virtual ~Derived() = default; + virtual void Foo() + { + x += 1; + y += 1; + y += 1; + z += 1; + z += 1; + z += 1; + a += 1; + a += 1; + a += 1; + a += 1; + } +}; + +struct DerivedA : Base +{ + float a; + float b; + DerivedA() {a = 123.f; b = 123.f;} + virtual void Foo() {a += 1;} + virtual ~DerivedA() = default; +}; + +struct DerivedB : Base +{ + double c; + double d; + DerivedB() {c = 123.0; d = 123.0;} + virtual void Foo() {c += 1;} + virtual ~DerivedB() = default; +}; + +struct NonVirtualBase +{ + int x; + int y; + int z; +}; + +struct NonVirtualDerived : NonVirtualBase +{ + int r; + int g; + int b; + int a; +}; + +struct OverloadedMethods{ + int x; + int cool_method(void){ + return(x); + } + int cool_method(int z){ + int r = x; + x = z; + return(r); + } + void cool_method(int y, int z){ + if (x < z){ + x = y; + } + else{ + x = z; + } + } +}; + +struct HasStaticConstMembers +{ + int a; + int b; + static int c; + static int d; + static const int e = 789; + static const int f = 101112; +}; + +int HasStaticConstMembers::c = 123; +int HasStaticConstMembers::d = 456; + +struct Has_A_Constructor{ + int n; + int d; + Has_A_Constructor(int a, int b){ + int gcd = 1; + { + int x = a; + int y = b; + if (x < y){ + y = a; + x = b; + } + for (;y > 0;){ + int z = x%y; + x = y; + y = z; + } + gcd = x; + } + n = a/gcd; + d = b/gcd; + } + + static int N; + static int D; + ~Has_A_Constructor(){ + int m = N*d + n*D; + int e = d*D; + N = m; + D = d; + } +}; + +int Has_A_Constructor::N = 0; +int Has_A_Constructor::D = 1; + +struct Constructor_Gotcha_Test{ + int x; + int y; + void Constructor_Gotcha(void){ + x = y = 0; + } +}; + +struct Has_A_Friend{ + friend struct Modifies_Other; + int get_x(void){ return x; } + int get_y(void){ return y; } + + private: + int x; + int y; +}; + +struct Modifies_Other{ + int x; + int y; + + void talk_to_friend(Has_A_Friend *other){ + other->x = y; + other->y = x; + } +}; + +namespace UserNamespace{ + namespace SubA{ + struct Foo{ + int x; + int y; + }; + }; + namespace SubB{ + struct Foo{ + float u; + float v; + }; + }; + + SubA::Foo foo_a = {10, 20}; + SubB::Foo foo_b = {0.1f, 0.05f}; + + static void namespaced_function(void){ + foo_a.x = (int)(foo_a.y*foo_b.u); + foo_b.v = (float)(foo_a.x*foo_b.v); + } +}; + +static void +call_with_pass_by_reference(int &x){ + x += 1; +} + +static void +call_with_pass_by_const_reference(const int &x){ + int y = x; +} + +static void +extended_type_coverage_eval_tests(void){ + //////////////////////////////// + // NOTE(allen): Extensions to base type system. + { + int x = 0; + const int *x_ptr = &x; + int *const x_cptr = &x; + + call_with_pass_by_reference(x); + + call_with_pass_by_const_reference(x); + } + + //////////////////////////////// + // NOTE(allen): Extensions to user defined types + { + Template_Example temp_f = {1.f, 2}; + Template_Example temp_v = {(void*)&temp_f, 2}; + Template_Example > temp_tf = {temp_f, 2}; + Template_Example2 temp_if = {2, 1.f}; + Template_Example3 temp3_if(2, 1.f); + Template_Example3 temp3_vi((void *)&temp3_if, 1.f); + Template_Example3> temp3_itif(123, temp_if); + + SingleInheritanceDerived sid; + sid.x = 123; + sid.y = 456; + sid.z = 789; + sid.w = 999; + + Pointer_To_Member pointer_to_member = { + &Has_Members::a, &Has_Members::c, &Has_Members::bas, + &Has_Members::x, &Has_Members::z, &Has_Members::bas_f, + }; + + Has_Static_Members has_static_members = { 10, 20 }; + Has_Static_Members::c = 100; + Has_Static_Members::d = 110; + has_static_members.x(); + has_static_members.y(); + has_static_members.z(); + has_static_members.w(); + + Has_Sub_Types has_sub_types = { + {100, 200}, + {.1f, .2f}, + }; + + Conflicting_Type_Names conflicting_type_names = { + {10}, {-20}, + }; + + Has_Private_Sub_Types has_private_sub_types(1, 2, 4, 8, 16, 32); + + Vtable_Child vtable_child(1, 2); + vtable_child.a_virtual_function(); + + Vinheritance_Child vinheritance_child; + vinheritance_child.name = "foobar"; + vinheritance_child.left = 10.5f; + vinheritance_child.right = 13.0f; + vinheritance_child.x = -1; + vinheritance_child.y = -1; + + Minheritance_Child minheritance_child; + minheritance_child.name = "foobar"; + minheritance_child.left = 10.5f; + minheritance_child.right = 13.0f; + minheritance_child.Minheritance_MidLeft::x = -1; + minheritance_child.Minheritance_MidLeft::y = -1; + minheritance_child.Minheritance_MidRight::x = +1; + minheritance_child.Minheritance_MidRight::y = +1; + + Pure *child = new PureChild(); + child->Foo(); + child->Foo(); + child->Foo(); + delete child; + + Base *derived = new Derived(); + derived->Foo(); + derived->Foo(); + derived->Foo(); + delete derived; + + NonVirtualBase *non_virtual_derived = new NonVirtualDerived(); + non_virtual_derived->x += 1; + non_virtual_derived->x += 1; + non_virtual_derived->x += 1; + + std::unique_ptr ridiculous_cplusplus_base_class = std::make_unique(); + + std::vector> ridiculous_cplusplus_array; + for(int i = 0; i < 1024; i += 1) + { + if((i & 1) == 1) + { + ridiculous_cplusplus_array.push_back(std::make_unique()); + } + else + { + ridiculous_cplusplus_array.push_back(std::make_unique()); + } + } + + Base *base_array[1024] = {0}; + for(int i = 0; i < sizeof(base_array)/sizeof(base_array[0]); i += 1) + { + if((i & 1) == 1) + { + base_array[i] = new DerivedA(); + } + else + { + base_array[i] = new DerivedB(); + } + } + + OverloadedMethods overloaded_methods; + { + overloaded_methods.x = 0; + int a = overloaded_methods.cool_method(); + overloaded_methods.cool_method(-10, 100); + int b = overloaded_methods.cool_method(100); + overloaded_methods.cool_method(b*2, a*2); + int c = overloaded_methods.cool_method(a + b); + int z = c; + } + + Has_A_Constructor construct_me(360, 25); + + Has_A_Friend has_a_friend; + + Modifies_Other modifies_other; + modifies_other.x = 57; + modifies_other.y = 66; + + modifies_other.talk_to_friend(&has_a_friend); + + int x = has_a_friend.get_x(); + int y = has_a_friend.get_y(); + int z = x; + + HasStaticConstMembers static_const_members = {0}; + static_const_members.a = 123 + HasStaticConstMembers::c * HasStaticConstMembers::e; + static_const_members.b = 456 + HasStaticConstMembers::d * HasStaticConstMembers::f; + } + + //////////////////////////////// + // NOTE(allen): Namespaces + { + UserNamespace::namespaced_function(); + } +} + +//////////////////////////////// +//~ rjf: Templated Function Eval Tests + +typedef struct TemplateArg TemplateArg; +struct TemplateArg +{ + int x; + int y; + int z; + float a; + float b; + float c; + char *name; +}; + +template static T +templated_factorial(T t) +{ + T result = t; + if(t > 1) + { + result *= templated_factorial(t-1); + } + return result; +} + +template static T +compute_template_arg_info(T t) +{ + int sum = t.x + t.y + t.z; + int size = sizeof(t); + float sum_f = t.a + t.b + t.c; + OutputDebugStringA(t.name); + return t; +} + +static void +templated_function_eval_tests(void) +{ + int int_factorial = templated_factorial(10); + float float_factorial = templated_factorial(10); + TemplateArg arg = {1, 2, 3, 4.f, 5.f, 6.f, "my template arg"}; + compute_template_arg_info(arg); + int x = 0; +} + +//////////////////////////////// +//~ NOTE(allen): C Type Coverage + +extern "C"{ +#include "mule_c.h" +} + +//////////////////////////////// +//~ rjf: Basic Inline Line Info Tests + +#if defined(_MSC_VER) +# define FORCE_INLINE __forceinline +#elif defined(__clang__) +# define FORCE_INLINE __attribute__((always_inline)) +#else +# error need force inline for this compiler +#endif + +static FORCE_INLINE void +basic_inlinee(int inlinee_param_x, int inlinee_param_y, int inlinee_param_z) +{ + OutputDebugStringA("A\n"); + OutputDebugStringA("B\n"); + OutputDebugStringA("C\n"); + OutputDebugStringA("D\n"); +} + +static void +basic_inline_tests(void) +{ + OutputDebugStringA("{\n"); + basic_inlinee(12, 34, 56); + OutputDebugStringA("}\n"); +} + +//////////////////////////////// +//~ rjf: Fancy Visualization Eval Tests + +struct PackedBits +{ + unsigned char b1 : 1; + unsigned char b2 : 1; + unsigned char b3 : 1; + unsigned char b4 : 1; + unsigned char b5 : 1; + unsigned char b6 : 1; +}; +raddbg_type_view(unsigned char : 1, bool($)); + +struct Bitmap +{ + unsigned char *base; + int width; + int height; +}; +raddbg_type_view(Bitmap, bitmap(base, width, height)); + +static unsigned int +mule_bswap_u32(unsigned int x) +{ + unsigned int result = (((x & 0xFF000000) >> 24) | + ((x & 0x00FF0000) >> 8) | + ((x & 0x0000FF00) << 8) | + ((x & 0x000000FF) << 24)); + return result; +} + +static void +fancy_viz_eval_tests(void) +{ + //- rjf: windows -> GetLastError +#if _WIN32 + DWORD error_code = 0; + SetLastError(1234); + error_code = GetLastError(); + SetLastError(4567); + error_code = GetLastError(); + (void)error_code; +#endif + + //- rjf: booleans (checkboxes) + bool bool1 = 0; raddbg_pin(bool1); + bool bool2 = 1; raddbg_pin(bool2); + bool bool3 = 0; raddbg_pin(bool3); + PackedBits packed_bits = {}; + packed_bits.b1 = 1; + packed_bits.b3 = 1; + packed_bits.b5 = 1; + + //- rjf: sliders + float slide1 = 500.f; raddbg_pin(range1(slide1, 0, 1000)); + double slide2 = 0.75; raddbg_pin(range1(slide2, 0, 1.0)); + int slide3 = 25; raddbg_pin(range1(slide3, 0, 100)); + + //- rjf: colors + float example_color_4f32[4] = {1.00f, 0.85f, 0.25f, 1.00f}; + unsigned int example_color_u32 = 0xff6f30ff; + struct {float r, g, b, a;} example_color_struct = {0.50f, 0.95f, 0.75f, 1.00f}; + int x0 = 0; + raddbg_pin(color(example_color_4f32)); + raddbg_pin(color(example_color_u32)); + raddbg_pin(color(example_color_struct)); + + //- rjf: multiline text + char *long_string = ("This is an example of some very long text with line breaks\n" + "in it. This is a very common kind of data which is inspected\n" + "in the debugger while programming, and it is often a pain\n" + "when it is poorly supported.\n"); + char *code_string = ("#include \n" + "\n" + "int main(int argc, char**argv)\n" + "{\n" + " printf(\"Hello, World!\\n\");\n" + " return 0;\n" + "}\n\n"); + int x1 = 0; + raddbg_pin(text(long_string)); + raddbg_pin(text(code_string, lang=c)); + raddbg_pin(disasm(fancy_viz_eval_tests)); + + //- rjf: programmatic memory annotations + void *some_block_of_memory = malloc(256); + memset(some_block_of_memory, 0x27, 256); + raddbg_annotate_vaddr_range(some_block_of_memory, 256, "test memory annotation"); + + //- rjf: half-floats + PackedF16 f16s[] = + { + {0x0001}, // ~0.000000059604645 + {0x03ff}, // ~0.000060975552 + {0x0400}, // ~0.00006103515625 + {0x3555}, // ~0.33325195 + {0x3bff}, // ~0.99951172 + {0x3c00}, // 1 + {0x3c01}, // 1.00097656 + {0x7bff}, // 65504, + {0x7c00}, // +inf + {0xfc00}, // -inf + }; + + //- rjf: table index lookups + struct + { + char *name; + int x; + int y; + int z; + } + nodes[] = + { + {"---", 1, 7, 3}, + {"---", 5, 4, 2}, + {"second", 12, 41, 22}, + {"---", 8, 9, 1}, + {"---", 1, 1, 1}, + {"first", 50, 50, 50}, + {"fourth", 7, 7, 7}, + {"---", 7, 12, 1}, + {"third", 27, 43, 41}, + {"---", 2, 17, 50}, + }; + int node_indices[] = + { + 5, 2, 8, 6 + }; + raddbg_pin(columns(node_indices, nodes[$])); + + //- rjf: bitmaps + unsigned int background_color = 0x00000000; + unsigned int main_color = 0xff2424ff; + unsigned int shine_color = 0xff5693ff; + unsigned int shadow_color = 0xff238faf; + unsigned int bg = mule_bswap_u32(background_color); + unsigned int cl = mule_bswap_u32(main_color); + unsigned int sn = mule_bswap_u32(shine_color); + unsigned int sh = mule_bswap_u32(shadow_color); + unsigned int pixels[] = + { + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, cl, cl, bg, cl, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, cl, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, cl, sn, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, sh, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, sh, cl, cl, cl, sh, sh, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, sh, sh, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, + }; + raddbg_pin(bitmap(pixels, 18, 18)); + for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) + { + unsigned int r = pixels[i]&0x000000ff; + unsigned int a = pixels[i]&0xff000000; + pixels[i] = pixels[i]>>8; + pixels[i] &= ~0xffff0000; + pixels[i] |= (r<<16); + pixels[i] |= (a); + } + for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) + { + unsigned int r = pixels[i]&0x000000ff; + unsigned int a = pixels[i]&0xff000000; + pixels[i] = pixels[i]>>8; + pixels[i] &= ~0xffff0000; + pixels[i] |= (r<<16); + pixels[i] |= (a); + } + for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) + { + unsigned int r = pixels[i]&0x000000ff; + unsigned int a = pixels[i]&0xff000000; + pixels[i] = pixels[i]>>8; + pixels[i] &= ~0xffff0000; + pixels[i] |= (r<<16); + pixels[i] |= (a); + } + int x2 = 0; + + //- rjf: type-viewed bitmaps + Bitmap foo = {(unsigned char *)&pixels[0], 18, 18}; + raddbg_pin(foo); + + //- rjf: name collisions with debugger rules + Function_Few_Params_Type *raw = 0; + char *text = "some_important_text_here\n"; + Bitmap bitmap = foo; + int x3 = 0; + + //- rjf: 3D geometry + float vertex_data[] = // pos.x, pos.y, pos.z, nor.x, nor.y, nor.z, tex.u, tex.v, col.r, col.g, col.b, ... + { + -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 10.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 2.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 2.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 8.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 8.0f, 0.973f, 0.480f, 0.002f, + -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 10.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 10.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 10.0f, 0.973f, 0.480f, 0.002f, + 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 10.0f, 10.0f, 0.973f, 0.480f, 0.002f, + 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 2.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 8.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 8.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 10.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 10.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 10.0f, 10.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 10.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 2.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 2.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 8.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 8.0f, 0.612f, 0.000f, 0.069f, + 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 10.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 10.0f, 0.612f, 0.000f, 0.069f, + -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 10.0f, 10.0f, 0.612f, 0.000f, 0.069f, + -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 2.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 8.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 8.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 10.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 10.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 10.0f, 10.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 8.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, 0.6f, 0.0f, 1.0f, 0.0f, 2.0f, 2.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, 0.6f, 0.0f, 1.0f, 0.0f, 8.0f, 2.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, -0.6f, 0.0f, 1.0f, 0.0f, 2.0f, 8.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, -0.6f, 0.0f, 1.0f, 0.0f, 8.0f, 8.0f, 0.000f, 0.254f, 0.637f, + -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 10.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 10.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 8.0f, 10.0f, 0.000f, 0.254f, 0.637f, + 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 10.0f, 10.0f, 0.000f, 0.254f, 0.637f, + -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 2.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 8.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 10.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, -0.6f, 0.0f, -1.0f, 0.0f, 2.0f, 2.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, -0.6f, 0.0f, -1.0f, 0.0f, 8.0f, 2.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, 0.6f, 0.0f, -1.0f, 0.0f, 2.0f, 8.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, 0.6f, 0.0f, -1.0f, 0.0f, 8.0f, 8.0f, 0.001f, 0.447f, 0.067f, + -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 10.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 2.0f, 10.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 8.0f, 10.0f, 0.001f, 0.447f, 0.067f, + 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 10.0f, 10.0f, 0.001f, 0.447f, 0.067f, + -0.6f, 0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 0.6f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 1.0f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 0.6f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -1.0f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + }; + unsigned int index_data[] = + { + 0, 1, 9, 9, 8, 0, 1, 2, 5, 5, 4, 1, 6, 7, 10, 10, 9, 6, 2, 3, 11, 11, 10, 2, + 12, 13, 21, 21, 20, 12, 13, 14, 17, 17, 16, 13, 18, 19, 22, 22, 21, 18, 14, 15, 23, 23, 22, 14, + 24, 25, 33, 33, 32, 24, 25, 26, 29, 29, 28, 25, 30, 31, 34, 34, 33, 30, 26, 27, 35, 35, 34, 26, + 36, 37, 45, 45, 44, 36, 37, 38, 41, 41, 40, 37, 42, 43, 46, 46, 45, 42, 38, 39, 47, 47, 46, 38, + 48, 49, 57, 57, 56, 48, 49, 50, 53, 53, 52, 49, 54, 55, 58, 58, 57, 54, 50, 51, 59, 59, 58, 50, + 60, 61, 69, 69, 68, 60, 61, 62, 65, 65, 64, 61, 66, 67, 70, 70, 69, 66, 62, 63, 71, 71, 70, 62, + 72, 73, 74, 74, 75, 72, 76, 77, 78, 78, 79, 76, 80, 81, 82, 82, 83, 80, 84, 85, 86, 86, 87, 84, + 88, 89, 90, 90, 91, 88, 92, 93, 94, 94, 95, 92, 96, 97, 98, 98, 99, 96, 100, 101, 102, 102, 103, 100, + 104, 105, 106, 106, 107, 104, 108, 109, 110, 110, 111, 108, 112, 113, 114, 114, 115, 112, 116, 117, 118, 118, 119, 116, + 120, 121, 122, 122, 123, 120, 124, 125, 126, 126, 127, 124, 128, 129, 130, 130, 131, 128, 132, 133, 134, 134, 135, 132, + 136, 137, 138, 138, 139, 136, 140, 141, 142, 142, 143, 140, 144, 145, 146, 146, 147, 144, 148, 149, 150, 150, 151, 148, + 152, 153, 154, 154, 155, 152, 156, 157, 158, 158, 159, 156, 160, 161, 162, 162, 163, 160, 164, 165, 166, 166, 167, 164, + }; + int count = (sizeof index_data/4); + float *vtx = vertex_data; + int vtx_size = sizeof vertex_data; + raddbg_pin(geo3d(index_data, count = count, vtx = vtx, vtx_size = vtx_size)); + int x4 = 0; +} + +//////////////////////////////// +//~ rjf: Markup Tests + +static void +markup_tests(void) +{ + int x = 0; + raddbg_add_breakpoint(&x, sizeof(x), 0, 1, 0); + for(int i = 0; i < 10000; i += 1) + { + if(i == 5000) + { + x += 1; + } + } + raddbg_remove_breakpoint(&x, sizeof(x), 0, 1, 0); +} + +//////////////////////////////// +//~ NOTE(allen): Function Overload Resolution + +static int +overloaded_function(float y){ + int r = (int)(y + 0.5f); + return(r); +} + +static int +overloaded_function(float y, int x){ + int r = overloaded_function(y) + x; + return(r); +} + +static int +overloaded_function(int x){ + float y = (float)x; + int r = overloaded_function(y, 1); + return(r); +} + +//////////////////////////////// +// NOTE(allen): Control Flow Stepping + +static void +control_flow_stepping_tests(void){ + { + int a = 1; + if (a < 1){ /// 1000: { run_to_line at step_over } + a += 1; + } + if (a < 2){ /// 1001: { at step_over } + a += 2; /// 1002: { at step_over } + } + } + + { + int a = 1; /// 1003: { at step_over } + if (a < 1) /// 1004: { at step_over } + { + a += 1; + } + if (a < 2) /// 1005: { at step_over } + { + a += 2; /// 1006: { at step_over } + } + } + + { + int a = 1; /// 1007: { at step_over } + if (a < 1) /// 1008: { at step_over } + a += 1; + if (a < 2) /// 1009: { at step_over } + a += 2; /// 1010: { at step_over } + } + + { + int a = 1; /// 1011: { at step_over } + int b = 2; /// 1012: { at step_over } + if (a <= b){ /// 1013: { at step_over } + if (a == b){ /// 1014: { at step_over } + b += 1; + } + else{ + a += 1; /// 1015: { at } + } + } + else{ + if (a%2){ + a = b; + } + else{ + a = b - 1; + } + } + } + + { + int a = 1; /// 1016: { run_to_line at step_over } + int b = 2; /// 1017: { at step_over } + if (a <= b) + { + if (a == b) /// 1018: { at step_over } + { + b += 1; + } + else + { + a += 1; /// 1019: { at } + } + } + else + { + if (a%2) + { + a = b; + } + else + { + a = b - 1; + } + } + } + + { + int a = 1; /// 1020: { run_to_line at step_over } + int b = 2; /// 1021: { at step_over } + if (a <= b) /// 1022: { at step_over } + if (a == b) /// 1023: { at step_over } + b += 1; + else + a += 1; /// 1024: { at step_over } + else + if (a%2) + a = b; + else + a = b - 1; + } + + { + int x = 0; /// 1025: { at step_over } + for (int i = 0; i < 10; i += 1){ /// 1026: { at step_over } + x += i; /// 1027: { at step_over } + } + } + + { + int x = 0; // 1028: { run_to_line at } + for (int i = 0; i < 10; i += 1) + { + x += i; + } + } + + { + int x = 0; + for (int i = 0; i < 10; i += 1) + x += i; + } + + { + int x = 0; + for (int i = 0; i < 10; i += 1) x += i; + } + + { + int a = 1; + for (;a < 10;){ + switch (a){ + case 0: case 1: case 2: + { + a += 2; + }break; + + default: + case 4: + case 5: + { + a += 1; + }break; + + case 6: a += 1; break; + case 7: a += 1; + case 8: + case 9: a += 1; + } + } + } + + { + int i = 0; + while (i < 5){ + i += 1; + } + + while (i < 10) + { + i += 1; + } + + while (i < 15) + i += 1; + + while (i < 20) i += 1; + } + + { + int i = 0; + do + { + i += 1; + } while (i < 10); + } + + { + int i = 17; + + check_again: + if (i <= 1) goto done; + if ((i&1) == 0) goto even_case; + + // odd_case: + i = 3*i + 1; + + even_case: + i /= 2; + goto check_again; + + done:; + } + + { + int x = 15; + label_same_line:; x -= 1; if(x > 0) { goto label_same_line; } else { goto end_label_same_line; } + } + end_label_same_line:; +} + +//////////////////////////////// +// NOTE(allen): Indirect Call/Jump Stepping Tests + +typedef int FunctionType(int); + +static int +function_foo(int a){ + if (a < 1){ + a += 1; + } + if (a < 2){ + a += 2; + } + return(a); +} + +static int +function_bar(int x){ + for (int i = 0; i < 10; i += 1){ + x += i; + } + return(x); +} + + +static void +indirect_call_jump_stepping_tests(void){ + int z = 1; + FunctionType *ptr = function_foo; + z = ptr(z); + if ((z & 1) == 0){ + ptr = function_bar; + } + z = ptr(z); + + switch (z&7){ + case 0: + { + z += 2; + ptr = function_bar; + }break; + + case 1: + { + z += 1; + ptr = function_bar; + }break; + + case 2: + { + z *= 2; + ptr = function_bar; + }break; + + case 3: + { + z -= 10; + ptr = function_foo; + }break; + + case 4: + { + z -= 5; + ptr = function_foo; + }break; + + case 5: + { + z = z ^ 0x10; + ptr = function_foo; + }break; + + case 6: + { + z = z & ~0x10; + ptr = function_foo; + }break; + + case 7: + { + z = z | 0x10; + ptr = function_foo; + }break; + } + + z = ptr(z); +} + +//////////////////////////////// +// NOTE(rjf): alloca (Variable-Width Stack Changes) Stepping Tests + +static void +alloca_stepping_tests(void) +{ + int x = 1; + int y = 3; + int z = 5; + +#if _WIN32 + int *mem = (int *)_alloca((x+y+z)*sizeof(int)); + mem[0] = x; + mem[1] = y; + mem[2] = z; +#else + int *mem = (int *)__builtin_alloca((x+y+z)*sizeof(int)); + mem[0] = x; + mem[1] = y; + mem[2] = z; +#endif +} + +//////////////////////////////// +// NOTE(allen): Overloaded Line Stepping + +static int +function_get_integer(void){ + return(1); +} + +static void +function_with_multiple_parameters(int x, int y){ + x += y; +} + +static int +recursive_single_line(int x){ return(x <= 1?0:x + recursive_single_line(x/2)); } + +static int shared_1(int x) { return(x); } static int shared_2(int x) { return(1 + shared_1(x)); } + +static void +overloaded_line_stepping_tests(void){ + function_with_multiple_parameters(function_get_integer(), function_get_integer()); + function_with_multiple_parameters(function_get_integer(), function_get_integer()); + function_with_multiple_parameters(function_get_integer(), function_get_integer()); + + recursive_single_line(50); + recursive_single_line(50); + recursive_single_line(50); + + shared_2(5); + shared_2(5); + shared_2(5); + + function_get_integer(); shared_1(1); shared_1(2); + + if ((shared_2(10) && shared_2(-1)) || + shared_2(function_get_integer())){ + int x = 0; + } + else{ + int y = 0; + } +} + +//////////////////////////////// +// NOTE(allen): Long Jump Stepping + +#include + +static jmp_buf global_jump_buffer; +static int global_jump_x; + +static void +long_jump_from_function(void){ + int spin = 0; + for (; spin < 5; spin += 1); + longjmp(global_jump_buffer, 2); + global_jump_x = spin; +} + +static void +long_jump_wrapped_in_function(void){ + global_jump_x = 0; + int val = setjmp(global_jump_buffer); + if (val == 0){ + global_jump_x = 1; + longjmp(global_jump_buffer, 1); + } + else if (val == 1){ + if (global_jump_x == 1){ + global_jump_x = 2; + long_jump_from_function(); + } + } + else if (val == 2){ + global_jump_x = 3; + } +} + +static void +long_jump_stepping_tests(void){ + + long_jump_wrapped_in_function(); + + long_jump_wrapped_in_function(); + + long_jump_wrapped_in_function(); + +} + +//////////////////////////////// +// NOTE(allen): Recursion Stepping + +static int +recursive_call(int x){ + if (x <= 1){ + return(x); + } + + int r1 = recursive_call(x - 1); + int r2 = recursive_call(x - 2); + return(r1 + r2); +} + +static int +tail_recursive_call(int x, int m){ + if (x <= 1){ + return(m); + } + return(tail_recursive_call(x - 1, x*m)); +} + +static void +recursion_stepping_tests(void){ + + recursive_call(4); + + recursive_call(4); + + tail_recursive_call(5, 1); + + tail_recursive_call(5, 1); + +} + +//////////////////////////////// +// NOTE(rjf): Thread Stepping + +#if _WIN32 +DWORD thread_step_thread(void *p) +{ + int x = 0; + for(int i = 0; i < 100000; i += 1) + { + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + } + return 0; +} +#endif + +void thread_stepping_tests(void) +{ +#if _WIN32 + HANDLE h[8] = {0}; + for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) + { + DWORD id = 0; + h[i] = CreateThread(0, 0, thread_step_thread, 0, CREATE_SUSPENDED, &id); + raddbg_thread_id_name(id, "thread_step_thread_%i", i); + raddbg_thread_id_color_u32(id, 0xff9f23ff); + } + for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) + { + ResumeThread(h[i]); + } + for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) + { + WaitForSingleObject(h[i], INFINITE); + } +#endif +} + +//////////////////////////////// +// NOTE(rjf): Debug Strings + +static void +debug_string_tests(void) +{ + for(int i = 0; i < 100; i += 1) + { + printf("here is a number: %i\n", i); + fflush(stdout); + } +#if _WIN32 + for(int i = 0; i < 100; i += 1) + { + OutputDebugStringA("Hello, World!\n"); + } + char message[65409+1]; + memset(&message[0], '=', sizeof(message)); + for(int i = 1; i < sizeof(message); i += 128) + { + message[i] = '\n'; + } + message[sizeof(message) - 1] = 0; + OutputDebugStringA(message); +#endif +} + +//////////////////////////////// +//~ rjf: Thread Name Test + +#if _WIN32 +DWORD dummy_thread(void *p) +{ + Sleep(10); + return 0; +} +#endif + +static void +thread_name_tests(void) +{ +#if _WIN32 + DWORD id = 0; + HANDLE h = CreateThread(0, 0, dummy_thread, 0, CREATE_SUSPENDED, &id); + raddbg_thread_id_name(id, "dummy_thread"); + raddbg_thread_id_color_u32(id, 0xff1f23ff); + ResumeThread(h); + WaitForSingleObject(h, INFINITE); +#endif +} + +//////////////////////////////// +//~ rjf: Interrupt Stepping Tests + +#include + +static void +interrupt_stepping_tests(void) +{ + __debugbreak(); + __debugbreak(); + __debugbreak(); + __debugbreak(); + for(int i = 0; i < 1000; i += 1) + { + if(i == 999) + { + __debugbreak(); + } + } + for(int i = 0; i < 1000; i += 1) + { + if(i == 999) + { + assert(0); + } + } + int x = 0; +} + +//////////////////////////////// +//~ rjf: JIT Stepping Tests + +static void +jit_stepping_tests(void) +{ + OutputDebugString("A\n"); + VOID *code = VirtualAlloc(0, 0x1000, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE); + *((uint32_t*)code) = 0xC39090CC; + ((void (__fastcall *)()) code)(); + OutputDebugString("B\n"); +} + +//////////////////////////////// +// NOTE(allen): Exception Stepping + +static void +exception_filter_test(void) +{ + __try + { + RaiseException(0xc0000095, 0, 0, 0); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + OutputDebugStringA("did an exception\n"); + } +} + +int *global_null_read_pointer = 0; +static void +trip(void){ + *global_null_read_pointer = 0; +} + +static void +cpp_exception_in_function(void){ + int v = 0; + try{ + throw 1; + } + catch (...){ + v = 1; + } +} + +static void +cpp_throw_in_function(void){ + throw 1; +} + +static void +win32_exception_in_function(void){ +#if _WIN32 + int v = 0; + __try{ + trip(); + v = 1; + } + __except (EXCEPTION_EXECUTE_HANDLER){ + v = 2; + } + + v = 3; + __try{ + trip(); + v = 4; + } + __except (EXCEPTION_EXECUTE_HANDLER){ + v = 5; + } +#endif +} + +static void +cpp_recursive_exception(int x){ + try{ + if (x > 1){ + throw 1; + } + } + catch (...){ + x -= 1; + cpp_recursive_exception(x); + x += 1; + } +} + +static void +win32_recursive_exception(int x){ +#if _WIN32 + __try{ + if (x > 1){ + throw 1; + } + } + __except (EXCEPTION_EXECUTE_HANDLER){ + x -= 1; + win32_recursive_exception(x); + x += 1; + } +#endif +} + +static void +exception_stepping_tests(void){ + { + int v = 0; + try{ + throw 1; + } + catch (...){ + v = 1; + } + } + + { + int v = 0; + try{ + cpp_throw_in_function(); + } + catch (...){ + v = 1; + } + } + + cpp_exception_in_function(); + cpp_exception_in_function(); + +#if _WIN32 + win32_exception_in_function(); + win32_exception_in_function(); +#endif + + // NOTE(allen): Exception in catch tests + { + int v = 0; + try{ + v = 1; + throw 1; + } + catch (...){ + try{ + v = 2; + throw 2; + } + catch (...){ + v = 3; + } + } + } + + { + int v = 0; + try{ + v = 1; + throw 1; + } + catch (...){ + cpp_exception_in_function(); + } + } + +#if _WIN32 + { + int v = 0; + try{ + v = 1; + throw 1; + } + catch (...){ + win32_exception_in_function(); + } + } +#endif + + cpp_recursive_exception(4); + cpp_recursive_exception(4); + cpp_recursive_exception(4); + +#if _WIN32 + win32_recursive_exception(4); + win32_recursive_exception(4); + win32_recursive_exception(4); +#endif + + // NOTE(allen): Try in try tests + { + int v = 0; + try{ + try{ + v = 1; + throw 1; + } + catch (...){ + v = 2; + } + throw 2; + } + catch (...){ + v = 3; + } + } + + { + int v = 0; + try{ + try{ + v = 1; + cpp_throw_in_function(); + } + catch (...){ + v = 2; + } + throw 2; + } + catch (...){ + v = 3; + } + } + + { + int v = 0; + try{ + cpp_exception_in_function(); + throw 2; + } + catch (...){ + v = 3; + } + } + +#if _WIN32 + { + int v = 0; + try{ + win32_exception_in_function(); + throw 2; + } + catch (...){ + v = 3; + } + } +#endif + +} + +typedef void (*callback_t)(int a); +static void +dynamic_step_test(void){ +#if _WIN32 +#if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( _M_AMD64 ) + void *page = VirtualAlloc(0, 4096, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); + char *ptr = (char*)page; + *ptr++ = 0x51; // push rcx + *ptr++ = 0x59; // pop rcx + *ptr++ = 0xC3; // ret + callback_t cb = (callback_t)page; + cb(1); +#endif +#endif +} + +//////////////////////////////// + +raddbg_entry_point(mule_main); + +int +mule_main(int argc, char** argv) +{ //// 1: { run_to_line at } + + raddbg_thread_name("mule_main_thread"); + raddbg_thread_color_rgba(0.4f, 0.9f, 0.2f, 1); + if(raddbg_is_attached()) + { + raddbg_log("raddbg is attached!\n"); + } + + mule_init(); + + // NOTE(allen): Stepping Tests + control_flow_stepping_tests(); + + // NOTE(allen): Eval Tests + type_coverage_eval_tests(); + + mutating_variables_eval_tests(); + + nested_types_eval_tests(); + + struct_parameters_eval_tests(); + + global_eval_tests(); + + return_eval_tests(); + + tls_eval_tests(); + + complicated_type_coverage_tests(); + + extended_type_coverage_eval_tests(); + + templated_function_eval_tests(); + + c_type_coverage_eval_tests(); + + c_type_with_bitfield_usage(); + + optimized_build_eval_tests(); + + optimized_struct_parameters_eval_tests(); + + fancy_viz_eval_tests(); + + exception_filter_test(); + + markup_tests(); + + indirect_call_jump_stepping_tests(); + + alloca_stepping_tests(); + + basic_inline_tests(); + + inline_stepping_tests(); + + overloaded_line_stepping_tests(); + + overloaded_function(100); + + dynamic_step_test(); + + long_jump_stepping_tests(); + + recursion_stepping_tests(); + + thread_stepping_tests(); + + debug_string_tests(); + + thread_name_tests(); + + jit_stepping_tests(); + + interrupt_stepping_tests(); + + exception_stepping_tests(); + + return(0); +} + +/// file: "mule_module.cpp" + +#if _WIN32 +#define export_function extern "C" __declspec(dllexport) +#else +#define export_function extern "C" +#endif + +#if _WIN32 +# define thread_var __declspec(thread) +#else +# define thread_var __thread +#endif + +typedef struct OnlyInModule OnlyInModule; +struct OnlyInModule +{ + int x; + int y; + int z; + char *name; +}; + +typedef struct Basics Basics; +struct Basics +{ + int a; + int b; + int c; + int d; +}; + +static OnlyInModule only_in_module_global = +{ + 1, 2, 3, "foobar", +}; + +thread_var float tls_a = 1.015625f; +thread_var int tls_b = -100; + +export_function void +dll_tls_eval_test(void) +{ + tls_a *= 1.5f; + tls_b *= -2; + only_in_module_global.x += 1; + only_in_module_global.y += 2; + only_in_module_global.z += 3; +} + +export_function void +dll_type_eval_tests(void) +{ + Basics basics1 = {1, 2, 3, 4}; + Basics basics2 = {4, 5, 6, 7}; + OnlyInModule only_in_module = {123, 456, 789, "this type is only in the module!"}; + int x = 0; + (void)x; +} + diff --git a/src/torture/torture.c b/src/torture/torture.c index 385ab907..4cda5a7b 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -8,6 +8,7 @@ global String8 g_out = str8_lit_comp("torture_artifacts"); global B32 g_verbose; global B32 g_redirect_stdout = 1; global B32 g_stop_on_first_fail_or_crash = 1; +global B32 g_build_only = 0; global String8 g_test_data; // tests @@ -1091,6 +1092,7 @@ t_help(void) fprintf(stderr, " -linker: Path to PE/COFF linker\n"); fprintf(stderr, " -print_stdout Print to console stdout and stderr of a run\n"); fprintf(stderr, " -out: Directory path for test outputs (default \"%.*s\")\n", str8_varg(g_out)); + fprintf(stderr, " -build_only Build debugger harness without running the tests\n"); fprintf(stderr, " -verbose Enable verbose mode\n"); fprintf(stderr, " -help Print help menu and exit\n"); fprintf(stderr, "\nInputs are wildcard expressions. Prefix with ! to skip matches, or + to force-run matches.\n"); @@ -1249,6 +1251,7 @@ t_entry_point(CmdLine *cmdline) g_verbose = cmd_line_has_flag(cmdline, str8_lit("verbose")); g_redirect_stdout = !cmd_line_has_flag(cmdline, str8_lit("print_stdout")); g_stop_on_first_fail_or_crash = !cmd_line_has_flag(cmdline, str8_lit("keep_going")); + g_build_only = cmd_line_has_flag(cmdline, str8_lit("build_only")); g_output_arena = arena_alloc(); // default options when running under debugger @@ -1285,13 +1288,34 @@ t_entry_point(CmdLine *cmdline) make_directory(g_out); if (!folder_path_exists(g_out)) { fprintf(stderr, "ERROR: unable to create output directory \"%.*s\"\n", str8_varg(g_out)); - abort_self(1); + goto exit; } // // Clean up output from previous run // delete_file_at_path(g_stdout_file_name); + + // + // Check tools + // + String8 tools[] = { + t_raddbg_path(), + t_radbin_path(), + t_radlink_path(), + t_clang_path(), +#if OS_WINDOWS + t_cl_path(), +#elif OS_LINUX + t_gcc_path(), +#endif + }; + for EachElement(i, tools) { + if ( ! file_path_exists(tools[i])) { + fprintf(stderr, "ERROR: failed to find tool \"%.*s\"\n", str8_varg(tools[i])); + goto exit; + } + } // // Run tests diff --git a/src/torture/torture_d2r.c b/src/torture/torture_d2r.c index 0fc26099..8d30e9d9 100644 --- a/src/torture/torture_d2r.c +++ b/src/torture/torture_d2r.c @@ -281,7 +281,7 @@ SKIP(d2r_line_table) for EachElement(i, test_table) { for EachIndex(k, test_table[i].line_size) { String8 cmdl = str8f(arena, "-voff2line -voff:0x%llx %S", test_table[i].voff + k, t_make_file_path(arena, str8_lit("a.rdi"))); - t_invoke_radbin(cmdl.str); + t_invoke_radbin((char *)cmdl.str); if (g_last_exit_code != 0) { t_errorf("radbin exited with %llu on \"%S\"\n", (unsigned long long)g_last_exit_code, cmdl); diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index e92c6e51..7dfb7036 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -4,25 +4,10 @@ #define T_Dbg_DefaultTimeout TIMEOUT_SEC(5) extern B32 g_stop_on_first_fail_or_crash; +extern B32 g_build_only; //////////////////////////////// -internal void -t_find_line_and_col(String8 source, MD_Node *n, U64 *line_out, U64 *col_out) -{ - U64 line = 1; - U64 col = 1; - for (U64 cursor = 0; cursor < source.size && cursor < n->src_offset; cursor += 1) { - if (source.str[cursor] == '\n') { - line += 1; - col = 0; - } - col += 1; - } - if (line_out) { *line_out = line; } - if (col_out) { *col_out = col; } -} - internal void t_errorf_md(String8 file_name, String8 source, MD_Node *n, char *fmt, ...) { @@ -30,22 +15,16 @@ t_errorf_md(String8 file_name, String8 source, MD_Node *n, char *fmt, ...) va_list args; va_start(args, fmt); String8 result = push_str8fv(scratch.arena, fmt, args); - U64 line = 0, col = 0; - t_find_line_and_col(source, n, &line, &col); - t_errorf("ERROR: %S:%llu%llu: %S\n", file_name, (unsigned long long)line, (unsigned long long)col, result); + TxtPt pt = mg_txt_pt_from_string_off(source, n->src_offset); + t_errorf("ERROR: %S:%llu%llu: %S\n", file_name, (unsigned long long)pt.line, (unsigned long long)pt.column, result); va_end(args); scratch_end(scratch); } //////////////////////////////// -// Debugger IPC Replies +// IPC Controller -typedef struct -{ - MD_ParseResult parse; - MD_Node *root; - MD_Node *msg; -} T_IpcReply; +internal U32 g_dbg_pid; internal B32 t_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out) @@ -75,7 +54,6 @@ t_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out) return 0; } -#define t_ipc_parse_int(n, c, ptr) t_ipc_parse_int_(n, c, sizeof(*ptr), ptr) internal B32 t_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out) { @@ -112,18 +90,12 @@ t_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out) return is_ok; } -//////////////////////////////// -// IPC Controller - -internal U32 g_dbg_pid; - internal B32 t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out) { Temp scratch = scratch_begin(&reply_arena, 1); B32 is_sent = 0; - // send command String8 cmdline = str8f(scratch.arena, "--gen_crash_dump --ipc --pid:%u %S", g_dbg_pid, cmd); if (t_invoke(t_raddbg_path(), cmdline, timeout_us) == 0) { goto exit; } @@ -186,7 +158,7 @@ t_dbg_state(Arena *arena, U64 timeout_us) // send status request MD_ParseResult reply = {0}; - if ( ! t_dbg_send_cmd(str8_lit("state"), timeout_us, arena ? arena : scratch.arena, &reply)) { goto exit; } + if ( ! t_dbg_send_cmd(str8_lit("state"), timeout_us, arena, &reply)) { goto exit; } // parse reply MD_Node *state_md = md_child_from_string(reply.root, str8_lit("state"), 0); @@ -221,13 +193,14 @@ t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_u typedef struct Node { struct Node *next; T_DbgLine v; } Node; Node *first_line = 0, *last_line = 0; U64 line_count = 0; + for MD_EachNode(n, lines_md->first) { T_DbgLine line = {0}; - if ( ! t_ipc_parse_string(n, str8_lit("file_path"), &line.file_path)) { t_infof("INFO: 'lines' is missing 'file_path'\n"); goto exit; } - if ( ! t_ipc_parse_int(n, str8_lit("line_num"), &line.line_num)) { t_infof("INFO: 'lines' is missing 'line_num'\n"); goto exit; } - if ( ! t_ipc_parse_int(n, str8_lit("column_num"), &line.column_num)) { t_infof("INFO: 'lines' is missing 'column_num'\n"); goto exit; } - if ( ! t_ipc_parse_int(n, str8_lit("voff_range_min"), &line.voff_range.min)) { t_infof("INFO: 'lines' is missing 'voff_range_min'\n"); goto exit; } - if ( ! t_ipc_parse_int(n, str8_lit("voff_range_max"), &line.voff_range.max)) { t_infof("INFO: 'lines' is missing 'voff_range_max'\n"); goto exit; } + if ( ! t_ipc_parse_string(n, str8_lit("file_path"), &line.file_path)) { t_infof("INFO: 'lines' is missing 'file_path'\n"); goto exit; } + if ( ! t_ipc_parse_int (n, str8_lit("line_num"), &line.pt.line)) { t_infof("INFO: 'lines' is missing 'line_num'\n"); goto exit; } + if ( ! t_ipc_parse_int (n, str8_lit("column_num"), &line.pt.column)) { t_infof("INFO: 'lines' is missing 'column_num'\n"); goto exit; } + if ( ! t_ipc_parse_int (n, str8_lit("voff_range_min"), &line.voff_range.min)) { t_infof("INFO: 'lines' is missing 'voff_range_min'\n"); goto exit; } + if ( ! t_ipc_parse_int (n, str8_lit("voff_range_max"), &line.voff_range.max)) { t_infof("INFO: 'lines' is missing 'voff_range_max'\n"); goto exit; } Node *n = push_array(scratch.arena, Node, 1); n->v = line; @@ -276,32 +249,44 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) Temp scratch = scratch_begin(0,0); B32 is_stopped = 0; - // snapshot status - T_DbgState *status_before = t_dbg_state(scratch.arena, max_U64); - if (status_before == 0) { Assert(0 && "failed to snapshot status"); goto exit; } + // snapshot state + T_DbgState *state_before = t_dbg_state(scratch.arena, max_U64); + if (state_before == 0) { + t_errorf("ERROR: failed to snapshot state\n"); + goto exit; + } // send command - if (t_dbg_send_cmd(cmd, max_U64, 0, 0) == 0) { Assert(0 && "failed to the command"); goto exit; } + if (t_dbg_send_cmd(cmd, max_U64, 0, 0) == 0) { + t_errorf("ERROR: failed to send command \"%S\"", cmd); + goto exit; + } // wait for debugger to stop U64 t = ENDT_US(timeout_us); for (;;) { - // query debugger status - T_DbgState *status = t_dbg_state(scratch.arena, t); - if (status == 0) { Assert(0 && "failed to acquire debugger status"); goto exit; } + // query debugger state + T_DbgState *state = t_dbg_state(scratch.arena, t); + if (state == 0) { + t_errorf("ERROR: failed to fetch debugger state\n"); + goto exit; + } // did state change? -> break - if (!status->running && status->run_gen != status_before->run_gen) { + if (!state->running && state->run_gen != state_before->run_gen) { is_stopped = 1; break; } // "solve" the wait problem - if (now_time_us() >= t) { Assert(0 && "timeout"); goto exit; } + if (now_time_us() >= t) { + t_errorf("ERROR: command \"%S\" hit timeout\n", cmd); + goto exit; + } sleep_ms(10); } - //--- Status --------------------- + //--- state --------------------- if (0 && is_stopped) { T_DbgState *state = t_dbg_state(scratch.arena, T_Dbg_DefaultTimeout); @@ -315,10 +300,16 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) String8 sp = t_dbg_value_from_exprf(scratch.arena, "hex(reg:rsp)"); T_DbgState *last_stop = t_dbg_state(scratch.arena, T_Dbg_DefaultTimeout); - AssertAlways(last_stop); + if ( ! last_stop) { + t_errorf("ERROR: debugger state fetch failed\n"); + goto exit; + } T_DbgLineArray lines = {0}; - AssertAlways(t_dbg_src_line(scratch.arena, last_stop->ip_vaddr, &lines, T_Dbg_DefaultTimeout)); + if ( ! t_dbg_src_line(scratch.arena, last_stop->ip_vaddr, &lines, T_Dbg_DefaultTimeout)) { + t_errorf("ERROR: failed t map IP(0x%llx) to a source location\n", last_stop->ip_vaddr); + goto exit; + } t_infof("------------------------------------------------------------------------------------------------------------------------\n"); t_infof(" Process: %.*s [%.*s] (Active: %.*s)\n", str8_varg(process_id), str8_varg(process_label), str8_varg(process_active)); @@ -330,8 +321,8 @@ t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us) for EachIndex(i, lines.count) { t_infof(" {\n"); t_infof(" File Path: %.*s\n", str8_varg(lines.v[i].file_path)); - t_infof(" Line: %lld\n", (long long)lines.v[i].line_num); - t_infof(" Column: %lld\n", (long long)lines.v[i].column_num); + t_infof(" Line: %lld\n", (long long)lines.v[i].pt.line); + t_infof(" Column: %lld\n", (long long)lines.v[i].pt.column); t_infof(" }\n"); } fflush(stdout); @@ -348,13 +339,27 @@ t_dbg_ping(U64 timeout_us) { Temp scratch = scratch_begin(0,0); T_DbgState *state = t_dbg_state(scratch.arena, timeout_us); - B32 did_reply = state != 0; scratch_end(scratch); - return did_reply; + return state != 0; +} + +internal B32 +t_dbg_bp_add_line(String8 file, U64 line) +{ + return t_dbg_send_cmdf(0,0,0, "add_breakpoint \"%S\":%llu", file, line); +} + +internal B32 +t_dbg_bp_add_func(String8 func_name) +{ + return t_dbg_send_cmdf(0,0,0, "add_function_breakpoint %S", func_name); +} + +internal B32 +t_dbg_bp_add_addr(U64 addr) +{ + return t_dbg_send_cmdf(0,0,0, "add_address_breakpoint 0x%llx", addr); } -internal B32 t_dbg_bp_add_line(String8 file, U64 line) { return t_dbg_send_cmdf(0,0,0, "add_breakpoint \"%S\":%llu", file, line); } -internal B32 t_dbg_bp_add_func(String8 func_name) { return t_dbg_send_cmdf(0,0,0, "add_function_breakpoint %S", func_name); } -internal B32 t_dbg_bp_add_addr(U64 addr) { return t_dbg_send_cmdf(0,0,0, "add_address_breakpoint 0x%llx", addr); } internal B32 t_dbg_launch(String8 cmdline, U64 timeout_us) @@ -374,7 +379,10 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), }; Process dbg_handle = process_launch(&launch_opts); - if (process_match(dbg_handle, process_zero())) { AssertAlways(0 && "failed to launch debugger"); goto exit; } + if (process_match(dbg_handle, process_zero())) { + t_errorf("ERROR: failed to launch debugger with this CMDL: %S\n", cmdline); + goto exit; + } #if OS_WINDOWS // cache debugger PID @@ -396,7 +404,10 @@ t_dbg_launch(String8 cmdline, U64 timeout_us) if (dbg_ready) { break; } // "solve" the wait problem - if (now_time_us() >= t) { Assert(0 && "timeout"); break; } + if (now_time_us() >= t) { + t_errorf("ERROR: failed to launch debugger, because operation timed out\n"); + break; + } sleep_ms(10); } @@ -415,10 +426,10 @@ t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out) B32 is_ok = t_dbg_send_cmd(cmd, T_Dbg_DefaultTimeout, arena, &reply); T_Eval e = {0}; - if ( ! t_ipc_parse_string(reply.root, str8_lit("expr"), &e.expr)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: expr\n"); Assert(0); goto exit; } - if ( ! t_ipc_parse_string(reply.root, str8_lit("value"), &e.value)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: value\n"); Assert(0); goto exit; } - if ( ! t_ipc_parse_string(reply.root, str8_lit("type"), &e.type)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: type\n"); Assert(0); goto exit; } - if ( ! t_ipc_parse_string(reply.root, str8_lit("error"), &e.error)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: error\n"); Assert(0); goto exit; } + if ( ! t_ipc_parse_string(reply.root, str8_lit("expr"), &e.expr)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: expr\n"); goto exit; } + if ( ! t_ipc_parse_string(reply.root, str8_lit("value"), &e.value)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: value\n"); goto exit; } + if ( ! t_ipc_parse_string(reply.root, str8_lit("type"), &e.type)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: type\n"); goto exit; } + if ( ! t_ipc_parse_string(reply.root, str8_lit("error"), &e.error)) { t_errorf_md(str8_lit("IPC"), str8_zero(), reply.root, "ERROR: failed to parse reply member: error\n"); goto exit; } if (eval_out) { *eval_out = e; } exit:; @@ -465,146 +476,213 @@ t_dbg_script_cmd_kind_from_string(String8 cmd) } internal B32 -t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgScript *script_out) +t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript *script_out) { Temp scratch = scratch_begin(&arena, 1); + B32 is_ok = 0; - + T_DbgScript script = { .file_path = push_str8_copy(arena, file_path) }; - // scrape MD comment tokens out of source while preserving original source offsets - MD_TokenArray script_tokens = {0}; - { - MD_TokenizeResult source_tokens = md_tokenize_from_text(scratch.arena, source); - MD_TokenChunkList script_token_chunks = {0}; - for EachIndex(token_idx, source_tokens.tokens.count) { - MD_Token token = source_tokens.tokens.v[token_idx]; - if (token.flags & MD_TokenFlag_Comment) { - String8 token_string = str8_substr(source, token.range); - String8 comment = str8_skip_chop_whitespace(token_string); - String8 prefix = str8_lit("///"); - if (str8_matchi(str8_prefix(comment, prefix.size), prefix)) { - String8 script_part = str8_skip(comment, prefix.size); - U64 script_part_base_off = (U64)(script_part.str - source.str); - MD_TokenizeResult script_part_tokenize = md_tokenize_from_text(scratch.arena, script_part); - for EachIndex(script_token_idx, script_part_tokenize.tokens.count) { - MD_Token script_token = script_part_tokenize.tokens.v[script_token_idx]; - script_token.range.min += script_part_base_off; - script_token.range.max += script_part_base_off; - md_token_chunk_list_push(scratch.arena, &script_token_chunks, 4096, script_token); - } - MD_Token newline_token = md_token_make(r1u64(token.range.max, token.range.max), MD_TokenFlag_Newline); - md_token_chunk_list_push(scratch.arena, &script_token_chunks, 4096, newline_token); - } + // parse out mdesk out of the comments + MD_TokenizeResult source_tokens = md_tokenize_from_text(scratch.arena, source); + MD_TokenChunkList annot_chunks = {0}; + for EachIndex(token_idx, source_tokens.tokens.count) { + MD_Token source_token = source_tokens.tokens.v[token_idx]; + + // skip non-comment tokens + if (~source_token.flags & MD_TokenFlag_Comment) { continue; } + + // read token string + String8 source_token_string = str8_substr(source, source_token.range); + + if (str8_match_wildcard(source_token_string, str8_lit("*///*"), 0)) { + + // drop comment prefix + String8 raw_annots = str8_skip(str8_skip_chop_whitespace(source_token_string), 3); + + // parse annotations + MD_TokenizeResult annot_parse = md_tokenize_from_text(scratch.arena, raw_annots); + + for EachIndex(i, annot_parse.tokens.count) { + MD_Token annot_token = annot_parse.tokens.v[i]; + + // adjust token range so they point back into the source file + annot_token.range = shift_1u64(annot_token.range, (U64)(raw_annots.str - source.str)); + + // append annotation token + md_token_chunk_list_push(scratch.arena, &annot_chunks, 4096, annot_token); } + + // append new line token + MD_Token newline_token = md_token_make(r1u64(source_token.range.max, source_token.range.max), MD_TokenFlag_Newline); + md_token_chunk_list_push(scratch.arena, &annot_chunks, 4096, newline_token); } - script_tokens = md_token_array_from_chunk_list(scratch.arena, &script_token_chunks); } - - // script tokens -> mdesk tree - MD_ParseResult script_parse = md_parse_from_text_tokens(scratch.arena, file_path, source, script_tokens); - AssertAlways(script_parse.msgs.worst_message_kind < MD_MsgKind_Error); - - // test - { - MD_Node *test = script_parse.root->first; - AssertAlways( ! md_node_is_nil(test)); - if (str8_matchi(test->string, str8_lit("test"))) { - for MD_EachNode(n, test->first) { - OperatingSystem os = operating_system_from_string(n->string); - AssertAlways(os != OperatingSystem_Null); - - for MD_EachNode(field, n->first) { - T_DbgScriptDirectiveKind kind = T_DbgScriptDirectiveKind_Null; - if (str8_matchi(field->string, str8_lit("compile"))) { kind = T_DbgScriptDirectiveKind_Compile; } - else if (str8_matchi(field->string, str8_lit("link"))) { kind = T_DbgScriptDirectiveKind_Link; } - else if (str8_matchi(field->string, str8_lit("launch"))) { kind = T_DbgScriptDirectiveKind_Launch; } - else if (str8_matchi(field->string, str8_lit("skip"))) { kind = T_DbgScriptDirectiveKind_Skip; } - if (kind == T_DbgScriptDirectiveKind_Null) { - t_errorf_md(file_path, source, n, "unknown field in test header \"%S\"\n", field->string); - goto exit; - } + // script annotations -> mdesk tree + MD_TokenArray annot_tokens = md_token_array_from_chunk_list(scratch.arena, &annot_chunks); + MD_ParseResult script_parse = md_parse_from_text_tokens(scratch.arena, file_path, source, annot_tokens); - T_DbgScriptDirective *dir = push_array(arena, T_DbgScriptDirective, 1); - dir->kind = kind; - t_find_line_and_col(source, field, &dir->line, 0); - - if (field->flags & MD_NodeFlag_HasBraceLeft) { - if (kind == T_DbgScriptDirectiveKind_Compile) { - for MD_EachNode(sub_field, field->first) { - if (str8_matchi(sub_field->string, str8_lit("cc"))) { - MD_Node *cc = sub_field->first; - if (cc->flags & MD_NodeFlag_StringLiteral) { - if (str8_matchi(cc->string, str8_lit("clang"))) { dir->compile.cc = T_Compiler_Clang; } - else if (str8_matchi(cc->string, str8_lit("cl"))) { dir->compile.cc = T_Compiler_Cl; } - else { - t_errorf_md(file_path, source, cc, "unknown compiler name: \"%S\"\n", sub_field->string); - goto exit; - } - } else { - t_errorf_md(file_path, source, sub_field, "value of CC must be a string literal e.g. CC: \"clang\"\n"); - goto exit; - } - } else if (str8_matchi(sub_field->string, str8_lit("args"))) { - MD_Node *args = sub_field->first; - if (args->flags & MD_NodeFlag_StringLiteral) { - dir->args = str8_copy(arena, args->string); - } else { - t_errorf_md(file_path, source, args, "value of ARGS must be a string literal\n"); - goto exit; - } - } else { - t_errorf_md(file_path, source, sub_field, "unknown field \"%S\"\n", sub_field->string); - goto exit; - } - } - } - } else { - if (md_node_is_nil(field->first)) { - t_errorf_md(file_path, source, field, "missing value on field %S\n", field->string); - goto exit; - } - if ( ! md_node_is_nil(field->first->next)) { - t_errorf_md(file_path, source, field, "field %S accepts only one value\n", field->string); - goto exit; - } - if (~field->first->flags & MD_NodeFlag_StringLiteral) { - t_errorf_md(file_path, source, field, "field %S accepts only strings\n", field->string); - goto exit; - } - dir->args = str8_copy(arena, field->first->string); - } - - T_DbgScriptDirectiveList *list = &script.directives[os][kind]; - SLLQueuePush(list->first, list->last, dir); - list->count += 1; - } + // was parse ok? -> error + if (script_parse.msgs.worst_message_kind >= MD_MsgKind_Error) { + t_errorf("ERROR: cannot tokenize mdesk file: \"%S\"\n", file_path); + for EachNode(msg, MD_Msg, script_parse.msgs.first) { + String8 msg_kind_string = {0}; + switch(msg->kind) + { + default:{}break; + case MD_MsgKind_Note: {msg_kind_string = str8_lit("note");}break; + case MD_MsgKind_Warning: {msg_kind_string = str8_lit("warning");}break; + case MD_MsgKind_Error: {msg_kind_string = str8_lit("error");}break; + case MD_MsgKind_FatalError: {msg_kind_string = str8_lit("fatal error");}break; } - } else { + TxtPt pt = mg_txt_pt_from_string_off(source, msg->node->src_offset); + String8 loc = push_str8f(scratch.arena, "%S:%I64d:%I64d", file_path, pt.line, pt.column); + t_errorf(" [%S] %S: %S\n", msg_kind_string, loc, msg->string); + } + goto exit; + } + + // @test: + { + // first child node of the root must be a test header + MD_Node *test = script_parse.root->first; + + // is node test? -> error + if ( ! str8_matchi(test->string, str8_lit("test"))) { t_errorf("ERROR: %S: missing test header\n", file_path); goto exit; } - } - - // file - { - MD_NodePtrList files = {0}; - for MD_EachNode(n, script_parse.root->first->next) { - if (str8_matchi(n->string, str8_lit("file"))) { - AssertAlways( ! md_node_is_nil(n->first)); - if ( ! md_node_is_nil(n->first->next) || ! (n->first->flags & MD_NodeFlag_StringLiteral)) { - U32 line = 0; - for EachIndex(idx, n->first->src_offset) { line += (source.str[idx] == '\n'); } - t_errorf_md(file_path, source, n, "value of the 'file' must be a string, (e.g. file: \"main.c\")\n", file_path, line); + for MD_EachNode(n, test->first) { + OperatingSystem os = operating_system_from_string(n->string); + + // is OS string correct? -> error + if (os == OperatingSystem_Null && n->string.size > 0) { + t_errorf_md(file_path, source, n, "test is defined for unknown os: \"%S\"\n", n->string); + goto exit; + } + + for MD_EachNode(field, n->first) { + // define table for mapping string to a directive kind + struct { + T_DbgScriptDirectiveKind kind; + String8 string; + } dir_string_map[] = { + #define X(q,w) { T_DbgScriptDirectiveKind_##q, str8_lit(w) }, + T_DbgScriptDirectiveKind_XList + #undef X + }; + + // string -> directive + T_DbgScriptDirectiveKind kind = T_DbgScriptDirectiveKind_Null; + for EachElement(i, dir_string_map) { + if (str8_matchi(field->string, dir_string_map[i].string)) { + kind = dir_string_map[i].kind; + break; + } + } + + // was directive found? -> error + if (kind == T_DbgScriptDirectiveKind_Null) { + t_errorf_md(file_path, source, n, "unknown field in test header \"%S\"\n", field->string); goto exit; } + // alloc directive node + T_DbgScriptDirective *dir = push_array(arena, T_DbgScriptDirective, 1); + dir->kind = kind; + dir->pt = mg_txt_pt_from_string_off(source, field->src_offset); + + // TODO: collapse + if (field->flags & MD_NodeFlag_HasBraceLeft) { + // walk each sub-field of the MD node, and find nodes for the directive + if (kind == T_DbgScriptDirectiveKind_Compile) { + for MD_EachNode(sub_field, field->first) { + // compiler override + if (str8_matchi(sub_field->string, str8_lit("cc"))) { + MD_Node *cc = sub_field->first; + if (~cc->flags & MD_NodeFlag_StringLiteral) { + t_errorf_md(file_path, source, sub_field, "value of CC must be a string literal e.g. CC: \"clang\"\n"); + goto exit; + } + + if (str8_matchi(cc->string, str8_lit("clang"))) { dir->compile.cc = T_Compiler_Clang; } + else if (str8_matchi(cc->string, str8_lit("cl"))) { dir->compile.cc = T_Compiler_Cl; } + else { + t_errorf_md(file_path, source, cc, "unknown compiler name: \"%S\"\n", sub_field->string); + goto exit; + } + } + // commnad line for the compiler + else if (str8_matchi(sub_field->string, str8_lit("args"))) { + MD_Node *args = sub_field->first; + if (~args->flags & MD_NodeFlag_StringLiteral) { + t_errorf_md(file_path, source, args, "value of ARGS must be a string literal\n"); + goto exit; + } + dir->args = str8_copy(arena, args->string); + } + // unknown field + else { + t_errorf_md(file_path, source, sub_field, "unknown field \"%S\"\n", sub_field->string); + goto exit; + } + } + } + } + // MD node is a string + else { + // is value present? -> error + if (md_node_is_nil(field->first)) { + t_errorf_md(file_path, source, field, "missing value on field %S\n", field->string); + goto exit; + } + + // more than one node? -> error + if ( ! md_node_is_nil(field->first->next)) { + t_errorf_md(file_path, source, field, "field %S accepts only one value\n", field->string); + goto exit; + } + + // node is not a string literal? -> error + if (~field->first->flags & MD_NodeFlag_StringLiteral) { + t_errorf_md(file_path, source, field, "field %S accepts only strings\n", field->string); + goto exit; + } + + // copy string from MD node + dir->args = str8_copy(arena, field->first->string); + } + + // append new directive + T_DbgScriptDirectiveList *list = &script.directives[os][kind]; + SLLQueuePush(list->first, list->last, dir); + list->count += 1; + } + } + } + + // @file: + { + // collect file nodes + MD_NodePtrList files = {0}; + for MD_EachNode(n, script_parse.root->first->next) { + if (str8_matchi(n->string, str8_lit("file"))) { + + // is file value a string? -> error + if ( ! md_node_is_nil(n->first->next) || ! (n->first->flags & MD_NodeFlag_StringLiteral)) { + t_errorf_md(file_path, source, n, "value of the 'file' must be a string, (e.g. file: \"main.c\")\n"); + goto exit; + } + + // append file node md_node_ptr_list_push(scratch.arena, &files, n); } } + // no nodes? -> treat whole file as a script if (files.count == 0) { MD_Node *whole_file = push_array(scratch.arena, MD_Node, 1); whole_file->first = push_array(scratch.arena, MD_Node, 1); @@ -618,77 +696,106 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS for EachNode(n_ptr, MD_NodePtrNode, files.first) { MD_Node *n = n_ptr->v; + // get file name + String8 file_name = n->first->string; + + // was file seen? -> error + MD_Node *is_declared = hash_map_search_string_raw(&files_hm, file_name); + if (is_declared) { + TxtPt pt = mg_txt_pt_from_string_off(source, is_declared->src_offset); + t_errorf_md(file_path, source, n, "file %S is already declared at line %llu", file_name, pt.line); + goto exit; + } + hash_map_push_string_raw(scratch.arena, &files_hm, file_name, n); + + // file ends at EOF or before the next file directive U64 src_opl = source.size; if (n_ptr->next) { src_opl = n_ptr->next->v->src_offset; } + // sub-string the source file String8 sub_source = str8_substr(source, r1u64(n->src_offset, src_opl)); U64 file_min = str8_find_needle(sub_source, 0, str8_lit("\n"), 0) + 1; U64 file_max = str8_find_needle_reverse(sub_source, 0, str8_lit("\n"), 0); sub_source = str8_substr(sub_source, r1u64(file_min, file_max)); + // append new file node T_DbgScriptFile *file = push_array(arena, T_DbgScriptFile, 1); - file->path = t_make_file_path(arena, n->first->string); + file->path = t_make_file_path(arena, file_name); file->source = sub_source; - t_find_line_and_col(source, n, &file->line, 0); + file->pt = mg_txt_pt_from_string_off(source, n->src_offset); SLLQueuePush(script.files.first, script.files.last, file); script.files.count += 1; - - hash_map_push_raw_raw(scratch.arena, &files_hm, n, file); } } - // programs + // @program: { - HashMap hm = {0}; // + HashMap hm = {0}; // (U64, T_DbgScriptProgram) for MD_EachNode(n, script_parse.root->first->next) { + // find order number nodes U64 order = 0; - if (try_u64_from_str8_c_rules(n->string, &order)) { - T_DbgScriptFile *file = 0; - for (file = script.files.first; file != 0; file = file->next) { - if (file->source.str <= n->string.str && n->string.str < (file->source.str + file->source.size)) { - break; - } + if ( ! try_u64_from_str8_c_rules(n->string, &order)) { + continue; + } + + // correlate MD node to the script file + T_DbgScriptFile *file = 0; + for (file = script.files.first; file != 0; file = file->next) { + if (file->source.str <= n->string.str && n->string.str < (file->source.str + file->source.size)) { + break; } - AssertAlways(file != 0); + } + + // found file? -> error + if (file == 0) { + t_errorf_md(file_path, source, n, "failed to correlate MD node to the script source file\n"); + goto exit; + } + + // is order number unique? -> error + T_DbgScriptProgram *p = hash_map_search_u64_raw(&hm, order); + if (p) { + t_errorf_md(file_path, source, n, "duplicate order number %llu found, previous defined at %llu\n", order, p->pt.line); + goto exit; + } + + // alloc & fill out program + p = push_array(arena, T_DbgScriptProgram, 1); + p->pt = mg_txt_pt_from_string_off(source, n->src_offset); + p->order = order; + p->os = OperatingSystem_CURRENT; + p->file = file; + hash_map_push_u64_raw(scratch.arena, &hm, order, p); + + for MD_EachNode(cmd_n, n->first) { + // alloc & fill out command + T_DbgScriptCmd *cmd = push_array(arena, T_DbgScriptCmd, 1); + cmd->kind = t_dbg_script_cmd_kind_from_string(cmd_n->string); + cmd->pt = mg_txt_pt_from_string_off(source, n->src_offset); + SLLQueuePush(p->first, p->last, cmd); + p->count += 1; - T_DbgScriptProgram *p = hash_map_search_u64_raw(&hm, order); - if (p == 0) { - p = push_array(arena, T_DbgScriptProgram, 1); - t_find_line_and_col(source, n, &p->line, 0); - p->order = order; - p->os = OperatingSystem_CURRENT; - p->file = file; - hash_map_push_u64_raw(scratch.arena, &hm, order, p); - } else { - t_errorf("ERROR: duplicate order number %llu found on line %llu\n", (unsigned long long)order, (unsigned long long)p->line); - } - - for MD_EachNode(cmd_n, n->first) { - // push new cmd - T_DbgScriptCmd *cmd = push_array(arena, T_DbgScriptCmd, 1); - cmd->kind = t_dbg_script_cmd_kind_from_string(cmd_n->string); - t_find_line_and_col(source, n, &cmd->line_num, &cmd->col_num); - Assert(cmd->kind != T_DbgScriptCmdKind_Null); - SLLQueuePush(p->first, p->last, cmd); - p->count += 1; - - // parse cmd args - MD_Node *cmd_arg = cmd_n->first; - if ( ! md_node_is_nil(cmd_arg)) { - if (cmd->kind == T_DbgScriptCmdKind_At) { - AssertAlways(try_s64_from_str8_c_rules(cmd_arg->string, &cmd->at.delta)); - } else if (cmd->kind == T_DbgScriptCmdKind_Eval) { - NotImplemented; - } else if (cmd->kind == T_DbgScriptCmdKind_Breakpoint) { - NotImplemented; - } + // parse cmd args + MD_Node *cmd_arg = cmd_n->first; + + if (md_node_is_nil(cmd_arg)) { continue; } + + if (cmd->kind == T_DbgScriptCmdKind_At) { + if ( ! try_s64_from_str8_c_rules(cmd_arg->string, &cmd->at_delta)) { + t_errorf_md(file_path, source, cmd_arg, "failed to parse \"%S\"", cmd_arg->string); + goto exit; } + } else if (cmd->kind == T_DbgScriptCmdKind_Eval) { + t_errorf_md(file_path, source, cmd_arg, "TODO: Eval\n"); + } else if (cmd->kind == T_DbgScriptCmdKind_Breakpoint) { + t_errorf_md(file_path, source, cmd_arg, "TODO: Breakpoint\n"); } } } + // extract commands and sort based on order number script.program_count = hm.count; script.programs = values_from_hash_map_raw(arena, &hm); radsort(script.programs, script.program_count, t_dbg_script_program_is_before); @@ -696,9 +803,7 @@ t_dbg_script_from_source(Arena *arena, String8 file_path, String8 source, T_DbgS is_ok = 1; exit:; - if (script_out) { - *script_out = script; - } + if (script_out) { *script_out = script; } scratch_end(scratch); return is_ok; } @@ -715,7 +820,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) if (program->os == OperatingSystem_CURRENT) { for EachNode(cmd, T_DbgScriptCmd, program->first) { - t_infof("[%llu] Command: %S:%llu %S\n", program->order, script->file_path, (unsigned long long)cmd->line_num, t_string_from_dbg_script_cmd_kind(cmd->kind)); + t_infof("[%llu] Command: %S:%llu %S\n", program->order, script->file_path, cmd->pt.line, t_string_from_dbg_script_cmd_kind(cmd->kind)); switch (cmd->kind) { case T_DbgScriptCmdKind_Null: break; @@ -731,9 +836,12 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) case T_DbgScriptCmdKind_Breakpoint: NotImplemented; break; case T_DbgScriptCmdKind_ClearBreakpoints: t_dbg_send_cmdf(0,0,0, "clear_breakpoints"); break; case T_DbgScriptCmdKind_Run: t_dbg_send_cmd(str8_lit("run"), timeout_us, 0, 0); break; + case T_DbgScriptCmdKind_RunToLine: { + U64 line = cmd->pt.line - program->file->pt.line; + t_dbg_send_cmd_and_wait_stop(str8f(scratch.arena, "run_to_line \"%S:%llu\"", program->file->path, line), timeout_us); + } break; case T_DbgScriptCmdKind_At: { - // TODO: debugger does not populate eval cache with registers before first frame, - // so this racy, for now use lower level option + // TODO: debugger does not populate eval cache with registers before first frame -- for now use lower level option #if 0 U64 ip = u64_from_str8(t_dbg_value_from_exprf(scratch.arena, "reg:rip"), 10); if (ip == 0) { @@ -743,7 +851,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) #else T_DbgState *temp_status = t_dbg_state(scratch.arena, T_Dbg_DefaultTimeout); if (temp_status == 0) { - t_errorf("ERROR: %S:%llu: failed to query IP\n", script->file_path, (unsigned long long)cmd->line_num); + t_errorf("ERROR: %S:%llu: failed to query IP\n", script->file_path, cmd->pt.line); goto exit; } U64 ip = temp_status->ip; @@ -752,29 +860,29 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) // map IP -> source location T_DbgLineArray lines = {0}; if (t_dbg_src_line(scratch.arena, ip, &lines, T_Dbg_DefaultTimeout) == 0) { - t_errorf("ERROR: %S:%llu: IP (0x%llx) does not map to a source line\n", script->file_path, (unsigned long long)cmd->line_num, (unsigned long long)ip); + t_errorf("ERROR: %S:%llu: IP (0x%llx) does not map to a source line\n", script->file_path, cmd->pt.line, ip); goto exit; } // compute line where debugger must be - S64 at_line_s64 = (S64)(program->line - program->file->line) + cmd->at.delta; + S64 at_line_s64 = (S64)(program->pt.line - program->file->pt.line) + cmd->at_delta; U64 at_line_u64 = at_line_s64 >= 0 ? (U64)at_line_s64 : 0; AssertAlways(at_line_u64 > 0); if (lines.count == 0) { - t_errorf("ERROR: %S:%llu:%llu: no source location maps for vaddr: 0x%llx\n", script->file_path, (unsigned long long)cmd->line_num, (unsigned long long)cmd->col_num, (unsigned long long)ip); + t_errorf("ERROR: %S:%llu:%llu: no source location maps for vaddr: 0x%llx\n", script->file_path, cmd->pt.line, cmd->pt.column, ip); goto exit; } // match expected vs current debugger locations for EachIndex(i, lines.count) { - B32 mismatch = lines.v[i].line_num != at_line_u64 || + B32 mismatch = lines.v[i].pt.line != at_line_u64 || !str8_match(lines.v[i].file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); if (mismatch) { - t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, (unsigned long long)cmd->line_num); - t_errorf(" Expected: %S:%llu\n", program->file->path, (unsigned long long)at_line_u64); - t_errorf(" Got : %S:%llu\n", lines.v[i].file_path, (unsigned long long)lines.v[i].line_num); - t_errorf(" IP : 0x%llx\n", (unsigned long long)ip); + t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, cmd->pt.line); + t_errorf(" Expected: %S:%llu\n", program->file->path, at_line_u64); + t_errorf(" Got : %S:%llu\n", lines.v[i].file_path, lines.v[i].pt.line); + t_errorf(" IP : 0x%llx\n", ip); goto exit; } } @@ -796,11 +904,6 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) internal T_RunSig(dbg_script_runner) { - if ( ! file_path_exists(t_raddbg_path())) { - t_errorf("ERROR: failed to find debugger \"%S\"\n", t_raddbg_path()); - T_Ok(0); - } - // read source file String8 source = data_from_file_path(arena, user_data); if (source.size == 0) { @@ -810,7 +913,7 @@ T_RunSig(dbg_script_runner) // source -> script T_DbgScript script = {0}; - if ( ! t_dbg_script_from_source(arena, user_data, source, &script)) { + if ( ! t_dbg_parse_script(arena, user_data, source, &script)) { result_out->status = T_RunStatus_Fail; goto exit; } @@ -818,20 +921,16 @@ T_RunSig(dbg_script_runner) // write source files to test folder for EachNode(file, T_DbgScriptFile, script.files.first) { if (write_data_to_file_path(file->path, file->source) == 0) { - t_errorf("ERROR: %S:%llu: failed to write: \"%S\"\n", user_data, (unsigned long long)file->line, file->path); + t_errorf("ERROR: %S:%llu: failed to write: \"%S\"\n", user_data, file->pt.line, file->path); T_Ok(0); } } - if (script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Skip].count) { - result_out->status = T_RunStatus_Skip; - goto exit; - } - // compiler vars HashTable *script_vars = hash_table_init(arena, 1000); hash_table_push_path_string(arena, script_vars, str8_lit("FILE"), user_data); hash_table_push_path_string(arena, script_vars, str8_lit("CWD"), g_wdir); + hash_table_push_path_string(arena, script_vars, str8_lit("SRC"), t_src_path()); // run compilers for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Compile].first) { @@ -867,7 +966,7 @@ T_RunSig(dbg_script_runner) if (compiler == T_Compiler_Cl) { g_output = str8_skip(g_output, str8_chop_line(&g_output).size); } // file name print if (g_last_exit_code) { - t_errorf("ERROR: %S:%llu: %S\n", script.file_path, (unsigned long long)directive->line, g_errors); + t_errorf("ERROR: %S:%llu: %S\n", script.file_path, (unsigned long long)directive->pt.line, g_errors); if (g_stop_on_first_fail_or_crash) { T_Ok(0); } @@ -883,11 +982,17 @@ T_RunSig(dbg_script_runner) T_Ok(0); } if (g_last_exit_code != 0) { - t_errorf("ERROR: %S:%llu: %S\n", script.file_path, (unsigned long long)directive->line, g_errors); + t_errorf("ERROR: %S:%llu: %S\n", script.file_path, (unsigned long long)directive->pt.line, g_errors); T_Ok(0); } } - + + // is skip flag set? -> exit + if (g_build_only || script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Skip].count) { + result_out->status = T_RunStatus_Skip; + goto exit; + } + // launch targets for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Launch].first) { String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); diff --git a/src/torture/torture_dbg.h b/src/torture/torture_dbg.h index 39e73b05..c1aac25a 100644 --- a/src/torture/torture_dbg.h +++ b/src/torture/torture_dbg.h @@ -3,121 +3,6 @@ #pragma once -//////////////////////////////// -// Dbg Script - -typedef struct T_DbgScriptFile -{ - struct T_DbgScriptFile *next; - String8 path; - String8 source; - U64 line; -} T_DbgScriptFile; - -typedef struct -{ - U64 count; - T_DbgScriptFile *first; - T_DbgScriptFile *last; -} T_DbgScriptFileList; - -#define T_DbgScriptCmdKind_XList \ - X(Breakpoint, "bp") \ - X(ClearBreakpoints, "bp_clear") \ - X(Run, "run") \ - X(Halt, "halt") \ - X(StepOver, "step_over") \ - X(StepInto, "step_into") \ - X(StepOut, "step_out") \ - X(StepOverInst, "step_over_inst") \ - X(StepIntoInst, "step_over_inst") \ - X(StepOverLine, "step_over_line") \ - X(StepIntoLine, "step_into_line") \ - X(KillAll, "kll_all") \ - X(At, "at") \ - X(Eval, "eval") - -typedef enum -{ - T_DbgScriptCmdKind_Null, -#define X(n,...) T_DbgScriptCmdKind_##n, - T_DbgScriptCmdKind_XList -#undef X - T_DbgScriptCmdKind_Count -} T_DbgScriptCmdKind; - -typedef struct T_DbgScriptCmd -{ - struct T_DbgScriptCmd *next; - T_DbgScriptCmdKind kind; - U64 line_num; - U64 col_num; - union { - struct { - S64 delta; - } at; - }; -} T_DbgScriptCmd; - -typedef struct T_DbgScriptProgram -{ - U64 line; - U64 order; - OperatingSystem os; - T_DbgScriptFile *file; - U64 count; - T_DbgScriptCmd *first; - T_DbgScriptCmd *last; - struct T_DbgScriptProgram *next; -} T_DbgScriptProgram; - -typedef struct -{ - U64 count; - T_DbgScriptProgram *first; - T_DbgScriptProgram *last; -} T_DbgScriptProgramList; - -typedef enum -{ - T_DbgScriptDirectiveKind_Null, - T_DbgScriptDirectiveKind_Compile, - T_DbgScriptDirectiveKind_Link, - T_DbgScriptDirectiveKind_Launch, - T_DbgScriptDirectiveKind_Skip, - T_DbgScriptDirectiveKind_Count, -} T_DbgScriptDirectiveKind; - -typedef struct T_DbgScriptDirective -{ - struct T_DbgScriptDirective *next; - T_DbgScriptDirectiveKind kind; - U64 line; - String8 args; - union { - struct { - T_Compiler cc; - } compile; - }; -} T_DbgScriptDirective; - -typedef struct -{ - U64 count; - T_DbgScriptDirective *first; - T_DbgScriptDirective *last; -} T_DbgScriptDirectiveList; - -typedef struct -{ - String8 file_path; - T_DbgScriptDirectiveList directives[OperatingSystem_COUNT][T_DbgScriptDirectiveKind_Count]; - T_DbgScriptFileList files; - U64 program_count; - T_DbgScriptProgram **programs; - B32 skip; -} T_DbgScript; - //////////////////////////////// // IPC Controller @@ -146,8 +31,7 @@ typedef struct typedef struct { String8 file_path; - U64 line_num; - U64 column_num; + TxtPt pt; Rng1U64 voff_range; } T_DbgLine; @@ -168,25 +52,154 @@ typedef struct //////////////////////////////// // Dbg Script -internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path); -internal B32 t_dbg_run_script(Arena *arena, T_DbgScript *script, U64 timeout_us); +#define T_DbgScriptCmdKind_XList \ + X(Breakpoint, "bp") \ + X(ClearBreakpoints, "bp_clear") \ + X(Halt, "halt") \ + X(Run, "run") \ + X(RunToLine, "run_to_line") \ + X(StepOver, "step_over") \ + X(StepInto, "step_into") \ + X(StepOut, "step_out") \ + X(StepOverInst, "step_over_inst") \ + X(StepIntoInst, "step_over_inst") \ + X(StepOverLine, "step_over_line") \ + X(StepIntoLine, "step_into_line") \ + X(KillAll, "kll_all") \ + X(At, "at") \ + X(Eval, "eval") + +typedef enum +{ + T_DbgScriptCmdKind_Null, +#define X(n,...) T_DbgScriptCmdKind_##n, + T_DbgScriptCmdKind_XList +#undef X + T_DbgScriptCmdKind_Count +} T_DbgScriptCmdKind; + +#define T_DbgScriptDirectiveKind_XList \ + X(Compile, "compile") \ + X(Link, "link") \ + X(Launch, "launch") \ + X(Skip, "skip") + +typedef enum +{ + T_DbgScriptDirectiveKind_Null, +#define X(q,w) T_DbgScriptDirectiveKind_##q, + T_DbgScriptDirectiveKind_XList +#undef X + T_DbgScriptDirectiveKind_Count, +} T_DbgScriptDirectiveKind; + +typedef struct T_DbgScriptFile +{ + struct T_DbgScriptFile *next; + String8 path; + String8 source; + TxtPt pt; +} T_DbgScriptFile; + +typedef struct +{ + U64 count; + T_DbgScriptFile *first; + T_DbgScriptFile *last; +} T_DbgScriptFileList; + +typedef struct T_DbgScriptCmd +{ + struct T_DbgScriptCmd *next; + T_DbgScriptCmdKind kind; + TxtPt pt; + S64 at_delta; +} T_DbgScriptCmd; + +typedef struct T_DbgScriptProgram +{ + TxtPt pt; + U64 order; + OperatingSystem os; + T_DbgScriptFile *file; + U64 count; + T_DbgScriptCmd *first; + T_DbgScriptCmd *last; + struct T_DbgScriptProgram *next; +} T_DbgScriptProgram; + +typedef struct +{ + U64 count; + T_DbgScriptProgram *first; + T_DbgScriptProgram *last; +} T_DbgScriptProgramList; + +typedef struct T_DbgScriptDirective +{ + struct T_DbgScriptDirective *next; + T_DbgScriptDirectiveKind kind; + TxtPt pt; + String8 args; + union { + struct { + T_Compiler cc; + } compile; + }; +} T_DbgScriptDirective; + +typedef struct +{ + U64 count; + T_DbgScriptDirective *first; + T_DbgScriptDirective *last; +} T_DbgScriptDirectiveList; + +typedef struct +{ + String8 file_path; + T_DbgScriptDirectiveList directives[OperatingSystem_COUNT][T_DbgScriptDirectiveKind_Count]; + T_DbgScriptFileList files; + U64 program_count; + T_DbgScriptProgram **programs; + B32 skip; +} T_DbgScript; + //////////////////////////////// -// Dbg Tester +// IPC Controller -internal B32 t_dbg_ping (U64 timeout_us); -internal B32 t_dbg_run (U64 timeout_us); -internal B32 t_dbg_kill_all (U64 timeout_us); -internal B32 t_dbg_halt (U64 timeout_us); -internal B32 t_dbg_step_over (U64 timeout_us); -internal B32 t_dbg_step_into (U64 timeout_us); -internal B32 t_dbg_step_out (U64 timeout_us); -internal B32 t_dbg_step_over_inst(U64 timeout_us); -internal B32 t_dbg_step_into_inst(U64 timeout_us); -internal B32 t_dbg_step_over_line(U64 timeout_us); -internal B32 t_dbg_step_into_line(U64 timeout_us); -internal B32 t_dbg_launch(String8 cmdline, U64 timeout_us); -internal B32 t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out); -// TODO: need a source location query in eval -internal B32 t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines, U64 timeout_us); +// error helper +internal void t_errorf_md(String8 file_name, String8 source, MD_Node *n, char *fmt, ...); + +// reply parse helpers +internal B32 t_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out); +internal B32 t_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out); +internal B32 t_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out); +internal B32 t_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out); +#define t_ipc_parse_int(n, c, ptr) t_ipc_parse_int_(n, c, sizeof(*ptr), ptr) + +// debugger commands +internal B32 t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out); +internal B32 t_dbg_send_cmdf(U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out, char *fmt, ...); +internal T_DbgState * t_dbg_state(Arena *arena, U64 timeout_us); +internal B32 t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_us); +internal String8 t_dbg_value_from_expr(Arena *arena, String8 expr); +internal String8 t_dbg_value_from_exprf(Arena *arena, char *fmt, ...); +internal B32 t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us); +internal B32 t_dbg_ping(U64 timeout_us); +internal B32 t_dbg_bp_add_line(String8 file, U64 line); +internal B32 t_dbg_bp_add_func(String8 func_name); +internal B32 t_dbg_bp_add_addr(U64 addr); +internal B32 t_dbg_launch(String8 cmdline, U64 timeout_us); +internal B32 t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out); + +//////////////////////////////// +// Dbg Script + +internal String8 t_string_from_dbg_script_cmd_kind(T_DbgScriptCmdKind v); +internal T_DbgScriptCmdKind t_dbg_script_cmd_kind_from_string(String8 cmd); +internal B32 t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript *script_out); +internal B32 t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us); +internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path); diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index f6f505b9..6745399c 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -30,6 +30,7 @@ #include "minidump/minidump.h" #include "minidump/minidump_parse.h" #include "mdesk/mdesk.h" +#include "metagen/metagen.h" #include "window_manager/window_manager_inc.h" #include "config/config_inc.h" #include "content/content.h" @@ -107,6 +108,7 @@ #include "minidump/minidump.c" #include "minidump/minidump_parse.c" #include "mdesk/mdesk.c" +#include "metagen/metagen.c" #include "window_manager/window_manager_inc.c" #include "config/config_inc.c" #include "content/content.c" From 3a109a734303a2ce06356fcba6670d645f223b37 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 24 May 2026 18:58:34 -0700 Subject: [PATCH 700/850] sketch test for SYSV and GNU style hash tables --- src/torture/dbg_tests/gnu_sysv_hash.c | 246 ++++++++++++++++++++++++++ src/torture/torture.c | 21 --- 2 files changed, 246 insertions(+), 21 deletions(-) create mode 100644 src/torture/dbg_tests/gnu_sysv_hash.c diff --git a/src/torture/dbg_tests/gnu_sysv_hash.c b/src/torture/dbg_tests/gnu_sysv_hash.c new file mode 100644 index 00000000..b0f85258 --- /dev/null +++ b/src/torture/dbg_tests/gnu_sysv_hash.c @@ -0,0 +1,246 @@ +/// test: { +/// linux: { +/// skip: "" +/// compile: "-O0 -g sysv_module.c -fPIC -shared -Wl,--hash-style=sysv -o libsysv_module.so" +/// compile: "-O0 -g gnu_module.c -fPIC -shared -Wl,--hash-style=gnu -o libgnu_module.so" +/// compile: "-O0 -g main.c -L. -lsysv_module -lgnu_module -o main -Wl,-rpath,%CWD%,-z,now -fno-plt" +/// launch: "./main" +/// } +/// } + +/// file: "sysv_module.c" + +__attribute__((visibility("default"))) int sysv_default_object = 10; +__attribute__((visibility("protected"))) int sysv_protected_object = 11; +__attribute__((visibility("hidden"))) int sysv_hidden_object = 12; +__attribute__((visibility("internal"))) int sysv_internal_object = 13; +__attribute__((weak, visibility("default"))) int sysv_weak_object = 14; + +__thread __attribute__((visibility("default"))) int sysv_tls_object = 15; +__thread __attribute__((visibility("protected"))) int sysv_protected_tls_object = 16; +__thread __attribute__((weak, visibility("default"))) int sysv_weak_tls_object = 17; +static __thread int sysv_static_tls_object = 18; +static int sysv_static_object = 19; + +/* +extern long write(int, const void *, unsigned long); +extern char sysv_notype_symbol; +extern char sysv_hidden_notype_symbol; +extern char sysv_internal_notype_symbol; + +__asm__(".globl sysv_notype_symbol\n" + "sysv_notype_symbol:\n" + " .byte 0\n" + ".globl sysv_hidden_notype_symbol\n" + ".hidden sysv_hidden_notype_symbol\n" + "sysv_hidden_notype_symbol:\n" + " .byte 0\n" + ".globl sysv_internal_notype_symbol\n" + ".internal sysv_internal_notype_symbol\n" + "sysv_internal_notype_symbol:\n" + " .byte 0\n"); +*/ + +__attribute__((visibility("default"))) int +sysv_default_func(int x) +{ + return x + 101; /// 1: { run_to_line at } +} + +__attribute__((weak, visibility("default"))) int +sysv_weak_func(int x) +{ + return x + 102; /// 2: { run_to_line at } +} + +__attribute__((visibility("protected"))) int +sysv_protected_func(int x) +{ + return x + 103; /// 3: { run_to_line at } +} + +__attribute__((visibility("internal"))) int +sysv_internal_func(int x) +{ + return x + 104; /// 4: { run_to_line at } +} + +static int +sysv_ifunc_impl(int x) +{ + return x + 105; /// 5: { run_to_line at } +} + +static void * +sysv_ifunc_resolver(void) +{ + return sysv_ifunc_impl; +} + +__attribute__((ifunc("sysv_ifunc_resolver"), visibility("default"))) int sysv_ifunc_func(int x); + +__attribute__((visibility("hidden"))) int +sysv_hidden_func(int x) +{ + return x + sysv_hidden_object; /// 6: { run_to_line at } +} + +static int +sysv_static_func(int x) +{ + return x + sysv_static_object; /// 7: { run_to_line at } +} + +__attribute__((visibility("default"))) int +sysv_run_all(int x) +{ + int result = 0; + result += sysv_default_func(x); + result += sysv_weak_func(x); + result += sysv_protected_func(x); + result += sysv_internal_func(x); + result += sysv_ifunc_func(x); + result += sysv_hidden_func(x); + result += sysv_static_func(x); + result += sysv_default_object; + result += sysv_weak_object; + result += sysv_protected_object; + result += sysv_hidden_object; + result += sysv_tls_object; + result += sysv_weak_tls_object; + result += sysv_protected_tls_object; + result += sysv_static_tls_object; + result += sysv_static_object; + result += sysv_internal_object; + //result += (int)((unsigned long)&sysv_notype_symbol & 1); + //result += (int)((unsigned long)&sysv_hidden_notype_symbol & 1); + //result += (int)((unsigned long)&sysv_internal_notype_symbol & 1); + //result += (int)write(-1, 0, 0); + return result; /// 8: { run_to_line at } +} + +/// file: "gnu_module.c" + +__attribute__((visibility("default"))) int gnu_default_object = 20; +__attribute__((weak, visibility("default"))) int gnu_weak_object = 21; +__attribute__((visibility("protected"))) int gnu_protected_object = 22; +__attribute__((visibility("hidden"))) int gnu_hidden_object = 23; +__attribute__((visibility("internal"))) int gnu_internal_object = 24; + +__thread __attribute__((visibility("default"))) int gnu_tls_object = 25; +__thread __attribute__((weak, visibility("default"))) int gnu_weak_tls_object = 26; +__thread __attribute__((visibility("protected"))) int gnu_protected_tls_object = 27; +static __thread int gnu_static_tls_object = 28; +static int gnu_static_object = 29; + +/* +extern long write(int, const void *, unsigned long); +extern char gnu_notype_symbol; +extern char gnu_hidden_notype_symbol; +extern char gnu_internal_notype_symbol; + +__asm__(".globl gnu_notype_symbol\n" + "gnu_notype_symbol:\n" + " .byte 0\n" + ".globl gnu_hidden_notype_symbol\n" + ".hidden gnu_hidden_notype_symbol\n" + "gnu_hidden_notype_symbol:\n" + " .byte 0\n" + ".globl gnu_internal_notype_symbol\n" + ".internal gnu_internal_notype_symbol\n" + "gnu_internal_notype_symbol:\n" + " .byte 0\n"); +*/ + +__attribute__((visibility("default"))) int +gnu_default_func(int x) +{ + return x * 101; /// 9: { run_to_line at } +} + +__attribute__((weak, visibility("default"))) int +gnu_weak_func(int x) +{ + return x * 102; /// 10: { run_to_line at } +} + +__attribute__((visibility("protected"))) int +gnu_protected_func(int x) +{ + return x * 103; /// 11: { run_to_line at } +} + +__attribute__((visibility("internal"))) int +gnu_internal_func(int x) +{ + return x * 104; /// 12: { run_to_line at } +} + +static int +gnu_ifunc_impl(int x) +{ + return x * 105; /// 13: { run_to_line at } +} + +static void * +gnu_ifunc_resolver(void) +{ + return gnu_ifunc_impl; +} + +__attribute__((ifunc("gnu_ifunc_resolver"), visibility("default"))) int gnu_ifunc_func(int x); + +__attribute__((visibility("hidden"))) int +gnu_hidden_func(int x) +{ + return x * gnu_hidden_object; /// 14: { run_to_line at } +} + +static int +gnu_static_func(int x) +{ + return x * gnu_static_object; /// 15: { run_to_line at } +} + +__attribute__((visibility("default"))) int +gnu_run_all(int x) +{ + int result = 0; + result += gnu_default_func(x); + result += gnu_weak_func(x); + result += gnu_protected_func(x); + result += gnu_internal_func(x); + result += gnu_ifunc_func(x); + result += gnu_hidden_func(x); + result += gnu_static_func(x); + result += gnu_default_object; + result += gnu_weak_object; + result += gnu_protected_object; + result += gnu_hidden_object; + result += gnu_tls_object; + result += gnu_weak_tls_object; + result += gnu_protected_tls_object; + result += gnu_static_tls_object; + result += gnu_static_object; + result += gnu_internal_object; + /* + result += (int)((unsigned long)&gnu_notype_symbol & 1); + result += (int)((unsigned long)&gnu_hidden_notype_symbol & 1); + result += (int)((unsigned long)&gnu_internal_notype_symbol & 1); + result += (int)write(-1, 0, 0); + */ + return result; /// 16: { run_to_line at } +} + +/// file: "main.c" + +int sysv_run_all(int x); +int gnu_run_all(int x); + +int main() +{ + int result = 0; + result += sysv_run_all(123); /// 17: { run_to_line at } + result += gnu_run_all(321); /// 18: { run_to_line at } + return result; /// 19: { run_to_line at run } +} diff --git a/src/torture/torture.c b/src/torture/torture.c index 4cda5a7b..c514ea9c 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -1295,27 +1295,6 @@ t_entry_point(CmdLine *cmdline) // Clean up output from previous run // delete_file_at_path(g_stdout_file_name); - - // - // Check tools - // - String8 tools[] = { - t_raddbg_path(), - t_radbin_path(), - t_radlink_path(), - t_clang_path(), -#if OS_WINDOWS - t_cl_path(), -#elif OS_LINUX - t_gcc_path(), -#endif - }; - for EachElement(i, tools) { - if ( ! file_path_exists(tools[i])) { - fprintf(stderr, "ERROR: failed to find tool \"%.*s\"\n", str8_varg(tools[i])); - goto exit; - } - } // // Run tests From a151df283f62928766441f04add90e733efb114d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Tue, 26 May 2026 16:07:19 -0700 Subject: [PATCH 701/850] skip tests without directive, and escape * in ubuntu run --- .github/workflows/builds.yml | 6 +++--- src/torture/torture.c | 3 ++- src/torture/torture_dbg.c | 8 +++++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 31b8afbd..e2319c71 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -9,7 +9,7 @@ on: - '**.md' env: - TORTURE_FLAGS: "* --gen_crash_dump" + TORTURE_FLAGS: "--gen_crash_dump" jobs: build-ubuntu-24-04: @@ -97,7 +97,7 @@ jobs: - name: Run shell: bash run: | - CC="${{ matrix.compiler }}" ./run.sh clang "${{ matrix.mode }}" -- $TORTURE_FLAGS + CC="${{ matrix.compiler }}" ./run.sh clang "${{ matrix.mode }}" -- \* $TORTURE_FLAGS - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 @@ -129,7 +129,7 @@ jobs: run: | for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do set "VS_INSTALL=%%i" call "%VS_INSTALL%\VC\Auxiliary\Build\vcvarsall.bat" x64 - call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- %TORTURE_FLAGS% || exit /b 1 + call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- * %TORTURE_FLAGS% || exit /b 1 - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 diff --git a/src/torture/torture.c b/src/torture/torture.c index c514ea9c..f7162932 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -1449,5 +1449,6 @@ t_entry_point(CmdLine *cmdline) } scratch_end(scratch); - // TODO: return exit_code; + exit(exit_code); } + diff --git a/src/torture/torture_dbg.c b/src/torture/torture_dbg.c index 7dfb7036..9c23b219 100644 --- a/src/torture/torture_dbg.c +++ b/src/torture/torture_dbg.c @@ -987,8 +987,14 @@ T_RunSig(dbg_script_runner) } } + // if test does not have any directive -> skip + U64 total_directive_count = 0; + for EachIndex(i, ArrayCount(script.directives[OperatingSystem_CURRENT])) { + total_directive_count += script.directives[OperatingSystem_CURRENT][i].count; + } + // is skip flag set? -> exit - if (g_build_only || script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Skip].count) { + if (g_build_only || total_directive_count == 0 || script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Skip].count) { result_out->status = T_RunStatus_Skip; goto exit; } From 4e72553006e33db3aeb8eecf68637ae61f852205 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 23 May 2026 13:44:33 -0700 Subject: [PATCH 702/850] promote test-definition concepts from torture to base layer; reorganize tests to be nested in their respective layer; eliminate 't_group', just use containing layer --- project.4coder | 2 +- project.raddbg | 7 +- src/base/base_context_cracking.h | 4 + src/base/base_core.h | 15 + src/base/base_inc.c | 1 + src/base/base_inc.h | 1 + src/base/base_strings.c | 8 + src/base/base_test.c | 2 + src/base/base_test.h | 85 ++ .../tests/base_tests.c} | 117 ++- .../tests/dwarf_tests.c} | 753 +++++++++--------- .../tests/linker_tests.c} | 34 +- src/linux/base/linux_base.c | 21 +- .../tests/mdesk_tests.c} | 7 +- .../old_test_debuggees}/basic_stepping_test.c | 0 .../old_test_debuggees}/gnu_sysv_hash.c | 0 .../old_test_debuggees}/mule.cpp | 0 .../old_test_debuggees}/step_into_for_goto.c | 0 .../step_into_lazy_module_func.c | 0 .../step_into_static_module_func.c | 74 +- .../tests/raddbg_tests.c} | 371 +++++++-- .../tests/rdi_from_dwarf_tests.c} | 0 .../tests/rdi_from_pdb_tests.c} | 0 src/torture/torture.c | 288 ++++--- src/torture/torture.h | 83 +- src/torture/torture_dbg.h | 205 ----- src/torture/torture_main.c | 19 +- src/torture/torture_radlink.h | 28 - src/win32/base/win32_base.c | 10 + 29 files changed, 1090 insertions(+), 1045 deletions(-) create mode 100644 src/base/base_test.c create mode 100644 src/base/base_test.h rename src/{torture/torture_base.c => base/tests/base_tests.c} (97%) rename src/{torture/torture_dwarf.c => dwarf/tests/dwarf_tests.c} (56%) rename src/{torture/torture_radlink.c => linker/tests/linker_tests.c} (99%) rename src/{torture/torture_md.c => mdesk/tests/mdesk_tests.c} (96%) rename src/{torture/dbg_tests => mule/old_test_debuggees}/basic_stepping_test.c (100%) rename src/{torture/dbg_tests => mule/old_test_debuggees}/gnu_sysv_hash.c (100%) rename src/{torture/dbg_tests => mule/old_test_debuggees}/mule.cpp (100%) rename src/{torture/dbg_tests => mule/old_test_debuggees}/step_into_for_goto.c (100%) rename src/{torture/dbg_tests => mule/old_test_debuggees}/step_into_lazy_module_func.c (100%) rename src/{torture/dbg_tests => mule/old_test_debuggees}/step_into_static_module_func.c (95%) rename src/{torture/torture_dbg.c => raddbg/tests/raddbg_tests.c} (83%) rename src/{torture/torture_d2r.c => rdi_from_dwarf/tests/rdi_from_dwarf_tests.c} (100%) rename src/{torture/torture_p2r.c => rdi_from_pdb/tests/rdi_from_pdb_tests.c} (100%) delete mode 100644 src/torture/torture_dbg.h delete mode 100644 src/torture/torture_radlink.h diff --git a/project.4coder b/project.4coder index e793b63f..24737b61 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index e3cfcebd..97eceeb8 100644 --- a/project.raddbg +++ b/project.raddbg @@ -6,7 +6,6 @@ target: executable: "build/raddbg.exe" working_directory: build arguments: "--user:raddbg_test.user --project:raddbg_test.project" - enabled: 1 debug_subprocesses: 0 } target: @@ -38,3 +37,9 @@ target: working_directory: build arguments: "--rdi raddbg.pdb" } +target: +{ + executable: "build/torture.exe" + working_directory: "build/" + enabled: 1 +} diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index 2a31c48d..87b32b45 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -138,6 +138,10 @@ # define BUILD_DEBUG 1 #endif +#if !defined(BUILD_TESTS) +# define BUILD_TESTS 0 +#endif + #if !defined(BUILD_SUPPLEMENTARY_UNIT) # define BUILD_SUPPLEMENTARY_UNIT 0 #endif diff --git a/src/base/base_core.h b/src/base/base_core.h index 73d265c5..2bad9a82 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -670,6 +670,16 @@ Compiler; # define Compiler_CURRENT Compiler_Null #endif +typedef enum Linker +{ + Linker_Null, + Linker_radlink, + Linker_msvc, + Linker_lld, + Linker_COUNT +} +Linker; + //////////////////////////////// //~ rjf: Access Flags @@ -1076,6 +1086,11 @@ internal DateTime date_time_from_dense_time(DenseTime time); internal DateTime date_time_from_micro_seconds(U64 time); internal DateTime date_time_from_unix_time(U64 unix_time); +//////////////////////////////// +//~ rjf: @per_os_impl Debugger Attachment Checking + +internal B32 debugger_is_attached(void); + //////////////////////////////// //~ rjf: @per_os_impl Platform Time Functions diff --git a/src/base/base_inc.c b/src/base/base_inc.c index 683806aa..ab242f81 100644 --- a/src/base/base_inc.c +++ b/src/base/base_inc.c @@ -25,6 +25,7 @@ #include "base_markup.c" #include "base_meta.c" #include "base_log.c" +#include "base_test.c" #include "base_entry_point.c" #if OS_WINDOWS diff --git a/src/base/base_inc.h b/src/base/base_inc.h index adaac62d..bc8d568d 100644 --- a/src/base/base_inc.h +++ b/src/base/base_inc.h @@ -27,6 +27,7 @@ #include "base_markup.h" #include "base_meta.h" #include "base_log.h" +#include "base_test.h" #include "base_entry_point.h" #if OS_WINDOWS diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 70d538d6..45c8a7a3 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -423,6 +423,10 @@ str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags { needle_first_char_adjusted = upper_from_char(needle_first_char_adjusted); } + if(adjusted_flags & StringMatchFlag_SlashInsensitive) + { + needle_first_char_adjusted = correct_slash_from_char(needle_first_char_adjusted); + } for(;p < stop_p; p += 1) { U8 haystack_char_adjusted = *p; @@ -430,6 +434,10 @@ str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags { haystack_char_adjusted = upper_from_char(haystack_char_adjusted); } + if(adjusted_flags & StringMatchFlag_SlashInsensitive) + { + haystack_char_adjusted = correct_slash_from_char(haystack_char_adjusted); + } if(haystack_char_adjusted == needle_first_char_adjusted) { if(str8_match(str8_range(p + 1, string_opl), needle_tail, adjusted_flags)) diff --git a/src/base/base_test.c b/src/base/base_test.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/base/base_test.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/base/base_test.h b/src/base/base_test.h new file mode 100644 index 00000000..54f49913 --- /dev/null +++ b/src/base/base_test.h @@ -0,0 +1,85 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_TEST_H +#define BASE_TEST_H + +typedef enum TestStatus +{ + TestStatus_Fail, + TestStatus_Crash, + TestStatus_Pass, + TestStatus_Skip, + TestStatus_COUNT +} +TestStatus; + +typedef struct TestResult TestResult; +struct TestResult +{ + TestStatus status; + char *fail_file; + int fail_line; + char *fail_cond; +}; + +#define TEST_FUNCTION_SIG(name) void name(Arena *arena, String8 user_data, TestResult *result_out, String8List *test_out) +#define TEST_FUNCTION_DEF(name) TEST_FUNCTION_SIG(test__##name) +typedef TEST_FUNCTION_SIG(TestFunctionType); + +typedef struct TestInfo TestInfo; +struct TestInfo +{ + String8 layer; + String8 label; + int decl_line; + B32 skip; + TestFunctionType *test_fn; +}; + +#if BUILD_TESTS +global U64 test_infos_count = 0; +global TestInfo test_infos[0xffff] = {0}; +#define AddTest(name, file_name, line, skip_, ...) \ +TEST_FUNCTION_DEF(name);\ +__VA_ARGS__ void add_test__##name(void)\ +{\ +String8 file = str8_lit(file_name);\ +U64 src_pos = str8_find_needle(file, 0, s("src/"), StringMatchFlag_SlashInsensitive);\ +String8 layer_folder = str8_skip(file, src_pos+4);\ +U64 layer_slash_pos = str8_find_needle(layer_folder, 0, s("/"), StringMatchFlag_SlashInsensitive);\ +String8 layer_name = str8_prefix(layer_folder, layer_slash_pos);\ +test_infos[test_infos_count].layer = layer_name;\ +test_infos[test_infos_count].label = str8_lit(#name);\ +test_infos[test_infos_count].decl_line = (line);\ +test_infos[test_infos_count].skip = (skip_);\ +test_infos[test_infos_count].test_fn = test__##name;\ +test_infos_count += 1;\ +} +# if COMPILER_MSVC +# pragma section(".CRT$XCU", read) +# define DeclareTest(name, skip) \ +AddTest(name, __FILE__, __LINE__, (skip))\ +__declspec(allocate(".CRT$XCU")) void (*add_test_ptr__##name)(void) = add_test__##name;\ +__pragma(comment(linker, "/include:" Stringify(add_test_ptr__##name))) +# elif COMPILER_GCC || COMPILER_CLANG +# define DeclareTest(name, skip) AddTest(name, __FILE__, __LINE__, (skip), __attribute__((constructor))) +# else +# error DeclareTest not defined for this compiler. +# endif +#else +# define DeclareTest(name, skip) +#endif + +#define Test(name) DeclareTest(name, 0)\ +TEST_FUNCTION_DEF(name) +#define SkippedTest(name) DeclareTest(name, 1)\ +TEST_FUNCTION_DEF(name) + +#define TestCheck(c) do { if (!(c)) {\ +*result_out = (TestResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) };\ +if(debugger_is_attached()) { Trap(); }\ +return;\ +} } while(0) + +#endif // BASE_TEST_H diff --git a/src/torture/torture_base.c b/src/base/tests/base_tests.c similarity index 97% rename from src/torture/torture_base.c rename to src/base/tests/base_tests.c index 988378d8..2e8c5e6a 100644 --- a/src/torture/torture_base.c +++ b/src/base/tests/base_tests.c @@ -4,7 +4,7 @@ TEST(str8_list_substr) { String8List zero_list = {0}; - + { String8List list = {0}; str8_list_pushf(arena, &list, "a"); @@ -14,7 +14,7 @@ TEST(str8_list_substr) String8 result = str8_list_join(arena, &list, 0); T_Ok(str8_match(result, str8_lit("abc"), 0)); } - + { String8List list = {0}; str8_list_pushf(arena, &list, "a"); @@ -24,9 +24,9 @@ TEST(str8_list_substr) String8 result = str8_list_join(arena, &list, 0); T_Ok(str8_match(result, str8_lit("abc"), 0)); } - + { - + String8List list = {0}; str8_list_pushf(arena, &list, "a"); str8_list_pushf(arena, &list, "bcd"); @@ -34,9 +34,9 @@ TEST(str8_list_substr) String8 result = str8_list_join(arena, &sub, 0); T_Ok(str8_match(result, str8_lit("c"), 0)); } - + { - + String8List list = {0}; str8_list_pushf(arena, &list, "a"); str8_list_pushf(arena, &list, "bcd"); @@ -44,7 +44,7 @@ TEST(str8_list_substr) String8 result = str8_list_join(arena, &sub, 0); T_Ok(str8_match(result, str8_lit("b"), 0)); } - + { String8List list = {0}; str8_list_pushf(arena, &list, "ab"); @@ -54,14 +54,14 @@ TEST(str8_list_substr) String8 result = str8_list_join(arena, &sub, 0); T_Ok(str8_match(result, str8_lit("bcde"), 0)); } - + { String8List list = {0}; str8_list_pushf(arena, &list, "abc"); - + String8List zero = str8_list_substr(arena, list, r1u64(0, 0)); T_Ok(MemoryMatchStruct(&zero, &zero_list)); - + String8List out_of_bounds_range = str8_list_substr(arena, list, r1u64(max_U64/2, max_U64)); T_Ok(MemoryMatchStruct(&out_of_bounds_range, &zero_list)); } @@ -84,7 +84,7 @@ TEST(bit_array) T_Ok(r == expected_r); if (r) { T_Ok(idx == expected_idx); - + } } } @@ -112,11 +112,11 @@ TEST(match_wildcard) T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("*?"), 0) == 0); T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("?*"), 0) == 0); T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit(""), 0) == 0); - + // exact T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("a"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("A"), 0) == 0); - + // ? T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("?"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("?"), 0) == 0); @@ -126,7 +126,7 @@ TEST(match_wildcard) T_Ok(str8_match_wildcard(str8_lit("ab"), str8_lit("??"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("a?c"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("ab"), str8_lit("???"), 0) == 0); - + // * T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("*"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("*"), 0) == 1); @@ -140,32 +140,32 @@ TEST(match_wildcard) T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("a**c"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("a*b*c"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*a*d*"), 0) == 0); - + T_Ok(str8_match_wildcard(str8_lit("abcd"), str8_lit("a*d"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("abefcdgiescdfimde"), str8_lit("ab*cd?i*de"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("mississippi"), str8_lit("m*iss*ppi"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*b"), 0) == 0); T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("aa"), 0) == 0); T_Ok(str8_match_wildcard(str8_lit("aa"), str8_lit("a"), 0) == 0); - + // case insensitive T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("A"), StringMatchFlag_CaseInsensitive) == 1); T_Ok(str8_match_wildcard(str8_lit("FooBar"), str8_lit("foobar"), StringMatchFlag_CaseInsensitive) == 1); T_Ok(str8_match_wildcard(str8_lit("Foobar"), str8_lit("foo*"), StringMatchFlag_CaseInsensitive) == 1); - + // right side sloppy T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("ab"), StringMatchFlag_RightSideSloppy) == 1); T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit(""), StringMatchFlag_RightSideSloppy) == 1); T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("a"), StringMatchFlag_RightSideSloppy) == 0); - + // slash insensitive T_Ok(str8_match_wildcard(str8_lit("a/b"), str8_lit("a\\b"), 0) == 0); T_Ok(str8_match_wildcard(str8_lit("a/b"), str8_lit("a\\b"), StringMatchFlag_SlashInsensitive) == 1); T_Ok(str8_match_wildcard(str8_lit("a/b/c"), str8_lit("a\\*\\c"), StringMatchFlag_SlashInsensitive) == 1); - + // combined T_Ok(str8_match_wildcard(str8_lit("Ab\\Cde"), str8_lit("ab/*e"), StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive) == 1); - + T_Ok(str8_match_wildcard(str8_lit("abc"), str8_lit("*?*"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit("a"), str8_lit("*?*"), 0) == 1); T_Ok(str8_match_wildcard(str8_lit(""), str8_lit("*?*"), 0) == 0); @@ -178,17 +178,17 @@ TEST(hash_map) { { HashMap hm = {0}; - + U64 test_count = 256; for EachIndex(i, test_count) { hash_map_push_u64_u64(arena, &hm, i, i*2); } - + // test tombstone reuse for (U64 i = 10; i < test_count; ++i) { HashMapNode *test_node = hash_map_search(&hm, hash_map_hasher(str8_struct(&i)), (HashMapKey){ .key_u64 = i }, hash_map_match_u64); T_Ok(hash_map_purge_u64(&hm, i) == 1); T_Ok(hash_map_push_u64_u64(arena, &hm, i, 10) == test_node); } - + // delete some items and after search them for (U64 i = 0; i < 10; ++i) { T_Ok(hash_map_purge_u64(&hm, i)); @@ -197,37 +197,37 @@ TEST(hash_map) for (U64 i = 0; i < 10; ++i) { T_Ok(hash_map_search_u64_raw(&hm, i) == 0); } - + // extract pairs and test sorting HashMapKeyValue *pairs = key_value_from_hash_map(arena, &hm); sort_hash_map_key_value_u64(pairs, hm.count); for (U64 i = 1; i < hm.count; ++i) { T_Ok(pairs[i-1].key.key_u64 < pairs[i].key.key_u64); } - + // did purge put all the nodes on free list? hash_map_purge(&hm); U64 free_list_count = 0; for (HashMapNode *n = hm.free_list; n != 0; n = n->next) { free_list_count += 1; } T_Ok(free_list_count == test_count); } - + // test search through tombstones { HashMap hm = {0}; - + U64 hash = 12345; - + hash_map_push(arena, &hm, hash, (HashMapKeyValue){ .key = { .key_u64 = 1 }, .value = { .value_u64 = 10 } }, hash_map_match_u64); hash_map_push(arena, &hm, hash, (HashMapKeyValue){ .key = { .key_u64 = 2 }, .value = { .value_u64 = 20 } }, hash_map_match_u64); hash_map_push(arena, &hm, hash, (HashMapKeyValue){ .key = { .key_u64 = 3 }, .value = { .value_u64 = 30 } }, hash_map_match_u64); - + T_Ok(hash_map_purge_u64(&hm, 1)); - + T_Ok(hash_map_search(&hm, hash, (HashMapKey){ .key_u64 = 2 }, hash_map_match_u64)->v.value.value_u64 == 20); T_Ok(hash_map_search(&hm, hash, (HashMapKey){ .key_u64 = 3 }, hash_map_match_u64)->v.value.value_u64 == 30); } - + // interleaved purges { HashMap hm = {0}; @@ -235,107 +235,106 @@ TEST(hash_map) for EachIndex(i, 256) { hash_map_push_u64_u64(arena, &hm, i, round); } for (U64 i = 0; i < 256; i += 2) { hash_map_purge_u64(&hm, i); } for (U64 i = 0; i < 256; i += 2) { hash_map_push_u64_u64(arena, &hm, i, round + 1); } - + T_Ok(hm.count == 256); T_Ok(hm.tombstone_count == 0); } - + for EachIndex(i, 100) { T_Ok(hash_map_purge_u64(&hm, 123123123 + i) == 0); } } - + // empty hash map test { HashMap hm = {0}; - + T_Ok(hash_map_search_u64_raw(&hm, 123) == 0); T_Ok(hash_map_purge_u64(&hm, 123) == 0); - + HashMapKeyValue *pairs = key_value_from_hash_map(arena, &hm); T_Ok(pairs == 0 || hm.count == 0); - + hash_map_purge(&hm); T_Ok(hm.count == 0); T_Ok(hm.tombstone_count == 0); } - + // heavy collision { HashMap hm = {0}; - + U64 hash = 12345; U64 count = 1024; - + for EachIndex(i, count) { hash_map_push(arena, &hm, hash, (HashMapKeyValue){ .key = { .key_u64 = i }, .value = { .value_u64 = i*3 } }, hash_map_match_u64); } - + for EachIndex(i, count) { T_Ok(hash_map_search(&hm, hash, (HashMapKey){ .key_u64 = i }, hash_map_match_u64)->v.value.value_u64 == i*3); } } - + // duplicate key test { HashMap hm = {0}; - + U64 a = 1; U64 b = 2; - + HashMapNode *n0 = hash_map_push_u64_u64(arena, &hm, 1, a); HashMapNode *n1 = hash_map_push_u64_u64(arena, &hm, 1, b); - + T_Ok(hm.count == 1); T_Ok(n0 == n1); U64 test = *hash_map_search_u64_u64(&hm, 1); T_Ok(test != b); } - + // test paths { HashMap hm = {0}; - + U64 foo = 0; U64 bar = 1; - + hash_map_push_path_raw(arena, &hm, str8_lit("c:/DEVEL/test"), &foo); hash_map_push_path_raw(arena, &hm, str8_lit("c:\\DEVEL\\test"), &foo); hash_map_push_path_raw(arena, &hm, str8_lit("c:/devel\\test"), &foo); - + hash_map_push_path_raw(arena, &hm, str8_lit("/mnt/devel"), &bar); hash_map_push_path_raw(arena, &hm, str8_lit("/MNT/devel"), &bar); - + T_Ok(hm.count == 2); - + T_Ok(hash_map_search_path_raw(&hm, str8_lit("c:/devel/test")) == &foo); T_Ok(hash_map_search_path_raw(&hm, str8_lit("c:\\devel\\TEST")) == &foo); T_Ok(hash_map_search_path_raw(&hm, str8_lit("/mnt/devel")) == &bar); T_Ok(hash_map_search_path_raw(&hm, str8_lit("/MNT/DEVEL")) == &bar); } - + // test strings { HashMap hm = {0}; - + U64 foo = 0; U64 bar = 1; - + hash_map_push_string_raw(arena, &hm, str8_lit("c:/DEVEL/test"), &foo); hash_map_push_string_raw(arena, &hm, str8_lit("c:\\DEVEL\\test"), &foo); hash_map_push_string_raw(arena, &hm, str8_lit("c:/devel\\test"), &foo); - + hash_map_push_string_raw(arena, &hm, str8_lit("/mnt/devel"), &bar); hash_map_push_string_raw(arena, &hm, str8_lit("/MNT/devel"), &bar); - + T_Ok(hm.count == 5); - + T_Ok(hash_map_search_string_raw(&hm, str8_lit("c:/DEVEL/test")) == &foo); T_Ok(hash_map_search_string_raw(&hm, str8_lit("c:\\DEVEL\\test")) == &foo); T_Ok(hash_map_search_string_raw(&hm, str8_lit("c:/devel\\test")) == &foo); - + T_Ok(hash_map_search_string_raw(&hm, str8_lit("/mnt/devel")) == &bar); T_Ok(hash_map_search_string_raw(&hm, str8_lit("/MNT/devel")) == &bar); } } - diff --git a/src/torture/torture_dwarf.c b/src/dwarf/tests/dwarf_tests.c similarity index 56% rename from src/torture/torture_dwarf.c rename to src/dwarf/tests/dwarf_tests.c index 0649731a..8681db21 100644 --- a/src/torture/torture_dwarf.c +++ b/src/dwarf/tests/dwarf_tests.c @@ -43,23 +43,23 @@ t_dw_test_sleb128(U64 v, U64 expected_length) return is_ok; } -TEST(test_leb128) +Test(test_leb128) { - T_Ok(t_dw_test_uleb128(0, 1)); - T_Ok(t_dw_test_sleb128(0, 1)); - T_Ok(t_dw_test_sleb128(-1, 1)); + TestCheck(t_dw_test_uleb128(0, 1)); + TestCheck(t_dw_test_sleb128(0, 1)); + TestCheck(t_dw_test_sleb128(-1, 1)); - T_Ok(t_dw_test_uleb128(max_U64, 10)); - T_Ok(t_dw_test_sleb128(min_S64, 10)); - T_Ok(t_dw_test_sleb128(max_S64, 10)); + TestCheck(t_dw_test_uleb128(max_U64, 10)); + TestCheck(t_dw_test_sleb128(min_S64, 10)); + TestCheck(t_dw_test_sleb128(max_S64, 10)); - T_Ok(t_dw_test_uleb128(0xDEADBEEFCAFEBABE, 10)); + TestCheck(t_dw_test_uleb128(0xDEADBEEFCAFEBABE, 10)); for EachIndex(i, 64) { - T_Ok(t_dw_test_uleb128((1ull << i), 1 + (i / 7))); + TestCheck(t_dw_test_uleb128((1ull << i), 1 + (i / 7))); } for EachIndex(i, 64) { - T_Ok(t_dw_test_sleb128((1ull << i), 1 + (i + 1) / 7)); + TestCheck(t_dw_test_sleb128((1ull << i), 1 + (i + 1) / 7)); } } @@ -132,7 +132,7 @@ dw_input_from_writer(Arena *arena, DW_Writer *writer) return input; } -TEST(dwarf_32bit) +Test(dwarf_32bit) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); @@ -148,19 +148,19 @@ TEST(dwarf_32bit) Rng1U64 range = unit_ranges.v[range_idx]; U32 first_four_bytes = 0; - T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &first_four_bytes) == sizeof(first_four_bytes)); - T_Ok(first_four_bytes + 4 == dim_1u64(range)); + TestCheck(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &first_four_bytes) == sizeof(first_four_bytes)); + TestCheck(first_four_bytes + 4 == dim_1u64(range)); U32 unit_length = 0; - T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &unit_length) == sizeof(U32)); - T_Ok(unit_length + 4 == dim_1u64(range)); + TestCheck(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &unit_length) == sizeof(U32)); + TestCheck(unit_length + 4 == dim_1u64(range)); } } dw_writer_end(&writer); } -TEST(dwarf_64bit) +Test(dwarf_64bit) { DW_Writer *writer = dw_writer_begin(DW_Format_64Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); @@ -176,19 +176,19 @@ TEST(dwarf_64bit) Rng1U64 range = unit_ranges.v[range_idx]; U32 first_four_bytes = 0; - T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &first_four_bytes) == sizeof(first_four_bytes)); - T_Ok(first_four_bytes == max_U32); + TestCheck(str8_deserial_read_struct(input.sec[sec_idx].data, range.min, &first_four_bytes) == sizeof(first_four_bytes)); + TestCheck(first_four_bytes == max_U32); U64 unit_length = 0; - T_Ok(str8_deserial_read_struct(input.sec[sec_idx].data, range.min + sizeof(U32), &unit_length) == sizeof(U64)); - T_Ok(unit_length + 12 == dim_1u64(range)); + TestCheck(str8_deserial_read_struct(input.sec[sec_idx].data, range.min + sizeof(U32), &unit_length) == sizeof(U64)); + TestCheck(unit_length + 12 == dim_1u64(range)); } } dw_writer_end(&writer); } -TEST(dwarf_line_opcodes) +Test(dwarf_line_opcodes) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); String8 comp_dir = str8_lit("c:/devel/"); @@ -238,126 +238,126 @@ TEST(dwarf_line_opcodes) DW_CompUnit cu = dw_cu_from_info_off(arena, &input, (DW_ListUnitInput){0}, cu_ranges.v[0].min, 0); DW_LineVM *line_vm = dw_line_vm_init(&input, &cu); - T_Ok(line_vm->header.dir_table.count == 2); - T_Ok(line_vm->header.file_table.count == 2); + TestCheck(line_vm->header.dir_table.count == 2); + TestCheck(line_vm->header.file_table.count == 2); - T_Ok(str8_match(line_vm->header.dir_table.v[0], str8_lit("c:/devel"), 0)); - T_Ok(str8_match(line_vm->header.dir_table.v[1], str8_lit("d:/foobar"), 0)); + TestCheck(str8_match(line_vm->header.dir_table.v[0], str8_lit("c:/devel"), 0)); + TestCheck(str8_match(line_vm->header.dir_table.v[1], str8_lit("d:/foobar"), 0)); DW_LineFile *file_reader = &line_vm->header.file_table.v[0]; - T_Ok(str8_match(file_reader->path, comp_name, 0)); - T_Ok(file_reader->dir_idx == 0); - T_Ok(file_reader->time_stamp == file->time_stamp); - T_Ok(u128_match(file_reader->md5, file->md5)); - T_Ok(str8_match(file_reader->source, file->source, 0)); + TestCheck(str8_match(file_reader->path, comp_name, 0)); + TestCheck(file_reader->dir_idx == 0); + TestCheck(file_reader->time_stamp == file->time_stamp); + TestCheck(u128_match(file_reader->md5, file->md5)); + TestCheck(str8_match(file_reader->source, file->source, 0)); DW_LineFile *file2_reader = &line_vm->header.file_table.v[1]; - T_Ok(str8_match(file2_reader->path, str8_lit("qwe.c"), 0)); - T_Ok(file2_reader->dir_idx == 1); - T_Ok(file2_reader->time_stamp == file2->time_stamp); - T_Ok(u128_match(file2_reader->md5, file2->md5)); - T_Ok(str8_match(file2_reader->source, file2->source, 0)); + TestCheck(str8_match(file2_reader->path, str8_lit("qwe.c"), 0)); + TestCheck(file2_reader->dir_idx == 1); + TestCheck(file2_reader->time_stamp == file2->time_stamp); + TestCheck(u128_match(file2_reader->md5, file2->md5)); + TestCheck(str8_match(file2_reader->source, file2->source, 0)); - T_Ok(line_vm->new_line == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_Copy); - T_Ok(line_vm->new_line == 1); - T_Ok(line_vm->state.discriminator == 0); - T_Ok(line_vm->state.basic_block == 0); - T_Ok(line_vm->state.prologue_end == 0); - T_Ok(line_vm->state.epilogue_begin == 0); + TestCheck(line_vm->new_line == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_Copy); + TestCheck(line_vm->new_line == 1); + TestCheck(line_vm->state.discriminator == 0); + TestCheck(line_vm->state.basic_block == 0); + TestCheck(line_vm->state.prologue_end == 0); + TestCheck(line_vm->state.epilogue_begin == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); - T_Ok(line_vm->state.address == 7); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvancePc); + TestCheck(line_vm->state.address == 7); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); - T_Ok(line_vm->state.address == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvancePc); + TestCheck(line_vm->state.address == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 5); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 5); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 1); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 1); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_SetFile); - T_Ok(line_vm->state.file_index == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_SetFile); + TestCheck(line_vm->state.file_index == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_SetColumn); - T_Ok(line_vm->state.column == max_U64); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_SetColumn); + TestCheck(line_vm->state.column == max_U64); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_SetColumn); - T_Ok(line_vm->state.column == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_SetColumn); + TestCheck(line_vm->state.column == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_NegateStmt); - T_Ok(line_vm->state.is_stmt == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_NegateStmt); + TestCheck(line_vm->state.is_stmt == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_NegateStmt); - T_Ok(line_vm->state.is_stmt == 1); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_NegateStmt); + TestCheck(line_vm->state.is_stmt == 1); - T_Ok(line_vm->state.basic_block == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_SetBasicBlock); - T_Ok(line_vm->state.basic_block == 1); + TestCheck(line_vm->state.basic_block == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_SetBasicBlock); + TestCheck(line_vm->state.basic_block == 1); { U64 addr_before = line_vm->state.address; U64 const_advance = (0xffu - line_vm->header.opcode_base) / line_vm->header.line_range; - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(!line_vm->new_line); - T_Ok(line_vm->state.address == addr_before + const_advance); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(!line_vm->new_line); + TestCheck(line_vm->state.address == addr_before + const_advance); } - T_Ok(line_vm->state.address == 0x11); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_FixedAdvancePc); - T_Ok(line_vm->state.address == max_U16 + 0x11); + TestCheck(line_vm->state.address == 0x11); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_FixedAdvancePc); + TestCheck(line_vm->state.address == max_U16 + 0x11); - T_Ok(line_vm->state.prologue_end == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_SetPrologueEnd); - T_Ok(line_vm->state.prologue_end == 1); + TestCheck(line_vm->state.prologue_end == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_SetPrologueEnd); + TestCheck(line_vm->state.prologue_end == 1); - T_Ok(line_vm->state.epilogue_begin == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_SetEpilogueBegin); - T_Ok(line_vm->state.epilogue_begin == 1); + TestCheck(line_vm->state.epilogue_begin == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_SetEpilogueBegin); + TestCheck(line_vm->state.epilogue_begin == 1); - T_Ok(line_vm->state.isa == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_SetIsa); - T_Ok(line_vm->state.isa == max_U64); + TestCheck(line_vm->state.isa == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_SetIsa); + TestCheck(line_vm->state.isa == max_U64); - T_Ok(line_vm->state.address != address); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); - T_Ok(line_vm->ext_opcode == DW_ExtOpcode_SetAddress); - T_Ok(line_vm->state.address == address); + TestCheck(line_vm->state.address != address); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + TestCheck(line_vm->ext_opcode == DW_ExtOpcode_SetAddress); + TestCheck(line_vm->state.address == address); - T_Ok(line_vm->state.discriminator == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); - T_Ok(line_vm->ext_opcode == DW_ExtOpcode_SetDiscriminator); - T_Ok(line_vm->state.discriminator == 2); + TestCheck(line_vm->state.discriminator == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + TestCheck(line_vm->ext_opcode == DW_ExtOpcode_SetDiscriminator); + TestCheck(line_vm->state.discriminator == 2); - T_Ok(!line_vm->state.end_sequence); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); - T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); - T_Ok(line_vm->state.end_sequence); + TestCheck(!line_vm->state.end_sequence); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + TestCheck(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); + TestCheck(line_vm->state.end_sequence); dw_writer_end(&writer); } -TEST(dwarf_line_emit) +Test(dwarf_line_emit) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); String8 comp_dir = str8_lit("c:/devel/"); @@ -416,25 +416,25 @@ TEST(dwarf_line_emit) // check init sequence { - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_SetFile); - T_Ok(line_vm->state.file_index == 0); - T_Ok(line_vm->new_line == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_SetFile); + TestCheck(line_vm->state.file_index == 0); + TestCheck(line_vm->new_line == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); - T_Ok(line_vm->state.address == 1000); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvancePc); + TestCheck(line_vm->state.address == 1000); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->new_line == 0); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->new_line == 0); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_Copy); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->state.address == 1000); - T_Ok(line_vm->new_line == 1); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_Copy); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->state.address == 1000); + TestCheck(line_vm->new_line == 1); } { @@ -442,122 +442,122 @@ TEST(dwarf_line_emit) for EachIndex(i, abs_s64(writer->line.line_base) + 1) { pc += 1; - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == 0x20 - i); - T_Ok(line_vm->state.line == 10000 - i); - T_Ok(line_vm->state.address == pc); - T_Ok(line_vm->new_line == 1); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == 0x20 - i); + TestCheck(line_vm->state.line == 10000 - i); + TestCheck(line_vm->state.address == pc); + TestCheck(line_vm->new_line == 1); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->state.address == pc); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->state.address == pc); } // line window underflow check { pc += 1; - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->state.address == pc); - T_Ok(!line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvancePc); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->state.address == pc); + TestCheck(!line_vm->new_line); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 9994); - T_Ok(line_vm->state.address == pc); - T_Ok(!line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 9994); + TestCheck(line_vm->state.address == pc); + TestCheck(!line_vm->new_line); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_Copy); - T_Ok(line_vm->state.line == 9994); - T_Ok(line_vm->state.address == pc); - T_Ok(line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_Copy); + TestCheck(line_vm->state.line == 9994); + TestCheck(line_vm->state.address == pc); + TestCheck(line_vm->new_line); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->state.address == pc); - T_Ok(!line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->state.address == pc); + TestCheck(!line_vm->new_line); } for EachIndex(i, writer->line.line_range + writer->line.line_base) { pc += 1; - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == 0x20 + i); - T_Ok(line_vm->state.line == 10000 + i); - T_Ok(line_vm->state.address == pc); - T_Ok(line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == 0x20 + i); + TestCheck(line_vm->state.line == 10000 + i); + TestCheck(line_vm->state.address == pc); + TestCheck(line_vm->new_line); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->state.address == pc); - T_Ok(!line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->state.address == pc); + TestCheck(!line_vm->new_line); } // line window overflow check { pc += 1; - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvancePc); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->state.address == pc); - T_Ok(!line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvancePc); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->state.address == pc); + TestCheck(!line_vm->new_line); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 10009); - T_Ok(line_vm->state.address == pc); - T_Ok(!line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 10009); + TestCheck(line_vm->state.address == pc); + TestCheck(!line_vm->new_line); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_Copy); - T_Ok(line_vm->state.address == pc); - T_Ok(line_vm->state.line == 10009); - T_Ok(line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_Copy); + TestCheck(line_vm->state.address == pc); + TestCheck(line_vm->state.line == 10009); + TestCheck(line_vm->new_line); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_AdvanceLine); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->state.address == pc); - T_Ok(!line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_AdvanceLine); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->state.address == pc); + TestCheck(!line_vm->new_line); } - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); - T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); - T_Ok(line_vm->state.line == 10000); - T_Ok(line_vm->state.address == pc); - T_Ok(line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + TestCheck(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); + TestCheck(line_vm->state.line == 10000); + TestCheck(line_vm->state.address == pc); + TestCheck(line_vm->new_line); } { - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(dw_line_vm_step(line_vm)); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(dw_line_vm_step(line_vm)); for EachIndex(i, line_addr_count/*first line is a noop*/-1) { - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->header.opcode_base < line_vm->opcode); - T_Ok(line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->header.opcode_base < line_vm->opcode); + TestCheck(line_vm->new_line); } - T_Ok(dw_line_vm_step(line_vm)); - T_Ok(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); - T_Ok(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); - T_Ok(line_vm->state.line == 1586); - T_Ok(line_vm->state.address == 1161); - T_Ok(line_vm->new_line); + TestCheck(dw_line_vm_step(line_vm)); + TestCheck(line_vm->opcode == DW_StdOpcode_ExtendedOpcode); + TestCheck(line_vm->ext_opcode == DW_ExtOpcode_EndSequence); + TestCheck(line_vm->state.line == 1586); + TestCheck(line_vm->state.address == 1161); + TestCheck(line_vm->new_line); } } -TEST(dwarf_writer) +Test(dwarf_writer) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); // info @@ -627,237 +627,237 @@ TEST(dwarf_writer) // validate the writer - T_Ok(writer->current == 0); - T_Ok(writer->format == DW_Format_32Bit); - T_Ok(writer->cu_kind == DW_CompUnitKind_Compile); - T_Ok(writer->version == DW_Version_5); - T_Ok(writer->address_size == 8); - T_Ok(writer->abbrev_base_info_off == 8); - T_Ok(writer->fixups.count == 0); - T_Ok(writer->abbrev_id_map->count == 7); + TestCheck(writer->current == 0); + TestCheck(writer->format == DW_Format_32Bit); + TestCheck(writer->cu_kind == DW_CompUnitKind_Compile); + TestCheck(writer->version == DW_Version_5); + TestCheck(writer->address_size == 8); + TestCheck(writer->abbrev_base_info_off == 8); + TestCheck(writer->fixups.count == 0); + TestCheck(writer->abbrev_id_map->count == 7); DW_WriterTag *comp_unit_tag = writer->root; { - T_Ok(comp_unit_tag->kind == DW_TagKind_CompileUnit); - T_Ok(comp_unit_tag->next == 0); - T_Ok(comp_unit_tag->parent == 0); - T_Ok(comp_unit_tag->attrib_count == 5); - T_Ok(comp_unit_tag->abbrev_id == 1); - T_Ok(comp_unit_tag->info_off == 0xc); + TestCheck(comp_unit_tag->kind == DW_TagKind_CompileUnit); + TestCheck(comp_unit_tag->next == 0); + TestCheck(comp_unit_tag->parent == 0); + TestCheck(comp_unit_tag->attrib_count == 5); + TestCheck(comp_unit_tag->abbrev_id == 1); + TestCheck(comp_unit_tag->info_off == 0xc); DW_WriterAttrib *producer_attrib = comp_unit_tag->first_attrib; - T_Ok(producer_attrib->kind == DW_AttribKind_Producer); - T_Ok(producer_attrib->form.reader.kind == DW_Form_String); - T_Ok(str8_match(producer_attrib->form.writer.string, str8_lit("RAD DWARF WRITER"), 0)); + TestCheck(producer_attrib->kind == DW_AttribKind_Producer); + TestCheck(producer_attrib->form.reader.kind == DW_Form_String); + TestCheck(str8_match(producer_attrib->form.writer.string, str8_lit("RAD DWARF WRITER"), 0)); DW_WriterAttrib *language_attrib = producer_attrib->next; - T_Ok(language_attrib->kind == DW_AttribKind_Language); - T_Ok(language_attrib->form.reader.kind == DW_Form_Data1); - T_Ok(language_attrib->form.reader.data.size == 1); - T_Ok(*(U8 *)language_attrib->form.reader.data.str == DW_Language_C99); + TestCheck(language_attrib->kind == DW_AttribKind_Language); + TestCheck(language_attrib->form.reader.kind == DW_Form_Data1); + TestCheck(language_attrib->form.reader.data.size == 1); + TestCheck(*(U8 *)language_attrib->form.reader.data.str == DW_Language_C99); DW_WriterAttrib *use_utf8_attrib = language_attrib->next; - T_Ok(use_utf8_attrib->kind == DW_AttribKind_UseUtf8); - T_Ok(use_utf8_attrib->form.reader.kind == DW_Form_Flag); - T_Ok(use_utf8_attrib->form.reader.flag == 1); + TestCheck(use_utf8_attrib->kind == DW_AttribKind_UseUtf8); + TestCheck(use_utf8_attrib->form.reader.kind == DW_Form_Flag); + TestCheck(use_utf8_attrib->form.reader.flag == 1); } DW_WriterTag *char_type_tag = comp_unit_tag->first_child; { - T_Ok(char_type_tag->kind == DW_TagKind_BaseType); - T_Ok(char_type_tag->next != 0); - T_Ok(char_type_tag->parent == comp_unit_tag); - T_Ok(char_type_tag->attrib_count == 3); - T_Ok(char_type_tag->abbrev_id == 2); - T_Ok(char_type_tag->info_off == 0x30); - T_Ok(char_type_tag->first_attrib != char_type_tag->last_attrib); + TestCheck(char_type_tag->kind == DW_TagKind_BaseType); + TestCheck(char_type_tag->next != 0); + TestCheck(char_type_tag->parent == comp_unit_tag); + TestCheck(char_type_tag->attrib_count == 3); + TestCheck(char_type_tag->abbrev_id == 2); + TestCheck(char_type_tag->info_off == 0x30); + TestCheck(char_type_tag->first_attrib != char_type_tag->last_attrib); DW_WriterAttrib *byte_size_attrib = char_type_tag->first_attrib; - T_Ok(byte_size_attrib->kind == DW_AttribKind_ByteSize); - T_Ok(byte_size_attrib->form.reader.kind == DW_Form_Data1); - T_Ok(byte_size_attrib->form.reader.data.size == 1); - T_Ok(*(U8 *)byte_size_attrib->form.reader.data.str == 1); + TestCheck(byte_size_attrib->kind == DW_AttribKind_ByteSize); + TestCheck(byte_size_attrib->form.reader.kind == DW_Form_Data1); + TestCheck(byte_size_attrib->form.reader.data.size == 1); + TestCheck(*(U8 *)byte_size_attrib->form.reader.data.str == 1); DW_WriterAttrib *encoding_attrib = byte_size_attrib->next; - T_Ok(encoding_attrib->kind == DW_AttribKind_Encoding); - T_Ok(encoding_attrib->form.reader.kind == DW_Form_Data1); - T_Ok(encoding_attrib->form.reader.data.size == 1); - T_Ok(*(U8 *)encoding_attrib->form.reader.data.str == DW_ATE_SignedChar); + TestCheck(encoding_attrib->kind == DW_AttribKind_Encoding); + TestCheck(encoding_attrib->form.reader.kind == DW_Form_Data1); + TestCheck(encoding_attrib->form.reader.data.size == 1); + TestCheck(*(U8 *)encoding_attrib->form.reader.data.str == DW_ATE_SignedChar); DW_WriterAttrib *name_attrib = encoding_attrib->next; - T_Ok(name_attrib->kind == DW_AttribKind_Name); - T_Ok(name_attrib->form.reader.kind == DW_Form_String); - T_Ok(str8_match(name_attrib->form.reader.string, str8_lit("char"), 0)); + TestCheck(name_attrib->kind == DW_AttribKind_Name); + TestCheck(name_attrib->form.reader.kind == DW_Form_String); + TestCheck(str8_match(name_attrib->form.reader.string, str8_lit("char"), 0)); } DW_WriterTag *const_type_tag = char_type_tag->next; { - T_Ok(const_type_tag->kind == DW_TagKind_ConstType); - T_Ok(const_type_tag->next != 0); - T_Ok(const_type_tag->parent == comp_unit_tag); - T_Ok(const_type_tag->attrib_count == 1); - T_Ok(const_type_tag->abbrev_id == 3); - T_Ok(const_type_tag->info_off == 0x38); - T_Ok(const_type_tag->first_attrib && const_type_tag->first_attrib == const_type_tag->last_attrib); + TestCheck(const_type_tag->kind == DW_TagKind_ConstType); + TestCheck(const_type_tag->next != 0); + TestCheck(const_type_tag->parent == comp_unit_tag); + TestCheck(const_type_tag->attrib_count == 1); + TestCheck(const_type_tag->abbrev_id == 3); + TestCheck(const_type_tag->info_off == 0x38); + TestCheck(const_type_tag->first_attrib && const_type_tag->first_attrib == const_type_tag->last_attrib); DW_WriterAttrib *type_attrib = const_type_tag->first_attrib; - T_Ok(type_attrib->kind == DW_AttribKind_Type); - T_Ok(type_attrib->form.writer.kind == DW_WriterFormKind_Ref); - T_Ok(type_attrib->form.writer.ref == char_type_tag); + TestCheck(type_attrib->kind == DW_AttribKind_Type); + TestCheck(type_attrib->form.writer.kind == DW_WriterFormKind_Ref); + TestCheck(type_attrib->form.writer.ref == char_type_tag); } DW_WriterTag *dup_char_type_tag = const_type_tag->next; { - T_Ok(dup_char_type_tag->kind == DW_TagKind_BaseType); - T_Ok(dup_char_type_tag->next != 0); - T_Ok(dup_char_type_tag->parent == comp_unit_tag); - T_Ok(dup_char_type_tag->attrib_count == 3); - T_Ok(dup_char_type_tag->abbrev_id == 2); - T_Ok(dup_char_type_tag->info_off == 0x3a); - T_Ok(dup_char_type_tag->first_attrib != dup_char_type_tag->last_attrib); + TestCheck(dup_char_type_tag->kind == DW_TagKind_BaseType); + TestCheck(dup_char_type_tag->next != 0); + TestCheck(dup_char_type_tag->parent == comp_unit_tag); + TestCheck(dup_char_type_tag->attrib_count == 3); + TestCheck(dup_char_type_tag->abbrev_id == 2); + TestCheck(dup_char_type_tag->info_off == 0x3a); + TestCheck(dup_char_type_tag->first_attrib != dup_char_type_tag->last_attrib); DW_WriterAttrib *byte_size_attrib = dup_char_type_tag->first_attrib; - T_Ok(byte_size_attrib->kind == DW_AttribKind_ByteSize); - T_Ok(byte_size_attrib->form.reader.kind == DW_Form_Data1); - T_Ok(byte_size_attrib->form.reader.data.size == 1); - T_Ok(*(U8 *)byte_size_attrib->form.reader.data.str == 1); + TestCheck(byte_size_attrib->kind == DW_AttribKind_ByteSize); + TestCheck(byte_size_attrib->form.reader.kind == DW_Form_Data1); + TestCheck(byte_size_attrib->form.reader.data.size == 1); + TestCheck(*(U8 *)byte_size_attrib->form.reader.data.str == 1); DW_WriterAttrib *encoding_attrib = byte_size_attrib->next; - T_Ok(encoding_attrib->kind == DW_AttribKind_Encoding); - T_Ok(encoding_attrib->form.reader.kind == DW_Form_Data1); - T_Ok(encoding_attrib->form.reader.data.size == 1); - T_Ok(*(U8 *)encoding_attrib->form.reader.data.str == DW_ATE_SignedChar); + TestCheck(encoding_attrib->kind == DW_AttribKind_Encoding); + TestCheck(encoding_attrib->form.reader.kind == DW_Form_Data1); + TestCheck(encoding_attrib->form.reader.data.size == 1); + TestCheck(*(U8 *)encoding_attrib->form.reader.data.str == DW_ATE_SignedChar); DW_WriterAttrib *name_attrib = encoding_attrib->next; - T_Ok(name_attrib->kind == DW_AttribKind_Name); - T_Ok(name_attrib->form.reader.kind == DW_Form_String); - T_Ok(str8_match(name_attrib->form.reader.string, str8_lit("char"), 0)); + TestCheck(name_attrib->kind == DW_AttribKind_Name); + TestCheck(name_attrib->form.reader.kind == DW_Form_String); + TestCheck(str8_match(name_attrib->form.reader.string, str8_lit("char"), 0)); } DW_WriterTag *simple_struct_tag = dup_char_type_tag->next; { - T_Ok(simple_struct_tag->kind == DW_TagKind_StructureType); - T_Ok(simple_struct_tag->next != 0); - T_Ok(simple_struct_tag->parent == comp_unit_tag); - T_Ok(simple_struct_tag->attrib_count == 2); - T_Ok(simple_struct_tag->abbrev_id == 4); - T_Ok(simple_struct_tag->info_off == 0x42); + TestCheck(simple_struct_tag->kind == DW_TagKind_StructureType); + TestCheck(simple_struct_tag->next != 0); + TestCheck(simple_struct_tag->parent == comp_unit_tag); + TestCheck(simple_struct_tag->attrib_count == 2); + TestCheck(simple_struct_tag->abbrev_id == 4); + TestCheck(simple_struct_tag->info_off == 0x42); DW_WriterAttrib *simple_struct_name = simple_struct_tag->first_attrib; - T_Ok(simple_struct_name->kind == DW_AttribKind_Name); - T_Ok(simple_struct_name->form.reader.kind == DW_Form_String); - T_Ok(str8_match(simple_struct_name->form.reader.string, str8_lit("FooBar"), 0)); + TestCheck(simple_struct_name->kind == DW_AttribKind_Name); + TestCheck(simple_struct_name->form.reader.kind == DW_Form_String); + TestCheck(str8_match(simple_struct_name->form.reader.string, str8_lit("FooBar"), 0)); DW_WriterTag *m0_tag = simple_struct_tag->first_child; { - T_Ok(m0_tag->kind == DW_TagKind_Member); - T_Ok(m0_tag->parent == simple_struct_tag); - T_Ok(m0_tag->attrib_count == 3); - T_Ok(m0_tag->info_off == 0x4b); - T_Ok(m0_tag->abbrev_id == 5); + TestCheck(m0_tag->kind == DW_TagKind_Member); + TestCheck(m0_tag->parent == simple_struct_tag); + TestCheck(m0_tag->attrib_count == 3); + TestCheck(m0_tag->info_off == 0x4b); + TestCheck(m0_tag->abbrev_id == 5); DW_WriterAttrib *name = m0_tag->first_attrib; - T_Ok(name->kind == DW_AttribKind_Name); - T_Ok(name->form.reader.kind == DW_Form_String); - T_Ok(str8_match(name->form.reader.string, str8_lit("m0"), 0)); + TestCheck(name->kind == DW_AttribKind_Name); + TestCheck(name->form.reader.kind == DW_Form_String); + TestCheck(str8_match(name->form.reader.string, str8_lit("m0"), 0)); DW_WriterAttrib *type = name->next; - T_Ok(type->kind == DW_AttribKind_Type); - T_Ok(type->form.reader.kind == DW_Form_Ref1); - T_Ok(type->form.reader.ref == 0x30); + TestCheck(type->kind == DW_AttribKind_Type); + TestCheck(type->form.reader.kind == DW_Form_Ref1); + TestCheck(type->form.reader.ref == 0x30); DW_WriterAttrib *data_loc = type->next; - T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); - T_Ok(data_loc->form.reader.kind == DW_Form_Data1); - T_Ok(data_loc->form.reader.data.size == 1); - T_Ok(*(U8 *)data_loc->form.reader.data.str == 0); + TestCheck(data_loc->kind == DW_AttribKind_DataMemberLocation); + TestCheck(data_loc->form.reader.kind == DW_Form_Data1); + TestCheck(data_loc->form.reader.data.size == 1); + TestCheck(*(U8 *)data_loc->form.reader.data.str == 0); } DW_WriterTag *m1_tag = m0_tag->next; { - T_Ok(m1_tag->kind == DW_TagKind_Member); - T_Ok(m1_tag->parent == simple_struct_tag); - T_Ok(m1_tag->attrib_count == 4); - T_Ok(m1_tag->info_off == 0x51); - T_Ok(m1_tag->abbrev_id == 6); + TestCheck(m1_tag->kind == DW_TagKind_Member); + TestCheck(m1_tag->parent == simple_struct_tag); + TestCheck(m1_tag->attrib_count == 4); + TestCheck(m1_tag->info_off == 0x51); + TestCheck(m1_tag->abbrev_id == 6); DW_WriterAttrib *name = m1_tag->first_attrib; - T_Ok(name->kind == DW_AttribKind_Name); - T_Ok(name->form.reader.kind == DW_Form_String); - T_Ok(str8_match(name->form.reader.string, str8_lit("m1"), 0)); + TestCheck(name->kind == DW_AttribKind_Name); + TestCheck(name->form.reader.kind == DW_Form_String); + TestCheck(str8_match(name->form.reader.string, str8_lit("m1"), 0)); DW_WriterAttrib *type = name->next; - T_Ok(type->kind == DW_AttribKind_Type); - T_Ok(type->form.reader.kind == DW_Form_Ref1); - T_Ok(type->form.reader.ref == 0x30); + TestCheck(type->kind == DW_AttribKind_Type); + TestCheck(type->form.reader.kind == DW_Form_Ref1); + TestCheck(type->form.reader.ref == 0x30); DW_WriterAttrib *data_loc = type->next; - T_Ok(data_loc->kind == DW_AttribKind_DataMemberLocation); - T_Ok(data_loc->form.reader.kind == DW_Form_Data1); - T_Ok(data_loc->form.reader.data.size == 1); - T_Ok(*(U8 *)data_loc->form.reader.data.str == 10); + TestCheck(data_loc->kind == DW_AttribKind_DataMemberLocation); + TestCheck(data_loc->form.reader.kind == DW_Form_Data1); + TestCheck(data_loc->form.reader.data.size == 1); + TestCheck(*(U8 *)data_loc->form.reader.data.str == 10); DW_WriterAttrib *byte_size = data_loc->next; - T_Ok(byte_size->kind == DW_AttribKind_ByteSize); - T_Ok(byte_size->form.reader.kind == DW_Form_ImplicitConst); - T_Ok(byte_size->form.reader.implicit_const == 123); + TestCheck(byte_size->kind == DW_AttribKind_ByteSize); + TestCheck(byte_size->form.reader.kind == DW_Form_ImplicitConst); + TestCheck(byte_size->form.reader.implicit_const == 123); } } DW_WriterTag *main_tag = simple_struct_tag->next; - T_Ok(main_tag->next == 0); - T_Ok(main_tag->kind == DW_TagKind_SubProgram); - T_Ok(main_tag->parent == main_tag->parent); - T_Ok(main_tag->abbrev_id == 7); + TestCheck(main_tag->next == 0); + TestCheck(main_tag->kind == DW_TagKind_SubProgram); + TestCheck(main_tag->parent == main_tag->parent); + TestCheck(main_tag->abbrev_id == 7); { DW_WriterAttrib *external = main_tag->first_attrib; - T_Ok(external->kind == DW_AttribKind_External); - T_Ok(external->form.reader.kind == DW_Form_Flag); - T_Ok(external->form.reader.flag); + TestCheck(external->kind == DW_AttribKind_External); + TestCheck(external->form.reader.kind == DW_Form_Flag); + TestCheck(external->form.reader.flag); DW_WriterAttrib *prototyped = external->next; - T_Ok(prototyped->kind == DW_AttribKind_Prototyped); - T_Ok(prototyped->form.reader.kind == DW_Form_Flag); - T_Ok(prototyped->form.reader.flag); + TestCheck(prototyped->kind == DW_AttribKind_Prototyped); + TestCheck(prototyped->form.reader.kind == DW_Form_Flag); + TestCheck(prototyped->form.reader.flag); DW_WriterAttrib *low_pc = prototyped->next; - T_Ok(low_pc->kind == DW_AttribKind_LowPc); - T_Ok(low_pc->form.reader.kind == DW_Form_Addr); - T_Ok(low_pc->form.reader.addr.size == sizeof(U64)); - T_Ok(*(U64 *)low_pc->form.reader.addr.str == 0x140001000); + TestCheck(low_pc->kind == DW_AttribKind_LowPc); + TestCheck(low_pc->form.reader.kind == DW_Form_Addr); + TestCheck(low_pc->form.reader.addr.size == sizeof(U64)); + TestCheck(*(U64 *)low_pc->form.reader.addr.str == 0x140001000); DW_WriterAttrib *high_pc = low_pc->next; - T_Ok(high_pc->kind == DW_AttribKind_HighPc); - T_Ok(high_pc->form.reader.kind == DW_Form_Addr); - T_Ok(high_pc->form.reader.addr.size == sizeof(U64)); - T_Ok(*(U64 *)high_pc->form.reader.addr.str == 0x140001004); + TestCheck(high_pc->kind == DW_AttribKind_HighPc); + TestCheck(high_pc->form.reader.kind == DW_Form_Addr); + TestCheck(high_pc->form.reader.addr.size == sizeof(U64)); + TestCheck(*(U64 *)high_pc->form.reader.addr.str == 0x140001004); DW_WriterAttrib *name = high_pc->next; - T_Ok(name->kind == DW_AttribKind_Name); - T_Ok(name->form.reader.kind == DW_Form_String); - T_Ok(str8_match(name->form.reader.string, str8_lit("main"), 0)); + TestCheck(name->kind == DW_AttribKind_Name); + TestCheck(name->form.reader.kind == DW_Form_String); + TestCheck(str8_match(name->form.reader.string, str8_lit("main"), 0)); DW_WriterAttrib *type = name->next; - T_Ok(type->kind == DW_AttribKind_Type); - T_Ok(type->form.reader.kind == DW_Form_Ref1); - T_Ok(type->form.reader.ref == simple_struct_tag->info_off); + TestCheck(type->kind == DW_AttribKind_Type); + TestCheck(type->form.reader.kind == DW_Form_Ref1); + TestCheck(type->form.reader.ref == simple_struct_tag->info_off); DW_WriterAttrib *frame_base = type->next; - T_Ok(frame_base->kind == DW_AttribKind_FrameBase); - T_Ok(frame_base->form.reader.kind == DW_Form_ExprLoc); + TestCheck(frame_base->kind == DW_AttribKind_FrameBase); + TestCheck(frame_base->form.reader.kind == DW_Form_ExprLoc); DW_Expr frame_base_expr = dw_expr_from_data(arena, writer->format, writer->address_size, frame_base->form.reader.exprloc); - T_Ok(frame_base_expr.count == 1); - T_Ok(frame_base_expr.first->opcode == DW_ExprOp_Reg7); - T_Ok(frame_base_expr.first->operands == 0); - T_Ok(frame_base_expr.first->size == 1); - T_Ok(frame_base_expr.first->next == 0); - T_Ok(frame_base_expr.first->prev == 0); + TestCheck(frame_base_expr.count == 1); + TestCheck(frame_base_expr.first->opcode == DW_ExprOp_Reg7); + TestCheck(frame_base_expr.first->operands == 0); + TestCheck(frame_base_expr.first->size == 1); + TestCheck(frame_base_expr.first->next == 0); + TestCheck(frame_base_expr.first->prev == 0); } dw_writer_end(&writer); } -TEST(value_in_register) +Test(value_in_register) { // setup register context X64_RegBlock regs = {0}; @@ -877,12 +877,12 @@ TEST(value_in_register) DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, ®s, 0, 0, &expr_value); // validate eval result - T_Ok(expr_eval == DW_ExprEvalResult_Ok); - T_Ok(expr_value.type == DW_ExprValueType_U64); - T_Ok(expr_value.u64 == value); + TestCheck(expr_eval == DW_ExprEvalResult_Ok); + TestCheck(expr_value.type == DW_ExprValueType_U64); + TestCheck(expr_value.u64 == value); } -TEST(value_in_x_register) +Test(value_in_x_register) { // setup register context X64_RegBlock regs = {0}; @@ -902,12 +902,12 @@ TEST(value_in_x_register) DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, ®s, 0, 0, &expr_value); // validate eval result - T_Ok(expr_eval == DW_ExprEvalResult_Ok); - T_Ok(expr_value.type == DW_ExprValueType_U64); - T_Ok(expr_value.u64 == value); + TestCheck(expr_eval == DW_ExprEvalResult_Ok); + TestCheck(expr_value.type == DW_ExprValueType_U64); + TestCheck(expr_value.u64 == value); } -TEST(address_of_value) +Test(address_of_value) { // compile a simple program which reads address U64 addr = 0xdeadbeef; @@ -920,12 +920,12 @@ TEST(address_of_value) DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, 0, 0, &expr_value); // validate eval result - T_Ok(expr_eval == DW_ExprEvalResult_Ok); - T_Ok(expr_value.type == DW_ExprValueType_Addr); - T_Ok(expr_value.addr == addr); + TestCheck(expr_eval == DW_ExprEvalResult_Ok); + TestCheck(expr_value.type == DW_ExprValueType_Addr); + TestCheck(expr_value.addr == addr); } -TEST(register_relative_variable) +Test(register_relative_variable) { ARCH_Info *arch_info = arch_info_from_arch(Arch_x64); @@ -945,12 +945,12 @@ TEST(register_relative_variable) DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, ®s, 0, 0, &expr_value); // validate eval result - T_Ok(expr_eval == DW_ExprEvalResult_Ok); - T_Ok(expr_value.type == DW_ExprValueType_Addr); - T_Ok(expr_value.addr == (1 + 44)); + TestCheck(expr_eval == DW_ExprEvalResult_Ok); + TestCheck(expr_value.type == DW_ExprValueType_Addr); + TestCheck(expr_value.addr == (1 + 44)); } -TEST(frame_relative_variable) +Test(frame_relative_variable) { DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(FBReg), DW_ExprEnc_SLEB128(-50) }; String8 expr_data = dw_encode_expr(arena, Arch_x64, DW_Format_64Bit, expr_encs, ArrayCount(expr_encs)); @@ -960,9 +960,9 @@ TEST(frame_relative_variable) DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, frame_base, 0, 0, max_U64, expr, 0, 0, 0, &expr_value); - T_Ok(expr_eval == DW_ExprEvalResult_Ok); - T_Ok(expr_value.type == DW_ExprValueType_Addr); - T_Ok(expr_value.addr == frame_base -50); + TestCheck(expr_eval == DW_ExprEvalResult_Ok); + TestCheck(expr_value.type == DW_ExprValueType_Addr); + TestCheck(expr_value.addr == frame_base -50); } internal @@ -972,7 +972,7 @@ MACHINE_OP_MEM_READ(t_machine_op_mem_read) return MachineOpResult_Ok; } -TEST(call_by_reference) +Test(call_by_reference) { U8 *memory = push_array(arena, U8, 128); U64 value = 0xc0ffee; @@ -992,12 +992,12 @@ TEST(call_by_reference) DW_ExprValue expr_value = { 0 }; DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, ®s, t_machine_op_mem_read, 0, &expr_value); - T_Ok(expr_value.type == DW_ExprValueType_Generic); - T_Ok(expr_value.generic.size == sizeof(U64)); - T_Ok(*(U64 *)expr_value.generic.str == value); + TestCheck(expr_value.type == DW_ExprValueType_Generic); + TestCheck(expr_value.generic.size == sizeof(U64)); + TestCheck(*(U64 *)expr_value.generic.str == value); } -TEST(plus_uconst) +Test(plus_uconst) { U64 struct_addr = 0x123; DW_ExprEnc expr_encs[] = { DW_ExprEnc_Op(Addr), DW_ExprEnc_Addr(struct_addr), DW_ExprEnc_Op(PlusUConst), DW_ExprEnc_ULEB128(4) }; @@ -1007,12 +1007,12 @@ TEST(plus_uconst) DW_ExprValue expr_value; DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, 0, t_machine_op_mem_read, 0, &expr_value); - T_Ok(expr_value.type == DW_ExprValueType_Addr); - T_Ok(expr_value.addr == 0x123 + 4); + TestCheck(expr_value.type == DW_ExprValueType_Addr); + TestCheck(expr_value.addr == 0x123 + 4); } #if 0 -TEST(reg_split_spill) +Test(reg_split_spill) { // setup register context X64_RegBlock regs = {0}; @@ -1037,4 +1037,3 @@ TEST(reg_split_spill) DW_ExprEvalResult expr_eval = dw_eval_expr(arena, Arch_x64, DW_Format_64Bit, 0, 0, 0, max_U64, expr, regs_read_dwarf_x64, ®s, 0, 0, &expr_value); } #endif - diff --git a/src/torture/torture_radlink.c b/src/linker/tests/linker_tests.c similarity index 99% rename from src/torture/torture_radlink.c rename to src/linker/tests/linker_tests.c index f7ec015f..0b0e5e0d 100644 --- a/src/torture/torture_radlink.c +++ b/src/linker/tests/linker_tests.c @@ -644,14 +644,14 @@ TEST(merge) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.test entry.obj test.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_CircularMerge); } // circular merge with extra link t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.data /merge:.data=.test entry.obj test.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_CircularMerge); } @@ -677,14 +677,14 @@ TEST(merge) // illegal merge with .reloc t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.reloc entry.obj test.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_IllegalSectionMerge); } // illegal merge with .rsrc t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /merge:.test=.rsrc entry.obj test.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_IllegalSectionMerge); } @@ -1784,7 +1784,7 @@ TEST(abs_vs_common) if (g_last_exit_code == 0) { // TODO: validate that linker issues multiply defined symbol error t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe common.obj abs.obj entry.obj"); - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } else { T_Ok(g_last_exit_code != 0); @@ -2092,7 +2092,7 @@ TEST(undef_reloc_section) T_Ok(t_write_file(str8_lit("sec_defn.obj"), sec_defn_obj)); t_invoke_linkerf("/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj"); - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_SectRefsDiscardedMemory); } else { T_Ok(g_last_exit_code != 0); @@ -2420,7 +2420,7 @@ TEST(base_relocs) // it is illegal to merge .reloc with other sections t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe /merge:.reloc=.rdata main.obj func.obj"); - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_IllegalSectionMerge); } else { T_Ok(g_last_exit_code != 0); @@ -2428,7 +2428,7 @@ TEST(base_relocs) // the other way around is illegal too t_invoke_linkerf("/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe /merge:.rdata=.reloc main.obj func.obj"); - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_IllegalSectionMerge); } else { T_Ok(g_last_exit_code != 0); @@ -2610,7 +2610,7 @@ TEST(import_export) T_Ok(g_last_exit_code == 0); // validate export table in export.dll - if (t_id_linker() == T_Linker_RAD) { + if (t_id_linker() == Linker_radlink) { // validate export table in export.dll { String8 dll = t_read_file(arena, str8_lit("export.dll")); @@ -2905,7 +2905,7 @@ TEST(comdat_no_duplicates) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe a.obj entry.obj"); T_Ok(g_last_exit_code == 0); @@ -3001,7 +3001,7 @@ TEST(comdat_same_size) t_invoke_linkerf("/subsystem:console /entry:entry /out:b.exe a.obj b.obj c.obj entry.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_MultiplyDefinedSymbol); } } TEST(comdat_exact_match) @@ -3313,7 +3313,7 @@ TEST(comdat_associative_loop) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe loop.obj entry.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_AssociativeLoop); } + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_AssociativeLoop); } } TEST(comdat_associative_non_comdat) @@ -3430,7 +3430,7 @@ TEST(comdat_associative_out_of_bounds) t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_IllData); } + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_IllData); } } TEST(comdat_with_offset) @@ -3790,7 +3790,7 @@ TEST(include) // test unresolved include t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /include:ewq entry.obj"); T_Ok(g_last_exit_code != 0); - if (t_id_linker() == T_Linker_RAD) { T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } + if (t_id_linker() == Linker_radlink) { T_Ok(g_last_exit_code == LNK_Error_UnresolvedSymbol); } } TEST(communal_var_vs_regular) @@ -4811,7 +4811,7 @@ TEST(fail_if_mismatch) T_Ok(t_write_file(str8_lit("a2.obj"), a2)); t_invoke_linkerf("entry.obj a1.obj a2.obj /entry:entry /subsystem:console /out:a2.exe"); - if (t_id_linker() == T_Linker_RAD) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); + if (t_id_linker() == Linker_radlink) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); else T_Ok(g_last_exit_code != 0); // ------------------------------------------------------------ @@ -4829,14 +4829,14 @@ TEST(fail_if_mismatch) T_Ok(t_write_file(str8_lit("conf_dirs.obj"), conf_dirs)); t_invoke_linkerf("entry.obj conf_dirs.obj /entry:entry /subsystem:console /out:conf_dirs.exe"); - if (t_id_linker() == T_Linker_RAD) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); + if (t_id_linker() == Linker_radlink) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); else T_Ok(g_last_exit_code != 0); // ------------------------------------------------------------ // passing switch on command line t_invoke_linkerf("entry.obj a1.obj /FAILIFMISMATCH:a=2 /out:cmddir.exe"); - if (t_id_linker() == T_Linker_RAD) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); + if (t_id_linker() == Linker_radlink) T_Ok(g_last_exit_code == LNK_Error_FailIfMismatch); else T_Ok(g_last_exit_code != 0); } diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index ce11d0eb..0dc09903 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -127,6 +127,17 @@ lnx_thread_entry_point(void *ptr) return 0; } +//////////////////////////////// +//~ rjf: @per_os_impl Debugger Attachment Checking + +internal B32 +debugger_is_attached(void) +{ + B32 result = 0; + // TODO(rjf) + return result; +} + //////////////////////////////// //~ rjf: @per_os_impl Platform Time Functions @@ -1292,13 +1303,13 @@ internal B32 process_join(Process process, U64 endt_us, U64 *exit_code_out) { B32 result = 0; - + pid_t pid = (pid_t)process.u64[0]; for(;;) { int status = 0; pid_t wait_result = LNX_RETRY_ON_EINTR(waitpid(pid, &status, (endt_us == max_U64) ? 0 : WNOHANG)); - + if((wait_result == pid) && (WIFEXITED(status) || WIFSIGNALED(status))) { result = 1; @@ -1309,13 +1320,13 @@ process_join(Process process, U64 endt_us, U64 *exit_code_out) } break; } - + if(wait_result == -1) { break; } if(endt_us == 0) { break; } - + U64 now_us = now_time_us(); if(now_us >= endt_us) { break; } - + U64 left_us = endt_us - now_us; U64 sleep_us = Min(left_us, Thousand(1)); usleep((useconds_t)sleep_us); diff --git a/src/torture/torture_md.c b/src/mdesk/tests/mdesk_tests.c similarity index 96% rename from src/torture/torture_md.c rename to src/mdesk/tests/mdesk_tests.c index 5eabb69f..8c3b6a13 100644 --- a/src/torture/torture_md.c +++ b/src/mdesk/tests/mdesk_tests.c @@ -1,6 +1,7 @@ -#define T_Group "MD" +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) -SKIP(md_tokenizer) +SkippedTest(md_tokenizer) { MD_TokenizeResult result; @@ -126,5 +127,3 @@ SKIP(md_tokenizer) T_Ok(result.tokens.v[1].flags & MD_TokenFlag_Identifier); } } - -#undef T_Group diff --git a/src/torture/dbg_tests/basic_stepping_test.c b/src/mule/old_test_debuggees/basic_stepping_test.c similarity index 100% rename from src/torture/dbg_tests/basic_stepping_test.c rename to src/mule/old_test_debuggees/basic_stepping_test.c diff --git a/src/torture/dbg_tests/gnu_sysv_hash.c b/src/mule/old_test_debuggees/gnu_sysv_hash.c similarity index 100% rename from src/torture/dbg_tests/gnu_sysv_hash.c rename to src/mule/old_test_debuggees/gnu_sysv_hash.c diff --git a/src/torture/dbg_tests/mule.cpp b/src/mule/old_test_debuggees/mule.cpp similarity index 100% rename from src/torture/dbg_tests/mule.cpp rename to src/mule/old_test_debuggees/mule.cpp diff --git a/src/torture/dbg_tests/step_into_for_goto.c b/src/mule/old_test_debuggees/step_into_for_goto.c similarity index 100% rename from src/torture/dbg_tests/step_into_for_goto.c rename to src/mule/old_test_debuggees/step_into_for_goto.c diff --git a/src/torture/dbg_tests/step_into_lazy_module_func.c b/src/mule/old_test_debuggees/step_into_lazy_module_func.c similarity index 100% rename from src/torture/dbg_tests/step_into_lazy_module_func.c rename to src/mule/old_test_debuggees/step_into_lazy_module_func.c diff --git a/src/torture/dbg_tests/step_into_static_module_func.c b/src/mule/old_test_debuggees/step_into_static_module_func.c similarity index 95% rename from src/torture/dbg_tests/step_into_static_module_func.c rename to src/mule/old_test_debuggees/step_into_static_module_func.c index 0c3f4937..f261122a 100644 --- a/src/torture/dbg_tests/step_into_static_module_func.c +++ b/src/mule/old_test_debuggees/step_into_static_module_func.c @@ -1,37 +1,37 @@ -/// test: { -/// windows: { -/// compile: "/Od /Z7 /c main.c module.c" -/// link: "/fixed /debug:full /dll module.obj" -/// link: "/fixed /debug:full module.lib main.obj /out:main.exe /incremental:no" -/// launch: "main.exe" -/// } -/// linux: { -/// compile: "-O0 -g module.c -fPIC -shared -o libmodule.so" -/// compile: "-O0 -g main.c -L. -lmodule -o main -Wl,-rpath,%CWD%,-z,now -fno-plt" -/// launch: "./main" -/// } -/// } -/// - -/// file: "module.c" - -#if _WIN32 -__declspec(dllexport) -#endif -int foo(int a) -{ /// 3: at - return a + 1; -} - -/// file: "main.c" - -#if _WIN32 -__declspec(dllimport) -#endif -int foo(); - -int main() -{ /// 1: { step_into, at, step_over } - foo(123); /// 2: { at, step_into } -} - +/// test: { +/// windows: { +/// compile: "/Od /Z7 /c main.c module.c" +/// link: "/fixed /debug:full /dll module.obj" +/// link: "/fixed /debug:full module.lib main.obj /out:main.exe /incremental:no" +/// launch: "main.exe" +/// } +/// linux: { +/// compile: "-O0 -g module.c -fPIC -shared -o libmodule.so" +/// compile: "-O0 -g main.c -L. -lmodule -o main -Wl,-rpath,%CWD%,-z,now -fno-plt" +/// launch: "./main" +/// } +/// } +/// + +/// file: "module.c" + +#if _WIN32 +__declspec(dllexport) +#endif +int foo(int a) +{ /// 3: at + return a + 1; +} + +/// file: "main.c" + +#if _WIN32 +__declspec(dllimport) +#endif +int foo(); + +int main() +{ /// 1: { step_into, at, step_over } + foo(123); /// 2: { at, step_into } +} + diff --git a/src/torture/torture_dbg.c b/src/raddbg/tests/raddbg_tests.c similarity index 83% rename from src/torture/torture_dbg.c rename to src/raddbg/tests/raddbg_tests.c index 9c23b219..4dcca5f1 100644 --- a/src/torture/torture_dbg.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -1,6 +1,207 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +// IPC Controller + +typedef struct +{ + B32 running; + U64 run_gen; + U64 ip; + Arch arch; + U64 vaddr_min; + U64 vaddr_max; + U64 ip_vaddr; + U64 sp_base; + U64 tls_root; + U64 tls_index; + U64 tls_offset; + U64 timestamp; + U64 exception_code; + U64 bp_flags; + String8 string; + OperatingSystem target_os; + U64 tls_model; + String8 stop_cause; +} T_DbgState; + +typedef struct +{ + String8 file_path; + TxtPt pt; + Rng1U64 voff_range; +} T_DbgLine; + +typedef struct +{ + U64 count; + T_DbgLine *v; +} T_DbgLineArray; + +typedef struct +{ + String8 expr; + String8 value; + String8 type; + String8 error; +} T_Eval; + +//////////////////////////////// +// Dbg Script + +#define T_DbgScriptCmdKind_XList \ +X(Breakpoint, "bp") \ +X(ClearBreakpoints, "bp_clear") \ +X(Halt, "halt") \ +X(Run, "run") \ +X(RunToLine, "run_to_line") \ +X(StepOver, "step_over") \ +X(StepInto, "step_into") \ +X(StepOut, "step_out") \ +X(StepOverInst, "step_over_inst") \ +X(StepIntoInst, "step_over_inst") \ +X(StepOverLine, "step_over_line") \ +X(StepIntoLine, "step_into_line") \ +X(KillAll, "kll_all") \ +X(At, "at") \ +X(Eval, "eval") + +typedef enum +{ + T_DbgScriptCmdKind_Null, +#define X(n,...) T_DbgScriptCmdKind_##n, + T_DbgScriptCmdKind_XList +#undef X + T_DbgScriptCmdKind_Count +} T_DbgScriptCmdKind; + +#define T_DbgScriptDirectiveKind_XList \ +X(Compile, "compile") \ +X(Link, "link") \ +X(Launch, "launch") \ +X(Skip, "skip") + +typedef enum +{ + T_DbgScriptDirectiveKind_Null, +#define X(q,w) T_DbgScriptDirectiveKind_##q, + T_DbgScriptDirectiveKind_XList +#undef X + T_DbgScriptDirectiveKind_Count, +} T_DbgScriptDirectiveKind; + +typedef struct T_DbgScriptFile +{ + struct T_DbgScriptFile *next; + String8 path; + String8 source; + TxtPt pt; +} T_DbgScriptFile; + +typedef struct +{ + U64 count; + T_DbgScriptFile *first; + T_DbgScriptFile *last; +} T_DbgScriptFileList; + +typedef struct T_DbgScriptCmd +{ + struct T_DbgScriptCmd *next; + T_DbgScriptCmdKind kind; + TxtPt pt; + S64 at_delta; +} T_DbgScriptCmd; + +typedef struct T_DbgScriptProgram +{ + TxtPt pt; + U64 order; + OperatingSystem os; + T_DbgScriptFile *file; + U64 count; + T_DbgScriptCmd *first; + T_DbgScriptCmd *last; + struct T_DbgScriptProgram *next; +} T_DbgScriptProgram; + +typedef struct +{ + U64 count; + T_DbgScriptProgram *first; + T_DbgScriptProgram *last; +} T_DbgScriptProgramList; + +typedef struct T_DbgScriptDirective +{ + struct T_DbgScriptDirective *next; + T_DbgScriptDirectiveKind kind; + TxtPt pt; + String8 args; + union { + struct { + Compiler cc; + } compile; + }; +} T_DbgScriptDirective; + +typedef struct +{ + U64 count; + T_DbgScriptDirective *first; + T_DbgScriptDirective *last; +} T_DbgScriptDirectiveList; + +typedef struct +{ + String8 file_path; + T_DbgScriptDirectiveList directives[OperatingSystem_COUNT][T_DbgScriptDirectiveKind_Count]; + T_DbgScriptFileList files; + U64 program_count; + T_DbgScriptProgram **programs; + B32 skip; +} T_DbgScript; + + +//////////////////////////////// +// IPC Controller + +// error helper +internal void t_errorf_md(String8 file_name, String8 source, MD_Node *n, char *fmt, ...); + +// reply parse helpers +internal B32 t_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out); +internal B32 t_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out); +internal B32 t_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out); +internal B32 t_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out); +#define t_ipc_parse_int(n, c, ptr) t_ipc_parse_int_(n, c, sizeof(*ptr), ptr) + +// debugger commands +internal B32 t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out); +internal B32 t_dbg_send_cmdf(U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out, char *fmt, ...); +internal T_DbgState * t_dbg_state(Arena *arena, U64 timeout_us); +internal B32 t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_us); +internal String8 t_dbg_value_from_expr(Arena *arena, String8 expr); +internal String8 t_dbg_value_from_exprf(Arena *arena, char *fmt, ...); +internal B32 t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us); +internal B32 t_dbg_ping(U64 timeout_us); +internal B32 t_dbg_bp_add_line(String8 file, U64 line); +internal B32 t_dbg_bp_add_func(String8 func_name); +internal B32 t_dbg_bp_add_addr(U64 addr); +internal B32 t_dbg_launch(String8 cmdline, U64 timeout_us); +internal B32 t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out); + +//////////////////////////////// +// Dbg Script + +internal String8 t_string_from_dbg_script_cmd_kind(T_DbgScriptCmdKind v); +internal T_DbgScriptCmdKind t_dbg_script_cmd_kind_from_string(String8 cmd); +internal B32 t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript *script_out); +internal B32 t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us); +internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path); + + #define T_Dbg_DefaultTimeout TIMEOUT_SEC(5) extern B32 g_stop_on_first_fail_or_crash; @@ -119,7 +320,7 @@ t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, MD_ParseResult * // parse reply Arena *a = reply_arena ? reply_arena : scratch.arena; String8 reply_text = str8_copy(a, g_output); - + t_infof("IPC-Reply: \"%S\"\n", reply_text); MD_ParseResult reply = md_parse_from_text(a, str8_lit("ipc_reply"), reply_text); @@ -153,13 +354,13 @@ internal T_DbgState * t_dbg_state(Arena *arena, U64 timeout_us) { Temp scratch = scratch_begin(&arena, 1); - + T_DbgState *result = 0; // send status request MD_ParseResult reply = {0}; if ( ! t_dbg_send_cmd(str8_lit("state"), timeout_us, arena, &reply)) { goto exit; } - + // parse reply MD_Node *state_md = md_child_from_string(reply.root, str8_lit("state"), 0); MD_Node *stop_event_md = md_child_from_string(state_md, str8_lit("stop_event"), 0); @@ -186,14 +387,14 @@ t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_u // send line map request MD_ParseResult reply = {0}; if(!t_dbg_send_cmdf(timeout_us, arena, &reply, "line_from_vaddr 0x%llx", vaddr)) { goto exit; } - + // parse reply MD_Node *lines_md = md_child_from_string(reply.root, str8_lit("lines"), 0); - + typedef struct Node { struct Node *next; T_DbgLine v; } Node; Node *first_line = 0, *last_line = 0; U64 line_count = 0; - + for MD_EachNode(n, lines_md->first) { T_DbgLine line = {0}; if ( ! t_ipc_parse_string(n, str8_lit("file_path"), &line.file_path)) { t_infof("INFO: 'lines' is missing 'file_path'\n"); goto exit; } @@ -201,13 +402,13 @@ t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_u if ( ! t_ipc_parse_int (n, str8_lit("column_num"), &line.pt.column)) { t_infof("INFO: 'lines' is missing 'column_num'\n"); goto exit; } if ( ! t_ipc_parse_int (n, str8_lit("voff_range_min"), &line.voff_range.min)) { t_infof("INFO: 'lines' is missing 'voff_range_min'\n"); goto exit; } if ( ! t_ipc_parse_int (n, str8_lit("voff_range_max"), &line.voff_range.max)) { t_infof("INFO: 'lines' is missing 'voff_range_max'\n"); goto exit; } - + Node *n = push_array(scratch.arena, Node, 1); n->v = line; SLLQueuePush(first_line, last_line, n); line_count += 1; } - + if (lines_out && line_count > 0) { lines_out->count = 0; lines_out->v = push_array(arena, T_DbgLine, line_count); @@ -479,9 +680,9 @@ internal B32 t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript *script_out) { Temp scratch = scratch_begin(&arena, 1); - + B32 is_ok = 0; - + T_DbgScript script = { .file_path = push_str8_copy(arena, file_path) }; // parse out mdesk out of the comments @@ -489,41 +690,41 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript MD_TokenChunkList annot_chunks = {0}; for EachIndex(token_idx, source_tokens.tokens.count) { MD_Token source_token = source_tokens.tokens.v[token_idx]; - + // skip non-comment tokens if (~source_token.flags & MD_TokenFlag_Comment) { continue; } - + // read token string String8 source_token_string = str8_substr(source, source_token.range); - + if (str8_match_wildcard(source_token_string, str8_lit("*///*"), 0)) { - + // drop comment prefix String8 raw_annots = str8_skip(str8_skip_chop_whitespace(source_token_string), 3); - + // parse annotations MD_TokenizeResult annot_parse = md_tokenize_from_text(scratch.arena, raw_annots); - + for EachIndex(i, annot_parse.tokens.count) { MD_Token annot_token = annot_parse.tokens.v[i]; - + // adjust token range so they point back into the source file annot_token.range = shift_1u64(annot_token.range, (U64)(raw_annots.str - source.str)); - + // append annotation token md_token_chunk_list_push(scratch.arena, &annot_chunks, 4096, annot_token); } - + // append new line token MD_Token newline_token = md_token_make(r1u64(source_token.range.max, source_token.range.max), MD_TokenFlag_Newline); md_token_chunk_list_push(scratch.arena, &annot_chunks, 4096, newline_token); } } - + // script annotations -> mdesk tree MD_TokenArray annot_tokens = md_token_array_from_chunk_list(scratch.arena, &annot_chunks); MD_ParseResult script_parse = md_parse_from_text_tokens(scratch.arena, file_path, source, annot_tokens); - + // was parse ok? -> error if (script_parse.msgs.worst_message_kind >= MD_MsgKind_Error) { t_errorf("ERROR: cannot tokenize mdesk file: \"%S\"\n", file_path); @@ -531,11 +732,11 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript String8 msg_kind_string = {0}; switch(msg->kind) { - default:{}break; - case MD_MsgKind_Note: {msg_kind_string = str8_lit("note");}break; - case MD_MsgKind_Warning: {msg_kind_string = str8_lit("warning");}break; - case MD_MsgKind_Error: {msg_kind_string = str8_lit("error");}break; - case MD_MsgKind_FatalError: {msg_kind_string = str8_lit("fatal error");}break; + default:{}break; + case MD_MsgKind_Note: {msg_kind_string = str8_lit("note");}break; + case MD_MsgKind_Warning: {msg_kind_string = str8_lit("warning");}break; + case MD_MsgKind_Error: {msg_kind_string = str8_lit("error");}break; + case MD_MsgKind_FatalError: {msg_kind_string = str8_lit("fatal error");}break; } TxtPt pt = mg_txt_pt_from_string_off(source, msg->node->src_offset); String8 loc = push_str8f(scratch.arena, "%S:%I64d:%I64d", file_path, pt.line, pt.column); @@ -543,38 +744,38 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript } goto exit; } - + // @test: { // first child node of the root must be a test header MD_Node *test = script_parse.root->first; - + // is node test? -> error if ( ! str8_matchi(test->string, str8_lit("test"))) { t_errorf("ERROR: %S: missing test header\n", file_path); goto exit; } - + for MD_EachNode(n, test->first) { OperatingSystem os = operating_system_from_string(n->string); - + // is OS string correct? -> error if (os == OperatingSystem_Null && n->string.size > 0) { t_errorf_md(file_path, source, n, "test is defined for unknown os: \"%S\"\n", n->string); goto exit; } - + for MD_EachNode(field, n->first) { // define table for mapping string to a directive kind struct { T_DbgScriptDirectiveKind kind; String8 string; } dir_string_map[] = { - #define X(q,w) { T_DbgScriptDirectiveKind_##q, str8_lit(w) }, +#define X(q,w) { T_DbgScriptDirectiveKind_##q, str8_lit(w) }, T_DbgScriptDirectiveKind_XList - #undef X +#undef X }; - + // string -> directive T_DbgScriptDirectiveKind kind = T_DbgScriptDirectiveKind_Null; for EachElement(i, dir_string_map) { @@ -583,18 +784,18 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript break; } } - + // was directive found? -> error if (kind == T_DbgScriptDirectiveKind_Null) { t_errorf_md(file_path, source, n, "unknown field in test header \"%S\"\n", field->string); goto exit; } - + // alloc directive node T_DbgScriptDirective *dir = push_array(arena, T_DbgScriptDirective, 1); dir->kind = kind; dir->pt = mg_txt_pt_from_string_off(source, field->src_offset); - + // TODO: collapse if (field->flags & MD_NodeFlag_HasBraceLeft) { // walk each sub-field of the MD node, and find nodes for the directive @@ -607,9 +808,9 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript t_errorf_md(file_path, source, sub_field, "value of CC must be a string literal e.g. CC: \"clang\"\n"); goto exit; } - - if (str8_matchi(cc->string, str8_lit("clang"))) { dir->compile.cc = T_Compiler_Clang; } - else if (str8_matchi(cc->string, str8_lit("cl"))) { dir->compile.cc = T_Compiler_Cl; } + + if (str8_matchi(cc->string, str8_lit("clang"))) { dir->compile.cc = Compiler_clang; } + else if (str8_matchi(cc->string, str8_lit("cl"))) { dir->compile.cc = Compiler_msvc; } else { t_errorf_md(file_path, source, cc, "unknown compiler name: \"%S\"\n", sub_field->string); goto exit; @@ -639,23 +840,23 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript t_errorf_md(file_path, source, field, "missing value on field %S\n", field->string); goto exit; } - + // more than one node? -> error if ( ! md_node_is_nil(field->first->next)) { t_errorf_md(file_path, source, field, "field %S accepts only one value\n", field->string); goto exit; } - + // node is not a string literal? -> error if (~field->first->flags & MD_NodeFlag_StringLiteral) { t_errorf_md(file_path, source, field, "field %S accepts only strings\n", field->string); goto exit; } - + // copy string from MD node dir->args = str8_copy(arena, field->first->string); } - + // append new directive T_DbgScriptDirectiveList *list = &script.directives[os][kind]; SLLQueuePush(list->first, list->last, dir); @@ -670,18 +871,18 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript MD_NodePtrList files = {0}; for MD_EachNode(n, script_parse.root->first->next) { if (str8_matchi(n->string, str8_lit("file"))) { - + // is file value a string? -> error if ( ! md_node_is_nil(n->first->next) || ! (n->first->flags & MD_NodeFlag_StringLiteral)) { t_errorf_md(file_path, source, n, "value of the 'file' must be a string, (e.g. file: \"main.c\")\n"); goto exit; } - + // append file node md_node_ptr_list_push(scratch.arena, &files, n); } } - + // no nodes? -> treat whole file as a script if (files.count == 0) { MD_Node *whole_file = push_array(scratch.arena, MD_Node, 1); @@ -691,14 +892,14 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript whole_file->first->string = str8_skip_last_slash(file_path); md_node_ptr_list_push(scratch.arena, &files, whole_file); } - + HashMap files_hm = {0}; for EachNode(n_ptr, MD_NodePtrNode, files.first) { MD_Node *n = n_ptr->v; - + // get file name String8 file_name = n->first->string; - + // was file seen? -> error MD_Node *is_declared = hash_map_search_string_raw(&files_hm, file_name); if (is_declared) { @@ -707,19 +908,19 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript goto exit; } hash_map_push_string_raw(scratch.arena, &files_hm, file_name, n); - + // file ends at EOF or before the next file directive U64 src_opl = source.size; if (n_ptr->next) { src_opl = n_ptr->next->v->src_offset; } - + // sub-string the source file String8 sub_source = str8_substr(source, r1u64(n->src_offset, src_opl)); U64 file_min = str8_find_needle(sub_source, 0, str8_lit("\n"), 0) + 1; U64 file_max = str8_find_needle_reverse(sub_source, 0, str8_lit("\n"), 0); sub_source = str8_substr(sub_source, r1u64(file_min, file_max)); - + // append new file node T_DbgScriptFile *file = push_array(arena, T_DbgScriptFile, 1); file->path = t_make_file_path(arena, file_name); @@ -737,9 +938,9 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript // find order number nodes U64 order = 0; if ( ! try_u64_from_str8_c_rules(n->string, &order)) { - continue; + continue; } - + // correlate MD node to the script file T_DbgScriptFile *file = 0; for (file = script.files.first; file != 0; file = file->next) { @@ -747,7 +948,7 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript break; } } - + // found file? -> error if (file == 0) { t_errorf_md(file_path, source, n, "failed to correlate MD node to the script source file\n"); @@ -760,7 +961,7 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript t_errorf_md(file_path, source, n, "duplicate order number %llu found, previous defined at %llu\n", order, p->pt.line); goto exit; } - + // alloc & fill out program p = push_array(arena, T_DbgScriptProgram, 1); p->pt = mg_txt_pt_from_string_off(source, n->src_offset); @@ -779,9 +980,9 @@ t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript // parse cmd args MD_Node *cmd_arg = cmd_n->first; - + if (md_node_is_nil(cmd_arg)) { continue; } - + if (cmd->kind == T_DbgScriptCmdKind_At) { if ( ! try_s64_from_str8_c_rules(cmd_arg->string, &cmd->at_delta)) { t_errorf_md(file_path, source, cmd_arg, "failed to parse \"%S\"", cmd_arg->string); @@ -868,7 +1069,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) S64 at_line_s64 = (S64)(program->pt.line - program->file->pt.line) + cmd->at_delta; U64 at_line_u64 = at_line_s64 >= 0 ? (U64)at_line_s64 : 0; AssertAlways(at_line_u64 > 0); - + if (lines.count == 0) { t_errorf("ERROR: %S:%llu:%llu: no source location maps for vaddr: 0x%llx\n", script->file_path, cmd->pt.line, cmd->pt.column, ip); goto exit; @@ -877,7 +1078,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) // match expected vs current debugger locations for EachIndex(i, lines.count) { B32 mismatch = lines.v[i].pt.line != at_line_u64 || - !str8_match(lines.v[i].file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); + !str8_match(lines.v[i].file_path, program->file->path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive); if (mismatch) { t_errorf("ERROR: %S:%llu: location check did not pass:\n", script->file_path, cmd->pt.line); t_errorf(" Expected: %S:%llu\n", program->file->path, at_line_u64); @@ -914,7 +1115,7 @@ T_RunSig(dbg_script_runner) // source -> script T_DbgScript script = {0}; if ( ! t_dbg_parse_script(arena, user_data, source, &script)) { - result_out->status = T_RunStatus_Fail; + result_out->status = TestStatus_Fail; goto exit; } @@ -925,7 +1126,7 @@ T_RunSig(dbg_script_runner) T_Ok(0); } } - + // compiler vars HashTable *script_vars = hash_table_init(arena, 1000); hash_table_push_path_string(arena, script_vars, str8_lit("FILE"), user_data); @@ -934,37 +1135,37 @@ T_RunSig(dbg_script_runner) // run compilers for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Compile].first) { - T_Compiler compiler = directive->compile.cc; - + Compiler compiler = directive->compile.cc; + // pick default compiler if none selected - if (directive->compile.cc == T_Compiler_Null) { + if (directive->compile.cc == Compiler_Null) { switch (OperatingSystem_CURRENT) { - case OperatingSystem_Windows: { compiler = T_Compiler_Cl; } break; - case OperatingSystem_Linux: { compiler = T_Compiler_Clang; } break; + case OperatingSystem_Windows: { compiler = Compiler_msvc; } break; + case OperatingSystem_Linux: { compiler = Compiler_clang; } break; } } // get compiler path String8 compiler_path = {0}; switch (compiler) { - case T_Compiler_Null: break; - case T_Compiler_Cl: compiler_path = t_cl_path(); break; - case T_Compiler_Clang: compiler_path = t_clang_path(); break; - case T_Compiler_Gcc: compiler_path = t_gcc_path(); break; + case Compiler_Null: break; + case Compiler_msvc: compiler_path = t_cl_path(); break; + case Compiler_clang: compiler_path = t_clang_path(); break; + case Compiler_gcc: compiler_path = t_gcc_path(); break; } // invoke compiler with arguments from directive String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); - - if (compiler == T_Compiler_Cl) { expanded_args = str8f(arena, "/nologo %S", expanded_args); } - + + if (compiler == Compiler_msvc) { expanded_args = str8f(arena, "/nologo %S", expanded_args); } + if (t_invoke(compiler_path, expanded_args, max_U64) == 0) { t_errorf("ERROR: failed to launch compiler: \"%S %S\"\n", compiler_path, expanded_args); T_Ok(0); } - - if (compiler == T_Compiler_Cl) { g_output = str8_skip(g_output, str8_chop_line(&g_output).size); } // file name print - + + if (compiler == Compiler_msvc) { g_output = str8_skip(g_output, str8_chop_line(&g_output).size); } // file name print + if (g_last_exit_code) { t_errorf("ERROR: %S:%llu: %S\n", script.file_path, (unsigned long long)directive->pt.line, g_errors); if (g_stop_on_first_fail_or_crash) { @@ -986,19 +1187,13 @@ T_RunSig(dbg_script_runner) T_Ok(0); } } - - // if test does not have any directive -> skip - U64 total_directive_count = 0; - for EachIndex(i, ArrayCount(script.directives[OperatingSystem_CURRENT])) { - total_directive_count += script.directives[OperatingSystem_CURRENT][i].count; - } - + // is skip flag set? -> exit - if (g_build_only || total_directive_count == 0 || script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Skip].count) { - result_out->status = T_RunStatus_Skip; + if (g_build_only || script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Skip].count) { + result_out->status = TestStatus_Skip; goto exit; } - + // launch targets for EachNode(directive, T_DbgScriptDirective, script.directives[OperatingSystem_CURRENT][T_DbgScriptDirectiveKind_Launch].first) { String8 expanded_args = lnk_expand_env_vars_windows(arena, script_vars, directive->args); diff --git a/src/torture/torture_d2r.c b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c similarity index 100% rename from src/torture/torture_d2r.c rename to src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c diff --git a/src/torture/torture_p2r.c b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c similarity index 100% rename from src/torture/torture_p2r.c rename to src/rdi_from_pdb/tests/rdi_from_pdb_tests.c diff --git a/src/torture/torture.c b/src/torture/torture.c index f7162932..cf32d384 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -72,31 +72,6 @@ t_test_group_from_name(Arena *arena, String8 pattern) //////////////////////////////// -internal char * -t_string_from_result(T_RunStatus v) -{ - switch (v) { - case T_RunStatus_Fail: return "FAIL"; - case T_RunStatus_Crash: return "CRASH"; - case T_RunStatus_Pass: return "PASS"; - case T_RunStatus_Skip: return "SKIP"; - default: break; - } - return 0; -} - -internal char * -t_color_from_result(T_RunStatus v) -{ - switch (v) { -#define X(n,c,...) case T_RunStatus_##n: return c; - T_Run_XList -#undef X - default: break; - } - return "null"; -} - internal void t_break_if_debugger_present(void) { @@ -108,14 +83,14 @@ t_break_if_debugger_present(void) #endif } -internal T_Linker +internal Linker t_id_linker(void) { String8 name = str8_chop_last_dot(str8_skip_last_slash(g_linker_path)); - if (str8_match(name, str8_lit("radlink"), StringMatchFlag_CaseInsensitive)) { return T_Linker_RAD; } - if (str8_match(name, str8_lit("link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_MSVC; } - if (str8_match(name, str8_lit("lld-link"), StringMatchFlag_CaseInsensitive)) { return T_Linker_LLVM; } - return T_Linker_Null; + if (str8_match(name, str8_lit("radlink"), StringMatchFlag_CaseInsensitive)) { return Linker_radlink; } + if (str8_match(name, str8_lit("link"), StringMatchFlag_CaseInsensitive)) { return Linker_msvc; } + if (str8_match(name, str8_lit("lld-link"), StringMatchFlag_CaseInsensitive)) { return Linker_lld; } + return Linker_Null; } internal B32 @@ -212,19 +187,19 @@ t_run_caller(void *raw_ctx) Temp scratch = scratch_begin(0,0); g_is_first_print = 1; - + T_RunCtx *ctx = raw_ctx; - ctx->result.status = T_RunStatus_Pass; - + ctx->result.status = TestStatus_Pass; + String8List test_out = {0}; - + if (ctx->test->skip) { - ctx->result.status = T_RunStatus_Skip; + ctx->result.status = TestStatus_Skip; } else { ctx->test->r(scratch.arena, ctx->user_data, &ctx->result, &test_out); } - - if (ctx->result.status == T_RunStatus_Fail || ctx->result.status == T_RunStatus_Crash) { + + if (ctx->result.status == TestStatus_Fail || ctx->result.status == TestStatus_Crash) { for EachNode(n, String8Node, test_out.first) { t_errorf("%S", n->string); } @@ -235,27 +210,27 @@ t_run_caller(void *raw_ctx) t_errorf("%S\n", g_output); } } - + scratch_end(scratch); } -internal T_RunResult +internal TestResult t_run(T_Test *test, String8 user_data) { - T_RunCtx ctx = { .test = test, .user_data = user_data, .result.status = T_RunStatus_Fail }; + T_RunCtx ctx = { .test = test, .user_data = user_data, .result.status = TestStatus_Fail }; t_run_caller(&ctx); - - if (ctx.result.status == T_RunStatus_Fail || ctx.result.status == T_RunStatus_Crash) { + + if (ctx.result.status == TestStatus_Fail || ctx.result.status == TestStatus_Crash) { if (g_output.size > 0 || g_errors.size > 0) { t_errorf("Last captured output:\n"); if (g_output.size) { t_errorf("%S\n", g_output); } if (g_errors.size) { t_errorf("%S\n", g_errors); } } } - + fflush(stdout); fflush(stderr); - + return ctx.result; } @@ -336,7 +311,7 @@ t_cl_version(void) if ( ! version.size) { Temp scratch = scratch_begin(0, 0); - + t_invoke_cl(""); AssertAlways(g_last_exit_code == 0); @@ -344,10 +319,10 @@ t_cl_version(void) U64 version_lo = str8_find_needle(g_output, 0, needle, 0); version_lo += needle.size + 1; AssertAlways(version_lo < g_output.size); - + U64 version_hi = str8_find_needle(g_output, version_lo, str8_lit(" "), 0); AssertAlways(version_hi < g_output.size); - + version = str8_substr(g_output, r1u64(version_lo, version_hi)); AssertAlways(version.size > 0); @@ -355,7 +330,7 @@ t_cl_version(void) ArenaParams params = { .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer }; Arena *arena = arena_alloc_(¶ms); version = str8_copy(arena, version); - + MemoryZeroStruct(&g_output); scratch_end(scratch); } @@ -413,7 +388,7 @@ t_cwd_path(void) if (path[0] == 0) { Temp scratch = scratch_begin(0, 0); String8 cwd = get_current_path(scratch.arena); - + // TODO: linux and windows return two different things, we need to settle what to do here // should get_current_path return directory paths with slash or no slash if ((str8_match_wildcard(cwd, str8_lit("*\\"), 0) && str8_match_wildcard(cwd, str8_lit("*/"), 0))) { @@ -422,7 +397,7 @@ t_cwd_path(void) } else { cwd = str8_chop_last_slash(cwd); } - + MemoryCopyStr8(path, cwd); path[cwd.size] = 0; scratch_end(scratch); @@ -448,19 +423,19 @@ internal B32 t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) { Temp scratch = scratch_begin(&g_output_arena,1); - + B32 is_ok = 0; - + // clean up global state arena_clear(g_output_arena); MemoryZeroStruct(&g_output); g_last_exit_code = max_U64; - + String8List stdout_parts = {0}; String8List stderr_parts = {0}; U64 stdout_idx = 0; U64 stderr_idx = 1; - + #if OS_WINDOWS typedef enum { Win32CaptureState_Null, @@ -478,7 +453,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) String8List *parts; Win32CaptureState state; } Win32Capture; - + Win32Capture captures_win32[2] = {0}; for EachElement(i, captures_win32) { // create read pipe @@ -488,23 +463,23 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) SECURITY_ATTRIBUTES read_at = { .nLength = sizeof(read_at), .bInheritHandle = 0 }; captures_win32[i].read_pipe_handle = CreateNamedPipeW(pipe_name16.str, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_WAIT, 1, MB(1), MB(1), 0, &read_at); AssertAlways(captures_win32[i].read_pipe_handle != INVALID_HANDLE_VALUE); - + // create overlapped write file SECURITY_ATTRIBUTES write_at = { .nLength = sizeof(write_at), .bInheritHandle = 1 }; captures_win32[i].write_pipe_handle = CreateFileW(pipe_name16.str, GENERIC_WRITE, 0, &write_at, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); AssertAlways(captures_win32[i].write_pipe_handle != INVALID_HANDLE_VALUE); - + // create event for overlapped captures_win32[i].event = CreateEventW(0, 1, 0, 0); AssertAlways(captures_win32[i].event != NULL); - + // alloc capture buffer captures_win32[i].buffer_size = MB(1); captures_win32[i].buffer = push_array(scratch.arena, U8, captures_win32[i].buffer_size); } captures_win32[stdout_idx].parts = &stdout_parts; captures_win32[stderr_idx].parts = &stderr_parts; - + File read_capture_handles [ArrayCount(captures_win32)] = {0}; File write_capture_handles[ArrayCount(captures_win32)] = {0}; for EachElement(i, captures_win32) { read_capture_handles[i] = (File){ (U64)captures_win32[i].read_pipe_handle }; } @@ -516,7 +491,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) B32 is_live; struct pollfd *poll_fd; } LinuxCapture; - + LinuxCapture captures_linux[2] = {0}; for EachElement(i, captures_linux) { if (pipe2(captures_linux[i].fds, 0) != 0) { @@ -525,10 +500,10 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) } captures_linux[i].is_live = 1; } - + captures_linux[0].parts = &stdout_parts; captures_linux[1].parts = &stderr_parts; - + File read_capture_handles[2] = {0}, write_capture_handles[2] = {0}; read_capture_handles[0].u64[0] = captures_linux[0].fds[0]; read_capture_handles[1].u64[0] = captures_linux[1].fds[0]; @@ -546,13 +521,13 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline), }; str8_list_push_front(scratch.arena, &launch_opts.cmd_line, exe_path); - + String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(" ") }); - + // invoke exe Process process_handle = process_launch(&launch_opts); if (process_match(process_handle, process_zero())) { goto exit; } - + // capture process output #if OS_WINDOWS { @@ -561,24 +536,24 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) CloseHandle(captures_win32[i].write_pipe_handle); MemoryZeroStruct(&write_capture_handles[i]); } - + B32 is_process_live = 1; for (U64 endt_us = ENDT_US(timeout_us);;) { HANDLE wait_handles[ArrayCount(captures_win32) + 1] = {0}; U64 wait_handle_count = 0; - + // queue process if (is_process_live) { wait_handles[wait_handle_count++] = (HANDLE)process_handle.u64[0]; } - + for EachElement(capture_idx, captures_win32) { while (captures_win32[capture_idx].state == Win32CaptureState_Null) { // init overlapped so when child writes to capture buffer this event is signaled AssertAlways(ResetEvent(captures_win32[capture_idx].event)); MemoryZeroStruct(&captures_win32[capture_idx].overlapped); captures_win32[capture_idx].overlapped.hEvent = captures_win32[capture_idx].event; - + // begin overlapped read DWORD read_size = 0; if (ReadFile(captures_win32[capture_idx].read_pipe_handle, captures_win32[capture_idx].buffer, captures_win32[capture_idx].buffer_size, &read_size, &captures_win32[capture_idx].overlapped)) { @@ -600,7 +575,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) break; } } - + if (captures_win32[capture_idx].state == Win32CaptureState_Pending) { // event now should signal whenever pipe has data to read captures_win32[capture_idx].wait_idx = wait_handle_count++; @@ -609,23 +584,23 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) captures_win32[capture_idx].wait_idx = max_U64; } } - + // exit if there are no handles if (wait_handle_count == 0) { break; } - + // compute wait time DWORD wait_ms = INFINITE; if (timeout_us != max_U64) { U64 now_us = now_time_us(); wait_ms = now_us < endt_us ? ClampTop((endt_us - now_us + 999) / 1000, max_U32-1) : 0; } - + // wait on process and read pipes DWORD wait_result = WaitForMultipleObjects(wait_handle_count, wait_handles, 0, wait_ms); - + if (wait_result >= WAIT_OBJECT_0 && wait_result < WAIT_OBJECT_0 + wait_handle_count) { DWORD wait_idx = wait_result - WAIT_OBJECT_0; - + if (is_process_live && wait_idx == 0) { DWORD exit_code = 0; if(GetExitCodeProcess((HANDLE)process_handle.u64[0], &exit_code)) { @@ -641,7 +616,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) } } AssertAlways(pipe_idx != max_U64); - + DWORD read_size; if (GetOverlappedResult(captures_win32[pipe_idx].read_pipe_handle, &captures_win32[pipe_idx].overlapped, &read_size, 0)) { if (read_size > 0) { @@ -649,7 +624,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) String8 string = str8(captures_win32[pipe_idx].buffer, read_size); String8 string_copy = str8_copy(scratch.arena, string); str8_list_push(scratch.arena, captures_win32[pipe_idx].parts, string_copy); - + // queue next overlapped read captures_win32[pipe_idx].state = Win32CaptureState_Null; } else { @@ -664,7 +639,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) break; } } - + // (timeout) kill process if alive so we can safeley cancel async IO if (is_process_live) { if (TerminateProcess((HANDLE)process_handle.u64[0], 999)) { @@ -672,20 +647,20 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) Assert(0 && "process is taking too long to exit"); } } else { Assert(0 && "failed to kill process"); } - + DWORD exit_code = 0; if (GetExitCodeProcess((HANDLE)process_handle.u64[0], &exit_code)) { g_last_exit_code = exit_code; } else { Assert(0 && "failed to get process exit code"); } } - + // (timeout) cancel pending async IO for EachElement(i, captures_win32) { if (captures_win32[i].state == Win32CaptureState_Pending) { BOOL cancel_ok = CancelIoEx(captures_win32[i].read_pipe_handle, &captures_win32[i].overlapped); DWORD cancel_error = cancel_ok ? ERROR_SUCCESS : GetLastError(); AssertAlways(cancel_ok || cancel_error == ERROR_NOT_FOUND); - + DWORD read_size = 0; if (GetOverlappedResult(captures_win32[i].read_pipe_handle, &captures_win32[i].overlapped, &read_size, 1)) { if (read_size > 0) { @@ -700,7 +675,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) captures_win32[i].state = Win32CaptureState_EOF; } } - + // close windows specific handles CloseHandle((HANDLE)process_handle.u64[0]); for EachElement(i, captures_win32) { @@ -713,14 +688,14 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) close((int)write_capture_handles[i].u64[0]); MemoryZeroStruct(&write_capture_handles[i]); } - + pid_t pid = (pid_t)process_handle.u64[0]; int pidfd = syscall(SYS_pidfd_open, pid, 0); if (pidfd < 0) { fprintf(stderr, "ERROR: failed to translate pid(%d) to pidfd\n", pid); goto exit; } - + B32 is_process_live = 1; U64 endt_us = ENDT_US(timeout_us); U64 read_buffer_default_size = MB(1); @@ -729,12 +704,12 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) for (;;) { struct pollfd fds[3] = {0}; int nfds = 0; - + // append process if (is_process_live) { fds[nfds++] = (struct pollfd){ .fd = pidfd, .events = POLLIN | POLLHUP }; } - + // append pipes for EachElement(i, captures_linux) { if (captures_linux[i].is_live) { @@ -742,17 +717,17 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) fds[nfds++] = (struct pollfd){ .fd = captures_linux[i].fds[0], .events = POLLIN | POLLHUP }; } } - + // exit if there are no more handles to poll if (nfds == 0) { break; } - + // compute wait time int wait_ms = -1; if (timeout_us != max_U64) { U64 now_us = now_time_us(); wait_ms = now_us < endt_us ? ClampTop((endt_us - now_us + 999) / 1000, max_U32-1) : 0; } - + // wait for kernel to signal any of the wait handles int poll_result = poll(fds, nfds, wait_ms); if (poll_result < 0) { @@ -773,12 +748,12 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) } else { fprintf(stderr, "ERROR: failed to reap process %d\n", pid); } - + // signal on process fd means exit is_process_live = 0; } } - + for EachElement(i, captures_linux) { if (captures_linux[i].is_live) { if (captures_linux[i].poll_fd->revents & POLLIN) { @@ -787,7 +762,7 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) read_buffer_size = read_buffer_default_size; read_buffer = push_array(scratch.arena, U8, read_buffer_default_size); } - + ssize_t read_size = LNX_RETRY_ON_EINTR(read(captures_linux[i].poll_fd->fd, read_buffer, read_buffer_size)); if (read_size > 0) { str8_list_push(scratch.arena, captures_linux[i].parts, str8(read_buffer, read_size)); @@ -807,40 +782,40 @@ t_invoke_env(String8 exe_path, String8 cmdline, String8List env, U64 timeout_us) } } } - + if (captures_linux[i].poll_fd->revents & POLLHUP) { captures_linux[i].is_live = 0; } } } } - + // close process handle if (close(pidfd) < 0) { fprintf(stderr, "ERROR: failed to close process handle %d\n", pidfd); } #endif - + t_infof("Invoke: {\n"); t_infof(" CMDL: %S\n", full_cmd_line); t_infof(" WDIR: %S\n", g_wdir); t_infof(" Exit: %u\n", g_last_exit_code); t_infof("}\n"); - + // update output global g_output = str8_list_join(g_output_arena, &stdout_parts, 0); g_errors = str8_list_join(g_output_arena, &stderr_parts, 0); - + // write to the output file if (g_redirect_stdout) { write_data_to_file_path(g_stdout_file_name, g_output); } - + is_ok = 1; // process was launched (does not mean exited successfully) exit:; for EachElement(i, read_capture_handles) { file_close(read_capture_handles[i]); } for EachElement(i, write_capture_handles) { file_close(write_capture_handles[i]); } - + scratch_end(scratch); return is_ok; } @@ -1104,6 +1079,8 @@ t_help(void) fprintf(stderr, " torture +* Force-run all tests\n"); } +internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path); + internal void t_entry_point(CmdLine *cmdline) { @@ -1127,25 +1104,25 @@ t_entry_point(CmdLine *cmdline) // { B32 print_help = cmd_line_has_flag(cmdline, str8_lit("help")) || - cmd_line_has_flag(cmdline, str8_lit("h")); + cmd_line_has_flag(cmdline, str8_lit("h")); if (print_help) { t_help(); goto exit; } } - + // Gather tests { // register debugger tests String8 test_folder_path = str8f(scratch.arena, "%S/torture/dbg_tests", t_src_path()); t_dbg_register_script_tests(scratch.arena, test_folder_path); - + // sort tests g_torture_tests = push_array(scratch.arena, T_Test *, g_torture_test_count); for EachIndex(i, g_torture_test_count) { g_torture_tests[i] = &g_torture_tests_[i]; } radsort(g_torture_tests, g_torture_test_count, t_test_ptr_is_before); } - + // // Handle -list // @@ -1167,7 +1144,7 @@ t_entry_point(CmdLine *cmdline) g_clang_path = cmd_line_string(cmdline, str8_lit("clang")); g_gcc_path = cmd_line_string(cmdline, str8_lit("gcc")); g_linker_path = cmd_line_string(cmdline, str8_lit("linker")); - + // // Handle -test_data // @@ -1185,63 +1162,63 @@ t_entry_point(CmdLine *cmdline) U64List targets = {0}; { String8List inputs = {0}; - + CmdLineOpt *target_opt = 0; if (target_opt == 0) { target_opt = cmd_line_opt_from_string(cmdline, str8_lit("target")); } if (target_opt == 0) { target_opt = cmd_line_opt_from_string(cmdline, str8_lit("t")); } - + // handle explicit target switch if (target_opt) { str8_list_concat_in_place(&inputs, &target_opt->value_strings); } - + // accept inputs from the command line as target tests to run str8_list_concat_in_place(&inputs, &cmdline->inputs); - + // no inputs -> print help and exit if (inputs.node_count == 0) { t_help(); goto exit; } - + HashMap hm = {0}; for EachNode(input_n, String8Node, inputs.first) { String8 t = input_n->string; - + // parse mode typedef enum { Mode_Default, Mode_Skip, Mode_Force, } Mode; Mode mode = Mode_Default; if (str8_match_wildcard(t, str8_lit("+*"), 0)) { mode = Mode_Force; t = str8_skip(t, 1); } else if (str8_match_wildcard(t, str8_lit("!*"), 0)) { mode = Mode_Skip; t = str8_skip(t, 1); } - + if (str8_find_needle(t, 0, str8_lit("/"), 0) >= t.size) { t = str8f(scratch.arena, "*/%S", t); } - + U64 match_count = 0; - + for EachIndex(test_idx, g_torture_test_count) { // match test names String8 test_name = t_test_name_from_idx(scratch.arena, test_idx); - + if (str8_match_wildcard(test_name, t, StringMatchFlag_CaseInsensitive)) { // set skip flag switch (mode) { - case Mode_Default: break; - case Mode_Skip: g_torture_tests[test_idx]->skip = 1; break; - case Mode_Force: g_torture_tests[test_idx]->skip = 0; break; + case Mode_Default: break; + case Mode_Skip: g_torture_tests[test_idx]->skip = 1; break; + case Mode_Force: g_torture_tests[test_idx]->skip = 0; break; } - + // append test when not in skipping mode if ( ! hash_map_search_string_u64(&hm, test_name)) { hash_map_push_string_u64(scratch.arena, &hm, test_name, 1); u64_list_push(scratch.arena, &targets, test_idx); } - + match_count += 1; } } - + if (match_count == 0) { fprintf(stderr, "WARNING: no matches found for input: %.*s\n", str8_varg(input_n->string)); } @@ -1253,13 +1230,13 @@ t_entry_point(CmdLine *cmdline) g_stop_on_first_fail_or_crash = !cmd_line_has_flag(cmdline, str8_lit("keep_going")); g_build_only = cmd_line_has_flag(cmdline, str8_lit("build_only")); g_output_arena = arena_alloc(); - + // default options when running under debugger #if OS_WINDOWS if (!cmd_line_has_flag(cmdline, str8_lit("print_stdout")) && IsDebuggerPresent()) { g_redirect_stdout = 0; } - + // automatically close child processes on exit { HANDLE job_handle = CreateJobObjectA(0, 0); @@ -1310,19 +1287,19 @@ t_entry_point(CmdLine *cmdline) max_group_size = Max(max_group_size, t_group_from_test_idx(test_idx).size); } - U64 run_counters[T_RunStatus_Count] = {0}; + U64 run_counters[TestStatus_COUNT] = {0}; U64 max_digit_count = count_digits_u64(target_indices.count, 10); U64 total_time_start = now_time_us(); - + typedef struct { U64 target_idx, d; } Slowest; Slowest slowest[5] = {0}; for EachElement(i, slowest) { slowest[i].target_idx = max_U64; } - + U64List skipped_tests = {0}; - + for EachIndex(i, target_indices.count) { if (i == 0) { PrintHeader("Tests"); } - + U64 target_idx = target_indices.v[i]; T_Test *test = g_torture_tests[target_idx]; @@ -1335,11 +1312,11 @@ t_entry_point(CmdLine *cmdline) fprintf(stdout, "%.*s %.*s/ %s", str8_varg(t_group_from_test(test)), (int)(max_group_size - t_group_from_test(test).size), spaces, test->label); fprintf(stdout, " %.*s ", (int)dots_count, dots); fflush(stdout); - + // setup output directory g_wdir = push_str8f(scratch.arena, "%S/%s", g_out, test->label); g_wdir = full_path_from_path(scratch.arena, g_wdir); - + // delete files from last run in the work directory if (folder_path_exists(g_wdir)) { t_delete_dir(g_wdir); @@ -1353,21 +1330,32 @@ t_entry_point(CmdLine *cmdline) // run test U64 run_start_time = now_time_us(); - T_RunResult result = t_run(test, test->user_data); + TestResult result = t_run(test, test->user_data); U64 run_end_time = now_time_us(); - + // update run_counters[result.status] += 1; - - // print run status - fprintf(stdout, "%s%s" T_RESET, t_color_from_result(result.status), t_string_from_result(result.status)); - if (result.status == T_RunStatus_Pass) { + // rjf: map status -> color / string + char *status_name_cstr = 0; + char *color_cstr = 0; + switch(result.status) + { + default: + case TestStatus_Pass: {status_name_cstr = "PASS"; color_cstr = T_GREEN;}break; + case TestStatus_Fail: {status_name_cstr = "FAIL"; color_cstr = T_RED;}break; + case TestStatus_Crash:{status_name_cstr = "CRASH"; color_cstr = T_RED;}break; + } + + // print run status + fprintf(stdout, "%s%s" T_RESET, color_cstr, status_name_cstr); + + if (result.status == TestStatus_Pass) { U64 d = run_end_time - run_start_time; DateTime t = date_time_from_micro_seconds(d); String8 s = string_from_elapsed_time(scratch.arena, t); fprintf(stdout, " %.*s", str8_varg(s)); - + fflush(stdout); U64 insert_idx = max_U64; @@ -1387,15 +1375,15 @@ t_entry_point(CmdLine *cmdline) } fprintf(stdout, "\n"); - if (result.status == T_RunStatus_Fail) { + if (result.status == TestStatus_Fail) { fprintf(stdout, " ERROR: %s:%d: condition: \"%s\"\n", result.fail_file, result.fail_line, result.fail_cond); } - if (result.status == T_RunStatus_Fail || result.status == T_RunStatus_Crash) { + if (result.status == TestStatus_Fail || result.status == TestStatus_Crash) { if (g_stop_on_first_fail_or_crash) { goto exit; } } - - if (result.status == T_RunStatus_Skip) { + + if (result.status == TestStatus_Skip) { u64_list_push(scratch.arena, &skipped_tests, target_idx); } } @@ -1404,22 +1392,22 @@ t_entry_point(CmdLine *cmdline) if (target_indices.count > 0 && sum_array_u64(ArrayCount(run_counters), run_counters) > 0) { U64 total_time_dt = total_time_end - total_time_start; String8 total_time_str = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(total_time_dt)); - + fprintf(stderr, "\n"); PrintHeader("Summary"); - fprintf(stderr, " Passed %llu\n", (unsigned long long)run_counters[T_RunStatus_Pass]); - fprintf(stderr, " Failed %llu\n", (unsigned long long)run_counters[T_RunStatus_Fail]); - fprintf(stderr, " Crashed %llu\n", (unsigned long long)run_counters[T_RunStatus_Crash]); - fprintf(stderr, " Skipped %llu\n", (unsigned long long)run_counters[T_RunStatus_Skip]); + fprintf(stderr, " Passed %llu\n", (unsigned long long)run_counters[TestStatus_Pass]); + fprintf(stderr, " Failed %llu\n", (unsigned long long)run_counters[TestStatus_Fail]); + fprintf(stderr, " Crashed %llu\n", (unsigned long long)run_counters[TestStatus_Crash]); + fprintf(stderr, " Skipped %llu\n", (unsigned long long)run_counters[TestStatus_Skip]); fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); - + U64 slow_count = 0; for EachElement(i, slowest) { Slowest s = slowest[i]; if (s.target_idx >= g_torture_test_count) { break; } slow_count += 1; } - + if (slow_count > 3) { U64 label_max = 0; U64 group_max = 0; @@ -1428,7 +1416,7 @@ t_entry_point(CmdLine *cmdline) label_max = Max(strlen(g_torture_tests[s.target_idx]->label), label_max); group_max = Max(t_group_from_test_idx(s.target_idx).size, group_max); } - + fprintf(stderr, " \nSlow Tests\n"); for EachElement(i, slowest) { Slowest s = slowest[i]; @@ -1444,10 +1432,10 @@ t_entry_point(CmdLine *cmdline) } } - exit_code = run_counters[T_RunStatus_Fail] + run_counters[T_RunStatus_Crash]; + exit_code = run_counters[TestStatus_Fail] + run_counters[TestStatus_Crash]; exit:; } - + scratch_end(scratch); exit(exit_code); } diff --git a/src/torture/torture.h b/src/torture/torture.h index fff10f90..a2ca2d69 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -11,31 +11,8 @@ #define T_YELLOW "\x1b[33m" #define T_BLUE "\x1b[34m" -//#define X(n, c) -#define T_Run_XList \ - X(Fail, T_RED) \ - X(Crash, T_RED) \ - X(Pass, T_GREEN) \ - X(Skip, T_RESET) - -typedef enum -{ -#define X(n,...) T_RunStatus_##n, -T_Run_XList -#undef X - T_RunStatus_Count -} T_RunStatus; - -typedef struct -{ - T_RunStatus status; - char *fail_file; - int fail_line; - char *fail_cond; -} T_RunResult; - -#define T_RunSig(name) void t_##name(Arena *arena, String8 user_data, T_RunResult *result_out, String8List *test_out) -typedef void (*T_Run)(Arena *arena, String8 user_data, T_RunResult *result_out, String8List *test_out); +#define T_RunSig(name) void t_##name(Arena *arena, String8 user_data, TestResult *result_out, String8List *test_out) +typedef void (*T_Run)(Arena *arena, String8 user_data, TestResult *result_out, String8List *test_out); typedef struct { @@ -50,26 +27,10 @@ typedef struct typedef struct { T_Test *test; - String8 user_data; - T_RunResult result; + String8 user_data; + TestResult result; } T_RunCtx; -typedef enum -{ - T_Compiler_Null, - T_Compiler_Cl, - T_Compiler_Clang, - T_Compiler_Gcc, -} T_Compiler; - -typedef enum -{ - T_Linker_Null, - T_Linker_RAD, - T_Linker_MSVC, - T_Linker_LLVM -} T_Linker; - extern U64 g_torture_test_count; extern T_Test **g_torture_tests; extern T_Test g_torture_tests_[0xffffff]; @@ -77,34 +38,30 @@ extern T_Test g_torture_tests_[0xffffff]; internal void t_break_if_debugger_present(void); #define T_AddTest(name, f, l, skip, ...) \ - T_RunSig(name); \ - __VA_ARGS__ void t_add_test_##name(void) \ - { \ - g_torture_tests_[g_torture_test_count++] = (T_Test){ f, Stringify(name), l, &t_##name, skip }; \ - } +T_RunSig(name); \ +__VA_ARGS__ void t_add_test_##name(void) \ +{ \ +g_torture_tests_[g_torture_test_count++] = (T_Test){ f, Stringify(name), l, &t_##name, skip }; \ +} #if COMPILER_MSVC # pragma section(".CRT$XCU", read) # define TEST_(name, skip) \ - T_AddTest(name, __FILE__, __LINE__, skip) \ - __declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ - __pragma(comment(linker, "/include:" Stringify(r_##name))) +T_AddTest(name, __FILE__, __LINE__, skip) \ +__declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ +__pragma(comment(linker, "/include:" Stringify(r_##name))) #else # define TEST_(name, skip) T_AddTest(name, __FILE__, __LINE__, skip, __attribute__((constructor))) #endif #define TEST(name) \ - TEST_(name, 0) \ - T_RunSig(name) +TEST_(name, 0) \ +T_RunSig(name) #define SKIP(name) \ - TEST_(name, 1) \ - T_RunSig(name) +TEST_(name, 1) \ +T_RunSig(name) -#define T_Ok(c) do { if (!(c)) { \ - *result_out = (T_RunResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) }; \ - t_break_if_debugger_present(); \ - return; \ -} } while(0) +#define T_Ok(c) TestCheck(c) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) #define t_outf(...) str8_list_pushf(arena, test_out, ## __VA_ARGS__) @@ -129,9 +86,9 @@ internal B32 t_delete_file(String8 name); internal String8 t_make_file_path(Arena *arena, String8 name); // test runner -internal void t_run_caller(void *raw_ctx); -internal void t_run_fail_handler(void *raw_ctx); -internal T_RunResult t_run(T_Test *test, String8 user_data); +internal void t_run_caller(void *raw_ctx); +internal void t_run_fail_handler(void *raw_ctx); +internal TestResult t_run(T_Test *test, String8 user_data); // tools internal String8 t_radbin_path(void); diff --git a/src/torture/torture_dbg.h b/src/torture/torture_dbg.h deleted file mode 100644 index c1aac25a..00000000 --- a/src/torture/torture_dbg.h +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma once - -//////////////////////////////// -// IPC Controller - -typedef struct -{ - B32 running; - U64 run_gen; - U64 ip; - Arch arch; - U64 vaddr_min; - U64 vaddr_max; - U64 ip_vaddr; - U64 sp_base; - U64 tls_root; - U64 tls_index; - U64 tls_offset; - U64 timestamp; - U64 exception_code; - U64 bp_flags; - String8 string; - OperatingSystem target_os; - U64 tls_model; - String8 stop_cause; -} T_DbgState; - -typedef struct -{ - String8 file_path; - TxtPt pt; - Rng1U64 voff_range; -} T_DbgLine; - -typedef struct -{ - U64 count; - T_DbgLine *v; -} T_DbgLineArray; - -typedef struct -{ - String8 expr; - String8 value; - String8 type; - String8 error; -} T_Eval; - -//////////////////////////////// -// Dbg Script - -#define T_DbgScriptCmdKind_XList \ - X(Breakpoint, "bp") \ - X(ClearBreakpoints, "bp_clear") \ - X(Halt, "halt") \ - X(Run, "run") \ - X(RunToLine, "run_to_line") \ - X(StepOver, "step_over") \ - X(StepInto, "step_into") \ - X(StepOut, "step_out") \ - X(StepOverInst, "step_over_inst") \ - X(StepIntoInst, "step_over_inst") \ - X(StepOverLine, "step_over_line") \ - X(StepIntoLine, "step_into_line") \ - X(KillAll, "kll_all") \ - X(At, "at") \ - X(Eval, "eval") - -typedef enum -{ - T_DbgScriptCmdKind_Null, -#define X(n,...) T_DbgScriptCmdKind_##n, - T_DbgScriptCmdKind_XList -#undef X - T_DbgScriptCmdKind_Count -} T_DbgScriptCmdKind; - -#define T_DbgScriptDirectiveKind_XList \ - X(Compile, "compile") \ - X(Link, "link") \ - X(Launch, "launch") \ - X(Skip, "skip") - -typedef enum -{ - T_DbgScriptDirectiveKind_Null, -#define X(q,w) T_DbgScriptDirectiveKind_##q, - T_DbgScriptDirectiveKind_XList -#undef X - T_DbgScriptDirectiveKind_Count, -} T_DbgScriptDirectiveKind; - -typedef struct T_DbgScriptFile -{ - struct T_DbgScriptFile *next; - String8 path; - String8 source; - TxtPt pt; -} T_DbgScriptFile; - -typedef struct -{ - U64 count; - T_DbgScriptFile *first; - T_DbgScriptFile *last; -} T_DbgScriptFileList; - -typedef struct T_DbgScriptCmd -{ - struct T_DbgScriptCmd *next; - T_DbgScriptCmdKind kind; - TxtPt pt; - S64 at_delta; -} T_DbgScriptCmd; - -typedef struct T_DbgScriptProgram -{ - TxtPt pt; - U64 order; - OperatingSystem os; - T_DbgScriptFile *file; - U64 count; - T_DbgScriptCmd *first; - T_DbgScriptCmd *last; - struct T_DbgScriptProgram *next; -} T_DbgScriptProgram; - -typedef struct -{ - U64 count; - T_DbgScriptProgram *first; - T_DbgScriptProgram *last; -} T_DbgScriptProgramList; - -typedef struct T_DbgScriptDirective -{ - struct T_DbgScriptDirective *next; - T_DbgScriptDirectiveKind kind; - TxtPt pt; - String8 args; - union { - struct { - T_Compiler cc; - } compile; - }; -} T_DbgScriptDirective; - -typedef struct -{ - U64 count; - T_DbgScriptDirective *first; - T_DbgScriptDirective *last; -} T_DbgScriptDirectiveList; - -typedef struct -{ - String8 file_path; - T_DbgScriptDirectiveList directives[OperatingSystem_COUNT][T_DbgScriptDirectiveKind_Count]; - T_DbgScriptFileList files; - U64 program_count; - T_DbgScriptProgram **programs; - B32 skip; -} T_DbgScript; - - -//////////////////////////////// -// IPC Controller - -// error helper -internal void t_errorf_md(String8 file_name, String8 source, MD_Node *n, char *fmt, ...); - -// reply parse helpers -internal B32 t_ipc_parse_string(MD_Node *node, String8 child_name, String8 *out); -internal B32 t_ipc_parse_u32(MD_Node *node, String8 child_name, U32 *out); -internal B32 t_ipc_parse_int_(MD_Node *node, String8 child_name, U64 out_size, void *out); -internal B32 t_ipc_parse_b32(MD_Node *node, String8 child_name, B32 *out); -#define t_ipc_parse_int(n, c, ptr) t_ipc_parse_int_(n, c, sizeof(*ptr), ptr) - -// debugger commands -internal B32 t_dbg_send_cmd(String8 cmd, U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out); -internal B32 t_dbg_send_cmdf(U64 timeout_us, Arena *reply_arena, MD_ParseResult *reply_out, char *fmt, ...); -internal T_DbgState * t_dbg_state(Arena *arena, U64 timeout_us); -internal B32 t_dbg_src_line(Arena *arena, U64 vaddr, T_DbgLineArray *lines_out, U64 timeout_us); -internal String8 t_dbg_value_from_expr(Arena *arena, String8 expr); -internal String8 t_dbg_value_from_exprf(Arena *arena, char *fmt, ...); -internal B32 t_dbg_send_cmd_and_wait_stop(String8 cmd, U64 timeout_us); -internal B32 t_dbg_ping(U64 timeout_us); -internal B32 t_dbg_bp_add_line(String8 file, U64 line); -internal B32 t_dbg_bp_add_func(String8 func_name); -internal B32 t_dbg_bp_add_addr(U64 addr); -internal B32 t_dbg_launch(String8 cmdline, U64 timeout_us); -internal B32 t_dbg_eval(Arena *arena, String8 expr, T_Eval *eval_out); - -//////////////////////////////// -// Dbg Script - -internal String8 t_string_from_dbg_script_cmd_kind(T_DbgScriptCmdKind v); -internal T_DbgScriptCmdKind t_dbg_script_cmd_kind_from_string(String8 cmd); -internal B32 t_dbg_parse_script(Arena *arena, String8 file_path, String8 source, T_DbgScript *script_out); -internal B32 t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us); -internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path); - diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 6745399c..b240b3ae 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -6,6 +6,7 @@ #define BUILD_TITLE "TORTURE" +#define BUILD_TESTS 1 #define BUILD_CONSOLE_INTERFACE 1 #define OS_FEATURE_GRAPHICAL 1 #define DMN_INIT_MANUAL 1 @@ -94,8 +95,6 @@ #include "linker/lnk_log.h" #include "linker/lnk_debug_helper.h" #include "torture.h" -#include "torture_radlink.h" -#include "torture_dbg.h" #include "base/base_inc.c" #include "x64/x64.c" @@ -167,15 +166,15 @@ #include "linker/pdb_ext/pdb_helpers.c" #include "linker/pdb_ext/pdb_builder.c" #include "linker/lnk_debug_helper.c" - #include "torture.c" -#include "torture_base.c" -#include "torture_md.c" -#include "torture_radlink.c" -#include "torture_dwarf.c" -#include "torture_d2r.c" -#include "torture_p2r.c" -#include "torture_dbg.c" + +#include "base/tests/base_tests.c" +#include "mdesk/tests/mdesk_tests.c" +#include "linker/tests/linker_tests.c" +#include "dwarf/tests/dwarf_tests.c" +#include "rdi_from_dwarf/tests/rdi_from_dwarf_tests.c" +#include "rdi_from_pdb/tests/rdi_from_pdb_tests.c" +#include "raddbg/tests/raddbg_tests.c" internal B32 frame(void) { return 0; } diff --git a/src/torture/torture_radlink.h b/src/torture/torture_radlink.h deleted file mode 100644 index 17ce34d9..00000000 --- a/src/torture/torture_radlink.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma once - -//////////////////////////////// - -typedef enum -{ - T_MsvcLinkExitCode_UnresolvedExternals = 1120, - T_MsvcLinkExitCode_CorruptOrInvalidSymbolTable = 1235, - T_MsvcLinkExitCode_SectionsFoundWithDifferentAttributes = 4078, -} T_MsvcLinkExitCode; - -//////////////////////////////// - -internal T_Linker t_id_linker(void); - -internal COFF_ObjSection * t_push_text_section(COFF_ObjWriter *obj_writer, String8 data); -internal COFF_ObjSection * t_push_data_section(COFF_ObjWriter *obj_writer, String8 data); -internal COFF_ObjSection * t_push_rdata_section(COFF_ObjWriter *obj_writer, String8 data); - -internal String8 t_make_entry_obj(Arena *arena); -internal String8 t_make_sec_defn_obj(Arena *arena, String8 payload); -internal String8 t_make_obj_with_directive(Arena *arena, String8 directive); - -internal B32 t_write_entry_obj(void); - diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index 4e6add41..a7bf6c0f 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -156,6 +156,16 @@ w32_thread_entry_point(void *ptr) return 0; } +//////////////////////////////// +//~ rjf: @per_os_impl Debugger Attachment Checking + +internal B32 +debugger_is_attached(void) +{ + B32 result = IsDebuggerPresent(); + return result; +} + //////////////////////////////// //~ rjf: @per_os_impl Platform Time Functions From 685c408a13177bf5cbeac3028f6185cfaf6a8e75 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 25 May 2026 08:25:46 -0700 Subject: [PATCH 703/850] migrate from torture-defined testing markup -> base --- project.raddbg | 2 +- src/base/base_test.h | 4 +- src/raddbg/raddbg_main.c | 6 + src/raddbg/tests/raddbg_tests.c | 10 +- src/rdi_from_pdb/tests/rdi_from_pdb_tests.c | 10 +- src/torture/torture.c | 140 +++++++------------- src/torture/torture.h | 49 +------ 7 files changed, 75 insertions(+), 146 deletions(-) diff --git a/project.raddbg b/project.raddbg index 97eceeb8..9d5d96f4 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,6 +7,7 @@ target: working_directory: build arguments: "--user:raddbg_test.user --project:raddbg_test.project" debug_subprocesses: 0 + enabled: 1 } target: { @@ -41,5 +42,4 @@ target: { executable: "build/torture.exe" working_directory: "build/" - enabled: 1 } diff --git a/src/base/base_test.h b/src/base/base_test.h index 54f49913..c988062c 100644 --- a/src/base/base_test.h +++ b/src/base/base_test.h @@ -23,7 +23,7 @@ struct TestResult char *fail_cond; }; -#define TEST_FUNCTION_SIG(name) void name(Arena *arena, String8 user_data, TestResult *result_out, String8List *test_out) +#define TEST_FUNCTION_SIG(name) void name(Arena *arena, TestResult *result_out, String8List *test_out) #define TEST_FUNCTION_DEF(name) TEST_FUNCTION_SIG(test__##name) typedef TEST_FUNCTION_SIG(TestFunctionType); @@ -32,7 +32,7 @@ struct TestInfo { String8 layer; String8 label; - int decl_line; + S64 decl_line; B32 skip; TestFunctionType *test_fn; }; diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index ab8f14df..d736c3f8 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,12 @@ //////////////////////////////// //~ rjf: post-0.9.26 TODO notes // +// [ ] jeff stepping bug +// [ ] wassim memory bug +// [ ] test concepts -> base +// [ ] switch off spoofs for step-over +// [ ] debugger, d2r, p2r exemplar / determinism testing +// // [ ] symbol server // [ ] core dump saving/loading // diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index 4dcca5f1..0c1ab525 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -1,6 +1,12 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +Test(stepping_regressions) +{ + +} + +#if 0 //////////////////////////////// // IPC Controller @@ -1102,8 +1108,7 @@ t_dbg_script_invoke(T_DbgScript *script, U64 timeout_us) return is_ok; } -internal -T_RunSig(dbg_script_runner) +internal TEST_FUNCTION_DEF(dbg_script_runner) { // read source file String8 source = data_from_file_path(arena, user_data); @@ -1257,3 +1262,4 @@ t_dbg_register_script_tests(Arena *arena, String8 folder_path) scratch_end(scratch); } +#endif diff --git a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c index 86ac00e1..16a44fa0 100644 --- a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c +++ b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c @@ -1,8 +1,7 @@ -#if OS_WINDOWS +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) -// TODO: location is not baked consistently -#if !COMPILER_CLANG || (COMPILER_CLANG && BUILD_DEBUG) -TEST(p2r_determ) +SkippedTest(p2r_determ) { U64 num_repeats_per_pdb = 32; String8 pdb_paths[] = @@ -122,6 +121,3 @@ TEST(p2r_determ) } } } -#endif -#endif - diff --git a/src/torture/torture.c b/src/torture/torture.c index cf32d384..e4d75236 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -12,10 +12,8 @@ global B32 g_build_only = 0; global String8 g_test_data; // tests -U64 g_torture_test_count; -T_Test **g_torture_tests; -T_Test g_torture_tests_[0xffffff]; -B32 g_is_first_print; +global TestInfo *g_sorted_test_infos[ArrayCount(test_infos)] = {0}; +global B32 g_is_first_print; // invoke global U64 g_last_exit_code; @@ -34,26 +32,10 @@ global String8 g_linker_path; //////////////////////////////// internal String8 -t_group_from_test(T_Test *test) +t_name_from_test_info(Arena *arena, TestInfo *test_info) { - String8 file = str8_cstring(test->file); - String8 group = str8_chop_last_dot(str8_skip_last_slash(file)); - if (str8_match_wildcard(group, str8_lit("torture_*"), StringMatchFlag_CaseInsensitive)) { - group = str8_skip(group, str8_lit("torture_").size); - } - return group; -} - -internal String8 -t_group_from_test_idx(U64 test_idx) -{ - return t_group_from_test(g_torture_tests[test_idx]); -} - -internal String8 -t_test_name_from_idx(Arena *arena, U64 test_idx) -{ - return str8f(arena, "%.*s/%s", str8_varg(t_group_from_test_idx(test_idx)), g_torture_tests[test_idx]->label); + String8 result = str8f(arena, "%S/%S", test_info->layer, test_info->label); + return result; } internal String8List @@ -61,9 +43,10 @@ t_test_group_from_name(Arena *arena, String8 pattern) { Temp scratch = scratch_begin(&arena, 1); String8List matches = {0}; - for EachIndex(i, g_torture_test_count) { - if (str8_match_wildcard(t_test_name_from_idx(scratch.arena, i), pattern, 0)) { - str8_list_push(arena, &matches, t_group_from_test_idx(i)); + for EachIndex(i, test_infos_count) { + TestInfo *test_info = g_sorted_test_infos[i]; + if (str8_match_wildcard(t_name_from_test_info(scratch.arena, test_info), pattern, 0)) { + str8_list_push(arena, &matches, test_info->layer); } } scratch_end(scratch); @@ -72,17 +55,6 @@ t_test_group_from_name(Arena *arena, String8 pattern) //////////////////////////////// -internal void -t_break_if_debugger_present(void) -{ -#if OS_WINDOWS - if(IsDebuggerPresent()) - { - DebugBreak(); - } -#endif -} - internal Linker t_id_linker(void) { @@ -196,7 +168,7 @@ t_run_caller(void *raw_ctx) if (ctx->test->skip) { ctx->result.status = TestStatus_Skip; } else { - ctx->test->r(scratch.arena, ctx->user_data, &ctx->result, &test_out); + ctx->test->test_fn(scratch.arena, &ctx->result, &test_out); } if (ctx->result.status == TestStatus_Fail || ctx->result.status == TestStatus_Crash) { @@ -215,7 +187,7 @@ t_run_caller(void *raw_ctx) } internal TestResult -t_run(T_Test *test, String8 user_data) +t_run(TestInfo *test, String8 user_data) { T_RunCtx ctx = { .test = test, .user_data = user_data, .result.status = TestStatus_Fail }; t_run_caller(&ctx); @@ -915,31 +887,19 @@ t_match_linef(String8 *output, char *fmt, ...) return is_match; } -internal int -t_test_compar(const void *raw_a, const void *raw_b) +force_inline int +t_test_info_is_before(TestInfo **a, TestInfo **b) { - const T_Test *a = raw_a, *b = raw_b; - String8 group_a = t_group_from_test((T_Test *)a); - String8 group_b = t_group_from_test((T_Test *)b); - int cmp = str8_compar(group_a, group_b, 0); - if (cmp == 0) { - cmp = u64_compar(&a->decl_line, &b->decl_line); + String8 layer_a = a[0]->layer; + String8 layer_b = b[0]->layer; + int cmp = str8_compar(layer_a, layer_b, 0); + if(cmp == 0) + { + cmp = u64_compar(&a[0]->decl_line, &b[0]->decl_line); } return cmp; } -force_inline int -t_test_is_before(void *raw_a, void *raw_b) -{ - return t_test_compar(raw_a, raw_b) < 0; -} - -force_inline int -t_test_ptr_is_before(void *raw_a, void *raw_b) -{ - return t_test_compar(*((T_Test * const *)raw_a), *((T_Test * const *)raw_b)) < 0; -} - internal String8List t_file_paths_from_dir(Arena *arena, String8 dir) { @@ -1079,8 +1039,6 @@ t_help(void) fprintf(stderr, " torture +* Force-run all tests\n"); } -internal void t_dbg_register_script_tests(Arena *arena, String8 folder_path); - internal void t_entry_point(CmdLine *cmdline) { @@ -1113,14 +1071,8 @@ t_entry_point(CmdLine *cmdline) // Gather tests { - // register debugger tests - String8 test_folder_path = str8f(scratch.arena, "%S/torture/dbg_tests", t_src_path()); - t_dbg_register_script_tests(scratch.arena, test_folder_path); - - // sort tests - g_torture_tests = push_array(scratch.arena, T_Test *, g_torture_test_count); - for EachIndex(i, g_torture_test_count) { g_torture_tests[i] = &g_torture_tests_[i]; } - radsort(g_torture_tests, g_torture_test_count, t_test_ptr_is_before); + for EachIndex(i, test_infos_count) { g_sorted_test_infos[i] = &test_infos[i]; } + radsort(g_sorted_test_infos, test_infos_count, t_test_info_is_before); } // @@ -1129,8 +1081,8 @@ t_entry_point(CmdLine *cmdline) { if (cmd_line_has_flag(cmdline, str8_lit("list"))) { PrintHeader("Tests"); - for EachIndex(i, g_torture_test_count) { - fprintf(stdout, " %s\n", g_torture_tests[i]->label); + for EachIndex(i, test_infos_count) { + fprintf(stdout, " %.*s\n", str8_varg(g_sorted_test_infos[i]->label)); } abort_self(0); } @@ -1197,17 +1149,24 @@ t_entry_point(CmdLine *cmdline) U64 match_count = 0; - for EachIndex(test_idx, g_torture_test_count) { + for EachIndex(test_idx, test_infos_count) { + TestInfo *test_info = g_sorted_test_infos[test_idx]; + // match test names - String8 test_name = t_test_name_from_idx(scratch.arena, test_idx); + String8 test_name = t_name_from_test_info(scratch.arena, test_info); if (str8_match_wildcard(test_name, t, StringMatchFlag_CaseInsensitive)) { + // TODO(rjf): do we really need to mutate the test infos here? this test won't + // even run, so I am not sure what setting the bit does - we already collect + // the tests that we *will* run +#if 0 // set skip flag switch (mode) { case Mode_Default: break; case Mode_Skip: g_torture_tests[test_idx]->skip = 1; break; case Mode_Force: g_torture_tests[test_idx]->skip = 0; break; } +#endif // append test when not in skipping mode if ( ! hash_map_search_string_u64(&hm, test_name)) { @@ -1283,8 +1242,9 @@ t_entry_point(CmdLine *cmdline) U64 max_group_size = 0; for EachIndex(i, target_indices.count) { U64 test_idx = target_indices.v[i]; - max_label_size = Max(max_label_size, cstring8_length((U8*)g_torture_tests[test_idx]->label)); - max_group_size = Max(max_group_size, t_group_from_test_idx(test_idx).size); + TestInfo *test_info = g_sorted_test_infos[test_idx]; + max_label_size = Max(max_label_size, test_info->label.size); + max_group_size = Max(max_group_size, test_info->layer.size); } U64 run_counters[TestStatus_COUNT] = {0}; @@ -1301,20 +1261,20 @@ t_entry_point(CmdLine *cmdline) if (i == 0) { PrintHeader("Tests"); } U64 target_idx = target_indices.v[i]; - T_Test *test = g_torture_tests[target_idx]; + TestInfo *test = g_sorted_test_infos[target_idx]; // print run progress U64 dots_min = 10; - U64 dots_count = (max_label_size - cstring8_length((U8*)test->label)) + dots_min; + U64 dots_count = (max_label_size - test->label.size) + dots_min; U64 curr_digit_count = count_digits_u64(i+1, 10); int idx_align_space_count = (int)(max_digit_count - curr_digit_count); fprintf(stdout, "[%.*s%llu/%llu] ", idx_align_space_count, spaces, (unsigned long long)i+1, (unsigned long long)target_indices.count); - fprintf(stdout, "%.*s %.*s/ %s", str8_varg(t_group_from_test(test)), (int)(max_group_size - t_group_from_test(test).size), spaces, test->label); + fprintf(stdout, "%.*s %.*s/ %.*s", str8_varg(test->layer), (int)(max_group_size - test->layer.size), spaces, str8_varg(test->label)); fprintf(stdout, " %.*s ", (int)dots_count, dots); fflush(stdout); // setup output directory - g_wdir = push_str8f(scratch.arena, "%S/%s", g_out, test->label); + g_wdir = str8f(scratch.arena, "%S/%S", g_out, test->label); g_wdir = full_path_from_path(scratch.arena, g_wdir); // delete files from last run in the work directory @@ -1330,7 +1290,7 @@ t_entry_point(CmdLine *cmdline) // run test U64 run_start_time = now_time_us(); - TestResult result = t_run(test, test->user_data); + TestResult result = t_run(test, str8_zero()); U64 run_end_time = now_time_us(); // update @@ -1345,6 +1305,7 @@ t_entry_point(CmdLine *cmdline) case TestStatus_Pass: {status_name_cstr = "PASS"; color_cstr = T_GREEN;}break; case TestStatus_Fail: {status_name_cstr = "FAIL"; color_cstr = T_RED;}break; case TestStatus_Crash:{status_name_cstr = "CRASH"; color_cstr = T_RED;}break; + case TestStatus_Skip: {status_name_cstr = "SKIP"; color_cstr = T_YELLOW;}break; } // print run status @@ -1404,7 +1365,7 @@ t_entry_point(CmdLine *cmdline) U64 slow_count = 0; for EachElement(i, slowest) { Slowest s = slowest[i]; - if (s.target_idx >= g_torture_test_count) { break; } + if (s.target_idx >= test_infos_count) { break; } slow_count += 1; } @@ -1413,20 +1374,21 @@ t_entry_point(CmdLine *cmdline) U64 group_max = 0; for EachElement(i, slowest) { Slowest s = slowest[i]; - label_max = Max(strlen(g_torture_tests[s.target_idx]->label), label_max); - group_max = Max(t_group_from_test_idx(s.target_idx).size, group_max); + label_max = Max(g_sorted_test_infos[s.target_idx]->label.size, label_max); + group_max = Max(g_sorted_test_infos[s.target_idx]->layer.size, group_max); } fprintf(stderr, " \nSlow Tests\n"); for EachElement(i, slowest) { Slowest s = slowest[i]; - if (s.target_idx >= g_torture_test_count) { break; } + if (s.target_idx >= test_infos_count) { break; } + TestInfo *test_info = g_sorted_test_infos[i]; String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); - fprintf(stderr, " %.*s %.*s/ %s %.*s %.*s\n", - str8_varg(t_group_from_test_idx(s.target_idx)), - (int)(group_max - t_group_from_test_idx(s.target_idx).size), spaces, - g_torture_tests[s.target_idx]->label, - (int)(label_max - strlen(g_torture_tests[s.target_idx]->label)) + 4, dots, + fprintf(stderr, " %.*s %.*s/ %.*s %.*s %.*s\n", + str8_varg(test_info->layer), + (int)(group_max - test_info->layer.size), spaces, + str8_varg(test_info->label), + (int)(label_max - test_info->layer.size) + 4, dots, str8_varg(elapsed_time)); } } diff --git a/src/torture/torture.h b/src/torture/torture.h index a2ca2d69..22e7a5c3 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -11,56 +11,15 @@ #define T_YELLOW "\x1b[33m" #define T_BLUE "\x1b[34m" -#define T_RunSig(name) void t_##name(Arena *arena, String8 user_data, TestResult *result_out, String8List *test_out) -typedef void (*T_Run)(Arena *arena, String8 user_data, TestResult *result_out, String8List *test_out); - typedef struct { - char *file; - char *label; - int decl_line; - T_Run r; - B32 skip; - String8 user_data; -} T_Test; - -typedef struct -{ - T_Test *test; + TestInfo *test; String8 user_data; TestResult result; } T_RunCtx; -extern U64 g_torture_test_count; -extern T_Test **g_torture_tests; -extern T_Test g_torture_tests_[0xffffff]; - -internal void t_break_if_debugger_present(void); - -#define T_AddTest(name, f, l, skip, ...) \ -T_RunSig(name); \ -__VA_ARGS__ void t_add_test_##name(void) \ -{ \ -g_torture_tests_[g_torture_test_count++] = (T_Test){ f, Stringify(name), l, &t_##name, skip }; \ -} - -#if COMPILER_MSVC -# pragma section(".CRT$XCU", read) -# define TEST_(name, skip) \ -T_AddTest(name, __FILE__, __LINE__, skip) \ -__declspec(allocate(".CRT$XCU")) void(*r_##name)(void) = t_add_test_##name; \ -__pragma(comment(linker, "/include:" Stringify(r_##name))) -#else -# define TEST_(name, skip) T_AddTest(name, __FILE__, __LINE__, skip, __attribute__((constructor))) -#endif - -#define TEST(name) \ -TEST_(name, 0) \ -T_RunSig(name) -#define SKIP(name) \ -TEST_(name, 1) \ -T_RunSig(name) - +#define TEST(name) Test(name) +#define SKIP(name) SkippedTest(name) #define T_Ok(c) TestCheck(c) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) @@ -88,7 +47,7 @@ internal String8 t_make_file_path(Arena *arena, String8 name); // test runner internal void t_run_caller(void *raw_ctx); internal void t_run_fail_handler(void *raw_ctx); -internal TestResult t_run(T_Test *test, String8 user_data); +internal TestResult t_run(TestInfo *test, String8 user_data); // tools internal String8 t_radbin_path(void); From 8564884d76d908c322510d311c92fb3aef708123 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 10:29:53 -0700 Subject: [PATCH 704/850] raddbg: stepping regression tests --- project.raddbg | 5 +- src/base/base_processes.h | 1 + src/base/base_strings.c | 15 +++++ src/base/base_strings.h | 1 + src/base/base_test.h | 2 +- src/linux/base/linux_base.c | 7 +++ src/raddbg/raddbg_core.c | 29 ++++++++-- src/raddbg/tests/raddbg_tests.c | 97 ++++++++++++++++++++++++++++++++- src/torture/torture.c | 8 +-- src/torture/torture.h | 7 ++- src/win32/base/win32_base.c | 8 +++ 11 files changed, 162 insertions(+), 18 deletions(-) diff --git a/project.raddbg b/project.raddbg index 9d5d96f4..eccd0b71 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,7 +7,6 @@ target: working_directory: build arguments: "--user:raddbg_test.user --project:raddbg_test.project" debug_subprocesses: 0 - enabled: 1 } target: { @@ -41,5 +40,7 @@ target: target: { executable: "build/torture.exe" - working_directory: "build/" + working_directory: build + enabled: 1 + arguments: "raddbg/* --gui" } diff --git a/src/base/base_processes.h b/src/base/base_processes.h index c1250fc1..78fc7969 100644 --- a/src/base/base_processes.h +++ b/src/base/base_processes.h @@ -82,6 +82,7 @@ internal U32 get_process_start_time_unix(void); //~ rjf: @per_os_impl Child Processes internal Process process_launch(ProcessLaunchParams *params); +internal U64 pid_from_process(Process process); internal B32 process_join(Process process, U64 endt_us, U64 *exit_code_out); internal void process_detach(Process process); internal B32 process_kill(Process process); diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 45c8a7a3..27af8e7e 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1491,6 +1491,21 @@ program_data_folder_prefix_from_os(OperatingSystem os) return result; } +internal String8 +program_ext_postfix_from_os(OperatingSystem os) +{ + String8 result = {0}; + switch(os) + { + default:{}break; + case OperatingSystem_Windows: + { + result = s(".exe"); + }break; + } + return result; +} + internal String8 str8_chop_last_slash(String8 string) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index cbe9ad53..4d26ce59 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -324,6 +324,7 @@ g_path_style_map[] = }; internal String8 program_data_folder_prefix_from_os(OperatingSystem os); +internal String8 program_ext_postfix_from_os(OperatingSystem os); internal String8 str8_chop_last_slash(String8 string); internal String8 str8_skip_last_slash(String8 string); diff --git a/src/base/base_test.h b/src/base/base_test.h index c988062c..d9350812 100644 --- a/src/base/base_test.h +++ b/src/base/base_test.h @@ -23,7 +23,7 @@ struct TestResult char *fail_cond; }; -#define TEST_FUNCTION_SIG(name) void name(Arena *arena, TestResult *result_out, String8List *test_out) +#define TEST_FUNCTION_SIG(name) void name(Arena *arena, CmdLine *cmdline, String8 test_artifacts_path, TestResult *result_out, String8List *test_out) #define TEST_FUNCTION_DEF(name) TEST_FUNCTION_SIG(test__##name) typedef TEST_FUNCTION_SIG(TestFunctionType); diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 0dc09903..aaaf71bf 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1299,6 +1299,13 @@ process_launch(ProcessLaunchParams *params) return handle; } +internal U64 +pid_from_process(Process process) +{ + U64 result = process.u64[0]; + return result; +} + internal B32 process_join(Process process, U64 endt_us, U64 *exit_code_out) { diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 5a098328..df12f7be 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12382,12 +12382,6 @@ rd_frame(void) // rjf: request frame rd_request_frame(); - // rjf: record 'ack' for this command - if(kind != RD_CmdKind_Null) - { - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "ack:{cmd:%S}\n", cmd->name); - } - // rjf: process command CFG_Node *cfg = &cfg_nil_node; String8 dst_path = {0}; @@ -12649,6 +12643,29 @@ rd_frame(void) str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " explanation: \"%S\"\n", escaped_from_raw_str8(scratch.arena, explanation_string)); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); } + { + D_Event evt = d_ctrl_last_stop_event(); + U64 vaddr = evt.rip_vaddr; + D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + U64 voff = d_voff_from_vaddr(module, vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " lines:\n {\n"); + for EachNode(n, D_LineNode, lines.first) + { + D_Line line = n->v; + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " file_path: \"%S\"\n", line.file_path); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " line_num: %I64d\n", line.pt.line); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " column_num: %I64d\n", line.pt.column); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range_min: 0x%I64x\n", line.voff_range.min); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range_max: 0x%I64x\n", line.voff_range.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + } + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + } { str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " threads:\n {\n"); D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index 0c1ab525..2a3a607d 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -1,9 +1,102 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -Test(stepping_regressions) +internal String8 +rd_test__raddbg_path(Arena *arena, CmdLine *cmdline) { - + String8 raddbg_exe_name = cmd_line_has_flag(cmdline, s("gui")) ? s("raddbg") : s("raddbg_non_graphical"); + String8 raddbg_exe_filename = str8f(arena, "%S/%S%S", get_process_info()->binary_path, raddbg_exe_name, program_ext_postfix_from_os(OperatingSystem_CURRENT)); + return raddbg_exe_filename; +} + +internal Process +rd_test__open_debugger(CmdLine *cmdline, String8 test_artifacts_path, String8 target_cmd_line) +{ + Temp scratch = scratch_begin(0, 0); + String8 raddbg_path = rd_test__raddbg_path(scratch.arena, cmdline); + String8 user_file_path = str8f(scratch.arena, "%S/test.raddbg_user", test_artifacts_path);\ + delete_file_at_path(user_file_path); + Process process = launch_cmd_linef("%S --gen_crash_dump --user:test.raddbg_user --logs:logs %S", raddbg_path, target_cmd_line); + scratch_end(scratch); + return process; +} + +internal void +rd_test__close_debugger(Process process) +{ + process_kill(process); +} + +internal String8 +rd_test__ipc_cmd(Arena *arena, CmdLine *cmdline, String8 test_artifacts_path, U64 debugger_pid, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 raddbg_path = rd_test__raddbg_path(scratch.arena, cmdline); + String8 stdout_path = str8f(scratch.arena, "%S/ipc_output", test_artifacts_path); + Process process = launch_cmd_linef("%S --ipc --pid:%I64u %S > %S", raddbg_path, debugger_pid, string, stdout_path); + process_join(process, max_U64, 0); + String8 response = data_from_file_path(arena, stdout_path); + delete_file_at_path(stdout_path); + scratch_end(scratch); + return response; +} + +Test(stepping) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 mule_main_exe_path = str8f(scratch.arena, "%S/%S%S", get_process_info()->binary_path, s("mule_main"), program_ext_postfix_from_os(OperatingSystem_CURRENT)); + struct + { + String8 cmdline; + String8 start_symbol; + B32 step_over_on_even; + } + test_cases[] = + { + { mule_main_exe_path, s("mule_main"), 0 }, + { mule_main_exe_path, s("mule_main"), 1 }, + { mule_main_exe_path, s("control_flow_stepping_tests"), 0 }, + { mule_main_exe_path, s("control_flow_stepping_tests"), 1 }, + }; + for EachElement(test_case_idx, test_cases) + { + String8 test_cmdline = test_cases[test_case_idx].cmdline; + String8 start_symbol = test_cases[test_case_idx].start_symbol; + B32 step_over_on_even = test_cases[test_case_idx].step_over_on_even; + Process debugger = rd_test__open_debugger(cmdline, test_artifacts_path, test_cmdline); + U64 debugger_pid = pid_from_process(debugger); + String8 next_step_cmd = {0}; + rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, str8f(scratch.arena, "run_to_name %S", start_symbol)); + for(U64 cmd_idx = 0;; cmd_idx += 1) + { + String8 step_cmd = s("step_into"); + if((cmd_idx % 2 == 0 && step_over_on_even) || (cmd_idx % 2 == 1 && !step_over_on_even)) + { + step_cmd = s("step_over"); + } + if(next_step_cmd.size != 0) + { + step_cmd = next_step_cmd; + MemoryZeroStruct(&next_step_cmd); + } + String8 step_response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, step_cmd); + String8 state_response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, s("state")); + MD_Node *state_response_tree = md_tree_from_string(scratch.arena, state_response); + MD_Node *state = md_child_from_string(state_response_tree, s("state"), 0); + U64 ip_vaddr = 0; + try_u64_from_str8_c_rules(md_child_from_string(state, s("ip"), 0)->first->string, &ip_vaddr); + if(ip_vaddr != 0 && md_child_from_string(state, s("lines"), 0)->first == &md_nil_node) + { + next_step_cmd = s("step_out"); + } + if(cmd_idx >= 100) + { + break; + } + } + rd_test__close_debugger(debugger); + } + scratch_end(scratch); } #if 0 diff --git a/src/torture/torture.c b/src/torture/torture.c index e4d75236..d1949fd1 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -168,7 +168,7 @@ t_run_caller(void *raw_ctx) if (ctx->test->skip) { ctx->result.status = TestStatus_Skip; } else { - ctx->test->test_fn(scratch.arena, &ctx->result, &test_out); + ctx->test->test_fn(scratch.arena, ctx->cmdline, g_wdir, &ctx->result, &test_out); } if (ctx->result.status == TestStatus_Fail || ctx->result.status == TestStatus_Crash) { @@ -187,9 +187,9 @@ t_run_caller(void *raw_ctx) } internal TestResult -t_run(TestInfo *test, String8 user_data) +t_run(CmdLine *cmdline, TestInfo *test, String8 user_data) { - T_RunCtx ctx = { .test = test, .user_data = user_data, .result.status = TestStatus_Fail }; + T_RunCtx ctx = { .test = test, .cmdline = cmdline, .user_data = user_data, .result.status = TestStatus_Fail }; t_run_caller(&ctx); if (ctx.result.status == TestStatus_Fail || ctx.result.status == TestStatus_Crash) { @@ -1290,7 +1290,7 @@ t_entry_point(CmdLine *cmdline) // run test U64 run_start_time = now_time_us(); - TestResult result = t_run(test, str8_zero()); + TestResult result = t_run(cmdline, test, str8_zero()); U64 run_end_time = now_time_us(); // update diff --git a/src/torture/torture.h b/src/torture/torture.h index 22e7a5c3..97cfd597 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -13,8 +13,9 @@ typedef struct { - TestInfo *test; - String8 user_data; + TestInfo *test; + CmdLine *cmdline; + String8 user_data; TestResult result; } T_RunCtx; @@ -47,7 +48,7 @@ internal String8 t_make_file_path(Arena *arena, String8 name); // test runner internal void t_run_caller(void *raw_ctx); internal void t_run_fail_handler(void *raw_ctx); -internal TestResult t_run(TestInfo *test, String8 user_data); +internal TestResult t_run(CmdLine *cmdline, TestInfo *test, String8 user_data); // tools internal String8 t_radbin_path(void); diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index a7bf6c0f..1506a3e7 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1421,6 +1421,14 @@ process_launch(ProcessLaunchParams *params) return result; } +internal U64 +pid_from_process(Process process) +{ + HANDLE process_handle = (HANDLE)process.u64[0]; + U64 result = (U64)GetProcessId(process_handle); + return result; +} + internal B32 process_join(Process process, U64 endt_us, U64 *exit_code_out) { From a0bf82516923e0c77c5dd5cb941355b03bfd7379 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 10:35:18 -0700 Subject: [PATCH 705/850] run-to-name, use to 'seed' test binary cases' --- build.bat | 2 +- src/base/base_strings.c | 15 +++++++++++++++ src/base/base_strings.h | 1 + src/base/tests/base_tests.c | 2 +- src/dbg_engine/dbg_engine.mdesk | 1 + src/dbg_engine/dbg_engine_ctrl.c | 13 +++++++++++++ src/dbg_engine/dbg_engine_user.c | 7 +++++++ src/dbg_engine/generated/dbg_engine.meta.h | 1 + src/mdesk/tests/mdesk_tests.c | 2 +- src/mule/mule_main.cpp | 5 ----- src/raddbg/generated/raddbg.meta.c | 6 ++++-- src/raddbg/generated/raddbg.meta.h | 3 ++- src/window_manager/window_manager_stub.c | 4 +--- 13 files changed, 48 insertions(+), 14 deletions(-) diff --git a/build.bat b/build.bat index 1f8b727a..5c9c71d4 100644 --- a/build.bat +++ b/build.bat @@ -140,7 +140,7 @@ popd :: --- Build Everything (@build_targets) -------------------------------------- pushd build if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg.exe || exit /b 1 -if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% -DWM_STUB=1 -DWM_STUB_DEFAULT_REFRESH_RATE=60.f -DR_BACKEND=R_BACKEND_STUB ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg_non_graphical.exe || exit /b 1 +if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% -DWM_STUB=1 -DR_BACKEND=R_BACKEND_STUB ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg_non_graphical.exe || exit /b 1 if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% %linker% /NOIMPLIB %linker% /NATVIS:"%~dp0\src\linker\linker.natvis" %out%radlink.exe || exit /b 1 if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% %out%radbin.exe || exit /b 1 if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% %out%raddump.exe || exit /b 1 diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 27af8e7e..5373f087 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1475,6 +1475,21 @@ str8_from_version(Arena *arena, U64 version) //////////////////////////////// //~ rjf: String Path Helpers +internal String8 +default_exe_name_suffix_from_os(OperatingSystem os) +{ + String8 result = {0}; + switch(os) + { + default:{}break; + case OperatingSystem_Windows: + { + result = s(".exe"); + }break; + } + return result; +} + internal String8 program_data_folder_prefix_from_os(OperatingSystem os) { diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 4d26ce59..dadcf5ac 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -323,6 +323,7 @@ g_path_style_map[] = { str8_lit_comp("system"), PathStyle_SystemAbsolute }, }; +internal String8 default_exe_name_suffix_from_os(OperatingSystem os); internal String8 program_data_folder_prefix_from_os(OperatingSystem os); internal String8 program_ext_postfix_from_os(OperatingSystem os); diff --git a/src/base/tests/base_tests.c b/src/base/tests/base_tests.c index 2e8c5e6a..522e7844 100644 --- a/src/base/tests/base_tests.c +++ b/src/base/tests/base_tests.c @@ -1,7 +1,7 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -TEST(str8_list_substr) +Test(str8_list_substr) { String8List zero_list = {0}; diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 1114816d..b590c2ac 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -27,6 +27,7 @@ D_CmdTable: // | | | | //- rjf: high-level composite target control operations {RunToLine 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" "$text_pt," } + {RunToName 1 1 1 0 "query:procedures" String null Nil Null 0 0 0 0 0 1 1 Play "run_to_name" "Run To Name" "Runs until a particular symbol name is hit." "" "" } {Run 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" "" } {Restart 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all attached processes, then launches all active targets." "restart,retry" "" } {StepInto 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)." "" "" } diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 3bc802e1..bfbc5e8b 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -4830,9 +4830,13 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti U64 eval_modules_count = Max(1, entity_ctx->entity_kind_counts[D_EntityKind_Module]); E_Module *eval_modules = push_array(arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &e_module_nil; + E_String2NumMap *eval_module_from_name_map = push_array(arena, E_String2NumMap, 1); + eval_module_from_name_map[0] = e_string2num_map_make(arena, eval_modules_count*2); U64 eval_dbg_infos_count = Max(1, entity_ctx->entity_kind_counts[D_EntityKind_Module]); E_DbgInfo *eval_dbg_infos = push_array(arena, E_DbgInfo, eval_dbg_infos_count); E_DbgInfo *eval_dbg_infos_primary = &e_dbg_info_nil; + E_String2NumMap *eval_dbg_info_from_name_map = push_array(arena, E_String2NumMap, 1); + eval_dbg_info_from_name_map[0] = e_string2num_map_make(arena, eval_dbg_infos_count*2); { U64 eval_module_idx = 0; U64 eval_dbg_info_idx = 0; @@ -4946,12 +4950,16 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti } //- rjf: fill debug info + String8 debug_info_path = d_entity_child_from_kind(mod, D_EntityKind_DebugInfoPath)->string; eval_dbg_infos[eval_dbg_info_idx].dbgi_key = dbgi_key; eval_dbg_infos[eval_dbg_info_idx].rdi = rdi; + eval_dbg_infos[eval_dbg_info_idx].name = debug_info_path; if(mod == module) { eval_dbg_infos_primary = &eval_dbg_infos[eval_dbg_info_idx]; } + e_string2num_map_insert(arena, eval_dbg_info_from_name_map, debug_info_path, eval_dbg_info_idx+1); + e_string2num_map_insert(arena, eval_dbg_info_from_name_map, str8_skip_last_slash(debug_info_path), eval_dbg_info_idx+1); eval_dbg_info_idx += 1; //- rjf: fill evaluation module info @@ -4960,10 +4968,13 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti eval_modules[eval_module_idx].vaddr_range = mod->vaddr_range; eval_modules[eval_module_idx].space = e_space_make(D_EvalSpaceKind_Entity); eval_modules[eval_module_idx].space.u64_0 = (U64)process; + eval_modules[eval_module_idx].name = mod->string; if(mod == module) { eval_modules_primary = &eval_modules[eval_module_idx]; } + e_string2num_map_insert(arena, eval_module_from_name_map, mod->string, eval_module_idx+1); + e_string2num_map_insert(arena, eval_module_from_name_map, str8_skip_last_slash(mod->string), eval_module_idx+1); eval_module_idx += 1; } } @@ -4994,11 +5005,13 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti ctx->dbg_infos = eval_dbg_infos; ctx->dbg_infos_count = eval_dbg_infos_count; ctx->primary_dbg_info = eval_dbg_infos_primary; + ctx->dbg_info_from_name_map = eval_dbg_info_from_name_map; //- rjf: fill modules ctx->modules = eval_modules; ctx->modules_count = eval_modules_count; ctx->primary_module = eval_modules_primary; + ctx->module_from_name_map = eval_module_from_name_map; //- rjf: fill space hooks ctx->space_gen = d_ctrl_eval_space_gen; diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 7e3d2661..dbef306e 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -2002,6 +2002,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P } d_cmd(D_CmdKind_Run); }break; + case D_CmdKind_RunToName: + { + run_extra_bps.count = 1; + run_extra_bps.v = push_array(scratch.arena, D_Breakpoint, 1); + run_extra_bps.v[0].vaddr_expr = str8_copy(scratch.arena, params->string); + d_cmd(D_CmdKind_Run); + }break; case D_CmdKind_Run: { D_EntityArray processes = d_entity_array_from_kind(D_EntityKind_Process); diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index d6983b68..ddb3b8ee 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -24,6 +24,7 @@ D_CmdKind_Halt, D_CmdKind_SoftHaltRefresh, D_CmdKind_SetThreadIP, D_CmdKind_RunToLine, +D_CmdKind_RunToName, D_CmdKind_Run, D_CmdKind_Restart, D_CmdKind_StepInto, diff --git a/src/mdesk/tests/mdesk_tests.c b/src/mdesk/tests/mdesk_tests.c index 8c3b6a13..d9c34880 100644 --- a/src/mdesk/tests/mdesk_tests.c +++ b/src/mdesk/tests/mdesk_tests.c @@ -1,7 +1,7 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -SkippedTest(md_tokenizer) +SkippedTest(tokenizer) { MD_TokenizeResult result; diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index c32dc590..c48283fe 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -6,8 +6,6 @@ ** stepping, breakpoints, evaluation, cross-module calls. */ -#define EvalTest(expr, match) - #if _WIN32 && _DEBUG #pragma comment(linker, "/nodefaultlib:libcmt") #pragma comment(lib, "libcmtd") @@ -492,9 +490,6 @@ type_coverage_eval_tests(void) memory_, 6 }; - EvalTest(dynamic[0].i, 100); EvalTest(dynamic[0].f, 1.f); - EvalTest(dynamic[1].i, 101); EvalTest(dynamic[1].f, 2.f); - EvalTest(dynamic[2].i, 102); EvalTest(dynamic[2].f, 4.f); TemplatedDynamicArray templated_dynamic = {dynamic.pairs, dynamic.count}; TemplatedDynamicArray templated_dynamics[] = diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 03b8a348..fdd74a1c 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[363] = +RD_VocabInfo rd_vocab_info_table[364] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -192,6 +192,7 @@ RD_VocabInfo rd_vocab_info_table[363] = {str8_lit_comp("soft_halt_refresh"), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), str8_lit_comp(""), RD_IconKind_Refresh}, {str8_lit_comp("set_thread_ip"), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("run_to_line"), str8_lit_comp(""), str8_lit_comp("Run To Line"), str8_lit_comp(""), RD_IconKind_Play}, +{str8_lit_comp("run_to_name"), str8_lit_comp(""), str8_lit_comp("Run To Name"), str8_lit_comp(""), RD_IconKind_Play}, {str8_lit_comp("run"), str8_lit_comp(""), str8_lit_comp("Run"), str8_lit_comp(""), RD_IconKind_Play}, {str8_lit_comp("restart"), str8_lit_comp(""), str8_lit_comp("Restart"), str8_lit_comp(""), RD_IconKind_Redo}, {str8_lit_comp("step_into"), str8_lit_comp(""), str8_lit_comp("Step Into"), str8_lit_comp(""), RD_IconKind_StepInto}, @@ -578,7 +579,7 @@ Rng1U64 rd_reg_slot_range_table[49] = {OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[251] = +RD_CmdKindInfo rd_cmd_kind_info_table[252] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -596,6 +597,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[251] = { str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_to_name"), str8_lit_comp("Runs until a particular symbol name is hit."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index db003e8a..32e79fdf 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -78,6 +78,7 @@ RD_CmdKind_Halt, RD_CmdKind_SoftHaltRefresh, RD_CmdKind_SetThreadIP, RD_CmdKind_RunToLine, +RD_CmdKind_RunToName, RD_CmdKind_Run, RD_CmdKind_Restart, RD_CmdKind_StepInto, @@ -605,7 +606,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[363]; +extern RD_VocabInfo rd_vocab_info_table[364]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[49]; extern Rng1U64 rd_reg_slot_range_table[49]; diff --git a/src/window_manager/window_manager_stub.c b/src/window_manager/window_manager_stub.c index e6e252f8..060cd161 100644 --- a/src/window_manager/window_manager_stub.c +++ b/src/window_manager/window_manager_stub.c @@ -13,9 +13,7 @@ internal WM_SystemInfo * wm_get_system_info(void) { local_persist WM_SystemInfo g = {0}; -#if defined(WM_STUB_DEFAULT_REFRESH_RATE) - g.default_refresh_rate = WM_STUB_DEFAULT_REFRESH_RATE; -#endif + g.default_refresh_rate = 60.f; return &g; } From dc61f20e3b61d167f2b144d627be083d4e8b45d1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 15:40:08 -0700 Subject: [PATCH 706/850] sketch out stepping/eval exemplar testing; step-to-exit first pass --- project.raddbg | 2 +- src/base/base_test.h | 10 +- src/dbg_engine/dbg_engine.mdesk | 1 + src/dbg_engine/dbg_engine_user.c | 112 ++++++++- src/dbg_engine/dbg_engine_user.h | 3 + src/dbg_engine/generated/dbg_engine.meta.h | 1 + src/disasm/disasm.c | 4 +- src/disasm/disasm.h | 2 +- src/mdesk/mdesk.c | 104 ++++++++ src/mdesk/mdesk.h | 2 + src/mule/mule_main.cpp | 12 +- src/raddbg/generated/raddbg.meta.c | 12 +- src/raddbg/generated/raddbg.meta.h | 10 +- src/raddbg/raddbg.mdesk | 1 + src/raddbg/raddbg_core.c | 67 ++++- src/raddbg/raddbg_core.h | 3 +- src/raddbg/raddbg_main.c | 10 +- src/raddbg/tests/raddbg_tests.c | 275 ++++++++++++++++++--- src/torture/torture.c | 10 +- src/x64/disasm/x64_disasm.c | 2 +- 20 files changed, 568 insertions(+), 75 deletions(-) diff --git a/project.raddbg b/project.raddbg index eccd0b71..7ba34992 100644 --- a/project.raddbg +++ b/project.raddbg @@ -41,6 +41,6 @@ target: { executable: "build/torture.exe" working_directory: build + arguments: "raddbg/*" enabled: 1 - arguments: "raddbg/* --gui" } diff --git a/src/base/base_test.h b/src/base/base_test.h index d9350812..19e87a88 100644 --- a/src/base/base_test.h +++ b/src/base/base_test.h @@ -23,7 +23,7 @@ struct TestResult char *fail_cond; }; -#define TEST_FUNCTION_SIG(name) void name(Arena *arena, CmdLine *cmdline, String8 test_artifacts_path, TestResult *result_out, String8List *test_out) +#define TEST_FUNCTION_SIG(name) void name(Arena *arena, CmdLine *cmdline, String8 test_exemplars_path, String8 test_artifacts_path, TestResult *result_out, String8List *test_out) #define TEST_FUNCTION_DEF(name) TEST_FUNCTION_SIG(test__##name) typedef TEST_FUNCTION_SIG(TestFunctionType); @@ -76,10 +76,18 @@ TEST_FUNCTION_DEF(name) #define SkippedTest(name) DeclareTest(name, 1)\ TEST_FUNCTION_DEF(name) +#define test_out(string) str8_list_push(arena, test_out, (string)) +#define test_outf(...) str8_list_pushf(arena, test_out, __VA_ARGS__) + #define TestCheck(c) do { if (!(c)) {\ *result_out = (TestResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) };\ if(debugger_is_attached()) { Trap(); }\ return;\ } } while(0) +#define TestSkip() do {\ +*result_out = (TestResult){ .status = TestStatus_Skip };\ +return;\ +} while(0) + #endif // BASE_TEST_H diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index b590c2ac..98193d7e 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -21,6 +21,7 @@ D_CmdTable: // | | | | {StepIntoLine 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" "" } {StepOverLine 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" "" } {StepOut 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the first instruction after the current scope is exited." "" "" } + {StepToExit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_to_exit" "Step To Exit" "Runs to the first encountered instruction which will exit the current scope." "" "" } {Halt 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all attached processes." "pause" "" } {SoftHaltRefresh 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all attached processes to collect data, and then resumes them." "" "" } {SetThreadIP 0 1 0 0 "" Vaddr null Nil Null 0 0 0 0 1 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the specified thread's instruction pointer at the specified address." "" "" } diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index dbef306e..7c2ec311 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -447,6 +447,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) DASM_InstFlag_UnconditionalJump| DASM_InstFlag_ChangesStackPointer| DASM_InstFlag_Return, + 0, arch, line_vaddr_rng.min, machine_code); @@ -641,6 +642,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) DASM_InstFlag_UnconditionalJump| DASM_InstFlag_ChangesStackPointer| DASM_InstFlag_Return, + 0, arch, line_vaddr_rng.min, machine_code); @@ -807,7 +809,7 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) { result.good_read = 1; String8 code = code_slice.data; - DASM_CtrlFlowInfo ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, DASM_InstFlag_Branch|DASM_InstFlag_UnconditionalJump|DASM_InstFlag_Return, arch, vaddr_range.min, code); + DASM_CtrlFlowInfo ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, DASM_InstFlag_Branch|DASM_InstFlag_UnconditionalJump|DASM_InstFlag_Return, 0, arch, vaddr_range.min, code); // rjf: add traps at all jump destinations which do *not* fall into any of the scope's ranges for EachNode(exit_pt_n, DASM_CtrlFlowPointNode, ctrl_flow_info.exit_points.first) @@ -878,6 +880,105 @@ d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread) return result; } +internal D_TrapNet +d_trap_net_from_thread__step_to_exit(Arena *arena, D_Entity *thread) +{ + D_TrapNet result = {0}; + { + U64 read_endt_us = now_time_us() + 1000000; + Temp scratch = scratch_begin(&arena, 1); + Access *access = access_open(); + + // rjf: unpack thread + Arch arch = thread->arch; + U64 ip_vaddr = d_cached_ip_from_thread(thread->handle); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, ip_vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + D_CallStack callstack = d_call_stack_from_thread(access, thread->handle, 1, read_endt_us); + + // rjf: ip => enclosing scope's list(voff_range) + Rng1U64List scope_voff_rngs = {0}; + { + U64 ip_voff = d_voff_from_vaddr(module, ip_vaddr); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); + if(rdi != &rdi_parsed_nil) + { + RDI_Scope *scope = rdi_scope_from_voff(rdi, ip_voff); + U64 all_scope_voffs_count = 0; + U64 *all_scope_voffs = rdi_table_from_name(rdi, ScopeVOffData, &all_scope_voffs_count); + for(U64 voff_idx = scope->voff_range_first; voff_idx+1 < scope->voff_range_opl; voff_idx += 1) + { + Rng1U64 voff_range = r1u64(all_scope_voffs[voff_idx], all_scope_voffs[voff_idx+1]); + rng1u64_list_push(scratch.arena, &scope_voff_rngs, voff_range); + } + } + } + + // rjf: place traps at all possible exit points of all scope's ranges + result.good_read = 1; + for EachNode(n, Rng1U64Node, scope_voff_rngs.first) + { + Rng1U64 voff_range = n->v; + Rng1U64 vaddr_range = d_vaddr_range_from_voff_range(module, voff_range); + D_ProcessMemorySlice code_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, vaddr_range, 0, read_endt_us); + if(!code_slice.any_byte_bad) + { + result.good_read = 1; + String8 code = code_slice.data; + DASM_CtrlFlowInfo ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena, DASM_InstFlag_Branch|DASM_InstFlag_UnconditionalJump|DASM_InstFlag_Return, 1, arch, vaddr_range.min, code); + + // rjf: add traps at all jumps whose destinations do *not* fall into any of the scope's ranges + for EachNode(exit_pt_n, DASM_CtrlFlowPointNode, ctrl_flow_info.exit_points.first) + { + U64 jump_vaddr = exit_pt_n->v.vaddr; + U64 jump_dest_vaddr = exit_pt_n->v.jump_dest_vaddr; + B32 jump_dest_vaddr_is_out_of_scope = 1; + for EachNode(scope_n, Rng1U64Node, scope_voff_rngs.first) + { + if(contains_1u64(scope_n->v, d_voff_from_vaddr(module, jump_dest_vaddr))) + { + jump_dest_vaddr_is_out_of_scope = 0; + break; + } + } + if(jump_dest_vaddr_is_out_of_scope) + { + D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, jump_vaddr}; + d_trap_list_push(arena, &result.traps, &trap); + } + } + } + else + { + result.good_read = 0; + break; + } + } + + // rjf: use first unwind frame to generate trap + if(result.good_read && callstack.concrete_frames_count > 1) + { + ARCH_Info *arch_info = arch_info_from_arch(thread->arch); + U64 vaddr = arch_ip_from_reg_block(arch_info, callstack.concrete_frames[1]->regs); + D_Trap trap = {D_TrapFlag_EndStepping|D_TrapFlag_IgnoreStackPointerCheck, vaddr}; + d_trap_list_push(arena, &result.traps, &trap); + } + else + { + result.good_read = 0; + } + + // NOTE(rjf): we always want to support missing line info for "step to exit", because + // we should always be able to fall back to just using the unwind, so just always + // mark this bit as a success. + result.good_line_info = 1; + access_close(access); + scratch_end(scratch); + } + return result; +} + //////////////////////////////// //~ rjf: Debug Info Lookups @@ -1315,6 +1416,12 @@ d_ctrl_targets_running(void) return d_user_state->ctrl_is_running; } +internal U64 +d_stop_count(void) +{ + return d_user_state->stop_count; +} + //- rjf: active entity based queries internal DI_KeyList @@ -1610,6 +1717,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_EventKind_Stopped: { + d_user_state->stop_count += 1; d_user_state->ctrl_is_running = 0; d_user_state->ctrl_thread_run_state = 0; d_user_state->ctrl_soft_halt_issued = 0; @@ -1903,6 +2011,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepIntoLine: case D_CmdKind_StepOverLine: case D_CmdKind_StepOut: + case D_CmdKind_StepToExit: { D_Entity *thread = d_entity_from_handle(params->thread); if(thread == &d_entity_nil) @@ -1931,6 +2040,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepIntoLine: {trap_net = d_trap_net_from_thread__step_into_line(scratch.arena, thread);}break; case D_CmdKind_StepOverLine: {trap_net = d_trap_net_from_thread__step_over_line(scratch.arena, thread);}break; case D_CmdKind_StepOut: {trap_net = d_trap_net_from_thread__step_out_scope(scratch.arena, thread);}break; + case D_CmdKind_StepToExit: {trap_net = d_trap_net_from_thread__step_to_exit(scratch.arena, thread);}break; } B32 good_trap_net = (trap_net.good_read || !trap_net.good_line_info); if(good_trap_net && trap_net.traps.count != 0) diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index 5bffd3f4..8b57b40a 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -378,6 +378,7 @@ struct D_UserState D_EntityCtxRWStore *ctrl_entity_store; Arena *ctrl_stop_arena; D_Event ctrl_last_stop_event; + U64 stop_count; }; //////////////////////////////// @@ -424,6 +425,7 @@ internal D_TrapNet d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity internal D_TrapNet d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread); internal D_TrapNet d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread); internal D_TrapNet d_trap_net_from_thread__step_out_scope(Arena *arena, D_Entity *thread); +internal D_TrapNet d_trap_net_from_thread__step_to_exit(Arena *arena, D_Entity *thread); //////////////////////////////// //~ rjf: Debug Info Lookups @@ -460,6 +462,7 @@ internal U64 d_frame_index(void); internal D_RunKind d_ctrl_last_run_kind(void); internal U64 d_ctrl_last_run_frame_idx(void); internal B32 d_ctrl_targets_running(void); +internal U64 d_stop_count(void); //- rjf: active entity based queries internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index ddb3b8ee..39032533 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -20,6 +20,7 @@ D_CmdKind_StepOverInst, D_CmdKind_StepIntoLine, D_CmdKind_StepOverLine, D_CmdKind_StepOut, +D_CmdKind_StepToExit, D_CmdKind_Halt, D_CmdKind_SoftHaltRefresh, D_CmdKind_SetThreadIP, diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index dbac0a96..58532b5e 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -28,7 +28,7 @@ dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Synta //~ rjf: Control Flow Analysis internal DASM_CtrlFlowInfo -dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Arch arch, U64 vaddr, String8 code) +dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, B32 include_last_inst, Arch arch, U64 vaddr, String8 code) { Temp scratch = scratch_begin(&arena, 1); DASM_CtrlFlowInfo info = {0}; @@ -38,7 +38,7 @@ dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_point U64 inst_vaddr = vaddr+offset; offset += inst.size; info.total_size += inst.size; - if(inst.flags & exit_points_mask) + if(inst.flags & exit_points_mask || (include_last_inst && offset >= code.size)) { DASM_CtrlFlowPoint point = {0}; point.inst_flags = inst.flags; diff --git a/src/disasm/disasm.h b/src/disasm/disasm.h index dbdef297..816e9c19 100644 --- a/src/disasm/disasm.h +++ b/src/disasm/disasm.h @@ -183,7 +183,7 @@ internal DASM_Inst dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, Strin //////////////////////////////// //~ rjf: Control Flow Analysis -internal DASM_CtrlFlowInfo dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Arch arch, U64 vaddr, String8 code); +internal DASM_CtrlFlowInfo dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, B32 include_last_inst, Arch arch, U64 vaddr, String8 code); //////////////////////////////// //~ rjf: Parameter Type Functions diff --git a/src/mdesk/mdesk.c b/src/mdesk/mdesk.c index efe2a52f..46af783d 100644 --- a/src/mdesk/mdesk.c +++ b/src/mdesk/mdesk.c @@ -1205,6 +1205,110 @@ md_debug_string_list_from_tree(Arena *arena, MD_Node *root) return strings; } +internal String8List +md_string_list_from_tree(Arena *arena, MD_Node *root) +{ + String8List strings = {0}; + { + char *indentation = " "; + S32 depth = 0; + B32 delimit_with_newlines = 1; + for(MD_Node *node = root, *next = &md_nil_node; !md_node_is_nil(node); node = next) + { + Temp scratch = scratch_begin(&arena, 1); + + // rjf: get next recursion + MD_NodeRec rec = md_node_rec_depth_first_pre(node, root); + next = rec.next; + + // rjf: sanitize string + String8 node_string_sanitized = node->string; + { + MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, node_string_sanitized); + B32 is_simple_string = (tokenize.tokens.count == 1 && (tokenize.tokens.v[0].flags & (MD_TokenFlag_Identifier| + MD_TokenFlag_Numeric))); + if(tokenize.tokens.count > 0 && !is_simple_string) + { + node_string_sanitized = str8f(scratch.arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, node_string_sanitized)); + } + if(node_string_sanitized.size == 0 && node->first == &md_nil_node) + { + node_string_sanitized = s("\"\""); + } + } + + // rjf: turn off newline delimiting for implicit child sets + B32 next_delimit_with_newlines = delimit_with_newlines; + if(node->first != &md_nil_node && !(node->flags & (MD_NodeFlag_HasParenLeft|MD_NodeFlag_HasBracketLeft|MD_NodeFlag_HasBraceLeft))) + { + next_delimit_with_newlines = 0; + } + + // rjf: push node line + if(node_string_sanitized.size != 0) + { + str8_list_pushf(arena, &strings, "%.*s%S%S%S", delimit_with_newlines ? depth : 1, indentation, node_string_sanitized, + (rec.push_count != 0 && node_string_sanitized.size != 0) ? s(":") : s(""), + next_delimit_with_newlines ? s("\n") : s("")); + } + + // rjf: children -> open brace + if(rec.push_count != 0) + { + String8 opener_symbol = s(""); + if(node->flags & MD_NodeFlag_HasParenLeft) { opener_symbol = s("("); } + if(node->flags & MD_NodeFlag_HasBracketLeft) { opener_symbol = s("["); } + if(node->flags & MD_NodeFlag_HasBraceLeft) { opener_symbol = s("{"); } + if(opener_symbol.size != 0) + { + str8_list_pushf(arena, &strings, "%.*s%S\n", depth, indentation, opener_symbol); + } + } + + // rjf: descend + depth += rec.push_count; + delimit_with_newlines = next_delimit_with_newlines; + + // rjf: popping -> close braces + { + MD_Node *popped = node->parent; + for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1, popped = popped->parent) + { + String8 closer_symbol = s(""); + if(popped->flags & MD_NodeFlag_HasParenRight) { closer_symbol = s(")"); } + if(popped->flags & MD_NodeFlag_HasBracketRight) { closer_symbol = s("]"); } + if(popped->flags & MD_NodeFlag_HasBraceRight) { closer_symbol = s("}"); } + if(!delimit_with_newlines) + { + str8_list_push(arena, &strings, s("\n")); + delimit_with_newlines = 1; + } + else if(closer_symbol.size != 0) + { + str8_list_pushf(arena, &strings, "%.*s%S\n", (depth-1-pop_idx), indentation, closer_symbol); + } + } + } + + // rjf: ascend + depth -= rec.pop_count; + + scratch_end(scratch); + } + } + return strings; +} + +internal String8 +md_string_from_tree(Arena *arena, MD_Node *root) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strings = md_string_list_from_tree(scratch.arena, root); + String8 string = str8_list_join(arena, &strings, 0); + scratch_end(scratch); + return string; +} + //////////////////////////////// //~ rjf: Node Pointer List Functions diff --git a/src/mdesk/mdesk.h b/src/mdesk/mdesk.h index e7a55473..d6c6e5fe 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -336,6 +336,8 @@ internal MD_ParseResult md_parse_from_text(Arena *arena, String8 filename, Strin //~ rjf: Tree -> Text Functions internal String8List md_debug_string_list_from_tree(Arena *arena, MD_Node *root); +internal String8List md_string_list_from_tree(Arena *arena, MD_Node *root); +internal String8 md_string_from_tree(Arena *arena, MD_Node *root); //////////////////////////////// //~ rjf: Node Pointer List Functions diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index c48283fe..8aa12f8b 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -700,12 +700,14 @@ type_coverage_eval_tests(void) int_vector.push_back(6); int_vector.push_back(7); +#if 0 std::unordered_map people = { {"Peter", 1}, {"Oliver", 2}, {"Jack", 3}, }; +#endif std::vector *pint_vector = &int_vector; std::vector &rint_vector = int_vector; @@ -718,9 +720,9 @@ type_coverage_eval_tests(void) SizedKind sized_kind = SizedKind_C; - variadic_params("foo", 123, 456); - int x = (int)(Anonymous_D); + + variadic_params("foo", 123, 456); } //////////////////////////////// @@ -3198,7 +3200,6 @@ mule_main(int argc, char** argv) mule_init(); - // NOTE(allen): Eval Tests type_coverage_eval_tests(); mutating_variables_eval_tests(); @@ -3231,9 +3232,6 @@ mule_main(int argc, char** argv) exception_filter_test(); - markup_tests(); - - // NOTE(allen): Stepping Tests control_flow_stepping_tests(); indirect_call_jump_stepping_tests(); @@ -3264,6 +3262,8 @@ mule_main(int argc, char** argv) interrupt_stepping_tests(); + markup_tests(); + exception_stepping_tests(); return(0); diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index fdd74a1c..6332cb8c 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[364] = +RD_VocabInfo rd_vocab_info_table[365] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -188,6 +188,7 @@ RD_VocabInfo rd_vocab_info_table[364] = {str8_lit_comp("step_into_line"), str8_lit_comp(""), str8_lit_comp("Step Into (Line)"), str8_lit_comp(""), RD_IconKind_StepInto}, {str8_lit_comp("step_over_line"), str8_lit_comp(""), str8_lit_comp("Step Over (Line)"), str8_lit_comp(""), RD_IconKind_StepOver}, {str8_lit_comp("step_out"), str8_lit_comp(""), str8_lit_comp("Step Out"), str8_lit_comp(""), RD_IconKind_StepOut}, +{str8_lit_comp("step_to_exit"), str8_lit_comp(""), str8_lit_comp("Step To Exit"), str8_lit_comp(""), RD_IconKind_StepOut}, {str8_lit_comp("halt"), str8_lit_comp(""), str8_lit_comp("Halt"), str8_lit_comp(""), RD_IconKind_Pause}, {str8_lit_comp("soft_halt_refresh"), str8_lit_comp(""), str8_lit_comp("Soft Halt Refresh"), str8_lit_comp(""), RD_IconKind_Refresh}, {str8_lit_comp("set_thread_ip"), str8_lit_comp(""), str8_lit_comp("Set Thread IP"), str8_lit_comp(""), RD_IconKind_Null}, @@ -473,7 +474,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[39] = {str8_lit_comp("thread"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, }; -String8 rd_reg_slot_code_name_table[49] = +String8 rd_reg_slot_code_name_table[50] = { {0}, str8_lit_comp("machine"), @@ -520,13 +521,14 @@ str8_lit_comp("all_windows"), str8_lit_comp("non_graphical"), str8_lit_comp("prefer_new_tab"), str8_lit_comp("activate_with_single_click"), +str8_lit_comp("disable_addresses"), str8_lit_comp("dir2"), str8_lit_comp("string"), str8_lit_comp("cmd_name"), str8_lit_comp("wm_event"), }; -Rng1U64 rd_reg_slot_range_table[49] = +Rng1U64 rd_reg_slot_range_table[50] = { {0}, {OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(D_Handle)}, @@ -573,13 +575,14 @@ Rng1U64 rd_reg_slot_range_table[49] = {OffsetOf(RD_Regs, non_graphical), OffsetOf(RD_Regs, non_graphical) + sizeof(B32)}, {OffsetOf(RD_Regs, prefer_new_tab), OffsetOf(RD_Regs, prefer_new_tab) + sizeof(B32)}, {OffsetOf(RD_Regs, activate_with_single_click), OffsetOf(RD_Regs, activate_with_single_click) + sizeof(B32)}, +{OffsetOf(RD_Regs, disable_addresses), OffsetOf(RD_Regs, disable_addresses) + sizeof(B32)}, {OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)}, {OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)}, {OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)}, {OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[252] = +RD_CmdKindInfo rd_cmd_kind_info_table[253] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -593,6 +596,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[252] = { str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("step_out"), str8_lit_comp("Runs to the first instruction after the current scope is exited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_to_exit"), str8_lit_comp("Runs to the first encountered instruction which will exit the current scope."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 32e79fdf..ef417015 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -53,6 +53,7 @@ RD_RegSlot_AllWindows, RD_RegSlot_NonGraphical, RD_RegSlot_PreferNewTab, RD_RegSlot_ActivateWithSingleClick, +RD_RegSlot_DisableAddresses, RD_RegSlot_Dir2, RD_RegSlot_String, RD_RegSlot_CmdName, @@ -74,6 +75,7 @@ RD_CmdKind_StepOverInst, RD_CmdKind_StepIntoLine, RD_CmdKind_StepOverLine, RD_CmdKind_StepOut, +RD_CmdKind_StepToExit, RD_CmdKind_Halt, RD_CmdKind_SoftHaltRefresh, RD_CmdKind_SetThreadIP, @@ -498,6 +500,7 @@ B32 all_windows; B32 non_graphical; B32 prefer_new_tab; B32 activate_with_single_click; +B32 disable_addresses; Dir2 dir2; String8 string; String8 cmd_name; @@ -598,6 +601,7 @@ Z(getting_started)\ .non_graphical = rd_regs()->non_graphical,\ .prefer_new_tab = rd_regs()->prefer_new_tab,\ .activate_with_single_click = rd_regs()->activate_with_single_click,\ +.disable_addresses = rd_regs()->disable_addresses,\ .dir2 = rd_regs()->dir2,\ .string = rd_regs()->string,\ .cmd_name = rd_regs()->cmd_name,\ @@ -606,10 +610,10 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[364]; +extern RD_VocabInfo rd_vocab_info_table[365]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; -extern String8 rd_reg_slot_code_name_table[49]; -extern Rng1U64 rd_reg_slot_range_table[49]; +extern String8 rd_reg_slot_code_name_table[50]; +extern Rng1U64 rd_reg_slot_range_table[50]; extern String8 rd_binding_version_remap_old_name_table[9]; extern String8 rd_binding_version_remap_new_name_table[9]; extern String8 rd_icon_kind_text_table[75]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 2fb9b4ef..0278a5e7 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -891,6 +891,7 @@ RD_RegTable: {B32 non_graphical NonGraphical } {B32 prefer_new_tab PreferNewTab } {B32 activate_with_single_click ActivateWithSingleClick } + {B32 disable_addresses DisableAddresses } {Dir2 dir2 Dir2 } {String8 string String } {String8 cmd_name CmdName } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index df12f7be..ce778538 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10302,6 +10302,7 @@ rd_init(CmdLine *cmdln) rd_state->arena = arena; rd_state->quit_after_success = (cmd_line_has_flag(cmdln, str8_lit("quit_after_success")) || cmd_line_has_flag(cmdln, str8_lit("q"))); + rd_state->override_focus_on_stop = (cmd_line_has_flag(cmdln, s("no_focus_on_stop"))); rd_state->user_path_arena = arena_alloc(); rd_state->project_path_arena = arena_alloc(); rd_state->theme_path_arena = arena_alloc(); @@ -12584,6 +12585,7 @@ rd_frame(void) { String8 msg = rd_regs()->string; String8List msg_parts = str8_split(scratch.arena, msg, (U8 *)" ", 1, 0); + str8_list_push_front(scratch.arena, &msg_parts, s("ipc_command")); CmdLine msg_cmd_line = cmd_line_from_string_list(scratch.arena, msg_parts); String8 cmd_kind_name = str8_list_first(&msg_cmd_line.inputs); RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name); @@ -12609,8 +12611,8 @@ rd_frame(void) primary_args_string = str8_list_join(scratch.arena, &primary_args_strings, &(StringJoin){.sep = str8_lit(" ")}); } rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_kind_info->query.expr, primary_args_string); + rd_regs()->disable_addresses = 1; rd_push_cmd(cmd_kind_name, rd_regs()); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "ack:{cmd:%S}\n", cmd_kind_name); } else { @@ -12622,15 +12624,32 @@ rd_frame(void) str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "state:\n{\n"); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " running: %i\n", d_ctrl_targets_running()); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " run_gen: %I64u\n", d_run_gen()); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip: 0x%I64x\n", d_ctrl_last_stop_event().rip_vaddr); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stop_count: %I64u\n", d_stop_count()); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip: 0x%I64x\n", d_ctrl_last_stop_event().rip_vaddr); + { + Access *access = access_open(); + D_Event evt = d_ctrl_last_stop_event(); + U64 vaddr = evt.rip_vaddr; + D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + U64 voff = d_voff_from_vaddr(module, vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); + String8 name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, procedure); + name = escaped_from_raw_str8(scratch.arena, name); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_voff: 0x%I64x\n", voff); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_voff_symbol: \"%S\"\n", name); + access_close(access); + } { D_Event evt = d_ctrl_last_stop_event(); DR_FStrList explanation_fstrs = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &evt); String8 explanation_string = dr_string_from_fstrs(scratch.arena, &explanation_fstrs); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stop_event:\n {\n"); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " arch: %S\n", string_from_arch(evt.arch)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range_min: 0x%I64x\n", evt.vaddr_rng.min); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range_max: 0x%I64x\n", evt.vaddr_rng.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range: [0x%I64x, 0x%I64x)\n", evt.vaddr_rng.min, evt.vaddr_rng.max); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_vaddr: 0x%I64x\n", evt.rip_vaddr); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " stack_base: 0x%I64x\n", evt.stack_base); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " tls_root: 0x%I64x\n", evt.tls_root); @@ -12643,6 +12662,25 @@ rd_frame(void) str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " explanation: \"%S\"\n", escaped_from_raw_str8(scratch.arena, explanation_string)); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); } + { + Access *access = access_open(); + D_Event evt = d_ctrl_last_stop_event(); + U64 vaddr = evt.rip_vaddr; + D_Entity *thread = d_entity_from_handle(rd_base_regs()->thread); + D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); + D_Entity *module = d_module_from_process_vaddr(process, vaddr); + U64 voff = d_voff_from_vaddr(module, vaddr); + DI_Key dbgi_key = d_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + E_String2NumMap *locals_map = e_push_locals_map_from_rdi_voff(scratch.arena, rdi, voff); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " locals:\n {\n"); + for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) + { + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " %S\n", n->string); + } + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); + access_close(access); + } { D_Event evt = d_ctrl_last_stop_event(); U64 vaddr = evt.rip_vaddr; @@ -12656,12 +12694,12 @@ rd_frame(void) for EachNode(n, D_LineNode, lines.first) { D_Line line = n->v; + String8 line_file_path_relative = path_relative_dst_from_absolute_dst_src(scratch.arena, line.file_path, module->string); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " file_path: \"%S\"\n", line.file_path); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " file_path: \"%S\"\n", line_file_path_relative); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " line_num: %I64d\n", line.pt.line); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " column_num: %I64d\n", line.pt.column); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range_min: 0x%I64x\n", line.voff_range.min); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range_max: 0x%I64x\n", line.voff_range.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range: [0x%I64x, 0x%I64x)\n", line.voff_range.min, line.voff_range.max); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); } str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); @@ -12688,8 +12726,7 @@ rd_frame(void) D_Entity *module = modules.v[idx]; str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " name: \"%S\"\n", escaped_from_raw_str8(scratch.arena, module->string)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range_min: 0x%I64x\n", module->vaddr_range.min); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range_max: 0x%I64x\n", module->vaddr_range.max); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " vaddr_range: [0x%I64x, 0x%I64x)\n", module->vaddr_range.min, module->vaddr_range.max); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); } str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); @@ -12698,6 +12735,12 @@ rd_frame(void) }break; case RD_CmdKind_Eval: { + // TODO(rjf): to use this for evaluation testing, we need some way to temporarily + // call the eval system with ctrl-thread-like evaluation rules (e.g. waiting for + // memory, never accepting stale results, not looking into caches, etc.). currently + // we'd only be able to do that by setting up an entirely new evaluation context, + // which is currently a ton of code & laborious & duplicative, so we need to tighten + // that up first. @eval_regressions String8 expr = rd_regs()->expr; E_Eval eval = e_eval_from_string(expr); E_Eval type_eval = e_eval_from_stringf("typeof(%S)", expr); @@ -12706,6 +12749,10 @@ rd_frame(void) .flags = EV_StringFlag_ReadOnlyDisplayRules | rd_state->eval_viz_base_string_flags, .radix = 10, }; + if(rd_regs()->disable_addresses) + { + string_params.flags |= EV_StringFlag_DisableAddresses; + } String8 value_string = ev_value_string_from_eval(scratch.arena, &string_params, eval, 512); String8 type_value_string = ev_value_string_from_eval(scratch.arena, &string_params, type_eval, 512); String8List msgs_strings = {0}; @@ -16903,7 +16950,7 @@ rd_frame(void) } // rjf: focus window if none focused, and if we have a thread to snap to - if(need_refocus && (selected_thread != &d_entity_nil || thread != &d_entity_nil)) + if(!rd_state->override_focus_on_stop && need_refocus && (selected_thread != &d_entity_nil || thread != &d_entity_nil)) { B32 any_window_is_focused = 0; for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index e278f87e..60ef35e1 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -388,6 +388,7 @@ struct RD_State Arena *arena; B32 quit; B32 quit_after_success; + B32 override_focus_on_stop; S32 frame_depth; U64 frame_eval_memread_endt_us; @@ -444,7 +445,7 @@ struct RD_State Access *frame_access; String8 last_window_title; - // rjf: evaluation cache + // rjf: evaluation caches E_Cache *eval_cache; // rjf: ambiguous path table (constructed from-scratch each frame) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index d736c3f8..c0f994cd 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -426,7 +426,7 @@ struct IPCInfo //~ rjf: Globals //- rjf: IPC resources -#define IPC_SHARED_MEMORY_BUFFER_SIZE MB(4) +#define IPC_SHARED_MEMORY_BUFFER_SIZE KB(64) StaticAssert(IPC_SHARED_MEMORY_BUFFER_SIZE > sizeof(IPCInfo), ipc_buffer_size_requirement); global Semaphore ipc_sender2main_signal_semaphore = {0}; global Semaphore ipc_sender2main_lock_semaphore = {0}; @@ -434,7 +434,7 @@ global U8 *ipc_sender2main_shared_memory_base = 0; global Semaphore ipc_main2sender_signal_semaphore = {0}; global Semaphore ipc_main2sender_lock_semaphore = {0}; global U8 *ipc_main2sender_shared_memory_base = 0; -global U8 ipc_s2m_ring_buffer[MB(4)] = {0}; +global U8 ipc_s2m_ring_buffer[KB(64)] = {0}; global U64 ipc_s2m_ring_write_pos = 0; global U64 ipc_s2m_ring_read_pos = 0; global Mutex ipc_s2m_ring_mutex = {0}; @@ -666,6 +666,7 @@ entry_point(CmdLine *cmd_line) if(msg.size != 0) { log_infof("ipc_msg: \"%S\"", msg); + String8List cmd_parts_of_msg = str8_split(scratch.arena, msg, (U8 *)";", 1, 0); RD_WindowState *dst_ws = rd_state->first_window_state; for(RD_WindowState *ws = dst_ws; ws != &rd_nil_window_state; ws = ws->order_next) { @@ -690,7 +691,10 @@ entry_point(CmdLine *cmd_line) rd_regs()->view = panel_tree.focused->selected_tab->id; scratch_end(scratch); } - rd_cmd(RD_CmdKind_RunExternalDriverTextCommand, .string = msg); + for EachNode(n, String8Node, cmd_parts_of_msg.first) + { + rd_cmd(RD_CmdKind_RunExternalDriverTextCommand, .string = n->string); + } rd_request_frame(); } } diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index 2a3a607d..8f9c7bf7 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -1,6 +1,16 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Debugger Testing IPC Driving Helpers + +internal String8 +rd_test__mule_main_path(Arena *arena) +{ + String8 mule_main_exe_path = str8f(arena, "%S/%S%S", get_process_info()->binary_path, s("mule_main"), program_ext_postfix_from_os(OperatingSystem_CURRENT)); + return mule_main_exe_path; +} + internal String8 rd_test__raddbg_path(Arena *arena, CmdLine *cmdline) { @@ -14,9 +24,9 @@ rd_test__open_debugger(CmdLine *cmdline, String8 test_artifacts_path, String8 ta { Temp scratch = scratch_begin(0, 0); String8 raddbg_path = rd_test__raddbg_path(scratch.arena, cmdline); - String8 user_file_path = str8f(scratch.arena, "%S/test.raddbg_user", test_artifacts_path);\ + String8 user_file_path = str8f(scratch.arena, "%S/test.raddbg_user", test_artifacts_path); delete_file_at_path(user_file_path); - Process process = launch_cmd_linef("%S --gen_crash_dump --user:test.raddbg_user --logs:logs %S", raddbg_path, target_cmd_line); + Process process = launch_cmd_linef("%S --gen_crash_dump --no_focus_on_stop --user:%S --logs:logs %S", raddbg_path, user_file_path, target_cmd_line); scratch_end(scratch); return process; } @@ -41,64 +51,249 @@ rd_test__ipc_cmd(Arena *arena, CmdLine *cmdline, String8 test_artifacts_path, U6 return response; } -Test(stepping) +//////////////////////////////// +//~ rjf: Exemplar Test Helpers + +internal void +rd_test__exemplar_test_finish(Arena *arena, String8List test_log_strings, String8 test_exemplars_path, String8 test_artifacts_path, TestResult *result_out, String8List *test_out) { Temp scratch = scratch_begin(&arena, 1); - String8 mule_main_exe_path = str8f(scratch.arena, "%S/%S%S", get_process_info()->binary_path, s("mule_main"), program_ext_postfix_from_os(OperatingSystem_CURRENT)); - struct + + // rjf: combine all current test log output; write to 'current' data + String8 test_log_current = str8_list_join(scratch.arena, &test_log_strings, 0); + String8 test_log_current_path = str8f(scratch.arena, "%S/current", test_artifacts_path); + write_data_to_file_path(test_log_current_path, test_log_current); + + // rjf: load test log exemplar + make_directory(test_exemplars_path); + String8 exemplar_path = str8f(scratch.arena, "%S/exemplar", test_exemplars_path); + String8 exemplar_data = data_from_file_path(scratch.arena, exemplar_path); + + // rjf: if exemplar data is empty -> just save our output as the new exemplar + if(exemplar_data.size == 0) { - String8 cmdline; - String8 start_symbol; - B32 step_over_on_even; + copy_file_path(exemplar_path, test_log_current_path); } - test_cases[] = + + // rjf: if we have exemplar data, then we need to check that it matches + if(exemplar_data.size != 0) { - { mule_main_exe_path, s("mule_main"), 0 }, - { mule_main_exe_path, s("mule_main"), 1 }, - { mule_main_exe_path, s("control_flow_stepping_tests"), 0 }, - { mule_main_exe_path, s("control_flow_stepping_tests"), 1 }, - }; - for EachElement(test_case_idx, test_cases) - { - String8 test_cmdline = test_cases[test_case_idx].cmdline; - String8 start_symbol = test_cases[test_case_idx].start_symbol; - B32 step_over_on_even = test_cases[test_case_idx].step_over_on_even; - Process debugger = rd_test__open_debugger(cmdline, test_artifacts_path, test_cmdline); - U64 debugger_pid = pid_from_process(debugger); - String8 next_step_cmd = {0}; - rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, str8f(scratch.arena, "run_to_name %S", start_symbol)); - for(U64 cmd_idx = 0;; cmd_idx += 1) + B32 current_matches_exemplar = str8_match(test_log_current, exemplar_data, 0); + if(!current_matches_exemplar) { - String8 step_cmd = s("step_into"); - if((cmd_idx % 2 == 0 && step_over_on_even) || (cmd_idx % 2 == 1 && !step_over_on_even)) + String8 diff_cmd = str8f(scratch.arena, "diff %S %S", + path_normalized_from_string(scratch.arena, exemplar_path), + path_normalized_from_string(scratch.arena, test_log_current_path)); + test_outf("Current log does not match exemplar; run `%S`\n", diff_cmd); + } + TestCheck(current_matches_exemplar); + } + + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: Test Helpers + +internal void +rd_test__stepping_regressions(Arena *arena, CmdLine *cmdline, String8 test_exemplars_path, String8 test_artifacts_path, TestResult *result_out, String8List *test_out, String8 target_cmdline, String8 start_symbol, B32 step_over_on_even) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List test_log_strings = {0}; + + // rjf: start debugger + Process debugger = rd_test__open_debugger(cmdline, test_artifacts_path, target_cmdline); + U64 debugger_pid = pid_from_process(debugger); + + // rjf: step & gather info + { + U64 last_stop_count = max_U64; + B32 ready_for_next_operation = 0; + String8 next_step_cmd = {0}; + for(U64 cmd_idx = 0;;) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + // rjf: need next operation -> do op + if(ready_for_next_operation) { - step_cmd = s("step_over"); + ready_for_next_operation = 0; + String8 step_cmd = s("step_into"); + if(cmd_idx == 0) + { + step_cmd = str8f(scratch2.arena, "run_to_name %S", start_symbol); + } + else if((cmd_idx % 2 == 0 && step_over_on_even) || (cmd_idx % 2 == 1 && !step_over_on_even)) + { + step_cmd = s("step_over"); + } + if(next_step_cmd.size != 0) + { + step_cmd = next_step_cmd; + MemoryZeroStruct(&next_step_cmd); + } + String8 step_response = rd_test__ipc_cmd(scratch2.arena, cmdline, test_artifacts_path, debugger_pid, step_cmd); + (void)step_response; + cmd_idx += 1; } - if(next_step_cmd.size != 0) - { - step_cmd = next_step_cmd; - MemoryZeroStruct(&next_step_cmd); - } - String8 step_response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, step_cmd); - String8 state_response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, s("state")); - MD_Node *state_response_tree = md_tree_from_string(scratch.arena, state_response); + + // rjf: query state, parse + String8 state_response = rd_test__ipc_cmd(scratch2.arena, cmdline, test_artifacts_path, debugger_pid, s("state")); + MD_Node *state_response_tree = md_tree_from_string(scratch2.arena, state_response); MD_Node *state = md_child_from_string(state_response_tree, s("state"), 0); - U64 ip_vaddr = 0; - try_u64_from_str8_c_rules(md_child_from_string(state, s("ip"), 0)->first->string, &ip_vaddr); - if(ip_vaddr != 0 && md_child_from_string(state, s("lines"), 0)->first == &md_nil_node) + + // rjf: we are only ready for next step command when the stop count has changed { - next_step_cmd = s("step_out"); + U64 stop_count = 0; + try_u64_from_str8_c_rules(md_child_from_string(state, s("stop_count"), 0)->first->string, &stop_count); + if(stop_count != last_stop_count) + { + ready_for_next_operation = 1; + last_stop_count = stop_count; + } } + + // rjf: if we are ready for the next operation, then accumulate deterministic log info + if(ready_for_next_operation) + { + MD_Node *lines = md_child_from_string(state, s("lines"), 0); + MD_Node *ip_voff = md_child_from_string(state, s("ip_voff"), 0); + MD_Node *ip_voff_symbol = md_child_from_string(state, s("ip_voff_symbol"), 0); + String8 lines_dump = md_string_from_tree(scratch.arena, lines); + String8 ip_voff_dump = md_string_from_tree(scratch.arena, ip_voff); + String8 ip_voff_symbol_dump = md_string_from_tree(scratch.arena, ip_voff_symbol); + str8_list_push(scratch.arena, &test_log_strings, lines_dump); + str8_list_push(scratch.arena, &test_log_strings, ip_voff_dump); + str8_list_push(scratch.arena, &test_log_strings, ip_voff_symbol_dump); + } + + // rjf: are we without line info? -> step out + if(ready_for_next_operation) + { + U64 ip_vaddr = 0; + try_u64_from_str8_c_rules(md_child_from_string(state, s("ip"), 0)->first->string, &ip_vaddr); + if(ip_vaddr != 0 && md_child_from_string(state, s("lines"), 0)->first == &md_nil_node) + { + next_step_cmd = s("step_out"); + } + } + + scratch_end(scratch2); if(cmd_idx >= 100) { break; } } - rd_test__close_debugger(debugger); } + + // rjf: end exemplar test + rd_test__exemplar_test_finish(arena, test_log_strings, test_exemplars_path, test_artifacts_path, result_out, test_out); + + // rjf: close debugger + rd_test__close_debugger(debugger); + scratch_end(scratch); } +internal void +rd_test__eval_regressions(Arena *arena, CmdLine *cmdline, String8 test_exemplars_path, String8 test_artifacts_path, TestResult *result_out, String8List *test_out, String8 target_cmdline, String8 target_line) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List test_log_strings = {0}; + + // rjf: start debugger + Process debugger = rd_test__open_debugger(cmdline, test_artifacts_path, target_cmdline); + U64 debugger_pid = pid_from_process(debugger); + + // rjf: query state + U64 initial_stop_count = 0; + { + String8 response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, s("state")); + MD_Node *state = md_child_from_string(md_tree_from_string(scratch.arena, response), s("state"), 0); + MD_Node *stop_count = md_child_from_string(state, s("stop_count"), 0); + try_u64_from_str8_c_rules(stop_count->first->string, &initial_stop_count); + } + + // rjf: run to target line + rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, str8f(scratch.arena, "run_to_line %S", target_line)); + + // rjf: wait for stop, collect locals + String8List locals = {0}; + for(;;) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + String8 response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, s("state")); + MD_Node *state = md_child_from_string(md_tree_from_string(scratch.arena, response), s("state"), 0); + MD_Node *stop_count = md_child_from_string(state, s("stop_count"), 0); + U64 new_stop_count = 0; + try_u64_from_str8_c_rules(stop_count->first->string, &new_stop_count); + scratch_end(scratch2); + if(new_stop_count != initial_stop_count) + { + MD_Node *locals_root = md_child_from_string(state, s("locals"), 0); + for MD_EachNode(c, locals_root->first) + { + str8_list_push(scratch.arena, &locals, c->string); + } + break; + } + } + + // rjf: evaluate all locals + String8List eval_cmd_strings = {0}; + for EachNode(n, String8Node, locals.first) + { + str8_list_pushf(scratch.arena, &eval_cmd_strings, "eval %S", n->string); + } + StringJoin join = {.sep = s(" ; ")}; + String8 eval_msg = str8_list_join(scratch.arena, &eval_cmd_strings, &join); + String8 response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, eval_msg); + MD_Node *response_tree = md_tree_from_string(scratch.arena, response); + for MD_EachNode(n, response_tree->first) + { + if(str8_match(n->string, s("eval"), 0)) + { + String8 eval_dump = md_string_from_tree(scratch.arena, n); + str8_list_push(scratch.arena, &test_log_strings, eval_dump); + } + } + + // rjf: end exemplar test + rd_test__exemplar_test_finish(arena, test_log_strings, test_exemplars_path, test_artifacts_path, result_out, test_out); + + // rjf: close debugger + rd_test__close_debugger(debugger); + + scratch_end(scratch); +} + +//////////////////////////////// +//~ rjf: Tests + +#if 0 +Test(mule_main_step_regressions_0) +{ + String8 exe_path = {0}; + rd_test__stepping_regressions(arena, cmdline, test_exemplars_path, test_artifacts_path, result_out, test_out, rd_test__mule_main_path(arena), s("mule_main"), 0); +} + +Test(mule_main_step_regressions_1) +{ + rd_test__stepping_regressions(arena, cmdline, test_exemplars_path, test_artifacts_path, result_out, test_out, rd_test__mule_main_path(arena), s("mule_main"), 1); +} + +Test(control_flow_step_regressions) +{ + rd_test__stepping_regressions(arena, cmdline, test_exemplars_path, test_artifacts_path, result_out, test_out, rd_test__mule_main_path(arena), s("mule_main"), 0); +} + +SkippedTest(type_coverage_eval_regressions) +{ + // TODO(rjf): see @eval_regressions + rd_test__eval_regressions(arena, cmdline, test_exemplars_path, test_artifacts_path, result_out, test_out, rd_test__mule_main_path(arena), s("C:/devel/raddebugger/src/mule/mule_main.cpp:723")); +} +#endif + #if 0 //////////////////////////////// // IPC Controller diff --git a/src/torture/torture.c b/src/torture/torture.c index d1949fd1..57769d19 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -4,6 +4,7 @@ // command line global String8 g_stdout_file_name = str8_lit_comp("torture.out"); global String8 g_wdir; +global String8 g_exemplar_dir; global String8 g_out = str8_lit_comp("torture_artifacts"); global B32 g_verbose; global B32 g_redirect_stdout = 1; @@ -168,7 +169,7 @@ t_run_caller(void *raw_ctx) if (ctx->test->skip) { ctx->result.status = TestStatus_Skip; } else { - ctx->test->test_fn(scratch.arena, ctx->cmdline, g_wdir, &ctx->result, &test_out); + ctx->test->test_fn(scratch.arena, ctx->cmdline, g_exemplar_dir, g_wdir, &ctx->result, &test_out); } if (ctx->result.status == TestStatus_Fail || ctx->result.status == TestStatus_Crash) { @@ -1273,6 +1274,13 @@ t_entry_point(CmdLine *cmdline) fprintf(stdout, " %.*s ", (int)dots_count, dots); fflush(stdout); + // rjf: find exemplar data directory + { + String8 binary_dir_path = get_process_info()->binary_path; + String8 root_dir_path = str8_chop_last_slash(binary_dir_path); + g_exemplar_dir = str8f(scratch.arena, "%S/data/test_exemplars/%S", root_dir_path, test->label); + } + // setup output directory g_wdir = str8f(scratch.arena, "%S/%S", g_out, test->label); g_wdir = full_path_from_path(scratch.arena, g_wdir); diff --git a/src/x64/disasm/x64_disasm.c b/src/x64/disasm/x64_disasm.c index f60eef86..2f71876f 100644 --- a/src/x64/disasm/x64_disasm.c +++ b/src/x64/disasm/x64_disasm.c @@ -7,7 +7,7 @@ #endif internal DASM_Inst -x64_dasm_inst_from_code(Arena *arena, U64 vaddr, String8 code, DASM_Syntax syntax) +x64_dasm_inst_from_code(Arena *arena, U64 vaddr, String8 code, DASM_Syntax syntax) { DASM_Inst inst = {0}; From 1ea8c4886716ef92770605811f4ecb81e1833af1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 16:11:50 -0700 Subject: [PATCH 707/850] raddbg exemplar tests -> use specific hash version, name exemplars by their platform, skip if test data unavailable --- .../exemplar_windows | 1500 +++++++++++++++++ .../exemplar_windows | 1464 ++++++++++++++++ .../exemplar_windows | 1476 ++++++++++++++++ project.raddbg | 2 +- src/base/base_test.h | 21 +- src/raddbg/tests/raddbg_tests.c | 349 ++-- src/torture/torture.c | 19 +- src/torture/torture.h | 2 +- 8 files changed, 4663 insertions(+), 170 deletions(-) create mode 100644 data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows create mode 100644 data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows create mode 100644 data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows diff --git a/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows new file mode 100644 index 00000000..b7a9e2c2 --- /dev/null +++ b/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows @@ -0,0 +1,1500 @@ +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2366 + column_num: 1 + voff_range: + [ + 0xea20 + 0xea24 + ) + } +} +ip_voff: 0xea20 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2368 + column_num: 1 + voff_range: + [ + 0xea24 + 0xea2c + ) + } +} +ip_voff: 0xea24 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2369 + column_num: 1 + voff_range: + [ + 0xea2c + 0xea33 + ) + } +} +ip_voff: 0xea2c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2372 + column_num: 1 + voff_range: + [ + 0xea3d + 0xea44 + ) + } +} +ip_voff: 0xea3d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2373 + column_num: 1 + voff_range: + [ + 0xea44 + 0xea4f + ) + } +} +ip_voff: 0xea44 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2378 + column_num: 1 + voff_range: + [ + 0xea4f + 0xea57 + ) + } +} +ip_voff: 0xea4f +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2379 + column_num: 1 + voff_range: + [ + 0xea57 + 0xea5e + ) + } +} +ip_voff: 0xea57 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2383 + column_num: 1 + voff_range: + [ + 0xea68 + 0xea6f + ) + } +} +ip_voff: 0xea68 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2385 + column_num: 1 + voff_range: + [ + 0xea6f + 0xea7a + ) + } +} +ip_voff: 0xea6f +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2390 + column_num: 1 + voff_range: + [ + 0xea7a + 0xea82 + ) + } +} +ip_voff: 0xea7a +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2391 + column_num: 1 + voff_range: + [ + 0xea82 + 0xea89 + ) + } +} +ip_voff: 0xea82 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2393 + column_num: 1 + voff_range: + [ + 0xea93 + 0xea9a + ) + } +} +ip_voff: 0xea93 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2394 + column_num: 1 + voff_range: + [ + 0xea9a + 0xeaa5 + ) + } +} +ip_voff: 0xea9a +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2398 + column_num: 1 + voff_range: + [ + 0xeaa5 + 0xeaad + ) + } +} +ip_voff: 0xeaa5 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2399 + column_num: 1 + voff_range: + [ + 0xeaad + 0xeab5 + ) + } +} +ip_voff: 0xeaad +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2400 + column_num: 1 + voff_range: + [ + 0xeab5 + 0xeabf + ) + } +} +ip_voff: 0xeab5 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2401 + column_num: 1 + voff_range: + [ + 0xeabf + 0xeac9 + ) + } +} +ip_voff: 0xeabf +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2405 + column_num: 1 + voff_range: + [ + 0xead5 + 0xeadf + ) + } +} +ip_voff: 0xead5 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2407 + column_num: 1 + voff_range: + [ + 0xeadf + 0xeae1 + ) + } +} +ip_voff: 0xeadf +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2419 + column_num: 1 + voff_range: + [ + 0xeb05 + 0xeb0d + ) + } +} +ip_voff: 0xeb05 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2420 + column_num: 1 + voff_range: + [ + 0xeb0d + 0xeb15 + ) + } +} +ip_voff: 0xeb0d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2421 + column_num: 1 + voff_range: + [ + 0xeb15 + 0xeb1f + ) + } +} +ip_voff: 0xeb15 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2423 + column_num: 1 + voff_range: + [ + 0xeb1f + 0xeb29 + ) + } +} +ip_voff: 0xeb1f +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2429 + column_num: 1 + voff_range: + [ + 0xeb35 + 0xeb3f + ) + } +} +ip_voff: 0xeb35 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2431 + column_num: 1 + voff_range: + [ + 0xeb3f + 0xeb41 + ) + } +} +ip_voff: 0xeb3f +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2446 + column_num: 1 + voff_range: + [ + 0xeb65 + 0xeb6d + ) + } +} +ip_voff: 0xeb65 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2447 + column_num: 1 + voff_range: + [ + 0xeb6d + 0xeb75 + ) + } +} +ip_voff: 0xeb6d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2448 + column_num: 1 + voff_range: + [ + 0xeb75 + 0xeb7f + ) + } +} +ip_voff: 0xeb75 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2449 + column_num: 1 + voff_range: + [ + 0xeb7f + 0xeb89 + ) + } +} +ip_voff: 0xeb7f +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2452 + column_num: 1 + voff_range: + [ + 0xeb95 + 0xeba1 + ) + } +} +ip_voff: 0xeb95 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2461 + column_num: 1 + voff_range: + [ + 0xebc5 + 0xebcd + ) + } +} +ip_voff: 0xebc5 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebcd +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2463 + column_num: 1 + voff_range: + [ + 0xebe8 + 0xebf8 + ) + } +} +ip_voff: 0xebe8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2464 + column_num: 1 + voff_range: + [ + 0xebf8 + 0xebfa + ) + } +} +ip_voff: 0xebf8 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2462 + column_num: 1 + voff_range: + [ + 0xebcd + 0xebe8 + ) + } +} +ip_voff: 0xebd7 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2468 + column_num: 1 + voff_range: + [ + 0xebfa + 0xec02 + ) + } +} +ip_voff: 0xebfa +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec02 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2471 + column_num: 1 + voff_range: + [ + 0xec1d + 0xec2d + ) + } +} +ip_voff: 0xec1d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2472 + column_num: 1 + voff_range: + [ + 0xec2d + 0xec2f + ) + } +} +ip_voff: 0xec2d +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2469 + column_num: 1 + voff_range: + [ + 0xec02 + 0xec1d + ) + } +} +ip_voff: 0xec0c +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2476 + column_num: 1 + voff_range: + [ + 0xec2f + 0xec37 + ) + } +} +ip_voff: 0xec2f +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2477 + column_num: 1 + voff_range: + [ + 0xec37 + 0xec52 + ) + } +} +ip_voff: 0xec37 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2478 + column_num: 1 + voff_range: + [ + 0xec52 + 0xec64 + ) + } +} +ip_voff: 0xec52 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2477 + column_num: 1 + voff_range: + [ + 0xec37 + 0xec52 + ) + } +} +ip_voff: 0xec41 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2478 + column_num: 1 + voff_range: + [ + 0xec52 + 0xec64 + ) + } +} +ip_voff: 0xec52 +ip_voff_symbol: control_flow_stepping_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 2477 + column_num: 1 + voff_range: + [ + 0xec37 + 0xec52 + ) + } +} +ip_voff: 0xec41 +ip_voff_symbol: control_flow_stepping_tests diff --git a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows new file mode 100644 index 00000000..96d94635 --- /dev/null +++ b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows @@ -0,0 +1,1464 @@ +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3193 + column_num: 1 + voff_range: + [ + 0x1bb0 + 0x1bbd + ) + } +} +ip_voff: 0x1bb0 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3194 + column_num: 1 + voff_range: + [ + 0x1bbd + 0x1bd0 + ) + } +} +ip_voff: 0x1bbd +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 245 + column_num: 1 + voff_range: + [ + 0x1040 + 0x1044 + ) + } +} +ip_voff: 0x1040 +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 246 + column_num: 1 + voff_range: + [ + 0x1044 + 0x104e + ) + } +} +ip_voff: 0x1044 +ip_voff_symbol: raddbg_thread_id__impl +lines +ip_voff: 0x15890 +ip_voff_symbol: "" +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 246 + column_num: 1 + voff_range: + [ + 0x1044 + 0x104e + ) + } +} +ip_voff: 0x104a +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 247 + column_num: 1 + voff_range: + [ + 0x104e + 0x1052 + ) + } +} +ip_voff: 0x104e +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 248 + column_num: 1 + voff_range: + [ + 0x1052 + 0x1057 + ) + } +} +ip_voff: 0x1052 +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3194 + column_num: 1 + voff_range: + [ + 0x1bbd + 0x1bd0 + ) + } +} +ip_voff: 0x1bc2 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3195 + column_num: 1 + voff_range: + [ + 0x1bd0 + 0x1be2 + ) + } +} +ip_voff: 0x1bd0 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 245 + column_num: 1 + voff_range: + [ + 0x1040 + 0x1044 + ) + } +} +ip_voff: 0x1040 +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 246 + column_num: 1 + voff_range: + [ + 0x1044 + 0x104e + ) + } +} +ip_voff: 0x1044 +ip_voff_symbol: raddbg_thread_id__impl +lines +ip_voff: 0x15890 +ip_voff_symbol: "" +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 246 + column_num: 1 + voff_range: + [ + 0x1044 + 0x104e + ) + } +} +ip_voff: 0x104a +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 247 + column_num: 1 + voff_range: + [ + 0x104e + 0x1052 + ) + } +} +ip_voff: 0x104e +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 248 + column_num: 1 + voff_range: + [ + 0x1052 + 0x1057 + ) + } +} +ip_voff: 0x1052 +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3195 + column_num: 1 + voff_range: + [ + 0x1bd0 + 0x1be2 + ) + } +} +ip_voff: 0x1bd5 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3196 + column_num: 1 + voff_range: + [ + 0x1be2 + 0x1beb + ) + } +} +ip_voff: 0x1be2 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 239 + column_num: 1 + voff_range: + [ + 0x1000 + 0x1004 + ) + } +} +ip_voff: 0x1000 +ip_voff_symbol: raddbg_is_attached__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 240 + column_num: 1 + voff_range: + [ + 0x1004 + 0x102f + ) + } +} +ip_voff: 0x1004 +ip_voff_symbol: raddbg_is_attached__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 241 + column_num: 1 + voff_range: + [ + 0x102f + 0x1034 + ) + } +} +ip_voff: 0x102f +ip_voff_symbol: raddbg_is_attached__impl +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3196 + column_num: 1 + voff_range: + [ + 0x1be2 + 0x1beb + ) + } +} +ip_voff: 0x1be7 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3198 + column_num: 1 + voff_range: + [ + 0x1beb + 0x1bf8 + ) + } +} +ip_voff: 0x1beb +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3201 + column_num: 1 + voff_range: + [ + 0x1bf8 + 0x1bfd + ) + } +} +ip_voff: 0x1bf8 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 39 + column_num: 1 + voff_range: + [ + 0x1af0 + 0x1af4 + ) + } +} +ip_voff: 0x1af0 +ip_voff_symbol: mule_init +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 40 + column_num: 1 + voff_range: + [ + 0x1af4 + 0x1b08 + ) + } +} +ip_voff: 0x1af4 +ip_voff_symbol: mule_init +lines +ip_voff: 0x20830 +ip_voff_symbol: "" +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 40 + column_num: 1 + voff_range: + [ + 0x1af4 + 0x1b08 + ) + } +} +ip_voff: 0x1b01 +ip_voff_symbol: mule_init +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 41 + column_num: 1 + voff_range: + [ + 0x1b08 + 0x1b0d + ) + } +} +ip_voff: 0x1b08 +ip_voff_symbol: mule_init +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3203 + column_num: 1 + voff_range: + [ + 0x1bfd + 0x1c02 + ) + } +} +ip_voff: 0x1bfd +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 424 + column_num: 1 + voff_range: + [ + 0x1d20 + 0x1d42 + ) + } +} +ip_voff: 0x1d20 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 425 + column_num: 1 + voff_range: + [ + 0x1d42 + 0x1dd0 + ) + } +} +ip_voff: 0x1d42 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 426 + column_num: 1 + voff_range: + [ + 0x1dd0 + 0x1e4a + ) + } +} +ip_voff: 0x1dd0 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 428 + column_num: 1 + voff_range: + [ + 0x1e4a + 0x1e55 + ) + } +} +ip_voff: 0x1e4a +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 429 + column_num: 1 + voff_range: + [ + 0x1e55 + 0x1e60 + ) + } +} +ip_voff: 0x1e55 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 431 + column_num: 1 + voff_range: + [ + 0x1e60 + 0x1e68 + ) + } +} +ip_voff: 0x1e60 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 432 + column_num: 1 + voff_range: + [ + 0x1e68 + 0x1e74 + ) + } +} +ip_voff: 0x1e68 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 434 + column_num: 1 + voff_range: + [ + 0x1e74 + 0x1e90 + ) + } +} +ip_voff: 0x1e74 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 435 + column_num: 1 + voff_range: + [ + 0x1e90 + 0x1eac + ) + } +} +ip_voff: 0x1e90 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 440 + column_num: 1 + voff_range: + [ + 0x1eac + 0x1ec8 + ) + } +} +ip_voff: 0x1eac +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 445 + column_num: 1 + voff_range: + [ + 0x1ec8 + 0x1f18 + ) + } +} +ip_voff: 0x1ec8 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 451 + column_num: 1 + voff_range: + [ + 0x1f18 + 0x1f31 + ) + } +} +ip_voff: 0x1f18 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 452 + column_num: 1 + voff_range: + [ + 0x1f31 + 0x1f4a + ) + } +} +ip_voff: 0x1f31 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 454 + column_num: 1 + voff_range: + [ + 0x1f4a + 0x1f59 + ) + } +} +ip_voff: 0x1f4a +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 455 + column_num: 1 + voff_range: + [ + 0x1f59 + 0x1f75 + ) + } +} +ip_voff: 0x1f59 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 456 + column_num: 1 + voff_range: + [ + 0x1f75 + 0x1f84 + ) + } +} +ip_voff: 0x1f75 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 458 + column_num: 1 + voff_range: + [ + 0x1f84 + 0x1f93 + ) + } +} +ip_voff: 0x1f84 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 460 + column_num: 1 + voff_range: + [ + 0x1f93 + 0x1fa3 + ) + } +} +ip_voff: 0x1f93 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 461 + column_num: 1 + voff_range: + [ + 0x1fa3 + 0x1fb3 + ) + } +} +ip_voff: 0x1fa3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 462 + column_num: 1 + voff_range: + [ + 0x1fb3 + 0x1fc3 + ) + } +} +ip_voff: 0x1fb3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 467 + column_num: 1 + voff_range: + [ + 0x1fc3 + 0x1fdf + ) + } +} +ip_voff: 0x1fc3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 468 + column_num: 1 + voff_range: + [ + 0x1fdf + 0x1ffb + ) + } +} +ip_voff: 0x1fdf +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 469 + column_num: 1 + voff_range: + [ + 0x1ffb + 0x2017 + ) + } +} +ip_voff: 0x1ffb +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 470 + column_num: 1 + voff_range: + [ + 0x2017 + 0x2033 + ) + } +} +ip_voff: 0x2017 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 471 + column_num: 1 + voff_range: + [ + 0x2033 + 0x204f + ) + } +} +ip_voff: 0x2033 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 472 + column_num: 1 + voff_range: + [ + 0x204f + 0x206b + ) + } +} +ip_voff: 0x204f +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 473 + column_num: 1 + voff_range: + [ + 0x206b + 0x2087 + ) + } +} +ip_voff: 0x206b +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 474 + column_num: 1 + voff_range: + [ + 0x2087 + 0x20a3 + ) + } +} +ip_voff: 0x2087 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 475 + column_num: 1 + voff_range: + [ + 0x20a3 + 0x20d3 + ) + } +} +ip_voff: 0x20a3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 477 + column_num: 1 + voff_range: + [ + 0x20d3 + 0x20de + ) + } +} +ip_voff: 0x20d3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 481 + column_num: 1 + voff_range: + [ + 0x20de + 0x20fa + ) + } +} +ip_voff: 0x20de +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 482 + column_num: 1 + voff_range: + [ + 0x20fa + 0x2116 + ) + } +} +ip_voff: 0x20fa +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 483 + column_num: 1 + voff_range: + [ + 0x2116 + 0x2132 + ) + } +} +ip_voff: 0x2116 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 484 + column_num: 1 + voff_range: + [ + 0x2132 + 0x214e + ) + } +} +ip_voff: 0x2132 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 485 + column_num: 1 + voff_range: + [ + 0x214e + 0x216a + ) + } +} +ip_voff: 0x214e +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 486 + column_num: 1 + voff_range: + [ + 0x216a + 0x2186 + ) + } +} +ip_voff: 0x216a +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 490 + column_num: 1 + voff_range: + [ + 0x2186 + 0x2193 + ) + } +} +ip_voff: 0x2186 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 491 + column_num: 1 + voff_range: + [ + 0x2193 + 0x219b + ) + } +} +ip_voff: 0x2193 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 494 + column_num: 1 + voff_range: + [ + 0x219b + 0x21b3 + ) + } +} +ip_voff: 0x219b +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 497 + column_num: 1 + voff_range: + [ + 0x21b3 + 0x21cb + ) + } +} +ip_voff: 0x21b3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 498 + column_num: 1 + voff_range: + [ + 0x21cb + 0x21e3 + ) + } +} +ip_voff: 0x21cb +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 499 + column_num: 1 + voff_range: + [ + 0x21e3 + 0x21fb + ) + } +} +ip_voff: 0x21e3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 500 + column_num: 1 + voff_range: + [ + 0x21fb + 0x2213 + ) + } +} +ip_voff: 0x21fb +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 501 + column_num: 1 + voff_range: + [ + 0x2213 + 0x222b + ) + } +} +ip_voff: 0x2213 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 504 + column_num: 1 + voff_range: + [ + 0x222b + 0x2243 + ) + } +} +ip_voff: 0x222b +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 512 + column_num: 1 + voff_range: + [ + 0x2243 + 0x2257 + ) + } +} +ip_voff: 0x2243 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 514 + column_num: 1 + voff_range: + [ + 0x2257 + 0x2262 + ) + } +} +ip_voff: 0x2257 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 515 + column_num: 1 + voff_range: + [ + 0x2262 + 0x2273 + ) + } +} +ip_voff: 0x2262 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 516 + column_num: 1 + voff_range: + [ + 0x2273 + 0x2287 + ) + } +} +ip_voff: 0x2273 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 517 + column_num: 1 + voff_range: + [ + 0x2287 + 0x22a1 + ) + } +} +ip_voff: 0x2287 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 518 + column_num: 1 + voff_range: + [ + 0x22a1 + 0x22b5 + ) + } +} +ip_voff: 0x22a1 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 519 + column_num: 1 + voff_range: + [ + 0x22b5 + 0x22cf + ) + } +} +ip_voff: 0x22b5 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 520 + column_num: 1 + voff_range: + [ + 0x22cf + 0x22e3 + ) + } +} +ip_voff: 0x22cf +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 521 + column_num: 1 + voff_range: + [ + 0x22e3 + 0x22fd + ) + } +} +ip_voff: 0x22e3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 522 + column_num: 1 + voff_range: + [ + 0x22fd + 0x2305 + ) + } +} +ip_voff: 0x22fd +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 525 + column_num: 1 + voff_range: + [ + 0x2305 + 0x2315 + ) + } +} +ip_voff: 0x2305 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 526 + column_num: 1 + voff_range: + [ + 0x2315 + 0x2326 + ) + } +} +ip_voff: 0x2315 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 528 + column_num: 1 + voff_range: + [ + 0x2326 + 0x2331 + ) + } +} +ip_voff: 0x2326 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 530 + column_num: 1 + voff_range: + [ + 0x2331 + 0x2368 + ) + } +} +ip_voff: 0x2331 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 533 + column_num: 1 + voff_range: + [ + 0x2368 + 0x2377 + ) + } +} +ip_voff: 0x2368 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 534 + column_num: 1 + voff_range: + [ + 0x2377 + 0x2387 + ) + } +} +ip_voff: 0x2377 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 535 + column_num: 1 + voff_range: + [ + 0x2387 + 0x2396 + ) + } +} +ip_voff: 0x2387 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 536 + column_num: 1 + voff_range: + [ + 0x2396 + 0x23a6 + ) + } +} +ip_voff: 0x2396 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 537 + column_num: 1 + voff_range: + [ + 0x23a6 + 0x23e0 + ) + } +} +ip_voff: 0x23a6 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 542 + column_num: 1 + voff_range: + [ + 0x23e0 + 0x2415 + ) + } +} +ip_voff: 0x23e0 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 543 + column_num: 1 + voff_range: + [ + 0x2415 + 0x244a + ) + } +} +ip_voff: 0x2415 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 544 + column_num: 1 + voff_range: + [ + 0x244a + 0x247f + ) + } +} +ip_voff: 0x244a +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 545 + column_num: 1 + voff_range: + [ + 0x247f + 0x24b4 + ) + } +} +ip_voff: 0x247f +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 549 + column_num: 1 + voff_range: + [ + 0x24b4 + 0x24d6 + ) + } +} +ip_voff: 0x24b4 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 551 + column_num: 1 + voff_range: + [ + 0x24d6 + 0x24e6 + ) + } +} +ip_voff: 0x24d6 +ip_voff_symbol: type_coverage_eval_tests diff --git a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows new file mode 100644 index 00000000..6262f50b --- /dev/null +++ b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows @@ -0,0 +1,1476 @@ +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3193 + column_num: 1 + voff_range: + [ + 0x1bb0 + 0x1bbd + ) + } +} +ip_voff: 0x1bb0 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3194 + column_num: 1 + voff_range: + [ + 0x1bbd + 0x1bd0 + ) + } +} +ip_voff: 0x1bbd +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3195 + column_num: 1 + voff_range: + [ + 0x1bd0 + 0x1be2 + ) + } +} +ip_voff: 0x1bd0 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 245 + column_num: 1 + voff_range: + [ + 0x1040 + 0x1044 + ) + } +} +ip_voff: 0x1040 +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 246 + column_num: 1 + voff_range: + [ + 0x1044 + 0x104e + ) + } +} +ip_voff: 0x1044 +ip_voff_symbol: raddbg_thread_id__impl +lines +ip_voff: 0x15890 +ip_voff_symbol: "" +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 246 + column_num: 1 + voff_range: + [ + 0x1044 + 0x104e + ) + } +} +ip_voff: 0x104a +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 247 + column_num: 1 + voff_range: + [ + 0x104e + 0x1052 + ) + } +} +ip_voff: 0x104e +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 248 + column_num: 1 + voff_range: + [ + 0x1052 + 0x1057 + ) + } +} +ip_voff: 0x1052 +ip_voff_symbol: raddbg_thread_id__impl +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3195 + column_num: 1 + voff_range: + [ + 0x1bd0 + 0x1be2 + ) + } +} +ip_voff: 0x1bd5 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3196 + column_num: 1 + voff_range: + [ + 0x1be2 + 0x1beb + ) + } +} +ip_voff: 0x1be2 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 239 + column_num: 1 + voff_range: + [ + 0x1000 + 0x1004 + ) + } +} +ip_voff: 0x1000 +ip_voff_symbol: raddbg_is_attached__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 240 + column_num: 1 + voff_range: + [ + 0x1004 + 0x102f + ) + } +} +ip_voff: 0x1004 +ip_voff_symbol: raddbg_is_attached__impl +lines: +{ + { + file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + line_num: 241 + column_num: 1 + voff_range: + [ + 0x102f + 0x1034 + ) + } +} +ip_voff: 0x102f +ip_voff_symbol: raddbg_is_attached__impl +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3196 + column_num: 1 + voff_range: + [ + 0x1be2 + 0x1beb + ) + } +} +ip_voff: 0x1be7 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3198 + column_num: 1 + voff_range: + [ + 0x1beb + 0x1bf8 + ) + } +} +ip_voff: 0x1beb +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3201 + column_num: 1 + voff_range: + [ + 0x1bf8 + 0x1bfd + ) + } +} +ip_voff: 0x1bf8 +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 39 + column_num: 1 + voff_range: + [ + 0x1af0 + 0x1af4 + ) + } +} +ip_voff: 0x1af0 +ip_voff_symbol: mule_init +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 40 + column_num: 1 + voff_range: + [ + 0x1af4 + 0x1b08 + ) + } +} +ip_voff: 0x1af4 +ip_voff_symbol: mule_init +lines +ip_voff: 0x20830 +ip_voff_symbol: "" +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 40 + column_num: 1 + voff_range: + [ + 0x1af4 + 0x1b08 + ) + } +} +ip_voff: 0x1b01 +ip_voff_symbol: mule_init +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 41 + column_num: 1 + voff_range: + [ + 0x1b08 + 0x1b0d + ) + } +} +ip_voff: 0x1b08 +ip_voff_symbol: mule_init +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 3203 + column_num: 1 + voff_range: + [ + 0x1bfd + 0x1c02 + ) + } +} +ip_voff: 0x1bfd +ip_voff_symbol: mule_main +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 424 + column_num: 1 + voff_range: + [ + 0x1d20 + 0x1d42 + ) + } +} +ip_voff: 0x1d20 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 425 + column_num: 1 + voff_range: + [ + 0x1d42 + 0x1dd0 + ) + } +} +ip_voff: 0x1d42 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 426 + column_num: 1 + voff_range: + [ + 0x1dd0 + 0x1e4a + ) + } +} +ip_voff: 0x1dd0 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 428 + column_num: 1 + voff_range: + [ + 0x1e4a + 0x1e55 + ) + } +} +ip_voff: 0x1e4a +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 429 + column_num: 1 + voff_range: + [ + 0x1e55 + 0x1e60 + ) + } +} +ip_voff: 0x1e55 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 431 + column_num: 1 + voff_range: + [ + 0x1e60 + 0x1e68 + ) + } +} +ip_voff: 0x1e60 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 432 + column_num: 1 + voff_range: + [ + 0x1e68 + 0x1e74 + ) + } +} +ip_voff: 0x1e68 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 434 + column_num: 1 + voff_range: + [ + 0x1e74 + 0x1e90 + ) + } +} +ip_voff: 0x1e74 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 435 + column_num: 1 + voff_range: + [ + 0x1e90 + 0x1eac + ) + } +} +ip_voff: 0x1e90 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 440 + column_num: 1 + voff_range: + [ + 0x1eac + 0x1ec8 + ) + } +} +ip_voff: 0x1eac +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 445 + column_num: 1 + voff_range: + [ + 0x1ec8 + 0x1f18 + ) + } +} +ip_voff: 0x1ec8 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 451 + column_num: 1 + voff_range: + [ + 0x1f18 + 0x1f31 + ) + } +} +ip_voff: 0x1f18 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 452 + column_num: 1 + voff_range: + [ + 0x1f31 + 0x1f4a + ) + } +} +ip_voff: 0x1f31 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 454 + column_num: 1 + voff_range: + [ + 0x1f4a + 0x1f59 + ) + } +} +ip_voff: 0x1f4a +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 455 + column_num: 1 + voff_range: + [ + 0x1f59 + 0x1f75 + ) + } +} +ip_voff: 0x1f59 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 456 + column_num: 1 + voff_range: + [ + 0x1f75 + 0x1f84 + ) + } +} +ip_voff: 0x1f75 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 458 + column_num: 1 + voff_range: + [ + 0x1f84 + 0x1f93 + ) + } +} +ip_voff: 0x1f84 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 460 + column_num: 1 + voff_range: + [ + 0x1f93 + 0x1fa3 + ) + } +} +ip_voff: 0x1f93 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 461 + column_num: 1 + voff_range: + [ + 0x1fa3 + 0x1fb3 + ) + } +} +ip_voff: 0x1fa3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 462 + column_num: 1 + voff_range: + [ + 0x1fb3 + 0x1fc3 + ) + } +} +ip_voff: 0x1fb3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 467 + column_num: 1 + voff_range: + [ + 0x1fc3 + 0x1fdf + ) + } +} +ip_voff: 0x1fc3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 468 + column_num: 1 + voff_range: + [ + 0x1fdf + 0x1ffb + ) + } +} +ip_voff: 0x1fdf +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 469 + column_num: 1 + voff_range: + [ + 0x1ffb + 0x2017 + ) + } +} +ip_voff: 0x1ffb +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 470 + column_num: 1 + voff_range: + [ + 0x2017 + 0x2033 + ) + } +} +ip_voff: 0x2017 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 471 + column_num: 1 + voff_range: + [ + 0x2033 + 0x204f + ) + } +} +ip_voff: 0x2033 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 472 + column_num: 1 + voff_range: + [ + 0x204f + 0x206b + ) + } +} +ip_voff: 0x204f +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 473 + column_num: 1 + voff_range: + [ + 0x206b + 0x2087 + ) + } +} +ip_voff: 0x206b +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 474 + column_num: 1 + voff_range: + [ + 0x2087 + 0x20a3 + ) + } +} +ip_voff: 0x2087 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 475 + column_num: 1 + voff_range: + [ + 0x20a3 + 0x20d3 + ) + } +} +ip_voff: 0x20a3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 477 + column_num: 1 + voff_range: + [ + 0x20d3 + 0x20de + ) + } +} +ip_voff: 0x20d3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 481 + column_num: 1 + voff_range: + [ + 0x20de + 0x20fa + ) + } +} +ip_voff: 0x20de +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 482 + column_num: 1 + voff_range: + [ + 0x20fa + 0x2116 + ) + } +} +ip_voff: 0x20fa +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 483 + column_num: 1 + voff_range: + [ + 0x2116 + 0x2132 + ) + } +} +ip_voff: 0x2116 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 484 + column_num: 1 + voff_range: + [ + 0x2132 + 0x214e + ) + } +} +ip_voff: 0x2132 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 485 + column_num: 1 + voff_range: + [ + 0x214e + 0x216a + ) + } +} +ip_voff: 0x214e +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 486 + column_num: 1 + voff_range: + [ + 0x216a + 0x2186 + ) + } +} +ip_voff: 0x216a +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 490 + column_num: 1 + voff_range: + [ + 0x2186 + 0x2193 + ) + } +} +ip_voff: 0x2186 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 491 + column_num: 1 + voff_range: + [ + 0x2193 + 0x219b + ) + } +} +ip_voff: 0x2193 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 494 + column_num: 1 + voff_range: + [ + 0x219b + 0x21b3 + ) + } +} +ip_voff: 0x219b +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 497 + column_num: 1 + voff_range: + [ + 0x21b3 + 0x21cb + ) + } +} +ip_voff: 0x21b3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 498 + column_num: 1 + voff_range: + [ + 0x21cb + 0x21e3 + ) + } +} +ip_voff: 0x21cb +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 499 + column_num: 1 + voff_range: + [ + 0x21e3 + 0x21fb + ) + } +} +ip_voff: 0x21e3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 500 + column_num: 1 + voff_range: + [ + 0x21fb + 0x2213 + ) + } +} +ip_voff: 0x21fb +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 501 + column_num: 1 + voff_range: + [ + 0x2213 + 0x222b + ) + } +} +ip_voff: 0x2213 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 504 + column_num: 1 + voff_range: + [ + 0x222b + 0x2243 + ) + } +} +ip_voff: 0x222b +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 512 + column_num: 1 + voff_range: + [ + 0x2243 + 0x2257 + ) + } +} +ip_voff: 0x2243 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 514 + column_num: 1 + voff_range: + [ + 0x2257 + 0x2262 + ) + } +} +ip_voff: 0x2257 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 515 + column_num: 1 + voff_range: + [ + 0x2262 + 0x2273 + ) + } +} +ip_voff: 0x2262 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 516 + column_num: 1 + voff_range: + [ + 0x2273 + 0x2287 + ) + } +} +ip_voff: 0x2273 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 517 + column_num: 1 + voff_range: + [ + 0x2287 + 0x22a1 + ) + } +} +ip_voff: 0x2287 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 518 + column_num: 1 + voff_range: + [ + 0x22a1 + 0x22b5 + ) + } +} +ip_voff: 0x22a1 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 519 + column_num: 1 + voff_range: + [ + 0x22b5 + 0x22cf + ) + } +} +ip_voff: 0x22b5 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 520 + column_num: 1 + voff_range: + [ + 0x22cf + 0x22e3 + ) + } +} +ip_voff: 0x22cf +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 521 + column_num: 1 + voff_range: + [ + 0x22e3 + 0x22fd + ) + } +} +ip_voff: 0x22e3 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 522 + column_num: 1 + voff_range: + [ + 0x22fd + 0x2305 + ) + } +} +ip_voff: 0x22fd +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 525 + column_num: 1 + voff_range: + [ + 0x2305 + 0x2315 + ) + } +} +ip_voff: 0x2305 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 526 + column_num: 1 + voff_range: + [ + 0x2315 + 0x2326 + ) + } +} +ip_voff: 0x2315 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 528 + column_num: 1 + voff_range: + [ + 0x2326 + 0x2331 + ) + } +} +ip_voff: 0x2326 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 530 + column_num: 1 + voff_range: + [ + 0x2331 + 0x2368 + ) + } +} +ip_voff: 0x2331 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 533 + column_num: 1 + voff_range: + [ + 0x2368 + 0x2377 + ) + } +} +ip_voff: 0x2368 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 534 + column_num: 1 + voff_range: + [ + 0x2377 + 0x2387 + ) + } +} +ip_voff: 0x2377 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 535 + column_num: 1 + voff_range: + [ + 0x2387 + 0x2396 + ) + } +} +ip_voff: 0x2387 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 536 + column_num: 1 + voff_range: + [ + 0x2396 + 0x23a6 + ) + } +} +ip_voff: 0x2396 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 537 + column_num: 1 + voff_range: + [ + 0x23a6 + 0x23e0 + ) + } +} +ip_voff: 0x23a6 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 542 + column_num: 1 + voff_range: + [ + 0x23e0 + 0x2415 + ) + } +} +ip_voff: 0x23e0 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 543 + column_num: 1 + voff_range: + [ + 0x2415 + 0x244a + ) + } +} +ip_voff: 0x2415 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 544 + column_num: 1 + voff_range: + [ + 0x244a + 0x247f + ) + } +} +ip_voff: 0x244a +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 545 + column_num: 1 + voff_range: + [ + 0x247f + 0x24b4 + ) + } +} +ip_voff: 0x247f +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 549 + column_num: 1 + voff_range: + [ + 0x24b4 + 0x24d6 + ) + } +} +ip_voff: 0x24b4 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 551 + column_num: 1 + voff_range: + [ + 0x24d6 + 0x24e6 + ) + } +} +ip_voff: 0x24d6 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 561 + column_num: 1 + voff_range: + [ + 0x24e6 + 0x24f7 + ) + } +} +ip_voff: 0x24e6 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 562 + column_num: 1 + voff_range: + [ + 0x24f7 + 0x2505 + ) + } +} +ip_voff: 0x24f7 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 563 + column_num: 1 + voff_range: + [ + 0x2505 + 0x2513 + ) + } +} +ip_voff: 0x2505 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 564 + column_num: 1 + voff_range: + [ + 0x2513 + 0x251f + ) + } +} +ip_voff: 0x2513 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 565 + column_num: 1 + voff_range: + [ + 0x251f + 0x2530 + ) + } +} +ip_voff: 0x251f +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 567 + column_num: 1 + voff_range: + [ + 0x2530 + 0x2544 + ) + } +} +ip_voff: 0x2530 +ip_voff_symbol: type_coverage_eval_tests +lines: +{ + { + file_path: "../../../../src/mule/mule_main.cpp" + line_num: 569 + column_num: 1 + voff_range: + [ + 0x2544 + 0x254f + ) + } +} +ip_voff: 0x2544 +ip_voff_symbol: type_coverage_eval_tests diff --git a/project.raddbg b/project.raddbg index 7ba34992..167bebd2 100644 --- a/project.raddbg +++ b/project.raddbg @@ -41,6 +41,6 @@ target: { executable: "build/torture.exe" working_directory: build - arguments: "raddbg/*" + arguments: "raddbg/* --gui" enabled: 1 } diff --git a/src/base/base_test.h b/src/base/base_test.h index 19e87a88..7d4f3c9a 100644 --- a/src/base/base_test.h +++ b/src/base/base_test.h @@ -23,7 +23,18 @@ struct TestResult char *fail_cond; }; -#define TEST_FUNCTION_SIG(name) void name(Arena *arena, CmdLine *cmdline, String8 test_exemplars_path, String8 test_artifacts_path, TestResult *result_out, String8List *test_out) +typedef struct TestCtx TestCtx; +struct TestCtx +{ + CmdLine *cmdline; + String8 exemplars_path; + String8 artifacts_path; + String8 input_data_path; + TestResult *result_out; + String8List *test_out; +}; + +#define TEST_FUNCTION_SIG(name) void name(Arena *arena, TestCtx *ctx) #define TEST_FUNCTION_DEF(name) TEST_FUNCTION_SIG(test__##name) typedef TEST_FUNCTION_SIG(TestFunctionType); @@ -76,17 +87,17 @@ TEST_FUNCTION_DEF(name) #define SkippedTest(name) DeclareTest(name, 1)\ TEST_FUNCTION_DEF(name) -#define test_out(string) str8_list_push(arena, test_out, (string)) -#define test_outf(...) str8_list_pushf(arena, test_out, __VA_ARGS__) +#define test_out(string) str8_list_push(arena, ctx->test_out, (string)) +#define test_outf(...) str8_list_pushf(arena, ctx->test_out, __VA_ARGS__) #define TestCheck(c) do { if (!(c)) {\ -*result_out = (TestResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) };\ +ctx->result_out[0] = (TestResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) };\ if(debugger_is_attached()) { Trap(); }\ return;\ } } while(0) #define TestSkip() do {\ -*result_out = (TestResult){ .status = TestStatus_Skip };\ +ctx->result_out[0] = (TestResult){ .status = TestStatus_Skip };\ return;\ } while(0) diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index 8f9c7bf7..b604e9f6 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -5,10 +5,10 @@ //~ rjf: Debugger Testing IPC Driving Helpers internal String8 -rd_test__mule_main_path(Arena *arena) +rd_test__test_binary_path(Arena *arena, TestCtx *ctx, String8 name) { - String8 mule_main_exe_path = str8f(arena, "%S/%S%S", get_process_info()->binary_path, s("mule_main"), program_ext_postfix_from_os(OperatingSystem_CURRENT)); - return mule_main_exe_path; + String8 path = str8f(arena, "%S/%S/%S%S", ctx->input_data_path, name, name, program_ext_postfix_from_os(OperatingSystem_CURRENT)); + return path; } internal String8 @@ -20,11 +20,11 @@ rd_test__raddbg_path(Arena *arena, CmdLine *cmdline) } internal Process -rd_test__open_debugger(CmdLine *cmdline, String8 test_artifacts_path, String8 target_cmd_line) +rd_test__open_debugger(TestCtx *ctx, String8 target_cmd_line) { Temp scratch = scratch_begin(0, 0); - String8 raddbg_path = rd_test__raddbg_path(scratch.arena, cmdline); - String8 user_file_path = str8f(scratch.arena, "%S/test.raddbg_user", test_artifacts_path); + String8 raddbg_path = rd_test__raddbg_path(scratch.arena, ctx->cmdline); + String8 user_file_path = str8f(scratch.arena, "%S/test.raddbg_user", ctx->artifacts_path); delete_file_at_path(user_file_path); Process process = launch_cmd_linef("%S --gen_crash_dump --no_focus_on_stop --user:%S --logs:logs %S", raddbg_path, user_file_path, target_cmd_line); scratch_end(scratch); @@ -38,11 +38,11 @@ rd_test__close_debugger(Process process) } internal String8 -rd_test__ipc_cmd(Arena *arena, CmdLine *cmdline, String8 test_artifacts_path, U64 debugger_pid, String8 string) +rd_test__ipc_cmd(Arena *arena, TestCtx *ctx, U64 debugger_pid, String8 string) { Temp scratch = scratch_begin(&arena, 1); - String8 raddbg_path = rd_test__raddbg_path(scratch.arena, cmdline); - String8 stdout_path = str8f(scratch.arena, "%S/ipc_output", test_artifacts_path); + String8 raddbg_path = rd_test__raddbg_path(scratch.arena, ctx->cmdline); + String8 stdout_path = str8f(scratch.arena, "%S/ipc_output", ctx->artifacts_path); Process process = launch_cmd_linef("%S --ipc --pid:%I64u %S > %S", raddbg_path, debugger_pid, string, stdout_path); process_join(process, max_U64, 0); String8 response = data_from_file_path(arena, stdout_path); @@ -55,18 +55,18 @@ rd_test__ipc_cmd(Arena *arena, CmdLine *cmdline, String8 test_artifacts_path, U6 //~ rjf: Exemplar Test Helpers internal void -rd_test__exemplar_test_finish(Arena *arena, String8List test_log_strings, String8 test_exemplars_path, String8 test_artifacts_path, TestResult *result_out, String8List *test_out) +rd_test__exemplar_test_finish(Arena *arena, TestCtx *ctx, String8List test_log_strings) { Temp scratch = scratch_begin(&arena, 1); // rjf: combine all current test log output; write to 'current' data String8 test_log_current = str8_list_join(scratch.arena, &test_log_strings, 0); - String8 test_log_current_path = str8f(scratch.arena, "%S/current", test_artifacts_path); + String8 test_log_current_path = str8f(scratch.arena, "%S/current", ctx->artifacts_path); write_data_to_file_path(test_log_current_path, test_log_current); // rjf: load test log exemplar - make_directory(test_exemplars_path); - String8 exemplar_path = str8f(scratch.arena, "%S/exemplar", test_exemplars_path); + make_directory(ctx->exemplars_path); + String8 exemplar_path = str8f(scratch.arena, "%S/exemplar_%S", ctx->exemplars_path, lower_from_str8(scratch.arena, string_from_operating_system(OperatingSystem_CURRENT))); String8 exemplar_data = data_from_file_path(scratch.arena, exemplar_path); // rjf: if exemplar data is empty -> just save our output as the new exemplar @@ -96,203 +96,228 @@ rd_test__exemplar_test_finish(Arena *arena, String8List test_log_strings, String //~ rjf: Test Helpers internal void -rd_test__stepping_regressions(Arena *arena, CmdLine *cmdline, String8 test_exemplars_path, String8 test_artifacts_path, TestResult *result_out, String8List *test_out, String8 target_cmdline, String8 start_symbol, B32 step_over_on_even) +rd_test__stepping_regressions(Arena *arena, TestCtx *ctx, String8 target_binary, String8 start_symbol, B32 step_over_on_even) { Temp scratch = scratch_begin(&arena, 1); String8List test_log_strings = {0}; - // rjf: start debugger - Process debugger = rd_test__open_debugger(cmdline, test_artifacts_path, target_cmdline); - U64 debugger_pid = pid_from_process(debugger); + // rjf: get binary path + String8 binary_path = rd_test__test_binary_path(arena, ctx, target_binary); + B32 binary_exists_locally = (properties_from_file_path(binary_path).modified != 0); - // rjf: step & gather info + // rjf: if binary does not exist -> skip this test, + if(!binary_exists_locally) { - U64 last_stop_count = max_U64; - B32 ready_for_next_operation = 0; - String8 next_step_cmd = {0}; - for(U64 cmd_idx = 0;;) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - // rjf: need next operation -> do op - if(ready_for_next_operation) - { - ready_for_next_operation = 0; - String8 step_cmd = s("step_into"); - if(cmd_idx == 0) - { - step_cmd = str8f(scratch2.arena, "run_to_name %S", start_symbol); - } - else if((cmd_idx % 2 == 0 && step_over_on_even) || (cmd_idx % 2 == 1 && !step_over_on_even)) - { - step_cmd = s("step_over"); - } - if(next_step_cmd.size != 0) - { - step_cmd = next_step_cmd; - MemoryZeroStruct(&next_step_cmd); - } - String8 step_response = rd_test__ipc_cmd(scratch2.arena, cmdline, test_artifacts_path, debugger_pid, step_cmd); - (void)step_response; - cmd_idx += 1; - } - - // rjf: query state, parse - String8 state_response = rd_test__ipc_cmd(scratch2.arena, cmdline, test_artifacts_path, debugger_pid, s("state")); - MD_Node *state_response_tree = md_tree_from_string(scratch2.arena, state_response); - MD_Node *state = md_child_from_string(state_response_tree, s("state"), 0); - - // rjf: we are only ready for next step command when the stop count has changed - { - U64 stop_count = 0; - try_u64_from_str8_c_rules(md_child_from_string(state, s("stop_count"), 0)->first->string, &stop_count); - if(stop_count != last_stop_count) - { - ready_for_next_operation = 1; - last_stop_count = stop_count; - } - } - - // rjf: if we are ready for the next operation, then accumulate deterministic log info - if(ready_for_next_operation) - { - MD_Node *lines = md_child_from_string(state, s("lines"), 0); - MD_Node *ip_voff = md_child_from_string(state, s("ip_voff"), 0); - MD_Node *ip_voff_symbol = md_child_from_string(state, s("ip_voff_symbol"), 0); - String8 lines_dump = md_string_from_tree(scratch.arena, lines); - String8 ip_voff_dump = md_string_from_tree(scratch.arena, ip_voff); - String8 ip_voff_symbol_dump = md_string_from_tree(scratch.arena, ip_voff_symbol); - str8_list_push(scratch.arena, &test_log_strings, lines_dump); - str8_list_push(scratch.arena, &test_log_strings, ip_voff_dump); - str8_list_push(scratch.arena, &test_log_strings, ip_voff_symbol_dump); - } - - // rjf: are we without line info? -> step out - if(ready_for_next_operation) - { - U64 ip_vaddr = 0; - try_u64_from_str8_c_rules(md_child_from_string(state, s("ip"), 0)->first->string, &ip_vaddr); - if(ip_vaddr != 0 && md_child_from_string(state, s("lines"), 0)->first == &md_nil_node) - { - next_step_cmd = s("step_out"); - } - } - - scratch_end(scratch2); - if(cmd_idx >= 100) - { - break; - } - } + TestSkip(); } - // rjf: end exemplar test - rd_test__exemplar_test_finish(arena, test_log_strings, test_exemplars_path, test_artifacts_path, result_out, test_out); - - // rjf: close debugger - rd_test__close_debugger(debugger); + // rjf: otherwise run + else + { + // rjf: start debugger + Process debugger = rd_test__open_debugger(ctx, binary_path); + U64 debugger_pid = pid_from_process(debugger); + + // rjf: step & gather info + { + U64 last_stop_count = max_U64; + B32 ready_for_next_operation = 0; + String8 next_step_cmd = {0}; + for(U64 cmd_idx = 0;;) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + // rjf: need next operation -> do op + if(ready_for_next_operation) + { + ready_for_next_operation = 0; + String8 step_cmd = s("step_into"); + if(cmd_idx == 0) + { + step_cmd = str8f(scratch2.arena, "run_to_name %S", start_symbol); + } + else if((cmd_idx % 2 == 0 && step_over_on_even) || (cmd_idx % 2 == 1 && !step_over_on_even)) + { + step_cmd = s("step_over"); + } + if(next_step_cmd.size != 0) + { + step_cmd = next_step_cmd; + MemoryZeroStruct(&next_step_cmd); + } + String8 step_response = rd_test__ipc_cmd(scratch2.arena, ctx, debugger_pid, step_cmd); + (void)step_response; + cmd_idx += 1; + } + + // rjf: query state, parse + String8 state_response = rd_test__ipc_cmd(scratch2.arena, ctx, debugger_pid, s("state")); + MD_Node *state_response_tree = md_tree_from_string(scratch2.arena, state_response); + MD_Node *state = md_child_from_string(state_response_tree, s("state"), 0); + + // rjf: we are only ready for next step command when the stop count has changed + { + U64 stop_count = 0; + try_u64_from_str8_c_rules(md_child_from_string(state, s("stop_count"), 0)->first->string, &stop_count); + if(stop_count != last_stop_count) + { + ready_for_next_operation = 1; + last_stop_count = stop_count; + } + } + + // rjf: if we are ready for the next operation, then accumulate deterministic log info + if(ready_for_next_operation) + { + MD_Node *lines = md_child_from_string(state, s("lines"), 0); + MD_Node *ip_voff = md_child_from_string(state, s("ip_voff"), 0); + MD_Node *ip_voff_symbol = md_child_from_string(state, s("ip_voff_symbol"), 0); + String8 lines_dump = md_string_from_tree(scratch.arena, lines); + String8 ip_voff_dump = md_string_from_tree(scratch.arena, ip_voff); + String8 ip_voff_symbol_dump = md_string_from_tree(scratch.arena, ip_voff_symbol); + str8_list_push(scratch.arena, &test_log_strings, lines_dump); + str8_list_push(scratch.arena, &test_log_strings, ip_voff_dump); + str8_list_push(scratch.arena, &test_log_strings, ip_voff_symbol_dump); + } + + // rjf: are we without line info? -> step out + if(ready_for_next_operation) + { + U64 ip_vaddr = 0; + try_u64_from_str8_c_rules(md_child_from_string(state, s("ip"), 0)->first->string, &ip_vaddr); + if(ip_vaddr != 0 && md_child_from_string(state, s("lines"), 0)->first == &md_nil_node) + { + next_step_cmd = s("step_out"); + } + } + + scratch_end(scratch2); + if(cmd_idx >= 100) + { + break; + } + } + } + + // rjf: end exemplar test + rd_test__exemplar_test_finish(arena, ctx, test_log_strings); + + // rjf: close debugger + rd_test__close_debugger(debugger); + } scratch_end(scratch); } internal void -rd_test__eval_regressions(Arena *arena, CmdLine *cmdline, String8 test_exemplars_path, String8 test_artifacts_path, TestResult *result_out, String8List *test_out, String8 target_cmdline, String8 target_line) +rd_test__eval_regressions(Arena *arena, TestCtx *ctx, String8 target_binary, String8 target_line) { Temp scratch = scratch_begin(&arena, 1); String8List test_log_strings = {0}; - // rjf: start debugger - Process debugger = rd_test__open_debugger(cmdline, test_artifacts_path, target_cmdline); - U64 debugger_pid = pid_from_process(debugger); + // rjf: get binary path + String8 binary_path = rd_test__test_binary_path(arena, ctx, target_binary); + B32 binary_exists_locally = (properties_from_file_path(binary_path).modified != 0); - // rjf: query state - U64 initial_stop_count = 0; + // rjf: if binary does not exist -> skip this test, + if(!binary_exists_locally) { - String8 response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, s("state")); - MD_Node *state = md_child_from_string(md_tree_from_string(scratch.arena, response), s("state"), 0); - MD_Node *stop_count = md_child_from_string(state, s("stop_count"), 0); - try_u64_from_str8_c_rules(stop_count->first->string, &initial_stop_count); + TestSkip(); } - // rjf: run to target line - rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, str8f(scratch.arena, "run_to_line %S", target_line)); - - // rjf: wait for stop, collect locals - String8List locals = {0}; - for(;;) + // rjf: otherwise run + else { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - String8 response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, s("state")); - MD_Node *state = md_child_from_string(md_tree_from_string(scratch.arena, response), s("state"), 0); - MD_Node *stop_count = md_child_from_string(state, s("stop_count"), 0); - U64 new_stop_count = 0; - try_u64_from_str8_c_rules(stop_count->first->string, &new_stop_count); - scratch_end(scratch2); - if(new_stop_count != initial_stop_count) + // rjf: start debugger + Process debugger = rd_test__open_debugger(ctx, binary_path); + U64 debugger_pid = pid_from_process(debugger); + + // rjf: query state + U64 initial_stop_count = 0; { - MD_Node *locals_root = md_child_from_string(state, s("locals"), 0); - for MD_EachNode(c, locals_root->first) + String8 response = rd_test__ipc_cmd(scratch.arena, ctx, debugger_pid, s("state")); + MD_Node *state = md_child_from_string(md_tree_from_string(scratch.arena, response), s("state"), 0); + MD_Node *stop_count = md_child_from_string(state, s("stop_count"), 0); + try_u64_from_str8_c_rules(stop_count->first->string, &initial_stop_count); + } + + // rjf: run to target line + rd_test__ipc_cmd(scratch.arena, ctx, debugger_pid, str8f(scratch.arena, "run_to_line %S", target_line)); + + // rjf: wait for stop, collect locals + String8List locals = {0}; + for(;;) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + String8 response = rd_test__ipc_cmd(scratch.arena, ctx, debugger_pid, s("state")); + MD_Node *state = md_child_from_string(md_tree_from_string(scratch.arena, response), s("state"), 0); + MD_Node *stop_count = md_child_from_string(state, s("stop_count"), 0); + U64 new_stop_count = 0; + try_u64_from_str8_c_rules(stop_count->first->string, &new_stop_count); + scratch_end(scratch2); + if(new_stop_count != initial_stop_count) { - str8_list_push(scratch.arena, &locals, c->string); + MD_Node *locals_root = md_child_from_string(state, s("locals"), 0); + for MD_EachNode(c, locals_root->first) + { + str8_list_push(scratch.arena, &locals, c->string); + } + break; } - break; } - } - - // rjf: evaluate all locals - String8List eval_cmd_strings = {0}; - for EachNode(n, String8Node, locals.first) - { - str8_list_pushf(scratch.arena, &eval_cmd_strings, "eval %S", n->string); - } - StringJoin join = {.sep = s(" ; ")}; - String8 eval_msg = str8_list_join(scratch.arena, &eval_cmd_strings, &join); - String8 response = rd_test__ipc_cmd(scratch.arena, cmdline, test_artifacts_path, debugger_pid, eval_msg); - MD_Node *response_tree = md_tree_from_string(scratch.arena, response); - for MD_EachNode(n, response_tree->first) - { - if(str8_match(n->string, s("eval"), 0)) + + // rjf: evaluate all locals + String8List eval_cmd_strings = {0}; + for EachNode(n, String8Node, locals.first) { - String8 eval_dump = md_string_from_tree(scratch.arena, n); - str8_list_push(scratch.arena, &test_log_strings, eval_dump); + str8_list_pushf(scratch.arena, &eval_cmd_strings, "eval %S", n->string); } + StringJoin join = {.sep = s(" ; ")}; + String8 eval_msg = str8_list_join(scratch.arena, &eval_cmd_strings, &join); + String8 response = rd_test__ipc_cmd(scratch.arena, ctx, debugger_pid, eval_msg); + MD_Node *response_tree = md_tree_from_string(scratch.arena, response); + for MD_EachNode(n, response_tree->first) + { + if(str8_match(n->string, s("eval"), 0)) + { + String8 eval_dump = md_string_from_tree(scratch.arena, n); + str8_list_push(scratch.arena, &test_log_strings, eval_dump); + } + } + + // rjf: end exemplar test + rd_test__exemplar_test_finish(arena, ctx, test_log_strings); + + // rjf: close debugger + rd_test__close_debugger(debugger); } - // rjf: end exemplar test - rd_test__exemplar_test_finish(arena, test_log_strings, test_exemplars_path, test_artifacts_path, result_out, test_out); - - // rjf: close debugger - rd_test__close_debugger(debugger); - scratch_end(scratch); } //////////////////////////////// //~ rjf: Tests -#if 0 -Test(mule_main_step_regressions_0) +Test(mule_main_9ff1e58f_step_regressions_0) { - String8 exe_path = {0}; - rd_test__stepping_regressions(arena, cmdline, test_exemplars_path, test_artifacts_path, result_out, test_out, rd_test__mule_main_path(arena), s("mule_main"), 0); + rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("mule_main"), 0); } -Test(mule_main_step_regressions_1) +Test(mule_main_9ff1e58f_step_regressions_1) { - rd_test__stepping_regressions(arena, cmdline, test_exemplars_path, test_artifacts_path, result_out, test_out, rd_test__mule_main_path(arena), s("mule_main"), 1); + rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("mule_main"), 1); } -Test(control_flow_step_regressions) +Test(mule_main_9ff1e58f_control_flow_step_regressions) { - rd_test__stepping_regressions(arena, cmdline, test_exemplars_path, test_artifacts_path, result_out, test_out, rd_test__mule_main_path(arena), s("mule_main"), 0); + rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("control_flow_stepping_tests"), 0); } -SkippedTest(type_coverage_eval_regressions) +SkippedTest(mule_main_9ff1e58f_type_coverage_eval_regressions) { // TODO(rjf): see @eval_regressions - rd_test__eval_regressions(arena, cmdline, test_exemplars_path, test_artifacts_path, result_out, test_out, rd_test__mule_main_path(arena), s("C:/devel/raddebugger/src/mule/mule_main.cpp:723")); + rd_test__eval_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("C:/devel/raddebugger/src/mule/mule_main.cpp:723")); } -#endif #if 0 //////////////////////////////// diff --git a/src/torture/torture.c b/src/torture/torture.c index 57769d19..493583ad 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -5,6 +5,7 @@ global String8 g_stdout_file_name = str8_lit_comp("torture.out"); global String8 g_wdir; global String8 g_exemplar_dir; +global String8 g_input_data_dir; global String8 g_out = str8_lit_comp("torture_artifacts"); global B32 g_verbose; global B32 g_redirect_stdout = 1; @@ -169,7 +170,16 @@ t_run_caller(void *raw_ctx) if (ctx->test->skip) { ctx->result.status = TestStatus_Skip; } else { - ctx->test->test_fn(scratch.arena, ctx->cmdline, g_exemplar_dir, g_wdir, &ctx->result, &test_out); + TestCtx test_ctx = + { + .cmdline = ctx->cmdline, + .exemplars_path = g_exemplar_dir, + .artifacts_path = g_wdir, + .input_data_path = g_input_data_dir, + .result_out = &ctx->result, + .test_out = &test_out, + }; + ctx->test->test_fn(scratch.arena, &test_ctx); } if (ctx->result.status == TestStatus_Fail || ctx->result.status == TestStatus_Crash) { @@ -1281,6 +1291,13 @@ t_entry_point(CmdLine *cmdline) g_exemplar_dir = str8f(scratch.arena, "%S/data/test_exemplars/%S", root_dir_path, test->label); } + // rjf: find input data directory + { + String8 binary_dir_path = get_process_info()->binary_path; + String8 root_dir_path = str8_chop_last_slash(binary_dir_path); + g_input_data_dir = str8f(scratch.arena, "%S/local/test_data", root_dir_path); + } + // setup output directory g_wdir = str8f(scratch.arena, "%S/%S", g_out, test->label); g_wdir = full_path_from_path(scratch.arena, g_wdir); diff --git a/src/torture/torture.h b/src/torture/torture.h index 97cfd597..78b8df15 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -24,7 +24,7 @@ typedef struct #define T_Ok(c) TestCheck(c) #define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) -#define t_outf(...) str8_list_pushf(arena, test_out, ## __VA_ARGS__) +#define t_outf(...) str8_list_pushf(arena, ctx->test_out, ## __VA_ARGS__) //////////////////////////////////////////////////////////////// From d909f187d519c973454c350a41ce88d8d72db2be Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 16:21:38 -0700 Subject: [PATCH 708/850] be robust to any line endings in exemplar data --- src/raddbg/tests/raddbg_tests.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index b604e9f6..b7a60626 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -68,6 +68,18 @@ rd_test__exemplar_test_finish(Arena *arena, TestCtx *ctx, String8List test_log_s make_directory(ctx->exemplars_path); String8 exemplar_path = str8f(scratch.arena, "%S/exemplar_%S", ctx->exemplars_path, lower_from_str8(scratch.arena, string_from_operating_system(OperatingSystem_CURRENT))); String8 exemplar_data = data_from_file_path(scratch.arena, exemplar_path); + String8List exemplar_data_lines = str8_split(scratch.arena, exemplar_data, (U8 *)"\n", 1, StringSplitFlag_KeepEmpties); + String8List exemplar_data_lines_sanitized = {0}; + for EachNode(n, String8Node, exemplar_data_lines.first) + { + String8 line_trimmed = n->string; + if(line_trimmed.size != 0 && line_trimmed.str[line_trimmed.size-1] == '\r') + { + line_trimmed.size -= 1; + } + str8_list_push(scratch.arena, &exemplar_data_lines_sanitized, line_trimmed); + } + exemplar_data = str8_list_join(scratch.arena, &exemplar_data_lines_sanitized, &(StringJoin){.sep = s("\n")}); // rjf: if exemplar data is empty -> just save our output as the new exemplar if(exemplar_data.size == 0) @@ -78,7 +90,7 @@ rd_test__exemplar_test_finish(Arena *arena, TestCtx *ctx, String8List test_log_s // rjf: if we have exemplar data, then we need to check that it matches if(exemplar_data.size != 0) { - B32 current_matches_exemplar = str8_match(test_log_current, exemplar_data, 0); + B32 current_matches_exemplar = str8_match(str8_skip_chop_whitespace(test_log_current), str8_skip_chop_whitespace(exemplar_data), 0); if(!current_matches_exemplar) { String8 diff_cmd = str8f(scratch.arena, "diff %S %S", From 4dd22c9e518fb9b1f34bd35290fa2d78dd070ba0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 16:42:29 -0700 Subject: [PATCH 709/850] re-enable p2r determinism tests --- project.raddbg | 2 +- src/rdi_from_pdb/tests/rdi_from_pdb_tests.c | 80 +++++++++++++-------- src/torture/torture.c | 12 ---- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/project.raddbg b/project.raddbg index 167bebd2..d33469ef 100644 --- a/project.raddbg +++ b/project.raddbg @@ -41,6 +41,6 @@ target: { executable: "build/torture.exe" working_directory: build - arguments: "raddbg/* --gui" + arguments: "rdi_from_pdb/* --gui" enabled: 1 } diff --git a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c index 16a44fa0..f391de11 100644 --- a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c +++ b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c @@ -1,18 +1,39 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -SkippedTest(p2r_determ) +internal String8 +p2r_test__test_path(Arena *arena, TestCtx *ctx, String8 id, String8 name) { - U64 num_repeats_per_pdb = 32; + String8 path = str8f(arena, "%S/%S/%S", ctx->input_data_path, id, name); + return path; +} + +Test(p2r_determinism) +{ + U64 num_repeats_per_pdb = 16; String8 pdb_paths[] = { - push_str8f(arena, "%S/mule_main.pdb", g_test_data), - push_str8f(arena, "%S/mule_module.pdb", g_test_data), + p2r_test__test_path(arena, ctx, s("mule_main_9ff1e58f"), s("mule_main.pdb")), + p2r_test__test_path(arena, ctx, s("mule_main_9ff1e58f"), s("mule_module.pdb")), }; + B32 all_pdbs_exist_locally = 1; for EachElement(pdb_idx, pdb_paths) + { + String8 pdb_path = pdb_paths[pdb_idx]; + if(properties_from_file_path(pdb_path).modified == 0) + { + all_pdbs_exist_locally = 0; + break; + } + } + if(!all_pdbs_exist_locally) + { + TestSkip(); + } + else for EachElement(pdb_idx, pdb_paths) { // rjf: unpack paths, make output directory - String8 pdb_path = path_normalized_from_string(arena, pdb_paths[pdb_idx]); + String8 pdb_path = pdb_paths[pdb_idx]; // rjf: generate all RDIs String8List rdi_paths = {0}; @@ -21,12 +42,12 @@ SkippedTest(p2r_determ) ProcessList processes = {0}; for EachIndex(repeat_idx, num_repeats_per_pdb) { - String8 rdi_name = push_str8f(arena, "repeat_%I64u.rdi", repeat_idx); - String8 rdi_path = t_make_file_path(arena, rdi_name); + String8 rdi_name = str8f(arena, "repeat_%I64u.rdi", repeat_idx); + String8 rdi_path = str8f(arena, "%S/%S", ctx->artifacts_path, rdi_name); str8_list_push(arena, &rdi_paths, rdi_path); - String8 cmdl = str8f(arena, "radbin -rdi -deterministic %S -out:%S", pdb_path, rdi_path); + String8 cmdl = str8f(arena, "radbin --rdi --deterministic %S --out:%S", pdb_path, rdi_path); Process process = launch_cmd_line(cmdl); - T_Ok(!process_match(process_zero(), process)); + TestCheck(!process_match(process_zero(), process)); process_list_push(arena, &processes, process); } for EachNode(n, ProcessNode, processes.first) @@ -43,8 +64,8 @@ SkippedTest(p2r_determ) String8 rdi_path = n->string; String8 dump_path = str8f(arena, "%S.dump", rdi_path); str8_list_push(arena, &dump_paths, dump_path); - Process process_handle = launch_cmd_linef("radbin -dump -deterministic %S -out:%S", rdi_path, dump_path); - T_Ok(!process_match(process_zero(), process_handle)); + Process process_handle = launch_cmd_linef("radbin --dump --deterministic %S --out:%S", rdi_path, dump_path); + TestCheck(!process_match(process_zero(), process_handle)); process_list_push(arena, &processes, process_handle); } for EachNode(n, ProcessNode, processes.first) @@ -54,12 +75,12 @@ SkippedTest(p2r_determ) } // rjf: gather all hashes/paths - U64 rdi_hashes_count = rdi_paths.node_count; - U128 *rdi_hashes = push_array(arena, U128, rdi_hashes_count); - String8 *rdi_paths_array = push_array(arena, String8, rdi_hashes_count); - U64 dump_hashes_count = dump_paths.node_count; - U128 *dump_hashes = push_array(arena, U128, dump_hashes_count); - String8 *dump_paths_array = push_array(arena, String8, dump_hashes_count); + U64 rdi_hashes_count = rdi_paths.node_count; + U128 *rdi_hashes = push_array(arena, U128, rdi_hashes_count); + String8 *rdi_paths_array = push_array(arena, String8, rdi_hashes_count); + U64 dump_hashes_count = dump_paths.node_count; + U128 *dump_hashes = push_array(arena, U128, dump_hashes_count); + String8 *dump_paths_array = push_array(arena, String8, dump_hashes_count); { U64 idx = 0; for EachNode(n, String8Node, rdi_paths.first) @@ -67,9 +88,8 @@ SkippedTest(p2r_determ) Temp scratch = scratch_begin(0, 0); String8 rdi_path = n->string; String8 path = rdi_path; - T_Ok(path.size); String8 data = data_from_file_path(scratch.arena, path); - T_Ok(data.size); + TestCheck(data.size != 0); rdi_hashes[idx] = u128_hash_from_str8(data); rdi_paths_array[idx] = path; scratch_end(scratch); @@ -82,9 +102,8 @@ SkippedTest(p2r_determ) { Temp scratch = scratch_begin(0, 0); String8 path = n->string; - T_Ok(path.size); String8 data = data_from_file_path(scratch.arena, path); - T_Ok(data.size); + TestCheck(data.size != 0); dump_hashes[idx] = u128_hash_from_str8(data); dump_paths_array[idx] = path; scratch_end(scratch); @@ -93,12 +112,12 @@ SkippedTest(p2r_determ) } // rjf: determine if all hashes match - U64 mismatch_idx = max_U64; + U64 mismatch_num = 0; for EachIndex(idx, rdi_hashes_count) { if(!u128_match(rdi_hashes[idx], rdi_hashes[0])) { - mismatch_idx = idx; + mismatch_num = idx+1; break; } } @@ -106,18 +125,19 @@ SkippedTest(p2r_determ) { if(!u128_match(dump_hashes[idx], dump_hashes[0])) { - mismatch_idx = idx; + mismatch_num = idx+1; break; } } // rjf: output bad case info - if (mismatch_idx != max_U64) { - U64 idx = mismatch_idx; - t_outf(" pdb[%I64u] \"%S\"\n", idx, pdb_path); - t_outf(" rdi[%I64u] 0x%I64x:%I64x \"%S\"\n", idx, rdi_hashes[idx].u64[0], rdi_hashes[idx].u64[1], rdi_paths_array[idx]); - t_outf(" dump[%I64u] 0x%I64x:%I64x \"%S\"\n", idx, dump_hashes[idx].u64[0], dump_hashes[idx].u64[1], dump_paths_array[idx]); - T_Ok(0); + if(mismatch_num != 0) + { + U64 idx = mismatch_num-1; + test_outf(" pdb[%I64u] \"%S\"\n", idx, pdb_path); + test_outf(" rdi[%I64u] 0x%I64x:%I64x \"%S\"\n", idx, rdi_hashes[idx].u64[0], rdi_hashes[idx].u64[1], rdi_paths_array[idx]); + test_outf(" dump[%I64u] 0x%I64x:%I64x \"%S\"\n", idx, dump_hashes[idx].u64[0], dump_hashes[idx].u64[1], dump_paths_array[idx]); } + TestCheck(mismatch_num == 0); } } diff --git a/src/torture/torture.c b/src/torture/torture.c index 493583ad..043ff76b 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -11,7 +11,6 @@ global B32 g_verbose; global B32 g_redirect_stdout = 1; global B32 g_stop_on_first_fail_or_crash = 1; global B32 g_build_only = 0; -global String8 g_test_data; // tests global TestInfo *g_sorted_test_infos[ArrayCount(test_infos)] = {0}; @@ -1108,17 +1107,6 @@ t_entry_point(CmdLine *cmdline) g_gcc_path = cmd_line_string(cmdline, str8_lit("gcc")); g_linker_path = cmd_line_string(cmdline, str8_lit("linker")); - // - // Handle -test_data - // - { - g_test_data = cmd_line_string(cmdline, str8_lit("test_data")); - if (g_test_data.size == 0) { - g_test_data = str8f(scratch.arena, "%S/build", t_cwd_path()); - //fprintf(stderr, "WARNING: The test data folder path was not specified. Specify the path when running the program, assuming: %.*s --test_data:%.*s\n", str8_varg(cmdline->exe_name), str8_varg(g_test_data)); - } - } - // // Handle optional -target // From c746fadcaabab922cb96204ae004003f07f6f2e4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 16:48:26 -0700 Subject: [PATCH 710/850] run -> run_tests --- run.bat => run_tests.bat | 180 +++++++++++++++++++-------------------- run.sh => run_tests.sh | 0 2 files changed, 90 insertions(+), 90 deletions(-) rename run.bat => run_tests.bat (97%) rename run.sh => run_tests.sh (100%) mode change 100755 => 100644 diff --git a/run.bat b/run_tests.bat similarity index 97% rename from run.bat rename to run_tests.bat index a0f79b2e..9049980a 100644 --- a/run.bat +++ b/run_tests.bat @@ -1,90 +1,90 @@ -@echo off -setlocal enabledelayedexpansion - -set TARGET_VALUES=radlink radbin mule_main mule_module torture -set CC_VALUES=msvc clang -set MODE_VALUES=debug release -set RAW_ARGS=%* -set TORTURE_ARGS= -set RUN_TORTURE=1 - -:parse_args -if "%~1" == "" goto parse_done -if "%~1" == "--" goto parse_torture_args -if /i "%~1" == "msvc" set CC_VALUES=msvc && shift /1 && goto parse_args -if /i "%~1" == "clang" set CC_VALUES=clang && shift /1 && goto parse_args -if /i "%~1" == "debug" set MODE_VALUES=debug && shift /1 && goto parse_args -if /i "%~1" == "release" set MODE_VALUES=release && shift /1 && goto parse_args -if /i "%~1" == "no_torture" set RUN_TORTURE=0 && shift /1 && goto parse_args -echo usage: %~nx0 [msvc^|clang] [debug^|release] [no_torture] [-- torture-args] -exit /b 1 - -:parse_torture_args -shift /1 -if "%~1" == "" set "TORTURE_ARGS=" && goto parse_done -set "TORTURE_ARGS=%RAW_ARGS%" -if "%TORTURE_ARGS:~0,3%" == "-- " set "TORTURE_ARGS=%TORTURE_ARGS:~3%" && goto parse_done -set "TORTURE_ARGS=%TORTURE_ARGS:* -- =%" - -:parse_done -if not defined TORTURE_ARGS set "TORTURE_ARGS=* - -for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( - setlocal - - :: nuke artifacts from last run - if exist build/torture_artifacts rmdir /s /q build\torture_artifacts - if exist build\metagen.exe del /q build\metagen.exe - for %%t in (%TARGET_VALUES%) do ( - if exist build\%%t.exe del /q build\%%t.exe - if exist build\%%t.pdb del /q build\%%t.pdb - ) - - if "%%c" == "clang" ( - :: Prefer standalone LLVM clang over Visual Studio clang so ASAN runtime files match the compiler. - set "clang_path=" - for /f "tokens=*" %%i in ('where clang') do ( - set "candidate_clang_path=%%~dpi" - if "!candidate_clang_path:Microsoft Visual Studio=!"=="!candidate_clang_path!" ( - if not defined clang_path set "clang_path=!candidate_clang_path!" - ) - ) - if not defined clang_path ( - echo ERROR: standalone LLVM clang not found in PATH - exit /b 1 - ) - set PATH=!clang_path!;!PATH! - for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v - if not defined clang_version ( - echo ERROR: failed to detect clang version - exit /b 1 - ) - set PATH=!clang_path!..\lib\clang\!clang_version!\lib\windows;!PATH! - ) - - :: TODO: unblock asan - call build.bat meta %%c %%m raddbg raddbg_non_graphical || (endlocal exit /b 1) - - :: clang does not compile with asan in release mode because it runs out of memory - if "%%c" equ "clang" ( - if /i "%%m" equ "release" ( - call build.bat no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) - ) else ( - call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) - ) - ) else ( - call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) - ) - - if "%RUN_TORTURE%" equ "1" ( - pushd build - torture %TORTURE_ARGS% - popd - if errorlevel 1 ( - endlocal - exit /b 1 - ) - ) - - endlocal -) +@echo off +setlocal enabledelayedexpansion + +set TARGET_VALUES=radlink radbin mule_main mule_module torture +set CC_VALUES=msvc clang +set MODE_VALUES=debug release +set RAW_ARGS=%* +set TORTURE_ARGS= +set RUN_TORTURE=1 + +:parse_args +if "%~1" == "" goto parse_done +if "%~1" == "--" goto parse_torture_args +if /i "%~1" == "msvc" set CC_VALUES=msvc && shift /1 && goto parse_args +if /i "%~1" == "clang" set CC_VALUES=clang && shift /1 && goto parse_args +if /i "%~1" == "debug" set MODE_VALUES=debug && shift /1 && goto parse_args +if /i "%~1" == "release" set MODE_VALUES=release && shift /1 && goto parse_args +if /i "%~1" == "no_torture" set RUN_TORTURE=0 && shift /1 && goto parse_args +echo usage: %~nx0 [msvc^|clang] [debug^|release] [no_torture] [-- torture-args] +exit /b 1 + +:parse_torture_args +shift /1 +if "%~1" == "" set "TORTURE_ARGS=" && goto parse_done +set "TORTURE_ARGS=%RAW_ARGS%" +if "%TORTURE_ARGS:~0,3%" == "-- " set "TORTURE_ARGS=%TORTURE_ARGS:~3%" && goto parse_done +set "TORTURE_ARGS=%TORTURE_ARGS:* -- =%" + +:parse_done +if not defined TORTURE_ARGS set "TORTURE_ARGS=* + +for %%m in (%MODE_VALUES%) do for %%c in (%CC_VALUES%) do ( + setlocal + + :: nuke artifacts from last run + if exist build/torture_artifacts rmdir /s /q build\torture_artifacts + if exist build\metagen.exe del /q build\metagen.exe + for %%t in (%TARGET_VALUES%) do ( + if exist build\%%t.exe del /q build\%%t.exe + if exist build\%%t.pdb del /q build\%%t.pdb + ) + + if "%%c" == "clang" ( + :: Prefer standalone LLVM clang over Visual Studio clang so ASAN runtime files match the compiler. + set "clang_path=" + for /f "tokens=*" %%i in ('where clang') do ( + set "candidate_clang_path=%%~dpi" + if "!candidate_clang_path:Microsoft Visual Studio=!"=="!candidate_clang_path!" ( + if not defined clang_path set "clang_path=!candidate_clang_path!" + ) + ) + if not defined clang_path ( + echo ERROR: standalone LLVM clang not found in PATH + exit /b 1 + ) + set PATH=!clang_path!;!PATH! + for /f "tokens=3 delims=. " %%v in ('clang -v 2^>^&1 ^| findstr version') do set clang_version=%%v + if not defined clang_version ( + echo ERROR: failed to detect clang version + exit /b 1 + ) + set PATH=!clang_path!..\lib\clang\!clang_version!\lib\windows;!PATH! + ) + + :: TODO: unblock asan + call build.bat meta %%c %%m raddbg raddbg_non_graphical || (endlocal exit /b 1) + + :: clang does not compile with asan in release mode because it runs out of memory + if "%%c" equ "clang" ( + if /i "%%m" equ "release" ( + call build.bat no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) + ) else ( + call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) + ) + ) else ( + call build.bat asan no_meta %%c %%m !TARGET_VALUES! || (endlocal exit /b 1) + ) + + if "%RUN_TORTURE%" equ "1" ( + pushd build + torture %TORTURE_ARGS% + popd + if errorlevel 1 ( + endlocal + exit /b 1 + ) + ) + + endlocal +) diff --git a/run.sh b/run_tests.sh old mode 100755 new mode 100644 similarity index 100% rename from run.sh rename to run_tests.sh From f72d7bbe61c092e15a30fed3b7de086288328801 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 19:15:45 -0700 Subject: [PATCH 711/850] run -> run_tests --- .github/workflows/builds.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index e2319c71..7e7fee05 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -97,7 +97,7 @@ jobs: - name: Run shell: bash run: | - CC="${{ matrix.compiler }}" ./run.sh clang "${{ matrix.mode }}" -- \* $TORTURE_FLAGS + CC="${{ matrix.compiler }}" ./run_tests.sh clang "${{ matrix.mode }}" -- \* $TORTURE_FLAGS - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 @@ -129,7 +129,7 @@ jobs: run: | for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do set "VS_INSTALL=%%i" call "%VS_INSTALL%\VC\Auxiliary\Build\vcvarsall.bat" x64 - call run.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- * %TORTURE_FLAGS% || exit /b 1 + call run_tests.bat ${{ matrix.compiler }} ${{ matrix.mode }} -- * %TORTURE_FLAGS% || exit /b 1 - name: Upload Artifacts if: failure() uses: actions/upload-artifact@v7 From 2dee864547ea70371744916012db602cd895dda8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 26 May 2026 19:22:27 -0700 Subject: [PATCH 712/850] fix fn pointer mismatch on clang builds --- build.sh | 2 +- src/torture/torture.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index bd1aa75a..31f386fa 100755 --- a/build.sh +++ b/build.sh @@ -62,7 +62,7 @@ fi # --- Build Everything (@build_targets) --------------------------------------- cd build if [[ "${raddbg:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg; fi -if [[ "${raddbg_non_graphical:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c -DWM_STUB=1 -DWM_STUB_DEFAULT_REFRESH_RATE=60.f -DR_BACKEND=R_BACKEND_STUB $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg_non_graphical; fi +if [[ "${raddbg_non_graphical:-0}" == "1" ]]; then didbuild=1 && $compile ../src/raddbg/raddbg_main.c -DWM_STUB=1 -DR_BACKEND=R_BACKEND_STUB $cc_link $cc_os_gfx $cc_render $cc_font_provider -o raddbg_non_graphical; fi if [[ "${radbin:-0}" == "1" ]]; then didbuild=1 && $compile ../src/radbin/radbin_main.c $cc_link -o radbin; fi if [[ "${radlink:-0}" == "1" ]]; then didbuild=1 && $compile ../src/linker/lnk.c $cc_link -o radlink; fi if [[ "${torture:-0}" == "1" ]]; then didbuild=1 && $compile ../src/torture/torture_main.c $cc_link $cc_os_gfx $cc_render $cc_font_provider -o torture; fi diff --git a/src/torture/torture.c b/src/torture/torture.c index 043ff76b..87b38417 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -1082,7 +1082,7 @@ t_entry_point(CmdLine *cmdline) // Gather tests { for EachIndex(i, test_infos_count) { g_sorted_test_infos[i] = &test_infos[i]; } - radsort(g_sorted_test_infos, test_infos_count, t_test_info_is_before); + radsort(g_sorted_test_infos, test_infos_count, (int (*)(void *, void *))t_test_info_is_before); } // From 1c1fef0f970909a907d7c52e30147e61de669d7e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 May 2026 09:51:26 -0700 Subject: [PATCH 713/850] lfs tracking for exes/pdbs/rdis/elfs --- .gitattributes | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitattributes b/.gitattributes index 5281f032..b5a7dadc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,3 +2,7 @@ src/lib_rdi/rdi.h text=auto eol=lf src/lib_rdi/rdi.c text=auto eol=lf *.meta.* text=auto eol=lf +*.exe filter=lfs diff=lfs merge=lfs -text +*.pdb filter=lfs diff=lfs merge=lfs -text +*.elf filter=lfs diff=lfs merge=lfs -text +*.rdi filter=lfs diff=lfs merge=lfs -text From d98d6b56d9f0f05fbca243f148ee50c457d57ab9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 May 2026 09:56:05 -0700 Subject: [PATCH 714/850] check in test input binaries, adjust torture test data path --- .../mule_main_9ff1e58f/inline_body.cpp | 8 + data/test_inputs/mule_main_9ff1e58f/mule_c.c | 126 + data/test_inputs/mule_main_9ff1e58f/mule_c.h | 10 + .../mule_main_9ff1e58f/mule_inline.cpp | 64 + .../mule_main_9ff1e58f/mule_main.cpp | 3270 +++++++++++++++++ .../mule_main_9ff1e58f/mule_main.pdb | 3 + .../mule_main_9ff1e58f/mule_main.rdi | 3 + .../mule_main_9ff1e58f/mule_main_9ff1e58f.exe | 3 + .../mule_main_9ff1e58f/mule_module.cpp | 60 + .../mule_main_9ff1e58f/mule_module.dll | Bin 0 -> 667648 bytes .../mule_main_9ff1e58f/mule_module.pdb | 3 + .../mule_main_9ff1e58f/mule_module.rdi | 3 + .../mule_main_9ff1e58f/mule_o2.cpp | 119 + src/torture/torture.c | 2 +- 14 files changed, 3673 insertions(+), 1 deletion(-) create mode 100644 data/test_inputs/mule_main_9ff1e58f/inline_body.cpp create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_c.c create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_c.h create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_inline.cpp create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_main.cpp create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_main.pdb create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_main.rdi create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_main_9ff1e58f.exe create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_module.cpp create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_module.dll create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_module.pdb create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_module.rdi create mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_o2.cpp diff --git a/data/test_inputs/mule_main_9ff1e58f/inline_body.cpp b/data/test_inputs/mule_main_9ff1e58f/inline_body.cpp new file mode 100644 index 00000000..12514c38 --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/inline_body.cpp @@ -0,0 +1,8 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +bias = (bias^x)&7; +x -= bias; +x *= 2; +x *= x; +x += bias; \ No newline at end of file diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_c.c b/data/test_inputs/mule_main_9ff1e58f/mule_c.c new file mode 100644 index 00000000..286ad44d --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/mule_c.c @@ -0,0 +1,126 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +/* +* Program to run in debugger organized to provide tests for +* single threaded stepping, breakpoints, evaluation. +*/ + +//////////////////////////////// +// NOTE(allen): Complex Types + +#include + +void +c_type_coverage_eval_tests(void){ +#if _WIN32 + _Fcomplex x = _FCbuild(0.f, 1.f); + _Dcomplex y = _Cbuild(0.f, -1.f); + +#else + float complex x = 0.f + 1.f*I; + double complex y = 0.0 - 1.0*I; + +#endif +} + +//////////////////////////////// +// NOTE(allen): Reuse Type Names From Another Module + +#include + +typedef struct Basics{ + double a; + float b; + unsigned long long c; + long long d; + unsigned int e; + int f; + unsigned short g; + short h; + unsigned char i; + char j; + + int z; +} Basics; + +typedef struct Basics_Stdint{ + double x1; + float x2; + uint64_t x3; + int64_t x4; + uint32_t x5; + int32_t x6; + uint16_t x7; + int16_t x8; + uint8_t x9; + int8_t x0; +} Basics_Stdint; + +typedef struct Pair{ + int i; + float f; +} Pair; + +void +c_versions_of_same_types(void){ + Basics basics = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; + Basics_Stdint basics_stdint = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; + Pair memory_[] = { + {100, 1.f}, + {101, 2.f}, + {102, 4.f}, + {103, 8.f}, + {104, 16.f}, + {105, 32.f}, + }; + + int x = memory_[3].i + basics.f; +} + +//////////////////////////////// +//~ NOTE(rjf): Bitfields + +typedef struct TypeWithBitfield TypeWithBitfield; +struct TypeWithBitfield +{ + int v : 14; + int w : 4; + int x : 32; + int y : 4; + int z : 10; +}; + +typedef struct BitfieldType64 BitfieldType64; +struct BitfieldType64 +{ + uint64_t size : 63; + uint64_t is_free : 1; +}; + +static int mut_xarray[4] = {100, 101, 102, 103}; +static float mut_farray[4] = {100.5f, 101.5f, 102.5f, 103.5f}; + +void +c_type_with_bitfield_usage(void) +{ + TypeWithBitfield b = {0}; + b.v = 100; + b.w = 6; + b.x = 434512; + b.y = 7; + b.z = 12; + int x = (b.v + b.x); + int y = (b.y - b.z); + int z = (b.w) + 5; + BitfieldType64 b64 = {0}; + b64.size = 524288; + b64.is_free = 1; + int abc = mut_xarray[0]; + mut_xarray[0] += 1; + abc += mut_xarray[0]; + abc += mut_xarray[1]; + abc += mut_xarray[2]; + float f = mut_farray[0] + mut_farray[1] + mut_farray[2] + mut_farray[3]; + int w = 0; +} diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_c.h b/data/test_inputs/mule_main_9ff1e58f/mule_c.h new file mode 100644 index 00000000..2a9c8bb8 --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/mule_c.h @@ -0,0 +1,10 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +/* +* Program to run in debugger organized to provide tests for +* single threaded stepping, breakpoints, evaluation. +*/ + +void c_type_coverage_eval_tests(void); +void c_type_with_bitfield_usage(void); \ No newline at end of file diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_inline.cpp b/data/test_inputs/mule_main_9ff1e58f/mule_inline.cpp new file mode 100644 index 00000000..d9a0ad11 --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/mule_inline.cpp @@ -0,0 +1,64 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +/* +** Make sure we have an inlined function +*/ + +#if defined(_MSC_VER) +# define FORCE_INLINE __forceinline +#elif defined(__clang__) || defined(__GNUC__) +# define FORCE_INLINE __attribute__((always_inline)) +#else +# error need force inline for this compiler +#endif + +//////////////////////////////// +// NOTE(allen): Inline Stepping + +unsigned int fixed_frac_bits = 5; +static unsigned int bias = 7; + +static FORCE_INLINE unsigned int +fixed_mul(unsigned int a, unsigned int b){ + unsigned int c = (((a - bias)*(b - bias)) >> fixed_frac_bits) + bias; + return(c); +} + +static FORCE_INLINE unsigned int +multi_file_inlinesite(unsigned int x){ + // force compiler to generate annotations for code that's inside another file +#include "inline_body.cpp" + return x >> fixed_frac_bits; +} + +static unsigned int test_value = 0; + +unsigned int +inline_stepping_tests(void){ + bias = 15; + + // NOTE(nick): Interesting that CL does not generate inline site symbols in order of apperance here unlike clang. + + // CL: + // BinaryAnnotations: CodeLengthAndCodeOffset d 0 + // BinaryAnnotation Length: 4 bytes (1 bytes padding) + // + // Clang: + // BinaryAnnotations: LineOffset 1 CodeLength d + // BinaryAnnotation Length: 4 bytes (0 bytes padding) + unsigned int x = fixed_mul(5001, 7121); + + // CL: + // BinaryAnnotations: CodeOffsetAndLineOffset d File 0 CodeOffsetAndLineOffset 22 LineOffset 1e + // CodeLengthAndCodeOffset 2 3 + // BinaryAnnotation Length: 12 bytes (1 bytes padding) + // + // Clang: + // BinaryAnnotations: File 18 LineOffset ffffffe6 CodeOffset d CodeOffsetAndLineOffset 22 + // File 0 LineOffset 1e CodeOffset 3 CodeLength 2 + // BinaryAnnotation Length: 16 bytes (0 bytes padding) + unsigned int z = multi_file_inlinesite(x); + return(z); +} + diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main.cpp b/data/test_inputs/mule_main_9ff1e58f/mule_main.cpp new file mode 100644 index 00000000..69c9ba19 --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/mule_main.cpp @@ -0,0 +1,3270 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +/* +** Program to run in debugger organized to provide tests for +** stepping, breakpoints, evaluation, cross-module calls. +*/ + +#if _WIN32 && _DEBUG +#pragma comment(linker, "/nodefaultlib:libcmt") +#pragma comment(lib, "libcmtd") +#endif + +#include +#include +#include +#include +#if !_WIN32 +# define RADDBG_MARKUP_STUBS +#endif +#define RADDBG_MARKUP_IMPLEMENTATION +#include "lib_raddbg_markup/raddbg_markup.h" + +//////////////////////////////// +// NOTE(allen): System For DLL Testing + +typedef void TestFunction(void); + +static void mule_init(void); +static TestFunction* mule_get_module_function(char *name); + +#if _WIN32 + +#include + +HMODULE mule_dll = 0; + +static void +mule_init(void){ + mule_dll = LoadLibraryA("mule_module.dll"); +} + +static TestFunction* +mule_get_module_function(char *name){ + TestFunction *result = (TestFunction*)GetProcAddress(mule_dll, name); + return(result); +} + +#else + +static void +mule_init(void){ + // TODO(allen): implement +} + +static TestFunction* +mule_get_module_function(char *name){ + // TODO(allen): implement + return(0); +} + +#endif + + +//////////////////////////////// +// NOTE(nick): Entry Point + +int +mule_main(int argc, char **argv); + +#if _WIN32 +#include +#include +int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ + int argc = __argc; + char **argv = __argv; + int result = mule_main(argc, argv); + return(result); +} +#else +int main(int argc, char **argv){ + return(mule_main(argc, argv)); +} +#endif + +//////////////////////////////// +// NOTE(nick): BSS section test + +#if defined(__clang__) +# pragma clang section bss="muleBSS" +#elif defined(_MSC_VER) +// NOTE(nick): clang-cl is borken it allocates memory and sets Initialized Flag on the seciton. +// This is was reported by Jeff => https://bugs.llvm.org/show_bug.cgi?id=47939 +// +// This is still unresolved, last checked Sep 11, 2023. +# pragma bss_seg("muleBSS") +#else +# error "bss not defined" +#endif +char global_variable_in_bss[4096*10000]; + +//////////////////////////////// +// NOTE(allen): Inline Stepping (Built In Separate Unit) + +extern unsigned int fixed_frac_bits; +unsigned int inline_stepping_tests(void); + + +//////////////////////////////// +// NOTE(rjf): -O2 Optimized Code (Built In Separate Unit) + +void optimized_build_eval_tests(void); +void optimized_struct_parameters_eval_tests(void); + +//////////////////////////////// +// NOTE(allen): Type Coverage Eval + +#include + +struct Basics +{ + char a; + unsigned char b; + short c; + unsigned short d; + int e; + unsigned int f; + long long g; + unsigned long long h; + float i; + double j; + int z; +}; + +struct Basics_Stdint +{ + int8_t a; + uint8_t b; + int16_t c; + uint16_t d; + int32_t e; + uint32_t f; + int64_t g; + uint64_t h; + float i; + double j; +}; + +struct Pair +{ + int x; + float y; +}; + +struct Fixed_Array +{ + Pair pairs[10]; + int count; +}; + +struct Dynamic_Array +{ + Pair *pairs; + int count; +}; +raddbg_type_view(Dynamic_Array, slice($)); + +template +struct TemplatedDynamicArray +{ + T *v; + int count; +}; +raddbg_type_view(TemplatedDynamicArray, rows($, count, array(v, count))); + +template +struct OpaqueTemplatedDynamicArray +{ + void *v; + int count; +}; +raddbg_type_view(OpaqueTemplatedDynamicArray, array(cast(type *)v, count)); + +struct Struct_With_Embedded_Arrays +{ + int x; + float y; + Pair pairs[10]; + char z; +}; + +typedef unsigned int Custom_Index_Type; + +typedef void Function_No_Params_Type(void); +typedef void Function_Few_Params_Type(Pair *pairs, int count, Function_No_Params_Type *no_params_type); + +static Function_No_Params_Type *ty_no_params = 0; +static Function_Few_Params_Type *ty_few_params = 0; + +struct Callback{ + Function_Few_Params_Type *few_params; + Function_No_Params_Type *no_params; + Pair pair; +}; + +union Vector_R2 +{ + struct + { + float x; + float y; + }; + float v[2]; +}; +raddbg_type_view(Vector_R2, rows($, x, y)); + +typedef union Matrix4x4F32 Matrix4x4F32; +union Matrix4x4F32 +{ + float elements[4][4]; +}; +raddbg_type_view(Matrix4x4F32, columns($.elements, $[0], $[1], $[2], $[3])); + +union PackedF16 +{ + uint16_t v; + struct + { + uint16_t mantissa : 10; + uint16_t exponent : 5; + uint16_t sign : 1; + }; +}; +raddbg_type_view(PackedF16, + exponent == 0 ? (0.00006103515625f*mantissa/1024.f) : + (exponent == 31 && mantissa == 0 && sign == 1) ? "-infinity" : + (exponent == 31 && mantissa == 0 && sign == 1) ? "+infinity" : + (exponent == 31) ? "NaN" : + (exponent < 15) ? (1.f/(1<<(15 - exponent)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) : + (exponent > 15) ? ((1<<(exponent-15)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) : + ((sign * -2 + 1) * 1.f + mantissa/1024.f)); + +enum Kind +{ + Kind_Negative = -1, + Kind_None, + Kind_First, + Kind_Second, + Kind_Third, + Kind_Fourth, + Kind_COUNT, +}; + +enum Flag +{ + Flag_None = 0, + Flag_First = 1, + Flag_Second = 2, + Flag_Third = 4, + Flag_Fourth = 8, + Flag_AllMoreNarrow = 0xFF, + Flag_AllNarrow = 0xFFFF, + Flag_All = 0xFFFFFFFF, +}; + +struct Has_Enums +{ + Kind kind; + Flag flags; +}; + +struct Discriminated_Union +{ + Kind kind; + union + { + struct + { + int x; + int y; + Vector_R2 vector; + } first; + Pair second; + struct + { + Function_Few_Params_Type *few_params; + Pair pairs[4]; + } third; + struct + { + Kind sub_kind; + Flag flags; + } fourth; + }; +}; +raddbg_type_view(Discriminated_Union, + kind == Kind.First ? first : + kind == Kind.Second ? second : + kind == Kind.Third ? third : + kind == Kind.Fourth ? fourth : + $); + +struct Crazy_Union +{ + Kind kind; + union + { + struct + { + int first_and_third__x; + int first_and_third__y; + int first_and_third__z; + } first_and_third; + struct + { + char *second__name; + Pair second__pairs[16]; + } second; + }; + union + { + struct + { + char *first__name; + int first__x; + } first; + struct + { + char *third__name; + Function_Few_Params_Type *third__few_params; + } third; + }; +}; +raddbg_type_view(Crazy_Union, + kind == Kind.First ? rows($, first_and_third, first) : + kind == Kind.Second ? rows($, second) : + kind == Kind.Third ? rows($, first_and_third, third) : + kind == Kind.Fourth ? kind : + $); + +struct Linked_List{ + Linked_List *next; + Linked_List *prev; + int x; +}; + +enum{ + Anonymous_A, + Anonymous_B, + Anonymous_C, + Anonymous_D, +}; + +typedef uint32_t SizedKind; +enum SizedKindEnum +{ + SizedKind_A, + SizedKind_B, + SizedKind_C, + SizedKind_D, +}; + +typedef Kind Alias1; +typedef Flag Alias2; +typedef Has_Enums Alias3; +typedef Discriminated_Union Alias4; + +struct Has_A_Pre_Forward_Reference{ + struct Gets_Referenced_Forwardly *pointer; +}; + +struct Gets_Referenced_Forwardly{ + int x; + int y; +}; + +struct Has_A_Post_Forward_Reference{ + struct Gets_Referenced_Forwardly value; +}; + +struct TypeWithMemberFunction +{ + int x; + int y; + int z; + char *name; + __declspec(noinline) void SetInfo(int _x, int _y, char *_name) + { + x = _x; + y = _y; + z = 0; + name = _name; + OutputDebugStringA("setting info\n"); + } +}; + +static void +no_params1(void){ + +} + +static void +few_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){ + +} + +// +// NOTE(rjf): this doesn't work because MSVC - despite GENERATING DEBUG INFO +// FOR THE MyByte TYPEDEF - does not actually *reference* this typedef +// anywhere, and instead treats all `MyByte *`s as `char *`s, thus completely +// eliminating the point of the typedef and view. :( +// +typedef char MyByte; +raddbg_type_view(MyByte *, no_string($)); + +static void +variadic_params(char *fmt, ...) +{ + int x = 0; +} + +static void +type_coverage_eval_tests(void) +{ + Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + Basics_Stdint basics_stdint = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + + uint32_t a = (1<<31); + int32_t b = (1<<31); + + uint32_t abcd = 0xaabbccdd; + int64_t abcd64 = (int64_t)abcd; + + char string[] = "Hello World!"; + char longer_text[] = + "Suppose there was some text\n" + "With multiple lines in it\r\n" + "\t> What ways might it be rendered?\n" + "\t> How would it deal with line endings?\r\n"; + wchar_t a_wide_string[] = + L"This is a string, but instead of being encoded in a stream of bytes,\n" + L"it is encoded in a stream of 2-byte packages!\n"; + char some_data_with_a_string[] = + { + 'H', 'e', 'l', 'l', 'o', 27, 27, 2, 27, 125, + }; + struct SomeDataStructured + { + char data[4]; + }; + SomeDataStructured *some_data = (SomeDataStructured *)&some_data_with_a_string[0]; + char *string_ptr = &string[0]; + + const char *const_string = "Hello, World!"; + const char const_string_array[] = "Hello, World!"; + const char *const const_ptr_const_string = "Hello, World!"; + + MyByte *non_string_byte_ptr = "Hello, World!"; + + void *pointer = &basics; + Basics *pointer_to_basics = &basics; + Basics **pointer_to_pointer_to_basics = &pointer_to_basics; + + Fixed_Array fixed = + { + { + { 3, 4.f}, + { 5, 6.f}, + { 7, 8.f}, + { 9, 10.f}, + {11, 12.f}, + {13, 14.f}, + {15, 16.f}, + {17, 18.f}, + {19, 20.f}, + }, + 9 + }; + Pair memory_[] = + { + {100, 1.f}, + {101, 2.f}, + {102, 4.f}, + {103, 8.f}, + {104, 16.f}, + {105, 32.f}, + }; + Dynamic_Array dynamic = + { + memory_, + 6 + }; + + TemplatedDynamicArray templated_dynamic = {dynamic.pairs, dynamic.count}; + TemplatedDynamicArray templated_dynamics[] = + { + {dynamic.pairs, dynamic.count}, + {dynamic.pairs, dynamic.count}, + {dynamic.pairs, dynamic.count}, + {dynamic.pairs, dynamic.count}, + {dynamic.pairs, dynamic.count}, + }; + + OpaqueTemplatedDynamicArray otd = {dynamic.pairs, dynamic.count}; + + raddbg_pin(columns(sequence(6), fixed.pairs[$], memory_[$])); + raddbg_pin(basics); + raddbg_pin(fixed); + raddbg_pin(pointer); + raddbg_pin(dynamic); + + Struct_With_Embedded_Arrays swea = {0}; + { + swea.x = 4; + swea.y = 23.5f; + swea.pairs[0].x = 100; + swea.pairs[0].y = 123.f; + swea.pairs[2].x = 300; + swea.pairs[2].y = 323.f; + swea.pairs[5].x = 600; + swea.pairs[5].y = 623.f; + swea.z = 'z'; + } + + Struct_With_Embedded_Arrays *swea_ptr = &swea; + int access_via_ptr_member = swea_ptr->x; + + Custom_Index_Type custom_index = 42; + Custom_Index_Type more_custom_indices[] = { + 04,13,22,31,40 + }; + + Function_No_Params_Type *ptr_no_params = no_params1; + Function_No_Params_Type **ptr_ptr_no_params = &ptr_no_params; + Function_Few_Params_Type *ptr_few_params = few_params1; + Function_Few_Params_Type **ptr_ptr_few_params = &ptr_few_params; + Callback callback = {few_params1, no_params1, {1, 2.f}}; + + Matrix4x4F32 matrix = + { + { + {1.f, 0.f, 0.f, 0.f}, + {0.f, 1.f, 0.f, 0.f}, + {0.f, 0.f, 1.f, 0.f}, + {0.f, 0.f, 0.f, 1.f}, + } + }; + + Vector_R2 vector = {1.f, 2.f}; + + Has_Enums has_enums = {(Kind)4, (Flag)7}; + + struct EnumBitfields + { + Kind k1 : 4; + Kind k2 : 3; + Kind k3 : 1; + Kind k4 : 16; + }; + + EnumBitfields enum_bitfields = {}; + enum_bitfields.k1 = Kind_First; + enum_bitfields.k2 = Kind_Second; + enum_bitfields.k3 = Kind_None; + enum_bitfields.k4 = Kind_Fourth; + + Crazy_Union crazy_union = {}; + + crazy_union.kind = Kind_First; + crazy_union.kind = Kind_Second; + crazy_union.kind = Kind_Third; + crazy_union.kind = Kind_Fourth; + + Discriminated_Union discriminated_union = {}; + + discriminated_union.kind = Kind_First; + discriminated_union.first.x = 16; + discriminated_union.first.y = 8; + discriminated_union.first.vector.x = 4.f; + discriminated_union.first.vector.y = 2.f; + + discriminated_union.kind = Kind_Second; + discriminated_union.second.x = 123; + discriminated_union.second.y = 3.14f; + + discriminated_union.kind = Kind_Third; + discriminated_union.third.few_params = few_params1; + discriminated_union.third.pairs[0] = memory_[0]; + discriminated_union.third.pairs[1] = memory_[1]; + discriminated_union.third.pairs[2] = memory_[2]; + discriminated_union.third.pairs[3] = memory_[3]; + + discriminated_union.kind = Kind_Fourth; + discriminated_union.fourth.sub_kind = Kind_First; + discriminated_union.fourth.flags = (Flag)7; + + Linked_List list = {&list, &list, 0}; + + struct SLLNode + { + SLLNode *next; + SLLNode *the_real_next_ptr; + int x; + }; + SLLNode node6 = {0, 0, 6}; + SLLNode node5 = {0, &node6, 5}; + SLLNode node4 = {0, &node5, 4}; + SLLNode node3 = {0, &node4, 3}; + SLLNode node2 = {0, &node3, 2}; + SLLNode node1 = {0, &node2, 1}; + raddbg_pin(list(node1, the_real_next_ptr)); + + node6.next = &node1; + + Alias1 a1 = has_enums.kind; + Alias2 a2 = has_enums.flags; + Alias3 a3 = has_enums; + Alias4 a4 = discriminated_union; + + Has_A_Pre_Forward_Reference r1 = {0}; + Has_A_Post_Forward_Reference r2 = {0}; + + Basics &basics_ref = basics; + const Basics *basics_const_ptr = &basics; + const Basics &basics_const_ref = basics; + + union + { + int x; + char y[4]; + } integer_slicing = {123456789}; + + typedef struct stks + { + void *left; + size_t len; + } stks; + stks stks_test[256] = {0}; + stks *stks_first = &stks_test[0]; + stks *stks_ptr = stks_first + 8; + + TypeWithMemberFunction twmf = {0}; + twmf.SetInfo(123, 456, "foobar"); + + TestFunction *function = mule_get_module_function("dll_type_eval_tests"); + function(); + + int abc = 0; + for(int i = 0; i < 1000; i += 1) + { + if(i == 500) + { + abc+= 1; + } + int a = i + abc; + int b = a*5; + } + + char *names[] = + { + "samwise gamgee", "mithrandir", "grima wormtongue", "theodred", "theoden", "eomer", "eowyn", + "arwen", "sauron", "baggins", "proudfoot", "hardbottle", "bag end", "hobbiton", + "bree", "imladris", "isengard", "moria", "mount doom", "helm's deep", "bracegirdle", + "buckleberry ferry", "amun sul", "frodo", "bilbo", "buckland", "fangorn", "elrond", + "numenor", "treebeard", "shadowfax", "brego", "erod", "azufel", "dunedain", + "saruman", "aragorn", "gandalf", "meriadoc brandybuck", "peregrine took", "faramir", "boromir", + "ecthelion", "denethor", "mithrandil", "isildur", "haldir", "elessar", "elendil", + "dead marsh", "rohan", "gondor", "anarion", "earendil", "cirith ungol", "minas morghul", + "minas tirith", "barad-dur", "rivendell", "pellenor", "ithilien", "anduril", "narsil", + "edoras", "mordor", "osgiliath", + }; + + for(int i = 0; i < sizeof(names)/sizeof(names[0]); i += 1) + { + OutputDebugStringA(names[i]); + OutputDebugStringA("\n"); + } + + if(1) + { + OutputDebugStringA("this is inside a branch!\n"); + OutputDebugStringA("foo"); + OutputDebugStringA("bar"); + OutputDebugStringA("baz"); + } + + const int32_t x1 = 3; + const int32_t y1 = -10; + const int32_t z1 = x1 + y1; + + std::string small_cplusplus_string = "smallstr"; + std::string cplusplus_string = "This is a C++ string!"; + + std::vector int_vector; + int_vector.push_back(1); + int_vector.push_back(2); + int_vector.push_back(3); + int_vector.push_back(4); + int_vector.push_back(5); + int_vector.push_back(6); + int_vector.push_back(7); + +#if 0 + std::unordered_map people = + { + {"Peter", 1}, + {"Oliver", 2}, + {"Jack", 3}, + }; +#endif + + std::vector *pint_vector = &int_vector; + std::vector &rint_vector = int_vector; + + std::vector dynamic_array_vector; + dynamic_array_vector.push_back(dynamic); + dynamic_array_vector.push_back(dynamic); + dynamic_array_vector.push_back(dynamic); + dynamic_array_vector.push_back(dynamic); + + SizedKind sized_kind = SizedKind_C; + + int x = (int)(Anonymous_D); + + variadic_params("foo", 123, 456); +} + +//////////////////////////////// +// NOTE(allen): Mutating Variables Eval + +static const int con_some_constant = 4; +static const float con_some_constant_f = 0.04f; + +static int mut_x = 0; +static int mut_y; +static int mut_xarray[4] = {0, 1, 2, 3}; +static int *mut_xptr; + +static float mut_f = 0; +static float mut_g; +static float mut_farray[4] = {0.5f, 1.5f, 2.5f, 3.5f}; +static float *mut_fptr; + +static float mut_arrayarray[3][3]; + +static Linked_List mut_link; + +static void +mutate_in_function(int *array, int count){ + for (int i = 0; i < count; i += 1){ + array[i] += 1; + } + + for (int i = 0; i < 4; i += 1){ + mut_farray[i] += 1.f; + } +} + +static void +mutating_variables_eval_tests(void){ + //////////////////////////////// + // NOTE(allen): Basics + + int array_literal[10] = { + 10, 20, 30, 40, 50, 60, 70, 80, 90, + }; + + Basics struct_literal = { + -1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001, + }; + + array_literal[0] = struct_literal.e = 9; + + int x = mut_x; + int y = x + 10 + con_some_constant; + mut_y = y; + mut_xarray[0] += 0; + mut_xarray[1] += x; + mut_xarray[2] += y; + mut_xarray[3] += x + y; + + mut_xptr = &mut_xarray[2]; + + *mut_xptr -= (y - x)/2; + *(mut_xptr - 1) += 11; + + float f = mut_f + .333f + con_some_constant_f; + float g = f + 10.1f; + mut_g = g; + mut_farray[0] += 0.000001f; + mut_farray[1] += f; + mut_farray[2] += g; + mut_farray[3] += f + g; + + mut_fptr = &mut_farray[3]; + + *mut_fptr -= (g - f)*0.5f; + *(mut_fptr - 1) += 1.f; + + float a = 0.777f; + for (int i = 0; i < 3; i += 1){ + float b = a*a - 1.f; + for (int j = 0; j < 3; j += 1){ + mut_arrayarray[i][j] = b; + b += 0.111f; + } + a += 0.333f; + } + + //////////////////////////////// + // NOTE(allen): Changes in functions + + mutate_in_function(array_literal, 10); + + mutate_in_function(array_literal, 10); + + //////////////////////////////// + // NOTE(allen): Changes through pointers + + Basics basic = struct_literal; + Basics advanced = struct_literal; + + Basics *struct_pointer = &basic; + + basic.a += 1; + advanced.a += 1; + struct_pointer->a += 1; + + struct_pointer = &advanced; + + basic.b += 1; + advanced.b += 1; + struct_pointer->b += 1; + + Linked_List links[5]; + for (int i = 0; i < 5; i += 1){ + links[i].next = &links[i + 1]; + links[i].prev = &links[i - 1]; + links[i].x = i; + } + links[0].prev = 0; + links[4].next = &mut_link; + mut_link.prev = &links[4]; + mut_link.next = 0; + mut_link.x = 1000; + + Linked_List *link_ptr = links; + + link_ptr = link_ptr->next; + + link_ptr = &links[4]; + link_ptr = &mut_link; + + Linked_List sentinel = {0}; + sentinel.x = -1; + sentinel.next = &links[0]; + links[0].prev = &sentinel; + sentinel.prev = &mut_link; + mut_link.next = &sentinel; + + link_ptr = &sentinel; +} + +//////////////////////////////// +// NOTE(allen): Global Eval + +struct NestedNodeInner{ + unsigned int small0; + unsigned int small1; + unsigned int big0; + unsigned int big1; +}; + +struct NestedNodeOuter{ + NestedNodeOuter *next; + NestedNodeInner *inner_nodes; + unsigned int inner_node_count; +}; + +static void +nested_types_eval_tests(void){ + // doing some setup + NestedNodeOuter *outer1 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); + NestedNodeOuter *outer2 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); + NestedNodeOuter *outer3 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); + + outer1->next = outer2; + outer2->next = outer3; + outer3->next = 0; + + outer1->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); + outer1->inner_node_count = 10; + + outer2->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); + outer2->inner_node_count = 10; + + outer3->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); + outer3->inner_node_count = 10; + + for (unsigned int i = 0; i < 10; i += 1){ + outer1->inner_nodes[i].small0 = i; + outer1->inner_nodes[i].small1 = 2*i; + outer1->inner_nodes[i].big0 = 0xFFFFFF + 0xF*i; + outer1->inner_nodes[i].big1 = 0xFFFFFF + 0xFF*i; + + outer2->inner_nodes[i].small0 = 1 + i; + outer2->inner_nodes[i].small1 = 3*i; + outer2->inner_nodes[i].big0 = 0x1000000 + 0x10*i; + outer2->inner_nodes[i].big1 = 0x1000000 + 0x101*i; + + outer3->inner_nodes[i].small0 = 2 + i; + outer3->inner_nodes[i].small1 = 4*i; + outer3->inner_nodes[i].big0 = 0x8000000 + 0xF0*i; + outer3->inner_nodes[i].big1 = 0x8000000 + 0xF0F*i; + } + + // okay eval it here + int x = 0; +} + +//////////////////////////////// +// NOTE(rjf): Struct Parameters Eval + +static void +struct_parameter_helper(Basics basics) +{ + basics.a += 1; + basics.a += 1; + basics.a += 1; +} + +static void +struct_parameters_eval_tests(void) +{ + Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + struct_parameter_helper(basics); +} + +//////////////////////////////// +// NOTE(allen): Global Eval + +static int g_abc = 100; +static float g_xyz = 21.f; +static Alias1 g_kind = Kind_First; + +static void +complicated_global_mutation(int *x){ + *x = (int)g_xyz; +} + +static void +cross_unit_global_mutation(void){ + fixed_frac_bits = 10; +} + +static int +function_with_duplicate_local_statics(void) +{ + static char *l_abc = "foobar"; + static int l_xyz = 123; + static Kind l_kind = Kind_First; + int x = l_xyz + (int)(int64_t)(l_abc); + return x; +} + +static void +global_eval_tests(void) +{ + g_abc = 11*11; + g_xyz = (float)g_abc - 21.f; + + int z = g_abc; + complicated_global_mutation(&z); + + complicated_global_mutation(&g_abc); + + if (g_kind == Kind_First){ + g_abc -= 1; + g_kind = Kind_None; + } + + cross_unit_global_mutation(); + + static int l_abc = 200; + static float l_xyz = 42.f; + static Alias1 l_kind = Kind_Second; + + l_abc = g_abc*2; + l_xyz = g_xyz*2; + l_kind = (Alias1)(g_kind + 1); + + function_with_duplicate_local_statics(); +} + +//////////////////////////////// +// NOTE(allen): Return Eval + +static int +complicated_return_expression(void){ + int x = 171717; + return((x % 13) <= 5?(x % 19)*11:(x - 500)%200); +} + +static void +return_eval_tests(void){ + complicated_return_expression(); +} + +//////////////////////////////// +// NOTE(allen): TLS Eval + +#if _WIN32 +# define thread_var __declspec(thread) +#else +# define thread_var __thread +#endif + +thread_var int tls_a = 100; +thread_var int tls_b = 999; + +static void +tls_eval_tests(void){ + tls_a = (tls_a + tls_b)/2; + tls_b = tls_b - tls_a; + + TestFunction *dll_tls_eval_test = mule_get_module_function("dll_tls_eval_test"); + if (dll_tls_eval_test != 0){ + dll_tls_eval_test(); + } +} + +//////////////////////////////// +// NOTE(allen): Complicated Type Coverage Eval + +struct Complicated_Type_Members{ + int x600[2][2][2][2]; + int *x601[2][2][2][2]; + int (*x602)[2][2][2][2]; + int (*x603[2])[2][2][2]; + int (*(*x604[2])[2])[2][2]; + int (*(*(*x605[2])[2])[2])[2]; + + int (*x33[2])(void); + int (*x34[3])(void); + int (*x35[2][2])(void); + + int (*(*z33)(void))[2]; + int (*(*z34)(void))[3]; + int (*(*z35)(void))[2][2]; + + int (*(*f2)(void))(void); + int (*(*(*f3)(void))(void))(void); + int (*(*f4)(int))(void); + int (*(*f5)(void))(int); + int (*(*f6)(int))(int); + int (*(*(*f7_growing)(char))(short))(int); + int (*(*(*f7_shrinking)(int))(short))(char); +}; + +static void +complicated_type_coverage_tests(void){ + Complicated_Type_Members m = {0}; + + int x1 = {0}; + int *x2 = {0}; + int **x3 = {0}; + + int x4a[2] = {0}; + int *x4[2] = {0}; + int x5a[3] = {0}; + int *x5[3] = {0}; + int *x6[2][2] = {0}; + int (*x7)[2] = {0}; + int (*x8)[3] = {0}; + int (*x9)[2][2] = {0}; + + int x600[2][2][2][2] = {0}; + int *x601[2][2][2][2] = {0}; + int (*x602)[2][2][2][2] = {0}; + int (*x603[2])[2][2][2] = {0}; + int (*(*x604[2])[2])[2][2] = {0}; + int (*(*(*x605[2])[2])[2])[2] = {0}; + + int x606_growing [2][3][4][5] = {0}; + int x606_shrinking[5][4][3][2] = {0}; + + int (*(*(*x607_growing [2])[3])[4])[5] = {0}; + int (*(*(*x607_shrinking[5])[4])[3])[2] = {0}; + + int **x10[2] = {0}; + int **x11[3] = {0}; + int **x12[2][2] = {0}; + int *(*x13)[2] = {0}; + int *(*x14)[3] = {0}; + int *(*x15)[2][2] = {0}; + int **x16[2] = {0}; + int **x17[3] = {0}; + int **x18[2][2] = {0}; + + int (*y1[2])[2] = {0}; + int (*y2[3])[2] = {0}; + int (*y3[2][2])[2] = {0}; + int (*y4[2])[3] = {0}; + int (*y5[3])[3] = {0}; + int (*y6[2][2])[3] = {0}; + int (*y7[2])[2][2] = {0}; + int (*y8[3])[2][2] = {0}; + int (*y9[2][2])[2][2] = {0}; + + int (*x19)(void) = {0}; + int (*x20)(int) = {0}; + int (*x21)(int, int) = {0}; + int (*x22)(int*, int) = {0}; + int (*x23)(int**, int) = {0}; + int (*x24)(int**, int*) = {0}; + int (*x25)(int**, int**) = {0}; + + int *(*x26)(void) = {0}; + int *(*x27)(int) = {0}; + int *(*x28)(int, int) = {0}; + int *(*x29)(int*, int) = {0}; + int *(*x30)(int**, int) = {0}; + int *(*x31)(int**, int*) = {0}; + int *(*x32)(int**, int**) = {0}; + + int (*x33[2])(void) = {0}; + int (*x34[3])(void) = {0}; + int (*x35[2][2])(void) = {0}; + + int (*x36[2])(int) = {0}; + int (*x37[3])(int) = {0}; + int (*x38[2][2])(int) = {0}; + + int (*x39[2])(int, int) = {0}; + int (*x40[3])(int, int) = {0}; + int (*x41[2][2])(int, int) = {0}; + + int (*x42[2])(int*, int) = {0}; + int (*x43[3])(int*, int) = {0}; + int (*x44[2][2])(int*, int) = {0}; + + int (*x45[2])(int**, int) = {0}; + int (*x46[3])(int**, int) = {0}; + int (*x47[2][2])(int**, int) = {0}; + + int (*x48[2])(int**, int*) = {0}; + int (*x49[3])(int**, int*) = {0}; + int (*x50[2][2])(int**, int*) = {0}; + + int (*x51[2])(int**, int**) = {0}; + int (*x52[3])(int**, int**) = {0}; + int (*x53[2][2])(int**, int**) = {0}; + + int (*(*z33)(void))[2] = {0}; + int (*(*z34)(void))[3] = {0}; + int (*(*z35)(void))[2][2] = {0}; + + int (*(*z36)(int))[2] = {0}; + int (*(*z37)(int))[3] = {0}; + int (*(*z38)(int))[2][2] = {0}; + + int (*(*z39)(int, int))[2] = {0}; + int (*(*z40)(int, int))[3] = {0}; + int (*(*z41)(int, int))[2][2] = {0}; + + int (*(*z42)(int*, int))[2] = {0}; + int (*(*z43)(int*, int))[3] = {0}; + int (*(*z44)(int*, int))[2][2] = {0}; + + int (*(*z45)(int**, int))[2] = {0}; + int (*(*z46)(int**, int))[3] = {0}; + int (*(*z47)(int**, int))[2][2] = {0}; + + int (*(*z48)(int**, int*))[2] = {0}; + int (*(*z49)(int**, int*))[3] = {0}; + int (*(*z50)(int**, int*))[2][2] = {0}; + + int (*(*z51)(int**, int**))[2] = {0}; + int (*(*z52)(int**, int**))[3] = {0}; + int (*(*z53)(int**, int**))[2][2] = {0}; + + int (*(*z303[2])(void)) = {0}; + int (*(*z304[3])(void)) = {0}; + int (*(*z305[2][2])(void)) = {0}; + + int (*(*z306[2])(int)) = {0}; + int (*(*z307[3])(int)) = {0}; + int (*(*z308[2][2])(int)) = {0}; + + int (*(*z309[2])(int, int)) = {0}; + int (*(*z400[3])(int, int)) = {0}; + int (*(*z401[2][2])(int, int)) = {0}; + + int (*(*z402[2])(int*, int)) = {0}; + int (*(*z403[3])(int*, int)) = {0}; + int (*(*z404[2][2])(int*, int)) = {0}; + + int (*(*z405[2])(int**, int)) = {0}; + int (*(*z406[3])(int**, int)) = {0}; + int (*(*z407[2][2])(int**, int)) = {0}; + + int (*(*z408[2])(int**, int*)) = {0}; + int (*(*z409[3])(int**, int*)) = {0}; + int (*(*z500[2][2])(int**, int*)) = {0}; + + int (*(*z501[2])(int**, int**)) = {0}; + int (*(*z502[3])(int**, int**)) = {0}; + int (*(*z503[2][2])(int**, int**)) = {0}; + + int (*(*f2)(void))(void) = {0}; + int (*(*(*f3)(void))(void))(void) = {0}; + int (*(*f4)(int))(void) = {0}; + int (*(*f5)(void))(int) = {0}; + int (*(*f6)(int))(int) = {0}; + int (*(*(*f7_growing)(char))(short))(int) = {0}; + int (*(*(*f7_shrinking)(int))(short))(char) = {0}; + + int (*f8)(int (*)(void)) = {0}; + int (*f9)(void (*)(int)) = {0}; + void (*f10)(int (*)(int)) = {0}; + int (*f11)(int, int (*)(void)) = {0}; + int (*f12)(int (*)(void), int) = {0}; + int (*f13)(int (*)(void), int (*)(void)) = {0}; + + int (*f14)(int (*)(void)) = {0}; + int (*f15)(int (*)(int (*)(void))) = {0}; + int (*f16)(int (*)(int (*)(int (*)(void)))) = {0}; + int (*f17)(int (*)(int (*)(int (*)(int (*)(void))))) = {0}; + + int (*f18)(int (*)(void)) = {0}; + int (*f19)(int (*(*)(void))(void)) = {0}; + int (*f20)(int (*(*(*)(void))(void))(void)) = {0}; + int (*f21)(int (*(*(*(*)(void))(void))(void))(void)) = {0}; + + int (*(*(*(*f22)(void))(void))(void))(void) = {0}; + int (*(*(*(*f23)(int [2]))(void))(void))(void) = {0}; + int (*(*(*(*f24)(int *[2]))(int [3]))(void))(void) = {0}; + int (*(*(*(*f25)(int (*)[2]))(int *[3]))(int [4]))(void) = {0}; + int (*(*(*(*f26)(int **(**)[2]))(int (*)[3]))(int *[4]))(int [5]) = {0}; + + int x = 0; +} + +//////////////////////////////// +// NOTE(allen): Extended Type Coverage Eval + +template +struct Template_Example{ + X x; + int y; +}; + +template +struct Template_Example2{ + X x; + Y y; +}; + +template +struct Template_Example3{ + X x; + Y y; + Template_Example3(X x, Y y) + { + this->x = x; + this->y = y; + } + ~Template_Example3() + { + int x = 2; + int y = 5; + int z = x + y; + } +}; + +struct SingleInheritanceBase +{ + int x; + int y; +}; + +struct SingleInheritanceDerived : SingleInheritanceBase +{ + int z; + int w; +}; + +struct Has_Members{ + int a; + int b; + uint64_t c; + uint64_t d; + Basics bas; + + int w(void){ return a; } + int x(void){ return b; } + uint64_t y(void){ return c; } + uint64_t z(void){ return d; } + Basics bas_f(void){ return bas; } +}; + +struct Has_Static_Members{ + int a; + int b; + static uint64_t c; + static uint64_t d; + + int w(void){ return a; } + int x(void){ return b; } + static uint64_t y(void){ return c; } + static uint64_t z(void){ return d; } +}; + +uint64_t Has_Static_Members::c = 0; +uint64_t Has_Static_Members::d = 0; + +struct Pointer_To_Member{ + int Has_Members::*member_ptr_int; + uint64_t Has_Members::*member_ptr_u64; + Basics Has_Members::*member_ptr_bas; + + int (Has_Members::*method_ptr_int)(void); + uint64_t (Has_Members::*method_ptr_u64)(void); + Basics (Has_Members::*method_ptr_bas)(void); +}; + +struct Has_Sub_Types{ + struct Sub_Type1{ + int x; + int y; + }; + + struct Sub_Type2{ + float x; + float y; + }; + + Sub_Type1 a; + Sub_Type2 b; +}; + +struct Conflicting_Type_Names{ + struct Sub_Type1{ + uint64_t z; + }; + + struct Sub_Type2{ + int64_t z; + }; + + Sub_Type1 a; + Sub_Type2 b; +}; + +struct Has_Private_Sub_Types{ + Has_Private_Sub_Types(char x1, char y1, + float x2, int y2, + int x3, float y3){ + this->a.x = x1; + this->a.y = y1; + this->b.x = x2; + this->b.y = y2; + this->c.x = x3; + this->c.y = y3; + } + + struct Public_Sub_Type{ + char x; + char y; + }; + Public_Sub_Type a; + + protected: + struct Protected_Sub_Type{ + float x; + int y; + }; + Protected_Sub_Type b; + + private: + struct Private_Sub_Type{ + int x; + float y; + }; + Private_Sub_Type c; +}; + +struct Vtable_Parent{ + virtual void a_virtual_function(void) = 0; + virtual void b_virtual_function(void) = 0; + virtual void c_virtual_function(void) = 0; + + void a_virtual_function(int r){ + for (int i = 0; i < r; i += 1){ + a_virtual_function(); + } + } +}; + +struct Vtable_Child : Vtable_Parent{ + int x; + int y; + + Vtable_Child(int a, int b){ + x = a; + y = b; + } + virtual void a_virtual_function(void){ + x = 0; + }; + virtual void b_virtual_function(void){ + y = 0; + }; + virtual void c_virtual_function(void){ + x = y; + }; +}; + +struct Vinheritance_Base{ + int x; + int y; + + virtual void a_virtual_function(void){ + x = 0; + }; + virtual void b_virtual_function(void){ + y = 0; + }; + virtual void x_virtual_function(void){ + y = x; + }; +}; + +struct Vinheritance_MidLeft : virtual Vinheritance_Base{ + float left; + + virtual void c1_virtual_function(void){ + left = 0; + }; + virtual void c2_virtual_function(void){ + left = 0; + }; +}; + +struct Vinheritance_MidRight : virtual Vinheritance_Base{ + float right; + + virtual void d_virtual_function(void){ + right = 0; + }; +}; + +struct Vinheritance_Child : Vinheritance_MidLeft, Vinheritance_MidRight{ + char *name; + + virtual void a_virtual_function(void){ + x = 1; + }; + virtual void c1_virtual_function(void){ + left = 1; + }; +}; + +struct Minheritance_Base{ + int x; + int y; +}; + +struct Minheritance_MidLeft : Minheritance_Base{ + float left; +}; + +struct Minheritance_MidRight : Minheritance_Base{ + float right; +}; + +struct Minheritance_Child : Minheritance_MidLeft, Minheritance_MidRight{ + char *name; +}; + +struct Pure +{ + virtual ~Pure() = default; + virtual void Foo() = 0; +}; + +struct PureChild : Pure +{ + virtual ~PureChild() = default; + virtual void Foo() {a += 1;} + double a = 0; +}; + +struct Base +{ + int x; + int y; + int z; + Base(){x = 1; y = 2; z = 3;} + virtual ~Base() = default; + virtual void Foo() = 0; +}; + +struct Derived : Base +{ + int r; + int g; + int b; + int a; + virtual ~Derived() = default; + virtual void Foo() + { + x += 1; + y += 1; + y += 1; + z += 1; + z += 1; + z += 1; + a += 1; + a += 1; + a += 1; + a += 1; + } +}; + +struct DerivedA : Base +{ + float a; + float b; + DerivedA() {a = 123.f; b = 123.f;} + virtual void Foo() {a += 1;} + virtual ~DerivedA() = default; +}; + +struct DerivedB : Base +{ + double c; + double d; + DerivedB() {c = 123.0; d = 123.0;} + virtual void Foo() {c += 1;} + virtual ~DerivedB() = default; +}; + +struct NonVirtualBase +{ + int x; + int y; + int z; +}; + +struct NonVirtualDerived : NonVirtualBase +{ + int r; + int g; + int b; + int a; +}; + +struct OverloadedMethods{ + int x; + int cool_method(void){ + return(x); + } + int cool_method(int z){ + int r = x; + x = z; + return(r); + } + void cool_method(int y, int z){ + if (x < z){ + x = y; + } + else{ + x = z; + } + } +}; + +struct HasStaticConstMembers +{ + int a; + int b; + static int c; + static int d; + static const int e = 789; + static const int f = 101112; +}; + +int HasStaticConstMembers::c = 123; +int HasStaticConstMembers::d = 456; + +struct Has_A_Constructor{ + int n; + int d; + Has_A_Constructor(int a, int b){ + int gcd = 1; + { + int x = a; + int y = b; + if (x < y){ + y = a; + x = b; + } + for (;y > 0;){ + int z = x%y; + x = y; + y = z; + } + gcd = x; + } + n = a/gcd; + d = b/gcd; + } + + static int N; + static int D; + ~Has_A_Constructor(){ + int m = N*d + n*D; + int e = d*D; + N = m; + D = d; + } +}; + +int Has_A_Constructor::N = 0; +int Has_A_Constructor::D = 1; + +struct Constructor_Gotcha_Test{ + int x; + int y; + void Constructor_Gotcha(void){ + x = y = 0; + } +}; + +struct Has_A_Friend{ + friend struct Modifies_Other; + int get_x(void){ return x; } + int get_y(void){ return y; } + + private: + int x; + int y; +}; + +struct Modifies_Other{ + int x; + int y; + + void talk_to_friend(Has_A_Friend *other){ + other->x = y; + other->y = x; + } +}; + +namespace UserNamespace{ + namespace SubA{ + struct Foo{ + int x; + int y; + }; + }; + namespace SubB{ + struct Foo{ + float u; + float v; + }; + }; + + SubA::Foo foo_a = {10, 20}; + SubB::Foo foo_b = {0.1f, 0.05f}; + + static void namespaced_function(void){ + foo_a.x = (int)(foo_a.y*foo_b.u); + foo_b.v = (float)(foo_a.x*foo_b.v); + } +}; + +static void +call_with_pass_by_reference(int &x){ + x += 1; +} + +static void +call_with_pass_by_const_reference(const int &x){ + int y = x; +} + +static void +extended_type_coverage_eval_tests(void){ + //////////////////////////////// + // NOTE(allen): Extensions to base type system. + { + int x = 0; + const int *x_ptr = &x; + int *const x_cptr = &x; + + call_with_pass_by_reference(x); + + call_with_pass_by_const_reference(x); + } + + //////////////////////////////// + // NOTE(allen): Extensions to user defined types + { + Template_Example temp_f = {1.f, 2}; + Template_Example temp_v = {(void*)&temp_f, 2}; + Template_Example > temp_tf = {temp_f, 2}; + Template_Example2 temp_if = {2, 1.f}; + Template_Example3 temp3_if(2, 1.f); + Template_Example3 temp3_vi((void *)&temp3_if, 1.f); + Template_Example3> temp3_itif(123, temp_if); + + SingleInheritanceDerived sid; + sid.x = 123; + sid.y = 456; + sid.z = 789; + sid.w = 999; + + Pointer_To_Member pointer_to_member = { + &Has_Members::a, &Has_Members::c, &Has_Members::bas, + &Has_Members::x, &Has_Members::z, &Has_Members::bas_f, + }; + + Has_Static_Members has_static_members = { 10, 20 }; + Has_Static_Members::c = 100; + Has_Static_Members::d = 110; + has_static_members.x(); + has_static_members.y(); + has_static_members.z(); + has_static_members.w(); + + Has_Sub_Types has_sub_types = { + {100, 200}, + {.1f, .2f}, + }; + + Conflicting_Type_Names conflicting_type_names = { + {10}, {-20}, + }; + + Has_Private_Sub_Types has_private_sub_types(1, 2, 4, 8, 16, 32); + + Vtable_Child vtable_child(1, 2); + vtable_child.a_virtual_function(); + + Vinheritance_Child vinheritance_child; + vinheritance_child.name = "foobar"; + vinheritance_child.left = 10.5f; + vinheritance_child.right = 13.0f; + vinheritance_child.x = -1; + vinheritance_child.y = -1; + + Minheritance_Child minheritance_child; + minheritance_child.name = "foobar"; + minheritance_child.left = 10.5f; + minheritance_child.right = 13.0f; + minheritance_child.Minheritance_MidLeft::x = -1; + minheritance_child.Minheritance_MidLeft::y = -1; + minheritance_child.Minheritance_MidRight::x = +1; + minheritance_child.Minheritance_MidRight::y = +1; + + Pure *child = new PureChild(); + child->Foo(); + child->Foo(); + child->Foo(); + delete child; + + Base *derived = new Derived(); + derived->Foo(); + derived->Foo(); + derived->Foo(); + delete derived; + + NonVirtualBase *non_virtual_derived = new NonVirtualDerived(); + non_virtual_derived->x += 1; + non_virtual_derived->x += 1; + non_virtual_derived->x += 1; + + std::unique_ptr ridiculous_cplusplus_base_class = std::make_unique(); + + std::vector> ridiculous_cplusplus_array; + for(int i = 0; i < 1024; i += 1) + { + if((i & 1) == 1) + { + ridiculous_cplusplus_array.push_back(std::make_unique()); + } + else + { + ridiculous_cplusplus_array.push_back(std::make_unique()); + } + } + + Base *base_array[1024] = {0}; + for(int i = 0; i < sizeof(base_array)/sizeof(base_array[0]); i += 1) + { + if((i & 1) == 1) + { + base_array[i] = new DerivedA(); + } + else + { + base_array[i] = new DerivedB(); + } + } + + OverloadedMethods overloaded_methods; + { + overloaded_methods.x = 0; + int a = overloaded_methods.cool_method(); + overloaded_methods.cool_method(-10, 100); + int b = overloaded_methods.cool_method(100); + overloaded_methods.cool_method(b*2, a*2); + int c = overloaded_methods.cool_method(a + b); + int z = c; + } + + Has_A_Constructor construct_me(360, 25); + + Has_A_Friend has_a_friend; + + Modifies_Other modifies_other; + modifies_other.x = 57; + modifies_other.y = 66; + + modifies_other.talk_to_friend(&has_a_friend); + + int x = has_a_friend.get_x(); + int y = has_a_friend.get_y(); + int z = x; + + HasStaticConstMembers static_const_members = {0}; + static_const_members.a = 123 + HasStaticConstMembers::c * HasStaticConstMembers::e; + static_const_members.b = 456 + HasStaticConstMembers::d * HasStaticConstMembers::f; + } + + //////////////////////////////// + // NOTE(allen): Namespaces + { + UserNamespace::namespaced_function(); + } +} + +//////////////////////////////// +//~ rjf: Templated Function Eval Tests + +typedef struct TemplateArg TemplateArg; +struct TemplateArg +{ + int x; + int y; + int z; + float a; + float b; + float c; + char *name; +}; + +template static T +templated_factorial(T t) +{ + T result = t; + if(t > 1) + { + result *= templated_factorial(t-1); + } + return result; +} + +template static T +compute_template_arg_info(T t) +{ + int sum = t.x + t.y + t.z; + int size = sizeof(t); + float sum_f = t.a + t.b + t.c; + OutputDebugStringA(t.name); + return t; +} + +static void +templated_function_eval_tests(void) +{ + int int_factorial = templated_factorial(10); + float float_factorial = templated_factorial(10); + TemplateArg arg = {1, 2, 3, 4.f, 5.f, 6.f, "my template arg"}; + compute_template_arg_info(arg); + int x = 0; +} + +//////////////////////////////// +//~ NOTE(allen): C Type Coverage + +extern "C"{ +#include "mule_c.h" +} + +//////////////////////////////// +//~ rjf: Basic Inline Line Info Tests + +#if defined(_MSC_VER) +# define FORCE_INLINE __forceinline +#elif defined(__clang__) +# define FORCE_INLINE __attribute__((always_inline)) +#else +# error need force inline for this compiler +#endif + +static FORCE_INLINE void +basic_inlinee(int inlinee_param_x, int inlinee_param_y, int inlinee_param_z) +{ + OutputDebugStringA("A\n"); + OutputDebugStringA("B\n"); + OutputDebugStringA("C\n"); + OutputDebugStringA("D\n"); +} + +static void +basic_inline_tests(void) +{ + OutputDebugStringA("{\n"); + basic_inlinee(12, 34, 56); + OutputDebugStringA("}\n"); +} + +//////////////////////////////// +//~ rjf: Fancy Visualization Eval Tests + +struct PackedBits +{ + unsigned char b1 : 1; + unsigned char b2 : 1; + unsigned char b3 : 1; + unsigned char b4 : 1; + unsigned char b5 : 1; + unsigned char b6 : 1; +}; +raddbg_type_view(unsigned char : 1, bool($)); + +struct Bitmap +{ + unsigned char *base; + int width; + int height; +}; +raddbg_type_view(Bitmap, bitmap(base, width, height)); + +static unsigned int +mule_bswap_u32(unsigned int x) +{ + unsigned int result = (((x & 0xFF000000) >> 24) | + ((x & 0x00FF0000) >> 8) | + ((x & 0x0000FF00) << 8) | + ((x & 0x000000FF) << 24)); + return result; +} + +static void +fancy_viz_eval_tests(void) +{ + //- rjf: windows -> GetLastError +#if _WIN32 + DWORD error_code = 0; + SetLastError(1234); + error_code = GetLastError(); + SetLastError(4567); + error_code = GetLastError(); + (void)error_code; +#endif + + //- rjf: booleans (checkboxes) + bool bool1 = 0; raddbg_pin(bool1); + bool bool2 = 1; raddbg_pin(bool2); + bool bool3 = 0; raddbg_pin(bool3); + PackedBits packed_bits = {}; + packed_bits.b1 = 1; + packed_bits.b3 = 1; + packed_bits.b5 = 1; + + //- rjf: sliders + float slide1 = 500.f; raddbg_pin(range1(slide1, 0, 1000)); + double slide2 = 0.75; raddbg_pin(range1(slide2, 0, 1.0)); + int slide3 = 25; raddbg_pin(range1(slide3, 0, 100)); + + //- rjf: colors + float example_color_4f32[4] = {1.00f, 0.85f, 0.25f, 1.00f}; + unsigned int example_color_u32 = 0xff6f30ff; + struct {float r, g, b, a;} example_color_struct = {0.50f, 0.95f, 0.75f, 1.00f}; + int x0 = 0; + raddbg_pin(color(example_color_4f32)); + raddbg_pin(color(example_color_u32)); + raddbg_pin(color(example_color_struct)); + + //- rjf: multiline text + char *long_string = ("This is an example of some very long text with line breaks\n" + "in it. This is a very common kind of data which is inspected\n" + "in the debugger while programming, and it is often a pain\n" + "when it is poorly supported.\n"); + char *code_string = ("#include \n" + "\n" + "int main(int argc, char**argv)\n" + "{\n" + " printf(\"Hello, World!\\n\");\n" + " return 0;\n" + "}\n\n"); + int x1 = 0; + raddbg_pin(text(long_string)); + raddbg_pin(text(code_string, lang=c)); + raddbg_pin(disasm(fancy_viz_eval_tests)); + + //- rjf: programmatic memory annotations + void *some_block_of_memory = malloc(256); + memset(some_block_of_memory, 0x27, 256); + raddbg_annotate_vaddr_range(some_block_of_memory, 256, "test memory annotation"); + + //- rjf: half-floats + PackedF16 f16s[] = + { + {0x0001}, // ~0.000000059604645 + {0x03ff}, // ~0.000060975552 + {0x0400}, // ~0.00006103515625 + {0x3555}, // ~0.33325195 + {0x3bff}, // ~0.99951172 + {0x3c00}, // 1 + {0x3c01}, // 1.00097656 + {0x7bff}, // 65504, + {0x7c00}, // +inf + {0xfc00}, // -inf + }; + + //- rjf: table index lookups + struct + { + char *name; + int x; + int y; + int z; + } + nodes[] = + { + {"---", 1, 7, 3}, + {"---", 5, 4, 2}, + {"second", 12, 41, 22}, + {"---", 8, 9, 1}, + {"---", 1, 1, 1}, + {"first", 50, 50, 50}, + {"fourth", 7, 7, 7}, + {"---", 7, 12, 1}, + {"third", 27, 43, 41}, + {"---", 2, 17, 50}, + }; + int node_indices[] = + { + 5, 2, 8, 6 + }; + raddbg_pin(columns(node_indices, nodes[$])); + + //- rjf: bitmaps + unsigned int background_color = 0x00000000; + unsigned int main_color = 0xff2424ff; + unsigned int shine_color = 0xff5693ff; + unsigned int shadow_color = 0xff238faf; + unsigned int bg = mule_bswap_u32(background_color); + unsigned int cl = mule_bswap_u32(main_color); + unsigned int sn = mule_bswap_u32(shine_color); + unsigned int sh = mule_bswap_u32(shadow_color); + unsigned int pixels[] = + { + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, cl, cl, bg, cl, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, cl, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, cl, sn, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, sh, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, sh, cl, cl, cl, sh, sh, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, sh, sh, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, + bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, + }; + raddbg_pin(bitmap(pixels, 18, 18)); + for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) + { + unsigned int r = pixels[i]&0x000000ff; + unsigned int a = pixels[i]&0xff000000; + pixels[i] = pixels[i]>>8; + pixels[i] &= ~0xffff0000; + pixels[i] |= (r<<16); + pixels[i] |= (a); + } + for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) + { + unsigned int r = pixels[i]&0x000000ff; + unsigned int a = pixels[i]&0xff000000; + pixels[i] = pixels[i]>>8; + pixels[i] &= ~0xffff0000; + pixels[i] |= (r<<16); + pixels[i] |= (a); + } + for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) + { + unsigned int r = pixels[i]&0x000000ff; + unsigned int a = pixels[i]&0xff000000; + pixels[i] = pixels[i]>>8; + pixels[i] &= ~0xffff0000; + pixels[i] |= (r<<16); + pixels[i] |= (a); + } + int x2 = 0; + + //- rjf: type-viewed bitmaps + Bitmap foo = {(unsigned char *)&pixels[0], 18, 18}; + raddbg_pin(foo); + + //- rjf: name collisions with debugger rules + Function_Few_Params_Type *raw = 0; + char *text = "some_important_text_here\n"; + Bitmap bitmap = foo; + int x3 = 0; + + //- rjf: 3D geometry + float vertex_data[] = // pos.x, pos.y, pos.z, nor.x, nor.y, nor.z, tex.u, tex.v, col.r, col.g, col.b, ... + { + -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 10.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 2.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 2.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 8.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 8.0f, 0.973f, 0.480f, 0.002f, + -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 10.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 10.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 10.0f, 0.973f, 0.480f, 0.002f, + 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 10.0f, 10.0f, 0.973f, 0.480f, 0.002f, + 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 2.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 8.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 8.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 10.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 10.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 10.0f, 10.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 10.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 2.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 2.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 8.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 8.0f, 0.612f, 0.000f, 0.069f, + 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 10.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 10.0f, 0.612f, 0.000f, 0.069f, + -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 10.0f, 10.0f, 0.612f, 0.000f, 0.069f, + -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 2.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 8.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 8.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 10.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 10.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 10.0f, 10.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 8.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, 0.6f, 0.0f, 1.0f, 0.0f, 2.0f, 2.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, 0.6f, 0.0f, 1.0f, 0.0f, 8.0f, 2.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, -0.6f, 0.0f, 1.0f, 0.0f, 2.0f, 8.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, -0.6f, 0.0f, 1.0f, 0.0f, 8.0f, 8.0f, 0.000f, 0.254f, 0.637f, + -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 10.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 10.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 8.0f, 10.0f, 0.000f, 0.254f, 0.637f, + 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 10.0f, 10.0f, 0.000f, 0.254f, 0.637f, + -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 2.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 8.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 10.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, -0.6f, 0.0f, -1.0f, 0.0f, 2.0f, 2.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, -0.6f, 0.0f, -1.0f, 0.0f, 8.0f, 2.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, 0.6f, 0.0f, -1.0f, 0.0f, 2.0f, 8.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, 0.6f, 0.0f, -1.0f, 0.0f, 8.0f, 8.0f, 0.001f, 0.447f, 0.067f, + -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 10.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 2.0f, 10.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 8.0f, 10.0f, 0.001f, 0.447f, 0.067f, + 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 10.0f, 10.0f, 0.001f, 0.447f, 0.067f, + -0.6f, 0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, -0.6f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + -0.6f, 0.6f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, + 1.0f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 1.0f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, + 0.6f, 0.6f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, -0.6f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + 0.6f, 0.6f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, + -1.0f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -1.0f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, + -0.6f, 1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, 1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + 0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, + -0.6f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + -0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + 0.6f, -1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, + }; + unsigned int index_data[] = + { + 0, 1, 9, 9, 8, 0, 1, 2, 5, 5, 4, 1, 6, 7, 10, 10, 9, 6, 2, 3, 11, 11, 10, 2, + 12, 13, 21, 21, 20, 12, 13, 14, 17, 17, 16, 13, 18, 19, 22, 22, 21, 18, 14, 15, 23, 23, 22, 14, + 24, 25, 33, 33, 32, 24, 25, 26, 29, 29, 28, 25, 30, 31, 34, 34, 33, 30, 26, 27, 35, 35, 34, 26, + 36, 37, 45, 45, 44, 36, 37, 38, 41, 41, 40, 37, 42, 43, 46, 46, 45, 42, 38, 39, 47, 47, 46, 38, + 48, 49, 57, 57, 56, 48, 49, 50, 53, 53, 52, 49, 54, 55, 58, 58, 57, 54, 50, 51, 59, 59, 58, 50, + 60, 61, 69, 69, 68, 60, 61, 62, 65, 65, 64, 61, 66, 67, 70, 70, 69, 66, 62, 63, 71, 71, 70, 62, + 72, 73, 74, 74, 75, 72, 76, 77, 78, 78, 79, 76, 80, 81, 82, 82, 83, 80, 84, 85, 86, 86, 87, 84, + 88, 89, 90, 90, 91, 88, 92, 93, 94, 94, 95, 92, 96, 97, 98, 98, 99, 96, 100, 101, 102, 102, 103, 100, + 104, 105, 106, 106, 107, 104, 108, 109, 110, 110, 111, 108, 112, 113, 114, 114, 115, 112, 116, 117, 118, 118, 119, 116, + 120, 121, 122, 122, 123, 120, 124, 125, 126, 126, 127, 124, 128, 129, 130, 130, 131, 128, 132, 133, 134, 134, 135, 132, + 136, 137, 138, 138, 139, 136, 140, 141, 142, 142, 143, 140, 144, 145, 146, 146, 147, 144, 148, 149, 150, 150, 151, 148, + 152, 153, 154, 154, 155, 152, 156, 157, 158, 158, 159, 156, 160, 161, 162, 162, 163, 160, 164, 165, 166, 166, 167, 164, + }; + int count = (sizeof index_data/4); + float *vtx = vertex_data; + int vtx_size = sizeof vertex_data; + raddbg_pin(geo3d(index_data, count = count, vtx = vtx, vtx_size = vtx_size)); + int x4 = 0; +} + +//////////////////////////////// +//~ rjf: Markup Tests + +static void +markup_tests(void) +{ + int x = 0; + raddbg_add_breakpoint(&x, sizeof(x), 0, 1, 0); + for(int i = 0; i < 10000; i += 1) + { + if(i == 5000) + { + x += 1; + } + } + raddbg_remove_breakpoint(&x, sizeof(x), 0, 1, 0); +} + +//////////////////////////////// +//~ NOTE(allen): Function Overload Resolution + +static int +overloaded_function(float y){ + int r = (int)(y + 0.5f); + return(r); +} + +static int +overloaded_function(float y, int x){ + int r = overloaded_function(y) + x; + return(r); +} + +static int +overloaded_function(int x){ + float y = (float)x; + int r = overloaded_function(y, 1); + return(r); +} + +//////////////////////////////// +// NOTE(allen): Control Flow Stepping + +static void +control_flow_stepping_tests(void){ + { + int a = 1; + if (a < 1){ + a += 1; + } + if (a < 2){ + a += 2; + } + } + + { + int a = 1; + if (a < 1) + { + a += 1; + } + if (a < 2) + { + a += 2; + } + } + + { + int a = 1; + if (a < 1) + a += 1; + if (a < 2) + a += 2; + } + + { + int a = 1; + int b = 2; + if (a <= b){ + if (a == b){ + b += 1; + } + else{ + a += 1; + } + } + else{ + if (a%2){ + a = b; + } + else{ + a = b - 1; + } + } + } + + { + int a = 1; + int b = 2; + if (a <= b) + { + if (a == b) + { + b += 1; + } + else + { + a += 1; + } + } + else + { + if (a%2) + { + a = b; + } + else + { + a = b - 1; + } + } + } + + { + int a = 1; + int b = 2; + if (a <= b) + if (a == b) + b += 1; + else + a += 1; + else + if (a%2) + a = b; + else + a = b - 1; + } + + { + int x = 0; + for (int i = 0; i < 10; i += 1){ + x += i; + } + } + + { + int x = 0; + for (int i = 0; i < 10; i += 1) + { + x += i; + } + } + + { + int x = 0; + for (int i = 0; i < 10; i += 1) + x += i; + } + + { + int x = 0; + for (int i = 0; i < 10; i += 1) x += i; + } + + { + int a = 1; + for (;a < 10;){ + switch (a){ + case 0: case 1: case 2: + { + a += 2; + }break; + + default: + case 4: + case 5: + { + a += 1; + }break; + + case 6: a += 1; break; + case 7: a += 1; + case 8: + case 9: a += 1; + } + } + } + + { + int i = 0; + while (i < 5){ + i += 1; + } + + while (i < 10) + { + i += 1; + } + + while (i < 15) + i += 1; + + while (i < 20) i += 1; + } + + { + int i = 0; + do + { + i += 1; + } while (i < 10); + } + + { + int i = 17; + + check_again: + if (i <= 1) goto done; + if ((i&1) == 0) goto even_case; + + // odd_case: + i = 3*i + 1; + + even_case: + i /= 2; + goto check_again; + + done:; + } + + { + int x = 15; + label_same_line:; x -= 1; if(x > 0) { goto label_same_line; } else { goto end_label_same_line; } + } + end_label_same_line:; +} + +//////////////////////////////// +// NOTE(allen): Indirect Call/Jump Stepping Tests + +typedef int FunctionType(int); + +static int +function_foo(int a){ + if (a < 1){ + a += 1; + } + if (a < 2){ + a += 2; + } + return(a); +} + +static int +function_bar(int x){ + for (int i = 0; i < 10; i += 1){ + x += i; + } + return(x); +} + + +static void +indirect_call_jump_stepping_tests(void){ + int z = 1; + FunctionType *ptr = function_foo; + z = ptr(z); + if ((z & 1) == 0){ + ptr = function_bar; + } + z = ptr(z); + + switch (z&7){ + case 0: + { + z += 2; + ptr = function_bar; + }break; + + case 1: + { + z += 1; + ptr = function_bar; + }break; + + case 2: + { + z *= 2; + ptr = function_bar; + }break; + + case 3: + { + z -= 10; + ptr = function_foo; + }break; + + case 4: + { + z -= 5; + ptr = function_foo; + }break; + + case 5: + { + z = z ^ 0x10; + ptr = function_foo; + }break; + + case 6: + { + z = z & ~0x10; + ptr = function_foo; + }break; + + case 7: + { + z = z | 0x10; + ptr = function_foo; + }break; + } + + z = ptr(z); +} + +//////////////////////////////// +// NOTE(rjf): alloca (Variable-Width Stack Changes) Stepping Tests + +static void +alloca_stepping_tests(void) +{ + int x = 1; + int y = 3; + int z = 5; + +#if _WIN32 + int *mem = (int *)_alloca((x+y+z)*sizeof(int)); + mem[0] = x; + mem[1] = y; + mem[2] = z; +#else + int *mem = (int *)__builtin_alloca((x+y+z)*sizeof(int)); + mem[0] = x; + mem[1] = y; + mem[2] = z; +#endif +} + +//////////////////////////////// +// NOTE(allen): Overloaded Line Stepping + +static int +function_get_integer(void){ + return(1); +} + +static void +function_with_multiple_parameters(int x, int y){ + x += y; +} + +static int +recursive_single_line(int x){ return(x <= 1?0:x + recursive_single_line(x/2)); } + +static int shared_1(int x) { return(x); } static int shared_2(int x) { return(1 + shared_1(x)); } + +static void +overloaded_line_stepping_tests(void){ + function_with_multiple_parameters(function_get_integer(), function_get_integer()); + function_with_multiple_parameters(function_get_integer(), function_get_integer()); + function_with_multiple_parameters(function_get_integer(), function_get_integer()); + + recursive_single_line(50); + recursive_single_line(50); + recursive_single_line(50); + + shared_2(5); + shared_2(5); + shared_2(5); + + function_get_integer(); shared_1(1); shared_1(2); + + if ((shared_2(10) && shared_2(-1)) || + shared_2(function_get_integer())){ + int x = 0; + } + else{ + int y = 0; + } +} + +//////////////////////////////// +// NOTE(allen): Long Jump Stepping + +#include + +static jmp_buf global_jump_buffer; +static int global_jump_x; + +static void +long_jump_from_function(void){ + int spin = 0; + for (; spin < 5; spin += 1); + longjmp(global_jump_buffer, 2); + global_jump_x = spin; +} + +static void +long_jump_wrapped_in_function(void){ + global_jump_x = 0; + int val = setjmp(global_jump_buffer); + if (val == 0){ + global_jump_x = 1; + longjmp(global_jump_buffer, 1); + } + else if (val == 1){ + if (global_jump_x == 1){ + global_jump_x = 2; + long_jump_from_function(); + } + } + else if (val == 2){ + global_jump_x = 3; + } +} + +static void +long_jump_stepping_tests(void){ + + long_jump_wrapped_in_function(); + + long_jump_wrapped_in_function(); + + long_jump_wrapped_in_function(); + +} + +//////////////////////////////// +// NOTE(allen): Recursion Stepping + +static int +recursive_call(int x){ + if (x <= 1){ + return(x); + } + + int r1 = recursive_call(x - 1); + int r2 = recursive_call(x - 2); + return(r1 + r2); +} + +static int +tail_recursive_call(int x, int m){ + if (x <= 1){ + return(m); + } + return(tail_recursive_call(x - 1, x*m)); +} + +static void +recursion_stepping_tests(void){ + + recursive_call(4); + + recursive_call(4); + + tail_recursive_call(5, 1); + + tail_recursive_call(5, 1); + +} + +//////////////////////////////// +// NOTE(rjf): Thread Stepping + +#if _WIN32 +DWORD thread_step_thread(void *p) +{ + int x = 0; + for(int i = 0; i < 100000; i += 1) + { + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + x += 1; + } + return 0; +} +#endif + +void thread_stepping_tests(void) +{ +#if _WIN32 + HANDLE h[8] = {0}; + for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) + { + DWORD id = 0; + h[i] = CreateThread(0, 0, thread_step_thread, 0, CREATE_SUSPENDED, &id); + raddbg_thread_id_name(id, "thread_step_thread_%i", i); + raddbg_thread_id_color_u32(id, 0xff9f23ff); + } + for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) + { + ResumeThread(h[i]); + } + for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) + { + WaitForSingleObject(h[i], INFINITE); + } +#endif +} + +//////////////////////////////// +// NOTE(rjf): Debug Strings + +static void +debug_string_tests(void) +{ + for(int i = 0; i < 100; i += 1) + { + printf("here is a number: %i\n", i); + fflush(stdout); + } +#if _WIN32 + for(int i = 0; i < 100; i += 1) + { + OutputDebugStringA("Hello, World!\n"); + } + char message[65409+1]; + memset(&message[0], '=', sizeof(message)); + for(int i = 1; i < sizeof(message); i += 128) + { + message[i] = '\n'; + } + message[sizeof(message) - 1] = 0; + OutputDebugStringA(message); +#endif +} + +//////////////////////////////// +//~ rjf: Thread Name Test + +#if _WIN32 +DWORD dummy_thread(void *p) +{ + Sleep(10); + return 0; +} +#endif + +static void +thread_name_tests(void) +{ +#if _WIN32 + DWORD id = 0; + HANDLE h = CreateThread(0, 0, dummy_thread, 0, CREATE_SUSPENDED, &id); + raddbg_thread_id_name(id, "dummy_thread"); + raddbg_thread_id_color_u32(id, 0xff1f23ff); + ResumeThread(h); + WaitForSingleObject(h, INFINITE); +#endif +} + +//////////////////////////////// +//~ rjf: Interrupt Stepping Tests + +#include + +static void +interrupt_stepping_tests(void) +{ + __debugbreak(); + __debugbreak(); + __debugbreak(); + __debugbreak(); + for(int i = 0; i < 1000; i += 1) + { + if(i == 999) + { + __debugbreak(); + } + } + for(int i = 0; i < 1000; i += 1) + { + if(i == 999) + { + assert(0); + } + } + int x = 0; +} + +//////////////////////////////// +//~ rjf: JIT Stepping Tests + +static void +jit_stepping_tests(void) +{ + OutputDebugString("A\n"); + VOID *code = VirtualAlloc(0, 0x1000, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE); + *((uint32_t*)code) = 0xC39090CC; + ((void (__fastcall *)()) code)(); + OutputDebugString("B\n"); +} + +//////////////////////////////// +// NOTE(allen): Exception Stepping + +static void +exception_filter_test(void) +{ + __try + { + RaiseException(0xc0000095, 0, 0, 0); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + OutputDebugStringA("did an exception\n"); + } +} + +int *global_null_read_pointer = 0; +static void +trip(void){ + *global_null_read_pointer = 0; +} + +static void +cpp_exception_in_function(void){ + int v = 0; + try{ + throw 1; + } + catch (...){ + v = 1; + } +} + +static void +cpp_throw_in_function(void){ + throw 1; +} + +static void +win32_exception_in_function(void){ +#if _WIN32 + int v = 0; + __try{ + trip(); + v = 1; + } + __except (EXCEPTION_EXECUTE_HANDLER){ + v = 2; + } + + v = 3; + __try{ + trip(); + v = 4; + } + __except (EXCEPTION_EXECUTE_HANDLER){ + v = 5; + } +#endif +} + +static void +cpp_recursive_exception(int x){ + try{ + if (x > 1){ + throw 1; + } + } + catch (...){ + x -= 1; + cpp_recursive_exception(x); + x += 1; + } +} + +static void +win32_recursive_exception(int x){ +#if _WIN32 + __try{ + if (x > 1){ + throw 1; + } + } + __except (EXCEPTION_EXECUTE_HANDLER){ + x -= 1; + win32_recursive_exception(x); + x += 1; + } +#endif +} + +static void +exception_stepping_tests(void){ + { + int v = 0; + try{ + throw 1; + } + catch (...){ + v = 1; + } + } + + { + int v = 0; + try{ + cpp_throw_in_function(); + } + catch (...){ + v = 1; + } + } + + cpp_exception_in_function(); + cpp_exception_in_function(); + +#if _WIN32 + win32_exception_in_function(); + win32_exception_in_function(); +#endif + + // NOTE(allen): Exception in catch tests + { + int v = 0; + try{ + v = 1; + throw 1; + } + catch (...){ + try{ + v = 2; + throw 2; + } + catch (...){ + v = 3; + } + } + } + + { + int v = 0; + try{ + v = 1; + throw 1; + } + catch (...){ + cpp_exception_in_function(); + } + } + +#if _WIN32 + { + int v = 0; + try{ + v = 1; + throw 1; + } + catch (...){ + win32_exception_in_function(); + } + } +#endif + + cpp_recursive_exception(4); + cpp_recursive_exception(4); + cpp_recursive_exception(4); + +#if _WIN32 + win32_recursive_exception(4); + win32_recursive_exception(4); + win32_recursive_exception(4); +#endif + + // NOTE(allen): Try in try tests + { + int v = 0; + try{ + try{ + v = 1; + throw 1; + } + catch (...){ + v = 2; + } + throw 2; + } + catch (...){ + v = 3; + } + } + + { + int v = 0; + try{ + try{ + v = 1; + cpp_throw_in_function(); + } + catch (...){ + v = 2; + } + throw 2; + } + catch (...){ + v = 3; + } + } + + { + int v = 0; + try{ + cpp_exception_in_function(); + throw 2; + } + catch (...){ + v = 3; + } + } + +#if _WIN32 + { + int v = 0; + try{ + win32_exception_in_function(); + throw 2; + } + catch (...){ + v = 3; + } + } +#endif + +} + +typedef void (*callback_t)(int a); +static void +dynamic_step_test(void){ +#if _WIN32 +#if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( _M_AMD64 ) + void *page = VirtualAlloc(0, 4096, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); + char *ptr = (char*)page; + *ptr++ = 0x51; // push rcx + *ptr++ = 0x59; // pop rcx + *ptr++ = 0xC3; // ret + callback_t cb = (callback_t)page; + cb(1); +#endif +#endif +} + +//////////////////////////////// + +raddbg_entry_point(mule_main); + +int +mule_main(int argc, char** argv) +{ + raddbg_thread_name("mule_main_thread"); + raddbg_thread_color_rgba(0.4f, 0.9f, 0.2f, 1); + if(raddbg_is_attached()) + { + raddbg_log("raddbg is attached!\n"); + } + + mule_init(); + + type_coverage_eval_tests(); + + mutating_variables_eval_tests(); + + nested_types_eval_tests(); + + struct_parameters_eval_tests(); + + global_eval_tests(); + + return_eval_tests(); + + tls_eval_tests(); + + complicated_type_coverage_tests(); + + extended_type_coverage_eval_tests(); + + templated_function_eval_tests(); + + c_type_coverage_eval_tests(); + + c_type_with_bitfield_usage(); + + optimized_build_eval_tests(); + + optimized_struct_parameters_eval_tests(); + + fancy_viz_eval_tests(); + + exception_filter_test(); + + control_flow_stepping_tests(); + + indirect_call_jump_stepping_tests(); + + alloca_stepping_tests(); + + basic_inline_tests(); + + inline_stepping_tests(); + + overloaded_line_stepping_tests(); + + overloaded_function(100); + + dynamic_step_test(); + + long_jump_stepping_tests(); + + recursion_stepping_tests(); + + thread_stepping_tests(); + + debug_string_tests(); + + thread_name_tests(); + + jit_stepping_tests(); + + interrupt_stepping_tests(); + + markup_tests(); + + exception_stepping_tests(); + + return(0); +} diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main.pdb b/data/test_inputs/mule_main_9ff1e58f/mule_main.pdb new file mode 100644 index 00000000..5116f2ce --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/mule_main.pdb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2b10fe04ef539796a329790987f781e645707a737e32db863f3e49a1766bf5a +size 4763648 diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi b/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi new file mode 100644 index 00000000..049f7503 --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87783650d5ceb1dd991ae3a01ca4a55cefc9eacd54ead4fcc5deb72af4f9b8a3 +size 2667692 diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main_9ff1e58f.exe b/data/test_inputs/mule_main_9ff1e58f/mule_main_9ff1e58f.exe new file mode 100644 index 00000000..e61f158f --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/mule_main_9ff1e58f.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ac765d8dfa6d3a3830b3efc76d8b52f6dd201004e9fead477138ac7b4d1015a +size 264704 diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_module.cpp b/data/test_inputs/mule_main_9ff1e58f/mule_module.cpp new file mode 100644 index 00000000..155d588f --- /dev/null +++ b/data/test_inputs/mule_main_9ff1e58f/mule_module.cpp @@ -0,0 +1,60 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#if _WIN32 +#define export_function extern "C" __declspec(dllexport) +#else +#define export_function extern "C" +#endif + +#if _WIN32 +# define thread_var __declspec(thread) +#else +# define thread_var __thread +#endif + +typedef struct OnlyInModule OnlyInModule; +struct OnlyInModule +{ + int x; + int y; + int z; + char *name; +}; + +typedef struct Basics Basics; +struct Basics +{ + int a; + int b; + int c; + int d; +}; + +static OnlyInModule only_in_module_global = +{ + 1, 2, 3, "foobar", +}; + +thread_var float tls_a = 1.015625f; +thread_var int tls_b = -100; + +export_function void +dll_tls_eval_test(void) +{ + tls_a *= 1.5f; + tls_b *= -2; + only_in_module_global.x += 1; + only_in_module_global.y += 2; + only_in_module_global.z += 3; +} + +export_function void +dll_type_eval_tests(void) +{ + Basics basics1 = {1, 2, 3, 4}; + Basics basics2 = {4, 5, 6, 7}; + OnlyInModule only_in_module = {123, 456, 789, "this type is only in the module!"}; + int x = 0; + (void)x; +} diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_module.dll b/data/test_inputs/mule_main_9ff1e58f/mule_module.dll new file mode 100644 index 0000000000000000000000000000000000000000..257b90fa0c3588e2b58926c713f095ebd94dcc27 GIT binary patch literal 667648 zcmeEvd3=o5_y1%WnIL8?A(k>oH1-hML@XIHJVQb(seP-Zw01M7H983JI?4i`w*4EZD9krIAnBV(-pGhR4%jfg?e!s8ZA4y+5&%O7Yd+xdC-h1x3 z=RVI!=(RxOr_pHq@xRBT(QL(&f3X7oHPHEJG^MI-FQwTOc&PeTpZG)7yA2yY-Z*C5 z=$FO~9BCXhaMY;LR^y99jN@#hjKfD6<2rRUjvPIBNQ0oD;-OyFpI3Zn$(i& z8{X&Z;@M^RpkZv|&w7+-)@TOL3e?!Emw!2z=DMbav4n4_dYXDVjmGFJimw~+;Qty; zGPgQRb@|08+J5?&Hb4x8##R%^Xl?buF$57aYCddZ5N=$ye}h zaUoV>#XwC|zT(`ZF)UEj&#n-ti4}r+F^R=BSsd^``DL&ebscqll1xiV##l~N>`h*p)Z1;FP{1SVo7HmF`h-G*w-=Mu_*ThU3!Cvh(SYN z(r9edQ8Mrx=8z}oVjBz{V;%V7h#`^0FYxlK^aNdcgKWKd&u&_ctNGOcjq8A)pT<>bgTKc0um-Z$CB7QhnmQ;u77EbxZGe;w zAbzhN5F0B4d@%#WC3h9mxIRe-*uE4bU-U%XdUcWg><~y+*Ywf2p7|Kn;@g0@e_w#_ zt^?SXf!Kd35a-&V#>dg9VcP@Z@Hmv&N1*QJav&Lg3#o1fq$b{jxU)8cBw7dJ?{6Y? zYX?}hP6lEdu>*8$<1M6o>!QZAcR}+07!W^;!FKIj1I`<)Ajw)zehX1{^(L}O7SIjb zhHQm?Xl-%~zzwD%HUc}y21M)L;BuQyp6ZOUH^+g&YaPI^`VwH5?m_A@W}WL1dwHQ9 zz)!4EGZ=`gGeBbNj=GBm0TG#q)R|V48%R;MDhstXW(rXuw@`*AY~ zbw_?p{S5?(`(AimQbTuOfiF!*&~PllsxvL4kO?B#>=0Pf+y7WV_TXHPJV zy@s+|0Vpfq8`)P&AvLBmur*tP=?8mJ_g~*4J83*p4fle0^JRd93joQST-TN&bvPQS z=pLw>QWbRVb|TyFS)`hdL_ZRLM^@;xR~wYAdIe?W?xO56MH@8_DaTN>cDxuEe3As2 z8~hAe-hK^qr{(~g(-zoXY(r~DSvpgZQE0c{4y1m*2I4DSP`A?r(6xUX40<*L=cuVD zo1X!?ag^mmeGqs110eG~khETllw}=Amc9m%lMc>T@1v~t7NoL&K()H@04=Q`p7|wG zA>rUM<5dv%JAft!o&j<8RS0fiN4^7+wBkse9tyg06M=Y%-CE5~ z4_S)rg1)F$nM-`!W-xuV8_KR%0Lg(KV731=K>gN0e96UrZV`wVa;n^JjI1#TO#8#+ zx*iQf)_DQhIj;d!8x96-&7k|HE5N3~;L_Rbd&loh>mAV?mwJlvpbVq%VO8FPcZuJM)I0~FiH&OO} z8xXIc@#u9Q?5FJkHg-D@&!(f=5(Qi{ulKfsD!0Lzzy0|@bC7+?}ga_3g=uzWZ2_WuRf$-tfi~R!F(I(WL40p-(1+_My3bOhkAYM5g z+2}YBcWVUVlTA>TrU5AZHHd#d4!Z7K70Vle{bCNl`8a@=ZlkOtS5y$yd0a-_Z>hg| zMx>5@hqA#N0csuxNi(uas0_rOGf18N2~B>`1}W!IFg-sOh%FtEy)zoA=;u%)g2XwE z&_;QZ1hxhCU^jGnKGiW>8=q`>#_FpvSQ(J&!_ExZ(%;8!5FMx=3 z08=Id`^W?0eZF9|Ru9mLcH@N$0DXN?ZEFfr6a4^w^#%B-5{Q5Q4Jr2v5c29fU>dDQ zY7g6;4M)bcF$GL-YzM1Ej{eu*fy;JkvU(+?5?cb%t~auys({tB5R^5i86MOVO#88+ z)MY3e@i|EB9YDOW0p)h;-vHAvvWiUv-R$K+ z{K(ZfZ4gqEDg(6Q9RG0=%9?UxX;KnErbSOnMcJw_fDyE7Yb{KAK?V1CzxjxFYkC5`` z+`YynG@%tpZigZDB`0v%MU+_!kgycJtd{`JdbTzz9;w&gMp-%>Q&;8X$QC0geIMEL zKOpr7_o!buJKz2csZefDUsH+8*{*X61RwJpvacABT|%QeuqQzB7$82gqgtI}sCI(c z>_JFftB0~*7eLZgp-9E`N6LO2vV8XevcsDKgscUF-dr;+xsLj-1onDofNwhiv@VIh zo%k9}emEE;p4}k+wI}sQ16Ab~QnzLT`wJ&mu-I#DVEQ@dc(Dxt2`qb;12BIDYV2JA zrhS`$RV;^WG~2Di?jP-nl#sb*4Iq|>A$$5?V0C>9uqTJJE^S0oJP^7HNS*r<*cTQ+ zzHOAC`70=!9|W+gE)c1`P-bu-b)+L2?{yYp+@ngaEJRraZYN8+0kMpRVnH=zS8zky zxDYAr>p=WOb(ZY~_B*+eM!yL<4VS??oTq7YkG4IBlywYxq+bg5qqvv`(vH8+hV&HU z1J(#`2D-bPb-U@}r0oK*%md>0@}R5v84#@#(Z;k>K>Rcq{8rHJHuiwQ!)8DXphGp0 z^I)eLh@?xP`?52@w=A2Lh16I5z$N@$)Hp|NwB-)bc>q|YoJNh8ih;qp7NGli1j@qc zc}%2N^+A7t6E{&KbQ(bBo0NGXQWsVs^%FaD)*p2jCZSsADM*Dh1!(gGv<8T25ym4u1-!uIEu!jyA0SOk_VE zg>3z{z;2okaF#OP3_y*CQAjN%UAtodlb;2)vjnEeZeVXs26lg6WSa&6@$Ok$jqr9r zR1QS7s-FP#rJv|O0AgHz26UU}0%#SG9Q*-gQ)uw+)I{p5NVFyu2be-vw_|P4?W37% z5(w<3r441d$c6YbHxcVJ^Kq$5>@4$BHBvYWRc)p-KS z=I#PNJ=@q%#lC6=c))QxavQ1Tls>R4vJYN?EJrBwytQcj3oZ@aEMRlE8n;&jSWFl3 zdT+K-2X$Zk1lg~CBVB)hKWJlXP}$Ylw+HJ%w`BJVDXqPdQt2eqpSY9z4TEDps>^!{IS0Q>4A zq!!U#@M{b%bzVoxO!gxrWaW7vUh*=s16@cZzJ%6hXi#k@4c-N=g(wedyn%p;>*Y?U z@dK?{70%*w9M$O**VF=ZC7S~AIX(FHrNJ*_E@}*T7TFcF8+W)9|L`MfES&{JCQrS^ zy8*jw9qP{IvAOO9q$V5zzn{4`uJs2=iT+5f8v?reBf(%Q52Kk31WY!f>;j#q58ESK zA`DHw{5(=l`W8Rk18~;@NwKZ~1HS;5bZ$zQ27${cPL%|Iwi}AFPhJQ1@LQm3L4)`E z1EfBoEGs(#8^#)g9|6&@BC@l%KE}R?8uj`hJLnnEH5dw#k@Ha&OU|u00FAkWjpYvU z?m=WdvjAS~10lbm$xXR}R2%NPA6OvsSaNB?bK@m9YMkLtvX6e^_eYU!bC)t712&;H zKsib^egn!Tb7LO)6*#BRW|yG*yOS&Bh6jiq^U=l>c7HV$)@TIkW(@%L7FB%400y7( zoEL5e_CPjjOgID*7ngIn7lHNAacxh!+n*wp$k0o>Nbno_0cP_PKU4R|g0j*`xI-aZv?9iFu+;cQ)yi2gAHnMfT z2FWxYrkaGIp`1h@?sF(o5pQ(OVJKoY;~3 zV}Up}5S)F&kzM){8n=H3nV*YBwWK)!8cNzB2Oy1WE9?%iRUUyjlGe5cWjR61_5J{W z@n3;oo$W}u&H+1yKJev4q-KSHLC_t5?{|XaGOcaLbzpUfwkcbOtcTc*TnlEN%Hw#9 ztju<=wnSOeDrjiyEu@anQ2hEONKU6BrEu^*AxRn~Fi!{51vGti*MOu~d0^iT0(R|2 zFv#J?ylw!>DxL&(Zg=!3fU^8p5hTMI?K$-t`B5bk4uGGH^W`nh`!yRtcahHGwsD|4 z&l5&YDIiKw2S3aLLRS^-o@y{ken%v)YuUq z>C+Zo(`C3^ZFl}C*#{gArEHFK3-ZZzjcXh)Fr{{h(=4S=}a1Jxp?0dcZ6 zQfU=Xc4!A0w^Ea>N+7lO57gM!5{NkryEYsMy476CuXE8YdLLl-QGkUFz-7bFAP#4s zqVjj3YervXW)8~g^#IuM5$HPpjQMJx@e9WfNCOSMt;W;^Pb#m*H;9%+zj9t?Z&+ika{-)bpsMm zWBF#J623u=Jwwp_5{xd)qRge~KWFtt>OD4Ii>caefQ_XSbCSVAU&?ZOBP3|TDKLLC zNVY!&@id-_9&qdMqbvSnCcqH7QK#6!iHt&w;u-9#rI5g%!PaVw@ZDby2HR!=%;g|Y zVc<87ZiVR^R10|p*<0n%+UD!1yNvVY{Z0^L#|@Aa=U6u4G@HXIRn3aBGc-`sBxK*E z<^Q}rz)enue>ngilm>QwRg~T5v3W==QsO*)c_eDAt^?4SdvZuMq-N9Um_8LXW)4G> zJ*dCR<$!Gv2E;SrNPYM%xSS=cN<0wV_5mWBk%SzM;3Gx?gMLKW-53zRN&R(XP`f7^ z>O&7IW(7cd?zKm2BBdD!L>roxQZ$0jK4?6VTn5p&HK6KBe+1&C3&8I^dSv~m$z|+i zI)faY7NOnE4B%{_x1Px0{If5B%hf9=dzI&ux%77{bONGnD-ipTOAiI99UW2jV=vHI znj)nO1@PmpTZ{h27q!sPmmHK8>}mt9vc3-hn%9Lu?HC3c+7Mh)_W>NFl^TByWiPY@ z$q9yD=1v5cui3#`7LaH^2Y4$Ob*Drib&-xubT`P7-U%dYmLOY$9%#@+a0xjFk~Uoc z*3CiIME^OYAL{xILu!{V5J|5hdz@#mOzt?vsF$D>$bQK4YFTbsyXZ_LWFTv$!#tXL z?$`%y{EHs)TnDnBy$61iDb=g*0^vUctVSP2>JIHyMS2-ueu>nMYC!Ctgw!?$2TrA< z+Dr72T1SD^1_o;1Vk{$uHgPh;)`7HF2JSO|^a7W05)id%M#^!vzZrtMuNeRamO?6r>`i_G*2^)NbYDv`4-4dWHYXa7HI=YZ_6WH*( z$jXeDjCvMjCeFmU&5-ird~Wt4u>azw9#5vXx+B#(0sQV&2i=&_$Ue`b`A&{jqwOF$ zJ_;a*2Bi+C{6jaul^y`Mm~EK>;#E9KH|JD7X#lG;TxvJCb0#iAY753qV1d%#1&wd(5t%5?dd0;t-8~o)M60z ziw@|__naG_J%`jrZrhH!Ab!9A$>(&6iq8Q9%a2HDc(}MsF?uaWb|7ba9CcdxKC;KE zgG<6DWQBa!++gr)GTNv=4rRt9RD1J9)EIRH2uoj-9p|;3p0lYE&mY=VDC_eDz>Wlf ztE}-U!8B@vomv8{JoKfCG01DFhYt1$0?8)<$Zn+Wm(2iBHly9= zxpf@l$gJ`K*mM<$92(zU^#M|c0xYToAeRBt@3XVAUf0X61OCC^_*c6tYB<{dX6^&-Og34WL6X|4o!_JO<+G3d-uS+UM-i47E(9A2Kd5_8vYbRejVA(l=M|v$52kz8A(7qio&40O}G194($|Yj5Vo5s_2qf}t`v_~p{Gs2fDxyQXCl$-h*u7El`K>Ki- zHQ`Kb$E|H1*K}}aG^yk1xGep!1|)7lLtD-TlHK%1O2q>lrF%4@5s1aR0h=p>bMP&Y ze4mK2EgU!BYXIUMk>i{jnY@D7b|!Qtxd*wf&8e?aV!XYZqkSp({R}j$tZ;txKCByMqh6{A|!QeHC=?rz16}6~Is) z*n+u1cH_yb9YY6Q`XN=jCD_kR0#@c?pSJ>KVPv&-6-YiA59~S~v>#Fj?{jxVO*eIAUJfwSh9%h=qnr%-Jl7v~;sXt%NfdUXWx&-8}J@Vt727QGUqR@!)! z9b|R~k8?}N?;{R;EZcpv1Gp4Bff_#S<>2DTMs7p3?M8sbB=P5k$8KJ}i1W-x9DwWF zP-9RcYAkmFyw0^ScMQt<(>+?wL9qlP`+hdSXLLmFzmCQi)3UCg3~-I7#bP`;oZz8h z0ZrfM6ufmUwA+Gy&Inq#oRJV{9vN6}gE)B}K;^YSd^`*7-WUkF(6;~vae}OF2Sn}3 zkfmgOlznXg$vCd_k@Jy?n}oW5@C>nYB+5=OMjNUJ-9#GI30(W1wuRuoR{=QC9A%>z z5Yk2fB(4Nq1vdWja)7XlV6eUy%08hp`=|ndqbX__ISRAs?6jp`TG&8*knZK>cTskS zJI<$+K8_4>^gz_2TNX&BV>$v%j04H2t>}WOCrHwHXr1vT=pHdT-DodT>n{Ltq#K0n zMYqSoCO6Rp*{S>Omr*0S1?bjN3_mV|T^x#sv~_(b?w}t5t}X=Pb~Z@L)j;YbJ)U{{ zkX_am-~rI=KC~je?!^s7twgt3*dZVH?ZA! z2J7$!%GUV+^yDJB%kar;3i*o(HOxG{Z#s{%%pt(evx1cm%ajF3O=Mu}<)x6|(`F!< z+8)*1r9rolUSA`6f^TsnedQ-$%h1BTz7sX>^0*ZFBFajQMGbM6YT%soFt)UrzO8d2 zvU9n+_;IAuz6ZbI+=(NW0i5L;EK?ioE3)Uucc6{TNhqsB<7TdpR3aDlJ3J~hAl0s=W4tjz5g1@I?n*p^hHR$w-?oxZ$aZdxkDUe-(JZ;*>e=5#WH}oe}KW)Zz45| z)@L|h3i*;{osIz<;}L2@4yuKgL$(8ts-vs`!5qetoL3djp|zE?{Pj1WtQ$9$&%?oG zCzsl)@4;Xb2cXqCkQ}ax8v9~_UD^_<$iYZ$?*PPwA6SP`(E^Hx_h{c#I5YS4(yWc&{J0d|VTVZEpfm?^%>pdjSlVXpsHwD_|F0 zMcHT`gPL($v~&ZASc)3+C!_IS7>G(uLpGb$ro4w57ui~Mx~5}FA+?*{=47gFG0zK4 zs-VUZs;(JBB|md42XF#ETM13BD~^V=JhNvH0AdZ-`O0&swt;ccx7govc98t|3lPhG z0)ys^zr3*ysaZ8p)*=>ka~QWcOCg)l%N6%@)(^p6W-otXjj?>i3 zmj&V=bw8y)$~uk$aUe$~bS_xk;>Pl_1om(50m<==DCJYE;z6Rz(23@lXVPG_JmP?-%qM_oNbPhk^ zg?$Q=I2zFT79c8BL8>Q@Wd5A;6^^1t`9omUliNf*L%?h3Mb>y8b(`|Fye8a3J8^E* z*$q|TNTXWP1?+oxBNASBJK;9N7%jrukg*qg&4u7j4k+=~FWxP;bm3hbi?5JGic=5#zpscQ2qK9#fh zjRwem%u)5Jj?`P6CB3NDG*G00A`KL2phyEn8Yt30 zkp_x1P^5t(4HRjhNCQP0DAGWY2L3NKuvO=y(a7m?P}jsj%@9d07l!W=HIiI%|1G`2 z-{+RTr?&5z0FA7TRPiMRe!Hl3Op^UGZs|+=`)>93atSKT}ePWhOd1hrXC zXDcR$zfRVE*CJ5kNq1-u<0)$o0@~Ak9opR@n<27(4((PXb{A5PWWUlwlC>v*k|Os= zj=0d+%(ze^#L?gx>Z?A({nTeYfAxv)uLQn{R(;|tXpzTvJL0Ls?_RKe$t*C!(}3Sv z(@0Kjtq{BmZC(g%DZ#C#Q%qScszeC`Ou;I zYAIBRMv4itG!N9+3{pmhVQ5Z<$7A!^EoJO8xc0tNm<#)rddwPa|JBDDPEg){-^W_~ zao?0%`#m1FR=NJA$D`kzF8XVcv-xz@L}Ll5>H5VPB8%_np89c)ytu~XIqK0aix1QYy}5lOv99`rMo6+X6fcdNBVnR_L}n6dDnmc2Cv@Lx$A!89}N5v1m4;|87r~L;IjZphnq=hJ|*G z_7*$4pyRgZl(HCJ<<)Hf7op8e?RzNaAGFaPiiREltIuK(}}YZz*7R%@!#8gl78!AnqGmD*h_@+_s7cXO6Z!XU+(`t|RZYexR@ z*#8wF1gY;8q?nkLyCqLpS%~1RQKz|Kwh_N@sS%k7e zEFe!jY=!+w)V2y3JWuc>&_J;P_$3RC=1^@c?jJ3f$!~KnkmInr9NKT%qa`QP_H>vT zZ4&dcb{!uMZ8eaSG8XBYD9Y5{lL9pqBU5_|DO!|F?L%*Bs}5P|m2_H>+bEMV{e9T- z<8nFZx97+>-rty8=p)HNA4$&3-VuI*-IC{Q{T7Ztiy*g?nw4zPp!=e479rbbnP}R#> zq*T59>`mo%m3sLBWpX!IH%B=iWWPI#-u75mSjfTyTPPpT9o*3^)KF-==bXsvOsuyv zzo9*a-bC(zALqd28}Px*%i6E_aA+HVJX2c^Q0+`9q}Uld%&=yHLBcapW7EN-kWea$ zOHC*axUfFcDy=xSS-^L*3c7v#}x%%gHXsBC0qH|rVUH370-G@j#YunbO#(UT$X z!>02oD#oKM(IWe&OAi12?)^~PJK0cM^-uq+Nm59sT+2o-<5)>P?FrT%r&@O4lYVHc zTWF#rA2CO!dxCF&i*l@~rV_f7C^_Rpdr0UIzA2_5&Eg7-z^W%=05jo{`vhlC@NU+G z9T-NF)&DOic5K%d9!oMs)cc&0M0y|t#Tfvb;t3w^m8Cgl8NeooJw=wiM2smY%k!w| z$+UZXr>+yy^y~eX@=#T=Ns@d;m?&pLh?Hp#VUIn*O@(yk5XoUSc!H}T2e-Hp(N6nBBICqM1zbkIX^J`Dj~`(U`-0-4pyOC83l^4^h+XlgKA9kM1}Vu6v~n zft1&ukaAn(CrUZl$hKh?F2vt;rqDc8_Z#dj&YB=QIOJYMw4}mi+3W`b2lF129|9$QdlWZv|#T*@1!X%q?ei>3s z_PCN3dq#LdOqT6ZWcqH4obj|_bajC^ls$EyHEe4Fellcew2!T_geGS;*Cm?qFAbL3 zj^9s1aW`Fveo^}F#_9R_;E3lR7J<2kLeYnjF!5NB)$wVlgg>)|XgsFT2lxuM1+!d8lA5u3;P55bG@83Ax9iS|E!{b@+Q&5p! zUgQCXeCl%HkS|u-%7;@rEhEN8MrD-i?~6=;GIli@yYdvCLZ*qIz_siMl7a+YzheZ? z1lG_Huk&$_4k7#xm(uH9;k}o)|KVdREqpLZJ|xMRp5Tri&e3k6Jz!#C(}Y(t0-Ha4 z?O1dRuE{evoE1_}URKET@ExHL114iOb_X$eeuRsw48y?E(Nt`7{|ihuaPaCU1qTjM zr6a6&E@R?S_t^sWYHi$al#!o`%U;xAzMIHf8(?%Ihw4XblW@wB>{*^$ z`WagM(kJ)En|LtGC$fLwu~+*IppOv7*n2mA4h%j=7LL-nJ^Sk?`i&z|hIbWcU!R7< z<|JuQ&>keP_s!(PZ~x3_u`2p+Rab>6#MUjo?k@e7&gCTgt`N!ZsD6t{tjl<3$^F=1 zLoG2!ts!#zlJPMa!^z%MPgePCKo*-sWKk%cMlgSzCZKJNN^$m>JMXeg?VYGapz@+G(qQ$}w9>Wjhuc z4os&b>m4`Q09CT*^6BIX&l;N0>&n3$U*n`gm<^rnU@f^3RLI zexys1oNGg4|3KxLSMb|fn15au^X38JmHEpD4%ObqIF9lj96pQ#_88OFY(#RDl{gj`#(Sd!mXKqfgCy3xZLy>YS3F@-{4hB)=7kAIH;3 zGxtzu|K?tqe{TI%8Y9Afv71mtoU`>Xr5-G+$a#X(AlRL_&^|s}`LECp)tk{x$io^1 zW-tC3*vhh)E7;w<_RJI9jXlJ$G~1@`Wjb4gG)Tf;<|9^Z&D_1rC&X64{-sX}xR#m_ zgw$Q6H2TH4t1jQxT%aqMrXE;A_yG&|<@y1lea<;y`6aocB;T7EGidzC^R`g?ln{Sg zRk^Ei=6$2~jfz&I^R;vLNBn|tz=YtL_cgK0e5^sj@WYd&!QZWHnh*94#NPVr6b1Vd z(#pxSyhTw!8Z{&KAGK}gGoO5*!w|PvyGEyRmqApA$|&Xu{^>6CV&AQkV$O|osXL8m zt}wd-yk>kTcqM;Skk`_G$ZHouXp)R@9shR*o0gNCcKZrE>h727?t)J+(dXdfK?Th- zD$SAtGy&U87@I@2A5$JYD0pL^ig#*V%fL|1K<)mhW~rNQshcgu?3!2#uIMuq6&mpM zh$vrv4(c8VntM4=C_9rnI%Hl{+%e*F^6YVY{Y4r)OjxgH!l3+*|BM=vEk>}z_mB_@4BB@}(nBBwS< zaC(}Ob9v_Ss9TVS5j>WvJW3bf@w7nzuiSCSlj-c61!SrNB}(K+3$NXYu3~gBM(|I? z08PE~6yyy z!$%FVlsGCY;zTj?R=XjiY$d*RN*?`c`JSy`*!5N(y_BiV3d2s83=5p8{RT-K!#pk0 zi}`4*;VlN>hp4U9Ta4kOl6L*Q2M8(}Cx%M+MKAt`I{NoA#+Qqewbfb%YE1SlpE!rM z9Fpz;l$Aij9J$XV-!RKZ&GKpc!+@!=CZ{QYGRimOFKHlPzUjG)g71C4^OsKvmJ(AApDf4P$7r z=Ed}>zacAYm!bB?^Y$!Vrgj#R+|C`^6r@adGK|(2?ODc5?MP(l2|Bc|Ahk`S@ymwX zU6GEfxero3gqUXLV)ogd7cJD-)ohoI@y`Y*wg*K5#)9x{rnWkglonOWAn6VOQ6Lif z?Y~qQUsBRX8 zqw$e)j!HFyzC=~Y5%dKf&3z`6kn9(}M)m_Q!{G73f*~3@Uv_*T9!=ALf)sra+DMn= z5eQ|8K)rpB;je=lxr^)ngJzNNtR!F+0jmmV6tISXp#s(tFdVS(+0E3=lw^9r1 zTUi!&K*x;z6J+dD4;VE1ly}u+Ngr!vpi5fh6BfTcbcP~4*@*nlnGgK*=`&jjhawz~ zbN{cfCaqQBioAf7vI{;TwzyLGQC+SOM50=u7+#-`NoZE`O9xN6LB65uf}R{uYrI0 zOJk8o8!dIOxZXiJPCk<0x36_xZyhLOj@=zU1BxWd)8gS z+0F-jH96Wzab&TBLjFbILF?aQ^C7}yKEAh@gp|KXZcZ5ZLCCVa?NBWYf zzp0<8uc^=fCo9Lr7zNgV>jk)kc;dd+)j>^)bSrP#B8#|6Y5EKBwHAn{qqOiBB=6IE zZj(<-a-dR-E@mc;CB2pcXR`uyKhFD8I>{cLw@wSBA>-1es<%pcSAYe?dMuahBV}@; zYEa`VPbMoeau%OITBp0@P zz#Rd-1pS6uR;?so=V{{vtcfH)@&y0?+DW?%jS~T0p)e^+{>+M05_^(+^EJt zpAr9)%TB}$-oSw6#rC2hCo%y_XT)#*Jhpe6gUtJX_`S11&|m`QKtoP`J!UNPezP&)EwLsfk2uWE$n$O`>Qx0c9TuU7UFzZTzgJE9!`vv zWK#sy|Gb3vE%07LY00lMLW7oYr86}{)zO5*%lPHy8BuR^YP6AGPLhpmMAa4{~9 zt-aMuxKa(e$!qF~gyb|CC}7^&Rcf%JoY=!1C`DJYVnTI6zmC~%I$JZ!3quu|?!Hri z51gau$lRFwAYaKZ!#>$xGqrsDp!WXKpe{O#Trx0zkbm(6zYL3Ct}_n~`Odj=G{RUj zTXkvE=DfAc%vK4V@GL&F6^F-K!(CQ!zU}eYCq-zc>y+1!^hj8ch}80sAP(#!Q7Abk zq3gYM$^en+5w3(z`Kzw0eFme`sxef;Sx-(hqPtdHAhi}FAISlRqFZBtH5k~t?wZ0O z#?IgTSqw0)o{S7Qh0~rY6ERC2ux$`4qHwsapw2LVl`Wvg!O;ln+*pU0x9_Os@G}aQ z&sNJL3YRyZEc#j4j{+|vVyWnkK7|g9B$p9sJJK_oiK#!uJ{eQrCbxcK>JOCUahT~) zf^#}XQ7S3<-IJ>{NYX zd58e)8-h)SH9U`vs1q-@HpIuof)Su@f-kP+?aeecJPS)#a9wFT3C^c6U8B96Bfz=2 zxG%z%fbGx|+yOMA6)C2j5Vf7Rg&5I-I*4MSJyv3&l-GVZI%Bn`BdQ1|$5GnR*?`x% z#QRQh@~$X@wGy^rlP5i@wCxVP&=L|}{KB@>5tlRE+za_ZxlM3y&4f1%=8^-(H6zZU zDjx*@RlAezf88$QiQ+voZ(vW`1!7nR-4#;YWFO^|d|fb6(IW~fIojwPQw-cL3~}(2 zNKTk#hiZd{M;qHZus6d2ETtY)eG!ff8PEBn3H_%uleTx zxc#XG+kf`|y8Q=;(dF+yehvTsRR2>8w*Tz^aQlz#f(ahFEUW?M;V{^>>4P{Kz4Oq7 z2%a@;dkCkbYnG~#=U|Nkc2gf?Fd222j+}>$w$nx^d%Q%Y(-0vDUcXDIZ4U15&*qz_ zZvVX|gRggYrA_%eTaw?rc>M&tKTEq7kzam&N-|_%AEp%ULo>AxVP5e%N^%Dsf|=fK z(%|t*&1>~CN#)?hhwV9c9kpZbRJHfzM8{5M*M0Pz@MIqY3iR<-`u}bpaT%e$3yWC)TAGkjwz|HJw`!je&&t< zjlS1)yaf??3~}A?ABS4>({Cv2a2E8WOU`+;meQb8xI0#)6ug%k{v#^IqmrQGl``Ik zk?$(c!k}Ql`6?H;wnNI=SD^qnco?Q{c$$oz1$F=%YXk@gW*3J%-9>NF@CA?lxalaGBW)HbDM7gVs)g!jr%^O_3jJn}5%aP&0b z1tZ)v)5~oqIn%h5oLwQpOtQ)5_JLUFRso}Q}V6|^BlZ~CEmQrHm97m z2B4B@uTTAWyfe`hpTwB!W^mq}oTv^6yzD4`l+$ho@_1YHFAvv+=1^Xr?17K_WX2%{ zeTsLKW|x}8;jDrg5r@!FlS1O3FD!nBDLEbD`@|!Zh{#AbMQ-v~uh>W3e z!g3WD8Zr00u_3(7b`O%)1Xxo?q`$YTg{vIX2zibl$!k;r2SjtM<1&VIv8nZ-mK&JL;wx9Ml{b!2P}j`2M* z{fMja^Tb;|2iw5HqjIUPa?mJAl3xi8`k2VJO$tcNPb;>F@Fo^t% zs6&>rg9jXRJCTe3X)n;{>EFvME-fFg=;ZvoM*rKq^2@brT7F(N|BhF#Zt4A;DWF3r z3u?sYfXXUyQ}Ogo{GZhCJLu0<{&)4^7AURZ3IExU{at;^U)OtIg&Fz8R`qxFv0W># zjsNrZIR*XHS*J7AO&60e_ckkU%#F#f8Zf09pP13rK3S)kp1?ao+`$}q1veM5B3=@b zZ{@`cXIS_wxX%c{8DQ`xd?efnTO>j?t#yv}27HK!$ld`Z&}%jR;hIzXYuW&Dc5#o5 zvKaL9mx%RI2J0~%FT2<0M*2)zEM7hie)xsDI8Dtm=9suRvtf?i!vS!uf<^1@N8)ah zey3!BH=5`)Jp$>3+R69)CgQq~?>K!77I=HbU-HYw>mknI{met~OW3R2)lALy#W~ur zsf8$?)4|(DS+`a>`}Zp~-=Zy)EU5d~G@<)0xXkG&G#^~ZY-V9wbw`SE$ZrAn@K^~G zkJEq9#*G1**f}(KSSs1wpX+&5N#qvd%AH}1$}+gzbB|ym+D+mWyQpWHyd5T+SJ+l5ggYE^&w%b z{XU0z5MEr>?*6>sFkfOGN_v3kgS!H{;^=@;)~-eIoUR5*Z^pp}oAA@EO2NT=JeKz8 zKy?{eO$@nPW1yBEA{LUnXO*$3BUW9)Y7qfOSr667oeT~M7bRt#?R^|2@HWS{@G$@B zMg-17YFx=~zcXoKG?$ifE( zzV7lJWdAJOmBAGGwvpqqbautJfZ@wGd>lJN621w}eUFH5q0=qKTj<~`&!qQhj{L3e zOnRgEb~cr+W`cY@UcSg6Run#1jmIlQ5#ST6oE}c^*X*3;Bj2?|m$#NS<+L^M8}B&B zR}|A$%(0kH9Qp9MmaV+%0w6?!t9s=_tQc4S(!@R@Hq;`&pyP%<#w=$lX}~7%^`GOs zDR9pKZKR-mNZP6vxh-BshzrG)N->MWKhz|*HJEr~A=( zhIg5Q@y@oKxlIG3VycKogO~EIc|0FMID7^0 zJ@RNWcr6y%Xe~-ts-iY_-&-0xIIZ>zF#9@ani8CpS zeRvjqh?hrZ$$d`=4Z17jRqlt%aZ!^D({=jIJq%QBGeW)DSolvwb> zoo^4}%7bME7vy%v0T)YjUZh7VGyQ_P;8!dDc7#uA4)99W!OF$WGi z%uz~o9^PR-&vJY+=`NMW5AU_wjQRNm=A*x>((Cf$T`zK^&>lk&<}B|b0AF<(ILxQ= zq@I}93P#X6TwRwKjRp4e19*d-h5*~i6zS!qN!cw5l} z>RDcDTvW>@!5cu_rnjn2V z*pNVp#E~st4ySV_>=2rabw?`qU*kX@{>JK)pE8eb9Gh*@hbw|IzHl8o~;=~7| zoOUWfZlE^8z890I73W0NpspH6ZNi`m zQAM!fabr0)iW zB0SH~odpE+-KuZq0>Hk3F=Qn9=m*#`S{sDaIF>oJ$%1)n z-DBfE0&mrzaqrd?Nlot%^_wa>qsQ48;)Ig6%tvcxr4VW#Jq- zW-+Vk@UXHCF(%V`SeS&^+-dvk=z`O>Dz;41di=hIIww|@nD`~3^^|jD$AOAV z8xb07N`B~P4HqrfP`A9t2JdmptS7tO{-nqiArm{es9jCeu2{gHVIK2asFN$_=E@M3ytRUz+#o+urPW4 zjr*l z&InZHNhvXozJYLBRmBU}Q$Ii8>5{(Q6K%Lz_X$ahKb91I(}oGtg9BSHU7TZ_8axtn zWk21+55a`rwbG0mOznWtdwN9MgeAkR0nd--B2^>tPR{Qo- zPAj5s-i6l;(Vv3dOGJt2o@fAl#FB!jc|C=6)O5nWK+$FYJYgsjk zb!*iz8Ixh_Ns-`FP^8!1`Wunfz%&*V=__&EffuWal3(wtc}&))y1+g17$(lfbW@F8 z&12R#UTg9!a-Q$epysSz2t)R;5`+tcX5SU4@Vx2 zyRj+dKE80nk311@`DN1nx6J=3Wqwa7(?6xG z%u~vIpC~)3j!ky6j`0TNAtFs~biYHvIdBhW1m+Djhqp zn&2?L4cZ<+mjP;I+*3ZnvzL*_nh0f^L_$^Nb@xiRMVyX1;!Xo_t7pY~aA-uigz&X@ z_zoyx;3h>2d2A)vH@?$|o~CucU9&#r%p)|`0B<<@%m{}X=rjf=V0N=Bvv4ZF2bfN6 za}=;DMwM?tdOx%jH-7{8a?=?8gfD-lHSxcCP3do}&68*`uc;$LlKR7i1?P8iR1ba1 zeds?q3d6pI^MUs!P5L6tk#HToPgOr66UvOz=~I#gZLD=HDp>RGy~Mm-&-3?1vhd)A zQ*(CCY%Wg?!iL@vWb8{TzYe$A%wKfUxDo8p+SR;p6&<+t$Mp+>W*Fsf8LrA!4&WH# z;#oWYIx;KjGD1wy;fD)f_o&=9#WGjh6jy$t%^CAVn>aRV+=we`a~6m^BWms{sOgnQ za)>IF9Ylvw2|-Ipa#9uOfGQC0VmO$?@~_eVRe$qOY*T*2G>((msQiSPzp=M!p{$6` zc&GRg<$zcc=oW2P(^ydTRnr|wm1hF}18cRN>s`I#{`ahvI#>UqZzWWt>-rZ5U#!|b zumB^BpJ*iPwH*I-(rc1sTYb}EpN?LBjyr6Dc z!mhiwkc8Qd({hbZE!z8kX1_l~^y0tJNWnFnXVb^Pv`h+7eCI|F`tzPgr3a!%?34CzDBv<5+Xa3 zGF{oInuDuu98e|4w9oJZr)$s(7A#EzSUW}L2u@uX5^dQOu|#mImXwJ#f@i`SE|N^8 zKL)@($b@6K=Lj}~{&`bOW9_Qmh2U-HBg(fRQ^jhS8&qD5`J`Sh{-(t1oqk@yt$~7CKJ0!@5;yM&;1I4f7mRVmlO!0A z6^s$APHHF^2a~Zg31Z=;1oIlDvlwvPG$yR!Eth!#uT@urS42fZ-;rM9u1@`7Nc)0&9tpIWrG%*@6{tRBo5ZvEbOwZ>`Hjpu z-wI8qsC*rvw-G$wxBHxW+^ZpGN@NJw5cZ2Y{14r6ZvIUWbWe zto7`!Hr5yHE+1=Wf_Q=^1Puu)5R}1Bn(9;Qp$e2f70PqhM`AP*ndWoc=UqK;5rCp@ zY7sITmsu@}R*N`duEr>mkJ^7t(5LJ|p8t470)dgBEI}!PK)hF`PyLD%7yMl7FlcCo zJki2)>X4trkke7XGeNA{lS(gGiR5WH_<{3hT!N_YNmPS^G^FFSIH{k%A96_cX_uja zjZDf3*9yGi@li*NKTK#a{OQaz&XOK5N;+KVl94(OFDtJg4DXu3`cAD4ZMk%apd%eP z3u!&l_Iv%U!{Z$?N6nNR9crsCyWN8*@@VT5-vNEa`3vBK2=8wM}J7AcXT(nenb}2A;O$;$6DM1S5ReZk`J5g zk2>mS^ZhG*${p~w-;?yS*HRrRX8}<`pE8T(u25@?-DR}a@YK zIV#=svmXhCTmiJZI$1lBV@rbi1i_-?cYy?tYUD9V<$Vi0&@D!-T_e<@>tuTgrxlPI zNm?FFY(pNZXp7Tdd2}KGuP!*ucvZ3QwcJJNU6FWu0`fevjo!)KAK_agSZhk`jmIVi zZCz$9u|FPA?qFw;6P`^yY^w_q&^U!FHdUCg{Oh2Cs?~ikydZ}at0pYy;P|PERPnoAH|)Ro-pTOMrz`?TF!nC6f1z8DJU?Ua0=w4|*F=~!3qY?fw5BP7 z*mlx{-x9*9(qTK7x7KEi5bMm^gKNy>d_kZ4E@xXFEV0CJjtd$Ly?H;;jdQ@~5_bNw zQi9gIUg{ldIOOtPV2oA0A2E$YM`;1L`jvr@i)y11IeDl)>_A*XJDOvm?ofwwPAbM| z(F05aSCT$u83;Mz&lA)lD2=hVmV|0&ldw1j)8dT9#}Hzfx?Vy>;OY{06=`+WV=^C5 zwnqOy_TB|Ps_I(&Pe?)%UMDEQs3@@p#bPyxkAxs(Ufs|8zIsai#9F%TpX6arKMZ3V5>J&qRCHoPqJ|E|5ynM?vIdTnoi z_g_CUIgfqzW9_xqT6?{=Ou1ma1H!W?Bp}SddPD>l>qp|Xe<7Qj$ExX>MpOX|!y@ntPmFf>}l0$HVziPwG9)9e+CkD7WSAu=75;fCw=QJS6 zsdp780^$3;O_0@z97`2nv{-z=b%wEZUOOs%lzol;9qFRl;e%M)`eEE@J7;6iepapR zcwvhAhrCDDb$`waehQ$cQx8yrHIcXlj`MjUit#}g!QOsZE!MQHlRLjNFXT25MVEUb z#zd{YWmBvrRhDlZne*yJ47FAsOA4&)X!A49?%v4z(F6Uh`7a2lL_U8VjY;%R2crji z-8Md4-S7$$=z(tGQ#tgG5}vAU;eOEr-NX6O0|k+}$?HuG$tflVEIG-uT%?g?$k33a z&!f}1CeM!^=o3CGdY~vgD0<+ia7pw)zi?05jg0Wd$NVjMqDSZ6PNG-S*62Q-!exn4=W&_fGo~C1L4}`;uKCHWJ55^WH`Iz}+YB#9`vL>*nayg#3L zt6sN4tGz>Zdh9h(m21_@o`a-)R{hU-t1oPG5e`T9vPoFWd*h7I&1#s+O^78rUORkV z%F2v~ma3m419+B8Rwx+;c#1N9n;HrGgguG3tMKqGR|)f~K=%-g&0ZSwEg$wu;%KUK zKb*8J@eVaKu;-eESV|oB(Cmb4t>noK=1F+XoKPxH#@ z%`zTp`XimDJ6^ie;VD{!o4||&x^Kqee7IK-?HhchF_Sq_SDqs}AmhQ;4d0ar{H zaAp~%hQ#73siBu?8vNCOI7cc0FtZZxA-lS-wW(!;Dsfu?j{DD+KF(fh<~OA$&Y3^K zp#AJHWsgI6d1u_A8L3`PMjRK9rdfI$b2P={7kT7CP2z6|Tj{DW8i)-?*YAmbIMA9; zDrnMYIGEUb_f1GwBz2WQ031lIqO*y0!ByYt8^%?7CyFI`RpE@fNwsSoR)uy7y0feT z^z#d3hNdCIx2gfn0s_xcgbvf&rbE9%zZa~$v#ch3R>r3_YP|kbT6DjyKlEEq`u@6)>u`ytu9Kqmmw5c%dTx9ICb zSUh#9j~Jf}%N-)9&`owlW}+K!>pIcGi&(CmCb|dBc7}f`PXzt~FEMpx)Slf@`=z&c ztz8&p*V-Q*-?jGDJULwLIQ^Dqg}oj4n74mcW(#g$4)lh(aIo|?b~pe`ceNtjQK}m1 zR0a8@PkE1ha#g1vwkl`dJWmTRu^Mh=sRW|4MbRNPS6{>RMaFI3Z~sR2uCjHp>i;HJ zX790x^{i~vM|%6BNpP!rCcuPh;@KpFnWe5p)C`e^M|h#^O@1r|KtgL_p3o<|NJOTF zlm{;~{$Sf7GMFgZeiDmScK{Z)kj@NCB_yy4a3nVJSMSCpkFE~2MZHr`ntMqOm6*@p zs2gr8aklZi^S%M7op9SL*+ky$Kd>CsK-%K57Qat34(nH1SzXQ z9P+FuVD8N9jO;`&tq2iViN;~0eu;~^n0R00hO|}35>`z1_oIj^w&o9(;?~MdT7713 z#|oYps%yxYvLEqX=9F!#PEVPhkzP(W=iZjt#V@*Dj2vgJgpqP8sumr-4!eUeya(1L z$BHm7q|5X-axz_^voP<|1%N-HD4mth=1=81u}FU_cY7?)M6VfIhK>Ingp&De2P65YtNXDZ?jpNahArEKlS2l?jJ4)(*eN8hp#{ z%-rMu_8D|#_<#TXe**&KE|=4CYlbxiViVdV`*J8rd)NMsZoqKQj4@ zY31#5b*ol>$sW4qa8ch~>}vDgsnc}8@rPnbw<(U^Me5MDv|-PQU&v;P)K!eK>hIDQ zlf(TGUfXo0tBq>#ASjfSKzQQuGH2WEuMD+`23c>ZVJBCK93A7e_PF4W_PAK4ehfuR z$T`fY2e(n~5C7qmi-#0n%N7|$;WE*|E>mBpaPrGEM4-=Lry<=H-EL@EEClzQq;$?K z)U%@bh|ONEYLN%o->?;J)8^it2{sx$kp@G`5jr~15ci%xey;>`vCX~Bqy4+Q*+Yy! z97mV*zNLbbQhLXPu$Q+AQ5;X5 zncw1@3J|h<_Abw=cP&r!&)Fg$%<0FFQ1gr*jz`*F`IntEMc6Vs;&C>1cvlo z8tQQhb03|(5vlBD9@njubW_|2a@wvLAx{=tL! zfD52iuk)U0v;PM52y4M0+D46NJ3#0OU)2cxR*P>Ja1~_M29CFA<1M;0kTy1|)gnK| zC*>#0`Qq4*{~}+1vB-QekZJ&5tC}-Pz&ERio=Oj;x3+I8D#bnm%tC;<3t-MB{IgC( zzIVg<-k$sA0j~)+L&6{i1%FRp!(OZ50TDRtZ;615VhzK2Wpx-gN$G#`+6>g71t(@D z{3S%J)4UD)kwjyWt(c!g2Fr^1b~v!i7tjv`^oem)ZhDQtNj->`N$ROBDC82=Yp#3A|3}0qKHM3$Lc4r%xfcXV_#04bX~08U>@S5+eQ@Lc5~2LNyaEob|9+GbS=X6 zmTHW-=YUkpRrfE-yiY73bI0-(5|$Z)%5PKqA(zI6v{+E>Xap|Kx>?MD0+3I&=`{IB zvM`e@MX0PLxR0>~m#s;BuwLCDYV+AkA@SO}74`>h-(tPjHb!ZCi`bJ-lz!kfNR`V5 zf+wPB*1h^~?vg)}x4OZ^BwPoA3B0&z^0P=29{*ZdBdje;tHdj5rYPTOizb zl!mku%s+^LJ2>OyR7v|8*Hv5-@zu@Bz9urtWING56V}QiX6R^FjwR9CdKH38;lU^> z2wf&V`kCn7oLk*>NB;E*1x{AoboTL1s`8J-TGJ;FCug8zAMpj5u1+6z!8uO()IMm- zKpdS28BghN3oU?jTPu5TN{5H#ZB&DKS%z3;_%?-D>e>OKMXf?v<&Kdh-Kzehgo*t% zRoU8q6z;qy81wD&#(b%|eV0ditWw4gKH1};EH)eA(>-<*gk_Ll4y%Y6XTW`zTMb{L z3Za)W;l0p>BnHTX*z6q{1*v!|6~86>Tqz$-Tx!+JK}(olt@;Pu3z0p`AX!!&NSi_N`OuFwX6a6R-K zxc`n7W7s`zY+~Kl%tbm{eWENX02dGKQic6>u|1A`0edO-g_PJAa9Rgq%)TbkkDY0j zltBpbCrdA>f0#Vjx++Wh`(CTv$7zX zC=XvQm~yfFoG(8W@^hp7Xh)VJvFSs0g-<5h3?lrsmPtI7N&FKRExx5{ z#)tLlr(en>vHy74Sf<>Ww@!9I!xMvsIAIYCq*gO~I3;OnC8UcT1n>s#t@6iXtvt$J z7fpC@Wn(zZn^phca)G~D{RS>Pb;A(^B{-a-qe+--)!!`dXP2WCnZuR64dvLp=C%*T zU1M~&9I!=0jRSvgJx|<>VWO+Bdw3<`M`$tYM?DI?)y5W`foHjT5vj&CwuF{Tx|n4n znG&)1EmzYuaW1k+GiLA)$DQR^&_tR>-vn#W%_UFpEW0}W(Rm#onbOX;-bMzr*B80g z5L>c8jboqCcc#Z^W=xCwPZARCSZU}mBJwu1Fx_V*oT+TIbXoVxX~4x5-5c8Rky|>m ze}mDe%{>`i9Ln;8*XL)6`whc88$xG`J#ff^JQC*!B?;gmzimWgG`k;pRNuB~M#?WIRJL ztiU9LZUe!9d}YI#OpY4ZVXJD@cA@*qgtNF3nwBAZiVP`!uuP2zZ^Ci@$AViLZqq24PJSuRjR7-yV07f#_pPF<#MYhn)RiXt{dS%Ge%I-UwN0JV_s7ao zDN~%h`E$1OO#|O(L6=3eS6$DZnYro6;Q#iqtd^^z2RxDCA6P}GK=|ZhKH<24PG<$& zb(qEm&={%qllP=eV(r^Aglput7t}+i3KHoQwfckr3`^m%8aW|Aa`jdpaWq>ebUvb+ zw0@+dtA1p+z}J31Wbf<{Q(*?)if)pf?@~_uA#%ac6qR5Rga|1YG;dYoMKy7KW4F`K z9g%ZuUfu9(BIEE4815&(qbJ(3&L3MStRFw-(;`=UE3(7C=4~Z!yYaTU<8AJp-6@kl zC)X3*nBpoGsWLKvBR+*`RA`OqsL&eO#8zi+Vu|6HwVqFN=At4e4jxAzvUO{X5MhLb zT10n}cVl*b%r_OWHicMgNqVY^*p&HJ{eK9CR-%d!M_c4X5kHU#Hcvi81YN>8o+1yl zs8h8_N8LssSg1zw0AjpQEV<>j@BWx?enwnJh!ww(m9Ads=d9;Yix3mZ7}x|(7-4pa z0QGNY$Y`ZzQHlV1^(USP$8+*zBpv5F-n~VC)FhN9<^wI8EL4x_^1g-kl>2pW7$iFn z@g)@3b4NMcTuHi4g{P2k68n!r2K7EPItp|tZLBBv;e)-tAK zi7It^XL5;^gB;1zRAK;~5F_-7x`mRDY9SCEQI-`RX%bB7DUWxa@+GPXdZe>Ufn@@X z>!4$3Wg9`gC235YqD+*8D!q4pwb z@Dwz9i&E((^j=TS$C!b#Q=2j*tUGGS@~x4zHqj-kUUn~f{W?LTvj$66@I*j6<_ zFFn_aBU$xle2k2eZkPH^Xp_zpkQs|RT}yasGUWBqGjuabK|@49M)a$Y&cY=p(N%|T zl&YWR%8h1QpDky=*_!`2;pWj#kuyN1t7G5n95`}CsXsoGb0*&0Yy3{hgJ6x_?XPS*+;zQ_pC zs|p9#S`VW;73Re_^NzYi#N|zzhq99uhoMsKCse8i!I6pXkC8f|MINUu?WGIxY^+m}46UPDS; z^$dD=Z%!*Z`#@}glocg@HL1EeP1AOtHAh=hoXwkF6^BAi%fvx!p`G1vry# z1!kYbD*Sm#8;b#n4&AiGW3MGN*B8G&8}))!f30D5mTa%i)3jg&vcevh6jX}LqFMP4 z5kvn2c?j0HLyHro+4AnDCBgXlPxAbYGssk94C?j_oMi5AHjkq3) zx*;b)lt{{MjV3C?UyddU!o6jQHM~t5-uPEw!`dd#F&a|)lU4bwz)FAZCK;^*0rk^- zm=y-$5%^YP`o*36@9dfc1XzgwQkeLFJ8R{bR8*biuN4iU`7)k2jp_iQx|Ryk->#xG z$~q5wVa6MxcRSB0J6{>NlmG@!|!!w+&t-?xdm-m(0D|sz>vr zM>rmDd@eN&IoZ89&b>g=HLs9z&4pyV*M-~Ni+ANh$jcjCB<@3E706)&`n_9Xy?e3R zy^w%PUCT1}Vu^e4W4YLuXEj_*O;AoqCFkb33unYQYvEZeCF2h;qGE1M_+mpG-$Vxq zakT0;=?nVP>RvqKUOeGm{L;O6z`gjPTu40hEBoD<>617Px~$Q_ghxgb-NV;;hP)6y zfxZ)X!p|4vr;q%Y=-MCYuO~3L;$ZEn#2@IYM=M~pcm?sbF{pgZEK8C%x#y8^Yt%mcdAG+a#{Usj}1Y+`cL{%R&Ey3C*@MCZ# zrxCB(nH$V$Qa?Y@ZOBS~cf>{3!e4_eR{d?XAfxhI^%uF*>US?jxfkcU7i>w*TtVs0 z1(e5JAhPJGZ}{0h12jS8s4CVdo%f@PG(}L~K{)G7@9xoy)ro^%62mz~42Zc<6>G)o zJ*?<{V4t{vdZnuuTlFKj2hLXgk6cW-$Gs?aU-jaG`LXJ6cVEqri+$a#hFsl4!6tyl$%x^QSNJAenmH01(tfiysW>^vw;PLre6 z9R`O?oaC&7KzNf>_q_b*h~(9B^*deH4C*pdeFImWrur=KU!H+3jmJ>kW(Oc)ew|A zZoxJR;+X`M&wJiy=pL0W5n?BpW(eLR>`h$0!e10Q_*`vG%xCb1!WJj)?SNhfdLBHd z13mwW;F2cmqLn@-t@VMyZdE7lJD4)axGLJzW-WN4o$}D_=>9w_`jFfhXYQAWQ)iCQ z^CfC=mpU^eU^Jl;XDLC3!Sa(qL-OdY43CC|%B!BNx5OrfBX^Fh)uR5!G&&Gg-(#C( zvb`gWRnq{98?O=(gqGPyUZWz|l3_na)R7)3IOI0lPZiqU)E|1ewt(7YWF{ zQxqmn3ZAchC{$Qz)lM}Pd9-f!ZlYddl+Mti%!W3*8Fn0#fP9Ys@F-1>xzxGlnuHcN zsgt4phRrwWZ4FMW$h~eW*|d^T_emXwcIdXs$VO+9^K?n+_+55hCMrtor$lz3W%_*b z^|(5Zm(gyN3cFNS?3bR3^H!#UqEk7Fks$1_jakROi|&1gF2@Mq7oB579T{Mxp9wx^3td7(vEnk*c(Z5;`pjq zD^vkV{L~n@VDj9?(b>lAHli#%8ihf_WGzYPd=EQa`=8#-5+_ZkvHv0J1>-Vfw&TQN z`~(AHYQ~cclbcrCSvddfyVzPNmTjy4ety|;J}AQ3EMbv4t4p8gzCKoc6Yml``Qhsv zZ-$q;0gHri&n7B*t)r0IC;%52t0uO1c!?x_2~Ux4jc~39t-B!Kz*Qy)yCM=ym(kCF zienMmsB+*)2@KC>DKQDb%07A$zQdx(oCN3o&`GEVl7eiqhfdroGHT)yt9~7KGSDkL zLt4p?voA-cojvn~N`qF_kHAwo2AymK{$02ctTV4kmfG|4Hph=x0Mf-Ga zD}gW0{}DUJA+#5yCSMxyRK|7F-o!!j-iqVMMZ>c2Hum7)B+jDs5iVE%U0~{|+c!Ca zc3b=`wT_i}SQe}t7#YGMzMsv%8_J<$I5sf_%N)=yQ!k6GQ!A@2o;TopU6d^%tN3!U zy+c5K%cQ)J;$`ZWQdq35w0KSA1aHOo?8q^7-{|&bITTGW#k6iWc^eBTQWhEOt?*|@ zs_SNv%W61Da?(Yd4w8^K@9hz~RY8Hom-Pb3d&WExd`ZmYQC-Cq_(?>L5#lbiL^q=@ zKbGDsmCoXVrEZ5Q>={>-RgLSZk7~aIE-`M@n+#^sHUWtYMh4X}pg+L7c+&<&p^|0l zuUh#ZT4qmbN|s7(rPL;*aFVG_aswoJyA$0ZANjWF6%p$hyF}-wF)(xJRi%iYD4`6! z`hjjKlV1G;15!SPj6$qZAa*538{R@>;T=vMOZy!OU-H-bIM`z!5%lC=df<$FQbYvo z_wYx;vcp-Bs{+O_!jX`^HgUT#`jfb49Ud7YL6C5z*XB?n^41a`Lk7c*q1c$E5I(i= z;K5XMc6Bz82asENgFe>_Ng9mopOB1}GA9AZl*kbkY~BKuCx(yn^HV6fBtgJPFMWUx zud|Y{RoZhV4kpF!TkL}NAV)nvh+trN5)xv8u4S_@y7r^dZTtT*`8 z4E03+;&Ipnx#Wn^{RL%Q&jh$8o@G0kRo3Hf`C~PNdG7%B0%*Huxh!=(BjTq5BNM^V zZ||OaRdg1oC0|C&&rXh-afQBn-)BxetU=W&C0~COiBbezElEeZ<3Du<#LvE<>#50t zC7V&m`y@x%-L&kn+xNWcIl0|lOX865Nm0ocqI8e)?nB{(SFSKs$j4$x$KoWJe)8({ zb1{|3b4??q|3W7XT1`jKx#uPC$?b5%c-|GdxXCIhq7X%?iocwnb&Py2 z_C6W#fJaYrK_?|0@Tub|n>GQ z2W7ZCtyl9{gkoI#Mi=8+hs$Lrf$N_UnDHs-+2M-n^-R`FdK^u3v+4u-37+>?%aeTt z;VDKt^Q7o@?%X8`oEpZE@0$Kb>Yj*mmG1g2^hB$8Cf!e|`RbUzfzu{^-~Du0T_Qb= zpYZ5VlIz_9Aad@0Z|wR<%yx0Uj+)t^qO{7G@Nc->k1^2Ca-7Nc zExu7yAglL00WQ!y&uMACfoei;F?{zM;UHga)vBlxam|QLxgRQEPXWYS_0mxT(l~vH z`5vLA%a~)C+J>*Qq)jGegzlHrg;`qQaO#||qSR^9DCg_(p2{{rJJC9USb-GT_fKdp zXSj<1s5dsXXze&jf`4lAEg8ER=~hW_EFnTKp$p0Of`kZk26IeDOp7VlSIW6dPX1F`-NL>+LB!xEJNf#2tKhJd$X zD#?0I$N1rBdRf=uqnP;cZJAT`HI{Kij$!*1T5Wm3Dq|Y6lNY7s5{(_*MST*R;torr zC+^xZEZ}cOb_x74V@5}J>5)+BodS-|Qb@?I#c}oDIS^e^{;B__X+L4QlJDK|*-yKX5u|Ycu;t`|WkcOCDNrRa$?Q6`m-#!(ueyamOdX zzS!)yKyx<+nO6hBhqoMjcuS38PiB_Xd9p^&LK&ggXxa;3s~8%K#7Tun(NqQXlns-R^Gl){83~cdO!M#i-&M!ft zn{tr?qN$>pC&kCHW9(Jp&spuS+ICxBuxi~cy}hz^U$3UgR%4(C{lJhd{+#t3oG^sL z9h(|+do0KnA22oyk@x+zEqKi(b3Q|l166Ie6yVIcpqrlvI3~my5|}wyd^-i;C5~rj zkuzDT;!}bG^ftWJI2p0E+8K4)M4g0RlI9LAxXGf{Z-Ak9K)QEZ~zG7^f{U+ zolU9YHeP=c#5?NOmG2)y_K}MUDz7NAF1UjJZ6tb5y>Tl1r`DOg9KrU|Lp(Rr^-K(D zAA<)@H1=M-8gWkDB(`sH1yvQYtufK(M$52CXs!@49f6J++G>!{VDs|vE-%@}{)9)v zp2HI~ET_>hY0j5^l;AT-I6^zPf68S40SP1X{&_8N=w_t$@IV7|v3$eLMcw8E!E60T zWCjJPKMEhxbyREX5Llq|8lWmjAIe2Ape#EU z+QL)vv(yTNNj$BB{;1|ix!$-x+W~f|4Ejnf$>?`5!Ow8wO)E>)Z)nCuaPHGZG#$D} z92Gf*iPO1I;N)s8dZy$+kq!;PD5pxgsam&CM>0oM5fIu$!C!a7{EZ)Pzv`#IT@k3RQK(%OV#$tCW33 znW$h{ANKmpc3!2OWQFH(8owM(@ONY^$!GoXaop&Il-MDy&ds?jf_uie+@#W9voH_5 zj?;$DkW%h6;va%LtndTDI>KnoZLx8^uaq!5;_uQU^2V( za&K%_k-zpBqQ+tthMlcNd>Xz`oNnvijr7z}!EI`_ab#G=7NboqdI=g)|3-Ki^3gLV zcTx_~TTuipmU1GjFH=+5?<5N);mzEOsMOmSD)&}Ic3Smki7^BHv3J2^dTt4!<+e>n zb?hXnqeIz}5p#BjlRQOxGfruCwKkB94Qf4`+~ji~z2^V7-)P+LlzDi1*&;NLGr$2y zGvjOAt5a5NmwZ(XkF)y`OtKn&uJ`$~x((axk3A(gLwT9%p#7Dap#6~SlE?%S2=8;}a_WHU}qr3}#vyAtWW@%hDH%qm&BSdTW>q8r=pj045Ir9xM-ezeYXOCwzQrO;GrV8CCS7PVjP{8w zazihK3hDHeYxxr%>$j2JF%OE5^)JV0AM3Luy(gA^gf_AcwTCC7%oW=sx6pf<;ig<} z)Xmx>fJzy~j6saTd>EI4jO9{EfG7h`k7XnuB&SQZ-@%=nvnypU6hG&5>c|*ZX}b58 zj7xf-yzkJDKNR7+0~#aKUv1ZOAY(>FhDOJT6o?AOYfazM6{wEJtMrt^#)Glinqce~ zf)zR_D>jlK_)d&`gE~jZ4GziTT|_)I4#|S=nGVVS+w1c4YF}0aMAhU#yG-(*J;my7 z65!Z*-}^c-b;H(ZRU4_$?*q4iAs+5{I{4-NOB&Bw20v5%eMeN&Gg_TjD3q&9SiW#68Z9 zjgl-epBqANu_HxL{CTp`s*1Q0FrKkc_dlPYl}x9y`xf`WQz5fL)t9KBA)Y1td~RG| zTGZ__%{au-D%(I6(p$hLF&DwR7E5XI`jtL;-sGmYd@3lBm5?)R&7H`-J{>T$gpX8^nULoE;U3al9`)Z1 zn>GSp=u}O(RrD>{O+7~!PL+?u9kcs(na7LCyTfX|L8kB`y<}ll0?22mf&hf$7&|t5 zQF|?cW-Q@Tiv{QeBMfFfd9wp;m&}>Q4dWHslDN#&bGfPKSn5eWLA|GPpZv?`Me6>~ z*Q04UvYJc97wh@R+jL`^il=R9P;zX=lOrTv@VgWgfPe8=A)PwTp9vHSDp{_;!mSPw zZBbtl8vG75YiUmsnlPJNRVfmQ6Np`nHSBtS^clg)tnihrkgXq!-F>SJcH8%BEEXi+ z4Pt>Nc5|xugW(2^k2Yv*x}we$vH7bY+YWkNSE31ii*%P<3`greg+%?X-NIYcFU1-l z#~^9c+ohhBH6$Ucp=rWH`GDQ# zY0MfiG18ZZIh`I_D_f)cLUYdwmx}n&%y)6miigP5kix@$-+1JYeL3{$ z;#d5Yi*x3VW&*avC*-Yqt)S<+dCz4nfU|6}R=nNY)4n>}@^11(U+*3+@eqjv!d4Bgw2dgR=1Z19GJd%;Bhjw63rM~uKUd3-mUgP;YN-6^0IZ|6 z+_N5rvLb61pc0z0B5MX$62P+}YZ_OAOe?Z#xY|z}E3!(t+O4muxq6eUVVkv1V}(R# zCnTHw3Q4G+SkG16zRF0k^lQc6nF<$eB%G>lUzPJFYkJ3<@A0O6`|+FiygZMXH!2YY z2jK1|bpSuhslr}|4(J&J^Cp40JlI<@`^!A)NlwP-&JvDC+*`l_M|(N$AORvLkFqz- zTUSTVk_B>A&6Ov*vwQdyzU&qrz;AB2h+l%9o}xT8^+@*Mw;-9zZ=qI0f0WkiA5GEz zck55v1vBzeK|(z?x~qw3-``V(>sY89Cs0mC&`AEUro_9EhG_|h8KAeT6}T}(s$~0|OJu&~?$43c`kY;u6`zLQ?VCd0{IxH1 zoG$jkFj4Mni_CP{)}JE25a{=44RZ_`p*Ch(WS*rooBL$W+MKLL()gkW-hu+W+(RTa zD=mn^49&4;_`1kZ-UUbb$TKY|Q@hIx&98hDHWsXuQv-{b5+mbu>x%=DC%i6 z)1zOI*N&EC5sU9p#2wM4JS0N5F&=DGSXHV#sX)5N7s|u&vodX^|qG!&*#Xvkca71G_YxiCP-LRu@EFa`xutAa7DHSkF4sL0D} zM0e z(WBr9I^R`VP3G!`ta{neaxS0fB4IPp#93}+MYdtPlV#(KSWsvp4iIb+tJbS?sM~CA z+f<;*pb@p#O6^XO-?jon(sUo9JO9r$ya*iTMYRZ><%fAO5#dx)&>m7%9PNPHjn&VX z;m*AP+klLxF&pUjLo0K>qx^mrIaMFEB03U5X&j#&yTQ-32rEv|+7FiJ_>S#7)SPuD zyS}vP8x`F&LE?YBsGG(I*S7PrI$7)EGHo~0JmoW2z$|vW4pG^tu5K}4X5z0}si^^1w`nbLAV9aAJW!b~(hDj_2!r zjS({!BbA*H@kP5pPe~g2mb^47wqZZ0nS3o$8uhKvv zv;U>>g&sN1ZPJrTx+f+WU0fk0Wn)Jw=KX!lj*J>*18KHliT|d_4t{CX|AKpQwyW32 z{zzVa^eQ`^mA=%_51dtC#ALhMjJhVn86}_Y81FM&>FDh*oaG6{|HacXcW$pTLzwI4 z7G=*pUA%PI_T^nm|JgDpIYD&XX3ZzXI}rjZ=9AYG5)PMo3Zb$xb}a zlr&rxb*QX?Ff7lvc6zM7c z1*s-qPIDw_JyB>qkyX_iDdv;o`9zjiKj~g{_0h?(JUm6$v)Lr^Z6rNAbreV)t2^o_ zu%75vwaRK3C@UqNm*dnU@iNpy0zHQ!m1|05^ea3H#rmr)s2n;}d}ebOto)U1Wr!uB z0LEqhRU$NUhi6E`1EOoS>6SMNkro)Rr1vjA?J=#<;T1g-C#do;|r{zt&%Jm zF?BmAEDq|3P);@{RI)Qr9%LjYT&U*rz^p&$OK71Q@|-NXZOlaS`Yzv|-SyiE>2IIW z-|iB=dAbh(7Bk6sx&`dN%f85C{}H#;WQp-4ea7)5UH=p#Af=^UA(mWk(0)RY#uFV` z7(P#AvqifHiNRNog8^tJ6NTBUkMcV=^^ zulty5nyJhtMUfO5)`X9*bFItt$|&DEuD$b?$zwJ;re_Dn4ZJK$mH{5YsiL< z&D~HwLvrfm?$tF%ob4%r?>98vj(?swe$4^N&DS3cDn!W-gV9?)s(YOWInA-Ld~lT* zIK%irMGxbtWoCl$HOnc3NBL`45nu9RA&glPmE^3#cR#P4TL(xKcVwz`SdrevLaenS zaC>J(AdAYX-wuqm8hC|V%*w8gAR;!Ane|dRhEq?z+N-y|+k}J~ucEvMvmJR%(-=ej z*l^W2XEi_r)rZ)hG{?VGM%b$QiNQvEu8iwdb@Cc-YM##Tr_HC0@wJK9l&tp7!PFMgl%*3@xzO*5^IinQT* zUmaPuc63p<98xM*=U^_ z0D&j{y}dp#WOE>Aoo`69&u;DTq)dn>Wmo)`KDhr4Ya)@eSc`GX!q2Q-caWE~9?4;W zd7{syl0~vRgpGD{Sn+CK&MINW9C_Jei0-~yo%G*tJ;@Qcuu#y06CcHiK?}f|tEzK0 zfiBTCezzgMboP|)Sq7fVkW*?vkAS`1LrPow{U9Ndc)Jc5)+7>`dDZF64bRoh!=6*u zz!?_#?fSAs!W!tnV5zy(Yu{bAm?uHrd|%#(;S3(FMuNH8y6fBre=fR_ z5biG1Tsn5Q&N(1d1c|7xKX#9Po+|#!NumTYpCsGp#uRps>^u?^5l+)^`Lq`fOr|@| zZK8$2Zn>SHWo_zDDC;pViCCsqZ|>2+6lin;V1_FvF#+LBN0+ zr@$Y5uA6FMZ%xZkBHdmEc9@Uw;3IeBC$)F-$F`@oiUsrt+tP5o+(9s%-hQ8;mgo={ z>Jd2DBM72V2r{NYAy_2XqY7|V)8|=e7nZH+DZRJogf+gyVGXF1fi=qq3f3HoTj=&& zRMNZG`^shrD$ZLYSpRX8mN9>sm!F77Ez4vsalH~e!j#rAmoK_=c>r-=7}{q*C3y9^ z!~wSI(kFimzi7yXt2@{Z|J_xP70Z#4!X{k=Nxz3%tCf801W{y`k^11}sX=@GQXu(! zg~pQ0S5p;X&nc9G<>(3~+$?m=Gf`Tm77m@*4C~O%s3oAy7Xq1e8 zOP_>(3ymOnKd;|ZHd$4z;XJkPcMPHv88&s>y~ETR-IofVp`xr9yZ3e6<4A|c%g^Am zqED6>r*$_-P20k7i}mVZQ&}2Z(ro%aXp~K)qY4rSeLj_rQ z$*~B8tEP&7@NPkt-Fq8PIaT59X6gL86dr6B&d6ujfAA`xz*+N&>W4-hWYLbZ;s=2#4+N*He9~+K7$;X!U8y z`zj9%5+(E1%wHZ%okde!L{UAjQm@^6ywnAzSn3O~(3ZS&xd#Oe4t5e?4Q`R^B3?X{ zHnbqt>xce$uXQUH<5!}VJgmFWH*QsVs>zTP_SvI}+Pu}QW92U8>nA)oje0=#j zCMMpCjJ<>ACiVK0jygDf!W+Czoq8o2b71vTW)%#hVVr2ZZw>NJ?TbdLZ0^Lsxe zl^Tf)nTzl&dlk7BvOQK&0e=Hp1k+_d?p<0(XzWv@+b>0CiN1rnGoe#Cz$D*OD^P`q z)oBK9(KGz^H3e#^Jc&)N(dm08SE%pn5}a-h>0RqBtH=(T6QN_1r!jfZf!jrnJ3-zQ+uX{f)4;j7zqBmcOeYKSo2V9Z|{ zj1jLDn^@$J`3v+p!`L!fs>R@kAn8}U-mMa1jABPK(Z+Zuj=O(7rcl&R)lw>%g{&*2 zsmA4EhXVXlv^BeHTMIsQTWlgh^kGfJRK+|bCinD;dD#Ct;`-WbvknYT_QpH~22Hx& z+oKD3XFlV)(o+b5O>|7Nf`jDf-F9O0mr3N>RHQzyz#rypbJg9+OEh4Q;5!?2v8M$-vs%8|- z=?;B+5zg`H7#Ad@f)!GlrQZBC^+(rKICH`YJ%m>HV;%IS@z`MeqU;67dE^x2FHQLF zL5}fh4QlDUy*W30vc~`m$Cvuk1oVw}pC*tG4r%jf(8osSwl^1qdwA?_C_Hnq&$Kre zW!&}}wi%zD+zR#;k*~BjcMD(TAs>&Y@~H6mKy9~RPAd%*GPj2|(CV`<`p~oGZ89l^ z&+yo23j?{Kc%YzaZMZPC+EcZ8=G)2s9wK0qMNj3ka9%hqi4~=rhtyZ?&Dr5HDlRY; z-_yD0t3CF_54XHcKfq!P)4?IIWA;bb%tb5!6>&NLRJ87p$?x(&qVR(8-tT@#5PDSy z`V~6JT=?3REOg_TVxpFIPXp@LjQ(+tu*tlNJF@hmW80_lA;~Tq` zWlQxA{<9a?f>Mxukl#clszJX3DP@O;aI{+;m9F$OQ)z@#pU@TLdToEM4uYiQ2K62$ zBWD?WyfVyzy~sMA_AIzqp)kJkaBoa(On5KQpId3dY~J%8(o3Y1;N$ckDn8wDoHu8O zU*^$+@z~RP1#LXNT6NB)y+QkRH39Ql$ex6k?d~9l?cErt9aj_&VZ*qytiVpNwqySI zfCb*Fa8>S{3*=A1+;IWBSD9u6NLHNl@fz!@)>~DCTW*eoy4b<0US7M%$1dQQKzt%+ zdUOjQIQPeh5nbKSQ}x`;cjc!$neM-x>?i5=rI|o&a6u8{gj!=hxk~&x5PZWJc0uwQ znXa^!`v}pX3pSfu=r&jph-C|q!+kuqAK)Se^}@DO2*J#(yDKeB+maAue$hg z;s=tuaBNkuBzI0v`BPwh>pngrCi;~SCLw$C_;{~@?9;=2J+>#eGJDR6{Dm3i&Mo#< z4ZX9-TlMwaxjlSUYrOW`Udy{0y?Jz1zp58!uJ@4EO@d)0ja0Qsh`ah@N_S)Z7U zB(8q<^R%paSm1w#hsX?FX+P6o5W2=sKTFZcaA@B)_>iS8M&w?L&msnr))EAKwZA&4glK@1Gp1dH*;#M5|~)9Vo-28XmE! zsS|Ypw==B1F?r*U&C_am@_?@pLvT+#)fWlV;V*aplVE5+!N|G*Py@#H-7J9Y0HD7lWLK94a>f^ga&Wb&<-`+C%|0Ap z@jQ7_&x-~twUN7A+ip6+_pVnu;QJd<5Poj(bytKxhNg3M3;t&O=d3b2Tl)!N^X#FY z_-j{-E$n%b-yL3bXBi0=Ja`VBe|aNIgslmv+#xd7R~lir(g?dv$PN$;WXlrrBo=&p zIVqvb4)}y}@rk*nZ1fuiS=0?B!kPXOwlZVL<296xxBX>l3%a)%8p$E4cV~9X(7b@A zkJ7Wuf}Q#w7~;^!bXkW$iqM@|BT{`x{@*0Bz4Sy6gKlZrULMdB>78`ybLo-n-SmKu zq(@tn1D(tsNq79wBw=uyCB8@mdJ*6|6EqiD{z-pbxp_OZSRME+XkRsX@-02pZn?Dm zlat-Vg^M%5cF2R+j3tliie^oYoTHZLiY87Li~Xs7u*6@rALE<7 zMfAM=lkci;rYlB2A~N4K&1%|zf0R%mva-5F*U2`tLv^U1SDEMH7wF2!>G7!(O*>kw z?9f+qygvx_W`Oc>#x5ao@eg%Z664KZBby*?PZJl8QW-HSuq(heT>W;VPGL$D>QPfy z4XNEK)PqjN>OQ%!FRw6G2fK%sr~Ntp8Wa|&!i3(Ji^w5TKSIn4Mz3e&Vv&cnWPF5f zeTV61O-Dc1qUI6dsipc4LW}q-@+t>GOCS{-4JWr<__hEJGlbX8%`~-LF6;{{w4@Q# zsb9tw=>0o;7e?a4dT|1iCrU3wd{GafEh^WwBAm?NM%zUl!;9u{40PN55H_S$x_Biy zWNs`qSx^7;nN;2yCDS@nS9j|EP3uq{U8)$h`2qptw0F9b--QUo5-!jqpTr-1N{)-; zlo`Y`eP#~D`kG?LNwMER0o`I!*9lS%$B!(^6`FEKNx68Ja>Y`P7$hl|ZOZkKauR2h zSzm7{C;keQ+n3bc>n7#S&n$Py-o@Dia-21b5(~OX^GpJiZ z3)m`Xza6maQxgShfvUAuy$%Mz;@hwUz=iOytG|Z}JCfB2xIF_^uUZYO1hzMZ?5ESP z-RQ!0_Lekk=cI})?lNGz5!g;o0NbgLcY-a}B45XMV*~bD`a4Yen}+bSxq+&8tcK}8 zI5hup-ERZwi5ZG?2h#d%Goal}E$`0DsD#Ih$^eiRp+ezzjj^wg3EgC|Mify z|Hn3W%#oR?;+wh4z)ykI^KSyH7F4*M*ZzYY-wk)xzHast);^$_>=FPrq~IhdZ9b%a z1LfgVExEk~8PDZ9xuP>M~kp;9LI8 zz&Eg8pkw_UBw4Rz2n>ZkqdXJeNuuc7ueAID(^yJXngM-}3#wi$RbRz`5a<_(9dIHTT5 zsn_9ggG{|=NWBm3KcwE3fA8q<*A826ru_Iao&NBR?pg4xc<}))Tn@Q|Yc-zg5g&0t zq~`^x;%lipiRJS+>NQ$d2J?}EgG29KT`vgC~jXo?d$``42ucO)h-FZ4!?4abAyRf<#6Q)%pj7L@|w#AU8X@_h6)FkUfjNP7Pg( zXw@OO@`-`9sH3YBSTzB z{!LwhdCh?Eu)l|+ftN*JKo_$udb=ooIN#!7rZQL?Ae`ZxzIO;5XBG@g1#>pAV(k~% zBZ^^1jCMmEwcb#(n?{Ft1(uzp4+&{Hx`iT?+#gdK4J~``oV}z^AqQm6TKrdL4w3Sn zRMST^;K6jX>}C^5c@>UuD8frb9x9cc;^0qd*zN)?4%sdu zf+xpQV6W3k2HtCZgJUZcCxedlApvhCPGUJ6@j?;?v`srECODb2c2+Lx)NoJr)c27T z;{Ea^Yvoopc~i50$`;FBVx0C1i0t!^#Q4lGptg?ud;HK)%9-uWx zMt8@|(wKaFqvl61dRE@FJtn!KhxryzWM zzz&Hkl2zZ+Eh2$Hm=}_xs4*K$o;`^I^l}#nq3d{)i%{)YOadF!0KA4g(K-DJtcC~W zedS22UX=26{!3tK^@XlFW_0A_UaO_qNh5O5u(%25ePseo{O9vsGL36swddo zv>@kJQM#X0AstjrqU5sMw8dzHT0*7CO8G_{joQQ4rfYstmT5-K;c=eE?q#_IlRUR) zduo-vPd18n3w!h?!4_n?u-H)U)V7myV>@Y9$79P={pF{x{PdEae0~&{w zBgeM_gKq(7L1%oM$qa*U&im8!`%d_F5d|vm=oKlfyd&4bTSV@1?<};(^l}hxOl~H| zc?er~Fs}O^2jjjdSR@#Cl3W;!t7#vT`#(pyhuAND9Ln7Tkv#r$B5|O?8sEVUc?s+RtMM^1X20a-de(^=Q%y^I^gTjQfCZ!3!8#WIAt9&;8hDgdcaqI>oW|P z33p@y@o~z`7Rhl$;u7BkMP@_KZax_Iqg{u!{hssR)w#45#B<9S3HSQ#hs#=}DAGxv zps?gN$wu}xsVl^f+2lr;(#yWRz#giWeVZ7~yUX@co_x2`$}-)`#s$H$iQ41qZryG$ zcAZ3{Ovh4pXITZ-x^j``Fu%Q^4L)l1gR)ZZD_blT;ain9fq&+#KA#O1L+(BjSS;=g ziy{My2Uz8w2P~5JecrIBo^;7&9S#zh4!2=Cl*~kk8Wkr&?X~F;x$8G#)WcgMX#Y}l zVj+94xa?1p-2o(myVTSCej!5@2E>G@*c3-`&}v48rTkQi%z6VLt8x#d|_!*94$*F69f zqO(c~wv-cI)TMH7&ni_D^u>kZKvjbyFLX*M!Qnv4ugH`l{$ z?zWz$srvO&^}e6#riiE;sos@q8=uWL^o8C6wNzKoqbzmPP_q6v5s+$g(9c6Z0P7~JbP-~TMw-s%m0kY_)ihL(o?ce_46)CNI49=_S5~cjpW@aYVHxs!iL)DH;#$_2(dg zZ&Ck=R}xy-!McnmMRpcWyaq-y_;T)gPil>~>iR|D=~#=uug|?}Z1_HX0(e3DItggm z7{qaN8Z-~H!{kPghrbAqz6DYVDM}YpnyYF;`4`J0)cwA_!bKoe+CIS)s2{)!_$PF2g5by&g8(6rsqd=7OM-U+fdryv|}8D)@(c1P)5m=jta^!4f7@$W&&fNNo5Q z{U?v+tr6POLE^8R()=jSN*h%(`)p=>vHJUbxhP&!3~iG8Z{ybSygG4?{7#Ts@x)f6 z<$@UOY5tghu*%ji%lNRXC;GXpjOw^$69(A+|uj;Mj$@6WP#hfCDF9}~_sYt})lL2})D z>|6cOzjR9uR9|(Thx@6kxwL1@QkU_!rFxb`QADADch8p(qH}S`BcH(64yMAV2Wl^5 zpUI)OIh%~}TNE4Fj$$KQ6dSHLvg{nIcC#nS;7@;IAcjgyIPKx6^eUb^{OJiU)tVoH zeTF}M2lB5TmwVw)zt9&Be}a_^){s!^mhxWs)AN)*V*Yf$RDFeM3jQ=og>>!kC$GNf z#GhXHVh4YEZHVDdRaB5TiXV}!XM}`7K~g2R!*5}5E|ZF-nbh2mU{X`1#O%E=snJrR zAxqF9K54Hejq%VjO%HItLsh8Wr)HQGT%`+>T2RF~w$W@V@Y>fe3dT>kW7@%#@S62r zWwaZG9 zrv_@LWGN4~LE&7Iz{jwoo0e#HG{lp7J`jBtz0VtSf6wbumAIGA(34aX{g_roU#x~( z!Q14d#)iH0NOL3!mt~FEla_YjMw<1&jRd}YFWg8oDB(tJ9o$H}I;xVtrRb$V&Yn^S zI8UD{-Naubh1VmA+j--7f{63pvCd*RRu;qIocF|uMV$A#6m*?IlQ`JD=O za!!%LrR0#nYme?=^~dKXHlYj_-D=%c!ZP->=U0a>0uN3EKn!>Ot{U@ZGeh&7xPG~;?%zD;({PwiE-QFWqz=K! zvh66!+{>D@=<_O}Xo#{zVeJ*JW4~wB=R;Q18K@<_Y+%coY_I*ePQU86pEeQQ(OE^L z!X5Tps<`KGm}IOADbY1nPA&@j=8X(pIA&+~{COiU9>d>rBs#Z(N`m$aasYzJIU)uM z(s_}4z&eC-!MYwGoS4E5e?;P?6cP#Q$mm>=>22wW{z7sjP@VqFhtGGMIAbtey{XBi zx#>zW!L%x~r?#S}P!mLamLuHXU8ZTUj=VP#KEbtz3iy{I;NPQjC>SBXzO0T$JwjUL z;GeXlj~lSHP#X;F*#&`U%R3pezR3C1jPThQ%-J8RohsxmJV-q%2J@UX;p5#$J=Fc? zk?`0$z#W+)3!SqgJHRPQ0v&Y^1nqmuL~uYjm@GdN@rg$k_s2~q1#H#wq$2H4BP$(- zDuB0ki70NMkZP{FPir2myOP?=>^>9AKW|Nw3^pTcjOsS~UwgH7k-w&wwIX~8CL(;@ z-50dgd-cKY3gGCWhUJV=v^w_h7IVd7&^RdT2QoEjfmOdimd4R2IlcCSqMz~Fzme@d z;tLDn%d#N$|Jp2wzlc6h7KGPX5F?xgakgx`rfCl*s>L5duL`{iSQWx*^gg^){TR7K z)`R30hGmMlfrz+O1#u;d&W50WQ_}hC4`AaIG1OZxh|nVS1jXRhiw<1~v#NYct?2J$ z5%`4JjjGXVhZSEIMsI2;FeYoUmB;<_b1T<9@$zm|#Y&^l8nI(v46 z7&f!Z)oHRtaUR%H%(G&i;lqeMno=rXN^l!_&tE&GjZIydS~`bEInA82ZJzW{|7D(} z7s93OzUQkWWD3jxqkzwzwBQi*X9NNu2lwM_;Sp`h89|oJtOMxd-v$5UCsbUc<64k? zH-9{@7gx?n_^$do98o`x*;9~Uyh%sM?J2FMOVZYcJ4GW?#C5@GzJ`I6N{FCf(r2iI*UL6=+W9w z{v^AOYO&|~yZE;qArwEk*x~HpX7?>Q649Ayp{RkVms&LRp)DHN$1 zgA)5vE{JXuUr+lbHXf=F&16E-3DTnzy?6zC$kkxoE!$LY)daqf#QAs&4^HZgIYzVh zEzBed*^Wl<=#>?z(tQ@y;LKzEwKtZsZY^~K$_;&dh7)%`KIo-+G1FxK1mes*w5)RRuA7=DZlLww}1VOn5yBd_>nLVk|P#VxEX~ z#;E>Q^F$<3?qoNmrSDX6Y8(DO9QIVNOY^;!#HfHLQkw5!M&*3aSg)I4CyQu?izk8pi*m_VNPC6a;ftBT-0<_F;U4nuxLeaLc>isu!$y4PT1J zPZmgvnsgJmE_)Rj@;I+O!C4{0c_iaGvVnN3TCI4#d}2=+oP0nM;mT6lsQ$=qJJBMz zrFB^-wb5;>zhHZ-oL)9D0ywL!dhtsJ?2)em@tm2p^X@Rqtqe_^3TZ#NYKFeR z3>|Hp+1&{_DMuQX1agoay;;Hdpl)VX*qVzC!_oNaq*2u!;VYe*Hhy@+nn=Xzk4XXx zf_gkf3rOV{^PsNslo7R9PW)K4Hx}?${(tO!3w#vS_5W^?B@YO@L4!dBBdi(?N+4Jh z5_Biog<06xAR_oi(G&|z;dVNk1H}Ipdms*2HbF9Dg?% z^Gci)AmfHL7=tq)bQKI)_&3O@4`5*=LBxVZP%NvUMupt)GfE8BMAkm3q#wQN-+s+n z?hoC8M`&;s+ZKnInQE^PW`lY~PtXOgfavYU<=yLs6+PudZ2z8Q=)yv-l;i^9b%ceB zS}b5UZ`fj-$iaL-@j524cpV&CVKov6L$;xZK&|UrC58!Y4(tdoz{*fqk|K=6aHlB4 zoqi2;OJ4|*ux(Yk6schft`Uk!O^D<9+#2i;CA90yJAoWdK1H9AAm4uvkjklRz(bt< z9uZ4W5O}nlB##WmpF#1R%)3wq(EwTaFD3*(dn70-_kj zongUe1JmR~jIGlt*z2DnZ@8No7*;gEPsF?74PRHwv&e9PX`(0g-2*w?%GA&Lntv()M-{53mT0 zhNBhhY3Dk4B353>J1T<5cL2Vm%Gbjp=YgAP2x?%jEh9tTtN$J6Bs@u#O{@_eXdL`$ zQ~2BxhB_*oe?igs0@FAYJ%y){e4L(;Uy^$NOZA>~V`bl@Q+MksU?w@3Xc5(h2Kf91 z$2}AwCS5sv7(Blb+j~^su(>DU^>>FC=W-yiDI_GqwPFKrL7TMGF$}Z*l{`<-nXur%vME>L4#<|xi;8m= zFD)#m<@0I0_`0#4h=MepXKWHt#Y{}Z2e0I9(n3@~yTzcfJh=>FXaQA(jhXTYmY9|! zU&yL1&*r6Tawq`6booULr%l?!gm_!wvT4G(Es9|oGL}X@1gQ!;UtuqNkhK&$L6EP8 z?BeCOFz0CZkHV@IdDne6`3kVN>+yDr$%Kl~3_CdqMx2R(50gj2;jSY))%7 zoa3{kNl8+wCsX`g3iK-gjK(*|2E;~3l@Hi}{^jIafe8zskYhtO+5wMPdtud;Bx>77 zI_`&qPc8&n#h=LU;Byu)!Cmns7~!B%r;&TX7PinQ_oJSY`#>TRHgRSSi5~D#;m@^V z#wsFF@0{J3fg%{6wc@XXtJY)J= z0Fse78i-o}_d)4%%mZoDUDwQ6s6IV#uxaIb)$SPZ0YiwWauR1dyOT4d@oQ! z@+03|`7+q_ROB-;57DVF5+%MLSVu=aTs$Q zEcNADbL}L^@eo^a0G@D>Uv>*xc=qbP-tciKoFMdvsDWTBYUH_W zl2Ba^SJ!0BD?_M2yq_Wz6&vh0xggc*!Fxq?YdJJ&G#2r2JC)WTHzT+XpLD~YQobDn(|_7P=sMWEI`FHHzM zB{|kYF2~-dC6P!4y;Q_rvX4f*ITUXd`c^gWCMVJ(+J)Ix$KpJVeUN++EUTF9^a`^> zDR0wS3`tE9G|7&D@XHhkPhKW9$|JxVq@D0WOp)IMNfQ?>!o(x#tfMey1~K!lVcU!; z!IDCrMZ(7F1BmE^eX8;-Oj8?ntrB;o$js9FWazjX0t$li-h}UXOnC@Rt2nf9Mc?Tk z+KY}+&O>LQi$(Xt>X?RvJd`S$aoF1Uc_KgKYG^%Mq+%^eBV>e@lkn7<*z8!Em83yv zbISU92Fv1S+?16he})^ZVKFFy3Qa}Cbk*i^5Pl`Be4|o6u!@%htN6XY3a*|;jEpBz ztGu)V-+`<7v*6!uSWW-PtN}d8bR~LX1I>mv*=%DD2?A)Z(UlHB%eR5{I~L_>?oW}g zL(;<&6a*b0u*~Rh+;!AA$9w9|AMU1GZ@F=ud@feS9+3yqZ^vPcc@Aucf#X}XpZFSL zb=70dcIUxlWzDwQxCec;P*}R1Y)9E%;&+SaXF4GZFVDE0Xg&BXz)rH=aX=00M9u{~ ziF=qVS89Z_PIIHxY&gwbjHI+^k$gU`Dua+Skp>!J83CG@ z0(R{0f+H!M1BkJM4C^x#o?JLNMYxim0gcw{N(WQP_LAcspGO@iE<$`Vr#dCbq${~g7M zLx?!&vA=f;{Y@^$ymG@Q1zyX%WI#oq^uvMn_B7OXz$PUb+$j|tB@>&}H`mbQlc$qm z2>qWaUjj+QeGUL+CaD^e?G7w4E6Z{UGPtmV%p-p#_-5Q^NMgp3bhHQUqb1uFz(;+~ z>&63gU-cd#d62mA=NnJXbc^}?4Xu#T{eZPwrl-@yh2vx^=B|94gfR>~bTOil2wMY- z<$rDXy^UI)Dr|CCVnWthzX8U-u;El@PBk0{P*+m5>W@J_g=<=;WBmP zE}<><-}`wMYwJ@&~>3`P@W?VN3CrDYAvsL%4hEWAYj5V^wh(m1Gdi~7kA-b{=En*f2Z#V!B>2zdJX={<2dW(PEnDqQuLR4oiSN9$bq<_l5 z*+H1rDM0aQiw3DA_ROP#01CQ#6}sEal)A#tZ9s$vy$`Oz993+6F>J zvLK2DXYkU1E_4Q~n1PDV?SOe9jSskWr7dMc=9;~PUDYx0##Z1ZY+`|9$1YiexeX4Y z04=wj7qONaAz(s>ItKC1ds27_Z!kgN4Tw11tZI|17KPDXSS)cYJMY9soA- zS)@j*=Tp`jvcZsY%j_@+siAq$ANe9&%)YRBG|PiS`E8Q4!5N|Vs-1Dh_1XDtaJfj8 z=YXcbh6+nLomUeioD)f4uu)^IaeyW*@1)4p5Dc)Ghx?6E5jhvj^N{2C3XyI}a=Mcq z;|^ycIZH87!%FD>L50oNd1fWEY&w%30Y>dt5JJ+jT|Dfjo)+4X!Vx2YtyVJO;3u2( z536`1LJm&M4)s$d%Pyc}8ug`R)FCSxNNy;5Efkvu5jp2#5*#lqyuZ{U%`iZowNnTH z(;Hf@=$O5aO={;>X-(B%3OY;mA^X`RlT4>xy?iHFa!XOseaVbGxtkdqw@OLSS_NZ@ z-jJxzfW!Ml$TnnKSC`qO6q~q6c?e7RM23)aDF|pNG4jJBnp80E<`GexE`0>$2GbmI z-%_kali3qNyT%1OKQhGeC9VR^~|1pV+8f0Pxsq4-9=@M;v7*0~cANrML8 zL^F>^e>*)5sbjC}I3o*|U8il3bxPQ5oH=I%MN)1kzmJ+9vX19p#6z{f1OuV1Yx7-x znh}cA@F{p1j}c#jq3|D&R#7-2`tpv&aNBh1MnBz0!|N^HWw1>yeUoCR9`?3!y$;ep zwZn5kMy-FEs~xVW(4SWg#_0{d7VW(sZfu>83XByTeWVnBWXCboPYdgIw9Ple3~ z`XD=?5>L2#XfPT%fps--F-NU3a(!DtTv1;#)fco3a-hYk zF{C_@P3puA^ae1_gfBbC`+K5xqo`wr-hSY0q}@~45U6Wy0cRu8T1yiiMmYN@@H`{X zo$jA^bay9p(ppJ~d|OGVM2Eue60Sm%D5}jB@&HDgXF{IYEbF06gG$lxK`=PeCV^uA zT^;SW`-zCcu1>qcgD8Yd9N6{}wV>^LSnud0nOrFfF z*IBeGjCD3e1RP4lCmYn(lX<8bpQC&@;MsNPv|abE#`L6CId&KVUk<4NIkaMv$1Gda zgaUfQWOkM$dNN<43IKt*M1B^b$kI04a`lEqT2?Y%eK^DN*$p<0F^Nw|hE4tf` zwZjPft;6f6^K7+_RQVOuflgs7v{KLKN|JNsi7Flv-USP&(Q8vUY^v8>A$dzCMTi3td@_EO#D7dXgG#&MNwp6*Z+7 z76{p3$Odas1AQ$lLJ>$lvtiY?42h4ej&_|r4QIWi;55bW+?#Q)wd*LRQWG!D0@}|{ zaV$zgup81GfDSO#K1yZ;H~1t@{d6> zZ4F&=*4EMG{Ix`T-Dj_@qRSa;AD~OWwGO)I)-J~dPA6+paD@~ne~U$aaf!jLr?VHx zPK>-SXyIR+mEy{RrV(~N#VQl#tkk{gVWn(L*@1ZsKb0d3r8Ie{l}t9UU!Dc?z#~#$ z`9Y|~5iyi_BebIZ*x_N4LDD@UpGBwiIQc9a`B-2P2}+6lFrGjz^PZF9?GM_scn{2L z(smG~{3gfVtN8a@710g#X5NfvSXYpm)|dc3$DXTlTdnW6+VUY7`*lt5#4jts6DdTh z#N2um-yFZs1JFWsQRw(Qn2r@22}qnX-$v31`7w5B&@1Ft0&h*X4 zl7Tu;~+ODonu$%;1aRJzrH=ZowJ0#`?YxSt<&-Ec+nG8k)KN z7Z@CC+L6!*$&k@&fc4Fm901t@%Y{Y8H5=ChxPnty+8GE$%ilx`qSBT9&E}*cQ+C4R zew+LPLeMe*-}cUk z=&uT|m3H9>_6$$vfcpRdsa1L(@mP^W?XRPD;)Vxs8(2F~l*W#kZ3y-RJ|n#i@D=*N zHzF8(*?#b4dcoIE1s?{@oe=3{Jmt&u9r+npq5&D9pWN_c1u9|RQ|A~h0Mkf=cRKDc z@^C+Z2L-S`^;Z;j(vx{U>o8ht^^EJN%1v6A6^-=sd5bf5k& zSvmfW$+b2~ci+cE8MfOBbsO=>ejX<^_$eL#{swFQHeSqp1<%mjoOSXiFusH~a}%Q> zu8)9vI18AyS?k)w?ua&TaGBJXC_OqLo#RcDh(hK$io48a7fvQIV`GbQ*6KLS2i2;b zC0{u4xaZA*=)0IDx4 zg~N)_i5B-An8FbJ?kgZI{d3AY0Cd7MEh~^UxFyp)3XqF*6JIz6@{`k)f}@!E!UFq$ z#dMKX#@-h*D{&)l9D_Ozqc+Nv-=;e(3o4VIEp*|O-A=Ku!!Spk!T5XRaV-fP*Q>$v zz2o{7@B-t?c0s`2_urr)^<=JLYR2Uo!1e%42VH1PD+;?arnSB?r3vI6)29i0U^NF3 z?iLsUv66Z5Y%7)*Ve+cHYN%Zg1D0vkP?LVedfwCGzQXEBCjBb8F1a?5_pH;u za|N<7PnUtwVX_Ped5(vs>O;c0sKvh0RCzpG=!4%>`yZ*2)aFu;#*J#WnnoR}OQtwX zw1=)ZTSzKSwI}1H{M%Yb0XR&fY5&gw}rGW`v^+H@%AX{ggz9=S>QZ{?Ap z_PpvQdlr2)t>DK{8SvPhn!f`X=tT2&*=_JZ_5E1r)0}t{dVmH4eQa<W* zONa3Yj29jC3_r0Ke7G_frmaOdMSN~HH`PX(X#OEm2E_b8+<++`IwRbAws7wb#hAc2 zSYa+Kv}ahV+c^E|7EZqc*55{~M_E0Iq{j8tuhv#@qQ>fINI;UFRUmsX%G;YN9PPjd z{HEGhQQsO~%Scr4N89Ex?oko>ppC zN`*ztqaL7Bz?FSUn}iW4YwyPzWu#6BL+A`egYt&jXS_l6y6$FJKvi+Rs$AI&TXqOA zvy4KE2{8<0W5^=wD<&$UVsH^$gHLSGBfL!p6;bym(0YX_b+}j016On^vgv1#=-A<^ z$fC^7kt(<3gRDC`Xi-6Bp6y1NW#P*N+tpIZw2;9UCJ0cSt^sdu;2mQ$_Je*V3&Por zGC32O+__xRG1 z&K{6n>`O;F|9s)7uHiYk8)Zg>FGI4q{+%}Ym9a$Xf;F&FP`A}_s|V`R-+5R9#F6Rq z$3j|zZN_@|fDLye_{P17W%^fOA#UUkZ?hIPE;!ek*v4k0JPo!YW-5~ZGLksHvStZm zRYXBNvJ9iIp5PZ?2FgxoweK>)v_QUWG&Y#gc24==IDE!A_!g# zN#ZH9_lDOy^wj}M$3Xd2C>q|ey#~1J${_{AIruAA(6D+khy09m-^)j!e}JX@RaBzs zm%ecg6it)ZDghHsGvpjJq&wsKhYsVq6m1c8x8pZ>Twk^Yjq78V`Nvg6y327jphlmN zdKPZvYXYhm$I>T%T+?s9_gP&_7?lR1sW>*1$5h855JF{z9amRMQvog}TR( zwo}}KLGmb!H5hTKZ0$n{vX$%ZrlO+mVY+m&b|mSpSL>y3j8)V0jf;_1zj2HA8^`?L z7(hiu-8ppW@*DpICQ?7B-d#uw=g9YB-m`W;s$=cOwjkXqJW^d){iZD+M^<6-WI$at zN?jD@ht+kn(mtwdUgvfBmL2jD4QA|Es)ykDV|fn;pY(%}X1xj*6s94=VUU4&eI#kW zchTfRUv!SG9-IXu>T;+-qV9;yl&f!Y8H&pLa3xo%2n!d!UMUGi$C;U#wdW1g#o9AL zeim~opeesZwZ5kO2s1ILDNekHrYumJ@)NZww?@^JP5C?AL%GWKv2gI#@;HGOUKPZ^ zATdsXUwI}g>@D6Th5%U|P66{)#yp!C zGgR-ee~6Z^rF91Rt8yPu`(k{ryaar=!F`)eI_S3XIAVhLtgkG-jP-SW@mS$XOf9ze-t%T;DF;DKKMQiyQPY>1m90`7<^~iq;K8jJWk!> zakMS!SO7FY3TOflD_muZJej@AKwQqErvt@WWgUzz48-MD@hSxGN|8lWTIL+R0AKF| zO~?Lce8`SG70l(NM@}Q1VY-iJGa$bW1VGUVDC(LHAk*R;HmhYTFkS&ePfvjw<~_2g z!h6TR#)-uStZ^Q3>#0-C7ooY%Wmpk}b#}PI$c_j8MNOu z8kRU*Rs4X@7sUX`;%LqRamSwf8AJ*iK*afE(T6$3!~xqRV)P z`b@=@ekapAtl#IO-;Z3)`n}|Wz<%2wbuCo-JOlZzyQ1zh`Lv|Ecs3c7bPm3=X;T^5 z*VwZJ2$~Ae{CU%1@>B9i)%5a=1kh2hmg�a1@t-KC2H*#QXAi?^*_d*+gy!yy9xe zwh$L>6>yr%MjUD`e=wPPt1Rkc)-bD4r~Xe-*1sUy`q6sGYpHxu`q@}MhWkPy78nBL zBLDM!ShB_QD?*;D_JSbY|IfpymmTZ_L3(|FE*zY{zkp#JtuZr>-htzXQMObW4F5lfB7%2UDFhco&{f@Drie$fXGOnI>T7 ztzkZ;tcAl-ZTbO-jnid~S>*R9@0nn9rPpZnEBtpN*c-@}!2BqkIy+X9eRhO^^vwb3 z>jTnr0@9QGY505=wJwD1Njb;d8FC*H=7kzq1=#mpPhP>M0@*-<#`OL3!;dN1LFiwR z`(OG5avV4U$;&Swt;*r!5DgdPE>*r6LE7<{Wc}q-G^_xw)^%4vT~qvZ)p_f>80W>Q zbzRw6T`WW;TWQ4ddOwtuld*7zy({U-baOVlk!ojSYMQ=rDbngUZufpe>xcP3Dk|#Eqf6v(xE?>qdhI$7Rp6@-1%^+?hatO~jWf%n z?Phq|VZC7|d2-RTDIkk1Omkd@luwDKVkv~&F=Qe8v6bsfes6RS(=x-RAelLOxua(p5GmjK_F@nBCO zaO{@P%#C<2yw8l~ZH!EKpBdf7k)LIz<5}1KG*afj-|Akux4Tu2(SCo7mp~t!?xaI) z%|Y~L#^A8@hUikLEaQvcC~5P*#I8;3!(#hSDxj6vq|C41gy<)2u)_C0e-s>a%E+l@ zi!FZwT(myo^KUR%-*4mJ-)Jk^sGOS1=YCSJ0k-jt-zMU~JYM>i*N<-}XOTpt%Gc~kZHw%$23HlU#(5n_zEPW^L+j{|6$+0~6lyL9)iBfn{IeZ!GUA%G*!lMSpBB z$3*yl?k}*mlpY|TA*-_#8}UnJ#b*oKRKbR(l{qJ7l{rggt8+3U-cB^g2fbQ=B1(1ovy1jL#=kA0i+3Goo>(MI#$2&vC&& z=q40aDtLVt1~*C9_J&VJ$$T5>uK6jMM@ZQ-FaxL(E@~GKb#DakynF%!a-w4c!NlM= zsDI`_c)Md{1J^Il4C<5Xnlpm#sXhuN2u`0)yCTS8 z-agn|tCb&wGTow~6;SyyAay;ZSSQMI8~yu%uxB$V1+fa9RxO-fa(Kr+t=&z$Y%o`w zA@i(`p;X5{AVxiB1aglYn|= zV-8p|n6d%?@XDzwPl5y}R!zf&SPp{xWt(d`BcA3UomYV$*e5t1nKta7<;AM$R1~`~ z#8ewXMcTycv&>@EOl11{=xabgqD&eT)D}a`+5!qBR_#fL*J#ye`1LmJdNgg4w`u6% zT-MPi>G;7;8>+VX)Pmg!k0XY!fW~r6EXI;R6oc{Xq)ojurb@d{MOdD2o8t5Il%R1Z zJdT~r2`^#mKFy8K)7a9yur@ssbl-p+#SDaZ8?`X%k#ucM@7zKdv97zkb(LJ?t?O97 z9@aJ3Th}T$H7V_SwWoD$AE5T}scdguclNZd8gE@2eDE67)4B@1buGX#^hzH$_w52+ zianKA4XU_i2U=8*K)LTAkt#M-tmY_2*wA-w?r4RDzR>x1UV_m-+V8y3gSI`|lkbFm zhc;qjpIkOa;vYmwa!F3KiU#gg2>r-6W4r0cs=q`TDajPTf;v=o(Bs91Pb>!YVKAtli=v%JusWl z7Q0r(gfgX7F{4W7~#5@4;PAEcGc7S5O+=w!GwDj)d^zZ`)#=n^hmgNa~42+jBFdD;vk?|G` z8uK{12) z*ia@Nrb7j-fYKetGIQ-6#vilLC4{jB^rDG#e2$os^aOjI57~7%mypLg1r|M6m`fG| zlU|;S_N_$wD0H(_Q$S5ep_%leKou=Ai+5JyGk4bF{|R&LoxeqV&6;QM2F21WCr*xt zr_a?RL!JYpAwL5yZHI&j+@Th&FpS*9Qo+b|j*TAok7#z8_@WkjPR+-Qaqv<%F|<5ju12g>HmQQpySA&9z3XOF5sX+8v%_*o=xh2G0CV@^%Q!2wh3wW^wo^ zTI|j1sH#W3HQ3*IlNNu_n=3u;RiVSztM{Ga#>2mh1#XNpD!4)Mf~niz3vK`6*-{J4bh;{pXg%BXjPfFFJEr3=ZUR7DUT_r`Hv47u%C2!_0p z5eY*c_Euqkn_&p*x#Rxh?l*cBB|22@#gQor{aE=8qaWq{iCpMr{l<$UCT1zES&54! z|4T3Z*xM!jfUB=O6ozu5AJ7AXaO68WkeBGkY@#2tgXza?q90!{`ax^IKKkKs=AjK( zB|)HEhjTQgS;%)rRbaJNX$c5PJvEsT5`17TeE`&CHc^u~L`~*^n#=(;nG--w?(k8Q zmx!9!#FuEI+eBw8&Hh%b$CSukxG?xQUieXC*)12t%iUC%Iwh61$Z zW)_J$5^b4%(rJqqkvhen+$Up!Kc8aFmhgvSI|S00?-751HbimefZ{}lLreVp3G}A} z4n?9r9wCVSToyuqhWqHx-u4hI8Uec!I8+!c3PXQppM3fgibrAPn1B7si$^CS$NU;A zpFb2iW-_?~^qL&==AjTSl?n^k4^)n6SrH4|xc{6VmK;+>(^|ogUXf#-{BH<`e323f zL&DIJ??I07`I$g_{0L%+z>!BnF`4kLAVF)UvRwx9fTB~&>mcbsoJ(v@WSa6-0a`Sv zFgfl_dTlz>!bw9?l_IZ}tn3nlqHKnr7^sS(D6`EcUXs@7Rf+Wrf3W$?5eHE&)OKG* z?H)tzW&!$@cEfG#fK^-~%NH{T>BWf^Vm>LRS9Y`2Oua)aORskSFq~Cnnu!s2+GW&~8E{J8YifvlM*J zT|Ja4`dh|JE(Ee$kipR?jcVX9Q2odhauYUpI!6!S3t40BseILOYUKj#8+nxy3zHCQ z9JsMXUUJ|V#*giT8Vo_6+9W^mHS%zp7}6%h3lZO-S1{a_$T!ugTTQX)4IDeli24dz zgxWsftCG!o`*c;LK22wRdJNrz*HoANdiJZ1{c51ThUwSy$d6gS*#08N8UY}qEqHbW zU$nx@kt6TUEUW&VR7C$~zN-8T=7ZsApRoYg&LOHbFqI)`;FO~Wig|*W!{qIm$33GO zT}~ z0;@r`H<;H(c@X3#>>m9T(Fx%IYcv%Q*5MYTYt{O)GUd|7| zOa1DJV|<7?P(e&65}jb?CzzPgK=XC1Z}vJgu|DVBW}DX)ZuT6WF4#_D4o|61bl7%P)JxVKu%On*&ENg9zQzzjp+2|9?yr14Q%`A{M8%(F~ z`6jyA@Fy5i{G+E|)f;5G8*|~rVfoMgF^A&_Z*fM_~FDHmS1S1qtOj8U-U9818Fd3b42h-lpb7qwJvmyL=RJq#?;-NWT#hcqdQ~*i!?|e0Nq}b{od$)B zNT*}ClS3_hj!V&8kbSO>=GRv9R(Pv}p|9gCW97R6_JM!9w)#FQOZ|+t396 z(A8;cV{GZ@br?RA7;_jNI~W}d2crqS3By3V=jt>xL_RxfXV1dIKFD5&kY6XL2cDn6 zz#mIJ@UG9I1OHRnK=309UN4yIx}^u6C@lXD(HP_)marTJlXf(e{2DaDkILUWEPJlI zh){rIuDe|J&*-3;ghuo-G`l~?dk)L7$9n;myQ8%B)WiF#mth%1OZBTG$`_!TF?kkt z?9K{WPnmIoD& zoRoY6y*K7$`SA~>zbZ$h){{;lTAI={Pw|13uEUz5zTLMu;w>vS9Bxy6Ewj;a&#<5j8(tz zGIP)zIAJ*c;eRoQqbEvZ(s^jYDFVkWJ;uiy;1dRXd^iLjqg*x#!AQ^c=rHo{(7SsV zlHH-pDo*wsmi^I z`ZC5Y3V9j32SVJB)Wt)3K*7s?{eE<_U@M$L{3FNr0%1N0a7;rdVhqQh?1>JJKZl3h zDFVly%Xm%yVQ`FQIh*h<#O){qBY(0fI!KO1BYGE-k?3-mx!rSEE`VqYoQy3jvp$Uu zmS1BLwYOmzNSCdh(B+fy>?F{dr=Up3nAUv0Il56j2TkbRQSFT}JqcrzurKCgbL&UZ zjmSnh>Z+uN}04gS|zonh(8z`%9QZ#ca{ zdjgJAFYXRIbe%X(VJBCJndUmhd`=I@Omna?x`E3<6Z`}B4f?ZE`;9&$A-3DZ!rRbe z3d>uuo*RawoCqx6+7cZs{{g>>QwWwl7Z=VzM*z!T0H?aU`+)E-#9R}Cne}U*LoO&%=)8Sz&B%Js-@Y zSe(RQMqyV+khTzlty(eZ0TJwyx1t-$g=m6*D1V@K_1AXB9FF?7=-@a4O*lp1*mF7h zr*Ihw!}K~^?xuf2*P!x!qVF?cG^$68PKM=tPX+xNu!`aD05nDFerz)8!p-8HqV9S@=qH zkSs$ZdKV*43SE8xvTn>_nX^7RSZdLT-iGC=N0+g!rs9PBP&Pn=j*gym41=ReC-i{i zcxcj&T;lRby!e<0e%9F~u~8yzg~LL+(?D}&cvY0nHJAYtO( z#OfKv^`!&ddh1&0Dm~P=Tfd?K-v~_C@Ad%I9j?-fnpWj0+7Kqs$vt13z0km~)f$#l zz+}W0d$ws_O68GDgv3z|>jHLlZrT)O*$PK{$C^_s9O0^_x}z$;QhTT|$$mz4tB`)E zF+u2Cbrfx{T$q41SK&|y&ocev1QOq0<&n7z4Bji6p=6*$V7k&ZIRKviv=?@h!@x5z zkIpG}B?yBZF0GL1IFc$DI7fTBkY2fO#-XOKa1tni6pi#X3<(R)rlyxh;a4kM%+YJZ z*lU9wdvQkgR~SmXS>f0>qk^m1CiKGznADk$H7T{?%y0z0qth|j={Go-OZi;ne0D~w zFWw<{EjL9yFC3>b4&~@TiH~fOtE}cT`v5t6;Q)YBgFcgWRn#^5EKR7?j{+z*Vy$6Cs05Q$tygz~K>oHXxzf^B&7y2NPYfm-RjpRLzczk&MR~T-6O)bXXIc{5V>cUi$ z{+(t=!#4L2=eVbf2YK&baQAnPdl&apl;>?Y4r4-H2DZ)Pyvamo$@9Va=~PXVT!}NHY{rx+*G=_Ju&Vvf0M0gP3=YY#iEkOn57Z(Z;H9HwI7VWC{Q6&f zBY532G}kORI>O?eY{gU`9i^h4F{MsAItfHMNh1sDIxqcLnQJ9|Xs#vGT)P5EFu3!q z&L1bxJmaMO_^6oX*ph&C9pW3`Vy+!rpcbBUp)xN9^-7);ySW`(>grUP1vcIlTl0`mc% zG4lbIb-9hMztDZrM|#H!N^nIx^~;|^YRym4IlM5xFN$%w4X$eC@yGh*%jogZpvUW6 zcPfwZf$8*kE`Z^GyU{gHdHj)nIY*BV1U+tY;V3>7$ESy}#BbRs%}>XtFQs8}B_kVW z1Ld(Epob`YlX0|uc_BzA@(Wo07ixa7e);)IzKP|NR7vH{`sJxgKF{)3tNAwl@~?5^ z2uvVw0rCq zN-Nk1>sN1da_<&3Ik~47q!cyje@^9!nieKH8uvIkVh{^>Nzbhzxk|I{yko`#)}64(%<~>X9uN=Z)~b0xyaj}iWm^7~-8vz}et7 z_)t$7maUE>9{XrKa~$F3=^RIHSkRX%+A!}tjNH8o2hsanZc{~(LVXw#dgTF|l*|=v znO{u!BCY52uQWp_;G|7O+c@bx2nJk{OWMbz0>UOp1`0MoJ^*I*{n~}q5RXk#_zOxL zw@H67?m?UJw4&x?A+w?|3-ZFaKlxBrev;&cW+pF;hrEC&;Y?mAfV@DRrO46C6rlmd zlI$7y)e2+qn;=}q70C-O50VS$sr^F7W^kja;6_X$(1YPf>)n^5u*ks!9s+c140f9YPGzKkR<%=wCvb z{;_V3c<-J6vv&{(TpHlI{a4476X|gS!-?xjn0(kLY5m<0--_pn87BgRfN|)~xdGCn%9#K=>?ypnN&_*^cXq&bnNMsA&@>{R zzi5`Y(Wbh62tCielS1Uk(XP`!+=i5JsimetU!4gi$T?)KzM2jcq?B;8a{sMTT&u5n z8!2g0j#WBNUM^Boqnz|S@Q(vNmS*wNNHs_3kHe`Jr}BqCacnS&lXDzP@-%wq9=zOA znupJ5TyCYJchMCH{2i)-hNXXZq4yCFrYpq+BELLjm=@vFw8)+55xkvm+nnDy+uB*ht3;(D%vP%=dkN zmxUC5#zzv$~QTGjet}m)a1Be?8U} ztVPG|X}t7-dxeEhsfrLQ(F|dnTG-k}x%E^E{=z zH>y4qPo5M{9Hh7uM+lPk8H+oEq4-~3Lm?*>zvs_LIgmoL zfN}E`Jj18&Qc}RUTaj{+B-b^@DSEKsb%t=e!Zw1?4^2*%bwDO}Ke--jQf{66yWf%V zT4;5=$xeK*r#s$c=S%2o9>EJze;hF_*$FauHytNBE>5vxO17EA{^r6NdH1ENv(Y_} z5Y@5wFk!FQpYT^+@PEfVbS!J4ko*UNE2rGkSl@B-lAZ%Ds6F}?f% zG@L*j)Q0Hg_du~>I5?#$00)PWUcNRDpI7vpib8{+=N+XcSVSh8D#VOaUOQKOwZ3ot z{12pi?*SM)Xz_mid_ANsg{NQi6jEL3=Lf;P6rOH-8mSob^tpdzh_^dzlYRQR^*$g? zKlxY0+I8}Th&=sQsOE(9^HH!^czHUEO4<6#oC%Dc3xm_5Z0|T*M5U`2k+kWx zcb*n>HI9pl{S%hZ6S2MPK)z$coe-LaNh}Q*=zv*$t<7YuE1dq>H7D;bEVIF@qw4_dW z{GS$kdHi#~jPrQ^GE#g^bNE1#QakAHFTv0g8@l>B$Yp1Ab^HS=kDrWBo?dh{&f{ak zbc#L`bN?81Xa9!Bsp93;Mf1jq<?Botgk2d*4GD; z1vI|C4u%%@Qwqb=cRd;_I$DiM7s%5?>1cu1Cjatjv$h%M|*uiR%pkMr`F`O3WksCUK7byoNTGCfE-;trNL#B0c>I3=kxqF0ULTJiJ15TL;F*wUEaKCT$Arf>f{23D#$bJY_T9m_7`iUB z8EPTJ#nc4>xENnwKe6?755})6-u^2HRSIvv=PsnWvdQnCk3x*Mzd94C81wdWSp0!- zU97KLfK1@+?TStQpSMKf?I*mxzG{}Aw})9@FPnsRF#Y{WaQV1RKCZV%(AyUSQ)5F% zjhLf>JUx_-K2WaG(I;Tz^6~T^G#!oe@|f`Q|3S!$4Gum7^{z7H7V_sejeYa~~{)}RapF9~jqm#e9 zsn>YI4_UD%U^<~5*s=?4YRc~I{Kq)RXX|{5^-K0-@oqL zzkV@PFW_Jd*4Oi({RQG+=sM6XUU{+}x{ePAE2!NbRF@1#?yZSBX*ZO zJ%1t!F`iDY5wYg!E8+43#Oq>xUAz*6tDpPLU$=mK#|9T|cXZC< zon{pmN0S#)+=ov8@XNGOC`K`4FE0Tb?t;fJft022`144E?@Dja8IMAY$7dBH6=S`9 z6WDgwJpQ-fsNnH0qIcl&lR(bG$B;c?9{&&^(g}~BO2#H;gMaFVIFFC7uXnk={w2^P zHgxsBSa|A8ciPUYbafq2__U&{I3K3mEN!q#l}bqY277Wn1(bKE+oT3wswzh)D}K9d zb(VYh#BIDd$z+q7BrdO}VVTZS(u{OU;gDNjOdBq6*HjH@R_NBIhjeAl;b9iKe^? zi`dudFqw{9B@^b*PInuh+sZo{68P;$IFaYAqN&qq`KmmsNstdu)jfWng$^63)8v^2(2e@t#%=%(8wnW+`|0Uzq!K zO$~bzoc#<5ZRSgMah2=9NY`<78&Q36;r)H<){WLS?9nA9Cp2=k3082`GHH^@{TE9v z2ew+GrNbsuEFuT0&^dGUQ3WNz&I^zCDLzhd+>6hr5Zd6qjYK1MbP#zIy2nHwlgH*v z;)wEDrG_$TCns6+YT8Iq*da{DbPJ$NIf8hth@2P0_gE^<>NRUpRXjD zol3OH=Cqbu>ULVCDzeY`=c#I6XQJ65j8siDO-4P}xGyOw&s^79T(}?| zvZg9uawK5-%{J@0Z?^HWi%s!%#^D*q&)%Cy%*14qeDhu9RaWPj92sSKsmUg7z&T)f zaA#2ju2Rlv@>od5;v9R}%txXj4+_Dq6hJQ#K$9!SEtkb;L1UHdbEC27QB9BJ<;`}csu+gnAVTt@HqA0 z;WNATX#EHyO6x~D9tM>hu<^age3vUoEj?O6inlY;id-C?ilHRj`eqzI{S-$@g|{u* zqFz5LtNB=6{4$Bz&ZkRirj=LOgU{h|Ww)#O4PW_^lgaKQSM^(3uN#oHO% z^}aYf|9^*Pbn7}a?St2+Xy$)^>r;OGjrT)YpNfwMbGkplbEZJ;Iq%Uni#(6CFp63w=E;MaPylxDy?HQOQllJYJe@EZ`-}OWqo23zSoTtg1#5p#2EMkUxFm}UeIk+K6iM+>T zpo^4Zsx4&q8q~x&j(UU?&a=)^v~%gJOcf{S8oGijwP|ipo6sQrJ4d_GrXk_lR3Wl9 zIW!5Ojau35M)AO?9BhosqC_4N+1M$>iy1bNORdHG$`=A_WDiJXDP86#ZF z8Ij5%FC398z}}5o&c=(1twUs6%e*xybbx+4ucwwPKviS9SCxW0mi!$y>f{r%|(q-=BTBqN^YAe~o%p91{z$h0v`teQ?mRkQ{EHrhmOD9ZXffE2^o zAIf*p%>wH4m=o(W0iZ|y{=UE8{qZ)7kIn=pM5ewy>VH??ceHxMsy*o%jac;=e*NgD zHV3FYmtnNHsME#;U}&$jvqQs9GMv8e@5jeUp`X#s=Pu_|uhNxMWz2p^FpFZI#m7z& zbpvFE?%}(b0VuB{87%D8G?{nohy1)t71DTVgFL>^F;8tNwsM6yPN9uw3GUq2kb*MLV6591xbr#&8iX3EMygyrC5(TG-Q)gJH?q)Iff4=+Kq zOkla;@_cRJC6Pos`HQc<^YD&mDXj?sNr$p;Mp5?RD9X-=qU;q>lx?J{Y-GiWF;>898A(eU~2@nX#*fDkb!X_rm9C&eZeSOJdu z<7k33G24>=nN8}epW0xmJHShYW$3;%G0P?m!o^^t-b_SqY%q;EZN_Y~c!$wsuD!!( zwjssSZ8_aegOYfM@do;tN%ylW^vi1I;=4A{S;;Qf8nbOQKs=0)uwFb@i(L5{f`jB- zgtW9%{y_fDQzkXr#OEl(Dt&0G+ak{e1qHK~oU9l5n`Hg5@367`w?^uwRk{(KnU4+b z|Ke`tZsBga_2vkp8iYpOy1_WP-cb=yG5Z4IbF+AHQT7xC;?MIz0RQTNP60k1?IwT& z)Bt!V&~^aC8vO9|W22vPO$C0ZQF5ln!9WLW_l`-k*=W|_XSSwupv&d|4TSd0FL38z zpwE>OtUs=G!1}=K$P!R%r>q&OjbpcwY^%fd+?Q?*cX`Y2fg*4zO?ih9P@) ze}?SyYrL>GFcSnJJI|0Ejol(|L?;OL7Ftm_!&KJ}y^4(kkbM9i0N)AGf$w-R7~hu? zzAq(w$EtxDKfw2;4BwX$zAq(wU+TwqUVKc!cQfJpwZ=Rf#tHcTHsQNXe4DV?CO-BA zE@F*_j3zZn_?3&l2^^bE{|3-$CcLf8gbz%0TjdJSS2i@Pi7U`Q!#p?w$`mvYo@hUb^I#lA3hzAF3taG~ z{~nMY>MPTY`7wF9cTB?0j~CH78k3mJ53mAEkl0O)YiWRdOybo~!%U5dpcO$=W8a~Z zIyH!16{4Bmae4q^f;WABKz?RG`gU&_aK)~8`HD*K@P(aH`_Wrv_`XM8zAzP0JAK2H zwl@qf|KsN&ldAN8L6fT2czNYF+J;Yc&ZLZ_WF{Z{(C&F@yCjkkoz}OPQ^Ij1LAZi< zE*Dr@Yfman5iYXiH#pinW>F*7kv)E;R;*Jj@^xf+=fw$FVJaEEZd5}gAu0Zyp25vi zMe8n(HT0XHf6NEpSmlpuDBzNWK7|?fgq2>q6VVsaIqZ7Ag`@byn*0W4mLmN_9biRY z;vI#M|Bu+Mq&5_IGXHdLvZivGK_kNWXYYq&bH^KCxtf~dPU5AhDJ19T$vK$65)!<$ z6B>#q^Ip8e*T7={H3*QJk`+ZoejQVqS`z+`nZ)2=AT{w~T60N&%?t|MBkg4Pk`l~y zDRo)|xjwUQTU`@3X1mar_cYdN>$X)l*#Cnh9u>G#hg+WCjStfkeKRs=A+TuLn zFgK==CwEr8WxFl6iK|O8@SdjH1Qa_M3DMD9GAz<#uPM)2vd893|GxsAruc@119<&A zO}spdD+nfiM-hjTMge8x|Un&*v)R(CzUd zELG}jLYrb)->A#GuCMEHQ`&Z6jNA4>H`>-UKKNlbZgedAYLn6s=0t0i9yP$w&s7#1 z?i4btP{2HmlwWcv$&_UOhG2$Ai|k3}IxYeGP#Dp0PD-HJ4sWD7ZEXT(dtCxo*J@@- zb6rDqoBcl_Gm~21@h^mOb|}E?EMD7v2} z!8!wLJMQ(X6L?1x)*O@^@;wRe7VqSSQx52?WIFSa;D^Xp>{qatp$WU}dRg~11Vv|Q zmSVcX+iEJX;!QQ>AS}Z3&x*{h(Lml6j0R)yPB{K4 z?Cy+z)=bJ_(nN1vnQf9Ra)!DINu1Qqt(yUDCZ*xitd6aBGCVnmXZPg#^YbMa^lvv3U4f>j~NL1tcG_FqWd27Aausj=S zO>y?ZG_czStNz)Bc`21gF5&9h>)Sm|dh{Y-Tn)e2LrQk%QHOlop}$ko%d zaBt<<^l`VKo<71mthRdmCJ3*&|5zq9x?f(y%AK=@AmBdJv9FJyr~1+y`w|45`;S&> zgRO|*>8e5jZp_E_pPI)s*zZ(2w~b1jN96~iV*>mz+tUSorEA8a#;^2`HMx^t)4CJ6 zy6tB2Y2>6?446btD4DL|VSDgN_MwAA?$85JJt<<^)jB0TA zCnUgVj@gE%qZ)~PL5%B$YiHo}IVtHl4##o$G{IrPXkfyI1xl9$6{o3U&0LLs^)*SH ze)W-xqV4+XwICN2=At%z^-D;-xf{OYpvV<9>zw0X0u64W6r;wCEbnblJ|t)&SMSi* zjKe#Y>Nb7NY$WJ9hOVHZH{l9uYhB}|$q=!#7pCf06H#uQmsa68dWn!Us?80u>>U4m zho>HT+Td2`vVm$$qfZrPxwe3M5n(=xt3@&y@`)~&g8+dXH^N-uBg?x`z)O~onw?gK zG*4AX^OcN%mayL|*za&gnkTBH`C6d@r1@4Nh$Zw>KtJU~ny=1pb59_GyOYTC`zl%9 zh&uWRO{}K3EV)g>YWE8;p1A)Cvg__hleyd-pvf8plB(B1D59 zAP!!)H53QU$oWCxprXe#%KePY%vFyQ|CW(1f-$MYm3QjCzEnqA2TT7uAiXOfy*VJ= z7?6G=ApJr>`gZ~8M+4F|0qMm7={erCliOCDx-c2x&>eE#Iw$vZ@gVhXD(>F(-CeN` z3y!SS{t3M{51pzg+Mr+lbI?jeSs$ZcJ|C&I2DTw+gWho?-A#v+8!L4i?wloQ6_8<< zPoyUYyidjlJQ+z(DpJ*VE)95c7NyG^6@oa{xM3c-}oXR|K9=mTLbbp2js6t zdTm8N^~-+^c=Ee|H|S_(?-yzU@*TeXdH1X>$ATu>Iqx2&lQW zq~2e()?`rLxJu2rbnTwAl$=Y|oO7Jz7wT6xR^&E;d!;TM=uWFYn*q9Yej4&~o3Mk- zK1{!QyR+n7=Y*#n?SmGiI*trlkVGSg1WaoB@l6i-ijZOS4`?r?Y|=lh;*AEYI4jF4 z&d(+R0gU4=NaJ6_(hKHu)at~NwWrl8PCQ_BPL_G;=HVpG*QWudRD(zuiYK2PZ5STua7fQ4_f(Zm;xGtBG5i{lKhVhLO@POHP-r<;e9+|Se2xpJ5c z@*=s+1ob?2?VSf-gdb9So3JALLu&7UA6R>DhXce93BIpkh4++cucHB{pLIbX?*7Ng zXfUWnH)%w7+PoI_*4_tlY}?%D2iWFoKKkLo`6(D-e`vU|Z|6yBv*ODI-_Dsn-#YF( zMYtdbT)5AP(`iwAvnT%$U(;qcG@J6YEhcutyX!pougO2#_#F->)>oS$P4b2F4fet0 zJcs=o+7?bd2wwH2bNv_APRT*b#RV@vBv+%l241({2L%mst%G!ncJsi5*`woqJobeM2i<rq*XtG|*+a_C96@`oS5J4gRcDV%~^%|+{%&f%r;*k6-Uuc?G=T~d?82{-VPgRsOV zm8MAL2-L8z-=QY0kgjI)g>zE`#2EM`m4QuO&UyDcPtkfo=PAv0CyKMOd8yQ3uESv` z4S=MD1$ZizX1nGehj%IZgw+h#h4Odgw*_E7J>cOykwYHX z+46tkDnVJ{O5lA~NUcO}MOoLGs60qyJ}qxld(v#xxsCkP6~AewzhLV4NDSxL|NCZmfUlE3Y$m!Se8?Bh zGT6_KM3dal^3K1K`;^Uj>FWb^8cFgxSUH%3RePeodK}0ck%g4P{`%@d+yE)bmCEK^ zGTi2zk3&sIaN=czy5ePK@mX>n!i9XU#91I`vy86CiJZ*>Ir{^VGtNuSu)WOdTVi44 zY;#9)R%b55_cnr}$wt_5XkKVx52;*Y1c6(D>h!B78f#z*CMzx|n7%s8n`oi=4w|-r ze(s{59QqlEzUXV-Vz|9g{ur=yJ;G+%Mp=SeB|GrGa!KJO_^Oa*l|GQ&+d%B*$``(+ ze119Jbi7H>(b`iTSE8=h@kOrivil}j#0%XPz{2$hVRLCd>)hogyM)gK1i6qy>NnGwC3U#9_B6+p3HAZ5Jp{b=1PuCR`f6HO zR4C&tP{yCBl<{rYcDOj{hfK?pHNWjEA^ zFoe)G3Uv@s9f#{_N$R5R)CtL6LrL~J*r?2@G9WuBoPnrkPsOhV2A}w4t|R{&*R@2o zNC>+L37lNS$d(mr^nSAClfp`k@I~XDXSQOK5{Y2fsUp}+ysC&`!)Zbied^~;yiQXL z1nCy~nM6N+5$t}#!8hLn;h9aTzd{Ic-_BLG2gqRJ7UW$WDprvUb_K~`qeupO0N-M7 zDMDClXz6f5*fn^kQy~l$W(y|#4iiS=H&+;n-%Euv@C%xB26c}lFqa;Sw)sB)_*=9ezAxZ46j`ZfbuINpOB=*!B9c85sl9+IBSJVcz zhDu@P2sJx-c$rT033)ZY0lkSJel2D!s(a#>9STzzs>1}dQ1Q!(vaYjHdDJuZhxbCK zG)B?tAb}OWN}_p3<&H1B$6y~3D2_>12))>I77Ekk8N+QX1oH|3= z90@CohU`}o39f%35r&3rqU;XZTxy$2Ln5nk65#^dzFNo`>;_Z8Jz0u8G7PGkdkB;^ z-a{)6Oyz?jXs*RtfpX))dtp_%U$VxWaLu7=+?zpa+|40$qMRIj!Z+!-C2K& zOkG@GpUwhJSNfZ(wGj<@p(71hLCR9$T?TtzL>dyH*1fuesdcVd^p^8gRVy2k8eS_a zK`EbBb~(KgtycCBks#8_o+J{~Q?2X@aAnfUN_<+Ggz9>zl^tU&Z=?K1Q-D_1@AYt6 zS-;mnoaV}Bt4iTIycw*Oy$IS7td%`UG)L9!RITjKs!~_o;dSy33a^z-Bl<-mX9TTG zRmM`h%2<+D8PmE{Wh~okrb=LDs<2ua(YFp-*@wvVX=NLH6fRIJy9h*^X=S96fwG4h ztETc&FdfP;72Ks#I3sCXJtA=e%wi{AZKyJKi>i$M<$XmN!`5w&3+C)@D`U3+J0gii zuBE658d;}ilpmhN6WbQ|TzLo_kpO9a;1k%u3G@+Q2)OxnZE`x6P-1W*PNX6o_ zwWFarVBKvMYEZN?roRvsp(Q8K4t@0>l!P#YD9Lpp32T6c1;Rpmp2^uvTkVt4v2*?iEg;}#v z5J3b5G!Ri}Mc9R4I0Bm}%eYF_wrXv)wf>9ND)kCrl_WqC?!ybTDjtnlNOtDUn>X+M-tT_D_j@+{jdR~ghMD{Jq}iG78MusbPZbF#vB^wcN;L_6fKr^D%;D!0Bc{Y&HcVby60o*Zgy;eH zozlj?$=_d(SAAB@NUSZJuO~AmE^n|EyB7))xvIipEinfy z>GW3DxCgxy$QZC#RK_@imN5`tAhz(XVnW(A zh`1%4Un8pDzyc0LHHY^?==?tb*Huyd?qRQ}2JcT2>@_j27l<}UWYhk^Fhq7!i!|gZ zXqCL?6?uIT2vC;S_dOp%UT>~$CwW~%MBIVo_3vH?B+FO?YkTFjQ@}3nLan^M3Ihlb z(zNE?N+JCx5N-R5)u?`<^|UsRXf14=cmjfgR6+}0pU@K8^WS?3&Gi%r!-&bClV4W8 zh#RD4D9Mu5Vmb9h1X}U)UMkb!ipkSYNourcWE&MK8}N6K5i_#)J%g)T*?v54NZMqG zgrJlzhkr(t{>k;K`hXPx6)eyy71UcS*KnJ#=jF509E|KoRoy6{1wd?n1PmAbI|Pa0kLS%?W1X6036JCiQ# z{v#;(PH91ty6`3FhgKIRZ@RY$MHik5)-|kR5=&-u4`Fg6Pob(c=*4n2~$oP$}5RA|4{Ma_U3$6iy09|pbNhU zrw>GQZ@d>m7yb#juIj?u-Chw5U0Ba_Ve&Z{DS0LAot26Ut6G)Sh~1?`!R~qZt9Q>Kfqfe;W8Ald5ZFb{3Tz}KguuR(1a<~b z=?Mda1mL4mJzs(%u`zWJ4_=iRRye6yl~)F<#3`*;iGL63jjFBL7T$V&$XWQ^+GSPqs zSH%z8kWP{zzm}{x$OTw&5DT#4AQfQ6K`5My=}2^^;%}Ur!(Y8S3B09=S(5vBw%yYc z4$K}@vIs1qT{v~TMOVHoQzviw`s7Jps4?^f4|m^o;7(954Oc-i+=?Y0u=}f<*FdME zdbOJzE_M9GPU>X~T5e(=-^lnsa?UerMp1^*$ z|CIVoyKjDJ#)9Z@GF$@c7Ne-s;h!r52jAvN`+7~7lePsFTRUm4iokxi|D?4rPcQyK znI|5p*G)*-c;D90{F1gE2So~&FQP-YX*Vna5DQxufEWq46kwEw#Vz}zB4%k+1U**# zHr*)=uM!dI(VxuuX^Kx41o27Ak`&A*4?TK1P34lO!<@?NQStPcN-uwGf#$AyEj&G$eCfn{3|Ld+?LxZ8J%Da#NzE*-q;Nx|8Ha}syS?Q*yFS<|_l;17 zJ|*3RCaQt{O@7e7hIQ#=^hfR4$%H`*yy-6w1?p{o4y_NYV#T4dXZVwi)_!u81?oSc z^|mX5WxSHPg&t_lrz>F_v{oCN64aaalJ+gY{Bkf9e_c6>Ft^#j0OxVLrdKgTQ?B1A%(a6QOy_%679g!sjd>Jl3(bnHG4; zd(P7c)_1{j>ByR63$Xt6eWwwu<6(SsWLURNH{S)f*m@63j9a7Rq9HeJSh{&@_1?*+ z;G3Vr0~Yx>Po|!ErhcmhUT`a1?a<{4^RU?liw~5_A#m}*%vIdm3g!8^xq)JwlnVci zx3=)*+X*Q8-~%w1+P)Id0!*%fkG*|h^2nW0g^3G__(_7vFffhwfl0-$qY9I^Vbz}` zm|P5|#_S+@!Qk-_w8L{1ly+Tp(9%)$l21A$qP{JPZ~^qUU6E$XMPY&|q@tG_6Tn9gNC2yhE z*?(uBMGlwpMMx~^9G4C6Ay@e#Sb!j!Sq@#Z!$3K7W3W{(*4`ParvC{G>KTTVmhu4Q z;T@OF{KT$nmj2|C#M>#F7wO}?X(?Z$$TmvmSeC6@0>^T8Gs>%9pK{8>?vvkpo8cg8 z>sa#UU@T@tM?`5XPeIoSvri@VMc9?8PR!Wb!hKPm7x``fiJ1?HCms4#TLuFv^Y2&L zs&M<||K3$$PioWSDS|>Ey|*x`;MyKD(=q&!7XCb6q_l z@rPey~bG;>BcctqF z`8t8F|AjwvP)T|299uV*agr91s&w*z6q9R3cpG>Jja&CmzU~?*t(mYh8R5VjK^SADek=Czm%U1 zwOy_}>!Ln8Z{Q@HGucPjpq_pva8K3FPr&OqM+Y&J1ZjVsq^>(e^S9Y~9*mi4{XAa> z`{C?7yHA68-UNHB_49lOxWUJ#JcFm72K0PrUR&n*vE^sy`Sh6Q zdMt&vo^QXn?Cd;usClNn4cHf4qaBd z(HPY3%}_OQ1;zWH@)cBXa(<(1mbDar@35BO?;I<2%xcZV--XuR_zN}s8`Oig%G7X5 zEP!jKhEpaiTr)LXj^gK2O6<_XIeEi;up<7n{039RAH_8(?s#LC<_)HbzbUKYJJ32) z#pmLJsp7XWRUG^K(6by{Uu-!njgi&yI8^bf;|4tbrSf>FZ3r}SdhFH62b9>QNvLw_ zwQ`?^Px^UtcyXh(ZFunyun;J3XYt|;!;9E9;>B+f3v(7P&OClmG_!5|VhJ2lXYu09 z!;9A@w+%05+RoyI`wY}Cev4%WV0)|e&Z7Be@#3_^3vu%V@7a0cmrz5e3-zXhlq&=I zS-fX=3S#`PzlhffImp^#YQ$0*_l7y|jZ*0F_G2@a&F3n9&o0L=%jPQf(WQ&GrrBLF z*5UN08)fsvdFM#G`5{yLw@a5SK&m224P-wyiL0n$7n7~$*^k{~J!n5x%vHXEqMUt{ z?(>yfQB@8_-7bAQ7B?(4(6Kw0U2n~?yJlKnpyr>YKTp%waMWhJZ4teB2+Yns3#ms^ zIlOc#?!C=^M!; zT2+|m-<{1E!MPZi<95D<|AaXz`>TbI4tj-TW1`xKfCgmR_%JuMu#{rmO4W8s90K zmOLZ~?OP<)DLF#dr=vg8>xFU{OCO}hk@K?HkNs>-_SEtDM;5<`t^Ek|usC0m_kfH~ zMB3SOv)D;{)Fy7JXjme8{bq5O^c2<#m8psaEN-lE#h_cZ zaTc){y*@#`Hu*Q1q%>(wEfP1I#op_)si!@ao~DZ3sH2^zpItrme7y;4G4)SFWYTaMsyTkCmtMNBsxUO@&LmQJ>)M zr2u9(pdt}eoFzzSUY9>#us!MeH$HFYJZx`=!Q7KY1#vZDylr+K)6jRzq-)IJHNejCyP(O_jUkEKFDXbPT$tr#`<-u!-(M z7T;sCI9al3YRrO~$aN@K#3=@|7^6V}3^j(KK)gw>cXwy)n#DKG;x_63(Bx`NNBZJB z#DdHkDFzrYU10diX1+yywFKa6vN<%qGCWZ5m16CR8ikx4QqmO6krStYn#C!(W^q0` zUM85uPkH4S(3{(T!OrIz_@B5!KCm$5(C42K@Ke`Zb}aQ0xLg0IkX+p$Ic>FD2;<0!@^a(bmmK^{-)5>9zE$4e@k?v zlMQoClAsOJ>3(8X(UMMmz$aTToxTD3MN>LmcU{}1(-i7cbfr@wnvAM+x^q-$d<`v~ zW8}(BQS=rZKVgHZfk9&l{YjiqYgrEY}Qul z4F(z7R@#X^`efAqfUWeKt3p$E^rX>37`oB0l@5()voz98h@v!dfG@UQ8r^bZbfwW| zSdwkEm3D$|qAZQ>Mw3yMMjz*g#@Eo&=!2rO(&*&MB9cQlz-c#;$C;C=%Wl7)%TA2n z_>R8_8ke_`x$BP4Sat_jA(HFh`1oamxQb15`31S_zKF5r(VuSiFUVbY9PYY0Je2N- z$HKLay#Zg{8g?<+dXD}0E!I!%$Kk7c5=A-tq(#F~Z#Ax^Qt%PiJ-D(TzjN6&)FZzM<~q^bgn#a3(4RZUetfRAul+dr z=Z@Q~Tl3$wWxzkzNBU1Lo~G9GvU5&e?tf7)-2wwoam#gu;Zt6g3&)KPSIjMUaHZ)J zWB}B-|++YW_WYJ$XmO-9qQvghx(Hsr+|q=y~H|wwpqlLM<@1C`cZAnuUovX zyv(BGDn2JHDHC+u{p8NF!0*P(=_1YIZt10Ki2u(g$D0|BH&c#B@x9q5S_UkU$m2!m z3r}0`BIg3t&qkiDgHjQ&QI#DRh8k!m43ziO8_99?x_c=+Y3@apTdg+x%!4{O&bm>H z-uL|6W(TG9Ffbtsw!>|9klbdq-ik6L;j7yrJze1Yz_af2v{lF<2Im<3N;{;bsJ0qz z)XJ@;v%Su)TP#i-55n+ZqT+ZJ#8KEzH!8)}%Pdxx-;LC6ah@9B!B&qW5oo~cd52E$ zjMAK-?S}@un20^EUNm^t=j}RI2;$(fr|YI^XB}P5u=ddQfIlO4l!D0OhwSxd#%7rr z8=ZGLg4a*zFqMGy6FzGvjxWjI$yI)UhqU0(7nH${8Dr}wj5#0kTR))$s`9eN`OwH* ze^%a`H4-=Mm@%xMOiTP=T53p~APiKNVd)-#XyuVXYajt^%a_{&i zxHol3UR9whEUSQj_cd0`&SckF?qph4VZ9~>ULowwZxj^tXqkT#G(aW#FdRo#8O>%Q3|&1E(R;$_Zbw(>5+54o>}HeA~;x zsV6cAH^puVmxF&xyrq>KT>NDV9NY-Q$`pH|RUG^XpwuD<{}g(R`hjLR_`gt1;ox&* z4o+}yB@4Ic?`R4UR2Hrv!n6FUE$WKJ4P+^uU9o6}TSxXNEFF8wc7L|s1|549P&phO z`zk0cvW|TRm~(hK_GtKYy*l=TAgX3`?4?w%b{J_EpX_+K&rP^$DRPwutg5dYd+8nhdu|@PN|MvMb?Nve?F^Y zhryCV>)4W?vqRRgcWqIb@llFTLfTRmpJa3{-D-3$Kv2<)g}ykYg-V)*G!?ox0z261JT8>kiiL0DygmxiR>3dC_63@=|0E-%;xQBThh#>BIj9W|J#KN_94r}^s>5VOfHJ#6k z+kBBt(qM2Le5T%do;>d0*rx9n|D%nuO^p=Aa}L}Gs)`Qa7Avt$Q<(dMVw*l&YW5Ec z^2Rou&mdGJ)+4}4S_(O$<{9HE4qzfQK~4!2kb!~@MZ6H zZ!{r$f9)_jOPY|s`@mgWcfs123auEl}|FC%bZ?X$xP1^nP`S^4=tGC9YbU> zDk7?wLW}Fw!)`-K<^i%~Hpiau3g;a@;oOLFqv(~*B$e-wrScIHZBtctEe9LJH)ZvS zfYLMX@fzSVb@tPJyGy4z=W-SdFcFaWcGDtyHG!xWjD&Di3 zNjB%~6OYpfihRPE8YST@H{#Pe+Y0wJ)K|=K7($y+ zsT+%l27U&|ME?icDTH=e`r^BMPR0^hYI_JPC$~UX=Lbsdk%Kj(Nb}QnK~oGvpOeQW zdm5SC{%X)!xqb3va5TOYz8qimY7=t2O*Zsjp>>C8Lyx1XPcXvXE*+(taBb+zUm#ZYNwKU-Z$k6q; z%6~_8!`Y83p?jaP&^=1YgUGuVdMTn-dKFrxYbE={oeQs(L-*EGqc78+7rdc+cS;*b z;@+Z!?$!0i&Gl;N9)Cf7KxoKyV2tje{;_)vh~2~1TX&lDTne7{_K)4;SG_B37(k-- zGsRf`5pf^J++vu;U$Y1hhe?7X`b%u~ROCP$|5`eFPG28FTYNjw70luSa#%}ln8jt8 zR-Eax7-WMsfB)Q1w;h zB(KeW>YZH|;|mqpZOY%d_*sjx z1vfa>4-sm+q`zR=RT)aKm`uj*1-ot6nZ(W1F&6Cy6G+YD?%$_A?sHkNAN7bVVDzS5 zpRJ=y>WUgGQg6!NvUnXP4i@eon1x#m3->q7e4P*Lt%O;)yQDfWGeI2f+g|$)KnoW$ z`JeY&95W?e{N9*{cPr*G3wP!ot^Zl_`k!f=?H*|&Y(YWXBm1BG(+gacX^&a-jV6VS z2HR{$y3eEFzcgHFhGKN+m5~Vc<1w~;u4=-*CSLDHulMnP-O*inn+uTKY9R?;~N(xWNq)+Ki!N%wDXu;@v;IdI6GCX(*c^COgW zZ^76+sgiDWmkuQ9R-~PkbYV%P_N^4Yyu13(?IG{_l5y6u4X4wq@@{o{xbp6&1dY7Q zhFaO24fkWe=H%UQxGzG3WL{G0SCfz7kt`}Og^5P}i* z(eM4mT*U7;IYyTbW84BwG0I~sjE}gF>UmW1L^cBMkpU^hxm3zTb^-I1=EAMp_CaDc z{rlO489+e?v^9fp{_odCj0{bWb7u_3Sq@Xb9mY8kI#Fcvv5pRf0yQ-Go2Wc*;#Y9S zo34+e7I1c@Gd@pqJxFssKy&@}b-wyrHP^3euK($~<_*-i;0*nX+?&hJu@1vN>TEgb zr%P|^>*QlLvF-Ak?5<8o@`+5HEIDXTy27qxWE;q--o%dW+O$p?7!5%4--~*e0~EXi zzvJMHq~A)of#`P`77yrm_Rl}E-@VH7PrJ(H8-XnJe1=kgW|DmW4AfaF{|j(@hair_ zae>%i?cmcaV&@_Z;F=KC4L_H`Itj(rE2t03|R;vmZ~g_Qd%L$=2?Cxm3&_ zuKtGmZMD18TD?1FNVUZ=&QMW}NcHYwtu>8Kgxo73lcO{Bp&R3La{5KoKsin)6M|W* zX4LYfjJtHIS}qbdUZ0VR^&zPkqphgsD$0QmL2P!8AW}8-z0e|FjX`X+juHzoh=M%I zkUBt~fnzj?vL**nXyB?kgDBGK3NQi}jUaySq&VIBPWYtYC@`R0=P1Mo80Qbk!h^;_ z1t$g8m!PMufb~h~n|MR3`W6xoW;0QHvhiT+#M1>2`lF|4-OFuoFk8 zHBUd@bBNOe_<#la7KrqgARbU8h>M8_c&q~v{g_Cdz7T0A(AV+kYZoG5X~hpedblbs zfXKgua0o%As2&qcR_=;0oy6m6SNWGA;~q|xErV<`#&NG9^xIOn%FWc5HkcJSHmb8Kla2yU}>!rw8rt_U{3qOgvsB{)?G8LAhJjlY>KO7DhUF5QKB z5S$M|is<+ax)_}fK?oNM_F+0(JTKO|J7cYKES?E_C8M+aDeOlyItsFp>v*g?0aS)_ zh<6L(y@^z#vRdGb^+azt@L4QOqcc*cLw|yg;uy_kLjk#}ev|8I-;n;u*AW z#D}tr#9BZpQ*c-^kg(a3F>L+k=1hALAh1fmGDh&!u8QGTH5l2YaaA>#VL-(IDnQ!4(PWc%Bz$jPIgs4gYTQ4gt8xFd*L%pd zk&evQeqJAbBkkCLmD^7~L|NiX_zUYxj`(?i`q|E*WyIU83G@?&59n9NP7MtVYj+>e zbFOe`U??nvlSl(xRRNA4m&RakO?}gjpeNvr^%?+OKWm;4&Ixb?btXqpNqxbv`MOZ9 zAaa?PYW+cchjj=A*}uVbA$9w=>>Zlily|5=_6}*OhfP5c^}tiasHaS(o-#%~E%=HC z!$}uKUr_?ochZ@hP5Fw3wX?6N^z(3NMu%>8IGUOLt%hdyA8Z571gK8y0$oN#K;$>- z@PwoB+WLG*!88QRT1y=~F{mKw!0JN8vZXt@?M{Jy)&8<&?5E+-$^Nf9Ae|JTQ(oD! z_JcOiNwAuAX33Uzql;s(OwUZZ$OYeR+2302?tpZWg-&_t;*s~x(uJ}X7c4KNY44v( zo$EE&wo%l%wn?X0=ZXUlZkcB8LpM8|&UHkw(V63R#=C8xnX@`qlyt5?!s<9i0*Sf zk$>M&>R0TQ?~@^{>G}J+ zAH_}@z4e09apuz7-=G?{6TQ9vcFXj(bMskxQ~3IG5ZWCR&(dl04F#WzzTG`s)es8T zr?7p5>`Tk)*gO^*R$38=kGxDPjTu+uj#hF~4S@%pGIhv2m&qaG`q>ag7I7CP{U?be z4T7$Z#iw%_gHF{}mPJ;H;|iY?1FJRQeU&9^Bw8*waC++`8gdi}j!B3RorU<~x#`4l z(sRCI!*`BNEOE?2c<}-08z!T;iWf+{v0O8HgwLvS>h~zs>=2Me2?Ga`py!|B zafd}Cdp6Qw!=({JZHqMWHM9L�wYH`7?k<2G=x)E1!S?g@G#{z@#~~xFV;ubd3Pg zGKQht7lOvM_qURbM*k_#2fpTizYwaZ_Ia;*|NE(An`z#k4NBAAFCiOF^L$#s^9evd z?ekx$?fLZYp#5vZBoj~^C#yjw6(my9!JO)xeK}j}4B7g6!@%CmT0!VPY_?3=Y?iK* z?!(1ne^1UM2EaKN0MvWb-=6+aq^5FCDRYkvM;k97V&>WK5->=YBAtJz`W=tQHH+g*)<-zTzd>E^ zcw-EStw5 zYZdjriRY8IH~)ME92T-#7`px6xA6Yloz1_$9Ljcc?Oy^#v$^Mw15=xO-cL1uni&5b zs(IDKbMrQ}{TKEArwh39RZDCKasUN9`^G!0;Ab4I!pZ*yz4t>iZSDjWH}zhBZ#RR# zcb<0&gP;A!JAJ{=7I;Ay{H(aT>ApPlX4B6~z38xm@w4;*+j1T9+b7rKkKP0X#2MwMaTuWvH@ZwrBjn0c}I`2bC_=h?<9T?XPUH#{3B-os9 zu7>!YN{gOThZ6~|vALqWGAV2cB@}}b@5;9S3@;{ILgI{#Ecugzm`IXz1wINoAAqz= z#KuParVDkq%perMgX|TI)}3IYIB7$!kX+6x6yofUYMdO6FoKbPQ@hP(0c#x*tqLjq zpQA|@0uFbV%;DaVmdpJs4dQMy#Mv@;qXi)Q31o$0S)w?jB#2i@lmE_!l}^0|`x>#K zGY#u1q4;feR8>1Ls(#Az_-EPkPBbXg*e=cY&V@XvIh4bWmccMJk*{~PagLnN`p?l< zNkMbuf?)N{(Z5**%^dv~v@468w#-p$act)^{{0^m-2Y4c`rj|G|9``Dw!QyN;n?j^ z`alDb;@IIe{x~)fK|lUDHXdq{564Ec=RO?!2@AQ}L7h?@yHp;Gmk&4+f^e)7N~RCT zN?8RBjtzrppdC)6d_XjV>FjgO2Rk8c09i=ceR073_<;L@fcu<)`wNwO1B+>)d{gO2 z_TwRvG!WYq#P0<0m>}MmSYDQ?qoa$rOJBhii|}0Jx|(L-moMt-I)R))BXT^IhnMD* z=j*JOQ>9BWxyUf&9ObbejTOY&1@SC3m-AY^{dgQ_+U;DV7h?D4|Gao7k_}w}&Vsiu zp|>yKUhQHQ^;}gif!pv2V$llq0#~qIaNelrJ=Mniy2S^0v04roQ&x^!5j7Uccu&Cb z+TwWgF#Tu9c$32!uNgk;Gi1Ey!L{7t{N7l9#*B9m+{`VG_ja(~Gh}{8z^UBgco!i! zrUQ=`&ZXt(A;tav9^^^CufkhQzbhY?f8WQn(tSB(75(mm(m=n5{wn|K$@zqPw{q`# zO1@8msz>F=$fJSZ8i0#_e;{WMe!qdomVVz?-s6?;jDJZkAFTA}Ev5e3uyLt=Uvh@w zw+EFYekoHB^@68CaOf-cS$pNCSW_e;^vHT0tx!v!KLPmLH)m?nrmFAQtAEBzCCGl9 zT9QYvCHr1`A^5c&BC^}lza#qwjHCA2>z9NiGb;@C^(-_PZU!gCGD!p|=!6(xHrZ zj>S#~K@S&73Rk%YRUvNoaVvj^tMc3ouF{DMoF~dTDXLktA56vxp?g@0=)yeinmvw( zsKo3v3>KVmh(zwSDQ}o9tv-h0v5hOQj&od{VyMy^R@J-iMG57WZm zg|W6ysT`yph!}Cd9B%E;pnJo;+q2Nw6-G_P_PL0$78B)@1fY#i0!|nrH!1ubCN12x z*E}A?&^pjOUIzM)WFD{H7|A^LL+#UL9*0IokCp#yY93=`dVCW!Bh%xfxGJ#|LDGSr zj3Dp9g_a-@Rx+$9itH;>Bn}E~o+O|7Lu6CA3@kW&k{pNHr+6yazLv0fYlL&T9>OU! zO`fW`d@n+>d?JU))0b)b3t9PXk>bcjx{QNo|c{jfAnmwAj(?(kqVq37{b$(@-G zMK+cBFb~6@%4F0&#Zwus4w3DOa4u~if{rzpzhmy{@J+NkVY-Jumpp2p^0^GqA;8+3 z)FGnrY!x53iT(-pJRNpTvu`nf1nzCUBoXpVaa;^~fI$am>IJwjWS@sze~PdEiTj(W zk7YD$!QP4pbY!^CL@d8B0Jb>1<8`AD%s+|+^XKf7UVue{%xHb`WCZQ>j#4|jpcDh;Lib0Gy~EKR@VCG@ zGTqk0=!junj8Q3U77%vNHmF}Hvp9Dcz6g0=#0~Oi{}lvEZ$a4K{@0U?y@vno_n~59 z$dP=zC&n$?iU9+6I3xV{)RsOTH0~z9-5G8|s0iT?{1YhX%?_M&zKY^Fl7NTE&OR`-WZk3kPNoPg*!xa1=EPP7^jy7Nr=Sqj0oKAr$usjpS-` zn2t&U23uLZbci6DQs6wZU8*p18%{(M%h6QMK7QSF9NZ^$2VbqXQ|riupmX<=ugPg9 zYnIc=J9YCW`|%jt*FZ8j_=>Pyv*;*&jd}I{saG9)rbc`_P1=FMDxVX?qBOYm91nd4 z*Bo*spmPN&w*RZ#S9)G~UWN^a(#=@XQxusiZ!dSvUfGA|t_&NS9S8uywwdu*&-3DM zv@W7OCoiL~;mygC|BLpV=IBGL1A&CXnWH?o^rJgRx8UO^ZI0H0Ew|$wk!q>^NBYkyJ_9i@zZjli z#dbj6yUWsVk0qZ7eND5=GKqDw2_=Sbp_T3a6ZS`w%26BIy|JCz)wff-&p;9Y4)f&I zw;0=P_Vu)Sq_<5KikFkvv^bZOIJeN!l9Nxn+8Ng%cGdm246v5n+ z{&b^1N%rGN@l#4MFm^r-dIM{MUNzgR(=7RWY&A^B3{;X^5Uj18>n%^8`D6ST65~vt z#}nYVr^^_%ypOI)X305^6iS2s%~iezy+R>4uJUtjH`{!7&E(enBsq{7+iJXd4)!%*V^v{8%c>g0=`ACU z|4M2g=G?k8GU(*un^A*~tP2LyRg~a!9|B|A3ZIb=M+ToXd^3vh3F1SDArkpst81jL zIO()j0+!{T*CVhxWo>g`AM3(hr*HD+?L@z zVLDD`XZ7d~j*OE0hI#L7XjDtb`bw)el)zuX>JIajKIV*27n}LM{6l z9h1Mqt+)d!kXrt^rkpIJ4JBQbukFx0$<@5^vZg#;Q~tQ7Jds)&+f8X{h33iEh(VUW zJ@40Qf8JwdqcNU&lhv|1lx;AiuomW#s|OI`R;;DcgMH-E%hl4y*!vd)&?Q;5%qY`?Fa zuQb;mYp&ncTyND}zph?0A0L*taW?RNBlkwFAnrAaV|%UUYrg2pAFkC~;Yov&yEIW} z?TK@ad9eY6CfOIl@;mCW#(84hvGy($#Mi{OJ^%Kr-fODyzJl1DNSLeIF3nl>qi4N` z%}`AkpV(m$w;EUNBQH9g0iDOE*m{>QO4C{6d5_K=$J-MiHU1*VV>~ z27-Ba!G1SjjzgLO^X*cP1q|R=l>n%<@setHmG-E=O*YmC%>uyNq%IC0fSYa-`wccv zyn&yHrpF5Ph6Ydy_6R8X>BRU8dc^C59AvCRq8uoP*n%mPFR~!`!VD&3AF1Q+r&Fv2 z@vg-3rSdLCg!UaeN|yea^X=q;v5hlgRU+4f6pCXseZpDd=}q>_q}RK9uzs=Ts8jP- zqf>SHSK3y%ueKMad)!8g^EdJU#{mZBbfcJH5pOg!+a`SA7^_))lUf{r7D?^3V3Kln zNZ&(mwm5IfzM z>=TyP_;uPSc7ohDNHM6dL5c3md?*1)KO4ewzCdDb8b6i4nZK!>Hx_7wCFEK-cyJ)G z6?kwnG1%7N!ST6a;lV#jql^cIm?iL)2=L%CbRiNvI1YiW!GokFrx_mX?bHf9m_Q7$ zHF)sdufxKFr(t+Rl^+yfRwKiM3($o~@ZdWLR1F^J;k8jk#3|E4c=@))d7oT$9Ywte&WBk80!pcxv;*3OAWCF( zaTQOa!~%netCF7zqMaBsxeeeoAg4jHQe?@Sm1ymOb2I3<^e|XJ37@~&8t*AccgK-z z5$q>oY-Y7FatDRm*qGqPJawega+UpIsJdvI8n!!GyN7-$aL^{25oDgs3orm zoO<&qHTX0#vbjq^+#EG}83Z-tB+|>{gduIEml+UfQKOeW!Hq>gFJFV&T2C+gptQD? zUT%OC2mnTu>BS6DN^;{Yy?{ZUfS5js^fKq3DA3DLYY>XGUcMZHy%d0N5zxyU%z4yW z`SO<)ZKsz@g8Lt3dg%)pdRo(qfuxIUqeBzJ=6u;mzX_*btGXCe2H4}3d!S4h^G0&_ z*E0?4u0&(*QswlNx1eqMDPc*himZgm`w9P*QBJyrc!Zj$_$##q`+2UP?!{_&buT8c z;q9I)jfb5lAa2R4ctP1P(z}ZBtSoqRM?ceKz3O7-I8KL(MavwDIwgpS&}zWkn5HJ! zb#RU&fEoGjug{p*Ok)?Z#`*_0=IE|zOC^kpNb%Z?u`l+3N zwsTs6MS!M7WB&tL^2OCqvtGccQKINif_OESd9F^eVbphr81*RsQDdFQJL;m?M&=}Q zxK(!obA71ZeYn?|OW~SZWYi{9Q1qs09ZzS93jX#2pJ+$?eW?5l!e8mGi17D)=$xkp zfA63AKZC#5!=KfT`1>ZjNM{WH&Ac-r{5_YH{!_w#cTG7R@E7a%{^1PW)L02y9IWw8 zuD{On+oIQE{d&kpjX{jnWUhi_Bn)9Jykh}+77YBk*lkpr&X(n|p#816_$VSD%#{3C z)diH`2YsH~#M_fR?vX+kDFR0*LL$Fj;6@?oL7nvVZ9gI|qLZM<8ZiFOMMOlW@=}CN z#Od?hU4{H3)_6pAxMTF#T)?s$c#|=Ti{-Q1_z0Gb*;xKSW1+xO!Qo9jsVHC=$}w|s zBO3}*4+ak93is7)C`KBJMLf)gQfI+X3Z4CaX%RO`{n>C51bvzrYvgP=3CeJ;bSGQ# z4`Vo-#~o|bU#a8~oI`O7@{y_Oa*eG#1H%G>WlbU|fPYb)b;{wsi@5 z#&d7<)`Tf^Mv)v{V-dGuR?K1_>Ei2ItcPt_`O<8i)ns2f@G=`h(-K0ymWns<-ujUM zt@P!1_9kLx5)hWddCZ*|xhYtjgEtu<2)!@SyzT>ty)Fh2;VR3> z!A2m8K2&7*B>jdGg|K{N%GHh?*zPw%2kn1hF9A-w;u>A#mPTGzp-eICG%4Kd~&&S+(B;i zHnB!7b&h+&e!Q=fKgf+?C58#(ZxEbwGHQh7U$P)w`^=5HI@50aJA{AV;NKBl5l+qO z#B(WdHrhudQ6Ft7TuOY#kvOWR|1Y=9^ez@Bmtp7QLW{$6r{I_{4Li+lqeG@I#}3Vn zXb8I=aV{C{bXNB!=j^LDxhW@H&Q_@oT+qJTN6VKSia|DKv1p_H&onb9 z%9nhjvvT6iZdBeV{k0gGS|_EKFFC>r|H}#=V1*fCy|8>U!DHH#=(gLfxb8Bv7y zsu5wp`?H%vz`3rFfLKNuzrX(`YViKuuc8X?pNEG5Z|hAV;605MwjaE`X3$)i zL8WOH$MkeL#)@T$fOpU&m~uX|IA&HCiN}m9XYMHy8}TC{pE-W$@~8lnBA!dpxl@dJ z7g@T+%ad{2*EAUtQ(pF4#3BQf9Im1sBEJZSCG-|558KWusyxh9(hdh+{K>T+zbNG@ zo?>-y@fekerm+GrUl4Epl4&^5L8@8Qa8dq|1zAPTF?uQ8bOMp{KihJQxicG;Q)-rc zc>z~hNewt|{u2MY7fZ*Ww2WRk*U^v({zUzS6)o7Po}2pOpRVm3i(|u zju{#0q)2^v0osBhwPZH7=46XU-2Ri1oiNV8Yb#+kIP z3eMzw8472%GJNpEnO9LnIP)G&FyYM8tPU<{UrabSlc?a#P#I@_gV*c~XDDy4iZe^4 zkAX8Kqa8CA{7e|4Ak7XSO%7cD;bYC1+atl6zNj4r))*&+z?#9Vu;XD3^l}!aLrX)> z=Q0`*0R@XF1*}^Tnp;CvK7D23}?dOc`%%G_H{l=9uGNv<*Gb5uEwlBC& zIsUEm<2?J4fJHrEHhtv+78x^2iS-yWW`Xb6h6vc}Ft*NA9*VY&8H*KieG>i-P^)VM zEjLxZZ;c0TSvMD9kqK@ckXi(QA>)%eQH2K>XIXa2i{TUL1x zRV|Jst1XVACykD$kK$Ik32P}>{AZ|N0fglb*Xyl=(PdjIm@$@-oDx<0(eR_kl?Ah$ za$g&S{7trrm7daxLjI2n#<|}E_qFz?VZx8JC>~7EJ=|OGattQN&z{l~*t=-`!SxkF8#!B~0P_cKVHATF+ zLN1-lN=e*_PKFEEU-2+}H?S57S6HykP1B}E*=TH*+eP+J@!u@YNKq0k%@yo3tAW#| z>^jpPl8E@%h<`_cVXEA;kLZQ;@`oc$Asm)n3!Pky+WY zK)DnkW2W~}RwxUUUaU~V8sMEQgJ+2ZkP^gi`2Uwv$=;i}-Wsu1cgRe=1YL-VP z{5uLf^7%N0M{fPBwLEe$916rEO{b7Yf;Bb}pWN0GpIkw#L*bLO{@(@)9kd zyb*kIGV#d?GM~hOMeke9K)p^R_u>6l8EQ63g{eQg2T_F=yv5jh$+)5XRGNnm$gHwE zN-{>PymB(i!{C*Z$A;pSMpo+2D`#DM=JQHPuky;+Pc-}^1jD!&ZiN6kgc}I+E9(YMEDN4kL?`cx8#B6}<9ySnO_@SJoDV;FbSih5n$6KCd*3 zIwSY$R>j?KF1fH)_P=8l0Oj6gfD-$`IMrQ`y|*#!mGTtuu2pf~{mF-G;%tLxgKMwD zH8BXSUI$J=|CI~*dlvQ@QoTu_^G)f$Whmi(U%iR45BUElIJ#RLd?JaiShFKVP}c*R zE)Q6;^F^>{Tf_@^vC+i6>VhDJx?5EFnXQL3eY7`eLd-Cj6GNcBjpm&OSSA-N7*WS( z>*4&b=UHk~X1OlT$W&JYkm__Z90`<45m`~WinYYN#aO|icRh_uo_lq8h8gN9nt%Y0 zG3MTtY3nH!fx%$aQjFzZ%@sVbx?^E(r)@|CXvE#p9*9$HIyi_}Z|9h|?K@)(<(@%2 zXZmW*3DW#x4Xc!wj?{ev&~cR_-gA!GgUpgi2JVe|d-Wdo`OYy<4DYMnKjZG^9J3Mk zljP@H(R`60c3IWkf@L0yBi1=;&6N)PWx?_29r$vm--!=aVe1#Y5xEJc2y^y#J2=ZV}PPHljTch|LaHUHF zb)n|t82eT%(Z+UhxgSOWmR@2F6&`DfU3LtD9kt67ik72VoUJ?l>aD}^H^w^Hl;61EO1^GPww|vaGmu;s^wf5#N&JCY zqo%OGtBc@BM33E98d3d_dpCRcBmT&T?)PZZH@i*2+LBVYGmeRKchTI_V&`;PWx>9hy}uw*1^!{e8K`6OTndc+PA5XrYD@uyy9VCIPN<*$EJWOCjNqHWs#xbh=1k2YauqVa7 zE2hN$;~>t|=qz}9%C+zFrK4!@R0`FCtdGP}QiuKYWR z5|`llO_Sx{>3ihg8Slxzv(h>Ce9mR^?_5e#g8J60<=;|DP=fo#U(jzwMmc((lEyB{ zGNz;?C?(~uFaGgI>SboM2wQSW@(*w;YQX;hqG9tpb5)zNYFy9Jeg1o#{b9P`^Y?Qr z{)DUbcVKXMVSX1>dOR1v@V#B*8ZAG5k6Xdh z<3_*7wXRF(F@5?%cJVlyrTNMD^dOohR|1NWejuBT03$@@n=*!SEAqf-QJ%}n4=Lrt zxfKKCasw;ht&|(N6-jcrz{;zXatpWOTbT7|XDlm!LMgwVTX8@xpTx?^Q%2vt2|$#~ zr=xt{d@7s4t@wvrHjB!pQP~`B#iMfBTq-N1GAp;DQZ6f{vMZ@V1XQ~H;PB;th5VD^155kmp;DA zOXl_=*gVJRK*o9ZVEN8{2?!QvmKlg5uM^LQyifM!ab*eWIqQ8nA@`&T$j=F&lxu2`2g?pd4L~MAfb%5QPUI<-A01cbE|G;f!*8fgzrp;HVz~XPZ04i+b|3?6M#8*oNYn{TM$l-hOQIf-XF= zD)qY>``IEYLdlU(0y`AP`=vpvxO})5W%mpw zt)h-;6=R@PT%yq`Xs~`-MIF;B>h#uOcqPVqIiD{r_yu1#nzV}1idIplw_OYcN)T^= zh7#2SHnVT-sIhG^^_GM>pcGUtCG_}H7zHZpek*6j>7j&8fsJAx#PfG0MFylDZ( zk-JO~-{!H)ZWaVJQcREYGlTGw-quL~$8z&D>$s1x_JJ)-HV)arKBM0~#IG1ag8p0P zK9{`{D;xnw^E0Icam$%#5h*#=TV)fy{0r}tO}vz7Gcubf4F-M2 zGJ9>JKaa#`{EZv0P4pD3Yv_I_%_f>u4tqqliPrnsL@c=^o^?>0=(Z@?L@;_n*hDp| zO$4JSgiTbd+C)%YL)b){&e}wznuc!^T@b=1ii0h*z|S6n2d7DUXlQ7A2+C!5D3^P$ z@RIoai&T3kYzwHUc(*KP_}6ZM41}~XIg5A8mJsBQYz6%pqS((05~+Y$L3hblFa{Rm zD#!}Dl?vtjuBdV&?)=T1QS{tv2IYC5`^=n+d}W9+mrbAUDD#>=Wah}G&v6WZ%!i@O z%#lr>&y}*_%*>HZpM6Rh>~6)(2{L~aGbhOWQOukm^XGC%CiKJ4{5eN1^D}=s$z^`# z&v%4R2$Rs7KOeT){Mqhr{%mT_{Nb6otf~kwe`Fm&Hi7(=gb+5+{;+JI%V78@>d%e~ z6dMT2Lx2tBz8lH|bcca(;K{l}pt0lC9j=v)8C7>6UtI{@K`sW==|AWW%m9*g2S0;} z=?-U2pXMxsGy7Q+@gjk-BDCP=-63)ai}!K>Ma&k>q9AsJAl7KYI(lkd|wl z2SYr#hHq(ES-=@cliX(?si@=G7~V){DjcwRN@;{ADF}1k zXNA!iY1nk49qZ8#)v@*rbF6n@YFgy>@u7y=2nS14IAAO0G{rm4tT)1&(-jy(i{m_x z4Jm;6C7!}@W`3Z~XTj^?jq@3>>Xy0u(91&LZhux7RowOZXu;dkh2mp5?~7kJ7wQrE z0w?KxsXuy_|IBveo`covQg;vKt}7yT5Uqo|SvN zpF({5JLjG3+kK=I`t}L-ZJYzruk^wX#ZB%@@Li=4TUD{D6IXg+ox3|uU(hd2LKw?= z&=%Y=In_#Eyc_ac>QK`%&pu-G`%UrXaj%6p1G5Xz^&n<-IV+SWybV&l3Hr5< zxZ}O1#%9|P-q;TH3kRD^E(tNXajY;J*xbbUnv*$m52$o2t`BddC(aFLq>C>OG1A*u zVKheCDw$KUUmfcc>%trBE6S`ktBC#vo}wU(UCavGjIm9Q(>~(Wcbmf5nyTjUxGt7}z_6cXCaiK=~%>WvHG)CIYTwY8g z3S_m+Zn@&+@aA$Q`re}EcOe@~facdtGr;zck5|9h)YvAx6yDgLLl0XV+nDqaXgY)y zwwVf>z)|~%U+-&bY>QqDZ)_id*SD<6-U00=hz2LH!f0Tos}lOO#;r)2D>|C5$(L2p&xc5kz-HPzNT9P8T{^bCRQ9F8cXHYX}=<}}+T!J(;km&)zRV|LJ(X{G&qL>n}6 zHF}&fXzL+3oD@|I)Syx%H;rYpPsrM?LQj>DZE_OF97=>=#n*b?xzZf<4ch z*hx%s^-Ko&5i(HrI3h7Gx}B#%x9&iU3lnrYG$ByxH98s()P%o1TwUaHY8`EUa-Q7gH02xnl>2Mxp3WV^ zHcN_27g$OL!v?HE;(*SgOvkuPBx{ne?UM0@gOEtx`3!*d#o{XHs5L8{o-JaAncno3os|^i6kM+dLq$8*xCLel&C~-eYv=nSt zI|4-!d$#j*5K%}5@TT-R3h=CtnEX0wqQ=`OAbRLcRiL44mm0uu@J>7m1o6N0wPE<0 zAl7;PjJYH=n)Nek$E#lZ$xtzQ1itSR%2U9tnNYTJ)c3B^?+N8`MLxv5!`Kc@OCC%z4Iy6I#<1?FxZRWb^$3C`=7KU^ zV#`<4VARTDKiNI|=i?z|H>EFS=p#^KPi#VStOjBb`x_{I2mgs6KEMj{lk>3Pjkrx` z{45f3&=R}Y7p3UX(f=aMP;fjUzxTcs@^-sqgg-buy|HFfz?_K5H~dkZkoVo)q!(d) z06WEG1Bz*@cOPKjcsM=iJ8MbM;rG51G`!7CP6p{C((E3136mI)nwguVFQCq-a}|JR zZ$GZ~fRw*%^gy1PUNkkGrNM;eN<+Duq(5sKQX9l?sQIT8@kWe?x7K=@n0%-D6@~y# zc!1=u2r>d}^Uc4`(!84%ugH zx5GL^a?KwUn835&N$ThQbYB@J=hCMElg`5JAITK5Uyzp>T0mK*D@up3SOTS>0$g-u z{17;Kr9Xk{9Px$pRjA!@I0!yfdIqKzeJ%;SW+k4xT{y8Jl-@{VqB$3nJImd+c9m8E zC+*3{9*fh_IS>AC37(7k0$@Avdnry|-yzdZ&ifEc&p@TYre2)8{s;Wqw&6)^hLfI$ zLkolL?uq{dlj+%H|B;*b=32d*I#vQw8$t|7qbF!#EFe{?vuimh=^8YR%LaV4Cw*1^ zPyV)e-b%FWJ`dF{K{d~Ir2`F~)FXNEI#2TLc#NzwAF;6ne#-ZaFW_cXzEOquly5M4 zxRZ#;nLLYn0dSxfPG1ec&zW3Ak31JG^%l<*#JG#Hi9?9Oba6Q;vo%s;hIdc4-*YJ6 z>7pUAM(Xcnk;>TOGtv2+_g7;ov!Gz-N+-He^p~x(d@K~vH~r~sKc=_!#2zt` z^S%n8Y-uCRa||R~&;522h%6W^u4lob(30zM@NoKd;tl$J?C5d&&8bEYxreJgN|xTx z_rGONF|z(Ns9y9ZiAI)!ktz9j*|;{bVRp8>0}!w&^~E53Lr6jg@l`em z>IVU(2cerkVWKViPj2rpaGBa03`;$mDKJ}LsQKD_0SFz~W-Z}=$Tn3PhX~A;7W*|c zEujVYsx&%__2_+@sU)e{93x~2t$u-0P$RcAN#}5qpS1A7EUqOt&>$ez~xEHEQPObgpk;0n|$^-~v>I6Kqz>874-hg)P2S;W# znBQ!$EJ6HUho z;%@LmPwF}<2NN7ZX^(U9%#txl5K+N`J`vhlpt7KFI^9q{1b`>qlj>m2-Gm+NFi@M; zWYm#Djxsx}9LfedW;@rD`YyF#FHQs@)fJ@ZJ*m4;0L?azS^L4nz{U!j&a3NyuZzcW zZ%nbJc~V#5UFz?&#JVxm)(YHHOE*G~QC7*(VyJ#nd$7o@8EJ|Fbwv*3^#MvlmhVX& zf_9J=I@^$2mIA)!C`+WiQp;s%`CS4`w)7IHkv0?uHNph} zBAD|ah=8T9qj)SH{@w4y1EjjgOI;!E;R^zs=kn_w0rE)91V%Fx8iC%hudav(RlSl(-T)AS!7T1#gzy5&i4cD2BLsm6 z!JraC5$quJ0}d4s0&5=^={Z|Hsf+1Vu@Xn-;%k+1%krJQIuWQf7o}^6@YFh{as+W& zJ*j`di#c1xqn=bVHG$SAc~XCgOR&cjWcloB|IuSjfMy)u3u6?W1Rf!0hg1t))#60h zGrow#mPl$jKbsO-PMy|fyWWc!Aua?*GLLl%#-YHUURh1NEBz;(7!+)j*De1~c>-kL6mJEb?7nZ%Al(3}JTQ;{%n7Ie9qwNR?39Y5~zHeeyI zX#AxQKvv}J5gRZM<~O$$QK+9;taU$08MUUPX&Fvpcb~NsVuC{yL1u%A%*aTG`n(l{ z!ZN`@ z@6p%yO4jlG;cC6bIo4z0OnVBQ!#kUuy?)H^Y{jV|)dEuTTDXFSB5o8`U&eR@t^f|0 zMoWIf0_^=Ho(uj@IET2eGy&(Hqysx@-JetHq>l=naoh6~1f*d#*^ebJ?B(Rac#^Zm$AV28YvNqwFIav&4gUCrmi2>h zgQv-OnuDA`?>HA>lYNaD;~k0YP-ds#F>|JdYn=VMqniivQ><6cODJ-V*PBJ;_$i=) zf+CJu^7kxga9;hD{aE*f>FbiwCMAd4YW)%~?frlD&ILTG>RS9sCKJLVOi+RWM4|+Z z1~eMf#DHdCB4=cx;1l0iG^IW&!VC`;4NjsNj&n;NR_*m#TWxDwduv;Z;4_mz5?)H6 z3O-PLRL?Lz@C5;d`Ty2F=S(Ka1VnAW`@i4ylbkc>?7hy~Yp=cb+H0@1c1132Ymwo! zRjykNL;1#^ z&~^1K#?Y_!#6$V8UDtlM`Q+7>iDl`bv&I>>Q9LwhOv|K_9xEQ$D-wQrEFN z#cY>sMv7v#+CNYPa+MPl|Okr?~CIQBfM#kXccSbX0i>30hwFLr*?qn z?CYjFs;Pu*Wo})Pq>0@So+H?Ir)L9NyRr<#aGA@%J{K?tPD+J0JdqnUKze|*T&%61E96*o(L&iUT&Cz%JKp~ zw9u4%rm8-AQ}h+;5g49Je#es7PuzsTdr+N-5oq;sEzsAy!_)d1+u&(!<_@SjG@kdf zB1P5nzSt8t?hs8lE&5Xh<-B~Y;?sE-dCKOh)=bGYPPEX&h;oYY+55@Z368@zYNK8T z)2iW(?p+()!EF|@q#tMjSuJ#4K1qK4PD#7L(NmLh1wVEc1wCtSRp_||z5Ar0b(hN? zbeuKGBr=bQNU9X6jY=t}J0X{*Ge$}d=CrDAOmL7tQ_M^1xUS0m@xYf5ss|59aB+>N z{KUYOJ(ysvRo>i}xcj|iGJh>5c;8|IPXjz4{az-7mK#}zDuyWC$V4g}Vfc`030`P8 zTJgf<&)|i5I~6aO>F-TmxG;$qMq60Qnd`&e zt?0leOI+BUC18Z>Wx37qT*4A+G5zmj3B^HGdYg}BQ$chcx*AUszvr5^CR0yWsmGJf zHJDme%G6F43gq#|z+pxvL(m<*dK_ztl0v#epw|f`Z*U!73m9H~vmDtL zx?rlWm_z7Vy^(zmjwaJ8_W6(U>8z@-B1fvq#%Bk1X>sP{#%#^eu2r-I-j+J1UWyDe zUO^qOw%yLdY`pqi`3bW7B#U@|V}<-yc)k(%*sXt#*~Rz`&-9k)e=A;3w9Wsnln*7! zOS@tl&I%9M;p3FNQ1x`5{+59CX~nHts7kBWv%F*&^~PH#)s8Pq3vm2gJ3qX||EShq z)EpN~r3uEJ=&ZE-3RXo(p6cmmhYCxo9q)UCE!mtt7kIjKwKsHmnsI11tQ`p~z*
    j-8rX2y+yeB(&i)XiBE!sAVFA3Q#bC9UG|qf8#hP$Xj+yAK9YmDpa* z1j7Y>_#Vj_+FCDvk4rm)4@w5+-#o!j?dkMvc%guK^FqW|wa#IHvQHT(_F)lVl4j8* ztTsX=@&L5S-8V>8`CRlO?z|N({*mH%7c@>F+1uFpeO*sBYOaTy=k(Qr(F||J3xT&t z*;W(Wb6TLUH+*IWn}30;YJ%G-y=Uxv5^^<3>BrOOINVECdW&ChFP|!Sx9?^g?A%g4 z{KL|XzEM%JQOq#zKp$l}DEa(xp<#h(9rFQ}*sYF~)!7#1XEjE(pjuz))&C()xP)b$ ziTxXj`)y)HeSv?{$6RkCb;PC;{$oFC#(KLTnUe(Nyi7WYRVTa^&eruT;*l; z9In3Ga3+A(3KWbwGtm3uc_)JiRD7bdPh`DayjhFvari3U_8-PrVSK&MlI0IO<8e>8 zGTS&Atyfhx3Y@|N-e7AsNBc!fg;iu+v!UUtdsZRe-*|1CJ-RWq1wK?_NY(xWwG|h1 z)(Kg4e%G~5%#RqV)<5VWg$l&oiOCQ0GusxP71-&GuM#=rb3{cBZF4KDy;pxp2zxH- zk0pjqLJUomk0gnqlM)|gKnGvo-HXN%JVOjU3||>RGm2d;NkiVDcx%n1 z^2`OGLXXBrH<+Y!^6HhqX*29r)7IS;hrhg&(qz znEr`c=*(;eNdec~*yX0BG}M=V8(E8u4Ls3XqmlqbF(76c z+gdh+Ro}mbp$@vAYs$y}Ah1ii7|~*O@lk3if51+Dib0oV_4It@S(Bot|M_b7o}Sy; z({0wv1NZb{z&CsPy4SuJHCY%!LH^?dJEYtmR= z&o@>23!=lIy1l42gp4LxS2Ar)l@&#OqiKc!odT?v>=msp-5Aen&+k-nj!UM^Qk+&f zaH$N$@uCqZ#^1LnZBf$AdePUiy~X1SMbVMg2Oft=OSvxRAFHJRhUmZsPeWjfFAsX4k9L)>Ai1d#$e7t&Qp_h$~Y?KF4$}rmCn^ufg$D${k zGxkG9Soq9rysn2EWnHnIRm4lOuIN`2+^wWV6;F^BKDDVTrqK094XhE( zfca~JQKZGY6jkeuh(NK{8(Q&8A_Pjb_C40RBip}FfTCh66+1MxGGTK z<9TQ1C5EE^E=|7;ZaQ6y#2q!brCfG=Am8<*r|=3{L=>q-L^j&=)rB+s!@yC#c^OIo zs(|r4PHP@nn{Z?TO9;dP4EO0^dkI0B%L_aCbdThL=Y13J;lE>)up7_;)6Uo)C%3h% z=Zq)>z9~C7CCN3vV5d8f!(n^1H)p0{9?OcIZG0rEMyQY46mC#= zSJ4z&=p5$gHe;mHJ6&4%qFkd2Vh~-XFMbsH^=L*QC)kz|Qa@TI=M%JpLzHqIl{Gfo zF{zwitUl>}vG$RI<-mVMwgdXc^R^6Plm+|Cwr`h>FSBgz!Xlcf%6fB+mF;`tEt7ci zHOk)COIbxn%Oz*1P_W|SY>t+}L{>u$bAfnecHkowUnfnKCPvTVUDww14(Evdz{%(V zr*>h!nn}{FsW&lR!pF)K2WRVW{++U+OQV&6GHDdn4|nVv8D8o8FF zVQ5Fa>Vm!TitKL$S856H>ND&is|YprDm8>MLbbrSO)cwb`cq12n>v7$m%l?jM!q`3 zQ`7Og-^lD-mL^&p<*ifr*y8H}-E2uJKD+G2ug_;Cy_D@XUQI^+w3C-RUa-D_Li6-` zS}(g=G-9B3Yjs1Q)3UM9#^aX z4wfdeM`hCFKZWk!m?r13g0g8cO+m6~;^9Z{G&x!o{g=^1@~x?VZsmD_H>bL$np5if zr=C;9=OLa~!&_Dg-7>-fFIS|GeT`nUR*8J&XDBg$#EM$)&8zr}YOFX>0y>>MZ-Q@O z+MBZdL;^?UJPf=(%gbTgi?YM#WEzirVs}x;nnV{Bc41qrpC=}>?LOFc$2`juf{nqx zFtFH|EM@SwyUfmVh8GNo9V#oFp4@sj-x6h136O8ep{aTEK<$1E^P9<$h%O^nBD=X;*mSKGi++-bsHu2jZe>GJ>^TvC%8^2D#F2sv z{t2vqxhXI*#ZP1A2G|`>rAnvrqllvb8^;4$PmB3D@BxRK_IU#;%dRW(hvg%&yM&`f zqgB9xsbH6G6z6CG%&0K_D4X=+`r!Xv7f+a}Np24ZIUJIDx#w-dci}X1eX0eo5-!2Z zNS!UIg{I|_Od-F;UDWAYC7kBZ?0h6T?1A;*cC|s?T@UUKtEB@p7t_ zlG4YEj6ZcPZ2JYmclO+>=E5ejB*^?%+F0f;@;hXeo3!XP2M3Ked6{r7lc!bO1OAa0 zhz)s$>~Ajq;32FL*o0pDo@EoNUy9uZhkO{+z1%7LZ{Z7S<9UB{D6`1mc-|oHSeI@< zyJjMNM7WN{!z{|d2eSNRNXwc4ewZqMaCN?{a60F^&rUNgrF9~9OS*~U$~3mu z_y)Btq{MNhDUR)zN#dA#EG7`|Ry|7`7l=7W!^~Q193}hq9{gvM;Ebk6az0H-I<{Fgl%GGjRgS@$}+{yyiAa?=3OZZ*F?@E4G@_Q=3 zr}BFSzh`KUH9VTlqaB)~$xCEYVA+zihVl`XH1!Fosr^LdzL@>TWF!p^nNRmZpS!{$LD2XbKUD$w(`V9#Lj{!kM6GY_y zK}?*a#>tS>IK%CyVduITP_sN;f}Hyrhef0UbZ36Hs@);UJ~YYUlGGiNUdUz4dqqlr zgL%BCwEE^x#Fq~hIdz_%|CHUJpe-uYN05K$4TGAK^Te3BVN&OoG2b;?KD(kRL#L0Q zr{xFC8*?FQi0wa)&TScR(w}E^Ay@#E4@HtF!wJ^!K`sQ!SChLWl zHODH&&cW?AFDq72yu1$I1mhCc)D|y)W%oRMpi^1QVtI zxL`EXKOz{-@#hA2r~4&i7<0|<3LR;3z1O4i<=(*HR_DEm$3uCnZ;2fi{PL>+Rz_r4 zt8=0CR-Zl~q3kD_sw85!@_-h5v5nzsH6P1_8C#K*XDP`B)7SXXGpWZ{LMLYUFp&l$ z`Iczj%dWMoY;GBV?-n}`J1>PhLg!`T;I4&!TEK`4pOsbf*&ne=e#R?(kFU59Zw8kZ zZ(ZWfcQ<&lOSHvt85y@4l-Y0@)r+@Kq91#Z~kl4t~r_XzcFeWzEAyK6rs z|C0G0HP+TMY9&w2;ty)^?xfG>Ucxt3;NNU~+r&7tTlZ$-QYV^%YY;la;@x6Cbk$Af z`!bJDjpyC=B_Z=TSdZfoRZui$KP~7rq;te}JW|m-=ZhttLUzW_FT79`je=MKCz?-8 zcP(p+^{-evcR-70!0duJXGFHm+aa0hmSnKU`MN$iQx)Pjgsfd_)z798 zT`N9IMK+;l`-)qA;jp~-6|+fwkKn`3{Lq~lM5)(i=en2p(%z2^+L@6dKMN)<@nyds z%Q$H@dk55!Hp=ni!B~1=ee4Y3nRA9Jl6k@tf5}111;LJ?^RsLF=7uL0#8B$ZUpV`0 z14v`TVgZ5=EVSJ;2W2KKoh7g#5H>uZfCR34J>Lo}B#By&!1S5#(7y13{*o~|gOpz*|$B6+tk zT?Jg&7++pa@3zIGTZPnmz0?+_tRy*toJvd3O0DP%G9QGG*mTF(L_}f6-`t% zQPD(I6BSKVHBr$-RnumB9TCyiypGi}wRt6v;xY@8rVE&Kfh7A|>@`XZEVaM=ci7$S z^*j2DM{)+xCZibT3m;^C2RtRdqW9PUBhG-m>Up?rQ0+ zlDE*&8W`F2InwCZi;xVYr*Rtdfz#@Ms0reR?o;}i2}*B}?XUWrmFRSV^BJp({*1#C z8J~qbkh6egES4!R50#rrWCIpsggMU(`B!9I{W;DCbvwmt+pK~97|Pksj7t}Pwv4v4 z2&)U{!0H7=+!Dg_FORtWx*XqoIZOU_nm#et@7A67T!|1>n}z;EwcrZbZA|l%Tkn1$ zZR~0lerXJRR;@{XX{y5_(khO?AD`?!N12MXLlo;Fbl1%n&|U1~P(u2w`R~%zIL+N< zR;4#kpVjPPLOub>A#mU#gr~%*;}}yZyAD@28;7B3F73TVsox}Y0~F)h32Oqfzv?4k zwsAU`g>rty1Mu8Oo9T*&xeZ(I91q8klEbtQfs2t35w&n$k$elcZZz}gEToWKn_1AwE3>@r`~+_d zyKZ7H?Ig9PfrupCPxCt^@R8(LDRdH`ciWoljJsQkenA5t;sZ1g>(5#t_oY!*?g?Z- zO8A9kCw3tf^C7Mx%8u%6J(mW^T+K*ghAwTC`B}zKi3B+>#DSXpLLD+OPh*Vu!lUnm z@*e#&T!q8erI+J1EoZiS9AB`mEpZ3;Ip@R{#|<^P%UN-*CrLM^e`ZeYgL$xACjN?! zz|pvJW@@1aWr7V|kzW(K;&3f|8#+((3Z|hn6rAYGGQt_s1(LGtN(;tHUTWd9^Ak(i z_3W495>k*6y3K~?s#kvJ2!f-_E-O6RKc?*BbpJ7~Wp0#(K@}V34=!#B-<%#ETvY2j zH9ym_7dMr_=aSI2Y-oTSg=Y?1v5&9RW)mB-N-JI;_(DHB(^7Vi7iG6Vl-)xr)|0G? z{TQMIoGXSp(qimqJ0F!BmYmLe<)#lecXFeJ?v!@MGW1yJhuP6X;lc6|U(A7}>c8Ym zGR;7huI>7Q)j7T;)wCkl7oOmNx82Xl+~W%$Ug?dzlUeOp%RJ{U8|pv3?2>eUIoeQ$ zC`6u$#`%R+Y{t45?-4a{?qTjFeLRj;?rhIV`5wnhR+)L*M1d$97QjLf$;Ri?SNuib zzab(RF8=rt(d>^6ew;~Cl#g@#ITd>Yv~xszzS+(ZjdDXfNBmiCXy=Frx$zahVRfk% zzHor*NTQ%e;i_|3M@=Y03!j@I^d$D=1>>nN;_(^T)a zZ7mPK&W^Q7zpi*zVjILi0}dnqiOi|S9bzgF!=7u|rpmfoGlmB8`8rI%M2lU9BSfav zx2P65RoreWNv3QpObQYvd7uO{d|G*TmacX$?*k)8FJ;_VUCsW9`I18FB|1DRp>sm*Q`^(v<{SB2fDM_=zOvd*V(>`~0CuTkZm zNGd0IFqF_X+{+IWJnrp$sqm1O(gt}cc+Bs7-`NISbfZ@!UL@hq3#l|Q@vd}ZH0vL> ztwzas>BCpe4vfg0B^@XxnS#X&GG&wp4l^+XlsNLQHNIeq)Z3VfRwp`;8No8X3R6wR z^nRe;>uk5+{%b&5JSP2Sw%Nk{&cr*ZgOr3;Qs;+>=c>K(LT|U~oSS$jbwntdbxun> zS9Rn?qRtVCcb&MomrIOQ)RB0_GAMzc`BKRH&Q~`2>$ob)`o{KCX@@DTBIn9=c6!l?C&|K1Z9%I zjG88lCpuwV*ab%41HlmP5jZ6M5Tl|?yzcr*g8GrAjWwZkH8M=&QxF&zRqui@AAip*u#$H^?R0=u2i>2_{)RQBZfA0wI3j*&k{1$R4Q z!xu+SmdAOEqcacTI%#qA5O~<{#P$~`$M&~4`X@m8zmOU`%Ee zL9Uk{HqLJU!cH3hP-y%Ei^f+8O)ir^7YU8M7LCucXgtxRacqo5+moc^Sou>Ve@4ll zBjnFe`7_v}?Eq-&@8f#vQ_?V~oW#ALmw2q^|BJ$l^D|g8lc}qN3@%#~@^079n@Z!b ziQB)xZo)|a4JO%ZOtN1o1iD22Tp(m;;bxM3vPt$zMfTVjo6sdvGP$exdAK|~O#U2V z61qP)__L%5sLo7IoI6kI+IcHq(j@ZbTR4_U8}bQ=&rOb@Co^{GPW@FCBfmP3YwZ22 zJy}IRLl1ju0u18SCXSR%P9XuDX1_rLqJ`O!K{L%?nRCKfq{a zy#H%y%gNigm)O?(LE?4p11BWPf8Q>@Qp!I`dCDy3-c>h?#RZigHY>a8rt{mYXI1O} ztS)}vtG^LDwwk?Nolxo*jr%a7(Il2l4tMSN%nAMp?y_;2{!^1OT5R;Pj*fhZk8C&F zO+t^onC56LX^Qs#N{ITJ|9UMn;uFkTv6(;&^wCMT!7@U=89tA2pG~eiek{M2(-!$} zBoRQa;B7oI;R?`46;L|Ucod-0iFKD#K#=o>{BLCYLMQ)-FKGI{a)03hSKZG+So+VW ze?d}?NoC_swZoCaXJ;5$ZNlP842dwf0Fbfs2;=dFFU*jI$#_&oSgl?cD0;IuT%GPM zZq*!ZJ1-*_I`(G61Q6A%dghAu;{Nily)e z+{?3fx#HA!n2|#zy2`S6ub0Qc z=y~S_$R zv3bhJ`cU1J7~~1DzVi;RVzX+h>fd$Mjg)mc0FMt(#aOl0xQf|FNsVO`GXC-)pDRE4 z58V6jLjwGs8;}c(Q&L09pJXKlZj0Xa7d*1Qmg) zB*rt43=D=KF;P#3rHn7{;Qkh2=$a4^SVfmA1bIKIerLK zMS=^uNsh~97g^s|kK9&nj|sU!vWju@13Rr)^-o0*t!)OiPSG(8n6Yz2bm%WjC-@oA zA~_`4K#hCX>opTYt6eZUqQ5xKL( z#^1RYvGFIaN^HFR$7Hebb9t@A#(okjbeA1XSZMx#5Ch*BM@xQ45=U_!P&#Od#DQUB zkOYJ1GL^Dvq)D0;@v4?wYQlc4TDgmuwK(bdD+w|oGty`LP{YhvkHobUF1(M_YG9gA z|4eePNK%w|OYQg)Vj-<<|FhGL2dE%9k}^*>KK_Mt+5on{R{PyPDu*vjH#YuGjkw`j zu$8eT00Vz#Mrx)k6Hinn{9@<7OY+n{&(L+oNvK5Mm^f7IO;0Zol~Pe@M1o4!r${>| zDPe_HC*U(_(W<_1^mZl3l(thGI%=Gz^ja}AN*r$N&H;Q?i=*4dakP5B8h zCicHDjsC!Lp0@Bk&;@00D7&Caj6`c!+GIA{nc^(bqnUx1ijY%2A8#<;tr;Naud<-Y zTlo@pzYZ-px`|hE$mncj8NySc4O{mXS}kJ^Q*>%S-5Y`2P4Fc9=O*9Vb|rY?NNOnq z4m`dc-9yel{QiG(HDy-1iMVRV5D{PDoR5)P@w{}JKm*dH0o}eTW5^j*B4ADFMu--z zrqgU1i;YOZ4&|((j7^yP71TfeLqYu`FSY1HqI>DAOy^QjunS72b6^(pC&(g7Jl&|KJ`sigqs1^U3gN<7Z!iv#K{ZUkRMU zO*kKzaH0ZdKx#OF-r&>;oZ%)MzX|6ifwQu2N_-~t2Im2RGs1*(w+SaCaBfWvCr5?e zr=ZV2(nz#T$eFX18;G-#OZ3#9K%h-~ZZ9-`oH}ar6fh5%V16TDc3`WwX=`7B^W)y& zEEPDS3;^d=6HdLrc{DYgX}!UjEpTMt4>*^ZaIO(JoMe&;pFzFB(F6``DR9P_a3%jSf0Ur4*sQo|Y48ytg5D{@UZ|1jZf6*wIJl#)IJdZF_M zfiuX2^Na~+mB5*u8qWRug>z_6I7O-9czc60OYmX8Qs{HOiO=PN&o*R|-QV_=ejl`7 zID>n_xi2-Gb`=VrLdI)?Po4>9oQcl_!Dnh}I6v+UPLaS7ry<%k*n~4e;AE$UGp#o` zX#z*i>Ja|ftH#9_T%wK0ew!}#Rp`?joPSVhMZO7Vr3q)1z*&$QPJ6#z_~#LUGt`9h zGZW4|0;eQ3oWJx2r$pLygbC+xlRl$`J_cqzyFK=mcHPt)oP2@9j)meC+ma<2nYGDyv&L2THw9@zzlA8Ar+W1VcFow>H*KjH*IXKh1G(y3C=jjX zPqqHUt_}Eys$9VY7%VriLx%TXv8EM9H zRx~K-V>=&T(ZSOX{twmt6Kkr3~4@m@+u;(x~Bo+3y-~iKD~1~y|XvbI|H?fEw1`W zbb2&IA+P?}UbAyp{M(&#a$9HTq){@S*W7A$jyF90aSBRgNjUF_H|U3Pp!T=Y!7 zX?(J@bCL3`xaI3t?$w5(@AidHt_ffO`_QY`?X$R`5tl~^kgte9pjFZTQhe~lKAR87 zux$>~v1YTxcu08D^Q%lAn5lT+1+&A4y$%oLDPyDmEc4Oxp9>GXV8mH>L#=TZ4?y;< zK(MTwNQ_<~wTiB6z7#CNz zgCy;hCGSQL^IP)n^Tdd<T{cvi6Qm&O1tTR$3JAt+W3q4*pzo_MExiMGH{wD?-WuZ@4OZJdXsk$Ph3}(&~smA@wQnp z!P|v^wt2gN``A;dsQ1mDnZ6_{Oq!X1*ui+-s%D4-lTC}~UBazJl}aQHQA2r8zC!c= zicL(Yf~%|y@^Ie8p9+_)HSRZG47Rw;j2*!0b`yZ$92$CnNJy;}3!G)Uu>D+|4zdSG zR50S%Um>U+#j5|KFEV8Ee1{7NY~vEvh8Z)cO$q;CadT+JOs1?S#4kL=hX3->8EFSV zBJs^%W~BJ$tL8UfG{3n{ee-bR0|{14_02H{`OQ(OzIlrI&0_PLMe3WwjRn1ZbNOEm zuAR@Pr)cL<<~I*Bzd2ZabA*xE+c!O5@0+IW$$1TH2-TG*NLL<7SC;O`Fbxz(b3<$yiT)>D>squ^r`8v8guD|`s1 zRR`nMsdFmym-V{~8+hi!afOYDpB2gplJY}&fT>ItXdv95OqOBBv1Dpys5pJ1{3W|bt7$N+e?mj!$D1D z`(eIx=EX%^SWWLTWDfmU4Vg?XP&tQ7Sj#ZR?nONA<4{)LRw{Zz;PUCnC+`?xk z+WiX!gr3svI0i1zU*-p$PZV#W=g-3zAU4MA`2ac*hvU%mq@JdZ-R;B(3*G2*KL`t5 z=$yncJ_qu5Pu1V@%o;;i5r?iCC$9IZaU;#f<(iEfsv4JVOd}|!a}Yg%J=)lIS1N@l z1wBik=OU^Bm1!jX8m4pyJ3I0%`$Pj*u?F73b%g7#8kN5iG4ga%jlNY}fNah?i&ZgiYCYF6nEHf3B1B?egGbu<$RV(=J9kv1OAB=!op6=EC zRMAS}Gz#dwV)e~eStH6gD7C-(NKEzHJzVIw2f2i`EaPbFs{@!h(Zpx-$r!$s+!HtO zj7bKZGJD^~P)$zJSJ2M+%ATI%a*B=5_zx65W4VCODO|!@j`4FgpoEVKWe_sFWE9dX zY9PW?{G^HNjW$-E_E6leA806k0_DDwq1c7a4q9g(j@O0GcbjxxWYYOgMdyLWbDx;) z8X$g{FB;i`KMA#N2QxOdQQGx3$&~)vTIq7x@H!C5O<8F7`CYrEh3cd}L57GgQ$Ad2 zA~V%Q=3<2m=iOPzPQH5ue3uEL{F7EJIhZr}Z*7$H0V4R#U^VdU6 z&s~%d87Gw@gYQ;Kjr=5t`fl@lE`C6u^)h31QByb(*qF^K(pGMM(qKu&11L8SqaFwg z%@C4&Q!Sup?{*n$tve-0i7iPJGOfU*&mfaN!?=XC!N$2C*<(#bqCLPGSVBbC8sk{M zbuxPjebUCl;wd}U5_UQp1SA(1IGDUN$sS@W4b?|~=RzMn$0e-g882`=f%MPe>}5;L z0sGx*8{3YfjAntAaTdef{${FcFTB0_3!7&w4-#SSY8#W`nvc1vf!mV3#`H;C_ILj@WTkR z=+RtcnRljqR(HCR3eGhPUTqeUZ)D?7;DXfuO}6pZ5F)BEO@OdIMDdDS#WJq!OdpDHnU*6DmchkXcqiK zQo)zaf~{u34XWTF##FOlD5>Cjv*2@PK`Ad&{xN33SxE)gnFXIU3%00&gN=Rf)9TcN zwX+Mq)4RlYobs_XHg2~0Jj9+1U41hbIwr_P&OEzRP-HNkXZ!&db<4(kCY^th4Ir@s z$={{`^yLD8L%4*szQ!;MK<8+_N&#wCYq+mHaG-+lvPzXD=7W-_WWPWQ=X~!YrY)5o zGM;z#<7&I0TmEh#U}D~9;q1I|AZ<7EiZBI?SO5gIvsL#SR35e&0;6HSUzp_3O>+E9 z$T6kA;p4CciwL*i#(24^8jt&bsMW_+wL?uJWST_C5h9#}_nN9Ev1EP^dk)4G;+xNp zQZs#XiFTwcK}3fVrOFfb4hT=f0lW==S>q(iQZ$|LnRiz_Ia(6$8kc;3(d zo7(k__{=`Q%iggPUK+iCB1AGKKy)H4{GvNAPKMv*rS*em43ePMtmT*j;?2vkkMI{0 zkm)X`N~PL|xKK_)g40-;gtZ0|qRlcMxtmUetFiE8JSK~`o%p-@3%}>8Gf$NEpaRQ2 z*xkaQGxN3Z?9AuW3b=Q?L7E$18H+#t`aSWA3ALrP`o@}S82Ag1m)=>gMRsQex1E9Cd7Bm<+$iB2Ay0eJ zlB@<#dzl>C$BD%f))6GT zDIUW!*+`zSa;zX73BGj(DYCP)@Zqa9eLM?$&znVBurUMODSckQTHl*xwNVMpYVo{T zwwO@Qo&F)xbNvWIULlLfo&7xpOMxc)XuZ*2YTybEG+-Ju|t4CTZIEc$4taSECiZA{B*%{7it<0Cl@fJCr zG`P>gtgCo$Z8~v^B?}^5Qc7a1+|pYs3spzg8p*j_DVYWWor8)!)+1A{hvk zUe%g}EG;M{9&dtsjL>QTDkNdY#%O?R!NLj#HB7Sj%QObr9FnloI&(<(w9#4me&@RA zQ_~f}f37HuDtyS_*C@tozfPI(n{%~_HwaFxc*9TfuQ&b2@F`qnZ|O+GL%}TGht}=E zADaY(xmtJ<=`dRZTW!JFWy$n4n6$IKmNBGajejVadzCnsFDZf3kcs`xji+->4jmoq8Yi`!*RD`iL7T zsg-WgHm#+=F^grs=&rJM!G}_Jnqcxg0;UOhAWbhFF&aqBN}JZMsAM!1bN8ZFxN(YS0GjO zHA2kNrcQd|_kH6HbRXBZZ{ym@Gx{saf7Y1F>!qML5HNb1_-kwlXOn&r=yd=!V0m;e>zVi1z+Rn~QybuE``chKE=C%8L9 zfaR%F!)lY!tOEMsv-Zkd;`+JGc@S#rGpJLMZJFdkkM%7-E0f5mU=!kPL*P?ErfcRA zrT;Q(jg$rq3r711?hZ4vaew3Uxpq*i>2%X`Yg4(n>#qx#<+$LbRfnhKRwEo`!_6B$ zFQ03rH#{ZV=+AV}jqjx0$efdl>BvydDdy!=^HRpeCX4_#?n4z}_C?1_AfcYun$OW4 zI-fJP*m5KnL$d1=iIuBL?J6n9+uTHsH;JjHPY^aaqo0<3dy9T+qu-`yazv`Mw<03_CO{4`uAXD}hmlo- zt?>66=So+dv{SW)#C+ii9mnE-F_fG4<%W4`!bfsLnBRo;+*Fl*DA_^#xx>{CW9JXl z$U0S?90KD!mTrrk(jD5S7qsBMbXT1UK9@lED9v*}lZ&r)@XP-5Pjxq>h7 z>!jDvgWa+Y+x&eR9E@i$1lS{%)y5;>nVC$FGz!+qcCz zo!9BHLGipNe+g4WX`XR)vksc{JpVuQoKxaSSHO&`6?=)eNu}pVCFbt?d4IsU-~K@Nc}wO7`<)5T=~ds$yLPll z8m)ALnxEGYo5#AkOIcMul;fsg;yL*CHSqznV-yIbPHfON2?!N;MH*~oxahg;lP7;# z-BWAzSG}~y7jnK-nDj04``vXk_Ej|Ww9&|3RFd=PV21?Tu}Ha0_YPjFMNv@{v?57I zQT%0=*Q^R$3w-2R4^J(?Mv!e>E|Q{Ct16TU zqbcX9_(EQFDpS`w(r0okQ$FA*+qEDl9uPi?e)uwTa7uvltKT#4x&8iCqW^Q?Aoric zo2tR8kI2=e=^sGbsVqD%JQ8+gTAS(g$Q>LTo3F;tVOppfcOy<Ya&nNtjj!ZgY zioj%0Ck!#0ewxa`*9lQ&cGdy@s`g8x`OmhY(@mHsWa<#3BVtACY|1wkE5C!rDa8sV zfCIR@N`FMRUXtje)3L1c8}8faAx*4z58+2MBmMH?LW zyuPXHEJ`_#zQ(-^RX0)EJ!-X8{Il-GQ~7-$_hHBFYCsh_mNKWEBUqiKR}|lp9h74X z^|_>aF0GH>#zyB_b zt)(!Nks&$$sv50~!L^HaU^CP&{{Yr&G=9gbA~e0Ac99qo^~*n34}YQ_7AnahlwwH= zBhKiR5f4C!zobXEN+MkZB=X6}6w5g5V@R&vShYTFu-;^LopWcCQb*oK9bw4PST!AU zG@ERGAzLMzB+sU+B=j;dPnG?HO1UdAUJ!rh;L5UI1}Hen3;RVp$cfi?VT=b#CUZHnYu4z~f^rh^`-UuI8!nzBv$F>FHuXwCtu3N8$P>)<=RsZ z5!`D0W46%DIg|2iri{rGm@jFOJz2icI5f{yVnYoNXk-Uq1ABLEh_eX#*Y1q@S*=;< z8>9kS#fAU@9J03}SN2yP>^b7T<9z|?LzOE*-^1$Sy2k06Be4)L`^czc1!v4F5?O9oooJf(43NZ-aS9&t!lxS`2n)s<($uJIt zNE~JqGUZrV?pojvGp94|5F1IUDhFJJGDxxPcX&hDQCa=pDIc@{neJ$(NDxzzIc zvwm+){8sXRR|FsNw53U+*_;>Z*VxbGccsjbeGAoun&4xVh`_i@jJ_3H{Ku;N2F3#O zr=&+)Yus_G5=Yly(Nw-4iJjcuD57Mh<*)OK@#J*b|8Uhk1kan$hgr}$_IbirhhaGy zVj_`YJzvQ4&v_nqzRF(_j=z`Y1+Ln$c*@{Au)}J>GtvTsSES{_zUQ7}4wF8{!l}}+ zWU*cy7@>uy9Ns!9S8TSL9CIG(-#V#4em$NZJ6t^>g-OUk5dp$Gxy0T+sc}E5x3JuP z|EpW=FFOxLD9|Sodh;r@mg$^*MF!4VW82w#;yV`49DF;|KyYROjhHFMr&0UotVBOC zdxa)DF4;lWc^ zML*u?8d(dRv{fGl`mNf#IfAszqIf~tqL;}^` zaAu|JqSdaEm1#9KHFiGq8rO}H8do5##<(0x;Aof1t zC3@n!xzU|J`9S)UM6_hwrb{1z5>=(-e~!3=+sw|Rk%%as(0?1e6&vZijkLC(99T5a zjd8)B?Tt6mj{))oZtxbjQzk$zRgO;K*P3eK_Xxmz#T$H%_Ueiz|L6pLR(Q!I( ztv;nM1HuIb0^wb_V<_z4r{vN>5#c;hqRCwli+CbGe|%pR;}2Cx}zLv_Wg)vk$~ z0MgF~qJ#M){MjAdMsIP%ThSDl?=9X)PoNTjF7W6{Uvaz7u~E<+)xAIcc7F;dV1{c7 zybqgzY{XwI^f+41jDsmaHqy*dv0i9bK}P+WrHWd~Z@-&v{Mt~kFK+MB-)}-f_s&SV zAJr^#8pD`gb=5u3)5Lgo)jiHndvJaz9ng-aZxdNrH`)W7Q*t^1qi*TyS#9l0;3TjCr!$w zP~g4&v{jf`@a=4we~2Y7Q{we+lP(8lOZq%n`Uwwpk$%2#<{-*ovi1)W(Q1z$FTMO3 zrMowU@-VR~f2b10iGGn9pY(*Uukq;-;eYu|%~FL7^OuO?PVP2YTNCkzjA-BPt61Z8 zO>CzFr%DI*?0u2p8XS76%nHK7_I$AFi$EHjY|jPu`~~xVGx_gJh5xOc_$PDkH^86$ zR5hz5o-J%ADEBr66Q=Q z{Dh-mr<_@V5J>0`uDU<;CTz?Jw^~n{$C8CjrV^$-q+K<0SbK-eRGIK+Gh{$mh_rzY zh#IeBgA%gP;_y|f{WcHwX#d4Bh4p0TZiCWp>^Hb3`r9S_Eo#?y(ch+2?dNTwd!PAQMz$S$L;saxuwRr_vCXZ$8k;xK;)62Cul-I!kE>U?kh?tE{S-`r?_ z$9%szu@NZaBN+jXYfS#Rj`h!5UG%5_)0h93>&tWAl>UyW#gTa`Lc3Z}qK??>-5boM zXK(9Wgt1!X9-`KttYu`0(|w_Pg1yi^*cGn$xR`5jWWUm1Ot&DV1MEQA1g(_oTYF*K zQ{3BYTCY9(cVGYf&sopv&W&5UjK}|5&xi`^s{6n7j5WjjdoC=V+hwA#ueP0zJUwD( zepM^a@DH&MIzI28jpgnPM4Vn5T)t%zs!!S^H+G6f4bIWP9nZjls9mgKILndX#qUW7(gH7-y(?+o$*S zK4pK1rMuhpe493^$vX;vV5273kv)IfTn9>tX+_<%O^dgAM@78#O@VT33LPc>q25R| z(>|aFZFSTd-za>qqa4e)+{AIm?Y{apx9gsWn;la(+pIk{WxJx+x#!u_VRS0dBGD19`o(~dIClY6t*=quGUO`cNh43#gsbFM z8p8B6FAS5w@=|DQCBkllLCJ^VBtz5fgO9ESO8eeHQU_$=!uw zMymZJz40w)ZDeXgc1tA{zQ?QT@*@^ywPcLtRHY?#s+2E0GksjT`*~dTIHqQq;a*-s zUAO*WC($GSbb1pk6kOHETb~uk_cS;-6N(-mt$go!~a7 zdr5QbR84&Xq?r?}xi7pHKqVMlt5`aJv<5&m*Juf4oDYvs``<6aaUq+ZAP_5cgUc>t|r$3TGbXZb;XD(3H=kUuqtcUH9e42vEQx5+VbyXFO&bw&v9&3 zm(N+Xc2cV{<3)Evc2&c4&P)|g=&6Kvl@Q)lNqARRZ|H6#^nd41pZ>ZxbSdYTUB?dN z+>1EP$>W`^ZU1SBp3x~yzH#BL3TM5VN(3Cbj?TzpS>2iF1rEwR& zX+Hf4C9gc3^Me2qFWM3gimx2&(KlGa0;deO>t_+)xZqpxaVM;`%0!W(f6(_iFE zlAVlS1;&+9826|dN%=M`XNRerq48bxY$`flVC7^iDQ)!5G;nyXS`sDIDNbXqb5;c# z`)c>Gc`?6Qq;>-sK7AB_yrC)EAeuKga|>g>Ft{`xV>92sZJ3wMen!wlb-2b(8B5`_(v2gbF6B5@CD5m( z&sZ&dWqSRGx1G3TQo8h|;MU+k4!dh_D?&#>Dj7{aIg;kgWI34K(BHMp%>0Ir!1;g1 zvp)Dqy5`ubIbP9ZKLpwEl#D7)*Fz*%Y5JMjwPhv# zi#+<7nQqP`UD(IHYfHj*^^DFCN${X*jBZB>7ez zQ{zR3rHny|rSLdf)L^39)ELFIJ(PjD*&LG7lL#D{H`quk3eQc%c2Ytyw2pX$yQFWJRMAY;mMpA{PJ1h0j0)t1-SVs zneJtn9*g6HP`^@qZLYVEtqR(?qrWLb?x$WCUcDv1IyASy-Hl=KWyQC459uR?OxAp2 zF>EKhPC!%fAlzWrMvGnB60^rk_8bGdveC6c%`w8O?)Zxy6yE|ZxEE1#I1_`JW)il2 zNwKH!Uto?c-VUv#pkqGQp3B_j3c`dtl^_SujW6!{*L z%uCEO!tCkBH8^ao)oi@uY+kSvzf!sYR6}D034cD#cD4boj-5% zgfmet+p8VTXH&v>t6X)(Pqgl*x}At8%t16q`TSw)s={4rWalJ@L(op|%+)f_IodcX z%s3SnVp`TUGphKqclX6h&-)6_3?Ru-GZ zEEF2O^(zCV?%+PP)-<}THCOp~y~*gh)@)?0+2}rM!;+?0(S$UXPhdk*`-gqyXWaT= z?57hXpNRQrDUTNEv0BrOsWM3{Fxc?SOQcvn80z<4Haf+0+P37j6$d}HTHoT+NnXdv zdK&|3-TEj*3tuusEnBUXY7eGZiuV@l)*EGch{Nn~(NU$|({d1l8doiqtZ}E0iLDgB zxotk)*YZl7={8wfR&cl5pA&XJO@4!U&dQT^#vGN)5aSQ1*>7iawyXX<0j3{jStryI zNSh!FAy@rcd6igTQo?PH6)Y8*rK@9OlS~v?EO3U21e`pEqj>(miwEGGzOewBLE!{pFW@& z=AKkLJ{?YH&L>O0J;pZq94sK$s9|>VDWr*wV7_)JX*(tI z$>f-Wsd<$o$1~-#nPZ=Hy**fSG1GVNqu_u3o7#n(r0d{tGRugT(6jPu)P!n9ZB=3n z(G8#Eik6e?0(mmDa&hBx)fK`}p`pCXsd z1v@fb|M6$wm0ei^=2wo<#e`FSUm4H?moAUnWioTJJ^e}mO{I$Gl3GO6edu3U)i6*#Ik`0p$Z0XgEJz7LidhB41%h9R zTY0XEB8;n?gpL|}s?_W@sGP!qA6aW$Ew5C(L##MB;c=V{(*lDCg;=}Jk@QYVqIBW;OWeZ6r;7$l zfJC^u05&0vdb4jP2hoPB8io7?#^#fu!J-266pV^hyAKcs@euk(k1z;bJuDP!&}=!n zSknF6Lb{)KzG)zY)fv6eNkX`~M}%l%+<;24+~9=!VnP=Q5&7HNRn z9TMDd!qPiDGTq}3uSM|FBMrP7BbWS4l5ohmq$ z;mrgfx|^$R6he_f?y4Kcji>CS0HT)J;81=sbDS9M$4yn)O+|rhS$ZuwO@{M%`5yh; z0q(_nl%zj~gmmSYj)lAhh-fk5F)@73+SMG@S|lpIGrsb_D%n1mbabw|M|k2|mQ@q# z6TM&EGMi+`LAu(at33Ky*>3cb+lt*4(OZvp>n&8_0N$sFzn9EuZhZ~1gPn?75g=QS zR*E`NRhac>Y6Me8=eRs&^U~#Xmr410Wp->z%cPQYRI}DeV`S2ZRRGbH_9k550aZY{ zCE8wry;FhpuTpl>SYKc0N_pZ%+@J@|KqlH1)GS5)ULM0UCe zqy8Xm3ZtW2lUSK>$42ALNneADk4ISb;Nqd`;kOAq>!mHh375Rr+gQ8?OI3>w{bzHgySq}D%>`n*aem7QGV?hzl~qCBdr;(t9`qp zcFzuuVBlD&9z0Tc9zn?*tYsc`R!Pv(51(NunF%1-s(PaEA;7S3c%OaQs#4-nC-h}| zjXq{cf-&0bsv=x=qdRfLihi-66}2s?*2`@_V^)EqldRv9(Iy&)pTbAD5e*^g?y~VBgThG~CU9oBIFfeMYI&Mu( zXi_G(5w2OGL!%>TTlkK&qIg`b@#c9J?@3D=ls0#~6mLbts0A$7!nAC4ElOi8U2%S0 z{+wY}JBIAS@VbeGop;n)<1JW9jsrl1tu+RpCDKmf4olY=mzVHEv`aal>oS704;1qJ zor{4UW5(3mf)kE@r?)Y4Vsp}%>72g~EjC9!2UPDz1u3P)Jx0zE>Y+J-Ne_KPZOin9 zVB&$b4}aT{wmhv++(z5s;VmmhWU?u)7QmlGpN{jX%^g9Trw>&uQ$(ehqOvsPz z5K?Y`>!>MBb~Fl_^H4(2)TD>r*86LgJoAZmVkjEp@CRT2fT0LotL1 zI4DI)ok3}>j6G#11hUP&)Yu45*^TM)3-eZ5%(Y}P&8i;W=-su2cn?RlzRtrZXUGCb z6bxy}3}eYL!gyG4$=0$!77^Fdm>E`M$|WDwyvd6r9NZS?bi6Id#|YN(84;tO7Js3} z-M_IW6P&^%FCtBPzrs1~YZX|xa@mB-PaRI`Rjvvjry*-Pw@4r7Yq zfVGR$V~@0)S(4s*ruwGJ3&$#cmZ(;Aw`o7Oc10z(S<-m>cif^wcS-uDwN|#NNa!R( zbG05-r}c?0Eg3R53e(A~;;LKAWLwRicwG}W?y`JWofsGFO}etnl{&rNs5n8ozY2AF zYC@epQ8*Jl+T0_r)>o;-Q7;&eFkz#vVmj$lcDYzgF2`aLy$-OxnKQC&!$}@i3Rm43 z@>Qi>XQ_GL2fKmf zbG)o4yz$7Svcm@kc8PzK!nWF47@)-)8-}UHKtFfc737>#Y!7~uJ)vV_6YZuZH4`$W zQC+ltsr?gG+f`Q}!{z_6_b%{JRo4P{l9@n&gcFo#6wxTLO%2d!P?HX7Cd|l;OcWm| zUSC)gZL4icW_Tz_a1zXLJe5|gZLhZWZEwBRK9q;A3}6!80hEVS2|mv-sQ4lYD)ar< zK4&HgB#5=`cfb2xeoW@fIs5F#+H0-7_F8MN#d}(FeERPdBO_aw8TG1M= zUsnQwiof^oK+G@D2DZHJvZcRyT&n=w_7};o(mRwQForq`Rp8e}w<<^?I{4;_k)rCu zQv`332}{vnp}aC%Q9sDs#Eu6na7v~ChPfkPoE~}EAu?%|=G`s4L#ipexQHMw==`q4 zl0p-B8_b`Tt#*vV?0H)UiYe?~Z)$8TV~xBfGV6DyQ8P+8jC6s>O@fbt0+JMofDp6P z8em={Q7O*0gG(h=;)~(vmvR1lP*sNhME;7=lH;-B1^RPYW#;_|F6E&z)ugs$Zpkz)&`~?L&58xH)Q$yHQ5G^K>fC}O#lIQRi$MA#b@NN_MUpHvHST;n4iMwc zPbdRBL${>7@OjH#>I(p?o^;?wYir15hfbVc3Nv~FC2U4ZcFASz+%*qWvVt$ni7$(L z?y$|i5u1Po3UOJ|2sC90xUjg5i)XhU7Q}E?<;wktf<0K{bpTB#t zFOdBCZ{2XBYybI8kX{Y#i2KjKp4!XEey(mFINY-{@^*nSNDgCW$?t0 zvfM`$e}%Ow*2u~lnY&lGtNA^)sxVa#aXk^5IfzKGI1nSCSCs`^O@bcjz~L zdf=9)8&hdC&t$WR27sF#T~Vh_Qa7y`NGbsEJk{^SDqK_ahAnSu)=PxB1BCY@&~2E4X;l3mFK*%$&uFmpdxWS-^UWe zQWIXo^So8o^Y$HL^dEsAea>IF)3uOy;Sdx%F<0EASoJ%=7j22MuAb|b_0nw%Q-Mgu zKHsSmO>0SIw&x@LE52{*l!G{ih9yy`OzwbVh#e^+kG@4)vcdfH_Mo zo8znd1d{zAT$y`tc9yneb!>FL>@zZ^Mfinuosl|PnLM}9WeZH|6gIc^Mboc5(GB5+ zt(!N{Il&}4cm#FQ8^e1c=Z)&7rBjf#%XaHM>KJCilX69cYAH}BqCg$>`;-E;f+#)6 zJW(?nv4=^KSUo2QShNOZ=N6EZ2s~n91`)OBY!t&p(CYke7B1tw3=CefHOKE@qj^1# z!W{>L#q#4)e)y(t=h7Gbq@P(S&r(6Ob`gFXSHftVg9}XyE6NYHj7`@T{6eH#UOi6L zBY8^sF~F{r$iW-UPtWR6={x+SQi7>A`lD|-svKi>mF`4pDw}&1hPDliyu@RS%T)VC zk&LYr#b!N|jpx!xtkxxWT^ulig=5^>bAy#-W}A8202xIhn1kbFqRB;>IlJRU3Jv3h z;qhS15UV7TdwU*I-o7|ee18R}{>(6(2QN`khz8gcisMa#j7#~tiQ)Yp7dt)=oqIgD z^oQD#9agxhKVp!8Gm3#(>HMO{c5~;5Wx*bJ`>^#ZiR*8z?+e%82M@a09KiMdY#=@# z*E`rr9;P~dUETc0aXl7?CoqoKM_;qXlk|J5PVt`#ANwVn30WQBtx84l?i1}RdL-P<|Y3_`Z7 zC$iTIe0fXqT;ebcb*r0S!YrmB zB>mDF&ZJ9pNA(4BjlFDIbW2VSQLLCBDZP6udLKo#vdDFVaqRg~N2c4+u;1p~ga{scEt3)E|w-{m@atS^#N3j#>(k({6N zlJ3ijx194GLTbEhrrxp9@)870qT5%9_BUc#eqrQ08Zo+$y+2OfNG zruoBg!p5=DswV_Z6dZGB?MtMAVTVEs=YUcVKeNhGd(Q4!|H+PfBtu6b7U>oaBp z%N;(~#^4AhH-lrf-RJV=+|*q9$j|kLg?=omy$KkWpcMuLZv(!VO04@^$F4lgy^4ydkXQh(XuZpa5t>Z6;! zq*0kcbiXF7`UmhoXapzNESutNV&mC089d|ra`{$l#Xii_xqLD!u(b*|p;EzNUUc-^ z30-RrmEoaLxJ<>f7ey|5y8^MBGph0UZeD?fPFYdJhG|8%7vz%DPuym+G`>JCD%25w zE^g&hZGIo6k0AIghK>t%U$fEkeiH64Bh{^XM5yOj@);qcoq=?!*kF%olCi!fQnD}@ zUiqPVCGRrK;6d_w<@mWU-$N!O=JI)5)0OU=1{xR;`>HI(7Cb?S*u_Kmss8a}fz-{n zL(1?yLw>Iyo>8*AVw*i=9bu&wZmFdf9965Axu#$5>+GJPJ=a+kXR7Bq`@LTt%{n_o z#-|op)>^u7jJ?#F@1a1j*S{VUs>@kgiZK--Kvme)8>umn7 z<(I6p=kStRXI~PSE9$WunWq|2%kD#HsjX){r}-cL)sx?XgR+(h?N#Y5csWWQ42$*@ zEt=nKSJZcgBwZ1|be%*zO=iHl%PEgwp|5FNzVauppr4|PIdqG0m9?2XLXR!}r8=-f zI-t@p3^3o?ui74{8t9!%ePRiShtw^&6+YEcJRNe4swkZ<+72hY*Zn$4JBqJez!-bs zSv|@O>%GijFvfFqb#R;o(XYU)wf zU&9kvHFB7hWEqA~q2S&JxJ~4bL*UWdPg}Me{+z9#!}cjGKyjcxbIIMpX%w36$pO}_ zGu+RIJ5DezEzmApqmrG_pmFK*;R7ca?gDMR+RE54Nu6V*F;=YYmUYb>i;|`E9fo0L9|pjyo!tCEOC?GB zM8*|%jSig|Fvev}^Olzdzq&k^n?A#k!FY^|66X6K%5-b>Z%biMRH21`EqC=6VmmF46?`o0qG~Lse2htHXyd zL3yq26fXS6^%-OnHu5%1XUbS`+(^f=@u?p#nuL_fBz2G4BuT^ZiZVMlBVTel*_k|gA$bmTvQZrr$p|QaHm4WPp_Qlk5o*QyfbDEWZDb;A2zsNZUFQ7dnba-D4d^J z#DXUtyLE*X+`(0?GjnFS_yeJlMKHqqv?#3bdWE9>(#>uhS)kL?I)pgb*&$JtfMUgH zR8{7AoPVSy(XzgkNgwC0lBRlbW$V#1Wyi*s*os?W5D-B2I`jA5s-))3yks})t$sh- zN}X~7R)2CkS4!SSPQ$B7vTDr|-w+(triko#x;DY;npB_iff2j& zv~c;j&`9{i>0ZGdfu>G9}=LWPz-( zC3~9p3GahpPV_Ep_cX`}SHp*JDUK&bb)jEhFMTTu7_}l_2aHGLSfn}UJ&WmFKob%f zAfVGIr-+-UU09xdCr66sCuBZqE`kU6^;K2HtF$F@mSSjH@fuNCG+HVPka&~SDvYQp zP~6m4p~ol$i!`cgEp};6*T_oo0+TB~rQEJqxX-+udn^buD(X1#@2!<3Pi%W!Y$eCa za#p!`rs+m91tG4K63eBFetn%eNA&E5@d!TwKZ7WD&JMNvbdGNajC#54evVO7c72tR zeZG0uyPZiGUrEnmJ9ua{2a4Uq8lom3c(vE4g4A!5glQn@a%XN@f$+Jj;dAsM%kq*5 zWiAz$9c@Wtm2nBn_{vDXRLAmYNM>>$4O9`ufYHXTQ;n%no4LoNaS%+adzjAI12Eq} zZ08-76HZ%FU(2Iu@>~4D0(!mJ63`$wCKurGo5BY|A*>w_+|3iCQr*9ZMR-lPGZ-4l z{kp^MPYVs57JhaC_sc>9r+KCJT7KB~Mumn*5HNY?8C7mY>|AFtn!190GM59URy1wW@xUs(sds$~1e* zN6rfEx7-eV#siP=G~mDm3iFHE%qyOS!NSRuDh`fVD!3AGb<_~`Do|KvPZj6or>m+% zmy*<&QIxR)7sc5MfO{Z;l)be|Uq!4akf|EI9yey0^U|c_p{$q*`=A)4BScw{T+glq zh1MN<(=9ju@89P_KrM~J=akM2-ntCO^)&OZA9PA4$O%f7dK&BTJ}sJ#ZA7xOaMQ>v z(ph5&nBLEv5vQp2R)<5@FIQUdyk$6a1y7|GN=R|@xVWers>x@ac=48?Nv0;M5a?PDA5>~pFn4FnWN*Uq# zrK*tZpD6THSE2i)P!U{R3Jq3;I;2pJ`NLG9IGc{VpWMe}3%_TJBOb0+G@l=UCKL~r z=o7M8Sj{__CEh+2kl-SVo1IU8MS1pr=8Ig&WMJ(5*r%JqJ=U5_S;6?Gi1`v*0Wnzb zF$J7!&DYfT2J>b0{emUKsEu7}qw+6_PSFz~VfA+fm>^H20*4-7fgG&@IejFzE&vz9 z%_s)&)sFd$d5momVcNRc8YyO29HSa-2f)4N(tir>Szi~&^z;RX@xbHRKRy53g4TlnU&`rXDi3e)b{3%#i0ydCD%LM}QFzi4W>!}f(q z(Gr4(o}Oo^Ph0jo)L7=9-xQGp^|eCl;j&4cB98pG%2HEJ!`&SD14gwoQZ~&S`AWdJ zlZbu&-OpaixB_}k_Dvah*>SD5$VG1Pz|B1OW=WmAK?%<0iwOW_jCy@4VQh@deD&xh zkt=sA4USeX+si8bssgH&XcWb*hzJwxc}BHNUBAHE%%NI|PUSoj(P~3alfL*0yE- zUdia?(=(@q;b7LTN&?~_h$#I^C$KCK?eswNQ*OtmioiJ)|ADqlM4YUm*k#;!R#4Lo z@2cOa)e&1IO>)TuwECN^%UK!YwEC;hid9Kf@nT@w`iK6pSJN0jHn0n0G?KuoTi$Y4%YD5$4>X{U8pp zm=deNv3c@FxH%uG?Jh~KmqGjEXbnbK3kIm~yS1iH||!}zNXyCL=6=B#k*FAB?UmQpMMC^rbOb-lL4f&5Jf z5Y7r&*INAtpoyF!*-Y*7%10_U`n`oR4YDP@T-1a({-}NB{8chvUHiZ5R>IP7XJt#F z1Y;o}SlPXWvTJlJLDeV6GL`9ueQ$*Tyz+gJo^Jfqt-lg5W)?BM6@D^BQ%eOz%*G2k zcILW^Tc94cXAp2`514;~8lN28+h~elE=yr15oP0y4*#Zb6Z($KyZ+2UocdD8HTD%z z?C3AVM)Pexj+}d#96K9%=--L|U#6|YXooF-tGLi^lhRf z{oSv7E+`VkTJdUa$&d?~umSGkR++GPLIy3}&ztq7^llna z=cbJF8(ybBLdT$_@?haNLr(M!5}Ksi9E+CVqDY;p3)0Ha>UYuu+3XPmF)|(jX{%qq zxWKJDx0a93CTKJl?gZyyvbRd!GVBZC1DSK$;>UuG!NLBiC^(#3{Tz#?06WY~t^RJQ zZ+y1b@ZAB*m(XWfwr;;RL&BO$tbx0IMtuRdOVQs#6J|d1p>LqNZ`co(CwQ8OPCJ!l zA7`n~dDGdoJxI>0WwJz?Q2t9{L8NKPr_sr)nbE8MMtYZ8w29BjZnspCpH@ zLIY%gk?}+0Il@jt{jHy@dU^Hq3qqP;IB)Xdf@R7+kFHFUU7=5eW?`|BKv_|80?hcU z!U#~#pn6C`(%i~T?s?n6ZLCyKA1Vg)X4Orq&7BH-GqE7{J@z~;v zzLtrajQYP(#>$z6msw~mefdV2S)65zYKx?4}X^cO)REbc+aTdap67b z!9n2zX9lyCC1s^j*uu)Yn`uSIi#4oFttw@f@VVsV?io4)bK}^2h)I-(KupD41D z^?g^>hx}tqQgw}1b%nl_{4FtD2)%T5vixB6Jb0lzkE4vXdKyrrf^3tmUgoP>LpZ2d zzeO8NE!fMg->c{Wza8#{A6G1Fio=SmdYqJ#7_02Ej~5De!Gwgu+oZ?ySILxir||#R zsR8^g3*V8O5$sQ&!?<4rh%@-WL9V{lCL}zHCPrnTPMdd;4Q0X%((Z*nP5jY0V382zhUIBChxO+1*cl;<_TTU0LZtAD8c>`*Ym?|^?zhe=j$emv2_R8g=Zc{LtATZMT#l&7< z9rj}k3sAh&a2f@GcZQN7r+Ej)SECCPS2j+9(6Dwu$aV3pKI6jm!4405bXDZBC3l) zCcLVEU`J;)#@{+ZcRsfdU$gq~7`V{A4`)apwB@@qYLY$J_7C-dwdA^oSxf9Z50RYj zi72d#qlz)lc2pU8SNGFA;ybao$ebn8gV^JERV_-0mt41)e?>ACVTT`Shc9ik=cQh? zT*mHZIRrKW19d8>Kpn3jz8XP5f@He@z+BbfR-2j2OPtVwa(p9J#z$jbr@aaZQd}~P z$%99;MZ)qzd|&g#x78}!Ut2;i;;kZGU5mFB^KoQvD!7-YJTn7uX!Um?VUpEB1(cmB z9r&KCxKmfl{>tYWfn~nOlAk;?f#0g&l65e0{@z+ae?4<$O>(u~hhl9iuEniL)-C1_ z-=LB4>7_fZW^k}aU8QsO$T>Sc&!(l4A3Gk3J95~qWQ`E!Vewsah3a+G{8tyXpQrRXU=X^)zt$gA>8Dy>yHPvCJpJk>6 z;oB3@3MX%o2~(`(Ykhh|cx`MlHlZU>Zr3B5hP(T?6wu)g=>Y0pRQYjTaA3lfsY~P^36g+y3}Cq6s4!GTjNcY_(``Ce^Y7@T`Dze zyWJ0}YvnK_oft2TvB2tC0;~BkwIP~lmCxnY^R-mqE8b|1weIChF@BD+ehP%mQ>|-( zkNF51TA%S(*Xcty;8w9Lat59+5XO!%M|G(l&x^)txdDO!S z1vko7;y(MU`PVYu1WA(+LFaWz{Zjr+%T{G%*2qiDJn!Y}>V-u}`#I)k;xmhAyR%h5 zaG0lv)Nvwhjb-KCml`eC&HR{ooy|=*RpMEcEaN;BzKR(UQoB7^Y;| zHI~ZaqAQiYo_QR&Ro_CqTKyDMmZ6cBZSLn=l~FKn@sH^&a^krt`f#eV9)8MVAZk#K z1>l~LIsszFsD06qJJZz{aaV&+TqrZ-CQ`c3^>T2v> zzoe{tasrgbX}!1YcUFqbS`*cnVwdr!mybg@y0 zBg6Y$`49d2tA72{fa|T9r)iS^QIrq*Mt5RceIwsK?c%jQ$7c%f56*a9sd$@wu2+ME zzIlhE8O5(^Pi1LO4RthRI~v#b0wUQO{bNx< zI6;SFRj{B6<~J-*yheKphpMNthmgo>NCU_0F0*=Ic2RLpd`P(n&EM-okYyo1@Es=8 z(zWMuhwxVfHX^!U0Am?$Kg9UhjMv!czo%xWbz^5DHj;g##L#=Is{V~20khVbKG>*u z!XUl4mx^16c?*k;+_|?<^g#B_%eYB0nGEgj7&rao(26`%SRoB-k010!9xE)9YhWJv zTVV;8qLz84u!t*l1YTl56B_UZe>-}^$@s<+w*MZH!K+-K&A54jF=n)1%$NuLuJ)M) z@VJ><{x+h&SM*#$999}o~q)5)Iak# zq7H+N$2iH)h1SrIAq4c>)|C)sX`Ku*cCGBj8|{4X zea$~FD?FBlOOxYF1kurM@B95%{CfMeMLyRjGluycud*MgVQr(*wN{Vf@e?Ew zF^_=XO!#KEM?U>se=!D+_8Hdw4eFJ7rqA`^^fEewb~Si1wv0gWhQ8WI#Ujj2^EMNw zFg8P=>iVoEf04iVU7zc{8JcR(0!}a<&*Qe=^^V14uxR$L>d&&W)NpSPAnRvF0~fluESlhZG6upT%w! zy*rVQ1YIS}mte5yLIkTNjJiTz{oX<$FA+91*=EdNCG?lnk@Q8bJ&E^!!7sJ`h@#cn z9QpP4CB}+y8v^XDCJ>eNXLHbHKF#*fUJ$NZ+nHFZPX1bwQ|gcusU(71C8otD(cj`q zd>jU^0m;P(;mY13RdEhcB47-NKU!711;2kuR2DjI+9GzM&Vkc#e=__TVhrPS+Me`K zEbg-DOFhS8(yhoZrAQFvA%b-q+|g%@lbmM+Q)>)KAdUgt)9Pml%1R?AVD1jwdC;h2 z{ZV3Hs#81|WWK~g-<)e% zCFm(D_SI-tdz?@u(~AVaA>|LKaE9Ome>MltG7DZz&FG5e)QqMCQK&6QOhk(`L%9_V z4g~A8LG!-ucNK=9d6V03d@>%>CV}fn(hbSDctgk)eW#WNtAp-;$!hkDGeTx+>Eb zr2et{hrpM~0|JWm9WU_Z&*spWL!lKsO@KKZg6j>Kn?oZ!4MWU(k-uzqIhtW~W0z_e zitSmTE+)xd5`P5V15?0UV8i>op3l3%TdTW4F}4&3e6?4YYxQNS7!xaSA9fhrIa9V1 zDc|ONb6@yZ!#z1$`ik1u`jgGn!MKs!*K9Tm)4MOe>_^y?XTCYb7K%NHd5DBpHFAJK z8{#aKe0;fJ=J1sK)rkGNQ2S%L_EaTkdl_gO+5=Rx>Q)CwOj|_sgWBD8gF~I0_v~Mh z9^%BqQ@(WMyt>t)T{71qR3aC&!+zKul;M}&b@R34&EyD<{H^dyn0o$IlBCHvd*|bw z33vE41g4k$#V?m4uz+w;?W&!AqcZWK_B{gSb_||bqt`9SzPw+W&(V}zd}#pHy-Z`Jo2CV$)3j}kV)y?#8wc%~R<&NcjoBZ>hb+sb2zkkh*C4}H zXg_Lp>(SyBZdX*hXQMp1cY#lJd_!V4)pn*!-RUZTpZv^_pBb^=s%C0B9rDu=6Xk+D zb;?g?Ornp=Pt~u?_?>dyPagG)e^0La%XR#X=yay>w<2PmL)4wUPG@eAbs zAh{kCFO_RGB2;GUC_EmqU&6fHOW(er3k}^3^Y1DPR5LF8Rue zkCCqd@lo`!$gbCE=dkVJlGR}HN+hF-MzqCIw{`N&nIBA{3~ZP67I`=wpO=bL=K#iyFjOg?w< zspoSqpZodzjL$FmJj&;BK2Pz8N~k=A^mtPQYD^R#uca)_D6 zxI7V_os||W^d;aF2WAe0Z}0bHo!|_;%cj)_`_Q+9cc+u5m;$8aEK|yI>PVRa@avIC zNMQ+rbhHpZG=72Tvp6}<5b#I{$8zVFzw!!6I5N$rpH|GhyH|udziV8Yi$X_2ppRH# zw<<69BOXFH3aZ<|b1EjKG&kYBQ+#+%uzkI53c*Nk^+o1Zvt*t1AF^b<;KP^LLsCP) zh}@>PVJpcpKV@g3KidFzP$6G+Z>~NoyZvENLwZpNa13PQu+12}i?D9pgxNd%T2^9( zIgjj?fvNitr23a8VyzVR>!jgE@p2)3-lrntwb(~|=69yCot=56&u|mQH9B*kZ|OcH z0RG_y*|yItqb^@Dy%8aiX}rDJv2GnM1jm}+UnVms?(V^X&1nKHGq+38(2f{iKHf~NiGXI<6oGDy7 z43VY_yn5(Edz|||3{NJ4Cl%m{4?LL&o(!Cv#FH%Iu1;YG?$z4@`W}>Gq@Cv+JX)vK zrn$Q_;c7N!rOzSJkw*{B^0Le8Piz;DUJd5df(#ygBNIe|%wAB(BNV$iFttP0^coan zXzhFsL?s`X6IIwA)#}cZ2VHn_UJ`|Tpis+90_Y+C@7@Oun4QlF`s^0;naEUXb(y?s zqfowBXp5I9U1M)}q}7R2iw8|Ggdtt-LLWMB{*)NN?r_RLjUaxg}#0?$K zTrV_?plNPG$y&Numul;asURjE$2f%h$fj;!KXkPuY3?l{MqqSyU-Z`UtN;vpnuj(!}T+g6Abdzxcvt|V| zKnvqIE(JI94{&=KTIj_1Xl1rd4f{U(iG&NdBuSv7&B#+27QU*?6bYf-)T2!EyF4o0 zPgptqWsJ{Pc2pqig(zP}3C)DuKPu&A z+PHqix?f=4hjTb9>8u#5x z7(VY*?9i~74(p6hs7xe?6U{qTrX+}yU=PZ=8LJSI!f>(sY1XEB2op0s=2h%O3H>4u zh=^XgGj@Wyeup~F>8fKpSfyTyk!7f79hk3jx(Yr{!Pr*HkYC!DW}fzptRyW0J){&! z#HZKF$}2axo-fO?TvwO@AzDkAfn%88`>Xv^pD(9>9?b}0Ji~f`*FC!3aDyVmT1y<#Y`z9~!vLnCN_8CFPJAX=o> z>xD@gzcJOMg$0Lp*77Q-7Cw%A_-~8v-5YO^Gq>Tr$VZ&H#ULFa+^xi>nAHL0H&yJD z#3R9h7EM;P2}vF|BT15HUTKk}FMf^rb6B!Xk`=;(5d=~^nClb|o@lnPQV2<^ViV2y zf7?HM=fPN@1^bfg#v^KeZEkbC*$L;jr}jU=Gd1b)dEMrIdsl%wC=j129G(88CjWTx z2K04N`E|09+a7nR$>xd7b^z(Lm)U+ON%J+SMv^o?8KIH`GRaI&!Zc@z=NM~H4<295 z5`61XZ-slCzN5M)bF5M;sd)Sab_kPOf637R0VrWgRIZx$1ChDMOM2$Hr-10qe1DbC z*WEg2Dd(Q+X_$Kf-*5AIk54-vx!<4rn)#{Xv)+wQOFWD6$=RXfJY{otshwZ5Jz|f( zHhzwoyF)R`6ApW9x%bA09`=B}0&a;jMM^g&9dG`SovMiMvZ#yiLshdm&u(1WJyyMs z!$~W#Y8K~y;R+|xEV6Ao)eJ%IMQYxb$dhEm zAd5qam(A70#b~2h`bVNil+C?BGNe|0)hy(vI6exXB_PT*1rR)e{O>Ho^--kcf3t*a z?|DNfn9snbZQ{9Jh!BS$B@v>%7NtPWWw)`9MMU%^PQQVH+L#vm0gLYuuujR3%AVGx zYhoL*#@zEL^rt+q`kUH+agF}vleQV7%rUAT*)pGq7bzQ;c@SZZz0WSuPq;B_a*gXy z&eOQlh--u1T)H`tw|)?Sh7Tuv|LQ~|*B%`YUVo#<6}{^PfYdv^s&RJ{o|2AItfd@b zz4DTbw9=i=OXG&~6!%g&p!rkq%4*t_NC1xgetl@WITF(n<2l}_N@)I#dZ$s9uK9Pk zcHPx14qKeR^t6L!wyzVM%*tz^9G;G98*pep!G{w6R5TE{Z+y@mO?-$&DGOy2^AWmO zEYHsR#5`|(VwPJR0E|(4OE^cq+=k-7pJFJ`TLpYA9Q$$>5B*xOBniAViAI6lCScd% zajm{!GEwyQILg`MX^X&&Z6VF+bd9pp3kiI>c z0sZ4D$NmZW;`T?DWTlzcupeYXN2v+jpucZV=&N^e0Ibi6oG`Vn{ZZZqHamRhy#cn= zYyvoLy{#(?p-C`p4sO#K5 z>S77c>P8#jT)}dm(85I>=5LX=O846e%4>YaqiIAoB2iV4m~yk&&t1|A-7bFwJC^xv zwt&9yB^`KpUNX4$mYfbzHJ#f$J}WJ4;J~Kw+4!`dNv5krlmnvEKg1)LBdz0GsVlV9 zr+-LHum^uDI3+Abv=>1+bRj;%%6{7oW}kN{`s0giL`gc@_>4cRj*Bv&)92biGBbT+ zB5y94g;hsf2bG%K9NN`|ly5|D?R8bJ&IY)JrIzULLzx9>Y16-E9%S$O^Z;NO$v1!T zdxRFXX=Fg?=SBDsH9Pv$m8A*elK$ostU`6vkJJhJVkUQfv_$fhEgMrPUPZG2OK@`3u*v%cdR ze$TfZX*I}oB!@fu@tf%^nL_jrebINRdSoM2@Arl0m_>=u1?KH6T@v@F2!+;h#oL2} zT-!q@E&B*PMLc`i$MTiAjF2v%2#foj%$#~V!rOAd!PMD3G^Yv7&DjX}Vbu6mq(aas z5Gsfyf{UqD=6(Jr zwG2Qrw(-|D^%K87=2PMF-!K=jU1#$7g?4orPs5qT-*Ti?L|^a60zCOwP|j42DN7a# z=c=ZPGEU8Ws8XElB z``8u~&mYA5CsxKzVEU}lmoeFr+#YhDC{!`o63G=+NRsK^m+_;Ws$R<-O0(*07`O_e zPInD|^%fBI+ZLkso7xjm$0|hK@96++NTrVO~o%}v}d_; z_Ce(}XK?rliqHS1V04u1<2Z&umO~|fN#lM`E2HhtuBf#revZvgwqAi1i2Pmz4q4Lb@|0KZAhmOpEu$_Xm_><@q3joAcb_v^X$f;e6{sVm?S&lmU0jBry ziBSkXRIs6?;o4UA2+o!!Pir|-o87X|v+2CTgAM$Ziqfg&GjxgMQW2l%&jHWpK34Ec zrB5ipISr>wGAP{eb9GL_;hTz7wuxC37C>h`(pkwVGgPr}YcfZeZz@|rOCry+i)3Fr zf#&c;-sD$gpJaLv^jWPuY&I;kB(Enq7RqE0YV|7l0xPklwn4BD7j zfCVhe{JJplp4#oC9l5XA`bjxPPRZVS1Nho~ybM$@Rt9Sg^mOx6eY{>hN?DK-GkouG9$!1FGe>ivCqwi_{ImGb4~b5O(jy}L3GCh zQuW1egUlwo@**&j8u;59y8Y+tnG$FWKv)Z_O=j@P;3ySv1Y^-eK9fc1ftiLYQE(JU z2oL~=y2Jb!hZbzckAV0#>!|#NMFU~{rh4gfZ?_aKDS-u9C@>WSVQO-Yp?lIXuY?ib zj>{Cuw=QvdW$K;L34j)@P%A5~?^Njx$3!CiBjd9Yc^P02c*IriPS!9OhT8q$YWI2B zIKYt}(GYI^0~(K3S@@d0l2(GaV3Wb>%*o%NXQk*!yvIvs@`(5Oz|;@qOp5NE$Iagp zMyg7G*B||?Um$WjK_YYBjsO!$9yYe|BE2p)Wy^rHi*!#%5ryCOa=ydS7Kq&Zi$vZf zU_->aMD#0@e(x^3qbQV3Y6bI`Xuai*U%x1y4A7CPrx|s`5gC^iD8Ko6Elgf4j)}bL zC;3?*a@~9SwuSu~y!S=s-fx9On%}9ShSnQsFJxEL&hkEq9$jQ)e|A2jo8Y+j@6x4; zvhv{I#0oNzArkw;2Q%lqBl)v`5SKD~-CikEsXZ0wIR8TJx!;`n1mYy&lZe|@ydvU# zocxHtATDcQYD<-?MZ3?)0BoX)$=uT*O%1i1TD)DVS(wq_$sy!Sl;ACX*M>Rop*Fm0 zINF(n-?5=e_Lf`CyWog2YO44>RUl;1;RAHURGn>@lYYK>d+VIHv7~P#_@+k5d#&BKha$B1I2Qa}dULol+0?#nO+8LiyHr!F(C=GKWzm%1 z@v&EbE1=)r9Qz4C4H(1M-_x16M6Zj>kj5I|MbZlR~+{047-na8Z!-JgtW z;E5f6+?doq?q_Wp?AI%im$If+mXGz%CG7W%^nfe$3oSf{4wA|=8LfP)>PIcg5jEoZ zJjH7yK1|#;^sSQfR6sH%`TRy19vHyNR3?8^z~oG!0mG{)>i6pF&~)98UA$_Ec@vDw zqYUJAVy}zLeNbK!a6c%HAI2mtpx=x}Y+WMn+dG6VwYqjHBjSJYq~{%5BbPfp<)H_) zyTztcJNLeUq4SsKaLJ+K`?@MJDn6p7`&2E3b}bU4Haz#ibnWiPxk`-7N{n;rmpgq5 z1P^gbp^gqUR6QNrOMF-iQg;<|3WkX8lNWR*U?2x4==UmGtX$|kr@=Gu{6w?h{?ul_ zt8vaQPx?4#{7S(~&gc*@e^N8AbnwcHGFR?}&XVLSjp~)CyfVQVA2FWEIv+Gub6Q!; z%sGw9^a!=VlICuO!X3)>+lte1Kb%v}rpVz~&Y%dlN!r5yZTb6p!Om4fm zKLo@Az1V?daN=qDYMI3)FIuyxc5${SVyOq@WMTM=h{!29lr1ZSW5tKy_`Y~jY&35~ z)|*7_kw7XusDc>aR8|3d4!mEK$a{^n$k62jjaK*=rR}iA{VzBc!5Mozw-u_GCQB!h zK*e15Gx~(@i=KIMsl9U66;|+swVoB9<=%}cNy#8NCt)O#wcgL^52F6rOFgN~)l#pP zcv70z1jX~H!sq(9rf^|D_|@2fp#h2USxt@{bPf#;37BEj6<#3eTU^_xZ)3bAa4_sC zmI6@4bSU1gVBrxpJJS3bCKXs8gVm)ZeZ14Paynj5A5Z_WOnB2~OOinPzE|~J+{3q{ zMiEuLjL}lme+SQ`*H!eBFHJtZ!LjbANjPpj^Yh^N;uS{&M=e|jj-+5YnixzzVlYh$ zcMJ^WgvV!POlx-Ju>0ox3S5gXf$I4-RM+S?hS`XOHK{NO-gKcthdcar(4qjT#*vylDl7#bjiHv5S#htb`C$%pp3p!GLRE1y zOBg-Z?v|4zGI4+2m|Dy3EfnwwQLOxpHE{w+hysH6PK9l`a$ieWpd{@7Ro|TNK;Zrg z68b`Cmfe~?&vQslY=y|4q5=Vj&$|PL+I!B*`g42atgLD@_dtBLQo5Pe-a|~%-5j;soz?P zkMq93)R^+v`@k#0>-(~;;d}?#!~wNf2qUw{kV8bkUAkHTE~jF}^rfIBOS<_LRPRhd zY>Dgu7><#1?j;IBq&o0NKSett+rsSKl?y$cn3Lu-qEvsCgPXBA{@03d9owXMB<86&? z;Fnj&*%fWII1>|#h-lU3*Kv3MK+8?jXJy5npa>vptP-8)dYJ>5H>wXTsErsBR#%kG zSyMK5k~Oa2IWnfwy*^uQVk zAFd9|Y*oq%FTJGa#0yX4U9nE!itv*6%{6K~`rPew+uQnqHpJUTrw7q#aeG1)T0p_u zxP&v0#AFpZ{t%*xj2okl$?N!15&8H=6lbw83YtU4tc)kC_oEN52xiuve`4?yp*Fj& zlNhlOVC*7Z)V*&MH>&{h_?;v<#|@HJ=AT4$|1+u){j{0=BNlyBT&RM3#u^)cKMzDG z#6?MhB^{zDWC++h@&8#AHFK=9i-L;E-M57Gwjga8_Qo{xx`wDORv^h1?@TC#SLUhKgAUH6lqB-T zwMZQ~*~!v7mChvdQ&^2JT-cF@DQseiF~NR79jHC{^>s=Kk* z>;MRh=y(yo07ySBi9qkqG6QsH-~6dVpGS`-+ADTcqQT0Q-BNG4l#(`s9Mkh)Qnwhd zWX&4w%2@^Xs`(1G0zz-?^~@o&vkWZ58oj%*@p5=I>!FwB1wDd&tn? z?fsr0jb9?VFnw%Eu$}0j46Xn3hoxenLABpFTYI=M7Li$x zqu*gtOKM$b6H#&Az&UJO#-)o_^TKHS+dfBhVQ%e#lHmTj&6s;#uLLJ89G5sP8lQMx z8jD5f)MfBbjtB)grRQ_(Sm>~N6wC}C92I)*tkv=5DyUoNls?M6Lb>3N<69*xsM^=1 z%#J|)i_W?Qs9s=z5W;qqV1}zhXFV;;pHNG+S_2VJStBi>L4tNhCXZ~YC`mVuMKP_f zjQy7s=4|@v(#EEAj%zf!wM)?3`F`Sawa)DS^l3bf{{>&Z;G=$U$Y)%S0c2BCzmj;~ z!VJzTW}^R#XFO4&_IvI`3l+?JtI3fztC$Yl>cMGnibwA+(y-|U?RevuxTDEIcKNk{ zvOM_F!Nvwh?fGYhG85yS@ss^5(j07b*UrJ!GxRZ+65$$4k6FbE&M+)Ra!+rRL(u0R z`k9nHuEc6@JXTmCxmoA$ZA6}jH^fJP;G%4cF{&QdlT1byrDeH@*AlJ8g z_#_O%dJz)QPp>wu9~4IWQNE z7mSGVaF&2vU&+1A-qQW;FDF*esp|QOF`UWK?tYlQmo_%n=L;`P%T0^a59KQIWG;W@ zB+)HY$qMP#TXfI8!SXso9$VrC5x+gCWZv)?zu53eA|c1maH=h!8qQ98iG-tfxWliX z;*Q2L-Nl~}Hp-a1+qdQQ#9HmyKwZ$o-n{)q*k@E+@HSK$&Vk{Mni-?ORFBm>DZHdH zskd5ER$$@?nlmazhM7}X9h0y|IOtBSkvb??SRH?gj(Tw)8LUSWQTkOEbh}oEK9Ivx)xKucTY#F@TrbcQX5m&5 z$(rlsScUwyhool9XBZytnZI#!l&M|@YW!mTzYUI~Y4u+L$0Ybt;2hLi8M)$%!%;{o z_E-2sIB||vC-6HGmKN~57c7<7)JZJWo+XhF7z)NU%8WOGI2N{giUp6|a&{h@CRijW zG~U2S5v;4!L3xGf(b&o0y20?$ z2DK0=r7}W6FK=5Y_KZTN=gt9-KoG(I;&zn#2cz$0`izsFmDf0TXP)s0(#Kn;sGVZP z!VO#6B6Y*1FtJ5F@RjK9jEF+Qh(f(s9pYpAPBnf`7lzxM+Or;KuvbtJpFjOjSPTSK ziVWiyC&yZGbYndQZ_NRNqLqr2^v14n615bfdG74b8K>AUJ;p8RjFn+}^;K%b{%Bi9 zYRI0*Z-w0W5-h>65UjLG%Rj$E*y7B=GAUe~(NR<+}P zig&}$O2subg}Op6Po%D1-n1cy5z?ND*doN65xs)> z^y=i_cpy226>5g;c?`H3yXNrYA2Nq0;!#veaFU0az`xv^n!qb+Qxhm_*M4CipD^_P z(h(W@LE1|Wom0?9JM>r@Yq8h$A~0=J2&+Kl)&K6*DoMYtCda3ZTjP<#Sn zc4KYack8cu^(cJKJ|bvo*o%z4~^qYgOnNH-Q!}jQs6kc{5TkFT!y8!w2=D zcY}A@<6Cjfs?_UL0lDNU(sE^FvAV-NszD+@xLqs6#fJ{ZAHs`ig0!R6{YZ7VHPsfq ze4wi>y-xj*<_Hei0v4$eBrA;-aFBX+=t&RaTcK57CG}ZnN~9&Q(d$~P)yJ4T=v`2w z8)^577t(c5VGQW$`u{Px|^Jr2Y9BS&K~r}^7yO2}KUt1a3k9==*#m|0K+wv%TH%Qnk}A~2Zb z(PJ3|795o%u9D9quG?wECb`&+s=*|o#V+G#`;PYAU|~s;T@^}K{~H$YPhnSo6x)Z9 z^YE=l$*wA3vOU<<4*^<=UF9T~msp#y7hzW06vg5but6>kXI8A4-8hx}Qfz8t=3{^-u9k&m ztj(1WM0@b08&Lr!ac>dk3iD+4*Ea4o-YG+;FGB0b!bcQGY8OT%$I0K73wwOsI8xu^ ziw#q}Xj_UGT~QeH>brX3L`60yQocfzIh+qwz=yVp0NooO+L+`+v%B%3XOET-H6NJ| zrPz|;`VsG>U`lKf_zU+}u@wvLVu*_C$ZLq!%JI@abx6NTed^yEX$ z79V07`@jRmgRa)Q@Sx$x;K6bDHrRNubheEL76(%6wWqKU4s_McJvmUJR)4L-Le{97uqHbmnXUDaXq(d+hiPB_>Cz8w8Sk~HEL(YTh=FJ@FAybx*d@qg_Vq0XF@55Wk)$G$MC3}v0 zAz@v2X>~hbA@1kJ*duC>YPO78-5P$WA#5cuKSNVc`&LWZnxDAukc>vp8I5kkSK`5F>e@7OU~Okfa8Sil z>2XqFMH{m7(YbgWocC!7;q=w)D_-e$HT$(o2u`wH239``D5xQM8cG>eD4U$!Zf!B@ zfhH@nsiD*&SRVbN@SML&)Fw(*jkWQAo1*$3(k}hqOaBLf|AWB43Iew6BO_o`IwfiQ z4v$Xif~ZpzB1-9Io-iY%zGvLw$=LL+uVyjKk1{s!(7JZU3Y}rP8oYj$Vs*!PS~zBgNO=Gq&HxR z>7#dIgYoEYr%tdR1bgLqVlE5QY`8}@IVo2=n^13=W-GF1kEfpxpW{Xy2|gZu0P$`; zu7RPGN*hHJdW;^p+vzUnPiP>@dQ8OcVy`(XX`?xGo;`X-0B?7xB0cD!q}0+F9FdH- zif*G`W&m~BG0w{Jz(8l{WvR9?^k%PhV(Q!MbI2)H{xacg0(w}_SXn*#=79EitDYWk zuosK+7mpzi@#79HD}B|TjpD>ZSP1ewIY{}@Gs~Ym-;{cuwe%E<6|Y#SRNg(BO$}SQ ziAb_-`*hd*y%GlBqYoj207e?Mi=W7DP5*}M1uo>9ozhantai>3w-VG zBkB=o!qGvw&`!HAs&|pmwsQMor@7_~v2twiL}oaB(O3ZzMg8i?#aYs1LK-F1TAJIn zN4p23IAM2O+XKa~BJ}-GPj{C)2Ze^X z6RRbjVK|1X@s_!<`0>oJyBHVXR{zwf9#|l#`Jl7Lfi?m>)9T&;`d&ToxYHPa(5qj2 zj{uiB_mE_vnn#hx3a9WDJo#yvTK97W{4L(@DgKbHg?fS#$ z5H-sJrwZTC9=4F~mx`vPOr6`nEacx}qNUl=78uk>pWWfl9Mg~Ib?K_^Szz@vo*6*U zW%dGvMUr2lk?AMS1X^Zwi6~j++BoBQpVG_<2KgP)Dvm{Ik3(#YRj%fl=j)3VcsWha zBy&F%KN%YsC(jG~gVqxFZpL6g(^LGv&y)}$*2PkaH^7J$1L!;woTv8z`VvJ4p3nCbtl&QqpuezUc^C~z3Bn8h9z30 z1cg_C{0K77ROZ$(JRMh)EvBZ(Z3~>P!P7tTM2>^LgD0in=Qb{571~^W+mD^0ev#v# zeNut1RHFF&RRvNJF)G~1-q-bJ)ladh|GTguAV=dDcU!zl8zYy(yY>{oD=*E$_aMYr_YPo3daXGZl8R64=vyP3kjB+SW4;-{tTHq%+Mp3g@Fevbq9X{Bxz1m;BU`#$3$r)bvh zX{0B5Ivd`RUg_G!PG#qMAPva}J++fBu*_Ok2A-al_C$KDkV-|(@R3I+xW>-lUiISj z9R6AXuO1ETp;orl};pJOmmWZq_B-1di3)x{hd0rp`TPJCJbOm z?2v(KI3fd@=TZsr^@|yTJ=(4|RVfC~JElfChJFH#p|9&PbZgj-sB#4Md8}|B;|#DAnS8tTm))-B8dAt? zQvBVcoADuj9karFB6Spa^p1eO8!i$tWNxkg>MK3^n7bud>B+7gTKy~Ff-wR0-eNWJ zR>@d1cfA~VSg910a-c{5q}|H@BX)+%F)$+M4Z(xv!pLGnFvfb($nMWFt2^(-kWRXy zCYT^0v{eBvc}l{B3nO*vhF@v*HtMQxp+^O+{Ny8&`e$)esjL2O9iuY!3xSaHg^o=a zEYxqS5}{I${xU3Zxzuu&DDessE8VVFwE9d|CE~!?FpdmP;e+76IpQ>#>v)0uP`MP< ztQ;re%ovLh(kXEk5|0IWVbW?QbQ=pS8q4@i-D zv4{?xC(<_{7Un46F0f$yaDmJMDkFJ;z_Je&rU@{i?tR?A#u>axKLIqkUbqi5ASd`> zKl%rts?V6s@~`M|C2P7q^d9)nJrJjD>|)O${3pg@yfZ|$SNm=DFS%}Akgn!5ve48z z-3jRe>%MB5X_cmvUGhe9>9t@514wq8LzU+12#f6En(Z~=%Y1Rv7SScSy4b$vJx;+s zR)~#LSbeSd8R?n-k;t$elB)Zqr74{sonxc8g7_exUEG;ye@$|Oi{xe5t#Mn`>SlqM zdW&reO4_XpQ7!w7vGrnjmXoCyWbik50SS2zv0MMfDTc*I_-p=ZUT30`BtaKo1(n-k zyv9bYJb#DQi|yL)*k-zeY#eiVLqULXcK>D%VwpEJMg{>j^;v|48xUF#OnFfDYluYeK@0wYt~n1mYr- zuiY(9%YJ=r>^JJ(IaS78&hSCj%Ju5^DRzgzA~&l;Qk6jdEYlpWmJ{;);IyQMV3%bW z7L%dSN(#ki$TISMtM9>YS$z)ZJ5wFLhYo|Wjfk$jb~t#p)!FH%({7*5nOD)4XcWA% zuDTOAPl~zo0HBIZIcHtubl@J_&Y-L1b8QM`-L=mOdkC>lRbko{RH z?9tz~9+&P!w!u$oY#lz6!(|0|0|>E#M4qXC5qh*r#l*S_mFg=wudITRco=B=PMg0^ zw$_h4){n~OIz!%*f7ZKhBb$9Ui^zSfTS5+h*WuCD{ze`irXVL0+^Mk_0lkwU9`0 zcej;9u-M!&Oa}grY?q+Ec@vafr;zI`-DcN^DU*jp*GFha%OKsf5v?KHs z=s{0cuy-=D7xcu>OV$3y>sk}qE)ou`RLOLUx^RybQMi(cx zT-g7Yd9Z((72wOgtM(&gga)fc_t^qPd>yxt)P51q5s}YZDiP5wPD4!kP>zApW|Vj%1%AV))Lg8wHx(9u*w!*IFJCYf z#F195O)aq(MM{ueuB2>nz3WyvVm(TpExX-= zHjRs1@e?@kS}K$PW>zbNXAmxRTvFdj2$Du`(9qVCp@z1{D zBi_d4DNUvE=yuN5$TUN#+SjTXLgu^sld?uDR2|TtoX9i0o4?EMGEjJHAQGx2KWZRS z)!>2Wp&&FjqJW0y-Rgc`5W>=U_b2{Mby{3g@0fGHhaSBFySh@URpFtTCH~UwD8cI! z#)KTr7e&)O5l+Y9E@z=^StU+;^fqB9&CA7+8q^)*TPB((%VBy&=rmt_XK-*kr!r|3 zv0! z=`Q7>W@&q?dj!E8GrYJjIyr_J^vIucT@bZBymcfmZJv z0@q%Fa+xA)DH12LSLSlLfLc{)e*cQ!^3t#Dmo`$K5U;U?d^3Wv%2GZ#=^vh$=YH-K zItp~entm<~w4W@DyGvuo{bVv-uWyi89cUz9=z)!ib_vMkE zpweWEwnzGbq({2PDD3BTvj{pEZF$>WOyH&VRytAwPl6xSFILPbqjWXA zD8v1XxQ7ZyIwSmBX<9TR(p327MZmvmF>HyQwz=n65i>%IVv8t(Z+-C&_7`}fH+dW% zcpdxP;e$0ZpTp}NPxOmnENf-!JO>3JOt`o)<&J(u{bD#u>1N9v-B^tFZZrHu)X5%U zD>$XU<{q>eFKS~k`fjNwQ=habzSJTrL}nJ>obXM?;xxBoqZ`{j>gv#)`Fmi*#+10;ehE#DEXP1`$JLkZMoYWCADXpmAf^kdIeLq zyI!@h3|H$Ww{koGK=5V8SNp^`Nv$#q79!w_U*a|{R6ggGJ^ipBumF?vIR{SQbT2OF z4=ff}Y=uY93AQ91&IQYh@sjVw<$THamCHGNGU;$Gh2wMDcZo~6ke%gMo+-3M_zHWV zZr83u#;7gu3c;4{SKi;!y1ST=GKN&AA1vK`h^zYr-P^T*rhLDpcz1Vq!RJW5Ah%7e zkSMj@#BH+z?uq?k3=B4QK{uD~-D-F9TY0t1v%5sLho|x6Fjq<6(Ry}E->klvwIcW$ zIn!yjch7Dq+s(5(4{tD!Zpb*iu8rC~d%+}K(K4H5lpk;44Xa2uKnWWQNY0}+Cf!dT z^nnSML%x0RKw*Ja7vyE(D9^EgX>}h#0LqOuE*GVZIEh1QqRA6bT3Z0yMZ7X%-BhYw z$3}4z7r!g5?hnFN6o;v)8Lrn$f5lB)D!^w|etI2m$IfEG{(sne7x<{EYw>^bf;>5c z5RHlwB`Av2Xs}I)l$kKW8JH+mQGCauDYe#8m=S!EH~}*p$8uZkTkGw$z1rJ{?X^JS zgFJX7fRNw|ijM?ZJ>zJN*oJ`B`G40wXC^Ztywux!f1iK-Namb<_H*sE*IsMwwbvRL z5W3yFrN#2Mwflb~gMLJ^<9^Dt4)1XVLsC%e@8VX#k|Sn`DR5MKZOjsL7_5cy(DiW( zyf1!5Agfvzdq)8o$f?z*#Re>5vKsJ<$1>n>whW_u3zlpqfL^n3SuDaWRCH<;J4H)d zjoi&?PpOr6z#?2MF}DB<_5tSCmLX~dt^RmARH0A)H`6fuC2iS$;8Jng(+{VUp)&MU zG`A{mxJSrM$u3b%%VF8`ygKy*mSOmHPRlSn@c1KA5Ug>e1eZx8&QN+OWJ(Of>(w_) zVFuHS7F)g&5EHv_DF*1Ih^e`4G3~+~kw-*zTV)zh*3(^Okckm`;BnQ-gtoX~pt_y5 zQPtj#Wq3lhazKoiZ*0o`8v&%$tgwU%<=nAaS!8km4JFr>y~D%}ScV@KC!_(R4Xz}H z6MNwsjoNGDIC1*yI8HcMY!qF|S^xy^R1B$jzFZ0L?wDzKv9|25Y>^frd5o_I*=KSk zAHtDrqq#sWt4Byz%jzL{5E<>*mz5ZH$ClMehgw#$GscO;nUt_h!5uLTV5zLo<*b&^ zg}yxoYYBb(?v$gXZx>W2)3^Hs-ZA=?%dQ|BLb!=FslfJowK&luJs}SR)W{1nq_kym zQbbCe4sG>|;i*>tEeZwhS-EJ@NWF5UD+t#pyJuzEzQ~WPmY_P9O3mf_wEMp=UAgX| zILZ0I6|7n*^oBTMRS#8_uT!^B6rK6j4T4iu`Z{i*JbDW_bTECM*jfEGqBO5S9(H*bhxuWU*UD-WG{Dn6Rj}k_bz65@ES4Mp#r^M@?8% zwaJ8~*d#3CSx^Ye5+N+r$%JKtY3l7ic;*!~@n1JE^N(}?!8m_zeCA(5<0mt3krHuy z2Pr9qlq~vEGASw5mIX{3Z^uD2#CKaV{g}%_@Ldh^_~s1zSZFg#XQj~(*%ia?$<9^9V%vQSAWyRGw%V&#JVsKJW>UP>Ev8{~d5jF6 zFo+DMD6S)NazO3#w#ac}+Fd#E)ku~z6>lV_ZFeOKirMK*O_FVQ;O-)?EpFSrOvLvj z>u$&SrggW3HF7>{T6b5iR2%L(k`&CgBbq+^kb96_H+MWAwusZK*j=j=h@%7CS|!RK zm0kDrQ0}mpUAJ?}R$_6j*moGa?seF8uZ!7r3ypE!yoimB@t>)b2QfX)er@i{I#Di|4>Zm{E|78(@ef!+Htboonp5gz~4epG2Nt zW4dpNnS_Zk*fF|^QNEPMvxn&I#;bIO{km8=squ|fK5cv>CfN`Kl)n(MB3}b5Y*QBF zYe=@9*u>4JWOxkqrrP@>{4jQ%)EAydo3VTn%jPAtAo4EH?XhQUvBjb;=HoqXCr_Yo z<3B`g5*R1#C)(>L`6gqTMrNW!)JQg!__NO=^0JYWvrRD*v{0 z%ItUM!G%F_EGJ+9l+!8mn9!@g<_TV7_XNLD;0Z1&6jOIIMqS;zq8I1fXw_@hxlw(Q z1b*}Cb)|HTxZ};9;H)Po{FHWOGnXn{`bUH%(IYNBBEdozID^yM5x=zhYQ%VN=*C=G zg0n-5F#aA>bXUN zP79*>Ed=eAvCF{-oaurL?f$cP)K&u+#xl2j!|j*XEzK3jqWAd z(J#vNgdVJ;9=HAjnWrket^;=mjh3#7k}k(4qRg7W6$BTChG>(FsYpW7TTv@e15)Y` zH4q0Jupg=(V?S)5)KOv9;R$`mM)NdX>}*s|7*AB;Es&-Q^;ZZ8m0oEU7)b$_epAt0 z+_nDf6ME=uxPEEFbxWNMkJj?m@QD0%mA|De|2Ypapj}dheQn4ze4V(yiq_~{qhxh9 z+4u?7eHpGe(0~5oVK_|0wUyo$a|i2e$h9|QrxAJlmAd@`l6$vDX3D&o(4JO$b&79_ zwklg&Rgpp%@-y*Pk5Ae9i)0kG+KPq;imBh$@W2H5N!w~>yLYEM(3)C$lD|bpPG8hy zN<3Y=$BxVXQl~a@IR7rOYj$TLiN(BJR46IMq&P^KEh!F3na$e*QmeUGDv8z9KHk*SnA=O`kd9g%X76mSg}BNE(umF(N;U}t_fD$ z?bMeqVKl@RT`r^I_d&b*9SOAT%L~oti|z8E*nF8mU+v2s))#tje{i<-g+AMtS6g3Z z@0CvrtWVXvjl39IFk=bRuw4Axe zmAqg5>+OFB0-~er5}r286SRQ}Smk08m)?*Pd4FGPEu@j>k&(Cdwc0Qg@n<`g*Tdg8 zN4`V~{&M^$gzmFVh(@Q1iN@_7XCoBN_WSNgfqd?c`oC0nAR4vX7N6^E6jt;1IPBiJ zqP69nVMWt&Yo|A)kMaZ}DgO7eH+k@((va;5c~ZjHUnkhyg`Gn9d+fYN4;PDfKiKE= zu#f51hRRO<8T{+zU%$-{xyTs#da5L*e5ft0+=0i~X5$02d*XAN8xQ^*w_eq3g_o|q zr`P7w^y}V5)zxei%pAh$bec*uolc7(31$FG;I59^>$E#?I*ZCQ3>HRK;%aTEz(;e% zIoz=``C5U-AQ?sfK)FEYj>eyirW;u2(?_p-VwgXF<3*-x=ZlI{dIPgY+o>(GR6e#C zx%ddp;``}T8+k(&Nb!x4`xjWx*aGwHHf%%?i?Ijb7=U*V)$s^pzi;@{;%55(DNgsD1?@yVLaP zh0%80!4kgpRIhlW=g4l8aXTz7-p%z{ndR@VfCq#U+~&jsHrAuJpH5^X@&EdvSTCsv zRw|ZNdMmnI9K()oj|}JYbGY^CtH6DB6DBU)Zxi>~f1Atxh$CJ9FBK|s5n~KZDw)cu zsE#!K5oja^;14y6d19$VY;>5xGLZ{E_A0NkFv(t_LLL%>aFt-!4fU!Hlbh2QhZnGo`RKz56DXJ zSaGC$k?4g>k@MurtJ+MkW|J6gZ!Qo?$akiEm$)HH+TI+^Uu&jgnI{5C8O0c<3Y!8_ z9Nm4#!_bQr$dVSl_;mF0ZyZw}Gres1;sCYyCYqoDdU+bhMgL5Cx#Ft$_&+VZ+{>lJ zW2TqOFBpKpH@LqtKrb(|An>`;%S~a&Bugh{>7kNzKjZi~g#IZ}x0ICs!*hntFM1PU zq%TAJQiyFfUbqX~<$0I0u<_IIoRrdM6_PU3O!+S}WdbP=|S4hk- z6Nj0JqSGO<|7A6n4<^c3bfx+!&x@FeuSw!jugb%3^8;&EVl)-ZiR+tGm%t=afCZ`K^yls+@T+dqs8#ma4Sw_vEKAU-nkEBY`s+J zjPzdPbm=+vHFG zxUd*}dh|I&nv^ZIDT6}y%wz>2?X)nu1|J&gJUoR~88)Bcn!kyx5$gD!c zSl{9Qz|0vTY-C1SSE{Y4mYl>C(MAr_>~2(A7bCYh3bm0l(DAs@XagOW?+PRaPxFA z!VGC{vR`aBALsHo*Lnb)etVIum06jjTx6y+ zn<;iurkW|gHB;u2vdB#NshLtu%Gb@56_Rqq9o3X=K-&3W>w?;aHq7HWjA5Vr$qT7$1y8Ddl6y1w#9<}dtbKB;@ynSqnqH7wHpmU( zIb>1G(i{4Xl=0}5w$PpREK+^j=etaexu?fYZkCRd&DYvX7xEJRHWIZn$XFhcL2308 z_(*PQ7g=SxjajP9pUwUE%Ti_w-E{`XaQuREEw}!hlyo+ZAXUg77iJ3OB8|<#fI}B& zIvX{<3~a!Z;WIn%n;aGj?UYJFGwjYrd#nc8%&FmdGMM$MOtFms5+WHwm;TN8smh`1 zmug};pe$yN4~;vekv2S0LUf;mSj+Dnj14Bj_%^>1)eEg}_^*f{Zv6^-B+tU+(J0c= zUNJGbGWey+;N+snU#);VF-X?+GIV{tzJ8PrzKFme7BiyJbRjSzRG6&HxJ(6FQhE`$KZ2P$`ka1 zgK@g|4d~vYM7sAG<^QCG`%ixP%yfox^x8sGeo;r7;rjsCmMu-_Ty5do&F5TszQufI zecHm;o6jnbFfrs;d1k2RA1+s-8j@a>aC~yL_9EWBwdt z`&g-{4f^+{|9#Wl4ODFK6jB$LJGqEz))8o&Eo6ryVt*E!|FG|+*dkwPYGyD>PhgBy z49E^4Lphua-bNc3WUz`~6}{sn6os>Z)!uA;6CEzUkzFMn8w1x;snlysl}?FehL~Cm z(Vc^^;s`Q`SO0@_82>9JeeU3#UM}0C43 z^W7pYpb*St8~(5K4P8cBYm;=X#Yp`|^YDr7p3sF{Fo11GLcbW_tqf5m4@O zXliBXp3=(Dw_fsuo-OK>%%O`OqaYpOXkO};E~_5wK=DMQs=LxMT~{A-dX4A!q&m+j zu{zv(M%s;aPk&LB|Dnn>^azl=?l3&A~t4yK0_DLSuZfG=CM=a0Eq=p2ko=Iaz zp|x1ArN_5e&CMDnRm~+A^@y7k2Bwp`gS*1MwmdB7kLnnCrtOdqn>Vq!p4|d|a=9^%BXwFAQKwfoSFwXdz zw5{ucS;jTyvmlUhi9CmNp$k-gsab*00N$osmCM^J#sya8%rtLjns2fcq^SaV)pfxl z;~yugrUY+{Uh`Sd!}zoLEcDLUp`Mj7+pVbZ1M3PupZK!_v{-ExsDJQwR;G3g*)2}l z@c_HUr3t&m2XIfKbcQ!M35y?e%*Hv4g)M^D&Bjc{P!R}ln=zg)uK^Uc$QeodMV=bU zgN1xDn$DNa#vOcA-pn23(;s4qZI)N>5b;5iP;A+lKl#U&G;?NPY(kpeXcO_@xb<)QSYZ&htDo5DNVJuNKo-Q?> zBsIzt^D+Uqr|RdRZSRN)hwFd#K>vRY27V6xUxSQndDp*MYWy7fALlt#l-UDbeW#dr zenF1G`GaemK7rOW)v%h19zhW`6$8ve6<6YRNuaz}+&qntIn3hzO$~mpBIaz38kjBl zP#GK*`4tcDz(-Mk5%U)F4>5TDST@XX7}kc0PsjhHwi^2^2l2pDq(+(Ixst^<%tP2z zf48ztm3Ha7|I4cS(X@8?U7v(1W+$*a(gWk`?ZByhF@Oj?sm9YN7d}6NGd@Lu0u9KQ|R>$_CL^Z8dt4y|CeIQG#oyXsbI#_WXCT zi3Ij}+Un^LA>z~Xf($5!`4itH_WaQ>*U}boTJbm{WJu4b{R6V6gj%dG>L#VmV^3EU zcBhh?n?${9xDj?ypWS=DC(yy3#yMaKK_gpgD#|W&`}=repPQR1+H5|VMeaOKj0XLu zxv^1_dc{WRr;sLbPLwGPa9@Sw8`=Z~gxls`j|9s!?wEWm7AJ}R!`=Ew4^l5cqj!2c z(M)T~E}ZG#hh8DDKMf8kIK4pZ35aniJ$KOaK!2LPQGFRBdHlm08HFwKMd8W>fAnpU zvsIEyTa5*27gu`M)&%-bygj$Z88B|-PydOF32D(1dBdr9FqGh|(F}x(nm02>)C_6H z>nsX=mc6fKxb|?X*3^^5{lU{adC26UzSEx;ybBTkXeFYdSNOnswqPK;^G<7=75+XQ z;i6wbz*+D)j`2J>(UCFkXT9`Ix2J#F!9bFsJZZQA2hNJb4hiV=Xe+idt;uF=3ZKQb zGo~1zk@E^ryIBxU&-lgf;;8+UN(mb$Lvfvr4&D^5xg&yA+crYk`Yscr8GX9FQLZhFYbkHh>LtWFqf_JBx5I?t!Q*>`EqfVf4_lN<%o^jh zWoD&26oBknlaYn}1_LVaP2dG{7)3out8tZ`r!7;H72U{-?;ZePh9G75TK#5faO0`J^d6F8vO zZF8hYW&#QUO`tlbzt2_P>^om;`i4E$E$NfL&^^!}Z|D*LX#woJd1?->09Ysy_H_oj zq1_J@sUbk}o`iCGLq9EQrhmw41(;eGd+Y4<5XKbwWdthoLB5(TT>0P)5TI2vn@pkNzvZQceDTzwzySS*c5aTk=XRkd?YkR%*hsIs+y| zE!0fbDGr_^p7;WL6H^Z`Vv=lKvO+4#CSQ`YXW`yTZF227D&u6 z*_2+Jv$=@b++%HG3G?){W$f@NA)N>#3>naF=?6dq=*dn&>3eF*&hst7(CgWEQ*6e4 zbc*#opZA~gF0xew;|`L(NYay5(hf6e97(^ll02%Qe|%Gp%~lwhq(iXSCGN>sBbOay zOTqxmhXEKO@~BEa+)dG#pq6Qg{EWY#4#nu^F|N@0tnATZI)kl%(6>` z=a`^$j@J@1ItmPm%$NRDOCA9TLt z4lXIQ`~wPh?5d)}$WT41Uj0MjXgPt;G>@)@(!czpiLG7z?s=T^{+;j=>9h3FXBeAH z)Kukp09~dhZL24!MY8Y62;CEnq=oz`<@@ekyR2EP|J(pnkYKi{wPkwlR*)<-?-?iW z#EH;MepaxRJ(}Y&S@>~VlEAygReGulv6PC{Fx>dA6wEcgLqW1vr|sKW$;ZMa&yvFC7vx_rGuW(Dxpb2(-3jKAaw1bvU9wOuHh|1 z5j2q){x(dlie+z7CN$rHy3(b;&?KCQeC<6|eXakws`2?+e)!BeT$8Xrl4GltLq3J( z0FG^n=@22r9-8x4dC!Fj5giZfLlreuYg>))siHm)S11G&bswoKR7K84E}5~SGkV_^ zTGh^)&M~S~H~klyN}vK~V>Wr*dZ)g*GUOa)Tn_Du?18O@CRGbs&KI0qz=|%89m*>b ztgL8aTjhBZ{_k&<7M)kTE4znmh%&7Z!FL{yZ-{o4veT%BHItihbJg!=x4z~vm>uH* z0Ir9gRzQVJ?%Qc@ntHq5o6OEe^Zhf@xDLqN4G)eDO;3ryC50XnNW;n&8mr(f_=YAs z?^aC&BNdb;e0Nrtbe+$3FUM2Hy{9K;(_^N${e(M*HQJhV}lEqnPq68YvZ)Jc=1l8)l zujl|~QEIhjicx6b1>t#?{hkK&83nk%Tw)5Ih5F`X205C42NlV7GF#O`sCHTMZ7@x` z#-h(NWzXOZ>2LyH6?wDTRd)Mm-v!=zGnBkp=+;LVzcx9%!hpu*ob|yQuu>Q?AUKuJ z80|ls8Y1KShNt*3!r*p6#?0M9NeX-;(GdwH*{>)`3T5@-3Bu)X%@LU3K)4jP|KKtF z(P@t10lrGpY7Eh{71_E#AFkxe;q<$}mno7}aCl_48U?B}`njH6dGgnh7jGNw?^gH| z87rCnlU1fK#B2PGSt9}L*$QEMA7!rC;PSMlb2D9Ki$%+ELjo0yWV(W1vRJwYiemKe zsnJRF5IXn`4(bs4ZuoqTV-ivLGe286ZOLR7LVxYigAn@l;ey1y#>?tAj?7u$l>VTs z<00{RKu(M1@0})7=+8QBxVhJ}lRv2FqngW-v%p7Hk>o)o^u^GnDUosVQ1+lKdmpou zkUx$5V+Ok`t;54YsX_a=4kdg7 z;YsLR;(QGuA6_Q%;l&~kz5yrvRi%mbeVO-P^DctiC6;nlza-NYx|lGIqP7(&Fq(hq zmt}%{N*aumN#>vaqdyusm#iwADflTFFq&VaGAp+nBSd^;E`~+(ub)a-q(S0iLg$a- zQK?Y#N6=gGp;%L%?Hl1rSE|%LnzNhO9lTpB=P{lL)E6h#3#!OHGn zrD5DD38AWPb${T|$Ar=c8-&rdu3~$Gs}#KmrisvTDm1;&2NRY5wl7SAgXmO(Br#w1X_ zxQ?wruka&UW>knlA;H!L@$rlozcTj~(-zuV|2%pjXcT|hM zGQG;MDZhS0JY;@EbF-(({Ah=BdE8-J4U zu|_7zWk83rgEDUoqElDb1Brs^DuSuO;7%;%S`c|6CrsR-*m}LKrGIRo`;$O(8ooJQ zErZ2&>sI#c!$sUXJdqLm2T_D($RVBGI05y6bp+kGzdy<~6DcLqhR2vJPs> z+ZUZ-l{_V0l53fn(>S=s>aF< zpNlXb&&-44GF%Obde)<(M}(agHMIX!C&>A-g){!+vT(S*ptz|@{+rB5Sp3hUB@Be>{=uA3;Egpn8!Wa84t&1)53$ zuFap%k&Z{qlr|eLporA_!;1c+udEjTM+>~6@xQo}oqz!>ajsPp5|3Y^t!5j!Cbh;{ zzHQOT+Nus`pUaz?;$uPGCsV4e%1vQHB^C!Q8h_$MShWpjF@lh)soLsZ{gb0C{79^@ zwz_#@zkdWkMiniVql-a%FYb93$nIV3l~soS$WogxS8nbW1|AbAe9Tc7U*^XrBypPm z*PdhRc?9d(m*uI$(?xXY?RMkKY?Ic)?*97#ejP+3kG!5&$$Cy@#ez8OL=X=S{w>Uj>`g5$BA7pL9=iIfjN`^W?5QS%XsEk<5}z#YJ&^AYhWo? zlbpiO&lbe8&QWAwuej@AC8A3gzkpeekWnG@iJ2(&>Bz?PYm|NVWyjoe`EXxTRV>u-m zJme%We{L@^emdsx&6JpL6<}vHKPYT9?z$?A-SeIkAzTF_{Dm-gRXV=4D`8?WzMfse!={HaHjdhjIPa$mHiV;&X7iLXyr)bOXA*X1O zT%{BIJ<4-pxJnB5-8)4UK098xP!&GOxgxhHUV2(W>2AeEhBcC097~Dzk+TtXe$XT* zj&#r%2F3BtGlT>F3q%|@a_%(3BF*FmS(p1{A^>$^=D-JcBjz3QpXRPRV8hsA@fYy# zp~0;!=J*MOQN}rH z5d9)t#RsvGL6GmeV#KcH%L-g?qn8NRdZ%l=G>(3JTe zO@?OmmX$@W=4z|Npya-_Lr(1YEtNmTcnPwrT1{@Wgl*$_sYLI0mVMEzrbYTD)tu+& z?2Z@WP>qs=x-!X0;?GDF8dg>8E_uP|g$TMsH@o8pOxNR5S?T2?uYGRo`u}o8$$LaK z28qg6w9BdY%Zar_AsQiKHY0@P2-b?e(QLQ5fvG>nz)@V< zM1~QAF_p+~frErB&U)(Joh|f1&sY$Qt34emWoIKNy&NFjFfk1j?sSJ{qj*2?@!~5) zkK`!Xz5?E_zGyOexkJr42Z2(2Xok{a2AXe*!K9<%p`sF@HWQnP8(XYGM|*)9Vd~q3 zD}=M&6wSYoCd7J3HH>Kc4dH0()=AHfX@ft6o`~7lX@ck$w9|k{tCvV8%5WwxF!kHN z7eLj&MUwOR(XtD5JAA>|jXDrQvaFkIMBiLQhMM37zW)}_Is;IHO=8Sjd1f5EsOrhwF$kOnKoYo?Ss*Vs`?pa7j` z4PqliCBpH=W+MeI%G$(lg}D*d83a-1$_JbEyq=XT7k!@VSI^jsxnkRvVBS0GSLUz) zT(LvoG9?_Ox%p!;!8)wOIAY!hflog1PjYT>mZmrZH%_+kRGi}6=u}R}L>mb^mUKvd zecQ5*C0h9fcl}Y)^8kfkUZZ=H)6HiMN-YM^D zjCKOu)4ZXg=9zl>{)#?VH!6!Kq2JTr?pGIOk#{d36JPtyum1cE({Zgf-Sm+*y)-2- zZ?Y{i8WKWiR7A7+6mA2XTqrTN8eig2QLa9p$x{5>z^-5{Yw-v`{=%Wab2uoE`psv9 z@}C)TfU~6^Jj^9vV0v@yP3@&0;~owChvdmED3-N@WsM!%QQ^*D`bmFbuH*f6 z)8W%%9Uhs`VL1bcTx+fu*&Pan8&h46=GTrFcGrJgH2=17oW{4Kjx(M{aTUSKA32q8 zuC>rPMwKU{+Rdo8xm)%#s?pm$dTx8|OAj~Z4TwopRF-P8SfG@9K9OH5sC?$(s$nZz z4lF)|jw$NduDTh`k1!QX%JI?sou|ddGnVnFiOjGjW?k`6o3Di<2m87_=~rymL;AWL zzhbbj%M-W|C%!HZ>*{jSzW!)%Zei^`{mTF4-`EiGf2k6IE;QcM=_q#T=$(^?gt zmYj3I;s@PaL2wrY-G%tlfEO=xhuoRQcc3YQ_noNiQwW)-Xv{Q!i~@PsZaguuAmqlkMO9zB1nNuE;hOlb#7tP+r4AaE>e`m@ldq{> zTKvncMTPNz(rTv)dqa8cKSPeu*L(Gk;mZ`4CMT|ccZVi7&w@kq>X-LUKq2YNt(}tX zA71P2ElrPP)ZWxv`jIz{dEoyyJ>~sc;5hbNCqAfcwiWi;11D+qTZM6FL#REF=ReNF zp~S@6vTR(>qL}$Zc0^Pj4P4OJ>h_(zf(mL6WcxEVq-94I z!meyc%ai@z8F&k$=k%6Yq1?WP%iE_!u0Xu3CLdlfd@s_PSPmk>EZW^Kf@gKMuauJ9 z^2BmAl=lM~QM|-@smmKmhnL80saWA^DSg7>&&o}$Xy7rD(J;!B_L^+LOD4XF5<&( zghTIP{tY$%c^o?{1TahlFiJnVIFw!i-$|4*PkFBvxK%LVnLMVwGW3nVW23_D8Sns! zO7K8VJzn&W7DPCgs@3WM~SXKxuF2fudTf zt>H{%0qiI-;^kEkWP#G;D53b0F@g>RJLOZEnM13Wm~YJ49uA5?jGjK1QR;q9tcHCz z$m&^8Q@-BMjqHhGu^Osjc`iXD1XJ8C2ZjNbnvH3BluvI4UAkt5a+_DUE?m;!Dx1RX z8&CPicN;2eGDbNXZf(CXazjnotwjq2rQY!U%)PM{@e#QM>ynBzn-Frej0d)+t{raQd;!R@l zKk(N(uZ3aN{6u8_W+(8Jak1(IoGr5Q5=bCH8N8wVDdhF)T(C#h@{qY?JEgpoVD?&> zfc6!x(e?({NG6~a?Mmw1Z_9^@4X*YJvlA+_#-ixnAl!G)gX*2Ka3h*d{qImcA$dX& zs`MTXH)iSeA637YWt$b6+;{n1!|O^P>mg|}!y?S6~m-2%~yeQ)sgPKjIvFa-}Gvw=q$4cIvGP5z z*ID`l77$1G)!yAzX7dl%+rrC*4$Rx^PQ&lXRngjV+ubNuc834P;OR?bBqm$wi%*0E zFC6We_KS%YUyrtGRE73@{Yml)D?ZBbz#we2olSA1itq$#k2X8Y zaXEw?E`jvI;?@v~&E6(h$GWQ0A83=gbwjc_d2L~fxP`CuT`-eH?rgZcWeVL$U3mHm zwk9bm%gik8(d(_!xgDTxIr-B3N6vSl^k(9Yh@HEh`U{?Uos88uiEY`^a87)aX-3N} z(Wg}WoRaO0as$Hn9eG@OyD19J%NMD`IGqhCJVMw9Iv2|S&AR?*@=oN|A8M5$Vi7p8 zZQl+yrPiq@brgME+mo8zK0TD4Rng#WohtOAR-p5Ljb417BuLgip7xNtE)I>ZaL?Q6 zg?kWTztvN|ebLv~$|fL&l(I?r%J`e-KheWBoizL1|NfP&Vm6DZycqX>Uak|~z)t{DVBz}Ye zn>IUKhFVbI4OSQ83O%mfE3B0JP`fSdUa>LxeQ=@BW|ZuaRUy15t3uj#i&A5@9QezT zta%~pI!nR#Lrm?G6?`Wdk-wT1y#ub96&Vk_0u6X7NyGHrhZWo4HMs=Q;~D7jTAg*W z&n>+@-+0`r=08+5N>X2q2I;yNseQAkpJr2orGBC)k=pJUXz*)h;fTiFT*Agv?z?ZW zVs`LwB|JF9D853wM=Is*t1Vz{|XN^!1@DQiQs&pScN^1VNqq5W8WEG0e-lcX&-M zyRD-B^4?Od{@*F%tV2cygeMp`(ilzMsG1T8hQG&m6|~yN12FF`P1Tmo=UGn9x6RbO zy%S)@W@yh}-dnboZgG~v(U-XP=UCw}-Y0JIomaleKOVcmeVz5K{xQZsIL)Gwf54Jh z78H-Z1d;g>d;c&X%! z|77FWs=i#BG=5AA8*Q09hNn}jxXgb6HYmjy{i+mDP&lRHd#N_p3bT_+(wU{_w#^K> zJ}72?Z__^!a~ix8%c51|cKhytxb;qPPHFLd3p?CzI2(pXUy!`sv;+Eq8M5D1)^GP+ zCP@`5yuIblDILB_ayp$2nlp4qzm+%og5)iCP1){0GnV&4$$KJs^Ub{blk!5*U%=X@ z*y#CKop994k+rCR9I(@OepjTa^p=WJUvKF>n2^fRBYbLcH2(+0#X?-Eu6k7?U52BSF8S_+p+XFX0P6=X z3FTH)!53ZiyiBRKIX~@J-4#uXhP%|s4K0f&@xShkM#J;yRWx54k!Hi<9%PNe z09mB&y|6rH(5J9m2MhFnQ(Ly22mO<9kRRL_o@8{8hb7Z7Q0g0?z9P3jH81pY9yxFx z{C|KCKL%3xPt6+N-^>^v2-pWKo53$w;dGQMr{L^f_i1h;cCuvb-D`ncb~kvK8`>nC z1;KKPQhdXWN)GcP-NwR~mHtS%oIHp5|*U`@r@t8DMaLs z4Dw@VpwCkFs@cYrEo2PLn*cG{Y%IdwNyKcW(wD`p#(WGjHNXqaaVtCfYIoq~W?NwD z_aVDO>k9vUQG%`zTbyR&ZSenyy4xqA`v<8CA5w{*L3ew|{=Wjb9lHNL3kUcAJA}VD zV*kTT$3gvnNhN-U{>P@uyesO|ntDg!O?_OmOXpB$=ab$4=>3Opq8I|^DAz{6hDi#h z8S{6>_vGvsu&+~V0TvFsKw@x-Te@97%~+~3bCROI7z=ofy~LV5{)p3PWl#{}77aKLOE=VqgY=6aNIsO8ECzs7i zcW4i96scKUM$ldH7Qv&ku`=He*;DgFyuWmi#xUx^mc-Z(gF$1kKD?>)0N=(E1IV}@ z&XrGjhKoG0QN`OE>bNGU2Z5;{d@a?Ms)gzx8)0!io%DGNgh0D;I{^wi-Ho!R@ZZuJ zw|4J#k?zN}xXU}yWjOKX0K+#K^Ue}@vV|wO8>xu@dY584b^A>ce0SO=j%6`tg_T=0 zPVAyC7LLyDmQ7v$tEJZ4n%ih8qwrTLwzkF+64f}IXScgw>~>=vvai!Uu2touEbeu= z1(3N{n~R?e3MBXYXx~sp&#lpxa^*ZQ^=(8Po3<>>-x_Vg4*qr5Xp3H)EaPpi(LOrm zP1+&VsL?K;^dIW^+(|#-SF2xUmg)RZd+Wm*?aKFRv~$;M%gM^=nlVn}}U`Rc;HN?BbuOrcVB~e6XK#8Tt6lJ6Zi+^{2hsRh#(N zDx(C3r;JnSbMqpquUC<#^0dpheJX9Pp&M1z*XCcPe(mp2 zW&U&jN%f!;V_Nj`u`bZ5q$~26j}&lw57qHNNpcP@+R>M691A@m-QcByJ=m^BCwl;O2)qa!>d}>e`G)94$1qGeUg*kb-O=! z@|3yO!=(3V6@YcC)bmxgt9a>ZY+tv#r*R7vsJan@AtO!0K3o+42YLKb+e^n_cU6 zho2ljU3D`2$?t2x>!bV0AzH)2`T*We}R$Y{qk{zk8kqX`2Mc`XhOZ_@{QmBkla5sbN^9t z&ri<1614m}pM7WYFk2o3KNs_$NF6vIkW%MUDv~Z&krG-uT9W>+e4ir(xc{NIk86Fg z+uC0Tzt=3=RH;?A$M0tkdfl>YQ;qtrtu}9Q4gRj`d(jvdb7eUA9amF&OQ75Cicy>8K4m@$}gG_arzIN5!C61H%7($Z5f z(1hfVMyCk^kGI*HHNoP<5-s5ZiVWn}ev57&sUx$oS)4SCOYExvApV^WNW*K)Z0)S8 z_^0vH=wVJPl1!%d+slhG6FW#_@qB^q=A4!xb16`(KLFpk#!-t#j}~eWFdJ>WpmBXh z)@Mz53t@p8ZD?g9C*o|vq25^8ksQwEMHsErT$`P;+^fOrbEm3BQ#e(vnUPZ^(WzF9 zORH>+jN%#OkL2*nVu*0XrTeYTxnv^3gYp>${ziD@|i=mgcx0G@-kAxj4vZKP_>L&Sq3a4R5ajCHJAe46!LS5xs1RY z5|u|It#VTY$GNhGvKrMAO68uo&c&G))`_|0j(af&O;3w+TpLO1al8~TU+Q{l!APR| zI&-?z-_D#aS$vE&l>4xa{}jc`IV{MBoQGJVFc(nHf*8n5Vg!-mtWz-tiM)sK1c4se zYf|-AHky{6G*aX--PvX2w6hM^6Ec6(0e+)w$di+>Jx2RG@c3j9cC* zP|J}Hn8=dTS<<&w&De*>4&SrC~09G}X{Bw;%jkLO5 z;BRNYv5VfU(A+s>Pq53*VgLLcMgj773IMfCVhZ*PttWTDss(xq_w6{jnYqttSJP|0 zWtwl9=39DByHZ}sFmYfW*j<>@zVA;`Diu^X#(gb@kB*oH8wN7Ba^4oaZZ?6Oh}Cuv zckgeW&#kOKT_(4(T8joWx;npkd<~f3xc@avzI@cH}y7qbf z=n03HM8kh#Ld3Ku4HY9nCCgi4cR0oAN$lq4d9j6Htd`W9Boz8%sDWeX~Qi*259uezA`2~Keg z!`U)Mu5BDZe2DT_=caDSF0`?<&Z$_!#l^R1zV@C%oA?{3%uKlFUo}B)GM>>cy#t~; z5Y>UG4n#vYD}%*o4UOE9GiD~GT>?%ej(QJk5fD;^My!;17T=r$H zegsqiw{D^7+ozk&5Y)++fS+E0#^~QYrTTA7J>-pX3SOQCz#RmNg6Mjpil%2`^|d#8wkUVm9GHWXua zBo*2DF72-%sbN^yE*!HMk33M+%pk;fPBx(6f}zYx%zX|{I_Qitzl`1YdTYC76CGQx z|EyniKBUaYIhRlnPsu-LNvdtFkY?@@K8U4(^mTfs(eo4|3EY)w^9}C}%o^>8Q7e^e^GbLO)=LkY>xfXK7dqMGYLo>do^1rMCNtNsZVU;&4 zdC|Ry zz+5o3)!C57!2tH=Z-}AX3-aeg=Y~|9QNFf6`poHM4;C1&3D&el#%vg7bFSe3EN4TC zC)#0NJLO<~ArXhnA?derVxlfRu|dhXV&SK9wqu>o#qVu7Eq`MK|Bj6tXBUVDZ@Nmc zr}k+z8&fB-T)%>6>>E;K@Nie2&_Wa!Rr;pEgRikhUy}wq985LG|B4KKlNvw%oy(2# z=M%>Ndo})XxIF$c+oqU#Wl0PsPauq*A(-jG3{${hxe8{n-^$>{OiDpO`7--dsC$_C zPo8`&aq``2_5qZM0AgFFZ+7qdJ2%-5g#&U{7(;@N0VMe1a|1wl6-581A^{LP3?9VC zA4dYag#=eCBuEB=GO!y82+6pBKeYikY=|Ml6ypoe4!~jC@BWvN0eG1A$y|Du_@6q_ z_`x%DOHOfFqot}_;2W35H4TlfX8R?G_Erz_6MC@fw*r{KJ*Ww$4)owHxS1pNAbPkS#9)9AEfWUc zlPWD3OdhfaNiewSFg?KP--N+3Earv=Kzt4`ua5O#WI_-A@S7vTV0Yu8VG!>@8awzQ zdk}+x5ZynCV@f=tEbF)f7Xy`gJJ#NX9(G%!888Y1pfF-kU2?am1Os|3yJJPAobeb3 z5fn(eNfev&!?kre06W&Uo<54Uh8;XCY^8>7Dq&1kF*T$P>008D29IZmHtyj@+>paL zL>qtk6m6V#jN?f86m9(R7~42y=r+JA{FW8s^P~#;(R!e__2Iolm{vl>3(#jITm#_4e>)_B>%Fszth( zFM*8~IG-0yjaUIYa3Fw*enWigZRUo@B}4eu zJ5G%QZ>GjwNImLuxwd)-CBH<;PZo`FXsfmzq3AZlF;KK$-#l@fKNDX~%Wh+qyl{~V zOwW1949L)Qn7cIxdDp|;(>j@x#M%7kKYR5Si9rL4404|6o!D9fKQ&TYJ(H+`t)j6` zw@+;Gy`#6c7-RSCYzdE@*gl{vwYn=4WmgwhE!)D`>OLyEV6A?eOr$u=Jqy)?SD#}b z2bn6jx;t~j+;Tx8U0r2&hNjnw*UBq!e#m8tnzQid+~;yIdl@)Mj1+0Bx*|Sp^&Gog zAzXB(wyKp}j)7cuZPg}E%!T6UOzc5cZI4X%l>N9AoWZC#cwHeLzY0D23Q6#WD(xr< zCWzeSQ~}GKL|Z|dQfRyh{z*IVW9j@BmR{E{Qh8Ok<#I?{-70d^d?s)9XPvu}?cx1M z)yf}{-UZyxkwBqm%AeEGX!!Dt`G_&rQqE>QLCqth^^9x3or)S#&$yi5VBW?2r8ft8 zIy{&chfoxXCQN@vd1%<#ooW;BzP?k%BX1_I6^s^0jbVpqh*PBDYY>TTkxJttaGfhr z{_~AX_=I1(vy44tBs}l&TGL!9G(OH!~8dr=SM2f{*M>qQ2(26n)!<%x_LY9OEEqD zIh6-QbakRJE)=z-Bbq7BIhJz_i-4=A>n=i#3#DidL<6!OL{>?*!v0=XA9vJ4;G)rp<5{+VTl+v3)r5$!q zH-p0rV7aPqo%`U;Rq>Rldot#crDPYrbUq=DG#gkkG2+tr#iLl>&+1Z?Tk-^G<(d^w zQWdjBh{t|`$)OC0=`*ZS-p3coV9dGcV$PBX^&nl5!T@)mdIw75e*DyO5nnDVhB?2W zrvIj#CibI3r*vFL6K!=q7M(&pGGdQGLFJfl<>+E&ENJXX-#xva~Z85f~d%fXuizm{XGBltc#4@u>qdmCd^;%B(G!R^UR*798Z7(hQ!-F)IN*iccL z;tI~3oPc`a5CFwxUbU+{qw)r>)L!Xtc{OWP{5doWK3iVLTKin>;P7Pe_K1MP zB|D+ZOO)IsPsPd)fE>@5*Bj(Q!vf=Z8LTG+)vo9gy-9Ec_t24gD=NUP1{h zlE0Xb#}?l){2p@7Zee6h%@A|upEh{T{($oNh;w!i6MN8{%~y$^Va}}n`(hVW=5YkP z7o7fKo4Gvjti3BDOJv*JqgWzerBr;0%#kWsBF|HuN1kPg^uMZ>$giUL&%Z1LlW+I_ zOumVSwr|h|^b3wO@m}}_S68V`F7F`rav=E%9EULX@zn*HweH6p!@R|^%5{=|JZ$lQ zLDPWF9XO4B-n4sBdtf1a2F#)HA{pI*ak4XUtteK7skc^nDA8r$VN|#bRSQ z?`~LF&c%=)jt^9GMi!{%s#*YUB2b-a3%CoSW+|IeAjn>sSbe-5c?ft4NB_+PoiexpkPrUB0jC)8)os-V-VQNpdLcdW3B~Z`Np%b?h+0dA-{2XN~rMNS40N zSf&l%7iewFbeDfj{N=zIG$QAMvR}%rJa$TljFf9l!BZo9n&twh(99>O`_ofV|oGFW?^eT@u8O?M1|l8Y+=e zNpt_|_lBH%V6ElN9IaOj0Agkg5Jf5RDG@(d;Xhh<7VDAN-zifh42O2Z;k7yg?SxqC zA=K@3EPmPp9qC+t>p|l%y&c2UO{f@}dUCYsUHH`RNRgLZZTcpZZcXoulDAAgnO0P1 znpRX}rrI2c^rjV+|G2tMV!sv1CVv(d@lEe!V*KZ*MXnEo9lo*7x^VMSvge^Wclby1 zy@06j6ylOI54@kqPptEw;+OIEwM_HP6eHUdF>NwO?Cfj73dj{3abF7-e=cjleJys) zWsSG5rBHKiB6lk4hNkc+Rwyw>4$}|eD~*pK7uXOyG0j(nwb-#X+!|<4p+y>QRSoA5 z0dEvoJAtOv&taP165fo`Bq4*=w0Bf^^*~x*NdZ6#9{^!f&nSftOt}wypjjXIz@`*4))IWEw(wzu z!iPNYL1x>D@u2WLpoBc6`t0UIntv3nYG6TNlSAQ#V9%#Uin{${alPR`DR3a_&yQQ~ zj&J^iu)VdX($Ophv1N2&$Z1wZTw+k{>}#Ipn;}c4Ck1PLSuB#4ZsATk&zTA|vWWVc z6L6~8#Hr?^!6~7i=6z26fWEWt?XhW@X~wrvh`96}_@2RRHVyMsdnGnhw68UFXH_x- zoISFTd6RX_?9c^X;>(!lfmO`Qr&+{%%tah=_)c-wMbskBbp}3i_>YrC9LY7;u$p2t z?Hir@I$h&h$Gz#wX>*mgYW3Wl!f+SZ*)c*?=#ymvjD=_7oIuh%-xu-342t`g3C5ohe#P#P$-EAMkK!)HL(EQK#ts7rwSFbeUxBj2Qn8l`^_?Zr zz@D*~Kk8wQgv2S=T6!dYKZ=c)KojEg5zNrhw?5OSIqLiF$mVt|g5sWik?AC+V>PHX zy_K~nTX~QP?D;5i4#_EIayH4r4+i#p63HhST$bE9i!uXyKE{RQ+jbJ|#2_OvchPWn zU|V5e&-=pbHp$%wwLuuI{{iQLrWP)LgIrr)wh?bDySTEPvrmGFKl3262s*?|7DvR~1*&@Q>Y-gu&Ge_l2rGGwr-Zg=H7NipEM37(s(N1dlw~~L4@$V`A z@u9NQp9@m>AKO^@6nh&Am`duRPC1l7BSozoUsQ{aXpsfYql(3F0mgNxK~P#&0bdUd zR#r;}2T!o+CCv))z)ldanwnfZ5tj!72_hIT8MHzW?E|!T&=G{<0E|3jWvs z3i!W{p&jtQ8u(v9gBJX?tD9N=fLVa9K&@TPb!ZS^Hkp`LGN@UZs}ie?H$ZcX3S7xK zsyPugcG_rHMQ)e$JZpJatAzb32s2S zxX;D>EAsBtrD}nZL!;hw;qW2W6&3siZk;pc3A*2fgPs zC-{L>-;>|D^OjV8@O$<_-*X4$PkzsCPJYj6P9Ky%`8_-FyV^hODqzAIg?Yh@Wpg-w z|G6lh;9Tvtf?#?PsFaSLCl}V01poOsok;0)x9l!-=X5ILZ{>fyXxN3r{F*aX&s6G( z4Cl)5WFD{`>T6E%T|mj72l|KKeRfI5n&Du&_VbeFzP3W&n2i}(WE0}EG2^4l%_pP* z`!z@fu3*NyB$= z*UrLjRGaVtvKXEboB<<+xVaoM`EL`tjV? z&oWV2O3mQOJi{nR_S3EG>HNC&2Z~nm%U43*i2t-D#%0iJZNdg^f@#7!KN)I=o-+$R zBbN(2k8Zq6WW3d}@pdMRcd<3z4rnRYL0gx`{40DCgY}_+5AEy z7&s0Mc{O?-h!4D)8C`O;0~cIkS>fR+ZnF$5%uuNP%9=((p^mmfp}xymad}&4Zpz)M z9EfnB;$V;1ED!kRmeaADIBr3e7mJko0u#^qkI598DEc^62%lRmEX;i2X%^7m*+&tR z!7+!PIfN&HAHa}7&*&?ZjZp5maAJZNpbpi_{xV0CKwE6dWajqvOr5Dc%rE?18 zCPG&`5xNG#j|F;q(FPh{X%Gd_&46}d4^|p1CN7dl=rMNv7mdH@YE$AgeRDKFt&Jx2 zs!X{j@`>mSbup>9*?x@szbO(!+vH+dGf?6|U3#_d#}39+Mm|Bxa8ZG6Q}8QYZ{63K zx3m^#%Hx{HZQ@33dQt7v|2PNw;k)1oWDxQcOO?fuQ#WMjlCGy01-jRgFaAkt!}D}A zGcch|zQxMK(gyeAQ15XO-@?1W?~rlxYL@kV@Vh9FPKX!csNe`Udf(f5RJ9>^+&T&AK8?QVl7AZo!1edL2AgUST%Q2eNH(9v}-wp-1L!>9KNi!e-F);V@ zuUA|3j<#xNC3XfGmGvFI^Nrsu6$JGiZ)$?Fl}zqGx%R^pZB-kxNqwJhgrh#{&v4Yg z=SwFbd8!$?9OSkxJ*fK*N3jA2I*Z=SH*8G?V{Ai-#iLMd9@BXQ)8sLQN7+XuGB0=C z4)5)iumP7{aV4TgHzl0fS&KMs%{bu{i_fhuY9`sE-!(zs3z>o7Uyha;aloN=28T9b zFT%!%@2GWpi^Nj|k5v#c5fykrc6g|$kUmPH+l3Ittj<;hNpYj{r&|6Xn3%*$er0o! z-^Z-qr}#AQ z-)IvAi{uzy^>P|7O0E=P@mA=PVx1kbMK<$E1ee+WX7b9N@?N*Dn;$}dAHzN|F#E^; zWX903bFqy%?xkrp$NahL|6}h<;F~J8|8Kg`g-XI+7A5ROD1=2UlqH20QfMLU1=OZX zN()^=n?O;JU_q!6t%``a)%8_Tsfq}$DF_rqDB!~4QV?wrm*N7&h5pZ(Ig{Mnwk+@W z{_pqx@1Myh_uTKCS zum~Ns39kvu+&R6HeGC`N_uOQe9R)c-C18)pQ+cM-sd|r#9>kU&b_leQ!cfYrSF-Ia zU8U?bdpD{ta4Q16iK{nZzYmM|_2& z5|GT#9kB5g<^F6KK0Z5Anfr6^k>&m*24uN^z?BQL8Sa4P1z`k@z4i#)j0gE4Cc69ABl{75a+5)%ocWU6gho$G>4Zx7L z13tcucf?lEY6?#PdR*%O10c|a8vG*`9TUv$;%ThLM2Cwl4vuwPjB&u(9Yr-=Vz6*( z;#U5+r1{!JRZ-1_Ge1Jx1hxUzHu37WzYQt4Zaa3Ui)#KnbA)r?R6`h~l8_s!F2b#G zVFzb6lgY+J)hnL|D+8a3S_)JTy^biLCa6QJ-UA+#z)<$GI{-TSn!t5;!prUIQedcO z1%3djEvmT$<=pQ~8pJ1ayQmGi9tW<4gE8De;8bo0-tFL>`GsK+FTXdT-y3Cqn<*Ty zz|Y8H{}$>odioUXAmm;YGQ@pmAFx10e(IG@xI;xWR~Nm>-NTwLe$E7Z!c_rd?|tCY z*P?G!>RI&}>i&Cf53_}`2f>+KaE?zNJEj}n7IeigvwK(4N+{p_D328t60G)z^zbu3 zS6n;*3-_0`giYi2us~q*x--{fIM9pU0O7zke|5M$ei9o`(W@VUP5oUu*g!)aH|Tsu zQKcqs(CLigl|7yWw<|9C!vN5-bjP|Lc>D((5DAdNiS4_WP3OawT(LOP#AGCIxX#ar=>aXv_$IdzpJ2|a<&z?v~~fPw$SrDausX> zNunF-oj3#oyS}3uaK;%T8jA0HI&}nQMa|zAPPmT(fiLw>f>)>_kewQ~4xPPvSX*GG zvZ2|%;N|B8=ncUUy?d>Ju3YH*t*YM!NtWOkRA>q;*VH-kRMY=w?r?8Hc~<~h7XuEa z6hh;yLp|_b6xcwc1AP)iOO9T z^Mt`HAk2V&b3?_MAec?OaA@#^U??5~CqVRq5du?X#0d6cgjSsNBSwH1qq+ZH zviAdf2pz+!I1@&eDzJ2Y0_!Ra4p>2fOUx5BMe$*p^E(3EAo%=_U<7fRB12ff`5hWJ z@H@Xl>jo-^KcAF}p~kllHNGu*<7?BgAcFnR_GUNQOC0;1ZO<{BhX_#wtIh^-{1*yS zQ4=_L*ovC!dX+SA7}~?G2T?@^t*U65Ub6BaP1=*d(K(om#jqa)6V(LE`5-)#37Hy) zy4YYmI|hSv#Au7EzkxI5i(??e;iPr$(ctBChQ=|*M9#**6AUA65Bo|RUEQFU4a>OJ zLO=&_i~Rbw$6sSF-kS3>T6i<2v`reJ>m~I)&gdsJO$eVpk{&` zF~;H`RAmgjOaQ?tK4@w5?wOfu92WSGZ7;mq19%!WXbdKe+B#L#=q!@eXwtX_&@3tsXu#qRth%jKIDz&QP-VCfCi-$Ahl6dL_Oe zVV^q$UbfV$J_h7+-AP?)J0Q2nFf|EBHSr$W4j4eg*GzZ~FM~$XO7CJk0^ke*%cVd^ zz#|L;fm=P?uH?6|e83N`P=KK2)Vf|=4eEq`s@C-p#0~E{15u=|cwsMr-CWbbo{Iuc zUI-0z1_HT8GHX<#mvt|>H5Y+<@Y3?X4tS4WgwKN0nDGNW-QW|@;f;s0nDIsaT&&|8 z{1!S0$LONZ1{zlVXdB3$I`8w{?m?rw^*U9tr61d10~8}R*tiHUIdJGMo@|s++%XZp z=kqrdcfg@g3)a2Dgy>xf>hZg9CuuxFB!~rgHjXXtuEMF+o!}GK2;17=$AJDB#WzGH z>#Y8cyT{{-Q+QoxCn&(_NHOmk znJBl6yTpWnnPoUE1RDe+b~ch&{{u9xi@6O>B=auY{}ZjVwev;|>=%RT)f@KckHVBI z?1Ym958g~IJ3|tbeJ*bB`54C~?A>TU*=#EO1*pcbFT_C10X!3%pM=d759|N2dkN}h zM_BK56+ej88%~$9fUmfyg%L1E4dWC2@5YDPbR5SW8}2Z`#0>kEtp|EGVHwck8eS88 z6@{ZU;Ocd@!pHD|BFgmmOH|f!1y?yaww;$A-hx3Qp!5GG!SYPhWwY z_mP5tpT+fsjp`?cyCr}PJJ>cWj`%QFGZDWn@$6a@4MefEfCNBFhTATj83{QP3u1HK za=G8e75lFJ3rTXDIL#SFJrjmm2^*S2F@jjQF$)ZX1Te+THxhNX< zZf^#k*Q(BHibf6|1g~RkY5SyBvSrfnkaxOt!I|7f`Tb& z53By5C(|`OdK;t%CMC>HD5G&v$~0jc9|&IzW0Fh*MUw7lDN7P8QgBj-8G1g@)@xm7 z;U({i>%eW$N;gQKiCOkYfawT0w-^R)G%yev4nsEAlt9SI25B_W*%upikP2loSw=mt zk)?`dlmq%!SI(%Hmo<`*N0{Y5pHU6u=Xq2#@;Gjw->CfGs%7#wk}ES{Lx3yh%GWS% z)F4;(G0T5JuJ9_>l`l_s*Eek4#Ck+%zF`o@rY;_ai=?e$MLeoQ=elVDJO~fMS1aoI zb@koZ*GanKW?l~6fy!rlaZC4l=%Q0yteH5jq;tS|ix?SxY3_P03s(P+hBgU~ zZh0Q=9i1F?uI&(|33xzEtON;v(wK0*E7j+nl1io_{#Fok4C z2e2@&IqYGu<{*@P7|A#qQygMYk7xF8^Jsql08X4R;1`8p;4>!Jt`r6+U!5S18Squ!fP#y?>#5~;S+F&!E4aJoQ3cjwx>Pz*y_rJ>^F zkObIZF&^b^5JNm048fB+n8xAkTG-PR9^%qYxANhG5VXXsfpnuHB&lvWOs`_vqIUob zA_5ll|GGP2h||_d2vxuQZ8o3Zy>c)xDsf-a%dh^1{e<~pBPdK2N{jC&Y=jMl%kXSN z=+j*98d!i`WbDznj%2_3-MtlFnu1w$K(!o6G+?j+`C*4}tJRYkHxIXi$}Suuyg zO=X+PY`vlTAzrBQC`c&b#lcXzKfAi3?U79=2kL;LjI+4mz!LA8!3#b{hE>E9PJ=S{ z@3cT!`W}X!BWnXspe=}6 ztUA9#Wet5h915qa0A9HGo;Avkpw9GI#Xgl#d<*Q^H!#sL1%_5&AJba+6gVC~k3A5N zGaMZa72gEJ`yWqOJ2t@8B@=QeE}%!o`J=3H>U8+RasR4S(_kepy!j)j(ZSGVn7lXAv8W;Y@ylWxU4Z|UMX?Txu`EY`m=cGX0sgcDQ$rxIfA zk)8Ka^n)g$xDC9R!CIfh!6y>nbu2ugZ&jjt%n@^fqjOIUznNQ7Q1d|*LT?UJ$C(oT`SmiC%f)q*FEft=eF1P{D@sYX4ix4dWc<*uEEW7iYx`X#%5&8{ce^&58mmR)Pu^$fe7W!E3s^=EcH$F9G!>+kG(fn6`M>!0lU zH@nuetLjOV)1O@f*)@n=L)f)ByI#kxYIbeOuC3X%ExWd7*ADF3iCwQ}*DmbZm0i2D zYfpCV&8~gewJ*Cyvg-hL9muYO+4UxNy_sE4J_eg)c-kBI2p{UPYxu2o_2dtNoBV0ANi0_}=1%z&J=Nd;vtfMNvsJb?$ z;uH+Rt7Ds2K{pQu8K5EkHAbDMIZ_Rq9Ol9qN|s8P_R53Ppe!fh#(D()AF5{p{=BMt zl?`@{b8657I)c@aew1{qEs-|Ek!iRtfN_3yeQqru+&yVP7lQ zpA^4!mWyCH1jC8Wp3tj=xzAd-F7C$Sg^pc@+6M92cJOE`;Kl#?ZCIzy;?bQNYwwIW znBTpD^^Ow!ooBbH->m|faL=LWeL^gF20-vvln$RWj*69sZKL6ndH8bnkfG>QEzEVt zfa;)+69Z~fTm2yMPFNWRJ7^W{fcZG5u!Bd#kLq{fTyXf(Yh>p?RCuV{D_Hp*Rgftd zB5ZPW5_SeXRSWxY&pLq#Y=ujkAqJKc7!BqIi-%_jD*O|SFe6s|`SG~!M=@eujQYKg z;{Er*!!JP{w>KWdz_3EWFC08({RrG6{Sf`&_B&OMstd=vSJm%>!xGf*?E{~y4l|FC zVKGsfMEGzp#tz#@{TvUco1b^8ZLkUoiU6Ee6{8-WCg}^VOGw+B=wC_Dx(AEJ*;67% z|1}g>2Ex1+%w}N^0dj(UxH=t&{b5l-ecQh_`bi}XdI$UW*Y`XHoPUiBzEFG`@M*xO z0iOnZ8t`errvaY^d>Zg+z^4J927DUuX~3rep9Xvy@M*xO0iOnZ8t`errvaY^d>Zg+ zz^4J927DUuX~3rep9Xvy@M*xO0iOnZ8t`errvaY^d>Zg+z^4J927DUuX~3rep9Xvy z@M*xO0iOnx8t{BiTVJi@A(rub4u7!W_g)^p(szB&&_>)VUHPz213nG-G~m;KPXj&; z_%z_tfKLNH4fr(R(|}I{J`Mc$X+Sw%pv0aO&w@P<9T(%_q`{Y9gQJGKyuq%Ea6%sJ zm|moUJqNcQj(GA%R;~n?jWxpXrO7!0sQ-3m{ zc=oy2;@KBr`{dbw$F7-OzY}bJ0q_UfT-uqzjk*hNX%2@07tj6`?EhpgAw0mp0saep z{q7aU1rgYJ9uPRF+gXyK&US)8+Qnh8pS$YUF|et-sungZTJV}m@>k#WC2X{q5FMBS zXi+=3F~iN`>&^%Muow3;TJ?&iuKvSsmW4Z2km&fLlU?GA&S>NN?v3wzDAB(HHU*c! z{~|MZ><1pzs}F$0-tzDId$|h!FK=ZPI7@@<5##iVUZMU zOI@#fTRZUM!Gj=o#{ilR6{?J0Q;>l9RPO&jK*d zg1cZ%z&vAxF~rVE2`8nTlyl7VjMpU&>kfkf`?d7S_{|$G__DYF8X`D3^nlISj z5nHh5Zfm^#THAK_Ul;0mGZh9k4KrNiH#SyAmPOcD?JP-f_&Fv7!!B+U!eZ51r?yBa zmWmCqr+cv>EOw2t#ZKS@4;*Zr5DL5uV8*U7gzkh5*)ocQca}Ip!S5J2MQrPYX0TIf zY_UE7_|4Ft2v-&)dIP6p{J?MQ8oi$<{;dPT(_qKjxjUENOD!I{<1HTA(H+>C+olh5kvzq~h}>1pZU-kuw_~IVn1@p8yBa z>i1e7WndTGPtV_Ym|F;p~}~wFZ137r8X& zE7aC-P@Vyvov_8ZS`*MRM%^+5cB@S2>r8Z1#>1&w)`jXmsd{h%mRhjUfsGbzG-^#)OWUg$B5W?Y zTpdxtV-B!(l*QLlg+il*5TLCVT&k`9YVh2Wb~5%nn|ycwsT%O)Clto>6+zZE>aD8b z0im|ZhWZLPUpEfyY(K=mV0MAN|;X;+6 zs3JJNdqw=Joz_qAB+gE7QbFZ4mkgPFunqo&V}=)D^MA>z&M3J@14j(4JZw!a3$pzh zzm3GYGyWZkzm}~qI5bdfVgK;p1pj@83y0$eAByjO#Og9QjCJ5|3Y?)h-ca$q2JVN! z{Q$b}3is`~btoL3xE+qb4X%gNj$?x_vFqRL`WL(Y$*zB}>qU00`ycjCW$A@CE!fj_ z{)Gyb;_E42ZiRe_udlRDh0K{`;7r>$jb)H`{=m5xJb&I|8B^p6UZhUMUd@Fn%B6$< zOfGrkRhDpU+=}Xg^SiN91^ETVs->+T7avR2PrOm_w{^jEsyQDHE5hX2&KW?OPR^pE z_0Th`IOAu%nakhOHW!YH3pPZ@whXoZg+z^4J92Ab4>eg>R(qcu3bzb8=-$J=OcJ>zUE&UTXV;NWtw#shG)a5}A< z!F`--DSYr~7+VKn!r+F39jX%nr|ZCp(bxSk9p`%EERGp)WOSm*HRlE%s7`t0Ed;^5 z58k^XDo~P~>UD6osN0c#8cH33PKpzC_GL+uH5*R!g(%^)_C&Cci&zoG4zq$_;v$L) z!vky+nQfs~8~9KMYexcI5x{}h;J#4X4S=nOYZS~MfN*dQwE^^kfhGmJ`k-ZTQiSWr za~JAM_QYvnxKDD#Y4Jp$TjyTg=$c{eJ=NgrOky!pms?A4iYlBRe(RZ(aG^#>A07z^ zXV+l@4X#bCnMf88$zpK4hiBUx9Ld41htR$_$pm5=Fzs+eoohL_%Y-BtcEh2DDgzvL zr~@B(OlkyDgJV?*50y!&NGuXZ zTr5bdPrlkjvl5|9&xuxzr)MYHE7G%>+hw|5fE&l!GLWIz0FwT5se7yLLcQx24Dw%> zI!q$VOw2D=JyeE0`a*VCJ1ELsW<8ZAVJ(y!$HREYsB7RO7d^GgQ>q<_QLfeX7wU_a zX(bzE?Gxyj&Sx7|bO#jY!7J|IMY$E+uwonnH>?PU!#U;=u0U8S0|S`NUsvII?(ag` zDsiQOYzD_#Cj^G2+ck}0sQAT(h-)dyJX1x>0mnycV;!q1F;vIHM}fH7HI*#AtNfBI zS?KuMlGR@=Pu90kSW8^@LQr4pKKPq;lB3s=SuY=Z9= ztnjA`^%RL$1a1ejuH<0ol^nFal7ruVyn+lzns6Yr+a;h8?aH)J?|*sz*H_?w&^SL+ z#Q#(y{O#~elz8Ub8)3^c(bNckJI>v3?=c=W%PDt0v8NJr2ejy*fo*70-sDk#>(@{- z+wrVu9`)`<*!E=>$=aMba=ie2QQt&SbqgX3=gvmLK{4E=?A+PLion_pAc;`&a8DSX z#CiqtvLX=PzkyiTv-`frxk)Y?Ffb9Gs_agJTvczw>dnS#ijZ$(%~Q74 zixuG_-yu5n{@#A6@anm|hg{wgDMQ{J>YZ5R%Mx@6p6G6kxl@dN|KJrDvGZ;XTXFGv zqydASX9L**&WfVu_KszXb$T_-e{o{dL3lsFLZg+z^4J927DUuX~3rep9Xvy`2S7=Fka&`J`MOZ@PAhW`)_Gx$9ZL8E)I~q@P*di zSh(|1p9XvyxUvR8)-WjAkpc9QLKor-A=_8pz1YOHIj#Z+|nh z3bfWG7PA&;UT*dhZC0+MoZ^$Khx97cQ-VfeV3nL@%Myp@ET5x+#iFIC`j z1$Gh^@>UTR@>LUVPT|)o{QpIm*pf7p>jPIRpa~`{!f!)Z^g+W3!{#Z>bXH)k!hH_~ zKSF`~DX@;P$e$4kzMimIk>t*(Zh1@~-a@gj*3`Pq;JTOv11pgP9Tqf183|t>6bI@%Xxv z|0u#82`3TO61EfWLb!}@FTzI^{_6;f_9bjKk5A}dLl_spp$R7}-0KJn`EDUB+M`Uu zLjQ$?Tkznd62c-q<%EU)juP%k?t|xW`FaqJA}sisg!>Y|l&}cjNmxsK7vXM%!{_qw zBM2J_-$-~3;ZB6h35)jHNw_8Pj}jK`r?S0tDcno9@c2de5rp04i?Gm7CgBbgpE7)9 z`=)H4l=WNL9+;^7i}q1j{?}0aZ7F^q`S)rdIXN|@z??3MtCXCamTpeVb_nD%XQUKZ<#>@f&6<}lY?6~L`Q`$1{vva7ZeFfg7H(R$aFm>EPD#z; zEQoJ$R)#fsAh{HHkOB{OV~aI^=nz5@$Pdw3^Rv>d+$uTQmYb5DH80nk&MX91Bv_kk zUW^QFx;fiy#_f|>DvzYT!Absd365L?D?hB1YWF-9Y z9{$)?Mvl5s8UPgA6$nNe0sg_cGzw@xpb>o}=}w@x!G9_Idx58=aC0N@`@%mG{sZ9O z6aJ&X(+CKl7u+v}|84L$Ey}Q_q-L9YgI_eJMX3smIUu;e$G&b}hTFoFod*uI1=bX6 zR+@I6EhRtQ&12!A5_9Ld?I3(8C!i&;w_yeo$HcRns}DRhbiu@vOzGx~6kE1co0gX= zg3zXA=M~uU-D%+Qf>4n(2iVN10gK#+-rvxI3QAD}{>s&dRsi zK!fR71(xiTG;@wQ*Q(7)u?W4GGqqPEqRHdVquWMAl)1Yq5lv}%mL-=_w#k-m)#jV6 zw)|XoHk;xMl4G7yHUOp71Olg0a2p|lsTUck%@C-EzD4FtdaCip2AT2-3 z;%UAl?HFv<#%8A!6v(*R6suM|A((eBcQN_-DN9KI@V+NJVm)%Om=sdV;!Q)9D^nrkL)tR)(i=F)wPk0+6Cb0KvQu(W(^FtG z$-FH7a0fe2{O+ik+hx7A(lSinB2YTE+2+DKkm1G*0ZvJuZz}*d0(+H9S*ws~&W5gl z$Rba?;*px3VolNJm~&F0zRDjb3V%#EltZYyG5<|RE4)keAa`T&coG(t{H#S#Yxjf{>o{;lnAjlX*u;pguc z%abFF1N33e&wyr+xiIJ2a`1-54L7~;50|v;tl`5`umQ$iHSiHzvT~E5Q9zqMb0z7H z3@BU6kiv5k>?)7hSMyfBK&Ki;$2>X8*zGp3h%uwJS={PQGk;s4HKbB?!Sj|EoyMP)s7ym z6`(wokH07}>MQ{Mf-lBn1@;#n6twm22>u%)jXGH(T{iVX|iP8^x4TSF| z#aJ!k>j7iE7iPTzuLT?|m_YAS;QJLAb^`Ho|9}ENsK5^?@D@LB|8FX=Oq9#shAFsC z1y;6aAqqb3e4((yr-u|CA0laq0lIV>bdUTb;0uG;1Xz@ArF-E{P;_6`MEF=QMQt=o z{iSrM7p#*lFlq4Zn?F5fpf~%z)j8~YZ(w#Z6>2wRff?{|Z zF5@2g)&!3{i0y#I8|~G|Qw#33;17*luRqkOyq+)9FM8vawEnL<^_LQeZzTFi1g}pA zs2)zgk>h!-yz6BtxnD*0v%)!lz)()Nx8?K<^=n=uemm-SamhW`>_5EatW(HcMtBI( zD53#GbwoWOUfUfkAZW0LfQ8V^eP!9gF8&hQHk14S1q1}*4>Ey%{()GxJbB_5>?ipL z12b3(!lM=ZgZw3bDKH3J1Yy{I*lr?^o8V?rGyJn3S_K6M;h+7OJMI?U2eThKqOf@k z?y!*azipZ^A@Qo>?I`HXKNxYdV838V6@YrUPw6IYLS$SJDF`$f1RBLZ*C4w5kJF!Mw+vG~?F2qwjezwiF&Ix7 z(YN{RG0PZg*k9~%>JZk{!uR$JZ z=Hofc0c?HQ{S-yTHuF$dhMpmhrcGpJNy#B*OFc-_1e;F0QZ+mZ+e!uJQl#$lHOWyf4T58=PSYod@boc z3huSnP#z){G%imByv5mAAG8k(Eds|v;a0TUr3*cBQgrTkvE3C$xOZNo`!BB1{a@GU z{_*^#LJ4f7Hcw@W;?m!`O|(cQx#< zAVoW*xIPnk_^v8=7%uunisMBXt_J>ShwG7A(I4%*!XNE#f=fuf(OWIv7Q zET9P6)^OaK=hvM1BE`6h%rCnLa)I=@RNwZpxQXIlG-x1JM$qM~Q0h;CwsL zTB63K++K`hZ6NF-s#`|>h*lFd-bwz5YL;^>#=#;88;F{SZX+sB!{zS1$EO;Oqoso$ ztuU%(h4Hi;pkfrPv9UCa=Stx`GBlP!}6N9Ben!nj&_l;J34xz=z{7Szu_ zBTqJz%QVnpHt73yru!_g!Ld!x=;Odf(kZO2q_?KS&x7&O0*DK>fjKUZQ73|LK(7>^ z1zH|Vkr~1+fN(R}_-qP{2jRG_XI!>1onvHI3LnGFXQRLKyuwpTeC2SKfJ8WooB{F* z$#_mSNc2_6#cNVNNGHO=5}}mp%IPa)TH|#PLlR}HVMtuc#?y&%h|#!6NTU_{LIsc~ z`5+UQG#ygC_zJRO42_46VWmNsm=jhQF^`1MQJ+|jazLXth%*fkFU#IJ-&9I?ddyNG z_*0Jad#4~B!o?bsC(VO0oCiKGuX7&q)rT+F5T*%p!@E{Cp0^kSmh?rWHTk@Ne7+zR z_^3g-!4xXTOnG>X&3j<3SU}Tx;0I?QA|WSG=Z&@6jn_0$9)yhEdgqe00uqyN9tX<| zVk}t&F_WgnyG6!65Aub<4Bj4CRRHP>X76S7$8S^YQ3lCYTKai6v4keMLN7FDo8f)hYLLtQL4E6^h z9G(r+vvSPFd~;e>fjOoClZX~PZgEwl3mr7jXCrdXfMv_EeAOx!S+1`}{TPNrvUNiFvTLl{>?CFnRvKq$d{x3Vhmv@vtsC1=hv5 zMUYy6dwhQphF5}dwp=#(sT(|0Fo^bB!~5YnqC<#A5gkEPPc)XOfvAya646Yeg+x~p zEg||i(Ndz%5iKM7GSPCPTZnEW`Yur?(GQ7M60IUyP4ow%zY!JT|3w&%YG?CRVMN1; zMi7l63g@^pchiX`5j7FD5M4tQ+j}${2$vDvMzoUXQKBxQbwq>j;qiqNjUcKgnnct> z)J}8*(K4djh*lCkO4LQPj%cuh;v*VCG>WK!XcAEi(KSRj5EbE<5#C0$Qt*k^5)HnW z$Ezh8MO07JK-5IEglHL2uI2xX>oi-gln5&Xro)H#0-5&kC_f{ZZ;2;#<9M>$6^}m70WU9 zKXLSc%fsXIU>;wA%mw$$A`hN-0<{dxn<2%y1 zn+Ks=H^FDJW@Y2^DNW56>%o0v^G703m7jk=V6&j$kkIB~*R@bU{kTU9?@hb??!$SMP{EH}>rp*?)j;;Gn@nZW?-X)Ue^v@af5Deax7#v2o+Z8{#KS zOh}wG**InDwCOWu&Ptj+XYMVx-j-}iNrmq%Gv;Mx&0mn6lbdH*m|tMEEm~Z-DIVgL8_u5&_Q>aEq!i6=@Cu(;LVd%3GOPyU217v9k8mMs8A=U;zcs+az! z50s`K7+3W``Cm`}zqo+>uczmKnx9wdAT-Tq9fbe&^#6Hg|c>v5%#Joo$#za;zj84+3MO}rnC^D1b15ccO#>PHyoRnSBc4&+cW z5az3TVEltHj_;yLB8>A+XiS7dIFvF8>j5>jr|sgu4*d5Y`e7C)|~=mT))15rn%F))DSOIErvj z!g|8J2pb6ZCTt`uUSyL9;~FD0Cc=F=lrjm6cMA()dX_ zN7zKzpRk2+0AaD-E0D0A_{|8H5Dp?-N;sHsIpGk(Vtl+gVJGp!2v-rlj&L>M7KCdF zs|ic5a(!wDYY4X_EY`8LA}rRiwI-}3_iYI42)8AyC)|#(k#IO+6X6boErdG~wiE6| zxP)+L!li_-CtObW2EtClT?khZ))KBJ+?8-G;ckSb&0Ig-32O-VAgm?aldz6(FT#4l zy$Kr$_aST|d?R5C;l70Jg!>ULAsk7#obUj`PQrr-R}mgUxSH@yglh>8B`lTm^xjNZ zLpX}CmhdpbI>N&V>j_5_HWD61*hF|VVGChBVLRa%!X<>q5-ueiOV~*`j&K#>afGW0 zk0)G9IG(Wd8c**8!WzO832O-_5Y`c%L|9LFGGQZOBViNase~j{?>n!cO6zaFy`igZr-*{t4F#|AeKjJblrGHH1|W+`pD^2w@%JP{MlQ zz8`mQ6z&O|gnPmk;ab-9j_rgy5-uUkxxTAU1OI&* z5GxE)X=MPe^A|>ZpJJdH=`@S+Gjo($E$)H*IOmZ()ZDdh+ zxIP;VejkGdzk@-OOX21cwh*?EdtAkj23H!O!FBv-3Lped7ZT;G7;vRO8eE-^23KUD z$%2%iv5`Mq9e}35oh~k4Hm!!pruZ{R-bIwoOj;9=0$)j>F_T<56mAM=0?h*QhpYP0 zWRic}p90MSa=(DWD}Yt-XlxX&mEyNhIP)kTTm_B>S45y$K&wk~+U zjWKT^#S-$tF|K9j8sr$uOeB1>-%Ng>8 zJXqckPbWT>vq+d@7XEV~MTo_?1D3l;n3)!QEPt3@5kHp0NI=3pmPf=Qek_+Lk8qFW z6ZI$3Umz_6jPvE(6o9soFZ6-sHWH+z#~Q?r;Z1jkhvgXM6X9Wb#`Mu+5v0NRX2|jj z^)<#lmyYEe;}iPDZ*4IDMEqFpBSAVb&VuD1vCtpZ1B_3k59>oDxEA9$ST8Vrd^HVz ze{eg)bKsf)$V%mrlF#amy!>GOi3Hyweds2V=dHyT|$$38ht} zkAGb=&Ygc)A2B^b{v4LxM0a}ey9jyt;QKu#y7h_m7r)~Zd9gi^V{8|^F|RKoeb`RO`8ljSc*4i_L(VTygoo`3=8p(3 zjiq-ylrV0voss7!Z*M#y^7aNx;B4lBw>KCfFL4VYJ*c5Elta0!K6~;vhvnBKx4wD% z6faGo_<8#>)?I)2IxCNSxULUlOCtBYeHr7%ikEc{^jMVG5nqM(KKXOs;I406 zf4FXk8?L_?cl*Zm=V|Y`{>HlNX8|ieJpGNy!_(tQzmQL?1>*80xa${}Z<wMBhk zc+=d^e~t~Z@__tFvi<{NqdWbc_XysCVEK?6G4CRt7h;~PA31VX@^Jy)n}@vvXr54n zQAPZtWKm7{IN@5tuL%!(d3dFSHH7actR;Mqu#WJjg!P0E6E+flk+6yIcET3I9}>0` z{(^7`VKL8EN_ao<%L#u#*h#pOu!ZK$`Vg)n{$qq|2`?b5BlleiYxZ${q!AYL;wr*g z;*0*IjxcP$%Z#4zTZF|tx|nA-5nt3F1La=;xwjBs^pEU>R}uDZM^fzmX?;yU3;twJ$eZ=)C<~cKoA544= z@t-BECHygA9pRS=>k02AY$W_3VH4rE30ny7B5WtTg>VVs&j^LE+>3|u#@mf!c~M%5UwWt72#UK#|TRw^Yrf~tbdu~?u0eO zHxn)-zF1eFC4M&XlZfAou#Whd!awCtC}BPE69{i0|NRLYiC;k2PX3z{HW7avVGH5s zg?qxU5-uSup6{iEw-Udc@VkV?Jib`B;3WPU;)`_!HxsTRzL>{fL-K|R_rw?PC#96$ z0mQE*zLl_8rxH$BI>7U1Ghq#3@qSlA@m)uJE%7H4&ZPJv2OMo;{^Ig}*gM-w&@e(ts4HW8nXM!?=#lwTu=Zz29F!gj*{AY4Lt5#dt8j}xvXc{&g-C;nW*QKZjqgq_4s zCtOANeZtj*cM`58TuxXz#Pzw2u!itQgtdhC5UwNnIuh0q{}#exUhEsfdgAXOY$E&~ zVLRa$2$vFml(0nU?L^o~{EdXG2;VCBQrC2S&oD&cVA z-$2+xd=ueH;twHgC;pR!O9|gW*hKDo6Lu0mi*Oa;Ji^t4{R!6+K1EnM!u4B1SVQ<} z!dk+w6V?%aiLjpVIKoE47Q#N_)4+eT2Kf91?!3kgAJ0jFaTz&Ig;@|ePN&&IF`i_0 zfBVh-XThwK-2Hr-jTG(|(5$1t*)S_6cb^R-({hYsdUBixqik}#P{GGp1UVmP0p!>- zE5zkpB1` z|B3mN9GbP|^QrUPqi%e>G6iN;xZya}EicEOl>h<@`8oEahvO`_d>qer=Re1}itsJ& z^2+&QR$Gj};&=XX`8?&HyT9FCKKXbgmJ;Ef=a+asaef-)ot%$*&v|2S|G4{{obTED zfQRSFZ;t1=^N-_9clqHs2ljxIhnMTlKh77k`C`1)BGV_P$Fui?a4*U)$2f~558vi4 z-<-cl79P$|nPnK~3(*xfd_FhJtxrDxE>?5kdJdfL7ONNd`VOogqI~lC22c4BShPx3BDh`z^Fyp&L5%wJ)K`x2$_?N5b-sJA4L<)o&#f;$U%bFwKlpsC zM}9G1Dr^u(LhB*)$LE(9xZ8I=KQC6P;QqTfe=k*NWH> zutoUG2~-;606Smy0J(oL!y1*>v1gZ z=Q}T5{MwlQs>tZ@%c4ue|QV-!Mw%^Ec|nv>6VXU+^LfrjtkuF z3CC9V^Omo#@xLnJW<6G&k*a=Q6+KX#)@i@a^m0^;ev|Is?G>hXS0g&{BH z_wAcLc+=lZ1a_vZ9B{~i+f;o;R84_<5=ogK^kOPXUP=5_tXq<*f7>$b6duile! z3`p6SfVv4OwOYxnMa|yRWRu-f=@hoj+t;erQ3_gMrua9m;dXx4_MpIc3$_w^*>}EyHRuGI|xm)>V~-~lXJ6fyd%8x zDPut2Azu#oskbrh(S>_oXm@79eG&bG+vnxRcg*d8+SU*1rGF*Bn192?PYshVa zjQL{Ot;0Thw8QMW&QT9apS5}8?(K`8zdhyBTdn4&z|6qume;SHw{xbp%evu?p&^e2 zXIb8R-@HhB_QPI}J>iUDf}hjc>0as9 z+H%|O6EC*ee(coO`D$~*#E8Z1s?X=_cwp?5gL@zDJ!8|U&w77X_V^30jRb#^enQm` zztyhkzI<0sXi{Fl2V-~M8d+xuZuwK^*`)S`z*4*__yU`yn7`~l zm=#-h?(<7JHzo7fGd&kATf1-)l%VuKzbl&ai~5yW>sr2Pmonb$qdj0;jE#9rTR4#iTY88~B8$l;{07e4Bh zGIMoN=lK=Ct+p+4#r8WmzBJ~^z~H^3n!R1>sytXT!}-U_*JD*bm*1)FQP4C0(29%O zPQM!1Hb|cuef#8FpF1!(=G5ez9Cg=U2G9IYMV&&QOM;1rN-|%W=m+{)D zSJodo@W(wTKK^Rb-OkJzPv4sLdhv)>Jr>3-)4)z*oqJDcpF8W-)E{0d?)LMSe?GJI z^v@^T|MFhOVEdXaH;?MK?SlutdbvYz`fs01nqPlYi}^F>wb_0`zc2d6!pz48EjYGo z^Y8CwrT2pLoc=A@{^#aHGkz@7PI#1u zzf>}}+pxip+k$SN_`sR*k&7?pZmiKaZ}(x{gJGK585@9a6oadGbx4>T{>ytF=W zRpi+6EL-2mek*6ap!vB=m88FY&$p@DT=Ul))qK0*LUY2%sIps`P^0a+#^r6Vt&eV0wxou-{)E!4VEIE+BXm{aL+rM2h$$#Bx z)^teH(`P=pB|C4~>Bnl0MPGb6FLm*hA&%Xy*?qrC`f9|%r228)+Af_{HrrOyYudcU z?bF`+?rd`C-``{na}B81pFBS4>H7;#gq(i-r^)lKd#de=pS}6!`4;P=3Le-Ie|G;PeUl#^9i=}1#sk_m zHy0lIdd#7UueyzDJL~Js_auM&`(nqwnrG)u9pFE5a?O}f2v^d4`Pa$#}B#Hz}}^Q!C0UY!@c_mwwhR%SPU;)#c)3d7uy_q;#hx1qGP!tCxah<{xO@hX2fYeMy`MG6V17R_w&=k!zzZZ{&Q1d zn?9ST{59;6vpw7D`X)4Q;s12>h)WS~|Fvdu(%2`rJ$HI!!H!?XE!~i6y=G#&fTHv8UfFBcpCk++9#L zFX#JaWsgm%`^EpmXHHHn9o}8@`HKasV&6X2>Y#u4YRhB8znJQp`uew%{%jvK;DyBZ zPkz2Bbn=g>_ulct_5)q@8J|c+ZJ++m_RaoZ`V3gP0(En`{o?dLe?PKt#TJN1!d}9CVgwwh|o0)_jiqa{^p5q?0{V-)`>PttDum0-$!P`S%x0F<(*ZJv>Eev$Nl5#zKr_r@amwf_J{mBUOM;Ys8=^_- z!@m2Qy|wS`YvaF|81lqEzb|&(H|4v5_L)2HD@z(MWXuf#jyB(ZaH;iQ^?~XoY4iRb z`f0`@(BS??)!CCvzu3M>+xf=hceFQ#&^g&vGyU` zUDn%%Zp_^^@U4=eyT(LR-nZn{9$&SE>CC0p*(p;#?0Dkshu?f+(z&ONH5b2FxI8VW?^6T5dZHV~Cuxe`yKThG zn-_l*_3TF@CqH?3MZYI6JZIf=apxm7o##iLPJa1u$FD(u{IKTJmn-IsI$a2q?n^fed-~y))#@QhBie6ScizzZy;;4M_CM~hm6q6}TW>uP zSzYWhRJHXsB}C%jHl1-6n@&B7(WW;aNFK|SGw!AQwJ z_$J9eWR&C|YLEg#r%D0MZq#vV}?CUo`zv=ftY2QXMWz9~F7}yQ5i=6!Do5+$VdNCGK~I{2xED{^xFyJ7dyx= zBaG{lrvi2=uuF!aI7;C^@c3{=KBmV=7+0)gcy<{^ewhrTd{r_$8E~BpV|pTf6!|fY zeRGp3!&pB`WH=76Q-(1=YGoM9WB5;=@Dc&*Wf;?wDZ{9r4Kj@ScFHi850?z1zJh=D zgpc_jCBw4;n`C$<;1a^P0vOY?jWFgP>QBs1V}4C z@dcKC;qeQ7it;5e1o1C5VjYkO6lVf(C+RF0{gm(6t+dyIt6Ug0!yG~=?>>w z8h6L{w$5i`uXuh?t_XrroMFj^@Rb}c6`tzj&A|~tj}#J{p~#Yjh zg8Q=1gYiO6g;Q_;INplqvEjIT78|Yg-mP84FXH3wFf`;yKrcNHCGCrJt!Wjczeo=C6l{tF z3>xO27RKeZ5DxCpo&xzV#+^y52Kght%Wj%qAXtnl(}lT~B6ER~qnj(06mNG;)iOT+ z=?M?#F$*F597rAND<4wmZM?(9*$ZqhJZZq0!F-luI1hpI^x{N0@3P?S4r?8z2xm9& z3rVD&IS!OS>HbP`db@8ZCzd`?NTmaZ=-aNvSZjduOoM>bjRC2Jp0hwG<1jI;d+}?uMit^$Ipt>vYf*b zEjLQ{xB>#_iZP|U^rJsKGr|Tj@$z;#|NQ(ttnrwy9;1v0pK4mrCFUibOLryrm|M77 z2J0C5@lHj<{Nc|pd^+Is!&A?ca^O?G(4E$%pq_W37i+dB|n+cE?*l^yO&@ggYxp?OqiQZ#QG%D^`!e zz7OssAzVyW@WaA7h6QPc280Di2KWbrX*9unXS=CT4?O2yYT+F(AAYF6u5j*kD8zvX zOBa^p;gDu;GXh#%xeG0X#>>2xg^cTk@TAmSX_S}8{%~?df3m@Ngh^y20Yk(b$zbJq zCfF4~XjuNVkgmS))580ox8w=n3QIn=Kc03+gv)8I_>9NfTB@!0wy0h1jq4QrU^lzo z-+jw&RNhdkXGZO9TdTmH;G`Dc_G){_M<=}GER^A!9$px6^NVG2Wg1(@9&x+xIV$z5 z(Lejk`53oeA%NRGx3BhKWdfK3lZVf+$NdauK2`9m+<4=oX!g1>cfZSxS#WjtI~j$` z-$CL|PRqUBOFt>_IR%DkWHMa;^~(kRZaPZvrrZ4|yWa-+irx6BDd&Q^$EUh+ZT+p4 zL+m5m7{kFZMR=$#Klm$(fnfjJD4t-0V~#Um+@eRrSnXtG=lb}1w4h**Jog{$N6G)d zYs!>7`QBXAi{+Ee3y_)~-fl%&x@g@Uj3y3Qfz%lM*h-|%g_l+%wU^xHKw3Nho%@iM z7KJ{5wEE3AA4F=LoV*UHG%aX7(yE=WJc6|Lxv7sL)n5F4BT~!GM;=F7+AQixq~*Il zdx~Mz+oedgCs#j>)af_l8Aj)IeHLj+%O4rFtF}FdxH{^t=aFi*PkaHXzNpPVkUBSf z!D!VV&z3R#()<^ZR=ucu2`R|IsI>9zO^8d@-uW_8&8IQ1AT3=O@G4SE`ff(cUtPT! zu`{9vE6=sPRx(<0_!~xb{l>nAeEpDT7&V=hUPr8%n#^c*=6j49b)DWo`|7enMs-I% zWwdnjpe<-$HR^swwJXjts#`psm3LFuXBpMoFLAnV_EvOXd+QcP%fD>#7GkMQ7NaKB zPDXVvbl%47{TDH+3qQ!H{=44W(Y_?d&S>eYM;QhEyp8sy$!i$3RDI28`CmidLHnxH zYZ=uQpJr75{qT3u-V*!(qngv-Fmui<4*La zy>ASsRauPM&zCT2Qf*_jy7ntZb-MyTWa+rGAEQ;Br*T}mgwv2xMx~_PjOyVn ztyp`jdm)NZXE0hi(!r?ikHsu zd(HP@eD*v0GivHHh0)UY3mCPGTF+>0*)~SCmyR>48}&D*SzSIt|N7-Ij9TnzjMiqa zVzfN=9~=kmWz@O#dq#Cr!uF#-7$I6wtJh=swa*!THEqZMs)?94xoRiM~oW(p3A7I*HT8S zM?B7{{#{1xgT7$2s^wqY{;N(0(SOyW(TtXknaimC*zJs3ZrjLc$)W9x)($$xXz5*b zj2f$(SF!jPbz)Q((3eq7@o+}TE-PJYA;>QsOFdTjOwCaV6^s* zHyJf<`H)f5=_8yU_6?)XzP~W48LK*k@$08*IGx>vQC(7hMy1Ik8Lb+bz-VcYxr|!; z=QCG(&^|EgT)%_S@==Evt^Mk2MlFkfV$>A;H>0HwG(U{; z7+ZH_)Uq~$QH^vnqq+rgj8+|(#;DXcmE+|WM)e=x$*8IIT1K@~A7iw%_(evmx4*^d zsa=eg2YkY)vCAn&or7u_)sDWzs3kUx^(V{6bY!%8SOlY*8;3IL)!ziUnYmy4dbf8& zUmy9&b^Qltsb3p8>+qef>mEKZGAk!FI`-EiBWH~o`uz8EejC~RgOejN$9_1n<@3A$ z4}0$dP(}5w|F79>U~`qLf}#T6@RFk9HJL%9A}@(XhG~k5Mny`9g=L9mMrmb6Wo2qc zMrB22MP)`sWo3nCrDjECrDe56R8-XeXU*(^?RJCqt@AtQe~u%M&pT`0S?gWzy3TFw zj8E@6lDM*a+vpjSk0*Zm*3Pm;BljkT#}D~yd!bODpWSs$sMV%ceDP;_i-$c`%O%^M zziH_6iGlI`?Anci>U)R0F8+G*4~bzLMzr0mc&Tsyd}vhFf!`8;KhUy`-_1VihnDi3 zyPhmh9QEN9{77Dq8aVyaKgGCk^~F~_ayl>kKJoe|`@a186+!CA-@Jxy8WyTPzu}1$ zJ1=OicKPk_`lqM0R{yFy+`nqwp~OOa&If6G4Ko>+3h% zwBq}=YKE8Z({FdOsfHcR)o~N94La1%OC2_O&i>GAL)3wj3qD(?`l#O(h40-GAEx$P zbze}>b*xHoy|uE%k;E1K zJg&${3Rg2)-CVS2i@$o?GjlpkeZGbI%*2)Nk0=aQ=T~}VR0OwBYi&ITb@%C^4*a3( zPw$7dP#+yR^Z3(mc2sX)Q1!}vHOCVl^c(TvV?Elbq5iW|_RKtzI6eIX+lI|;)MZ0Q zAK4ooqn7pTIX0<954BJK%npk_Z>1Lev8Z*)#J1}09i5Mi7}{Pf@{ipfy(~oa`N{e~ zieDG?#MCvu1&>iR4@0+^%;}fT}@kib6xMKj_T;u zlRob{t+N{6sUmpO1rciBPpl z*z@b5gVYxH%$&0)GhB_BcK7~$_w`n%-FVZ%6-yJh+TeOAz&GPl{9v7p2{Pft~2XX?`4oM}Ux6SRUwz(_jz3K72)zn#w zM`h&nk^~LmsRhx@@s4INSx2|4rzPe@HyVa#n zMXQe-8W)@KRifI@{@5MOUb3k_e6r+~c7>{X=%F?Tf#yfr0nn~5oVn1oGuD&es%jh5a zsAH<{nlyLxK(*QOZ71u-^jCL&9XG$bf4o}teR5G{=>EhtV}A>r64XHr{<>GQ{O%pq z&ufEP?oj_oyyMehw+)@zPK|lK;FA1to@(awm$sePBS!T-m0hebWvZ7X>R|Zw2L}z+_!m)+Qh3xX>abE z5q+L2Hjm6*wBDZB`Nv6qZEx4q7dLoUJlwK2@!8itiOP;s)dzfIFY%iar;hKo`kipU zlZhAkME!bUS|9a}>%D5@e>qZX!5;`)md)V5zVUs0&_ zQ}66DJ0R$a-s&M`(hIYD{-R zYWeN2NBS>_QGc;TKmO6?^VQTZ-b(fq{na0?&FJ{<{aw}XyT01-`uy&M1ijWn4GqeCV|w8L zwdLX$E3+;;mUu(wds9j^SUj)w;HiB#PVxIUq?IYs}9YuEm-5N zsWE9qyWdV2r254V4z$12U!BtGs|7Ld^u-w;;o(4&}TOs8UIqW`t6OMPl+DaQ%&jg z?15iy@2nQ>Jz0}ETvMA}xo6HB8!uAJ)?9l0n&s!K&lOL+{i$oas$2eOHv7HJ7pPSu zlPZRncUB+YKI`UTGn3Si=2aEe zu!qmlXtid?Pd+*KbyqLE+q&pbt6}PxXO4b9`cGATYwB*{bKQlG{$Yfg@ngS*tEZ=^ z_SOFTUz~c8nzt|I#pA&})DO25FKo4OxH|R5k`v=fJE*OPw)B1Xv%%`h$C7*}emYpq zN$t34Oy3LDjM%t7+i&ZqZhbu|enX4)YV}{UZ~5!qBz5lRx<^gv{{M0LpgiJ>tc#;UjG?Hr*#+DYyD z^x$h&*48EVwC%S%eMyY^&8&HIhCP3&>ig@I6Y_RsH{b)Gt> z_?yE0-UHP`x$m5pa3o1>ms&YBKx2?UE05IH}p%&auDaeNwaBdtvQ|drxTP z`;?cxH=odcSKhd};Dr;~)vwu~>v{hPZFlO!PqoZDq2>Lod^GTi6WYv{yJp`%@PyVz z-{2~RzZ2Ts3u}M+>gVIy$E{cGQa(PeeKYU%8#7)wuH8MiO}px)$F+oRWofV8bX;4P zJF8&r_~TmZZG-tcuC*Lj_hh$D$F;oj>G!?je_Z?E?d0*(tLrqs$2{&Dv%OCH^%Lcx z>o?YE_x~`#^X1|?ZOGlnuI#v|PK)~R2L9@_g_i_uDN3)??6vPH_i2Q$>OSC=j&)j9 z`8*Hrz&dTwJq!Q5{opa}uvgJtUB5l1-J%vwJzjB4t9;{~up?`aY3)u%bZztCF>O)r zor&4E9@9Mk-1yUvQ;%sQTkTmt@6u!1XI|Tfrt~|e?I_4j>KlDbD~{dKbC}ODE$+o9 zHY}_@s!do@GAJI;h-y6{5jw4!bnSbr>oFm!`H~r-I z=J+F8)!wh_N>h$#zjS+S?gt4+w9Y?PUUDq@i1y_YC1hm45$$Ni^84O7QmbkG_TN1E zms;(Mi1>SyFKV@cC%N!=yHF^9E_T3nU4<-)_-JtqdgZ%;U^ZTRk@xpD0eYd&+9 zU!Na(Sj(B`H@?bpSZk3{-8`fEkoIA}3$8o-!y#?brgi*ZAtEBTLwLGNGq=_9C-2l9M789JZs(|t>x89-<3BU(vHNAx^~~BL)w!=&%a~j z=tEj&jNjNzLk?-*mET=9ruQK&X|i(D(RPQlq8EB*y&QH(^J<=+G0*dmR(D?Kgv>(+ zwO_+4%f|hBPx0_+6~RBmHe)|k;qRdK*zj*B-*=!!8{paF>8hV= zwBg-$ZM~GaV>>2Kt-Yv5 z8}a9J@tp?NXm_^#vct6VYP3;fCv1KOV#ezaxWtOHt#_jd>Gx#oaY+hyg%&#pS4 zy_4VdSk&kP+C`yNYiD0{KwG!rigCLK9?*`qzV?stJq~DZ2X!6#Q@aD&tH19}zbWE? zwq#4Z5*ctn%dk{**`yrMvU)u6)`COT+ORDrp1Ab)YVF~IVdWjFsrAXI5*Sl&|KzoK>yuUs{k8JE2-zchmj1J$_lWwzT~v{8ek? zGFm+Rnp&-Wzv0pRF$vXLmylJlN|$Oa|5(ht*V&N}tTSL2FeQ^7Jt@XUs&wG8oUmIH$RTumI zey#H#7bOjSbHDb}8`W3Od1=4)&@C+|z5eumZAEZZq_SeawtV&Cg3F5bYu|KTa(n6B z`?ZjWdBG9$_G=5iY883+P5ZUkGl$&eHGRLP^r}m}Cv(3R&}r7hHskhdAANcJ$=65i z*UtacH*jLgey#n*3HJnQ`?cUrefZn2tu6oKu0`GUYrW&I`Zc}XeywB5(~yft<$0%Xb;-8AE(ZG`MJe*Z9&iwTg(FXe=F;}@)o=H!QqR2JI=Ig$3kW=f8|=c zR`<;Qts^GewS}{CSN%EGu2~blKK$?~yY_x&^UarBV%LJKgZV@6;`y(A(BH1LoY3}_ z`{V7}-p)7GWyaYxo7FNeDcY{}yLnXK_7Ujon_Vm5huEz)yS(qmX0ow&?*IRp9>|_? z^)zW2+%p~tHe@Gr!yIy5xKDw6HeCN} zvG4ELPj&3`wY|QjJNCmJ`x%aXb6vtL$9|;ac#dP=Tz56!u^-_$Uf|eo?$|GM?3?ey zFLCV0I*u=M?6-65FL&&l&&F3d_B%L^7d!SlI`&H)`;OiJ5}KNyBXVZkBxYVSU4Ol6 z%8Z#h=S?#9CviX~Jc$E3bHL9|L@8%=M zNBPJgVIGtHmh7unacq_2m^^-NJLiFO9ysTL|0^DN_k_3D2tEO?gBq|KdR~?%p^vzKIC_Zyj>J+}r-Pk0|Kq zBT~VcHhJDMC%qCUS)ME7GByPYe zi++qa%`}|tk?FYGOkH^_j&qlxm(_@_^ZC-AQYXDl$nNZsahhp3+auF)x0$-~SSshn z#rcTZMs%Iem-Zx~Yi{Yt?(C6qnrS%OBhzuWnY!{=KIfL9SJ;TI^ZC-AN+-QN$nNZs zahhp3+auF)x0$-~SPAE*boLPu;7pseC&NiEAK9HfGEOrMXM1Ei?lx0b9xK^MU6%1S zqU(IVJkRc|*X7jsWnAXwY=?~B-R5jZKIdi-U%X44?#`2b$#>FQB4ww2^BftcnTE4H zG97oDsVk3F;!`_%+#7SJdPYkH1*+}ODNJ4J!8+7jfa~?S7fpZ=>=YfC81CgPMu&!pkvRGqYEu&Q|im-5LqgXjM z#7Ic?-@)NF5uWEG!ZW=^c!HM*?-gA27Y|M?94q5lUMH5-C~afhU%DIlL8pBq7UJ}> z2(Mn2)L>t$@J+A@-_c$@UvroH1btW$L0P6r{k_^m}!~$ z@M-BKS|&6TEpwY!h2?~1$aH1CULlU9H(^6to6a&G{oK)(RHd1hXhwdUk>6&${Ny7{ zq1Y5*!!Js(B7!Hw4nHYAitv&9dfozrZ?2a^-zsdm)*O!v=~a#!K8RNWtRf)6R|Jgq zO4Y-CEW!uh)W>JW>(KX+`>{fpc2Aiv#2?^d?3S#@Af`bbmFm|95TB^F)5q z$WMZ&2n#Xtq~}Zb5;nj}l)s3|3=&ak%|ui}poq$iuv0TCL&_aKFny=%aXc*mJ|93T?8oIgi+$?%RFFHa0J&^dGR75 zvxkU4Cjy<|ss>x%x=Im)CMcpybi;k?`nIW;voGcBLpkHG(T;L!EIh`b|C0b=2<=FAuEM4%|H>d&XH!6^lLx-+Wj=Y>i&xL7qNMfA~rKZ#3r;5vDNkcrk=-0?!mOoY|EJ3 zMzmBS1SO-Ftt^vL-Qz+;#>#Q2r3j-;oXc#9T+VR!bM$HJM* z;1xIt7SMSs~P| z9@MRlqPab+Dx@-~+~|pnj3_N_q9yg9CH0^scC@T^oNKcP+d6B!UiY@OqVBb%?nP4f zBB*;|r`J7>x8is!j<-^pH`KjWzSPMOjs1-!rIGkGa%p&# zt}n|%j$KW)3A4QPx*a5Zw>sL9=_8ZPxLjH0X?H8~)slQglCKEz)m#`YuA#rEFJm)3 z*{1WN@Lel>hkx;f;W?*sT-%$OwriW$=X@a|pxR-(?h_w;V#6oi_{2*@_Hyz`FMOhp zXKwm|=DwmibC>3{$>zEAj#YZ^m{IRfd9IlUy+5(gpST$>O`T|85uMeDj-C&vKH3~3 zUD;L7%@|m3ldG=lzPoevFdydQHqmUfV?OSB-ap-Umqw$uxLg~!`orAU%h1i7&ec}4 zEX?!F{j+8ByindT$g^_o;vwWOi+Lx=887u!9-j=$bn`62(+qFSJ~Lf+`Pb*g%!$*O z6DKeh^s4XQb7WePQ63_Y@ljrnoHEXyY2NL~L!;++4iufUJVk5z?ADnfqIFuZXieYM zdR?TwMOApYO#7^_e_Z{q`yqfam-a@U>c?C?Jecqx!kdY(b;eli6JZe%>%!vAx%K=k zMXUzlF*cobTWpT&KgaCa^_=GD_XQU+$Cd2v97XRZ=rfrQL^2*yz%IA*a} zg$MI?ONKFX*ROlbGIeEFU$`rC^PHyoE!o%5&qOdUk4UhIh+g{0q1OqewLj(NN4fb@ zZa$QoO|4Jo6gU%zk>Z=*_Yc6gO>2-@mz_pP#3 zdX*dZFl1e~5Le5W6`_Hau{MK|p9kl&@4VHg<#LS~*_C>n)r@-s(IU|9U*%hAEBDIr z%&^7_QOwKKGL8E;D#8vT+S_zq^Ohol-d03+_T~1I{=e~`o{qd{BW;)L>QC7xR-c|1 zdGD#{6-E3Ae#3Uja)11*iU@J|^Lyl~xc)Tzt81TA#ADzv{gt`t_T=Kff6$J7^!|aqD$~(djW%pF z>&_y6N9T<@75zR;4ZIUbmi?1tb30Q!b%lyJ?{4F~tKktqvW!8px%ue#F1df{a_>@V zv|OZ!B|yq+V7WD=@3&YH^MKTR7?zvit04NkX7qW1B4VjipBL>fqVrma=*;FKIxSp8 zb6pr+-O%SncA^}W4kEzrSLIXbUGAA<&G3k~q{=Zf$cSDt*3%J-8+03}+n86GA`PUfrzx_5vUuW|)d(3kk_C>a_ zG9LJg;HAE)^86CV`SO|Z&-9P?ZZ#a^BlWqiG27cCmGseIF8x=pEryOGt<=b7ituJ` zCga=gh_B>x!=7NLyqj^2<=A8}(a{&`r?$`$9+S{hi}(2lceEaMSND`K>X>ZW*a!!6zf;a}r5}^7HOkd27sZEr z?4v#7>*v8Tj`{dSGUq7Xl!4rLty`}9jzt;m~&~Z@pYy_Z{&yR=17$B7HCOtVrfrk<7CqN4s2Cn*P-Ld4KvYKl(1_ZKIv~ zF1_FMr%e1P6JHUYEAP(YAH6-hxt0vEh>%>r)ZkD>_&Lg;(xnXK`N_48y5H0oW7=o3 zESn*u-NZT0ZAe_#FsALQZoC}@aI6J*%}qOU+wRbv0={;m-)MO>R$gY_Om?kj?>Z zU2^clgYXGHU00`w*MXEJ%dNisHkQ7wWt?AcyJ<_1C*x0Z!K{zb$WT^v@D%+Xo16P(ZT&^tig51JgmIrHRJ7%OSlg`)cUcv8_p8p*E_e3- zKeyHNuURIsR_>2_$>*Xur<9qYmlNYDuhYFn^!Xm52PhtCyo(frvTIlq*EaR>RQ2`{ ze}R2Y@wkQ={hxQ^&*;oNw6N&+IhC_y!`F|xtrz8TBF=U;I);75^J96A667U<=!b*o z=YmH28-CR1ppEo_P4sz2`X4LQ-AdQGo88Qi?<@!IU-RvQsm&r`Bne8V0Bcr@t|JbR#T-ri?Uj9M5 ziO4y%-Q2&z#m|4Y-TWOtn|0pge^~cZ$ct;;ulvLBV{5yUA9a8IJM})FH09Q9`oCB2 zOB`{^c)ixTl*fNs@AbOl=kjdcb>C^M(4R;7i-26mJ4o_;=jQ^l%(#B7uY+fL7sj>j zo@u|ax?t87lh1N&+Kx|M+nDt4%by$dAK%U`MT-n z^|JjtWo-J${Nbwy3AkFxX;PhR{!prYuV{~r{4>8H@;<& zw%np-oS~hYW#7cOw#*TijIZyD|5EwK`ZB-qVSZy1u{f5MUF8?pb zzIg0nzSxHOBJYQoSAF_?aT9)UZIeIzYLutnUZ?VO?JLZDxNCbZx{7*;SUAbqd|E~U*@2@ad_s_N2 zy{h!*MEcyW&=KFsH%|5U*<9nDjZS^JnRVsg>L+FX{(n3UmNim;v>%Ojcim4;?M`oB z|H3$UhBmkdo6I&?`Shvv;lHdL|Bdmkv9@g1Ig`(FjuJ8R^tL_C&uG_4%*X1l+w^q* z-SI7jwB@$%hBLHpnJ4B1k&U$Ld`CQ5nM*m!`_!}>U-P{ZvpqHz-qd*3)G?R-N0Ijo z^O|wLFpzr|0itcgJK9_+(ntQ&<9b<~K8J9<&i&i_|J1HCo$u(o{2Ark-1meyDx16PZ2)a?=%CpqJ8Cw>Bh_lr1j&6T&*xhrtrs~k&^tJJ9vx&KT z6W2N=ZpL<5F1PM7=3P&J>oo6jwTry*3@F~1&!6G`_!;I}+p)u(YsvICJ>@b^H|4L! z<~wIOzp>?=KEIh`HRd;CyqxAY`rPc_xj)yRH04(JckfF#GQY`k#5ea97r#j#$ma$o z>)$}M;oY1@z8Nv~O#Zj;pSjkdf4Z-iy_oL?`XL5i`g%l>`v#Ogq^9sJ>zlt z9(oh~`tqJZ`eolkX2VcJD>baU63U z=XWr3T(Q}SN+<2;goR7sjj@?PT(tqye&ptL!5eeQp z%lYb4=)MV#pQZkBbkFnQyOxe;H=iGi{?*`HH}RYPt!J~&nR85Y-()kqF*fxi^NvXU z{W>$;JkPNo*`04YGAsDL<2}(@*?7vgomGwn*c*L^P#@b|pS`)8Cpx{KWTx+~&iPw~ zKlg;VH*MU<*PnR?iGZz+XP&NkFym@0+&nJR%JUGunNHtPna4sK`Toj0Znix$4R>~% zx>9F8KG*%?^xd_2+}*jZJ~VazjW}BP@?H+_?Jafvnwocq;^p_alliVP{j~3K<#Ww4 zi_sz0*Po{524=o>okqTWYHVC~&3|KhXXyWpXAoK9)Hm~ucTeJtOFGB9ux{qe|CSBy zeME>d+WDP1{Yx_G&jQn*X8AfevMXyS=cV&Z<_g}!OcU~}Ua7yt)Hmy$d7kNO-A``5 zHFa0V%s5PTi7T>${6009?^AOc~j_dv@=ex_3wBJp-uJO2Q+qz9|&TTB*w8hM`YZ~V9vt=_LS9Y8q87bF~ zGS;t<{YjG1G#lEHnNCynt*LiC&-DF@-X7$)&y9Si>T0*S@91OP%`Y#X<0)6n)~)&Vo-dS;#uqSyWzPw|zDuA_)`s=qcd{c8HhO&?;$TU_cX zdcWi;CU$Z&zm{_vbKQ>IPA47iGY2UQX%$M08 zMmqV#9K*Uk=P7bQ3paL{`Epl3nm_9)dVs_3%39`sGUI`Mt?aT+i{574%uoC+%!xgX z>oom4J9C8<;xXHgc}?faj^pm^-1xGm=)9h~>?VJ~(muwRkahZMFZFA%EkOUgS3Jc^ zcjw4w$Bys*%(7g8?sMQhH~OaU>$$0VZRXRJoytv?ZM{Ey!Kjy06*uLIwc+Z`_ zs{T7hv(CzMMl<)(`N-wa%8F zx<*4&-%=UlnwxP&+Or#b@=jUD#je}>Pwv&YJ2!&$1Jd}O7XL-$vThDv-8ZD;QqSGh zecgAByrbnNJ^9T&^E&hWwG6o;njBx^Wuk0u+n00M%ekyRHn64~c1JOvIBmT+e^256 zqxqGubG$BV@aXo1oVqTLT*qg3s5oUUpRJBHquk}Ey?ie&i1*@*HSU6P8{UhP-zt{f zWAueTA2aTIM7H%6ZPQpENcIO#evrC*9J#T_!cK25@jKY<+9$}h0NkWg--g{BGt!W2fRIkEk%k-x z#`}ATm;f(fi8K7x8F_@$zEPTv{z9g!w||$lAdhOg@)TX_f{rHj7yrk-Ep z6Fw0fXc4TPrjPm3hD{y3!~yV$!-l|)UZOA9?bw$#IPzw!h0qH-f-NF=op0)y*58Oc zPkv`U!tJ--sWNdHcZ8>im@ik*3`q@kG>k^)!1^4^{kNsYy@DIKS1`@(y@F`-`uYsl z9+92>xF0b>v`~h)jYpVvn`4++FU@jrH@7i$O&ycXaFbo*GWGQFqglgRZ)Ui8o<2{J zYpHUb!`LR*Qq_IiShyaa(|g^n`yn{;rMpxs^x z=AWhh0KO4S#-1VW^d0x(%)aC<;#~?>yV0%pkzNK3_aGzDbzQ?v`ZmXKZG&$cn~ync zFxJLBbx!>4U@!3(@acT|+|~8oiD_SC4EH#cyM+EmZl$GM+7e_uh8Ho!(>d=B-j`d* zweX$7mQX0-lfA^dVE0`O-)7&Mx+i_IxBwl{ z|L%r(T*GvmS&PG51J?M))k`D|^%5U|g8FkULeM_WHr(wq2fdt}?kAsV-_KL{v2Ktb z_gRdUCul!>&o0}M^kKBjG}~$SV;y}#`tLS%Uz`1`YuPn*4X^vc%{`2!&T*s@te1y; zCz|;n-v*ie!l+y?@hF()rX2?BbIsG%yeT)&eQ&y#czK4GxY*6Pir(*^x;~AbZ#~XN z?w9HLb8}s%&yP-B&)HbJ`;>cYcGIp;vbiR^-b=)}v&$T}Ot!K1HSM5&?&KKH-1X<4 zGrhz_u+?3>^sOPhuY1aRqG607@4BvnV>FcDR(uaky=gVNg+06~v@*E7S^c$Rhuaxr zK(%W+a{g66o;IvmE@PD633o_{W!;^Yr>;Gf%33abXPohcO?+Y`t^fbzOrENlyrLA(WrT&}O45R zupag`;WjfI2THwD!x&hJN4SY6lDT@AGFO;ae0u&JbK4mC{JLh2uvIJ+RnHRVb6z6b zOh?+b`&MDwcAFml$yzT_Xdc4`sp}f%8iz5*KFS>1?sjf$KGRT|`-tXBvS?-xsPZfK z$+2a4r+UR3HAVODwhKf-v6tAihIJN}Hu%>ytg*RBeL0(Bq`p2#t@AT2eT@<6n^LoG zn0>wrNA~3Xe%4}bo5nh>39RGFJxu4j8ZwST!}Nyn)g_L4d(3+0%I^B7X3VEte+$4} zm>HM5WA4J_7|b(|7HKfwF*3Kxk>)G%-Us0kghvq0I*LZP{w{bBKHz%?`oy-m^|?>g z&vRTao|Z@bI;x5F?#*Y??rewL2gc?9dH$tyLzo=PXMopw%pZxNE&g|V$O&uu&Eb4aNl z?YN$gY%ABpk6}IhHu`fsd8|s0iMaGUH9Yr}!N#)=;~QV8TmS6T#UGKZAIjQG4fn1b zYsfj8G4-j5bva$*;y2;K)4FhN+L`qk+Z*q1WElAla^%B(zT?PuC-U9CKHrV%^IKyr zGCNc63y5hz!#yEBQ_fZzBhn$~yS%(--HOA~l?w^kI5+m~h zcwfo0%KY_%nC4!hc@5X@6@kK&d$Lunyv5Eaeo>e)NNzE}HO#!`s{id2-QGr?@#@DM zYul}J%=J6@T^@N^7{8ox`us=wqd+FiW|X1(`zfXk#(kur4fl~Oj&t4hY5ydwv3Y_l zGwur*-;M=}mZR&}Bg`e)-rUfx0jQ(e>L-db=J_slAIwniFJ2|o2})|&HcAJtnV zfjiustJlqh<|1;Pn>9RTn{@sLHB8>~Wc}gMu6J;--FYqW(atkQj_K#IcCowj&bIvB ztgjR-=O^S>uD4|7^@e0`aT|ETHLr3mZnkBU^**QJ9)NjVujjtJSH)W7^0$ffef_-$ ztMJM&_Vw#i-o1*y(p&TgrH?kWP1mqU{r#Di&U20W_h-tD=$MxWTqxHZYsGbY3$EKk zxo&TE0V~YgtyShVdzM4jwcpd*ovcTWdjCIe-?Xc#YstT()6_U(#?zFJTo-q~)BIh2 zgHgknw>yyf9>6^$f025fx9FPfE#@q5C|B1ov%gdLCO(AcEcL&IVa_A;{;9G4;9m%r zd6mz5^mN?3zaj0IPrWehku2+pUhkdW<2&0nsE-?`UT5jQMYY&of(=OSBs_L1*{ z`SqqoF^hMe=jp%uHKgG;k)|y17SllzK9ejrecr)&M&06`KrhGdOX%szInt^3gCgY| zH7kHQXcTi$W6f=uX1N}lyiegLTIC0b=2?LvIH8>gX0Ga+ zbIfpAcXo4snQ>NztB-n%W#%z#b{BS99O#{vo_sijt*6*ePxyR~wR$C>n+U0ZF?Oe;7 z+mT{#-ANb;3)qhE85W!5rdZDiRt6viEz^7DVbBJU7dB!wbx}|KYd2d4Y@P(X5DyG z{_L9#a|RE&Ao;?JE>5{*=&<17kmyfw3ee9M0E$05OO|;Q!7-VF*(P|j| zzt$yxCu9EytFdCS)_0G^3=|pjXU~su_-xJhhVaBw2G3hrRVSsS+X{3pLI0g6cRm?y z96s&;c_)mZBnQ88mimJo`mdt@`Rd)PTZ*4o?^$iG7Tu6cef+mQp`S5|H3vrRoUk)m zOx$_x&Rz|Q4r$&O+rO(iB1F&I%rj3@`BwtuxFa_+vI61j>uc^b!KwEfWn?Z*NYK;g6(;46a&WuxA6QhVfs~KK?CR|Nj(Ed5ebr zPTJjF8$4$6q|Awvva@GQNt&6LnUr)&b{f;4nm=V~PTn;$rn{WuPQNkTQxf_=y5r7Y z$(K&Le(I$&GN(F~g*&||S(9>I)Py^|95;$?_1q-vPES|6EN@cYteLLKyH9`8HD_gK zp1cEh&GczAobvsDv|5~&?TlO@?7-H`MFKf+DF8UvQfc3y{~tpM&Md+u?m6m3P#Z z&lTcJP(}D|IHCaC2#m^2!!zy>B8zw`;1eJn zIbxv@*Mbb>W$-aD2RZCc@(LCsXTZxPko^mV(7*=d;qVl&7C8%E2`Z4+!XJY5$VGSI zC$Jg022Q@4S0s>^!ROt>Z-XGG-plW6FA>7phx_FB3o!-^N6vt61LKkHaNttP8aV>) z3o?<%!wW%sSo79%f!9|w8J#qfGC2YCY={~+a! zoCd!PqWk)YZLr5f=nz~Tn>K&Qb@}V?+2;K;t}THART!Xd<=|74trFH37{&GIN`5=ze+uaM?6LzG|B~D z2lk*-0e4=U$i;#mxLUM)lz;i>R%z>Wxb?Ht4dgg@CFq8{8&;pg z=g8yXN5CND68L8@9JvPWxfVYoC&4#>^`u(>zXUcQm&5x(1+sV^eXtoh3BCbrLtYMt zzJQ;RJ#rO!$DTRxLm&!yIlSWs&P6BgNBp@D zdytF%5@IJPLEZ<)@29Mh7r<}TkS}ard=P&gqMc&H@Wb5m0qe1$3O)+Lh+oul-cfwZ zxs~v*z$)W}hu7gZMLY)5$?ta9liyuQMGk_;fd$Ap@G~GDxeWfbk0P@0TS8w&TnCB>&xc$0Q$&@_ zJNz)%P5G{c0|zQ16F-!|<%x<&MlMtp(e(o2M@~ytMCFAF$MOF~intkU!_Er$o}r4^ zLwLb3ew%u@BG!_wZG<8YfoQ@LF6BIsL3q?i@|#L|VMF^-iZ~yn5S|2o4N{To;67=J z=!RSYzjXz^#m>!RsV^Xjyof6maT&-$E`m3WQ$#-cbH-yAh{A7!u2RG_P(YuY0}q>^ zh(hEA@GoE&vY4odvA~9Y4*Wi-A$%A7ScW39kvGFVCn=%=IRm~Kl*m3AUIEIGtKbu$ z9N9Km5xqbu@*sE|ScRMkKLeH_Z-Bo9S;)KKr=}<(2YEZ(Arm{1`@?fVI`R_u6_9~k z4tq@{&r%1T0V_OfKCuPxgkkjF{AVun2LtVXA5kX1R z6L=A*C7vblhU=&^$mQ9J_zlFNQwL{UPklq41HS;4BX5A8m`?pcw#`t4nnPO1i(&s< z;zBNi-<(N(L#~5c%~C`$auIy%O|)O+TDVs}GPWhb4*(l-3H%1ALZ=+w3hc<+C4)Wk zTsUYp_9Mr^FMtTnt%R4|jLpauw@_E-C}R8&^x=zd;~4UC__n$D2)PWdD4<>;+vX`^ zGU$(-55EQKWSnsG`MmQ@cpN+(_#+p5Gsv;YFYvxd?s>Y)9S>hc2K@ zkq5!6K^gJ}_?bJ%FS2c+B97jP-!H<3Lf%ohn|g@64_>>7{3GvzA78A9=!>xpUULua z0eKg^?q2+of<5rp4=7?W;b9NbE*_;9^|4Gig@%1+93MlS1aO{C$XRS zD`1bO@DFktJnw1REc*T>^u5p0UXU}NQ^bp)_CoaGi`LS=T_DFLGG6Tmyz9=WoJ?U;%RK zM~qh>75}e-KL+W@Rj}8`q=g&=Ujed^=fIDGCCHWVpI{ksEqvoA^exEC;BruiycwRk znSKd*IlL9DN3MdSJ|&OHS@0L1QGbvJeNI_{(o5(+;g>-Xa&jeOF^ERahx>2A9^_T< zJ0K2uGh78~h-VM{$yVwQ;npwcS3!T|6!;NPhfXQH1;i7+3r^Zb`$8^*YrsBqlD|~M z#;?#B%9!%CB9?BaJdlHSDB{zd_y>8=H;VXf7d}B=@~tAC1JTIq;m<(<@^<(DSc_cs zog$8bIArVhif9W8k>lVCzO9Ct&VuKIB;-PPHON6Og+Bpx$hC0P zpY+Mdaqt*mL(YWn1VPA4;Ef;xdBIx19=I&9i$^$k0_!O$S1A-a0)0uPJ{0Ug~%oF9RTh09{0PWFE`fgrRafITxTm*; zxdQzad@Be-UJQQ(O3~R43)WBAbOnBc6M(o3eK-r0jH3^PmxKOeh##($;bUpnu+@kC zH0*&@P%xSH1>X#^kPG1`zE@9ArM<)3K?bt$vxp*)g}ebyWsS=m3H2DjsP5DF&XEBK-?izr5356^8*+UV54A4K2>ZN~h{&cc#qiq-v7~!F zZ4(~bj`#^*4nN)ABJ9Zf;KLm(V%c@f&pYxPV4W;t3Hr6L=uE!QNro@&!am_k;77aS zTl9x_vxv*jqkIWp20zgqzoEYy{;LP&NO(fLMQA-Oq73~S_;4@uDbxPFE#iFEM9M*4 z4{zv0S)(ud@-0t4!ii@%Jf^=zM9cW$)dTP~@uUs3h;irR2f~-bPYxoFGF|wOMEpQ_ zyvlErY4`&DeQ|LHME#sf8-c&L z*dl82ZCHv$w7vv=!ZYA&hEit;?>~$@4#%H_Z-c)XA=mm~j&Z3)%pQpk2@guOh{#dY zCG?Bn$428T!gs+xT}D|G-agGD&byp^$#db^W00wz-L9a{r(+-b`EbEl>_oo;{_INf zE8`z$5iQ44CkfvL|8y1hldtv@ETZc~d`^C|;aM5jLwFhd&Lr|he)A^tyKGaipYRRv zd;A7LDf-r_)SqeCNq8ze_G!@WEvkkxe}Lk5JDa zLkHg`FQ<=Mfq&7jguhs25sT4Jd%_~_eiA=mPeidrv|59X%p<(A#3FVPPxLd?&*!L< z*s~k{^?BMg@npSV5jT|57s-6V@h{UBh^HL>=oQL^@Zqo0cFM4yc(%h~Z=ypy#qjfQ z;Wy%m-)IrN%Pk@e{q^u~@8T=s$$yXXdLN$>UI(B2kaUTsV3S3>`Y~}5Px2=gaq*|* zmv}b8TRx}#qMufYkGJ9@!lS>ih|XW)Pr}#2uY66q#M6JfMda;72me^Vp$>dYS)gCK zo8RO6*&^c5Spawch5CS;4qJYuOp&|6UxA<*wBamm@UNhXvCIyK#*!}MNEEDr6vn<3_&TsGgLVx+ z3|0}(D)>FHjj?hw{1-?j&RV!tJA8B%eFc0mun|uxJQL(IhR%Ukg38hO7XAd(UPGC} zhe07}iS{0%9k3BkH+Upi#(13$-vaVUcLDq~ScUzi@E0JSeqa}T5~Si2TL%x(737nz z1o#RNpHA7qw}bu@nH#__g0L&;E8uT{brODty*qk{67m}a_XfL2cMv=g3@5)?@FFk> zJ4@jcU@`uW?&KjZ07;CeneZ|Yk6Z?Ci^FE}64x1@b@33}@k25EeOC`rK>YFDi2FS1 z4}PnFk9H>1cwBUiz;fgWPH zwC#Kk(E}7COU?&tktN>=Dv+trB0=>K5%{VCu1z8yd{sEuL)?7<``F{3>>&a#@(_C{ zui{HQM9-m|b2)ti`~xWDTN;$btb$YEFsRY5gy_R5I>%@;L(>- zhsk?B>@^Z!P%hozH$VYCuY#wi63?}?cQ|&Ghv-ImrNCc-49cPozWH)&!&l?Sc!=C9 z@e%gqkMj^mCU}Ta?AbMuGMYj?WPTWxNqkw97xqM5Lmsm|#BRzW>v|6nmqT5`p6zh| zJoK<9XqJcg^d=9HhCOrgJw)GI=qs>iH#}r6{>PrE0@~Jm${2fU?xI{4QLpgNa=7I^ zv{~$#1Al(6huDlg?eFstGnP=M*i!)yTuNTBXBqs{1H_Mi`WJbK2SGOWtcA~ekh+IG zsqph42YV78_7GPsqdt>X3B2VI50OP$QIC3v3m>BnlhzXWrR9_hY1P54S8y(AWx;o? zr0$W{Hn`_150OV&DezMunY1>*kxx)>NGor(hZyywhiFe)h49p3!bxj6Jo_o~LRzKp zqBZ!0a<70_K2152)^_;i66zIc6+cTq21+K zC?b#D-t-VVHjrP^N`8y_xsi5D9>>4UclGZO59ON&$Gk_mW5Z&2!29Hv@-2pUeM~s^ zblXhb+d^8{Q@NFPx1BnJJ?T3<#QXfl>LBc?`p!e#`x9da_H5YgAv*7+j$u#oZ`46M z?G$^;_tVY}(-yF&@Q8<4aFX_qJyyjkX7gL6gRp12w^dBxH>1X5&nCXisiDrx?9D@c&q4-4dZ)qZf~nti+_eEaBg3# zNTUDD>_@r-tRjwfS~AcoViT<*1$)Zjfk~t*{R7Xuz{7I0tYRPKwG19Vns~5h3B2$!t0=}l6>wpiRcyvTb1t`vUSq6c6ZT}l zgRh`muxAe3E8WU@gu~6pT1Bb!58UBOs~C;KXDm^gCzX3Yl>COVx8Hw(m(JOQ_;bmLO5ocRpen$ z3j6~o!XDezR`DK)!=4)Wo-Fc+J?r61ufhM=lLyCLi%;-RI$RBcuqWa=t5^q0WO>1h zv+)W3*#M8Z-YV>}KEunWTSXM{Y=#%lpuEV}26#@6m1`aPLpb{e>K^edhsWnqF2u7K z9zGL&@---ratAr`dI5eMBq0aQvWi=7w2JM-za73HpZbITDmd_Ft0*Jy+3?O=u#-HN z&#{WWx1!HjnFhaon^o-L+^D%$ac2QGbM9_<^nA*cb4%ei3y6nv#T}F#$Rgc%_;S!6 zIRjn+mdHL6{tYBhe`?`g3n_Qo z9qH!7Z{9^&pznXTRg7FjJm{~2?TfJ=JCpCBJnto6=-0y9eaQGW6@D0OB3~u&Um%G( zFP2!v#b62g>2S0At)db?41y1U?dV4@wTiDnDe+q$zy`2N#t-i-q8_3j_MlZ90s?#D zA7b6fhdCGhR5)Q7>7ri%w|azjgwLxUqkmgYdE=`j_&yMXuhJiOqni+KYg7tqJ52jgLbijwDHNDx2&S= zM$+co6!;GiL77IpZ56+QJnWAuw~FH+0{i#9L;l{w2IlkQ;erbMhP)ZJzmI*$gFc{r ze@I(EUJF-lB9F*XA5m5xQ^$}O!y`6hGd?VbZ~u&TMR*N-;TGx);k)3aTgju;fwz1? zy+V%IW)(MlMH=YazNUW$8<6+G$G1~1$kv^VDZB7>4t?ymR?+=u@_qy5`zv*3FFrvo z`OPXiS7QURe+^{|mZ4t@uRnLEa1(){z(FGC1-$ex5-cfS(2N$eZB&6WEDd439a9 zZO9AYB;hHxA?Ltd6i+c8IUTlHJVg$20{kaffE?xFDLwdbGfy!Hc>z2-2>&2&hUW!)icI8E_)oA0S%i3s%RwP>HoQp!c^~W@ zO1_YT;G2LyauNI^*hKxQg@eQJGjarcC0LA{4cCDZ z6>=P$1FFb-G5ihKgKTTzDcS)$asgZcqVpId;3$4;A`UqoUJBxo*TUa`2;{6tPw_Mm z$Yt;`U_Vk}dmst95^fPoxk?@Q zevpd19PZSP_-8R@!9ChjH;^;oyTBmiBKTF1j$97^1ll9-gPV1r9FZg7!5{&7I6MnP zAs4_Upd0dfcozsmw!>39QYVp@z?(q)EQ*a&r?hoNSPw{Kc8|OL_EmLRZr1R^At-+D+8Vn zDhXc)R}Dw%eHP9Z$?Li&OKuf6k+ZnHY?_zkfo zIWY2IRydGAOo?<)VNgYB5wm00AM0Hk4P^ zPwR)RvQXSMWh%{DugyAjc%U+~X|17J2%xShh?3HMuKXsr?YeWeKep2zbI$jCzPh@) z@4e4`?tK-G{9dlR7e0^5_zFCXLe%eA*DQXHYSdqGakF?8`Ke>DHj8IbojOP0m)8?7 zd>JnPE9O!54PJ#RluyAQUP8_XxHs9F#l1+6Ps1|O;pgBxNZ`9R(6>wZEZ5ox@3AvS z+lfDa2zMrG!@J=fs78GSS~l`o%JtpN;yx6jd>Z}))$xbm=#|V7J_n|H2$8}WocKmmN)ZNwFM z@m}~v2EP-wDGgh)=_&2j~O-6iF1qhvAE;MxPJCe3<;fSK#P_ShAKl2FrjQ7Ki-Rv#+9(Vx7@l|;7qpT^s7rub@<7@Ed z2y=&zz$_%8Sr)XG>6K--sy3El$_Av3;p4}C*+yca%+9Qgh4Baahj zycynu!gvL)_%b<(x56Hz;QL?_74TE=I)(A$r{OhG@)JJ__o50hEW+_I?nji*!82p5 zf4muPM^)-5a33l#kLGx@_;`Z-2=9j@Npkge+JWz&Dau<@j1kS@d*F-6M4cn>6KQe_ zZ-;lFZoC3tKu&xGUNFwQ%lfb@!?<>kWAJtq!MA0bMFP3;qq%1B6msIH;hU()XN`I8 zzi1k7fmfgs-U0Vck~7q|6@r-KYs4{yJ;n8{`4~vB2f~=nviw zpGGBo35suWPo=&AUW9a?qYk_g>G6KJ>lxai&S7}j->|n+?uL_Sj`H?mv*<-8Ssz~X zE&7J{z;R^87vX8o(ogx>e`*$wAuB!&UqTN2A$aQZK^aZ|q{4+U&KLW)| z#0}pC&-ho?6kdVD6>|6U?D_ERe`73o+mE?t{e(HdABK<3u{No{A09>{c=0kZe1$p1 z_rdl5P7dJP4zdK1@ZbCx%M;qjIY9b z|AYGuelN8BoVmyEgWG>WJnx_my!%b&4!;*}dW(9p9Dcq|4Dn_7;kU_cya~SiOY#HX z{SKe~71zSIzsoxPHEoWPCqg5ZEYS!n-U8c?(})r3*x?73@{B~h6`tFq5pld5wlr(R z489XSq|t~ed>ww6^XmF&CjjecAAY4yBc4Yg{1N!TGL6`SKMX(kK8*u`n$PDz~_Cm{VC^yp~JN4hbNsv-|!X~Kb1OoahgW-qY>(l!qp!p z2WZC+529U^>kJycpOX{R&z+$WmvSy&j`9G!@GOlO#e3jhp1E0<_0Oj7XeIS`!aw^M zb40lVuI}Kol<$L=pQ{lE@O60Yd9;If^UTgYsGTw9VCsB6OMi@?(1<})#Rp-FnR&!_ zzz<(QeDOW-RaC_5FVu+bD2U$$-$4<)^&*Y98LedABd}>D@x=GQzE5gIH{S7=8u5cq z5ffQ%(TIo9E_?|FR%wJEABW3V(^tF+K7tP5i||!6i(hy?m^?e|8_0G~ON0CH9{j?y z$mBU?>5DZ&P%b%*R^SU(jd*#zMwIaj&kU1iidipVZBj0I6H4PHM^O=9fo7YA-^{X> z;pPqG?Y*=KU%ZrjljWB&*T_V<-p+M5YQ!n{{oUl(mBa@hhEJjpz6x*N#QMa~!go+N zUhmL|RacW+()VaY5{2;xU%gb_IUf#RgOA?8`0+FF z4P?BZ``wKiaS<}%yWqd0{r9oHJmd_T#Rs5a8)Lzbz>5Z$3;Z7V;voIRcX&186%@v| z-Nc$g?f5iI`}jP*3WtVRr(7!npFvi9RhIeLBk&{e_+es#?}Q54{{U+WUUm!lgZJOc z*hi>?H^F~GRqBh|G(vkj{h{0nx9lKp_#8BRj(o=Nf*qe{?NGlP-gE~s#81JW-o;wL z@BIQE%}~E7#GZy`@rU90cavjb+J`CBhM$GGdo-dGUxBrI$uWHAPU7)6*LsNfM_J2b zIf_#3krNM3ZB3?3tX7CHoS6X;}k~~N0^aAUbI+8ZD5-+(8 z+3`g<{uJ|quYFY`E_j;#lm09`-$|bRq@V+oOMV~C;XA&j5!vr^AHmy78u1*m;l&Tx zpHZAKdf_O_;rGISK>COIZUBFd1itMbxu>IcycuppI(!ej7uEP|1b!FQ@iS2K9DT;O z!8K?vz7M8<#JwJ`o8^p2WT2fI{KiYH6Y1f;e__6)hd=#Sjo67_QDNTyjXvZ3@CfR` z8-C1QiaMqL340i_;ydTab2NwVgFDb6dY}z?#OF1x`v&(! z%2)o3`zG>J9)KA%ir)t>_z(Jwcfj4hAZPIYH~HRzM(`1+yv3e?pM$|V`HU~XzkHi@ zg!jUC(Js8{mm2YzcZij&1Luw~UcBX3w2$`VbMW$aY5x({IK1T7%nLp!DYU{S%i+LM ztuW#{nzZ7iX07PK+u@&Rcz!tE0y8Lw-w!{f)r$RiCwv>#xt2kv6^|{`iZb5(KCLjc zYQ^Yo<{f?=`SCOG7buMv$7{vkBfaz|XvJ>Sg+Bz(J(17ji*S0mR&?XN@7Idc+c?7l zAA}cvfIi^e@HKRp{^(EAig3G@zh|WnAJU3T(JXaF-~}gZ`K=u7zzDKG$~s+eW{o_% zCUPpzC8u2S8)zloa++4$g#38Eh>B6AC8=dkPIS=naZTK1ZC+BHJ z6W#!ws1+Z8$A4TaN_amU`~>~Md(B$$#6?=M7w=iA71~c~MI3K}mvWwq4IhDTt=5VV zUf;#FP}di^Pr(gq=?^{t_3P*l-V94fhZh%fE#$|CVF8Wci|`{><^ykm529W8!g{T^ z`ZBFh@C(m4k>{T@U9A;G$|aqsEI-@BTwlYrzr^?aYqetTI>tr0!>JYDMk^_=z+^A6 z#g}1rGv#|IhuJNh_a!}?>Z4tJ4Q_JL4)wk8N2rtX!|>|sxfb3JUqTLi9iF|Fxu(7u zeg+-D_rXWdC_WDV7LDLbP`HURz7=+$J@`)8hr01z7)CaH1Wu#9_!)Q@6{_pFp$tIQ%Z!g)hOMpq=MR3+=;qz{`*y?|?TV58ewS zXg_0LcwUJ-%j8Y8lXA)B+n8_s4E(_WF~PSD5<@hL_rT-5@FO>A#i>5} zPaP{fh>pn54r%%RLky|YHOlq(YQ?k2M7d=r<;aWo!Z5Pq6<9=Wd2rZD#el*8K})QX>>z9{{9i2O%Y%JmPkZ|oxP6=Dk?+08uyFCJx` zqB3z_%n`l_T`Bs855sk7 z);Qh|PZ%e+@SSiL`SFGfxqw>7s1J{xKOw2fa(|~>@&shX+w;uDB>9F{;C|%6n+jTS z3-aU3aOqdbC44)49Odvu_^Bt!XS^3agQ|FCFX!N(8h+|&?oCL$GcTgZ<;2$z3U zCwkVlG#JD8;eQB!it1}x8eFzQ$Ac}1KRgG`;3Y3dv-s=ac2r*9B6h$W+KGP}{ty{9 zw1^kr&yXGe7F>RYj{5;^!t+oBe*x@9I{Z~|7`gGc!rjP>-vggU<*hB^oA3o>9cmFT z!M9{N{#WpWXA)=psqhmhjsGOvg!;DgZy)$sbRfW94R@pTZL|-cLbLcHd>#dFZ)xxl zK8Jq`o_H4h-@&K~o_uC3hhY#3RUs) zZ2HsDe(K1xq*oyW|NfQdT{}^Tf3wSTv%iUKczG`LArzpFJiEDtGo~tdc}DSBsEL20 z$@2lb&@R5$$us|)=m1`x!?y!<@x4o)tG5RQ@$%fcuOScLbL9C}KSFx;e0hFV9j(Ok zV-Il-+Jm>iZK(7F_aLaqa@P3be~S@VjKE?979+42fyD?cM&OSv0#looHHLIR{Pj0rA_6vDo0e_uToL@q{{s&XH>qT z@=cYk*UVq{bd{YdyHsAG@&=V7DnlxFt4yl=y2|gUoK^X{%6C;RSM%jGmFKAJQh9|+ zugX8R_4@n9Q`3cV2gZ;`q}}%Z#z#pmhXJJ-{&9h^;|h{bN@gePoizU za=_g?(C2aWtv&kC^>zIozstuHVVgI){J;0@RmWZI@~;{8`CJ2jyKiudYiLN6o4Z}U zZT$nie%H|=F|~C4koscKx6Z|Ly?wmt8scN(b4`~IyL{X2F5mTozHPk&TNuSK!|;jK zzuWryKCx~=X}8g}UYoV=8tY}`KNcWvwL-{x91!~k5*@AdTG;@W8I zAM#uIh$zsbF4yMaty^8bqdi&DXv5!2aJ=hzNcbj^kk{HU*f;EPSsMY`#N({iUUBJK z+j)O+jy&j3d{D-7K9FkzLg8BUoCn?C=<2f%54jsrZ(LP;dEtBOJiIwyexJOCt#`=3 z*5?}};sF`)1+OGf=MHKvnixh}Q2dOz#>o$_;+bh$h(|L?r9dqEt2 z>qDys`Zjv|2O4n~2b;S+L#yP&`gz{1^mOmjy`Ev0cwN4tbMvoWm9N(MTrM%QM8ej; z+1E>oy(GsYCwo<2A5+W|!{1zL8|>{<-(MRbh8r2v79KxuAM9_;bfoEu-u@xivFzi? zuQIOoE!~519_5UY4|gqD8|XilXYt>jn?}pg_e$j_<#X=2-db6z=IMOS@XX<*H0zxo zXt3cMgAtD}S;wka;~5-siCDw0>*s(n*;?ZYdmCk!vdm=BCh-iJL`3@g*2n?%Zgq)& zUc%K@t+5O79eLf$)^3pgpe$Wumx(2Q-SC6kNO$5g;9A8oD)Qa;N;Zj)HfgAIYs}4m_10A~ z&lbG#>0V!d?`Aoov*kMIc5U<8d;MvE@>L^ zabC5qf3w_29{v5<$GSOLqi#v$jh_VPDZp|>UF;$2jz~kwn3JSYkonC;?dcfFBR)$t5*)Wd|j^Vdx^Jg&H64OZY4j5 zx6N-S^A%+*=VWW@HYRh2=ZMem7=81b1JApbHDp?JbI^b|S4NmEd1%n%TI2V5=4<(c zZvInpiex=nzO#{k8`+_RxTE2(aLs4t!?KNy{$p2|CdO51oLBONd@*0jSMs&In9xrcCQK8S3HyX|!aEV12u~;zg^A)sX`(Vw zn-G)wNyDUR(lTkEbWVCFgOlM&WwJ0?oGeXNCTo*)!p?8bWEd2^Vo*$qMX@VR#j6CB zu%ajhrKpsYic(WVR39}&O;JnK9(6{&(O@(jRicGxF1tTI*`6ES_v5St&dGvTgXmji`nUHDO=6fv$~u<*Pb)vj5*=uH*NICoeVN3&a^x2 zO$XAYbU9r~SJSn0JuSv{^J02Jhj*B3_b)$_+ zyc(~?>v56LCG?5*gdt%}m=flMC1Fk26OM#4;ZArHfkZG7N`w=Ugpx=n3W=#iF)^Je zCCZ6PqME2B>Isq5CH2Ynq#>ZIaAHlGrDYh)|fSCt;~#@S&?&+W)pI&}Wu!;eyd&?<2lAnOB%jVt<)`!Id^KOs>n7SKj1%Sw>x5&%JrS4) zO++Tr6H^n@^uJ2qb@bavpRJRQN%v%6GBg>POixZtPEVF6tCRIfq41kUzMSclcEzZe z6|3S<+)6+RDG?>DOexb!S*a>@MHg+48l&c@HR_1Eqk(8B8i}T(Q_<;YIa(!~WiA^V zdF*K9aHx^LQ;poMlDE28d(0R!$E-0&%pD8FLa|6J9h-_x$I7v4tRBG)K9I$kET>Tw-8Wh9@hkf6lP?Z(B|x4; z$dM`XqfBnplRC1(NJd!61~-`yA`8-~snm3;%o?hvbm?~1kU1?1I?+ZvlvE*AOqEg< z)|W`@Sz)HMC2dbTStG%8IIW}$=^|^T!a5PG5d-VP!rE}ME`sCXab>(PUK}rtSH^4O zBBRe3GNz0rW6wA<-b^qP&M28erkE*ZDw$eFWc67?c7FXjS-Zh(m~~rV&6cv2Y%MET zv4)(99n+q3=Dh#+yJnH!*^=wx|9sC3$COwhR*aQml~^q%;`+EDZi-vtM|Z(+T!|Or z#ds-RVfPX2JO*|h3pFfxp!g{9S1HH}41)ewY0JGB&x3{}1}F z=kF=#XZe4xA>E62wMY2}*r1V62QWW{Sp+=mI+;Ic!EhR++m#JlX^ +#endif + +static void +do_something_with_intermediate_values(void) +{ + static int another_important_s32 = 0; + static float another_important_f32 = 0; + + another_important_s32 = (int)important_f32; + another_important_f32 = (float)important_s32; + +#if _WIN32 + char buffer[256] = "Hello, World!\n"; + buffer[0] += important_s32 + another_important_s32; + buffer[1] += (int)another_important_f32 * important_f32; + OutputDebugStringA(buffer); +#endif +} + +static void +store_important_s32(int *ptr) +{ + important_s32 = *ptr; +} + +static void +store_important_f32(float *ptr) +{ + important_f32 = *ptr; +} + +void +optimized_build_eval_tests(void) +{ + int simple_sum = 0; + for(int i = 0; i < 10000; i += 1) + { + simple_sum += i; + } + store_important_s32(&simple_sum); + + do_something_with_intermediate_values(); + + static struct {float x, y;} vec2s[] = + { + { 10.f, 76.f }, + { 40.f, 50.f }, + { -230.f, 20.f }, + { 27.f, 27.f }, + { 57.f, -57.f }, + { -37.f, 97.f }, + { 99.f, 67.f }, + { 99.f, 37.f }, + { 99.f, 57.f }, + }; + { + struct{float x, y;}sum = {0}; + int count = sizeof(vec2s)/sizeof(vec2s[0]); + for(int i = 0; i < count; i += 1) + { + sum.x += vec2s[i].x; + sum.y += vec2s[i].y; + } + struct{float x, y;}avg = {sum.x/count, sum.y/count}; + float f32 = avg.x * avg.y; + store_important_f32(&f32); + } + + do_something_with_intermediate_values(); + + int factorial = 1; + for(int i = 10; i > 0; i -= 1) + { + factorial *= i; + } + store_important_s32(&factorial); + + do_something_with_intermediate_values(); +} + +//////////////////////////////// +// NOTE(allen): Struct Parameters Eval + +struct OptimizedBasics{ + char a; + unsigned char b; + short c; + unsigned short d; + int e; + unsigned int f; + long long g; + unsigned long long h; + float i; + double j; +}; + +static void +optimized_struct_parameter_helper(int *ptr, OptimizedBasics basics) +{ + basics.a += *ptr; + basics.a += 1; + basics.a += 1; +} + +void +optimized_struct_parameters_eval_tests(void) +{ + int x = 10; + OptimizedBasics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; + optimized_struct_parameter_helper(&x, basics); +} diff --git a/src/torture/torture.c b/src/torture/torture.c index 87b38417..d50a5426 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -1283,7 +1283,7 @@ t_entry_point(CmdLine *cmdline) { String8 binary_dir_path = get_process_info()->binary_path; String8 root_dir_path = str8_chop_last_slash(binary_dir_path); - g_input_data_dir = str8f(scratch.arena, "%S/local/test_data", root_dir_path); + g_input_data_dir = str8f(scratch.arena, "%S/data/test_inputs", root_dir_path); } // setup output directory From 9cc2afc6593e3316af5409f1461464fc7fce201c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 27 May 2026 13:10:56 -0700 Subject: [PATCH 715/850] eliminate backend-specific module parsing from debug engine ctrl thread; just pass that info back via the demon event --- project.4coder | 2 +- project.raddbg | 2 +- src/base/base_processes.h | 4 +- src/dbg_engine/dbg_engine_ctrl.c | 426 +++++-------------------- src/dbg_engine/dbg_engine_ctrl.h | 6 +- src/demon/demon_core.c | 1 + src/demon/demon_core.h | 59 +++- src/demon/demon_core.mdesk | 1 + src/demon/generated/demon.meta.c | 3 +- src/demon/generated/demon.meta.h | 3 +- src/linux/base/linux_base.c | 30 +- src/linux/demon/linux_demon.c | 256 +++++++++++++-- src/linux/demon/linux_demon.h | 5 + src/raddbg/raddbg_core.c | 27 +- src/raddbg/raddbg_eval.c | 2 +- src/raddbg/raddbg_main.c | 8 +- src/raddbg/raddbg_views.c | 2 +- src/win32/base/win32_base.c | 3 +- src/win32/demon/win32_demon.c | 524 +++++++++++++++++++++++-------- src/win32/demon/win32_demon.h | 5 +- 20 files changed, 825 insertions(+), 544 deletions(-) diff --git a/project.4coder b/project.4coder index 24737b61..14cc2147 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index d33469ef..59545fc2 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,6 +7,7 @@ target: working_directory: build arguments: "--user:raddbg_test.user --project:raddbg_test.project" debug_subprocesses: 0 + enabled: 1 } target: { @@ -42,5 +43,4 @@ target: executable: "build/torture.exe" working_directory: build arguments: "rdi_from_pdb/* --gui" - enabled: 1 } diff --git a/src/base/base_processes.h b/src/base/base_processes.h index 78fc7969..21e33cf1 100644 --- a/src/base/base_processes.h +++ b/src/base/base_processes.h @@ -12,7 +12,9 @@ struct ProcessInfo String8 binary_file_path; String8 binary_path; String8 initial_path; - String8 user_program_data_path; + String8 user_program_config_data_path; + String8 user_program_cache_data_path; + String8 user_program_logs_data_path; String8 symbol_cache_path; String8List module_load_paths; String8List environment; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index bfbc5e8b..dcdf9a50 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -3754,357 +3754,60 @@ d_ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_T //- rjf: module lifetime open/close work internal void -d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize) +d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DMN_ModuleInfo *module_info) { Temp scratch = scratch_begin(0,0); //- rjf: set up per-module info Arena *arena = arena_alloc(); - U64 entry_point_voff = 0; - U32 rdi_dbg_time = 0; - Guid rdi_dbg_guid = {0}; - String8 exe_dbg_path = {0}; - String8 rdi_dbg_path = {0}; - String8 raddbg_data = {0}; - Rng1U64 raddbg_section_voff_range = {0}; - Rng1U64 raddbg_is_attached_section_voff_range = {0}; - PE_IntelPdata *pdatas = 0; - U64 pdatas_count = 0; - U32 pdb_dbg_time = 0; - U32 pdb_dbg_age = 0; - Guid pdb_dbg_guid = {0}; - String8 pdb_dbg_path = {0}; - U64 cfi_rebase = 0; - B32 is_unwind_eh = 0; + String8 raddbg_data = d_data_from_process_vaddr_range(arena, process, shift_1u64(module_info->raddbg_info_voff_range, base_vaddr), 0); + U64 pdatas_count = dim_1u64(module_info->pe_intel_pdatas_vaddr_range) / sizeof(PE_IntelPdata); + String8 pdatas_data = d_data_from_process_vaddr_range(arena, process, module_info->pe_intel_pdatas_vaddr_range, 0); + pdatas_count = Min(pdatas_count, pdatas_data.size / sizeof(PE_IntelPdata)); + PE_IntelPdata *pdatas = (PE_IntelPdata *)pdatas_data.str; + EH_PtrCtx eh_ptr_ctx = {.pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0}; EH_FrameHdr eh_frame_hdr = {0}; - EH_PtrCtx eh_ptr_ctx = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 }; - - //- read module's signature bytes - U64 module_sig_size = Max(elf_magic_string.size, sizeof(PE_DosMagic)); - U8 *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size); - d_process_read(process, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes); - - ////////////////////////////// - //- parse PE module - // - PE_DosMagic dos_magic = *(PE_DosMagic *)module_sig_bytes; - if(dos_magic == PE_DOS_MAGIC) + B32 is_unwind_eh = 0; + if(module_info->eh_frame_header_vaddr_range.min != 0) { - ProfScope("unpack relevant PE info") - { - B32 is_valid = 1; - - //- rjf: read DOS header - PE_DosHeader dos_header = {0}; - if(is_valid) - { - if(!d_process_read_struct(process, vaddr_range.min, &dos_header) || - dos_header.magic != PE_DOS_MAGIC) - { - is_valid = 0; - } - } - - //- rjf: read PE magic - U32 pe_magic = 0; - if(is_valid) - { - if(!d_process_read_struct(process, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) || - pe_magic != PE_MAGIC) - { - is_valid = 0; - } - } - - //- rjf: read COFF header - U64 file_header_off = dos_header.coff_file_offset + sizeof(pe_magic); - COFF_FileHeader file_header = {0}; - if(is_valid) - { - if(!d_process_read_struct(process, vaddr_range.min + file_header_off, &file_header)) - { - is_valid = 0; - } - } - - //- rjf: unpack range of optional extension header - U32 opt_ext_size = file_header.optional_header_size; - Rng1U64 opt_ext_off_range = r1u64(file_header_off + sizeof(COFF_FileHeader), - file_header_off + sizeof(COFF_FileHeader) + opt_ext_size); - - //- rjf: read optional header - U64 entry_point = 0; - U32 data_dir_count = 0; - if(opt_ext_size > 0) - { - // rjf: read magic number - U16 opt_ext_magic = 0; - d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic); - - // rjf: read info - U32 reported_data_dir_offset = 0; - U32 reported_data_dir_count = 0; - switch(opt_ext_magic) - { - case PE_PE32_MAGIC: - { - PE_OptionalHeader32 pe_optional = {0}; - d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - entry_point = pe_optional.entry_point_va; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - case PE_PE32PLUS_MAGIC: - { - PE_OptionalHeader32Plus pe_optional = {0}; - d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min, &pe_optional); - entry_point = pe_optional.entry_point_va; - reported_data_dir_offset = sizeof(pe_optional); - reported_data_dir_count = pe_optional.data_dir_count; - }break; - } - - // rjf: find number of data directories - U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); - data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); - - // rjf: extract sections - U64 sec_array_off = opt_ext_off_range.max; - U64 sec_count = file_header.section_count; - COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); - d_process_read(process, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); - - // rjf: grab pdatas from exceptions section - if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) - { - PE_DataDirectory dir = {0}; - d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); - Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); - pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata); - pdatas = push_array(arena, PE_IntelPdata, pdatas_count); - d_process_read(process, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas); - } - - // rjf: grab entry point vaddr - entry_point_voff = entry_point; - - // rjf: grab data about debug info - if(data_dir_count > PE_DataDirectoryIndex_DEBUG) - { - // rjf: read data dir - PE_DataDirectory dir = {0}; - d_process_read_struct(process, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); - - U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); - for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) - { - // rjf: read debug directory - U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); - PE_DebugDirectory dbg_data = {0}; - d_process_read_struct(process, dir_addr, &dbg_data); - - // rjf: extract external file info from codeview header - if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) - { - U32 cv_magic = 0; - d_process_read_struct(process, vaddr_range.min + dbg_data.voff, &cv_magic); - switch(cv_magic) - { - default:break; - case PE_CODEVIEW_PDB20_MAGIC: - { - PE_CvHeaderPDB20 cv; - U64 read_size = d_process_read_struct(process, vaddr_range.min+dbg_data.voff, &cv); - if(read_size == sizeof(cv)) - { - U64 pdb_dbg_path_vaddr = vaddr_range.min + dbg_data.voff + sizeof(cv); - pdb_dbg_time = cv.time_stamp; - pdb_dbg_age = cv.age; - pdb_dbg_path = d_data_from_process_vaddr_range(arena, process, r1u64(pdb_dbg_path_vaddr, pdb_dbg_path_vaddr+512), 1); - } - }break; - case PE_CODEVIEW_PDB70_MAGIC: - { - PE_CvHeaderPDB70 cv; - U64 read_size = d_process_read_struct(process, vaddr_range.min + dbg_data.voff, &cv); - if(read_size == sizeof(cv)) - { - U64 pdb_dbg_path_vaddr = vaddr_range.min + dbg_data.voff + sizeof(cv); - pdb_dbg_guid = cv.guid; - pdb_dbg_age = cv.age; - pdb_dbg_path = d_data_from_process_vaddr_range(arena, process, r1u64(pdb_dbg_path_vaddr, pdb_dbg_path_vaddr+512), 1); - } - }break; - case PE_CODEVIEW_RDI_MAGIC: - { - PE_CvHeaderRDI cv; - U64 read_size = d_process_read_struct(process, vaddr_range.min + dbg_data.voff, &cv); - if(read_size == sizeof(cv)) - { - U64 rdi_dbg_path_vaddr = vaddr_range.min + dbg_data.voff + sizeof(cv); - rdi_dbg_guid = cv.guid; - rdi_dbg_path = d_data_from_process_vaddr_range(arena, process, r1u64(rdi_dbg_path_vaddr, rdi_dbg_path_vaddr+512), 1); - } - }break; - } - } - } - } - - // rjf: look for DWARF debug info - { - U64 symbol_array_off = file_header.symbol_table_foff; - U64 symbol_count = file_header.symbol_count; - if(symbol_array_off != 0) - { - exe_dbg_path = path; - } - } - - // rjf: extract copy of module's raddbg data - { - for EachIndex(idx, sec_count) - { - String8 section_name = str8_cstring((char *)sec[idx].name); - if(str8_match(section_name, str8_lit(".raddbg"), 0)) - { - raddbg_section_voff_range.min = sec[idx].voff; - raddbg_section_voff_range.max = sec[idx].voff + sec[idx].vsize; - } - else if(str8_match(section_name, str8_lit(".rdbgia"), 0)) - { - raddbg_is_attached_section_voff_range.min = sec[idx].voff; - raddbg_is_attached_section_voff_range.max = sec[idx].voff + sec[idx].vsize; - } - } - raddbg_data.size = dim_1u64(raddbg_section_voff_range); - raddbg_data.str = push_array(arena, U8, raddbg_data.size); - d_process_read(process, r1u64(vaddr_range.min + raddbg_section_voff_range.min, - vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str); - } - - // rjf: if we have a "raddbg is attached" section, mark the first byte as 1, to signify attachment - if(raddbg_is_attached_section_voff_range.max != raddbg_is_attached_section_voff_range.min) - { - U8 new_value = 1; - d_process_write_struct(process, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value); - } - } - } - } - - ////////////////////////////// - //- parse ELF module - // - else if(str8_match(str8(module_sig_bytes, elf_magic_string.size), elf_magic_string, 0)) - { - U64 e_entry = 0; - ELF_Type e_type = ELF_Type_None; - { - U8 *elf_sig = d_data_from_process_vaddr_range(scratch.arena, process, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max), 0).str; - if(elf_sig == 0) { goto elf_exit; } - switch(elf_sig[ELF_Identifier_Class]) - { - default: - case ELF_Class_None: - case ELF_Class_32: - {}break; - case ELF_Class_64: - { - ELF_Hdr64 *ehdr = (ELF_Hdr64 *)d_data_from_process_vaddr_range(scratch.arena, process, r1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr)), 0).str; - if(ehdr == 0) { goto elf_exit; } - e_entry = ehdr->e_entry; - e_type = ehdr->e_type; - }break; - } - } - - if(e_type == ELF_Type_Dyn) - { - cfi_rebase = vaddr_range.min; - } - - // find and parse .eh_frame_hdr - Rng1U64 eh_frame_hdr_vrange = {0}; - String8 eh_frame_hdr_data = {0}; - { - void *phdrs_raw = d_data_from_process_vaddr_range(scratch.arena, process, elf_phdr_vrange, 0).str; - if(phdrs_raw == 0) { goto elf_exit; } - if(elf_phdr_entsize == sizeof(ELF_Phdr64)) - { - U64 elf_phcount = dim_1u64(elf_phdr_vrange) / elf_phdr_entsize; - ELF_Phdr64 *phdrs64 = phdrs_raw; - for EachIndex(phdr_idx, elf_phcount) - { - ELF_Phdr64 *phdr = phdrs64 + phdr_idx; - if(phdr->p_type == ELF_PType_GnuEHFrame) - { - eh_frame_hdr_vrange = r1u64(cfi_rebase + phdr->p_vaddr, cfi_rebase + phdr->p_vaddr + phdr->p_memsz); - eh_frame_hdr_data = d_data_from_process_vaddr_range(arena, process, eh_frame_hdr_vrange, 0); - is_unwind_eh = 1; - break; - } - } - } - } - - // parse .eh_frame_hdr - D_Entity *process_entity = d_entity_from_handle(process); - Arch arch = process_entity->arch; - eh_ptr_ctx.pc_vaddr = eh_frame_hdr_vrange.min; - eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min; - eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx); - - // set entry point - if (e_entry != 0) - { - entry_point_voff = e_entry - vaddr_range.min; - } - - // TODO: is there a way to detect DWARF in runtime ELF? - if(1) - { - exe_dbg_path = path; - } - elf_exit:; + String8 eh_frame_hdr_data = d_data_from_process_vaddr_range(arena, process, module_info->eh_frame_header_vaddr_range, 0); + eh_ptr_ctx.pc_vaddr = module_info->eh_frame_header_vaddr_range.min; + eh_ptr_ctx.data_vaddr = module_info->eh_frame_header_vaddr_range.min; + eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(module_info->arch), &eh_ptr_ctx); + is_unwind_eh = 1; } ////////////////////////////// //- rjf: pick default initial debug info path // - String8 initial_debug_info_path = str8_zero(); + String8 initial_debug_info_path = {0}; { - String8 exe_folder = str8_chop_last_slash(path); - String8List dbg_path_candidates = {0}; - // - //~ TODO(rjf): @linux_port PLEASE READ RYAN vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv - // - // TODO(rjf): trying "exe_folder/embedded_path" as the first option is only a valid - // heuristic on Windows, because we know that two absolute paths concatted together - // are necessarily invalid. however, on Linux, this is not the case - you could stitch - // two paths together and get a third path that is completely valid. so, in that case, - // we will need to infer if the path is relative, and then use either the embedded - // path as-is, or the exe-relative-path accordingly, depending on that. - // - if(rdi_dbg_path.size != 0) + String8List candidates = {0}; + + // rjf: push module-embedded debug info paths, try both relative-to-exe & absolute + if(module_info->debug_info_path.size != 0) { - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S/%S", exe_folder, rdi_dbg_path); - str8_list_push(scratch.arena, &dbg_path_candidates, rdi_dbg_path); + PathStyle path_style = path_style_from_str8(module_info->debug_info_path); + if(path_style == PathStyle_Relative) + { + String8 module_image_folder = str8_chop_last_slash(module_info->module_path); + str8_list_pushf(scratch.arena, &candidates, "%S/%S", module_image_folder, module_info->debug_info_path); + } + str8_list_push(scratch.arena, &candidates, module_info->debug_info_path); } - if(exe_dbg_path.size != 0) + + // rjf: push heuristic-based debug info paths { - str8_list_push(scratch.arena, &dbg_path_candidates, path); + String8 exe_path = module_info->module_path; + String8 exe_path_no_ext = str8_chop_last_dot(exe_path); + str8_list_pushf(scratch.arena, &candidates, "%S.pdb", exe_path_no_ext); + str8_list_pushf(scratch.arena, &candidates, "%S.pdb", exe_path); + str8_list_pushf(scratch.arena, &candidates, "%S.rdi", exe_path_no_ext); + str8_list_pushf(scratch.arena, &candidates, "%S.rdi", exe_path); } - if(pdb_dbg_path.size != 0) - { - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S/%S", exe_folder, pdb_dbg_path); - str8_list_push(scratch.arena, &dbg_path_candidates, pdb_dbg_path); - } - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.pdb", str8_chop_last_dot(path)); - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.pdb", path); - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.rdi", str8_chop_last_dot(path)); - str8_list_pushf(scratch.arena, &dbg_path_candidates, "%S.rdi", path); - for(String8Node *n = dbg_path_candidates.first; n != 0; n = n->next) + + // rjf: pick first candidate that works + for EachNode(n, String8Node, candidates.first) { String8 candidate_path = n->string; FileProperties props = properties_from_file_path(candidate_path); @@ -4120,27 +3823,36 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang //- rjf: determine debug info unique identifier // String8 debug_info_unique_identifier = {0}; - if(pdb_dbg_path.size != 0) + if(module_info->debug_info_path.size != 0) { - Guid guid = pdb_dbg_guid; + Guid guid = module_info->debug_info_guid; debug_info_unique_identifier = str8f(scratch.arena, "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x", - guid.data1, guid.data2, guid.data3, guid.data4[0], guid.data4[1], guid.data4[2], guid.data4[3], guid.data4[4], guid.data4[5], guid.data4[6], guid.data4[7], pdb_dbg_age); + guid.data1, guid.data2, guid.data3, guid.data4[0], guid.data4[1], guid.data4[2], guid.data4[3], guid.data4[4], guid.data4[5], guid.data4[6], guid.data4[7], module_info->debug_info_age); } ////////////////////////////// //- rjf: build local server cache debug info path // String8 local_server_cache_debug_info_path = {0}; - if(debug_info_unique_identifier.size != 0 && pdb_dbg_path.size != 0) + if(debug_info_unique_identifier.size != 0 && module_info->debug_info_path.size != 0) { // TODO(rjf): this is not complete - assuming stripped etc. - just following pattern from ntdll.dll for now String8 symbol_cache_path = get_process_info()->symbol_cache_path; - String8 module_name = str8_skip_last_slash(path); - String8 dbg_name = str8_skip_last_slash(pdb_dbg_path); + String8 module_name = str8_skip_last_slash(module_info->module_path); + String8 dbg_name = str8_skip_last_slash(module_info->debug_info_path); String8 path = str8f(scratch.arena, "%S/%S/%S/stripped/%S", symbol_cache_path, module_name, debug_info_unique_identifier, dbg_name); local_server_cache_debug_info_path = path_normalized_from_string(arena, path); } + ////////////////////////////// + //- rjf: write 1 at attachment marker, to signify attachment + // + if(module_info->raddbg_is_attached_marker_voff != 0) + { + U8 new_value = 1; + d_process_write_struct(process, base_vaddr + module_info->raddbg_is_attached_marker_voff, &new_value); + } + ////////////////////////////// //- rjf: insert info into cache // @@ -4169,14 +3881,14 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang node->arena = arena; node->pdatas = pdatas; node->pdatas_count = pdatas_count; - node->cfi_rebase = cfi_rebase; + node->cfi_rebase = module_info->cfi_rebase; node->is_unwind_eh = is_unwind_eh; node->eh_frame_hdr = eh_frame_hdr; node->eh_ptr_ctx = eh_ptr_ctx; - node->entry_point_voff = entry_point_voff; + node->entry_point_voff = module_info->entry_point_voff; node->local_debug_info_path = initial_debug_info_path; node->debug_info_unique_identifier= debug_info_unique_identifier; - node->raddbg_attached_marker_voff = raddbg_is_attached_section_voff_range.min; + node->raddbg_attached_marker_voff = module_info->raddbg_is_attached_marker_voff; node->raddbg_data = str8_copy(arena, raddbg_data); } } @@ -4186,7 +3898,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_rang } internal void -d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range) +d_ctrl_thread__module_close(D_Handle process, D_Handle module, U64 base_vaddr) { DMN_Handle process_dmn = d_dmn_from_handle(process); @@ -4221,12 +3933,12 @@ d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_ran } ////////////////////////////// - //- rjf: write 0 at attachment market, to signify detachment + //- rjf: write 0 at attachment marker, to signify detachment // if(raddbg_attached_marker_voff != 0) { U8 new_value = 0; - d_process_write_struct(process, vaddr_range.min + raddbg_attached_marker_voff, &new_value); + d_process_write_struct(process, base_vaddr + raddbg_attached_marker_voff, &new_value); } } @@ -4526,6 +4238,13 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D } MemoryCopyStruct(&dst_n->v, &src_n->v); dst_n->v.string = push_str8_copy(d_ctrl_state->dmn_event_arena, dst_n->v.string); + if(src_n->v.module_info != &dmn_module_info_nil) + { + dst_n->v.module_info = push_array(d_ctrl_state->dmn_event_arena, DMN_ModuleInfo, 1); + MemoryCopyStruct(dst_n->v.module_info, src_n->v.module_info); + dst_n->v.module_info->module_path = str8_copy(d_ctrl_state->dmn_event_arena, dst_n->v.module_info->module_path); + dst_n->v.module_info->debug_info_path = str8_copy(d_ctrl_state->dmn_event_arena, dst_n->v.module_info->debug_info_path); + } SLLQueuePush(d_ctrl_state->first_dmn_event_node, d_ctrl_state->last_dmn_event_node, dst_n); } } @@ -4607,7 +4326,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Event *out_evt1 = d_event_list_push(scratch.arena, &evts); String8 module_path = path_normalized_from_string(scratch.arena, event->string); U64 exe_timestamp = properties_from_file_path(module_path).modified; - d_ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize); + d_ctrl_thread__module_open(process_handle, module_handle, event->address, event->module_info); out_evt1->kind = D_EventKind_NewModule; out_evt1->msg_id = msg->msg_id; out_evt1->entity = module_handle; @@ -4618,8 +4337,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D out_evt1->rip_vaddr = event->address; out_evt1->timestamp = exe_timestamp; out_evt1->string = module_path; - out_evt1->tls_index = event->tls_index; - out_evt1->tls_offset = event->tls_offset; + out_evt1->tls_index = event->module_info->tls_index; + out_evt1->tls_offset = event->module_info->tls_offset; D_Event *out_evt2 = d_event_list_push(scratch.arena, &evts); String8 initial_debug_info_path = d_initial_debug_info_path_from_module(scratch.arena, module_handle); U64 debug_info_timestamp = properties_from_file_path(initial_debug_info_path).modified; @@ -4657,7 +4376,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D D_Entity *module_ent = d_entity_from_handle(module_handle); D_Entity *process_ent = d_process_from_entity(module_ent); String8 module_path = event->string; - d_ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range); + d_ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range.min); out_evt->kind = D_EventKind_EndModule; out_evt->msg_id = msg->msg_id; out_evt->entity = module_handle; @@ -5482,8 +5201,11 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) // rjf: open module D_Handle module_handle = dump_modules[idx].module_handle; Rng1U64 vaddr_range = dump_modules[idx].vaddr_range; - d_ctrl_thread__module_open(process, module_handle, vaddr_range, dump_modules[idx].path, r1u64(0, 0), 0); - +#if 0 + // TODO(rjf): I don't think we can use this demon module info path here + DMN_ModuleInfo module_info = {0}; + d_ctrl_thread__module_open(process, module_handle, vaddr_range.min, dump_modules[idx].path, r1u64(0, 0), 0); +#endif // rjf: open debug info String8 initial_debug_info_path = d_initial_debug_info_path_from_module(scratch.arena, module_handle); U64 debug_info_timestamp = properties_from_file_path(initial_debug_info_path).modified; diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 05d418e6..9df2083e 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -181,8 +181,8 @@ struct D_ModuleImageInfoCacheNode PE_IntelPdata *pdatas; U64 pdatas_count; U64 cfi_rebase; - B32 is_unwind_eh; String8 dwarf_unwind_data; + B32 is_unwind_eh; EH_FrameHdr eh_frame_hdr; EH_PtrCtx eh_ptr_ctx; U64 entry_point_voff; @@ -623,8 +623,8 @@ internal void d_ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, internal void d_ctrl_thread__append_program_defined_bp_traps(Arena *arena, D_Entity *bp, DMN_TrapChunkList *traps_out); //- rjf: module lifetime open/close work -internal void d_ctrl_thread__module_open(D_Handle process, D_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize); -internal void d_ctrl_thread__module_close(D_Handle process, D_Handle module, Rng1U64 vaddr_range); +internal void d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DMN_ModuleInfo *module_info); +internal void d_ctrl_thread__module_close(D_Handle process, D_Handle module, U64 base_vaddr); //- rjf: dump process closing work internal void d_ctrl_thread__close_dump_process(D_MsgID msg_id, D_Handle process); diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 4fd59c89..a136ad07 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -119,5 +119,6 @@ dmn_event_list_push(Arena *arena, DMN_EventList *list) SLLQueuePush(list->first, list->last, n); list->count += 1; DMN_Event *result = &n->v; + result->module_info = &dmn_module_info_nil; return result; } diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 802766c4..76a16ab8 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -69,33 +69,72 @@ struct DMN_HandleArray //////////////////////////////// //~ rjf: Event Types +typedef struct DMN_ModuleInfo DMN_ModuleInfo; +struct DMN_ModuleInfo +{ + // rjf: image architecture + Arch arch; + + // rjf: image virtual size + U64 vsize; + + // rjf: entry point + U64 entry_point_voff; + + // rjf: module path + String8 module_path; + + // rjf: debug info key + String8 debug_info_path; + Guid debug_info_guid; + U64 debug_info_timestamp; + U64 debug_info_age; + + // rjf: thread-local storage info + U64 tls_index; + U64 tls_offset; + + // rjf: unwinding info + Rng1U64 pe_intel_pdatas_vaddr_range; + Rng1U64 eh_frame_header_vaddr_range; + U64 cfi_rebase; + + // rjf: special raddbg data + Rng1U64 raddbg_info_voff_range; + U64 raddbg_is_attached_marker_voff; +}; + typedef struct DMN_Event DMN_Event; struct DMN_Event { + // rjf: categories DMN_EventKind kind; DMN_ErrorKind error_kind; DMN_MemoryEventKind memory_kind; DMN_ExceptionKind exception_kind; + + // rjf: entities DMN_Handle process; DMN_Handle thread; DMN_Handle module; + + // rjf: general event properties Arch arch; U64 address; U64 size; String8 string; - U32 code; // code gives pid & tid on CreateProcess and CreateThread (respectfully) + U32 code; // code -> exception code (signo on Linux), pid/tid U32 flags; // DMN_TrapFlags, if `DMN_EventKind_SetBreakpoint` - S32 signo; - S32 sigcode; - Rng1U64 elf_phdr_vrange; - U64 elf_phdr_entsize; U64 instruction_pointer; U64 stack_pointer; U64 user_data; B32 exception_repeated; - U64 tls_index; - U64 tls_offset; + + // rjf: process info DMN_TlsModel tls_model; + + // rjf: module info + DMN_ModuleInfo *module_info; }; typedef struct DMN_EventNode DMN_EventNode; @@ -181,6 +220,11 @@ struct DMN_ProcessInfo U32 pid; }; +//////////////////////////////// +//~ rjf: Globals + +read_only global DMN_ModuleInfo dmn_module_info_nil = {0}; + //////////////////////////////// //~ rjf: Basic Type Functions (Helpers, Implemented Once) @@ -247,7 +291,6 @@ internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); //- rjf: threads -internal Arch dmn_arch_from_thread(DMN_Handle handle); internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); diff --git a/src/demon/demon_core.mdesk b/src/demon/demon_core.mdesk index 78e49001..50acceef 100644 --- a/src/demon/demon_core.mdesk +++ b/src/demon/demon_core.mdesk @@ -13,6 +13,7 @@ DMN_EventKindTable: {ExitThread} {LoadModule} {UnloadModule} + {ModuleDebugInfo} {Breakpoint} {Trap} {SingleStep} diff --git a/src/demon/generated/demon.meta.c b/src/demon/generated/demon.meta.c index 41c98976..66404aeb 100644 --- a/src/demon/generated/demon.meta.c +++ b/src/demon/generated/demon.meta.c @@ -4,7 +4,7 @@ //- GENERATED CODE C_LINKAGE_BEGIN -String8 dmn_event_kind_string_table[21] = +String8 dmn_event_kind_string_table[22] = { str8_lit_comp("Null"), str8_lit_comp("Error"), @@ -15,6 +15,7 @@ str8_lit_comp("CreateThread"), str8_lit_comp("ExitThread"), str8_lit_comp("LoadModule"), str8_lit_comp("UnloadModule"), +str8_lit_comp("ModuleDebugInfo"), str8_lit_comp("Breakpoint"), str8_lit_comp("Trap"), str8_lit_comp("SingleStep"), diff --git a/src/demon/generated/demon.meta.h b/src/demon/generated/demon.meta.h index 24ee3bf3..bbbfc943 100644 --- a/src/demon/generated/demon.meta.h +++ b/src/demon/generated/demon.meta.h @@ -17,6 +17,7 @@ DMN_EventKind_CreateThread, DMN_EventKind_ExitThread, DMN_EventKind_LoadModule, DMN_EventKind_UnloadModule, +DMN_EventKind_ModuleDebugInfo, DMN_EventKind_Breakpoint, DMN_EventKind_Trap, DMN_EventKind_SingleStep, @@ -62,7 +63,7 @@ DMN_ExceptionKind_COUNT, } DMN_ExceptionKind; C_LINKAGE_BEGIN -extern String8 dmn_event_kind_string_table[21]; +extern String8 dmn_event_kind_string_table[22]; extern String8 dmn_exception_kind_string_table[5]; C_LINKAGE_END diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index aaaf71bf..9545350d 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1571,10 +1571,36 @@ main(int argc, char **argv) info->initial_path = get_current_path(lnx_state.arena); } - // rjf: grab home directory + // rjf: grab program/user data paths { char *home = getenv("HOME"); - info->user_program_data_path = str8_cstring(home); + char *xdg_config_home = getenv("XDG_CONFIG_HOME"); + char *xdg_cache_home = getenv("XDG_CACHE_HOME"); + char *xdg_state_home = getenv("XDG_STATE_HOME"); + if(xdg_config_home != 0) + { + info->user_program_config_data_path = str8_cstring(xdg_config_home); + } + else + { + info->user_program_config_data_path = str8f(lnx_state.arena, "%s/.config", home); + } + if(xdg_cache_home != 0) + { + info->user_program_cache_data_path = str8_cstring(xdg_cache_home); + } + else + { + info->user_program_cache_data_path = str8f(lnx_state.arena, "%s/.cache", home); + } + if(xdg_state_home != 0) + { + info->user_program_logs_data_path = str8_cstring(xdg_state_home); + } + else + { + info->user_program_logs_data_path = str8f(lnx_state.arena, "%s/.local/state", home); + } } scratch_end(scratch); diff --git a/src/linux/demon/linux_demon.c b/src/linux/demon/linux_demon.c index d3124366..e7571235 100644 --- a/src/linux/demon/linux_demon.c +++ b/src/linux/demon/linux_demon.c @@ -292,6 +292,237 @@ lnx_dmn_process_from_pid(pid_t pid) return hash_table_search_u64_raw(lnx_dmn_state->pid_ht, pid); } +//////////////////////////////// +//~ rjf: Module Info Parsing + +internal DMN_ModuleInfo * +lnx_dmn_module_info_from_process_module(Arena *arena, pid_t pid, int memory_fd, U64 base_vaddr, U64 name_vaddr, B32 is_main) +{ + DMN_ModuleInfo *info = push_array(arena, DMN_ModuleInfo, 1); + Temp scratch = scratch_begin(&arena, 1); + { + //- rjf: read ELF signature + U8 elf_sig_maybe[ELF_Identifier_Max] = {0}; + lnx_dmn_read(memory_fd, r1u64(base_vaddr, base_vaddr + sizeof(elf_sig_maybe)), elf_sig_maybe); + + //- rjf: unpack elf header info + Arch arch = Arch_Null; + U64 entry_point_voff = 0; + ELF_Type elf_type = ELF_Type_None; + U64 phdrs_off = 0; + U64 phdrs_entry_size = 0; + U64 phdrs_count = 0; + U64 shdrs_off = 0; + U64 shdrs_entry_size = 0; + U64 shdrs_count = 0; + U64 shdrs_strings_idx = 0; + { + // rjf: read ehdr + ELF_Hdr64 ehdr = {0}; + switch(elf_sig_maybe[ELF_Identifier_Class]) + { + default: + case ELF_Class_None: + {}break; + case ELF_Class_32: + { + ELF_Hdr32 ehdr32 = {0}; + lnx_dmn_read_struct(memory_fd, base_vaddr, &ehdr32); + MemoryCopy(ehdr.e_ident, ehdr32.e_ident, sizeof(ehdr.e_ident)); + ehdr.e_type = ehdr32.e_type; + ehdr.e_machine = ehdr32.e_machine; + ehdr.e_version = ehdr32.e_version; + ehdr.e_entry = (U64)ehdr32.e_entry; + ehdr.e_phoff = (U64)ehdr32.e_phoff; + ehdr.e_shoff = (U64)ehdr32.e_shoff; + ehdr.e_flags = ehdr32.e_flags; + ehdr.e_ehsize = ehdr32.e_ehsize; + ehdr.e_phentsize = ehdr32.e_phentsize; + ehdr.e_phnum = ehdr32.e_phnum; + ehdr.e_shentsize = ehdr32.e_shentsize; + ehdr.e_shnum = ehdr32.e_shnum; + ehdr.e_shstrndx = ehdr32.e_shstrndx; + }break; + case ELF_Class_64: + { + lnx_dmn_read_struct(memory_fd, base_vaddr, &ehdr); + }break; + } + + // rjf: unpack ehdr + arch = arch_from_elf_machine(ehdr.e_machine); + entry_point_voff = ehdr.e_entry - base_vaddr; + elf_type = ehdr.e_type; + phdrs_off = ehdr.e_phoff; + phdrs_entry_size = ehdr.e_phentsize; + phdrs_count = ehdr.e_phnum; + shdrs_off = ehdr.e_shoff; + shdrs_entry_size = ehdr.e_shentsize; + shdrs_count = ehdr.e_shnum; + shdrs_strings_idx = ehdr.e_shstrndx; + } + + //- rjf: decide on rebase for this module + U64 module_rebase = 0; + if(elf_type == ELF_Type_Dyn) + { + module_rebase = base_vaddr; + } + + //- rjf: determine shdrs/phdrs addresses + U64 phdrs_vaddr = module_rebase + phdrs_off; + U64 phdrs_vaddr_opl = phdrs_vaddr + phdrs_count*phdrs_entry_size; + U64 shdrs_vaddr = module_rebase + shdrs_off; + + //- rjf: scan phdrs, unpack info + U64 image_vsize = 0; + Rng1U64 eh_frame_header_vaddr_range = {0}; + { + for EachIndex(phdr_idx, phdrs_count) + { + U64 phdr_vaddr = phdrs_vaddr + phdr_idx*phdrs_entry_size; + ELF_Phdr64 phdr = {0}; + switch(elf_sig_maybe[ELF_Identifier_Class]) + { + default:{}break; + case ELF_Class_32: + { + ELF_Phdr32 phdr32 = {0}; + lnx_dmn_read_struct(memory_fd, phdr_vaddr, &phdr32); + phdr.p_type = phdr32.p_type; + phdr.p_flags = phdr32.p_flags; + phdr.p_offset = (U64)phdr32.p_offset; + phdr.p_vaddr = (U64)phdr32.p_vaddr; + phdr.p_paddr = (U64)phdr32.p_paddr; + phdr.p_filesz = (U64)phdr32.p_filesz; + phdr.p_memsz = (U64)phdr32.p_memsz; + phdr.p_align = (U64)phdr32.p_align; + }break; + case ELF_Class_64: + { + lnx_dmn_read_struct(memory_fd, phdr_vaddr, &phdr); + }break; + } + if(phdr.p_type == ELF_PType_Load) + { + image_vsize = (module_rebase + phdr.p_vaddr + phdr.p_memsz) - base_vaddr; + } + if(phdr.p_type == ELF_PType_GnuEHFrame) + { + eh_frame_header_vaddr_range = r1u64(module_rebase + phdr.p_vaddr, module_rebase + phdr.p_vaddr + phdr.p_memsz); + } + } + } + + //- rjf: scan shdrs, unpack info + Rng1U64 raddbg_info_voff_range = {0}; + U64 raddbg_is_attached_marker_voff = 0; + { + // rjf: read all shdrs + ELF_Shdr64 *shdrs = push_array(scratch.arena, ELF_Shdr64, shdrs_count); + for EachIndex(shdr_idx, shdrs_count) + { + U64 shdr_vaddr = shdrs_vaddr + shdr_idx*shdrs_entry_size; + switch(elf_sig_maybe[ELF_Identifier_Class]) + { + case ELF_Class_32: + { + ELF_Shdr32 shdr32 = {0}; + lnx_dmn_read_struct(memory_fd, shdr_vaddr, &shdr32); + shdrs[shdr_idx].sh_name = shdr32.sh_name; + shdrs[shdr_idx].sh_type = shdr32.sh_type; + shdrs[shdr_idx].sh_flags = (U64)shdr32.sh_flags; + shdrs[shdr_idx].sh_addr = (U64)shdr32.sh_addr; + shdrs[shdr_idx].sh_offset = (U64)shdr32.sh_offset; + shdrs[shdr_idx].sh_size = (U64)shdr32.sh_size; + shdrs[shdr_idx].sh_link = shdr32.sh_link; + shdrs[shdr_idx].sh_info = shdr32.sh_info; + shdrs[shdr_idx].sh_addralign= (U64)shdr32.sh_addralign; + shdrs[shdr_idx].sh_entsize = (U64)shdr32.sh_entsize; + }break; + case ELF_Class_64: + { + lnx_dmn_read_struct(memory_fd, shdr_vaddr, &shdrs[shdr_idx]); + }break; + } + } + + // rjf: get string shdr + ELF_Shdr64 *string_shdr = 0; + if(shdrs_strings_idx < shdrs_count) + { + string_shdr = &shdrs[shdrs_strings_idx]; + } + + // rjf: scan shdrs, using names + if(string_shdr != 0) + { + for EachIndex(shdr_idx, shdrs_count) + { + ELF_Shdr64 *shdr = &shdrs[shdr_idx]; + U64 name_vaddr = string_shdr->sh_addr + shdr->sh_name; + String8 shdr_name = lnx_dmn_read_string(scratch.arena, memory_fd, name_vaddr); + if(str8_match(shdr_name, s(".raddbg"), 0)) + { + raddbg_info_voff_range = r1u64(shdr->sh_addr - base_vaddr, shdr->sh_addr - base_vaddr + shdr->sh_size); + } + if(str8_match(shdr_name, s(".rdbgia"), 0)) + { + raddbg_is_attached_marker_voff = (shdr->sh_addr - base_vaddr); + } + } + } + } + + //- rjf: unpack tls info + U64 tls_index = max_U64; + U64 tls_offset = max_U64; + if(is_main) + { + tls_index = 1; + tls_offset = 0; + } + else if(lnx_dmn_state->is_tls_detected) + { + Rng1U64 tls_modid_range = r1u64(lnx_dmn_state->tls_modid_desc.offset, lnx_dmn_state->tls_modid_desc.offset + lnx_dmn_state->tls_modid_desc.bit_size / 8); + Rng1U64 tls_offset_range = r1u64(lnx_dmn_state->tls_offset_desc.offset, lnx_dmn_state->tls_offset_desc.offset + lnx_dmn_state->tls_offset_desc.bit_size / 8); + tls_modid_range = shift_1u64(tls_modid_range, base_vaddr); + tls_offset_range = shift_1u64(tls_offset_range, base_vaddr); + tls_modid_range.max = Min(tls_modid_range.max, tls_modid_range.min + sizeof(tls_index)); + tls_offset_range.max = Min(tls_offset_range.max, tls_offset_range.min + sizeof(tls_offset)); + lnx_dmn_read(memory_fd, tls_modid_range, &tls_index); + lnx_dmn_read(memory_fd, tls_offset_range, &tls_offset); + } + + //- rjf: read module path + String8 module_path = lnx_dmn_read_string(arena, memory_fd, name_vaddr); + + //- rjf: decide on debug info key info + String8 debug_info_path = module_path; + Guid debug_info_guid = {0}; + U64 debug_info_timestamp = 0; + U64 debug_info_age = 0; + + //- rjf: fill result + info->arch = arch; + info->vsize = image_vsize; + info->entry_point_voff = entry_point_voff; + info->module_path = module_path; + info->debug_info_path = debug_info_path; + info->debug_info_guid = debug_info_guid; + info->debug_info_timestamp = debug_info_timestamp; + info->debug_info_age = debug_info_age; + info->tls_index = tls_index; + info->tls_offset = tls_offset; + info->eh_frame_header_vaddr_range = eh_frame_header_vaddr_range; + info->cfi_rebase = module_rebase; + info->raddbg_info_voff_range = raddbg_info_voff_range; + info->raddbg_is_attached_marker_voff = raddbg_is_attached_marker_voff; + } + scratch_end(scratch); + return info; +} + //////////////////////////////// //~ rjf: Trap Setting @@ -1681,7 +1912,9 @@ internal void lnx_dmn_push_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, LNX_DMN_Module *module) { // TODO: reporting this module breaks ctrl thread - String8 module_name = lnx_dmn_read_string(arena, thread->process->fd, module->name_vaddr); + LNX_DMN_Process *process = thread->process; + DMN_ModuleInfo *module_info = lnx_dmn_module_info_from_process_module(arena, process->pid, process->fd, module->base_vaddr, module->name_vaddr, module->is_main); + String8 module_name = module_info->module_path; if(!str8_match(module_name, str8_lit("linux-vdso.so.1"), 0)) { DMN_Event *e = dmn_event_list_push(arena, events); @@ -1689,14 +1922,11 @@ lnx_dmn_push_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thre e->process = lnx_dmn_handle_from_process(thread->process); e->thread = lnx_dmn_handle_from_thread(thread); e->module = lnx_dmn_handle_from_module(module); - e->arch = thread->process->ctx->arch; + e->arch = module_info->arch; e->address = module->base_vaddr; e->size = module->size; e->string = module_name; - e->elf_phdr_vrange = r1u64(module->phvaddr, module->phvaddr + module->phentsize * module->phcount); - e->elf_phdr_entsize = module->phentsize; - e->tls_index = module->tls_index; - e->tls_offset = module->tls_offset; + e->module_info = module_info; } } @@ -1787,7 +2017,7 @@ lnx_dmn_push_event_exception(Arena *arena, DMN_EventList *events, LNX_DMN_Thread e->thread = lnx_dmn_handle_from_thread(thread); e->instruction_pointer = lnx_dmn_thread_read_ip(thread); e->address = e->instruction_pointer; - e->signo = signo; + e->code = signo; e->exception_repeated = signo < ArrayCount(is_repeatable) ? is_repeatable[signo] : 0; if(signo == SIGSEGV) @@ -3009,18 +3239,6 @@ dmn_process_write(DMN_Handle process_handle, Rng1U64 range, void *src) //- rjf: threads -internal Arch -dmn_arch_from_thread(DMN_Handle thread_handle) -{ - Arch arch = Arch_Null; - LNX_DMN_Thread *thread = lnx_dmn_thread_from_handle(thread_handle); - if(thread) - { - arch = thread->process->ctx->arch; - } - return arch; -} - internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle thread_handle) { diff --git a/src/linux/demon/linux_demon.h b/src/linux/demon/linux_demon.h index fafdc925..721a2570 100644 --- a/src/linux/demon/linux_demon.h +++ b/src/linux/demon/linux_demon.h @@ -420,6 +420,11 @@ internal LNX_DMN_Auxv lnx_dmn_auxv_from_pid(pid_t pid, ELF_Class elf_class) internal LNX_DMN_Thread * lnx_dmn_thread_from_pid(pid_t pid); internal LNX_DMN_Process * lnx_dmn_process_from_pid(pid_t pid); +//////////////////////////////// +//~ rjf: Module Info Parsing + +internal DMN_ModuleInfo *lnx_dmn_module_info_from_process_module(Arena *arena, pid_t pid, int memory_fd, U64 base_vaddr, U64 link_map_vaddr, B32 is_main); + //////////////////////////////// //~ Entity diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index ce778538..7490c613 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -8817,16 +8817,15 @@ rd_window_frame(void) Vec4F32 hover_color = ui_color_from_tags_key_name(box->tags_key, str8_lit("hover")); // rjf: brighten + if(is_hot) { Vec4F32 color = hover_color; - color.w *= 0.05f; - if(!is_hot) - { - color.w *= t; - } + color.w *= 0.015f; R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, 1.f), v4f32(0, 0, 0, 0), 0, 0, border_softness*1.f); inst->colors[Corner_00] = color; inst->colors[Corner_10] = color; + inst->colors[Corner_01] = color; + inst->colors[Corner_11] = color; MemoryCopyArray(inst->corner_radii, box_corner_radii); } @@ -8834,7 +8833,7 @@ rd_window_frame(void) if(box->hot_t > 0.01f) DR_ClipScope(intersect_2f32(box->rect, dr_top_clip())) { Vec4F32 color = hover_color; - color.w *= 0.02f; + color.w *= 0.025f; if(!is_hot) { color.w *= t; @@ -8842,7 +8841,7 @@ rd_window_frame(void) Vec2F32 center = ui_mouse(); Vec2F32 box_dim = dim_2f32(box->rect); F32 max_dim = Max(box_dim.x, box_dim.y); - F32 radius = box->font_size*12.f; + F32 radius = box->font_size*24.f; radius = Min(max_dim, radius); dr_rect(pad_2f32(r2f32(center, center), radius), color, radius, 0, radius/3.f); } @@ -9485,7 +9484,7 @@ rd_theme_tree_from_name(Arena *arena, Access *access, String8 theme_name) } if(theme_tree == &md_nil_node) { - String8 path = str8f(scratch.arena, "%S/%Sraddbg/themes/%S", program_data_folder_prefix_from_os(OperatingSystem_CURRENT), get_process_info()->user_program_data_path, theme_name); + String8 path = str8f(scratch.arena, "%S/raddbg/themes/%S", get_process_info()->user_program_config_data_path, theme_name); U64 endt_us = now_time_us()+100; if(rd_state->frame_index <= 5) { @@ -10537,8 +10536,8 @@ rd_init(CmdLine *cmdln) } } { - String8 user_program_data_path = get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch2.arena, "%S/raddbg", user_program_data_path); + String8 user_program_config_data_path = get_process_info()->user_program_config_data_path; + String8 user_data_folder = str8f(scratch2.arena, "%S/raddbg", user_program_config_data_path); make_directory(user_data_folder); if(user_path.size == 0) { @@ -10546,12 +10545,12 @@ rd_init(CmdLine *cmdln) } if(user_path.size == 0) { - String8 last_user_path = push_str8f(scratch2.arena, "%S/last_user", user_data_folder); + String8 last_user_path = str8f(scratch2.arena, "%S/last_user", user_data_folder); user_path = data_from_file_path(scratch2.arena, last_user_path); } if(user_path.size == 0) { - user_path = push_str8f(scratch2.arena, "%S/default.raddbg_user", user_data_folder); + user_path = str8f(scratch2.arena, "%S/default.raddbg_user", user_data_folder); } } if(project_path.size == 0) @@ -13211,7 +13210,7 @@ rd_frame(void) case RD_CmdKind_RecordUserAsLastOpened: { String8 file_path = rd_regs()->file_path; - String8 last_user_path = str8f(scratch.arena, "%S/%Sraddbg/last_user", get_process_info()->user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); + String8 last_user_path = str8f(scratch.arena, "%S/raddbg/last_user", get_process_info()->user_program_config_data_path); write_data_to_file_path(last_user_path, file_path); }break; @@ -15777,7 +15776,7 @@ rd_frame(void) String8 name = rd_regs()->string; if(name.size != 0) { - String8 themes_folder = str8f(scratch.arena, "%S/%Sraddbg/themes", get_process_info()->user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); + String8 themes_folder = str8f(scratch.arena, "%S/raddbg/themes", get_process_info()->user_program_config_data_path); if(make_directory(themes_folder)) { String8 dst_path = push_str8f(scratch.arena, "%S/%S", themes_folder, name); diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index ffd50cee..94dca6ff 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -122,7 +122,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(themes) //- rjf: gather theme files { - String8 theme_folder = push_str8f(scratch.arena, "%S/%Sraddbg/themes", get_process_info()->user_program_data_path, program_data_folder_prefix_from_os(OperatingSystem_CURRENT)); + String8 theme_folder = push_str8f(scratch.arena, "%S/raddbg/themes", get_process_info()->user_program_config_data_path); FileIter *it = file_iter_begin(scratch.arena, theme_folder, FileIterFlag_SkipFolders); for(FileInfo info = {0}; file_iter_next(scratch.arena, it, &info);) { diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index c0f994cd..b40438bb 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -6,9 +6,9 @@ // // [ ] jeff stepping bug // [ ] wassim memory bug -// [ ] test concepts -> base // [ ] switch off spoofs for step-over -// [ ] debugger, d2r, p2r exemplar / determinism testing +// [x] test concepts -> base +// [x] debugger, d2r, p2r exemplar / determinism testing // // [ ] symbol server // [ ] core dump saving/loading @@ -540,8 +540,8 @@ entry_point(CmdLine *cmd_line) g_logs_folder = cmd_line_string(cmd_line, str8_lit("logs")); if(g_logs_folder.size == 0) { - String8 user_program_data_path = get_process_info()->user_program_data_path; - g_logs_folder = push_str8f(scratch.arena, "%S/%Sraddbg/logs", program_data_folder_prefix_from_os(OperatingSystem_CURRENT), user_program_data_path); + String8 user_program_logs_data_path = get_process_info()->user_program_logs_data_path; + g_logs_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_logs_data_path); } make_directory(g_logs_folder); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 0a532fc4..db0b38af 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1865,7 +1865,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla String8 file_name = str8_from_rdi_string_idx(rdi, path_node->name_string_idx); // rjf: push line location - if(file_name.size != 0) UI_TagF("weak") + if(line.file_idx != 0) UI_TagF("weak") { String8 loc = str8f(arena, "%S:%i", file_name, line.line_num); DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit("text")), font_size*0.85f, 0, 0}; diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index 1506a3e7..b830e42b 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1922,7 +1922,8 @@ w32_entry_point_caller(int argc, WCHAR **wargv) U16 *buffer = push_array_no_zero(scratch.arena, U16, size); if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer))) { - info->user_program_data_path = str8_from_16(arena, str16_cstring(buffer)); + info->user_program_config_data_path = str8_from_16(arena, str16_cstring(buffer)); + info->user_program_cache_data_path = info->user_program_logs_data_path = info->user_program_config_data_path; } scratch_end(scratch); } diff --git a/src/win32/demon/win32_demon.c b/src/win32/demon/win32_demon.c index 78f7d38f..acceaa52 100644 --- a/src/win32/demon/win32_demon.c +++ b/src/win32/demon/win32_demon.c @@ -337,6 +337,62 @@ w32_dmn_process_write(HANDLE process, Rng1U64 range, void *src) return result; } +internal String8 +w32_dmn_str8_cstring_from_process_vaddr(Arena *arena, HANDLE process, U64 vaddr) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List pieces = {0}; + U64 chunk_cap = 256; + U64 chunk_size = chunk_cap; + U64 vaddr_opl = vaddr + 16384; + U8 *chunk_buffer = push_array(scratch.arena, U8, chunk_cap); + for(U64 read_vaddr = vaddr; read_vaddr < vaddr_opl;) + { + // rjf: zero / read next chunk - shrink chunk size if needed + MemoryZero(chunk_buffer, chunk_size); + U64 bytes_read = 0; + for(;bytes_read == 0 && chunk_size != 0;) + { + bytes_read = w32_dmn_process_read(process, r1u64(vaddr, vaddr+chunk_size), chunk_buffer); + if(bytes_read == 0) + { + chunk_size /= 2; + } + } + + // rjf: advance + vaddr += bytes_read; + + // rjf: look for null terminator + B32 found_null_terminator = 0; + U64 read_chunk_size = bytes_read; + for(U64 idx = 0; idx < bytes_read; idx += 1) + { + if(chunk_buffer[idx] == 0) + { + read_chunk_size = idx; + found_null_terminator = 1; + break; + } + } + + // rjf: nonzero chunk size -> push to piece list + if(read_chunk_size != 0) + { + str8_list_push(scratch.arena, &pieces, str8_copy(scratch.arena, str8(chunk_buffer, read_chunk_size))); + } + + // rjf: if this chunk contained a null terminator, or if we didn't read anything -> we're done + if(found_null_terminator || bytes_read == 0) + { + break; + } + } + String8 result = str8_list_join(arena, &pieces, 0); + scratch_end(scratch); + return result; +} + internal String8 w32_dmn_read_memory_str(Arena *arena, HANDLE process_handle, U64 address) { @@ -438,126 +494,319 @@ w32_dmn_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address) return(result); } -internal W32_DMN_ImageInfo -w32_dmn_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr) +//- rjf: modules + +internal DMN_ModuleInfo * +w32_dmn_module_info_from_process_module(Arena *arena, HANDLE process, HANDLE module, U64 base_vaddr, U64 module_name_vaddr, B32 module_name_is_unicode, B32 is_main_module) { - // rjf: find PE offset - U32 pe_offset = 0; + DMN_ModuleInfo *info = push_array(arena, DMN_ModuleInfo, 1); + Temp scratch = scratch_begin(&arena, 1); { - U64 dos_magic_off = base_vaddr; - U16 dos_magic = 0; - w32_dmn_process_read_struct(process, dos_magic_off, &dos_magic); - if(dos_magic == PE_DOS_MAGIC) - { - U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset); - w32_dmn_process_read_struct(process, pe_offset_off, &pe_offset); - } - } - - // rjf: get COFF header - B32 got_coff_header = 0; - U64 coff_header_off = 0; - COFF_FileHeader coff_header = {0}; - if(pe_offset > 0) - { - U64 pe_magic_off = base_vaddr + pe_offset; - U32 pe_magic = 0; - w32_dmn_process_read_struct(process, pe_magic_off, &pe_magic); - if(pe_magic == PE_MAGIC) - { - coff_header_off = pe_magic_off + sizeof(pe_magic); - got_coff_header = w32_dmn_process_read_struct(process, coff_header_off, &coff_header); - } - } - - W32_DMN_ImageInfo result = zero_struct; - if(got_coff_header) - { - U64 optional_off = coff_header_off + sizeof(COFF_FileHeader); + B32 is_good = 1; - Arch arch = arch_from_coff_machine(coff_header.machine); - U64 image_size = 0; - U64 data_dir_count = 0; - U64 data_dir_off = max_U64; - U64 tls_index = max_U64; - - // parse optional header - if(pe_has_plus_header(coff_header.machine)) + //- rjf: read DOS header + PE_DosHeader dos_header = {0}; + if(is_good) { - PE_OptionalHeader32Plus opt_header = {0}; - if(w32_dmn_process_read_struct(process, optional_off, &opt_header)) + w32_dmn_process_read_struct(process, base_vaddr, &dos_header); + is_good = (dos_header.magic == PE_DOS_MAGIC); + } + + //- rjf: read PE magic + U32 pe_magic = 0; + if(is_good) + { + w32_dmn_process_read_struct(process, base_vaddr + dos_header.coff_file_offset, &pe_magic); + is_good = (pe_magic == PE_MAGIC); + } + + //- rjf: read COFF header + U64 file_header_off = dos_header.coff_file_offset + sizeof(pe_magic); + COFF_FileHeader file_header = {0}; + if(is_good) + { + w32_dmn_process_read_struct(process, base_vaddr + file_header_off, &file_header); + } + + //- rjf: get architecture + Arch arch = arch_from_coff_machine(file_header.machine); + + //- rjf: get module path + String8 module_path = {0}; + { + String8 module_path8 = {0}; + String16 module_path16 = {0}; + + // rjf: try to get module path from handle + if(module_path16.size == 0 && module != 0) { - image_size = opt_header.sizeof_image; - data_dir_count = opt_header.data_dir_count; - data_dir_off = optional_off + sizeof(opt_header); + DWORD cap16 = GetFinalPathNameByHandleW(module, 0, 0, VOLUME_NAME_DOS); + U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16); + DWORD size16 = GetFinalPathNameByHandleW(module, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS); + module_path16 = str16(buffer16, size16); } - else { Assert(0 && "failed to read optional header"); } - } - else - { - PE_OptionalHeader32 opt_header = {0}; - if(w32_dmn_process_read_struct(process, optional_off, &opt_header)) + + // rjf: fallback (main module only): process -> full path + if(module_path16.size == 0 && is_main_module) { - image_size = opt_header.sizeof_image; - data_dir_count = opt_header.data_dir_count; - data_dir_off = optional_off + sizeof(opt_header); - } - else { Assert(0 && "failed to read optional header"); } - } - - // extract TLS index - if(PE_DataDirectoryIndex_TLS < data_dir_count) - { - U64 tls_dir_vaddr = data_dir_off + PE_DataDirectoryIndex_TLS * sizeof(PE_DataDirectory); - PE_DataDirectory tls_dir = {0}; - if(w32_dmn_process_read_struct(process, tls_dir_vaddr, &tls_dir)) - { - if(pe_has_plus_header(coff_header.machine)) + DWORD size = 4096; + U16 *buf = push_array_no_zero(scratch.arena, U16, size); + if(QueryFullProcessImageNameW(process, 0, (WCHAR*)buf, &size)) { - if(tls_dir.virt_size == sizeof(PE_TLSHeader64)) - { - PE_TLSHeader64 tls_header = {0}; - if(w32_dmn_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) - { - U64 tls_index64 = 0; - if(w32_dmn_process_read_struct(process, tls_header.index_address, &tls_index64)) - { - tls_index = tls_index64; - } - else { Assert(0 && "failed to read TLS Index 64"); } - } - else { Assert(0 && "failed to read TLS Header 64"); } - } + module_path16 = str16(buf, size); } - else + } + + // rjf: fallback (any module - no guarantee): address_of_name -> full path + if(module_path16.size == 0 && module_name_vaddr != 0) + { + U64 ptr_size = bit_size_from_arch(arch)/8; + U64 name_pointer = 0; + if(w32_dmn_process_read(process, r1u64(module_name_vaddr, module_name_vaddr+ptr_size), &name_pointer)) { - if(tls_dir.virt_size == sizeof(PE_TLSHeader32)) + if(name_pointer != 0) { - PE_TLSHeader32 tls_header = {0}; - if(w32_dmn_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header)) + if(module_name_is_unicode) { - U32 tls_index32 = 0; - if(w32_dmn_process_read_struct(process, tls_header.index_address, &tls_index32)) - { - tls_index = tls_index32; - } - else { Assert(0 && "failed to read TLS Index 32"); } + module_path16 = w32_dmn_read_memory_str16(scratch.arena, process, name_pointer); + } + else + { + module_path8 = w32_dmn_read_memory_str(scratch.arena, process, name_pointer); } - else { Assert(0 && "failed to read TLS Header32"); } } } } - else { Assert(0 && "failed to read TLS directory"); } + + // rjf: skip the extended path thing if necessary + { + if(module_path16.size >= 4 && + module_path16.str[0] == L'\\' && + module_path16.str[1] == L'\\' && + module_path16.str[2] == L'?' && + module_path16.str[3] == L'\\') + { + module_path16.size -= 4; + module_path16.str += 4; + } + else if(module_path8.size >= 4 && + module_path8.str[0] == L'\\' && + module_path8.str[1] == L'\\' && + module_path8.str[2] == L'?' && + module_path8.str[3] == L'\\') + { + module_path8.size -= 4; + module_path8.str += 4; + } + } + + // rjf: 16 -> 8 + if(module_path16.size != 0) + { + module_path = str8_from_16(arena, module_path16); + } + else if(module_path8.size != 0) + { + module_path = str8_copy(arena, module_path8); + } } - // fill out result - result.arch = arch; - result.size = image_size; - result.tls_index = tls_index; + //- rjf: unpack range of optional extension header + U32 opt_ext_size = file_header.optional_header_size; + Rng1U64 opt_ext_off_range = r1u64(file_header_off + sizeof(COFF_FileHeader), + file_header_off + sizeof(COFF_FileHeader) + opt_ext_size); + + //- rjf: read optional header + U64 image_vsize = 0; + U64 entry_point_voff = 0; + U64 tls_index = 0; + String8 debug_info_path = {0}; + Guid debug_info_guid = {0}; + U64 debug_info_timestamp = 0; + U64 debug_info_age = 0; + Rng1U64 pe_intel_pdatas_vaddr_range = {0}; + Rng1U64 raddbg_info_voff_range = {0}; + U64 raddbg_is_attached_marker_voff = 0; + if(opt_ext_size > 0) + { + // rjf: read magic number + U16 opt_ext_magic = 0; + w32_dmn_process_read_struct(process, base_vaddr + opt_ext_off_range.min, &opt_ext_magic); + + // rjf: read info + U32 reported_data_dir_offset = 0; + U32 reported_data_dir_count = 0; + switch(opt_ext_magic) + { + case PE_PE32_MAGIC: + { + PE_OptionalHeader32 pe_optional = {0}; + w32_dmn_process_read_struct(process, base_vaddr + opt_ext_off_range.min, &pe_optional); + image_vsize = pe_optional.sizeof_image; + entry_point_voff = pe_optional.entry_point_va; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + case PE_PE32PLUS_MAGIC: + { + PE_OptionalHeader32Plus pe_optional = {0}; + w32_dmn_process_read_struct(process, base_vaddr + opt_ext_off_range.min, &pe_optional); + image_vsize = pe_optional.sizeof_image; + entry_point_voff = pe_optional.entry_point_va; + reported_data_dir_offset = sizeof(pe_optional); + reported_data_dir_count = pe_optional.data_dir_count; + }break; + } + + // rjf: find number of data directories + U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory); + U32 data_dir_count = ClampTop(reported_data_dir_count, data_dir_max); + + // rjf: extract sections + U64 sec_array_off = opt_ext_off_range.max; + U64 sec_count = file_header.section_count; + COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count); + w32_dmn_process_read(process, r1u64(base_vaddr + sec_array_off, base_vaddr + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec); + + // rjf: grab pdatas range from exceptions section + if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS) + { + PE_DataDirectory dir = {0}; + w32_dmn_process_read_struct(process, base_vaddr + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir); + Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size); + pe_intel_pdatas_vaddr_range = r1u64(pdatas_voff_range.min + base_vaddr, pdatas_voff_range.max + base_vaddr); + } + + // rjf: grab tls info + if(data_dir_count > PE_DataDirectoryIndex_TLS) + { + PE_DataDirectory tls_dir = {0}; + w32_dmn_process_read_struct(process, base_vaddr + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_TLS, &tls_dir); + if(tls_dir.virt_size == sizeof(PE_TLSHeader64)) + { + PE_TLSHeader64 tls_header = {0}; + w32_dmn_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header); + U64 tls_index64 = 0; + w32_dmn_process_read_struct(process, tls_header.index_address, &tls_index64); + tls_index = tls_index64; + } + else if(tls_dir.virt_size == sizeof(PE_TLSHeader32)) + { + PE_TLSHeader32 tls_header = {0}; + w32_dmn_process_read_struct(process, base_vaddr + tls_dir.virt_off, &tls_header); + U32 tls_index32 = 0; + w32_dmn_process_read_struct(process, tls_header.index_address, &tls_index32); + tls_index = (U64)tls_index32; + } + } + + // rjf: grab data about DWARF debug info, hinted at via symbol array in header + { + U64 symbol_array_off = file_header.symbol_table_foff; + U64 symbol_count = file_header.symbol_count; + if(symbol_array_off != 0) + { + debug_info_path = module_path; + } + } + + // rjf: grab data about PDB/RDI debug info, expressed via debug data directory + if(debug_info_path.size == 0 && data_dir_count > PE_DataDirectoryIndex_DEBUG) + { + // rjf: read data dir + PE_DataDirectory dir = {0}; + w32_dmn_process_read_struct(process, base_vaddr + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir); + + U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory); + for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1) + { + // rjf: read debug directory + U64 dir_addr = base_vaddr + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory); + PE_DebugDirectory dbg_data = {0}; + w32_dmn_process_read_struct(process, dir_addr, &dbg_data); + + // rjf: extract external file info from codeview header + if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW) + { + U32 cv_magic = 0; + w32_dmn_process_read_struct(process, base_vaddr + dbg_data.voff, &cv_magic); + switch(cv_magic) + { + default:break; + case PE_CODEVIEW_PDB20_MAGIC: + { + PE_CvHeaderPDB20 cv = {0}; + U64 read_size = w32_dmn_process_read_struct(process, base_vaddr+dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + U64 pdb_dbg_path_vaddr = base_vaddr + dbg_data.voff + sizeof(cv); + debug_info_timestamp = cv.time_stamp; + debug_info_age = cv.age; + debug_info_path = w32_dmn_str8_cstring_from_process_vaddr(arena, process, pdb_dbg_path_vaddr); + } + }break; + case PE_CODEVIEW_PDB70_MAGIC: + { + PE_CvHeaderPDB70 cv = {0}; + U64 read_size = w32_dmn_process_read_struct(process, base_vaddr + dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + U64 pdb_dbg_path_vaddr = base_vaddr + dbg_data.voff + sizeof(cv); + debug_info_guid = cv.guid; + debug_info_age = cv.age; + debug_info_path = w32_dmn_str8_cstring_from_process_vaddr(arena, process, pdb_dbg_path_vaddr); + } + }break; + case PE_CODEVIEW_RDI_MAGIC: + { + PE_CvHeaderRDI cv = {0}; + U64 read_size = w32_dmn_process_read_struct(process, base_vaddr + dbg_data.voff, &cv); + if(read_size == sizeof(cv)) + { + U64 rdi_dbg_path_vaddr = base_vaddr + dbg_data.voff + sizeof(cv); + debug_info_guid = cv.guid; + debug_info_path = w32_dmn_str8_cstring_from_process_vaddr(arena, process, rdi_dbg_path_vaddr); + } + }break; + } + } + } + } + + // rjf: find ranges of special raddbg data + { + for EachIndex(idx, sec_count) + { + String8 section_name = str8_cstring((char *)sec[idx].name); + if(str8_match(section_name, str8_lit(".raddbg"), 0)) + { + raddbg_info_voff_range.min = sec[idx].voff; + raddbg_info_voff_range.max = sec[idx].voff + sec[idx].vsize; + } + else if(str8_match(section_name, str8_lit(".rdbgia"), 0)) + { + raddbg_is_attached_marker_voff = sec[idx].voff; + } + } + } + } + + //- rjf: fill info + info->arch = arch; + info->vsize = image_vsize; + info->entry_point_voff = entry_point_voff; + info->module_path = module_path; + info->debug_info_path = debug_info_path; + info->debug_info_guid = debug_info_guid; + info->debug_info_timestamp = debug_info_timestamp; + info->debug_info_age = debug_info_age; + info->tls_index = tls_index; + info->pe_intel_pdatas_vaddr_range = pe_intel_pdatas_vaddr_range; + info->raddbg_info_voff_range = raddbg_info_voff_range; + info->raddbg_is_attached_marker_voff = raddbg_is_attached_marker_voff; } - else { Assert(0 && "failed to find COFF file header"); } - - return result; + scratch_end(scratch); + return info; } //- rjf: threads @@ -1792,25 +2041,31 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage; U64 module_name_vaddr = (U64)evt.u.CreateProcessInfo.lpImageName; B32 module_name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0); - W32_DMN_ImageInfo image_info = w32_dmn_image_info_from_process_base_vaddr(process_handle, module_base); - // rjf: create entities (thread/module are implied for initial - they are not reported by win32) + // rjf: parse module info + DMN_ModuleInfo *module_info = w32_dmn_module_info_from_process_module(arena, process_handle, module_handle, module_base, module_name_vaddr, module_name_is_unicode, 1); + + // rjf: create process/module entities (module is implied for processes - not reported directly via module events) W32_DMN_Entity *process = w32_dmn_entity_alloc(w32_dmn_shared->entities_base, W32_DMN_EntityKind_Process, evt.dwProcessId); - W32_DMN_Entity *thread = w32_dmn_entity_alloc(process, W32_DMN_EntityKind_Thread, evt.dwThreadId); W32_DMN_Entity *module = w32_dmn_entity_alloc(process, W32_DMN_EntityKind_Module, module_base); { process->handle = process_handle; - process->arch = image_info.arch; - thread->handle = thread_handle; - thread->arch = image_info.arch; - thread->thread.thread_local_base = tls_base; + process->arch = module_info->arch; module->handle = module_handle; - module->module.vaddr_range = r1u64(module_base, image_info.size); + module->module.vaddr_range = r1u64(module_base, module_base + module_info->vsize); module->module.is_main = 1; module->module.address_of_name_pointer = module_name_vaddr; module->module.name_is_unicode = module_name_is_unicode; } + // rjf: create main thread entity (implied from process event, see above) + W32_DMN_Entity *thread = w32_dmn_entity_alloc(process, W32_DMN_EntityKind_Thread, evt.dwThreadId); + { + thread->handle = thread_handle; + thread->arch = module_info->arch; + thread->thread.thread_local_base = tls_base; + } + // rjf: put thread into suspended state, so it matches expected initial state SuspendThread(thread_handle); @@ -1833,7 +2088,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_CreateProcess; e->process = w32_dmn_handle_from_entity(process); - e->arch = image_info.arch; + e->arch = module_info->arch; e->code = evt.dwProcessId; e->tls_model = DMN_TlsModel_WinodwsNt; } @@ -1844,21 +2099,21 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) e->kind = DMN_EventKind_CreateThread; e->process = w32_dmn_handle_from_entity(process); e->thread = w32_dmn_handle_from_entity(thread); - e->arch = image_info.arch; + e->arch = module_info->arch; e->code = evt.dwThreadId; } // rjf: load module { DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_LoadModule; - e->process = w32_dmn_handle_from_entity(process); - e->module = w32_dmn_handle_from_entity(module); - e->arch = image_info.arch; - e->address = module_base; - e->size = image_info.size; - e->string = w32_dmn_full_path_from_module(arena, module); - e->tls_index = image_info.tls_index; + e->kind = DMN_EventKind_LoadModule; + e->process = w32_dmn_handle_from_entity(process); + e->module = w32_dmn_handle_from_entity(module); + e->arch = module_info->arch; + e->address = module_base; + e->size = module_info->vsize; + e->string = module_info->module_path; + e->module_info = module_info; } } }break; @@ -2010,29 +2265,32 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: extract image info U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll; - W32_DMN_ImageInfo image_info = w32_dmn_image_info_from_process_base_vaddr(process->handle, module_base); + HANDLE module_handle = evt.u.LoadDll.hFile; + U64 module_name_vaddr = (U64)evt.u.LoadDll.lpImageName; + B32 module_name_is_unicode = (evt.u.LoadDll.fUnicode != 0); + DMN_ModuleInfo *module_info = w32_dmn_module_info_from_process_module(arena, process->handle, module_handle, module_base, module_name_vaddr, module_name_is_unicode, 0); // rjf: create module entity W32_DMN_Entity *module = w32_dmn_entity_alloc(process, W32_DMN_EntityKind_Module, module_base); { - module->handle = evt.u.LoadDll.hFile; - module->arch = image_info.arch; - module->module.vaddr_range = r1u64(module_base, module_base+image_info.size); - module->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName; - module->module.name_is_unicode = (evt.u.LoadDll.fUnicode != 0); + module->handle = module_handle; + module->arch = module_info->arch; + module->module.vaddr_range = r1u64(module_base, module_base+module_info->vsize); + module->module.address_of_name_pointer = module_name_vaddr; + module->module.name_is_unicode = module_name_is_unicode; } // rjf: generate event { DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_LoadModule; - e->process = w32_dmn_handle_from_entity(process); - e->module = w32_dmn_handle_from_entity(module); - e->arch = module->arch; - e->address = module_base; - e->size = image_info.size; - e->string = w32_dmn_full_path_from_module(arena, module); - e->tls_index = image_info.tls_index; + e->kind = DMN_EventKind_LoadModule; + e->process = w32_dmn_handle_from_entity(process); + e->module = w32_dmn_handle_from_entity(module); + e->arch = module_info->arch; + e->address = module_base; + e->size = module_info->vsize; + e->string = module_info->module_path; + e->module_info = module_info; } }break; diff --git a/src/win32/demon/win32_demon.h b/src/win32/demon/win32_demon.h index 3bf51ff5..dd16020f 100644 --- a/src/win32/demon/win32_demon.h +++ b/src/win32/demon/win32_demon.h @@ -337,11 +337,14 @@ internal String8 w32_dmn_full_path_from_module(Arena *arena, W32_DMN_Entity *mod //- rjf: processes internal U64 w32_dmn_process_read(HANDLE process, Rng1U64 range, void *dst); internal B32 w32_dmn_process_write(HANDLE process, Rng1U64 range, void *src); +internal String8 w32_dmn_str8_cstring_from_process_vaddr(Arena *arena, HANDLE process, U64 vaddr); internal String8 w32_dmn_read_memory_str(Arena *arena, HANDLE process_handle, U64 address); internal String16 w32_dmn_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address); #define w32_dmn_process_read_struct(process, vaddr, ptr) w32_dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) #define w32_dmn_process_write_struct(process, vaddr, ptr) w32_dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) -internal W32_DMN_ImageInfo w32_dmn_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr); + +//- rjf: modules +internal DMN_ModuleInfo *w32_dmn_module_info_from_process_module(Arena *arena, HANDLE process, HANDLE module, U64 base_vaddr, U64 module_name_vaddr, B32 module_name_is_unicode, B32 is_main_module); //- rjf: threads internal B32 w32_dmn_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block); From 98a281c8a0b7e5a7b356bb05b45cd6de7294f59d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 24 May 2026 21:36:27 -0700 Subject: [PATCH 716/850] hint for installing external libraries --- build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sh b/build.sh index 31f386fa..361b5fa4 100755 --- a/build.sh +++ b/build.sh @@ -28,6 +28,7 @@ cc_link="-lpthread -lm -lrt -ldl" cc_link_dll="-fPIC" # --- External Libraries ------------------------------------------------------ +# sudo apt install -y pkg-config libfreetype6-dev libx11-dev libxext-dev libgl-dev libegl-dev if [[ -x "$(command -v pkg-config)" ]]; then cc_font_provider="$(pkg-config --cflags --libs freetype2)" cc_os_gfx="$(pkg-config --cflags --libs x11 xext)" From 4c8d66b4318c44d89e459a199b112ee6ddaea3df Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 29 May 2026 19:40:58 -0700 Subject: [PATCH 717/850] fix accidental removal of debug info sections resulting in non-eligible sections not getting marked with 'is_live' --- src/linker/lnk.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 7054990c..2e85f44c 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -2611,15 +2611,15 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(ref_symbol.obj, section_number); + // on first section visit, set live flag and enqueue section + U8 was_visited = ins_atomic_u8_eval_assign(&is_live[ref_symbol.obj->input_idx][section_number], 1); + if (was_visited) { continue; } + // is section eligible for walking? if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } - // on first section visit, set live flag and enqueue section - U8 was_visited = ins_atomic_u8_eval_assign(&is_live[ref_symbol.obj->input_idx][section_number], 1); - if (was_visited) { continue; } - LNK_RelocRefs refs = {0}; refs.obj = ref_symbol.obj; refs.relocs = lnk_coff_reloc_info_from_section_number(ref_symbol.obj, section_number); From 541d3afefab30bd4e6100fd15fa7b8fe34798a7b Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 29 May 2026 22:04:20 -0700 Subject: [PATCH 718/850] WIP /RAD_TYPE_SERVER env vars replace HashTable with HashMap in config --- src/linker/hash_table.c | 33 ++- src/linker/hash_table.h | 21 +- src/linker/lnk.c | 504 +++++++++++++++++++++++++------- src/linker/lnk.h | 3 +- src/linker/lnk_cmd_line.c | 199 ++++++++++++- src/linker/lnk_cmd_line.h | 56 +++- src/linker/lnk_config.c | 313 ++++++++++++-------- src/linker/lnk_config.h | 47 ++- src/linker/lnk_debug_info.c | 119 ++++---- src/linker/lnk_debug_info.h | 12 +- src/linker/lnk_io.c | 41 ++- src/linker/lnk_io.h | 3 +- src/linker/lnk_log.h | 7 +- src/linker/lnk_obj.c | 33 ++- src/linker/lnk_obj.h | 3 + src/linker/tests/linker_tests.c | 5 +- 16 files changed, 1055 insertions(+), 344 deletions(-) diff --git a/src/linker/hash_table.c b/src/linker/hash_table.c index 48534e14..45591cbb 100644 --- a/src/linker/hash_table.c +++ b/src/linker/hash_table.c @@ -680,18 +680,22 @@ hash_map_hash_from_path(String8 path) internal HashMapNode * hash_map_push_string_string(Arena *arena, HashMap *hm, String8 key, String8 value) { + key = push_str8_copy(arena, key); + value = push_str8_copy(arena, value); return hash_map_push(arena, hm, hash_map_hasher(key), (HashMapKeyValue){ .key = { .key_string = key }, .value = { .value_string = value } }, hash_map_match_string); } internal HashMapNode * hash_map_push_string_raw(Arena *arena, HashMap *hm, String8 key, void *value) { + key = push_str8_copy(arena, key); return hash_map_push(arena, hm, hash_map_hasher(key), (HashMapKeyValue){ .key = { .key_string = key }, .value = { .value_raw = value } }, hash_map_match_string); } internal HashMapNode * hash_map_push_string_u64(Arena *arena, HashMap *hm, String8 key, U64 value) { + key = push_str8_copy(arena, key); return hash_map_push(arena, hm, hash_map_hasher(key), (HashMapKeyValue){ .key = { .key_string = key }, .value = { .value_u64 = value } }, hash_map_match_string); } @@ -740,18 +744,22 @@ hash_map_push_raw_u64(Arena *arena, HashMap *hm, void *key, U64 value) internal HashMapNode * hash_map_push_path_u64(Arena *arena, HashMap *hm, String8 path, U64 value) { - return hash_map_push(arena, hm, hash_map_hasher(path), (HashMapKeyValue){ .key = { .key_string = path }, .value = { .value_u64 = value } }, hash_map_match_path); + path = push_str8_copy(arena, path); + return hash_map_push(arena, hm, hash_map_hash_from_path(path), (HashMapKeyValue){ .key = { .key_string = path }, .value = { .value_u64 = value } }, hash_map_match_path); } internal HashMapNode * hash_map_push_path_string(Arena *arena, HashMap *hm, String8 path, String8 value) { - return hash_map_push(arena, hm, hash_map_hasher(path), (HashMapKeyValue){ .key = { .key_string = path }, .value = { .value_string = value } }, hash_map_match_path); + path = push_str8_copy(arena, path); + value = push_str8_copy(arena, value); + return hash_map_push(arena, hm, hash_map_hash_from_path(path), (HashMapKeyValue){ .key = { .key_string = path }, .value = { .value_string = value } }, hash_map_match_path); } internal HashMapNode * hash_map_push_path_raw(Arena *arena, HashMap *hm, String8 path, void *value) { + path = push_str8_copy(arena, path); return hash_map_push(arena, hm, hash_map_hash_from_path(path), (HashMapKeyValue){ .key = { .key_string = path }, .value = { .value_raw = value } }, hash_map_match_path); } @@ -777,6 +785,13 @@ hash_map_search_string_raw(HashMap *hm, String8 key) return n ? n->v.value.value_raw : 0; } +internal String8 * +hash_map_search_string_string(HashMap *hm, String8 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hasher(key), (HashMapKey){ .key_string = key }, hash_map_match_string); + return n ? &n->v.value.value_string : 0; +} + internal U32 * hash_map_search_string_u32(HashMap *hm, String8 key) { @@ -791,6 +806,20 @@ hash_map_search_string_u64(HashMap *hm, String8 key) return n ? &n->v.value.value_u64 : 0; } +internal U64 * +hash_map_search_path_u64(HashMap *hm, String8 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hash_from_path(key), (HashMapKey){ .key_string = key }, hash_map_match_path); + return n ? &n->v.value.value_u64 : 0; +} + +internal String8 * +hash_map_search_path_string(HashMap *hm, String8 key) +{ + HashMapNode *n = hash_map_search(hm, hash_map_hash_from_path(key), (HashMapKey){ .key_string = key }, hash_map_match_path); + return n ? &n->v.value.value_string : 0; +} + internal void * hash_map_search_path_raw(HashMap *hm, String8 key) { diff --git a/src/linker/hash_table.h b/src/linker/hash_table.h index 39e46a1d..f9e89d67 100644 --- a/src/linker/hash_table.h +++ b/src/linker/hash_table.h @@ -175,15 +175,18 @@ internal HashMapNode * hash_map_push_path_u64 (Arena *arena, HashMap *hm, St internal HashMapNode * hash_map_push_path_string (Arena *arena, HashMap *hm, String8 path, String8 value); internal HashMapNode * hash_map_push_path_raw (Arena *arena, HashMap *hm, String8 path, void *value); -internal void * hash_map_search_stringf_raw(HashMap *hm, char *fmt, ...); -internal void * hash_map_search_string_raw(HashMap *hm, String8 key); -internal U32 * hash_map_search_string_u32(HashMap *hm, String8 key); -internal U64 * hash_map_search_string_u64(HashMap *hm, String8 key); -internal void * hash_map_search_path_raw (HashMap *hm, String8 key); -internal void * hash_map_search_u64_raw (HashMap *hm, U64 key); -internal U64 * hash_map_search_u64_u64 (HashMap *hm, U64 key); -internal void * hash_map_search_raw_raw (HashMap *hm, void *key); -internal U64 * hash_map_search_raw_u64 (HashMap *hm, void *key); +internal void * hash_map_search_stringf_raw (HashMap *hm, char *fmt, ...); +internal void * hash_map_search_string_raw (HashMap *hm, String8 key); +internal String8 * hash_map_search_string_string(HashMap *hm, String8 key); +internal U32 * hash_map_search_string_u32 (HashMap *hm, String8 key); +internal U64 * hash_map_search_string_u64 (HashMap *hm, String8 key); +internal U64 * hash_map_search_path_u64 (HashMap *hm, String8 key); +internal String8 * hash_map_search_path_string (HashMap *hm, String8 key); +internal void * hash_map_search_path_raw (HashMap *hm, String8 key); +internal void * hash_map_search_u64_raw (HashMap *hm, U64 key); +internal U64 * hash_map_search_u64_u64 (HashMap *hm, U64 key); +internal void * hash_map_search_raw_raw (HashMap *hm, void *key); +internal U64 * hash_map_search_raw_u64 (HashMap *hm, void *key); internal HashMapKeyValue * key_value_from_hash_map (Arena *arena, HashMap *hm); internal U32 * keys_from_hash_map_u32 (Arena *arena, HashMap *hm); diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 2e85f44c..22269a89 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -124,75 +124,106 @@ internal LNK_CmdLine lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) { + Temp scratch = scratch_begin(&arena, 1); LNK_CmdLine cmd_line = {0}; - // default flags - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Align, "%u", KB(4)); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Debug, "none"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_FileAlign, "%u", 512); + char *default_opts[] = { + "/ALIGN:4096", + "/DEBUG:none", + "/FILEALIGN:512", + "/HIGHENTROPYVA", + "/MANIFESTUAC:\"level='asInvoker' uiAccess='false'\"", + "/NXCOMPAT", + "/LARGEADDRESSAWARE", + "/PDBALTPATH:%_RAD_PDB_PATH%", + "/PDBPAGESIZE:4096", + (char*)str8f(scratch.arena, "/HEAP:%llu,%llu", MB(1), KB(4)).str, + (char*)str8f(scratch.arena, "/STACK:%llu,%llu", MB(1), KB(4)).str, + + "/RAD_BOOT_MODE:LINKER", + //"/RAD_BUILD_EXP", + "/RAD_BUILD_IMPLIB", + "/RAD_TPYE_HASH_ALG:BLAKE3", + "/RAD_AGE:1", + "/RAD_CHECK_UNUSED_DELAY_LOAD_DLL", + "/RAD_DO_MERGE", + "/RAD_ENV_LIB", + "/RAD_EXE", + "/RAD_GUID:imageblake3", + "/RAD_LARGE_PAGES:no", + "/RAD_LINK_VER:14.0", + "/RAD_OS_VER:6.0", + "/RAD_PAGE_SIZE:4096", + "/RAD_PATH_STYLE:system", + "/RAD_PDB_HASH_TYPE_NAMES:NONE", + "/RAD_PDB_HASH_TYPE_NAME_LENGTH:8", + "/RAD_DEBUGALTPATH:%_RAD_RDI_PATH%", + "/RAD_MEMORY_MAP_FILES", + "/RAD_MAP_LINES_FOR_UNRESOLVED_SYMBOLS", + "/RAD_UNRESOLVED_SYMBOL_LIMIT:1000", + "/RAD_UNRESOLVED_SYMBOL_REF_LIMIT:10", + (char*)str8f(scratch.arena, "/RAD_MT_PATH:%s", LNK_MANIFEST_MERGE_TOOL_NAME).str, + (char*)str8f(scratch.arena, "/RAD_DATA_DIR_COUNT:%u", PE_DataDirectoryIndex_COUNT).str, + }; + + char *push_opts[] = { + "/MERGE:.xdata=.rdata", + "/MERGE:.00cfg=.rdata", + // TODO: .tls must be always first contribution in .data section because compiler generates TLS relative movs + //"/MERGE:.tls=.data", + "/MERGE:.idata=.data", + "/MERGE:.didat=.data", + "/MERGE:.edata=.rdata", + "/MERGE:.RAD_LINK_PE_DEBUG_DIR=.rdata", + "/MERGE:.RAD_LINK_PE_DEBUG_DATA=.rdata", + + "/RAD_REMOVE_SECTION:.debug", + "/RAD_REMOVE_SECTION:.gehcont", + "/RAD_REMOVE_SECTION:.gfids", + "/RAD_REMOVE_SECTION:.gxfg", + + (char*)str8f(scratch.arena, "/RAD_WORKERS:%u", get_system_info()->logical_processor_count).str, + + // errors that are too verbose in release build + (char*)str8f(scratch.arena, "/RAD_IGNORE:%d", LNK_Warning_UnknownSwitch * (BUILD_DEBUG ? -1 : 1)).str, + (char*)str8f(scratch.arena, "/RAD_IGNORE:%d", LNK_Warning_UnknownDirective * (BUILD_DEBUG ? -1 : 1)).str, + (char*)str8f(scratch.arena, "/RAD_IGNORE:%d", LNK_Error_InvalidTypeIndex * (BUILD_DEBUG ? -1 : 1)).str, + + #if BUILD_DEBUG + "/RAD_LOG:debug", + "/RAD_LOG:io_write", + #else + (char*)str8f(scratch.arena, "/RAD_IGNORE:%u", LNK_Error_InvalidTypeIndex).str, + #endif + }; + +#define DefaultOpt(...) do { \ + LNK_CmdLine parsed_cmd_line = lnk_cmd_line_from_stringf_windows_rules(arena, __VA_ARGS__); \ + for EachNode(cmd, LNK_CmdOption, parsed_cmd_line.first_option) { \ + if (!lnk_cmd_line_has_switch(user_cmd_line, lnk_cmd_switch_type_from_string(cmd->string))) { \ + String8List value_strings = str8_list_copy(arena, &cmd->value_strings); \ + lnk_cmd_line_push_option_list(arena, &cmd_line, cmd->string, value_strings); \ + } \ + } \ +} while (0) + +#define PushOpt(...) do { \ + LNK_CmdLine parsed_cmd_line = lnk_cmd_line_from_stringf_windows_rules(arena, __VA_ARGS__); \ + lnk_cmd_line_concat_in_place(&cmd_line, &parsed_cmd_line); \ +} while (0) + if (lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Dll)) { - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_SubSystem, "%S", pe_string_from_subsystem(PE_WindowsSubsystem_WINDOWS_GUI)); + DefaultOpt("/SUBSYSTEM:%S", pe_string_from_subsystem(PE_WindowsSubsystem_WINDOWS_GUI)); } - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_HighEntropyVa, ""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_ManifestUac, "\"level='asInvoker' uiAccess='false'\""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_NxCompat, ""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_LargeAddressAware, ""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_PdbAltPath, "%%_RAD_PDB_PATH%%"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_PdbPageSize, "%u", KB(4)); if (!lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Brepro)) { - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, "%u", get_process_start_time_unix()); + DefaultOpt("/RAD_TIME_STAMP:%u", get_process_start_time_unix()); } - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_TypeHashAlg, "BLAKE3"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Age, "%u", 1); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, ""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_DoMerge, ""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_EnvLib, ""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Exe, ""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Guid, "imageblake3"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_LargePages, "no"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_LinkVer, "14.0"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_OsVer, "6.0"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_PageSize, "%u", KB(4)); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_PathStyle, "system"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_Workers, "%u", get_system_info()->logical_processor_count); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_DebugAltPath, "%%_RAD_RDI_PATH%%"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_MemoryMapFiles, ""); - if (BUILD_DEBUG) { - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "debug"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Log, "io_write"); - } else { - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%u", LNK_Error_InvalidTypeIndex); + for EachIndex(i, ArrayCount(default_opts)) { + DefaultOpt("%s", default_opts[i]); } - // default section merges - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".xdata=.rdata"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".00cfg=.rdata"); - // TODO: .tls must be always first contribution in .data section because compiler generates TLS relative movs - //lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".tls=.data"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".idata=.data"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".didat=.data"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".edata=.rdata"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".RAD_LINK_PE_DEBUG_DIR=.rdata"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Merge, ".RAD_LINK_PE_DEBUG_DATA=.rdata"); - - // sections to remove from the image - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".debug"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gehcont"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gfids"); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, ".gxfg"); - - // set limits on unresolved symbol errors - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, ""); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, "1000"); - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, "10"); - - // set default max worker count - if (lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Rad_SharedThreadPool)) { - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, ""); - } - - if ( ! lnk_cmd_line_has_switch(user_cmd_line, LNK_CmdSwitch_Rad_MtPath)) { - lnk_cmd_line_push_option_if_not_presentf(arena, &cmd_line, LNK_CmdSwitch_Rad_MtPath, "%s", LNK_MANIFEST_MERGE_TOOL_NAME); + for EachIndex(i, ArrayCount(push_opts)) { + PushOpt("%s", push_opts[i]); } // when /FORCE is specified on the command line, do not stop on these errors @@ -202,39 +233,37 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) } #endif - // errors that are too verbose in release build - U64 debug_opt = BUILD_DEBUG ? -1 : 1; - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Warning_UnknownSwitch * debug_opt); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Warning_UnknownDirective * debug_opt); - lnk_cmd_line_push_optionf(arena, &cmd_line, LNK_CmdSwitch_Rad_Ignore, "%d", LNK_Error_InvalidTypeIndex * debug_opt); - +#undef DefaultOpt +#undef PushOpt + scratch_end(scratch); return cmd_line; } internal LNK_Config * -lnk_config_from_argcv(Arena *arena, int argc, char **argv) +lnk_config_from_argcv(CmdLine *cmdline) { - Temp scratch = scratch_begin(&arena, 1); + Temp scratch = scratch_begin(0,0); String8List raw_cmd_line = {0}; - for (U64 i = 1; i < argc; i += 1) { str8_list_push(arena, &raw_cmd_line, str8_cstring(argv[i])); } + for (U64 i = 1; i < cmdline->argc; i += 1) { str8_list_push(scratch.arena, &raw_cmd_line, str8_cstring(cmdline->argv[i])); } #if PROFILE_TELEMETRY tmMessage(0, TMMF_ICON_NOTE, "Command Line: %.*s", str8_varg(str8_list_join(scratch.arena, &raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }))); #endif // make command line - LNK_CmdLine cmd_line = {0}; + LNK_CmdLine cmd_line_msvc = {0}; { String8List unwrapped_cmd_line = lnk_unwrap_rsp(scratch.arena, raw_cmd_line); LNK_CmdLine user_cmd_line = lnk_cmd_line_parse_windows_rules(scratch.arena, unwrapped_cmd_line); + user_cmd_line.raw_cmd_line = raw_cmd_line; LNK_CmdLine default_cmd_line = lnk_make_default_cmd_line(scratch.arena, user_cmd_line); - lnk_cmd_line_concat_in_place(&cmd_line, &default_cmd_line); - lnk_cmd_line_concat_in_place(&cmd_line, &user_cmd_line); + lnk_cmd_line_concat_in_place(&cmd_line_msvc, &default_cmd_line); + lnk_cmd_line_concat_in_place(&cmd_line_msvc, &user_cmd_line); } // init config - LNK_Config *config = lnk_config_from_cmd_line(raw_cmd_line, cmd_line); + LNK_Config *config = lnk_config_init(cmd_line_msvc); scratch_end(scratch); return config; @@ -1228,6 +1257,20 @@ lnk_array_from_lib_member_list(Arena *arena, LNK_LibMemberRefList list) return result; } +internal LNK_Link * +lnk_link_init(TP_Arena *arena, LNK_Config *config) +{ + LNK_Link *link = push_array(arena->v[0], LNK_Link, 1); + link->arena = arena_alloc(.name = "LINK"); + link->last_symbol_input = &link->objs.first; + link->last_include = &config->include_symbol_list.first; + link->last_default_lib = &config->input_default_lib_list.first; + link->last_obj_lib = &config->input_obj_lib_list.first; + link->last_cmd_lib = &config->input_list[LNK_Input_Lib].first; + link->try_to_resolve_entry_point = 1; + return link; +} + internal LNK_ObjNode * lnk_load_objs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link, U64 *objs_count_out) { @@ -1243,7 +1286,7 @@ lnk_load_objs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer * lnk_log(LNK_Log_InputObj, "[ Obj Input Size %M ]", input_size); } - LNK_ObjNode *new_objs = lnk_obj_from_input_many(tp, arena, config->machine, new_input_objs.count, new_input_objs.v); + LNK_ObjNode *new_objs = lnk_obj_from_input_many(tp, arena, config, new_input_objs.count, new_input_objs.v); // if machine type was unspecified on the command line, derive it from obj file if (config->machine == COFF_MachineType_Unknown) { @@ -1727,7 +1770,7 @@ lnk_link_inputs(TP_Context *tp, B32 link_whole_archive = config->whole_archive_all; if ( ! link_whole_archive) { String8 lib_name = str8_chop_last_dot(str8_skip_last_slash(lib->path)); - link_whole_archive = hash_table_search_path(config->whole_archive_ht, lib_name) != 0; + link_whole_archive = hash_map_search_path_u64(&config->whole_archive_ht, lib_name) != 0; } ProfBeginV("Search %S", str8_skip_last_slash(lib->path)); @@ -1911,23 +1954,14 @@ lnk_link_inputs(TP_Context *tp, ProfEnd(); } + internal LNK_LinkResult lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab) { ProfBeginFunction(); Temp scratch = scratch_begin(arena->v, arena->count); - // - // init link context - // - LNK_Link *link = push_array(arena->v[0], LNK_Link, 1); - link->arena = arena_alloc(.name = "LINK"); - link->last_symbol_input = &link->objs.first; - link->last_include = &config->include_symbol_list.first; - link->last_default_lib = &config->input_default_lib_list.first; - link->last_obj_lib = &config->input_obj_lib_list.first; - link->last_cmd_lib = &config->input_list[LNK_Input_Lib].first; - link->try_to_resolve_entry_point = 1; + LNK_Link *link = lnk_link_init(arena, config); // TODO: factor out // input :null_obj String8 null_obj = lnk_make_null_obj(inputer->arena); @@ -5292,21 +5326,34 @@ THREAD_POOL_TASK_FUNC(lnk_p2r_worker) scratch_end(scratch); } +internal LNK_Obj ** +lnk_debug_filter_objs(Arena *arena, LNK_Obj **objs, U64 objs_count, U64 *count_out) +{ + U64 debug_info_objs_count = 0; + LNK_Obj **debug_info_objs = push_array(arena, LNK_Obj *, objs_count); + for EachIndex(obj_idx, objs_count) { + LNK_Obj *obj = objs[obj_idx]; + + // filter out internal objs from debug info output + if (obj->exclude_from_debug_info) { + continue; + } + + debug_info_objs[debug_info_objs_count++] = obj; + } + if (count_out) { + *count_out = debug_info_objs_count; + } + return debug_info_objs; +} + internal void -lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) +lnk_run_linker(TP_Context *tp, TP_Arena *arena, LNK_Config *config) { ProfBeginFunction(); Temp scratch = scratch_begin(arena->v, arena->count); - if (lnk_get_log_status(LNK_Log_Debug)) { - String8 full_cmd_line = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); - lnk_fprintf(stderr, "--------------------------------------------------------------------------------\n"); - lnk_fprintf(stderr, "Command Line: %.*s\n", str8_varg(full_cmd_line)); - lnk_fprintf(stderr, "Work Dir : %.*s\n", str8_varg(config->work_dir)); - lnk_fprintf(stderr, "--------------------------------------------------------------------------------\n"); - } - // // Input Context // @@ -5368,12 +5415,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) lnk_timer_begin(LNK_Timer_Debug); U64 debug_info_objs_count = 0; - LNK_Obj **debug_info_objs = push_array(scratch.arena, LNK_Obj *, objs_count); - for EachIndex(obj_idx, objs_count) { - LNK_Obj *obj = objs[obj_idx]; - if (obj->exclude_from_debug_info) { continue; } - debug_info_objs[debug_info_objs_count++] = obj; - } + LNK_Obj **debug_info_objs = lnk_debug_filter_objs(scratch.arena, objs, objs_count, &debug_info_objs_count); // // CodeView @@ -5401,7 +5443,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) config->pdb_hash_type_name_length, config->pdb_hash_type_name_map); } - pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &cv, cv_types); + pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &cv, cv_types, LNK_PDB_BuilderFlag_All); if (config->debug_mode == LNK_DebugMode_Full) { lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data); } @@ -5488,7 +5530,7 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) stripped_cv.debug_s_arr = debug_s_arr; stripped_cv.symbol_input_ranges = push_array(scratch.arena, Rng1U64, tp->worker_count); - String8List pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &stripped_cv, (LNK_MergedTypes){0}); + String8List pdb_data = lnk_build_pdb(tp, arena, image_ctx.image_data, config, symtab, &stripped_cv, (LNK_MergedTypes){0}, LNK_PDB_BuilderFlag_All); lnk_write_data_list_to_file_path(config->pdb_stripped_name, str8f(scratch.arena, "%S.tmp", config->pdb_stripped_name), pdb_data); } @@ -5510,15 +5552,265 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) ProfEnd(); } +internal void +lnk_run_type_server(TP_Context *tp, TP_Arena *arena, LNK_Config *config) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(arena->v, arena->count); + + // generate GUID + Guid type_server_guid = {0}; + { + blake3_hasher hasher = {0}; + blake3_hasher_init(&hasher); + blake3_hasher_update(&hasher, config->pdb_name.str, config->pdb_name.size); + blake3_hasher_update(&hasher, (U8*)&config->time_stamp, sizeof(config->time_stamp)); + blake3_hasher_finalize(&hasher, type_server_guid.v, sizeof(type_server_guid.v)); + } + + // push default type-server switches + lnk_config_pushf(config, "/PDB:\"%S.type_server.pdb\"", str8_chop_last_dot(config->pdb_name)); + lnk_config_pushf(config, "/DEBUG:FULL"); + lnk_config_pushf(config, "/NOD"); + lnk_config_pushf(config, "/RAD_WRITE_TEMP_FILES"); + lnk_config_pushf(config, "/RAD_MEMORY_MAP_FILES:READ_WRITE"); + lnk_config_pushf(config, "/RAD_GUID:%S", string_from_guid(scratch.arena, type_server_guid)); + + // load objs + U64 objs_count = 0; + LNK_Obj **objs = 0; + { + LNK_Inputer *inputer = lnk_inputer_init(); + LNK_Link *link = lnk_link_init(arena, config); + + // input :null_obj + String8 null_obj = lnk_make_null_obj(inputer->arena); + lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit("* Null *"), null_obj); + + // input objs on command line + for (String8Node *obj_path = config->input_list[LNK_Input_Obj].first; obj_path != 0; obj_path = obj_path->next) { + lnk_inputer_push_obj_thin(inputer, 0, obj_path->string); + } + + LNK_ObjNode *obj_nodes = lnk_load_objs(tp, arena, config, inputer, 0, link, &objs_count); + objs = push_array(scratch.arena, LNK_Obj *, objs_count); + for EachIndex(obj_idx, objs_count) { objs[obj_idx] = &obj_nodes[obj_idx].data; } + } + + // obj filters + { + // internal filter + objs = lnk_debug_filter_objs(scratch.arena, objs, objs_count, &objs_count); + + // command line filter + { + U64 result_count = 0; + LNK_Obj **result = push_array(scratch.arena, LNK_Obj *, objs_count); + for EachIndex(obj_idx, objs_count) { + LNK_Obj *obj = objs[obj_idx]; + + B32 skip = 0; + if (config->type_server_match_obj.node_count) { + skip = 1; + for EachNode(filter_n, String8Node, config->type_server_match_obj.first) { + if (str8_match_wildcard(obj->path, filter_n->string, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive)) { + skip = 0; + break; + } + } + } + if (skip) { continue; } + + result[result_count++] = obj; + } + objs_count = result_count; + objs = result; + } + } + + // compute size of objs compiled with /Z7 + U64 debug_t_total_size = 0; + { + for EachIndex(obj_idx, objs_count) { + LNK_Obj *obj = objs[obj_idx]; + + // register debug info sections + U64 type_sect_indices_count = 0; + U32 type_sect_indices[4] = {0}; + if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { type_sect_indices[type_sect_indices_count++] = obj->debug_t_sect_idx; } + else if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { type_sect_indices[type_sect_indices_count++] = obj->debug_p_sect_idx; } + + for EachIndex(i, type_sect_indices_count) { + U64 section_idx = type_sect_indices[i]; + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + COFF_SectionHeader *debug_t_header = §ion_table[section_idx]; + String8 debug_t_data = str8_substr(obj->data, r1u64(debug_t_header->foff, debug_t_header->foff + debug_t_header->fsize)); + CV_Leaf first_leaf = {0}; + if (cv_read_leaf(debug_t_data, sizeof(CV_Signature), CV_LeafAlign, &first_leaf) >= sizeof(CV_LeafHeader)) { + if ( ! cv_is_leaf_type_server(first_leaf.kind)) { + debug_t_total_size += debug_t_data.size; + } + } + } + } + } + + if (debug_t_total_size) { + // merge & write types + LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config, objs_count, objs); + LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv); + String8List pdb = lnk_build_pdb(tp, arena, str8_zero(), config, 0, &cv, cv_types, LNK_PDB_BuilderFlag_Tpi|LNK_PDB_BuilderFlag_Ipi); + lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb); + + typedef struct Edit { + struct Edit *next; + String8 data; + U64 offset; + LNK_Obj *obj; + } Edit; + Edit *edits = 0; + + for EachIndex(obj_idx, objs_count) { + LNK_Obj *obj = objs[obj_idx]; + + // skip objs in libraries + if (obj->link_member) { continue; } + + if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + COFF_SectionHeader *section_header = §ion_table[obj->debug_t_sect_idx]; + + // skip type servers + if (cv_debug_t_is_type_server_ref(&cv.debug_t_arr[obj_idx])) { continue; } + + CV_LeafTypeServer2 ts_info = { .sig70 = config->guid, .age = 1 }; + String8List ts_srl = {0}; + str8_list_push(scratch.arena, &ts_srl, str8_struct(&ts_info)); + str8_list_push(scratch.arena, &ts_srl, push_cstr(scratch.arena, config->pdb_name)); + + // type server srl -> CodeView leaf + String8 ts_string = str8_list_join(scratch.arena, &ts_srl, 0); + String8 ts_leaf = cv_make_leaf(scratch.arena, CV_LeafKind_TYPESERVER2, ts_string, CV_LeafAlign); + + // make type server .debug$T + String8List debug_t_list = {0}; + str8_list_push(scratch.arena, &debug_t_list, str8_struct((&(CV_Signature){ CV_Signature_C13 }))); + str8_list_push(scratch.arena, &debug_t_list, ts_leaf); + String8 debug_t = str8_list_join(scratch.arena, &debug_t_list, 0); + + // realloc seciton if there is not enough room in the section header + if (debug_t.size > section_header->fsize) { + section_header->foff = obj->data.size; + section_header->fsize = debug_t.size; + + // append to the obj + struct Edit *e = push_array(scratch.arena, struct Edit, 1); + e->data = debug_t; + e->offset = obj->data.size; + e->obj = obj; + SLLStackPush(edits, e); + } else { + section_header->fsize = debug_t.size; + + Rng1U64 section_frange = rng_1u64(section_header->foff, section_header->foff + section_header->fsize); + String8 section_data = str8_substr(obj->data, section_frange); + MemoryCopyStr8(section_data.str, debug_t); + } + } + + // discard precompiled headers types, they are already in the type server + if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + COFF_SectionHeader *section_header = §ion_table[obj->debug_p_sect_idx]; + section_header->flags |= COFF_SectionFlag_LnkRemove; + } + + // discard type hashes sectiosn, there is no /Z7 sections in the file + if (obj->debug_h_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + COFF_SectionHeader *section_header = §ion_table[obj->debug_h_sect_idx]; + section_header->flags |= COFF_SectionFlag_LnkRemove; + } + + // edit obj + if (edits) { + #if OS_WINDOWS + AssertAlways(UnmapViewOfFile(obj->data.str)); + #else + NotImplemented; + #endif + File handle = file_open(AccessFlag_Append|AccessFlag_Read|AccessFlag_Write, obj->path); + for EachNode(e, struct Edit, edits) { + AssertAlways(file_write(handle, r1u64(e->offset, e->offset + e->data.size), e->data.str) == e->data.size); + } + file_close(handle); + } + } + } + +#if 0 + // relaunch the binary with the same command line, but with boot mode set to LINKER + if (config->type_server == LNK_SwitchState_Yes) { + String8 curr_cmdl = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){.sep=str8_lit(" ")}); + String8 linker_cmdl = str8f(scratch.arena, "%S %S /RAD_TYPE_SERVER:NO /RAD_BOOT_MODE:LINKER", get_process_info()->binary_file_path, curr_cmdl); + + ProcessLaunchParams launch_opts = { + .path = get_process_info()->binary_path, + .inherit_env = 1, + .consoleless = 1, + .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, linker_cmdl), + }; + Process process_handle = process_launch(&launch_opts); + + if (process_match(process_handle, process_zero())) { + String8 e = str8f(scratch.arena, "failed to launch radlink(%S) after type server step\n"); + lnk_invalid_path((char*)e.str); + } + } +#endif + + scratch_end(scratch); + ProfEnd(); +} + internal void entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0,0); lnk_log_begin(); - LNK_Config *config = lnk_config_from_argcv(scratch.arena, cmdline->argc, cmdline->argv); + + LNK_Config *config = lnk_config_from_argcv(cmdline); TP_Context *tp = tp_alloc(scratch.arena, config->worker_count, config->max_worker_count, config->shared_thread_pool_name); TP_Arena *tp_arena = tp_arena_alloc(tp); - lnk_run(tp, tp_arena, config); + + // detect type server from the environment + { + HashMap env = lnk_env_vars_from_process_info(scratch.arena, get_process_info(), LNK_EnvVarRule_Current); + LNK_EnvVar *type_server_var = lnk_env_var_from_mapf(&env, "RAD_TYPE_SERVER"); + if (type_server_var) { + U64 do_type_server = 0; + if (lnk_env_var_to_u64(&env, type_server_var, &do_type_server)) { + if (do_type_server) { + lnk_config_pushf(config, "/RAD_TYPE_SERVER"); + lnk_log(LNK_Log_Debug, "type server mode was enabled from the environment\n"); + } + } + } + } + + if (lnk_get_log_status(LNK_Log_Debug)) { + String8 full_cmd_line = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); + lnk_fprintf(stderr, "--------------------------------------------------------------------------------\n"); + lnk_fprintf(stderr, "Command Line: %.*s\n", str8_varg(full_cmd_line)); + lnk_fprintf(stderr, "Work Dir : %.*s\n", str8_varg(config->work_dir)); + lnk_fprintf(stderr, "--------------------------------------------------------------------------------\n"); + } + + switch (config->boot_mode) { + case LNK_BootMode_Linker: lnk_run_linker (tp, tp_arena, config); break; + case LNK_BootMode_TypeServer: lnk_run_type_server(tp, tp_arena, config); break; + } + lnk_log_end(); scratch_end(scratch); } diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 5b2d20e3..0c1ff4a3 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -319,7 +319,7 @@ typedef struct // --- Config ----------------------------------------------------------------- -internal LNK_Config * lnk_config_from_argcv(Arena *arena, int argc, char **argv); +internal LNK_Config * lnk_config_from_cmdline(CmdLine *cmdline); // --- Entry Point ------------------------------------------------------------- @@ -375,6 +375,7 @@ internal void lnk_lib_member_ref_list_concat_in_place_array(LNK_L internal int lnk_lib_member_ref_is_before(void *raw_a, void *raw_b); internal LNK_LibMemberRef ** lnk_array_from_lib_member_list(Arena *arena, LNK_LibMemberRefList list); +internal LNK_Link * lnk_link_init (TP_Arena *arena, LNK_Config *config); internal LNK_ObjNode * lnk_load_objs (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link, U64 *objs_count_out); internal void lnk_load_libs (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_Link *link); internal void lnk_link_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link); diff --git a/src/linker/lnk_cmd_line.c b/src/linker/lnk_cmd_line.c index 80f07c53..7e25ffa4 100644 --- a/src/linker/lnk_cmd_line.c +++ b/src/linker/lnk_cmd_line.c @@ -143,6 +143,7 @@ lnk_cmd_line_concat_in_place(LNK_CmdLine *list, LNK_CmdLine *to_concat) internal LNK_CmdLine lnk_cmd_line_parse_windows_rules(Arena *arena, String8List arg_list) { + Temp scratch = scratch_begin(&arena, 1); LNK_CmdLine cmd_line = {0}; cmd_line.raw_cmd_line = str8_list_copy(arena, &arg_list); @@ -161,17 +162,41 @@ lnk_cmd_line_parse_windows_rules(Arena *arena, String8List arg_list) String8 value_string = str8_skip(arg, param_start_pos + 1); // make value list - String8List value_list = str8_split_by_string_chars(arena, value_string, str8_lit(","), 0); + String8List value_list_unowned = str8_split_by_string_chars(scratch.arena, value_string, str8_lit(","), 0); + String8List value_list = str8_list_copy(arena, &value_list_unowned); // push command + option_name = push_str8_copy(arena, option_name); lnk_cmd_line_push_option_list(arena, &cmd_line, option_name, value_list); } else { - str8_list_push(arena, &cmd_line.input_list, arg); + str8_list_push(arena, &cmd_line.input_list, push_str8_copy(arena, arg)); } } + scratch_end(scratch); return cmd_line; } +internal LNK_CmdLine +lnk_cmd_line_from_stringfv_windows_rules(Arena *arena, char *fmt, va_list args) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 string = push_str8fv(scratch.arena, fmt, args); + String8List arg_list = lnk_arg_list_parse_windows_rules(scratch.arena, string); + LNK_CmdLine result = lnk_cmd_line_parse_windows_rules(arena, arg_list); + scratch_end(scratch); + return result; +} + +internal LNK_CmdLine +lnk_cmd_line_from_stringf_windows_rules(Arena *arena, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + LNK_CmdLine result = lnk_cmd_line_from_stringfv_windows_rules(arena, fmt, args); + va_end(args); + return result; +} + internal LNK_CmdOption * lnk_cmd_line_option_from_string(LNK_CmdLine cmd_line, String8 string) { @@ -245,7 +270,159 @@ lnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line) } internal String8 -lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string) +lnk_env_var_chain_separator_from_rule(LNK_EnvVarRule rule) +{ + String8 result = {0}; + switch (rule) { + case LNK_EnvVarRule_Batch: { result = str8_lit(";"); } break; + case LNK_EnvVarRule_Bash: { result = str8_lit(":"); } break; + default: break; + } + return result; +} + +internal LNK_EnvVar * +lnk_env_var_push(Arena *arena, HashMap *env_vars, String8 key, String8 value, LNK_EnvVarRule rule) +{ + LNK_EnvVar *env_var = lnk_env_var_from_map(env_vars, key); + if (env_var == 0) { + env_var = push_array(arena, LNK_EnvVar, 1); + env_var->raw_value = value; + env_var->rule = rule; + hash_map_push_path_raw(arena, env_vars, key, env_var); + } + return env_var; +} + +internal LNK_EnvVar * +lnk_env_var_push_string(Arena *arena, HashMap *env_vars, String8 string, LNK_EnvVarRule rule) +{ + LNK_EnvVar *result = 0; + + string = str8_skip_chop_whitespace(string); + + // string -> (key, value) + String8 key = {0}; + String8 val = {0}; + switch (rule) { + case LNK_EnvVarRule_Batch: { + if (string.size >= 2) { + if (str8_match_wildcard(string, str8_lit("\"*\""), 0)) { + string = str8_chop(str8_skip(string, 1), 1); + } + } + + U64 sep_idx = str8_find_needle(string, 0, str8_lit("="), 0); + if (sep_idx < string.size) { + // extract key and value + key = str8_skip_chop_whitespace(str8_prefix(string, sep_idx)); + val = str8_skip_chop_whitespace(str8_skip(string, sep_idx+1)); + + // strip quotes + if (str8_match_wildcard(val, str8_lit("\"*\""), 0) || // "*" + str8_match_wildcard(val, str8_lit("\'*\'"), 0)) { // '*' + val = str8_chop(str8_skip(val, 1), 1); + } + } + } break; + + case LNK_EnvVarRule_Bash: { + U64 sep_idx = str8_find_needle(string, 0, str8_lit("="), 0); + if (sep_idx < string.size) { + // extract key and value + key = str8_skip_chop_whitespace(str8_prefix(string, sep_idx)); + val = str8_skip_chop_whitespace(str8_skip(string, sep_idx+1)); + + // strip quotes + if (str8_match_wildcard(val, str8_lit("\"*\""), 0) || // "*" + str8_match_wildcard(val, str8_lit("\'*\'"), 0)) { // '*' + val = str8_chop(str8_skip(val, 1), 1); + } + } + } break; + + default: break; + } + + if (key.size > 0) { + result = lnk_env_var_push(arena, env_vars, key, val, rule); + } + + return result; +} + +internal LNK_EnvVar * +lnk_env_var_push_batch(Arena *arena, HashMap *env_vars, String8 string) +{ + return lnk_env_var_push_string(arena, env_vars, string, LNK_EnvVarRule_Batch); +} + +internal LNK_EnvVar * +lnk_env_var_push_bash(Arena *arena, HashMap *env_vars, String8 string) +{ + return lnk_env_var_push_string(arena, env_vars, string, LNK_EnvVarRule_Bash); +} + +internal LNK_EnvVar * +lnk_env_var_batchf(Arena *arena, HashMap *env_vars, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(arena, fmt, args); + va_end(args); + LNK_EnvVar *result = lnk_env_var_push_string(arena, env_vars, string, LNK_EnvVarRule_Batch); + return result; +} + +internal LNK_EnvVar * +lnk_env_var_bashf(Arena *arena, HashMap *env_vars, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(arena, fmt, args); + va_end(args); + LNK_EnvVar *result = lnk_env_var_push_string(arena, env_vars, string, LNK_EnvVarRule_Bash); + return result; +} + +internal LNK_EnvVar * +lnk_env_var_from_mapf(HashMap *env_vars, char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + String8 key = push_str8fv(scratch.arena, fmt, args); + va_end(args); + LNK_EnvVar *result = hash_map_search_path_raw(env_vars, key); + scratch_end(scratch); + return result; +} + +internal LNK_EnvVar * +lnk_env_var_from_map(HashMap *env_vars, String8 key) +{ + return hash_map_search_path_raw(env_vars, key); +} + +internal String8List +lnk_value_list_from_env_var(Arena *arena, LNK_EnvVar *env_var) +{ + return str8_split_by_string_chars(arena, env_var->raw_value, lnk_env_var_chain_separator_from_rule(env_var->rule), 0); +} + +internal B32 +lnk_env_var_to_u64(HashMap *env_vars, LNK_EnvVar *env_var, U64 *value_out) +{ + String8 value = str8_skip_chop_whitespace(env_var->raw_value); + if (str8_match_wildcard(value, str8_lit("\"*\""), 0) || + str8_match_wildcard(value, str8_lit("\'*\'"), 0)) { + value = str8_chop(str8_skip(value, 1), 1); + } + return try_u64_from_str8_c_rules(value, value_out); +} + +internal String8 +lnk_expand_env_vars_windows(Arena *arena, HashMap *env_vars, String8 string) { Temp scratch = scratch_begin(&arena, 1); @@ -260,9 +437,9 @@ lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string) if (open < close) { String8 env_var_name = str8_substr(string, rng_1u64(open+1, close)); - BucketNode *match = hash_table_search_path(env_vars, env_var_name); - if (match) { - str8_list_push(scratch.arena, &list, match->v.value_string); + LNK_EnvVar *env_var = lnk_env_var_from_map(env_vars, env_var_name); + if (env_var) { + str8_list_push(scratch.arena, &list, env_var->raw_value); i = close+1; } else { str8_list_pushf(scratch.arena, &list, "%%%S", env_var_name); @@ -277,3 +454,13 @@ lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string) return result; } +internal HashMap +lnk_env_vars_from_process_info(Arena *arena, ProcessInfo *proc_info, LNK_EnvVarRule rule) +{ + HashMap env_vars = {0}; + for EachNode(node, String8Node, proc_info->environment.first) { + lnk_env_var_push_string(arena, &env_vars, str8_copy(arena, node->string), rule); + } + return env_vars; +} + diff --git a/src/linker/lnk_cmd_line.h b/src/linker/lnk_cmd_line.h index b1ad7d16..083a651f 100644 --- a/src/linker/lnk_cmd_line.h +++ b/src/linker/lnk_cmd_line.h @@ -19,18 +19,56 @@ typedef struct LNK_CmdLine String8List raw_cmd_line; } LNK_CmdLine; -internal String8List lnk_arg_list_parse_windows_rules(Arena *arena, String8 string); -internal LNK_CmdLine lnk_cmd_line_parse_windows_rules(Arena *arena, String8List arg_list); -internal LNK_CmdOption * lnk_cmd_line_option_from_string(LNK_CmdLine cmd_line, String8 string); -internal B32 lnk_cmd_line_has_option_string(LNK_CmdLine cmd_line, String8 string); -internal B32 lnk_cmd_line_has_option(LNK_CmdLine cmd_line, char *string); +typedef enum LNK_EnvVarRule +{ + LNK_EnvVarRule_Null, + LNK_EnvVarRule_Batch, + LNK_EnvVarRule_Bash, +#if OS_WINDOWS + LNK_EnvVarRule_Current, +#elif OS_LINUX + LNK_EnvVarRule_Current, +#else +# error "define env var rules" +#endif +} LNK_EnvVarRule; -internal LNK_CmdOption * lnk_cmd_line_push_option(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value); -internal LNK_CmdOption * lnk_cmd_line_push_option_if_not_present(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value); +typedef struct LNK_EnvVar +{ + LNK_EnvVarRule rule; + String8 raw_value; + String8List chain_values; +} LNK_EnvVar; + +// --- List Helpers ------------------------------------------------------------ internal void lnk_cmd_line_concat_in_place(LNK_CmdLine *list, LNK_CmdLine *to_concat); -internal String8List lnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line); +// --- Command Line ------------------------------------------------------------ -internal String8 lnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string); +internal String8List lnk_arg_list_parse_windows_rules (Arena *arena, String8 string); +internal LNK_CmdLine lnk_cmd_line_parse_windows_rules (Arena *arena, String8List arg_list); +internal LNK_CmdLine lnk_cmd_line_from_stringfv_windows_rules(Arena *arena, char *fmt, va_list args); +internal LNK_CmdLine lnk_cmd_line_from_stringf_windows_rules (Arena *arena, char *fmt, ...); +internal LNK_CmdOption * lnk_cmd_line_push_option_list (Arena *arena, LNK_CmdLine *cmd_line, String8 string, String8List value_strings); +internal LNK_CmdOption * lnk_cmd_line_push_option (Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value); +internal LNK_CmdOption * lnk_cmd_line_push_option_if_not_present (Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value); +internal String8List lnk_data_from_cmd_line (Arena *arena, LNK_CmdLine cmd_line); +internal LNK_CmdOption * lnk_cmd_line_option_from_string (LNK_CmdLine cmd_line, String8 string); +internal B32 lnk_cmd_line_has_option_string (LNK_CmdLine cmd_line, String8 string); +internal B32 lnk_cmd_line_has_option (LNK_CmdLine cmd_line, char *string); +// --- Env Vars ---------------------------------------------------------------- + +internal HashMap lnk_env_vars_from_process_info(Arena *arena, ProcessInfo *proc_info, LNK_EnvVarRule rule); + +internal LNK_EnvVar * lnk_env_var_from_map (HashMap *env, String8 key); +internal LNK_EnvVar * lnk_env_var_from_mapf (HashMap *env, char *fmt, ...); +internal LNK_EnvVar * lnk_env_var_push (Arena *arena, HashMap *env, String8 key, String8 value, LNK_EnvVarRule rule); +internal LNK_EnvVar * lnk_env_var_push_string (Arena *arena, HashMap *env, String8 string, LNK_EnvVarRule rule); +internal LNK_EnvVar * lnk_env_var_push_batch (Arena *arena, HashMap *env, String8 string); +internal LNK_EnvVar * lnk_env_var_push_bash (Arena *arena, HashMap *env, String8 string); +internal LNK_EnvVar * lnk_env_var_pushf (Arena *arena, HashMap *env, LNK_EnvVarRule rule, char *fmt, ...); +internal String8List lnk_value_list_from_env_var(Arena *arena, LNK_EnvVar *env_var); +internal B32 lnk_env_var_to_u64 (HashMap *env, LNK_EnvVar *var, U64 *value_out); +internal String8 lnk_expand_env_vars_windows(Arena *arena, HashMap *env, String8 string); diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 2e5a8f1a..949fa256 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -63,11 +63,15 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Rad_Age, 0, "RAD_AGE", ":#", "Age embeded in EXE and PDB, used to validate incremental build. Default is 1." }, { LNK_CmdSwitch_Rad_AltPchDir, 0, "RAD_ALT_PCH_DIR", ":PATH", "Alternative directory to search for PCH object files." }, + //{ LNK_CmdSwitch_Rad_BuildExp, 0, "RAD_BUILD_EXP", "[:NO]", "Build export data." }, { LNK_CmdSwitch_Rad_BuildInfo, 0, "RAD_BUILD_INFO", "", "Print build info and exit." }, + { LNK_CmdSwitch_Rad_BuildImpLib, 0, "RAD_BUILD_IMPLIB", "[:NO]", "Build import library." }, { LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, 0, "RAD_CHECK_UNUSED_DELAY_LOAD_DLL", "[:NO]", "Check for unused delay load dlls." }, + { LNK_CmdSwitch_Rad_DataDirCount, 0, "RAD_DATA_DIR_COUNT", ":#", "Internal default for PE optional header data directory count." }, { LNK_CmdSwitch_Rad_Map, 0, "RAD_MAP", ":FILENAME", "Emit file with the output image's layout description." }, { LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, 0, "RAD_MAP_LINES_FOR_UNRESOLVED_SYMBOLS", "[:NO]", "Use debug info to print source file location for unresolved symbol" }, - { LNK_CmdSwitch_Rad_MemoryMapFiles, 0, "RAD_MEMORY_MAP_FILES", "[:NO]", "When enabled, files are memory-mapped instead of being read entirely on request." }, + { LNK_CmdSwitch_Rad_MemoryMapFiles, 0, "RAD_MEMORY_MAP_FILES", "[:{NO|READ_ONLY|READ_WRITE}]", "When enabled, files are memory-mapped instead of being read entirely on request." }, + { LNK_CmdSwitch_Rad_BootMode, 0, "RAD_BOOT_MODE", "[:LINKER|TYPE_SERVER]", "Overrides default boot program." }, { LNK_CmdSwitch_Rad_Debug, 0, "RAD_DEBUG", "[:NO]", "Emit RAD debug info file." }, { LNK_CmdSwitch_Rad_DebugAltPath, 0, "RAD_DEBUGALTPATH", ":PATH", "Alternative output path fof the RDI." }, { LNK_CmdSwitch_Rad_DebugName, 0, "RAD_DEBUG_NAME", ":FILENAME", "Set file name for RAD debug info file." }, @@ -98,6 +102,10 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, 0, "RAD_UNRESOLVED_SYMBOL_REF_LIMIT", ":#", "Limit number of unresolved symbol references linker reports." }, { LNK_CmdSwitch_Rad_Version, 0, "RAD_VERSION", "", "Print version and exit." }, { LNK_CmdSwitch_Rad_Workers, 0, "RAD_WORKERS", ":#", "Set number of workers created in the pool. Number is capped at 1024. When /RAD_SHARED_THREAD_POOL is specified this number cant exceed /RAD_SHARED_THREAD_POOL_MAX_WORKERS." }, + { LNK_CmdSwitch_Rad_WorkDir, 0, "RAD_WORK_DIR", ":PATH", "Working directory used for stable debug paths." }, + + { LNK_CmdSwitch_RadTypeServer, 0, "RAD_TYPE_SERVER", "", "Boot in type server mode." }, + { LNK_CmdSwitch_RadTypeServer_MatchObj, 0, "RAD_TYPE_SERVER_MATCH_OBJ", ":OBJ_PATH", "Obj paths that match OBJ_PATH have their type server replaced." }, { LNK_CmdSwitch_Help, 0, "HELP", "", "" }, { LNK_CmdSwitch_Help, 0, "?", "", "" }, @@ -210,32 +218,18 @@ lnk_type_name_hash_mode_from_string(String8 name) return LNK_TypeNameHashMode_Null; } -internal LNK_CmdOption * -lnk_cmd_line_push_option_if_not_presentf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...) +internal String8List +lnk_cmd_line_values_from_switch(Arena *arena, LNK_CmdLine cmd_line, LNK_CmdSwitchType cmd_switch) { - LNK_CmdOption *opt = 0; - String8 cmd_switch_name = lnk_string_from_cmd_switch_type(cmd_switch_type); - if (!lnk_cmd_line_has_option_string(*cmd_line, cmd_switch_name)) { - va_list param_args; - va_start(param_args, param_fmt); - String8 param_str = push_str8fv(arena, param_fmt, param_args); - va_end(param_args); - - opt = lnk_cmd_line_push_option_string(arena, cmd_line, cmd_switch_name, param_str); - } - return opt; -} - -internal LNK_CmdOption * -lnk_cmd_line_push_optionf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch, char *param_fmt, ...) -{ - va_list param_args; - va_start(param_args, param_fmt); - String8 param_str = push_str8fv(arena, param_fmt, param_args); - va_end(param_args); + String8List values = {0}; String8 cmd_switch_name = lnk_string_from_cmd_switch_type(cmd_switch); - LNK_CmdOption *opt = lnk_cmd_line_push_option_string(arena, cmd_line, cmd_switch_name, param_str); - return opt; + for EachNode(cmd, LNK_CmdOption, cmd_line.first_option) { + if (str8_match(cmd->string, cmd_switch_name, StringMatchFlag_CaseInsensitive)) { + String8List value_strings = str8_list_copy(arena, &cmd->value_strings); + str8_list_concat_in_place(&values, &value_strings); + } + } + return values; } internal B32 @@ -363,7 +357,7 @@ lnk_cmd_switch_parse_tuple(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8Li tuple_out->v[1] = b; return 1; } else { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unable ot parse second parameter \"%S\"", value_strings.last->string); + lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unable to parse second parameter \"%S\"", value_strings.last->string); } } else { lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "unable to parse first parameter \"%S\"", value_strings.first->string); @@ -930,7 +924,7 @@ lnk_is_section_removed(LNK_Config *config, String8 section_name) internal B32 lnk_is_dll_delay_load(LNK_Config *config, String8 dll_name) { - return hash_table_search_path_u64(config->delay_load_ht, dll_name, 0); + return hash_map_search_path_u64(&config->delay_load_ht, dll_name) != 0; } internal String8 @@ -954,21 +948,21 @@ internal void lnk_push_disallow_lib(LNK_Config *config, String8 path) { String8 lib_name = lnk_get_lib_name(path); - hash_table_push_path_u64(config->arena, config->disallow_lib_ht, lib_name, 0); + hash_map_push_path_u64(config->arena, &config->disallow_lib_ht, lib_name, 1); } internal B32 lnk_is_lib_disallowed(LNK_Config *config, String8 path) { String8 lib_name = lnk_get_lib_name(path); - return hash_table_search_path(config->disallow_lib_ht, lib_name) != 0; + return hash_map_search_path_u64(&config->disallow_lib_ht, lib_name) != 0; } internal void lnk_include_symbol(LNK_Config *config, String8 name, LNK_Obj *obj) { // is this a duplicate symbol? - if (hash_table_search_string_raw(config->include_symbol_ht, name)) { + if (hash_map_search_string_raw(&config->include_symbol_ht, name)) { return; } @@ -981,7 +975,7 @@ lnk_include_symbol(LNK_Config *config, String8 name, LNK_Obj *obj) SLLQueuePush(config->include_symbol_list.first, config->include_symbol_list.last, node); config->include_symbol_list.count += 1; - hash_table_push_string_raw(config->arena, config->include_symbol_ht, name, node); + hash_map_push_string_raw(config->arena, &config->include_symbol_ht, name, node); } internal void @@ -1117,6 +1111,23 @@ lnk_unwrap_rsp(Arena *arena, String8List arg_list) return result; } +internal void +lnk_apply_write_temp_files(Arena *arena, LNK_Config *config) +{ + if (config->rad_chunk_map_name.size) { + config->temp_rad_chunk_map_name = push_str8f(arena, "%S.tmp%x", config->rad_chunk_map_name, config->time_stamp); + } + if (config->out_path.size) { + config->temp_out_path = push_str8f(arena, "%S.tmp%x", config->out_path, config->time_stamp); + } + if (config->pdb_name.size) { + config->temp_pdb_name = push_str8f(arena, "%S.tmp%x", config->pdb_name, config->time_stamp); + } + if (config->rad_debug_name.size) { + config->temp_rad_debug_name = push_str8f(arena, "%S.tmp%x", config->rad_debug_name, config->time_stamp); + } +} + internal void lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List value_strings, LNK_Obj *obj) { @@ -1153,19 +1164,19 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List if (value_strings.node_count == 1) { LNK_AltName alt_name; if (lnk_parse_alt_name_directive(value_strings.first->string, obj, &alt_name)) { - String8 to_extant = {0}; - if (hash_table_search_string_string(config->alt_name_ht, alt_name.from, &to_extant)) { - if (str8_match(to_extant, alt_name.to, 0)) { + String8 *to_extant = hash_map_search_string_string(&config->alt_name_ht, alt_name.from); + if (to_extant) { + if (str8_match(*to_extant, alt_name.to, 0)) { // ignore, duplicate } else { - lnk_error_obj(LNK_Error_AlternateNameConflict, obj, "conflicting alternative name: existing '%S=%S' vs. new '%S=%S'", alt_name.from, to_extant, alt_name.from, alt_name.to); + lnk_error_obj(LNK_Error_AlternateNameConflict, obj, "conflicting alternative name: existing '%S=%S' vs. new '%S=%S'", alt_name.from, *to_extant, alt_name.from, alt_name.to); } } else { alt_name.from = push_str8_copy(config->arena, alt_name.from); alt_name.to = push_str8_copy(config->arena, alt_name.to); lnk_alt_name_list_push(config->arena, &config->alt_name_list, alt_name); - hash_table_push_string_string(config->arena, config->alt_name_ht, alt_name.from, alt_name.to); + hash_map_push_string_string(config->arena, &config->alt_name_ht, alt_name.from, alt_name.to); } } } else { @@ -1252,9 +1263,9 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_DelayLoad: { for (String8Node *name_n = value_strings.first; name_n != 0; name_n = name_n->next) { - if (hash_table_search_path_u64(config->delay_load_ht, name_n->string, 0)) { continue; } + if (hash_map_search_path_u64(&config->delay_load_ht, name_n->string)) { continue; } String8 name = push_str8_copy(config->arena, name_n->string); - hash_table_push_path_u64(config->arena, config->delay_load_ht, name, 0); + hash_map_push_path_u64(config->arena, &config->delay_load_ht, name, 1); str8_list_push(config->arena, &config->delay_load_dll_list, name); } } break; @@ -1283,7 +1294,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List PE_ExportParse export_parse = {0}; if (lnk_parse_export_directive_ex(config->arena, value_strings, obj, &export_parse)) { String8 export_name = pe_name_from_export_parse(&export_parse); - PE_ExportParseNode *exp_n = hash_table_search_string_raw(config->export_ht, export_name); + PE_ExportParseNode *exp_n = hash_map_search_string_raw(&config->export_ht, export_name); if (exp_n == 0) { // make sure export is defined @@ -1294,7 +1305,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List // push new export exp_n = pe_export_parse_list_push(config->arena, &config->export_symbol_list, export_parse); - hash_table_push_string_raw(config->arena, config->export_ht, export_name, exp_n); + hash_map_push_string_raw(config->arena, &config->export_ht, export_name, exp_n); } else { B32 is_ambiguous = 1; PE_ExportParse *extant_export = &exp_n->data; @@ -1332,7 +1343,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List break; } - LNK_AltName *current = hash_table_search_string_raw(config->fail_if_mismatch_ht, dir.from); + LNK_AltName *current = hash_map_search_string_raw(&config->fail_if_mismatch_ht, dir.from); if (current) { if ( ! str8_match(current->to, dir.to, 0)) { lnk_error_cmd_switch(LNK_Error_FailIfMismatch, obj, cmd_switch, @@ -1347,7 +1358,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List n->from = push_str8_copy(config->arena, dir.from); n->to = push_str8_copy(config->arena, dir.to); n->obj = obj; - hash_table_push_string_raw(config->arena, config->fail_if_mismatch_ht, n->from, n); + hash_map_push_string_raw(config->arena, &config->fail_if_mismatch_ht, n->from, n); } } break; @@ -1616,10 +1627,10 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } else { for (String8Node *lib_n = value_strings.first; lib_n != 0; lib_n = lib_n->next) { String8 lib_name = lnk_get_lib_name(lib_n->string); - if (hash_table_search_path_raw(config->disallow_lib_ht, lib_name)) { + if (hash_map_search_path_u64(&config->disallow_lib_ht, lib_name)) { continue; } - hash_table_push_path_raw(config->arena, config->disallow_lib_ht, lib_name, 0); + hash_map_push_path_u64(config->arena, &config->disallow_lib_ht, lib_name, 1); } } } break; @@ -1782,7 +1793,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List String8 lib_name; if (lnk_cmd_switch_parse_string(obj, cmd_switch, value_strings, &lib_name)) { lib_name = str8_chop_last_dot(str8_skip_last_slash(lib_name)); - hash_table_push_path_string(config->arena, config->whole_archive_ht, lib_name, str8_zero()); + hash_map_push_path_u64(config->arena, &config->whole_archive_ht, lib_name, 1); } } } break; @@ -1800,15 +1811,40 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List str8_list_concat_in_place(&config->alt_pch_dirs, &dirs); } break; + //case LNK_CmdSwitch_Rad_BuildExp: { + // LNK_SwitchState state; + // if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) { + // config->build_exp = (state == LNK_SwitchState_Yes); + // } + //} break; + case LNK_CmdSwitch_Rad_BuildInfo: { lnk_print_build_info(); abort_self(0); } break; + case LNK_CmdSwitch_Rad_BuildImpLib: { + LNK_SwitchState state; + if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) { + config->build_imp_lib = (state == LNK_SwitchState_Yes); + } + } break; + case LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll: { lnk_cmd_switch_set_flag_64(obj, cmd_switch, value_strings, &config->flags, LNK_ConfigFlag_CheckUnusedDelayLoadDll); } break; + case LNK_CmdSwitch_Rad_DataDirCount: { + U64 data_dir_count = 0; + if (lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &data_dir_count, LNK_ParseU64Flag_CheckUnder32bit)) { + if (1 <= data_dir_count && data_dir_count <= PE_DataDirectoryIndex_COUNT) { + config->data_dir_count = data_dir_count; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid data directory count %llu, expected 1 through %u", data_dir_count, PE_DataDirectoryIndex_COUNT); + } + } + } break; + case LNK_CmdSwitch_Rad_Map: { lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->rad_chunk_map_name); config->rad_chunk_map = LNK_SwitchState_Yes; @@ -1819,7 +1855,39 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } break; case LNK_CmdSwitch_Rad_MemoryMapFiles: { - lnk_cmd_switch_set_flag_32(obj, cmd_switch, value_strings, &config->io_flags, LNK_IO_Flags_MemoryMapFiles); + if (value_strings.node_count == 0) { + config->io_flags &= ~LNK_IO_Flags_MemoryMapFilesReadWrite; + config->io_flags |= LNK_IO_Flags_MemoryMapFilesReadOnly; + } else if (value_strings.node_count == 1) { + String8 value = value_strings.first->string; + if (str8_matchi(value, str8_lit("no"))) { + config->io_flags &= ~(LNK_IO_Flags_MemoryMapFilesReadOnly|LNK_IO_Flags_MemoryMapFilesReadWrite); + } else if (str8_matchi(value, str8_lit("yes")) || str8_matchi(value, str8_lit("read_only"))) { + config->io_flags &= ~LNK_IO_Flags_MemoryMapFilesReadWrite; + config->io_flags |= LNK_IO_Flags_MemoryMapFilesReadOnly; + } else if (str8_matchi(value, str8_lit("read_write"))) { + config->io_flags &= ~LNK_IO_Flags_MemoryMapFilesReadOnly; + config->io_flags |= LNK_IO_Flags_MemoryMapFilesReadWrite; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "invalid parameter: \"%S\", expected NO, READ_ONLY, or READ_WRITE", value); + } + } else { + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch); + } + } break; + + case LNK_CmdSwitch_Rad_BootMode: { + if (value_strings.node_count == 1) { + if (str8_matchi(value_strings.first->string, str8_lit("linker"))) { + config->boot_mode = LNK_BootMode_Linker; + } else if (str8_matchi(value_strings.first->string, str8_lit("type_server"))) { + config->boot_mode = LNK_BootMode_TypeServer; + } else { + lnk_error_cmd_switch(LNK_Error_Boot, obj, cmd_switch, "unknown value: \"%S\".", value_strings.first->string); + } + } else { + lnk_error_cmd_switch_invalid_param_count(LNK_Error_Boot, obj, cmd_switch); + } } break; case LNK_CmdSwitch_Rad_Debug: { @@ -2049,6 +2117,9 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List case LNK_CmdSwitch_Rad_WriteTempFiles: { lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->write_temp_files); + if (config->write_temp_files == LNK_SwitchState_Yes) { + lnk_apply_write_temp_files(config->arena, config); + } } break; case LNK_CmdSwitch_Rad_TimeStamp: { @@ -2086,58 +2157,73 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; + case LNK_CmdSwitch_Rad_WorkDir: { + lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->work_dir); + } break; + case LNK_CmdSwitch_Help: { lnk_print_help(); abort_self(0); } break; + + case LNK_CmdSwitch_RadTypeServer: { + if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->type_server)) { + if (config->type_server == LNK_SwitchState_Yes) { + config->boot_mode = LNK_BootMode_TypeServer; + } + } + } break; + + case LNK_CmdSwitch_RadTypeServer_MatchObj: { + String8List value_strings_copy = str8_list_copy(config->arena, &value_strings); + str8_list_concat_in_place(&config->type_server_match_obj, &value_strings_copy); + } break; } scratch_end(scratch); } +internal void +lnk_config_pushf(LNK_Config *config, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + LNK_CmdLine cmd_line = lnk_cmd_line_from_stringfv_windows_rules(config->arena, fmt, args); + va_end(args); + + for EachNode(cmd, LNK_CmdOption, cmd_line.first_option) { + lnk_apply_cmd_option_to_config(config, cmd->string, cmd->value_strings, &(LNK_Obj){0}); + } +} + internal LNK_Config * -lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) +lnk_config_init(LNK_CmdLine cmd_line) { ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); + Temp scratch = scratch_begin(0,0); Arena *arena = arena_alloc(); LNK_Config *config = push_array(arena, LNK_Config, 1); - config->arena = arena; - config->raw_cmd_line = str8_list_copy(arena, &raw_cmd_line); - config->work_dir = get_current_path(arena); - config->build_imp_lib = 1; - config->build_exp = 1; - config->heap_reserve = MB(1); - config->heap_commit = KB(4); - config->stack_reserve = MB(1); - config->stack_commit = KB(4); - config->pdb_hash_type_names = LNK_TypeNameHashMode_None; - config->pdb_hash_type_name_length = 8; - config->data_dir_count = PE_DataDirectoryIndex_COUNT; - config->export_ht = hash_table_init(arena, max_U16/2); - config->alt_name_ht = hash_table_init(arena, 0x100); - config->include_symbol_ht = hash_table_init(arena, 0x100); - config->delay_load_ht = hash_table_init(arena, 0x100); - config->disallow_lib_ht = hash_table_init(arena, 0x100); - config->fail_if_mismatch_ht = hash_table_init(arena, 0x100); - config->whole_archive_ht = hash_table_init(arena, 0x100); + config->arena = arena; + config->raw_cmd_line = str8_list_copy(arena, &cmd_line.raw_cmd_line); + config->work_dir = get_current_path(arena); - // process command line switches - for (LNK_CmdOption *cmd = cmd_line.first_option; cmd != 0; cmd = cmd->next) { + // apply command line switches + for EachNode(cmd, LNK_CmdOption, cmd_line.first_option) { lnk_apply_cmd_option_to_config(config, cmd->string, cmd->value_strings, 0); } + // in shared thread pool mode force fixed number of workers + if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_SharedThreadPool) && + !lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers)) { + config->max_worker_count = get_system_info()->logical_processor_count; + } + // :manifest_input if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ManifestInput)) { if (config->manifest_opt == LNK_ManifestOpt_Embed) { - for (LNK_CmdOption *cmd = cmd_line.first_option; cmd != 0; cmd = cmd->next) { - LNK_CmdSwitchType cmd_switch = lnk_cmd_switch_type_from_string(cmd->string); - if (cmd_switch == LNK_CmdSwitch_ManifestInput) { - String8List manifest_list = str8_list_copy(arena, &cmd->value_strings); - str8_list_concat_in_place(&config->input_list[LNK_Input_Manifest], &manifest_list); - } - } + String8List manifest_list = lnk_cmd_line_values_from_switch(arena, cmd_line, LNK_CmdSwitch_ManifestInput); + str8_list_concat_in_place(&config->input_list[LNK_Input_Manifest], &manifest_list); } else { lnk_error_cmd_switch(LNK_Error_Cmdl, 0, LNK_CmdSwitch_ManifestInput, "missing /MANIFEST:EMBED"); } @@ -2153,9 +2239,9 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) } // input files - for (String8Node *input_node = cmd_line.input_list.first; input_node != 0; input_node = input_node->next) { + for EachNode(input_node, String8Node, cmd_line.input_list.first) { String8 path = push_str8_copy(arena, input_node->string); - String8 ext = str8_skip_last_dot(path); + String8 ext = str8_skip_last_dot(path); // map file extension to input type LNK_InputType input_type = lnk_input_type_from_string(ext); @@ -2285,57 +2371,46 @@ lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line) config->imp_lib_name = full_path_from_path(arena, config->imp_lib_name); config->manifest_name = full_path_from_path(arena, config->manifest_name); - // collect env vars - HashTable *env_vars = hash_table_init(scratch.arena, 512); + // set up env vars + HashMap env_vars = lnk_env_vars_from_process_info(scratch.arena, get_process_info(), LNK_EnvVarRule_Batch); { -#if OS_WINDOWS - ProcessInfo *process_info = get_process_info(); - for (String8Node *node = process_info->environment.first; node != 0; node = node->next) { - String8List list = str8_split_by_string_chars(scratch.arena, node->string, str8_lit("="), 0); - - String8 key = list.first->string; - String8 val = str8_zero(); - if (list.node_count == 2) { - val = list.last->string; - } else if (list.node_count > 2) { - U64 sep_idx = str8_find_needle(node->string, node->string.size, str8_lit("="), 0); - val = str8_skip(node->string, sep_idx+1); + // define linker env vars + struct { String8 key, value; } key_value_str8_table[] = { + { str8_lit("_pdb"), str8_skip_last_slash(config->pdb_name) }, + { str8_lit("_ext"), str8_skip_last_dot(config->out_path) }, + { str8_lit("_rad_pdb_path"), config->pdb_name }, + { str8_lit("_rad_rdi"), str8_skip_last_slash(config->rad_debug_name) }, + { str8_lit("_radi_rdi_path"), config->rad_debug_name }, + }; + for EachElement(i, key_value_str8_table) { + if (lnk_env_var_from_map(&env_vars, key_value_str8_table[i].key)) { + lnk_log(LNK_Log_Debug, "Env var already exists: %S\n",key_value_str8_table[i].key); } - - hash_table_push_path_string(scratch.arena, env_vars, key, val); - } -#endif - } - - // define linker env vars - hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_pdb"), str8_skip_last_slash(config->pdb_name)); - hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_ext"), str8_skip_last_dot(config->out_path)); - hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_pdb_path"), config->pdb_name); - hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_rdi"), str8_skip_last_slash(config->rad_debug_name)); - hash_table_push_path_string(scratch.arena, env_vars, str8_lit("_rad_rdi_path"), config->rad_debug_name); - - // collect LIB and LIBPATH - if (config->flags & LNK_ConfigFlag_EnvLib) { - BucketNode *lib = hash_table_search_path(env_vars, str8_lit("lib")); - if (lib) { - String8List val_list = str8_split_by_string_chars(scratch.arena, lib->v.value_string, str8_lit(";"), 0); - String8List val_list_copy = str8_list_copy(arena, &val_list); - str8_list_concat_in_place(&config->lib_dir_list, &val_list_copy); + lnk_env_var_batchf(scratch.arena, &env_vars, "%S=%S", key_value_str8_table[i].key, key_value_str8_table[i].value); } - BucketNode *lib_path = hash_table_search_path(env_vars, str8_lit("libpath")); - if (lib_path) { - String8List val_list = str8_split_by_string_chars(scratch.arena, lib->v.value_string, str8_lit(";"), 0); - String8List val_list_copy = str8_list_copy(arena, &val_list); - str8_list_concat_in_place(&config->lib_dir_list, &val_list_copy); + if (config->flags & LNK_ConfigFlag_EnvLib) { + // collect LIB and LIBPATH + struct { String8List *config_list; char *key; } key_str8_list[] = { + { &config->lib_dir_list, "lib" }, + { &config->lib_dir_list, "lib_path" }, + }; + for EachElement(i, key_str8_list) { + LNK_EnvVar *var = lnk_env_var_from_mapf(&env_vars, key_str8_list[i].key); + if (var) { + String8List value = lnk_value_list_from_env_var(arena, var); + String8List value_copy = str8_list_copy(config->arena, &value); + str8_list_concat_in_place(key_str8_list[i].config_list, &value_copy); + } + } } } // :PdbAltPath - config->pdb_alt_path = lnk_expand_env_vars_windows(arena, env_vars, config->pdb_alt_path); + config->pdb_alt_path = lnk_expand_env_vars_windows(arena, &env_vars, config->pdb_alt_path); // :Rad_DebugAltPath - config->rad_debug_alt_path = lnk_expand_env_vars_windows(arena, env_vars, config->rad_debug_alt_path); + config->rad_debug_alt_path = lnk_expand_env_vars_windows(arena, &env_vars, config->rad_debug_alt_path); // create temporary files names if (config->write_temp_files == LNK_SwitchState_Yes) { diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 2f0f34cf..90e5355f 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -3,6 +3,13 @@ #pragma once +// entry points +typedef enum +{ + LNK_BootMode_Linker, + LNK_BootMode_TypeServer, +} LNK_BootMode; + #if OS_WINDOWS # define LNK_MANIFEST_MERGE_TOOL_NAME "mt.exe" #elif OS_LINUX || OS_MAC @@ -88,13 +95,16 @@ typedef enum LNK_CmdSwitch_Version, LNK_CmdSwitch_WholeArchive, - LNK_CmdSwitch_Rad_Age, LNK_CmdSwitch_Rad_AltPchDir, + LNK_CmdSwitch_Rad_BuildExp, LNK_CmdSwitch_Rad_BuildInfo, + LNK_CmdSwitch_Rad_BuildImpLib, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, + LNK_CmdSwitch_Rad_DataDirCount, LNK_CmdSwitch_Rad_Debug, LNK_CmdSwitch_Rad_DebugAltPath, + LNK_CmdSwitch_Rad_BootMode, LNK_CmdSwitch_Rad_DebugName, LNK_CmdSwitch_Rad_DelayBind, LNK_CmdSwitch_Rad_DoMerge, @@ -110,6 +120,7 @@ typedef enum LNK_CmdSwitch_Rad_Map, LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, LNK_CmdSwitch_Rad_MemoryMapFiles, + LNK_CmdSwitch_Rad_Mode, LNK_CmdSwitch_Rad_MtPath, LNK_CmdSwitch_Rad_OsVer, LNK_CmdSwitch_Rad_PageSize, @@ -126,7 +137,12 @@ typedef enum LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, LNK_CmdSwitch_Rad_Version, LNK_CmdSwitch_Rad_Workers, + LNK_CmdSwitch_Rad_WorkDir, LNK_CmdSwitch_Rad_WriteTempFiles, + + LNK_CmdSwitch_RadTypeServer, + LNK_CmdSwitch_RadTypeServer_MatchObj, + LNK_CmdSwitch_Help, LNK_CmdSwitch_Count @@ -262,9 +278,11 @@ typedef enum LNK_TypeNameHashMode_Full, } LNK_TypeNameHashMode; + typedef struct LNK_Config { Arena *arena; + LNK_BootMode boot_mode; LNK_ConfigFlags flags; LNK_DebugMode debug_mode; B32 ghash; @@ -352,19 +370,21 @@ typedef struct LNK_Config String8 delay_load_helper_name; String8List remove_sections; LNK_IO_Flags io_flags; - HashTable *export_ht; - HashTable *alt_name_ht; - HashTable *include_symbol_ht; - HashTable *delay_load_ht; - HashTable *disallow_lib_ht; - HashTable *fail_if_mismatch_ht; - HashTable *whole_archive_ht; + HashMap export_ht; + HashMap alt_name_ht; + HashMap include_symbol_ht; + HashMap delay_load_ht; + HashMap disallow_lib_ht; + HashMap fail_if_mismatch_ht; + HashMap whole_archive_ht; B32 whole_archive_all; U64 unresolved_symbol_limit; U64 unresolved_symbol_ref_limit; LNK_SwitchState map_lines_for_unresolved_symbols; String8List alt_pch_dirs; LLVM_GHashAlg type_hash_alg; + LNK_SwitchState type_server; + String8List type_server_match_obj; } LNK_Config; // --- MSVC Error Codes -------------------------------------------------------- @@ -503,12 +523,8 @@ internal LNK_InputType lnk_input_type_from_string(String8 string); internal LNK_DebugMode lnk_debug_mode_from_string(String8 string); internal LNK_TypeNameHashMode lnk_type_name_hash_mode_from_string(String8 string); -// --- Command Line Helpers ---------------------------------------------------- - -internal LNK_CmdOption * lnk_cmd_line_push_option_if_not_presentf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...); -internal LNK_CmdOption * lnk_cmd_line_push_optionf (Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...); - -internal B32 lnk_cmd_line_has_switch(LNK_CmdLine cmd_line, LNK_CmdSwitchType cmd_switch_type); +internal String8List lnk_cmd_line_values_from_switch(Arena *arena, LNK_CmdLine cmd_line, LNK_CmdSwitchType cmd_switch_type); +internal B32 lnk_cmd_line_has_switch (LNK_CmdLine cmd_line, LNK_CmdSwitchType cmd_switch_type); // --- Errors ------------------------------------------------------------------ @@ -564,6 +580,7 @@ internal void lnk_whole_archive(LNK_Config *config, String8 lib_name); // --- Config ------------------------------------------------------------------ internal void lnk_apply_cmd_option_to_config(LNK_Config *config, String8 name, String8List value_list, struct LNK_Obj *obj); +internal void lnk_config_pushf(LNK_Config *config, char *fmt, ...); -internal LNK_Config * lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line); +internal LNK_Config * lnk_config_init(LNK_CmdLine cmd_line); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index da6ab1bd..40fa31f8 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -2461,11 +2461,15 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) } internal String8List -lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types) +lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types, LNK_PDB_BuilderFlags builder_flags) { ProfBeginFunction(); Temp scratch = scratch_begin(tp_arena->v, tp_arena->count); + if (builder_flags == LNK_PDB_BuilderFlag_All) { + builder_flags = ~0; + } + LNK_BuildPdb task = { .image_data = image_data, .symtab = symtab, @@ -2495,83 +2499,92 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config } // push types - pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_IPI], cv_types.count[CV_TypeIndexSource_IPI], cv_types.v[CV_TypeIndexSource_IPI]); - pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_TPI], cv_types.count[CV_TypeIndexSource_TPI], cv_types.v[CV_TypeIndexSource_TPI]); + if (builder_flags & LNK_PDB_BuilderFlag_Ipi) { + pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_IPI], cv_types.count[CV_TypeIndexSource_IPI], cv_types.v[CV_TypeIndexSource_IPI]); + } + if (builder_flags & LNK_PDB_BuilderFlag_Tpi) { + pdb_type_server_push_parallel(tp, task.pdb->type_servers[CV_TypeIndexSource_TPI], cv_types.count[CV_TypeIndexSource_TPI], cv_types.v[CV_TypeIndexSource_TPI]); + } ProfBegin("Merge String Tables"); task.string_ht = cv_dedup_string_tables(tp_arena, tp, cv->obj_count, cv->debug_s_arr); cv_string_hash_table_assign_buffer_offsets(tp, task.string_ht); ProfEnd(); - ProfScope ("Alloc Modules") - for EachIndex(obj_idx, cv->obj_count) { - task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, cv->obj_arr[obj_idx]->path, lnk_obj_get_lib_path(cv->obj_arr[obj_idx])); - } + if (builder_flags & LNK_PDB_BuilderFlag_Modules) { + ProfScope ("Alloc Modules") + for EachIndex(obj_idx, cv->obj_count) + task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, cv->obj_arr[obj_idx]->path, lnk_obj_get_lib_path(cv->obj_arr[obj_idx])); - ProfScope("Move Global Symbols") - tp_for_parallel(tp, 0, tp->worker_count, lnk_move_global_symbols_to_gsi, &task); + ProfScope("Move Global Symbols") + tp_for_parallel(tp, 0, tp->worker_count, lnk_move_global_symbols_to_gsi, &task); - ProfScope("Build GSI and PSI") - pdb_build_gsi_psi(tp, task.pdb); + ProfScope("Build GSI and PSI") + pdb_build_gsi_psi(tp, task.pdb); - ProfScope("Write Modules") - tp_for_parallel(tp, 0, tp->worker_count, lnk_write_pdb_modules, &task); + ProfScope("Write Modules") + tp_for_parallel(tp, 0, tp->worker_count, lnk_write_pdb_modules, &task); + } ProfBegin("Add string tables"); pdb_strtab_add_cv_string_hash_table(&task.pdb->info->strtab, task.string_ht); ProfEnd(); - ProfBegin("Build Section Contrib Map"); - { - ProfBegin("Build DBI Section Headers"); - for (U64 sect_idx = 1; sect_idx < task.image_section_table_count; sect_idx += 1) { - dbi_push_section(task.pdb->dbi, task.image_section_table[sect_idx]); + if (builder_flags & LNK_PDB_BuilderFlag_SC) { + ProfBegin("Build Section Contrib Map"); + { + ProfBegin("Build DBI Section Headers"); + for (U64 sect_idx = 1; sect_idx < task.image_section_table_count; sect_idx += 1) { + dbi_push_section(task.pdb->dbi, task.image_section_table[sect_idx]); + } + ProfEnd(); + + for EachIndex(i, task.image_section_table_count) { + COFF_SectionHeader *sect_header = task.image_section_table[i]; + if (~sect_header->flags & COFF_SectionFlag_CntUninitializedData) { + task.image_section_file_ranges.v[task.image_section_file_ranges.count++] = rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize); + } + task.image_section_virt_ranges.v[i] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize); + } + + task.sc_list = push_array(scratch.arena, PDB_DbiSectionContribList, cv->obj_count); + tp_for_parallel(tp, tp_arena, cv->obj_count, lnk_push_dbi_sec_contrib_task, &task); + dbi_sec_list_concat_arr(&task.pdb->dbi->sec_contrib_list, cv->obj_count, task.sc_list); } ProfEnd(); - - for EachIndex(i, task.image_section_table_count) { - COFF_SectionHeader *sect_header = task.image_section_table[i]; - if (~sect_header->flags & COFF_SectionFlag_CntUninitializedData) { - task.image_section_file_ranges.v[task.image_section_file_ranges.count++] = rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize); - } - task.image_section_virt_ranges.v[i] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize); - } - - task.sc_list = push_array(scratch.arena, PDB_DbiSectionContribList, cv->obj_count); - tp_for_parallel(tp, tp_arena, cv->obj_count, lnk_push_dbi_sec_contrib_task, &task); - dbi_sec_list_concat_arr(&task.pdb->dbi->sec_contrib_list, cv->obj_count, task.sc_list); } - ProfEnd(); - ProfBegin("Build NatVis"); - { - String8Array natvis_file_path_arr = str8_array_from_list(scratch.arena, &config->natvis_list); - String8Array natvis_file_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, config->io_flags, natvis_file_path_arr); + if (builder_flags & LNK_PDB_BuilderFlag_NATVIS) { + ProfBegin("Build NatVis"); + { + String8Array natvis_file_path_arr = str8_array_from_list(scratch.arena, &config->natvis_list); + String8Array natvis_file_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, config->io_flags, natvis_file_path_arr); - for EachIndex(i, natvis_file_data_arr.count) { - String8 natvis_file_path = natvis_file_path_arr.v[i]; - String8 natvis_file_data = natvis_file_data_arr.v[i]; + for EachIndex(i, natvis_file_data_arr.count) { + String8 natvis_file_path = natvis_file_path_arr.v[i]; + String8 natvis_file_data = natvis_file_data_arr.v[i]; - // did we read the file? - if (natvis_file_data.size == 0) { - lnk_error(LNK_Warning_FileNotFound, "unable to open natvis file \"%S\"", natvis_file_path); - continue; - } + // did we read the file? + if (natvis_file_data.size == 0) { + lnk_error(LNK_Warning_FileNotFound, "unable to open natvis file \"%S\"", natvis_file_path); + continue; + } - // sanity check file extension or VS wont load NatVis - String8 ext = str8_skip_last_dot(natvis_file_path); - if (!str8_match(ext, str8_lit("natvis"), StringMatchFlag_CaseInsensitive)) { - lnk_error(LNK_Warning_Natvis, "Visual Studio expects .natvis extension: \"%S\"", natvis_file_path); - } + // sanity check file extension or VS wont load NatVis + String8 ext = str8_skip_last_dot(natvis_file_path); + if (!str8_match(ext, str8_lit("natvis"), StringMatchFlag_CaseInsensitive)) { + lnk_error(LNK_Warning_Natvis, "Visual Studio expects .natvis extension: \"%S\"", natvis_file_path); + } - // add natvis to PDB - PDB_SrcError error = pdb_add_src(task.pdb->info, task.pdb->msf, natvis_file_path, natvis_file_data, PDB_SrcComp_NULL); - if (error != PDB_SrcError_OK) { - lnk_error(LNK_Error_Natvis, "%S", pdb_string_from_src_error(error)); + // add natvis to PDB + PDB_SrcError error = pdb_add_src(task.pdb->info, task.pdb->msf, natvis_file_path, natvis_file_data, PDB_SrcComp_NULL); + if (error != PDB_SrcError_OK) { + lnk_error(LNK_Error_Natvis, "%S", pdb_string_from_src_error(error)); + } } } + ProfEnd(); } - ProfEnd(); pdb_build(tp, tp_arena, task.pdb, task.string_ht, 0, cv->is_stripped); diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index d93c66eb..5a16f986 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -130,6 +130,16 @@ typedef struct //////////////////////////////// // PDB +typedef enum +{ + LNK_PDB_BuilderFlag_All = 0, + LNK_PDB_BuilderFlag_Tpi = (1<<0), + LNK_PDB_BuilderFlag_Ipi = (1<<1), + LNK_PDB_BuilderFlag_Modules = (1<<2), + LNK_PDB_BuilderFlag_SC = (1<<4), + LNK_PDB_BuilderFlag_NATVIS = (1<<5), +} LNK_PDB_BuilderFlags; + typedef struct { String8 image_data; @@ -180,5 +190,5 @@ internal void lnk_replace_type_names_with_hashes (TP_Context *tp, TP //////////////////////////////// // PDB -internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types); +internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types, LNK_PDB_BuilderFlags builder_flags); diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index 20e180c0..499ba728 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -215,19 +215,36 @@ THREAD_POOL_TASK_FUNC(lnk_memory_map_file_task) Temp scratch = scratch_begin(&arena, 1); #if OS_WINDOWS String16 path16 = str16_from_8(scratch.arena, task->path_arr.v[task_id]); - HANDLE file_handle = CreateFileW(path16.str, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if (file_handle != INVALID_HANDLE_VALUE) { - HANDLE mapping_handle = CreateFileMappingA(file_handle, 0, PAGE_WRITECOPY, 0, 0, 0); - if (mapping_handle != INVALID_HANDLE_VALUE) { - LARGE_INTEGER file_size = {0}; - GetFileSizeEx(file_handle, &file_size); - void *file_data = MapViewOfFile(mapping_handle, FILE_MAP_COPY, 0, 0, file_size.QuadPart); - if (file_data) { - task->data_arr.v[task_id] = str8(file_data, file_size.QuadPart); + if (task->io_flags & LNK_IO_Flags_MemoryMapFilesReadWrite) { + HANDLE file_handle = CreateFileW(path16.str, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (file_handle != INVALID_HANDLE_VALUE) { + HANDLE mapping_handle = CreateFileMappingA(file_handle, 0, PAGE_READWRITE, 0, 0, 0); + if (mapping_handle != INVALID_HANDLE_VALUE) { + LARGE_INTEGER file_size = {0}; + GetFileSizeEx(file_handle, &file_size); + void *file_data = MapViewOfFile(mapping_handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, file_size.QuadPart); + if (file_data) { + task->data_arr.v[task_id] = str8(file_data, file_size.QuadPart); + } + CloseHandle(mapping_handle); } - CloseHandle(mapping_handle); + CloseHandle(file_handle); + } + } else { + HANDLE file_handle = CreateFileW(path16.str, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (file_handle != INVALID_HANDLE_VALUE) { + HANDLE mapping_handle = CreateFileMappingA(file_handle, 0, PAGE_WRITECOPY, 0, 0, 0); + if (mapping_handle != INVALID_HANDLE_VALUE) { + LARGE_INTEGER file_size = {0}; + GetFileSizeEx(file_handle, &file_size); + void *file_data = MapViewOfFile(mapping_handle, FILE_MAP_COPY, 0, 0, file_size.QuadPart); + if (file_data) { + task->data_arr.v[task_id] = str8(file_data, file_size.QuadPart); + } + CloseHandle(mapping_handle); + } + CloseHandle(file_handle); } - CloseHandle(file_handle); } #elif OS_LINUX int fd = open((char *)push_cstr(scratch.arena, task->path_arr.v[task_id]).str, O_RDONLY); @@ -253,7 +270,7 @@ lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, LNK_IO_Flags ProfBeginFunction(); LNK_DiskReader reader = {0}; - if (io_flags & LNK_IO_Flags_MemoryMapFiles) { + if (io_flags & (LNK_IO_Flags_MemoryMapFilesReadWrite|LNK_IO_Flags_MemoryMapFilesReadOnly)) { reader.io_flags = io_flags; reader.path_arr = path_arr; reader.data_arr.count = path_arr.count; diff --git a/src/linker/lnk_io.h b/src/linker/lnk_io.h index 3aff6fe9..ffa35a62 100644 --- a/src/linker/lnk_io.h +++ b/src/linker/lnk_io.h @@ -3,7 +3,8 @@ typedef U32 LNK_IO_Flags; enum { - LNK_IO_Flags_MemoryMapFiles = (1 << 0), + LNK_IO_Flags_MemoryMapFilesReadOnly = (1 << 0), + LNK_IO_Flags_MemoryMapFilesReadWrite = (1 << 1), }; typedef struct diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index dc94d47f..9890037c 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -55,6 +55,7 @@ typedef enum LNK_Error_AlternateNameConflict, LNK_Error_RelocationAgainstRemovedSection, LNK_Error_FailIfMismatch, + LNK_Error_Boot, LNK_Error_StopLast, LNK_Error_ContinueFirst, @@ -160,7 +161,7 @@ internal LNK_LogType lnk_log_type_from_string(String8 string); internal LNK_ErrorCodeStatus lnk_get_error_code_status(LNK_ErrorCode code); internal void lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...); -#define lnk_invalid_path(...) lnk_internal_error(LNK_InternalError_InvalidPath, __FILE__, __LINE__, __VA_ARGS__) -#define lnk_not_implemented(...) lnk_internal_error(LNK_InternalError_NotImplemented, __FILE__, __LINE__, __VA_ARGS__) -#define lnk_incomplete_switch(...) lnk_internal_error(LNK_InternalError_IncompleteSwitch, __FILE__, __LINE__, __VA_ARGS__) +#define lnk_invalid_path(...) lnk_internal_error(LNK_InternalError_InvalidPath, __FILE__, __LINE__, ## __VA_ARGS__) +#define lnk_not_implemented(...) lnk_internal_error(LNK_InternalError_NotImplemented, __FILE__, __LINE__, ## __VA_ARGS__) +#define lnk_incomplete_switch(...) lnk_internal_error(LNK_InternalError_IncompleteSwitch, __FILE__, __LINE__, ## __VA_ARGS__) diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 220af7f3..99760eb0 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -338,26 +338,51 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) obj->associated_sections = associated_sections; obj->self = &task->objs[task_id]; obj->link_member = input->link_member; + obj->debug_t_sect_idx = ~0; + obj->debug_p_sect_idx = ~0; + obj->debug_h_sect_idx = ~0; +} + +internal +THREAD_POOL_TASK_FUNC(lnk_obj_find_debug_t) +{ + LNK_Obj *obj = &((LNK_ObjNode *)raw_task)[task_id].data; + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + for EachIndex(sect_idx, obj->header.section_count_no_null) { + COFF_SectionHeader *sect_header = §ion_table[sect_idx]; + String8 sect_name = coff_name_from_section_header(str8_zero(), sect_header); + if (str8_match(sect_name, str8_lit(".debug$T"), 0)) { + obj->debug_t_sect_idx = sect_idx; + } else if (str8_match(sect_name, str8_lit(".debug$P"), 0)) { + obj->debug_p_sect_idx = sect_idx; + } else if (str8_match(sect_name, str8_lit(".debug$H"), 0)) { + obj->debug_h_sect_idx = sect_idx; + } + } } internal LNK_ObjNode * -lnk_obj_from_input_many(TP_Context *tp, TP_Arena *arena, COFF_MachineType machine, U64 inputs_count, LNK_Input **inputs) +lnk_obj_from_input_many(TP_Context *tp, TP_Arena *arena, LNK_Config *config, U64 inputs_count, LNK_Input **inputs) { LNK_ObjNode *objs = 0; if (inputs_count) { objs = push_array(arena->v[0], LNK_ObjNode, inputs_count); - tp_for_parallel(tp, arena, inputs_count, lnk_obj_initer, &(LNK_ObjIniter){ .inputs = inputs, .objs = objs, .machine = machine }); + tp_for_parallel(tp, arena, inputs_count, lnk_obj_initer, &(LNK_ObjIniter){ .inputs = inputs, .objs = objs, .machine = config->machine }); + + if (lnk_do_debug_info(config)) { + tp_for_parallel(tp, arena, inputs_count, lnk_obj_find_debug_t, objs); + } } return objs; } internal LNK_ObjNode * -lnk_obj_from_input(Arena *arena, COFF_MachineType machine, LNK_Input *input) +lnk_obj_from_input(Arena *arena, LNK_Config *config, LNK_Input *input) { Temp scratch = scratch_begin(&arena, 1); TP_Context *tp = tp_alloc(scratch.arena, 1, 1, str8_zero()); TP_Arena tp_arena = { .count = 1, .v = &arena }; - LNK_ObjNode *result = lnk_obj_from_input_many(tp, &tp_arena, machine, 1, &input); + LNK_ObjNode *result = lnk_obj_from_input_many(tp, &tp_arena, config, 1, &input); scratch_end(scratch); return result; } diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h index b852bce7..84248631 100644 --- a/src/linker/lnk_obj.h +++ b/src/linker/lnk_obj.h @@ -9,6 +9,9 @@ typedef struct LNK_Obj { String8 path; String8 data; + U32 debug_t_sect_idx; + U32 debug_p_sect_idx; + U32 debug_h_sect_idx; U32 input_idx; COFF_FileHeaderInfo header; U32 *comdats; diff --git a/src/linker/tests/linker_tests.c b/src/linker/tests/linker_tests.c index 0b0e5e0d..90e7bb37 100644 --- a/src/linker/tests/linker_tests.c +++ b/src/linker/tests/linker_tests.c @@ -5583,9 +5583,8 @@ TEST(cyclic_type) String8 output = g_errors; B32 is_cycle_detected = 0; while (output.size && !is_cycle_detected) { - is_cycle_detected = t_match_linef(&output, - "Error(043): %S: LF_POINTER(type_index: 0x1000) forward refs member type index 0x1001 (leaf struct offset: 0x0)", - t_make_file_path(arena, str8_lit("cycle.obj"))); + String8 line = str8_chop_line(&output); + is_cycle_detected = str8_match_wildcard(line, str8_lit("Error(*): *: LF_POINTER(type_index: *) forward refs member type index * (leaf struct offset: *)"), StringMatchFlag_CaseInsensitive); t_chop_line(&output); } T_Ok(is_cycle_detected); From d73ce364b94f0901104bd99a0f274b6709e55b8d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 11:20:49 -0700 Subject: [PATCH 719/850] major clean-up pass over unwinding/module-info abstraction, + usage in the debug engine. simplified / cleaned up DWARF helpers for unwind info & expressions. decoupling unwinding / DWARF evaluation from memory read callbacks. light module info now prepared by demon layer - debug engine no longer duplicates per-backend parsing. unwind abstraction layer now does thin abstraction over unwinding backends, debug engine only calls abstraction. clean up demon to have fewer ad-hoc 'queries' on handles, and prefer sending info over debug events when possible / when it fits the usage pattern. move DWARF enum specifications to metacode, generate enums/xlists/tables/etc. decouple raddbg/radbin completely from old parsing helpers. replace portion of DWARF dumping; pull out some new parsing helpers from converter / dumper. --- project.4coder | 2 +- project.raddbg | 13 +- src/arch/arch.c | 2 +- src/arch/arch.h | 2 +- src/artifact_cache/artifact_cache.c | 47 +- src/artifact_cache/artifact_cache.h | 19 +- src/base/base_inc.c | 1 + src/base/base_inc.h | 1 + src/base/base_memory.h | 6 - src/base/base_memory_map.c | 36 + src/base/base_memory_map.h | 38 + src/base/base_shared_memory.h | 8 +- src/base/base_strings.c | 99 +- src/base/base_strings.h | 6 +- src/dbg_engine/dbg_engine_core.c | 12 +- src/dbg_engine/dbg_engine_core.h | 1 + src/dbg_engine/dbg_engine_ctrl.c | 446 ++-- src/dbg_engine/dbg_engine_ctrl.h | 70 +- src/demon/demon_core.h | 7 +- src/dwarf/dwarf.c | 1212 ++++------- src/dwarf/dwarf.h | 1852 +---------------- src/dwarf/dwarf.mdesk | 1354 +++++++++++- src/dwarf/dwarf_coff.c | 62 - src/dwarf/dwarf_dump.c | 8 +- src/dwarf/dwarf_dump_2.c | 718 +++++++ src/dwarf/dwarf_dump_2.h | 17 + src/dwarf/dwarf_expr.c | 108 - src/dwarf/dwarf_expr.h | 3 - src/dwarf/dwarf_expr_2.c | 393 ++++ src/dwarf/dwarf_expr_2.h | 66 + src/dwarf/dwarf_help.c | 66 - src/dwarf/dwarf_help.h | 18 - src/dwarf/dwarf_inc.c | 28 +- src/dwarf/dwarf_inc.h | 28 +- src/dwarf/dwarf_notes.txt | 42 - src/dwarf/dwarf_parse.c | 14 +- src/dwarf/dwarf_parse.h | 18 - src/dwarf/dwarf_parse_2.c | 733 +++++-- src/dwarf/dwarf_parse_2.h | 179 +- src/dwarf/dwarf_parse_coff.c | 45 + .../{dwarf_coff.h => dwarf_parse_coff.h} | 6 +- src/dwarf/{dwarf_elf.c => dwarf_parse_elf.c} | 17 +- src/dwarf/{dwarf_elf.h => dwarf_parse_elf.h} | 8 +- src/dwarf/dwarf_unwind_2.c | 2 + src/dwarf/dwarf_unwind_2.h | 44 + src/dwarf/dwarf_writer.c | 232 ++- src/dwarf/dwarf_writer.h | 20 + src/dwarf/eh_dump.c | 141 -- src/dwarf/eh_frame.c | 470 ----- src/dwarf/generated/dwarf.meta.c | 69 + src/dwarf/generated/dwarf.meta.h | 1713 ++++++++++++++- src/dwarf/tests/dwarf_tests.c | 84 +- src/eh_frame/eh_frame.c | 650 ++++++ src/{dwarf => eh_frame}/eh_frame.h | 18 +- src/eh_frame/eh_frame_dump.c | 152 ++ .../eh_dump.h => eh_frame/eh_frame_dump.h} | 4 +- src/eh_frame/unwind/eh_frame_unwind.c | 696 +++++++ src/eh_frame/unwind/eh_frame_unwind.h | 22 + src/linux/base/linux_base.c | 2 +- src/linux/demon/linux_demon.c | 102 +- src/linux/demon/linux_demon.h | 2 + .../window_manager/linux_window_manager.c | 402 ++-- src/metagen/metagen_main.c | 18 +- src/pe/x64/unwind/pe_x64_unwind.c | 936 +++++++++ src/pe/x64/unwind/pe_x64_unwind.h | 28 + src/radbin/radbin.c | 11 +- src/radbin/radbin_main.c | 16 +- src/raddbg/raddbg_core.c | 11 +- src/raddbg/raddbg_main.c | 6 + src/raddbg/tests/raddbg_tests.c | 4 +- src/rdi/rdi_local.c | 1 + src/rdi_from_dwarf/rdi_from_dwarf.c | 14 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 496 +---- .../tests/rdi_from_dwarf_tests.c | 56 +- src/torture/torture_main.c | 8 +- src/unwind/generated/unwind.meta.c | 5 + src/unwind/generated/unwind.meta.h | 21 + src/unwind/unwind.c | 24 + src/unwind/unwind.h | 45 + src/unwind/unwind.mdesk | 21 + src/unwind/unwind_inc.c | 10 + src/unwind/unwind_inc.h | 15 + src/win32/base/win32_base.c | 4 +- src/win32/demon/win32_demon.c | 173 +- src/win32/demon/win32_demon.h | 3 + .../window_manager/win32_window_manager.c | 20 +- src/window_manager/window_manager.h | 20 +- src/window_manager/window_manager_stub.c | 20 +- 88 files changed, 9899 insertions(+), 4723 deletions(-) create mode 100644 src/base/base_memory_map.c create mode 100644 src/base/base_memory_map.h delete mode 100644 src/dwarf/dwarf_coff.c create mode 100644 src/dwarf/dwarf_dump_2.c create mode 100644 src/dwarf/dwarf_dump_2.h create mode 100644 src/dwarf/dwarf_expr_2.c create mode 100644 src/dwarf/dwarf_expr_2.h delete mode 100644 src/dwarf/dwarf_help.c delete mode 100644 src/dwarf/dwarf_help.h delete mode 100644 src/dwarf/dwarf_notes.txt create mode 100644 src/dwarf/dwarf_parse_coff.c rename src/dwarf/{dwarf_coff.h => dwarf_parse_coff.h} (82%) rename src/dwarf/{dwarf_elf.c => dwarf_parse_elf.c} (87%) rename src/dwarf/{dwarf_elf.h => dwarf_parse_elf.h} (53%) create mode 100644 src/dwarf/dwarf_unwind_2.c create mode 100644 src/dwarf/dwarf_unwind_2.h delete mode 100644 src/dwarf/eh_dump.c delete mode 100644 src/dwarf/eh_frame.c create mode 100644 src/eh_frame/eh_frame.c rename src/{dwarf => eh_frame}/eh_frame.h (85%) create mode 100644 src/eh_frame/eh_frame_dump.c rename src/{dwarf/eh_dump.h => eh_frame/eh_frame_dump.h} (92%) create mode 100644 src/eh_frame/unwind/eh_frame_unwind.c create mode 100644 src/eh_frame/unwind/eh_frame_unwind.h create mode 100644 src/pe/x64/unwind/pe_x64_unwind.c create mode 100644 src/pe/x64/unwind/pe_x64_unwind.h create mode 100644 src/unwind/generated/unwind.meta.c create mode 100644 src/unwind/generated/unwind.meta.h create mode 100644 src/unwind/unwind.c create mode 100644 src/unwind/unwind.h create mode 100644 src/unwind/unwind.mdesk create mode 100644 src/unwind/unwind_inc.c create mode 100644 src/unwind/unwind_inc.h diff --git a/project.4coder b/project.4coder index 14cc2147..2f198477 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 59545fc2..d0bef4ce 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,7 +7,6 @@ target: working_directory: build arguments: "--user:raddbg_test.user --project:raddbg_test.project" debug_subprocesses: 0 - enabled: 1 } target: { @@ -19,6 +18,7 @@ target: { executable: "build/mule_main.exe" working_directory: build + enabled: 1 } target: { @@ -44,3 +44,14 @@ target: working_directory: build arguments: "rdi_from_pdb/* --gui" } +target: +{ + executable: "build/metagen.exe" + working_directory: build +} +target: +{ + executable: "build/radbin.exe" + working_directory: build + arguments: "--rdi raddbg" +} diff --git a/src/arch/arch.c b/src/arch/arch.c index f8521b21..25e07963 100644 --- a/src/arch/arch.c +++ b/src/arch/arch.c @@ -69,7 +69,7 @@ arch_reg_code_from_rdi(Arch arch, RDI_RegCode code) } internal ARCH_RegCode -arch_reg_code_from_dw(Arch arch, DW_Reg code) +arch_reg_code_from_dw(Arch arch, DW_RegCode code) { ARCH_RegCode result = 0; { diff --git a/src/arch/arch.h b/src/arch/arch.h index fa1b1e64..dbdb1b28 100644 --- a/src/arch/arch.h +++ b/src/arch/arch.h @@ -38,7 +38,7 @@ global read_only ARCH_Info arch_info_nil = {0, 0, 0, 0, {0}, &arch_reg_code_rng_ internal ARCH_Info *arch_info_from_arch(Arch arch); internal ARCH_RegCode arch_reg_code_from_name(ARCH_Info *arch_info, String8 name); internal ARCH_RegCode arch_reg_code_from_rdi(Arch arch, RDI_RegCode code); -internal ARCH_RegCode arch_reg_code_from_dw(Arch arch, DW_Reg code); +internal ARCH_RegCode arch_reg_code_from_dw(Arch arch, DW_RegCode code); internal B32 arch_reg_block_read_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *dst); internal B32 arch_reg_block_write_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *src); internal U64 arch_ip_from_reg_block(ARCH_Info *arch_info, void *block); diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 7ba72310..54db8c31 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -58,6 +58,7 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 cache->slots_count = Max(256, params->slots_count); cache->slots = push_array(cache_stripe->arena, AC_Slot, cache->slots_count); cache->stripes = stripe_array_alloc(cache_stripe->arena); + cache->stripe_free_node_ptrs = push_array(cache_stripe->arena, AC_NodePtr *, cache->stripes.count); } } if(cache != 0) @@ -73,6 +74,9 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 AC_Slot *slot = &cache->slots[slot_idx]; Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); + //- rjf: unpack thread context + B32 is_node_work_active = (ac_tctx != 0); + //- rjf: cache * key -> existing artifact B32 artifact_is_stale = 1; B32 got_artifact = 0; @@ -92,11 +96,16 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 artifact_is_stale = is_stale; artifact = n->val; access_touch(access, &n->access_pt, stripe->cv); + ins_atomic_u64_eval_assign(&n->last_touched_ac_request_gen, ins_atomic_u64_eval(&ac_shared->request_gen)); } if(is_stale) { B32 got_task = (ins_atomic_u64_eval_cond_assign(&n->working_count, 1, 0) == 0); need_request = got_task; + if(is_node_work_active) + { + ins_atomic_u32_eval_assign(&n->other_nodes_depend_on_me, 1); + } } break; } @@ -140,6 +149,10 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 node->key = str8_copy(stripe->arena, key); node->working_count = 1; node->evict_threshold_us = params->evict_threshold_us; + if(is_node_work_active) + { + node->other_nodes_depend_on_me = 1; + } } node->access_pt.last_time_touched_us = now_time_us(); node->access_pt.last_update_idx_touched = update_tick_idx(); @@ -181,6 +194,7 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 artifact_is_stale = (node->last_completed_gen == params->gen); artifact = node->val; access_touch(access, &node->access_pt, stripe->cv); + ins_atomic_u64_eval_assign(&node->last_touched_ac_request_gen, ins_atomic_u64_eval(&ac_shared->request_gen)); } // rjf: abort if needed @@ -243,7 +257,9 @@ ac_async_tick(void) for(AC_Node *n = slot->first, *next = 0; n != 0; n = next) { next = n->next; - if(access_pt_is_expired(&n->access_pt, .time = n->evict_threshold_us) && ins_atomic_u64_eval(&n->working_count) == 0) + if(access_pt_is_expired(&n->access_pt, .time = n->evict_threshold_us) && + ins_atomic_u64_eval(&n->working_count) == 0 && + (ins_atomic_u32_eval(&n->other_nodes_depend_on_me) == 0 || ac_shared->request_gen > n->last_touched_ac_request_gen)) { slot_has_work = 1; if(!write_mode) @@ -327,6 +343,11 @@ ac_async_tick(void) lane_sync_u64(&tasks_count, 0); lane_sync(); + ////////////////////////////// + //- rjf: set up artifact cache thread context + // + ac_tctx = push_array(scratch.arena, AC_TCTX, 1); + ////////////////////////////// //- rjf: do all requests // @@ -610,6 +631,30 @@ ac_async_tick(void) } lane_sync(); + ////////////////////////////// + //- rjf: increment the request gen, only if all requests are empty + // + if(lane_idx() == 0) + { + B32 have_live_requests = 0; + for EachElement(idx, ac_shared->req_batches) + { + MutexScope(ac_shared->req_batches[idx].mutex) + { + have_live_requests = (ac_shared->req_batches[idx].wide_count != 0 || ac_shared->req_batches[idx].thin_count != 0); + } + } + if(!have_live_requests) + { + ac_shared->request_gen += 1; + } + } + + ////////////////////////////// + //- rjf: reset thread context + // + ac_tctx = 0; + ////////////////////////////// //- rjf: disable cancellation scanning // diff --git a/src/artifact_cache/artifact_cache.h b/src/artifact_cache/artifact_cache.h index 04953201..2bd082bb 100644 --- a/src/artifact_cache/artifact_cache.h +++ b/src/artifact_cache/artifact_cache.h @@ -59,6 +59,13 @@ struct AC_RequestNode AC_Request v; }; +typedef struct AC_NodePtr AC_NodePtr; +struct AC_NodePtr +{ + AC_NodePtr *next; + struct AC_Node *node; +}; + typedef struct AC_Node AC_Node; struct AC_Node { @@ -76,8 +83,9 @@ struct AC_Node U64 working_count; U64 completion_count; U64 evict_threshold_us; + U64 last_touched_ac_request_gen; B32 cancelled; - U64 _unused_; + B32 other_nodes_depend_on_me; }; typedef struct AC_Slot AC_Slot; @@ -99,6 +107,7 @@ struct AC_Cache U64 slots_count; AC_Slot *slots; StripeArray stripes; + AC_NodePtr **stripe_free_node_ptrs; }; typedef struct AC_RequestBatch AC_RequestBatch; @@ -114,10 +123,17 @@ struct AC_RequestBatch U64 thin_count; }; +typedef struct AC_TCTX AC_TCTX; +struct AC_TCTX +{ + U64 _unused_; +}; + typedef struct AC_Shared AC_Shared; struct AC_Shared { Arena *arena; + U64 request_gen; // rjf: cache cache U64 cache_slots_count; @@ -136,6 +152,7 @@ struct AC_Shared //~ rjf: Globals global AC_Shared *ac_shared = 0; +thread_static AC_TCTX *ac_tctx = 0; //////////////////////////////// //~ rjf: Layer Initialization diff --git a/src/base/base_inc.c b/src/base/base_inc.c index ab242f81..90467069 100644 --- a/src/base/base_inc.c +++ b/src/base/base_inc.c @@ -13,6 +13,7 @@ #include "base_arena.c" #include "base_math.c" #include "base_strings.c" +#include "base_memory_map.c" #include "base_hash.c" #include "base_system.c" #include "base_threads.c" diff --git a/src/base/base_inc.h b/src/base/base_inc.h index bc8d568d..3a378ec0 100644 --- a/src/base/base_inc.h +++ b/src/base/base_inc.h @@ -15,6 +15,7 @@ #include "base_arena.h" #include "base_math.h" #include "base_strings.h" +#include "base_memory_map.h" #include "base_hash.h" #include "base_system.h" #include "base_threads.h" diff --git a/src/base/base_memory.h b/src/base/base_memory.h index e6f58271..e73c7afd 100644 --- a/src/base/base_memory.h +++ b/src/base/base_memory.h @@ -4,12 +4,6 @@ #ifndef BASE_MEMORY_H #define BASE_MEMORY_H -typedef struct SharedMemory SharedMemory; -struct SharedMemory -{ - U64 u64[1]; -}; - //////////////////////////////// //~ rjf: @per_os_impl Platform Memory Allocation diff --git a/src/base/base_memory_map.c b/src/base/base_memory_map.c new file mode 100644 index 00000000..23e37ea7 --- /dev/null +++ b/src/base/base_memory_map.c @@ -0,0 +1,36 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Memory Map Functions + +internal void +memory_map_push(Arena *arena, MemoryMap *map, Rng1U64 vaddr_range, void *data) +{ + MemoryMapRangeNode *n = push_array(arena, MemoryMapRangeNode, 1); + n->v.vaddr_range = vaddr_range; + n->v.base = data; + SLLQueuePush(map->first_range, map->last_range, n); +} + +internal U64 +memory_map_read(MemoryMap *map, Rng1U64 range, void *dst) +{ + U64 dst_vaddr = range.min; + { + for(MemoryMapRangeNode *n = map->first_range; n != 0; n = n->next) + { + if(contains_1u64(n->v.vaddr_range, dst_vaddr)) + { + U64 src_off = dst_vaddr - n->v.vaddr_range.min; + U64 num_bytes_possible = n->v.vaddr_range.max - dst_vaddr; + U64 num_bytes_needed = range.max - dst_vaddr; + U64 num_bytes_to_read = Min(num_bytes_needed, num_bytes_possible); + MemoryCopy((U8 *)dst + (dst_vaddr - range.min), (U8 *)n->v.base + src_off, num_bytes_to_read); + dst_vaddr += num_bytes_to_read; + } + } + } + U64 bytes_read = (dst_vaddr - range.min); + return bytes_read; +} diff --git a/src/base/base_memory_map.h b/src/base/base_memory_map.h new file mode 100644 index 00000000..40a5e4fd --- /dev/null +++ b/src/base/base_memory_map.h @@ -0,0 +1,38 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_MEMORY_MAP_H +#define BASE_MEMORY_MAP_H + +//////////////////////////////// +//~ rjf: Memory Map Types + +typedef struct MemoryMapRange MemoryMapRange; +struct MemoryMapRange +{ + Rng1U64 vaddr_range; + void *base; +}; + +typedef struct MemoryMapRangeNode MemoryMapRangeNode; +struct MemoryMapRangeNode +{ + MemoryMapRangeNode *next; + MemoryMapRange v; +}; + +typedef struct MemoryMap MemoryMap; +struct MemoryMap +{ + MemoryMapRangeNode *first_range; + MemoryMapRangeNode *last_range; +}; + +//////////////////////////////// +//~ rjf: Memory Map Functions + +internal void memory_map_push(Arena *arena, MemoryMap *map, Rng1U64 vaddr_range, void *data); +internal U64 memory_map_read(MemoryMap *map, Rng1U64 range, void *dst); +#define memory_map_read_struct(map, vaddr, ptr) memory_map_read((map), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) + +#endif // BASE_MEMORY_MAP_H diff --git a/src/base/base_shared_memory.h b/src/base/base_shared_memory.h index 7d9f1498..ec288d86 100644 --- a/src/base/base_shared_memory.h +++ b/src/base/base_shared_memory.h @@ -4,8 +4,14 @@ #ifndef BASE_SHARED_MEMORY_H #define BASE_SHARED_MEMORY_H +typedef struct SharedMemory SharedMemory; +struct SharedMemory +{ + U64 u64[1]; +}; + //////////////////////////////// -//~ rjf: @os_hooks Shared Memory +//~ rjf: @per_os_impl Shared Memory internal SharedMemory shared_memory_alloc(U64 size, String8 name); internal SharedMemory shared_memory_open(String8 name); diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 5373f087..8825d479 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1476,7 +1476,7 @@ str8_from_version(Arena *arena, U64 version) //~ rjf: String Path Helpers internal String8 -default_exe_name_suffix_from_os(OperatingSystem os) +program_ext_postfix_from_os(OperatingSystem os, B32 require_ext) { String8 result = {0}; switch(os) @@ -1486,36 +1486,15 @@ default_exe_name_suffix_from_os(OperatingSystem os) { result = s(".exe"); }break; - } - return result; -} - -internal String8 -program_data_folder_prefix_from_os(OperatingSystem os) -{ - String8 result = {0}; - switch(os) - { - default:{}break; case OperatingSystem_Linux: - case OperatingSystem_Mac: + if(require_ext) { - result = s("."); + result = s(".elf"); }break; - } - return result; -} - -internal String8 -program_ext_postfix_from_os(OperatingSystem os) -{ - String8 result = {0}; - switch(os) - { - default:{}break; - case OperatingSystem_Windows: + case OperatingSystem_Mac: + if(require_ext) { - result = s(".exe"); + result = s(".macho"); }break; } return result; @@ -3038,6 +3017,72 @@ str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out) return block_out->size; } +internal U64 +str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) +{ + U64 value = 0; + U64 shift = 0; + U64 cursor = off; + for(;;) + { + U8 byte = 0; + U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); + if(bytes_read != sizeof(byte)) + { + break; + } + U8 val = byte & 0x7fu; + value |= ((U64)val) << shift; + cursor += bytes_read; + shift += 7u; + if((byte & 0x80u) == 0) + { + break; + } + } + if(value_out != 0) + { + *value_out = value; + } + U64 bytes_read = cursor - off; + return bytes_read; +} + +internal U64 +str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) +{ + U64 value = 0; + U64 shift = 0; + U64 cursor = off; + for(;;) + { + U8 byte; + U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); + if(bytes_read != sizeof(byte)) + { + break; + } + U8 val = byte & 0x7fu; + value |= ((U64)val) << shift; + cursor += bytes_read; + shift += 7u; + if((byte & 0x80u) == 0) + { + if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) + { + value |= -(S64)(1ull << shift); + } + break; + } + } + if(value_out != 0) + { + *value_out = value; + } + U64 bytes_read = cursor - off; + return bytes_read; +} + //////////////////////////////// internal int diff --git a/src/base/base_strings.h b/src/base/base_strings.h index dadcf5ac..6c1796a0 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -323,9 +323,7 @@ g_path_style_map[] = { str8_lit_comp("system"), PathStyle_SystemAbsolute }, }; -internal String8 default_exe_name_suffix_from_os(OperatingSystem os); -internal String8 program_data_folder_prefix_from_os(OperatingSystem os); -internal String8 program_ext_postfix_from_os(OperatingSystem os); +internal String8 program_ext_postfix_from_os(OperatingSystem os, B32 require_ext); internal String8 str8_chop_last_slash(String8 string); internal String8 str8_skip_last_slash(String8 string); @@ -457,6 +455,8 @@ internal U64 str8_deserial_read_windows_utf16_string16(String8 string, U64 of internal U64 str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out); #define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr))) #define str8_deserial_read_struct(string, off, ptr) str8_deserial_read_array(string, off, ptr, 1) +internal U64 str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out); +internal U64 str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out); //////////////////////////////// //~ string buffer diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index dbf192bb..02a05907 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -37,15 +37,9 @@ d_init(void) d_ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc(); d_ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); } - d_ctrl_state->module_image_info_cache.slots_count = 1024; - d_ctrl_state->module_image_info_cache.slots = push_array(arena, D_ModuleImageInfoCacheSlot, d_ctrl_state->module_image_info_cache.slots_count); - d_ctrl_state->module_image_info_cache.stripes_count = get_system_info()->logical_processor_count; - d_ctrl_state->module_image_info_cache.stripes = push_array(arena, D_ModuleImageInfoCacheStripe, d_ctrl_state->module_image_info_cache.stripes_count); - for(U64 idx = 0; idx < d_ctrl_state->module_image_info_cache.stripes_count; idx += 1) - { - d_ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc(); - d_ctrl_state->module_image_info_cache.stripes[idx].rw_mutex = rw_mutex_alloc(); - } + d_ctrl_state->module_info_cache.slots_count = 1024; + d_ctrl_state->module_info_cache.slots = push_array(arena, D_ModuleInfoCacheSlot, d_ctrl_state->module_info_cache.slots_count); + d_ctrl_state->module_info_cache.stripes = stripe_array_alloc(arena); d_ctrl_state->u2c_ring_size = KB(64); d_ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, d_ctrl_state->u2c_ring_size); d_ctrl_state->u2c_ring_mutex = mutex_alloc(); diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index d9676383..26a90c6e 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -139,6 +139,7 @@ struct D_Entity D_TlsModel tls_model; U64 tls_index; U64 tls_offset; + U64 tls_root_vaddr; OperatingSystem target_os; D_MsgID src_msg_id; }; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index dcdf9a50..cf494e69 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1358,6 +1358,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) } } thread->stack_base = event->stack_base; + thread->tls_root_vaddr = event->tls_root; } //d_cached_ip_from_thread(&store->ctx, event->entity); }break; @@ -1633,6 +1634,25 @@ d_sp_from_thread(D_Handle handle) return result; } +internal B32 +d_thread_get_module_tls_vaddr(D_Handle thread, D_Handle module, U64 *vaddr_out) +{ + B32 result = 0; + + // rjf: resolve to demon + DMN_Handle thread_dmn = d_dmn_from_handle(thread); + DMN_Handle module_dmn = d_dmn_from_handle(module); + + // rjf: compute vaddr + if(!dmn_handle_match(thread_dmn, dmn_handle_zero()) && + !dmn_handle_match(module_dmn, dmn_handle_zero())) + { + result = dmn_thread_get_module_tls_vaddr(thread_dmn, module_dmn, vaddr_out); + } + + return result; +} + //- rjf: thread register cache reading internal void * @@ -1695,14 +1715,6 @@ d_cached_reg_block_from_thread(Arena *arena, D_Handle handle) return result; } -internal U64 -d_cached_tls_root_vaddr_from_thread(D_Handle handle) -{ - DMN_Handle handle_dmn = d_dmn_from_handle(handle); - U64 result = dmn_tls_root_vaddr_from_thread(handle_dmn); - return result; -} - internal U64 d_cached_ip_from_thread(D_Handle handle) { @@ -1734,17 +1746,18 @@ d_cached_sp_from_thread(D_Handle handle) //- rjf: cache lookups +#if 0 // TODO(rjf): @unwind internal PE_IntelPdata * d_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff) { PE_IntelPdata *first_pdata = 0; { U64 hash = d_hash_from_handle(module_handle); - U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + U64 slot_idx = hash%d_ctrl_state->module_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_info_cache.stripes_count; + D_ModuleInfoCacheSlot *slot = &d_ctrl_state->module_info_cache.slots[slot_idx]; + D_ModuleInfoCacheStripe *stripe = &d_ctrl_state->module_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for(D_ModuleInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(d_handle_match(n->module, module_handle)) { @@ -1800,70 +1813,54 @@ d_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff) } return first_pdata; } +#endif + +internal D_ModuleInfo * +d_info_from_module(Access *access, D_Handle module) +{ + D_ModuleInfo *result = &d_module_info_nil; + { + D_ModuleInfoCache *cache = &d_ctrl_state->module_info_cache; + U64 hash = d_hash_from_handle(module); + U64 slot_idx = hash%cache->slots_count; + D_ModuleInfoCacheSlot *slot = &cache->slots[slot_idx]; + Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); + MutexScopeR(stripe->rw_mutex) for(D_ModuleInfoCacheNode *n = slot->first; n != 0; n = n->next) + { + if(d_handle_match(n->module, module)) + { + access_touch(access, &n->access_pt, stripe->cv); + result = &n->v; + break; + } + } + } + return result; +} internal U64 d_entry_point_voff_from_module(D_Handle module_handle) { - U64 result = 0; - U64 hash = d_hash_from_handle(module_handle); - U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(d_handle_match(n->module, module_handle)) - { - result = n->entry_point_voff; - break; - } - } + Access *access = access_open(); + U64 result = d_info_from_module(access, module_handle)->entry_point_voff; + access_close(access); return result; } internal String8 d_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle) { - String8 result = {0}; - U64 hash = d_hash_from_handle(module_handle); - U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(d_handle_match(n->module, module_handle)) - { - result = str8_copy(arena, n->local_debug_info_path); - break; - } - } - return result; -} - -internal String8 -d_raddbg_data_from_module(Arena *arena, D_Handle module_handle) -{ - String8 result = {0}; - U64 hash = d_hash_from_handle(module_handle); - U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(d_handle_match(n->module, module_handle)) - { - result = push_str8_copy(arena, n->raddbg_data); - break; - } - } + Access *access = access_open(); + String8 result = str8_copy(arena, d_info_from_module(access, module_handle)->local_debug_info_path); + access_close(access); return result; } //////////////////////////////// //~ rjf: Unwinding Functions +#if 0 // TODO(rjf): @unwind + //- rjf: [dwarf] typedef struct D_MemoryReadContextDwarfX64 D_MemoryReadContextDwarfX64; @@ -1930,11 +1927,11 @@ d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D EH_PtrCtx eh_ptr_ctx = {0}; { U64 hash = d_hash_from_handle(module_handle); - U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for EachNode(n, D_ModuleImageInfoCacheNode, slot->first) + U64 slot_idx = hash%d_ctrl_state->module_info_cache.slots_count; + U64 stripe_idx = slot_idx%d_ctrl_state->module_info_cache.stripes_count; + D_ModuleInfoCacheSlot *slot = &d_ctrl_state->module_info_cache.slots[slot_idx]; + D_ModuleInfoCacheStripe *stripe = &d_ctrl_state->module_info_cache.stripes[stripe_idx]; + MutexScopeR(stripe->rw_mutex) for EachNode(n, D_ModuleInfoCacheNode, slot->first) { if(d_handle_match(n->module, module_handle)) { @@ -2998,6 +2995,7 @@ d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 modul if(is_stale) {result.flags |= D_UnwindFlag_Stale;} return result; } +#endif //- rjf: abstracted full unwind @@ -3008,35 +3006,149 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) Temp scratch = scratch_begin(&arena, 1); D_Unwind unwind = { .flags = D_UnwindFlag_Error }; + ////////////////////////////// + //- rjf: grab run state pre-unwind computing + // + U64 run_gen = d_run_gen(); + + ////////////////////////////// //- rjf: unpack args + // D_Entity *thread_entity = d_entity_from_handle(thread); D_Entity *process_entity = thread_entity->parent; Arch arch = thread_entity->arch; ARCH_Info *arch_info = arch_info_from_arch(arch); U64 arch_reg_block_size = arch_info->reg_block_size; + ////////////////////////////// //- rjf: grab initial register block + // void *regs_block = d_cached_reg_block_from_thread(scratch.arena, thread); B32 regs_block_good = (arch != Arch_Null && regs_block != 0); - //- rjf: loop & unwind + ////////////////////////////// + //- rjf: grab initial memory + // + MemoryMap memory_map = {0}; + { + // NOTE(rjf): we can pre-fill memory that we can expect to load here - + // otherwise we will lazily evaluate it via the unwinding backends below + } + + ////////////////////////////// + //- rjf: push one frame for register block we already have + // D_UnwindFrameNode *first_frame_node = 0; D_UnwindFrameNode *last_frame_node = 0; U64 frame_node_count = 0; if(regs_block_good) { - for(unwind.flags = 0;;) + D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1); + D_UnwindFrame *f = &frame_node->v; + f->regs = push_array_no_zero(arena, U8, arch_reg_block_size); + MemoryCopy(f->regs, regs_block, arch_reg_block_size); + DLLPushBack(first_frame_node, last_frame_node, frame_node); + frame_node_count += 1; + } + + ////////////////////////////// + //- rjf: loop & unwind + // + if(regs_block_good) + { + unwind.flags = 0; + for(;!unwind.flags;) { ARCH_Info *arch_info = arch_info_from_arch(arch); - U64 rip = arch_ip_from_reg_block(arch_info, regs_block); - U64 rsp = arch_sp_from_reg_block(arch_info, regs_block); + U64 start_ip = arch_ip_from_reg_block(arch_info, regs_block); + U64 start_sp = arch_sp_from_reg_block(arch_info, regs_block); - // rjf: cancel on zero rip (except the top frame) - if(rip == 0 && frame_node_count > 0) + //- rjf: cancel on zero rip (except the top frame) + if(start_ip == 0 && frame_node_count > 0) { break; } + //- rjf: open access for this step + Access *access = access_open(); + + //- rjf: ip -> module / unpack + D_Entity *module_entity = d_module_from_process_vaddr(process_entity, start_ip); + D_ModuleInfo *module_info = d_info_from_module(access, module_entity->handle); + UWND_Unwinder unwinder = module_info->unwinder; + UWND_ModuleInfo unwinder_module_info = {module_entity->vaddr_range.min, module_info->unwind_info}; + + //- rjf: thread * module -> tls vaddr + U64 tls_vaddr = 0; + d_thread_get_module_tls_vaddr(thread_entity->handle, module_entity->handle, &tls_vaddr); + + //- rjf: do one unwind step + B32 step_is_good = 0; + for(;!unwind.flags;) + { + // rjf: try step + U64 cfa = 0; + UWND_StepResult step = uwnd_step(unwinder, arch, &memory_map, &unwinder_module_info, tls_vaddr, regs_block, &cfa); + + // rjf: if we failed to read memory, try to read that memory, equip to memory map. + // if it is stale and we run out of time, we will need to mark the whole unwind as + // stale. if it can't be read, the unwind fails. + if(step.status == UWND_StepStatus_FailedMemoryRead) + { + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process_entity->handle, step.missed_read_vaddr_range, 1, 0); + String8 data = slice.data; + if(slice.stale) + { + unwind.flags |= D_UnwindFlag_Stale; + } + else if(data.size < dim_1u64(step.missed_read_vaddr_range)) + { + unwind.flags |= D_UnwindFlag_Error; + } + else + { + memory_map_push(scratch.arena, &memory_map, step.missed_read_vaddr_range, data.str); + } + } + + // rjf: if the step itself failed, we just fail out. + else if(step.status == UWND_StepStatus_Error) + { + unwind.flags |= D_UnwindFlag_Error; + } + + // rjf: if the step worked, we're good. equip this step's CFA to the previously added frame, + // then exit the step loop. + else if(step.status == UWND_StepStatus_Good) + { + last_frame_node->v.cfa = cfa; + step_is_good = 1; + break; + } + } + + //- rjf: push successful steps to frame list + if(step_is_good && arch_ip_from_reg_block(arch_info, regs_block) != 0 && arch_ip_from_reg_block(arch_info, regs_block) != start_ip) + { + D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1); + D_UnwindFrame *f = &frame_node->v; + f->regs = push_array_no_zero(arena, U8, arch_reg_block_size); + MemoryCopy(f->regs, regs_block, arch_reg_block_size); + DLLPushBack(first_frame_node, last_frame_node, frame_node); + frame_node_count += 1; + } + + //- rjf: close access + access_close(access); + + //- rjf: exit if we made no progress on the unwind + if(arch_ip_from_reg_block(arch_info, regs_block) == start_ip || + arch_sp_from_reg_block(arch_info, regs_block) == start_sp) + { + break; + } + +#if 0 // TODO(rjf): @unwind // rip -> module D_Entity *module_entity = d_module_from_process_vaddr(process_entity, rip); @@ -3097,13 +3209,14 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) }break; } - // stop unwinding on errors or stale data + // rjf: stop unwinding on errors or stale data unwind.flags |= step_result.flags; if(unwind.flags & (D_UnwindFlag_Stale|D_UnwindFlag_Error) || (arch_sp_from_reg_block(arch_info, regs_block) == rsp && arch_ip_from_reg_block(arch_info, regs_block) == rip)) { break; } +#endif } } @@ -3758,23 +3871,47 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM { Temp scratch = scratch_begin(0,0); - //- rjf: set up per-module info + ////////////////////////////// + //- rjf: allocate / set up basic per-module info + // Arena *arena = arena_alloc(); String8 raddbg_data = d_data_from_process_vaddr_range(arena, process, shift_1u64(module_info->raddbg_info_voff_range, base_vaddr), 0); - U64 pdatas_count = dim_1u64(module_info->pe_intel_pdatas_vaddr_range) / sizeof(PE_IntelPdata); - String8 pdatas_data = d_data_from_process_vaddr_range(arena, process, module_info->pe_intel_pdatas_vaddr_range, 0); - pdatas_count = Min(pdatas_count, pdatas_data.size / sizeof(PE_IntelPdata)); - PE_IntelPdata *pdatas = (PE_IntelPdata *)pdatas_data.str; - EH_PtrCtx eh_ptr_ctx = {.pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0}; - EH_FrameHdr eh_frame_hdr = {0}; - B32 is_unwind_eh = 0; - if(module_info->eh_frame_header_vaddr_range.min != 0) + + ////////////////////////////// + //- rjf: prepare unwind info + // + UWND_Unwinder unwinder = UWND_Unwinder_Null; + void *unwind_info_opaque = 0; { - String8 eh_frame_hdr_data = d_data_from_process_vaddr_range(arena, process, module_info->eh_frame_header_vaddr_range, 0); - eh_ptr_ctx.pc_vaddr = module_info->eh_frame_header_vaddr_range.min; - eh_ptr_ctx.data_vaddr = module_info->eh_frame_header_vaddr_range.min; - eh_frame_hdr = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(module_info->arch), &eh_ptr_ctx); - is_unwind_eh = 1; + //- rjf: PE/x64 unwinder + if(dim_1u64(module_info->pe_intel_pdatas_vaddr_range) != 0) + { + unwinder = UWND_Unwinder_PEx64; + PE_X64_UWND_ModuleUnwindInfo *unwind_info = push_array(arena, PE_X64_UWND_ModuleUnwindInfo, 1); + { + U64 pdatas_count = dim_1u64(module_info->pe_intel_pdatas_vaddr_range) / sizeof(PE_IntelPdata); + String8 pdatas_data = d_data_from_process_vaddr_range(arena, process, module_info->pe_intel_pdatas_vaddr_range, 0); + pdatas_count = Min(pdatas_count, pdatas_data.size / sizeof(PE_IntelPdata)); + PE_IntelPdata *pdatas = (PE_IntelPdata *)pdatas_data.str; + unwind_info->pdatas = pdatas; + unwind_info->pdatas_count = pdatas_count; + } + unwind_info_opaque = unwind_info; + } + + //- rjf: .eh_frame unwinder + else if(dim_1u64(module_info->eh_frame_header_vaddr_range) != 0) + { + unwinder = UWND_Unwinder_EHFrame; + EH_UWND_ModuleUnwindInfo *unwind_info = push_array(arena, EH_UWND_ModuleUnwindInfo, 1); + { + String8 eh_frame_hdr_data = d_data_from_process_vaddr_range(arena, process, module_info->eh_frame_header_vaddr_range, 0); + unwind_info->ptr_ctx.pc_vaddr = module_info->eh_frame_header_vaddr_range.min; + unwind_info->ptr_ctx.data_vaddr = module_info->eh_frame_header_vaddr_range.min; + unwind_info->header = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(module_info->arch), &unwind_info->ptr_ctx); + } + unwind_info_opaque = unwind_info; + } } ////////////////////////////// @@ -3853,19 +3990,33 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM d_process_write_struct(process, base_vaddr + module_info->raddbg_is_attached_marker_voff, &new_value); } + ////////////////////////////// + //- rjf: fill info + // + D_ModuleInfo info = {0}; + { + info.entry_point_voff = module_info->entry_point_voff; + info.unwinder = unwinder; + info.unwind_info = unwind_info_opaque; + info.local_debug_info_path = initial_debug_info_path; + info.debug_info_unique_identifier = debug_info_unique_identifier; + info.raddbg_attached_marker_voff = module_info->raddbg_is_attached_marker_voff; + info.raddbg_data = raddbg_data; + } + ////////////////////////////// //- rjf: insert info into cache // { + D_ModuleInfoCache *cache = &d_ctrl_state->module_info_cache; U64 hash = d_hash_from_handle(module); - U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; + U64 slot_idx = hash%cache->slots_count; + D_ModuleInfoCacheSlot *slot = &cache->slots[slot_idx]; + Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); MutexScopeW(stripe->rw_mutex) { - D_ModuleImageInfoCacheNode *node = 0; - for EachNode(n, D_ModuleImageInfoCacheNode, slot->first) + D_ModuleInfoCacheNode *node = 0; + for EachNode(n, D_ModuleInfoCacheNode, slot->first) { if(d_handle_match(n->module, module)) { @@ -3875,21 +4026,11 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM } if(!node) { - node = push_array(arena, D_ModuleImageInfoCacheNode, 1); + node = push_array(arena, D_ModuleInfoCacheNode, 1); DLLPushBack(slot->first, slot->last, node); - node->module = module; - node->arena = arena; - node->pdatas = pdatas; - node->pdatas_count = pdatas_count; - node->cfi_rebase = module_info->cfi_rebase; - node->is_unwind_eh = is_unwind_eh; - node->eh_frame_hdr = eh_frame_hdr; - node->eh_ptr_ctx = eh_ptr_ctx; - node->entry_point_voff = module_info->entry_point_voff; - node->local_debug_info_path = initial_debug_info_path; - node->debug_info_unique_identifier= debug_info_unique_identifier; - node->raddbg_attached_marker_voff = module_info->raddbg_is_attached_marker_voff; - node->raddbg_data = str8_copy(arena, raddbg_data); + node->module = module; + node->arena = arena; + node->v = info; } } } @@ -3903,19 +4044,19 @@ d_ctrl_thread__module_close(D_Handle process, D_Handle module, U64 base_vaddr) DMN_Handle process_dmn = d_dmn_from_handle(process); ////////////////////////////// - //- rjf: evict module image info from cache + //- rjf: evict module info from cache // U64 raddbg_attached_marker_voff = 0; { + D_ModuleInfoCache *cache = &d_ctrl_state->module_info_cache; U64 hash = d_hash_from_handle(module); - U64 slot_idx = hash%d_ctrl_state->module_image_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_image_info_cache.stripes_count; - D_ModuleImageInfoCacheSlot *slot = &d_ctrl_state->module_image_info_cache.slots[slot_idx]; - D_ModuleImageInfoCacheStripe *stripe = &d_ctrl_state->module_image_info_cache.stripes[stripe_idx]; - MutexScopeW(stripe->rw_mutex) + U64 slot_idx = hash%cache->slots_count; + Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx); + D_ModuleInfoCacheSlot *slot = &cache->slots[slot_idx]; + MutexScopeW(stripe->rw_mutex) for(;;) { - D_ModuleImageInfoCacheNode *node = 0; - for(D_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next) + D_ModuleInfoCacheNode *node = 0; + for(D_ModuleInfoCacheNode *n = slot->first; n != 0; n = n->next) { if(d_handle_match(n->module, module)) { @@ -3923,12 +4064,14 @@ d_ctrl_thread__module_close(D_Handle process, D_Handle module, U64 base_vaddr) break; } } - if(node) + if(node && access_pt_is_expired(&node->access_pt, .time = 0, .update_idxs = 0)) { - raddbg_attached_marker_voff = node->raddbg_attached_marker_voff; + raddbg_attached_marker_voff = node->v.raddbg_attached_marker_voff; DLLRemove(slot->first, slot->last, node); arena_release(node->arena); + break; } + cond_var_wait_rw_w(stripe->cv, stripe->rw_mutex, max_U64); } } @@ -4314,8 +4457,8 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D out_evt->parent = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; - out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread); - out_evt->tls_root = dmn_tls_root_vaddr_from_thread(event->thread); + out_evt->stack_base = event->stack_pointer; + out_evt->tls_root = event->tls_root_vaddr; out_evt->rip_vaddr = event->instruction_pointer; out_evt->string = event->string; }break; @@ -5902,7 +6045,9 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) //- rjf: add traps for module-baked entry points, if specified if(!entries_found) { - String8 raddbg_data = d_raddbg_data_from_module(scratch.arena, module->handle); + Access *access = access_open(); + D_ModuleInfo *module_info = d_info_from_module(access, module->handle); + String8 raddbg_data = module_info->raddbg_data; U8 split_char = 0; String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next) @@ -5932,6 +6077,7 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } } } + access_close(access); } //- rjf: add traps for PID-correllated entry points @@ -7091,6 +7237,64 @@ d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void * return good; } +//////////////////////////////// +//~ rjf: TLS Address Artifact Cache Hooks / Lookups + +internal AC_Artifact +d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +{ + // rjf: unpack key + D_Handle thread = {0}; + D_Handle module = {0}; + { + U64 off = 0; + off += str8_deserial_read_struct(key, off, &thread); + off += str8_deserial_read_struct(key, off, &module); + } + + // rjf: resolve to demon + DMN_Handle thread_dmn = d_dmn_from_handle(thread); + DMN_Handle module_dmn = d_dmn_from_handle(module); + + // rjf: compute vaddr + U64 tls_vaddr = 0; + B32 success = 1; + if(!dmn_handle_match(thread_dmn, dmn_handle_zero()) && + !dmn_handle_match(module_dmn, dmn_handle_zero())) + { + success = dmn_thread_get_module_tls_vaddr(thread_dmn, module_dmn, &tls_vaddr); + } + + // rjf: if not successful -> retry + if(!success) + { + retry_out[0] = 1; + } + + // rjf: package as artifact + AC_Artifact artifact = {0}; + artifact.u64[0] = tls_vaddr; + return artifact; +} + +internal void d_tls_vaddr_artifact_destroy(AC_Artifact artifact) +{ + // NOTE(rjf): no-op +} + +internal U64 +d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_handle, U64 endt_us, B32 *stale_out) +{ + U64 result = 0; + Access *access = access_open(); + D_Handle key_data[] = {thread_handle, module_handle}; + String8 key = str8((U8 *)&key_data[0], sizeof(key_data)); + AC_Artifact artifact = ac_artifact_from_key(access, key, d_tls_vaddr_artifact_create, d_tls_vaddr_artifact_destroy, endt_us, .stale_out = stale_out); + result = artifact.u64[0]; + access_close(access); + return result; +} + //////////////////////////////// //~ rjf: Call Stack Artifact Cache Hooks / Lookups @@ -7226,7 +7430,7 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 { pre_reg_gen = d_reg_gen(); pre_mem_gen = d_mem_gen(); - unwind = d_unwind_from_thread(arena, thread_handle, now_time_us()+5000); + unwind = d_unwind_from_thread(arena, thread_handle, 0); if(!(unwind.flags & D_UnwindFlag_Stale)) { good = 1; diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 9df2083e..13d0e926 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -49,6 +49,7 @@ struct D_Unwind D_UnwindFlags flags; }; +#if 0 // TODO(rjf): @unwind typedef struct D_FrameUnwindContext D_FrameUnwindContext; struct D_FrameUnwindContext { @@ -57,6 +58,7 @@ struct D_FrameUnwindContext DW_CFI_Row *cfi_row; U64 ret_addr_reg; }; +#endif //////////////////////////////// //~ rjf: Call Stack Types @@ -171,21 +173,12 @@ struct D_ThreadRegCache //////////////////////////////// //~ rjf: Module Image Info Cache Types -typedef struct D_ModuleImageInfoCacheNode D_ModuleImageInfoCacheNode; -struct D_ModuleImageInfoCacheNode +typedef struct D_ModuleInfo D_ModuleInfo; +struct D_ModuleInfo { - D_ModuleImageInfoCacheNode *next; - D_ModuleImageInfoCacheNode *prev; - D_Handle module; - Arena *arena; - PE_IntelPdata *pdatas; - U64 pdatas_count; - U64 cfi_rebase; - String8 dwarf_unwind_data; - B32 is_unwind_eh; - EH_FrameHdr eh_frame_hdr; - EH_PtrCtx eh_ptr_ctx; U64 entry_point_voff; + UWND_Unwinder unwinder; + void *unwind_info; String8 local_debug_info_path; String8 local_server_cache_debug_info_path; String8 debug_info_unique_identifier; @@ -193,27 +186,30 @@ struct D_ModuleImageInfoCacheNode String8 raddbg_data; }; -typedef struct D_ModuleImageInfoCacheSlot D_ModuleImageInfoCacheSlot; -struct D_ModuleImageInfoCacheSlot -{ - D_ModuleImageInfoCacheNode *first; - D_ModuleImageInfoCacheNode *last; -}; - -typedef struct D_ModuleImageInfoCacheStripe D_ModuleImageInfoCacheStripe; -struct D_ModuleImageInfoCacheStripe +typedef struct D_ModuleInfoCacheNode D_ModuleInfoCacheNode; +struct D_ModuleInfoCacheNode { + D_ModuleInfoCacheNode *next; + D_ModuleInfoCacheNode *prev; + AccessPt access_pt; + D_Handle module; Arena *arena; - RWMutex rw_mutex; + D_ModuleInfo v; }; -typedef struct D_ModuleImageInfoCache D_ModuleImageInfoCache; -struct D_ModuleImageInfoCache +typedef struct D_ModuleInfoCacheSlot D_ModuleInfoCacheSlot; +struct D_ModuleInfoCacheSlot +{ + D_ModuleInfoCacheNode *first; + D_ModuleInfoCacheNode *last; +}; + +typedef struct D_ModuleInfoCache D_ModuleInfoCache; +struct D_ModuleInfoCache { U64 slots_count; - D_ModuleImageInfoCacheSlot *slots; - U64 stripes_count; - D_ModuleImageInfoCacheStripe *stripes; + D_ModuleInfoCacheSlot *slots; + StripeArray stripes; }; //////////////////////////////// @@ -340,7 +336,7 @@ struct D_CtrlState // rjf: caches D_ThreadRegCache thread_reg_cache; - D_ModuleImageInfoCache module_image_info_cache; + D_ModuleInfoCache module_info_cache; D_DumpCache dump_cache; // rjf: generations @@ -413,6 +409,7 @@ read_only global D_CallStackTreeNode d_call_stack_tree_node_nil = &d_call_stack_tree_node_nil, }; thread_static D_EntityCtxLookupAccel *d_entity_ctx_lookup_accel = 0; +read_only global D_ModuleInfo d_module_info_nil = {0}; //////////////////////////////// //~ rjf: Basic Type Functions @@ -550,10 +547,10 @@ internal B32 d_thread_read_reg_block(D_Handle handle, void *reg_block); internal B32 d_thread_write_reg_block(D_Handle thread, void *reg_block); internal U64 d_ip_from_thread(D_Handle handle); internal U64 d_sp_from_thread(D_Handle handle); +internal B32 d_thread_get_module_tls_vaddr(D_Handle thread, D_Handle module, U64 *vaddr_out); //- rjf: thread register cache reading internal void *d_cached_reg_block_from_thread(Arena *arena, D_Handle handle); -internal U64 d_cached_tls_root_vaddr_from_thread(D_Handle handle); internal U64 d_cached_ip_from_thread(D_Handle handle); internal U64 d_cached_sp_from_thread(D_Handle handle); @@ -561,14 +558,17 @@ internal U64 d_cached_sp_from_thread(D_Handle handle); //~ rjf: Module Image Info Functions //- rjf: cache lookups +#if 0 // TODO(rjf): @unwind internal PE_IntelPdata *d_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff); +#endif +internal D_ModuleInfo *d_info_from_module(Access *access, D_Handle module); internal U64 d_entry_point_voff_from_module(D_Handle module_handle); internal String8 d_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle); -internal String8 d_raddbg_data_from_module(Arena *arena, D_Handle module_handle); //////////////////////////////// //~ rjf: Unwinding Functions +#if 0 // TODO(rjf): @unwind //- rjf: [dwarf] internal D_UnwindStepResult d_unwind_step_result_from_machine_op_result(MachineOpResult s); internal D_UnwindStepResult d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out); @@ -577,6 +577,7 @@ internal D_UnwindStepResult d_unwind_step__dwarf(D_Handle process_handle, Arch a //- rjf: [x64] internal U64 *d_unwind_reg_from_pe_gpr_reg__pe_x64(X64_RegBlock *regs, PE_UnwindGprRegX64 gpr_reg); internal D_UnwindStepResult d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, X64_RegBlock *regs, U64 endt_us); +#endif //- rjf: abstracted full unwind internal D_Unwind d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us); @@ -673,6 +674,13 @@ internal D_ProcessMemorySlice d_process_memory_slice_from_vaddr_range(Arena *are internal B32 d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us); #define d_process_memory_read_struct(process, vaddr, is_stale_out, ptr, endt_us) d_process_memory_read((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us)) +//////////////////////////////// +//~ rjf: TLS Address Artifact Cache Hooks / Lookups + +internal AC_Artifact d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal void d_tls_vaddr_artifact_destroy(AC_Artifact artifact); +internal U64 d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_handle, U64 endt_us, B32 *stale_out); + //////////////////////////////// //~ rjf: Call Stack Artifact Cache Hooks / Lookups diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 76a16ab8..eba11daf 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -97,7 +97,6 @@ struct DMN_ModuleInfo // rjf: unwinding info Rng1U64 pe_intel_pdatas_vaddr_range; Rng1U64 eh_frame_header_vaddr_range; - U64 cfi_rebase; // rjf: special raddbg data Rng1U64 raddbg_info_voff_range; @@ -135,6 +134,9 @@ struct DMN_Event // rjf: module info DMN_ModuleInfo *module_info; + + // rjf: thread info + U64 tls_root_vaddr; }; typedef struct DMN_EventNode DMN_EventNode; @@ -291,10 +293,9 @@ internal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst); internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src); //- rjf: threads -internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); -internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); internal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block); +internal B32 dmn_thread_get_module_tls_vaddr(DMN_Handle thread, DMN_Handle module, U64 *vaddr_out); //- rjf: system process listing internal void dmn_process_iter_begin(DMN_ProcessIter *iter); diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 3bbdc22d..5d73309e 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -2,235 +2,471 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: Generated Code +//~ rjf: Includes #include "dwarf/generated/dwarf.meta.c" +#if defined(X64_H) +# include "dwarf/x64/dwarf_x64.c" +#endif -internal DW_AttribClass -dw_attrib_class_from_attrib_v2(DW_AttribKind k) +//////////////////////////////// +//~ rjf: X-List Helpers + +//- rjf: format address sizes + +internal U64 +dw_addr_size_from_format(DW_Format fmt) { - switch (k) { -#define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_V2_XList + U64 result = 0; + switch(fmt) + { + default:{}break; +#define X(name, string, addr_size) case DW_Format_##name:{result = (addr_size);}break; + DW_Format_XList #undef X } - return DW_AttribClass_Null; -} - -internal DW_AttribClass -dw_attrib_class_from_attrib_v3(DW_AttribKind k) -{ - switch (k) { -#define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_V3_XList -#undef X - } - return DW_AttribClass_Null; -} - -internal DW_AttribClass -dw_attrib_class_from_attrib_v4(DW_AttribKind k) -{ - switch (k) { -#define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_V4_XList -#undef X - } - return DW_AttribClass_Null; -} - -internal DW_AttribClass -dw_attrib_class_from_attrib_v5(DW_AttribKind k) -{ - switch (k) { -#define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_V5_XList -#undef X - } - return DW_AttribClass_Null; -} - -internal DW_AttribClass -dw_attrib_class_from_attrib_gnu(DW_AttribKind k) -{ - switch (k) { -#define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_GNU_XList -#undef X - } - return DW_AttribClass_Null; -} - -internal DW_AttribClass -dw_attrib_class_from_attrib_llvm(DW_AttribKind k) -{ - switch (k) { -#define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_LLVM_XList -#undef X - } - return DW_AttribClass_Null; -} - -internal DW_AttribClass -dw_attrib_class_from_attrib_apple(DW_AttribKind k) -{ - switch (k) { -#define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_APPLE_XList -#undef X - } - return DW_AttribClass_Null; -} - -internal DW_AttribClass -dw_attrib_class_from_attrib_mips(DW_AttribKind k) -{ - switch (k) { -#define X(_N,_C) case DW_AttribKind_##_N: return _C; - DW_AttribKind_ClassFlags_MIPS_XList -#undef X - } - return DW_AttribClass_Null; -} - -internal DW_AttribClass -dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind k) -{ - DW_AttribClass result = DW_AttribClass_Null; - - while (ext) { - U64 z = 64-clz64(ext); - if (z == 0) { - break; - } - U64 flag = 1 << (z-1); - ext &= ~flag; - - switch (flag) { - case DW_Ext_Null: break; - case DW_Ext_GNU: result = dw_attrib_class_from_attrib_gnu(k); break; - case DW_Ext_LLVM: result = dw_attrib_class_from_attrib_llvm(k); break; - case DW_Ext_APPLE: result = dw_attrib_class_from_attrib_apple(k); break; - case DW_Ext_MIPS: result = dw_attrib_class_from_attrib_mips(k); break; - default: InvalidPath; break; - } - - if (result != DW_AttribClass_Null) { - break; - } - } - - if (result == DW_AttribClass_Null) { - switch (ver) { - case DW_Version_Null: break; - case DW_Version_1: AssertAlways(!"DWARF V1 is not supported"); break; - case DW_Version_2: result = dw_attrib_class_from_attrib_v2(k); break; - case DW_Version_3: result = dw_attrib_class_from_attrib_v3(k); break; - case DW_Version_4: result = dw_attrib_class_from_attrib_v4(k); break; - case DW_Version_5: result = dw_attrib_class_from_attrib_v5(k); break; - default: InvalidPath; break; - } - } - return result; } +//- rjf: attribute classes + +internal DW_AttribClass +dw_attrib_class_from_kind(DW_Version version, DW_ExtFlags exts, DW_AttribKind k) +{ + DW_AttribClass result = 0; + if(result == 0) switch(k) + { + default:{}break; +#define X(name, code, version, classes) case DW_AttribKind_##name:{result = (classes);}break; + DW_AttribKind_XList +#undef X + } + for(B32 retry = 0; !result && retry <= 1; retry += 1) + { + if(result == 0 && exts & DW_ExtFlag_GNU) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_GNU_AttribKind_##name:{result = (classes);}break; + DW_GNU_AttribKind_XList +#undef X + } + if(result == 0 && exts & DW_ExtFlag_LLVM) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_LLVM_AttribKind_##name:{result = (classes);}break; + DW_LLVM_AttribKind_XList +#undef X + } + if(result == 0 && exts & DW_ExtFlag_Apple) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_Apple_AttribKind_##name:{result = (classes);}break; + DW_Apple_AttribKind_XList +#undef X + } + if(result == 0 && exts & DW_ExtFlag_MIPS) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_MIPS_AttribKind_##name:{result = (classes);}break; + DW_MIPS_AttribKind_XList +#undef X + } + exts = DW_ExtFlag_All; + } + return result; +} + +internal DW_AttribClass +dw_attrib_class_from_form_kind(DW_Version version, DW_ExtFlags exts, DW_FormKind k) +{ + DW_AttribClass result = 0; + if(result == 0) switch(k) + { + default:{}break; +#define X(name, code, version, classes) case DW_FormKind_##name:{result = (classes);}break; + DW_FormKind_XList +#undef X + } + for(B32 retry = 0; !result && retry <= 1; retry += 1) + { + if(result == 0 && exts & DW_ExtFlag_GNU) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_GNU_FormKind_##name:{result = (classes);}break; + DW_GNU_FormKind_XList +#undef X + } + exts = DW_ExtFlag_All; + } + return result; +} + +//- rjf: expr op metadata + +internal DW_ExprOpInfo * +dw_info_from_expr_op(DW_Version version, DW_ExtFlags exts, DW_ExprOp op) +{ + DW_ExprOpInfo *result = &dw_expr_op_info_nil; + if(result == &dw_expr_op_info_nil) switch(op) + { + default:{}break; +#define X(name_, code, version_, operand_count_, pop_count_, push_count_, operand_kind_0, operand_kind_1, valid_for_cfa_exprs_) case DW_ExprOp_##name_:{local_persist DW_ExprOpInfo info = {.push_count = (push_count_), .pop_count = (pop_count_), .operand_count = (operand_count_), .valid_for_cfa_exprs = (valid_for_cfa_exprs_), .operand_kinds = {DW_ExprOperandKind_##operand_kind_0, DW_ExprOperandKind_##operand_kind_1}, .name = str8_lit_comp(#name_), .version = DW_Version_##version_}; result = &info;}break; + DW_ExprOp_XList +#undef X + } + for(B32 retry = 0; (result == &dw_expr_op_info_nil) && retry <= 1; retry += 1) + { + if((result == &dw_expr_op_info_nil) && exts & DW_ExtFlag_GNU) switch(op) + { + default:{}break; +#define X(name_, code, operand_count_, pop_count_, push_count_, operand_kind_0, operand_kind_1, valid_for_cfa_exprs_) case DW_GNU_ExprOp_##name_:{local_persist DW_ExprOpInfo info = {.push_count = (push_count_), .pop_count = (pop_count_), .operand_count = (operand_count_), .valid_for_cfa_exprs = (valid_for_cfa_exprs_), .operand_kinds = {DW_ExprOperandKind_##operand_kind_0, DW_ExprOperandKind_##operand_kind_1}, .name = str8_lit_comp(#name_)}; result = &info;}break; + DW_GNU_ExprOp_XList +#undef X + } + exts = DW_ExtFlag_All; + } + return result; +} + +//- rjf: enum -> string + +internal String8 +dw_string_from_format(DW_Format fmt) +{ + String8 result = {0}; + switch(fmt) + { + default:{}break; +#define X(name, string, addr_size) case DW_Format_##name:{result = str8_lit(string);}break; + DW_Format_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_tag_kind(DW_Version version, DW_ExtFlags exts, DW_TagKind k) +{ + String8 result = {0}; + if(result.size == 0) switch(k) + { + default:{}break; +#define X(name, code, version) case DW_TagKind_##name:{result = s(#name);}break; + DW_TagKind_XList +#undef X + } + for(B32 retry = 0; !result.size && retry <= 1; retry += 1) + { + if(result.size == 0 && exts & DW_ExtFlag_GNU) switch(k) + { +#define X(name, code) case DW_GNU_TagKind_##name:{result = s(#name);}break; + DW_GNU_TagKind_XList +#undef X + } + exts = DW_ExtFlag_All; + } + return result; +} + +internal String8 +dw_string_from_attrib_kind(DW_Version version, DW_ExtFlags exts, DW_AttribKind k) +{ + String8 result = {0}; + if(result.size == 0) switch(k) + { + default:{}break; +#define X(name, code, version, classes) case DW_AttribKind_##name:{result = s(#name);}break; + DW_AttribKind_XList +#undef X + } + for(B32 retry = 0; !result.size && retry <= 1; retry += 1) + { + if(result.size == 0 && exts & DW_ExtFlag_GNU) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_GNU_AttribKind_##name:{result = s(#name);}break; + DW_GNU_AttribKind_XList +#undef X + } + if(result.size == 0 && exts & DW_ExtFlag_LLVM) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_LLVM_AttribKind_##name:{result = s(#name);}break; + DW_LLVM_AttribKind_XList +#undef X + } + if(result.size == 0 && exts & DW_ExtFlag_Apple) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_Apple_AttribKind_##name:{result = s(#name);}break; + DW_Apple_AttribKind_XList +#undef X + } + if(result.size == 0 && exts & DW_ExtFlag_MIPS) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_MIPS_AttribKind_##name:{result = s(#name);}break; + DW_MIPS_AttribKind_XList +#undef X + } + exts = DW_ExtFlag_All; + } + return result; +} + +internal String8 +dw_string_from_form_kind(DW_Version version, DW_ExtFlags exts, DW_FormKind k) +{ + String8 result = {0}; + if(result.size == 0) switch(k) + { + default:{}break; +#define X(name, code, version, classes) case DW_FormKind_##name:{result = s(#name);}break; + DW_FormKind_XList +#undef X + } + for(B32 retry = 0; !result.size && retry <= 1; retry += 1) + { + if(result.size == 0 && exts & DW_ExtFlag_GNU) switch(k) + { + default:{}break; +#define X(name, code, classes) case DW_GNU_FormKind_##name:{result = s(#name);}break; + DW_GNU_FormKind_XList +#undef X + } + exts = DW_ExtFlag_All; + } + return result; +} + +internal String8 +dw_string_from_language(DW_Language k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, ...) case DW_Language_##name:{result = s(#name);}break; + DW_Language_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_comp_unit_kind(DW_CompUnitKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, ...) case DW_CompUnitKind_##name:{result = s(#name);}break; + DW_CompUnitKind_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_inl_kind(DW_InlKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, ...) case DW_InlKind_##name:{result = s(#name);}break; + DW_InlKind_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_access_kind(DW_AccessKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, ...) case DW_AccessKind_##name:{result = s(#name);}break; + DW_AccessKind_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_calling_convention_kind(DW_CallingConventionKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, ...) case DW_CallingConventionKind_##name:{result = s(#name);}break; + DW_CallingConventionKind_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_ate(DW_ATE k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, ...) case DW_ATE_##name:{result = s(#name);}break; + DW_ATE_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_visibility_kind(DW_VisibilityKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, ...) case DW_VisibilityKind_##name:{result = s(#name);}break; + DW_VisibilityKind_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_std_opcode(DW_StdOpcode opcode) +{ + String8 result = {0}; + switch(opcode) + { + default:{}break; +#define X(name, ...) case DW_StdOpcode_##name:{result = s(#name);}break; + DW_StdOpcode_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_ext_opcode(DW_ExtOpcode opcode) +{ + String8 result = {0}; + switch(opcode) + { + default:{}break; +#define X(name, ...) case DW_ExtOpcode_##name:{result = s(#name);}break; + DW_ExtOpcode_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_lle(DW_LLE lle) +{ + String8 result = {0}; + switch(lle) + { + default:{}break; +#define X(name, ...) case DW_LLE_##name:{result = s(#name);}break; + DW_LLE_XList +#undef X + } + return result; +} + +internal String8 +dw_string_from_rle(DW_RLE rle) +{ + String8 result = {0}; + switch(rle) + { + default:{}break; +#define X(name, ...) case DW_RLE_##name:{result = s(#name);}break; + DW_RLE_XList +#undef X + } + return result; +} + +internal String8 +dw_regular_name_from_section_kind(DW_SectionKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, regular_name, ...) case DW_SectionKind_##name:{result = str8_lit(regular_name);}break; + DW_SectionKind_XList +#undef X + } + return result; +} + +internal String8 +dw_macho_name_from_section_kind(DW_SectionKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, regular_name, macho_name, ...) case DW_SectionKind_##name:{result = str8_lit(macho_name);}break; + DW_SectionKind_XList +#undef X + } + return result; +} + +internal String8 +dw_dwo_name_from_section_kind(DW_SectionKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; +#define X(name, regular_name, macho_name, dwo_name, ...) case DW_SectionKind_##name:{result = str8_lit(dwo_name);}break; + DW_SectionKind_XList +#undef X + } + return result; +} + +//- rjf: architecture info + +internal U64 +dw_reg_count_from_arch(Arch arch) +{ + U64 result = 0; + switch(arch) + { + default:{}break; + case Arch_x64:{result = DW_RegCodeX64_LAST;}break; + } + return result; +} + +//////////////////////////////// +//~ TODO(rjf): OLD vvvvvvvvvvv + +#if 0 internal DW_AttribClass dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k) { - DW_AttribClass result = DW_AttribClass_Null; -#define X(_N,_C) case DW_Form_##_N:{result = _C;}break; + DW_AttribClass result = 0; switch(k) { - DW_Form_AttribClass_GNU_XList - } - switch(ver) - { - case DW_Version_5: - { - switch (k) - { - DW_Form_AttribClass_V5_XList - } - }break; - case DW_Version_4: - { - switch (k) - { - DW_Form_AttribClass_V4_XList - } - }break; - case DW_Version_3: - { - switch (k) - { - DW_Form_AttribClass_V2_XList - } - }break; - case DW_Version_2: - { - switch(k) - { - DW_Form_AttribClass_V2_XList - } - }break; - case DW_Version_1:{} break; - case DW_Version_Null:{}break; - } + default:{}break; +#define X(name, code, version, ext, class) case DW_FormKind_##name:{result = (class);}break; + DW_FormKind_XList #undef X + } return result; } -internal B32 -dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind) -{ - DW_AttribClass compat_flags = dw_attrib_class_from_form_kind(ver, form_kind); - B32 are_compat = (attrib_class & compat_flags) != 0; - return are_compat; -} - -internal B32 -dw_is_form_kind_ref(DW_Version ver, DW_Ext ext, DW_FormKind form_kind) -{ - B32 is_ref = 0; - if (form_kind == DW_Form_RefAddr || - form_kind == DW_Form_Ref1 || - form_kind == DW_Form_Ref2 || - form_kind == DW_Form_Ref4 || - form_kind == DW_Form_Ref8 || - form_kind == DW_Form_RefUData) { - is_ref = 1; - } else { - if (ext == DW_Ext_GNU) { - is_ref = DW_Form_GNU_RefAlt; - } - } - return is_ref; -} - -internal U64 -dw_reg_size_from_code_x64(DW_Reg reg_code) -{ - switch (reg_code) { -#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_size; - DW_Regs_X64_XList -#undef X - } - return 0; -} - -internal U64 -dw_reg_pos_from_code_x64(DW_Reg reg_code) -{ - switch (reg_code) { -#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_pos; - DW_Regs_X64_XList -#undef X - } - return max_U64; -} - internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code) { @@ -277,194 +513,6 @@ dw_reg_max_size_from_arch(Arch arch) return max_size; } -internal U64 -dw_sp_from_arch(Arch arch) -{ - switch (arch) { - default: NotImplemented; - case Arch_Null: return 0; - case Arch_x64: return DW_RegX64_Rsp; - } -} - - -internal U64 -dw_size_from_format(DW_Format format) -{ - U64 result = 0; - switch(format) - { - case DW_Format_Null:{}break; - case DW_Format_32Bit:{result = 4;}break; - case DW_Format_64Bit:{result = 8;}break; - } - return result; -} - -internal DW_AttribClass -dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib_kind, DW_FormKind form_kind) -{ - // NOTE(rjf): DWARF's spec specifies two mappings: - // (DW_AttribKind) => List(DW_AttribClass) - // (DW_FormKind) => List(DW_AttribClass) - // - // This function's purpose is to find the overlapping class between an - // DW_AttribKind and DW_FormKind. - - DW_AttribClass attrib_class = dw_attrib_class_from_attrib(ver, ext, attrib_kind); - DW_AttribClass form_class = dw_attrib_class_from_form_kind(ver, form_kind); - - if(relaxed) - { - if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null) - { - attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind); - form_class = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind); - } - } - - DW_AttribClass result = DW_AttribClass_Null; - if(attrib_class != DW_AttribClass_Null && form_class != DW_AttribClass_Null) - { - result = DW_AttribClass_Undefined; - - for(U32 i = 0; i < 32; ++i) - { - U32 n = 1u << i; - if((attrib_class & n) != 0 && (form_class & n) != 0) - { - result = ((DW_AttribClass) n); - break; - } - } - } - - return result; -} - -internal U64 -dw_pick_default_lower_bound(DW_Language lang) -{ - U64 lower_bound = max_U64; - switch(lang) - { - case DW_Language_Null: break; - case DW_Language_C89: - case DW_Language_C: - case DW_Language_CPlusPlus: - case DW_Language_C99: - case DW_Language_CPlusPlus03: - case DW_Language_CPlusPlus11: - case DW_Language_C11: - case DW_Language_CPlusPlus14: - case DW_Language_Java: - case DW_Language_ObjC: - case DW_Language_ObjCPlusPlus: - case DW_Language_UPC: - case DW_Language_D: - case DW_Language_Python: - case DW_Language_OpenCL: - case DW_Language_Go: - case DW_Language_Haskell: - case DW_Language_OCaml: - case DW_Language_Rust: - case DW_Language_Swift: - case DW_Language_Dylan: - case DW_Language_RenderScript: - case DW_Language_BLISS: - { - lower_bound = 0; - }break; - case DW_Language_Ada83: - case DW_Language_Cobol74: - case DW_Language_Cobol85: - case DW_Language_Fortran77: - case DW_Language_Fortran90: - case DW_Language_Pascal83: - case DW_Language_Modula2: - case DW_Language_Ada95: - case DW_Language_Fortran95: - case DW_Language_PLI: - case DW_Language_Modula3: - case DW_Language_Julia: - case DW_Language_Fortran03: - case DW_Language_Fortran08: - { - lower_bound = 1; - }break; - default:{}break; - } - return lower_bound; -} - -internal U64 -dw_operand_count_from_expr_op(DW_ExprOp op) -{ - U64 result = 0; - switch(op) - { - default:{}break; -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID:{result = _OPER_COUNT;}break; - DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList -#undef X - } - return result; -} - -internal U64 -dw_pop_count_from_expr_op(DW_ExprOp op) -{ - U64 result = 0; - switch(op) - { - default:{}break; -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID:{result = _POP_COUNT;}break; - DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList -#undef X - } - return result; -} - -internal U64 -dw_push_count_from_expr_op(DW_ExprOp op) -{ - U64 result = 0; - switch (op) { - default:{}break; -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) case _ID:{result = _PUSH_COUNT;}break; - DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList -#undef X - } - return result; -} - -internal DW_ExprOperandType * -dw_operand_types_from_expr_opcode(DW_ExprOp op) -{ - local_persist DW_ExprOperandType nil_t[] = {DW_ExprOperandType_Null}; - DW_ExprOperandType *result = nil_t; - switch(op) - { - default:{}break; -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, _OPER_TYPE0, _OPER_TYPE1) case _ID: { local_persist DW_ExprOperandType t[] = { DW_ExprOperandType_##_OPER_TYPE0, DW_ExprOperandType_##_OPER_TYPE1 }; result = t; }break; - DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList -#undef X - } - return result; -} - internal U64 dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode) { @@ -534,156 +582,6 @@ dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode) return 0; } -internal String8 -dw_string_from_format(DW_Format format) -{ - switch (format) { - case DW_Format_Null: return str8_lit("NULL"); - case DW_Format_32Bit: return str8_lit("DWARF32"); - case DW_Format_64Bit: return str8_lit("DWARF64"); - } - return str8_zero(); -} - -internal String8 -dw_string_from_expr_op(Arena *arena, DW_Version ver, DW_Ext ext, DW_ExprOp op) -{ - String8 result = {0}; - -#define X(_N,...) case DW_ExprOp_##_N: result = str8_lit(Stringify(_N)); goto exit; - if (ext & DW_Ext_GNU) { - switch (op) { - DW_Expr_GNU_XList; - } - } - - switch (ver) { - case DW_Version_5: { - switch (op) { - DW_Expr_V5_XList - } - } // fall-through - case DW_Version_4: { - switch (op) { - DW_Expr_V4_XList - } - } // fall-through - case DW_Version_3: - case DW_Version_2: - case DW_Version_1: { - switch (op) { - DW_Expr_V3_XList - } - } // fall-through - case DW_Version_Null: - break; - } -#undef X - - result = push_str8f(arena, "%x", op); - - exit:; - return result; -} - -internal String8 -dw_string_from_tag_kind(Arena *arena, DW_TagKind kind) -{ - switch (kind) { - case DW_TagKind_Null: return str8_lit("Null"); -#define X(_N,_ID) case DW_TagKind_##_N: return str8_lit(Stringify(_N)); - DW_TagKind_V3_XList - DW_TagKind_V5_XList - DW_TagKind_GNU_XList -#undef X - } - return push_str8f(arena, "%llx", kind); -} - -internal String8 -dw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKind kind) -{ -#define X(_N,...) case DW_AttribKind_##_N:{result = str8_lit(Stringify(_N));}break; - String8 result = {0}; - - //- rjf: try extensions - while(ext) - { - U64 z = 64-clz64(ext); - if(z == 0) - { - break; - } - U64 flag = 1 << (z-1); - ext &= ~flag; - switch(flag) - { - default:{}break; - case DW_Ext_Null: break; - case DW_Ext_GNU: switch (kind) { DW_AttribKind_GNU_XList } break; - case DW_Ext_LLVM: switch (kind) { DW_AttribKind_LLVM_XList } break; - case DW_Ext_APPLE: switch (kind) { DW_AttribKind_APPLE_XList } break; - case DW_Ext_MIPS: switch (kind) { DW_AttribKind_MIPS_XList } break; - } - } - - //- rjf: try version - if(result.size == 0) - { - for(U64 retry = 0; retry < 2; retry += 1) - { - DW_Version version = retry ? DW_Version_5 : ver; - switch(version) - { - case DW_Version_5: { switch(kind) { DW_AttribKind_V5_XList } } // fall-through - case DW_Version_4: { switch(kind) { DW_AttribKind_V4_XList } } // fall-through - case DW_Version_3: { switch(kind) { DW_AttribKind_V3_XList } } // fall-through - case DW_Version_2: { switch(kind) { DW_AttribKind_V2_XList } } // fall-through - case DW_Version_1: {}break; - case DW_Version_Null:{}break; - default:{}break; - } - } - } - - //- rjf: fallback - if(result.size == 0) - { - result = push_str8f(arena, "#%u", kind); - } - -#undef X - return result; -} - -internal String8 -dw_string_from_form_kind(Arena *arena, DW_Version ver, DW_FormKind kind) -{ -#define X(_N,...) case DW_Form_##_N: return str8_lit(Stringify(_N)); - switch (ver) { - case DW_Version_5: { - switch (kind) { - DW_Form_V5_XList - } - } // fall-through - case DW_Version_4: { - switch (kind) { - DW_Form_V4_XList - } - } // fall-through - case DW_Version_3: - case DW_Version_2: { - switch (kind) { - DW_Form_V2_XList - } - } // fall-through - case DW_Version_Null: break; - } -#undef X - String8 result = push_str8f(arena, "%x", kind); - return result; -} - internal String8 dw_string_from_language(Arena *arena, DW_Language kind) { @@ -873,218 +771,4 @@ dw_dwo_name_string_from_section_kind(DW_SectionKind k) } return str8_zero(); } - -internal U64 -dw_write_to_buffer_uleb128(U8 buffer[10], U64 v) -{ - U64 buffer_size = 0; - U64 value = v; - do { - U8 byte = value & 0x7f; - value >>= 7; - if (value != 0) { - byte |= 0x80; - } - Assert(buffer_size < 10); - buffer[buffer_size++] = byte; - } while (value > 0); - return buffer_size; -} - -internal U64 -dw_write_to_buffer_sleb128(U8 buffer[10], U64 v) -{ - U64 buffer_size = 0; - for (S64 value = v, more = 1; more != 0; ) { - U8 byte = value & 0x7f; - value >>= 7; - U8 sign_bit = byte & 0x40; - if ((value == 0 && sign_bit == 0) || (value == -1 && sign_bit != 0)) { - more = 0; - } else { - byte |= 0x80; - } - Assert(buffer_size < 10); - buffer[buffer_size++] = byte; - } - return buffer_size; -} - -internal String8 -dw_write_uleb128(Arena *arena, U64 v) -{ - U8 buffer[10]; - U64 buffer_size = dw_write_to_buffer_uleb128(buffer, v); - return str8_copy(arena, str8(buffer, buffer_size)); -} - -internal String8 -dw_write_sleb128(Arena *arena, S64 v) -{ - U8 buffer[10]; - U64 buffer_size = dw_write_to_buffer_sleb128(buffer, v); - return str8_copy(arena, str8(buffer, buffer_size)); -} - -internal U64 -dw_size_from_uleb128(U64 v) -{ - U8 buffer[10]; - return dw_write_to_buffer_uleb128(buffer, v); -} - -internal U64 -dw_size_from_sleb128(S64 v) -{ - U8 buffer[10]; - return dw_write_to_buffer_sleb128(buffer, v); -} - -internal void * -dw_serial_push_length(Arena *arena, String8List *srl, DW_Format format, U64 length) -{ - void *result; - if (format == DW_Format_64Bit) { - U8 buffer[sizeof(U32) + sizeof(U64)]; - MemorySet(&buffer[0], 0xff, sizeof(U32)); - MemoryCopy(buffer + sizeof(U32), &length, sizeof(length)); - result = str8_serial_push_string(arena, srl, str8_array_fixed(buffer)); - } else { - result = str8_serial_push_string(arena, srl, str8((U8 *)&length, sizeof(U32))); - } - return result; -} - -internal void * -dw_serial_push_uint(Arena *arena, String8List *srl, DW_Format format, U64 v) -{ - String8 uint; - if (format == DW_Format_64Bit) { - U64 *ptr = push_array(arena, U64, 1); - *ptr = v; - uint = str8((U8 *)ptr, sizeof(*ptr)); - } else { - U32 *ptr = push_array(arena, U32, 1); - *ptr = safe_cast_u32(v); - uint = str8((U8 *)ptr, sizeof(*ptr)); - } - return str8_serial_push_string(arena, srl, uint); -} - -internal void * -dw_serial_push_uleb128(Arena *arena, String8List *srl, U64 v) -{ - U8 buffer[10]; - U64 buffer_size = dw_write_to_buffer_uleb128(buffer, v); - return str8_serial_push_string(arena, srl, str8(buffer, buffer_size)); -} - -internal void * -dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v) -{ - U8 buffer[10]; - U64 buffer_size = dw_write_to_buffer_sleb128(buffer, v); - return str8_serial_push_string(arena, srl, str8(buffer, buffer_size)); -} - -internal B32 -dw_form_match(DW_Form a, DW_Form b) -{ - B32 is_match = 0; - - if (a.kind == b.kind) { - switch (a.kind) { - case DW_Form_Null: {} break; - - case DW_Form_Addr: { is_match = str8_match(a.addr, b.addr, 0); } break; - case DW_Form_String: { is_match = str8_match(a.string, b.string, 0); } break; - case DW_Form_ExprLoc: { is_match = str8_match(a.exprloc, b.exprloc, 0); } break; - - case DW_Form_Block: - case DW_Form_Block1: - case DW_Form_Block2: - case DW_Form_Block4: { - is_match = str8_match(a.block, b.block, 0); - } break; - - case DW_Form_Data1: - case DW_Form_Data2: - case DW_Form_Data4: - case DW_Form_Data8: - case DW_Form_Data16: { - is_match = str8_match(a.data, b.data, 0); - } break; - - case DW_Form_Flag: { is_match = a.flag == b.flag; } break; - case DW_Form_SData: { is_match = a.sdata == b.sdata; } break; - case DW_Form_UData: { is_match = a.udata == b.udata; } break; - - case DW_Form_RefAddr: - case DW_Form_Ref1: - case DW_Form_Ref2: - case DW_Form_Ref4: - case DW_Form_Ref8: - case DW_Form_RefUData: - case DW_Form_GNU_RefAlt: { - is_match = a.ref == b.ref; - } break; - - case DW_Form_Indirect: { NotImplemented; } break; - - case DW_Form_SecOffset: - case DW_Form_LineStrp: - case DW_Form_GNU_StrpAlt: { - is_match = a.sec_offset == b.sec_offset; - } break; - - case DW_Form_ImplicitConst: { is_match = a.implicit_const, b.implicit_const; } break; - - case DW_Form_Strx: - case DW_Form_Strx1: - case DW_Form_Strx2: - case DW_Form_Strx3: - case DW_Form_Strx4: - case DW_Form_Addrx: - case DW_Form_Addrx1: - case DW_Form_Addrx2: - case DW_Form_Addrx3: - case DW_Form_Addrx4: - case DW_Form_RngListx: - case DW_Form_LocListx: { - is_match = a.xval == b.xval; - } break; - - case DW_Form_StrpSup: { is_match = a.strp_sup == b.strp_sup; } break; - - case DW_Form_RefSup4: { NotImplemented; } break; - case DW_Form_RefSup8: { NotImplemented; } break; - - default: { InvalidPath; } break; - } - } - - return is_match; -} - -internal U64 -dw_length_from_std_opcode(DW_StdOpcode opcode) -{ - switch (opcode) { - case DW_StdOpcode_ExtendedOpcode: return 0; - case DW_StdOpcode_Copy: return 0; - case DW_StdOpcode_AdvancePc: return 1; - case DW_StdOpcode_AdvanceLine: return 1; - case DW_StdOpcode_SetFile: return 1; - case DW_StdOpcode_SetColumn: return 1; - case DW_StdOpcode_NegateStmt: return 0; - case DW_StdOpcode_SetBasicBlock: return 0; - case DW_StdOpcode_ConstAddPc: return 0; - case DW_StdOpcode_FixedAdvancePc: return 1; - case DW_StdOpcode_SetPrologueEnd: return 0; - case DW_StdOpcode_SetEpilogueBegin: return 0; - case DW_StdOpcode_SetIsa: return 1; - default: InvalidPath; break; - } - return 0; -} - +#endif diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index 804deee1..c8bedf7f 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -4,1795 +4,81 @@ #ifndef DWARF_H #define DWARF_H -typedef U16 DW_Version; -typedef enum DW_VersionEnum -{ - DW_Version_Null, - DW_Version_1, - DW_Version_2, - DW_Version_3, - DW_Version_4, - DW_Version_5, - DW_Version_Last = DW_Version_5 -} DW_VersionEnum; - -typedef U64 DW_Ext; -typedef enum DW_ExtEnum -{ - DW_Ext_Null, - - DW_Ext_GNU = (1 << 0), - DW_Ext_LLVM = (1 << 1), - DW_Ext_APPLE = (1 << 2), - DW_Ext_MIPS = (1 << 3), - - DW_Ext_All = DW_Ext_GNU|DW_Ext_LLVM|DW_Ext_APPLE|DW_Ext_MIPS, -} DW_ExtEnum; - -typedef enum DW_Format -{ - DW_Format_Null, - DW_Format_32Bit, - DW_Format_64Bit -} DW_Format; - -#define DW_SentinelFromSize(address_size) ((address_size) == 4 ? max_U32 : (address_size) == 8 ? max_U64 : 0) - -#define DW_SectionKind_XList \ -X(Null, "", "", "" ) \ -X(Abbrev, ".debug_abbrev", "__debug_abbrev", ".debug_abbrev.dwo" ) \ -X(ARanges, ".debug_aranges", "__debug_aranges", ".debug_aranges.dwo" ) \ -X(Frame, ".debug_frame", "__debug_frame", ".debug_frame.dwo" ) \ -X(Info, ".debug_info", "__debug_info", ".debug_info.dwo" ) \ -X(Line, ".debug_line", "__debug_line", ".debug_line.dwo" ) \ -X(Loc, ".debug_loc", "__debug_loc", ".debug_loc.dwo" ) \ -X(MacInfo, ".debug_macinfo", "__debug_macinfo", ".debug_macinfo.dwo" ) \ -X(PubNames, ".debug_pubnames", "__debug_pubnames", ".debug_pubnames.dwo" ) \ -X(PubTypes, ".debug_pubtypes", "__debug_pubtypes", ".debug_pubtypes.dwo" ) \ -X(Ranges, ".debug_ranges", "__debug_ranges", ".debug_ranges.dwo" ) \ -X(Str, ".debug_str", "__debug_str", ".debug_str.dwo" ) \ -X(Addr, ".debug_addr", "__debug_addr", ".debug_addr.dwo" ) \ -X(LocLists, ".debug_loclists", "__debug_loclists", ".debug_loclists.dwo" ) \ -X(RngLists, ".debug_rnglists", "__debug_rnglists", ".debug_rnglists.dwo" ) \ -X(StrOffsets, ".debug_str_offsets", "__debug_str_offsets", ".debug_str_offsets.dwo") \ -X(LineStr, ".debug_line_str", "__debug_line_str", ".debug_line_str.dwo" ) \ -X(Names, ".debug_names", "__debug_names", ".debug_names.dwo" ) - -typedef U64 DW_SectionKind; -typedef enum DW_SectionKindEnum -{ -#define X(_N,...) DW_Section_##_N, - DW_SectionKind_XList -#undef X - DW_Section_COUNT -} DW_SectionKindEnum; - -typedef U32 DW_SectionFlags; -enum -{ -#define X(_N, ...) DW_SectionFlag_##_N = (1 << DW_Section_##_N), - DW_SectionKind_XList -#undef X - DW_SectionFlag_All = 0xffffffffu, -}; - -#define DW_Language_XList \ -X(Null, 0x00) \ -X(C89, 0x01) \ -X(C, 0x02) \ -X(Ada83, 0x03) \ -X(CPlusPlus, 0x04) \ -X(Cobol74, 0x05) \ -X(Cobol85, 0x06) \ -X(Fortran77, 0x07) \ -X(Fortran90, 0x08) \ -X(Pascal83, 0x09) \ -X(Modula2, 0x0A) \ -X(Java, 0x0B) \ -X(C99, 0x0C) \ -X(Ada95, 0x0D) \ -X(Fortran95, 0x0E) \ -X(PLI, 0x0F) \ -X(ObjC, 0x10) \ -X(ObjCPlusPlus, 0x11) \ -X(UPC, 0x12) \ -X(D, 0x13) \ -X(Python, 0x14) \ -X(OpenCL, 0x15) \ -X(Go, 0x16) \ -X(Modula3, 0x17) \ -X(Haskell, 0x18) \ -X(CPlusPlus03, 0x19) \ -X(CPlusPlus11, 0x1a) \ -X(OCaml, 0x1b) \ -X(Rust, 0x1c) \ -X(C11, 0x1d) \ -X(Swift, 0x1e) \ -X(Julia, 0x1f) \ -X(Dylan, 0x20) \ -X(CPlusPlus14, 0x21) \ -X(Fortran03, 0x22) \ -X(Fortran08, 0x23) \ -X(RenderScript, 0x24) \ -X(BLISS, 0x25) \ -X(MipsAssembler, 0x8001) \ -X(GoogleRenderScript, 0x8E57) \ -X(SunAssembler, 0x9001) \ -X(BorlandDelphi, 0xB000) - -typedef U32 DW_Language; -typedef enum DW_LanguageEnum -{ -#define X(_N, _ID) DW_Language_##_N = _ID, - DW_Language_XList -#undef X - DW_Language_UserLo = 0x8000, - DW_Language_UserHi = 0xffff, -} DW_LanguageEnum; - -#define DW_Inl_XList \ -X(NotInlined, 0x00) \ -X(Inlined, 0x01) \ -X(DeclaredNotInlined, 0x02) \ -X(DeclaredInlined, 0x03) - -typedef U32 DW_InlKind; -typedef enum DW_InlKindEnum -{ -#define X(_N,_ID) DW_Inl_##_N = _ID, - DW_Inl_XList -#undef X -} DW_InlKindEnum; - -#define DW_StdOpcode_XList \ -X(ExtendedOpcode, 0x00) \ -X(Copy, 0x01) \ -X(AdvancePc, 0x02) \ -X(AdvanceLine, 0x03) \ -X(SetFile, 0x04) \ -X(SetColumn, 0x05) \ -X(NegateStmt, 0x06) \ -X(SetBasicBlock, 0x07) \ -X(ConstAddPc, 0x08) \ -X(FixedAdvancePc, 0x09) \ -X(SetPrologueEnd, 0x0A) \ -X(SetEpilogueBegin, 0x0B) \ -X(SetIsa, 0x0C) - -typedef U8 DW_StdOpcode; -typedef enum DW_StdOpcodeEnum -{ -#define X(_N,_ID) DW_StdOpcode_##_N = _ID, - DW_StdOpcode_XList -#undef X - DW_StdOpcode_Count, -} DW_StdOpcodeEnum; - -#define DW_ExtOpcode_XList \ -X(Undefined, 0x00) \ -X(EndSequence, 0x01) \ -X(SetAddress, 0x02) \ -X(DefineFile, 0x03) \ -X(SetDiscriminator, 0x04) \ -X(UserLo, 0x80) \ -X(UserHi, 0xff) - -typedef U8 DW_ExtOpcode; -typedef enum DW_ExtOpcodeEnum -{ -#define X(_N,_ID) DW_ExtOpcode_##_N = _ID, - DW_ExtOpcode_XList -#undef X -} DW_ExtOpcodeEnum; - -#define DW_IDCaseKind_XList \ -X(CaseSensitive, 0x00) \ -X(UpCase, 0x01) \ -X(DownCase, 0x02) \ -X(CaseInsensitive, 0x03) - -typedef U64 DW_IDCaseKind; -typedef enum DW_IDCaseKindEnum -{ -#define X(_N,_ID) DW_IDCase_##_N = _ID, - DW_IDCaseKind_XList -#undef X -} DW_IDCaseKindEnum; - -#define DW_Vis_XList \ -X(Local, 0x01) \ -X(Exported, 0x02) \ -X(Qualified, 0x03) -typedef enum DW_Vis -{ -#define X(_N, _ID) DW_Vis_##_N = _ID, - DW_Vis_XList -#undef X -} DW_Vis; - -#define DW_TagKind_V3_XList \ -X(ArrayType, 0x01) \ -X(ClassType, 0x02) \ -X(EntryPoint, 0x03) \ -X(EnumerationType, 0x04) \ -X(FormalParameter, 0x05) \ -X(ImportedDeclaration, 0x08) \ -X(Label, 0x0a) \ -X(LexicalBlock, 0x0b) \ -X(Member, 0x0d) \ -X(PointerType, 0x0f) \ -X(ReferenceType, 0x10) \ -X(CompileUnit, 0x11) \ -X(StringType, 0x12) \ -X(StructureType, 0x13) \ -X(SubroutineType, 0x15) \ -X(Typedef, 0x16) \ -X(UnionType, 0x17) \ -X(UnspecifiedParameters, 0x18) \ -X(Variant, 0x19) \ -X(CommonBlock, 0x1a) \ -X(CommonInclusion, 0x1b) \ -X(Inheritance, 0x1c) \ -X(InlinedSubroutine, 0x1d) \ -X(Module, 0x1e) \ -X(PtrToMemberType, 0x1f) \ -X(SetType, 0x20) \ -X(SubrangeType, 0x21) \ -X(WithStmt, 0x22) \ -X(AccessDeclaration, 0x23) \ -X(BaseType, 0x24) \ -X(CatchBlock, 0x25) \ -X(ConstType, 0x26) \ -X(Constant, 0x27) \ -X(Enumerator, 0x28) \ -X(FileType, 0x29) \ -X(Friend, 0x2a) \ -X(NameList, 0x2b) \ -X(NameListItem, 0x2c) \ -X(PackedType, 0x2d) \ -X(SubProgram, 0x2e) \ -X(TemplateTypeParameter, 0x2f) \ -X(TemplateValueParameter, 0x30) \ -X(ThrownType, 0x31) \ -X(TryBlock, 0x32) \ -X(VariantPart, 0x33) \ -X(Variable, 0x34) \ -X(VolatileType, 0x35) \ -X(DwarfProcedure, 0x36) \ -X(RestrictType, 0x37) \ -X(InterfaceType, 0x38) \ -X(Namespace, 0x39) \ -X(ImportedModule, 0x3a) \ -X(UnspecifiedType, 0x3b) \ -X(PartialUnit, 0x3c) \ -X(ImportedUnit, 0x3d) \ -X(Condition, 0x3f) \ -X(SharedType, 0x40) - -#define DW_TagKind_V5_XList \ -X(TypeUnit, 0x41) \ -X(RValueReferenceType, 0x42) \ -X(TemplateAlias, 0x43) \ -X(CoarrayType, 0x44) \ -X(GenericSubrange, 0x45) \ -X(DynamicType, 0x46) \ -X(AtomicType, 0x47) \ -X(CallSite, 0x48) \ -X(CallSiteParameter, 0x49) \ -X(SkeletonUnit, 0x4A) \ -X(ImmutableType, 0x4B) - -#define DW_TagKind_GNU_XList \ -X(GNU_CallSite, 0x4109) \ -X(GNU_CallSiteParameter, 0x410a) - -typedef U64 DW_TagKind; -typedef enum DW_TagKindEnum -{ - DW_TagKind_Null, -#define X(_N,_ID) DW_TagKind_##_N = _ID, - DW_TagKind_V3_XList - DW_TagKind_V5_XList - DW_TagKind_GNU_XList -#undef X - DW_TagKind_UserLo = 0x4080, - DW_TagKind_UserHi = 0xffff -} DW_TagKindEnum; - -//- Attrib Class Encodings - -#define DW_AttribClass_V3_XList \ -X(Null, 0) \ -X(Undefined, 1) \ -X(Address, 2) \ -X(Block, 3) \ -X(Const, 4) \ -X(ExprLoc, 5) \ -X(Flag, 6) \ -X(LinePtr, 7) \ -X(LocListPtr, 8) \ -X(MacPtr, 9) \ -X(RngListPtr, 10) \ -X(Reference, 11) \ -X(String, 12) - -#define DW_AttribClass_V4_XList \ -X(LocList, 13) \ -X(RngList, 14) - -#define DW_AttribClass_V5_XList \ -X(StrOffsetsPtr, 15) \ -X(AddrPtr, 16) - -typedef U32 DW_AttribClass; -typedef enum DW_AttribClassEnum -{ -#define X(_N,_ID) DW_AttribClass_##_N = (1 << _ID), - DW_AttribClass_V3_XList - DW_AttribClass_V4_XList - DW_AttribClass_V5_XList -#undef X - DW_AttribClass_AllPtrs = DW_AttribClass_AddrPtr|DW_AttribClass_LinePtr|DW_AttribClass_LocList|DW_AttribClass_LocListPtr| DW_AttribClass_MacPtr| DW_AttribClass_RngList| DW_AttribClass_RngListPtr| DW_AttribClass_StrOffsetsPtr, -} DW_AttribClassEnum; - -//- Form Encodings - -#define DW_Form_V2_XList \ -X(Addr, 0x1) \ -X(Block2, 0x3) \ -X(Block4, 0x4) \ -X(Data2, 0x5) \ -X(Data4, 0x6) \ -X(Data8, 0x7) \ -X(String, 0x8) \ -X(Block, 0x9) \ -X(Block1, 0xa) \ -X(Data1, 0xb) \ -X(Flag, 0xc) \ -X(SData, 0xd) \ -X(Strp, 0xe) \ -X(UData, 0xf) \ -X(RefAddr, 0x10) \ -X(Ref1, 0x11) \ -X(Ref2, 0x12) \ -X(Ref4, 0x13) \ -X(Ref8, 0x14) \ -X(RefUData, 0x15) \ -X(Indirect, 0x16) - -#define DW_Form_AttribClass_V2_XList \ -X(Addr, DW_AttribClass_Address) \ -X(Block2, DW_AttribClass_Block) \ -X(Block4, DW_AttribClass_Block) \ -X(Data2, DW_AttribClass_Const) \ -X(Data4, DW_AttribClass_Const) \ -X(Data8, DW_AttribClass_Const) \ -X(String, DW_AttribClass_String) \ -X(Block, DW_AttribClass_Block) \ -X(Block1, DW_AttribClass_Block) \ -X(Data1, DW_AttribClass_Const) \ -X(Flag, DW_AttribClass_Flag) \ -X(SData, DW_AttribClass_Const) \ -X(Strp, DW_AttribClass_String) \ -X(UData, DW_AttribClass_Const) \ -X(RefAddr, DW_AttribClass_Reference) \ -X(Ref1, DW_AttribClass_Reference) \ -X(Ref2, DW_AttribClass_Reference) \ -X(Ref4, DW_AttribClass_Reference) \ -X(Ref8, DW_AttribClass_Reference) \ -X(RefUData, DW_AttribClass_Reference) \ -X(Indirect, DW_AttribClass_Null) - -#define DW_Form_V4_XList \ -X(SecOffset, 0x17) \ -X(ExprLoc, 0x18) \ -X(FlagPresent, 0x19) \ -X(RefSig8, 0x20) - -#define DW_Form_AttribClass_V4_XList \ -X(Addr, DW_AttribClass_Address) \ -X(Block2, DW_AttribClass_Block) \ -X(Block4, DW_AttribClass_Block) \ -X(Data2, DW_AttribClass_Const) \ -X(Data4, DW_AttribClass_Const) \ -X(Data8, DW_AttribClass_Const) \ -X(String, DW_AttribClass_String) \ -X(Block, DW_AttribClass_Block) \ -X(Block1, DW_AttribClass_Block) \ -X(Data1, DW_AttribClass_Const) \ -X(Flag, DW_AttribClass_Flag) \ -X(SData, DW_AttribClass_Const) \ -X(Strp, DW_AttribClass_String) \ -X(UData, DW_AttribClass_Const) \ -X(RefAddr, DW_AttribClass_Reference) \ -X(Ref1, DW_AttribClass_Reference) \ -X(Ref2, DW_AttribClass_Reference) \ -X(Ref4, DW_AttribClass_Reference) \ -X(Ref8, DW_AttribClass_Reference) \ -X(RefUData, DW_AttribClass_Reference) \ -X(Indirect, DW_AttribClass_Null) \ -X(SecOffset, DW_AttribClass_LinePtr|DW_AttribClass_LocListPtr|DW_AttribClass_MacPtr|DW_AttribClass_RngListPtr) \ -X(ExprLoc, DW_AttribClass_ExprLoc) \ -X(FlagPresent, DW_AttribClass_Flag) \ -X(RefSig8, DW_AttribClass_Reference) - -#define DW_Form_V5_XList \ -X(Strx, 0x1a) \ -X(Addrx, 0x1b) \ -X(RefSup4, 0x1c) \ -X(StrpSup, 0x1d) \ -X(Data16, 0x1e) \ -X(LineStrp, 0x1f) \ -X(ImplicitConst, 0x21) \ -X(LocListx, 0x22) \ -X(RngListx, 0x23) \ -X(RefSup8, 0x24) \ -X(Strx1, 0x25) \ -X(Strx2, 0x26) \ -X(Strx3, 0x27) \ -X(Strx4, 0x28) \ -X(Addrx1, 0x29) \ -X(Addrx2, 0x2a) \ -X(Addrx3, 0x2b) \ -X(Addrx4, 0x2c) - -#define DW_Form_AttribClass_V5_XList \ -X(Addr, DW_AttribClass_Address) \ -X(Block2, DW_AttribClass_Block) \ -X(Block4, DW_AttribClass_Block) \ -X(Data2, DW_AttribClass_Const) \ -X(Data4, DW_AttribClass_Const) \ -X(Data8, DW_AttribClass_Const) \ -X(String, DW_AttribClass_String) \ -X(Block, DW_AttribClass_Block) \ -X(Block1, DW_AttribClass_Block) \ -X(Data1, DW_AttribClass_Const) \ -X(Flag, DW_AttribClass_Flag) \ -X(SData, DW_AttribClass_Const) \ -X(Strp, DW_AttribClass_String) \ -X(UData, DW_AttribClass_Const) \ -X(RefAddr, DW_AttribClass_Reference) \ -X(Ref1, DW_AttribClass_Reference) \ -X(Ref2, DW_AttribClass_Reference) \ -X(Ref4, DW_AttribClass_Reference) \ -X(Ref8, DW_AttribClass_Reference) \ -X(RefUData, DW_AttribClass_Reference) \ -X(Indirect, DW_AttribClass_Null) \ -X(SecOffset, DW_AttribClass_AllPtrs) \ -X(ExprLoc, DW_AttribClass_ExprLoc) \ -X(FlagPresent, DW_AttribClass_Flag) \ -X(RefSig8, DW_AttribClass_Reference) \ -X(Strx, DW_AttribClass_String) \ -X(Addrx, DW_AttribClass_Address) \ -X(RefSup4, DW_AttribClass_Reference) \ -X(StrpSup, DW_AttribClass_String) \ -X(Data16, DW_AttribClass_Const) \ -X(LineStrp, DW_AttribClass_String) \ -X(ImplicitConst, DW_AttribClass_Const) \ -X(LocListx, DW_AttribClass_LocListPtr) \ -X(RngListx, DW_AttribClass_RngList) \ -X(RefSup8, DW_AttribClass_Reference) \ -X(Strx1, DW_AttribClass_String) \ -X(Strx2, DW_AttribClass_String) \ -X(Strx3, DW_AttribClass_String) \ -X(Strx4, DW_AttribClass_String) \ -X(Addrx1, DW_AttribClass_Address) \ -X(Addrx2, DW_AttribClass_Address) \ -X(Addrx3, DW_AttribClass_Address) \ -X(Addrx4, DW_AttribClass_Address) - -#define DW_Form_GNU_XList \ -X(GNU_AddrIndex, 0x1f01) \ -X(GNU_StrIndex, 0x1f02) \ -X(GNU_RefAlt, 0x1f20) \ -X(GNU_StrpAlt, 0x1f21) - -#define DW_Form_AttribClass_GNU_XList \ -X(GNU_AddrIndex, DW_AttribClass_Undefined) \ -X(GNU_StrIndex, DW_AttribClass_Undefined) \ -X(GNU_RefAlt, DW_AttribClass_Undefined) \ -X(GNU_StrpAlt, DW_AttribClass_String) - -typedef U64 DW_FormKind; -typedef enum DW_FormKindEnum -{ - DW_Form_Null, -#define X(_N, _ID) DW_Form_##_N = _ID, - DW_Form_V2_XList - DW_Form_V4_XList - DW_Form_V5_XList - DW_Form_GNU_XList -#undef X -} DW_FormKindEnum; - -typedef struct DW_Form -{ - DW_FormKind kind; - union { - String8 addr; - String8 block; - String8 data; - String8 string; - String8 exprloc; - B8 flag; - S64 sdata; - U64 udata; - U64 sec_offset; - U64 ref; - U64 strp_sup; - U64 xval; - U64 addrx; - U64 strx; - U64 rnglistx; - U64 ptr; - S64 implicit_const; - }; -} DW_Form; - -//- Attributes DWARF2 - -#define DW_AttribKind_V2_XList \ -X(Sibling, 0x1) \ -X(Location, 0x2) \ -X(Name, 0x3) \ -X(Ordering, 0x9) \ -X(ByteSize, 0xB) \ -X(BitOffset, 0xC) \ -X(BitSize, 0xD) \ -X(StmtList, 0x10) \ -X(LowPc, 0x11) \ -X(HighPc, 0x12) \ -X(Language, 0x13) \ -X(Discr, 0x15) \ -X(DiscrValue, 0x16) \ -X(Visibility, 0x17) \ -X(Import, 0x18) \ -X(StringLength, 0x19) \ -X(CommonReference, 0x1a) \ -X(CompDir, 0x1b) \ -X(ConstValue, 0x1c) \ -X(ContainingType, 0x1d) \ -X(DefaultValue, 0x1e) \ -X(Inline, 0x20) \ -X(IsOptional, 0x21) \ -X(LowerBound, 0x22) \ -X(Producer, 0x25) \ -X(Prototyped, 0x27) \ -X(ReturnAddr, 0x2a) \ -X(StartScope, 0x2c) \ -X(BitStride, 0x2e) \ -X(UpperBound, 0x2f) \ -X(AbstractOrigin, 0x31) \ -X(Accessibility, 0x32) \ -X(AddressClass, 0x33) \ -X(Artificial, 0x34) \ -X(BaseTypes, 0x35) \ -X(CallingConvention, 0x36) \ -X(Count, 0x37) \ -X(DataMemberLocation, 0x38) \ -X(DeclColumn, 0x39) \ -X(DeclFile, 0x3a) \ -X(DeclLine, 0x3b) \ -X(Declaration, 0x3c) \ -X(DiscrList, 0x3d) \ -X(Encoding, 0x3e) \ -X(External, 0x3f) \ -X(FrameBase, 0x40) \ -X(Friend, 0x41) \ -X(IdentifierCase, 0x42) \ -X(MacroInfo, 0x43) \ -X(NameListItem, 0x44) \ -X(Priority, 0x45) \ -X(Segment, 0x46) \ -X(Specification, 0x47) \ -X(StaticLink, 0x48) \ -X(Type, 0x49) \ -X(UseLocation, 0x4a) \ -X(VariableParameter, 0x4b) \ -X(Virtuality, 0x4c) \ -X(VTableElemLocation, 0x4d) - -#define DW_AttribKind_ClassFlags_V2_XList \ -X(Sibling, DW_AttribClass_Reference) \ -X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Name, DW_AttribClass_String) \ -X(Ordering, DW_AttribClass_Const) \ -X(ByteSize, DW_AttribClass_Const) \ -X(BitOffset, DW_AttribClass_Const) \ -X(BitSize, DW_AttribClass_Const) \ -X(StmtList, DW_AttribClass_Const) \ -X(LowPc, DW_AttribClass_Address) \ -X(HighPc, DW_AttribClass_Address) \ -X(Language, DW_AttribClass_Const) \ -X(Discr, DW_AttribClass_Reference) \ -X(DiscrValue, DW_AttribClass_Const) \ -X(Visibility, DW_AttribClass_Const) \ -X(Import, DW_AttribClass_Reference) \ -X(StringLength, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(CommonReference, DW_AttribClass_Reference) \ -X(CompDir, DW_AttribClass_String) \ -X(ConstValue, DW_AttribClass_String|DW_AttribClass_Const|DW_AttribClass_Block) \ -X(ContainingType, DW_AttribClass_Reference) \ -X(DefaultValue, DW_AttribClass_Reference) \ -X(Inline, DW_AttribClass_Const) \ -X(IsOptional, DW_AttribClass_Flag) \ -X(LowerBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(Producer, DW_AttribClass_String) \ -X(Prototyped, DW_AttribClass_Flag) \ -X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(StartScope, DW_AttribClass_Const) \ -X(BitStride, DW_AttribClass_Const) /* dwarf-v1 DW_AttribKind_stride_size*/ \ -X(UpperBound, DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(AbstractOrigin, DW_AttribClass_Reference) \ -X(Accessibility, DW_AttribClass_Const) \ -X(AddressClass, DW_AttribClass_Const) \ -X(Artificial, DW_AttribClass_Flag) \ -X(BaseTypes, DW_AttribClass_Reference) \ -X(CallingConvention, DW_AttribClass_Const) \ -X(Count, DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Reference) \ -X(DeclColumn, DW_AttribClass_Const) \ -X(DeclFile, DW_AttribClass_Const) \ -X(DeclLine, DW_AttribClass_Const) \ -X(Declaration, DW_AttribClass_Flag) \ -X(DiscrList, DW_AttribClass_Block) \ -X(Encoding, DW_AttribClass_Const) \ -X(External, DW_AttribClass_Flag) \ -X(FrameBase, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(Friend, DW_AttribClass_Reference) \ -X(IdentifierCase, DW_AttribClass_Const) \ -X(MacroInfo, DW_AttribClass_Const) \ -X(NameListItem, DW_AttribClass_Block) \ -X(Priority, DW_AttribClass_Reference) \ -X(Segment, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(Specification, DW_AttribClass_Reference) \ -X(StaticLink, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(Type, DW_AttribClass_Reference) \ -X(UseLocation, DW_AttribClass_Block|DW_AttribClass_Const) \ -X(VariableParameter, DW_AttribClass_Flag) \ -X(Virtuality, DW_AttribClass_Const) \ -X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_Reference) - -//- Attributes DWARF3 - -#define DW_AttribKind_V3_XList \ -X(Allocated, 0x4e) \ -X(Associated, 0x4f) \ -X(DataLocation, 0x50) \ -X(ByteStride, 0x51) \ -X(EntryPc, 0x52) \ -X(UseUtf8, 0x53) \ -X(Extension, 0x54) \ -X(Ranges, 0x55) \ -X(Trampoline, 0x56) \ -X(CallColumn, 0x57) \ -X(CallFile, 0x58) \ -X(CallLine, 0x59) \ -X(Description, 0x5a) \ -X(BinaryScale, 0x5b) \ -X(DecimalScale, 0x5c) \ -X(Small, 0x5d) \ -X(DecimalSign, 0x5e) \ -X(DigitCount, 0x5f) \ -X(PictureString, 0x60) \ -X(Mutable, 0x61) \ -X(ThreadsScaled, 0x62) \ -X(Explicit, 0x63) \ -X(ObjectPointer, 0x64) \ -X(Endianity, 0x65) \ -X(Elemental, 0x66) \ -X(Pure, 0x67) \ -X(Recursive, 0x68) - -#define DW_AttribKind_ClassFlags_V3_XList \ -X(Sibling, DW_AttribClass_Reference) \ -X(Location, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Name, DW_AttribClass_String) \ -X(Ordering, DW_AttribClass_Const) \ -X(ByteSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(BitOffset, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(BitSize, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(StmtList, DW_AttribClass_LinePtr) \ -X(LowPc, DW_AttribClass_Address) \ -X(HighPc, DW_AttribClass_Address) \ -X(Language, DW_AttribClass_Const) \ -X(Discr, DW_AttribClass_Reference) \ -X(DiscrValue, DW_AttribClass_Const) \ -X(Visibility, DW_AttribClass_Const) \ -X(Import, DW_AttribClass_Reference) \ -X(StringLength, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(CommonReference, DW_AttribClass_Reference) \ -X(CompDir, DW_AttribClass_String) \ -X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ -X(ContainingType, DW_AttribClass_Reference) \ -X(DefaultValue, DW_AttribClass_Reference) \ -X(Inline, DW_AttribClass_Const) \ -X(IsOptional, DW_AttribClass_Flag) \ -X(LowerBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(Producer, DW_AttribClass_String) \ -X(Prototyped, DW_AttribClass_Flag) \ -X(ReturnAddr, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(StartScope, DW_AttribClass_Const) \ -X(BitStride, DW_AttribClass_Const) \ -X(UpperBound, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(AbstractOrigin, DW_AttribClass_Reference) \ -X(Accessibility, DW_AttribClass_Const) \ -X(AddressClass, DW_AttribClass_Const) \ -X(Artificial, DW_AttribClass_Flag) \ -X(BaseTypes, DW_AttribClass_Reference) \ -X(CallingConvention, DW_AttribClass_Const) \ -X(Count, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_LocListPtr) \ -X(DeclColumn, DW_AttribClass_Const) \ -X(DeclFile, DW_AttribClass_Const) \ -X(DeclLine, DW_AttribClass_Const) \ -X(Declaration, DW_AttribClass_Flag) \ -X(DiscrList, DW_AttribClass_Block) \ -X(Encoding, DW_AttribClass_Const) \ -X(External, DW_AttribClass_Flag) \ -X(FrameBase, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Friend, DW_AttribClass_Reference) \ -X(IdentifierCase, DW_AttribClass_Const) \ -X(MacroInfo, DW_AttribClass_MacPtr) \ -X(NameListItem, DW_AttribClass_Block) \ -X(Priority, DW_AttribClass_Reference) \ -X(Segment, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Specification, DW_AttribClass_Reference) \ -X(StaticLink, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Type, DW_AttribClass_Reference) \ -X(UseLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(VariableParameter, DW_AttribClass_Flag) \ -X(Virtuality, DW_AttribClass_Const) \ -X(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr) \ -X(Allocated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(Associated, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(DataLocation, DW_AttribClass_Block) \ -X(ByteStride, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference) \ -X(EntryPc, DW_AttribClass_Address) \ -X(UseUtf8, DW_AttribClass_Flag) \ -X(Extension, DW_AttribClass_Reference) \ -X(Ranges, DW_AttribClass_RngListPtr) \ -X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ -X(CallColumn, DW_AttribClass_Const) \ -X(CallFile, DW_AttribClass_Const) \ -X(CallLine, DW_AttribClass_Const) \ -X(Description, DW_AttribClass_String) \ -X(BinaryScale, DW_AttribClass_Const) \ -X(DecimalScale, DW_AttribClass_Const) \ -X(Small, DW_AttribClass_Reference) \ -X(DecimalSign, DW_AttribClass_Const) \ -X(DigitCount, DW_AttribClass_Const) \ -X(PictureString, DW_AttribClass_String) \ -X(Mutable, DW_AttribClass_Flag) \ -X(ThreadsScaled, DW_AttribClass_Flag) \ -X(Explicit, DW_AttribClass_Flag) \ -X(ObjectPointer, DW_AttribClass_Reference) \ -X(Endianity, DW_AttribClass_Const) \ -X(Elemental, DW_AttribClass_Flag) \ -X(Pure, DW_AttribClass_Flag) \ -X(Recursive, DW_AttribClass_Flag) - -//- Attributes DWARF4 - -#define DW_AttribKind_V4_XList \ -X(Signature, 0x69) \ -X(MainSubProgram, 0x6a) \ -X(DataBitOffset, 0x6b) \ -X(ConstExpr, 0x6c) \ -X(EnumClass, 0x6d) \ -X(LinkageName, 0x6e) - -#define DW_AttribKind_ClassFlags_V4_XList \ -X(Sibling, DW_AttribClass_Reference) \ -X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Name, DW_AttribClass_String) \ -X(Ordering, DW_AttribClass_Const) \ -X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(StmtList, DW_AttribClass_LinePtr) \ -X(LowPc, DW_AttribClass_Address) \ -X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ -X(Language, DW_AttribClass_Const) \ -X(Discr, DW_AttribClass_Reference) \ -X(DiscrValue, DW_AttribClass_Const) \ -X(Visibility, DW_AttribClass_Const) \ -X(Import, DW_AttribClass_Reference) \ -X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(CommonReference, DW_AttribClass_Reference) \ -X(CompDir, DW_AttribClass_String) \ -X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ -X(ContainingType, DW_AttribClass_Reference) \ -X(DefaultValue, DW_AttribClass_Reference) \ -X(Inline, DW_AttribClass_Const) \ -X(IsOptional, DW_AttribClass_Flag) \ -X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(Producer, DW_AttribClass_String) \ -X(Prototyped, DW_AttribClass_Flag) \ -X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ -X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(AbstractOrigin, DW_AttribClass_Reference) \ -X(Accessibility, DW_AttribClass_Const) \ -X(AddressClass, DW_AttribClass_Const) \ -X(Artificial, DW_AttribClass_Flag) \ -X(BaseTypes, DW_AttribClass_Reference) \ -X(CallingConvention, DW_AttribClass_Const) \ -X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(DeclColumn, DW_AttribClass_Const) \ -X(DeclFile, DW_AttribClass_Const) \ -X(DeclLine, DW_AttribClass_Const) \ -X(Declaration, DW_AttribClass_Flag) \ -X(DiscrList, DW_AttribClass_Block) \ -X(Encoding, DW_AttribClass_Const) \ -X(External, DW_AttribClass_Flag) \ -X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Friend, DW_AttribClass_Reference) \ -X(IdentifierCase, DW_AttribClass_Const) \ -X(MacroInfo, DW_AttribClass_MacPtr) \ -X(NameListItem, DW_AttribClass_Reference) \ -X(Priority, DW_AttribClass_Reference) \ -X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Specification, DW_AttribClass_Reference) \ -X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Type, DW_AttribClass_Reference) \ -X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(VariableParameter, DW_AttribClass_Flag) \ -X(Virtuality, DW_AttribClass_Const) \ -X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(DataLocation, DW_AttribClass_ExprLoc) \ -X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(EntryPc, DW_AttribClass_Address) \ -X(UseUtf8, DW_AttribClass_Flag) \ -X(Extension, DW_AttribClass_Reference) \ -X(Ranges, DW_AttribClass_RngListPtr) \ -X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ -X(CallColumn, DW_AttribClass_Const) \ -X(CallFile, DW_AttribClass_Const) \ -X(CallLine, DW_AttribClass_Const) \ -X(Description, DW_AttribClass_String) \ -X(BinaryScale, DW_AttribClass_Const) \ -X(DecimalScale, DW_AttribClass_Const) \ -X(Small, DW_AttribClass_Reference) \ -X(DecimalSign, DW_AttribClass_Const) \ -X(DigitCount, DW_AttribClass_Const) \ -X(PictureString, DW_AttribClass_String) \ -X(Mutable, DW_AttribClass_Flag) \ -X(ThreadsScaled, DW_AttribClass_Flag) \ -X(Explicit, DW_AttribClass_Flag) \ -X(ObjectPointer, DW_AttribClass_Reference) \ -X(Endianity, DW_AttribClass_Const) \ -X(Elemental, DW_AttribClass_Flag) \ -X(Pure, DW_AttribClass_Flag) \ -X(Recursive, DW_AttribClass_Flag) \ -X(Signature, DW_AttribClass_Reference) \ -X(MainSubProgram, DW_AttribClass_Flag) \ -X(DataBitOffset, DW_AttribClass_Const) \ -X(ConstExpr, DW_AttribClass_Flag) \ -X(EnumClass, DW_AttribClass_Flag) \ -X(LinkageName, DW_AttribClass_String) - -//- Attributes DWARF5 - -#define DW_AttribKind_V5_XList \ -X(StringLengthBitSize, 0x6f) \ -X(StringLengthByteSize, 0x70) \ -X(Rank, 0x71) \ -X(StrOffsetsBase, 0x72) \ -X(AddrBase, 0x73) \ -X(RngListsBase, 0x74) \ -X(DwoName, 0x76) \ -X(Reference, 0x77) \ -X(RValueReference, 0x78) \ -X(Macros, 0x79) \ -X(CallAllCalls, 0x7a) \ -X(CallAllSourceCalls, 0x7b) \ -X(CallAllTailCalls, 0x7c) \ -X(CallReturnPc, 0x7d) \ -X(CallValue, 0x7e) \ -X(CallOrigin, 0x7f) \ -X(CallParameter, 0x80) \ -X(CallPc, 0x81) \ -X(CallTailCall, 0x82) \ -X(CallTarget, 0x83) \ -X(CallTargetClobbered, 0x84) \ -X(CallDataLocation, 0x85) \ -X(CallDataValue, 0x86) \ -X(NoReturn, 0x87) \ -X(Alignment, 0x88) \ -X(ExportSymbols, 0x89) \ -X(Deleted, 0x8a) \ -X(Defaulted, 0x8b) \ -X(LocListsBase, 0x8c) - -#define DW_AttribKind_ClassFlags_V5_XList \ -X(Sibling, DW_AttribClass_Reference) \ -X(Location, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(Name, DW_AttribClass_String) \ -X(Ordering, DW_AttribClass_Const) \ -X(ByteSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(BitOffset, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(BitSize, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(StmtList, DW_AttribClass_LinePtr) \ -X(LowPc, DW_AttribClass_Address) \ -X(HighPc, DW_AttribClass_Address|DW_AttribClass_Const) \ -X(Language, DW_AttribClass_Const) \ -X(Discr, DW_AttribClass_Reference) \ -X(DiscrValue, DW_AttribClass_Const) \ -X(Visibility, DW_AttribClass_Const) \ -X(Import, DW_AttribClass_Reference) \ -X(StringLength, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(CommonReference, DW_AttribClass_Reference) \ -X(CompDir, DW_AttribClass_String) \ -X(ConstValue, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String) \ -X(ContainingType, DW_AttribClass_Reference) \ -X(DefaultValue, DW_AttribClass_Reference) \ -X(Inline, DW_AttribClass_Const) \ -X(IsOptional, DW_AttribClass_Flag) \ -X(LowerBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(Producer, DW_AttribClass_String) \ -X(Prototyped, DW_AttribClass_Flag) \ -X(ReturnAddr, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr) \ -X(StartScope, DW_AttribClass_Const|DW_AttribClass_RngListPtr) \ -X(BitStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(UpperBound, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(AbstractOrigin, DW_AttribClass_Reference) \ -X(Accessibility, DW_AttribClass_Const) \ -X(AddressClass, DW_AttribClass_Const) \ -X(Artificial, DW_AttribClass_Flag) \ -X(BaseTypes, DW_AttribClass_Reference) \ -X(CallingConvention, DW_AttribClass_Const) \ -X(Count, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(DeclColumn, DW_AttribClass_Const) \ -X(DeclFile, DW_AttribClass_Const) \ -X(DeclLine, DW_AttribClass_Const) \ -X(Declaration, DW_AttribClass_Flag) \ -X(DiscrList, DW_AttribClass_Block) \ -X(Encoding, DW_AttribClass_Const) \ -X(External, DW_AttribClass_Flag) \ -X(FrameBase, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(Friend, DW_AttribClass_Reference) \ -X(IdentifierCase, DW_AttribClass_Const) \ -X(MacroInfo, DW_AttribClass_MacPtr) \ -X(NameListItem, DW_AttribClass_Reference) \ -X(Priority, DW_AttribClass_Reference) \ -X(Segment, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(Specification, DW_AttribClass_Reference) \ -X(StaticLink, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(Type, DW_AttribClass_Reference) \ -X(UseLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(VariableParameter, DW_AttribClass_Flag) \ -X(Virtuality, DW_AttribClass_Const) \ -X(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocList) \ -X(Allocated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(Associated, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(DataLocation, DW_AttribClass_ExprLoc) \ -X(ByteStride, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference) \ -X(EntryPc, DW_AttribClass_Address|DW_AttribClass_Const) \ -X(UseUtf8, DW_AttribClass_Flag) \ -X(Extension, DW_AttribClass_Reference) \ -X(Ranges, DW_AttribClass_RngList) \ -X(Trampoline, DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \ -X(CallColumn, DW_AttribClass_Const) \ -X(CallFile, DW_AttribClass_Const) \ -X(CallLine, DW_AttribClass_Const) \ -X(Description, DW_AttribClass_String) \ -X(BinaryScale, DW_AttribClass_Const) \ -X(DecimalScale, DW_AttribClass_Const) \ -X(Small, DW_AttribClass_Reference) \ -X(DecimalSign, DW_AttribClass_Const) \ -X(DigitCount, DW_AttribClass_Const) \ -X(PictureString, DW_AttribClass_String) \ -X(Mutable, DW_AttribClass_Flag) \ -X(ThreadsScaled, DW_AttribClass_Flag) \ -X(Explicit, DW_AttribClass_Flag) \ -X(ObjectPointer, DW_AttribClass_Reference) \ -X(Endianity, DW_AttribClass_Const) \ -X(Elemental, DW_AttribClass_Flag) \ -X(Pure, DW_AttribClass_Flag) \ -X(Recursive, DW_AttribClass_Flag) \ -X(Signature, DW_AttribClass_Reference) \ -X(MainSubProgram, DW_AttribClass_Flag) \ -X(DataBitOffset, DW_AttribClass_Const) \ -X(ConstExpr, DW_AttribClass_Flag) \ -X(EnumClass, DW_AttribClass_Flag) \ -X(LinkageName, DW_AttribClass_String) \ -X(StringLengthBitSize, DW_AttribClass_Const) \ -X(StringLengthByteSize, DW_AttribClass_Const) \ -X(Rank, DW_AttribClass_Const|DW_AttribClass_ExprLoc) \ -X(StrOffsetsBase, DW_AttribClass_StrOffsetsPtr) \ -X(AddrBase, DW_AttribClass_AddrPtr) \ -X(RngListsBase, DW_AttribClass_RngListPtr) \ -X(DwoName, DW_AttribClass_String) \ -X(Reference, DW_AttribClass_Flag) \ -X(RValueReference, DW_AttribClass_Flag) \ -X(Macros, DW_AttribClass_MacPtr) \ -X(CallAllCalls, DW_AttribClass_Flag) \ -X(CallAllSourceCalls, DW_AttribClass_Flag) \ -X(CallAllTailCalls, DW_AttribClass_Flag) \ -X(CallReturnPc, DW_AttribClass_Address) \ -X(CallValue, DW_AttribClass_ExprLoc) \ -X(CallOrigin, DW_AttribClass_ExprLoc) \ -X(CallParameter, DW_AttribClass_Reference) \ -X(CallPc, DW_AttribClass_Address) \ -X(CallTailCall, DW_AttribClass_Flag) \ -X(CallTarget, DW_AttribClass_ExprLoc) \ -X(CallTargetClobbered, DW_AttribClass_ExprLoc) \ -X(CallDataLocation, DW_AttribClass_ExprLoc) \ -X(CallDataValue, DW_AttribClass_ExprLoc) \ -X(NoReturn, DW_AttribClass_Flag) \ -X(Alignment, DW_AttribClass_Const) \ -X(ExportSymbols, DW_AttribClass_Flag) \ -X(Deleted, DW_AttribClass_Flag) \ -X(Defaulted, DW_AttribClass_Const) \ -X(LocListsBase, DW_AttribClass_LocListPtr) - -//- Attributes GNU - -#define DW_AttribKind_GNU_XList \ -X(GNU_Vector, 0x2107) \ -X(GNU_GuardedBy, 0x2108) \ -X(GNU_PtGuardedBy, 0x2109) \ -X(GNU_Guarded, 0x210a) \ -X(GNU_PtGuarded, 0x210b) \ -X(GNU_LocksExcluded, 0x210c) \ -X(GNU_ExclusiveLocksRequired, 0x210d) \ -X(GNU_SharedLocksRequired, 0x210e) \ -X(GNU_OdrSignature, 0x210f) \ -X(GNU_TemplateName, 0x2110) \ -X(GNU_CallSiteValue, 0x2111) \ -X(GNU_CallSiteDataValue, 0x2112) \ -X(GNU_CallSiteTarget, 0x2113) \ -X(GNU_CallSiteTargetClobbered, 0x2114) \ -X(GNU_TailCall, 0x2115) \ -X(GNU_AllTailCallsSites, 0x2116) \ -X(GNU_AllCallSites, 0x2117) \ -X(GNU_AllSourceCallSites, 0x2118) \ -X(GNU_Macros, 0x2119) \ -X(GNU_Deleted, 0x211a) \ -X(GNU_DwoName, 0x2130) \ -X(GNU_DwoId, 0x2131) \ -X(GNU_RangesBase, 0x2132) \ -X(GNU_AddrBase, 0x2133) \ -X(GNU_PubNames, 0x2134) \ -X(GNU_PubTypes, 0x2135) \ -X(GNU_Discriminator, 0x2136) \ -X(GNU_LocViews, 0x2137) \ -X(GNU_EntryView, 0x2138) \ -X(GNU_DescriptiveType, 0x2302) \ -X(GNU_Numerator, 0x2303) \ -X(GNU_Denominator, 0x2304) \ -X(GNU_Bias, 0x2305) - -#define DW_AttribKind_ClassFlags_GNU_XList \ -X(GNU_Vector, DW_AttribClass_Flag) \ -X(GNU_GuardedBy, DW_AttribClass_Undefined) \ -X(GNU_PtGuardedBy, DW_AttribClass_Undefined) \ -X(GNU_Guarded, DW_AttribClass_Undefined) \ -X(GNU_PtGuarded, DW_AttribClass_Undefined) \ -X(GNU_LocksExcluded, DW_AttribClass_Undefined) \ -X(GNU_ExclusiveLocksRequired, DW_AttribClass_Undefined) \ -X(GNU_SharedLocksRequired, DW_AttribClass_Undefined) \ -X(GNU_OdrSignature, DW_AttribClass_Undefined) \ -X(GNU_TemplateName, DW_AttribClass_Undefined) \ -X(GNU_CallSiteValue, DW_AttribClass_ExprLoc) \ -X(GNU_CallSiteDataValue, DW_AttribClass_ExprLoc) \ -X(GNU_CallSiteTarget, DW_AttribClass_ExprLoc) \ -X(GNU_CallSiteTargetClobbered, DW_AttribClass_ExprLoc) \ -X(GNU_TailCall, DW_AttribClass_Flag) \ -X(GNU_AllTailCallsSites, DW_AttribClass_Flag) \ -X(GNU_AllCallSites, DW_AttribClass_Flag) \ -X(GNU_AllSourceCallSites, DW_AttribClass_Flag) \ -X(GNU_Macros, DW_AttribClass_Flag) \ -X(GNU_Deleted, DW_AttribClass_Undefined) \ -X(GNU_DwoName, DW_AttribClass_String) \ -X(GNU_DwoId, DW_AttribClass_Const) \ -X(GNU_RangesBase, DW_AttribClass_Undefined) \ -X(GNU_AddrBase, DW_AttribClass_AddrPtr) \ -X(GNU_PubNames, DW_AttribClass_Flag) \ -X(GNU_PubTypes, DW_AttribClass_Undefined) \ -X(GNU_Discriminator, DW_AttribClass_Const) \ -X(GNU_LocViews, DW_AttribClass_LocListPtr) \ -X(GNU_EntryView, DW_AttribClass_Undefined) \ -X(GNU_DescriptiveType, DW_AttribClass_Undefined) \ -X(GNU_Numerator, DW_AttribClass_Undefined) \ -X(GNU_Denominator, DW_AttribClass_Undefined) \ -X(GNU_Bias, DW_AttribClass_Undefined) - -//- Attributes LLVM - -#define DW_AttribKind_LLVM_XList \ -X(LLVM_IncludePath, 0x3e00) \ -X(LLVM_ConfigMacros, 0x3e01) \ -X(LLVM_SysRoot, 0x3e02) \ -X(LLVM_TagOffset, 0x3e03) \ -X(LLVM_ApiNotes, 0x3e07) - -#define DW_AttribKind_ClassFlags_LLVM_XList \ -X(LLVM_IncludePath, DW_AttribClass_String) \ -X(LLVM_ConfigMacros, DW_AttribClass_String) \ -X(LLVM_SysRoot, DW_AttribClass_String) \ -X(LLVM_TagOffset, DW_AttribClass_Undefined) \ -X(LLVM_ApiNotes, DW_AttribClass_String) - -//- Attributes Apple - -#define DW_AttribKind_APPLE_XList \ -X(APPLE_Optimized, 0x3fe1) \ -X(APPLE_Flags, 0x3fe2) \ -X(APPLE_Isa, 0x3fe3) \ -X(APPLE_Block, 0x3fe4) \ -X(APPLE_MajorRuntimeVers, 0x3fe5) \ -X(APPLE_RuntimeClass, 0x3fe6) \ -X(APPLE_OmitFramePtr, 0x3fe7) \ -X(APPLE_PropertyName, 0x3fe8) \ -X(APPLE_PropertyGetter, 0x3fe9) \ -X(APPLE_PropertySetter, 0x3fea) \ -X(APPLE_PropertyAttribute, 0x3feb) \ -X(APPLE_ObjcCompleteType, 0x3fec) \ -X(APPLE_Property, 0x3fed) \ -X(APPLE_ObjDirect, 0x3fee) \ -X(APPLE_Sdk, 0x3fef) - -#define DW_AttribKind_ClassFlags_APPLE_XList \ -X(APPLE_Optimized, DW_AttribClass_Flag) \ -X(APPLE_Flags, DW_AttribClass_Flag) \ -X(APPLE_Isa, DW_AttribClass_Flag) \ -X(APPLE_Block, DW_AttribClass_Undefined) \ -X(APPLE_MajorRuntimeVers, DW_AttribClass_Undefined) \ -X(APPLE_RuntimeClass, DW_AttribClass_Undefined) \ -X(APPLE_OmitFramePtr, DW_AttribClass_Flag) \ -X(APPLE_PropertyName, DW_AttribClass_Undefined) \ -X(APPLE_PropertyGetter, DW_AttribClass_Undefined) \ -X(APPLE_PropertySetter, DW_AttribClass_Undefined) \ -X(APPLE_PropertyAttribute, DW_AttribClass_Undefined) \ -X(APPLE_ObjcCompleteType, DW_AttribClass_Undefined) \ -X(APPLE_Property, DW_AttribClass_Undefined) \ -X(APPLE_ObjDirect, DW_AttribClass_Undefined) \ -X(APPLE_Sdk, DW_AttribClass_String) - -//- Attributes MIPS - -#define DW_AttribKind_MIPS_XList \ -X(MIPS_Fde, 0x2001) \ -X(MIPS_LoopBegin, 0x2002) \ -X(MIPS_TailLoopBegin, 0x2003) \ -X(MIPS_EpilogBegin, 0x2004) \ -X(MIPS_LoopUnrollFactor, 0x2005) \ -X(MIPS_SoftwarePipelineDepth, 0x2006) \ -X(MIPS_LinkageName, 0x2007) \ -X(MIPS_Stride, 0x2008) \ -X(MIPS_AbstractName, 0x2009) \ -X(MIPS_CloneOrigin, 0x200a) \ -X(MIPS_HasInlines, 0x200b) \ -X(MIPS_StrideByte, 0x200c) \ -X(MIPS_StrideElem, 0x200d) \ -X(MIPS_PtrDopeType, 0x200e) \ -X(MIPS_AllocatableDopeType, 0x200f) \ -X(MIPS_AssumedShapeDopeType, 0x2010) \ -X(MIPS_AssumedSize, 0x2011) - -#define DW_AttribKind_ClassFlags_MIPS_XList \ -X(MIPS_Fde, DW_AttribClass_Block) \ -X(MIPS_LoopBegin, DW_AttribClass_Block) \ -X(MIPS_TailLoopBegin, DW_AttribClass_Block) \ -X(MIPS_EpilogBegin, DW_AttribClass_Block) \ -X(MIPS_LoopUnrollFactor, DW_AttribClass_Block) \ -X(MIPS_SoftwarePipelineDepth, DW_AttribClass_Block) \ -X(MIPS_LinkageName, DW_AttribClass_String) \ -X(MIPS_Stride, DW_AttribClass_Block) \ -X(MIPS_AbstractName, DW_AttribClass_String) \ -X(MIPS_CloneOrigin, DW_AttribClass_String) \ -X(MIPS_HasInlines, DW_AttribClass_Reference) \ -X(MIPS_StrideByte, DW_AttribClass_Reference) \ -X(MIPS_StrideElem, DW_AttribClass_Reference) \ -X(MIPS_PtrDopeType, DW_AttribClass_Reference) \ -X(MIPS_AllocatableDopeType, DW_AttribClass_Reference) \ -X(MIPS_AssumedShapeDopeType, DW_AttribClass_Reference) \ -X(MIPS_AssumedSize, DW_AttribClass_Reference) - -typedef U32 DW_AttribKind; -typedef enum DW_AttribKindEnum -{ - DW_AttribKind_Null, -#define X(_N,_ID,...) DW_AttribKind_##_N = _ID, - DW_AttribKind_V2_XList - DW_AttribKind_V3_XList - DW_AttribKind_V4_XList - DW_AttribKind_V5_XList - DW_AttribKind_GNU_XList - DW_AttribKind_LLVM_XList - DW_AttribKind_APPLE_XList - DW_AttribKind_MIPS_XList -#undef X - DW_AttribKind_UserLo = 0x2000, - DW_AttribKind_UserHi = 0x3fff -} DW_AttribKindEnum; - -#define DW_ATE_XList \ -X(Null, 0x00) \ -X(Address, 0x01) \ -X(Boolean, 0x02) \ -X(ComplexFloat, 0x03) \ -X(Float, 0x04) \ -X(Signed, 0x05) \ -X(SignedChar, 0x06) \ -X(Unsigned, 0x07) \ -X(UnsignedChar, 0x08) \ -X(ImaginaryFloat, 0x09) \ -X(PackedDecimal, 0x0A) \ -X(NumericString, 0x0B) \ -X(Edited, 0x0C) \ -X(SignedFixed, 0x0D) \ -X(UnsignedFixed, 0x0E) \ -X(DecimalFloat, 0x0F) \ -X(Utf, 0x10) \ -X(Ucs, 0x11) \ -X(Ascii, 0x12) - -typedef U64 DW_ATE; -typedef enum DW_ATEEnum -{ -#define X(_N,_ID) DW_ATE_##_N = _ID, - DW_ATE_XList -#undef X -} DW_ATEnum; - -#define DW_CallingConventionKind_XList \ -X(Normal, 0x0) \ -X(Program, 0x1) \ -X(NoCall, 0x3) \ -X(PassByValue, 0x4) \ -X(PassByReference, 0x5) - -typedef U64 DW_CallingConventionKind; -typedef enum DW_CallingConventionKindEnum -{ -#define X(_N,_ID) DW_CallingConventionKind_##_N = _ID, - DW_CallingConventionKind_XList -#undef X -} DW_CallingConventionKindEnum; - -#define DW_AccessKind_XList \ -X(Public, 0x00) \ -X(Private, 0x01) \ -X(Protected, 0x02) - -typedef U64 DW_AccessKind; -typedef enum DW_AccessKindEnum -{ -#define X(_N,_ID) DW_AccessKind_##_N = _ID, - DW_AccessKind_XList -#undef X -} DW_AccessKindEnum; - -#define DW_VirtualityKind_XList \ -X(None, 0x00) \ -X(Virtual, 0x01) \ -X(PureVirtual, 0x02) - -typedef U64 DW_VirtualityKind; -typedef enum DW_VirtualityEnum -{ -#define X(_N,_ID) DW_VirtualityKind_##_N = _ID, - DW_VirtualityKind_XList -#undef X -} DW_VirtualityEnum; - -#define DW_RngListEntryKind \ -X(EndOfList, 0x00) \ -X(BaseAddressx, 0x01) \ -X(StartxEndx, 0x02) \ -X(StartxLength, 0x03) \ -X(OffsetPair, 0x04) \ -X(BaseAddress, 0x05) \ -X(StartEnd, 0x06) \ -X(StartLength, 0x07) - -typedef U8 DW_RLE; -typedef enum DW_RLE_Enum -{ -#define X(_N,_ID) DW_RLE_##_N = _ID, - DW_RngListEntryKind -#undef X -} DW_RLE_Enum; - -#define DW_LocListEntry_XList \ -X(EndOfList, 0x00) \ -X(BaseAddressx, 0x01) \ -X(StartxEndx, 0x02) \ -X(StartxLength, 0x03) \ -X(OffsetPair, 0x04) \ -X(DefaultLocation, 0x05) \ -X(BaseAddress, 0x06) \ -X(StartEnd, 0x07) \ -X(StartLength, 0x08) - -#define DW_LocListEntry_GNU_XList(X) \ -X(GNU_ViewPair, 0x9) - -typedef U8 DW_LLE; -typedef enum DW_LLE_Enum -{ -#define X(_N,_ID) DW_LLE_##_N = _ID, - DW_LocListEntry_XList -#undef X -} DW_LLEEnum; - -#define DW_AddrClass_XList \ -X(None, 0) \ -X(Near16, 1) \ -X(Far16, 2) \ -X(Huge16, 3) \ -X(Near32, 4) \ -X(Far32, 5) - -typedef U64 DW_AddrClass; -typedef enum DW_AddrClassEnum -{ -#define X(_N, _ID) DW_AddrClassKind_##_N = _ID, - DW_AddrClass_XList -#undef X -} DW_AddrClassEnum; - -#define DW_CompUnitKind_XList \ -X(Reserved, 0) \ -X(Compile, 1) \ -X(Type, 2) \ -X(Partial, 3) \ -X(Skeleton, 4) \ -X(SplitCompile, 5) \ -X(SplitType, 6) - -typedef U8 DW_CompUnitKind; -typedef enum DW_CompUnitKindEnum -{ -#define X(_N, _ID) DW_CompUnitKind_##_N = _ID, - DW_CompUnitKind_XList -#undef X - DW_CompUnitKind_UserLo = 0x80, - DW_CompUnitKind_UserHi = 0xff -} DW_CompUnitKindEnum; - -#define DW_LNCT_XList \ -X(Path, 0x1) \ -X(DirectoryIndex, 0x2) \ -X(TimeStamp, 0x3) \ -X(Size, 0x4) \ -X(MD5, 0x5) \ -X(LLVM_Source, 0x2001) - -typedef U64 DW_LNCT; -typedef enum DW_LNCTEnum -{ -#define X(_N, _ID) DW_LNCT_##_N = _ID, - DW_LNCT_XList -#undef X - DW_LNCT_UserLo = 0x2000, - DW_LNCT_UserHi = 0x3fff -} DW_LNCTEnum; - //////////////////////////////// -// CFA - -typedef enum -{ - DW_CFA_OperandType_Null, - DW_CFA_OperandType_Value, - DW_CFA_OperandType_Register, - DW_CFA_OperandType_Expression, -} DW_CFA_OperandType; - -// (opcode name, opcode id, operand count, operand types) -#define DW_CFA_Kind_XList \ -X(Nop, 0x0) \ -X(SetLoc, 0x1, DW_CFA_OperandType_Value) \ -X(AdvanceLoc1, 0x2, DW_CFA_OperandType_Value) \ -X(AdvanceLoc2, 0x3, DW_CFA_OperandType_Value) \ -X(AdvanceLoc4, 0x4, DW_CFA_OperandType_Value) \ -X(OffsetExt, 0x5, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(RestoreExt, 0x6) \ -X(Undefined, 0x7, DW_CFA_OperandType_Register) \ -X(SameValue, 0x8, DW_CFA_OperandType_Register) \ -X(Register, 0x9, DW_CFA_OperandType_Register) \ -X(RememberState, 0xa) \ -X(RestoreState, 0xb) \ -X(DefCfa, 0xc, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(DefCfaRegister, 0xd, DW_CFA_OperandType_Register) \ -X(DefCfaOffset, 0xe, DW_CFA_OperandType_Value) \ -X(DefCfaExpr, 0xf, DW_CFA_OperandType_Expression) \ -X(Expr, 0x10, DW_CFA_OperandType_Expression) \ -X(OffsetExtSf, 0x11, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(DefCfaSf, 0x12, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(DefCfaOffsetSf, 0x13, DW_CFA_OperandType_Value) \ -X(ValOffset, 0x14, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(ValOffsetSf, 0x15, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(ValExpr, 0x16, DW_CFA_OperandType_Register, DW_CFA_OperandType_Expression) \ -X(AdvanceLoc, 0x40, DW_CFA_OperandType_Value) \ -X(Offset, 0x80, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value) \ -X(Restore, 0xc0, DW_CFA_OperandType_Register) - -#define DW_CFA_OperandMax 2 -#define DW_CFA_Mask_OpcodeHi 0xc0 -#define DW_CFA_Mask_Operand 0x3f - -typedef U8 DW_CFA_Opcode; -typedef enum DW_CFA_Enum -{ -#define X(_N, _ID, ...) DW_CFA_##_N = _ID, - DW_CFA_Kind_XList -#undef X -} DW_CFA_Enum; - -//////////////////////////////// -// Expression Opcodes - -typedef enum DW_ExprOperandType -{ - DW_ExprOperandType_Null, - DW_ExprOperandType_U8, - DW_ExprOperandType_U16, - DW_ExprOperandType_U32, - DW_ExprOperandType_U64, - DW_ExprOperandType_S8, - DW_ExprOperandType_S16, - DW_ExprOperandType_S32, - DW_ExprOperandType_S64, - DW_ExprOperandType_ULEB128, - DW_ExprOperandType_SLEB128, - DW_ExprOperandType_Addr, - DW_ExprOperandType_Block, - DW_ExprOperandType_DwarfUInt, -} -DW_ExprOperandType; - -// (opcode name, opcode id, operand count, pop count, push count, operand0 type, operand1 type) -#define DW_Expr_V3_XList \ -X(Null, 0x00, 0, 0, 0, Null, Null) \ -X(Addr, 0x03, 1, 0, 1, Addr, Null) \ -X(Deref, 0x06, 0, 1, 1, Null, Null) \ -X(Const1U, 0x08, 1, 0, 1, U8, Null) \ -X(Const1S, 0x09, 1, 0, 1, S8, Null) \ -X(Const2U, 0x0a, 1, 0, 1, U16, Null) \ -X(Const2S, 0x0b, 1, 0, 1, S16, Null) \ -X(Const4U, 0x0c, 1, 0, 1, U32, Null) \ -X(Const4S, 0x0d, 1, 0, 1, S32, Null) \ -X(Const8U, 0x0e, 1, 0, 1, U64, Null) \ -X(Const8S, 0x0f, 1, 0, 1, S64, Null) \ -X(ConstU, 0x10, 1, 0, 1, ULEB128, Null) \ -X(ConstS, 0x11, 1, 0, 1, SLEB128, Null) \ -X(Dup, 0x12, 0, 0, 1, Null, Null) \ -X(Drop, 0x13, 0, 1, 0, Null, Null) \ -X(Over, 0x14, 0, 0, 1, Null, Null) \ -X(Pick, 0x15, 1, 0, 1, U8, Null) \ -X(Swap, 0x16, 0, 0, 0, Null, Null) \ -X(Rot, 0x17, 0, 0, 0, Null, Null) \ -X(XDeref, 0x18, 0, 2, 1, Null, Null) \ -X(Abs, 0x19, 0, 1, 1, Null, Null) \ -X(And, 0x1a, 0, 2, 1, Null, Null) \ -X(Div, 0x1b, 0, 2, 1, Null, Null) \ -X(Minus, 0x1c, 0, 2, 1, Null, Null) \ -X(Mod, 0x1d, 0, 2, 1, Null, Null) \ -X(Mul, 0x1e, 0, 2, 1, Null, Null) \ -X(Neg, 0x1f, 0, 1, 1, Null, Null) \ -X(Not, 0x20, 0, 1, 1, Null, Null) \ -X(Or, 0x21, 0, 2, 1, Null, Null) \ -X(Plus, 0x22, 0, 2, 1, Null, Null) \ -X(PlusUConst, 0x23, 1, 1, 1, ULEB128, Null) \ -X(Shl, 0x24, 0, 2, 1, Null, Null) \ -X(Shr, 0x25, 0, 2, 1, Null, Null) \ -X(Shra, 0x26, 0, 2, 1, Null, Null) \ -X(Xor, 0x27, 0, 2, 1, Null, Null) \ -X(Bra, 0x28, 1, 1, 0, S16, Null) \ -X(Eq, 0x29, 0, 2, 1, Null, Null) \ -X(Ge, 0x2a, 0, 2, 1, Null, Null) \ -X(Gt, 0x2b, 0, 2, 1, Null, Null) \ -X(Le, 0x2c, 0, 2, 1, Null, Null) \ -X(Lt, 0x2d, 0, 2, 1, Null, Null) \ -X(Ne, 0x2e, 0, 2, 1, Null, Null) \ -X(Skip, 0x2f, 1, 0, 0, S16, Null) \ -X(Lit0, 0x30, 0, 0, 0, Null, Null) \ -X(Lit1, 0x31, 0, 0, 0, Null, Null) \ -X(Lit2, 0x32, 0, 0, 0, Null, Null) \ -X(Lit3, 0x33, 0, 0, 0, Null, Null) \ -X(Lit4, 0x34, 0, 0, 0, Null, Null) \ -X(Lit5, 0x35, 0, 0, 0, Null, Null) \ -X(Lit6, 0x36, 0, 0, 0, Null, Null) \ -X(Lit7, 0x37, 0, 0, 0, Null, Null) \ -X(Lit8, 0x38, 0, 0, 0, Null, Null) \ -X(Lit9, 0x39, 0, 0, 0, Null, Null) \ -X(Lit10, 0x3a, 0, 0, 0, Null, Null) \ -X(Lit11, 0x3b, 0, 0, 0, Null, Null) \ -X(Lit12, 0x3c, 0, 0, 0, Null, Null) \ -X(Lit13, 0x3d, 0, 0, 0, Null, Null) \ -X(Lit14, 0x3e, 0, 0, 0, Null, Null) \ -X(Lit15, 0x3f, 0, 0, 0, Null, Null) \ -X(Lit16, 0x40, 0, 0, 0, Null, Null) \ -X(Lit17, 0x41, 0, 0, 0, Null, Null) \ -X(Lit18, 0x42, 0, 0, 0, Null, Null) \ -X(Lit19, 0x43, 0, 0, 0, Null, Null) \ -X(Lit20, 0x44, 0, 0, 0, Null, Null) \ -X(Lit21, 0x45, 0, 0, 0, Null, Null) \ -X(Lit22, 0x46, 0, 0, 0, Null, Null) \ -X(Lit23, 0x47, 0, 0, 0, Null, Null) \ -X(Lit24, 0x48, 0, 0, 0, Null, Null) \ -X(Lit25, 0x49, 0, 0, 0, Null, Null) \ -X(Lit26, 0x4a, 0, 0, 0, Null, Null) \ -X(Lit27, 0x4b, 0, 0, 0, Null, Null) \ -X(Lit28, 0x4c, 0, 0, 0, Null, Null) \ -X(Lit29, 0x4d, 0, 0, 0, Null, Null) \ -X(Lit30, 0x4e, 0, 0, 0, Null, Null) \ -X(Lit31, 0x4f, 0, 0, 0, Null, Null) \ -X(Reg0, 0x50, 0, 0, 1, Null, Null) \ -X(Reg1, 0x51, 0, 0, 1, Null, Null) \ -X(Reg2, 0x52, 0, 0, 1, Null, Null) \ -X(Reg3, 0x53, 0, 0, 1, Null, Null) \ -X(Reg4, 0x54, 0, 0, 1, Null, Null) \ -X(Reg5, 0x55, 0, 0, 1, Null, Null) \ -X(Reg6, 0x56, 0, 0, 1, Null, Null) \ -X(Reg7, 0x57, 0, 0, 1, Null, Null) \ -X(Reg8, 0x58, 0, 0, 1, Null, Null) \ -X(Reg9, 0x59, 0, 0, 1, Null, Null) \ -X(Reg10, 0x5a, 0, 0, 1, Null, Null) \ -X(Reg11, 0x5b, 0, 0, 1, Null, Null) \ -X(Reg12, 0x5c, 0, 0, 1, Null, Null) \ -X(Reg13, 0x5d, 0, 0, 1, Null, Null) \ -X(Reg14, 0x5e, 0, 0, 1, Null, Null) \ -X(Reg15, 0x5f, 0, 0, 1, Null, Null) \ -X(Reg16, 0x60, 0, 0, 1, Null, Null) \ -X(Reg17, 0x61, 0, 0, 1, Null, Null) \ -X(Reg18, 0x62, 0, 0, 1, Null, Null) \ -X(Reg19, 0x63, 0, 0, 1, Null, Null) \ -X(Reg20, 0x64, 0, 0, 1, Null, Null) \ -X(Reg21, 0x65, 0, 0, 1, Null, Null) \ -X(Reg22, 0x66, 0, 0, 1, Null, Null) \ -X(Reg23, 0x67, 0, 0, 1, Null, Null) \ -X(Reg24, 0x68, 0, 0, 1, Null, Null) \ -X(Reg25, 0x69, 0, 0, 1, Null, Null) \ -X(Reg26, 0x6a, 0, 0, 1, Null, Null) \ -X(Reg27, 0x6b, 0, 0, 1, Null, Null) \ -X(Reg28, 0x6c, 0, 0, 1, Null, Null) \ -X(Reg29, 0x6d, 0, 0, 1, Null, Null) \ -X(Reg30, 0x6e, 0, 0, 1, Null, Null) \ -X(Reg31, 0x6f, 0, 0, 1, Null, Null) \ -X(BReg0, 0x70, 1, 0, 1, SLEB128, Null) \ -X(BReg1, 0x71, 1, 0, 1, SLEB128, Null) \ -X(BReg2, 0x72, 1, 0, 1, SLEB128, Null) \ -X(BReg3, 0x73, 1, 0, 1, SLEB128, Null) \ -X(BReg4, 0x74, 1, 0, 1, SLEB128, Null) \ -X(BReg5, 0x75, 1, 0, 1, SLEB128, Null) \ -X(BReg6, 0x76, 1, 0, 1, SLEB128, Null) \ -X(BReg7, 0x77, 1, 0, 1, SLEB128, Null) \ -X(BReg8, 0x78, 1, 0, 1, SLEB128, Null) \ -X(BReg9, 0x79, 1, 0, 1, SLEB128, Null) \ -X(BReg10, 0x7a, 1, 0, 1, SLEB128, Null) \ -X(BReg11, 0x7b, 1, 0, 1, SLEB128, Null) \ -X(BReg12, 0x7c, 1, 0, 1, SLEB128, Null) \ -X(BReg13, 0x7d, 1, 0, 1, SLEB128, Null) \ -X(BReg14, 0x7e, 1, 0, 1, SLEB128, Null) \ -X(BReg15, 0x7f, 1, 0, 1, SLEB128, Null) \ -X(BReg16, 0x80, 1, 0, 1, SLEB128, Null) \ -X(BReg17, 0x81, 1, 0, 1, SLEB128, Null) \ -X(BReg18, 0x82, 1, 0, 1, SLEB128, Null) \ -X(BReg19, 0x83, 1, 0, 1, SLEB128, Null) \ -X(BReg20, 0x84, 1, 0, 1, SLEB128, Null) \ -X(BReg21, 0x85, 1, 0, 1, SLEB128, Null) \ -X(BReg22, 0x86, 1, 0, 1, SLEB128, Null) \ -X(BReg23, 0x87, 1, 0, 1, SLEB128, Null) \ -X(BReg24, 0x88, 1, 0, 1, SLEB128, Null) \ -X(BReg25, 0x89, 1, 0, 1, SLEB128, Null) \ -X(BReg26, 0x8a, 1, 0, 1, SLEB128, Null) \ -X(BReg27, 0x8b, 1, 0, 1, SLEB128, Null) \ -X(BReg28, 0x8c, 1, 0, 1, SLEB128, Null) \ -X(BReg29, 0x8d, 1, 0, 1, SLEB128, Null) \ -X(BReg30, 0x8e, 1, 0, 1, SLEB128, Null) \ -X(BReg31, 0x8f, 1, 0, 1, SLEB128, Null) \ -X(RegX, 0x90, 1, 0, 1, ULEB128, Null) \ -X(FBReg, 0x91, 1, 0, 1, SLEB128, Null) \ -X(BRegX, 0x92, 2, 0, 1, ULEB128, SLEB128) \ -X(Piece, 0x93, 1, 0, 0, ULEB128, Null) \ -X(DerefSize, 0x94, 1, 1, 1, U8, Null) \ -X(XDerefSize, 0x95, 1, 2, 1, U8, Null) \ -X(Nop, 0x96, 0, 0, 0, Null, Null) \ -X(PushObjectAddress, 0x97, 0, 0, 1, Null, Null) \ -X(Call2, 0x98, 1, 0, 0, U16, Null) \ -X(Call4, 0x99, 1, 0, 0, U32, Null) \ -X(CallRef, 0x9a, 1, 0, 0, DwarfUInt,Null) \ -X(FormTlsAddress, 0x9b, 0, 0, 1, Null, Null) \ -X(CallFrameCfa, 0x9c, 0, 0, 1, Null, Null) \ -X(BitPiece, 0x9d, 2, 0, 0, ULEB128, ULEB128) - -#define DW_Expr_V4_XList \ -X(ImplicitValue, 0x9e, 2, 0, 1, Block, Null) \ -X(StackValue, 0x9f, 0, 0, 0, Null, Null) - -#define DW_Expr_V5_XList \ -X(ImplicitPointer, 0xa0, 2, 0, 1, DwarfUInt, SLEB128) \ -X(Addrx, 0xa1, 1, 0, 1, ULEB128, Null) \ -X(Constx, 0xa2, 1, 0, 1, ULEB128, Null) \ -X(EntryValue, 0xa3, 1, 0, 0, Block, Null) \ -X(ConstType, 0xa4, 2, 0, 1, ULEB128, Block) \ -X(RegvalType, 0xa5, 2, 0, 1, ULEB128, ULEB128) \ -X(DerefType, 0xa6, 2, 1, 1, U8, ULEB128) \ -X(XDerefType, 0xa7, 2, 2, 1, U8, ULEB128) \ -X(Convert, 0xa8, 1, 1, 1, ULEB128, Null) \ -X(Reinterpret, 0xa9, 1, 1, 1, ULEB128, Null) - -#define DW_Expr_GNU_XList \ -X(GNU_PushTlsAddress, 0xe0, 0, 0, 1, Null, Null) \ -X(GNU_UnInit, 0xf0, 0, 0, 0, Null, Null) \ -X(GNU_ImplicitPointer, 0xf2, 2, 0, 1, DwarfUInt, SLEB128) \ -X(GNU_EntryValue, 0xf3, 1, 0, 0, Block, Null) \ -X(GNU_ConstType, 0xf4, 2, 0, 1, ULEB128, Block) \ -X(GNU_RegvalType, 0xf5, 2, 0, 1, ULEB128, ULEB128) \ -X(GNU_DerefType, 0xf6, 2, 1, 1, U8, ULEB128) \ -X(GNU_Convert, 0xf7, 1, 1, 1, ULEB128, Null) \ -X(GNU_ParameterRef, 0xfa, 1, 0, 0, U32, Null) \ -X(GNU_AddrIndex, 0xfb, 0, 0, 1, Null, Null) \ -X(GNU_ConstIndex, 0xfc, 1, 0, 1, ULEB128, Null) - -typedef U8 DW_ExprOp; -typedef enum DW_ExprOpEnum -{ -#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT, ...) DW_ExprOp_##_N = _ID, - DW_Expr_V3_XList - DW_Expr_V4_XList - DW_Expr_V5_XList - DW_Expr_GNU_XList -#undef X -} DW_ExprOpEnum; - -//- Regs - -#define DW_Regs_X64_XList \ -X(Rax, 0, rax, 0, 8) \ -X(Rdx, 1, rdx, 0, 8) \ -X(Rcx, 2, rcx, 0, 8) \ -X(Rbx, 3, rbx, 0, 8) \ -X(Rsi, 4, rsi, 0, 8) \ -X(Rdi, 5, rdi, 0, 8) \ -X(Rbp, 6, rbp, 0, 8) \ -X(Rsp, 7, rsp, 0, 8) \ -X(R8, 8, r8, 0, 8) \ -X(R9, 9, r9, 0, 8) \ -X(R10, 10, r10, 0, 8) \ -X(R11, 11, r11, 0, 8) \ -X(R12, 12, r12, 0, 8) \ -X(R13, 13, r13, 0, 8) \ -X(R14, 14, r14, 0, 8) \ -X(R15, 15, r15, 0, 8) \ -X(Rip, 16, rip, 0, 8) \ -X(Xmm0, 17, zmm0, 0, 16) \ -X(Xmm1, 18, zmm1, 0, 16) \ -X(Xmm2, 19, zmm2, 0, 16) \ -X(Xmm3, 20, zmm3, 0, 16) \ -X(Xmm4, 21, zmm4, 0, 16) \ -X(Xmm5, 22, zmm5, 0, 16) \ -X(Xmm6, 23, zmm6, 0, 16) \ -X(Xmm7, 24, zmm7, 0, 16) \ -X(Xmm8, 25, zmm8, 0, 16) \ -X(Xmm9, 26, zmm9, 0, 16) \ -X(Xmm10, 27, zmm10, 0, 16) \ -X(Xmm11, 28, zmm11, 0, 16) \ -X(Xmm12, 29, zmm12, 0, 16) \ -X(Xmm13, 30, zmm13, 0, 16) \ -X(Xmm14, 31, zmm14, 0, 16) \ -X(Xmm15, 32, zmm15, 0, 16) \ -X(Xmm16, 67, zmm16, 0, 16) \ -X(Xmm17, 68, zmm17, 0, 16) \ -X(Xmm18, 69, zmm18, 0, 16) \ -X(Xmm19, 70, zmm19, 0, 16) \ -X(Xmm20, 71, zmm20, 0, 16) \ -X(Xmm21, 72, zmm21, 0, 16) \ -X(Xmm22, 73, zmm22, 0, 16) \ -X(Xmm23, 74, zmm23, 0, 16) \ -X(Xmm24, 75, zmm24, 0, 16) \ -X(Xmm25, 76, zmm25, 0, 16) \ -X(Xmm26, 77, zmm26, 0, 16) \ -X(Xmm27, 78, zmm27, 0, 16) \ -X(Xmm28, 79, zmm28, 0, 16) \ -X(Xmm29, 80, zmm29, 0, 16) \ -X(Xmm30, 81, zmm30, 0, 16) \ -X(Xmm31, 82, zmm31, 0, 16) \ -X(St0, 33, st0, 0, 10) \ -X(St1, 34, st1, 0, 10) \ -X(St2, 35, st2, 0, 10) \ -X(St3, 36, st3, 0, 10) \ -X(St4, 37, st4, 0, 10) \ -X(St5, 38, st5, 0, 10) \ -X(St6, 39, st6, 0, 10) \ -X(St7, 40, st7, 0, 10) \ -X(Mm0, 41, st0, 0, 8) \ -X(Mm1, 42, st1, 0, 8) \ -X(Mm2, 43, st2, 0, 8) \ -X(Mm3, 44, st3, 0, 8) \ -X(Mm4, 45, st4, 0, 8) \ -X(Mm5, 46, st5, 0, 8) \ -X(Mm6, 47, st6, 0, 8) \ -X(Mm7, 48, st7, 0, 8) \ -X(Rflags, 49, rflags, 0, 4) \ -X(Es, 50, es, 0, 2) \ -X(Cs, 51, cs, 0, 2) \ -X(Ss, 52, ss, 0, 2) \ -X(Ds, 53, ds, 0, 2) \ -X(Fs, 54, fs, 0, 2) \ -X(Gs, 55, gs, 0, 2) \ -X(FsBase, 58, fsbase, 0, 8) \ -X(GsBase, 59, gsbase, 0, 8) -// privileged registers: -// X(Tr, 62, nil, 0, 0) \ -// X(Ldtr, 63, nil, 0, 0) - -typedef U32 DW_Reg; - -typedef DW_Reg DW_RegX64; -typedef enum DW_RegX64Enum -{ -#define X(_N,_ID,...) DW_RegX64_##_N = _ID, - DW_Regs_X64_XList -#undef X - DW_RegX64_Last -} DW_RegX64Enum; - -//////////////////////////////// -//~ rjf: Generated Code +//~ rjf: Includes #include "dwarf/generated/dwarf.meta.h" +#if defined(X64_H) +# include "dwarf/x64/dwarf_x64.h" +#endif //////////////////////////////// -// Speced Encodings +//~ rjf: Helper Types -internal DW_AttribClass dw_attrib_class_from_attrib_v2(DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_v3(DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_v4(DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_v5(DW_AttribKind k); +typedef struct DW_ExprOpInfo DW_ExprOpInfo; +struct DW_ExprOpInfo +{ + U8 push_count; + U8 pop_count; + U8 operand_count; + B8 valid_for_cfa_exprs; + DW_ExprOperandKind operand_kinds[2]; + String8 name; + DW_Version version; +}; +global read_only DW_ExprOpInfo dw_expr_op_info_nil = {0}; //////////////////////////////// -// Extensions +//~ rjf: X-List Helpers -internal DW_AttribClass dw_attrib_class_from_attrib_gnu (DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_llvm (DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_apple(DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib_mips (DW_AttribKind k); -internal DW_AttribClass dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind v); +//- rjf: format address sizes +internal U64 dw_addr_size_from_format(DW_Format fmt); + +//- rjf: attribute classes +internal DW_AttribClass dw_attrib_class_from_kind(DW_Version version, DW_ExtFlags exts, DW_AttribKind k); +internal DW_AttribClass dw_attrib_class_from_form_kind(DW_Version version, DW_ExtFlags exts, DW_FormKind k); + +//- rjf: expr op metadata +internal DW_ExprOpInfo *dw_info_from_expr_op(DW_Version version, DW_ExtFlags exts, DW_ExprOp op); + +//- rjf: enum -> string +internal String8 dw_string_from_format(DW_Format fmt); +internal String8 dw_string_from_tag_kind(DW_Version version, DW_ExtFlags exts, DW_TagKind k); +internal String8 dw_string_from_attrib_kind(DW_Version version, DW_ExtFlags exts, DW_AttribKind k); +internal String8 dw_string_from_form_kind(DW_Version version, DW_ExtFlags exts, DW_FormKind k); +internal String8 dw_string_from_language(DW_Language k); +internal String8 dw_string_from_comp_unit_kind(DW_CompUnitKind k); +internal String8 dw_string_from_inl_kind(DW_InlKind k); +internal String8 dw_string_from_access_kind(DW_AccessKind k); +internal String8 dw_string_from_calling_convention_kind(DW_CallingConventionKind k); +internal String8 dw_string_from_ate(DW_ATE k); +internal String8 dw_string_from_visibility_kind(DW_VisibilityKind k); +internal String8 dw_string_from_std_opcode(DW_StdOpcode opcode); +internal String8 dw_string_from_ext_opcode(DW_ExtOpcode opcode); +internal String8 dw_string_from_lle(DW_LLE lle); +internal String8 dw_string_from_rle(DW_RLE rle); +internal String8 dw_regular_name_from_section_kind(DW_SectionKind k); +internal String8 dw_macho_name_from_section_kind(DW_SectionKind k); +internal String8 dw_dwo_name_from_section_kind(DW_SectionKind k); +#define dw_string_from_expr_op(version, exts, op) (dw_info_from_expr_op((version), (exts), (op))->name) + +//- rjf: architecture info +internal U64 dw_reg_count_from_arch(Arch arch); //////////////////////////////// -// Form Class Encodings - -internal DW_AttribClass dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k); -internal B32 dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind); -internal B32 dw_is_form_kind_ref(DW_Version ver, DW_Ext ext, DW_FormKind form_kind); +//~ TODO(rjf): OLD vvvvvvvvvvvvvvvvvvv +#if 0 //////////////////////////////// // xlist helpers // regs -internal U64 dw_reg_size_from_code_x64(DW_Reg reg_code); -internal U64 dw_reg_pos_from_code_x64(DW_Reg reg_code); internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code); internal U64 dw_reg_pos_from_code(Arch arch, DW_Reg reg_code); internal U64 dw_reg_count_from_arch(Arch arch); internal U64 dw_reg_max_size_from_arch(Arch arch); -internal U64 dw_sp_from_arch(Arch arch); internal U64 dw_size_from_format(DW_Format format); -// attrib form -> value class -internal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, B32 relaxed, DW_AttribKind attrib, DW_FormKind form_kind); - -// lang -internal U64 dw_pick_default_lower_bound(DW_Language lang); - -// expr -internal U64 dw_operand_count_from_expr_op(DW_ExprOp op); -internal U64 dw_pop_count_from_expr_op(DW_ExprOp op); -internal U64 dw_push_count_from_expr_op(DW_ExprOp op); -internal DW_ExprOperandType * dw_operand_types_from_expr_opcode(DW_ExprOp op); - // CFA internal U64 dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode); internal B32 dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode); @@ -1802,11 +88,6 @@ internal DW_CFA_OperandType * dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode) //////////////////////////////// //~ rjf: String <=> Enum -internal String8 dw_string_from_format(DW_Format format); -internal String8 dw_string_from_expr_op(Arena *arena, DW_Version ver, DW_Ext ext, DW_ExprOp op); -internal String8 dw_string_from_tag_kind(Arena *arena, DW_TagKind kind); -internal String8 dw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKind kind); -internal String8 dw_string_from_form_kind(Arena *arena, DW_Version ver, DW_FormKind kind); internal String8 dw_string_from_language(Arena *arena, DW_Language kind); internal String8 dw_string_from_comp_unit_kind(Arena *arena, DW_CompUnitKind kind); internal String8 dw_string_from_inl(Arena *arena, DW_InlKind kind); @@ -1824,31 +105,6 @@ internal String8 dw_string_from_cfa_opcode(DW_CFA_Opcode opcode); internal String8 dw_name_string_from_section_kind(DW_SectionKind k); internal String8 dw_mach_name_string_from_section_kind(DW_SectionKind k); internal String8 dw_dwo_name_string_from_section_kind (DW_SectionKind k); - -//////////////////////////////// -// Serializers - -internal U64 dw_write_to_buffer_uleb128(U8 buffer[10], U64 v); -internal U64 dw_write_to_buffer_sleb128(U8 buffer[10], U64 v); - -internal String8 dw_write_uleb128(Arena *arena, U64 v); -internal String8 dw_write_sleb128(Arena *arena, S64 v); -internal U64 dw_size_from_uleb128(U64 v); -internal U64 dw_size_from_sleb128(S64 v); - -internal void * dw_serial_push_length(Arena *arena, String8List *srl, DW_Format format, U64 length); -internal void * dw_serial_push_uint(Arena *arena, String8List *srl, DW_Format format, U64 v); -internal void * dw_serial_push_uleb128(Arena *arena, String8List *srl, U64 v); -internal void * dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v); - -//////////////////////////////// -// Form - -internal B32 dw_form_match(DW_Form a, DW_Form b); - -//////////////////////////////// -// Line - -internal U64 dw_length_from_std_opcode(DW_StdOpcode opcode); +#endif #endif // DWARF_H diff --git a/src/dwarf/dwarf.mdesk b/src/dwarf/dwarf.mdesk index 73a27850..dff8e513 100644 --- a/src/dwarf/dwarf.mdesk +++ b/src/dwarf/dwarf.mdesk @@ -1,6 +1,1327 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Version + +@table(name) +DW_VersionTable: +{ + {Null} + {1} + {2} + {3} + {4} + {5} +} + +@enum(U16) DW_Version: +{ + @expand(DW_VersionTable a) `$(a.name)`; + `Last = DW_Version_5`; +} + +@table(name code) +DW_ExtTable: +{ + {GNU} + {LLVM} + {Apple} + {MIPS} +} + +@enum DW_Ext: +{ + `Null`, + @expand(DW_ExtTable a) `$(a.name)` +} + +@enum(U32) DW_ExtFlags: +{ + @expand(DW_ExtTable a) `$(a.name) = (1<foff, header->vsize ? header->foff + header->vsize : header->foff + header->fsize); - String8 name = coff_name_from_section_header(string_table, header); - - DW_SectionKind s = dw_section_kind_from_string(name); - B32 is_dwo = 0; - if (s == DW_Section_Null) { - s = dw_section_dwo_kind_from_string(name); - is_dwo = 1; - } - - if (s != DW_Section_Null) { - if (sect_status[s]) { - Assert(!"too many debug sections with identical name, picking first"); - } else { - sect_status[s] = 1; - DW_Section *d = &input.sec[s]; - d->name = push_str8_copy(arena, name); - d->data = str8_substr(raw_image, raw_data_range); - d->is_dwo = is_dwo; - } - } - } - - return input; -} diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 69b83b23..9b6d6481 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -1185,7 +1185,7 @@ DW_PRINTER(dw_print_frame) for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { DW_DescriptorEntry desc = {0}; desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); - if (desc.type == DW_DescriptorEntryType_CIE) { + if (desc.type == DW_DescriptorEntryKind_CIE) { String8 raw_cie = str8_substr(debug_frame, desc.entry_range); U64 restore_pos = arena_pos(scratch.arena); DW_CIE *cie = push_array(scratch.arena, DW_CIE, 1); @@ -1202,8 +1202,8 @@ DW_PRINTER(dw_print_frame) desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); String8 raw_desc = str8_substr(debug_frame, desc.entry_range); switch (desc.type) { - case DW_DescriptorEntryType_Null: {} break; - case DW_DescriptorEntryType_CIE: { + case DW_DescriptorEntryKind_Null: {} break; + case DW_DescriptorEntryKind_CIE: { DW_CIE cie = {0}; if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); @@ -1229,7 +1229,7 @@ DW_PRINTER(dw_print_frame) dw_printf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); } } break; - case DW_DescriptorEntryType_FDE: { + case DW_DescriptorEntryKind_FDE: { DW_DescriptorEntry cie_desc = {0}; U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); diff --git a/src/dwarf/dwarf_dump_2.c b/src/dwarf/dwarf_dump_2.c new file mode 100644 index 00000000..04f7669c --- /dev/null +++ b/src/dwarf/dwarf_dump_2.c @@ -0,0 +1,718 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Helpers + +internal String8List +dw_dump_list_from_expr(Arena *arena, String8 data, Arch arch, DW2_ParseCtx *ctx) +{ + String8List result = {0}; + Temp scratch = scratch_begin(&arena, 1); + ARCH_Info *arch_info = arch_info_from_arch(arch); + for(U64 off = 0; off < data.size;) + { + U64 start_off = 0; + + // rjf: read next op + U8 op = 0; + off += str8_deserial_read_struct(data, off, &op); + + // rjf: unpack op / operands + String8 operand_string = {0}; + U64 size_param = 0; + B32 is_signed = 0; + switch(op) + { + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: + { + U64 x = op - DW_ExprOp_Lit0; + operand_string = str8f(scratch.arena, "%I64u", x); + }break; + + case DW_ExprOp_Const1U:size_param = 1; goto const_n; + case DW_ExprOp_Const2U:size_param = 2; goto const_n; + case DW_ExprOp_Const4U:size_param = 4; goto const_n; + case DW_ExprOp_Const8U:size_param = 8; goto const_n; + case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n; + case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n; + case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n; + case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n; + const_n: + { + if(is_signed) + { + S64 x = 0; + off += str8_deserial_read(data, off, &x, size_param, 1); + x = extend_sign64(x, size_param); + operand_string = str8f(scratch.arena, "%I64d", x); + } + else + { + U64 x = 0; + off += str8_deserial_read(data, off, &x, size_param, 1); + operand_string = str8f(scratch.arena, "%I64u", x); + } + }break; + + case DW_ExprOp_Addr: + { + U64 addr = 0; + off += str8_deserial_read(data, off, &addr, ctx->addr_size, 1); + operand_string = str8f(scratch.arena, "0x%I64x", addr); + }break; + + case DW_ExprOp_ConstU: + { + U64 x = 0; + off += str8_deserial_read_uleb128(data, off, &x); + operand_string = str8f(scratch.arena, "%I64u", x); + }break; + + case DW_ExprOp_ConstS: + { + S64 x = 0; + off += str8_deserial_read_sleb128(data, off, &x); + operand_string = str8f(scratch.arena, "%I64d", x); + }break; + + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + { + U64 reg_idx = op - DW_ExprOp_Reg0; + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = arch_info->reg_code_name_table[regcode]; + }break; + + case DW_ExprOp_RegX: + { + U64 reg_idx = 0; + off += str8_deserial_read_uleb128(data, off, ®_idx); + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = arch_info->reg_code_name_table[regcode]; + }break; + + case DW_ExprOp_ImplicitValue: + { + U64 value_size = 0; + off += str8_deserial_read_uleb128(data, off, &value_size); + Rng1U64 value_range = rng_1u64(off, off + value_size); + String8 value_data = str8_substr(data, value_range); + off += value_size; + String8List value_strings = numeric_str8_list_from_data(scratch.arena, 16, value_data, 1); + operand_string = str8_list_join(scratch.arena, &value_strings, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(", "), .post = str8_lit(" }")}); + }break; + + case DW_ExprOp_Piece: + { + U64 size = 0; + off += str8_deserial_read_uleb128(data, off, &size); + operand_string = str8f(scratch.arena, "%u", size); + }break; + + case DW_ExprOp_BitPiece: + { + U64 bit_size = 0, bit_off = 0; + off += str8_deserial_read_uleb128(data, off, &bit_size); + off += str8_deserial_read_uleb128(data, off, &bit_off); + operand_string = str8f(scratch.arena, "bit size %I64u, bit offset %I64u", bit_size, bit_off); + }break; + + case DW_ExprOp_Pick: + { + U8 stack_idx = 0; + off += str8_deserial_read_struct(data, off, &stack_idx); + operand_string = str8f(scratch.arena, "stack index %u", stack_idx); + }break; + + case DW_ExprOp_PlusUConst: + { + U64 addend = 0; + off += str8_deserial_read_uleb128(data, off, &addend); + operand_string = str8f(arena, "addend %I64u", addend); + }break; + + case DW_ExprOp_Skip: + { + S16 x = 0; + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(scratch.arena, "%+d bytes", x); + }break; + + case DW_ExprOp_Bra: + { + S16 x = 0; + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(scratch.arena, "%+d", x); + }break; + + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + { + U64 reg_idx = op - DW_ExprOp_BReg0; + S64 reg_off = 0; + off += str8_deserial_read_sleb128(data, off, ®_off); + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = str8f(scratch.arena, "%S+%I64d", arch_info->reg_code_name_table[regcode], reg_off); + }break; + + case DW_ExprOp_FBReg: + { + S64 reg_off = 0; + off += str8_deserial_read_sleb128(data, off, ®_off); + operand_string = str8f(scratch.arena, "frame base offset %I64d", reg_off); + }break; + + case DW_ExprOp_BRegX: + { + U64 reg_idx = 0; + S64 reg_off = 0; + off += str8_deserial_read_uleb128(data, off, ®_idx); + off += str8_deserial_read_sleb128(data, off, ®_off); + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = str8f(scratch.arena, "%S+%I64d", arch_info->reg_code_name_table[regcode], reg_off); + }break; + + case DW_ExprOp_XDerefSize: + case DW_ExprOp_DerefSize: + { + U8 x = 0; + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(scratch.arena, "%u", x); + }break; + + case DW_ExprOp_Call2: + { + U16 x = 0; + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(scratch.arena, "%u", x); + }break; + case DW_ExprOp_Call4: + { + U32 x = 0; + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(arena, "%u", x); + }break; + case DW_ExprOp_CallRef: + { + U64 x = 0; + off += dw2_read_fmt_u64(data, off, ctx->format, &x); + operand_string = str8f(scratch.arena, "%I64u", x); + }break; + case DW_ExprOp_ImplicitPointer: + case DW_GNU_ExprOp_ImplicitPointer: + { + U64 info_off = 0; + off += dw2_read_fmt_u64(data, off, ctx->format, &info_off); + S64 ptr = 0; + off += str8_deserial_read_sleb128(data, off, &ptr); + operand_string = str8f(scratch.arena, ".debug_info@0x%I64x, ptr %I64x", info_off, ptr); + } break; + case DW_ExprOp_Convert: + case DW_GNU_ExprOp_Convert: + { + U64 type_cu_off = 0; + off += str8_deserial_read_uleb128(data, off, &type_cu_off); + operand_string = str8f(scratch.arena, "TypeCuOff %#I64x", ctx->unit_base_info_off + type_cu_off); + }break; + case DW_GNU_ExprOp_ParameterRef: + { + // TODO: always 4 bytes? + U32 cu_off = 0; + off += str8_deserial_read_struct(data, off, &cu_off); + operand_string = str8f(scratch.arena, "CuOff %#x", ctx->unit_base_info_off + cu_off); + }break; + case DW_ExprOp_DerefType: + case DW_GNU_ExprOp_DerefType: + { + U8 deref_size = 0; + U64 type_cu_off = 0; + off += str8_deserial_read_struct(data, off, &deref_size); + off += str8_deserial_read_uleb128(data, off, &type_cu_off); + operand_string = str8f(scratch.arena, "%#x, TypeCuOff %#I64x", deref_size, ctx->unit_base_info_off + type_cu_off); + }break; + case DW_ExprOp_ConstType: + case DW_GNU_ExprOp_ConstType: + { + U64 type_cu_off = 0; + U8 const_value_size = 0; + off += str8_deserial_read_uleb128(data, off, &type_cu_off); + off += str8_deserial_read_struct(data, off, &const_value_size); + Rng1U64 const_value_range = rng_1u64(off, off + const_value_size); + String8 const_value_data = str8_substr(data, const_value_range); + String8List const_value_strings = numeric_str8_list_from_data(scratch.arena, 16, const_value_data, 1); + String8 const_value_str = str8_list_join(scratch.arena, &const_value_strings, &(StringJoin){.sep = str8_lit(", ")}); + operand_string = str8f(scratch.arena, "TypeCuOff %#I64x, Const Value { %S }", ctx->unit_base_info_off + type_cu_off, const_value_str); + off += const_value_size; + }break; + case DW_ExprOp_RegvalType: + case DW_GNU_ExprOp_RegvalType: + { + U64 reg_idx = 0, type_cu_off = 0; + off += str8_deserial_read_uleb128(data, off, ®_idx); + off += str8_deserial_read_uleb128(data, off, &type_cu_off); + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = str8f(scratch.arena, "%S, TypeCuOff %#I64x", arch_info->reg_code_name_table[regcode], ctx->unit_base_info_off + type_cu_off); + }break; + case DW_ExprOp_EntryValue: + case DW_GNU_ExprOp_EntryValue: + { + U64 block_size = 0; + off += str8_deserial_read_uleb128(data, off, &block_size); + Rng1U64 block_range = rng_1u64(off, off + block_size); + String8 block_data = str8_substr(data, block_range); + // TODO(rjf): WTF, recursive? let's not... - if we want this, let's just do the stack inside of this function + // String8List block_expr = dw_string_list_from_expression(scratch.arena, block_data, cu_base, addr_size, arch, ver, ext, format); + // operand_string = str8_list_join(scratch.arena, &block_expr, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(","), .post = str8_lit(" }")}); + operand_string = s("{...}"); + off += block_size; + } break; + case DW_ExprOp_Addrx: + { + U64 addr = 0; + off += str8_deserial_read_uleb128(data, off, &addr); + operand_string = str8f(scratch.arena, "%#I64x", addr); + }break; + } + + // rjf: push opcode info + String8 opcode_string = dw_string_from_expr_op(ctx->version, ctx->exts, op); + if(operand_string.size == 0) + { + str8_list_pushf(arena, &result, "%S", opcode_string); + } + else + { + str8_list_pushf(arena, &result, "%S(%S)", opcode_string, operand_string); + } + } + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Main Dump Entry Point + +internal String8List +dw_dump_list_from_raw(Arena *arena, DW_Raw *raw, Arch arch, DW_SectionFlags subset_flags) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + String8 indent = str8_lit(" "); + + ////////////////////////////// + //- rjf: set up + // + typedef struct DumpSubsetOutputNode DumpSubsetOutputNode; + struct DumpSubsetOutputNode + { + DumpSubsetOutputNode *next; + DW_SectionKind section_kind; + String8List *lane_strings; + }; + DumpSubsetOutputNode *first_output_node = 0; + DumpSubsetOutputNode *last_output_node = 0; + String8List *strings = 0; +#define dump(str) str8_list_push(arena, strings, (str)) +#define dumpf(...) str8_list_pushf(arena, strings, __VA_ARGS__) +#define DumpSubsetKind(kind) \ +if(lane_idx() == 0)\ +{\ +DumpSubsetOutputNode *n = push_array(scratch.arena, DumpSubsetOutputNode, 1);\ +SLLQueuePush(first_output_node, last_output_node, n);\ +n->section_kind = (kind);\ +n->lane_strings = push_array(scratch.arena, String8List, lane_count());\ +}\ +lane_sync_u64(&first_output_node, 0);\ +lane_sync_u64(&last_output_node, 0);\ +strings = &last_output_node->lane_strings[lane_idx()];\ +lane_sync(); if(subset_flags & (1ull<<(kind))) ProfScope((char *)dw_regular_name_from_section_kind(kind).str) +#define DumpSubset(name) DumpSubsetKind(DW_SectionKind_##name) + + ////////////////////////////// + //- rjf: .debug_abbrev + // + DumpSubset(Abbrev) + { + if(lane_idx() == 0) + { + String8 data = raw->sec[DW_SectionKind_Abbrev].data; + U64 idx = 0; + dumpf("\nabbrevs:\n{\n"); + for(U64 off = 0; off < data.size; idx += 1) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; + + // rjf: read abbrev info + DW2_AbbrevHeader abbrev_header = {0}; + DW2_AbbrevAttribList abbrev_attribs = {0}; + off += dw2_read_abbrev(scratch2.arena, data, off, &abbrev_header, &abbrev_attribs); + + // rjf: log + dumpf(" abbrev: // abbrev[%I64u], .debug_abbrev@0x%I64x\n", idx, start_off); + dumpf(" {\n"); + dumpf(" id: %I64u\n", abbrev_header.id); + dumpf(" tag_kind: %S (0x%I64x)\n", dw_string_from_tag_kind(DW_Version_Last, DW_ExtFlag_All, abbrev_header.tag_kind), abbrev_header.tag_kind); + dumpf(" has_children: %s\n", abbrev_header.has_children ? "yes" : "no"); + if(abbrev_attribs.count != 0) + { + dumpf(" attribs:\n {\n"); + for EachNode(n, DW2_AbbrevAttribNode, abbrev_attribs.first) + { + DW2_AbbrevAttrib *attrib = &n->v; + dumpf(" {%-24S %-16S%S}\n", + dw_string_from_attrib_kind(DW_Version_Last, DW_ExtFlag_All, attrib->attrib_kind), + dw_string_from_form_kind(DW_Version_Last, DW_ExtFlag_All, attrib->form_kind), + attrib->form_kind == DW_FormKind_ImplicitConst ? str8f(scratch2.arena, " (0x%I64x, %I64u)", attrib->implicit_const, attrib->implicit_const) : s("")); + } + dumpf(" }\n"); + } + dumpf(" }\n"); + + if(off == start_off) + { + break; + } + } + dumpf("}\n"); + } + } + + ////////////////////////////// + //- rjf: .debug_info + // + DumpSubset(Info) + { + //- rjf: gather unit ranges from .debug_info + Rng1U64Array *unit_info_ranges = 0; + if(lane_idx() == 0) + { + unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); + *unit_info_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_Info].data); + } + lane_sync_u64(&unit_info_ranges, 0); + U64 unit_count = unit_info_ranges->count; + + //- rjf: parse all .debug_info unit headers + DW2_UnitHeader *unit_headers = 0; + Rng1U64 *unit_info_tag_ranges = 0; + { + // rjf: set up + if(lane_idx() == 0) + { + unit_headers = push_array(scratch.arena, DW2_UnitHeader, unit_count); + unit_info_tag_ranges = push_array(scratch.arena, Rng1U64, unit_count); + } + lane_sync_u64(&unit_headers, 0); + lane_sync_u64(&unit_info_tag_ranges, 0); + + // rjf: parse all unit headers + String8 data = raw->sec[DW_SectionKind_Info].data; + Rng1U64 range = lane_range(unit_count); + for EachInRange(idx, range) + { + Rng1U64 unit_info_range = unit_info_ranges->v[idx]; + U64 bytes_read = dw2_read_unit_header(str8_substr(data, unit_info_range), 0, &unit_headers[idx]); + unit_info_tag_ranges[idx] = r1u64(unit_info_range.min + bytes_read, unit_info_range.max); + } + } + lane_sync(); + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + + //- rjf: build all abbreviation maps, build (unit -> abbrev map) + DW2_UnitAbbrevMapMap unit_abbrev_map_map = dw2_unit_abbrev_map_map_from_data(scratch.arena, raw->sec[DW_SectionKind_Abbrev].data, unit_headers, unit_count); + + //- rjf: parse all unit offsets tables + DW2_OffsetTableSet *offset_tables = 0; + if(lane_idx() == 0) + { + offset_tables = push_array(scratch.arena, DW2_OffsetTableSet, 1); + offset_tables[0] = dw2_offset_table_set_from_raw(scratch.arena, raw); + } + lane_sync_u64(&offset_tables, 0); + + //- rjf: build per-unit parsing contexts + DW2_ParseCtx *unit_parse_ctxs = 0; + { + if(lane_idx() == 0) + { + unit_parse_ctxs = push_array(scratch.arena, DW2_ParseCtx, unit_count); + } + lane_sync_u64(&unit_parse_ctxs, 0); + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + DW2_UnitHeader *hdr = &unit_headers[unit_idx]; + DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; + + // rjf: equip initial bootstrapping info + dw2_parse_ctx_equip_unit_header(ctx, hdr, unit_info_ranges->v[unit_idx].min); + dw2_parse_ctx_equip_unit_abbrev_map(ctx, &unit_abbrev_map_map, unit_idx); + + // rjf: do bootstrapping parse of root tag + DW2_Tag root_tag_bootstrap = {0}; + dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag_bootstrap); + + // rjf: equip info extracted from bootstrapping parse + dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag_bootstrap, offset_tables); + + // rjf: do non-bootstrapping parse + DW2_Tag root_tag = {0}; + dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag); + + // rjf: equip info extracted from non-bootstrapping parse + dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag, offset_tables); + } + } + lane_sync(); + + //- rjf: dump all unit tag trees + String8List *unit_dumps = 0; + if(lane_idx() == 0) + { + unit_dumps = push_array(scratch.arena, String8List, unit_count); + } + lane_sync_u64(&unit_dumps, 0); + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + String8List *strings_restore = strings; + for(;;) + { + //- rjf: take unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= unit_count) + { + break; + } + + //- rjf: unpack unit + strings = &unit_dumps[unit_idx]; + DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; + + //- rjf: dump + dumpf(" unit: // unit[%I64u], .debug_info@0x%I64x\n", unit_idx, ctx->unit_base_info_off); + dumpf(" {\n"); + dumpf(" version: %u\n", ctx->version); + dumpf(" format: %S\n", dw_string_from_format(ctx->format)); + dumpf(" abbrev_off: 0x%I64x\n", unit_headers[unit_idx].abbrev_off); + dumpf(" addr_size: %I64u\n", ctx->addr_size); + dumpf(" kind: %S\n", dw_string_from_comp_unit_kind(unit_headers[unit_idx].kind)); + dumpf(" dwo_id: 0x%I64x\n", unit_headers[unit_idx].dwo_id); + dumpf(" tags:\n {\n"); + { + U64 depth = 0; + for(U64 off = unit_info_tag_ranges[unit_idx].min; off < unit_info_tag_ranges[unit_idx].max;) + { + U64 start_off = off; + Temp tag_scratch = scratch_begin(&scratch.arena, 1); + + // rjf: parse next tag + DW2_Tag tag = {0}; + off += dw2_read_tag(tag_scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + + // rjf: non-zero tag -> dump + if(tag.kind != DW_TagKind_Null) + { + dumpf(" %.*s%S: // .debug_info@0x%I64x\n", depth, indent.str, dw_string_from_tag_kind(ctx->version, ctx->exts, tag.kind), start_off); + dumpf(" %.*s{\n", depth, indent.str); + for EachNode(n, DW2_AttribNode, tag.attribs.first) + { + DW2_Attrib *attrib = &n->v; + String8 kind_string = dw_string_from_attrib_kind(ctx->version, ctx->exts, attrib->attrib_kind); + String8 form_kind_string = dw_string_from_form_kind(ctx->version, ctx->exts, attrib->val.kind); + String8 value_string = {0}; + DW_AttribClass value_class = dw_attrib_class_from_form_kind(ctx->version, ctx->exts, attrib->val.kind); + switch(value_class) + { + default: + { + value_string = str8f(tag_scratch.arena, "0x%I64x", attrib->val.u128.u64[0]); + }break; + case DW_AttribClass_Address: + { + value_string = str8f(tag_scratch.arena, "0x%I64x", attrib->val.addr); + }break; + case DW_AttribClass_String: + { + value_string = str8f(tag_scratch.arena, "\"%S\"", attrib->val.string); + }break; + case DW_AttribClass_Flag: + { + value_string = attrib->val.u128.u64[0] ? s("true") : s("false"); + }break; + case DW_AttribClass_Block: + { + String8 block = attrib->val.string; + String8List block_strs = numeric_str8_list_from_data(tag_scratch.arena, 16, block, 1); + value_string = str8_list_join(tag_scratch.arena, &block_strs, &(StringJoin){.pre = s("{ "), .sep = s(", "), .post = s(" }")}); + }break; + case DW_AttribClass_ExprLoc: + { + String8 expr = attrib->val.string; + String8List expr_strs = dw_dump_list_from_expr(tag_scratch.arena, expr, arch, ctx); + value_string = str8_list_join(tag_scratch.arena, &expr_strs, &(StringJoin){.pre = s("{ "), .sep = s(", "), .post = s(" }")}); + }break; + } + dumpf(" %.*s %S: %S // %S\n", depth, indent.str, kind_string, value_string, form_kind_string); + } + } + + // rjf: push/pop + if(tag.has_children) + { + depth += 1; + } + else if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + + // rjf: if tag does not have children -> end info + if(!tag.has_children) + { + dumpf(" %.*s}\n", depth, indent.str); + } + + scratch_end(tag_scratch); + if(off == start_off) + { + break; + } + } + } + dumpf(" }\n"); + dumpf(" }\n"); + } + strings = strings_restore; + + //- rjf: join unit dumps in order + if(lane_idx() == 0) + { + dumpf("\nunits:\n{\n"); + for EachIndex(unit_idx, unit_count) + { + str8_list_concat_in_place(strings, &unit_dumps[unit_idx]); + } + dumpf("}\n"); + } + lane_sync(); + } + + ////////////////////////////// + //- rjf: .debug_line + // + DumpSubset(Line) + { + // TODO(rjf) + } + + ////////////////////////////// + //- rjf: .debug_str + // + DumpSubset(Str) + { + if(lane_idx() == 0) + { + dumpf("\nstrings:\n{\n"); + String8 data = raw->sec[DW_SectionKind_Str].data; + U64 idx = 0; + for(U64 off = 0; off < data.size; idx += 1) + { + U64 start_off = off; + String8 string = {0}; + off += str8_deserial_read_cstr(data, off, &string); + dumpf(" {\"%S\"} // string[%I64u], .debug_str@0x%I64x\n", string, idx, start_off); + if(off == start_off) + { + break; + } + } + dumpf("}\n"); + } + } + + ////////////////////////////// + //- rjf: .debug_frame + // +#if 0 + DumpSubset(Frame) + { + // TODO(rjf) + } +#endif + + ////////////////////////////// + //- rjf: .debug_loc + // +#if 0 + DumpSubset(Loc) + { + // TODO(rjf) + } +#endif + + ////////////////////////////// + //- rjf: join results + // + String8List *result_strings_ptr = push_array(scratch.arena, String8List, 1); + lane_sync(); + if(lane_idx() == 0) + { + for EachNode(n, DumpSubsetOutputNode, first_output_node) + { + String8List subset_strings = {0}; + for EachIndex(idx, lane_count()) + { + str8_list_concat_in_place(&subset_strings, &n->lane_strings[idx]); + } + if(subset_strings.total_size != 0) + { + str8_list_pushf(arena, result_strings_ptr, "////////////////////////////////\n//~ %S\n", dw_regular_name_from_section_kind(n->section_kind)); + str8_list_concat_in_place(result_strings_ptr, &subset_strings); + str8_list_pushf(arena, result_strings_ptr, "\n"); + } + } + } + lane_sync(); + lane_sync_u64(&result_strings_ptr, 0); + String8List result_strings = *result_strings_ptr; + lane_sync(); + +#undef DumpSubsetKind +#undef DumpSubset +#undef dump +#undef dumpf + scratch_end(scratch); + ProfEnd(); + return result_strings; +} diff --git a/src/dwarf/dwarf_dump_2.h b/src/dwarf/dwarf_dump_2.h new file mode 100644 index 00000000..620c7562 --- /dev/null +++ b/src/dwarf/dwarf_dump_2.h @@ -0,0 +1,17 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_DUMP_2_H +#define DWARF_DUMP_2_H + +//////////////////////////////// +//~ rjf: Helpers + +internal String8List dw_dump_list_from_expr(Arena *arena, String8 data, Arch arch, DW2_ParseCtx *ctx); + +//////////////////////////////// +//~ rjf: Main Dump Entry Point + +internal String8List dw_dump_list_from_raw(Arena *arena, DW_Raw *raw, Arch arch, DW_SectionFlags subset_flags); + +#endif //DWARF_DUMP_2_H diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index f5f7f6e0..8f8e23ac 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1578,111 +1578,3 @@ dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, scratch_end(scratch); return result; } - -internal String8 -dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count) -{ - Temp scratch = scratch_begin(&arena, 1); - - String8List *srl = push_array(scratch.arena, String8List, 1); - str8_serial_begin(scratch.arena, srl); - - HashTable *label_map = hash_table_init(scratch.arena, 128); - - struct Fixup { U64 offset; String8 label; struct Fixup *next; }; - struct Fixup *first_fixup = 0, *last_fixup = 0; - - for EachIndex(i, encs_count) { - DW_ExprEnc *e = &encs[i]; - - switch (e->type) { - case DW_ExprEncType_Null: {} break; - case DW_ExprEncType_Op: { - str8_serial_push_struct(scratch.arena, srl, &e->op); - } break; - case DW_ExprEncType_U8: { - str8_serial_push_struct(scratch.arena, srl, &e->u8); - } break; - case DW_ExprEncType_U16: { - str8_serial_push_struct(scratch.arena, srl, &e->u16); - } break; - case DW_ExprEncType_U32: { - str8_serial_push_struct(scratch.arena, srl, &e->u32); - } break; - case DW_ExprEncType_U64: { - str8_serial_push_struct(scratch.arena, srl, &e->u64); - } break; - case DW_ExprEncType_S8: { - str8_serial_push_struct(scratch.arena, srl, &e->s8); - } break; - case DW_ExprEncType_S16: { - str8_serial_push_struct(scratch.arena, srl, &e->s16); - } break; - case DW_ExprEncType_S32: { - str8_serial_push_struct(scratch.arena, srl, &e->s32); - } break; - case DW_ExprEncType_S64: { - str8_serial_push_struct(scratch.arena, srl, &e->s64); - } break; - case DW_ExprEncType_ULEB128: { - str8_serial_push_string(scratch.arena, srl, dw_write_uleb128(scratch.arena, e->u64)); - } break; - case DW_ExprEncType_SLEB128: { - str8_serial_push_string(scratch.arena, srl, dw_write_sleb128(scratch.arena, e->s64)); - } break; - case DW_ExprEncType_Addr: { - U64 addr_size = byte_size_from_arch(arch); - Assert(addr_size <= sizeof(e->addr)); - str8_serial_push_string(scratch.arena, srl, str8((U8 *)&e->addr, addr_size)); - } break; - case DW_ExprEncType_Block: { - Assert(e->block.size <= max_U8); - str8_serial_push_u8(scratch.arena, srl, (U8)e->block.size); - str8_serial_push_string(scratch.arena, srl, e->block); - } break; - case DW_ExprEncType_DwarfUInt: { - switch (format) { - case DW_Format_Null: {} break; - case DW_Format_32Bit: { str8_serial_push_u32(scratch.arena, srl, e->u32); } break; - case DW_Format_64Bit: { str8_serial_push_u64(scratch.arena, srl, e->u64); } break; - default: { InvalidPath; } break; - } - } break; - case DW_ExprEncType_Label: { - struct Fixup *fixup = push_array(scratch.arena, struct Fixup, 1); - fixup->offset = srl->total_size; - fixup->label = e->label; - SLLQueuePush(first_fixup, last_fixup, fixup); - - S16 delta_placeholder = 0; - str8_serial_push_struct(scratch.arena, srl, &delta_placeholder); - } break; - case DW_ExprEncType_DeclLabel: { - hash_table_push_string_u64(scratch.arena, label_map, e->label, srl->total_size); - } break; - default: { InvalidPath; } break; - } - } - - // finalize expression - String8 expr = str8_serial_end(arena, srl); - - // apply fixups - for EachNode(fixup, struct Fixup, first_fixup) { - U64 label_offset; - if (!hash_table_search_string_u64(label_map, fixup->label, &label_offset)) { - Assert(0 && "undefined label"); - continue; - } - - S64 delta = (S64)label_offset - (S64)fixup->offset; - AssertAlways(min_S16 <= delta && delta <= max_S16); - - S16 *delta_ptr = (S16 *)(expr.str + fixup->offset); - *delta_ptr = delta; - } - - scratch_end(scratch); - return expr; -} - diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index d9c3bdae..432b5b22 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -229,8 +229,5 @@ internal String8 dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprV // evaluator internal DW_ExprEvalResult dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls_base, U64 op_limit, DW_Expr expr, void *reg_block, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out); -// encoder -internal String8 dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count); - #endif //DWARF_EXPR_H diff --git a/src/dwarf/dwarf_expr_2.c b/src/dwarf/dwarf_expr_2.c new file mode 100644 index 00000000..3e3d6397 --- /dev/null +++ b/src/dwarf/dwarf_expr_2.c @@ -0,0 +1,393 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Expression Evaluation Functions + +internal DW_Eval +dw_eval(Arena *arena, DW_Format fmt, Arch arch, MemoryMap *memory_map, void *regs, U64 frame_base, U64 cfa, U64 tls, DW_EvalState *state, String8 expr, U64 op_idx_cap) +{ + DW_Eval result = {0}; + ARCH_Info *arch_info = arch_info_from_arch(arch); + B32 need_a_break = 0; + B32 done = 0; + for(;state->off < expr.size && !need_a_break && !done;) + { + U64 start_off = state->off; + U64 off = state->off; + + //- rjf: too many ops? -> error + if(state->op_idx >= op_idx_cap) + { + result.status = DW_EvalStatus_ExecOpLimitReached; + break; + } + + //- rjf: read next opcode + DW_ExprOp opcode = 0; + off += str8_deserial_read_struct(expr, off, &opcode); + + //- rjf: unpack opcode + U8 push_count = 0; + U8 pop_count = 0; + U8 operand_count = 0; + DW_ExprOperandKind operand_kinds[2] = {DW_ExprOperandKind_Null}; + { + DW_ExprOpInfo *op_info = dw_info_from_expr_op(DW_Version_5, DW_ExtFlag_All, opcode); + push_count = op_info->push_count; + pop_count = op_info->pop_count; + operand_count = op_info->operand_count; + MemoryCopy(operand_kinds, op_info->operand_kinds, sizeof(operand_kinds)); + } + + //- rjf: read operands + DW_EvalVal operands[2] = {0}; + for(U8 operand_idx = 0; operand_idx < operand_count; operand_idx += 1) + { + U64 fixed_bytes_to_read = 0; + switch(operand_kinds[operand_idx]) + { + default:{}break; + case DW_ExprOperandKind_U8: {fixed_bytes_to_read = 1;}goto fixed_read; + case DW_ExprOperandKind_U16: {fixed_bytes_to_read = 2;}goto fixed_read; + case DW_ExprOperandKind_U32: {fixed_bytes_to_read = 4;}goto fixed_read; + case DW_ExprOperandKind_U64: {fixed_bytes_to_read = 8;}goto fixed_read; + case DW_ExprOperandKind_S8: {fixed_bytes_to_read = 1;}goto fixed_read; + case DW_ExprOperandKind_S16: {fixed_bytes_to_read = 2;}goto fixed_read; + case DW_ExprOperandKind_S32: {fixed_bytes_to_read = 4;}goto fixed_read; + case DW_ExprOperandKind_S64: {fixed_bytes_to_read = 8;}goto fixed_read; + case DW_ExprOperandKind_Addr: {fixed_bytes_to_read = byte_size_from_arch(arch);}goto fixed_read; + case DW_ExprOperandKind_DwarfUInt:{fixed_bytes_to_read = dw_addr_size_from_format(fmt);}goto fixed_read; + fixed_read:; + { + off += str8_deserial_read(expr, off, &operands[operand_idx].u512.u64[0], fixed_bytes_to_read, fixed_bytes_to_read); + }break; + case DW_ExprOperandKind_ULEB128: + { + off += str8_deserial_read_uleb128(expr, off, &operands[operand_idx].u512.u64[0]); + }break; + case DW_ExprOperandKind_SLEB128: + { + off += str8_deserial_read_sleb128(expr, off, &operands[operand_idx].s64); + }break; + case DW_ExprOperandKind_Block: + { + U8 block_size = 0; + off += str8_deserial_read_struct(expr, off, &block_size); + operands[operand_idx].data = str8_prefix(str8_skip(expr, off), block_size); + }break; + } + } + + //- rjf: do pops + DW_EvalVal popped_vals[3] = {0}; + { + pop_count = Min(pop_count, ArrayCount(popped_vals)); + for(U8 pop_idx = 0; pop_idx < pop_count; pop_idx += 1) + { + if(state->top_val != 0) + { + DW_EvalValNode *popped = state->top_val; + SLLStackPop(state->top_val); + popped_vals[pop_idx] = popped->v; + SLLStackPush(state->free_val, popped); + } + } + } + + //- rjf: apply opcode + DW_EvalVal push_vals[3] = {0}; + U64 pick_target_idx = 0; + U64 deref_read_size = 0; + DW_RegCode reg_code_dw = 0; + switch(opcode) + { + //- rjf: unsuported ops + case DW_ExprOp_Call2: // DWARF function calls + case DW_ExprOp_Call4: // DWARF function calls + case DW_ExprOp_CallRef: // DWARF function calls + case DW_ExprOp_Addrx: // address in .debug_addr; not currently present for us, need to find how to preserve if we care + case DW_ExprOp_Constx: // address in .debug_addr; not currently present for us, need to find how to preserve if we care + case DW_ExprOp_EntryValue: // encodes a sub-expression as a data block - need to recursively evaluate, lol + case DW_ExprOp_ConstType: // pushes a constant - but refers into DWARF debug info to specify the type. we don't have that, need to figure out how to preserve mapping from DW type ID -> RDI type, if we care + case DW_ExprOp_DerefType: // same as above - refers to DWARF debug info + case DW_ExprOp_RegvalType: // same as above - refers to DWARF debug info + case DW_ExprOp_Piece: // pieces - used to stitch multiple sub-values together + case DW_ExprOp_BitPiece: // pieces - used to stitch multiple sub-values together + case DW_ExprOp_XDeref: // two entries popped from stack - second one is 'address space identifier'. not possible in this layer right now + case DW_ExprOp_XDerefSize: // does multiple address spaces + case DW_ExprOp_XDerefType: // refers to DWARF debug info, *and* does multiple address spaces + case DW_ExprOp_PushObjectAddress: // pushes "the address of the object currently being evaluated" ??? + case DW_ExprOp_ImplicitPointer: // refers to DWARF debug info + default: + { + done = 1; + result.status = DW_EvalStatus_UnsupportedOp; + }break; + + //- rjf: address ops + case DW_ExprOp_Deref:{deref_read_size = byte_size_from_arch(arch);}goto deref; + case DW_ExprOp_DerefSize:{deref_read_size = operands[0].u512.u64[0];}goto deref; + deref:; + { + U64 vaddr = popped_vals[0].u512.u64[0]; + U64 read_size = Min(deref_read_size, sizeof(push_vals[0].u512)); + Rng1U64 read_vaddr_range = r1u64(vaddr, vaddr+read_size); + if(!memory_map_read(memory_map, read_vaddr_range, &push_vals[0].u512)) + { + need_a_break = 1; + result.status = DW_EvalStatus_FailedMemoryRead; + result.missed_read_vaddr_range = read_vaddr_range; + } + }break; + + //- rjf: generic constants + case DW_ExprOp_Const1U: case DW_ExprOp_Const1S: + case DW_ExprOp_Const2U: case DW_ExprOp_Const2S: + case DW_ExprOp_Const4U: case DW_ExprOp_Const4S: + case DW_ExprOp_Const8U: case DW_ExprOp_Const8S: + case DW_ExprOp_ConstU: case DW_ExprOp_ConstS: + case DW_ExprOp_Addr: + { + push_vals[0] = operands[0]; + }break; + + //- rjf: stack ops + case DW_ExprOp_Dup:{push_vals[0] = popped_vals[0];}break; + case DW_ExprOp_Drop:{/* NOTE(rjf): nothing to do here - just pops */}break; + case DW_ExprOp_Swap:{push_vals[0] = popped_vals[1]; push_vals[1] = popped_vals[0];}break; + case DW_ExprOp_Rot: {push_vals[0] = popped_vals[0]; push_vals[1] = popped_vals[1]; push_vals[2] = popped_vals[2];}break; + case DW_ExprOp_Over:{pick_target_idx = 1;}break; + case DW_ExprOp_Pick:{pick_target_idx = operands[0].u512.u64[0];}goto pick_stack_val; + pick_stack_val:; + { + U64 idx = 0; + for(DW_EvalValNode *n = state->top_val; n != 0; n = n->next, idx += 1) + { + if(idx == pick_target_idx) + { + push_vals[0] = n->v; + break; + } + } + }break; + + //- rjf: arithmetic ops +#define UniOpU(k, op) case k:{push_vals[0].u512.u64[0] = op(popped_vals[0].u512.u64[0]);}break +#define UniOpS(k, op) case k:{push_vals[0].s64 = op(popped_vals[0].s64);}break +#define BinOpS(k, op) case k:{push_vals[0].s64 = popped_vals[1].s64 op popped_vals[0].s64;}break +#define BinOpU(k, op) case k:{push_vals[0].u512.u64[0] = popped_vals[1].u512.u64[0] op popped_vals[0].u512.u64[0];}break +#define BinOpDiv(k, op) case k:if(popped_vals[0].u512.u64[0] != 0){push_vals[0].u512.u64[0] = popped_vals[1].u512.u64[0] op popped_vals[0].u512.u64[0];}break + UniOpS(DW_ExprOp_Abs, abs_s64); + UniOpS(DW_ExprOp_Neg, -); + UniOpU(DW_ExprOp_Not, !); + BinOpU(DW_ExprOp_Minus, -); + BinOpU(DW_ExprOp_Mul, *); + BinOpU(DW_ExprOp_Plus, +); + BinOpU(DW_ExprOp_Shl, <<); + BinOpU(DW_ExprOp_Shr, >>); + BinOpU(DW_ExprOp_And, &); + BinOpU(DW_ExprOp_Or, |); + BinOpU(DW_ExprOp_Xor, ^); + BinOpS(DW_ExprOp_Shra, >>); + BinOpDiv(DW_ExprOp_Div, /); + BinOpDiv(DW_ExprOp_Mod, %); + BinOpU(DW_ExprOp_Eq, ==); + BinOpU(DW_ExprOp_Ne, !=); + BinOpS(DW_ExprOp_Ge, >=); + BinOpS(DW_ExprOp_Gt, >); + BinOpS(DW_ExprOp_Le, <=); + BinOpS(DW_ExprOp_Lt, <); +#undef UniOpU +#undef UniOpS +#undef BinOpS +#undef BinOpU +#undef BinOpDiv + case DW_ExprOp_PlusUConst: + { + push_vals[0].u512.u64[0] = popped_vals[0].u512.u64[0] + operands[0].u512.u64[0]; + }break; + + //- rjf: jumps/branches + case DW_ExprOp_Bra: + { + if(popped_vals[0].u512.u64[0] == 0) + { + break; + } + } // fallthrough + case DW_ExprOp_Skip: + { + S64 jump_delta = operands[0].s64; + if((jump_delta < 0 && -jump_delta > off) || (off + jump_delta >= expr.size)) + { + done = 1; + result.status = DW_EvalStatus_Error; + } + else + { + off += jump_delta; + } + }break; + + //- rjf: literals + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: case DW_ExprOp_Lit3: + case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: + case DW_ExprOp_Lit8: case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: case DW_ExprOp_Lit15: + case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: + case DW_ExprOp_Lit20: case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: case DW_ExprOp_Lit27: + case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: + { + U8 val = (opcode - DW_ExprOp_Lit0); + push_vals[0].u512.u8[0] = val; + }break; + + //- rjf: register reads (opcode-encoded reg) + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: case DW_ExprOp_Reg3: + case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: + case DW_ExprOp_Reg8: case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: case DW_ExprOp_Reg15: + case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: + case DW_ExprOp_Reg20: case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: case DW_ExprOp_Reg27: + case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + {reg_code_dw = (opcode - DW_ExprOp_Reg0);}goto reg_read; + case DW_ExprOp_RegX: + {reg_code_dw = operands[0].u512.u64[0];}goto reg_read; + reg_read:; + { + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_code_dw); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + U64 read_size = dim_1u16(reg_rng); + read_size = Min(read_size, sizeof(push_vals[0].u512)); + reg_rng.max = reg_rng.min + read_size; + arch_reg_block_read_range(arch_info, regs, reg_rng, &push_vals[0].u512); + }break; + + //- rjf: register reads (opcode-encoded reg + offset) + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: case DW_ExprOp_BReg3: + case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: + case DW_ExprOp_BReg8: case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: case DW_ExprOp_BReg15: + case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: + case DW_ExprOp_BReg20: case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: case DW_ExprOp_BReg27: + case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + {reg_code_dw = (opcode - DW_ExprOp_BReg0);}goto based_reg_read; + case DW_ExprOp_BRegX: + {reg_code_dw = operands[0].u512.u64[0];}goto based_reg_read; + based_reg_read:; + { + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_code_dw); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + U64 read_size = dim_1u16(reg_rng); + read_size = Min(read_size, sizeof(push_vals[0].u512)); + reg_rng.max = reg_rng.min + read_size; + arch_reg_block_read_range(arch_info, regs, reg_rng, &push_vals[0].u512); + push_vals[0].u512.u64[0] += operands[0].s64; + }break; + + //- rjf: frame base register read + case DW_ExprOp_FBReg: + { + push_vals[0].u512.u64[0] = (U64)(frame_base + operands[0].s64); + }break; + + //- rjf: TLS + case DW_ExprOp_FormTlsAddress: + { + U64 tls_off = popped_vals[0].u512.u64[0]; + U64 tls_addr = tls + tls_off; + push_vals[0].u512.u64[0] = tls_addr; + }break; + + //- rjf: call frame CFA + case DW_ExprOp_CallFrameCfa: + { + push_vals[0].u512.u64[0] = cfa; + }break; + + //- rjf: implicit location descriptions (value is known, location is not) + case DW_ExprOp_ImplicitValue: + { + push_vals[0] = operands[0]; + }break; + case DW_ExprOp_StackValue: + { + // NOTE(rjf): nothing to do here - program is over, value (but not location) has + // been evaluated and exists as the top entry on the stack. + }break; + + //- rjf: conversions + case DW_ExprOp_Convert: + case DW_ExprOp_Reinterpret: + { + if(operands[0].u512.u64[0] == 0) + { + push_vals[0] = popped_vals[0]; + } + else + { + // NOTE(rjf): with a nonzero operand, it is expecting us to read into the + // DWARF debug info and push as that base type. we do not have access to that + // in the general case here, and we need to figure out how to preserve that info + // if we care. + done = 1; + result.status = DW_EvalStatus_UnsupportedOp; + } + }break; + } + + //- rjf: do pushes + if(!done && !need_a_break) + { + push_count = Min(push_count, ArrayCount(push_vals)); + for(U8 push_idx = 0; push_idx < push_count; push_idx += 1) + { + DW_EvalValNode *n = state->free_val; + if(n != 0) + { + SLLStackPop(state->free_val); + } + else + { + n = push_array(arena, DW_EvalValNode, 1); + } + n->v = push_vals[push_idx]; + SLLStackPush(state->top_val, n); + } + } + + //- rjf: do not need a break? advance state. + // + // (if we *do* need a break, this means we need to ask the caller for + // more info, like memory reads, and so we want to resume from the + // offset just before this opcode) + // + if(!need_a_break) + { + state->op_idx += 1; + state->off = off; + } + + //- rjf: at the end of the expression? -> set success, fill result + if(off == expr.size) + { + result.status = DW_EvalStatus_Good; + if(state->top_val != 0) + { + result.val = state->top_val->v; + } + } + + //- rjf: did not advance? -> error + if(off == start_off) + { + result.status = DW_EvalStatus_Error; + break; + } + } + return result; +} diff --git a/src/dwarf/dwarf_expr_2.h b/src/dwarf/dwarf_expr_2.h new file mode 100644 index 00000000..e68a9617 --- /dev/null +++ b/src/dwarf/dwarf_expr_2.h @@ -0,0 +1,66 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_EXPR_2_H +#define DWARF_EXPR_2_H + +//////////////////////////////// +//~ rjf: Evaluation Values + +typedef struct DW_EvalVal DW_EvalVal; +struct DW_EvalVal +{ + union + { + U512 u512; + S64 s64; + }; + String8 data; +}; + +typedef struct DW_EvalValNode DW_EvalValNode; +struct DW_EvalValNode +{ + DW_EvalValNode *next; + DW_EvalVal v; +}; + +//////////////////////////////// +//~ rjf: Evaluation Results + +typedef enum DW_EvalStatus +{ + DW_EvalStatus_Error, + DW_EvalStatus_FailedMemoryRead, + DW_EvalStatus_ExecOpLimitReached, + DW_EvalStatus_UnsupportedOp, + DW_EvalStatus_Good, +} +DW_EvalStatus; + +typedef struct DW_Eval DW_Eval; +struct DW_Eval +{ + DW_EvalVal val; + DW_EvalStatus status; + Rng1U64 missed_read_vaddr_range; +}; + +//////////////////////////////// +//~ rjf: Evaluation State Machine + +typedef struct DW_EvalState DW_EvalState; +struct DW_EvalState +{ + U64 off; + U64 op_idx; + DW_EvalValNode *top_val; + DW_EvalValNode *free_val; +}; + +//////////////////////////////// +//~ rjf: Expression Evaluation Functions + +internal DW_Eval dw_eval(Arena *arena, DW_Format fmt, Arch arch, MemoryMap *memory_map, void *regs, U64 frame_base, U64 cfa, U64 tls, DW_EvalState *state, String8 expr, U64 op_idx_cap); + +#endif // DWARF_EXPR_2_H diff --git a/src/dwarf/dwarf_help.c b/src/dwarf/dwarf_help.c deleted file mode 100644 index 84ccf52c..00000000 --- a/src/dwarf/dwarf_help.c +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal DW_CallFrameInfo -dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame) -{ - Temp scratch = scratch_begin(&arena, 1); - - // count CIE and FDE entries - U64 cie_count = 0, fde_count = 0; - for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { - DW_DescriptorEntry desc = {0}; - desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); - if (desc_size == 0) { break; } - if (desc.type == DW_DescriptorEntryType_CIE) { - cie_count += 1; - } else if (desc.type == DW_DescriptorEntryType_FDE) { - fde_count += 1; - } - } - - // parse CIEs and build (offset -> CIE) hash table - HashTable *cie_ht = hash_table_init(scratch.arena, (U64)(cie_count * 1.3)); - DW_CIE *cie = push_array(arena, DW_CIE, cie_count); - U64 parse_cie_count = 0; - for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { - DW_DescriptorEntry desc = {0}; - desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); - if (desc_size == 0) { break; } - if (desc.type == DW_DescriptorEntryType_CIE) { - if (dw_parse_cie(str8_skip(debug_frame, cursor), desc.format, arch, &cie[parse_cie_count])) { - hash_table_push_u64_raw(scratch.arena, cie_ht, cursor, &cie[parse_cie_count]); - parse_cie_count += 1; - } - } - } - - // parse FDEs - DW_FDE *fde = push_array(arena, DW_FDE, fde_count); - U64 parse_fde_count = 0; - for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { - DW_DescriptorEntry desc = {0}; - desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); - if (desc_size == 0) { break; } - if (desc.type == DW_DescriptorEntryType_FDE) { - DW_CIE *cie = hash_table_search_u64_raw(cie_ht, desc.cie_pointer); - if (dw_parse_fde(str8_skip(debug_frame, cursor), desc.format, cie, &fde[parse_fde_count])) { - fde[parse_fde_count].pc_range.min += rebase; - fde[parse_fde_count].pc_range.max += rebase; - parse_fde_count += 1; - } - } - } - - // fill out result - DW_CallFrameInfo cfi = {0}; - cfi.cie_count = parse_cie_count; - cfi.fde_count = parse_fde_count; - cfi.cie = cie; - cfi.fde = fde; - - scratch_end(scratch); - return cfi; -} - - diff --git a/src/dwarf/dwarf_help.h b/src/dwarf/dwarf_help.h deleted file mode 100644 index 2882c6b6..00000000 --- a/src/dwarf/dwarf_help.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DWARF_HELP_H -#define DWARF_HELP_H - -typedef struct DW_CallFrameInfo -{ - U64 cie_count; - U64 fde_count; - DW_CIE *cie; - DW_FDE *fde; -} DW_CallFrameInfo; - -internal DW_CallFrameInfo dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame); - -#endif // DWARF_HELP_H - diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index e6bfc490..42a9d935 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -2,17 +2,21 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #include "dwarf/dwarf.c" -#include "dwarf/dwarf_parse.c" -#include "dwarf/dwarf_expr.c" -#include "dwarf/dwarf_coff.c" -#include "dwarf/dwarf_elf.c" -#include "dwarf/dwarf_unwind.c" -#include "dwarf/dwarf_dump.c" -#include "dwarf/dwarf_help.c" -#include "dwarf/dwarf_writer.c" +// #include "dwarf/dwarf_parse.c" +// #include "dwarf/dwarf_expr.c" +#include "dwarf/dwarf_expr_2.c" +// #include "dwarf/dwarf_unwind.c" +// #include "dwarf/dwarf_dump.c" #include "dwarf/dwarf_parse_2.c" -#include "dwarf/eh_frame.c" -#include "dwarf/eh_dump.c" -#if defined(X64_H) -# include "dwarf/x64/dwarf_x64.c" +#include "dwarf/dwarf_unwind_2.c" +#include "dwarf/dwarf_dump_2.c" +#if defined(COFF_H) +# include "dwarf/dwarf_parse_coff.c" +#endif +#if defined(ELF_H) +# include "dwarf/dwarf_parse_elf.c" +#endif + +#if 0 // TODO(rjf): this uses concepts from the old parser +# include "dwarf/dwarf_writer.c" #endif diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index fa551f62..acb0be66 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -5,19 +5,23 @@ #define DWARF_INC_H #include "dwarf/dwarf.h" -#include "dwarf/dwarf_parse.h" -#include "dwarf/dwarf_expr.h" -#include "dwarf/dwarf_coff.h" -#include "dwarf/dwarf_elf.h" -#include "dwarf/dwarf_unwind.h" -#include "dwarf/dwarf_dump.h" -#include "dwarf/dwarf_help.h" -#include "dwarf/dwarf_writer.h" +// #include "dwarf/dwarf_parse.h" +// #include "dwarf/dwarf_expr.h" +#include "dwarf/dwarf_expr_2.h" +// #include "dwarf/dwarf_unwind.h" +// #include "dwarf/dwarf_dump.h" #include "dwarf/dwarf_parse_2.h" -#include "dwarf/eh_frame.h" -#include "dwarf/eh_dump.h" -#if defined(X64_H) -# include "dwarf/x64/dwarf_x64.h" +#include "dwarf/dwarf_unwind_2.h" +#include "dwarf/dwarf_dump_2.h" +#if defined(COFF_H) +# include "dwarf/dwarf_parse_coff.h" +#endif +#if defined(ELF_H) +# include "dwarf/dwarf_parse_elf.h" +#endif + +#if 0 // TODO(rjf): this uses concepts from the old parser +# include "dwarf/dwarf_writer.h" #endif #endif // DWARF_INC_H diff --git a/src/dwarf/dwarf_notes.txt b/src/dwarf/dwarf_notes.txt deleted file mode 100644 index 2c02214f..00000000 --- a/src/dwarf/dwarf_notes.txt +++ /dev/null @@ -1,42 +0,0 @@ ---- DWARF NOTES --------------------------------------------------------------- - -DWARF V4 Spec: http://www.dwarfstd.org/doc/DWARF4.pdf -DWARF V5 Spec: http://www.dwarfstd.org/doc/DWARF5.pdf - -------------------------------------------------------------------------------- - -$ (2021/04/30) On .debug_pubtypes, .debug_pubnames, and .debug_names: - -.debug_pubtypes and .debug_pubnames are tables that map from a string (the name -of a type or function respectively) to an offset into .debug_info, which is the -offset of the Debug Information Entry (DIE, in DWARF terminology) of the info -associated with the string. THESE TWO SECTIONS ARE OPTIONAL. They don't show up -in every DWARF-holding file, and so they cannot be relied upon as acceleration -structures. But we're going to support parsing them, to make things a bit nicer -in cases where they are present. DWARF doesn't have much in the way of acceler- -ation structures built in, so our rationale is that we should take anything we -can get to make the format a bit more in some subset of the possible cases. - -.debug_names is a DWARF V5 section that is intended to replace .debug_pubtypes -and .debug_pubnames. However, even in cases when DWARF V5 is produced at the -time of writing this, we have not found .debug_names sections being produced. -We did not exhaustively test all compilers and configurations, but it seems -that it is not well-supported at all by major compilers, and there's a very low -probability that a user will have that section, so our current thinking is -that there's no point in supporting it right now. - -------------------------------------------------------------------------------- - -$ (2021/04/30) On producing DWARF V5 with Clang: - -https://lists.llvm.org/pipermail/llvm-dev/2018-August/125068.html - -By default it looks like (at the time of writing this) that Clang, by default, -will produce DWARF V4. To produce DWARF V5, however, you can use the -gdwarf-5 -option. Even when that option is used, it seems that some features of V5 are -not used (for example, .debug_names). - -The above link also says that this will produce .debug_names, but it doesn't as -of Clang 10. - -------------------------------------------------------------------------------- diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index 4b8943b8..a8898477 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -53,18 +53,14 @@ str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) { U8 byte = 0; U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) { break; } - U8 val = byte & 0x7fu; value |= ((U64)val) << shift; - cursor += bytes_read; shift += 7u; - if((byte & 0x80u) == 0) { break; @@ -92,13 +88,10 @@ str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) { break; } - U8 val = byte & 0x7fu; value |= ((U64)val) << shift; - cursor += bytes_read; shift += 7u; - if((byte & 0x80u) == 0) { if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) @@ -2912,7 +2905,7 @@ dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64; desc_out->format = format; - desc_out->type = (id == id_type) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; + desc_out->type = (id == id_type) ? DW_DescriptorEntryKind_CIE : DW_DescriptorEntryKind_FDE; desc_out->entry_range = entry_range; desc_out->cie_pointer = id; desc_out->cie_pointer_off = length_size; @@ -2952,7 +2945,6 @@ dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) TryRead(str8_deserial_read_sleb128(data, cursor, &data_align_factor), cursor, exit); U64 ret_addr_reg = 0; - U64 ret_addr_reg_size = 0; if (version == DW_Version_1) { TryRead(str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)), cursor, exit); } else { TryRead(str8_deserial_read_uleb128(data, cursor, &ret_addr_reg), cursor, exit); } @@ -3012,14 +3004,14 @@ dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *f B32 is_parsed = 0; DW_DescriptorEntry fde_desc = {0}; dw_parse_descriptor_entry_header(data, fde_offset, &fde_desc); - if (fde_desc.type == DW_DescriptorEntryType_FDE) { + if (fde_desc.type == DW_DescriptorEntryKind_FDE) { U64 cie_pointer_off = fde_desc.format == DW_Format_32Bit ? 4 : 12; U64 cie_pointer = 0; U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); if (cie_pointer_size) { DW_DescriptorEntry cie_desc = {0}; dw_parse_descriptor_entry_header(data, cie_pointer, &cie_desc); - if (cie_desc.type == DW_DescriptorEntryType_CIE) { + if (cie_desc.type == DW_DescriptorEntryKind_CIE) { if (dw_parse_cie(str8_substr(data, cie_desc.entry_range), cie_desc.format, arch, cie_out)) { if (dw_parse_fde(str8_substr(data, fde_desc.entry_range), fde_desc.format, cie_out, fde_out)) { is_parsed = 1; diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index edd7c1f0..2bddbe72 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -335,22 +335,6 @@ typedef struct DW_Expr //////////////////////////////// // .debug_frame -typedef enum -{ - DW_DescriptorEntryType_Null, - DW_DescriptorEntryType_CIE, - DW_DescriptorEntryType_FDE -} DW_DescriptorEntryType; - -typedef struct DW_DescriptorEntry -{ - DW_DescriptorEntryType type; - DW_Format format; - Rng1U64 entry_range; - U64 cie_pointer_off; - U64 cie_pointer; -} DW_DescriptorEntry; - typedef struct DW_CIE { String8 insts; @@ -418,8 +402,6 @@ internal U64 dw_hash_from_string(String8 string); internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out); internal U64 str8_deserial_read_dwarf_uint (String8 string, U64 off, DW_Format format, U64 *uint_out); -internal U64 str8_deserial_read_uleb128 (String8 string, U64 off, U64 *value_out); -internal U64 str8_deserial_read_sleb128 (String8 string, U64 off, S64 *value_out); internal U64 str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out); internal U64 str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out); diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c index 39ee4e1f..2bba4b22 100644 --- a/src/dwarf/dwarf_parse_2.c +++ b/src/dwarf/dwarf_parse_2.c @@ -56,6 +56,17 @@ dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out) return bytes_read; } +internal DW_SectionKind +dw_section_kind_from_string(String8 string) +{ + DW_SectionKind s = DW_SectionKind_Null; + if(0){} +#define X(name, regular_string, macho_string, dwo_string) else if(str8_match(string, s(regular_string), 0) || str8_match(string, s(macho_string), 0) || str8_match(string, s(dwo_string), 0)) { s = DW_SectionKind_##name; } + DW_SectionKind_XList +#undef X + return s; +} + //////////////////////////////// //~ rjf: Unit Range Set Parsing (Top-Level .debug_info, .debug_aranges) @@ -190,6 +201,72 @@ dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out) //////////////////////////////// //~ rjf: Abbreviation Map Parsing +internal U64 +dw2_read_abbrev(Arena *arena, String8 data, U64 off, DW2_AbbrevHeader *header_out, DW2_AbbrevAttribList *attribs_out) +{ + U64 start_off = off; + + // rjf: read tag abbrev + U64 id = 0; + U64 tag_kind = 0; + U8 has_children = 0; + { + off += str8_deserial_read_uleb128(data, off, &id); + if(id != 0) + { + off += str8_deserial_read_uleb128(data, off, &tag_kind); + off += str8_deserial_read_struct(data, off, &has_children); + } + } + + // rjf: read all tag attribute abbreviations + DW2_AbbrevAttribList attribs = {0}; + if(id != 0) + { + for(;;) + { + U64 attrib_start_off = off; + U64 attrib_kind = 0; + U64 attrib_form_kind = 0; + U64 implicit_const = 0; + off += str8_deserial_read_uleb128(data, off, &attrib_kind); + off += str8_deserial_read_uleb128(data, off, &attrib_form_kind); + if(attrib_form_kind == DW_FormKind_ImplicitConst) + { + off += str8_deserial_read_uleb128(data, off, &implicit_const); + } + if(attrib_kind != 0 && attribs_out != 0) + { + DW2_AbbrevAttribNode *n = push_array(arena, DW2_AbbrevAttribNode, 1); + SLLQueuePush(attribs.first, attribs.last, n); + attribs.count += 1; + n->v.attrib_kind = attrib_kind; + n->v.form_kind = attrib_form_kind; + n->v.implicit_const = implicit_const; + } + if(off == attrib_start_off || attrib_kind == 0) + { + break; + } + } + } + + // rjf: fill + if(header_out != 0) + { + header_out->id = id; + header_out->tag_kind = tag_kind; + header_out->has_children = has_children; + } + if(attribs_out != 0) + { + MemoryCopyStruct(attribs_out, &attribs); + } + + U64 bytes_read = (off-start_off); + return bytes_read; +} + internal DW2_AbbrevMap dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off) { @@ -206,60 +283,29 @@ dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off) { U64 start_off = read_off; - // rjf: read tag abbrev - U64 id = 0; - U64 tag_kind = 0; - U8 has_children = 0; - { - read_off += str8_deserial_read_uleb128(data, read_off, &id); - if(id != 0) - { - read_off += str8_deserial_read_uleb128(data, read_off, &tag_kind); - read_off += str8_deserial_read_struct(data, read_off, &has_children); - } - } + // rjf: read next abbrev + DW2_AbbrevHeader header = {0}; + read_off += dw2_read_abbrev(arena, data, read_off, &header, 0); // rjf: count tag - if(id != 0) + if(header.id != 0) { tag_count += 1; } - // rjf: read all tag attribute abbreviations - if(id != 0) - { - for(;;) - { - U64 attrib_start_off = read_off; - U64 attrib_kind = 0; - U64 attrib_form_kind = 0; - U64 implicit_const = 0; - read_off += str8_deserial_read_uleb128(data, read_off, &attrib_kind); - read_off += str8_deserial_read_uleb128(data, read_off, &attrib_form_kind); - if(attrib_form_kind == DW_Form_ImplicitConst) - { - read_off += str8_deserial_read_uleb128(data, read_off, &implicit_const); - } - if(read_off == attrib_start_off || attrib_kind == 0) - { - break; - } - } - } - // rjf: if building (second loop) -> insert into map if(build) { - U64 hash = u64_hash_from_str8(str8_struct(&id)); + U64 hash = u64_hash_from_str8(str8_struct(&header.id)); U64 slot_idx = hash%map.slots_count; DW2_AbbrevMapNode *n = push_array(arena, DW2_AbbrevMapNode, 1); SLLStackPush(map.slots[slot_idx], n); - n->id = id; + n->id = header.id; n->off = start_off; } // rjf: no tag ID, or no movement? -> exit - if(read_off == start_off || id == 0) + if(read_off == start_off || header.id == 0) { break; } @@ -276,11 +322,132 @@ dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off) return map; } +internal DW2_UnitAbbrevMapMap +dw2_unit_abbrev_map_map_from_data(Arena *arena, String8 data, DW2_UnitHeader *unit_headers, U64 unit_headers_count) +{ + DW2_UnitAbbrevMapMap result = {0}; + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: gather deduplicated .debug_abbrev offsets, representing beginnings + // of abbreviation tables. we want to do this because many units may refer + // to the same abbreviation table. + // + typedef struct AbbrevOffNode AbbrevOffNode; + struct AbbrevOffNode + { + AbbrevOffNode *order_next; + AbbrevOffNode *hash_next; + U64 off; + U64 idx; + }; + U64 abbrev_off_slots_count = unit_headers_count; + AbbrevOffNode **abbrev_off_slots = 0; + U64 abbrev_map_count = 0; + U64 *abbrev_map_off_from_idx_table = 0; + DW2_AbbrevMap *abbrev_map_from_idx_table = 0; + DW2_AbbrevMap **abbrev_map_from_unit_idx_table = 0; + ProfScope("gather deduplicated .debug_abbrev offsets") if(lane_idx() == 0) + { + AbbrevOffNode *abbrev_off_first = 0; + AbbrevOffNode *abbrev_off_last = 0; + abbrev_off_slots = push_array(scratch.arena, AbbrevOffNode *, abbrev_off_slots_count); + for EachIndex(unit_idx, unit_headers_count) + { + U64 abbrev_off = unit_headers[unit_idx].abbrev_off; + U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); + U64 slot_idx = hash%abbrev_off_slots_count; + AbbrevOffNode *node = 0; + for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->off == abbrev_off) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(arena, AbbrevOffNode, 1); + SLLStackPush_N(abbrev_off_slots[slot_idx], node, hash_next); + SLLQueuePush_N(abbrev_off_first, abbrev_off_last, node, order_next); + node->off = abbrev_off; + node->idx = abbrev_map_count; + abbrev_map_count += 1; + } + } + abbrev_map_off_from_idx_table = push_array(scratch.arena, U64, abbrev_map_count); + abbrev_map_from_idx_table = push_array(arena, DW2_AbbrevMap, abbrev_map_count); + abbrev_map_from_unit_idx_table = push_array(arena, DW2_AbbrevMap *, unit_headers_count); + { + U64 abbrev_map_idx = 0; + for(AbbrevOffNode *n = abbrev_off_first; n != 0; n = n->order_next) + { + abbrev_map_off_from_idx_table[abbrev_map_idx] = n->off; + abbrev_map_idx += 1; + } + } + } + lane_sync_u64(&abbrev_off_slots, 0); + lane_sync_u64(&abbrev_map_count, 0); + lane_sync_u64(&abbrev_map_off_from_idx_table, 0); + lane_sync_u64(&abbrev_map_from_idx_table, 0); + lane_sync_u64(&abbrev_map_from_unit_idx_table, 0); + + //- rjf: build all unique abbreviation maps + ProfScope("build all unique abbreviation maps") + { + U64 abbrev_map_take_idx = 0; + U64 *abbrev_map_take_idx_ptr = &abbrev_map_take_idx; + lane_sync_u64(&abbrev_map_take_idx_ptr, 0); + for(;;) + { + U64 abbrev_map_idx = ins_atomic_u64_inc_eval(abbrev_map_take_idx_ptr) - 1; + if(abbrev_map_idx >= abbrev_map_count) + { + break; + } + abbrev_map_from_idx_table[abbrev_map_idx] = dw2_abbrev_map_from_data(arena, data, abbrev_map_off_from_idx_table[abbrev_map_idx]); + } + lane_sync(); + } + + //- rjf: build unit -> abbrev map table + ProfScope("build unit -> abbrev map table") + { + Rng1U64 range = lane_range(unit_headers_count); + for EachInRange(unit_idx, range) + { + U64 abbrev_off = unit_headers[unit_idx].abbrev_off; + U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); + U64 slot_idx = hash%abbrev_off_slots_count; + U64 abbrev_map_idx = 0; + for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->off == abbrev_off) + { + abbrev_map_idx = n->idx; + break; + } + } + abbrev_map_from_unit_idx_table[unit_idx] = &abbrev_map_from_idx_table[abbrev_map_idx]; + } + lane_sync(); + } + + //- rjf: fill result + result.map_count = abbrev_map_count; + result.map_from_idx_table = abbrev_map_from_idx_table; + result.map_from_unit_idx_table = abbrev_map_from_unit_idx_table; + + scratch_end(scratch); + return result; +} + //////////////////////////////// //~ rjf: Form Value Parsing internal U64 -dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out) +dw2_read_form_val(DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out) { U64 start_off = off; DW2_FormVal val = {form_kind}; @@ -291,60 +458,60 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin { //- rjf: no-ops default: - case DW_Form_Indirect: - case DW_Form_Null: + case DW_FormKind_Indirect: + case DW_FormKind_Null: {}break; //- rjf: 1-byte uint reads - case DW_Form_Ref1: - case DW_Form_Data1: - case DW_Form_Flag: - case DW_Form_Strx1: - case DW_Form_Addrx1: + case DW_FormKind_Ref1: + case DW_FormKind_Data1: + case DW_FormKind_Flag: + case DW_FormKind_Strx1: + case DW_FormKind_Addrx1: bytes_to_read = 1; goto read_fixed_uint; //- rjf: 2-byte uint reads - case DW_Form_Ref2: - case DW_Form_Data2: - case DW_Form_Strx2: - case DW_Form_Addrx2: + case DW_FormKind_Ref2: + case DW_FormKind_Data2: + case DW_FormKind_Strx2: + case DW_FormKind_Addrx2: bytes_to_read = 2; goto read_fixed_uint; //- rjf: 3-byte uint reads - case DW_Form_Strx3: - case DW_Form_Addrx3: + case DW_FormKind_Strx3: + case DW_FormKind_Addrx3: bytes_to_read = 3; goto read_fixed_uint; //- rjf: 4-byte uint reads - case DW_Form_Data4: - case DW_Form_Ref4: - case DW_Form_RefSup4: - case DW_Form_Strx4: - case DW_Form_Addrx4: + case DW_FormKind_Data4: + case DW_FormKind_Ref4: + case DW_FormKind_RefSup4: + case DW_FormKind_Strx4: + case DW_FormKind_Addrx4: bytes_to_read = 4; goto read_fixed_uint; //- rjf: 8-byte uint reads - case DW_Form_Data8: - case DW_Form_Ref8: - case DW_Form_RefSig8: - case DW_Form_RefSup8: + case DW_FormKind_Data8: + case DW_FormKind_Ref8: + case DW_FormKind_RefSig8: + case DW_FormKind_RefSup8: bytes_to_read = 8; goto read_fixed_uint; //- rjf: 16-byte uint reads - case DW_Form_Data16: + case DW_FormKind_Data16: bytes_to_read = 16; goto read_fixed_uint; //- rjf: address-sized reads - case DW_Form_Addr: + case DW_FormKind_Addr: bytes_to_read = ctx->addr_size; goto read_fixed_uint; //- rjf: format-defined-size reads - case DW_Form_RefAddr: - case DW_Form_SecOffset: - case DW_Form_LineStrp: - case DW_Form_Strp: - case DW_Form_StrpSup: - bytes_to_read = dw_size_from_format(ctx->format); goto read_fixed_uint; + case DW_FormKind_RefAddr: + case DW_FormKind_SecOffset: + case DW_FormKind_LineStrp: + case DW_FormKind_Strp: + case DW_FormKind_StrpSup: + bytes_to_read = dw_addr_size_from_format(ctx->format); goto read_fixed_uint; //- rjf: fixed-size uint reads read_fixed_uint: @@ -353,26 +520,26 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin }break; //- rjf: uleb128 reads - case DW_Form_UData: - case DW_Form_RefUData: - case DW_Form_Strx: - case DW_Form_Addrx: - case DW_Form_LocListx: - case DW_Form_RngListx: + case DW_FormKind_UData: + case DW_FormKind_RefUData: + case DW_FormKind_Strx: + case DW_FormKind_Addrx: + case DW_FormKind_LocListx: + case DW_FormKind_RngListx: { off += str8_deserial_read_uleb128(data, off, &val.u128.u64[0]); }break; //- rjf: sleb128 reads - case DW_Form_SData: + case DW_FormKind_SData: { off += str8_deserial_read_sleb128(data, off, (S64 *)(&val.u128.u64[0])); }break; //- rjf: fixed-size uint reads / skips - case DW_Form_Block1: bytes_to_read = 1; goto read_fixed_uint_and_skip; - case DW_Form_Block2: bytes_to_read = 2; goto read_fixed_uint_and_skip; - case DW_Form_Block4: bytes_to_read = 4; goto read_fixed_uint_and_skip; + case DW_FormKind_Block1: bytes_to_read = 1; goto read_fixed_uint_and_skip; + case DW_FormKind_Block2: bytes_to_read = 2; goto read_fixed_uint_and_skip; + case DW_FormKind_Block4: bytes_to_read = 4; goto read_fixed_uint_and_skip; read_fixed_uint_and_skip: { U64 size = 0; @@ -384,7 +551,7 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin }break; //- rjf: uleb128 read & skip - case DW_Form_Block: + case DW_FormKind_Block: { U64 size = 0; U64 og_read_off = off; @@ -394,7 +561,7 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin }break; //- rjf: strings - case DW_Form_String: + case DW_FormKind_String: { String8 string = {0}; U64 og_read_off = off; @@ -403,24 +570,25 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin }break; //- rjf: implicit constants (no reading in .debug_info; value comes from .debug_abbrev) - case DW_Form_ImplicitConst: + case DW_FormKind_ImplicitConst: { val.u128.u64[0] = implicit_const; }break; //- rjf: exprloc - case DW_Form_ExprLoc: + case DW_FormKind_ExprLoc: { U64 size = 0; U64 og_read_off = off; U64 bytes_read = str8_deserial_read_uleb128(data, off, &size); val.u128.u64[0] = og_read_off + bytes_read; val.u128.u64[1] = size; + val.string = str8_substr(data, r1u64(og_read_off, og_read_off+size)); off += size + bytes_read; }break; //- rjf: flag present - case DW_Form_FlagPresent: + case DW_FormKind_FlagPresent: { val.u128.u64[0] = 1; }break; @@ -431,32 +599,32 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin switch(form_kind) { default:{}break; - case DW_Form_Strx1: - case DW_Form_Strx2: - case DW_Form_Strx3: - case DW_Form_Strx4: - case DW_Form_Strx: + case DW_FormKind_Strx1: + case DW_FormKind_Strx2: + case DW_FormKind_Strx3: + case DW_FormKind_Strx4: + case DW_FormKind_Strx: if(ctx->str_offsets_table != 0) { U64 entry_idx = val.u128.u64[0]; U64 string_data_off = 0; if(dw2_try_offset_from_table_idx(ctx->str_offsets_table, entry_idx, &string_data_off)) { - String8 string_section_data = ctx->raw->sec[DW_Section_Str].data; + String8 string_section_data = raw->sec[DW_SectionKind_Str].data; val.string = str8_cstring_capped(string_section_data.str + string_data_off, string_section_data.str + string_section_data.size); } }break; - case DW_Form_LineStrp: + case DW_FormKind_LineStrp: { - String8 string_section_data = ctx->raw->sec[DW_Section_LineStr].data; + String8 string_section_data = raw->sec[DW_SectionKind_LineStr].data; val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0], string_section_data.str + string_section_data.size); }break; - case DW_Form_Strp: - case DW_Form_StrpSup: + case DW_FormKind_Strp: + case DW_FormKind_StrpSup: { - String8 string_section_data = ctx->raw->sec[DW_Section_Str].data; + String8 string_section_data = raw->sec[DW_SectionKind_Str].data; val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0], string_section_data.str + string_section_data.size); }break; @@ -468,11 +636,11 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin switch(form_kind) { default:{val.addr = val.u128.u64[0];}break; - case DW_Form_Addrx: - case DW_Form_Addrx1: - case DW_Form_Addrx2: - case DW_Form_Addrx3: - case DW_Form_Addrx4: + case DW_FormKind_Addrx: + case DW_FormKind_Addrx1: + case DW_FormKind_Addrx2: + case DW_FormKind_Addrx3: + case DW_FormKind_Addrx4: if(ctx->addr_table != 0) { U64 addr_idx = val.u128.u64[0]; @@ -486,11 +654,114 @@ dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kin return bytes_read; } +//////////////////////////////// +//~ rjf: Parse Context Construction + +internal void +dw2_parse_ctx_equip_unit_header(DW2_ParseCtx *ctx_out, DW2_UnitHeader *hdr, U64 unit_base_info_off) +{ + ctx_out->version = hdr->version; + ctx_out->format = hdr->format; + ctx_out->addr_size = hdr->addr_size; + ctx_out->unit_base_info_off = unit_base_info_off; +} + +internal void +dw2_parse_ctx_equip_unit_abbrev_map(DW2_ParseCtx *ctx_out, DW2_UnitAbbrevMapMap *map, U64 unit_idx) +{ + ctx_out->abbrev_map = map->map_from_unit_idx_table[unit_idx]; +} + +internal void +dw2_parse_ctx_equip_unit_root_tag(DW2_ParseCtx *ctx_out, DW2_Tag *tag, DW2_OffsetTableSet *offset_tables) +{ + // rjf: unpack attributes + DW2_Attrib *low_pc_attrib = &dw2_attrib_nil; + DW2_Attrib *lang_attrib = &dw2_attrib_nil; + DW2_Attrib *rnglists_base_off_attrib = &dw2_attrib_nil; + DW2_Attrib *str_offsets_base_off_attrib = &dw2_attrib_nil; + DW2_Attrib *addr_base_off_attrib = &dw2_attrib_nil; + DW2_Attrib *loclist_base_off_attrib = &dw2_attrib_nil; + DW2_Attrib *comp_dir_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag->attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(name, name_upper) case DW_AttribKind_##name_upper:{name##_attrib = &n->v;}break + Case(low_pc, LowPc); + Case(lang, Language); + Case(rnglists_base_off, RngListsBase); + Case(str_offsets_base_off, StrOffsetsBase); + Case(addr_base_off, AddrBase); + Case(loclist_base_off, LocListsBase); + Case(comp_dir, CompDir); +#undef Case + } + } + + // rjf: fill basics + ctx_out->unit_base_addr = low_pc_attrib->val.addr; + ctx_out->language = lang_attrib->val.u128.u64[0]; + ctx_out->unit_dir = comp_dir_attrib->val.string; + + // rjf: find offset tables + Rng1U64Array rnglists_tables_ranges_array = {offset_tables->rnglists_tables_ranges, offset_tables->rnglists_tables_count}; + Rng1U64Array str_offsets_tables_ranges_array = {offset_tables->str_offsets_tables_ranges, offset_tables->str_offsets_tables_count}; + Rng1U64Array addr_tables_ranges_array = {offset_tables->addr_tables_ranges, offset_tables->addr_tables_count}; + Rng1U64Array loclist_tables_ranges_array = {offset_tables->loclists_tables_ranges, offset_tables->loclists_tables_count}; + { + // rjf: find rnglists table + { + U64 rnglists_base_off = rnglists_base_off_attrib->val.u128.u64[0]; + U64 rnglists_table_num = rng1u64_array_num_from_value__binary_search(&rnglists_tables_ranges_array, rnglists_base_off); + if(0 < rnglists_table_num && rnglists_table_num <= rnglists_tables_ranges_array.count) + { + DW2_OffsetTable *table = &offset_tables->rnglists_tables[rnglists_table_num-1]; + ctx_out->rnglists_table = table; + } + } + + // rjf: find str offsets table + { + U64 str_offsets_base_off = str_offsets_base_off_attrib->val.u128.u64[0]; + U64 str_offsets_table_num = rng1u64_array_num_from_value__binary_search(&str_offsets_tables_ranges_array, str_offsets_base_off); + if(0 < str_offsets_table_num && str_offsets_table_num <= str_offsets_tables_ranges_array.count) + { + DW2_OffsetTable *table = &offset_tables->str_offsets_tables[str_offsets_table_num-1]; + ctx_out->str_offsets_table = table; + } + } + + // rjf: find addr table + { + U64 addr_base_off = addr_base_off_attrib->val.u128.u64[0]; + U64 addr_table_num = rng1u64_array_num_from_value__binary_search(&addr_tables_ranges_array, addr_base_off); + if(0 < addr_table_num && addr_table_num <= addr_tables_ranges_array.count) + { + DW2_OffsetTable *table = &offset_tables->addr_tables[addr_table_num-1]; + ctx_out->addr_table = table; + } + } + + // rjf: find loclists table + { + U64 loclist_base_off = loclist_base_off_attrib->val.u128.u64[0]; + U64 loclist_table_num = rng1u64_array_num_from_value__binary_search(&loclist_tables_ranges_array, loclist_base_off); + if(0 < loclist_table_num && loclist_table_num <= loclist_tables_ranges_array.count) + { + DW2_OffsetTable *table = &offset_tables->loclists_tables[loclist_table_num-1]; + ctx_out->loclists_table = table; + } + } + } +} + //////////////////////////////// //~ rjf: Tag Parsing internal U64 -dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out) +dw2_read_tag(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out) { U64 start_off = off; @@ -519,7 +790,7 @@ dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *ta U8 has_children = 0; U64 attrib_abbrev_read_off = 0; { - String8 abbrev_data = ctx->raw->sec[DW_Section_Abbrev].data; + String8 abbrev_data = raw->sec[DW_SectionKind_Abbrev].data; U64 abbrev_read_off = abbrev_off; U64 id = 0; abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &id); @@ -535,7 +806,7 @@ dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *ta DW2_AttribList attribs = {0}; if(abbrev_id != 0) { - String8 abbrev_data = ctx->raw->sec[DW_Section_Abbrev].data; + String8 abbrev_data = raw->sec[DW_SectionKind_Abbrev].data; U64 abbrev_read_off = attrib_abbrev_read_off; for(;;) { @@ -547,13 +818,13 @@ dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *ta U64 implicit_const = 0; abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &attrib_kind); abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &attrib_form_kind); - if(attrib_form_kind == DW_Form_ImplicitConst) + if(attrib_form_kind == DW_FormKind_ImplicitConst) { abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &implicit_const); } // rjf: indirect form -> form kind is encoded in .debug_info (because why not) - if(attrib_form_kind == DW_Form_Indirect) + if(attrib_form_kind == DW_FormKind_Indirect) { off += str8_deserial_read_uleb128(data, off, &attrib_form_kind); } @@ -562,7 +833,7 @@ dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *ta DW2_FormVal val = {0}; if(attrib_kind != 0) { - off += dw2_read_form_val(ctx, data, off, attrib_form_kind, implicit_const, &val); + off += dw2_read_form_val(raw, ctx, data, off, attrib_form_kind, implicit_const, &val); } // rjf: push @@ -615,14 +886,14 @@ dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v) switch(v->kind) { default:{}break; - case DW_Form_Ref1: - case DW_Form_Ref2: - case DW_Form_Ref4: - case DW_Form_Ref8: + case DW_FormKind_Ref1: + case DW_FormKind_Ref2: + case DW_FormKind_Ref4: + case DW_FormKind_Ref8: { result = ctx->unit_base_info_off + v->u128.u64[0]; }break; - // TODO(rjf): DW_Form_RefAddr, DW_Form_RefUData, DW_Form_RefSig8, DW_Form_RefSup8, etc. + // TODO(rjf): DW_FormKind_RefAddr, DW_FormKind_RefUData, DW_FormKind_RefSig8, DW_FormKind_RefSup8, etc. } return result; } @@ -631,7 +902,7 @@ dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v) //~ rjf: Line Table Parsing internal U64 -dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out) +dw2_read_line_table_header(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out) { Temp scratch = scratch_begin(&arena, 1); U64 start_off = off; @@ -847,7 +1118,7 @@ dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 of DW_LNCT lnct = (DW_LNCT)entry_formats[entry_format_idx*2 + 0]; DW_FormKind form_kind = (DW_FormKind)entry_formats[entry_format_idx*2 + 1]; DW2_FormVal form_val = {0}; - off += dw2_read_form_val(ctx, data, off, form_kind, 0, &form_val); + off += dw2_read_form_val(raw, ctx, data, off, form_kind, 0, &form_val); switch(lnct) { default: @@ -952,7 +1223,7 @@ dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out) off += str8_deserial_read_struct(data, off, &segment_selector_size); // rjf: determine entry size - U64 entry_size = dw_size_from_format(format); + U64 entry_size = dw_addr_size_from_format(format); if(addr_size != 0) { entry_size = addr_size + segment_selector_size; @@ -975,6 +1246,31 @@ dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out) return bytes_read; } +internal DW2_OffsetTableList +dw2_offset_table_list_from_data(Arena *arena, String8 data) +{ + DW2_OffsetTableList list = {0}; + for(U64 off = 0; off < data.size;) + { + U64 start_off = off; + DW2_OffsetTable table = {0}; + off += dw2_read_offset_table(data, off, &table); + if(table.entries != 0) + { + DW2_OffsetTableNode *n = push_array(arena, DW2_OffsetTableNode, 1); + SLLQueuePush(list.first, list.last, n); + n->v = table; + n->range = r1u64(start_off, off); + list.count += 1; + } + if(off == start_off) + { + break; + } + } + return list; +} + internal B32 dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out) { @@ -1003,6 +1299,48 @@ dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out) return result; } +internal DW2_OffsetTableSet +dw2_offset_table_set_from_raw(Arena *arena, DW_Raw *raw) +{ + DW2_OffsetTableSet result = {0}; + { + struct + { + String8 data; + U64 *tables_count_out; + DW2_OffsetTable **tables_out; + Rng1U64 **tables_ranges_out; + } + tasks[] = + { + {raw->sec[DW_SectionKind_StrOffsets].data, &result.str_offsets_tables_count, &result.str_offsets_tables, &result.str_offsets_tables_ranges}, + {raw->sec[DW_SectionKind_RngLists].data, &result.rnglists_tables_count, &result.rnglists_tables, &result.rnglists_tables_ranges}, + {raw->sec[DW_SectionKind_Addr].data, &result.addr_tables_count, &result.addr_tables, &result.addr_tables_ranges}, + {raw->sec[DW_SectionKind_LocLists].data, &result.loclists_tables_count, &result.loclists_tables, &result.loclists_tables_ranges}, + }; + for EachElement(task_idx, tasks) + { + Temp scratch = scratch_begin(&arena, 1); + String8 data = tasks[task_idx].data; + DW2_OffsetTableList tables = dw2_offset_table_list_from_data(scratch.arena, data); + tasks[task_idx].tables_count_out[0] = tables.count; + tasks[task_idx].tables_out[0] = push_array(arena, DW2_OffsetTable, tables.count); + tasks[task_idx].tables_ranges_out[0] = push_array(arena, Rng1U64, tables.count); + { + U64 idx = 0; + for EachNode(n, DW2_OffsetTableNode, tables.first) + { + tasks[task_idx].tables_out[0][idx] = n->v; + tasks[task_idx].tables_ranges_out[0][idx] = n->range; + idx += 1; + } + } + scratch_end(scratch); + } + } + return result; +} + //////////////////////////////// //~ rjf: Range List Parsing (.debug_rnglists) @@ -1020,7 +1358,7 @@ dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form case DW_Version_3: case DW_Version_4: { - String8 data = raw->sec[DW_Section_Ranges].data; + String8 data = raw->sec[DW_SectionKind_Ranges].data; U64 ranges_off = ranges_off = form_val.u128.u64[0];; U64 base_addr = ctx->unit_base_addr; U64 sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); @@ -1063,7 +1401,7 @@ dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form //- rjf: @dwarf5 case DW_Version_5: { - String8 data = raw->sec[DW_Section_RngLists].data; + String8 data = raw->sec[DW_SectionKind_RngLists].data; // rjf: determine section offset - sometimes this is encoded directly, // other times it is relative, based on the form kind - more variability @@ -1072,11 +1410,11 @@ dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form switch(form_val.kind) { default:{}break; - case DW_Form_SecOffset: + case DW_FormKind_SecOffset: { rnglist_off = form_val.u128.u64[0]; }break; - case DW_Form_RngListx: + case DW_FormKind_RngListx: if(ctx->rnglists_table != 0) { U64 rnglist_off_idx = form_val.u128.u64[0]; @@ -1219,7 +1557,7 @@ dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form case DW_Version_3: case DW_Version_4: { - String8 data = raw->sec[DW_Section_Loc].data; + String8 data = raw->sec[DW_SectionKind_Loc].data; U64 locs_off = locs_off = form_val.u128.u64[0]; U64 base_addr = ctx->unit_base_addr; U64 sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); @@ -1269,7 +1607,7 @@ dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form //- rjf: @dwarf5 case DW_Version_5: { - String8 data = raw->sec[DW_Section_LocLists].data; + String8 data = raw->sec[DW_SectionKind_LocLists].data; // rjf: determine section offset - sometimes this is encoded directly, // other times it is relative, based on the form kind - more variability @@ -1278,11 +1616,11 @@ dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form switch(form_val.kind) { default:{}break; - case DW_Form_SecOffset: + case DW_FormKind_SecOffset: { loclist_off = form_val.u128.u64[0]; }break; - case DW_Form_LocListx: + case DW_FormKind_LocListx: if(ctx->rnglists_table != 0) { U64 loclist_off_idx = form_val.u128.u64[0]; @@ -1425,3 +1763,154 @@ dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_Form } return result; } + +//////////////////////////////// +//~ rjf: Unwind Info Parsing (.debug_frame) + +internal U64 +dw2_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi_header_out) +{ + U64 start_off = off; + + // rjf: read length / format + U64 length = 0; + DW_Format fmt = DW_Format_Null; + U64 length_size = dw2_read_initial_length(data, off, &length, &fmt); + + // rjf: find entry info, read ID + Rng1U64 entry_range = r1u64(off, off + length_size + length); + String8 entry_data = str8_substr(data, entry_range); + U64 id = 0; + U64 id_size = dw2_read_fmt_u64(entry_data, length_size, fmt, &id); + + // rjf: fill + cfi_header_out->kind = ((fmt == DW_Format_32Bit && id == max_U32) || (fmt == DW_Format_64Bit && id == max_U64)) ? DW_CFIKind_CIE : DW_CFIKind_FDE; + cfi_header_out->fmt = fmt; + cfi_header_out->entry_range = entry_range; + cfi_header_out->cie_pointer = id; + cfi_header_out->cie_pointer_off = off + length_size; + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal U64 +dw2_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie_out) +{ + U64 start_off = off; + + // rjf: read id + U64 id = 0; + off += dw2_read_fmt_u64(data, off, fmt, &id); + + // rjf: read version + U8 version = 0; + off += str8_deserial_read_struct(data, off, &version); + + // rjf: read aug string + String8 aug_string = {0}; + U64 aug_string_off = off; + off += str8_deserial_read_cstr(data, off, &aug_string); + U64 aug_string_off_opl = off; + + // rjf: read address/segment-selector size + U8 address_size = 0; + U8 segment_selector_size = 0; + if(version >= DW_Version_4) + { + off += str8_deserial_read_struct(data, off, &address_size); + off += str8_deserial_read_struct(data, off, &segment_selector_size); + } + else + { + address_size = byte_size_from_arch(arch); + } + + // rjf: read alignments + U64 code_align_factor = 0; + U64 data_align_factor = 0; + off += str8_deserial_read_uleb128(data, off, &code_align_factor); + off += str8_deserial_read_uleb128(data, off, &data_align_factor); + + // rjf: read return address register encoding + U64 ret_addr_reg = 0; + switch(version) + { + case DW_Version_1: + { + off += str8_deserial_read(data, off, &ret_addr_reg, 1, 1); + }break; + default: + { + off += str8_deserial_read_uleb128(data, off, &ret_addr_reg); + }break; + } + + // rjf: fill output + { + cie_out->aug_string_range = r1u64(aug_string_off, aug_string_off_opl); + cie_out->code_align_factor = code_align_factor; + cie_out->data_align_factor = data_align_factor; + cie_out->ret_addr_reg = ret_addr_reg; + cie_out->format = fmt; + cie_out->version = version; + cie_out->address_size = address_size; + cie_out->segment_selector_size = segment_selector_size; + } + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal U64 +dw2_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie, DW_FDE *fde_out) +{ + U64 start_off = off; + + // rjf: skip format-dependent prefix + off += (fmt == DW_Format_32Bit) ? 4 : 12; + + // rjf: read cie ptr + U64 cie_ptr = 0; + off += dw2_read_fmt_u64(data, off, fmt, &cie_ptr); + + // rjf: read address of first instruction + U64 pc_begin = 0; + off += str8_deserial_read(data, off, &pc_begin, cie->address_size, cie->address_size); + + // rjf: read instruction range size + U64 pc_range_size = 0; + off += str8_deserial_read(data, off, &pc_range_size, cie->address_size, cie->address_size); + + // rjf: skip aug data + off += dim_1u64(cie->aug_string_range); + + // rjf: fill output + fde_out->cie_pointer = cie_ptr; + fde_out->pc_range = r1u64(pc_begin, pc_begin + pc_range_size); + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal B32 +dw2_try_cfi_from_data(String8 data, U64 off, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out) +{ + B32 result = 0; + { + DW_CFIHeader fde_header = {0}; + off += dw2_read_cfi_header(data, off, &fde_header); + if(fde_header.kind == DW_CFIKind_FDE) + { + DW_CFIHeader cie_header = {0}; + dw2_read_cfi_header(data, fde_header.cie_pointer, &cie_header); + if(cie_header.kind == DW_CFIKind_CIE) + { + result = 1; + dw2_read_cie(data, cie_header.entry_range.min, cie_header.fmt, arch, cie_out); + dw2_read_fde(data, fde_header.entry_range.min, fde_header.fmt, arch, cie_out, fde_out); + } + } + } + return result; +} diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h index 3687c3f4..a4d5606c 100644 --- a/src/dwarf/dwarf_parse_2.h +++ b/src/dwarf/dwarf_parse_2.h @@ -4,6 +4,23 @@ #ifndef DWARF_PARSE_2_H #define DWARF_PARSE_2_H +//////////////////////////////// +//~ rjf: Raw Section Data + +typedef struct DW_Section DW_Section; +struct DW_Section +{ + String8 name; + String8 data; +}; + +typedef struct DW_Raw DW_Raw; +struct DW_Raw +{ + DW_Section sec[DW_SectionKind_COUNT]; + DW_Section sup[DW_SectionKind_COUNT]; +}; + //////////////////////////////// //~ rjf: Unit Headers @@ -21,6 +38,37 @@ struct DW2_UnitHeader //////////////////////////////// //~ rjf: Abbreviation Map (ID -> .debug_abbrev Offset) +typedef struct DW2_AbbrevAttrib DW2_AbbrevAttrib; +struct DW2_AbbrevAttrib +{ + DW_AttribKind attrib_kind; + DW_FormKind form_kind; + U64 implicit_const; +}; + +typedef struct DW2_AbbrevAttribNode DW2_AbbrevAttribNode; +struct DW2_AbbrevAttribNode +{ + DW2_AbbrevAttribNode *next; + DW2_AbbrevAttrib v; +}; + +typedef struct DW2_AbbrevAttribList DW2_AbbrevAttribList; +struct DW2_AbbrevAttribList +{ + DW2_AbbrevAttribNode *first; + DW2_AbbrevAttribNode *last; + U64 count; +}; + +typedef struct DW2_AbbrevHeader DW2_AbbrevHeader; +struct DW2_AbbrevHeader +{ + U64 id; + DW_TagKind tag_kind; + B8 has_children; +}; + typedef struct DW2_AbbrevMapNode DW2_AbbrevMapNode; struct DW2_AbbrevMapNode { @@ -36,6 +84,14 @@ struct DW2_AbbrevMap U64 slots_count; }; +typedef struct DW2_UnitAbbrevMapMap DW2_UnitAbbrevMapMap; +struct DW2_UnitAbbrevMapMap +{ + U64 map_count; + DW2_AbbrevMap *map_from_idx_table; + DW2_AbbrevMap **map_from_unit_idx_table; +}; + //////////////////////////////// //~ rjf: Offset Tables (.debug_str_offsets, .debug_rnglists) @@ -51,18 +107,55 @@ struct DW2_OffsetTable void *entries; }; +typedef struct DW2_OffsetTableNode DW2_OffsetTableNode; +struct DW2_OffsetTableNode +{ + DW2_OffsetTableNode *next; + DW2_OffsetTable v; + Rng1U64 range; +}; + +typedef struct DW2_OffsetTableList DW2_OffsetTableList; +struct DW2_OffsetTableList +{ + DW2_OffsetTableNode *first; + DW2_OffsetTableNode *last; + U64 count; +}; + +typedef struct DW2_OffsetTableSet DW2_OffsetTableSet; +struct DW2_OffsetTableSet +{ + // rjf: .debug_str_offsets + U64 str_offsets_tables_count; + DW2_OffsetTable *str_offsets_tables; + Rng1U64 *str_offsets_tables_ranges; + + // rjf: .debug_rnglists + U64 rnglists_tables_count; + DW2_OffsetTable *rnglists_tables; + Rng1U64 *rnglists_tables_ranges; + + // rjf: .debug_addr + U64 addr_tables_count; + DW2_OffsetTable *addr_tables; + Rng1U64 *addr_tables_ranges; + + // rjf: .debug_loclists + U64 loclists_tables_count; + DW2_OffsetTable *loclists_tables; + Rng1U64 *loclists_tables_ranges; +}; + //////////////////////////////// //~ rjf: Parsing Context Bundle typedef struct DW2_ParseCtx DW2_ParseCtx; struct DW2_ParseCtx { - DW_Raw *raw; - // NOTE(rjf): all subsequent fields optional - top-level code fills out whatever - // it can from context. DW_Version version; DW_Format format; - DW_Ext ext; + DW_ExtFlags exts; U64 addr_size; U64 unit_base_addr; U64 unit_base_info_off; @@ -73,6 +166,7 @@ struct DW2_ParseCtx DW2_OffsetTable *loclists_table; String8 unit_dir; String8 unit_file; + DW_Language language; }; //////////////////////////////// @@ -229,6 +323,57 @@ struct DW2_LocList U64 count; }; +//////////////////////////////// +//~ rjf: Unwind Info + +typedef enum DW_CFIKind +{ + DW_CFIKind_Null, + DW_CFIKind_CIE, // Common Information Entry + DW_CFIKind_FDE, // Frame Description Entry + DW_CFIKind_COUNT +} +DW_CFIKind; + +typedef struct DW_CFIHeader DW_CFIHeader; +struct DW_CFIHeader +{ + DW_CFIKind kind; + DW_Format fmt; + Rng1U64 entry_range; + U64 cie_pointer_off; + U64 cie_pointer; +}; + +typedef struct DW_CIE DW_CIE; +struct DW_CIE +{ + Rng1U64 aug_string_range; + Rng1U64 aug_data_range; + U64 code_align_factor; + S64 data_align_factor; + U64 ret_addr_reg; + U64 ext[4]; + DW_Format format; + U8 version; + U8 address_size; + U8 segment_selector_size; +}; + +typedef struct DW_FDE DW_FDE; +struct DW_FDE +{ + U64 cie_pointer; + Rng1U64 pc_range; +}; + +typedef struct DW_CFI DW_CFI; +struct DW_CFI +{ + DW_CIE cie; + DW_FDE fde; +}; + //////////////////////////////// //~ rjf: Globals @@ -239,6 +384,7 @@ global read_only DW2_Attrib dw2_attrib_nil = {0}; internal U64 dw2_read_initial_length(String8 data, U64 off, U64 *out, DW_Format *fmt_out); internal U64 dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out); +internal DW_SectionKind dw_section_kind_from_string(String8 string); //////////////////////////////// //~ rjf: Unit Range Set Parsing (Top-Level .debug_info, .debug_aranges) @@ -253,30 +399,41 @@ internal U64 dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out); //////////////////////////////// //~ rjf: Abbreviation Map Parsing +internal U64 dw2_read_abbrev(Arena *arena, String8 data, U64 off, DW2_AbbrevHeader *header_out, DW2_AbbrevAttribList *attribs_out); internal DW2_AbbrevMap dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off); +internal DW2_UnitAbbrevMapMap dw2_unit_abbrev_map_map_from_data(Arena *arena, String8 data, DW2_UnitHeader *unit_headers, U64 unit_headers_count); //////////////////////////////// //~ rjf: Form Value Parsing -internal U64 dw2_read_form_val(DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out); +internal U64 dw2_read_form_val(DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out); + +//////////////////////////////// +//~ rjf: Parse Context Construction + +internal void dw2_parse_ctx_equip_unit_header(DW2_ParseCtx *ctx_out, DW2_UnitHeader *hdr, U64 unit_base_info_off); +internal void dw2_parse_ctx_equip_unit_abbrev_map(DW2_ParseCtx *ctx_out, DW2_UnitAbbrevMapMap *map, U64 unit_idx); +internal void dw2_parse_ctx_equip_unit_root_tag(DW2_ParseCtx *ctx_out, DW2_Tag *tag, DW2_OffsetTableSet *offset_tables); //////////////////////////////// //~ rjf: Tag Parsing -internal U64 dw2_read_tag(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); +internal U64 dw2_read_tag(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); internal DW2_Attrib *dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind); internal U64 dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v); //////////////////////////////// //~ rjf: Line Table Parsing -internal U64 dw2_read_line_table_header(Arena *arena, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out); +internal U64 dw2_read_line_table_header(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out); //////////////////////////////// //~ rjf: Offset Table Parsing (.debug_str_offsets, .debug_rnglists) internal U64 dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out); +internal DW2_OffsetTableList dw2_offset_table_list_from_data(Arena *arena, String8 data); internal B32 dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out); +internal DW2_OffsetTableSet dw2_offset_table_set_from_raw(Arena *arena, DW_Raw *raw); //////////////////////////////// //~ rjf: Range List Parsing (.debug_rnglists) @@ -288,4 +445,12 @@ internal Rng1U64List dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, internal DW2_LocList dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val); +//////////////////////////////// +//~ rjf: Unwind Info Parsing (.debug_frame) + +internal U64 dw2_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi_header_out); +internal U64 dw2_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie_out); +internal U64 dw2_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie, DW_FDE *fde_out); +internal B32 dw2_try_cfi_from_data(String8 data, U64 off, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out); + #endif // DWARF_PARSE_2_H diff --git a/src/dwarf/dwarf_parse_coff.c b/src/dwarf/dwarf_parse_coff.c new file mode 100644 index 00000000..617f06ec --- /dev/null +++ b/src/dwarf/dwarf_parse_coff.c @@ -0,0 +1,45 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal B32 +dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, COFF_SectionHeader *section_table) +{ + B32 is_dwarf_present = 0; + for EachIndex(idx, section_count) + { + COFF_SectionHeader *header = §ion_table[idx]; + String8 name = coff_name_from_section_header(string_table, header); + DW_SectionKind s = dw_section_kind_from_string(name); + is_dwarf_present = s != DW_SectionKind_Null; + if(is_dwarf_present) + { + break; + } + } + return is_dwarf_present; +} + +internal DW_Raw +dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table) +{ + DW_Raw input = {0}; + B32 sect_status[ArrayCount(input.sec)] = {0}; + for EachIndex(idx, section_count) + { + COFF_SectionHeader *header = §ion_table[idx]; + Rng1U64 raw_data_range = rng_1u64(header->foff, header->vsize ? header->foff + header->vsize : header->foff + header->fsize); + String8 name = coff_name_from_section_header(string_table, header); + DW_SectionKind s = dw_section_kind_from_string(name); + if(s != DW_SectionKind_Null) + { + if(!sect_status[s]) + { + sect_status[s] = 1; + DW_Section *d = &input.sec[s]; + d->name = push_str8_copy(arena, name); + d->data = str8_substr(raw_image, raw_data_range); + } + } + } + return input; +} diff --git a/src/dwarf/dwarf_coff.h b/src/dwarf/dwarf_parse_coff.h similarity index 82% rename from src/dwarf/dwarf_coff.h rename to src/dwarf/dwarf_parse_coff.h index 797324ef..3df0b5be 100644 --- a/src/dwarf/dwarf_coff.h +++ b/src/dwarf/dwarf_parse_coff.h @@ -1,11 +1,11 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef DWARF_COFF_H -#define DWARF_COFF_H +#ifndef DWARF_PARSE_COFF_H +#define DWARF_PARSE_COFF_H internal B32 dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, COFF_SectionHeader *section_table); internal DW_Raw dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); -#endif // DWARF_COFF_H +#endif // DWARF_PARSE_COFF_H diff --git a/src/dwarf/dwarf_elf.c b/src/dwarf/dwarf_parse_elf.c similarity index 87% rename from src/dwarf/dwarf_elf.c rename to src/dwarf/dwarf_parse_elf.c index 63b09dd4..a837c483 100644 --- a/src/dwarf/dwarf_elf.c +++ b/src/dwarf/dwarf_parse_elf.c @@ -11,11 +11,7 @@ dw_is_dwarf_present_from_elf_bin(String8 data, ELF_Bin *bin) if(shdr->sh_type != ELF_ShType_ProgBits) { continue; } String8 name = elf_name_from_shdr64(data, bin, shdr); DW_SectionKind s = dw_section_kind_from_string(name); - if(s == DW_Section_Null) - { - s = dw_section_dwo_kind_from_string(name); - } - is_dwarf_present = (s != DW_Section_Null); + is_dwarf_present = (s != DW_SectionKind_Null); if(is_dwarf_present) { break; @@ -28,7 +24,7 @@ dw_is_dwarf_present_from_elf_bin(String8 data, ELF_Bin *bin) #include "third_party/sinfl/sinfl.h" internal DW_Raw -dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) +dw_raw_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) { DW_Raw result = {0}; B32 is_section_present[ArrayCount(result.sec)] = {0}; @@ -41,14 +37,8 @@ dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) String8 section_name = elf_name_from_shdr64(data, bin, shdr); DW_SectionKind section_kind = dw_section_kind_from_string(section_name); String8 section_data__maybe_compressed = str8_substr(data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size)); - B32 is_dwo = 0; - if(section_kind == DW_Section_Null) - { - section_kind = dw_section_dwo_kind_from_string(section_name); - is_dwo = (section_kind != DW_Section_Null); - } - if(section_kind == DW_Section_Null) { continue; } // skip unknown sections + if(section_kind == DW_SectionKind_Null) { continue; } // skip unknown sections if(is_section_present[section_kind]) { continue; } // skip duplicate sections //- rjf: decompress section data if needed @@ -108,7 +98,6 @@ dw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin) DW_Section *d = &result.sec[section_kind]; d->name = push_str8_copy(arena, section_name); d->data = section_data__uncompressed; - d->is_dwo = is_dwo; } return result; } diff --git a/src/dwarf/dwarf_elf.h b/src/dwarf/dwarf_parse_elf.h similarity index 53% rename from src/dwarf/dwarf_elf.h rename to src/dwarf/dwarf_parse_elf.h index 5d5965e3..06ddc8ce 100644 --- a/src/dwarf/dwarf_elf.h +++ b/src/dwarf/dwarf_parse_elf.h @@ -1,10 +1,10 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#ifndef DWARF_ELF_H -#define DWARF_ELF_H +#ifndef DWARF_PARSE_ELF_H +#define DWARF_PARSE_ELF_H internal B32 dw_is_dwarf_present_from_elf_bin(String8 raw_image, ELF_Bin *bin); -internal DW_Raw dw_input_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin); +internal DW_Raw dw_raw_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin); -#endif // DWARF_ELF_H +#endif // DWARF_PARSE_ELF_H diff --git a/src/dwarf/dwarf_unwind_2.c b/src/dwarf/dwarf_unwind_2.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/dwarf/dwarf_unwind_2.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/dwarf/dwarf_unwind_2.h b/src/dwarf/dwarf_unwind_2.h new file mode 100644 index 00000000..ca1bea9a --- /dev/null +++ b/src/dwarf/dwarf_unwind_2.h @@ -0,0 +1,44 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_UNWIND_2_H +#define DWARF_UNWIND_2_H + +typedef enum DW_UnwindRuleCode +{ + DW_UnwindRuleCode_SameVal, + DW_UnwindRuleCode_Undefined, + DW_UnwindRuleCode_Off, + DW_UnwindRuleCode_ValOff, + DW_UnwindRuleCode_Reg, + DW_UnwindRuleCode_Expr, + DW_UnwindRuleCode_ValExpr, + DW_UnwindRuleCode_Architectural, +} +DW_UnwindRuleCode; + +typedef struct DW_UnwindRule DW_UnwindRule; +struct DW_UnwindRule +{ + DW_UnwindRuleCode code; + DW_RegCode reg_code; + S64 s64; + String8 expr; +}; + +typedef struct DW_CFIRow DW_CFIRow; +struct DW_CFIRow +{ + U64 base_pc_off; + DW_UnwindRule cfa_rule; + DW_UnwindRule *reg_rules; +}; + +typedef struct DW_CFIRowNode DW_CFIRowNode; +struct DW_CFIRowNode +{ + DW_CFIRowNode *next; + DW_CFIRow v; +}; + +#endif // DWARF_UNWIND_2_H diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index 1cb92f71..fa824277 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -97,6 +97,119 @@ dw_writer_tag_chunk_list_push(Arena *arena, DW_WriterTagChunkList *list, U64 cap return result; } +internal U64 +dw_write_to_buffer_uleb128(U8 buffer[10], U64 v) +{ + U64 buffer_size = 0; + U64 value = v; + do { + U8 byte = value & 0x7f; + value >>= 7; + if (value != 0) { + byte |= 0x80; + } + Assert(buffer_size < 10); + buffer[buffer_size++] = byte; + } while (value > 0); + return buffer_size; +} + +internal U64 +dw_write_to_buffer_sleb128(U8 buffer[10], U64 v) +{ + U64 buffer_size = 0; + for (S64 value = v, more = 1; more != 0; ) { + U8 byte = value & 0x7f; + value >>= 7; + U8 sign_bit = byte & 0x40; + if ((value == 0 && sign_bit == 0) || (value == -1 && sign_bit != 0)) { + more = 0; + } else { + byte |= 0x80; + } + Assert(buffer_size < 10); + buffer[buffer_size++] = byte; + } + return buffer_size; +} + +internal String8 +dw_write_uleb128(Arena *arena, U64 v) +{ + U8 buffer[10]; + U64 buffer_size = dw_write_to_buffer_uleb128(buffer, v); + return str8_copy(arena, str8(buffer, buffer_size)); +} + +internal String8 +dw_write_sleb128(Arena *arena, S64 v) +{ + U8 buffer[10]; + U64 buffer_size = dw_write_to_buffer_sleb128(buffer, v); + return str8_copy(arena, str8(buffer, buffer_size)); +} + +internal U64 +dw_size_from_uleb128(U64 v) +{ + U8 buffer[10]; + return dw_write_to_buffer_uleb128(buffer, v); +} + +internal U64 +dw_size_from_sleb128(S64 v) +{ + U8 buffer[10]; + return dw_write_to_buffer_sleb128(buffer, v); +} + +internal void * +dw_serial_push_length(Arena *arena, String8List *srl, DW_Format format, U64 length) +{ + void *result; + if (format == DW_Format_64Bit) { + U8 buffer[sizeof(U32) + sizeof(U64)]; + MemorySet(&buffer[0], 0xff, sizeof(U32)); + MemoryCopy(buffer + sizeof(U32), &length, sizeof(length)); + result = str8_serial_push_string(arena, srl, str8_array_fixed(buffer)); + } else { + result = str8_serial_push_string(arena, srl, str8((U8 *)&length, sizeof(U32))); + } + return result; +} + +internal void * +dw_serial_push_uint(Arena *arena, String8List *srl, DW_Format format, U64 v) +{ + String8 uint; + if (format == DW_Format_64Bit) { + U64 *ptr = push_array(arena, U64, 1); + *ptr = v; + uint = str8((U8 *)ptr, sizeof(*ptr)); + } else { + U32 *ptr = push_array(arena, U32, 1); + *ptr = safe_cast_u32(v); + uint = str8((U8 *)ptr, sizeof(*ptr)); + } + return str8_serial_push_string(arena, srl, uint); +} + +internal void * +dw_serial_push_uleb128(Arena *arena, String8List *srl, U64 v) +{ + U8 buffer[10]; + U64 buffer_size = dw_write_to_buffer_uleb128(buffer, v); + return str8_serial_push_string(arena, srl, str8(buffer, buffer_size)); +} + +internal void * +dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v) +{ + U8 buffer[10]; + U64 buffer_size = dw_write_to_buffer_sleb128(buffer, v); + return str8_serial_push_string(arena, srl, str8(buffer, buffer_size)); +} + internal DW_Writer * dw_writer_begin(DW_Format format, DW_Version version, DW_CompUnitKind cu_kind, Arch arch) { @@ -1195,7 +1308,18 @@ dw_writer_emit(DW_Writer *writer) str8_serial_push_struct(writer->arena, srl, &writer->line.opcode_base); // (12) standard_opcode_lengths U8 *std_op_lens = push_array(writer->arena, U8, writer->line.opcode_base - 1); - for (U64 i = 1; i < writer->line.opcode_base; i += 1) { std_op_lens[i-1] = dw_length_from_std_opcode(i); } + for (U64 i = 1; i < writer->line.opcode_base; i += 1) + { + U64 len = 0; + switch(i) + { + default:{}break; +#define X(name, code, len_) case DW_StdOpcode_##name:{len = (len_);}break; + DW_StdOpcode_XList +#undef X + } + std_op_lens[i-1] = len; + } str8_serial_push_string(writer->arena, srl, str8(std_op_lens, writer->line.opcode_base - 1)); // directory table str8_list_concat_in_place(srl, &dir_table_srl); @@ -1277,3 +1401,109 @@ dw_writer_emit_to_obj(DW_Writer *writer, OBJ *obj) } #endif +internal String8 +dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List *srl = push_array(scratch.arena, String8List, 1); + str8_serial_begin(scratch.arena, srl); + + HashTable *label_map = hash_table_init(scratch.arena, 128); + + struct Fixup { U64 offset; String8 label; struct Fixup *next; }; + struct Fixup *first_fixup = 0, *last_fixup = 0; + + for EachIndex(i, encs_count) { + DW_ExprEnc *e = &encs[i]; + + switch (e->type) { + case DW_ExprEncType_Null: {} break; + case DW_ExprEncType_Op: { + str8_serial_push_struct(scratch.arena, srl, &e->op); + } break; + case DW_ExprEncType_U8: { + str8_serial_push_struct(scratch.arena, srl, &e->u8); + } break; + case DW_ExprEncType_U16: { + str8_serial_push_struct(scratch.arena, srl, &e->u16); + } break; + case DW_ExprEncType_U32: { + str8_serial_push_struct(scratch.arena, srl, &e->u32); + } break; + case DW_ExprEncType_U64: { + str8_serial_push_struct(scratch.arena, srl, &e->u64); + } break; + case DW_ExprEncType_S8: { + str8_serial_push_struct(scratch.arena, srl, &e->s8); + } break; + case DW_ExprEncType_S16: { + str8_serial_push_struct(scratch.arena, srl, &e->s16); + } break; + case DW_ExprEncType_S32: { + str8_serial_push_struct(scratch.arena, srl, &e->s32); + } break; + case DW_ExprEncType_S64: { + str8_serial_push_struct(scratch.arena, srl, &e->s64); + } break; + case DW_ExprEncType_ULEB128: { + str8_serial_push_string(scratch.arena, srl, dw_write_uleb128(scratch.arena, e->u64)); + } break; + case DW_ExprEncType_SLEB128: { + str8_serial_push_string(scratch.arena, srl, dw_write_sleb128(scratch.arena, e->s64)); + } break; + case DW_ExprEncType_Addr: { + U64 addr_size = byte_size_from_arch(arch); + Assert(addr_size <= sizeof(e->addr)); + str8_serial_push_string(scratch.arena, srl, str8((U8 *)&e->addr, addr_size)); + } break; + case DW_ExprEncType_Block: { + Assert(e->block.size <= max_U8); + str8_serial_push_u8(scratch.arena, srl, (U8)e->block.size); + str8_serial_push_string(scratch.arena, srl, e->block); + } break; + case DW_ExprEncType_DwarfUInt: { + switch (format) { + case DW_Format_Null: {} break; + case DW_Format_32Bit: { str8_serial_push_u32(scratch.arena, srl, e->u32); } break; + case DW_Format_64Bit: { str8_serial_push_u64(scratch.arena, srl, e->u64); } break; + default: { InvalidPath; } break; + } + } break; + case DW_ExprEncType_Label: { + struct Fixup *fixup = push_array(scratch.arena, struct Fixup, 1); + fixup->offset = srl->total_size; + fixup->label = e->label; + SLLQueuePush(first_fixup, last_fixup, fixup); + + S16 delta_placeholder = 0; + str8_serial_push_struct(scratch.arena, srl, &delta_placeholder); + } break; + case DW_ExprEncType_DeclLabel: { + hash_table_push_string_u64(scratch.arena, label_map, e->label, srl->total_size); + } break; + default: { InvalidPath; } break; + } + } + + // finalize expression + String8 expr = str8_serial_end(arena, srl); + + // apply fixups + for EachNode(fixup, struct Fixup, first_fixup) { + U64 label_offset; + if (!hash_table_search_string_u64(label_map, fixup->label, &label_offset)) { + Assert(0 && "undefined label"); + continue; + } + + S64 delta = (S64)label_offset - (S64)fixup->offset; + AssertAlways(min_S16 <= delta && delta <= max_S16); + + S16 *delta_ptr = (S16 *)(expr.str + fixup->offset); + *delta_ptr = delta; + } + + scratch_end(scratch); + return expr; +} diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index 2e1a8923..aa09c59d 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -245,6 +245,23 @@ typedef struct DW_Writer DW_WriterTagChunkList tag_chunk_list; } DW_Writer; + +//////////////////////////////// +// Serializers + +internal U64 dw_write_to_buffer_uleb128(U8 buffer[10], U64 v); +internal U64 dw_write_to_buffer_sleb128(U8 buffer[10], U64 v); + +internal String8 dw_write_uleb128(Arena *arena, U64 v); +internal String8 dw_write_sleb128(Arena *arena, S64 v); +internal U64 dw_size_from_uleb128(U64 v); +internal U64 dw_size_from_sleb128(S64 v); + +internal void * dw_serial_push_length(Arena *arena, String8List *srl, DW_Format format, U64 length); +internal void * dw_serial_push_uint(Arena *arena, String8List *srl, DW_Format format, U64 v); +internal void * dw_serial_push_uleb128(Arena *arena, String8List *srl, U64 v); +internal void * dw_serial_push_sleb128(Arena *arena, String8List *srl, S64 v); + //////////////////////////////// // Writer @@ -334,5 +351,8 @@ internal DW_IntEnc dw_int_enc_from_uint(U64 v); internal U64 dw_size_from_sint(S64 v); internal U64 dw_size_from_uint(U64 v); +// encoder +internal String8 dw_encode_expr(Arena *arena, Arch arch, DW_Format format, DW_ExprEnc *encs, U64 encs_count); + #endif // DWARF_WRITER_H diff --git a/src/dwarf/eh_dump.c b/src/dwarf/eh_dump.c deleted file mode 100644 index 591a35cb..00000000 --- a/src/dwarf/eh_dump.c +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal String8List -eh_dump_list_from_data(Arena *arena, Arch arch, U64 eh_frame_hdr_vaddr, U64 eh_frame_vaddr, String8 eh_frame_hdr, String8 eh_frame, EH_DumpSubsetFlags subset_flags) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List strings = {0}; -#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__) - - EH_PtrCtx ptr_ctx = { .data_vaddr = eh_frame_hdr_vaddr }; - EH_FrameHdr hdr = eh_parse_frame_hdr(eh_frame_hdr, byte_size_from_arch(arch), &ptr_ctx); - DW_Ext ext = DW_Ext_All; - - if (subset_flags & EH_DumpSubsetFlag_EhFrameHdr) { - dumpf("eh_frame_hdr:\n"); - dumpf("{\n"); - dumpf(" version: %u\n", hdr.version); - dumpf(" eh_frame_ptr_enc: %S\n", eh_string_from_ptr_enc(scratch.arena, hdr.eh_frame_ptr_enc)); - dumpf(" table_enc: %S\n", eh_string_from_ptr_enc(scratch.arena, hdr.table_enc)); - dumpf(" fde_count: %llu\n", hdr.fde_count); - if (hdr.eh_frame_ptr_enc != EH_PtrEnc_Omit) { - dumpf(" eh_frame_ptr: 0x%I64x\n", hdr.eh_frame_ptr); - } - - dumpf(" Entries:\n"); - dumpf(" {\n"); - for (U64 cursor = 0; cursor < hdr.table.size; ) { - U64 entry_off = cursor; - - U64 pc = 0; - U64 pc_size = eh_parse_ptr(hdr.table, cursor, cursor, &ptr_ctx, hdr.table_enc, &pc); - if (pc_size == 0) { break; } - cursor += pc_size; - - U64 fde_addr = 0; - U64 fde_addr_size = eh_parse_ptr(hdr.table, cursor, cursor, &ptr_ctx, hdr.table_enc, &fde_addr); - if (fde_addr_size == 0) { break; } - cursor += fde_addr_size; - - U64 fde_offset = fde_addr - eh_frame_vaddr; - dumpf(" { off=0x%04I64x, pc=0x%I64x, fde=0x%I64x }\n", entry_off, pc, fde_offset); - } - dumpf(" }\n"); - - dumpf("}\n"); - - } - - if (subset_flags & EH_DumpSubsetFlag_EhFrame) { - dumpf(".eh_frame:\n"); - dumpf("{\n"); - for (U64 cursor = 0; cursor < eh_frame.size; ) { - DW_DescriptorEntry desc = {0}; - U64 desc_size = eh_parse_descriptor_entry_header(eh_frame, cursor, &desc); - if (desc_size == 0) { break; } - - switch (desc.type) { - case DW_DescriptorEntryType_Null: break; - case DW_DescriptorEntryType_CIE: { - String8 cie_data = str8_substr(eh_frame, desc.entry_range); - DW_CIE cie = {0}; - if (eh_parse_cie(cie_data, desc.format, arch, eh_frame_vaddr + cursor, &ptr_ctx, &cie)) { - String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, ext, cie.format, 0, &cie, eh_decode_ptr, &ptr_ctx, cie.insts); - dumpf(" CIE: // entry range: %r\n", desc.entry_range); - dumpf(" {\n"); - dumpf(" Format: %S\n", dw_string_from_format(desc.format)); - dumpf(" Version: %u\n", cie.version); - dumpf(" Aug string: \"%S\"\n", cie.aug_string); - dumpf(" Code align: %I64u\n", cie.code_align_factor); - dumpf(" Data align: %I64d\n", cie.data_align_factor); - dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); - if (cie.version > DW_Version_3) { - dumpf(" Address size: %u\n", cie.address_size); - dumpf(" Segment selector size: %u\n", cie.segment_selector_size); - } - dumpf(" Initial Insturction:\n"); - dumpf(" {\n"); - for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(" %S\n", n->string); } - dumpf(" }\n"); - dumpf(" }\n"); - } else { - dumpf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); - } - } break; - case DW_DescriptorEntryType_FDE: { - U64 cie_offset = desc.cie_pointer_off - desc.cie_pointer; - - DW_CIE cie = {0}; - { - DW_DescriptorEntry cie_desc = {0}; - eh_parse_descriptor_entry_header(eh_frame, cie_offset, &cie_desc); - if (cie_desc.type == DW_DescriptorEntryType_CIE) { - String8 cie_data = str8_substr(eh_frame, cie_desc.entry_range); - eh_parse_cie(cie_data, cie_desc.format, arch, eh_frame_vaddr + cie_offset, &ptr_ctx, &cie); - } - } - - String8 fde_raw = str8_substr(eh_frame, desc.entry_range); - DW_FDE fde = {0}; - if (eh_parse_fde(fde_raw, desc.format, eh_frame_vaddr + cursor, &cie, &ptr_ctx, &fde)) { - String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, hdr.version, ext, fde.format, 0, &cie, eh_decode_ptr, &ptr_ctx, fde.insts); - - dumpf(" FDE: // entry range: %r\n", desc.entry_range); - dumpf(" {\n"); - { - dumpf(" Format: %S\n", dw_string_from_format(fde.format)); - dumpf(" CIE: 0x%I64x\n", cie_offset); - dumpf(" PC range: %r\n", fde.pc_range); - dumpf(" Instructions:\n"); - dumpf(" {\n"); - for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } - dumpf(" }\n"); - - dumpf(" Unwind:\n"); - dumpf(" {\n"); - DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, eh_decode_ptr, &ptr_ctx); - do { - String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, hdr.version, ext, fde.format, cfi_unwind->row->cfa); - String8 cfi_row_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, hdr.version, ext, fde.format, cfi_unwind->row); - dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_row_str); - } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); - dumpf(" }\n"); - } - } else { - dumpf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); - } - dumpf(" }\n"); - } break; - } - - cursor += desc_size; - } - dumpf("}\n"); - } - -#undef dumpf - scratch_end(scratch); - return strings; -} - diff --git a/src/dwarf/eh_frame.c b/src/dwarf/eh_frame.c deleted file mode 100644 index cf455905..00000000 --- a/src/dwarf/eh_frame.c +++ /dev/null @@ -1,470 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -internal U64 -eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) -{ - U64 ptr_off = off; - - if (encoding == EH_PtrEnc_Omit) { - return 0; - } - - // align read offset as needed - if (encoding == EH_PtrEnc_Aligned) { - ptr_off = AlignPow2(ptr_off, ptr_ctx->ptr_align); - encoding = EH_PtrEnc_Ptr; - } - - // decode pointer value - U64 decode_size = 0; - U64 raw_ptr_size = 0; - U64 raw_ptr = 0; - switch (encoding & EH_PtrEnc_TypeMask) { - default: { InvalidPath; } break; - - case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; - case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; - case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; - case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; - ufixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - } break; - - // TODO: Signed is actually just a flag that indicates this int is negavite. - // There shouldn't be a read for Signed. - // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. - case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; - - case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; - case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; - case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; - sfixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); - } break; - - case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; - case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; - } - - // apply relative bases - if (decode_size > 0) { - U64 ptr = raw_ptr; - switch (encoding & EH_PtrEnc_ModifierMask) { - case 0: break; - case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; - case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; - case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; - case EH_PtrEnc_FuncRel: { - Assert(!"TODO: need a sample to verify implementation"); - ptr = ptr_ctx->func_vaddr + raw_ptr; - } break; - default: { InvalidPath; } break; - } - - if (ptr_out) { - *ptr_out = ptr; - } - } - - return decode_size; -} - -internal EH_FrameHdr -eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) -{ - EH_FrameHdr header = {0}; - U64 cursor = 0; - - U64 version_size = str8_deserial_read_struct(data, cursor, &header.version); - if (version_size == 0) { goto exit; } - cursor += version_size; - - if (header.version == 1) { - U64 eh_frame_ptr_enc_size = str8_deserial_read_struct(data, cursor, &header.eh_frame_ptr_enc); - if (eh_frame_ptr_enc_size == 0) { goto exit; } - cursor += eh_frame_ptr_enc_size; - - U64 fde_count_enc_size = str8_deserial_read_struct(data, cursor, &header.fde_count_enc); - if (fde_count_enc_size == 0) { goto exit; } - cursor += fde_count_enc_size; - - U64 table_enc_size = str8_deserial_read_struct(data, cursor, &header.table_enc); - if (table_enc_size == 0) { goto exit; } - cursor += table_enc_size; - - cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.eh_frame_ptr_enc, &header.eh_frame_ptr); - cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.fde_count_enc, &header.fde_count); - - switch (header.table_enc & EH_PtrEnc_TypeMask) { - case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; - case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 - case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; - case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; - case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; - case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; - case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 - case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; - case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; - case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; - default: { InvalidPath; } break; - } - header.entry_byte_size = header.field_byte_size * 2; - - header.table = str8_skip(data, cursor); - AssertAlways(header.table.size == header.entry_byte_size * header.fde_count); - } else { - Assert(0 && "unknown version"); - } - -exit:; - return header; -} - -internal U64 -eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out) -{ - // TODO: - // Handle "eh" param, it indicates presence of EH Data field. - // On 32bit arch it is a 4-byte and on 64-bit 8-byte value. - // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html - // Reference doc doesn't clarify structure for EH Data though - - U64 cursor = 0; - - U64 aug_data_size = 0; - EH_AugFlags aug_flags = 0; - EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; - EH_PtrEnc addr_encoding = EH_PtrEnc_UData8; - EH_PtrEnc handler_encoding = EH_PtrEnc_Omit; - U64 handler_ip = 0; - if (str8_match(str8_prefix(aug_string, 1), str8_lit("z"), 0)) { - cursor = str8_deserial_read_uleb128(aug_data, cursor, &aug_data_size); - - for (U8 *ptr = aug_string.str+1; ptr < (aug_string.str+aug_string.size); ptr += 1) { - switch (*ptr) { - case 'L': { - cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding); - aug_flags |= EH_AugFlag_HasLSDA; - } break; - case 'P': { - cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding); - cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip); - aug_flags |= EH_AugFlag_HasHandler; - } break; - case 'R': { - cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); - aug_flags |= EH_AugFlag_HasAddrEnc; - } break; - case 'S': { - aug_flags |= EH_AugFlag_SignalFrame; - } break; - default: { Assert(!"failed to parse augmentation string"); goto exit; } break; - } - } - } - - if (aug_out) { - aug_out->handler_ip = handler_ip; - aug_out->handler_encoding = handler_encoding; - aug_out->lsda_encoding = handler_encoding; - aug_out->addr_encoding = addr_encoding; - aug_out->flags = aug_flags; - aug_out->size = aug_data_size; - } - -exit:; - U64 parse_size = cursor; - return parse_size; -} - -internal U64 -eh_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out) -{ - U32 first_four_bytes = 0; - str8_deserial_read_struct(data, off, &first_four_bytes); - DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - - U64 length = 0; - U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); - if (length_size == 0) { goto exit; } - - Rng1U64 entry_range = rng_1u64(off, off + length_size + length); - String8 entry_data = str8_substr(data, entry_range); - U64 id = 0; - U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); - if (id_size == 0) { goto exit; } - - desc_out->format = format; - desc_out->type = (id == 0) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE; - desc_out->entry_range = entry_range; - desc_out->cie_pointer = id; - desc_out->cie_pointer_off = off + length_size; - -exit:; - return length + length_size; -} - -internal B32 -eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out) -{ - B32 is_parsed = 0; - U64 cursor = format == DW_Format_32Bit ? 4 : 12; - - U64 cie_id = 0; - U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id); - if (cie_id_size == 0) { goto exit; } - cursor += cie_id_size; - - U8 version = 0; - U64 version_size = str8_deserial_read_struct(data, cursor, &version); - if (version_size == 0) { goto exit; } - cursor += version_size; - - String8 aug_string = {0}; - String8 aug_data = {0}; - EH_Augmentation aug = {0}; - U64 code_align_factor = 0; - S64 data_align_factor = 0; - U64 ret_addr_reg = max_U64; - if (version == 1) { - U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string); - if (aug_string_size == 0) { goto exit; } - cursor += aug_string_size; - - U64 eh_data = 0; - if (str8_match(aug_string, str8_lit("eh"), 0)) { - U64 arch_byte_size = byte_size_from_arch(arch); - cursor += str8_deserial_read(data, cursor, &eh_data, arch_byte_size, arch_byte_size); - } - - U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor); - if (code_align_factor_size == 0) { goto exit; } - cursor += code_align_factor_size; - - U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor); - if (data_align_factor_size == 0) { goto exit; } - cursor += data_align_factor_size; - - ret_addr_reg = 0; - U64 ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); - if (ret_addr_reg_size == 0) { goto exit; } - cursor += ret_addr_reg_size; - - U64 aug_data_size = eh_parse_aug_data(aug_string, str8_skip(data, cursor), pc + cursor, ptr_ctx, &aug); - aug_data = str8_substr(data, r1u64(cursor, cursor + aug.size)); - cursor += aug_data_size; - } else { - Assert(0 && "unexpected version"); - } - - cie_out->insts = str8_skip(data, cursor); - cie_out->aug_string = aug_string; - cie_out->aug_data = aug_data; - cie_out->code_align_factor = code_align_factor; - cie_out->data_align_factor = data_align_factor; - cie_out->ret_addr_reg = ret_addr_reg; - cie_out->format = format; - cie_out->version = version; - cie_out->address_size = byte_size_from_arch(arch); - cie_out->segment_selector_size = 0; - - cie_out->ext[EH_CIE_Ext_LSDAEnc] = EH_PtrEnc_Omit; - cie_out->ext[EH_CIE_Ext_AddrEnc] = EH_PtrEnc_Omit; - cie_out->ext[EH_CIE_Ext_HandlerEnc] = EH_PtrEnc_Omit; - - if (aug.flags & EH_AugFlag_HasLSDA) { - cie_out->ext[EH_CIE_Ext_LSDAEnc] = aug.lsda_encoding; - } - if (aug.flags & EH_AugFlag_HasAddrEnc) { - cie_out->ext[EH_CIE_Ext_AddrEnc] = aug.addr_encoding; - } - if (aug.flags & EH_AugFlag_HasHandler) { - cie_out->ext[EH_CIE_Ext_HandlerEnc] = aug.handler_encoding; - cie_out->ext[EH_CIE_Ext_HandlerIp ] = aug.handler_ip; - } - - is_parsed = 1; -exit:; - return is_parsed; -} - -internal B32 -eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out) -{ - B32 is_parsed = 0; - U64 cursor = format == DW_Format_32Bit ? 8 : 20; - - U64 pc_begin = 0; - U64 pc_delta = 0; - EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; - if (addr_enc != EH_PtrEnc_Omit) { - U64 pc_begin_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc, &pc_begin); - if (pc_begin_size == 0) { goto exit; } - cursor += pc_begin_size; - - U64 pc_delta_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc & EH_PtrEnc_TypeMask, &pc_delta); - if (pc_delta_size == 0) { goto exit; } - cursor += pc_delta_size; - } - - if (cursor + cie->aug_data.size > data.size) { goto exit; } - cursor += cie->aug_data.size; - - fde_out->format = format; - fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_delta); - fde_out->insts = str8_skip(data, cursor); - - is_parsed = 1; -exit:; - return is_parsed; -} - -internal U64 -eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) -{ - U64 fde_addr = max_U64; - U64 fde_idx = max_U64; - - if (header.version == 1) { - if (header.fde_count > 0) { - U64 first = 0; - U64 first_size = eh_parse_ptr(header.table, 0, ptr_ctx->pc_vaddr, ptr_ctx, header.table_enc, &first); - AssertAlways(first_size); - if (first == pc) { - fde_idx = 0; - goto exit; - } - if (first > pc) { - goto exit; - } - - U64 last_off = header.table.size - header.entry_byte_size; - U64 last = 0; - U64 last_size = eh_parse_ptr(header.table, last_off, ptr_ctx->pc_vaddr + last_off, ptr_ctx, header.table_enc, &last); - AssertAlways(last_size); - if (last <= pc) { - fde_idx = header.fde_count - 1; - goto exit; - } - - U64 l = 0; - U64 r = header.fde_count - 1; - while (l <= r) { - U64 m = l + (r - l) / 2; - U64 m_pc_off = m * header.entry_byte_size; - U64 m_pc = 0; - U64 m_pc_size = eh_parse_ptr(header.table, m_pc_off, ptr_ctx->pc_vaddr + m_pc_off, ptr_ctx, header.table_enc, &m_pc); - Assert(m_pc_size); - if (m_pc > pc) { - r = m - 1; - } else if (m_pc < pc) { - l = m + 1; - } else { - fde_idx = m; - goto exit; - } - } - - fde_idx = l > 0 ? l-1 : 0; - } - } - -exit:; - if (fde_idx < header.fde_count) { - U64 fde_addr_off = (fde_idx * header.entry_byte_size) + header.field_byte_size; - U64 fde_addr_size = eh_parse_ptr(header.table, fde_addr_off, ptr_ctx->pc_vaddr + fde_addr_off, ptr_ctx, header.table_enc, &fde_addr); - Assert(fde_addr_size); - } - return fde_addr; -} - -internal int -eh_frame_hdr_entry_sort(void *raw_a, void *raw_b) -{ - return ((EH_FrameHdrEntry *)raw_a)->addr < ((EH_FrameHdrEntry *)raw_b)->addr; -} - -internal String8 -eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, DW_FDE *fde) -{ - Temp scratch = scratch_begin(&arena, 1); - - // make .eh_frame_hdr - String8List srl = {0}; - str8_serial_begin(scratch.arena, &srl); - str8_serial_push_u8(scratch.arena, &srl, 1); // version - str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_Omit); // omit eh_frame_ptr field - str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // fde_count encoding - str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // table encoding - str8_serial_push_u64(scratch.arena, &srl, fde_count); // fde_count - String8 header = str8_serial_end(scratch.arena, &srl); - - // alloc buffer for output - U64 buffer_size = header.size + sizeof(EH_FrameHdrEntry) * fde_count; - U8 *buffer = push_array(arena, U8, buffer_size); - - // copy header - MemoryCopyStr8(buffer, header); - - // write the table - EH_FrameHdrEntry *table = (EH_FrameHdrEntry *)(buffer + header.size); - for EachIndex(fde_idx, fde_count) { - table[fde_idx].addr = fde[fde_idx].pc_range.min; - table[fde_idx].fde_offset = fde_offsets[fde_idx]; - } - radsort(table, fde_count, eh_frame_hdr_entry_sort); - - String8 eh_frame_hdr = str8(buffer, buffer_size); - scratch_end(scratch); - return eh_frame_hdr; -} - -internal -DW_DECODE_PTR(eh_decode_ptr) -{ - EH_DecodePtrCtx *ctx = ud; - return eh_parse_ptr(data, 0, ctx->ptr_ctx->pc_vaddr, ctx->ptr_ctx, ctx->addr_enc, ptr_out); -} - -internal String8 -eh_string_from_ptr_enc_type(EH_PtrEnc type) -{ - switch (type) { - case EH_PtrEnc_Ptr: return str8_lit("Ptr"); - case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); - case EH_PtrEnc_UData2: return str8_lit("UData2"); - case EH_PtrEnc_UData4: return str8_lit("UData4"); - case EH_PtrEnc_UData8: return str8_lit("UData8"); - case EH_PtrEnc_Signed: return str8_lit("Signed"); - case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); - case EH_PtrEnc_SData2: return str8_lit("SData2"); - case EH_PtrEnc_SData4: return str8_lit("SData4"); - case EH_PtrEnc_SData8: return str8_lit("SData8"); - } - return str8_zero(); -} - -internal String8 -eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier) -{ - switch (modifier) { - case EH_PtrEnc_PcRel: return str8_lit("PcRel"); - case EH_PtrEnc_TextRel: return str8_lit("TextRel"); - case EH_PtrEnc_DataRel: return str8_lit("DataRel"); - case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); - case EH_PtrEnc_Aligned: return str8_lit("Aligned"); - } - return str8_zero(); -} - -internal String8 -eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc) -{ - String8 type_str = eh_string_from_ptr_enc_type(enc & EH_PtrEnc_TypeMask); - String8 modifer_str = eh_string_from_ptr_enc_modifier(enc & EH_PtrEnc_ModifierMask); - String8 indir_str = enc & EH_PtrEnc_Indirect ? str8_lit("Indirect") : str8_zero(); - String8 result = str8f(arena, "Type: %S, Modifier %S (%S)", type_str, modifer_str, indir_str); - return result; -} diff --git a/src/dwarf/generated/dwarf.meta.c b/src/dwarf/generated/dwarf.meta.c index 0378fad9..ceb29e6f 100644 --- a/src/dwarf/generated/dwarf.meta.c +++ b/src/dwarf/generated/dwarf.meta.c @@ -3,3 +3,72 @@ //- GENERATED CODE +C_LINKAGE_BEGIN +String8 dw_regular_name_from_section_kind_table[18] = +{ +str8_lit_comp(""), +str8_lit_comp(".debug_abbrev"), +str8_lit_comp(".debug_aranges"), +str8_lit_comp(".debug_frame"), +str8_lit_comp(".debug_info"), +str8_lit_comp(".debug_line"), +str8_lit_comp(".debug_loc"), +str8_lit_comp(".debug_macinfo"), +str8_lit_comp(".debug_pubnames"), +str8_lit_comp(".debug_pubtypes"), +str8_lit_comp(".debug_ranges"), +str8_lit_comp(".debug_str"), +str8_lit_comp(".debug_addr"), +str8_lit_comp(".debug_loclists"), +str8_lit_comp(".debug_rnglists"), +str8_lit_comp(".debug_str_offsets"), +str8_lit_comp(".debug_line_str"), +str8_lit_comp(".debug_names"), +}; + +String8 dw_macho_name_from_section_kind_table[18] = +{ +str8_lit_comp(""), +str8_lit_comp("__debug_abbrev"), +str8_lit_comp("__debug_aranges"), +str8_lit_comp("__debug_frame"), +str8_lit_comp("__debug_info"), +str8_lit_comp("__debug_line"), +str8_lit_comp("__debug_loc"), +str8_lit_comp("__debug_macinfo"), +str8_lit_comp("__debug_pubnames"), +str8_lit_comp("__debug_pubtypes"), +str8_lit_comp("__debug_ranges"), +str8_lit_comp("__debug_str"), +str8_lit_comp("__debug_addr"), +str8_lit_comp("__debug_loclists"), +str8_lit_comp("__debug_rnglists"), +str8_lit_comp("__debug_str_offsets"), +str8_lit_comp("__debug_line_str"), +str8_lit_comp("__debug_names"), +}; + +String8 dw_dwo_name_from_section_kind_table[18] = +{ +str8_lit_comp(""), +str8_lit_comp(".debug_abbrev.dwo"), +str8_lit_comp(".debug_aranges.dwo"), +str8_lit_comp(".debug_frame.dwo"), +str8_lit_comp(".debug_info.dwo"), +str8_lit_comp(".debug_line.dwo"), +str8_lit_comp(".debug_loc.dwo"), +str8_lit_comp(".debug_macinfo.dwo"), +str8_lit_comp(".debug_pubnames.dwo"), +str8_lit_comp(".debug_pubtypes.dwo"), +str8_lit_comp(".debug_ranges.dwo"), +str8_lit_comp(".debug_str.dwo"), +str8_lit_comp(".debug_addr.dwo"), +str8_lit_comp(".debug_loclists.dwo"), +str8_lit_comp(".debug_rnglists.dwo"), +str8_lit_comp(".debug_str_offsets.dwo"), +str8_lit_comp(".debug_line_str.dwo"), +str8_lit_comp(".debug_names.dwo"), +}; + +C_LINKAGE_END + diff --git a/src/dwarf/generated/dwarf.meta.h b/src/dwarf/generated/dwarf.meta.h index 39719f80..5255dcca 100644 --- a/src/dwarf/generated/dwarf.meta.h +++ b/src/dwarf/generated/dwarf.meta.h @@ -6,6 +6,959 @@ #ifndef DWARF_META_H #define DWARF_META_H +typedef U16 DW_Version; +typedef enum DW_VersionEnum +{ +DW_Version_Null, +DW_Version_1, +DW_Version_2, +DW_Version_3, +DW_Version_4, +DW_Version_5, +DW_Version_Last = DW_Version_5, +} DW_VersionEnum; + +typedef enum DW_Ext +{ +DW_Ext_Null, +DW_Ext_GNU, +DW_Ext_LLVM, +DW_Ext_Apple, +DW_Ext_MIPS, +} DW_Ext; + +typedef U32 DW_ExtFlags; +typedef enum DW_ExtFlagsEnum +{ +DW_ExtFlag_GNU = (1<kind != reader_attrib->v.attrib_kind) { goto exit; } if (writer_attrib->form.reader.kind != reader_attrib->v.form.kind) { goto exit; } - if ( ! dw_form_match(writer_attrib->form.reader, reader_attrib->v.form)) { goto exit; } + if ( ! dw_test__form_match(writer_attrib->form.reader, reader_attrib->v.form)) { goto exit; } writer_attrib = writer_attrib->next; reader_attrib = reader_attrib->next; } @@ -1011,7 +1092,6 @@ Test(plus_uconst) TestCheck(expr_value.addr == 0x123 + 4); } -#if 0 Test(reg_split_spill) { // setup register context diff --git a/src/eh_frame/eh_frame.c b/src/eh_frame/eh_frame.c new file mode 100644 index 00000000..06fdc93e --- /dev/null +++ b/src/eh_frame/eh_frame.c @@ -0,0 +1,650 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#if 0 +internal U64 +eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) +{ + U64 ptr_off = off; + + if (encoding == EH_PtrEnc_Omit) { + return 0; + } + + // align read offset as needed + if (encoding == EH_PtrEnc_Aligned) { + ptr_off = AlignPow2(ptr_off, ptr_ctx->ptr_align); + encoding = EH_PtrEnc_Ptr; + } + + // decode pointer value + U64 decode_size = 0; + U64 raw_ptr_size = 0; + U64 raw_ptr = 0; + switch (encoding & EH_PtrEnc_TypeMask) { + default: { InvalidPath; } break; + + case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; + case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; + case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; + case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; + ufixed: { + decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); + } break; + + // TODO: Signed is actually just a flag that indicates this int is negavite. + // There shouldn't be a read for Signed. + // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. + case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; + + case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; + case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; + case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; + sfixed: { + decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); + raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); + } break; + + case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; + case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; + } + + // apply relative bases + if (decode_size > 0) { + U64 ptr = raw_ptr; + switch (encoding & EH_PtrEnc_ModifierMask) { + case 0: break; + case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; + case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; + case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; + case EH_PtrEnc_FuncRel: { + Assert(!"TODO: need a sample to verify implementation"); + ptr = ptr_ctx->func_vaddr + raw_ptr; + } break; + default: { InvalidPath; } break; + } + + if (ptr_out) { + *ptr_out = ptr; + } + } + + return decode_size; +} +#endif + +internal EH_FrameHdr +eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) +{ + EH_FrameHdr header = {0}; + U64 cursor = 0; + + U64 version_size = str8_deserial_read_struct(data, cursor, &header.version); + if (version_size == 0) { goto exit; } + cursor += version_size; + + if (header.version == 1) { + U64 eh_frame_ptr_enc_size = str8_deserial_read_struct(data, cursor, &header.eh_frame_ptr_enc); + if (eh_frame_ptr_enc_size == 0) { goto exit; } + cursor += eh_frame_ptr_enc_size; + + U64 fde_count_enc_size = str8_deserial_read_struct(data, cursor, &header.fde_count_enc); + if (fde_count_enc_size == 0) { goto exit; } + cursor += fde_count_enc_size; + + U64 table_enc_size = str8_deserial_read_struct(data, cursor, &header.table_enc); + if (table_enc_size == 0) { goto exit; } + cursor += table_enc_size; + + cursor += eh_read_ptr(data, cursor, cursor, ptr_ctx, header.eh_frame_ptr_enc, &header.eh_frame_ptr); + cursor += eh_read_ptr(data, cursor, cursor, ptr_ctx, header.fde_count_enc, &header.fde_count); + + switch (header.table_enc & EH_PtrEnc_TypeMask) { + case EH_PtrEnc_Ptr: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_ULEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_UData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_UData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_UData8: { header.field_byte_size = 8; } break; + case EH_PtrEnc_Signed: { header.field_byte_size = address_size; } break; + case EH_PtrEnc_SLEB128: { InvalidPath; } break; // TODO: when loading module convert these to UData8 + case EH_PtrEnc_SData2: { header.field_byte_size = 2; } break; + case EH_PtrEnc_SData4: { header.field_byte_size = 4; } break; + case EH_PtrEnc_SData8: { header.field_byte_size = 8; } break; + default: { InvalidPath; } break; + } + header.entry_byte_size = header.field_byte_size * 2; + + header.table = str8_skip(data, cursor); + AssertAlways(header.table.size == header.entry_byte_size * header.fde_count); + } else { + Assert(0 && "unknown version"); + } + + exit:; + return header; +} + +#if 0 +internal U64 +eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out) +{ + // TODO: + // Handle "eh" param, it indicates presence of EH Data field. + // On 32bit arch it is a 4-byte and on 64-bit 8-byte value. + // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html + // Reference doc doesn't clarify structure for EH Data though + + U64 cursor = 0; + + U64 aug_data_size = 0; + EH_AugFlags aug_flags = 0; + EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; + EH_PtrEnc addr_encoding = EH_PtrEnc_UData8; + EH_PtrEnc handler_encoding = EH_PtrEnc_Omit; + U64 handler_ip = 0; + if (str8_match(str8_prefix(aug_string, 1), str8_lit("z"), 0)) { + cursor = str8_deserial_read_uleb128(aug_data, cursor, &aug_data_size); + + for (U8 *ptr = aug_string.str+1; ptr < (aug_string.str+aug_string.size); ptr += 1) { + switch (*ptr) { + case 'L': { + cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding); + aug_flags |= EH_AugFlag_HasLSDA; + } break; + case 'P': { + cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding); + cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip); + aug_flags |= EH_AugFlag_HasHandler; + } break; + case 'R': { + cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); + aug_flags |= EH_AugFlag_HasAddrEnc; + } break; + case 'S': { + aug_flags |= EH_AugFlag_SignalFrame; + } break; + default: { Assert(!"failed to parse augmentation string"); goto exit; } break; + } + } + } + + if (aug_out) { + aug_out->handler_ip = handler_ip; + aug_out->handler_encoding = handler_encoding; + aug_out->lsda_encoding = handler_encoding; + aug_out->addr_encoding = addr_encoding; + aug_out->flags = aug_flags; + aug_out->size = aug_data_size; + } + + exit:; + U64 parse_size = cursor; + return parse_size; +} +#endif + +internal U64 +eh_read_ptr(String8 data, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) +{ + U64 start_off = off; + if(encoding != EH_PtrEnc_Omit) + { + // rjf: apply aligned encoding & align pointer offset + if(encoding == EH_PtrEnc_Aligned) + { + off = AlignPow2(off, ptr_ctx->ptr_align); + encoding = EH_PtrEnc_Ptr; + } + U64 start_ptr_read_off = off; + + // rjf: decode pointer value + U64 raw_ptr_size = 0; + U64 raw_ptr = 0; + switch(encoding & EH_PtrEnc_TypeMask) + { + default:{}break; + + // rjf: fixed-size pointer reads + case EH_PtrEnc_Ptr: {raw_ptr_size = 8;}goto ufixed; + case EH_PtrEnc_UData2:{raw_ptr_size = 2;}goto ufixed; + case EH_PtrEnc_UData4:{raw_ptr_size = 4;}goto ufixed; + case EH_PtrEnc_UData8:{raw_ptr_size = 8;}goto ufixed; + ufixed: + { + off += str8_deserial_read(data, off, &raw_ptr, raw_ptr_size, raw_ptr_size); + }break; + + // TODO: Signed is actually just a flag that indicates this int is negavite. + // There shouldn't be a read for Signed. + // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. + case EH_PtrEnc_Signed:{raw_ptr_size = 8;}goto sfixed; + + // rjf: fixed-size pointer reads w/ sign extension + case EH_PtrEnc_SData2:{raw_ptr_size = 2;}goto sfixed; + case EH_PtrEnc_SData4:{raw_ptr_size = 4;}goto sfixed; + case EH_PtrEnc_SData8:{raw_ptr_size = 8;}goto sfixed; + sfixed: + { + off += str8_deserial_read(data, off, &raw_ptr, raw_ptr_size, raw_ptr_size); + raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); + }break; + + // rjf: uleb128/sleb128 + case EH_PtrEnc_ULEB128:{off += str8_deserial_read_uleb128(data, off, &raw_ptr); }break; + case EH_PtrEnc_SLEB128:{off += str8_deserial_read_sleb128(data, off, (S64*)&raw_ptr);}break; + } + + // rjf: apply relative bases + U64 ptr = raw_ptr; + if(off != start_ptr_read_off) + { + switch(encoding & EH_PtrEnc_ModifierMask) + { + default:{}break; + case 0:{}break; + case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; + case EH_PtrEnc_TextRel:{ ptr = ptr_ctx->text_vaddr + raw_ptr; } break; + case EH_PtrEnc_DataRel:{ ptr = ptr_ctx->data_vaddr + raw_ptr; } break; + case EH_PtrEnc_FuncRel: + { + Assert(!"TODO: need a sample to verify implementation"); + ptr = ptr_ctx->func_vaddr + raw_ptr; + }break; + } + } + + // rjf: fill output + if(ptr_out) + { + *ptr_out = ptr; + } + } + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal U64 +eh_read_aug_data(String8 data, U64 off, String8 string, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out) +{ + // TODO: + // Handle "eh" param, it indicates presence of EH Data field. + // On 32bit arch it is a 4-byte and on 64-bit 8-byte value. + // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html + // Reference doc doesn't clarify structure for EH Data though + U64 start_off = off; + U64 aug_data_size = 0; + EH_AugFlags aug_flags = 0; + EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; + EH_PtrEnc addr_encoding = EH_PtrEnc_UData8; + EH_PtrEnc handler_encoding = EH_PtrEnc_Omit; + U64 handler_ip = 0; + if(str8_match(str8_prefix(string, 1), str8_lit("z"), 0)) + { + off += str8_deserial_read_uleb128(data, off, &aug_data_size); + for(U8 *ptr = string.str+1; ptr < (string.str+string.size); ptr += 1) + { + switch(*ptr) + { + default:{goto exit;}break; + case 'L': + { + off += str8_deserial_read_struct(data, off, &lsda_encoding); + aug_flags |= EH_AugFlag_HasLSDA; + }break; + case 'P': + { + off += str8_deserial_read_struct(data, off, &handler_encoding); + off += eh_read_ptr(data, off, pc + (off - start_off), ptr_ctx, handler_encoding, &handler_ip); + aug_flags |= EH_AugFlag_HasHandler; + }break; + case 'R': + { + off += str8_deserial_read_struct(data, off, &addr_encoding); + aug_flags |= EH_AugFlag_HasAddrEnc; + }break; + case 'S': + { + aug_flags |= EH_AugFlag_SignalFrame; + }break; + } + } + } + if(aug_out != 0) + { + aug_out->handler_ip = handler_ip; + aug_out->handler_encoding = handler_encoding; + aug_out->lsda_encoding = handler_encoding; + aug_out->addr_encoding = addr_encoding; + aug_out->flags = aug_flags; + aug_out->size = aug_data_size; + } + exit:; + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal U64 +eh_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi_header_out) +{ + U64 start_off = off; + + // rjf: read length / format + U64 length = 0; + DW_Format fmt = DW_Format_Null; + U64 length_size = dw2_read_initial_length(data, off, &length, &fmt); + + // rjf: find entry info, read ID + Rng1U64 entry_range = r1u64(off, off + length_size + length); + String8 entry_data = str8_substr(data, entry_range); + U64 id = 0; + U64 id_size = dw2_read_fmt_u64(entry_data, length_size, fmt, &id); + + // rjf: fill + cfi_header_out->kind = (id == 0) ? DW_CFIKind_CIE : DW_CFIKind_FDE; + cfi_header_out->fmt = fmt; + cfi_header_out->entry_range = entry_range; + cfi_header_out->cie_pointer = id; + cfi_header_out->cie_pointer_off = off + length_size; + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal U64 +eh_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out) +{ + U64 start_off = off; + + // rjf: skip format-dependent prefix + off += (fmt == DW_Format_32Bit) ? 4 : 12; + + // rjf: read id + U64 id = 0; + off += dw2_read_fmt_u64(data, off, fmt, &id); + + // rjf: read version + U8 version = 0; + off += str8_deserial_read_struct(data, off, &version); + + // rjf: read entry info + U64 aug_string_off_first = 0; + U64 aug_string_off_opl = 0; + U64 aug_data_off_first = 0; + U64 aug_data_off_opl = 0; + U64 code_align_factor = 0; + S64 data_align_factor = 0; + U64 ret_addr_reg = 0; + EH_Augmentation aug = {0}; + if(version == 1) + { + // rjf: read aug string + aug_string_off_first = off; + String8 aug_string = {0}; + off += str8_deserial_read_cstr(data, off, &aug_string); + aug_string_off_opl = off; + + // rjf: read eh data + U64 eh_data = 0; + if(str8_match(aug_string, s("eh"), 0)) + { + U64 arch_byte_size = byte_size_from_arch(arch); + off += str8_deserial_read(data, off, &eh_data, arch_byte_size, arch_byte_size); + } + + // rjf: read align factors + off += str8_deserial_read_uleb128(data, off, &code_align_factor); + off += str8_deserial_read_sleb128(data, off, &data_align_factor); + + // rjf: read return address register + off += str8_deserial_read(data, off, &ret_addr_reg, sizeof(U8), sizeof(U8)); + + // rjf: parse augmentation + aug_data_off_first = off; + U64 aug_data_size = eh_read_aug_data(data, off, aug_string, pc + (off - start_off), ptr_ctx, &aug); + aug_data_off_opl = off + aug.size; + off += aug_data_size; + } + + // rjf: fill output + cie_out->aug_string_range = r1u64(aug_string_off_first, aug_string_off_opl); + cie_out->aug_data_range = r1u64(aug_data_off_first, aug_data_off_opl); + cie_out->code_align_factor = code_align_factor; + cie_out->data_align_factor = data_align_factor; + cie_out->ret_addr_reg = ret_addr_reg; + cie_out->format = fmt; + cie_out->version = version; + cie_out->address_size = byte_size_from_arch(arch); + cie_out->segment_selector_size = 0; + cie_out->ext[EH_CIE_Ext_LSDAEnc] = EH_PtrEnc_Omit; + cie_out->ext[EH_CIE_Ext_AddrEnc] = EH_PtrEnc_Omit; + cie_out->ext[EH_CIE_Ext_HandlerEnc] = EH_PtrEnc_Omit; + if(aug.flags & EH_AugFlag_HasLSDA) + { + cie_out->ext[EH_CIE_Ext_LSDAEnc] = aug.lsda_encoding; + } + if(aug.flags & EH_AugFlag_HasAddrEnc) + { + cie_out->ext[EH_CIE_Ext_AddrEnc] = aug.addr_encoding; + } + if(aug.flags & EH_AugFlag_HasHandler) + { + cie_out->ext[EH_CIE_Ext_HandlerEnc] = aug.handler_encoding; + cie_out->ext[EH_CIE_Ext_HandlerIp ] = aug.handler_ip; + } + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal U64 +eh_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie, DW_FDE *fde_out) +{ + U64 start_off = off; + + // rjf: skip format-dependent prefix + off += (fmt == DW_Format_32Bit) ? 8 : 20; + + // rjf: read pc begin / delta + U64 pc_begin = 0; + U64 pc_delta = 0; + EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; + if(addr_enc != EH_PtrEnc_Omit) + { + off += eh_read_ptr(data, off, pc + (off - start_off), ptr_ctx, addr_enc, &pc_begin); + off += eh_read_ptr(data, off, pc + (off - start_off), ptr_ctx, addr_enc & EH_PtrEnc_TypeMask, &pc_delta); + } + + // rjf: skip aug data + off += dim_1u64(cie->aug_data_range); + + // rjf: fill output + fde_out->pc_range = r1u64(pc_begin, pc_begin + pc_delta); + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +#if 0 +internal B32 +eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out) +{ + B32 is_parsed = 0; + U64 cursor = format == DW_Format_32Bit ? 8 : 20; + + U64 pc_begin = 0; + U64 pc_delta = 0; + EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; + if (addr_enc != EH_PtrEnc_Omit) { + U64 pc_begin_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc, &pc_begin); + if (pc_begin_size == 0) { goto exit; } + cursor += pc_begin_size; + + U64 pc_delta_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc & EH_PtrEnc_TypeMask, &pc_delta); + if (pc_delta_size == 0) { goto exit; } + cursor += pc_delta_size; + } + + if (cursor + cie->aug_data.size > data.size) { goto exit; } + cursor += cie->aug_data.size; + + fde_out->format = format; + fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_delta); + fde_out->insts = str8_skip(data, cursor); + + is_parsed = 1; + exit:; + return is_parsed; +} +#endif + +#if 0 +internal U64 +eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) +{ + U64 fde_addr = max_U64; + U64 fde_idx = max_U64; + + if (header.version == 1) { + if (header.fde_count > 0) { + U64 first = 0; + U64 first_size = eh_parse_ptr(header.table, 0, ptr_ctx->pc_vaddr, ptr_ctx, header.table_enc, &first); + AssertAlways(first_size); + if (first == pc) { + fde_idx = 0; + goto exit; + } + if (first > pc) { + goto exit; + } + + U64 last_off = header.table.size - header.entry_byte_size; + U64 last = 0; + U64 last_size = eh_parse_ptr(header.table, last_off, ptr_ctx->pc_vaddr + last_off, ptr_ctx, header.table_enc, &last); + AssertAlways(last_size); + if (last <= pc) { + fde_idx = header.fde_count - 1; + goto exit; + } + + U64 l = 0; + U64 r = header.fde_count - 1; + while (l <= r) { + U64 m = l + (r - l) / 2; + U64 m_pc_off = m * header.entry_byte_size; + U64 m_pc = 0; + U64 m_pc_size = eh_parse_ptr(header.table, m_pc_off, ptr_ctx->pc_vaddr + m_pc_off, ptr_ctx, header.table_enc, &m_pc); + Assert(m_pc_size); + if (m_pc > pc) { + r = m - 1; + } else if (m_pc < pc) { + l = m + 1; + } else { + fde_idx = m; + goto exit; + } + } + + fde_idx = l > 0 ? l-1 : 0; + } + } + + exit:; + if (fde_idx < header.fde_count) { + U64 fde_addr_off = (fde_idx * header.entry_byte_size) + header.field_byte_size; + U64 fde_addr_size = eh_parse_ptr(header.table, fde_addr_off, ptr_ctx->pc_vaddr + fde_addr_off, ptr_ctx, header.table_enc, &fde_addr); + Assert(fde_addr_size); + } + return fde_addr; +} +#endif + +internal int +eh_frame_hdr_entry_sort(void *raw_a, void *raw_b) +{ + return ((EH_FrameHdrEntry *)raw_a)->addr < ((EH_FrameHdrEntry *)raw_b)->addr; +} + +internal String8 +eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, DW_FDE *fde) +{ + Temp scratch = scratch_begin(&arena, 1); + + // make .eh_frame_hdr + String8List srl = {0}; + str8_serial_begin(scratch.arena, &srl); + str8_serial_push_u8(scratch.arena, &srl, 1); // version + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_Omit); // omit eh_frame_ptr field + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // fde_count encoding + str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // table encoding + str8_serial_push_u64(scratch.arena, &srl, fde_count); // fde_count + String8 header = str8_serial_end(scratch.arena, &srl); + + // alloc buffer for output + U64 buffer_size = header.size + sizeof(EH_FrameHdrEntry) * fde_count; + U8 *buffer = push_array(arena, U8, buffer_size); + + // copy header + MemoryCopyStr8(buffer, header); + + // write the table + EH_FrameHdrEntry *table = (EH_FrameHdrEntry *)(buffer + header.size); + for EachIndex(fde_idx, fde_count) { + table[fde_idx].addr = fde[fde_idx].pc_range.min; + table[fde_idx].fde_offset = fde_offsets[fde_idx]; + } + radsort(table, fde_count, eh_frame_hdr_entry_sort); + + String8 eh_frame_hdr = str8(buffer, buffer_size); + scratch_end(scratch); + return eh_frame_hdr; +} + +#if 0 +internal +DW_DECODE_PTR(eh_decode_ptr) +{ + EH_DecodePtrCtx *ctx = ud; + return eh_parse_ptr(data, 0, ctx->ptr_ctx->pc_vaddr, ctx->ptr_ctx, ctx->addr_enc, ptr_out); +} +#endif + +internal String8 +eh_string_from_ptr_enc_type(EH_PtrEnc type) +{ + switch (type) { + case EH_PtrEnc_Ptr: return str8_lit("Ptr"); + case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); + case EH_PtrEnc_UData2: return str8_lit("UData2"); + case EH_PtrEnc_UData4: return str8_lit("UData4"); + case EH_PtrEnc_UData8: return str8_lit("UData8"); + case EH_PtrEnc_Signed: return str8_lit("Signed"); + case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); + case EH_PtrEnc_SData2: return str8_lit("SData2"); + case EH_PtrEnc_SData4: return str8_lit("SData4"); + case EH_PtrEnc_SData8: return str8_lit("SData8"); + } + return str8_zero(); +} + +internal String8 +eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier) +{ + switch (modifier) { + case EH_PtrEnc_PcRel: return str8_lit("PcRel"); + case EH_PtrEnc_TextRel: return str8_lit("TextRel"); + case EH_PtrEnc_DataRel: return str8_lit("DataRel"); + case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); + case EH_PtrEnc_Aligned: return str8_lit("Aligned"); + } + return str8_zero(); +} + +internal String8 +eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc) +{ + String8 type_str = eh_string_from_ptr_enc_type(enc & EH_PtrEnc_TypeMask); + String8 modifer_str = eh_string_from_ptr_enc_modifier(enc & EH_PtrEnc_ModifierMask); + String8 indir_str = enc & EH_PtrEnc_Indirect ? str8_lit("Indirect") : str8_zero(); + String8 result = str8f(arena, "Type: %S, Modifier %S (%S)", type_str, modifer_str, indir_str); + return result; +} diff --git a/src/dwarf/eh_frame.h b/src/eh_frame/eh_frame.h similarity index 85% rename from src/dwarf/eh_frame.h rename to src/eh_frame/eh_frame.h index 9ae4a257..e4517d8a 100644 --- a/src/dwarf/eh_frame.h +++ b/src/eh_frame/eh_frame.h @@ -20,7 +20,7 @@ enum EH_PtrEnc_SData2 = 0x0A, // Signed 16-bit value EH_PtrEnc_SData4 = 0x0B, // Signed 32-bit value EH_PtrEnc_SData8 = 0x0C, // Signed 64-bit value - + EH_PtrEnc_TypeMask = 0x0F, }; @@ -31,7 +31,7 @@ enum EH_PtrEnc_DataRel = 0x30, // Value is relative to the .got or .eh_frame_hdr section. EH_PtrEnc_FuncRel = 0x40, // Value is relative to the function. EH_PtrEnc_Aligned = 0x50, // Value is aligned to an address unit sized boundary. - + EH_PtrEnc_ModifierMask = 0x70, }; @@ -104,13 +104,23 @@ typedef struct EH_DecodePtrCtx EH_PtrEnc addr_enc; EH_PtrCtx *ptr_ctx; } EH_DecodePtrCtx; - + //////////////////////////////// +#if 0 internal U64 eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); +#endif internal EH_FrameHdr eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx); +#if 0 internal U64 eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out); -internal B32 eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out); +#endif + +internal U64 eh_read_ptr(String8 data, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); +internal U64 eh_read_aug_data(String8 data, U64 off, String8 string, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out); +internal U64 eh_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi_header_out); +internal U64 eh_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out); +internal U64 eh_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie, DW_FDE *fde_out); + internal B32 eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out); internal U64 eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc); internal String8 eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, struct DW_FDE *fde); diff --git a/src/eh_frame/eh_frame_dump.c b/src/eh_frame/eh_frame_dump.c new file mode 100644 index 00000000..fad2a3a4 --- /dev/null +++ b/src/eh_frame/eh_frame_dump.c @@ -0,0 +1,152 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal String8List +eh_dump_list_from_data(Arena *arena, Arch arch, U64 eh_frame_hdr_vaddr, U64 eh_frame_vaddr, String8 eh_frame_hdr, String8 eh_frame, EH_DumpSubsetFlags subset_flags) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List strings = {0}; +#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__) + + EH_PtrCtx ptr_ctx = {.data_vaddr = eh_frame_hdr_vaddr}; + EH_FrameHdr hdr = eh_parse_frame_hdr(eh_frame_hdr, byte_size_from_arch(arch), &ptr_ctx); + DW_ExtFlags exts = DW_ExtFlag_All; + + //- rjf: eh frame header + if(subset_flags & EH_DumpSubsetFlag_EhFrameHdr) + { + dumpf(".eh_frame_hdr:\n"); + dumpf("{\n"); + dumpf(" version: %u\n", hdr.version); + dumpf(" eh_frame_ptr_enc: %S\n", eh_string_from_ptr_enc(scratch.arena, hdr.eh_frame_ptr_enc)); + dumpf(" table_enc: %S\n", eh_string_from_ptr_enc(scratch.arena, hdr.table_enc)); + dumpf(" fde_count: %llu\n", hdr.fde_count); + if(hdr.eh_frame_ptr_enc != EH_PtrEnc_Omit) + { + dumpf(" eh_frame_ptr: 0x%I64x\n", hdr.eh_frame_ptr); + } + dumpf(" Entries:\n"); + dumpf(" {\n"); + for(U64 cursor = 0; cursor < hdr.table.size; ) + { + U64 entry_off = cursor; + U64 pc = 0; + U64 pc_size = eh_read_ptr(hdr.table, cursor, cursor, &ptr_ctx, hdr.table_enc, &pc); + if (pc_size == 0) { break; } + cursor += pc_size; + U64 fde_addr = 0; + U64 fde_addr_size = eh_read_ptr(hdr.table, cursor, cursor, &ptr_ctx, hdr.table_enc, &fde_addr); + if (fde_addr_size == 0) { break; } + cursor += fde_addr_size; + U64 fde_offset = fde_addr - eh_frame_vaddr; + dumpf(" { off=0x%04I64x, pc=0x%I64x, fde=0x%I64x }\n", entry_off, pc, fde_offset); + } + dumpf(" }\n"); + dumpf("}\n"); + } + + //- rjf: eh frame data + if(subset_flags & EH_DumpSubsetFlag_EhFrame) + { +#if 0 + dumpf(".eh_frame:\n"); + dumpf("{\n"); + for(U64 cursor = 0; cursor < eh_frame.size;) + { + DW_CFIHeader header = {0}; + U64 header_size = eh_read_cfi_header(eh_frame, cursor, &header); + switch(header.kind) + { + case DW_CFIKind_Null:{}break; + case DW_CFIKind_CIE: + { + DW_CIE cie = {0}; + eh_read_cie(eh_frame, header.entry_range.min, header.fmt, arch, eh_frame_vaddr + cursor, &ptr_ctx, &cie); + if(cie.version != 0) + { + String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, ext, cie.format, 0, &cie, eh_decode_ptr, &ptr_ctx, cie.insts); + String8 aug_string = str8_substr(eh_frame, cie.aug_string_range); + dumpf(" CIE: // entry range: [0x%I64x, 0x%I64x)\n", header.entry_range.min, header.entry_range.max); + dumpf(" {\n"); + dumpf(" Format: %S\n", dw_string_from_format(desc.format)); + dumpf(" Version: %u\n", cie.version); + dumpf(" Aug string: \"%S\"\n", aug_string); + dumpf(" Code align: %I64u\n", cie.code_align_factor); + dumpf(" Data align: %I64d\n", cie.data_align_factor); + dumpf(" Return addr reg: %u\n", cie.ret_addr_reg); + if(cie.version > DW_Version_3) + { + dumpf(" Address size: %u\n", cie.address_size); + dumpf(" Segment selector size: %u\n", cie.segment_selector_size); + } + dumpf(" Initial Insturction:\n"); + dumpf(" {\n"); + for EachNode(n, String8Node, init_insts_str_list.first) + { + dumpf(" %S\n", n->string); + } + dumpf(" }\n"); + dumpf(" }\n"); + } + else + { + dumpf("ERROR: unable to parse CIE @ %I64x\n", header.entry_range.min); + } + }break; + case DW_CFIKind_FDE: + { + U64 cie_offset = header.cie_pointer_off - header.cie_pointer; + + DW_CIE cie = {0}; + { + DW_DescriptorEntry cie_desc = {0}; + eh_parse_descriptor_entry_header(eh_frame, cie_offset, &cie_desc); + if (cie_desc.type == DW_DescriptorEntryKind_CIE) { + String8 cie_data = str8_substr(eh_frame, cie_desc.entry_range); + eh_parse_cie(cie_data, cie_desc.format, arch, eh_frame_vaddr + cie_offset, &ptr_ctx, &cie); + } + } + + String8 fde_raw = str8_substr(eh_frame, desc.entry_range); + DW_FDE fde = {0}; + if (eh_parse_fde(fde_raw, desc.format, eh_frame_vaddr + cursor, &cie, &ptr_ctx, &fde)) { + String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, hdr.version, ext, fde.format, 0, &cie, eh_decode_ptr, &ptr_ctx, fde.insts); + + dumpf(" FDE: // entry range: %r\n", desc.entry_range); + dumpf(" {\n"); + { + dumpf(" Format: %S\n", dw_string_from_format(fde.format)); + dumpf(" CIE: 0x%I64x\n", cie_offset); + dumpf(" PC range: %r\n", fde.pc_range); + dumpf(" Instructions:\n"); + dumpf(" {\n"); + for EachNode(n, String8Node, insts_str_list.first) { dumpf(" %S\n", n->string); } + dumpf(" }\n"); + + dumpf(" Unwind:\n"); + dumpf(" {\n"); + DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, eh_decode_ptr, &ptr_ctx); + do { + String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, hdr.version, ext, fde.format, cfi_unwind->row->cfa); + String8 cfi_row_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, hdr.version, ext, fde.format, cfi_unwind->row); + dumpf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_row_str); + } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); + dumpf(" }\n"); + } + } else { + dumpf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); + } + dumpf(" }\n"); + } break; + } + + cursor += desc_size; + } + dumpf("}\n"); +#endif + } + +#undef dumpf + scratch_end(scratch); + return strings; +} diff --git a/src/dwarf/eh_dump.h b/src/eh_frame/eh_frame_dump.h similarity index 92% rename from src/dwarf/eh_dump.h rename to src/eh_frame/eh_frame_dump.h index 8ba5a6cb..7ded82bd 100644 --- a/src/dwarf/eh_dump.h +++ b/src/eh_frame/eh_frame_dump.h @@ -8,8 +8,8 @@ //~ Dump Subset Types #define EH_DumpSubset_XList \ - X(EhFrameHdr, eh_frame_hdr, ".eh_frame_hdr") \ - X(EhFrame, eh_frame, ".eh_frame") +X(EhFrameHdr, eh_frame_hdr, ".eh_frame_hdr") \ +X(EhFrame, eh_frame, ".eh_frame") typedef enum EH_DumpSubset { #define X(name, name_lower, title) EH_DumpSubset_##name, diff --git a/src/eh_frame/unwind/eh_frame_unwind.c b/src/eh_frame/unwind/eh_frame_unwind.c new file mode 100644 index 00000000..2f300e71 --- /dev/null +++ b/src/eh_frame/unwind/eh_frame_unwind.c @@ -0,0 +1,696 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal UWND_StepResult +eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 tls_vaddr, void *regs, U64 *cfa_out) +{ + Temp scratch = scratch_begin(0, 0); + B32 done = 0; + UWND_StepResult result = {0}; + EH_UWND_ModuleUnwindInfo *unwind_info = (EH_UWND_ModuleUnwindInfo *)module_info->unwind_info; + if(unwind_info != 0) + { + //- rjf: unpack context + EH_FrameHdr *header = &unwind_info->header; + EH_PtrCtx *ptr_ctx = &unwind_info->ptr_ctx; + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 pc = arch_ip_from_reg_block(arch_info, regs); + + //- rjf: set up new register values + void *new_regs = push_array(scratch.arena, U8, arch_info->reg_block_size); + MemoryCopy(new_regs, regs, arch_info->reg_block_size); + + //- rjf: find nearest FDE entry to the IP + U64 fde_vaddr = 0; + if(header->version == 1 && header->fde_count != 0) + { + // rjf: binary search to find FDE number + U64 fde_num = 0; + { + U64 min_idx = 0; + U64 max_idx = header->fde_count-1; + for(;min_idx <= max_idx;) + { + U64 mid_idx = min_idx + (max_idx - min_idx) / 2; + U64 mid_pc_off = mid_idx*header->entry_byte_size; + U64 mid_pc = 0; + eh_read_ptr(header->table, mid_pc_off, ptr_ctx->pc_vaddr + mid_pc_off, ptr_ctx, header->table_enc, &mid_pc); + if(mid_pc > pc) + { + max_idx = mid_idx - 1; + } + else if(mid_pc < pc) + { + min_idx = mid_idx + 1; + } + else + { + fde_num = mid_idx + 1; + break; + } + } + if(fde_num == 0) + { + fde_num = min_idx > 0 ? min_idx : 1; + } + } + + // rjf: FDE number -> FDE vaddr + if(0 < fde_num && fde_num <= header->fde_count) + { + U64 fde_vaddr_off = ((fde_num-1) * header->entry_byte_size) + header->field_byte_size; + eh_read_ptr(header->table, fde_vaddr_off, ptr_ctx->pc_vaddr + fde_vaddr_off, ptr_ctx, header->table_enc, &fde_vaddr); + } + } + + //- rjf: parse info from FDE entry + DW_CIE cie = {0}; + DW_FDE fde = {0}; + U64 cie_inst_data_off = 0; + U64 fde_inst_data_off = 0; + String8 cie_inst_data = {0}; + String8 fde_inst_data = {0}; + if(fde_vaddr != 0) + { + // rjf: determine FDE's full address range + Rng1U64 fde_vaddr_range = {0}; + DW_Format fde_fmt = DW_Format_Null; + { + // rjf: read initial length data + String8 initial_length_data = {0}; + { + U8 *initial_length_data_buffer = push_array(scratch.arena, U8, 12); + Rng1U64 initial_length_vaddr_range = r1u64(fde_vaddr, fde_vaddr+12); + U64 initial_length_data_size = memory_map_read(memory_map, initial_length_vaddr_range, initial_length_data_buffer); + initial_length_data = str8(initial_length_data_buffer, initial_length_data_size); + if(initial_length_data_size < 4) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = initial_length_vaddr_range; + } + } + + // rjf: compute initial length + U64 length = 0; + if(!done) + { + dw2_read_initial_length(initial_length_data, 0, &length, &fde_fmt); + } + + // rjf: determine vaddr range of all FDE data + // + // TODO(rjf): are we sure this is supposed to *not* advance past the 8 byte length field + // when the initial 4 bytes are max_U32? this would mean that in 32-bit format, the length + // *does not* include the length encoding itself, but in 64-bit format, the length *does* + // include the length, but not the initial 4 bytes max_U32 marker. WTF? + // + fde_vaddr_range = r1u64(fde_vaddr, fde_vaddr + 4 + length); + } + + // rjf: read FDE data + String8 fde_data = {0}; + if(!done) + { + U64 fde_data_expected_size = dim_1u64(fde_vaddr_range); + U8 *fde_data_buffer = push_array(scratch.arena, U8, fde_data_expected_size); + U64 fde_data_size = memory_map_read(memory_map, fde_vaddr_range, fde_data_buffer); + if(fde_data_size != fde_data_expected_size) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = fde_vaddr_range; + } + fde_data = str8(fde_data_buffer, fde_data_size); + } + + // rjf: FDE data -> CIE address + U64 cie_vaddr = 0; + if(!done) + { + U64 cie_delta_off = (fde_fmt == DW_Format_32Bit ? 4 : 12); + U64 cie_delta = 0; + dw2_read_fmt_u64(fde_data, cie_delta_off, fde_fmt, &cie_delta); + cie_vaddr = (fde_vaddr + cie_delta_off) - cie_delta; + } + + // rjf: determine CIE's full address range + Rng1U64 cie_vaddr_range = {0}; + DW_Format cie_fmt = DW_Format_Null; + { + // rjf: read initial length data + String8 initial_length_data = {0}; + { + U8 *initial_length_data_buffer = push_array(scratch.arena, U8, 12); + Rng1U64 initial_length_vaddr_range = r1u64(cie_vaddr, cie_vaddr+12); + U64 initial_length_data_size = memory_map_read(memory_map, initial_length_vaddr_range, initial_length_data_buffer); + initial_length_data = str8(initial_length_data_buffer, initial_length_data_size); + if(initial_length_data_size < 4) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = initial_length_vaddr_range; + } + } + + // rjf: compute initial length + U64 length = 0; + if(!done) + { + dw2_read_initial_length(initial_length_data, 0, &length, &cie_fmt); + } + + // rjf: form full address range of CIE data + // + // TODO(rjf): is this busted? see above note in FDE parse + // + cie_vaddr_range = r1u64(cie_vaddr, cie_vaddr + 4 + length); + } + + // rjf: read CIE data + String8 cie_data = {0}; + if(!done) + { + U64 cie_data_expected_size = dim_1u64(cie_vaddr_range); + U8 *cie_data_buffer = push_array(scratch.arena, U8, cie_data_expected_size); + U64 cie_data_size = memory_map_read(memory_map, cie_vaddr_range, cie_data_buffer); + if(cie_data_size != cie_data_expected_size) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = cie_vaddr_range; + } + cie_data = str8(cie_data_buffer, cie_data_size); + } + + // rjf: parse CIE data, & FDE data + cie_inst_data_off = eh_read_cie(cie_data, 0, cie_fmt, arch, cie_vaddr_range.min, ptr_ctx, &cie); + fde_inst_data_off = eh_read_fde(fde_data, 0, fde_fmt, arch, fde_vaddr_range.min, ptr_ctx, &cie, &fde); + cie_inst_data = str8_skip(cie_data, cie_inst_data_off); + fde_inst_data = str8_skip(fde_data, fde_inst_data_off); + } + + //- rjf: parse CIE/FDE info, produce CFI row for this PC + U64 reg_count = dw_reg_count_from_arch(arch); + DW_CFIRow cfi_row = {0}; + cfi_row.reg_rules = push_array(scratch.arena, DW_UnwindRule, reg_count); + if(!done && contains_1u64(fde.pc_range, pc)) + { + U64 code_align_factor = cie.code_align_factor; + S64 data_align_factor = cie.data_align_factor; + DW_CFIRow initial_row = {0}; + initial_row.reg_rules = push_array(scratch.arena, DW_UnwindRule, reg_count); + DW_CFIRowNode *top_row = 0; + DW_CFIRowNode *free_row = 0; + struct + { + String8 inst_data; + U64 inst_data_off; + } + program_tasks[] = + { + {cie_inst_data, cie_inst_data_off}, + {fde_inst_data, fde_inst_data_off}, + }; + B32 computed_row = 0; + for EachElement(program_task_idx, program_tasks) + { + // rjf: exit if we computed the target row + if(computed_row) + { + break; + } + + // rjf: run unwind instruction program + String8 inst_data = program_tasks[program_task_idx].inst_data; + U64 inst_data_off = program_tasks[program_task_idx].inst_data_off; + for(U64 off = 0; off < inst_data.size;) + { + U64 start_off = off; + + // rjf: read next opcode + DW_CFAOpCode raw_opcode = DW_CFAOpCode_Nop; + off += str8_deserial_read_struct(inst_data, off, &raw_opcode); + + // rjf: unpack opcode (raw opcode can contain implicit operands) + DW_CFAOpCode opcode = raw_opcode & ~DW_CFAOpCodeMask_OpcodeHi; + U64 implicit_operand = 0; + if((raw_opcode & DW_CFAOpCodeMask_OpcodeHi) != 0) + { + opcode = (raw_opcode & DW_CFAOpCodeMask_OpcodeHi); + implicit_operand = raw_opcode & DW_CFAOpCodeMask_Operand; + } + + // rjf: apply opcode + U64 new_base_pc_off = cfi_row.base_pc_off; + switch(opcode) + { + default:{}break; + case DW_CFAOpCode_Nop:{}break; + + //- rjf: location adjustments + case DW_CFAOpCode_SetLoc: + { + off += eh_read_ptr(inst_data, off, ptr_ctx->pc_vaddr + inst_data_off + off, ptr_ctx, header->table_enc, &new_base_pc_off); + }break; + case DW_CFAOpCode_AdvanceLoc: + { + new_base_pc_off += implicit_operand * code_align_factor; + }break; + case DW_CFAOpCode_AdvanceLoc1: + { + U8 delta = 0; + off += str8_deserial_read_struct(inst_data, off, &delta); + new_base_pc_off += delta; + }break; + case DW_CFAOpCode_AdvanceLoc2: + { + U16 delta = 0; + off += str8_deserial_read_struct(inst_data, off, &delta); + new_base_pc_off += delta; + }break; + case DW_CFAOpCode_AdvanceLoc4: + { + U32 delta = 0; + off += str8_deserial_read_struct(inst_data, off, &delta); + new_base_pc_off += delta; + }break; + + //- rjf: row operations + case DW_CFAOpCode_RememberState: + { + // rjf: alloc row node + DW_CFIRowNode *n = free_row; + if(n != 0) + { + SLLStackPop(free_row); + } + else + { + n = push_array(scratch.arena, DW_CFIRowNode, 1); + n->v.reg_rules = push_array(scratch.arena, DW_UnwindRule, reg_count); + } + + // rjf: copy current state + n->v.base_pc_off = cfi_row.base_pc_off; + n->v.cfa_rule = cfi_row.cfa_rule; + MemoryCopy(n->v.reg_rules, cfi_row.reg_rules, sizeof(cfi_row.reg_rules[0])*reg_count); + + // rjf: push + SLLStackPush(top_row, n); + }break; + case DW_CFAOpCode_RestoreState: + if(top_row != 0) + { + // rjf: pop row + DW_CFIRowNode *n = top_row; + SLLStackPop(top_row); + + // rjf: copy to current state + cfi_row.base_pc_off = n->v.base_pc_off; + cfi_row.cfa_rule = n->v.cfa_rule; + MemoryCopy(cfi_row.reg_rules, n->v.reg_rules, sizeof(cfi_row.reg_rules[0])*reg_count); + + // rjf: free row + SLLStackPush(free_row, n); + }break; + + //- rjf: register rules + case DW_CFAOpCode_OffsetExt: + { + U64 reg = 0; + U64 reg_off = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + off += str8_deserial_read_uleb128(inst_data, off, ®_off); + reg_off *= data_align_factor; + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_Off; + cfi_row.reg_rules[reg].s64 = (S64)reg_off; + } + }break; + case DW_CFAOpCode_OffsetExtSf: + { + U64 reg = 0; + S64 reg_off = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + off += str8_deserial_read_sleb128(inst_data, off, ®_off); + reg_off *= data_align_factor; + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_Off; + cfi_row.reg_rules[reg].s64 = reg_off; + } + }break; + case DW_CFAOpCode_Undefined: + { + U64 reg = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_Undefined; + } + }break; + case DW_CFAOpCode_SameValue: + { + U64 reg = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_SameVal; + } + }break; + case DW_CFAOpCode_Register: + { + U64 dst_reg = 0; + U64 src_reg = 0; + off += str8_deserial_read_uleb128(inst_data, off, &dst_reg); + off += str8_deserial_read_uleb128(inst_data, off, &src_reg); + if(dst_reg < reg_count) + { + cfi_row.reg_rules[dst_reg].code = DW_UnwindRuleCode_Reg; + cfi_row.reg_rules[dst_reg].reg_code = src_reg; + } + }break; + case DW_CFAOpCode_Expr: + { + U64 reg = 0; + U64 expr_size = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + off += str8_deserial_read_uleb128(inst_data, off, &expr_size); + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_Expr; + cfi_row.reg_rules[reg].expr = str8_substr(inst_data, r1u64(off, off+expr_size)); + } + }break; + case DW_CFAOpCode_ValOffset: + { + U64 reg = 0; + U64 val_off = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + off += str8_deserial_read_uleb128(inst_data, off, &val_off); + val_off *= data_align_factor; + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_ValOff; + cfi_row.reg_rules[reg].s64 = (S64)val_off; + } + }break; + case DW_CFAOpCode_ValOffsetSf: + { + U64 reg = 0; + S64 val_off = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + off += str8_deserial_read_sleb128(inst_data, off, &val_off); + val_off *= data_align_factor; + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_ValOff; + cfi_row.reg_rules[reg].s64 = val_off; + } + }break; + case DW_CFAOpCode_ValExpr: + { + U64 reg = 0; + U64 expr_size = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + off += str8_deserial_read_uleb128(inst_data, off, &expr_size); + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_ValExpr; + cfi_row.reg_rules[reg].expr = str8_substr(inst_data, r1u64(off, off+expr_size)); + } + }break; + case DW_CFAOpCode_Offset: + { + U64 offset = 0; + off += str8_deserial_read_uleb128(inst_data, off, &offset); + offset *= data_align_factor; + U64 reg = implicit_operand; + if(reg < reg_count) + { + cfi_row.reg_rules[reg].code = DW_UnwindRuleCode_Off; + cfi_row.reg_rules[reg].s64 = (S64)offset; + } + }break; + + //- rjf: CFA rules + case DW_CFAOpCode_DefCfa: + { + U64 reg = 0; + U64 reg_off = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + off += str8_deserial_read_uleb128(inst_data, off, ®_off); + cfi_row.cfa_rule.code = DW_UnwindRuleCode_Reg; + cfi_row.cfa_rule.reg_code = reg; + cfi_row.cfa_rule.s64 = (S64)reg_off; + }break; + case DW_CFAOpCode_DefCfaSf: + { + U64 reg = 0; + S64 reg_off = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + off += str8_deserial_read_sleb128(inst_data, off, ®_off); + cfi_row.cfa_rule.code = DW_UnwindRuleCode_Reg; + cfi_row.cfa_rule.reg_code = reg; + cfi_row.cfa_rule.s64 = (S64)(reg_off * data_align_factor); + }break; + case DW_CFAOpCode_DefCfaRegister: + { + U64 reg = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + cfi_row.cfa_rule.code = DW_UnwindRuleCode_Reg; + cfi_row.cfa_rule.reg_code = reg; + }break; + case DW_CFAOpCode_DefCfaOffset: + { + U64 reg_off = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®_off); + cfi_row.cfa_rule.s64 = (S64)reg_off; + }break; + case DW_CFAOpCode_DefCfaOffsetSf: + { + S64 reg_off = 0; + off += str8_deserial_read_sleb128(inst_data, off, ®_off); + cfi_row.cfa_rule.s64 = (S64)reg_off; + }break; + case DW_CFAOpCode_DefCfaExpr: + { + U64 expr_size = 0; + off += str8_deserial_read_uleb128(inst_data, off, &expr_size); + cfi_row.cfa_rule.code = DW_UnwindRuleCode_Expr; + cfi_row.cfa_rule.expr = str8_substr(inst_data, r1u64(off, off+expr_size)); + }break; + + //- rjf: register state resets + case DW_CFAOpCode_Restore: + { + U64 reg = implicit_operand; + if(reg < reg_count) + { + cfi_row.reg_rules[reg] = initial_row.reg_rules[reg]; + } + }break; + case DW_CFAOpCode_RestoreExt: + { + U64 reg = 0; + off += str8_deserial_read_uleb128(inst_data, off, ®); + if(reg < reg_count) + { + cfi_row.reg_rules[reg] = initial_row.reg_rules[reg]; + } + }break; + } + + // rjf: exit early if we found the CFI row for this pc + { + U64 pc_off = (pc - fde.pc_range.min); + if(cfi_row.base_pc_off <= pc_off && pc_off < new_base_pc_off) + { + computed_row = 1; + break; + } + } + + // rjf: commit changes to CFI row base pc + cfi_row.base_pc_off = new_base_pc_off; + + // rjf: abort if we made no parsing progress + if(off == start_off) + { + break; + } + } + + // rjf: on cie program -> save current state as 'initial state', to be + // potentially restored by fde + { + initial_row.base_pc_off = cfi_row.base_pc_off; + initial_row.cfa_rule = cfi_row.cfa_rule; + MemoryCopy(initial_row.reg_rules, cfi_row.reg_rules, sizeof(initial_row.reg_rules[0])*reg_count); + } + } + } + + //- rjf: evaluate frame base vaddr (CFA) via CFI row rule + U64 cfa = 0; + if(!done) switch(cfi_row.cfa_rule.code) + { + default:{}break; + case DW_UnwindRuleCode_Reg: + { + U64 cfa_reg_val = 0; + DW_RegCode dw_reg_code = cfi_row.cfa_rule.reg_code; + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, dw_reg_code); + arch_reg_block_read_range(arch_info, regs, arch_info->reg_code_rng_table[reg_code], &cfa_reg_val); + cfa = cfa_reg_val + cfi_row.cfa_rule.s64; + }break; + case DW_UnwindRuleCode_Expr: + { + String8 expr = cfi_row.cfa_rule.expr; + DW_EvalState eval_state = {0}; + DW_Eval eval = dw_eval(scratch.arena, cie.format, arch, memory_map, regs, 0, 0, tls_vaddr, &eval_state, expr, 1000); + if(eval.status == DW_EvalStatus_FailedMemoryRead) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = eval.missed_read_vaddr_range; + } + else + { + cfa = eval.val.u512.u64[0]; + } + }break; + } + + //- rjf: apply CFI row rules to registers + if(!done) for EachIndex(reg_idx, reg_count) + { + DW_UnwindRule *rule = &cfi_row.reg_rules[reg_idx]; + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_idx); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + U64 reg_size = dim_1u16(reg_rng); + switch(rule->code) + { + default: + case DW_UnwindRuleCode_Undefined: + case DW_UnwindRuleCode_SameVal:{}break; + case DW_UnwindRuleCode_Off: + { + Temp temp = temp_begin(scratch.arena); + U64 addr = cfa + rule->s64; + Rng1U64 reg_value_vaddr_range = r1u64(addr, addr+reg_size); + U8 *reg_value_buffer = push_array(temp.arena, U8, reg_size); + if(memory_map_read(memory_map, reg_value_vaddr_range, reg_value_buffer) != reg_size) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = reg_value_vaddr_range; + } + if(!done) + { + arch_reg_block_write_range(arch_info, new_regs, reg_rng, reg_value_buffer); + } + temp_end(temp); + }break; + case DW_UnwindRuleCode_ValOff: + { + U64 reg_value = cfa + rule->s64; + Rng1U16 write_range = r1u16(reg_rng.min, Min(reg_rng.max, reg_rng.min + sizeof(reg_value))); + arch_reg_block_write_range(arch_info, new_regs, write_range, ®_value); + }break; + case DW_UnwindRuleCode_Reg: + { + Temp temp = temp_begin(scratch.arena); + DW_RegCode src_reg_code_dw = rule->reg_code; + ARCH_RegCode src_reg_code = arch_reg_code_from_dw(arch, src_reg_code_dw); + Rng1U16 src_reg_rng = arch_info->reg_code_rng_table[src_reg_code]; + U64 src_reg_size = dim_1u16(src_reg_rng); + U64 read_size = Min(src_reg_size, reg_size); + U8 *src_reg_val_buffer = push_array(temp.arena, U8, read_size); + arch_reg_block_read_range(arch_info, regs, src_reg_rng, src_reg_val_buffer); + arch_reg_block_write_range(arch_info, new_regs, reg_rng, src_reg_val_buffer); + temp_end(temp); + }break; + case DW_UnwindRuleCode_Expr: + { + Temp temp = temp_begin(scratch.arena); + String8 expr = rule->expr; + DW_EvalState eval_state = {0}; + DW_Eval eval = dw_eval(scratch.arena, cie.format, arch, memory_map, regs, 0, cfa, tls_vaddr, &eval_state, expr, 1000); + if(eval.status == DW_EvalStatus_FailedMemoryRead) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = eval.missed_read_vaddr_range; + } + if(!done) + { + U64 reg_val_vaddr = eval.val.u512.u64[0]; + Rng1U64 reg_value_vaddr_range = r1u64(reg_val_vaddr, reg_val_vaddr+reg_size); + U8 *reg_value_buffer = push_array(temp.arena, U8, reg_size); + if(memory_map_read(memory_map, reg_value_vaddr_range, reg_value_buffer) != reg_size) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = reg_value_vaddr_range; + } + else + { + arch_reg_block_write_range(arch_info, new_regs, reg_rng, reg_value_buffer); + } + } + temp_end(scratch); + }break; + case DW_UnwindRuleCode_ValExpr: + { + Temp temp = temp_begin(scratch.arena); + String8 expr = rule->expr; + DW_EvalState eval_state = {0}; + DW_Eval eval = dw_eval(scratch.arena, cie.format, arch, memory_map, regs, 0, cfa, tls_vaddr, &eval_state, expr, 1000); + if(eval.status == DW_EvalStatus_FailedMemoryRead) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = eval.missed_read_vaddr_range; + } + if(!done) + { + U512 reg_val = eval.val.u512; + arch_reg_block_write_range(arch_info, new_regs, reg_rng, ®_val); + } + temp_end(scratch); + }break; + case DW_UnwindRuleCode_Architectural: + { + // NOTE(rjf): the DWARF spec says that this code implies: + // + // "The rule is defined externally to this specification by the augmenter" + // + // so leaving this blank until we know exactly what that means. + }break; + } + } + + //- TODO(rjf): old code was replacing the stack pointer with the CFA. + // this is surely incorrect, no? isn't the entire point of the CFA + // to be *not* necessarily the stack pointer? and wouldn't the stack + // pointer be modified via the above rules? so what are we doing + // here? + // + if(!done) + { + arch_reg_block_write_sp(arch_info, new_regs, cfa); + } + + //- rjf: commit new register values, if we succeeded + if(!done) + { + result.status = UWND_StepStatus_Good; + MemoryCopy(regs, new_regs, arch_info->reg_block_size); + } + } + scratch_end(scratch); + return result; +} diff --git a/src/eh_frame/unwind/eh_frame_unwind.h b/src/eh_frame/unwind/eh_frame_unwind.h new file mode 100644 index 00000000..d83bb5a4 --- /dev/null +++ b/src/eh_frame/unwind/eh_frame_unwind.h @@ -0,0 +1,22 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EH_FRAME_UNWIND_H +#define EH_FRAME_UNWIND_H + +//////////////////////////////// +//~ rjf: Module Unwind Info Type + +typedef struct EH_UWND_ModuleUnwindInfo EH_UWND_ModuleUnwindInfo; +struct EH_UWND_ModuleUnwindInfo +{ + EH_FrameHdr header; + EH_PtrCtx ptr_ctx; +}; + +//////////////////////////////// +//~ rjf: Unwinding Abstraction Implementation + +internal UWND_StepResult eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 tls_vaddr, void *regs, U64 *cfa_out); + +#endif // EH_FRAME_UNWIND_H diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 9545350d..d9675138 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -276,7 +276,7 @@ commit_memory_large(void *ptr, U64 size) } //////////////////////////////// -//~ rjf: @os_hooks Shared Memory +//~ rjf: @per_os_impl Shared Memory internal SharedMemory shared_memory_alloc(U64 size, String8 name) diff --git a/src/linux/demon/linux_demon.c b/src/linux/demon/linux_demon.c index e7571235..06117347 100644 --- a/src/linux/demon/linux_demon.c +++ b/src/linux/demon/linux_demon.c @@ -515,7 +515,6 @@ lnx_dmn_module_info_from_process_module(Arena *arena, pid_t pid, int memory_fd, info->tls_index = tls_index; info->tls_offset = tls_offset; info->eh_frame_header_vaddr_range = eh_frame_header_vaddr_range; - info->cfi_rebase = module_rebase; info->raddbg_info_voff_range = raddbg_info_voff_range; info->raddbg_is_attached_marker_voff = raddbg_is_attached_marker_voff; } @@ -1016,6 +1015,7 @@ lnx_dmn_thread_alloc(LNX_DMN_Process *process, LNX_DMN_ThreadState thread_state, thread->state = thread_state; thread->process = process; thread->reg_block = reg_block; + thread->dtv_base_vaddr = lnx_dmn_tls_root_vaddr_from_reg_block(process->fd, process->ctx->arch, reg_block); if(thread_state == LNX_DMN_ThreadState_Stopped) { thread->is_reg_block_dirty = !lnx_dmn_thread_read_reg_block(thread); @@ -1823,6 +1823,30 @@ lnx_dmn_set_single_step_flag(LNX_DMN_Thread *thread, B32 is_on) return is_flag_set; } +internal U64 +lnx_dmn_tls_root_vaddr_from_reg_block(int fd, Arch arch, void *reg_block) +{ + U64 result = 0; + switch(arch) + { + case Arch_x86: + case Arch_arm32: + case Arch_arm64: + case Arch_Null: + case Arch_COUNT:{}break; + case Arch_x64: + { + X64_RegBlock *reg_block_x64 = (X64_RegBlock *)reg_block; + U64 dtv_pointer = 0; + if(lnx_dmn_read_struct(fd, reg_block_x64->fsbase + 8, &dtv_pointer)) + { + result = dtv_pointer; + } + }break; + } + return result; +} + internal void lnx_dmn_thread_ptr_list_push_node(LNX_DMN_ThreadPtrList *list, LNX_DMN_ThreadPtrNode *n) { @@ -1896,6 +1920,8 @@ lnx_dmn_push_event_create_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Th e->thread = lnx_dmn_handle_from_thread(thread); e->arch = thread->process->ctx->arch; e->code = thread->tid; + // TODO(rjf): e->stack_pointer = ???; + e->tls_root_vaddr = thread->dtv_base_vaddr; } internal void @@ -3239,46 +3265,6 @@ dmn_process_write(DMN_Handle process_handle, Rng1U64 range, void *src) //- rjf: threads -internal U64 -dmn_stack_base_vaddr_from_thread(DMN_Handle thread_handle) -{ - return 0; -} - -internal U64 -dmn_tls_root_vaddr_from_thread(DMN_Handle thread_handle) -{ - U64 tls_root_vaddr = max_U64; - DMN_AccessScope - { - LNX_DMN_Thread *thread = lnx_dmn_thread_from_handle(thread_handle); - if(thread) - { - switch(thread->process->ctx->arch) - { - case Arch_Null: {} break; - case Arch_x64: - { - X64_RegBlock *reg_block = thread->reg_block; - U64 dtv_pointer = 0; - if(lnx_dmn_read_struct(thread->process->fd, reg_block->fsbase + 8, &dtv_pointer)) - { - tls_root_vaddr = dtv_pointer; - } - } break; - case Arch_x86: - case Arch_arm32: - case Arch_arm64: - { - NotImplemented; - } break; - default: { InvalidPath; } break; - } - } - } - return tls_root_vaddr; -} - internal B32 dmn_thread_read_reg_block(DMN_Handle thread_handle, void *reg_block) { @@ -3316,6 +3302,40 @@ dmn_thread_write_reg_block(DMN_Handle thread_handle, void *reg_block) return result; } +internal B32 +dmn_thread_get_module_tls_vaddr(DMN_Handle thread_handle, DMN_Handle module_handle, U64 *vaddr_out) +{ + B32 result = 0; + DMN_AccessScope + { + LNX_DMN_Thread *thread = lnx_dmn_thread_from_handle(thread_handle); + if(thread != 0) + { + LNX_DMN_Process *process = thread->process; + LNX_DMN_Module *module = lnx_dmn_module_from_handle(module_handle); + if(process != 0 && module != 0) + { + Arch arch = thread->process->ctx->arch; + U64 addr_size = byte_size_from_arch(arch); + U64 dtv_base_vaddr = thread->dtv_base_vaddr; + U64 dtv_entry_size = 2 * addr_size; + U64 module_dtv_ptr_vaddr = dtv_base_vaddr + module->tls_index * dtv_entry_size; + U64 module_dtv_vaddr = 0; + if(lnx_dmn_read(process->fd, r1u64(module_dtv_ptr_vaddr, module_dtv_ptr_vaddr+addr_size), &module_dtv_vaddr) == addr_size) + { + U64 unallocated_dtv_vaddr_marker = (addr_size == 4 ? max_U32 : max_U64); + if(module_dtv_vaddr != unallocated_dtv_vaddr_marker) + { + vaddr_out[0] = module_dtv_vaddr + module->tls_offset; + result = 1; + } + } + } + } + } + return result; +} + //- rjf: system process listing internal void diff --git a/src/linux/demon/linux_demon.h b/src/linux/demon/linux_demon.h index 721a2570..64a40edc 100644 --- a/src/linux/demon/linux_demon.h +++ b/src/linux/demon/linux_demon.h @@ -176,6 +176,7 @@ typedef struct LNX_DMN_Thread B32 pass_through_signal; U64 pass_through_signo; U64 orig_rax; + U64 dtv_base_vaddr; struct LNX_DMN_Thread *next; struct LNX_DMN_Thread *prev; @@ -476,6 +477,7 @@ internal void lnx_dmn_thread_write_sp(LNX_DMN_Thread *thread, U64 sp); internal B32 lnx_dmn_thread_read_reg_block(LNX_DMN_Thread *thread); internal B32 lnx_dmn_thread_write_reg_block(LNX_DMN_Thread *thread); internal B32 lnx_dmn_set_single_step_flag(LNX_DMN_Thread *thread, B32 is_on); +internal U64 lnx_dmn_tls_root_vaddr_from_reg_block(int fd, Arch arch, void *reg_block); //////////////////////////////// //~ List Helpers diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index 3787a031..49ea308b 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -20,7 +20,7 @@ lnx_window_from_x11window(Window window) } //////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) +//~ rjf: @per_os_impl Main Initialization API (Implemented Per-OS) internal void wm_init(void) @@ -68,14 +68,14 @@ wm_init(void) lnx_wm_state->cursors[map[idx].cursor] = XCreateFontCursor(lnx_wm_state->display, map[idx].id); } } - + // create wakeup event for polling lnx_wm_state->wakeup_fd = eventfd(0, EFD_CLOEXEC); Assert(lnx_wm_state->wakeup_fd > 0); } //////////////////////////////// -//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) +//~ rjf: @per_os_impl Graphics System Info (Implemented Per-OS) internal WM_SystemInfo * wm_get_system_info(void) @@ -84,7 +84,7 @@ wm_get_system_info(void) } //////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) +//~ rjf: @per_os_impl Clipboards (Implemented Per-OS) internal void wm_set_clipboard_text(String8 string) @@ -100,7 +100,7 @@ wm_get_clipboard_text(Arena *arena) } //////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) +//~ rjf: @per_os_impl Windows (Implemented Per-OS) internal WM_Window wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) @@ -342,7 +342,7 @@ wm_dpi_from_window(WM_Window handle) } //////////////////////////////// -//~ rjf: @os_hooks External Windows (Implemented Per-OS) +//~ rjf: @per_os_impl External Windows (Implemented Per-OS) internal WM_ExtWindow wm_focused_external_window(void) @@ -359,7 +359,7 @@ wm_focus_external_window(WM_ExtWindow handle) } //////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) +//~ rjf: @per_os_impl Monitors (Implemented Per-OS) internal WM_MonitorArray wm_push_monitors_array(Arena *arena) @@ -407,7 +407,7 @@ wm_dpi_from_monitor(WM_Monitor monitor) } //////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) +//~ rjf: @per_os_impl Events (Implemented Per-OS) internal void wm_send_wakeup_event(void) @@ -448,210 +448,210 @@ wm_get_events(Arena *arena, B32 wait) switch(evt.type) { default:{}break; - - //- rjf: key presses/releases - case KeyPress: - case KeyRelease: - { - // rjf: determine flags - WM_Modifiers modifiers = 0; - if(evt.xkey.state & ShiftMask) { modifiers |= WM_Modifier_Shift; } - if(evt.xkey.state & ControlMask) { modifiers |= WM_Modifier_Ctrl; } - if(evt.xkey.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; } - // rjf: map keycode -> keysym & codepoint - LNX_WM_Window *window = lnx_window_from_x11window(evt.xkey.window); - KeySym keysym = 0; - U8 text[256] = {0}; - U64 text_size = Xutf8LookupString(window->xic, &evt.xkey, (char *)text, sizeof(text), &keysym, 0); - - // rjf: map keysym -> WM_Key - B32 is_right_sided = 0; - WM_Key key = WM_Key_Null; - switch(keysym) + //- rjf: key presses/releases + case KeyPress: + case KeyRelease: { - default: + // rjf: determine flags + WM_Modifiers modifiers = 0; + if(evt.xkey.state & ShiftMask) { modifiers |= WM_Modifier_Shift; } + if(evt.xkey.state & ControlMask) { modifiers |= WM_Modifier_Ctrl; } + if(evt.xkey.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; } + + // rjf: map keycode -> keysym & codepoint + LNX_WM_Window *window = lnx_window_from_x11window(evt.xkey.window); + KeySym keysym = 0; + U8 text[256] = {0}; + U64 text_size = Xutf8LookupString(window->xic, &evt.xkey, (char *)text, sizeof(text), &keysym, 0); + + // rjf: map keysym -> WM_Key + B32 is_right_sided = 0; + WM_Key key = WM_Key_Null; + switch(keysym) { - if(0){} - else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (WM_Key)(WM_Key_F1 + (keysym - XK_F1)); } - else if('0' <= keysym && keysym <= '9') { key = WM_Key_0 + (keysym-'0'); } - }break; - case XK_Escape:{key = WM_Key_Esc;};break; - case XK_BackSpace:{key = WM_Key_Backspace;}break; - case XK_Delete:{key = WM_Key_Delete;}break; - case XK_Return:{key = WM_Key_Return;}break; - case XK_Pause:{key = WM_Key_Pause;}break; - case XK_Tab:{key = WM_Key_Tab;}break; - case XK_Left:{key = WM_Key_Left;}break; - case XK_Right:{key = WM_Key_Right;}break; - case XK_Up:{key = WM_Key_Up;}break; - case XK_Down:{key = WM_Key_Down;}break; - case XK_Home:{key = WM_Key_Home;}break; - case XK_End:{key = WM_Key_End;}break; - case XK_Page_Up:{key = WM_Key_PageUp;}break; - case XK_Page_Down:{key = WM_Key_PageDown;}break; - case XK_Alt_L:{ key = WM_Key_Alt; }break; - case XK_Alt_R:{ key = WM_Key_Alt; is_right_sided = 1;}break; - case XK_Shift_L:{ key = WM_Key_Shift; }break; - case XK_Shift_R:{ key = WM_Key_Shift; is_right_sided = 1;}break; - case XK_Control_L:{ key = WM_Key_Ctrl; }break; - case XK_Control_R:{ key = WM_Key_Ctrl; is_right_sided = 1;}break; - case '-':{key = WM_Key_Minus;}break; - case '=':{key = WM_Key_Equal;}break; - case '[':{key = WM_Key_LeftBracket;}break; - case ']':{key = WM_Key_RightBracket;}break; - case ';':{key = WM_Key_Semicolon;}break; - case '\'':{key = WM_Key_Quote;}break; - case '.':{key = WM_Key_Period;}break; - case ',':{key = WM_Key_Comma;}break; - case '/':{key = WM_Key_Slash;}break; - case '\\':{key = WM_Key_BackSlash;}break; - case '\t':{key = WM_Key_Tab;}break; - case 'a':case 'A':{key = WM_Key_A;}break; - case 'b':case 'B':{key = WM_Key_B;}break; - case 'c':case 'C':{key = WM_Key_C;}break; - case 'd':case 'D':{key = WM_Key_D;}break; - case 'e':case 'E':{key = WM_Key_E;}break; - case 'f':case 'F':{key = WM_Key_F;}break; - case 'g':case 'G':{key = WM_Key_G;}break; - case 'h':case 'H':{key = WM_Key_H;}break; - case 'i':case 'I':{key = WM_Key_I;}break; - case 'j':case 'J':{key = WM_Key_J;}break; - case 'k':case 'K':{key = WM_Key_K;}break; - case 'l':case 'L':{key = WM_Key_L;}break; - case 'm':case 'M':{key = WM_Key_M;}break; - case 'n':case 'N':{key = WM_Key_N;}break; - case 'o':case 'O':{key = WM_Key_O;}break; - case 'p':case 'P':{key = WM_Key_P;}break; - case 'q':case 'Q':{key = WM_Key_Q;}break; - case 'r':case 'R':{key = WM_Key_R;}break; - case 's':case 'S':{key = WM_Key_S;}break; - case 't':case 'T':{key = WM_Key_T;}break; - case 'u':case 'U':{key = WM_Key_U;}break; - case 'v':case 'V':{key = WM_Key_V;}break; - case 'w':case 'W':{key = WM_Key_W;}break; - case 'x':case 'X':{key = WM_Key_X;}break; - case 'y':case 'Y':{key = WM_Key_Y;}break; - case 'z':case 'Z':{key = WM_Key_Z;}break; - case ' ':{key = WM_Key_Space;}break; - } - - // rjf: push text event - if(evt.type == KeyPress && text_size != 0) - { - for(U64 off = 0; off < text_size;) - { - UnicodeDecode decode = utf8_decode(text+off, text_size-off); - if(decode.codepoint != 0 && (decode.codepoint >= 32 || decode.codepoint == '\t')) + default: { - WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Text); - e->window.u64[0] = (U64)window; - e->character = decode.codepoint; - } - if(decode.inc == 0) - { - break; - } - off += decode.inc; + if(0){} + else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (WM_Key)(WM_Key_F1 + (keysym - XK_F1)); } + else if('0' <= keysym && keysym <= '9') { key = WM_Key_0 + (keysym-'0'); } + }break; + case XK_Escape:{key = WM_Key_Esc;};break; + case XK_BackSpace:{key = WM_Key_Backspace;}break; + case XK_Delete:{key = WM_Key_Delete;}break; + case XK_Return:{key = WM_Key_Return;}break; + case XK_Pause:{key = WM_Key_Pause;}break; + case XK_Tab:{key = WM_Key_Tab;}break; + case XK_Left:{key = WM_Key_Left;}break; + case XK_Right:{key = WM_Key_Right;}break; + case XK_Up:{key = WM_Key_Up;}break; + case XK_Down:{key = WM_Key_Down;}break; + case XK_Home:{key = WM_Key_Home;}break; + case XK_End:{key = WM_Key_End;}break; + case XK_Page_Up:{key = WM_Key_PageUp;}break; + case XK_Page_Down:{key = WM_Key_PageDown;}break; + case XK_Alt_L:{ key = WM_Key_Alt; }break; + case XK_Alt_R:{ key = WM_Key_Alt; is_right_sided = 1;}break; + case XK_Shift_L:{ key = WM_Key_Shift; }break; + case XK_Shift_R:{ key = WM_Key_Shift; is_right_sided = 1;}break; + case XK_Control_L:{ key = WM_Key_Ctrl; }break; + case XK_Control_R:{ key = WM_Key_Ctrl; is_right_sided = 1;}break; + case '-':{key = WM_Key_Minus;}break; + case '=':{key = WM_Key_Equal;}break; + case '[':{key = WM_Key_LeftBracket;}break; + case ']':{key = WM_Key_RightBracket;}break; + case ';':{key = WM_Key_Semicolon;}break; + case '\'':{key = WM_Key_Quote;}break; + case '.':{key = WM_Key_Period;}break; + case ',':{key = WM_Key_Comma;}break; + case '/':{key = WM_Key_Slash;}break; + case '\\':{key = WM_Key_BackSlash;}break; + case '\t':{key = WM_Key_Tab;}break; + case 'a':case 'A':{key = WM_Key_A;}break; + case 'b':case 'B':{key = WM_Key_B;}break; + case 'c':case 'C':{key = WM_Key_C;}break; + case 'd':case 'D':{key = WM_Key_D;}break; + case 'e':case 'E':{key = WM_Key_E;}break; + case 'f':case 'F':{key = WM_Key_F;}break; + case 'g':case 'G':{key = WM_Key_G;}break; + case 'h':case 'H':{key = WM_Key_H;}break; + case 'i':case 'I':{key = WM_Key_I;}break; + case 'j':case 'J':{key = WM_Key_J;}break; + case 'k':case 'K':{key = WM_Key_K;}break; + case 'l':case 'L':{key = WM_Key_L;}break; + case 'm':case 'M':{key = WM_Key_M;}break; + case 'n':case 'N':{key = WM_Key_N;}break; + case 'o':case 'O':{key = WM_Key_O;}break; + case 'p':case 'P':{key = WM_Key_P;}break; + case 'q':case 'Q':{key = WM_Key_Q;}break; + case 'r':case 'R':{key = WM_Key_R;}break; + case 's':case 'S':{key = WM_Key_S;}break; + case 't':case 'T':{key = WM_Key_T;}break; + case 'u':case 'U':{key = WM_Key_U;}break; + case 'v':case 'V':{key = WM_Key_V;}break; + case 'w':case 'W':{key = WM_Key_W;}break; + case 'x':case 'X':{key = WM_Key_X;}break; + case 'y':case 'Y':{key = WM_Key_Y;}break; + case 'z':case 'Z':{key = WM_Key_Z;}break; + case ' ':{key = WM_Key_Space;}break; } - } + + // rjf: push text event + if(evt.type == KeyPress && text_size != 0) + { + for(U64 off = 0; off < text_size;) + { + UnicodeDecode decode = utf8_decode(text+off, text_size-off); + if(decode.codepoint != 0 && (decode.codepoint >= 32 || decode.codepoint == '\t')) + { + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Text); + e->window.u64[0] = (U64)window; + e->character = decode.codepoint; + } + if(decode.inc == 0) + { + break; + } + off += decode.inc; + } + } + + // rjf: push key event + { + WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == KeyPress ? WM_EventKind_Press : WM_EventKind_Release); + e->window.u64[0] = (U64)window; + e->modifiers = modifiers; + e->key = key; + e->right_sided = is_right_sided; + } + }break; - // rjf: push key event + //- rjf: mouse button presses/releases + case ButtonPress: + case ButtonRelease: { - WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == KeyPress ? WM_EventKind_Press : WM_EventKind_Release); - e->window.u64[0] = (U64)window; - e->modifiers = modifiers; - e->key = key; - e->right_sided = is_right_sided; - } - }break; - - //- rjf: mouse button presses/releases - case ButtonPress: - case ButtonRelease: - { - // rjf: determine flags - WM_Modifiers modifiers = 0; - if(evt.xbutton.state & ShiftMask) { modifiers |= WM_Modifier_Shift; } - if(evt.xbutton.state & ControlMask) { modifiers |= WM_Modifier_Ctrl; } - if(evt.xbutton.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; } + // rjf: determine flags + WM_Modifiers modifiers = 0; + if(evt.xbutton.state & ShiftMask) { modifiers |= WM_Modifier_Shift; } + if(evt.xbutton.state & ControlMask) { modifiers |= WM_Modifier_Ctrl; } + if(evt.xbutton.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; } + + // rjf: map button -> WM_Key + WM_Key key = WM_Key_Null; + switch(evt.xbutton.button) + { + default:{}break; + case Button1:{key = WM_Key_LeftMouseButton;}break; + case Button2:{key = WM_Key_MiddleMouseButton;}break; + case Button3:{key = WM_Key_RightMouseButton;}break; + } + + // rjf: push event + LNX_WM_Window *window = lnx_window_from_x11window(evt.xbutton.window); + if(key != WM_Key_Null) + { + WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == ButtonPress ? WM_EventKind_Press : WM_EventKind_Release); + e->window.u64[0] = (U64)window; + e->modifiers = modifiers; + e->key = key; + e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y); + } + else if(evt.xbutton.button == Button4 || + evt.xbutton.button == Button5) + { + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Scroll); + e->window.u64[0] = (U64)window; + e->modifiers = modifiers; + e->delta = v2f32(0, evt.xbutton.button == Button4 ? -1.f : +1.f); + e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y); + } + }break; - // rjf: map button -> WM_Key - WM_Key key = WM_Key_Null; - switch(evt.xbutton.button) - { - default:{}break; - case Button1:{key = WM_Key_LeftMouseButton;}break; - case Button2:{key = WM_Key_MiddleMouseButton;}break; - case Button3:{key = WM_Key_RightMouseButton;}break; - } - - // rjf: push event - LNX_WM_Window *window = lnx_window_from_x11window(evt.xbutton.window); - if(key != WM_Key_Null) - { - WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == ButtonPress ? WM_EventKind_Press : WM_EventKind_Release); - e->window.u64[0] = (U64)window; - e->modifiers = modifiers; - e->key = key; - e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y); - } - else if(evt.xbutton.button == Button4 || - evt.xbutton.button == Button5) - { - WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Scroll); - e->window.u64[0] = (U64)window; - e->modifiers = modifiers; - e->delta = v2f32(0, evt.xbutton.button == Button4 ? -1.f : +1.f); - e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y); - } - }break; - - //- rjf: mouse motion - case MotionNotify: - { - LNX_WM_Window *window = lnx_window_from_x11window(evt.xclient.window); - WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_MouseMove); - e->window.u64[0] = (U64)window; - e->pos.x = (F32)evt.xmotion.x; - e->pos.y = (F32)evt.xmotion.y; - set_mouse_cursor = 1; - }break; - - //- rjf: window focus/unfocus - case FocusIn: - { - }break; - case FocusOut: - { - LNX_WM_Window *window = lnx_window_from_x11window(evt.xfocus.window); - WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowLoseFocus); - e->window.u64[0] = (U64)window; - }break; - - //- rjf: client messages - case ClientMessage: - { - if((Atom)evt.xclient.data.l[0] == lnx_wm_state->wm_delete_window_atom) + //- rjf: mouse motion + case MotionNotify: { LNX_WM_Window *window = lnx_window_from_x11window(evt.xclient.window); - WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowClose); + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_MouseMove); e->window.u64[0] = (U64)window; - } - else if((Atom)evt.xclient.data.l[0] == lnx_wm_state->wm_sync_request_atom) + e->pos.x = (F32)evt.xmotion.x; + e->pos.y = (F32)evt.xmotion.y; + set_mouse_cursor = 1; + }break; + + //- rjf: window focus/unfocus + case FocusIn: { - LNX_WM_Window *window = lnx_window_from_x11window(evt.xclient.window); - if(window != 0) + }break; + case FocusOut: + { + LNX_WM_Window *window = lnx_window_from_x11window(evt.xfocus.window); + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowLoseFocus); + e->window.u64[0] = (U64)window; + }break; + + //- rjf: client messages + case ClientMessage: + { + if((Atom)evt.xclient.data.l[0] == lnx_wm_state->wm_delete_window_atom) { - window->counter_value = 0; - window->counter_value |= evt.xclient.data.l[2]; - window->counter_value |= (evt.xclient.data.l[3] << 32); - XSyncValue value; - XSyncIntToValue(&value, window->counter_value); - XSyncSetCounter(lnx_wm_state->display, window->counter_xid, value); + LNX_WM_Window *window = lnx_window_from_x11window(evt.xclient.window); + WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowClose); + e->window.u64[0] = (U64)window; } - } - }break; + else if((Atom)evt.xclient.data.l[0] == lnx_wm_state->wm_sync_request_atom) + { + LNX_WM_Window *window = lnx_window_from_x11window(evt.xclient.window); + if(window != 0) + { + window->counter_value = 0; + window->counter_value |= evt.xclient.data.l[2]; + window->counter_value |= (evt.xclient.data.l[3] << 32); + XSyncValue value; + XSyncIntToValue(&value, window->counter_value); + XSyncSetCounter(lnx_wm_state->display, window->counter_xid, value); + } + } + }break; } if(set_mouse_cursor) @@ -716,7 +716,7 @@ wm_mouse_from_window(WM_Window handle) } //////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) +//~ rjf: @per_os_impl Cursors (Implemented Per-OS) internal void wm_set_cursor(WM_Cursor cursor) @@ -725,7 +725,7 @@ wm_set_cursor(WM_Cursor cursor) } //////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) +//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS) internal void wm_graphical_message(B32 error, String8 title, String8 message) @@ -745,7 +745,7 @@ wm_graphical_pick_file(Arena *arena, String8 initial_path) } //////////////////////////////// -//~ rjf: @os_hooks Shell Operations +//~ rjf: @per_os_impl Shell Operations internal void wm_show_in_filesystem_ui(String8 path) diff --git a/src/metagen/metagen_main.c b/src/metagen/metagen_main.c index 52393377..198a3409 100644 --- a/src/metagen/metagen_main.c +++ b/src/metagen/metagen_main.c @@ -220,7 +220,24 @@ entry_point(CmdLine *cmdline) MD_Node *file = n->v.root; for MD_EachNode(node, file->first) { + // rjf: @enum tags -> generate strings from table generators MD_Node *tag = md_tag_from_string(node, str8_lit("enum"), 0); + String8List gen_strings = {0}; + if(!md_node_is_nil(tag)) + { + gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + } + + // rjf: @table_enum tags -> generate strings from 'name' column from table + if(md_node_is_nil(tag)) + { + tag = md_tag_from_string(node, str8_lit("table_enum"), 0); + String8 gen_string = str8f(mg_arena, "{ expand(%S a) `$(a.name) = $(a.code)` }", node->string); + MD_Node *gen_node = md_tree_from_string(mg_arena, gen_string); + gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); + } + + // rjf: generate if(!md_node_is_nil(tag)) { String8 enum_name = node->string; @@ -232,7 +249,6 @@ entry_point(CmdLine *cmdline) String8 enum_base_type_name = tag->first->string; String8 layer_key = mg_layer_key_from_path(file->string); MG_Layer *layer = mg_layer_from_key(layer_key); - String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(""), node); if(enum_base_type_name.size == 0) { str8_list_pushf(mg_arena, &layer->enums, "typedef enum %S\n{\n", enum_name); diff --git a/src/pe/x64/unwind/pe_x64_unwind.c b/src/pe/x64/unwind/pe_x64_unwind.c new file mode 100644 index 00000000..2db6604b --- /dev/null +++ b/src/pe/x64/unwind/pe_x64_unwind.c @@ -0,0 +1,936 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Helpers + +internal PE_IntelPdata * +pe_x64_uwnd_intel_pdata_from_voff(PE_X64_UWND_ModuleUnwindInfo *unwind_info, U64 voff) +{ + PE_IntelPdata *first_pdata = 0; + { + PE_IntelPdata *pdatas = unwind_info->pdatas; + U64 pdatas_count = unwind_info->pdatas_count; + if(pdatas_count != 0 && voff >= pdatas[0].voff_first) + { + // NOTE(rjf): + // + // binary search: + // find max index s.t. pdata_array[index].voff_first <= voff + // we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first) + // + U64 index = pdatas_count; + U64 min = 0; + U64 opl = pdatas_count; + for(;;) + { + U64 mid = (min + opl)/2; + PE_IntelPdata *pdata = pdatas + mid; + if(voff < pdata->voff_first) + { + opl = mid; + } + else if(pdata->voff_first < voff) + { + min = mid; + } + else + { + index = mid; + break; + } + if(min + 1 >= opl) + { + index = min; + break; + } + } + + // rjf: if we are in range fill result + { + PE_IntelPdata *pdata = pdatas + index; + if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last) + { + first_pdata = pdata; + } + } + } + } + return first_pdata; +} + +internal X64_RegCode +pe_x64_uwnd_reg_code_from_pe_gpr_reg(PE_UnwindGprRegX64 gpr_reg) +{ + X64_RegCode result = X64_RegCode_nil; + switch(gpr_reg) + { + case PE_UnwindGprRegX64_RAX:{result = X64_RegCode_rax;}break; + case PE_UnwindGprRegX64_RCX:{result = X64_RegCode_rcx;}break; + case PE_UnwindGprRegX64_RDX:{result = X64_RegCode_rdx;}break; + case PE_UnwindGprRegX64_RBX:{result = X64_RegCode_rbx;}break; + case PE_UnwindGprRegX64_RSP:{result = X64_RegCode_rsp;}break; + case PE_UnwindGprRegX64_RBP:{result = X64_RegCode_rbp;}break; + case PE_UnwindGprRegX64_RSI:{result = X64_RegCode_rsi;}break; + case PE_UnwindGprRegX64_RDI:{result = X64_RegCode_rdi;}break; + case PE_UnwindGprRegX64_R8 :{result = X64_RegCode_r8;}break; + case PE_UnwindGprRegX64_R9 :{result = X64_RegCode_r9;}break; + case PE_UnwindGprRegX64_R10:{result = X64_RegCode_r10;}break; + case PE_UnwindGprRegX64_R11:{result = X64_RegCode_r11;}break; + case PE_UnwindGprRegX64_R12:{result = X64_RegCode_r12;}break; + case PE_UnwindGprRegX64_R13:{result = X64_RegCode_r13;}break; + case PE_UnwindGprRegX64_R14:{result = X64_RegCode_r14;}break; + case PE_UnwindGprRegX64_R15:{result = X64_RegCode_r15;}break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Unwinding Abstraction Implementation + +internal UWND_StepResult +pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 tls_vaddr, void *regs_opaque, U64 *cfa_out) +{ + UWND_StepResult result = {UWND_StepStatus_Error}; + PE_X64_UWND_ModuleUnwindInfo *unwind_info = (PE_X64_UWND_ModuleUnwindInfo *)module_info->unwind_info; + X64_RegBlock *regs = (X64_RegBlock *)regs_opaque; + if(unwind_info != 0) + { + B32 done = 0; + Temp scratch = scratch_begin(0, 0); + X64_RegBlock *new_regs = push_array(scratch.arena, X64_RegBlock, 1); + MemoryCopyStruct(new_regs, regs); + + //////////////////////////// + //- rjf: on PE/x64, the frame base address is always RSP + // + cfa_out[0] = new_regs->rsp; + + //////////////////////////// + //- rjf: unpack context from rip + // + U64 rip_voff = new_regs->rip - module_info->base_vaddr; + PE_IntelPdata *first_pdata = pe_x64_uwnd_intel_pdata_from_voff(unwind_info, rip_voff); + + //////////////////////////// + //- rjf: pdata -> detect if in epilog + // + B32 has_pdata_and_in_epilog = 0; + U64 instruction_data_size_cap = 256; + Rng1U64 instruction_data_vaddr_range = r1u64(new_regs->rip, new_regs->rip+instruction_data_size_cap); + String8 instruction_data = {0}; + if(!done && first_pdata) + { + // NOTE(allen): There are restrictions placed on how an epilog is allowed + // to be formed (https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-160) + // Here we interpret machine code directly according to the rules + // given there to determine if the code we're looking at looks like an epilog. + + //- rjf: read instruction memory + U8 *instruction_data_buffer = push_array(scratch.arena, U8, instruction_data_size_cap); + U64 instruction_data_size = memory_map_read(memory_map, instruction_data_vaddr_range, instruction_data_buffer); + instruction_data = str8(instruction_data_buffer, instruction_data_size); + if(instruction_data.size == 0) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = instruction_data_vaddr_range; + } + + //- rjf: set up parsing state + B32 is_epilog = 0; + + //- rjf: check first instruction, determine if we should keep parsing & from where + U64 read_off = 0; + B32 keep_parsing = 0; + if(!done && instruction_data.size >= 4) + { + U8 inst[4] = {0}; + str8_deserial_read(instruction_data, read_off, &inst[0], sizeof(inst), sizeof(inst)); + keep_parsing = 1; + if((inst[0] & 0xF8) == 0x48) + { + switch(inst[1]) + { + // rjf: add $nnnn,%rsp + case 0x81: + { + if(inst[0] == 0x48 && inst[2] == 0xC4) + { + read_off += 7; + } + else + { + keep_parsing = 0; + } + }break; + + // rjf: add $n,%rsp + case 0x83: + { + if(inst[0] == 0x48 && inst[2] == 0xC4) + { + read_off += 4; + } + else + { + keep_parsing = 0; + } + }break; + + // rjf: lea n(reg),%rsp + case 0x8D: + { + if((inst[0] & 0x06) == 0 && + ((inst[2] >> 3) & 0x07) == 0x04 && + (inst[2] & 0x07) != 0x04) + { + U8 imm_size = (inst[2] >> 6); + + // rjf: 1-byte immediate + if(imm_size == 1) + { + read_off += 4; + } + + // rjf: 4-byte immediate + else if(imm_size == 2) + { + read_off += 7; + } + + // rjf: other case + else + { + keep_parsing = 0; + } + } + else + { + keep_parsing = 0; + } + }break; + } + } + } + + //- rjf: continue parsing instructions + for(;!done && keep_parsing;) + { + // rjf: read next instruction byte + B32 inst_byte_good = 1; + U8 inst_byte = 0; + if(str8_deserial_read_struct(instruction_data, read_off, &inst_byte) == 0) + { + inst_byte_good = 0; + keep_parsing = 0; + } + read_off += 1; + + // rjf: when (... I don't know ...) rely on the next byte + B32 check_inst_byte_good = inst_byte_good; + U8 check_inst_byte = inst_byte; + if(inst_byte_good && (inst_byte & 0xF0) == 0x40) + { + if(str8_deserial_read_struct(instruction_data, read_off, &check_inst_byte) == 0) + { + check_inst_byte_good = 0; + keep_parsing = 0; + } + read_off += 1; + } + + // rjf: check instruction byte + if(check_inst_byte_good) + { + switch(check_inst_byte) + { + default:{keep_parsing = 0;}break; + + // rjf: pop + case 0x58:case 0x59:case 0x5A:case 0x5B: + case 0x5C:case 0x5D:case 0x5E:case 0x5F: + { + }break; + + // rjf: ret + case 0xC2: + case 0xC3: + { + is_epilog = 1; + keep_parsing = 0; + }break; + + // rjf: jmp nnnn + case 0xE9: + { + // + // TODO(rjf): old code here was reading the jump's immediate value, applying the delta, + // and continued parsing if the jump destination address fell within the same pdata. + // but from what I can tell, the only legal usage of a jump within an epilog is to end + // the epilog, and jump to another function; if the jump stays in the function, it is + // an illegal epilog sequence. so, I've instead just changed this to treat any jmps + // which escape the pdata, and also end the pdata, as marking the epilog. + // + // I am not sure if this is correct w.r.t. chained pdatas, however, since presumably + // a jump could also land elsewhere in the same function - we may need to also look for + // stack pointer modifications etc. - those together with a jump in this context may + // let us tell the difference. + // + S32 imm = 0; + B32 imm_good = (str8_deserial_read_struct(instruction_data, read_off, &imm) == sizeof(imm)); + U64 next_vaddr = (instruction_data_vaddr_range.min + read_off + sizeof(imm) + imm); + U64 next_voff = (next_vaddr - module_info->base_vaddr); + if((next_voff < first_pdata->voff_first || first_pdata->voff_one_past_last <= next_voff) && + read_off + sizeof(imm) == first_pdata->voff_one_past_last) + { + is_epilog = 1; + } + keep_parsing = 0; + }break; + + // rjf: rep; ret (for amd64 prediction bug) + case 0xF3: + { + U8 next_inst_byte = 0; + B32 next_inst_byte_good = (str8_deserial_read_struct(instruction_data, read_off, &next_inst_byte) == sizeof(next_inst_byte)); + read_off += 1; + keep_parsing = 0; + if(next_inst_byte_good) + { + is_epilog = (next_inst_byte == 0xC3); + } + }break; + } + } + } + has_pdata_and_in_epilog = is_epilog; + } + + //////////////////////////// + //- rjf: pdata & in epilog -> epilog unwind + // + if(!done && first_pdata && has_pdata_and_in_epilog) + { + U64 read_off = 0; + for(B32 keep_parsing = 1; !done && keep_parsing;) + { + //- rjf: assume no more parsing after this instruction + keep_parsing = 0; + + //- rjf: read next instruction byte + U8 inst_byte = 0; + if(str8_deserial_read_struct(instruction_data, read_off, &inst_byte) == 0) + { + done = 1; + } + read_off += 1; + + //- rjf: extract rex from instruction byte + U8 rex = 0; + if((inst_byte & 0xF0) == 0x40) + { + rex = inst_byte & 0xF; // rex prefix + if(str8_deserial_read_struct(instruction_data, read_off, &inst_byte) == 0) + { + done = 1; + } + read_off += 1; + } + + //- rjf: parse remainder of instruction + switch(inst_byte) + { + // rjf: pop + case 0x58:case 0x59:case 0x5A:case 0x5B: + case 0x5C:case 0x5D:case 0x5E:case 0x5F: + { + // rjf: read value at rsp + U64 sp = new_regs->rsp; + U64 value = 0; + if(memory_map_read_struct(memory_map, sp, &value) != sizeof(value)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(sp, sp+sizeof(value)); + } + + // rjf: modify registers + if(!done) + { + PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; + X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); + Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; + U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); + reg_ptr[0] = value; + new_regs->rsp = sp + 8; + } + + // rjf: not a final instruction, so keep parsing + keep_parsing = 1; + }break; + + // rjf: add $nnnn,%rsp + case 0x81: + { + // rjf: skip one byte (we already know what it is in this scenario) + read_off += 1; + + // rjf: read the 4-byte immediate + S32 imm = 0; + B32 imm_is_good = (str8_deserial_read_struct(instruction_data, read_off, &imm) == sizeof(imm)); + if(!imm_is_good) + { + done = 1; + } + read_off += sizeof(imm); + + // rjf: update stack pointer + new_regs->rsp = (U64)(new_regs->rsp + imm); + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: add $n,%rsp + case 0x83: + { + // rjf: skip one byte (we already know what it is in this scenario) + read_off += 1; + + // rjf: read the 1-byte immediate + S8 imm = 0; + B32 imm_is_good = (str8_deserial_read_struct(instruction_data, read_off, &imm) == sizeof(imm)); + if(!imm_is_good) + { + done = 1; + } + read_off += sizeof(imm); + + // rjf: update stack pointer + new_regs->rsp = (U64)(new_regs->rsp + imm); + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: lea imm8/imm32,$rsp + case 0x8D: + { + // rjf: read source register + U8 modrm = 0; + B32 modrm_is_good = (str8_deserial_read_struct(instruction_data, read_off, &modrm) == sizeof(modrm)); + if(!modrm_is_good) + { + done = 1; + } + read_off += 1; + + // rjf: unpack register value + PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; + X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); + Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; + U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); + U64 reg_value = reg_ptr[0]; + + // rjf: read immediate + S32 imm = 0; + if(!done) + { + // rjf: read 1-byte immediate + if((modrm >> 6) == 1) + { + S8 imm8 = 0; + B32 imm8_is_good = (str8_deserial_read_struct(instruction_data, read_off, &imm8) == sizeof(imm8)); + if(!imm8_is_good) + { + done = 1; + } + read_off += 1; + imm = (S32)imm8; + } + + // rjf: read 4-byte immediate + else + { + B32 imm32_is_good = (str8_deserial_read_struct(instruction_data, read_off, &imm) == sizeof(imm)); + done = !imm32_is_good; + read_off += sizeof(imm); + } + } + + // rjf: update stack pointer + if(!done) + { + new_regs->rsp = (U64)(reg_value + imm); + } + + // rjf: not a final instruction; keep parsing + keep_parsing = 1; + }break; + + // rjf: ret $nn + case 0xC2: + { + // rjf: read new ip + U64 sp = new_regs->rsp; + U64 new_ip = 0; + if(memory_map_read_struct(memory_map, sp, &new_ip) != sizeof(new_ip)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(sp, sp+sizeof(new_ip)); + } + + // rjf: read 2-byte immediate & advance stack pointer + U16 imm = 0; + if(!done) + { + done = (str8_deserial_read_struct(instruction_data, read_off, &imm) < sizeof(imm)); + } + U64 new_sp = sp + 8 + imm; + + // rjf: commit registers + if(!done) + { + new_regs->rip = new_ip; + new_regs->rsp = new_sp; + } + }break; + + // rjf: ret / rep; ret + case 0xF3: + { + // Assert(!"Hit me!"); + }break; + case 0xC3: + { + // rjf: read new ip + U64 sp = new_regs->rsp; + U64 new_ip = 0; + if(memory_map_read_struct(memory_map, sp, &new_ip) != sizeof(new_ip)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(sp, sp+sizeof(new_ip)); + } + + // rjf: advance stack pointer + U64 new_sp = sp + 8; + + // rjf: commit registers + if(!done) + { + new_regs->rip = new_ip; + new_regs->rsp = new_sp; + } + }break; + + // rjf: jmp nnnn + case 0xE9: + { + // Assert(!"Hit Me"); + // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done + // we don't have any cases to exercise this right now. no guess implementation! + }break; + + // rjf: Sjmp n + case 0xEB: + { + // Assert(!"Hit Me"); + // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done + // we don't have any cases to exercise this right now. no guess implementation! + }break; + } + } + } + + ////////////////////////////// + //- rjf: pdata & not in epilog -> xdata unwind + // + B32 xdata_unwind_did_machframe = 0; + if(!done && first_pdata && !has_pdata_and_in_epilog) + { + //- rjf: get frame reg + B32 bad_frame_reg_info = 0; + X64_RegCode frame_reg_code = X64_RegCode_rsp; + U64 frame_off = 0; + { + // rjf: read unwind info header + U64 unwind_info_off = first_pdata->voff_unwind_info; + PE_UnwindInfo unwind_info = {0}; + if(memory_map_read_struct(memory_map, module_info->base_vaddr+unwind_info_off, &unwind_info) != sizeof(unwind_info)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(module_info->base_vaddr+unwind_info_off, module_info->base_vaddr+unwind_info_off+sizeof(unwind_info));; + } + + // rjf: unpack header + U32 frame_reg_id = PE_UNWIND_INFO_REG_FROM_FRAME(unwind_info.frame); + U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info.frame); + if(frame_reg_id != 0) + { + frame_reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(frame_reg_id); + bad_frame_reg_info = (frame_reg_code == X64_RegCode_nil); // NOTE(rjf): frame_reg should never be 0 at this point, in valid exe + } + frame_off = frame_off_val; + } + + //- rjf: iterate pdatas, apply opcodes + PE_IntelPdata *last_pdata = 0; + PE_IntelPdata *pdata = first_pdata; + if(!done && !bad_frame_reg_info) for(B32 keep_parsing = 1; !done && keep_parsing && pdata != last_pdata;) + { + //- rjf: read unwind info + U64 unwind_info_off = pdata->voff_unwind_info; + PE_UnwindInfo unwind_info = {0}; + if(memory_map_read_struct(memory_map, module_info->base_vaddr+unwind_info_off, &unwind_info) != sizeof(unwind_info)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(module_info->base_vaddr+unwind_info_off, module_info->base_vaddr+unwind_info_off+sizeof(unwind_info));; + } + + //- rjf: read unwind codes + PE_UnwindCode *unwind_codes = push_array(scratch.arena, PE_UnwindCode, unwind_info.codes_num); + Rng1U64 unwind_codes_vaddr_range = r1u64(module_info->base_vaddr+unwind_info_off+sizeof(unwind_info), + module_info->base_vaddr+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num); + if(memory_map_read(memory_map, unwind_codes_vaddr_range, unwind_codes) != dim_1u64(unwind_codes_vaddr_range)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = unwind_codes_vaddr_range;; + } + + //- rjf: unpack frame base + U64 frame_base = new_regs->rsp; + if(frame_reg_code != X64_RegCode_nil) + { + Rng1U16 frame_reg_rng = x64_reg_code_rng_table[frame_reg_code]; + U64 raw_frame_base = *(U64 *)((U8 *)regs + frame_reg_rng.min); + U64 adjusted_frame_base = raw_frame_base - frame_off*16; + frame_base = adjusted_frame_base; + } + + //- rjf: apply opcodes + PE_UnwindCode *code_ptr = unwind_codes; + PE_UnwindCode *code_opl = unwind_codes + unwind_info.codes_num; + for(PE_UnwindCode *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr) + { + // rjf: unpack opcode info + U32 op_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr->flags); + U32 op_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr->flags); + U32 slot_count = pe_slot_count_from_unwind_op_code(op_code); + if(op_code == PE_UnwindOpCode_ALLOC_LARGE && op_info == 1) + { + slot_count += 1; + } + + // rjf: detect bad slot counts + if(slot_count == 0 || code_ptr+slot_count > code_opl) + { + keep_parsing = 0; + done = 1; + break; + } + + // rjf: set next op code pointer + next_code_ptr = code_ptr + slot_count; + + // rjf: interpret this op code + U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog; + if(code_voff <= rip_voff) + { + switch(op_code) + { + case PE_UnwindOpCode_PUSH_NONVOL: + { + // rjf: read value from stack pointer + U64 rsp = new_regs->rsp; + U64 value = 0; + if(memory_map_read_struct(memory_map, rsp, &value) != sizeof(value)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(rsp, rsp+sizeof(value)); + } + + // rjf: commit registers + if(!done) + { + X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); + Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; + *(U64 *)((U8 *)regs + reg_rng.min) = value; + new_regs->rsp = rsp + 8; + } + }break; + + case PE_UnwindOpCode_ALLOC_LARGE: + { + // rjf: read alloc size + U64 size = 0; + if(op_info == 0) + { + size = code_ptr[1].u16*8; + } + else if(op_info == 1) + { + size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + } + else + { + done = 1; + } + + // rjf: advance stack pointer + if(!done) + { + new_regs->rsp += size; + } + }break; + + case PE_UnwindOpCode_ALLOC_SMALL: + { + // rjf: advance stack pointer + new_regs->rsp += op_info*8 + 8; + }break; + + case PE_UnwindOpCode_SET_FPREG: + { + // rjf: put stack pointer back to the frame base + new_regs->rsp = frame_base; + }break; + + case PE_UnwindOpCode_SAVE_NONVOL: + { + // rjf: read value from frame base + U64 off = code_ptr[1].u16*8; + U64 addr = frame_base + off; + U64 value = 0; + if(memory_map_read_struct(memory_map, addr, &value) != sizeof(value)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(addr, addr+sizeof(value)); + } + + // rjf: commit to register + if(!done) + { + X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); + Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; + *(U64 *)((U8 *)regs + reg_rng.min) = value; + } + }break; + + case PE_UnwindOpCode_SAVE_NONVOL_FAR: + { + // rjf: read value from frame base + U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + U64 addr = frame_base + off; + U64 value = 0; + if(memory_map_read_struct(memory_map, addr, &value) != sizeof(value)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(addr, addr+sizeof(value)); + } + + // rjf: commit to register + if(!done) + { + X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); + Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; + *(U64 *)((U8 *)regs + reg_rng.min) = value; + } + }break; + + case PE_UnwindOpCode_EPILOG: + { + keep_parsing = 1; + }break; + + case PE_UnwindOpCode_SPARE_CODE: + { + // TODO(rjf): ??? + keep_parsing = 0; + done = 1; + }break; + + case PE_UnwindOpCode_SAVE_XMM128: + { + // rjf: read new register values + U8 buf[16]; + U64 off = code_ptr[1].u16*16; + U64 addr = frame_base + off; + Rng1U64 read_vaddr_range = r1u64(addr, addr+sizeof(buf)); + if(memory_map_read(memory_map, read_vaddr_range, buf) != sizeof(buf)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = read_vaddr_range; + } + + // rjf: commit to register + if(!done) + { + void *xmm_reg = (&new_regs->zmm0) + op_info; + MemoryCopy(xmm_reg, buf, sizeof(buf)); + } + }break; + + case PE_UnwindOpCode_SAVE_XMM128_FAR: + { + // rjf: read new register values + U8 buf[16]; + U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); + U64 addr = frame_base + off; + Rng1U64 read_vaddr_range = r1u64(addr, addr+sizeof(buf)); + if(memory_map_read(memory_map, read_vaddr_range, buf) != sizeof(buf)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = read_vaddr_range; + } + + // rjf: commit to register + if(!done) + { + void *xmm_reg = (&new_regs->zmm0) + op_info; + MemoryCopy(xmm_reg, buf, sizeof(buf)); + } + }break; + + case PE_UnwindOpCode_PUSH_MACHFRAME: + { + // NOTE(rjf): this was found by stepping through kernel code after an exception was + // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main + if(op_info > 1) + { + done = 1; + } + + // rjf: unpack stack pointer + U64 sp_og = new_regs->rsp; + U64 sp_adj = sp_og; + if(op_info == 1) + { + sp_adj += 8; + } + U64 sp_after_ip = sp_adj + 8; + U64 sp_after_ss = sp_after_ip + 8; + U64 sp_after_rflags = sp_after_ss + 8; + + // rjf: read new ip value + U64 ip_value = 0; + if(!done && memory_map_read_struct(memory_map, sp_adj, &ip_value) != sizeof(ip_value)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(sp_adj, sp_adj + sizeof(ip_value)); + } + + // rjf: read new ss value + U16 ss_value = 0; + if(!done && memory_map_read_struct(memory_map, sp_after_ip, &ss_value) != sizeof(ss_value)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(sp_after_ip, sp_after_ip + sizeof(ss_value)); + } + + // rjf: read new rflags value + U64 rflags_value = 0; + if(!done && memory_map_read_struct(memory_map, sp_after_ss, &rflags_value) != sizeof(rflags_value)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(sp_after_ss, sp_after_ss + sizeof(rflags_value)); + } + + // rjf: read new sp value + U64 sp_value = 0; + if(!done && memory_map_read_struct(memory_map, sp_after_rflags, &sp_value) != sizeof(sp_value)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(sp_after_rflags, sp_after_rflags + sizeof(sp_value)); + } + + // rjf: commit registers + if(!done) + { + new_regs->rip = ip_value; + new_regs->ss = ss_value; + new_regs->rflags = rflags_value; + new_regs->rsp = sp_value; + } + + // rjf: mark machine frame + xdata_unwind_did_machframe = !done; + }break; + } + } + } + + //- rjf: iterate to next pdata + if(keep_parsing) + { + U32 flags = PE_UNWIND_INFO_FLAGS_FROM_HDR(unwind_info.header); + if(!(flags & PE_UnwindInfoFlag_CHAINED)) + { + break; + } + U64 code_count_rounded = AlignPow2(unwind_info.codes_num, sizeof(PE_UnwindCode)); + U64 code_size = code_count_rounded*sizeof(PE_UnwindCode); + U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size; + last_pdata = pdata; + pdata = push_array(scratch.arena, PE_IntelPdata, 1); + if(memory_map_read_struct(memory_map, module_info->base_vaddr+chained_pdata_off, pdata) != sizeof(*pdata)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(module_info->base_vaddr+chained_pdata_off, module_info->base_vaddr+chained_pdata_off+sizeof(*pdata)); + } + } + } + } + + ////////////////////////////// + //- rjf: no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer + // + if(!done && (!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe))) + { + // rjf: read new ip + U64 sp = new_regs->rsp; + U64 new_ip = 0; + if(memory_map_read_struct(memory_map, sp, &new_ip) != sizeof(new_ip)) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = r1u64(sp, sp+sizeof(new_ip)); + } + + // rjf: commit + if(!done) + { + U64 new_sp = sp+8; + new_regs->rip = new_ip; + new_regs->rsp = new_sp; + } + } + + ////////////////////////////// + //- rjf: if not done -> successful step + // + if(!done) + { + result.status = UWND_StepStatus_Good; + MemoryCopyStruct(regs, new_regs); + } + + scratch_end(scratch); + } + return result; +} diff --git a/src/pe/x64/unwind/pe_x64_unwind.h b/src/pe/x64/unwind/pe_x64_unwind.h new file mode 100644 index 00000000..152ba472 --- /dev/null +++ b/src/pe/x64/unwind/pe_x64_unwind.h @@ -0,0 +1,28 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef PE_X64_UNWIND_H +#define PE_X64_UNWIND_H + +//////////////////////////////// +//~ rjf: Module Unwind Info Type + +typedef struct PE_X64_UWND_ModuleUnwindInfo PE_X64_UWND_ModuleUnwindInfo; +struct PE_X64_UWND_ModuleUnwindInfo +{ + PE_IntelPdata *pdatas; + U64 pdatas_count; +}; + +//////////////////////////////// +//~ rjf: Helpers + +internal PE_IntelPdata *pe_x64_uwnd_intel_pdata_from_voff(PE_X64_UWND_ModuleUnwindInfo *unwind_info, U64 voff); +internal X64_RegCode pe_x64_uwnd_reg_code_from_pe_gpr_reg(PE_UnwindGprRegX64 gpr_reg); + +//////////////////////////////// +//~ rjf: Unwinding Abstraction Implementation + +internal UWND_StepResult pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 tls_vaddr, void *regs_opaque, U64 *cfa_out); + +#endif // PE_X64_UNWIND_H diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index edfc12a4..81eba9d5 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -824,7 +824,7 @@ rb_thread_entry_point(void *p) ELF_Bin bin = elf_bin_from_data(scratch.arena, dbg_data); convert_params.arch = arch_from_elf_machine(bin.hdr.e_machine); convert_params.base_vaddr = elf_base_addr_from_bin(&bin); - convert_params.raw = dw_input_from_elf_bin(scratch.arena, dbg_data, &bin); + convert_params.raw = dw_raw_from_elf_bin(scratch.arena, dbg_data, &bin); convert_params.path_style = PathStyle_UnixAbsolute; convert_params.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); scratch_end(scratch); @@ -1442,7 +1442,7 @@ rb_thread_entry_point(void *p) else if(f->format == RB_FileFormat_ELF32 || f->format == RB_FileFormat_ELF64) { - dw = dw_input_from_elf_bin(arena, f->data, &elf); + dw = dw_raw_from_elf_bin(arena, f->data, &elf); } } } @@ -1526,8 +1526,11 @@ rb_thread_entry_point(void *p) { if(lane_idx() == 0) { - str8_list_pushf(arena, &output_blobs, "// %S (%S) (DWARF)\n\n", deterministic ? str8_skip_last_slash(f->path) : f->path, f->format ? rb_file_format_display_name_table[f->format] : str8_lit("Unsupported format")); - String8List dump = dw_dump_list_from_sections(arena, &dw, arch, dw_dump_subset_flags, verbose); + str8_list_pushf(arena, &output_blobs, "\n// %S (%S) (DWARF)\n\n", deterministic ? str8_skip_last_slash(f->path) : f->path, f->format ? rb_file_format_display_name_table[f->format] : str8_lit("Unsupported format")); + } + String8List dump = dw_dump_list_from_raw(arena, &dw, arch, dw_dump_subset_flags); + if(lane_idx() == 0) + { str8_list_concat_in_place(&output_blobs, &dump); } lane_sync(); diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index fd1b2ad1..2ada5f51 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -25,7 +25,13 @@ #include "elf/elf_dump.h" #include "codeview/codeview.h" #include "codeview/codeview_parse.h" -#include "dwarf/dwarf_inc.h" +#include "dwarf/dwarf.h" +#include "dwarf/dwarf_parse_2.h" +#include "dwarf/dwarf_parse_coff.h" +#include "dwarf/dwarf_parse_elf.h" +#include "dwarf/dwarf_dump_2.h" +#include "eh_frame/eh_frame.h" +#include "eh_frame/eh_frame_dump.h" #include "msf/msf.h" #include "msf/msf_parse.h" #include "pdb/pdb.h" @@ -53,7 +59,13 @@ #include "elf/elf_dump.c" #include "codeview/codeview.c" #include "codeview/codeview_parse.c" -#include "dwarf/dwarf_inc.c" +#include "dwarf/dwarf.c" +#include "dwarf/dwarf_parse_2.c" +#include "dwarf/dwarf_parse_coff.c" +#include "dwarf/dwarf_parse_elf.c" +#include "dwarf/dwarf_dump_2.c" +#include "eh_frame/eh_frame.c" +#include "eh_frame/eh_frame_dump.c" #include "msf/msf.c" #include "msf/msf_parse.c" #include "pdb/pdb.c" diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 7490c613..5888ea27 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11380,7 +11380,7 @@ rd_frame(void) U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); - U64 tls_root_vaddr = d_cached_tls_root_vaddr_from_thread(thread->handle); + U64 tls_root_vaddr = thread->tls_root_vaddr; ProfEnd(); //////////////////////////// @@ -12212,8 +12212,10 @@ rd_frame(void) { for EachIndex(idx, modules.count) { + Access *access = access_open(); D_Entity *module = modules.v[idx]; - String8 raddbg_data = d_raddbg_data_from_module(scratch.arena, module->handle); + D_ModuleInfo *module_info = d_info_from_module(access, module->handle); + String8 raddbg_data = module_info->raddbg_data; U8 split_char = 0; String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); U64 cfg_idx = 0; @@ -12230,6 +12232,7 @@ rd_frame(void) cfg_node_ptr_list_push(scratch.arena, &immediate_type_views, n->v); } } + access_close(access); } } @@ -12333,7 +12336,7 @@ rd_frame(void) ctx->module_base[0] = module->vaddr_range.min; ctx->frame_base = push_array(scratch.arena, U64, 1); ctx->tls_base = push_array(scratch.arena, U64, 1); - ctx->tls_base[0] = d_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, rip_vaddr); + ctx->tls_base[0] = d_cached_tls_vaddr_from_thread_module(thread->handle, module->handle, rd_state->frame_eval_memread_endt_us, 0); ctx->cfa = d_query_cached_cfa_from_thread_unwind(thread, unwind_count); } e_select_interpret_ctx(interpret_ctx, eval_dbg_infos_primary->rdi, rip_voff); @@ -16810,7 +16813,7 @@ rd_frame(void) D_EntityArray all_processes = d_entity_array_from_kind(D_EntityKind_Process); // rjf: no processes before this one -> new session - if(process_count_pre_tick == 0) + if(process_count_pre_tick == 0 && all_processes.count != 0) { D_Entity *process = all_processes.v[0]; CFG_Node *target = cfg_node_from_id(process->src_msg_id); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index b40438bb..64c9e83d 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -330,6 +330,9 @@ #include "pdb/pdb_parse.h" #include "pdb/pdb_stringize.h" #include "dwarf/dwarf_inc.h" +#include "eh_frame/eh_frame.h" +#include "eh_frame/eh_frame_dump.h" +#include "unwind/unwind_inc.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" @@ -384,6 +387,9 @@ #include "pdb/pdb_parse.c" #include "pdb/pdb_stringize.c" #include "dwarf/dwarf_inc.c" +#include "eh_frame/eh_frame.c" +#include "eh_frame/eh_frame_dump.c" +#include "unwind/unwind_inc.c" #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index b7a60626..6956d14c 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -7,7 +7,7 @@ internal String8 rd_test__test_binary_path(Arena *arena, TestCtx *ctx, String8 name) { - String8 path = str8f(arena, "%S/%S/%S%S", ctx->input_data_path, name, name, program_ext_postfix_from_os(OperatingSystem_CURRENT)); + String8 path = str8f(arena, "%S/%S/%S%S", ctx->input_data_path, name, name, program_ext_postfix_from_os(OperatingSystem_CURRENT, 1)); return path; } @@ -15,7 +15,7 @@ internal String8 rd_test__raddbg_path(Arena *arena, CmdLine *cmdline) { String8 raddbg_exe_name = cmd_line_has_flag(cmdline, s("gui")) ? s("raddbg") : s("raddbg_non_graphical"); - String8 raddbg_exe_filename = str8f(arena, "%S/%S%S", get_process_info()->binary_path, raddbg_exe_name, program_ext_postfix_from_os(OperatingSystem_CURRENT)); + String8 raddbg_exe_filename = str8f(arena, "%S/%S%S", get_process_info()->binary_path, raddbg_exe_name, program_ext_postfix_from_os(OperatingSystem_CURRENT, 0)); return raddbg_exe_filename; } diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 23f0dae6..247cd8bc 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -1401,6 +1401,7 @@ lane_sync(); if(flags & (1ull<<(kind))) ProfScope((char *)rdi_name_title_from_du } lane_sync(); +#undef DumpSubsetKind #undef DumpSubset #undef dumpf #undef dump diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 201b3ca6..f718333a 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2752,7 +2752,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) arch = arch_from_elf_machine(bin.hdr.e_machine); image_base = elf_base_addr_from_bin(&bin); - input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin); + input = dw_raw_from_elf_bin(scratch.arena, params->dbg_data, &bin); path_style = PathStyle_UnixAbsolute; g_d2r_shared.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, params->dbg_data, &bin, &bin.shdrs); @@ -2864,16 +2864,16 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) String8 path; { Temp temp = temp_begin(scratch.arena); - + String8 comp_dir = lookup->vm->header.dir_table.v[0]; PathStyle comp_path_style = path_style_from_str8(comp_dir); PathStyle dir_path_style = path_style_from_str8(lookup->vm->header.dir_table.v[src->dir_idx]); PathStyle file_path_style = path_style_from_str8(src->path); - + String8List dir_path_list = str8_split_path(temp.arena, lookup->vm->header.dir_table.v[src->dir_idx]); String8List file_path_list = str8_split_path(temp.arena, src->path); - + String8List path_list = {0}; if (dir_path_style == PathStyle_Relative) { String8List comp_dir_list = str8_split_path(temp.arena, comp_dir); @@ -2881,15 +2881,15 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } str8_list_concat_in_place(&path_list, &dir_path_list); str8_list_concat_in_place(&path_list, &file_path_list); - + PathStyle path_style = PathStyle_SystemAbsolute; if (dir_path_style != PathStyle_Relative) { path_style = dir_path_style; } else if (file_path_style != PathStyle_Relative) { path_style = file_path_style; } else if (comp_path_style != PathStyle_Relative) { path_style = comp_path_style; } - + str8_path_list_resolve_dots_in_place(&path_list, path_style); path = str8_path_list_join_by_style(arena, &path_list, path_style); - + temp_end(temp); } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c index b2fa3672..61ed73bc 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf_2.c @@ -82,9 +82,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) ProfScope("gather unit ranges from .debug_info, .debug_aranges") if(lane_idx() == 0) { unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); - *unit_info_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_Section_Info].data); + *unit_info_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_Info].data); unit_arange_ranges = push_array(scratch.arena, Rng1U64Array, 1); - *unit_arange_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_Section_ARanges].data); + *unit_arange_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_ARanges].data); } lane_sync_u64(&unit_info_ranges, 0); lane_sync_u64(&unit_arange_ranges, 0); @@ -107,7 +107,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lane_sync_u64(&unit_info_tag_ranges, 0); // rjf: parse all unit headers - String8 data = raw->sec[DW_Section_Info].data; + String8 data = raw->sec[DW_SectionKind_Info].data; Rng1U64 range = lane_range(unit_count); for EachInRange(idx, range) { @@ -135,7 +135,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 unit_take_idx_ = 0; U64 *unit_take_idx_ptr = &unit_take_idx_; lane_sync_u64(&unit_take_idx_ptr, 0); - String8 data = raw->sec[DW_Section_ARanges].data; + String8 data = raw->sec[DW_SectionKind_ARanges].data; for(;;) { // rjf: take unit @@ -264,115 +264,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////////// //- rjf: build all abbreviation maps, build (unit -> abbrev map) // - U64 abbrev_map_count = 0; - U64 *abbrev_map_off_from_idx_table = 0; - DW2_AbbrevMap *abbrev_map_from_idx_table = 0; - DW2_AbbrevMap **abbrev_map_from_unit_idx_table = 0; - ProfScope("build all abbreviation maps, build (unit -> abbrev map)") - { - //- rjf: gather deduplicated .debug_abbrev offsets, representing beginnings - // of abbreviation tables. we want to do this because many units may refer - // to the same abbreviation table. - // - typedef struct AbbrevOffNode AbbrevOffNode; - struct AbbrevOffNode - { - AbbrevOffNode *order_next; - AbbrevOffNode *hash_next; - U64 off; - U64 idx; - }; - U64 abbrev_off_slots_count = unit_count; - AbbrevOffNode **abbrev_off_slots = 0; - ProfScope("gather deduplicated .debug_abbrev offsets") if(lane_idx() == 0) - { - AbbrevOffNode *abbrev_off_first = 0; - AbbrevOffNode *abbrev_off_last = 0; - abbrev_off_slots = push_array(scratch.arena, AbbrevOffNode *, abbrev_off_slots_count); - for EachIndex(unit_idx, unit_count) - { - U64 abbrev_off = unit_headers[unit_idx].abbrev_off; - U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); - U64 slot_idx = hash%abbrev_off_slots_count; - AbbrevOffNode *node = 0; - for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->off == abbrev_off) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(scratch.arena, AbbrevOffNode, 1); - SLLStackPush_N(abbrev_off_slots[slot_idx], node, hash_next); - SLLQueuePush_N(abbrev_off_first, abbrev_off_last, node, order_next); - node->off = abbrev_off; - node->idx = abbrev_map_count; - abbrev_map_count += 1; - } - } - abbrev_map_off_from_idx_table = push_array(scratch.arena, U64, abbrev_map_count); - abbrev_map_from_idx_table = push_array(scratch.arena, DW2_AbbrevMap, abbrev_map_count); - abbrev_map_from_unit_idx_table = push_array(scratch.arena, DW2_AbbrevMap *, unit_count); - { - U64 abbrev_map_idx = 0; - for(AbbrevOffNode *n = abbrev_off_first; n != 0; n = n->order_next) - { - abbrev_map_off_from_idx_table[abbrev_map_idx] = n->off; - abbrev_map_idx += 1; - } - } - } - lane_sync_u64(&abbrev_off_slots, 0); - lane_sync_u64(&abbrev_map_count, 0); - lane_sync_u64(&abbrev_map_off_from_idx_table, 0); - lane_sync_u64(&abbrev_map_from_idx_table, 0); - lane_sync_u64(&abbrev_map_from_unit_idx_table, 0); - - //- rjf: build all unique abbreviation maps - ProfScope("build all unique abbreviation maps") - { - String8 abbrev_data = raw->sec[DW_Section_Abbrev].data; - U64 abbrev_map_take_idx = 0; - U64 *abbrev_map_take_idx_ptr = &abbrev_map_take_idx; - lane_sync_u64(&abbrev_map_take_idx_ptr, 0); - for(;;) - { - U64 abbrev_map_idx = ins_atomic_u64_inc_eval(abbrev_map_take_idx_ptr) - 1; - if(abbrev_map_idx >= abbrev_map_count) - { - break; - } - abbrev_map_from_idx_table[abbrev_map_idx] = dw2_abbrev_map_from_data(scratch.arena, abbrev_data, abbrev_map_off_from_idx_table[abbrev_map_idx]); - } - lane_sync(); - } - - //- rjf: build unit -> abbrev map table - ProfScope("build unit -> abbrev map table") - { - Rng1U64 range = lane_range(unit_count); - for EachInRange(unit_idx, range) - { - U64 abbrev_off = unit_headers[unit_idx].abbrev_off; - U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); - U64 slot_idx = hash%abbrev_off_slots_count; - U64 abbrev_map_idx = 0; - for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->off == abbrev_off) - { - abbrev_map_idx = n->idx; - break; - } - } - abbrev_map_from_unit_idx_table[unit_idx] = &abbrev_map_from_idx_table[abbrev_map_idx]; - } - } - } - lane_sync(); + DW2_UnitAbbrevMapMap unit_abbrev_map_map = dw2_unit_abbrev_map_map_from_data(scratch.arena, raw->sec[DW_SectionKind_Abbrev].data, unit_headers, unit_count); //////////////////////////// //- rjf: parse all unit offsets tables @@ -399,249 +291,62 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // // thank you, again, DWARF. // - U64 str_offsets_tables_count = 0; - DW2_OffsetTable *str_offsets_tables = 0; - Rng1U64 *str_offsets_tables_ranges = 0; - U64 rnglists_tables_count = 0; - DW2_OffsetTable *rnglists_tables = 0; - Rng1U64 *rnglists_tables_ranges = 0; - U64 addr_tables_count = 0; - DW2_OffsetTable *addr_tables = 0; - Rng1U64 *addr_tables_ranges = 0; - U64 loclists_tables_count = 0; - DW2_OffsetTable *loclists_tables = 0; - Rng1U64 *loclists_tables_ranges = 0; + DW2_OffsetTableSet *offset_tables = 0; ProfScope("parse all offset tables (.debug_rnglists, .debug_str_offsets, .debug_addr, .debug_loclists)") if(lane_idx() == 0) { - struct - { - String8 data; - U64 *tables_count_out; - DW2_OffsetTable **tables_out; - Rng1U64 **tables_ranges_out; - } - tasks[] = - { - {raw->sec[DW_Section_StrOffsets].data, &str_offsets_tables_count, &str_offsets_tables, &str_offsets_tables_ranges}, - {raw->sec[DW_Section_RngLists].data, &rnglists_tables_count, &rnglists_tables, &rnglists_tables_ranges}, - {raw->sec[DW_Section_Addr].data, &addr_tables_count, &addr_tables, &addr_tables_ranges}, - {raw->sec[DW_Section_LocLists].data, &loclists_tables_count, &loclists_tables, &loclists_tables_ranges}, - }; - for EachElement(task_idx, tasks) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - String8 data = tasks[task_idx].data; - - //- rjf: gather all tables (loose) - typedef struct TableNode TableNode; - struct TableNode - { - TableNode *next; - DW2_OffsetTable v; - Rng1U64 range; - }; - TableNode *first_table = 0; - TableNode *last_table = 0; - U64 table_count = 0; - for(U64 off = 0; off < data.size;) - { - U64 start_off = off; - DW2_OffsetTable table = {0}; - off += dw2_read_offset_table(data, off, &table); - if(table.entries != 0) - { - TableNode *n = push_array(scratch2.arena, TableNode, 1); - SLLQueuePush(first_table, last_table, n); - n->v = table; - n->range = r1u64(start_off, off); - table_count += 1; - } - if(off == start_off) - { - break; - } - } - - //- rjf: tighten - tasks[task_idx].tables_count_out[0] = table_count; - tasks[task_idx].tables_out[0] = push_array(scratch.arena, DW2_OffsetTable, table_count); - tasks[task_idx].tables_ranges_out[0] = push_array(scratch.arena, Rng1U64, table_count); - { - U64 idx = 0; - for EachNode(n, TableNode, first_table) - { - tasks[task_idx].tables_out[0][idx] = n->v; - tasks[task_idx].tables_ranges_out[0][idx] = n->range; - idx += 1; - } - } - - scratch_end(scratch2); - } + offset_tables = push_array(scratch.arena, DW2_OffsetTableSet, 1); + offset_tables[0] = dw2_offset_table_set_from_raw(scratch.arena, raw); } - lane_sync_u64(&str_offsets_tables_count, 0); - lane_sync_u64(&str_offsets_tables, 0); - lane_sync_u64(&str_offsets_tables_ranges, 0); - lane_sync_u64(&rnglists_tables_count, 0); - lane_sync_u64(&rnglists_tables, 0); - lane_sync_u64(&rnglists_tables_ranges, 0); - lane_sync_u64(&addr_tables_count, 0); - lane_sync_u64(&addr_tables, 0); - lane_sync_u64(&addr_tables_ranges, 0); - lane_sync_u64(&loclists_tables_count, 0); - lane_sync_u64(&loclists_tables, 0); - lane_sync_u64(&loclists_tables_ranges, 0); + lane_sync_u64(&offset_tables, 0); //////////////////////////// - //- rjf: build per-unit parsing contexts + //- rjf: build per-unit parsing contexts, parse compilation unit tags // DW2_ParseCtx *unit_parse_ctxs = 0; + DW2_Tag *unit_root_tags = 0; { if(lane_idx() == 0) { unit_parse_ctxs = push_array(scratch.arena, DW2_ParseCtx, unit_count); + unit_root_tags = push_array(scratch.arena, DW2_Tag, unit_count); } lane_sync_u64(&unit_parse_ctxs, 0); + lane_sync_u64(&unit_root_tags, 0); Rng1U64 range = lane_range(unit_count); for EachInRange(unit_idx, range) { DW2_UnitHeader *hdr = &unit_headers[unit_idx]; DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; - ctx->raw = raw; - ctx->version = hdr->version; - ctx->format = hdr->format; - ctx->addr_size = hdr->addr_size; - ctx->unit_base_info_off = unit_info_ranges->v[unit_idx].min; - ctx->abbrev_map = abbrev_map_from_unit_idx_table[unit_idx]; - } - } - lane_sync(); - - //////////////////////////// - //- rjf: do initial parse of each unit's root-level tag - // - // an incredible NOTE: this is actually not sufficient. because this tag parse - // is what informs us which .debug_str_offsets table each unit should be associated - // with (via the StrOffsetsBase attribute), we actually don't have the right string - // offset table *before* we parse this, which means we can't resolve some of the - // string attribute values. - // - // so, in another incredible twist of fate, we actually must do this *twice*. first, - // to find *just the StrOffsetsBase*, and then, to actually fully resolve everything. - // - // (all of the above is also true for RngListsBase) - // - DW2_Tag *unit_root_tags__pre_offset_tables = 0; - { - if(lane_idx() == 0) - { - unit_root_tags__pre_offset_tables = push_array(scratch.arena, DW2_Tag, unit_count); - } - lane_sync_u64(&unit_root_tags__pre_offset_tables, 0); - Rng1U64 range = lane_range(unit_count); - for EachInRange(unit_idx, range) - { - dw2_read_tag(scratch.arena, &unit_parse_ctxs[unit_idx], raw->sec[DW_Section_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags__pre_offset_tables[unit_idx]); - } - } - lane_sync(); - - //////////////////////////// - //- rjf: look up base addresses for each unit - equip to per-unit parsing contexts - // - { - Rng1U64 range = lane_range(unit_count); - for EachInRange(unit_idx, range) - { - DW2_Tag *unit_root_tag = &unit_root_tags__pre_offset_tables[unit_idx]; - DW2_Attrib *low_pc_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_LowPc); - U64 low_pc = low_pc_attrib->val.addr; - unit_parse_ctxs[unit_idx].unit_base_addr = low_pc; - } - } - lane_sync(); - - //////////////////////////// - //- rjf: look up offset tables for each unit (.debug_str_offsets, .debug_rnglists, etc.); - // equip to per-unit parsing contexts - // - { - Rng1U64Array rnglists_tables_ranges_array = {rnglists_tables_ranges, rnglists_tables_count}; - Rng1U64Array str_offsets_tables_ranges_array = {str_offsets_tables_ranges, str_offsets_tables_count}; - Rng1U64Array addr_tables_ranges_array = {addr_tables_ranges, addr_tables_count}; - Rng1U64Array loclist_tables_ranges_array = {loclists_tables_ranges, loclists_tables_count}; - Rng1U64 range = lane_range(unit_count); - for EachInRange(unit_idx, range) - { - DW2_Tag *unit_root_tag = &unit_root_tags__pre_offset_tables[unit_idx]; - // rjf: find rnglists table - { - DW2_Attrib *rnglists_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_RngListsBase); - U64 rnglists_base_off = rnglists_base_off_attrib->val.u128.u64[0]; - U64 rnglists_table_num = rng1u64_array_num_from_value__binary_search(&rnglists_tables_ranges_array, rnglists_base_off); - if(0 < rnglists_table_num && rnglists_table_num <= rnglists_tables_ranges_array.count) - { - DW2_OffsetTable *table = &rnglists_tables[rnglists_table_num-1]; - unit_parse_ctxs[unit_idx].rnglists_table = table; - } - } + // rjf: equip initial info - just enough to do a bootstrapping parse of the root tag + dw2_parse_ctx_equip_unit_header(ctx, hdr, unit_info_ranges->v[unit_idx].min); + dw2_parse_ctx_equip_unit_abbrev_map(ctx, &unit_abbrev_map_map, unit_idx); - // rjf: find str offsets table - { - DW2_Attrib *str_offsets_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StrOffsetsBase); - U64 str_offsets_base_off = str_offsets_base_off_attrib->val.u128.u64[0]; - U64 str_offsets_table_num = rng1u64_array_num_from_value__binary_search(&str_offsets_tables_ranges_array, str_offsets_base_off); - if(0 < str_offsets_table_num && str_offsets_table_num <= str_offsets_tables_ranges_array.count) - { - DW2_OffsetTable *table = &str_offsets_tables[str_offsets_table_num-1]; - unit_parse_ctxs[unit_idx].str_offsets_table = table; - } - } + // rjf: do bootstrapping parse + // + // an incredible NOTE: the above context info is actually not sufficient for general + // parsing, because this "bootstrapping" tag parse is what informs us which + // .debug_str_offsets table each unit should be associated with (via the + // StrOffsetsBase attribute), we actually don't have the right string offset table + // *before* we parse this, which means we can't resolve some of the string attribute + // values. + // + // so, in another incredible twist of fate, we actually must do this *twice*. first, + // to find *just the StrOffsetsBase*, and then, to actually fully resolve everything. + // + // (all of the above is also true for RngListsBase) + // + DW2_Tag root_tag_bootstrap = {0}; + dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag_bootstrap); - // rjf: find addr table - { - DW2_Attrib *addr_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_AddrBase); - U64 addr_base_off = addr_base_off_attrib->val.u128.u64[0]; - U64 addr_table_num = rng1u64_array_num_from_value__binary_search(&addr_tables_ranges_array, addr_base_off); - if(0 < addr_table_num && addr_table_num <= addr_tables_ranges_array.count) - { - DW2_OffsetTable *table = &addr_tables[addr_table_num-1]; - unit_parse_ctxs[unit_idx].addr_table = table; - } - } + // rjf: equip info extracted from bootstrapping parse + dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag_bootstrap, offset_tables); - // rjf: find addr table - { - DW2_Attrib *loclist_base_off_attrib = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_LocListsBase); - U64 loclist_base_off = loclist_base_off_attrib->val.u128.u64[0]; - U64 loclist_table_num = rng1u64_array_num_from_value__binary_search(&loclist_tables_ranges_array, loclist_base_off); - if(0 < loclist_table_num && loclist_table_num <= loclist_tables_ranges_array.count) - { - DW2_OffsetTable *table = &loclists_tables[loclist_table_num-1]; - unit_parse_ctxs[unit_idx].loclists_table = table; - } - } - } - } - lane_sync(); - - //////////////////////////// - //- rjf: do parse of each unit's root tag AFTER finding the right .debug_str_offsets table - // - // (excellent work everyone - thank you for reminding me why RDI is necessary) - // - DW2_Tag *unit_root_tags = 0; - { - if(lane_idx() == 0) - { - unit_root_tags = push_array(scratch.arena, DW2_Tag, unit_count); - } - lane_sync_u64(&unit_root_tags, 0); - Rng1U64 range = lane_range(unit_count); - for EachInRange(unit_idx, range) - { - dw2_read_tag(scratch.arena, &unit_parse_ctxs[unit_idx], raw->sec[DW_Section_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags[unit_idx]); + // rjf: do non-bootstrapping parse + dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags[unit_idx]); + + // rjf: equip info extracted from non-bootstrapping parse + dw2_parse_ctx_equip_unit_root_tag(ctx, &unit_root_tags[unit_idx], offset_tables); } } lane_sync(); @@ -671,8 +376,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); U64 line_info_off = stmt_list->val.u128.u64[0]; - String8 line_info_data = raw->sec[DW_Section_Line].data; - dw2_read_line_table_header(scratch.arena, ctx, line_info_data, line_info_off, &unit_line_table_headers[unit_idx]); + String8 line_info_data = raw->sec[DW_SectionKind_Line].data; + dw2_read_line_table_header(scratch.arena, raw, ctx, line_info_data, line_info_off, &unit_line_table_headers[unit_idx]); } lane_sync(); } @@ -825,7 +530,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); U64 line_info_off = stmt_list->val.u128.u64[0]; - String8 all_line_info_data = raw->sec[DW_Section_Line].data; + String8 all_line_info_data = raw->sec[DW_SectionKind_Line].data; String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_table_header->line_program_off, line_info_off + line_table_header->total_unit_data_size)); //- rjf: build unit's line table @@ -1295,7 +1000,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: reading the next tag DW2_Tag tag = {0}; - off += dw2_read_tag(scratch3.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); //- rjf: do tree navigations if(tag.has_children) @@ -1508,7 +1213,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: read tag DW2_Tag tag = {0}; - off += dw2_read_tag(tag_scratch.arena, origin_unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + off += dw2_read_tag(tag_scratch.arena, raw, origin_unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); // rjf: is this one of the tags we'd like to dedup? -> gather if(tag.kind == DW_TagKind_ArrayType || @@ -1667,7 +1372,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: read tag DW2_Tag tag = {0}; - t_off += dw2_read_tag(tag_scratch.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, t_off, &tag); + t_off += dw2_read_tag(tag_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, t_off, &tag); // rjf: determine if tag should be skipped from hashing B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || @@ -1691,14 +1396,14 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) { // rjf: non-reference? -> combine attribute value info - if(n->v.val.kind != DW_Form_RefAddr && - n->v.val.kind != DW_Form_Ref1 && - n->v.val.kind != DW_Form_Ref2 && - n->v.val.kind != DW_Form_Ref4 && - n->v.val.kind != DW_Form_Ref8 && - n->v.val.kind != DW_Form_RefUData && - n->v.val.kind != DW_Form_RefSup4 && - n->v.val.kind != DW_Form_RefSig8 && + if(n->v.val.kind != DW_FormKind_RefAddr && + n->v.val.kind != DW_FormKind_Ref1 && + n->v.val.kind != DW_FormKind_Ref2 && + n->v.val.kind != DW_FormKind_Ref4 && + n->v.val.kind != DW_FormKind_Ref8 && + n->v.val.kind != DW_FormKind_RefUData && + n->v.val.kind != DW_FormKind_RefSup4 && + n->v.val.kind != DW_FormKind_RefSig8 && ((tag.kind != DW_TagKind_SubProgram && tag.kind != DW_TagKind_FormalParameter) || (n->v.attrib_kind != DW_AttribKind_Name && @@ -2090,7 +1795,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: parse this type's tag U64 read_off = info_off; DW2_Tag tag = {0}; - read_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, read_off, &tag); + read_off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, read_off, &tag); // rjf: find direct types from this type tag typedef struct DirectTypeNode DirectTypeNode; @@ -2146,7 +1851,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: read child tag DW2_Tag child_tag = {0}; - read_off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, read_off, &child_tag); + read_off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, read_off, &child_tag); // rjf: formal parameters -> gather direct types if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) @@ -2315,7 +2020,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: parse root-level tag DW2_Tag tag = {0}; - U64 tag_info_size = dw2_read_tag(temp.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + U64 tag_info_size = dw2_read_tag(temp.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, info_off, &tag); // rjf: extract common attributes DW2_Attrib *name_attrib = &dw2_attrib_nil; @@ -2453,7 +2158,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: read child tag DW2_Tag child_tag = {0}; - off += dw2_read_tag(scratch3.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &child_tag); + off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &child_tag); // rjf: gather parameters if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) @@ -2654,7 +2359,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { U64 start_off = off; DW2_Tag child_tag = {0}; - off += dw2_read_tag(temp.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &child_tag); + off += dw2_read_tag(temp.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &child_tag); if(child_tag.kind == DW_TagKind_SubrangeType) { // rjf: extract bounds attribs @@ -2681,8 +2386,9 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: resolve lower bound U64 lower_bound = 0; + if(lower_bound_attrib != &dw2_attrib_nil) { - if(dw_is_form_kind_ref(unit_parse_ctx->version, unit_parse_ctx->ext, lower_bound_attrib->val.kind)) + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, lower_bound_attrib->val.kind) & DW_AttribClass_Reference) { log_infof("[.debug_info@0x%I64x] Array type lower bound is a variable; this is not currently supported.\n", start_off); } @@ -2691,6 +2397,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) lower_bound = lower_bound_attrib->val.u128.u64[0]; } } + else switch(unit_parse_ctx->language) + { + default:{}break; +#define X(name, code, default_array_lower_bound) case DW_Language_##name:{lower_bound = (default_array_lower_bound);}break; + DW_Language_XList +#undef X + } // rjf: resolve upper bound U64 upper_bound = 0; @@ -2701,7 +2414,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } else if(upper_bound_attrib != &dw2_attrib_nil) { - if(dw_is_form_kind_ref(unit_parse_ctx->version, unit_parse_ctx->ext, upper_bound_attrib->val.kind)) + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, upper_bound_attrib->val.kind) & DW_AttribClass_Reference) { log_infof("[.debug_info@0x%I64x] Array type upper bound is a variable; this is not currently supported.\n", start_off); } @@ -2833,7 +2546,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: read namespace tag DW2_Tag tag = {0}; - dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, info_off, &tag); + dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, info_off, &tag); DW2_Attrib *name_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Name); String8 name = name_attrib->val.string; @@ -2917,7 +2630,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: parse tag DW2_Tag tag = {0}; U64 tag_parse_off = off; - off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); // rjf: unpack tag attributes DW2_Attrib *name_attrib = &dw2_attrib_nil; @@ -3183,7 +2896,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { U64 voff_base = lopc_attrib->val.addr - base_vaddr; U64 voff_opl = 0; - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, hipc_attrib->val.kind) & (1<version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<val.u128.u64[0]; } @@ -3298,7 +3011,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: parse tag // DW2_Tag tag = {0}; - off += dw2_read_tag(scratch2.arena, unit_parse_ctx, raw->sec[DW_Section_Info].data, off, &tag); + off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); //////////////////////// //- rjf: gather attributes from tag @@ -3365,7 +3078,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { U64 voff_base = lopc_attrib->val.addr - base_vaddr; U64 voff_opl = 0; - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, hipc_attrib->val.kind) & (1<version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<val.u128.u64[0]; } @@ -3467,19 +3180,19 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) switch(attrib->val.kind) { default:{}break; - case DW_Form_ExprLoc: + case DW_FormKind_ExprLoc: { U64 expr_info_off = attrib->val.u128.u64[0]; U64 expr_info_size = attrib->val.u128.u64[1]; - String8 expr = str8_substr(raw->sec[DW_Section_Info].data, r1u64(expr_info_off, expr_info_off+expr_info_size)); + String8 expr = str8_substr(raw->sec[DW_SectionKind_Info].data, r1u64(expr_info_off, expr_info_off+expr_info_size)); DW2_LocNode *n = push_array(scratch2.arena, DW2_LocNode, 1); n->v.expr = expr; n->v.range = r1u64(0, max_U64); SLLQueuePush(locs.first, locs.last, n); locs.count += 1; }break; - case DW_Form_LocListx: // NOTE(rjf): dwarf5+, loclistx -> location list offset table - case DW_Form_SecOffset: // NOTE(rjf): pre-dwarf5, location section offset -> a location list + case DW_FormKind_LocListx: // NOTE(rjf): dwarf5+, loclistx -> location list offset table + case DW_FormKind_SecOffset: // NOTE(rjf): pre-dwarf5, location section offset -> a location list { locs = dw2_loclist_from_form_val(scratch2.arena, unit_parse_ctx, raw, attrib->val); }break; @@ -3550,31 +3263,36 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW_ExprOp opcode = 0; expr_off += str8_deserial_read_struct(expr, expr_off, &opcode); + //- rjf: unpack opcode + DW_ExprOpInfo *opcode_info = dw_info_from_expr_op(unit_parse_ctx->version, unit_parse_ctx->exts, opcode); + U64 operands_count = opcode_info->operand_count; + DW_ExprOperandKind operands_kinds[2] = {opcode_info->operand_kinds[0], opcode_info->operand_kinds[1]}; + U64 push_count = opcode_info->push_count; + U64 pop_count = opcode_info->pop_count; + //- rjf: read op operands - U64 operands_count = dw_operand_count_from_expr_op(opcode); - DW_ExprOperandType *operands_types = dw_operand_types_from_expr_opcode(opcode); U64 operand_u64s[2] = {0}; S64 operand_s64s[2] = {0}; String8 operand_str8s[2] = {0}; for EachIndex(operand_idx, operands_count) { - switch(operands_types[operand_idx]) + switch(operands_kinds[operand_idx]) { - case DW_ExprOperandType_Null: + case DW_ExprOperandKind_Null: default:{}break; - case DW_ExprOperandType_U8: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 1, 1);}break; - case DW_ExprOperandType_U16: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 2, 2);}break; - case DW_ExprOperandType_U32: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 4, 4);}break; - case DW_ExprOperandType_U64: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 8, 8);}break; - case DW_ExprOperandType_S8: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 1, 1);}break; - case DW_ExprOperandType_S16: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 2, 2);}break; - case DW_ExprOperandType_S32: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 4, 4);}break; - case DW_ExprOperandType_S64: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 8, 8);}break; - case DW_ExprOperandType_ULEB128: {expr_off += str8_deserial_read_uleb128(expr, expr_off, &operand_u64s[operand_idx]);} break; - case DW_ExprOperandType_SLEB128: {expr_off += str8_deserial_read_sleb128(expr, expr_off, &operand_s64s[operand_idx]);} break; - case DW_ExprOperandType_Addr: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], unit_parse_ctx->addr_size, unit_parse_ctx->addr_size);}break; - case DW_ExprOperandType_DwarfUInt: {expr_off += dw2_read_fmt_u64(expr, expr_off, unit_parse_ctx->format, &operand_u64s[operand_idx]);}break; - case DW_ExprOperandType_Block: + case DW_ExprOperandKind_U8: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 1, 1);}break; + case DW_ExprOperandKind_U16: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 2, 2);}break; + case DW_ExprOperandKind_U32: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 4, 4);}break; + case DW_ExprOperandKind_U64: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 8, 8);}break; + case DW_ExprOperandKind_S8: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 1, 1);}break; + case DW_ExprOperandKind_S16: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 2, 2);}break; + case DW_ExprOperandKind_S32: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 4, 4);}break; + case DW_ExprOperandKind_S64: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 8, 8);}break; + case DW_ExprOperandKind_ULEB128: {expr_off += str8_deserial_read_uleb128(expr, expr_off, &operand_u64s[operand_idx]);} break; + case DW_ExprOperandKind_SLEB128: {expr_off += str8_deserial_read_sleb128(expr, expr_off, &operand_s64s[operand_idx]);} break; + case DW_ExprOperandKind_Addr: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], unit_parse_ctx->addr_size, unit_parse_ctx->addr_size);}break; + case DW_ExprOperandKind_DwarfUInt: {expr_off += dw2_read_fmt_u64(expr, expr_off, unit_parse_ctx->format, &operand_u64s[operand_idx]);}break; + case DW_ExprOperandKind_Block: { U8 block_size = 0; expr_off += str8_deserial_read_struct(expr, expr_off, &block_size); @@ -3587,7 +3305,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: pop stack values D2R2_ExprVal popped_vals[2] = {0}; { - U64 pop_count = dw_pop_count_from_expr_op(opcode); pop_count = Min(pop_count, ArrayCount(popped_vals)); for EachIndex(pop_idx, pop_count) { @@ -3905,7 +3622,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: TLS offsets case DW_ExprOp_FormTlsAddress: - case DW_ExprOp_GNU_PushTlsAddress: + case DW_GNU_ExprOp_PushTlsAddress: { rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_TLSOff, 0); rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); @@ -3916,7 +3633,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: call site value case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: + case DW_GNU_ExprOp_EntryValue: { // TODO(rjf): expr op entry value ops }break; @@ -3975,24 +3692,24 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) log_infof("[.debug_info@0x%I64x] DWARF expression call operation encountered. This is not supported for location info.\n", start_off); }break; case DW_ExprOp_ImplicitPointer: - case DW_ExprOp_GNU_ImplicitPointer: + case DW_GNU_ExprOp_ImplicitPointer: { dst_bytecode_is_good = 0; log_infof("[.debug_info@0x%I64x] DWARF expression implicit pointer operation encountered. This is not supported for location info.\n", start_off); }break; - case DW_ExprOp_GNU_ParameterRef: + case DW_GNU_ExprOp_ParameterRef: { dst_bytecode_is_good = 0; log_infof("[.debug_info@0x%I64x] DWARF expression GNU_ParameterRef operation encountered. This is not supported for location info.\n", start_off); }break; case DW_ExprOp_DerefType: - case DW_ExprOp_GNU_DerefType: + case DW_GNU_ExprOp_DerefType: { dst_bytecode_is_good = 0; log_infof("[.debug_info@0x%I64x] DWARF expression DerefType operation encountered. This is not supported for location info.\n", start_off); }break; case DW_ExprOp_ConstType: - case DW_ExprOp_GNU_ConstType: + case DW_GNU_ExprOp_ConstType: { dst_bytecode_is_good = 0; log_infof("[.debug_info@0x%I64x] DWARF expression ConstType operation encountered. This is not supported for location info.\n", start_off); @@ -4012,7 +3729,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) dst_bytecode_is_good = 0; log_infof("[.debug_info@0x%I64x] DWARF expression Rot (rotate) operation encountered. This is not supported for location info.\n", start_off); }break; - case DW_ExprOp_GNU_UnInit: + case DW_GNU_ExprOp_UnInit: { dst_bytecode_is_good = 0; log_infof("[.debug_info@0x%I64x] DWARF expression GNU_UnInit operation encountered. This is not supported for location info.\n", start_off); @@ -4022,7 +3739,6 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: push values to stack { - U64 push_count = dw_push_count_from_expr_op(opcode); push_count = Min(push_count, ArrayCount(push_vals)); for EachIndex(push_idx, push_count) { diff --git a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c index 8d30e9d9..efd32d87 100644 --- a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c +++ b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c @@ -5,11 +5,13 @@ // // [ ] d2r_types alias size and byte size on __float80 typedef mismatch +#if 0 + internal RDI_Parsed * d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) { Temp scratch = scratch_begin(&arena, 1); - + RDI_Parsed *rdi = push_array(arena, RDI_Parsed, 1); String8 raw_coff; @@ -156,19 +158,19 @@ dw_writer_tag_end(writer); \ #define TestBuiltinType(n, bs, r) \ do { \ - RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ - T_Ok(alias); \ - T_Ok(alias->kind == RDI_TypeKind_Alias); \ - T_Ok(alias->flags == 0); \ - T_Ok(alias->byte_size == bs); \ - RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, alias->user_defined.direct_type_idx); \ - T_Ok(type); \ - T_Ok(type->kind == RDI_TypeKind_##r); \ - T_Ok(type->flags == 0); \ - T_Ok(type->byte_size == alias->byte_size); \ - U64 expected_name_size = 0; \ - U8 *expected_name = rdi_string_from_type_kind(RDI_TypeKind_##r, &expected_name_size); \ - T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8(expected_name, expected_name_size), 0)); \ +RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ +T_Ok(alias); \ +T_Ok(alias->kind == RDI_TypeKind_Alias); \ +T_Ok(alias->flags == 0); \ +T_Ok(alias->byte_size == bs); \ +RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, alias->user_defined.direct_type_idx); \ +T_Ok(type); \ +T_Ok(type->kind == RDI_TypeKind_##r); \ +T_Ok(type->flags == 0); \ +T_Ok(type->byte_size == alias->byte_size); \ +U64 expected_name_size = 0; \ +U8 *expected_name = rdi_string_from_type_kind(RDI_TypeKind_##r, &expected_name_size); \ +T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8(expected_name, expected_name_size), 0)); \ } while (0) TestBuiltinType("char", 1, Char8); TestBuiltinType("char8_t", 1, UChar8); @@ -282,32 +284,32 @@ SKIP(d2r_line_table) for EachIndex(k, test_table[i].line_size) { String8 cmdl = str8f(arena, "-voff2line -voff:0x%llx %S", test_table[i].voff + k, t_make_file_path(arena, str8_lit("a.rdi"))); t_invoke_radbin((char *)cmdl.str); - + if (g_last_exit_code != 0) { t_errorf("radbin exited with %llu on \"%S\"\n", (unsigned long long)g_last_exit_code, cmdl); T_Ok(0); } - + if ( ! t_match_linef(&g_output, "%S:%llu", test_table[i].file->path, test_table[i].ln)) { t_errorf("ERROR: conversion produced unexpected output for \"radbin %S\"\n" \ - " Expected: %S:%llu\n" \ - " Got: %S\n", - cmdl, - test_table[i].file->path, (unsigned long long)test_table[i].ln, - g_output); - + " Expected: %S:%llu\n" \ + " Got: %S\n", + cmdl, + test_table[i].file->path, (unsigned long long)test_table[i].ln, + g_output); + if (g_verbose) { t_invoke_radbin("-dump -only:line_tables a.rdi"); t_errorf("\n================================================================================\n"); t_errorf("RDI:\n%S\n", g_output); - + t_errorf("================================================================================\n"); t_invoke_radbin("-dump -only:debug_line a.exe"); t_errorf("DWARF:\n%S\n", g_output); - + g_output = str8_zero(); } - + T_Ok(0); } } @@ -319,7 +321,7 @@ SKIP(d2r_line_table) SKIP(d2r_checksums) { DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - + B32 is_ok = 0; DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/c/devel/foo.c")); @@ -594,4 +596,4 @@ TEST(d2r_general) dw_writer_end(&writer); } - +#endif diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index b240b3ae..4de5a57a 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -58,11 +58,13 @@ #include "pdb/pdb_parse.h" #include "pdb/pdb_stringize.h" #include "dwarf/dwarf_inc.h" +#include "eh_frame/eh_frame.h" +#include "eh_frame/eh_frame_dump.h" +#include "unwind/unwind_inc.h" #include "llvm/llvm.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" -#include "rdi_from_dwarf/rdi_from_dwarf.h" #include "rdi_from_dwarf/rdi_from_dwarf_2.h" #include "obj/obj.h" #include "radbin/radbin.h" @@ -133,11 +135,13 @@ #include "pdb/pdb_parse.c" #include "pdb/pdb_stringize.c" #include "dwarf/dwarf_inc.c" +#include "eh_frame/eh_frame.c" +#include "eh_frame/eh_frame_dump.c" +#include "unwind/unwind_inc.c" #include "llvm/llvm.c" #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" -#include "rdi_from_dwarf/rdi_from_dwarf.c" #include "rdi_from_dwarf/rdi_from_dwarf_2.c" #include "obj/obj.c" #include "radbin/radbin.c" diff --git a/src/unwind/generated/unwind.meta.c b/src/unwind/generated/unwind.meta.c new file mode 100644 index 00000000..0378fad9 --- /dev/null +++ b/src/unwind/generated/unwind.meta.c @@ -0,0 +1,5 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + diff --git a/src/unwind/generated/unwind.meta.h b/src/unwind/generated/unwind.meta.h new file mode 100644 index 00000000..fa4831f6 --- /dev/null +++ b/src/unwind/generated/unwind.meta.h @@ -0,0 +1,21 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef UNWIND_META_H +#define UNWIND_META_H + +typedef enum UWND_Unwinder +{ +UWND_Unwinder_Null, +UWND_Unwinder_PEx64, +UWND_Unwinder_EHFrame, +UWND_Unwinder_COUNT, +} UWND_Unwinder; + +#define UWND_Unwinder_XList \ +X(PEx64, pe_x64)\ +X(EHFrame, eh)\ + +#endif // UNWIND_META_H diff --git a/src/unwind/unwind.c b/src/unwind/unwind.c new file mode 100644 index 00000000..4a073e03 --- /dev/null +++ b/src/unwind/unwind.c @@ -0,0 +1,24 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "unwind/generated/unwind.meta.c" + +//////////////////////////////// +//~ rjf: Abstracted Unwind Step Functions + +internal UWND_StepResult +uwnd_step(UWND_Unwinder unwinder, Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 tls_vaddr, void *regs, U64 *cfa_out) +{ + UWND_StepResult result = {UWND_StepStatus_Error}; + switch(unwinder) + { + default:{}break; +#define X(name, namespace_lower) case UWND_Unwinder_##name:{result = namespace_lower##_uwnd_step(arch, memory_map, module_info, tls_vaddr, regs, cfa_out);}break; + UWND_Unwinder_XList +#undef X + } + return result; +} diff --git a/src/unwind/unwind.h b/src/unwind/unwind.h new file mode 100644 index 00000000..40bab81d --- /dev/null +++ b/src/unwind/unwind.h @@ -0,0 +1,45 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef UNWIND_H +#define UNWIND_H + +//////////////////////////////// +//~ rjf: Generated Code + +#include "unwind/generated/unwind.meta.h" + +//////////////////////////////// +//~ rjf: Unwind Artifact Types + +typedef enum UWND_StepStatus +{ + UWND_StepStatus_Error, + UWND_StepStatus_FailedMemoryRead, + UWND_StepStatus_Good, +} +UWND_StepStatus; + +typedef struct UWND_StepResult UWND_StepResult; +struct UWND_StepResult +{ + UWND_StepStatus status; + Rng1U64 missed_read_vaddr_range; +}; + +//////////////////////////////// +//~ rjf: Module Info + +typedef struct UWND_ModuleInfo UWND_ModuleInfo; +struct UWND_ModuleInfo +{ + U64 base_vaddr; + void *unwind_info; +}; + +//////////////////////////////// +//~ rjf: Abstracted Unwind Step Functions + +internal UWND_StepResult uwnd_step(UWND_Unwinder unwinder, Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 tls_vaddr, void *regs, U64 *cfa_out); + +#endif // UNWIND_H diff --git a/src/unwind/unwind.mdesk b/src/unwind/unwind.mdesk new file mode 100644 index 00000000..2617c1cb --- /dev/null +++ b/src/unwind/unwind.mdesk @@ -0,0 +1,21 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@table(name namespace_lower) +UWND_UnwinderTable: +{ + {PEx64 pe_x64 } + {EHFrame eh } +} + +@enum UWND_Unwinder: +{ + Null, + @expand(UWND_UnwinderTable a) `$(a.name)`, + COUNT +} + +@xlist UWND_Unwinder_XList: +{ + @expand(UWND_UnwinderTable a) `$(a.name), $(a.namespace_lower)` +} diff --git a/src/unwind/unwind_inc.c b/src/unwind/unwind_inc.c new file mode 100644 index 00000000..52509304 --- /dev/null +++ b/src/unwind/unwind_inc.c @@ -0,0 +1,10 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "unwind.c" +#if defined(PE_H) && defined(X64_H) +# include "pe/x64/unwind/pe_x64_unwind.c" +#endif +#if defined(EH_FRAME_H) +# include "eh_frame/unwind/eh_frame_unwind.c" +#endif diff --git a/src/unwind/unwind_inc.h b/src/unwind/unwind_inc.h new file mode 100644 index 00000000..4a9b25c3 --- /dev/null +++ b/src/unwind/unwind_inc.h @@ -0,0 +1,15 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef UNWIND_INC_H +#define UNWIND_INC_H + +#include "unwind.h" +#if defined(PE_H) && defined(X64_H) +# include "pe/x64/unwind/pe_x64_unwind.h" +#endif +#if defined(EH_FRAME_H) +# include "eh_frame/unwind/eh_frame_unwind.h" +#endif + +#endif // UNWIND_INC_H diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index b830e42b..1d9f8e1e 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -316,7 +316,7 @@ commit_memory_large(void *ptr, U64 size) } //////////////////////////////// -//~ rjf: @os_hooks Shared Memory +//~ rjf: @per_os_impl Shared Memory internal SharedMemory shared_memory_alloc(U64 size, String8 name) @@ -476,7 +476,7 @@ thread_detach(Thread thread) } //////////////////////////////// -//~ rjf: @os_hooks Safe Calls +//~ rjf: @per_os_impl Safe Calls internal void safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr) diff --git a/src/win32/demon/win32_demon.c b/src/win32/demon/win32_demon.c index acceaa52..f8c9f6cf 100644 --- a/src/win32/demon/win32_demon.c +++ b/src/win32/demon/win32_demon.c @@ -1217,6 +1217,50 @@ w32_dmn_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block) return result; } +internal U64 +w32_dmn_thread_stack_base_vaddr_from_tlb_vaddr(HANDLE process, Arch arch, U64 tlb_vaddr) +{ + U64 stack_base_vaddr = 0; + { + switch(arch) + { + case Arch_Null: + case Arch_COUNT: + case Arch_arm64: + case Arch_arm32: + case Arch_x86: + {}break; + case Arch_x64: + { + U64 stack_base_vaddr = tlb_vaddr + 0x8; + w32_dmn_process_read(process, r1u64(stack_base_vaddr, stack_base_vaddr+8), &stack_base_vaddr); + }break; + } + } + return stack_base_vaddr; +} + +internal U64 +w32_dmn_thread_tls_root_vaddr_from_tlb_vaddr(Arch arch, U64 tlb_vaddr) +{ + U64 result = 0; + switch(arch) + { + case Arch_Null: + case Arch_COUNT: + {}break; + case Arch_arm64: + case Arch_arm32: + case Arch_x86: + {}break; + case Arch_x64: + { + result = tlb_vaddr + 88; + }break; + } + return result; +} + //- rjf: remote thread injection internal DWORD @@ -2066,6 +2110,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) thread->thread.thread_local_base = tls_base; } + // rjf: unpack thread addresses + U64 stack_base_vaddr = w32_dmn_thread_stack_base_vaddr_from_tlb_vaddr(process_handle, module_info->arch, tls_base); + U64 tls_root_vaddr = w32_dmn_thread_tls_root_vaddr_from_tlb_vaddr(module_info->arch, tls_base); + // rjf: put thread into suspended state, so it matches expected initial state SuspendThread(thread_handle); @@ -2096,11 +2144,13 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) // rjf: create thread { DMN_Event *e = dmn_event_list_push(arena, &events); - e->kind = DMN_EventKind_CreateThread; - e->process = w32_dmn_handle_from_entity(process); - e->thread = w32_dmn_handle_from_entity(thread); - e->arch = module_info->arch; - e->code = evt.dwThreadId; + e->kind = DMN_EventKind_CreateThread; + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(thread); + e->arch = module_info->arch; + e->code = evt.dwThreadId; + e->stack_pointer = stack_base_vaddr; + e->tls_root_vaddr= tls_root_vaddr; } // rjf: load module @@ -2192,6 +2242,10 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) DWORD sus_result = SuspendThread(thread->handle); (void)sus_result; + // rjf: unpack thread addresses + U64 stack_base_vaddr = w32_dmn_thread_stack_base_vaddr_from_tlb_vaddr(process->handle, thread->arch, (U64)evt.u.CreateThread.lpThreadLocalBase); + U64 tls_root_vaddr = w32_dmn_thread_tls_root_vaddr_from_tlb_vaddr(thread->arch, (U64)evt.u.CreateThread.lpThreadLocalBase); + // rjf: unpack thread name String8 thread_name = {0}; if(w32_dmn_GetThreadDescription != 0) @@ -2213,11 +2267,13 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls) { DMN_Event *e = dmn_event_list_push(arena, &events); e->kind = DMN_EventKind_CreateThread; - e->process = w32_dmn_handle_from_entity(process); - e->thread = w32_dmn_handle_from_entity(thread); - e->arch = thread->arch; - e->code = evt.dwThreadId; - e->string = thread_name; + e->process = w32_dmn_handle_from_entity(process); + e->thread = w32_dmn_handle_from_entity(thread); + e->arch = thread->arch; + e->code = evt.dwThreadId; + e->string = thread_name; + e->stack_pointer = stack_base_vaddr; + e->tls_root_vaddr = tls_root_vaddr; } }break; @@ -3207,78 +3263,6 @@ dmn_process_write(DMN_Handle process, Rng1U64 range, void *src) //- rjf: threads -internal Arch -dmn_arch_from_thread(DMN_Handle handle) -{ - Arch arch = Arch_Null; - DMN_AccessScope - { - W32_DMN_Entity *entity = w32_dmn_entity_from_handle(handle); - arch = entity->arch; - } - return arch; -} - -internal U64 -dmn_stack_base_vaddr_from_thread(DMN_Handle handle) -{ - U64 result = 0; - DMN_AccessScope - { - W32_DMN_Entity *thread = w32_dmn_entity_from_handle(handle); - if(thread->kind == W32_DMN_EntityKind_Thread) - { - W32_DMN_Entity *process = thread->parent; - U64 tlb = thread->thread.thread_local_base; - switch(thread->arch) - { - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - case Arch_x64: - { - U64 stack_base_addr = tlb + 0x8; - w32_dmn_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); - }break; - } - } - } - return result; -} - -internal U64 -dmn_tls_root_vaddr_from_thread(DMN_Handle handle) -{ - U64 result = 0; - DMN_AccessScope - { - W32_DMN_Entity *entity = w32_dmn_entity_from_handle(handle); - if(entity->kind == W32_DMN_EntityKind_Thread) - { - result = entity->thread.thread_local_base; - switch(entity->arch) - { - case Arch_Null: - case Arch_COUNT: - {}break; - case Arch_arm64: - case Arch_arm32: - case Arch_x86: - {NotImplemented;}break; - case Arch_x64: - { - result += 88; - }break; - } - } - } - return result; -} - internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block) { @@ -3303,6 +3287,31 @@ dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block) return result; } +internal B32 +dmn_thread_get_module_tls_vaddr(DMN_Handle thread_handle, DMN_Handle module_handle, U64 *vaddr_out) +{ + B32 result = 0; + DMN_AccessScope + { + W32_DMN_Entity *thread = w32_dmn_entity_from_handle(thread_handle); + W32_DMN_Entity *process = thread->parent; + W32_DMN_Entity *module = w32_dmn_entity_from_handle(module_handle); + Arch arch = thread->arch; + U64 addr_size = byte_size_from_arch(arch); + U64 tls_vaddr = w32_dmn_thread_tls_root_vaddr_from_tlb_vaddr(arch, thread->thread.thread_local_base); + U64 tls_addr_array_vaddr = 0; + if(w32_dmn_process_read_struct(process->handle, tls_vaddr, &tls_addr_array_vaddr) == addr_size) + { + U64 tls_ptr_vaddr = tls_addr_array_vaddr + module->module.tls_index*addr_size; + if(w32_dmn_process_read_struct(process->handle, tls_ptr_vaddr, vaddr_out) == addr_size) + { + result = 1; + } + } + } + return result; +} + //- rjf: system process listing internal void diff --git a/src/win32/demon/win32_demon.h b/src/win32/demon/win32_demon.h index dd16020f..5b45f2ce 100644 --- a/src/win32/demon/win32_demon.h +++ b/src/win32/demon/win32_demon.h @@ -205,6 +205,7 @@ struct W32_DMN_Entity { Rng1U64 vaddr_range; U64 address_of_name_pointer; + U64 tls_index; B32 is_main; B32 name_is_unicode; } @@ -349,6 +350,8 @@ internal DMN_ModuleInfo *w32_dmn_module_info_from_process_module(Arena *arena, H //- rjf: threads internal B32 w32_dmn_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block); internal B32 w32_dmn_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block); +internal U64 w32_dmn_thread_stack_base_vaddr_from_tlb_vaddr(HANDLE process, Arch arch, U64 tlb_vaddr); +internal U64 w32_dmn_thread_tls_root_vaddr_from_tlb_vaddr(Arch arch, U64 tlb_vaddr); //- rjf: remote thread injection internal DWORD w32_dmn_inject_thread(HANDLE process, U64 start_address); diff --git a/src/win32/window_manager/win32_window_manager.c b/src/win32/window_manager/win32_window_manager.c index 00886719..7b209cd5 100644 --- a/src/win32/window_manager/win32_window_manager.c +++ b/src/win32/window_manager/win32_window_manager.c @@ -815,7 +815,7 @@ w32_wm_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM b } //////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) +//~ rjf: @per_os_impl Main Initialization API (Implemented Per-OS) internal void wm_init(void) @@ -995,7 +995,7 @@ wm_init(void) } //////////////////////////////// -//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) +//~ rjf: @per_os_impl Graphics System Info (Implemented Per-OS) internal WM_SystemInfo * wm_get_system_info(void) @@ -1004,7 +1004,7 @@ wm_get_system_info(void) } //////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) +//~ rjf: @per_os_impl Clipboards (Implemented Per-OS) internal void wm_set_clipboard_text(String8 string) @@ -1053,7 +1053,7 @@ wm_get_clipboard_text(Arena *arena) } //////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) +//~ rjf: @per_os_impl Windows (Implemented Per-OS) internal WM_Window wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) @@ -1385,7 +1385,7 @@ wm_dpi_from_window(WM_Window handle) } //////////////////////////////// -//~ rjf: @os_hooks External Windows (Implemented Per-OS) +//~ rjf: @per_os_impl External Windows (Implemented Per-OS) internal WM_ExtWindow wm_focused_external_window(void) @@ -1407,7 +1407,7 @@ wm_focus_external_window(WM_ExtWindow handle) } //////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) +//~ rjf: @per_os_impl Monitors (Implemented Per-OS) internal WM_MonitorArray wm_push_monitors_array(Arena *arena) @@ -1494,7 +1494,7 @@ wm_dpi_from_monitor(WM_Monitor monitor) } //////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) +//~ rjf: @per_os_impl Events (Implemented Per-OS) internal void wm_send_wakeup_event(void) @@ -1573,7 +1573,7 @@ wm_mouse_from_window(WM_Window handle) } //////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) +//~ rjf: @per_os_impl Cursors (Implemented Per-OS) internal void wm_set_cursor(WM_Cursor cursor) @@ -1615,7 +1615,7 @@ hcursor = curs; }break; } //////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) +//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS) internal void wm_graphical_message(B32 error, String8 title, String8 message) @@ -1651,7 +1651,7 @@ wm_graphical_pick_file(Arena *arena, String8 initial_path) } //////////////////////////////// -//~ rjf: @os_hooks Shell Operations +//~ rjf: @per_os_impl Shell Operations internal void wm_show_in_filesystem_ui(String8 path) diff --git a/src/window_manager/window_manager.h b/src/window_manager/window_manager.h index c17f9c7c..b663d1ec 100644 --- a/src/window_manager/window_manager.h +++ b/src/window_manager/window_manager.h @@ -161,23 +161,23 @@ internal void wm_event_list_concat_in_place(WM_EventList *dst, WM_EventList *to_ internal WM_Event *wm_event_list_push_new(Arena *arena, WM_EventList *evts, WM_EventKind kind); //////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) +//~ rjf: @per_os_impl Main Initialization API (Implemented Per-OS) internal void wm_init(void); //////////////////////////////// -//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) +//~ rjf: @per_os_impl Graphics System Info (Implemented Per-OS) internal WM_SystemInfo *wm_get_system_info(void); //////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) +//~ rjf: @per_os_impl Clipboards (Implemented Per-OS) internal void wm_set_clipboard_text(String8 string); internal String8 wm_get_clipboard_text(Arena *arena); //////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) +//~ rjf: @per_os_impl Windows (Implemented Per-OS) internal WM_Window wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title); internal void wm_window_close(WM_Window window); @@ -202,13 +202,13 @@ internal Rng2F32 wm_client_rect_from_window(WM_Window window); internal F32 wm_dpi_from_window(WM_Window window); //////////////////////////////// -//~ rjf: @os_hooks External Windows (Implemented Per-OS) +//~ rjf: @per_os_impl External Windows (Implemented Per-OS) internal WM_ExtWindow wm_focused_external_window(void); internal void wm_focus_external_window(WM_ExtWindow ext_window); //////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) +//~ rjf: @per_os_impl Monitors (Implemented Per-OS) internal WM_MonitorArray wm_push_monitors_array(Arena *arena); internal WM_Monitor wm_primary_monitor(void); @@ -218,7 +218,7 @@ internal Vec2F32 wm_dim_from_monitor(WM_Monitor monitor); internal F32 wm_dpi_from_monitor(WM_Monitor monitor); //////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) +//~ rjf: @per_os_impl Events (Implemented Per-OS) internal void wm_send_wakeup_event(void); internal WM_EventList wm_get_events(Arena *arena, B32 wait); @@ -227,18 +227,18 @@ internal B32 wm_key_is_down(WM_Key key); internal Vec2F32 wm_mouse_from_window(WM_Window window); //////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) +//~ rjf: @per_os_impl Cursors (Implemented Per-OS) internal void wm_set_cursor(WM_Cursor cursor); //////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) +//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS) internal void wm_graphical_message(B32 error, String8 title, String8 message); internal String8 wm_graphical_pick_file(Arena *arena, String8 initial_path); //////////////////////////////// -//~ rjf: @os_hooks Shell Operations +//~ rjf: @per_os_impl Shell Operations internal void wm_show_in_filesystem_ui(String8 path); internal void wm_open_in_browser(String8 url); diff --git a/src/window_manager/window_manager_stub.c b/src/window_manager/window_manager_stub.c index 060cd161..0bb99c47 100644 --- a/src/window_manager/window_manager_stub.c +++ b/src/window_manager/window_manager_stub.c @@ -1,5 +1,5 @@ //////////////////////////////// -//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS) +//~ rjf: @per_os_impl Main Initialization API (Implemented Per-OS) internal void wm_init(void) @@ -7,7 +7,7 @@ wm_init(void) } //////////////////////////////// -//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS) +//~ rjf: @per_os_impl Graphics System Info (Implemented Per-OS) internal WM_SystemInfo * wm_get_system_info(void) @@ -18,7 +18,7 @@ wm_get_system_info(void) } //////////////////////////////// -//~ rjf: @os_hooks Clipboards (Implemented Per-OS) +//~ rjf: @per_os_impl Clipboards (Implemented Per-OS) internal void wm_set_clipboard_text(String8 string) @@ -32,7 +32,7 @@ wm_get_clipboard_text(Arena *arena) } //////////////////////////////// -//~ rjf: @os_hooks Windows (Implemented Per-OS) +//~ rjf: @per_os_impl Windows (Implemented Per-OS) internal WM_Window wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) @@ -151,7 +151,7 @@ wm_dpi_from_window(WM_Window window) } //////////////////////////////// -//~ rjf: @os_hooks External Windows (Implemented Per-OS) +//~ rjf: @per_os_impl External Windows (Implemented Per-OS) internal WM_ExtWindow wm_focused_external_window(void) @@ -166,7 +166,7 @@ wm_focus_external_window(WM_ExtWindow handle) } //////////////////////////////// -//~ rjf: @os_hooks Monitors (Implemented Per-OS) +//~ rjf: @per_os_impl Monitors (Implemented Per-OS) internal WM_MonitorArray wm_push_monitors_array(Arena *arena) @@ -209,7 +209,7 @@ wm_dpi_from_monitor(WM_Monitor monitor) } //////////////////////////////// -//~ rjf: @os_hooks Events (Implemented Per-OS) +//~ rjf: @per_os_impl Events (Implemented Per-OS) internal void wm_send_wakeup_event(void) @@ -243,7 +243,7 @@ wm_mouse_from_window(WM_Window window) } //////////////////////////////// -//~ rjf: @os_hooks Cursors (Implemented Per-OS) +//~ rjf: @per_os_impl Cursors (Implemented Per-OS) internal void wm_set_cursor(WM_Cursor cursor) @@ -251,7 +251,7 @@ wm_set_cursor(WM_Cursor cursor) } //////////////////////////////// -//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS) +//~ rjf: @per_os_impl Native User-Facing Graphical Messages (Implemented Per-OS) internal void wm_graphical_message(B32 error, String8 title, String8 message) @@ -265,7 +265,7 @@ wm_graphical_pick_file(Arena *arena, String8 initial_path) } //////////////////////////////// -//~ rjf: @os_hooks Shell Operations +//~ rjf: @per_os_impl Shell Operations internal void wm_show_in_filesystem_ui(String8 path) From ef5fc82e9c7e3a4833365cc3beb34600e338c69f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 11:31:02 -0700 Subject: [PATCH 720/850] dead code elimination --- project.4coder | 2 +- src/dbg_engine/dbg_engine_ctrl.c | 1279 ----------------- src/dbg_engine/dbg_engine_ctrl.h | 26 - src/dwarf/dwarf.c | 324 ----- src/dwarf/dwarf.h | 42 - src/dwarf/dwarf_inc.c | 8 - src/dwarf/dwarf_inc.h | 8 - src/dwarf/dwarf_writer.c | 2 + src/dwarf/dwarf_writer.h | 2 + src/dwarf/tests/dwarf_tests.c | 2 +- src/eh_frame/eh_frame.c | 284 +--- src/eh_frame/eh_frame.h | 12 +- .../tests/rdi_from_dwarf_tests.c | 2 +- 13 files changed, 40 insertions(+), 1953 deletions(-) diff --git a/project.4coder b/project.4coder index 2f198477..14cc2147 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index cf494e69..918390fc 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1746,75 +1746,6 @@ d_cached_sp_from_thread(D_Handle handle) //- rjf: cache lookups -#if 0 // TODO(rjf): @unwind -internal PE_IntelPdata * -d_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff) -{ - PE_IntelPdata *first_pdata = 0; - { - U64 hash = d_hash_from_handle(module_handle); - U64 slot_idx = hash%d_ctrl_state->module_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_info_cache.stripes_count; - D_ModuleInfoCacheSlot *slot = &d_ctrl_state->module_info_cache.slots[slot_idx]; - D_ModuleInfoCacheStripe *stripe = &d_ctrl_state->module_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for(D_ModuleInfoCacheNode *n = slot->first; n != 0; n = n->next) - { - if(d_handle_match(n->module, module_handle)) - { - PE_IntelPdata *pdatas = n->pdatas; - U64 pdatas_count = n->pdatas_count; - if(n->pdatas_count != 0 && voff >= n->pdatas[0].voff_first) - { - // NOTE(rjf): - // - // binary search: - // find max index s.t. pdata_array[index].voff_first <= voff - // we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first) - U64 index = pdatas_count; - U64 min = 0; - U64 opl = pdatas_count; - for(;;) - { - U64 mid = (min + opl)/2; - PE_IntelPdata *pdata = pdatas + mid; - if(voff < pdata->voff_first) - { - opl = mid; - } - else if(pdata->voff_first < voff) - { - min = mid; - } - else - { - index = mid; - break; - } - if(min + 1 >= opl) - { - index = min; - break; - } - } - - // rjf: if we are in range fill result - { - PE_IntelPdata *pdata = pdatas + index; - if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last) - { - first_pdata = push_array(arena, PE_IntelPdata, 1); - MemoryCopyStruct(first_pdata, pdata); - } - } - } - break; - } - } - } - return first_pdata; -} -#endif - internal D_ModuleInfo * d_info_from_module(Access *access, D_Handle module) { @@ -1859,1146 +1790,6 @@ d_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle) //////////////////////////////// //~ rjf: Unwinding Functions -#if 0 // TODO(rjf): @unwind - -//- rjf: [dwarf] - -typedef struct D_MemoryReadContextDwarfX64 D_MemoryReadContextDwarfX64; -struct D_MemoryReadContextDwarfX64 -{ - D_Handle process_handle; - U64 endt_us; -}; - -internal MACHINE_OP_MEM_READ(ctrl_machine_mem_read) -{ - D_MemoryReadContextDwarfX64 *ctx = ud; - B32 is_stale = 0; - B32 is_read = d_process_memory_read(ctx->process_handle, r1u64(addr, addr + buffer_size), &is_stale, buffer, ctx->endt_us); - MachineOpResult status = MachineOpResult_Fail; - if(is_stale) - { - status = MachineOpResult_Maybe; - } - else if(is_read) - { - status = MachineOpResult_Ok; - } - return status; -} - -internal D_UnwindStepResult -d_unwind_step_result_from_machine_op_result(MachineOpResult s) -{ - D_UnwindStepResult result = {0}; - switch(s) - { - default:{result.flags |= D_UnwindFlag_Error;}break; - case MachineOpResult_Null:{}break; - case MachineOpResult_Ok: - { - result.flags &= ~(D_UnwindFlag_Error|D_UnwindFlag_Stale); - }break; - case MachineOpResult_Fail: - { - result.flags |= D_UnwindFlag_Error; - }break; - case MachineOpResult_Maybe: - { - result.flags &= ~D_UnwindFlag_Error; - result.flags |= D_UnwindFlag_Stale; - }break; - } - return result; -} - -internal D_UnwindStepResult -d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out) -{ - Temp scratch = scratch_begin(&arena, 1); - ARCH_Info *arch_info = arch_info_from_arch(arch); - D_UnwindStepResult result = { .flags = D_UnwindFlag_Error }; - - // gather context for virtual stack unwinder - U64 cfi_rebase = 0; - B32 is_unwind_eh = 0; - String8 unwind_data = {0}; - EH_FrameHdr eh_frame_hdr = {0}; - EH_PtrCtx eh_ptr_ctx = {0}; - { - U64 hash = d_hash_from_handle(module_handle); - U64 slot_idx = hash%d_ctrl_state->module_info_cache.slots_count; - U64 stripe_idx = slot_idx%d_ctrl_state->module_info_cache.stripes_count; - D_ModuleInfoCacheSlot *slot = &d_ctrl_state->module_info_cache.slots[slot_idx]; - D_ModuleInfoCacheStripe *stripe = &d_ctrl_state->module_info_cache.stripes[stripe_idx]; - MutexScopeR(stripe->rw_mutex) for EachNode(n, D_ModuleInfoCacheNode, slot->first) - { - if(d_handle_match(n->module, module_handle)) - { - cfi_rebase = n->cfi_rebase; - is_unwind_eh = n->is_unwind_eh; - unwind_data = n->dwarf_unwind_data; - eh_frame_hdr = n->eh_frame_hdr; - eh_ptr_ctx = n->eh_ptr_ctx; - break; - } - } - } - - // grab IP - U64 ip = arch_ip_from_reg_block(arch_info, regs); - - // use .eh_frame_hdr to quickly locate nearest FDE - U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, ip); - - if(fde_addr != max_U64) - { - // parse call frame info - DW_CIE cie = {0}; - DW_FDE fde = {0}; - B32 is_cfi_parsed = 0; - if(is_unwind_eh) - { - B32 is_stale = 0; - - // extract FDE info - Rng1U64 fde_vrange = {0}; - DW_Format fde_format = DW_Format_Null; - String8 fde_data = {0}; - U64 cie_addr = 0; - { - // parse FDE length - U32 first_four_bytes = 0; - if(!d_process_memory_read_struct(process_handle, fde_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } - if(first_four_bytes == max_U32) - { - U64 length = 0; - if(!d_process_memory_read_struct(process_handle, fde_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } - fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + length); - fde_format = DW_Format_64Bit; - } - else - { - fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + first_four_bytes); - fde_format = DW_Format_32Bit; - } - - // read out whole FDE - void *fde_raw = push_array(scratch.arena, U8, dim_1u64(fde_vrange)); - if(!d_process_memory_read(process_handle, fde_vrange, &is_stale, fde_raw, endt_us)) { goto eh_parse_exit; } - fde_data = str8(fde_raw, dim_1u64(fde_vrange)); - - // compute CIE address - U64 cie_delta_off = fde_format == DW_Format_32Bit ? 4 : 12; - U64 cie_delta = 0; - U64 cie_delta_size = str8_deserial_read_dwarf_uint(fde_data, cie_delta_off, fde_format, &cie_delta); - if (cie_delta_size == 0) { goto eh_parse_exit; } - cie_addr = (fde_addr + cie_delta_off) - cie_delta; - } - - // extract CIE info - Rng1U64 cie_vrange = {0}; - DW_Format cie_format = DW_Format_Null; - String8 cie_data = {0}; - { - // parse CIE length - U32 first_four_bytes = 0; - if(!d_process_memory_read_struct(process_handle, cie_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; } - if(first_four_bytes == max_U32) - { - U64 length = 0; - if(!d_process_memory_read_struct(process_handle, cie_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; } - cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + length); - cie_format = DW_Format_64Bit; - } - else - { - cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + first_four_bytes); - cie_format = DW_Format_32Bit; - } - - // read out whole CIE - void *cie_raw = push_array(scratch.arena, U8, dim_1u64(cie_vrange)); - if(!d_process_memory_read(process_handle, cie_vrange, &is_stale, cie_raw, endt_us)) { goto eh_parse_exit; } - cie_data = str8(cie_raw, dim_1u64(cie_vrange)); - } - - // parse CIE and FDE - if(eh_parse_cie(cie_data, cie_format, arch, cie_vrange.min, &eh_ptr_ctx, &cie)) - { - is_cfi_parsed = eh_parse_fde(fde_data, fde_format, fde_vrange.min, &cie, &eh_ptr_ctx, &fde); - } - - eh_parse_exit:; - if(is_stale) - { - result.flags = D_UnwindFlag_Stale; - } - } - else - { - is_cfi_parsed = dw_parse_cfi(unwind_data, fde_addr, arch, &cie, &fde); - } - - if(is_cfi_parsed && contains_1u64(fde.pc_range, ip)) - { - // setup pointer decoder ops - DW_DecodePtr *decode_ptr_func = 0; - void *decode_ptr_ctx = 0; - if(is_unwind_eh) - { - EH_DecodePtrCtx *decode_ptr_ctx_eh = push_array(scratch.arena, EH_DecodePtrCtx, 1); - decode_ptr_ctx_eh->ptr_ctx = &eh_ptr_ctx; - decode_ptr_ctx_eh->addr_enc = cie.ext[EH_CIE_Ext_AddrEnc]; - - decode_ptr_func = eh_decode_ptr; - decode_ptr_ctx = decode_ptr_ctx_eh; - } - else - { - decode_ptr_func = dw_decode_ptr_debug_frame; - decode_ptr_ctx = &cie; - } - - // find register rules for IP - DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, ip); - if(cfi_row) - { - // setup machine ops - void *mem_read_ctx = 0; - MachineOp_MemRead *mem_read_func = 0; - switch(arch) - { - case Arch_Null: break; - case Arch_x64: - { - D_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, D_MemoryReadContextDwarfX64, 1); - mem_read_ctx_x64->process_handle = process_handle; - mem_read_ctx_x64->endt_us = endt_us; - mem_read_ctx = mem_read_ctx_x64; - mem_read_func = ctrl_machine_mem_read; - }break; - case Arch_x86: - case Arch_arm64: - case Arch_arm32: - { - NotImplemented; - }break; - default: { InvalidPath; }break; - } - - // compute CFA for the row - U64 cfa = 0; - MachineOpResult unwind_status = dw_compute_cfa(arch, cfi_row, regs, mem_read_func, mem_read_ctx, &cfa); - - // on success fill out output - if(unwind_status == MachineOpResult_Ok) - { - ctx_out->cfa = cfa; - ctx_out->cfi_row = cfi_row; - ctx_out->ret_addr_reg = cie.ret_addr_reg; - } - - // translate unwind status code - result = d_unwind_step_result_from_machine_op_result(unwind_status); - } - } - } - - scratch_end(scratch); - return result; -} - -internal D_UnwindStepResult -d_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us) -{ - Temp scratch = scratch_begin(0, 0); - - D_UnwindStepResult result = { .flags = D_UnwindFlag_Error }; - - // setup machine ops - void *mem_read_ctx = 0; - void *reg_read_ctx = 0; - void *reg_write_ctx = 0; - MachineOp_MemRead *mem_read_func = 0; - MachineOp_RegRead *reg_read_func = 0; - MachineOp_RegWrite *reg_write_func = 0; - switch(arch) - { - default: - case Arch_Null:{}break; - case Arch_x64: - { - D_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, D_MemoryReadContextDwarfX64, 1); - mem_read_ctx_x64->process_handle = process_handle; - mem_read_ctx_x64->endt_us = endt_us; - mem_read_ctx = mem_read_ctx_x64; - reg_read_ctx = regs; - reg_write_ctx = regs; - mem_read_func = ctrl_machine_mem_read; - }break; - } - - // apply register rules to the context - MachineOpResult unwind_status = dw_cfi_apply_register_rules(arch, frame_ctx->cfa, frame_ctx->cfi_row, regs, mem_read_func, mem_read_ctx); - - // last frame typically has undefined rule for IP - if(frame_ctx->cfi_row->regs[frame_ctx->ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined) - { - ARCH_Info *arch_info = arch_info_from_arch(arch); - arch_reg_block_write_ip(arch_info, regs, 0); - } - - // translate unwind status code - result = d_unwind_step_result_from_machine_op_result(unwind_status); - - scratch_end(scratch); - return result; -} - -//- rjf: [x64] - -internal U64 * -d_unwind_reg_from_pe_gpr_reg__pe_x64(X64_RegBlock *regs, PE_UnwindGprRegX64 gpr_reg) -{ - local_persist U64 dummy = {0}; - U64 *result = &dummy; - switch(gpr_reg) - { - case PE_UnwindGprRegX64_RAX:{result = ®s->rax;}break; - case PE_UnwindGprRegX64_RCX:{result = ®s->rcx;}break; - case PE_UnwindGprRegX64_RDX:{result = ®s->rdx;}break; - case PE_UnwindGprRegX64_RBX:{result = ®s->rbx;}break; - case PE_UnwindGprRegX64_RSP:{result = ®s->rsp;}break; - case PE_UnwindGprRegX64_RBP:{result = ®s->rbp;}break; - case PE_UnwindGprRegX64_RSI:{result = ®s->rsi;}break; - case PE_UnwindGprRegX64_RDI:{result = ®s->rdi;}break; - case PE_UnwindGprRegX64_R8 :{result = ®s->r8 ;}break; - case PE_UnwindGprRegX64_R9 :{result = ®s->r9 ;}break; - case PE_UnwindGprRegX64_R10:{result = ®s->r10;}break; - case PE_UnwindGprRegX64_R11:{result = ®s->r11;}break; - case PE_UnwindGprRegX64_R12:{result = ®s->r12;}break; - case PE_UnwindGprRegX64_R13:{result = ®s->r13;}break; - case PE_UnwindGprRegX64_R14:{result = ®s->r14;}break; - case PE_UnwindGprRegX64_R15:{result = ®s->r15;}break; - } - return result; -} - -internal D_UnwindStepResult -d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, X64_RegBlock *regs, U64 endt_us) -{ - B32 is_stale = 0; - B32 is_good = 1; - Temp scratch = scratch_begin(0, 0); - - ////////////////////////////// - //- rjf: unpack parameters - // - U64 rip_voff = regs->rip - module_base_vaddr; - - ////////////////////////////// - //- rjf: rip_voff -> first pdata - // - PE_IntelPdata *first_pdata = d_intel_pdata_from_module_voff(scratch.arena, module_handle, rip_voff); - - ////////////////////////////// - //- rjf: pdata -> detect if in epilog - // - B32 has_pdata_and_in_epilog = 0; - if(first_pdata) ProfScope("pdata -> detect if in epilog") - { - // NOTE(allen): There are restrictions placed on how an epilog is allowed - // to be formed (https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-160) - // Here we interpret machine code directly according to the rules - // given there to determine if the code we're looking at looks like an epilog. - - //- rjf: set up parsing state - B32 is_epilog = 0; - B32 keep_parsing = 1; - U64 read_vaddr = regs->rip; - U64 read_vaddr_opl = read_vaddr + 256; - - //- rjf: check first instruction - { - B32 inst_good = 0; - U8 inst[4] = {0}; - if(read_vaddr + sizeof(inst) <= read_vaddr_opl) - { - inst_good = d_process_memory_read(process_handle, r1u64(read_vaddr, read_vaddr+sizeof(inst)), &is_stale, inst, endt_us); - inst_good = inst_good && !is_stale; - } - if(!inst_good) - { - keep_parsing = 0; - } - else if((inst[0] & 0xF8) == 0x48) - { - switch(inst[1]) - { - // rjf: add $nnnn,%rsp - case 0x81: - { - if(inst[0] == 0x48 && inst[2] == 0xC4) - { - read_vaddr += 7; - } - else - { - keep_parsing = 0; - } - }break; - - // rjf: add $n,%rsp - case 0x83: - { - if(inst[0] == 0x48 && inst[2] == 0xC4) - { - read_vaddr += 4; - } - else - { - keep_parsing = 0; - } - }break; - - // rjf: lea n(reg),%rsp - case 0x8D: - { - if((inst[0] & 0x06) == 0 && - ((inst[2] >> 3) & 0x07) == 0x04 && - (inst[2] & 0x07) != 0x04) - { - U8 imm_size = (inst[2] >> 6); - - // rjf: 1-byte immediate - if(imm_size == 1) - { - read_vaddr += 4; - } - - // rjf: 4-byte immediate - else if(imm_size == 2) - { - read_vaddr += 7; - } - - // rjf: other case - else - { - keep_parsing = 0; - } - } - else - { - keep_parsing = 0; - } - }break; - } - } - } - - //- rjf: continue parsing instructions - for(;keep_parsing;) - { - // rjf: read next instruction byte - B32 inst_byte_good = 0; - U8 inst_byte = 0; - if(read_vaddr + sizeof(inst_byte) <= read_vaddr_opl) - { - inst_byte_good = d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); - } - if(!inst_byte_good || is_stale) - { - keep_parsing = 0; - } - - // rjf: when (... I don't know ...) rely on the next byte - B32 check_inst_byte_good = inst_byte_good; - U64 check_vaddr = read_vaddr; - U8 check_inst_byte = inst_byte; - if(inst_byte_good && (inst_byte & 0xF0) == 0x40) - { - check_vaddr = read_vaddr + 1; - if(read_vaddr + sizeof(check_inst_byte) <= read_vaddr_opl) - { - check_inst_byte_good = d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &check_inst_byte, endt_us); - } - if(!check_inst_byte_good || is_stale) - { - keep_parsing = 0; - } - } - - // rjf: check instruction byte - if(check_inst_byte_good) - { - switch(check_inst_byte) - { - // rjf: pop - case 0x58:case 0x59:case 0x5A:case 0x5B: - case 0x5C:case 0x5D:case 0x5E:case 0x5F: - { - read_vaddr = check_vaddr + 1; - }break; - - // rjf: ret - case 0xC2: - case 0xC3: - { - is_epilog = 1; - keep_parsing = 0; - }break; - - // rjf: jmp nnnn - case 0xE9: - { - U64 imm_vaddr = check_vaddr + 1; - S32 imm = 0; - B32 imm_good = 0; - if(read_vaddr + sizeof(imm) <= read_vaddr_opl) - { - imm_good = d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us); - } - if(!imm_good || is_stale) - { - keep_parsing = 0; - } - if(imm_good) - { - U64 next_vaddr = (U64)(imm_vaddr + sizeof(imm) + imm); - U64 next_voff = next_vaddr - module_base_vaddr; // TODO(rjf): verify that this offset is from module base vaddr, not section - if(!(first_pdata->voff_first <= next_voff && next_voff < first_pdata->voff_one_past_last)) - { - keep_parsing = 0; - } - else - { - read_vaddr = next_vaddr; - } - } - // TODO(allen): why isn't this just the end of the epilog? - }break; - - // rjf: rep; ret (for amd64 prediction bug) - case 0xF3: - { - U8 next_inst_byte = 0; - B32 next_inst_byte_good = 0; - if(read_vaddr + sizeof(next_inst_byte) <= read_vaddr_opl) - { - next_inst_byte_good = d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &next_inst_byte, endt_us); - } - if(next_inst_byte_good) - { - is_epilog = (next_inst_byte == 0xC3); - } - keep_parsing = 0; - }break; - - default:{keep_parsing = 0;}break; - } - } - } - has_pdata_and_in_epilog = is_epilog; - } - - ////////////////////////////// - //- rjf: pdata & in epilog -> epilog unwind - // - if(first_pdata && has_pdata_and_in_epilog) ProfScope("pdata & in epilog -> epilog unwind") - { - U64 read_vaddr = regs->rip; - for(B32 keep_parsing = 1;keep_parsing != 0;) - { - //- rjf: assume no more parsing after this instruction - keep_parsing = 0; - - //- rjf: read next instruction byte - U8 inst_byte = 0; - is_good = is_good && d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); - is_good = is_good && !is_stale; - read_vaddr += 1; - - //- rjf: extract rex from instruction byte - U8 rex = 0; - if((inst_byte & 0xF0) == 0x40) - { - rex = inst_byte & 0xF; // rex prefix - is_good = is_good && d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us); - is_good = is_good && !is_stale; - read_vaddr += 1; - } - - //- rjf: parse remainder of instruction - switch(inst_byte) - { - // rjf: pop - case 0x58: - case 0x59: - case 0x5A: - case 0x5B: - case 0x5C: - case 0x5D: - case 0x5E: - case 0x5F: - { - // rjf: read value at rsp - U64 sp = regs->rsp; - U64 value = 0; - if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &value, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: modify registers - PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; - U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); - reg[0] = value; - regs->rsp = sp + 8; - - // rjf: not a final instruction, so keep mparsing - keep_parsing = 1; - }break; - - // rjf: add $nnnn,%rsp - case 0x81: - { - // rjf: skip one byte (we already know what it is in this scenario) - read_vaddr += 1; - - // rjf: read the 4-byte immediate - S32 imm = 0; - if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 4; - - // rjf: update stack pointer - regs->rsp = (U64)(regs->rsp + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: add $n,%rsp - case 0x83: - { - // rjf: skip one byte (we already know what it is in this scenario) - read_vaddr += 1; - - // rjf: read the 4-byte immediate - S8 imm = 0; - if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - - // rjf: update stack pointer - regs->rsp = (U64)(regs->rsp + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: lea imm8/imm32,$rsp - case 0x8D: - { - // rjf: read source register - U8 modrm = 0; - if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &modrm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; - U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg); - U64 reg_value = reg[0]; - - // rjf: read immediate - S32 imm = 0; - { - // rjf: read 1-byte immediate - if((modrm >> 6) == 1) - { - S8 imm8 = 0; - if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm8, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 1; - imm = (S32)imm8; - } - - // rjf: read 4-byte immediate - else - { - if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - read_vaddr += 4; - } - } - - // rjf: update stack pointer - regs->rsp = (U64)(reg_value + imm); - - // rjf: not a final instruction; keep parsing - keep_parsing = 1; - }break; - - // rjf: ret $nn - case 0xC2: - { - // rjf: read new ip - U64 sp = regs->rsp; - U64 new_ip = 0; - if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: read 2-byte immediate & advance stack pointer - U16 imm = 0; - if(!d_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) || - is_stale) - { - is_good = 0; - break; - } - U64 new_sp = sp + 8 + imm; - - // rjf: commit registers - regs->rip = new_ip; - regs->rsp = new_sp; - }break; - - // rjf: ret / rep; ret - case 0xF3: - { - // Assert(!"Hit me!"); - }break; - case 0xC3: - { - // rjf: read new ip - U64 sp = regs->rsp; - U64 new_ip = 0; - if(!d_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) || - is_stale) - { - is_good = 0; - break; - } - - // rjf: advance stack pointer - U64 new_sp = sp + 8; - - // rjf: commit registers - regs->rip = new_ip; - regs->rsp = new_sp; - }break; - - // rjf: jmp nnnn - case 0xE9: - { - // Assert(!"Hit Me"); - // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done - // we don't have any cases to exercise this right now. no guess implementation! - }break; - - // rjf: Sjmp n - case 0xEB: - { - // Assert(!"Hit Me"); - // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done - // we don't have any cases to exercise this right now. no guess implementation! - }break; - } - } - } - - ////////////////////////////// - //- rjf: pdata & not in epilog -> xdata unwind - // - B32 xdata_unwind_did_machframe = 0; - if(first_pdata && !has_pdata_and_in_epilog) ProfScope("pdata & not in epilog -> xdata unwind") - { - //- rjf: get frame reg - B32 bad_frame_reg_info = 0; - U64 *frame_reg = 0; - U64 frame_off = 0; - { - U64 unwind_info_off = first_pdata->voff_unwind_info; - PE_UnwindInfo unwind_info = {0}; - if(!d_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us) || - is_stale) - { - is_good = 0; - } - U32 frame_reg_id = PE_UNWIND_INFO_REG_FROM_FRAME(unwind_info.frame); - U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info.frame); - if(frame_reg_id != 0) - { - frame_reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, frame_reg_id); - bad_frame_reg_info = (frame_reg == 0); // NOTE(rjf): frame_reg should never be 0 at this point, in valid exe - } - frame_off = frame_off_val; - } - - //- rjf: iterate pdatas, apply opcodes - PE_IntelPdata *last_pdata = 0; - PE_IntelPdata *pdata = first_pdata; - if(!bad_frame_reg_info) for(B32 keep_parsing = 1; keep_parsing && pdata != last_pdata;) - { - //- rjf: unpack unwind info & codes - B32 good_unwind_info = 1; - U64 unwind_info_off = pdata->voff_unwind_info; - PE_UnwindInfo unwind_info = {0}; - good_unwind_info = good_unwind_info && d_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us); - PE_UnwindCode *unwind_codes = push_array(scratch.arena, PE_UnwindCode, unwind_info.codes_num); - good_unwind_info = good_unwind_info && d_process_memory_read(process_handle, r1u64(module_base_vaddr+unwind_info_off+sizeof(unwind_info), - module_base_vaddr+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num), - &is_stale, unwind_codes, endt_us); - good_unwind_info = good_unwind_info && !is_stale; - - //- rjf: bad unwind info -> abort - if(!good_unwind_info) - { - is_good = 0; - break; - } - - //- rjf: unpack frame base - U64 frame_base = regs->rsp; - if(frame_reg != 0) - { - U64 raw_frame_base = frame_reg[0]; - U64 adjusted_frame_base = raw_frame_base - frame_off*16; - frame_base = adjusted_frame_base; - } - - //- rjf: apply opcodes - PE_UnwindCode *code_ptr = unwind_codes; - PE_UnwindCode *code_opl = unwind_codes + unwind_info.codes_num; - for(PE_UnwindCode *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr) - { - // rjf: unpack opcode info - U32 op_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr->flags); - U32 op_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr->flags); - U32 slot_count = pe_slot_count_from_unwind_op_code(op_code); - if(op_code == PE_UnwindOpCode_ALLOC_LARGE && op_info == 1) - { - slot_count += 1; - } - - // rjf: detect bad slot counts - if(slot_count == 0 || code_ptr+slot_count > code_opl) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: set next op code pointer - next_code_ptr = code_ptr + slot_count; - - // rjf: interpret this op code - U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog; - if(code_voff <= rip_voff) - { - switch(op_code) - { - case PE_UnwindOpCode_PUSH_NONVOL: - { - // rjf: read value from stack pointer - U64 rsp = regs->rsp; - U64 value = 0; - if(!d_process_memory_read_struct(process_handle, rsp, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: advance stack ptr - U64 new_rsp = rsp + 8; - - // rjf: commit registers - U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg[0] = value; - regs->rsp = new_rsp; - }break; - - case PE_UnwindOpCode_ALLOC_LARGE: - { - // rjf: read alloc size - U64 size = 0; - if(op_info == 0) - { - size = code_ptr[1].u16*8; - } - else if(op_info == 1) - { - size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - } - else - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: advance stack pointer - U64 rsp = regs->rsp; - U64 new_rsp = rsp + size; - - // rjf: advance stack pointer - regs->rsp = new_rsp; - }break; - - case PE_UnwindOpCode_ALLOC_SMALL: - { - // rjf: advance stack pointer - regs->rsp += op_info*8 + 8; - }break; - - case PE_UnwindOpCode_SET_FPREG: - { - // rjf: put stack pointer back to the frame base - regs->rsp = frame_base; - }break; - - case PE_UnwindOpCode_SAVE_NONVOL: - { - // rjf: read value from frame base - U64 off = code_ptr[1].u16*8; - U64 addr = frame_base + off; - U64 value = 0; - if(!d_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg[0] = value; - }break; - - case PE_UnwindOpCode_SAVE_NONVOL_FAR: - { - // rjf: read value from frame base - U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - U64 addr = frame_base + off; - U64 value = 0; - if(!d_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - U64 *reg = d_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info); - reg[0] = value; - }break; - - case PE_UnwindOpCode_EPILOG: - { - keep_parsing = 1; - }break; - - case PE_UnwindOpCode_SPARE_CODE: - { - // TODO(rjf): ??? - keep_parsing = 0; - is_good = 0; - }break; - - case PE_UnwindOpCode_SAVE_XMM128: - { - // rjf: read new register values - U8 buf[16]; - U64 off = code_ptr[1].u16*16; - U64 addr = frame_base + off; - if(!d_process_memory_read(process_handle, r1u64(addr, addr+sizeof(buf)), &is_stale, buf, endt_us)) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - void *xmm_reg = (®s->zmm0) + op_info; - MemoryCopy(xmm_reg, buf, sizeof(buf)); - }break; - - case PE_UnwindOpCode_SAVE_XMM128_FAR: - { - // rjf: read new register values - U8 buf[16]; - U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16); - U64 addr = frame_base + off; - if(!d_process_memory_read(process_handle, r1u64(addr, addr+16), &is_stale, buf, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit to register - void *xmm_reg = (®s->zmm0) + op_info; - MemoryCopy(xmm_reg, buf, sizeof(buf)); - }break; - - case PE_UnwindOpCode_PUSH_MACHFRAME: - { - // NOTE(rjf): this was found by stepping through kernel code after an exception was - // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main - if(op_info > 1) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: read values - U64 sp_og = regs->rsp; - U64 sp_adj = sp_og; - if(op_info == 1) - { - sp_adj += 8; - } - U64 ip_value = 0; - if(!d_process_memory_read_struct(process_handle, sp_adj, &is_stale, &ip_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_ip = sp_adj + 8; - U16 ss_value = 0; - if(!d_process_memory_read_struct(process_handle, sp_after_ip, &is_stale, &ss_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_ss = sp_after_ip + 8; - U64 rflags_value = 0; - if(!d_process_memory_read_struct(process_handle, sp_after_ss, &is_stale, &rflags_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - U64 sp_after_rflags = sp_after_ss + 8; - U64 sp_value = 0; - if(!d_process_memory_read_struct(process_handle, sp_after_rflags, &is_stale, &sp_value, endt_us) || - is_stale) - { - keep_parsing = 0; - is_good = 0; - break; - } - - // rjf: commit registers - regs->rip = ip_value; - regs->ss = ss_value; - regs->rflags = rflags_value; - regs->rsp = sp_value; - - // rjf: mark machine frame - xdata_unwind_did_machframe = 1; - }break; - } - } - } - - //- rjf: iterate to next pdata - if(keep_parsing) - { - U32 flags = PE_UNWIND_INFO_FLAGS_FROM_HDR(unwind_info.header); - if(!(flags & PE_UnwindInfoFlag_CHAINED)) - { - break; - } - U64 code_count_rounded = AlignPow2(unwind_info.codes_num, sizeof(PE_UnwindCode)); - U64 code_size = code_count_rounded*sizeof(PE_UnwindCode); - U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size; - last_pdata = pdata; - pdata = push_array(scratch.arena, PE_IntelPdata, 1); - if(!d_process_memory_read_struct(process_handle, module_base_vaddr+chained_pdata_off, &is_stale, pdata, endt_us) || - is_stale) - { - is_good = 0; - break; - } - } - } - } - - ////////////////////////////// - //- rjf: no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer - // - if(!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe)) ProfScope("no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer") - { - // rjf: read rip from stack pointer - U64 rsp = regs->rsp; - U64 new_rip = 0; - if(!d_process_memory_read_struct(process_handle, rsp, &is_stale, &new_rip, endt_us) || - is_stale) - { - is_good = 0; - } - - // rjf: commit registers - if(is_good) - { - U64 new_rsp = rsp + 8; - regs->rip = new_rip; - regs->rsp = new_rsp; - } - } - - ////////////////////////////// - //- rjf: fill & return - // - scratch_end(scratch); - D_UnwindStepResult result = {0}; - if(!is_good) {result.flags |= D_UnwindFlag_Error;} - if(is_stale) {result.flags |= D_UnwindFlag_Stale;} - return result; -} -#endif - -//- rjf: abstracted full unwind - internal D_Unwind d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) { @@ -3147,76 +1938,6 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) { break; } - -#if 0 // TODO(rjf): @unwind - // rip -> module - D_Entity *module_entity = d_module_from_process_vaddr(process_entity, rip); - - // establish frame context - D_FrameUnwindContext frame_ctx = {0}; - D_UnwindStepResult frame_ctx_result = {0}; - switch(process_entity->target_os) - { - case OperatingSystem_Null:{}break; - case OperatingSystem_Windows: - { - // no concept of frame unwind context - }break; - case OperatingSystem_Linux: - { - frame_ctx_result = d_establish_frame_unwind_context__dwarf(arena, process_entity->handle, module_entity->handle, arch, regs_block, endt_us, &frame_ctx); - }break; - case OperatingSystem_Mac: - { - NotImplemented; - }break; - default: { InvalidPath; }break; - } - unwind.flags |= frame_ctx_result.flags; - if(unwind.flags & (D_UnwindFlag_Stale|D_UnwindFlag_Error)) - { - break; - } - - // rjf: valid step -> push frame - D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1); - D_UnwindFrame *frame = &frame_node->v; - frame->cfa = frame_ctx.cfa; - frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size); - MemoryCopy(frame->regs, regs_block, arch_reg_block_size); - DLLPushBack(first_frame_node, last_frame_node, frame_node); - frame_node_count += 1; - - // rjf: unwind one step - D_UnwindStepResult step_result = {0}; - switch(process_entity->target_os) - { - default:{}break; - case OperatingSystem_Windows: - { - switch(arch) - { - default:{}break; - case Arch_x64: - { - step_result = d_unwind_step__pe_x64(process_entity->handle, module_entity->handle, module_entity->vaddr_range.min, regs_block, endt_us); - }break; - } - }break; - case OperatingSystem_Linux: - { - step_result = d_unwind_step__dwarf(process_entity->handle, arch, regs_block, &frame_ctx, endt_us); - }break; - } - - // rjf: stop unwinding on errors or stale data - unwind.flags |= step_result.flags; - if(unwind.flags & (D_UnwindFlag_Stale|D_UnwindFlag_Error) || - (arch_sp_from_reg_block(arch_info, regs_block) == rsp && arch_ip_from_reg_block(arch_info, regs_block) == rip)) - { - break; - } -#endif } } diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 13d0e926..48616ca3 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -49,17 +49,6 @@ struct D_Unwind D_UnwindFlags flags; }; -#if 0 // TODO(rjf): @unwind -typedef struct D_FrameUnwindContext D_FrameUnwindContext; -struct D_FrameUnwindContext -{ - // DWARF - U64 cfa; - DW_CFI_Row *cfi_row; - U64 ret_addr_reg; -}; -#endif - //////////////////////////////// //~ rjf: Call Stack Types @@ -558,9 +547,6 @@ internal U64 d_cached_sp_from_thread(D_Handle handle); //~ rjf: Module Image Info Functions //- rjf: cache lookups -#if 0 // TODO(rjf): @unwind -internal PE_IntelPdata *d_intel_pdata_from_module_voff(Arena *arena, D_Handle module_handle, U64 voff); -#endif internal D_ModuleInfo *d_info_from_module(Access *access, D_Handle module); internal U64 d_entry_point_voff_from_module(D_Handle module_handle); internal String8 d_initial_debug_info_path_from_module(Arena *arena, D_Handle module_handle); @@ -568,18 +554,6 @@ internal String8 d_initial_debug_info_path_from_module(Arena *arena, D_Handle mo //////////////////////////////// //~ rjf: Unwinding Functions -#if 0 // TODO(rjf): @unwind -//- rjf: [dwarf] -internal D_UnwindStepResult d_unwind_step_result_from_machine_op_result(MachineOpResult s); -internal D_UnwindStepResult d_establish_frame_unwind_context__dwarf(Arena *arena, D_Handle process_handle, D_Handle module_handle, Arch arch, void *regs, U64 endt_us, D_FrameUnwindContext *ctx_out); -internal D_UnwindStepResult d_unwind_step__dwarf(D_Handle process_handle, Arch arch, void *regs, D_FrameUnwindContext *frame_ctx, U64 endt_us); - -//- rjf: [x64] -internal U64 *d_unwind_reg_from_pe_gpr_reg__pe_x64(X64_RegBlock *regs, PE_UnwindGprRegX64 gpr_reg); -internal D_UnwindStepResult d_unwind_step__pe_x64(D_Handle process_handle, D_Handle module_handle, U64 module_base_vaddr, X64_RegBlock *regs, U64 endt_us); -#endif - -//- rjf: abstracted full unwind internal D_Unwind d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us); //////////////////////////////// diff --git a/src/dwarf/dwarf.c b/src/dwarf/dwarf.c index 5d73309e..01e985a0 100644 --- a/src/dwarf/dwarf.c +++ b/src/dwarf/dwarf.c @@ -448,327 +448,3 @@ dw_reg_count_from_arch(Arch arch) } return result; } - -//////////////////////////////// -//~ TODO(rjf): OLD vvvvvvvvvvv - -#if 0 -internal DW_AttribClass -dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k) -{ - DW_AttribClass result = 0; - switch(k) - { - default:{}break; -#define X(name, code, version, ext, class) case DW_FormKind_##name:{result = (class);}break; - DW_FormKind_XList -#undef X - } - return result; -} - -internal U64 -dw_reg_size_from_code(Arch arch, DW_Reg reg_code) -{ - switch (arch) { - case Arch_Null: break; - case Arch_x64: return dw_reg_size_from_code_x64(reg_code); - default: NotImplemented; break; - } - return 0; -} - -internal U64 -dw_reg_pos_from_code(Arch arch, DW_Reg reg_code) -{ - switch (arch) { - case Arch_Null: break; - case Arch_x64: return dw_reg_pos_from_code_x64(reg_code); - default: NotImplemented; break; - } - return max_U64; -} - -internal U64 -dw_reg_count_from_arch(Arch arch) -{ - switch (arch) { - default: { NotImplemented; } // fall-through - case Arch_Null: return 0; - case Arch_x64: return DW_RegX64_Last; - } -} - -internal U64 -dw_reg_max_size_from_arch(Arch arch) -{ - local_persist U64 max_size = 0; - if (max_size == 0) { - U64 max_idx = dw_reg_count_from_arch(arch); - for EachIndex(reg_idx, max_idx) { - U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - max_size = Max(max_size, reg_size); - } - } - return max_size; -} - -internal U64 -dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode) -{ - switch (opcode) { -#define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return ArrayCount(t)-1; } - DW_CFA_Kind_XList -#undef X - default: { NotImplemented; } break; - } - return 0; -} - -internal B32 -dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode) -{ - B32 is_invalid = 0; - switch(opcode) - { - default:{}break; - case DW_ExprOp_Addrx: - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: - case DW_ExprOp_ConstType: - case DW_ExprOp_Constx: - case DW_ExprOp_Convert: - case DW_ExprOp_DerefType: - case DW_ExprOp_RegvalType: - case DW_ExprOp_Reinterpret: - case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_CallFrameCfa: - { - is_invalid = 1; - }break; - } - return is_invalid; -} - -internal B32 -dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode) -{ - B32 is_new_row_op = 0; - switch(opcode) - { - default:{}break; - case DW_CFA_SetLoc: - case DW_CFA_AdvanceLoc: - case DW_CFA_AdvanceLoc1: - case DW_CFA_AdvanceLoc2: - case DW_CFA_AdvanceLoc4: - { - is_new_row_op = 1; - }break; - } - return is_new_row_op; -} - -internal DW_CFA_OperandType * -dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode) -{ - switch (opcode) { -#define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return &t[0] + 1; } - DW_CFA_Kind_XList -#undef X - default: { NotImplemented; } break; - } - return 0; -} - -internal String8 -dw_string_from_language(Arena *arena, DW_Language kind) -{ - switch (kind) { -#define X(_N,_ID) case DW_Language_##_N: return str8_lit(Stringify(_N)); - DW_Language_XList -#undef X - } - return push_str8f(arena, "%x", kind); -} - -internal String8 -dw_string_from_comp_unit_kind(Arena *arena, DW_CompUnitKind kind) -{ - switch (kind) { -#define X(_N,_ID) case DW_CompUnitKind_##_N: return str8_lit(Stringify(_N)); - DW_CompUnitKind_XList -#undef X - } - return push_str8f(arena, "%x", kind); -} - -internal String8 -dw_string_from_inl(Arena *arena, DW_InlKind kind) -{ - switch (kind) { -#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_Inl_XList -#undef X - } - return push_str8f(arena, "%x", kind); -} - -internal String8 -dw_string_from_access_kind(Arena *arena, DW_AccessKind kind) -{ - switch (kind) { -#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_AccessKind_XList -#undef X - } - return push_str8f(arena, "%llx", kind); -} - -internal String8 -dw_string_from_calling_convetion(Arena *arena, DW_CallingConventionKind kind) -{ - switch (kind) { -#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_CallingConventionKind_XList -#undef X - } - return push_str8f(arena, "%llx", kind); -} - -internal String8 -dw_string_from_attrib_type_encoding(Arena *arena, DW_ATE kind) -{ - switch (kind) { -#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_ATE_XList -#undef X - } - return push_str8f(arena, "%llx", kind); -} - -internal String8 -dw_string_from_attrib_visibility(Arena *arena, DW_Vis vis) -{ - switch (vis) { -#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N)); - DW_Vis_XList -#undef X - } - return push_str8f(arena, "%llx", vis); -} - -internal String8 -dw_string_from_std_opcode(Arena *arena, DW_StdOpcode kind) -{ - switch (kind) { -#define X(_N,_ID) case DW_StdOpcode_##_N: return str8_lit(Stringify(_N)); - DW_StdOpcode_XList -#undef X - } - return push_str8f(arena, "%x", kind); -} - -internal String8 -dw_string_from_ext_opcode(Arena *arena, DW_ExtOpcode kind) -{ - switch (kind) { -#define X(_N,_ID) case DW_ExtOpcode_##_N: return str8_lit(Stringify(_N)); - DW_ExtOpcode_XList -#undef X - default: InvalidPath; break; - } - return push_str8f(arena, "%x", kind); -} - -internal String8 -dw_string_from_loc_list_entry_kind(Arena *arena, DW_LLE kind) -{ - NotImplemented; - return str8_zero(); -} - -internal String8 -dw_string_from_section_kind(Arena *arena, DW_SectionKind kind) -{ - NotImplemented; - return str8_zero(); -} - -internal String8 -dw_string_from_rng_list_entry_kind(Arena *arena, DW_RLE kind) -{ - NotImplemented; - return str8_zero(); -} - -internal String8 -dw_string_from_register(Arena *arena, Arch arch, U64 reg_id) -{ - String8 reg_str = str8_zero(); - switch (arch) { - case Arch_Null: break; - case Arch_x64: { - switch (reg_id) { -#define X(_N, _ID, ...) case DW_RegX64_##_N: reg_str = str8_lit(Stringify(_N)); break; - DW_Regs_X64_XList -#undef X - } - } break; - case Arch_arm32: NotImplemented; break; - case Arch_arm64: NotImplemented; break; - case Arch_x86: NotImplemented; break; - default: InvalidPath; break; - } - if (reg_str.size == 0) { - reg_str = push_str8f(arena, "%#llx", reg_id); - } - return reg_str; -} - -internal String8 -dw_string_from_cfa_opcode(DW_CFA_Opcode opcode) -{ - switch (opcode) { -#define X(_NAME, _ID, ...) case _ID: return str8_lit(Stringify(_NAME)); - DW_CFA_Kind_XList -#undef X - default: InvalidPath; break; - } - return str8_zero(); -} - -internal String8 -dw_name_string_from_section_kind(DW_SectionKind k) -{ - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_L); - DW_SectionKind_XList -#undef X - } - return str8_zero(); -} - -internal String8 -dw_mach_name_string_from_section_kind(DW_SectionKind k) -{ - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_M); - DW_SectionKind_XList -#undef X - } - return str8_zero(); -} - -internal String8 -dw_dwo_name_string_from_section_kind(DW_SectionKind k) -{ - switch (k) { -#define X(_N,_L,_M,_D) case DW_Section_##_N: return str8_lit(_D); - DW_SectionKind_XList -#undef X - } - return str8_zero(); -} -#endif diff --git a/src/dwarf/dwarf.h b/src/dwarf/dwarf.h index c8bedf7f..3dfce316 100644 --- a/src/dwarf/dwarf.h +++ b/src/dwarf/dwarf.h @@ -65,46 +65,4 @@ internal String8 dw_dwo_name_from_section_kind(DW_SectionKind k); //- rjf: architecture info internal U64 dw_reg_count_from_arch(Arch arch); -//////////////////////////////// -//~ TODO(rjf): OLD vvvvvvvvvvvvvvvvvvv - -#if 0 -//////////////////////////////// -// xlist helpers - -// regs -internal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code); -internal U64 dw_reg_pos_from_code(Arch arch, DW_Reg reg_code); -internal U64 dw_reg_count_from_arch(Arch arch); -internal U64 dw_reg_max_size_from_arch(Arch arch); -internal U64 dw_size_from_format(DW_Format format); - -// CFA -internal U64 dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode); -internal B32 dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode); -internal B32 dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode); -internal DW_CFA_OperandType * dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode); - -//////////////////////////////// -//~ rjf: String <=> Enum - -internal String8 dw_string_from_language(Arena *arena, DW_Language kind); -internal String8 dw_string_from_comp_unit_kind(Arena *arena, DW_CompUnitKind kind); -internal String8 dw_string_from_inl(Arena *arena, DW_InlKind kind); -internal String8 dw_string_from_access_kind(Arena *arena, DW_AccessKind kind); -internal String8 dw_string_from_calling_convetion(Arena *arena, DW_CallingConventionKind kind); -internal String8 dw_string_from_attrib_type_encoding(Arena *arena, DW_ATE kind); -internal String8 dw_string_from_attrib_visibility(Arena *arena, DW_Vis vis); -internal String8 dw_string_from_std_opcode(Arena *arena, DW_StdOpcode kind); -internal String8 dw_string_from_ext_opcode(Arena *arena, DW_ExtOpcode kind); -internal String8 dw_string_from_loc_list_entry_kind(Arena *arena, DW_LLE kind); -internal String8 dw_string_from_section_kind(Arena *arena, DW_SectionKind kind); -internal String8 dw_string_from_rng_list_entry_kind(Arena *arena, DW_RLE kind); -internal String8 dw_string_from_register(Arena *arena, Arch arch, U64 reg_id); -internal String8 dw_string_from_cfa_opcode(DW_CFA_Opcode opcode); -internal String8 dw_name_string_from_section_kind(DW_SectionKind k); -internal String8 dw_mach_name_string_from_section_kind(DW_SectionKind k); -internal String8 dw_dwo_name_string_from_section_kind (DW_SectionKind k); -#endif - #endif // DWARF_H diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index 42a9d935..b5b9efb4 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -2,11 +2,7 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #include "dwarf/dwarf.c" -// #include "dwarf/dwarf_parse.c" -// #include "dwarf/dwarf_expr.c" #include "dwarf/dwarf_expr_2.c" -// #include "dwarf/dwarf_unwind.c" -// #include "dwarf/dwarf_dump.c" #include "dwarf/dwarf_parse_2.c" #include "dwarf/dwarf_unwind_2.c" #include "dwarf/dwarf_dump_2.c" @@ -16,7 +12,3 @@ #if defined(ELF_H) # include "dwarf/dwarf_parse_elf.c" #endif - -#if 0 // TODO(rjf): this uses concepts from the old parser -# include "dwarf/dwarf_writer.c" -#endif diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index acb0be66..afc74828 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -5,11 +5,7 @@ #define DWARF_INC_H #include "dwarf/dwarf.h" -// #include "dwarf/dwarf_parse.h" -// #include "dwarf/dwarf_expr.h" #include "dwarf/dwarf_expr_2.h" -// #include "dwarf/dwarf_unwind.h" -// #include "dwarf/dwarf_dump.h" #include "dwarf/dwarf_parse_2.h" #include "dwarf/dwarf_unwind_2.h" #include "dwarf/dwarf_dump_2.h" @@ -20,8 +16,4 @@ # include "dwarf/dwarf_parse_elf.h" #endif -#if 0 // TODO(rjf): this uses concepts from the old parser -# include "dwarf/dwarf_writer.h" -#endif - #endif // DWARF_INC_H diff --git a/src/dwarf/dwarf_writer.c b/src/dwarf/dwarf_writer.c index fa824277..701bb454 100644 --- a/src/dwarf/dwarf_writer.c +++ b/src/dwarf/dwarf_writer.c @@ -1,6 +1,8 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +// TODO(rjf): this uses concepts from the old parser + internal DW_IntEnc dw_int_enc_from_sint(S64 v) { diff --git a/src/dwarf/dwarf_writer.h b/src/dwarf/dwarf_writer.h index aa09c59d..02fde356 100644 --- a/src/dwarf/dwarf_writer.h +++ b/src/dwarf/dwarf_writer.h @@ -4,6 +4,8 @@ #ifndef DWARF_WRITER_H #define DWARF_WRITER_H +// TODO(rjf): this uses concepts from the old parser + //////////////////////////////// typedef enum diff --git a/src/dwarf/tests/dwarf_tests.c b/src/dwarf/tests/dwarf_tests.c index b9d8c194..f6137a08 100644 --- a/src/dwarf/tests/dwarf_tests.c +++ b/src/dwarf/tests/dwarf_tests.c @@ -1,7 +1,7 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#if 0 +#if 0 // TODO(rjf): this uses concepts from the old parser internal U64 t_dw_test_uleb128(U64 v, U64 expected_length) diff --git a/src/eh_frame/eh_frame.c b/src/eh_frame/eh_frame.c index 06fdc93e..141ac5f5 100644 --- a/src/eh_frame/eh_frame.c +++ b/src/eh_frame/eh_frame.c @@ -1,77 +1,8 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#if 0 -internal U64 -eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) -{ - U64 ptr_off = off; - - if (encoding == EH_PtrEnc_Omit) { - return 0; - } - - // align read offset as needed - if (encoding == EH_PtrEnc_Aligned) { - ptr_off = AlignPow2(ptr_off, ptr_ctx->ptr_align); - encoding = EH_PtrEnc_Ptr; - } - - // decode pointer value - U64 decode_size = 0; - U64 raw_ptr_size = 0; - U64 raw_ptr = 0; - switch (encoding & EH_PtrEnc_TypeMask) { - default: { InvalidPath; } break; - - case EH_PtrEnc_Ptr : { raw_ptr_size = 8; } goto ufixed; - case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed; - case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed; - case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed; - ufixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - } break; - - // TODO: Signed is actually just a flag that indicates this int is negavite. - // There shouldn't be a read for Signed. - // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc. - case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; - - case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed; - case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed; - case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed; - sfixed: { - decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size); - raw_ptr = extend_sign64(raw_ptr, raw_ptr_size); - } break; - - case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr); } break; - case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break; - } - - // apply relative bases - if (decode_size > 0) { - U64 ptr = raw_ptr; - switch (encoding & EH_PtrEnc_ModifierMask) { - case 0: break; - case EH_PtrEnc_PcRel: { ptr = pc + raw_ptr; } break; - case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break; - case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break; - case EH_PtrEnc_FuncRel: { - Assert(!"TODO: need a sample to verify implementation"); - ptr = ptr_ctx->func_vaddr + raw_ptr; - } break; - default: { InvalidPath; } break; - } - - if (ptr_out) { - *ptr_out = ptr; - } - } - - return decode_size; -} -#endif +//////////////////////////////// +//~ rjf: .eh_frame Parsing Functions internal EH_FrameHdr eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) @@ -124,65 +55,6 @@ eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx) return header; } -#if 0 -internal U64 -eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out) -{ - // TODO: - // Handle "eh" param, it indicates presence of EH Data field. - // On 32bit arch it is a 4-byte and on 64-bit 8-byte value. - // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html - // Reference doc doesn't clarify structure for EH Data though - - U64 cursor = 0; - - U64 aug_data_size = 0; - EH_AugFlags aug_flags = 0; - EH_PtrEnc lsda_encoding = EH_PtrEnc_Omit; - EH_PtrEnc addr_encoding = EH_PtrEnc_UData8; - EH_PtrEnc handler_encoding = EH_PtrEnc_Omit; - U64 handler_ip = 0; - if (str8_match(str8_prefix(aug_string, 1), str8_lit("z"), 0)) { - cursor = str8_deserial_read_uleb128(aug_data, cursor, &aug_data_size); - - for (U8 *ptr = aug_string.str+1; ptr < (aug_string.str+aug_string.size); ptr += 1) { - switch (*ptr) { - case 'L': { - cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding); - aug_flags |= EH_AugFlag_HasLSDA; - } break; - case 'P': { - cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding); - cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip); - aug_flags |= EH_AugFlag_HasHandler; - } break; - case 'R': { - cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding); - aug_flags |= EH_AugFlag_HasAddrEnc; - } break; - case 'S': { - aug_flags |= EH_AugFlag_SignalFrame; - } break; - default: { Assert(!"failed to parse augmentation string"); goto exit; } break; - } - } - } - - if (aug_out) { - aug_out->handler_ip = handler_ip; - aug_out->handler_encoding = handler_encoding; - aug_out->lsda_encoding = handler_encoding; - aug_out->addr_encoding = addr_encoding; - aug_out->flags = aug_flags; - aug_out->size = aug_data_size; - } - - exit:; - U64 parse_size = cursor; - return parse_size; -} -#endif - internal U64 eh_read_ptr(String8 data, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out) { @@ -464,100 +336,6 @@ eh_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, U64 pc, EH_PtrCtx * return bytes_read; } -#if 0 -internal B32 -eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out) -{ - B32 is_parsed = 0; - U64 cursor = format == DW_Format_32Bit ? 8 : 20; - - U64 pc_begin = 0; - U64 pc_delta = 0; - EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc]; - if (addr_enc != EH_PtrEnc_Omit) { - U64 pc_begin_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc, &pc_begin); - if (pc_begin_size == 0) { goto exit; } - cursor += pc_begin_size; - - U64 pc_delta_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc & EH_PtrEnc_TypeMask, &pc_delta); - if (pc_delta_size == 0) { goto exit; } - cursor += pc_delta_size; - } - - if (cursor + cie->aug_data.size > data.size) { goto exit; } - cursor += cie->aug_data.size; - - fde_out->format = format; - fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_delta); - fde_out->insts = str8_skip(data, cursor); - - is_parsed = 1; - exit:; - return is_parsed; -} -#endif - -#if 0 -internal U64 -eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc) -{ - U64 fde_addr = max_U64; - U64 fde_idx = max_U64; - - if (header.version == 1) { - if (header.fde_count > 0) { - U64 first = 0; - U64 first_size = eh_parse_ptr(header.table, 0, ptr_ctx->pc_vaddr, ptr_ctx, header.table_enc, &first); - AssertAlways(first_size); - if (first == pc) { - fde_idx = 0; - goto exit; - } - if (first > pc) { - goto exit; - } - - U64 last_off = header.table.size - header.entry_byte_size; - U64 last = 0; - U64 last_size = eh_parse_ptr(header.table, last_off, ptr_ctx->pc_vaddr + last_off, ptr_ctx, header.table_enc, &last); - AssertAlways(last_size); - if (last <= pc) { - fde_idx = header.fde_count - 1; - goto exit; - } - - U64 l = 0; - U64 r = header.fde_count - 1; - while (l <= r) { - U64 m = l + (r - l) / 2; - U64 m_pc_off = m * header.entry_byte_size; - U64 m_pc = 0; - U64 m_pc_size = eh_parse_ptr(header.table, m_pc_off, ptr_ctx->pc_vaddr + m_pc_off, ptr_ctx, header.table_enc, &m_pc); - Assert(m_pc_size); - if (m_pc > pc) { - r = m - 1; - } else if (m_pc < pc) { - l = m + 1; - } else { - fde_idx = m; - goto exit; - } - } - - fde_idx = l > 0 ? l-1 : 0; - } - } - - exit:; - if (fde_idx < header.fde_count) { - U64 fde_addr_off = (fde_idx * header.entry_byte_size) + header.field_byte_size; - U64 fde_addr_size = eh_parse_ptr(header.table, fde_addr_off, ptr_ctx->pc_vaddr + fde_addr_off, ptr_ctx, header.table_enc, &fde_addr); - Assert(fde_addr_size); - } - return fde_addr; -} -#endif - internal int eh_frame_hdr_entry_sort(void *raw_a, void *raw_b) { @@ -599,52 +377,50 @@ eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, return eh_frame_hdr; } -#if 0 -internal -DW_DECODE_PTR(eh_decode_ptr) -{ - EH_DecodePtrCtx *ctx = ud; - return eh_parse_ptr(data, 0, ctx->ptr_ctx->pc_vaddr, ctx->ptr_ctx, ctx->addr_enc, ptr_out); -} -#endif +//////////////////////////////// +//~ rjf: Enum -> String internal String8 eh_string_from_ptr_enc_type(EH_PtrEnc type) { - switch (type) { - case EH_PtrEnc_Ptr: return str8_lit("Ptr"); - case EH_PtrEnc_ULEB128: return str8_lit("ULEB128"); - case EH_PtrEnc_UData2: return str8_lit("UData2"); - case EH_PtrEnc_UData4: return str8_lit("UData4"); - case EH_PtrEnc_UData8: return str8_lit("UData8"); - case EH_PtrEnc_Signed: return str8_lit("Signed"); - case EH_PtrEnc_SLEB128: return str8_lit("SLEB128"); - case EH_PtrEnc_SData2: return str8_lit("SData2"); - case EH_PtrEnc_SData4: return str8_lit("SData4"); - case EH_PtrEnc_SData8: return str8_lit("SData8"); + String8 result = {0}; + switch(type) + { + case EH_PtrEnc_Ptr: {result = s("Ptr");}break; + case EH_PtrEnc_ULEB128: {result = s("ULEB128");}break; + case EH_PtrEnc_UData2: {result = s("UData2");}break; + case EH_PtrEnc_UData4: {result = s("UData4");}break; + case EH_PtrEnc_UData8: {result = s("UData8");}break; + case EH_PtrEnc_Signed: {result = s("Signed");}break; + case EH_PtrEnc_SLEB128: {result = s("SLEB128");}break; + case EH_PtrEnc_SData2: {result = s("SData2");}break; + case EH_PtrEnc_SData4: {result = s("SData4");}break; + case EH_PtrEnc_SData8: {result = s("SData8");}break; } - return str8_zero(); + return result; } internal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier) { - switch (modifier) { - case EH_PtrEnc_PcRel: return str8_lit("PcRel"); - case EH_PtrEnc_TextRel: return str8_lit("TextRel"); - case EH_PtrEnc_DataRel: return str8_lit("DataRel"); - case EH_PtrEnc_FuncRel: return str8_lit("FuncRel"); - case EH_PtrEnc_Aligned: return str8_lit("Aligned"); + String8 result = {0}; + switch(modifier) + { + case EH_PtrEnc_PcRel: {result = s("PcRel");}break; + case EH_PtrEnc_TextRel: {result = s("TextRel");}break; + case EH_PtrEnc_DataRel: {result = s("DataRel");}break; + case EH_PtrEnc_FuncRel: {result = s("FuncRel");}break; + case EH_PtrEnc_Aligned: {result = s("Aligned");}break; } - return str8_zero(); + return result; } internal String8 eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc) { - String8 type_str = eh_string_from_ptr_enc_type(enc & EH_PtrEnc_TypeMask); + String8 type_str = eh_string_from_ptr_enc_type(enc & EH_PtrEnc_TypeMask); String8 modifer_str = eh_string_from_ptr_enc_modifier(enc & EH_PtrEnc_ModifierMask); - String8 indir_str = enc & EH_PtrEnc_Indirect ? str8_lit("Indirect") : str8_zero(); - String8 result = str8f(arena, "Type: %S, Modifier %S (%S)", type_str, modifer_str, indir_str); + String8 indir_str = enc & EH_PtrEnc_Indirect ? str8_lit("Indirect") : str8_zero(); + String8 result = str8f(arena, "Type: %S, Modifier %S (%S)", type_str, modifer_str, indir_str); return result; } diff --git a/src/eh_frame/eh_frame.h b/src/eh_frame/eh_frame.h index e4517d8a..d4803bab 100644 --- a/src/eh_frame/eh_frame.h +++ b/src/eh_frame/eh_frame.h @@ -106,14 +106,9 @@ typedef struct EH_DecodePtrCtx } EH_DecodePtrCtx; //////////////////////////////// +//~ rjf: .eh_frame Parsing Functions -#if 0 -internal U64 eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); -#endif internal EH_FrameHdr eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx); -#if 0 -internal U64 eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out); -#endif internal U64 eh_read_ptr(String8 data, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out); internal U64 eh_read_aug_data(String8 data, U64 off, String8 string, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out); @@ -121,12 +116,11 @@ internal U64 eh_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi internal U64 eh_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out); internal U64 eh_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie, DW_FDE *fde_out); -internal B32 eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out); -internal U64 eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc); +internal int eh_frame_hdr_entry_sort(void *raw_a, void *raw_b); internal String8 eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, struct DW_FDE *fde); //////////////////////////////// -//~ Enum -> String +//~ rjf: Enum -> String internal String8 eh_string_from_ptr_enc_type(EH_PtrEnc type); internal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier); diff --git a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c index efd32d87..fa635619 100644 --- a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c +++ b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c @@ -5,7 +5,7 @@ // // [ ] d2r_types alias size and byte size on __float80 typedef mismatch -#if 0 +#if 0 // TODO(rjf): this uses concepts from the old parser - replace with p2r-style exemplar testing to catch regressions internal RDI_Parsed * d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) From a2700de35de648c7e5ca8a17b49918895de230ff Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 11:36:46 -0700 Subject: [PATCH 721/850] dwarf parse/expr/unwind/dump 2 -> 1; move old stuff to obsolete --- obsolete/dwarf/dwarf_dump_old.c | 2220 +++++++++++++ obsolete/dwarf/dwarf_dump_old.h | 73 + obsolete/dwarf/dwarf_expr_old.c | 1580 +++++++++ obsolete/dwarf/dwarf_expr_old.h | 233 ++ obsolete/dwarf/dwarf_parse_old.c | 3331 +++++++++++++++++++ obsolete/dwarf/dwarf_parse_old.h | 528 +++ obsolete/dwarf/dwarf_unwind_old.c | 373 +++ obsolete/dwarf/dwarf_unwind_old.h | 81 + src/dwarf/dwarf_dump.c | 2670 ++++----------- src/dwarf/dwarf_dump.h | 66 +- src/dwarf/dwarf_dump_2.c | 718 ---- src/dwarf/dwarf_dump_2.h | 17 - src/dwarf/dwarf_expr.c | 1885 ++--------- src/dwarf/dwarf_expr.h | 251 +- src/dwarf/dwarf_expr_2.c | 393 --- src/dwarf/dwarf_expr_2.h | 66 - src/dwarf/dwarf_inc.c | 8 +- src/dwarf/dwarf_inc.h | 8 +- src/dwarf/dwarf_parse.c | 5073 +++++++++++------------------ src/dwarf/dwarf_parse.h | 810 +++-- src/dwarf/dwarf_parse_2.c | 1916 ----------- src/dwarf/dwarf_parse_2.h | 456 --- src/dwarf/dwarf_parse_coff.h | 1 - src/dwarf/dwarf_unwind.c | 371 --- src/dwarf/dwarf_unwind.h | 95 +- src/dwarf/dwarf_unwind_2.c | 2 - src/dwarf/dwarf_unwind_2.h | 44 - 27 files changed, 11634 insertions(+), 11635 deletions(-) create mode 100644 obsolete/dwarf/dwarf_dump_old.c create mode 100644 obsolete/dwarf/dwarf_dump_old.h create mode 100644 obsolete/dwarf/dwarf_expr_old.c create mode 100644 obsolete/dwarf/dwarf_expr_old.h create mode 100644 obsolete/dwarf/dwarf_parse_old.c create mode 100644 obsolete/dwarf/dwarf_parse_old.h create mode 100644 obsolete/dwarf/dwarf_unwind_old.c create mode 100644 obsolete/dwarf/dwarf_unwind_old.h delete mode 100644 src/dwarf/dwarf_dump_2.c delete mode 100644 src/dwarf/dwarf_dump_2.h delete mode 100644 src/dwarf/dwarf_expr_2.c delete mode 100644 src/dwarf/dwarf_expr_2.h delete mode 100644 src/dwarf/dwarf_parse_2.c delete mode 100644 src/dwarf/dwarf_parse_2.h delete mode 100644 src/dwarf/dwarf_unwind_2.c delete mode 100644 src/dwarf/dwarf_unwind_2.h diff --git a/obsolete/dwarf/dwarf_dump_old.c b/obsolete/dwarf/dwarf_dump_old.c new file mode 100644 index 00000000..9b6d6481 --- /dev/null +++ b/obsolete/dwarf/dwarf_dump_old.c @@ -0,0 +1,2220 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#define dw_indent() do { indent += 1; } while (0) +#define dw_unindent() do { indent -= 1; } while (0) +#define dw_print(string) dw_print_ (arena, strings, indent, string) +#define dw_printf(...) dw_printf_(arena, strings, indent, __VA_ARGS__) +static char g_spaces[] = " "; + +internal void +dw_print_(Arena *arena, String8List *out, int indent, String8 string) +{ + Temp scratch = scratch_begin(&arena, 1); + str8_list_pushf(arena, out, "%.*s%S", Min(indent * 2, sizeof(g_spaces)), g_spaces, string); + scratch_end(scratch); +} + +internal void +dw_printf_(Arena *arena, String8List *out, int indent, char *fmt, ...) +{ + Temp scratch = scratch_begin(&arena, 1); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + dw_print_(arena, out, indent, string); + va_end(args); + scratch_end(scratch); +} + +internal Rng1U64Array +dw_get_info_ranges(DW_Dumper *dumper) +{ + if (!(dumper->cache_flags & DW_DumperCacheFlag_InfoRanges)) { + dumper->cache.info_ranges = dw_unit_ranges_from_data_arr(dumper->arena, dumper->input->sec[DW_Section_Info].data); + } + return dumper->cache.info_ranges; +} + +internal DW_CompUnit * +dw_get_cu_arr(DW_Dumper *dumper) +{ + if (!(dumper->cache_flags & DW_DumperCacheFlag_CuArr)) { + Rng1U64Array info_ranges = dw_get_info_ranges(dumper); + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(dumper->arena, dumper->input); + dumper->cache.cu_arr = push_array(dumper->arena, DW_CompUnit, info_ranges.count); + for EachIndex(cu_idx, info_ranges.count) { + dumper->cache.cu_arr[cu_idx] = dw_cu_from_info_off(dumper->arena, dumper->input, lu_input, info_ranges.v[cu_idx].min, dumper->is_relaxed); + } + } + return dumper->cache.cu_arr; +} + +internal HashTable * +dw_get_line_vm_map(DW_Dumper *dumper) +{ + if (!(dumper->cache_flags & DW_DumperCacheFlag_LineVmMap)) { + Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(dumper->arena, dumper->input->sec[DW_Section_Line].data); + dumper->cache.line_vm_map = hash_table_init(dumper->arena, unit_ranges.count * 2); + } + return dumper->cache.line_vm_map; +} + +internal DW_TagTree * +dw_get_tag_trees(DW_Dumper *dumper) +{ + if (!(dumper->cache_flags & DW_DumperCacheFlag_TagTrees)) { + Rng1U64Array info_ranges = dw_get_info_ranges(dumper); + DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); + dumper->cache.tag_trees = push_array(dumper->arena, DW_TagTree, info_ranges.count); + for EachIndex(cu_idx, info_ranges.count) { + dumper->cache.tag_trees[cu_idx] = dw_tag_tree_from_cu(dumper->arena, dumper->input, &cu_arr[cu_idx]); + } + } + return dumper->cache.tag_trees; +} + +//////////////////////////////// +//~ rjf: Stringification Helpers + +internal String8List +dw_string_list_from_cfi_program(Arena *arena, + U64 cu_base, + Arch arch, + DW_Version ver, + DW_Ext ext, + DW_Format format, + U64 pc_begin, + DW_CIE *cie, + DW_DecodePtr *decode_ptr_func, + void *deocde_ptr_ud, + String8 program) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = {0}; + + U64 reg_max = dw_reg_count_from_arch(arch); + U64 pc = pc_begin; + for (U64 cursor = 0, inst_size; cursor < program.size; cursor += inst_size) { + // unpack instruction + DW_CFA_Inst inst = {0}; + DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(program, cursor), cie->code_align_factor, cie->data_align_factor, 0, 0, &inst_size, &inst); + if (error_code == DW_CFA_ParseErrorCode_End) { break; } + if (error_code != DW_CFA_ParseErrorCode_NewInst) { + str8_list_pushf(arena, &list, "ERROR: failed to unpack CFA instruction @ 0x%I64", cursor); + break; + } + + // error check operands + DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst.opcode); + U64 operand_count = dw_operand_count_from_cfa_opcode(inst.opcode); + for EachIndex(operand_idx, operand_count) { + switch (operand_types[operand_idx]) { + case DW_CFA_OperandType_Null: break; + case DW_CFA_OperandType_Value: break; + case DW_CFA_OperandType_Register: { + if (inst.operands[operand_idx].u64 >= reg_max) { + str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", + dw_string_from_cfa_opcode(inst.opcode), + cursor); + } + } break; + case DW_CFA_OperandType_Expression: { + DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); + for EachNode(inst, DW_ExprInst, expr.first) { + if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { + String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); + str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); + } + } + } break; + default: { InvalidPath; } break; + } + } + + // format operands + String8 operand_str = str8_lit("???"); + switch (inst.opcode) { + case DW_CFA_Nop: { operand_str = str8_zero(); } break; + case DW_CFA_SetLoc: { + operand_str = str8f(arena, "0x%X", inst.operands[0].u64); + pc = inst.operands[0].u64; + } break; + case DW_CFA_AdvanceLoc1: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc2: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_AdvanceLoc4: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_OffsetExt: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; + case DW_CFA_Undefined: { + operand_str = str8f(arena, "%I64u", inst.operands[0].u64); + } break; + case DW_CFA_SameValue: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_Register: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_RememberState: { operand_str = str8_zero(); } break; + case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; + case DW_CFA_DefCfa: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_DefCfaRegister: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + case DW_CFA_DefCfaOffset: { + operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); + } break; + case DW_CFA_DefCfaExpr: { + operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); + } break; + case DW_CFA_Expr: { + String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); + } break; + case DW_CFA_OffsetExtSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaSf: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; + case DW_CFA_ValOffset: { + operand_str = str8f(arena, "value 0x%I64x, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); + } break; + case DW_CFA_ValOffsetSf: { + operand_str = str8f(arena, "value %I64u, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); + } break; + case DW_CFA_ValExpr: { + String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); + operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); + } break; + case DW_CFA_AdvanceLoc: { + U64 delta = inst.operands[0].u64; + pc += delta; + operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); + } break; + case DW_CFA_Offset: { + U64 reg = inst.operands[0].u64; + S64 offset = (S64)inst.operands[1].u64; + operand_str = dw_string_from_reg_off(arena, arch, reg, offset); + } break; + case DW_CFA_Restore: { + operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); + } break; + default: { + str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); + } goto exit; + } + + if (operand_str.size) { + str8_list_pushf(arena, &list, "DW_CFA_%S: %S", dw_string_from_cfa_opcode(inst.opcode), operand_str); + } else { + str8_list_pushf(arena, &list, "DW_CFA_%S", dw_string_from_cfa_opcode(inst.opcode)); + } + } + + exit:; + scratch_end(scratch); + return list; +} + +internal String8List +dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List result = {0}; + for (U64 cursor = 0; cursor < raw_data.size; ) { + U8 op = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &op); + + String8 op_value = str8_zero(); + U64 size_param = 0; + B32 is_signed = 0; + switch (op) { + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { + U64 x = op - DW_ExprOp_Lit0; + op_value = push_str8f(scratch.arena, "%I64u", x); + } break; + + case DW_ExprOp_Const1U:size_param = 1; goto const_n; + case DW_ExprOp_Const2U:size_param = 2; goto const_n; + case DW_ExprOp_Const4U:size_param = 4; goto const_n; + case DW_ExprOp_Const8U:size_param = 8; goto const_n; + case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n; + case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n; + case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n; + case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n; + const_n: + { + if (is_signed) { + S64 x = 0; + cursor += str8_deserial_read(raw_data, cursor, &x, size_param, 1); + x = extend_sign64(x, size_param); + op_value = push_str8f(scratch.arena, "%I64d", x); + } else { + U64 x = 0; + cursor += str8_deserial_read(raw_data, cursor, &x, size_param, 1); + op_value = push_str8f(scratch.arena, "%I64u", x); + } + } break; + + case DW_ExprOp_Addr: { + U64 addr = 0; + cursor += str8_deserial_read(raw_data, cursor, &addr, addr_size, 1); + op_value = push_str8f(scratch.arena, "%#I64x", addr); + } break; + + case DW_ExprOp_ConstU: { + U64 x = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &x); + op_value = push_str8f(scratch.arena, "%I64u", x); + } break; + + case DW_ExprOp_ConstS: { + S64 x = 0; + cursor += str8_deserial_read_sleb128(raw_data, cursor, &x); + op_value = push_str8f(scratch.arena, "%I64d", x); + } break; + + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { + U64 reg_idx = op - DW_ExprOp_Reg0; + op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, 0); + } break; + + case DW_ExprOp_RegX: { + U64 reg_idx = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, ®_idx); + op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, 0); + } break; + + case DW_ExprOp_ImplicitValue: { + U64 value_size = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &value_size); + Rng1U64 value_range = rng_1u64(cursor, cursor + value_size); + String8 value_data = str8_substr(raw_data, value_range); + cursor += value_size; + String8List value_strings = numeric_str8_list_from_data(scratch.arena, 16, value_data, 1); + op_value = str8_list_join(scratch.arena, &value_strings, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(", "), .post = str8_lit(" }")}); + } break; + + case DW_ExprOp_Piece: { + U64 size = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &size); + op_value = push_str8f(scratch.arena, "%u", size); + } break; + + case DW_ExprOp_BitPiece: { + U64 bit_size = 0, bit_off = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &bit_size); + cursor += str8_deserial_read_uleb128(raw_data, cursor, &bit_off); + op_value = push_str8f(scratch.arena, "bit size %I64u, bit offset %I64u", bit_size, bit_off); + } break; + + case DW_ExprOp_Pick: { + U8 stack_idx = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &stack_idx); + op_value = push_str8f(scratch.arena, "stack index %u", stack_idx); + } break; + + case DW_ExprOp_PlusUConst: { + U64 addend = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &addend); + op_value = push_str8f(arena, "addend %I64u", addend); + } break; + + case DW_ExprOp_Skip: { + S16 x = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &x); + op_value = push_str8f(scratch.arena, "%+d bytes", x); + } break; + + case DW_ExprOp_Bra: { + S16 x = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &x); + op_value = push_str8f(scratch.arena, "%+d", x); + } break; + + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { + U64 reg_idx = op - DW_ExprOp_BReg0; + S64 reg_off = 0; + cursor += str8_deserial_read_sleb128(raw_data, cursor, ®_off); + op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, reg_off); + } break; + + case DW_ExprOp_FBReg: { + S64 reg_off = 0; + cursor += str8_deserial_read_sleb128(raw_data, cursor, ®_off); + op_value = push_str8f(scratch.arena, "offset %I64d", reg_off); + } break; + + case DW_ExprOp_BRegX: { + U64 reg_idx = 0; + S64 reg_off = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, ®_idx); + cursor += str8_deserial_read_sleb128(raw_data, cursor, ®_off); + op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, reg_off); + } break; + + case DW_ExprOp_XDerefSize: + case DW_ExprOp_DerefSize: { + U8 x = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &x); + op_value = push_str8f(scratch.arena, "%u", x); + } break; + + case DW_ExprOp_Call2: { + U16 x = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &x); + op_value = push_str8f(scratch.arena, "%u", x); + } break; + case DW_ExprOp_Call4: { + U32 x = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &x); + op_value = push_str8f(arena, "%u", x); + } break; + case DW_ExprOp_CallRef: { + U64 x = 0; + cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &x); + op_value = push_str8f(scratch.arena, "%I64u", x); + } break; + case DW_ExprOp_ImplicitPointer: + case DW_ExprOp_GNU_ImplicitPointer: { + U64 info_off = 0; + cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &info_off); + S64 ptr = 0; + cursor += str8_deserial_read_sleb128(raw_data, cursor, &ptr); + + op_value = push_str8f(scratch.arena, ".debug_info+%#I64x, ptr %I64x", info_off, ptr); + } break; + case DW_ExprOp_Convert: + case DW_ExprOp_GNU_Convert: { + U64 type_cu_off = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); + op_value = push_str8f(scratch.arena, "TypeCuOff %#I64x", cu_base + type_cu_off); + } break; + case DW_ExprOp_GNU_ParameterRef: { + // TODO: always 4 bytes? + U32 cu_off = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &cu_off); + op_value = push_str8f(scratch.arena, "CuOff %#x", cu_base + cu_off); + } break; + case DW_ExprOp_DerefType: + case DW_ExprOp_GNU_DerefType: { + U8 deref_size = 0; + U64 type_cu_off = 0; + cursor += str8_deserial_read_struct(raw_data, cursor, &deref_size); + cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); + op_value = push_str8f(scratch.arena, "%#x, TypeCuOff %#I64x", deref_size, cu_base + type_cu_off); + } break; + case DW_ExprOp_ConstType: + case DW_ExprOp_GNU_ConstType: { + U64 type_cu_off = 0; + U8 const_value_size = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); + cursor += str8_deserial_read_struct(raw_data, cursor, &const_value_size); + Rng1U64 const_value_range = rng_1u64(cursor, cursor + const_value_size); + String8 const_value_data = str8_substr(raw_data, const_value_range); + String8List const_value_strings = numeric_str8_list_from_data(scratch.arena, 16, const_value_data, 1); + String8 const_value_str = str8_list_join(scratch.arena, &const_value_strings, &(StringJoin){.sep = str8_lit(", ")}); + op_value = push_str8f(scratch.arena, "TypeCuOff %#I64x, Const Value { %S }", cu_base + type_cu_off, const_value_str); + cursor += const_value_size; + } break; + case DW_ExprOp_RegvalType: + case DW_ExprOp_GNU_RegvalType: { + U64 reg_idx = 0, type_cu_off = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, ®_idx); + cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); + op_value = push_str8f(scratch.arena, "%S, TypeCuOff %#I64x", dw_string_from_register(scratch.arena, arch, reg_idx), cu_base + type_cu_off); + } break; + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: { + U64 block_size = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &block_size); + Rng1U64 block_range = rng_1u64(cursor, cursor + block_size); + String8 block_data = str8_substr(raw_data, block_range); + String8List block_expr = dw_string_list_from_expression(scratch.arena, block_data, cu_base, addr_size, arch, ver, ext, format); + op_value = str8_list_join(scratch.arena, &block_expr, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(","), .post = str8_lit(" }")}); + cursor += block_size; + } break; + case DW_ExprOp_Addrx: { + U64 addr = 0; + cursor += str8_deserial_read_uleb128(raw_data, cursor, &addr); + op_value = push_str8f(scratch.arena, "%#I64x", addr); + } break; + + case DW_ExprOp_CallFrameCfa: + case DW_ExprOp_FormTlsAddress: + case DW_ExprOp_PushObjectAddress: + case DW_ExprOp_Nop: + case DW_ExprOp_Eq: + case DW_ExprOp_Ge: + case DW_ExprOp_Gt: + case DW_ExprOp_Le: + case DW_ExprOp_Lt: + case DW_ExprOp_Ne: + case DW_ExprOp_Shl: + case DW_ExprOp_Shr: + case DW_ExprOp_Shra: + case DW_ExprOp_Xor: + case DW_ExprOp_XDeref: + case DW_ExprOp_Abs: + case DW_ExprOp_And: + case DW_ExprOp_Div: + case DW_ExprOp_Minus: + case DW_ExprOp_Mod: + case DW_ExprOp_Mul: + case DW_ExprOp_Neg: + case DW_ExprOp_Not: + case DW_ExprOp_Or: + case DW_ExprOp_Plus: + case DW_ExprOp_Rot: + case DW_ExprOp_Swap: + case DW_ExprOp_Deref: + case DW_ExprOp_Dup: + case DW_ExprOp_Drop: + case DW_ExprOp_Over: + case DW_ExprOp_StackValue: { + // no operands + } break; + } + + String8 opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, op); + if (op_value.size == 0) { + str8_list_pushf(arena, &result, "DW_OP_%S", opcode_str); + } else { + str8_list_pushf(arena, &result, "DW_OP_%S = %S", opcode_str, op_value); + } + } + scratch_end(scratch); + return result; +} + +internal String8 +dw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off) +{ + Temp scratch = scratch_begin(&arena, 1); + String8 reg_str = dw_string_from_register(scratch.arena, arch, reg_idx); + String8 result; + if (reg_off != 0) { + result = push_str8f(arena, "%S%+I64d", reg_str, reg_off); + } else { + result = reg_str; + } + scratch_end(scratch); + return result; +} + +internal String8 +dw_string_from_expression(Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = dw_string_list_from_expression(scratch.arena, expr, cu_base, addr_size, arch, ver, ext, format); + String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")}); + return result; +} + +internal String8 +dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa) +{ + String8 cfa_str = str8_lit("???"); + switch (cfa.rule) { + case DW_CFA_Rule_Null: {} break; + case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; + case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; + default: { InvalidPath; } break; + } + return cfa_str; +} + +internal String8 +dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List cfi_regs_list = {0}; + U64 reg_count = dw_reg_count_from_arch(arch); + for EachIndex(reg_idx, reg_count) { + DW_CFI_Register *cfi_reg = &row->regs[reg_idx]; + String8 rule_str = str8_lit("???"); + switch (cfi_reg->rule) { + case DW_CFI_RegisterRule_Undefined: { + rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_SameValue: { + rule_str = str8_zero(); + } break; + case DW_CFI_RegisterRule_Offset: { + rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_ValOffset: { + rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); + } break; + case DW_CFI_RegisterRule_Register: { + rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); + } break; + case DW_CFI_RegisterRule_Expression: { + rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_ValExpression: { + rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); + } break; + case DW_CFI_RegisterRule_Architectural: { + rule_str = str8_lit("???"); + } break; + default: { InvalidPath; } break; + } + + if (rule_str.size) { + str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_register(scratch.arena, arch, reg_idx), rule_str); + } + } + + String8 string = str8_list_join(arena, &cfi_regs_list, &(StringJoin){.sep=str8_lit(", ")}); + + scratch_end(scratch); + return string; +} + +internal String8 +dw_single_line_string_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List list = dw_string_list_from_expression(scratch.arena, raw_data, cu_base, address_size, arch, ver, ext, format); + String8 expression = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")}); + scratch_end(scratch); + return expression; +} + +internal String8 +dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) +{ + Temp scratch = scratch_begin(&arena, 1); + + String8List attrib_fmt = {0}; + + // rjf: log attrib's value based on vlass + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + switch(value_class) + { + default: {str8_list_pushf(scratch.arena, &attrib_fmt, "`unknown value class`");}break; + case DW_AttribClass_Undefined: {str8_list_pushf(scratch.arena, &attrib_fmt, "`undefined value class`");}break; + case DW_AttribClass_Address: {str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", dw_address_from_attrib(input, cu, attrib));}break; + case DW_AttribClass_Const: {str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", dw_const_u64_from_attrib(input, cu, attrib));}break; + case DW_AttribClass_Block: + { + String8 block = dw_block_from_attrib(input, cu, attrib); + String8List block_strs = numeric_str8_list_from_data(scratch.arena, 16, block, 1); + String8 block_str = str8_list_join(scratch.arena, &block_strs, &(StringJoin){.sep = str8_lit(", ")}); + str8_list_pushf(scratch.arena, &attrib_fmt, "{ %S }", block_str); + }break; + case DW_AttribClass_ExprLoc: + { + String8 exprloc = dw_exprloc_from_attrib(input, cu, attrib); + String8 exprloc_str = dw_single_line_string_from_expression(scratch.arena, exprloc, cu->info_range.min, cu->address_size, arch, cu->version, cu->ext, cu->format); + str8_list_pushf(scratch.arena, &attrib_fmt, "{ %S }", exprloc_str); + }break; + case DW_AttribClass_Flag: + { + B32 flag = dw_flag_from_attrib(input, cu, attrib); + str8_list_pushf(scratch.arena, &attrib_fmt, "%I64u (%s)", flag, flag == 0 ? "false" : "true"); + }break; + case DW_AttribClass_LinePtr: + case DW_AttribClass_LocListPtr: + case DW_AttribClass_MacPtr: + case DW_AttribClass_RngListPtr: + case DW_AttribClass_RngList: + case DW_AttribClass_StrOffsetsPtr: + case DW_AttribClass_AddrPtr: + { + if(attrib->form.kind == DW_Form_SecOffset) + { + str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", attrib->form.sec_offset); + } + else + { + str8_list_pushf(scratch.arena, &attrib_fmt, "`unexpected form kind %S`", dw_string_from_form_kind(scratch.arena, cu->version, attrib->form.kind)); + } + }break; + case DW_AttribClass_Reference: + { + if(attrib->form.kind == DW_Form_Ref1 || + attrib->form.kind == DW_Form_Ref2 || + attrib->form.kind == DW_Form_Ref4 || + attrib->form.kind == DW_Form_Ref8 || + attrib->form.kind == DW_Form_RefUData) + { + U64 info_off = cu->info_range.min + attrib->form.ref; + str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", info_off); + if(!contains_1u64(cu->info_range, info_off)) + { + str8_list_pushf(scratch.arena, &attrib_fmt, ": `(out of this cu's bounds)`"); + } + } + else + { + str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", attrib->form.ref); + } + }break; + case DW_AttribClass_String: + { + if(attrib->form.kind == DW_Form_Strp || attrib->form.kind == DW_Form_LineStrp || attrib->form.kind == DW_Form_StrpSup) + { + str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x ", attrib->form.sec_offset); + } + String8 string = dw_string_from_attrib(input, cu, attrib); + str8_list_pushf(scratch.arena, &attrib_fmt, "\"%S\"", string); + }break; + } + + // rjf: extend attrib's value with enum info + { + String8 enum_info = {0}; + switch(attrib->attrib_kind) + { + case DW_AttribKind_Language: + { + DW_Language lang = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_language(scratch.arena, lang); + }break; + case DW_AttribKind_DeclFile: + { + U64 file_idx = dw_const_u64_from_attrib(input, cu, attrib); + DW_LineFile *file = dw_file_from_attrib(cu, line_vm, attrib); + if(file != 0) + { + enum_info = dw_path_from_file(scratch.arena, line_vm->header.dir_table, file); + } + }break; + case DW_AttribKind_DeclLine: + { + enum_info = str8f(scratch.arena, "%I64u", dw_const_u64_from_attrib(input, cu, attrib)); + }break; + case DW_AttribKind_Inline: + { + DW_InlKind inl = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_inl(scratch.arena, inl); + }break; + case DW_AttribKind_Accessibility: + { + DW_AccessKind access = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_access_kind(scratch.arena, access); + }break; + case DW_AttribKind_CallingConvention: + { + DW_CallingConventionKind calling_convetion = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_calling_convetion(scratch.arena, calling_convetion); + }break; + case DW_AttribKind_Encoding: + { + DW_ATE encoding = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_attrib_type_encoding(scratch.arena, encoding); + }break; + case DW_AttribKind_Visibility: + { + DW_Vis vis = dw_const_u64_from_attrib(input, cu, attrib); + enum_info = dw_string_from_attrib_visibility(scratch.arena, vis); + }break; + } + + if(enum_info.size) + { + str8_list_pushf(scratch.arena, &attrib_fmt, " `%S`", enum_info); + } + } + + String8 result = str8_list_join(arena, &attrib_fmt, 0); + + scratch_end(scratch); + return result; +} + +internal +DW_PRINTER(dw_print_abbrev) +{ + DW_Raw *input = dumper->input; + + Temp scratch = scratch_begin(&arena, 1); + DW_Section abbrev = input->sec[DW_Section_Abbrev]; + S64 depth = 0; + U64 idx = 0; + for(U64 cursor = 0; cursor < abbrev.data.size; idx += 1) + { + // rjf: read id & advance + U64 id_off = cursor; + U64 id = 0; + cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &id); + if(id == 0) { continue; } + + // rjf: unpack abbrev + U64 tag = 0; + U8 has_children = 0; + cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &tag); + cursor += str8_deserial_read_struct(abbrev.data, cursor, &has_children); + + // rjf: log abbrev + Temp temp = temp_begin(scratch.arena); + dw_printf("abbrev: // abbrev[%I64u] abbrev_off: 0x%I64x \n {\n", idx, id_off); + dw_indent(); + dw_printf("id: %I64u tag_kind: %S has_children: %s\n", id, dw_string_from_tag_kind(temp.arena, tag), has_children ? "true" : "false"); + U64 attrib_kind_max_size = 0; + U64 form_kind_max_size = 0; + { + for(U64 off = cursor;;) + { + U64 attrib_id = 0, form_id = 0; + off += str8_deserial_read_uleb128(abbrev.data, off, &attrib_id); + off += str8_deserial_read_uleb128(abbrev.data, off, &form_id); + if(attrib_id == 0) { break; } + String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); + String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); + attrib_kind_max_size = Max(attrib_kind_max_size, attrib_str.size); + form_kind_max_size = Max(form_kind_max_size, form_str.size); + } + } + for(;;) + { + U64 attrib_off = cursor; + U64 attrib_id = 0, form_id = 0; + cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &attrib_id); + cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &form_id); + if(attrib_id == 0) { break; } + String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); + String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); + + String8List fmt = {0}; + str8_list_pushf(temp.arena, &fmt, "%S%.*s", attrib_str, attrib_kind_max_size - attrib_str.size, g_spaces); + str8_list_pushf(temp.arena, &fmt, "%S%.*s", form_str, form_kind_max_size - form_str.size, g_spaces); + String8 value = str8_list_join(temp.arena, &fmt, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("attrib: { %S } // 0x%I64x\n", value, attrib_off); + } + dw_unindent(); + dw_printf("}\n"); + temp_end(temp); + } + scratch_end(scratch); +} + +internal void +dw_print_tag(Arena *arena, String8List *strings, int indent, Arch arch, DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_TagNode *root) +{ + Temp scratch = scratch_begin(0, 0); + + for (DW_TagNode *n = root; n != 0; n = n->sibling) { + DW_Tag *tag = &n->tag; + + // compute columns' max widths + U64 attrib_name_max_size = 0, form_kind_max_size = 0, value_max_size = 0; + for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) + { + Temp attrib_temp = temp_begin(scratch.arena); + attrib_name_max_size = Max(attrib_name_max_size, dw_string_from_attrib_kind (attrib_temp.arena, cu->version, cu->ext, attrib_n->v.attrib_kind).size); + form_kind_max_size = Max(form_kind_max_size, dw_string_from_form_kind (attrib_temp.arena, cu->version, attrib_n->v.form.kind).size); + value_max_size = Max(value_max_size, dw_string_from_attrib_value(attrib_temp.arena, input, arch, cu, line_vm, &attrib_n->v).size); + temp_end(attrib_temp); + } + attrib_name_max_size = Min(40, attrib_name_max_size); + form_kind_max_size = Min(20, form_kind_max_size); + value_max_size = Min(80, value_max_size); + + dw_printf("tag: // info_off: 0x%I64x abbrev_id: %I64u\n", tag->info_off, tag->abbrev_id); + dw_printf("{\n"); + dw_indent(); + dw_printf("kind: %S\n", dw_string_from_tag_kind(scratch.arena, tag->kind)); + for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) { + DW_Attrib *attrib = &attrib_n->v; + + String8 attrib_kind_str = dw_string_from_attrib_kind(scratch.arena, cu->version, cu->ext, attrib->attrib_kind); + String8 form_kind_str = dw_string_from_form_kind(scratch.arena, cu->version, attrib->form.kind); + String8 value_str = dw_string_from_attrib_value(scratch.arena, input, arch, cu, line_vm, attrib); + + String8List fmt = {0}; + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", attrib_kind_str, attrib_kind_str.size <= attrib_name_max_size ? attrib_name_max_size - attrib_kind_str.size : 0, g_spaces); + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", form_kind_str, form_kind_str.size <= form_kind_max_size ? form_kind_max_size - form_kind_str.size : 0, g_spaces); + str8_list_pushf(scratch.arena, &fmt, "%S%.*s", value_str, value_str.size <= value_max_size ? value_max_size - value_str.size : 0, g_spaces); + String8 attrib_str = str8_list_join(scratch.arena, &fmt, &(StringJoin){.sep = str8_lit(" ")}); + + dw_printf("attrib: { %S } // info_off: 0x%I64x\n", attrib_str, attrib->info_off); + } + + if (tag->has_children) { + dw_print_tag(arena, strings, indent, arch, input, cu, line_vm, n->first_child); + } + + dw_unindent(); + dw_printf("}\n"); + } + + scratch_end(scratch); +} + +internal +DW_PRINTER(dw_print_info) +{ + DW_Raw *input = dumper->input; + Arch arch = dumper->arch; + HashTable *line_vm_map = dw_get_line_vm_map(dumper); + Rng1U64Array cu_ranges = dw_get_info_ranges(dumper); + DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); + DW_TagTree *tag_trees = dw_get_tag_trees(dumper); + + Temp scratch = scratch_begin(&arena, 1); + for EachIndex(cu_idx, cu_ranges.count) { + Rng1U64 cu_range = cu_ranges.v[cu_idx]; + DW_CompUnit *cu = &cu_arr[cu_idx]; + String8 cu_dir = dw_string_from_tag_attrib_kind (input, cu, cu->tag, DW_AttribKind_CompDir ); + String8 cu_name = dw_string_from_tag_attrib_kind (input, cu, cu->tag, DW_AttribKind_Name ); + String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); + + DW_LineVM *line_vm = 0; + if (stmt_list.str) { + line_vm = hash_table_search_raw_raw(line_vm_map, stmt_list.str); + if (line_vm == 0) { + line_vm = dw_line_vm_init(input, cu); + // decode line table to find all the defined files, in version 5 this behaviour was deprecated + if (cu->version < DW_Version_5) { + while (dw_line_vm_step(line_vm)); + } + hash_table_push_raw_raw(scratch.arena, line_vm_map, stmt_list.str, line_vm); + } + } + + dw_printf("cu: // compile_unit[%I64u] @ %r (%M)\n", cu_idx, cu_range, dim_1u64(cu->info_range)); + dw_printf("{\n"); + dw_indent(); + dw_printf("format: %S\n", dw_string_from_format(cu->format)); + dw_printf("version: %u\n", cu->version); + dw_printf("kind: %S\n", dw_string_from_comp_unit_kind(scratch.arena, cu->kind)); + dw_printf("address_size: %I64u\n", cu->address_size); + dw_printf("abbrev_off: 0x%I64x\n", cu->abbrev_off); + dw_print_tag(arena, strings, indent, arch, input, cu, line_vm, tag_trees[cu_idx].root); + dw_unindent(); + dw_printf("} // compile_unit[/%u]\n", cu_idx); + } +} + +DW_PRINTER(dw_print_line) +{ + DW_Raw *input = dumper->input; + B32 is_verbose = dumper->is_verbose; + DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); + Temp scratch = scratch_begin(&arena, 1); + Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input->sec[DW_Section_Line].data); + for EachIndex(unit_idx, unit_ranges.count) + { + Temp unit_temp = temp_begin(scratch.arena); + + DW_CompUnit *cu = &cu_arr[unit_idx]; + DW_LineVM *vm = dw_line_vm_init(input, cu); + + // rjf: begin logging line table + dw_printf("line_table: // line_table[%I64u]\n", unit_idx); + dw_printf("{\n"); + dw_indent(); + { + // rjf: log line table header + dw_printf("header:\n"); + dw_printf("{\n"); + dw_indent(); + { + String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(vm->header.opcode_lens, vm->header.num_opcode_lens), 1); + String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(", ")}); + dw_printf("version: %u\n", vm->header.version ); + dw_printf("line_table_size: %I64u\n", vm->header.unit_length ); + dw_printf("address_size: %u\n", vm->header.address_size ); + dw_printf("segment_selector_size: %u\n", vm->header.segment_selector_size); + dw_printf("header_length: %I64u\n", vm->header.header_length ); + dw_printf("min_instruction_length: %u\n", vm->header.min_inst_len ); + dw_printf("max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); + dw_printf("default_is_stmt: %u\n", vm->header.default_is_stmt ); + dw_printf("line_base: %d\n", vm->header.line_base ); + dw_printf("line_range: %u\n", vm->header.line_range ); + dw_printf("opcode_base: %u\n", vm->header.opcode_base ); + dw_printf("opcode_lengths: { %S }\n", opcode_lengths_string ); + } + dw_unindent(); + dw_printf("}\n"); + + // rjf: log directory table + dw_printf("directory_table:\n"); + dw_printf("{\n"); + dw_indent(); + { + dw_printf("// %-4s %-30s\n", "No.", "Name"); + dw_printf("// ---- ------------------------------\n"); + for EachIndex(dir_idx, vm->header.dir_table.count) + { + dw_printf("{ %-4I64u %-30S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); + } + } + dw_unindent(); + dw_printf("}\n"); + + // rjf: log file table + dw_printf("file_table:\n"); + dw_printf("{\n"); + dw_indent(); + { + dw_printf("// %-4s %-8s %-8s %-33s %-8s %-20s\n", "No.", "Dir No.", "Time", "MD5", "Size", "Path"); + dw_printf("// ---- -------- -------- --------------------------------- -------- --------------------\n"); + for EachIndex(file_idx, vm->header.file_table.count) + { + DW_LineFile *file = &vm->header.file_table.v[file_idx]; + dw_printf("{ %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %-20S }\n", + file_idx, + file->dir_idx, + file->time_stamp, + file->md5.u64[1], + file->md5.u64[0], + file->size, + file->path); + } + } + dw_unindent(); + dw_printf("}\n"); + + // rjf: log opcodes + dw_printf("line_table:\n"); + dw_printf("{\n"); + dw_indent(); + { + dw_printf("//\n"); + dw_printf("// %-16s %-8s %-4s %-5s %-3s %-7s %-16s\n", "Address", "Line", "Col", "File", "ISA", "Discrim", "Flags"); + dw_printf("// ---------------- -------- ---- ----- --- ------- ----------------\n"); + + for(;;) + { + U64 global_opcode_off = unit_ranges.v[unit_idx].min + vm->cursor; + + if( ! dw_line_vm_step(vm)) { break; } + + Temp opcode_temp = temp_begin(unit_temp.arena); + String8List opcode_fmt = {0}; + + // opcode offset + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); + + // push opcode id + if (vm->opcode != 0) { + String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); + str8_list_pushf(arena, &opcode_fmt, "%-11S:", opcode_str); + } + + // print operands + switch(vm->opcode) + { + default: + { + if(vm->opcode >= vm->header.opcode_base) + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); + } + else + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); + } + }break; + case DW_StdOpcode_Copy: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); + }break; + case DW_StdOpcode_AdvancePc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); + }break; + case DW_StdOpcode_AdvanceLine: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); + }break; + case DW_StdOpcode_SetFile: + { + DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); + }break; + case DW_StdOpcode_SetColumn: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); + }break; + case DW_StdOpcode_NegateStmt: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); + }break; + case DW_StdOpcode_SetBasicBlock: + { + }break; + case DW_StdOpcode_ConstAddPc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); + }break; + case DW_StdOpcode_FixedAdvancePc: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); + }break; + case DW_StdOpcode_SetPrologueEnd: + { + }break; + case DW_StdOpcode_SetEpilogueBegin: + { + }break; + case DW_StdOpcode_SetIsa: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); + }break; + case DW_StdOpcode_ExtendedOpcode: + { + str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S*", dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); + //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); + switch(vm->ext_opcode) + { + case DW_ExtOpcode_EndSequence: {} break; + case DW_ExtOpcode_SetAddress: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); } break; + case DW_ExtOpcode_DefineFile: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", + vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); } break; + case DW_ExtOpcode_SetDiscriminator: { str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); }break; + } + }break; + } + + if(is_verbose) + { + String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("// %S\n", string); + } + + if(vm->new_line) { + String8List l = {0}; + if(vm->state.is_stmt) + { + str8_list_pushf(opcode_temp.arena, &l, "is_stmt"); + } + if(vm->state.end_sequence) + { + str8_list_pushf(opcode_temp.arena, &l, "end_seq"); + } + String8 flags = str8_list_join(opcode_temp.arena, &l, &(StringJoin){.sep = str8_lit("|")}); + + dw_printf("{ %#016I64x %8I64u %4I64u %5I64u %3I64u %7I64u %-16S } %s\n", vm->state.address, vm->state.line, vm->state.column, vm->state.file_index, vm->state.isa, vm->state.discriminator, flags, vm->new_seq ? "// new seq" : ""); + } + + temp_end(opcode_temp); + } + + if(vm->error.size) + { + dw_printf("ERROR: Line VM failed stepping @ 0x%I64x\n", vm->cursor); + } + } + dw_unindent(); + dw_printf("}\n"); + + temp_end(unit_temp); + } + dw_unindent(); + dw_printf("}\n"); + } + scratch_end(scratch); +} + +DW_PRINTER(dw_print_strings) +{ + DW_Raw *input = dumper->input; + String8 data = input->sec[DW_Section_Str].data; + for (U64 cursor = 0, read_size = 0; cursor < data.size; cursor += read_size) { + String8 string = {0}; + read_size = str8_deserial_read_cstr(data, cursor, &string); + dw_printf(" { 0x%08I64x %I64u \"%S\" }\n", cursor, string.size, string); + } +} + +DW_PRINTER(dw_print_frame) +{ + DW_Raw *input = dumper->input; + Arch arch = dumper->arch; + Temp scratch = scratch_begin(&arena, 1); + HashTable *cie_ht = hash_table_init(scratch.arena, 0x2000); + String8 debug_frame = input->sec[DW_Section_Frame].data; + U64 addr_size = byte_size_from_arch(arch); + + // make offset -> CIE hash table + for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { + DW_DescriptorEntry desc = {0}; + desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); + if (desc.type == DW_DescriptorEntryKind_CIE) { + String8 raw_cie = str8_substr(debug_frame, desc.entry_range); + U64 restore_pos = arena_pos(scratch.arena); + DW_CIE *cie = push_array(scratch.arena, DW_CIE, 1); + if (dw_parse_cie(raw_cie, desc.format, arch, cie)) { + hash_table_push_u64_raw(scratch.arena, cie_ht, cursor, cie); + } else { + arena_pop_to(scratch.arena, restore_pos); + } + } + } + + for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { + DW_DescriptorEntry desc = {0}; + desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); + String8 raw_desc = str8_substr(debug_frame, desc.entry_range); + switch (desc.type) { + case DW_DescriptorEntryKind_Null: {} break; + case DW_DescriptorEntryKind_CIE: { + DW_CIE cie = {0}; + if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { + String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); + + dw_printf("CIE: // entry range: %r\n", desc.entry_range); + dw_printf("{\n"); + dw_printf(" Format: %S\n", dw_string_from_format(desc.format)); + dw_printf(" Version: %u\n", cie.version); + dw_printf(" Aug string: \"%S\"\n", cie.aug_string); + dw_printf(" Code align: %I64u\n", cie.code_align_factor); + dw_printf(" Data align: %I64d\n", cie.data_align_factor); + dw_printf(" Return addr reg: %u\n", cie.ret_addr_reg); + if (cie.version > DW_Version_3) { + dw_printf(" Address size: %u\n", cie.address_size); + dw_printf(" Segment selector size: %u\n", cie.segment_selector_size); + } + dw_printf(" Initial Insturction:\n"); + dw_printf(" {\n"); + for EachNode(n, String8Node, init_insts_str_list.first) { dw_printf(" %S\n", n->string); } + dw_printf(" }\n"); + dw_printf("}\n"); + } else { + dw_printf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); + } + } break; + case DW_DescriptorEntryKind_FDE: { + DW_DescriptorEntry cie_desc = {0}; + U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); + String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); + DW_CIE cie = {0}; + dw_parse_cie(cie_data, cie_desc.format, arch, &cie); + + DW_FDE fde = {0}; + if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { + DW_Version version = DW_Version_5; + DW_Ext ext = DW_Ext_All; + String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); + dw_printf("FDE: // entry range: %r\n", desc.entry_range); + dw_printf("{\n"); + { + dw_printf(" Format: %S\n", dw_string_from_format(fde.format)); + dw_printf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); + dw_printf(" PC range: %r\n", fde.pc_range); + dw_printf(" Instructions:\n"); + dw_printf(" {\n"); + for EachNode(n, String8Node, insts_str_list.first) { dw_printf(" %S\n", n->string); } + dw_printf(" }\n"); + } + dw_printf(" Unwind:\n"); + dw_printf(" {\n"); + DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); + do { + String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); + String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); + dw_printf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); + } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); + dw_printf(" }\n"); + + dw_printf("}\n"); + } else { + dw_printf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); + } + } break; + } + } +} + +#if 0 +internal +DW_PRINTER(dw_print_debug_loc) +{ + DW_Raw *input = dumper->input; + DW_TagTree *tag_trees = dw_get_tag_trees(dumper); + DW_Section info = input->sec[DW_Section_Info]; + DW_Section loc = input->sec[DW_Section_Loc]; + + if (loc.data.size == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + // TODO: warn about overlaps in ranges + + Rng1U64Array info_ranges = dw_get_info_ranges(dumper); + DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); + + // parse debug_info for attributes with LOCLIST and store .debug_loc offsets + U64List *loc_lists = push_array(scratch.arena, U64List, info_ranges.count); + for EachIndex(cu_idx, info_ranges.count) { + DW_CompUnit *cu = &cu_arr[cu_idx]; + DW_TagTree *tag_tree = tag_trees[cu_idx]; + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, tag_tree); + it->tag_node != 0; + d2r_tag_iterator_next(it)) { + DW_TagNode *tag_node = it->tag_node; + DW_Tag tag = tag_node->tag; + for EachNode(attrib_n, DW_AttribNode, tag.attribs.first) { + DW_Attrib *attrib = &attrib_n->v; + DW_AttribClass attrib_class = dw_attrib_class_from_attrib(cu->version, cu->ext, attrib->kind); + B32 is_sect_offset = attrib_class == DW_AttribClass_LocListPtr || (attrib_class == DW_AttribClass_LocList && attrib->form.kind == DW_Form_SecOffset); + B32 is_sect_index = attrib_class == DW_AttribClass_LocList && attrib->form.kind == DW_Form_LocListx; + if (is_sect_offset) { + U64 sec_offset = dw_interp_sec_offset(attrib->form.kind, attrib->form); + u64_list_push(scratch.arena, &loc_lists[cu_idx], attrib->value.v[0]); + } else if (is_sect_index) { + // TODO: support for section indexing + } + } + } + } + + void *base = dw_base_from_sec(input, DW_Section_Loc); + Rng1U64 range = dw_range_from_sec(input, DW_Section_Loc); + + dw_printf(".debug_loc"); + dw_indent(); + dw_printf("%-8s %-8s %-8s %s", "Offset", "Min", "Max", "Expression"); + for (U32 comp_idx = 0; comp_idx < cu_range_list.count; ++comp_idx) { + Temp locs_temp = temp_begin(scratch.arena); + + DW_Version ver = ver_arr[comp_idx]; + DW_Ext ext = ext_arr[comp_idx]; + + U64Array locs = u64_array_from_list(locs_temp.arena, &loc_lists[comp_idx]); + u64_array_sort(locs.count, locs.v); + + U64Array locs_set = remove_duplicates_u64_array(locs_temp.arena, locs); + U64 address_size = address_sizes[comp_idx]; + U64 base_selector = (address_size == 8) ? max_U64 : max_U32; + + for (U64 loc_idx = 0; loc_idx < locs_set.count; ++loc_idx) { + U64 base_address = address_bases[comp_idx]; + for (U64 cursor = locs_set.v[loc_idx]; cursor < dim_1u64(range); /* empty */) { + Temp range_temp = temp_begin(arena); + + String8List list = {0}; + + // offset + str8_list_pushf(range_temp.arena, &list, "%08I64x", cursor); + + // parse entry + U64 v0 = 0, v1 = 0; + cursor += dw_based_range_read(base, range, cursor, address_size, &v0); + cursor += dw_based_range_read(base, range, cursor, address_size, &v1); + + B32 is_list_end = v0 == 0 && v1 == 0; + if (is_list_end) { + str8_list_pushf(range_temp.arena, &list, ""); + } else if (v0 == base_selector) { + base_address = v1; + } else { + U16 expr_size = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &expr_size); + Rng1U64 expr_range = rng_1u64(range.min+cursor, range.min+cursor+expr_size); + cursor += expr_size; + + // format dwarf expression + B32 is_dwarf64 = (address_size == 8); + String8 raw_expr = str8((U8*)base+expr_range.min, dim_1u64(expr_range)); + String8 expression = dw_single_line_string_from_expression(range_temp.arena, raw_expr, cu_bases[comp_idx], address_size, arch, ver, ext, input->sec[DW_Section_Loc].mode); + + // push entry + U64 min = base_address + v0; + U64 max = base_address + v1; + str8_list_pushf(range_temp.arena, &list, "%08I64x %08I64x %S", min, max, expression); + } + + // print entry + String8 print = str8_list_join(range_temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("%S", print); + + // cleanup temp + temp_end(range_temp); + + // exit check + if (is_list_end) { + break; + } + } + } + + temp_end(locs_temp); + } + dw_unindent(); + + dw_unindent(); + scratch_end(scratch); +} +#endif + +#if 0 +internal void +dw_print_debug_ranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) +{ + NotImplemented; +#if 0 + DW_Section ranges = input->sec[DW_Section_Ranges]; + void *base = dw_base_from_sec(input, DW_Section_Ranges); + Rng1U64 range = dw_range_from_sec(input, DW_Section_Ranges); + + if (dim_1u64(range) == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + Rng1U64List cu_range_list = dw_comp_unit_ranges_from_info(scratch.arena, sections->v[DW_Section_Info]); + + // parse debug_info for attributes with LOCLIST and store .debug_loc offsets + U64List *loc_lists = push_array(scratch.arena, U64List, cu_range_list.count); + U64 *address_sizes = push_array(scratch.arena, U64, cu_range_list.count); + U64 *address_bases = push_array(scratch.arena, U64, cu_range_list.count); + + { + U64 comp_idx = 0; + for (Rng1U64Node *cu_range_n = cu_range_list.first; cu_range_n != 0; cu_range_n = cu_range_n->next, ++comp_idx) { + Rng1U64 cu_range = cu_range_n->v; + DW_CompUnit cu = dw_comp_unit_from_info_offset(scratch.arena, sections, cu_range.min, relaxed); + + // store info about comp unit + address_sizes[comp_idx] = cu.address_size; + address_bases[comp_idx] = cu.base_addr; + + // parse tags + for (U64 info_off = cu.tags_range.min; info_off < cu.tags_range.max; /* empty */) { + DW_Tag tag = dw_tag_from_info_offset_cu(scratch.arena, sections, &cu, info_off); + + // parse attribs + for (DW_AttribNode *attrib_node = tag.attribs.first; attrib_node != 0; attrib_node = attrib_node->next) { + DW_Attrib *attrib = &attrib_node->v; + B32 is_sect_offset = attrib->value_class == DW_AttribClass_RngListPtr || (attrib->value_class == DW_AttribClass_RngList && attrib->form.kind == DW_Form_SecOffset); + B32 is_sect_index = attrib->value_class == DW_AttribClass_RngList && attrib->form.kind == DW_Form_RngListx; + if (is_sect_offset) { + u64_list_push(scratch.arena, &loc_lists[comp_idx], attrib->value.v[0]); + } else if (is_sect_index) { + // TODO: support for section indexing + } + } + + info_off = tag.next_info_off; + } + } + } + + dw_printf("# %S", sections->v[DW_Section_Ranges].name); + dw_indent(); + dw_printf("%-8s %-8s %-8s", "Offset", "Min", "Max"); + for (U32 comp_idx = 0; comp_idx < cu_range_list.count; ++comp_idx) { + U64Array locs = u64_array_from_list(scratch.arena, &loc_lists[comp_idx]); + u64_array_sort(locs.count, locs.v); + U64Array locs_set = remove_duplicates_u64_array(scratch.arena, locs); + U64 address_size = address_sizes[comp_idx]; + U64 base_selector = (address_size == 8) ? max_U64 : max_U32; + + for (U64 loc_idx = 0; loc_idx < locs_set.count; ++loc_idx) { + U64 base_address = address_bases[comp_idx]; + for (U64 cursor = locs_set.v[loc_idx]; cursor < dim_1u64(range); /* empty */) { + Temp range_temp = temp_begin(scratch.arena); + + String8List list = {0}; + + // offset + str8_list_pushf(range_temp.arena, &list, "%08I64x", cursor); + + // parse entry + U64 v0 = 0, v1 = 0; + cursor += dw_based_range_read(base, range, cursor, address_size, &v0); + cursor += dw_based_range_read(base, range, cursor, address_size, &v1); + + B32 is_list_end = v0 == 0 && v1 == 0; + if (is_list_end) { + str8_list_pushf(range_temp.arena, &list, ""); + } else if (v0 == base_selector) { + base_address = v1; + } else { + // push entry + U64 min = base_address + v0; + U64 max = base_address + v1; + str8_list_pushf(range_temp.arena, &list, "%08I64x %08I64x", min, max); + } + + // print entry + String8 print = str8_list_join(range_temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("%S", print); + + temp_end(range_temp); + + // exit check + if (is_list_end) { + break; + } + } + } + } +#endif +} + +internal void +dw_print_debug_aranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) +{ + NotImplemented; +#if 0 + void *base = dw_base_from_sec(sections, DW_Section_ARanges); + Rng1U64 range = dw_range_from_sec(sections, DW_Section_ARanges); + + if (dim_1u64(range) == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + dw_printf("# %S", sections->v[DW_Section_ARanges].name); + dw_indent(); + for (U64 cursor = 0; cursor < dim_1u64(range); ) { + U64 unit_length = 0; + DW_Version version = 0; + U64 debug_info_offset = 0; + U8 address_size = 0; + U8 segment_selector_size = 0; + + cursor += dw_based_range_read_length(base, range, cursor, &unit_length); + U64 unit_opl = cursor + unit_length; + cursor += dw_based_range_read_struct(base, range, cursor, &version); + + B32 is_dwarf64 = unit_length >= max_U32; + U64 int_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); + cursor += dw_based_range_read(base, range, cursor, int_size, &debug_info_offset); + + cursor += dw_based_range_read_struct(base, range, cursor, &address_size); + cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size); + + U64 tuple_size = address_size * 2 + segment_selector_size; + U64 bytes_too_far_past_boundary = cursor % tuple_size; + if (bytes_too_far_past_boundary > 0) { + cursor += tuple_size - bytes_too_far_past_boundary; + } + + dw_printf("Unit length: %I64u", unit_length); + dw_printf("Version: %u", version); + dw_printf("Debug info offset: %#I64x", debug_info_offset); + dw_printf("Address size: %u", address_size); + dw_printf("Segment selector size: %u", segment_selector_size); + + if (version != DW_Version_2) { + rd_warningf("Version value must be 2 (DWARF5 sepc, Feb 13, 2017)"); + } + + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "Range"); + for (; cursor < unit_opl; ) { + Temp temp = temp_begin(arena); + + String8List list = {0}; + + str8_list_pushf(temp.arena, &list, "%08I64x", cursor); + + U64 segment_selector = 0; + U64 address = 0; + U64 length = 0; + cursor += dw_based_range_read(base, range, cursor, segment_selector_size, &segment_selector); + cursor += dw_based_range_read(base, range, cursor, address_size, &address); + cursor += dw_based_range_read(base, range, cursor, address_size, &length); + + if (segment_selector == 0 && address == 0 && length == 0) { + str8_list_pushf(temp.arena, &list, ""); + } else { + if (segment_selector != 0) { + str8_list_pushf(temp.arena, &list, "%02I64u:", segment_selector); + } + str8_list_pushf(temp.arena, &list, "%I64x-%I64x", address, address+length); + } + + String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ") }); + dw_printf("%S", print); + + temp_end(temp); + } + dw_unindent(); + rd_newline(); + } + dw_unindent(); + + scratch_end(scratch); +#endif +} + +internal void +dw_print_debug_addr(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) +{ + NotImplemented; +#if 0 + void *base = dw_base_from_sec(sections, DW_Section_Addr); + Rng1U64 range = dw_range_from_sec(sections, DW_Section_Addr); + + if (dim_1u64(range) == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + dw_printf("# %S", sections->v[DW_Section_Addr].name); + dw_indent(); + for (U64 cursor = 0; cursor < dim_1u64(range); ) { + U64 unit_length = 0; + DW_Version version = 0; + U8 address_size = 0; + U8 segment_selector_size = 0; + + U64 unit_offset = cursor; + cursor += dw_based_range_read_length(base, range, cursor, &unit_length); + + U64 unit_opl = cursor + unit_length; + cursor += dw_based_range_read_struct(base, range, cursor, &version); + cursor += dw_based_range_read_struct(base, range, cursor, &address_size); + cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size); + + U64 tuple_size = address_size * 2 + segment_selector_size; + U64 bytes_too_far_past_boundary = cursor % tuple_size; + if (bytes_too_far_past_boundary > 0) { + cursor += tuple_size - bytes_too_far_past_boundary; + } + + dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); + dw_printf("Version: %u", version); + dw_printf("Address size: %u", address_size); + dw_printf("Segment selector size: %u", segment_selector_size); + + if (version != DW_Version_2) { + rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); + } + + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "Address"); + for (; cursor < unit_opl; ) { + Temp temp = temp_begin(arena); + + String8List list = {0}; + + str8_list_pushf(temp.arena, &list, "%08X", cursor); + + U64 segment_selector = 0; + U64 address = 0; + cursor += dw_based_range_read(base, range, cursor, segment_selector_size, &segment_selector); + cursor += dw_based_range_read(base, range, cursor, address_size, &address); + + if (segment_selector == 0 && address == 0) { + str8_list_pushf(temp.arena, &list, ""); + } else { + if (segment_selector != 0) { + str8_list_pushf(temp.arena, &list, "%02u:", segment_selector); + } + str8_list_pushf(temp.arena, &list, "%I64x", address); + } + + String8 print = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("%S", print); + + temp_end(temp); + } + dw_unindent(); + rd_newline(); + } + dw_unindent(); + + scratch_end(scratch); +#endif +} + +internal U64 +dw_based_range_read_address(void *base, Rng1U64 range, U64 offset, Rng1U64Array segment_ranges, U8 segment_selector_size, U8 address_size, U64 *address_out) +{ + U64 read_offset = offset; + + // read segment + U64 segment_selector = 0; + read_offset += dw_based_range_read(base, range, read_offset, segment_selector_size, &segment_selector); + + // read address + U64 address = 0; + read_offset += dw_based_range_read(base, range, read_offset, address_size, &address); + + // apply segment offset + B32 is_address_segment_relative = segment_selector_size > 0; + if (is_address_segment_relative) { + if (segment_selector < segment_ranges.count) { + address += segment_ranges.v[segment_selector].min; + } else { + Assert(!"invalid segment selector"); + } + } + + U64 read_size = (read_offset - offset); + return read_size; +} + +internal void +dw_print_debug_loclists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Rng1U64Array segment_virtual_ranges, Arch arch) +{ + NotImplemented; +#if 0 + void *base = dw_base_from_sec(sections, DW_Section_LocLists); + Rng1U64 range = dw_range_from_sec(sections, DW_Section_LocLists); + + if (dim_1u64(range) == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + dw_printf("# %S", sections->v[DW_Section_LocLists].name); + dw_indent(); + for (U64 cursor = 0; cursor < dim_1u64(range); ) { + U64 unit_offset = cursor; + U64 unit_length = 0; + cursor += dw_based_range_read_length(base, range, cursor, &unit_length); + + U64 unit_opl = cursor + unit_length; + DW_Version version = 0; + U8 address_size = 0; + U8 segment_selector_size = 0; + U32 offset_entry_count = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &version); + cursor += dw_based_range_read_struct(base, range, cursor, &address_size); + cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size); + cursor += dw_based_range_read_struct(base, range, cursor, &offset_entry_count); + + U64 past_header_offset = cursor; + B32 is_dwarf64 = unit_length > max_U32; + U64 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); + + dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); + dw_printf("Version: %u", version); + dw_printf("Address size: %u", address_size); + dw_printf("Segment selector size: %u", segment_selector_size); + dw_printf("Offset entry count: %u", offset_entry_count); + if (version != DW_Version_5) { + rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); + } + + if (offset_entry_count > 0) { + dw_printf("Offsets:"); + dw_indent(); + dw_printf("%-8s %-8s", "Index", "Offset"); + for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) { + U64 offset = 0; + cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); + dw_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); + } + dw_unindent(); + } + + dw_printf("Locations:"); + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "Location"); + for (; cursor < unit_opl; ) { + Temp temp = temp_begin(arena); + + String8List list = {0}; + + str8_list_pushf(temp.arena, &list, "%08I64x", cursor); + + U8 kind = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &kind); + str8_list_pushf(temp.arena, &list, "DW_LLE_%S", dw_string_from_loc_list_entry_kind(temp.arena, kind)); + + B32 has_loc_desc = 0; + switch (kind) { + case DW_LocListEntryKind_EndOfList: + break; + case DW_LocListEntryKind_DefaultLocation: { + has_loc_desc = 1; + } break; + case DW_LocListEntryKind_BaseAddress: { + U64 base_address = 0; + cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &base_address); + str8_list_pushf(temp.arena, &list, "%I64x", base_address); + } break; + case DW_LocListEntryKind_StartLength: { + U64 start = 0; + U64 length = 0; + cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &start); + cursor += dw_based_range_read_uleb128(base, range, cursor, &length); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, length); + } break; + case DW_LocListEntryKind_StartEnd: { + U64 start = 0; + U64 end = 0; + cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &start); + cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &end); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, end); + } break; + case DW_LocListEntryKind_BaseAddressX: { + U64 base_addressx = 0; + cursor += dw_based_range_read_uleb128(base, range, cursor, &base_addressx); + str8_list_pushf(temp.arena, &list, "%I64x", base_addressx); + } break; + case DW_LocListEntryKind_StartXEndX: { + U64 startx = 0; + U64 endx = 0; + cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); + cursor += dw_based_range_read_uleb128(base, range, cursor, &endx); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, endx); + } break; + case DW_LocListEntryKind_OffsetPair: { + U64 a = 0; + U64 b = 0; + cursor += dw_based_range_read_uleb128(base, range, cursor, &a); + cursor += dw_based_range_read_uleb128(base, range, cursor, &b); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", a, b); + + U8 expr_length = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &expr_length); + + String8 raw_expr = str8((U8*)base+cursor, expr_length); + cursor += expr_length; + + // TODO: we need actual cu base to format expression correctly + NotImplemented; + String8 expression = dw_single_line_string_from_expression(temp.arena, raw_expr, 0, address_size, arch, version, DW_Ext_Null, is_dwarf64); + str8_list_pushf(temp.arena, &list, "(%S)", expression); + } break; + case DW_LocListEntryKind_StartXLength: { + U64 startx = 0; + cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); + U64 length = 0; + if (version < DW_Version_5) { + // pre-standard length + cursor += dw_based_range_read(base, range, cursor, sizeof(U32), &length); + } else { + cursor += dw_based_range_read_uleb128(base, range, cursor, &length); + } + } break; + } + + String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("%S", print); + + temp_end(temp); + } + dw_unindent(); + rd_newline(); + } + dw_unindent(); + + scratch_end(scratch); +#endif +} + +internal void +dw_print_debug_rnglists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Rng1U64Array segment_ranges) +{ + NotImplemented; +#if 0 + void *base = dw_base_from_sec(sections, DW_Section_RngLists); + Rng1U64 range = dw_range_from_sec(sections, DW_Section_RngLists); + + if (dim_1u64(range) == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + dw_printf("# %S", sections->v[DW_Section_RngLists].name); + dw_indent(); + for (U64 cursor = 0; cursor < dim_1u64(range); ) { + U64 unit_offset = cursor; + U64 unit_length = 0; + cursor += dw_based_range_read_length(base, range, cursor, &unit_length); + U64 unit_opl = cursor + unit_length; + DW_Version version = 0; + U8 address_size = 0; + U8 segment_selector_size = 0; + U32 offset_entry_count = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &version); + cursor += dw_based_range_read_struct(base, range, cursor, &address_size); + cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size); + cursor += dw_based_range_read_struct(base, range, cursor, &offset_entry_count); + + U64 past_header_offset = cursor; + B32 is_dwarf64 = unit_length > max_U32; + U64 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); + + dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); + dw_printf("Version: %u", version); + dw_printf("Address size: %u", address_size); + dw_printf("Segment selector size: %u", segment_selector_size); + dw_printf("Offset entry count: %u", offset_entry_count); + + if (version != DW_Version_5) { + rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); + } + + if (offset_entry_count > 0) { + dw_printf("Offsets:"); + dw_indent(); + dw_printf("%-8s %-8s", "Index", "Offset"); + for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) { + U64 offset = 0; + cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); + dw_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); + } + dw_unindent(); + } + + dw_printf("Ranges:"); + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "Range"); + for (; cursor < unit_opl; ) { + Temp temp = temp_begin(scratch.arena); + + String8List list = {0}; + + // offset + str8_list_pushf(temp.arena, &list, "%08I64x", cursor); + + // opcode mnemonic + U8 kind = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &kind); + str8_list_pushf(temp.arena, &list, "DW_RLE_%S", dw_string_from_rng_list_entry_kind(temp.arena, kind)); + + // operand + switch (kind) { + case DW_RngListEntryKind_EndOfList: { + // empty + } break; + case DW_RngListEntryKind_BaseAddressX: { + U64 base_addressx = 0; + cursor += dw_based_range_read_uleb128(base, range, cursor, &base_addressx); + str8_list_pushf(temp.arena, &list, "%I64x", base_addressx); + } break; + case DW_RngListEntryKind_BaseAddress: { + U64 base_address = 0; + cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &base_address); + str8_list_pushf(temp.arena, &list, "%I64x", base_address); + } break; + case DW_RngListEntryKind_OffsetPair: { + U64 min = 0; + U64 max = 0; + cursor += dw_based_range_read_uleb128(base, range, cursor, &min); + cursor += dw_based_range_read_uleb128(base, range, cursor, &max); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", min, max); + } break; + case DW_RngListEntryKind_StartxLength: { + U64 startx = 0; + U64 length = 0; + cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); + cursor += dw_based_range_read_uleb128(base, range, cursor, &length); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, length); + } break; + case DW_RngListEntryKind_StartxEndx: { + U64 startx = 0; + U64 endx = 0; + cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); + cursor += dw_based_range_read_uleb128(base, range, cursor, &endx); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, endx); + } break; + case DW_RngListEntryKind_StartEnd: { + U64 start = 0; + U64 end = 0; + cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &start); + cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &end); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, end); + } break; + case DW_RngListEntryKind_StartLength: { + U64 start = 0; + U64 length = 0; + cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &start); + cursor += dw_based_range_read_uleb128(base, range, cursor, &length); + str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, length); + } break; + } + + // output row + String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); + dw_printf("%S", print); + + temp_end(temp); + } + dw_unindent(); + rd_newline(); + } + dw_unindent(); + + scratch_end(scratch); +#endif +} + +internal void +dw_format_string_table(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, DW_SectionKind sec) +{ + NotImplemented; +#if 0 + void *base = dw_base_from_sec(sections, sec); + Rng1U64 range = dw_range_from_sec(sections, sec); + + if (dim_1u64(range) == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + dw_printf("# %S", sections->v[sec].name); + dw_indent(); + for (U64 cursor = 0; cursor < dim_1u64(range); ) { + U64 unit_offset = cursor; + + U64 unit_length = 0; + cursor += dw_based_range_read_length(base, range, cursor, &unit_length); + U64 unit_opl = cursor + unit_length; + + DW_Version version = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &version); + + if (version != DW_Version_2) { + rd_warningf("Version value must be 2"); + } + + B32 is_dwarf64 = unit_length > max_U32; + U32 sec_offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); + + U64 debug_info_offset = 0, debug_info_length = 0; + cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_offset); + cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_length); + + dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); + dw_printf("Version: %u", version); + dw_printf("Debug info offset: %#I64x", debug_info_offset); + dw_printf("Debug info length: %#I64x", debug_info_length); + + dw_printf("Entries:"); + dw_indent(); + dw_printf("%-8s %-8s", "Offset", "String"); + for (; cursor < unit_opl; ) { + U64 info_offset = 0; + cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &info_offset); + String8 string = dw_based_range_read_string(base, range, cursor); + cursor += (string.size + 1); + + dw_printf("%08I64x %S", info_offset, string); + } + dw_unindent(); + rd_newline(); + } + dw_unindent(); + + scratch_end(scratch); +#endif +} + +internal void +dw_print_debug_pubnames(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) +{ + dw_format_string_table(arena, out, g_dw_indent, input, DW_Section_PubNames); +} + +internal void +dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) +{ + dw_format_string_table(arena, out, g_dw_indent, input, DW_Section_PubTypes); +} + +internal void +dw_print_debug_line_str(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) +{ + NotImplemented; +#if 0 + void *base = dw_base_from_sec(sections, DW_Section_LineStr); + Rng1U64 range = dw_range_from_sec(sections, DW_Section_LineStr); + + if (dim_1u64(range) == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + dw_printf("# %S", sections->v[DW_Section_LineStr].name); + dw_indent(); + + dw_printf("%-8s %-8s", "Offset", "String"); + for (U64 cursor = 0; cursor < dim_1u64(range); ) { + U64 offset = cursor; + String8 string = dw_based_range_read_string(base, range, cursor); + cursor += (string.size + 1); + dw_printf("%08llX %S", offset, string); + } + dw_unindent(); + + scratch_end(scratch); +#endif +} + +internal void +dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) +{ + NotImplemented; +#if 0 + void *base = dw_base_from_sec(sections, DW_Section_StrOffsets); + Rng1U64 range = dw_range_from_sec(sections, DW_Section_StrOffsets); + + void *debug_str_base = dw_base_from_sec(sections, DW_Section_Str); + Rng1U64 debug_str_range = dw_range_from_sec(sections, DW_Section_Str); + + if (dim_1u64(range) == 0) { + return; + } + + Temp scratch = scratch_begin(&arena, 1); + + dw_printf("# %S", sections->v[DW_Section_StrOffsets].name); + dw_indent(); + for (U64 cursor = 0; cursor < dim_1u64(range); ) { + U64 unit_offset = cursor; + + U64 unit_length = 0; + cursor += dw_based_range_read_length(base, range, cursor, &unit_length); + U64 unit_opl = cursor + unit_length; + + DW_Version version = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &version); + if (version != DW_Version_5) { + rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); + } + + U16 padding = 0; + cursor += dw_based_range_read_struct(base, range, cursor, &padding); + if (padding != 0) { + rd_warningf("unexpected padding byte"); + } + + B32 is_dwarf64 = unit_length > max_U32; + U32 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); + + dw_printf("Unit @ %#llX, length %I64d", unit_offset, unit_length); + dw_printf("Version: %d", version); + dw_printf("Padding: %d", padding); + dw_indent(); + dw_printf("%-8s %-8s", "@", "Offset"); + for (; cursor < unit_opl; ) { + U64 read_at = cursor; + U64 offset = 0; + cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); + dw_printf("%08I64x %08I64x", read_at, offset); + if (dim_1u64(debug_str_range) > 0) { + String8 string = dw_based_range_read_string(debug_str_base, debug_str_range, offset); + dw_printf(" %S", string); + } + rd_newline(); + } + dw_unindent(); + rd_newline(); + } + dw_unindent(); + + scratch_end(scratch); +#endif +} + +#endif + +//////////////////////////////// +//~ rjf: Dump Entry Point + +read_only struct { + DW_Printer *printer; + DW_SectionKind kind; +} g_dw_printers[] = { + { dw_print_abbrev, DW_Section_Abbrev }, + { dw_print_info, DW_Section_Info }, + { dw_print_strings, DW_Section_Str }, + { dw_print_frame, DW_Section_Frame }, + { dw_print_line, DW_Section_Line }, +}; + +internal String8List +dw_dump_list_from_sections(Arena *arena, + DW_Raw *input, + Arch arch, + DW_SectionFlags subset_flags, + B32 is_verbose) +{ + Temp scratch = scratch_begin(&arena, 1); + String8List *strings = push_array(scratch.arena, String8List, 1); + int indent = 0; + + DW_Dumper dumper = {0}; + dumper.arena = arena_alloc(); + dumper.arch = arch; + dumper.is_verbose = is_verbose; + dumper.input = input; + dumper.is_relaxed = 1; + + for EachElement(i, g_dw_printers) { + if (((1 << g_dw_printers[i].kind) & subset_flags) != 0) { + String8List s = {0}; + g_dw_printers[i].printer(arena, &s, indent + 1, &dumper); + + if (s.total_size > 0) { + dw_printf("%S:\n", str8_skip(dw_name_string_from_section_kind(g_dw_printers[i].kind), 1)); + dw_printf("{\n"); + dw_indent(); + str8_list_concat_in_place(strings, &s); + dw_unindent(); + dw_printf("}\n"); + } + } + } + + String8List result = *strings; + arena_release(dumper.arena); + scratch_end(scratch); + return result; +} + diff --git a/obsolete/dwarf/dwarf_dump_old.h b/obsolete/dwarf/dwarf_dump_old.h new file mode 100644 index 00000000..6a015952 --- /dev/null +++ b/obsolete/dwarf/dwarf_dump_old.h @@ -0,0 +1,73 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_DUMP_H +#define DWARF_DUMP_H + +typedef enum +{ + DW_DumperCacheFlag_InfoRanges = (1 << 0), + DW_DumperCacheFlag_CuArr = (1 << 1), + DW_DumperCacheFlag_LineVmMap = (1 << 2), + DW_DumperCacheFlag_TagTrees = (1 << 3), +} DW_DumperCacheFlags; + +typedef struct DW_Dumper +{ + Arena *arena; + Arch arch; + B32 is_relaxed; + B32 is_verbose; + DW_Raw *input; + DW_DumperCacheFlags cache_flags; + struct { + Rng1U64Array info_ranges; + DW_CompUnit *cu_arr; + HashTable *line_vm_map; + DW_TagTree *tag_trees; + } cache; +} DW_Dumper; + +#define DW_PRINTER(name) void name(Arena *arena, String8List *strings, int indent, DW_Dumper *dumper) +typedef DW_PRINTER(DW_Printer); + +//////////////////////////////// + +// cache +internal Rng1U64Array dw_get_info_ranges(DW_Dumper *dumper); +internal DW_CompUnit * dw_get_cu_arr(DW_Dumper *dumper); +internal HashTable * dw_get_line_vm_map(DW_Dumper *dumper); +internal DW_TagTree * dw_get_tag_trees(DW_Dumper *dumper); + +//////////////////////////////// +//~ rjf: Stringification Helpers + +internal String8List dw_string_list_from_cfi_program(Arena *arena, U64 cu_base, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format, U64 pc_begin, DW_CIE *cie, DW_DecodePtr *decode_ptr_func, void *deocde_ptr_ud, String8 program); +internal String8List dw_string_list_from_expression (Arena *arena, String8 raw_data, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); + +internal String8 dw_string_from_reg_off (Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off); +internal String8 dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib); +internal String8 dw_string_from_expression (Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); +internal String8 dw_string_from_cfa (Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa); +internal String8 dw_string_from_cfi_row (Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row); + +#if 0 +internal void dw_print_eh_frame (Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx); +internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); +internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); +internal void dw_print_debug_aranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_addr (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_loclists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges, Arch arch); +internal void dw_print_debug_rnglists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges); +internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Raw *input); +internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Raw *input); +#endif + +//////////////////////////////// +//~ rjf: Dump Entry Point + +internal String8List dw_dump_list_from_sections(Arena *arena, DW_Raw *input, Arch arch, DW_SectionFlags dump_sections, B32 is_verbose); + +#endif // DWARF_DUMP_H diff --git a/obsolete/dwarf/dwarf_expr_old.c b/obsolete/dwarf/dwarf_expr_old.c new file mode 100644 index 00000000..8f8e23ac --- /dev/null +++ b/obsolete/dwarf/dwarf_expr_old.c @@ -0,0 +1,1580 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal DW_PieceNode * +dw_piece_list_push(Arena *arena, DW_PieceList *list, DW_Piece v) +{ + DW_PieceNode *n = push_array(arena, DW_PieceNode, 1); + n->v = v; + SLLQueuePush(list->first, list->last, n); + list->count += 1; + return n; +} + +internal DW_ExprValueType +dw_expr_unsigned_value_type_from_bit_size(U64 bit_size) +{ + switch (bit_size) { + case 8: return DW_ExprValueType_U8; + case 16: return DW_ExprValueType_U16; + case 32: return DW_ExprValueType_U32; + case 64: return DW_ExprValueType_U64; + case 128: return DW_ExprValueType_U128; + case 256: return DW_ExprValueType_U256; + case 512: return DW_ExprValueType_U512; + } + AssertAlways(0 && "no suitable unsigned type was found for the specified size"); + return DW_ExprValueType_Generic; +} + +internal DW_ExprValueType +dw_expr_signed_value_type_from_bit_size(U64 bit_size) +{ + switch (bit_size) { + case 8: return DW_ExprValueType_S8; + case 16: return DW_ExprValueType_S16; + case 32: return DW_ExprValueType_S32; + case 64: return DW_ExprValueType_S64; + case 128: return DW_ExprValueType_S128; + case 256: return DW_ExprValueType_S256; + case 512: return DW_ExprValueType_S512; + } + AssertAlways(0 && "no suitable signed type was found for the specified size"); + return DW_ExprValueType_Generic; +} + +internal DW_ExprValueType +dw_expr_float_type_from_bit_size(U64 bit_size) +{ + switch (bit_size) { + case 4: return DW_ExprValueType_F32; + case 8: return DW_ExprValueType_F64; + } + AssertAlways(0 && "no suitable type was found for the specified size"); + return DW_ExprValueType_Generic; +} + +internal U64 +dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k) +{ + switch (k) { + default: { InvalidPath; } + case DW_ExprValueType_Generic: return 0; + case DW_ExprValueType_Addr: return addr_size; + case DW_ExprValueType_U8: return 1; + case DW_ExprValueType_U16: return 2; + case DW_ExprValueType_U32: return 4; + case DW_ExprValueType_U64: return 8; + case DW_ExprValueType_U128: return 16; + case DW_ExprValueType_U256: return 32; + case DW_ExprValueType_U512: return 64; + case DW_ExprValueType_S8: return 1; + case DW_ExprValueType_S16: return 2; + case DW_ExprValueType_S32: return 4; + case DW_ExprValueType_S64: return 8; + case DW_ExprValueType_S128: return 16; + case DW_ExprValueType_S256: return 32; + case DW_ExprValueType_S512: return 64; + case DW_ExprValueType_F32: return 4; + case DW_ExprValueType_F64: return 8; + } +} + +internal DW_ExprValueType +dw_expr_pick_common_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs) +{ + if (lhs == rhs) { + return lhs; + } + // unsigned vs unsigned + else if (DW_ExprValueType_IsUnsigned(lhs) && DW_ExprValueType_IsUnsigned(rhs)) { + return Max(lhs, rhs); + } + // signed vs signed + else if (DW_ExprValueType_IsSigned(lhs) && DW_ExprValueType_IsSigned(rhs)) { + return Max(lhs, rhs); + } + // (unsigned vs signed) || (signed vs unsigned) + else if ((DW_ExprValueType_IsUnsigned(lhs) && DW_ExprValueType_IsSigned(rhs)) || + (DW_ExprValueType_IsSigned(lhs) && DW_ExprValueType_IsUnsigned(rhs))) { + U64 lhs_size = dw_expr_byte_size_from_value_type(0, lhs); + U64 rhs_size = dw_expr_byte_size_from_value_type(0, rhs); + if (lhs_size < rhs_size) { + return rhs; + } else if (lhs > rhs_size) { + return lhs; + } else { + return dw_expr_unsigned_value_type_from_bit_size(lhs_size * 8); + } + } + // float vs int + else if (DW_ExprValueType_IsFloat(lhs) && DW_ExprValueType_IsInt(rhs)) { + return lhs; + } + // int vs float + else if (DW_ExprValueType_IsInt(lhs) && DW_ExprValueType_IsFloat(rhs)) { + return rhs; + } + // float vs float + else if (DW_ExprValueType_IsFloat(lhs) && DW_ExprValueType_IsFloat(rhs)) { + return Max(lhs, rhs); + } + // address vs int + else if (lhs == DW_ExprValueType_Addr && DW_ExprValueType_IsInt(rhs)) { + return DW_ExprValueType_Addr; + } + // int vs address + else if (DW_ExprValueType_IsInt(lhs) && rhs == DW_ExprValueType_Addr) { + return DW_ExprValueType_Addr; + } + // address vs float + else if (lhs == DW_ExprValueType_Addr && DW_ExprValueType_IsFloat(rhs)) { + return DW_ExprValueType_Generic; + } + // float vs address + else if (DW_ExprValueType_IsFloat(lhs) && rhs == DW_ExprValueType_Addr) { + return DW_ExprValueType_Generic; + } + // no conversion for implicit value + else if (lhs == DW_ExprValueType_Implicit || rhs == DW_ExprValueType_Implicit) { + return DW_ExprValueType_Generic; + } + AssertAlways(!"undefined conversion case"); + return DW_ExprValueType_Generic; +} + +internal DW_ExprValueType +dw_expr_pick_common_compar_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs) +{ + DW_ExprValueType result; + if (lhs == DW_ExprValueType_Generic || rhs == DW_ExprValueType_Generic) { + result = DW_ExprValueType_S64; + } else { + result = dw_expr_pick_common_value_type(lhs, rhs); + } + return result; +} + +internal DW_ExprValue +dw_expr_cast(DW_ExprValue value, DW_ExprValueType type) +{ + DW_ExprValue result = { type }; + +#define CastTable(f, t) \ +switch (value.type) { \ +case DW_ExprValueType_Generic: { MemoryCopy(&result.f, value.generic.str, Min(sizeof(t), value.generic.size)); } break; \ +case DW_ExprValueType_U8: { result.f = (t)value.u8; } break; \ +case DW_ExprValueType_U16: { result.f = (t)value.u16; } break; \ +case DW_ExprValueType_U32: { result.f = (t)value.u32; } break; \ +case DW_ExprValueType_U64: { result.f = (t)value.u64; } break; \ +case DW_ExprValueType_U128: { NotImplemented; } break; \ +case DW_ExprValueType_U256: { NotImplemented; } break; \ +case DW_ExprValueType_U512: { NotImplemented; } break; \ +case DW_ExprValueType_S8: { result.f = (t)value.s8; } break; \ +case DW_ExprValueType_S16: { result.f = (t)value.s16; } break; \ +case DW_ExprValueType_S32: { result.f = (t)value.s32; } break; \ +case DW_ExprValueType_S64: { result.f = (t)value.s64; } break; \ +case DW_ExprValueType_S128: { NotImplemented; } break; \ +case DW_ExprValueType_S256: { NotImplemented; } break; \ +case DW_ExprValueType_S512: { NotImplemented; } break; \ +case DW_ExprValueType_F32: { result.f = (t)value.f32; } break; \ +case DW_ExprValueType_F64: { result.f = (t)value.f64; } break; \ +case DW_ExprValueType_Addr: { result.f = (t)value.addr; } break; \ +case DW_ExprValueType_Implicit: { InvalidPath; } break; \ +case DW_ExprValueType_Bool: { result.f = (t)value.boolean; } break; \ +default: { InvalidPath; } break; \ +} + + switch (type) { + case DW_ExprValueType_Generic: {} break; + case DW_ExprValueType_U8: { CastTable(u8, U8); } break; + case DW_ExprValueType_U16: { CastTable(u16, U16); } break; + case DW_ExprValueType_U32: { CastTable(u32, U32); } break; + case DW_ExprValueType_U64: { CastTable(u64, U64); } break; + case DW_ExprValueType_U128: { NotImplemented; } break; + case DW_ExprValueType_U256: { NotImplemented; } break; + case DW_ExprValueType_U512: { NotImplemented; } break; + case DW_ExprValueType_S8: { CastTable(s8, S8); } break; + case DW_ExprValueType_S16: { CastTable(s16, S16); } break; + case DW_ExprValueType_S32: { CastTable(s32, S32); } break; + case DW_ExprValueType_S64: { CastTable(s64, S64); } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + case DW_ExprValueType_F32: { CastTable(f32, F32); } break; + case DW_ExprValueType_F64: { CastTable(f64, F64); } break; + case DW_ExprValueType_Addr: { CastTable(addr, U64); } break; + case DW_ExprValueType_Implicit: { NotImplemented; } break; + case DW_ExprValueType_Bool: { CastTable(boolean, DW_ExprBool); } break; + } + +#undef CastTable + return result; +} + +internal DW_ExprValue +dw_expr_add(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 + common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 + common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 + common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 + common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 + common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 + common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 + common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 + common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 + common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr + common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_minus(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 - common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 - common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 - common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 - common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 - common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 - common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 - common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 - common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 - common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr - common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_mul(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 * common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 * common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 * common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 * common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 * common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 * common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 * common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 * common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 * common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr * common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_div(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 / common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 / common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 / common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 / common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 / common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 / common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 / common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 / common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 / common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr / common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_mod(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 % common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 % common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 % common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 % common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 % common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 % common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 % common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr % common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + return result; +} + +internal DW_ExprValue +dw_expr_eq(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 == common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 == common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 == common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 == common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 == common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 == common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 == common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 == common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 == common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr == common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_ge(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >= common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >= common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >= common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >= common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >= common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >= common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >= common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 >= common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 >= common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >= common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_gt(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 > common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 > common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 > common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 > common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 > common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 > common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 > common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 > common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 > common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr > common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_le(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 <= common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 <= common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 <= common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 <= common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 <= common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 <= common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 <= common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 <= common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 <= common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr <= common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_lt(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 < common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 < common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 < common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 < common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 < common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 < common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 < common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 < common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 < common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr < common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_ne(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 != common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 != common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 != common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 != common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 != common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 != common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 != common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 != common_rhs.f32; } break; + case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 != common_rhs.f64; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr != common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_xor(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 ^ common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 ^ common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 ^ common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 ^ common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 ^ common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 ^ common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 ^ common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr ^ common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_and(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 & common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 & common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 & common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 & common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 & common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 & common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 & common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr & common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_or(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 | common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 | common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 | common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 | common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 | common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 | common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 | common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr | common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_shl(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 << common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 << common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 << common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 << common_rhs.u64; } break; + + case DW_ExprValueType_U128: + case DW_ExprValueType_U256: + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 << common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 << common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 << common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr << common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_shr(DW_ExprValue rhs, DW_ExprValue lhs) +{ + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >> common_rhs.u8; } break; + case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >> common_rhs.u16; } break; + case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >> common_rhs.u32; } break; + case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >> common_rhs.u64; } break; + + case DW_ExprValueType_U128: { NotImplemented; } break; + case DW_ExprValueType_U256: { NotImplemented; } break; + case DW_ExprValueType_U512: { NotImplemented; } break; + + case DW_ExprValueType_Bool: { InvalidPath; } break; + case DW_ExprValueType_S8: { InvalidPath; } break; + case DW_ExprValueType_S16: { InvalidPath; } break; + case DW_ExprValueType_S32: { InvalidPath; } break; + case DW_ExprValueType_S64: { InvalidPath; } break; + case DW_ExprValueType_S128: { InvalidPath; } break; + case DW_ExprValueType_S256: { InvalidPath; } break; + case DW_ExprValueType_S512: { InvalidPath; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_shra(DW_ExprValue rhs, DW_ExprValue lhs) +{ + if (DW_ExprValueType_IsUnsigned(lhs.type)) { + DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, lhs.type) * 8); + lhs = dw_expr_cast(lhs, new_type); + } + + if (DW_ExprValueType_IsUnsigned(rhs.type)) { + DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, rhs.type) * 8); + rhs = dw_expr_cast(rhs, new_type); + } + + DW_ExprValue result = {0}; + result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); + + DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); + DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); + + switch (result.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { InvalidPath; } break; + case DW_ExprValueType_U16: { InvalidPath; } break; + case DW_ExprValueType_U32: { InvalidPath; } break; + case DW_ExprValueType_U64: { InvalidPath; } break; + case DW_ExprValueType_U128: { InvalidPath; } break; + case DW_ExprValueType_U256: { InvalidPath; } break; + case DW_ExprValueType_U512: { InvalidPath; } break; + + case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; + case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; + case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >> common_rhs.s16; } break; + case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >> common_rhs.s32; } break; + case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >> common_rhs.s64; } break; + + case DW_ExprValueType_S128: + case DW_ExprValueType_S256: + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { InvalidPath; } break; + case DW_ExprValueType_F64: { InvalidPath; } break; + case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + + default: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_abs(DW_ExprValue value) +{ + DW_ExprValue result = value; + + switch (value.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: {}; break; + case DW_ExprValueType_U16: {}; break; + case DW_ExprValueType_U32: {}; break; + case DW_ExprValueType_U64: {}; break; + case DW_ExprValueType_U128: {}; break; + case DW_ExprValueType_U256: {}; break; + case DW_ExprValueType_U512: {}; break; + + case DW_ExprValueType_S8: { result.s8 = abs_s64(result.s8); } break; + case DW_ExprValueType_S16: { result.s16 = abs_s64(result.s16); } break; + case DW_ExprValueType_S32: { result.s32 = abs_s64(result.s32); } break; + case DW_ExprValueType_S64: { result.s64 = abs_s64(result.s64); } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = abs_f32(result.f32); } break; + case DW_ExprValueType_F64: { result.f64 = abs_f64(result.f64); } break; + + case DW_ExprValueType_Addr: {} break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_neg(DW_ExprValue value) +{ + DW_ExprValue result = value; + + switch (value.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = -result.u8; }; break; + case DW_ExprValueType_U16: { result.u16 = -result.u16; }; break; + case DW_ExprValueType_U32: { result.u32 = -result.u32; }; break; + case DW_ExprValueType_U64: { result.u64 = -result.u64; }; break; + case DW_ExprValueType_U128: { NotImplemented; }; break; + case DW_ExprValueType_U256: { NotImplemented; }; break; + case DW_ExprValueType_U512: { NotImplemented; }; break; + + case DW_ExprValueType_S8: { result.s8 = -result.s8; } break; + case DW_ExprValueType_S16: { result.s16 = -result.s16; } break; + case DW_ExprValueType_S32: { result.s32 = -result.s32; } break; + case DW_ExprValueType_S64: { result.s64 = -result.s64; } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = -result.f32; } break; + case DW_ExprValueType_F64: { result.f64 = -result.f64; } break; + + case DW_ExprValueType_Addr: { result.addr = -result.addr; } break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + } + + return result; +} + +internal DW_ExprValue +dw_expr_not(DW_ExprValue value) +{ + DW_ExprValue result = value; + + switch (value.type) { + case DW_ExprValueType_Generic: { InvalidPath; } break; + + case DW_ExprValueType_U8: { result.u8 = !result.u8; }; break; + case DW_ExprValueType_U16: { result.u16 = !result.u16; }; break; + case DW_ExprValueType_U32: { result.u32 = !result.u32; }; break; + case DW_ExprValueType_U64: { result.u64 = !result.u64; }; break; + case DW_ExprValueType_U128: { NotImplemented; }; break; + case DW_ExprValueType_U256: { NotImplemented; }; break; + case DW_ExprValueType_U512: { NotImplemented; }; break; + + case DW_ExprValueType_S8: { result.s8 = !result.s8; } break; + case DW_ExprValueType_S16: { result.s16 = !result.s16; } break; + case DW_ExprValueType_S32: { result.s32 = !result.s32; } break; + case DW_ExprValueType_S64: { result.s64 = !result.s64; } break; + case DW_ExprValueType_S128: { NotImplemented; } break; + case DW_ExprValueType_S256: { NotImplemented; } break; + case DW_ExprValueType_S512: { NotImplemented; } break; + + case DW_ExprValueType_F32: { result.f32 = !result.f32; } break; + case DW_ExprValueType_F64: { result.f64 = !result.f64; } break; + + case DW_ExprValueType_Addr: { result.addr = !result.addr; } break; + case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; + case DW_ExprValueType_Implicit: { InvalidPath; } break; + } + + return result; +} + +internal String8 +dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v) +{ + String8 s = {0}; + switch (v.type) { + case DW_ExprValueType_Generic: { } break; + case DW_ExprValueType_U8: { s = str8_struct(&v.u8); } break; + case DW_ExprValueType_U16: { s = str8_struct(&v.u16); } break; + case DW_ExprValueType_U32: { s = str8_struct(&v.u32); } break; + case DW_ExprValueType_U64: { s = str8_struct(&v.u64); } break; + case DW_ExprValueType_U128: { s = str8_struct(&v.u128); } break; + case DW_ExprValueType_U256: { s = str8_struct(&v.u256); } break; + case DW_ExprValueType_U512: { s = str8_struct(&v.u512); } break; + case DW_ExprValueType_S8: { s = str8_struct(&v.s8); } break; + case DW_ExprValueType_S16: { s = str8_struct(&v.s16); } break; + case DW_ExprValueType_S32: { s = str8_struct(&v.s32); } break; + case DW_ExprValueType_S64: { s = str8_struct(&v.s64); } break; + case DW_ExprValueType_F32: { s = str8_struct(&v.f32); } break; + case DW_ExprValueType_F64: { s = str8_struct(&v.f64); } break; + case DW_ExprValueType_Addr: { s = str8((U8 *)&v.addr, addr_size); } break; + case DW_ExprValueType_Implicit: { s = v.implicit; } break; + default: { NotImplemented; } break; + } + return str8_copy(arena, s); +} + +internal DW_ExprValueNode * +dw_expr_stack_push(Arena *arena, DW_ExprStack *stack, DW_ExprValue value) +{ + DW_ExprValueNode *n = push_array(arena, DW_ExprValueNode, 1); + n->v = value; + SLLStackPush(stack->top, n); + stack->count += 1; + return n; +} + +internal DW_ExprValueNode * +dw_expr_stack_push_unsigned(Arena *arena, DW_ExprStack *stack, void *value, U64 value_size) +{ + DW_ExprValueNode *n = 0; + switch (value_size) { + case 0: {} break; + case 1: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = *(U8 *)value }); } break; + case 2: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = *(U16 *)value }); } break; + case 4: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = *(U32 *)value }); } break; + case 8: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = *(U64 *)value }); } break; + default: { NotImplemented; } break; + } + return n; +} + +internal DW_ExprValue +dw_expr_stack_pop(DW_ExprStack *stack) +{ + DW_ExprValueNode *n = stack->top; + DW_ExprValue v = n->v; + SLLStackPop(stack->top); + return v; +} + +internal DW_ExprValue +dw_expr_stack_peek(DW_ExprStack *stack) +{ + return stack->top->v; +} + +internal DW_ExprValueNode * +dw_expr_stack_pick(DW_ExprStack *stack, U64 idx) +{ + DW_ExprValueNode *n = 0; + if (idx < stack->count) { + U64 c = idx; + for (n = stack->top; n != 0 && c > 0; n = n->next, c -= 1); + } + return n; +} + +internal DW_ExprInst * +dw_expr_inst_from_delta(DW_ExprInst *inst, S16 delta) +{ + B32 skip_fwd = inst->operands[0].s16 >= 0; + DW_ExprInst *i = inst; + U16 u_delta = abs_s64(inst->operands[0].s16); + U64 cursor = 0; + for (i = skip_fwd ? inst : inst->prev; i != 0 && cursor < u_delta; i = skip_fwd ? inst->next : inst->prev) { + cursor += inst->size; + } + if (cursor != u_delta) { + i = 0; + } + return i; +} + +internal DW_ExprEvalResult +dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls, U64 exec_op_limit, DW_Expr expr, void *reg_block, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out) +{ + Temp scratch = scratch_begin(&arena, 1); + + ARCH_Info *arch_info = arch_info_from_arch(arch); + + DW_ExprEvalResult result = DW_ExprEvalResult_Fail; + DW_PieceList pieces = {0}; + DW_ExprStack *stack = push_array(scratch.arena, DW_ExprStack, 1); + U64 exec_op_count = 0; + + for EachNode(inst, DW_ExprInst, expr.first) { + again:; + + exec_op_count += 1; + if (exec_op_count > exec_op_limit) { + Assert(0 && "reached opcode exec limit on the expression"); + result = DW_ExprEvalResult_ExecOpLimitReached; + goto exit; + } + + U64 pop_count = dw_pop_count_from_expr_op(inst->opcode); + if (pop_count > stack->count) { + Assert(0 && "not enough values on the stack to evaluate the instruction"); + goto exit; + } + + switch (inst->opcode) { + case DW_ExprOp_Nop: {} break; + + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->opcode - DW_ExprOp_Lit0 }); + } break; + + case DW_ExprOp_Const1U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->operands[0].u8 }); } break; + case DW_ExprOp_Const2U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = inst->operands[0].u16 }); } break; + case DW_ExprOp_Const4U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = inst->operands[0].u32 }); } break; + case DW_ExprOp_Const8U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; + case DW_ExprOp_Const1S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S8, .s8 = inst->operands[0].s8 }); } break; + case DW_ExprOp_Const2S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S16, .s16 = inst->operands[0].s16 }); } break; + case DW_ExprOp_Const4S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S32, .s32 = inst->operands[0].s32 }); } break; + case DW_ExprOp_Const8S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; + case DW_ExprOp_ConstU: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; + case DW_ExprOp_ConstS: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; + case DW_ExprOp_Addr: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = inst->operands[0].u64 }); } break; + + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + { + DW_Reg reg_dw_id = inst->opcode - DW_ExprOp_Reg0; + U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + U8 *reg_value = push_array(scratch.arena, U8, reg_size); + if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), reg_value)) + { + goto exit; + } + dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); + }break; + + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + { + DW_Reg reg_dw_id = inst->opcode - DW_ExprOp_BReg0; + U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + AssertAlways(reg_size <= byte_size_from_arch(arch)); + + U64 reg_value = 0; + if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), ®_value)) + { + goto exit; + } + + U64 addr = (U64)((S64)reg_value + inst->operands[0].s64); + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + }break; + + case DW_ExprOp_RegX: + { + DW_Reg reg_dw_id = inst->operands[0].u64; + U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); + U8 *reg_value = push_array(scratch.arena, U8, reg_size); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), reg_value)) + { + goto exit; + } + dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); + }break; + + case DW_ExprOp_BRegX: + { + DW_Reg reg_dw_id = (DW_Reg)inst->operands[0].u64; + U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); + AssertAlways(reg_size <= byte_size_from_arch(arch)); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + + U64 reg_value = 0; + if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), ®_value)) + { + goto exit; + } + + U64 addr = (U64)((S64)reg_value + inst->operands[1].s64); + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + }break; + + case DW_ExprOp_FBReg: { + U64 addr = frame_base + inst->operands[0].s64; + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + } break; + + case DW_ExprOp_ImplicitValue: { + if (inst->operands[0].block.size <= sizeof(U512)) { + dw_expr_stack_push_unsigned(scratch.arena, stack, inst->operands[0].block.str, inst->operands[0].block.size); + } else { + NotImplemented; + } + } break; + + case DW_ExprOp_Piece: { + B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); + if (is_undefined) { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 * 8 }); + } else { + DW_ExprValue top = dw_expr_stack_pop(stack); + + String8 value; + + // piece is a memory reference + if (top.type == DW_ExprValueType_Addr) { + U64 value_size = inst->operands[0].u64; + U8 *value_buffer = push_array(arena, U8, value_size); + MachineOpResult read_result = mem_read(top.addr, value_buffer, value_size, mem_read_ud); + if (read_result != MachineOpResult_Ok) { Assert(0 && "failed to read piece memory referece"); goto exit; } + } + // piece is a value + else { + value = dw_string_from_expr_value(arena, arch, top); + } + + if (inst->operands[0].u64 > value.size) { Assert(0 && "out of bounds size in the piece opcode"); goto exit; } + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64 * 8, .value = value.str }); + } + } break; + + case DW_ExprOp_BitPiece: { + B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); + if (is_undefined) { + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 }); + } else { + String8 value; + if (dw_expr_stack_peek(stack).type == DW_ExprValueType_Addr) { + NotImplemented; + } else { + value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); + } + if (inst->operands[0].u64 > value.size * 8) { Assert(0 && "out of bounds size in piece opcode"); goto exit; } + dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64, .value = value.str }); + } + } break; + + case DW_ExprOp_Pick: { + DW_ExprValueNode *src = dw_expr_stack_pick(stack, inst->operands[0].u8); + if (src) { + dw_expr_stack_push(scratch.arena, stack, src->v); + } else { + Assert(0 && "out of bounds stack index"); + goto exit; + } + } break; + + case DW_ExprOp_Over: { + DW_ExprValueNode *src = dw_expr_stack_pick(stack, 1); + if (src) { + dw_expr_stack_push(scratch.arena, stack, src->v); + } else { + Assert(0 && "out of bounds stack index"); + goto exit; + } + } break; + + case DW_ExprOp_PlusUConst: { + DW_ExprValue lhs = dw_expr_stack_pop(stack); + DW_ExprValue rhs = { .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }; + DW_ExprValue sum = dw_expr_add(lhs, rhs); + dw_expr_stack_push(scratch.arena, stack, sum); + } break; + + case DW_ExprOp_Skip: { + DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); + + if (i == 0) { + Assert(0 && "seeking to an invalid offset"); + goto exit; + } + + inst = i; + goto again; + } + + case DW_ExprOp_Bra: { + DW_ExprValue cond = dw_expr_stack_pop(stack); + + if (cond.type != DW_ExprValueType_S16) { + Assert(0 && "unexpected value"); + goto exit; + } + + DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); + + if (i == 0) { + Assert(0 && "seeking to an invalid offset"); + goto exit; + } + + inst = i; + goto again; + } + + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: { + NotImplemented; + } break; + + case DW_ExprOp_GNU_Convert: + case DW_ExprOp_Convert: { + if (inst->operands[0].u64 == 0) { + DW_ExprValue value = dw_expr_stack_pop(stack); + DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); + dw_expr_stack_push(scratch.arena, stack, new_value); + } else { + NotImplemented; + } + } break; + + case DW_ExprOp_Reinterpret: { + if (inst->operands[0].u64 == 0) { + DW_ExprValue value = dw_expr_stack_pop(stack); + DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); + dw_expr_stack_push(scratch.arena, stack, new_value); + } else { + NotImplemented; + } + } break; + + case DW_ExprOp_GNU_ParameterRef: { NotImplemented; } break; + case DW_ExprOp_GNU_DerefType: { NotImplemented; } break; + case DW_ExprOp_DerefType: { NotImplemented; } break; + case DW_ExprOp_ConstType: { NotImplemented; } break; + case DW_ExprOp_GNU_ConstType: { NotImplemented; } break; + case DW_ExprOp_RegvalType: { NotImplemented; } break; + + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: + { + DW_Expr entry_value_expr = dw_expr_from_data(scratch.arena, format, byte_size_from_arch(arch), inst->operands[0].block); + DW_ExprValue entry_value; + result = dw_eval_expr(scratch.arena, arch, format, frame_base, cfa, tls, exec_op_limit, entry_value_expr, reg_block, mem_read, mem_read_ud, &entry_value); + if (result != DW_ExprEvalResult_Ok) { goto exit; } + dw_expr_stack_push(scratch.arena, stack, entry_value); + } break; + + case DW_ExprOp_Addrx: { NotImplemented; } break; + + case DW_ExprOp_CallFrameCfa: { + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = cfa }); + } break; + + case DW_ExprOp_PushObjectAddress: { NotImplemented; } break; + + case DW_ExprOp_Plus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_add(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Minus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_minus(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Div: { dw_expr_stack_push(scratch.arena, stack, dw_expr_div(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Mul: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mul(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Mod: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mod(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Eq: { dw_expr_stack_push(scratch.arena, stack, dw_expr_eq(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Ge: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ge(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Gt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_gt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Le: { dw_expr_stack_push(scratch.arena, stack, dw_expr_le(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Lt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_lt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Ne: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ne(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Xor: { dw_expr_stack_push(scratch.arena, stack, dw_expr_xor(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_And: { dw_expr_stack_push(scratch.arena, stack, dw_expr_and(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Or: { dw_expr_stack_push(scratch.arena, stack, dw_expr_or(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shl: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shl(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shr: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shr(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Shra: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shra(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Abs: { dw_expr_stack_push(scratch.arena, stack, dw_expr_abs(dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Neg: { dw_expr_stack_push(scratch.arena, stack, dw_expr_neg(dw_expr_stack_pop(stack))); } break; + case DW_ExprOp_Not: { dw_expr_stack_push(scratch.arena, stack, dw_expr_not(dw_expr_stack_pop(stack))); } break; + + case DW_ExprOp_Dup: { + dw_expr_stack_push(scratch.arena, stack, dw_expr_stack_peek(stack)); + } break; + + case DW_ExprOp_Rot: { + DW_ExprValue first = dw_expr_stack_pop(stack); + DW_ExprValue second = dw_expr_stack_pop(stack); + DW_ExprValue third = dw_expr_stack_pop(stack); + dw_expr_stack_push(scratch.arena, stack, first); // -> third + dw_expr_stack_push(scratch.arena, stack, third); // -> second + dw_expr_stack_push(scratch.arena, stack, second); // -> first + } break; + + case DW_ExprOp_Swap: { + DW_ExprValue first = dw_expr_stack_pop(stack); + DW_ExprValue second = dw_expr_stack_pop(stack); + dw_expr_stack_push(scratch.arena, stack, first); // -> second + dw_expr_stack_push(scratch.arena, stack, second); // -> first + } break; + + case DW_ExprOp_Drop: { + dw_expr_stack_pop(stack); + } break; + + case DW_ExprOp_Deref: { + DW_ExprValue value = dw_expr_stack_pop(stack); + + // expression must be of an integral type + if (!DW_ExprValueType_IsInt(value.type)) { goto exit; } + + // treat value as an address + DW_ExprValue addr = dw_expr_cast(value, DW_ExprValueType_Addr); + + // read pointer size from the address + U64 addr_size = byte_size_from_arch(arch); + U8 *generic_value = push_array(scratch.arena, U8, addr_size); + MachineOpResult read_result = mem_read(addr.addr, generic_value, addr_size, mem_read_ud); + if (read_result != MachineOpResult_Ok) { goto exit; } + + // push generic data + dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Generic, .generic = str8(generic_value, addr_size) }); + } break; + + case DW_ExprOp_StackValue: { + stack->top->v.type = dw_expr_unsigned_value_type_from_bit_size(bit_size_from_arch(arch)); + } break; + + case DW_ExprOp_GNU_PushTlsAddress: + case DW_ExprOp_FormTlsAddress: { + DW_ExprValue tls_off = dw_expr_stack_pop(stack); + DW_ExprValue tls_base = { .type = DW_ExprValueType_Addr, .addr = tls }; + DW_ExprValue tls_addr = dw_expr_add(tls_base, tls_off); + dw_expr_stack_push(scratch.arena, stack, tls_addr); + } break; + } + } + + // composite value + if (pieces.count > 0) { +#if 0 + U64 total_bit_size = 0; + for EachNode (n, DW_PieceNode, pieces.first) { + total_bit_size += n->v.bit_size; + } + + U64 value_size = CeilIntegerDiv(total_bit_size, 8); + U8 *value = push_array(arena, U8, value_size); + Rng1U64 *ranges = push_array(arena, Rng1U64, pieces.count); + U64 *offsets = push_array(arena, U64, pieces.count); + U64 value_idx = 0; + U64 value_cursor = 0; + U64 piece_cursor = 0; + for EachNode(n, DW_PieceNode, pieces.first) { + if (n->v.kind == DW_PieceKind_Value) { + ranges[value_idx] = r1u64(piece_cursor, piece_cursor + n->v.bit_size); + offsets[value_idx] = value_cursor; + for (U64 i = 0; i < n->v.bit_size; i += 8) { + U64 to_copy = Min(8, n->v.bit_size - i); + if (value_cursor % 8 == 0) { + value[value_cursor / 8] = n->v.value[i]; + } else { + value[value_cursor / 8] |= n->v.value[i] << (value_cursor % 8); + value[AlignPow2(value_cursor / 8, 8)] |= n->v.value[i] >> (value_cursor % 8); + } + value_cursor += to_copy; + } + value_idx += 1; + } + piece_cursor += n->v.bit_size; + } + + value_out->type = DW_ExprValueType_Generic; + value_out->ranges = (Rng1U64Array){ .count = pieces.count, .v = ranges }; + value_out->offsets = offsets; + value_out->generic = str8(value, value_size); +#else + NotImplemented; +#endif + } + // scalar + else { + if (stack->top) { + *value_out = stack->top->v; + if (value_out->type == DW_ExprValueType_Generic) { + value_out->generic = push_str8_copy(arena, value_out->generic); + } + + Rng1U64 *range = push_array(arena, Rng1U64, 1); + *range = r1u64(0, max_U64); + value_out->ranges = (Rng1U64Array){ .count = 1, .v = range }; + value_out->offsets = push_array(arena, U64, 1); + } else { + MemoryZeroStruct(value_out); + } + } + + result = DW_ExprEvalResult_Ok; + exit:; + scratch_end(scratch); + return result; +} diff --git a/obsolete/dwarf/dwarf_expr_old.h b/obsolete/dwarf/dwarf_expr_old.h new file mode 100644 index 00000000..432b5b22 --- /dev/null +++ b/obsolete/dwarf/dwarf_expr_old.h @@ -0,0 +1,233 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_EXPR_H +#define DWARF_EXPR_H + +//////////////////////////////// +// evaluator + +#define DW_ExprValueType_IsSigned(x) ((x) == DW_ExprValueType_S8 || (x) == DW_ExprValueType_S16 || (x) == DW_ExprValueType_S32 || (x) == DW_ExprValueType_S64 || (x) == DW_ExprValueType_S128 || (x) == DW_ExprValueType_S256 || (x) == DW_ExprValueType_S512) +#define DW_ExprValueType_IsUnsigned(x) ((x) == DW_ExprValueType_U8 || (x) == DW_ExprValueType_U16 || (x) == DW_ExprValueType_U32 || (x) == DW_ExprValueType_U64 || (x) == DW_ExprValueType_U128 || (x) == DW_ExprValueType_U256 || (x) == DW_ExprValueType_U512) +#define DW_ExprValueType_IsFloat(x) ((x) == DW_ExprValueType_F32 || (x) == DW_ExprValueType_F64) +#define DW_ExprValueType_IsInt(x) (DW_ExprValueType_IsSigned(x) || DW_ExprValueType_IsUnsigned(x) || (x) == DW_ExprValueType_Addr) +typedef enum +{ + DW_ExprValueType_Generic, + DW_ExprValueType_U8, + DW_ExprValueType_U16, + DW_ExprValueType_U32, + DW_ExprValueType_U64, + DW_ExprValueType_U128, + DW_ExprValueType_U256, + DW_ExprValueType_U512, + DW_ExprValueType_S8, + DW_ExprValueType_S16, + DW_ExprValueType_S32, + DW_ExprValueType_S64, + DW_ExprValueType_S128, + DW_ExprValueType_S256, + DW_ExprValueType_S512, + DW_ExprValueType_F32, + DW_ExprValueType_F64, + DW_ExprValueType_Addr, + DW_ExprValueType_Implicit, + DW_ExprValueType_Bool, +} DW_ExprValueType; + +typedef S8 DW_ExprBool; + +typedef struct DW_ExprValue +{ + DW_ExprValueType type; + Rng1U64Array ranges; + U64 *offsets; + union { + U8 u8; + U16 u16; + U32 u32; + U64 u64; + U128 u128; + U256 u256; + U512 u512; + S8 s8; + S16 s16; + S32 s32; + S64 s64; + F32 f32; + F64 f64; + U64 addr; + DW_ExprBool boolean; + String8 implicit; + String8 generic; + }; +} DW_ExprValue; + +typedef struct DW_ExprValueNode +{ + DW_ExprValue v; + struct DW_ExprValueNode *next; +} DW_ExprValueNode; + +typedef enum +{ + DW_PieceKind_Null, + DW_PieceKind_Value, + DW_PieceKind_Undefined, +} DW_PieceKind; + +typedef struct DW_Piece +{ + DW_PieceKind kind; + U64 bit_size; + U8 *value; +} DW_Piece; + +typedef struct DW_PieceNode +{ + DW_Piece v; + struct DW_PieceNode *next; +} DW_PieceNode; + +typedef struct DW_PieceList +{ + U64 count; + DW_PieceNode *first; + DW_PieceNode *last; +} DW_PieceList; + +typedef struct DW_ExprStack +{ + U64 count; + DW_ExprValueNode *top; +} DW_ExprStack; + +typedef enum +{ + DW_ExprEvalResult_Fail, + DW_ExprEvalResult_Ok, + DW_ExprEvalResult_Maybe, + DW_ExprEvalResult_ExecOpLimitReached, +} DW_ExprEvalResult; + +//////////////////////////////// +// encoder + +typedef enum +{ + DW_ExprEncType_Null, + DW_ExprEncType_Op, + DW_ExprEncType_U8, + DW_ExprEncType_U16, + DW_ExprEncType_U32, + DW_ExprEncType_U64, + DW_ExprEncType_S8, + DW_ExprEncType_S16, + DW_ExprEncType_S32, + DW_ExprEncType_S64, + DW_ExprEncType_ULEB128, + DW_ExprEncType_SLEB128, + DW_ExprEncType_Addr, + DW_ExprEncType_Block, + DW_ExprEncType_DwarfUInt, + DW_ExprEncType_Label, + DW_ExprEncType_DeclLabel, +} DW_ExprEncType; + +typedef struct DW_ExprEnc +{ + DW_ExprEncType type; + union { + DW_ExprOp op; + U8 u8; + U16 u16; + U32 u32; + U64 u64; + S8 s8; + S16 s16; + S32 s32; + S64 s64; + U64 addr; + String8 block; + String8 label; + }; +} DW_ExprEnc; + +#define DW_ExprEnc_Op(v) { .type = DW_ExprEncType_Op, .op = DW_ExprOp_##v } +#define DW_ExprEnc_U8(v) { .type = DW_ExprEncType_U8, .u8 = v } +#define DW_ExprEnc_U16(v) { .type = DW_ExprEncType_U16, .u16 = v } +#define DW_ExprEnc_U32(v) { .type = DW_ExprEncType_U32, .u32 = v } +#define DW_ExprEnc_U64(v) { .type = DW_ExprEncType_U64, .u64 = v } +#define DW_ExprEnc_S8(v) { .type = DW_ExprEncType_S8, .s8 = v } +#define DW_ExprEnc_S16(v) { .type = DW_ExprEncType_S16, .s16 = v } +#define DW_ExprEnc_S32(v) { .type = DW_ExprEncType_S32, .s32 = v } +#define DW_ExprEnc_S64(v) { .type = DW_ExprEncType_S64, .s64 = v } +#define DW_ExprEnc_ULEB128(v) { .type = DW_ExprEncType_ULEB128, .u64 = v } +#define DW_ExprEnc_SLEB128(v) { .type = DW_ExprEncType_SLEB128, .s64 = v } +#define DW_ExprEnc_Addr(v) { .type = DW_ExprEncType_Addr, .addr = v } +#define DW_ExprEnc_Block(v) { .type = DW_ExprEncType_Block, .block = v } +#define DW_ExprEnc_UInt(v) { .type = DW_ExprEncType_DwarfUInt, .u64 = v } +#define DW_ExprEnc_Label(v) { .type = DW_ExprEncType_Label, .label = str8_lit_comp(v) } +#define DW_ExprEnc_DeclLabel(v) { .type = DW_ExprEncType_DeclLabel, .label = str8_lit_comp(v) } + +//////////////////////////////// + +// pieces +internal DW_PieceNode * dw_piece_list_push(Arena *arena, DW_PieceList *list, DW_Piece v); + +// size -> type +internal DW_ExprValueType dw_expr_unsigned_value_type_from_bit_size(U64 bit_size); +internal DW_ExprValueType dw_expr_signed_value_type_from_bit_size(U64 bit_size); +internal DW_ExprValueType dw_expr_float_type_from_bit_size(U64 bit_size); + +// type -> size +internal U64 dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k); + +// typer +internal DW_ExprValueType dw_expr_pick_common_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs); +internal DW_ExprValueType dw_expr_pick_common_compar_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs); +internal DW_ExprValue dw_expr_cast(DW_ExprValue value, DW_ExprValueType type); + +// arithmetic operators +internal DW_ExprValue dw_expr_add (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_minus(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_mul (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_div (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_mod (DW_ExprValue rhs, DW_ExprValue lhs); + +// comparison operators +internal DW_ExprValue dw_expr_eq(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_ge(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_gt(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_le(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_lt(DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_ne(DW_ExprValue rhs, DW_ExprValue lhs); + +// bitwise operators +internal DW_ExprValue dw_expr_xor (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_and (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_or (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_shl (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_shr (DW_ExprValue rhs, DW_ExprValue lhs); +internal DW_ExprValue dw_expr_shra(DW_ExprValue rhs, DW_ExprValue lhs); + +// unary operators +internal DW_ExprValue dw_expr_abs(DW_ExprValue value); +internal DW_ExprValue dw_expr_neg(DW_ExprValue value); +internal DW_ExprValue dw_expr_not(DW_ExprValue value); + +// stack +internal DW_ExprValueNode * dw_expr_stack_push(Arena *arena, DW_ExprStack *stack, DW_ExprValue value); +internal DW_ExprValueNode * dw_expr_stack_push_unsigned(Arena *arena, DW_ExprStack *stack, void *value, U64 value_size); +internal DW_ExprValue dw_expr_stack_pop(DW_ExprStack *stack); +internal DW_ExprValue dw_expr_stack_peek(DW_ExprStack *stack); +internal DW_ExprValueNode * dw_expr_stack_pick(DW_ExprStack *stack, U64 idx); + +// value helpers +internal String8 dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v); + +// evaluator +internal DW_ExprEvalResult dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls_base, U64 op_limit, DW_Expr expr, void *reg_block, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out); + +#endif //DWARF_EXPR_H + diff --git a/obsolete/dwarf/dwarf_parse_old.c b/obsolete/dwarf/dwarf_parse_old.c new file mode 100644 index 00000000..a8898477 --- /dev/null +++ b/obsolete/dwarf/dwarf_parse_old.c @@ -0,0 +1,3331 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal U64 +dw_hash_from_string(String8 string) +{ + XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); + return hash64; +} + +internal U64 +str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) +{ + U64 bytes_read = 0; + U32 first_four_bytes; + if (str8_deserial_read_struct(string, off, &first_four_bytes) == sizeof(first_four_bytes)) { + if (first_four_bytes == max_U32) { + if (str8_deserial_read_struct(string, off+sizeof(U32), size_out) == sizeof(U64)) { + bytes_read = sizeof(U32) + sizeof(U64); + } + } else { + *size_out = first_four_bytes; + bytes_read = sizeof(U32); + } + } + return bytes_read; +} + +internal U64 +str8_deserial_read_dwarf_uint(String8 string, U64 off, DW_Format format, U64 *uint_out) +{ + U64 bytes_read = 0; + switch (format) { + case DW_Format_Null: break; + case DW_Format_32Bit: { + *uint_out &= (U64)max_U32; + bytes_read = str8_deserial_read(string, off, uint_out, sizeof(U32), sizeof(U32)); + } break; + case DW_Format_64Bit: { + bytes_read = str8_deserial_read_struct(string, off, uint_out); + } break; + } + return bytes_read; +} + +internal U64 +str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) +{ + U64 value = 0; + U64 shift = 0; + U64 cursor = off; + for(;;) + { + U8 byte = 0; + U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); + if(bytes_read != sizeof(byte)) + { + break; + } + U8 val = byte & 0x7fu; + value |= ((U64)val) << shift; + cursor += bytes_read; + shift += 7u; + if((byte & 0x80u) == 0) + { + break; + } + } + if(value_out != 0) + { + *value_out = value; + } + U64 bytes_read = cursor - off; + return bytes_read; +} + +internal U64 +str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) +{ + U64 value = 0; + U64 shift = 0; + U64 cursor = off; + for(;;) + { + U8 byte; + U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); + if(bytes_read != sizeof(byte)) + { + break; + } + U8 val = byte & 0x7fu; + value |= ((U64)val) << shift; + cursor += bytes_read; + shift += 7u; + if((byte & 0x80u) == 0) + { + if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) + { + value |= -(S64)(1ull << shift); + } + break; + } + } + if(value_out != 0) + { + *value_out = value; + } + U64 bytes_read = cursor - off; + return bytes_read; +} + +internal U64 +str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out) +{ + Temp temp = temp_begin(arena); + + U64 *arr = push_array(arena, U64, count); + U64 i, cursor; + for (i = 0, cursor = off; i < count; ++i) { + U64 read_size = str8_deserial_read_uleb128(string, cursor, &arr[i]); + if (read_size == 0) { + break; + } + cursor += read_size; + } + + U64 bytes_read = 0; + if (i == count) { + *arr_out = arr; + bytes_read = cursor - off; + } else { + temp_end(temp); + *arr_out = 0; + } + + return bytes_read; +} + +internal U64 +str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out) +{ + Temp temp = temp_begin(arena); + + S64 *arr = push_array(arena, S64, count); + U64 i, cursor; + for (i = 0, cursor = off; i < count; ++i) { + U64 read_size = str8_deserial_read_sleb128(string, cursor, &arr[i]); + if (read_size == 0) { + break; + } + cursor += read_size; + } + + U64 bytes_read = 0; + if (i == count) { + *arr_out = arr; + bytes_read = cursor - off; + } else { + temp_end(temp); + *arr_out = 0; + } + + return bytes_read; +} + +internal DW_SectionKind +dw_section_kind_from_string(String8 string) +{ + DW_SectionKind s = DW_Section_Null; +#define X(_K,_L,_M,_W) \ +if (str8_match_lit(_L, string, 0)) { s = DW_Section_##_K; } \ +if (str8_match_lit(_M, string, 0)) { s = DW_Section_##_K; } + DW_SectionKind_XList +#undef X + return s; +} + +internal DW_SectionKind +dw_section_dwo_kind_from_string(String8 string) +{ + DW_SectionKind s = DW_Section_Null; +#define X(_K,_L,_M,_W) if (str8_match_lit(_W, string, 0)) { s = DW_Section_##_K; } + DW_SectionKind_XList +#undef X + return s; +} + +internal Rng1U64List +dw_unit_ranges_from_data(Arena *arena, String8 data) +{ + Rng1U64List result = {0}; + + for (U64 cursor = 0; cursor < data.size; ) { + U64 start = cursor; + + // read unit size + U64 size; + U64 size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &size); + if (size_size == 0) { break; } + cursor += size_size; + + // is unit size valid? + if (cursor + size > data.size) { break; } + cursor += size; + + // push unit range + if (size > 0) { + rng1u64_list_push(arena, &result, rng_1u64(start, cursor)); + } + } + + return result; +} + +internal Rng1U64Array +dw_unit_ranges_from_data_arr(Arena *arena, String8 data) +{ + Temp scratch = scratch_begin(&arena, 1); + Rng1U64List list = dw_unit_ranges_from_data(scratch.arena, data); + Rng1U64Array arr = rng1u64_array_from_list(arena, &list); + scratch_end(scratch); + return arr; +} + +internal U64 +dw_read_list_unit_header_addr(String8 unit_data, DW_ListUnit *lu_out) +{ + U64 header_size = 0; + + U64 unit_length = 0; + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); + + if (unit_length_size) { + DW_Version version = DW_Version_Null; + U64 version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version); + + if (version_size) { + if (version >= DW_Version_5) { + U8 address_size = 0; + U64 address_size_size = str8_deserial_read_struct(unit_data, + unit_length_size + version_size, + &address_size); + + if (address_size_size && address_size) { + U8 segment_selector_size = 0; + U64 segment_selector_size_size = str8_deserial_read_struct(unit_data, + unit_length_size + version_size + address_size_size, + &segment_selector_size); + if (segment_selector_size_size) { + header_size = unit_length_size + version_size + address_size_size + segment_selector_size_size; + + lu_out->version = version; + lu_out->segment_selector_size = segment_selector_size; + lu_out->address_size = address_size; + lu_out->entry_size = segment_selector_size + address_size; + lu_out->entries = str8_skip(unit_data, header_size); + } + } + } + } + } + + return header_size; +} + +internal U64 +dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out) +{ + U64 header_size = 0; + + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(unit_data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + + U64 unit_length = 0; + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); + + if (unit_length_size) { + DW_Version version = DW_Version_Null; + U64 version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version); + + if (version >= DW_Version_5) { + U16 padding = 0; + U64 padding_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size, &padding); + + if (padding_size && padding == 0) { + header_size = unit_length_size + version_size + padding_size; + + lu_out->version = version; + lu_out->address_size = 0; + lu_out->segment_selector_size = 0; + lu_out->entry_size = dw_size_from_format(format); + lu_out->entries = str8_skip(unit_data, header_size); + } + } + } + + exit:; + return header_size; +} + +internal U64 +dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) +{ + U64 header_size = 0; + + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(unit_data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + + U64 unit_length = 0; + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); + + if (unit_length_size) { + DW_Version version = DW_Version_Null; + U64 version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version); + + if (version >= DW_Version_5) { + U8 address_size = 0; + U64 address_size_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size, &address_size); + + if (address_size_size && address_size > 0) { + U8 segment_selector_size = 0; + U64 segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size + address_size_size, &segment_selector_size); + + if (segment_selector_size_size) { + U32 offset_entry_count = 0; + U64 offset_entry_count_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size + address_size_size + segment_selector_size, &offset_entry_count); + + if (offset_entry_count_size) { + header_size = unit_length_size + version_size + address_size_size + segment_selector_size_size + offset_entry_count_size; + + lu_out->version = version; + lu_out->address_size = address_size; + lu_out->segment_selector_size = segment_selector_size; + lu_out->entry_size = dw_size_from_format(format); + lu_out->entries = str8_skip(unit_data, header_size); + } + } + } + } + } + + exit:; + return header_size; +} + +internal DW_ListUnitInput +dw_list_unit_input_from_input(Arena *arena, DW_Raw *input) +{ + Temp scratch = scratch_begin(&arena, 1); + + DW_ListUnitInput result = {0}; + + DW_Section debug_addr = input->sec[DW_Section_Addr]; + { + String8 data = debug_addr.data; + Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data); + + result.addr_ranges = rng1u64_array_from_list(arena, &unit_ranges); + result.addr_count = unit_ranges.count; + result.addrs = push_array(arena, DW_ListUnit, unit_ranges.count); + + for (U64 unit_idx = 0; unit_idx < result.addr_ranges.count; ++unit_idx) { + String8 unit_data = str8_substr(debug_addr.data, result.addr_ranges.v[unit_idx]); + dw_read_list_unit_header_addr(unit_data, &result.addrs[unit_idx]); + } + } + + DW_Section debug_str_offsets = input->sec[DW_Section_StrOffsets]; + { + String8 data = debug_str_offsets.data; + Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data); + + result.str_offset_ranges = rng1u64_array_from_list(arena, &unit_ranges); + result.str_offset_count = unit_ranges.count; + result.str_offsets = push_array(arena, DW_ListUnit, unit_ranges.count); + + for (U64 unit_idx = 0; unit_idx < result.str_offset_ranges.count; ++unit_idx) { + String8 unit_data = str8_substr(data, result.str_offset_ranges.v[unit_idx]); + dw_read_list_unit_header_str_offsets(unit_data, &result.str_offsets[unit_idx]); + } + } + + DW_Section debug_rnglists = input->sec[DW_Section_RngLists]; + { + String8 data = debug_rnglists.data; + Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data); + + result.rnglist_ranges = rng1u64_array_from_list(arena, &unit_ranges); + result.rnglist_count = unit_ranges.count; + result.rnglists = push_array(arena, DW_ListUnit, unit_ranges.count); + + for (U64 unit_idx = 0; unit_idx < result.rnglist_ranges.count; ++unit_idx) { + String8 unit_data = str8_substr(data, result.rnglist_ranges.v[unit_idx]); + dw_read_list_unit_header_list(unit_data, &result.rnglists[unit_idx]); + } + } + + DW_Section debug_loclists = input->sec[DW_Section_LocLists]; + { + String8 data = debug_loclists.data; + Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data); + + result.loclist_ranges = rng1u64_array_from_list(arena, &unit_ranges); + result.loclist_count = unit_ranges.count; + result.loclists = push_array(arena, DW_ListUnit, unit_ranges.count); + + for (U64 unit_idx = 0; unit_idx < result.loclist_ranges.count; ++unit_idx) { + String8 unit_data = str8_substr(data, result.loclist_ranges.v[unit_idx]); + dw_read_list_unit_header_list(unit_data, &result.loclists[unit_idx]); + } + } + + scratch_end(scratch); + return result; +} + +internal U64 +dw_offset_from_list_unit(DW_ListUnit *lu, U64 index) +{ + U64 offset; + U64 entry_off = index * lu->entry_size; + if (entry_off + lu->entry_size <= lu->entries.size) { + offset = 0; + MemoryCopy(&offset, lu->entries.str + entry_off, lu->entry_size); + } else { + offset = max_U64; + } + return offset; +} + +internal U64 +dw_addr_from_list_unit(DW_ListUnit *lu, U64 index) +{ + U64 seg = 0; + U64 addr = max_U64; + U64 entry_count = lu->entries.size / lu->entry_size; + if (index < entry_count) { + U64 seg_off = lu->entry_size * index; + U64 addr_off = seg_off + lu->segment_selector_size; + MemoryCopy(&seg, lu->entries.str + seg_off, lu->segment_selector_size); + MemoryCopy(&addr, lu->entries.str + addr_off, lu->address_size); + // TODO: segment-based addressing + AssertAlways(seg == 0); + } else { + Assert(!"out of bounds index"); + } + return addr; +} + +internal U64 +dw_read_abbrev_tag(String8 data, U64 offset, DW_Abbrev *out_abbrev) +{ + U64 total_bytes_read = 0; + U64 cursor = offset; + + // read tag ID and kind + U64 id = 0; + TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); + + // is this null terminator? + if (id == 0) { + total_bytes_read = cursor - offset; + MemoryZeroStruct(out_abbrev); + goto exit; + } + + U64 kind = 0; + TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); + + // read child flag + U8 has_children = 0; + if (id != 0) { + TryRead(str8_deserial_read_struct(data, cursor, &has_children), cursor, exit); + } + + if (out_abbrev != 0) { + DW_Abbrev abbrev = { .kind = DW_Abbrev_Tag, .sub_kind = kind, .id = id}; + if (has_children) { + abbrev.flags |= DW_AbbrevFlag_HasChildren; + } + *out_abbrev = abbrev; + } + + total_bytes_read = cursor - offset; + exit:; + return total_bytes_read; +} + +internal U64 +dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev) +{ + U64 total_bytes_read = 0; + U64 cursor = offset; + + // read id and kind + U64 id, kind; + TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); + + // read implicit const + S64 implicit_const = 0; + if (kind == DW_Form_ImplicitConst) { + TryRead(str8_deserial_read_sleb128(data, cursor, &implicit_const), cursor, exit); + } + + if (out_abbrev != 0) { + DW_Abbrev abbrev = { .kind = DW_Abbrev_Attrib, .sub_kind = kind, .id = id }; + if (kind == DW_Form_ImplicitConst) { + abbrev.flags |= DW_AbbrevFlag_HasImplicitConst; + abbrev.implicit_const = implicit_const; + } + *out_abbrev = abbrev; + } + + total_bytes_read = cursor - offset; + exit:; + return total_bytes_read; +} + +internal DW_AbbrevTable +dw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_base) +{ + Temp temp = temp_begin(arena); + DW_AbbrevTable table = {0}; + B32 failed_to_make = 1; + + // count abbrev tags + for (U64 cursor = abbrev_base; cursor < abbrev_data.size; table.count += 1) { + DW_Abbrev tag; + TryRead(dw_read_abbrev_tag(abbrev_data, cursor, &tag), cursor, exit); + if (tag.id == 0) { break; } + + for (; cursor < abbrev_data.size; ) { + DW_Abbrev attrib; + TryRead(dw_read_abbrev_attrib(abbrev_data, cursor, &attrib), cursor, exit); + if(attrib.id == 0) { break; } + } + } + + // alloc entries + table.entries = push_array(arena, DW_AbbrevTableEntry, table.count); + table.count = 0; + + // fill out the table + for (U64 cursor = abbrev_base; cursor < abbrev_data.size;) { + U64 tag_abbrev_off = cursor; + + DW_Abbrev tag = {0}; + TryRead(dw_read_abbrev_tag(abbrev_data, cursor, &tag), cursor, exit); + if (tag.id == 0) { break; } + + // push new entry + table.entries[table.count].id = tag.id; + table.entries[table.count].off = tag_abbrev_off; + table.count += 1; + + for (; cursor < abbrev_data.size ;) { + DW_Abbrev attrib = {0}; + TryRead(dw_read_abbrev_attrib(abbrev_data, cursor, &attrib), cursor, exit); + if (attrib.id == 0) { break; } + } + } + + failed_to_make = 0; + exit:; + if (failed_to_make) { + MemoryZeroStruct(&table); + temp_end(temp); + } + return table; +} + +internal U64 +dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U64 abbrev_id) +{ + U64 abbrev_offset = max_U64; + if (table.count > 0) { + for (S64 l = 0, r = (S64)table.count - 1; l <= r; ) { + S64 m = l + (r - l) / 2; + if (abbrev_id > table.entries[m].id) { + l = m + 1; + } else if (abbrev_id < table.entries[m].id) { + r = m - 1; + } else { + abbrev_offset = table.entries[m].off; + break; + } + } + } + return abbrev_offset; +} + +internal B32 +dw_read_form(String8 data, + DW_Version version, + DW_Format unit_format, + U64 address_size, + DW_FormKind form_kind, + S64 implicit_const, + DW_Form *form_out, + U64 *bytes_read_out) +{ + B32 is_ok = 0; + U64 cursor = 0; + DW_Form form = {0}; + switch (form_kind) { + case DW_Form_Null: break; + case DW_Form_Addr: { + TryRead(str8_deserial_read_block(data, cursor, address_size, &form.addr), cursor, exit); + } break; + case DW_Form_Block2: { + U16 size = 0; + TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); + } break; + case DW_Form_Block4: { + U32 size = 0; + TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor + cursor, size, &form.block), cursor, exit); + } break; + case DW_Form_Data2: { + TryRead(str8_deserial_read_block(data, cursor, sizeof(U16), &form.data), cursor, exit); + } break; + case DW_Form_Data4: { + TryRead(str8_deserial_read_block(data, cursor, sizeof(U32), &form.data), cursor, exit); + } break; + case DW_Form_Data8: { + TryRead(str8_deserial_read_block(data, cursor, sizeof(U64), &form.data), cursor, exit); + } break; + case DW_Form_String: { + TryRead(str8_deserial_read_cstr(data, cursor, &form.string), cursor, exit); + } break; + case DW_Form_Block: { + U64 size = 0; + TryRead(str8_deserial_read_uleb128(data, cursor, &size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); + } break; + case DW_Form_Block1: { + U8 size = 0; + TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); + } break; + case DW_Form_Data1: { + TryRead(str8_deserial_read_block(data, cursor, sizeof(U8), &form.data), cursor, exit); + } break; + case DW_Form_Flag: { + TryRead(str8_deserial_read_struct(data, cursor, &form.flag), cursor, exit); + } break; + case DW_Form_SData: { + TryRead(str8_deserial_read_sleb128(data, cursor, &form.sdata), cursor, exit); + } break; + case DW_Form_UData: { + TryRead(str8_deserial_read_uleb128(data, cursor, &form.udata), cursor, exit); + } break; + case DW_Form_RefAddr: { + if (version < DW_Version_3) { + TryRead(str8_deserial_read(data, cursor, &form.ref, address_size, address_size), cursor, exit); + } else { + TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.ref), cursor, exit); + } + } break; + case DW_Form_GNU_RefAlt: { + TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.ref), cursor, exit); + } break; + case DW_Form_Ref1: { + TryRead(str8_deserial_read(data, cursor, &form.ref, 1, 1), cursor, exit); + } break; + case DW_Form_Ref2: { + TryRead(str8_deserial_read(data, cursor, &form.ref, 2, 2), cursor, exit); + } break; + case DW_Form_Ref4: { + TryRead(str8_deserial_read(data, cursor, &form.ref, 4, 4), cursor, exit); + } break; + case DW_Form_Ref8: { + TryRead(str8_deserial_read(data, cursor, &form.ref, 8, 8), cursor, exit); + } break; + case DW_Form_RefUData: { + TryRead(str8_deserial_read_uleb128(data, cursor, &form.ref), cursor, exit); + } break; + case DW_Form_SecOffset: + case DW_Form_LineStrp: + case DW_Form_GNU_StrpAlt: + case DW_Form_Strp: { + TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.sec_offset), cursor, exit); + } break; + case DW_Form_ExprLoc: { + U64 expr_size = 0; + TryRead(str8_deserial_read_uleb128(data, cursor, &expr_size), cursor, exit); + TryRead(str8_deserial_read_block(data, cursor, expr_size, &form.exprloc), cursor, exit); + } break; + case DW_Form_FlagPresent: { + form.flag = 1; + } break; + case DW_Form_RefSig8: { + //U64 ref = 0; + //cursor = str8_deserial_read_struct(data, cursor, &ref); + NotImplemented; + } break; + case DW_Form_Addrx: + case DW_Form_RngListx: + case DW_Form_Strx: { + TryRead(str8_deserial_read_uleb128(data, cursor, &form.xval), cursor, exit); + } break; + case DW_Form_RefSup4: { + //U32 ref_sup4 = 0; + //cursor = str8_deserial_read_struct(data, cursor, &ref_sup4); + NotImplemented; + } break; + case DW_Form_StrpSup: { + TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.strp_sup), cursor, exit); + } break; + case DW_Form_Data16: { + cursor = str8_deserial_read_block(data, cursor, 16, &form.data); + } break; + case DW_Form_ImplicitConst: { + // Special case. + // Unlike other forms that have their values stored in the .debug_info section, + // This one defines it's value in the .debug_abbrev section. + form.implicit_const = implicit_const; + } break; + case DW_Form_LocListx: { + TryRead(str8_deserial_read_uleb128(data, cursor, &form.xval), cursor, exit); + } break; + case DW_Form_RefSup8: { + NotImplemented; + } break; + case DW_Form_Strx1: { + TryRead(str8_deserial_read(data, cursor, &form.xval, 1, 1), cursor, exit); + } break; + case DW_Form_Strx2: { + TryRead(str8_deserial_read(data, cursor, &form.xval, 2, 2), cursor, exit); + } break; + case DW_Form_Strx3: { + TryRead(str8_deserial_read(data, cursor, &form.xval, 3, 3), cursor, exit); + } break; + case DW_Form_Strx4: { + TryRead(str8_deserial_read(data, cursor, &form.xval, 4, 4), cursor, exit); + } break; + case DW_Form_Addrx1: { + TryRead(str8_deserial_read(data, cursor, &form.xval, 1, 1), cursor, exit); + } break; + case DW_Form_Addrx2: { + TryRead(str8_deserial_read(data, cursor, &form.xval, 2, 2), cursor, exit); + } break; + case DW_Form_Addrx3: { + TryRead(str8_deserial_read(data, cursor, &form.xval, 3, 3), cursor, exit); + } break; + case DW_Form_Addrx4: { + TryRead(str8_deserial_read(data, cursor, &form.xval, 4, 4), cursor, exit); + } break; + default: InvalidPath; break; + } + + if (form_out) { + form.kind = form_kind; + *form_out = form; + } + if (bytes_read_out) { + *bytes_read_out = cursor; + } + + is_ok = 1; + exit:; + Assert(is_ok); + return is_ok; +} + +internal U64 +dw_read_tag(Arena *arena, + DW_Raw *input, + DW_AbbrevTable abbrev_table, + DW_Version version, + DW_Format format, + U64 address_size, + Rng1U64 cu_info_range, + U64 tag_info_off, + DW_Tag *tag_out) +{ + U64 bytes_read = 0; + + String8 info_data = input->sec[DW_Section_Info].data; + String8 abbrev_data = input->sec[DW_Section_Abbrev].data; + + String8 tag_data = str8_substr(info_data, cu_info_range); + U64 tag_cursor = tag_info_off - cu_info_range.min; + + // read tag abbrev id + U64 tag_abbrev_id = 0; + TryRead(str8_deserial_read_uleb128(tag_data, tag_cursor, &tag_abbrev_id), tag_cursor, exit); + + B32 has_children = 0; + DW_TagKind tag_kind = DW_TagKind_Null; + DW_AttribList attribs = {0}; + if (tag_abbrev_id > 0) { + // map abbrev id -> .debug_abbrev offset + U64 abbrev_cursor = dw_abbrev_offset_from_abbrev_id(abbrev_table, tag_abbrev_id); + if (abbrev_cursor >= abbrev_data.size) { log_user_errorf("failed to find abbrev id 0x%I64x for tag 0x%I64x", tag_abbrev_id, tag_info_off); goto exit; } + + // read tag abbrev + DW_Abbrev tag_abbrev = {0}; + TryRead(dw_read_abbrev_tag(abbrev_data, abbrev_cursor, &tag_abbrev), abbrev_cursor, exit); + + has_children = !!(tag_abbrev.flags & DW_AbbrevFlag_HasChildren); + tag_kind = (DW_TagKind)tag_abbrev.sub_kind; + + // read attribs + for (; tag_cursor < tag_data.size && abbrev_cursor < abbrev_data.size; ) { + U64 attrib_tag_cursor = tag_cursor; + U64 attrib_abbrev_off = abbrev_cursor; + + // read attrib abbrev + DW_Abbrev attrib_abbrev = {0}; + TryRead(dw_read_abbrev_attrib(abbrev_data, abbrev_cursor, &attrib_abbrev), abbrev_cursor, exit); + + DW_AttribKind attrib_kind = (DW_AttribKind)attrib_abbrev.id; + DW_FormKind form_kind = (DW_FormKind)attrib_abbrev.sub_kind; + + // is this closing attrib? + if (attrib_kind == DW_AttribKind_Null) { break; } + + // special case, allows producer to embed form in .debug_info + if (form_kind == DW_Form_Indirect) { + TryRead(str8_deserial_read_uleb128(tag_data, tag_cursor, &form_kind), tag_cursor, exit); + } + + // read form value + DW_Form form = {0}; + U64 form_size = 0; + if (!dw_read_form(str8_skip(tag_data, tag_cursor), version, format, address_size, form_kind, attrib_abbrev.implicit_const, &form, &form_size)) { + goto exit; + } + tag_cursor += form_size; + + // fill out node + DW_AttribNode *attrib_n = push_array(arena, DW_AttribNode, 1); + attrib_n->v.info_off = cu_info_range.min + attrib_tag_cursor; + attrib_n->v.abbrev_off = attrib_abbrev_off; + attrib_n->v.abbrev_id = attrib_abbrev.id; + attrib_n->v.attrib_kind = attrib_kind; + attrib_n->v.form = form; + + // push node to list + SLLQueuePush(attribs.first, attribs.last, attrib_n); + attribs.count += 1; + } + } + + // fill out tag + tag_out->abbrev_id = tag_abbrev_id; + tag_out->has_children = has_children; + tag_out->kind = tag_kind; + tag_out->attribs = attribs; + tag_out->info_off = tag_info_off; + + bytes_read = tag_cursor - (tag_info_off - cu_info_range.min); + exit:; + return bytes_read; +} + +internal U64 +dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) +{ + return dw_read_tag(arena, + input, + cu->abbrev_table, + cu->version, + cu->format, + cu->address_size, + cu->info_range, + info_off, + tag_out); +} + +internal B32 +dw_try_u64_from_const_value(U64 type_byte_size, DW_ATE type_encoding, String8 const_value, U64 *value_out) +{ + B32 is_parsed = 0; + if (const_value.size <= type_byte_size) { + U64 value_size = Min(type_byte_size, const_value.size); + if (value_size <= sizeof(*value_out)) { + MemoryZeroStruct(value_out); + MemoryCopy(value_out, const_value.str, value_size); + if (type_encoding == DW_ATE_Signed || type_encoding == DW_ATE_SignedChar) { + *value_out = extend_sign64(*value_out, value_size); + } + is_parsed = 1; + } else { + Assert(!"out value overflow"); + } + } + return is_parsed; +} + +internal U64 +dw_u64_from_const_value(String8 const_value) +{ + U64 result = 0; + B32 is_converted = dw_try_u64_from_const_value(sizeof(U64), DW_ATE_Unsigned, const_value, &result); + Assert(is_converted); // TODO: error handling + return result; +} + +internal U64 +dw_interp_sec_offset(DW_Form form) +{ + U64 sec_offset = 0; + if (form.kind == DW_Form_SecOffset) { + sec_offset = form.sec_offset; + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + return sec_offset; +} + +internal String8 +dw_interp_exprloc(DW_Form form) +{ + String8 expr = {0}; + if (form.kind == DW_Form_ExprLoc) { + expr = form.exprloc; + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + return expr; +} + +internal U128 +dw_interp_const_u128(DW_Form form) +{ + AssertAlways(form.data.size <= sizeof(U128)); + U128 result = {0}; + MemoryCopy(&result.u64[0], form.data.str, form.data.size); + return result; +} + +internal U64 +dw_interp_const64(U64 type_byte_size, DW_ATE type_encoding, DW_Form form) +{ + U64 result = max_U64; + if (form.kind == DW_Form_Data1 || form.kind == DW_Form_Data2 || form.kind == DW_Form_Data4 || form.kind == DW_Form_Data8 || form.kind == DW_Form_Data16) { + if (form.data.size <= sizeof(result)) { + if (!dw_try_u64_from_const_value(type_byte_size, type_encoding, form.data, &result)) { + Assert(!"unable to decode data"); + } + } else { + Assert(!"unable to cast U128 to U64"); + } + } else if (form.kind == DW_Form_UData) { + result = form.udata; + } else if (form.kind == DW_Form_SData) { + result = form.sdata; + } else if (form.kind == DW_Form_ImplicitConst) { + result = form.implicit_const; + } else if (form.kind == DW_Form_Null) { + // skip + } else { + AssertAlways(!"unexpected form"); + } + return result; +} + +internal U64 +dw_interp_const_u64(DW_Form form) +{ + return dw_interp_const64(sizeof(U64), DW_ATE_Unsigned, form); +} + +internal U32 +dw_interp_const_u32(DW_Form form) +{ + U64 const64 = dw_interp_const_u64(form); + U32 const32 = safe_cast_u32(const64); + return const32; +} + +internal S64 +dw_interp_const_s64(DW_Form form) +{ + U64 const_u64 = dw_interp_const_u64(form); + S64 const_s64 = (S64)const_u64; + return const_s64; +} + +internal S32 +dw_interp_const_s32(DW_Form form) +{ + U32 const_u32 = dw_interp_const_u32(form); + S32 const_s32 = (S32)const_u32; + return const_s32; +} + +internal U64 +dw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_Form form) +{ + U64 address = 0; + if (form.kind == DW_Form_Addr) { + if (!dw_try_u64_from_const_value(address_size, DW_ATE_Address, form.addr, &address)) { + AssertAlways(!"unable to decode address"); + } + } else if (form.kind == DW_Form_Addrx || form.kind == DW_Form_Addrx1 || form.kind == DW_Form_Addrx2 || + form.kind == DW_Form_Addrx3 || form.kind == DW_Form_Addrx4) { + address = dw_addr_from_list_unit(addr_lu, form.xval); + } else if (form.kind == DW_Form_SecOffset) { + if (addr_lu->segment_selector_size > 0) { + AssertAlways(!"TODO: support for segmented address space"); + } + if (form.sec_offset + addr_lu->segment_selector_size + addr_lu->address_size <= addr_lu->entries.size) { + MemoryCopy(&address, addr_lu->entries.str + form.sec_offset, addr_lu->address_size); + } else { + Assert(!"out of bounds .debug_addr offset"); + } + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + return address; +} + +internal String8 +dw_interp_block(DW_Raw *input, DW_CompUnit *cu, DW_Form form) +{ + NotImplemented; + return str8_zero(); +} + +internal String8 +dw_interp_string(DW_Raw *input, + DW_Format unit_format, + DW_ListUnit *str_offsets, + DW_Form form) +{ + String8 string = {0}; + if (form.kind == DW_Form_String) { + string = form.string; + } else if (form.kind == DW_Form_Strp) { + U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, form.sec_offset, &string); + Assert(bytes_read > 0); + } else if (form.kind == DW_Form_LineStrp) { + U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_LineStr].data, form.sec_offset, &string); + Assert(bytes_read > 0); + } else if (form.kind == DW_Form_StrpSup) { + U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, form.strp_sup, &string); + Assert(bytes_read > 0); + } else if (form.kind == DW_Form_Strx || form.kind == DW_Form_Strx1 || + form.kind == DW_Form_Strx2 || form.kind == DW_Form_Strx3 || + form.kind == DW_Form_Strx4) { + U64 sec_offset = dw_offset_from_list_unit(str_offsets, form.xval); + if (sec_offset < input->sec[DW_Section_Str].data.size) { + U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, sec_offset, &string); + Assert(bytes_read > 0); + } else { + AssertAlways(!"unable to translate index to offset"); + } + } else if (form.kind == DW_Form_GNU_StrpAlt) { + NotImplemented; + } else if (form.kind == DW_Form_GNU_StrIndex) { + NotImplemented; + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + return string; +} + +internal String8 +dw_interp_line_ptr(DW_Raw *input, DW_Form form) +{ + String8 result = {0}; + if (form.kind == DW_Form_SecOffset) { + result = str8_skip(input->sec[DW_Section_Line].data, form.sec_offset); + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + return result; +} + +internal DW_LineFile * +dw_interp_file(DW_LineVM *line_vm, DW_Form form) +{ + U64 file_idx = dw_interp_const_u64(form); + DW_LineFile *result = dw_line_vm_find_file(line_vm, file_idx); + return result; +} + +internal DW_Reference +dw_interp_ref(DW_Raw *input, DW_CompUnit *cu, DW_Form form) +{ + DW_Reference ref = {0}; + if (form.kind == DW_Form_Ref1 || form.kind == DW_Form_Ref2 || + form.kind == DW_Form_Ref4 || form.kind == DW_Form_Ref8 || + form.kind == DW_Form_RefUData) { + ref.cu = cu; + ref.info_off = cu->info_range.min + form.ref; + } else if (form.kind == DW_Form_RefAddr) { + NotImplemented; + } else if (form.kind == DW_Form_RefSig8) { + NotImplemented; + } else if (form.kind == DW_Form_RefSup4 || form.kind == DW_Form_RefSup8) { + NotImplemented; + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + return ref; +} + +internal DW_LocList +dw_interp_loclist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form) +{ + DW_LocList loclist = {0}; + + if (cu->version < DW_Version_5) { + if (form.kind == DW_Form_SecOffset) { + U64 sec_offset = max_U64; + if (form.kind == DW_Form_SecOffset) { + sec_offset = form.sec_offset; + } else if (form.kind == DW_Form_Data8 || form.kind == DW_Form_Data4 || + form.kind == DW_Form_Data2 || form.kind == DW_Form_Data1) { + if (!dw_try_u64_from_const_value(form.data.size, DW_ATE_Unsigned, form.data, &sec_offset)) { + Assert(!"unable to extract section offset"); + } + } else if (form.kind == DW_Form_Null) { + Assert(!"unexpected form"); + } + + String8 sec = str8_skip(input->sec[DW_Section_Loc].data, sec_offset); + U64 base_addr = cu->low_pc; + U64 base_sel = DW_SentinelFromSize(cu->address_size); + for (U64 cursor = 0; cursor < sec.size; ) { + U64 range_min = 0; + U64 range_min_off = cursor; + U64 range_min_size = str8_deserial_read(sec, range_min_off, &range_min, cu->address_size, cu->address_size); + if (range_min_size == 0) { + break; + } + U64 range_max = 0; + U64 range_max_off = cursor + cu->address_size; + U64 range_max_size = str8_deserial_read(sec, range_max_off, &range_max, cu->address_size, cu->address_size); + if (range_max_size == 0) { + break; + } + cursor += cu->address_size * 2; + + // series terminator + if (range_min == 0 && range_max == 0) { + break; + } + // set new base address + else if (range_min == base_sel) { + base_addr = range_max; + } + // location + else { + U16 expr_size = 0; + U64 expr_size_size = str8_deserial_read_struct(sec, cursor, &expr_size); + if (expr_size_size == 0) { + Assert(!"unable to read expression size"); + break; + } + cursor += expr_size_size; + + Assert(cursor + expr_size <= sec.size); + Rng1U64 expr_range = rng_1u64(cursor, ClampTop(cursor + expr_size, sec.size)); + + DW_LocNode *loc_n = push_array(arena, DW_LocNode, 1); + loc_n->v.range = rng_1u64(base_addr + range_min, base_addr + range_max); + loc_n->v.expr = str8_substr(sec, expr_range); + + SLLQueuePush(loclist.first, loclist.last, loc_n); + ++loclist.count; + + // advance past expression + cursor += expr_size; + } + } + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + } else { + DW_Version version = DW_Version_Null; + String8 raw_lle = {0}; + if (form.kind == DW_Form_SecOffset) { + // offset is from beginning of the section + U64 sec_offset = form.sec_offset; + raw_lle = str8_skip(input->sec[DW_Section_LocLists].data, sec_offset); + } else if (form.kind == DW_Form_LocListx) { + // offset is from beginning of the entries + U64 entries_off = dw_offset_from_list_unit(cu->loclists_lu, form.xval); + raw_lle = str8_skip(cu->loclists_lu->entries, entries_off); + version = cu->loclists_lu->version; + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + + for (U64 cursor = 0, keep_parsing = 1, base_addr = cu->low_pc; + cursor < raw_lle.size && keep_parsing; ) { + DW_LLE kind = DW_LLE_EndOfList; + cursor += str8_deserial_read_struct(raw_lle, cursor, &kind); + + Rng1U64 range = {0}; + switch (kind) { + default: + Assert(!"unknown kind"); + case DW_LLE_EndOfList: { + keep_parsing = 0; + } break; + case DW_LLE_BaseAddressx: { + if (!cu->addr_lu) { + keep_parsing = 0; + break; + } + + U64 addrx = 0; + U64 addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &addrx); + if (addrx_size == 0) { + keep_parsing = 0; + break; + } + + U64 base_addr_new = dw_addr_from_list_unit(cu->addr_lu, addrx); + if (base_addr_new == max_U64) { + InvalidPath; + break; + } + + base_addr = base_addr_new; + cursor += addrx_size; + } break; + case DW_LLE_StartxEndx: { + U64 start_addrx = 0; + U64 start_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &start_addrx); + if (start_addrx_size == 0) { + keep_parsing = 0; + break; + } + U64 end_addrx = 0; + U64 end_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor + start_addrx_size, &end_addrx); + if (end_addrx_size == 0) { + keep_parsing = 0; + break; + } + cursor += start_addrx_size; + cursor += end_addrx_size; + + U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx); + U64 end = dw_addr_from_list_unit(cu->addr_lu, end_addrx); + Assert(start != max_U64); + Assert(end != max_U64); + + range = rng_1u64(start, end); + } break; + case DW_LLE_StartxLength: { + U64 start_addrx = 0; + U64 start_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &start_addrx); + if (start_addrx_size == 0) { + keep_parsing = 0; + break; + } + + // parse pre-standard & standard length + U64 length_off = cursor + start_addrx_size; + U64 length = 0; + U64 length_size = str8_deserial_read_uleb128(raw_lle, length_off, &length); + if (length_size == 0) { + keep_parsing = 0; + break; + } + + cursor += start_addrx_size; + cursor += length_size; + + if (cu->addr_lu) { + U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx); + Assert(start < max_U64); + + range = rng_1u64(start, start + length); + } else { + Assert(!".debug_addr section is missing -- unable to interpret address index"); + } + } break; + case DW_LLE_OffsetPair: { + U64 start = 0; + U64 start_size = str8_deserial_read_uleb128(raw_lle, cursor, &start); + if (start_size == 0) { + keep_parsing = 0; + break; + } + U64 end = 0; + U64 end_size = str8_deserial_read_uleb128(raw_lle, cursor + start_size, &end); + if (end_size == 0) { + keep_parsing = 0; + break; + } + cursor += start_size; + cursor += end_size; + + range = rng_1u64(base_addr + start, base_addr + end); + } break; + case DW_LLE_DefaultLocation: { + // no range + int x = 0; + } break; + case DW_LLE_BaseAddress: { + U64 base_addr_size = str8_deserial_read(raw_lle, cursor, &base_addr, cu->address_size, cu->address_size); + if (base_addr_size == 0) { + keep_parsing = 0; + break; + } + cursor += base_addr_size; + } break; + case DW_LLE_StartEnd: { + U64 start = 0; + U64 start_size = str8_deserial_read(raw_lle, cursor, &start, cu->address_size, cu->address_size); + if (start_size == 0) { + keep_parsing = 0; + break; + } + + U64 end = 0; + U64 end_size = str8_deserial_read(raw_lle, cursor + start_size, &end, cu->address_size, cu->address_size); + if (end_size == 0) { + keep_parsing = 0; + break; + } + cursor += start_size; + cursor += end_size; + + range = rng_1u64(start, end); + } break; + case DW_LLE_StartLength: { + U64 start = 0; + U64 start_size = str8_deserial_read(raw_lle, cursor, &start, cu->address_size, cu->address_size); + if (start_size == 0) { + keep_parsing = 0; + break; + } + U64 length = 0; + U64 length_size = str8_deserial_read_uleb128(raw_lle, cursor + start_size, &length); + if (length_size == 0) { + keep_parsing = 0; + break; + } + cursor += start_size; + cursor += length_size; + + range = rng_1u64(start, start + length); + } break; + } + + B32 has_expr = keep_parsing && kind != DW_LLE_BaseAddressx && kind != DW_LLE_BaseAddress; + if (has_expr) { + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(raw_lle, cursor, &expr_size); + if (expr_size_size == 0) { + keep_parsing = 0; + break; + } + + String8 expr = {0}; + U64 expr_read_size = str8_deserial_read_block(raw_lle, cursor + expr_size_size, expr_size, &expr); + if (expr_read_size != expr_size) { + keep_parsing = 0; + break; + } + + cursor += expr_size_size; + cursor += expr_size; + + DW_LocNode *loc_n = push_array(arena, DW_LocNode, 1); + loc_n->v.range = range; + loc_n->v.expr = expr; + + SLLQueuePush(loclist.first, loclist.last, loc_n); + ++loclist.count; + } + } + } + + return loclist; +} + +internal B32 +dw_interp_flag(DW_Form form) +{ + B32 flag = 0; + if (form.kind == DW_Form_Flag || form.kind == DW_Form_FlagPresent) { + flag = form.flag; + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + return flag; +} + +internal Rng1U64List +dw_interp_rnglist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form) +{ + Rng1U64List rnglist = {0}; + + if (cu->version < DW_Version_5) { + // decode section offset + U64 sec_offset = max_U64; + if (form.kind == DW_Form_SecOffset) { + sec_offset = form.sec_offset; + } else if (form.kind == DW_Form_Data8 || form.kind == DW_Form_Data4 || + form.kind == DW_Form_Data2 || form.kind == DW_Form_Data1) { + if (!dw_try_u64_from_const_value(form.data.size, DW_ATE_Unsigned, form.data, &sec_offset)) { + Assert(!"unable to extract section offset"); + } + } else if (form.kind != DW_Form_Null) { + Assert(!"unexpected form"); + } + + String8 sec = str8_skip(input->sec[DW_Section_Ranges].data, sec_offset); + U64 base_addr = cu->low_pc; + U64 base_sel = DW_SentinelFromSize(cu->address_size); + for (U64 cursor = 0; cursor < sec.size; ) { + U64 range_min = 0; + U64 range_min_off = cursor; + U64 range_min_size = str8_deserial_read(sec, range_min_off, &range_min, cu->address_size, cu->address_size); + if (range_min_size == 0) { + break; + } + U64 range_max = 0; + U64 range_max_off = cursor + cu->address_size; + U64 range_max_size = str8_deserial_read(sec, range_max_off, &range_max, cu->address_size, cu->address_size); + if (range_max_size == 0) { + break; + } + cursor += cu->address_size * 2; + + // series terminator + if (range_min == 0 && range_max == 0) { + break; + } + // set new base address + else if (range_min == base_sel) { + base_addr = range_max; + } + // range + else { + Rng1U64 range = rng_1u64(base_addr + range_min, base_addr + range_max); + rng1u64_list_push(arena, &rnglist, range); + } + } + } else { + String8 raw_rle = {0}; + if (form.kind == DW_Form_SecOffset) { + // offset is from beginning of the section + U64 sec_offset = form.sec_offset; + raw_rle = str8_skip(input->sec[DW_Section_RngLists].data, sec_offset); + } else if (form.kind == DW_Form_RngListx) { + // offset is from beginning of the entries + U64 sec_offset = dw_offset_from_list_unit(cu->rnglists_lu, form.xval); + raw_rle = str8_skip(cu->rnglists_lu->entries, sec_offset); + } else if (form.kind != DW_Form_Null) { + AssertAlways(!"unexpected form"); + } + + U64 rle_invalid_value = DW_SentinelFromSize(cu->address_size); + U64 base_addr = cu->low_pc; + for (U64 cursor = 0, keep_parsing = 1; cursor < raw_rle.size && keep_parsing; ) { + DW_RLE kind = DW_RLE_EndOfList; + cursor += str8_deserial_read_struct(raw_rle, cursor, &kind); + + Rng1U64 range = rng_1u64(rle_invalid_value, rle_invalid_value); + switch (kind) { + default: + case DW_RLE_EndOfList: { + keep_parsing = 0; + } break; + case DW_RLE_BaseAddressx: { + U64 addrx = 0; + U64 addrx_size = str8_deserial_read_uleb128(raw_rle, cursor, &addrx); + if (addrx_size == 0) { + keep_parsing = 0; + break; + } + if (cu->addr_lu == 0) { + keep_parsing = 0; + break; + } + U64 base_addr_new = dw_addr_from_list_unit(cu->addr_lu, addrx); + if (base_addr_new < max_U64) { + base_addr = base_addr_new; + cursor += addrx_size; + } else { + keep_parsing = 0; + Assert(!"invalid addrx"); + } + } break; + case DW_RLE_StartxLength: { + U64 start_addrx = 0; + U64 start_addrx_size = str8_deserial_read_uleb128(raw_rle, cursor, &start_addrx); + if (start_addrx_size == 0) { + keep_parsing = 0; + break; + } + U64 length = 0; + U64 length_size = str8_deserial_read_uleb128(raw_rle, cursor + start_addrx_size, &length); + if (length_size == 0) { + keep_parsing = 0; + break; + } + cursor += start_addrx_size; + cursor += length_size; + + if (cu->addr_lu) { + U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx); + AssertAlways(start < max_U64); + range = rng_1u64(start, start + length); + } + } break; + case DW_RLE_OffsetPair: { + U64 offset_start, offset_end = 0; + U64 offset_start_size = str8_deserial_read_uleb128(raw_rle, cursor, &offset_start); + if (offset_start_size == 0) { + keep_parsing = 0; + break; + } + U64 offset_end_size = str8_deserial_read_uleb128(raw_rle, cursor + offset_start_size, &offset_end); + if (offset_end_size == 0) { + keep_parsing = 0; + break; + } + cursor += offset_start_size; + cursor += offset_end_size; + + range = rng_1u64(base_addr + offset_start, base_addr + offset_end); + } break; + case DW_RLE_BaseAddress: { + U64 base_addr_size = str8_deserial_read(raw_rle, cursor, &base_addr, cu->address_size, cu->address_size); + if (base_addr_size == 0) { + keep_parsing = 0; + break; + } + cursor += base_addr_size; + } break; + case DW_RLE_StartEnd: { + U64 start = 0, end = 0; + + U64 start_size = str8_deserial_read(raw_rle, cursor, &start, cu->address_size, cu->address_size); + if (start_size == 0) { + keep_parsing = 0; + break; + } + U64 end_size = str8_deserial_read(raw_rle, cursor + start_size, &end, cu->address_size, cu->address_size); + if (end_size == 0) { + keep_parsing = 0; + break; + } + cursor += start_size; + cursor += end_size; + + range = rng_1u64(start, end); + } break; + case DW_RLE_StartLength: { + U64 start = 0, length = 0; + + U64 start_size = str8_deserial_read(raw_rle, cursor, &start, cu->address_size, cu->address_size); + if (start_size == 0) { + keep_parsing = 0; + break; + } + U64 length_size = str8_deserial_read_uleb128(raw_rle, cursor + start_size, &length); + if (length_size == 0) { + keep_parsing = 0; + break; + } + cursor += start_size; + cursor += length_size; + + range = rng_1u64(start, start + length); + } break; + } + + if (range.min != rle_invalid_value) { + rng1u64_list_push(arena, &rnglist, range); + } + } + } + + return rnglist; +} + +internal String8 +dw_interp_secptr(DW_Raw *input, DW_SectionKind section, DW_Form form) +{ + String8 secptr = {0}; + if (form.kind == DW_Form_SecOffset) { + String8 sect = input->sec[section].data; + Rng1U64 range = rng_1u64(form.sec_offset, sect.size); + secptr = str8_substr(sect, range); + } else if (form.kind != DW_Form_Null) { + Assert(!"unexpected form"); + } + return secptr; +} + +internal String8 +dw_interp_addrptr(DW_Raw *input, DW_Form form) +{ + return dw_interp_secptr(input, DW_Section_Addr, form); +} + +internal String8 +dw_interp_str_offsets_ptr(DW_Raw *input, DW_Form form) +{ + return dw_interp_secptr(input, DW_Section_StrOffsets, form); +} + +internal String8 +dw_interp_rnglists_ptr(DW_Raw *input, DW_Form form) +{ + return dw_interp_secptr(input, DW_Section_RngLists, form); +} + +internal String8 +dw_interp_loclists_ptr(DW_Raw *input, DW_Form form) +{ + return dw_interp_secptr(input, DW_Section_LocLists, form); +} + +internal DW_AttribClass +dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib) +{ + return dw_pick_attrib_value_class(cu->version, cu->ext, cu->relaxed, attrib->attrib_kind, attrib->form.kind); +} + +internal String8 +dw_exprloc_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_ExprLoc || value_class == DW_AttribClass_Block); + return dw_interp_exprloc(attrib->form); +} + +internal U128 +dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); + return dw_interp_const_u128(attrib->form); +} + +internal U64 +dw_const_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); + return dw_interp_const_u64(attrib->form); +} + +internal U32 +dw_const_u32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); + return dw_interp_const_u32(attrib->form); +} + +internal S64 +dw_const_s64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); + return dw_interp_const_s64(attrib->form); +} + +internal S32 +dw_const_s32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); + return dw_interp_const_s32(attrib->form); +} + +internal B32 +dw_flag_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Flag); + return dw_interp_flag(attrib->form); +} + +internal U64 +dw_address_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || + value_class == DW_AttribClass_Address || + value_class == DW_AttribClass_AddrPtr); + DW_Form form = attrib->form; + if (value_class == DW_AttribClass_AddrPtr) { + if (attrib->form.kind == DW_Form_SecOffset) { + NotImplemented; + } else { + AssertAlways(!"unexpected form"); + } + + form.kind = DW_Form_Addr; + form.addr = dw_interp_addrptr(input, attrib->form); + } + return dw_interp_address(cu->address_size, cu->low_pc, cu->addr_lu, form); +} + +internal String8 +dw_block_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Block); + return dw_interp_block(input, cu, attrib->form); +} + +internal String8 +dw_string_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_String || value_class == DW_AttribClass_StrOffsetsPtr); + return dw_interp_string(input, cu->format, cu->str_offsets_lu, attrib->form); +} + +internal String8 +dw_line_ptr_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_LinePtr); + return dw_interp_line_ptr(input, attrib->form); +} + +internal DW_LineFile * +dw_file_from_attrib(DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); + return dw_interp_file(line_vm, attrib->form); +} + +internal DW_Reference +dw_ref_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Reference); + return dw_interp_ref(input, cu, attrib->form); +} + +internal DW_LocList +dw_loclist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + AssertAlways(value_class == DW_AttribClass_Null || + value_class == DW_AttribClass_LocList || + value_class == DW_AttribClass_LocListPtr); + return dw_interp_loclist(arena, input, cu, attrib->form); +} + +internal Rng1U64List +dw_rnglist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + Rng1U64List rnglist = {0}; + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + if (value_class == DW_AttribClass_RngListPtr || value_class == DW_AttribClass_RngList) { + rnglist = dw_interp_rnglist(arena, input, cu, attrib->form); + } else if (value_class != DW_AttribClass_Null) { + Assert(!"unexpected value class"); + } + return rnglist; +} + +internal DW_Attrib * +dw_attrib_from_tag_(DW_Tag tag, DW_AttribKind kind) +{ + local_persist read_only DW_Attrib null_attrib; + DW_Attrib *attrib = &null_attrib; + for (DW_AttribNode *attrib_n = tag.attribs.first; attrib_n != 0; attrib_n = attrib_n->next) { + if (attrib_n->v.attrib_kind == kind) { + attrib = &attrib_n->v; + break; + } + } + return attrib; +} + +internal DW_Attrib * +dw_attrib_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + DW_Attrib *attrib = dw_attrib_from_tag_(tag, kind); + + if (attrib->attrib_kind == DW_AttribKind_Null) { + if (cu && cu->tag_ht) { + DW_Attrib *ao_attrib = dw_attrib_from_tag_(tag, DW_AttribKind_AbstractOrigin); + if (ao_attrib->attrib_kind == DW_AttribKind_AbstractOrigin) { + DW_Reference ref = dw_interp_ref(input, cu, ao_attrib->form); + DW_TagNode *ref_tag = dw_tag_node_from_info_off(ref.cu, ref.info_off); + attrib = dw_attrib_from_tag_(ref_tag->tag, kind); + } + } + } + + return attrib; +} + +internal B32 +dw_tag_has_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); + B32 has_attrib = attrib->attrib_kind != DW_AttribKind_Null; + return has_attrib; +} + +internal String8 +dw_exprloc_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_exprloc_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal String8 +dw_block_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_block_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal U128 +dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_const_u128_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal U64 +dw_const_u64_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_const_u64_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal U32 +dw_const_u32_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_const_u32_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal U64 +dw_address_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_address_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal String8 +dw_string_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_string_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal String8 +dw_line_ptr_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_line_ptr_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal DW_Reference +dw_ref_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_ref_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal DW_LocList +dw_loclist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_loclist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal Rng1U64List +dw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_rnglist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal B32 +dw_flag_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + return dw_flag_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal DW_LineFile * +dw_file_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind) +{ + return dw_file_from_attrib(cu, line_vm, dw_attrib_from_tag(input, cu, tag, kind)); +} + +internal B32 +dw_try_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out) +{ + B32 has_byte_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ByteSize); + B32 has_bit_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_BitSize ); + + if (has_byte_size && has_bit_size) { + Assert(!"ill formated byte size"); + } + + if (has_byte_size) { + *byte_size_out = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + return 1; + } else if (has_bit_size) { + U64 bit_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_BitSize); + *byte_size_out = bit_size / 8; + return 1; + } + + return 0; +} + +internal U64 +dw_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) +{ + U64 byte_size = max_U64; + dw_try_byte_size_from_tag(input, cu, tag, &byte_size); + return byte_size; +} + +internal U32 +dw_byte_size_32_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) +{ + U32 byte_size32 = 0; + U64 byte_size64; + if (dw_try_byte_size_from_tag(input, cu, tag, &byte_size64)) { + byte_size32 = safe_cast_u32(byte_size64); + } + return byte_size32; +} + +internal U64 +dw_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + U64 result = 0; + DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); + DW_AttribClass attrib_class = dw_value_class_from_attrib(cu, attrib); + if (attrib_class == DW_AttribClass_Const || attrib_class == DW_AttribClass_Block) { + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Type)) { + Temp scratch = scratch_begin(0,0); + DW_Reference type_ref = dw_ref_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Type); + DW_Tag type_tag = {0}; + dw_read_tag_cu(scratch.arena, input, type_ref.cu, type_ref.info_off, &type_tag); + U64 type_byte_size = dw_byte_size_from_tag(input, cu, type_tag); + DW_ATE type_encoding = dw_const_u64_from_tag_attrib_kind(input, type_ref.cu, type_tag, DW_AttribKind_Encoding); + if (type_encoding == DW_ATE_Unsigned || type_encoding == DW_ATE_UnsignedChar) { + result = dw_interp_const64(type_byte_size, type_encoding, attrib->form); + } + scratch_end(scratch); + } else { + result = dw_interp_const_u64(attrib->form); + } + } else if (attrib_class == DW_AttribClass_Address) { + result = dw_address_from_attrib(input, cu, attrib); + } else if (attrib_class == DW_AttribClass_Reference) { + NotImplemented; + } else if (attrib_class != DW_AttribClass_Null) { + AssertAlways(!"unexpected attrib class"); + } + return result; +} + +internal B32 +dw_is_attrib_var_ref(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) +{ + B32 is_var_ref = 0; + if (dw_is_form_kind_ref(cu->version, cu->ext, attrib->form.kind)) { + Temp scratch = scratch_begin(0,0); + DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); + DW_Tag ref_tag = {0}; + if (dw_read_tag_cu(scratch.arena, input, ref.cu, ref.info_off, &ref_tag)) { + is_var_ref = ref_tag.kind == DW_TagKind_Variable; + } + scratch_end(scratch); + } + return is_var_ref; +} + +internal DW_CompUnit +dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 cu_header_offset, B32 relaxed) +{ + DW_CompUnit cu = {0}; + + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + + // read unit size in bytes + U64 length = 0; + U64 length_size = str8_deserial_read_dwarf_packed_size(input->sec[DW_Section_Info].data, cu_header_offset, &length); + if (length_size == 0) { goto exit; } + + // compute unit range + Rng1U64 info_range = rng_1u64(cu_header_offset, cu_header_offset + length_size + length); + String8 info = str8_substr(input->sec[DW_Section_Info].data, info_range); + U64 info_cursor = length_size; + + // read version + DW_Version version; + TryRead(str8_deserial_read_struct(info, info_cursor, &version), info_cursor, exit); + + U64 abbrev_base = max_U64; + U8 address_size = 0; + DW_CompUnitKind unit_kind = DW_CompUnitKind_Reserved; + U64 spec_dwo_id = max_U64; + B32 is_header_ok = 0; + switch (version) { + default: + case DW_Version_Null: { + } break; + case DW_Version_1: { + NotImplemented; + } break; + case DW_Version_2: { + U32 abbrev_base32; + TryRead(str8_deserial_read_struct(info, info_cursor, &abbrev_base32), info_cursor, exit); + TryRead(str8_deserial_read_struct(info, info_cursor, &address_size), info_cursor, exit); + abbrev_base = abbrev_base32; + is_header_ok = 1; + } break; + case DW_Version_3: + case DW_Version_4: { + TryRead(str8_deserial_read_dwarf_uint(info, info_cursor, format, &abbrev_base), info_cursor, exit); + TryRead(str8_deserial_read_struct (info, info_cursor, &address_size), info_cursor, exit); + is_header_ok = 1; + } break; + case DW_Version_5: { + TryRead(str8_deserial_read_struct (info, info_cursor, &unit_kind), info_cursor, exit); + TryRead(str8_deserial_read_struct (info, info_cursor, &address_size), info_cursor, exit); + TryRead(str8_deserial_read_dwarf_uint(info, info_cursor, format, &abbrev_base), info_cursor, exit); + if (unit_kind == DW_CompUnitKind_Skeleton || input->sec[DW_Section_Info].is_dwo) { + TryRead(str8_deserial_read_struct(info, info_cursor, &spec_dwo_id), info_cursor, exit); + } + is_header_ok = 1; + } break; + } + + U64 header_size = info_cursor; + + if (is_header_ok) { + Temp temp = temp_begin(arena); + + // TODO: cache abbrev tables with identical offsets + DW_AbbrevTable abbrev_table = dw_make_abbrev_table(arena, input->sec[DW_Section_Abbrev].data, abbrev_base); + + DW_Tag cu_tag = {0}; + dw_read_tag(arena, input, abbrev_table, version, format, address_size, info_range, cu_header_offset + header_size, &cu_tag); + + // TODO: handle these unit types + if (cu_tag.kind == DW_TagKind_SkeletonUnit) { log_user_errorf("TODO: Skeleton Unit"); } + if (cu_tag.kind == DW_TagKind_TypeUnit) { log_user_errorf("TODO Type Unit"); } + + if (cu_tag.kind != DW_TagKind_CompileUnit && cu_tag.kind != DW_TagKind_PartialUnit) { + // unexpected tag, release memory and exit + temp_end(temp); + goto exit; + } + + // fetch attribs for list sections + DW_Attrib *addr_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_AddrBase ); + DW_Attrib *str_offsets_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_StrOffsetsBase); + DW_Attrib *rnglists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_RngListsBase ); + DW_Attrib *loclists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LocListsBase ); + + // interp attribs as section offsets + U64 addr_sec_off = dw_interp_sec_offset(addr_base_attrib->form ); + U64 str_offsets_sec_off = dw_interp_sec_offset(str_offsets_base_attrib->form); + U64 rnglists_sec_off = dw_interp_sec_offset(rnglists_base_attrib->form ); + U64 loclists_sec_off = dw_interp_sec_offset(loclists_base_attrib->form ); + + // map section offset to unit index + U64 addr_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.addr_ranges, addr_sec_off ); + U64 str_offsets_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.str_offset_ranges, str_offsets_sec_off); + U64 rnglists_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.rnglist_ranges, rnglists_sec_off ); + U64 loclists_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.loclist_ranges, loclists_sec_off ); + + // map index to unit + DW_ListUnit *addr_lu = 0 < (addr_lu_num && addr_lu_num <= lu_input.addr_count) ? &lu_input.addrs[addr_lu_num-1] : 0; + DW_ListUnit *str_offsets_lu = 0 < (str_offsets_lu_num && str_offsets_lu_num <= lu_input.str_offset_count) ? &lu_input.str_offsets[str_offsets_lu_num-1] : 0; + DW_ListUnit *rnglists_lu = 0 < (rnglists_lu_num && rnglists_lu_num <= lu_input.rnglist_count) ? &lu_input.rnglists[rnglists_lu_num-1] : 0; + DW_ListUnit *loclists_lu = 0 < (loclists_lu_num && loclists_lu_num <= lu_input.loclist_count) ? &lu_input.loclists[loclists_lu_num-1] : 0; + + // find compile unit base address + DW_Attrib *low_pc_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LowPc); + U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form); + + // fill out compile unit + cu.relaxed = relaxed; + cu.ext = DW_Ext_All; + cu.kind = unit_kind; + cu.version = version; + cu.format = format; + cu.address_size = address_size; + cu.abbrev_off = abbrev_base; + cu.info_range = info_range; + cu.first_tag_info_off = cu_header_offset + header_size; + cu.abbrev_table = abbrev_table; + cu.addr_lu = addr_lu; + cu.str_offsets_lu = str_offsets_lu; + cu.rnglists_lu = rnglists_lu; + cu.loclists_lu = loclists_lu; + cu.low_pc = low_pc; + cu.tag = cu_tag; + } + + exit:; + return cu; +} + +internal void +dw_tag_tree_from_data(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *parent, U64 *cursor, U64 *tag_count) +{ + while (*cursor < cu->info_range.max) { + // read tag + DW_Tag tag = {0}; + TryRead(dw_read_tag(arena, input, cu->abbrev_table, cu->version, cu->format, cu->address_size, cu->info_range, *cursor, &tag), *cursor, exit); + + // reached of the CU? + if (tag.kind == DW_TagKind_Null) { break; } + + // normal tag + DW_TagNode *tag_n = push_array(arena, DW_TagNode, 1); + tag_n->tag = tag; + + SLLQueuePush_N(parent->first_child, parent->last_child, tag_n, sibling); + + // update tag count + *tag_count += 1; + + if (tag.has_children) { + dw_tag_tree_from_data(arena, input, cu, tag_n, cursor, tag_count); + } + } + exit:; +} + +internal DW_TagTree +dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu) +{ + DW_TagNode root = {0}; + U64 cursor = cu->first_tag_info_off; + U64 tag_count = 0; + dw_tag_tree_from_data(arena, input, cu, &root, &cursor, &tag_count); + Assert(cursor == cu->info_range.max); + return (DW_TagTree){ .root = root.first_child, .tag_count = tag_count }; +} + +internal HashTable * +dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree) +{ + Temp scratch = scratch_begin(&arena, 1); + + struct Frame { + struct Frame *next; + DW_TagNode *node; + }; + + struct Frame *free_frames = 0; + struct Frame *stack = push_array(scratch.arena, struct Frame, 1); + stack->node = tag_tree.root; + + HashTable *ht = hash_table_init(arena, (U64)((F64)tag_tree.tag_count * 1.3)); + + while (stack) { + while (stack->node) { + hash_table_push_u64_raw(arena, ht, stack->node->tag.info_off, stack->node); + + if (stack->node->first_child) { + struct Frame *frame = free_frames; + if (frame) { + SLLStackPop(free_frames); + MemoryZeroStruct(frame); + } else { + frame = push_array(scratch.arena, struct Frame, 1); + } + frame->node = stack->node->first_child; + SLLStackPush(stack, frame); + } else { + stack->node = stack->node->sibling; + } + } + + // recycle free frame + struct Frame *frame = stack; + SLLStackPop(stack); + SLLStackPush(free_frames, frame); + + if (stack) { + stack->node = stack->node->sibling; + } + } + + scratch_end(scratch); + return ht; +} + +internal DW_TagNode * +dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off) +{ + DW_TagNode *tag_node = hash_table_search_u64_raw(cu->tag_ht, info_off); + return tag_node; +} + +internal U64 +dw_read_line_vm_header(Arena *arena, + DW_Raw *input, + String8 cu_stmt_list, + String8 cu_dir, + String8 cu_name, + U8 cu_address_size, + DW_ListUnit *cu_str_offsets, + DW_LineVMHeader *header_out) +{ + Temp scratch = scratch_begin(&arena, 1); + + U64 cursor = 0; + + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(cu_stmt_list, 0, &first_four_bytes) != sizeof(U32)) { goto exit; } + + // read unit length + U64 length = 0; + U64 length_size = str8_deserial_read_dwarf_packed_size(cu_stmt_list, 0, &length); + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + + cursor = length_size; + String8 data = str8_substr(cu_stmt_list, r1u64(0, length + length_size)); + + // read unit version + DW_Version version = DW_Version_Null; + TryRead(str8_deserial_read_struct(data, cursor, &version), cursor, exit); + + // read DWARF5 address & segment selector + U8 address_size = cu_address_size; + U8 segsel_size = 0; + if (version == DW_Version_5) { + TryRead(str8_deserial_read_struct(data, cursor, &address_size), cursor, exit); + TryRead(str8_deserial_read_struct(data, cursor, &segsel_size), cursor, exit); + } + + U64 header_length = 0; + TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &header_length), cursor, exit); + U64 line_program_off = cursor + header_length; + + // substring header so we dont overread into the line program + data = str8_prefix(data, cursor + header_length); + + U8 min_inst_len = 0; + TryRead(str8_deserial_read_struct(data, cursor, &min_inst_len), cursor, exit); + + U8 max_ops_for_inst = 1; + if (version > DW_Version_3) { + TryRead(str8_deserial_read_struct(data, cursor, &max_ops_for_inst), cursor, exit); + Assert(max_ops_for_inst > 0); + } + + U8 default_is_stmt = 0; + TryRead(str8_deserial_read_struct(data, cursor, &default_is_stmt), cursor, exit); + + S8 line_base = 0; + TryRead(str8_deserial_read_struct(data, cursor, &line_base), cursor, exit); + + U8 line_range = 0; + TryRead(str8_deserial_read_struct(data, cursor, &line_range), cursor, exit); + + U8 opcode_base = 0; + TryRead(str8_deserial_read_struct(data, cursor, &opcode_base), cursor, exit); + + U64 num_opcode_lens = opcode_base > 0 ? opcode_base - 1 : 0; + String8 opcode_lens; + TryRead(str8_deserial_read_block(data, cursor, num_opcode_lens * sizeof(U8), &opcode_lens), cursor, exit); + + String8Array dir_table = {0}; + DW_LineFileArray file_table = {0}; + if (version < DW_Version_5) { + // read directory table + String8List dir_list = {0}; + + // compile directory is always first in the table + str8_list_push(scratch.arena, &dir_list, cu_dir); + + // parse additional directories + while (cursor < data.size) { + String8 dir = {0}; + TryRead(str8_deserial_read_cstr(data, cursor, &dir), cursor, exit); + if (dir.size == 0) { break; } + str8_list_push(scratch.arena, &dir_list, dir); + } + + DW_LineFileList file_list = {0}; + { + // compile unit name is always first in the file table + { + DW_LineFileNode *node = push_array(scratch.arena, DW_LineFileNode, 1); + node->file.path = cu_name; + SLLQueuePush(file_list.first, file_list.last, node); + file_list.node_count += 1; + } + + // read file table + while (cursor < data.size) { + U8 first_byte = 0; + if (str8_deserial_read_struct(data, cursor, &first_byte) == 0) { goto exit; } + if (first_byte == 0) { break; } + + DW_LineFile file = {0}; + TryRead(str8_deserial_read_cstr (data, cursor, &file.path), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.dir_idx), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.time_stamp), cursor, exit); + TryRead(str8_deserial_read_uleb128(data, cursor, &file.size), cursor, exit); + + DW_LineFileNode *node = push_array(scratch.arena, DW_LineFileNode, 1); + node->file = file; + + SLLQueuePush(file_list.first, file_list.last, node); + file_list.node_count += 1; + } + } + + // dir list -> array + dir_table = str8_array_from_list(arena, &dir_list); + + // file list -> array + file_table.count = 0; + file_table.v = push_array(arena, DW_LineFile, file_list.node_count); + for EachNode(n, DW_LineFileNode, file_list.first) { + DW_LineFile *dst = &file_table.v[file_table.count++]; + dst->path = push_str8_copy(arena, n->file.path); + dst->dir_idx = n->file.dir_idx; + dst->time_stamp = n->file.time_stamp; + dst->size = n->file.size; + } + } + // DWARF5 + else { + // directory table + { + // read table entry encoding count + U8 enc_count = 0; + TryRead(str8_deserial_read_struct(data, cursor, &enc_count), cursor, exit); + + // read table entry encodings + U64 *enc_arr = 0; + TryRead(str8_deserial_read_uleb128_array(scratch.arena, data, cursor, enc_count*2, &enc_arr), cursor, exit); + + // read table count + U64 table_count = 0; + TryRead(str8_deserial_read_uleb128(data, cursor, &table_count), cursor, exit); + + // validate encoding + if (table_count > 0) { + if (enc_count != 1) { goto exit; } + if (enc_arr[0] != DW_LNCT_Path) { goto exit; } + } + + // read table + dir_table.count = table_count; + dir_table.v = push_array(arena, String8, table_count); + for EachIndex(i, table_count) { + DW_FormKind form_kind = enc_arr[1]; + DW_Form form = {0}; + U64 form_size = 0; + if (!dw_read_form(str8_skip(data, cursor), version, format, address_size, form_kind, max_U64, &form, &form_size)) { goto exit; } + cursor += form_size; + dir_table.v[i] = dw_interp_string(input, format, cu_str_offsets, form); + } + } + + // file table + { + // read table entry encoding count + U8 enc_count = 0; + TryRead(str8_deserial_read_struct(data, cursor, &enc_count), cursor, exit); + + // read table entry encodings + U64 *enc_arr = 0; + TryRead(str8_deserial_read_uleb128_array(scratch.arena, data, cursor, enc_count*2, &enc_arr), cursor, exit); + + // read table count + U64 table_count = 0; + TryRead(str8_deserial_read_uleb128(data, cursor, &table_count), cursor, exit); + + file_table.count = table_count; + file_table.v = push_array(arena, DW_LineFile, table_count); + + for EachIndex(i, table_count) { + DW_LineFile *file = &file_table.v[i]; + for EachIndex(enc_idx, enc_count) { + DW_LNCT lnct = enc_arr[enc_idx*2 + 0]; + + DW_FormKind form_kind = enc_arr[enc_idx*2 + 1]; + DW_Form form = {0}; + U64 form_size = 0; + if (!dw_read_form(str8_skip(data, cursor), version, format, address_size, form_kind, max_U64, &form, &form_size)) { goto exit; } + cursor += form_size; + + switch (lnct) { + case DW_LNCT_Path: { file->path = dw_interp_string(input, format, cu_str_offsets, form); } break; + case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form); } break; + case DW_LNCT_TimeStamp: { file->time_stamp = dw_interp_const_u64(form); } break; + case DW_LNCT_Size: { file->size = dw_interp_const_u64(form); } break; + case DW_LNCT_MD5: { file->md5 = dw_interp_const_u128(form); } break; + case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form); } break; + default: { + Assert(!"unexpected LNTC encoding"); + } break; + } + } + } + } + } + + if (header_out) { + header_out->unit_length = length_size + length; + header_out->version = version; + header_out->address_size = address_size; + header_out->segment_selector_size = segsel_size; + header_out->header_length = header_length; + header_out->min_inst_len = min_inst_len; + header_out->max_ops_for_inst = max_ops_for_inst; + header_out->default_is_stmt = default_is_stmt; + header_out->line_base = line_base; + header_out->line_range = line_range; + header_out->opcode_base = opcode_base; + header_out->num_opcode_lens = num_opcode_lens; + header_out->opcode_lens = opcode_lens.str; + header_out->line_program_off = line_program_off; + header_out->dir_table = dir_table; + header_out->file_table = file_table; + } + + exit:; + scratch_end(scratch); + return cursor; +} + +internal DW_LineVM * +dw_line_vm_init(DW_Raw *input, DW_CompUnit *cu) +{ + DW_LineVM *vm = 0; + + Arena *arena = arena_alloc(.reserve_size = KB(64), .commit_size = KB(1)); + + String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); + String8 cu_dir = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_CompDir); + String8 cu_name = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_Name); + + // read the line table header + DW_LineVMHeader header = {0}; + if (cu_stmt_list.size) { + if ( ! dw_read_line_vm_header(arena, input, cu_stmt_list, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu, &header)) { + goto exit; + } + } + + vm = push_array(arena, DW_LineVM, 1); + *vm = (DW_LineVM){ + .arena = arena, + .cursor = header.line_program_off, + .program = str8_prefix(cu_stmt_list, header.unit_length), + .header = header, + .state.end_sequence = 1, + }; + + exit:; + if (vm == 0) { arena_release(arena); } + return vm; +} + +internal void +dw_line_vm_release(DW_LineVM *vm) +{ + arena_release(vm->arena); +} + +internal void +dw_line_vm_advance(DW_LineVM *vm, U64 advance) +{ + U64 op_index = vm->state.op_index + advance; + vm->state.address += vm->header.min_inst_len * (op_index / vm->header.max_ops_for_inst); + vm->state.op_index = op_index % vm->header.max_ops_for_inst; + vm->advance = advance; +} + +internal B32 +dw_line_vm_step(DW_LineVM *vm) +{ + B32 is_ok = 0; + + if (vm->cursor >= vm->program.size) { goto exit; } + + vm->new_line = 0; + + // reset VM state + if (vm->state.end_sequence) { + vm->state.address = 0; + vm->state.op_index = 0; + vm->state.file_index = 1; + vm->state.line = 1; + vm->state.column = 0; + vm->state.is_stmt = vm->header.default_is_stmt; + vm->state.basic_block = 0; + vm->state.end_sequence = 0; + vm->state.prologue_end = 0; + vm->state.epilogue_begin = 0; + vm->state.isa = 0; + vm->state.discriminator = 0; + } + + // read opcode + TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &vm->opcode), vm->cursor, exit); + + // special opcodes + if (vm->opcode >= vm->header.opcode_base) { + U32 adjusted_opcode = (U32)(vm->opcode - vm->header.opcode_base); + U32 op_advance = adjusted_opcode / vm->header.line_range; + S32 line_advance = (S64)vm->header.line_base + ((S64)adjusted_opcode) % (S64)vm->header.line_range; + U64 addr_advance = vm->header.min_inst_len * ((vm->state.op_index + op_advance) / vm->header.max_ops_for_inst); + + if (vm->header.line_range > 0 && vm->header.max_ops_for_inst > 0) { + adjusted_opcode = (U32)(vm->opcode - vm->header.opcode_base); + op_advance = adjusted_opcode / vm->header.line_range; + line_advance = (S32)vm->header.line_base + ((S32)adjusted_opcode) % (S32)vm->header.line_range; + addr_advance = vm->header.min_inst_len * ((vm->state.op_index+op_advance) / vm->header.max_ops_for_inst); + } + + vm->state.address += addr_advance; + vm->state.op_index = (vm->state.op_index + op_advance) % vm->header.max_ops_for_inst; + vm->state.line = (U64)((S64)vm->state.line + line_advance); + vm->state.basic_block = 0; + vm->state.prologue_end = 0; + vm->state.epilogue_begin = 0; + vm->state.discriminator = 0; + + vm->line_advance = line_advance; + vm->addr_advance = addr_advance; + vm->new_line = 1; + } else { + // standard opcodes + switch (vm->opcode) { + case DW_StdOpcode_Copy: { + vm->new_line = 1; + + vm->state.discriminator = 0; + vm->state.basic_block = 0; + vm->state.prologue_end = 0; + vm->state.epilogue_begin = 0; + } break; + + case DW_StdOpcode_AdvancePc: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + dw_line_vm_advance(vm, vm->operands[0].u64); + } break; + + case DW_StdOpcode_AdvanceLine: { + TryRead(str8_deserial_read_sleb128(vm->program, vm->cursor, &vm->operands[0].s64), vm->cursor, exit); + vm->state.line += vm->operands[0].s64; + } break; + + case DW_StdOpcode_SetFile: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.file_index = vm->operands[0].u64; + } break; + + case DW_StdOpcode_SetColumn: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.column = vm->operands[0].u64; + } break; + + case DW_StdOpcode_NegateStmt: { + vm->state.is_stmt = !vm->state.is_stmt; + } break; + + case DW_StdOpcode_SetBasicBlock: { + vm->state.basic_block = 1; + } break; + + case DW_StdOpcode_ConstAddPc: { + U64 advance = (0xffu - vm->header.opcode_base) / vm->header.line_range; + dw_line_vm_advance(vm, advance); + } break; + + case DW_StdOpcode_FixedAdvancePc: { + U16 fixed_advance = 0; + TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &fixed_advance), vm->cursor, exit); + vm->operands[0].u64 = fixed_advance; + vm->state.address += vm->operands[0].u64; + vm->state.op_index = 0; + } break; + + case DW_StdOpcode_SetPrologueEnd: { + vm->state.prologue_end = 1; + } break; + + case DW_StdOpcode_SetEpilogueBegin: { + vm->state.epilogue_begin = 1; + } break; + + case DW_StdOpcode_SetIsa: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); + vm->state.isa = vm->operands[0].u64; + } break; + + // extended opcodes + case DW_StdOpcode_ExtendedOpcode: { + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->ext_length), vm->cursor, exit); + String8 ext_data = str8_substr(vm->program, r1u64(vm->cursor, vm->cursor + vm->ext_length)); + vm->cursor += vm->ext_length; + + U64 ext_cursor = 0; + TryRead(str8_deserial_read_struct(ext_data, ext_cursor, &vm->ext_opcode), ext_cursor, exit); + + switch (vm->ext_opcode) { + case DW_ExtOpcode_EndSequence: { + vm->new_seq = 1; + vm->new_line = 1; + vm->state.end_sequence = 1; + } break; + + case DW_ExtOpcode_SetAddress: { + TryRead(str8_deserial_read(ext_data, ext_cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), ext_cursor, exit); + vm->state.address = vm->operands[0].u64; + vm->state.op_index = 0; + } break; + + case DW_ExtOpcode_DefineFile: { + TryRead(str8_deserial_read_cstr (ext_data, ext_cursor, &vm->operands[0].string), ext_cursor, exit); // file name + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[1].u64), ext_cursor, exit); // dir index + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[2].u64), ext_cursor, exit); // modify time + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[3].u64), ext_cursor, exit); // file size + + if (vm->ext_file_ht == 0) { + vm->ext_file_ht = hash_table_init(vm->arena, 512); + } + + DW_LineFile *file = push_array(vm->arena, DW_LineFile, 1); + file->path = vm->operands[0].string; + file->dir_idx = vm->operands[1].u64; + file->time_stamp = vm->operands[2].u64; + file->size = vm->operands[3].u64; + + if (hash_table_search_u64_raw(vm->ext_file_ht, vm->state.file_index) == 0) { + vm->error = push_str8f(vm->arena, "file with index %I64d was already defined", vm->state.file_index); + goto exit; + } + + hash_table_push_u64_raw(vm->arena, vm->ext_file_ht, vm->state.file_index, file); + } break; + + case DW_ExtOpcode_SetDiscriminator: { + TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[0].u64), ext_cursor, exit); + vm->state.discriminator = vm->operands[0].u64; + } break; + + default: { NotImplemented; } break; + } + } break; + + default: { + // skip unknown opcode + if (0 == vm->opcode || vm->opcode > vm->header.num_opcode_lens) { goto exit; } + for EachIndex(i, vm->header.opcode_lens[vm->opcode - 1]) { + U64 v = 0; + TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &v), vm->cursor, exit); + } + } break; + } + } + + is_ok = 1; + exit:; + return is_ok; +} + +internal DW_LineFile * +dw_line_vm_find_file(DW_LineVM *vm, U64 file_idx) +{ + DW_LineFile *file = 0; + if (file == 0 && file_idx < vm->header.file_table.count) { + file = &vm->header.file_table.v[file_idx]; + } else if (vm->ext_file_ht) { + file = hash_table_search_u64_raw(vm->ext_file_ht, file_idx); + } + return file; +} + +internal String8 +dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file) +{ + Temp scratch = scratch_begin(&arena, 1); + + // directory table must contain at least compile unit directory + Assert(dir_table.count > 0); + + // find directory and file name associated with the file index + String8 dir = dir_table.v[file->dir_idx]; + String8 path = file->path; + + // infer path style if directory is empty use file name + PathStyle style = path_style_from_str8(dir); + if (style == PathStyle_Null || style == PathStyle_Relative) { + style = path_style_from_str8(file->path); + } + + String8List path_list = {0}; + { + // directories that start with ".." are relative to the compile unit directory + if (str8_match_lit("..", dir, StringMatchFlag_RightSideSloppy)) { + String8List comp_dir = str8_split_path(scratch.arena, dir_table.v[0]); + str8_list_concat_in_place(&path_list, &comp_dir); + } + + // push directory + String8List dir_list = str8_split_path(scratch.arena, dir); + str8_list_concat_in_place(&path_list, &dir_list); + + // push file name + str8_list_push(scratch.arena, &path_list, file->path); + + // resolve dots in the path + str8_path_list_resolve_dots_in_place(&path_list, style); + } + + // join path + String8 result = str8_path_list_join_by_style(arena, &path_list, style); + + scratch_end(scratch); + return result; +} + +internal DW_PubStringsTable +dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind) +{ + Temp scratch = scratch_begin(&arena, 1); + + DW_PubStringsTable names_table = {0}; + names_table.size = 16384; + names_table.buckets = push_array(arena, DW_PubStringsBucket*, names_table.size); + + String8 section_data = input->sec[section_kind].data; + for(U64 cursor = 0; cursor < section_data.size; ) { + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { break; } + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + + U64 unit_length = 0; + U64 unit_length_size = str8_deserial_read_dwarf_packed_size(section_data, cursor, &unit_length); + if (unit_length_size == 0) { + break; + } + cursor += unit_length_size; + + U64 cursor_opl = Min(cursor + unit_length, section_data.size); + if (cursor >= cursor_opl) { + break; + } + + DW_Version unit_version = 0; + cursor += str8_deserial_read_struct(section_data, cursor, &unit_version); + if (cursor >= cursor_opl) { + break; + } + + U64 debug_info_off = 0; + cursor += str8_deserial_read_dwarf_uint(section_data, cursor, format, &debug_info_off); + if (cursor >= cursor_opl) { + break; + } + + U64 debug_info_length = 0; + cursor += str8_deserial_read_dwarf_packed_size(section_data, cursor, &debug_info_length); + if (cursor >= cursor_opl) { + break; + } + + U64 off_size = dw_size_from_format(format); + for (; (cursor + off_size) <= cursor_opl;) { + U64 info_off = 0; + U64 info_off_size = str8_deserial_read_dwarf_uint(section_data, cursor, format, &info_off); + cursor += info_off_size; + + if (info_off_size == 0 || info_off == 0) { + break; + } + + String8 string = {0}; + cursor += str8_deserial_read_cstr(section_data, cursor, &string); + + U64 hash = dw_hash_from_string(string); + U64 bucket_idx = hash % names_table.size; + + DW_PubStringsBucket *bucket = push_array(arena, DW_PubStringsBucket, 1); + bucket->next = names_table.buckets[bucket_idx]; + bucket->string = string; + bucket->info_off = info_off; + bucket->cu_info_off = debug_info_off; + names_table.buckets[bucket_idx] = bucket; + } + } + + scratch_end(scratch); + return names_table; +} + +internal DW_Expr +dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data) +{ + DW_Expr expr = {0}; + for (U64 cursor = 0, inst_start = 0; cursor < data.size; inst_start = cursor) { + // read opcode + DW_ExprOp opcode = 0; + U64 opcode_size = str8_deserial_read_struct(data, cursor, &opcode); + if (opcode_size == 0) { break; } + cursor += opcode_size; + + // read operands + U64 operand_count = dw_operand_count_from_expr_op(opcode); + DW_ExprOperandType *operand_types = dw_operand_types_from_expr_opcode(opcode); + DW_ExprOperand operands[2] = {0}; + for EachIndex(operand_idx, operand_count) { + U64 operand_size = 0; + switch (operand_types[operand_idx]) { + case DW_ExprOperandType_Null: { } break; + case DW_ExprOperandType_U8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u8); } break; + case DW_ExprOperandType_U16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u16); } break; + case DW_ExprOperandType_U32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u32); } break; + case DW_ExprOperandType_U64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_S8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s8); } break; + case DW_ExprOperandType_S16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s16); } break; + case DW_ExprOperandType_S32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s32); } break; + case DW_ExprOperandType_S64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s64); } break; + case DW_ExprOperandType_ULEB128: { operand_size = str8_deserial_read_uleb128(data, cursor, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_SLEB128: { operand_size = str8_deserial_read_sleb128(data, cursor, &operands[operand_idx].s64); } break; + case DW_ExprOperandType_Addr: { operand_size = str8_deserial_read(data, cursor, &operands[operand_idx].u64, addr_size, addr_size); } break; + case DW_ExprOperandType_DwarfUInt: { operand_size = str8_deserial_read_dwarf_uint(data, cursor, format, &operands[operand_idx].u64); } break; + case DW_ExprOperandType_Block: { + U8 block_size; + U64 block_size_size = str8_deserial_read_struct(data, cursor, &block_size); + U64 block_read_size = str8_deserial_read_block(data, cursor + block_size_size, block_size, &operands[operand_idx].block); + if(block_read_size == block_size_size) { + operand_size = block_size_size + block_read_size; + } + } break; + default: { InvalidPath; } break; + } + if (operand_size == 0) { goto exit; } + cursor += operand_size; + } + + // fill out instruction + DW_ExprInst *inst = push_array(arena, DW_ExprInst, 1); + inst->opcode = opcode; + inst->size = cursor - inst_start; + inst->operands = operand_count ? push_array(arena, DW_ExprOperand, operand_count) : 0; + MemoryCopy(inst->operands, operands, operand_count * sizeof(DW_ExprOperand)); + + // push instruction + DLLPushBack(expr.first, expr.last, inst); + expr.count += 1; + } + exit:; + return expr; +} + +internal void +dw_cfa_inst_list_push_node(DW_CFA_InstList *list, DW_CFA_InstNode *n) +{ + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal DW_CFA_InstNode * +dw_cfa_inst_list_push(Arena *arena, DW_CFA_InstList *list, DW_CFA_Inst v) +{ + DW_CFA_InstNode *n = push_array(arena, DW_CFA_InstNode, 1); + n->v = v; + dw_cfa_inst_list_push_node(list, n); + return n; +} + +internal U64 +dw_read_debug_frame_ptr(String8 data, DW_CIE *cie, U64 *ptr_out) +{ + U64 read_size = 0; + if (cie->segment_selector_size) { + NotImplemented; + } else { + read_size = str8_deserial_read(data, 0, ptr_out, cie->address_size, cie->address_size); + } + return read_size; +} + +internal U64 +dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out) +{ + U32 first_four_bytes = 0; + str8_deserial_read_struct(data, off, &first_four_bytes); + DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + + U64 length = 0; + U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); + if (length_size == 0) { goto exit; } + + Rng1U64 entry_range = rng_1u64(off, off + length_size + length); + String8 entry_data = str8_substr(data, entry_range); + U64 id = 0; + U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); + if (id_size == 0) { goto exit; } + + U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64; + desc_out->format = format; + desc_out->type = (id == id_type) ? DW_DescriptorEntryKind_CIE : DW_DescriptorEntryKind_FDE; + desc_out->entry_range = entry_range; + desc_out->cie_pointer = id; + desc_out->cie_pointer_off = length_size; + + exit:; + return length + length_size; +} + +internal B32 +dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) +{ + B32 is_parsed = 0; + U64 cursor = format == DW_Format_32Bit ? 4 : 12; + + U64 cie_id = 0; + TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id), cursor, exit); + + U8 version = 0; + TryRead(str8_deserial_read_struct(data, cursor, &version), cursor, exit); + + String8 aug_string = {0}; + TryRead(str8_deserial_read_cstr(data, cursor, &aug_string), cursor, exit); + + U8 address_size = 0; + U8 segment_selector_size = 0; + if (version >= DW_Version_4) { + TryRead(str8_deserial_read_struct(data, cursor, &address_size), cursor, exit); + TryRead(str8_deserial_read_struct(data, cursor, &segment_selector_size), cursor, exit); + } else { + address_size = byte_size_from_arch(arch); + } + + U64 code_align_factor = 0; + TryRead(str8_deserial_read_uleb128(data, cursor, &code_align_factor), cursor, exit); + + S64 data_align_factor = 0; + TryRead(str8_deserial_read_sleb128(data, cursor, &data_align_factor), cursor, exit); + + U64 ret_addr_reg = 0; + if (version == DW_Version_1) { TryRead(str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)), cursor, exit); } + else { TryRead(str8_deserial_read_uleb128(data, cursor, &ret_addr_reg), cursor, exit); } + + if (aug_string.size > 0) { goto exit; } + + cie_out->insts = str8_skip(data, cursor); + cie_out->aug_string = aug_string; + cie_out->code_align_factor = code_align_factor; + cie_out->data_align_factor = data_align_factor; + cie_out->ret_addr_reg = ret_addr_reg; + cie_out->format = format; + cie_out->version = version; + cie_out->address_size = address_size; + cie_out->segment_selector_size = segment_selector_size; + + is_parsed = 1; + exit:; + return is_parsed; +} + +internal B32 +dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out) +{ + B32 is_parsed = 0; + U64 cursor = format == DW_Format_32Bit ? 4 : 12; + + // extract CIE pointer + U64 cie_pointer = 0; + TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer), cursor, exit); + + // extract address of first instruction + U64 pc_begin = 0; + TryRead(dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin), cursor, exit); + + // extract instruction range size + U64 pc_range = 0; + TryRead(dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_range), cursor, exit); + + // parse augmentation data + String8 aug_data = str8_substr(data, rng_1u64(cursor, cursor + cie->aug_data.size)); + cursor += cie->aug_data.size; + + // commit values to out + fde_out->format = format; + fde_out->cie_pointer = cie_pointer; + fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); + fde_out->insts = str8_skip(data, cursor); + + is_parsed = 1; + exit:; + return is_parsed; +} + +internal B32 +dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out) +{ + B32 is_parsed = 0; + DW_DescriptorEntry fde_desc = {0}; + dw_parse_descriptor_entry_header(data, fde_offset, &fde_desc); + if (fde_desc.type == DW_DescriptorEntryKind_FDE) { + U64 cie_pointer_off = fde_desc.format == DW_Format_32Bit ? 4 : 12; + U64 cie_pointer = 0; + U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); + if (cie_pointer_size) { + DW_DescriptorEntry cie_desc = {0}; + dw_parse_descriptor_entry_header(data, cie_pointer, &cie_desc); + if (cie_desc.type == DW_DescriptorEntryKind_CIE) { + if (dw_parse_cie(str8_substr(data, cie_desc.entry_range), cie_desc.format, arch, cie_out)) { + if (dw_parse_fde(str8_substr(data, fde_desc.entry_range), fde_desc.format, cie_out, fde_out)) { + is_parsed = 1; + } + } + } + } + } + + return is_parsed; +} + +internal DW_CFA_ParseErrorCode +dw_parse_cfa_inst(String8 data, + U64 code_align_factor, + S64 data_align_factor, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud, + U64 *bytes_read_out, + DW_CFA_Inst *inst_out) +{ + *bytes_read_out = 0; + + DW_CFA_ParseErrorCode error_code = DW_CFA_ParseErrorCode_End; + U64 cursor = 0; + + // read opcode + DW_CFA_Opcode raw_opcode = 0; + TryRead(str8_deserial_read_struct(data, cursor, &raw_opcode), cursor, exit); + + // decode opcode implicit operand + U64 opcode = raw_opcode & ~DW_CFA_Mask_OpcodeHi; + U64 implicit_operand = 0; + if ((raw_opcode & DW_CFA_Mask_OpcodeHi) != 0) { + opcode = raw_opcode & DW_CFA_Mask_OpcodeHi; + implicit_operand = raw_opcode & DW_CFA_Mask_Operand; + } + + // decode operands + DW_CFA_Operand operands[DW_CFA_OperandMax] = {0}; + switch (opcode) { + case DW_CFA_SetLoc: { + U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64); + if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += address_size; + } break; + case DW_CFA_AdvanceLoc: { + operands[0].u64 = implicit_operand * code_align_factor; + } break; + case DW_CFA_AdvanceLoc1: { + U8 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_AdvanceLoc2: { + U16 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_AdvanceLoc4: { + U32 delta = 0; + U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); + if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += delta_size; + operands[0].u64 = delta * code_align_factor; + } break; + case DW_CFA_DefCfa: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].u64 = offset; + } break; + case DW_CFA_DefCfaSf: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].s64 = offset * data_align_factor; + } break; + case DW_CFA_DefCfaRegister: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_DefCfaOffset: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = offset; + } break; + case DW_CFA_DefCfaOffsetSf: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = offset * data_align_factor; + } break; + case DW_CFA_DefCfaExpr: { + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + + operands[0].block = expr; + cursor += expr_size; + } break; + case DW_CFA_Undefined: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_SameValue: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + operands[0].u64 = reg; + } break; + case DW_CFA_Offset: { + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = implicit_operand; + operands[1].s64 = (S64)offset * data_align_factor; + } break; + case DW_CFA_OffsetExt: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].u64 = offset * data_align_factor; + } break; + case DW_CFA_OffsetExtSf: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = reg; + operands[1].s64 = offset * data_align_factor; + } break; + case DW_CFA_ValOffset: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += val_size; + + U64 offset = 0; + U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = val; + operands[1].u64 = offset * data_align_factor; + } break; + case DW_CFA_ValOffsetSf: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += val_size; + + S64 offset = 0; + U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); + if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += offset_size; + + operands[0].u64 = val; + operands[1].s64 = offset; + } break; + case DW_CFA_Register: { + U64 dst_reg = 0; + U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg); + if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += dst_reg_size; + + U64 src_reg = 0; + U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg); + if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += src_reg_size; + + operands[0].u64 = dst_reg; + operands[1].u64 = src_reg; + } break; + case DW_CFA_Expr: { + U64 reg = 0; + U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); + if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += reg_size; + + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + cursor += expr_size; + + operands[0].u64 = reg; + operands[1].block = expr; + } break; + case DW_CFA_ValExpr: { + U64 val = 0; + U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); + if (val_size == 0) { goto exit; } + cursor += val_size; + + U64 expr_size = 0; + U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); + if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } + cursor += expr_size_size; + + if (cursor + expr_size > data.size) { goto exit; } + String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); + cursor += expr_size; + + operands[0].u64 = val; + operands[1].block = expr; + } break; + case DW_CFA_Restore: { + operands[0].u64 = implicit_operand; + } break; + case DW_CFA_RestoreExt: {} break; + case DW_CFA_RememberState: {} break; + case DW_CFA_RestoreState: {} break; + case DW_CFA_Nop: {} break; + default: { goto exit; } break; + } + + // fill out output + inst_out->opcode = opcode; + MemoryCopyTyped(&inst_out->operands[0], &operands[0], DW_CFA_OperandMax); + + *bytes_read_out = cursor; + + error_code = DW_CFA_ParseErrorCode_NewInst; + + exit:; + return error_code; +} + +internal DW_CFA_InstList +dw_parse_cfa_inst_list(Arena *arena, + String8 data, + U64 code_align_factor, + S64 data_align_factor, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud) +{ + U64 pos = arena_pos(arena); + DW_CFA_InstList list = {0}; + for (U64 cursor = 0, inst_size; cursor < data.size; cursor += inst_size) { + DW_CFA_Inst inst = {0}; + DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(data, cursor), code_align_factor, data_align_factor, decode_ptr_func, decode_ptr_ud, &inst_size, &inst); + if (error_code == DW_CFA_ParseErrorCode_End) { break; } + if (error_code != DW_CFA_ParseErrorCode_NewInst) { + MemoryZeroStruct(&list); + arena_pop_to(arena, pos); + break; + } + dw_cfa_inst_list_push(arena, &list, inst); + } + return list; +} + +internal +DW_DECODE_PTR(dw_decode_ptr_debug_frame) +{ + return dw_read_debug_frame_ptr(data, ud, ptr_out); +} + diff --git a/obsolete/dwarf/dwarf_parse_old.h b/obsolete/dwarf/dwarf_parse_old.h new file mode 100644 index 00000000..2bddbe72 --- /dev/null +++ b/obsolete/dwarf/dwarf_parse_old.h @@ -0,0 +1,528 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_PARSE_H +#define DWARF_PARSE_H + +typedef struct DW_Section +{ + String8 name; + String8 data; + B32 is_dwo; +} DW_Section; + +typedef struct DW_Raw +{ + DW_Section sec[DW_Section_COUNT]; + DW_Section sup[DW_Section_COUNT]; +} DW_Raw; + +typedef struct DW_ListUnit +{ + DW_Version version; + U64 address_size; + U64 segment_selector_size; + U64 entry_size; + String8 entries; +} DW_ListUnit; + +typedef struct DW_ListUnitInput +{ + U64 addr_count; + U64 str_offset_count; + U64 rnglist_count; + U64 loclist_count; + Rng1U64Array addr_ranges; + Rng1U64Array str_offset_ranges; + Rng1U64Array rnglist_ranges; + Rng1U64Array loclist_ranges; + DW_ListUnit *addrs; + DW_ListUnit *str_offsets; + DW_ListUnit *rnglists; + DW_ListUnit *loclists; +} DW_ListUnitInput; + +typedef struct DW_AbbrevTableEntry +{ + U64 id; + U64 off; +} DW_AbbrevTableEntry; + +typedef struct DW_AbbrevTable DW_AbbrevTable; +struct DW_AbbrevTable +{ + U64 count; + DW_AbbrevTableEntry *entries; +}; + +typedef enum DW_AbbrevKind +{ + DW_Abbrev_Null, + DW_Abbrev_Tag, + DW_Abbrev_Attrib, + DW_Abbrev_AttribSequenceEnd, + DW_Abbrev_DIEBegin, + DW_Abbrev_DIEEnd, +} DW_AbbrevKind; + +typedef U32 DW_AbbrevFlags; +enum +{ + DW_AbbrevFlag_HasImplicitConst = (1 << 0), + DW_AbbrevFlag_HasChildren = (1 << 1), +}; + +typedef struct DW_Abbrev +{ + DW_AbbrevKind kind; + U64 sub_kind; + U64 id; + S64 implicit_const; + DW_AbbrevFlags flags; +} DW_Abbrev; + +typedef struct DW_Attrib +{ + U64 info_off; + U64 abbrev_off; + U64 abbrev_id; + DW_AttribKind attrib_kind; + DW_Form form; +} DW_Attrib; + +typedef struct DW_AttribNode +{ + struct DW_AttribNode *next; + DW_Attrib v; +} DW_AttribNode; + +typedef struct DW_AttribList +{ + DW_AttribNode *first; + DW_AttribNode *last; + U64 count; +} DW_AttribList; + +typedef U8 DW_TagSpare; +typedef struct DW_Tag +{ + B32 has_children; + U64 abbrev_id; + DW_TagKind kind; + DW_AttribList attribs; + U64 info_off; + DW_TagSpare v; +} DW_Tag; + +typedef struct DW_TagNode +{ + DW_Tag tag; + struct DW_TagNode *sibling; + struct DW_TagNode *first_child; + struct DW_TagNode *last_child; +} DW_TagNode; + +typedef struct DW_Loc +{ + Rng1U64 range; + String8 expr; +} DW_Loc; + +typedef struct DW_LocNode +{ + DW_Loc v; + struct DW_LocNode *next; +} DW_LocNode; + +typedef struct DW_LocList +{ + U64 count; + DW_LocNode *first; + DW_LocNode *last; +} DW_LocList; + +typedef struct DW_CompUnit +{ + B32 relaxed; + DW_Ext ext; + DW_CompUnitKind kind; + DW_Version version; + DW_Format format; + U64 address_size; + U64 abbrev_off; + Rng1U64 info_range; + U64 first_tag_info_off; + DW_AbbrevTable abbrev_table; + DW_ListUnit *addr_lu; + DW_ListUnit *str_offsets_lu; + DW_ListUnit *rnglists_lu; + DW_ListUnit *loclists_lu; + U64 low_pc; + U64 dwo_id; + DW_Tag tag; + HashTable *tag_ht; +} DW_CompUnit; + +typedef struct DW_TagTree +{ + DW_TagNode *root; + U64 tag_count; +} DW_TagTree; + +//////////////////////////////// + +typedef struct DW_LineFile +{ + String8 path; + U64 dir_idx; + U64 time_stamp; + U64 size; + U128 md5; + String8 source; +} DW_LineFile; + +typedef struct DW_LineFileNode +{ + struct DW_LineFileNode *next; + DW_LineFile file; +} DW_LineFileNode; + +typedef struct DW_LineFileList +{ + U64 node_count; + DW_LineFileNode *first; + DW_LineFileNode *last; +} DW_LineFileList; + +typedef struct DW_LineFileArray +{ + U64 count; + DW_LineFile *v; +} DW_LineFileArray; + +typedef struct DW_LineVMHeader +{ + U64 unit_length; + DW_Version version; + U8 address_size; // Duplicates size from the compilation unit but is needed to support stripped exe that just have .debug_line and .debug_line_str. + U8 segment_selector_size; + U64 header_length; + U8 min_inst_len; + U8 max_ops_for_inst; + U8 default_is_stmt; + S8 line_base; + U8 line_range; + U8 opcode_base; + U64 num_opcode_lens; + U8 *opcode_lens; + U64 line_program_off; + String8Array dir_table; + DW_LineFileArray file_table; +} DW_LineVMHeader; + +typedef struct DW_LineVMState +{ + U64 address; // Address of a machine instruction. + U32 op_index; // This is used by the VLIW instructions to indicate index of operation inside the instruction. + + // Line table doesn't contain full path to a file, instead + // DWARF encodes path as two indices. First index will point into a directory + // table, and second points into a file name table. + U64 file_index; + + U64 line; + U64 column; + + B32 is_stmt; // Indicates that "address" points to place suitable for a breakpoint. + B32 basic_block; // Indicates that the "address" is inside a basic block. + + // Indicates that "address" points to place where function starts. + // Usually prologue is the place where compiler emits instructions to + // prepare stack for a function. + B32 prologue_end; + + B32 epilogue_begin; // Indicates that "address" points to section where function exits and unwinds stack. + U64 isa; // Instruction set that is used. + U64 discriminator; // Arbitrary id that indicates to which block these instructions belong. + B32 end_sequence; // Indicates that "address" points to the first instruction in the instruction block that follows. +} DW_LineVMState; + +typedef struct DW_LineVM +{ + Arena *arena; + U64 cursor; + String8 program; + DW_LineVMHeader header; + B32 new_line; + B32 new_seq; + B32 skip_opcode; + DW_LineVMState state; + U64 advance; + U64 opcode_off; + DW_StdOpcode opcode; + DW_ExtOpcode ext_opcode; + U64 ext_length; + U64 line_advance; + U64 addr_advance; + HashTable *ext_file_ht; + struct { + union { + String8 string; + U64 u64; + S64 s64; + }; + } operands[4]; + String8 error; +} DW_LineVM; + +//////////////////////////////// +// .debug_pubnames and .debug_pubtypes + +typedef struct DW_PubStringsBucket +{ + struct DW_PubStringsBucket *next; + String8 string; + U64 info_off; + U64 cu_info_off; +} DW_PubStringsBucket; + +typedef struct DW_PubStringsTable +{ + U64 size; + DW_PubStringsBucket **buckets; +} DW_PubStringsTable; + +typedef struct DW_Reference +{ + DW_CompUnit *cu; + U64 info_off; // global .debug_info offset +} DW_Reference; + +//////////////////////////////// +//~ Expression + +typedef union DW_ExprOperand +{ + U8 u8; + U16 u16; + U32 u32; + U64 u64; + + S8 s8; + S16 s16; + S32 s32; + S64 s64; + + String8 block; +} DW_ExprOperand; + +typedef struct DW_ExprInst +{ + DW_ExprOp opcode; + DW_ExprOperand *operands; + U64 size; + struct DW_ExprInst *next; + struct DW_ExprInst *prev; +} DW_ExprInst; + +typedef struct DW_Expr +{ + U64 count; + DW_ExprInst *first; + DW_ExprInst *last; +} DW_Expr; + +//////////////////////////////// +// .debug_frame + +typedef struct DW_CIE +{ + String8 insts; + String8 aug_string; + String8 aug_data; + U64 code_align_factor; + S64 data_align_factor; + U64 ret_addr_reg; + U64 ext[4]; + DW_Format format; + U8 version; + U8 address_size; + U8 segment_selector_size; +} DW_CIE; + +typedef struct DW_FDE +{ + DW_Format format; + U64 cie_pointer; + Rng1U64 pc_range; + String8 insts; +} DW_FDE; + +typedef union DW_CFA_Operand +{ + U64 u64; + S64 s64; + String8 block; +} DW_CFA_Operand; + +typedef enum +{ + DW_CFA_ParseErrorCode_NewInst, + DW_CFA_ParseErrorCode_End, + DW_CFA_ParseErrorCode_OutOfData +} DW_CFA_ParseErrorCode; + +typedef struct DW_CFA_Inst +{ + DW_CFA_Opcode opcode; + DW_CFA_Operand operands[DW_CFA_OperandMax]; +} DW_CFA_Inst; + +typedef struct DW_CFA_InstNode +{ + DW_CFA_Inst v; + struct DW_CFA_InstNode *next; +} DW_CFA_InstNode; + +typedef struct DW_CFA_InstList +{ + U64 count; + DW_CFA_InstNode *first; + DW_CFA_InstNode *last; +} DW_CFA_InstList; + +#define DW_DECODE_PTR(name) U64 name(String8 data, void *ud, U64 *ptr_out) +typedef DW_DECODE_PTR(DW_DecodePtr); + +// hasher + +internal U64 dw_hash_from_string(String8 string); + +// deserial helpers + +internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out); +internal U64 str8_deserial_read_dwarf_uint (String8 string, U64 off, DW_Format format, U64 *uint_out); +internal U64 str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out); +internal U64 str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out); + +internal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data); +internal Rng1U64Array dw_unit_ranges_from_data_arr(Arena *arena, String8 data); + +// list units + +internal U64 dw_read_list_unit_header_addr (String8 unit_data, DW_ListUnit *lu_out); +internal U64 dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out); +internal U64 dw_read_list_unit_header_list (String8 unit_data, DW_ListUnit *lu_out); + +internal DW_ListUnitInput dw_list_unit_input_from_input(Arena *arena, DW_Raw *input); + +internal U64 dw_offset_from_list_unit(DW_ListUnit *lu, U64 index); +internal U64 dw_addr_from_list_unit (DW_ListUnit *lu, U64 index); + +// abbrev table + +internal U64 dw_read_abbrev_tag (String8 data, U64 offset, DW_Abbrev *out_abbrev); +internal U64 dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev); + +internal DW_AbbrevTable dw_read_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_base); +internal U64 dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U64 abbrev_id); + +// form and tag + +internal B32 dw_read_form (String8 data, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, S64 implicit_const, DW_Form *form_out, U64 *bytes_read_out); +internal U64 dw_read_tag (Arena *arena, DW_Raw *input, DW_AbbrevTable abbrev_table, DW_Version version, DW_Format format, U64 address_size, Rng1U64 cu_info_range, U64 tag_info_off, DW_Tag *tag_out); +internal U64 dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); + +// attrib interp + +internal U64 dw_interp_sec_offset(DW_Form form); +internal String8 dw_interp_exprloc (DW_Form form); +internal U128 dw_interp_const_u128(DW_Form form); +internal U64 dw_interp_const_u64 (DW_Form form); +internal U32 dw_interp_const_u32 (DW_Form form); +internal S64 dw_interp_const_s64 (DW_Form form); +internal S32 dw_interp_const_s32 (DW_Form form); +internal B32 dw_interp_flag (DW_Form form); +internal U64 dw_interp_address (U64 address_size, U64 base_addr, DW_ListUnit *addr_xlist, DW_Form form); +internal String8 dw_interp_block (DW_Raw *input, DW_CompUnit *cu, DW_Form form); +internal String8 dw_interp_string (DW_Raw *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_Form form); +internal String8 dw_interp_line_ptr (DW_Raw *input, DW_Form form); +internal DW_LineFile * dw_interp_file (DW_LineVM *line_vm, DW_Form form); +internal DW_Reference dw_interp_ref (DW_Raw *input, DW_CompUnit *cu, DW_Form form); +internal DW_LocList dw_interp_loclist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form); +internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form); + +internal String8 dw_exprloc_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U128 dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U64 dw_const_u64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U32 dw_const_u32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal S64 dw_const_s64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal S32 dw_const_s32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal B32 dw_flag_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal U64 dw_address_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_block_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_string_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal String8 dw_line_ptr_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW_LineFile * dw_file_from_attrib (DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib); +internal DW_Reference dw_ref_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); + +internal String8 dw_exprloc_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U128 dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U64 dw_const_u64_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U32 dw_const_u32_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal B32 dw_flag_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal U64 dw_address_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_block_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_string_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind); +internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); + +internal B32 dw_is_attrib_var_ref(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); + +// compile unit + +internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed); +internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu); +internal HashTable * dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree); +internal DW_TagNode * dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off); + +// line VM + +internal U64 dw_read_line_vm_header(Arena *arena, DW_Raw *input, String8 cu_stmt_list, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); +internal DW_LineVM * dw_line_vm_init(DW_Raw *input, DW_CompUnit *cu); +internal void dw_line_vm_release(DW_LineVM *vm); +internal void dw_line_vm_advance(DW_LineVM *vm, U64 advance); +internal B32 dw_line_vm_step(DW_LineVM *vm); +internal DW_LineFile * dw_line_vm_find_file(DW_LineVM *vm, U64 file_idx); +internal String8 dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file); + +// helper for .debug_pubtypes and .debug_pubnames + +internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind); + +// expression + +internal DW_Expr dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data); + +// debug frame + +internal void dw_cfa_inst_list_push_node(DW_CFA_InstList *list, DW_CFA_InstNode *n); +internal DW_CFA_InstNode * dw_cfa_inst_list_push(Arena *arena, DW_CFA_InstList *list, DW_CFA_Inst v); + +internal U64 dw_read_debug_frame_ptr(String8 data, DW_CIE *cie, U64 *ptr_out); + +internal U64 dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out); +internal B32 dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out); +internal B32 dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out); +internal B32 dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out); + +internal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud, U64 *bytes_read_out, DW_CFA_Inst *inst_out); +internal DW_CFA_InstList dw_parse_cfa_inst_list(Arena *arena, String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud); + +#endif // DWARF_PARSE_H diff --git a/obsolete/dwarf/dwarf_unwind_old.c b/obsolete/dwarf/dwarf_unwind_old.c new file mode 100644 index 00000000..c8124236 --- /dev/null +++ b/obsolete/dwarf/dwarf_unwind_old.c @@ -0,0 +1,373 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal DW_CFI_Row * +dw_make_cfi_row(Arena *arena, U64 reg_count) +{ + DW_CFI_Row *row = push_array(arena, DW_CFI_Row, 1); + row->regs = push_array(arena, DW_CFI_Register, reg_count); + for EachIndex(reg_idx, reg_count) { + row->regs[reg_idx].rule = DW_CFI_RegisterRule_SameValue; + } + return row; +} + +internal void +dw_memcpy_cfi_row(DW_CFI_Row *dst, DW_CFI_Row *src, U64 reg_count) +{ + dst->cfa = src->cfa; + MemoryCopyTyped(dst->regs, src->regs, reg_count); +} + +internal DW_CFI_Row * +dw_copy_cfi_row(Arena *arena, DW_CFI_Row *row, U64 reg_count) +{ + DW_CFI_Row *new_row = dw_make_cfi_row(arena, reg_count); + dw_memcpy_cfi_row(new_row, row, reg_count); + return new_row; +} + +internal DW_CFI_Unwind * +dw_cfi_unwind_init(Arena *arena, + Arch arch, + DW_CIE *cie, + DW_FDE *fde, + DW_DecodePtr *decode_ptr_func, + void *decode_ptr_ud) +{ + Temp scratch = scratch_begin(&arena, 1); + + DW_CFI_Unwind *uw = push_array(arena, DW_CFI_Unwind, 1); + uw->insts = dw_parse_cfa_inst_list(arena, fde->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud); + uw->cie = cie; + uw->fde = fde; + uw->pc = fde->pc_range.min; + uw->arch = arch; + uw->reg_count = dw_reg_count_from_arch(arch); + + // setup initial register rules + DW_CFA_InstList initial_insts = dw_parse_cfa_inst_list(scratch.arena, cie->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud); + uw->row = dw_make_cfi_row(arena, uw->reg_count); + uw->curr_inst = initial_insts.first; + if (!dw_cfi_next_row(arena, uw)) { + AssertAlways(0 && "unable to interpret initial row instructions"); + } + + // make first row from initial rules + uw->initial_row = uw->row; + uw->row = dw_copy_cfi_row(arena, uw->initial_row, uw->reg_count); + uw->curr_inst = uw->insts.first; + + scratch_end(scratch); + return uw; +} + +internal B32 +dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) +{ + B32 is_row_valid = 0; + DW_CFA_InstNode *row_inst = uw->curr_inst; + + // skip leading nops + while (uw->curr_inst) { + if (uw->curr_inst->v.opcode != DW_CFA_Nop) { + break; + } + uw->curr_inst = uw->curr_inst->next; + } + + while (uw->curr_inst) { + DW_CFA_Inst *inst = &uw->curr_inst->v; + + // validate register operands + DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst->opcode); + U64 operand_count = dw_operand_count_from_cfa_opcode(inst->opcode); + for EachIndex(operand_idx, operand_count) { + if (operand_types[operand_idx] == DW_CFA_OperandType_Register) { + if (inst->operands[operand_idx].u64 >= uw->reg_count) { + goto exit; + } + } + } + + switch (inst->opcode) { + // Row Creation Instructions + case DW_CFA_SetLoc: { + uw->pc = inst->operands[0].u64; + } break; + case DW_CFA_AdvanceLoc: + case DW_CFA_AdvanceLoc1: + case DW_CFA_AdvanceLoc2: + case DW_CFA_AdvanceLoc4: { + uw->pc += inst->operands[0].u64; + } break; + + // CFA Definition Instructions + case DW_CFA_DefCfa: + case DW_CFA_DefCfaSf: { + U64 reg = inst->operands[0].u64; + S64 off = inst->operands[1].s64; + uw->row->cfa.rule = DW_CFA_Rule_RegOff; + uw->row->cfa.reg = reg; + uw->row->cfa.off = off; + } break; + case DW_CFA_DefCfaRegister: { + // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset + if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; } + U64 reg = inst->operands[0].u64; + uw->row->cfa.reg = reg; + } break; + case DW_CFA_DefCfaOffset: + case DW_CFA_DefCfaOffsetSf: { + // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset + if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; } + uw->row->cfa.off = inst->operands[0].s64; + } break; + case DW_CFA_DefCfaExpr: { + uw->row->cfa.rule = DW_CFA_Rule_Expression; + uw->row->cfa.expr = inst->operands[0].block; + } break; + + // Register Rule Instructions + case DW_CFA_Undefined: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_Undefined; + } break; + case DW_CFA_SameValue: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_SameValue; + } break; + case DW_CFA_Offset: + case DW_CFA_OffsetExt: + case DW_CFA_OffsetExtSf: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_Offset; + uw->row->regs[reg].n = inst->operands[1].s64; + } break; + case DW_CFA_ValOffset: + case DW_CFA_ValOffsetSf: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValOffset; + uw->row->regs[reg].n = inst->operands[1].s64; + } break; + case DW_CFA_Register: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_Register; + uw->row->regs[reg].n = inst->operands[1].s64; + } break; + case DW_CFA_Expr: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_Expression; + uw->row->regs[reg].expr = inst->operands[1].block; + } break; + case DW_CFA_ValExpr: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValExpression; + uw->row->regs[reg].expr = inst->operands[1].block; + } break; + case DW_CFA_Restore: + case DW_CFA_RestoreExt: { + U64 reg = inst->operands[0].u64; + uw->row->regs[reg] = uw->initial_row->regs[reg]; + } break; + + // Row State Instructions + case DW_CFA_RememberState: { + DW_CFI_Row *new_row = dw_copy_cfi_row(arena, uw->row, uw->reg_count); + SLLStackPush(uw->row, new_row); + } break; + case DW_CFA_RestoreState: { + if (uw->row == 0) { goto exit; } // TODO: report error: unbalanced number of pushes and pops + DW_CFI_Row *free_row = uw->row; + SLLStackPop(uw->row); + SLLStackPush(uw->free_rows, free_row); + } break; + + case DW_CFA_Nop: {} break; + + default: { NotImplemented; } break; // TODO: report error: unknown CFA opcode + } + + uw->curr_inst = uw->curr_inst->next; + if (uw->curr_inst) { + if (dw_is_new_row_cfa_opcode(uw->curr_inst->v.opcode)) { break; } + } + } + + is_row_valid = row_inst != 0; + exit:; + return is_row_valid; +} + +internal DW_CFI_Row * +dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc) +{ + Temp scratch = scratch_begin(&arena, 1); + + B32 is_row_found = 0; + U64 reg_count = dw_reg_count_from_arch(arch); + DW_CFI_Unwind *uw = dw_cfi_unwind_init(scratch.arena, arch, cie, fde, decode_ptr_func, decode_ptr_ctx); + DW_CFI_Row *row = dw_copy_cfi_row(scratch.arena, uw->row, uw->reg_count); + U64 prev_pc = uw->pc; + while (dw_cfi_next_row(scratch.arena, uw)) { + if (prev_pc <= pc && pc < uw->pc) { + is_row_found = 1; + break; + } + dw_memcpy_cfi_row(row, uw->row, uw->reg_count); + prev_pc = uw->pc; + } + + // handle last row + if (!is_row_found) { + if (contains_1u64(fde->pc_range, pc)) { + row = uw->row; + is_row_found = 1; + } + } + + // copy out final row + DW_CFI_Row *result = 0; + if (is_row_found) { + result = dw_copy_cfi_row(arena, row, reg_count); + } + + scratch_end(scratch); + return result; +} + +internal MachineOpResult +dw_compute_cfa(Arch arch, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud, U64 *cfa_out) +{ + MachineOpResult unwind_status = MachineOpResult_Fail; + ARCH_Info *arch_info = arch_info_from_arch(arch); + switch(row->cfa.rule) + { + case DW_CFA_Rule_Null:{}break; + case DW_CFA_Rule_RegOff: + { + // TODO: report error (invalid register read) + U64 cfa_reg_value = 0; + U64 reg_size = dw_reg_size_from_code(arch, row->cfa.reg); + AssertAlways(reg_size <= sizeof(cfa_reg_value)); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, row->cfa.reg); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + if(!arch_reg_block_read_range(arch_info, reg_block, reg_rng, &cfa_reg_value)) + { + break; + } + *cfa_out = cfa_reg_value + row->cfa.off; + unwind_status = MachineOpResult_Ok; + }break; + case DW_CFA_Rule_Expression: + { + Temp scratch = scratch_begin(0,0); + DW_ExprValue value = {0}; + DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_32Bit, byte_size_from_arch(arch), row->cfa.expr); + DW_ExprEvalResult eval_result = dw_eval_expr(scratch.arena, arch, DW_Format_32Bit, 0, 0, 0, 9999, expr, reg_block, mem_read_func, mem_read_ud, &value); + if (eval_result == DW_ExprEvalResult_Ok) { + if (DW_ExprValueType_IsInt(value.type)) { + *cfa_out = value.u64; + unwind_status = MachineOpResult_Ok; + } + } else if (eval_result == DW_ExprEvalResult_Maybe) { + unwind_status = MachineOpResult_Maybe; + } + scratch_end(scratch); + }break; + } + return unwind_status; +} + +internal MachineOpResult +dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud) +{ + Temp scratch = scratch_begin(0,0); + MachineOpResult unwind_status = MachineOpResult_Ok; + + ARCH_Info *arch_info = arch_info_from_arch(arch); + + U64 max_reg_size = dw_reg_max_size_from_arch(arch); + void *reg_buffer = push_array(scratch.arena, U8, max_reg_size); + + U64 reg_count = dw_reg_count_from_arch(arch); + for EachIndex(reg_idx, reg_count) + { + DW_CFI_Register *reg = &row->regs[reg_idx]; + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_idx); + Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; + switch(reg->rule) + { + default:{}break; + case DW_CFI_RegisterRule_Undefined: {} break; + case DW_CFI_RegisterRule_SameValue: {} break; + case DW_CFI_RegisterRule_Offset: + { + // read register value from memory + U64 addr = cfa + reg->n; + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); + unwind_status = mem_read_func(addr, reg_buffer, reg_size, mem_read_ud); + if (unwind_status != MachineOpResult_Ok) { goto exit; } + + // write register value to the thread context + if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, reg_buffer)) + { + unwind_status = MachineOpResult_Fail; + goto exit; + } + }break; + case DW_CFI_RegisterRule_ValOffset: + { + // compute register value + U64 reg_value = cfa + reg->n; + + // write register value to the thread context + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); + if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, ®_value)) + { + unwind_status = MachineOpResult_Fail; + goto exit; + } + }break; + case DW_CFI_RegisterRule_Register: + { + // read register value from another register + U64 reg_size = dw_reg_size_from_code(arch, reg_idx); + if(!arch_reg_block_read_range(arch_info, reg_block, reg_rng, reg_buffer)) + { + unwind_status = MachineOpResult_Fail; + goto exit; + } + + // write register value to the thread context + if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, reg_buffer)) + { + unwind_status = MachineOpResult_Fail; + goto exit; + } + if (unwind_status != MachineOpResult_Ok) { goto exit; } + }break; + case DW_CFI_RegisterRule_Expression: + { + // TODO: evaluate expression + NotImplemented; + }break; + case DW_CFI_RegisterRule_ValExpression: + { + // TODO: evaluate expression + NotImplemented; + }break; + case DW_CFI_RegisterRule_Architectural: + { + NotImplemented; + }break; + } + } + + // update stack pointer + arch_reg_block_write_sp(arch_info, reg_block, cfa); + + exit:; + scratch_end(scratch); + return unwind_status; +} diff --git a/obsolete/dwarf/dwarf_unwind_old.h b/obsolete/dwarf/dwarf_unwind_old.h new file mode 100644 index 00000000..63e5ba3f --- /dev/null +++ b/obsolete/dwarf/dwarf_unwind_old.h @@ -0,0 +1,81 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef DWARF_UNWIND_H +#define DWARF_UNWIND_H + +typedef enum DW_CFI_RegisterRule +{ + DW_CFI_RegisterRule_Undefined, + DW_CFI_RegisterRule_SameValue, + DW_CFI_RegisterRule_Offset, + DW_CFI_RegisterRule_ValOffset, + DW_CFI_RegisterRule_Register, + DW_CFI_RegisterRule_Expression, + DW_CFI_RegisterRule_ValExpression, + DW_CFI_RegisterRule_Architectural +} DW_CFI_RegisterRule; + +typedef enum DW_CFA_Rule +{ + DW_CFA_Rule_Null, + DW_CFA_Rule_RegOff, + DW_CFA_Rule_Expression +} DW_CFA_Rule; + +typedef struct DW_CFA +{ + DW_CFA_Rule rule; + union { + struct { + DW_Reg reg; + S64 off; + }; + String8 expr; + }; +} DW_CFA; + +typedef struct DW_CFI_Register +{ + DW_CFI_RegisterRule rule; + union { + S64 n; + String8 expr; + }; +} DW_CFI_Register; + +typedef struct DW_CFI_Row +{ + DW_CFA cfa; + DW_CFI_Register *regs; + struct DW_CFI_Row *next; +} DW_CFI_Row; + +typedef struct DW_CFI_Unwind +{ + DW_CFA_InstList insts; + DW_CIE *cie; + DW_FDE *fde; + DW_CFI_Row *initial_row; + DW_CFI_Row *row; + DW_CFA_InstNode *curr_inst; + DW_CFI_Row *free_rows; + U64 pc; + Arch arch; + U64 reg_count; +} DW_CFI_Unwind; + +//////////////////////////////// + +internal DW_CFI_Row * dw_make_cfi_row(Arena *arena, U64 reg_count); +internal DW_CFI_Row * dw_copy_cfi_row(Arena *arena, DW_CFI_Row *row, U64 reg_count); + +internal DW_CFI_Unwind * dw_cfi_unwind_init(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud); +internal B32 dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw); + +internal DW_CFI_Row * dw_cfi_row_from_pc(Arena *arena, Arch arch, struct DW_CIE *cie, struct DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc); +internal MachineOpResult dw_compute_cfa(Arch arch, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud, U64 *cfa_out); +internal MachineOpResult dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud); + +#endif // DWARF_UNWIND_H + diff --git a/src/dwarf/dwarf_dump.c b/src/dwarf/dwarf_dump.c index 9b6d6481..04f7669c 100644 --- a/src/dwarf/dwarf_dump.c +++ b/src/dwarf/dwarf_dump.c @@ -1,254 +1,29 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -#define dw_indent() do { indent += 1; } while (0) -#define dw_unindent() do { indent -= 1; } while (0) -#define dw_print(string) dw_print_ (arena, strings, indent, string) -#define dw_printf(...) dw_printf_(arena, strings, indent, __VA_ARGS__) -static char g_spaces[] = " "; - -internal void -dw_print_(Arena *arena, String8List *out, int indent, String8 string) -{ - Temp scratch = scratch_begin(&arena, 1); - str8_list_pushf(arena, out, "%.*s%S", Min(indent * 2, sizeof(g_spaces)), g_spaces, string); - scratch_end(scratch); -} - -internal void -dw_printf_(Arena *arena, String8List *out, int indent, char *fmt, ...) -{ - Temp scratch = scratch_begin(&arena, 1); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - dw_print_(arena, out, indent, string); - va_end(args); - scratch_end(scratch); -} - -internal Rng1U64Array -dw_get_info_ranges(DW_Dumper *dumper) -{ - if (!(dumper->cache_flags & DW_DumperCacheFlag_InfoRanges)) { - dumper->cache.info_ranges = dw_unit_ranges_from_data_arr(dumper->arena, dumper->input->sec[DW_Section_Info].data); - } - return dumper->cache.info_ranges; -} - -internal DW_CompUnit * -dw_get_cu_arr(DW_Dumper *dumper) -{ - if (!(dumper->cache_flags & DW_DumperCacheFlag_CuArr)) { - Rng1U64Array info_ranges = dw_get_info_ranges(dumper); - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(dumper->arena, dumper->input); - dumper->cache.cu_arr = push_array(dumper->arena, DW_CompUnit, info_ranges.count); - for EachIndex(cu_idx, info_ranges.count) { - dumper->cache.cu_arr[cu_idx] = dw_cu_from_info_off(dumper->arena, dumper->input, lu_input, info_ranges.v[cu_idx].min, dumper->is_relaxed); - } - } - return dumper->cache.cu_arr; -} - -internal HashTable * -dw_get_line_vm_map(DW_Dumper *dumper) -{ - if (!(dumper->cache_flags & DW_DumperCacheFlag_LineVmMap)) { - Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(dumper->arena, dumper->input->sec[DW_Section_Line].data); - dumper->cache.line_vm_map = hash_table_init(dumper->arena, unit_ranges.count * 2); - } - return dumper->cache.line_vm_map; -} - -internal DW_TagTree * -dw_get_tag_trees(DW_Dumper *dumper) -{ - if (!(dumper->cache_flags & DW_DumperCacheFlag_TagTrees)) { - Rng1U64Array info_ranges = dw_get_info_ranges(dumper); - DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); - dumper->cache.tag_trees = push_array(dumper->arena, DW_TagTree, info_ranges.count); - for EachIndex(cu_idx, info_ranges.count) { - dumper->cache.tag_trees[cu_idx] = dw_tag_tree_from_cu(dumper->arena, dumper->input, &cu_arr[cu_idx]); - } - } - return dumper->cache.tag_trees; -} - //////////////////////////////// -//~ rjf: Stringification Helpers +//~ rjf: Helpers internal String8List -dw_string_list_from_cfi_program(Arena *arena, - U64 cu_base, - Arch arch, - DW_Version ver, - DW_Ext ext, - DW_Format format, - U64 pc_begin, - DW_CIE *cie, - DW_DecodePtr *decode_ptr_func, - void *deocde_ptr_ud, - String8 program) +dw_dump_list_from_expr(Arena *arena, String8 data, Arch arch, DW2_ParseCtx *ctx) { - Temp scratch = scratch_begin(&arena, 1); - String8List list = {0}; - - U64 reg_max = dw_reg_count_from_arch(arch); - U64 pc = pc_begin; - for (U64 cursor = 0, inst_size; cursor < program.size; cursor += inst_size) { - // unpack instruction - DW_CFA_Inst inst = {0}; - DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(program, cursor), cie->code_align_factor, cie->data_align_factor, 0, 0, &inst_size, &inst); - if (error_code == DW_CFA_ParseErrorCode_End) { break; } - if (error_code != DW_CFA_ParseErrorCode_NewInst) { - str8_list_pushf(arena, &list, "ERROR: failed to unpack CFA instruction @ 0x%I64", cursor); - break; - } - - // error check operands - DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst.opcode); - U64 operand_count = dw_operand_count_from_cfa_opcode(inst.opcode); - for EachIndex(operand_idx, operand_count) { - switch (operand_types[operand_idx]) { - case DW_CFA_OperandType_Null: break; - case DW_CFA_OperandType_Value: break; - case DW_CFA_OperandType_Register: { - if (inst.operands[operand_idx].u64 >= reg_max) { - str8_list_pushf(arena, &list, "ERROR: DW_CFA_%S @ 0x%I64x has an invalid register", - dw_string_from_cfa_opcode(inst.opcode), - cursor); - } - } break; - case DW_CFA_OperandType_Expression: { - DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block); - for EachNode(inst, DW_ExprInst, expr.first) { - if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) { - String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode); - str8_list_pushf(arena, &list, "ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S", expr_opcode_str); - } - } - } break; - default: { InvalidPath; } break; - } - } - - // format operands - String8 operand_str = str8_lit("???"); - switch (inst.opcode) { - case DW_CFA_Nop: { operand_str = str8_zero(); } break; - case DW_CFA_SetLoc: { - operand_str = str8f(arena, "0x%X", inst.operands[0].u64); - pc = inst.operands[0].u64; - } break; - case DW_CFA_AdvanceLoc1: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc2: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_AdvanceLoc4: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "%+u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_OffsetExt: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break; - case DW_CFA_Undefined: { - operand_str = str8f(arena, "%I64u", inst.operands[0].u64); - } break; - case DW_CFA_SameValue: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_Register: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_RememberState: { operand_str = str8_zero(); } break; - case DW_CFA_RestoreState: { operand_str = str8_zero(); } break; - case DW_CFA_DefCfa: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_DefCfaRegister: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - case DW_CFA_DefCfaOffset: { - operand_str = str8f(arena, "+%I64u", inst.operands[0].u64); - } break; - case DW_CFA_DefCfaExpr: { - operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format); - } break; - case DW_CFA_Expr: { - String8 reg_str = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0); - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "%S expression %S", reg_str, expr_str); - } break; - case DW_CFA_OffsetExtSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaSf: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break; - case DW_CFA_ValOffset: { - operand_str = str8f(arena, "value 0x%I64x, offset %+I64d", inst.operands[0].u64, inst.operands[1].u64); - } break; - case DW_CFA_ValOffsetSf: { - operand_str = str8f(arena, "value %I64u, offset %+I64d", inst.operands[0].u64, inst.operands[1].s64); - } break; - case DW_CFA_ValExpr: { - String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format); - operand_str = str8f(arena, "value +%I64u, expression %S", inst.operands[0].u64, expr_str); - } break; - case DW_CFA_AdvanceLoc: { - U64 delta = inst.operands[0].u64; - pc += delta; - operand_str = str8f(arena, "+%I64u `PC 0x%I64x`", delta, pc); - } break; - case DW_CFA_Offset: { - U64 reg = inst.operands[0].u64; - S64 offset = (S64)inst.operands[1].u64; - operand_str = dw_string_from_reg_off(arena, arch, reg, offset); - } break; - case DW_CFA_Restore: { - operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0); - } break; - default: { - str8_list_pushf(arena, &list, "ERROR: unknown CFA opcode 0x%I64u", inst.opcode); - } goto exit; - } - - if (operand_str.size) { - str8_list_pushf(arena, &list, "DW_CFA_%S: %S", dw_string_from_cfa_opcode(inst.opcode), operand_str); - } else { - str8_list_pushf(arena, &list, "DW_CFA_%S", dw_string_from_cfa_opcode(inst.opcode)); - } - } - - exit:; - scratch_end(scratch); - return list; -} - -internal String8List -dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format) -{ - Temp scratch = scratch_begin(&arena, 1); String8List result = {0}; - for (U64 cursor = 0; cursor < raw_data.size; ) { - U8 op = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &op); + Temp scratch = scratch_begin(&arena, 1); + ARCH_Info *arch_info = arch_info_from_arch(arch); + for(U64 off = 0; off < data.size;) + { + U64 start_off = 0; - String8 op_value = str8_zero(); - U64 size_param = 0; - B32 is_signed = 0; - switch (op) { + // rjf: read next op + U8 op = 0; + off += str8_deserial_read_struct(data, off, &op); + + // rjf: unpack op / operands + String8 operand_string = {0}; + U64 size_param = 0; + B32 is_signed = 0; + switch(op) + { case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: @@ -259,10 +34,11 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: + { U64 x = op - DW_ExprOp_Lit0; - op_value = push_str8f(scratch.arena, "%I64u", x); - } break; + operand_string = str8f(scratch.arena, "%I64u", x); + }break; case DW_ExprOp_Const1U:size_param = 1; goto const_n; case DW_ExprOp_Const2U:size_param = 2; goto const_n; @@ -274,35 +50,41 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n; const_n: { - if (is_signed) { + if(is_signed) + { S64 x = 0; - cursor += str8_deserial_read(raw_data, cursor, &x, size_param, 1); + off += str8_deserial_read(data, off, &x, size_param, 1); x = extend_sign64(x, size_param); - op_value = push_str8f(scratch.arena, "%I64d", x); - } else { - U64 x = 0; - cursor += str8_deserial_read(raw_data, cursor, &x, size_param, 1); - op_value = push_str8f(scratch.arena, "%I64u", x); + operand_string = str8f(scratch.arena, "%I64d", x); } - } break; + else + { + U64 x = 0; + off += str8_deserial_read(data, off, &x, size_param, 1); + operand_string = str8f(scratch.arena, "%I64u", x); + } + }break; - case DW_ExprOp_Addr: { + case DW_ExprOp_Addr: + { U64 addr = 0; - cursor += str8_deserial_read(raw_data, cursor, &addr, addr_size, 1); - op_value = push_str8f(scratch.arena, "%#I64x", addr); - } break; + off += str8_deserial_read(data, off, &addr, ctx->addr_size, 1); + operand_string = str8f(scratch.arena, "0x%I64x", addr); + }break; - case DW_ExprOp_ConstU: { + case DW_ExprOp_ConstU: + { U64 x = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &x); - op_value = push_str8f(scratch.arena, "%I64u", x); - } break; + off += str8_deserial_read_uleb128(data, off, &x); + operand_string = str8f(scratch.arena, "%I64u", x); + }break; - case DW_ExprOp_ConstS: { + case DW_ExprOp_ConstS: + { S64 x = 0; - cursor += str8_deserial_read_sleb128(raw_data, cursor, &x); - op_value = push_str8f(scratch.arena, "%I64d", x); - } break; + off += str8_deserial_read_sleb128(data, off, &x); + operand_string = str8f(scratch.arena, "%I64d", x); + }break; case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: @@ -314,63 +96,74 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + { U64 reg_idx = op - DW_ExprOp_Reg0; - op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, 0); - } break; + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = arch_info->reg_code_name_table[regcode]; + }break; - case DW_ExprOp_RegX: { + case DW_ExprOp_RegX: + { U64 reg_idx = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, ®_idx); - op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, 0); - } break; + off += str8_deserial_read_uleb128(data, off, ®_idx); + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = arch_info->reg_code_name_table[regcode]; + }break; - case DW_ExprOp_ImplicitValue: { + case DW_ExprOp_ImplicitValue: + { U64 value_size = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &value_size); - Rng1U64 value_range = rng_1u64(cursor, cursor + value_size); - String8 value_data = str8_substr(raw_data, value_range); - cursor += value_size; + off += str8_deserial_read_uleb128(data, off, &value_size); + Rng1U64 value_range = rng_1u64(off, off + value_size); + String8 value_data = str8_substr(data, value_range); + off += value_size; String8List value_strings = numeric_str8_list_from_data(scratch.arena, 16, value_data, 1); - op_value = str8_list_join(scratch.arena, &value_strings, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(", "), .post = str8_lit(" }")}); - } break; + operand_string = str8_list_join(scratch.arena, &value_strings, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(", "), .post = str8_lit(" }")}); + }break; - case DW_ExprOp_Piece: { + case DW_ExprOp_Piece: + { U64 size = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &size); - op_value = push_str8f(scratch.arena, "%u", size); - } break; + off += str8_deserial_read_uleb128(data, off, &size); + operand_string = str8f(scratch.arena, "%u", size); + }break; - case DW_ExprOp_BitPiece: { + case DW_ExprOp_BitPiece: + { U64 bit_size = 0, bit_off = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &bit_size); - cursor += str8_deserial_read_uleb128(raw_data, cursor, &bit_off); - op_value = push_str8f(scratch.arena, "bit size %I64u, bit offset %I64u", bit_size, bit_off); - } break; + off += str8_deserial_read_uleb128(data, off, &bit_size); + off += str8_deserial_read_uleb128(data, off, &bit_off); + operand_string = str8f(scratch.arena, "bit size %I64u, bit offset %I64u", bit_size, bit_off); + }break; - case DW_ExprOp_Pick: { + case DW_ExprOp_Pick: + { U8 stack_idx = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &stack_idx); - op_value = push_str8f(scratch.arena, "stack index %u", stack_idx); - } break; + off += str8_deserial_read_struct(data, off, &stack_idx); + operand_string = str8f(scratch.arena, "stack index %u", stack_idx); + }break; - case DW_ExprOp_PlusUConst: { + case DW_ExprOp_PlusUConst: + { U64 addend = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &addend); - op_value = push_str8f(arena, "addend %I64u", addend); - } break; + off += str8_deserial_read_uleb128(data, off, &addend); + operand_string = str8f(arena, "addend %I64u", addend); + }break; - case DW_ExprOp_Skip: { + case DW_ExprOp_Skip: + { S16 x = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &x); - op_value = push_str8f(scratch.arena, "%+d bytes", x); - } break; + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(scratch.arena, "%+d bytes", x); + }break; - case DW_ExprOp_Bra: { + case DW_ExprOp_Bra: + { S16 x = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &x); - op_value = push_str8f(scratch.arena, "%+d", x); - } break; + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(scratch.arena, "%+d", x); + }break; case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: @@ -382,1839 +175,544 @@ dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + { U64 reg_idx = op - DW_ExprOp_BReg0; S64 reg_off = 0; - cursor += str8_deserial_read_sleb128(raw_data, cursor, ®_off); - op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, reg_off); - } break; + off += str8_deserial_read_sleb128(data, off, ®_off); + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = str8f(scratch.arena, "%S+%I64d", arch_info->reg_code_name_table[regcode], reg_off); + }break; - case DW_ExprOp_FBReg: { + case DW_ExprOp_FBReg: + { S64 reg_off = 0; - cursor += str8_deserial_read_sleb128(raw_data, cursor, ®_off); - op_value = push_str8f(scratch.arena, "offset %I64d", reg_off); - } break; + off += str8_deserial_read_sleb128(data, off, ®_off); + operand_string = str8f(scratch.arena, "frame base offset %I64d", reg_off); + }break; - case DW_ExprOp_BRegX: { + case DW_ExprOp_BRegX: + { U64 reg_idx = 0; S64 reg_off = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, ®_idx); - cursor += str8_deserial_read_sleb128(raw_data, cursor, ®_off); - op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, reg_off); - } break; + off += str8_deserial_read_uleb128(data, off, ®_idx); + off += str8_deserial_read_sleb128(data, off, ®_off); + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = str8f(scratch.arena, "%S+%I64d", arch_info->reg_code_name_table[regcode], reg_off); + }break; case DW_ExprOp_XDerefSize: - case DW_ExprOp_DerefSize: { + case DW_ExprOp_DerefSize: + { U8 x = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &x); - op_value = push_str8f(scratch.arena, "%u", x); - } break; + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(scratch.arena, "%u", x); + }break; - case DW_ExprOp_Call2: { + case DW_ExprOp_Call2: + { U16 x = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &x); - op_value = push_str8f(scratch.arena, "%u", x); - } break; - case DW_ExprOp_Call4: { + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(scratch.arena, "%u", x); + }break; + case DW_ExprOp_Call4: + { U32 x = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &x); - op_value = push_str8f(arena, "%u", x); - } break; - case DW_ExprOp_CallRef: { + off += str8_deserial_read_struct(data, off, &x); + operand_string = str8f(arena, "%u", x); + }break; + case DW_ExprOp_CallRef: + { U64 x = 0; - cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &x); - op_value = push_str8f(scratch.arena, "%I64u", x); - } break; + off += dw2_read_fmt_u64(data, off, ctx->format, &x); + operand_string = str8f(scratch.arena, "%I64u", x); + }break; case DW_ExprOp_ImplicitPointer: - case DW_ExprOp_GNU_ImplicitPointer: { + case DW_GNU_ExprOp_ImplicitPointer: + { U64 info_off = 0; - cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &info_off); + off += dw2_read_fmt_u64(data, off, ctx->format, &info_off); S64 ptr = 0; - cursor += str8_deserial_read_sleb128(raw_data, cursor, &ptr); - - op_value = push_str8f(scratch.arena, ".debug_info+%#I64x, ptr %I64x", info_off, ptr); + off += str8_deserial_read_sleb128(data, off, &ptr); + operand_string = str8f(scratch.arena, ".debug_info@0x%I64x, ptr %I64x", info_off, ptr); } break; case DW_ExprOp_Convert: - case DW_ExprOp_GNU_Convert: { + case DW_GNU_ExprOp_Convert: + { U64 type_cu_off = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); - op_value = push_str8f(scratch.arena, "TypeCuOff %#I64x", cu_base + type_cu_off); - } break; - case DW_ExprOp_GNU_ParameterRef: { + off += str8_deserial_read_uleb128(data, off, &type_cu_off); + operand_string = str8f(scratch.arena, "TypeCuOff %#I64x", ctx->unit_base_info_off + type_cu_off); + }break; + case DW_GNU_ExprOp_ParameterRef: + { // TODO: always 4 bytes? U32 cu_off = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &cu_off); - op_value = push_str8f(scratch.arena, "CuOff %#x", cu_base + cu_off); - } break; + off += str8_deserial_read_struct(data, off, &cu_off); + operand_string = str8f(scratch.arena, "CuOff %#x", ctx->unit_base_info_off + cu_off); + }break; case DW_ExprOp_DerefType: - case DW_ExprOp_GNU_DerefType: { - U8 deref_size = 0; + case DW_GNU_ExprOp_DerefType: + { + U8 deref_size = 0; U64 type_cu_off = 0; - cursor += str8_deserial_read_struct(raw_data, cursor, &deref_size); - cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); - op_value = push_str8f(scratch.arena, "%#x, TypeCuOff %#I64x", deref_size, cu_base + type_cu_off); - } break; + off += str8_deserial_read_struct(data, off, &deref_size); + off += str8_deserial_read_uleb128(data, off, &type_cu_off); + operand_string = str8f(scratch.arena, "%#x, TypeCuOff %#I64x", deref_size, ctx->unit_base_info_off + type_cu_off); + }break; case DW_ExprOp_ConstType: - case DW_ExprOp_GNU_ConstType: { - U64 type_cu_off = 0; - U8 const_value_size = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); - cursor += str8_deserial_read_struct(raw_data, cursor, &const_value_size); - Rng1U64 const_value_range = rng_1u64(cursor, cursor + const_value_size); - String8 const_value_data = str8_substr(raw_data, const_value_range); + case DW_GNU_ExprOp_ConstType: + { + U64 type_cu_off = 0; + U8 const_value_size = 0; + off += str8_deserial_read_uleb128(data, off, &type_cu_off); + off += str8_deserial_read_struct(data, off, &const_value_size); + Rng1U64 const_value_range = rng_1u64(off, off + const_value_size); + String8 const_value_data = str8_substr(data, const_value_range); String8List const_value_strings = numeric_str8_list_from_data(scratch.arena, 16, const_value_data, 1); String8 const_value_str = str8_list_join(scratch.arena, &const_value_strings, &(StringJoin){.sep = str8_lit(", ")}); - op_value = push_str8f(scratch.arena, "TypeCuOff %#I64x, Const Value { %S }", cu_base + type_cu_off, const_value_str); - cursor += const_value_size; - } break; + operand_string = str8f(scratch.arena, "TypeCuOff %#I64x, Const Value { %S }", ctx->unit_base_info_off + type_cu_off, const_value_str); + off += const_value_size; + }break; case DW_ExprOp_RegvalType: - case DW_ExprOp_GNU_RegvalType: { + case DW_GNU_ExprOp_RegvalType: + { U64 reg_idx = 0, type_cu_off = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, ®_idx); - cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off); - op_value = push_str8f(scratch.arena, "%S, TypeCuOff %#I64x", dw_string_from_register(scratch.arena, arch, reg_idx), cu_base + type_cu_off); - } break; + off += str8_deserial_read_uleb128(data, off, ®_idx); + off += str8_deserial_read_uleb128(data, off, &type_cu_off); + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); + operand_string = str8f(scratch.arena, "%S, TypeCuOff %#I64x", arch_info->reg_code_name_table[regcode], ctx->unit_base_info_off + type_cu_off); + }break; case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: { + case DW_GNU_ExprOp_EntryValue: + { U64 block_size = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &block_size); - Rng1U64 block_range = rng_1u64(cursor, cursor + block_size); - String8 block_data = str8_substr(raw_data, block_range); - String8List block_expr = dw_string_list_from_expression(scratch.arena, block_data, cu_base, addr_size, arch, ver, ext, format); - op_value = str8_list_join(scratch.arena, &block_expr, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(","), .post = str8_lit(" }")}); - cursor += block_size; + off += str8_deserial_read_uleb128(data, off, &block_size); + Rng1U64 block_range = rng_1u64(off, off + block_size); + String8 block_data = str8_substr(data, block_range); + // TODO(rjf): WTF, recursive? let's not... - if we want this, let's just do the stack inside of this function + // String8List block_expr = dw_string_list_from_expression(scratch.arena, block_data, cu_base, addr_size, arch, ver, ext, format); + // operand_string = str8_list_join(scratch.arena, &block_expr, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(","), .post = str8_lit(" }")}); + operand_string = s("{...}"); + off += block_size; } break; - case DW_ExprOp_Addrx: { + case DW_ExprOp_Addrx: + { U64 addr = 0; - cursor += str8_deserial_read_uleb128(raw_data, cursor, &addr); - op_value = push_str8f(scratch.arena, "%#I64x", addr); - } break; - - case DW_ExprOp_CallFrameCfa: - case DW_ExprOp_FormTlsAddress: - case DW_ExprOp_PushObjectAddress: - case DW_ExprOp_Nop: - case DW_ExprOp_Eq: - case DW_ExprOp_Ge: - case DW_ExprOp_Gt: - case DW_ExprOp_Le: - case DW_ExprOp_Lt: - case DW_ExprOp_Ne: - case DW_ExprOp_Shl: - case DW_ExprOp_Shr: - case DW_ExprOp_Shra: - case DW_ExprOp_Xor: - case DW_ExprOp_XDeref: - case DW_ExprOp_Abs: - case DW_ExprOp_And: - case DW_ExprOp_Div: - case DW_ExprOp_Minus: - case DW_ExprOp_Mod: - case DW_ExprOp_Mul: - case DW_ExprOp_Neg: - case DW_ExprOp_Not: - case DW_ExprOp_Or: - case DW_ExprOp_Plus: - case DW_ExprOp_Rot: - case DW_ExprOp_Swap: - case DW_ExprOp_Deref: - case DW_ExprOp_Dup: - case DW_ExprOp_Drop: - case DW_ExprOp_Over: - case DW_ExprOp_StackValue: { - // no operands - } break; + off += str8_deserial_read_uleb128(data, off, &addr); + operand_string = str8f(scratch.arena, "%#I64x", addr); + }break; } - String8 opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, op); - if (op_value.size == 0) { - str8_list_pushf(arena, &result, "DW_OP_%S", opcode_str); - } else { - str8_list_pushf(arena, &result, "DW_OP_%S = %S", opcode_str, op_value); + // rjf: push opcode info + String8 opcode_string = dw_string_from_expr_op(ctx->version, ctx->exts, op); + if(operand_string.size == 0) + { + str8_list_pushf(arena, &result, "%S", opcode_string); + } + else + { + str8_list_pushf(arena, &result, "%S(%S)", opcode_string, operand_string); } } scratch_end(scratch); return result; } -internal String8 -dw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off) -{ - Temp scratch = scratch_begin(&arena, 1); - String8 reg_str = dw_string_from_register(scratch.arena, arch, reg_idx); - String8 result; - if (reg_off != 0) { - result = push_str8f(arena, "%S%+I64d", reg_str, reg_off); - } else { - result = reg_str; - } - scratch_end(scratch); - return result; -} - -internal String8 -dw_string_from_expression(Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = dw_string_list_from_expression(scratch.arena, expr, cu_base, addr_size, arch, ver, ext, format); - String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")}); - return result; -} - -internal String8 -dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa) -{ - String8 cfa_str = str8_lit("???"); - switch (cfa.rule) { - case DW_CFA_Rule_Null: {} break; - case DW_CFA_Rule_RegOff: { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break; - case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break; - default: { InvalidPath; } break; - } - return cfa_str; -} - -internal String8 -dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List cfi_regs_list = {0}; - U64 reg_count = dw_reg_count_from_arch(arch); - for EachIndex(reg_idx, reg_count) { - DW_CFI_Register *cfi_reg = &row->regs[reg_idx]; - String8 rule_str = str8_lit("???"); - switch (cfi_reg->rule) { - case DW_CFI_RegisterRule_Undefined: { - rule_str = str8f(scratch.arena, "Undefined(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_SameValue: { - rule_str = str8_zero(); - } break; - case DW_CFI_RegisterRule_Offset: { - rule_str = str8f(scratch.arena, "[CFA%+I64d]", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_ValOffset: { - rule_str = str8f(scratch.arena, "Val(CFA%+I64d)", cfi_reg->n); - } break; - case DW_CFI_RegisterRule_Register: { - rule_str = str8f(scratch.arena, "Register(%S)", dw_string_from_register(scratch.arena, arch, cfi_reg->n)); - } break; - case DW_CFI_RegisterRule_Expression: { - rule_str = str8f(scratch.arena, "Expression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); - } break; - case DW_CFI_RegisterRule_ValExpression: { - rule_str = str8f(scratch.arena, "ValExpression(%S)", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format)); - } break; - case DW_CFI_RegisterRule_Architectural: { - rule_str = str8_lit("???"); - } break; - default: { InvalidPath; } break; - } - - if (rule_str.size) { - str8_list_pushf(scratch.arena, &cfi_regs_list, "%S: %S", dw_string_from_register(scratch.arena, arch, reg_idx), rule_str); - } - } - - String8 string = str8_list_join(arena, &cfi_regs_list, &(StringJoin){.sep=str8_lit(", ")}); - - scratch_end(scratch); - return string; -} - -internal String8 -dw_single_line_string_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format) -{ - Temp scratch = scratch_begin(&arena, 1); - String8List list = dw_string_list_from_expression(scratch.arena, raw_data, cu_base, address_size, arch, ver, ext, format); - String8 expression = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(", ")}); - scratch_end(scratch); - return expression; -} - -internal String8 -dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) -{ - Temp scratch = scratch_begin(&arena, 1); - - String8List attrib_fmt = {0}; - - // rjf: log attrib's value based on vlass - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - switch(value_class) - { - default: {str8_list_pushf(scratch.arena, &attrib_fmt, "`unknown value class`");}break; - case DW_AttribClass_Undefined: {str8_list_pushf(scratch.arena, &attrib_fmt, "`undefined value class`");}break; - case DW_AttribClass_Address: {str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", dw_address_from_attrib(input, cu, attrib));}break; - case DW_AttribClass_Const: {str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", dw_const_u64_from_attrib(input, cu, attrib));}break; - case DW_AttribClass_Block: - { - String8 block = dw_block_from_attrib(input, cu, attrib); - String8List block_strs = numeric_str8_list_from_data(scratch.arena, 16, block, 1); - String8 block_str = str8_list_join(scratch.arena, &block_strs, &(StringJoin){.sep = str8_lit(", ")}); - str8_list_pushf(scratch.arena, &attrib_fmt, "{ %S }", block_str); - }break; - case DW_AttribClass_ExprLoc: - { - String8 exprloc = dw_exprloc_from_attrib(input, cu, attrib); - String8 exprloc_str = dw_single_line_string_from_expression(scratch.arena, exprloc, cu->info_range.min, cu->address_size, arch, cu->version, cu->ext, cu->format); - str8_list_pushf(scratch.arena, &attrib_fmt, "{ %S }", exprloc_str); - }break; - case DW_AttribClass_Flag: - { - B32 flag = dw_flag_from_attrib(input, cu, attrib); - str8_list_pushf(scratch.arena, &attrib_fmt, "%I64u (%s)", flag, flag == 0 ? "false" : "true"); - }break; - case DW_AttribClass_LinePtr: - case DW_AttribClass_LocListPtr: - case DW_AttribClass_MacPtr: - case DW_AttribClass_RngListPtr: - case DW_AttribClass_RngList: - case DW_AttribClass_StrOffsetsPtr: - case DW_AttribClass_AddrPtr: - { - if(attrib->form.kind == DW_Form_SecOffset) - { - str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", attrib->form.sec_offset); - } - else - { - str8_list_pushf(scratch.arena, &attrib_fmt, "`unexpected form kind %S`", dw_string_from_form_kind(scratch.arena, cu->version, attrib->form.kind)); - } - }break; - case DW_AttribClass_Reference: - { - if(attrib->form.kind == DW_Form_Ref1 || - attrib->form.kind == DW_Form_Ref2 || - attrib->form.kind == DW_Form_Ref4 || - attrib->form.kind == DW_Form_Ref8 || - attrib->form.kind == DW_Form_RefUData) - { - U64 info_off = cu->info_range.min + attrib->form.ref; - str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", info_off); - if(!contains_1u64(cu->info_range, info_off)) - { - str8_list_pushf(scratch.arena, &attrib_fmt, ": `(out of this cu's bounds)`"); - } - } - else - { - str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x", attrib->form.ref); - } - }break; - case DW_AttribClass_String: - { - if(attrib->form.kind == DW_Form_Strp || attrib->form.kind == DW_Form_LineStrp || attrib->form.kind == DW_Form_StrpSup) - { - str8_list_pushf(scratch.arena, &attrib_fmt, "0x%I64x ", attrib->form.sec_offset); - } - String8 string = dw_string_from_attrib(input, cu, attrib); - str8_list_pushf(scratch.arena, &attrib_fmt, "\"%S\"", string); - }break; - } - - // rjf: extend attrib's value with enum info - { - String8 enum_info = {0}; - switch(attrib->attrib_kind) - { - case DW_AttribKind_Language: - { - DW_Language lang = dw_const_u64_from_attrib(input, cu, attrib); - enum_info = dw_string_from_language(scratch.arena, lang); - }break; - case DW_AttribKind_DeclFile: - { - U64 file_idx = dw_const_u64_from_attrib(input, cu, attrib); - DW_LineFile *file = dw_file_from_attrib(cu, line_vm, attrib); - if(file != 0) - { - enum_info = dw_path_from_file(scratch.arena, line_vm->header.dir_table, file); - } - }break; - case DW_AttribKind_DeclLine: - { - enum_info = str8f(scratch.arena, "%I64u", dw_const_u64_from_attrib(input, cu, attrib)); - }break; - case DW_AttribKind_Inline: - { - DW_InlKind inl = dw_const_u64_from_attrib(input, cu, attrib); - enum_info = dw_string_from_inl(scratch.arena, inl); - }break; - case DW_AttribKind_Accessibility: - { - DW_AccessKind access = dw_const_u64_from_attrib(input, cu, attrib); - enum_info = dw_string_from_access_kind(scratch.arena, access); - }break; - case DW_AttribKind_CallingConvention: - { - DW_CallingConventionKind calling_convetion = dw_const_u64_from_attrib(input, cu, attrib); - enum_info = dw_string_from_calling_convetion(scratch.arena, calling_convetion); - }break; - case DW_AttribKind_Encoding: - { - DW_ATE encoding = dw_const_u64_from_attrib(input, cu, attrib); - enum_info = dw_string_from_attrib_type_encoding(scratch.arena, encoding); - }break; - case DW_AttribKind_Visibility: - { - DW_Vis vis = dw_const_u64_from_attrib(input, cu, attrib); - enum_info = dw_string_from_attrib_visibility(scratch.arena, vis); - }break; - } - - if(enum_info.size) - { - str8_list_pushf(scratch.arena, &attrib_fmt, " `%S`", enum_info); - } - } - - String8 result = str8_list_join(arena, &attrib_fmt, 0); - - scratch_end(scratch); - return result; -} - -internal -DW_PRINTER(dw_print_abbrev) -{ - DW_Raw *input = dumper->input; - - Temp scratch = scratch_begin(&arena, 1); - DW_Section abbrev = input->sec[DW_Section_Abbrev]; - S64 depth = 0; - U64 idx = 0; - for(U64 cursor = 0; cursor < abbrev.data.size; idx += 1) - { - // rjf: read id & advance - U64 id_off = cursor; - U64 id = 0; - cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &id); - if(id == 0) { continue; } - - // rjf: unpack abbrev - U64 tag = 0; - U8 has_children = 0; - cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &tag); - cursor += str8_deserial_read_struct(abbrev.data, cursor, &has_children); - - // rjf: log abbrev - Temp temp = temp_begin(scratch.arena); - dw_printf("abbrev: // abbrev[%I64u] abbrev_off: 0x%I64x \n {\n", idx, id_off); - dw_indent(); - dw_printf("id: %I64u tag_kind: %S has_children: %s\n", id, dw_string_from_tag_kind(temp.arena, tag), has_children ? "true" : "false"); - U64 attrib_kind_max_size = 0; - U64 form_kind_max_size = 0; - { - for(U64 off = cursor;;) - { - U64 attrib_id = 0, form_id = 0; - off += str8_deserial_read_uleb128(abbrev.data, off, &attrib_id); - off += str8_deserial_read_uleb128(abbrev.data, off, &form_id); - if(attrib_id == 0) { break; } - String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); - String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); - attrib_kind_max_size = Max(attrib_kind_max_size, attrib_str.size); - form_kind_max_size = Max(form_kind_max_size, form_str.size); - } - } - for(;;) - { - U64 attrib_off = cursor; - U64 attrib_id = 0, form_id = 0; - cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &attrib_id); - cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &form_id); - if(attrib_id == 0) { break; } - String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id); - String8 form_str = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id); - - String8List fmt = {0}; - str8_list_pushf(temp.arena, &fmt, "%S%.*s", attrib_str, attrib_kind_max_size - attrib_str.size, g_spaces); - str8_list_pushf(temp.arena, &fmt, "%S%.*s", form_str, form_kind_max_size - form_str.size, g_spaces); - String8 value = str8_list_join(temp.arena, &fmt, &(StringJoin){.sep=str8_lit(" ")}); - dw_printf("attrib: { %S } // 0x%I64x\n", value, attrib_off); - } - dw_unindent(); - dw_printf("}\n"); - temp_end(temp); - } - scratch_end(scratch); -} - -internal void -dw_print_tag(Arena *arena, String8List *strings, int indent, Arch arch, DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_TagNode *root) -{ - Temp scratch = scratch_begin(0, 0); - - for (DW_TagNode *n = root; n != 0; n = n->sibling) { - DW_Tag *tag = &n->tag; - - // compute columns' max widths - U64 attrib_name_max_size = 0, form_kind_max_size = 0, value_max_size = 0; - for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) - { - Temp attrib_temp = temp_begin(scratch.arena); - attrib_name_max_size = Max(attrib_name_max_size, dw_string_from_attrib_kind (attrib_temp.arena, cu->version, cu->ext, attrib_n->v.attrib_kind).size); - form_kind_max_size = Max(form_kind_max_size, dw_string_from_form_kind (attrib_temp.arena, cu->version, attrib_n->v.form.kind).size); - value_max_size = Max(value_max_size, dw_string_from_attrib_value(attrib_temp.arena, input, arch, cu, line_vm, &attrib_n->v).size); - temp_end(attrib_temp); - } - attrib_name_max_size = Min(40, attrib_name_max_size); - form_kind_max_size = Min(20, form_kind_max_size); - value_max_size = Min(80, value_max_size); - - dw_printf("tag: // info_off: 0x%I64x abbrev_id: %I64u\n", tag->info_off, tag->abbrev_id); - dw_printf("{\n"); - dw_indent(); - dw_printf("kind: %S\n", dw_string_from_tag_kind(scratch.arena, tag->kind)); - for EachNode(attrib_n, DW_AttribNode, tag->attribs.first) { - DW_Attrib *attrib = &attrib_n->v; - - String8 attrib_kind_str = dw_string_from_attrib_kind(scratch.arena, cu->version, cu->ext, attrib->attrib_kind); - String8 form_kind_str = dw_string_from_form_kind(scratch.arena, cu->version, attrib->form.kind); - String8 value_str = dw_string_from_attrib_value(scratch.arena, input, arch, cu, line_vm, attrib); - - String8List fmt = {0}; - str8_list_pushf(scratch.arena, &fmt, "%S%.*s", attrib_kind_str, attrib_kind_str.size <= attrib_name_max_size ? attrib_name_max_size - attrib_kind_str.size : 0, g_spaces); - str8_list_pushf(scratch.arena, &fmt, "%S%.*s", form_kind_str, form_kind_str.size <= form_kind_max_size ? form_kind_max_size - form_kind_str.size : 0, g_spaces); - str8_list_pushf(scratch.arena, &fmt, "%S%.*s", value_str, value_str.size <= value_max_size ? value_max_size - value_str.size : 0, g_spaces); - String8 attrib_str = str8_list_join(scratch.arena, &fmt, &(StringJoin){.sep = str8_lit(" ")}); - - dw_printf("attrib: { %S } // info_off: 0x%I64x\n", attrib_str, attrib->info_off); - } - - if (tag->has_children) { - dw_print_tag(arena, strings, indent, arch, input, cu, line_vm, n->first_child); - } - - dw_unindent(); - dw_printf("}\n"); - } - - scratch_end(scratch); -} - -internal -DW_PRINTER(dw_print_info) -{ - DW_Raw *input = dumper->input; - Arch arch = dumper->arch; - HashTable *line_vm_map = dw_get_line_vm_map(dumper); - Rng1U64Array cu_ranges = dw_get_info_ranges(dumper); - DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); - DW_TagTree *tag_trees = dw_get_tag_trees(dumper); - - Temp scratch = scratch_begin(&arena, 1); - for EachIndex(cu_idx, cu_ranges.count) { - Rng1U64 cu_range = cu_ranges.v[cu_idx]; - DW_CompUnit *cu = &cu_arr[cu_idx]; - String8 cu_dir = dw_string_from_tag_attrib_kind (input, cu, cu->tag, DW_AttribKind_CompDir ); - String8 cu_name = dw_string_from_tag_attrib_kind (input, cu, cu->tag, DW_AttribKind_Name ); - String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); - - DW_LineVM *line_vm = 0; - if (stmt_list.str) { - line_vm = hash_table_search_raw_raw(line_vm_map, stmt_list.str); - if (line_vm == 0) { - line_vm = dw_line_vm_init(input, cu); - // decode line table to find all the defined files, in version 5 this behaviour was deprecated - if (cu->version < DW_Version_5) { - while (dw_line_vm_step(line_vm)); - } - hash_table_push_raw_raw(scratch.arena, line_vm_map, stmt_list.str, line_vm); - } - } - - dw_printf("cu: // compile_unit[%I64u] @ %r (%M)\n", cu_idx, cu_range, dim_1u64(cu->info_range)); - dw_printf("{\n"); - dw_indent(); - dw_printf("format: %S\n", dw_string_from_format(cu->format)); - dw_printf("version: %u\n", cu->version); - dw_printf("kind: %S\n", dw_string_from_comp_unit_kind(scratch.arena, cu->kind)); - dw_printf("address_size: %I64u\n", cu->address_size); - dw_printf("abbrev_off: 0x%I64x\n", cu->abbrev_off); - dw_print_tag(arena, strings, indent, arch, input, cu, line_vm, tag_trees[cu_idx].root); - dw_unindent(); - dw_printf("} // compile_unit[/%u]\n", cu_idx); - } -} - -DW_PRINTER(dw_print_line) -{ - DW_Raw *input = dumper->input; - B32 is_verbose = dumper->is_verbose; - DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); - Temp scratch = scratch_begin(&arena, 1); - Rng1U64Array unit_ranges = dw_unit_ranges_from_data_arr(scratch.arena, input->sec[DW_Section_Line].data); - for EachIndex(unit_idx, unit_ranges.count) - { - Temp unit_temp = temp_begin(scratch.arena); - - DW_CompUnit *cu = &cu_arr[unit_idx]; - DW_LineVM *vm = dw_line_vm_init(input, cu); - - // rjf: begin logging line table - dw_printf("line_table: // line_table[%I64u]\n", unit_idx); - dw_printf("{\n"); - dw_indent(); - { - // rjf: log line table header - dw_printf("header:\n"); - dw_printf("{\n"); - dw_indent(); - { - String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(vm->header.opcode_lens, vm->header.num_opcode_lens), 1); - String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(", ")}); - dw_printf("version: %u\n", vm->header.version ); - dw_printf("line_table_size: %I64u\n", vm->header.unit_length ); - dw_printf("address_size: %u\n", vm->header.address_size ); - dw_printf("segment_selector_size: %u\n", vm->header.segment_selector_size); - dw_printf("header_length: %I64u\n", vm->header.header_length ); - dw_printf("min_instruction_length: %u\n", vm->header.min_inst_len ); - dw_printf("max_ops_for_instruction: %u\n", vm->header.max_ops_for_inst ); - dw_printf("default_is_stmt: %u\n", vm->header.default_is_stmt ); - dw_printf("line_base: %d\n", vm->header.line_base ); - dw_printf("line_range: %u\n", vm->header.line_range ); - dw_printf("opcode_base: %u\n", vm->header.opcode_base ); - dw_printf("opcode_lengths: { %S }\n", opcode_lengths_string ); - } - dw_unindent(); - dw_printf("}\n"); - - // rjf: log directory table - dw_printf("directory_table:\n"); - dw_printf("{\n"); - dw_indent(); - { - dw_printf("// %-4s %-30s\n", "No.", "Name"); - dw_printf("// ---- ------------------------------\n"); - for EachIndex(dir_idx, vm->header.dir_table.count) - { - dw_printf("{ %-4I64u %-30S }\n", dir_idx, vm->header.dir_table.v[dir_idx]); - } - } - dw_unindent(); - dw_printf("}\n"); - - // rjf: log file table - dw_printf("file_table:\n"); - dw_printf("{\n"); - dw_indent(); - { - dw_printf("// %-4s %-8s %-8s %-33s %-8s %-20s\n", "No.", "Dir No.", "Time", "MD5", "Size", "Path"); - dw_printf("// ---- -------- -------- --------------------------------- -------- --------------------\n"); - for EachIndex(file_idx, vm->header.file_table.count) - { - DW_LineFile *file = &vm->header.file_table.v[file_idx]; - dw_printf("{ %-4I64u %-8I64u %-8I64u %016I64x-%016I64x %-8I64u %-20S }\n", - file_idx, - file->dir_idx, - file->time_stamp, - file->md5.u64[1], - file->md5.u64[0], - file->size, - file->path); - } - } - dw_unindent(); - dw_printf("}\n"); - - // rjf: log opcodes - dw_printf("line_table:\n"); - dw_printf("{\n"); - dw_indent(); - { - dw_printf("//\n"); - dw_printf("// %-16s %-8s %-4s %-5s %-3s %-7s %-16s\n", "Address", "Line", "Col", "File", "ISA", "Discrim", "Flags"); - dw_printf("// ---------------- -------- ---- ----- --- ------- ----------------\n"); - - for(;;) - { - U64 global_opcode_off = unit_ranges.v[unit_idx].min + vm->cursor; - - if( ! dw_line_vm_step(vm)) { break; } - - Temp opcode_temp = temp_begin(unit_temp.arena); - String8List opcode_fmt = {0}; - - // opcode offset - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%08I64x:", global_opcode_off); - - // push opcode id - if (vm->opcode != 0) { - String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, vm->opcode); - str8_list_pushf(arena, &opcode_fmt, "%-11S:", opcode_str); - } - - // print operands - switch(vm->opcode) - { - default: - { - if(vm->opcode >= vm->header.opcode_base) - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance line by %I64d, advance address by %I64d", vm->line_advance, vm->addr_advance); - } - else - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "skipping %I64x unknown opcodes", vm->header.opcode_lens[vm->opcode - 1]); - } - }break; - case DW_StdOpcode_Copy: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "Line = %I64u, Column = %I64u, Address = %#I64x", vm->state.line, vm->state.column, vm->state.address); - }break; - case DW_StdOpcode_AdvancePc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %#I64x ; current address %#I64x", vm->operands[0].u64, vm->state.address); - }break; - case DW_StdOpcode_AdvanceLine: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "advance %I64d ; current line %I64u", vm->operands[0].s64, vm->state.line); - }break; - case DW_StdOpcode_SetFile: - { - DW_LineFile *file = dw_line_vm_find_file(vm, vm->state.file_index); - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u \"%S\"", vm->state.file_index, dw_path_from_file(opcode_temp.arena, vm->header.dir_table, file)); - }break; - case DW_StdOpcode_SetColumn: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.column); - }break; - case DW_StdOpcode_NegateStmt: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "is_stmt = %u", vm->state.is_stmt); - }break; - case DW_StdOpcode_SetBasicBlock: - { - }break; - case DW_StdOpcode_ConstAddPc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64d ; address %#I64x", vm->advance, vm->state.address); - }break; - case DW_StdOpcode_FixedAdvancePc: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->operands[0].u64); - }break; - case DW_StdOpcode_SetPrologueEnd: - { - }break; - case DW_StdOpcode_SetEpilogueBegin: - { - }break; - case DW_StdOpcode_SetIsa: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%I64u", vm->state.isa); - }break; - case DW_StdOpcode_ExtendedOpcode: - { - str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S*", dw_string_from_ext_opcode(opcode_temp.arena, vm->ext_opcode)); - //str8_list_pushf(opcode_temp.arena, &opcode_fmt, "length: %u", length); - switch(vm->ext_opcode) - { - case DW_ExtOpcode_EndSequence: {} break; - case DW_ExtOpcode_SetAddress: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%#I64x", vm->operands[0].u64); } break; - case DW_ExtOpcode_DefineFile: { str8_list_pushf(opcode_temp.arena, &opcode_fmt, "%S Dir: %I64u, Time: %I64u, Size: %I64u", - vm->operands[0].string, vm->operands[1].u64, vm->operands[2].u64, vm->operands[3].u64); } break; - case DW_ExtOpcode_SetDiscriminator: { str8_list_pushf(arena, &opcode_fmt, "%I64u", vm->state.discriminator); }break; - } - }break; - } - - if(is_verbose) - { - String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(" ")}); - dw_printf("// %S\n", string); - } - - if(vm->new_line) { - String8List l = {0}; - if(vm->state.is_stmt) - { - str8_list_pushf(opcode_temp.arena, &l, "is_stmt"); - } - if(vm->state.end_sequence) - { - str8_list_pushf(opcode_temp.arena, &l, "end_seq"); - } - String8 flags = str8_list_join(opcode_temp.arena, &l, &(StringJoin){.sep = str8_lit("|")}); - - dw_printf("{ %#016I64x %8I64u %4I64u %5I64u %3I64u %7I64u %-16S } %s\n", vm->state.address, vm->state.line, vm->state.column, vm->state.file_index, vm->state.isa, vm->state.discriminator, flags, vm->new_seq ? "// new seq" : ""); - } - - temp_end(opcode_temp); - } - - if(vm->error.size) - { - dw_printf("ERROR: Line VM failed stepping @ 0x%I64x\n", vm->cursor); - } - } - dw_unindent(); - dw_printf("}\n"); - - temp_end(unit_temp); - } - dw_unindent(); - dw_printf("}\n"); - } - scratch_end(scratch); -} - -DW_PRINTER(dw_print_strings) -{ - DW_Raw *input = dumper->input; - String8 data = input->sec[DW_Section_Str].data; - for (U64 cursor = 0, read_size = 0; cursor < data.size; cursor += read_size) { - String8 string = {0}; - read_size = str8_deserial_read_cstr(data, cursor, &string); - dw_printf(" { 0x%08I64x %I64u \"%S\" }\n", cursor, string.size, string); - } -} - -DW_PRINTER(dw_print_frame) -{ - DW_Raw *input = dumper->input; - Arch arch = dumper->arch; - Temp scratch = scratch_begin(&arena, 1); - HashTable *cie_ht = hash_table_init(scratch.arena, 0x2000); - String8 debug_frame = input->sec[DW_Section_Frame].data; - U64 addr_size = byte_size_from_arch(arch); - - // make offset -> CIE hash table - for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { - DW_DescriptorEntry desc = {0}; - desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); - if (desc.type == DW_DescriptorEntryKind_CIE) { - String8 raw_cie = str8_substr(debug_frame, desc.entry_range); - U64 restore_pos = arena_pos(scratch.arena); - DW_CIE *cie = push_array(scratch.arena, DW_CIE, 1); - if (dw_parse_cie(raw_cie, desc.format, arch, cie)) { - hash_table_push_u64_raw(scratch.arena, cie_ht, cursor, cie); - } else { - arena_pop_to(scratch.arena, restore_pos); - } - } - } - - for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) { - DW_DescriptorEntry desc = {0}; - desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc); - String8 raw_desc = str8_substr(debug_frame, desc.entry_range); - switch (desc.type) { - case DW_DescriptorEntryKind_Null: {} break; - case DW_DescriptorEntryKind_CIE: { - DW_CIE cie = {0}; - if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) { - String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts); - - dw_printf("CIE: // entry range: %r\n", desc.entry_range); - dw_printf("{\n"); - dw_printf(" Format: %S\n", dw_string_from_format(desc.format)); - dw_printf(" Version: %u\n", cie.version); - dw_printf(" Aug string: \"%S\"\n", cie.aug_string); - dw_printf(" Code align: %I64u\n", cie.code_align_factor); - dw_printf(" Data align: %I64d\n", cie.data_align_factor); - dw_printf(" Return addr reg: %u\n", cie.ret_addr_reg); - if (cie.version > DW_Version_3) { - dw_printf(" Address size: %u\n", cie.address_size); - dw_printf(" Segment selector size: %u\n", cie.segment_selector_size); - } - dw_printf(" Initial Insturction:\n"); - dw_printf(" {\n"); - for EachNode(n, String8Node, init_insts_str_list.first) { dw_printf(" %S\n", n->string); } - dw_printf(" }\n"); - dw_printf("}\n"); - } else { - dw_printf("ERROR: unable to parse CIE @ %I64x\n", desc.entry_range.min); - } - } break; - case DW_DescriptorEntryKind_FDE: { - DW_DescriptorEntry cie_desc = {0}; - U64 cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc); - String8 cie_data = str8_substr(debug_frame, cie_desc.entry_range); - DW_CIE cie = {0}; - dw_parse_cie(cie_data, cie_desc.format, arch, &cie); - - DW_FDE fde = {0}; - if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) { - DW_Version version = DW_Version_5; - DW_Ext ext = DW_Ext_All; - String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts); - dw_printf("FDE: // entry range: %r\n", desc.entry_range); - dw_printf("{\n"); - { - dw_printf(" Format: %S\n", dw_string_from_format(fde.format)); - dw_printf(" CIE pointer: 0x%I64x\n", fde.cie_pointer); - dw_printf(" PC range: %r\n", fde.pc_range); - dw_printf(" Instructions:\n"); - dw_printf(" {\n"); - for EachNode(n, String8Node, insts_str_list.first) { dw_printf(" %S\n", n->string); } - dw_printf(" }\n"); - } - dw_printf(" Unwind:\n"); - dw_printf(" {\n"); - DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie); - do { - String8 cfa_str = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa); - String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row); - dw_printf(" { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\n", cfi_unwind->pc, cfa_str, cfi_regs_str); - } while (dw_cfi_next_row(scratch.arena, cfi_unwind)); - dw_printf(" }\n"); - - dw_printf("}\n"); - } else { - dw_printf("ERROR: unable to parse FDE @ %I64x\n", desc.entry_range.min); - } - } break; - } - } -} - -#if 0 -internal -DW_PRINTER(dw_print_debug_loc) -{ - DW_Raw *input = dumper->input; - DW_TagTree *tag_trees = dw_get_tag_trees(dumper); - DW_Section info = input->sec[DW_Section_Info]; - DW_Section loc = input->sec[DW_Section_Loc]; - - if (loc.data.size == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - // TODO: warn about overlaps in ranges - - Rng1U64Array info_ranges = dw_get_info_ranges(dumper); - DW_CompUnit *cu_arr = dw_get_cu_arr(dumper); - - // parse debug_info for attributes with LOCLIST and store .debug_loc offsets - U64List *loc_lists = push_array(scratch.arena, U64List, info_ranges.count); - for EachIndex(cu_idx, info_ranges.count) { - DW_CompUnit *cu = &cu_arr[cu_idx]; - DW_TagTree *tag_tree = tag_trees[cu_idx]; - for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, tag_tree); - it->tag_node != 0; - d2r_tag_iterator_next(it)) { - DW_TagNode *tag_node = it->tag_node; - DW_Tag tag = tag_node->tag; - for EachNode(attrib_n, DW_AttribNode, tag.attribs.first) { - DW_Attrib *attrib = &attrib_n->v; - DW_AttribClass attrib_class = dw_attrib_class_from_attrib(cu->version, cu->ext, attrib->kind); - B32 is_sect_offset = attrib_class == DW_AttribClass_LocListPtr || (attrib_class == DW_AttribClass_LocList && attrib->form.kind == DW_Form_SecOffset); - B32 is_sect_index = attrib_class == DW_AttribClass_LocList && attrib->form.kind == DW_Form_LocListx; - if (is_sect_offset) { - U64 sec_offset = dw_interp_sec_offset(attrib->form.kind, attrib->form); - u64_list_push(scratch.arena, &loc_lists[cu_idx], attrib->value.v[0]); - } else if (is_sect_index) { - // TODO: support for section indexing - } - } - } - } - - void *base = dw_base_from_sec(input, DW_Section_Loc); - Rng1U64 range = dw_range_from_sec(input, DW_Section_Loc); - - dw_printf(".debug_loc"); - dw_indent(); - dw_printf("%-8s %-8s %-8s %s", "Offset", "Min", "Max", "Expression"); - for (U32 comp_idx = 0; comp_idx < cu_range_list.count; ++comp_idx) { - Temp locs_temp = temp_begin(scratch.arena); - - DW_Version ver = ver_arr[comp_idx]; - DW_Ext ext = ext_arr[comp_idx]; - - U64Array locs = u64_array_from_list(locs_temp.arena, &loc_lists[comp_idx]); - u64_array_sort(locs.count, locs.v); - - U64Array locs_set = remove_duplicates_u64_array(locs_temp.arena, locs); - U64 address_size = address_sizes[comp_idx]; - U64 base_selector = (address_size == 8) ? max_U64 : max_U32; - - for (U64 loc_idx = 0; loc_idx < locs_set.count; ++loc_idx) { - U64 base_address = address_bases[comp_idx]; - for (U64 cursor = locs_set.v[loc_idx]; cursor < dim_1u64(range); /* empty */) { - Temp range_temp = temp_begin(arena); - - String8List list = {0}; - - // offset - str8_list_pushf(range_temp.arena, &list, "%08I64x", cursor); - - // parse entry - U64 v0 = 0, v1 = 0; - cursor += dw_based_range_read(base, range, cursor, address_size, &v0); - cursor += dw_based_range_read(base, range, cursor, address_size, &v1); - - B32 is_list_end = v0 == 0 && v1 == 0; - if (is_list_end) { - str8_list_pushf(range_temp.arena, &list, ""); - } else if (v0 == base_selector) { - base_address = v1; - } else { - U16 expr_size = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &expr_size); - Rng1U64 expr_range = rng_1u64(range.min+cursor, range.min+cursor+expr_size); - cursor += expr_size; - - // format dwarf expression - B32 is_dwarf64 = (address_size == 8); - String8 raw_expr = str8((U8*)base+expr_range.min, dim_1u64(expr_range)); - String8 expression = dw_single_line_string_from_expression(range_temp.arena, raw_expr, cu_bases[comp_idx], address_size, arch, ver, ext, input->sec[DW_Section_Loc].mode); - - // push entry - U64 min = base_address + v0; - U64 max = base_address + v1; - str8_list_pushf(range_temp.arena, &list, "%08I64x %08I64x %S", min, max, expression); - } - - // print entry - String8 print = str8_list_join(range_temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - dw_printf("%S", print); - - // cleanup temp - temp_end(range_temp); - - // exit check - if (is_list_end) { - break; - } - } - } - - temp_end(locs_temp); - } - dw_unindent(); - - dw_unindent(); - scratch_end(scratch); -} -#endif - -#if 0 -internal void -dw_print_debug_ranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed) -{ - NotImplemented; -#if 0 - DW_Section ranges = input->sec[DW_Section_Ranges]; - void *base = dw_base_from_sec(input, DW_Section_Ranges); - Rng1U64 range = dw_range_from_sec(input, DW_Section_Ranges); - - if (dim_1u64(range) == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - Rng1U64List cu_range_list = dw_comp_unit_ranges_from_info(scratch.arena, sections->v[DW_Section_Info]); - - // parse debug_info for attributes with LOCLIST and store .debug_loc offsets - U64List *loc_lists = push_array(scratch.arena, U64List, cu_range_list.count); - U64 *address_sizes = push_array(scratch.arena, U64, cu_range_list.count); - U64 *address_bases = push_array(scratch.arena, U64, cu_range_list.count); - - { - U64 comp_idx = 0; - for (Rng1U64Node *cu_range_n = cu_range_list.first; cu_range_n != 0; cu_range_n = cu_range_n->next, ++comp_idx) { - Rng1U64 cu_range = cu_range_n->v; - DW_CompUnit cu = dw_comp_unit_from_info_offset(scratch.arena, sections, cu_range.min, relaxed); - - // store info about comp unit - address_sizes[comp_idx] = cu.address_size; - address_bases[comp_idx] = cu.base_addr; - - // parse tags - for (U64 info_off = cu.tags_range.min; info_off < cu.tags_range.max; /* empty */) { - DW_Tag tag = dw_tag_from_info_offset_cu(scratch.arena, sections, &cu, info_off); - - // parse attribs - for (DW_AttribNode *attrib_node = tag.attribs.first; attrib_node != 0; attrib_node = attrib_node->next) { - DW_Attrib *attrib = &attrib_node->v; - B32 is_sect_offset = attrib->value_class == DW_AttribClass_RngListPtr || (attrib->value_class == DW_AttribClass_RngList && attrib->form.kind == DW_Form_SecOffset); - B32 is_sect_index = attrib->value_class == DW_AttribClass_RngList && attrib->form.kind == DW_Form_RngListx; - if (is_sect_offset) { - u64_list_push(scratch.arena, &loc_lists[comp_idx], attrib->value.v[0]); - } else if (is_sect_index) { - // TODO: support for section indexing - } - } - - info_off = tag.next_info_off; - } - } - } - - dw_printf("# %S", sections->v[DW_Section_Ranges].name); - dw_indent(); - dw_printf("%-8s %-8s %-8s", "Offset", "Min", "Max"); - for (U32 comp_idx = 0; comp_idx < cu_range_list.count; ++comp_idx) { - U64Array locs = u64_array_from_list(scratch.arena, &loc_lists[comp_idx]); - u64_array_sort(locs.count, locs.v); - U64Array locs_set = remove_duplicates_u64_array(scratch.arena, locs); - U64 address_size = address_sizes[comp_idx]; - U64 base_selector = (address_size == 8) ? max_U64 : max_U32; - - for (U64 loc_idx = 0; loc_idx < locs_set.count; ++loc_idx) { - U64 base_address = address_bases[comp_idx]; - for (U64 cursor = locs_set.v[loc_idx]; cursor < dim_1u64(range); /* empty */) { - Temp range_temp = temp_begin(scratch.arena); - - String8List list = {0}; - - // offset - str8_list_pushf(range_temp.arena, &list, "%08I64x", cursor); - - // parse entry - U64 v0 = 0, v1 = 0; - cursor += dw_based_range_read(base, range, cursor, address_size, &v0); - cursor += dw_based_range_read(base, range, cursor, address_size, &v1); - - B32 is_list_end = v0 == 0 && v1 == 0; - if (is_list_end) { - str8_list_pushf(range_temp.arena, &list, ""); - } else if (v0 == base_selector) { - base_address = v1; - } else { - // push entry - U64 min = base_address + v0; - U64 max = base_address + v1; - str8_list_pushf(range_temp.arena, &list, "%08I64x %08I64x", min, max); - } - - // print entry - String8 print = str8_list_join(range_temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - dw_printf("%S", print); - - temp_end(range_temp); - - // exit check - if (is_list_end) { - break; - } - } - } - } -#endif -} - -internal void -dw_print_debug_aranges(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) -{ - NotImplemented; -#if 0 - void *base = dw_base_from_sec(sections, DW_Section_ARanges); - Rng1U64 range = dw_range_from_sec(sections, DW_Section_ARanges); - - if (dim_1u64(range) == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - dw_printf("# %S", sections->v[DW_Section_ARanges].name); - dw_indent(); - for (U64 cursor = 0; cursor < dim_1u64(range); ) { - U64 unit_length = 0; - DW_Version version = 0; - U64 debug_info_offset = 0; - U8 address_size = 0; - U8 segment_selector_size = 0; - - cursor += dw_based_range_read_length(base, range, cursor, &unit_length); - U64 unit_opl = cursor + unit_length; - cursor += dw_based_range_read_struct(base, range, cursor, &version); - - B32 is_dwarf64 = unit_length >= max_U32; - U64 int_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - cursor += dw_based_range_read(base, range, cursor, int_size, &debug_info_offset); - - cursor += dw_based_range_read_struct(base, range, cursor, &address_size); - cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size); - - U64 tuple_size = address_size * 2 + segment_selector_size; - U64 bytes_too_far_past_boundary = cursor % tuple_size; - if (bytes_too_far_past_boundary > 0) { - cursor += tuple_size - bytes_too_far_past_boundary; - } - - dw_printf("Unit length: %I64u", unit_length); - dw_printf("Version: %u", version); - dw_printf("Debug info offset: %#I64x", debug_info_offset); - dw_printf("Address size: %u", address_size); - dw_printf("Segment selector size: %u", segment_selector_size); - - if (version != DW_Version_2) { - rd_warningf("Version value must be 2 (DWARF5 sepc, Feb 13, 2017)"); - } - - dw_indent(); - dw_printf("%-8s %-8s", "Offset", "Range"); - for (; cursor < unit_opl; ) { - Temp temp = temp_begin(arena); - - String8List list = {0}; - - str8_list_pushf(temp.arena, &list, "%08I64x", cursor); - - U64 segment_selector = 0; - U64 address = 0; - U64 length = 0; - cursor += dw_based_range_read(base, range, cursor, segment_selector_size, &segment_selector); - cursor += dw_based_range_read(base, range, cursor, address_size, &address); - cursor += dw_based_range_read(base, range, cursor, address_size, &length); - - if (segment_selector == 0 && address == 0 && length == 0) { - str8_list_pushf(temp.arena, &list, ""); - } else { - if (segment_selector != 0) { - str8_list_pushf(temp.arena, &list, "%02I64u:", segment_selector); - } - str8_list_pushf(temp.arena, &list, "%I64x-%I64x", address, address+length); - } - - String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ") }); - dw_printf("%S", print); - - temp_end(temp); - } - dw_unindent(); - rd_newline(); - } - dw_unindent(); - - scratch_end(scratch); -#endif -} - -internal void -dw_print_debug_addr(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) -{ - NotImplemented; -#if 0 - void *base = dw_base_from_sec(sections, DW_Section_Addr); - Rng1U64 range = dw_range_from_sec(sections, DW_Section_Addr); - - if (dim_1u64(range) == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - dw_printf("# %S", sections->v[DW_Section_Addr].name); - dw_indent(); - for (U64 cursor = 0; cursor < dim_1u64(range); ) { - U64 unit_length = 0; - DW_Version version = 0; - U8 address_size = 0; - U8 segment_selector_size = 0; - - U64 unit_offset = cursor; - cursor += dw_based_range_read_length(base, range, cursor, &unit_length); - - U64 unit_opl = cursor + unit_length; - cursor += dw_based_range_read_struct(base, range, cursor, &version); - cursor += dw_based_range_read_struct(base, range, cursor, &address_size); - cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size); - - U64 tuple_size = address_size * 2 + segment_selector_size; - U64 bytes_too_far_past_boundary = cursor % tuple_size; - if (bytes_too_far_past_boundary > 0) { - cursor += tuple_size - bytes_too_far_past_boundary; - } - - dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); - dw_printf("Version: %u", version); - dw_printf("Address size: %u", address_size); - dw_printf("Segment selector size: %u", segment_selector_size); - - if (version != DW_Version_2) { - rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); - } - - dw_indent(); - dw_printf("%-8s %-8s", "Offset", "Address"); - for (; cursor < unit_opl; ) { - Temp temp = temp_begin(arena); - - String8List list = {0}; - - str8_list_pushf(temp.arena, &list, "%08X", cursor); - - U64 segment_selector = 0; - U64 address = 0; - cursor += dw_based_range_read(base, range, cursor, segment_selector_size, &segment_selector); - cursor += dw_based_range_read(base, range, cursor, address_size, &address); - - if (segment_selector == 0 && address == 0) { - str8_list_pushf(temp.arena, &list, ""); - } else { - if (segment_selector != 0) { - str8_list_pushf(temp.arena, &list, "%02u:", segment_selector); - } - str8_list_pushf(temp.arena, &list, "%I64x", address); - } - - String8 print = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - dw_printf("%S", print); - - temp_end(temp); - } - dw_unindent(); - rd_newline(); - } - dw_unindent(); - - scratch_end(scratch); -#endif -} - -internal U64 -dw_based_range_read_address(void *base, Rng1U64 range, U64 offset, Rng1U64Array segment_ranges, U8 segment_selector_size, U8 address_size, U64 *address_out) -{ - U64 read_offset = offset; - - // read segment - U64 segment_selector = 0; - read_offset += dw_based_range_read(base, range, read_offset, segment_selector_size, &segment_selector); - - // read address - U64 address = 0; - read_offset += dw_based_range_read(base, range, read_offset, address_size, &address); - - // apply segment offset - B32 is_address_segment_relative = segment_selector_size > 0; - if (is_address_segment_relative) { - if (segment_selector < segment_ranges.count) { - address += segment_ranges.v[segment_selector].min; - } else { - Assert(!"invalid segment selector"); - } - } - - U64 read_size = (read_offset - offset); - return read_size; -} - -internal void -dw_print_debug_loclists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Rng1U64Array segment_virtual_ranges, Arch arch) -{ - NotImplemented; -#if 0 - void *base = dw_base_from_sec(sections, DW_Section_LocLists); - Rng1U64 range = dw_range_from_sec(sections, DW_Section_LocLists); - - if (dim_1u64(range) == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - dw_printf("# %S", sections->v[DW_Section_LocLists].name); - dw_indent(); - for (U64 cursor = 0; cursor < dim_1u64(range); ) { - U64 unit_offset = cursor; - U64 unit_length = 0; - cursor += dw_based_range_read_length(base, range, cursor, &unit_length); - - U64 unit_opl = cursor + unit_length; - DW_Version version = 0; - U8 address_size = 0; - U8 segment_selector_size = 0; - U32 offset_entry_count = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &version); - cursor += dw_based_range_read_struct(base, range, cursor, &address_size); - cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size); - cursor += dw_based_range_read_struct(base, range, cursor, &offset_entry_count); - - U64 past_header_offset = cursor; - B32 is_dwarf64 = unit_length > max_U32; - U64 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - - dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); - dw_printf("Version: %u", version); - dw_printf("Address size: %u", address_size); - dw_printf("Segment selector size: %u", segment_selector_size); - dw_printf("Offset entry count: %u", offset_entry_count); - if (version != DW_Version_5) { - rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); - } - - if (offset_entry_count > 0) { - dw_printf("Offsets:"); - dw_indent(); - dw_printf("%-8s %-8s", "Index", "Offset"); - for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) { - U64 offset = 0; - cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - dw_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); - } - dw_unindent(); - } - - dw_printf("Locations:"); - dw_indent(); - dw_printf("%-8s %-8s", "Offset", "Location"); - for (; cursor < unit_opl; ) { - Temp temp = temp_begin(arena); - - String8List list = {0}; - - str8_list_pushf(temp.arena, &list, "%08I64x", cursor); - - U8 kind = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &kind); - str8_list_pushf(temp.arena, &list, "DW_LLE_%S", dw_string_from_loc_list_entry_kind(temp.arena, kind)); - - B32 has_loc_desc = 0; - switch (kind) { - case DW_LocListEntryKind_EndOfList: - break; - case DW_LocListEntryKind_DefaultLocation: { - has_loc_desc = 1; - } break; - case DW_LocListEntryKind_BaseAddress: { - U64 base_address = 0; - cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &base_address); - str8_list_pushf(temp.arena, &list, "%I64x", base_address); - } break; - case DW_LocListEntryKind_StartLength: { - U64 start = 0; - U64 length = 0; - cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &start); - cursor += dw_based_range_read_uleb128(base, range, cursor, &length); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, length); - } break; - case DW_LocListEntryKind_StartEnd: { - U64 start = 0; - U64 end = 0; - cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &start); - cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &end); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, end); - } break; - case DW_LocListEntryKind_BaseAddressX: { - U64 base_addressx = 0; - cursor += dw_based_range_read_uleb128(base, range, cursor, &base_addressx); - str8_list_pushf(temp.arena, &list, "%I64x", base_addressx); - } break; - case DW_LocListEntryKind_StartXEndX: { - U64 startx = 0; - U64 endx = 0; - cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); - cursor += dw_based_range_read_uleb128(base, range, cursor, &endx); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, endx); - } break; - case DW_LocListEntryKind_OffsetPair: { - U64 a = 0; - U64 b = 0; - cursor += dw_based_range_read_uleb128(base, range, cursor, &a); - cursor += dw_based_range_read_uleb128(base, range, cursor, &b); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", a, b); - - U8 expr_length = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &expr_length); - - String8 raw_expr = str8((U8*)base+cursor, expr_length); - cursor += expr_length; - - // TODO: we need actual cu base to format expression correctly - NotImplemented; - String8 expression = dw_single_line_string_from_expression(temp.arena, raw_expr, 0, address_size, arch, version, DW_Ext_Null, is_dwarf64); - str8_list_pushf(temp.arena, &list, "(%S)", expression); - } break; - case DW_LocListEntryKind_StartXLength: { - U64 startx = 0; - cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); - U64 length = 0; - if (version < DW_Version_5) { - // pre-standard length - cursor += dw_based_range_read(base, range, cursor, sizeof(U32), &length); - } else { - cursor += dw_based_range_read_uleb128(base, range, cursor, &length); - } - } break; - } - - String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - dw_printf("%S", print); - - temp_end(temp); - } - dw_unindent(); - rd_newline(); - } - dw_unindent(); - - scratch_end(scratch); -#endif -} - -internal void -dw_print_debug_rnglists(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, Rng1U64Array segment_ranges) -{ - NotImplemented; -#if 0 - void *base = dw_base_from_sec(sections, DW_Section_RngLists); - Rng1U64 range = dw_range_from_sec(sections, DW_Section_RngLists); - - if (dim_1u64(range) == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - dw_printf("# %S", sections->v[DW_Section_RngLists].name); - dw_indent(); - for (U64 cursor = 0; cursor < dim_1u64(range); ) { - U64 unit_offset = cursor; - U64 unit_length = 0; - cursor += dw_based_range_read_length(base, range, cursor, &unit_length); - U64 unit_opl = cursor + unit_length; - DW_Version version = 0; - U8 address_size = 0; - U8 segment_selector_size = 0; - U32 offset_entry_count = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &version); - cursor += dw_based_range_read_struct(base, range, cursor, &address_size); - cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size); - cursor += dw_based_range_read_struct(base, range, cursor, &offset_entry_count); - - U64 past_header_offset = cursor; - B32 is_dwarf64 = unit_length > max_U32; - U64 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - - dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); - dw_printf("Version: %u", version); - dw_printf("Address size: %u", address_size); - dw_printf("Segment selector size: %u", segment_selector_size); - dw_printf("Offset entry count: %u", offset_entry_count); - - if (version != DW_Version_5) { - rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); - } - - if (offset_entry_count > 0) { - dw_printf("Offsets:"); - dw_indent(); - dw_printf("%-8s %-8s", "Index", "Offset"); - for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) { - U64 offset = 0; - cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - dw_printf("%-8I64u %I64x", offset_idx, offset+past_header_offset); - } - dw_unindent(); - } - - dw_printf("Ranges:"); - dw_indent(); - dw_printf("%-8s %-8s", "Offset", "Range"); - for (; cursor < unit_opl; ) { - Temp temp = temp_begin(scratch.arena); - - String8List list = {0}; - - // offset - str8_list_pushf(temp.arena, &list, "%08I64x", cursor); - - // opcode mnemonic - U8 kind = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &kind); - str8_list_pushf(temp.arena, &list, "DW_RLE_%S", dw_string_from_rng_list_entry_kind(temp.arena, kind)); - - // operand - switch (kind) { - case DW_RngListEntryKind_EndOfList: { - // empty - } break; - case DW_RngListEntryKind_BaseAddressX: { - U64 base_addressx = 0; - cursor += dw_based_range_read_uleb128(base, range, cursor, &base_addressx); - str8_list_pushf(temp.arena, &list, "%I64x", base_addressx); - } break; - case DW_RngListEntryKind_BaseAddress: { - U64 base_address = 0; - cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &base_address); - str8_list_pushf(temp.arena, &list, "%I64x", base_address); - } break; - case DW_RngListEntryKind_OffsetPair: { - U64 min = 0; - U64 max = 0; - cursor += dw_based_range_read_uleb128(base, range, cursor, &min); - cursor += dw_based_range_read_uleb128(base, range, cursor, &max); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", min, max); - } break; - case DW_RngListEntryKind_StartxLength: { - U64 startx = 0; - U64 length = 0; - cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); - cursor += dw_based_range_read_uleb128(base, range, cursor, &length); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, length); - } break; - case DW_RngListEntryKind_StartxEndx: { - U64 startx = 0; - U64 endx = 0; - cursor += dw_based_range_read_uleb128(base, range, cursor, &startx); - cursor += dw_based_range_read_uleb128(base, range, cursor, &endx); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", startx, endx); - } break; - case DW_RngListEntryKind_StartEnd: { - U64 start = 0; - U64 end = 0; - cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &start); - cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &end); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, end); - } break; - case DW_RngListEntryKind_StartLength: { - U64 start = 0; - U64 length = 0; - cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &start); - cursor += dw_based_range_read_uleb128(base, range, cursor, &length); - str8_list_pushf(temp.arena, &list, "%I64x, %I64x", start, length); - } break; - } - - // output row - String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(" ")}); - dw_printf("%S", print); - - temp_end(temp); - } - dw_unindent(); - rd_newline(); - } - dw_unindent(); - - scratch_end(scratch); -#endif -} - -internal void -dw_format_string_table(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input, DW_SectionKind sec) -{ - NotImplemented; -#if 0 - void *base = dw_base_from_sec(sections, sec); - Rng1U64 range = dw_range_from_sec(sections, sec); - - if (dim_1u64(range) == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - dw_printf("# %S", sections->v[sec].name); - dw_indent(); - for (U64 cursor = 0; cursor < dim_1u64(range); ) { - U64 unit_offset = cursor; - - U64 unit_length = 0; - cursor += dw_based_range_read_length(base, range, cursor, &unit_length); - U64 unit_opl = cursor + unit_length; - - DW_Version version = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &version); - - if (version != DW_Version_2) { - rd_warningf("Version value must be 2"); - } - - B32 is_dwarf64 = unit_length > max_U32; - U32 sec_offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - - U64 debug_info_offset = 0, debug_info_length = 0; - cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_offset); - cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_length); - - dw_printf("Unit @ %#I64x, length %I64u", unit_offset, unit_length); - dw_printf("Version: %u", version); - dw_printf("Debug info offset: %#I64x", debug_info_offset); - dw_printf("Debug info length: %#I64x", debug_info_length); - - dw_printf("Entries:"); - dw_indent(); - dw_printf("%-8s %-8s", "Offset", "String"); - for (; cursor < unit_opl; ) { - U64 info_offset = 0; - cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &info_offset); - String8 string = dw_based_range_read_string(base, range, cursor); - cursor += (string.size + 1); - - dw_printf("%08I64x %S", info_offset, string); - } - dw_unindent(); - rd_newline(); - } - dw_unindent(); - - scratch_end(scratch); -#endif -} - -internal void -dw_print_debug_pubnames(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) -{ - dw_format_string_table(arena, out, g_dw_indent, input, DW_Section_PubNames); -} - -internal void -dw_print_debug_pubtypes(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) -{ - dw_format_string_table(arena, out, g_dw_indent, input, DW_Section_PubTypes); -} - -internal void -dw_print_debug_line_str(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) -{ - NotImplemented; -#if 0 - void *base = dw_base_from_sec(sections, DW_Section_LineStr); - Rng1U64 range = dw_range_from_sec(sections, DW_Section_LineStr); - - if (dim_1u64(range) == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - dw_printf("# %S", sections->v[DW_Section_LineStr].name); - dw_indent(); - - dw_printf("%-8s %-8s", "Offset", "String"); - for (U64 cursor = 0; cursor < dim_1u64(range); ) { - U64 offset = cursor; - String8 string = dw_based_range_read_string(base, range, cursor); - cursor += (string.size + 1); - dw_printf("%08llX %S", offset, string); - } - dw_unindent(); - - scratch_end(scratch); -#endif -} - -internal void -dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 g_dw_indent, DW_Raw *input) -{ - NotImplemented; -#if 0 - void *base = dw_base_from_sec(sections, DW_Section_StrOffsets); - Rng1U64 range = dw_range_from_sec(sections, DW_Section_StrOffsets); - - void *debug_str_base = dw_base_from_sec(sections, DW_Section_Str); - Rng1U64 debug_str_range = dw_range_from_sec(sections, DW_Section_Str); - - if (dim_1u64(range) == 0) { - return; - } - - Temp scratch = scratch_begin(&arena, 1); - - dw_printf("# %S", sections->v[DW_Section_StrOffsets].name); - dw_indent(); - for (U64 cursor = 0; cursor < dim_1u64(range); ) { - U64 unit_offset = cursor; - - U64 unit_length = 0; - cursor += dw_based_range_read_length(base, range, cursor, &unit_length); - U64 unit_opl = cursor + unit_length; - - DW_Version version = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &version); - if (version != DW_Version_5) { - rd_warningf("Version value must be 5 (DWARF5 sepc, Feb 13, 2017)"); - } - - U16 padding = 0; - cursor += dw_based_range_read_struct(base, range, cursor, &padding); - if (padding != 0) { - rd_warningf("unexpected padding byte"); - } - - B32 is_dwarf64 = unit_length > max_U32; - U32 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32); - - dw_printf("Unit @ %#llX, length %I64d", unit_offset, unit_length); - dw_printf("Version: %d", version); - dw_printf("Padding: %d", padding); - dw_indent(); - dw_printf("%-8s %-8s", "@", "Offset"); - for (; cursor < unit_opl; ) { - U64 read_at = cursor; - U64 offset = 0; - cursor += dw_based_range_read(base, range, cursor, offset_size, &offset); - dw_printf("%08I64x %08I64x", read_at, offset); - if (dim_1u64(debug_str_range) > 0) { - String8 string = dw_based_range_read_string(debug_str_base, debug_str_range, offset); - dw_printf(" %S", string); - } - rd_newline(); - } - dw_unindent(); - rd_newline(); - } - dw_unindent(); - - scratch_end(scratch); -#endif -} - -#endif - //////////////////////////////// -//~ rjf: Dump Entry Point - -read_only struct { - DW_Printer *printer; - DW_SectionKind kind; -} g_dw_printers[] = { - { dw_print_abbrev, DW_Section_Abbrev }, - { dw_print_info, DW_Section_Info }, - { dw_print_strings, DW_Section_Str }, - { dw_print_frame, DW_Section_Frame }, - { dw_print_line, DW_Section_Line }, -}; +//~ rjf: Main Dump Entry Point internal String8List -dw_dump_list_from_sections(Arena *arena, - DW_Raw *input, - Arch arch, - DW_SectionFlags subset_flags, - B32 is_verbose) +dw_dump_list_from_raw(Arena *arena, DW_Raw *raw, Arch arch, DW_SectionFlags subset_flags) { + ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); - String8List *strings = push_array(scratch.arena, String8List, 1); - int indent = 0; + String8 indent = str8_lit(" "); - DW_Dumper dumper = {0}; - dumper.arena = arena_alloc(); - dumper.arch = arch; - dumper.is_verbose = is_verbose; - dumper.input = input; - dumper.is_relaxed = 1; + ////////////////////////////// + //- rjf: set up + // + typedef struct DumpSubsetOutputNode DumpSubsetOutputNode; + struct DumpSubsetOutputNode + { + DumpSubsetOutputNode *next; + DW_SectionKind section_kind; + String8List *lane_strings; + }; + DumpSubsetOutputNode *first_output_node = 0; + DumpSubsetOutputNode *last_output_node = 0; + String8List *strings = 0; +#define dump(str) str8_list_push(arena, strings, (str)) +#define dumpf(...) str8_list_pushf(arena, strings, __VA_ARGS__) +#define DumpSubsetKind(kind) \ +if(lane_idx() == 0)\ +{\ +DumpSubsetOutputNode *n = push_array(scratch.arena, DumpSubsetOutputNode, 1);\ +SLLQueuePush(first_output_node, last_output_node, n);\ +n->section_kind = (kind);\ +n->lane_strings = push_array(scratch.arena, String8List, lane_count());\ +}\ +lane_sync_u64(&first_output_node, 0);\ +lane_sync_u64(&last_output_node, 0);\ +strings = &last_output_node->lane_strings[lane_idx()];\ +lane_sync(); if(subset_flags & (1ull<<(kind))) ProfScope((char *)dw_regular_name_from_section_kind(kind).str) +#define DumpSubset(name) DumpSubsetKind(DW_SectionKind_##name) - for EachElement(i, g_dw_printers) { - if (((1 << g_dw_printers[i].kind) & subset_flags) != 0) { - String8List s = {0}; - g_dw_printers[i].printer(arena, &s, indent + 1, &dumper); - - if (s.total_size > 0) { - dw_printf("%S:\n", str8_skip(dw_name_string_from_section_kind(g_dw_printers[i].kind), 1)); - dw_printf("{\n"); - dw_indent(); - str8_list_concat_in_place(strings, &s); - dw_unindent(); - dw_printf("}\n"); + ////////////////////////////// + //- rjf: .debug_abbrev + // + DumpSubset(Abbrev) + { + if(lane_idx() == 0) + { + String8 data = raw->sec[DW_SectionKind_Abbrev].data; + U64 idx = 0; + dumpf("\nabbrevs:\n{\n"); + for(U64 off = 0; off < data.size; idx += 1) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; + + // rjf: read abbrev info + DW2_AbbrevHeader abbrev_header = {0}; + DW2_AbbrevAttribList abbrev_attribs = {0}; + off += dw2_read_abbrev(scratch2.arena, data, off, &abbrev_header, &abbrev_attribs); + + // rjf: log + dumpf(" abbrev: // abbrev[%I64u], .debug_abbrev@0x%I64x\n", idx, start_off); + dumpf(" {\n"); + dumpf(" id: %I64u\n", abbrev_header.id); + dumpf(" tag_kind: %S (0x%I64x)\n", dw_string_from_tag_kind(DW_Version_Last, DW_ExtFlag_All, abbrev_header.tag_kind), abbrev_header.tag_kind); + dumpf(" has_children: %s\n", abbrev_header.has_children ? "yes" : "no"); + if(abbrev_attribs.count != 0) + { + dumpf(" attribs:\n {\n"); + for EachNode(n, DW2_AbbrevAttribNode, abbrev_attribs.first) + { + DW2_AbbrevAttrib *attrib = &n->v; + dumpf(" {%-24S %-16S%S}\n", + dw_string_from_attrib_kind(DW_Version_Last, DW_ExtFlag_All, attrib->attrib_kind), + dw_string_from_form_kind(DW_Version_Last, DW_ExtFlag_All, attrib->form_kind), + attrib->form_kind == DW_FormKind_ImplicitConst ? str8f(scratch2.arena, " (0x%I64x, %I64u)", attrib->implicit_const, attrib->implicit_const) : s("")); + } + dumpf(" }\n"); + } + dumpf(" }\n"); + + if(off == start_off) + { + break; + } } + dumpf("}\n"); } } - String8List result = *strings; - arena_release(dumper.arena); + ////////////////////////////// + //- rjf: .debug_info + // + DumpSubset(Info) + { + //- rjf: gather unit ranges from .debug_info + Rng1U64Array *unit_info_ranges = 0; + if(lane_idx() == 0) + { + unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); + *unit_info_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_Info].data); + } + lane_sync_u64(&unit_info_ranges, 0); + U64 unit_count = unit_info_ranges->count; + + //- rjf: parse all .debug_info unit headers + DW2_UnitHeader *unit_headers = 0; + Rng1U64 *unit_info_tag_ranges = 0; + { + // rjf: set up + if(lane_idx() == 0) + { + unit_headers = push_array(scratch.arena, DW2_UnitHeader, unit_count); + unit_info_tag_ranges = push_array(scratch.arena, Rng1U64, unit_count); + } + lane_sync_u64(&unit_headers, 0); + lane_sync_u64(&unit_info_tag_ranges, 0); + + // rjf: parse all unit headers + String8 data = raw->sec[DW_SectionKind_Info].data; + Rng1U64 range = lane_range(unit_count); + for EachInRange(idx, range) + { + Rng1U64 unit_info_range = unit_info_ranges->v[idx]; + U64 bytes_read = dw2_read_unit_header(str8_substr(data, unit_info_range), 0, &unit_headers[idx]); + unit_info_tag_ranges[idx] = r1u64(unit_info_range.min + bytes_read, unit_info_range.max); + } + } + lane_sync(); + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + + //- rjf: build all abbreviation maps, build (unit -> abbrev map) + DW2_UnitAbbrevMapMap unit_abbrev_map_map = dw2_unit_abbrev_map_map_from_data(scratch.arena, raw->sec[DW_SectionKind_Abbrev].data, unit_headers, unit_count); + + //- rjf: parse all unit offsets tables + DW2_OffsetTableSet *offset_tables = 0; + if(lane_idx() == 0) + { + offset_tables = push_array(scratch.arena, DW2_OffsetTableSet, 1); + offset_tables[0] = dw2_offset_table_set_from_raw(scratch.arena, raw); + } + lane_sync_u64(&offset_tables, 0); + + //- rjf: build per-unit parsing contexts + DW2_ParseCtx *unit_parse_ctxs = 0; + { + if(lane_idx() == 0) + { + unit_parse_ctxs = push_array(scratch.arena, DW2_ParseCtx, unit_count); + } + lane_sync_u64(&unit_parse_ctxs, 0); + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + DW2_UnitHeader *hdr = &unit_headers[unit_idx]; + DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; + + // rjf: equip initial bootstrapping info + dw2_parse_ctx_equip_unit_header(ctx, hdr, unit_info_ranges->v[unit_idx].min); + dw2_parse_ctx_equip_unit_abbrev_map(ctx, &unit_abbrev_map_map, unit_idx); + + // rjf: do bootstrapping parse of root tag + DW2_Tag root_tag_bootstrap = {0}; + dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag_bootstrap); + + // rjf: equip info extracted from bootstrapping parse + dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag_bootstrap, offset_tables); + + // rjf: do non-bootstrapping parse + DW2_Tag root_tag = {0}; + dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag); + + // rjf: equip info extracted from non-bootstrapping parse + dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag, offset_tables); + } + } + lane_sync(); + + //- rjf: dump all unit tag trees + String8List *unit_dumps = 0; + if(lane_idx() == 0) + { + unit_dumps = push_array(scratch.arena, String8List, unit_count); + } + lane_sync_u64(&unit_dumps, 0); + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + String8List *strings_restore = strings; + for(;;) + { + //- rjf: take unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= unit_count) + { + break; + } + + //- rjf: unpack unit + strings = &unit_dumps[unit_idx]; + DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; + + //- rjf: dump + dumpf(" unit: // unit[%I64u], .debug_info@0x%I64x\n", unit_idx, ctx->unit_base_info_off); + dumpf(" {\n"); + dumpf(" version: %u\n", ctx->version); + dumpf(" format: %S\n", dw_string_from_format(ctx->format)); + dumpf(" abbrev_off: 0x%I64x\n", unit_headers[unit_idx].abbrev_off); + dumpf(" addr_size: %I64u\n", ctx->addr_size); + dumpf(" kind: %S\n", dw_string_from_comp_unit_kind(unit_headers[unit_idx].kind)); + dumpf(" dwo_id: 0x%I64x\n", unit_headers[unit_idx].dwo_id); + dumpf(" tags:\n {\n"); + { + U64 depth = 0; + for(U64 off = unit_info_tag_ranges[unit_idx].min; off < unit_info_tag_ranges[unit_idx].max;) + { + U64 start_off = off; + Temp tag_scratch = scratch_begin(&scratch.arena, 1); + + // rjf: parse next tag + DW2_Tag tag = {0}; + off += dw2_read_tag(tag_scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + + // rjf: non-zero tag -> dump + if(tag.kind != DW_TagKind_Null) + { + dumpf(" %.*s%S: // .debug_info@0x%I64x\n", depth, indent.str, dw_string_from_tag_kind(ctx->version, ctx->exts, tag.kind), start_off); + dumpf(" %.*s{\n", depth, indent.str); + for EachNode(n, DW2_AttribNode, tag.attribs.first) + { + DW2_Attrib *attrib = &n->v; + String8 kind_string = dw_string_from_attrib_kind(ctx->version, ctx->exts, attrib->attrib_kind); + String8 form_kind_string = dw_string_from_form_kind(ctx->version, ctx->exts, attrib->val.kind); + String8 value_string = {0}; + DW_AttribClass value_class = dw_attrib_class_from_form_kind(ctx->version, ctx->exts, attrib->val.kind); + switch(value_class) + { + default: + { + value_string = str8f(tag_scratch.arena, "0x%I64x", attrib->val.u128.u64[0]); + }break; + case DW_AttribClass_Address: + { + value_string = str8f(tag_scratch.arena, "0x%I64x", attrib->val.addr); + }break; + case DW_AttribClass_String: + { + value_string = str8f(tag_scratch.arena, "\"%S\"", attrib->val.string); + }break; + case DW_AttribClass_Flag: + { + value_string = attrib->val.u128.u64[0] ? s("true") : s("false"); + }break; + case DW_AttribClass_Block: + { + String8 block = attrib->val.string; + String8List block_strs = numeric_str8_list_from_data(tag_scratch.arena, 16, block, 1); + value_string = str8_list_join(tag_scratch.arena, &block_strs, &(StringJoin){.pre = s("{ "), .sep = s(", "), .post = s(" }")}); + }break; + case DW_AttribClass_ExprLoc: + { + String8 expr = attrib->val.string; + String8List expr_strs = dw_dump_list_from_expr(tag_scratch.arena, expr, arch, ctx); + value_string = str8_list_join(tag_scratch.arena, &expr_strs, &(StringJoin){.pre = s("{ "), .sep = s(", "), .post = s(" }")}); + }break; + } + dumpf(" %.*s %S: %S // %S\n", depth, indent.str, kind_string, value_string, form_kind_string); + } + } + + // rjf: push/pop + if(tag.has_children) + { + depth += 1; + } + else if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + + // rjf: if tag does not have children -> end info + if(!tag.has_children) + { + dumpf(" %.*s}\n", depth, indent.str); + } + + scratch_end(tag_scratch); + if(off == start_off) + { + break; + } + } + } + dumpf(" }\n"); + dumpf(" }\n"); + } + strings = strings_restore; + + //- rjf: join unit dumps in order + if(lane_idx() == 0) + { + dumpf("\nunits:\n{\n"); + for EachIndex(unit_idx, unit_count) + { + str8_list_concat_in_place(strings, &unit_dumps[unit_idx]); + } + dumpf("}\n"); + } + lane_sync(); + } + + ////////////////////////////// + //- rjf: .debug_line + // + DumpSubset(Line) + { + // TODO(rjf) + } + + ////////////////////////////// + //- rjf: .debug_str + // + DumpSubset(Str) + { + if(lane_idx() == 0) + { + dumpf("\nstrings:\n{\n"); + String8 data = raw->sec[DW_SectionKind_Str].data; + U64 idx = 0; + for(U64 off = 0; off < data.size; idx += 1) + { + U64 start_off = off; + String8 string = {0}; + off += str8_deserial_read_cstr(data, off, &string); + dumpf(" {\"%S\"} // string[%I64u], .debug_str@0x%I64x\n", string, idx, start_off); + if(off == start_off) + { + break; + } + } + dumpf("}\n"); + } + } + + ////////////////////////////// + //- rjf: .debug_frame + // +#if 0 + DumpSubset(Frame) + { + // TODO(rjf) + } +#endif + + ////////////////////////////// + //- rjf: .debug_loc + // +#if 0 + DumpSubset(Loc) + { + // TODO(rjf) + } +#endif + + ////////////////////////////// + //- rjf: join results + // + String8List *result_strings_ptr = push_array(scratch.arena, String8List, 1); + lane_sync(); + if(lane_idx() == 0) + { + for EachNode(n, DumpSubsetOutputNode, first_output_node) + { + String8List subset_strings = {0}; + for EachIndex(idx, lane_count()) + { + str8_list_concat_in_place(&subset_strings, &n->lane_strings[idx]); + } + if(subset_strings.total_size != 0) + { + str8_list_pushf(arena, result_strings_ptr, "////////////////////////////////\n//~ %S\n", dw_regular_name_from_section_kind(n->section_kind)); + str8_list_concat_in_place(result_strings_ptr, &subset_strings); + str8_list_pushf(arena, result_strings_ptr, "\n"); + } + } + } + lane_sync(); + lane_sync_u64(&result_strings_ptr, 0); + String8List result_strings = *result_strings_ptr; + lane_sync(); + +#undef DumpSubsetKind +#undef DumpSubset +#undef dump +#undef dumpf scratch_end(scratch); - return result; + ProfEnd(); + return result_strings; } - diff --git a/src/dwarf/dwarf_dump.h b/src/dwarf/dwarf_dump.h index 6a015952..eddc47b2 100644 --- a/src/dwarf/dwarf_dump.h +++ b/src/dwarf/dwarf_dump.h @@ -4,70 +4,14 @@ #ifndef DWARF_DUMP_H #define DWARF_DUMP_H -typedef enum -{ - DW_DumperCacheFlag_InfoRanges = (1 << 0), - DW_DumperCacheFlag_CuArr = (1 << 1), - DW_DumperCacheFlag_LineVmMap = (1 << 2), - DW_DumperCacheFlag_TagTrees = (1 << 3), -} DW_DumperCacheFlags; +//////////////////////////////// +//~ rjf: Helpers -typedef struct DW_Dumper -{ - Arena *arena; - Arch arch; - B32 is_relaxed; - B32 is_verbose; - DW_Raw *input; - DW_DumperCacheFlags cache_flags; - struct { - Rng1U64Array info_ranges; - DW_CompUnit *cu_arr; - HashTable *line_vm_map; - DW_TagTree *tag_trees; - } cache; -} DW_Dumper; - -#define DW_PRINTER(name) void name(Arena *arena, String8List *strings, int indent, DW_Dumper *dumper) -typedef DW_PRINTER(DW_Printer); +internal String8List dw_dump_list_from_expr(Arena *arena, String8 data, Arch arch, DW2_ParseCtx *ctx); //////////////////////////////// +//~ rjf: Main Dump Entry Point -// cache -internal Rng1U64Array dw_get_info_ranges(DW_Dumper *dumper); -internal DW_CompUnit * dw_get_cu_arr(DW_Dumper *dumper); -internal HashTable * dw_get_line_vm_map(DW_Dumper *dumper); -internal DW_TagTree * dw_get_tag_trees(DW_Dumper *dumper); - -//////////////////////////////// -//~ rjf: Stringification Helpers - -internal String8List dw_string_list_from_cfi_program(Arena *arena, U64 cu_base, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format, U64 pc_begin, DW_CIE *cie, DW_DecodePtr *decode_ptr_func, void *deocde_ptr_ud, String8 program); -internal String8List dw_string_list_from_expression (Arena *arena, String8 raw_data, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); - -internal String8 dw_string_from_reg_off (Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off); -internal String8 dw_string_from_attrib_value(Arena *arena, DW_Raw *input, Arch arch, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib); -internal String8 dw_string_from_expression (Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format); -internal String8 dw_string_from_cfa (Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa); -internal String8 dw_string_from_cfi_row (Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row); - -#if 0 -internal void dw_print_eh_frame (Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx); -internal void dw_print_debug_loc (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); -internal void dw_print_debug_ranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Arch arch, ExecutableImageKind image_type, B32 relaxed); -internal void dw_print_debug_aranges (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_addr (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_loclists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges, Arch arch); -internal void dw_print_debug_rnglists (Arena *arena, String8List *out, String8 indent, DW_Raw *input, Rng1U64Array segment_vranges); -internal void dw_print_debug_pubnames (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_pubtypes (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_line_str (Arena *arena, String8List *out, String8 indent, DW_Raw *input); -internal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Raw *input); -#endif - -//////////////////////////////// -//~ rjf: Dump Entry Point - -internal String8List dw_dump_list_from_sections(Arena *arena, DW_Raw *input, Arch arch, DW_SectionFlags dump_sections, B32 is_verbose); +internal String8List dw_dump_list_from_raw(Arena *arena, DW_Raw *raw, Arch arch, DW_SectionFlags subset_flags); #endif // DWARF_DUMP_H diff --git a/src/dwarf/dwarf_dump_2.c b/src/dwarf/dwarf_dump_2.c deleted file mode 100644 index 04f7669c..00000000 --- a/src/dwarf/dwarf_dump_2.c +++ /dev/null @@ -1,718 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Helpers - -internal String8List -dw_dump_list_from_expr(Arena *arena, String8 data, Arch arch, DW2_ParseCtx *ctx) -{ - String8List result = {0}; - Temp scratch = scratch_begin(&arena, 1); - ARCH_Info *arch_info = arch_info_from_arch(arch); - for(U64 off = 0; off < data.size;) - { - U64 start_off = 0; - - // rjf: read next op - U8 op = 0; - off += str8_deserial_read_struct(data, off, &op); - - // rjf: unpack op / operands - String8 operand_string = {0}; - U64 size_param = 0; - B32 is_signed = 0; - switch(op) - { - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: - { - U64 x = op - DW_ExprOp_Lit0; - operand_string = str8f(scratch.arena, "%I64u", x); - }break; - - case DW_ExprOp_Const1U:size_param = 1; goto const_n; - case DW_ExprOp_Const2U:size_param = 2; goto const_n; - case DW_ExprOp_Const4U:size_param = 4; goto const_n; - case DW_ExprOp_Const8U:size_param = 8; goto const_n; - case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n; - case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n; - case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n; - case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n; - const_n: - { - if(is_signed) - { - S64 x = 0; - off += str8_deserial_read(data, off, &x, size_param, 1); - x = extend_sign64(x, size_param); - operand_string = str8f(scratch.arena, "%I64d", x); - } - else - { - U64 x = 0; - off += str8_deserial_read(data, off, &x, size_param, 1); - operand_string = str8f(scratch.arena, "%I64u", x); - } - }break; - - case DW_ExprOp_Addr: - { - U64 addr = 0; - off += str8_deserial_read(data, off, &addr, ctx->addr_size, 1); - operand_string = str8f(scratch.arena, "0x%I64x", addr); - }break; - - case DW_ExprOp_ConstU: - { - U64 x = 0; - off += str8_deserial_read_uleb128(data, off, &x); - operand_string = str8f(scratch.arena, "%I64u", x); - }break; - - case DW_ExprOp_ConstS: - { - S64 x = 0; - off += str8_deserial_read_sleb128(data, off, &x); - operand_string = str8f(scratch.arena, "%I64d", x); - }break; - - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: - { - U64 reg_idx = op - DW_ExprOp_Reg0; - ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); - operand_string = arch_info->reg_code_name_table[regcode]; - }break; - - case DW_ExprOp_RegX: - { - U64 reg_idx = 0; - off += str8_deserial_read_uleb128(data, off, ®_idx); - ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); - operand_string = arch_info->reg_code_name_table[regcode]; - }break; - - case DW_ExprOp_ImplicitValue: - { - U64 value_size = 0; - off += str8_deserial_read_uleb128(data, off, &value_size); - Rng1U64 value_range = rng_1u64(off, off + value_size); - String8 value_data = str8_substr(data, value_range); - off += value_size; - String8List value_strings = numeric_str8_list_from_data(scratch.arena, 16, value_data, 1); - operand_string = str8_list_join(scratch.arena, &value_strings, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(", "), .post = str8_lit(" }")}); - }break; - - case DW_ExprOp_Piece: - { - U64 size = 0; - off += str8_deserial_read_uleb128(data, off, &size); - operand_string = str8f(scratch.arena, "%u", size); - }break; - - case DW_ExprOp_BitPiece: - { - U64 bit_size = 0, bit_off = 0; - off += str8_deserial_read_uleb128(data, off, &bit_size); - off += str8_deserial_read_uleb128(data, off, &bit_off); - operand_string = str8f(scratch.arena, "bit size %I64u, bit offset %I64u", bit_size, bit_off); - }break; - - case DW_ExprOp_Pick: - { - U8 stack_idx = 0; - off += str8_deserial_read_struct(data, off, &stack_idx); - operand_string = str8f(scratch.arena, "stack index %u", stack_idx); - }break; - - case DW_ExprOp_PlusUConst: - { - U64 addend = 0; - off += str8_deserial_read_uleb128(data, off, &addend); - operand_string = str8f(arena, "addend %I64u", addend); - }break; - - case DW_ExprOp_Skip: - { - S16 x = 0; - off += str8_deserial_read_struct(data, off, &x); - operand_string = str8f(scratch.arena, "%+d bytes", x); - }break; - - case DW_ExprOp_Bra: - { - S16 x = 0; - off += str8_deserial_read_struct(data, off, &x); - operand_string = str8f(scratch.arena, "%+d", x); - }break; - - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: - { - U64 reg_idx = op - DW_ExprOp_BReg0; - S64 reg_off = 0; - off += str8_deserial_read_sleb128(data, off, ®_off); - ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); - operand_string = str8f(scratch.arena, "%S+%I64d", arch_info->reg_code_name_table[regcode], reg_off); - }break; - - case DW_ExprOp_FBReg: - { - S64 reg_off = 0; - off += str8_deserial_read_sleb128(data, off, ®_off); - operand_string = str8f(scratch.arena, "frame base offset %I64d", reg_off); - }break; - - case DW_ExprOp_BRegX: - { - U64 reg_idx = 0; - S64 reg_off = 0; - off += str8_deserial_read_uleb128(data, off, ®_idx); - off += str8_deserial_read_sleb128(data, off, ®_off); - ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); - operand_string = str8f(scratch.arena, "%S+%I64d", arch_info->reg_code_name_table[regcode], reg_off); - }break; - - case DW_ExprOp_XDerefSize: - case DW_ExprOp_DerefSize: - { - U8 x = 0; - off += str8_deserial_read_struct(data, off, &x); - operand_string = str8f(scratch.arena, "%u", x); - }break; - - case DW_ExprOp_Call2: - { - U16 x = 0; - off += str8_deserial_read_struct(data, off, &x); - operand_string = str8f(scratch.arena, "%u", x); - }break; - case DW_ExprOp_Call4: - { - U32 x = 0; - off += str8_deserial_read_struct(data, off, &x); - operand_string = str8f(arena, "%u", x); - }break; - case DW_ExprOp_CallRef: - { - U64 x = 0; - off += dw2_read_fmt_u64(data, off, ctx->format, &x); - operand_string = str8f(scratch.arena, "%I64u", x); - }break; - case DW_ExprOp_ImplicitPointer: - case DW_GNU_ExprOp_ImplicitPointer: - { - U64 info_off = 0; - off += dw2_read_fmt_u64(data, off, ctx->format, &info_off); - S64 ptr = 0; - off += str8_deserial_read_sleb128(data, off, &ptr); - operand_string = str8f(scratch.arena, ".debug_info@0x%I64x, ptr %I64x", info_off, ptr); - } break; - case DW_ExprOp_Convert: - case DW_GNU_ExprOp_Convert: - { - U64 type_cu_off = 0; - off += str8_deserial_read_uleb128(data, off, &type_cu_off); - operand_string = str8f(scratch.arena, "TypeCuOff %#I64x", ctx->unit_base_info_off + type_cu_off); - }break; - case DW_GNU_ExprOp_ParameterRef: - { - // TODO: always 4 bytes? - U32 cu_off = 0; - off += str8_deserial_read_struct(data, off, &cu_off); - operand_string = str8f(scratch.arena, "CuOff %#x", ctx->unit_base_info_off + cu_off); - }break; - case DW_ExprOp_DerefType: - case DW_GNU_ExprOp_DerefType: - { - U8 deref_size = 0; - U64 type_cu_off = 0; - off += str8_deserial_read_struct(data, off, &deref_size); - off += str8_deserial_read_uleb128(data, off, &type_cu_off); - operand_string = str8f(scratch.arena, "%#x, TypeCuOff %#I64x", deref_size, ctx->unit_base_info_off + type_cu_off); - }break; - case DW_ExprOp_ConstType: - case DW_GNU_ExprOp_ConstType: - { - U64 type_cu_off = 0; - U8 const_value_size = 0; - off += str8_deserial_read_uleb128(data, off, &type_cu_off); - off += str8_deserial_read_struct(data, off, &const_value_size); - Rng1U64 const_value_range = rng_1u64(off, off + const_value_size); - String8 const_value_data = str8_substr(data, const_value_range); - String8List const_value_strings = numeric_str8_list_from_data(scratch.arena, 16, const_value_data, 1); - String8 const_value_str = str8_list_join(scratch.arena, &const_value_strings, &(StringJoin){.sep = str8_lit(", ")}); - operand_string = str8f(scratch.arena, "TypeCuOff %#I64x, Const Value { %S }", ctx->unit_base_info_off + type_cu_off, const_value_str); - off += const_value_size; - }break; - case DW_ExprOp_RegvalType: - case DW_GNU_ExprOp_RegvalType: - { - U64 reg_idx = 0, type_cu_off = 0; - off += str8_deserial_read_uleb128(data, off, ®_idx); - off += str8_deserial_read_uleb128(data, off, &type_cu_off); - ARCH_RegCode regcode = arch_reg_code_from_dw(arch, (DW_RegCode)reg_idx); - operand_string = str8f(scratch.arena, "%S, TypeCuOff %#I64x", arch_info->reg_code_name_table[regcode], ctx->unit_base_info_off + type_cu_off); - }break; - case DW_ExprOp_EntryValue: - case DW_GNU_ExprOp_EntryValue: - { - U64 block_size = 0; - off += str8_deserial_read_uleb128(data, off, &block_size); - Rng1U64 block_range = rng_1u64(off, off + block_size); - String8 block_data = str8_substr(data, block_range); - // TODO(rjf): WTF, recursive? let's not... - if we want this, let's just do the stack inside of this function - // String8List block_expr = dw_string_list_from_expression(scratch.arena, block_data, cu_base, addr_size, arch, ver, ext, format); - // operand_string = str8_list_join(scratch.arena, &block_expr, &(StringJoin){.pre = str8_lit("{ "), .sep = str8_lit(","), .post = str8_lit(" }")}); - operand_string = s("{...}"); - off += block_size; - } break; - case DW_ExprOp_Addrx: - { - U64 addr = 0; - off += str8_deserial_read_uleb128(data, off, &addr); - operand_string = str8f(scratch.arena, "%#I64x", addr); - }break; - } - - // rjf: push opcode info - String8 opcode_string = dw_string_from_expr_op(ctx->version, ctx->exts, op); - if(operand_string.size == 0) - { - str8_list_pushf(arena, &result, "%S", opcode_string); - } - else - { - str8_list_pushf(arena, &result, "%S(%S)", opcode_string, operand_string); - } - } - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Main Dump Entry Point - -internal String8List -dw_dump_list_from_raw(Arena *arena, DW_Raw *raw, Arch arch, DW_SectionFlags subset_flags) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - String8 indent = str8_lit(" "); - - ////////////////////////////// - //- rjf: set up - // - typedef struct DumpSubsetOutputNode DumpSubsetOutputNode; - struct DumpSubsetOutputNode - { - DumpSubsetOutputNode *next; - DW_SectionKind section_kind; - String8List *lane_strings; - }; - DumpSubsetOutputNode *first_output_node = 0; - DumpSubsetOutputNode *last_output_node = 0; - String8List *strings = 0; -#define dump(str) str8_list_push(arena, strings, (str)) -#define dumpf(...) str8_list_pushf(arena, strings, __VA_ARGS__) -#define DumpSubsetKind(kind) \ -if(lane_idx() == 0)\ -{\ -DumpSubsetOutputNode *n = push_array(scratch.arena, DumpSubsetOutputNode, 1);\ -SLLQueuePush(first_output_node, last_output_node, n);\ -n->section_kind = (kind);\ -n->lane_strings = push_array(scratch.arena, String8List, lane_count());\ -}\ -lane_sync_u64(&first_output_node, 0);\ -lane_sync_u64(&last_output_node, 0);\ -strings = &last_output_node->lane_strings[lane_idx()];\ -lane_sync(); if(subset_flags & (1ull<<(kind))) ProfScope((char *)dw_regular_name_from_section_kind(kind).str) -#define DumpSubset(name) DumpSubsetKind(DW_SectionKind_##name) - - ////////////////////////////// - //- rjf: .debug_abbrev - // - DumpSubset(Abbrev) - { - if(lane_idx() == 0) - { - String8 data = raw->sec[DW_SectionKind_Abbrev].data; - U64 idx = 0; - dumpf("\nabbrevs:\n{\n"); - for(U64 off = 0; off < data.size; idx += 1) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - U64 start_off = off; - - // rjf: read abbrev info - DW2_AbbrevHeader abbrev_header = {0}; - DW2_AbbrevAttribList abbrev_attribs = {0}; - off += dw2_read_abbrev(scratch2.arena, data, off, &abbrev_header, &abbrev_attribs); - - // rjf: log - dumpf(" abbrev: // abbrev[%I64u], .debug_abbrev@0x%I64x\n", idx, start_off); - dumpf(" {\n"); - dumpf(" id: %I64u\n", abbrev_header.id); - dumpf(" tag_kind: %S (0x%I64x)\n", dw_string_from_tag_kind(DW_Version_Last, DW_ExtFlag_All, abbrev_header.tag_kind), abbrev_header.tag_kind); - dumpf(" has_children: %s\n", abbrev_header.has_children ? "yes" : "no"); - if(abbrev_attribs.count != 0) - { - dumpf(" attribs:\n {\n"); - for EachNode(n, DW2_AbbrevAttribNode, abbrev_attribs.first) - { - DW2_AbbrevAttrib *attrib = &n->v; - dumpf(" {%-24S %-16S%S}\n", - dw_string_from_attrib_kind(DW_Version_Last, DW_ExtFlag_All, attrib->attrib_kind), - dw_string_from_form_kind(DW_Version_Last, DW_ExtFlag_All, attrib->form_kind), - attrib->form_kind == DW_FormKind_ImplicitConst ? str8f(scratch2.arena, " (0x%I64x, %I64u)", attrib->implicit_const, attrib->implicit_const) : s("")); - } - dumpf(" }\n"); - } - dumpf(" }\n"); - - if(off == start_off) - { - break; - } - } - dumpf("}\n"); - } - } - - ////////////////////////////// - //- rjf: .debug_info - // - DumpSubset(Info) - { - //- rjf: gather unit ranges from .debug_info - Rng1U64Array *unit_info_ranges = 0; - if(lane_idx() == 0) - { - unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); - *unit_info_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_Info].data); - } - lane_sync_u64(&unit_info_ranges, 0); - U64 unit_count = unit_info_ranges->count; - - //- rjf: parse all .debug_info unit headers - DW2_UnitHeader *unit_headers = 0; - Rng1U64 *unit_info_tag_ranges = 0; - { - // rjf: set up - if(lane_idx() == 0) - { - unit_headers = push_array(scratch.arena, DW2_UnitHeader, unit_count); - unit_info_tag_ranges = push_array(scratch.arena, Rng1U64, unit_count); - } - lane_sync_u64(&unit_headers, 0); - lane_sync_u64(&unit_info_tag_ranges, 0); - - // rjf: parse all unit headers - String8 data = raw->sec[DW_SectionKind_Info].data; - Rng1U64 range = lane_range(unit_count); - for EachInRange(idx, range) - { - Rng1U64 unit_info_range = unit_info_ranges->v[idx]; - U64 bytes_read = dw2_read_unit_header(str8_substr(data, unit_info_range), 0, &unit_headers[idx]); - unit_info_tag_ranges[idx] = r1u64(unit_info_range.min + bytes_read, unit_info_range.max); - } - } - lane_sync(); - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; - - //- rjf: build all abbreviation maps, build (unit -> abbrev map) - DW2_UnitAbbrevMapMap unit_abbrev_map_map = dw2_unit_abbrev_map_map_from_data(scratch.arena, raw->sec[DW_SectionKind_Abbrev].data, unit_headers, unit_count); - - //- rjf: parse all unit offsets tables - DW2_OffsetTableSet *offset_tables = 0; - if(lane_idx() == 0) - { - offset_tables = push_array(scratch.arena, DW2_OffsetTableSet, 1); - offset_tables[0] = dw2_offset_table_set_from_raw(scratch.arena, raw); - } - lane_sync_u64(&offset_tables, 0); - - //- rjf: build per-unit parsing contexts - DW2_ParseCtx *unit_parse_ctxs = 0; - { - if(lane_idx() == 0) - { - unit_parse_ctxs = push_array(scratch.arena, DW2_ParseCtx, unit_count); - } - lane_sync_u64(&unit_parse_ctxs, 0); - Rng1U64 range = lane_range(unit_count); - for EachInRange(unit_idx, range) - { - DW2_UnitHeader *hdr = &unit_headers[unit_idx]; - DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; - - // rjf: equip initial bootstrapping info - dw2_parse_ctx_equip_unit_header(ctx, hdr, unit_info_ranges->v[unit_idx].min); - dw2_parse_ctx_equip_unit_abbrev_map(ctx, &unit_abbrev_map_map, unit_idx); - - // rjf: do bootstrapping parse of root tag - DW2_Tag root_tag_bootstrap = {0}; - dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag_bootstrap); - - // rjf: equip info extracted from bootstrapping parse - dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag_bootstrap, offset_tables); - - // rjf: do non-bootstrapping parse - DW2_Tag root_tag = {0}; - dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag); - - // rjf: equip info extracted from non-bootstrapping parse - dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag, offset_tables); - } - } - lane_sync(); - - //- rjf: dump all unit tag trees - String8List *unit_dumps = 0; - if(lane_idx() == 0) - { - unit_dumps = push_array(scratch.arena, String8List, unit_count); - } - lane_sync_u64(&unit_dumps, 0); - U64 unit_take_idx_ = 0; - U64 *unit_take_idx_ptr = &unit_take_idx_; - lane_sync_u64(&unit_take_idx_ptr, 0); - String8List *strings_restore = strings; - for(;;) - { - //- rjf: take unit - U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; - if(unit_idx >= unit_count) - { - break; - } - - //- rjf: unpack unit - strings = &unit_dumps[unit_idx]; - DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; - - //- rjf: dump - dumpf(" unit: // unit[%I64u], .debug_info@0x%I64x\n", unit_idx, ctx->unit_base_info_off); - dumpf(" {\n"); - dumpf(" version: %u\n", ctx->version); - dumpf(" format: %S\n", dw_string_from_format(ctx->format)); - dumpf(" abbrev_off: 0x%I64x\n", unit_headers[unit_idx].abbrev_off); - dumpf(" addr_size: %I64u\n", ctx->addr_size); - dumpf(" kind: %S\n", dw_string_from_comp_unit_kind(unit_headers[unit_idx].kind)); - dumpf(" dwo_id: 0x%I64x\n", unit_headers[unit_idx].dwo_id); - dumpf(" tags:\n {\n"); - { - U64 depth = 0; - for(U64 off = unit_info_tag_ranges[unit_idx].min; off < unit_info_tag_ranges[unit_idx].max;) - { - U64 start_off = off; - Temp tag_scratch = scratch_begin(&scratch.arena, 1); - - // rjf: parse next tag - DW2_Tag tag = {0}; - off += dw2_read_tag(tag_scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); - - // rjf: non-zero tag -> dump - if(tag.kind != DW_TagKind_Null) - { - dumpf(" %.*s%S: // .debug_info@0x%I64x\n", depth, indent.str, dw_string_from_tag_kind(ctx->version, ctx->exts, tag.kind), start_off); - dumpf(" %.*s{\n", depth, indent.str); - for EachNode(n, DW2_AttribNode, tag.attribs.first) - { - DW2_Attrib *attrib = &n->v; - String8 kind_string = dw_string_from_attrib_kind(ctx->version, ctx->exts, attrib->attrib_kind); - String8 form_kind_string = dw_string_from_form_kind(ctx->version, ctx->exts, attrib->val.kind); - String8 value_string = {0}; - DW_AttribClass value_class = dw_attrib_class_from_form_kind(ctx->version, ctx->exts, attrib->val.kind); - switch(value_class) - { - default: - { - value_string = str8f(tag_scratch.arena, "0x%I64x", attrib->val.u128.u64[0]); - }break; - case DW_AttribClass_Address: - { - value_string = str8f(tag_scratch.arena, "0x%I64x", attrib->val.addr); - }break; - case DW_AttribClass_String: - { - value_string = str8f(tag_scratch.arena, "\"%S\"", attrib->val.string); - }break; - case DW_AttribClass_Flag: - { - value_string = attrib->val.u128.u64[0] ? s("true") : s("false"); - }break; - case DW_AttribClass_Block: - { - String8 block = attrib->val.string; - String8List block_strs = numeric_str8_list_from_data(tag_scratch.arena, 16, block, 1); - value_string = str8_list_join(tag_scratch.arena, &block_strs, &(StringJoin){.pre = s("{ "), .sep = s(", "), .post = s(" }")}); - }break; - case DW_AttribClass_ExprLoc: - { - String8 expr = attrib->val.string; - String8List expr_strs = dw_dump_list_from_expr(tag_scratch.arena, expr, arch, ctx); - value_string = str8_list_join(tag_scratch.arena, &expr_strs, &(StringJoin){.pre = s("{ "), .sep = s(", "), .post = s(" }")}); - }break; - } - dumpf(" %.*s %S: %S // %S\n", depth, indent.str, kind_string, value_string, form_kind_string); - } - } - - // rjf: push/pop - if(tag.has_children) - { - depth += 1; - } - else if(tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - - // rjf: if tag does not have children -> end info - if(!tag.has_children) - { - dumpf(" %.*s}\n", depth, indent.str); - } - - scratch_end(tag_scratch); - if(off == start_off) - { - break; - } - } - } - dumpf(" }\n"); - dumpf(" }\n"); - } - strings = strings_restore; - - //- rjf: join unit dumps in order - if(lane_idx() == 0) - { - dumpf("\nunits:\n{\n"); - for EachIndex(unit_idx, unit_count) - { - str8_list_concat_in_place(strings, &unit_dumps[unit_idx]); - } - dumpf("}\n"); - } - lane_sync(); - } - - ////////////////////////////// - //- rjf: .debug_line - // - DumpSubset(Line) - { - // TODO(rjf) - } - - ////////////////////////////// - //- rjf: .debug_str - // - DumpSubset(Str) - { - if(lane_idx() == 0) - { - dumpf("\nstrings:\n{\n"); - String8 data = raw->sec[DW_SectionKind_Str].data; - U64 idx = 0; - for(U64 off = 0; off < data.size; idx += 1) - { - U64 start_off = off; - String8 string = {0}; - off += str8_deserial_read_cstr(data, off, &string); - dumpf(" {\"%S\"} // string[%I64u], .debug_str@0x%I64x\n", string, idx, start_off); - if(off == start_off) - { - break; - } - } - dumpf("}\n"); - } - } - - ////////////////////////////// - //- rjf: .debug_frame - // -#if 0 - DumpSubset(Frame) - { - // TODO(rjf) - } -#endif - - ////////////////////////////// - //- rjf: .debug_loc - // -#if 0 - DumpSubset(Loc) - { - // TODO(rjf) - } -#endif - - ////////////////////////////// - //- rjf: join results - // - String8List *result_strings_ptr = push_array(scratch.arena, String8List, 1); - lane_sync(); - if(lane_idx() == 0) - { - for EachNode(n, DumpSubsetOutputNode, first_output_node) - { - String8List subset_strings = {0}; - for EachIndex(idx, lane_count()) - { - str8_list_concat_in_place(&subset_strings, &n->lane_strings[idx]); - } - if(subset_strings.total_size != 0) - { - str8_list_pushf(arena, result_strings_ptr, "////////////////////////////////\n//~ %S\n", dw_regular_name_from_section_kind(n->section_kind)); - str8_list_concat_in_place(result_strings_ptr, &subset_strings); - str8_list_pushf(arena, result_strings_ptr, "\n"); - } - } - } - lane_sync(); - lane_sync_u64(&result_strings_ptr, 0); - String8List result_strings = *result_strings_ptr; - lane_sync(); - -#undef DumpSubsetKind -#undef DumpSubset -#undef dump -#undef dumpf - scratch_end(scratch); - ProfEnd(); - return result_strings; -} diff --git a/src/dwarf/dwarf_dump_2.h b/src/dwarf/dwarf_dump_2.h deleted file mode 100644 index 620c7562..00000000 --- a/src/dwarf/dwarf_dump_2.h +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DWARF_DUMP_2_H -#define DWARF_DUMP_2_H - -//////////////////////////////// -//~ rjf: Helpers - -internal String8List dw_dump_list_from_expr(Arena *arena, String8 data, Arch arch, DW2_ParseCtx *ctx); - -//////////////////////////////// -//~ rjf: Main Dump Entry Point - -internal String8List dw_dump_list_from_raw(Arena *arena, DW_Raw *raw, Arch arch, DW_SectionFlags subset_flags); - -#endif //DWARF_DUMP_2_H diff --git a/src/dwarf/dwarf_expr.c b/src/dwarf/dwarf_expr.c index 8f8e23ac..3e3d6397 100644 --- a/src/dwarf/dwarf_expr.c +++ b/src/dwarf/dwarf_expr.c @@ -1,1580 +1,393 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal DW_PieceNode * -dw_piece_list_push(Arena *arena, DW_PieceList *list, DW_Piece v) -{ - DW_PieceNode *n = push_array(arena, DW_PieceNode, 1); - n->v = v; - SLLQueuePush(list->first, list->last, n); - list->count += 1; - return n; -} +//////////////////////////////// +//~ rjf: Expression Evaluation Functions -internal DW_ExprValueType -dw_expr_unsigned_value_type_from_bit_size(U64 bit_size) +internal DW_Eval +dw_eval(Arena *arena, DW_Format fmt, Arch arch, MemoryMap *memory_map, void *regs, U64 frame_base, U64 cfa, U64 tls, DW_EvalState *state, String8 expr, U64 op_idx_cap) { - switch (bit_size) { - case 8: return DW_ExprValueType_U8; - case 16: return DW_ExprValueType_U16; - case 32: return DW_ExprValueType_U32; - case 64: return DW_ExprValueType_U64; - case 128: return DW_ExprValueType_U128; - case 256: return DW_ExprValueType_U256; - case 512: return DW_ExprValueType_U512; - } - AssertAlways(0 && "no suitable unsigned type was found for the specified size"); - return DW_ExprValueType_Generic; -} - -internal DW_ExprValueType -dw_expr_signed_value_type_from_bit_size(U64 bit_size) -{ - switch (bit_size) { - case 8: return DW_ExprValueType_S8; - case 16: return DW_ExprValueType_S16; - case 32: return DW_ExprValueType_S32; - case 64: return DW_ExprValueType_S64; - case 128: return DW_ExprValueType_S128; - case 256: return DW_ExprValueType_S256; - case 512: return DW_ExprValueType_S512; - } - AssertAlways(0 && "no suitable signed type was found for the specified size"); - return DW_ExprValueType_Generic; -} - -internal DW_ExprValueType -dw_expr_float_type_from_bit_size(U64 bit_size) -{ - switch (bit_size) { - case 4: return DW_ExprValueType_F32; - case 8: return DW_ExprValueType_F64; - } - AssertAlways(0 && "no suitable type was found for the specified size"); - return DW_ExprValueType_Generic; -} - -internal U64 -dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k) -{ - switch (k) { - default: { InvalidPath; } - case DW_ExprValueType_Generic: return 0; - case DW_ExprValueType_Addr: return addr_size; - case DW_ExprValueType_U8: return 1; - case DW_ExprValueType_U16: return 2; - case DW_ExprValueType_U32: return 4; - case DW_ExprValueType_U64: return 8; - case DW_ExprValueType_U128: return 16; - case DW_ExprValueType_U256: return 32; - case DW_ExprValueType_U512: return 64; - case DW_ExprValueType_S8: return 1; - case DW_ExprValueType_S16: return 2; - case DW_ExprValueType_S32: return 4; - case DW_ExprValueType_S64: return 8; - case DW_ExprValueType_S128: return 16; - case DW_ExprValueType_S256: return 32; - case DW_ExprValueType_S512: return 64; - case DW_ExprValueType_F32: return 4; - case DW_ExprValueType_F64: return 8; - } -} - -internal DW_ExprValueType -dw_expr_pick_common_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs) -{ - if (lhs == rhs) { - return lhs; - } - // unsigned vs unsigned - else if (DW_ExprValueType_IsUnsigned(lhs) && DW_ExprValueType_IsUnsigned(rhs)) { - return Max(lhs, rhs); - } - // signed vs signed - else if (DW_ExprValueType_IsSigned(lhs) && DW_ExprValueType_IsSigned(rhs)) { - return Max(lhs, rhs); - } - // (unsigned vs signed) || (signed vs unsigned) - else if ((DW_ExprValueType_IsUnsigned(lhs) && DW_ExprValueType_IsSigned(rhs)) || - (DW_ExprValueType_IsSigned(lhs) && DW_ExprValueType_IsUnsigned(rhs))) { - U64 lhs_size = dw_expr_byte_size_from_value_type(0, lhs); - U64 rhs_size = dw_expr_byte_size_from_value_type(0, rhs); - if (lhs_size < rhs_size) { - return rhs; - } else if (lhs > rhs_size) { - return lhs; - } else { - return dw_expr_unsigned_value_type_from_bit_size(lhs_size * 8); - } - } - // float vs int - else if (DW_ExprValueType_IsFloat(lhs) && DW_ExprValueType_IsInt(rhs)) { - return lhs; - } - // int vs float - else if (DW_ExprValueType_IsInt(lhs) && DW_ExprValueType_IsFloat(rhs)) { - return rhs; - } - // float vs float - else if (DW_ExprValueType_IsFloat(lhs) && DW_ExprValueType_IsFloat(rhs)) { - return Max(lhs, rhs); - } - // address vs int - else if (lhs == DW_ExprValueType_Addr && DW_ExprValueType_IsInt(rhs)) { - return DW_ExprValueType_Addr; - } - // int vs address - else if (DW_ExprValueType_IsInt(lhs) && rhs == DW_ExprValueType_Addr) { - return DW_ExprValueType_Addr; - } - // address vs float - else if (lhs == DW_ExprValueType_Addr && DW_ExprValueType_IsFloat(rhs)) { - return DW_ExprValueType_Generic; - } - // float vs address - else if (DW_ExprValueType_IsFloat(lhs) && rhs == DW_ExprValueType_Addr) { - return DW_ExprValueType_Generic; - } - // no conversion for implicit value - else if (lhs == DW_ExprValueType_Implicit || rhs == DW_ExprValueType_Implicit) { - return DW_ExprValueType_Generic; - } - AssertAlways(!"undefined conversion case"); - return DW_ExprValueType_Generic; -} - -internal DW_ExprValueType -dw_expr_pick_common_compar_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs) -{ - DW_ExprValueType result; - if (lhs == DW_ExprValueType_Generic || rhs == DW_ExprValueType_Generic) { - result = DW_ExprValueType_S64; - } else { - result = dw_expr_pick_common_value_type(lhs, rhs); - } - return result; -} - -internal DW_ExprValue -dw_expr_cast(DW_ExprValue value, DW_ExprValueType type) -{ - DW_ExprValue result = { type }; - -#define CastTable(f, t) \ -switch (value.type) { \ -case DW_ExprValueType_Generic: { MemoryCopy(&result.f, value.generic.str, Min(sizeof(t), value.generic.size)); } break; \ -case DW_ExprValueType_U8: { result.f = (t)value.u8; } break; \ -case DW_ExprValueType_U16: { result.f = (t)value.u16; } break; \ -case DW_ExprValueType_U32: { result.f = (t)value.u32; } break; \ -case DW_ExprValueType_U64: { result.f = (t)value.u64; } break; \ -case DW_ExprValueType_U128: { NotImplemented; } break; \ -case DW_ExprValueType_U256: { NotImplemented; } break; \ -case DW_ExprValueType_U512: { NotImplemented; } break; \ -case DW_ExprValueType_S8: { result.f = (t)value.s8; } break; \ -case DW_ExprValueType_S16: { result.f = (t)value.s16; } break; \ -case DW_ExprValueType_S32: { result.f = (t)value.s32; } break; \ -case DW_ExprValueType_S64: { result.f = (t)value.s64; } break; \ -case DW_ExprValueType_S128: { NotImplemented; } break; \ -case DW_ExprValueType_S256: { NotImplemented; } break; \ -case DW_ExprValueType_S512: { NotImplemented; } break; \ -case DW_ExprValueType_F32: { result.f = (t)value.f32; } break; \ -case DW_ExprValueType_F64: { result.f = (t)value.f64; } break; \ -case DW_ExprValueType_Addr: { result.f = (t)value.addr; } break; \ -case DW_ExprValueType_Implicit: { InvalidPath; } break; \ -case DW_ExprValueType_Bool: { result.f = (t)value.boolean; } break; \ -default: { InvalidPath; } break; \ -} - - switch (type) { - case DW_ExprValueType_Generic: {} break; - case DW_ExprValueType_U8: { CastTable(u8, U8); } break; - case DW_ExprValueType_U16: { CastTable(u16, U16); } break; - case DW_ExprValueType_U32: { CastTable(u32, U32); } break; - case DW_ExprValueType_U64: { CastTable(u64, U64); } break; - case DW_ExprValueType_U128: { NotImplemented; } break; - case DW_ExprValueType_U256: { NotImplemented; } break; - case DW_ExprValueType_U512: { NotImplemented; } break; - case DW_ExprValueType_S8: { CastTable(s8, S8); } break; - case DW_ExprValueType_S16: { CastTable(s16, S16); } break; - case DW_ExprValueType_S32: { CastTable(s32, S32); } break; - case DW_ExprValueType_S64: { CastTable(s64, S64); } break; - case DW_ExprValueType_S128: { NotImplemented; } break; - case DW_ExprValueType_S256: { NotImplemented; } break; - case DW_ExprValueType_S512: { NotImplemented; } break; - case DW_ExprValueType_F32: { CastTable(f32, F32); } break; - case DW_ExprValueType_F64: { CastTable(f64, F64); } break; - case DW_ExprValueType_Addr: { CastTable(addr, U64); } break; - case DW_ExprValueType_Implicit: { NotImplemented; } break; - case DW_ExprValueType_Bool: { CastTable(boolean, DW_ExprBool); } break; - } - -#undef CastTable - return result; -} - -internal DW_ExprValue -dw_expr_add(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 + common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 + common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 + common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 + common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 + common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 + common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 + common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 + common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 + common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 + common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr + common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - return result; -} - -internal DW_ExprValue -dw_expr_minus(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 - common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 - common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 - common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 - common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 - common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 - common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 - common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 - common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 - common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 - common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr - common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - return result; -} - -internal DW_ExprValue -dw_expr_mul(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 * common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 * common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 * common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 * common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 * common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 * common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 * common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 * common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 * common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 * common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr * common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - return result; -} - -internal DW_ExprValue -dw_expr_div(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 / common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 / common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 / common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 / common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 / common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 / common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 / common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 / common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 / common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 / common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr / common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - return result; -} - -internal DW_ExprValue -dw_expr_mod(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 % common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 % common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 % common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 % common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 % common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 % common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 % common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 % common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr % common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - return result; -} - -internal DW_ExprValue -dw_expr_eq(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 == common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 == common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 == common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 == common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 == common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 == common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 == common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 == common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 == common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 == common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr == common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_ge(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >= common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >= common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >= common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >= common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >= common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >= common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >= common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >= common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 >= common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 >= common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >= common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_gt(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 > common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 > common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 > common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 > common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 > common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 > common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 > common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 > common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 > common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 > common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr > common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_le(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 <= common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 <= common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 <= common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 <= common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 <= common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 <= common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 <= common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 <= common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 <= common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 <= common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr <= common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_lt(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 < common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 < common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 < common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 < common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 < common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 < common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 < common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 < common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 < common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 < common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr < common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_ne(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 != common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 != common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 != common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 != common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 != common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 != common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 != common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 != common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = common_lhs.f32 != common_rhs.f32; } break; - case DW_ExprValueType_F64: { result.f64 = common_lhs.f64 != common_rhs.f64; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr != common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_xor(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 ^ common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 ^ common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 ^ common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 ^ common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 ^ common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 ^ common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 ^ common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 ^ common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr ^ common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_and(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 & common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 & common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 & common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 & common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 & common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 & common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 & common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 & common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr & common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_or(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 | common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 | common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 | common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 | common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 | common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 | common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 | common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 | common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr | common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_shl(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 << common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 << common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 << common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 << common_rhs.u64; } break; - - case DW_ExprValueType_U128: - case DW_ExprValueType_U256: - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 << common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 << common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 << common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 << common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr << common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_shr(DW_ExprValue rhs, DW_ExprValue lhs) -{ - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = common_lhs.u8 >> common_rhs.u8; } break; - case DW_ExprValueType_U16: { result.u16 = common_lhs.u16 >> common_rhs.u16; } break; - case DW_ExprValueType_U32: { result.u32 = common_lhs.u32 >> common_rhs.u32; } break; - case DW_ExprValueType_U64: { result.u64 = common_lhs.u64 >> common_rhs.u64; } break; - - case DW_ExprValueType_U128: { NotImplemented; } break; - case DW_ExprValueType_U256: { NotImplemented; } break; - case DW_ExprValueType_U512: { NotImplemented; } break; - - case DW_ExprValueType_Bool: { InvalidPath; } break; - case DW_ExprValueType_S8: { InvalidPath; } break; - case DW_ExprValueType_S16: { InvalidPath; } break; - case DW_ExprValueType_S32: { InvalidPath; } break; - case DW_ExprValueType_S64: { InvalidPath; } break; - case DW_ExprValueType_S128: { InvalidPath; } break; - case DW_ExprValueType_S256: { InvalidPath; } break; - case DW_ExprValueType_S512: { InvalidPath; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_shra(DW_ExprValue rhs, DW_ExprValue lhs) -{ - if (DW_ExprValueType_IsUnsigned(lhs.type)) { - DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, lhs.type) * 8); - lhs = dw_expr_cast(lhs, new_type); - } - - if (DW_ExprValueType_IsUnsigned(rhs.type)) { - DW_ExprValueType new_type = dw_expr_signed_value_type_from_bit_size(dw_expr_byte_size_from_value_type(0, rhs.type) * 8); - rhs = dw_expr_cast(rhs, new_type); - } - - DW_ExprValue result = {0}; - result.type = dw_expr_pick_common_compar_value_type(lhs.type, rhs.type); - - DW_ExprValue common_lhs = dw_expr_cast(lhs, result.type); - DW_ExprValue common_rhs = dw_expr_cast(rhs, result.type); - - switch (result.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { InvalidPath; } break; - case DW_ExprValueType_U16: { InvalidPath; } break; - case DW_ExprValueType_U32: { InvalidPath; } break; - case DW_ExprValueType_U64: { InvalidPath; } break; - case DW_ExprValueType_U128: { InvalidPath; } break; - case DW_ExprValueType_U256: { InvalidPath; } break; - case DW_ExprValueType_U512: { InvalidPath; } break; - - case DW_ExprValueType_Bool: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; - case DW_ExprValueType_S8: { result.s8 = common_lhs.s8 >> common_rhs.s8; } break; - case DW_ExprValueType_S16: { result.s16 = common_lhs.s16 >> common_rhs.s16; } break; - case DW_ExprValueType_S32: { result.s32 = common_lhs.s32 >> common_rhs.s32; } break; - case DW_ExprValueType_S64: { result.s64 = common_lhs.s64 >> common_rhs.s64; } break; - - case DW_ExprValueType_S128: - case DW_ExprValueType_S256: - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { InvalidPath; } break; - case DW_ExprValueType_F64: { InvalidPath; } break; - case DW_ExprValueType_Addr: { result.addr = common_lhs.addr >> common_rhs.addr; } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - - default: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_abs(DW_ExprValue value) -{ - DW_ExprValue result = value; - - switch (value.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: {}; break; - case DW_ExprValueType_U16: {}; break; - case DW_ExprValueType_U32: {}; break; - case DW_ExprValueType_U64: {}; break; - case DW_ExprValueType_U128: {}; break; - case DW_ExprValueType_U256: {}; break; - case DW_ExprValueType_U512: {}; break; - - case DW_ExprValueType_S8: { result.s8 = abs_s64(result.s8); } break; - case DW_ExprValueType_S16: { result.s16 = abs_s64(result.s16); } break; - case DW_ExprValueType_S32: { result.s32 = abs_s64(result.s32); } break; - case DW_ExprValueType_S64: { result.s64 = abs_s64(result.s64); } break; - case DW_ExprValueType_S128: { NotImplemented; } break; - case DW_ExprValueType_S256: { NotImplemented; } break; - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = abs_f32(result.f32); } break; - case DW_ExprValueType_F64: { result.f64 = abs_f64(result.f64); } break; - - case DW_ExprValueType_Addr: {} break; - case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_neg(DW_ExprValue value) -{ - DW_ExprValue result = value; - - switch (value.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = -result.u8; }; break; - case DW_ExprValueType_U16: { result.u16 = -result.u16; }; break; - case DW_ExprValueType_U32: { result.u32 = -result.u32; }; break; - case DW_ExprValueType_U64: { result.u64 = -result.u64; }; break; - case DW_ExprValueType_U128: { NotImplemented; }; break; - case DW_ExprValueType_U256: { NotImplemented; }; break; - case DW_ExprValueType_U512: { NotImplemented; }; break; - - case DW_ExprValueType_S8: { result.s8 = -result.s8; } break; - case DW_ExprValueType_S16: { result.s16 = -result.s16; } break; - case DW_ExprValueType_S32: { result.s32 = -result.s32; } break; - case DW_ExprValueType_S64: { result.s64 = -result.s64; } break; - case DW_ExprValueType_S128: { NotImplemented; } break; - case DW_ExprValueType_S256: { NotImplemented; } break; - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = -result.f32; } break; - case DW_ExprValueType_F64: { result.f64 = -result.f64; } break; - - case DW_ExprValueType_Addr: { result.addr = -result.addr; } break; - case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - } - - return result; -} - -internal DW_ExprValue -dw_expr_not(DW_ExprValue value) -{ - DW_ExprValue result = value; - - switch (value.type) { - case DW_ExprValueType_Generic: { InvalidPath; } break; - - case DW_ExprValueType_U8: { result.u8 = !result.u8; }; break; - case DW_ExprValueType_U16: { result.u16 = !result.u16; }; break; - case DW_ExprValueType_U32: { result.u32 = !result.u32; }; break; - case DW_ExprValueType_U64: { result.u64 = !result.u64; }; break; - case DW_ExprValueType_U128: { NotImplemented; }; break; - case DW_ExprValueType_U256: { NotImplemented; }; break; - case DW_ExprValueType_U512: { NotImplemented; }; break; - - case DW_ExprValueType_S8: { result.s8 = !result.s8; } break; - case DW_ExprValueType_S16: { result.s16 = !result.s16; } break; - case DW_ExprValueType_S32: { result.s32 = !result.s32; } break; - case DW_ExprValueType_S64: { result.s64 = !result.s64; } break; - case DW_ExprValueType_S128: { NotImplemented; } break; - case DW_ExprValueType_S256: { NotImplemented; } break; - case DW_ExprValueType_S512: { NotImplemented; } break; - - case DW_ExprValueType_F32: { result.f32 = !result.f32; } break; - case DW_ExprValueType_F64: { result.f64 = !result.f64; } break; - - case DW_ExprValueType_Addr: { result.addr = !result.addr; } break; - case DW_ExprValueType_Bool: { result.boolean = abs_s64(result.boolean); } break; - case DW_ExprValueType_Implicit: { InvalidPath; } break; - } - - return result; -} - -internal String8 -dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v) -{ - String8 s = {0}; - switch (v.type) { - case DW_ExprValueType_Generic: { } break; - case DW_ExprValueType_U8: { s = str8_struct(&v.u8); } break; - case DW_ExprValueType_U16: { s = str8_struct(&v.u16); } break; - case DW_ExprValueType_U32: { s = str8_struct(&v.u32); } break; - case DW_ExprValueType_U64: { s = str8_struct(&v.u64); } break; - case DW_ExprValueType_U128: { s = str8_struct(&v.u128); } break; - case DW_ExprValueType_U256: { s = str8_struct(&v.u256); } break; - case DW_ExprValueType_U512: { s = str8_struct(&v.u512); } break; - case DW_ExprValueType_S8: { s = str8_struct(&v.s8); } break; - case DW_ExprValueType_S16: { s = str8_struct(&v.s16); } break; - case DW_ExprValueType_S32: { s = str8_struct(&v.s32); } break; - case DW_ExprValueType_S64: { s = str8_struct(&v.s64); } break; - case DW_ExprValueType_F32: { s = str8_struct(&v.f32); } break; - case DW_ExprValueType_F64: { s = str8_struct(&v.f64); } break; - case DW_ExprValueType_Addr: { s = str8((U8 *)&v.addr, addr_size); } break; - case DW_ExprValueType_Implicit: { s = v.implicit; } break; - default: { NotImplemented; } break; - } - return str8_copy(arena, s); -} - -internal DW_ExprValueNode * -dw_expr_stack_push(Arena *arena, DW_ExprStack *stack, DW_ExprValue value) -{ - DW_ExprValueNode *n = push_array(arena, DW_ExprValueNode, 1); - n->v = value; - SLLStackPush(stack->top, n); - stack->count += 1; - return n; -} - -internal DW_ExprValueNode * -dw_expr_stack_push_unsigned(Arena *arena, DW_ExprStack *stack, void *value, U64 value_size) -{ - DW_ExprValueNode *n = 0; - switch (value_size) { - case 0: {} break; - case 1: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = *(U8 *)value }); } break; - case 2: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = *(U16 *)value }); } break; - case 4: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = *(U32 *)value }); } break; - case 8: { n = dw_expr_stack_push(arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = *(U64 *)value }); } break; - default: { NotImplemented; } break; - } - return n; -} - -internal DW_ExprValue -dw_expr_stack_pop(DW_ExprStack *stack) -{ - DW_ExprValueNode *n = stack->top; - DW_ExprValue v = n->v; - SLLStackPop(stack->top); - return v; -} - -internal DW_ExprValue -dw_expr_stack_peek(DW_ExprStack *stack) -{ - return stack->top->v; -} - -internal DW_ExprValueNode * -dw_expr_stack_pick(DW_ExprStack *stack, U64 idx) -{ - DW_ExprValueNode *n = 0; - if (idx < stack->count) { - U64 c = idx; - for (n = stack->top; n != 0 && c > 0; n = n->next, c -= 1); - } - return n; -} - -internal DW_ExprInst * -dw_expr_inst_from_delta(DW_ExprInst *inst, S16 delta) -{ - B32 skip_fwd = inst->operands[0].s16 >= 0; - DW_ExprInst *i = inst; - U16 u_delta = abs_s64(inst->operands[0].s16); - U64 cursor = 0; - for (i = skip_fwd ? inst : inst->prev; i != 0 && cursor < u_delta; i = skip_fwd ? inst->next : inst->prev) { - cursor += inst->size; - } - if (cursor != u_delta) { - i = 0; - } - return i; -} - -internal DW_ExprEvalResult -dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls, U64 exec_op_limit, DW_Expr expr, void *reg_block, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out) -{ - Temp scratch = scratch_begin(&arena, 1); - + DW_Eval result = {0}; ARCH_Info *arch_info = arch_info_from_arch(arch); - - DW_ExprEvalResult result = DW_ExprEvalResult_Fail; - DW_PieceList pieces = {0}; - DW_ExprStack *stack = push_array(scratch.arena, DW_ExprStack, 1); - U64 exec_op_count = 0; - - for EachNode(inst, DW_ExprInst, expr.first) { - again:; + B32 need_a_break = 0; + B32 done = 0; + for(;state->off < expr.size && !need_a_break && !done;) + { + U64 start_off = state->off; + U64 off = state->off; - exec_op_count += 1; - if (exec_op_count > exec_op_limit) { - Assert(0 && "reached opcode exec limit on the expression"); - result = DW_ExprEvalResult_ExecOpLimitReached; - goto exit; + //- rjf: too many ops? -> error + if(state->op_idx >= op_idx_cap) + { + result.status = DW_EvalStatus_ExecOpLimitReached; + break; } - U64 pop_count = dw_pop_count_from_expr_op(inst->opcode); - if (pop_count > stack->count) { - Assert(0 && "not enough values on the stack to evaluate the instruction"); - goto exit; + //- rjf: read next opcode + DW_ExprOp opcode = 0; + off += str8_deserial_read_struct(expr, off, &opcode); + + //- rjf: unpack opcode + U8 push_count = 0; + U8 pop_count = 0; + U8 operand_count = 0; + DW_ExprOperandKind operand_kinds[2] = {DW_ExprOperandKind_Null}; + { + DW_ExprOpInfo *op_info = dw_info_from_expr_op(DW_Version_5, DW_ExtFlag_All, opcode); + push_count = op_info->push_count; + pop_count = op_info->pop_count; + operand_count = op_info->operand_count; + MemoryCopy(operand_kinds, op_info->operand_kinds, sizeof(operand_kinds)); } - switch (inst->opcode) { - case DW_ExprOp_Nop: {} break; - - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->opcode - DW_ExprOp_Lit0 }); - } break; - - case DW_ExprOp_Const1U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U8, .u8 = inst->operands[0].u8 }); } break; - case DW_ExprOp_Const2U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U16, .u16 = inst->operands[0].u16 }); } break; - case DW_ExprOp_Const4U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U32, .u32 = inst->operands[0].u32 }); } break; - case DW_ExprOp_Const8U: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; - case DW_ExprOp_Const1S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S8, .s8 = inst->operands[0].s8 }); } break; - case DW_ExprOp_Const2S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S16, .s16 = inst->operands[0].s16 }); } break; - case DW_ExprOp_Const4S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S32, .s32 = inst->operands[0].s32 }); } break; - case DW_ExprOp_Const8S: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; - case DW_ExprOp_ConstU: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }); } break; - case DW_ExprOp_ConstS: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_S64, .s64 = inst->operands[0].s64 }); } break; - case DW_ExprOp_Addr: { dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = inst->operands[0].u64 }); } break; - - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + //- rjf: read operands + DW_EvalVal operands[2] = {0}; + for(U8 operand_idx = 0; operand_idx < operand_count; operand_idx += 1) + { + U64 fixed_bytes_to_read = 0; + switch(operand_kinds[operand_idx]) { - DW_Reg reg_dw_id = inst->opcode - DW_ExprOp_Reg0; - U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); - ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); - Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; - U8 *reg_value = push_array(scratch.arena, U8, reg_size); - if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), reg_value)) + default:{}break; + case DW_ExprOperandKind_U8: {fixed_bytes_to_read = 1;}goto fixed_read; + case DW_ExprOperandKind_U16: {fixed_bytes_to_read = 2;}goto fixed_read; + case DW_ExprOperandKind_U32: {fixed_bytes_to_read = 4;}goto fixed_read; + case DW_ExprOperandKind_U64: {fixed_bytes_to_read = 8;}goto fixed_read; + case DW_ExprOperandKind_S8: {fixed_bytes_to_read = 1;}goto fixed_read; + case DW_ExprOperandKind_S16: {fixed_bytes_to_read = 2;}goto fixed_read; + case DW_ExprOperandKind_S32: {fixed_bytes_to_read = 4;}goto fixed_read; + case DW_ExprOperandKind_S64: {fixed_bytes_to_read = 8;}goto fixed_read; + case DW_ExprOperandKind_Addr: {fixed_bytes_to_read = byte_size_from_arch(arch);}goto fixed_read; + case DW_ExprOperandKind_DwarfUInt:{fixed_bytes_to_read = dw_addr_size_from_format(fmt);}goto fixed_read; + fixed_read:; { - goto exit; + off += str8_deserial_read(expr, off, &operands[operand_idx].u512.u64[0], fixed_bytes_to_read, fixed_bytes_to_read); + }break; + case DW_ExprOperandKind_ULEB128: + { + off += str8_deserial_read_uleb128(expr, off, &operands[operand_idx].u512.u64[0]); + }break; + case DW_ExprOperandKind_SLEB128: + { + off += str8_deserial_read_sleb128(expr, off, &operands[operand_idx].s64); + }break; + case DW_ExprOperandKind_Block: + { + U8 block_size = 0; + off += str8_deserial_read_struct(expr, off, &block_size); + operands[operand_idx].data = str8_prefix(str8_skip(expr, off), block_size); + }break; + } + } + + //- rjf: do pops + DW_EvalVal popped_vals[3] = {0}; + { + pop_count = Min(pop_count, ArrayCount(popped_vals)); + for(U8 pop_idx = 0; pop_idx < pop_count; pop_idx += 1) + { + if(state->top_val != 0) + { + DW_EvalValNode *popped = state->top_val; + SLLStackPop(state->top_val); + popped_vals[pop_idx] = popped->v; + SLLStackPush(state->free_val, popped); } - dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); + } + } + + //- rjf: apply opcode + DW_EvalVal push_vals[3] = {0}; + U64 pick_target_idx = 0; + U64 deref_read_size = 0; + DW_RegCode reg_code_dw = 0; + switch(opcode) + { + //- rjf: unsuported ops + case DW_ExprOp_Call2: // DWARF function calls + case DW_ExprOp_Call4: // DWARF function calls + case DW_ExprOp_CallRef: // DWARF function calls + case DW_ExprOp_Addrx: // address in .debug_addr; not currently present for us, need to find how to preserve if we care + case DW_ExprOp_Constx: // address in .debug_addr; not currently present for us, need to find how to preserve if we care + case DW_ExprOp_EntryValue: // encodes a sub-expression as a data block - need to recursively evaluate, lol + case DW_ExprOp_ConstType: // pushes a constant - but refers into DWARF debug info to specify the type. we don't have that, need to figure out how to preserve mapping from DW type ID -> RDI type, if we care + case DW_ExprOp_DerefType: // same as above - refers to DWARF debug info + case DW_ExprOp_RegvalType: // same as above - refers to DWARF debug info + case DW_ExprOp_Piece: // pieces - used to stitch multiple sub-values together + case DW_ExprOp_BitPiece: // pieces - used to stitch multiple sub-values together + case DW_ExprOp_XDeref: // two entries popped from stack - second one is 'address space identifier'. not possible in this layer right now + case DW_ExprOp_XDerefSize: // does multiple address spaces + case DW_ExprOp_XDerefType: // refers to DWARF debug info, *and* does multiple address spaces + case DW_ExprOp_PushObjectAddress: // pushes "the address of the object currently being evaluated" ??? + case DW_ExprOp_ImplicitPointer: // refers to DWARF debug info + default: + { + done = 1; + result.status = DW_EvalStatus_UnsupportedOp; }break; - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + //- rjf: address ops + case DW_ExprOp_Deref:{deref_read_size = byte_size_from_arch(arch);}goto deref; + case DW_ExprOp_DerefSize:{deref_read_size = operands[0].u512.u64[0];}goto deref; + deref:; { - DW_Reg reg_dw_id = inst->opcode - DW_ExprOp_BReg0; - U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); - ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); - Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; - AssertAlways(reg_size <= byte_size_from_arch(arch)); - - U64 reg_value = 0; - if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), ®_value)) + U64 vaddr = popped_vals[0].u512.u64[0]; + U64 read_size = Min(deref_read_size, sizeof(push_vals[0].u512)); + Rng1U64 read_vaddr_range = r1u64(vaddr, vaddr+read_size); + if(!memory_map_read(memory_map, read_vaddr_range, &push_vals[0].u512)) { - goto exit; + need_a_break = 1; + result.status = DW_EvalStatus_FailedMemoryRead; + result.missed_read_vaddr_range = read_vaddr_range; } - - U64 addr = (U64)((S64)reg_value + inst->operands[0].s64); - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); }break; + //- rjf: generic constants + case DW_ExprOp_Const1U: case DW_ExprOp_Const1S: + case DW_ExprOp_Const2U: case DW_ExprOp_Const2S: + case DW_ExprOp_Const4U: case DW_ExprOp_Const4S: + case DW_ExprOp_Const8U: case DW_ExprOp_Const8S: + case DW_ExprOp_ConstU: case DW_ExprOp_ConstS: + case DW_ExprOp_Addr: + { + push_vals[0] = operands[0]; + }break; + + //- rjf: stack ops + case DW_ExprOp_Dup:{push_vals[0] = popped_vals[0];}break; + case DW_ExprOp_Drop:{/* NOTE(rjf): nothing to do here - just pops */}break; + case DW_ExprOp_Swap:{push_vals[0] = popped_vals[1]; push_vals[1] = popped_vals[0];}break; + case DW_ExprOp_Rot: {push_vals[0] = popped_vals[0]; push_vals[1] = popped_vals[1]; push_vals[2] = popped_vals[2];}break; + case DW_ExprOp_Over:{pick_target_idx = 1;}break; + case DW_ExprOp_Pick:{pick_target_idx = operands[0].u512.u64[0];}goto pick_stack_val; + pick_stack_val:; + { + U64 idx = 0; + for(DW_EvalValNode *n = state->top_val; n != 0; n = n->next, idx += 1) + { + if(idx == pick_target_idx) + { + push_vals[0] = n->v; + break; + } + } + }break; + + //- rjf: arithmetic ops +#define UniOpU(k, op) case k:{push_vals[0].u512.u64[0] = op(popped_vals[0].u512.u64[0]);}break +#define UniOpS(k, op) case k:{push_vals[0].s64 = op(popped_vals[0].s64);}break +#define BinOpS(k, op) case k:{push_vals[0].s64 = popped_vals[1].s64 op popped_vals[0].s64;}break +#define BinOpU(k, op) case k:{push_vals[0].u512.u64[0] = popped_vals[1].u512.u64[0] op popped_vals[0].u512.u64[0];}break +#define BinOpDiv(k, op) case k:if(popped_vals[0].u512.u64[0] != 0){push_vals[0].u512.u64[0] = popped_vals[1].u512.u64[0] op popped_vals[0].u512.u64[0];}break + UniOpS(DW_ExprOp_Abs, abs_s64); + UniOpS(DW_ExprOp_Neg, -); + UniOpU(DW_ExprOp_Not, !); + BinOpU(DW_ExprOp_Minus, -); + BinOpU(DW_ExprOp_Mul, *); + BinOpU(DW_ExprOp_Plus, +); + BinOpU(DW_ExprOp_Shl, <<); + BinOpU(DW_ExprOp_Shr, >>); + BinOpU(DW_ExprOp_And, &); + BinOpU(DW_ExprOp_Or, |); + BinOpU(DW_ExprOp_Xor, ^); + BinOpS(DW_ExprOp_Shra, >>); + BinOpDiv(DW_ExprOp_Div, /); + BinOpDiv(DW_ExprOp_Mod, %); + BinOpU(DW_ExprOp_Eq, ==); + BinOpU(DW_ExprOp_Ne, !=); + BinOpS(DW_ExprOp_Ge, >=); + BinOpS(DW_ExprOp_Gt, >); + BinOpS(DW_ExprOp_Le, <=); + BinOpS(DW_ExprOp_Lt, <); +#undef UniOpU +#undef UniOpS +#undef BinOpS +#undef BinOpU +#undef BinOpDiv + case DW_ExprOp_PlusUConst: + { + push_vals[0].u512.u64[0] = popped_vals[0].u512.u64[0] + operands[0].u512.u64[0]; + }break; + + //- rjf: jumps/branches + case DW_ExprOp_Bra: + { + if(popped_vals[0].u512.u64[0] == 0) + { + break; + } + } // fallthrough + case DW_ExprOp_Skip: + { + S64 jump_delta = operands[0].s64; + if((jump_delta < 0 && -jump_delta > off) || (off + jump_delta >= expr.size)) + { + done = 1; + result.status = DW_EvalStatus_Error; + } + else + { + off += jump_delta; + } + }break; + + //- rjf: literals + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: case DW_ExprOp_Lit3: + case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: + case DW_ExprOp_Lit8: case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: case DW_ExprOp_Lit15: + case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: + case DW_ExprOp_Lit20: case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: case DW_ExprOp_Lit27: + case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: + { + U8 val = (opcode - DW_ExprOp_Lit0); + push_vals[0].u512.u8[0] = val; + }break; + + //- rjf: register reads (opcode-encoded reg) + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: case DW_ExprOp_Reg3: + case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: + case DW_ExprOp_Reg8: case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: case DW_ExprOp_Reg15: + case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: + case DW_ExprOp_Reg20: case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: case DW_ExprOp_Reg27: + case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + {reg_code_dw = (opcode - DW_ExprOp_Reg0);}goto reg_read; case DW_ExprOp_RegX: + {reg_code_dw = operands[0].u512.u64[0];}goto reg_read; + reg_read:; { - DW_Reg reg_dw_id = inst->operands[0].u64; - U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); - U8 *reg_value = push_array(scratch.arena, U8, reg_size); - ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_code_dw); Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; - if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), reg_value)) - { - goto exit; - } - dw_expr_stack_push_unsigned(scratch.arena, stack, reg_value, reg_size); + U64 read_size = dim_1u16(reg_rng); + read_size = Min(read_size, sizeof(push_vals[0].u512)); + reg_rng.max = reg_rng.min + read_size; + arch_reg_block_read_range(arch_info, regs, reg_rng, &push_vals[0].u512); }break; + //- rjf: register reads (opcode-encoded reg + offset) + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: case DW_ExprOp_BReg3: + case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: + case DW_ExprOp_BReg8: case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: case DW_ExprOp_BReg15: + case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: + case DW_ExprOp_BReg20: case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: case DW_ExprOp_BReg27: + case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + {reg_code_dw = (opcode - DW_ExprOp_BReg0);}goto based_reg_read; case DW_ExprOp_BRegX: + {reg_code_dw = operands[0].u512.u64[0];}goto based_reg_read; + based_reg_read:; { - DW_Reg reg_dw_id = (DW_Reg)inst->operands[0].u64; - U64 reg_size = dw_reg_size_from_code(arch, reg_dw_id); - AssertAlways(reg_size <= byte_size_from_arch(arch)); - ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_dw_id); + ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_code_dw); Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; - - U64 reg_value = 0; - if(!arch_reg_block_read_range(arch_info, reg_block, r1u16(reg_rng.min, reg_rng.min + reg_size), ®_value)) - { - goto exit; - } - - U64 addr = (U64)((S64)reg_value + inst->operands[1].s64); - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); + U64 read_size = dim_1u16(reg_rng); + read_size = Min(read_size, sizeof(push_vals[0].u512)); + reg_rng.max = reg_rng.min + read_size; + arch_reg_block_read_range(arch_info, regs, reg_rng, &push_vals[0].u512); + push_vals[0].u512.u64[0] += operands[0].s64; }break; - case DW_ExprOp_FBReg: { - U64 addr = frame_base + inst->operands[0].s64; - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Addr, .addr = addr}); - } break; - - case DW_ExprOp_ImplicitValue: { - if (inst->operands[0].block.size <= sizeof(U512)) { - dw_expr_stack_push_unsigned(scratch.arena, stack, inst->operands[0].block.str, inst->operands[0].block.size); - } else { - NotImplemented; - } - } break; - - case DW_ExprOp_Piece: { - B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); - if (is_undefined) { - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 * 8 }); - } else { - DW_ExprValue top = dw_expr_stack_pop(stack); - - String8 value; - - // piece is a memory reference - if (top.type == DW_ExprValueType_Addr) { - U64 value_size = inst->operands[0].u64; - U8 *value_buffer = push_array(arena, U8, value_size); - MachineOpResult read_result = mem_read(top.addr, value_buffer, value_size, mem_read_ud); - if (read_result != MachineOpResult_Ok) { Assert(0 && "failed to read piece memory referece"); goto exit; } - } - // piece is a value - else { - value = dw_string_from_expr_value(arena, arch, top); - } - - if (inst->operands[0].u64 > value.size) { Assert(0 && "out of bounds size in the piece opcode"); goto exit; } - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64 * 8, .value = value.str }); - } - } break; - - case DW_ExprOp_BitPiece: { - B32 is_undefined = stack->count == 0 || (inst->prev && inst->prev->opcode == DW_ExprOp_Piece); - if (is_undefined) { - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Undefined, .bit_size = inst->operands[0].u64 }); - } else { - String8 value; - if (dw_expr_stack_peek(stack).type == DW_ExprValueType_Addr) { - NotImplemented; - } else { - value = dw_string_from_expr_value(arena, arch, dw_expr_stack_pop(stack)); - } - if (inst->operands[0].u64 > value.size * 8) { Assert(0 && "out of bounds size in piece opcode"); goto exit; } - dw_piece_list_push(arena, &pieces, (DW_Piece){ .kind = DW_PieceKind_Value, .bit_size = inst->operands[0].u64, .value = value.str }); - } - } break; - - case DW_ExprOp_Pick: { - DW_ExprValueNode *src = dw_expr_stack_pick(stack, inst->operands[0].u8); - if (src) { - dw_expr_stack_push(scratch.arena, stack, src->v); - } else { - Assert(0 && "out of bounds stack index"); - goto exit; - } - } break; - - case DW_ExprOp_Over: { - DW_ExprValueNode *src = dw_expr_stack_pick(stack, 1); - if (src) { - dw_expr_stack_push(scratch.arena, stack, src->v); - } else { - Assert(0 && "out of bounds stack index"); - goto exit; - } - } break; - - case DW_ExprOp_PlusUConst: { - DW_ExprValue lhs = dw_expr_stack_pop(stack); - DW_ExprValue rhs = { .type = DW_ExprValueType_U64, .u64 = inst->operands[0].u64 }; - DW_ExprValue sum = dw_expr_add(lhs, rhs); - dw_expr_stack_push(scratch.arena, stack, sum); - } break; - - case DW_ExprOp_Skip: { - DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); - - if (i == 0) { - Assert(0 && "seeking to an invalid offset"); - goto exit; - } - - inst = i; - goto again; - } - - case DW_ExprOp_Bra: { - DW_ExprValue cond = dw_expr_stack_pop(stack); - - if (cond.type != DW_ExprValueType_S16) { - Assert(0 && "unexpected value"); - goto exit; - } - - DW_ExprInst *i = dw_expr_inst_from_delta(inst, inst->operands[0].s16); - - if (i == 0) { - Assert(0 && "seeking to an invalid offset"); - goto exit; - } - - inst = i; - goto again; - } - - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: { - NotImplemented; - } break; - - case DW_ExprOp_GNU_Convert: - case DW_ExprOp_Convert: { - if (inst->operands[0].u64 == 0) { - DW_ExprValue value = dw_expr_stack_pop(stack); - DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); - dw_expr_stack_push(scratch.arena, stack, new_value); - } else { - NotImplemented; - } - } break; - - case DW_ExprOp_Reinterpret: { - if (inst->operands[0].u64 == 0) { - DW_ExprValue value = dw_expr_stack_pop(stack); - DW_ExprValue new_value = dw_expr_cast(value, DW_ExprValueType_Generic); - dw_expr_stack_push(scratch.arena, stack, new_value); - } else { - NotImplemented; - } - } break; - - case DW_ExprOp_GNU_ParameterRef: { NotImplemented; } break; - case DW_ExprOp_GNU_DerefType: { NotImplemented; } break; - case DW_ExprOp_DerefType: { NotImplemented; } break; - case DW_ExprOp_ConstType: { NotImplemented; } break; - case DW_ExprOp_GNU_ConstType: { NotImplemented; } break; - case DW_ExprOp_RegvalType: { NotImplemented; } break; - - case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: + //- rjf: frame base register read + case DW_ExprOp_FBReg: { - DW_Expr entry_value_expr = dw_expr_from_data(scratch.arena, format, byte_size_from_arch(arch), inst->operands[0].block); - DW_ExprValue entry_value; - result = dw_eval_expr(scratch.arena, arch, format, frame_base, cfa, tls, exec_op_limit, entry_value_expr, reg_block, mem_read, mem_read_ud, &entry_value); - if (result != DW_ExprEvalResult_Ok) { goto exit; } - dw_expr_stack_push(scratch.arena, stack, entry_value); - } break; + push_vals[0].u512.u64[0] = (U64)(frame_base + operands[0].s64); + }break; - case DW_ExprOp_Addrx: { NotImplemented; } break; + //- rjf: TLS + case DW_ExprOp_FormTlsAddress: + { + U64 tls_off = popped_vals[0].u512.u64[0]; + U64 tls_addr = tls + tls_off; + push_vals[0].u512.u64[0] = tls_addr; + }break; - case DW_ExprOp_CallFrameCfa: { - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_U64, .u64 = cfa }); - } break; + //- rjf: call frame CFA + case DW_ExprOp_CallFrameCfa: + { + push_vals[0].u512.u64[0] = cfa; + }break; - case DW_ExprOp_PushObjectAddress: { NotImplemented; } break; + //- rjf: implicit location descriptions (value is known, location is not) + case DW_ExprOp_ImplicitValue: + { + push_vals[0] = operands[0]; + }break; + case DW_ExprOp_StackValue: + { + // NOTE(rjf): nothing to do here - program is over, value (but not location) has + // been evaluated and exists as the top entry on the stack. + }break; - case DW_ExprOp_Plus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_add(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Minus: { dw_expr_stack_push(scratch.arena, stack, dw_expr_minus(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Div: { dw_expr_stack_push(scratch.arena, stack, dw_expr_div(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Mul: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mul(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Mod: { dw_expr_stack_push(scratch.arena, stack, dw_expr_mod(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - - case DW_ExprOp_Eq: { dw_expr_stack_push(scratch.arena, stack, dw_expr_eq(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Ge: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ge(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Gt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_gt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Le: { dw_expr_stack_push(scratch.arena, stack, dw_expr_le(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Lt: { dw_expr_stack_push(scratch.arena, stack, dw_expr_lt(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Ne: { dw_expr_stack_push(scratch.arena, stack, dw_expr_ne(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - - case DW_ExprOp_Xor: { dw_expr_stack_push(scratch.arena, stack, dw_expr_xor(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_And: { dw_expr_stack_push(scratch.arena, stack, dw_expr_and(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Or: { dw_expr_stack_push(scratch.arena, stack, dw_expr_or(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Shl: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shl(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Shr: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shr(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Shra: { dw_expr_stack_push(scratch.arena, stack, dw_expr_shra(dw_expr_stack_pop(stack), dw_expr_stack_pop(stack))); } break; - - case DW_ExprOp_Abs: { dw_expr_stack_push(scratch.arena, stack, dw_expr_abs(dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Neg: { dw_expr_stack_push(scratch.arena, stack, dw_expr_neg(dw_expr_stack_pop(stack))); } break; - case DW_ExprOp_Not: { dw_expr_stack_push(scratch.arena, stack, dw_expr_not(dw_expr_stack_pop(stack))); } break; - - case DW_ExprOp_Dup: { - dw_expr_stack_push(scratch.arena, stack, dw_expr_stack_peek(stack)); - } break; - - case DW_ExprOp_Rot: { - DW_ExprValue first = dw_expr_stack_pop(stack); - DW_ExprValue second = dw_expr_stack_pop(stack); - DW_ExprValue third = dw_expr_stack_pop(stack); - dw_expr_stack_push(scratch.arena, stack, first); // -> third - dw_expr_stack_push(scratch.arena, stack, third); // -> second - dw_expr_stack_push(scratch.arena, stack, second); // -> first - } break; - - case DW_ExprOp_Swap: { - DW_ExprValue first = dw_expr_stack_pop(stack); - DW_ExprValue second = dw_expr_stack_pop(stack); - dw_expr_stack_push(scratch.arena, stack, first); // -> second - dw_expr_stack_push(scratch.arena, stack, second); // -> first - } break; - - case DW_ExprOp_Drop: { - dw_expr_stack_pop(stack); - } break; - - case DW_ExprOp_Deref: { - DW_ExprValue value = dw_expr_stack_pop(stack); - - // expression must be of an integral type - if (!DW_ExprValueType_IsInt(value.type)) { goto exit; } - - // treat value as an address - DW_ExprValue addr = dw_expr_cast(value, DW_ExprValueType_Addr); - - // read pointer size from the address - U64 addr_size = byte_size_from_arch(arch); - U8 *generic_value = push_array(scratch.arena, U8, addr_size); - MachineOpResult read_result = mem_read(addr.addr, generic_value, addr_size, mem_read_ud); - if (read_result != MachineOpResult_Ok) { goto exit; } - - // push generic data - dw_expr_stack_push(scratch.arena, stack, (DW_ExprValue){ .type = DW_ExprValueType_Generic, .generic = str8(generic_value, addr_size) }); - } break; - - case DW_ExprOp_StackValue: { - stack->top->v.type = dw_expr_unsigned_value_type_from_bit_size(bit_size_from_arch(arch)); - } break; - - case DW_ExprOp_GNU_PushTlsAddress: - case DW_ExprOp_FormTlsAddress: { - DW_ExprValue tls_off = dw_expr_stack_pop(stack); - DW_ExprValue tls_base = { .type = DW_ExprValueType_Addr, .addr = tls }; - DW_ExprValue tls_addr = dw_expr_add(tls_base, tls_off); - dw_expr_stack_push(scratch.arena, stack, tls_addr); - } break; - } - } - - // composite value - if (pieces.count > 0) { -#if 0 - U64 total_bit_size = 0; - for EachNode (n, DW_PieceNode, pieces.first) { - total_bit_size += n->v.bit_size; - } - - U64 value_size = CeilIntegerDiv(total_bit_size, 8); - U8 *value = push_array(arena, U8, value_size); - Rng1U64 *ranges = push_array(arena, Rng1U64, pieces.count); - U64 *offsets = push_array(arena, U64, pieces.count); - U64 value_idx = 0; - U64 value_cursor = 0; - U64 piece_cursor = 0; - for EachNode(n, DW_PieceNode, pieces.first) { - if (n->v.kind == DW_PieceKind_Value) { - ranges[value_idx] = r1u64(piece_cursor, piece_cursor + n->v.bit_size); - offsets[value_idx] = value_cursor; - for (U64 i = 0; i < n->v.bit_size; i += 8) { - U64 to_copy = Min(8, n->v.bit_size - i); - if (value_cursor % 8 == 0) { - value[value_cursor / 8] = n->v.value[i]; - } else { - value[value_cursor / 8] |= n->v.value[i] << (value_cursor % 8); - value[AlignPow2(value_cursor / 8, 8)] |= n->v.value[i] >> (value_cursor % 8); - } - value_cursor += to_copy; + //- rjf: conversions + case DW_ExprOp_Convert: + case DW_ExprOp_Reinterpret: + { + if(operands[0].u512.u64[0] == 0) + { + push_vals[0] = popped_vals[0]; } - value_idx += 1; - } - piece_cursor += n->v.bit_size; + else + { + // NOTE(rjf): with a nonzero operand, it is expecting us to read into the + // DWARF debug info and push as that base type. we do not have access to that + // in the general case here, and we need to figure out how to preserve that info + // if we care. + done = 1; + result.status = DW_EvalStatus_UnsupportedOp; + } + }break; } - value_out->type = DW_ExprValueType_Generic; - value_out->ranges = (Rng1U64Array){ .count = pieces.count, .v = ranges }; - value_out->offsets = offsets; - value_out->generic = str8(value, value_size); -#else - NotImplemented; -#endif - } - // scalar - else { - if (stack->top) { - *value_out = stack->top->v; - if (value_out->type == DW_ExprValueType_Generic) { - value_out->generic = push_str8_copy(arena, value_out->generic); + //- rjf: do pushes + if(!done && !need_a_break) + { + push_count = Min(push_count, ArrayCount(push_vals)); + for(U8 push_idx = 0; push_idx < push_count; push_idx += 1) + { + DW_EvalValNode *n = state->free_val; + if(n != 0) + { + SLLStackPop(state->free_val); + } + else + { + n = push_array(arena, DW_EvalValNode, 1); + } + n->v = push_vals[push_idx]; + SLLStackPush(state->top_val, n); } - - Rng1U64 *range = push_array(arena, Rng1U64, 1); - *range = r1u64(0, max_U64); - value_out->ranges = (Rng1U64Array){ .count = 1, .v = range }; - value_out->offsets = push_array(arena, U64, 1); - } else { - MemoryZeroStruct(value_out); + } + + //- rjf: do not need a break? advance state. + // + // (if we *do* need a break, this means we need to ask the caller for + // more info, like memory reads, and so we want to resume from the + // offset just before this opcode) + // + if(!need_a_break) + { + state->op_idx += 1; + state->off = off; + } + + //- rjf: at the end of the expression? -> set success, fill result + if(off == expr.size) + { + result.status = DW_EvalStatus_Good; + if(state->top_val != 0) + { + result.val = state->top_val->v; + } + } + + //- rjf: did not advance? -> error + if(off == start_off) + { + result.status = DW_EvalStatus_Error; + break; } } - - result = DW_ExprEvalResult_Ok; - exit:; - scratch_end(scratch); return result; } diff --git a/src/dwarf/dwarf_expr.h b/src/dwarf/dwarf_expr.h index 432b5b22..5bb9630f 100644 --- a/src/dwarf/dwarf_expr.h +++ b/src/dwarf/dwarf_expr.h @@ -5,229 +5,62 @@ #define DWARF_EXPR_H //////////////////////////////// -// evaluator +//~ rjf: Evaluation Values -#define DW_ExprValueType_IsSigned(x) ((x) == DW_ExprValueType_S8 || (x) == DW_ExprValueType_S16 || (x) == DW_ExprValueType_S32 || (x) == DW_ExprValueType_S64 || (x) == DW_ExprValueType_S128 || (x) == DW_ExprValueType_S256 || (x) == DW_ExprValueType_S512) -#define DW_ExprValueType_IsUnsigned(x) ((x) == DW_ExprValueType_U8 || (x) == DW_ExprValueType_U16 || (x) == DW_ExprValueType_U32 || (x) == DW_ExprValueType_U64 || (x) == DW_ExprValueType_U128 || (x) == DW_ExprValueType_U256 || (x) == DW_ExprValueType_U512) -#define DW_ExprValueType_IsFloat(x) ((x) == DW_ExprValueType_F32 || (x) == DW_ExprValueType_F64) -#define DW_ExprValueType_IsInt(x) (DW_ExprValueType_IsSigned(x) || DW_ExprValueType_IsUnsigned(x) || (x) == DW_ExprValueType_Addr) -typedef enum +typedef struct DW_EvalVal DW_EvalVal; +struct DW_EvalVal { - DW_ExprValueType_Generic, - DW_ExprValueType_U8, - DW_ExprValueType_U16, - DW_ExprValueType_U32, - DW_ExprValueType_U64, - DW_ExprValueType_U128, - DW_ExprValueType_U256, - DW_ExprValueType_U512, - DW_ExprValueType_S8, - DW_ExprValueType_S16, - DW_ExprValueType_S32, - DW_ExprValueType_S64, - DW_ExprValueType_S128, - DW_ExprValueType_S256, - DW_ExprValueType_S512, - DW_ExprValueType_F32, - DW_ExprValueType_F64, - DW_ExprValueType_Addr, - DW_ExprValueType_Implicit, - DW_ExprValueType_Bool, -} DW_ExprValueType; - -typedef S8 DW_ExprBool; - -typedef struct DW_ExprValue -{ - DW_ExprValueType type; - Rng1U64Array ranges; - U64 *offsets; - union { - U8 u8; - U16 u16; - U32 u32; - U64 u64; - U128 u128; - U256 u256; - U512 u512; - S8 s8; - S16 s16; - S32 s32; - S64 s64; - F32 f32; - F64 f64; - U64 addr; - DW_ExprBool boolean; - String8 implicit; - String8 generic; + union + { + U512 u512; + S64 s64; }; -} DW_ExprValue; + String8 data; +}; -typedef struct DW_ExprValueNode +typedef struct DW_EvalValNode DW_EvalValNode; +struct DW_EvalValNode { - DW_ExprValue v; - struct DW_ExprValueNode *next; -} DW_ExprValueNode; - -typedef enum -{ - DW_PieceKind_Null, - DW_PieceKind_Value, - DW_PieceKind_Undefined, -} DW_PieceKind; - -typedef struct DW_Piece -{ - DW_PieceKind kind; - U64 bit_size; - U8 *value; -} DW_Piece; - -typedef struct DW_PieceNode -{ - DW_Piece v; - struct DW_PieceNode *next; -} DW_PieceNode; - -typedef struct DW_PieceList -{ - U64 count; - DW_PieceNode *first; - DW_PieceNode *last; -} DW_PieceList; - -typedef struct DW_ExprStack -{ - U64 count; - DW_ExprValueNode *top; -} DW_ExprStack; - -typedef enum -{ - DW_ExprEvalResult_Fail, - DW_ExprEvalResult_Ok, - DW_ExprEvalResult_Maybe, - DW_ExprEvalResult_ExecOpLimitReached, -} DW_ExprEvalResult; + DW_EvalValNode *next; + DW_EvalVal v; +}; //////////////////////////////// -// encoder +//~ rjf: Evaluation Results -typedef enum +typedef enum DW_EvalStatus { - DW_ExprEncType_Null, - DW_ExprEncType_Op, - DW_ExprEncType_U8, - DW_ExprEncType_U16, - DW_ExprEncType_U32, - DW_ExprEncType_U64, - DW_ExprEncType_S8, - DW_ExprEncType_S16, - DW_ExprEncType_S32, - DW_ExprEncType_S64, - DW_ExprEncType_ULEB128, - DW_ExprEncType_SLEB128, - DW_ExprEncType_Addr, - DW_ExprEncType_Block, - DW_ExprEncType_DwarfUInt, - DW_ExprEncType_Label, - DW_ExprEncType_DeclLabel, -} DW_ExprEncType; + DW_EvalStatus_Error, + DW_EvalStatus_FailedMemoryRead, + DW_EvalStatus_ExecOpLimitReached, + DW_EvalStatus_UnsupportedOp, + DW_EvalStatus_Good, +} +DW_EvalStatus; -typedef struct DW_ExprEnc +typedef struct DW_Eval DW_Eval; +struct DW_Eval { - DW_ExprEncType type; - union { - DW_ExprOp op; - U8 u8; - U16 u16; - U32 u32; - U64 u64; - S8 s8; - S16 s16; - S32 s32; - S64 s64; - U64 addr; - String8 block; - String8 label; - }; -} DW_ExprEnc; - -#define DW_ExprEnc_Op(v) { .type = DW_ExprEncType_Op, .op = DW_ExprOp_##v } -#define DW_ExprEnc_U8(v) { .type = DW_ExprEncType_U8, .u8 = v } -#define DW_ExprEnc_U16(v) { .type = DW_ExprEncType_U16, .u16 = v } -#define DW_ExprEnc_U32(v) { .type = DW_ExprEncType_U32, .u32 = v } -#define DW_ExprEnc_U64(v) { .type = DW_ExprEncType_U64, .u64 = v } -#define DW_ExprEnc_S8(v) { .type = DW_ExprEncType_S8, .s8 = v } -#define DW_ExprEnc_S16(v) { .type = DW_ExprEncType_S16, .s16 = v } -#define DW_ExprEnc_S32(v) { .type = DW_ExprEncType_S32, .s32 = v } -#define DW_ExprEnc_S64(v) { .type = DW_ExprEncType_S64, .s64 = v } -#define DW_ExprEnc_ULEB128(v) { .type = DW_ExprEncType_ULEB128, .u64 = v } -#define DW_ExprEnc_SLEB128(v) { .type = DW_ExprEncType_SLEB128, .s64 = v } -#define DW_ExprEnc_Addr(v) { .type = DW_ExprEncType_Addr, .addr = v } -#define DW_ExprEnc_Block(v) { .type = DW_ExprEncType_Block, .block = v } -#define DW_ExprEnc_UInt(v) { .type = DW_ExprEncType_DwarfUInt, .u64 = v } -#define DW_ExprEnc_Label(v) { .type = DW_ExprEncType_Label, .label = str8_lit_comp(v) } -#define DW_ExprEnc_DeclLabel(v) { .type = DW_ExprEncType_DeclLabel, .label = str8_lit_comp(v) } + DW_EvalVal val; + DW_EvalStatus status; + Rng1U64 missed_read_vaddr_range; +}; //////////////////////////////// +//~ rjf: Evaluation State Machine -// pieces -internal DW_PieceNode * dw_piece_list_push(Arena *arena, DW_PieceList *list, DW_Piece v); +typedef struct DW_EvalState DW_EvalState; +struct DW_EvalState +{ + U64 off; + U64 op_idx; + DW_EvalValNode *top_val; + DW_EvalValNode *free_val; +}; -// size -> type -internal DW_ExprValueType dw_expr_unsigned_value_type_from_bit_size(U64 bit_size); -internal DW_ExprValueType dw_expr_signed_value_type_from_bit_size(U64 bit_size); -internal DW_ExprValueType dw_expr_float_type_from_bit_size(U64 bit_size); +//////////////////////////////// +//~ rjf: Expression Evaluation Functions -// type -> size -internal U64 dw_expr_byte_size_from_value_type(U64 addr_size, DW_ExprValueType k); - -// typer -internal DW_ExprValueType dw_expr_pick_common_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs); -internal DW_ExprValueType dw_expr_pick_common_compar_value_type(DW_ExprValueType rhs, DW_ExprValueType lhs); -internal DW_ExprValue dw_expr_cast(DW_ExprValue value, DW_ExprValueType type); - -// arithmetic operators -internal DW_ExprValue dw_expr_add (DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_minus(DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_mul (DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_div (DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_mod (DW_ExprValue rhs, DW_ExprValue lhs); - -// comparison operators -internal DW_ExprValue dw_expr_eq(DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_ge(DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_gt(DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_le(DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_lt(DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_ne(DW_ExprValue rhs, DW_ExprValue lhs); - -// bitwise operators -internal DW_ExprValue dw_expr_xor (DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_and (DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_or (DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_shl (DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_shr (DW_ExprValue rhs, DW_ExprValue lhs); -internal DW_ExprValue dw_expr_shra(DW_ExprValue rhs, DW_ExprValue lhs); - -// unary operators -internal DW_ExprValue dw_expr_abs(DW_ExprValue value); -internal DW_ExprValue dw_expr_neg(DW_ExprValue value); -internal DW_ExprValue dw_expr_not(DW_ExprValue value); - -// stack -internal DW_ExprValueNode * dw_expr_stack_push(Arena *arena, DW_ExprStack *stack, DW_ExprValue value); -internal DW_ExprValueNode * dw_expr_stack_push_unsigned(Arena *arena, DW_ExprStack *stack, void *value, U64 value_size); -internal DW_ExprValue dw_expr_stack_pop(DW_ExprStack *stack); -internal DW_ExprValue dw_expr_stack_peek(DW_ExprStack *stack); -internal DW_ExprValueNode * dw_expr_stack_pick(DW_ExprStack *stack, U64 idx); - -// value helpers -internal String8 dw_string_from_expr_value(Arena *arena, U64 addr_size, DW_ExprValue v); - -// evaluator -internal DW_ExprEvalResult dw_eval_expr(Arena *arena, Arch arch, DW_Format format, U64 frame_base, U64 cfa, U64 tls_base, U64 op_limit, DW_Expr expr, void *reg_block, MachineOp_MemRead *mem_read, void *mem_read_ud, DW_ExprValue *value_out); - -#endif //DWARF_EXPR_H +internal DW_Eval dw_eval(Arena *arena, DW_Format fmt, Arch arch, MemoryMap *memory_map, void *regs, U64 frame_base, U64 cfa, U64 tls, DW_EvalState *state, String8 expr, U64 op_idx_cap); +#endif // DWARF_EXPR_H diff --git a/src/dwarf/dwarf_expr_2.c b/src/dwarf/dwarf_expr_2.c deleted file mode 100644 index 3e3d6397..00000000 --- a/src/dwarf/dwarf_expr_2.c +++ /dev/null @@ -1,393 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Expression Evaluation Functions - -internal DW_Eval -dw_eval(Arena *arena, DW_Format fmt, Arch arch, MemoryMap *memory_map, void *regs, U64 frame_base, U64 cfa, U64 tls, DW_EvalState *state, String8 expr, U64 op_idx_cap) -{ - DW_Eval result = {0}; - ARCH_Info *arch_info = arch_info_from_arch(arch); - B32 need_a_break = 0; - B32 done = 0; - for(;state->off < expr.size && !need_a_break && !done;) - { - U64 start_off = state->off; - U64 off = state->off; - - //- rjf: too many ops? -> error - if(state->op_idx >= op_idx_cap) - { - result.status = DW_EvalStatus_ExecOpLimitReached; - break; - } - - //- rjf: read next opcode - DW_ExprOp opcode = 0; - off += str8_deserial_read_struct(expr, off, &opcode); - - //- rjf: unpack opcode - U8 push_count = 0; - U8 pop_count = 0; - U8 operand_count = 0; - DW_ExprOperandKind operand_kinds[2] = {DW_ExprOperandKind_Null}; - { - DW_ExprOpInfo *op_info = dw_info_from_expr_op(DW_Version_5, DW_ExtFlag_All, opcode); - push_count = op_info->push_count; - pop_count = op_info->pop_count; - operand_count = op_info->operand_count; - MemoryCopy(operand_kinds, op_info->operand_kinds, sizeof(operand_kinds)); - } - - //- rjf: read operands - DW_EvalVal operands[2] = {0}; - for(U8 operand_idx = 0; operand_idx < operand_count; operand_idx += 1) - { - U64 fixed_bytes_to_read = 0; - switch(operand_kinds[operand_idx]) - { - default:{}break; - case DW_ExprOperandKind_U8: {fixed_bytes_to_read = 1;}goto fixed_read; - case DW_ExprOperandKind_U16: {fixed_bytes_to_read = 2;}goto fixed_read; - case DW_ExprOperandKind_U32: {fixed_bytes_to_read = 4;}goto fixed_read; - case DW_ExprOperandKind_U64: {fixed_bytes_to_read = 8;}goto fixed_read; - case DW_ExprOperandKind_S8: {fixed_bytes_to_read = 1;}goto fixed_read; - case DW_ExprOperandKind_S16: {fixed_bytes_to_read = 2;}goto fixed_read; - case DW_ExprOperandKind_S32: {fixed_bytes_to_read = 4;}goto fixed_read; - case DW_ExprOperandKind_S64: {fixed_bytes_to_read = 8;}goto fixed_read; - case DW_ExprOperandKind_Addr: {fixed_bytes_to_read = byte_size_from_arch(arch);}goto fixed_read; - case DW_ExprOperandKind_DwarfUInt:{fixed_bytes_to_read = dw_addr_size_from_format(fmt);}goto fixed_read; - fixed_read:; - { - off += str8_deserial_read(expr, off, &operands[operand_idx].u512.u64[0], fixed_bytes_to_read, fixed_bytes_to_read); - }break; - case DW_ExprOperandKind_ULEB128: - { - off += str8_deserial_read_uleb128(expr, off, &operands[operand_idx].u512.u64[0]); - }break; - case DW_ExprOperandKind_SLEB128: - { - off += str8_deserial_read_sleb128(expr, off, &operands[operand_idx].s64); - }break; - case DW_ExprOperandKind_Block: - { - U8 block_size = 0; - off += str8_deserial_read_struct(expr, off, &block_size); - operands[operand_idx].data = str8_prefix(str8_skip(expr, off), block_size); - }break; - } - } - - //- rjf: do pops - DW_EvalVal popped_vals[3] = {0}; - { - pop_count = Min(pop_count, ArrayCount(popped_vals)); - for(U8 pop_idx = 0; pop_idx < pop_count; pop_idx += 1) - { - if(state->top_val != 0) - { - DW_EvalValNode *popped = state->top_val; - SLLStackPop(state->top_val); - popped_vals[pop_idx] = popped->v; - SLLStackPush(state->free_val, popped); - } - } - } - - //- rjf: apply opcode - DW_EvalVal push_vals[3] = {0}; - U64 pick_target_idx = 0; - U64 deref_read_size = 0; - DW_RegCode reg_code_dw = 0; - switch(opcode) - { - //- rjf: unsuported ops - case DW_ExprOp_Call2: // DWARF function calls - case DW_ExprOp_Call4: // DWARF function calls - case DW_ExprOp_CallRef: // DWARF function calls - case DW_ExprOp_Addrx: // address in .debug_addr; not currently present for us, need to find how to preserve if we care - case DW_ExprOp_Constx: // address in .debug_addr; not currently present for us, need to find how to preserve if we care - case DW_ExprOp_EntryValue: // encodes a sub-expression as a data block - need to recursively evaluate, lol - case DW_ExprOp_ConstType: // pushes a constant - but refers into DWARF debug info to specify the type. we don't have that, need to figure out how to preserve mapping from DW type ID -> RDI type, if we care - case DW_ExprOp_DerefType: // same as above - refers to DWARF debug info - case DW_ExprOp_RegvalType: // same as above - refers to DWARF debug info - case DW_ExprOp_Piece: // pieces - used to stitch multiple sub-values together - case DW_ExprOp_BitPiece: // pieces - used to stitch multiple sub-values together - case DW_ExprOp_XDeref: // two entries popped from stack - second one is 'address space identifier'. not possible in this layer right now - case DW_ExprOp_XDerefSize: // does multiple address spaces - case DW_ExprOp_XDerefType: // refers to DWARF debug info, *and* does multiple address spaces - case DW_ExprOp_PushObjectAddress: // pushes "the address of the object currently being evaluated" ??? - case DW_ExprOp_ImplicitPointer: // refers to DWARF debug info - default: - { - done = 1; - result.status = DW_EvalStatus_UnsupportedOp; - }break; - - //- rjf: address ops - case DW_ExprOp_Deref:{deref_read_size = byte_size_from_arch(arch);}goto deref; - case DW_ExprOp_DerefSize:{deref_read_size = operands[0].u512.u64[0];}goto deref; - deref:; - { - U64 vaddr = popped_vals[0].u512.u64[0]; - U64 read_size = Min(deref_read_size, sizeof(push_vals[0].u512)); - Rng1U64 read_vaddr_range = r1u64(vaddr, vaddr+read_size); - if(!memory_map_read(memory_map, read_vaddr_range, &push_vals[0].u512)) - { - need_a_break = 1; - result.status = DW_EvalStatus_FailedMemoryRead; - result.missed_read_vaddr_range = read_vaddr_range; - } - }break; - - //- rjf: generic constants - case DW_ExprOp_Const1U: case DW_ExprOp_Const1S: - case DW_ExprOp_Const2U: case DW_ExprOp_Const2S: - case DW_ExprOp_Const4U: case DW_ExprOp_Const4S: - case DW_ExprOp_Const8U: case DW_ExprOp_Const8S: - case DW_ExprOp_ConstU: case DW_ExprOp_ConstS: - case DW_ExprOp_Addr: - { - push_vals[0] = operands[0]; - }break; - - //- rjf: stack ops - case DW_ExprOp_Dup:{push_vals[0] = popped_vals[0];}break; - case DW_ExprOp_Drop:{/* NOTE(rjf): nothing to do here - just pops */}break; - case DW_ExprOp_Swap:{push_vals[0] = popped_vals[1]; push_vals[1] = popped_vals[0];}break; - case DW_ExprOp_Rot: {push_vals[0] = popped_vals[0]; push_vals[1] = popped_vals[1]; push_vals[2] = popped_vals[2];}break; - case DW_ExprOp_Over:{pick_target_idx = 1;}break; - case DW_ExprOp_Pick:{pick_target_idx = operands[0].u512.u64[0];}goto pick_stack_val; - pick_stack_val:; - { - U64 idx = 0; - for(DW_EvalValNode *n = state->top_val; n != 0; n = n->next, idx += 1) - { - if(idx == pick_target_idx) - { - push_vals[0] = n->v; - break; - } - } - }break; - - //- rjf: arithmetic ops -#define UniOpU(k, op) case k:{push_vals[0].u512.u64[0] = op(popped_vals[0].u512.u64[0]);}break -#define UniOpS(k, op) case k:{push_vals[0].s64 = op(popped_vals[0].s64);}break -#define BinOpS(k, op) case k:{push_vals[0].s64 = popped_vals[1].s64 op popped_vals[0].s64;}break -#define BinOpU(k, op) case k:{push_vals[0].u512.u64[0] = popped_vals[1].u512.u64[0] op popped_vals[0].u512.u64[0];}break -#define BinOpDiv(k, op) case k:if(popped_vals[0].u512.u64[0] != 0){push_vals[0].u512.u64[0] = popped_vals[1].u512.u64[0] op popped_vals[0].u512.u64[0];}break - UniOpS(DW_ExprOp_Abs, abs_s64); - UniOpS(DW_ExprOp_Neg, -); - UniOpU(DW_ExprOp_Not, !); - BinOpU(DW_ExprOp_Minus, -); - BinOpU(DW_ExprOp_Mul, *); - BinOpU(DW_ExprOp_Plus, +); - BinOpU(DW_ExprOp_Shl, <<); - BinOpU(DW_ExprOp_Shr, >>); - BinOpU(DW_ExprOp_And, &); - BinOpU(DW_ExprOp_Or, |); - BinOpU(DW_ExprOp_Xor, ^); - BinOpS(DW_ExprOp_Shra, >>); - BinOpDiv(DW_ExprOp_Div, /); - BinOpDiv(DW_ExprOp_Mod, %); - BinOpU(DW_ExprOp_Eq, ==); - BinOpU(DW_ExprOp_Ne, !=); - BinOpS(DW_ExprOp_Ge, >=); - BinOpS(DW_ExprOp_Gt, >); - BinOpS(DW_ExprOp_Le, <=); - BinOpS(DW_ExprOp_Lt, <); -#undef UniOpU -#undef UniOpS -#undef BinOpS -#undef BinOpU -#undef BinOpDiv - case DW_ExprOp_PlusUConst: - { - push_vals[0].u512.u64[0] = popped_vals[0].u512.u64[0] + operands[0].u512.u64[0]; - }break; - - //- rjf: jumps/branches - case DW_ExprOp_Bra: - { - if(popped_vals[0].u512.u64[0] == 0) - { - break; - } - } // fallthrough - case DW_ExprOp_Skip: - { - S64 jump_delta = operands[0].s64; - if((jump_delta < 0 && -jump_delta > off) || (off + jump_delta >= expr.size)) - { - done = 1; - result.status = DW_EvalStatus_Error; - } - else - { - off += jump_delta; - } - }break; - - //- rjf: literals - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: case DW_ExprOp_Lit3: - case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: - case DW_ExprOp_Lit8: case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: case DW_ExprOp_Lit15: - case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: - case DW_ExprOp_Lit20: case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: case DW_ExprOp_Lit27: - case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: - { - U8 val = (opcode - DW_ExprOp_Lit0); - push_vals[0].u512.u8[0] = val; - }break; - - //- rjf: register reads (opcode-encoded reg) - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: case DW_ExprOp_Reg3: - case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: - case DW_ExprOp_Reg8: case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: case DW_ExprOp_Reg15: - case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: - case DW_ExprOp_Reg20: case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: case DW_ExprOp_Reg27: - case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: - {reg_code_dw = (opcode - DW_ExprOp_Reg0);}goto reg_read; - case DW_ExprOp_RegX: - {reg_code_dw = operands[0].u512.u64[0];}goto reg_read; - reg_read:; - { - ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_code_dw); - Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; - U64 read_size = dim_1u16(reg_rng); - read_size = Min(read_size, sizeof(push_vals[0].u512)); - reg_rng.max = reg_rng.min + read_size; - arch_reg_block_read_range(arch_info, regs, reg_rng, &push_vals[0].u512); - }break; - - //- rjf: register reads (opcode-encoded reg + offset) - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: case DW_ExprOp_BReg3: - case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: - case DW_ExprOp_BReg8: case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: case DW_ExprOp_BReg15: - case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: - case DW_ExprOp_BReg20: case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: case DW_ExprOp_BReg27: - case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: - {reg_code_dw = (opcode - DW_ExprOp_BReg0);}goto based_reg_read; - case DW_ExprOp_BRegX: - {reg_code_dw = operands[0].u512.u64[0];}goto based_reg_read; - based_reg_read:; - { - ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_code_dw); - Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; - U64 read_size = dim_1u16(reg_rng); - read_size = Min(read_size, sizeof(push_vals[0].u512)); - reg_rng.max = reg_rng.min + read_size; - arch_reg_block_read_range(arch_info, regs, reg_rng, &push_vals[0].u512); - push_vals[0].u512.u64[0] += operands[0].s64; - }break; - - //- rjf: frame base register read - case DW_ExprOp_FBReg: - { - push_vals[0].u512.u64[0] = (U64)(frame_base + operands[0].s64); - }break; - - //- rjf: TLS - case DW_ExprOp_FormTlsAddress: - { - U64 tls_off = popped_vals[0].u512.u64[0]; - U64 tls_addr = tls + tls_off; - push_vals[0].u512.u64[0] = tls_addr; - }break; - - //- rjf: call frame CFA - case DW_ExprOp_CallFrameCfa: - { - push_vals[0].u512.u64[0] = cfa; - }break; - - //- rjf: implicit location descriptions (value is known, location is not) - case DW_ExprOp_ImplicitValue: - { - push_vals[0] = operands[0]; - }break; - case DW_ExprOp_StackValue: - { - // NOTE(rjf): nothing to do here - program is over, value (but not location) has - // been evaluated and exists as the top entry on the stack. - }break; - - //- rjf: conversions - case DW_ExprOp_Convert: - case DW_ExprOp_Reinterpret: - { - if(operands[0].u512.u64[0] == 0) - { - push_vals[0] = popped_vals[0]; - } - else - { - // NOTE(rjf): with a nonzero operand, it is expecting us to read into the - // DWARF debug info and push as that base type. we do not have access to that - // in the general case here, and we need to figure out how to preserve that info - // if we care. - done = 1; - result.status = DW_EvalStatus_UnsupportedOp; - } - }break; - } - - //- rjf: do pushes - if(!done && !need_a_break) - { - push_count = Min(push_count, ArrayCount(push_vals)); - for(U8 push_idx = 0; push_idx < push_count; push_idx += 1) - { - DW_EvalValNode *n = state->free_val; - if(n != 0) - { - SLLStackPop(state->free_val); - } - else - { - n = push_array(arena, DW_EvalValNode, 1); - } - n->v = push_vals[push_idx]; - SLLStackPush(state->top_val, n); - } - } - - //- rjf: do not need a break? advance state. - // - // (if we *do* need a break, this means we need to ask the caller for - // more info, like memory reads, and so we want to resume from the - // offset just before this opcode) - // - if(!need_a_break) - { - state->op_idx += 1; - state->off = off; - } - - //- rjf: at the end of the expression? -> set success, fill result - if(off == expr.size) - { - result.status = DW_EvalStatus_Good; - if(state->top_val != 0) - { - result.val = state->top_val->v; - } - } - - //- rjf: did not advance? -> error - if(off == start_off) - { - result.status = DW_EvalStatus_Error; - break; - } - } - return result; -} diff --git a/src/dwarf/dwarf_expr_2.h b/src/dwarf/dwarf_expr_2.h deleted file mode 100644 index e68a9617..00000000 --- a/src/dwarf/dwarf_expr_2.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DWARF_EXPR_2_H -#define DWARF_EXPR_2_H - -//////////////////////////////// -//~ rjf: Evaluation Values - -typedef struct DW_EvalVal DW_EvalVal; -struct DW_EvalVal -{ - union - { - U512 u512; - S64 s64; - }; - String8 data; -}; - -typedef struct DW_EvalValNode DW_EvalValNode; -struct DW_EvalValNode -{ - DW_EvalValNode *next; - DW_EvalVal v; -}; - -//////////////////////////////// -//~ rjf: Evaluation Results - -typedef enum DW_EvalStatus -{ - DW_EvalStatus_Error, - DW_EvalStatus_FailedMemoryRead, - DW_EvalStatus_ExecOpLimitReached, - DW_EvalStatus_UnsupportedOp, - DW_EvalStatus_Good, -} -DW_EvalStatus; - -typedef struct DW_Eval DW_Eval; -struct DW_Eval -{ - DW_EvalVal val; - DW_EvalStatus status; - Rng1U64 missed_read_vaddr_range; -}; - -//////////////////////////////// -//~ rjf: Evaluation State Machine - -typedef struct DW_EvalState DW_EvalState; -struct DW_EvalState -{ - U64 off; - U64 op_idx; - DW_EvalValNode *top_val; - DW_EvalValNode *free_val; -}; - -//////////////////////////////// -//~ rjf: Expression Evaluation Functions - -internal DW_Eval dw_eval(Arena *arena, DW_Format fmt, Arch arch, MemoryMap *memory_map, void *regs, U64 frame_base, U64 cfa, U64 tls, DW_EvalState *state, String8 expr, U64 op_idx_cap); - -#endif // DWARF_EXPR_2_H diff --git a/src/dwarf/dwarf_inc.c b/src/dwarf/dwarf_inc.c index b5b9efb4..d36b4552 100644 --- a/src/dwarf/dwarf_inc.c +++ b/src/dwarf/dwarf_inc.c @@ -2,10 +2,10 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) #include "dwarf/dwarf.c" -#include "dwarf/dwarf_expr_2.c" -#include "dwarf/dwarf_parse_2.c" -#include "dwarf/dwarf_unwind_2.c" -#include "dwarf/dwarf_dump_2.c" +#include "dwarf/dwarf_parse.c" +#include "dwarf/dwarf_expr.c" +#include "dwarf/dwarf_unwind.c" +#include "dwarf/dwarf_dump.c" #if defined(COFF_H) # include "dwarf/dwarf_parse_coff.c" #endif diff --git a/src/dwarf/dwarf_inc.h b/src/dwarf/dwarf_inc.h index afc74828..fc9f24fe 100644 --- a/src/dwarf/dwarf_inc.h +++ b/src/dwarf/dwarf_inc.h @@ -5,10 +5,10 @@ #define DWARF_INC_H #include "dwarf/dwarf.h" -#include "dwarf/dwarf_expr_2.h" -#include "dwarf/dwarf_parse_2.h" -#include "dwarf/dwarf_unwind_2.h" -#include "dwarf/dwarf_dump_2.h" +#include "dwarf/dwarf_parse.h" +#include "dwarf/dwarf_expr.h" +#include "dwarf/dwarf_unwind.h" +#include "dwarf/dwarf_dump.h" #if defined(COFF_H) # include "dwarf/dwarf_parse_coff.h" #endif diff --git a/src/dwarf/dwarf_parse.c b/src/dwarf/dwarf_parse.c index a8898477..6b3f3fe5 100644 --- a/src/dwarf/dwarf_parse.c +++ b/src/dwarf/dwarf_parse.c @@ -1,3331 +1,1916 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal U64 -dw_hash_from_string(String8 string) -{ - XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size); - return hash64; -} +//////////////////////////////// +//~ rjf: Basic Parsing Helpers internal U64 -str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out) +dw2_read_initial_length(String8 data, U64 off, U64 *out, DW_Format *fmt_out) { - U64 bytes_read = 0; - U32 first_four_bytes; - if (str8_deserial_read_struct(string, off, &first_four_bytes) == sizeof(first_four_bytes)) { - if (first_four_bytes == max_U32) { - if (str8_deserial_read_struct(string, off+sizeof(U32), size_out) == sizeof(U64)) { - bytes_read = sizeof(U32) + sizeof(U64); - } - } else { - *size_out = first_four_bytes; - bytes_read = sizeof(U32); - } - } - return bytes_read; -} - -internal U64 -str8_deserial_read_dwarf_uint(String8 string, U64 off, DW_Format format, U64 *uint_out) -{ - U64 bytes_read = 0; - switch (format) { - case DW_Format_Null: break; - case DW_Format_32Bit: { - *uint_out &= (U64)max_U32; - bytes_read = str8_deserial_read(string, off, uint_out, sizeof(U32), sizeof(U32)); - } break; - case DW_Format_64Bit: { - bytes_read = str8_deserial_read_struct(string, off, uint_out); - } break; - } - return bytes_read; -} - -internal U64 -str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out) -{ - U64 value = 0; - U64 shift = 0; - U64 cursor = off; - for(;;) + DW_Format format = DW_Format_32Bit; + U64 size = 0; + U64 size_size = 0; { - U8 byte = 0; - U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) + U32 size_or_header = 0; + size_size += str8_deserial_read_struct(data, off, &size_or_header); + if(size_or_header == max_U32) { - break; + size_size += str8_deserial_read_struct(data, off + size_size, &size); + format = DW_Format_64Bit; } - U8 val = byte & 0x7fu; - value |= ((U64)val) << shift; - cursor += bytes_read; - shift += 7u; - if((byte & 0x80u) == 0) + else { - break; + size = (U64)size_or_header; } } - if(value_out != 0) + if(out) { - *value_out = value; + out[0] = size; } - U64 bytes_read = cursor - off; - return bytes_read; + if(fmt_out) + { + fmt_out[0] = format; + } + return size_size; } internal U64 -str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) +dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out) { - U64 value = 0; - U64 shift = 0; - U64 cursor = off; - for(;;) + U64 start_off = off; + switch(format) { - U8 byte; - U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte); - if(bytes_read != sizeof(byte)) + default: + case DW_Format_32Bit: { - break; - } - U8 val = byte & 0x7fu; - value |= ((U64)val) << shift; - cursor += bytes_read; - shift += 7u; - if((byte & 0x80u) == 0) + U32 out_32 = 0; + off += str8_deserial_read_struct(data, off, &out_32); + out[0] = (U64)out_32; + }break; + case DW_Format_64Bit: { - if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0) - { - value |= -(S64)(1ull << shift); - } - break; - } + off += str8_deserial_read_struct(data, off, out); + }break; } - if(value_out != 0) - { - *value_out = value; - } - U64 bytes_read = cursor - off; - return bytes_read; -} - -internal U64 -str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out) -{ - Temp temp = temp_begin(arena); - - U64 *arr = push_array(arena, U64, count); - U64 i, cursor; - for (i = 0, cursor = off; i < count; ++i) { - U64 read_size = str8_deserial_read_uleb128(string, cursor, &arr[i]); - if (read_size == 0) { - break; - } - cursor += read_size; - } - - U64 bytes_read = 0; - if (i == count) { - *arr_out = arr; - bytes_read = cursor - off; - } else { - temp_end(temp); - *arr_out = 0; - } - - return bytes_read; -} - -internal U64 -str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out) -{ - Temp temp = temp_begin(arena); - - S64 *arr = push_array(arena, S64, count); - U64 i, cursor; - for (i = 0, cursor = off; i < count; ++i) { - U64 read_size = str8_deserial_read_sleb128(string, cursor, &arr[i]); - if (read_size == 0) { - break; - } - cursor += read_size; - } - - U64 bytes_read = 0; - if (i == count) { - *arr_out = arr; - bytes_read = cursor - off; - } else { - temp_end(temp); - *arr_out = 0; - } - + U64 bytes_read = (off - start_off); return bytes_read; } internal DW_SectionKind dw_section_kind_from_string(String8 string) { - DW_SectionKind s = DW_Section_Null; -#define X(_K,_L,_M,_W) \ -if (str8_match_lit(_L, string, 0)) { s = DW_Section_##_K; } \ -if (str8_match_lit(_M, string, 0)) { s = DW_Section_##_K; } + DW_SectionKind s = DW_SectionKind_Null; + if(0){} +#define X(name, regular_string, macho_string, dwo_string) else if(str8_match(string, s(regular_string), 0) || str8_match(string, s(macho_string), 0) || str8_match(string, s(dwo_string), 0)) { s = DW_SectionKind_##name; } DW_SectionKind_XList #undef X return s; } -internal DW_SectionKind -dw_section_dwo_kind_from_string(String8 string) -{ - DW_SectionKind s = DW_Section_Null; -#define X(_K,_L,_M,_W) if (str8_match_lit(_W, string, 0)) { s = DW_Section_##_K; } - DW_SectionKind_XList -#undef X - return s; -} - -internal Rng1U64List -dw_unit_ranges_from_data(Arena *arena, String8 data) -{ - Rng1U64List result = {0}; - - for (U64 cursor = 0; cursor < data.size; ) { - U64 start = cursor; - - // read unit size - U64 size; - U64 size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &size); - if (size_size == 0) { break; } - cursor += size_size; - - // is unit size valid? - if (cursor + size > data.size) { break; } - cursor += size; - - // push unit range - if (size > 0) { - rng1u64_list_push(arena, &result, rng_1u64(start, cursor)); - } - } - - return result; -} +//////////////////////////////// +//~ rjf: Unit Range Set Parsing (Top-Level .debug_info, .debug_aranges) internal Rng1U64Array -dw_unit_ranges_from_data_arr(Arena *arena, String8 data) +dw2_unit_ranges_from_data(Arena *arena, String8 data) { Temp scratch = scratch_begin(&arena, 1); - Rng1U64List list = dw_unit_ranges_from_data(scratch.arena, data); - Rng1U64Array arr = rng1u64_array_from_list(arena, &list); - scratch_end(scratch); - return arr; -} - -internal U64 -dw_read_list_unit_header_addr(String8 unit_data, DW_ListUnit *lu_out) -{ - U64 header_size = 0; - - U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); - - if (unit_length_size) { - DW_Version version = DW_Version_Null; - U64 version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version); - - if (version_size) { - if (version >= DW_Version_5) { - U8 address_size = 0; - U64 address_size_size = str8_deserial_read_struct(unit_data, - unit_length_size + version_size, - &address_size); - - if (address_size_size && address_size) { - U8 segment_selector_size = 0; - U64 segment_selector_size_size = str8_deserial_read_struct(unit_data, - unit_length_size + version_size + address_size_size, - &segment_selector_size); - if (segment_selector_size_size) { - header_size = unit_length_size + version_size + address_size_size + segment_selector_size_size; - - lu_out->version = version; - lu_out->segment_selector_size = segment_selector_size; - lu_out->address_size = address_size; - lu_out->entry_size = segment_selector_size + address_size; - lu_out->entries = str8_skip(unit_data, header_size); - } - } - } - } - } - - return header_size; -} - -internal U64 -dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out) -{ - U64 header_size = 0; - - U32 first_four_bytes = 0; - if (str8_deserial_read_struct(unit_data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } - DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - - U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); - - if (unit_length_size) { - DW_Version version = DW_Version_Null; - U64 version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version); - - if (version >= DW_Version_5) { - U16 padding = 0; - U64 padding_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size, &padding); - - if (padding_size && padding == 0) { - header_size = unit_length_size + version_size + padding_size; - - lu_out->version = version; - lu_out->address_size = 0; - lu_out->segment_selector_size = 0; - lu_out->entry_size = dw_size_from_format(format); - lu_out->entries = str8_skip(unit_data, header_size); - } - } - } - - exit:; - return header_size; -} - -internal U64 -dw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out) -{ - U64 header_size = 0; - - U32 first_four_bytes = 0; - if (str8_deserial_read_struct(unit_data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } - DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - - U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length); - - if (unit_length_size) { - DW_Version version = DW_Version_Null; - U64 version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version); - - if (version >= DW_Version_5) { - U8 address_size = 0; - U64 address_size_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size, &address_size); - - if (address_size_size && address_size > 0) { - U8 segment_selector_size = 0; - U64 segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size + address_size_size, &segment_selector_size); - - if (segment_selector_size_size) { - U32 offset_entry_count = 0; - U64 offset_entry_count_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size + address_size_size + segment_selector_size, &offset_entry_count); - - if (offset_entry_count_size) { - header_size = unit_length_size + version_size + address_size_size + segment_selector_size_size + offset_entry_count_size; - - lu_out->version = version; - lu_out->address_size = address_size; - lu_out->segment_selector_size = segment_selector_size; - lu_out->entry_size = dw_size_from_format(format); - lu_out->entries = str8_skip(unit_data, header_size); - } - } - } - } - } - - exit:; - return header_size; -} - -internal DW_ListUnitInput -dw_list_unit_input_from_input(Arena *arena, DW_Raw *input) -{ - Temp scratch = scratch_begin(&arena, 1); - - DW_ListUnitInput result = {0}; - - DW_Section debug_addr = input->sec[DW_Section_Addr]; + Rng1U64List unit_range_list = {0}; + for(U64 off = 0; off < data.size;) { - String8 data = debug_addr.data; - Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data); + U64 start_off = off; - result.addr_ranges = rng1u64_array_from_list(arena, &unit_ranges); - result.addr_count = unit_ranges.count; - result.addrs = push_array(arena, DW_ListUnit, unit_ranges.count); + // rjf: read next unit size + U64 unit_size = 0; + U64 unit_size_size = dw2_read_initial_length(data, off, &unit_size, 0); - for (U64 unit_idx = 0; unit_idx < result.addr_ranges.count; ++unit_idx) { - String8 unit_data = str8_substr(debug_addr.data, result.addr_ranges.v[unit_idx]); - dw_read_list_unit_header_addr(unit_data, &result.addrs[unit_idx]); + // rjf: push + if(unit_size > 0) + { + rng1u64_list_push(scratch.arena, &unit_range_list, r1u64(off, off + unit_size_size + unit_size)); + } + + // rjf: advance + off += unit_size_size; + off += unit_size; + + // rjf: break if no movement + if(off == start_off) + { + break; } } - - DW_Section debug_str_offsets = input->sec[DW_Section_StrOffsets]; - { - String8 data = debug_str_offsets.data; - Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data); - - result.str_offset_ranges = rng1u64_array_from_list(arena, &unit_ranges); - result.str_offset_count = unit_ranges.count; - result.str_offsets = push_array(arena, DW_ListUnit, unit_ranges.count); - - for (U64 unit_idx = 0; unit_idx < result.str_offset_ranges.count; ++unit_idx) { - String8 unit_data = str8_substr(data, result.str_offset_ranges.v[unit_idx]); - dw_read_list_unit_header_str_offsets(unit_data, &result.str_offsets[unit_idx]); - } - } - - DW_Section debug_rnglists = input->sec[DW_Section_RngLists]; - { - String8 data = debug_rnglists.data; - Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data); - - result.rnglist_ranges = rng1u64_array_from_list(arena, &unit_ranges); - result.rnglist_count = unit_ranges.count; - result.rnglists = push_array(arena, DW_ListUnit, unit_ranges.count); - - for (U64 unit_idx = 0; unit_idx < result.rnglist_ranges.count; ++unit_idx) { - String8 unit_data = str8_substr(data, result.rnglist_ranges.v[unit_idx]); - dw_read_list_unit_header_list(unit_data, &result.rnglists[unit_idx]); - } - } - - DW_Section debug_loclists = input->sec[DW_Section_LocLists]; - { - String8 data = debug_loclists.data; - Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data); - - result.loclist_ranges = rng1u64_array_from_list(arena, &unit_ranges); - result.loclist_count = unit_ranges.count; - result.loclists = push_array(arena, DW_ListUnit, unit_ranges.count); - - for (U64 unit_idx = 0; unit_idx < result.loclist_ranges.count; ++unit_idx) { - String8 unit_data = str8_substr(data, result.loclist_ranges.v[unit_idx]); - dw_read_list_unit_header_list(unit_data, &result.loclists[unit_idx]); - } - } - + Rng1U64Array result = rng1u64_array_from_list(arena, &unit_range_list); scratch_end(scratch); return result; } -internal U64 -dw_offset_from_list_unit(DW_ListUnit *lu, U64 index) -{ - U64 offset; - U64 entry_off = index * lu->entry_size; - if (entry_off + lu->entry_size <= lu->entries.size) { - offset = 0; - MemoryCopy(&offset, lu->entries.str + entry_off, lu->entry_size); - } else { - offset = max_U64; - } - return offset; -} +//////////////////////////////// +//~ rjf: Unit Header Parsing internal U64 -dw_addr_from_list_unit(DW_ListUnit *lu, U64 index) +dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out) { - U64 seg = 0; - U64 addr = max_U64; - U64 entry_count = lu->entries.size / lu->entry_size; - if (index < entry_count) { - U64 seg_off = lu->entry_size * index; - U64 addr_off = seg_off + lu->segment_selector_size; - MemoryCopy(&seg, lu->entries.str + seg_off, lu->segment_selector_size); - MemoryCopy(&addr, lu->entries.str + addr_off, lu->address_size); - // TODO: segment-based addressing - AssertAlways(seg == 0); - } else { - Assert(!"out of bounds index"); - } - return addr; -} - -internal U64 -dw_read_abbrev_tag(String8 data, U64 offset, DW_Abbrev *out_abbrev) -{ - U64 total_bytes_read = 0; - U64 cursor = offset; + U64 start_off = off; - // read tag ID and kind - U64 id = 0; - TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); + // rjf: read unit's .debug_info range size / format + U64 unit_info_size = 0; + DW_Format format = DW_Format_32Bit; + off += dw2_read_initial_length(data, off, &unit_info_size, &format); - // is this null terminator? - if (id == 0) { - total_bytes_read = cursor - offset; - MemoryZeroStruct(out_abbrev); - goto exit; - } + // rjf: read dwarf version + DW_Version version = 0; + off += str8_deserial_read_struct(data, off, &version); - U64 kind = 0; - TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); - - // read child flag - U8 has_children = 0; - if (id != 0) { - TryRead(str8_deserial_read_struct(data, cursor, &has_children), cursor, exit); - } - - if (out_abbrev != 0) { - DW_Abbrev abbrev = { .kind = DW_Abbrev_Tag, .sub_kind = kind, .id = id}; - if (has_children) { - abbrev.flags |= DW_AbbrevFlag_HasChildren; - } - *out_abbrev = abbrev; - } - - total_bytes_read = cursor - offset; - exit:; - return total_bytes_read; -} - -internal U64 -dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev) -{ - U64 total_bytes_read = 0; - U64 cursor = offset; - - // read id and kind - U64 id, kind; - TryRead(str8_deserial_read_uleb128(data, cursor, &id), cursor, exit); - TryRead(str8_deserial_read_uleb128(data, cursor, &kind), cursor, exit); - - // read implicit const - S64 implicit_const = 0; - if (kind == DW_Form_ImplicitConst) { - TryRead(str8_deserial_read_sleb128(data, cursor, &implicit_const), cursor, exit); - } - - if (out_abbrev != 0) { - DW_Abbrev abbrev = { .kind = DW_Abbrev_Attrib, .sub_kind = kind, .id = id }; - if (kind == DW_Form_ImplicitConst) { - abbrev.flags |= DW_AbbrevFlag_HasImplicitConst; - abbrev.implicit_const = implicit_const; - } - *out_abbrev = abbrev; - } - - total_bytes_read = cursor - offset; - exit:; - return total_bytes_read; -} - -internal DW_AbbrevTable -dw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_base) -{ - Temp temp = temp_begin(arena); - DW_AbbrevTable table = {0}; - B32 failed_to_make = 1; - - // count abbrev tags - for (U64 cursor = abbrev_base; cursor < abbrev_data.size; table.count += 1) { - DW_Abbrev tag; - TryRead(dw_read_abbrev_tag(abbrev_data, cursor, &tag), cursor, exit); - if (tag.id == 0) { break; } + // rjf: read header properties + U64 abbrev_off = max_U64; + U64 addr_size = 0; + DW_CompUnitKind kind = DW_CompUnitKind_Reserved; + U64 dwo_id = 0; + switch((DW_VersionEnum)version) + { + case DW_Version_Null: + case DW_Version_1: + {}break; - for (; cursor < abbrev_data.size; ) { - DW_Abbrev attrib; - TryRead(dw_read_abbrev_attrib(abbrev_data, cursor, &attrib), cursor, exit); - if(attrib.id == 0) { break; } - } - } - - // alloc entries - table.entries = push_array(arena, DW_AbbrevTableEntry, table.count); - table.count = 0; - - // fill out the table - for (U64 cursor = abbrev_base; cursor < abbrev_data.size;) { - U64 tag_abbrev_off = cursor; + // rjf: @dwarf2 + case DW_Version_2: + { + // rjf: read abbrev off + U32 abbrev_off_32 = 0; + off += str8_deserial_read_struct(data, off, &abbrev_off_32); + abbrev_off = (U64)abbrev_off_32; + + // rjf: read address size + U8 addr_size_8 = 0; + off += str8_deserial_read_struct(data, off, &addr_size_8); + addr_size = (U64)addr_size_8; + }break; - DW_Abbrev tag = {0}; - TryRead(dw_read_abbrev_tag(abbrev_data, cursor, &tag), cursor, exit); - if (tag.id == 0) { break; } + // rjf: @dwarf3 @dwarf4 + case DW_Version_3: + case DW_Version_4: + { + // rjf: read abbrev off + off += dw2_read_fmt_u64(data, off, format, &abbrev_off); + + // rjf: read address size + U8 addr_size_8 = 0; + off += str8_deserial_read_struct(data, off, &addr_size_8); + addr_size = (U64)addr_size_8; + }break; - // push new entry - table.entries[table.count].id = tag.id; - table.entries[table.count].off = tag_abbrev_off; - table.count += 1; - - for (; cursor < abbrev_data.size ;) { - DW_Abbrev attrib = {0}; - TryRead(dw_read_abbrev_attrib(abbrev_data, cursor, &attrib), cursor, exit); - if (attrib.id == 0) { break; } - } - } - - failed_to_make = 0; - exit:; - if (failed_to_make) { - MemoryZeroStruct(&table); - temp_end(temp); - } - return table; -} - -internal U64 -dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U64 abbrev_id) -{ - U64 abbrev_offset = max_U64; - if (table.count > 0) { - for (S64 l = 0, r = (S64)table.count - 1; l <= r; ) { - S64 m = l + (r - l) / 2; - if (abbrev_id > table.entries[m].id) { - l = m + 1; - } else if (abbrev_id < table.entries[m].id) { - r = m - 1; - } else { - abbrev_offset = table.entries[m].off; - break; + // rjf: @dwarf5 + case DW_Version_5: + { + // rjf: read unit kind + U8 comp_unit_kind_8 = 0; + off += str8_deserial_read_struct(data, off, &comp_unit_kind_8); + kind = (DW_CompUnitKind)comp_unit_kind_8; + + // rjf: read address size + U8 addr_size_8 = 0; + off += str8_deserial_read_struct(data, off, &addr_size_8); + addr_size = (U64)addr_size_8; + + // rjf: read abbrev off + off += dw2_read_fmt_u64(data, off, format, &abbrev_off); + + // rjf: read DWO ID, if applicable + if(kind == DW_CompUnitKind_Skeleton || + kind == DW_CompUnitKind_SplitCompile || + kind == DW_CompUnitKind_SplitType) + { + off += str8_deserial_read_struct(data, off, &dwo_id); } - } - } - return abbrev_offset; -} - -internal B32 -dw_read_form(String8 data, - DW_Version version, - DW_Format unit_format, - U64 address_size, - DW_FormKind form_kind, - S64 implicit_const, - DW_Form *form_out, - U64 *bytes_read_out) -{ - B32 is_ok = 0; - U64 cursor = 0; - DW_Form form = {0}; - switch (form_kind) { - case DW_Form_Null: break; - case DW_Form_Addr: { - TryRead(str8_deserial_read_block(data, cursor, address_size, &form.addr), cursor, exit); - } break; - case DW_Form_Block2: { - U16 size = 0; - TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); - TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); - } break; - case DW_Form_Block4: { - U32 size = 0; - TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); - TryRead(str8_deserial_read_block(data, cursor + cursor, size, &form.block), cursor, exit); - } break; - case DW_Form_Data2: { - TryRead(str8_deserial_read_block(data, cursor, sizeof(U16), &form.data), cursor, exit); - } break; - case DW_Form_Data4: { - TryRead(str8_deserial_read_block(data, cursor, sizeof(U32), &form.data), cursor, exit); - } break; - case DW_Form_Data8: { - TryRead(str8_deserial_read_block(data, cursor, sizeof(U64), &form.data), cursor, exit); - } break; - case DW_Form_String: { - TryRead(str8_deserial_read_cstr(data, cursor, &form.string), cursor, exit); - } break; - case DW_Form_Block: { - U64 size = 0; - TryRead(str8_deserial_read_uleb128(data, cursor, &size), cursor, exit); - TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); - } break; - case DW_Form_Block1: { - U8 size = 0; - TryRead(str8_deserial_read_struct(data, cursor, &size), cursor, exit); - TryRead(str8_deserial_read_block(data, cursor, size, &form.block), cursor, exit); - } break; - case DW_Form_Data1: { - TryRead(str8_deserial_read_block(data, cursor, sizeof(U8), &form.data), cursor, exit); - } break; - case DW_Form_Flag: { - TryRead(str8_deserial_read_struct(data, cursor, &form.flag), cursor, exit); - } break; - case DW_Form_SData: { - TryRead(str8_deserial_read_sleb128(data, cursor, &form.sdata), cursor, exit); - } break; - case DW_Form_UData: { - TryRead(str8_deserial_read_uleb128(data, cursor, &form.udata), cursor, exit); - } break; - case DW_Form_RefAddr: { - if (version < DW_Version_3) { - TryRead(str8_deserial_read(data, cursor, &form.ref, address_size, address_size), cursor, exit); - } else { - TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.ref), cursor, exit); - } - } break; - case DW_Form_GNU_RefAlt: { - TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.ref), cursor, exit); - } break; - case DW_Form_Ref1: { - TryRead(str8_deserial_read(data, cursor, &form.ref, 1, 1), cursor, exit); - } break; - case DW_Form_Ref2: { - TryRead(str8_deserial_read(data, cursor, &form.ref, 2, 2), cursor, exit); - } break; - case DW_Form_Ref4: { - TryRead(str8_deserial_read(data, cursor, &form.ref, 4, 4), cursor, exit); - } break; - case DW_Form_Ref8: { - TryRead(str8_deserial_read(data, cursor, &form.ref, 8, 8), cursor, exit); - } break; - case DW_Form_RefUData: { - TryRead(str8_deserial_read_uleb128(data, cursor, &form.ref), cursor, exit); - } break; - case DW_Form_SecOffset: - case DW_Form_LineStrp: - case DW_Form_GNU_StrpAlt: - case DW_Form_Strp: { - TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.sec_offset), cursor, exit); - } break; - case DW_Form_ExprLoc: { - U64 expr_size = 0; - TryRead(str8_deserial_read_uleb128(data, cursor, &expr_size), cursor, exit); - TryRead(str8_deserial_read_block(data, cursor, expr_size, &form.exprloc), cursor, exit); - } break; - case DW_Form_FlagPresent: { - form.flag = 1; - } break; - case DW_Form_RefSig8: { - //U64 ref = 0; - //cursor = str8_deserial_read_struct(data, cursor, &ref); - NotImplemented; - } break; - case DW_Form_Addrx: - case DW_Form_RngListx: - case DW_Form_Strx: { - TryRead(str8_deserial_read_uleb128(data, cursor, &form.xval), cursor, exit); - } break; - case DW_Form_RefSup4: { - //U32 ref_sup4 = 0; - //cursor = str8_deserial_read_struct(data, cursor, &ref_sup4); - NotImplemented; - } break; - case DW_Form_StrpSup: { - TryRead(str8_deserial_read_dwarf_uint(data, cursor, unit_format, &form.strp_sup), cursor, exit); - } break; - case DW_Form_Data16: { - cursor = str8_deserial_read_block(data, cursor, 16, &form.data); - } break; - case DW_Form_ImplicitConst: { - // Special case. - // Unlike other forms that have their values stored in the .debug_info section, - // This one defines it's value in the .debug_abbrev section. - form.implicit_const = implicit_const; - } break; - case DW_Form_LocListx: { - TryRead(str8_deserial_read_uleb128(data, cursor, &form.xval), cursor, exit); - } break; - case DW_Form_RefSup8: { - NotImplemented; - } break; - case DW_Form_Strx1: { - TryRead(str8_deserial_read(data, cursor, &form.xval, 1, 1), cursor, exit); - } break; - case DW_Form_Strx2: { - TryRead(str8_deserial_read(data, cursor, &form.xval, 2, 2), cursor, exit); - } break; - case DW_Form_Strx3: { - TryRead(str8_deserial_read(data, cursor, &form.xval, 3, 3), cursor, exit); - } break; - case DW_Form_Strx4: { - TryRead(str8_deserial_read(data, cursor, &form.xval, 4, 4), cursor, exit); - } break; - case DW_Form_Addrx1: { - TryRead(str8_deserial_read(data, cursor, &form.xval, 1, 1), cursor, exit); - } break; - case DW_Form_Addrx2: { - TryRead(str8_deserial_read(data, cursor, &form.xval, 2, 2), cursor, exit); - } break; - case DW_Form_Addrx3: { - TryRead(str8_deserial_read(data, cursor, &form.xval, 3, 3), cursor, exit); - } break; - case DW_Form_Addrx4: { - TryRead(str8_deserial_read(data, cursor, &form.xval, 4, 4), cursor, exit); - } break; - default: InvalidPath; break; + }break; } - if (form_out) { - form.kind = form_kind; - *form_out = form; - } - if (bytes_read_out) { - *bytes_read_out = cursor; - } + // rjf: fill + out->version = version; + out->format = format; + out->abbrev_off = abbrev_off; + out->addr_size = addr_size; + out->kind = kind; + out->dwo_id = dwo_id; - is_ok = 1; - exit:; - Assert(is_ok); - return is_ok; -} - -internal U64 -dw_read_tag(Arena *arena, - DW_Raw *input, - DW_AbbrevTable abbrev_table, - DW_Version version, - DW_Format format, - U64 address_size, - Rng1U64 cu_info_range, - U64 tag_info_off, - DW_Tag *tag_out) -{ - U64 bytes_read = 0; - - String8 info_data = input->sec[DW_Section_Info].data; - String8 abbrev_data = input->sec[DW_Section_Abbrev].data; - - String8 tag_data = str8_substr(info_data, cu_info_range); - U64 tag_cursor = tag_info_off - cu_info_range.min; - - // read tag abbrev id - U64 tag_abbrev_id = 0; - TryRead(str8_deserial_read_uleb128(tag_data, tag_cursor, &tag_abbrev_id), tag_cursor, exit); - - B32 has_children = 0; - DW_TagKind tag_kind = DW_TagKind_Null; - DW_AttribList attribs = {0}; - if (tag_abbrev_id > 0) { - // map abbrev id -> .debug_abbrev offset - U64 abbrev_cursor = dw_abbrev_offset_from_abbrev_id(abbrev_table, tag_abbrev_id); - if (abbrev_cursor >= abbrev_data.size) { log_user_errorf("failed to find abbrev id 0x%I64x for tag 0x%I64x", tag_abbrev_id, tag_info_off); goto exit; } - - // read tag abbrev - DW_Abbrev tag_abbrev = {0}; - TryRead(dw_read_abbrev_tag(abbrev_data, abbrev_cursor, &tag_abbrev), abbrev_cursor, exit); - - has_children = !!(tag_abbrev.flags & DW_AbbrevFlag_HasChildren); - tag_kind = (DW_TagKind)tag_abbrev.sub_kind; - - // read attribs - for (; tag_cursor < tag_data.size && abbrev_cursor < abbrev_data.size; ) { - U64 attrib_tag_cursor = tag_cursor; - U64 attrib_abbrev_off = abbrev_cursor; - - // read attrib abbrev - DW_Abbrev attrib_abbrev = {0}; - TryRead(dw_read_abbrev_attrib(abbrev_data, abbrev_cursor, &attrib_abbrev), abbrev_cursor, exit); - - DW_AttribKind attrib_kind = (DW_AttribKind)attrib_abbrev.id; - DW_FormKind form_kind = (DW_FormKind)attrib_abbrev.sub_kind; - - // is this closing attrib? - if (attrib_kind == DW_AttribKind_Null) { break; } - - // special case, allows producer to embed form in .debug_info - if (form_kind == DW_Form_Indirect) { - TryRead(str8_deserial_read_uleb128(tag_data, tag_cursor, &form_kind), tag_cursor, exit); - } - - // read form value - DW_Form form = {0}; - U64 form_size = 0; - if (!dw_read_form(str8_skip(tag_data, tag_cursor), version, format, address_size, form_kind, attrib_abbrev.implicit_const, &form, &form_size)) { - goto exit; - } - tag_cursor += form_size; - - // fill out node - DW_AttribNode *attrib_n = push_array(arena, DW_AttribNode, 1); - attrib_n->v.info_off = cu_info_range.min + attrib_tag_cursor; - attrib_n->v.abbrev_off = attrib_abbrev_off; - attrib_n->v.abbrev_id = attrib_abbrev.id; - attrib_n->v.attrib_kind = attrib_kind; - attrib_n->v.form = form; - - // push node to list - SLLQueuePush(attribs.first, attribs.last, attrib_n); - attribs.count += 1; - } - } - - // fill out tag - tag_out->abbrev_id = tag_abbrev_id; - tag_out->has_children = has_children; - tag_out->kind = tag_kind; - tag_out->attribs = attribs; - tag_out->info_off = tag_info_off; - - bytes_read = tag_cursor - (tag_info_off - cu_info_range.min); - exit:; + // rjf: return # of bytes read + U64 bytes_read = (off - start_off); return bytes_read; } -internal U64 -dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out) -{ - return dw_read_tag(arena, - input, - cu->abbrev_table, - cu->version, - cu->format, - cu->address_size, - cu->info_range, - info_off, - tag_out); -} - -internal B32 -dw_try_u64_from_const_value(U64 type_byte_size, DW_ATE type_encoding, String8 const_value, U64 *value_out) -{ - B32 is_parsed = 0; - if (const_value.size <= type_byte_size) { - U64 value_size = Min(type_byte_size, const_value.size); - if (value_size <= sizeof(*value_out)) { - MemoryZeroStruct(value_out); - MemoryCopy(value_out, const_value.str, value_size); - if (type_encoding == DW_ATE_Signed || type_encoding == DW_ATE_SignedChar) { - *value_out = extend_sign64(*value_out, value_size); - } - is_parsed = 1; - } else { - Assert(!"out value overflow"); - } - } - return is_parsed; -} +//////////////////////////////// +//~ rjf: Abbreviation Map Parsing internal U64 -dw_u64_from_const_value(String8 const_value) +dw2_read_abbrev(Arena *arena, String8 data, U64 off, DW2_AbbrevHeader *header_out, DW2_AbbrevAttribList *attribs_out) { - U64 result = 0; - B32 is_converted = dw_try_u64_from_const_value(sizeof(U64), DW_ATE_Unsigned, const_value, &result); - Assert(is_converted); // TODO: error handling - return result; -} - -internal U64 -dw_interp_sec_offset(DW_Form form) -{ - U64 sec_offset = 0; - if (form.kind == DW_Form_SecOffset) { - sec_offset = form.sec_offset; - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - return sec_offset; -} - -internal String8 -dw_interp_exprloc(DW_Form form) -{ - String8 expr = {0}; - if (form.kind == DW_Form_ExprLoc) { - expr = form.exprloc; - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - return expr; -} - -internal U128 -dw_interp_const_u128(DW_Form form) -{ - AssertAlways(form.data.size <= sizeof(U128)); - U128 result = {0}; - MemoryCopy(&result.u64[0], form.data.str, form.data.size); - return result; -} - -internal U64 -dw_interp_const64(U64 type_byte_size, DW_ATE type_encoding, DW_Form form) -{ - U64 result = max_U64; - if (form.kind == DW_Form_Data1 || form.kind == DW_Form_Data2 || form.kind == DW_Form_Data4 || form.kind == DW_Form_Data8 || form.kind == DW_Form_Data16) { - if (form.data.size <= sizeof(result)) { - if (!dw_try_u64_from_const_value(type_byte_size, type_encoding, form.data, &result)) { - Assert(!"unable to decode data"); - } - } else { - Assert(!"unable to cast U128 to U64"); - } - } else if (form.kind == DW_Form_UData) { - result = form.udata; - } else if (form.kind == DW_Form_SData) { - result = form.sdata; - } else if (form.kind == DW_Form_ImplicitConst) { - result = form.implicit_const; - } else if (form.kind == DW_Form_Null) { - // skip - } else { - AssertAlways(!"unexpected form"); - } - return result; -} - -internal U64 -dw_interp_const_u64(DW_Form form) -{ - return dw_interp_const64(sizeof(U64), DW_ATE_Unsigned, form); -} - -internal U32 -dw_interp_const_u32(DW_Form form) -{ - U64 const64 = dw_interp_const_u64(form); - U32 const32 = safe_cast_u32(const64); - return const32; -} - -internal S64 -dw_interp_const_s64(DW_Form form) -{ - U64 const_u64 = dw_interp_const_u64(form); - S64 const_s64 = (S64)const_u64; - return const_s64; -} - -internal S32 -dw_interp_const_s32(DW_Form form) -{ - U32 const_u32 = dw_interp_const_u32(form); - S32 const_s32 = (S32)const_u32; - return const_s32; -} - -internal U64 -dw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_Form form) -{ - U64 address = 0; - if (form.kind == DW_Form_Addr) { - if (!dw_try_u64_from_const_value(address_size, DW_ATE_Address, form.addr, &address)) { - AssertAlways(!"unable to decode address"); - } - } else if (form.kind == DW_Form_Addrx || form.kind == DW_Form_Addrx1 || form.kind == DW_Form_Addrx2 || - form.kind == DW_Form_Addrx3 || form.kind == DW_Form_Addrx4) { - address = dw_addr_from_list_unit(addr_lu, form.xval); - } else if (form.kind == DW_Form_SecOffset) { - if (addr_lu->segment_selector_size > 0) { - AssertAlways(!"TODO: support for segmented address space"); - } - if (form.sec_offset + addr_lu->segment_selector_size + addr_lu->address_size <= addr_lu->entries.size) { - MemoryCopy(&address, addr_lu->entries.str + form.sec_offset, addr_lu->address_size); - } else { - Assert(!"out of bounds .debug_addr offset"); - } - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - return address; -} - -internal String8 -dw_interp_block(DW_Raw *input, DW_CompUnit *cu, DW_Form form) -{ - NotImplemented; - return str8_zero(); -} - -internal String8 -dw_interp_string(DW_Raw *input, - DW_Format unit_format, - DW_ListUnit *str_offsets, - DW_Form form) -{ - String8 string = {0}; - if (form.kind == DW_Form_String) { - string = form.string; - } else if (form.kind == DW_Form_Strp) { - U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, form.sec_offset, &string); - Assert(bytes_read > 0); - } else if (form.kind == DW_Form_LineStrp) { - U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_LineStr].data, form.sec_offset, &string); - Assert(bytes_read > 0); - } else if (form.kind == DW_Form_StrpSup) { - U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, form.strp_sup, &string); - Assert(bytes_read > 0); - } else if (form.kind == DW_Form_Strx || form.kind == DW_Form_Strx1 || - form.kind == DW_Form_Strx2 || form.kind == DW_Form_Strx3 || - form.kind == DW_Form_Strx4) { - U64 sec_offset = dw_offset_from_list_unit(str_offsets, form.xval); - if (sec_offset < input->sec[DW_Section_Str].data.size) { - U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, sec_offset, &string); - Assert(bytes_read > 0); - } else { - AssertAlways(!"unable to translate index to offset"); - } - } else if (form.kind == DW_Form_GNU_StrpAlt) { - NotImplemented; - } else if (form.kind == DW_Form_GNU_StrIndex) { - NotImplemented; - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - return string; -} - -internal String8 -dw_interp_line_ptr(DW_Raw *input, DW_Form form) -{ - String8 result = {0}; - if (form.kind == DW_Form_SecOffset) { - result = str8_skip(input->sec[DW_Section_Line].data, form.sec_offset); - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - return result; -} - -internal DW_LineFile * -dw_interp_file(DW_LineVM *line_vm, DW_Form form) -{ - U64 file_idx = dw_interp_const_u64(form); - DW_LineFile *result = dw_line_vm_find_file(line_vm, file_idx); - return result; -} - -internal DW_Reference -dw_interp_ref(DW_Raw *input, DW_CompUnit *cu, DW_Form form) -{ - DW_Reference ref = {0}; - if (form.kind == DW_Form_Ref1 || form.kind == DW_Form_Ref2 || - form.kind == DW_Form_Ref4 || form.kind == DW_Form_Ref8 || - form.kind == DW_Form_RefUData) { - ref.cu = cu; - ref.info_off = cu->info_range.min + form.ref; - } else if (form.kind == DW_Form_RefAddr) { - NotImplemented; - } else if (form.kind == DW_Form_RefSig8) { - NotImplemented; - } else if (form.kind == DW_Form_RefSup4 || form.kind == DW_Form_RefSup8) { - NotImplemented; - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - return ref; -} - -internal DW_LocList -dw_interp_loclist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form) -{ - DW_LocList loclist = {0}; + U64 start_off = off; - if (cu->version < DW_Version_5) { - if (form.kind == DW_Form_SecOffset) { - U64 sec_offset = max_U64; - if (form.kind == DW_Form_SecOffset) { - sec_offset = form.sec_offset; - } else if (form.kind == DW_Form_Data8 || form.kind == DW_Form_Data4 || - form.kind == DW_Form_Data2 || form.kind == DW_Form_Data1) { - if (!dw_try_u64_from_const_value(form.data.size, DW_ATE_Unsigned, form.data, &sec_offset)) { - Assert(!"unable to extract section offset"); - } - } else if (form.kind == DW_Form_Null) { - Assert(!"unexpected form"); - } - - String8 sec = str8_skip(input->sec[DW_Section_Loc].data, sec_offset); - U64 base_addr = cu->low_pc; - U64 base_sel = DW_SentinelFromSize(cu->address_size); - for (U64 cursor = 0; cursor < sec.size; ) { - U64 range_min = 0; - U64 range_min_off = cursor; - U64 range_min_size = str8_deserial_read(sec, range_min_off, &range_min, cu->address_size, cu->address_size); - if (range_min_size == 0) { - break; - } - U64 range_max = 0; - U64 range_max_off = cursor + cu->address_size; - U64 range_max_size = str8_deserial_read(sec, range_max_off, &range_max, cu->address_size, cu->address_size); - if (range_max_size == 0) { - break; - } - cursor += cu->address_size * 2; - - // series terminator - if (range_min == 0 && range_max == 0) { - break; - } - // set new base address - else if (range_min == base_sel) { - base_addr = range_max; - } - // location - else { - U16 expr_size = 0; - U64 expr_size_size = str8_deserial_read_struct(sec, cursor, &expr_size); - if (expr_size_size == 0) { - Assert(!"unable to read expression size"); - break; - } - cursor += expr_size_size; - - Assert(cursor + expr_size <= sec.size); - Rng1U64 expr_range = rng_1u64(cursor, ClampTop(cursor + expr_size, sec.size)); - - DW_LocNode *loc_n = push_array(arena, DW_LocNode, 1); - loc_n->v.range = rng_1u64(base_addr + range_min, base_addr + range_max); - loc_n->v.expr = str8_substr(sec, expr_range); - - SLLQueuePush(loclist.first, loclist.last, loc_n); - ++loclist.count; - - // advance past expression - cursor += expr_size; - } - } - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - } else { - DW_Version version = DW_Version_Null; - String8 raw_lle = {0}; - if (form.kind == DW_Form_SecOffset) { - // offset is from beginning of the section - U64 sec_offset = form.sec_offset; - raw_lle = str8_skip(input->sec[DW_Section_LocLists].data, sec_offset); - } else if (form.kind == DW_Form_LocListx) { - // offset is from beginning of the entries - U64 entries_off = dw_offset_from_list_unit(cu->loclists_lu, form.xval); - raw_lle = str8_skip(cu->loclists_lu->entries, entries_off); - version = cu->loclists_lu->version; - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - - for (U64 cursor = 0, keep_parsing = 1, base_addr = cu->low_pc; - cursor < raw_lle.size && keep_parsing; ) { - DW_LLE kind = DW_LLE_EndOfList; - cursor += str8_deserial_read_struct(raw_lle, cursor, &kind); - - Rng1U64 range = {0}; - switch (kind) { - default: - Assert(!"unknown kind"); - case DW_LLE_EndOfList: { - keep_parsing = 0; - } break; - case DW_LLE_BaseAddressx: { - if (!cu->addr_lu) { - keep_parsing = 0; - break; - } - - U64 addrx = 0; - U64 addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &addrx); - if (addrx_size == 0) { - keep_parsing = 0; - break; - } - - U64 base_addr_new = dw_addr_from_list_unit(cu->addr_lu, addrx); - if (base_addr_new == max_U64) { - InvalidPath; - break; - } - - base_addr = base_addr_new; - cursor += addrx_size; - } break; - case DW_LLE_StartxEndx: { - U64 start_addrx = 0; - U64 start_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &start_addrx); - if (start_addrx_size == 0) { - keep_parsing = 0; - break; - } - U64 end_addrx = 0; - U64 end_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor + start_addrx_size, &end_addrx); - if (end_addrx_size == 0) { - keep_parsing = 0; - break; - } - cursor += start_addrx_size; - cursor += end_addrx_size; - - U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx); - U64 end = dw_addr_from_list_unit(cu->addr_lu, end_addrx); - Assert(start != max_U64); - Assert(end != max_U64); - - range = rng_1u64(start, end); - } break; - case DW_LLE_StartxLength: { - U64 start_addrx = 0; - U64 start_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &start_addrx); - if (start_addrx_size == 0) { - keep_parsing = 0; - break; - } - - // parse pre-standard & standard length - U64 length_off = cursor + start_addrx_size; - U64 length = 0; - U64 length_size = str8_deserial_read_uleb128(raw_lle, length_off, &length); - if (length_size == 0) { - keep_parsing = 0; - break; - } - - cursor += start_addrx_size; - cursor += length_size; - - if (cu->addr_lu) { - U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx); - Assert(start < max_U64); - - range = rng_1u64(start, start + length); - } else { - Assert(!".debug_addr section is missing -- unable to interpret address index"); - } - } break; - case DW_LLE_OffsetPair: { - U64 start = 0; - U64 start_size = str8_deserial_read_uleb128(raw_lle, cursor, &start); - if (start_size == 0) { - keep_parsing = 0; - break; - } - U64 end = 0; - U64 end_size = str8_deserial_read_uleb128(raw_lle, cursor + start_size, &end); - if (end_size == 0) { - keep_parsing = 0; - break; - } - cursor += start_size; - cursor += end_size; - - range = rng_1u64(base_addr + start, base_addr + end); - } break; - case DW_LLE_DefaultLocation: { - // no range - int x = 0; - } break; - case DW_LLE_BaseAddress: { - U64 base_addr_size = str8_deserial_read(raw_lle, cursor, &base_addr, cu->address_size, cu->address_size); - if (base_addr_size == 0) { - keep_parsing = 0; - break; - } - cursor += base_addr_size; - } break; - case DW_LLE_StartEnd: { - U64 start = 0; - U64 start_size = str8_deserial_read(raw_lle, cursor, &start, cu->address_size, cu->address_size); - if (start_size == 0) { - keep_parsing = 0; - break; - } - - U64 end = 0; - U64 end_size = str8_deserial_read(raw_lle, cursor + start_size, &end, cu->address_size, cu->address_size); - if (end_size == 0) { - keep_parsing = 0; - break; - } - cursor += start_size; - cursor += end_size; - - range = rng_1u64(start, end); - } break; - case DW_LLE_StartLength: { - U64 start = 0; - U64 start_size = str8_deserial_read(raw_lle, cursor, &start, cu->address_size, cu->address_size); - if (start_size == 0) { - keep_parsing = 0; - break; - } - U64 length = 0; - U64 length_size = str8_deserial_read_uleb128(raw_lle, cursor + start_size, &length); - if (length_size == 0) { - keep_parsing = 0; - break; - } - cursor += start_size; - cursor += length_size; - - range = rng_1u64(start, start + length); - } break; - } - - B32 has_expr = keep_parsing && kind != DW_LLE_BaseAddressx && kind != DW_LLE_BaseAddress; - if (has_expr) { - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(raw_lle, cursor, &expr_size); - if (expr_size_size == 0) { - keep_parsing = 0; - break; - } - - String8 expr = {0}; - U64 expr_read_size = str8_deserial_read_block(raw_lle, cursor + expr_size_size, expr_size, &expr); - if (expr_read_size != expr_size) { - keep_parsing = 0; - break; - } - - cursor += expr_size_size; - cursor += expr_size; - - DW_LocNode *loc_n = push_array(arena, DW_LocNode, 1); - loc_n->v.range = range; - loc_n->v.expr = expr; - - SLLQueuePush(loclist.first, loclist.last, loc_n); - ++loclist.count; - } - } - } - - return loclist; -} - -internal B32 -dw_interp_flag(DW_Form form) -{ - B32 flag = 0; - if (form.kind == DW_Form_Flag || form.kind == DW_Form_FlagPresent) { - flag = form.flag; - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - return flag; -} - -internal Rng1U64List -dw_interp_rnglist(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form) -{ - Rng1U64List rnglist = {0}; - - if (cu->version < DW_Version_5) { - // decode section offset - U64 sec_offset = max_U64; - if (form.kind == DW_Form_SecOffset) { - sec_offset = form.sec_offset; - } else if (form.kind == DW_Form_Data8 || form.kind == DW_Form_Data4 || - form.kind == DW_Form_Data2 || form.kind == DW_Form_Data1) { - if (!dw_try_u64_from_const_value(form.data.size, DW_ATE_Unsigned, form.data, &sec_offset)) { - Assert(!"unable to extract section offset"); - } - } else if (form.kind != DW_Form_Null) { - Assert(!"unexpected form"); - } - - String8 sec = str8_skip(input->sec[DW_Section_Ranges].data, sec_offset); - U64 base_addr = cu->low_pc; - U64 base_sel = DW_SentinelFromSize(cu->address_size); - for (U64 cursor = 0; cursor < sec.size; ) { - U64 range_min = 0; - U64 range_min_off = cursor; - U64 range_min_size = str8_deserial_read(sec, range_min_off, &range_min, cu->address_size, cu->address_size); - if (range_min_size == 0) { - break; - } - U64 range_max = 0; - U64 range_max_off = cursor + cu->address_size; - U64 range_max_size = str8_deserial_read(sec, range_max_off, &range_max, cu->address_size, cu->address_size); - if (range_max_size == 0) { - break; - } - cursor += cu->address_size * 2; - - // series terminator - if (range_min == 0 && range_max == 0) { - break; - } - // set new base address - else if (range_min == base_sel) { - base_addr = range_max; - } - // range - else { - Rng1U64 range = rng_1u64(base_addr + range_min, base_addr + range_max); - rng1u64_list_push(arena, &rnglist, range); - } - } - } else { - String8 raw_rle = {0}; - if (form.kind == DW_Form_SecOffset) { - // offset is from beginning of the section - U64 sec_offset = form.sec_offset; - raw_rle = str8_skip(input->sec[DW_Section_RngLists].data, sec_offset); - } else if (form.kind == DW_Form_RngListx) { - // offset is from beginning of the entries - U64 sec_offset = dw_offset_from_list_unit(cu->rnglists_lu, form.xval); - raw_rle = str8_skip(cu->rnglists_lu->entries, sec_offset); - } else if (form.kind != DW_Form_Null) { - AssertAlways(!"unexpected form"); - } - - U64 rle_invalid_value = DW_SentinelFromSize(cu->address_size); - U64 base_addr = cu->low_pc; - for (U64 cursor = 0, keep_parsing = 1; cursor < raw_rle.size && keep_parsing; ) { - DW_RLE kind = DW_RLE_EndOfList; - cursor += str8_deserial_read_struct(raw_rle, cursor, &kind); - - Rng1U64 range = rng_1u64(rle_invalid_value, rle_invalid_value); - switch (kind) { - default: - case DW_RLE_EndOfList: { - keep_parsing = 0; - } break; - case DW_RLE_BaseAddressx: { - U64 addrx = 0; - U64 addrx_size = str8_deserial_read_uleb128(raw_rle, cursor, &addrx); - if (addrx_size == 0) { - keep_parsing = 0; - break; - } - if (cu->addr_lu == 0) { - keep_parsing = 0; - break; - } - U64 base_addr_new = dw_addr_from_list_unit(cu->addr_lu, addrx); - if (base_addr_new < max_U64) { - base_addr = base_addr_new; - cursor += addrx_size; - } else { - keep_parsing = 0; - Assert(!"invalid addrx"); - } - } break; - case DW_RLE_StartxLength: { - U64 start_addrx = 0; - U64 start_addrx_size = str8_deserial_read_uleb128(raw_rle, cursor, &start_addrx); - if (start_addrx_size == 0) { - keep_parsing = 0; - break; - } - U64 length = 0; - U64 length_size = str8_deserial_read_uleb128(raw_rle, cursor + start_addrx_size, &length); - if (length_size == 0) { - keep_parsing = 0; - break; - } - cursor += start_addrx_size; - cursor += length_size; - - if (cu->addr_lu) { - U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx); - AssertAlways(start < max_U64); - range = rng_1u64(start, start + length); - } - } break; - case DW_RLE_OffsetPair: { - U64 offset_start, offset_end = 0; - U64 offset_start_size = str8_deserial_read_uleb128(raw_rle, cursor, &offset_start); - if (offset_start_size == 0) { - keep_parsing = 0; - break; - } - U64 offset_end_size = str8_deserial_read_uleb128(raw_rle, cursor + offset_start_size, &offset_end); - if (offset_end_size == 0) { - keep_parsing = 0; - break; - } - cursor += offset_start_size; - cursor += offset_end_size; - - range = rng_1u64(base_addr + offset_start, base_addr + offset_end); - } break; - case DW_RLE_BaseAddress: { - U64 base_addr_size = str8_deserial_read(raw_rle, cursor, &base_addr, cu->address_size, cu->address_size); - if (base_addr_size == 0) { - keep_parsing = 0; - break; - } - cursor += base_addr_size; - } break; - case DW_RLE_StartEnd: { - U64 start = 0, end = 0; - - U64 start_size = str8_deserial_read(raw_rle, cursor, &start, cu->address_size, cu->address_size); - if (start_size == 0) { - keep_parsing = 0; - break; - } - U64 end_size = str8_deserial_read(raw_rle, cursor + start_size, &end, cu->address_size, cu->address_size); - if (end_size == 0) { - keep_parsing = 0; - break; - } - cursor += start_size; - cursor += end_size; - - range = rng_1u64(start, end); - } break; - case DW_RLE_StartLength: { - U64 start = 0, length = 0; - - U64 start_size = str8_deserial_read(raw_rle, cursor, &start, cu->address_size, cu->address_size); - if (start_size == 0) { - keep_parsing = 0; - break; - } - U64 length_size = str8_deserial_read_uleb128(raw_rle, cursor + start_size, &length); - if (length_size == 0) { - keep_parsing = 0; - break; - } - cursor += start_size; - cursor += length_size; - - range = rng_1u64(start, start + length); - } break; - } - - if (range.min != rle_invalid_value) { - rng1u64_list_push(arena, &rnglist, range); - } - } - } - - return rnglist; -} - -internal String8 -dw_interp_secptr(DW_Raw *input, DW_SectionKind section, DW_Form form) -{ - String8 secptr = {0}; - if (form.kind == DW_Form_SecOffset) { - String8 sect = input->sec[section].data; - Rng1U64 range = rng_1u64(form.sec_offset, sect.size); - secptr = str8_substr(sect, range); - } else if (form.kind != DW_Form_Null) { - Assert(!"unexpected form"); - } - return secptr; -} - -internal String8 -dw_interp_addrptr(DW_Raw *input, DW_Form form) -{ - return dw_interp_secptr(input, DW_Section_Addr, form); -} - -internal String8 -dw_interp_str_offsets_ptr(DW_Raw *input, DW_Form form) -{ - return dw_interp_secptr(input, DW_Section_StrOffsets, form); -} - -internal String8 -dw_interp_rnglists_ptr(DW_Raw *input, DW_Form form) -{ - return dw_interp_secptr(input, DW_Section_RngLists, form); -} - -internal String8 -dw_interp_loclists_ptr(DW_Raw *input, DW_Form form) -{ - return dw_interp_secptr(input, DW_Section_LocLists, form); -} - -internal DW_AttribClass -dw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib) -{ - return dw_pick_attrib_value_class(cu->version, cu->ext, cu->relaxed, attrib->attrib_kind, attrib->form.kind); -} - -internal String8 -dw_exprloc_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_ExprLoc || value_class == DW_AttribClass_Block); - return dw_interp_exprloc(attrib->form); -} - -internal U128 -dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_u128(attrib->form); -} - -internal U64 -dw_const_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_u64(attrib->form); -} - -internal U32 -dw_const_u32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_u32(attrib->form); -} - -internal S64 -dw_const_s64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_s64(attrib->form); -} - -internal S32 -dw_const_s32_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_const_s32(attrib->form); -} - -internal B32 -dw_flag_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Flag); - return dw_interp_flag(attrib->form); -} - -internal U64 -dw_address_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || - value_class == DW_AttribClass_Address || - value_class == DW_AttribClass_AddrPtr); - DW_Form form = attrib->form; - if (value_class == DW_AttribClass_AddrPtr) { - if (attrib->form.kind == DW_Form_SecOffset) { - NotImplemented; - } else { - AssertAlways(!"unexpected form"); - } - - form.kind = DW_Form_Addr; - form.addr = dw_interp_addrptr(input, attrib->form); - } - return dw_interp_address(cu->address_size, cu->low_pc, cu->addr_lu, form); -} - -internal String8 -dw_block_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Block); - return dw_interp_block(input, cu, attrib->form); -} - -internal String8 -dw_string_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_String || value_class == DW_AttribClass_StrOffsetsPtr); - return dw_interp_string(input, cu->format, cu->str_offsets_lu, attrib->form); -} - -internal String8 -dw_line_ptr_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_LinePtr); - return dw_interp_line_ptr(input, attrib->form); -} - -internal DW_LineFile * -dw_file_from_attrib(DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const); - return dw_interp_file(line_vm, attrib->form); -} - -internal DW_Reference -dw_ref_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Reference); - return dw_interp_ref(input, cu, attrib->form); -} - -internal DW_LocList -dw_loclist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - AssertAlways(value_class == DW_AttribClass_Null || - value_class == DW_AttribClass_LocList || - value_class == DW_AttribClass_LocListPtr); - return dw_interp_loclist(arena, input, cu, attrib->form); -} - -internal Rng1U64List -dw_rnglist_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - Rng1U64List rnglist = {0}; - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - if (value_class == DW_AttribClass_RngListPtr || value_class == DW_AttribClass_RngList) { - rnglist = dw_interp_rnglist(arena, input, cu, attrib->form); - } else if (value_class != DW_AttribClass_Null) { - Assert(!"unexpected value class"); - } - return rnglist; -} - -internal DW_Attrib * -dw_attrib_from_tag_(DW_Tag tag, DW_AttribKind kind) -{ - local_persist read_only DW_Attrib null_attrib; - DW_Attrib *attrib = &null_attrib; - for (DW_AttribNode *attrib_n = tag.attribs.first; attrib_n != 0; attrib_n = attrib_n->next) { - if (attrib_n->v.attrib_kind == kind) { - attrib = &attrib_n->v; - break; - } - } - return attrib; -} - -internal DW_Attrib * -dw_attrib_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - DW_Attrib *attrib = dw_attrib_from_tag_(tag, kind); - - if (attrib->attrib_kind == DW_AttribKind_Null) { - if (cu && cu->tag_ht) { - DW_Attrib *ao_attrib = dw_attrib_from_tag_(tag, DW_AttribKind_AbstractOrigin); - if (ao_attrib->attrib_kind == DW_AttribKind_AbstractOrigin) { - DW_Reference ref = dw_interp_ref(input, cu, ao_attrib->form); - DW_TagNode *ref_tag = dw_tag_node_from_info_off(ref.cu, ref.info_off); - attrib = dw_attrib_from_tag_(ref_tag->tag, kind); - } - } - } - - return attrib; -} - -internal B32 -dw_tag_has_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); - B32 has_attrib = attrib->attrib_kind != DW_AttribKind_Null; - return has_attrib; -} - -internal String8 -dw_exprloc_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_exprloc_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal String8 -dw_block_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_block_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal U128 -dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_const_u128_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal U64 -dw_const_u64_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_const_u64_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal U32 -dw_const_u32_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_const_u32_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal U64 -dw_address_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_address_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal String8 -dw_string_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_string_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal String8 -dw_line_ptr_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_line_ptr_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal DW_Reference -dw_ref_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_ref_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal DW_LocList -dw_loclist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_loclist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal Rng1U64List -dw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_rnglist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal B32 -dw_flag_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - return dw_flag_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal DW_LineFile * -dw_file_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind) -{ - return dw_file_from_attrib(cu, line_vm, dw_attrib_from_tag(input, cu, tag, kind)); -} - -internal B32 -dw_try_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out) -{ - B32 has_byte_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ByteSize); - B32 has_bit_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_BitSize ); - - if (has_byte_size && has_bit_size) { - Assert(!"ill formated byte size"); - } - - if (has_byte_size) { - *byte_size_out = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - return 1; - } else if (has_bit_size) { - U64 bit_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_BitSize); - *byte_size_out = bit_size / 8; - return 1; - } - - return 0; -} - -internal U64 -dw_byte_size_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) -{ - U64 byte_size = max_U64; - dw_try_byte_size_from_tag(input, cu, tag, &byte_size); - return byte_size; -} - -internal U32 -dw_byte_size_32_from_tag(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag) -{ - U32 byte_size32 = 0; - U64 byte_size64; - if (dw_try_byte_size_from_tag(input, cu, tag, &byte_size64)) { - byte_size32 = safe_cast_u32(byte_size64); - } - return byte_size32; -} - -internal U64 -dw_u64_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - U64 result = 0; - DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); - DW_AttribClass attrib_class = dw_value_class_from_attrib(cu, attrib); - if (attrib_class == DW_AttribClass_Const || attrib_class == DW_AttribClass_Block) { - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Type)) { - Temp scratch = scratch_begin(0,0); - DW_Reference type_ref = dw_ref_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Type); - DW_Tag type_tag = {0}; - dw_read_tag_cu(scratch.arena, input, type_ref.cu, type_ref.info_off, &type_tag); - U64 type_byte_size = dw_byte_size_from_tag(input, cu, type_tag); - DW_ATE type_encoding = dw_const_u64_from_tag_attrib_kind(input, type_ref.cu, type_tag, DW_AttribKind_Encoding); - if (type_encoding == DW_ATE_Unsigned || type_encoding == DW_ATE_UnsignedChar) { - result = dw_interp_const64(type_byte_size, type_encoding, attrib->form); - } - scratch_end(scratch); - } else { - result = dw_interp_const_u64(attrib->form); - } - } else if (attrib_class == DW_AttribClass_Address) { - result = dw_address_from_attrib(input, cu, attrib); - } else if (attrib_class == DW_AttribClass_Reference) { - NotImplemented; - } else if (attrib_class != DW_AttribClass_Null) { - AssertAlways(!"unexpected attrib class"); - } - return result; -} - -internal B32 -dw_is_attrib_var_ref(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib) -{ - B32 is_var_ref = 0; - if (dw_is_form_kind_ref(cu->version, cu->ext, attrib->form.kind)) { - Temp scratch = scratch_begin(0,0); - DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); - DW_Tag ref_tag = {0}; - if (dw_read_tag_cu(scratch.arena, input, ref.cu, ref.info_off, &ref_tag)) { - is_var_ref = ref_tag.kind == DW_TagKind_Variable; - } - scratch_end(scratch); - } - return is_var_ref; -} - -internal DW_CompUnit -dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 cu_header_offset, B32 relaxed) -{ - DW_CompUnit cu = {0}; - - U32 first_four_bytes = 0; - if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } - DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - - // read unit size in bytes - U64 length = 0; - U64 length_size = str8_deserial_read_dwarf_packed_size(input->sec[DW_Section_Info].data, cu_header_offset, &length); - if (length_size == 0) { goto exit; } - - // compute unit range - Rng1U64 info_range = rng_1u64(cu_header_offset, cu_header_offset + length_size + length); - String8 info = str8_substr(input->sec[DW_Section_Info].data, info_range); - U64 info_cursor = length_size; - - // read version - DW_Version version; - TryRead(str8_deserial_read_struct(info, info_cursor, &version), info_cursor, exit); - - U64 abbrev_base = max_U64; - U8 address_size = 0; - DW_CompUnitKind unit_kind = DW_CompUnitKind_Reserved; - U64 spec_dwo_id = max_U64; - B32 is_header_ok = 0; - switch (version) { - default: - case DW_Version_Null: { - } break; - case DW_Version_1: { - NotImplemented; - } break; - case DW_Version_2: { - U32 abbrev_base32; - TryRead(str8_deserial_read_struct(info, info_cursor, &abbrev_base32), info_cursor, exit); - TryRead(str8_deserial_read_struct(info, info_cursor, &address_size), info_cursor, exit); - abbrev_base = abbrev_base32; - is_header_ok = 1; - } break; - case DW_Version_3: - case DW_Version_4: { - TryRead(str8_deserial_read_dwarf_uint(info, info_cursor, format, &abbrev_base), info_cursor, exit); - TryRead(str8_deserial_read_struct (info, info_cursor, &address_size), info_cursor, exit); - is_header_ok = 1; - } break; - case DW_Version_5: { - TryRead(str8_deserial_read_struct (info, info_cursor, &unit_kind), info_cursor, exit); - TryRead(str8_deserial_read_struct (info, info_cursor, &address_size), info_cursor, exit); - TryRead(str8_deserial_read_dwarf_uint(info, info_cursor, format, &abbrev_base), info_cursor, exit); - if (unit_kind == DW_CompUnitKind_Skeleton || input->sec[DW_Section_Info].is_dwo) { - TryRead(str8_deserial_read_struct(info, info_cursor, &spec_dwo_id), info_cursor, exit); - } - is_header_ok = 1; - } break; - } - - U64 header_size = info_cursor; - - if (is_header_ok) { - Temp temp = temp_begin(arena); - - // TODO: cache abbrev tables with identical offsets - DW_AbbrevTable abbrev_table = dw_make_abbrev_table(arena, input->sec[DW_Section_Abbrev].data, abbrev_base); - - DW_Tag cu_tag = {0}; - dw_read_tag(arena, input, abbrev_table, version, format, address_size, info_range, cu_header_offset + header_size, &cu_tag); - - // TODO: handle these unit types - if (cu_tag.kind == DW_TagKind_SkeletonUnit) { log_user_errorf("TODO: Skeleton Unit"); } - if (cu_tag.kind == DW_TagKind_TypeUnit) { log_user_errorf("TODO Type Unit"); } - - if (cu_tag.kind != DW_TagKind_CompileUnit && cu_tag.kind != DW_TagKind_PartialUnit) { - // unexpected tag, release memory and exit - temp_end(temp); - goto exit; - } - - // fetch attribs for list sections - DW_Attrib *addr_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_AddrBase ); - DW_Attrib *str_offsets_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_StrOffsetsBase); - DW_Attrib *rnglists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_RngListsBase ); - DW_Attrib *loclists_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LocListsBase ); - - // interp attribs as section offsets - U64 addr_sec_off = dw_interp_sec_offset(addr_base_attrib->form ); - U64 str_offsets_sec_off = dw_interp_sec_offset(str_offsets_base_attrib->form); - U64 rnglists_sec_off = dw_interp_sec_offset(rnglists_base_attrib->form ); - U64 loclists_sec_off = dw_interp_sec_offset(loclists_base_attrib->form ); - - // map section offset to unit index - U64 addr_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.addr_ranges, addr_sec_off ); - U64 str_offsets_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.str_offset_ranges, str_offsets_sec_off); - U64 rnglists_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.rnglist_ranges, rnglists_sec_off ); - U64 loclists_lu_num = rng1u64_array_num_from_value__binary_search(&lu_input.loclist_ranges, loclists_sec_off ); - - // map index to unit - DW_ListUnit *addr_lu = 0 < (addr_lu_num && addr_lu_num <= lu_input.addr_count) ? &lu_input.addrs[addr_lu_num-1] : 0; - DW_ListUnit *str_offsets_lu = 0 < (str_offsets_lu_num && str_offsets_lu_num <= lu_input.str_offset_count) ? &lu_input.str_offsets[str_offsets_lu_num-1] : 0; - DW_ListUnit *rnglists_lu = 0 < (rnglists_lu_num && rnglists_lu_num <= lu_input.rnglist_count) ? &lu_input.rnglists[rnglists_lu_num-1] : 0; - DW_ListUnit *loclists_lu = 0 < (loclists_lu_num && loclists_lu_num <= lu_input.loclist_count) ? &lu_input.loclists[loclists_lu_num-1] : 0; - - // find compile unit base address - DW_Attrib *low_pc_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LowPc); - U64 low_pc = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form); - - // fill out compile unit - cu.relaxed = relaxed; - cu.ext = DW_Ext_All; - cu.kind = unit_kind; - cu.version = version; - cu.format = format; - cu.address_size = address_size; - cu.abbrev_off = abbrev_base; - cu.info_range = info_range; - cu.first_tag_info_off = cu_header_offset + header_size; - cu.abbrev_table = abbrev_table; - cu.addr_lu = addr_lu; - cu.str_offsets_lu = str_offsets_lu; - cu.rnglists_lu = rnglists_lu; - cu.loclists_lu = loclists_lu; - cu.low_pc = low_pc; - cu.tag = cu_tag; - } - - exit:; - return cu; -} - -internal void -dw_tag_tree_from_data(Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *parent, U64 *cursor, U64 *tag_count) -{ - while (*cursor < cu->info_range.max) { - // read tag - DW_Tag tag = {0}; - TryRead(dw_read_tag(arena, input, cu->abbrev_table, cu->version, cu->format, cu->address_size, cu->info_range, *cursor, &tag), *cursor, exit); - - // reached of the CU? - if (tag.kind == DW_TagKind_Null) { break; } - - // normal tag - DW_TagNode *tag_n = push_array(arena, DW_TagNode, 1); - tag_n->tag = tag; - - SLLQueuePush_N(parent->first_child, parent->last_child, tag_n, sibling); - - // update tag count - *tag_count += 1; - - if (tag.has_children) { - dw_tag_tree_from_data(arena, input, cu, tag_n, cursor, tag_count); - } - } - exit:; -} - -internal DW_TagTree -dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu) -{ - DW_TagNode root = {0}; - U64 cursor = cu->first_tag_info_off; - U64 tag_count = 0; - dw_tag_tree_from_data(arena, input, cu, &root, &cursor, &tag_count); - Assert(cursor == cu->info_range.max); - return (DW_TagTree){ .root = root.first_child, .tag_count = tag_count }; -} - -internal HashTable * -dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree) -{ - Temp scratch = scratch_begin(&arena, 1); - - struct Frame { - struct Frame *next; - DW_TagNode *node; - }; - - struct Frame *free_frames = 0; - struct Frame *stack = push_array(scratch.arena, struct Frame, 1); - stack->node = tag_tree.root; - - HashTable *ht = hash_table_init(arena, (U64)((F64)tag_tree.tag_count * 1.3)); - - while (stack) { - while (stack->node) { - hash_table_push_u64_raw(arena, ht, stack->node->tag.info_off, stack->node); - - if (stack->node->first_child) { - struct Frame *frame = free_frames; - if (frame) { - SLLStackPop(free_frames); - MemoryZeroStruct(frame); - } else { - frame = push_array(scratch.arena, struct Frame, 1); - } - frame->node = stack->node->first_child; - SLLStackPush(stack, frame); - } else { - stack->node = stack->node->sibling; - } - } - - // recycle free frame - struct Frame *frame = stack; - SLLStackPop(stack); - SLLStackPush(free_frames, frame); - - if (stack) { - stack->node = stack->node->sibling; - } - } - - scratch_end(scratch); - return ht; -} - -internal DW_TagNode * -dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off) -{ - DW_TagNode *tag_node = hash_table_search_u64_raw(cu->tag_ht, info_off); - return tag_node; -} - -internal U64 -dw_read_line_vm_header(Arena *arena, - DW_Raw *input, - String8 cu_stmt_list, - String8 cu_dir, - String8 cu_name, - U8 cu_address_size, - DW_ListUnit *cu_str_offsets, - DW_LineVMHeader *header_out) -{ - Temp scratch = scratch_begin(&arena, 1); - - U64 cursor = 0; - - U32 first_four_bytes = 0; - if (str8_deserial_read_struct(cu_stmt_list, 0, &first_four_bytes) != sizeof(U32)) { goto exit; } - - // read unit length - U64 length = 0; - U64 length_size = str8_deserial_read_dwarf_packed_size(cu_stmt_list, 0, &length); - DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - - cursor = length_size; - String8 data = str8_substr(cu_stmt_list, r1u64(0, length + length_size)); - - // read unit version - DW_Version version = DW_Version_Null; - TryRead(str8_deserial_read_struct(data, cursor, &version), cursor, exit); - - // read DWARF5 address & segment selector - U8 address_size = cu_address_size; - U8 segsel_size = 0; - if (version == DW_Version_5) { - TryRead(str8_deserial_read_struct(data, cursor, &address_size), cursor, exit); - TryRead(str8_deserial_read_struct(data, cursor, &segsel_size), cursor, exit); - } - - U64 header_length = 0; - TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &header_length), cursor, exit); - U64 line_program_off = cursor + header_length; - - // substring header so we dont overread into the line program - data = str8_prefix(data, cursor + header_length); - - U8 min_inst_len = 0; - TryRead(str8_deserial_read_struct(data, cursor, &min_inst_len), cursor, exit); - - U8 max_ops_for_inst = 1; - if (version > DW_Version_3) { - TryRead(str8_deserial_read_struct(data, cursor, &max_ops_for_inst), cursor, exit); - Assert(max_ops_for_inst > 0); - } - - U8 default_is_stmt = 0; - TryRead(str8_deserial_read_struct(data, cursor, &default_is_stmt), cursor, exit); - - S8 line_base = 0; - TryRead(str8_deserial_read_struct(data, cursor, &line_base), cursor, exit); - - U8 line_range = 0; - TryRead(str8_deserial_read_struct(data, cursor, &line_range), cursor, exit); - - U8 opcode_base = 0; - TryRead(str8_deserial_read_struct(data, cursor, &opcode_base), cursor, exit); - - U64 num_opcode_lens = opcode_base > 0 ? opcode_base - 1 : 0; - String8 opcode_lens; - TryRead(str8_deserial_read_block(data, cursor, num_opcode_lens * sizeof(U8), &opcode_lens), cursor, exit); - - String8Array dir_table = {0}; - DW_LineFileArray file_table = {0}; - if (version < DW_Version_5) { - // read directory table - String8List dir_list = {0}; - - // compile directory is always first in the table - str8_list_push(scratch.arena, &dir_list, cu_dir); - - // parse additional directories - while (cursor < data.size) { - String8 dir = {0}; - TryRead(str8_deserial_read_cstr(data, cursor, &dir), cursor, exit); - if (dir.size == 0) { break; } - str8_list_push(scratch.arena, &dir_list, dir); - } - - DW_LineFileList file_list = {0}; - { - // compile unit name is always first in the file table - { - DW_LineFileNode *node = push_array(scratch.arena, DW_LineFileNode, 1); - node->file.path = cu_name; - SLLQueuePush(file_list.first, file_list.last, node); - file_list.node_count += 1; - } - - // read file table - while (cursor < data.size) { - U8 first_byte = 0; - if (str8_deserial_read_struct(data, cursor, &first_byte) == 0) { goto exit; } - if (first_byte == 0) { break; } - - DW_LineFile file = {0}; - TryRead(str8_deserial_read_cstr (data, cursor, &file.path), cursor, exit); - TryRead(str8_deserial_read_uleb128(data, cursor, &file.dir_idx), cursor, exit); - TryRead(str8_deserial_read_uleb128(data, cursor, &file.time_stamp), cursor, exit); - TryRead(str8_deserial_read_uleb128(data, cursor, &file.size), cursor, exit); - - DW_LineFileNode *node = push_array(scratch.arena, DW_LineFileNode, 1); - node->file = file; - - SLLQueuePush(file_list.first, file_list.last, node); - file_list.node_count += 1; - } - } - - // dir list -> array - dir_table = str8_array_from_list(arena, &dir_list); - - // file list -> array - file_table.count = 0; - file_table.v = push_array(arena, DW_LineFile, file_list.node_count); - for EachNode(n, DW_LineFileNode, file_list.first) { - DW_LineFile *dst = &file_table.v[file_table.count++]; - dst->path = push_str8_copy(arena, n->file.path); - dst->dir_idx = n->file.dir_idx; - dst->time_stamp = n->file.time_stamp; - dst->size = n->file.size; - } - } - // DWARF5 - else { - // directory table - { - // read table entry encoding count - U8 enc_count = 0; - TryRead(str8_deserial_read_struct(data, cursor, &enc_count), cursor, exit); - - // read table entry encodings - U64 *enc_arr = 0; - TryRead(str8_deserial_read_uleb128_array(scratch.arena, data, cursor, enc_count*2, &enc_arr), cursor, exit); - - // read table count - U64 table_count = 0; - TryRead(str8_deserial_read_uleb128(data, cursor, &table_count), cursor, exit); - - // validate encoding - if (table_count > 0) { - if (enc_count != 1) { goto exit; } - if (enc_arr[0] != DW_LNCT_Path) { goto exit; } - } - - // read table - dir_table.count = table_count; - dir_table.v = push_array(arena, String8, table_count); - for EachIndex(i, table_count) { - DW_FormKind form_kind = enc_arr[1]; - DW_Form form = {0}; - U64 form_size = 0; - if (!dw_read_form(str8_skip(data, cursor), version, format, address_size, form_kind, max_U64, &form, &form_size)) { goto exit; } - cursor += form_size; - dir_table.v[i] = dw_interp_string(input, format, cu_str_offsets, form); - } - } - - // file table - { - // read table entry encoding count - U8 enc_count = 0; - TryRead(str8_deserial_read_struct(data, cursor, &enc_count), cursor, exit); - - // read table entry encodings - U64 *enc_arr = 0; - TryRead(str8_deserial_read_uleb128_array(scratch.arena, data, cursor, enc_count*2, &enc_arr), cursor, exit); - - // read table count - U64 table_count = 0; - TryRead(str8_deserial_read_uleb128(data, cursor, &table_count), cursor, exit); - - file_table.count = table_count; - file_table.v = push_array(arena, DW_LineFile, table_count); - - for EachIndex(i, table_count) { - DW_LineFile *file = &file_table.v[i]; - for EachIndex(enc_idx, enc_count) { - DW_LNCT lnct = enc_arr[enc_idx*2 + 0]; - - DW_FormKind form_kind = enc_arr[enc_idx*2 + 1]; - DW_Form form = {0}; - U64 form_size = 0; - if (!dw_read_form(str8_skip(data, cursor), version, format, address_size, form_kind, max_U64, &form, &form_size)) { goto exit; } - cursor += form_size; - - switch (lnct) { - case DW_LNCT_Path: { file->path = dw_interp_string(input, format, cu_str_offsets, form); } break; - case DW_LNCT_DirectoryIndex: { file->dir_idx = dw_interp_const_u64(form); } break; - case DW_LNCT_TimeStamp: { file->time_stamp = dw_interp_const_u64(form); } break; - case DW_LNCT_Size: { file->size = dw_interp_const_u64(form); } break; - case DW_LNCT_MD5: { file->md5 = dw_interp_const_u128(form); } break; - case DW_LNCT_LLVM_Source: { file->source = dw_interp_string(input, format, cu_str_offsets, form); } break; - default: { - Assert(!"unexpected LNTC encoding"); - } break; - } - } - } - } - } - - if (header_out) { - header_out->unit_length = length_size + length; - header_out->version = version; - header_out->address_size = address_size; - header_out->segment_selector_size = segsel_size; - header_out->header_length = header_length; - header_out->min_inst_len = min_inst_len; - header_out->max_ops_for_inst = max_ops_for_inst; - header_out->default_is_stmt = default_is_stmt; - header_out->line_base = line_base; - header_out->line_range = line_range; - header_out->opcode_base = opcode_base; - header_out->num_opcode_lens = num_opcode_lens; - header_out->opcode_lens = opcode_lens.str; - header_out->line_program_off = line_program_off; - header_out->dir_table = dir_table; - header_out->file_table = file_table; - } - - exit:; - scratch_end(scratch); - return cursor; -} - -internal DW_LineVM * -dw_line_vm_init(DW_Raw *input, DW_CompUnit *cu) -{ - DW_LineVM *vm = 0; - - Arena *arena = arena_alloc(.reserve_size = KB(64), .commit_size = KB(1)); - - String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList); - String8 cu_dir = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_CompDir); - String8 cu_name = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_Name); - - // read the line table header - DW_LineVMHeader header = {0}; - if (cu_stmt_list.size) { - if ( ! dw_read_line_vm_header(arena, input, cu_stmt_list, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu, &header)) { - goto exit; - } - } - - vm = push_array(arena, DW_LineVM, 1); - *vm = (DW_LineVM){ - .arena = arena, - .cursor = header.line_program_off, - .program = str8_prefix(cu_stmt_list, header.unit_length), - .header = header, - .state.end_sequence = 1, - }; - - exit:; - if (vm == 0) { arena_release(arena); } - return vm; -} - -internal void -dw_line_vm_release(DW_LineVM *vm) -{ - arena_release(vm->arena); -} - -internal void -dw_line_vm_advance(DW_LineVM *vm, U64 advance) -{ - U64 op_index = vm->state.op_index + advance; - vm->state.address += vm->header.min_inst_len * (op_index / vm->header.max_ops_for_inst); - vm->state.op_index = op_index % vm->header.max_ops_for_inst; - vm->advance = advance; -} - -internal B32 -dw_line_vm_step(DW_LineVM *vm) -{ - B32 is_ok = 0; - - if (vm->cursor >= vm->program.size) { goto exit; } - - vm->new_line = 0; - - // reset VM state - if (vm->state.end_sequence) { - vm->state.address = 0; - vm->state.op_index = 0; - vm->state.file_index = 1; - vm->state.line = 1; - vm->state.column = 0; - vm->state.is_stmt = vm->header.default_is_stmt; - vm->state.basic_block = 0; - vm->state.end_sequence = 0; - vm->state.prologue_end = 0; - vm->state.epilogue_begin = 0; - vm->state.isa = 0; - vm->state.discriminator = 0; - } - - // read opcode - TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &vm->opcode), vm->cursor, exit); - - // special opcodes - if (vm->opcode >= vm->header.opcode_base) { - U32 adjusted_opcode = (U32)(vm->opcode - vm->header.opcode_base); - U32 op_advance = adjusted_opcode / vm->header.line_range; - S32 line_advance = (S64)vm->header.line_base + ((S64)adjusted_opcode) % (S64)vm->header.line_range; - U64 addr_advance = vm->header.min_inst_len * ((vm->state.op_index + op_advance) / vm->header.max_ops_for_inst); - - if (vm->header.line_range > 0 && vm->header.max_ops_for_inst > 0) { - adjusted_opcode = (U32)(vm->opcode - vm->header.opcode_base); - op_advance = adjusted_opcode / vm->header.line_range; - line_advance = (S32)vm->header.line_base + ((S32)adjusted_opcode) % (S32)vm->header.line_range; - addr_advance = vm->header.min_inst_len * ((vm->state.op_index+op_advance) / vm->header.max_ops_for_inst); - } - - vm->state.address += addr_advance; - vm->state.op_index = (vm->state.op_index + op_advance) % vm->header.max_ops_for_inst; - vm->state.line = (U64)((S64)vm->state.line + line_advance); - vm->state.basic_block = 0; - vm->state.prologue_end = 0; - vm->state.epilogue_begin = 0; - vm->state.discriminator = 0; - - vm->line_advance = line_advance; - vm->addr_advance = addr_advance; - vm->new_line = 1; - } else { - // standard opcodes - switch (vm->opcode) { - case DW_StdOpcode_Copy: { - vm->new_line = 1; - - vm->state.discriminator = 0; - vm->state.basic_block = 0; - vm->state.prologue_end = 0; - vm->state.epilogue_begin = 0; - } break; - - case DW_StdOpcode_AdvancePc: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); - dw_line_vm_advance(vm, vm->operands[0].u64); - } break; - - case DW_StdOpcode_AdvanceLine: { - TryRead(str8_deserial_read_sleb128(vm->program, vm->cursor, &vm->operands[0].s64), vm->cursor, exit); - vm->state.line += vm->operands[0].s64; - } break; - - case DW_StdOpcode_SetFile: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); - vm->state.file_index = vm->operands[0].u64; - } break; - - case DW_StdOpcode_SetColumn: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); - vm->state.column = vm->operands[0].u64; - } break; - - case DW_StdOpcode_NegateStmt: { - vm->state.is_stmt = !vm->state.is_stmt; - } break; - - case DW_StdOpcode_SetBasicBlock: { - vm->state.basic_block = 1; - } break; - - case DW_StdOpcode_ConstAddPc: { - U64 advance = (0xffu - vm->header.opcode_base) / vm->header.line_range; - dw_line_vm_advance(vm, advance); - } break; - - case DW_StdOpcode_FixedAdvancePc: { - U16 fixed_advance = 0; - TryRead(str8_deserial_read_struct(vm->program, vm->cursor, &fixed_advance), vm->cursor, exit); - vm->operands[0].u64 = fixed_advance; - vm->state.address += vm->operands[0].u64; - vm->state.op_index = 0; - } break; - - case DW_StdOpcode_SetPrologueEnd: { - vm->state.prologue_end = 1; - } break; - - case DW_StdOpcode_SetEpilogueBegin: { - vm->state.epilogue_begin = 1; - } break; - - case DW_StdOpcode_SetIsa: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->operands[0].u64), vm->cursor, exit); - vm->state.isa = vm->operands[0].u64; - } break; - - // extended opcodes - case DW_StdOpcode_ExtendedOpcode: { - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &vm->ext_length), vm->cursor, exit); - String8 ext_data = str8_substr(vm->program, r1u64(vm->cursor, vm->cursor + vm->ext_length)); - vm->cursor += vm->ext_length; - - U64 ext_cursor = 0; - TryRead(str8_deserial_read_struct(ext_data, ext_cursor, &vm->ext_opcode), ext_cursor, exit); - - switch (vm->ext_opcode) { - case DW_ExtOpcode_EndSequence: { - vm->new_seq = 1; - vm->new_line = 1; - vm->state.end_sequence = 1; - } break; - - case DW_ExtOpcode_SetAddress: { - TryRead(str8_deserial_read(ext_data, ext_cursor, &vm->operands[0].u64, vm->header.address_size, vm->header.address_size), ext_cursor, exit); - vm->state.address = vm->operands[0].u64; - vm->state.op_index = 0; - } break; - - case DW_ExtOpcode_DefineFile: { - TryRead(str8_deserial_read_cstr (ext_data, ext_cursor, &vm->operands[0].string), ext_cursor, exit); // file name - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[1].u64), ext_cursor, exit); // dir index - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[2].u64), ext_cursor, exit); // modify time - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[3].u64), ext_cursor, exit); // file size - - if (vm->ext_file_ht == 0) { - vm->ext_file_ht = hash_table_init(vm->arena, 512); - } - - DW_LineFile *file = push_array(vm->arena, DW_LineFile, 1); - file->path = vm->operands[0].string; - file->dir_idx = vm->operands[1].u64; - file->time_stamp = vm->operands[2].u64; - file->size = vm->operands[3].u64; - - if (hash_table_search_u64_raw(vm->ext_file_ht, vm->state.file_index) == 0) { - vm->error = push_str8f(vm->arena, "file with index %I64d was already defined", vm->state.file_index); - goto exit; - } - - hash_table_push_u64_raw(vm->arena, vm->ext_file_ht, vm->state.file_index, file); - } break; - - case DW_ExtOpcode_SetDiscriminator: { - TryRead(str8_deserial_read_uleb128(ext_data, ext_cursor, &vm->operands[0].u64), ext_cursor, exit); - vm->state.discriminator = vm->operands[0].u64; - } break; - - default: { NotImplemented; } break; - } - } break; - - default: { - // skip unknown opcode - if (0 == vm->opcode || vm->opcode > vm->header.num_opcode_lens) { goto exit; } - for EachIndex(i, vm->header.opcode_lens[vm->opcode - 1]) { - U64 v = 0; - TryRead(str8_deserial_read_uleb128(vm->program, vm->cursor, &v), vm->cursor, exit); - } - } break; - } - } - - is_ok = 1; - exit:; - return is_ok; -} - -internal DW_LineFile * -dw_line_vm_find_file(DW_LineVM *vm, U64 file_idx) -{ - DW_LineFile *file = 0; - if (file == 0 && file_idx < vm->header.file_table.count) { - file = &vm->header.file_table.v[file_idx]; - } else if (vm->ext_file_ht) { - file = hash_table_search_u64_raw(vm->ext_file_ht, file_idx); - } - return file; -} - -internal String8 -dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file) -{ - Temp scratch = scratch_begin(&arena, 1); - - // directory table must contain at least compile unit directory - Assert(dir_table.count > 0); - - // find directory and file name associated with the file index - String8 dir = dir_table.v[file->dir_idx]; - String8 path = file->path; - - // infer path style if directory is empty use file name - PathStyle style = path_style_from_str8(dir); - if (style == PathStyle_Null || style == PathStyle_Relative) { - style = path_style_from_str8(file->path); - } - - String8List path_list = {0}; - { - // directories that start with ".." are relative to the compile unit directory - if (str8_match_lit("..", dir, StringMatchFlag_RightSideSloppy)) { - String8List comp_dir = str8_split_path(scratch.arena, dir_table.v[0]); - str8_list_concat_in_place(&path_list, &comp_dir); - } - - // push directory - String8List dir_list = str8_split_path(scratch.arena, dir); - str8_list_concat_in_place(&path_list, &dir_list); - - // push file name - str8_list_push(scratch.arena, &path_list, file->path); - - // resolve dots in the path - str8_path_list_resolve_dots_in_place(&path_list, style); - } - - // join path - String8 result = str8_path_list_join_by_style(arena, &path_list, style); - - scratch_end(scratch); - return result; -} - -internal DW_PubStringsTable -dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind) -{ - Temp scratch = scratch_begin(&arena, 1); - - DW_PubStringsTable names_table = {0}; - names_table.size = 16384; - names_table.buckets = push_array(arena, DW_PubStringsBucket*, names_table.size); - - String8 section_data = input->sec[section_kind].data; - for(U64 cursor = 0; cursor < section_data.size; ) { - U32 first_four_bytes = 0; - if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { break; } - DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - - U64 unit_length = 0; - U64 unit_length_size = str8_deserial_read_dwarf_packed_size(section_data, cursor, &unit_length); - if (unit_length_size == 0) { - break; - } - cursor += unit_length_size; - - U64 cursor_opl = Min(cursor + unit_length, section_data.size); - if (cursor >= cursor_opl) { - break; - } - - DW_Version unit_version = 0; - cursor += str8_deserial_read_struct(section_data, cursor, &unit_version); - if (cursor >= cursor_opl) { - break; - } - - U64 debug_info_off = 0; - cursor += str8_deserial_read_dwarf_uint(section_data, cursor, format, &debug_info_off); - if (cursor >= cursor_opl) { - break; - } - - U64 debug_info_length = 0; - cursor += str8_deserial_read_dwarf_packed_size(section_data, cursor, &debug_info_length); - if (cursor >= cursor_opl) { - break; - } - - U64 off_size = dw_size_from_format(format); - for (; (cursor + off_size) <= cursor_opl;) { - U64 info_off = 0; - U64 info_off_size = str8_deserial_read_dwarf_uint(section_data, cursor, format, &info_off); - cursor += info_off_size; - - if (info_off_size == 0 || info_off == 0) { - break; - } - - String8 string = {0}; - cursor += str8_deserial_read_cstr(section_data, cursor, &string); - - U64 hash = dw_hash_from_string(string); - U64 bucket_idx = hash % names_table.size; - - DW_PubStringsBucket *bucket = push_array(arena, DW_PubStringsBucket, 1); - bucket->next = names_table.buckets[bucket_idx]; - bucket->string = string; - bucket->info_off = info_off; - bucket->cu_info_off = debug_info_off; - names_table.buckets[bucket_idx] = bucket; - } - } - - scratch_end(scratch); - return names_table; -} - -internal DW_Expr -dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data) -{ - DW_Expr expr = {0}; - for (U64 cursor = 0, inst_start = 0; cursor < data.size; inst_start = cursor) { - // read opcode - DW_ExprOp opcode = 0; - U64 opcode_size = str8_deserial_read_struct(data, cursor, &opcode); - if (opcode_size == 0) { break; } - cursor += opcode_size; - - // read operands - U64 operand_count = dw_operand_count_from_expr_op(opcode); - DW_ExprOperandType *operand_types = dw_operand_types_from_expr_opcode(opcode); - DW_ExprOperand operands[2] = {0}; - for EachIndex(operand_idx, operand_count) { - U64 operand_size = 0; - switch (operand_types[operand_idx]) { - case DW_ExprOperandType_Null: { } break; - case DW_ExprOperandType_U8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u8); } break; - case DW_ExprOperandType_U16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u16); } break; - case DW_ExprOperandType_U32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u32); } break; - case DW_ExprOperandType_U64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].u64); } break; - case DW_ExprOperandType_S8: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s8); } break; - case DW_ExprOperandType_S16: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s16); } break; - case DW_ExprOperandType_S32: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s32); } break; - case DW_ExprOperandType_S64: { operand_size = str8_deserial_read_struct(data, cursor, &operands[operand_idx].s64); } break; - case DW_ExprOperandType_ULEB128: { operand_size = str8_deserial_read_uleb128(data, cursor, &operands[operand_idx].u64); } break; - case DW_ExprOperandType_SLEB128: { operand_size = str8_deserial_read_sleb128(data, cursor, &operands[operand_idx].s64); } break; - case DW_ExprOperandType_Addr: { operand_size = str8_deserial_read(data, cursor, &operands[operand_idx].u64, addr_size, addr_size); } break; - case DW_ExprOperandType_DwarfUInt: { operand_size = str8_deserial_read_dwarf_uint(data, cursor, format, &operands[operand_idx].u64); } break; - case DW_ExprOperandType_Block: { - U8 block_size; - U64 block_size_size = str8_deserial_read_struct(data, cursor, &block_size); - U64 block_read_size = str8_deserial_read_block(data, cursor + block_size_size, block_size, &operands[operand_idx].block); - if(block_read_size == block_size_size) { - operand_size = block_size_size + block_read_size; - } - } break; - default: { InvalidPath; } break; - } - if (operand_size == 0) { goto exit; } - cursor += operand_size; - } - - // fill out instruction - DW_ExprInst *inst = push_array(arena, DW_ExprInst, 1); - inst->opcode = opcode; - inst->size = cursor - inst_start; - inst->operands = operand_count ? push_array(arena, DW_ExprOperand, operand_count) : 0; - MemoryCopy(inst->operands, operands, operand_count * sizeof(DW_ExprOperand)); - - // push instruction - DLLPushBack(expr.first, expr.last, inst); - expr.count += 1; - } - exit:; - return expr; -} - -internal void -dw_cfa_inst_list_push_node(DW_CFA_InstList *list, DW_CFA_InstNode *n) -{ - SLLQueuePush(list->first, list->last, n); - list->count += 1; -} - -internal DW_CFA_InstNode * -dw_cfa_inst_list_push(Arena *arena, DW_CFA_InstList *list, DW_CFA_Inst v) -{ - DW_CFA_InstNode *n = push_array(arena, DW_CFA_InstNode, 1); - n->v = v; - dw_cfa_inst_list_push_node(list, n); - return n; -} - -internal U64 -dw_read_debug_frame_ptr(String8 data, DW_CIE *cie, U64 *ptr_out) -{ - U64 read_size = 0; - if (cie->segment_selector_size) { - NotImplemented; - } else { - read_size = str8_deserial_read(data, 0, ptr_out, cie->address_size, cie->address_size); - } - return read_size; -} - -internal U64 -dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out) -{ - U32 first_four_bytes = 0; - str8_deserial_read_struct(data, off, &first_four_bytes); - DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - - U64 length = 0; - U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length); - if (length_size == 0) { goto exit; } - - Rng1U64 entry_range = rng_1u64(off, off + length_size + length); - String8 entry_data = str8_substr(data, entry_range); + // rjf: read tag abbrev U64 id = 0; - U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id); - if (id_size == 0) { goto exit; } - - U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64; - desc_out->format = format; - desc_out->type = (id == id_type) ? DW_DescriptorEntryKind_CIE : DW_DescriptorEntryKind_FDE; - desc_out->entry_range = entry_range; - desc_out->cie_pointer = id; - desc_out->cie_pointer_off = length_size; - - exit:; - return length + length_size; -} - -internal B32 -dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out) -{ - B32 is_parsed = 0; - U64 cursor = format == DW_Format_32Bit ? 4 : 12; - - U64 cie_id = 0; - TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id), cursor, exit); - - U8 version = 0; - TryRead(str8_deserial_read_struct(data, cursor, &version), cursor, exit); - - String8 aug_string = {0}; - TryRead(str8_deserial_read_cstr(data, cursor, &aug_string), cursor, exit); - - U8 address_size = 0; - U8 segment_selector_size = 0; - if (version >= DW_Version_4) { - TryRead(str8_deserial_read_struct(data, cursor, &address_size), cursor, exit); - TryRead(str8_deserial_read_struct(data, cursor, &segment_selector_size), cursor, exit); - } else { - address_size = byte_size_from_arch(arch); + U64 tag_kind = 0; + U8 has_children = 0; + { + off += str8_deserial_read_uleb128(data, off, &id); + if(id != 0) + { + off += str8_deserial_read_uleb128(data, off, &tag_kind); + off += str8_deserial_read_struct(data, off, &has_children); + } } - U64 code_align_factor = 0; - TryRead(str8_deserial_read_uleb128(data, cursor, &code_align_factor), cursor, exit); - - S64 data_align_factor = 0; - TryRead(str8_deserial_read_sleb128(data, cursor, &data_align_factor), cursor, exit); - - U64 ret_addr_reg = 0; - if (version == DW_Version_1) { TryRead(str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)), cursor, exit); } - else { TryRead(str8_deserial_read_uleb128(data, cursor, &ret_addr_reg), cursor, exit); } - - if (aug_string.size > 0) { goto exit; } - - cie_out->insts = str8_skip(data, cursor); - cie_out->aug_string = aug_string; - cie_out->code_align_factor = code_align_factor; - cie_out->data_align_factor = data_align_factor; - cie_out->ret_addr_reg = ret_addr_reg; - cie_out->format = format; - cie_out->version = version; - cie_out->address_size = address_size; - cie_out->segment_selector_size = segment_selector_size; - - is_parsed = 1; - exit:; - return is_parsed; -} - -internal B32 -dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out) -{ - B32 is_parsed = 0; - U64 cursor = format == DW_Format_32Bit ? 4 : 12; - - // extract CIE pointer - U64 cie_pointer = 0; - TryRead(str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer), cursor, exit); - - // extract address of first instruction - U64 pc_begin = 0; - TryRead(dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin), cursor, exit); - - // extract instruction range size - U64 pc_range = 0; - TryRead(dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_range), cursor, exit); - - // parse augmentation data - String8 aug_data = str8_substr(data, rng_1u64(cursor, cursor + cie->aug_data.size)); - cursor += cie->aug_data.size; - - // commit values to out - fde_out->format = format; - fde_out->cie_pointer = cie_pointer; - fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_range); - fde_out->insts = str8_skip(data, cursor); - - is_parsed = 1; - exit:; - return is_parsed; -} - -internal B32 -dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out) -{ - B32 is_parsed = 0; - DW_DescriptorEntry fde_desc = {0}; - dw_parse_descriptor_entry_header(data, fde_offset, &fde_desc); - if (fde_desc.type == DW_DescriptorEntryKind_FDE) { - U64 cie_pointer_off = fde_desc.format == DW_Format_32Bit ? 4 : 12; - U64 cie_pointer = 0; - U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer); - if (cie_pointer_size) { - DW_DescriptorEntry cie_desc = {0}; - dw_parse_descriptor_entry_header(data, cie_pointer, &cie_desc); - if (cie_desc.type == DW_DescriptorEntryKind_CIE) { - if (dw_parse_cie(str8_substr(data, cie_desc.entry_range), cie_desc.format, arch, cie_out)) { - if (dw_parse_fde(str8_substr(data, fde_desc.entry_range), fde_desc.format, cie_out, fde_out)) { - is_parsed = 1; - } - } + // rjf: read all tag attribute abbreviations + DW2_AbbrevAttribList attribs = {0}; + if(id != 0) + { + for(;;) + { + U64 attrib_start_off = off; + U64 attrib_kind = 0; + U64 attrib_form_kind = 0; + U64 implicit_const = 0; + off += str8_deserial_read_uleb128(data, off, &attrib_kind); + off += str8_deserial_read_uleb128(data, off, &attrib_form_kind); + if(attrib_form_kind == DW_FormKind_ImplicitConst) + { + off += str8_deserial_read_uleb128(data, off, &implicit_const); + } + if(attrib_kind != 0 && attribs_out != 0) + { + DW2_AbbrevAttribNode *n = push_array(arena, DW2_AbbrevAttribNode, 1); + SLLQueuePush(attribs.first, attribs.last, n); + attribs.count += 1; + n->v.attrib_kind = attrib_kind; + n->v.form_kind = attrib_form_kind; + n->v.implicit_const = implicit_const; + } + if(off == attrib_start_off || attrib_kind == 0) + { + break; } } } - return is_parsed; -} - -internal DW_CFA_ParseErrorCode -dw_parse_cfa_inst(String8 data, - U64 code_align_factor, - S64 data_align_factor, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud, - U64 *bytes_read_out, - DW_CFA_Inst *inst_out) -{ - *bytes_read_out = 0; - - DW_CFA_ParseErrorCode error_code = DW_CFA_ParseErrorCode_End; - U64 cursor = 0; - - // read opcode - DW_CFA_Opcode raw_opcode = 0; - TryRead(str8_deserial_read_struct(data, cursor, &raw_opcode), cursor, exit); - - // decode opcode implicit operand - U64 opcode = raw_opcode & ~DW_CFA_Mask_OpcodeHi; - U64 implicit_operand = 0; - if ((raw_opcode & DW_CFA_Mask_OpcodeHi) != 0) { - opcode = raw_opcode & DW_CFA_Mask_OpcodeHi; - implicit_operand = raw_opcode & DW_CFA_Mask_Operand; + // rjf: fill + if(header_out != 0) + { + header_out->id = id; + header_out->tag_kind = tag_kind; + header_out->has_children = has_children; + } + if(attribs_out != 0) + { + MemoryCopyStruct(attribs_out, &attribs); } - // decode operands - DW_CFA_Operand operands[DW_CFA_OperandMax] = {0}; - switch (opcode) { - case DW_CFA_SetLoc: { - U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64); - if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += address_size; - } break; - case DW_CFA_AdvanceLoc: { - operands[0].u64 = implicit_operand * code_align_factor; - } break; - case DW_CFA_AdvanceLoc1: { - U8 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_AdvanceLoc2: { - U16 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_AdvanceLoc4: { - U32 delta = 0; - U64 delta_size = str8_deserial_read_struct(data, cursor, &delta); - if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += delta_size; - operands[0].u64 = delta * code_align_factor; - } break; - case DW_CFA_DefCfa: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].u64 = offset; - } break; - case DW_CFA_DefCfaSf: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].s64 = offset * data_align_factor; - } break; - case DW_CFA_DefCfaRegister: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_DefCfaOffset: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = offset; - } break; - case DW_CFA_DefCfaOffsetSf: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = offset * data_align_factor; - } break; - case DW_CFA_DefCfaExpr: { - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - - operands[0].block = expr; - cursor += expr_size; - } break; - case DW_CFA_Undefined: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_SameValue: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - operands[0].u64 = reg; - } break; - case DW_CFA_Offset: { - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = implicit_operand; - operands[1].s64 = (S64)offset * data_align_factor; - } break; - case DW_CFA_OffsetExt: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].u64 = offset * data_align_factor; - } break; - case DW_CFA_OffsetExtSf: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = reg; - operands[1].s64 = offset * data_align_factor; - } break; - case DW_CFA_ValOffset: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += val_size; - - U64 offset = 0; - U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = val; - operands[1].u64 = offset * data_align_factor; - } break; - case DW_CFA_ValOffsetSf: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += val_size; - - S64 offset = 0; - U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset); - if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += offset_size; - - operands[0].u64 = val; - operands[1].s64 = offset; - } break; - case DW_CFA_Register: { - U64 dst_reg = 0; - U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg); - if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += dst_reg_size; - - U64 src_reg = 0; - U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg); - if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += src_reg_size; - - operands[0].u64 = dst_reg; - operands[1].u64 = src_reg; - } break; - case DW_CFA_Expr: { - U64 reg = 0; - U64 reg_size = str8_deserial_read_uleb128(data, cursor, ®); - if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += reg_size; - - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - cursor += expr_size; - - operands[0].u64 = reg; - operands[1].block = expr; - } break; - case DW_CFA_ValExpr: { - U64 val = 0; - U64 val_size = str8_deserial_read_uleb128(data, cursor, &val); - if (val_size == 0) { goto exit; } - cursor += val_size; - - U64 expr_size = 0; - U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size); - if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; } - cursor += expr_size_size; - - if (cursor + expr_size > data.size) { goto exit; } - String8 expr = str8_prefix(str8_skip(data, cursor), expr_size); - cursor += expr_size; - - operands[0].u64 = val; - operands[1].block = expr; - } break; - case DW_CFA_Restore: { - operands[0].u64 = implicit_operand; - } break; - case DW_CFA_RestoreExt: {} break; - case DW_CFA_RememberState: {} break; - case DW_CFA_RestoreState: {} break; - case DW_CFA_Nop: {} break; - default: { goto exit; } break; - } - - // fill out output - inst_out->opcode = opcode; - MemoryCopyTyped(&inst_out->operands[0], &operands[0], DW_CFA_OperandMax); - - *bytes_read_out = cursor; - - error_code = DW_CFA_ParseErrorCode_NewInst; - - exit:; - return error_code; + U64 bytes_read = (off-start_off); + return bytes_read; } -internal DW_CFA_InstList -dw_parse_cfa_inst_list(Arena *arena, - String8 data, - U64 code_align_factor, - S64 data_align_factor, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud) +internal DW2_AbbrevMap +dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off) { - U64 pos = arena_pos(arena); - DW_CFA_InstList list = {0}; - for (U64 cursor = 0, inst_size; cursor < data.size; cursor += inst_size) { - DW_CFA_Inst inst = {0}; - DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(data, cursor), code_align_factor, data_align_factor, decode_ptr_func, decode_ptr_ud, &inst_size, &inst); - if (error_code == DW_CFA_ParseErrorCode_End) { break; } - if (error_code != DW_CFA_ParseErrorCode_NewInst) { - MemoryZeroStruct(&list); - arena_pop_to(arena, pos); + DW2_AbbrevMap map = {0}; + + // rjf: loop - first to determine the number of tag formats encoded + // by this abbrev table, second to actually build a hash table for + // mapping (id -> .debug_abbrev offset) + for(B32 build = 0; build <= 1; build += 1) + { + // rjf: parse whole abbrev table + U64 tag_count = 0; + for(U64 read_off = off;;) + { + U64 start_off = read_off; + + // rjf: read next abbrev + DW2_AbbrevHeader header = {0}; + read_off += dw2_read_abbrev(arena, data, read_off, &header, 0); + + // rjf: count tag + if(header.id != 0) + { + tag_count += 1; + } + + // rjf: if building (second loop) -> insert into map + if(build) + { + U64 hash = u64_hash_from_str8(str8_struct(&header.id)); + U64 slot_idx = hash%map.slots_count; + DW2_AbbrevMapNode *n = push_array(arena, DW2_AbbrevMapNode, 1); + SLLStackPush(map.slots[slot_idx], n); + n->id = header.id; + n->off = start_off; + } + + // rjf: no tag ID, or no movement? -> exit + if(read_off == start_off || header.id == 0) + { + break; + } + } + + // rjf: on first loop iteration, given the tag format count, construct the table + if(!build) + { + map.slots_count = Max(1, tag_count + tag_count/4); + map.slots = push_array(arena, DW2_AbbrevMapNode *, map.slots_count); + } + } + + return map; +} + +internal DW2_UnitAbbrevMapMap +dw2_unit_abbrev_map_map_from_data(Arena *arena, String8 data, DW2_UnitHeader *unit_headers, U64 unit_headers_count) +{ + DW2_UnitAbbrevMapMap result = {0}; + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: gather deduplicated .debug_abbrev offsets, representing beginnings + // of abbreviation tables. we want to do this because many units may refer + // to the same abbreviation table. + // + typedef struct AbbrevOffNode AbbrevOffNode; + struct AbbrevOffNode + { + AbbrevOffNode *order_next; + AbbrevOffNode *hash_next; + U64 off; + U64 idx; + }; + U64 abbrev_off_slots_count = unit_headers_count; + AbbrevOffNode **abbrev_off_slots = 0; + U64 abbrev_map_count = 0; + U64 *abbrev_map_off_from_idx_table = 0; + DW2_AbbrevMap *abbrev_map_from_idx_table = 0; + DW2_AbbrevMap **abbrev_map_from_unit_idx_table = 0; + ProfScope("gather deduplicated .debug_abbrev offsets") if(lane_idx() == 0) + { + AbbrevOffNode *abbrev_off_first = 0; + AbbrevOffNode *abbrev_off_last = 0; + abbrev_off_slots = push_array(scratch.arena, AbbrevOffNode *, abbrev_off_slots_count); + for EachIndex(unit_idx, unit_headers_count) + { + U64 abbrev_off = unit_headers[unit_idx].abbrev_off; + U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); + U64 slot_idx = hash%abbrev_off_slots_count; + AbbrevOffNode *node = 0; + for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->off == abbrev_off) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(arena, AbbrevOffNode, 1); + SLLStackPush_N(abbrev_off_slots[slot_idx], node, hash_next); + SLLQueuePush_N(abbrev_off_first, abbrev_off_last, node, order_next); + node->off = abbrev_off; + node->idx = abbrev_map_count; + abbrev_map_count += 1; + } + } + abbrev_map_off_from_idx_table = push_array(scratch.arena, U64, abbrev_map_count); + abbrev_map_from_idx_table = push_array(arena, DW2_AbbrevMap, abbrev_map_count); + abbrev_map_from_unit_idx_table = push_array(arena, DW2_AbbrevMap *, unit_headers_count); + { + U64 abbrev_map_idx = 0; + for(AbbrevOffNode *n = abbrev_off_first; n != 0; n = n->order_next) + { + abbrev_map_off_from_idx_table[abbrev_map_idx] = n->off; + abbrev_map_idx += 1; + } + } + } + lane_sync_u64(&abbrev_off_slots, 0); + lane_sync_u64(&abbrev_map_count, 0); + lane_sync_u64(&abbrev_map_off_from_idx_table, 0); + lane_sync_u64(&abbrev_map_from_idx_table, 0); + lane_sync_u64(&abbrev_map_from_unit_idx_table, 0); + + //- rjf: build all unique abbreviation maps + ProfScope("build all unique abbreviation maps") + { + U64 abbrev_map_take_idx = 0; + U64 *abbrev_map_take_idx_ptr = &abbrev_map_take_idx; + lane_sync_u64(&abbrev_map_take_idx_ptr, 0); + for(;;) + { + U64 abbrev_map_idx = ins_atomic_u64_inc_eval(abbrev_map_take_idx_ptr) - 1; + if(abbrev_map_idx >= abbrev_map_count) + { + break; + } + abbrev_map_from_idx_table[abbrev_map_idx] = dw2_abbrev_map_from_data(arena, data, abbrev_map_off_from_idx_table[abbrev_map_idx]); + } + lane_sync(); + } + + //- rjf: build unit -> abbrev map table + ProfScope("build unit -> abbrev map table") + { + Rng1U64 range = lane_range(unit_headers_count); + for EachInRange(unit_idx, range) + { + U64 abbrev_off = unit_headers[unit_idx].abbrev_off; + U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); + U64 slot_idx = hash%abbrev_off_slots_count; + U64 abbrev_map_idx = 0; + for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->off == abbrev_off) + { + abbrev_map_idx = n->idx; + break; + } + } + abbrev_map_from_unit_idx_table[unit_idx] = &abbrev_map_from_idx_table[abbrev_map_idx]; + } + lane_sync(); + } + + //- rjf: fill result + result.map_count = abbrev_map_count; + result.map_from_idx_table = abbrev_map_from_idx_table; + result.map_from_unit_idx_table = abbrev_map_from_unit_idx_table; + + scratch_end(scratch); + return result; +} + +//////////////////////////////// +//~ rjf: Form Value Parsing + +internal U64 +dw2_read_form_val(DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out) +{ + U64 start_off = off; + DW2_FormVal val = {form_kind}; + { + //- rjf: read value bytes + U64 bytes_to_read = 0; + switch(form_kind) + { + //- rjf: no-ops + default: + case DW_FormKind_Indirect: + case DW_FormKind_Null: + {}break; + + //- rjf: 1-byte uint reads + case DW_FormKind_Ref1: + case DW_FormKind_Data1: + case DW_FormKind_Flag: + case DW_FormKind_Strx1: + case DW_FormKind_Addrx1: + bytes_to_read = 1; goto read_fixed_uint; + + //- rjf: 2-byte uint reads + case DW_FormKind_Ref2: + case DW_FormKind_Data2: + case DW_FormKind_Strx2: + case DW_FormKind_Addrx2: + bytes_to_read = 2; goto read_fixed_uint; + + //- rjf: 3-byte uint reads + case DW_FormKind_Strx3: + case DW_FormKind_Addrx3: + bytes_to_read = 3; goto read_fixed_uint; + + //- rjf: 4-byte uint reads + case DW_FormKind_Data4: + case DW_FormKind_Ref4: + case DW_FormKind_RefSup4: + case DW_FormKind_Strx4: + case DW_FormKind_Addrx4: + bytes_to_read = 4; goto read_fixed_uint; + + //- rjf: 8-byte uint reads + case DW_FormKind_Data8: + case DW_FormKind_Ref8: + case DW_FormKind_RefSig8: + case DW_FormKind_RefSup8: + bytes_to_read = 8; goto read_fixed_uint; + + //- rjf: 16-byte uint reads + case DW_FormKind_Data16: + bytes_to_read = 16; goto read_fixed_uint; + + //- rjf: address-sized reads + case DW_FormKind_Addr: + bytes_to_read = ctx->addr_size; goto read_fixed_uint; + + //- rjf: format-defined-size reads + case DW_FormKind_RefAddr: + case DW_FormKind_SecOffset: + case DW_FormKind_LineStrp: + case DW_FormKind_Strp: + case DW_FormKind_StrpSup: + bytes_to_read = dw_addr_size_from_format(ctx->format); goto read_fixed_uint; + + //- rjf: fixed-size uint reads + read_fixed_uint: + { + off += str8_deserial_read(data, off, &val.u128.u64[0], bytes_to_read, bytes_to_read); + }break; + + //- rjf: uleb128 reads + case DW_FormKind_UData: + case DW_FormKind_RefUData: + case DW_FormKind_Strx: + case DW_FormKind_Addrx: + case DW_FormKind_LocListx: + case DW_FormKind_RngListx: + { + off += str8_deserial_read_uleb128(data, off, &val.u128.u64[0]); + }break; + + //- rjf: sleb128 reads + case DW_FormKind_SData: + { + off += str8_deserial_read_sleb128(data, off, (S64 *)(&val.u128.u64[0])); + }break; + + //- rjf: fixed-size uint reads / skips + case DW_FormKind_Block1: bytes_to_read = 1; goto read_fixed_uint_and_skip; + case DW_FormKind_Block2: bytes_to_read = 2; goto read_fixed_uint_and_skip; + case DW_FormKind_Block4: bytes_to_read = 4; goto read_fixed_uint_and_skip; + read_fixed_uint_and_skip: + { + U64 size = 0; + U64 og_read_off = off; + off += str8_deserial_read(data, off, &size, bytes_to_read, bytes_to_read); + val.u128.u64[0] = size; + val.u128.u64[1] = og_read_off; + off += size; + }break; + + //- rjf: uleb128 read & skip + case DW_FormKind_Block: + { + U64 size = 0; + U64 og_read_off = off; + off += str8_deserial_read_uleb128(data, off, &size); + val.string = str8_substr(data, r1u64(off, off+size)); + off += size; + }break; + + //- rjf: strings + case DW_FormKind_String: + { + String8 string = {0}; + U64 og_read_off = off; + off += str8_deserial_read_cstr(data, off, &string); + val.string = string; + }break; + + //- rjf: implicit constants (no reading in .debug_info; value comes from .debug_abbrev) + case DW_FormKind_ImplicitConst: + { + val.u128.u64[0] = implicit_const; + }break; + + //- rjf: exprloc + case DW_FormKind_ExprLoc: + { + U64 size = 0; + U64 og_read_off = off; + U64 bytes_read = str8_deserial_read_uleb128(data, off, &size); + val.u128.u64[0] = og_read_off + bytes_read; + val.u128.u64[1] = size; + val.string = str8_substr(data, r1u64(og_read_off, og_read_off+size)); + off += size + bytes_read; + }break; + + //- rjf: flag present + case DW_FormKind_FlagPresent: + { + val.u128.u64[0] = 1; + }break; + } + + //- rjf: in some cases, resolve numeric values -> strings + { + switch(form_kind) + { + default:{}break; + case DW_FormKind_Strx1: + case DW_FormKind_Strx2: + case DW_FormKind_Strx3: + case DW_FormKind_Strx4: + case DW_FormKind_Strx: + if(ctx->str_offsets_table != 0) + { + U64 entry_idx = val.u128.u64[0]; + U64 string_data_off = 0; + if(dw2_try_offset_from_table_idx(ctx->str_offsets_table, entry_idx, &string_data_off)) + { + String8 string_section_data = raw->sec[DW_SectionKind_Str].data; + val.string = str8_cstring_capped(string_section_data.str + string_data_off, + string_section_data.str + string_section_data.size); + } + }break; + case DW_FormKind_LineStrp: + { + String8 string_section_data = raw->sec[DW_SectionKind_LineStr].data; + val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0], + string_section_data.str + string_section_data.size); + }break; + case DW_FormKind_Strp: + case DW_FormKind_StrpSup: + { + String8 string_section_data = raw->sec[DW_SectionKind_Str].data; + val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0], + string_section_data.str + string_section_data.size); + }break; + } + } + + //- rjf: in some cases, resolve base numeric values -> addresses + { + switch(form_kind) + { + default:{val.addr = val.u128.u64[0];}break; + case DW_FormKind_Addrx: + case DW_FormKind_Addrx1: + case DW_FormKind_Addrx2: + case DW_FormKind_Addrx3: + case DW_FormKind_Addrx4: + if(ctx->addr_table != 0) + { + U64 addr_idx = val.u128.u64[0]; + dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &val.addr); + }break; + } + } + } + *out = val; + U64 bytes_read = (off - start_off); + return bytes_read; +} + +//////////////////////////////// +//~ rjf: Parse Context Construction + +internal void +dw2_parse_ctx_equip_unit_header(DW2_ParseCtx *ctx_out, DW2_UnitHeader *hdr, U64 unit_base_info_off) +{ + ctx_out->version = hdr->version; + ctx_out->format = hdr->format; + ctx_out->addr_size = hdr->addr_size; + ctx_out->unit_base_info_off = unit_base_info_off; +} + +internal void +dw2_parse_ctx_equip_unit_abbrev_map(DW2_ParseCtx *ctx_out, DW2_UnitAbbrevMapMap *map, U64 unit_idx) +{ + ctx_out->abbrev_map = map->map_from_unit_idx_table[unit_idx]; +} + +internal void +dw2_parse_ctx_equip_unit_root_tag(DW2_ParseCtx *ctx_out, DW2_Tag *tag, DW2_OffsetTableSet *offset_tables) +{ + // rjf: unpack attributes + DW2_Attrib *low_pc_attrib = &dw2_attrib_nil; + DW2_Attrib *lang_attrib = &dw2_attrib_nil; + DW2_Attrib *rnglists_base_off_attrib = &dw2_attrib_nil; + DW2_Attrib *str_offsets_base_off_attrib = &dw2_attrib_nil; + DW2_Attrib *addr_base_off_attrib = &dw2_attrib_nil; + DW2_Attrib *loclist_base_off_attrib = &dw2_attrib_nil; + DW2_Attrib *comp_dir_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag->attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(name, name_upper) case DW_AttribKind_##name_upper:{name##_attrib = &n->v;}break + Case(low_pc, LowPc); + Case(lang, Language); + Case(rnglists_base_off, RngListsBase); + Case(str_offsets_base_off, StrOffsetsBase); + Case(addr_base_off, AddrBase); + Case(loclist_base_off, LocListsBase); + Case(comp_dir, CompDir); +#undef Case + } + } + + // rjf: fill basics + ctx_out->unit_base_addr = low_pc_attrib->val.addr; + ctx_out->language = lang_attrib->val.u128.u64[0]; + ctx_out->unit_dir = comp_dir_attrib->val.string; + + // rjf: find offset tables + Rng1U64Array rnglists_tables_ranges_array = {offset_tables->rnglists_tables_ranges, offset_tables->rnglists_tables_count}; + Rng1U64Array str_offsets_tables_ranges_array = {offset_tables->str_offsets_tables_ranges, offset_tables->str_offsets_tables_count}; + Rng1U64Array addr_tables_ranges_array = {offset_tables->addr_tables_ranges, offset_tables->addr_tables_count}; + Rng1U64Array loclist_tables_ranges_array = {offset_tables->loclists_tables_ranges, offset_tables->loclists_tables_count}; + { + // rjf: find rnglists table + { + U64 rnglists_base_off = rnglists_base_off_attrib->val.u128.u64[0]; + U64 rnglists_table_num = rng1u64_array_num_from_value__binary_search(&rnglists_tables_ranges_array, rnglists_base_off); + if(0 < rnglists_table_num && rnglists_table_num <= rnglists_tables_ranges_array.count) + { + DW2_OffsetTable *table = &offset_tables->rnglists_tables[rnglists_table_num-1]; + ctx_out->rnglists_table = table; + } + } + + // rjf: find str offsets table + { + U64 str_offsets_base_off = str_offsets_base_off_attrib->val.u128.u64[0]; + U64 str_offsets_table_num = rng1u64_array_num_from_value__binary_search(&str_offsets_tables_ranges_array, str_offsets_base_off); + if(0 < str_offsets_table_num && str_offsets_table_num <= str_offsets_tables_ranges_array.count) + { + DW2_OffsetTable *table = &offset_tables->str_offsets_tables[str_offsets_table_num-1]; + ctx_out->str_offsets_table = table; + } + } + + // rjf: find addr table + { + U64 addr_base_off = addr_base_off_attrib->val.u128.u64[0]; + U64 addr_table_num = rng1u64_array_num_from_value__binary_search(&addr_tables_ranges_array, addr_base_off); + if(0 < addr_table_num && addr_table_num <= addr_tables_ranges_array.count) + { + DW2_OffsetTable *table = &offset_tables->addr_tables[addr_table_num-1]; + ctx_out->addr_table = table; + } + } + + // rjf: find loclists table + { + U64 loclist_base_off = loclist_base_off_attrib->val.u128.u64[0]; + U64 loclist_table_num = rng1u64_array_num_from_value__binary_search(&loclist_tables_ranges_array, loclist_base_off); + if(0 < loclist_table_num && loclist_table_num <= loclist_tables_ranges_array.count) + { + DW2_OffsetTable *table = &offset_tables->loclists_tables[loclist_table_num-1]; + ctx_out->loclists_table = table; + } + } + } +} + +//////////////////////////////// +//~ rjf: Tag Parsing + +internal U64 +dw2_read_tag(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out) +{ + U64 start_off = off; + + // rjf: read tag's abbrev ID + U64 abbrev_id = 0; + off += str8_deserial_read_uleb128(data, off, &abbrev_id); + + // rjf: map abbrev ID -> abbrev offset + U64 abbrev_off = 0; + { + DW2_AbbrevMap *abbrev_map = ctx->abbrev_map; + U64 hash = u64_hash_from_str8(str8_struct(&abbrev_id)); + U64 slot_idx = hash%abbrev_map->slots_count; + for EachNode(n, DW2_AbbrevMapNode, abbrev_map->slots[slot_idx]) + { + if(n->id == abbrev_id) + { + abbrev_off = n->off; + break; + } + } + } + + // rjf: read abbrev header + U64 tag_kind = 0; + U8 has_children = 0; + U64 attrib_abbrev_read_off = 0; + { + String8 abbrev_data = raw->sec[DW_SectionKind_Abbrev].data; + U64 abbrev_read_off = abbrev_off; + U64 id = 0; + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &id); + if(id != 0) + { + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &tag_kind); + abbrev_read_off += str8_deserial_read_struct(abbrev_data, abbrev_read_off, &has_children); + } + attrib_abbrev_read_off = abbrev_read_off; + } + + // rjf: walk abbrev / info in lock-step; read all tag attributes + DW2_AttribList attribs = {0}; + if(abbrev_id != 0) + { + String8 abbrev_data = raw->sec[DW_SectionKind_Abbrev].data; + U64 abbrev_read_off = attrib_abbrev_read_off; + for(;;) + { + U64 abbrev_start_read_off = abbrev_read_off; + + // rjf: read next attribute abbreviation from .debug_abbrev + U64 attrib_kind = 0; + U64 attrib_form_kind = 0; + U64 implicit_const = 0; + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &attrib_kind); + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &attrib_form_kind); + if(attrib_form_kind == DW_FormKind_ImplicitConst) + { + abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &implicit_const); + } + + // rjf: indirect form -> form kind is encoded in .debug_info (because why not) + if(attrib_form_kind == DW_FormKind_Indirect) + { + off += str8_deserial_read_uleb128(data, off, &attrib_form_kind); + } + + // rjf: read attribute's value from .debug_info + DW2_FormVal val = {0}; + if(attrib_kind != 0) + { + off += dw2_read_form_val(raw, ctx, data, off, attrib_form_kind, implicit_const, &val); + } + + // rjf: push + if(attrib_kind != 0) + { + DW2_AttribNode *n = push_array(arena, DW2_AttribNode, 1); + SLLQueuePush(attribs.first, attribs.last, n); + attribs.count += 1; + n->v.attrib_kind = attrib_kind; + n->v.val = val; + } + + // rjf: no movement, or no attrib kind -> done + if(abbrev_read_off == abbrev_start_read_off || attrib_kind == 0) + { + break; + } + } + } + + // rjf: fill output + tag_out->kind = (DW_TagKind)tag_kind; + tag_out->has_children = !!has_children; + tag_out->attribs = attribs; + + // rjf: return # of bytes read + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal DW2_Attrib * +dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind) +{ + DW2_Attrib *result = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag->attribs.first) + { + if(n->v.attrib_kind == kind) + { + result = &n->v; + break; + } + } + return result; +} + +internal U64 +dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v) +{ + U64 result = 0; + switch(v->kind) + { + default:{}break; + case DW_FormKind_Ref1: + case DW_FormKind_Ref2: + case DW_FormKind_Ref4: + case DW_FormKind_Ref8: + { + result = ctx->unit_base_info_off + v->u128.u64[0]; + }break; + // TODO(rjf): DW_FormKind_RefAddr, DW_FormKind_RefUData, DW_FormKind_RefSig8, DW_FormKind_RefSup8, etc. + } + return result; +} + +//////////////////////////////// +//~ rjf: Line Table Parsing + +internal U64 +dw2_read_line_table_header(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out) +{ + Temp scratch = scratch_begin(&arena, 1); + U64 start_off = off; + + ////////////////////////////// + //- rjf: read unit length + // + U64 unit_length = 0; + DW_Format format = DW_Format_32Bit; + off += dw2_read_initial_length(data, off, &unit_length, &format); + U64 off_opl = off + unit_length; + + ////////////////////////////// + //- rjf: read version + // + DW_Version version = DW_Version_Null; + off += str8_deserial_read_struct(data, off, &version); + + ////////////////////////////// + //- rjf: read address / segment selector sizes + // + U8 addr_size = 0; + U8 segment_selector_size = 0; + switch(version) + { + // NOTE(rjf): pre-dwarf5: assume from context + default: + { + addr_size = ctx->addr_size; + }break; + + // NOTE(rjf): @dwarf5 read address / segment selector sizes explicitly + case DW_Version_5: + { + off += str8_deserial_read_struct(data, off, &addr_size); + off += str8_deserial_read_struct(data, off, &segment_selector_size); + }break; + } + + ////////////////////////////// + //- rjf: read all remaining flat header properties + // + U64 opl_header_length_off = 0; + U64 header_length = 0; + U8 min_inst_length = 0; + U8 max_ops_per_inst = 1; + U8 default_is_stmt = 0; + S8 line_base = 0; + U8 line_range = 0; + U8 opcode_base = 0; + { + off += dw2_read_fmt_u64(data, off, format, &header_length); + opl_header_length_off = off; + off += str8_deserial_read_struct(data, off, &min_inst_length); + off += str8_deserial_read_struct(data, off, &max_ops_per_inst); + off += str8_deserial_read_struct(data, off, &default_is_stmt); + off += str8_deserial_read_struct(data, off, &line_base); + off += str8_deserial_read_struct(data, off, &line_range); + off += str8_deserial_read_struct(data, off, &opcode_base); + } + + ////////////////////////////// + //- rjf: read opcode lengths + // + U64 opcode_lengths_count = (opcode_base > 0 ? opcode_base - 1 : 0); + U8 *opcode_lengths = 0; + if(opcode_lengths_count > 0) + { + opcode_lengths = str8_skip(data, off).str; + off += sizeof(opcode_lengths[0]) * opcode_lengths_count; + } + + ////////////////////////////// + //- rjf: read directory / file tables + // + DW2_LineTableFileArray dirs = {0}; + DW2_LineTableFileArray files = {0}; + switch(version) + { + //////////////////////////// + //- rjf: pre-dwarf5: simple(r) well-defined format... still ulebs everywhere but oh well... + // just wait until the next case... + // + default: + { + //- rjf: gather directories + DW2_LineTableFileList dir_list = {0}; + { + // rjf: push compile directory as first list element, always + { + DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); + SLLQueuePush(dir_list.first, dir_list.last, n); + dir_list.count += 1; + n->v.file_name = ctx->unit_dir; + } + + // rjf: gather additional directories + for(;off < off_opl;) + { + String8 dir = {0}; + off += str8_deserial_read_cstr(data, off, &dir); + if(dir.size != 0) + { + DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); + SLLQueuePush(dir_list.first, dir_list.last, n); + dir_list.count += 1; + n->v.file_name = dir; + } + else + { + break; + } + } + } + + //- rjf: gather files + DW2_LineTableFileList file_list = {0}; + { + // rjf: push main compilation unit file as first list element, always + { + DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); + SLLQueuePush(file_list.first, file_list.last, n); + file_list.count += 1; + n->v.file_name = ctx->unit_file; + } + + // rjf: gather additional files + for(;off < off_opl;) + { + U8 next_byte = 0; + str8_deserial_read_struct(data, off, &next_byte); + if(next_byte == 0) + { + break; + } + String8 file_name = {0}; + U64 dir_idx = 0; + U64 modify_time = 0; + U64 file_size = 0; + off += str8_deserial_read_cstr(data, off, &file_name); + off += str8_deserial_read_uleb128(data, off, &dir_idx); + off += str8_deserial_read_uleb128(data, off, &modify_time); + off += str8_deserial_read_uleb128(data, off, &file_size); + if(file_name.size != 0) + { + DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); + SLLQueuePush(file_list.first, file_list.last, n); + file_list.count += 1; + n->v.file_name = file_name; + n->v.dir_idx = dir_idx; + n->v.modify_time = modify_time; + n->v.file_size = file_size; + } + } + } + + //- rjf: flatten + { + dirs.count = dir_list.count; + dirs.v = push_array(arena, DW2_LineTableFile, dirs.count); + files.count = file_list.count; + files.v = push_array(arena, DW2_LineTableFile, files.count); + { + U64 idx = 0; + for EachNode(n, DW2_LineTableFileNode, dir_list.first) + { + MemoryCopyStruct(&dirs.v[idx], &n->v); + idx += 1; + } + } + { + U64 idx = 0; + for EachNode(n, DW2_LineTableFileNode, file_list.first) + { + MemoryCopyStruct(&files.v[idx], &n->v); + idx += 1; + } + } + } + }break; + + //////////////////////////// + //- rjf: @dwarf5: another VM! d'oh. :( + // + case DW_Version_5: + { + //- rjf: read directory & file tables + for(B32 do_files = 0, do_dirs = 1; do_files <= 1; do_files += 1, do_dirs = 0) + { + // rjf: read header + U8 entry_formats_count = 0; + off += str8_deserial_read_struct(data, off, &entry_formats_count); + U64 *entry_formats = push_array(scratch.arena, U64, entry_formats_count*2); + for EachIndex(idx, entry_formats_count) + { + off += str8_deserial_read_uleb128(data, off, &entry_formats[idx*2 + 0]); + off += str8_deserial_read_uleb128(data, off, &entry_formats[idx*2 + 1]); + } + U64 table_count = 0; + off += str8_deserial_read_uleb128(data, off, &table_count); + + // rjf: read all table entries + DW2_LineTableFileArray table = {0}; + table.count = table_count; + table.v = push_array(arena, DW2_LineTableFile, table.count); + { + U64 idx = 0; + for(;off < off_opl && idx < table.count; idx += 1) + { + DW2_LineTableFile *entry_out = &table.v[idx]; + for(U64 entry_format_idx = 0; entry_format_idx < entry_formats_count; entry_format_idx += 1) + { + DW_LNCT lnct = (DW_LNCT)entry_formats[entry_format_idx*2 + 0]; + DW_FormKind form_kind = (DW_FormKind)entry_formats[entry_format_idx*2 + 1]; + DW2_FormVal form_val = {0}; + off += dw2_read_form_val(raw, ctx, data, off, form_kind, 0, &form_val); + switch(lnct) + { + default: + { + log_infof("DWARF LNCT encoding not currently supported (0x%I64x).\n", (U64)lnct); + }break; + case DW_LNCT_Path: + { + entry_out->file_name = form_val.string; + }break; + case DW_LNCT_DirectoryIndex: + { + entry_out->dir_idx = form_val.u128.u64[0]; + }break; + case DW_LNCT_TimeStamp: + { + entry_out->modify_time = form_val.u128.u64[0]; + entry_out->flags |= DW2_LineTableFileFlag_HasModifyTime; + }break; + case DW_LNCT_Size: + { + entry_out->file_size = form_val.u128.u64[0]; + }break; + case DW_LNCT_MD5: + { + entry_out->md5.u128 = form_val.u128; + entry_out->flags |= DW2_LineTableFileFlag_HasMD5; + }break; + case DW_LNCT_LLVM_Source: + { + entry_out->source = form_val.string; + }break; + } + } + } + } + + // rjf: store + if(0){} + else if(do_files) { files = table; } + else if(do_dirs) { dirs = table; } + } + + }break; + } + + ////////////////////////////// + //- rjf: fill output + // + if(out) + { + out->unit_length = unit_length; + out->format = format; + out->version = version; + out->addr_size = addr_size; + out->segment_selector_size = segment_selector_size; + out->header_length = header_length; + out->min_inst_length = min_inst_length; + out->max_ops_per_inst = max_ops_per_inst; + out->default_is_stmt = default_is_stmt; + out->line_base = line_base; + out->line_range = line_range; + out->opcode_base = opcode_base; + out->opcode_lengths_count = opcode_lengths_count; + out->opcode_lengths = opcode_lengths; + out->dirs = dirs; + out->files = files; + out->line_program_off = opl_header_length_off + header_length; + out->total_unit_data_size = (off_opl - start_off); + } + + U64 bytes_read = (off - start_off); + scratch_end(scratch); + return bytes_read; +} + +//////////////////////////////// +//~ rjf: String Offset Table Parsing (.debug_str_offsets) + +internal U64 +dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out) +{ + U64 start_off = off; + { + // rjf: read data length / format + U64 unit_data_length = 0; + DW_Format format = DW_Format_Null; + off += dw2_read_initial_length(data, off, &unit_data_length, &format); + U64 unit_data_off_opl = off + unit_data_length; + + // rjf: read version + DW_Version version = DW_Version_Null; + off += str8_deserial_read_struct(data, off, &version); + + // rjf: version 5: read rest (this section only exists in 5+) + if(version == DW_Version_5) + { + // rjf: read address / segment selector size (these need to be 0 in non-address offset tables) + U8 addr_size = 0; + U8 segment_selector_size = 0; + off += str8_deserial_read_struct(data, off, &addr_size); + off += str8_deserial_read_struct(data, off, &segment_selector_size); + + // rjf: determine entry size + U64 entry_size = dw_addr_size_from_format(format); + if(addr_size != 0) + { + entry_size = addr_size + segment_selector_size; + } + + // rjf: fill table info + out->format = format; + out->version = version; + out->addr_size = addr_size; + out->segment_selector_size = segment_selector_size; + out->entry_size = entry_size; + out->entries_count = (unit_data_off_opl - off) / out->entry_size; + out->entries = data.str + off; + + // rjf: skip table + off = unit_data_off_opl; + } + } + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal DW2_OffsetTableList +dw2_offset_table_list_from_data(Arena *arena, String8 data) +{ + DW2_OffsetTableList list = {0}; + for(U64 off = 0; off < data.size;) + { + U64 start_off = off; + DW2_OffsetTable table = {0}; + off += dw2_read_offset_table(data, off, &table); + if(table.entries != 0) + { + DW2_OffsetTableNode *n = push_array(arena, DW2_OffsetTableNode, 1); + SLLQueuePush(list.first, list.last, n); + n->v = table; + n->range = r1u64(start_off, off); + list.count += 1; + } + if(off == start_off) + { break; } - dw_cfa_inst_list_push(arena, &list, inst); } return list; } -internal -DW_DECODE_PTR(dw_decode_ptr_debug_frame) +internal B32 +dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out) { - return dw_read_debug_frame_ptr(data, ud, ptr_out); + B32 result = 0; + if(idx < tbl->entries_count) + { + U64 entry_size = tbl->entry_size; + U64 entry_off = idx * entry_size; + if(tbl->addr_size != 0) + { + U64 segment_off = entry_off; + U64 addr_off = entry_off + tbl->segment_selector_size; + U64 segment = 0; + U64 addr = 0; + MemoryCopy(&segment, (U8 *)tbl->entries + segment_off, tbl->segment_selector_size); + MemoryCopy(&addr, (U8 *)tbl->entries + addr_off, tbl->addr_size); + // TODO(rjf): @segment_based_addressing + *out = addr; + } + else + { + MemoryCopy(out, (U8 *)tbl->entries + entry_off, entry_size); + } + result = 1; + } + return result; } +internal DW2_OffsetTableSet +dw2_offset_table_set_from_raw(Arena *arena, DW_Raw *raw) +{ + DW2_OffsetTableSet result = {0}; + { + struct + { + String8 data; + U64 *tables_count_out; + DW2_OffsetTable **tables_out; + Rng1U64 **tables_ranges_out; + } + tasks[] = + { + {raw->sec[DW_SectionKind_StrOffsets].data, &result.str_offsets_tables_count, &result.str_offsets_tables, &result.str_offsets_tables_ranges}, + {raw->sec[DW_SectionKind_RngLists].data, &result.rnglists_tables_count, &result.rnglists_tables, &result.rnglists_tables_ranges}, + {raw->sec[DW_SectionKind_Addr].data, &result.addr_tables_count, &result.addr_tables, &result.addr_tables_ranges}, + {raw->sec[DW_SectionKind_LocLists].data, &result.loclists_tables_count, &result.loclists_tables, &result.loclists_tables_ranges}, + }; + for EachElement(task_idx, tasks) + { + Temp scratch = scratch_begin(&arena, 1); + String8 data = tasks[task_idx].data; + DW2_OffsetTableList tables = dw2_offset_table_list_from_data(scratch.arena, data); + tasks[task_idx].tables_count_out[0] = tables.count; + tasks[task_idx].tables_out[0] = push_array(arena, DW2_OffsetTable, tables.count); + tasks[task_idx].tables_ranges_out[0] = push_array(arena, Rng1U64, tables.count); + { + U64 idx = 0; + for EachNode(n, DW2_OffsetTableNode, tables.first) + { + tasks[task_idx].tables_out[0][idx] = n->v; + tasks[task_idx].tables_ranges_out[0][idx] = n->range; + idx += 1; + } + } + scratch_end(scratch); + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Range List Parsing (.debug_rnglists) + +internal Rng1U64List +dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val) +{ + Rng1U64List result = {0}; + switch((DW_VersionEnum)ctx->version) + { + case DW_Version_Null:{}break; + + //- rjf: pre-dwarf5 + case DW_Version_1: + case DW_Version_2: + case DW_Version_3: + case DW_Version_4: + { + String8 data = raw->sec[DW_SectionKind_Ranges].data; + U64 ranges_off = ranges_off = form_val.u128.u64[0];; + U64 base_addr = ctx->unit_base_addr; + U64 sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); + for(U64 off = ranges_off; off < data.size;) + { + U64 start_off = off; + U64 range_min = 0; + U64 range_opl = 0; + off += str8_deserial_read(data, off, &range_min, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read(data, off, &range_opl, ctx->addr_size, ctx->addr_size); + // + // NOTE(rjf): interpreting tuples: + // [0, 0) -> ending range list + // [max_U32/U64, depending on addr size, X) -> set new base address to X + // [N, M) -> new [base + N, base + M) range + // + if(range_min == 0 && range_opl == 0) + { + break; + } + else if(range_min == sentinel) + { + base_addr = range_opl; + } + else if(off == start_off) + { + break; + } + else + { + rng1u64_list_push(arena, &result, r1u64(base_addr + range_min, base_addr + range_opl)); + } + if(off == start_off) + { + break; + } + } + }break; + + //- rjf: @dwarf5 + case DW_Version_5: + { + String8 data = raw->sec[DW_SectionKind_RngLists].data; + + // rjf: determine section offset - sometimes this is encoded directly, + // other times it is relative, based on the form kind - more variability + // in this awful format + U64 rnglist_off = 0; + switch(form_val.kind) + { + default:{}break; + case DW_FormKind_SecOffset: + { + rnglist_off = form_val.u128.u64[0]; + }break; + case DW_FormKind_RngListx: + if(ctx->rnglists_table != 0) + { + U64 rnglist_off_idx = form_val.u128.u64[0]; + dw2_try_offset_from_table_idx(ctx->rnglists_table, rnglist_off_idx, &rnglist_off); + }break; + } + + // rjf: in a HIGHLY UNEXPECTED TURN OF EVENTS, we now have to decode ANOTHER + // OPCODE STREAM to unpack the actual list of ranges!!! + U64 rle_sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); + U64 base_addr = ctx->unit_base_addr; + for(U64 off = rnglist_off; off < data.size;) + { + U64 start_off = off; + + // rjf: decode op kind + DW_RLE rle_kind = DW_RLE_EndOfList; + off += str8_deserial_read_struct(data, off, &rle_kind); + + // rjf: obtain range from op + B32 good_range = 1; + Rng1U64 range = {0}; + switch(rle_kind) + { + default:{good_range = 0;}break; + case DW_RLE_BaseAddressx: + { + good_range = 0; + U64 addr_idx = 0; + off += str8_deserial_read_uleb128(data, off, &addr_idx); + if(ctx->addr_table != 0) + { + U64 new_base_addr = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &new_base_addr)) + { + good_range = 1; + base_addr = new_base_addr; + } + } + }break; + case DW_RLE_StartxEndx: + { + good_range = 0; + U64 start_idx = 0; + U64 end_idx = 0; + off += str8_deserial_read_uleb128(data, off, &start_idx); + off += str8_deserial_read_uleb128(data, off, &end_idx); + if(ctx->addr_table != 0) + { + U64 start = 0; + U64 end = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start) && + dw2_try_offset_from_table_idx(ctx->addr_table, end_idx, &end)) + { + good_range = 1; + range = r1u64(start, end); + } + } + }break; + case DW_RLE_StartxLength: + { + good_range = 0; + U64 start_idx = 0; + U64 length = 0; + off += str8_deserial_read_uleb128(data, off, &start_idx); + off += str8_deserial_read_uleb128(data, off, &length); + if(ctx->addr_table != 0) + { + U64 start = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start)) + { + good_range = 1; + range = r1u64(start, start+length); + } + } + }break; + case DW_RLE_OffsetPair: + { + U64 range_off_start = 0; + U64 range_off_end = 0; + off += str8_deserial_read_uleb128(data, off, &range_off_start); + off += str8_deserial_read_uleb128(data, off, &range_off_end); + range = r1u64(base_addr + range_off_start, base_addr + range_off_end); + }break; + case DW_RLE_BaseAddress: + { + U64 new_base_addr = 0; + off += str8_deserial_read(data, off, &new_base_addr, ctx->addr_size, ctx->addr_size); + base_addr = new_base_addr; + }break; + case DW_RLE_StartEnd: + { + U64 start = 0; + U64 end = 0; + off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read(data, off, &end, ctx->addr_size, ctx->addr_size); + range = r1u64(start, end); + }break; + case DW_RLE_StartLength: + { + U64 start = 0; + U64 length = 0; + off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read_uleb128(data, off, &length); + range = r1u64(start, start + length); + }break; + } + + // rjf: add range + if(good_range) + { + rng1u64_list_push(arena, &result, range); + } + + // rjf: end if no movement or end-of-list code + if(off == start_off || rle_kind == DW_RLE_EndOfList) + { + break; + } + } + }break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Location List Parsing (.debug_loclists) + +internal DW2_LocList +dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val) +{ + DW2_LocList result = {0}; + switch((DW_VersionEnum)ctx->version) + { + case DW_Version_Null:{}break; + + //- rjf: pre-dwarf5 + case DW_Version_1: + case DW_Version_2: + case DW_Version_3: + case DW_Version_4: + { + String8 data = raw->sec[DW_SectionKind_Loc].data; + U64 locs_off = locs_off = form_val.u128.u64[0]; + U64 base_addr = ctx->unit_base_addr; + U64 sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); + for(U64 off = locs_off; off < data.size;) + { + U64 start_off = off; + U64 range_min = 0; + U64 range_opl = 0; + off += str8_deserial_read(data, off, &range_min, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read(data, off, &range_opl, ctx->addr_size, ctx->addr_size); + // + // NOTE(rjf): interpreting tuples: + // [0, 0) -> ending range list + // [max_U32/U64, depending on addr size, X) -> set new base address to X + // [N, M) -> new [base + N, base + M) range + // + if(range_min == 0 && range_opl == 0) + { + break; + } + else if(range_min == sentinel) + { + base_addr = range_opl; + } + else if(off == start_off) + { + break; + } + else + { + U16 expr_size = 0; + off += str8_deserial_read_struct(data, off, &expr_size); + DW2_LocNode *n = push_array(arena, DW2_LocNode, 1); + n->v.range = r1u64(range_min + base_addr, range_opl + base_addr); + n->v.expr = str8_substr(data, r1u64(off, off+expr_size)); + SLLQueuePush(result.first, result.last, n); + result.count += 1; + off += expr_size; + } + if(off == start_off) + { + break; + } + } + }break; + + //- rjf: @dwarf5 + case DW_Version_5: + { + String8 data = raw->sec[DW_SectionKind_LocLists].data; + + // rjf: determine section offset - sometimes this is encoded directly, + // other times it is relative, based on the form kind - more variability + // in this awful format + U64 loclist_off = 0; + switch(form_val.kind) + { + default:{}break; + case DW_FormKind_SecOffset: + { + loclist_off = form_val.u128.u64[0]; + }break; + case DW_FormKind_LocListx: + if(ctx->rnglists_table != 0) + { + U64 loclist_off_idx = form_val.u128.u64[0]; + dw2_try_offset_from_table_idx(ctx->loclists_table, loclist_off_idx, &loclist_off); + }break; + } + + // rjf: in a HIGHLY UNEXPECTED TURN OF EVENTS, we now have to decode ANOTHER + // OPCODE STREAM to unpack the actual list of locations!!! + U64 rle_sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); + U64 base_addr = ctx->unit_base_addr; + for(U64 off = loclist_off; off < data.size;) + { + U64 start_off = off; + + // rjf: decode op kind + DW_LLE lle_kind = DW_LLE_EndOfList; + off += str8_deserial_read_struct(data, off, &lle_kind); + + // rjf: obtain range from op + B32 good_loc = 1; + Rng1U64 range = {0}; + switch(lle_kind) + { + default:{good_loc = 0;}break; + case DW_LLE_BaseAddressx: + { + good_loc = 0; + U64 addr_idx = 0; + off += str8_deserial_read_uleb128(data, off, &addr_idx); + if(ctx->addr_table != 0) + { + U64 new_base_addr = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &new_base_addr)) + { + good_loc = 1; + base_addr = new_base_addr; + } + } + }break; + case DW_LLE_StartxEndx: + { + good_loc = 0; + U64 start_idx = 0; + U64 end_idx = 0; + off += str8_deserial_read_uleb128(data, off, &start_idx); + off += str8_deserial_read_uleb128(data, off, &end_idx); + if(ctx->addr_table != 0) + { + U64 start = 0; + U64 end = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start) && + dw2_try_offset_from_table_idx(ctx->addr_table, end_idx, &end)) + { + good_loc = 1; + range = r1u64(start, end); + } + } + }break; + case DW_LLE_StartxLength: + { + good_loc = 0; + U64 start_idx = 0; + U64 length = 0; + off += str8_deserial_read_uleb128(data, off, &start_idx); + off += str8_deserial_read_uleb128(data, off, &length); + if(ctx->addr_table != 0) + { + U64 start = 0; + if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start)) + { + good_loc = 1; + range = r1u64(start, start+length); + } + } + }break; + case DW_LLE_OffsetPair: + { + U64 range_off_start = 0; + U64 range_off_end = 0; + off += str8_deserial_read_uleb128(data, off, &range_off_start); + off += str8_deserial_read_uleb128(data, off, &range_off_end); + range = r1u64(base_addr + range_off_start, base_addr + range_off_end); + }break; + case DW_LLE_DefaultLocation: + { + range = r1u64(0, max_U64); + }break; + case DW_LLE_BaseAddress: + { + U64 new_base_addr = 0; + off += str8_deserial_read(data, off, &new_base_addr, ctx->addr_size, ctx->addr_size); + base_addr = new_base_addr; + }break; + case DW_LLE_StartEnd: + { + U64 start = 0; + U64 end = 0; + off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read(data, off, &end, ctx->addr_size, ctx->addr_size); + range = r1u64(start, end); + }break; + case DW_LLE_StartLength: + { + U64 start = 0; + U64 length = 0; + off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); + off += str8_deserial_read_uleb128(data, off, &length); + range = r1u64(start, start + length); + }break; + } + + // rjf: read expression + String8 expr = {0}; + if(good_loc && lle_kind != DW_LLE_BaseAddress && lle_kind != DW_LLE_BaseAddressx) + { + U64 expr_size = 0; + off += str8_deserial_read_uleb128(data, off, &expr_size); + expr = str8_substr(data, r1u64(off, off+expr_size)); + off += expr_size; + } + + // rjf: add range + if(good_loc) + { + DW2_LocNode *n = push_array(arena, DW2_LocNode, 1); + n->v.range = range; + n->v.expr = expr; + SLLQueuePush(result.first, result.last, n); + result.count += 1; + } + + // rjf: end if no movement or end-of-list code + if(off == start_off || lle_kind == DW_LLE_EndOfList) + { + break; + } + } + }break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Unwind Info Parsing (.debug_frame) + +internal U64 +dw2_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi_header_out) +{ + U64 start_off = off; + + // rjf: read length / format + U64 length = 0; + DW_Format fmt = DW_Format_Null; + U64 length_size = dw2_read_initial_length(data, off, &length, &fmt); + + // rjf: find entry info, read ID + Rng1U64 entry_range = r1u64(off, off + length_size + length); + String8 entry_data = str8_substr(data, entry_range); + U64 id = 0; + U64 id_size = dw2_read_fmt_u64(entry_data, length_size, fmt, &id); + + // rjf: fill + cfi_header_out->kind = ((fmt == DW_Format_32Bit && id == max_U32) || (fmt == DW_Format_64Bit && id == max_U64)) ? DW_CFIKind_CIE : DW_CFIKind_FDE; + cfi_header_out->fmt = fmt; + cfi_header_out->entry_range = entry_range; + cfi_header_out->cie_pointer = id; + cfi_header_out->cie_pointer_off = off + length_size; + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal U64 +dw2_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie_out) +{ + U64 start_off = off; + + // rjf: read id + U64 id = 0; + off += dw2_read_fmt_u64(data, off, fmt, &id); + + // rjf: read version + U8 version = 0; + off += str8_deserial_read_struct(data, off, &version); + + // rjf: read aug string + String8 aug_string = {0}; + U64 aug_string_off = off; + off += str8_deserial_read_cstr(data, off, &aug_string); + U64 aug_string_off_opl = off; + + // rjf: read address/segment-selector size + U8 address_size = 0; + U8 segment_selector_size = 0; + if(version >= DW_Version_4) + { + off += str8_deserial_read_struct(data, off, &address_size); + off += str8_deserial_read_struct(data, off, &segment_selector_size); + } + else + { + address_size = byte_size_from_arch(arch); + } + + // rjf: read alignments + U64 code_align_factor = 0; + U64 data_align_factor = 0; + off += str8_deserial_read_uleb128(data, off, &code_align_factor); + off += str8_deserial_read_uleb128(data, off, &data_align_factor); + + // rjf: read return address register encoding + U64 ret_addr_reg = 0; + switch(version) + { + case DW_Version_1: + { + off += str8_deserial_read(data, off, &ret_addr_reg, 1, 1); + }break; + default: + { + off += str8_deserial_read_uleb128(data, off, &ret_addr_reg); + }break; + } + + // rjf: fill output + { + cie_out->aug_string_range = r1u64(aug_string_off, aug_string_off_opl); + cie_out->code_align_factor = code_align_factor; + cie_out->data_align_factor = data_align_factor; + cie_out->ret_addr_reg = ret_addr_reg; + cie_out->format = fmt; + cie_out->version = version; + cie_out->address_size = address_size; + cie_out->segment_selector_size = segment_selector_size; + } + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal U64 +dw2_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie, DW_FDE *fde_out) +{ + U64 start_off = off; + + // rjf: skip format-dependent prefix + off += (fmt == DW_Format_32Bit) ? 4 : 12; + + // rjf: read cie ptr + U64 cie_ptr = 0; + off += dw2_read_fmt_u64(data, off, fmt, &cie_ptr); + + // rjf: read address of first instruction + U64 pc_begin = 0; + off += str8_deserial_read(data, off, &pc_begin, cie->address_size, cie->address_size); + + // rjf: read instruction range size + U64 pc_range_size = 0; + off += str8_deserial_read(data, off, &pc_range_size, cie->address_size, cie->address_size); + + // rjf: skip aug data + off += dim_1u64(cie->aug_string_range); + + // rjf: fill output + fde_out->cie_pointer = cie_ptr; + fde_out->pc_range = r1u64(pc_begin, pc_begin + pc_range_size); + + U64 bytes_read = (off - start_off); + return bytes_read; +} + +internal B32 +dw2_try_cfi_from_data(String8 data, U64 off, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out) +{ + B32 result = 0; + { + DW_CFIHeader fde_header = {0}; + off += dw2_read_cfi_header(data, off, &fde_header); + if(fde_header.kind == DW_CFIKind_FDE) + { + DW_CFIHeader cie_header = {0}; + dw2_read_cfi_header(data, fde_header.cie_pointer, &cie_header); + if(cie_header.kind == DW_CFIKind_CIE) + { + result = 1; + dw2_read_cie(data, cie_header.entry_range.min, cie_header.fmt, arch, cie_out); + dw2_read_fde(data, fde_header.entry_range.min, fde_header.fmt, arch, cie_out, fde_out); + } + } + } + return result; +} diff --git a/src/dwarf/dwarf_parse.h b/src/dwarf/dwarf_parse.h index 2bddbe72..b8bd3554 100644 --- a/src/dwarf/dwarf_parse.h +++ b/src/dwarf/dwarf_parse.h @@ -4,525 +4,453 @@ #ifndef DWARF_PARSE_H #define DWARF_PARSE_H -typedef struct DW_Section +//////////////////////////////// +//~ rjf: Raw Section Data + +typedef struct DW_Section DW_Section; +struct DW_Section { String8 name; String8 data; - B32 is_dwo; -} DW_Section; +}; -typedef struct DW_Raw +typedef struct DW_Raw DW_Raw; +struct DW_Raw { - DW_Section sec[DW_Section_COUNT]; - DW_Section sup[DW_Section_COUNT]; -} DW_Raw; + DW_Section sec[DW_SectionKind_COUNT]; + DW_Section sup[DW_SectionKind_COUNT]; +}; -typedef struct DW_ListUnit +//////////////////////////////// +//~ rjf: Unit Headers + +typedef struct DW2_UnitHeader DW2_UnitHeader; +struct DW2_UnitHeader { DW_Version version; - U64 address_size; - U64 segment_selector_size; - U64 entry_size; - String8 entries; -} DW_ListUnit; + DW_Format format; + U64 abbrev_off; + U64 addr_size; + DW_CompUnitKind kind; + U64 dwo_id; +}; -typedef struct DW_ListUnitInput +//////////////////////////////// +//~ rjf: Abbreviation Map (ID -> .debug_abbrev Offset) + +typedef struct DW2_AbbrevAttrib DW2_AbbrevAttrib; +struct DW2_AbbrevAttrib { - U64 addr_count; - U64 str_offset_count; - U64 rnglist_count; - U64 loclist_count; - Rng1U64Array addr_ranges; - Rng1U64Array str_offset_ranges; - Rng1U64Array rnglist_ranges; - Rng1U64Array loclist_ranges; - DW_ListUnit *addrs; - DW_ListUnit *str_offsets; - DW_ListUnit *rnglists; - DW_ListUnit *loclists; -} DW_ListUnitInput; + DW_AttribKind attrib_kind; + DW_FormKind form_kind; + U64 implicit_const; +}; -typedef struct DW_AbbrevTableEntry +typedef struct DW2_AbbrevAttribNode DW2_AbbrevAttribNode; +struct DW2_AbbrevAttribNode +{ + DW2_AbbrevAttribNode *next; + DW2_AbbrevAttrib v; +}; + +typedef struct DW2_AbbrevAttribList DW2_AbbrevAttribList; +struct DW2_AbbrevAttribList +{ + DW2_AbbrevAttribNode *first; + DW2_AbbrevAttribNode *last; + U64 count; +}; + +typedef struct DW2_AbbrevHeader DW2_AbbrevHeader; +struct DW2_AbbrevHeader { U64 id; - U64 off; -} DW_AbbrevTableEntry; - -typedef struct DW_AbbrevTable DW_AbbrevTable; -struct DW_AbbrevTable -{ - U64 count; - DW_AbbrevTableEntry *entries; + DW_TagKind tag_kind; + B8 has_children; }; -typedef enum DW_AbbrevKind +typedef struct DW2_AbbrevMapNode DW2_AbbrevMapNode; +struct DW2_AbbrevMapNode { - DW_Abbrev_Null, - DW_Abbrev_Tag, - DW_Abbrev_Attrib, - DW_Abbrev_AttribSequenceEnd, - DW_Abbrev_DIEBegin, - DW_Abbrev_DIEEnd, -} DW_AbbrevKind; + DW2_AbbrevMapNode *next; + U64 id; + U64 off; +}; -typedef U32 DW_AbbrevFlags; +typedef struct DW2_AbbrevMap DW2_AbbrevMap; +struct DW2_AbbrevMap +{ + DW2_AbbrevMapNode **slots; + U64 slots_count; +}; + +typedef struct DW2_UnitAbbrevMapMap DW2_UnitAbbrevMapMap; +struct DW2_UnitAbbrevMapMap +{ + U64 map_count; + DW2_AbbrevMap *map_from_idx_table; + DW2_AbbrevMap **map_from_unit_idx_table; +}; + +//////////////////////////////// +//~ rjf: Offset Tables (.debug_str_offsets, .debug_rnglists) + +typedef struct DW2_OffsetTable DW2_OffsetTable; +struct DW2_OffsetTable +{ + DW_Format format; + DW_Version version; + U8 addr_size; + U8 segment_selector_size; + U64 entry_size; + U64 entries_count; + void *entries; +}; + +typedef struct DW2_OffsetTableNode DW2_OffsetTableNode; +struct DW2_OffsetTableNode +{ + DW2_OffsetTableNode *next; + DW2_OffsetTable v; + Rng1U64 range; +}; + +typedef struct DW2_OffsetTableList DW2_OffsetTableList; +struct DW2_OffsetTableList +{ + DW2_OffsetTableNode *first; + DW2_OffsetTableNode *last; + U64 count; +}; + +typedef struct DW2_OffsetTableSet DW2_OffsetTableSet; +struct DW2_OffsetTableSet +{ + // rjf: .debug_str_offsets + U64 str_offsets_tables_count; + DW2_OffsetTable *str_offsets_tables; + Rng1U64 *str_offsets_tables_ranges; + + // rjf: .debug_rnglists + U64 rnglists_tables_count; + DW2_OffsetTable *rnglists_tables; + Rng1U64 *rnglists_tables_ranges; + + // rjf: .debug_addr + U64 addr_tables_count; + DW2_OffsetTable *addr_tables; + Rng1U64 *addr_tables_ranges; + + // rjf: .debug_loclists + U64 loclists_tables_count; + DW2_OffsetTable *loclists_tables; + Rng1U64 *loclists_tables_ranges; +}; + +//////////////////////////////// +//~ rjf: Parsing Context Bundle + +typedef struct DW2_ParseCtx DW2_ParseCtx; +struct DW2_ParseCtx +{ + DW_Version version; + DW_Format format; + DW_ExtFlags exts; + U64 addr_size; + U64 unit_base_addr; + U64 unit_base_info_off; + DW2_AbbrevMap *abbrev_map; + DW2_OffsetTable *rnglists_table; + DW2_OffsetTable *str_offsets_table; + DW2_OffsetTable *addr_table; + DW2_OffsetTable *loclists_table; + String8 unit_dir; + String8 unit_file; + DW_Language language; +}; + +//////////////////////////////// +//~ rjf: Tag Attributes + +typedef struct DW2_FormVal DW2_FormVal; +struct DW2_FormVal +{ + DW_FormKind kind; + U128 u128; + String8 string; + U64 addr; +}; + +typedef struct DW2_Attrib DW2_Attrib; +struct DW2_Attrib +{ + DW_AttribKind attrib_kind; + DW2_FormVal val; +}; + +typedef struct DW2_AttribNode DW2_AttribNode; +struct DW2_AttribNode +{ + DW2_AttribNode *next; + DW2_Attrib v; +}; + +typedef struct DW2_AttribList DW2_AttribList; +struct DW2_AttribList +{ + DW2_AttribNode *first; + DW2_AttribNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Tags + +typedef struct DW2_Tag DW2_Tag; +struct DW2_Tag +{ + DW_TagKind kind; + B32 has_children; + DW2_AttribList attribs; +}; + +//////////////////////////////// +//~ rjf: Line Info + +typedef U32 DW2_LineTableFileFlags; enum { - DW_AbbrevFlag_HasImplicitConst = (1 << 0), - DW_AbbrevFlag_HasChildren = (1 << 1), + DW2_LineTableFileFlag_HasMD5 = (1<<0), + DW2_LineTableFileFlag_HasModifyTime = (1<<1), }; -typedef struct DW_Abbrev +typedef struct DW2_LineTableFile DW2_LineTableFile; +struct DW2_LineTableFile { - DW_AbbrevKind kind; - U64 sub_kind; - U64 id; - S64 implicit_const; - DW_AbbrevFlags flags; -} DW_Abbrev; + String8 file_name; + DW2_LineTableFileFlags flags; + U64 dir_idx; + U64 modify_time; + U64 file_size; + MD5 md5; + String8 source; +}; -typedef struct DW_Attrib +typedef struct DW2_LineTableFileNode DW2_LineTableFileNode; +struct DW2_LineTableFileNode { - U64 info_off; - U64 abbrev_off; - U64 abbrev_id; - DW_AttribKind attrib_kind; - DW_Form form; -} DW_Attrib; + DW2_LineTableFileNode *next; + DW2_LineTableFile v; +}; -typedef struct DW_AttribNode +typedef struct DW2_LineTableFileList DW2_LineTableFileList; +struct DW2_LineTableFileList { - struct DW_AttribNode *next; - DW_Attrib v; -} DW_AttribNode; + DW2_LineTableFileNode *first; + DW2_LineTableFileNode *last; + U64 count; +}; -typedef struct DW_AttribList +typedef struct DW2_LineTableFileArray DW2_LineTableFileArray; +struct DW2_LineTableFileArray { - DW_AttribNode *first; - DW_AttribNode *last; - U64 count; -} DW_AttribList; + DW2_LineTableFile *v; + U64 count; +}; -typedef U8 DW_TagSpare; -typedef struct DW_Tag +typedef struct DW2_LineTableHeader DW2_LineTableHeader; +struct DW2_LineTableHeader { - B32 has_children; - U64 abbrev_id; - DW_TagKind kind; - DW_AttribList attribs; - U64 info_off; - DW_TagSpare v; -} DW_Tag; + U64 unit_length; + DW_Format format; + DW_Version version; + U8 addr_size; + U8 segment_selector_size; + U64 header_length; + U8 min_inst_length; + U8 max_ops_per_inst; + U8 default_is_stmt; + S8 line_base; + U8 line_range; + U8 opcode_base; + U64 opcode_lengths_count; + U8 *opcode_lengths; + DW2_LineTableFileArray dirs; + DW2_LineTableFileArray files; + U64 line_program_off; + U64 total_unit_data_size; // NOTE(rjf): would be implied by `unit_length`, but DWARF makes that the size *past* the variable-width unit-length field itself +}; -typedef struct DW_TagNode +typedef struct DW2_LineVMRegs DW2_LineVMRegs; +struct DW2_LineVMRegs { - DW_Tag tag; - struct DW_TagNode *sibling; - struct DW_TagNode *first_child; - struct DW_TagNode *last_child; -} DW_TagNode; + U64 address; + U64 vliw_op_index; + U64 file_index; + U64 line; + U64 column; + B32 is_stmt; + B32 basic_block; + B32 end_sequence; + B32 prologue_end; + B32 epilogue_begin; + U64 isa; + U64 discriminator; +}; -typedef struct DW_Loc +//////////////////////////////// +//~ rjf: Location Lists + +typedef struct DW2_Loc DW2_Loc; +struct DW2_Loc { Rng1U64 range; String8 expr; -} DW_Loc; +}; -typedef struct DW_LocNode +typedef struct DW2_LocNode DW2_LocNode; +struct DW2_LocNode { - DW_Loc v; - struct DW_LocNode *next; -} DW_LocNode; + DW2_LocNode *next; + DW2_Loc v; +}; -typedef struct DW_LocList +typedef struct DW2_LocList DW2_LocList; +struct DW2_LocList { - U64 count; - DW_LocNode *first; - DW_LocNode *last; -} DW_LocList; - -typedef struct DW_CompUnit -{ - B32 relaxed; - DW_Ext ext; - DW_CompUnitKind kind; - DW_Version version; - DW_Format format; - U64 address_size; - U64 abbrev_off; - Rng1U64 info_range; - U64 first_tag_info_off; - DW_AbbrevTable abbrev_table; - DW_ListUnit *addr_lu; - DW_ListUnit *str_offsets_lu; - DW_ListUnit *rnglists_lu; - DW_ListUnit *loclists_lu; - U64 low_pc; - U64 dwo_id; - DW_Tag tag; - HashTable *tag_ht; -} DW_CompUnit; - -typedef struct DW_TagTree -{ - DW_TagNode *root; - U64 tag_count; -} DW_TagTree; + DW2_LocNode *first; + DW2_LocNode *last; + U64 count; +}; //////////////////////////////// +//~ rjf: Unwind Info -typedef struct DW_LineFile +typedef enum DW_CFIKind { - String8 path; - U64 dir_idx; - U64 time_stamp; - U64 size; - U128 md5; - String8 source; -} DW_LineFile; + DW_CFIKind_Null, + DW_CFIKind_CIE, // Common Information Entry + DW_CFIKind_FDE, // Frame Description Entry + DW_CFIKind_COUNT +} +DW_CFIKind; -typedef struct DW_LineFileNode +typedef struct DW_CFIHeader DW_CFIHeader; +struct DW_CFIHeader { - struct DW_LineFileNode *next; - DW_LineFile file; -} DW_LineFileNode; + DW_CFIKind kind; + DW_Format fmt; + Rng1U64 entry_range; + U64 cie_pointer_off; + U64 cie_pointer; +}; -typedef struct DW_LineFileList +typedef struct DW_CIE DW_CIE; +struct DW_CIE { - U64 node_count; - DW_LineFileNode *first; - DW_LineFileNode *last; -} DW_LineFileList; - -typedef struct DW_LineFileArray -{ - U64 count; - DW_LineFile *v; -} DW_LineFileArray; - -typedef struct DW_LineVMHeader -{ - U64 unit_length; - DW_Version version; - U8 address_size; // Duplicates size from the compilation unit but is needed to support stripped exe that just have .debug_line and .debug_line_str. - U8 segment_selector_size; - U64 header_length; - U8 min_inst_len; - U8 max_ops_for_inst; - U8 default_is_stmt; - S8 line_base; - U8 line_range; - U8 opcode_base; - U64 num_opcode_lens; - U8 *opcode_lens; - U64 line_program_off; - String8Array dir_table; - DW_LineFileArray file_table; -} DW_LineVMHeader; - -typedef struct DW_LineVMState -{ - U64 address; // Address of a machine instruction. - U32 op_index; // This is used by the VLIW instructions to indicate index of operation inside the instruction. - - // Line table doesn't contain full path to a file, instead - // DWARF encodes path as two indices. First index will point into a directory - // table, and second points into a file name table. - U64 file_index; - - U64 line; - U64 column; - - B32 is_stmt; // Indicates that "address" points to place suitable for a breakpoint. - B32 basic_block; // Indicates that the "address" is inside a basic block. - - // Indicates that "address" points to place where function starts. - // Usually prologue is the place where compiler emits instructions to - // prepare stack for a function. - B32 prologue_end; - - B32 epilogue_begin; // Indicates that "address" points to section where function exits and unwinds stack. - U64 isa; // Instruction set that is used. - U64 discriminator; // Arbitrary id that indicates to which block these instructions belong. - B32 end_sequence; // Indicates that "address" points to the first instruction in the instruction block that follows. -} DW_LineVMState; - -typedef struct DW_LineVM -{ - Arena *arena; - U64 cursor; - String8 program; - DW_LineVMHeader header; - B32 new_line; - B32 new_seq; - B32 skip_opcode; - DW_LineVMState state; - U64 advance; - U64 opcode_off; - DW_StdOpcode opcode; - DW_ExtOpcode ext_opcode; - U64 ext_length; - U64 line_advance; - U64 addr_advance; - HashTable *ext_file_ht; - struct { - union { - String8 string; - U64 u64; - S64 s64; - }; - } operands[4]; - String8 error; -} DW_LineVM; - -//////////////////////////////// -// .debug_pubnames and .debug_pubtypes - -typedef struct DW_PubStringsBucket -{ - struct DW_PubStringsBucket *next; - String8 string; - U64 info_off; - U64 cu_info_off; -} DW_PubStringsBucket; - -typedef struct DW_PubStringsTable -{ - U64 size; - DW_PubStringsBucket **buckets; -} DW_PubStringsTable; - -typedef struct DW_Reference -{ - DW_CompUnit *cu; - U64 info_off; // global .debug_info offset -} DW_Reference; - -//////////////////////////////// -//~ Expression - -typedef union DW_ExprOperand -{ - U8 u8; - U16 u16; - U32 u32; - U64 u64; - - S8 s8; - S16 s16; - S32 s32; - S64 s64; - - String8 block; -} DW_ExprOperand; - -typedef struct DW_ExprInst -{ - DW_ExprOp opcode; - DW_ExprOperand *operands; - U64 size; - struct DW_ExprInst *next; - struct DW_ExprInst *prev; -} DW_ExprInst; - -typedef struct DW_Expr -{ - U64 count; - DW_ExprInst *first; - DW_ExprInst *last; -} DW_Expr; - -//////////////////////////////// -// .debug_frame - -typedef struct DW_CIE -{ - String8 insts; - String8 aug_string; - String8 aug_data; - U64 code_align_factor; - S64 data_align_factor; - U64 ret_addr_reg; - U64 ext[4]; + Rng1U64 aug_string_range; + Rng1U64 aug_data_range; + U64 code_align_factor; + S64 data_align_factor; + U64 ret_addr_reg; + U64 ext[4]; DW_Format format; - U8 version; - U8 address_size; - U8 segment_selector_size; -} DW_CIE; + U8 version; + U8 address_size; + U8 segment_selector_size; +}; -typedef struct DW_FDE +typedef struct DW_FDE DW_FDE; +struct DW_FDE { - DW_Format format; - U64 cie_pointer; - Rng1U64 pc_range; - String8 insts; -} DW_FDE; + U64 cie_pointer; + Rng1U64 pc_range; +}; -typedef union DW_CFA_Operand +typedef struct DW_CFI DW_CFI; +struct DW_CFI { - U64 u64; - S64 s64; - String8 block; -} DW_CFA_Operand; + DW_CIE cie; + DW_FDE fde; +}; -typedef enum -{ - DW_CFA_ParseErrorCode_NewInst, - DW_CFA_ParseErrorCode_End, - DW_CFA_ParseErrorCode_OutOfData -} DW_CFA_ParseErrorCode; +//////////////////////////////// +//~ rjf: Globals -typedef struct DW_CFA_Inst -{ - DW_CFA_Opcode opcode; - DW_CFA_Operand operands[DW_CFA_OperandMax]; -} DW_CFA_Inst; +global read_only DW2_Attrib dw2_attrib_nil = {0}; -typedef struct DW_CFA_InstNode -{ - DW_CFA_Inst v; - struct DW_CFA_InstNode *next; -} DW_CFA_InstNode; +//////////////////////////////// +//~ rjf: Basic Parsing Helpers -typedef struct DW_CFA_InstList -{ - U64 count; - DW_CFA_InstNode *first; - DW_CFA_InstNode *last; -} DW_CFA_InstList; +internal U64 dw2_read_initial_length(String8 data, U64 off, U64 *out, DW_Format *fmt_out); +internal U64 dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out); +internal DW_SectionKind dw_section_kind_from_string(String8 string); -#define DW_DECODE_PTR(name) U64 name(String8 data, void *ud, U64 *ptr_out) -typedef DW_DECODE_PTR(DW_DecodePtr); +//////////////////////////////// +//~ rjf: Unit Range Set Parsing (Top-Level .debug_info, .debug_aranges) -// hasher +internal Rng1U64Array dw2_unit_ranges_from_data(Arena *arena, String8 data); -internal U64 dw_hash_from_string(String8 string); +//////////////////////////////// +//~ rjf: Unit Header Parsing -// deserial helpers +internal U64 dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out); -internal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out); -internal U64 str8_deserial_read_dwarf_uint (String8 string, U64 off, DW_Format format, U64 *uint_out); -internal U64 str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out); -internal U64 str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out); +//////////////////////////////// +//~ rjf: Abbreviation Map Parsing -internal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data); -internal Rng1U64Array dw_unit_ranges_from_data_arr(Arena *arena, String8 data); +internal U64 dw2_read_abbrev(Arena *arena, String8 data, U64 off, DW2_AbbrevHeader *header_out, DW2_AbbrevAttribList *attribs_out); +internal DW2_AbbrevMap dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off); +internal DW2_UnitAbbrevMapMap dw2_unit_abbrev_map_map_from_data(Arena *arena, String8 data, DW2_UnitHeader *unit_headers, U64 unit_headers_count); -// list units +//////////////////////////////// +//~ rjf: Form Value Parsing -internal U64 dw_read_list_unit_header_addr (String8 unit_data, DW_ListUnit *lu_out); -internal U64 dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out); -internal U64 dw_read_list_unit_header_list (String8 unit_data, DW_ListUnit *lu_out); +internal U64 dw2_read_form_val(DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out); -internal DW_ListUnitInput dw_list_unit_input_from_input(Arena *arena, DW_Raw *input); +//////////////////////////////// +//~ rjf: Parse Context Construction -internal U64 dw_offset_from_list_unit(DW_ListUnit *lu, U64 index); -internal U64 dw_addr_from_list_unit (DW_ListUnit *lu, U64 index); +internal void dw2_parse_ctx_equip_unit_header(DW2_ParseCtx *ctx_out, DW2_UnitHeader *hdr, U64 unit_base_info_off); +internal void dw2_parse_ctx_equip_unit_abbrev_map(DW2_ParseCtx *ctx_out, DW2_UnitAbbrevMapMap *map, U64 unit_idx); +internal void dw2_parse_ctx_equip_unit_root_tag(DW2_ParseCtx *ctx_out, DW2_Tag *tag, DW2_OffsetTableSet *offset_tables); -// abbrev table +//////////////////////////////// +//~ rjf: Tag Parsing -internal U64 dw_read_abbrev_tag (String8 data, U64 offset, DW_Abbrev *out_abbrev); -internal U64 dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev); +internal U64 dw2_read_tag(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); +internal DW2_Attrib *dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind); +internal U64 dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v); -internal DW_AbbrevTable dw_read_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_base); -internal U64 dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U64 abbrev_id); +//////////////////////////////// +//~ rjf: Line Table Parsing -// form and tag +internal U64 dw2_read_line_table_header(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out); -internal B32 dw_read_form (String8 data, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, S64 implicit_const, DW_Form *form_out, U64 *bytes_read_out); -internal U64 dw_read_tag (Arena *arena, DW_Raw *input, DW_AbbrevTable abbrev_table, DW_Version version, DW_Format format, U64 address_size, Rng1U64 cu_info_range, U64 tag_info_off, DW_Tag *tag_out); -internal U64 dw_read_tag_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out); +//////////////////////////////// +//~ rjf: Offset Table Parsing (.debug_str_offsets, .debug_rnglists) -// attrib interp +internal U64 dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out); +internal DW2_OffsetTableList dw2_offset_table_list_from_data(Arena *arena, String8 data); +internal B32 dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out); +internal DW2_OffsetTableSet dw2_offset_table_set_from_raw(Arena *arena, DW_Raw *raw); -internal U64 dw_interp_sec_offset(DW_Form form); -internal String8 dw_interp_exprloc (DW_Form form); -internal U128 dw_interp_const_u128(DW_Form form); -internal U64 dw_interp_const_u64 (DW_Form form); -internal U32 dw_interp_const_u32 (DW_Form form); -internal S64 dw_interp_const_s64 (DW_Form form); -internal S32 dw_interp_const_s32 (DW_Form form); -internal B32 dw_interp_flag (DW_Form form); -internal U64 dw_interp_address (U64 address_size, U64 base_addr, DW_ListUnit *addr_xlist, DW_Form form); -internal String8 dw_interp_block (DW_Raw *input, DW_CompUnit *cu, DW_Form form); -internal String8 dw_interp_string (DW_Raw *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_Form form); -internal String8 dw_interp_line_ptr (DW_Raw *input, DW_Form form); -internal DW_LineFile * dw_interp_file (DW_LineVM *line_vm, DW_Form form); -internal DW_Reference dw_interp_ref (DW_Raw *input, DW_CompUnit *cu, DW_Form form); -internal DW_LocList dw_interp_loclist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form); -internal Rng1U64List dw_interp_rnglist (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Form form); +//////////////////////////////// +//~ rjf: Range List Parsing (.debug_rnglists) -internal String8 dw_exprloc_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U128 dw_const_u128_from_attrib(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U64 dw_const_u64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U32 dw_const_u32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal S64 dw_const_s64_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal S32 dw_const_s32_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal B32 dw_flag_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal U64 dw_address_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_block_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_string_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal String8 dw_line_ptr_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal DW_LineFile * dw_file_from_attrib (DW_CompUnit *cu, DW_LineVM *line_vm, DW_Attrib *attrib); -internal DW_Reference dw_ref_from_attrib (DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal DW_LocList dw_loclist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); -internal Rng1U64List dw_rnglist_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal Rng1U64List dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val); -internal String8 dw_exprloc_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U128 dw_const_u128_from_tag_attrib_kind(DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U64 dw_const_u64_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U32 dw_const_u32_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal B32 dw_flag_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal U64 dw_address_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_block_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_string_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal String8 dw_line_ptr_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LineFile * dw_file_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_LineVM *line_vm, DW_Tag tag, DW_AttribKind kind); -internal DW_Reference dw_ref_from_tag_attrib_kind (DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal DW_LocList dw_loclist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); -internal Rng1U64List dw_rnglist_from_tag_attrib_kind (Arena *arena, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); +//////////////////////////////// +//~ rjf: Location List Parsing (.debug_loclists) -internal B32 dw_is_attrib_var_ref(DW_Raw *input, DW_CompUnit *cu, DW_Attrib *attrib); +internal DW2_LocList dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val); -// compile unit +//////////////////////////////// +//~ rjf: Unwind Info Parsing (.debug_frame) -internal DW_CompUnit dw_cu_from_info_off(Arena *arena, DW_Raw *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed); -internal DW_TagTree dw_tag_tree_from_cu(Arena *arena, DW_Raw *input, DW_CompUnit *cu); -internal HashTable * dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree); -internal DW_TagNode * dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off); - -// line VM - -internal U64 dw_read_line_vm_header(Arena *arena, DW_Raw *input, String8 cu_stmt_list, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out); -internal DW_LineVM * dw_line_vm_init(DW_Raw *input, DW_CompUnit *cu); -internal void dw_line_vm_release(DW_LineVM *vm); -internal void dw_line_vm_advance(DW_LineVM *vm, U64 advance); -internal B32 dw_line_vm_step(DW_LineVM *vm); -internal DW_LineFile * dw_line_vm_find_file(DW_LineVM *vm, U64 file_idx); -internal String8 dw_path_from_file(Arena *arena, String8Array dir_table, DW_LineFile *file); - -// helper for .debug_pubtypes and .debug_pubnames - -internal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Raw *input, DW_SectionKind section_kind); - -// expression - -internal DW_Expr dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data); - -// debug frame - -internal void dw_cfa_inst_list_push_node(DW_CFA_InstList *list, DW_CFA_InstNode *n); -internal DW_CFA_InstNode * dw_cfa_inst_list_push(Arena *arena, DW_CFA_InstList *list, DW_CFA_Inst v); - -internal U64 dw_read_debug_frame_ptr(String8 data, DW_CIE *cie, U64 *ptr_out); - -internal U64 dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out); -internal B32 dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out); -internal B32 dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out); -internal B32 dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out); - -internal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud, U64 *bytes_read_out, DW_CFA_Inst *inst_out); -internal DW_CFA_InstList dw_parse_cfa_inst_list(Arena *arena, String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud); +internal U64 dw2_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi_header_out); +internal U64 dw2_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie_out); +internal U64 dw2_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie, DW_FDE *fde_out); +internal B32 dw2_try_cfi_from_data(String8 data, U64 off, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out); #endif // DWARF_PARSE_H diff --git a/src/dwarf/dwarf_parse_2.c b/src/dwarf/dwarf_parse_2.c deleted file mode 100644 index 2bba4b22..00000000 --- a/src/dwarf/dwarf_parse_2.c +++ /dev/null @@ -1,1916 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Basic Parsing Helpers - -internal U64 -dw2_read_initial_length(String8 data, U64 off, U64 *out, DW_Format *fmt_out) -{ - DW_Format format = DW_Format_32Bit; - U64 size = 0; - U64 size_size = 0; - { - U32 size_or_header = 0; - size_size += str8_deserial_read_struct(data, off, &size_or_header); - if(size_or_header == max_U32) - { - size_size += str8_deserial_read_struct(data, off + size_size, &size); - format = DW_Format_64Bit; - } - else - { - size = (U64)size_or_header; - } - } - if(out) - { - out[0] = size; - } - if(fmt_out) - { - fmt_out[0] = format; - } - return size_size; -} - -internal U64 -dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out) -{ - U64 start_off = off; - switch(format) - { - default: - case DW_Format_32Bit: - { - U32 out_32 = 0; - off += str8_deserial_read_struct(data, off, &out_32); - out[0] = (U64)out_32; - }break; - case DW_Format_64Bit: - { - off += str8_deserial_read_struct(data, off, out); - }break; - } - U64 bytes_read = (off - start_off); - return bytes_read; -} - -internal DW_SectionKind -dw_section_kind_from_string(String8 string) -{ - DW_SectionKind s = DW_SectionKind_Null; - if(0){} -#define X(name, regular_string, macho_string, dwo_string) else if(str8_match(string, s(regular_string), 0) || str8_match(string, s(macho_string), 0) || str8_match(string, s(dwo_string), 0)) { s = DW_SectionKind_##name; } - DW_SectionKind_XList -#undef X - return s; -} - -//////////////////////////////// -//~ rjf: Unit Range Set Parsing (Top-Level .debug_info, .debug_aranges) - -internal Rng1U64Array -dw2_unit_ranges_from_data(Arena *arena, String8 data) -{ - Temp scratch = scratch_begin(&arena, 1); - Rng1U64List unit_range_list = {0}; - for(U64 off = 0; off < data.size;) - { - U64 start_off = off; - - // rjf: read next unit size - U64 unit_size = 0; - U64 unit_size_size = dw2_read_initial_length(data, off, &unit_size, 0); - - // rjf: push - if(unit_size > 0) - { - rng1u64_list_push(scratch.arena, &unit_range_list, r1u64(off, off + unit_size_size + unit_size)); - } - - // rjf: advance - off += unit_size_size; - off += unit_size; - - // rjf: break if no movement - if(off == start_off) - { - break; - } - } - Rng1U64Array result = rng1u64_array_from_list(arena, &unit_range_list); - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Unit Header Parsing - -internal U64 -dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out) -{ - U64 start_off = off; - - // rjf: read unit's .debug_info range size / format - U64 unit_info_size = 0; - DW_Format format = DW_Format_32Bit; - off += dw2_read_initial_length(data, off, &unit_info_size, &format); - - // rjf: read dwarf version - DW_Version version = 0; - off += str8_deserial_read_struct(data, off, &version); - - // rjf: read header properties - U64 abbrev_off = max_U64; - U64 addr_size = 0; - DW_CompUnitKind kind = DW_CompUnitKind_Reserved; - U64 dwo_id = 0; - switch((DW_VersionEnum)version) - { - case DW_Version_Null: - case DW_Version_1: - {}break; - - // rjf: @dwarf2 - case DW_Version_2: - { - // rjf: read abbrev off - U32 abbrev_off_32 = 0; - off += str8_deserial_read_struct(data, off, &abbrev_off_32); - abbrev_off = (U64)abbrev_off_32; - - // rjf: read address size - U8 addr_size_8 = 0; - off += str8_deserial_read_struct(data, off, &addr_size_8); - addr_size = (U64)addr_size_8; - }break; - - // rjf: @dwarf3 @dwarf4 - case DW_Version_3: - case DW_Version_4: - { - // rjf: read abbrev off - off += dw2_read_fmt_u64(data, off, format, &abbrev_off); - - // rjf: read address size - U8 addr_size_8 = 0; - off += str8_deserial_read_struct(data, off, &addr_size_8); - addr_size = (U64)addr_size_8; - }break; - - // rjf: @dwarf5 - case DW_Version_5: - { - // rjf: read unit kind - U8 comp_unit_kind_8 = 0; - off += str8_deserial_read_struct(data, off, &comp_unit_kind_8); - kind = (DW_CompUnitKind)comp_unit_kind_8; - - // rjf: read address size - U8 addr_size_8 = 0; - off += str8_deserial_read_struct(data, off, &addr_size_8); - addr_size = (U64)addr_size_8; - - // rjf: read abbrev off - off += dw2_read_fmt_u64(data, off, format, &abbrev_off); - - // rjf: read DWO ID, if applicable - if(kind == DW_CompUnitKind_Skeleton || - kind == DW_CompUnitKind_SplitCompile || - kind == DW_CompUnitKind_SplitType) - { - off += str8_deserial_read_struct(data, off, &dwo_id); - } - }break; - } - - // rjf: fill - out->version = version; - out->format = format; - out->abbrev_off = abbrev_off; - out->addr_size = addr_size; - out->kind = kind; - out->dwo_id = dwo_id; - - // rjf: return # of bytes read - U64 bytes_read = (off - start_off); - return bytes_read; -} - -//////////////////////////////// -//~ rjf: Abbreviation Map Parsing - -internal U64 -dw2_read_abbrev(Arena *arena, String8 data, U64 off, DW2_AbbrevHeader *header_out, DW2_AbbrevAttribList *attribs_out) -{ - U64 start_off = off; - - // rjf: read tag abbrev - U64 id = 0; - U64 tag_kind = 0; - U8 has_children = 0; - { - off += str8_deserial_read_uleb128(data, off, &id); - if(id != 0) - { - off += str8_deserial_read_uleb128(data, off, &tag_kind); - off += str8_deserial_read_struct(data, off, &has_children); - } - } - - // rjf: read all tag attribute abbreviations - DW2_AbbrevAttribList attribs = {0}; - if(id != 0) - { - for(;;) - { - U64 attrib_start_off = off; - U64 attrib_kind = 0; - U64 attrib_form_kind = 0; - U64 implicit_const = 0; - off += str8_deserial_read_uleb128(data, off, &attrib_kind); - off += str8_deserial_read_uleb128(data, off, &attrib_form_kind); - if(attrib_form_kind == DW_FormKind_ImplicitConst) - { - off += str8_deserial_read_uleb128(data, off, &implicit_const); - } - if(attrib_kind != 0 && attribs_out != 0) - { - DW2_AbbrevAttribNode *n = push_array(arena, DW2_AbbrevAttribNode, 1); - SLLQueuePush(attribs.first, attribs.last, n); - attribs.count += 1; - n->v.attrib_kind = attrib_kind; - n->v.form_kind = attrib_form_kind; - n->v.implicit_const = implicit_const; - } - if(off == attrib_start_off || attrib_kind == 0) - { - break; - } - } - } - - // rjf: fill - if(header_out != 0) - { - header_out->id = id; - header_out->tag_kind = tag_kind; - header_out->has_children = has_children; - } - if(attribs_out != 0) - { - MemoryCopyStruct(attribs_out, &attribs); - } - - U64 bytes_read = (off-start_off); - return bytes_read; -} - -internal DW2_AbbrevMap -dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off) -{ - DW2_AbbrevMap map = {0}; - - // rjf: loop - first to determine the number of tag formats encoded - // by this abbrev table, second to actually build a hash table for - // mapping (id -> .debug_abbrev offset) - for(B32 build = 0; build <= 1; build += 1) - { - // rjf: parse whole abbrev table - U64 tag_count = 0; - for(U64 read_off = off;;) - { - U64 start_off = read_off; - - // rjf: read next abbrev - DW2_AbbrevHeader header = {0}; - read_off += dw2_read_abbrev(arena, data, read_off, &header, 0); - - // rjf: count tag - if(header.id != 0) - { - tag_count += 1; - } - - // rjf: if building (second loop) -> insert into map - if(build) - { - U64 hash = u64_hash_from_str8(str8_struct(&header.id)); - U64 slot_idx = hash%map.slots_count; - DW2_AbbrevMapNode *n = push_array(arena, DW2_AbbrevMapNode, 1); - SLLStackPush(map.slots[slot_idx], n); - n->id = header.id; - n->off = start_off; - } - - // rjf: no tag ID, or no movement? -> exit - if(read_off == start_off || header.id == 0) - { - break; - } - } - - // rjf: on first loop iteration, given the tag format count, construct the table - if(!build) - { - map.slots_count = Max(1, tag_count + tag_count/4); - map.slots = push_array(arena, DW2_AbbrevMapNode *, map.slots_count); - } - } - - return map; -} - -internal DW2_UnitAbbrevMapMap -dw2_unit_abbrev_map_map_from_data(Arena *arena, String8 data, DW2_UnitHeader *unit_headers, U64 unit_headers_count) -{ - DW2_UnitAbbrevMapMap result = {0}; - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: gather deduplicated .debug_abbrev offsets, representing beginnings - // of abbreviation tables. we want to do this because many units may refer - // to the same abbreviation table. - // - typedef struct AbbrevOffNode AbbrevOffNode; - struct AbbrevOffNode - { - AbbrevOffNode *order_next; - AbbrevOffNode *hash_next; - U64 off; - U64 idx; - }; - U64 abbrev_off_slots_count = unit_headers_count; - AbbrevOffNode **abbrev_off_slots = 0; - U64 abbrev_map_count = 0; - U64 *abbrev_map_off_from_idx_table = 0; - DW2_AbbrevMap *abbrev_map_from_idx_table = 0; - DW2_AbbrevMap **abbrev_map_from_unit_idx_table = 0; - ProfScope("gather deduplicated .debug_abbrev offsets") if(lane_idx() == 0) - { - AbbrevOffNode *abbrev_off_first = 0; - AbbrevOffNode *abbrev_off_last = 0; - abbrev_off_slots = push_array(scratch.arena, AbbrevOffNode *, abbrev_off_slots_count); - for EachIndex(unit_idx, unit_headers_count) - { - U64 abbrev_off = unit_headers[unit_idx].abbrev_off; - U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); - U64 slot_idx = hash%abbrev_off_slots_count; - AbbrevOffNode *node = 0; - for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->off == abbrev_off) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(arena, AbbrevOffNode, 1); - SLLStackPush_N(abbrev_off_slots[slot_idx], node, hash_next); - SLLQueuePush_N(abbrev_off_first, abbrev_off_last, node, order_next); - node->off = abbrev_off; - node->idx = abbrev_map_count; - abbrev_map_count += 1; - } - } - abbrev_map_off_from_idx_table = push_array(scratch.arena, U64, abbrev_map_count); - abbrev_map_from_idx_table = push_array(arena, DW2_AbbrevMap, abbrev_map_count); - abbrev_map_from_unit_idx_table = push_array(arena, DW2_AbbrevMap *, unit_headers_count); - { - U64 abbrev_map_idx = 0; - for(AbbrevOffNode *n = abbrev_off_first; n != 0; n = n->order_next) - { - abbrev_map_off_from_idx_table[abbrev_map_idx] = n->off; - abbrev_map_idx += 1; - } - } - } - lane_sync_u64(&abbrev_off_slots, 0); - lane_sync_u64(&abbrev_map_count, 0); - lane_sync_u64(&abbrev_map_off_from_idx_table, 0); - lane_sync_u64(&abbrev_map_from_idx_table, 0); - lane_sync_u64(&abbrev_map_from_unit_idx_table, 0); - - //- rjf: build all unique abbreviation maps - ProfScope("build all unique abbreviation maps") - { - U64 abbrev_map_take_idx = 0; - U64 *abbrev_map_take_idx_ptr = &abbrev_map_take_idx; - lane_sync_u64(&abbrev_map_take_idx_ptr, 0); - for(;;) - { - U64 abbrev_map_idx = ins_atomic_u64_inc_eval(abbrev_map_take_idx_ptr) - 1; - if(abbrev_map_idx >= abbrev_map_count) - { - break; - } - abbrev_map_from_idx_table[abbrev_map_idx] = dw2_abbrev_map_from_data(arena, data, abbrev_map_off_from_idx_table[abbrev_map_idx]); - } - lane_sync(); - } - - //- rjf: build unit -> abbrev map table - ProfScope("build unit -> abbrev map table") - { - Rng1U64 range = lane_range(unit_headers_count); - for EachInRange(unit_idx, range) - { - U64 abbrev_off = unit_headers[unit_idx].abbrev_off; - U64 hash = u64_hash_from_str8(str8_struct(&abbrev_off)); - U64 slot_idx = hash%abbrev_off_slots_count; - U64 abbrev_map_idx = 0; - for(AbbrevOffNode *n = abbrev_off_slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->off == abbrev_off) - { - abbrev_map_idx = n->idx; - break; - } - } - abbrev_map_from_unit_idx_table[unit_idx] = &abbrev_map_from_idx_table[abbrev_map_idx]; - } - lane_sync(); - } - - //- rjf: fill result - result.map_count = abbrev_map_count; - result.map_from_idx_table = abbrev_map_from_idx_table; - result.map_from_unit_idx_table = abbrev_map_from_unit_idx_table; - - scratch_end(scratch); - return result; -} - -//////////////////////////////// -//~ rjf: Form Value Parsing - -internal U64 -dw2_read_form_val(DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out) -{ - U64 start_off = off; - DW2_FormVal val = {form_kind}; - { - //- rjf: read value bytes - U64 bytes_to_read = 0; - switch(form_kind) - { - //- rjf: no-ops - default: - case DW_FormKind_Indirect: - case DW_FormKind_Null: - {}break; - - //- rjf: 1-byte uint reads - case DW_FormKind_Ref1: - case DW_FormKind_Data1: - case DW_FormKind_Flag: - case DW_FormKind_Strx1: - case DW_FormKind_Addrx1: - bytes_to_read = 1; goto read_fixed_uint; - - //- rjf: 2-byte uint reads - case DW_FormKind_Ref2: - case DW_FormKind_Data2: - case DW_FormKind_Strx2: - case DW_FormKind_Addrx2: - bytes_to_read = 2; goto read_fixed_uint; - - //- rjf: 3-byte uint reads - case DW_FormKind_Strx3: - case DW_FormKind_Addrx3: - bytes_to_read = 3; goto read_fixed_uint; - - //- rjf: 4-byte uint reads - case DW_FormKind_Data4: - case DW_FormKind_Ref4: - case DW_FormKind_RefSup4: - case DW_FormKind_Strx4: - case DW_FormKind_Addrx4: - bytes_to_read = 4; goto read_fixed_uint; - - //- rjf: 8-byte uint reads - case DW_FormKind_Data8: - case DW_FormKind_Ref8: - case DW_FormKind_RefSig8: - case DW_FormKind_RefSup8: - bytes_to_read = 8; goto read_fixed_uint; - - //- rjf: 16-byte uint reads - case DW_FormKind_Data16: - bytes_to_read = 16; goto read_fixed_uint; - - //- rjf: address-sized reads - case DW_FormKind_Addr: - bytes_to_read = ctx->addr_size; goto read_fixed_uint; - - //- rjf: format-defined-size reads - case DW_FormKind_RefAddr: - case DW_FormKind_SecOffset: - case DW_FormKind_LineStrp: - case DW_FormKind_Strp: - case DW_FormKind_StrpSup: - bytes_to_read = dw_addr_size_from_format(ctx->format); goto read_fixed_uint; - - //- rjf: fixed-size uint reads - read_fixed_uint: - { - off += str8_deserial_read(data, off, &val.u128.u64[0], bytes_to_read, bytes_to_read); - }break; - - //- rjf: uleb128 reads - case DW_FormKind_UData: - case DW_FormKind_RefUData: - case DW_FormKind_Strx: - case DW_FormKind_Addrx: - case DW_FormKind_LocListx: - case DW_FormKind_RngListx: - { - off += str8_deserial_read_uleb128(data, off, &val.u128.u64[0]); - }break; - - //- rjf: sleb128 reads - case DW_FormKind_SData: - { - off += str8_deserial_read_sleb128(data, off, (S64 *)(&val.u128.u64[0])); - }break; - - //- rjf: fixed-size uint reads / skips - case DW_FormKind_Block1: bytes_to_read = 1; goto read_fixed_uint_and_skip; - case DW_FormKind_Block2: bytes_to_read = 2; goto read_fixed_uint_and_skip; - case DW_FormKind_Block4: bytes_to_read = 4; goto read_fixed_uint_and_skip; - read_fixed_uint_and_skip: - { - U64 size = 0; - U64 og_read_off = off; - off += str8_deserial_read(data, off, &size, bytes_to_read, bytes_to_read); - val.u128.u64[0] = size; - val.u128.u64[1] = og_read_off; - off += size; - }break; - - //- rjf: uleb128 read & skip - case DW_FormKind_Block: - { - U64 size = 0; - U64 og_read_off = off; - off += str8_deserial_read_uleb128(data, off, &size); - val.string = str8_substr(data, r1u64(off, off+size)); - off += size; - }break; - - //- rjf: strings - case DW_FormKind_String: - { - String8 string = {0}; - U64 og_read_off = off; - off += str8_deserial_read_cstr(data, off, &string); - val.string = string; - }break; - - //- rjf: implicit constants (no reading in .debug_info; value comes from .debug_abbrev) - case DW_FormKind_ImplicitConst: - { - val.u128.u64[0] = implicit_const; - }break; - - //- rjf: exprloc - case DW_FormKind_ExprLoc: - { - U64 size = 0; - U64 og_read_off = off; - U64 bytes_read = str8_deserial_read_uleb128(data, off, &size); - val.u128.u64[0] = og_read_off + bytes_read; - val.u128.u64[1] = size; - val.string = str8_substr(data, r1u64(og_read_off, og_read_off+size)); - off += size + bytes_read; - }break; - - //- rjf: flag present - case DW_FormKind_FlagPresent: - { - val.u128.u64[0] = 1; - }break; - } - - //- rjf: in some cases, resolve numeric values -> strings - { - switch(form_kind) - { - default:{}break; - case DW_FormKind_Strx1: - case DW_FormKind_Strx2: - case DW_FormKind_Strx3: - case DW_FormKind_Strx4: - case DW_FormKind_Strx: - if(ctx->str_offsets_table != 0) - { - U64 entry_idx = val.u128.u64[0]; - U64 string_data_off = 0; - if(dw2_try_offset_from_table_idx(ctx->str_offsets_table, entry_idx, &string_data_off)) - { - String8 string_section_data = raw->sec[DW_SectionKind_Str].data; - val.string = str8_cstring_capped(string_section_data.str + string_data_off, - string_section_data.str + string_section_data.size); - } - }break; - case DW_FormKind_LineStrp: - { - String8 string_section_data = raw->sec[DW_SectionKind_LineStr].data; - val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0], - string_section_data.str + string_section_data.size); - }break; - case DW_FormKind_Strp: - case DW_FormKind_StrpSup: - { - String8 string_section_data = raw->sec[DW_SectionKind_Str].data; - val.string = str8_cstring_capped(string_section_data.str + val.u128.u64[0], - string_section_data.str + string_section_data.size); - }break; - } - } - - //- rjf: in some cases, resolve base numeric values -> addresses - { - switch(form_kind) - { - default:{val.addr = val.u128.u64[0];}break; - case DW_FormKind_Addrx: - case DW_FormKind_Addrx1: - case DW_FormKind_Addrx2: - case DW_FormKind_Addrx3: - case DW_FormKind_Addrx4: - if(ctx->addr_table != 0) - { - U64 addr_idx = val.u128.u64[0]; - dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &val.addr); - }break; - } - } - } - *out = val; - U64 bytes_read = (off - start_off); - return bytes_read; -} - -//////////////////////////////// -//~ rjf: Parse Context Construction - -internal void -dw2_parse_ctx_equip_unit_header(DW2_ParseCtx *ctx_out, DW2_UnitHeader *hdr, U64 unit_base_info_off) -{ - ctx_out->version = hdr->version; - ctx_out->format = hdr->format; - ctx_out->addr_size = hdr->addr_size; - ctx_out->unit_base_info_off = unit_base_info_off; -} - -internal void -dw2_parse_ctx_equip_unit_abbrev_map(DW2_ParseCtx *ctx_out, DW2_UnitAbbrevMapMap *map, U64 unit_idx) -{ - ctx_out->abbrev_map = map->map_from_unit_idx_table[unit_idx]; -} - -internal void -dw2_parse_ctx_equip_unit_root_tag(DW2_ParseCtx *ctx_out, DW2_Tag *tag, DW2_OffsetTableSet *offset_tables) -{ - // rjf: unpack attributes - DW2_Attrib *low_pc_attrib = &dw2_attrib_nil; - DW2_Attrib *lang_attrib = &dw2_attrib_nil; - DW2_Attrib *rnglists_base_off_attrib = &dw2_attrib_nil; - DW2_Attrib *str_offsets_base_off_attrib = &dw2_attrib_nil; - DW2_Attrib *addr_base_off_attrib = &dw2_attrib_nil; - DW2_Attrib *loclist_base_off_attrib = &dw2_attrib_nil; - DW2_Attrib *comp_dir_attrib = &dw2_attrib_nil; - for EachNode(n, DW2_AttribNode, tag->attribs.first) - { - switch(n->v.attrib_kind) - { - default:{}break; -#define Case(name, name_upper) case DW_AttribKind_##name_upper:{name##_attrib = &n->v;}break - Case(low_pc, LowPc); - Case(lang, Language); - Case(rnglists_base_off, RngListsBase); - Case(str_offsets_base_off, StrOffsetsBase); - Case(addr_base_off, AddrBase); - Case(loclist_base_off, LocListsBase); - Case(comp_dir, CompDir); -#undef Case - } - } - - // rjf: fill basics - ctx_out->unit_base_addr = low_pc_attrib->val.addr; - ctx_out->language = lang_attrib->val.u128.u64[0]; - ctx_out->unit_dir = comp_dir_attrib->val.string; - - // rjf: find offset tables - Rng1U64Array rnglists_tables_ranges_array = {offset_tables->rnglists_tables_ranges, offset_tables->rnglists_tables_count}; - Rng1U64Array str_offsets_tables_ranges_array = {offset_tables->str_offsets_tables_ranges, offset_tables->str_offsets_tables_count}; - Rng1U64Array addr_tables_ranges_array = {offset_tables->addr_tables_ranges, offset_tables->addr_tables_count}; - Rng1U64Array loclist_tables_ranges_array = {offset_tables->loclists_tables_ranges, offset_tables->loclists_tables_count}; - { - // rjf: find rnglists table - { - U64 rnglists_base_off = rnglists_base_off_attrib->val.u128.u64[0]; - U64 rnglists_table_num = rng1u64_array_num_from_value__binary_search(&rnglists_tables_ranges_array, rnglists_base_off); - if(0 < rnglists_table_num && rnglists_table_num <= rnglists_tables_ranges_array.count) - { - DW2_OffsetTable *table = &offset_tables->rnglists_tables[rnglists_table_num-1]; - ctx_out->rnglists_table = table; - } - } - - // rjf: find str offsets table - { - U64 str_offsets_base_off = str_offsets_base_off_attrib->val.u128.u64[0]; - U64 str_offsets_table_num = rng1u64_array_num_from_value__binary_search(&str_offsets_tables_ranges_array, str_offsets_base_off); - if(0 < str_offsets_table_num && str_offsets_table_num <= str_offsets_tables_ranges_array.count) - { - DW2_OffsetTable *table = &offset_tables->str_offsets_tables[str_offsets_table_num-1]; - ctx_out->str_offsets_table = table; - } - } - - // rjf: find addr table - { - U64 addr_base_off = addr_base_off_attrib->val.u128.u64[0]; - U64 addr_table_num = rng1u64_array_num_from_value__binary_search(&addr_tables_ranges_array, addr_base_off); - if(0 < addr_table_num && addr_table_num <= addr_tables_ranges_array.count) - { - DW2_OffsetTable *table = &offset_tables->addr_tables[addr_table_num-1]; - ctx_out->addr_table = table; - } - } - - // rjf: find loclists table - { - U64 loclist_base_off = loclist_base_off_attrib->val.u128.u64[0]; - U64 loclist_table_num = rng1u64_array_num_from_value__binary_search(&loclist_tables_ranges_array, loclist_base_off); - if(0 < loclist_table_num && loclist_table_num <= loclist_tables_ranges_array.count) - { - DW2_OffsetTable *table = &offset_tables->loclists_tables[loclist_table_num-1]; - ctx_out->loclists_table = table; - } - } - } -} - -//////////////////////////////// -//~ rjf: Tag Parsing - -internal U64 -dw2_read_tag(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out) -{ - U64 start_off = off; - - // rjf: read tag's abbrev ID - U64 abbrev_id = 0; - off += str8_deserial_read_uleb128(data, off, &abbrev_id); - - // rjf: map abbrev ID -> abbrev offset - U64 abbrev_off = 0; - { - DW2_AbbrevMap *abbrev_map = ctx->abbrev_map; - U64 hash = u64_hash_from_str8(str8_struct(&abbrev_id)); - U64 slot_idx = hash%abbrev_map->slots_count; - for EachNode(n, DW2_AbbrevMapNode, abbrev_map->slots[slot_idx]) - { - if(n->id == abbrev_id) - { - abbrev_off = n->off; - break; - } - } - } - - // rjf: read abbrev header - U64 tag_kind = 0; - U8 has_children = 0; - U64 attrib_abbrev_read_off = 0; - { - String8 abbrev_data = raw->sec[DW_SectionKind_Abbrev].data; - U64 abbrev_read_off = abbrev_off; - U64 id = 0; - abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &id); - if(id != 0) - { - abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &tag_kind); - abbrev_read_off += str8_deserial_read_struct(abbrev_data, abbrev_read_off, &has_children); - } - attrib_abbrev_read_off = abbrev_read_off; - } - - // rjf: walk abbrev / info in lock-step; read all tag attributes - DW2_AttribList attribs = {0}; - if(abbrev_id != 0) - { - String8 abbrev_data = raw->sec[DW_SectionKind_Abbrev].data; - U64 abbrev_read_off = attrib_abbrev_read_off; - for(;;) - { - U64 abbrev_start_read_off = abbrev_read_off; - - // rjf: read next attribute abbreviation from .debug_abbrev - U64 attrib_kind = 0; - U64 attrib_form_kind = 0; - U64 implicit_const = 0; - abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &attrib_kind); - abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &attrib_form_kind); - if(attrib_form_kind == DW_FormKind_ImplicitConst) - { - abbrev_read_off += str8_deserial_read_uleb128(abbrev_data, abbrev_read_off, &implicit_const); - } - - // rjf: indirect form -> form kind is encoded in .debug_info (because why not) - if(attrib_form_kind == DW_FormKind_Indirect) - { - off += str8_deserial_read_uleb128(data, off, &attrib_form_kind); - } - - // rjf: read attribute's value from .debug_info - DW2_FormVal val = {0}; - if(attrib_kind != 0) - { - off += dw2_read_form_val(raw, ctx, data, off, attrib_form_kind, implicit_const, &val); - } - - // rjf: push - if(attrib_kind != 0) - { - DW2_AttribNode *n = push_array(arena, DW2_AttribNode, 1); - SLLQueuePush(attribs.first, attribs.last, n); - attribs.count += 1; - n->v.attrib_kind = attrib_kind; - n->v.val = val; - } - - // rjf: no movement, or no attrib kind -> done - if(abbrev_read_off == abbrev_start_read_off || attrib_kind == 0) - { - break; - } - } - } - - // rjf: fill output - tag_out->kind = (DW_TagKind)tag_kind; - tag_out->has_children = !!has_children; - tag_out->attribs = attribs; - - // rjf: return # of bytes read - U64 bytes_read = (off - start_off); - return bytes_read; -} - -internal DW2_Attrib * -dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind) -{ - DW2_Attrib *result = &dw2_attrib_nil; - for EachNode(n, DW2_AttribNode, tag->attribs.first) - { - if(n->v.attrib_kind == kind) - { - result = &n->v; - break; - } - } - return result; -} - -internal U64 -dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v) -{ - U64 result = 0; - switch(v->kind) - { - default:{}break; - case DW_FormKind_Ref1: - case DW_FormKind_Ref2: - case DW_FormKind_Ref4: - case DW_FormKind_Ref8: - { - result = ctx->unit_base_info_off + v->u128.u64[0]; - }break; - // TODO(rjf): DW_FormKind_RefAddr, DW_FormKind_RefUData, DW_FormKind_RefSig8, DW_FormKind_RefSup8, etc. - } - return result; -} - -//////////////////////////////// -//~ rjf: Line Table Parsing - -internal U64 -dw2_read_line_table_header(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out) -{ - Temp scratch = scratch_begin(&arena, 1); - U64 start_off = off; - - ////////////////////////////// - //- rjf: read unit length - // - U64 unit_length = 0; - DW_Format format = DW_Format_32Bit; - off += dw2_read_initial_length(data, off, &unit_length, &format); - U64 off_opl = off + unit_length; - - ////////////////////////////// - //- rjf: read version - // - DW_Version version = DW_Version_Null; - off += str8_deserial_read_struct(data, off, &version); - - ////////////////////////////// - //- rjf: read address / segment selector sizes - // - U8 addr_size = 0; - U8 segment_selector_size = 0; - switch(version) - { - // NOTE(rjf): pre-dwarf5: assume from context - default: - { - addr_size = ctx->addr_size; - }break; - - // NOTE(rjf): @dwarf5 read address / segment selector sizes explicitly - case DW_Version_5: - { - off += str8_deserial_read_struct(data, off, &addr_size); - off += str8_deserial_read_struct(data, off, &segment_selector_size); - }break; - } - - ////////////////////////////// - //- rjf: read all remaining flat header properties - // - U64 opl_header_length_off = 0; - U64 header_length = 0; - U8 min_inst_length = 0; - U8 max_ops_per_inst = 1; - U8 default_is_stmt = 0; - S8 line_base = 0; - U8 line_range = 0; - U8 opcode_base = 0; - { - off += dw2_read_fmt_u64(data, off, format, &header_length); - opl_header_length_off = off; - off += str8_deserial_read_struct(data, off, &min_inst_length); - off += str8_deserial_read_struct(data, off, &max_ops_per_inst); - off += str8_deserial_read_struct(data, off, &default_is_stmt); - off += str8_deserial_read_struct(data, off, &line_base); - off += str8_deserial_read_struct(data, off, &line_range); - off += str8_deserial_read_struct(data, off, &opcode_base); - } - - ////////////////////////////// - //- rjf: read opcode lengths - // - U64 opcode_lengths_count = (opcode_base > 0 ? opcode_base - 1 : 0); - U8 *opcode_lengths = 0; - if(opcode_lengths_count > 0) - { - opcode_lengths = str8_skip(data, off).str; - off += sizeof(opcode_lengths[0]) * opcode_lengths_count; - } - - ////////////////////////////// - //- rjf: read directory / file tables - // - DW2_LineTableFileArray dirs = {0}; - DW2_LineTableFileArray files = {0}; - switch(version) - { - //////////////////////////// - //- rjf: pre-dwarf5: simple(r) well-defined format... still ulebs everywhere but oh well... - // just wait until the next case... - // - default: - { - //- rjf: gather directories - DW2_LineTableFileList dir_list = {0}; - { - // rjf: push compile directory as first list element, always - { - DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); - SLLQueuePush(dir_list.first, dir_list.last, n); - dir_list.count += 1; - n->v.file_name = ctx->unit_dir; - } - - // rjf: gather additional directories - for(;off < off_opl;) - { - String8 dir = {0}; - off += str8_deserial_read_cstr(data, off, &dir); - if(dir.size != 0) - { - DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); - SLLQueuePush(dir_list.first, dir_list.last, n); - dir_list.count += 1; - n->v.file_name = dir; - } - else - { - break; - } - } - } - - //- rjf: gather files - DW2_LineTableFileList file_list = {0}; - { - // rjf: push main compilation unit file as first list element, always - { - DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); - SLLQueuePush(file_list.first, file_list.last, n); - file_list.count += 1; - n->v.file_name = ctx->unit_file; - } - - // rjf: gather additional files - for(;off < off_opl;) - { - U8 next_byte = 0; - str8_deserial_read_struct(data, off, &next_byte); - if(next_byte == 0) - { - break; - } - String8 file_name = {0}; - U64 dir_idx = 0; - U64 modify_time = 0; - U64 file_size = 0; - off += str8_deserial_read_cstr(data, off, &file_name); - off += str8_deserial_read_uleb128(data, off, &dir_idx); - off += str8_deserial_read_uleb128(data, off, &modify_time); - off += str8_deserial_read_uleb128(data, off, &file_size); - if(file_name.size != 0) - { - DW2_LineTableFileNode *n = push_array(scratch.arena, DW2_LineTableFileNode, 1); - SLLQueuePush(file_list.first, file_list.last, n); - file_list.count += 1; - n->v.file_name = file_name; - n->v.dir_idx = dir_idx; - n->v.modify_time = modify_time; - n->v.file_size = file_size; - } - } - } - - //- rjf: flatten - { - dirs.count = dir_list.count; - dirs.v = push_array(arena, DW2_LineTableFile, dirs.count); - files.count = file_list.count; - files.v = push_array(arena, DW2_LineTableFile, files.count); - { - U64 idx = 0; - for EachNode(n, DW2_LineTableFileNode, dir_list.first) - { - MemoryCopyStruct(&dirs.v[idx], &n->v); - idx += 1; - } - } - { - U64 idx = 0; - for EachNode(n, DW2_LineTableFileNode, file_list.first) - { - MemoryCopyStruct(&files.v[idx], &n->v); - idx += 1; - } - } - } - }break; - - //////////////////////////// - //- rjf: @dwarf5: another VM! d'oh. :( - // - case DW_Version_5: - { - //- rjf: read directory & file tables - for(B32 do_files = 0, do_dirs = 1; do_files <= 1; do_files += 1, do_dirs = 0) - { - // rjf: read header - U8 entry_formats_count = 0; - off += str8_deserial_read_struct(data, off, &entry_formats_count); - U64 *entry_formats = push_array(scratch.arena, U64, entry_formats_count*2); - for EachIndex(idx, entry_formats_count) - { - off += str8_deserial_read_uleb128(data, off, &entry_formats[idx*2 + 0]); - off += str8_deserial_read_uleb128(data, off, &entry_formats[idx*2 + 1]); - } - U64 table_count = 0; - off += str8_deserial_read_uleb128(data, off, &table_count); - - // rjf: read all table entries - DW2_LineTableFileArray table = {0}; - table.count = table_count; - table.v = push_array(arena, DW2_LineTableFile, table.count); - { - U64 idx = 0; - for(;off < off_opl && idx < table.count; idx += 1) - { - DW2_LineTableFile *entry_out = &table.v[idx]; - for(U64 entry_format_idx = 0; entry_format_idx < entry_formats_count; entry_format_idx += 1) - { - DW_LNCT lnct = (DW_LNCT)entry_formats[entry_format_idx*2 + 0]; - DW_FormKind form_kind = (DW_FormKind)entry_formats[entry_format_idx*2 + 1]; - DW2_FormVal form_val = {0}; - off += dw2_read_form_val(raw, ctx, data, off, form_kind, 0, &form_val); - switch(lnct) - { - default: - { - log_infof("DWARF LNCT encoding not currently supported (0x%I64x).\n", (U64)lnct); - }break; - case DW_LNCT_Path: - { - entry_out->file_name = form_val.string; - }break; - case DW_LNCT_DirectoryIndex: - { - entry_out->dir_idx = form_val.u128.u64[0]; - }break; - case DW_LNCT_TimeStamp: - { - entry_out->modify_time = form_val.u128.u64[0]; - entry_out->flags |= DW2_LineTableFileFlag_HasModifyTime; - }break; - case DW_LNCT_Size: - { - entry_out->file_size = form_val.u128.u64[0]; - }break; - case DW_LNCT_MD5: - { - entry_out->md5.u128 = form_val.u128; - entry_out->flags |= DW2_LineTableFileFlag_HasMD5; - }break; - case DW_LNCT_LLVM_Source: - { - entry_out->source = form_val.string; - }break; - } - } - } - } - - // rjf: store - if(0){} - else if(do_files) { files = table; } - else if(do_dirs) { dirs = table; } - } - - }break; - } - - ////////////////////////////// - //- rjf: fill output - // - if(out) - { - out->unit_length = unit_length; - out->format = format; - out->version = version; - out->addr_size = addr_size; - out->segment_selector_size = segment_selector_size; - out->header_length = header_length; - out->min_inst_length = min_inst_length; - out->max_ops_per_inst = max_ops_per_inst; - out->default_is_stmt = default_is_stmt; - out->line_base = line_base; - out->line_range = line_range; - out->opcode_base = opcode_base; - out->opcode_lengths_count = opcode_lengths_count; - out->opcode_lengths = opcode_lengths; - out->dirs = dirs; - out->files = files; - out->line_program_off = opl_header_length_off + header_length; - out->total_unit_data_size = (off_opl - start_off); - } - - U64 bytes_read = (off - start_off); - scratch_end(scratch); - return bytes_read; -} - -//////////////////////////////// -//~ rjf: String Offset Table Parsing (.debug_str_offsets) - -internal U64 -dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out) -{ - U64 start_off = off; - { - // rjf: read data length / format - U64 unit_data_length = 0; - DW_Format format = DW_Format_Null; - off += dw2_read_initial_length(data, off, &unit_data_length, &format); - U64 unit_data_off_opl = off + unit_data_length; - - // rjf: read version - DW_Version version = DW_Version_Null; - off += str8_deserial_read_struct(data, off, &version); - - // rjf: version 5: read rest (this section only exists in 5+) - if(version == DW_Version_5) - { - // rjf: read address / segment selector size (these need to be 0 in non-address offset tables) - U8 addr_size = 0; - U8 segment_selector_size = 0; - off += str8_deserial_read_struct(data, off, &addr_size); - off += str8_deserial_read_struct(data, off, &segment_selector_size); - - // rjf: determine entry size - U64 entry_size = dw_addr_size_from_format(format); - if(addr_size != 0) - { - entry_size = addr_size + segment_selector_size; - } - - // rjf: fill table info - out->format = format; - out->version = version; - out->addr_size = addr_size; - out->segment_selector_size = segment_selector_size; - out->entry_size = entry_size; - out->entries_count = (unit_data_off_opl - off) / out->entry_size; - out->entries = data.str + off; - - // rjf: skip table - off = unit_data_off_opl; - } - } - U64 bytes_read = (off - start_off); - return bytes_read; -} - -internal DW2_OffsetTableList -dw2_offset_table_list_from_data(Arena *arena, String8 data) -{ - DW2_OffsetTableList list = {0}; - for(U64 off = 0; off < data.size;) - { - U64 start_off = off; - DW2_OffsetTable table = {0}; - off += dw2_read_offset_table(data, off, &table); - if(table.entries != 0) - { - DW2_OffsetTableNode *n = push_array(arena, DW2_OffsetTableNode, 1); - SLLQueuePush(list.first, list.last, n); - n->v = table; - n->range = r1u64(start_off, off); - list.count += 1; - } - if(off == start_off) - { - break; - } - } - return list; -} - -internal B32 -dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out) -{ - B32 result = 0; - if(idx < tbl->entries_count) - { - U64 entry_size = tbl->entry_size; - U64 entry_off = idx * entry_size; - if(tbl->addr_size != 0) - { - U64 segment_off = entry_off; - U64 addr_off = entry_off + tbl->segment_selector_size; - U64 segment = 0; - U64 addr = 0; - MemoryCopy(&segment, (U8 *)tbl->entries + segment_off, tbl->segment_selector_size); - MemoryCopy(&addr, (U8 *)tbl->entries + addr_off, tbl->addr_size); - // TODO(rjf): @segment_based_addressing - *out = addr; - } - else - { - MemoryCopy(out, (U8 *)tbl->entries + entry_off, entry_size); - } - result = 1; - } - return result; -} - -internal DW2_OffsetTableSet -dw2_offset_table_set_from_raw(Arena *arena, DW_Raw *raw) -{ - DW2_OffsetTableSet result = {0}; - { - struct - { - String8 data; - U64 *tables_count_out; - DW2_OffsetTable **tables_out; - Rng1U64 **tables_ranges_out; - } - tasks[] = - { - {raw->sec[DW_SectionKind_StrOffsets].data, &result.str_offsets_tables_count, &result.str_offsets_tables, &result.str_offsets_tables_ranges}, - {raw->sec[DW_SectionKind_RngLists].data, &result.rnglists_tables_count, &result.rnglists_tables, &result.rnglists_tables_ranges}, - {raw->sec[DW_SectionKind_Addr].data, &result.addr_tables_count, &result.addr_tables, &result.addr_tables_ranges}, - {raw->sec[DW_SectionKind_LocLists].data, &result.loclists_tables_count, &result.loclists_tables, &result.loclists_tables_ranges}, - }; - for EachElement(task_idx, tasks) - { - Temp scratch = scratch_begin(&arena, 1); - String8 data = tasks[task_idx].data; - DW2_OffsetTableList tables = dw2_offset_table_list_from_data(scratch.arena, data); - tasks[task_idx].tables_count_out[0] = tables.count; - tasks[task_idx].tables_out[0] = push_array(arena, DW2_OffsetTable, tables.count); - tasks[task_idx].tables_ranges_out[0] = push_array(arena, Rng1U64, tables.count); - { - U64 idx = 0; - for EachNode(n, DW2_OffsetTableNode, tables.first) - { - tasks[task_idx].tables_out[0][idx] = n->v; - tasks[task_idx].tables_ranges_out[0][idx] = n->range; - idx += 1; - } - } - scratch_end(scratch); - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Range List Parsing (.debug_rnglists) - -internal Rng1U64List -dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val) -{ - Rng1U64List result = {0}; - switch((DW_VersionEnum)ctx->version) - { - case DW_Version_Null:{}break; - - //- rjf: pre-dwarf5 - case DW_Version_1: - case DW_Version_2: - case DW_Version_3: - case DW_Version_4: - { - String8 data = raw->sec[DW_SectionKind_Ranges].data; - U64 ranges_off = ranges_off = form_val.u128.u64[0];; - U64 base_addr = ctx->unit_base_addr; - U64 sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); - for(U64 off = ranges_off; off < data.size;) - { - U64 start_off = off; - U64 range_min = 0; - U64 range_opl = 0; - off += str8_deserial_read(data, off, &range_min, ctx->addr_size, ctx->addr_size); - off += str8_deserial_read(data, off, &range_opl, ctx->addr_size, ctx->addr_size); - // - // NOTE(rjf): interpreting tuples: - // [0, 0) -> ending range list - // [max_U32/U64, depending on addr size, X) -> set new base address to X - // [N, M) -> new [base + N, base + M) range - // - if(range_min == 0 && range_opl == 0) - { - break; - } - else if(range_min == sentinel) - { - base_addr = range_opl; - } - else if(off == start_off) - { - break; - } - else - { - rng1u64_list_push(arena, &result, r1u64(base_addr + range_min, base_addr + range_opl)); - } - if(off == start_off) - { - break; - } - } - }break; - - //- rjf: @dwarf5 - case DW_Version_5: - { - String8 data = raw->sec[DW_SectionKind_RngLists].data; - - // rjf: determine section offset - sometimes this is encoded directly, - // other times it is relative, based on the form kind - more variability - // in this awful format - U64 rnglist_off = 0; - switch(form_val.kind) - { - default:{}break; - case DW_FormKind_SecOffset: - { - rnglist_off = form_val.u128.u64[0]; - }break; - case DW_FormKind_RngListx: - if(ctx->rnglists_table != 0) - { - U64 rnglist_off_idx = form_val.u128.u64[0]; - dw2_try_offset_from_table_idx(ctx->rnglists_table, rnglist_off_idx, &rnglist_off); - }break; - } - - // rjf: in a HIGHLY UNEXPECTED TURN OF EVENTS, we now have to decode ANOTHER - // OPCODE STREAM to unpack the actual list of ranges!!! - U64 rle_sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); - U64 base_addr = ctx->unit_base_addr; - for(U64 off = rnglist_off; off < data.size;) - { - U64 start_off = off; - - // rjf: decode op kind - DW_RLE rle_kind = DW_RLE_EndOfList; - off += str8_deserial_read_struct(data, off, &rle_kind); - - // rjf: obtain range from op - B32 good_range = 1; - Rng1U64 range = {0}; - switch(rle_kind) - { - default:{good_range = 0;}break; - case DW_RLE_BaseAddressx: - { - good_range = 0; - U64 addr_idx = 0; - off += str8_deserial_read_uleb128(data, off, &addr_idx); - if(ctx->addr_table != 0) - { - U64 new_base_addr = 0; - if(dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &new_base_addr)) - { - good_range = 1; - base_addr = new_base_addr; - } - } - }break; - case DW_RLE_StartxEndx: - { - good_range = 0; - U64 start_idx = 0; - U64 end_idx = 0; - off += str8_deserial_read_uleb128(data, off, &start_idx); - off += str8_deserial_read_uleb128(data, off, &end_idx); - if(ctx->addr_table != 0) - { - U64 start = 0; - U64 end = 0; - if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start) && - dw2_try_offset_from_table_idx(ctx->addr_table, end_idx, &end)) - { - good_range = 1; - range = r1u64(start, end); - } - } - }break; - case DW_RLE_StartxLength: - { - good_range = 0; - U64 start_idx = 0; - U64 length = 0; - off += str8_deserial_read_uleb128(data, off, &start_idx); - off += str8_deserial_read_uleb128(data, off, &length); - if(ctx->addr_table != 0) - { - U64 start = 0; - if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start)) - { - good_range = 1; - range = r1u64(start, start+length); - } - } - }break; - case DW_RLE_OffsetPair: - { - U64 range_off_start = 0; - U64 range_off_end = 0; - off += str8_deserial_read_uleb128(data, off, &range_off_start); - off += str8_deserial_read_uleb128(data, off, &range_off_end); - range = r1u64(base_addr + range_off_start, base_addr + range_off_end); - }break; - case DW_RLE_BaseAddress: - { - U64 new_base_addr = 0; - off += str8_deserial_read(data, off, &new_base_addr, ctx->addr_size, ctx->addr_size); - base_addr = new_base_addr; - }break; - case DW_RLE_StartEnd: - { - U64 start = 0; - U64 end = 0; - off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); - off += str8_deserial_read(data, off, &end, ctx->addr_size, ctx->addr_size); - range = r1u64(start, end); - }break; - case DW_RLE_StartLength: - { - U64 start = 0; - U64 length = 0; - off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); - off += str8_deserial_read_uleb128(data, off, &length); - range = r1u64(start, start + length); - }break; - } - - // rjf: add range - if(good_range) - { - rng1u64_list_push(arena, &result, range); - } - - // rjf: end if no movement or end-of-list code - if(off == start_off || rle_kind == DW_RLE_EndOfList) - { - break; - } - } - }break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Location List Parsing (.debug_loclists) - -internal DW2_LocList -dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val) -{ - DW2_LocList result = {0}; - switch((DW_VersionEnum)ctx->version) - { - case DW_Version_Null:{}break; - - //- rjf: pre-dwarf5 - case DW_Version_1: - case DW_Version_2: - case DW_Version_3: - case DW_Version_4: - { - String8 data = raw->sec[DW_SectionKind_Loc].data; - U64 locs_off = locs_off = form_val.u128.u64[0]; - U64 base_addr = ctx->unit_base_addr; - U64 sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); - for(U64 off = locs_off; off < data.size;) - { - U64 start_off = off; - U64 range_min = 0; - U64 range_opl = 0; - off += str8_deserial_read(data, off, &range_min, ctx->addr_size, ctx->addr_size); - off += str8_deserial_read(data, off, &range_opl, ctx->addr_size, ctx->addr_size); - // - // NOTE(rjf): interpreting tuples: - // [0, 0) -> ending range list - // [max_U32/U64, depending on addr size, X) -> set new base address to X - // [N, M) -> new [base + N, base + M) range - // - if(range_min == 0 && range_opl == 0) - { - break; - } - else if(range_min == sentinel) - { - base_addr = range_opl; - } - else if(off == start_off) - { - break; - } - else - { - U16 expr_size = 0; - off += str8_deserial_read_struct(data, off, &expr_size); - DW2_LocNode *n = push_array(arena, DW2_LocNode, 1); - n->v.range = r1u64(range_min + base_addr, range_opl + base_addr); - n->v.expr = str8_substr(data, r1u64(off, off+expr_size)); - SLLQueuePush(result.first, result.last, n); - result.count += 1; - off += expr_size; - } - if(off == start_off) - { - break; - } - } - }break; - - //- rjf: @dwarf5 - case DW_Version_5: - { - String8 data = raw->sec[DW_SectionKind_LocLists].data; - - // rjf: determine section offset - sometimes this is encoded directly, - // other times it is relative, based on the form kind - more variability - // in this awful format - U64 loclist_off = 0; - switch(form_val.kind) - { - default:{}break; - case DW_FormKind_SecOffset: - { - loclist_off = form_val.u128.u64[0]; - }break; - case DW_FormKind_LocListx: - if(ctx->rnglists_table != 0) - { - U64 loclist_off_idx = form_val.u128.u64[0]; - dw2_try_offset_from_table_idx(ctx->loclists_table, loclist_off_idx, &loclist_off); - }break; - } - - // rjf: in a HIGHLY UNEXPECTED TURN OF EVENTS, we now have to decode ANOTHER - // OPCODE STREAM to unpack the actual list of locations!!! - U64 rle_sentinel = (ctx->addr_size == 4 ? max_U32 : max_U64); - U64 base_addr = ctx->unit_base_addr; - for(U64 off = loclist_off; off < data.size;) - { - U64 start_off = off; - - // rjf: decode op kind - DW_LLE lle_kind = DW_LLE_EndOfList; - off += str8_deserial_read_struct(data, off, &lle_kind); - - // rjf: obtain range from op - B32 good_loc = 1; - Rng1U64 range = {0}; - switch(lle_kind) - { - default:{good_loc = 0;}break; - case DW_LLE_BaseAddressx: - { - good_loc = 0; - U64 addr_idx = 0; - off += str8_deserial_read_uleb128(data, off, &addr_idx); - if(ctx->addr_table != 0) - { - U64 new_base_addr = 0; - if(dw2_try_offset_from_table_idx(ctx->addr_table, addr_idx, &new_base_addr)) - { - good_loc = 1; - base_addr = new_base_addr; - } - } - }break; - case DW_LLE_StartxEndx: - { - good_loc = 0; - U64 start_idx = 0; - U64 end_idx = 0; - off += str8_deserial_read_uleb128(data, off, &start_idx); - off += str8_deserial_read_uleb128(data, off, &end_idx); - if(ctx->addr_table != 0) - { - U64 start = 0; - U64 end = 0; - if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start) && - dw2_try_offset_from_table_idx(ctx->addr_table, end_idx, &end)) - { - good_loc = 1; - range = r1u64(start, end); - } - } - }break; - case DW_LLE_StartxLength: - { - good_loc = 0; - U64 start_idx = 0; - U64 length = 0; - off += str8_deserial_read_uleb128(data, off, &start_idx); - off += str8_deserial_read_uleb128(data, off, &length); - if(ctx->addr_table != 0) - { - U64 start = 0; - if(dw2_try_offset_from_table_idx(ctx->addr_table, start_idx, &start)) - { - good_loc = 1; - range = r1u64(start, start+length); - } - } - }break; - case DW_LLE_OffsetPair: - { - U64 range_off_start = 0; - U64 range_off_end = 0; - off += str8_deserial_read_uleb128(data, off, &range_off_start); - off += str8_deserial_read_uleb128(data, off, &range_off_end); - range = r1u64(base_addr + range_off_start, base_addr + range_off_end); - }break; - case DW_LLE_DefaultLocation: - { - range = r1u64(0, max_U64); - }break; - case DW_LLE_BaseAddress: - { - U64 new_base_addr = 0; - off += str8_deserial_read(data, off, &new_base_addr, ctx->addr_size, ctx->addr_size); - base_addr = new_base_addr; - }break; - case DW_LLE_StartEnd: - { - U64 start = 0; - U64 end = 0; - off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); - off += str8_deserial_read(data, off, &end, ctx->addr_size, ctx->addr_size); - range = r1u64(start, end); - }break; - case DW_LLE_StartLength: - { - U64 start = 0; - U64 length = 0; - off += str8_deserial_read(data, off, &start, ctx->addr_size, ctx->addr_size); - off += str8_deserial_read_uleb128(data, off, &length); - range = r1u64(start, start + length); - }break; - } - - // rjf: read expression - String8 expr = {0}; - if(good_loc && lle_kind != DW_LLE_BaseAddress && lle_kind != DW_LLE_BaseAddressx) - { - U64 expr_size = 0; - off += str8_deserial_read_uleb128(data, off, &expr_size); - expr = str8_substr(data, r1u64(off, off+expr_size)); - off += expr_size; - } - - // rjf: add range - if(good_loc) - { - DW2_LocNode *n = push_array(arena, DW2_LocNode, 1); - n->v.range = range; - n->v.expr = expr; - SLLQueuePush(result.first, result.last, n); - result.count += 1; - } - - // rjf: end if no movement or end-of-list code - if(off == start_off || lle_kind == DW_LLE_EndOfList) - { - break; - } - } - }break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Unwind Info Parsing (.debug_frame) - -internal U64 -dw2_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi_header_out) -{ - U64 start_off = off; - - // rjf: read length / format - U64 length = 0; - DW_Format fmt = DW_Format_Null; - U64 length_size = dw2_read_initial_length(data, off, &length, &fmt); - - // rjf: find entry info, read ID - Rng1U64 entry_range = r1u64(off, off + length_size + length); - String8 entry_data = str8_substr(data, entry_range); - U64 id = 0; - U64 id_size = dw2_read_fmt_u64(entry_data, length_size, fmt, &id); - - // rjf: fill - cfi_header_out->kind = ((fmt == DW_Format_32Bit && id == max_U32) || (fmt == DW_Format_64Bit && id == max_U64)) ? DW_CFIKind_CIE : DW_CFIKind_FDE; - cfi_header_out->fmt = fmt; - cfi_header_out->entry_range = entry_range; - cfi_header_out->cie_pointer = id; - cfi_header_out->cie_pointer_off = off + length_size; - - U64 bytes_read = (off - start_off); - return bytes_read; -} - -internal U64 -dw2_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie_out) -{ - U64 start_off = off; - - // rjf: read id - U64 id = 0; - off += dw2_read_fmt_u64(data, off, fmt, &id); - - // rjf: read version - U8 version = 0; - off += str8_deserial_read_struct(data, off, &version); - - // rjf: read aug string - String8 aug_string = {0}; - U64 aug_string_off = off; - off += str8_deserial_read_cstr(data, off, &aug_string); - U64 aug_string_off_opl = off; - - // rjf: read address/segment-selector size - U8 address_size = 0; - U8 segment_selector_size = 0; - if(version >= DW_Version_4) - { - off += str8_deserial_read_struct(data, off, &address_size); - off += str8_deserial_read_struct(data, off, &segment_selector_size); - } - else - { - address_size = byte_size_from_arch(arch); - } - - // rjf: read alignments - U64 code_align_factor = 0; - U64 data_align_factor = 0; - off += str8_deserial_read_uleb128(data, off, &code_align_factor); - off += str8_deserial_read_uleb128(data, off, &data_align_factor); - - // rjf: read return address register encoding - U64 ret_addr_reg = 0; - switch(version) - { - case DW_Version_1: - { - off += str8_deserial_read(data, off, &ret_addr_reg, 1, 1); - }break; - default: - { - off += str8_deserial_read_uleb128(data, off, &ret_addr_reg); - }break; - } - - // rjf: fill output - { - cie_out->aug_string_range = r1u64(aug_string_off, aug_string_off_opl); - cie_out->code_align_factor = code_align_factor; - cie_out->data_align_factor = data_align_factor; - cie_out->ret_addr_reg = ret_addr_reg; - cie_out->format = fmt; - cie_out->version = version; - cie_out->address_size = address_size; - cie_out->segment_selector_size = segment_selector_size; - } - - U64 bytes_read = (off - start_off); - return bytes_read; -} - -internal U64 -dw2_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie, DW_FDE *fde_out) -{ - U64 start_off = off; - - // rjf: skip format-dependent prefix - off += (fmt == DW_Format_32Bit) ? 4 : 12; - - // rjf: read cie ptr - U64 cie_ptr = 0; - off += dw2_read_fmt_u64(data, off, fmt, &cie_ptr); - - // rjf: read address of first instruction - U64 pc_begin = 0; - off += str8_deserial_read(data, off, &pc_begin, cie->address_size, cie->address_size); - - // rjf: read instruction range size - U64 pc_range_size = 0; - off += str8_deserial_read(data, off, &pc_range_size, cie->address_size, cie->address_size); - - // rjf: skip aug data - off += dim_1u64(cie->aug_string_range); - - // rjf: fill output - fde_out->cie_pointer = cie_ptr; - fde_out->pc_range = r1u64(pc_begin, pc_begin + pc_range_size); - - U64 bytes_read = (off - start_off); - return bytes_read; -} - -internal B32 -dw2_try_cfi_from_data(String8 data, U64 off, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out) -{ - B32 result = 0; - { - DW_CFIHeader fde_header = {0}; - off += dw2_read_cfi_header(data, off, &fde_header); - if(fde_header.kind == DW_CFIKind_FDE) - { - DW_CFIHeader cie_header = {0}; - dw2_read_cfi_header(data, fde_header.cie_pointer, &cie_header); - if(cie_header.kind == DW_CFIKind_CIE) - { - result = 1; - dw2_read_cie(data, cie_header.entry_range.min, cie_header.fmt, arch, cie_out); - dw2_read_fde(data, fde_header.entry_range.min, fde_header.fmt, arch, cie_out, fde_out); - } - } - } - return result; -} diff --git a/src/dwarf/dwarf_parse_2.h b/src/dwarf/dwarf_parse_2.h deleted file mode 100644 index a4d5606c..00000000 --- a/src/dwarf/dwarf_parse_2.h +++ /dev/null @@ -1,456 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DWARF_PARSE_2_H -#define DWARF_PARSE_2_H - -//////////////////////////////// -//~ rjf: Raw Section Data - -typedef struct DW_Section DW_Section; -struct DW_Section -{ - String8 name; - String8 data; -}; - -typedef struct DW_Raw DW_Raw; -struct DW_Raw -{ - DW_Section sec[DW_SectionKind_COUNT]; - DW_Section sup[DW_SectionKind_COUNT]; -}; - -//////////////////////////////// -//~ rjf: Unit Headers - -typedef struct DW2_UnitHeader DW2_UnitHeader; -struct DW2_UnitHeader -{ - DW_Version version; - DW_Format format; - U64 abbrev_off; - U64 addr_size; - DW_CompUnitKind kind; - U64 dwo_id; -}; - -//////////////////////////////// -//~ rjf: Abbreviation Map (ID -> .debug_abbrev Offset) - -typedef struct DW2_AbbrevAttrib DW2_AbbrevAttrib; -struct DW2_AbbrevAttrib -{ - DW_AttribKind attrib_kind; - DW_FormKind form_kind; - U64 implicit_const; -}; - -typedef struct DW2_AbbrevAttribNode DW2_AbbrevAttribNode; -struct DW2_AbbrevAttribNode -{ - DW2_AbbrevAttribNode *next; - DW2_AbbrevAttrib v; -}; - -typedef struct DW2_AbbrevAttribList DW2_AbbrevAttribList; -struct DW2_AbbrevAttribList -{ - DW2_AbbrevAttribNode *first; - DW2_AbbrevAttribNode *last; - U64 count; -}; - -typedef struct DW2_AbbrevHeader DW2_AbbrevHeader; -struct DW2_AbbrevHeader -{ - U64 id; - DW_TagKind tag_kind; - B8 has_children; -}; - -typedef struct DW2_AbbrevMapNode DW2_AbbrevMapNode; -struct DW2_AbbrevMapNode -{ - DW2_AbbrevMapNode *next; - U64 id; - U64 off; -}; - -typedef struct DW2_AbbrevMap DW2_AbbrevMap; -struct DW2_AbbrevMap -{ - DW2_AbbrevMapNode **slots; - U64 slots_count; -}; - -typedef struct DW2_UnitAbbrevMapMap DW2_UnitAbbrevMapMap; -struct DW2_UnitAbbrevMapMap -{ - U64 map_count; - DW2_AbbrevMap *map_from_idx_table; - DW2_AbbrevMap **map_from_unit_idx_table; -}; - -//////////////////////////////// -//~ rjf: Offset Tables (.debug_str_offsets, .debug_rnglists) - -typedef struct DW2_OffsetTable DW2_OffsetTable; -struct DW2_OffsetTable -{ - DW_Format format; - DW_Version version; - U8 addr_size; - U8 segment_selector_size; - U64 entry_size; - U64 entries_count; - void *entries; -}; - -typedef struct DW2_OffsetTableNode DW2_OffsetTableNode; -struct DW2_OffsetTableNode -{ - DW2_OffsetTableNode *next; - DW2_OffsetTable v; - Rng1U64 range; -}; - -typedef struct DW2_OffsetTableList DW2_OffsetTableList; -struct DW2_OffsetTableList -{ - DW2_OffsetTableNode *first; - DW2_OffsetTableNode *last; - U64 count; -}; - -typedef struct DW2_OffsetTableSet DW2_OffsetTableSet; -struct DW2_OffsetTableSet -{ - // rjf: .debug_str_offsets - U64 str_offsets_tables_count; - DW2_OffsetTable *str_offsets_tables; - Rng1U64 *str_offsets_tables_ranges; - - // rjf: .debug_rnglists - U64 rnglists_tables_count; - DW2_OffsetTable *rnglists_tables; - Rng1U64 *rnglists_tables_ranges; - - // rjf: .debug_addr - U64 addr_tables_count; - DW2_OffsetTable *addr_tables; - Rng1U64 *addr_tables_ranges; - - // rjf: .debug_loclists - U64 loclists_tables_count; - DW2_OffsetTable *loclists_tables; - Rng1U64 *loclists_tables_ranges; -}; - -//////////////////////////////// -//~ rjf: Parsing Context Bundle - -typedef struct DW2_ParseCtx DW2_ParseCtx; -struct DW2_ParseCtx -{ - DW_Version version; - DW_Format format; - DW_ExtFlags exts; - U64 addr_size; - U64 unit_base_addr; - U64 unit_base_info_off; - DW2_AbbrevMap *abbrev_map; - DW2_OffsetTable *rnglists_table; - DW2_OffsetTable *str_offsets_table; - DW2_OffsetTable *addr_table; - DW2_OffsetTable *loclists_table; - String8 unit_dir; - String8 unit_file; - DW_Language language; -}; - -//////////////////////////////// -//~ rjf: Tag Attributes - -typedef struct DW2_FormVal DW2_FormVal; -struct DW2_FormVal -{ - DW_FormKind kind; - U128 u128; - String8 string; - U64 addr; -}; - -typedef struct DW2_Attrib DW2_Attrib; -struct DW2_Attrib -{ - DW_AttribKind attrib_kind; - DW2_FormVal val; -}; - -typedef struct DW2_AttribNode DW2_AttribNode; -struct DW2_AttribNode -{ - DW2_AttribNode *next; - DW2_Attrib v; -}; - -typedef struct DW2_AttribList DW2_AttribList; -struct DW2_AttribList -{ - DW2_AttribNode *first; - DW2_AttribNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Tags - -typedef struct DW2_Tag DW2_Tag; -struct DW2_Tag -{ - DW_TagKind kind; - B32 has_children; - DW2_AttribList attribs; -}; - -//////////////////////////////// -//~ rjf: Line Info - -typedef U32 DW2_LineTableFileFlags; -enum -{ - DW2_LineTableFileFlag_HasMD5 = (1<<0), - DW2_LineTableFileFlag_HasModifyTime = (1<<1), -}; - -typedef struct DW2_LineTableFile DW2_LineTableFile; -struct DW2_LineTableFile -{ - String8 file_name; - DW2_LineTableFileFlags flags; - U64 dir_idx; - U64 modify_time; - U64 file_size; - MD5 md5; - String8 source; -}; - -typedef struct DW2_LineTableFileNode DW2_LineTableFileNode; -struct DW2_LineTableFileNode -{ - DW2_LineTableFileNode *next; - DW2_LineTableFile v; -}; - -typedef struct DW2_LineTableFileList DW2_LineTableFileList; -struct DW2_LineTableFileList -{ - DW2_LineTableFileNode *first; - DW2_LineTableFileNode *last; - U64 count; -}; - -typedef struct DW2_LineTableFileArray DW2_LineTableFileArray; -struct DW2_LineTableFileArray -{ - DW2_LineTableFile *v; - U64 count; -}; - -typedef struct DW2_LineTableHeader DW2_LineTableHeader; -struct DW2_LineTableHeader -{ - U64 unit_length; - DW_Format format; - DW_Version version; - U8 addr_size; - U8 segment_selector_size; - U64 header_length; - U8 min_inst_length; - U8 max_ops_per_inst; - U8 default_is_stmt; - S8 line_base; - U8 line_range; - U8 opcode_base; - U64 opcode_lengths_count; - U8 *opcode_lengths; - DW2_LineTableFileArray dirs; - DW2_LineTableFileArray files; - U64 line_program_off; - U64 total_unit_data_size; // NOTE(rjf): would be implied by `unit_length`, but DWARF makes that the size *past* the variable-width unit-length field itself -}; - -typedef struct DW2_LineVMRegs DW2_LineVMRegs; -struct DW2_LineVMRegs -{ - U64 address; - U64 vliw_op_index; - U64 file_index; - U64 line; - U64 column; - B32 is_stmt; - B32 basic_block; - B32 end_sequence; - B32 prologue_end; - B32 epilogue_begin; - U64 isa; - U64 discriminator; -}; - -//////////////////////////////// -//~ rjf: Location Lists - -typedef struct DW2_Loc DW2_Loc; -struct DW2_Loc -{ - Rng1U64 range; - String8 expr; -}; - -typedef struct DW2_LocNode DW2_LocNode; -struct DW2_LocNode -{ - DW2_LocNode *next; - DW2_Loc v; -}; - -typedef struct DW2_LocList DW2_LocList; -struct DW2_LocList -{ - DW2_LocNode *first; - DW2_LocNode *last; - U64 count; -}; - -//////////////////////////////// -//~ rjf: Unwind Info - -typedef enum DW_CFIKind -{ - DW_CFIKind_Null, - DW_CFIKind_CIE, // Common Information Entry - DW_CFIKind_FDE, // Frame Description Entry - DW_CFIKind_COUNT -} -DW_CFIKind; - -typedef struct DW_CFIHeader DW_CFIHeader; -struct DW_CFIHeader -{ - DW_CFIKind kind; - DW_Format fmt; - Rng1U64 entry_range; - U64 cie_pointer_off; - U64 cie_pointer; -}; - -typedef struct DW_CIE DW_CIE; -struct DW_CIE -{ - Rng1U64 aug_string_range; - Rng1U64 aug_data_range; - U64 code_align_factor; - S64 data_align_factor; - U64 ret_addr_reg; - U64 ext[4]; - DW_Format format; - U8 version; - U8 address_size; - U8 segment_selector_size; -}; - -typedef struct DW_FDE DW_FDE; -struct DW_FDE -{ - U64 cie_pointer; - Rng1U64 pc_range; -}; - -typedef struct DW_CFI DW_CFI; -struct DW_CFI -{ - DW_CIE cie; - DW_FDE fde; -}; - -//////////////////////////////// -//~ rjf: Globals - -global read_only DW2_Attrib dw2_attrib_nil = {0}; - -//////////////////////////////// -//~ rjf: Basic Parsing Helpers - -internal U64 dw2_read_initial_length(String8 data, U64 off, U64 *out, DW_Format *fmt_out); -internal U64 dw2_read_fmt_u64(String8 data, U64 off, DW_Format format, U64 *out); -internal DW_SectionKind dw_section_kind_from_string(String8 string); - -//////////////////////////////// -//~ rjf: Unit Range Set Parsing (Top-Level .debug_info, .debug_aranges) - -internal Rng1U64Array dw2_unit_ranges_from_data(Arena *arena, String8 data); - -//////////////////////////////// -//~ rjf: Unit Header Parsing - -internal U64 dw2_read_unit_header(String8 data, U64 off, DW2_UnitHeader *out); - -//////////////////////////////// -//~ rjf: Abbreviation Map Parsing - -internal U64 dw2_read_abbrev(Arena *arena, String8 data, U64 off, DW2_AbbrevHeader *header_out, DW2_AbbrevAttribList *attribs_out); -internal DW2_AbbrevMap dw2_abbrev_map_from_data(Arena *arena, String8 data, U64 off); -internal DW2_UnitAbbrevMapMap dw2_unit_abbrev_map_map_from_data(Arena *arena, String8 data, DW2_UnitHeader *unit_headers, U64 unit_headers_count); - -//////////////////////////////// -//~ rjf: Form Value Parsing - -internal U64 dw2_read_form_val(DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW_FormKind form_kind, U64 implicit_const, DW2_FormVal *out); - -//////////////////////////////// -//~ rjf: Parse Context Construction - -internal void dw2_parse_ctx_equip_unit_header(DW2_ParseCtx *ctx_out, DW2_UnitHeader *hdr, U64 unit_base_info_off); -internal void dw2_parse_ctx_equip_unit_abbrev_map(DW2_ParseCtx *ctx_out, DW2_UnitAbbrevMapMap *map, U64 unit_idx); -internal void dw2_parse_ctx_equip_unit_root_tag(DW2_ParseCtx *ctx_out, DW2_Tag *tag, DW2_OffsetTableSet *offset_tables); - -//////////////////////////////// -//~ rjf: Tag Parsing - -internal U64 dw2_read_tag(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_Tag *tag_out); -internal DW2_Attrib *dw2_attrib_from_kind(DW2_Tag *tag, DW_AttribKind kind); -internal U64 dw2_reference_info_off_from_form_val(DW2_ParseCtx *ctx, DW2_FormVal *v); - -//////////////////////////////// -//~ rjf: Line Table Parsing - -internal U64 dw2_read_line_table_header(Arena *arena, DW_Raw *raw, DW2_ParseCtx *ctx, String8 data, U64 off, DW2_LineTableHeader *out); - -//////////////////////////////// -//~ rjf: Offset Table Parsing (.debug_str_offsets, .debug_rnglists) - -internal U64 dw2_read_offset_table(String8 data, U64 off, DW2_OffsetTable *out); -internal DW2_OffsetTableList dw2_offset_table_list_from_data(Arena *arena, String8 data); -internal B32 dw2_try_offset_from_table_idx(DW2_OffsetTable *tbl, U64 idx, U64 *out); -internal DW2_OffsetTableSet dw2_offset_table_set_from_raw(Arena *arena, DW_Raw *raw); - -//////////////////////////////// -//~ rjf: Range List Parsing (.debug_rnglists) - -internal Rng1U64List dw2_rnglist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val); - -//////////////////////////////// -//~ rjf: Location List Parsing (.debug_loclists) - -internal DW2_LocList dw2_loclist_from_form_val(Arena *arena, DW2_ParseCtx *ctx, DW_Raw *raw, DW2_FormVal form_val); - -//////////////////////////////// -//~ rjf: Unwind Info Parsing (.debug_frame) - -internal U64 dw2_read_cfi_header(String8 data, U64 off, DW_CFIHeader *cfi_header_out); -internal U64 dw2_read_cie(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie_out); -internal U64 dw2_read_fde(String8 data, U64 off, DW_Format fmt, Arch arch, DW_CIE *cie, DW_FDE *fde_out); -internal B32 dw2_try_cfi_from_data(String8 data, U64 off, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out); - -#endif // DWARF_PARSE_2_H diff --git a/src/dwarf/dwarf_parse_coff.h b/src/dwarf/dwarf_parse_coff.h index 3df0b5be..9523f053 100644 --- a/src/dwarf/dwarf_parse_coff.h +++ b/src/dwarf/dwarf_parse_coff.h @@ -8,4 +8,3 @@ internal B32 dw_is_dwarf_present_coff_section_table(String8 string_table, U64 se internal DW_Raw dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); #endif // DWARF_PARSE_COFF_H - diff --git a/src/dwarf/dwarf_unwind.c b/src/dwarf/dwarf_unwind.c index c8124236..ae447aab 100644 --- a/src/dwarf/dwarf_unwind.c +++ b/src/dwarf/dwarf_unwind.c @@ -1,373 +1,2 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) - -internal DW_CFI_Row * -dw_make_cfi_row(Arena *arena, U64 reg_count) -{ - DW_CFI_Row *row = push_array(arena, DW_CFI_Row, 1); - row->regs = push_array(arena, DW_CFI_Register, reg_count); - for EachIndex(reg_idx, reg_count) { - row->regs[reg_idx].rule = DW_CFI_RegisterRule_SameValue; - } - return row; -} - -internal void -dw_memcpy_cfi_row(DW_CFI_Row *dst, DW_CFI_Row *src, U64 reg_count) -{ - dst->cfa = src->cfa; - MemoryCopyTyped(dst->regs, src->regs, reg_count); -} - -internal DW_CFI_Row * -dw_copy_cfi_row(Arena *arena, DW_CFI_Row *row, U64 reg_count) -{ - DW_CFI_Row *new_row = dw_make_cfi_row(arena, reg_count); - dw_memcpy_cfi_row(new_row, row, reg_count); - return new_row; -} - -internal DW_CFI_Unwind * -dw_cfi_unwind_init(Arena *arena, - Arch arch, - DW_CIE *cie, - DW_FDE *fde, - DW_DecodePtr *decode_ptr_func, - void *decode_ptr_ud) -{ - Temp scratch = scratch_begin(&arena, 1); - - DW_CFI_Unwind *uw = push_array(arena, DW_CFI_Unwind, 1); - uw->insts = dw_parse_cfa_inst_list(arena, fde->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud); - uw->cie = cie; - uw->fde = fde; - uw->pc = fde->pc_range.min; - uw->arch = arch; - uw->reg_count = dw_reg_count_from_arch(arch); - - // setup initial register rules - DW_CFA_InstList initial_insts = dw_parse_cfa_inst_list(scratch.arena, cie->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud); - uw->row = dw_make_cfi_row(arena, uw->reg_count); - uw->curr_inst = initial_insts.first; - if (!dw_cfi_next_row(arena, uw)) { - AssertAlways(0 && "unable to interpret initial row instructions"); - } - - // make first row from initial rules - uw->initial_row = uw->row; - uw->row = dw_copy_cfi_row(arena, uw->initial_row, uw->reg_count); - uw->curr_inst = uw->insts.first; - - scratch_end(scratch); - return uw; -} - -internal B32 -dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw) -{ - B32 is_row_valid = 0; - DW_CFA_InstNode *row_inst = uw->curr_inst; - - // skip leading nops - while (uw->curr_inst) { - if (uw->curr_inst->v.opcode != DW_CFA_Nop) { - break; - } - uw->curr_inst = uw->curr_inst->next; - } - - while (uw->curr_inst) { - DW_CFA_Inst *inst = &uw->curr_inst->v; - - // validate register operands - DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst->opcode); - U64 operand_count = dw_operand_count_from_cfa_opcode(inst->opcode); - for EachIndex(operand_idx, operand_count) { - if (operand_types[operand_idx] == DW_CFA_OperandType_Register) { - if (inst->operands[operand_idx].u64 >= uw->reg_count) { - goto exit; - } - } - } - - switch (inst->opcode) { - // Row Creation Instructions - case DW_CFA_SetLoc: { - uw->pc = inst->operands[0].u64; - } break; - case DW_CFA_AdvanceLoc: - case DW_CFA_AdvanceLoc1: - case DW_CFA_AdvanceLoc2: - case DW_CFA_AdvanceLoc4: { - uw->pc += inst->operands[0].u64; - } break; - - // CFA Definition Instructions - case DW_CFA_DefCfa: - case DW_CFA_DefCfaSf: { - U64 reg = inst->operands[0].u64; - S64 off = inst->operands[1].s64; - uw->row->cfa.rule = DW_CFA_Rule_RegOff; - uw->row->cfa.reg = reg; - uw->row->cfa.off = off; - } break; - case DW_CFA_DefCfaRegister: { - // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset - if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; } - U64 reg = inst->operands[0].u64; - uw->row->cfa.reg = reg; - } break; - case DW_CFA_DefCfaOffset: - case DW_CFA_DefCfaOffsetSf: { - // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset - if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; } - uw->row->cfa.off = inst->operands[0].s64; - } break; - case DW_CFA_DefCfaExpr: { - uw->row->cfa.rule = DW_CFA_Rule_Expression; - uw->row->cfa.expr = inst->operands[0].block; - } break; - - // Register Rule Instructions - case DW_CFA_Undefined: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_Undefined; - } break; - case DW_CFA_SameValue: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_SameValue; - } break; - case DW_CFA_Offset: - case DW_CFA_OffsetExt: - case DW_CFA_OffsetExtSf: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_Offset; - uw->row->regs[reg].n = inst->operands[1].s64; - } break; - case DW_CFA_ValOffset: - case DW_CFA_ValOffsetSf: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValOffset; - uw->row->regs[reg].n = inst->operands[1].s64; - } break; - case DW_CFA_Register: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_Register; - uw->row->regs[reg].n = inst->operands[1].s64; - } break; - case DW_CFA_Expr: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_Expression; - uw->row->regs[reg].expr = inst->operands[1].block; - } break; - case DW_CFA_ValExpr: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValExpression; - uw->row->regs[reg].expr = inst->operands[1].block; - } break; - case DW_CFA_Restore: - case DW_CFA_RestoreExt: { - U64 reg = inst->operands[0].u64; - uw->row->regs[reg] = uw->initial_row->regs[reg]; - } break; - - // Row State Instructions - case DW_CFA_RememberState: { - DW_CFI_Row *new_row = dw_copy_cfi_row(arena, uw->row, uw->reg_count); - SLLStackPush(uw->row, new_row); - } break; - case DW_CFA_RestoreState: { - if (uw->row == 0) { goto exit; } // TODO: report error: unbalanced number of pushes and pops - DW_CFI_Row *free_row = uw->row; - SLLStackPop(uw->row); - SLLStackPush(uw->free_rows, free_row); - } break; - - case DW_CFA_Nop: {} break; - - default: { NotImplemented; } break; // TODO: report error: unknown CFA opcode - } - - uw->curr_inst = uw->curr_inst->next; - if (uw->curr_inst) { - if (dw_is_new_row_cfa_opcode(uw->curr_inst->v.opcode)) { break; } - } - } - - is_row_valid = row_inst != 0; - exit:; - return is_row_valid; -} - -internal DW_CFI_Row * -dw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc) -{ - Temp scratch = scratch_begin(&arena, 1); - - B32 is_row_found = 0; - U64 reg_count = dw_reg_count_from_arch(arch); - DW_CFI_Unwind *uw = dw_cfi_unwind_init(scratch.arena, arch, cie, fde, decode_ptr_func, decode_ptr_ctx); - DW_CFI_Row *row = dw_copy_cfi_row(scratch.arena, uw->row, uw->reg_count); - U64 prev_pc = uw->pc; - while (dw_cfi_next_row(scratch.arena, uw)) { - if (prev_pc <= pc && pc < uw->pc) { - is_row_found = 1; - break; - } - dw_memcpy_cfi_row(row, uw->row, uw->reg_count); - prev_pc = uw->pc; - } - - // handle last row - if (!is_row_found) { - if (contains_1u64(fde->pc_range, pc)) { - row = uw->row; - is_row_found = 1; - } - } - - // copy out final row - DW_CFI_Row *result = 0; - if (is_row_found) { - result = dw_copy_cfi_row(arena, row, reg_count); - } - - scratch_end(scratch); - return result; -} - -internal MachineOpResult -dw_compute_cfa(Arch arch, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud, U64 *cfa_out) -{ - MachineOpResult unwind_status = MachineOpResult_Fail; - ARCH_Info *arch_info = arch_info_from_arch(arch); - switch(row->cfa.rule) - { - case DW_CFA_Rule_Null:{}break; - case DW_CFA_Rule_RegOff: - { - // TODO: report error (invalid register read) - U64 cfa_reg_value = 0; - U64 reg_size = dw_reg_size_from_code(arch, row->cfa.reg); - AssertAlways(reg_size <= sizeof(cfa_reg_value)); - ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, row->cfa.reg); - Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; - if(!arch_reg_block_read_range(arch_info, reg_block, reg_rng, &cfa_reg_value)) - { - break; - } - *cfa_out = cfa_reg_value + row->cfa.off; - unwind_status = MachineOpResult_Ok; - }break; - case DW_CFA_Rule_Expression: - { - Temp scratch = scratch_begin(0,0); - DW_ExprValue value = {0}; - DW_Expr expr = dw_expr_from_data(scratch.arena, DW_Format_32Bit, byte_size_from_arch(arch), row->cfa.expr); - DW_ExprEvalResult eval_result = dw_eval_expr(scratch.arena, arch, DW_Format_32Bit, 0, 0, 0, 9999, expr, reg_block, mem_read_func, mem_read_ud, &value); - if (eval_result == DW_ExprEvalResult_Ok) { - if (DW_ExprValueType_IsInt(value.type)) { - *cfa_out = value.u64; - unwind_status = MachineOpResult_Ok; - } - } else if (eval_result == DW_ExprEvalResult_Maybe) { - unwind_status = MachineOpResult_Maybe; - } - scratch_end(scratch); - }break; - } - return unwind_status; -} - -internal MachineOpResult -dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud) -{ - Temp scratch = scratch_begin(0,0); - MachineOpResult unwind_status = MachineOpResult_Ok; - - ARCH_Info *arch_info = arch_info_from_arch(arch); - - U64 max_reg_size = dw_reg_max_size_from_arch(arch); - void *reg_buffer = push_array(scratch.arena, U8, max_reg_size); - - U64 reg_count = dw_reg_count_from_arch(arch); - for EachIndex(reg_idx, reg_count) - { - DW_CFI_Register *reg = &row->regs[reg_idx]; - ARCH_RegCode reg_code = arch_reg_code_from_dw(arch, reg_idx); - Rng1U16 reg_rng = arch_info->reg_code_rng_table[reg_code]; - switch(reg->rule) - { - default:{}break; - case DW_CFI_RegisterRule_Undefined: {} break; - case DW_CFI_RegisterRule_SameValue: {} break; - case DW_CFI_RegisterRule_Offset: - { - // read register value from memory - U64 addr = cfa + reg->n; - U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - unwind_status = mem_read_func(addr, reg_buffer, reg_size, mem_read_ud); - if (unwind_status != MachineOpResult_Ok) { goto exit; } - - // write register value to the thread context - if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, reg_buffer)) - { - unwind_status = MachineOpResult_Fail; - goto exit; - } - }break; - case DW_CFI_RegisterRule_ValOffset: - { - // compute register value - U64 reg_value = cfa + reg->n; - - // write register value to the thread context - U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, ®_value)) - { - unwind_status = MachineOpResult_Fail; - goto exit; - } - }break; - case DW_CFI_RegisterRule_Register: - { - // read register value from another register - U64 reg_size = dw_reg_size_from_code(arch, reg_idx); - if(!arch_reg_block_read_range(arch_info, reg_block, reg_rng, reg_buffer)) - { - unwind_status = MachineOpResult_Fail; - goto exit; - } - - // write register value to the thread context - if(!arch_reg_block_write_range(arch_info, reg_block, reg_rng, reg_buffer)) - { - unwind_status = MachineOpResult_Fail; - goto exit; - } - if (unwind_status != MachineOpResult_Ok) { goto exit; } - }break; - case DW_CFI_RegisterRule_Expression: - { - // TODO: evaluate expression - NotImplemented; - }break; - case DW_CFI_RegisterRule_ValExpression: - { - // TODO: evaluate expression - NotImplemented; - }break; - case DW_CFI_RegisterRule_Architectural: - { - NotImplemented; - }break; - } - } - - // update stack pointer - arch_reg_block_write_sp(arch_info, reg_block, cfa); - - exit:; - scratch_end(scratch); - return unwind_status; -} diff --git a/src/dwarf/dwarf_unwind.h b/src/dwarf/dwarf_unwind.h index 63e5ba3f..d278d9f6 100644 --- a/src/dwarf/dwarf_unwind.h +++ b/src/dwarf/dwarf_unwind.h @@ -4,78 +4,41 @@ #ifndef DWARF_UNWIND_H #define DWARF_UNWIND_H -typedef enum DW_CFI_RegisterRule +typedef enum DW_UnwindRuleCode { - DW_CFI_RegisterRule_Undefined, - DW_CFI_RegisterRule_SameValue, - DW_CFI_RegisterRule_Offset, - DW_CFI_RegisterRule_ValOffset, - DW_CFI_RegisterRule_Register, - DW_CFI_RegisterRule_Expression, - DW_CFI_RegisterRule_ValExpression, - DW_CFI_RegisterRule_Architectural -} DW_CFI_RegisterRule; + DW_UnwindRuleCode_SameVal, + DW_UnwindRuleCode_Undefined, + DW_UnwindRuleCode_Off, + DW_UnwindRuleCode_ValOff, + DW_UnwindRuleCode_Reg, + DW_UnwindRuleCode_Expr, + DW_UnwindRuleCode_ValExpr, + DW_UnwindRuleCode_Architectural, +} +DW_UnwindRuleCode; -typedef enum DW_CFA_Rule +typedef struct DW_UnwindRule DW_UnwindRule; +struct DW_UnwindRule { - DW_CFA_Rule_Null, - DW_CFA_Rule_RegOff, - DW_CFA_Rule_Expression -} DW_CFA_Rule; + DW_UnwindRuleCode code; + DW_RegCode reg_code; + S64 s64; + String8 expr; +}; -typedef struct DW_CFA +typedef struct DW_CFIRow DW_CFIRow; +struct DW_CFIRow { - DW_CFA_Rule rule; - union { - struct { - DW_Reg reg; - S64 off; - }; - String8 expr; - }; -} DW_CFA; + U64 base_pc_off; + DW_UnwindRule cfa_rule; + DW_UnwindRule *reg_rules; +}; -typedef struct DW_CFI_Register +typedef struct DW_CFIRowNode DW_CFIRowNode; +struct DW_CFIRowNode { - DW_CFI_RegisterRule rule; - union { - S64 n; - String8 expr; - }; -} DW_CFI_Register; - -typedef struct DW_CFI_Row -{ - DW_CFA cfa; - DW_CFI_Register *regs; - struct DW_CFI_Row *next; -} DW_CFI_Row; - -typedef struct DW_CFI_Unwind -{ - DW_CFA_InstList insts; - DW_CIE *cie; - DW_FDE *fde; - DW_CFI_Row *initial_row; - DW_CFI_Row *row; - DW_CFA_InstNode *curr_inst; - DW_CFI_Row *free_rows; - U64 pc; - Arch arch; - U64 reg_count; -} DW_CFI_Unwind; - -//////////////////////////////// - -internal DW_CFI_Row * dw_make_cfi_row(Arena *arena, U64 reg_count); -internal DW_CFI_Row * dw_copy_cfi_row(Arena *arena, DW_CFI_Row *row, U64 reg_count); - -internal DW_CFI_Unwind * dw_cfi_unwind_init(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud); -internal B32 dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw); - -internal DW_CFI_Row * dw_cfi_row_from_pc(Arena *arena, Arch arch, struct DW_CIE *cie, struct DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc); -internal MachineOpResult dw_compute_cfa(Arch arch, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud, U64 *cfa_out); -internal MachineOpResult dw_cfi_apply_register_rules(Arch arch, U64 cfa, DW_CFI_Row *row, void *reg_block, MachineOp_MemRead *mem_read_func, void *mem_read_ud); + DW_CFIRowNode *next; + DW_CFIRow v; +}; #endif // DWARF_UNWIND_H - diff --git a/src/dwarf/dwarf_unwind_2.c b/src/dwarf/dwarf_unwind_2.c deleted file mode 100644 index ae447aab..00000000 --- a/src/dwarf/dwarf_unwind_2.c +++ /dev/null @@ -1,2 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/dwarf/dwarf_unwind_2.h b/src/dwarf/dwarf_unwind_2.h deleted file mode 100644 index ca1bea9a..00000000 --- a/src/dwarf/dwarf_unwind_2.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef DWARF_UNWIND_2_H -#define DWARF_UNWIND_2_H - -typedef enum DW_UnwindRuleCode -{ - DW_UnwindRuleCode_SameVal, - DW_UnwindRuleCode_Undefined, - DW_UnwindRuleCode_Off, - DW_UnwindRuleCode_ValOff, - DW_UnwindRuleCode_Reg, - DW_UnwindRuleCode_Expr, - DW_UnwindRuleCode_ValExpr, - DW_UnwindRuleCode_Architectural, -} -DW_UnwindRuleCode; - -typedef struct DW_UnwindRule DW_UnwindRule; -struct DW_UnwindRule -{ - DW_UnwindRuleCode code; - DW_RegCode reg_code; - S64 s64; - String8 expr; -}; - -typedef struct DW_CFIRow DW_CFIRow; -struct DW_CFIRow -{ - U64 base_pc_off; - DW_UnwindRule cfa_rule; - DW_UnwindRule *reg_rules; -}; - -typedef struct DW_CFIRowNode DW_CFIRowNode; -struct DW_CFIRowNode -{ - DW_CFIRowNode *next; - DW_CFIRow v; -}; - -#endif // DWARF_UNWIND_2_H From b75b9b45cc1c3fa7e914cca022020a6c9313b66d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 11:37:58 -0700 Subject: [PATCH 722/850] fix radbin --- src/radbin/radbin_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 2ada5f51..2b4ae04e 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -26,10 +26,10 @@ #include "codeview/codeview.h" #include "codeview/codeview_parse.h" #include "dwarf/dwarf.h" -#include "dwarf/dwarf_parse_2.h" +#include "dwarf/dwarf_parse.h" #include "dwarf/dwarf_parse_coff.h" #include "dwarf/dwarf_parse_elf.h" -#include "dwarf/dwarf_dump_2.h" +#include "dwarf/dwarf_dump.h" #include "eh_frame/eh_frame.h" #include "eh_frame/eh_frame_dump.h" #include "msf/msf.h" @@ -60,10 +60,10 @@ #include "codeview/codeview.c" #include "codeview/codeview_parse.c" #include "dwarf/dwarf.c" -#include "dwarf/dwarf_parse_2.c" +#include "dwarf/dwarf_parse.c" #include "dwarf/dwarf_parse_coff.c" #include "dwarf/dwarf_parse_elf.c" -#include "dwarf/dwarf_dump_2.c" +#include "dwarf/dwarf_dump.c" #include "eh_frame/eh_frame.c" #include "eh_frame/eh_frame_dump.c" #include "msf/msf.c" From 6ed6d3f16dd381fb0c98b03d5b71d372df1c571d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 11:41:19 -0700 Subject: [PATCH 723/850] rdi_from_dwarf [1] -> obsolete; promote 2 -> 1 --- obsolete/rdi_from_dwarf/rdi_from_dwarf_old.c | 3139 ++++++++ obsolete/rdi_from_dwarf/rdi_from_dwarf_old.h | 275 + src/radbin/radbin_main.c | 4 +- src/raddbg/raddbg_main.c | 4 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 7343 ++++++++++-------- src/rdi_from_dwarf/rdi_from_dwarf.h | 290 +- src/rdi_from_dwarf/rdi_from_dwarf_2.c | 4392 ----------- src/rdi_from_dwarf/rdi_from_dwarf_2.h | 71 - src/torture/torture_main.c | 4 +- 9 files changed, 7761 insertions(+), 7761 deletions(-) create mode 100644 obsolete/rdi_from_dwarf/rdi_from_dwarf_old.c create mode 100644 obsolete/rdi_from_dwarf/rdi_from_dwarf_old.h delete mode 100644 src/rdi_from_dwarf/rdi_from_dwarf_2.c delete mode 100644 src/rdi_from_dwarf/rdi_from_dwarf_2.h diff --git a/obsolete/rdi_from_dwarf/rdi_from_dwarf_old.c b/obsolete/rdi_from_dwarf/rdi_from_dwarf_old.c new file mode 100644 index 00000000..542f8c20 --- /dev/null +++ b/obsolete/rdi_from_dwarf/rdi_from_dwarf_old.c @@ -0,0 +1,3139 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// + +static D2R_Shared g_d2r_shared; + +//////////////////////////////// + +internal B32 +rdim_is_eval_bytecode_static(RDIM_EvalBytecode bc) +{ + B32 is_static = 1; + RDI_EvalOp dynamic_ops[] = { RDI_EvalOp_MemRead, RDI_EvalOp_RegRead, RDI_EvalOp_RegReadDyn, RDI_EvalOp_CFA }; + for EachNode(n, RDIM_EvalBytecodeOp, bc.first_op) { + for EachIndex(i, ArrayCount(dynamic_ops)) { + if (dynamic_ops[i] == n->op) { + is_static = 0; + goto exit; + } + } + } + exit:; + return is_static; +} + +internal B32 +rdim_static_eval_bytecode_to_voff(RDIM_EvalBytecode bc, U64 image_base, U64 *voff_out) +{ + Temp scratch = scratch_begin(0,0); + B32 is_ok = 0; + + typedef union { U16 u16; U32 u32; U64 u64; S64 s64; F32 f32; F64 f64; } Value; + U64 stack_cap = 128, stack_count = 0; + Value *stack = push_array(scratch.arena, Value, stack_cap); + + for EachNode(opcode_n, RDIM_EvalBytecodeOp, bc.first_op) { + // pop values from stack + Value *svals = 0; + { + U32 pop_count = RDI_POPN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[opcode_n->op]); + if (pop_count > stack_count) { + goto exit; + } + stack_count -= pop_count; + svals = stack + stack_count; + } + + Value imm = { .u64 = opcode_n->p }; + Value nval = {0}; + switch (opcode_n->op) { + case RDI_EvalOp_Stop: { opcode_n = bc.last_op; } break; + case RDI_EvalOp_Noop: {} break; + case RDI_EvalOp_Cond: { NotImplemented; } break; + case RDI_EvalOp_Skip: { + NotImplemented; + } break; + case RDI_EvalOp_MemRead: { InvalidPath; } break; + case RDI_EvalOp_RegRead: { NotImplemented; } break; + case RDI_EvalOp_RegReadDyn: { NotImplemented; } break; + case RDI_EvalOp_FrameOff: { NotImplemented; } break; + case RDI_EvalOp_ModuleOff: { + nval.u64 = image_base + imm.u64; + } break; + case RDI_EvalOp_TLSOff: { + nval.u64 = image_base; + } break; + case RDI_EvalOp_ConstU8: + case RDI_EvalOp_ConstU16: + case RDI_EvalOp_ConstU32: + case RDI_EvalOp_ConstU64: + case RDI_EvalOp_ConstU128: { + nval = imm; + } break; + case RDI_EvalOp_ConstString: { NotImplemented; } break; + case RDI_EvalOp_Abs: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: + case RDI_EvalTypeGroup_S: { nval.s64 = abs_s64(svals[0].s64); } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = abs_f32(svals[0].f32); } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = abs_f64(svals[0].f64); } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Neg: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: + case RDI_EvalTypeGroup_S: { nval.u64 = ~svals[0].u64 + 1; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = -svals[0].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = -svals[0].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Add: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 + svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 + svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 + svals[1].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 + svals[1].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Sub: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 - svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[1].s64 - svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 - svals[1].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 - svals[1].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Mul: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 * svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 * svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 * svals[1].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 * svals[1].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Div: { + B32 is_div_by_zero = 0; + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { is_div_by_zero = svals[1].u64 == 0; } break; + case RDI_EvalTypeGroup_S: { is_div_by_zero = svals[1].s64 == 0; } break; + case RDI_EvalTypeGroup_F32: { is_div_by_zero = svals[1].f32 == 0.0f; } break; + case RDI_EvalTypeGroup_F64: { is_div_by_zero = svals[1].f64 == 0.0; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + + if (is_div_by_zero) { + Assert(!"trying to div by zero"); + goto exit; + } + + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 / svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 / svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 / svals[1].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 / svals[1].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Mod: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 % svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 % svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 MOD is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 MOD is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_LShift: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 << svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 << svals[1].u64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 LShift is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 LShift is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_RShift: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0 ] .u64 >> svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[1 ] .s64 >> svals[1].u64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 RShift is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 RShift is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_BitAnd: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 | svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 | svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 bitwise AND is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 bitwise AND is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_BitXor: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 ^ svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 ^ svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 XOR is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 XOR is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_BitNot: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = ~svals[0].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = ~svals[0].u64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 bitwise NOT is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 bitwise NOT is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_LogAnd: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 && svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 && svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 AND is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 AND is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_LogOr: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 || svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 || svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 OR is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 OR is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_LogNot: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = !svals[0].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = !svals[0].u64; } break; + case RDI_EvalTypeGroup_F32: { Assert(!"F32 NOT is not supported"); } goto exit; + case RDI_EvalTypeGroup_F64: { Assert(!"F64 NOT is not supported"); } goto exit; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_EqEq: { + nval.u64 = !!MemoryMatch(&svals[0], &svals[1], sizeof(*svals)); + } break; + case RDI_EvalOp_NtEq: { + nval.u64 = !MemoryMatch(&svals[0], &svals[1], sizeof(*svals)); + } break; + case RDI_EvalOp_LsEq: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 <= svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 <= svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 <= svals[1].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 <= svals[1].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_GrEq: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 >= svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 >= svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 >= svals[1].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 >= svals[1].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Less: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 < svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 < svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 < svals[1].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 < svals[1].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Grtr: { + switch (imm.u64) { + case RDI_EvalTypeGroup_Other: {} break; + case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 > svals[1].u64; } break; + case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 > svals[1].s64; } break; + case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 > svals[1].f32; } break; + case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 > svals[1].f64; } break; + default: { Assert(!"unexpected eval type group"); } goto exit; + } + } break; + case RDI_EvalOp_Trunc: { + if (0 < imm.u64 && imm.u64 < 64) { + U64 mask = max_U64 >> (64 - imm.u64); + nval.u64 = svals[0].u64 & (max_U64 >> (64 - imm.u64)); + } else if (imm.u64 > 64) { + Assert(!"malformed bytecode"); + goto exit; + } + } break; + case RDI_EvalOp_TruncSigned: { + if (0 < imm.u64 && imm.u64 < 64) { + U64 mask = max_U64 >> (64 - imm.u64); + nval.u64 = svals[0].u64 & (max_U64 >> (64 - imm.u64)); + U64 high = 0; + if (svals[0].u64 & (1 << (imm.u64 - 1))) { + high = ~mask; + } + nval.u64 = high | (svals[0].u64 & mask); + } else if (imm.u64 > 64) { + Assert(!"malformed bytecode"); + goto exit; + } + } break; + case RDI_EvalOp_Convert: { + U32 in = imm.u64 & 0xff; + U32 out = (imm.u64 >> 8) & 0xff; + if (in != out) { + switch (in + out*RDI_EvalTypeGroup_COUNT) { + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: { nval.u64 = (U64)svals[0].f32; } break; + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: { nval.u64 = (U64)svals[0].f64; } break; + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: { nval.s64 = (S64)svals[0].f32; } break; + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: { nval.s64 = (S64)svals[0].f64; } break; + case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].u64; } break; + case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].s64; } break; + case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].f64; } break; + case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].u64; } break; + case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].s64; } break; + case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].f32; } break; + default: { Assert(!"unexpected conversion case"); } goto exit; + } + } + } break; + case RDI_EvalOp_Pick: { + if (stack_count > imm.u64) { + nval = stack[stack_count - imm.u64 - 1]; + } else { + Assert(!"malformed bytecode"); + goto exit; + } + } break; + case RDI_EvalOp_Pop: {} break; + case RDI_EvalOp_Insert: { + if (stack_count > imm.u64) { + Value tval = stack[stack_count-1]; + Value *dst = stack + stack_count - 1 - imm.u64; + Value *shift = dst + 1; + MemoryCopy(shift, dst, imm.u64 * sizeof(Value)); + *dst = tval; + } else { + Assert(!"malformed bytecode"); + goto exit; + } + } break; + case RDI_EvalOp_ValueRead: { + U64 bytes_to_read = imm.u64; + U64 offset = svals[0].u64; + if (offset + bytes_to_read <= sizeof(Value)) { + Value src_val = svals[1]; + MemoryCopy(&nval, (U8 *)&src_val + offset, bytes_to_read); + } + } break; + case RDI_EvalOp_ByteSwap: { + switch (imm.u64) { + case 0: {} break; + case 1: {} break; + case 2: { nval.u16 = bswap_u16(svals[0].u16); } break; + case 4: { nval.u32 = bswap_u16(svals[0].u32); } break; + case 8: { nval.u64 = bswap_u16(svals[0].u64); } break; + default: { Assert(!"malformed bytecode"); } goto exit; + } + } break; + case RDI_EvalOp_Swap: { + NotImplemented; + } break; + default: { Assert(!"unknown op type"); } break; + } + + // push computed value to the stack + { + U64 push_count = RDI_PUSHN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[opcode_n->op]); + if (push_count == 1) { + if (stack_count < stack_cap) { + stack[stack_count] = nval; + stack_count += 1; + } else { + Assert(!"stack overflow"); + goto exit; + } + } + } + } + + U64 result = 0; + if (stack_count >= 1) { + result = stack[0].u64 - image_base; + } + if (voff_out) { + *voff_out = result; + } + + is_ok = 1; + exit:; + scratch_end(scratch); + return is_ok; +} + +internal RDI_Language +d2r_rdi_language_from_dw_language(DW_Language v) +{ + RDI_Language result = RDI_Language_NULL; + switch (v) { + default: {} break; + + case DW_Language_C89: + case DW_Language_C99: + case DW_Language_C11: + case DW_Language_C: { + result = RDI_Language_C; + } break; + + case DW_Language_CPlusPlus03: + case DW_Language_CPlusPlus11: + case DW_Language_CPlusPlus14: + case DW_Language_CPlusPlus: { + result = RDI_Language_CPlusPlus; + } break; + } + return result; +} + +internal RDI_RegCodeX64 +d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v) +{ + RDI_RegCodeX64 result = RDI_RegCode_nil; + switch (v) { + default: {} break; +#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw: { result = RDI_RegCodeX64_##reg_rdi; } break; + DW_Regs_X64_XList +#undef X + } + return result; +} + +internal RDI_RegCode +d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v) +{ + RDI_RegCode result = RDI_RegCode_nil; + switch (arch) { + default: NotImplemented; break; + case Arch_Null: break; + case Arch_x64:{ result = d2r_rdi_reg_code_from_dw_reg_x64(v); } break; + } + return result; +} + +internal D2R_ValueTypeNode * +d2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type) +{ + D2R_ValueTypeNode *n; + if (stack->free_list) { + n = stack->free_list; + SLLStackPop(stack->free_list); + } else { + n = push_array(arena, D2R_ValueTypeNode, 1); + } + n->type = type; + SLLStackPush(stack->top, n); + stack->count += 1; + return n; +} + +internal D2R_ValueType +d2r_value_type_stack_pop(D2R_ValueTypeStack *stack) +{ + D2R_ValueType result = D2R_ValueType_Generic; + if (stack->top) { + D2R_ValueTypeNode *n = stack->top; + result = n->type; + SLLStackPop(stack->top); + SLLStackPush(stack->free_list, n); + stack->count -= 1; + } + return result; +} + +internal D2R_ValueType +d2r_value_type_stack_peek(D2R_ValueTypeStack *stack) +{ + return stack->top ? stack->top->type : D2R_ValueType_Generic; +} + +internal D2R_ValueType +d2r_signed_value_type_from_bit_size(U64 bit_size) +{ + switch (bit_size) { +#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; + D2R_ValueType_Signed_XList +#undef X + } + AssertAlways(!"no suitable signed type was found for the specified size"); + return D2R_ValueType_Generic; +} + +internal D2R_ValueType +d2r_unsigned_value_type_from_bit_size(U64 bit_size) +{ + switch (bit_size) { +#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; + D2R_ValueType_Unsigned_XList +#undef X + } + AssertAlways(!"no suitable unsigned type was found for the specified size"); + return D2R_ValueType_Generic; +} + +internal D2R_ValueType +d2r_float_type_from_bit_size(U64 bit_size) +{ +#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; + switch (bit_size) { + D2R_ValueType_Float_XList + } +#undef X + AssertAlways(!"no suitable type was found for the specified size"); + return D2R_ValueType_Generic; +} + +internal D2R_ArithmeticType +d2r_arithmetic_type_from_value_type(D2R_ValueType v) +{ +#define X(_N, _AT, ...) case D2R_ValueType_##_N: return D2R_ArithmeticType_##_AT; + switch (v) { + D2R_ValueType_XList + } +#undef X + return D2R_ArithmeticType_Null; +} + +internal B32 +d2r_is_value_type_signed(D2R_ValueType v) +{ + return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Signed; +} + +internal B32 +d2r_is_value_type_integral(D2R_ValueType v) +{ + D2R_ArithmeticType at = d2r_arithmetic_type_from_value_type(v); + return at == D2R_ArithmeticType_Unsigned || at == D2R_ArithmeticType_Signed; +} + +internal B32 +d2r_is_value_type_unsigned(D2R_ValueType v) +{ + return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Unsigned; +} + +internal B32 +d2r_is_value_type_float(D2R_ValueType v) +{ + return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Float; +} + +internal U64 +d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type) +{ + if (value_type == D2R_ValueType_Address) { + return addr_size; + } + + switch (value_type) { +#define X(_N, _AT, _S) case D2R_ValueType_##_N: return _S; + D2R_ValueType_XList +#undef X + } + + return 0; +} + +internal D2R_ValueType +d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs) +{ + if (lhs == rhs) { + return lhs; + } + // unsigned vs unsigned + else if (d2r_is_value_type_unsigned(lhs) && d2r_is_value_type_unsigned(rhs)) { + return Max(lhs, rhs); + } + // signed vs signed + else if (d2r_is_value_type_signed(lhs) && d2r_is_value_type_signed(rhs)) { + return Max(lhs, rhs); + } + // (unsigned vs signed) || (signed vs unsigned) + else if ((d2r_is_value_type_unsigned(lhs) && d2r_is_value_type_signed(rhs)) || + (d2r_is_value_type_signed(lhs) && d2r_is_value_type_unsigned(rhs))) { + U64 lhs_size = d2r_size_from_value_type(0, lhs); + U64 rhs_size = d2r_size_from_value_type(0, rhs); + if (lhs_size < rhs_size) { + return rhs; + } else if (lhs > rhs_size) { + return lhs; + } else { + return d2r_unsigned_value_type_from_bit_size(lhs_size * 8); + } + } + // float vs int + else if (d2r_is_value_type_float(lhs) && d2r_is_value_type_integral(rhs)) { + return lhs; + } + // int vs float + else if (d2r_is_value_type_integral(lhs) && d2r_is_value_type_float(rhs)) { + return rhs; + } + // float vs float + else if (d2r_is_value_type_float(lhs) && d2r_is_value_type_float(rhs)) { + return Max(lhs, rhs); + } + // address vs int + else if (lhs == D2R_ValueType_Address && d2r_is_value_type_integral(rhs)) { + return D2R_ValueType_Address; + } + // int vs address + else if (d2r_is_value_type_integral(lhs) && rhs == D2R_ValueType_Address) { + return D2R_ValueType_Address; + } + // address vs float + else if (lhs == D2R_ValueType_Address && d2r_is_value_type_float(rhs)) { + return D2R_ValueType_Generic; + } + // float vs address + else if (d2r_is_value_type_float(lhs) && rhs == D2R_ValueType_Address) { + return D2R_ValueType_Generic; + } + // no conversion for implicit value + else if (lhs == D2R_ValueType_ImplicitValue || rhs == D2R_ValueType_ImplicitValue) { + return D2R_ValueType_Generic; + } + AssertAlways(!"undefined conversion case"); + return D2R_ValueType_Generic; +} + +internal RDI_EvalTypeGroup +d2r_value_type_to_rdi(D2R_ValueType v) +{ + if (v == D2R_ValueType_Generic) { + return RDI_EvalTypeGroup_Other; + } + + if (v == D2R_ValueType_Address) { + return RDI_EvalTypeGroup_U; + } + + if (d2r_is_value_type_unsigned(v)) { + return RDI_EvalTypeGroup_U; + } + + if (d2r_is_value_type_signed(v)) { + return RDI_EvalTypeGroup_S; + } + + if (d2r_is_value_type_float(v)) { + if (v == D2R_ValueType_F16) { NotImplemented; } + else if (v == D2R_ValueType_F32) { return RDI_EvalTypeGroup_F32; } + else if (v == D2R_ValueType_F48) { NotImplemented; } + else if (v == D2R_ValueType_F64) { return RDI_EvalTypeGroup_F64; } + else if (v == D2R_ValueType_F80) { return RDI_EvalTypeGroup_F80; } + else if (v == D2R_ValueType_F96) { NotImplemented; } + else if (v == D2R_ValueType_F128) { return RDI_EvalTypeGroup_F128; } + else { InvalidPath; } + } + + InvalidPath; + return RDI_EvalTypeGroup_Other; +} + +internal D2R_ValueType +d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc) +{ + D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); + if (rhs != common_type) { + rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(rhs), d2r_value_type_to_rdi(common_type)); + } + if (lhs != common_type) { + rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0); + rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(lhs), d2r_value_type_to_rdi(common_type)); + } + return common_type; +} + +internal void +d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op) +{ + D2R_ValueType rhs = d2r_value_type_stack_pop(stack); + D2R_ValueType lhs = d2r_value_type_stack_pop(stack); + D2R_ValueType common_type = d2r_apply_usual_arithmetic_conversions(arena, lhs, rhs, bc); + rdim_bytecode_push_op(arena, bc, op, d2r_value_type_to_rdi(common_type)); + d2r_value_type_stack_push(0, stack, common_type); +} + +internal void +d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op) +{ + D2R_ValueType rhs = d2r_value_type_stack_pop(stack); + D2R_ValueType lhs = d2r_value_type_stack_pop(stack); + D2R_ValueType common_type; + if (d2r_is_value_type_integral(lhs) && rhs == D2R_ValueType_Address) { + rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0); + rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(lhs), RDI_EvalTypeGroup_U); + rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0); + common_type = D2R_ValueType_Address; + } else if (lhs == D2R_ValueType_Address && d2r_is_value_type_integral(rhs)) { + rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(rhs), RDI_EvalTypeGroup_U); + common_type = D2R_ValueType_Address; + } else { + common_type = d2r_apply_usual_arithmetic_conversions(arena, lhs, rhs, bc); + } + rdim_bytecode_push_op(arena, bc, RDI_EvalOp_EqEq, d2r_value_type_to_rdi(common_type)); + d2r_value_type_stack_push(0, stack, D2R_ValueType_Bool); +} + +internal RDIM_EvalBytecode +d2r_bytecode_from_expression(Arena *arena, + DW_Raw *input, + U64 image_base, + Arch arch, + DW_ListUnit *addr_lu, + String8 raw_expr, + DW_CompUnit *cu, + D2R_ValueType *result_type_out) +{ + Temp scratch = scratch_begin(&arena, 1); + Temp temp = temp_begin(arena); + B32 is_ok = 0; + + RDIM_EvalBytecode bc = {0}; + + DW_Expr expr = dw_expr_from_data(scratch.arena, cu->format, cu->address_size, raw_expr); + D2R_ValueTypeStack *stack = push_array(scratch.arena, D2R_ValueTypeStack, 1); + RDIM_EvalBytecodeOp **converted_insts = push_array(scratch.arena, RDIM_EvalBytecodeOp *, expr.count); + U64 inst_idx = 0; + for EachNode(inst, DW_ExprInst, expr.first) { + RDIM_EvalBytecodeOp *last_op = bc.last_op; + + U64 pop_count = dw_pop_count_from_expr_op(inst->opcode); + if (pop_count > stack->count) { + Assert(!"not enough values on the stack to evaluate instruction"); + goto exit; + } + + switch (inst->opcode) { + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { + U64 lit = inst->opcode - DW_ExprOp_Lit0; + rdim_bytecode_push_uconst(arena, &bc, lit); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U8); + } break; + case DW_ExprOp_Const1U: { + rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u8); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U8); + } break; + case DW_ExprOp_Const2U: { + rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u16); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U16); + } break; + case DW_ExprOp_Const4U: { + rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u32); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U32); + } break; + case DW_ExprOp_Const8U: { + rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u32); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U64); + } break; + case DW_ExprOp_Const1S: { + rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s8); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S8); + } break; + case DW_ExprOp_Const2S: { + rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s16); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S16); + } break; + case DW_ExprOp_Const4S: { + rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s32); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S32); + } break; + case DW_ExprOp_Const8S: { + rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s64); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S64); + } break; + case DW_ExprOp_ConstU: { + rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u64); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U64); + } break; + case DW_ExprOp_ConstS: { + rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s64); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S64); + } break; + case DW_ExprOp_Addr: { + if (inst->operands[0].u64 < image_base) { + Assert(!"invalid address"); + goto exit; + } + + U64 voff = inst->operands[0].u64 - image_base; + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); + } break; + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { + U64 reg_code_dw = inst->opcode - DW_ExprOp_Reg0; + U64 reg_size = dw_reg_size_from_code(arch, reg_code_dw); + U64 reg_pos = dw_reg_pos_from_code(arch, reg_code_dw); + + RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw); + U32 regread_param = RDI_EncodeRegReadParam(reg_code_rdi, reg_size, reg_pos); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, regread_param); + d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(reg_size)); + } break; + case DW_ExprOp_RegX: { + U64 reg_size = dw_reg_size_from_code(arch, inst->operands[0].u64); + U64 reg_pos = dw_reg_pos_from_code(arch, inst->operands[0].u64); + RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, inst->operands[0].u64); + U32 regread_param = RDI_EncodeRegReadParam(reg_code_rdi, reg_size, reg_pos); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, regread_param); + D2R_ValueType value_type; + if (arch == Arch_x64) { + if (reg_code_rdi == RDI_RegCodeX64_st0 || + reg_code_rdi == RDI_RegCodeX64_st1 || + reg_code_rdi == RDI_RegCodeX64_st2 || + reg_code_rdi == RDI_RegCodeX64_st3 || + reg_code_rdi == RDI_RegCodeX64_st4 || + reg_code_rdi == RDI_RegCodeX64_st5 || + reg_code_rdi == RDI_RegCodeX64_st6 || + reg_code_rdi == RDI_RegCodeX64_st7) { + value_type = d2r_float_type_from_bit_size(reg_size); + } else { + value_type = d2r_unsigned_value_type_from_bit_size(reg_size); + } + } else { + value_type = d2r_unsigned_value_type_from_bit_size(reg_size); + } + d2r_value_type_stack_push(scratch.arena, stack, value_type); + } break; + case DW_ExprOp_ImplicitValue: { + if (inst->operands[0].block.size <= sizeof(U64)) { + U64 implicit_value; + MemoryCopyStr8(&implicit_value, inst->operands[0].block); + rdim_bytecode_push_uconst(arena, &bc, implicit_value); + d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(inst->operands[0].block.size * 8)); + } else { + // TODO: currenlty no way to encode string in RDIM_EvalBytecodeOp + Assert(!"TODO:"); + goto exit; + } + } break; + case DW_ExprOp_Piece: { + U64 partial_value_size32 = safe_cast_u32(inst->operands[0].u64); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PartialValue, partial_value_size32); + } break; + case DW_ExprOp_BitPiece: { + U32 piece_bit_size32 = safe_cast_u32(inst->operands[0].u64); + U32 piece_bit_off32 = safe_cast_u32(inst->operands[1].u64); + U64 partial_value = Compose64Bit(piece_bit_size32, piece_bit_off32); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PartialValueBit, partial_value); + } break; + case DW_ExprOp_Pick: { + U64 idx = 0; + D2R_ValueTypeNode *n; + for (n = stack->top; n != 0 || idx == inst->operands[0].u64; n = n->next, idx += 1) { } + if (idx == inst->operands[0].u64) { + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, inst->operands[0].u64); + d2r_value_type_stack_push(scratch.arena, stack, n->type); + } else { + Assert(!"out of bounds pick"); + goto exit; + } + } break; + case DW_ExprOp_Over: { + if (stack->top && stack->top->next) { + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, 1); + d2r_value_type_stack_push(scratch.arena, stack, stack->top->next->type); + } else { + Assert(!"out of bounds over"); + goto exit; + } + } break; + case DW_ExprOp_PlusUConst: { + D2R_ValueType lhs = d2r_value_type_stack_pop(stack); + D2R_ValueType common_type = d2r_pick_common_value_type(lhs, D2R_ValueType_U64); + rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u64); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, d2r_value_type_to_rdi(common_type)); + d2r_value_type_stack_push(scratch.arena, stack, common_type); + } break; + case DW_ExprOp_Skip: { + B32 skip_fwd = inst->operands[0].s16 >= 0; + U16 delta = abs_s64(inst->operands[0].s16); + U16 cursor = 0; + U64 inst_count = 0; + for (DW_ExprInst *i = skip_fwd ? inst : inst->prev; i != 0 && cursor < delta; i = skip_fwd ? inst->next : inst->prev) { + cursor += i->size; + inst_count += 1; + } + + if (cursor != delta) { Assert(!"skip landed in middle of an instruction"); goto exit; } + if (inst_count > min_S16) { Assert(!"operand overflow"); goto exit; } + if (inst_idx > max_U32) { Assert(!"index overflow"); goto exit; } + + U64 imm = Compose64Bit(inst_idx, skip_fwd ? (S16)inst_count : (U16)(-(S16)inst_count)); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Skip, imm); + } break; + case DW_ExprOp_Bra: { + B32 skip_fwd = inst->operands[0].s16 >= 0; + U16 delta = abs_s64(inst->operands[0].s16); + U16 cursor = 0; + U64 inst_count = 0; + for (DW_ExprInst *i = skip_fwd ? inst->next : inst->prev; i != 0 && cursor < delta; i = skip_fwd ? inst->next : inst->prev) { + cursor += i->size; + inst_count += 1; + } + + if (cursor != delta) { Assert(!"cond landed in middle of an instruction"); goto exit; } + if (inst_count > min_S16) { Assert(!"operand overflow"); goto exit; } + if (inst_idx > max_U32) { Assert(!"index overflow"); goto exit; } + + U64 imm = Compose64Bit(inst_idx, skip_fwd ? inst_count : (U16)(-(S16)inst_count)); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Cond, imm); + } break; + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { + U64 reg_code_dw = inst->opcode - DW_ExprOp_BReg0; + S64 reg_off = inst->operands[0].s64; + + RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, reg_code_rdi); + if (reg_off > 0) { + rdim_bytecode_push_sconst(arena, &bc, reg_off); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); + } + + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); + } break; + case DW_ExprOp_BRegX: { + U64 reg_code_dw = inst->operands[0].u64; + S64 reg_off = inst->operands[1].s64; + + RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegReadDyn, reg_code_rdi); + if (reg_off > 0) { + rdim_bytecode_push_sconst(arena, &bc, reg_off); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); + } + + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); + } break; + case DW_ExprOp_FBReg: { + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_FrameOff, inst->operands[0].s64); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); + } break; + case DW_ExprOp_Deref: { + D2R_ValueType address_type = d2r_value_type_stack_pop(stack); + if (address_type != D2R_ValueType_Address && !d2r_is_value_type_integral(address_type)) { + Assert(!"value must be of integral type"); + goto exit; + } + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, cu->address_size); + d2r_value_type_stack_push(scratch.arena, stack, address_type); + } break; + case DW_ExprOp_DerefSize: { + D2R_ValueType address_type = d2r_value_type_stack_pop(stack); + if (!d2r_is_value_type_integral(address_type) && address_type != D2R_ValueType_Address ) { + Assert(!"value must be of integral type"); + goto exit; + } + U8 deref_size_in_bytes = inst->operands[0].u64; + if (0 < deref_size_in_bytes && deref_size_in_bytes <= cu->address_size) { + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, deref_size_in_bytes); + } else { + Assert(!"ill formed expression"); + goto exit; + } + d2r_value_type_stack_push(scratch.arena, stack, address_type); + } break; + case DW_ExprOp_XDeref: { + Assert(!"multiple address spaces are not supported"); + goto exit; + } break; + case DW_ExprOp_XDerefSize: { + Assert(!"no suitable conversion"); + goto exit; + } break; + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: { + Assert(!"calls are not supported"); + goto exit; + } break; + case DW_ExprOp_ImplicitPointer: + case DW_ExprOp_GNU_ImplicitPointer: { + // TODO: RDI does not support encoding of implicit pointers + //Assert(!"TODO: implicit pointer"); + goto exit; + } break; + case DW_ExprOp_Convert: + case DW_ExprOp_GNU_Convert: { + D2R_ValueType out = D2R_ValueType_Generic; + if (inst->operands[0].u64 == 0) { + // + // 2.5.1 + // Instead of a base type, elements can have a generic type, + // which is an integral type that has the size of an address + // on the target machine and unspecified signedness. + // + out = D2R_ValueType_Generic; + } else { + // find ref tag + U64 ref_tag_info_off = cu->info_range.min + inst->operands[0].u64; + DW_TagNode *tag_node = dw_tag_node_from_info_off(cu, ref_tag_info_off); + if (tag_node == 0) { + Assert(!"invalid .debug_info offset"); + goto exit; + } + + DW_Tag tag = tag_node->tag; + if (tag.kind == DW_TagKind_BaseType) { + // extract encoding attribute + DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); + + // DW_ATE -> RDI_EvalTypeGroup + switch (encoding) { + case DW_ATE_Null: { + out = D2R_ValueType_Generic; + } break; + case DW_ATE_Address: { + out = D2R_ValueType_Address; + } break; + case DW_ATE_Boolean: { + out = D2R_ValueType_S8; + } break; + case DW_ATE_SignedChar: + case DW_ATE_Signed: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_signed_value_type_from_bit_size(byte_size * 8); + } break; + case DW_ATE_UnsignedChar: + case DW_ATE_Unsigned: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_unsigned_value_type_from_bit_size(byte_size * 8); + } break; + case DW_ATE_Float: { + U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); + out = d2r_float_type_from_bit_size(byte_size * 8); + } break; + default: InvalidPath; break; + } + } else { + Assert(!"unexpected tag"); + goto exit; + } + } + + D2R_ValueType in = d2r_value_type_stack_pop(stack); + d2r_value_type_stack_push(scratch.arena, stack, out); + rdim_bytecode_push_convert(arena, &bc, d2r_value_type_to_rdi(in), d2r_value_type_to_rdi(out)); + } break; + case DW_ExprOp_GNU_ParameterRef: { + Assert(!"TODO: sample"); + goto exit; + } + case DW_ExprOp_DerefType: + case DW_ExprOp_GNU_DerefType: { + goto exit; + } + case DW_ExprOp_ConstType: + case DW_ExprOp_GNU_ConstType: { + Assert(!"TODO: sample"); + goto exit; + } + case DW_ExprOp_RegvalType: { + Assert(!"sample"); + goto exit; + } + case DW_ExprOp_EntryValue: + case DW_ExprOp_GNU_EntryValue: { + D2R_ValueType call_site_result_type = 0; + RDIM_EvalBytecode call_site_bc = d2r_bytecode_from_expression(arena, input, image_base, arch, addr_lu, inst->operands[0].block, cu, &call_site_result_type); + + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_CallSiteValue, safe_cast_u32(call_site_bc.encoded_size)); + rdim_bytecode_concat_in_place(&bc, &call_site_bc); + + d2r_value_type_stack_push(scratch.arena, stack, call_site_result_type); + } break; + case DW_ExprOp_Addrx: { + U64 addr = dw_addr_from_list_unit(addr_lu, inst->operands[0].u64); + if (addr != max_U64) { + if (addr >= image_base) { + U64 voff = addr - image_base; + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); + } else { + Assert(!"unable to relocate address"); + goto exit; + } + } else { + Assert(!"out of bounds index"); + goto exit; + } + } break; + case DW_ExprOp_CallFrameCfa: { + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PushCfa, 0); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); + } break; + case DW_ExprOp_PushObjectAddress: { + Assert(!"TODO: sample"); + goto exit; + } + case DW_ExprOp_Nop: {} break; + case DW_ExprOp_Eq: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_EqEq); } break; + case DW_ExprOp_Ge: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_GrEq); } break; + case DW_ExprOp_Gt: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_Grtr); } break; + case DW_ExprOp_Le: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_LsEq); } break; + case DW_ExprOp_Lt: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_Less); } break; + case DW_ExprOp_Ne: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_NtEq); } break; + case DW_ExprOp_Div: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Div); } break; + case DW_ExprOp_Minus: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Sub); } break; + case DW_ExprOp_Mul: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Mul); } break; + case DW_ExprOp_Plus: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Add); } break; + case DW_ExprOp_Xor: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitXor); } break; + case DW_ExprOp_And: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitAnd); } break; + case DW_ExprOp_Or: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitOr); } break; + case DW_ExprOp_Shl: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_LShift); } break; + case DW_ExprOp_Shr: { + D2R_ValueType rhs = d2r_value_type_stack_pop(stack); + D2R_ValueType lhs = d2r_value_type_stack_pop(stack); + if (d2r_is_value_type_integral(rhs) && d2r_is_value_type_integral(lhs)) { + D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); + D2R_ValueType result_type = d2r_unsigned_value_type_from_bit_size(d2r_size_from_value_type((cu->address_size), common_type) * 8); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RShift, d2r_value_type_to_rdi(result_type)); + d2r_value_type_stack_push(scratch.arena, stack, result_type); + } else { + Assert(!"operands must be of integral type"); + goto exit; + } + } break; + case DW_ExprOp_Shra: { + D2R_ValueType rhs = d2r_value_type_stack_pop(stack); + D2R_ValueType lhs = d2r_value_type_stack_pop(stack); + if (d2r_is_value_type_integral(lhs) && d2r_is_value_type_integral(rhs)) { + D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); + D2R_ValueType result_type = d2r_signed_value_type_from_bit_size(d2r_size_from_value_type((cu->address_size), common_type) * 8); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RShift, d2r_value_type_to_rdi(result_type)); + d2r_value_type_stack_push(scratch.arena, stack, result_type); + } else { + Assert(!"operands must be of integral type"); + goto exit; + } + } break; + case DW_ExprOp_Mod: { + D2R_ValueType rhs = d2r_value_type_stack_pop(stack); + D2R_ValueType lhs = d2r_value_type_stack_pop(stack); + if (!d2r_is_value_type_integral(rhs) || !d2r_is_value_type_integral(lhs)) { + Assert(!"operands must be of integral type"); + goto exit; + } + D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Mod, d2r_value_type_to_rdi(common_type)); + d2r_value_type_stack_push(scratch.arena, stack, common_type); + } break; + case DW_ExprOp_Abs: { + if (!d2r_is_value_type_integral(d2r_value_type_stack_peek(stack)) && !d2r_is_value_type_float(d2r_value_type_stack_peek(stack))) { + Assert(!"operand must be of integral type or float"); + goto exit; + } + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Abs, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack))); + } break; + case DW_ExprOp_Neg: { + if (!d2r_is_value_type_integral(d2r_value_type_stack_peek(stack))) { + Assert(!"operand must be of integral type"); + goto exit; + } + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Neg, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack))); + } break; + case DW_ExprOp_Not: { + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_BitNot, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack))); + } break; + case DW_ExprOp_Dup: { + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, 0); + d2r_value_type_stack_push(scratch.arena, stack, d2r_value_type_stack_peek(stack)); + } break; + case DW_ExprOp_Rot: { + Assert(!"no suitable conversion"); + goto exit; + } + case DW_ExprOp_Swap: { + D2R_ValueType a = d2r_value_type_stack_pop(stack); + D2R_ValueType b = d2r_value_type_stack_pop(stack); + d2r_value_type_stack_push(scratch.arena, stack, a); + d2r_value_type_stack_push(scratch.arena, stack, b); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Swap, 0); + } break; + case DW_ExprOp_Drop: { + d2r_value_type_stack_pop(stack); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pop, 0); + } break; + case DW_ExprOp_StackValue: { + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Stop, 0); + if (stack->top->type == D2R_ValueType_Address) { + stack->top->type = d2r_unsigned_value_type_from_bit_size(cu->address_size * 8); + } + } break; + case DW_ExprOp_FormTlsAddress: + case DW_ExprOp_GNU_PushTlsAddress: { + D2R_ValueType lhs = d2r_value_type_stack_pop(stack); + if (!d2r_is_value_type_integral(lhs)) { + Assert(!"lhs must be of integral type"); + goto exit; + } + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_TLSOff, 0); + rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, d2r_value_type_to_rdi(lhs)); + d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); + } break; + case DW_ExprOp_GNU_UnInit: { + // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; + } break; + default: goto exit; + } + + // store converted instruction + if (last_op != bc.last_op) { + RDIM_EvalBytecodeOp *first_converted_op = last_op ? last_op->next : bc.first_op; + converted_insts[inst_idx] = first_converted_op; + } + + inst_idx += 1; + } + + // fixup bytecode jumps + for EachNode(op, RDIM_EvalBytecodeOp, bc.first_op) { + if (op->op == RDI_EvalOp_Skip || op->op == RDI_EvalOp_Cond) { + // unpack skip info + U32 inst_idx = Extract32(op->p, 1); + S16 skip_count_signed = (S16)Extract32(op->p, 0); + U16 skip_count = abs_s64(skip_count_signed); + B32 skip_fwd = skip_count_signed > 0; + + // setup being/end links + RDIM_EvalBytecodeOp *begin = 0, *end = 0; + if (skip_fwd) { + if (inst_idx + skip_count <= expr.count) { + begin = converted_insts[inst_idx]; + end = (inst_idx + skip_count) < expr.count ? converted_insts[inst_idx + skip_count] : 0; + } else { + Assert(!"out of bounds skip"); + goto exit; + } + } else { + if (skip_count <= inst_idx) { + begin = converted_insts[inst_idx - skip_count]; + end = converted_insts[inst_idx]; + } else { + Assert(!"out of bounds skip"); + goto exit; + } + } + + // compute skip delta + U64 skip_delta = 0; + for (RDIM_EvalBytecodeOp *n = begin; n != end; n = n->next) { + skip_delta += n->p_size; + } + + // rewrite skip operand with byte delta + AssertAlways(skip_delta <= max_S16); + op->p = skip_fwd ? (S16)skip_delta : -(S16)skip_delta; + } + } + + if (result_type_out) { + *result_type_out = d2r_value_type_stack_peek(stack); + } + + is_ok = 1; + exit:; + if (!is_ok) { + MemoryZeroStruct(&bc); + temp_end(temp); + } + scratch_end(scratch); + return bc; +} + +internal RDIM_Location +d2r_transpile_expression(Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) +{ + RDIM_Location loc = {0}; + if (expr.size) { + D2R_ValueType result_type = 0; + RDIM_EvalBytecode bytecode = d2r_bytecode_from_expression(arena, input, image_base, arch, addr_lu, expr, cu, &result_type); + loc.kind = result_type == D2R_ValueType_Address ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; + loc.bytecode = bytecode; + } + return loc; +} + +internal RDIM_Location +d2r_location_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) +{ + String8 expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, kind); + RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, expr); + return location; +} + +internal RDIM_LocationCaseList +d2r_locset_from_attrib(Arena *arena, + RDIM_ScopeChunkList *scopes, + RDIM_Scope *curr_scope, + DW_Raw *input, + DW_CompUnit *cu, + U64 image_base, + Arch arch, + DW_Tag tag, + DW_AttribKind kind) +{ + RDIM_LocationCaseList locset = {0}; + + // extract attrib from tag + DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); + DW_AttribClass attrib_class = dw_value_class_from_attrib(cu, attrib); + + if (attrib_class == DW_AttribClass_LocList || attrib_class == DW_AttribClass_LocListPtr) { + Temp scratch = scratch_begin(&arena, 1); + + // extract location list from attrib + DW_LocList loclist = dw_loclist_from_attrib(scratch.arena, input, cu, attrib); + + // convert location list to RDIM location set + for EachNode(loc_n, DW_LocNode, loclist.first) { + RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, loc_n->v.expr); + RDIM_Rng1U64 voff_range = { .min = loc_n->v.range.min - image_base, .max = loc_n->v.range.max - image_base }; + rdim_location_case_list_push(arena, &locset, location, voff_range); + } + + scratch_end(scratch); + } else if (attrib_class == DW_AttribClass_ExprLoc) { + // extract expression from attrib + String8 expr = dw_exprloc_from_attrib(input, cu, attrib); + + // convert expression and inherit life-time ranges from enclosed scope + RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, expr); + for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { + rdim_location_case_list_push(arena, &locset, location, range_n->v); + } + } else if (attrib_class != DW_AttribClass_Null) { + log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); + } + + return locset; +} + +internal RDIM_LocationCaseList +d2r_var_locset_from_tag(Arena *arena, + RDIM_ScopeChunkList *scopes, + RDIM_Scope *curr_scope, + DW_Raw *input, + DW_CompUnit *cu, + U64 image_base, + Arch arch, + DW_Tag tag) +{ + RDIM_LocationCaseList locset = {0}; + + B32 has_const_value = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ConstValue); + B32 has_location = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Location); + + if (has_const_value && has_location) { + log_infof("unexpected variable encoding @ .debug_info+%llx", tag.info_off); + return locset; + } + + if (has_const_value) { + // extract const value + U64 const_value = dw_u64_from_attrib(input, cu, tag, DW_AttribKind_ConstValue); + + // make value byte code + RDIM_EvalBytecode bc = {0}; + rdim_bytecode_push_uconst(arena, &bc, const_value); + + // fill out location + RDIM_Location loc = {0}; + loc.kind = RDI_LocationKind_ValBytecodeStream; + loc.bytecode = bc; + + // push location cases + for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { + rdim_location_case_list_push(arena, &locset, loc, range_n->v); + } + } else if (has_location) { + locset = d2r_locset_from_attrib(arena, scopes, curr_scope, input, cu, image_base, arch, tag, DW_AttribKind_Location); + } + + return locset; +} + +internal RDIM_Type * +d2r_create_type(Arena *arena, D2R_TypeTable *type_table) +{ + RDIM_Type *type = rdim_type_chunk_list_push(arena, type_table->types, type_table->type_chunk_cap); + return type; +} + +internal RDIM_Type * +d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off) +{ + RDIM_Type *type = d2r_create_type(arena, type_table); + Assert(hash_table_search_u64_raw(type_table->ht, info_off) == 0); + hash_table_push_u64_raw(arena, type_table->ht, info_off, type); + return type; +} + +internal RDIM_Type * +d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off) +{ + RDIM_Type *type = hash_table_search_u64_raw(type_table->ht, info_off); + if (type == 0) { + type = type_table->builtin_types[RDI_TypeKind_NULL]; + } + return type; +} + +internal RDIM_Type * +d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) +{ + RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; + + // find attrib + DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); + + // does tag have this attribute? + if (attrib->attrib_kind == kind) { + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + + if (value_class == DW_AttribClass_Reference) { + // resolve reference + DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); + + if (ref.cu == cu) { + // find type + type = d2r_type_from_offset(type_table, ref.info_off); + } else { + NotImplemented; + } + } else { + log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); + } + } + + return type; +} + +internal D2R_TagIterator * +d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) +{ + D2R_TagIterator *iter = push_array(arena, D2R_TagIterator, 1); + iter->free_list = 0; + iter->stack = push_array(arena, D2R_TagFrame, 1); + iter->stack->node = push_array(arena, DW_TagNode, 1); + if (root != 0) { + *iter->stack->node = *root; + } + iter->stack->node->sibling = 0; + iter->visit_children = 1; + iter->tag_node = root; + iter->null_tag_node = push_array(arena, DW_TagNode, 1); + return iter; +} + +internal void +d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter) +{ + // descend to first child + if (iter->visit_children) { + if (iter->stack->node->first_child) { + D2R_TagFrame *f = iter->free_list; + if (f) { SLLStackPop(iter->free_list); MemoryZeroStruct(f); } + else { f = push_array(arena, D2R_TagFrame, 1); } + f->node = iter->stack->node->first_child; + SLLStackPush(iter->stack, f); + goto exit; + } + } + + while (iter->stack) { + // go to sibling + iter->stack->node = iter->stack->node->sibling; + if (iter->stack->node) { break; } + + // no more siblings, go up + D2R_TagFrame *f = iter->stack; + SLLStackPop(iter->stack); + SLLStackPush(iter->free_list, f); + } + + exit:; + // update iterator + iter->visit_children = 1; + iter->tag_node = iter->stack ? iter->stack->node : 0; +} + +internal void +d2r_tag_iterator_skip_children(D2R_TagIterator *iter) +{ + iter->visit_children = 0; +} + +internal DW_TagNode * +d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter) +{ + return iter->stack == 0 || iter->stack->next == 0 ? iter->null_tag_node : iter->stack->next->node; +} + +internal DW_Tag +d2r_tag_iterator_parent_tag(D2R_TagIterator *iter) +{ + DW_TagNode *tag_node = d2r_tag_iterator_parent_tag_node(iter); + return tag_node->tag; +} + +internal void +d2r_flag_converted_type_tag(DW_TagNode *tag_node) +{ + tag_node->tag.v |= D2R_TagFlags_TypeConverted; +} + +internal B8 +d2r_is_type_tag_converted(DW_TagNode *tag_node) +{ + return !!(tag_node->tag.v & D2R_TagFlags_TypeConverted); +} + +internal RDIM_Type * +d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind) +{ + RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; + + // find attrib + DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); + + // does tag have this attribute? + if (attrib->attrib_kind == kind) { + DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); + + if (value_class == DW_AttribClass_Reference) { + // resolve reference + DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); + + if (ref.cu == cu) { + // find type + type = d2r_type_from_offset(type_table, ref.info_off); + + // was type converted? + if (type == 0) { + // issue type conversion + DW_TagNode *ref_node = dw_tag_node_from_info_off(cu, ref.info_off); + d2r_convert_types(arena, type_table, input, cu, cu_lang, arch, ref_node); + + // if we do not have a converted type at this point then debug info is malformed + type = d2r_type_from_offset(type_table, ref.info_off); + if (type == 0) { + type = type_table->builtin_types[RDI_TypeKind_NULL]; + } + } + } else { + NotImplemented; + } + } else { + log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); + } + } + + return type; +} + +internal void +d2r_convert_types(Arena *arena, + D2R_TypeTable *type_table, + DW_Raw *input, + DW_CompUnit *cu, + DW_Language cu_lang, + Arch arch, + DW_TagNode *root) +{ + Temp scratch = scratch_begin(&arena, 1); + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { + DW_TagNode *tag_node = it->tag_node; + DW_Tag tag = tag_node->tag; + + // skip converted tags + if (d2r_is_type_tag_converted(tag_node)) { + d2r_tag_iterator_skip_children(it); + continue; + } + // mark the tag as converted here, because during conversion we may recurse on the same tag + d2r_flag_converted_type_tag(tag_node); + + switch (tag.kind) { + case DW_TagKind_ClassType: { + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->kind = RDI_TypeKind_IncompleteClass; + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + Assert(!tag_node->first_child); + d2r_tag_iterator_skip_children(it); + } else { + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->kind = RDI_TypeKind_Class; + type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); + type->direct_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); + } + } break; + case DW_TagKind_StructureType: { + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->kind = RDI_TypeKind_IncompleteStruct; + + if (tag_node->first_child) { + d2r_tag_iterator_skip_children(it); + } else { + log_infof("childless struct @ .debug_info+%llx", tag.info_off); + } + } else { + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->kind = RDI_TypeKind_Struct; + type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); + } + } break; + case DW_TagKind_UnionType: { + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->kind = RDI_TypeKind_IncompleteUnion; + + if (tag_node->first_child) { + d2r_tag_iterator_skip_children(it); + } else { + log_infof("childless union @ .debug_info+%llx", tag.info_off); + } + } else { + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->kind = RDI_TypeKind_Union; + type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); + } + } break; + case DW_TagKind_EnumerationType: { + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->kind = RDI_TypeKind_IncompleteEnum; + if (tag_node->first_child) { + d2r_tag_iterator_skip_children(it); + } else { + log_infof("childless enum @ .debug_info+%llx", tag.info_off); + } + } else { + RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->kind = RDI_TypeKind_Enum; + type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); + type->direct_type = enum_base_type; + } + } break; + case DW_TagKind_SubProgram: { + if ( ! dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Declaration)) { + break; + } + } // fall-through + case DW_TagKind_SubroutineType: { + RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + + // collect parameters + RDIM_TypeList param_list = {0}; + for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) { + if (n->tag.kind == DW_TagKind_FormalParameter) { + RDIM_Type *param_type = d2r_type_from_attrib(type_table, input, cu, n->tag, DW_AttribKind_Type); + rdim_type_list_push(scratch.arena, ¶m_list, param_type); + } else if (n->tag.kind == DW_TagKind_UnspecifiedParameters) { + rdim_type_list_push(scratch.arena, ¶m_list, type_table->builtin_types[RDI_TypeKind_Variadic]); + } else { + log_infof("unexpected tag @ .debug_info+%llx", tag.info_off); + } + } + + DW_TagNode *parent = d2r_tag_iterator_parent_tag_node(it); + B32 is_method = parent->tag.kind == DW_TagKind_StructureType || parent->tag.kind == DW_TagKind_ClassType; + + // init proceudre type + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->kind = is_method ? RDI_TypeKind_Method : RDI_TypeKind_Function; + type->byte_size = cu->address_size; + type->direct_type = ret_type; + type->count = param_list.count; + type->param_types = rdim_array_from_type_list(arena, param_list); + + d2r_tag_iterator_skip_children(it); + } break; + case DW_TagKind_Typedef: { + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->kind = RDI_TypeKind_Alias; + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->direct_type = direct_type; + for (RDIM_Type *n = direct_type; n != 0; n = n->direct_type) { + if (n->byte_size) { + type->byte_size = n->byte_size; + break; + } + } + } break; + case DW_TagKind_BaseType: { + DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); + U64 byte_size = dw_byte_size_from_tag(input, cu, tag); + + // convert base type encoding to RDI version + RDI_TypeKind kind = RDI_TypeKind_NULL; +#define X(t,g,s) case s: kind = RDI_TypeKind_##t; break; + switch (encoding) { + case DW_ATE_Null: kind = RDI_TypeKind_NULL; break; + case DW_ATE_Address: kind = RDI_TypeKind_Void; break; + case DW_ATE_Boolean: kind = RDI_TypeKind_Bool; break; + case DW_ATE_ComplexFloat: { + switch (byte_size) { + case 8: kind = RDI_TypeKind_ComplexF32; break; + case 16: kind = RDI_TypeKind_ComplexF64; break; + case 24: kind = RDI_TypeKind_ComplexF80; break; + case 32: kind = RDI_TypeKind_ComplexF128; break; + default: log_infof("unexpected size"); break; + } + } break; + case DW_ATE_Float: { + String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + if (arch == Arch_x64 || arch == Arch_arm64) { + if (str8_match(name, str8_lit("__float80"), 0)) { + kind = RDI_TypeKind_F80; + } else if (str8_match(name, str8_lit("__float128"), 0)) { + kind = RDI_TypeKind_F128; + } else if (str8_match(name, str8_lit("_Float16"), 0)) { + kind = RDI_TypeKind_F16; + } else if (str8_match(name, str8_lit("__bf16"), 0)) { + kind = RDI_TypeKind_BF16; + } + if (kind != RDI_TypeKind_NULL) { break; } + } + + switch (byte_size) { + D2R_ValueType_Float_XList + default: log_infof("unexpected size"); break; + } + } break; + case DW_ATE_Signed: { + String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + if (str8_match(name, str8_lit("wchar_t"), 0)) { goto do_signed_char; } + + switch (byte_size) { + D2R_ValueType_Signed_XList + default: log_infof("unexpected size"); break; + } + } break; + do_signed_char:; + case DW_ATE_SignedChar: { + switch (byte_size) { + case 1: kind = RDI_TypeKind_Char8; break; + case 2: kind = RDI_TypeKind_Char16; break; + case 4: kind = RDI_TypeKind_Char32; break; + default: log_infof("unexpected size"); break; + } + } break; + case DW_ATE_Unsigned: { + switch (byte_size) { + D2R_ValueType_Unsigned_XList + default: log_infof("unexpected size"); break; + } + } break; + case DW_ATE_Utf: + case DW_ATE_UnsignedChar: { + switch (byte_size) { + case 1: kind = RDI_TypeKind_UChar8; break; + case 2: kind = RDI_TypeKind_UChar16; break; + case 4: kind = RDI_TypeKind_UChar32; break; + default: log_infof("unexpected size"); break; + } + } break; + case DW_ATE_DecimalFloat: { + switch (byte_size) { + case 4: kind = RDI_TypeKind_Decimal32; break; + case 8: kind = RDI_TypeKind_Decimal64; break; + case 16: kind = RDI_TypeKind_Decimal128; break; + default: log_infof("unexpected size"); break; + } + } break; + case DW_ATE_ImaginaryFloat: { + NotImplemented; + } break; + case DW_ATE_PackedDecimal: { + NotImplemented; + } break; + case DW_ATE_NumericString: { + NotImplemented; + } break; + case DW_ATE_Edited: { + NotImplemented; + } break; + case DW_ATE_SignedFixed: { + NotImplemented; + } break; + case DW_ATE_UnsignedFixed: { + NotImplemented; + } break; + case DW_ATE_Ucs: { + NotImplemented; + } break; + case DW_ATE_Ascii: { + NotImplemented; + } break; + default: log_infof("unexpected base type encoding"); break; + } +#undef X + + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->kind = RDI_TypeKind_Alias; + type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + type->direct_type = type_table->builtin_types[kind]; + type->byte_size = byte_size; + } break; + case DW_TagKind_PointerType: { + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + + // TODO: + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Allocated)) { + log_infof("TODO: handle allocated attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Associated)) { + log_infof("TODO: handle associated attrib @ .debug_info%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { + log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { + log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass)) { + log_infof("TODO: handle address class attrib @ .debug_info+%llx", tag.info_off); + } + + U64 byte_size = cu->address_size; + if (cu->version == DW_Version_5 || cu->relaxed) { + dw_try_byte_size_from_tag(input, cu, tag, &byte_size); + } + + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->kind = RDI_TypeKind_Ptr; + type->byte_size = byte_size; + type->direct_type = direct_type; + } break; + case DW_TagKind_RestrictType: { + // TODO: + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { + log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { + log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); + } + + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->kind = RDI_TypeKind_Modifier; + type->byte_size = cu->address_size; + type->flags = RDI_TypeModifierFlag_Restrict; + type->direct_type = direct_type; + } break; + case DW_TagKind_VolatileType: { + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { + log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); + } + + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->kind = RDI_TypeKind_Modifier; + type->byte_size = cu->address_size; + type->flags = RDI_TypeModifierFlag_Volatile; + type->direct_type = direct_type; + } break; + case DW_TagKind_ConstType: { + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { + log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); + } + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { + log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); + } + + RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); + type->kind = RDI_TypeKind_Modifier; + type->byte_size = cu->address_size; + type->flags = RDI_TypeModifierFlag_Const; + type->direct_type = direct_type; + } break; + case DW_TagKind_ArrayType: { + // TODO: @native_vector_support extract byte size from the base type tag + // and convert to U256, U512, S256 and S512 + B32 is_vector = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_GNU_Vector); + // TODO: + //if (is_vector) { NotImplemented; } + + B32 error = 1; + + // * DWARF vs RDI Array Type Graph * + // + // For example lets take following decl: + // + // int (*foo[2])[3]; + // + // This compiles to in DWARF: + // + // foo -> DW_TAG_ArrayType -> (A0) DW_TAG_Subrange [2] + // \ + // -> (B0) DW_TAG_PointerType -> (A1) DW_TAG_ArrayType -> DW_TAG_Subrange [3] + // \ + // -> (B1) DW_TAG_BaseType (int) + // + // RDI expects: + // + // foo -> Array[2] -> Pointer -> Array[3] -> int + // + // Note that DWARF forks the graph on DW_TAG_ArrayType to describe array ranges in branch A and + // in branch B describes array type which might be a struct, pointer, base type, or any other type tag. + // However, in RDI we have a simple list of type nodes and to convert we need to append type nodes from + // B to A. + struct SubrangeNode { struct SubrangeNode *next; U64 count; }; + struct SubrangeNode *subrange_stack = 0; + for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) { + if (n->tag.kind != DW_TagKind_SubrangeType) { + log_infof("[%llx] while scanning for DW_TagKind_SubrangeType found an unexpected child tag %S @ %llx\n", tag.info_off, dw_string_from_tag_kind(scratch.arena, n->tag.kind), n->tag.info_off); + goto array_type_exit; + } + + // resolve lower bound + U64 lower_bound = 0; + if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_LowerBound)) { + B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_LowerBound)); + if (is_vla) { + log_infof("[%llx] TODO: lower bound is a variable\n", n->tag.info_off); + } else { + lower_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_LowerBound); + } + } else { + lower_bound = dw_pick_default_lower_bound(cu_lang); + } + + // resolve upper bound + U64 upper_bound = 0; + if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_Count)) { + U64 count = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_Count); + upper_bound = lower_bound + count; + } else if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_UpperBound)) { + B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_UpperBound)); + if (is_vla) { + log_infof("[%llx] TODO: upper bound is a variable\n", n->tag.info_off); + goto array_type_exit; + } else { + upper_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_UpperBound); + upper_bound += 1; // turn upper bound into exclusive range + } + } else { + // zero sized array + } + + struct SubrangeNode *s = push_array(scratch.arena, struct SubrangeNode, 1); + s->count = upper_bound - lower_bound; + SLLStackPush(subrange_stack, s); + } + + RDIM_Type *array_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + RDIM_Type *direct_type = array_base_type; + U64 size_cursor = array_base_type->byte_size; + for EachNode(s, struct SubrangeNode, subrange_stack) { + size_cursor *= s->count; + + RDIM_Type *t; + if (s->next) { t = d2r_create_type(arena, type_table); } + else { t = d2r_create_type_from_offset(arena, type_table, tag.info_off); } + + t->kind = RDI_TypeKind_Array; + t->direct_type = direct_type; + t->byte_size = size_cursor; + t->count = s->count; + + direct_type = t; + } + + error = 0; + array_type_exit:; + + // in case of an error, assign null to the array type + if (error) { + Assert(d2r_type_from_offset(type_table, tag.info_off) == 0); // this should the first time this type is being parsed + hash_table_push_u64_raw(arena, type_table->ht, tag.info_off, type_table->builtin_types[RDI_TypeKind_NULL]); + } + + d2r_tag_iterator_skip_children(it); + } break; + case DW_TagKind_SubrangeType: { + log_infof("unexpected tag"); + } break; + case DW_TagKind_Inheritance: { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + if (parent_tag.kind == DW_TagKind_StructureType || parent_tag.kind == DW_TagKind_ClassType) { + RDIM_Type *parent = d2r_type_from_offset(type_table, parent_tag.info_off); + RDIM_Type *type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); + RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, parent->udt); + member->kind = RDI_MemberKind_Base; + member->type = type; + member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); + } else { + log_infof("unexpected parent tag"); + } + } break; + } + } + scratch_end(scratch); +} + +internal B8 +d2r_is_udt_tag_converted(DW_TagNode *tag_node) +{ + return !!(tag_node->tag.v & D2R_TagFlags_UdtConverted); +} + +internal void +d2r_flag_converted_udt_tag(DW_TagNode *tag_node) +{ + tag_node->tag.v |= D2R_TagFlags_UdtConverted; +} + +internal void +d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, RDIM_UDT *udt) +{ + for (RDIM_UDTMember *curr = udt->first_member, *prev = 0; curr != 0; prev = curr, curr = curr->next) { + if (curr->name.size == 0) { + d2r_inline_anonymous_udt_member(arena, top_udt, base_off + curr->off, curr->type->udt); + } else { + // copy member and adjust its offset relative to inlined position in the root UDT + RDIM_UDTMember *m = rdim_udt_push_member(arena, &g_d2r_shared.udts, top_udt); + *m = *curr; + m->off += base_off; + } + } +} + +internal void +d2r_convert_udts(Arena *arena, + D2R_TypeTable *type_table, + DW_Raw *input, + DW_CompUnit *cu, + DW_Language cu_lang, + DW_TagNode *root) +{ + Temp scratch = scratch_begin(&arena, 1); + + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { + DW_TagNode *tag_node = it->tag_node; + DW_Tag tag = tag_node->tag; + + // skip converted tags + if (d2r_is_udt_tag_converted(tag_node)) { + d2r_tag_iterator_skip_children(it); + continue; + } + d2r_flag_converted_udt_tag(tag_node); + + if (tag.kind == DW_TagKind_ClassType || tag.kind == DW_TagKind_StructureType || tag.kind == DW_TagKind_UnionType) { + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { + d2r_tag_iterator_skip_children(it); + } else { + RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); + RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &g_d2r_shared.udts, D2R_UDT_CHUNK_CAP); + udt->self_type = type; + type->udt = udt; + } + } else if (tag.kind == DW_TagKind_EnumerationType) { + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { + d2r_tag_iterator_skip_children(it); + } else { + RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); + RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &g_d2r_shared.udts, D2R_UDT_CHUNK_CAP); + udt->self_type = type; + type->udt = udt; + } + } else if (tag.kind == DW_TagKind_Member) { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType || + parent_tag.kind == DW_TagKind_ClassType || + parent_tag.kind == DW_TagKind_UnionType; + if (is_parent_udt) { + RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); + RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); + String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + U64 off = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation); + if (name.size == 0) { // inline anonymous members + DW_Reference type_ref = dw_ref_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Type); + RDIM_Type *member_type = d2r_type_from_offset(type_table, type_ref.info_off); + RDIM_UDT *member_udt = member_type->udt; + if (member_udt == 0) { + DW_Language ref_cu_lang = dw_const_u64_from_tag_attrib_kind(input, type_ref.cu, type_ref.cu->tag, DW_AttribKind_Language); + DW_TagNode *ref_tag_node = dw_tag_node_from_info_off(type_ref.cu, type_ref.info_off); + d2r_convert_udts(arena, type_table, input, type_ref.cu, ref_cu_lang, ref_tag_node); + Assert(member_type->udt); + member_udt = member_type->udt; + } + d2r_inline_anonymous_udt_member(arena, parent_type->udt, off, member_udt); + } else { + RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, parent_type->udt); + member->kind = RDI_MemberKind_DataField; + member->name = name; + member->type = type; + member->off = off; + } + } else { + log_infof("unexpected parent tag @ .debug_info+%llx", tag.info_off); + } + } else if (tag.kind == DW_TagKind_Enumerator) { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + if (parent_tag.kind == DW_TagKind_EnumerationType) { + RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); + RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &g_d2r_shared.udts, parent_type->udt); + udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + udt_member->val = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ConstValue); + } else { + log_infof("unexpected parent tag @ .debug_info+%llx", tag.info_off); + } + } + } + scratch_end(scratch); +} + +internal RDIM_Scope * +d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges) +{ + // fill out scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, scopes, scope_chunk_cap); + + // push ranges + for EachNode(i, Rng1U64Node, ranges.first) { + rdim_scope_push_voff_range(arena, scopes, scope, (RDIM_Rng1U64){.min = i->v.min, i->v.max}); + } + + // associate scope with tag + tag_stack->scope = scope; + + // update scope hierarchy + DW_TagKind parent_tag_kind = tag_stack->next->node->tag.kind; + if (parent_tag_kind == DW_TagKind_SubProgram || parent_tag_kind == DW_TagKind_InlinedSubroutine || parent_tag_kind == DW_TagKind_LexicalBlock) { + RDIM_Scope *parent = tag_stack->next->scope; + + scope->parent_scope = parent; + scope->symbol = parent->symbol; + + if (parent->last_child) { + parent->last_child->next_sibling = scope; + } + SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); + } + + return scope; +} + +internal RDIM_Type ** +d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) +{ + Temp scratch = scratch_begin(&arena, 1); + + RDIM_TypeList list = {0}; + B32 has_vargs = 0; + for (DW_TagNode *i = cur_node->first_child; i != 0; i = i->sibling) { + if (i->tag.kind == DW_TagKind_FormalParameter) { + RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1); + n->v = d2r_type_from_attrib(type_table, input, cu, i->tag, DW_AttribKind_Type); + SLLQueuePush(list.first, list.last, n); + ++list.count; + } else if (i->tag.kind == DW_TagKind_UnspecifiedParameters) { + has_vargs = 1; + } + } + + if (has_vargs) { + RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1); + n->v = type_table->builtin_types[RDI_TypeKind_Variadic]; + SLLQueuePush(list.first, list.last, n); + ++list.count; + } + + // collect params + *param_count_out = list.count; + RDIM_Type **params = rdim_array_from_type_list(arena, list); + + scratch_end(scratch); + return params; +} + +internal Rng1U64List +d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) +{ + // collect non-contiguous range + Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); + + // exclude invalid ranges caused by linker optimizations + Rng1U64List ranges = {0}; + for (Rng1U64Node *n = raw_ranges.first, *next = 0; n != 0; n = next) { + next = n->next; + if (n->v.min < image_base || n->v.min > n->v.max) { + continue; + } + rng1u64_list_push_node(&ranges, n); + } + + // debase ranges + for EachNode(r, Rng1U64Node, ranges.first) { + r->v.min -= image_base; + r->v.max -= image_base; + } + + // collect contiguous range + { + DW_Attrib *lo_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_LowPc); + DW_Attrib *hi_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_HighPc); + if (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) { + U64 lo_pc = dw_address_from_attrib(input, cu, lo_pc_attrib); + + U64 hi_pc = 0; + DW_AttribClass hi_pc_class = dw_value_class_from_attrib(cu, hi_pc_attrib); + if (hi_pc_class == DW_AttribClass_Address) { + hi_pc = dw_address_from_attrib(input, cu, hi_pc_attrib); + } else if (hi_pc_class == DW_AttribClass_Const) { + hi_pc = dw_const_u64_from_attrib(input, cu, hi_pc_attrib); + hi_pc += lo_pc; + } + + if (lo_pc >= image_base && hi_pc >= image_base) { + if (lo_pc < hi_pc) { + rng1u64_list_push(arena, &ranges, rng_1u64(lo_pc - image_base, hi_pc - image_base)); + } else { + log_infof("invalid range @ .debug_info+%llx", tag.info_off); + } + } else { + // invalid low and hi PC are likely are caused by an optimization pass during linking + } + } else if ((lo_pc_attrib->attrib_kind == DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) || + (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind == DW_AttribKind_Null)) { + log_infof("invalid range @ .debug_info+%llx", tag.info_off); + } + } + + return ranges; +} + +internal void +d2r_convert_symbols(Arena *arena, + D2R_TypeTable *type_table, + DW_Raw *input, + DW_CompUnit *cu, + DW_Language cu_lang, + U64 image_base, + Arch arch, + DW_TagNode *root, + RDIM_Unit *unit_rdi) +{ + Temp scratch = scratch_begin(&arena, 1); + for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { + DW_TagNode *tag_node = it->tag_node; + DW_Tag tag = tag_node->tag; + switch (tag.kind) { + case DW_TagKind_Null: { InvalidPath; } break; + case DW_TagKind_ClassType: + case DW_TagKind_StructureType: + case DW_TagKind_UnionType: { + // visit children to collect methods and variables + } break; + case DW_TagKind_EnumerationType: + case DW_TagKind_SubroutineType: + case DW_TagKind_Typedef: + case DW_TagKind_BaseType: + case DW_TagKind_PointerType: + case DW_TagKind_RestrictType: + case DW_TagKind_VolatileType: + case DW_TagKind_ConstType: + case DW_TagKind_ArrayType: + case DW_TagKind_SubrangeType: + case DW_TagKind_Inheritance: + case DW_TagKind_Enumerator: + case DW_TagKind_Member: { + d2r_tag_iterator_skip_children(it); + } break; + case DW_TagKind_SubProgram: { + // handled during type conversion step + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Declaration)) { + d2r_tag_iterator_skip_children(it); + break; + } + + DW_InlKind inl = DW_Inl_NotInlined; + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Inline)) { inl = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Inline); } + + switch (inl) { + case DW_Inl_DeclaredNotInlined: + case DW_Inl_NotInlined: { + U64 param_count = 0; + RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); + + // get return type + RDIM_Type *ret_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); + + // fill out proc type + RDIM_Type *proc_type = d2r_create_type(arena, type_table); + proc_type->kind = RDI_TypeKind_Function; + proc_type->byte_size = cu->address_size; + proc_type->direct_type = ret_type; + proc_type->count = param_count; + proc_type->param_types = params; + + // get container type + RDIM_Type *container_type = 0; + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ContainingType)) { + container_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_ContainingType); + } else { + DW_TagNode *parent = d2r_tag_iterator_parent_tag_node(it); + container_type = d2r_type_from_offset(type_table, parent->tag.info_off); + if (container_type == 0) { + log_infof("ERROR: failed to infer parent type of subprogram from .debug_info+0x%llx\n", parent->tag.info_off); + } + } + + // get frame base expression + String8 frame_base_expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_FrameBase); + + // get proc container symbol + RDIM_Symbol *proc = rdim_symbol_chunk_list_push(arena, &unit_rdi->procedures, D2R_PROC_CHUNK_CAP); + + // make scope + Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); + RDIM_Scope *root_scope = d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); + root_scope->symbol = proc; + + // fill out proc + proc->is_extern = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_External); + proc->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + proc->link_name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName); + proc->type = proc_type; + proc->container_scope = 0; + proc->container_type = container_type; + proc->root_scope = root_scope; + proc->location_cases = d2r_locset_from_attrib(arena, &unit_rdi->scopes, root_scope, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); + + // sub program with user-defined parent tag is a method + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + if (parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_StructureType) { + // DW_VirtualityKind -> RDI_MemberKind + RDI_MemberKind member_kind = RDI_MemberKind_NULL; + { + DW_VirtualityKind virtuality = DW_VirtualityKind_None; + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Virtuality)) { + virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality); + switch (virtuality) { + case DW_VirtualityKind_None: member_kind = RDI_MemberKind_Method; break; + case DW_VirtualityKind_Virtual: member_kind = RDI_MemberKind_VirtualMethod; break; + case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal + default: { log_infof("unhandled virtuality kind"); } break; + } + } + } + + RDIM_Type *type = d2r_type_from_offset(type_table, parent_tag.info_off); + RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, type->udt); + member->kind = member_kind; + member->type = type; + member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + } else if (parent_tag.kind != DW_TagKind_CompileUnit) { + log_infof("unexpected tag @ .debug_info+%llx", tag.info_off); + } + + it->stack->scope = root_scope; + } break; + case DW_Inl_DeclaredInlined: + case DW_Inl_Inlined: { + d2r_tag_iterator_skip_children(it); + } break; + default: InvalidPath; break; + } + } break; + case DW_TagKind_InlinedSubroutine: { + U64 param_count = 0; + RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); + + // get return type + RDIM_Type *ret_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); + + // fill out proc type + RDIM_Type *proc_type = d2r_create_type(arena, type_table); + proc_type->kind = RDI_TypeKind_Function; + proc_type->byte_size = cu->address_size; + proc_type->direct_type = ret_type; + proc_type->count = param_count; + proc_type->param_types = params; + + // get container type + RDIM_Type *owner = 0; + if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ContainingType)) { + owner = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_ContainingType); + } + + // fill out inline site + RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &unit_rdi->inline_sites, D2R_INLINE_SITE_CHUNK_CAP); + inline_site->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + inline_site->type = proc_type; + inline_site->owner = owner; + inline_site->line_table = 0; + + // make scope + Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); + RDIM_Scope *root_scope = d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); + root_scope->inline_site = inline_site; + } break; + case DW_TagKind_Variable: { + String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); + + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + if (parent_tag.kind == DW_TagKind_SubProgram || + parent_tag.kind == DW_TagKind_InlinedSubroutine || + parent_tag.kind == DW_TagKind_LexicalBlock) { + RDIM_Scope *scope = it->stack->next->scope; + RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + local->name = name; + local->type = type; + local->location_cases = d2r_var_locset_from_tag(arena, &unit_rdi->scopes, scope, input, cu, image_base, arch, tag); + } else { + + // NOTE: due to a bug in clang in stb_sprintf.h local variables + // are declared in global scope without a name + if (name.size == 0) { break; } + + // decls do not have location info + B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); + if (is_decl) { break; } + + U64 voff = max_U64; + B32 is_thread_var = 0; + { + DW_Attrib *loc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_Location); + DW_AttribClass loc_class = dw_value_class_from_attrib(cu, loc_attrib); + if (loc_class == DW_AttribClass_ExprLoc) { + Temp temp = temp_begin(scratch.arena); + + String8 expr = dw_exprloc_from_attrib(input, cu, loc_attrib); + D2R_ValueType expr_type = 0; + RDIM_EvalBytecode bc = d2r_bytecode_from_expression(temp.arena, input, image_base, arch, cu->addr_lu, expr, cu, &expr_type); + + // evaluate bytecode to virutal offset if possible + if (expr_type == D2R_ValueType_Address) { + B32 is_static = rdim_is_eval_bytecode_static(bc); + if (is_static) { + if (!rdim_static_eval_bytecode_to_voff(bc, image_base, &voff)) { + log_infof("failed to evalute byte code to virtual offset @ .debug_info+%llx", tag.info_off); + } + } + } + + // is this a thread variable? + is_thread_var = rdim_is_bytecode_tls_dependent(bc); + + temp_end(temp); + } + } + + RDIM_SymbolChunkList *var_chunks; U64 var_chunks_cap; + if (is_thread_var) { var_chunks = &unit_rdi->thread_variables; var_chunks_cap = D2R_TVAR_CHUNK_CAP; } + else { var_chunks = &unit_rdi->global_variables; var_chunks_cap = D2R_GVAR_CHUNK_CAP; } + + RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, var_chunks, var_chunks_cap); + var->is_extern = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_External); + var->name = name; + var->link_name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName); + var->type = type; + var->container_scope = 0; + RDIM_Location loc = {.kind = is_thread_var ? RDI_LocationKind_TLSOff : RDI_LocationKind_ModuleOff, .offset = voff}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &var->location_cases, loc, range); + } + } break; + case DW_TagKind_FormalParameter: { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) { + RDIM_Scope *scope = it->stack->next->scope; + RDIM_Symbol *param = rdim_symbol_chunk_list_push(arena, &scope->locals, 4); + param->is_param = 1; + param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); + param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); + param->location_cases = d2r_var_locset_from_tag(arena, &unit_rdi->scopes, scope, input, cu, image_base, arch, tag); + } else { + Assert(!"this is a local variable"); + log_infof(".debug_info+%llx out of scope formal parameter", tag.info_off); + } + } break; + case DW_TagKind_LexicalBlock: { + DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); + if (parent_tag.kind == DW_TagKind_SubProgram || + parent_tag.kind == DW_TagKind_InlinedSubroutine || + parent_tag.kind == DW_TagKind_LexicalBlock) { + Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); + d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); + } + } break; + case DW_TagKind_CallSite: { + // TODO + } break; + case DW_TagKind_CallSiteParameter: { + // TODO + } break; + case DW_TagKind_Label: + case DW_TagKind_CompileUnit: + case DW_TagKind_UnspecifiedParameters: + case DW_TagKind_Namespace: + case DW_TagKind_ImportedDeclaration: + case DW_TagKind_PtrToMemberType: + case DW_TagKind_TemplateTypeParameter: + case DW_TagKind_ReferenceType: { + // TODO: + } break; + default: + { + // NotImplemented; + } break; + } + } + scratch_end(scratch); +} + +force_inline int +d2r_src_file_lookup_compar(void *raw_a, void *raw_b) +{ + D2R_SrcFileLookup *a = raw_a, *b = raw_b; + DW_LineFile *file_a = a->file, *file_b = b->file; + String8 dir_path_a = a->vm->header.dir_table.v[file_a->dir_idx]; + String8 dir_path_b = b->vm->header.dir_table.v[file_b->dir_idx]; + int cmp = str8_compar(dir_path_a, dir_path_b, 0); + if (cmp == 0) { + cmp = str8_compar(file_a->path, file_b->path, 0); + } + return cmp; +} + +force_inline +LFHT_IS_KEY_EQUAL_FUNC(d2r_src_file_lookup_is_equal) +{ + return d2r_src_file_lookup_compar(a, b) == 0; +} + +force_inline int +d2r_src_file_lfht_key_value_is_before(void *raw_a, void *raw_b) +{ + return d2r_src_file_lookup_compar(*(D2R_SrcFileLookup **)raw_a, *(D2R_SrcFileLookup **)raw_b) < 0; +} + +internal U64 +d2r_hash_line_file(String8 dir_path, DW_LineFile *file) +{ + XXH3_state_t hasher = {0}; + XXH3_64bits_reset(&hasher); + XXH3_64bits_update(&hasher, dir_path.str, dir_path.size); + XXH3_64bits_update(&hasher, file->path.str, file->path.size); + XXH3_64bits_update(&hasher, &file->time_stamp, sizeof(file->time_stamp)); + XXH3_64bits_update(&hasher, &file->md5, sizeof(file->md5)); + XXH64_hash_t hash = XXH3_64bits_digest(&hasher); + return hash; +} + +internal void +d2r_sort_ptrs(void **ptrs, U64 count, int (* is_before)(void *a, void *b)) +{ + radsort(ptrs, count, is_before); +} + +internal D2R_CompUnitContribMap +d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Raw *input, U64 image_base) +{ + Temp scratch = scratch_begin(&arena, 1); + Temp temp = temp_begin(arena); + B32 parse_failed = 1; + + Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_ARanges].data); + + D2R_CompUnitContribMap cm = {0}; + cm.info_off_arr = push_array(temp.arena, U64, unit_range_list.count); + cm.voff_range_arr = push_array(temp.arena, RDIM_Rng1U64ChunkList, unit_range_list.count); + + for EachNode(range_n, Rng1U64Node, unit_range_list.first) { + String8 unit_data = str8_substr(input->sec[DW_Section_ARanges].data, range_n->v); + U64 unit_cursor = 0; + + U32 first_four_bytes = 0; + if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } + DW_Format unit_format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; + + U64 unit_length; + TryRead(str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length), unit_cursor, exit); + + DW_Version version; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &version), unit_cursor, exit); + + if (version != DW_Version_2) { + log_infof("unknown .debug_aranges version %u @ 0x%llx", version, range_n->v.min); + continue; + } + + U64 cu_info_off; + TryRead(str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &cu_info_off), unit_cursor, exit); + + U8 address_size = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &address_size), unit_cursor, exit); + + U8 segment_selector_size = 0; + TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &segment_selector_size), unit_cursor, exit); + + U64 tuple_size = address_size * 2 + segment_selector_size; + U64 bytes_too_far_past_boundary = unit_cursor % tuple_size; + if (bytes_too_far_past_boundary > 0) { + unit_cursor += tuple_size - bytes_too_far_past_boundary; + } + + RDIM_Rng1U64ChunkList voff_ranges = {0}; + if (segment_selector_size == 0) { + while (unit_cursor + address_size * 2 <= unit_data.size) { + U64 address = 0; + U64 length = 0; + TryRead(str8_deserial_read(unit_data, unit_cursor, &address, address_size, address_size), unit_cursor, exit); + TryRead(str8_deserial_read(unit_data, unit_cursor, &length, address_size, address_size), unit_cursor, exit); + + if (address == 0 && length == 0) { break; } + if (address == 0) { continue; } + + if (address < image_base) { + log_infof("invalid address 0x%llx in .debug_aranges+%llx", range_n->v.min + unit_cursor); + continue; + } + + U64 min = address - image_base; + U64 max = min + length; + rdim_rng1u64_chunk_list_push(temp.arena, &voff_ranges, 256, (RDIM_Rng1U64){.min = min, .max = max}); + } + } else { + NotImplemented; + } + + U64 map_idx = cm.count++; + cm.info_off_arr[map_idx] = cu_info_off; + cm.voff_range_arr[map_idx] = voff_ranges; + } + + parse_failed = 0; + exit:; + if (parse_failed) { + MemoryZeroStruct(&cm); + temp_end(temp); + } + scratch_end(scratch); + return cm; +} + +internal RDIM_Rng1U64ChunkList +d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off) +{ + RDIM_Rng1U64ChunkList voff_ranges = {0}; + U64 voff_list_idx = u64_array_bsearch(map.info_off_arr, map.count, info_off); + if (voff_list_idx < map.count) { + voff_ranges = map.voff_range_arr[voff_list_idx]; + } + return voff_ranges; +} + +internal RDIM_BakeParams +d2r_convert(Arena *arena, D2R_ConvertParams *params) +{ + Temp scratch = scratch_begin(&arena, 1); + + if (lane_idx() == 0) { + //////////////////////////////// + + Arch arch = Arch_Null; + U64 image_base = 0; + DW_Raw input = {0}; + PathStyle path_style = PathStyle_Null; + + switch (params->exe_kind) { + case ExecutableImageKind_Null: {} break; + case ExecutableImageKind_CoffPe: { + PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); + String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); + COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); + String8 string_table = str8_substr(params->exe_data, pe.string_table_range); + + arch = pe.arch; + image_base = pe.image_base; + input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); + path_style = PathStyle_WindowsAbsolute; + + g_d2r_shared.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); + } break; + case ExecutableImageKind_Elf32: + case ExecutableImageKind_Elf64: { + ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data); + + arch = arch_from_elf_machine(bin.hdr.e_machine); + image_base = elf_base_addr_from_bin(&bin); + input = dw_raw_from_elf_bin(scratch.arena, params->dbg_data, &bin); + path_style = PathStyle_UnixAbsolute; + + g_d2r_shared.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, params->dbg_data, &bin, &bin.shdrs); + } break; + default: { InvalidPath; } break; + } + + //////////////////////////////// + + ProfBegin("compute exe hash"); + U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); + ProfEnd(); + + g_d2r_shared.top_level_info = rdim_make_top_level_info(params->exe_name, arch, exe_hash, g_d2r_shared.binary_sections); + + //////////////////////////////// + + ProfBegin("Parse Unit Contrib Map"); + D2R_CompUnitContribMap cu_contrib_map = {0}; + if (input.sec[DW_Section_ARanges].data.size) { + cu_contrib_map = d2r_cu_contrib_map_from_aranges(arena, &input, image_base); + } + ProfEnd(); + + ProfBegin("Parse Comop Unit Ranges"); + DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); + Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input.sec[DW_Section_Info].data); + Rng1U64Array cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); + ProfEnd(); + + //////////////////////////////// + + ProfBegin("Parse Compile Unit Headers"); + DW_CompUnit *cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); + for EachIndex(cu_idx, cu_ranges.count) { + cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, params->is_parse_relaxed); + } + ProfEnd(); + + //////////////////////////////// + + RDIM_LineTable **cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); + ProfScope("Convert Line Tables [Count: %llu]", cu_ranges.count) + { + Temp temp = temp_begin(scratch.arena); + + // TODO: per thread task + ProfBegin("Up front parse line VM headers"); + DW_LineVM **line_vms = push_array(temp.arena, DW_LineVM *, cu_ranges.count); + for EachIndex(cu_idx, cu_ranges.count) { + line_vms[cu_idx] = dw_line_vm_init(&input, &cu_arr[cu_idx]); + } + ProfEnd(); + + // TODO: sync + // + // sum all source files (including duplicates) + U64 total_file_count = 0; + for EachIndex(cu_idx, cu_ranges.count) { total_file_count += line_vms[cu_idx]->header.file_table.count; } + + // TODO: sync + ProfBegin("Dedup source files [Count: %llu]", total_file_count); + LFHT_NodeChunkList *src_file_lfht_nodes = push_array(temp.arena, LFHT_NodeChunkList, lane_count()); + LFHT_Node *src_file_lfht = 0; + + // TODO: per thread + { + D2R_SrcFileLookup *lookup = 0; + for EachIndex(cu_idx, cu_ranges.count) { + DW_LineVM *vm = line_vms[cu_idx]; + for EachIndex(file_idx, vm->header.file_table.count) { + DW_LineFile *file = &vm->header.file_table.v[file_idx]; + + if (lookup == 0) { lookup = push_array(temp.arena, D2R_SrcFileLookup, 1); } + lookup->vm = vm; + lookup->file = file; + + LFHT_NodeChunkList *node_chunks = &src_file_lfht_nodes[lane_idx()]; + U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); + B32 was_inserted = lfht_insert(temp.arena, node_chunks, &src_file_lfht, hash, lookup, d2r_src_file_lookup_is_equal, 0); + if (was_inserted) { + lookup = 0; + } + } + } + } + ProfEnd(); + + // TODO: sync + ProfBegin("Extract source file lookups"); + U64 unique_file_count = lfht_total_count_from_node_chunk_lists(lane_count(), src_file_lfht_nodes); + void **lookups = lfht_data_from_node_chunk_lists(temp.arena, unique_file_count, lane_count(), src_file_lfht_nodes); + ProfEnd(); + + // TODO: sync + ProfBegin("Sort unique source files [Count: %llu]", unique_file_count); + d2r_sort_ptrs(lookups, unique_file_count, d2r_src_file_lfht_key_value_is_before); + ProfEnd(); + + // TODO: per thread task + ProfBegin("Convert source files"); + for EachIndex(i, unique_file_count) { + D2R_SrcFileLookup *lookup = lookups[i]; + + DW_LineFile *src = lookup->file; + RDIM_SrcFile *dst = rdim_src_file_chunk_list_push(arena, &g_d2r_shared.src_files, D2R_SRC_FILE_CAP); + + // make file path + String8 path; + { + Temp temp = temp_begin(scratch.arena); + + String8 comp_dir = lookup->vm->header.dir_table.v[0]; + + PathStyle comp_path_style = path_style_from_str8(comp_dir); + PathStyle dir_path_style = path_style_from_str8(lookup->vm->header.dir_table.v[src->dir_idx]); + PathStyle file_path_style = path_style_from_str8(src->path); + + String8List dir_path_list = str8_split_path(temp.arena, lookup->vm->header.dir_table.v[src->dir_idx]); + String8List file_path_list = str8_split_path(temp.arena, src->path); + + String8List path_list = {0}; + if (dir_path_style == PathStyle_Relative) { + String8List comp_dir_list = str8_split_path(temp.arena, comp_dir); + str8_list_concat_in_place(&path_list, &comp_dir_list); + } + str8_list_concat_in_place(&path_list, &dir_path_list); + str8_list_concat_in_place(&path_list, &file_path_list); + + PathStyle path_style = PathStyle_SystemAbsolute; + if (dir_path_style != PathStyle_Relative) { path_style = dir_path_style; } + else if (file_path_style != PathStyle_Relative) { path_style = file_path_style; } + else if (comp_path_style != PathStyle_Relative) { path_style = comp_path_style; } + + str8_path_list_resolve_dots_in_place(&path_list, path_style); + path = str8_path_list_join_by_style(arena, &path_list, path_style); + + temp_end(temp); + } + + // fill out source file + dst->path = path; + if ( ! u128_match(src->md5, u128_zero())) { + dst->checksum_kind = RDI_ChecksumKind_MD5; + dst->checksum = str8_copy(arena, str8_struct(&src->md5)); + } else if (src->time_stamp != 0) { + dst->checksum_kind = RDI_ChecksumKind_Timestamp; + dst->checksum = str8_copy(arena, str8_struct(&src->time_stamp)); + } + + lookup->src_file = dst; + } + ProfEnd(); + + // TODO: sync + RDIM_LineTableChunkList *lane_line_table_chunks = push_array(temp.arena, RDIM_LineTableChunkList, lane_count()); + + // TODO: per thread task + ProfBegin("Convert line sequences"); + U64 *line_seq_counts_per_lane = push_array(scratch.arena, U64, lane_count()); + for EachIndex(cu_idx, cu_ranges.count) { + RDIM_LineTableChunkList *lane_line_table_chunk_list = &lane_line_table_chunks[lane_idx()]; + + // push new line table for the compile unit + RDIM_LineTable *line_table = rdim_line_table_chunk_list_push(arena, lane_line_table_chunk_list, D2R_LINE_TABLE_CAP); + cu_line_tables_rdi[cu_idx] = line_table; + + // push line buffer +#define D2R_LineBufferMax 1024 + struct LineBuffer { U64 file_index; U64 voffs[D2R_LineBufferMax]; U32 line_nums[D2R_LineBufferMax]; U32 col_nums[D2R_LineBufferMax]; } LineBuffer; + struct LineBuffer *line_buffer = push_array(temp.arena, struct LineBuffer, 1); + U64 line_buffer_size = 0; + + // decode line sequences + DW_LineVM *vm = line_vms[cu_idx]; + U64 *line_seq_counts_per_file = push_array(temp.arena, U64, vm->header.file_table.count); + while (dw_line_vm_step(vm)) { + if (vm->new_line) { + // lazy defined files are not supported + if (vm->state.file_index >= vm->header.file_table.count) { continue; } + + // time to flush the buffer? + if (((vm->opcode == DW_StdOpcode_ExtendedOpcode && vm->ext_opcode == DW_ExtOpcode_EndSequence) || + (line_buffer_size >= D2R_LineBufferMax || line_buffer->file_index != vm->state.file_index)) + && line_buffer_size > 0) { + // lookup source file + DW_LineFile *file = &vm->header.file_table.v[line_buffer->file_index]; + U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); + D2R_SrcFileLookup *lookup = lfht_search(src_file_lfht, hash, &(D2R_SrcFileLookup){ .file = file, .vm = vm }, d2r_src_file_lookup_is_equal, 0); + RDIM_SrcFile *src_file = lookup->src_file; + + // copy line info + U64 *voffs = push_array_no_zero(arena, U64, line_buffer_size + 1); + U32 *line_nums = push_array_no_zero(arena, U32, line_buffer_size); + voffs[line_buffer_size] = vm->state.address - image_base; + MemoryCopyTyped(voffs, line_buffer->voffs, line_buffer_size); + MemoryCopyTyped(line_nums, line_buffer->line_nums, line_buffer_size); + + RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, lane_line_table_chunk_list, line_table, src_file, voffs, line_nums, 0, line_buffer_size); + + // atomic implementation of @rdim_src_file_push_line_sequence + { + // associate line fragment with source file + RDIM_SrcFileLineMapFragment *line_frag = push_array(arena, RDIM_SrcFileLineMapFragment, 1); + line_frag->seq = line_seq; + + // insert line fragment node + for (;;) { + RDIM_SrcFileLineMapFragment *next = src_file->first_line_map_fragment; + line_frag->next = next; + RDIM_SrcFileLineMapFragment *curr = ins_atomic_ptr_eval_cond_assign(&src_file->first_line_map_fragment, line_frag, next); + if (curr == 0) { + ins_atomic_u64_add_eval(&g_d2r_shared.src_files.source_line_map_count, 1); + } + if (curr == next) { break; } + } + + // accumulate line sequence counts per file + line_seq_counts_per_file[vm->state.file_index] += line_seq->line_count; + + // accumulate line sequence counts per lane + line_seq_counts_per_lane[lane_idx()] += line_seq->line_count; + } + + // reset line buffer size tracker + line_buffer_size = 0; + } + + if (line_buffer_size > 0 && line_buffer->voffs[line_buffer_size - 1] == vm->state.address) { + line_buffer->line_nums[line_buffer_size - 1] = Min(line_buffer->line_nums[line_buffer_size - 1], safe_cast_u32(vm->state.line)); + } else { + // append line to the buffer + line_buffer->file_index = vm->state.file_index; + line_buffer->voffs[line_buffer_size] = vm->state.address - image_base; + line_buffer->line_nums[line_buffer_size] = safe_cast_u32(vm->state.line); + line_buffer_size += 1; + } + } + } + + // update line sequence counts per source file @rdim_src_file_push_line_sequence + for EachIndex(file_idx, vm->header.file_table.count) { + if (line_seq_counts_per_file[file_idx] > 0) { + DW_LineFile *file = &vm->header.file_table.v[file_idx]; + U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); + D2R_SrcFileLookup *lookup = lfht_search(src_file_lfht, hash, &(D2R_SrcFileLookup){ .file = file, .vm = vm }, d2r_src_file_lookup_is_equal, 0); + RDIM_SrcFile *src_file = lookup->src_file; + ins_atomic_u64_add_eval(&src_file->total_line_count, line_seq_counts_per_file[file_idx]); + } + } + } + + // TODO: sync + // + // update total line sequences count in shared @rdim_src_file_push_line_sequence + for EachIndex(i, lane_count()) { + g_d2r_shared.src_files.total_line_count += line_seq_counts_per_lane[i]; + } + + // TODO: sync + for EachIndex(i, lane_count()) { + rdim_line_table_chunk_list_concat_in_place(&g_d2r_shared.line_tables, &lane_line_table_chunks[i]); + } + + // TODO: per thread task + ProfBegin("Relase line VMs"); + for EachIndex(i, cu_ranges.count) { + dw_line_vm_release(line_vms[i]); + } + ProfEnd(); + + temp_end(temp); + } + + //////////////////////////////// + + RDIM_Type *builtin_types[RDI_TypeKind_COUNT] = {0}; + for (RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) { + RDIM_Type *type = rdim_type_chunk_list_push(arena, &g_d2r_shared.types, D2R_TYPE_CHUNK_CAP); + type->kind = type_kind; + type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); + type->byte_size = rdi_size_from_basic_type_kind(type_kind); + builtin_types[type_kind] = type; + } + + // fixup float80 size + if (arch == Arch_x64 || arch == Arch_arm64) { + builtin_types[RDI_TypeKind_F80]->byte_size = 16; + } + + builtin_types[RDI_TypeKind_Void]->byte_size = rdi_addr_size_from_arch(g_d2r_shared.top_level_info.arch); + builtin_types[RDI_TypeKind_Handle]->byte_size = rdi_addr_size_from_arch(g_d2r_shared.top_level_info.arch); + + builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &g_d2r_shared.types, D2R_TYPE_CHUNK_CAP); + builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; + + //////////////////////////////// + + ProfBegin("Convert Units"); + for EachIndex(cu_idx, cu_ranges.count) { + Temp comp_temp = temp_begin(scratch.arena); + + DW_CompUnit *cu = &cu_arr[cu_idx]; + + // skip DWO + { + if (cu->dwo_id) { goto next_cu; } + + String8 dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_DwoName); + if (dwo_name.size) { goto next_cu; } + + String8 gnu_dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_GNU_DwoName); + if (gnu_dwo_name.size) { goto next_cu; } + } + + // parse and build tag tree + DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu); + + // build (info offset -> tag) hash table to resolve tags with abstract origin + cu->tag_ht = dw_make_tag_hash_table(comp_temp.arena, tag_tree); + + // extract compile unit info + String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); + String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); + String8 cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer); + DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language); + + // init type table + D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); + type_table->ht = hash_table_init(comp_temp.arena, 0x4000); + type_table->types = &g_d2r_shared.types; + type_table->type_chunk_cap = D2R_TYPE_CHUNK_CAP; + type_table->builtin_types = builtin_types; + + // convert compile unit + RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &g_d2r_shared.units, D2R_UNIT_CHUNK_CAP); + { + RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; + if (cu_idx < cu_contrib_map.count) { + cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); + } else { + Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); + for EachNode(n, Rng1U64Node, range_list.first) { + rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); + } + } + unit->unit_name = cu_name; + unit->compiler_name = cu_prod; + unit->source_file = str8_zero(); // TODO + unit->object_file = str8_zero(); // TODO + unit->archive_file = str8_zero(); // TODO + unit->build_path = cu_dir; + unit->language = d2r_rdi_language_from_dw_language(cu_lang); + unit->line_table = cu_line_tables_rdi[cu_idx]; + unit->voff_ranges = cu_voff_ranges; + } + + // convert debug info + d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch, tag_tree.root); + d2r_convert_udts(arena, type_table, &input, cu, cu_lang, tag_tree.root); + d2r_convert_symbols(arena, type_table, &input, cu, cu_lang, image_base, arch, tag_tree.root, unit); + + next_cu:; + temp_end(comp_temp); + } + ProfEnd(); + } + + lane_sync(); + + RDIM_BakeParams bake_params = {0}; + bake_params.subset_flags = params->subset_flags; + bake_params.top_level_info = g_d2r_shared.top_level_info; + bake_params.binary_sections = g_d2r_shared.binary_sections; + bake_params.units = g_d2r_shared.units; + bake_params.types = g_d2r_shared.types; + bake_params.udts = g_d2r_shared.udts; + bake_params.src_files = g_d2r_shared.src_files; + bake_params.line_tables = g_d2r_shared.line_tables; + + scratch_end(scratch); + return bake_params; +} + diff --git a/obsolete/rdi_from_dwarf/rdi_from_dwarf_old.h b/obsolete/rdi_from_dwarf/rdi_from_dwarf_old.h new file mode 100644 index 00000000..59d19040 --- /dev/null +++ b/obsolete/rdi_from_dwarf/rdi_from_dwarf_old.h @@ -0,0 +1,275 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_FROM_DWARF_H +#define RDI_FROM_DWARF_H + +//////////////////////////////// +//~ Conversion + +typedef struct D2R_ConvertParams +{ + String8 dbg_name; + String8 dbg_data; + String8 exe_name; + String8 exe_data; + ExecutableImageKind exe_kind; + RDIM_SubsetFlags subset_flags; + B32 deterministic; + B32 is_parse_relaxed; +} D2R_ConvertParams; + +#define D2R_UNIT_CHUNK_CAP 512 +#define D2R_UDT_CHUNK_CAP 1024 +#define D2R_TYPE_CHUNK_CAP 1024 +#define D2R_SRC_FILE_CAP 1024 +#define D2R_LINE_TABLE_CAP 1024 +#define D2R_GVAR_CHUNK_CAP 1024 +#define D2R_TVAR_CHUNK_CAP 1024 +#define D2R_LOCATIONS_CAP 4096 +#define D2R_PROC_CHUNK_CAP 4096 +#define D2R_SCOPE_CHUNK_CAP 4096 +#define D2R_INLINE_SITE_CHUNK_CAP 4096 + +typedef struct D2R_Shared +{ + RDIM_TopLevelInfo top_level_info; + RDIM_BinarySectionList binary_sections; + RDIM_UnitChunkList units; + RDIM_UDTChunkList udts; + RDIM_TypeChunkList types; + RDIM_SrcFileChunkList src_files; + RDIM_LineTableChunkList line_tables; +} D2R_Shared; + +//////////////////////////////// +//~ Value Types + +typedef enum +{ + D2R_ArithmeticType_Null, + D2R_ArithmeticType_Signed, + D2R_ArithmeticType_Unsigned, + D2R_ArithmeticType_Float, +} D2R_ArithmeticType; + +#define D2R_ValueType_Signed_XList \ +X(S8, Signed, 1 ) \ +X(S16, Signed, 2 ) \ +X(S32, Signed, 4 ) \ +X(S64, Signed, 8 ) \ +X(S128, Signed, 16) \ +X(S256, Signed, 32) \ +X(S512, Signed, 64) + +#define D2R_ValueType_Unsigned_XList \ +X(U8, Unsigned, 1 ) \ +X(U16, Unsigned, 2 ) \ +X(U32, Unsigned, 4 ) \ +X(U64, Unsigned, 8 ) \ +X(U128, Unsigned, 16) \ +X(U256, Unsigned, 32) \ +X(U512, Unsigned, 64) + +#define D2R_ValueType_Float_XList \ +X(F16, Float, 2 ) \ +X(F32, Float, 4 ) \ +X(F48, Float, 6 ) \ +X(F64, Float, 8 ) \ +X(F80, Float, 10) \ +X(F96, Float, 12) \ +X(F128, Float, 16) + +#define D2R_ValueType_XList \ +X(Generic, Null, 0 ) \ +X(ImplicitValue, Null, 0 ) \ +X(Address, Unsigned, 0 ) \ +D2R_ValueType_Signed_XList \ +D2R_ValueType_Unsigned_XList \ +D2R_ValueType_Float_XList + +typedef enum +{ +#define X(t, ...) D2R_ValueType_##t, + D2R_ValueType_XList +#undef X + D2R_ValueType_Bool = D2R_ValueType_S8, +} D2R_ValueType; + +typedef struct D2R_ValueTypeNode +{ + D2R_ValueType type; + struct D2R_ValueTypeNode *next; +} D2R_ValueTypeNode; + +typedef struct D2R_ValueTypeStack +{ + U64 count; + D2R_ValueTypeNode *top; + D2R_ValueTypeNode *free_list; +} D2R_ValueTypeStack; + +//////////////////////////////// +//~ Type Table + +typedef struct D2R_TypeTable +{ + HashTable *ht; + RDIM_TypeChunkList *types; + U64 type_chunk_cap; + RDIM_Type **builtin_types; +} D2R_TypeTable; + +//////////////////////////////// +//~ Tag Iterator + +typedef DW_TagSpare D2R_TagFlags; +enum +{ + D2R_TagFlags_TypeConverted = (1 << 0), + D2R_TagFlags_UdtConverted = (1 << 1), +}; + +typedef struct D2R_TagFrame +{ + DW_TagNode *node; + RDIM_Scope *scope; + struct D2R_TagFrame *next; +} D2R_TagFrame; + +typedef struct D2R_TagIterator +{ + D2R_TagFrame *free_list; + D2R_TagFrame *stack; + DW_TagNode *null_tag_node; + DW_TagNode *tag_node; + B32 visit_children; +} D2R_TagIterator; + +//////////////////////////////// +//~ Line Table Conversion + +typedef struct D2R_SrcFileLookup +{ + DW_LineFile *file; + DW_LineVM *vm; + RDIM_SrcFile *src_file; +} D2R_SrcFileLookup; + +//////////////////////////////// +//~ Contrib Map + +typedef struct D2R_CompUnitContribMap +{ + U64 count; + U64 *info_off_arr; + RDIM_Rng1U64ChunkList *voff_range_arr; +} D2R_CompUnitContribMap; + +//////////////////////////////// +//~ RDIM Bytecode Extensions + +internal B32 rdim_is_eval_bytecode_static (RDIM_EvalBytecode bc); +internal B32 rdim_static_eval_bytecode_to_voff(RDIM_EvalBytecode bc, U64 image_base, U64 *voff_out); + +//////////////////////////////// +//~ DWARF -> RDI Enums + +internal RDI_Language d2r_rdi_language_from_dw_language(DW_Language v); +internal RDI_RegCodeX64 d2r_rdi_reg_code_from_dw_reg_x64 (DW_RegX64 v); +internal RDI_RegCode d2r_rdi_reg_code_from_dw_reg (Arch arch, DW_Reg v); + +//////////////////////////////// +//~ Value Type + +internal D2R_ValueTypeNode * d2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type); +internal D2R_ValueType d2r_value_type_stack_pop (D2R_ValueTypeStack *stack); +internal D2R_ValueType d2r_value_type_stack_peek(D2R_ValueTypeStack *stack); + +internal D2R_ValueType d2r_signed_value_type_from_bit_size (U64 bit_size); +internal D2R_ValueType d2r_unsigned_value_type_from_bit_size(U64 bit_size); +internal D2R_ValueType d2r_float_type_from_bit_size (U64 bit_size); + +internal U64 d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type); +internal D2R_ArithmeticType d2r_arithmetic_type_from_value_type(D2R_ValueType v); +internal D2R_ArithmeticType d2r_arithmetic_type_from_value_type(D2R_ValueType v); +internal B32 d2r_is_value_type_signed (D2R_ValueType v); +internal B32 d2r_is_value_type_integral(D2R_ValueType v); +internal B32 d2r_is_value_type_unsigned(D2R_ValueType v); +internal B32 d2r_is_value_type_float (D2R_ValueType v); + +internal D2R_ValueType d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs); +internal RDI_EvalTypeGroup d2r_value_type_to_rdi(D2R_ValueType v); + +internal D2R_ValueType d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc); +internal void d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); +internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); + +//////////////////////////////// +//~ Expression Conversion + +internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); +internal RDIM_Location d2r_transpile_expression (Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); +internal RDIM_Location d2r_location_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_locset_from_attrib (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal RDIM_LocationCaseList d2r_var_locset_from_tag (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); + +//////////////////////////////// +//~ Type Table + +internal RDIM_Type * d2r_create_type (Arena *arena, D2R_TypeTable *type_table); +internal RDIM_Type * d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off); +internal RDIM_Type * d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off); +internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); + +//////////////////////////////// +//~ Tag Iterator + +internal D2R_TagIterator * d2r_tag_iterator_init(Arena *arena, DW_TagNode *root); +internal void d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter); +internal void d2r_tag_iterator_skip_children (D2R_TagIterator *iter); +internal DW_TagNode * d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter); +internal DW_Tag d2r_tag_iterator_parent_tag (D2R_TagIterator *iter); + +//////////////////////////////// +//~ Type Conversion + +internal void d2r_flag_converted_tag(DW_TagNode *tag_node); +internal B8 d2r_is_tag_converted (DW_TagNode *tag_node); +internal RDIM_Type * d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind); +internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_TagNode *root); + +//////////////////////////////// +//~ UDT Conversion + +internal B8 d2r_is_udt_tag_converted (DW_TagNode *tag_node); +internal void d2r_flag_converted_udt_tag(DW_TagNode *tag_node); +internal void d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, RDIM_UDT *udt); +internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, DW_TagNode *root); + +//////////////////////////////// +//~ Symbol Conversion + +internal RDIM_Scope * d2r_push_scope (Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges); +internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); +internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); +internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, Arch arch, DW_TagNode *root, RDIM_Unit *unit_rdi); + +//////////////////////////////// +//~ Line Table Conversion + +internal U64 d2r_hash_line_file(String8 dir_path, DW_LineFile *file); +internal void d2r_sort_ptrs(void **ptrs, U64 count, int (* is_before)(void *a, void *b)); + +//////////////////////////////// +//~ Contrib Map + +internal D2R_CompUnitContribMap d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Raw *input, U64 image_base); +internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); + +//////////////////////////////// +//~ Entry Point + +internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params); + +#endif // RDI_FROM_DWARF_H diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 2b4ae04e..5a7e7bcf 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -41,7 +41,7 @@ #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" -#include "rdi_from_dwarf/rdi_from_dwarf_2.h" +#include "rdi_from_dwarf/rdi_from_dwarf.h" #include "radbin/radbin.h" //- rjf: [c] @@ -75,7 +75,7 @@ #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" -#include "rdi_from_dwarf/rdi_from_dwarf_2.c" +#include "rdi_from_dwarf/rdi_from_dwarf.c" #include "radbin/radbin.c" //////////////////////////////// diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 64c9e83d..5d4f8d49 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -336,7 +336,7 @@ #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" -#include "rdi_from_dwarf/rdi_from_dwarf_2.h" +#include "rdi_from_dwarf/rdi_from_dwarf.h" #include "radbin/radbin.h" #include "arch/arch_inc.h" #include "dbg_info/dbg_info.h" @@ -393,7 +393,7 @@ #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" -#include "rdi_from_dwarf/rdi_from_dwarf_2.c" +#include "rdi_from_dwarf/rdi_from_dwarf.c" #include "radbin/radbin.c" #include "arch/arch_inc.c" #include "dbg_info/dbg_info.c" diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index f718333a..61ed73bc 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2,3138 +2,4391 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// +//~ rjf: Helpers -static D2R_Shared g_d2r_shared; +internal int +d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r) +{ + int is_less_than = (l[0]->hash < r[0]->hash); + return is_less_than; +} //////////////////////////////// +//~ rjf: Main Conversion Entry Point (New) -internal B32 -rdim_is_eval_bytecode_static(RDIM_EvalBytecode bc) -{ - B32 is_static = 1; - RDI_EvalOp dynamic_ops[] = { RDI_EvalOp_MemRead, RDI_EvalOp_RegRead, RDI_EvalOp_RegReadDyn, RDI_EvalOp_CFA }; - for EachNode(n, RDIM_EvalBytecodeOp, bc.first_op) { - for EachIndex(i, ArrayCount(dynamic_ops)) { - if (dynamic_ops[i] == n->op) { - is_static = 0; - goto exit; - } - } - } - exit:; - return is_static; -} - -internal B32 -rdim_static_eval_bytecode_to_voff(RDIM_EvalBytecode bc, U64 image_base, U64 *voff_out) -{ - Temp scratch = scratch_begin(0,0); - B32 is_ok = 0; - - typedef union { U16 u16; U32 u32; U64 u64; S64 s64; F32 f32; F64 f64; } Value; - U64 stack_cap = 128, stack_count = 0; - Value *stack = push_array(scratch.arena, Value, stack_cap); - - for EachNode(opcode_n, RDIM_EvalBytecodeOp, bc.first_op) { - // pop values from stack - Value *svals = 0; - { - U32 pop_count = RDI_POPN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[opcode_n->op]); - if (pop_count > stack_count) { - goto exit; - } - stack_count -= pop_count; - svals = stack + stack_count; - } - - Value imm = { .u64 = opcode_n->p }; - Value nval = {0}; - switch (opcode_n->op) { - case RDI_EvalOp_Stop: { opcode_n = bc.last_op; } break; - case RDI_EvalOp_Noop: {} break; - case RDI_EvalOp_Cond: { NotImplemented; } break; - case RDI_EvalOp_Skip: { - NotImplemented; - } break; - case RDI_EvalOp_MemRead: { InvalidPath; } break; - case RDI_EvalOp_RegRead: { NotImplemented; } break; - case RDI_EvalOp_RegReadDyn: { NotImplemented; } break; - case RDI_EvalOp_FrameOff: { NotImplemented; } break; - case RDI_EvalOp_ModuleOff: { - nval.u64 = image_base + imm.u64; - } break; - case RDI_EvalOp_TLSOff: { - nval.u64 = image_base; - } break; - case RDI_EvalOp_ConstU8: - case RDI_EvalOp_ConstU16: - case RDI_EvalOp_ConstU32: - case RDI_EvalOp_ConstU64: - case RDI_EvalOp_ConstU128: { - nval = imm; - } break; - case RDI_EvalOp_ConstString: { NotImplemented; } break; - case RDI_EvalOp_Abs: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: - case RDI_EvalTypeGroup_S: { nval.s64 = abs_s64(svals[0].s64); } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = abs_f32(svals[0].f32); } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = abs_f64(svals[0].f64); } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Neg: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: - case RDI_EvalTypeGroup_S: { nval.u64 = ~svals[0].u64 + 1; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = -svals[0].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = -svals[0].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Add: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 + svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 + svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 + svals[1].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 + svals[1].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Sub: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 - svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[1].s64 - svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 - svals[1].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 - svals[1].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Mul: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 * svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 * svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 * svals[1].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 * svals[1].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Div: { - B32 is_div_by_zero = 0; - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { is_div_by_zero = svals[1].u64 == 0; } break; - case RDI_EvalTypeGroup_S: { is_div_by_zero = svals[1].s64 == 0; } break; - case RDI_EvalTypeGroup_F32: { is_div_by_zero = svals[1].f32 == 0.0f; } break; - case RDI_EvalTypeGroup_F64: { is_div_by_zero = svals[1].f64 == 0.0; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - - if (is_div_by_zero) { - Assert(!"trying to div by zero"); - goto exit; - } - - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 / svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 / svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 / svals[1].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 / svals[1].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Mod: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 % svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 % svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 MOD is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 MOD is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_LShift: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 << svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 << svals[1].u64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 LShift is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 LShift is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_RShift: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0 ] .u64 >> svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[1 ] .s64 >> svals[1].u64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 RShift is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 RShift is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_BitAnd: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 | svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 | svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 bitwise AND is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 bitwise AND is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_BitXor: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 ^ svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 ^ svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 XOR is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 XOR is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_BitNot: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = ~svals[0].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = ~svals[0].u64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 bitwise NOT is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 bitwise NOT is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_LogAnd: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 && svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 && svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 AND is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 AND is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_LogOr: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 || svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].u64 || svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 OR is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 OR is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_LogNot: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = !svals[0].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = !svals[0].u64; } break; - case RDI_EvalTypeGroup_F32: { Assert(!"F32 NOT is not supported"); } goto exit; - case RDI_EvalTypeGroup_F64: { Assert(!"F64 NOT is not supported"); } goto exit; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_EqEq: { - nval.u64 = !!MemoryMatch(&svals[0], &svals[1], sizeof(*svals)); - } break; - case RDI_EvalOp_NtEq: { - nval.u64 = !MemoryMatch(&svals[0], &svals[1], sizeof(*svals)); - } break; - case RDI_EvalOp_LsEq: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 <= svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 <= svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 <= svals[1].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 <= svals[1].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_GrEq: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 >= svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 >= svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 >= svals[1].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 >= svals[1].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Less: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 < svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 < svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 < svals[1].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 < svals[1].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Grtr: { - switch (imm.u64) { - case RDI_EvalTypeGroup_Other: {} break; - case RDI_EvalTypeGroup_U: { nval.u64 = svals[0].u64 > svals[1].u64; } break; - case RDI_EvalTypeGroup_S: { nval.s64 = svals[0].s64 > svals[1].s64; } break; - case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 > svals[1].f32; } break; - case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 > svals[1].f64; } break; - default: { Assert(!"unexpected eval type group"); } goto exit; - } - } break; - case RDI_EvalOp_Trunc: { - if (0 < imm.u64 && imm.u64 < 64) { - U64 mask = max_U64 >> (64 - imm.u64); - nval.u64 = svals[0].u64 & (max_U64 >> (64 - imm.u64)); - } else if (imm.u64 > 64) { - Assert(!"malformed bytecode"); - goto exit; - } - } break; - case RDI_EvalOp_TruncSigned: { - if (0 < imm.u64 && imm.u64 < 64) { - U64 mask = max_U64 >> (64 - imm.u64); - nval.u64 = svals[0].u64 & (max_U64 >> (64 - imm.u64)); - U64 high = 0; - if (svals[0].u64 & (1 << (imm.u64 - 1))) { - high = ~mask; - } - nval.u64 = high | (svals[0].u64 & mask); - } else if (imm.u64 > 64) { - Assert(!"malformed bytecode"); - goto exit; - } - } break; - case RDI_EvalOp_Convert: { - U32 in = imm.u64 & 0xff; - U32 out = (imm.u64 >> 8) & 0xff; - if (in != out) { - switch (in + out*RDI_EvalTypeGroup_COUNT) { - case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: { nval.u64 = (U64)svals[0].f32; } break; - case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT: { nval.u64 = (U64)svals[0].f64; } break; - case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: { nval.s64 = (S64)svals[0].f32; } break; - case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT: { nval.s64 = (S64)svals[0].f64; } break; - case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].u64; } break; - case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].s64; } break; - case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].f64; } break; - case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].u64; } break; - case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].s64; } break; - case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].f32; } break; - default: { Assert(!"unexpected conversion case"); } goto exit; - } - } - } break; - case RDI_EvalOp_Pick: { - if (stack_count > imm.u64) { - nval = stack[stack_count - imm.u64 - 1]; - } else { - Assert(!"malformed bytecode"); - goto exit; - } - } break; - case RDI_EvalOp_Pop: {} break; - case RDI_EvalOp_Insert: { - if (stack_count > imm.u64) { - Value tval = stack[stack_count-1]; - Value *dst = stack + stack_count - 1 - imm.u64; - Value *shift = dst + 1; - MemoryCopy(shift, dst, imm.u64 * sizeof(Value)); - *dst = tval; - } else { - Assert(!"malformed bytecode"); - goto exit; - } - } break; - case RDI_EvalOp_ValueRead: { - U64 bytes_to_read = imm.u64; - U64 offset = svals[0].u64; - if (offset + bytes_to_read <= sizeof(Value)) { - Value src_val = svals[1]; - MemoryCopy(&nval, (U8 *)&src_val + offset, bytes_to_read); - } - } break; - case RDI_EvalOp_ByteSwap: { - switch (imm.u64) { - case 0: {} break; - case 1: {} break; - case 2: { nval.u16 = bswap_u16(svals[0].u16); } break; - case 4: { nval.u32 = bswap_u16(svals[0].u32); } break; - case 8: { nval.u64 = bswap_u16(svals[0].u64); } break; - default: { Assert(!"malformed bytecode"); } goto exit; - } - } break; - case RDI_EvalOp_Swap: { - NotImplemented; - } break; - default: { Assert(!"unknown op type"); } break; - } - - // push computed value to the stack - { - U64 push_count = RDI_PUSHN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[opcode_n->op]); - if (push_count == 1) { - if (stack_count < stack_cap) { - stack[stack_count] = nval; - stack_count += 1; - } else { - Assert(!"stack overflow"); - goto exit; - } - } - } - } - - U64 result = 0; - if (stack_count >= 1) { - result = stack[0].u64 - image_base; - } - if (voff_out) { - *voff_out = result; - } - - is_ok = 1; - exit:; - scratch_end(scratch); - return is_ok; -} - -internal RDI_Language -d2r_rdi_language_from_dw_language(DW_Language v) -{ - RDI_Language result = RDI_Language_NULL; - switch (v) { - default: {} break; - - case DW_Language_C89: - case DW_Language_C99: - case DW_Language_C11: - case DW_Language_C: { - result = RDI_Language_C; - } break; - - case DW_Language_CPlusPlus03: - case DW_Language_CPlusPlus11: - case DW_Language_CPlusPlus14: - case DW_Language_CPlusPlus: { - result = RDI_Language_CPlusPlus; - } break; - } - return result; -} - -internal RDI_RegCodeX64 -d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v) -{ - RDI_RegCodeX64 result = RDI_RegCode_nil; - switch (v) { - default: {} break; -#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw: { result = RDI_RegCodeX64_##reg_rdi; } break; - DW_Regs_X64_XList -#undef X - } - return result; -} - -internal RDI_RegCode -d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v) -{ - RDI_RegCode result = RDI_RegCode_nil; - switch (arch) { - default: NotImplemented; break; - case Arch_Null: break; - case Arch_x64:{ result = d2r_rdi_reg_code_from_dw_reg_x64(v); } break; - } - return result; -} - -internal D2R_ValueTypeNode * -d2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type) -{ - D2R_ValueTypeNode *n; - if (stack->free_list) { - n = stack->free_list; - SLLStackPop(stack->free_list); - } else { - n = push_array(arena, D2R_ValueTypeNode, 1); - } - n->type = type; - SLLStackPush(stack->top, n); - stack->count += 1; - return n; -} - -internal D2R_ValueType -d2r_value_type_stack_pop(D2R_ValueTypeStack *stack) -{ - D2R_ValueType result = D2R_ValueType_Generic; - if (stack->top) { - D2R_ValueTypeNode *n = stack->top; - result = n->type; - SLLStackPop(stack->top); - SLLStackPush(stack->free_list, n); - stack->count -= 1; - } - return result; -} - -internal D2R_ValueType -d2r_value_type_stack_peek(D2R_ValueTypeStack *stack) -{ - return stack->top ? stack->top->type : D2R_ValueType_Generic; -} - -internal D2R_ValueType -d2r_signed_value_type_from_bit_size(U64 bit_size) -{ - switch (bit_size) { -#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; - D2R_ValueType_Signed_XList -#undef X - } - AssertAlways(!"no suitable signed type was found for the specified size"); - return D2R_ValueType_Generic; -} - -internal D2R_ValueType -d2r_unsigned_value_type_from_bit_size(U64 bit_size) -{ - switch (bit_size) { -#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; - D2R_ValueType_Unsigned_XList -#undef X - } - AssertAlways(!"no suitable unsigned type was found for the specified size"); - return D2R_ValueType_Generic; -} - -internal D2R_ValueType -d2r_float_type_from_bit_size(U64 bit_size) -{ -#define X(_N, _AT, _S) case _S: return D2R_ValueType_##_N; - switch (bit_size) { - D2R_ValueType_Float_XList - } -#undef X - AssertAlways(!"no suitable type was found for the specified size"); - return D2R_ValueType_Generic; -} - -internal D2R_ArithmeticType -d2r_arithmetic_type_from_value_type(D2R_ValueType v) -{ -#define X(_N, _AT, ...) case D2R_ValueType_##_N: return D2R_ArithmeticType_##_AT; - switch (v) { - D2R_ValueType_XList - } -#undef X - return D2R_ArithmeticType_Null; -} - -internal B32 -d2r_is_value_type_signed(D2R_ValueType v) -{ - return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Signed; -} - -internal B32 -d2r_is_value_type_integral(D2R_ValueType v) -{ - D2R_ArithmeticType at = d2r_arithmetic_type_from_value_type(v); - return at == D2R_ArithmeticType_Unsigned || at == D2R_ArithmeticType_Signed; -} - -internal B32 -d2r_is_value_type_unsigned(D2R_ValueType v) -{ - return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Unsigned; -} - -internal B32 -d2r_is_value_type_float(D2R_ValueType v) -{ - return d2r_arithmetic_type_from_value_type(v) == D2R_ArithmeticType_Float; -} - -internal U64 -d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type) -{ - if (value_type == D2R_ValueType_Address) { - return addr_size; - } - - switch (value_type) { -#define X(_N, _AT, _S) case D2R_ValueType_##_N: return _S; - D2R_ValueType_XList -#undef X - } - - return 0; -} - -internal D2R_ValueType -d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs) -{ - if (lhs == rhs) { - return lhs; - } - // unsigned vs unsigned - else if (d2r_is_value_type_unsigned(lhs) && d2r_is_value_type_unsigned(rhs)) { - return Max(lhs, rhs); - } - // signed vs signed - else if (d2r_is_value_type_signed(lhs) && d2r_is_value_type_signed(rhs)) { - return Max(lhs, rhs); - } - // (unsigned vs signed) || (signed vs unsigned) - else if ((d2r_is_value_type_unsigned(lhs) && d2r_is_value_type_signed(rhs)) || - (d2r_is_value_type_signed(lhs) && d2r_is_value_type_unsigned(rhs))) { - U64 lhs_size = d2r_size_from_value_type(0, lhs); - U64 rhs_size = d2r_size_from_value_type(0, rhs); - if (lhs_size < rhs_size) { - return rhs; - } else if (lhs > rhs_size) { - return lhs; - } else { - return d2r_unsigned_value_type_from_bit_size(lhs_size * 8); - } - } - // float vs int - else if (d2r_is_value_type_float(lhs) && d2r_is_value_type_integral(rhs)) { - return lhs; - } - // int vs float - else if (d2r_is_value_type_integral(lhs) && d2r_is_value_type_float(rhs)) { - return rhs; - } - // float vs float - else if (d2r_is_value_type_float(lhs) && d2r_is_value_type_float(rhs)) { - return Max(lhs, rhs); - } - // address vs int - else if (lhs == D2R_ValueType_Address && d2r_is_value_type_integral(rhs)) { - return D2R_ValueType_Address; - } - // int vs address - else if (d2r_is_value_type_integral(lhs) && rhs == D2R_ValueType_Address) { - return D2R_ValueType_Address; - } - // address vs float - else if (lhs == D2R_ValueType_Address && d2r_is_value_type_float(rhs)) { - return D2R_ValueType_Generic; - } - // float vs address - else if (d2r_is_value_type_float(lhs) && rhs == D2R_ValueType_Address) { - return D2R_ValueType_Generic; - } - // no conversion for implicit value - else if (lhs == D2R_ValueType_ImplicitValue || rhs == D2R_ValueType_ImplicitValue) { - return D2R_ValueType_Generic; - } - AssertAlways(!"undefined conversion case"); - return D2R_ValueType_Generic; -} - -internal RDI_EvalTypeGroup -d2r_value_type_to_rdi(D2R_ValueType v) -{ - if (v == D2R_ValueType_Generic) { - return RDI_EvalTypeGroup_Other; - } - - if (v == D2R_ValueType_Address) { - return RDI_EvalTypeGroup_U; - } - - if (d2r_is_value_type_unsigned(v)) { - return RDI_EvalTypeGroup_U; - } - - if (d2r_is_value_type_signed(v)) { - return RDI_EvalTypeGroup_S; - } - - if (d2r_is_value_type_float(v)) { - if (v == D2R_ValueType_F16) { NotImplemented; } - else if (v == D2R_ValueType_F32) { return RDI_EvalTypeGroup_F32; } - else if (v == D2R_ValueType_F48) { NotImplemented; } - else if (v == D2R_ValueType_F64) { return RDI_EvalTypeGroup_F64; } - else if (v == D2R_ValueType_F80) { return RDI_EvalTypeGroup_F80; } - else if (v == D2R_ValueType_F96) { NotImplemented; } - else if (v == D2R_ValueType_F128) { return RDI_EvalTypeGroup_F128; } - else { InvalidPath; } - } - - InvalidPath; - return RDI_EvalTypeGroup_Other; -} - -internal D2R_ValueType -d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc) -{ - D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); - if (rhs != common_type) { - rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(rhs), d2r_value_type_to_rdi(common_type)); - } - if (lhs != common_type) { - rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0); - rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(lhs), d2r_value_type_to_rdi(common_type)); - } - return common_type; -} - -internal void -d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op) -{ - D2R_ValueType rhs = d2r_value_type_stack_pop(stack); - D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - D2R_ValueType common_type = d2r_apply_usual_arithmetic_conversions(arena, lhs, rhs, bc); - rdim_bytecode_push_op(arena, bc, op, d2r_value_type_to_rdi(common_type)); - d2r_value_type_stack_push(0, stack, common_type); -} - -internal void -d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op) -{ - D2R_ValueType rhs = d2r_value_type_stack_pop(stack); - D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - D2R_ValueType common_type; - if (d2r_is_value_type_integral(lhs) && rhs == D2R_ValueType_Address) { - rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0); - rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(lhs), RDI_EvalTypeGroup_U); - rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0); - common_type = D2R_ValueType_Address; - } else if (lhs == D2R_ValueType_Address && d2r_is_value_type_integral(rhs)) { - rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(rhs), RDI_EvalTypeGroup_U); - common_type = D2R_ValueType_Address; - } else { - common_type = d2r_apply_usual_arithmetic_conversions(arena, lhs, rhs, bc); - } - rdim_bytecode_push_op(arena, bc, RDI_EvalOp_EqEq, d2r_value_type_to_rdi(common_type)); - d2r_value_type_stack_push(0, stack, D2R_ValueType_Bool); -} - -internal RDIM_EvalBytecode -d2r_bytecode_from_expression(Arena *arena, - DW_Raw *input, - U64 image_base, - Arch arch, - DW_ListUnit *addr_lu, - String8 raw_expr, - DW_CompUnit *cu, - D2R_ValueType *result_type_out) +internal RDIM_BakeParams +d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); - Temp temp = temp_begin(arena); - B32 is_ok = 0; + DW_Raw *raw = ¶ms->raw; + RDIM_BinarySectionList binary_sections = params->binary_sections; + Arch arch = params->arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 base_vaddr = params->base_vaddr; + U64 arch_addr_size = byte_size_from_arch(arch); - RDIM_EvalBytecode bc = {0}; - - DW_Expr expr = dw_expr_from_data(scratch.arena, cu->format, cu->address_size, raw_expr); - D2R_ValueTypeStack *stack = push_array(scratch.arena, D2R_ValueTypeStack, 1); - RDIM_EvalBytecodeOp **converted_insts = push_array(scratch.arena, RDIM_EvalBytecodeOp *, expr.count); - U64 inst_idx = 0; - for EachNode(inst, DW_ExprInst, expr.first) { - RDIM_EvalBytecodeOp *last_op = bc.last_op; - - U64 pop_count = dw_pop_count_from_expr_op(inst->opcode); - if (pop_count > stack->count) { - Assert(!"not enough values on the stack to evaluate instruction"); - goto exit; + //////////////////////////// + //- rjf: determine acceptable address range + // + // in many cases, linkers seem to trample over addresses in various DWARF sections, + // potentially due to optimizations. we'd like to filter out those busted addresses + // from our final debug info - a good enough heuristic is to disqualify them by + // whether or not they actually fall into the ranges covered by the binary sections. + // + Rng1U64 acceptable_vaddr_range = {0}; + { + acceptable_vaddr_range.min = max_U64; + acceptable_vaddr_range.max = 0; + for EachNode(n, RDIM_BinarySectionNode, binary_sections.first) + { + acceptable_vaddr_range.min = Min(base_vaddr + n->v.voff_first, acceptable_vaddr_range.min); + acceptable_vaddr_range.max = Max(base_vaddr + n->v.voff_opl, acceptable_vaddr_range.max); } - - switch (inst->opcode) { - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: { - U64 lit = inst->opcode - DW_ExprOp_Lit0; - rdim_bytecode_push_uconst(arena, &bc, lit); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U8); - } break; - case DW_ExprOp_Const1U: { - rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u8); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U8); - } break; - case DW_ExprOp_Const2U: { - rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u16); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U16); - } break; - case DW_ExprOp_Const4U: { - rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u32); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U32); - } break; - case DW_ExprOp_Const8U: { - rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u32); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U64); - } break; - case DW_ExprOp_Const1S: { - rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s8); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S8); - } break; - case DW_ExprOp_Const2S: { - rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s16); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S16); - } break; - case DW_ExprOp_Const4S: { - rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s32); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S32); - } break; - case DW_ExprOp_Const8S: { - rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s64); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S64); - } break; - case DW_ExprOp_ConstU: { - rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u64); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U64); - } break; - case DW_ExprOp_ConstS: { - rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s64); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S64); - } break; - case DW_ExprOp_Addr: { - if (inst->operands[0].u64 < image_base) { - Assert(!"invalid address"); - goto exit; - } - - U64 voff = inst->operands[0].u64 - image_base; - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); - } break; - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: { - U64 reg_code_dw = inst->opcode - DW_ExprOp_Reg0; - U64 reg_size = dw_reg_size_from_code(arch, reg_code_dw); - U64 reg_pos = dw_reg_pos_from_code(arch, reg_code_dw); - - RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw); - U32 regread_param = RDI_EncodeRegReadParam(reg_code_rdi, reg_size, reg_pos); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, regread_param); - d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(reg_size)); - } break; - case DW_ExprOp_RegX: { - U64 reg_size = dw_reg_size_from_code(arch, inst->operands[0].u64); - U64 reg_pos = dw_reg_pos_from_code(arch, inst->operands[0].u64); - RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, inst->operands[0].u64); - U32 regread_param = RDI_EncodeRegReadParam(reg_code_rdi, reg_size, reg_pos); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, regread_param); - D2R_ValueType value_type; - if (arch == Arch_x64) { - if (reg_code_rdi == RDI_RegCodeX64_st0 || - reg_code_rdi == RDI_RegCodeX64_st1 || - reg_code_rdi == RDI_RegCodeX64_st2 || - reg_code_rdi == RDI_RegCodeX64_st3 || - reg_code_rdi == RDI_RegCodeX64_st4 || - reg_code_rdi == RDI_RegCodeX64_st5 || - reg_code_rdi == RDI_RegCodeX64_st6 || - reg_code_rdi == RDI_RegCodeX64_st7) { - value_type = d2r_float_type_from_bit_size(reg_size); - } else { - value_type = d2r_unsigned_value_type_from_bit_size(reg_size); - } - } else { - value_type = d2r_unsigned_value_type_from_bit_size(reg_size); - } - d2r_value_type_stack_push(scratch.arena, stack, value_type); - } break; - case DW_ExprOp_ImplicitValue: { - if (inst->operands[0].block.size <= sizeof(U64)) { - U64 implicit_value; - MemoryCopyStr8(&implicit_value, inst->operands[0].block); - rdim_bytecode_push_uconst(arena, &bc, implicit_value); - d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(inst->operands[0].block.size * 8)); - } else { - // TODO: currenlty no way to encode string in RDIM_EvalBytecodeOp - Assert(!"TODO:"); - goto exit; - } - } break; - case DW_ExprOp_Piece: { - U64 partial_value_size32 = safe_cast_u32(inst->operands[0].u64); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PartialValue, partial_value_size32); - } break; - case DW_ExprOp_BitPiece: { - U32 piece_bit_size32 = safe_cast_u32(inst->operands[0].u64); - U32 piece_bit_off32 = safe_cast_u32(inst->operands[1].u64); - U64 partial_value = Compose64Bit(piece_bit_size32, piece_bit_off32); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PartialValueBit, partial_value); - } break; - case DW_ExprOp_Pick: { - U64 idx = 0; - D2R_ValueTypeNode *n; - for (n = stack->top; n != 0 || idx == inst->operands[0].u64; n = n->next, idx += 1) { } - if (idx == inst->operands[0].u64) { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, inst->operands[0].u64); - d2r_value_type_stack_push(scratch.arena, stack, n->type); - } else { - Assert(!"out of bounds pick"); - goto exit; - } - } break; - case DW_ExprOp_Over: { - if (stack->top && stack->top->next) { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, 1); - d2r_value_type_stack_push(scratch.arena, stack, stack->top->next->type); - } else { - Assert(!"out of bounds over"); - goto exit; - } - } break; - case DW_ExprOp_PlusUConst: { - D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - D2R_ValueType common_type = d2r_pick_common_value_type(lhs, D2R_ValueType_U64); - rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u64); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, d2r_value_type_to_rdi(common_type)); - d2r_value_type_stack_push(scratch.arena, stack, common_type); - } break; - case DW_ExprOp_Skip: { - B32 skip_fwd = inst->operands[0].s16 >= 0; - U16 delta = abs_s64(inst->operands[0].s16); - U16 cursor = 0; - U64 inst_count = 0; - for (DW_ExprInst *i = skip_fwd ? inst : inst->prev; i != 0 && cursor < delta; i = skip_fwd ? inst->next : inst->prev) { - cursor += i->size; - inst_count += 1; - } - - if (cursor != delta) { Assert(!"skip landed in middle of an instruction"); goto exit; } - if (inst_count > min_S16) { Assert(!"operand overflow"); goto exit; } - if (inst_idx > max_U32) { Assert(!"index overflow"); goto exit; } - - U64 imm = Compose64Bit(inst_idx, skip_fwd ? (S16)inst_count : (U16)(-(S16)inst_count)); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Skip, imm); - } break; - case DW_ExprOp_Bra: { - B32 skip_fwd = inst->operands[0].s16 >= 0; - U16 delta = abs_s64(inst->operands[0].s16); - U16 cursor = 0; - U64 inst_count = 0; - for (DW_ExprInst *i = skip_fwd ? inst->next : inst->prev; i != 0 && cursor < delta; i = skip_fwd ? inst->next : inst->prev) { - cursor += i->size; - inst_count += 1; - } - - if (cursor != delta) { Assert(!"cond landed in middle of an instruction"); goto exit; } - if (inst_count > min_S16) { Assert(!"operand overflow"); goto exit; } - if (inst_idx > max_U32) { Assert(!"index overflow"); goto exit; } - - U64 imm = Compose64Bit(inst_idx, skip_fwd ? inst_count : (U16)(-(S16)inst_count)); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Cond, imm); - } break; - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: { - U64 reg_code_dw = inst->opcode - DW_ExprOp_BReg0; - S64 reg_off = inst->operands[0].s64; - - RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, reg_code_rdi); - if (reg_off > 0) { - rdim_bytecode_push_sconst(arena, &bc, reg_off); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); - } - - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); - } break; - case DW_ExprOp_BRegX: { - U64 reg_code_dw = inst->operands[0].u64; - S64 reg_off = inst->operands[1].s64; - - RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegReadDyn, reg_code_rdi); - if (reg_off > 0) { - rdim_bytecode_push_sconst(arena, &bc, reg_off); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); - } - - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); - } break; - case DW_ExprOp_FBReg: { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_FrameOff, inst->operands[0].s64); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); - } break; - case DW_ExprOp_Deref: { - D2R_ValueType address_type = d2r_value_type_stack_pop(stack); - if (address_type != D2R_ValueType_Address && !d2r_is_value_type_integral(address_type)) { - Assert(!"value must be of integral type"); - goto exit; - } - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, cu->address_size); - d2r_value_type_stack_push(scratch.arena, stack, address_type); - } break; - case DW_ExprOp_DerefSize: { - D2R_ValueType address_type = d2r_value_type_stack_pop(stack); - if (!d2r_is_value_type_integral(address_type) && address_type != D2R_ValueType_Address ) { - Assert(!"value must be of integral type"); - goto exit; - } - U8 deref_size_in_bytes = inst->operands[0].u64; - if (0 < deref_size_in_bytes && deref_size_in_bytes <= cu->address_size) { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, deref_size_in_bytes); - } else { - Assert(!"ill formed expression"); - goto exit; - } - d2r_value_type_stack_push(scratch.arena, stack, address_type); - } break; - case DW_ExprOp_XDeref: { - Assert(!"multiple address spaces are not supported"); - goto exit; - } break; - case DW_ExprOp_XDerefSize: { - Assert(!"no suitable conversion"); - goto exit; - } break; - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: { - Assert(!"calls are not supported"); - goto exit; - } break; - case DW_ExprOp_ImplicitPointer: - case DW_ExprOp_GNU_ImplicitPointer: { - // TODO: RDI does not support encoding of implicit pointers - //Assert(!"TODO: implicit pointer"); - goto exit; - } break; - case DW_ExprOp_Convert: - case DW_ExprOp_GNU_Convert: { - D2R_ValueType out = D2R_ValueType_Generic; - if (inst->operands[0].u64 == 0) { - // - // 2.5.1 - // Instead of a base type, elements can have a generic type, - // which is an integral type that has the size of an address - // on the target machine and unspecified signedness. - // - out = D2R_ValueType_Generic; - } else { - // find ref tag - U64 ref_tag_info_off = cu->info_range.min + inst->operands[0].u64; - DW_TagNode *tag_node = dw_tag_node_from_info_off(cu, ref_tag_info_off); - if (tag_node == 0) { - Assert(!"invalid .debug_info offset"); - goto exit; - } - - DW_Tag tag = tag_node->tag; - if (tag.kind == DW_TagKind_BaseType) { - // extract encoding attribute - DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); - - // DW_ATE -> RDI_EvalTypeGroup - switch (encoding) { - case DW_ATE_Null: { - out = D2R_ValueType_Generic; - } break; - case DW_ATE_Address: { - out = D2R_ValueType_Address; - } break; - case DW_ATE_Boolean: { - out = D2R_ValueType_S8; - } break; - case DW_ATE_SignedChar: - case DW_ATE_Signed: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_signed_value_type_from_bit_size(byte_size * 8); - } break; - case DW_ATE_UnsignedChar: - case DW_ATE_Unsigned: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_unsigned_value_type_from_bit_size(byte_size * 8); - } break; - case DW_ATE_Float: { - U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); - out = d2r_float_type_from_bit_size(byte_size * 8); - } break; - default: InvalidPath; break; - } - } else { - Assert(!"unexpected tag"); - goto exit; - } - } - - D2R_ValueType in = d2r_value_type_stack_pop(stack); - d2r_value_type_stack_push(scratch.arena, stack, out); - rdim_bytecode_push_convert(arena, &bc, d2r_value_type_to_rdi(in), d2r_value_type_to_rdi(out)); - } break; - case DW_ExprOp_GNU_ParameterRef: { - Assert(!"TODO: sample"); - goto exit; - } - case DW_ExprOp_DerefType: - case DW_ExprOp_GNU_DerefType: { - goto exit; - } - case DW_ExprOp_ConstType: - case DW_ExprOp_GNU_ConstType: { - Assert(!"TODO: sample"); - goto exit; - } - case DW_ExprOp_RegvalType: { - Assert(!"sample"); - goto exit; - } - case DW_ExprOp_EntryValue: - case DW_ExprOp_GNU_EntryValue: { - D2R_ValueType call_site_result_type = 0; - RDIM_EvalBytecode call_site_bc = d2r_bytecode_from_expression(arena, input, image_base, arch, addr_lu, inst->operands[0].block, cu, &call_site_result_type); - - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_CallSiteValue, safe_cast_u32(call_site_bc.encoded_size)); - rdim_bytecode_concat_in_place(&bc, &call_site_bc); - - d2r_value_type_stack_push(scratch.arena, stack, call_site_result_type); - } break; - case DW_ExprOp_Addrx: { - U64 addr = dw_addr_from_list_unit(addr_lu, inst->operands[0].u64); - if (addr != max_U64) { - if (addr >= image_base) { - U64 voff = addr - image_base; - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); - } else { - Assert(!"unable to relocate address"); - goto exit; - } - } else { - Assert(!"out of bounds index"); - goto exit; - } - } break; - case DW_ExprOp_CallFrameCfa: { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PushCfa, 0); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); - } break; - case DW_ExprOp_PushObjectAddress: { - Assert(!"TODO: sample"); - goto exit; - } - case DW_ExprOp_Nop: {} break; - case DW_ExprOp_Eq: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_EqEq); } break; - case DW_ExprOp_Ge: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_GrEq); } break; - case DW_ExprOp_Gt: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_Grtr); } break; - case DW_ExprOp_Le: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_LsEq); } break; - case DW_ExprOp_Lt: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_Less); } break; - case DW_ExprOp_Ne: { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_NtEq); } break; - case DW_ExprOp_Div: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Div); } break; - case DW_ExprOp_Minus: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Sub); } break; - case DW_ExprOp_Mul: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Mul); } break; - case DW_ExprOp_Plus: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Add); } break; - case DW_ExprOp_Xor: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitXor); } break; - case DW_ExprOp_And: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitAnd); } break; - case DW_ExprOp_Or: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitOr); } break; - case DW_ExprOp_Shl: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_LShift); } break; - case DW_ExprOp_Shr: { - D2R_ValueType rhs = d2r_value_type_stack_pop(stack); - D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - if (d2r_is_value_type_integral(rhs) && d2r_is_value_type_integral(lhs)) { - D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); - D2R_ValueType result_type = d2r_unsigned_value_type_from_bit_size(d2r_size_from_value_type((cu->address_size), common_type) * 8); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RShift, d2r_value_type_to_rdi(result_type)); - d2r_value_type_stack_push(scratch.arena, stack, result_type); - } else { - Assert(!"operands must be of integral type"); - goto exit; - } - } break; - case DW_ExprOp_Shra: { - D2R_ValueType rhs = d2r_value_type_stack_pop(stack); - D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - if (d2r_is_value_type_integral(lhs) && d2r_is_value_type_integral(rhs)) { - D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); - D2R_ValueType result_type = d2r_signed_value_type_from_bit_size(d2r_size_from_value_type((cu->address_size), common_type) * 8); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RShift, d2r_value_type_to_rdi(result_type)); - d2r_value_type_stack_push(scratch.arena, stack, result_type); - } else { - Assert(!"operands must be of integral type"); - goto exit; - } - } break; - case DW_ExprOp_Mod: { - D2R_ValueType rhs = d2r_value_type_stack_pop(stack); - D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - if (!d2r_is_value_type_integral(rhs) || !d2r_is_value_type_integral(lhs)) { - Assert(!"operands must be of integral type"); - goto exit; - } - D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Mod, d2r_value_type_to_rdi(common_type)); - d2r_value_type_stack_push(scratch.arena, stack, common_type); - } break; - case DW_ExprOp_Abs: { - if (!d2r_is_value_type_integral(d2r_value_type_stack_peek(stack)) && !d2r_is_value_type_float(d2r_value_type_stack_peek(stack))) { - Assert(!"operand must be of integral type or float"); - goto exit; - } - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Abs, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack))); - } break; - case DW_ExprOp_Neg: { - if (!d2r_is_value_type_integral(d2r_value_type_stack_peek(stack))) { - Assert(!"operand must be of integral type"); - goto exit; - } - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Neg, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack))); - } break; - case DW_ExprOp_Not: { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_BitNot, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack))); - } break; - case DW_ExprOp_Dup: { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, 0); - d2r_value_type_stack_push(scratch.arena, stack, d2r_value_type_stack_peek(stack)); - } break; - case DW_ExprOp_Rot: { - Assert(!"no suitable conversion"); - goto exit; - } - case DW_ExprOp_Swap: { - D2R_ValueType a = d2r_value_type_stack_pop(stack); - D2R_ValueType b = d2r_value_type_stack_pop(stack); - d2r_value_type_stack_push(scratch.arena, stack, a); - d2r_value_type_stack_push(scratch.arena, stack, b); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Swap, 0); - } break; - case DW_ExprOp_Drop: { - d2r_value_type_stack_pop(stack); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pop, 0); - } break; - case DW_ExprOp_StackValue: { - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Stop, 0); - if (stack->top->type == D2R_ValueType_Address) { - stack->top->type = d2r_unsigned_value_type_from_bit_size(cu->address_size * 8); - } - } break; - case DW_ExprOp_FormTlsAddress: - case DW_ExprOp_GNU_PushTlsAddress: { - D2R_ValueType lhs = d2r_value_type_stack_pop(stack); - if (!d2r_is_value_type_integral(lhs)) { - Assert(!"lhs must be of integral type"); - goto exit; - } - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_TLSOff, 0); - rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, d2r_value_type_to_rdi(lhs)); - d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address); - } break; - case DW_ExprOp_GNU_UnInit: { - // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; - } break; - default: goto exit; - } - - // store converted instruction - if (last_op != bc.last_op) { - RDIM_EvalBytecodeOp *first_converted_op = last_op ? last_op->next : bc.first_op; - converted_insts[inst_idx] = first_converted_op; - } - - inst_idx += 1; } - // fixup bytecode jumps - for EachNode(op, RDIM_EvalBytecodeOp, bc.first_op) { - if (op->op == RDI_EvalOp_Skip || op->op == RDI_EvalOp_Cond) { - // unpack skip info - U32 inst_idx = Extract32(op->p, 1); - S16 skip_count_signed = (S16)Extract32(op->p, 0); - U16 skip_count = abs_s64(skip_count_signed); - B32 skip_fwd = skip_count_signed > 0; - - // setup being/end links - RDIM_EvalBytecodeOp *begin = 0, *end = 0; - if (skip_fwd) { - if (inst_idx + skip_count <= expr.count) { - begin = converted_insts[inst_idx]; - end = (inst_idx + skip_count) < expr.count ? converted_insts[inst_idx + skip_count] : 0; - } else { - Assert(!"out of bounds skip"); - goto exit; - } - } else { - if (skip_count <= inst_idx) { - begin = converted_insts[inst_idx - skip_count]; - end = converted_insts[inst_idx]; - } else { - Assert(!"out of bounds skip"); - goto exit; - } + //////////////////////////// + //- rjf: compute exe hash + // + U64 exe_hash = 0; + ProfScope("compute exe hash") + { + if(lane_idx() == 0) + { + exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); + } + lane_sync_u64(&exe_hash, 0); + } + + //////////////////////////// + //- rjf: produce top-level-info + // + RDIM_TopLevelInfo top_level_info = {0}; + ProfScope("produce top-level-info") + { + top_level_info.arch = rdi_arch_from_arch(arch); + top_level_info.exe_name = params->exe_name; + top_level_info.exe_hash = exe_hash; + top_level_info.voff_max = acceptable_vaddr_range.max - base_vaddr; + if(!params->deterministic) + { + // TODO(rjf): top_level_info.guid = ...; + top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); + } + } + + //////////////////////////// + //- rjf: gather unit ranges from .debug_info, .debug_aranges + // + Rng1U64Array *unit_info_ranges = 0; + Rng1U64Array *unit_arange_ranges = 0; + ProfScope("gather unit ranges from .debug_info, .debug_aranges") if(lane_idx() == 0) + { + unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); + *unit_info_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_Info].data); + unit_arange_ranges = push_array(scratch.arena, Rng1U64Array, 1); + *unit_arange_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_ARanges].data); + } + lane_sync_u64(&unit_info_ranges, 0); + lane_sync_u64(&unit_arange_ranges, 0); + U64 unit_count = unit_info_ranges->count; + + //////////////////////////// + //- rjf: parse all .debug_info unit headers + // + DW2_UnitHeader *unit_headers = 0; + Rng1U64 *unit_info_tag_ranges = 0; + ProfScope("parse all unit headers") + { + // rjf: set up + if(lane_idx() == 0) + { + unit_headers = push_array(scratch.arena, DW2_UnitHeader, unit_count); + unit_info_tag_ranges = push_array(scratch.arena, Rng1U64, unit_count); + } + lane_sync_u64(&unit_headers, 0); + lane_sync_u64(&unit_info_tag_ranges, 0); + + // rjf: parse all unit headers + String8 data = raw->sec[DW_SectionKind_Info].data; + Rng1U64 range = lane_range(unit_count); + for EachInRange(idx, range) + { + Rng1U64 unit_info_range = unit_info_ranges->v[idx]; + U64 bytes_read = dw2_read_unit_header(str8_substr(data, unit_info_range), 0, &unit_headers[idx]); + unit_info_tag_ranges[idx] = r1u64(unit_info_range.min + bytes_read, unit_info_range.max); + } + } + lane_sync(); + Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; + + //////////////////////////// + //- rjf: parse all units from .debug_aranges + // + U64 *arange_info_offs = 0; + RDIM_Rng1U64ChunkList *arange_voff_ranges = 0; + { + if(lane_idx() == 0) + { + arange_info_offs = push_array(scratch.arena, U64, unit_arange_ranges->count); + arange_voff_ranges = push_array(scratch.arena, RDIM_Rng1U64ChunkList, unit_arange_ranges->count); + } + lane_sync_u64(&arange_info_offs, 0); + lane_sync_u64(&arange_voff_ranges, 0); + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + String8 data = raw->sec[DW_SectionKind_ARanges].data; + for(;;) + { + // rjf: take unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= unit_arange_ranges->count) + { + break; } - // compute skip delta - U64 skip_delta = 0; - for (RDIM_EvalBytecodeOp *n = begin; n != end; n = n->next) { - skip_delta += n->p_size; + // rjf: unpack + Rng1U64 arange_range = unit_arange_ranges->v[unit_idx]; + U64 off = arange_range.min; + + // rjf: read unit data size / format + U64 unit_size = 0; + DW_Format fmt = 0; + off += dw2_read_initial_length(data, off, &unit_size, &fmt); + U64 unit_opl = off + unit_size; + + // rjf: read version + DW_Version version = 0; + U64 version_off = off; + off += str8_deserial_read_struct(data, off, &version); + + // rjf: warn on non-version 2 + if(version != DW_Version_2) + { + log_infof("[.debug_aranges@0x%I64x] DWARF version for unit #%I64d was expected to be 2, but it was read as %i.\n", version_off, unit_idx, (S32)version); } - // rewrite skip operand with byte delta - AssertAlways(skip_delta <= max_S16); - op->p = skip_fwd ? (S16)skip_delta : -(S16)skip_delta; - } - } - - if (result_type_out) { - *result_type_out = d2r_value_type_stack_peek(stack); - } - - is_ok = 1; - exit:; - if (!is_ok) { - MemoryZeroStruct(&bc); - temp_end(temp); - } - scratch_end(scratch); - return bc; -} - -internal RDIM_Location -d2r_transpile_expression(Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr) -{ - RDIM_Location loc = {0}; - if (expr.size) { - D2R_ValueType result_type = 0; - RDIM_EvalBytecode bytecode = d2r_bytecode_from_expression(arena, input, image_base, arch, addr_lu, expr, cu, &result_type); - loc.kind = result_type == D2R_ValueType_Address ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; - loc.bytecode = bytecode; - } - return loc; -} - -internal RDIM_Location -d2r_location_from_attrib(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind) -{ - String8 expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, kind); - RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, expr); - return location; -} - -internal RDIM_LocationCaseList -d2r_locset_from_attrib(Arena *arena, - RDIM_ScopeChunkList *scopes, - RDIM_Scope *curr_scope, - DW_Raw *input, - DW_CompUnit *cu, - U64 image_base, - Arch arch, - DW_Tag tag, - DW_AttribKind kind) -{ - RDIM_LocationCaseList locset = {0}; - - // extract attrib from tag - DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); - DW_AttribClass attrib_class = dw_value_class_from_attrib(cu, attrib); - - if (attrib_class == DW_AttribClass_LocList || attrib_class == DW_AttribClass_LocListPtr) { - Temp scratch = scratch_begin(&arena, 1); - - // extract location list from attrib - DW_LocList loclist = dw_loclist_from_attrib(scratch.arena, input, cu, attrib); - - // convert location list to RDIM location set - for EachNode(loc_n, DW_LocNode, loclist.first) { - RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, loc_n->v.expr); - RDIM_Rng1U64 voff_range = { .min = loc_n->v.range.min - image_base, .max = loc_n->v.range.max - image_base }; - rdim_location_case_list_push(arena, &locset, location, voff_range); - } - - scratch_end(scratch); - } else if (attrib_class == DW_AttribClass_ExprLoc) { - // extract expression from attrib - String8 expr = dw_exprloc_from_attrib(input, cu, attrib); - - // convert expression and inherit life-time ranges from enclosed scope - RDIM_Location location = d2r_transpile_expression(arena, input, image_base, arch, cu->addr_lu, cu, expr); - for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { - rdim_location_case_list_push(arena, &locset, location, range_n->v); - } - } else if (attrib_class != DW_AttribClass_Null) { - log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); - } - - return locset; -} - -internal RDIM_LocationCaseList -d2r_var_locset_from_tag(Arena *arena, - RDIM_ScopeChunkList *scopes, - RDIM_Scope *curr_scope, - DW_Raw *input, - DW_CompUnit *cu, - U64 image_base, - Arch arch, - DW_Tag tag) -{ - RDIM_LocationCaseList locset = {0}; - - B32 has_const_value = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ConstValue); - B32 has_location = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Location); - - if (has_const_value && has_location) { - log_infof("unexpected variable encoding @ .debug_info+%llx", tag.info_off); - return locset; - } - - if (has_const_value) { - // extract const value - U64 const_value = dw_u64_from_attrib(input, cu, tag, DW_AttribKind_ConstValue); - - // make value byte code - RDIM_EvalBytecode bc = {0}; - rdim_bytecode_push_uconst(arena, &bc, const_value); - - // fill out location - RDIM_Location loc = {0}; - loc.kind = RDI_LocationKind_ValBytecodeStream; - loc.bytecode = bc; - - // push location cases - for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) { - rdim_location_case_list_push(arena, &locset, loc, range_n->v); - } - } else if (has_location) { - locset = d2r_locset_from_attrib(arena, scopes, curr_scope, input, cu, image_base, arch, tag, DW_AttribKind_Location); - } - - return locset; -} - -internal RDIM_Type * -d2r_create_type(Arena *arena, D2R_TypeTable *type_table) -{ - RDIM_Type *type = rdim_type_chunk_list_push(arena, type_table->types, type_table->type_chunk_cap); - return type; -} - -internal RDIM_Type * -d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off) -{ - RDIM_Type *type = d2r_create_type(arena, type_table); - Assert(hash_table_search_u64_raw(type_table->ht, info_off) == 0); - hash_table_push_u64_raw(arena, type_table->ht, info_off, type); - return type; -} - -internal RDIM_Type * -d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off) -{ - RDIM_Type *type = hash_table_search_u64_raw(type_table->ht, info_off); - if (type == 0) { - type = type_table->builtin_types[RDI_TypeKind_NULL]; - } - return type; -} - -internal RDIM_Type * -d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind) -{ - RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; - - // find attrib - DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); - - // does tag have this attribute? - if (attrib->attrib_kind == kind) { - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - - if (value_class == DW_AttribClass_Reference) { - // resolve reference - DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); + // rjf: read .debug_info off for this unit + U64 info_off = 0; + off += dw2_read_fmt_u64(data, off, fmt, &info_off); - if (ref.cu == cu) { - // find type - type = d2r_type_from_offset(type_table, ref.info_off); - } else { - NotImplemented; - } - } else { - log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); - } - } - - return type; -} - -internal D2R_TagIterator * -d2r_tag_iterator_init(Arena *arena, DW_TagNode *root) -{ - D2R_TagIterator *iter = push_array(arena, D2R_TagIterator, 1); - iter->free_list = 0; - iter->stack = push_array(arena, D2R_TagFrame, 1); - iter->stack->node = push_array(arena, DW_TagNode, 1); - if (root != 0) { - *iter->stack->node = *root; - } - iter->stack->node->sibling = 0; - iter->visit_children = 1; - iter->tag_node = root; - iter->null_tag_node = push_array(arena, DW_TagNode, 1); - return iter; -} - -internal void -d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter) -{ - // descend to first child - if (iter->visit_children) { - if (iter->stack->node->first_child) { - D2R_TagFrame *f = iter->free_list; - if (f) { SLLStackPop(iter->free_list); MemoryZeroStruct(f); } - else { f = push_array(arena, D2R_TagFrame, 1); } - f->node = iter->stack->node->first_child; - SLLStackPush(iter->stack, f); - goto exit; - } - } - - while (iter->stack) { - // go to sibling - iter->stack->node = iter->stack->node->sibling; - if (iter->stack->node) { break; } - - // no more siblings, go up - D2R_TagFrame *f = iter->stack; - SLLStackPop(iter->stack); - SLLStackPush(iter->free_list, f); - } - - exit:; - // update iterator - iter->visit_children = 1; - iter->tag_node = iter->stack ? iter->stack->node : 0; -} - -internal void -d2r_tag_iterator_skip_children(D2R_TagIterator *iter) -{ - iter->visit_children = 0; -} - -internal DW_TagNode * -d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter) -{ - return iter->stack == 0 || iter->stack->next == 0 ? iter->null_tag_node : iter->stack->next->node; -} - -internal DW_Tag -d2r_tag_iterator_parent_tag(D2R_TagIterator *iter) -{ - DW_TagNode *tag_node = d2r_tag_iterator_parent_tag_node(iter); - return tag_node->tag; -} - -internal void -d2r_flag_converted_type_tag(DW_TagNode *tag_node) -{ - tag_node->tag.v |= D2R_TagFlags_TypeConverted; -} - -internal B8 -d2r_is_type_tag_converted(DW_TagNode *tag_node) -{ - return !!(tag_node->tag.v & D2R_TagFlags_TypeConverted); -} - -internal RDIM_Type * -d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind) -{ - RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void]; - - // find attrib - DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind); - - // does tag have this attribute? - if (attrib->attrib_kind == kind) { - DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib); - - if (value_class == DW_AttribClass_Reference) { - // resolve reference - DW_Reference ref = dw_ref_from_attrib(input, cu, attrib); + // rjf: read address / segment selector size + U8 addr_size = 0; + U8 segment_selector_size = 0; + off += str8_deserial_read_struct(data, off, &addr_size); + off += str8_deserial_read_struct(data, off, &segment_selector_size); - if (ref.cu == cu) { - // find type - type = d2r_type_from_offset(type_table, ref.info_off); - - // was type converted? - if (type == 0) { - // issue type conversion - DW_TagNode *ref_node = dw_tag_node_from_info_off(cu, ref.info_off); - d2r_convert_types(arena, type_table, input, cu, cu_lang, arch, ref_node); - - // if we do not have a converted type at this point then debug info is malformed - type = d2r_type_from_offset(type_table, ref.info_off); - if (type == 0) { - type = type_table->builtin_types[RDI_TypeKind_NULL]; - } - } - } else { - NotImplemented; + // rjf: round up past padding + { + U64 tuple_size = addr_size*2 + segment_selector_size; + off += tuple_size - (off%tuple_size); } - } else { - log_infof("unexpected attrib class @ .debug_info+%llx", tag.info_off); - } - } - - return type; -} - -internal void -d2r_convert_types(Arena *arena, - D2R_TypeTable *type_table, - DW_Raw *input, - DW_CompUnit *cu, - DW_Language cu_lang, - Arch arch, - DW_TagNode *root) -{ - Temp scratch = scratch_begin(&arena, 1); - for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { - DW_TagNode *tag_node = it->tag_node; - DW_Tag tag = tag_node->tag; - - // skip converted tags - if (d2r_is_type_tag_converted(tag_node)) { - d2r_tag_iterator_skip_children(it); - continue; - } - // mark the tag as converted here, because during conversion we may recurse on the same tag - d2r_flag_converted_type_tag(tag_node); - - switch (tag.kind) { - case DW_TagKind_ClassType: { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = RDI_TypeKind_IncompleteClass; - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - Assert(!tag_node->first_child); - d2r_tag_iterator_skip_children(it); - } else { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->kind = RDI_TypeKind_Class; - type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); - type->direct_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - } - } break; - case DW_TagKind_StructureType: { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->kind = RDI_TypeKind_IncompleteStruct; - - if (tag_node->first_child) { - d2r_tag_iterator_skip_children(it); - } else { - log_infof("childless struct @ .debug_info+%llx", tag.info_off); - } - } else { - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->kind = RDI_TypeKind_Struct; - type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); - } - } break; - case DW_TagKind_UnionType: { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->kind = RDI_TypeKind_IncompleteUnion; - - if (tag_node->first_child) { - d2r_tag_iterator_skip_children(it); - } else { - log_infof("childless union @ .debug_info+%llx", tag.info_off); - } - } else { - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->kind = RDI_TypeKind_Union; - type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); - } - } break; - case DW_TagKind_EnumerationType: { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->kind = RDI_TypeKind_IncompleteEnum; - if (tag_node->first_child) { - d2r_tag_iterator_skip_children(it); - } else { - log_infof("childless enum @ .debug_info+%llx", tag.info_off); - } - } else { - RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->kind = RDI_TypeKind_Enum; - type->byte_size = dw_byte_size_32_from_tag(input, cu, tag); - type->direct_type = enum_base_type; - } - } break; - case DW_TagKind_SubProgram: { - if ( ! dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Declaration)) { + + // rjf: parse ranges + RDIM_Rng1U64ChunkList voff_ranges = {0}; + if(segment_selector_size != 0) + { + log_infof("[.debug_aranges@0x%I64x] Non-zero (%i) segment selector size parsed; this form of addressing is not currently supported in DWARF info.\n", off, (S32)segment_selector_size); + } + else for(;off < unit_opl;) + { + U64 start_off = off; + U64 base_addr = 0; + U64 range_size = 0; + off += str8_deserial_read(data, off, &base_addr, addr_size, addr_size); + off += str8_deserial_read(data, off, &range_size, addr_size, addr_size); + if(base_addr == 0 && range_size == 0) + { break; } - } // fall-through - case DW_TagKind_SubroutineType: { - RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - - // collect parameters - RDIM_TypeList param_list = {0}; - for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) { - if (n->tag.kind == DW_TagKind_FormalParameter) { - RDIM_Type *param_type = d2r_type_from_attrib(type_table, input, cu, n->tag, DW_AttribKind_Type); - rdim_type_list_push(scratch.arena, ¶m_list, param_type); - } else if (n->tag.kind == DW_TagKind_UnspecifiedParameters) { - rdim_type_list_push(scratch.arena, ¶m_list, type_table->builtin_types[RDI_TypeKind_Variadic]); - } else { - log_infof("unexpected tag @ .debug_info+%llx", tag.info_off); - } + if(base_addr < base_vaddr) + { + log_infof("[.debug_aranges@0x%I64x] Address (0x%I64x) parsed which was less than the image base address (0x%I64x). Skipping.\n", start_off, base_addr, base_vaddr); } - - DW_TagNode *parent = d2r_tag_iterator_parent_tag_node(it); - B32 is_method = parent->tag.kind == DW_TagKind_StructureType || parent->tag.kind == DW_TagKind_ClassType; - - // init proceudre type - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = is_method ? RDI_TypeKind_Method : RDI_TypeKind_Function; - type->byte_size = cu->address_size; - type->direct_type = ret_type; - type->count = param_list.count; - type->param_types = rdim_array_from_type_list(arena, param_list); - - d2r_tag_iterator_skip_children(it); - } break; - case DW_TagKind_Typedef: { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = RDI_TypeKind_Alias; - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->direct_type = direct_type; - for (RDIM_Type *n = direct_type; n != 0; n = n->direct_type) { - if (n->byte_size) { - type->byte_size = n->byte_size; + else + { + U64 voff_first = (base_addr - base_vaddr); + U64 voff_opl = voff_first + range_size; + RDIM_Rng1U64 range = {voff_first, voff_opl}; + rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, range); + } + if(off == start_off) + { + break; + } + } + + // rjf: store + arange_info_offs[unit_idx] = info_off; + arange_voff_ranges[unit_idx] = voff_ranges; + } + lane_sync(); + } + + //////////////////////////// + //- rjf: produce info_off -> list(voff_range) map from aranges units; + // we must do this because technically we can't guarantee that unit_idxs + // inside of .debug_aranges are the same as unit_idxs inside of .debug_info, + // nor can we guarantee that they'd be in the same order, so we need to + // correllate via the encoded .debug_info offset from .debug_aranges. + // + // more excellence. + // + typedef struct D2R2_ARangeUnitNode D2R2_ARangeUnitNode; + struct D2R2_ARangeUnitNode + { + D2R2_ARangeUnitNode *next; + U64 info_off; + RDIM_Rng1U64ChunkList *ranges; + }; + U64 arange_unit_from_info_off_map_slots_count = unit_arange_ranges->count; + D2R2_ARangeUnitNode **arange_unit_from_info_off_map_slots = 0; + { + if(lane_idx() == 0) + { + arange_unit_from_info_off_map_slots = push_array(scratch.arena, D2R2_ARangeUnitNode *, arange_unit_from_info_off_map_slots_count); + } + lane_sync_u64(&arange_unit_from_info_off_map_slots, 0); + for EachIndex(arange_unit_idx, unit_arange_ranges->count) + { + U64 info_off = arange_info_offs[arange_unit_idx]; + RDIM_Rng1U64ChunkList *ranges = &arange_voff_ranges[arange_unit_idx]; + U64 hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 slot_idx = hash%arange_unit_from_info_off_map_slots_count; + D2R2_ARangeUnitNode *n = push_array(scratch.arena, D2R2_ARangeUnitNode, 1); + SLLStackPush(arange_unit_from_info_off_map_slots[slot_idx], n); + n->info_off = info_off; + n->ranges = ranges; + } + } + lane_sync(); + + //////////////////////////// + //- rjf: build all abbreviation maps, build (unit -> abbrev map) + // + DW2_UnitAbbrevMapMap unit_abbrev_map_map = dw2_unit_abbrev_map_map_from_data(scratch.arena, raw->sec[DW_SectionKind_Abbrev].data, unit_headers, unit_count); + + //////////////////////////// + //- rjf: parse all unit offsets tables + // + // on .debug_str_offsets, as one example: + // + // in an incredible twist of fate, DWARF decided to decouple these from + // compilation units. compilation units *do* contain a + // DW_AttribKind_StrOffsetsBase attribute. but this base offset does *not* + // point to the beginning of a table in .debug_str_offsets! it instead points + // PAST THE INITIAL VARIABLE-WIDTH LENGTH AND FORMAT ENCODING! this means + // you can't actually use the StrOffsetsBase attribute for ANYTHING other + // than correllating a unit to its associated string offset table - but you + // *necessarily needed to have parsed that table beforehand*, completely + // independently from units. + // + // so, we have to parse all the string offset tables up-front, then + // *binary search* their ranges to determine which unit has which table. + // + // of course, in practice, it's perhaps likely/expected that these match + // one-to-one with units, and in the same order, because that is what is + // most natural for generators. but, the format does not *guarantee this*, + // and instead specced something far more arbitrary. + // + // thank you, again, DWARF. + // + DW2_OffsetTableSet *offset_tables = 0; + ProfScope("parse all offset tables (.debug_rnglists, .debug_str_offsets, .debug_addr, .debug_loclists)") if(lane_idx() == 0) + { + offset_tables = push_array(scratch.arena, DW2_OffsetTableSet, 1); + offset_tables[0] = dw2_offset_table_set_from_raw(scratch.arena, raw); + } + lane_sync_u64(&offset_tables, 0); + + //////////////////////////// + //- rjf: build per-unit parsing contexts, parse compilation unit tags + // + DW2_ParseCtx *unit_parse_ctxs = 0; + DW2_Tag *unit_root_tags = 0; + { + if(lane_idx() == 0) + { + unit_parse_ctxs = push_array(scratch.arena, DW2_ParseCtx, unit_count); + unit_root_tags = push_array(scratch.arena, DW2_Tag, unit_count); + } + lane_sync_u64(&unit_parse_ctxs, 0); + lane_sync_u64(&unit_root_tags, 0); + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + DW2_UnitHeader *hdr = &unit_headers[unit_idx]; + DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; + + // rjf: equip initial info - just enough to do a bootstrapping parse of the root tag + dw2_parse_ctx_equip_unit_header(ctx, hdr, unit_info_ranges->v[unit_idx].min); + dw2_parse_ctx_equip_unit_abbrev_map(ctx, &unit_abbrev_map_map, unit_idx); + + // rjf: do bootstrapping parse + // + // an incredible NOTE: the above context info is actually not sufficient for general + // parsing, because this "bootstrapping" tag parse is what informs us which + // .debug_str_offsets table each unit should be associated with (via the + // StrOffsetsBase attribute), we actually don't have the right string offset table + // *before* we parse this, which means we can't resolve some of the string attribute + // values. + // + // so, in another incredible twist of fate, we actually must do this *twice*. first, + // to find *just the StrOffsetsBase*, and then, to actually fully resolve everything. + // + // (all of the above is also true for RngListsBase) + // + DW2_Tag root_tag_bootstrap = {0}; + dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag_bootstrap); + + // rjf: equip info extracted from bootstrapping parse + dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag_bootstrap, offset_tables); + + // rjf: do non-bootstrapping parse + dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags[unit_idx]); + + // rjf: equip info extracted from non-bootstrapping parse + dw2_parse_ctx_equip_unit_root_tag(ctx, &unit_root_tags[unit_idx], offset_tables); + } + } + lane_sync(); + + //////////////////////////// + //- rjf: parse each unit's line table header + // + DW2_LineTableHeader *unit_line_table_headers = 0; + ProfScope("parse each unit's line table header") + { + if(lane_idx() == 0) + { + unit_line_table_headers = push_array(scratch.arena, DW2_LineTableHeader, unit_count); + } + lane_sync_u64(&unit_line_table_headers, 0); + U64 unit_take_idx = 0; + U64 *unit_take_idx_ptr = &unit_take_idx; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; + if(unit_idx >= unit_count) + { + break; + } + DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; + DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; + DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); + U64 line_info_off = stmt_list->val.u128.u64[0]; + String8 line_info_data = raw->sec[DW_SectionKind_Line].data; + dw2_read_line_table_header(scratch.arena, raw, ctx, line_info_data, line_info_off, &unit_line_table_headers[unit_idx]); + } + lane_sync(); + } + + //////////////////////////// + //- rjf: deduplicate all source files + // + typedef struct UnitSrcFileMap UnitSrcFileMap; + struct UnitSrcFileMap + { + RDIM_SrcFile **v; + }; + RDIM_SrcFileChunkList *all_src_files = 0; + UnitSrcFileMap *unit_src_file_maps = 0; + ProfScope("deduplicate all source files") if(lane_idx() == 0) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: count all files in all units + U64 total_file_count = 0; + for EachIndex(unit_idx, unit_count) + { + total_file_count += unit_line_table_headers[unit_idx].files.count; + } + + //- rjf: set up path -> src file map + typedef struct SrcFileNode SrcFileNode; + struct SrcFileNode + { + SrcFileNode *next; + String8 full_path; + RDIM_SrcFile *src_file; + }; + all_src_files = push_array(scratch.arena, RDIM_SrcFileChunkList, 1); + U64 slots_count = 1 + (total_file_count * 3) / 4; + SrcFileNode **slots = push_array(scratch2.arena, SrcFileNode *, slots_count); + + //- rjf: set up unit -> src file maps + unit_src_file_maps = push_array(scratch.arena, UnitSrcFileMap, unit_count); + for EachIndex(unit_idx, unit_count) + { + unit_src_file_maps[unit_idx].v = push_array(scratch.arena, RDIM_SrcFile *, unit_line_table_headers[unit_idx].files.count); + } + + //- rjf: build path -> src file map + for EachIndex(unit_idx, unit_count) + { + DW2_LineTableHeader *hdr = &unit_line_table_headers[unit_idx]; + for EachIndex(file_idx, hdr->files.count) + { + DW2_LineTableFile *f = &hdr->files.v[file_idx]; + DW2_LineTableFile *dir = &hdr->dirs.v[f->dir_idx]; + String8 full_file_path = str8f(scratch2.arena, "%S%s%S", dir->file_name, dir->file_name.size != 0 ? "/" : "", f->file_name); + U64 hash = u64_hash_from_str8(full_file_path); + U64 slot_idx = hash%slots_count; + SrcFileNode *node = 0; + for(SrcFileNode *n = slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->full_path, full_file_path, 0)) + { + node = n; break; } } - } break; - case DW_TagKind_BaseType: { - DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding); - U64 byte_size = dw_byte_size_from_tag(input, cu, tag); - - // convert base type encoding to RDI version - RDI_TypeKind kind = RDI_TypeKind_NULL; -#define X(t,g,s) case s: kind = RDI_TypeKind_##t; break; - switch (encoding) { - case DW_ATE_Null: kind = RDI_TypeKind_NULL; break; - case DW_ATE_Address: kind = RDI_TypeKind_Void; break; - case DW_ATE_Boolean: kind = RDI_TypeKind_Bool; break; - case DW_ATE_ComplexFloat: { - switch (byte_size) { - case 8: kind = RDI_TypeKind_ComplexF32; break; - case 16: kind = RDI_TypeKind_ComplexF64; break; - case 24: kind = RDI_TypeKind_ComplexF80; break; - case 32: kind = RDI_TypeKind_ComplexF128; break; - default: log_infof("unexpected size"); break; - } - } break; - case DW_ATE_Float: { - String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - if (arch == Arch_x64 || arch == Arch_arm64) { - if (str8_match(name, str8_lit("__float80"), 0)) { - kind = RDI_TypeKind_F80; - } else if (str8_match(name, str8_lit("__float128"), 0)) { - kind = RDI_TypeKind_F128; - } else if (str8_match(name, str8_lit("_Float16"), 0)) { - kind = RDI_TypeKind_F16; - } else if (str8_match(name, str8_lit("__bf16"), 0)) { - kind = RDI_TypeKind_BF16; - } - if (kind != RDI_TypeKind_NULL) { break; } - } - - switch (byte_size) { - D2R_ValueType_Float_XList - default: log_infof("unexpected size"); break; - } - } break; - case DW_ATE_Signed: { - String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - if (str8_match(name, str8_lit("wchar_t"), 0)) { goto do_signed_char; } - - switch (byte_size) { - D2R_ValueType_Signed_XList - default: log_infof("unexpected size"); break; - } - } break; - do_signed_char:; - case DW_ATE_SignedChar: { - switch (byte_size) { - case 1: kind = RDI_TypeKind_Char8; break; - case 2: kind = RDI_TypeKind_Char16; break; - case 4: kind = RDI_TypeKind_Char32; break; - default: log_infof("unexpected size"); break; - } - } break; - case DW_ATE_Unsigned: { - switch (byte_size) { - D2R_ValueType_Unsigned_XList - default: log_infof("unexpected size"); break; - } - } break; - case DW_ATE_Utf: - case DW_ATE_UnsignedChar: { - switch (byte_size) { - case 1: kind = RDI_TypeKind_UChar8; break; - case 2: kind = RDI_TypeKind_UChar16; break; - case 4: kind = RDI_TypeKind_UChar32; break; - default: log_infof("unexpected size"); break; - } - } break; - case DW_ATE_DecimalFloat: { - switch (byte_size) { - case 4: kind = RDI_TypeKind_Decimal32; break; - case 8: kind = RDI_TypeKind_Decimal64; break; - case 16: kind = RDI_TypeKind_Decimal128; break; - default: log_infof("unexpected size"); break; - } - } break; - case DW_ATE_ImaginaryFloat: { - NotImplemented; - } break; - case DW_ATE_PackedDecimal: { - NotImplemented; - } break; - case DW_ATE_NumericString: { - NotImplemented; - } break; - case DW_ATE_Edited: { - NotImplemented; - } break; - case DW_ATE_SignedFixed: { - NotImplemented; - } break; - case DW_ATE_UnsignedFixed: { - NotImplemented; - } break; - case DW_ATE_Ucs: { - NotImplemented; - } break; - case DW_ATE_Ascii: { - NotImplemented; - } break; - default: log_infof("unexpected base type encoding"); break; - } -#undef X - - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = RDI_TypeKind_Alias; - type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - type->direct_type = type_table->builtin_types[kind]; - type->byte_size = byte_size; - } break; - case DW_TagKind_PointerType: { - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - - // TODO: - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Allocated)) { - log_infof("TODO: handle allocated attrib @ .debug_info+%llx", tag.info_off); - } - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Associated)) { - log_infof("TODO: handle associated attrib @ .debug_info%llx", tag.info_off); - } - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { - log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); - } - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { - log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); - } - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass)) { - log_infof("TODO: handle address class attrib @ .debug_info+%llx", tag.info_off); - } - - U64 byte_size = cu->address_size; - if (cu->version == DW_Version_5 || cu->relaxed) { - dw_try_byte_size_from_tag(input, cu, tag, &byte_size); - } - - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = RDI_TypeKind_Ptr; - type->byte_size = byte_size; - type->direct_type = direct_type; - } break; - case DW_TagKind_RestrictType: { - // TODO: - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { - log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); - } - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { - log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); - } - - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = RDI_TypeKind_Modifier; - type->byte_size = cu->address_size; - type->flags = RDI_TypeModifierFlag_Restrict; - type->direct_type = direct_type; - } break; - case DW_TagKind_VolatileType: { - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { - log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); - } - - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = RDI_TypeKind_Modifier; - type->byte_size = cu->address_size; - type->flags = RDI_TypeModifierFlag_Volatile; - type->direct_type = direct_type; - } break; - case DW_TagKind_ConstType: { - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name)) { - log_infof("TODO: handle name attrib @ .debug_info+%llx", tag.info_off); - } - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment)) { - log_infof("TODO: handle alignment attrib @ .debug_info+%llx", tag.info_off); - } - - RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off); - type->kind = RDI_TypeKind_Modifier; - type->byte_size = cu->address_size; - type->flags = RDI_TypeModifierFlag_Const; - type->direct_type = direct_type; - } break; - case DW_TagKind_ArrayType: { - // TODO: @native_vector_support extract byte size from the base type tag - // and convert to U256, U512, S256 and S512 - B32 is_vector = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_GNU_Vector); - // TODO: - //if (is_vector) { NotImplemented; } - - B32 error = 1; - - // * DWARF vs RDI Array Type Graph * - // - // For example lets take following decl: - // - // int (*foo[2])[3]; - // - // This compiles to in DWARF: - // - // foo -> DW_TAG_ArrayType -> (A0) DW_TAG_Subrange [2] - // \ - // -> (B0) DW_TAG_PointerType -> (A1) DW_TAG_ArrayType -> DW_TAG_Subrange [3] - // \ - // -> (B1) DW_TAG_BaseType (int) - // - // RDI expects: - // - // foo -> Array[2] -> Pointer -> Array[3] -> int - // - // Note that DWARF forks the graph on DW_TAG_ArrayType to describe array ranges in branch A and - // in branch B describes array type which might be a struct, pointer, base type, or any other type tag. - // However, in RDI we have a simple list of type nodes and to convert we need to append type nodes from - // B to A. - struct SubrangeNode { struct SubrangeNode *next; U64 count; }; - struct SubrangeNode *subrange_stack = 0; - for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) { - if (n->tag.kind != DW_TagKind_SubrangeType) { - log_infof("[%llx] while scanning for DW_TagKind_SubrangeType found an unexpected child tag %S @ %llx\n", tag.info_off, dw_string_from_tag_kind(scratch.arena, n->tag.kind), n->tag.info_off); - goto array_type_exit; + if(!node) + { + node = push_array(scratch2.arena, SrcFileNode, 1); + node->full_path = full_file_path; + node->src_file = rdim_src_file_chunk_list_push(arena, all_src_files, slots_count); + node->src_file->path = str8_copy(arena, full_file_path); + if(f->flags & DW2_LineTableFileFlag_HasMD5) + { + node->src_file->checksum_kind = RDI_ChecksumKind_MD5; + node->src_file->checksum = str8_copy(arena, str8_struct(&f->md5)); } - - // resolve lower bound - U64 lower_bound = 0; - if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_LowerBound)) { - B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_LowerBound)); - if (is_vla) { - log_infof("[%llx] TODO: lower bound is a variable\n", n->tag.info_off); - } else { - lower_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_LowerBound); - } - } else { - lower_bound = dw_pick_default_lower_bound(cu_lang); + else if(f->flags & DW2_LineTableFileFlag_HasModifyTime) + { + node->src_file->checksum_kind = RDI_ChecksumKind_Timestamp; + node->src_file->checksum = str8_copy(arena, str8_struct(&f->modify_time)); } - - // resolve upper bound - U64 upper_bound = 0; - if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_Count)) { - U64 count = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_Count); - upper_bound = lower_bound + count; - } else if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_UpperBound)) { - B32 is_vla = dw_is_attrib_var_ref(input, cu, dw_attrib_from_tag(input, cu, n->tag, DW_AttribKind_UpperBound)); - if (is_vla) { - log_infof("[%llx] TODO: upper bound is a variable\n", n->tag.info_off); - goto array_type_exit; - } else { - upper_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_UpperBound); - upper_bound += 1; // turn upper bound into exclusive range - } - } else { - // zero sized array - } - - struct SubrangeNode *s = push_array(scratch.arena, struct SubrangeNode, 1); - s->count = upper_bound - lower_bound; - SLLStackPush(subrange_stack, s); } - - RDIM_Type *array_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - RDIM_Type *direct_type = array_base_type; - U64 size_cursor = array_base_type->byte_size; - for EachNode(s, struct SubrangeNode, subrange_stack) { - size_cursor *= s->count; - - RDIM_Type *t; - if (s->next) { t = d2r_create_type(arena, type_table); } - else { t = d2r_create_type_from_offset(arena, type_table, tag.info_off); } - - t->kind = RDI_TypeKind_Array; - t->direct_type = direct_type; - t->byte_size = size_cursor; - t->count = s->count; - - direct_type = t; - } - - error = 0; - array_type_exit:; - - // in case of an error, assign null to the array type - if (error) { - Assert(d2r_type_from_offset(type_table, tag.info_off) == 0); // this should the first time this type is being parsed - hash_table_push_u64_raw(arena, type_table->ht, tag.info_off, type_table->builtin_types[RDI_TypeKind_NULL]); - } - - d2r_tag_iterator_skip_children(it); - } break; - case DW_TagKind_SubrangeType: { - log_infof("unexpected tag"); - } break; - case DW_TagKind_Inheritance: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind == DW_TagKind_StructureType || parent_tag.kind == DW_TagKind_ClassType) { - RDIM_Type *parent = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_Type *type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch, tag, DW_AttribKind_Type); - RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, parent->udt); - member->kind = RDI_MemberKind_Base; - member->type = type; - member->off = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation)); - } else { - log_infof("unexpected parent tag"); - } - } break; - } - } - scratch_end(scratch); -} - -internal B8 -d2r_is_udt_tag_converted(DW_TagNode *tag_node) -{ - return !!(tag_node->tag.v & D2R_TagFlags_UdtConverted); -} - -internal void -d2r_flag_converted_udt_tag(DW_TagNode *tag_node) -{ - tag_node->tag.v |= D2R_TagFlags_UdtConverted; -} - -internal void -d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, RDIM_UDT *udt) -{ - for (RDIM_UDTMember *curr = udt->first_member, *prev = 0; curr != 0; prev = curr, curr = curr->next) { - if (curr->name.size == 0) { - d2r_inline_anonymous_udt_member(arena, top_udt, base_off + curr->off, curr->type->udt); - } else { - // copy member and adjust its offset relative to inlined position in the root UDT - RDIM_UDTMember *m = rdim_udt_push_member(arena, &g_d2r_shared.udts, top_udt); - *m = *curr; - m->off += base_off; - } - } -} - -internal void -d2r_convert_udts(Arena *arena, - D2R_TypeTable *type_table, - DW_Raw *input, - DW_CompUnit *cu, - DW_Language cu_lang, - DW_TagNode *root) -{ - Temp scratch = scratch_begin(&arena, 1); - - for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { - DW_TagNode *tag_node = it->tag_node; - DW_Tag tag = tag_node->tag; - - // skip converted tags - if (d2r_is_udt_tag_converted(tag_node)) { - d2r_tag_iterator_skip_children(it); - continue; - } - d2r_flag_converted_udt_tag(tag_node); - - if (tag.kind == DW_TagKind_ClassType || tag.kind == DW_TagKind_StructureType || tag.kind == DW_TagKind_UnionType) { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - d2r_tag_iterator_skip_children(it); - } else { - RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &g_d2r_shared.udts, D2R_UDT_CHUNK_CAP); - udt->self_type = type; - type->udt = udt; - } - } else if (tag.kind == DW_TagKind_EnumerationType) { - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { - d2r_tag_iterator_skip_children(it); - } else { - RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off); - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &g_d2r_shared.udts, D2R_UDT_CHUNK_CAP); - udt->self_type = type; - type->udt = udt; - } - } else if (tag.kind == DW_TagKind_Member) { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType || - parent_tag.kind == DW_TagKind_ClassType || - parent_tag.kind == DW_TagKind_UnionType; - if (is_parent_udt) { - RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - U64 off = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation); - if (name.size == 0) { // inline anonymous members - DW_Reference type_ref = dw_ref_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Type); - RDIM_Type *member_type = d2r_type_from_offset(type_table, type_ref.info_off); - RDIM_UDT *member_udt = member_type->udt; - if (member_udt == 0) { - DW_Language ref_cu_lang = dw_const_u64_from_tag_attrib_kind(input, type_ref.cu, type_ref.cu->tag, DW_AttribKind_Language); - DW_TagNode *ref_tag_node = dw_tag_node_from_info_off(type_ref.cu, type_ref.info_off); - d2r_convert_udts(arena, type_table, input, type_ref.cu, ref_cu_lang, ref_tag_node); - Assert(member_type->udt); - member_udt = member_type->udt; - } - d2r_inline_anonymous_udt_member(arena, parent_type->udt, off, member_udt); - } else { - RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, parent_type->udt); - member->kind = RDI_MemberKind_DataField; - member->name = name; - member->type = type; - member->off = off; - } - } else { - log_infof("unexpected parent tag @ .debug_info+%llx", tag.info_off); - } - } else if (tag.kind == DW_TagKind_Enumerator) { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind == DW_TagKind_EnumerationType) { - RDIM_Type *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_UDTEnumVal *udt_member = rdim_udt_push_enum_val(arena, &g_d2r_shared.udts, parent_type->udt); - udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - udt_member->val = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ConstValue); - } else { - log_infof("unexpected parent tag @ .debug_info+%llx", tag.info_off); + unit_src_file_maps[unit_idx].v[file_idx] = node->src_file; } } + scratch_end(scratch2); } - scratch_end(scratch); -} - -internal RDIM_Scope * -d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges) -{ - // fill out scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, scopes, scope_chunk_cap); + lane_sync_u64(&all_src_files, 0); + lane_sync_u64(&unit_src_file_maps, 0); - // push ranges - for EachNode(i, Rng1U64Node, ranges.first) { - rdim_scope_push_voff_range(arena, scopes, scope, (RDIM_Rng1U64){.min = i->v.min, i->v.max}); - } - - // associate scope with tag - tag_stack->scope = scope; - - // update scope hierarchy - DW_TagKind parent_tag_kind = tag_stack->next->node->tag.kind; - if (parent_tag_kind == DW_TagKind_SubProgram || parent_tag_kind == DW_TagKind_InlinedSubroutine || parent_tag_kind == DW_TagKind_LexicalBlock) { - RDIM_Scope *parent = tag_stack->next->scope; - - scope->parent_scope = parent; - scope->symbol = parent->symbol; - - if (parent->last_child) { - parent->last_child->next_sibling = scope; - } - SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling); - } - - return scope; -} - -internal RDIM_Type ** -d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out) -{ - Temp scratch = scratch_begin(&arena, 1); - - RDIM_TypeList list = {0}; - B32 has_vargs = 0; - for (DW_TagNode *i = cur_node->first_child; i != 0; i = i->sibling) { - if (i->tag.kind == DW_TagKind_FormalParameter) { - RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1); - n->v = d2r_type_from_attrib(type_table, input, cu, i->tag, DW_AttribKind_Type); - SLLQueuePush(list.first, list.last, n); - ++list.count; - } else if (i->tag.kind == DW_TagKind_UnspecifiedParameters) { - has_vargs = 1; - } - } - - if (has_vargs) { - RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1); - n->v = type_table->builtin_types[RDI_TypeKind_Variadic]; - SLLQueuePush(list.first, list.last, n); - ++list.count; - } - - // collect params - *param_count_out = list.count; - RDIM_Type **params = rdim_array_from_type_list(arena, list); - - scratch_end(scratch); - return params; -} - -internal Rng1U64List -d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) -{ - // collect non-contiguous range - Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); - - // exclude invalid ranges caused by linker optimizations - Rng1U64List ranges = {0}; - for (Rng1U64Node *n = raw_ranges.first, *next = 0; n != 0; n = next) { - next = n->next; - if (n->v.min < image_base || n->v.min > n->v.max) { - continue; - } - rng1u64_list_push_node(&ranges, n); - } - - // debase ranges - for EachNode(r, Rng1U64Node, ranges.first) { - r->v.min -= image_base; - r->v.max -= image_base; - } - - // collect contiguous range + //////////////////////////// + //- rjf: parse each unit's line info; produce line tables + // + RDIM_LineTableChunkList *unit_line_table_chunk_lists = 0; + RDIM_LineTable **unit_line_tables = 0; + ProfScope("parse each unit's line info; produce line tables") { - DW_Attrib *lo_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_LowPc); - DW_Attrib *hi_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_HighPc); - if (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) { - U64 lo_pc = dw_address_from_attrib(input, cu, lo_pc_attrib); - - U64 hi_pc = 0; - DW_AttribClass hi_pc_class = dw_value_class_from_attrib(cu, hi_pc_attrib); - if (hi_pc_class == DW_AttribClass_Address) { - hi_pc = dw_address_from_attrib(input, cu, hi_pc_attrib); - } else if (hi_pc_class == DW_AttribClass_Const) { - hi_pc = dw_const_u64_from_attrib(input, cu, hi_pc_attrib); - hi_pc += lo_pc; - } - - if (lo_pc >= image_base && hi_pc >= image_base) { - if (lo_pc < hi_pc) { - rng1u64_list_push(arena, &ranges, rng_1u64(lo_pc - image_base, hi_pc - image_base)); - } else { - log_infof("invalid range @ .debug_info+%llx", tag.info_off); - } - } else { - // invalid low and hi PC are likely are caused by an optimization pass during linking - } - } else if ((lo_pc_attrib->attrib_kind == DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) || - (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind == DW_AttribKind_Null)) { - log_infof("invalid range @ .debug_info+%llx", tag.info_off); + //- rjf: prep outputs + typedef struct LineSeqChunk LineSeqChunk; + struct LineSeqChunk + { + LineSeqChunk *next; + U64 *voffs; + U32 *line_nums; + U16 *col_nums; + U64 line_count; + U64 line_cap; + }; + typedef struct FileSeqNode FileSeqNode; + struct FileSeqNode + { + FileSeqNode *next; + RDIM_SrcFile *src_file; + RDIM_SrcFileLineMapFragment *first_line_map_fragment; + RDIM_SrcFileLineMapFragment *last_line_map_fragment; + }; + typedef struct FileSeqMap FileSeqMap; + struct FileSeqMap + { + U64 slots_count; + FileSeqNode **slots; + }; + FileSeqMap *unit_file_seq_maps = 0; + if(lane_idx() == 0) + { + unit_line_table_chunk_lists = push_array(scratch.arena, RDIM_LineTableChunkList, unit_count); + unit_line_tables = push_array(scratch.arena, RDIM_LineTable *, unit_count); + unit_file_seq_maps = push_array(scratch.arena, FileSeqMap, unit_count); } + lane_sync_u64(&unit_line_table_chunk_lists, 0); + lane_sync_u64(&unit_line_tables, 0); + lane_sync_u64(&unit_file_seq_maps, 0); + + //- rjf: wide per-unit parse + U64 unit_take_idx = 0; + U64 *unit_take_idx_ptr = &unit_take_idx; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + //- rjf: take unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; + if(unit_idx >= unit_count) + { + break; + } + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: unpack unit info + DW2_LineTableHeader *line_table_header = &unit_line_table_headers[unit_idx]; + RDIM_LineTableChunkList *dst_line_tables = &unit_line_table_chunk_lists[unit_idx]; + DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; + DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); + U64 line_info_off = stmt_list->val.u128.u64[0]; + String8 all_line_info_data = raw->sec[DW_SectionKind_Line].data; + String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_table_header->line_program_off, line_info_off + line_table_header->total_unit_data_size)); + + //- rjf: build unit's line table + RDIM_LineTable *dst_line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 1); + unit_line_tables[unit_idx] = dst_line_table; + + //- rjf: set up per-unit file sequence map + unit_file_seq_maps[unit_idx].slots_count = line_table_header->files.count + 1; + unit_file_seq_maps[unit_idx].slots = push_array(scratch.arena, FileSeqNode *, unit_file_seq_maps[unit_idx].slots_count); + + //- rjf: set up vm registers + DW2_LineVMRegs vm_regs = {0}; + { + vm_regs.file_index = 1; + vm_regs.line = 1; + vm_regs.is_stmt = line_table_header->default_is_stmt; + } + + //- rjf: run the line opcode program + B32 emit_line = 0; + RDIM_SrcFile *line_seq_src_file = 0; + LineSeqChunk *first_line_seq_chunk = 0; + LineSeqChunk *last_line_seq_chunk = 0; + U64 total_line_seq_count = 0; + for(U64 off = 0, next_off = 0; off <= unit_line_table_data.size; off = next_off) + { + next_off = unit_line_table_data.size; + + //- rjf: read next opcode + U64 op_read_off = off; + U8 opcode = 0; + str8_deserial_read_struct(unit_line_table_data, op_read_off, &opcode); + op_read_off += 1; + + //- rjf: apply "special opcodes" (DWARF v5 6.2.5.1) + if(opcode >= line_table_header->opcode_base) + { + U32 adjusted_opcode = (U32)(opcode - line_table_header->opcode_base); + U32 op_advance = adjusted_opcode / line_table_header->line_range; + S64 line_advance = (S64)line_table_header->line_base + (S64)adjusted_opcode%(S64)line_table_header->line_range; + U64 addr_advance = line_table_header->min_inst_length * (vm_regs.vliw_op_index + op_advance) / line_table_header->max_ops_per_inst; + vm_regs.address += addr_advance; + vm_regs.vliw_op_index = (vm_regs.vliw_op_index + op_advance) % line_table_header->max_ops_per_inst; + vm_regs.line += line_advance; + emit_line = 1; + } + + //- rjf: apply standard opcode + else + { + U64 op_advance = 0; + switch(opcode) + { + //- rjf: skip unknown opcode + default: + { + for EachIndex(uleb_idx, line_table_header->opcode_lengths[opcode - 1]) + { + U64 v = 0; + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &v); + } + }break; + + //- rjf: line emissions + case DW_StdOpcode_Copy: + { + emit_line = 1; + }break; + + //- rjf: PC advances + case DW_StdOpcode_AdvancePc: + { + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &op_advance); + }goto advance_pc; + case DW_StdOpcode_ConstAddPc: + { + op_advance = (0xffu - line_table_header->opcode_base) / line_table_header->line_range; + }goto advance_pc; + advance_pc:; + { + U64 op_index = vm_regs.vliw_op_index + op_advance; + vm_regs.address += line_table_header->min_inst_length * (op_index / line_table_header->max_ops_per_inst); + vm_regs.vliw_op_index = op_index % line_table_header->max_ops_per_inst; + }break; + + //- rjf: fixed PC advances + case DW_StdOpcode_FixedAdvancePc: + { + U16 fixed_advance = 0; + str8_deserial_read_struct(unit_line_table_data, op_read_off, &fixed_advance); + op_read_off += sizeof(U16); + vm_regs.address += fixed_advance; + vm_regs.vliw_op_index = 0; + }break; + + //- rjf: line number advance + case DW_StdOpcode_AdvanceLine: + { + S64 advance = 0; + op_read_off += str8_deserial_read_sleb128(unit_line_table_data, op_read_off, &advance); + vm_regs.line += advance; + }break; + + //- rjf: set file + case DW_StdOpcode_SetFile: + { + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.file_index); + }break; + + //- rjf: set column + case DW_StdOpcode_SetColumn: + { + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.column); + }break; + + //- rjf: negate statment + case DW_StdOpcode_NegateStmt: + { + vm_regs.is_stmt = !vm_regs.is_stmt; + }break; + + //- rjf: flag sets + case DW_StdOpcode_SetBasicBlock: + { + vm_regs.basic_block = 1; + }break; + case DW_StdOpcode_SetPrologueEnd: + { + vm_regs.prologue_end = 1; + }break; + case DW_StdOpcode_SetEpilogueBegin: + { + vm_regs.epilogue_begin = 1; + }break; + + //- rjf: isa + case DW_StdOpcode_SetIsa: + { + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.isa); + }break; + + //- rjf: extended opcode + case DW_StdOpcode_ExtendedOpcode: + { + // rjf: read extended opcode size + U64 ext_opcode_size = 0; + op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &ext_opcode_size); + + // rjf: read extended opcode + U8 ext_opcode = 0; + op_read_off += str8_deserial_read_struct(unit_line_table_data, op_read_off, &ext_opcode); + + // rjf: grab truncated data for just this extended opcode + String8 ext_op_data = str8_prefix(unit_line_table_data, op_read_off + ext_opcode_size); + + // rjf: do extended opcode + switch(ext_opcode) + { + default: + case DW_ExtOpcode_Undefined: + case DW_ExtOpcode_UserLo: + case DW_ExtOpcode_UserHi: + {}break; + case DW_ExtOpcode_EndSequence: + { + emit_line = 1; + vm_regs.end_sequence = 1; + }break; + case DW_ExtOpcode_SetAddress: + { + U64 addr = 0; + op_read_off += str8_deserial_read(ext_op_data, op_read_off, &addr, line_table_header->addr_size, line_table_header->addr_size); + vm_regs.address = addr; + vm_regs.vliw_op_index = 0; + }break; + case DW_ExtOpcode_DefineFile: + { + String8 file_name = {0}; + U64 dir_idx = 0; + U64 modify_time = 0; + U64 file_size = 0; + op_read_off += str8_deserial_read_cstr(ext_op_data, op_read_off, &file_name); + op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &dir_idx); + op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &modify_time); + op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &file_size); + // + // TODO(rjf): this is a real problem, because at this point, we've already gathered & deduped + // all source files, but now we're in a situation where a per-lane line info parse can produce + // new source files, which may - of course - be duplicates of files defined in other unit line + // info. + // + }break; + case DW_ExtOpcode_SetDiscriminator: + { + op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &vm_regs.discriminator); + }break; + } + }break; + } + } + + //- rjf: advance to next op + if(op_read_off > off) + { + next_off = op_read_off; + } + + //- rjf: map file index -> rdim src file + RDIM_SrcFile *src_file = 0; + if(vm_regs.file_index < line_table_header->files.count) + { + src_file = unit_src_file_maps[unit_idx].v[vm_regs.file_index]; + } + + //- rjf: sequence ended explicitly, or file change, or end of stream? -> push to line table + if(line_seq_src_file != 0 && (vm_regs.end_sequence || (src_file != line_seq_src_file && first_line_seq_chunk != 0) || off >= unit_line_table_data.size)) + { + // rjf: combine voffs/lines/cols + U64 seq_line_count = total_line_seq_count; + U64 *seq_voffs = push_array(arena, U64, seq_line_count+1); + U32 *seq_lines = push_array(arena, U32, seq_line_count); + U16 *seq_cols = push_array(arena, U16, 2*seq_line_count); + { + U64 voff_idx = 0; + U64 line_idx = 0; + U64 col_idx = 0; + for(LineSeqChunk *c = first_line_seq_chunk; c != 0; c = c->next) + { + MemoryCopy(seq_voffs + voff_idx, c->voffs, sizeof(c->voffs[0]) * c->line_count); + MemoryCopy(seq_lines + line_idx, c->line_nums, sizeof(c->line_nums[0]) * c->line_count); + MemoryCopy(seq_cols + col_idx, c->col_nums, sizeof(c->col_nums[0]) * 2 * c->line_count); + voff_idx += c->line_count; + line_idx += c->line_count; + col_idx += 2*c->line_count; + } + seq_voffs[seq_line_count] = vm_regs.address - base_vaddr; + } + + // rjf: push sequence to line table + RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, dst_line_tables, dst_line_table, line_seq_src_file, seq_voffs, seq_lines, seq_cols, seq_line_count); + + // rjf: map src file -> file seq node + FileSeqNode *file_seq_n = 0; + { + U64 hash = u64_hash_from_str8(str8_struct(&line_seq_src_file)); + U64 slot_idx = hash%unit_file_seq_maps[unit_idx].slots_count; + for(FileSeqNode *n = unit_file_seq_maps[unit_idx].slots[slot_idx]; n != 0; n = n->next) + { + if(n->src_file == line_seq_src_file) + { + file_seq_n = n; + break; + } + } + if(file_seq_n == 0) + { + file_seq_n = push_array(scratch.arena, FileSeqNode, 1); + SLLStackPush(unit_file_seq_maps[unit_idx].slots[slot_idx], file_seq_n); + file_seq_n->src_file = line_seq_src_file; + } + } + + // rjf: record sequence in file seq node + { + RDIM_SrcFileLineMapFragment *f = push_array(scratch.arena, RDIM_SrcFileLineMapFragment, 1); + SLLQueuePush(file_seq_n->first_line_map_fragment, file_seq_n->last_line_map_fragment, f); + f->seq = seq; + } + + // rjf: reset + first_line_seq_chunk = last_line_seq_chunk = 0; + total_line_seq_count = 0; + line_seq_src_file = 0; + if(vm_regs.end_sequence) + { + MemoryZeroStruct(&vm_regs); + vm_regs.file_index = 1; + vm_regs.line = 1; + vm_regs.is_stmt = line_table_header->default_is_stmt; + } + } + + //- rjf: emit lines + if(emit_line && vm_regs.address != 0 && vm_regs.line != 0) + { + emit_line = 0; + + // rjf: grab the last emitted line info + U32 last_line = 0; + U16 last_col = 0; + if(last_line_seq_chunk != 0 && last_line_seq_chunk->line_count > 0) + { + last_line = last_line_seq_chunk->line_nums[last_line_seq_chunk->line_count-1]; + last_col = last_line_seq_chunk->col_nums[last_line_seq_chunk->line_count-1]; + } + + // rjf: determine if we need a new line + // + // TODO(rjf): in some cases this can trigger w/ DWARF due to columnar changes; + // we need to adjust this when we want to start correctly supporting columnar + // line info / stepping + // + B32 need_new_line = (last_line != (U32)vm_regs.line); + + // rjf: need new line -> grab chunk + LineSeqChunk *chunk = last_line_seq_chunk; + if(need_new_line && (chunk == 0 || chunk->line_count >= chunk->line_cap)) + { + chunk = push_array(scratch.arena, LineSeqChunk, 1); + SLLQueuePush(first_line_seq_chunk, last_line_seq_chunk, chunk); + chunk->line_cap = 64; + chunk->voffs = push_array(scratch.arena, U64, chunk->line_cap + 1); + chunk->line_nums = push_array(scratch.arena, U32, chunk->line_cap); + chunk->col_nums = push_array(scratch.arena, U16, 2*chunk->line_cap); + } + + // rjf: need new line -> push + if(need_new_line) + { + U64 chunk_line_idx = chunk->line_count; + chunk->voffs[chunk_line_idx] = vm_regs.address - base_vaddr; + chunk->line_nums[chunk_line_idx] = (U32)vm_regs.line; + chunk->col_nums[chunk_line_idx] = (U16)vm_regs.column; + chunk->line_count += 1; + total_line_seq_count += 1; + line_seq_src_file = src_file; + // NOTE(rjf): use for comparing against llvm-dwarfdump --debug-line +#if 0 + printf("0x%016I64x %6i %6i %6i %3i %13I64x %7i %s%s%s%s\n", + vm_regs.address, + (int)vm_regs.line, + (int)vm_regs.column, + (int)vm_regs.file_index, + (int)vm_regs.isa, + vm_regs.discriminator, + (int)vm_regs.vliw_op_index, + vm_regs.is_stmt ? " is_stmt" : "", + vm_regs.prologue_end ? " prologue_end" : "", + vm_regs.epilogue_begin ? " epilogue_begin" : "", + vm_regs.end_sequence ? " end_sequence" : ""); +#endif + } + vm_regs.discriminator = 0; + vm_regs.basic_block = 0; + vm_regs.prologue_end = 0; + vm_regs.epilogue_begin = 0; + } + } + + scratch_end(scratch2); + } + lane_sync(); + + //- rjf: equip source files with their fragments + // + // TODO(rjf): this can *almost* be wide, but we are relying on a few top-level + // summations inside the RDIM_SrcFileChunkList when we push a sequence to a src + // file. if we just summed those later when baking (probably fine), then this + // could go wide across all src files, which would be very nice. just lane-0ing + // for now. when possible, we can probably do the same thing in PDB too. + // + if(lane_idx() == 0) + { + for EachIndex(unit_idx, unit_count) + { + FileSeqMap *file_seq_map = &unit_file_seq_maps[unit_idx]; + for EachIndex(slot_idx, file_seq_map->slots_count) + { + for(FileSeqNode *n = file_seq_map->slots[slot_idx]; n != 0; n = n->next) + { + for(RDIM_SrcFileLineMapFragment *f = n->first_line_map_fragment; f != 0; f = f->next) + { + rdim_src_file_push_line_sequence(arena, all_src_files, n->src_file, f->seq); + } + } + } + } + } + lane_sync(); } - return ranges; -} - -internal void -d2r_convert_symbols(Arena *arena, - D2R_TypeTable *type_table, - DW_Raw *input, - DW_CompUnit *cu, - DW_Language cu_lang, - U64 image_base, - Arch arch, - DW_TagNode *root, - RDIM_Unit *unit_rdi) -{ - Temp scratch = scratch_begin(&arena, 1); - for (D2R_TagIterator *it = d2r_tag_iterator_init(scratch.arena, root); it->tag_node != 0; d2r_tag_iterator_next(scratch.arena, it)) { - DW_TagNode *tag_node = it->tag_node; - DW_Tag tag = tag_node->tag; - switch (tag.kind) { - case DW_TagKind_Null: { InvalidPath; } break; - case DW_TagKind_ClassType: - case DW_TagKind_StructureType: - case DW_TagKind_UnionType: { - // visit children to collect methods and variables - } break; - case DW_TagKind_EnumerationType: - case DW_TagKind_SubroutineType: - case DW_TagKind_Typedef: - case DW_TagKind_BaseType: - case DW_TagKind_PointerType: - case DW_TagKind_RestrictType: - case DW_TagKind_VolatileType: - case DW_TagKind_ConstType: - case DW_TagKind_ArrayType: - case DW_TagKind_SubrangeType: - case DW_TagKind_Inheritance: - case DW_TagKind_Enumerator: - case DW_TagKind_Member: { - d2r_tag_iterator_skip_children(it); - } break; - case DW_TagKind_SubProgram: { - // handled during type conversion step - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Declaration)) { - d2r_tag_iterator_skip_children(it); + //////////////////////////// + //- rjf: join all line tables + // + RDIM_LineTableChunkList *all_line_tables = 0; + if(lane_idx() == 0) + { + all_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, 1); + for EachIndex(unit_idx, unit_count) + { + rdim_line_table_chunk_list_concat_in_place(all_line_tables, &unit_line_table_chunk_lists[unit_idx]); + } + } + lane_sync_u64(&all_line_tables, 0); + + //////////////////////////// + //- rjf: find all offsets of top-level tag trees across all units + // + U64Array *unit_info_root_tag_offs = 0; + U64 total_root_tag_count = 0; + U64 *total_root_tag_count_ptr = &total_root_tag_count; + lane_sync_u64(&total_root_tag_count_ptr, 0); + ProfScope("find all offsets of top-level tag trees across all units") + { + if(lane_idx() == 0) + { + unit_info_root_tag_offs = push_array(scratch.arena, U64Array, unit_count); + } + lane_sync_u64(&unit_info_root_tag_offs, 0); + typedef struct D2R2_UnitTagTreeOffChunkNode D2R2_UnitTagTreeOffChunkNode; + struct D2R2_UnitTagTreeOffChunkNode + { + D2R2_UnitTagTreeOffChunkNode *next; + U64 *v; + U64 count; + U64 cap; + }; + typedef struct D2R2_UnitTagTreeOffChunkList D2R2_UnitTagTreeOffChunkList; + struct D2R2_UnitTagTreeOffChunkList + { + D2R2_UnitTagTreeOffChunkNode *first; + D2R2_UnitTagTreeOffChunkNode *last; + U64 chunk_count; + U64 total_count; + }; + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + //- rjf: take the next unit + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= unit_count) + { + break; + } + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: unpack this unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + + //- rjf: gather all offsets of root-level trees + D2R2_UnitTagTreeOffChunkList tree_offs = {0}; + S64 depth = 0; + for(U64 off = unit_info_tag_range.min; contains_1u64(unit_info_tag_range, off);) + { + U64 start_off = off; + Temp scratch3 = scratch_begin(&scratch2.arena, 1); + + //- rjf: if this next tag is root-level, gather + if(depth == 1) + { + D2R2_UnitTagTreeOffChunkNode *chunk = tree_offs.last; + if(chunk == 0 || chunk->count >= chunk->cap) + { + chunk = push_array(scratch2.arena, D2R2_UnitTagTreeOffChunkNode, 1); + chunk->cap = 512; + chunk->v = push_array(scratch2.arena, U64, chunk->cap); + SLLQueuePush(tree_offs.first, tree_offs.last, chunk); + tree_offs.chunk_count += 1; + } + chunk->v[chunk->count] = off; + chunk->count += 1; + tree_offs.total_count += 1; + } + + //- rjf: reading the next tag + DW2_Tag tag = {0}; + off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + + //- rjf: do tree navigations + if(tag.has_children) + { + depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + + scratch_end(scratch3); + if(off == start_off) + { break; } - - DW_InlKind inl = DW_Inl_NotInlined; - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Inline)) { inl = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Inline); } - - switch (inl) { - case DW_Inl_DeclaredNotInlined: - case DW_Inl_NotInlined: { - U64 param_count = 0; - RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); - - // get return type - RDIM_Type *ret_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - - // fill out proc type - RDIM_Type *proc_type = d2r_create_type(arena, type_table); - proc_type->kind = RDI_TypeKind_Function; - proc_type->byte_size = cu->address_size; - proc_type->direct_type = ret_type; - proc_type->count = param_count; - proc_type->param_types = params; - - // get container type - RDIM_Type *container_type = 0; - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ContainingType)) { - container_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_ContainingType); - } else { - DW_TagNode *parent = d2r_tag_iterator_parent_tag_node(it); - container_type = d2r_type_from_offset(type_table, parent->tag.info_off); - if (container_type == 0) { - log_infof("ERROR: failed to infer parent type of subprogram from .debug_info+0x%llx\n", parent->tag.info_off); - } - } - - // get frame base expression - String8 frame_base_expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_FrameBase); - - // get proc container symbol - RDIM_Symbol *proc = rdim_symbol_chunk_list_push(arena, &unit_rdi->procedures, D2R_PROC_CHUNK_CAP); - - // make scope - Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - RDIM_Scope *root_scope = d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); - root_scope->symbol = proc; - - // fill out proc - proc->is_extern = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_External); - proc->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - proc->link_name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName); - proc->type = proc_type; - proc->container_scope = 0; - proc->container_type = container_type; - proc->root_scope = root_scope; - proc->location_cases = d2r_locset_from_attrib(arena, &unit_rdi->scopes, root_scope, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase); - - // sub program with user-defined parent tag is a method - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_StructureType) { - // DW_VirtualityKind -> RDI_MemberKind - RDI_MemberKind member_kind = RDI_MemberKind_NULL; - { - DW_VirtualityKind virtuality = DW_VirtualityKind_None; - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Virtuality)) { - virtuality = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality); - switch (virtuality) { - case DW_VirtualityKind_None: member_kind = RDI_MemberKind_Method; break; - case DW_VirtualityKind_Virtual: member_kind = RDI_MemberKind_VirtualMethod; break; - case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal - default: { log_infof("unhandled virtuality kind"); } break; - } - } - } - - RDIM_Type *type = d2r_type_from_offset(type_table, parent_tag.info_off); - RDIM_UDTMember *member = rdim_udt_push_member(arena, &g_d2r_shared.udts, type->udt); - member->kind = member_kind; - member->type = type; - member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - } else if (parent_tag.kind != DW_TagKind_CompileUnit) { - log_infof("unexpected tag @ .debug_info+%llx", tag.info_off); - } - - it->stack->scope = root_scope; - } break; - case DW_Inl_DeclaredInlined: - case DW_Inl_Inlined: { - d2r_tag_iterator_skip_children(it); - } break; - default: InvalidPath; break; - } - } break; - case DW_TagKind_InlinedSubroutine: { - U64 param_count = 0; - RDIM_Type **params = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, ¶m_count); - - // get return type - RDIM_Type *ret_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - - // fill out proc type - RDIM_Type *proc_type = d2r_create_type(arena, type_table); - proc_type->kind = RDI_TypeKind_Function; - proc_type->byte_size = cu->address_size; - proc_type->direct_type = ret_type; - proc_type->count = param_count; - proc_type->param_types = params; - - // get container type - RDIM_Type *owner = 0; - if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ContainingType)) { - owner = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_ContainingType); - } - - // fill out inline site - RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &unit_rdi->inline_sites, D2R_INLINE_SITE_CHUNK_CAP); - inline_site->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - inline_site->type = proc_type; - inline_site->owner = owner; - inline_site->line_table = 0; - - // make scope - Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - RDIM_Scope *root_scope = d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); - root_scope->inline_site = inline_site; - } break; - case DW_TagKind_Variable: { - String8 name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind == DW_TagKind_SubProgram || - parent_tag.kind == DW_TagKind_InlinedSubroutine || - parent_tag.kind == DW_TagKind_LexicalBlock) { - RDIM_Scope *scope = it->stack->next->scope; - RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); - local->name = name; - local->type = type; - local->location_cases = d2r_var_locset_from_tag(arena, &unit_rdi->scopes, scope, input, cu, image_base, arch, tag); - } else { - - // NOTE: due to a bug in clang in stb_sprintf.h local variables - // are declared in global scope without a name - if (name.size == 0) { break; } - - // decls do not have location info - B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration); - if (is_decl) { break; } - - U64 voff = max_U64; - B32 is_thread_var = 0; + } + + //- rjf: flatten & store + { + U64Array tree_offs_array = {0}; + tree_offs_array.count = tree_offs.total_count; + tree_offs_array.v = push_array(scratch.arena, U64, tree_offs_array.count); + { + U64 idx = 0; + for EachNode(n, D2R2_UnitTagTreeOffChunkNode, tree_offs.first) { - DW_Attrib *loc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_Location); - DW_AttribClass loc_class = dw_value_class_from_attrib(cu, loc_attrib); - if (loc_class == DW_AttribClass_ExprLoc) { - Temp temp = temp_begin(scratch.arena); - - String8 expr = dw_exprloc_from_attrib(input, cu, loc_attrib); - D2R_ValueType expr_type = 0; - RDIM_EvalBytecode bc = d2r_bytecode_from_expression(temp.arena, input, image_base, arch, cu->addr_lu, expr, cu, &expr_type); - - // evaluate bytecode to virutal offset if possible - if (expr_type == D2R_ValueType_Address) { - B32 is_static = rdim_is_eval_bytecode_static(bc); - if (is_static) { - if (!rdim_static_eval_bytecode_to_voff(bc, image_base, &voff)) { - log_infof("failed to evalute byte code to virtual offset @ .debug_info+%llx", tag.info_off); - } + MemoryCopy(tree_offs_array.v + idx, n->v, sizeof(n->v[0])*n->count); + idx += n->count; + } + } + unit_info_root_tag_offs[unit_idx] = tree_offs_array; + ins_atomic_u64_add_eval(total_root_tag_count_ptr, tree_offs_array.count); + } + + scratch_end(scratch2); + } + lane_sync(); + total_root_tag_count = *total_root_tag_count_ptr; + } + + //////////////////////////// + //- rjf: produce list of (unit * range(root_tag_idx)), so that we can easily + // subdivide work from all units across all lanes + // + typedef struct D2R2_SubUnitWork D2R2_SubUnitWork; + struct D2R2_SubUnitWork + { + U64 unit_idx; + Rng1U64 root_tag_idx_range; + }; + U64 sub_unit_works_count = 0; + D2R2_SubUnitWork *sub_unit_works = 0; + ProfScope("produce sub-unit work division") if(lane_idx() == 0) + { + U64 root_tags_per_work = 1024; + for(B32 build = 0; build <= 1; build += 1) + { + U64 sub_unit_work_idx = 0; + for EachIndex(unit_idx, unit_count) + { + U64 root_tags_in_this_unit = unit_info_root_tag_offs[unit_idx].count; + U64 works_per_this_unit = (root_tags_in_this_unit+root_tags_per_work-1) / root_tags_per_work; + if(build) + { + D2R2_SubUnitWork *works = sub_unit_works + sub_unit_work_idx; + U64 works_count = works_per_this_unit; + U64 root_tag_idx = 0; + for EachIndex(work_idx, works_count) + { + U64 root_tag_idx_opl = root_tag_idx + root_tags_per_work; + root_tag_idx_opl = ClampTop(root_tag_idx_opl, root_tags_in_this_unit); + works[work_idx].unit_idx = unit_idx; + works[work_idx].root_tag_idx_range = r1u64(root_tag_idx, root_tag_idx_opl); + root_tag_idx = root_tag_idx_opl; + } + } + sub_unit_work_idx += works_per_this_unit; + } + if(!build) + { + sub_unit_works_count = sub_unit_work_idx; + sub_unit_works = push_array(scratch.arena, D2R2_SubUnitWork, sub_unit_works_count); + } + } + } + lane_sync_u64(&sub_unit_works_count, 0); + lane_sync_u64(&sub_unit_works, 0); + + //////////////////////////// + //- rjf: build built-in types + // + RDIM_TypeChunkList *builtin_types = 0; + RDIM_Type **builtin_type_from_kind_map = 0; // [RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1] + U64 builtin_type_count = RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1; + ProfScope("build built-in types") if(lane_idx() == 0) + { + builtin_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); + builtin_type_from_kind_map = push_array(scratch.arena, RDIM_Type *, builtin_type_count); + for(RDI_TypeKind k = RDI_TypeKind_FirstBuiltIn; k <= RDI_TypeKind_LastBuiltIn; k += 1) + { + RDIM_Type *type = rdim_type_chunk_list_push(arena, builtin_types, builtin_type_count); + type->kind = k; + type->name.str = rdi_string_from_type_kind(k, &type->name.size); + type->byte_size = rdi_size_from_basic_type_kind(k); + if(type->byte_size == max_U32) { type->byte_size = byte_size_from_arch(arch); } + builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] = type; + } + } + lane_sync_u64(&builtin_types, 0); + lane_sync_u64(&builtin_type_from_kind_map, 0); +#define d2r2_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] : builtin_type_from_kind_map[RDI_TypeKind_Void]) + + //////////////////////////// + //- rjf: predict the total number of tags in all units + // + U64 total_tag_count_estimate = 1; + { + U64 tag_size_estimate = 32; + for EachIndex(unit_idx, unit_count) + { + total_tag_count_estimate += dim_1u64(unit_info_tag_ranges[unit_idx]) / tag_size_estimate; + } + } + + //////////////////////////// + //- rjf: gather all unique, to-be-deduplicated tags across all units (types, namespaces) + // + D2R2_UniqueTagNode **unique_tag_slots = 0; + U64 unique_tag_slots_count = total_tag_count_estimate/8 + 1; + D2R2_UnitDedupedTagMap *unit_deduped_tag_maps = 0; + ProfScope("gather all unique, to-be-deduplicated tags across all units (types, namespaces)") + { + //- rjf: set up tables + if(lane_idx() == 0) + { + unique_tag_slots = push_array(scratch.arena, D2R2_UniqueTagNode *, unique_tag_slots_count); + unit_deduped_tag_maps = push_array(scratch.arena, D2R2_UnitDedupedTagMap, unit_count); + } + lane_sync_u64(&unique_tag_slots, 0); + lane_sync_u64(&unit_deduped_tag_maps, 0); + + //- rjf: set up per-unit deduplicated tag maps + { + Rng1U64 range = lane_range(unit_count); + for EachInRange(unit_idx, range) + { + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + unit_deduped_tag_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 256 + 1; + unit_deduped_tag_maps[unit_idx].slots = push_array(scratch.arena, D2R2_UnitDedupedTagNode *, unit_deduped_tag_maps[unit_idx].slots_count); + } + lane_sync(); + } + + //- rjf: gather unique tags + { + U64 work_take_idx_ = 0; + U64 *work_take_idx_ptr = &work_take_idx_; + lane_sync_u64(&work_take_idx_ptr, 0); + for(;;) + { + //- rjf: take next work + U64 work_idx = ins_atomic_u64_inc_eval(work_take_idx_ptr) - 1; + if(work_idx >= sub_unit_works_count) + { + break; + } + Temp work_scratch = scratch_begin(&scratch.arena, 1); + + //- rjf: unpack work + U64 origin_unit_idx = sub_unit_works[work_idx].unit_idx; + Rng1U64 origin_unit_root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; + + //- rjf: unpack unit info + DW2_ParseCtx *origin_unit_parse_ctx = &unit_parse_ctxs[origin_unit_idx]; + Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; + + //- rjf: gather all tags which we want to deduplicate + typedef struct D2R2_TagNode D2R2_TagNode; + struct D2R2_TagNode + { + D2R2_TagNode *next; + D2R2_UniqueTagKind kind; + U64 info_off; + U64 container_ancestor_info_off; + U64 hash_seed; + }; + D2R2_TagNode *first_tag_to_dedup = 0; + D2R2_TagNode *last_tag_to_dedup = 0; + for(U64 root_tag_idx = origin_unit_root_tag_idx_range.min; + root_tag_idx < origin_unit_root_tag_idx_range.max; + root_tag_idx += 1) + { + U64 root_tag_start_off = unit_info_root_tag_offs[origin_unit_idx].v[root_tag_idx]; + typedef struct D2R2_ParentTagNode D2R2_ParentTagNode; + struct D2R2_ParentTagNode + { + D2R2_ParentTagNode *next; + DW_TagKind tag_kind; + U64 info_off; + U64 hash_seed; + }; + D2R2_ParentTagNode *top_parent = 0; + D2R2_ParentTagNode *free_parent = 0; + S64 depth = 0; + for(U64 off = root_tag_start_off; contains_1u64(origin_unit_info_tag_range, off) && (depth > 0 || off == root_tag_start_off);) + { + Temp tag_scratch = scratch_begin(&work_scratch.arena, 1); + U64 start_off = off; + + // rjf: read tag + DW2_Tag tag = {0}; + off += dw2_read_tag(tag_scratch.arena, raw, origin_unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + + // rjf: is this one of the tags we'd like to dedup? -> gather + if(tag.kind == DW_TagKind_ArrayType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_EnumerationType || + tag.kind == DW_TagKind_PointerType || + tag.kind == DW_TagKind_ReferenceType || + tag.kind == DW_TagKind_StringType || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_Typedef || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_PtrToMemberType || + tag.kind == DW_TagKind_SetType || + tag.kind == DW_TagKind_BaseType || + tag.kind == DW_TagKind_ConstType || + tag.kind == DW_TagKind_FileType || + tag.kind == DW_TagKind_PackedType || + tag.kind == DW_TagKind_VolatileType || + tag.kind == DW_TagKind_RestrictType || + tag.kind == DW_TagKind_InterfaceType || + tag.kind == DW_TagKind_UnspecifiedType || + tag.kind == DW_TagKind_SharedType || + tag.kind == DW_TagKind_RValueReferenceType || + tag.kind == DW_TagKind_CoarrayType || + tag.kind == DW_TagKind_DynamicType || + tag.kind == DW_TagKind_AtomicType || + tag.kind == DW_TagKind_ImmutableType || + tag.kind == DW_TagKind_Namespace) + { + U64 container_ancestor_info_off = 0; + for EachNode(n, D2R2_ParentTagNode, top_parent) + { + if(n->tag_kind == DW_TagKind_StructureType || + n->tag_kind == DW_TagKind_UnionType || + n->tag_kind == DW_TagKind_ClassType || + n->tag_kind == DW_TagKind_SubProgram || + n->tag_kind == DW_TagKind_LexicalBlock || + n->tag_kind == DW_TagKind_Namespace) + { + container_ancestor_info_off = n->info_off; + break; } } + D2R2_TagNode *n = push_array(work_scratch.arena, D2R2_TagNode, 1); + n->kind = (tag.kind == DW_TagKind_Namespace ? D2R2_UniqueTagKind_Namespace : D2R2_UniqueTagKind_Type); + n->info_off = start_off; + n->container_ancestor_info_off = container_ancestor_info_off; + n->hash_seed = top_parent ? top_parent->hash_seed : 0; + SLLQueuePush(first_tag_to_dedup, last_tag_to_dedup, n); + } + + // rjf: compute hash seed for this tag + U64 hash_seed = (top_parent ? top_parent->hash_seed : 0); + if(tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_Namespace) + { + DW2_Attrib *name_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Name); + if(name_attrib != &dw2_attrib_nil) + { + hash_seed = u64_hash_from_str8(name_attrib->val.string); + } + } + + // rjf: update depth / parent stack + if(tag.has_children) + { + depth += 1; + D2R2_ParentTagNode *n = free_parent; + if(n != 0) + { + SLLStackPop(free_parent); + } + else + { + n = push_array(work_scratch.arena, D2R2_ParentTagNode, 1); + } + SLLStackPush(top_parent, n); + n->tag_kind = tag.kind; + n->info_off = start_off; + n->hash_seed = hash_seed; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + depth = Max(0, depth); + if(top_parent != 0) + { + D2R2_ParentTagNode *popped = top_parent; + SLLStackPop(top_parent); + SLLStackPush(free_parent, popped); + } + } + + scratch_end(tag_scratch); + if(off == start_off) + { + break; + } + } + } + + //- rjf: hash all tags we need to deduplicate & gather + for(D2R2_TagNode *tag_n = first_tag_to_dedup; tag_n != 0; tag_n = tag_n->next) + { + Temp dedup_root_scratch = scratch_begin(&scratch.arena, 1); + U64 start_off = tag_n->info_off; + D2R2_UniqueTagKind unique_tag_kind = tag_n->kind; + U64 container_ancestor_info_off = tag_n->container_ancestor_info_off; + U64 hash_seed = tag_n->hash_seed; + + //- rjf: hash all tags & dependency tag trees + U64 hash = hash_seed; + { + typedef struct TagTask TagTask; + struct TagTask + { + TagTask *next; + U64 unit_idx; + U64 off; + U64 order_idx; + }; + TagTask start_task = {0, origin_unit_idx, start_off}; + TagTask *top_task = &start_task; + TagTask *free_task = 0; + U64 seen_task_slots_count = 16; + TagTask **seen_task_slots = push_array(dedup_root_scratch.arena, TagTask *, seen_task_slots_count); + for(TagTask *t = top_task, *next = 0; t != 0; t = next) + { + next = 0; + U64 t_off = t->off; - // is this a thread variable? - is_thread_var = rdim_is_bytecode_tls_dependent(bc); + // rjf: record this task in our seen task table + { + U64 hash = u64_hash_from_str8(str8_struct(&t->off)); + U64 slot_idx = hash%seen_task_slots_count; + SLLStackPush(seen_task_slots[slot_idx], t); + } - temp_end(temp); + // rjf: unpack unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; + + // rjf: read/hash the full tag tree at `t_off`; kick off additional + // tasks for referenced dependency types + S64 depth = 0; + B32 hash_should_include_children = 1; + for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max && (depth > 0 || t_off == t->off);) + { + Temp tag_scratch = scratch_begin(&dedup_root_scratch.arena, 1); + U64 t_start_off = t_off; + + // rjf: read tag + DW2_Tag tag = {0}; + t_off += dw2_read_tag(tag_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, t_off, &tag); + + // rjf: determine if tag should be skipped from hashing + B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || + tag.kind == DW_TagKind_Variable); + + // rjf: determine if we want to consider tag children as part of the content hash + if(t_start_off == t->off && tag.kind == DW_TagKind_Namespace) + { + hash_should_include_children = 0; + } + + // rjf: if we want to combine this tag into the hash -> combine + if(!should_skip_tag) + { + // rjf: combine tag's kind + hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); + + // rjf: combine non-reference attributes (references could be different, + // because of deduping, but they could match ultimately). for any + // referenced dependency types, kick them off + for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) + { + // rjf: non-reference? -> combine attribute value info + if(n->v.val.kind != DW_FormKind_RefAddr && + n->v.val.kind != DW_FormKind_Ref1 && + n->v.val.kind != DW_FormKind_Ref2 && + n->v.val.kind != DW_FormKind_Ref4 && + n->v.val.kind != DW_FormKind_Ref8 && + n->v.val.kind != DW_FormKind_RefUData && + n->v.val.kind != DW_FormKind_RefSup4 && + n->v.val.kind != DW_FormKind_RefSig8 && + ((tag.kind != DW_TagKind_SubProgram && + tag.kind != DW_TagKind_FormalParameter) || + (n->v.attrib_kind != DW_AttribKind_Name && + n->v.attrib_kind != DW_AttribKind_DeclFile && + n->v.attrib_kind != DW_AttribKind_DeclLine && + n->v.attrib_kind != DW_AttribKind_Prototyped && + n->v.attrib_kind != DW_AttribKind_External && + n->v.attrib_kind != DW_AttribKind_FrameBase && + n->v.attrib_kind != DW_AttribKind_Location && + n->v.attrib_kind != DW_AttribKind_LowPc && + n->v.attrib_kind != DW_AttribKind_HighPc))) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); + if(n->v.val.string.size != 0) + { + hash = u64_hash_from_seed_str8(hash, n->v.val.string); + } + else if(n->v.val.addr != 0) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.addr)); + } + else + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); + } + } + + // rjf: type reference? -> if seen, combine the order; if not, recurse + if(n->v.attrib_kind == DW_AttribKind_Type) + { + // rjf: unpack reference + U64 ref_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); + + // rjf: determine if we've seen this reference + B32 already_seen = 0; + U64 already_seen_order_idx = 0; + { + U64 off_hash = u64_hash_from_str8(str8_struct(&ref_info_off)); + U64 off_slot_idx = off_hash%seen_task_slots_count; + for(TagTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) + { + if(t->off == ref_info_off) + { + already_seen = 1; + already_seen_order_idx = t->order_idx; + break; + } + } + } + + // rjf: if we've seen -> hash the order + if(already_seen) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&already_seen_order_idx)); + } + + // rjf: if we've not seen -> descend + if(!already_seen) + { + TagTask *dependency_task = free_task; + if(dependency_task != 0) + { + SLLStackPop(free_task); + } + else + { + dependency_task = push_array(dedup_root_scratch.arena, TagTask, 1); + } + dependency_task->next = next; + next = dependency_task; + dependency_task->off = ref_info_off; + dependency_task->unit_idx = t->unit_idx; + if(!contains_1u64(unit_info_tag_range, dependency_task->off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + dependency_task->unit_idx = new_unit_num-1; + } + } + dependency_task->order_idx = t->order_idx+1; + } + } + } + } + + // rjf: tree nav if we need to + if(hash_should_include_children) + { + if(tag.has_children) + { + depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + depth = Max(0, depth); + } + } + scratch_end(tag_scratch); + } } } - RDIM_SymbolChunkList *var_chunks; U64 var_chunks_cap; - if (is_thread_var) { var_chunks = &unit_rdi->thread_variables; var_chunks_cap = D2R_TVAR_CHUNK_CAP; } - else { var_chunks = &unit_rdi->global_variables; var_chunks_cap = D2R_GVAR_CHUNK_CAP; } + //- rjf: atomically gather this hash if not already gathered + { + B32 gathered = 0; + U64 slot_idx = hash%unique_tag_slots_count; + for(;!gathered;) + { + // rjf: read existing slot head pointer *before* we lookup / insert + U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_tag_slots[slot_idx]); + + // rjf: determine if this hash has been gathered + D2R2_UniqueTagNode *already_gathered_node = 0; + for(D2R2_UniqueTagNode *n = (D2R2_UniqueTagNode *)slot_head_val; n != 0; n = n->next) + { + if(n->hash == hash) + { + gathered = 1; + already_gathered_node = n; + break; + } + } + + // rjf: if this hash *has* been gathered, we want to prefer a + // deterministic unit/info offset - so we'll just prefer the + // lowest unit/offset. + // + // TODO(rjf): this seems to only be necessary because of a flaw + // in the deduplicator logic (without this part). in theory, if we + // trust the hash (all experiments suggested that we should - e.g. + // no hash collisions w/ different data were observed), then the + // same hash should imply an identical type graph. this may be false + // for reasons I do not currently understand, or due to a mistake + // somewhere. but for now, I've added this, to ensure that when there + // are many type tag trees which map to an identical hash, we always + // parse the one from the lowest .debug_info offset, just to make + // sure it's deterministic. in a multi-threaded conversion, this + // is not true in general without this step; one thread which finds + // the same type with a higher .debug_info offset may win, and so + // where exactly one type hash is parsed is not deterministic. but, + // the theory is, that shouldn't matter - the type graphs should + // match nonetheless. in any case, if that turns out to be a broken + // theory, this should be a relatively cheap step to guarantee + // deterministic (hash -> .debug_info offset), which is likely a + // desirable property regardless. but I wanted to leave this here + // so that I can more closely verify what is going on later. + // + if(gathered && already_gathered_node != 0) + { + B32 minimized = 0; + for(;!minimized;) + { + U64 stored_info_off = ins_atomic_u64_eval(&already_gathered_node->info_off); + if(start_off < stored_info_off) + { + if(ins_atomic_u64_eval_cond_assign(&already_gathered_node->info_off, start_off, stored_info_off) == stored_info_off) + { + minimized = 1; + } + } + else + { + minimized = 1; + } + } + } + + // rjf: if this hash has *not* been gathered, try an insert. we: + // + // 1. allocate/fill a node + // 2. set it up to point to the old head + // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above + // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again + // (we may find that another thread has filled this hash, so we'll just be done) + // + if(!gathered) + { + Temp insert_temp = temp_begin(scratch.arena); + D2R2_UniqueTagNode *n = push_array(scratch.arena, D2R2_UniqueTagNode, 1); + n->next = (D2R2_UniqueTagNode *)slot_head_val; + n->kind = unique_tag_kind; + n->hash = hash; + n->info_off = start_off; + n->container_ancestor_info_off = container_ancestor_info_off; + U64 new_head_val = (U64)n; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_tag_slots[slot_idx], new_head_val, slot_head_val)) + { + gathered = 1; + } + else + { + temp_end(insert_temp); + } + } + } + } - RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, var_chunks, var_chunks_cap); - var->is_extern = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_External); - var->name = name; - var->link_name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName); - var->type = type; - var->container_scope = 0; - RDIM_Location loc = {.kind = is_thread_var ? RDI_LocationKind_TLSOff : RDI_LocationKind_ModuleOff, .offset = voff}; - RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; - rdim_location_case_list_push(arena, &var->location_cases, loc, range); + //- rjf: atomically record this (info_off -> hash) mapping, so that when we have + // later references to this type, we can redirect to the deduplicated type with + // the right hash later. + { + U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; + D2R2_UnitDedupedTagNode *n = push_array(scratch.arena, D2R2_UnitDedupedTagNode, 1); + n->src_info_off = start_off; + n->dst_hash = hash; + for(B32 inserted = 0; !inserted;) + { + U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); + n->next = (D2R2_UnitDedupedTagNode *)slot_head_val; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) + { + inserted = 1; + } + } + } + scratch_end(dedup_root_scratch); } - } break; - case DW_TagKind_FormalParameter: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) { - RDIM_Scope *scope = it->stack->next->scope; - RDIM_Symbol *param = rdim_symbol_chunk_list_push(arena, &scope->locals, 4); - param->is_param = 1; - param->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name); - param->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type); - param->location_cases = d2r_var_locset_from_tag(arena, &unit_rdi->scopes, scope, input, cu, image_base, arch, tag); - } else { - Assert(!"this is a local variable"); - log_infof(".debug_info+%llx out of scope formal parameter", tag.info_off); - } - } break; - case DW_TagKind_LexicalBlock: { - DW_Tag parent_tag = d2r_tag_iterator_parent_tag(it); - if (parent_tag.kind == DW_TagKind_SubProgram || - parent_tag.kind == DW_TagKind_InlinedSubroutine || - parent_tag.kind == DW_TagKind_LexicalBlock) { - Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag); - d2r_push_scope(arena, &unit_rdi->scopes, D2R_SCOPE_CHUNK_CAP, it->stack, ranges); - } - } break; - case DW_TagKind_CallSite: { - // TODO - } break; - case DW_TagKind_CallSiteParameter: { - // TODO - } break; - case DW_TagKind_Label: - case DW_TagKind_CompileUnit: - case DW_TagKind_UnspecifiedParameters: - case DW_TagKind_Namespace: - case DW_TagKind_ImportedDeclaration: - case DW_TagKind_PtrToMemberType: - case DW_TagKind_TemplateTypeParameter: - case DW_TagKind_ReferenceType: { - // TODO: - } break; - default: + + scratch_end(work_scratch); + } + lane_sync(); + } + } + + //////////////////////////// + //- rjf: sort all unique tag table slots + // + ProfScope("sort all unique tag table slots") + { + Rng1U64 range = lane_range(unique_tag_slots_count); + for EachInRange(slot_idx, range) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + D2R2_UniqueTagNode **slot = &unique_tag_slots[slot_idx]; + + // rjf: count nodes in this slot + U64 node_count = 0; + for EachNode(n, D2R2_UniqueTagNode, slot[0]) { - // NotImplemented; - } break; + node_count += 1; + } + + // rjf: flatten + D2R2_UniqueTagNode **slot_nodes_array = push_array(scratch2.arena, D2R2_UniqueTagNode *, node_count); + { + U64 idx = 0; + for EachNode(n, D2R2_UniqueTagNode, slot[0]) + { + slot_nodes_array[idx] = n; + idx += 1; + } + } + + // rjf: sort + radsort(slot_nodes_array, node_count, (int (*)(void *, void *))d2r2_unique_tag_node_is_less_than); + + // rjf: re-order in the slot + { + unique_tag_slots[slot_idx] = 0; + for EachIndex(idx, node_count) + { + SLLStackPush(unique_tag_slots[slot_idx], slot_nodes_array[idx]); + } + } + + scratch_end(scratch2); + } + lane_sync(); + } + + //////////////////////////// + //- rjf: produce [0...n) <-> unique-tag-node mapping for all categories of deduplicated tags + // + U64 *deduped_tag_counts = 0; // [D2R2_UniqueTagKind_COUNT] + D2R2_UniqueTagNode ***deduped_tag_nodes = 0; // [D2R2_UniqueTagKind_COUNT] + ProfScope("produce [0...n) -> hash mapping for all categories of deduplicated tags") if(lane_idx() == 0) + { + deduped_tag_counts = push_array(scratch.arena, U64, D2R2_UniqueTagKind_COUNT); + deduped_tag_nodes = push_array(scratch.arena, D2R2_UniqueTagNode **, D2R2_UniqueTagKind_COUNT); + for EachIndex(slot_idx, unique_tag_slots_count) + { + for EachNode(n, D2R2_UniqueTagNode, unique_tag_slots[slot_idx]) + { + deduped_tag_counts[n->kind] += 1; + } + } + for EachEnumVal(D2R2_UniqueTagKind, k) + { + deduped_tag_nodes[k] = push_array(scratch.arena, D2R2_UniqueTagNode *, deduped_tag_counts[k]); + } + U64 idxs[D2R2_UniqueTagKind_COUNT] = {0}; + for EachIndex(slot_idx, unique_tag_slots_count) + { + for EachNode(n, D2R2_UniqueTagNode, unique_tag_slots[slot_idx]) + { + deduped_tag_nodes[n->kind][idxs[n->kind]] = n; + n->order_idx = idxs[n->kind]; + idxs[n->kind] += 1; + } } } - scratch_end(scratch); -} - -force_inline int -d2r_src_file_lookup_compar(void *raw_a, void *raw_b) -{ - D2R_SrcFileLookup *a = raw_a, *b = raw_b; - DW_LineFile *file_a = a->file, *file_b = b->file; - String8 dir_path_a = a->vm->header.dir_table.v[file_a->dir_idx]; - String8 dir_path_b = b->vm->header.dir_table.v[file_b->dir_idx]; - int cmp = str8_compar(dir_path_a, dir_path_b, 0); - if (cmp == 0) { - cmp = str8_compar(file_a->path, file_b->path, 0); + lane_sync_u64(&deduped_tag_counts, 0); + lane_sync_u64(&deduped_tag_nodes, 0); + U64 type_count = deduped_tag_counts[D2R2_UniqueTagKind_Type]; + D2R2_UniqueTagNode **type_tag_nodes = deduped_tag_nodes[D2R2_UniqueTagKind_Type]; + U64 namespace_count = deduped_tag_counts[D2R2_UniqueTagKind_Namespace]; + D2R2_UniqueTagNode **namespace_tag_nodes = deduped_tag_nodes[D2R2_UniqueTagKind_Namespace]; + + //////////////////////////// + //- rjf: gather per-type dependency chains + // + typedef struct TypeDepChain TypeDepChain; + struct TypeDepChain + { + TypeDepChain *next; + U64 type_idx; + }; + U64 *type_dep_chains_counts = 0; + ProfScope("gather per-type dependency chains") + { + if(lane_idx() == 0) + { + type_dep_chains_counts = push_array(scratch.arena, U64, type_count); + } + lane_sync_u64(&type_dep_chains_counts, 0); + Rng1U64 range = lane_range(type_count); + for EachInRange(root_type_idx, range) + { + typedef struct TypeChainTask TypeChainTask; + struct TypeChainTask + { + TypeChainTask *next; + U64 hash; + }; + TypeChainTask start_task = {0, type_tag_nodes[root_type_idx]->hash}; + TypeChainTask *top_task = &start_task; + TypeChainTask *free_task = 0; + TypeChainTask *last_t = 0; + for(TypeChainTask *t = top_task; t != 0; (last_t = t, t = t->next)) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + // rjf: recycle old tasks + if(last_t != 0) + { + SLLStackPush(free_task, last_t); + } + + // rjf: unpack task + U64 hash = t->hash; + + // rjf: hash -> unique type tag node + D2R2_UniqueTagNode *type_tag_node = 0; + { + U64 slot_idx = hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + type_tag_node = n; + break; + } + } + } + + // rjf: unpack type tag node + U64 info_off = 0; + U64 unit_idx = 0; + if(type_tag_node != 0) + { + info_off = type_tag_node->info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + unit_idx = unit_num > 0 ? unit_num-1 : 0; + } + + // rjf: record this type in the dependency chain count + if(type_tag_node != 0) + { + type_dep_chains_counts[root_type_idx] += 1; + } + + // rjf: unpack unit + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + + // rjf: parse this type's tag + U64 read_off = info_off; + DW2_Tag tag = {0}; + read_off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, read_off, &tag); + + // rjf: find direct types from this type tag + typedef struct DirectTypeNode DirectTypeNode; + struct DirectTypeNode + { + DirectTypeNode *next; + U64 info_off; + U64 unit_idx; + }; + DirectTypeNode *first_direct_type = 0; + DirectTypeNode *last_direct_type = 0; + switch(tag.kind) + { + default:{}break; + case DW_TagKind_PointerType: + case DW_TagKind_ReferenceType: + case DW_TagKind_RValueReferenceType: + case DW_TagKind_RestrictType: + case DW_TagKind_VolatileType: + case DW_TagKind_ConstType: + case DW_TagKind_ArrayType: + case DW_TagKind_Typedef: + case DW_TagKind_SubProgram: + case DW_TagKind_SubroutineType: + case DW_TagKind_EnumerationType: + { + // rjf: gather direct type + { + DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); + U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + U64 direct_type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + direct_type_unit_idx = new_unit_num-1; + } + } + DirectTypeNode *n = push_array(scratch2.arena, DirectTypeNode, 1); + n->info_off = direct_type_info_off; + n->unit_idx = direct_type_unit_idx; + SLLQueuePush(first_direct_type, last_direct_type, n); + } + + // rjf: functions -> gather parameters + if(tag.has_children && (tag.kind == DW_TagKind_SubProgram || tag.kind == DW_TagKind_SubroutineType)) + { + S64 depth = 1; + for(;depth > 0 && contains_1u64(unit_info_tag_range, read_off);) + { + U64 start_read_off = read_off; + + // rjf: read child tag + DW2_Tag child_tag = {0}; + read_off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, read_off, &child_tag); + + // rjf: formal parameters -> gather direct types + if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) + { + DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); + U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + U64 direct_type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + direct_type_unit_idx = new_unit_num-1; + } + } + DirectTypeNode *n = push_array(scratch2.arena, DirectTypeNode, 1); + n->info_off = direct_type_info_off; + n->unit_idx = direct_type_unit_idx; + SLLQueuePush(first_direct_type, last_direct_type, n); + } + + // rjf: tree navigations + if(child_tag.has_children) + { + depth += 1; + } + if(child_tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + + if(read_off == start_read_off) + { + break; + } + } + } + }break; + } + + // rjf: for each dependency type, look up their hash, + spawn new tasks for them + for EachNode(n, DirectTypeNode, first_direct_type) + { + U64 direct_type_info_off = n->info_off; + U64 direct_type_unit_idx = n->unit_idx; + + // rjf: direct type info offset -> hash + U64 direct_type_hash = 0; + { + U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); + U64 off_slot_idx = off_hash%unit_deduped_tag_maps[direct_type_unit_idx].slots_count; + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == direct_type_info_off) + { + direct_type_hash = n->dst_hash; + break; + } + } + } + + // rjf: spawn task + if(direct_type_hash != 0) + { + TypeChainTask *new_task = free_task; + if(new_task != 0) + { + SLLStackPop(free_task); + } + else + { + new_task = push_array(scratch.arena, TypeChainTask, 1); + } + new_task->next = t->next; + new_task->hash = direct_type_hash; + t->next = new_task; + } + } + + scratch_end(scratch2); + } + } + lane_sync(); } - return cmp; -} - -force_inline -LFHT_IS_KEY_EQUAL_FUNC(d2r_src_file_lookup_is_equal) -{ - return d2r_src_file_lookup_compar(a, b) == 0; -} - -force_inline int -d2r_src_file_lfht_key_value_is_before(void *raw_a, void *raw_b) -{ - return d2r_src_file_lookup_compar(*(D2R_SrcFileLookup **)raw_a, *(D2R_SrcFileLookup **)raw_b) < 0; -} - -internal U64 -d2r_hash_line_file(String8 dir_path, DW_LineFile *file) -{ - XXH3_state_t hasher = {0}; - XXH3_64bits_reset(&hasher); - XXH3_64bits_update(&hasher, dir_path.str, dir_path.size); - XXH3_64bits_update(&hasher, file->path.str, file->path.size); - XXH3_64bits_update(&hasher, &file->time_stamp, sizeof(file->time_stamp)); - XXH3_64bits_update(&hasher, &file->md5, sizeof(file->md5)); - XXH64_hash_t hash = XXH3_64bits_digest(&hasher); - return hash; -} - -internal void -d2r_sort_ptrs(void **ptrs, U64 count, int (* is_before)(void *a, void *b)) -{ - radsort(ptrs, count, is_before); -} - -internal D2R_CompUnitContribMap -d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Raw *input, U64 image_base) -{ - Temp scratch = scratch_begin(&arena, 1); - Temp temp = temp_begin(arena); - B32 parse_failed = 1; - Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_ARanges].data); - - D2R_CompUnitContribMap cm = {0}; - cm.info_off_arr = push_array(temp.arena, U64, unit_range_list.count); - cm.voff_range_arr = push_array(temp.arena, RDIM_Rng1U64ChunkList, unit_range_list.count); - - for EachNode(range_n, Rng1U64Node, unit_range_list.first) { - String8 unit_data = str8_substr(input->sec[DW_Section_ARanges].data, range_n->v); - U64 unit_cursor = 0; - - U32 first_four_bytes = 0; - if (str8_deserial_read_struct(input->sec[DW_Section_Info].data, 0, &first_four_bytes) != sizeof(first_four_bytes)) { goto exit; } - DW_Format unit_format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit; - - U64 unit_length; - TryRead(str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length), unit_cursor, exit); - - DW_Version version; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &version), unit_cursor, exit); - - if (version != DW_Version_2) { - log_infof("unknown .debug_aranges version %u @ 0x%llx", version, range_n->v.min); - continue; + //////////////////////////// + //- rjf: build all types - build types w/ 1 dependency (leaves) first, then 2, 3, etc., + // to ensure dependencies always travel backwards + // + // NOTE: * DWARF vs RDI Array Type Graph * + // + // For example lets take following decl: + // + // int (*foo[2])[3]; + // + // This compiles to in DWARF: + // + // foo -> DW_TAG_ArrayType -> (A0) DW_TAG_Subrange [2] + // \ + // -> (B0) DW_TAG_PointerType -> (A1) DW_TAG_ArrayType -> DW_TAG_Subrange [3] + // \ + // -> (B1) DW_TAG_BaseType (int) + // + // RDI expects: + // + // foo -> Array[2] -> Pointer -> Array[3] -> int + // + // Note that DWARF forks the graph on DW_TAG_ArrayType to describe array ranges in branch A and + // in branch B describes array type which might be a struct, pointer, base type, or any other type tag. + // However, in RDI we have a simple list of type nodes and to convert we need to append type nodes from + // B to A. + // + RDIM_TypeChunkList *all_types = 0; + RDIM_Type **type_from_idx_map = 0; + ProfScope("build all types") + { + if(lane_idx() == 0) + { + all_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); + type_from_idx_map = push_array(scratch.arena, RDIM_Type *, type_count); + rdim_type_chunk_list_concat_in_place(all_types, builtin_types); } - - U64 cu_info_off; - TryRead(str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &cu_info_off), unit_cursor, exit); - - U8 address_size = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &address_size), unit_cursor, exit); - - U8 segment_selector_size = 0; - TryRead(str8_deserial_read_struct(unit_data, unit_cursor, &segment_selector_size), unit_cursor, exit); - - U64 tuple_size = address_size * 2 + segment_selector_size; - U64 bytes_too_far_past_boundary = unit_cursor % tuple_size; - if (bytes_too_far_past_boundary > 0) { - unit_cursor += tuple_size - bytes_too_far_past_boundary; - } - - RDIM_Rng1U64ChunkList voff_ranges = {0}; - if (segment_selector_size == 0) { - while (unit_cursor + address_size * 2 <= unit_data.size) { - U64 address = 0; - U64 length = 0; - TryRead(str8_deserial_read(unit_data, unit_cursor, &address, address_size, address_size), unit_cursor, exit); - TryRead(str8_deserial_read(unit_data, unit_cursor, &length, address_size, address_size), unit_cursor, exit); - - if (address == 0 && length == 0) { break; } - if (address == 0) { continue; } - - if (address < image_base) { - log_infof("invalid address 0x%llx in .debug_aranges+%llx", range_n->v.min + unit_cursor); + lane_sync_u64(&all_types, 0); + lane_sync_u64(&type_from_idx_map, 0); + Rng1U64 range = lane_range(type_count); + U64 max_chain_count = 1; + for(;max_chain_count < max_U64;) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + ProfBegin("types build (chain count <= %I64u)", max_chain_count); + + //- rjf: gather all types in this lane that fit the dependency restriction; + // find this lane's next dependency restriction + U64 next_max_chain_count = max_U64; + RDIM_TypeChunkList lane_types = {0}; + U64 lane_types_chunk_count = 256; + for EachInRange(type_idx, range) + { + // rjf: if this type has a higher chain count than the current, + // but it is lower than our next maximum chain count, collect it, + // so we will hit + // + // if this type has a lower chain count than the current, + // we should've already built it from a previous pass. + // + if(type_dep_chains_counts[type_idx] > max_chain_count) + { + next_max_chain_count = Min(type_dep_chains_counts[type_idx], next_max_chain_count); continue; } + else if(type_dep_chains_counts[type_idx] < max_chain_count) + { + continue; + } + Temp temp = temp_begin(scratch2.arena); - U64 min = address - image_base; - U64 max = min + length; - rdim_rng1u64_chunk_list_push(temp.arena, &voff_ranges, 256, (RDIM_Rng1U64){.min = min, .max = max}); - } - } else { - NotImplemented; - } - - U64 map_idx = cm.count++; - cm.info_off_arr[map_idx] = cu_info_off; - cm.voff_range_arr[map_idx] = voff_ranges; - } - - parse_failed = 0; - exit:; - if (parse_failed) { - MemoryZeroStruct(&cm); - temp_end(temp); - } - scratch_end(scratch); - return cm; -} - -internal RDIM_Rng1U64ChunkList -d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off) -{ - RDIM_Rng1U64ChunkList voff_ranges = {0}; - U64 voff_list_idx = u64_array_bsearch(map.info_off_arr, map.count, info_off); - if (voff_list_idx < map.count) { - voff_ranges = map.voff_range_arr[voff_list_idx]; - } - return voff_ranges; -} - -internal RDIM_BakeParams -d2r_convert(Arena *arena, D2R_ConvertParams *params) -{ - Temp scratch = scratch_begin(&arena, 1); - - if (lane_idx() == 0) { - //////////////////////////////// - - Arch arch = Arch_Null; - U64 image_base = 0; - DW_Raw input = {0}; - PathStyle path_style = PathStyle_Null; - - switch (params->exe_kind) { - case ExecutableImageKind_Null: {} break; - case ExecutableImageKind_CoffPe: { - PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data); - String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range); - COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count); - String8 string_table = str8_substr(params->exe_data, pe.string_table_range); + // rjf: idx -> type tag node + D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + U64 info_off = type_tag_node->info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; - arch = pe.arch; - image_base = pe.image_base; - input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table); - path_style = PathStyle_WindowsAbsolute; + // rjf: unpack unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - g_d2r_shared.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table); - } break; - case ExecutableImageKind_Elf32: - case ExecutableImageKind_Elf64: { - ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data); + // rjf: parse root-level tag + DW2_Tag tag = {0}; + U64 tag_info_size = dw2_read_tag(temp.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, info_off, &tag); - arch = arch_from_elf_machine(bin.hdr.e_machine); - image_base = elf_base_addr_from_bin(&bin); - input = dw_raw_from_elf_bin(scratch.arena, params->dbg_data, &bin); - path_style = PathStyle_UnixAbsolute; + // rjf: extract common attributes + DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *direct_type_attrib = &dw2_attrib_nil; + DW2_Attrib *bitsize_attrib = &dw2_attrib_nil; + DW2_Attrib *bytesize_attrib = &dw2_attrib_nil; + DW2_Attrib *encoding_attrib = &dw2_attrib_nil; + DW2_Attrib *decl_attrib = &dw2_attrib_nil; + DW2_Attrib *prototyped_attrib = &dw2_attrib_nil; + // + // TODO(rjf): if a DW_AttribKing_GNU_Vector is found on an DW_TagKind_ArrayType, + // then: @native_vector_support extract byte size from the base type tag + // and convert to U256, U512, S256 and S512 + // + for EachNode(n, DW2_AttribNode, tag.attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(dst_name, src_name) case DW_AttribKind_##src_name:{dst_name##_attrib = &n->v;}break + Case(name, Name); + Case(direct_type, Type); + Case(bitsize, BitSize); + Case(bytesize, ByteSize); + Case(encoding, Encoding); + Case(decl, Declaration); +#undef Case + } + } - g_d2r_shared.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, params->dbg_data, &bin, &bin.shdrs); - } break; - default: { InvalidPath; } break; - } - - //////////////////////////////// - - ProfBegin("compute exe hash"); - U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); - ProfEnd(); - - g_d2r_shared.top_level_info = rdim_make_top_level_info(params->exe_name, arch, exe_hash, g_d2r_shared.binary_sections); - - //////////////////////////////// - - ProfBegin("Parse Unit Contrib Map"); - D2R_CompUnitContribMap cu_contrib_map = {0}; - if (input.sec[DW_Section_ARanges].data.size) { - cu_contrib_map = d2r_cu_contrib_map_from_aranges(arena, &input, image_base); - } - ProfEnd(); - - ProfBegin("Parse Comop Unit Ranges"); - DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, &input); - Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input.sec[DW_Section_Info].data); - Rng1U64Array cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list); - ProfEnd(); - - //////////////////////////////// - - ProfBegin("Parse Compile Unit Headers"); - DW_CompUnit *cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) { - cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, params->is_parse_relaxed); - } - ProfEnd(); - - //////////////////////////////// - - RDIM_LineTable **cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count); - ProfScope("Convert Line Tables [Count: %llu]", cu_ranges.count) - { - Temp temp = temp_begin(scratch.arena); - - // TODO: per thread task - ProfBegin("Up front parse line VM headers"); - DW_LineVM **line_vms = push_array(temp.arena, DW_LineVM *, cu_ranges.count); - for EachIndex(cu_idx, cu_ranges.count) { - line_vms[cu_idx] = dw_line_vm_init(&input, &cu_arr[cu_idx]); - } - ProfEnd(); - - // TODO: sync - // - // sum all source files (including duplicates) - U64 total_file_count = 0; - for EachIndex(cu_idx, cu_ranges.count) { total_file_count += line_vms[cu_idx]->header.file_table.count; } - - // TODO: sync - ProfBegin("Dedup source files [Count: %llu]", total_file_count); - LFHT_NodeChunkList *src_file_lfht_nodes = push_array(temp.arena, LFHT_NodeChunkList, lane_count()); - LFHT_Node *src_file_lfht = 0; - - // TODO: per thread - { - D2R_SrcFileLookup *lookup = 0; - for EachIndex(cu_idx, cu_ranges.count) { - DW_LineVM *vm = line_vms[cu_idx]; - for EachIndex(file_idx, vm->header.file_table.count) { - DW_LineFile *file = &vm->header.file_table.v[file_idx]; - - if (lookup == 0) { lookup = push_array(temp.arena, D2R_SrcFileLookup, 1); } - lookup->vm = vm; - lookup->file = file; - - LFHT_NodeChunkList *node_chunks = &src_file_lfht_nodes[lane_idx()]; - U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); - B32 was_inserted = lfht_insert(temp.arena, node_chunks, &src_file_lfht, hash, lookup, d2r_src_file_lookup_is_equal, 0); - if (was_inserted) { - lookup = 0; + // rjf: unpack common attributes + String8 name = name_attrib->val.string; + DW_ATE encoding = encoding_attrib->val.u128.u64[0]; + RDIM_Type *direct_type = d2r2_type_from_builtin_kind(RDI_TypeKind_Void); + U64 bitsize = 0; + B32 is_decl = (decl_attrib != &dw2_attrib_nil); + { + // rjf: unpack direct type + if(direct_type_attrib != &dw2_attrib_nil) + { + U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); + U64 direct_type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); + direct_type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } + D2R2_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[direct_type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); + U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; + U64 direct_type_hash = 0; + for(D2R2_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == direct_type_info_off) + { + direct_type_hash = n->dst_hash; + break; + } + } + U64 unique_type_tag_slot_idx = direct_type_hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == direct_type_hash) + { + direct_type = type_from_idx_map[n->order_idx]; + break; + } } } - } - } - ProfEnd(); - - // TODO: sync - ProfBegin("Extract source file lookups"); - U64 unique_file_count = lfht_total_count_from_node_chunk_lists(lane_count(), src_file_lfht_nodes); - void **lookups = lfht_data_from_node_chunk_lists(temp.arena, unique_file_count, lane_count(), src_file_lfht_nodes); - ProfEnd(); - - // TODO: sync - ProfBegin("Sort unique source files [Count: %llu]", unique_file_count); - d2r_sort_ptrs(lookups, unique_file_count, d2r_src_file_lfht_key_value_is_before); - ProfEnd(); - - // TODO: per thread task - ProfBegin("Convert source files"); - for EachIndex(i, unique_file_count) { - D2R_SrcFileLookup *lookup = lookups[i]; - - DW_LineFile *src = lookup->file; - RDIM_SrcFile *dst = rdim_src_file_chunk_list_push(arena, &g_d2r_shared.src_files, D2R_SRC_FILE_CAP); - - // make file path - String8 path; - { - Temp temp = temp_begin(scratch.arena); - String8 comp_dir = lookup->vm->header.dir_table.v[0]; - - PathStyle comp_path_style = path_style_from_str8(comp_dir); - PathStyle dir_path_style = path_style_from_str8(lookup->vm->header.dir_table.v[src->dir_idx]); - PathStyle file_path_style = path_style_from_str8(src->path); - - String8List dir_path_list = str8_split_path(temp.arena, lookup->vm->header.dir_table.v[src->dir_idx]); - String8List file_path_list = str8_split_path(temp.arena, src->path); - - String8List path_list = {0}; - if (dir_path_style == PathStyle_Relative) { - String8List comp_dir_list = str8_split_path(temp.arena, comp_dir); - str8_list_concat_in_place(&path_list, &comp_dir_list); + // rjf: unpack bit/byte sizes + if(bitsize_attrib != &dw2_attrib_nil) + { + bitsize = bitsize_attrib->val.u128.u64[0]; + } + else if(bytesize_attrib != &dw2_attrib_nil) + { + bitsize = bytesize_attrib->val.u128.u64[0]*8; } - str8_list_concat_in_place(&path_list, &dir_path_list); - str8_list_concat_in_place(&path_list, &file_path_list); - - PathStyle path_style = PathStyle_SystemAbsolute; - if (dir_path_style != PathStyle_Relative) { path_style = dir_path_style; } - else if (file_path_style != PathStyle_Relative) { path_style = file_path_style; } - else if (comp_path_style != PathStyle_Relative) { path_style = comp_path_style; } - - str8_path_list_resolve_dots_in_place(&path_list, path_style); - path = str8_path_list_join_by_style(arena, &path_list, path_style); - - temp_end(temp); } - // fill out source file - dst->path = path; - if ( ! u128_match(src->md5, u128_zero())) { - dst->checksum_kind = RDI_ChecksumKind_MD5; - dst->checksum = str8_copy(arena, str8_struct(&src->md5)); - } else if (src->time_stamp != 0) { - dst->checksum_kind = RDI_ChecksumKind_Timestamp; - dst->checksum = str8_copy(arena, str8_struct(&src->time_stamp)); - } - - lookup->src_file = dst; - } - ProfEnd(); - - // TODO: sync - RDIM_LineTableChunkList *lane_line_table_chunks = push_array(temp.arena, RDIM_LineTableChunkList, lane_count()); - - // TODO: per thread task - ProfBegin("Convert line sequences"); - U64 *line_seq_counts_per_lane = push_array(scratch.arena, U64, lane_count()); - for EachIndex(cu_idx, cu_ranges.count) { - RDIM_LineTableChunkList *lane_line_table_chunk_list = &lane_line_table_chunks[lane_idx()]; - - // push new line table for the compile unit - RDIM_LineTable *line_table = rdim_line_table_chunk_list_push(arena, lane_line_table_chunk_list, D2R_LINE_TABLE_CAP); - cu_line_tables_rdi[cu_idx] = line_table; - - // push line buffer -#define D2R_LineBufferMax 1024 - struct LineBuffer { U64 file_index; U64 voffs[D2R_LineBufferMax]; U32 line_nums[D2R_LineBufferMax]; U32 col_nums[D2R_LineBufferMax]; } LineBuffer; - struct LineBuffer *line_buffer = push_array(temp.arena, struct LineBuffer, 1); - U64 line_buffer_size = 0; - - // decode line sequences - DW_LineVM *vm = line_vms[cu_idx]; - U64 *line_seq_counts_per_file = push_array(temp.arena, U64, vm->header.file_table.count); - while (dw_line_vm_step(vm)) { - if (vm->new_line) { - // lazy defined files are not supported - if (vm->state.file_index >= vm->header.file_table.count) { continue; } + // rjf: convert type + RDIM_Type *dst_type = 0; + RDI_TypeKind rdi_type_kind = RDI_TypeKind_NULL; + RDI_TypeModifierFlags rdi_type_modifier_flags = 0; + switch(tag.kind) + { + default:{}break; + case DW_TagKind_ClassType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_Class; goto struct_type; + case DW_TagKind_StructureType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteStruct : RDI_TypeKind_Struct; goto struct_type; + case DW_TagKind_UnionType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteUnion : RDI_TypeKind_Union; goto struct_type; + struct_type:; + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = rdi_type_kind; + dst_type->name = name; + dst_type->byte_size = bitsize/8; + }break; + case DW_TagKind_EnumerationType: + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = is_decl ? RDI_TypeKind_IncompleteEnum : RDI_TypeKind_Enum; + dst_type->name = name; + dst_type->direct_type = direct_type; + dst_type->byte_size = (direct_type != 0 ? direct_type->byte_size : bitsize/8); + }break; + case DW_TagKind_SubProgram: + case DW_TagKind_SubroutineType: + { + // rjf: build type + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = RDI_TypeKind_Function; + dst_type->direct_type = direct_type; + dst_type->byte_size = arch_addr_size; - // time to flush the buffer? - if (((vm->opcode == DW_StdOpcode_ExtendedOpcode && vm->ext_opcode == DW_ExtOpcode_EndSequence) || - (line_buffer_size >= D2R_LineBufferMax || line_buffer->file_index != vm->state.file_index)) - && line_buffer_size > 0) { - // lookup source file - DW_LineFile *file = &vm->header.file_table.v[line_buffer->file_index]; - U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); - D2R_SrcFileLookup *lookup = lfht_search(src_file_lfht, hash, &(D2R_SrcFileLookup){ .file = file, .vm = vm }, d2r_src_file_lookup_is_equal, 0); - RDIM_SrcFile *src_file = lookup->src_file; - - // copy line info - U64 *voffs = push_array_no_zero(arena, U64, line_buffer_size + 1); - U32 *line_nums = push_array_no_zero(arena, U32, line_buffer_size); - voffs[line_buffer_size] = vm->state.address - image_base; - MemoryCopyTyped(voffs, line_buffer->voffs, line_buffer_size); - MemoryCopyTyped(line_nums, line_buffer->line_nums, line_buffer_size); - - RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, lane_line_table_chunk_list, line_table, src_file, voffs, line_nums, 0, line_buffer_size); - - // atomic implementation of @rdim_src_file_push_line_sequence + // rjf: gather all parameter types + typedef struct ParamNode ParamNode; + struct ParamNode + { + ParamNode *next; + U64 type_unit_idx; + U64 type_info_off; + }; + ParamNode *first_param = 0; + ParamNode *last_param = 0; + U64 param_count = 0; + if(tag.has_children) + { + U64 tag_children_off = info_off + tag_info_size; + S64 depth = 1; + for(U64 off = tag_children_off; depth > 0 && contains_1u64(unit_info_tag_range, off);) { - // associate line fragment with source file - RDIM_SrcFileLineMapFragment *line_frag = push_array(arena, RDIM_SrcFileLineMapFragment, 1); - line_frag->seq = line_seq; + Temp scratch3 = scratch_begin(&scratch2.arena, 1); + U64 start_off = off; - // insert line fragment node - for (;;) { - RDIM_SrcFileLineMapFragment *next = src_file->first_line_map_fragment; - line_frag->next = next; - RDIM_SrcFileLineMapFragment *curr = ins_atomic_ptr_eval_cond_assign(&src_file->first_line_map_fragment, line_frag, next); - if (curr == 0) { - ins_atomic_u64_add_eval(&g_d2r_shared.src_files.source_line_map_count, 1); + // rjf: read child tag + DW2_Tag child_tag = {0}; + off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &child_tag); + + // rjf: gather parameters + if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) + { + DW2_Attrib *type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); + ParamNode *n = push_array(scratch2.arena, ParamNode, 1); + SLLQueuePush(first_param, last_param, n); + n->type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + n->type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, n->type_info_off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, n->type_info_off); + n->type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); } - if (curr == next) { break; } + param_count += 1; } - // accumulate line sequence counts per file - line_seq_counts_per_file[vm->state.file_index] += line_seq->line_count; + // rjf: navigate tree + if(child_tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + if(child_tag.has_children) + { + depth += 1; + } - // accumulate line sequence counts per lane - line_seq_counts_per_lane[lane_idx()] += line_seq->line_count; + scratch_end(scratch3); + if(off == start_off) + { + break; + } } - - // reset line buffer size tracker - line_buffer_size = 0; } - if (line_buffer_size > 0 && line_buffer->voffs[line_buffer_size - 1] == vm->state.address) { - line_buffer->line_nums[line_buffer_size - 1] = Min(line_buffer->line_nums[line_buffer_size - 1], safe_cast_u32(vm->state.line)); - } else { - // append line to the buffer - line_buffer->file_index = vm->state.file_index; - line_buffer->voffs[line_buffer_size] = vm->state.address - image_base; - line_buffer->line_nums[line_buffer_size] = safe_cast_u32(vm->state.line); - line_buffer_size += 1; + // rjf: tighten parameter types + dst_type->count = (RDI_U32)param_count; // TODO(rjf): @u64_to_u32 + dst_type->param_types = push_array(arena, RDIM_Type *, dst_type->count); + { + U64 param_idx = 0; + for(ParamNode *n = first_param; n != 0; n = n->next, param_idx += 1) + { + U64 param_type_info_off = n->type_info_off; + U64 param_type_unit_idx = n->type_unit_idx; + + // rjf: map info_off/unit_idx -> hash + U64 param_type_hash = 0; + { + D2R2_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[param_type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(¶m_type_info_off)); + U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; + for(D2R2_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == param_type_info_off) + { + param_type_hash = n->dst_hash; + break; + } + } + } + + // rjf: map hash -> type + RDIM_Type *param_type = 0; + { + U64 unique_type_tag_slot_idx = param_type_hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == param_type_hash) + { + param_type = type_from_idx_map[n->order_idx]; + break; + } + } + } + + // rjf: store + dst_type->param_types[param_idx] = param_type; + } + } + }break; + case DW_TagKind_Typedef: + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = RDI_TypeKind_Alias; + dst_type->name = name; + dst_type->direct_type = direct_type; + dst_type->byte_size = (direct_type ? direct_type->byte_size : 0); + }break; + case DW_TagKind_BaseType: + { + if(0){} +#define CaseA(rdi_type_kind_, encoding_) else if(encoding == (encoding_)) { rdi_type_kind = (rdi_type_kind_); } +#define CaseB(rdi_type_kind_, encoding_, bit_size_) else if(encoding == (encoding_) && bitsize == (bit_size_)) { rdi_type_kind = (rdi_type_kind_); } +#define CaseC(rdi_type_kind_, encoding_, name_) /* assumes x64/arm64 */ else if(encoding == (encoding_) && str8_match(name, str8_lit(name_), 0)) { rdi_type_kind = (rdi_type_kind_); } +#define CaseD(rdi_type_kind_, encoding_, name_, bit_size_) else if(encoding == (encoding_) && bitsize == (bit_size_) && str8_match(name, str8_lit(name_), 0)) { rdi_type_kind = (rdi_type_kind_); } + CaseA(RDI_TypeKind_NULL, DW_ATE_Null) + CaseA(RDI_TypeKind_Void, DW_ATE_Address) + CaseA(RDI_TypeKind_Bool, DW_ATE_Boolean) + CaseB(RDI_TypeKind_ComplexF32, DW_ATE_ComplexFloat, 64) + CaseB(RDI_TypeKind_ComplexF64, DW_ATE_ComplexFloat, 128) + CaseB(RDI_TypeKind_ComplexF80, DW_ATE_ComplexFloat, 160) + CaseB(RDI_TypeKind_ComplexF128, DW_ATE_ComplexFloat, 256) + CaseC(RDI_TypeKind_F80, DW_ATE_Float, "__float80") + CaseC(RDI_TypeKind_F128, DW_ATE_Float, "__float128") + CaseC(RDI_TypeKind_F16, DW_ATE_Float, "_Float16") + CaseC(RDI_TypeKind_BF16, DW_ATE_Float, "__bf16") + CaseB(RDI_TypeKind_F16, DW_ATE_Float, 16) + CaseB(RDI_TypeKind_F32, DW_ATE_Float, 32) + CaseB(RDI_TypeKind_F48, DW_ATE_Float, 48) + CaseB(RDI_TypeKind_F64, DW_ATE_Float, 64) + CaseB(RDI_TypeKind_F80, DW_ATE_Float, 80) + CaseB(RDI_TypeKind_F96, DW_ATE_Float, 96) + CaseB(RDI_TypeKind_F128, DW_ATE_Float, 128) + CaseB(RDI_TypeKind_Char8, DW_ATE_SignedChar, 8) + CaseB(RDI_TypeKind_Char16, DW_ATE_SignedChar, 16) + CaseB(RDI_TypeKind_Char32, DW_ATE_SignedChar, 32) + CaseD(RDI_TypeKind_Char8, DW_ATE_Signed, "wchar_t", 8) + CaseD(RDI_TypeKind_Char16, DW_ATE_Signed, "wchar_t", 16) + CaseD(RDI_TypeKind_Char32, DW_ATE_Signed, "wchar_t", 32) + CaseB(RDI_TypeKind_S8, DW_ATE_Signed, 8) + CaseB(RDI_TypeKind_S16, DW_ATE_Signed, 16) + CaseB(RDI_TypeKind_S32, DW_ATE_Signed, 32) + CaseB(RDI_TypeKind_S64, DW_ATE_Signed, 64) + CaseB(RDI_TypeKind_S128, DW_ATE_Signed, 128) + CaseB(RDI_TypeKind_S256, DW_ATE_Signed, 256) + CaseB(RDI_TypeKind_S512, DW_ATE_Signed, 512) + CaseB(RDI_TypeKind_U8, DW_ATE_Unsigned, 8) + CaseB(RDI_TypeKind_U16, DW_ATE_Unsigned, 16) + CaseB(RDI_TypeKind_U32, DW_ATE_Unsigned, 32) + CaseB(RDI_TypeKind_U64, DW_ATE_Unsigned, 64) + CaseB(RDI_TypeKind_U128, DW_ATE_Unsigned, 128) + CaseB(RDI_TypeKind_U256, DW_ATE_Unsigned, 256) + CaseB(RDI_TypeKind_U512, DW_ATE_Unsigned, 512) + CaseB(RDI_TypeKind_UChar8, DW_ATE_UnsignedChar, 8) + CaseB(RDI_TypeKind_UChar8, DW_ATE_Utf, 8) + CaseB(RDI_TypeKind_UChar16, DW_ATE_UnsignedChar, 16) + CaseB(RDI_TypeKind_UChar16, DW_ATE_Utf, 16) + CaseB(RDI_TypeKind_UChar32, DW_ATE_UnsignedChar, 32) + CaseB(RDI_TypeKind_UChar32, DW_ATE_Utf, 32) + CaseB(RDI_TypeKind_Decimal32, DW_ATE_DecimalFloat, 32) + CaseB(RDI_TypeKind_Decimal64, DW_ATE_DecimalFloat, 64) + CaseB(RDI_TypeKind_Decimal128, DW_ATE_DecimalFloat, 128) +#undef CaseA +#undef CaseB +#undef CaseC +#undef CaseD + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = RDI_TypeKind_Alias; + dst_type->name = name; + dst_type->direct_type = d2r2_type_from_builtin_kind(rdi_type_kind); + dst_type->byte_size = bitsize/8; // TODO: byte size on __float80 alias mismatches byte size on direct type now + }break; + case DW_TagKind_PointerType: rdi_type_kind = RDI_TypeKind_Ptr; goto ptr_or_ref_type; + case DW_TagKind_ReferenceType: rdi_type_kind = RDI_TypeKind_LRef; goto ptr_or_ref_type; + case DW_TagKind_RValueReferenceType: rdi_type_kind = RDI_TypeKind_RRef; goto ptr_or_ref_type; + ptr_or_ref_type:; + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = rdi_type_kind; + dst_type->direct_type = direct_type; + dst_type->byte_size = arch_addr_size; + }break; + case DW_TagKind_RestrictType: + { + rdi_type_modifier_flags = RDI_TypeModifierFlag_Restrict; + }goto basic_type_operators; + case DW_TagKind_VolatileType: + { + rdi_type_modifier_flags = RDI_TypeModifierFlag_Volatile; + }goto basic_type_operators; + case DW_TagKind_ConstType: + { + rdi_type_modifier_flags = RDI_TypeModifierFlag_Const; + }goto basic_type_operators; + basic_type_operators:; + { + dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = rdi_type_modifier_flags; + dst_type->direct_type = direct_type; + dst_type->byte_size = (direct_type ? direct_type->byte_size : 0); + }break; + case DW_TagKind_ArrayType: + if(tag.has_children) + { + // rjf: parse array type children; extract dimensions (each one gets a SubrangeType) + typedef struct ArrayDimensionNode ArrayDimensionNode; + struct ArrayDimensionNode + { + ArrayDimensionNode *next; + U64 count; + }; + ArrayDimensionNode *top_dimension = 0; + { + U64 tag_children_off = info_off + tag_info_size; + S64 depth = 1; + for(U64 off = tag_children_off; contains_1u64(unit_info_tag_range, off) && depth > 0;) + { + U64 start_off = off; + DW2_Tag child_tag = {0}; + off += dw2_read_tag(temp.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &child_tag); + if(child_tag.kind == DW_TagKind_SubrangeType) + { + // rjf: extract bounds attribs + DW2_Attrib *lower_bound_attrib = &dw2_attrib_nil; + DW2_Attrib *upper_bound_attrib = &dw2_attrib_nil; + DW2_Attrib *count_attrib = &dw2_attrib_nil; + for(DW2_AttribNode *n = child_tag.attribs.first; + n != 0 && (lower_bound_attrib == &dw2_attrib_nil || (upper_bound_attrib == &dw2_attrib_nil && count_attrib == &dw2_attrib_nil)); + n = n->next) + { + if(n->v.attrib_kind == DW_AttribKind_LowerBound) + { + lower_bound_attrib = &n->v; + } + else if(n->v.attrib_kind == DW_AttribKind_UpperBound) + { + upper_bound_attrib = &n->v; + } + else if(n->v.attrib_kind == DW_AttribKind_Count) + { + count_attrib = &n->v; + } + } + + // rjf: resolve lower bound + U64 lower_bound = 0; + if(lower_bound_attrib != &dw2_attrib_nil) + { + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, lower_bound_attrib->val.kind) & DW_AttribClass_Reference) + { + log_infof("[.debug_info@0x%I64x] Array type lower bound is a variable; this is not currently supported.\n", start_off); + } + else + { + lower_bound = lower_bound_attrib->val.u128.u64[0]; + } + } + else switch(unit_parse_ctx->language) + { + default:{}break; +#define X(name, code, default_array_lower_bound) case DW_Language_##name:{lower_bound = (default_array_lower_bound);}break; + DW_Language_XList +#undef X + } + + // rjf: resolve upper bound + U64 upper_bound = 0; + { + if(count_attrib != &dw2_attrib_nil) + { + upper_bound = lower_bound + count_attrib->val.u128.u64[0]; + } + else if(upper_bound_attrib != &dw2_attrib_nil) + { + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, upper_bound_attrib->val.kind) & DW_AttribClass_Reference) + { + log_infof("[.debug_info@0x%I64x] Array type upper bound is a variable; this is not currently supported.\n", start_off); + } + else + { + upper_bound = upper_bound_attrib->val.u128.u64[0]; + upper_bound += 1; // NOTE(rjf): turn to exclusive range + } + } + } + + // rjf: push node + ArrayDimensionNode *dim_n = push_array(temp.arena, ArrayDimensionNode, 1); + SLLStackPush(top_dimension, dim_n); + dim_n->count = (upper_bound - lower_bound); + } + if(child_tag.has_children) + { + depth += 1; + } + else if(child_tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + if(off == start_off) + { + break; + } + } + } + + // rjf: create array type operators for each dimension + RDIM_Type *array_direct_type = direct_type; + for EachNode(dim_n, ArrayDimensionNode, top_dimension) + { + RDIM_Type *array_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); + array_type->kind = RDI_TypeKind_Array; + array_type->byte_size = array_direct_type ? array_direct_type->byte_size*dim_n->count : 0; + array_type->direct_type = array_direct_type; + array_direct_type = array_type; + } + + // rjf: final destination type -> the final array dimension type + dst_type = array_direct_type; + }break; + } + + // rjf: store type in type-from-idx table + type_from_idx_map[type_idx] = dst_type; + + temp_end(temp); + } + + //- rjf: combine all types from all lanes + RDIM_TypeChunkList *lanes_types = 0; + if(lane_idx() == 0) + { + lanes_types = push_array(scratch2.arena, RDIM_TypeChunkList, lane_count()); + } + lane_sync_u64(&lanes_types, 0); + lanes_types[lane_idx()] = lane_types; + lane_sync(); + if(lane_idx() == 0) + { + RDIM_TypeChunkList pass_lane_combined_types = {0}; + for EachIndex(l_idx, lane_count()) + { + rdim_type_chunk_list_concat_in_place(&pass_lane_combined_types, &lanes_types[l_idx]); + } + rdim_type_chunk_list_concat_in_place(all_types, &pass_lane_combined_types); + } + lane_sync(); + + //- rjf: find minimum next max chain count across all lanes, for next iteration + U64 *lane_next_max_chain_counts = 0; + if(lane_idx() == 0) + { + lane_next_max_chain_counts = push_array(scratch2.arena, U64, lane_count()); + } + lane_sync_u64(&lane_next_max_chain_counts, 0); + lane_next_max_chain_counts[lane_idx()] = next_max_chain_count; + lane_sync(); + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + next_max_chain_count = Min(next_max_chain_count, lane_next_max_chain_counts[l_idx]); + } + } + lane_sync_u64(&next_max_chain_count, 0); + + //- rjf: update max chain count + max_chain_count = next_max_chain_count; + + ProfEnd(); + scratch_end(scratch2); + } + } + lane_sync(); + + //////////////////////////// + //- rjf: convert all namespaces + // + RDIM_NamespaceChunkList *all_namespaces = 0; + RDIM_Namespace **namespace_from_idx_map = 0; + { + // rjf: set up + if(lane_idx() == 0) + { + all_namespaces = push_array(scratch.arena, RDIM_NamespaceChunkList, 1); + namespace_from_idx_map = push_array(scratch.arena, RDIM_Namespace *, namespace_count); + } + lane_sync_u64(&all_namespaces, 0); + lane_sync_u64(&namespace_from_idx_map, 0); + + // rjf: build all namespaces on this lane + RDIM_NamespaceChunkList lane_namespaces = {0}; + Rng1U64 range = lane_range(namespace_count); + for EachInRange(namespace_idx, range) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + // rjf: unpack tag node + D2R2_UniqueTagNode *tag_node = namespace_tag_nodes[namespace_idx]; + U64 info_off = tag_node->info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + + // rjf: read namespace tag + DW2_Tag tag = {0}; + dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, info_off, &tag); + DW2_Attrib *name_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Name); + String8 name = name_attrib->val.string; + + // rjf: build namespace + RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 64); + ns->name = name; + + // rjf: store in (deduped tag idx -> namespace) table + namespace_from_idx_map[tag_node->order_idx] = ns; + + scratch_end(scratch2); + } + lane_sync(); + + // rjf: join all namespaces + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + RDIM_NamespaceChunkList *lanes_namespaces = 0; + if(lane_idx() == 0) + { + lanes_namespaces = push_array(scratch2.arena, RDIM_NamespaceChunkList, lane_count()); + } + lane_sync_u64(&lanes_namespaces, 0); + lanes_namespaces[lane_idx()] = lane_namespaces; + lane_sync(); + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + rdim_namespace_chunk_list_concat_in_place(all_namespaces, &lanes_namespaces[l_idx]); + } + } + lane_sync(); + scratch_end(scratch2); + } + } + lane_sync(); + + //////////////////////////// + //- rjf: convert all UDTs + // + RDIM_UDTChunkList *all_udts = 0; + ProfScope("convert all UDTs") + { + //- rjf: produce UDTs across all lanes + U64 chunk_count = 512; + RDIM_UDTChunkList lane_udts = {0}; + Rng1U64 range = lane_range(type_count); + for EachInRange(type_idx, range) + { + RDIM_Type *type = type_from_idx_map[type_idx]; + if(type != 0 && + (type->kind == RDI_TypeKind_Struct || + type->kind == RDI_TypeKind_Union || + type->kind == RDI_TypeKind_Class || + type->kind == RDI_TypeKind_Enum || + type->kind == RDI_TypeKind_Alias)) + { + // rjf: produce UDT + RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &lane_udts, chunk_count); + type->udt = udt; + udt->self_type = type; + + // rjf: idx -> type tag node + D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + U64 info_off = type_tag_node->info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; + + // rjf: unpack unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + + // rjf: parse all tags + S64 depth = 0; + for(U64 off = info_off; contains_1u64(unit_info_tag_range, off) && (depth > 0 || off == info_off);) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; + + // rjf: parse tag + DW2_Tag tag = {0}; + U64 tag_parse_off = off; + off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + + // rjf: unpack tag attributes + DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *type_attrib = &dw2_attrib_nil; + DW2_Attrib *off_attrib = &dw2_attrib_nil; + DW2_Attrib *val_attrib = &dw2_attrib_nil; + DW2_Attrib *declfile_attrib = &dw2_attrib_nil; + DW2_Attrib *declline_attrib = &dw2_attrib_nil; + DW2_Attrib *declcol_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag.attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break + Case(name, Name); + Case(type, Type); + Case(off, DataMemberLocation); + Case(val, ConstValue); + Case(declfile, DeclFile); + Case(declline, DeclLine); + Case(declcol, DeclColumn); +#undef Case + } + } + + // rjf: unpack basic attributes + String8 name = name_attrib->val.string; + U64 off = off_attrib->val.u128.u64[0]; + U64 val = val_attrib->val.u128.u64[0]; + + // rjf: unpack type + RDIM_Type *type = 0; + if(type_attrib != &dw2_attrib_nil) + { + // rjf: attrib -> info off / unit idx + U64 type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + U64 type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, type_info_off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); + type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } + + // rjf: (info_off, unit_idx) -> hash + U64 type_hash = 0; + { + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == type_info_off) + { + type_hash = n->dst_hash; + break; + } + } + } + + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = type_hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == type_hash) + { + type = type_from_idx_map[n->order_idx]; + break; + } + } + } + } + + // rjf: root-level tag -> collect decl file/line info + if(tag_parse_off == start_off) + { + // TODO(rjf): we need to have gathered the source files before this!!!!!! + // currently, they only come from line info - we need to gather/dedup the + // ones that also come from tags. + } + + // rjf: gather children + switch(tag.kind) + { + default:{}break; + case DW_TagKind_Member: + { + RDIM_UDTMember *member = rdim_udt_push_member(arena, &lane_udts, udt); + member->kind = RDI_MemberKind_DataField; + member->name = name; + member->type = type; + member->off = (RDI_U32)off; // TODO(rjf): @u64_to_u32 + }break; + case DW_TagKind_Enumerator: + { + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, &lane_udts, udt); + enum_val->name = name; + enum_val->val = val; + }break; + } + + // rjf: tree nav + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + if(tag.has_children) + { + depth += 1; + } + + scratch_end(scratch2); + if(off == start_off) + { + break; + } + } + } + } + lane_sync(); + + //- rjf: combine all lanes + RDIM_UDTChunkList *lanes_udts = 0; + if(lane_idx() == 0) + { + lanes_udts = push_array(scratch.arena, RDIM_UDTChunkList, lane_count()); + } + lane_sync_u64(&lanes_udts, 0); + lanes_udts[lane_idx()] = lane_udts; + lane_sync(); + if(lane_idx() == 0) + { + all_udts = push_array(scratch.arena, RDIM_UDTChunkList, 1); + for EachIndex(l_idx, lane_count()) + { + rdim_udt_chunk_list_concat_in_place(all_udts, &lanes_udts[l_idx]); + } + } + lane_sync_u64(&all_udts, 0); + } + + //////////////////////////// + //- rjf: convert all units + // + RDIM_UnitChunkList *all_units = 0; + RDIM_Unit **unit_from_idx_map = 0; + ProfScope("convert all units") + { + if(lane_idx() == 0) + { + all_units = push_array(scratch.arena, RDIM_UnitChunkList, 1); + unit_from_idx_map = push_array(scratch.arena, RDIM_Unit *, unit_count); + for EachIndex(unit_idx, unit_count) + { + unit_from_idx_map[unit_idx] = rdim_unit_chunk_list_push(arena, all_units, unit_count); + } + } + lane_sync_u64(&all_units, 0); + lane_sync_u64(&unit_from_idx_map, 0); + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; + if(unit_idx >= unit_count) + { + break; + } + + //- rjf: unpack unit info + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + RDIM_Unit *dst_unit = unit_from_idx_map[unit_idx]; + + //- rjf: unpack unit's root tag + DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; + DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *comp_dir_attrib = &dw2_attrib_nil; + DW2_Attrib *producer_attrib = &dw2_attrib_nil; + DW2_Attrib *lang_attrib = &dw2_attrib_nil; + DW2_Attrib *ranges_attrib = &dw2_attrib_nil; + DW2_Attrib *lopc_attrib = &dw2_attrib_nil; + DW2_Attrib *hipc_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, unit_root_tag->attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break + Case(name, Name); + Case(comp_dir, CompDir); + Case(producer, Producer); + Case(lang, Language); + Case(ranges, Ranges); + Case(lopc, LowPc); + Case(hipc, HighPc); +#undef Case + } + } + + //- rjf: unpack attributes + String8 unit_name = name_attrib->val.string; + String8 unit_comp_dir = comp_dir_attrib->val.string; + String8 unit_producer = producer_attrib->val.string; + RDI_Language unit_lang = RDI_Language_NULL; + { + DW_Language dw_lang = lang_attrib->val.u128.u64[0]; + switch(dw_lang) + { + default:{}break; + case DW_Language_C89: + case DW_Language_C99: + case DW_Language_C11: + case DW_Language_C: + { + unit_lang = RDI_Language_C; + }break; + case DW_Language_CPlusPlus03: + case DW_Language_CPlusPlus11: + case DW_Language_CPlusPlus14: + case DW_Language_CPlusPlus: + { + unit_lang = RDI_Language_CPlusPlus; + }break; + } + } + + //- rjf: get unit's ranges from .debug_aranges parse artifacts, if we have them + RDIM_Rng1U64ChunkList unit_voff_ranges = {0}; + if(arange_unit_from_info_off_map_slots_count != 0) + { + U64 unit_info_off = unit_info_ranges->v[unit_idx].min; + U64 hash = u64_hash_from_str8(str8_struct(&unit_info_off)); + U64 slot_idx = hash%arange_unit_from_info_off_map_slots_count; + for(D2R2_ARangeUnitNode *n = arange_unit_from_info_off_map_slots[slot_idx]; n != 0; n = n->next) + { + if(n->info_off == unit_info_off) + { + unit_voff_ranges = n->ranges[0]; + break; + } + } + } + + //- rjf: if we have no voff ranges from .debug_aranges, then we need to extract + // this info from the unit root rag instead (via ranges & low-pc/high-pc tags) + if(unit_voff_ranges.total_count == 0) + { + // rjf: gather ranges from a ranges attribute + if(ranges_attrib != &dw2_attrib_nil) + { + Rng1U64List ranges = dw2_rnglist_from_form_val(scratch.arena, unit_parse_ctx, raw, ranges_attrib->val); + for EachNode(n, Rng1U64Node, ranges.first) + { + rdim_rng1u64_chunk_list_push(arena, &unit_voff_ranges, 256, (RDIM_Rng1U64){n->v.min - base_vaddr, n->v.max - base_vaddr}); + } + } + + // rjf: gather contiguous range from low-pc / high-pc attribute + if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) + { + U64 voff_base = lopc_attrib->val.addr - base_vaddr; + U64 voff_opl = 0; + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<val.u128.u64[0]; + } + else + { + voff_opl = hipc_attrib->val.addr; + } + rdim_rng1u64_chunk_list_push(arena, &unit_voff_ranges, 256, (RDIM_Rng1U64){voff_base, voff_opl}); + } + } + + //- rjf: fill top-level unit info + { + dst_unit->unit_name = unit_name; + dst_unit->compiler_name = unit_producer; + // TODO(rjf): dst_unit->source_file = ???; + // TODO(rjf): dst_unit->object_file = ???; + // TODO(rjf): dst_unit->archive_file = ???; + dst_unit->build_path = unit_comp_dir; + dst_unit->language = unit_lang; + dst_unit->line_table = unit_line_tables[unit_idx]; + dst_unit->voff_ranges = unit_voff_ranges; + } + } + lane_sync(); + } + + //////////////////////////// + //- rjf: convert all symbols + // + typedef struct D2R2_ScopeContainerNode D2R2_ScopeContainerNode; + struct D2R2_ScopeContainerNode + { + D2R2_ScopeContainerNode *next; + U64 info_off; + RDIM_Scope *scope; + }; + typedef struct D2R2_ScopeContainerMap D2R2_ScopeContainerMap; + struct D2R2_ScopeContainerMap + { + D2R2_ScopeContainerNode **slots; + U64 slots_count; + }; + typedef struct D2R2_SubUnitWorkArtifacts D2R2_SubUnitWorkArtifacts; + struct D2R2_SubUnitWorkArtifacts + { + RDIM_SymbolChunkList global_variables; + RDIM_SymbolChunkList thread_variables; + RDIM_SymbolChunkList constants; + RDIM_SymbolChunkList procedures; + RDIM_ScopeChunkList scopes; + RDIM_InlineSiteChunkList inline_sites; + }; + D2R2_ScopeContainerMap *scope_container_map = 0; + D2R2_SubUnitWorkArtifacts *sub_unit_work_artifacts = 0; + ProfScope("convert all symbols") + { + if(lane_idx() == 0) + { + scope_container_map = push_array(scratch.arena, D2R2_ScopeContainerMap, 1); + scope_container_map->slots_count = total_tag_count_estimate/8 + 1; + scope_container_map->slots = push_array(scratch.arena, D2R2_ScopeContainerNode *, scope_container_map->slots_count); + sub_unit_work_artifacts = push_array(scratch.arena, D2R2_SubUnitWorkArtifacts, sub_unit_works_count); + } + lane_sync_u64(&scope_container_map, 0); + lane_sync_u64(&sub_unit_work_artifacts, 0); + U64 work_take_idx_ = 0; + U64 *work_take_idx_ptr = &work_take_idx_; + lane_sync_u64(&work_take_idx_ptr, 0); + for(;;) + { + U64 work_idx = ins_atomic_u64_inc_eval(work_take_idx_ptr) - 1; + if(work_idx >= sub_unit_works_count) + { + break; + } + + //- rjf: unpack work + U64 unit_idx = sub_unit_works[work_idx].unit_idx; + Rng1U64 root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; + D2R2_SubUnitWorkArtifacts *dst_artifacts = &sub_unit_work_artifacts[work_idx]; + + //- rjf: unpack unit info + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + + //- rjf: produce all unit symbols in this work + U64 chunk_count = 256; + for(U64 root_tag_idx = root_tag_idx_range.min; root_tag_idx < root_tag_idx_range.max; root_tag_idx += 1) + { + typedef struct D2R2_ParentNode D2R2_ParentNode; + struct D2R2_ParentNode + { + D2R2_ParentNode *next; + DW_TagKind tag_kind; + U64 info_off; + RDIM_Scope *scope; + RDIM_Type *container_type; + RDIM_Namespace *container_namespace; + RDIM_LocationCaseList framebase_location_cases; + }; + D2R2_ParentNode *top_parent = 0; + D2R2_ParentNode *free_parent = 0; + U64 root_tag_start_off = unit_info_root_tag_offs[unit_idx].v[root_tag_idx]; + S64 depth = 1; + for(U64 off = root_tag_start_off; off < unit_info_tag_range.max && (depth > 1 || off == root_tag_start_off);) + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 start_off = off; + + //////////////////////// + //- rjf: parse tag + // + DW2_Tag tag = {0}; + off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + + //////////////////////// + //- rjf: gather attributes from tag + // + DW2_Attrib *name_attrib = &dw2_attrib_nil; + DW2_Attrib *linkname_attrib = &dw2_attrib_nil; + DW2_Attrib *type_attrib = &dw2_attrib_nil; + DW2_Attrib *inline_attrib = &dw2_attrib_nil; + DW2_Attrib *ranges_attrib = &dw2_attrib_nil; + DW2_Attrib *lopc_attrib = &dw2_attrib_nil; + DW2_Attrib *hipc_attrib = &dw2_attrib_nil; + DW2_Attrib *constval_attrib = &dw2_attrib_nil; + DW2_Attrib *location_attrib = &dw2_attrib_nil; + DW2_Attrib *framebase_attrib = &dw2_attrib_nil; + DW2_Attrib *external_attrib = &dw2_attrib_nil; + DW2_Attrib *decl_attrib = &dw2_attrib_nil; + for EachNode(n, DW2_AttribNode, tag.attribs.first) + { + switch(n->v.attrib_kind) + { + default:{}break; +#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break + Case(name, Name); + Case(linkname, LinkageName); + Case(type, Type); + Case(inline, Inline); + Case(ranges, Ranges); + Case(lopc, LowPc); + Case(hipc, HighPc); + Case(constval, ConstValue); + Case(location, Location); + Case(framebase, FrameBase); + Case(external, External); + Case(decl, Declaration); +#undef Case + } + } + + //////////////////////// + //- rjf: unpack basic attributes + // + String8 name = name_attrib->val.string; + String8 link_name = linkname_attrib->val.string; + DW_InlKind inl_kind = (DW_InlKind)inline_attrib->val.u128.u64[0]; + B32 is_external = (external_attrib != &dw2_attrib_nil); + B32 is_decl = (decl_attrib != &dw2_attrib_nil); + + //////////////////////// + //- rjf: unpack ranges + // + RDIM_Rng1U64List ranges = {0}; + { + if(ranges_attrib != &dw2_attrib_nil) + { + Temp temp = temp_begin(scratch2.arena); + Rng1U64List tag_ranges = dw2_rnglist_from_form_val(temp.arena, unit_parse_ctx, raw, ranges_attrib->val); + for EachNode(n, Rng1U64Node, tag_ranges.first) + { + rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){.min = n->v.min, .max = n->v.max}); + } + temp_end(temp); + } + if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) + { + U64 voff_base = lopc_attrib->val.addr - base_vaddr; + U64 voff_opl = 0; + if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<val.u128.u64[0]; + } + else + { + voff_opl = hipc_attrib->val.addr; + } + rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){voff_base, voff_opl}); + } + } + + //////////////////////// + //- rjf: unpack type + // + RDIM_Type *type = 0; + if(type_attrib != &dw2_attrib_nil || tag.kind == DW_TagKind_SubProgram) + { + // rjf: functions need to get their type info from themselves; the type attrib + // only references the return type. so, in that case, we'll use the procedure's + // own info offset / unit index, rather than the type attribute's. + U64 type_info_off = start_off; + U64 type_unit_idx = unit_idx; + + // rjf: attrib -> (info_off, unit_idx) + if(tag.kind != DW_TagKind_SubProgram) + { + type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + type_unit_idx = unit_idx; + if(!contains_1u64(unit_info_tag_range, type_info_off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); + type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); + } + } + + // rjf: (info_off, unit_idx) -> hash + U64 type_hash = 0; + { + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == type_info_off) + { + type_hash = n->dst_hash; + break; + } + } + } + + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = type_hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == type_hash) + { + type = type_from_idx_map[n->order_idx]; + break; + } + } + } + } + + //////////////////////// + //- rjf: unpack location info + // + RDIM_LocationCaseList location_cases = {0}; + RDIM_LocationCaseList framebase_location_cases = {0}; + B32 location_is_tls_dependent = 0; + B32 framebase_location_is_tls_dependent = 0; + { + struct + { + DW2_Attrib *attrib; + RDIM_LocationCaseList *dst_locations; + B32 *dst_is_tls_dependent; + } + tasks[] = + { + {location_attrib, &location_cases, &location_is_tls_dependent}, + {framebase_attrib, &framebase_location_cases, &framebase_location_is_tls_dependent}, + }; + for EachElement(task_idx, tasks) + { + if(tasks[task_idx].attrib == &dw2_attrib_nil) + { + continue; + } + DW2_Attrib *attrib = tasks[task_idx].attrib; + RDIM_LocationCaseList *dst_locations = tasks[task_idx].dst_locations; + B32 *dst_is_tls_dependent = tasks[task_idx].dst_is_tls_dependent; + + ////////////////////// + //- rjf: gather DWARF location exprs + // + DW2_LocList locs = {0}; + switch(attrib->val.kind) + { + default:{}break; + case DW_FormKind_ExprLoc: + { + U64 expr_info_off = attrib->val.u128.u64[0]; + U64 expr_info_size = attrib->val.u128.u64[1]; + String8 expr = str8_substr(raw->sec[DW_SectionKind_Info].data, r1u64(expr_info_off, expr_info_off+expr_info_size)); + DW2_LocNode *n = push_array(scratch2.arena, DW2_LocNode, 1); + n->v.expr = expr; + n->v.range = r1u64(0, max_U64); + SLLQueuePush(locs.first, locs.last, n); + locs.count += 1; + }break; + case DW_FormKind_LocListx: // NOTE(rjf): dwarf5+, loclistx -> location list offset table + case DW_FormKind_SecOffset: // NOTE(rjf): pre-dwarf5, location section offset -> a location list + { + locs = dw2_loclist_from_form_val(scratch2.arena, unit_parse_ctx, raw, attrib->val); + }break; + } + + ////////////////////// + //- rjf: convert DWARF location exprs -> RDIM locations + // + // we do this for each possible frame base location case - locations in DWARF + // refer to the frame base via a special op. in our case, we want to bake that + // into the location directly to reduce extra context for evaluation. + // + // if we find that a location doesn't rely on the frame base at all, we just + // skip the rest. + // + B32 is_tls_dependent = 0; + for EachNode(n, DW2_LocNode, locs.first) + { + //- rjf: unpack location + Rng1U64 range = n->v.range; + String8 expr = n->v.expr; + + //- rjf: iterate each frame base location case, or once if there are none, + // and convert the location in that context + RDIM_LocationCase nil_framebase_loc_case = {0, {0}, {0, max_U64}}; + for(RDIM_LocationCase *framebase_loc_n = top_parent ? top_parent->framebase_location_cases.first : &nil_framebase_loc_case; + framebase_loc_n != 0; + framebase_loc_n = framebase_loc_n->next) + { + //- rjf: unpack framebase location + RDIM_Location framebase_loc = framebase_loc_n->location; + RDIM_Rng1U64 framebase_voff_range = framebase_loc_n->voff_range; + + //- rjf: set up type stack for type-evaluating bytecode + typedef struct D2R2_ExprVal D2R2_ExprVal; + struct D2R2_ExprVal + { + RDI_TypeKind type_kind; + B32 is_addr; + }; + typedef struct D2R2_ExprValNode D2R2_ExprValNode; + struct D2R2_ExprValNode + { + D2R2_ExprValNode *next; + D2R2_ExprVal v; + }; + D2R2_ExprValNode *val_stack_top = 0; + D2R2_ExprValNode *free_val = 0; + + //- rjf: process DWARF bytecode; produce RDI bytecode + mini-type-info for the expression's result + typedef struct JumpOpNode JumpOpNode; + struct JumpOpNode + { + JumpOpNode *next; + RDIM_EvalBytecodeOp *op; + S64 inst_delta; + }; + JumpOpNode *first_jump_op = 0; + JumpOpNode *last_jump_op = 0; + RDIM_EvalBytecode dst_bytecode = {0}; + B32 dst_bytecode_is_good = 1; + B32 bytecode_is_framebase_dependent = 0; + for(U64 expr_off = 0; expr_off < expr.size;) + { + U64 start_expr_off = expr_off; + + //- rjf: read next opcode + DW_ExprOp opcode = 0; + expr_off += str8_deserial_read_struct(expr, expr_off, &opcode); + + //- rjf: unpack opcode + DW_ExprOpInfo *opcode_info = dw_info_from_expr_op(unit_parse_ctx->version, unit_parse_ctx->exts, opcode); + U64 operands_count = opcode_info->operand_count; + DW_ExprOperandKind operands_kinds[2] = {opcode_info->operand_kinds[0], opcode_info->operand_kinds[1]}; + U64 push_count = opcode_info->push_count; + U64 pop_count = opcode_info->pop_count; + + //- rjf: read op operands + U64 operand_u64s[2] = {0}; + S64 operand_s64s[2] = {0}; + String8 operand_str8s[2] = {0}; + for EachIndex(operand_idx, operands_count) + { + switch(operands_kinds[operand_idx]) + { + case DW_ExprOperandKind_Null: + default:{}break; + case DW_ExprOperandKind_U8: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 1, 1);}break; + case DW_ExprOperandKind_U16: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 2, 2);}break; + case DW_ExprOperandKind_U32: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 4, 4);}break; + case DW_ExprOperandKind_U64: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 8, 8);}break; + case DW_ExprOperandKind_S8: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 1, 1);}break; + case DW_ExprOperandKind_S16: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 2, 2);}break; + case DW_ExprOperandKind_S32: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 4, 4);}break; + case DW_ExprOperandKind_S64: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 8, 8);}break; + case DW_ExprOperandKind_ULEB128: {expr_off += str8_deserial_read_uleb128(expr, expr_off, &operand_u64s[operand_idx]);} break; + case DW_ExprOperandKind_SLEB128: {expr_off += str8_deserial_read_sleb128(expr, expr_off, &operand_s64s[operand_idx]);} break; + case DW_ExprOperandKind_Addr: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], unit_parse_ctx->addr_size, unit_parse_ctx->addr_size);}break; + case DW_ExprOperandKind_DwarfUInt: {expr_off += dw2_read_fmt_u64(expr, expr_off, unit_parse_ctx->format, &operand_u64s[operand_idx]);}break; + case DW_ExprOperandKind_Block: + { + U8 block_size = 0; + expr_off += str8_deserial_read_struct(expr, expr_off, &block_size); + operand_str8s[operand_idx] = str8_substr(expr, r1u64(expr_off, expr_off+block_size)); + expr_off += block_size; + }break; + } + } + + //- rjf: pop stack values + D2R2_ExprVal popped_vals[2] = {0}; + { + pop_count = Min(pop_count, ArrayCount(popped_vals)); + for EachIndex(pop_idx, pop_count) + { + if(val_stack_top != 0) + { + D2R2_ExprValNode *popped = val_stack_top; + popped_vals[pop_idx] = popped->v; + SLLStackPop(val_stack_top); + SLLStackPush(free_val, popped); + } + } + } + + //- rjf: exec op (produce RDI bytecode, + manipulate value stack) + D2R2_ExprVal push_vals[2] = {0}; + U64 regcode_dw = 0; + S64 regval_off = 0; + B32 regread_is_addr = 0; + U64 target_pick_val_idx = 0; + RDI_EvalOp rdi_eval_op = 0; + U64 memread_size = 0; + switch(opcode) + { + default:{}break; + + //- rjf: small opcode-embedded unsigned literals + case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: + case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: + case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: + case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: + case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: + case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: + case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: + case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: + case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: + case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: + case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: + { + U64 lit_val = (U64)(opcode - DW_ExprOp_Lit0); + rdim_bytecode_push_uconst(arena, &dst_bytecode, lit_val); + }break; + + //- rjf: small unsigned literals + case DW_ExprOp_Const1U: push_vals[0].type_kind = RDI_TypeKind_U8; goto const_u; + case DW_ExprOp_Const2U: push_vals[0].type_kind = RDI_TypeKind_U16; goto const_u; + case DW_ExprOp_Const4U: push_vals[0].type_kind = RDI_TypeKind_U32; goto const_u; + case DW_ExprOp_Const8U: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; + case DW_ExprOp_ConstU: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; + const_u:; + { + rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); + }break; + + //- rjf: small signed literals + case DW_ExprOp_Const1S: push_vals[0].type_kind = RDI_TypeKind_S8; goto const_s; + case DW_ExprOp_Const2S: push_vals[0].type_kind = RDI_TypeKind_S16; goto const_s; + case DW_ExprOp_Const4S: push_vals[0].type_kind = RDI_TypeKind_S32; goto const_s; + case DW_ExprOp_Const8S: push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; + case DW_ExprOp_ConstS : push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; + const_s:; + { + rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); + }break; + + //- rjf: address (module offsets) + case DW_ExprOp_Addr: + { + U64 voff = operand_u64s[0] - base_vaddr; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + }break; + case DW_ExprOp_Addrx: + if(unit_parse_ctx->addr_table != 0) + { + U64 addr_idx = operand_u64s[0]; + U64 addr = 0; + if(dw2_try_offset_from_table_idx(unit_parse_ctx->addr_table, addr_idx, &addr)) + { + U64 voff = (addr > base_vaddr) ? (addr - base_vaddr) : 0; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + } + }break; + + //- rjf: register reads + case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: + case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: + case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: + case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: + case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: + case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: + case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: + case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: + case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: + case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: + case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: + { + regcode_dw = (U64)(opcode - DW_ExprOp_Reg0); + }goto reg_read; + case DW_ExprOp_RegX: + { + regcode_dw = operand_u64s[0]; + }goto reg_read; + case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: + case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: + case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: + case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: + case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: + case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: + case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: + case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: + case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: + case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: + case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: + { + regcode_dw = (U64)(opcode - DW_ExprOp_BReg0); + regval_off = operand_s64s[1]; + regread_is_addr = 1; + }goto reg_read; + case DW_ExprOp_BRegX: + { + regcode_dw = operand_u64s[0]; + regval_off = operand_s64s[1]; + regread_is_addr = 1; + }goto reg_read; + reg_read:; + { + // rjf: DWARF regcode -> internal regcode + ARCH_RegCode regcode = arch_reg_code_from_dw(arch, regcode_dw); + + // rjf: internal regcode -> RDI, offset, size + RDI_RegCode regcode_rdi = 0; + U64 reg_off = 0; + U64 reg_size = 0; + { + Rng1U16 reg_rng = arch_info->reg_code_rng_table[regcode]; + reg_size = dim_1u16(reg_rng); + regcode_rdi = arch_rdi_from_reg_code_table_from_arch(arch)[regcode]; + } + + // rjf: push op + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_RegRead, RDI_EncodeRegReadParam(regcode_rdi, reg_size, reg_off)); + + // rjf: push add to value offset, if needed + if(regval_off != 0) + { + rdim_bytecode_push_sconst(arena, &dst_bytecode, regval_off); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); + } + + // rjf: choose if we're doing a float op + B32 is_float_op = 0; + if(arch == Arch_x64 && + (regcode_rdi == RDI_RegCodeX64_st0 || + regcode_rdi == RDI_RegCodeX64_st1 || + regcode_rdi == RDI_RegCodeX64_st2 || + regcode_rdi == RDI_RegCodeX64_st3 || + regcode_rdi == RDI_RegCodeX64_st4 || + regcode_rdi == RDI_RegCodeX64_st5 || + regcode_rdi == RDI_RegCodeX64_st6 || + regcode_rdi == RDI_RegCodeX64_st7)) + { + is_float_op = 1; + } + + // rjf: set up push value + push_vals[0].is_addr = regread_is_addr; + if(is_float_op) + { + switch(reg_size) + { + default:{}break; + case 2: {push_vals[0].type_kind = RDI_TypeKind_F16;}break; + case 4: {push_vals[0].type_kind = RDI_TypeKind_F32;}break; + case 6: {push_vals[0].type_kind = RDI_TypeKind_F48;}break; + case 8: {push_vals[0].type_kind = RDI_TypeKind_F64;}break; + case 10:{push_vals[0].type_kind = RDI_TypeKind_F80;}break; + case 12:{push_vals[0].type_kind = RDI_TypeKind_F96;}break; + case 16:{push_vals[0].type_kind = RDI_TypeKind_F128;}break; + } + } + else + { + switch(reg_size) + { + default:{}break; + case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; + case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; + case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; + case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; + } + } + }break; + + //- rjf: implicit values + case DW_ExprOp_ImplicitValue: + { + if(operand_str8s[0].size <= sizeof(U64)) + { + U64 implicit_value = 0; + MemoryCopy(&implicit_value, operand_str8s[0].str, Min(sizeof(U64), operand_str8s[0].size)); + rdim_bytecode_push_uconst(arena, &dst_bytecode, implicit_value); + switch(operand_str8s[0].size) + { + default:{}break; + case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; + case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; + case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; + case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; + } + } + else + { + log_infof("[.debug_info@0x%I64x] Implicit value DWARF expression operation (DW_ExprOp_ImplicitValue) with block size >8 (%I64u) found. This is not currently supported.\n", start_off, operand_str8s[0].size); + } + }break; + + //- rjf: pieces + case DW_ExprOp_Piece: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValue, operand_u64s[0]); + }break; + case DW_ExprOp_BitPiece: + { + U64 size = operand_u64s[0]; + U64 off = operand_u64s[1]; + U64 partial_value = ((size<<32)|(off)); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValueBit, partial_value); + }break; + + //- rjf: stack ops + case DW_ExprOp_Over: {target_pick_val_idx = 1;}goto pick; + case DW_ExprOp_Pick: {target_pick_val_idx = operand_u64s[0];}goto pick; + case DW_ExprOp_Dup: {target_pick_val_idx = 0;}goto pick; + pick:; + { + // rjf: pick value from stack + D2R2_ExprVal picked_val = {0}; + { + U64 idx = 0; + for(D2R2_ExprValNode *n = val_stack_top; n != 0; n = n->next) + { + if(idx == target_pick_val_idx) + { + picked_val = n->v; + break; + } + } + } + + // rjf: push opcode + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pick, target_pick_val_idx); + + // rjf: push val + push_vals[0] = picked_val; + }break; + case DW_ExprOp_Swap: + { + push_vals[0] = popped_vals[1]; + push_vals[1] = popped_vals[0]; + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Swap, 0); + }break; + case DW_ExprOp_Drop: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pop, 0); + }break; + + //- rjf: jumps + case DW_ExprOp_Skip: rdi_eval_op = RDI_EvalOp_Skip; goto jumps; + case DW_ExprOp_Bra: rdi_eval_op = RDI_EvalOp_Cond; goto jumps; + jumps:; + { + // rjf: jump delta in bytes (how the instruction is encoded) -> jump delta in instructions + S64 jump_delta_bytes = operand_s64s[0]; + S64 jump_delta_insts = 0; + { + // TODO(rjf): expr op jumps bytes -> inst counts + } + + // rjf: push incomplete op (we need to resolve inst delta -> byte delta later, once we have the full bytecode stream) + RDIM_EvalBytecodeOp *op = rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, 0); + + // rjf: gather op + JumpOpNode *n = push_array(scratch2.arena, JumpOpNode, 1); + SLLQueuePush(first_jump_op, last_jump_op, n); + n->op = op; + n->inst_delta = jump_delta_insts; + }break; + + //- rjf: containing procedure frame offsets + case DW_ExprOp_FBReg: + { + bytecode_is_framebase_dependent = 1; + for EachNode(n, RDIM_EvalBytecodeOp, framebase_loc.bytecode.first_op) + { + rdim_bytecode_push_op(arena, &dst_bytecode, n->op, n->p); + } + rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); + push_vals[0].type_kind = RDI_TypeKind_U64; + push_vals[0].is_addr = 1; + }break; + + //- rjf: memory reads + case DW_ExprOp_Deref: memread_size = unit_parse_ctx->addr_size; goto deref; + case DW_ExprOp_DerefSize: memread_size = operand_u64s[0]; goto deref; + deref:; + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_MemRead, memread_size); + push_vals[0].is_addr = 1; + push_vals[0].type_kind = RDI_TypeKind_U64; + }break; + + //- rjf: TLS offsets + case DW_ExprOp_FormTlsAddress: + case DW_GNU_ExprOp_PushTlsAddress: + { + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_TLSOff, 0); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); + push_vals[0].is_addr = 1; + push_vals[0].type_kind = RDI_TypeKind_U64; + is_tls_dependent = 1; + }break; + + //- rjf: call site value + case DW_ExprOp_EntryValue: + case DW_GNU_ExprOp_EntryValue: + { + // TODO(rjf): expr op entry value ops + }break; + + //- rjf: fixed adds + case DW_ExprOp_PlusUConst: + { + rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); + rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); + push_vals[0].type_kind = RDI_TypeKind_U64; // TODO(rjf): do we need to adjust this based on popped value at all, even? + }break; + + //- rjf: arithmetic ops + case DW_ExprOp_Eq: {rdi_eval_op = RDI_EvalOp_EqEq;}goto arithmetic_op; + case DW_ExprOp_Ge: {rdi_eval_op = RDI_EvalOp_GrEq;}goto arithmetic_op; + case DW_ExprOp_Gt: {rdi_eval_op = RDI_EvalOp_Grtr;}goto arithmetic_op; + case DW_ExprOp_Le: {rdi_eval_op = RDI_EvalOp_LsEq;}goto arithmetic_op; + case DW_ExprOp_Lt: {rdi_eval_op = RDI_EvalOp_Less;}goto arithmetic_op; + case DW_ExprOp_Ne: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; + case DW_ExprOp_Div: {rdi_eval_op = RDI_EvalOp_Div;}goto arithmetic_op; + case DW_ExprOp_Minus: {rdi_eval_op = RDI_EvalOp_Sub;}goto arithmetic_op; + case DW_ExprOp_Mul: {rdi_eval_op = RDI_EvalOp_Mul;}goto arithmetic_op; + case DW_ExprOp_Plus: {rdi_eval_op = RDI_EvalOp_Add;}goto arithmetic_op; + case DW_ExprOp_Xor: {rdi_eval_op = RDI_EvalOp_BitXor;}goto arithmetic_op; + case DW_ExprOp_And: {rdi_eval_op = RDI_EvalOp_BitAnd;}goto arithmetic_op; + case DW_ExprOp_Or: {rdi_eval_op = RDI_EvalOp_BitOr;}goto arithmetic_op; + case DW_ExprOp_Shl: {rdi_eval_op = RDI_EvalOp_LShift;}goto arithmetic_op; + case DW_ExprOp_Shr: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; + case DW_ExprOp_Shra: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; + case DW_ExprOp_Mod: {rdi_eval_op = RDI_EvalOp_Mod;}goto arithmetic_op; + case DW_ExprOp_Abs: {rdi_eval_op = RDI_EvalOp_Abs;}goto arithmetic_op; + case DW_ExprOp_Neg: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; + case DW_ExprOp_Not: {rdi_eval_op = RDI_EvalOp_LogNot;}goto arithmetic_op; + arithmetic_op:; + { + // TODO(rjf): eval arithmetic conversions etc. + rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, RDI_EvalTypeGroup_U); + }break; + + //- rjf: currently unsupported + case DW_ExprOp_XDeref: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression XDeref operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_XDerefSize: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression XDerefSize operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_Call2: + case DW_ExprOp_Call4: + case DW_ExprOp_CallRef: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression call operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_ImplicitPointer: + case DW_GNU_ExprOp_ImplicitPointer: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression implicit pointer operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_GNU_ExprOp_ParameterRef: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression GNU_ParameterRef operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_DerefType: + case DW_GNU_ExprOp_DerefType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression DerefType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_ConstType: + case DW_GNU_ExprOp_ConstType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression ConstType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_RegvalType: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression RegvalType operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_PushObjectAddress: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression PushObjectAddress operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_ExprOp_Rot: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression Rot (rotate) operation encountered. This is not supported for location info.\n", start_off); + }break; + case DW_GNU_ExprOp_UnInit: + { + dst_bytecode_is_good = 0; + log_infof("[.debug_info@0x%I64x] DWARF expression GNU_UnInit operation encountered. This is not supported for location info.\n", start_off); + // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; + } break; + } + + //- rjf: push values to stack + { + push_count = Min(push_count, ArrayCount(push_vals)); + for EachIndex(push_idx, push_count) + { + D2R2_ExprValNode *n = free_val; + if(n != 0) + { + SLLStackPop(free_val); + } + else + { + n = push_array(scratch2.arena, D2R2_ExprValNode, 1); + } + n->v = push_vals[push_idx]; + SLLStackPush(val_stack_top, n); + } + } + + if(expr_off == start_expr_off) + { + break; + } + } + + //- rjf: apply RDI byte offsets to jump ops + { + // TODO(rjf): apply RDI byte offsets to jump ops + } + + //- rjf: map bytecode -> RDIM_Location - we may want to simplify + RDIM_Location loc = {0}; + { + loc.kind = val_stack_top && val_stack_top->v.is_addr ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; + loc.bytecode = dst_bytecode; + + // rjf: gather first few bytecodes for pattern matching + RDI_EvalOp beginning_ops[5] = {0}; + RDIM_EvalBytecodeOp *beginning_nodes[5] = {0}; + { + U64 idx = 0; + for EachNode(n, RDIM_EvalBytecodeOp, dst_bytecode.first_op) + { + if(idx >= ArrayCount(beginning_ops)) + { + break; + } + beginning_ops[idx] = n->op; + beginning_nodes[idx] = n; + idx += 1; + } + } + + // rjf: match val registers + if(loc.kind == RDI_LocationKind_ValBytecodeStream && + beginning_ops[0] == RDI_EvalOp_RegRead && + beginning_ops[1] == RDI_EvalOp_Stop) + { + U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; + U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; + U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; + if(byte_size == unit_parse_ctx->addr_size && + byte_off == 0) + { + loc.kind = RDI_LocationKind_ValReg; + loc.reg_code = rdi_reg_code; + } + } + + // rjf: match simple register offsets + if(loc.kind == RDI_LocationKind_AddrBytecodeStream && + beginning_ops[0] == RDI_EvalOp_RegRead && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16) && + beginning_ops[2] == RDI_EvalOp_TruncSigned && + beginning_ops[3] == RDI_EvalOp_Add && + beginning_ops[4] == RDI_EvalOp_Stop) + { + U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; + U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; + U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; + if(byte_off == 0 && byte_size == unit_parse_ctx->addr_size) + { + loc.kind = RDI_LocationKind_AddrRegPlusOff; + loc.reg_code = rdi_reg_code; + loc.offset = beginning_nodes[1]->p; + } + } + + // rjf: match simple module offsets + if(beginning_ops[0] == RDI_EvalOp_ModuleOff && beginning_ops[1] == RDI_EvalOp_Stop) + { + U64 voff = beginning_nodes[0]->p; + loc.kind = RDI_LocationKind_ModuleOff; + loc.offset = voff; + } + else if(((beginning_ops[0] == RDI_EvalOp_ModuleOff && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16 || + beginning_ops[1] == RDI_EvalOp_ConstU32 || + beginning_ops[1] == RDI_EvalOp_ConstU64)) || + (beginning_ops[1] == RDI_EvalOp_ModuleOff && + (beginning_ops[0] == RDI_EvalOp_ConstU8 || + beginning_ops[0] == RDI_EvalOp_ConstU16 || + beginning_ops[0] == RDI_EvalOp_ConstU32 || + beginning_ops[0] == RDI_EvalOp_ConstU64))) && + beginning_ops[2] == RDI_EvalOp_Add && + beginning_ops[3] == RDI_EvalOp_Stop) + { + U64 voff = beginning_nodes[0]->p + beginning_nodes[1]->p; + loc.kind = RDI_LocationKind_ModuleOff; + loc.offset = voff; + } + + // rjf: match simple TLS offsets + if(beginning_ops[0] == RDI_EvalOp_TLSOff && beginning_ops[1] == RDI_EvalOp_Stop) + { + U64 toff = beginning_nodes[0]->p; + loc.kind = RDI_LocationKind_TLSOff; + loc.offset = toff; + } + else if(((beginning_ops[0] == RDI_EvalOp_TLSOff && + (beginning_ops[1] == RDI_EvalOp_ConstU8 || + beginning_ops[1] == RDI_EvalOp_ConstU16 || + beginning_ops[1] == RDI_EvalOp_ConstU32 || + beginning_ops[1] == RDI_EvalOp_ConstU64)) || + (beginning_ops[1] == RDI_EvalOp_TLSOff && + (beginning_ops[0] == RDI_EvalOp_ConstU8 || + beginning_ops[0] == RDI_EvalOp_ConstU16 || + beginning_ops[0] == RDI_EvalOp_ConstU32 || + beginning_ops[0] == RDI_EvalOp_ConstU64))) && + beginning_ops[2] == RDI_EvalOp_Add && + beginning_ops[3] == RDI_EvalOp_Stop) + { + U64 toff = beginning_nodes[0]->p + beginning_nodes[1]->p; + loc.kind = RDI_LocationKind_TLSOff; + loc.offset = toff; + } + } + + //- rjf: collect + { + RDIM_Rng1U64 voff_range = {range.min - base_vaddr, range.max - base_vaddr}; + if(bytecode_is_framebase_dependent) + { + voff_range.min = Max(voff_range.min, framebase_voff_range.min); + voff_range.max = Min(voff_range.max, framebase_voff_range.max); + } + rdim_location_case_list_push(arena, dst_locations, loc, voff_range); + dst_is_tls_dependent[0] = is_tls_dependent; + } + + //- rjf: not frame-base dependent? -> break - don't do this per-framebase case + if(!bytecode_is_framebase_dependent) + { + break; + } + } + } + } + } + + //////////////////////// + //- rjf: produce symbols from tag + // + RDIM_Symbol *new_symbol = 0; + RDIM_Scope *new_scope_open = 0; + B32 parent_tag_is_container_to_deduped_tags = 0; + switch(tag.kind) + { + default:{}break; + + //- rjf: determine if parent tag is a container to deduplicated tags + case DW_TagKind_Namespace: + case DW_TagKind_StructureType: + case DW_TagKind_UnionType: + case DW_TagKind_ClassType: + case DW_TagKind_EnumerationType: + case DW_TagKind_Typedef: + { + parent_tag_is_container_to_deduped_tags = 1; + }break; + + //- rjf: subprograms (procedures) + case DW_TagKind_SubProgram: + if(!is_decl) + { + RDIM_Scope *root_scope = rdim_scope_chunk_list_push(arena, &dst_artifacts->scopes, chunk_count); + RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_artifacts->procedures, chunk_count); + procedure->name = name; + procedure->link_name = link_name; + procedure->type = type; + procedure->root_scope = root_scope; + procedure->location_cases = framebase_location_cases; + root_scope->symbol = procedure; + root_scope->voff_ranges = ranges; + dst_artifacts->scopes.scope_voff_count += 2*ranges.count; + new_symbol = procedure; + new_scope_open = root_scope; + }break; + + //- rjf: inline site + case DW_TagKind_InlinedSubroutine: + { + // TODO(rjf) + }break; + + //- rjf: variables + case DW_TagKind_Variable: + case DW_TagKind_FormalParameter: + if(name.size != 0) + { + U64 var_chunk_count = chunk_count; + RDIM_SymbolChunkList *dst_symbols = &dst_artifacts->global_variables; + if(location_is_tls_dependent) + { + dst_symbols = &dst_artifacts->thread_variables; + } + else if(top_parent != 0 && top_parent->scope != 0) + { + dst_symbols = &top_parent->scope->locals; + var_chunk_count = 8; + } + RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, dst_symbols, var_chunk_count); + var->is_extern = is_external; + var->is_param = (tag.kind == DW_TagKind_FormalParameter); + var->name = name; + var->link_name = link_name; + var->type = type; + var->location_cases = location_cases; + new_symbol = var; + }break; + + //- rjf: lexical blocks (scopes) + case DW_TagKind_LexicalBlock: + { + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &dst_artifacts->scopes, chunk_count); + scope->voff_ranges = ranges; + dst_artifacts->scopes.scope_voff_count += 2*ranges.count; + new_scope_open = scope; + }break; + } + + //////////////////////// + //- rjf: if we've determined that the parent tag is a container to + // deduplicated tags (types, namespaces), then we need to record + // the .debug_info offset -> scope mapping for this scope, so it + // can be equipped as a container later. + // + if(parent_tag_is_container_to_deduped_tags) + { + U64 info_off = 0; + RDIM_Scope *scope = 0; + for(D2R2_ParentNode *n = top_parent; n != 0; n = n->next) + { + if(n->scope != 0) + { + info_off = n->info_off; + scope = n->scope; + break; + } + } + if(scope != 0) + { + D2R2_ScopeContainerNode *n = push_array(scratch.arena, D2R2_ScopeContainerNode, 1); + n->info_off = info_off; + n->scope = scope; + U64 hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 slot_idx = hash%scope_container_map->slots_count; + for(B32 gathered = 0; !gathered;) + { + U64 expected_head_value = ins_atomic_u64_eval(&scope_container_map->slots[slot_idx]); + n->next = (D2R2_ScopeContainerNode *)expected_head_value; + if(expected_head_value == ins_atomic_u64_eval_cond_assign(&scope_container_map->slots[slot_idx], (U64)n, expected_head_value)) + { + gathered = 1; + } + } + } + } + + //////////////////////// + //- rjf: equip new symbols with container info + // + if(new_symbol != 0 && top_parent != 0) + { + if(top_parent->scope != 0) + { + new_symbol->container_scope = top_parent->scope; + } + else if(top_parent->container_type != 0) + { + new_symbol->container_type = top_parent->container_type; + } + else if(top_parent->container_namespace != 0) + { + new_symbol->container_namespace = top_parent->container_namespace; + } + } + + //////////////////////// + //- rjf: insert new scopes to their parent + // + if(new_scope_open && top_parent != 0 && top_parent->scope != 0) + { + RDIM_Scope *parent = top_parent->scope; + SLLQueuePush_N(parent->first_child, parent->last_child, new_scope_open, next_sibling); + new_scope_open->parent_scope = parent; + if(new_scope_open->symbol == 0) + { + new_scope_open->symbol = parent->symbol; + } + } + + //////////////////////// + //- rjf: gather container info for new tag parents + // + RDIM_Type *container_type = 0; + RDIM_Namespace *container_namespace = 0; + if(tag.has_children) + { + // rjf: info offset -> hash + U64 hash = 0; + { + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for EachNode(n, D2R2_UnitDedupedTagNode, unit_deduped_tag_map->slots[info_off_slot_idx]) + { + if(n->src_info_off == start_off) + { + hash = n->dst_hash; + break; + } + } + } + + // rjf: map hash -> unique tag node + D2R2_UniqueTagNode *tag_node = 0; + { + U64 slot_idx = hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + tag_node = n; + break; + } + } + } + + // rjf: map tag node -> type/namespace + if(tag_node != 0) switch(tag_node->kind) + { + default:{}break; + case D2R2_UniqueTagKind_Type: {container_type = type_from_idx_map[tag_node->order_idx];}break; + case D2R2_UniqueTagKind_Namespace:{container_namespace = namespace_from_idx_map[tag_node->order_idx];}break; + } + } + + //////////////////////// + //- rjf: push tag parents + // + if(tag.has_children) + { + // rjf: push new parent to stack + D2R2_ParentNode *n = free_parent; + if(n != 0) + { + SLLStackPop(free_parent); + } + else + { + n = push_array(scratch.arena, D2R2_ParentNode, 1); + } + n->tag_kind = tag.kind; + n->info_off = start_off; + n->scope = new_scope_open ? new_scope_open : top_parent ? top_parent->scope : 0; + n->container_type = new_scope_open ? 0 : container_type; + n->container_namespace = new_scope_open ? 0 : container_namespace; + if(framebase_attrib != &dw2_attrib_nil) + { + n->framebase_location_cases = framebase_location_cases; + } + else if(top_parent != 0) + { + n->framebase_location_cases = top_parent->framebase_location_cases; + } + SLLStackPush(top_parent, n); + } + + //////////////////////// + //- rjf: pop scopes + // + if(tag.kind == DW_TagKind_Null && top_parent != 0) + { + D2R2_ParentNode *n = top_parent; + SLLStackPop(top_parent); + SLLStackPush(free_parent, n); + } + + //////////////////////// + //- rjf: tree nav + // + if(tag.has_children) + { + depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + + scratch_end(scratch2); + if(off == start_off) + { + break; + } + } + } + } + lane_sync(); + } + + //////////////////////////// + //- rjf: join all symbols from all sub-unit works into their units + // + ProfScope("join all symbols from all sub-unit works into their units") + { + U64 unit_take_idx_ = 0; + U64 *unit_take_idx_ptr = &unit_take_idx_; + lane_sync_u64(&unit_take_idx_ptr, 0); + for(;;) + { + U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; + if(unit_idx >= unit_count) + { + break; + } + RDIM_Unit *dst_unit = unit_from_idx_map[unit_idx]; + for EachIndex(work_idx, sub_unit_works_count) + { + if(sub_unit_works[work_idx].unit_idx == unit_idx) + { + rdim_symbol_chunk_list_concat_in_place(&dst_unit->global_variables, &sub_unit_work_artifacts[work_idx].global_variables); + rdim_symbol_chunk_list_concat_in_place(&dst_unit->thread_variables, &sub_unit_work_artifacts[work_idx].thread_variables); + rdim_symbol_chunk_list_concat_in_place(&dst_unit->constants, &sub_unit_work_artifacts[work_idx].constants); + rdim_symbol_chunk_list_concat_in_place(&dst_unit->procedures, &sub_unit_work_artifacts[work_idx].procedures); + rdim_scope_chunk_list_concat_in_place(&dst_unit->scopes, &sub_unit_work_artifacts[work_idx].scopes); + rdim_inline_site_chunk_list_concat_in_place(&dst_unit->inline_sites, &sub_unit_work_artifacts[work_idx].inline_sites); + } + } + } + lane_sync(); + } + + //////////////////////////// + //- rjf: upgrade all types with namespacing info + // + ProfScope("upgrade all types with namespacing info") + { + Rng1U64 range = lane_range(type_count); + for EachInRange(type_idx, range) + { + D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + U64 container_ancestor_info_off = type_tag_node->container_ancestor_info_off; + RDIM_Type *dst_type = type_from_idx_map[type_idx]; + if(dst_type == 0) + { + continue; + } + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + continue; + } + + // rjf: find container scopes + RDIM_Scope *container_scope = 0; + { + U64 info_off = container_ancestor_info_off; + U64 hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 slot_idx = hash%scope_container_map->slots_count; + for(D2R2_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) + { + if(n->info_off == info_off) + { + container_scope = n->scope; + break; + } + } + } + + // rjf: find container types/namespaces + RDIM_Type *container_type = 0; + RDIM_Namespace *container_namespace = 0; + if(!container_scope) + { + U64 info_off = container_ancestor_info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; + + // rjf: info off -> hash + U64 hash = 0; + { + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == info_off) + { + hash = n->dst_hash; + break; } } } - // update line sequence counts per source file @rdim_src_file_push_line_sequence - for EachIndex(file_idx, vm->header.file_table.count) { - if (line_seq_counts_per_file[file_idx] > 0) { - DW_LineFile *file = &vm->header.file_table.v[file_idx]; - U64 hash = d2r_hash_line_file(vm->header.dir_table.v[file->dir_idx], file); - D2R_SrcFileLookup *lookup = lfht_search(src_file_lfht, hash, &(D2R_SrcFileLookup){ .file = file, .vm = vm }, d2r_src_file_lookup_is_equal, 0); - RDIM_SrcFile *src_file = lookup->src_file; - ins_atomic_u64_add_eval(&src_file->total_line_count, line_seq_counts_per_file[file_idx]); + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + if(n->kind == D2R2_UniqueTagKind_Type) + { + container_type = type_from_idx_map[n->order_idx]; + } + else if(n->kind == D2R2_UniqueTagKind_Namespace) + { + container_namespace = namespace_from_idx_map[n->order_idx]; + } + break; + } } } } - // TODO: sync - // - // update total line sequences count in shared @rdim_src_file_push_line_sequence - for EachIndex(i, lane_count()) { - g_d2r_shared.src_files.total_line_count += line_seq_counts_per_lane[i]; - } - - // TODO: sync - for EachIndex(i, lane_count()) { - rdim_line_table_chunk_list_concat_in_place(&g_d2r_shared.line_tables, &lane_line_table_chunks[i]); - } - - // TODO: per thread task - ProfBegin("Relase line VMs"); - for EachIndex(i, cu_ranges.count) { - dw_line_vm_release(line_vms[i]); - } - ProfEnd(); - - temp_end(temp); + // rjf: fill + dst_udt->container_scope = container_scope; + dst_udt->container_type = container_type; + dst_udt->container_namespace = container_namespace; } - - //////////////////////////////// - - RDIM_Type *builtin_types[RDI_TypeKind_COUNT] = {0}; - for (RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1) { - RDIM_Type *type = rdim_type_chunk_list_push(arena, &g_d2r_shared.types, D2R_TYPE_CHUNK_CAP); - type->kind = type_kind; - type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); - type->byte_size = rdi_size_from_basic_type_kind(type_kind); - builtin_types[type_kind] = type; - } - - // fixup float80 size - if (arch == Arch_x64 || arch == Arch_arm64) { - builtin_types[RDI_TypeKind_F80]->byte_size = 16; - } - - builtin_types[RDI_TypeKind_Void]->byte_size = rdi_addr_size_from_arch(g_d2r_shared.top_level_info.arch); - builtin_types[RDI_TypeKind_Handle]->byte_size = rdi_addr_size_from_arch(g_d2r_shared.top_level_info.arch); - - builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &g_d2r_shared.types, D2R_TYPE_CHUNK_CAP); - builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic; - - //////////////////////////////// - - ProfBegin("Convert Units"); - for EachIndex(cu_idx, cu_ranges.count) { - Temp comp_temp = temp_begin(scratch.arena); - - DW_CompUnit *cu = &cu_arr[cu_idx]; - - // skip DWO - { - if (cu->dwo_id) { goto next_cu; } - - String8 dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_DwoName); - if (dwo_name.size) { goto next_cu; } - - String8 gnu_dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_GNU_DwoName); - if (gnu_dwo_name.size) { goto next_cu; } - } - - // parse and build tag tree - DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu); - - // build (info offset -> tag) hash table to resolve tags with abstract origin - cu->tag_ht = dw_make_tag_hash_table(comp_temp.arena, tag_tree); - - // extract compile unit info - String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name); - String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir); - String8 cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer); - DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language); - - // init type table - D2R_TypeTable *type_table = push_array(comp_temp.arena, D2R_TypeTable, 1); - type_table->ht = hash_table_init(comp_temp.arena, 0x4000); - type_table->types = &g_d2r_shared.types; - type_table->type_chunk_cap = D2R_TYPE_CHUNK_CAP; - type_table->builtin_types = builtin_types; - - // convert compile unit - RDIM_Unit *unit = rdim_unit_chunk_list_push(arena, &g_d2r_shared.units, D2R_UNIT_CHUNK_CAP); - { - RDIM_Rng1U64ChunkList cu_voff_ranges = {0}; - if (cu_idx < cu_contrib_map.count) { - cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); - } else { - Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); - for EachNode(n, Rng1U64Node, range_list.first) { - rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); - } - } - unit->unit_name = cu_name; - unit->compiler_name = cu_prod; - unit->source_file = str8_zero(); // TODO - unit->object_file = str8_zero(); // TODO - unit->archive_file = str8_zero(); // TODO - unit->build_path = cu_dir; - unit->language = d2r_rdi_language_from_dw_language(cu_lang); - unit->line_table = cu_line_tables_rdi[cu_idx]; - unit->voff_ranges = cu_voff_ranges; - } - - // convert debug info - d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch, tag_tree.root); - d2r_convert_udts(arena, type_table, &input, cu, cu_lang, tag_tree.root); - d2r_convert_symbols(arena, type_table, &input, cu, cu_lang, image_base, arch, tag_tree.root, unit); - - next_cu:; - temp_end(comp_temp); - } - ProfEnd(); } - lane_sync(); - RDIM_BakeParams bake_params = {0}; - bake_params.subset_flags = params->subset_flags; - bake_params.top_level_info = g_d2r_shared.top_level_info; - bake_params.binary_sections = g_d2r_shared.binary_sections; - bake_params.units = g_d2r_shared.units; - bake_params.types = g_d2r_shared.types; - bake_params.udts = g_d2r_shared.udts; - bake_params.src_files = g_d2r_shared.src_files; - bake_params.line_tables = g_d2r_shared.line_tables; + //////////////////////////// + //- rjf: upgrade all namespaces with namespacing info + // + ProfScope("upgrade all namespaces with namespacing info") + { + Rng1U64 range = lane_range(namespace_count); + for EachInRange(namespace_idx, range) + { + D2R2_UniqueTagNode *unique_tag_node = namespace_tag_nodes[namespace_idx]; + U64 container_ancestor_info_off = unique_tag_node->container_ancestor_info_off; + RDIM_Namespace *dst_namespace = namespace_from_idx_map[namespace_idx]; + if(dst_namespace == 0) + { + continue; + } + + // rjf: find container scopes + RDIM_Scope *container_scope = 0; + { + U64 info_off = container_ancestor_info_off; + U64 hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 slot_idx = hash%scope_container_map->slots_count; + for(D2R2_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) + { + if(n->info_off == info_off) + { + container_scope = n->scope; + break; + } + } + } + + // rjf: find container types/namespaces + RDIM_Type *container_type = 0; + RDIM_Namespace *container_namespace = 0; + { + U64 info_off = container_ancestor_info_off; + U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); + U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; + + // rjf: info off -> hash + U64 hash = 0; + { + D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; + for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + { + if(n->src_info_off == info_off) + { + hash = n->dst_hash; + break; + } + } + } + + // rjf: hash -> type + { + U64 unique_type_tag_slot_idx = hash%unique_tag_slots_count; + for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + { + if(n->hash == hash) + { + if(n->kind == D2R2_UniqueTagKind_Type) + { + container_type = type_from_idx_map[n->order_idx]; + } + else if(n->kind == D2R2_UniqueTagKind_Namespace) + { + container_namespace = namespace_from_idx_map[n->order_idx]; + } + break; + } + } + } + } + + // rjf: fill + dst_namespace->parent_scope = container_scope; + dst_namespace->parent_type = container_type; + dst_namespace->parent_namespace = container_namespace; + } + } + lane_sync(); + //////////////////////////// + //- rjf: fill result + // + RDIM_BakeParams result = {0}; + { + result.subset_flags = params->subset_flags; + result.top_level_info = top_level_info; + result.binary_sections = binary_sections; + result.units = *all_units; + result.namespaces = *all_namespaces; + result.types = *all_types; + result.udts = *all_udts; + result.src_files = *all_src_files; + result.line_tables = *all_line_tables; + } + +#undef d2r2_type_from_builtin_kind + lane_sync(); scratch_end(scratch); - return bake_params; + return result; } - diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 550162cc..6f16e3e4 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -5,271 +5,67 @@ #define RDI_FROM_DWARF_H //////////////////////////////// -//~ Conversion +//~ rjf: Unique Tag Tree Deduplication Types -typedef struct D2R_ConvertParams +typedef enum D2R2_UniqueTagKind { - String8 dbg_name; - String8 dbg_data; - String8 exe_name; - String8 exe_data; - ExecutableImageKind exe_kind; - RDIM_SubsetFlags subset_flags; - B32 deterministic; - B32 is_parse_relaxed; -} D2R_ConvertParams; + D2R2_UniqueTagKind_Type, + D2R2_UniqueTagKind_Namespace, + D2R2_UniqueTagKind_COUNT +} +D2R2_UniqueTagKind; -#define D2R_UNIT_CHUNK_CAP 512 -#define D2R_UDT_CHUNK_CAP 1024 -#define D2R_TYPE_CHUNK_CAP 1024 -#define D2R_SRC_FILE_CAP 1024 -#define D2R_LINE_TABLE_CAP 1024 -#define D2R_GVAR_CHUNK_CAP 1024 -#define D2R_TVAR_CHUNK_CAP 1024 -#define D2R_LOCATIONS_CAP 4096 -#define D2R_PROC_CHUNK_CAP 4096 -#define D2R_SCOPE_CHUNK_CAP 4096 -#define D2R_INLINE_SITE_CHUNK_CAP 4096 - -typedef struct D2R_Shared +typedef struct D2R2_UniqueTagNode D2R2_UniqueTagNode; +struct D2R2_UniqueTagNode { - RDIM_TopLevelInfo top_level_info; - RDIM_BinarySectionList binary_sections; - RDIM_UnitChunkList units; - RDIM_UDTChunkList udts; - RDIM_TypeChunkList types; - RDIM_SrcFileChunkList src_files; - RDIM_LineTableChunkList line_tables; -} D2R_Shared; - -//////////////////////////////// -//~ Value Types - -typedef enum -{ - D2R_ArithmeticType_Null, - D2R_ArithmeticType_Signed, - D2R_ArithmeticType_Unsigned, - D2R_ArithmeticType_Float, -} D2R_ArithmeticType; - -#define D2R_ValueType_Signed_XList \ -X(S8, Signed, 1 ) \ -X(S16, Signed, 2 ) \ -X(S32, Signed, 4 ) \ -X(S64, Signed, 8 ) \ -X(S128, Signed, 16) \ -X(S256, Signed, 32) \ -X(S512, Signed, 64) - -#define D2R_ValueType_Unsigned_XList \ -X(U8, Unsigned, 1 ) \ -X(U16, Unsigned, 2 ) \ -X(U32, Unsigned, 4 ) \ -X(U64, Unsigned, 8 ) \ -X(U128, Unsigned, 16) \ -X(U256, Unsigned, 32) \ -X(U512, Unsigned, 64) - -#define D2R_ValueType_Float_XList \ -X(F16, Float, 2 ) \ -X(F32, Float, 4 ) \ -X(F48, Float, 6 ) \ -X(F64, Float, 8 ) \ -X(F80, Float, 10) \ -X(F96, Float, 12) \ -X(F128, Float, 16) - -#define D2R_ValueType_XList \ -X(Generic, Null, 0 ) \ -X(ImplicitValue, Null, 0 ) \ -X(Address, Unsigned, 0 ) \ -D2R_ValueType_Signed_XList \ -D2R_ValueType_Unsigned_XList \ -D2R_ValueType_Float_XList - -typedef enum -{ -#define X(t, ...) D2R_ValueType_##t, - D2R_ValueType_XList -#undef X - D2R_ValueType_Bool = D2R_ValueType_S8, -} D2R_ValueType; - -typedef struct D2R_ValueTypeNode -{ - D2R_ValueType type; - struct D2R_ValueTypeNode *next; -} D2R_ValueTypeNode; - -typedef struct D2R_ValueTypeStack -{ - U64 count; - D2R_ValueTypeNode *top; - D2R_ValueTypeNode *free_list; -} D2R_ValueTypeStack; - -//////////////////////////////// -//~ Type Table - -typedef struct D2R_TypeTable -{ - HashTable *ht; - RDIM_TypeChunkList *types; - U64 type_chunk_cap; - RDIM_Type **builtin_types; -} D2R_TypeTable; - -//////////////////////////////// -//~ Tag Iterator - -typedef DW_TagSpare D2R_TagFlags; -enum -{ - D2R_TagFlags_TypeConverted = (1 << 0), - D2R_TagFlags_UdtConverted = (1 << 1), + D2R2_UniqueTagNode *next; + D2R2_UniqueTagKind kind; + U64 hash; + U64 info_off; + U64 container_ancestor_info_off; + U64 order_idx; }; -typedef struct D2R_TagFrame +typedef struct D2R2_UnitDedupedTagNode D2R2_UnitDedupedTagNode; +struct D2R2_UnitDedupedTagNode { - DW_TagNode *node; - RDIM_Scope *scope; - struct D2R_TagFrame *next; -} D2R_TagFrame; + D2R2_UnitDedupedTagNode *next; + U64 src_info_off; + U64 dst_hash; +}; -typedef struct D2R_TagIterator +typedef struct D2R2_UnitDedupedTagMap D2R2_UnitDedupedTagMap; +struct D2R2_UnitDedupedTagMap { - D2R_TagFrame *free_list; - D2R_TagFrame *stack; - DW_TagNode *null_tag_node; - DW_TagNode *tag_node; - B32 visit_children; -} D2R_TagIterator; + D2R2_UnitDedupedTagNode **slots; + U64 slots_count; +}; //////////////////////////////// -//~ Line Table Conversion +//~ rjf: Conversion Stage Inputs (New) -typedef struct D2R_SrcFileLookup +typedef struct D2R2_ConvertParams D2R2_ConvertParams; +struct D2R2_ConvertParams { - DW_LineFile *file; - DW_LineVM *vm; - RDIM_SrcFile *src_file; -} D2R_SrcFileLookup; + String8 exe_name; + String8 exe_data; + Arch arch; + U64 base_vaddr; + RDIM_BinarySectionList binary_sections; + DW_Raw raw; + PathStyle path_style; + RDIM_SubsetFlags subset_flags; + B32 deterministic; +}; //////////////////////////////// -//~ Contrib Map +//~ rjf: Helpers -typedef struct D2R_CompUnitContribMap -{ - U64 count; - U64 *info_off_arr; - RDIM_Rng1U64ChunkList *voff_range_arr; -} D2R_CompUnitContribMap; +internal int d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r); //////////////////////////////// -//~ RDIM Bytecode Extensions +//~ rjf: Main Conversion Entry Point (New) -internal B32 rdim_is_eval_bytecode_static (RDIM_EvalBytecode bc); -internal B32 rdim_static_eval_bytecode_to_voff(RDIM_EvalBytecode bc, U64 image_base, U64 *voff_out); - -//////////////////////////////// -//~ DWARF -> RDI Enums - -internal RDI_Language d2r_rdi_language_from_dw_language(DW_Language v); -internal RDI_RegCodeX64 d2r_rdi_reg_code_from_dw_reg_x64 (DW_RegX64 v); -internal RDI_RegCode d2r_rdi_reg_code_from_dw_reg (Arch arch, DW_Reg v); - -//////////////////////////////// -//~ Value Type - -internal D2R_ValueTypeNode * d2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type); -internal D2R_ValueType d2r_value_type_stack_pop (D2R_ValueTypeStack *stack); -internal D2R_ValueType d2r_value_type_stack_peek(D2R_ValueTypeStack *stack); - -internal D2R_ValueType d2r_signed_value_type_from_bit_size (U64 bit_size); -internal D2R_ValueType d2r_unsigned_value_type_from_bit_size(U64 bit_size); -internal D2R_ValueType d2r_float_type_from_bit_size (U64 bit_size); - -internal U64 d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type); -internal D2R_ArithmeticType d2r_arithmetic_type_from_value_type(D2R_ValueType v); -internal D2R_ArithmeticType d2r_arithmetic_type_from_value_type(D2R_ValueType v); -internal B32 d2r_is_value_type_signed (D2R_ValueType v); -internal B32 d2r_is_value_type_integral(D2R_ValueType v); -internal B32 d2r_is_value_type_unsigned(D2R_ValueType v); -internal B32 d2r_is_value_type_float (D2R_ValueType v); - -internal D2R_ValueType d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs); -internal RDI_EvalTypeGroup d2r_value_type_to_rdi(D2R_ValueType v); - -internal D2R_ValueType d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc); -internal void d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); -internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); - -//////////////////////////////// -//~ Expression Conversion - -internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); -internal RDIM_Location d2r_transpile_expression (Arena *arena, DW_Raw *input, U64 image_base, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr); -internal RDIM_Location d2r_location_from_attrib (Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_locset_from_attrib (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal RDIM_LocationCaseList d2r_var_locset_from_tag (Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, DW_Raw *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag); - -//////////////////////////////// -//~ Type Table - -internal RDIM_Type * d2r_create_type (Arena *arena, D2R_TypeTable *type_table); -internal RDIM_Type * d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off); -internal RDIM_Type * d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off); -internal RDIM_Type * d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind); - -//////////////////////////////// -//~ Tag Iterator - -internal D2R_TagIterator * d2r_tag_iterator_init(Arena *arena, DW_TagNode *root); -internal void d2r_tag_iterator_next(Arena *arena, D2R_TagIterator *iter); -internal void d2r_tag_iterator_skip_children (D2R_TagIterator *iter); -internal DW_TagNode * d2r_tag_iterator_parent_tag_node(D2R_TagIterator *iter); -internal DW_Tag d2r_tag_iterator_parent_tag (D2R_TagIterator *iter); - -//////////////////////////////// -//~ Type Conversion - -internal void d2r_flag_converted_tag(DW_TagNode *tag_node); -internal B8 d2r_is_tag_converted (DW_TagNode *tag_node); -internal RDIM_Type * d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_Tag tag, DW_AttribKind kind); -internal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, Arch arch, DW_TagNode *root); - -//////////////////////////////// -//~ UDT Conversion - -internal B8 d2r_is_udt_tag_converted (DW_TagNode *tag_node); -internal void d2r_flag_converted_udt_tag(DW_TagNode *tag_node); -internal void d2r_inline_anonymous_udt_member(Arena *arena, RDIM_UDT *top_udt, U64 base_off, RDIM_UDT *udt); -internal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, DW_TagNode *root); - -//////////////////////////////// -//~ Symbol Conversion - -internal RDIM_Scope * d2r_push_scope (Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges); -internal RDIM_Type ** d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out); -internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Raw *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag); -internal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Raw *input, DW_CompUnit *cu, DW_Language cu_lang, U64 image_base, Arch arch, DW_TagNode *root, RDIM_Unit *unit_rdi); - -//////////////////////////////// -//~ Line Table Conversion - -internal U64 d2r_hash_line_file(String8 dir_path, DW_LineFile *file); -internal void d2r_sort_ptrs(void **ptrs, U64 count, int (* is_before)(void *a, void *b)); - -//////////////////////////////// -//~ Contrib Map - -internal D2R_CompUnitContribMap d2r_cu_contrib_map_from_aranges(Arena *arena, DW_Raw *input, U64 image_base); -internal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off); - -//////////////////////////////// -//~ Entry Point - -internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params); +internal RDIM_BakeParams d2r2_convert(Arena *arena, D2R2_ConvertParams *params); #endif // RDI_FROM_DWARF_H diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.c b/src/rdi_from_dwarf/rdi_from_dwarf_2.c deleted file mode 100644 index 61ed73bc..00000000 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.c +++ /dev/null @@ -1,4392 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Helpers - -internal int -d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r) -{ - int is_less_than = (l[0]->hash < r[0]->hash); - return is_less_than; -} - -//////////////////////////////// -//~ rjf: Main Conversion Entry Point (New) - -internal RDIM_BakeParams -d2r2_convert(Arena *arena, D2R2_ConvertParams *params) -{ - Temp scratch = scratch_begin(&arena, 1); - DW_Raw *raw = ¶ms->raw; - RDIM_BinarySectionList binary_sections = params->binary_sections; - Arch arch = params->arch; - ARCH_Info *arch_info = arch_info_from_arch(arch); - U64 base_vaddr = params->base_vaddr; - U64 arch_addr_size = byte_size_from_arch(arch); - - //////////////////////////// - //- rjf: determine acceptable address range - // - // in many cases, linkers seem to trample over addresses in various DWARF sections, - // potentially due to optimizations. we'd like to filter out those busted addresses - // from our final debug info - a good enough heuristic is to disqualify them by - // whether or not they actually fall into the ranges covered by the binary sections. - // - Rng1U64 acceptable_vaddr_range = {0}; - { - acceptable_vaddr_range.min = max_U64; - acceptable_vaddr_range.max = 0; - for EachNode(n, RDIM_BinarySectionNode, binary_sections.first) - { - acceptable_vaddr_range.min = Min(base_vaddr + n->v.voff_first, acceptable_vaddr_range.min); - acceptable_vaddr_range.max = Max(base_vaddr + n->v.voff_opl, acceptable_vaddr_range.max); - } - } - - //////////////////////////// - //- rjf: compute exe hash - // - U64 exe_hash = 0; - ProfScope("compute exe hash") - { - if(lane_idx() == 0) - { - exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); - } - lane_sync_u64(&exe_hash, 0); - } - - //////////////////////////// - //- rjf: produce top-level-info - // - RDIM_TopLevelInfo top_level_info = {0}; - ProfScope("produce top-level-info") - { - top_level_info.arch = rdi_arch_from_arch(arch); - top_level_info.exe_name = params->exe_name; - top_level_info.exe_hash = exe_hash; - top_level_info.voff_max = acceptable_vaddr_range.max - base_vaddr; - if(!params->deterministic) - { - // TODO(rjf): top_level_info.guid = ...; - top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); - } - } - - //////////////////////////// - //- rjf: gather unit ranges from .debug_info, .debug_aranges - // - Rng1U64Array *unit_info_ranges = 0; - Rng1U64Array *unit_arange_ranges = 0; - ProfScope("gather unit ranges from .debug_info, .debug_aranges") if(lane_idx() == 0) - { - unit_info_ranges = push_array(scratch.arena, Rng1U64Array, 1); - *unit_info_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_Info].data); - unit_arange_ranges = push_array(scratch.arena, Rng1U64Array, 1); - *unit_arange_ranges = dw2_unit_ranges_from_data(scratch.arena, raw->sec[DW_SectionKind_ARanges].data); - } - lane_sync_u64(&unit_info_ranges, 0); - lane_sync_u64(&unit_arange_ranges, 0); - U64 unit_count = unit_info_ranges->count; - - //////////////////////////// - //- rjf: parse all .debug_info unit headers - // - DW2_UnitHeader *unit_headers = 0; - Rng1U64 *unit_info_tag_ranges = 0; - ProfScope("parse all unit headers") - { - // rjf: set up - if(lane_idx() == 0) - { - unit_headers = push_array(scratch.arena, DW2_UnitHeader, unit_count); - unit_info_tag_ranges = push_array(scratch.arena, Rng1U64, unit_count); - } - lane_sync_u64(&unit_headers, 0); - lane_sync_u64(&unit_info_tag_ranges, 0); - - // rjf: parse all unit headers - String8 data = raw->sec[DW_SectionKind_Info].data; - Rng1U64 range = lane_range(unit_count); - for EachInRange(idx, range) - { - Rng1U64 unit_info_range = unit_info_ranges->v[idx]; - U64 bytes_read = dw2_read_unit_header(str8_substr(data, unit_info_range), 0, &unit_headers[idx]); - unit_info_tag_ranges[idx] = r1u64(unit_info_range.min + bytes_read, unit_info_range.max); - } - } - lane_sync(); - Rng1U64Array unit_info_tag_ranges_array = {unit_info_tag_ranges, unit_count}; - - //////////////////////////// - //- rjf: parse all units from .debug_aranges - // - U64 *arange_info_offs = 0; - RDIM_Rng1U64ChunkList *arange_voff_ranges = 0; - { - if(lane_idx() == 0) - { - arange_info_offs = push_array(scratch.arena, U64, unit_arange_ranges->count); - arange_voff_ranges = push_array(scratch.arena, RDIM_Rng1U64ChunkList, unit_arange_ranges->count); - } - lane_sync_u64(&arange_info_offs, 0); - lane_sync_u64(&arange_voff_ranges, 0); - U64 unit_take_idx_ = 0; - U64 *unit_take_idx_ptr = &unit_take_idx_; - lane_sync_u64(&unit_take_idx_ptr, 0); - String8 data = raw->sec[DW_SectionKind_ARanges].data; - for(;;) - { - // rjf: take unit - U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; - if(unit_idx >= unit_arange_ranges->count) - { - break; - } - - // rjf: unpack - Rng1U64 arange_range = unit_arange_ranges->v[unit_idx]; - U64 off = arange_range.min; - - // rjf: read unit data size / format - U64 unit_size = 0; - DW_Format fmt = 0; - off += dw2_read_initial_length(data, off, &unit_size, &fmt); - U64 unit_opl = off + unit_size; - - // rjf: read version - DW_Version version = 0; - U64 version_off = off; - off += str8_deserial_read_struct(data, off, &version); - - // rjf: warn on non-version 2 - if(version != DW_Version_2) - { - log_infof("[.debug_aranges@0x%I64x] DWARF version for unit #%I64d was expected to be 2, but it was read as %i.\n", version_off, unit_idx, (S32)version); - } - - // rjf: read .debug_info off for this unit - U64 info_off = 0; - off += dw2_read_fmt_u64(data, off, fmt, &info_off); - - // rjf: read address / segment selector size - U8 addr_size = 0; - U8 segment_selector_size = 0; - off += str8_deserial_read_struct(data, off, &addr_size); - off += str8_deserial_read_struct(data, off, &segment_selector_size); - - // rjf: round up past padding - { - U64 tuple_size = addr_size*2 + segment_selector_size; - off += tuple_size - (off%tuple_size); - } - - // rjf: parse ranges - RDIM_Rng1U64ChunkList voff_ranges = {0}; - if(segment_selector_size != 0) - { - log_infof("[.debug_aranges@0x%I64x] Non-zero (%i) segment selector size parsed; this form of addressing is not currently supported in DWARF info.\n", off, (S32)segment_selector_size); - } - else for(;off < unit_opl;) - { - U64 start_off = off; - U64 base_addr = 0; - U64 range_size = 0; - off += str8_deserial_read(data, off, &base_addr, addr_size, addr_size); - off += str8_deserial_read(data, off, &range_size, addr_size, addr_size); - if(base_addr == 0 && range_size == 0) - { - break; - } - if(base_addr < base_vaddr) - { - log_infof("[.debug_aranges@0x%I64x] Address (0x%I64x) parsed which was less than the image base address (0x%I64x). Skipping.\n", start_off, base_addr, base_vaddr); - } - else - { - U64 voff_first = (base_addr - base_vaddr); - U64 voff_opl = voff_first + range_size; - RDIM_Rng1U64 range = {voff_first, voff_opl}; - rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, range); - } - if(off == start_off) - { - break; - } - } - - // rjf: store - arange_info_offs[unit_idx] = info_off; - arange_voff_ranges[unit_idx] = voff_ranges; - } - lane_sync(); - } - - //////////////////////////// - //- rjf: produce info_off -> list(voff_range) map from aranges units; - // we must do this because technically we can't guarantee that unit_idxs - // inside of .debug_aranges are the same as unit_idxs inside of .debug_info, - // nor can we guarantee that they'd be in the same order, so we need to - // correllate via the encoded .debug_info offset from .debug_aranges. - // - // more excellence. - // - typedef struct D2R2_ARangeUnitNode D2R2_ARangeUnitNode; - struct D2R2_ARangeUnitNode - { - D2R2_ARangeUnitNode *next; - U64 info_off; - RDIM_Rng1U64ChunkList *ranges; - }; - U64 arange_unit_from_info_off_map_slots_count = unit_arange_ranges->count; - D2R2_ARangeUnitNode **arange_unit_from_info_off_map_slots = 0; - { - if(lane_idx() == 0) - { - arange_unit_from_info_off_map_slots = push_array(scratch.arena, D2R2_ARangeUnitNode *, arange_unit_from_info_off_map_slots_count); - } - lane_sync_u64(&arange_unit_from_info_off_map_slots, 0); - for EachIndex(arange_unit_idx, unit_arange_ranges->count) - { - U64 info_off = arange_info_offs[arange_unit_idx]; - RDIM_Rng1U64ChunkList *ranges = &arange_voff_ranges[arange_unit_idx]; - U64 hash = u64_hash_from_str8(str8_struct(&info_off)); - U64 slot_idx = hash%arange_unit_from_info_off_map_slots_count; - D2R2_ARangeUnitNode *n = push_array(scratch.arena, D2R2_ARangeUnitNode, 1); - SLLStackPush(arange_unit_from_info_off_map_slots[slot_idx], n); - n->info_off = info_off; - n->ranges = ranges; - } - } - lane_sync(); - - //////////////////////////// - //- rjf: build all abbreviation maps, build (unit -> abbrev map) - // - DW2_UnitAbbrevMapMap unit_abbrev_map_map = dw2_unit_abbrev_map_map_from_data(scratch.arena, raw->sec[DW_SectionKind_Abbrev].data, unit_headers, unit_count); - - //////////////////////////// - //- rjf: parse all unit offsets tables - // - // on .debug_str_offsets, as one example: - // - // in an incredible twist of fate, DWARF decided to decouple these from - // compilation units. compilation units *do* contain a - // DW_AttribKind_StrOffsetsBase attribute. but this base offset does *not* - // point to the beginning of a table in .debug_str_offsets! it instead points - // PAST THE INITIAL VARIABLE-WIDTH LENGTH AND FORMAT ENCODING! this means - // you can't actually use the StrOffsetsBase attribute for ANYTHING other - // than correllating a unit to its associated string offset table - but you - // *necessarily needed to have parsed that table beforehand*, completely - // independently from units. - // - // so, we have to parse all the string offset tables up-front, then - // *binary search* their ranges to determine which unit has which table. - // - // of course, in practice, it's perhaps likely/expected that these match - // one-to-one with units, and in the same order, because that is what is - // most natural for generators. but, the format does not *guarantee this*, - // and instead specced something far more arbitrary. - // - // thank you, again, DWARF. - // - DW2_OffsetTableSet *offset_tables = 0; - ProfScope("parse all offset tables (.debug_rnglists, .debug_str_offsets, .debug_addr, .debug_loclists)") if(lane_idx() == 0) - { - offset_tables = push_array(scratch.arena, DW2_OffsetTableSet, 1); - offset_tables[0] = dw2_offset_table_set_from_raw(scratch.arena, raw); - } - lane_sync_u64(&offset_tables, 0); - - //////////////////////////// - //- rjf: build per-unit parsing contexts, parse compilation unit tags - // - DW2_ParseCtx *unit_parse_ctxs = 0; - DW2_Tag *unit_root_tags = 0; - { - if(lane_idx() == 0) - { - unit_parse_ctxs = push_array(scratch.arena, DW2_ParseCtx, unit_count); - unit_root_tags = push_array(scratch.arena, DW2_Tag, unit_count); - } - lane_sync_u64(&unit_parse_ctxs, 0); - lane_sync_u64(&unit_root_tags, 0); - Rng1U64 range = lane_range(unit_count); - for EachInRange(unit_idx, range) - { - DW2_UnitHeader *hdr = &unit_headers[unit_idx]; - DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; - - // rjf: equip initial info - just enough to do a bootstrapping parse of the root tag - dw2_parse_ctx_equip_unit_header(ctx, hdr, unit_info_ranges->v[unit_idx].min); - dw2_parse_ctx_equip_unit_abbrev_map(ctx, &unit_abbrev_map_map, unit_idx); - - // rjf: do bootstrapping parse - // - // an incredible NOTE: the above context info is actually not sufficient for general - // parsing, because this "bootstrapping" tag parse is what informs us which - // .debug_str_offsets table each unit should be associated with (via the - // StrOffsetsBase attribute), we actually don't have the right string offset table - // *before* we parse this, which means we can't resolve some of the string attribute - // values. - // - // so, in another incredible twist of fate, we actually must do this *twice*. first, - // to find *just the StrOffsetsBase*, and then, to actually fully resolve everything. - // - // (all of the above is also true for RngListsBase) - // - DW2_Tag root_tag_bootstrap = {0}; - dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &root_tag_bootstrap); - - // rjf: equip info extracted from bootstrapping parse - dw2_parse_ctx_equip_unit_root_tag(ctx, &root_tag_bootstrap, offset_tables); - - // rjf: do non-bootstrapping parse - dw2_read_tag(scratch.arena, raw, ctx, raw->sec[DW_SectionKind_Info].data, unit_info_tag_ranges[unit_idx].min, &unit_root_tags[unit_idx]); - - // rjf: equip info extracted from non-bootstrapping parse - dw2_parse_ctx_equip_unit_root_tag(ctx, &unit_root_tags[unit_idx], offset_tables); - } - } - lane_sync(); - - //////////////////////////// - //- rjf: parse each unit's line table header - // - DW2_LineTableHeader *unit_line_table_headers = 0; - ProfScope("parse each unit's line table header") - { - if(lane_idx() == 0) - { - unit_line_table_headers = push_array(scratch.arena, DW2_LineTableHeader, unit_count); - } - lane_sync_u64(&unit_line_table_headers, 0); - U64 unit_take_idx = 0; - U64 *unit_take_idx_ptr = &unit_take_idx; - lane_sync_u64(&unit_take_idx_ptr, 0); - for(;;) - { - U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; - if(unit_idx >= unit_count) - { - break; - } - DW2_ParseCtx *ctx = &unit_parse_ctxs[unit_idx]; - DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; - DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); - U64 line_info_off = stmt_list->val.u128.u64[0]; - String8 line_info_data = raw->sec[DW_SectionKind_Line].data; - dw2_read_line_table_header(scratch.arena, raw, ctx, line_info_data, line_info_off, &unit_line_table_headers[unit_idx]); - } - lane_sync(); - } - - //////////////////////////// - //- rjf: deduplicate all source files - // - typedef struct UnitSrcFileMap UnitSrcFileMap; - struct UnitSrcFileMap - { - RDIM_SrcFile **v; - }; - RDIM_SrcFileChunkList *all_src_files = 0; - UnitSrcFileMap *unit_src_file_maps = 0; - ProfScope("deduplicate all source files") if(lane_idx() == 0) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - //- rjf: count all files in all units - U64 total_file_count = 0; - for EachIndex(unit_idx, unit_count) - { - total_file_count += unit_line_table_headers[unit_idx].files.count; - } - - //- rjf: set up path -> src file map - typedef struct SrcFileNode SrcFileNode; - struct SrcFileNode - { - SrcFileNode *next; - String8 full_path; - RDIM_SrcFile *src_file; - }; - all_src_files = push_array(scratch.arena, RDIM_SrcFileChunkList, 1); - U64 slots_count = 1 + (total_file_count * 3) / 4; - SrcFileNode **slots = push_array(scratch2.arena, SrcFileNode *, slots_count); - - //- rjf: set up unit -> src file maps - unit_src_file_maps = push_array(scratch.arena, UnitSrcFileMap, unit_count); - for EachIndex(unit_idx, unit_count) - { - unit_src_file_maps[unit_idx].v = push_array(scratch.arena, RDIM_SrcFile *, unit_line_table_headers[unit_idx].files.count); - } - - //- rjf: build path -> src file map - for EachIndex(unit_idx, unit_count) - { - DW2_LineTableHeader *hdr = &unit_line_table_headers[unit_idx]; - for EachIndex(file_idx, hdr->files.count) - { - DW2_LineTableFile *f = &hdr->files.v[file_idx]; - DW2_LineTableFile *dir = &hdr->dirs.v[f->dir_idx]; - String8 full_file_path = str8f(scratch2.arena, "%S%s%S", dir->file_name, dir->file_name.size != 0 ? "/" : "", f->file_name); - U64 hash = u64_hash_from_str8(full_file_path); - U64 slot_idx = hash%slots_count; - SrcFileNode *node = 0; - for(SrcFileNode *n = slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->full_path, full_file_path, 0)) - { - node = n; - break; - } - } - if(!node) - { - node = push_array(scratch2.arena, SrcFileNode, 1); - node->full_path = full_file_path; - node->src_file = rdim_src_file_chunk_list_push(arena, all_src_files, slots_count); - node->src_file->path = str8_copy(arena, full_file_path); - if(f->flags & DW2_LineTableFileFlag_HasMD5) - { - node->src_file->checksum_kind = RDI_ChecksumKind_MD5; - node->src_file->checksum = str8_copy(arena, str8_struct(&f->md5)); - } - else if(f->flags & DW2_LineTableFileFlag_HasModifyTime) - { - node->src_file->checksum_kind = RDI_ChecksumKind_Timestamp; - node->src_file->checksum = str8_copy(arena, str8_struct(&f->modify_time)); - } - } - unit_src_file_maps[unit_idx].v[file_idx] = node->src_file; - } - } - scratch_end(scratch2); - } - lane_sync_u64(&all_src_files, 0); - lane_sync_u64(&unit_src_file_maps, 0); - - //////////////////////////// - //- rjf: parse each unit's line info; produce line tables - // - RDIM_LineTableChunkList *unit_line_table_chunk_lists = 0; - RDIM_LineTable **unit_line_tables = 0; - ProfScope("parse each unit's line info; produce line tables") - { - //- rjf: prep outputs - typedef struct LineSeqChunk LineSeqChunk; - struct LineSeqChunk - { - LineSeqChunk *next; - U64 *voffs; - U32 *line_nums; - U16 *col_nums; - U64 line_count; - U64 line_cap; - }; - typedef struct FileSeqNode FileSeqNode; - struct FileSeqNode - { - FileSeqNode *next; - RDIM_SrcFile *src_file; - RDIM_SrcFileLineMapFragment *first_line_map_fragment; - RDIM_SrcFileLineMapFragment *last_line_map_fragment; - }; - typedef struct FileSeqMap FileSeqMap; - struct FileSeqMap - { - U64 slots_count; - FileSeqNode **slots; - }; - FileSeqMap *unit_file_seq_maps = 0; - if(lane_idx() == 0) - { - unit_line_table_chunk_lists = push_array(scratch.arena, RDIM_LineTableChunkList, unit_count); - unit_line_tables = push_array(scratch.arena, RDIM_LineTable *, unit_count); - unit_file_seq_maps = push_array(scratch.arena, FileSeqMap, unit_count); - } - lane_sync_u64(&unit_line_table_chunk_lists, 0); - lane_sync_u64(&unit_line_tables, 0); - lane_sync_u64(&unit_file_seq_maps, 0); - - //- rjf: wide per-unit parse - U64 unit_take_idx = 0; - U64 *unit_take_idx_ptr = &unit_take_idx; - lane_sync_u64(&unit_take_idx_ptr, 0); - for(;;) - { - //- rjf: take unit - U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; - if(unit_idx >= unit_count) - { - break; - } - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - //- rjf: unpack unit info - DW2_LineTableHeader *line_table_header = &unit_line_table_headers[unit_idx]; - RDIM_LineTableChunkList *dst_line_tables = &unit_line_table_chunk_lists[unit_idx]; - DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; - DW2_Attrib *stmt_list = dw2_attrib_from_kind(unit_root_tag, DW_AttribKind_StmtList); - U64 line_info_off = stmt_list->val.u128.u64[0]; - String8 all_line_info_data = raw->sec[DW_SectionKind_Line].data; - String8 unit_line_table_data = str8_substr(all_line_info_data, r1u64(line_table_header->line_program_off, line_info_off + line_table_header->total_unit_data_size)); - - //- rjf: build unit's line table - RDIM_LineTable *dst_line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 1); - unit_line_tables[unit_idx] = dst_line_table; - - //- rjf: set up per-unit file sequence map - unit_file_seq_maps[unit_idx].slots_count = line_table_header->files.count + 1; - unit_file_seq_maps[unit_idx].slots = push_array(scratch.arena, FileSeqNode *, unit_file_seq_maps[unit_idx].slots_count); - - //- rjf: set up vm registers - DW2_LineVMRegs vm_regs = {0}; - { - vm_regs.file_index = 1; - vm_regs.line = 1; - vm_regs.is_stmt = line_table_header->default_is_stmt; - } - - //- rjf: run the line opcode program - B32 emit_line = 0; - RDIM_SrcFile *line_seq_src_file = 0; - LineSeqChunk *first_line_seq_chunk = 0; - LineSeqChunk *last_line_seq_chunk = 0; - U64 total_line_seq_count = 0; - for(U64 off = 0, next_off = 0; off <= unit_line_table_data.size; off = next_off) - { - next_off = unit_line_table_data.size; - - //- rjf: read next opcode - U64 op_read_off = off; - U8 opcode = 0; - str8_deserial_read_struct(unit_line_table_data, op_read_off, &opcode); - op_read_off += 1; - - //- rjf: apply "special opcodes" (DWARF v5 6.2.5.1) - if(opcode >= line_table_header->opcode_base) - { - U32 adjusted_opcode = (U32)(opcode - line_table_header->opcode_base); - U32 op_advance = adjusted_opcode / line_table_header->line_range; - S64 line_advance = (S64)line_table_header->line_base + (S64)adjusted_opcode%(S64)line_table_header->line_range; - U64 addr_advance = line_table_header->min_inst_length * (vm_regs.vliw_op_index + op_advance) / line_table_header->max_ops_per_inst; - vm_regs.address += addr_advance; - vm_regs.vliw_op_index = (vm_regs.vliw_op_index + op_advance) % line_table_header->max_ops_per_inst; - vm_regs.line += line_advance; - emit_line = 1; - } - - //- rjf: apply standard opcode - else - { - U64 op_advance = 0; - switch(opcode) - { - //- rjf: skip unknown opcode - default: - { - for EachIndex(uleb_idx, line_table_header->opcode_lengths[opcode - 1]) - { - U64 v = 0; - op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &v); - } - }break; - - //- rjf: line emissions - case DW_StdOpcode_Copy: - { - emit_line = 1; - }break; - - //- rjf: PC advances - case DW_StdOpcode_AdvancePc: - { - op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &op_advance); - }goto advance_pc; - case DW_StdOpcode_ConstAddPc: - { - op_advance = (0xffu - line_table_header->opcode_base) / line_table_header->line_range; - }goto advance_pc; - advance_pc:; - { - U64 op_index = vm_regs.vliw_op_index + op_advance; - vm_regs.address += line_table_header->min_inst_length * (op_index / line_table_header->max_ops_per_inst); - vm_regs.vliw_op_index = op_index % line_table_header->max_ops_per_inst; - }break; - - //- rjf: fixed PC advances - case DW_StdOpcode_FixedAdvancePc: - { - U16 fixed_advance = 0; - str8_deserial_read_struct(unit_line_table_data, op_read_off, &fixed_advance); - op_read_off += sizeof(U16); - vm_regs.address += fixed_advance; - vm_regs.vliw_op_index = 0; - }break; - - //- rjf: line number advance - case DW_StdOpcode_AdvanceLine: - { - S64 advance = 0; - op_read_off += str8_deserial_read_sleb128(unit_line_table_data, op_read_off, &advance); - vm_regs.line += advance; - }break; - - //- rjf: set file - case DW_StdOpcode_SetFile: - { - op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.file_index); - }break; - - //- rjf: set column - case DW_StdOpcode_SetColumn: - { - op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.column); - }break; - - //- rjf: negate statment - case DW_StdOpcode_NegateStmt: - { - vm_regs.is_stmt = !vm_regs.is_stmt; - }break; - - //- rjf: flag sets - case DW_StdOpcode_SetBasicBlock: - { - vm_regs.basic_block = 1; - }break; - case DW_StdOpcode_SetPrologueEnd: - { - vm_regs.prologue_end = 1; - }break; - case DW_StdOpcode_SetEpilogueBegin: - { - vm_regs.epilogue_begin = 1; - }break; - - //- rjf: isa - case DW_StdOpcode_SetIsa: - { - op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &vm_regs.isa); - }break; - - //- rjf: extended opcode - case DW_StdOpcode_ExtendedOpcode: - { - // rjf: read extended opcode size - U64 ext_opcode_size = 0; - op_read_off += str8_deserial_read_uleb128(unit_line_table_data, op_read_off, &ext_opcode_size); - - // rjf: read extended opcode - U8 ext_opcode = 0; - op_read_off += str8_deserial_read_struct(unit_line_table_data, op_read_off, &ext_opcode); - - // rjf: grab truncated data for just this extended opcode - String8 ext_op_data = str8_prefix(unit_line_table_data, op_read_off + ext_opcode_size); - - // rjf: do extended opcode - switch(ext_opcode) - { - default: - case DW_ExtOpcode_Undefined: - case DW_ExtOpcode_UserLo: - case DW_ExtOpcode_UserHi: - {}break; - case DW_ExtOpcode_EndSequence: - { - emit_line = 1; - vm_regs.end_sequence = 1; - }break; - case DW_ExtOpcode_SetAddress: - { - U64 addr = 0; - op_read_off += str8_deserial_read(ext_op_data, op_read_off, &addr, line_table_header->addr_size, line_table_header->addr_size); - vm_regs.address = addr; - vm_regs.vliw_op_index = 0; - }break; - case DW_ExtOpcode_DefineFile: - { - String8 file_name = {0}; - U64 dir_idx = 0; - U64 modify_time = 0; - U64 file_size = 0; - op_read_off += str8_deserial_read_cstr(ext_op_data, op_read_off, &file_name); - op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &dir_idx); - op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &modify_time); - op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &file_size); - // - // TODO(rjf): this is a real problem, because at this point, we've already gathered & deduped - // all source files, but now we're in a situation where a per-lane line info parse can produce - // new source files, which may - of course - be duplicates of files defined in other unit line - // info. - // - }break; - case DW_ExtOpcode_SetDiscriminator: - { - op_read_off += str8_deserial_read_uleb128(ext_op_data, op_read_off, &vm_regs.discriminator); - }break; - } - }break; - } - } - - //- rjf: advance to next op - if(op_read_off > off) - { - next_off = op_read_off; - } - - //- rjf: map file index -> rdim src file - RDIM_SrcFile *src_file = 0; - if(vm_regs.file_index < line_table_header->files.count) - { - src_file = unit_src_file_maps[unit_idx].v[vm_regs.file_index]; - } - - //- rjf: sequence ended explicitly, or file change, or end of stream? -> push to line table - if(line_seq_src_file != 0 && (vm_regs.end_sequence || (src_file != line_seq_src_file && first_line_seq_chunk != 0) || off >= unit_line_table_data.size)) - { - // rjf: combine voffs/lines/cols - U64 seq_line_count = total_line_seq_count; - U64 *seq_voffs = push_array(arena, U64, seq_line_count+1); - U32 *seq_lines = push_array(arena, U32, seq_line_count); - U16 *seq_cols = push_array(arena, U16, 2*seq_line_count); - { - U64 voff_idx = 0; - U64 line_idx = 0; - U64 col_idx = 0; - for(LineSeqChunk *c = first_line_seq_chunk; c != 0; c = c->next) - { - MemoryCopy(seq_voffs + voff_idx, c->voffs, sizeof(c->voffs[0]) * c->line_count); - MemoryCopy(seq_lines + line_idx, c->line_nums, sizeof(c->line_nums[0]) * c->line_count); - MemoryCopy(seq_cols + col_idx, c->col_nums, sizeof(c->col_nums[0]) * 2 * c->line_count); - voff_idx += c->line_count; - line_idx += c->line_count; - col_idx += 2*c->line_count; - } - seq_voffs[seq_line_count] = vm_regs.address - base_vaddr; - } - - // rjf: push sequence to line table - RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, dst_line_tables, dst_line_table, line_seq_src_file, seq_voffs, seq_lines, seq_cols, seq_line_count); - - // rjf: map src file -> file seq node - FileSeqNode *file_seq_n = 0; - { - U64 hash = u64_hash_from_str8(str8_struct(&line_seq_src_file)); - U64 slot_idx = hash%unit_file_seq_maps[unit_idx].slots_count; - for(FileSeqNode *n = unit_file_seq_maps[unit_idx].slots[slot_idx]; n != 0; n = n->next) - { - if(n->src_file == line_seq_src_file) - { - file_seq_n = n; - break; - } - } - if(file_seq_n == 0) - { - file_seq_n = push_array(scratch.arena, FileSeqNode, 1); - SLLStackPush(unit_file_seq_maps[unit_idx].slots[slot_idx], file_seq_n); - file_seq_n->src_file = line_seq_src_file; - } - } - - // rjf: record sequence in file seq node - { - RDIM_SrcFileLineMapFragment *f = push_array(scratch.arena, RDIM_SrcFileLineMapFragment, 1); - SLLQueuePush(file_seq_n->first_line_map_fragment, file_seq_n->last_line_map_fragment, f); - f->seq = seq; - } - - // rjf: reset - first_line_seq_chunk = last_line_seq_chunk = 0; - total_line_seq_count = 0; - line_seq_src_file = 0; - if(vm_regs.end_sequence) - { - MemoryZeroStruct(&vm_regs); - vm_regs.file_index = 1; - vm_regs.line = 1; - vm_regs.is_stmt = line_table_header->default_is_stmt; - } - } - - //- rjf: emit lines - if(emit_line && vm_regs.address != 0 && vm_regs.line != 0) - { - emit_line = 0; - - // rjf: grab the last emitted line info - U32 last_line = 0; - U16 last_col = 0; - if(last_line_seq_chunk != 0 && last_line_seq_chunk->line_count > 0) - { - last_line = last_line_seq_chunk->line_nums[last_line_seq_chunk->line_count-1]; - last_col = last_line_seq_chunk->col_nums[last_line_seq_chunk->line_count-1]; - } - - // rjf: determine if we need a new line - // - // TODO(rjf): in some cases this can trigger w/ DWARF due to columnar changes; - // we need to adjust this when we want to start correctly supporting columnar - // line info / stepping - // - B32 need_new_line = (last_line != (U32)vm_regs.line); - - // rjf: need new line -> grab chunk - LineSeqChunk *chunk = last_line_seq_chunk; - if(need_new_line && (chunk == 0 || chunk->line_count >= chunk->line_cap)) - { - chunk = push_array(scratch.arena, LineSeqChunk, 1); - SLLQueuePush(first_line_seq_chunk, last_line_seq_chunk, chunk); - chunk->line_cap = 64; - chunk->voffs = push_array(scratch.arena, U64, chunk->line_cap + 1); - chunk->line_nums = push_array(scratch.arena, U32, chunk->line_cap); - chunk->col_nums = push_array(scratch.arena, U16, 2*chunk->line_cap); - } - - // rjf: need new line -> push - if(need_new_line) - { - U64 chunk_line_idx = chunk->line_count; - chunk->voffs[chunk_line_idx] = vm_regs.address - base_vaddr; - chunk->line_nums[chunk_line_idx] = (U32)vm_regs.line; - chunk->col_nums[chunk_line_idx] = (U16)vm_regs.column; - chunk->line_count += 1; - total_line_seq_count += 1; - line_seq_src_file = src_file; - // NOTE(rjf): use for comparing against llvm-dwarfdump --debug-line -#if 0 - printf("0x%016I64x %6i %6i %6i %3i %13I64x %7i %s%s%s%s\n", - vm_regs.address, - (int)vm_regs.line, - (int)vm_regs.column, - (int)vm_regs.file_index, - (int)vm_regs.isa, - vm_regs.discriminator, - (int)vm_regs.vliw_op_index, - vm_regs.is_stmt ? " is_stmt" : "", - vm_regs.prologue_end ? " prologue_end" : "", - vm_regs.epilogue_begin ? " epilogue_begin" : "", - vm_regs.end_sequence ? " end_sequence" : ""); -#endif - } - vm_regs.discriminator = 0; - vm_regs.basic_block = 0; - vm_regs.prologue_end = 0; - vm_regs.epilogue_begin = 0; - } - } - - scratch_end(scratch2); - } - lane_sync(); - - //- rjf: equip source files with their fragments - // - // TODO(rjf): this can *almost* be wide, but we are relying on a few top-level - // summations inside the RDIM_SrcFileChunkList when we push a sequence to a src - // file. if we just summed those later when baking (probably fine), then this - // could go wide across all src files, which would be very nice. just lane-0ing - // for now. when possible, we can probably do the same thing in PDB too. - // - if(lane_idx() == 0) - { - for EachIndex(unit_idx, unit_count) - { - FileSeqMap *file_seq_map = &unit_file_seq_maps[unit_idx]; - for EachIndex(slot_idx, file_seq_map->slots_count) - { - for(FileSeqNode *n = file_seq_map->slots[slot_idx]; n != 0; n = n->next) - { - for(RDIM_SrcFileLineMapFragment *f = n->first_line_map_fragment; f != 0; f = f->next) - { - rdim_src_file_push_line_sequence(arena, all_src_files, n->src_file, f->seq); - } - } - } - } - } - lane_sync(); - } - - //////////////////////////// - //- rjf: join all line tables - // - RDIM_LineTableChunkList *all_line_tables = 0; - if(lane_idx() == 0) - { - all_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, 1); - for EachIndex(unit_idx, unit_count) - { - rdim_line_table_chunk_list_concat_in_place(all_line_tables, &unit_line_table_chunk_lists[unit_idx]); - } - } - lane_sync_u64(&all_line_tables, 0); - - //////////////////////////// - //- rjf: find all offsets of top-level tag trees across all units - // - U64Array *unit_info_root_tag_offs = 0; - U64 total_root_tag_count = 0; - U64 *total_root_tag_count_ptr = &total_root_tag_count; - lane_sync_u64(&total_root_tag_count_ptr, 0); - ProfScope("find all offsets of top-level tag trees across all units") - { - if(lane_idx() == 0) - { - unit_info_root_tag_offs = push_array(scratch.arena, U64Array, unit_count); - } - lane_sync_u64(&unit_info_root_tag_offs, 0); - typedef struct D2R2_UnitTagTreeOffChunkNode D2R2_UnitTagTreeOffChunkNode; - struct D2R2_UnitTagTreeOffChunkNode - { - D2R2_UnitTagTreeOffChunkNode *next; - U64 *v; - U64 count; - U64 cap; - }; - typedef struct D2R2_UnitTagTreeOffChunkList D2R2_UnitTagTreeOffChunkList; - struct D2R2_UnitTagTreeOffChunkList - { - D2R2_UnitTagTreeOffChunkNode *first; - D2R2_UnitTagTreeOffChunkNode *last; - U64 chunk_count; - U64 total_count; - }; - U64 unit_take_idx_ = 0; - U64 *unit_take_idx_ptr = &unit_take_idx_; - lane_sync_u64(&unit_take_idx_ptr, 0); - for(;;) - { - //- rjf: take the next unit - U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; - if(unit_idx >= unit_count) - { - break; - } - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - //- rjf: unpack this unit - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - - //- rjf: gather all offsets of root-level trees - D2R2_UnitTagTreeOffChunkList tree_offs = {0}; - S64 depth = 0; - for(U64 off = unit_info_tag_range.min; contains_1u64(unit_info_tag_range, off);) - { - U64 start_off = off; - Temp scratch3 = scratch_begin(&scratch2.arena, 1); - - //- rjf: if this next tag is root-level, gather - if(depth == 1) - { - D2R2_UnitTagTreeOffChunkNode *chunk = tree_offs.last; - if(chunk == 0 || chunk->count >= chunk->cap) - { - chunk = push_array(scratch2.arena, D2R2_UnitTagTreeOffChunkNode, 1); - chunk->cap = 512; - chunk->v = push_array(scratch2.arena, U64, chunk->cap); - SLLQueuePush(tree_offs.first, tree_offs.last, chunk); - tree_offs.chunk_count += 1; - } - chunk->v[chunk->count] = off; - chunk->count += 1; - tree_offs.total_count += 1; - } - - //- rjf: reading the next tag - DW2_Tag tag = {0}; - off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); - - //- rjf: do tree navigations - if(tag.has_children) - { - depth += 1; - } - if(tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - - scratch_end(scratch3); - if(off == start_off) - { - break; - } - } - - //- rjf: flatten & store - { - U64Array tree_offs_array = {0}; - tree_offs_array.count = tree_offs.total_count; - tree_offs_array.v = push_array(scratch.arena, U64, tree_offs_array.count); - { - U64 idx = 0; - for EachNode(n, D2R2_UnitTagTreeOffChunkNode, tree_offs.first) - { - MemoryCopy(tree_offs_array.v + idx, n->v, sizeof(n->v[0])*n->count); - idx += n->count; - } - } - unit_info_root_tag_offs[unit_idx] = tree_offs_array; - ins_atomic_u64_add_eval(total_root_tag_count_ptr, tree_offs_array.count); - } - - scratch_end(scratch2); - } - lane_sync(); - total_root_tag_count = *total_root_tag_count_ptr; - } - - //////////////////////////// - //- rjf: produce list of (unit * range(root_tag_idx)), so that we can easily - // subdivide work from all units across all lanes - // - typedef struct D2R2_SubUnitWork D2R2_SubUnitWork; - struct D2R2_SubUnitWork - { - U64 unit_idx; - Rng1U64 root_tag_idx_range; - }; - U64 sub_unit_works_count = 0; - D2R2_SubUnitWork *sub_unit_works = 0; - ProfScope("produce sub-unit work division") if(lane_idx() == 0) - { - U64 root_tags_per_work = 1024; - for(B32 build = 0; build <= 1; build += 1) - { - U64 sub_unit_work_idx = 0; - for EachIndex(unit_idx, unit_count) - { - U64 root_tags_in_this_unit = unit_info_root_tag_offs[unit_idx].count; - U64 works_per_this_unit = (root_tags_in_this_unit+root_tags_per_work-1) / root_tags_per_work; - if(build) - { - D2R2_SubUnitWork *works = sub_unit_works + sub_unit_work_idx; - U64 works_count = works_per_this_unit; - U64 root_tag_idx = 0; - for EachIndex(work_idx, works_count) - { - U64 root_tag_idx_opl = root_tag_idx + root_tags_per_work; - root_tag_idx_opl = ClampTop(root_tag_idx_opl, root_tags_in_this_unit); - works[work_idx].unit_idx = unit_idx; - works[work_idx].root_tag_idx_range = r1u64(root_tag_idx, root_tag_idx_opl); - root_tag_idx = root_tag_idx_opl; - } - } - sub_unit_work_idx += works_per_this_unit; - } - if(!build) - { - sub_unit_works_count = sub_unit_work_idx; - sub_unit_works = push_array(scratch.arena, D2R2_SubUnitWork, sub_unit_works_count); - } - } - } - lane_sync_u64(&sub_unit_works_count, 0); - lane_sync_u64(&sub_unit_works, 0); - - //////////////////////////// - //- rjf: build built-in types - // - RDIM_TypeChunkList *builtin_types = 0; - RDIM_Type **builtin_type_from_kind_map = 0; // [RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1] - U64 builtin_type_count = RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1; - ProfScope("build built-in types") if(lane_idx() == 0) - { - builtin_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); - builtin_type_from_kind_map = push_array(scratch.arena, RDIM_Type *, builtin_type_count); - for(RDI_TypeKind k = RDI_TypeKind_FirstBuiltIn; k <= RDI_TypeKind_LastBuiltIn; k += 1) - { - RDIM_Type *type = rdim_type_chunk_list_push(arena, builtin_types, builtin_type_count); - type->kind = k; - type->name.str = rdi_string_from_type_kind(k, &type->name.size); - type->byte_size = rdi_size_from_basic_type_kind(k); - if(type->byte_size == max_U32) { type->byte_size = byte_size_from_arch(arch); } - builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] = type; - } - } - lane_sync_u64(&builtin_types, 0); - lane_sync_u64(&builtin_type_from_kind_map, 0); -#define d2r2_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] : builtin_type_from_kind_map[RDI_TypeKind_Void]) - - //////////////////////////// - //- rjf: predict the total number of tags in all units - // - U64 total_tag_count_estimate = 1; - { - U64 tag_size_estimate = 32; - for EachIndex(unit_idx, unit_count) - { - total_tag_count_estimate += dim_1u64(unit_info_tag_ranges[unit_idx]) / tag_size_estimate; - } - } - - //////////////////////////// - //- rjf: gather all unique, to-be-deduplicated tags across all units (types, namespaces) - // - D2R2_UniqueTagNode **unique_tag_slots = 0; - U64 unique_tag_slots_count = total_tag_count_estimate/8 + 1; - D2R2_UnitDedupedTagMap *unit_deduped_tag_maps = 0; - ProfScope("gather all unique, to-be-deduplicated tags across all units (types, namespaces)") - { - //- rjf: set up tables - if(lane_idx() == 0) - { - unique_tag_slots = push_array(scratch.arena, D2R2_UniqueTagNode *, unique_tag_slots_count); - unit_deduped_tag_maps = push_array(scratch.arena, D2R2_UnitDedupedTagMap, unit_count); - } - lane_sync_u64(&unique_tag_slots, 0); - lane_sync_u64(&unit_deduped_tag_maps, 0); - - //- rjf: set up per-unit deduplicated tag maps - { - Rng1U64 range = lane_range(unit_count); - for EachInRange(unit_idx, range) - { - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - unit_deduped_tag_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 256 + 1; - unit_deduped_tag_maps[unit_idx].slots = push_array(scratch.arena, D2R2_UnitDedupedTagNode *, unit_deduped_tag_maps[unit_idx].slots_count); - } - lane_sync(); - } - - //- rjf: gather unique tags - { - U64 work_take_idx_ = 0; - U64 *work_take_idx_ptr = &work_take_idx_; - lane_sync_u64(&work_take_idx_ptr, 0); - for(;;) - { - //- rjf: take next work - U64 work_idx = ins_atomic_u64_inc_eval(work_take_idx_ptr) - 1; - if(work_idx >= sub_unit_works_count) - { - break; - } - Temp work_scratch = scratch_begin(&scratch.arena, 1); - - //- rjf: unpack work - U64 origin_unit_idx = sub_unit_works[work_idx].unit_idx; - Rng1U64 origin_unit_root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; - - //- rjf: unpack unit info - DW2_ParseCtx *origin_unit_parse_ctx = &unit_parse_ctxs[origin_unit_idx]; - Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; - - //- rjf: gather all tags which we want to deduplicate - typedef struct D2R2_TagNode D2R2_TagNode; - struct D2R2_TagNode - { - D2R2_TagNode *next; - D2R2_UniqueTagKind kind; - U64 info_off; - U64 container_ancestor_info_off; - U64 hash_seed; - }; - D2R2_TagNode *first_tag_to_dedup = 0; - D2R2_TagNode *last_tag_to_dedup = 0; - for(U64 root_tag_idx = origin_unit_root_tag_idx_range.min; - root_tag_idx < origin_unit_root_tag_idx_range.max; - root_tag_idx += 1) - { - U64 root_tag_start_off = unit_info_root_tag_offs[origin_unit_idx].v[root_tag_idx]; - typedef struct D2R2_ParentTagNode D2R2_ParentTagNode; - struct D2R2_ParentTagNode - { - D2R2_ParentTagNode *next; - DW_TagKind tag_kind; - U64 info_off; - U64 hash_seed; - }; - D2R2_ParentTagNode *top_parent = 0; - D2R2_ParentTagNode *free_parent = 0; - S64 depth = 0; - for(U64 off = root_tag_start_off; contains_1u64(origin_unit_info_tag_range, off) && (depth > 0 || off == root_tag_start_off);) - { - Temp tag_scratch = scratch_begin(&work_scratch.arena, 1); - U64 start_off = off; - - // rjf: read tag - DW2_Tag tag = {0}; - off += dw2_read_tag(tag_scratch.arena, raw, origin_unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); - - // rjf: is this one of the tags we'd like to dedup? -> gather - if(tag.kind == DW_TagKind_ArrayType || - tag.kind == DW_TagKind_ClassType || - tag.kind == DW_TagKind_EnumerationType || - tag.kind == DW_TagKind_PointerType || - tag.kind == DW_TagKind_ReferenceType || - tag.kind == DW_TagKind_StringType || - tag.kind == DW_TagKind_StructureType || - tag.kind == DW_TagKind_SubroutineType || - tag.kind == DW_TagKind_SubProgram || - tag.kind == DW_TagKind_Typedef || - tag.kind == DW_TagKind_UnionType || - tag.kind == DW_TagKind_PtrToMemberType || - tag.kind == DW_TagKind_SetType || - tag.kind == DW_TagKind_BaseType || - tag.kind == DW_TagKind_ConstType || - tag.kind == DW_TagKind_FileType || - tag.kind == DW_TagKind_PackedType || - tag.kind == DW_TagKind_VolatileType || - tag.kind == DW_TagKind_RestrictType || - tag.kind == DW_TagKind_InterfaceType || - tag.kind == DW_TagKind_UnspecifiedType || - tag.kind == DW_TagKind_SharedType || - tag.kind == DW_TagKind_RValueReferenceType || - tag.kind == DW_TagKind_CoarrayType || - tag.kind == DW_TagKind_DynamicType || - tag.kind == DW_TagKind_AtomicType || - tag.kind == DW_TagKind_ImmutableType || - tag.kind == DW_TagKind_Namespace) - { - U64 container_ancestor_info_off = 0; - for EachNode(n, D2R2_ParentTagNode, top_parent) - { - if(n->tag_kind == DW_TagKind_StructureType || - n->tag_kind == DW_TagKind_UnionType || - n->tag_kind == DW_TagKind_ClassType || - n->tag_kind == DW_TagKind_SubProgram || - n->tag_kind == DW_TagKind_LexicalBlock || - n->tag_kind == DW_TagKind_Namespace) - { - container_ancestor_info_off = n->info_off; - break; - } - } - D2R2_TagNode *n = push_array(work_scratch.arena, D2R2_TagNode, 1); - n->kind = (tag.kind == DW_TagKind_Namespace ? D2R2_UniqueTagKind_Namespace : D2R2_UniqueTagKind_Type); - n->info_off = start_off; - n->container_ancestor_info_off = container_ancestor_info_off; - n->hash_seed = top_parent ? top_parent->hash_seed : 0; - SLLQueuePush(first_tag_to_dedup, last_tag_to_dedup, n); - } - - // rjf: compute hash seed for this tag - U64 hash_seed = (top_parent ? top_parent->hash_seed : 0); - if(tag.kind == DW_TagKind_SubProgram || - tag.kind == DW_TagKind_StructureType || - tag.kind == DW_TagKind_UnionType || - tag.kind == DW_TagKind_ClassType || - tag.kind == DW_TagKind_Namespace) - { - DW2_Attrib *name_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Name); - if(name_attrib != &dw2_attrib_nil) - { - hash_seed = u64_hash_from_str8(name_attrib->val.string); - } - } - - // rjf: update depth / parent stack - if(tag.has_children) - { - depth += 1; - D2R2_ParentTagNode *n = free_parent; - if(n != 0) - { - SLLStackPop(free_parent); - } - else - { - n = push_array(work_scratch.arena, D2R2_ParentTagNode, 1); - } - SLLStackPush(top_parent, n); - n->tag_kind = tag.kind; - n->info_off = start_off; - n->hash_seed = hash_seed; - } - if(tag.kind == DW_TagKind_Null) - { - depth -= 1; - depth = Max(0, depth); - if(top_parent != 0) - { - D2R2_ParentTagNode *popped = top_parent; - SLLStackPop(top_parent); - SLLStackPush(free_parent, popped); - } - } - - scratch_end(tag_scratch); - if(off == start_off) - { - break; - } - } - } - - //- rjf: hash all tags we need to deduplicate & gather - for(D2R2_TagNode *tag_n = first_tag_to_dedup; tag_n != 0; tag_n = tag_n->next) - { - Temp dedup_root_scratch = scratch_begin(&scratch.arena, 1); - U64 start_off = tag_n->info_off; - D2R2_UniqueTagKind unique_tag_kind = tag_n->kind; - U64 container_ancestor_info_off = tag_n->container_ancestor_info_off; - U64 hash_seed = tag_n->hash_seed; - - //- rjf: hash all tags & dependency tag trees - U64 hash = hash_seed; - { - typedef struct TagTask TagTask; - struct TagTask - { - TagTask *next; - U64 unit_idx; - U64 off; - U64 order_idx; - }; - TagTask start_task = {0, origin_unit_idx, start_off}; - TagTask *top_task = &start_task; - TagTask *free_task = 0; - U64 seen_task_slots_count = 16; - TagTask **seen_task_slots = push_array(dedup_root_scratch.arena, TagTask *, seen_task_slots_count); - for(TagTask *t = top_task, *next = 0; t != 0; t = next) - { - next = 0; - U64 t_off = t->off; - - // rjf: record this task in our seen task table - { - U64 hash = u64_hash_from_str8(str8_struct(&t->off)); - U64 slot_idx = hash%seen_task_slots_count; - SLLStackPush(seen_task_slots[slot_idx], t); - } - - // rjf: unpack unit - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; - - // rjf: read/hash the full tag tree at `t_off`; kick off additional - // tasks for referenced dependency types - S64 depth = 0; - B32 hash_should_include_children = 1; - for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max && (depth > 0 || t_off == t->off);) - { - Temp tag_scratch = scratch_begin(&dedup_root_scratch.arena, 1); - U64 t_start_off = t_off; - - // rjf: read tag - DW2_Tag tag = {0}; - t_off += dw2_read_tag(tag_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, t_off, &tag); - - // rjf: determine if tag should be skipped from hashing - B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || - tag.kind == DW_TagKind_Variable); - - // rjf: determine if we want to consider tag children as part of the content hash - if(t_start_off == t->off && tag.kind == DW_TagKind_Namespace) - { - hash_should_include_children = 0; - } - - // rjf: if we want to combine this tag into the hash -> combine - if(!should_skip_tag) - { - // rjf: combine tag's kind - hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); - - // rjf: combine non-reference attributes (references could be different, - // because of deduping, but they could match ultimately). for any - // referenced dependency types, kick them off - for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) - { - // rjf: non-reference? -> combine attribute value info - if(n->v.val.kind != DW_FormKind_RefAddr && - n->v.val.kind != DW_FormKind_Ref1 && - n->v.val.kind != DW_FormKind_Ref2 && - n->v.val.kind != DW_FormKind_Ref4 && - n->v.val.kind != DW_FormKind_Ref8 && - n->v.val.kind != DW_FormKind_RefUData && - n->v.val.kind != DW_FormKind_RefSup4 && - n->v.val.kind != DW_FormKind_RefSig8 && - ((tag.kind != DW_TagKind_SubProgram && - tag.kind != DW_TagKind_FormalParameter) || - (n->v.attrib_kind != DW_AttribKind_Name && - n->v.attrib_kind != DW_AttribKind_DeclFile && - n->v.attrib_kind != DW_AttribKind_DeclLine && - n->v.attrib_kind != DW_AttribKind_Prototyped && - n->v.attrib_kind != DW_AttribKind_External && - n->v.attrib_kind != DW_AttribKind_FrameBase && - n->v.attrib_kind != DW_AttribKind_Location && - n->v.attrib_kind != DW_AttribKind_LowPc && - n->v.attrib_kind != DW_AttribKind_HighPc))) - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); - if(n->v.val.string.size != 0) - { - hash = u64_hash_from_seed_str8(hash, n->v.val.string); - } - else if(n->v.val.addr != 0) - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.addr)); - } - else - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); - } - } - - // rjf: type reference? -> if seen, combine the order; if not, recurse - if(n->v.attrib_kind == DW_AttribKind_Type) - { - // rjf: unpack reference - U64 ref_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); - - // rjf: determine if we've seen this reference - B32 already_seen = 0; - U64 already_seen_order_idx = 0; - { - U64 off_hash = u64_hash_from_str8(str8_struct(&ref_info_off)); - U64 off_slot_idx = off_hash%seen_task_slots_count; - for(TagTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) - { - if(t->off == ref_info_off) - { - already_seen = 1; - already_seen_order_idx = t->order_idx; - break; - } - } - } - - // rjf: if we've seen -> hash the order - if(already_seen) - { - hash = u64_hash_from_seed_str8(hash, str8_struct(&already_seen_order_idx)); - } - - // rjf: if we've not seen -> descend - if(!already_seen) - { - TagTask *dependency_task = free_task; - if(dependency_task != 0) - { - SLLStackPop(free_task); - } - else - { - dependency_task = push_array(dedup_root_scratch.arena, TagTask, 1); - } - dependency_task->next = next; - next = dependency_task; - dependency_task->off = ref_info_off; - dependency_task->unit_idx = t->unit_idx; - if(!contains_1u64(unit_info_tag_range, dependency_task->off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - dependency_task->unit_idx = new_unit_num-1; - } - } - dependency_task->order_idx = t->order_idx+1; - } - } - } - } - - // rjf: tree nav if we need to - if(hash_should_include_children) - { - if(tag.has_children) - { - depth += 1; - } - if(tag.kind == DW_TagKind_Null) - { - depth -= 1; - depth = Max(0, depth); - } - } - scratch_end(tag_scratch); - } - } - } - - //- rjf: atomically gather this hash if not already gathered - { - B32 gathered = 0; - U64 slot_idx = hash%unique_tag_slots_count; - for(;!gathered;) - { - // rjf: read existing slot head pointer *before* we lookup / insert - U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_tag_slots[slot_idx]); - - // rjf: determine if this hash has been gathered - D2R2_UniqueTagNode *already_gathered_node = 0; - for(D2R2_UniqueTagNode *n = (D2R2_UniqueTagNode *)slot_head_val; n != 0; n = n->next) - { - if(n->hash == hash) - { - gathered = 1; - already_gathered_node = n; - break; - } - } - - // rjf: if this hash *has* been gathered, we want to prefer a - // deterministic unit/info offset - so we'll just prefer the - // lowest unit/offset. - // - // TODO(rjf): this seems to only be necessary because of a flaw - // in the deduplicator logic (without this part). in theory, if we - // trust the hash (all experiments suggested that we should - e.g. - // no hash collisions w/ different data were observed), then the - // same hash should imply an identical type graph. this may be false - // for reasons I do not currently understand, or due to a mistake - // somewhere. but for now, I've added this, to ensure that when there - // are many type tag trees which map to an identical hash, we always - // parse the one from the lowest .debug_info offset, just to make - // sure it's deterministic. in a multi-threaded conversion, this - // is not true in general without this step; one thread which finds - // the same type with a higher .debug_info offset may win, and so - // where exactly one type hash is parsed is not deterministic. but, - // the theory is, that shouldn't matter - the type graphs should - // match nonetheless. in any case, if that turns out to be a broken - // theory, this should be a relatively cheap step to guarantee - // deterministic (hash -> .debug_info offset), which is likely a - // desirable property regardless. but I wanted to leave this here - // so that I can more closely verify what is going on later. - // - if(gathered && already_gathered_node != 0) - { - B32 minimized = 0; - for(;!minimized;) - { - U64 stored_info_off = ins_atomic_u64_eval(&already_gathered_node->info_off); - if(start_off < stored_info_off) - { - if(ins_atomic_u64_eval_cond_assign(&already_gathered_node->info_off, start_off, stored_info_off) == stored_info_off) - { - minimized = 1; - } - } - else - { - minimized = 1; - } - } - } - - // rjf: if this hash has *not* been gathered, try an insert. we: - // - // 1. allocate/fill a node - // 2. set it up to point to the old head - // 3. compare/exchange the old head with the new head - IFF the head matches what we expect from above - // 4. if we fail, another thread has touched this slot, we pop the allocated node & try again - // (we may find that another thread has filled this hash, so we'll just be done) - // - if(!gathered) - { - Temp insert_temp = temp_begin(scratch.arena); - D2R2_UniqueTagNode *n = push_array(scratch.arena, D2R2_UniqueTagNode, 1); - n->next = (D2R2_UniqueTagNode *)slot_head_val; - n->kind = unique_tag_kind; - n->hash = hash; - n->info_off = start_off; - n->container_ancestor_info_off = container_ancestor_info_off; - U64 new_head_val = (U64)n; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_tag_slots[slot_idx], new_head_val, slot_head_val)) - { - gathered = 1; - } - else - { - temp_end(insert_temp); - } - } - } - } - - //- rjf: atomically record this (info_off -> hash) mapping, so that when we have - // later references to this type, we can redirect to the deduplicated type with - // the right hash later. - { - U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; - D2R2_UnitDedupedTagNode *n = push_array(scratch.arena, D2R2_UnitDedupedTagNode, 1); - n->src_info_off = start_off; - n->dst_hash = hash; - for(B32 inserted = 0; !inserted;) - { - U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); - n->next = (D2R2_UnitDedupedTagNode *)slot_head_val; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) - { - inserted = 1; - } - } - } - scratch_end(dedup_root_scratch); - } - - scratch_end(work_scratch); - } - lane_sync(); - } - } - - //////////////////////////// - //- rjf: sort all unique tag table slots - // - ProfScope("sort all unique tag table slots") - { - Rng1U64 range = lane_range(unique_tag_slots_count); - for EachInRange(slot_idx, range) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - D2R2_UniqueTagNode **slot = &unique_tag_slots[slot_idx]; - - // rjf: count nodes in this slot - U64 node_count = 0; - for EachNode(n, D2R2_UniqueTagNode, slot[0]) - { - node_count += 1; - } - - // rjf: flatten - D2R2_UniqueTagNode **slot_nodes_array = push_array(scratch2.arena, D2R2_UniqueTagNode *, node_count); - { - U64 idx = 0; - for EachNode(n, D2R2_UniqueTagNode, slot[0]) - { - slot_nodes_array[idx] = n; - idx += 1; - } - } - - // rjf: sort - radsort(slot_nodes_array, node_count, (int (*)(void *, void *))d2r2_unique_tag_node_is_less_than); - - // rjf: re-order in the slot - { - unique_tag_slots[slot_idx] = 0; - for EachIndex(idx, node_count) - { - SLLStackPush(unique_tag_slots[slot_idx], slot_nodes_array[idx]); - } - } - - scratch_end(scratch2); - } - lane_sync(); - } - - //////////////////////////// - //- rjf: produce [0...n) <-> unique-tag-node mapping for all categories of deduplicated tags - // - U64 *deduped_tag_counts = 0; // [D2R2_UniqueTagKind_COUNT] - D2R2_UniqueTagNode ***deduped_tag_nodes = 0; // [D2R2_UniqueTagKind_COUNT] - ProfScope("produce [0...n) -> hash mapping for all categories of deduplicated tags") if(lane_idx() == 0) - { - deduped_tag_counts = push_array(scratch.arena, U64, D2R2_UniqueTagKind_COUNT); - deduped_tag_nodes = push_array(scratch.arena, D2R2_UniqueTagNode **, D2R2_UniqueTagKind_COUNT); - for EachIndex(slot_idx, unique_tag_slots_count) - { - for EachNode(n, D2R2_UniqueTagNode, unique_tag_slots[slot_idx]) - { - deduped_tag_counts[n->kind] += 1; - } - } - for EachEnumVal(D2R2_UniqueTagKind, k) - { - deduped_tag_nodes[k] = push_array(scratch.arena, D2R2_UniqueTagNode *, deduped_tag_counts[k]); - } - U64 idxs[D2R2_UniqueTagKind_COUNT] = {0}; - for EachIndex(slot_idx, unique_tag_slots_count) - { - for EachNode(n, D2R2_UniqueTagNode, unique_tag_slots[slot_idx]) - { - deduped_tag_nodes[n->kind][idxs[n->kind]] = n; - n->order_idx = idxs[n->kind]; - idxs[n->kind] += 1; - } - } - } - lane_sync_u64(&deduped_tag_counts, 0); - lane_sync_u64(&deduped_tag_nodes, 0); - U64 type_count = deduped_tag_counts[D2R2_UniqueTagKind_Type]; - D2R2_UniqueTagNode **type_tag_nodes = deduped_tag_nodes[D2R2_UniqueTagKind_Type]; - U64 namespace_count = deduped_tag_counts[D2R2_UniqueTagKind_Namespace]; - D2R2_UniqueTagNode **namespace_tag_nodes = deduped_tag_nodes[D2R2_UniqueTagKind_Namespace]; - - //////////////////////////// - //- rjf: gather per-type dependency chains - // - typedef struct TypeDepChain TypeDepChain; - struct TypeDepChain - { - TypeDepChain *next; - U64 type_idx; - }; - U64 *type_dep_chains_counts = 0; - ProfScope("gather per-type dependency chains") - { - if(lane_idx() == 0) - { - type_dep_chains_counts = push_array(scratch.arena, U64, type_count); - } - lane_sync_u64(&type_dep_chains_counts, 0); - Rng1U64 range = lane_range(type_count); - for EachInRange(root_type_idx, range) - { - typedef struct TypeChainTask TypeChainTask; - struct TypeChainTask - { - TypeChainTask *next; - U64 hash; - }; - TypeChainTask start_task = {0, type_tag_nodes[root_type_idx]->hash}; - TypeChainTask *top_task = &start_task; - TypeChainTask *free_task = 0; - TypeChainTask *last_t = 0; - for(TypeChainTask *t = top_task; t != 0; (last_t = t, t = t->next)) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - // rjf: recycle old tasks - if(last_t != 0) - { - SLLStackPush(free_task, last_t); - } - - // rjf: unpack task - U64 hash = t->hash; - - // rjf: hash -> unique type tag node - D2R2_UniqueTagNode *type_tag_node = 0; - { - U64 slot_idx = hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) - { - if(n->hash == hash) - { - type_tag_node = n; - break; - } - } - } - - // rjf: unpack type tag node - U64 info_off = 0; - U64 unit_idx = 0; - if(type_tag_node != 0) - { - info_off = type_tag_node->info_off; - U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); - unit_idx = unit_num > 0 ? unit_num-1 : 0; - } - - // rjf: record this type in the dependency chain count - if(type_tag_node != 0) - { - type_dep_chains_counts[root_type_idx] += 1; - } - - // rjf: unpack unit - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - - // rjf: parse this type's tag - U64 read_off = info_off; - DW2_Tag tag = {0}; - read_off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, read_off, &tag); - - // rjf: find direct types from this type tag - typedef struct DirectTypeNode DirectTypeNode; - struct DirectTypeNode - { - DirectTypeNode *next; - U64 info_off; - U64 unit_idx; - }; - DirectTypeNode *first_direct_type = 0; - DirectTypeNode *last_direct_type = 0; - switch(tag.kind) - { - default:{}break; - case DW_TagKind_PointerType: - case DW_TagKind_ReferenceType: - case DW_TagKind_RValueReferenceType: - case DW_TagKind_RestrictType: - case DW_TagKind_VolatileType: - case DW_TagKind_ConstType: - case DW_TagKind_ArrayType: - case DW_TagKind_Typedef: - case DW_TagKind_SubProgram: - case DW_TagKind_SubroutineType: - case DW_TagKind_EnumerationType: - { - // rjf: gather direct type - { - DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); - U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - U64 direct_type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - direct_type_unit_idx = new_unit_num-1; - } - } - DirectTypeNode *n = push_array(scratch2.arena, DirectTypeNode, 1); - n->info_off = direct_type_info_off; - n->unit_idx = direct_type_unit_idx; - SLLQueuePush(first_direct_type, last_direct_type, n); - } - - // rjf: functions -> gather parameters - if(tag.has_children && (tag.kind == DW_TagKind_SubProgram || tag.kind == DW_TagKind_SubroutineType)) - { - S64 depth = 1; - for(;depth > 0 && contains_1u64(unit_info_tag_range, read_off);) - { - U64 start_read_off = read_off; - - // rjf: read child tag - DW2_Tag child_tag = {0}; - read_off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, read_off, &child_tag); - - // rjf: formal parameters -> gather direct types - if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) - { - DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); - U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - U64 direct_type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - direct_type_unit_idx = new_unit_num-1; - } - } - DirectTypeNode *n = push_array(scratch2.arena, DirectTypeNode, 1); - n->info_off = direct_type_info_off; - n->unit_idx = direct_type_unit_idx; - SLLQueuePush(first_direct_type, last_direct_type, n); - } - - // rjf: tree navigations - if(child_tag.has_children) - { - depth += 1; - } - if(child_tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - - if(read_off == start_read_off) - { - break; - } - } - } - }break; - } - - // rjf: for each dependency type, look up their hash, + spawn new tasks for them - for EachNode(n, DirectTypeNode, first_direct_type) - { - U64 direct_type_info_off = n->info_off; - U64 direct_type_unit_idx = n->unit_idx; - - // rjf: direct type info offset -> hash - U64 direct_type_hash = 0; - { - U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); - U64 off_slot_idx = off_hash%unit_deduped_tag_maps[direct_type_unit_idx].slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == direct_type_info_off) - { - direct_type_hash = n->dst_hash; - break; - } - } - } - - // rjf: spawn task - if(direct_type_hash != 0) - { - TypeChainTask *new_task = free_task; - if(new_task != 0) - { - SLLStackPop(free_task); - } - else - { - new_task = push_array(scratch.arena, TypeChainTask, 1); - } - new_task->next = t->next; - new_task->hash = direct_type_hash; - t->next = new_task; - } - } - - scratch_end(scratch2); - } - } - lane_sync(); - } - - //////////////////////////// - //- rjf: build all types - build types w/ 1 dependency (leaves) first, then 2, 3, etc., - // to ensure dependencies always travel backwards - // - // NOTE: * DWARF vs RDI Array Type Graph * - // - // For example lets take following decl: - // - // int (*foo[2])[3]; - // - // This compiles to in DWARF: - // - // foo -> DW_TAG_ArrayType -> (A0) DW_TAG_Subrange [2] - // \ - // -> (B0) DW_TAG_PointerType -> (A1) DW_TAG_ArrayType -> DW_TAG_Subrange [3] - // \ - // -> (B1) DW_TAG_BaseType (int) - // - // RDI expects: - // - // foo -> Array[2] -> Pointer -> Array[3] -> int - // - // Note that DWARF forks the graph on DW_TAG_ArrayType to describe array ranges in branch A and - // in branch B describes array type which might be a struct, pointer, base type, or any other type tag. - // However, in RDI we have a simple list of type nodes and to convert we need to append type nodes from - // B to A. - // - RDIM_TypeChunkList *all_types = 0; - RDIM_Type **type_from_idx_map = 0; - ProfScope("build all types") - { - if(lane_idx() == 0) - { - all_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); - type_from_idx_map = push_array(scratch.arena, RDIM_Type *, type_count); - rdim_type_chunk_list_concat_in_place(all_types, builtin_types); - } - lane_sync_u64(&all_types, 0); - lane_sync_u64(&type_from_idx_map, 0); - Rng1U64 range = lane_range(type_count); - U64 max_chain_count = 1; - for(;max_chain_count < max_U64;) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - ProfBegin("types build (chain count <= %I64u)", max_chain_count); - - //- rjf: gather all types in this lane that fit the dependency restriction; - // find this lane's next dependency restriction - U64 next_max_chain_count = max_U64; - RDIM_TypeChunkList lane_types = {0}; - U64 lane_types_chunk_count = 256; - for EachInRange(type_idx, range) - { - // rjf: if this type has a higher chain count than the current, - // but it is lower than our next maximum chain count, collect it, - // so we will hit - // - // if this type has a lower chain count than the current, - // we should've already built it from a previous pass. - // - if(type_dep_chains_counts[type_idx] > max_chain_count) - { - next_max_chain_count = Min(type_dep_chains_counts[type_idx], next_max_chain_count); - continue; - } - else if(type_dep_chains_counts[type_idx] < max_chain_count) - { - continue; - } - Temp temp = temp_begin(scratch2.arena); - - // rjf: idx -> type tag node - D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; - U64 info_off = type_tag_node->info_off; - U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); - U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; - - // rjf: unpack unit - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - - // rjf: parse root-level tag - DW2_Tag tag = {0}; - U64 tag_info_size = dw2_read_tag(temp.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, info_off, &tag); - - // rjf: extract common attributes - DW2_Attrib *name_attrib = &dw2_attrib_nil; - DW2_Attrib *direct_type_attrib = &dw2_attrib_nil; - DW2_Attrib *bitsize_attrib = &dw2_attrib_nil; - DW2_Attrib *bytesize_attrib = &dw2_attrib_nil; - DW2_Attrib *encoding_attrib = &dw2_attrib_nil; - DW2_Attrib *decl_attrib = &dw2_attrib_nil; - DW2_Attrib *prototyped_attrib = &dw2_attrib_nil; - // - // TODO(rjf): if a DW_AttribKing_GNU_Vector is found on an DW_TagKind_ArrayType, - // then: @native_vector_support extract byte size from the base type tag - // and convert to U256, U512, S256 and S512 - // - for EachNode(n, DW2_AttribNode, tag.attribs.first) - { - switch(n->v.attrib_kind) - { - default:{}break; -#define Case(dst_name, src_name) case DW_AttribKind_##src_name:{dst_name##_attrib = &n->v;}break - Case(name, Name); - Case(direct_type, Type); - Case(bitsize, BitSize); - Case(bytesize, ByteSize); - Case(encoding, Encoding); - Case(decl, Declaration); -#undef Case - } - } - - // rjf: unpack common attributes - String8 name = name_attrib->val.string; - DW_ATE encoding = encoding_attrib->val.u128.u64[0]; - RDIM_Type *direct_type = d2r2_type_from_builtin_kind(RDI_TypeKind_Void); - U64 bitsize = 0; - B32 is_decl = (decl_attrib != &dw2_attrib_nil); - { - // rjf: unpack direct type - if(direct_type_attrib != &dw2_attrib_nil) - { - U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - U64 direct_type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); - direct_type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); - } - D2R2_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[direct_type_unit_idx]; - U64 info_off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); - U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; - U64 direct_type_hash = 0; - for(D2R2_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == direct_type_info_off) - { - direct_type_hash = n->dst_hash; - break; - } - } - U64 unique_type_tag_slot_idx = direct_type_hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) - { - if(n->hash == direct_type_hash) - { - direct_type = type_from_idx_map[n->order_idx]; - break; - } - } - } - - // rjf: unpack bit/byte sizes - if(bitsize_attrib != &dw2_attrib_nil) - { - bitsize = bitsize_attrib->val.u128.u64[0]; - } - else if(bytesize_attrib != &dw2_attrib_nil) - { - bitsize = bytesize_attrib->val.u128.u64[0]*8; - } - } - - // rjf: convert type - RDIM_Type *dst_type = 0; - RDI_TypeKind rdi_type_kind = RDI_TypeKind_NULL; - RDI_TypeModifierFlags rdi_type_modifier_flags = 0; - switch(tag.kind) - { - default:{}break; - case DW_TagKind_ClassType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_Class; goto struct_type; - case DW_TagKind_StructureType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteStruct : RDI_TypeKind_Struct; goto struct_type; - case DW_TagKind_UnionType: rdi_type_kind = is_decl ? RDI_TypeKind_IncompleteUnion : RDI_TypeKind_Union; goto struct_type; - struct_type:; - { - dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); - dst_type->kind = rdi_type_kind; - dst_type->name = name; - dst_type->byte_size = bitsize/8; - }break; - case DW_TagKind_EnumerationType: - { - dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); - dst_type->kind = is_decl ? RDI_TypeKind_IncompleteEnum : RDI_TypeKind_Enum; - dst_type->name = name; - dst_type->direct_type = direct_type; - dst_type->byte_size = (direct_type != 0 ? direct_type->byte_size : bitsize/8); - }break; - case DW_TagKind_SubProgram: - case DW_TagKind_SubroutineType: - { - // rjf: build type - dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); - dst_type->kind = RDI_TypeKind_Function; - dst_type->direct_type = direct_type; - dst_type->byte_size = arch_addr_size; - - // rjf: gather all parameter types - typedef struct ParamNode ParamNode; - struct ParamNode - { - ParamNode *next; - U64 type_unit_idx; - U64 type_info_off; - }; - ParamNode *first_param = 0; - ParamNode *last_param = 0; - U64 param_count = 0; - if(tag.has_children) - { - U64 tag_children_off = info_off + tag_info_size; - S64 depth = 1; - for(U64 off = tag_children_off; depth > 0 && contains_1u64(unit_info_tag_range, off);) - { - Temp scratch3 = scratch_begin(&scratch2.arena, 1); - U64 start_off = off; - - // rjf: read child tag - DW2_Tag child_tag = {0}; - off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &child_tag); - - // rjf: gather parameters - if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) - { - DW2_Attrib *type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); - ParamNode *n = push_array(scratch2.arena, ParamNode, 1); - SLLQueuePush(first_param, last_param, n); - n->type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); - n->type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, n->type_info_off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, n->type_info_off); - n->type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); - } - param_count += 1; - } - - // rjf: navigate tree - if(child_tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - if(child_tag.has_children) - { - depth += 1; - } - - scratch_end(scratch3); - if(off == start_off) - { - break; - } - } - } - - // rjf: tighten parameter types - dst_type->count = (RDI_U32)param_count; // TODO(rjf): @u64_to_u32 - dst_type->param_types = push_array(arena, RDIM_Type *, dst_type->count); - { - U64 param_idx = 0; - for(ParamNode *n = first_param; n != 0; n = n->next, param_idx += 1) - { - U64 param_type_info_off = n->type_info_off; - U64 param_type_unit_idx = n->type_unit_idx; - - // rjf: map info_off/unit_idx -> hash - U64 param_type_hash = 0; - { - D2R2_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[param_type_unit_idx]; - U64 info_off_hash = u64_hash_from_str8(str8_struct(¶m_type_info_off)); - U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == param_type_info_off) - { - param_type_hash = n->dst_hash; - break; - } - } - } - - // rjf: map hash -> type - RDIM_Type *param_type = 0; - { - U64 unique_type_tag_slot_idx = param_type_hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) - { - if(n->hash == param_type_hash) - { - param_type = type_from_idx_map[n->order_idx]; - break; - } - } - } - - // rjf: store - dst_type->param_types[param_idx] = param_type; - } - } - }break; - case DW_TagKind_Typedef: - { - dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); - dst_type->kind = RDI_TypeKind_Alias; - dst_type->name = name; - dst_type->direct_type = direct_type; - dst_type->byte_size = (direct_type ? direct_type->byte_size : 0); - }break; - case DW_TagKind_BaseType: - { - if(0){} -#define CaseA(rdi_type_kind_, encoding_) else if(encoding == (encoding_)) { rdi_type_kind = (rdi_type_kind_); } -#define CaseB(rdi_type_kind_, encoding_, bit_size_) else if(encoding == (encoding_) && bitsize == (bit_size_)) { rdi_type_kind = (rdi_type_kind_); } -#define CaseC(rdi_type_kind_, encoding_, name_) /* assumes x64/arm64 */ else if(encoding == (encoding_) && str8_match(name, str8_lit(name_), 0)) { rdi_type_kind = (rdi_type_kind_); } -#define CaseD(rdi_type_kind_, encoding_, name_, bit_size_) else if(encoding == (encoding_) && bitsize == (bit_size_) && str8_match(name, str8_lit(name_), 0)) { rdi_type_kind = (rdi_type_kind_); } - CaseA(RDI_TypeKind_NULL, DW_ATE_Null) - CaseA(RDI_TypeKind_Void, DW_ATE_Address) - CaseA(RDI_TypeKind_Bool, DW_ATE_Boolean) - CaseB(RDI_TypeKind_ComplexF32, DW_ATE_ComplexFloat, 64) - CaseB(RDI_TypeKind_ComplexF64, DW_ATE_ComplexFloat, 128) - CaseB(RDI_TypeKind_ComplexF80, DW_ATE_ComplexFloat, 160) - CaseB(RDI_TypeKind_ComplexF128, DW_ATE_ComplexFloat, 256) - CaseC(RDI_TypeKind_F80, DW_ATE_Float, "__float80") - CaseC(RDI_TypeKind_F128, DW_ATE_Float, "__float128") - CaseC(RDI_TypeKind_F16, DW_ATE_Float, "_Float16") - CaseC(RDI_TypeKind_BF16, DW_ATE_Float, "__bf16") - CaseB(RDI_TypeKind_F16, DW_ATE_Float, 16) - CaseB(RDI_TypeKind_F32, DW_ATE_Float, 32) - CaseB(RDI_TypeKind_F48, DW_ATE_Float, 48) - CaseB(RDI_TypeKind_F64, DW_ATE_Float, 64) - CaseB(RDI_TypeKind_F80, DW_ATE_Float, 80) - CaseB(RDI_TypeKind_F96, DW_ATE_Float, 96) - CaseB(RDI_TypeKind_F128, DW_ATE_Float, 128) - CaseB(RDI_TypeKind_Char8, DW_ATE_SignedChar, 8) - CaseB(RDI_TypeKind_Char16, DW_ATE_SignedChar, 16) - CaseB(RDI_TypeKind_Char32, DW_ATE_SignedChar, 32) - CaseD(RDI_TypeKind_Char8, DW_ATE_Signed, "wchar_t", 8) - CaseD(RDI_TypeKind_Char16, DW_ATE_Signed, "wchar_t", 16) - CaseD(RDI_TypeKind_Char32, DW_ATE_Signed, "wchar_t", 32) - CaseB(RDI_TypeKind_S8, DW_ATE_Signed, 8) - CaseB(RDI_TypeKind_S16, DW_ATE_Signed, 16) - CaseB(RDI_TypeKind_S32, DW_ATE_Signed, 32) - CaseB(RDI_TypeKind_S64, DW_ATE_Signed, 64) - CaseB(RDI_TypeKind_S128, DW_ATE_Signed, 128) - CaseB(RDI_TypeKind_S256, DW_ATE_Signed, 256) - CaseB(RDI_TypeKind_S512, DW_ATE_Signed, 512) - CaseB(RDI_TypeKind_U8, DW_ATE_Unsigned, 8) - CaseB(RDI_TypeKind_U16, DW_ATE_Unsigned, 16) - CaseB(RDI_TypeKind_U32, DW_ATE_Unsigned, 32) - CaseB(RDI_TypeKind_U64, DW_ATE_Unsigned, 64) - CaseB(RDI_TypeKind_U128, DW_ATE_Unsigned, 128) - CaseB(RDI_TypeKind_U256, DW_ATE_Unsigned, 256) - CaseB(RDI_TypeKind_U512, DW_ATE_Unsigned, 512) - CaseB(RDI_TypeKind_UChar8, DW_ATE_UnsignedChar, 8) - CaseB(RDI_TypeKind_UChar8, DW_ATE_Utf, 8) - CaseB(RDI_TypeKind_UChar16, DW_ATE_UnsignedChar, 16) - CaseB(RDI_TypeKind_UChar16, DW_ATE_Utf, 16) - CaseB(RDI_TypeKind_UChar32, DW_ATE_UnsignedChar, 32) - CaseB(RDI_TypeKind_UChar32, DW_ATE_Utf, 32) - CaseB(RDI_TypeKind_Decimal32, DW_ATE_DecimalFloat, 32) - CaseB(RDI_TypeKind_Decimal64, DW_ATE_DecimalFloat, 64) - CaseB(RDI_TypeKind_Decimal128, DW_ATE_DecimalFloat, 128) -#undef CaseA -#undef CaseB -#undef CaseC -#undef CaseD - dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); - dst_type->kind = RDI_TypeKind_Alias; - dst_type->name = name; - dst_type->direct_type = d2r2_type_from_builtin_kind(rdi_type_kind); - dst_type->byte_size = bitsize/8; // TODO: byte size on __float80 alias mismatches byte size on direct type now - }break; - case DW_TagKind_PointerType: rdi_type_kind = RDI_TypeKind_Ptr; goto ptr_or_ref_type; - case DW_TagKind_ReferenceType: rdi_type_kind = RDI_TypeKind_LRef; goto ptr_or_ref_type; - case DW_TagKind_RValueReferenceType: rdi_type_kind = RDI_TypeKind_RRef; goto ptr_or_ref_type; - ptr_or_ref_type:; - { - dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); - dst_type->kind = rdi_type_kind; - dst_type->direct_type = direct_type; - dst_type->byte_size = arch_addr_size; - }break; - case DW_TagKind_RestrictType: - { - rdi_type_modifier_flags = RDI_TypeModifierFlag_Restrict; - }goto basic_type_operators; - case DW_TagKind_VolatileType: - { - rdi_type_modifier_flags = RDI_TypeModifierFlag_Volatile; - }goto basic_type_operators; - case DW_TagKind_ConstType: - { - rdi_type_modifier_flags = RDI_TypeModifierFlag_Const; - }goto basic_type_operators; - basic_type_operators:; - { - dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); - dst_type->kind = RDI_TypeKind_Modifier; - dst_type->flags = rdi_type_modifier_flags; - dst_type->direct_type = direct_type; - dst_type->byte_size = (direct_type ? direct_type->byte_size : 0); - }break; - case DW_TagKind_ArrayType: - if(tag.has_children) - { - // rjf: parse array type children; extract dimensions (each one gets a SubrangeType) - typedef struct ArrayDimensionNode ArrayDimensionNode; - struct ArrayDimensionNode - { - ArrayDimensionNode *next; - U64 count; - }; - ArrayDimensionNode *top_dimension = 0; - { - U64 tag_children_off = info_off + tag_info_size; - S64 depth = 1; - for(U64 off = tag_children_off; contains_1u64(unit_info_tag_range, off) && depth > 0;) - { - U64 start_off = off; - DW2_Tag child_tag = {0}; - off += dw2_read_tag(temp.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &child_tag); - if(child_tag.kind == DW_TagKind_SubrangeType) - { - // rjf: extract bounds attribs - DW2_Attrib *lower_bound_attrib = &dw2_attrib_nil; - DW2_Attrib *upper_bound_attrib = &dw2_attrib_nil; - DW2_Attrib *count_attrib = &dw2_attrib_nil; - for(DW2_AttribNode *n = child_tag.attribs.first; - n != 0 && (lower_bound_attrib == &dw2_attrib_nil || (upper_bound_attrib == &dw2_attrib_nil && count_attrib == &dw2_attrib_nil)); - n = n->next) - { - if(n->v.attrib_kind == DW_AttribKind_LowerBound) - { - lower_bound_attrib = &n->v; - } - else if(n->v.attrib_kind == DW_AttribKind_UpperBound) - { - upper_bound_attrib = &n->v; - } - else if(n->v.attrib_kind == DW_AttribKind_Count) - { - count_attrib = &n->v; - } - } - - // rjf: resolve lower bound - U64 lower_bound = 0; - if(lower_bound_attrib != &dw2_attrib_nil) - { - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, lower_bound_attrib->val.kind) & DW_AttribClass_Reference) - { - log_infof("[.debug_info@0x%I64x] Array type lower bound is a variable; this is not currently supported.\n", start_off); - } - else - { - lower_bound = lower_bound_attrib->val.u128.u64[0]; - } - } - else switch(unit_parse_ctx->language) - { - default:{}break; -#define X(name, code, default_array_lower_bound) case DW_Language_##name:{lower_bound = (default_array_lower_bound);}break; - DW_Language_XList -#undef X - } - - // rjf: resolve upper bound - U64 upper_bound = 0; - { - if(count_attrib != &dw2_attrib_nil) - { - upper_bound = lower_bound + count_attrib->val.u128.u64[0]; - } - else if(upper_bound_attrib != &dw2_attrib_nil) - { - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, upper_bound_attrib->val.kind) & DW_AttribClass_Reference) - { - log_infof("[.debug_info@0x%I64x] Array type upper bound is a variable; this is not currently supported.\n", start_off); - } - else - { - upper_bound = upper_bound_attrib->val.u128.u64[0]; - upper_bound += 1; // NOTE(rjf): turn to exclusive range - } - } - } - - // rjf: push node - ArrayDimensionNode *dim_n = push_array(temp.arena, ArrayDimensionNode, 1); - SLLStackPush(top_dimension, dim_n); - dim_n->count = (upper_bound - lower_bound); - } - if(child_tag.has_children) - { - depth += 1; - } - else if(child_tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - if(off == start_off) - { - break; - } - } - } - - // rjf: create array type operators for each dimension - RDIM_Type *array_direct_type = direct_type; - for EachNode(dim_n, ArrayDimensionNode, top_dimension) - { - RDIM_Type *array_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); - array_type->kind = RDI_TypeKind_Array; - array_type->byte_size = array_direct_type ? array_direct_type->byte_size*dim_n->count : 0; - array_type->direct_type = array_direct_type; - array_direct_type = array_type; - } - - // rjf: final destination type -> the final array dimension type - dst_type = array_direct_type; - }break; - } - - // rjf: store type in type-from-idx table - type_from_idx_map[type_idx] = dst_type; - - temp_end(temp); - } - - //- rjf: combine all types from all lanes - RDIM_TypeChunkList *lanes_types = 0; - if(lane_idx() == 0) - { - lanes_types = push_array(scratch2.arena, RDIM_TypeChunkList, lane_count()); - } - lane_sync_u64(&lanes_types, 0); - lanes_types[lane_idx()] = lane_types; - lane_sync(); - if(lane_idx() == 0) - { - RDIM_TypeChunkList pass_lane_combined_types = {0}; - for EachIndex(l_idx, lane_count()) - { - rdim_type_chunk_list_concat_in_place(&pass_lane_combined_types, &lanes_types[l_idx]); - } - rdim_type_chunk_list_concat_in_place(all_types, &pass_lane_combined_types); - } - lane_sync(); - - //- rjf: find minimum next max chain count across all lanes, for next iteration - U64 *lane_next_max_chain_counts = 0; - if(lane_idx() == 0) - { - lane_next_max_chain_counts = push_array(scratch2.arena, U64, lane_count()); - } - lane_sync_u64(&lane_next_max_chain_counts, 0); - lane_next_max_chain_counts[lane_idx()] = next_max_chain_count; - lane_sync(); - if(lane_idx() == 0) - { - for EachIndex(l_idx, lane_count()) - { - next_max_chain_count = Min(next_max_chain_count, lane_next_max_chain_counts[l_idx]); - } - } - lane_sync_u64(&next_max_chain_count, 0); - - //- rjf: update max chain count - max_chain_count = next_max_chain_count; - - ProfEnd(); - scratch_end(scratch2); - } - } - lane_sync(); - - //////////////////////////// - //- rjf: convert all namespaces - // - RDIM_NamespaceChunkList *all_namespaces = 0; - RDIM_Namespace **namespace_from_idx_map = 0; - { - // rjf: set up - if(lane_idx() == 0) - { - all_namespaces = push_array(scratch.arena, RDIM_NamespaceChunkList, 1); - namespace_from_idx_map = push_array(scratch.arena, RDIM_Namespace *, namespace_count); - } - lane_sync_u64(&all_namespaces, 0); - lane_sync_u64(&namespace_from_idx_map, 0); - - // rjf: build all namespaces on this lane - RDIM_NamespaceChunkList lane_namespaces = {0}; - Rng1U64 range = lane_range(namespace_count); - for EachInRange(namespace_idx, range) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - // rjf: unpack tag node - D2R2_UniqueTagNode *tag_node = namespace_tag_nodes[namespace_idx]; - U64 info_off = tag_node->info_off; - U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); - U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - - // rjf: read namespace tag - DW2_Tag tag = {0}; - dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, info_off, &tag); - DW2_Attrib *name_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Name); - String8 name = name_attrib->val.string; - - // rjf: build namespace - RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 64); - ns->name = name; - - // rjf: store in (deduped tag idx -> namespace) table - namespace_from_idx_map[tag_node->order_idx] = ns; - - scratch_end(scratch2); - } - lane_sync(); - - // rjf: join all namespaces - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - RDIM_NamespaceChunkList *lanes_namespaces = 0; - if(lane_idx() == 0) - { - lanes_namespaces = push_array(scratch2.arena, RDIM_NamespaceChunkList, lane_count()); - } - lane_sync_u64(&lanes_namespaces, 0); - lanes_namespaces[lane_idx()] = lane_namespaces; - lane_sync(); - if(lane_idx() == 0) - { - for EachIndex(l_idx, lane_count()) - { - rdim_namespace_chunk_list_concat_in_place(all_namespaces, &lanes_namespaces[l_idx]); - } - } - lane_sync(); - scratch_end(scratch2); - } - } - lane_sync(); - - //////////////////////////// - //- rjf: convert all UDTs - // - RDIM_UDTChunkList *all_udts = 0; - ProfScope("convert all UDTs") - { - //- rjf: produce UDTs across all lanes - U64 chunk_count = 512; - RDIM_UDTChunkList lane_udts = {0}; - Rng1U64 range = lane_range(type_count); - for EachInRange(type_idx, range) - { - RDIM_Type *type = type_from_idx_map[type_idx]; - if(type != 0 && - (type->kind == RDI_TypeKind_Struct || - type->kind == RDI_TypeKind_Union || - type->kind == RDI_TypeKind_Class || - type->kind == RDI_TypeKind_Enum || - type->kind == RDI_TypeKind_Alias)) - { - // rjf: produce UDT - RDIM_UDT *udt = rdim_udt_chunk_list_push(arena, &lane_udts, chunk_count); - type->udt = udt; - udt->self_type = type; - - // rjf: idx -> type tag node - D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; - U64 info_off = type_tag_node->info_off; - U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); - U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; - - // rjf: unpack unit - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - - // rjf: parse all tags - S64 depth = 0; - for(U64 off = info_off; contains_1u64(unit_info_tag_range, off) && (depth > 0 || off == info_off);) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - U64 start_off = off; - - // rjf: parse tag - DW2_Tag tag = {0}; - U64 tag_parse_off = off; - off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); - - // rjf: unpack tag attributes - DW2_Attrib *name_attrib = &dw2_attrib_nil; - DW2_Attrib *type_attrib = &dw2_attrib_nil; - DW2_Attrib *off_attrib = &dw2_attrib_nil; - DW2_Attrib *val_attrib = &dw2_attrib_nil; - DW2_Attrib *declfile_attrib = &dw2_attrib_nil; - DW2_Attrib *declline_attrib = &dw2_attrib_nil; - DW2_Attrib *declcol_attrib = &dw2_attrib_nil; - for EachNode(n, DW2_AttribNode, tag.attribs.first) - { - switch(n->v.attrib_kind) - { - default:{}break; -#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break - Case(name, Name); - Case(type, Type); - Case(off, DataMemberLocation); - Case(val, ConstValue); - Case(declfile, DeclFile); - Case(declline, DeclLine); - Case(declcol, DeclColumn); -#undef Case - } - } - - // rjf: unpack basic attributes - String8 name = name_attrib->val.string; - U64 off = off_attrib->val.u128.u64[0]; - U64 val = val_attrib->val.u128.u64[0]; - - // rjf: unpack type - RDIM_Type *type = 0; - if(type_attrib != &dw2_attrib_nil) - { - // rjf: attrib -> info off / unit idx - U64 type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); - U64 type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, type_info_off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); - type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); - } - - // rjf: (info_off, unit_idx) -> hash - U64 type_hash = 0; - { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; - U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == type_info_off) - { - type_hash = n->dst_hash; - break; - } - } - } - - // rjf: hash -> type - { - U64 unique_type_tag_slot_idx = type_hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) - { - if(n->hash == type_hash) - { - type = type_from_idx_map[n->order_idx]; - break; - } - } - } - } - - // rjf: root-level tag -> collect decl file/line info - if(tag_parse_off == start_off) - { - // TODO(rjf): we need to have gathered the source files before this!!!!!! - // currently, they only come from line info - we need to gather/dedup the - // ones that also come from tags. - } - - // rjf: gather children - switch(tag.kind) - { - default:{}break; - case DW_TagKind_Member: - { - RDIM_UDTMember *member = rdim_udt_push_member(arena, &lane_udts, udt); - member->kind = RDI_MemberKind_DataField; - member->name = name; - member->type = type; - member->off = (RDI_U32)off; // TODO(rjf): @u64_to_u32 - }break; - case DW_TagKind_Enumerator: - { - RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, &lane_udts, udt); - enum_val->name = name; - enum_val->val = val; - }break; - } - - // rjf: tree nav - if(tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - if(tag.has_children) - { - depth += 1; - } - - scratch_end(scratch2); - if(off == start_off) - { - break; - } - } - } - } - lane_sync(); - - //- rjf: combine all lanes - RDIM_UDTChunkList *lanes_udts = 0; - if(lane_idx() == 0) - { - lanes_udts = push_array(scratch.arena, RDIM_UDTChunkList, lane_count()); - } - lane_sync_u64(&lanes_udts, 0); - lanes_udts[lane_idx()] = lane_udts; - lane_sync(); - if(lane_idx() == 0) - { - all_udts = push_array(scratch.arena, RDIM_UDTChunkList, 1); - for EachIndex(l_idx, lane_count()) - { - rdim_udt_chunk_list_concat_in_place(all_udts, &lanes_udts[l_idx]); - } - } - lane_sync_u64(&all_udts, 0); - } - - //////////////////////////// - //- rjf: convert all units - // - RDIM_UnitChunkList *all_units = 0; - RDIM_Unit **unit_from_idx_map = 0; - ProfScope("convert all units") - { - if(lane_idx() == 0) - { - all_units = push_array(scratch.arena, RDIM_UnitChunkList, 1); - unit_from_idx_map = push_array(scratch.arena, RDIM_Unit *, unit_count); - for EachIndex(unit_idx, unit_count) - { - unit_from_idx_map[unit_idx] = rdim_unit_chunk_list_push(arena, all_units, unit_count); - } - } - lane_sync_u64(&all_units, 0); - lane_sync_u64(&unit_from_idx_map, 0); - U64 unit_take_idx_ = 0; - U64 *unit_take_idx_ptr = &unit_take_idx_; - lane_sync_u64(&unit_take_idx_ptr, 0); - for(;;) - { - U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr) - 1; - if(unit_idx >= unit_count) - { - break; - } - - //- rjf: unpack unit info - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - RDIM_Unit *dst_unit = unit_from_idx_map[unit_idx]; - - //- rjf: unpack unit's root tag - DW2_Tag *unit_root_tag = &unit_root_tags[unit_idx]; - DW2_Attrib *name_attrib = &dw2_attrib_nil; - DW2_Attrib *comp_dir_attrib = &dw2_attrib_nil; - DW2_Attrib *producer_attrib = &dw2_attrib_nil; - DW2_Attrib *lang_attrib = &dw2_attrib_nil; - DW2_Attrib *ranges_attrib = &dw2_attrib_nil; - DW2_Attrib *lopc_attrib = &dw2_attrib_nil; - DW2_Attrib *hipc_attrib = &dw2_attrib_nil; - for EachNode(n, DW2_AttribNode, unit_root_tag->attribs.first) - { - switch(n->v.attrib_kind) - { - default:{}break; -#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break - Case(name, Name); - Case(comp_dir, CompDir); - Case(producer, Producer); - Case(lang, Language); - Case(ranges, Ranges); - Case(lopc, LowPc); - Case(hipc, HighPc); -#undef Case - } - } - - //- rjf: unpack attributes - String8 unit_name = name_attrib->val.string; - String8 unit_comp_dir = comp_dir_attrib->val.string; - String8 unit_producer = producer_attrib->val.string; - RDI_Language unit_lang = RDI_Language_NULL; - { - DW_Language dw_lang = lang_attrib->val.u128.u64[0]; - switch(dw_lang) - { - default:{}break; - case DW_Language_C89: - case DW_Language_C99: - case DW_Language_C11: - case DW_Language_C: - { - unit_lang = RDI_Language_C; - }break; - case DW_Language_CPlusPlus03: - case DW_Language_CPlusPlus11: - case DW_Language_CPlusPlus14: - case DW_Language_CPlusPlus: - { - unit_lang = RDI_Language_CPlusPlus; - }break; - } - } - - //- rjf: get unit's ranges from .debug_aranges parse artifacts, if we have them - RDIM_Rng1U64ChunkList unit_voff_ranges = {0}; - if(arange_unit_from_info_off_map_slots_count != 0) - { - U64 unit_info_off = unit_info_ranges->v[unit_idx].min; - U64 hash = u64_hash_from_str8(str8_struct(&unit_info_off)); - U64 slot_idx = hash%arange_unit_from_info_off_map_slots_count; - for(D2R2_ARangeUnitNode *n = arange_unit_from_info_off_map_slots[slot_idx]; n != 0; n = n->next) - { - if(n->info_off == unit_info_off) - { - unit_voff_ranges = n->ranges[0]; - break; - } - } - } - - //- rjf: if we have no voff ranges from .debug_aranges, then we need to extract - // this info from the unit root rag instead (via ranges & low-pc/high-pc tags) - if(unit_voff_ranges.total_count == 0) - { - // rjf: gather ranges from a ranges attribute - if(ranges_attrib != &dw2_attrib_nil) - { - Rng1U64List ranges = dw2_rnglist_from_form_val(scratch.arena, unit_parse_ctx, raw, ranges_attrib->val); - for EachNode(n, Rng1U64Node, ranges.first) - { - rdim_rng1u64_chunk_list_push(arena, &unit_voff_ranges, 256, (RDIM_Rng1U64){n->v.min - base_vaddr, n->v.max - base_vaddr}); - } - } - - // rjf: gather contiguous range from low-pc / high-pc attribute - if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) - { - U64 voff_base = lopc_attrib->val.addr - base_vaddr; - U64 voff_opl = 0; - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<val.u128.u64[0]; - } - else - { - voff_opl = hipc_attrib->val.addr; - } - rdim_rng1u64_chunk_list_push(arena, &unit_voff_ranges, 256, (RDIM_Rng1U64){voff_base, voff_opl}); - } - } - - //- rjf: fill top-level unit info - { - dst_unit->unit_name = unit_name; - dst_unit->compiler_name = unit_producer; - // TODO(rjf): dst_unit->source_file = ???; - // TODO(rjf): dst_unit->object_file = ???; - // TODO(rjf): dst_unit->archive_file = ???; - dst_unit->build_path = unit_comp_dir; - dst_unit->language = unit_lang; - dst_unit->line_table = unit_line_tables[unit_idx]; - dst_unit->voff_ranges = unit_voff_ranges; - } - } - lane_sync(); - } - - //////////////////////////// - //- rjf: convert all symbols - // - typedef struct D2R2_ScopeContainerNode D2R2_ScopeContainerNode; - struct D2R2_ScopeContainerNode - { - D2R2_ScopeContainerNode *next; - U64 info_off; - RDIM_Scope *scope; - }; - typedef struct D2R2_ScopeContainerMap D2R2_ScopeContainerMap; - struct D2R2_ScopeContainerMap - { - D2R2_ScopeContainerNode **slots; - U64 slots_count; - }; - typedef struct D2R2_SubUnitWorkArtifacts D2R2_SubUnitWorkArtifacts; - struct D2R2_SubUnitWorkArtifacts - { - RDIM_SymbolChunkList global_variables; - RDIM_SymbolChunkList thread_variables; - RDIM_SymbolChunkList constants; - RDIM_SymbolChunkList procedures; - RDIM_ScopeChunkList scopes; - RDIM_InlineSiteChunkList inline_sites; - }; - D2R2_ScopeContainerMap *scope_container_map = 0; - D2R2_SubUnitWorkArtifacts *sub_unit_work_artifacts = 0; - ProfScope("convert all symbols") - { - if(lane_idx() == 0) - { - scope_container_map = push_array(scratch.arena, D2R2_ScopeContainerMap, 1); - scope_container_map->slots_count = total_tag_count_estimate/8 + 1; - scope_container_map->slots = push_array(scratch.arena, D2R2_ScopeContainerNode *, scope_container_map->slots_count); - sub_unit_work_artifacts = push_array(scratch.arena, D2R2_SubUnitWorkArtifacts, sub_unit_works_count); - } - lane_sync_u64(&scope_container_map, 0); - lane_sync_u64(&sub_unit_work_artifacts, 0); - U64 work_take_idx_ = 0; - U64 *work_take_idx_ptr = &work_take_idx_; - lane_sync_u64(&work_take_idx_ptr, 0); - for(;;) - { - U64 work_idx = ins_atomic_u64_inc_eval(work_take_idx_ptr) - 1; - if(work_idx >= sub_unit_works_count) - { - break; - } - - //- rjf: unpack work - U64 unit_idx = sub_unit_works[work_idx].unit_idx; - Rng1U64 root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; - D2R2_SubUnitWorkArtifacts *dst_artifacts = &sub_unit_work_artifacts[work_idx]; - - //- rjf: unpack unit info - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - - //- rjf: produce all unit symbols in this work - U64 chunk_count = 256; - for(U64 root_tag_idx = root_tag_idx_range.min; root_tag_idx < root_tag_idx_range.max; root_tag_idx += 1) - { - typedef struct D2R2_ParentNode D2R2_ParentNode; - struct D2R2_ParentNode - { - D2R2_ParentNode *next; - DW_TagKind tag_kind; - U64 info_off; - RDIM_Scope *scope; - RDIM_Type *container_type; - RDIM_Namespace *container_namespace; - RDIM_LocationCaseList framebase_location_cases; - }; - D2R2_ParentNode *top_parent = 0; - D2R2_ParentNode *free_parent = 0; - U64 root_tag_start_off = unit_info_root_tag_offs[unit_idx].v[root_tag_idx]; - S64 depth = 1; - for(U64 off = root_tag_start_off; off < unit_info_tag_range.max && (depth > 1 || off == root_tag_start_off);) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - U64 start_off = off; - - //////////////////////// - //- rjf: parse tag - // - DW2_Tag tag = {0}; - off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); - - //////////////////////// - //- rjf: gather attributes from tag - // - DW2_Attrib *name_attrib = &dw2_attrib_nil; - DW2_Attrib *linkname_attrib = &dw2_attrib_nil; - DW2_Attrib *type_attrib = &dw2_attrib_nil; - DW2_Attrib *inline_attrib = &dw2_attrib_nil; - DW2_Attrib *ranges_attrib = &dw2_attrib_nil; - DW2_Attrib *lopc_attrib = &dw2_attrib_nil; - DW2_Attrib *hipc_attrib = &dw2_attrib_nil; - DW2_Attrib *constval_attrib = &dw2_attrib_nil; - DW2_Attrib *location_attrib = &dw2_attrib_nil; - DW2_Attrib *framebase_attrib = &dw2_attrib_nil; - DW2_Attrib *external_attrib = &dw2_attrib_nil; - DW2_Attrib *decl_attrib = &dw2_attrib_nil; - for EachNode(n, DW2_AttribNode, tag.attribs.first) - { - switch(n->v.attrib_kind) - { - default:{}break; -#define Case(dst, src) case DW_AttribKind_##src:{dst##_attrib = &n->v;}break - Case(name, Name); - Case(linkname, LinkageName); - Case(type, Type); - Case(inline, Inline); - Case(ranges, Ranges); - Case(lopc, LowPc); - Case(hipc, HighPc); - Case(constval, ConstValue); - Case(location, Location); - Case(framebase, FrameBase); - Case(external, External); - Case(decl, Declaration); -#undef Case - } - } - - //////////////////////// - //- rjf: unpack basic attributes - // - String8 name = name_attrib->val.string; - String8 link_name = linkname_attrib->val.string; - DW_InlKind inl_kind = (DW_InlKind)inline_attrib->val.u128.u64[0]; - B32 is_external = (external_attrib != &dw2_attrib_nil); - B32 is_decl = (decl_attrib != &dw2_attrib_nil); - - //////////////////////// - //- rjf: unpack ranges - // - RDIM_Rng1U64List ranges = {0}; - { - if(ranges_attrib != &dw2_attrib_nil) - { - Temp temp = temp_begin(scratch2.arena); - Rng1U64List tag_ranges = dw2_rnglist_from_form_val(temp.arena, unit_parse_ctx, raw, ranges_attrib->val); - for EachNode(n, Rng1U64Node, tag_ranges.first) - { - rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){.min = n->v.min, .max = n->v.max}); - } - temp_end(temp); - } - if(lopc_attrib != &dw2_attrib_nil && hipc_attrib != &dw2_attrib_nil) - { - U64 voff_base = lopc_attrib->val.addr - base_vaddr; - U64 voff_opl = 0; - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<val.u128.u64[0]; - } - else - { - voff_opl = hipc_attrib->val.addr; - } - rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){voff_base, voff_opl}); - } - } - - //////////////////////// - //- rjf: unpack type - // - RDIM_Type *type = 0; - if(type_attrib != &dw2_attrib_nil || tag.kind == DW_TagKind_SubProgram) - { - // rjf: functions need to get their type info from themselves; the type attrib - // only references the return type. so, in that case, we'll use the procedure's - // own info offset / unit index, rather than the type attribute's. - U64 type_info_off = start_off; - U64 type_unit_idx = unit_idx; - - // rjf: attrib -> (info_off, unit_idx) - if(tag.kind != DW_TagKind_SubProgram) - { - type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); - type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, type_info_off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); - type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); - } - } - - // rjf: (info_off, unit_idx) -> hash - U64 type_hash = 0; - { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; - U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == type_info_off) - { - type_hash = n->dst_hash; - break; - } - } - } - - // rjf: hash -> type - { - U64 unique_type_tag_slot_idx = type_hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) - { - if(n->hash == type_hash) - { - type = type_from_idx_map[n->order_idx]; - break; - } - } - } - } - - //////////////////////// - //- rjf: unpack location info - // - RDIM_LocationCaseList location_cases = {0}; - RDIM_LocationCaseList framebase_location_cases = {0}; - B32 location_is_tls_dependent = 0; - B32 framebase_location_is_tls_dependent = 0; - { - struct - { - DW2_Attrib *attrib; - RDIM_LocationCaseList *dst_locations; - B32 *dst_is_tls_dependent; - } - tasks[] = - { - {location_attrib, &location_cases, &location_is_tls_dependent}, - {framebase_attrib, &framebase_location_cases, &framebase_location_is_tls_dependent}, - }; - for EachElement(task_idx, tasks) - { - if(tasks[task_idx].attrib == &dw2_attrib_nil) - { - continue; - } - DW2_Attrib *attrib = tasks[task_idx].attrib; - RDIM_LocationCaseList *dst_locations = tasks[task_idx].dst_locations; - B32 *dst_is_tls_dependent = tasks[task_idx].dst_is_tls_dependent; - - ////////////////////// - //- rjf: gather DWARF location exprs - // - DW2_LocList locs = {0}; - switch(attrib->val.kind) - { - default:{}break; - case DW_FormKind_ExprLoc: - { - U64 expr_info_off = attrib->val.u128.u64[0]; - U64 expr_info_size = attrib->val.u128.u64[1]; - String8 expr = str8_substr(raw->sec[DW_SectionKind_Info].data, r1u64(expr_info_off, expr_info_off+expr_info_size)); - DW2_LocNode *n = push_array(scratch2.arena, DW2_LocNode, 1); - n->v.expr = expr; - n->v.range = r1u64(0, max_U64); - SLLQueuePush(locs.first, locs.last, n); - locs.count += 1; - }break; - case DW_FormKind_LocListx: // NOTE(rjf): dwarf5+, loclistx -> location list offset table - case DW_FormKind_SecOffset: // NOTE(rjf): pre-dwarf5, location section offset -> a location list - { - locs = dw2_loclist_from_form_val(scratch2.arena, unit_parse_ctx, raw, attrib->val); - }break; - } - - ////////////////////// - //- rjf: convert DWARF location exprs -> RDIM locations - // - // we do this for each possible frame base location case - locations in DWARF - // refer to the frame base via a special op. in our case, we want to bake that - // into the location directly to reduce extra context for evaluation. - // - // if we find that a location doesn't rely on the frame base at all, we just - // skip the rest. - // - B32 is_tls_dependent = 0; - for EachNode(n, DW2_LocNode, locs.first) - { - //- rjf: unpack location - Rng1U64 range = n->v.range; - String8 expr = n->v.expr; - - //- rjf: iterate each frame base location case, or once if there are none, - // and convert the location in that context - RDIM_LocationCase nil_framebase_loc_case = {0, {0}, {0, max_U64}}; - for(RDIM_LocationCase *framebase_loc_n = top_parent ? top_parent->framebase_location_cases.first : &nil_framebase_loc_case; - framebase_loc_n != 0; - framebase_loc_n = framebase_loc_n->next) - { - //- rjf: unpack framebase location - RDIM_Location framebase_loc = framebase_loc_n->location; - RDIM_Rng1U64 framebase_voff_range = framebase_loc_n->voff_range; - - //- rjf: set up type stack for type-evaluating bytecode - typedef struct D2R2_ExprVal D2R2_ExprVal; - struct D2R2_ExprVal - { - RDI_TypeKind type_kind; - B32 is_addr; - }; - typedef struct D2R2_ExprValNode D2R2_ExprValNode; - struct D2R2_ExprValNode - { - D2R2_ExprValNode *next; - D2R2_ExprVal v; - }; - D2R2_ExprValNode *val_stack_top = 0; - D2R2_ExprValNode *free_val = 0; - - //- rjf: process DWARF bytecode; produce RDI bytecode + mini-type-info for the expression's result - typedef struct JumpOpNode JumpOpNode; - struct JumpOpNode - { - JumpOpNode *next; - RDIM_EvalBytecodeOp *op; - S64 inst_delta; - }; - JumpOpNode *first_jump_op = 0; - JumpOpNode *last_jump_op = 0; - RDIM_EvalBytecode dst_bytecode = {0}; - B32 dst_bytecode_is_good = 1; - B32 bytecode_is_framebase_dependent = 0; - for(U64 expr_off = 0; expr_off < expr.size;) - { - U64 start_expr_off = expr_off; - - //- rjf: read next opcode - DW_ExprOp opcode = 0; - expr_off += str8_deserial_read_struct(expr, expr_off, &opcode); - - //- rjf: unpack opcode - DW_ExprOpInfo *opcode_info = dw_info_from_expr_op(unit_parse_ctx->version, unit_parse_ctx->exts, opcode); - U64 operands_count = opcode_info->operand_count; - DW_ExprOperandKind operands_kinds[2] = {opcode_info->operand_kinds[0], opcode_info->operand_kinds[1]}; - U64 push_count = opcode_info->push_count; - U64 pop_count = opcode_info->pop_count; - - //- rjf: read op operands - U64 operand_u64s[2] = {0}; - S64 operand_s64s[2] = {0}; - String8 operand_str8s[2] = {0}; - for EachIndex(operand_idx, operands_count) - { - switch(operands_kinds[operand_idx]) - { - case DW_ExprOperandKind_Null: - default:{}break; - case DW_ExprOperandKind_U8: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 1, 1);}break; - case DW_ExprOperandKind_U16: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 2, 2);}break; - case DW_ExprOperandKind_U32: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 4, 4);}break; - case DW_ExprOperandKind_U64: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], 8, 8);}break; - case DW_ExprOperandKind_S8: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 1, 1);}break; - case DW_ExprOperandKind_S16: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 2, 2);}break; - case DW_ExprOperandKind_S32: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 4, 4);}break; - case DW_ExprOperandKind_S64: {expr_off += str8_deserial_read(expr, expr_off, &operand_s64s[operand_idx], 8, 8);}break; - case DW_ExprOperandKind_ULEB128: {expr_off += str8_deserial_read_uleb128(expr, expr_off, &operand_u64s[operand_idx]);} break; - case DW_ExprOperandKind_SLEB128: {expr_off += str8_deserial_read_sleb128(expr, expr_off, &operand_s64s[operand_idx]);} break; - case DW_ExprOperandKind_Addr: {expr_off += str8_deserial_read(expr, expr_off, &operand_u64s[operand_idx], unit_parse_ctx->addr_size, unit_parse_ctx->addr_size);}break; - case DW_ExprOperandKind_DwarfUInt: {expr_off += dw2_read_fmt_u64(expr, expr_off, unit_parse_ctx->format, &operand_u64s[operand_idx]);}break; - case DW_ExprOperandKind_Block: - { - U8 block_size = 0; - expr_off += str8_deserial_read_struct(expr, expr_off, &block_size); - operand_str8s[operand_idx] = str8_substr(expr, r1u64(expr_off, expr_off+block_size)); - expr_off += block_size; - }break; - } - } - - //- rjf: pop stack values - D2R2_ExprVal popped_vals[2] = {0}; - { - pop_count = Min(pop_count, ArrayCount(popped_vals)); - for EachIndex(pop_idx, pop_count) - { - if(val_stack_top != 0) - { - D2R2_ExprValNode *popped = val_stack_top; - popped_vals[pop_idx] = popped->v; - SLLStackPop(val_stack_top); - SLLStackPush(free_val, popped); - } - } - } - - //- rjf: exec op (produce RDI bytecode, + manipulate value stack) - D2R2_ExprVal push_vals[2] = {0}; - U64 regcode_dw = 0; - S64 regval_off = 0; - B32 regread_is_addr = 0; - U64 target_pick_val_idx = 0; - RDI_EvalOp rdi_eval_op = 0; - U64 memread_size = 0; - switch(opcode) - { - default:{}break; - - //- rjf: small opcode-embedded unsigned literals - case DW_ExprOp_Lit0: case DW_ExprOp_Lit1: case DW_ExprOp_Lit2: - case DW_ExprOp_Lit3: case DW_ExprOp_Lit4: case DW_ExprOp_Lit5: - case DW_ExprOp_Lit6: case DW_ExprOp_Lit7: case DW_ExprOp_Lit8: - case DW_ExprOp_Lit9: case DW_ExprOp_Lit10: case DW_ExprOp_Lit11: - case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14: - case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17: - case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20: - case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23: - case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26: - case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29: - case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: - { - U64 lit_val = (U64)(opcode - DW_ExprOp_Lit0); - rdim_bytecode_push_uconst(arena, &dst_bytecode, lit_val); - }break; - - //- rjf: small unsigned literals - case DW_ExprOp_Const1U: push_vals[0].type_kind = RDI_TypeKind_U8; goto const_u; - case DW_ExprOp_Const2U: push_vals[0].type_kind = RDI_TypeKind_U16; goto const_u; - case DW_ExprOp_Const4U: push_vals[0].type_kind = RDI_TypeKind_U32; goto const_u; - case DW_ExprOp_Const8U: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; - case DW_ExprOp_ConstU: push_vals[0].type_kind = RDI_TypeKind_U64; goto const_u; - const_u:; - { - rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); - }break; - - //- rjf: small signed literals - case DW_ExprOp_Const1S: push_vals[0].type_kind = RDI_TypeKind_S8; goto const_s; - case DW_ExprOp_Const2S: push_vals[0].type_kind = RDI_TypeKind_S16; goto const_s; - case DW_ExprOp_Const4S: push_vals[0].type_kind = RDI_TypeKind_S32; goto const_s; - case DW_ExprOp_Const8S: push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; - case DW_ExprOp_ConstS : push_vals[0].type_kind = RDI_TypeKind_S64; goto const_s; - const_s:; - { - rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); - }break; - - //- rjf: address (module offsets) - case DW_ExprOp_Addr: - { - U64 voff = operand_u64s[0] - base_vaddr; - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); - push_vals[0].type_kind = RDI_TypeKind_U64; - push_vals[0].is_addr = 1; - }break; - case DW_ExprOp_Addrx: - if(unit_parse_ctx->addr_table != 0) - { - U64 addr_idx = operand_u64s[0]; - U64 addr = 0; - if(dw2_try_offset_from_table_idx(unit_parse_ctx->addr_table, addr_idx, &addr)) - { - U64 voff = (addr > base_vaddr) ? (addr - base_vaddr) : 0; - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_ModuleOff, voff); - push_vals[0].type_kind = RDI_TypeKind_U64; - push_vals[0].is_addr = 1; - } - }break; - - //- rjf: register reads - case DW_ExprOp_Reg0: case DW_ExprOp_Reg1: case DW_ExprOp_Reg2: - case DW_ExprOp_Reg3: case DW_ExprOp_Reg4: case DW_ExprOp_Reg5: - case DW_ExprOp_Reg6: case DW_ExprOp_Reg7: case DW_ExprOp_Reg8: - case DW_ExprOp_Reg9: case DW_ExprOp_Reg10: case DW_ExprOp_Reg11: - case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14: - case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17: - case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20: - case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23: - case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26: - case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29: - case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: - { - regcode_dw = (U64)(opcode - DW_ExprOp_Reg0); - }goto reg_read; - case DW_ExprOp_RegX: - { - regcode_dw = operand_u64s[0]; - }goto reg_read; - case DW_ExprOp_BReg0: case DW_ExprOp_BReg1: case DW_ExprOp_BReg2: - case DW_ExprOp_BReg3: case DW_ExprOp_BReg4: case DW_ExprOp_BReg5: - case DW_ExprOp_BReg6: case DW_ExprOp_BReg7: case DW_ExprOp_BReg8: - case DW_ExprOp_BReg9: case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: - case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: - case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: - case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: - case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: - case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: - case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: - case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: - { - regcode_dw = (U64)(opcode - DW_ExprOp_BReg0); - regval_off = operand_s64s[1]; - regread_is_addr = 1; - }goto reg_read; - case DW_ExprOp_BRegX: - { - regcode_dw = operand_u64s[0]; - regval_off = operand_s64s[1]; - regread_is_addr = 1; - }goto reg_read; - reg_read:; - { - // rjf: DWARF regcode -> internal regcode - ARCH_RegCode regcode = arch_reg_code_from_dw(arch, regcode_dw); - - // rjf: internal regcode -> RDI, offset, size - RDI_RegCode regcode_rdi = 0; - U64 reg_off = 0; - U64 reg_size = 0; - { - Rng1U16 reg_rng = arch_info->reg_code_rng_table[regcode]; - reg_size = dim_1u16(reg_rng); - regcode_rdi = arch_rdi_from_reg_code_table_from_arch(arch)[regcode]; - } - - // rjf: push op - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_RegRead, RDI_EncodeRegReadParam(regcode_rdi, reg_size, reg_off)); - - // rjf: push add to value offset, if needed - if(regval_off != 0) - { - rdim_bytecode_push_sconst(arena, &dst_bytecode, regval_off); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); - } - - // rjf: choose if we're doing a float op - B32 is_float_op = 0; - if(arch == Arch_x64 && - (regcode_rdi == RDI_RegCodeX64_st0 || - regcode_rdi == RDI_RegCodeX64_st1 || - regcode_rdi == RDI_RegCodeX64_st2 || - regcode_rdi == RDI_RegCodeX64_st3 || - regcode_rdi == RDI_RegCodeX64_st4 || - regcode_rdi == RDI_RegCodeX64_st5 || - regcode_rdi == RDI_RegCodeX64_st6 || - regcode_rdi == RDI_RegCodeX64_st7)) - { - is_float_op = 1; - } - - // rjf: set up push value - push_vals[0].is_addr = regread_is_addr; - if(is_float_op) - { - switch(reg_size) - { - default:{}break; - case 2: {push_vals[0].type_kind = RDI_TypeKind_F16;}break; - case 4: {push_vals[0].type_kind = RDI_TypeKind_F32;}break; - case 6: {push_vals[0].type_kind = RDI_TypeKind_F48;}break; - case 8: {push_vals[0].type_kind = RDI_TypeKind_F64;}break; - case 10:{push_vals[0].type_kind = RDI_TypeKind_F80;}break; - case 12:{push_vals[0].type_kind = RDI_TypeKind_F96;}break; - case 16:{push_vals[0].type_kind = RDI_TypeKind_F128;}break; - } - } - else - { - switch(reg_size) - { - default:{}break; - case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; - case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; - case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; - case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; - } - } - }break; - - //- rjf: implicit values - case DW_ExprOp_ImplicitValue: - { - if(operand_str8s[0].size <= sizeof(U64)) - { - U64 implicit_value = 0; - MemoryCopy(&implicit_value, operand_str8s[0].str, Min(sizeof(U64), operand_str8s[0].size)); - rdim_bytecode_push_uconst(arena, &dst_bytecode, implicit_value); - switch(operand_str8s[0].size) - { - default:{}break; - case 1:{push_vals[0].type_kind = RDI_TypeKind_U8;}break; - case 2:{push_vals[0].type_kind = RDI_TypeKind_U16;}break; - case 4:{push_vals[0].type_kind = RDI_TypeKind_U32;}break; - case 8:{push_vals[0].type_kind = RDI_TypeKind_U64;}break; - } - } - else - { - log_infof("[.debug_info@0x%I64x] Implicit value DWARF expression operation (DW_ExprOp_ImplicitValue) with block size >8 (%I64u) found. This is not currently supported.\n", start_off, operand_str8s[0].size); - } - }break; - - //- rjf: pieces - case DW_ExprOp_Piece: - { - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValue, operand_u64s[0]); - }break; - case DW_ExprOp_BitPiece: - { - U64 size = operand_u64s[0]; - U64 off = operand_u64s[1]; - U64 partial_value = ((size<<32)|(off)); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_PartialValueBit, partial_value); - }break; - - //- rjf: stack ops - case DW_ExprOp_Over: {target_pick_val_idx = 1;}goto pick; - case DW_ExprOp_Pick: {target_pick_val_idx = operand_u64s[0];}goto pick; - case DW_ExprOp_Dup: {target_pick_val_idx = 0;}goto pick; - pick:; - { - // rjf: pick value from stack - D2R2_ExprVal picked_val = {0}; - { - U64 idx = 0; - for(D2R2_ExprValNode *n = val_stack_top; n != 0; n = n->next) - { - if(idx == target_pick_val_idx) - { - picked_val = n->v; - break; - } - } - } - - // rjf: push opcode - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pick, target_pick_val_idx); - - // rjf: push val - push_vals[0] = picked_val; - }break; - case DW_ExprOp_Swap: - { - push_vals[0] = popped_vals[1]; - push_vals[1] = popped_vals[0]; - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Swap, 0); - }break; - case DW_ExprOp_Drop: - { - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Pop, 0); - }break; - - //- rjf: jumps - case DW_ExprOp_Skip: rdi_eval_op = RDI_EvalOp_Skip; goto jumps; - case DW_ExprOp_Bra: rdi_eval_op = RDI_EvalOp_Cond; goto jumps; - jumps:; - { - // rjf: jump delta in bytes (how the instruction is encoded) -> jump delta in instructions - S64 jump_delta_bytes = operand_s64s[0]; - S64 jump_delta_insts = 0; - { - // TODO(rjf): expr op jumps bytes -> inst counts - } - - // rjf: push incomplete op (we need to resolve inst delta -> byte delta later, once we have the full bytecode stream) - RDIM_EvalBytecodeOp *op = rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, 0); - - // rjf: gather op - JumpOpNode *n = push_array(scratch2.arena, JumpOpNode, 1); - SLLQueuePush(first_jump_op, last_jump_op, n); - n->op = op; - n->inst_delta = jump_delta_insts; - }break; - - //- rjf: containing procedure frame offsets - case DW_ExprOp_FBReg: - { - bytecode_is_framebase_dependent = 1; - for EachNode(n, RDIM_EvalBytecodeOp, framebase_loc.bytecode.first_op) - { - rdim_bytecode_push_op(arena, &dst_bytecode, n->op, n->p); - } - rdim_bytecode_push_sconst(arena, &dst_bytecode, operand_s64s[0]); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_S); - push_vals[0].type_kind = RDI_TypeKind_U64; - push_vals[0].is_addr = 1; - }break; - - //- rjf: memory reads - case DW_ExprOp_Deref: memread_size = unit_parse_ctx->addr_size; goto deref; - case DW_ExprOp_DerefSize: memread_size = operand_u64s[0]; goto deref; - deref:; - { - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_MemRead, memread_size); - push_vals[0].is_addr = 1; - push_vals[0].type_kind = RDI_TypeKind_U64; - }break; - - //- rjf: TLS offsets - case DW_ExprOp_FormTlsAddress: - case DW_GNU_ExprOp_PushTlsAddress: - { - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_TLSOff, 0); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); - push_vals[0].is_addr = 1; - push_vals[0].type_kind = RDI_TypeKind_U64; - is_tls_dependent = 1; - }break; - - //- rjf: call site value - case DW_ExprOp_EntryValue: - case DW_GNU_ExprOp_EntryValue: - { - // TODO(rjf): expr op entry value ops - }break; - - //- rjf: fixed adds - case DW_ExprOp_PlusUConst: - { - rdim_bytecode_push_uconst(arena, &dst_bytecode, operand_u64s[0]); - rdim_bytecode_push_op(arena, &dst_bytecode, RDI_EvalOp_Add, RDI_EvalTypeGroup_U); - push_vals[0].type_kind = RDI_TypeKind_U64; // TODO(rjf): do we need to adjust this based on popped value at all, even? - }break; - - //- rjf: arithmetic ops - case DW_ExprOp_Eq: {rdi_eval_op = RDI_EvalOp_EqEq;}goto arithmetic_op; - case DW_ExprOp_Ge: {rdi_eval_op = RDI_EvalOp_GrEq;}goto arithmetic_op; - case DW_ExprOp_Gt: {rdi_eval_op = RDI_EvalOp_Grtr;}goto arithmetic_op; - case DW_ExprOp_Le: {rdi_eval_op = RDI_EvalOp_LsEq;}goto arithmetic_op; - case DW_ExprOp_Lt: {rdi_eval_op = RDI_EvalOp_Less;}goto arithmetic_op; - case DW_ExprOp_Ne: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; - case DW_ExprOp_Div: {rdi_eval_op = RDI_EvalOp_Div;}goto arithmetic_op; - case DW_ExprOp_Minus: {rdi_eval_op = RDI_EvalOp_Sub;}goto arithmetic_op; - case DW_ExprOp_Mul: {rdi_eval_op = RDI_EvalOp_Mul;}goto arithmetic_op; - case DW_ExprOp_Plus: {rdi_eval_op = RDI_EvalOp_Add;}goto arithmetic_op; - case DW_ExprOp_Xor: {rdi_eval_op = RDI_EvalOp_BitXor;}goto arithmetic_op; - case DW_ExprOp_And: {rdi_eval_op = RDI_EvalOp_BitAnd;}goto arithmetic_op; - case DW_ExprOp_Or: {rdi_eval_op = RDI_EvalOp_BitOr;}goto arithmetic_op; - case DW_ExprOp_Shl: {rdi_eval_op = RDI_EvalOp_LShift;}goto arithmetic_op; - case DW_ExprOp_Shr: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; - case DW_ExprOp_Shra: {rdi_eval_op = RDI_EvalOp_RShift;}goto arithmetic_op; - case DW_ExprOp_Mod: {rdi_eval_op = RDI_EvalOp_Mod;}goto arithmetic_op; - case DW_ExprOp_Abs: {rdi_eval_op = RDI_EvalOp_Abs;}goto arithmetic_op; - case DW_ExprOp_Neg: {rdi_eval_op = RDI_EvalOp_Neg;}goto arithmetic_op; - case DW_ExprOp_Not: {rdi_eval_op = RDI_EvalOp_LogNot;}goto arithmetic_op; - arithmetic_op:; - { - // TODO(rjf): eval arithmetic conversions etc. - rdim_bytecode_push_op(arena, &dst_bytecode, rdi_eval_op, RDI_EvalTypeGroup_U); - }break; - - //- rjf: currently unsupported - case DW_ExprOp_XDeref: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression XDeref operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_XDerefSize: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression XDerefSize operation encountered, implying multiple address spaces; this is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_Call2: - case DW_ExprOp_Call4: - case DW_ExprOp_CallRef: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression call operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_ImplicitPointer: - case DW_GNU_ExprOp_ImplicitPointer: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression implicit pointer operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_GNU_ExprOp_ParameterRef: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression GNU_ParameterRef operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_DerefType: - case DW_GNU_ExprOp_DerefType: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression DerefType operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_ConstType: - case DW_GNU_ExprOp_ConstType: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression ConstType operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_RegvalType: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression RegvalType operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_PushObjectAddress: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression PushObjectAddress operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_ExprOp_Rot: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression Rot (rotate) operation encountered. This is not supported for location info.\n", start_off); - }break; - case DW_GNU_ExprOp_UnInit: - { - dst_bytecode_is_good = 0; - log_infof("[.debug_info@0x%I64x] DWARF expression GNU_UnInit operation encountered. This is not supported for location info.\n", start_off); - // TODO: flag value as unitialized; this must be last opcode; possible to use with DW_ExprOp_Piece; - } break; - } - - //- rjf: push values to stack - { - push_count = Min(push_count, ArrayCount(push_vals)); - for EachIndex(push_idx, push_count) - { - D2R2_ExprValNode *n = free_val; - if(n != 0) - { - SLLStackPop(free_val); - } - else - { - n = push_array(scratch2.arena, D2R2_ExprValNode, 1); - } - n->v = push_vals[push_idx]; - SLLStackPush(val_stack_top, n); - } - } - - if(expr_off == start_expr_off) - { - break; - } - } - - //- rjf: apply RDI byte offsets to jump ops - { - // TODO(rjf): apply RDI byte offsets to jump ops - } - - //- rjf: map bytecode -> RDIM_Location - we may want to simplify - RDIM_Location loc = {0}; - { - loc.kind = val_stack_top && val_stack_top->v.is_addr ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream; - loc.bytecode = dst_bytecode; - - // rjf: gather first few bytecodes for pattern matching - RDI_EvalOp beginning_ops[5] = {0}; - RDIM_EvalBytecodeOp *beginning_nodes[5] = {0}; - { - U64 idx = 0; - for EachNode(n, RDIM_EvalBytecodeOp, dst_bytecode.first_op) - { - if(idx >= ArrayCount(beginning_ops)) - { - break; - } - beginning_ops[idx] = n->op; - beginning_nodes[idx] = n; - idx += 1; - } - } - - // rjf: match val registers - if(loc.kind == RDI_LocationKind_ValBytecodeStream && - beginning_ops[0] == RDI_EvalOp_RegRead && - beginning_ops[1] == RDI_EvalOp_Stop) - { - U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; - U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; - U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; - if(byte_size == unit_parse_ctx->addr_size && - byte_off == 0) - { - loc.kind = RDI_LocationKind_ValReg; - loc.reg_code = rdi_reg_code; - } - } - - // rjf: match simple register offsets - if(loc.kind == RDI_LocationKind_AddrBytecodeStream && - beginning_ops[0] == RDI_EvalOp_RegRead && - (beginning_ops[1] == RDI_EvalOp_ConstU8 || - beginning_ops[1] == RDI_EvalOp_ConstU16) && - beginning_ops[2] == RDI_EvalOp_TruncSigned && - beginning_ops[3] == RDI_EvalOp_Add && - beginning_ops[4] == RDI_EvalOp_Stop) - { - U8 rdi_reg_code = (beginning_nodes[0]->p&0x0000FF)>>0; - U8 byte_size = (beginning_nodes[0]->p&0x00FF00)>>8; - U8 byte_off = (beginning_nodes[0]->p&0xFF0000)>>16; - if(byte_off == 0 && byte_size == unit_parse_ctx->addr_size) - { - loc.kind = RDI_LocationKind_AddrRegPlusOff; - loc.reg_code = rdi_reg_code; - loc.offset = beginning_nodes[1]->p; - } - } - - // rjf: match simple module offsets - if(beginning_ops[0] == RDI_EvalOp_ModuleOff && beginning_ops[1] == RDI_EvalOp_Stop) - { - U64 voff = beginning_nodes[0]->p; - loc.kind = RDI_LocationKind_ModuleOff; - loc.offset = voff; - } - else if(((beginning_ops[0] == RDI_EvalOp_ModuleOff && - (beginning_ops[1] == RDI_EvalOp_ConstU8 || - beginning_ops[1] == RDI_EvalOp_ConstU16 || - beginning_ops[1] == RDI_EvalOp_ConstU32 || - beginning_ops[1] == RDI_EvalOp_ConstU64)) || - (beginning_ops[1] == RDI_EvalOp_ModuleOff && - (beginning_ops[0] == RDI_EvalOp_ConstU8 || - beginning_ops[0] == RDI_EvalOp_ConstU16 || - beginning_ops[0] == RDI_EvalOp_ConstU32 || - beginning_ops[0] == RDI_EvalOp_ConstU64))) && - beginning_ops[2] == RDI_EvalOp_Add && - beginning_ops[3] == RDI_EvalOp_Stop) - { - U64 voff = beginning_nodes[0]->p + beginning_nodes[1]->p; - loc.kind = RDI_LocationKind_ModuleOff; - loc.offset = voff; - } - - // rjf: match simple TLS offsets - if(beginning_ops[0] == RDI_EvalOp_TLSOff && beginning_ops[1] == RDI_EvalOp_Stop) - { - U64 toff = beginning_nodes[0]->p; - loc.kind = RDI_LocationKind_TLSOff; - loc.offset = toff; - } - else if(((beginning_ops[0] == RDI_EvalOp_TLSOff && - (beginning_ops[1] == RDI_EvalOp_ConstU8 || - beginning_ops[1] == RDI_EvalOp_ConstU16 || - beginning_ops[1] == RDI_EvalOp_ConstU32 || - beginning_ops[1] == RDI_EvalOp_ConstU64)) || - (beginning_ops[1] == RDI_EvalOp_TLSOff && - (beginning_ops[0] == RDI_EvalOp_ConstU8 || - beginning_ops[0] == RDI_EvalOp_ConstU16 || - beginning_ops[0] == RDI_EvalOp_ConstU32 || - beginning_ops[0] == RDI_EvalOp_ConstU64))) && - beginning_ops[2] == RDI_EvalOp_Add && - beginning_ops[3] == RDI_EvalOp_Stop) - { - U64 toff = beginning_nodes[0]->p + beginning_nodes[1]->p; - loc.kind = RDI_LocationKind_TLSOff; - loc.offset = toff; - } - } - - //- rjf: collect - { - RDIM_Rng1U64 voff_range = {range.min - base_vaddr, range.max - base_vaddr}; - if(bytecode_is_framebase_dependent) - { - voff_range.min = Max(voff_range.min, framebase_voff_range.min); - voff_range.max = Min(voff_range.max, framebase_voff_range.max); - } - rdim_location_case_list_push(arena, dst_locations, loc, voff_range); - dst_is_tls_dependent[0] = is_tls_dependent; - } - - //- rjf: not frame-base dependent? -> break - don't do this per-framebase case - if(!bytecode_is_framebase_dependent) - { - break; - } - } - } - } - } - - //////////////////////// - //- rjf: produce symbols from tag - // - RDIM_Symbol *new_symbol = 0; - RDIM_Scope *new_scope_open = 0; - B32 parent_tag_is_container_to_deduped_tags = 0; - switch(tag.kind) - { - default:{}break; - - //- rjf: determine if parent tag is a container to deduplicated tags - case DW_TagKind_Namespace: - case DW_TagKind_StructureType: - case DW_TagKind_UnionType: - case DW_TagKind_ClassType: - case DW_TagKind_EnumerationType: - case DW_TagKind_Typedef: - { - parent_tag_is_container_to_deduped_tags = 1; - }break; - - //- rjf: subprograms (procedures) - case DW_TagKind_SubProgram: - if(!is_decl) - { - RDIM_Scope *root_scope = rdim_scope_chunk_list_push(arena, &dst_artifacts->scopes, chunk_count); - RDIM_Symbol *procedure = rdim_symbol_chunk_list_push(arena, &dst_artifacts->procedures, chunk_count); - procedure->name = name; - procedure->link_name = link_name; - procedure->type = type; - procedure->root_scope = root_scope; - procedure->location_cases = framebase_location_cases; - root_scope->symbol = procedure; - root_scope->voff_ranges = ranges; - dst_artifacts->scopes.scope_voff_count += 2*ranges.count; - new_symbol = procedure; - new_scope_open = root_scope; - }break; - - //- rjf: inline site - case DW_TagKind_InlinedSubroutine: - { - // TODO(rjf) - }break; - - //- rjf: variables - case DW_TagKind_Variable: - case DW_TagKind_FormalParameter: - if(name.size != 0) - { - U64 var_chunk_count = chunk_count; - RDIM_SymbolChunkList *dst_symbols = &dst_artifacts->global_variables; - if(location_is_tls_dependent) - { - dst_symbols = &dst_artifacts->thread_variables; - } - else if(top_parent != 0 && top_parent->scope != 0) - { - dst_symbols = &top_parent->scope->locals; - var_chunk_count = 8; - } - RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, dst_symbols, var_chunk_count); - var->is_extern = is_external; - var->is_param = (tag.kind == DW_TagKind_FormalParameter); - var->name = name; - var->link_name = link_name; - var->type = type; - var->location_cases = location_cases; - new_symbol = var; - }break; - - //- rjf: lexical blocks (scopes) - case DW_TagKind_LexicalBlock: - { - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &dst_artifacts->scopes, chunk_count); - scope->voff_ranges = ranges; - dst_artifacts->scopes.scope_voff_count += 2*ranges.count; - new_scope_open = scope; - }break; - } - - //////////////////////// - //- rjf: if we've determined that the parent tag is a container to - // deduplicated tags (types, namespaces), then we need to record - // the .debug_info offset -> scope mapping for this scope, so it - // can be equipped as a container later. - // - if(parent_tag_is_container_to_deduped_tags) - { - U64 info_off = 0; - RDIM_Scope *scope = 0; - for(D2R2_ParentNode *n = top_parent; n != 0; n = n->next) - { - if(n->scope != 0) - { - info_off = n->info_off; - scope = n->scope; - break; - } - } - if(scope != 0) - { - D2R2_ScopeContainerNode *n = push_array(scratch.arena, D2R2_ScopeContainerNode, 1); - n->info_off = info_off; - n->scope = scope; - U64 hash = u64_hash_from_str8(str8_struct(&info_off)); - U64 slot_idx = hash%scope_container_map->slots_count; - for(B32 gathered = 0; !gathered;) - { - U64 expected_head_value = ins_atomic_u64_eval(&scope_container_map->slots[slot_idx]); - n->next = (D2R2_ScopeContainerNode *)expected_head_value; - if(expected_head_value == ins_atomic_u64_eval_cond_assign(&scope_container_map->slots[slot_idx], (U64)n, expected_head_value)) - { - gathered = 1; - } - } - } - } - - //////////////////////// - //- rjf: equip new symbols with container info - // - if(new_symbol != 0 && top_parent != 0) - { - if(top_parent->scope != 0) - { - new_symbol->container_scope = top_parent->scope; - } - else if(top_parent->container_type != 0) - { - new_symbol->container_type = top_parent->container_type; - } - else if(top_parent->container_namespace != 0) - { - new_symbol->container_namespace = top_parent->container_namespace; - } - } - - //////////////////////// - //- rjf: insert new scopes to their parent - // - if(new_scope_open && top_parent != 0 && top_parent->scope != 0) - { - RDIM_Scope *parent = top_parent->scope; - SLLQueuePush_N(parent->first_child, parent->last_child, new_scope_open, next_sibling); - new_scope_open->parent_scope = parent; - if(new_scope_open->symbol == 0) - { - new_scope_open->symbol = parent->symbol; - } - } - - //////////////////////// - //- rjf: gather container info for new tag parents - // - RDIM_Type *container_type = 0; - RDIM_Namespace *container_namespace = 0; - if(tag.has_children) - { - // rjf: info offset -> hash - U64 hash = 0; - { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; - U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for EachNode(n, D2R2_UnitDedupedTagNode, unit_deduped_tag_map->slots[info_off_slot_idx]) - { - if(n->src_info_off == start_off) - { - hash = n->dst_hash; - break; - } - } - } - - // rjf: map hash -> unique tag node - D2R2_UniqueTagNode *tag_node = 0; - { - U64 slot_idx = hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) - { - if(n->hash == hash) - { - tag_node = n; - break; - } - } - } - - // rjf: map tag node -> type/namespace - if(tag_node != 0) switch(tag_node->kind) - { - default:{}break; - case D2R2_UniqueTagKind_Type: {container_type = type_from_idx_map[tag_node->order_idx];}break; - case D2R2_UniqueTagKind_Namespace:{container_namespace = namespace_from_idx_map[tag_node->order_idx];}break; - } - } - - //////////////////////// - //- rjf: push tag parents - // - if(tag.has_children) - { - // rjf: push new parent to stack - D2R2_ParentNode *n = free_parent; - if(n != 0) - { - SLLStackPop(free_parent); - } - else - { - n = push_array(scratch.arena, D2R2_ParentNode, 1); - } - n->tag_kind = tag.kind; - n->info_off = start_off; - n->scope = new_scope_open ? new_scope_open : top_parent ? top_parent->scope : 0; - n->container_type = new_scope_open ? 0 : container_type; - n->container_namespace = new_scope_open ? 0 : container_namespace; - if(framebase_attrib != &dw2_attrib_nil) - { - n->framebase_location_cases = framebase_location_cases; - } - else if(top_parent != 0) - { - n->framebase_location_cases = top_parent->framebase_location_cases; - } - SLLStackPush(top_parent, n); - } - - //////////////////////// - //- rjf: pop scopes - // - if(tag.kind == DW_TagKind_Null && top_parent != 0) - { - D2R2_ParentNode *n = top_parent; - SLLStackPop(top_parent); - SLLStackPush(free_parent, n); - } - - //////////////////////// - //- rjf: tree nav - // - if(tag.has_children) - { - depth += 1; - } - if(tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - - scratch_end(scratch2); - if(off == start_off) - { - break; - } - } - } - } - lane_sync(); - } - - //////////////////////////// - //- rjf: join all symbols from all sub-unit works into their units - // - ProfScope("join all symbols from all sub-unit works into their units") - { - U64 unit_take_idx_ = 0; - U64 *unit_take_idx_ptr = &unit_take_idx_; - lane_sync_u64(&unit_take_idx_ptr, 0); - for(;;) - { - U64 unit_idx = ins_atomic_u64_inc_eval(unit_take_idx_ptr)-1; - if(unit_idx >= unit_count) - { - break; - } - RDIM_Unit *dst_unit = unit_from_idx_map[unit_idx]; - for EachIndex(work_idx, sub_unit_works_count) - { - if(sub_unit_works[work_idx].unit_idx == unit_idx) - { - rdim_symbol_chunk_list_concat_in_place(&dst_unit->global_variables, &sub_unit_work_artifacts[work_idx].global_variables); - rdim_symbol_chunk_list_concat_in_place(&dst_unit->thread_variables, &sub_unit_work_artifacts[work_idx].thread_variables); - rdim_symbol_chunk_list_concat_in_place(&dst_unit->constants, &sub_unit_work_artifacts[work_idx].constants); - rdim_symbol_chunk_list_concat_in_place(&dst_unit->procedures, &sub_unit_work_artifacts[work_idx].procedures); - rdim_scope_chunk_list_concat_in_place(&dst_unit->scopes, &sub_unit_work_artifacts[work_idx].scopes); - rdim_inline_site_chunk_list_concat_in_place(&dst_unit->inline_sites, &sub_unit_work_artifacts[work_idx].inline_sites); - } - } - } - lane_sync(); - } - - //////////////////////////// - //- rjf: upgrade all types with namespacing info - // - ProfScope("upgrade all types with namespacing info") - { - Rng1U64 range = lane_range(type_count); - for EachInRange(type_idx, range) - { - D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; - U64 container_ancestor_info_off = type_tag_node->container_ancestor_info_off; - RDIM_Type *dst_type = type_from_idx_map[type_idx]; - if(dst_type == 0) - { - continue; - } - RDIM_UDT *dst_udt = dst_type->udt; - if(dst_udt == 0) - { - continue; - } - - // rjf: find container scopes - RDIM_Scope *container_scope = 0; - { - U64 info_off = container_ancestor_info_off; - U64 hash = u64_hash_from_str8(str8_struct(&info_off)); - U64 slot_idx = hash%scope_container_map->slots_count; - for(D2R2_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) - { - if(n->info_off == info_off) - { - container_scope = n->scope; - break; - } - } - } - - // rjf: find container types/namespaces - RDIM_Type *container_type = 0; - RDIM_Namespace *container_namespace = 0; - if(!container_scope) - { - U64 info_off = container_ancestor_info_off; - U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); - U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; - - // rjf: info off -> hash - U64 hash = 0; - { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; - U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == info_off) - { - hash = n->dst_hash; - break; - } - } - } - - // rjf: hash -> type - { - U64 unique_type_tag_slot_idx = hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) - { - if(n->hash == hash) - { - if(n->kind == D2R2_UniqueTagKind_Type) - { - container_type = type_from_idx_map[n->order_idx]; - } - else if(n->kind == D2R2_UniqueTagKind_Namespace) - { - container_namespace = namespace_from_idx_map[n->order_idx]; - } - break; - } - } - } - } - - // rjf: fill - dst_udt->container_scope = container_scope; - dst_udt->container_type = container_type; - dst_udt->container_namespace = container_namespace; - } - } - lane_sync(); - - //////////////////////////// - //- rjf: upgrade all namespaces with namespacing info - // - ProfScope("upgrade all namespaces with namespacing info") - { - Rng1U64 range = lane_range(namespace_count); - for EachInRange(namespace_idx, range) - { - D2R2_UniqueTagNode *unique_tag_node = namespace_tag_nodes[namespace_idx]; - U64 container_ancestor_info_off = unique_tag_node->container_ancestor_info_off; - RDIM_Namespace *dst_namespace = namespace_from_idx_map[namespace_idx]; - if(dst_namespace == 0) - { - continue; - } - - // rjf: find container scopes - RDIM_Scope *container_scope = 0; - { - U64 info_off = container_ancestor_info_off; - U64 hash = u64_hash_from_str8(str8_struct(&info_off)); - U64 slot_idx = hash%scope_container_map->slots_count; - for(D2R2_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) - { - if(n->info_off == info_off) - { - container_scope = n->scope; - break; - } - } - } - - // rjf: find container types/namespaces - RDIM_Type *container_type = 0; - RDIM_Namespace *container_namespace = 0; - { - U64 info_off = container_ancestor_info_off; - U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); - U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; - - // rjf: info off -> hash - U64 hash = 0; - { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; - U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == info_off) - { - hash = n->dst_hash; - break; - } - } - } - - // rjf: hash -> type - { - U64 unique_type_tag_slot_idx = hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) - { - if(n->hash == hash) - { - if(n->kind == D2R2_UniqueTagKind_Type) - { - container_type = type_from_idx_map[n->order_idx]; - } - else if(n->kind == D2R2_UniqueTagKind_Namespace) - { - container_namespace = namespace_from_idx_map[n->order_idx]; - } - break; - } - } - } - } - - // rjf: fill - dst_namespace->parent_scope = container_scope; - dst_namespace->parent_type = container_type; - dst_namespace->parent_namespace = container_namespace; - } - } - lane_sync(); - - //////////////////////////// - //- rjf: fill result - // - RDIM_BakeParams result = {0}; - { - result.subset_flags = params->subset_flags; - result.top_level_info = top_level_info; - result.binary_sections = binary_sections; - result.units = *all_units; - result.namespaces = *all_namespaces; - result.types = *all_types; - result.udts = *all_udts; - result.src_files = *all_src_files; - result.line_tables = *all_line_tables; - } - -#undef d2r2_type_from_builtin_kind - lane_sync(); - scratch_end(scratch); - return result; -} diff --git a/src/rdi_from_dwarf/rdi_from_dwarf_2.h b/src/rdi_from_dwarf/rdi_from_dwarf_2.h deleted file mode 100644 index a0b63230..00000000 --- a/src/rdi_from_dwarf/rdi_from_dwarf_2.h +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef RDI_FROM_DWARF_2_H -#define RDI_FROM_DWARF_2_H - -//////////////////////////////// -//~ rjf: Unique Tag Tree Deduplication Types - -typedef enum D2R2_UniqueTagKind -{ - D2R2_UniqueTagKind_Type, - D2R2_UniqueTagKind_Namespace, - D2R2_UniqueTagKind_COUNT -} -D2R2_UniqueTagKind; - -typedef struct D2R2_UniqueTagNode D2R2_UniqueTagNode; -struct D2R2_UniqueTagNode -{ - D2R2_UniqueTagNode *next; - D2R2_UniqueTagKind kind; - U64 hash; - U64 info_off; - U64 container_ancestor_info_off; - U64 order_idx; -}; - -typedef struct D2R2_UnitDedupedTagNode D2R2_UnitDedupedTagNode; -struct D2R2_UnitDedupedTagNode -{ - D2R2_UnitDedupedTagNode *next; - U64 src_info_off; - U64 dst_hash; -}; - -typedef struct D2R2_UnitDedupedTagMap D2R2_UnitDedupedTagMap; -struct D2R2_UnitDedupedTagMap -{ - D2R2_UnitDedupedTagNode **slots; - U64 slots_count; -}; - -//////////////////////////////// -//~ rjf: Conversion Stage Inputs (New) - -typedef struct D2R2_ConvertParams D2R2_ConvertParams; -struct D2R2_ConvertParams -{ - String8 exe_name; - String8 exe_data; - Arch arch; - U64 base_vaddr; - RDIM_BinarySectionList binary_sections; - DW_Raw raw; - PathStyle path_style; - RDIM_SubsetFlags subset_flags; - B32 deterministic; -}; - -//////////////////////////////// -//~ rjf: Helpers - -internal int d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r); - -//////////////////////////////// -//~ rjf: Main Conversion Entry Point (New) - -internal RDIM_BakeParams d2r2_convert(Arena *arena, D2R2_ConvertParams *params); - -#endif // RDI_FROM_DWARF_2_H diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 4de5a57a..567157c9 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -65,7 +65,7 @@ #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" #include "rdi_from_pdb/rdi_from_pdb.h" -#include "rdi_from_dwarf/rdi_from_dwarf_2.h" +#include "rdi_from_dwarf/rdi_from_dwarf.h" #include "obj/obj.h" #include "radbin/radbin.h" #include "arch/arch_inc.h" @@ -142,7 +142,7 @@ #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" -#include "rdi_from_dwarf/rdi_from_dwarf_2.c" +#include "rdi_from_dwarf/rdi_from_dwarf.c" #include "obj/obj.c" #include "radbin/radbin.c" #include "arch/arch_inc.c" From 6a2e2eb7988eaf1b08d0a608e932684ed8e8c1ae Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 11:42:10 -0700 Subject: [PATCH 724/850] d2r2 -> d2r --- src/radbin/radbin.c | 4 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 310 ++++++++++++++-------------- src/rdi_from_dwarf/rdi_from_dwarf.h | 38 ++-- 3 files changed, 176 insertions(+), 176 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 81eba9d5..8ef2b2b1 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -720,7 +720,7 @@ rb_thread_entry_point(void *p) else if(elf_w_dwarf) { log_infof("ELFs specified; converting DWARF data to RDI\n"); } // rjf: convert - D2R2_ConvertParams convert_params = {0}; + D2R_ConvertParams convert_params = {0}; { B32 got_exe = 0; B32 got_dbg = 0; @@ -835,7 +835,7 @@ rb_thread_entry_point(void *p) convert_params.subset_flags = subset_flags; convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } - ProfScope("convert") dwarf_bake_params = d2r2_convert(arena, &convert_params); + ProfScope("convert") dwarf_bake_params = d2r_convert(arena, &convert_params); } //- rjf: PDB inputs => PDB -> RDI conversion diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 61ed73bc..5e3b8b22 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -5,7 +5,7 @@ //~ rjf: Helpers internal int -d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r) +d2r_unique_tag_node_is_less_than(D2R_UniqueTagNode **l, D2R_UniqueTagNode **r) { int is_less_than = (l[0]->hash < r[0]->hash); return is_less_than; @@ -15,7 +15,7 @@ d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r //~ rjf: Main Conversion Entry Point (New) internal RDIM_BakeParams -d2r2_convert(Arena *arena, D2R2_ConvertParams *params) +d2r_convert(Arena *arena, D2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); DW_Raw *raw = ¶ms->raw; @@ -232,19 +232,19 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // // more excellence. // - typedef struct D2R2_ARangeUnitNode D2R2_ARangeUnitNode; - struct D2R2_ARangeUnitNode + typedef struct D2R_ARangeUnitNode D2R_ARangeUnitNode; + struct D2R_ARangeUnitNode { - D2R2_ARangeUnitNode *next; + D2R_ARangeUnitNode *next; U64 info_off; RDIM_Rng1U64ChunkList *ranges; }; U64 arange_unit_from_info_off_map_slots_count = unit_arange_ranges->count; - D2R2_ARangeUnitNode **arange_unit_from_info_off_map_slots = 0; + D2R_ARangeUnitNode **arange_unit_from_info_off_map_slots = 0; { if(lane_idx() == 0) { - arange_unit_from_info_off_map_slots = push_array(scratch.arena, D2R2_ARangeUnitNode *, arange_unit_from_info_off_map_slots_count); + arange_unit_from_info_off_map_slots = push_array(scratch.arena, D2R_ARangeUnitNode *, arange_unit_from_info_off_map_slots_count); } lane_sync_u64(&arange_unit_from_info_off_map_slots, 0); for EachIndex(arange_unit_idx, unit_arange_ranges->count) @@ -253,7 +253,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_Rng1U64ChunkList *ranges = &arange_voff_ranges[arange_unit_idx]; U64 hash = u64_hash_from_str8(str8_struct(&info_off)); U64 slot_idx = hash%arange_unit_from_info_off_map_slots_count; - D2R2_ARangeUnitNode *n = push_array(scratch.arena, D2R2_ARangeUnitNode, 1); + D2R_ARangeUnitNode *n = push_array(scratch.arena, D2R_ARangeUnitNode, 1); SLLStackPush(arange_unit_from_info_off_map_slots[slot_idx], n); n->info_off = info_off; n->ranges = ranges; @@ -940,19 +940,19 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) unit_info_root_tag_offs = push_array(scratch.arena, U64Array, unit_count); } lane_sync_u64(&unit_info_root_tag_offs, 0); - typedef struct D2R2_UnitTagTreeOffChunkNode D2R2_UnitTagTreeOffChunkNode; - struct D2R2_UnitTagTreeOffChunkNode + typedef struct D2R_UnitTagTreeOffChunkNode D2R_UnitTagTreeOffChunkNode; + struct D2R_UnitTagTreeOffChunkNode { - D2R2_UnitTagTreeOffChunkNode *next; + D2R_UnitTagTreeOffChunkNode *next; U64 *v; U64 count; U64 cap; }; - typedef struct D2R2_UnitTagTreeOffChunkList D2R2_UnitTagTreeOffChunkList; - struct D2R2_UnitTagTreeOffChunkList + typedef struct D2R_UnitTagTreeOffChunkList D2R_UnitTagTreeOffChunkList; + struct D2R_UnitTagTreeOffChunkList { - D2R2_UnitTagTreeOffChunkNode *first; - D2R2_UnitTagTreeOffChunkNode *last; + D2R_UnitTagTreeOffChunkNode *first; + D2R_UnitTagTreeOffChunkNode *last; U64 chunk_count; U64 total_count; }; @@ -974,7 +974,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; //- rjf: gather all offsets of root-level trees - D2R2_UnitTagTreeOffChunkList tree_offs = {0}; + D2R_UnitTagTreeOffChunkList tree_offs = {0}; S64 depth = 0; for(U64 off = unit_info_tag_range.min; contains_1u64(unit_info_tag_range, off);) { @@ -984,10 +984,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: if this next tag is root-level, gather if(depth == 1) { - D2R2_UnitTagTreeOffChunkNode *chunk = tree_offs.last; + D2R_UnitTagTreeOffChunkNode *chunk = tree_offs.last; if(chunk == 0 || chunk->count >= chunk->cap) { - chunk = push_array(scratch2.arena, D2R2_UnitTagTreeOffChunkNode, 1); + chunk = push_array(scratch2.arena, D2R_UnitTagTreeOffChunkNode, 1); chunk->cap = 512; chunk->v = push_array(scratch2.arena, U64, chunk->cap); SLLQueuePush(tree_offs.first, tree_offs.last, chunk); @@ -1026,7 +1026,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) tree_offs_array.v = push_array(scratch.arena, U64, tree_offs_array.count); { U64 idx = 0; - for EachNode(n, D2R2_UnitTagTreeOffChunkNode, tree_offs.first) + for EachNode(n, D2R_UnitTagTreeOffChunkNode, tree_offs.first) { MemoryCopy(tree_offs_array.v + idx, n->v, sizeof(n->v[0])*n->count); idx += n->count; @@ -1046,14 +1046,14 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: produce list of (unit * range(root_tag_idx)), so that we can easily // subdivide work from all units across all lanes // - typedef struct D2R2_SubUnitWork D2R2_SubUnitWork; - struct D2R2_SubUnitWork + typedef struct D2R_SubUnitWork D2R_SubUnitWork; + struct D2R_SubUnitWork { U64 unit_idx; Rng1U64 root_tag_idx_range; }; U64 sub_unit_works_count = 0; - D2R2_SubUnitWork *sub_unit_works = 0; + D2R_SubUnitWork *sub_unit_works = 0; ProfScope("produce sub-unit work division") if(lane_idx() == 0) { U64 root_tags_per_work = 1024; @@ -1066,7 +1066,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 works_per_this_unit = (root_tags_in_this_unit+root_tags_per_work-1) / root_tags_per_work; if(build) { - D2R2_SubUnitWork *works = sub_unit_works + sub_unit_work_idx; + D2R_SubUnitWork *works = sub_unit_works + sub_unit_work_idx; U64 works_count = works_per_this_unit; U64 root_tag_idx = 0; for EachIndex(work_idx, works_count) @@ -1083,7 +1083,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) if(!build) { sub_unit_works_count = sub_unit_work_idx; - sub_unit_works = push_array(scratch.arena, D2R2_SubUnitWork, sub_unit_works_count); + sub_unit_works = push_array(scratch.arena, D2R_SubUnitWork, sub_unit_works_count); } } } @@ -1112,7 +1112,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync_u64(&builtin_types, 0); lane_sync_u64(&builtin_type_from_kind_map, 0); -#define d2r2_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] : builtin_type_from_kind_map[RDI_TypeKind_Void]) +#define d2r_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] : builtin_type_from_kind_map[RDI_TypeKind_Void]) //////////////////////////// //- rjf: predict the total number of tags in all units @@ -1129,16 +1129,16 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////////// //- rjf: gather all unique, to-be-deduplicated tags across all units (types, namespaces) // - D2R2_UniqueTagNode **unique_tag_slots = 0; + D2R_UniqueTagNode **unique_tag_slots = 0; U64 unique_tag_slots_count = total_tag_count_estimate/8 + 1; - D2R2_UnitDedupedTagMap *unit_deduped_tag_maps = 0; + D2R_UnitDedupedTagMap *unit_deduped_tag_maps = 0; ProfScope("gather all unique, to-be-deduplicated tags across all units (types, namespaces)") { //- rjf: set up tables if(lane_idx() == 0) { - unique_tag_slots = push_array(scratch.arena, D2R2_UniqueTagNode *, unique_tag_slots_count); - unit_deduped_tag_maps = push_array(scratch.arena, D2R2_UnitDedupedTagMap, unit_count); + unique_tag_slots = push_array(scratch.arena, D2R_UniqueTagNode *, unique_tag_slots_count); + unit_deduped_tag_maps = push_array(scratch.arena, D2R_UnitDedupedTagMap, unit_count); } lane_sync_u64(&unique_tag_slots, 0); lane_sync_u64(&unit_deduped_tag_maps, 0); @@ -1150,7 +1150,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; unit_deduped_tag_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 256 + 1; - unit_deduped_tag_maps[unit_idx].slots = push_array(scratch.arena, D2R2_UnitDedupedTagNode *, unit_deduped_tag_maps[unit_idx].slots_count); + unit_deduped_tag_maps[unit_idx].slots = push_array(scratch.arena, D2R_UnitDedupedTagNode *, unit_deduped_tag_maps[unit_idx].slots_count); } lane_sync(); } @@ -1179,32 +1179,32 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; //- rjf: gather all tags which we want to deduplicate - typedef struct D2R2_TagNode D2R2_TagNode; - struct D2R2_TagNode + typedef struct D2R_TagNode D2R_TagNode; + struct D2R_TagNode { - D2R2_TagNode *next; - D2R2_UniqueTagKind kind; + D2R_TagNode *next; + D2R_UniqueTagKind kind; U64 info_off; U64 container_ancestor_info_off; U64 hash_seed; }; - D2R2_TagNode *first_tag_to_dedup = 0; - D2R2_TagNode *last_tag_to_dedup = 0; + D2R_TagNode *first_tag_to_dedup = 0; + D2R_TagNode *last_tag_to_dedup = 0; for(U64 root_tag_idx = origin_unit_root_tag_idx_range.min; root_tag_idx < origin_unit_root_tag_idx_range.max; root_tag_idx += 1) { U64 root_tag_start_off = unit_info_root_tag_offs[origin_unit_idx].v[root_tag_idx]; - typedef struct D2R2_ParentTagNode D2R2_ParentTagNode; - struct D2R2_ParentTagNode + typedef struct D2R_ParentTagNode D2R_ParentTagNode; + struct D2R_ParentTagNode { - D2R2_ParentTagNode *next; + D2R_ParentTagNode *next; DW_TagKind tag_kind; U64 info_off; U64 hash_seed; }; - D2R2_ParentTagNode *top_parent = 0; - D2R2_ParentTagNode *free_parent = 0; + D2R_ParentTagNode *top_parent = 0; + D2R_ParentTagNode *free_parent = 0; S64 depth = 0; for(U64 off = root_tag_start_off; contains_1u64(origin_unit_info_tag_range, off) && (depth > 0 || off == root_tag_start_off);) { @@ -1246,7 +1246,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) tag.kind == DW_TagKind_Namespace) { U64 container_ancestor_info_off = 0; - for EachNode(n, D2R2_ParentTagNode, top_parent) + for EachNode(n, D2R_ParentTagNode, top_parent) { if(n->tag_kind == DW_TagKind_StructureType || n->tag_kind == DW_TagKind_UnionType || @@ -1259,8 +1259,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) break; } } - D2R2_TagNode *n = push_array(work_scratch.arena, D2R2_TagNode, 1); - n->kind = (tag.kind == DW_TagKind_Namespace ? D2R2_UniqueTagKind_Namespace : D2R2_UniqueTagKind_Type); + D2R_TagNode *n = push_array(work_scratch.arena, D2R_TagNode, 1); + n->kind = (tag.kind == DW_TagKind_Namespace ? D2R_UniqueTagKind_Namespace : D2R_UniqueTagKind_Type); n->info_off = start_off; n->container_ancestor_info_off = container_ancestor_info_off; n->hash_seed = top_parent ? top_parent->hash_seed : 0; @@ -1286,14 +1286,14 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) if(tag.has_children) { depth += 1; - D2R2_ParentTagNode *n = free_parent; + D2R_ParentTagNode *n = free_parent; if(n != 0) { SLLStackPop(free_parent); } else { - n = push_array(work_scratch.arena, D2R2_ParentTagNode, 1); + n = push_array(work_scratch.arena, D2R_ParentTagNode, 1); } SLLStackPush(top_parent, n); n->tag_kind = tag.kind; @@ -1306,7 +1306,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) depth = Max(0, depth); if(top_parent != 0) { - D2R2_ParentTagNode *popped = top_parent; + D2R_ParentTagNode *popped = top_parent; SLLStackPop(top_parent); SLLStackPush(free_parent, popped); } @@ -1321,11 +1321,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //- rjf: hash all tags we need to deduplicate & gather - for(D2R2_TagNode *tag_n = first_tag_to_dedup; tag_n != 0; tag_n = tag_n->next) + for(D2R_TagNode *tag_n = first_tag_to_dedup; tag_n != 0; tag_n = tag_n->next) { Temp dedup_root_scratch = scratch_begin(&scratch.arena, 1); U64 start_off = tag_n->info_off; - D2R2_UniqueTagKind unique_tag_kind = tag_n->kind; + D2R_UniqueTagKind unique_tag_kind = tag_n->kind; U64 container_ancestor_info_off = tag_n->container_ancestor_info_off; U64 hash_seed = tag_n->hash_seed; @@ -1518,8 +1518,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 slot_head_val = (U64)ins_atomic_u64_eval(&unique_tag_slots[slot_idx]); // rjf: determine if this hash has been gathered - D2R2_UniqueTagNode *already_gathered_node = 0; - for(D2R2_UniqueTagNode *n = (D2R2_UniqueTagNode *)slot_head_val; n != 0; n = n->next) + D2R_UniqueTagNode *already_gathered_node = 0; + for(D2R_UniqueTagNode *n = (D2R_UniqueTagNode *)slot_head_val; n != 0; n = n->next) { if(n->hash == hash) { @@ -1584,8 +1584,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) if(!gathered) { Temp insert_temp = temp_begin(scratch.arena); - D2R2_UniqueTagNode *n = push_array(scratch.arena, D2R2_UniqueTagNode, 1); - n->next = (D2R2_UniqueTagNode *)slot_head_val; + D2R_UniqueTagNode *n = push_array(scratch.arena, D2R_UniqueTagNode, 1); + n->next = (D2R_UniqueTagNode *)slot_head_val; n->kind = unique_tag_kind; n->hash = hash; n->info_off = start_off; @@ -1609,13 +1609,13 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; - D2R2_UnitDedupedTagNode *n = push_array(scratch.arena, D2R2_UnitDedupedTagNode, 1); + D2R_UnitDedupedTagNode *n = push_array(scratch.arena, D2R_UnitDedupedTagNode, 1); n->src_info_off = start_off; n->dst_hash = hash; for(B32 inserted = 0; !inserted;) { U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); - n->next = (D2R2_UnitDedupedTagNode *)slot_head_val; + n->next = (D2R_UnitDedupedTagNode *)slot_head_val; if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) { inserted = 1; @@ -1640,20 +1640,20 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) for EachInRange(slot_idx, range) { Temp scratch2 = scratch_begin(&scratch.arena, 1); - D2R2_UniqueTagNode **slot = &unique_tag_slots[slot_idx]; + D2R_UniqueTagNode **slot = &unique_tag_slots[slot_idx]; // rjf: count nodes in this slot U64 node_count = 0; - for EachNode(n, D2R2_UniqueTagNode, slot[0]) + for EachNode(n, D2R_UniqueTagNode, slot[0]) { node_count += 1; } // rjf: flatten - D2R2_UniqueTagNode **slot_nodes_array = push_array(scratch2.arena, D2R2_UniqueTagNode *, node_count); + D2R_UniqueTagNode **slot_nodes_array = push_array(scratch2.arena, D2R_UniqueTagNode *, node_count); { U64 idx = 0; - for EachNode(n, D2R2_UniqueTagNode, slot[0]) + for EachNode(n, D2R_UniqueTagNode, slot[0]) { slot_nodes_array[idx] = n; idx += 1; @@ -1661,7 +1661,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: sort - radsort(slot_nodes_array, node_count, (int (*)(void *, void *))d2r2_unique_tag_node_is_less_than); + radsort(slot_nodes_array, node_count, (int (*)(void *, void *))d2r_unique_tag_node_is_less_than); // rjf: re-order in the slot { @@ -1680,27 +1680,27 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////////// //- rjf: produce [0...n) <-> unique-tag-node mapping for all categories of deduplicated tags // - U64 *deduped_tag_counts = 0; // [D2R2_UniqueTagKind_COUNT] - D2R2_UniqueTagNode ***deduped_tag_nodes = 0; // [D2R2_UniqueTagKind_COUNT] + U64 *deduped_tag_counts = 0; // [D2R_UniqueTagKind_COUNT] + D2R_UniqueTagNode ***deduped_tag_nodes = 0; // [D2R_UniqueTagKind_COUNT] ProfScope("produce [0...n) -> hash mapping for all categories of deduplicated tags") if(lane_idx() == 0) { - deduped_tag_counts = push_array(scratch.arena, U64, D2R2_UniqueTagKind_COUNT); - deduped_tag_nodes = push_array(scratch.arena, D2R2_UniqueTagNode **, D2R2_UniqueTagKind_COUNT); + deduped_tag_counts = push_array(scratch.arena, U64, D2R_UniqueTagKind_COUNT); + deduped_tag_nodes = push_array(scratch.arena, D2R_UniqueTagNode **, D2R_UniqueTagKind_COUNT); for EachIndex(slot_idx, unique_tag_slots_count) { - for EachNode(n, D2R2_UniqueTagNode, unique_tag_slots[slot_idx]) + for EachNode(n, D2R_UniqueTagNode, unique_tag_slots[slot_idx]) { deduped_tag_counts[n->kind] += 1; } } - for EachEnumVal(D2R2_UniqueTagKind, k) + for EachEnumVal(D2R_UniqueTagKind, k) { - deduped_tag_nodes[k] = push_array(scratch.arena, D2R2_UniqueTagNode *, deduped_tag_counts[k]); + deduped_tag_nodes[k] = push_array(scratch.arena, D2R_UniqueTagNode *, deduped_tag_counts[k]); } - U64 idxs[D2R2_UniqueTagKind_COUNT] = {0}; + U64 idxs[D2R_UniqueTagKind_COUNT] = {0}; for EachIndex(slot_idx, unique_tag_slots_count) { - for EachNode(n, D2R2_UniqueTagNode, unique_tag_slots[slot_idx]) + for EachNode(n, D2R_UniqueTagNode, unique_tag_slots[slot_idx]) { deduped_tag_nodes[n->kind][idxs[n->kind]] = n; n->order_idx = idxs[n->kind]; @@ -1710,10 +1710,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } lane_sync_u64(&deduped_tag_counts, 0); lane_sync_u64(&deduped_tag_nodes, 0); - U64 type_count = deduped_tag_counts[D2R2_UniqueTagKind_Type]; - D2R2_UniqueTagNode **type_tag_nodes = deduped_tag_nodes[D2R2_UniqueTagKind_Type]; - U64 namespace_count = deduped_tag_counts[D2R2_UniqueTagKind_Namespace]; - D2R2_UniqueTagNode **namespace_tag_nodes = deduped_tag_nodes[D2R2_UniqueTagKind_Namespace]; + U64 type_count = deduped_tag_counts[D2R_UniqueTagKind_Type]; + D2R_UniqueTagNode **type_tag_nodes = deduped_tag_nodes[D2R_UniqueTagKind_Type]; + U64 namespace_count = deduped_tag_counts[D2R_UniqueTagKind_Namespace]; + D2R_UniqueTagNode **namespace_tag_nodes = deduped_tag_nodes[D2R_UniqueTagKind_Namespace]; //////////////////////////// //- rjf: gather per-type dependency chains @@ -1759,10 +1759,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 hash = t->hash; // rjf: hash -> unique type tag node - D2R2_UniqueTagNode *type_tag_node = 0; + D2R_UniqueTagNode *type_tag_node = 0; { U64 slot_idx = hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) + for(D2R_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) { if(n->hash == hash) { @@ -1903,7 +1903,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); U64 off_slot_idx = off_hash%unit_deduped_tag_maps[direct_type_unit_idx].slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) + for(D2R_UnitDedupedTagNode *n = unit_deduped_tag_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == direct_type_info_off) { @@ -2009,7 +2009,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Temp temp = temp_begin(scratch2.arena); // rjf: idx -> type tag node - D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + D2R_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; U64 info_off = type_tag_node->info_off; U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; @@ -2054,7 +2054,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: unpack common attributes String8 name = name_attrib->val.string; DW_ATE encoding = encoding_attrib->val.u128.u64[0]; - RDIM_Type *direct_type = d2r2_type_from_builtin_kind(RDI_TypeKind_Void); + RDIM_Type *direct_type = d2r_type_from_builtin_kind(RDI_TypeKind_Void); U64 bitsize = 0; B32 is_decl = (decl_attrib != &dw2_attrib_nil); { @@ -2068,11 +2068,11 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); direct_type_unit_idx = (new_unit_num > 0 ? new_unit_num-1 : unit_idx); } - D2R2_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[direct_type_unit_idx]; + D2R_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[direct_type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; U64 direct_type_hash = 0; - for(D2R2_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == direct_type_info_off) { @@ -2081,7 +2081,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } } U64 unique_type_tag_slot_idx = direct_type_hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == direct_type_hash) { @@ -2207,10 +2207,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: map info_off/unit_idx -> hash U64 param_type_hash = 0; { - D2R2_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[param_type_unit_idx]; + D2R_UnitDedupedTagMap *direct_type_unit_type_map = &unit_deduped_tag_maps[param_type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(¶m_type_info_off)); U64 info_off_slot_idx = info_off_hash%direct_type_unit_type_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R_UnitDedupedTagNode *n = direct_type_unit_type_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == param_type_info_off) { @@ -2224,7 +2224,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_Type *param_type = 0; { U64 unique_type_tag_slot_idx = param_type_hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == param_type_hash) { @@ -2308,7 +2308,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) dst_type = rdim_type_chunk_list_push(arena, &lane_types, lane_types_chunk_count); dst_type->kind = RDI_TypeKind_Alias; dst_type->name = name; - dst_type->direct_type = d2r2_type_from_builtin_kind(rdi_type_kind); + dst_type->direct_type = d2r_type_from_builtin_kind(rdi_type_kind); dst_type->byte_size = bitsize/8; // TODO: byte size on __float80 alias mismatches byte size on direct type now }break; case DW_TagKind_PointerType: rdi_type_kind = RDI_TypeKind_Ptr; goto ptr_or_ref_type; @@ -2538,7 +2538,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Temp scratch2 = scratch_begin(&scratch.arena, 1); // rjf: unpack tag node - D2R2_UniqueTagNode *tag_node = namespace_tag_nodes[namespace_idx]; + D2R_UniqueTagNode *tag_node = namespace_tag_nodes[namespace_idx]; U64 info_off = tag_node->info_off; U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; @@ -2611,7 +2611,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) udt->self_type = type; // rjf: idx -> type tag node - D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + D2R_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; U64 info_off = type_tag_node->info_off; U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; @@ -2678,10 +2678,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: (info_off, unit_idx) -> hash U64 type_hash = 0; { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; + D2R_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == type_info_off) { @@ -2694,7 +2694,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: hash -> type { U64 unique_type_tag_slot_idx = type_hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == type_hash) { @@ -2867,7 +2867,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 unit_info_off = unit_info_ranges->v[unit_idx].min; U64 hash = u64_hash_from_str8(str8_struct(&unit_info_off)); U64 slot_idx = hash%arange_unit_from_info_off_map_slots_count; - for(D2R2_ARangeUnitNode *n = arange_unit_from_info_off_map_slots[slot_idx]; n != 0; n = n->next) + for(D2R_ARangeUnitNode *n = arange_unit_from_info_off_map_slots[slot_idx]; n != 0; n = n->next) { if(n->info_off == unit_info_off) { @@ -2927,21 +2927,21 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //////////////////////////// //- rjf: convert all symbols // - typedef struct D2R2_ScopeContainerNode D2R2_ScopeContainerNode; - struct D2R2_ScopeContainerNode + typedef struct D2R_ScopeContainerNode D2R_ScopeContainerNode; + struct D2R_ScopeContainerNode { - D2R2_ScopeContainerNode *next; + D2R_ScopeContainerNode *next; U64 info_off; RDIM_Scope *scope; }; - typedef struct D2R2_ScopeContainerMap D2R2_ScopeContainerMap; - struct D2R2_ScopeContainerMap + typedef struct D2R_ScopeContainerMap D2R_ScopeContainerMap; + struct D2R_ScopeContainerMap { - D2R2_ScopeContainerNode **slots; + D2R_ScopeContainerNode **slots; U64 slots_count; }; - typedef struct D2R2_SubUnitWorkArtifacts D2R2_SubUnitWorkArtifacts; - struct D2R2_SubUnitWorkArtifacts + typedef struct D2R_SubUnitWorkArtifacts D2R_SubUnitWorkArtifacts; + struct D2R_SubUnitWorkArtifacts { RDIM_SymbolChunkList global_variables; RDIM_SymbolChunkList thread_variables; @@ -2950,16 +2950,16 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_ScopeChunkList scopes; RDIM_InlineSiteChunkList inline_sites; }; - D2R2_ScopeContainerMap *scope_container_map = 0; - D2R2_SubUnitWorkArtifacts *sub_unit_work_artifacts = 0; + D2R_ScopeContainerMap *scope_container_map = 0; + D2R_SubUnitWorkArtifacts *sub_unit_work_artifacts = 0; ProfScope("convert all symbols") { if(lane_idx() == 0) { - scope_container_map = push_array(scratch.arena, D2R2_ScopeContainerMap, 1); + scope_container_map = push_array(scratch.arena, D2R_ScopeContainerMap, 1); scope_container_map->slots_count = total_tag_count_estimate/8 + 1; - scope_container_map->slots = push_array(scratch.arena, D2R2_ScopeContainerNode *, scope_container_map->slots_count); - sub_unit_work_artifacts = push_array(scratch.arena, D2R2_SubUnitWorkArtifacts, sub_unit_works_count); + scope_container_map->slots = push_array(scratch.arena, D2R_ScopeContainerNode *, scope_container_map->slots_count); + sub_unit_work_artifacts = push_array(scratch.arena, D2R_SubUnitWorkArtifacts, sub_unit_works_count); } lane_sync_u64(&scope_container_map, 0); lane_sync_u64(&sub_unit_work_artifacts, 0); @@ -2977,7 +2977,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) //- rjf: unpack work U64 unit_idx = sub_unit_works[work_idx].unit_idx; Rng1U64 root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; - D2R2_SubUnitWorkArtifacts *dst_artifacts = &sub_unit_work_artifacts[work_idx]; + D2R_SubUnitWorkArtifacts *dst_artifacts = &sub_unit_work_artifacts[work_idx]; //- rjf: unpack unit info DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; @@ -2987,10 +2987,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 chunk_count = 256; for(U64 root_tag_idx = root_tag_idx_range.min; root_tag_idx < root_tag_idx_range.max; root_tag_idx += 1) { - typedef struct D2R2_ParentNode D2R2_ParentNode; - struct D2R2_ParentNode + typedef struct D2R_ParentNode D2R_ParentNode; + struct D2R_ParentNode { - D2R2_ParentNode *next; + D2R_ParentNode *next; DW_TagKind tag_kind; U64 info_off; RDIM_Scope *scope; @@ -2998,8 +2998,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_Namespace *container_namespace; RDIM_LocationCaseList framebase_location_cases; }; - D2R2_ParentNode *top_parent = 0; - D2R2_ParentNode *free_parent = 0; + D2R_ParentNode *top_parent = 0; + D2R_ParentNode *free_parent = 0; U64 root_tag_start_off = unit_info_root_tag_offs[unit_idx].v[root_tag_idx]; S64 depth = 1; for(U64 off = root_tag_start_off; off < unit_info_tag_range.max && (depth > 1 || off == root_tag_start_off);) @@ -3117,10 +3117,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: (info_off, unit_idx) -> hash U64 type_hash = 0; { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; + D2R_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[type_unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == type_info_off) { @@ -3133,7 +3133,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: hash -> type { U64 unique_type_tag_slot_idx = type_hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == type_hash) { @@ -3227,20 +3227,20 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) RDIM_Rng1U64 framebase_voff_range = framebase_loc_n->voff_range; //- rjf: set up type stack for type-evaluating bytecode - typedef struct D2R2_ExprVal D2R2_ExprVal; - struct D2R2_ExprVal + typedef struct D2R_ExprVal D2R_ExprVal; + struct D2R_ExprVal { RDI_TypeKind type_kind; B32 is_addr; }; - typedef struct D2R2_ExprValNode D2R2_ExprValNode; - struct D2R2_ExprValNode + typedef struct D2R_ExprValNode D2R_ExprValNode; + struct D2R_ExprValNode { - D2R2_ExprValNode *next; - D2R2_ExprVal v; + D2R_ExprValNode *next; + D2R_ExprVal v; }; - D2R2_ExprValNode *val_stack_top = 0; - D2R2_ExprValNode *free_val = 0; + D2R_ExprValNode *val_stack_top = 0; + D2R_ExprValNode *free_val = 0; //- rjf: process DWARF bytecode; produce RDI bytecode + mini-type-info for the expression's result typedef struct JumpOpNode JumpOpNode; @@ -3303,14 +3303,14 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //- rjf: pop stack values - D2R2_ExprVal popped_vals[2] = {0}; + D2R_ExprVal popped_vals[2] = {0}; { pop_count = Min(pop_count, ArrayCount(popped_vals)); for EachIndex(pop_idx, pop_count) { if(val_stack_top != 0) { - D2R2_ExprValNode *popped = val_stack_top; + D2R_ExprValNode *popped = val_stack_top; popped_vals[pop_idx] = popped->v; SLLStackPop(val_stack_top); SLLStackPush(free_val, popped); @@ -3319,7 +3319,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } //- rjf: exec op (produce RDI bytecode, + manipulate value stack) - D2R2_ExprVal push_vals[2] = {0}; + D2R_ExprVal push_vals[2] = {0}; U64 regcode_dw = 0; S64 regval_off = 0; B32 regread_is_addr = 0; @@ -3544,10 +3544,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) pick:; { // rjf: pick value from stack - D2R2_ExprVal picked_val = {0}; + D2R_ExprVal picked_val = {0}; { U64 idx = 0; - for(D2R2_ExprValNode *n = val_stack_top; n != 0; n = n->next) + for(D2R_ExprValNode *n = val_stack_top; n != 0; n = n->next) { if(idx == target_pick_val_idx) { @@ -3742,14 +3742,14 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) push_count = Min(push_count, ArrayCount(push_vals)); for EachIndex(push_idx, push_count) { - D2R2_ExprValNode *n = free_val; + D2R_ExprValNode *n = free_val; if(n != 0) { SLLStackPop(free_val); } else { - n = push_array(scratch2.arena, D2R2_ExprValNode, 1); + n = push_array(scratch2.arena, D2R_ExprValNode, 1); } n->v = push_vals[push_idx]; SLLStackPush(val_stack_top, n); @@ -3990,7 +3990,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) { U64 info_off = 0; RDIM_Scope *scope = 0; - for(D2R2_ParentNode *n = top_parent; n != 0; n = n->next) + for(D2R_ParentNode *n = top_parent; n != 0; n = n->next) { if(n->scope != 0) { @@ -4001,7 +4001,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } if(scope != 0) { - D2R2_ScopeContainerNode *n = push_array(scratch.arena, D2R2_ScopeContainerNode, 1); + D2R_ScopeContainerNode *n = push_array(scratch.arena, D2R_ScopeContainerNode, 1); n->info_off = info_off; n->scope = scope; U64 hash = u64_hash_from_str8(str8_struct(&info_off)); @@ -4009,7 +4009,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) for(B32 gathered = 0; !gathered;) { U64 expected_head_value = ins_atomic_u64_eval(&scope_container_map->slots[slot_idx]); - n->next = (D2R2_ScopeContainerNode *)expected_head_value; + n->next = (D2R_ScopeContainerNode *)expected_head_value; if(expected_head_value == ins_atomic_u64_eval_cond_assign(&scope_container_map->slots[slot_idx], (U64)n, expected_head_value)) { gathered = 1; @@ -4061,10 +4061,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: info offset -> hash U64 hash = 0; { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + D2R_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for EachNode(n, D2R2_UnitDedupedTagNode, unit_deduped_tag_map->slots[info_off_slot_idx]) + for EachNode(n, D2R_UnitDedupedTagNode, unit_deduped_tag_map->slots[info_off_slot_idx]) { if(n->src_info_off == start_off) { @@ -4075,10 +4075,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) } // rjf: map hash -> unique tag node - D2R2_UniqueTagNode *tag_node = 0; + D2R_UniqueTagNode *tag_node = 0; { U64 slot_idx = hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) + for(D2R_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) { if(n->hash == hash) { @@ -4092,8 +4092,8 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) if(tag_node != 0) switch(tag_node->kind) { default:{}break; - case D2R2_UniqueTagKind_Type: {container_type = type_from_idx_map[tag_node->order_idx];}break; - case D2R2_UniqueTagKind_Namespace:{container_namespace = namespace_from_idx_map[tag_node->order_idx];}break; + case D2R_UniqueTagKind_Type: {container_type = type_from_idx_map[tag_node->order_idx];}break; + case D2R_UniqueTagKind_Namespace:{container_namespace = namespace_from_idx_map[tag_node->order_idx];}break; } } @@ -4103,14 +4103,14 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) if(tag.has_children) { // rjf: push new parent to stack - D2R2_ParentNode *n = free_parent; + D2R_ParentNode *n = free_parent; if(n != 0) { SLLStackPop(free_parent); } else { - n = push_array(scratch.arena, D2R2_ParentNode, 1); + n = push_array(scratch.arena, D2R_ParentNode, 1); } n->tag_kind = tag.kind; n->info_off = start_off; @@ -4133,7 +4133,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // if(tag.kind == DW_TagKind_Null && top_parent != 0) { - D2R2_ParentNode *n = top_parent; + D2R_ParentNode *n = top_parent; SLLStackPop(top_parent); SLLStackPush(free_parent, n); } @@ -4201,7 +4201,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64 range = lane_range(type_count); for EachInRange(type_idx, range) { - D2R2_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + D2R_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; U64 container_ancestor_info_off = type_tag_node->container_ancestor_info_off; RDIM_Type *dst_type = type_from_idx_map[type_idx]; if(dst_type == 0) @@ -4220,7 +4220,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 info_off = container_ancestor_info_off; U64 hash = u64_hash_from_str8(str8_struct(&info_off)); U64 slot_idx = hash%scope_container_map->slots_count; - for(D2R2_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) + for(D2R_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) { if(n->info_off == info_off) { @@ -4242,10 +4242,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: info off -> hash U64 hash = 0; { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + D2R_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == info_off) { @@ -4258,15 +4258,15 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: hash -> type { U64 unique_type_tag_slot_idx = hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == hash) { - if(n->kind == D2R2_UniqueTagKind_Type) + if(n->kind == D2R_UniqueTagKind_Type) { container_type = type_from_idx_map[n->order_idx]; } - else if(n->kind == D2R2_UniqueTagKind_Namespace) + else if(n->kind == D2R_UniqueTagKind_Namespace) { container_namespace = namespace_from_idx_map[n->order_idx]; } @@ -4292,7 +4292,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) Rng1U64 range = lane_range(namespace_count); for EachInRange(namespace_idx, range) { - D2R2_UniqueTagNode *unique_tag_node = namespace_tag_nodes[namespace_idx]; + D2R_UniqueTagNode *unique_tag_node = namespace_tag_nodes[namespace_idx]; U64 container_ancestor_info_off = unique_tag_node->container_ancestor_info_off; RDIM_Namespace *dst_namespace = namespace_from_idx_map[namespace_idx]; if(dst_namespace == 0) @@ -4306,7 +4306,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) U64 info_off = container_ancestor_info_off; U64 hash = u64_hash_from_str8(str8_struct(&info_off)); U64 slot_idx = hash%scope_container_map->slots_count; - for(D2R2_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) + for(D2R_ScopeContainerNode *n = scope_container_map->slots[slot_idx]; n != 0; n = n->next) { if(n->info_off == info_off) { @@ -4327,10 +4327,10 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: info off -> hash U64 hash = 0; { - D2R2_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; + D2R_UnitDedupedTagMap *unit_deduped_tag_map = &unit_deduped_tag_maps[unit_idx]; U64 info_off_hash = u64_hash_from_str8(str8_struct(&info_off)); U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_map->slots_count; - for(D2R2_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) + for(D2R_UnitDedupedTagNode *n = unit_deduped_tag_map->slots[info_off_slot_idx]; n != 0; n = n->next) { if(n->src_info_off == info_off) { @@ -4343,15 +4343,15 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) // rjf: hash -> type { U64 unique_type_tag_slot_idx = hash%unique_tag_slots_count; - for(D2R2_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) + for(D2R_UniqueTagNode *n = unique_tag_slots[unique_type_tag_slot_idx]; n != 0; n = n->next) { if(n->hash == hash) { - if(n->kind == D2R2_UniqueTagKind_Type) + if(n->kind == D2R_UniqueTagKind_Type) { container_type = type_from_idx_map[n->order_idx]; } - else if(n->kind == D2R2_UniqueTagKind_Namespace) + else if(n->kind == D2R_UniqueTagKind_Namespace) { container_namespace = namespace_from_idx_map[n->order_idx]; } @@ -4385,7 +4385,7 @@ d2r2_convert(Arena *arena, D2R2_ConvertParams *params) result.line_tables = *all_line_tables; } -#undef d2r2_type_from_builtin_kind +#undef d2r_type_from_builtin_kind lane_sync(); scratch_end(scratch); return result; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 6f16e3e4..c796f4e9 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -7,45 +7,45 @@ //////////////////////////////// //~ rjf: Unique Tag Tree Deduplication Types -typedef enum D2R2_UniqueTagKind +typedef enum D2R_UniqueTagKind { - D2R2_UniqueTagKind_Type, - D2R2_UniqueTagKind_Namespace, - D2R2_UniqueTagKind_COUNT + D2R_UniqueTagKind_Type, + D2R_UniqueTagKind_Namespace, + D2R_UniqueTagKind_COUNT } -D2R2_UniqueTagKind; +D2R_UniqueTagKind; -typedef struct D2R2_UniqueTagNode D2R2_UniqueTagNode; -struct D2R2_UniqueTagNode +typedef struct D2R_UniqueTagNode D2R_UniqueTagNode; +struct D2R_UniqueTagNode { - D2R2_UniqueTagNode *next; - D2R2_UniqueTagKind kind; + D2R_UniqueTagNode *next; + D2R_UniqueTagKind kind; U64 hash; U64 info_off; U64 container_ancestor_info_off; U64 order_idx; }; -typedef struct D2R2_UnitDedupedTagNode D2R2_UnitDedupedTagNode; -struct D2R2_UnitDedupedTagNode +typedef struct D2R_UnitDedupedTagNode D2R_UnitDedupedTagNode; +struct D2R_UnitDedupedTagNode { - D2R2_UnitDedupedTagNode *next; + D2R_UnitDedupedTagNode *next; U64 src_info_off; U64 dst_hash; }; -typedef struct D2R2_UnitDedupedTagMap D2R2_UnitDedupedTagMap; -struct D2R2_UnitDedupedTagMap +typedef struct D2R_UnitDedupedTagMap D2R_UnitDedupedTagMap; +struct D2R_UnitDedupedTagMap { - D2R2_UnitDedupedTagNode **slots; + D2R_UnitDedupedTagNode **slots; U64 slots_count; }; //////////////////////////////// //~ rjf: Conversion Stage Inputs (New) -typedef struct D2R2_ConvertParams D2R2_ConvertParams; -struct D2R2_ConvertParams +typedef struct D2R_ConvertParams D2R_ConvertParams; +struct D2R_ConvertParams { String8 exe_name; String8 exe_data; @@ -61,11 +61,11 @@ struct D2R2_ConvertParams //////////////////////////////// //~ rjf: Helpers -internal int d2r2_unique_tag_node_is_less_than(D2R2_UniqueTagNode **l, D2R2_UniqueTagNode **r); +internal int d2r_unique_tag_node_is_less_than(D2R_UniqueTagNode **l, D2R_UniqueTagNode **r); //////////////////////////////// //~ rjf: Main Conversion Entry Point (New) -internal RDIM_BakeParams d2r2_convert(Arena *arena, D2R2_ConvertParams *params); +internal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params); #endif // RDI_FROM_DWARF_H From 1673fa5606151b77070819c5da34ace71be2503f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 11:49:24 -0700 Subject: [PATCH 725/850] enable lfs on github actions --- .github/workflows/builds.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 7e7fee05..ff59fb6b 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -32,6 +32,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v6 + with: + lfs: true - name: Install Dependencies shell: bash run: | From 5a819f8094bb45e41fab62a578e79609f29aa6cb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 12:04:13 -0700 Subject: [PATCH 726/850] setting for auto-loading of recent projects --- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 4 ++++ src/raddbg/raddbg_core.c | 12 ++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 6332cb8c..d5632dcd 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -433,7 +433,7 @@ RD_VocabInfo rd_vocab_info_table[365] = RD_NameSchemaInfo rd_name_schema_info_table[39] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project when a user file is loaded (and thus when the debugger starts).\")\n 'auto_load_last_project': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 0278a5e7..668a81c1 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -312,6 +312,10 @@ RD_VocabTable: //- rjf: transient tabs @default(1) @display_name('Transient Tabs') @description("When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.") 'transient_tabs': bool, + + //- rjf: auto-load last project + @default(0) @display_name('Auto Load Last Project') @description("Enables loading the most recently opened project when a user file is loaded (and thus when the debugger starts).") + 'auto_load_last_project': bool, } ``` } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 5888ea27..3f537aab 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -13128,6 +13128,18 @@ rd_frame(void) rd_cmd(RD_CmdKind_SetCurrentPath, .file_path = new_current_dir); } } + + //- rjf: if just opened user -> load last project, if enabled + if(kind == RD_CmdKind_OpenUser && rd_setting_b32_from_name(s("auto_load_last_project"))) + { + CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), s("user")); + CFG_NodePtrList recent_projects = cfg_node_child_list_from_string(scratch.arena, user, s("recent_project")); + CFG_Node *recent_project = cfg_node_ptr_list_first(&recent_projects); + if(recent_project != &cfg_nil_node) + { + rd_cmd(RD_CmdKind_OpenRecentProject, .cfg = recent_project->id); + } + } }break; case RD_CmdKind_NewUser: { From e958814b074eeb1a55af35b69310564b26e71bb1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 12:16:16 -0700 Subject: [PATCH 727/850] use fully-qualified names in eval viz address resolved symbol strings, used in call stack / etc. --- src/eval_visualization/eval_visualization_core.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 58471d35..9996b929 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -2049,8 +2049,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) RDI_Symbol *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx); RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx); E_TypeKey type = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, dbg_info_num); - String8 name = {0}; - name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size); + String8 name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, procedure); if(procedure->type_idx != 0) { String8List list = {0}; @@ -2080,19 +2079,21 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) // NOTE(rjf): non-read-only -> only generate thing which can be parsed, so just procedure name else { + Temp scratch = scratch_begin(&arena, 1); + // rjf: voff -> scope U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff); RDI_Scope *scope = rdi_scope_from_voff(rdi, voff); // rjf: scope -> procedure / string RDI_Symbol *procedure = rdi_procedure_from_scope(rdi, scope); - String8 procedure_name = {0}; - procedure_name.str = rdi_name_from_procedure(rdi, procedure, &procedure_name.size); + String8 procedure_name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, procedure); if(procedure_name.size != 0) { *out_string = str8f(arena, "%S%S", pre_prefix, procedure_name); } good_symbol_match = (procedure_name.size != 0); + scratch_end(scratch); } ptr_data->did_prefix_content = good_symbol_match; From fd1ee1c2655397bb219673ff59c945c8d4f965e4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 2 Jun 2026 14:41:43 -0700 Subject: [PATCH 728/850] radbin: absolutify relative external-file-paths (debug link, pdb-in-exe), to avoid clashing with working-directory files of the same name --- src/radbin/radbin.c | 16 ++++++++++++++-- src/raddbg/raddbg_core.c | 6 ++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 8ef2b2b1..58ce02ae 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -322,7 +322,13 @@ rb_thread_entry_point(void *p) if(n->v.path.size != 0) { log_infof("Found reference to separate debug info file in %S (%S) at %S\n", file_path, rb_file_format_display_name_table[file_format], n->v.path); - str8_list_push(arena, &input_file_path_tasks, n->v.path); + String8 ext_path_absolute = n->v.path; + PathStyle ext_path_style = path_style_from_str8(ext_path_absolute); + if(ext_path_style == PathStyle_Relative) + { + ext_path_absolute = path_absolute_dst_from_relative_dst_src(arena, ext_path_absolute, str8_chop_last_slash(input_file_path)); + } + str8_list_push(arena, &input_file_path_tasks, ext_path_absolute); } } scratch_end(scratch); @@ -340,7 +346,13 @@ rb_thread_entry_point(void *p) if(debug_link.path.size != 0) { log_infof("Found reference to separate debug info file in %S (%S) at %S\n", n->string, rb_file_format_display_name_table[file_format], debug_link.path); - str8_list_push(arena, &input_file_path_tasks, debug_link.path); + String8 ext_path_absolute = debug_link.path; + PathStyle ext_path_style = path_style_from_str8(ext_path_absolute); + if(ext_path_style == PathStyle_Relative) + { + ext_path_absolute = path_absolute_dst_from_relative_dst_src(arena, ext_path_absolute, str8_chop_last_slash(input_file_path)); + } + str8_list_push(arena, &input_file_path_tasks, ext_path_absolute); } scratch_end(scratch); } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 3f537aab..80f4495a 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -6181,6 +6181,12 @@ rd_window_frame(void) { B32 build_hover_eval = (hover_eval_is_open && !rd_drag_is_active()); + // rjf: reset hover eval timer if it's "open" but we aren't going to build it + if(!build_hover_eval && hover_eval_is_open) + { + ws->hover_eval_firstt_us = rd_state->time_in_us; + } + // rjf: disable hover eval if hovered view is actively scrolling if(hover_eval_is_open) { From 4d1d362ac196fcb69d21447cf3bedc962298cf14 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 09:01:51 -0700 Subject: [PATCH 729/850] adjust find-code-location path to absolutify relativized paths based on current thread/module; also respect module-relative / debug-info-relative paths in src -> voff & voff -> src mapping --- project.4coder | 3 +- project.raddbg | 48 +++---- src/dbg_engine/dbg_engine_user.c | 36 ++++- src/dbg_engine/dbg_engine_user.h | 4 +- src/eval/eval_interpret.c | 2 + src/eval/eval_types.c | 2 + src/raddbg/raddbg_core.c | 223 ++++++++++++++++++++++++++----- src/raddbg/raddbg_core.h | 11 ++ src/raddbg/raddbg_views.c | 160 +++++----------------- src/raddbg/raddbg_views.h | 8 +- 10 files changed, 296 insertions(+), 201 deletions(-) diff --git a/project.4coder b/project.4coder index 14cc2147..127e1515 100644 --- a/project.4coder +++ b/project.4coder @@ -55,7 +55,8 @@ commands = // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [scratch] - .f2 = { .win = "pushd build && for /l %i in (1, 1, 3) do (radbin --capture --rdi mule_main.pdb --async_thread_count=1 --thread_count=8)", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + // .f2 = { .win = "pushd build && for /l %i in (1, 1, 3) do (radbin --rdi raddbg.exe --out:raddbg_%i.rdi && radbin --dump raddbg_%i.rdi --out:raddbg_%i.dump)", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f2 = { .win = "pushd build && radbin --rdi raddbg.exe --thread_count=1 --out:1.rdi && radbin --rdi raddbg.exe --thread_count=8 --out:8.rdi && radbin --dump 1.rdi --out:1.dump && radbin --dump 8.rdi --out:8.dump)", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [textperf] // .f1 = { .win = "raddbg_stable --ipc kill_all && build no_meta telemetry textperf && raddbg_stable --ipc bring_to_front && raddbg_stable --ipc run", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index d0bef4ce..6f67590f 100644 --- a/project.raddbg +++ b/project.raddbg @@ -2,47 +2,22 @@ name: "The RAD Debugger" target: -{ - executable: "build/raddbg.exe" - working_directory: build - arguments: "--user:raddbg_test.user --project:raddbg_test.project" - debug_subprocesses: 0 -} -target: { executable: "build/raddbg.exe" working_directory: "../raddebugger" - arguments: "project.raddbg" + arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project" + debug_subprocesses: 0 + enabled: 1 } target: { executable: "build/mule_main.exe" working_directory: build - enabled: 1 -} -target: -{ - executable: "build/radbin.exe" - working_directory: build - arguments: "--rdi simple --thread_count=1" -} -target: -{ - executable: "build/radbin.exe" - working_directory: build - arguments: "--rdi chrome.dll.pdb --capture" -} -target: -{ - executable: "build/radbin.exe" - working_directory: build - arguments: "--rdi raddbg.pdb" } target: { executable: "build/torture.exe" working_directory: build - arguments: "rdi_from_pdb/* --gui" } target: { @@ -55,3 +30,20 @@ target: working_directory: build arguments: "--rdi raddbg" } +target: +{ + executable: "build/debugstringperf.exe" + working_directory: build +} +target: +{ + executable: "build/radbin.exe" + working_directory: build + arguments: "--rdi raddbg.exe --thread_count=1" +} +target: +{ + executable: "build/raddbg.exe" + working_directory: build + arguments: "--bin --quiet --rdi --out:C:/devel/raddebugger_stable/build/radbin.rdi --thread_count:1 C:/devel/raddebugger_stable/build/radbin.exe" +} diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 7c2ec311..91e55c68 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -66,7 +66,7 @@ d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src) //~ rjf: Path Map Application internal String8List -d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path) +d_possible_path_overrides_from_maps_path(Arena *arena, D_Entity *primary_module, D_PathMapArray *path_maps, String8 file_path) { // NOTE(rjf): This path, given some target file path, scans all file path map // overrides, and collects the set of file paths which could've redirected @@ -85,6 +85,22 @@ d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps Temp scratch = scratch_begin(&arena, 1); PathStyle pth_style = PathStyle_Relative; String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style); + + //- rjf: push possible overrides by relativizing according to module / debug info + { + String8 module_folder = str8_chop_last_slash(primary_module->string); + String8 path_relative_to_module = path_relative_dst_from_absolute_dst_src(arena, file_path, module_folder); + String8 debug_info_path = d_entity_child_from_kind(primary_module, D_EntityKind_DebugInfoPath)->string; + String8 debug_info_folder = str8_chop_last_slash(debug_info_path); + str8_list_push(arena, &result, path_relative_to_module); + if(!path_match_normalized(debug_info_folder, module_folder)) + { + String8 path_relative_to_debug_info = path_relative_dst_from_absolute_dst_src(arena, file_path, debug_info_folder); + str8_list_push(arena, &result, path_relative_to_debug_info); + } + } + + //- rjf: push possible overrides based on path map rules { for(U64 idx = 0; idx < path_maps->count; idx += 1) { @@ -1033,6 +1049,14 @@ d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff) RDI_Line *line = &parsed_line_table.lines[line_info_idx]; RDI_Column *column = (line_info_idx < parsed_line_table.col_count) ? &parsed_line_table.cols[line_info_idx] : 0; RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx); + RDI_SectionKind checksum_section_kind = rdi_section_kind_from_checksum_kind(file->checksum_kind); + U64 checksum_size = rdi_section_element_size_table[checksum_section_kind]; + U8 *checksum_data = (U8 *)rdi_section_raw_element_from_kind_idx(rdi, checksum_section_kind, file->checksum_idx); + String8 checksum_value = {0}; + if(file->checksum_idx != 0) + { + checksum_value = str8(checksum_data, checksum_size); + } String8List path_parts = {0}; for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, file->file_path_node_idx); fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0); @@ -1054,6 +1078,8 @@ d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff) } n->v.pt = txt_pt(line->line_num, column ? column->col_first : 1); n->v.voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]); + n->v.checksum_kind = file->checksum_kind; + n->v.checksum_value = str8_copy(arena, checksum_value); n->v.dbgi_key = dbgi_key; if(line_table_n == top_line_table) { @@ -2258,6 +2284,12 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P d_user_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash; } + // rjf: unpack target thread/module + D_Entity *thread = d_entity_from_handle(params->thread); + D_Entity *process = d_process_from_entity(thread); + U64 thread_ip_vaddr = d_cached_ip_from_thread(thread->handle); + D_Entity *module = d_module_from_process_vaddr(process, thread_ip_vaddr); + // rjf: push & fill run message D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); { @@ -2284,7 +2316,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: textual location -> add breakpoints for all possible override locations if(bp->file_path.size != 0 && bp->pt.line != 0) { - String8List overrides = d_possible_path_overrides_from_maps_path(scratch.arena, path_maps, bp->file_path); + String8List overrides = d_possible_path_overrides_from_maps_path(scratch.arena, module, path_maps, bp->file_path); for(String8Node *n = overrides.first; n != 0; n = n->next) { D_Breakpoint dst_bp = {0}; diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index 8b57b40a..ae9a95d7 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -13,6 +13,8 @@ struct D_Line String8 file_path; TxtPt pt; Rng1U64 voff_range; + RDI_ChecksumKind checksum_kind; + String8 checksum_value; DI_Key dbgi_key; }; @@ -402,7 +404,7 @@ internal D_BreakpointArray d_breakpoint_array_copy(Arena *arena, D_BreakpointArr //////////////////////////////// //~ rjf: Path Map Application -internal String8List d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path); +internal String8List d_possible_path_overrides_from_maps_path(Arena *arena, D_Entity *primary_module, D_PathMapArray *path_maps, String8 file_path); //////////////////////////////// //~ rjf: Debug Info Extraction Type Pure Functions diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 5e64b380..84b5f8a0 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -77,6 +77,7 @@ e_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 //- rjf: file reads case E_SpaceKind_File: { + Temp scratch = scratch_begin(0, 0); Access *access = access_open(); // rjf: unpack space/path @@ -155,6 +156,7 @@ e_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 } access_close(access); + scratch_end(scratch); }break; //- rjf: debug info constant data diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 682bef82..2d7e56f7 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1666,6 +1666,8 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr str8_list_pushf(arena, out, "%S ", type->name); }break; + case E_TypeKind_Null:{}break; + case E_TypeKind_Bitfield: { E_Type *type = e_type_from_key(key); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 80f4495a..d8a54442 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -560,6 +560,21 @@ rd_possible_overrides_from_file_path(Arena *arena, String8 file_path) Temp scratch = scratch_begin(&arena, 1); PathStyle pth_style = PathStyle_Relative; String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style); + + //- rjf: push possible overrides for relativized-according-to-debug-info-and-module path + { + String8 module_folder = str8_chop_last_slash(e_base_ctx->primary_module->name); + String8 path_relative_to_module = path_relative_dst_from_absolute_dst_src(arena, file_path, module_folder); + String8 debug_info_folder = str8_chop_last_slash(e_base_ctx->primary_dbg_info->name); + str8_list_push(arena, &result, path_relative_to_module); + if(!path_match_normalized(debug_info_folder, module_folder)) + { + String8 path_relative_to_debug_info = path_relative_dst_from_absolute_dst_src(arena, file_path, debug_info_folder); + str8_list_push(arena, &result, path_relative_to_debug_info); + } + } + + //- rjf: push possible overrides from file path map rules { CFG_NodePtrList links = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("file_path_map")); for(CFG_NodePtrNode *n = links.first; n != 0; n = n->next) @@ -1405,11 +1420,11 @@ rd_file_path_from_eval(Arena *arena, E_Eval eval) default:{}break; case E_SpaceKind_File: { - result = push_str8_copy(arena, e_string_from_id(eval.space.u64_0)); + result = str8_copy(arena, e_string_from_id(eval.space.u64_0)); }break; case E_SpaceKind_FileSystem: { - result = push_str8_copy(arena, e_string_from_id(eval.value.u64)); + result = str8_copy(arena, e_string_from_id(eval.value.u64)); }break; } return result; @@ -4385,30 +4400,46 @@ rd_view_ui(Rng2F32 rect) next_row_expanded = !row_expanded; } - // rjf: can't edit, but has address info? -> go to address - else if(cell->eval.space.kind == D_EvalSpaceKind_Entity) + // rjf: can't edit, but evaluates w/ a type in debug info? -> go to voff + else if(e_type_key_unwrap(cell->eval.irtree.type_key, E_TypeUnwrapFlag_All).kind == E_TypeKeyKind_Ext || + cell->eval.space.kind == D_EvalSpaceKind_Entity) { - D_Entity *entity = rd_ctrl_entity_from_eval_space(cell->eval.space); - D_Entity *process = d_process_from_entity(entity); - if(process != &d_entity_nil) + // rjf: try to unpack debug info from type + E_TypeKey type_key = e_type_key_unwrap(cell->eval.irtree.type_key, E_TypeUnwrapFlag_All); + DI_Key dbgi_key = {0}; + String8 base_folder = {0}; { - U64 vaddr = cell->eval.value.u64; - D_Entity *module = d_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = d_dbgi_key_from_module(module); - U64 voff = d_voff_from_vaddr(module, vaddr); - D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); - String8 file_path = {0}; - TxtPt pt = {0}; - if(lines.first != 0) - { - file_path = lines.first->v.file_path; - pt = lines.first->v.pt; - rd_cmd(RD_CmdKind_FindCodeLocation, - .process = process->handle, - .vaddr = vaddr, - .file_path = file_path, - .cursor = pt); - } + E_DbgInfo *dbg_info = e_dbg_info_from_type_key(type_key); + dbgi_key = dbg_info->dbgi_key; + base_folder = str8_chop_last_slash(dbg_info->name); + } + + // rjf: if this is a vaddr evaluation, then unpack voff/vaddr & switch to module's debug info + U64 vaddr = 0; + U64 voff = cell->eval.value.u64; + D_Entity *process = rd_ctrl_entity_from_eval_space(cell->eval.space); + D_Entity *module = &d_entity_nil; + if(process->kind == D_EntityKind_Process) + { + vaddr = cell->eval.value.u64; + module = d_module_from_process_vaddr(process, vaddr); + voff = d_voff_from_vaddr(module, vaddr); + dbgi_key = d_dbgi_key_from_module(module); + base_folder = str8_chop_last_slash(module->string); + } + + // rjf: voff * debug info -> lines + D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff); + + // rjf: snap to line + if(lines.first != 0) + { + String8 file_path = lines.first->v.file_path; + TxtPt pt = lines.first->v.pt; + rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = file_path, .cursor = pt, .vaddr = vaddr, + .process = process->handle, + .module = module->handle, + .dbgi_key = dbgi_key); } } @@ -9805,6 +9836,122 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event) return fstrs; } +//////////////////////////////// +//~ rjf: Source File Checksum Calculations + +internal AC_Artifact +rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) +{ + AC_Artifact result = {0}; + { + Access *access = access_open(); + U128 hash = {0}; + str8_deserial_read_struct(key, 0, &hash); + String8 data = c_data_from_hash(access, hash); + MD5 md5 = md5_from_data(data); + StaticAssert(sizeof(result) >= sizeof(md5), artifact_size_check); + MemoryCopy(&result, &md5, Min(sizeof(result), sizeof(md5))); + access_close(access); + } + return result; +} + +internal AC_Artifact +rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) +{ + AC_Artifact result = {0}; + { + Access *access = access_open(); + U128 hash = {0}; + str8_deserial_read_struct(key, 0, &hash); + String8 data = c_data_from_hash(access, hash); + SHA1 sha1 = sha1_from_data(data); + StaticAssert(sizeof(result) >= sizeof(sha1), artifact_size_check); + MemoryCopy(&result, &sha1, Min(sizeof(result), sizeof(sha1))); + access_close(access); + } + return result; +} + +internal AC_Artifact +rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) +{ + AC_Artifact result = {0}; + { + Access *access = access_open(); + U128 hash = {0}; + str8_deserial_read_struct(key, 0, &hash); + String8 data = c_data_from_hash(access, hash); + SHA256 sha256 = sha256_from_data(data); + StaticAssert(sizeof(result) >= sizeof(sha256), artifact_size_check); + MemoryCopy(&result, &sha256, Min(sizeof(result), sizeof(sha256))); + access_close(access); + } + return result; +} + +internal MD5 +rd_md5_from_hash(U128 hash) +{ + Access *access = access_open(); + AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_md5_artifact_create, 0, 0); + MD5 md5 = {0}; + MemoryCopy(&md5, &artifact, Min(sizeof(md5), sizeof(artifact))); + access_close(access); + return md5; +} + +internal SHA1 +rd_sha1_from_hash(U128 hash) +{ + Access *access = access_open(); + AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_sha1_artifact_create, 0, 0); + SHA1 sha1 = {0}; + MemoryCopy(&sha1, &artifact, Min(sizeof(sha1), sizeof(artifact))); + access_close(access); + return sha1; +} + +internal SHA256 +rd_sha256_from_hash(U128 hash) +{ + Access *access = access_open(); + AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_sha256_artifact_create, 0, 0); + SHA256 sha256 = {0}; + MemoryCopy(&sha256, &artifact, Min(sizeof(sha256), sizeof(artifact))); + access_close(access); + return sha256; +} + +internal String8 +rd_checksum_value_from_hash_kind(Arena *arena, U128 hash, RDI_ChecksumKind k) +{ + String8 result = {0}; + switch(k) + { + default:{}break; + case RDI_ChecksumKind_MD5: + { + MD5 md5 = rd_md5_from_hash(hash); + String8 md5_string = str8_struct(&md5); + result = str8_copy(arena, md5_string); + }break; + case RDI_ChecksumKind_SHA1: + { + SHA1 sha1 = rd_sha1_from_hash(hash); + String8 sha1_string = str8_struct(&sha1); + result = str8_copy(arena, sha1_string); + }break; + case RDI_ChecksumKind_SHA256: + { + SHA256 sha256 = rd_sha256_from_hash(hash); + String8 sha256_string = str8_struct(&sha256); + result = str8_copy(arena, sha256_string); + }break; + } + return result; +} + //////////////////////////////// //~ rjf: Vocab Info Lookups @@ -12334,16 +12481,16 @@ rd_frame(void) E_InterpretCtx *interpret_ctx = push_array(scratch.arena, E_InterpretCtx, 1); { E_InterpretCtx *ctx = interpret_ctx; - ctx->primary_space = primary_space; - ctx->reg_arch = arch; - ctx->reg_space = rd_eval_space_from_ctrl_entity(thread, D_EvalSpaceKind_Entity); - ctx->reg_unwind_count = unwind_count; - ctx->module_base = push_array(scratch.arena, U64, 1); - ctx->module_base[0] = module->vaddr_range.min; - ctx->frame_base = push_array(scratch.arena, U64, 1); - ctx->tls_base = push_array(scratch.arena, U64, 1); - ctx->tls_base[0] = d_cached_tls_vaddr_from_thread_module(thread->handle, module->handle, rd_state->frame_eval_memread_endt_us, 0); - ctx->cfa = d_query_cached_cfa_from_thread_unwind(thread, unwind_count); + ctx->primary_space = primary_space; + ctx->reg_arch = arch; + ctx->reg_space = rd_eval_space_from_ctrl_entity(thread, D_EvalSpaceKind_Entity); + ctx->reg_unwind_count = unwind_count; + ctx->module_base = push_array(scratch.arena, U64, 1); + ctx->module_base[0] = module->vaddr_range.min; + ctx->frame_base = push_array(scratch.arena, U64, 1); + ctx->tls_base = push_array(scratch.arena, U64, 1); + ctx->tls_base[0] = d_cached_tls_vaddr_from_thread_module(thread->handle, module->handle, rd_state->frame_eval_memread_endt_us, 0); + ctx->cfa = d_query_cached_cfa_from_thread_unwind(thread, unwind_count); } e_select_interpret_ctx(interpret_ctx, eval_dbg_infos_primary->rdi, rip_voff); @@ -14707,6 +14854,14 @@ rd_frame(void) } } + //- rjf: absolutify file path + { + String8 base_folder = {0}; + if(base_folder.size == 0) { base_folder = str8_chop_last_slash(e_base_ctx->primary_dbg_info->name); } + if(base_folder.size == 0) { base_folder = str8_chop_last_slash(e_base_ctx->primary_module->name); } + file_path = path_absolute_dst_from_relative_dst_src(scratch.arena, file_path, base_folder); + } + //- rjf: if transient tabs are turned off, always prefer new tab if(!rd_setting_b32_from_name(str8_lit("transient_tabs"))) { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 60ef35e1..028170eb 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -784,6 +784,17 @@ internal FNT_RasterFlags rd_raster_flags_from_slot(RD_FontSlot slot); internal String8 rd_string_from_exception_code(U32 code); internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event); +//////////////////////////////// +//~ rjf: Source File Checksum Calculations + +internal AC_Artifact rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); +internal AC_Artifact rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); +internal AC_Artifact rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); +internal MD5 rd_md5_from_hash(U128 hash); +internal SHA1 rd_sha1_from_hash(U128 hash); +internal SHA256 rd_sha256_from_hash(U128 hash); +internal String8 rd_checksum_value_from_hash_kind(Arena *arena, U128 hash, RDI_ChecksumKind k); + //////////////////////////////// //~ rjf: Vocab Info Lookups diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index db0b38af..05c39aaf 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -19,8 +19,8 @@ rd_code_view_init(RD_CodeViewState *cv) ProfEnd(); } -internal RD_CodeViewBuildResult -rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) +internal void +rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, U128 text_hash, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -292,21 +292,37 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla U64 rip_voff = d_voff_from_vaddr(module, last_inst_on_unwound_rip_vaddr); DI_Key dbgi_key = d_dbgi_key_from_module(module); D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, rip_voff); + String8 file_checksums[RDI_ChecksumKind_COUNT] = {0}; for(D_LineNode *n = lines.first; n != 0; n = n->next) { if(visible_line_num_range.min <= n->v.pt.line && n->v.pt.line <= visible_line_num_range.max) { - for(String8Node *override_n = file_path_possible_overrides.first; - override_n != 0; - override_n = override_n->next) + B32 matches_file = 0; + if(!matches_file) + { + if(file_checksums[n->v.checksum_kind].size == 0) + { + file_checksums[n->v.checksum_kind] = rd_checksum_value_from_hash_kind(scratch.arena, text_hash, n->v.checksum_kind); + } + String8 file_checksum = file_checksums[n->v.checksum_kind]; + String8 file_checksum_expected = n->v.checksum_value; + matches_file = str8_match(file_checksum, file_checksum_expected, 0); + } + if(!matches_file) for(String8Node *override_n = file_path_possible_overrides.first; + override_n != 0; + override_n = override_n->next) { if(path_match_normalized(n->v.file_path, override_n->string)) { - U64 slice_line_idx = n->v.pt.line-visible_line_num_range.min; - d_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); + matches_file = 1; break; } } + if(matches_file) + { + U64 slice_line_idx = n->v.pt.line-visible_line_num_range.min; + d_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread); + } } } } @@ -810,17 +826,6 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla } } - ////////////////////////////// - //- rjf: build result - // - RD_CodeViewBuildResult result = {0}; - { - for(DI_KeyNode *n = code_slice_params.relevant_dbgi_keys.first; n != 0; n = n->next) - { - di_key_list_push(arena, &result.dbgi_keys, n->v); - } - } - ////////////////////////////// //- rjf: store state // @@ -829,7 +834,6 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla scratch_end(scratch); ProfEnd(); - return result; } //////////////////////////////// @@ -1998,90 +2002,6 @@ RD_VIEW_UI_FUNCTION_DEF(null) {} //////////////////////////////// //~ rjf: text @view_hook_impl -internal AC_Artifact -rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) -{ - AC_Artifact result = {0}; - { - Access *access = access_open(); - U128 hash = {0}; - str8_deserial_read_struct(key, 0, &hash); - String8 data = c_data_from_hash(access, hash); - MD5 md5 = md5_from_data(data); - StaticAssert(sizeof(result) >= sizeof(md5), artifact_size_check); - MemoryCopy(&result, &md5, Min(sizeof(result), sizeof(md5))); - access_close(access); - } - return result; -} - -internal AC_Artifact -rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) -{ - AC_Artifact result = {0}; - { - Access *access = access_open(); - U128 hash = {0}; - str8_deserial_read_struct(key, 0, &hash); - String8 data = c_data_from_hash(access, hash); - SHA1 sha1 = sha1_from_data(data); - StaticAssert(sizeof(result) >= sizeof(sha1), artifact_size_check); - MemoryCopy(&result, &sha1, Min(sizeof(result), sizeof(sha1))); - access_close(access); - } - return result; -} - -internal AC_Artifact -rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) -{ - AC_Artifact result = {0}; - { - Access *access = access_open(); - U128 hash = {0}; - str8_deserial_read_struct(key, 0, &hash); - String8 data = c_data_from_hash(access, hash); - SHA256 sha256 = sha256_from_data(data); - StaticAssert(sizeof(result) >= sizeof(sha256), artifact_size_check); - MemoryCopy(&result, &sha256, Min(sizeof(result), sizeof(sha256))); - access_close(access); - } - return result; -} - -internal MD5 -rd_md5_from_hash(U128 hash) -{ - Access *access = access_open(); - AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_md5_artifact_create, 0, 0); - MD5 md5 = {0}; - MemoryCopy(&md5, &artifact, Min(sizeof(md5), sizeof(artifact))); - access_close(access); - return md5; -} - -internal SHA1 -rd_sha1_from_hash(U128 hash) -{ - Access *access = access_open(); - AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_sha1_artifact_create, 0, 0); - SHA1 sha1 = {0}; - MemoryCopy(&sha1, &artifact, Min(sizeof(sha1), sizeof(artifact))); - access_close(access); - return sha1; -} - -internal SHA256 -rd_sha256_from_hash(U128 hash) -{ - Access *access = access_open(); - AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_sha256_artifact_create, 0, 0); - SHA256 sha256 = {0}; - MemoryCopy(&sha256, &artifact, Min(sizeof(sha256), sizeof(artifact))); - access_close(access); - return sha256; -} - EV_EXPAND_RULE_INFO_FUNCTION_DEF(text) { EV_ExpandInfo info = {0}; @@ -2269,7 +2189,6 @@ RD_VIEW_UI_FUNCTION_DEF(text) ////////////////////////////// //- rjf: build code contents // - DI_KeyList dbgi_keys = {0}; if(!file_is_missing) { RD_CodeViewBuildFlags flags = RD_CodeViewBuildFlag_All; @@ -2277,8 +2196,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) { flags &= ~RD_CodeViewBuildFlag_Margins; } - RD_CodeViewBuildResult result = rd_code_view_build(scratch.arena, cv, flags, code_area_rect, data, &info, 0, r1u64(0, 0), di_key_zero()); - dbgi_keys = result.dbgi_keys; + rd_code_view_build(scratch.arena, cv, flags, code_area_rect, hash, data, &info, 0, r1u64(0, 0), di_key_zero()); } ////////////////////////////// @@ -2298,16 +2216,16 @@ RD_VIEW_UI_FUNCTION_DEF(text) { Temp scratch = scratch_begin(0, 0); - // rjf: determine checksum in relevant debug infos + // rjf: determine checksum in selected debug info + E_DbgInfo *dbg_info = e_base_ctx->primary_dbg_info; + DI_Key dbgi_key = dbg_info->dbgi_key; RDI_ChecksumKind checksum_kind = RDI_ChecksumKind_NULL; String8 checksum_expected = {0}; - for(DI_KeyNode *n = dbgi_keys.first; n != 0 && checksum_kind == RDI_ChecksumKind_NULL; n = n->next) { Access *access = access_open(); // rjf: unpack RDI - DI_Key key = n->v; - RDI_Parsed *rdi = di_rdi_from_key(access, key, 0, 0); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); // rjf: file_path_normalized * rdi -> src_id for EachNode(override_n, String8Node, overrides.first) @@ -2347,24 +2265,10 @@ RD_VIEW_UI_FUNCTION_DEF(text) // rjf: if we got a checksum, compute it locally - check if they match. switch(checksum_kind) { - default:{}break; - case RDI_ChecksumKind_MD5: + default: { - MD5 md5 = rd_md5_from_hash(hash); - String8 md5_string = str8_struct(&md5); - file_is_out_of_date = !MemoryIsZeroStruct(&md5) && !str8_match(md5_string, checksum_expected, 0); - }break; - case RDI_ChecksumKind_SHA1: - { - SHA1 sha1 = rd_sha1_from_hash(hash); - String8 sha1_string = str8_struct(&sha1); - file_is_out_of_date = !MemoryIsZeroStruct(&sha1) && !str8_match(sha1_string, checksum_expected, 0); - }break; - case RDI_ChecksumKind_SHA256: - { - SHA256 sha256 = rd_sha256_from_hash(hash); - String8 sha256_string = str8_struct(&sha256); - file_is_out_of_date = !MemoryIsZeroStruct(&sha256) && !str8_match(sha256_string, checksum_expected, 0); + String8 checksum_value = rd_checksum_value_from_hash_kind(scratch.arena, hash, checksum_kind); + file_is_out_of_date = !memory_is_zero(checksum_value.str, checksum_value.size) && !str8_match(checksum_value, checksum_expected, 0); }break; case RDI_ChecksumKind_Timestamp: { @@ -2635,7 +2539,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) // if(!is_loading && has_disasm) { - rd_code_view_build(scratch.arena, cv, RD_CodeViewBuildFlag_All, code_area_rect, dasm_text_data, &dasm_text_info, &dasm_info.lines, range, dbgi_key); + rd_code_view_build(scratch.arena, cv, RD_CodeViewBuildFlag_All, code_area_rect, dasm_text_hash, dasm_text_data, &dasm_text_info, &dasm_info.lines, range, dbgi_key); } ////////////////////////////// diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index 478bd154..b5671c92 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -64,12 +64,6 @@ struct RD_CodeViewState U64 wrap_total_vline_count; }; -typedef struct RD_CodeViewBuildResult RD_CodeViewBuildResult; -struct RD_CodeViewBuildResult -{ - DI_KeyList dbgi_keys; -}; - //////////////////////////////// //~ rjf: Watch View Types @@ -200,7 +194,7 @@ struct RD_WatchViewState //~ rjf: Code View Functions internal void rd_code_view_init(RD_CodeViewState *cv); -internal RD_CodeViewBuildResult rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key); +internal void rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, U128 text_hash, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key); //////////////////////////////// //~ rjf: Watch View Functions From e7153e89109ac7512da0ebf6e833ff01f2b98737 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 09:10:53 -0700 Subject: [PATCH 730/850] auto load project only when project is not specified; fix alt menu weirdness on alt+tab --- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 +- src/raddbg/raddbg_core.c | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index d5632dcd..705d571e 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -433,7 +433,7 @@ RD_VocabInfo rd_vocab_info_table[365] = RD_NameSchemaInfo rd_name_schema_info_table[39] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project when a user file is loaded (and thus when the debugger starts).\")\n 'auto_load_last_project': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 668a81c1..2e97516b 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -314,7 +314,7 @@ RD_VocabTable: 'transient_tabs': bool, //- rjf: auto-load last project - @default(0) @display_name('Auto Load Last Project') @description("Enables loading the most recently opened project when a user file is loaded (and thus when the debugger starts).") + @default(0) @display_name('Auto Load Last Project') @description("Enables loading the most recently opened project, if one is not specified from the command line.") 'auto_load_last_project': bool, } ``` diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index d8a54442..7daf17a1 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5143,6 +5143,7 @@ rd_window_frame(void) if(!window_is_focused || popup_is_open) { ws->menu_bar_key_held = 0; + ws->menu_bar_focus_press_started = 0; } ws->window_temporarily_focused_ipc = 0; ui_select_state(ws->ui); @@ -11358,7 +11359,7 @@ rd_frame(void) } //- rjf: try menu bar operations - if(rd_state->alt_menu_bar_enabled) + if(rd_state->alt_menu_bar_enabled && wm_window_is_focused(ws->os)) { if(!take && event->kind == WM_EventKind_Press && event->key == WM_Key_Alt && event->modifiers == 0 && event->is_repeat == 0) { @@ -13283,7 +13284,7 @@ rd_frame(void) } //- rjf: if just opened user -> load last project, if enabled - if(kind == RD_CmdKind_OpenUser && rd_setting_b32_from_name(s("auto_load_last_project"))) + if(kind == RD_CmdKind_OpenUser && rd_setting_b32_from_name(s("auto_load_last_project")) && rd_state->project_path.size == 0) { CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), s("user")); CFG_NodePtrList recent_projects = cfg_node_child_list_from_string(scratch.arena, user, s("recent_project")); From 737ceb131385252f02eddc5361f98685581ea7a5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 10:28:47 -0700 Subject: [PATCH 731/850] tweaks / improvements to watch windows & lister ui - display controls, appearance, remove redundant visual info --- project.4coder | 2 +- src/raddbg/raddbg_core.c | 129 ++++++++++++++++++++++++++++++------ src/raddbg/raddbg_widgets.c | 14 ++-- src/raddbg/raddbg_widgets.h | 8 ++- src/ui/ui_basic_widgets.c | 11 ++- src/ui/ui_core.h | 28 ++++---- 6 files changed, 149 insertions(+), 43 deletions(-) diff --git a/project.4coder b/project.4coder index 127e1515..0b10da9c 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 7daf17a1..7439a507 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1685,34 +1685,47 @@ rd_view_ui(Rng2F32 rect) //- rjf: build container UI_Box *search_row = &ui_nil_box; - UI_PrefHeight(ui_px(search_row_height, 1.f)) + UI_PrefHeight(ui_px(search_row_height, 1.f)) UI_TagF("focus") { - search_row = ui_build_box_from_stringf(UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DrawDropShadow, "###search"); + if(!vs->contents_are_focused) + { + ui_set_next_border_color(ui_color_from_name(s("border"))); + } + search_row = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawDropShadow, "###search"); } //- rjf: build contents UI_Parent(search_row) UI_WidthFill UI_HeightFill UI_Focus(vs->query_is_open && !vs->contents_are_focused ? UI_FocusKind_On : UI_FocusKind_Off) RD_Font(cmd_kind_info->query.flags & RD_QueryFlag_CodeInput ? RD_FontSlot_Code : RD_FontSlot_Main) + UI_Flags(UI_BoxFlag_DisableFocusOverlay|UI_BoxFlag_DisableFocusBorder) { - if(cmd_name.size != 0) + UI_TagF("weak") { - ui_spacer(ui_em(0.5f, 1.f)); - UI_TextAlignment(UI_TextAlign_Center) + if(cmd_name.size != 0) + { + ui_spacer(ui_em(0.5f, 1.f)); + UI_TextAlignment(UI_TextAlign_Center) + UI_Transparency(1-search_row_open_t) + UI_PrefWidth(ui_em(3.f, 1.f)) + RD_Font(RD_FontSlot_Icons) + ui_label(rd_icon_kind_text_table[icon == RD_IconKind_Null ? RD_IconKind_Find : icon]); UI_Transparency(1-search_row_open_t) - UI_PrefWidth(ui_em(3.f, 1.f)) - UI_TagF("weak") - RD_Font(RD_FontSlot_Icons) - ui_label(rd_icon_kind_text_table[icon == RD_IconKind_Null ? RD_IconKind_Find : icon]); - UI_Transparency(1-search_row_open_t) - RD_Font(RD_FontSlot_Main) UI_PrefWidth(ui_text_dim(1, 1)) - ui_label(rd_display_from_code_name(cmd_name)); - ui_spacer(ui_em(0.5f, 1.f)); + RD_Font(RD_FontSlot_Main) UI_PrefWidth(ui_text_dim(1, 1)) + UI_FontSize(ui_top_font_size()*0.85f) + ui_label(rd_display_from_code_name(cmd_name)); + } + else + { + ui_spacer(ui_em(0.5f, 1.f)); + UI_TextAlignment(UI_TextAlign_Center) RD_Font(RD_FontSlot_Icons) UI_PrefWidth(ui_em(2.f, 1.f)) + ui_label(rd_icon_kind_text_table[RD_IconKind_Find]); + } } UI_Key line_edit_key = {0}; RD_CellParams params = {0}; { params.flags |= !!(cmd_kind_info->query.flags & RD_QueryFlag_CodeInput) * RD_CellFlag_CodeContents; - params.flags |= RD_CellFlag_Border; + params.flags |= RD_CellFlag_NoBackground; params.cursor = &vs->query_cursor; params.mark = &vs->query_mark; params.edit_buffer = vs->query_buffer; @@ -1888,7 +1901,7 @@ rd_view_ui(Rng2F32 rect) UI_Padding(ui_pct(1, 0)) { ui_labelf("use"); - UI_TextAlignment(UI_TextAlign_Center) rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string, str8_zero(), 1); + UI_TextAlignment(UI_TextAlign_Center) rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string, s(""), 1, 0); ui_labelf("to search for commands and options"); } } @@ -2026,7 +2039,7 @@ rd_view_ui(Rng2F32 rect) { if(expr_string.size == 0) { - expr_string = push_str8f(scratch.arena, "query:config.$%I64x.watches", rd_regs()->view); + expr_string = str8f(scratch.arena, "query:config.$%I64x.watches", rd_regs()->view); } E_Eval eval = e_eval_from_string(expr_string); RD_WatchViewState *ewv = rd_view_state(RD_WatchViewState); @@ -5547,7 +5560,7 @@ rd_window_frame(void) { UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero()); ui_box_equip_display_fstrs(box, &fstrs); - rd_cmd_binding_buttons(cmd_name, str8_zero(), 0); + rd_cmd_binding_buttons(cmd_name, str8_zero(), 4, RD_CmdBindingButtonFlag_NoEdit); } }break; @@ -6505,10 +6518,11 @@ rd_window_frame(void) for(FloatingViewTask *t = first_floating_view_task; t != 0; t = t->next) { // rjf: unpack - CFG_Node *view = t->view; + CFG_Node *view = t->view; Rng2F32 rect = t->rect; B32 is_focused = t->is_focused; B32 is_anchored = t->is_anchored; + B32 is_lister = (cfg_node_child_from_string(view, str8_lit("lister")) != &cfg_nil_node); B32 only_secondary_navigation = t->only_secondary_navigation; F32 open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "floating_view_open_%p", view), 1.f, .rate = is_anchored ? fast_open_rate : slow_open_rate, @@ -6602,18 +6616,51 @@ rd_window_frame(void) } // rjf: build contents + F32 total_height_px = dim_2f32(rect).y; + F32 footer_height_px = 0; + if(is_lister && !is_anchored) + { + footer_height_px = ui_top_font_size()*4.f; + } UI_Parent(container) UI_Focus(is_focused ? UI_FocusKind_Null : UI_FocusKind_Off) { ui_set_next_pref_width(ui_pct(1, 0)); - ui_set_next_pref_height(ui_pct(1, 0)); + ui_set_next_pref_height(ui_px(total_height_px - footer_height_px, 1)); ui_set_next_child_layout_axis(Axis2_Y); - UI_Box *view_contents_container = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clip, "###view_contents_container"); + UI_Box *view_contents_container = ui_build_box_from_stringf(UI_BoxFlag_Clip, "###view_contents_container"); UI_Parent(view_contents_container) UI_WidthFill { rd_view_ui(rect); } } + // rjf: build footer + if(is_lister && !is_anchored) UI_Parent(container) UI_WidthFill UI_HeightFill UI_Focus(UI_FocusKind_Off) + { + ui_set_next_flags(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder); + UI_Column UI_Padding(ui_em(1, 1)) + { + UI_Row UI_Padding(ui_pct(1, 0)) RD_Font(RD_FontSlot_Main) UI_FontSize(ui_top_font_size()*0.8f) UI_TagF("alt") + UI_PrefWidth(ui_text_dim(1, 1)) UI_TextAlignment(UI_TextAlign_Center) + { + rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_MoveUp].string, s(""), 1, RD_CmdBindingButtonFlag_NoEdit); + ui_label(s("/")); + rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_MoveDown].string, s(""), 1, RD_CmdBindingButtonFlag_NoEdit); + ui_label(s("to navigate")); + + ui_spacer(ui_em(1, 1)); + + rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_Accept].string, s(""), 1, RD_CmdBindingButtonFlag_NoEdit); + ui_label(s("to use")); + + ui_spacer(ui_em(1, 1)); + + rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_Cancel].string, s(""), 1, RD_CmdBindingButtonFlag_NoEdit); + ui_label(s("to cancel")); + } + } + } + // rjf: build loading overlay { RD_ViewState *vs = rd_view_state_from_cfg(view); @@ -8708,8 +8755,7 @@ rd_window_frame(void) F32 border_softness = 1.f; B32 do_background_blur = rd_setting_b32_from_name(str8_lit("background_blur")); B32 force_opaque_floating_backgrounds = rd_setting_b32_from_name(str8_lit("opaque_backgrounds")); - B32 do_drop_shadows = - rd_setting_b32_from_name(str8_lit("drop_shadows")); + B32 do_drop_shadows = rd_setting_b32_from_name(str8_lit("drop_shadows")); Vec4F32 base_background_color = ui_color_from_name(str8_lit("background")); Vec4F32 base_border_color = ui_color_from_name(str8_lit("border")); Vec4F32 drop_shadow_color = ui_color_from_name(str8_lit("drop_shadow")); @@ -9080,6 +9126,45 @@ rd_window_frame(void) } } + // rjf: draw scroll fade + if(b->flags & (UI_BoxFlag_DrawFadeTop|UI_BoxFlag_DrawFadeBottom|UI_BoxFlag_DrawFadeLeft|UI_BoxFlag_DrawFadeRight)) + { + Vec2F32 fade_dim = scale_2f32(dim_2f32(b->rect), 0.05f); + Vec4F32 fade_color = drop_shadow_color; + if(b->flags & UI_BoxFlag_DrawFadeTop) + { + F32 t = ui_anim(ui_key_from_string(b->key, s("fade_top")), 1.f, .rate = rd_state->catchall_animation_rate); + Rng2F32 rect = r2f32p(b->rect.x0, b->rect.y0, b->rect.x1, b->rect.y0 + fade_dim.y*t); + R_Rect2DInst *r = dr_rect(rect, fade_color, 0, 0, 0); + MemoryCopyArray(r->corner_radii, b_corner_radii); + r->colors[Corner_01] = r->colors[Corner_11] = v4f32(0, 0, 0, 0); + } + if(b->flags & UI_BoxFlag_DrawFadeBottom) + { + F32 t = ui_anim(ui_key_from_string(b->key, s("fade_bottom")), 1.f, .rate = rd_state->catchall_animation_rate); + Rng2F32 rect = r2f32p(b->rect.x0, b->rect.y1 - fade_dim.y*t, b->rect.x1, b->rect.y1); + R_Rect2DInst *r = dr_rect(rect, fade_color, 0, 0, 0); + MemoryCopyArray(r->corner_radii, b_corner_radii); + r->colors[Corner_00] = r->colors[Corner_10] = v4f32(0, 0, 0, 0); + } + if(b->flags & UI_BoxFlag_DrawFadeLeft) + { + F32 t = ui_anim(ui_key_from_string(b->key, s("fade_left")), 1.f, .rate = rd_state->catchall_animation_rate); + Rng2F32 rect = r2f32p(b->rect.x0, b->rect.y0, b->rect.x1+fade_dim.x*t, b->rect.y1); + R_Rect2DInst *r = dr_rect(rect, fade_color, 0, 0, 0); + MemoryCopyArray(r->corner_radii, b_corner_radii); + r->colors[Corner_11] = r->colors[Corner_10] = v4f32(0, 0, 0, 0); + } + if(b->flags & UI_BoxFlag_DrawFadeRight) + { + F32 t = ui_anim(ui_key_from_string(b->key, s("fade_right")), 1.f, .rate = rd_state->catchall_animation_rate); + Rng2F32 rect = r2f32p(b->rect.x1 - fade_dim.x*t, b->rect.y0, b->rect.x1, b->rect.y1); + R_Rect2DInst *r = dr_rect(rect, fade_color, 0, 0, 0); + MemoryCopyArray(r->corner_radii, b_corner_radii); + r->colors[Corner_00] = r->colors[Corner_01] = v4f32(0, 0, 0, 0); + } + } + // rjf: debug border rendering if(b->flags & UI_BoxFlag_Debug) { diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 0170ddd9..9bd8a16b 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -772,14 +772,16 @@ rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_t //~ rjf: UI Widgets: Fancy Buttons internal void -rd_cmd_binding_buttons(String8 name, String8 filter, B32 add_new) +rd_cmd_binding_buttons(String8 name, String8 filter, U64 limit, RD_CmdBindingButtonFlags flags) { Temp scratch = scratch_begin(0, 0); CFG_KeyMapNodePtrList key_map_nodes = cfg_key_map_node_ptr_list_from_name(scratch.arena, rd_state->key_map, name); //- rjf: build buttons for each binding - UI_CornerRadius(ui_top_font_size()*0.5f) for(CFG_KeyMapNodePtr *n = key_map_nodes.first; n != 0; n = n->next) + U64 key_map_idx = 0; + UI_CornerRadius(ui_top_font_size()*0.5f) for(CFG_KeyMapNodePtr *n = key_map_nodes.first; n != 0; n = n->next, key_map_idx += 1) { + if(key_map_idx >= limit) { break; } ui_spacer(ui_em(1.f, 1.f)); CFG_Binding binding = n->v->binding; B32 rebinding_active_for_this_binding = (rd_state->bind_change_active && @@ -826,7 +828,7 @@ rd_cmd_binding_buttons(String8 name, String8 filter, B32 add_new) ui_set_next_group_key(ui_key_zero()); ui_set_next_pref_width(ui_text_dim(ui_top_font_size()*1.f, 1)); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText| - UI_BoxFlag_Clickable| + (!(flags & RD_CmdBindingButtonFlag_NoEdit) * UI_BoxFlag_Clickable)| UI_BoxFlag_DrawActiveEffects| UI_BoxFlag_DrawHotEffects| UI_BoxFlag_DrawBorder| @@ -888,7 +890,7 @@ rd_cmd_binding_buttons(String8 name, String8 filter, B32 add_new) } //- rjf: build "add new binding" button - if(add_new) + if(flags & RD_CmdBindingButtonFlag_AddNew) { B32 adding_new_binding = (rd_state->bind_change_active && str8_match(rd_state->bind_change_cmd_name, name, 0) && @@ -973,7 +975,7 @@ rd_cmd_spec_button(String8 name) UI_TagF("weak") UI_FastpathCodepoint(0) { - rd_cmd_binding_buttons(name, str8_zero(), 1); + rd_cmd_binding_buttons(name, str8_zero(), max_U64, RD_CmdBindingButtonFlag_AddNew); } } } @@ -3935,7 +3937,7 @@ rd_cell(RD_CellParams *params, String8 string) { UI_PrefWidth(ui_children_sum(1)) UI_Row UI_Padding(ui_em(1.f, 1.f)) { - rd_cmd_binding_buttons(params->bindings_name, params->search_needle, 1); + rd_cmd_binding_buttons(params->bindings_name, params->search_needle, max_U64, RD_CmdBindingButtonFlag_AddNew); } } } diff --git a/src/raddbg/raddbg_widgets.h b/src/raddbg/raddbg_widgets.h index 4a1cd3a0..6811c1f0 100644 --- a/src/raddbg/raddbg_widgets.h +++ b/src/raddbg/raddbg_widgets.h @@ -152,7 +152,13 @@ internal void rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U6 //////////////////////////////// //~ rjf: UI Widgets: Fancy Buttons -internal void rd_cmd_binding_buttons(String8 name, String8 filter, B32 add_new); +typedef U32 RD_CmdBindingButtonFlags; +enum +{ + RD_CmdBindingButtonFlag_AddNew = (1<<0), + RD_CmdBindingButtonFlag_NoEdit = (1<<1), +}; +internal void rd_cmd_binding_buttons(String8 name, String8 filter, U64 limit, RD_CmdBindingButtonFlags flags); internal UI_Signal rd_menu_bar_button(String8 string); internal UI_Signal rd_cmd_spec_button(String8 name); internal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints); diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index eea5eae1..b492075d 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -1526,7 +1526,16 @@ ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S6 UI_Box *scrollable_container_box = &ui_nil_box; UI_Parent(container_box) UI_ChildLayoutAxis(Axis2_Y) UI_FixedWidth(params->dim_px.x-ui_scroll_list_scroll_bar_dim_px) UI_FixedHeight(params->dim_px.y) { - scrollable_container_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_Scroll, "###sp"); + UI_BoxFlags fade_flags = 0; + if(scroll_pt->idx > params->item_range.min) + { + fade_flags |= UI_BoxFlag_DrawFadeTop; + } + if(scroll_pt->idx + num_possible_visible_rows < params->item_range.max) + { + fade_flags |= UI_BoxFlag_DrawFadeBottom; + } + scrollable_container_box = ui_build_box_from_stringf(fade_flags|UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_Scroll, "###sp"); scrollable_container_box->view_off.y = scrollable_container_box->view_off_target.y = params->row_height_px*mod_f32(scroll_pt->off, 1.f) + params->row_height_px*(scroll_pt->off < 0) - params->row_height_px*(scroll_pt->off == -1.f && scroll_pt->idx == 1); } diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index 5bd3e875..445e3741 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -336,20 +336,24 @@ typedef U64 UI_BoxFlags; # define UI_BoxFlag_DrawActiveEffects (UI_BoxFlags)(1ull<<39) # define UI_BoxFlag_DrawOverlay (UI_BoxFlags)(1ull<<40) # define UI_BoxFlag_DrawBucket (UI_BoxFlags)(1ull<<41) -# define UI_BoxFlag_Clip (UI_BoxFlags)(1ull<<42) -# define UI_BoxFlag_AnimatePosX (UI_BoxFlags)(1ull<<43) -# define UI_BoxFlag_AnimatePosY (UI_BoxFlags)(1ull<<44) -# define UI_BoxFlag_DisableTextTrunc (UI_BoxFlags)(1ull<<45) -# define UI_BoxFlag_DisableIDString (UI_BoxFlags)(1ull<<46) -# define UI_BoxFlag_DisableFocusBorder (UI_BoxFlags)(1ull<<47) -# define UI_BoxFlag_DisableFocusOverlay (UI_BoxFlags)(1ull<<48) -# define UI_BoxFlag_HasDisplayString (UI_BoxFlags)(1ull<<49) -# define UI_BoxFlag_HasFuzzyMatchRanges (UI_BoxFlags)(1ull<<50) -# define UI_BoxFlag_RoundChildrenByParent (UI_BoxFlags)(1ull<<51) -# define UI_BoxFlag_SquishAnchored (UI_BoxFlags)(1ull<<52) +# define UI_BoxFlag_DrawFadeTop (UI_BoxFlags)(1ull<<42) +# define UI_BoxFlag_DrawFadeBottom (UI_BoxFlags)(1ull<<43) +# define UI_BoxFlag_DrawFadeLeft (UI_BoxFlags)(1ull<<44) +# define UI_BoxFlag_DrawFadeRight (UI_BoxFlags)(1ull<<45) +# define UI_BoxFlag_Clip (UI_BoxFlags)(1ull<<46) +# define UI_BoxFlag_AnimatePosX (UI_BoxFlags)(1ull<<47) +# define UI_BoxFlag_AnimatePosY (UI_BoxFlags)(1ull<<48) +# define UI_BoxFlag_DisableTextTrunc (UI_BoxFlags)(1ull<<49) +# define UI_BoxFlag_DisableIDString (UI_BoxFlags)(1ull<<50) +# define UI_BoxFlag_DisableFocusBorder (UI_BoxFlags)(1ull<<51) +# define UI_BoxFlag_DisableFocusOverlay (UI_BoxFlags)(1ull<<52) +# define UI_BoxFlag_HasDisplayString (UI_BoxFlags)(1ull<<53) +# define UI_BoxFlag_HasFuzzyMatchRanges (UI_BoxFlags)(1ull<<54) +# define UI_BoxFlag_RoundChildrenByParent (UI_BoxFlags)(1ull<<55) +# define UI_BoxFlag_SquishAnchored (UI_BoxFlags)(1ull<<56) //- rjf: debug -# define UI_BoxFlag_Debug (UI_BoxFlags)(1ull<<53) +# define UI_BoxFlag_Debug (UI_BoxFlags)(1ull<<63) //- rjf: bundles # define UI_BoxFlag_Clickable (UI_BoxFlag_MouseClickable|UI_BoxFlag_KeyboardClickable) From 0df1b345804520c4a39eed59fa21d21b8d893d6f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 10:31:45 -0700 Subject: [PATCH 732/850] fix spacing --- src/raddbg/raddbg_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 7439a507..aad9d6f7 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -6644,6 +6644,7 @@ rd_window_frame(void) UI_PrefWidth(ui_text_dim(1, 1)) UI_TextAlignment(UI_TextAlign_Center) { rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_MoveUp].string, s(""), 1, RD_CmdBindingButtonFlag_NoEdit); + ui_spacer(ui_em(1.f, 1.f)); ui_label(s("/")); rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_MoveDown].string, s(""), 1, RD_CmdBindingButtonFlag_NoEdit); ui_label(s("to navigate")); From 6b88ad1ea32283a01e982c47da4815021dc149b8 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 10:34:01 -0700 Subject: [PATCH 733/850] fix incorrect temp pop --- src/eh_frame/unwind/eh_frame_unwind.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/eh_frame/unwind/eh_frame_unwind.c b/src/eh_frame/unwind/eh_frame_unwind.c index 2f300e71..9354627b 100644 --- a/src/eh_frame/unwind/eh_frame_unwind.c +++ b/src/eh_frame/unwind/eh_frame_unwind.c @@ -641,7 +641,7 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 arch_reg_block_write_range(arch_info, new_regs, reg_rng, reg_value_buffer); } } - temp_end(scratch); + temp_end(temp); }break; case DW_UnwindRuleCode_ValExpr: { @@ -660,7 +660,7 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 U512 reg_val = eval.val.u512; arch_reg_block_write_range(arch_info, new_regs, reg_rng, ®_val); } - temp_end(scratch); + temp_end(temp); }break; case DW_UnwindRuleCode_Architectural: { From 3a04a96e033a5b362b3cb98d4815000fda8a1035 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 12:16:42 -0700 Subject: [PATCH 734/850] eval right-click; start with go-to-memory command --- src/raddbg/generated/raddbg.meta.c | 390 ++++++++++++++-------------- src/raddbg/generated/raddbg.meta.h | 3 +- src/raddbg/raddbg.mdesk | 399 +++++++++++++++-------------- src/raddbg/raddbg_core.c | 134 +++++++++- src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_eval.c | 7 +- src/ui/ui_basic_widgets.c | 2 +- 7 files changed, 530 insertions(+), 406 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 705d571e..615c7b7c 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[365] = +RD_VocabInfo rd_vocab_info_table[366] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -391,6 +391,7 @@ RD_VocabInfo rd_vocab_info_table[365] = {str8_lit_comp("remove_target"), str8_lit_comp(""), str8_lit_comp("Remove Target"), str8_lit_comp(""), RD_IconKind_Trash}, {str8_lit_comp("register_as_jit_debugger"), str8_lit_comp(""), str8_lit_comp("Register As Just-In-Time (JIT) Debugger"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("find_code_location"), str8_lit_comp(""), str8_lit_comp("Find Code Location"), str8_lit_comp(""), RD_IconKind_FileOutline}, +{str8_lit_comp("go_to_memory"), str8_lit_comp(""), str8_lit_comp("Go To Memory"), str8_lit_comp(""), RD_IconKind_Grid}, {str8_lit_comp("search"), str8_lit_comp(""), str8_lit_comp("Search"), str8_lit_comp(""), RD_IconKind_Find}, {str8_lit_comp("search_backwards"), str8_lit_comp(""), str8_lit_comp("Search Backwards"), str8_lit_comp(""), RD_IconKind_Find}, {str8_lit_comp("pick_file"), str8_lit_comp(""), str8_lit_comp("Pick File"), str8_lit_comp(""), RD_IconKind_FileOutline}, @@ -582,7 +583,7 @@ Rng1U64 rd_reg_slot_range_table[50] = {OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[253] = +RD_CmdKindInfo rd_cmd_kind_info_table[254] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -620,198 +621,199 @@ RD_CmdKindInfo rd_cmd_kind_info_table[253] = { str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, { str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, { str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index ef417015..3bcab9e5 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -278,6 +278,7 @@ RD_CmdKind_DisableTarget, RD_CmdKind_RemoveTarget, RD_CmdKind_RegisterAsJITDebugger, RD_CmdKind_FindCodeLocation, +RD_CmdKind_GoToMemory, RD_CmdKind_Search, RD_CmdKind_SearchBackwards, RD_CmdKind_PickFile, @@ -610,7 +611,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[365]; +extern RD_VocabInfo rd_vocab_info_table[366]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[50]; extern Rng1U64 rd_reg_slot_range_table[50]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 2e97516b..9ca85783 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -616,7 +616,7 @@ RD_VocabTable: @display_name("Base Address") @description("An expression which refers to the base address of data which should be viewed as memory.") 'expression': expr_string, @no_callee_helper @display_name("Zoom") @description("The zoom level for displaying bytes in the memory view.") - @default(1.0) 'zoom': @range[0.5, 2] f32, + @default(1.0) 'zoom': @range[0.5, 2] f32, @optional @display_name("Address Range Size") @description("The number of bytes of the viewed memory range.") 'size': expr_string, @no_callee_helper @display_name("Cursor Address") @description("The address of the cursor.") @@ -936,296 +936,299 @@ RD_RegTable: //////////////////////////////// //~ rjf: Command Table -@table(name ui_vis ipc_docs_vis text_pt_vis text_rng_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags ctx_filter) -// / | | | | | \___ __________________________/ | | | | | | -// / | | | | | \ / | | | | | | -RD_CmdTable: // | | | | | | | | | | | | | +@table(name ui_vis ipc_docs_vis text_pt_vis text_rng_vis eval_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags ctx_filter) +// / | | | | | | \___ _________________________________________________________________/ | | | | | | +// / | | | | | | \ / | | | | | | +RD_CmdTable: // | | | | | | | | | | | | | | { //- rjf: exiting - {Exit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } + {Exit 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } //- rjf: palette - {OpenPalette 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } + {OpenPalette 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } //- rjf: command fast-path - {RunCommand 1 1 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } + {RunCommand 1 1 0 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } //- rjf: external drivers - {RunExternalDriverTextCommand 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } - {State 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } - {Eval 0 1 0 0 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } - {LineFromVAddr 0 1 0 0 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } + {RunExternalDriverTextCommand 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } + {State 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } + {Eval 0 1 0 0 0 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } + {LineFromVAddr 0 1 0 0 0 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } //- rjf: os event passthrough - {WMEvent 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } + {WMEvent 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } //- rjf: thread/frame selection - {SelectThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } - {SelectUnwind 0 1 0 0 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } - {UpOneFrame 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } - {DownOneFrame 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } - {SelectEntity 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } - {DeselectEntity 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } + {SelectThread 1 1 0 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } + {SelectUnwind 0 1 0 0 0 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } + {UpOneFrame 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } + {DownOneFrame 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } + {SelectEntity 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } + {DeselectEntity 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } //- rjf: font sizes - {IncWindowFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } - {DecWindowFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } - {IncViewFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } - {DecViewFontSize 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } + {IncWindowFontSize 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } + {DecWindowFontSize 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } + {IncViewFontSize 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } + {DecViewFontSize 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } //- rjf: windows - {OpenWindow 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } - {WindowSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } - {CloseWindow 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } - {ToggleFullscreen 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } - {BringToFront 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } + {OpenWindow 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } + {WindowSettings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } + {CloseWindow 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } + {ToggleFullscreen 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } + {BringToFront 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } //- rjf: popups - {PopupAccept 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } - {PopupCancel 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } + {PopupAccept 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } + {PopupCancel 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } //- rjf: keybindings - {ResetToDefaultBindings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } + {ResetToDefaultBindings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } //- rjf: panel splitting - {ResetToDefaultPanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } - {ResetToCompactPanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } - {ResetToSimplePanels 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } - {NewPanelLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } - {NewPanelUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } - {NewPanelRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } - {NewPanelDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } - {SplitPanel 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } + {ResetToDefaultPanels 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } + {ResetToCompactPanels 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } + {ResetToSimplePanels 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } + {NewPanelLeft 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } + {NewPanelUp 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } + {NewPanelRight 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } + {NewPanelDown 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } + {SplitPanel 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } //- rjf: panel rotation - {RotatePanelColumns 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } + {RotatePanelColumns 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } //- rjf: focused panel changing - {NextPanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } - {PrevPanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } - {FocusPanel 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } - {FocusPanelRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } - {FocusPanelLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } - {FocusPanelUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } - {FocusPanelDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } + {NextPanel 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } + {PrevPanel 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } + {FocusPanel 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } + {FocusPanelRight 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } + {FocusPanelLeft 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } + {FocusPanelUp 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } + {FocusPanelDown 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } //- rjf: undo/redo - {Undo 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } - {Redo 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } + {Undo 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } + {Redo 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } //- rjf: focus history - {GoBack 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } - {GoForward 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } + {GoBack 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } + {GoForward 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } //- rjf: panel removal - {ClosePanel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } + {ClosePanel 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } //- rjf: panel tab - {FocusTab 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } - {NextTab 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } - {PrevTab 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } - {MoveTabRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "$tab," } - {MoveTabLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "$tab," } - {OpenTab 1 1 0 0 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } - {BuildTab 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } - {DuplicateTab 1 1 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "$tab," } - {CopyTabFullPath 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "$tab," } - {CloseTab 1 1 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "$tab," } - {MoveView 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } - {TabBarTop 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "$tab," } - {TabBarBottom 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "$tab," } - {TabSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } + {FocusTab 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } + {NextTab 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } + {PrevTab 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } + {MoveTabRight 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "$tab," } + {MoveTabLeft 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "$tab," } + {OpenTab 1 1 0 0 0 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } + {BuildTab 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } + {DuplicateTab 1 1 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "$tab," } + {CopyTabFullPath 0 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "$tab," } + {CloseTab 1 1 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "$tab," } + {MoveView 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } + {TabBarTop 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "$tab," } + {TabBarBottom 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "$tab," } + {TabSettings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } //- rjf: files - {SetCurrentPath 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } - {Open 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } - {OpenSourceFileFromDebugInfo 1 0 0 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } - {SwitchToPartnerFile 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } - {ShowFileInExplorer 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "$file," } + {SetCurrentPath 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } + {Open 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } + {OpenSourceFileFromDebugInfo 1 0 0 0 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } + {SwitchToPartnerFile 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } + {ShowFileInExplorer 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "$file," } //- rjf: source <-> disasm - {GoToDisassembly 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "$text_pt," } - {GoToSource 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "" } + {GoToDisassembly 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "$text_pt," } + {GoToSource 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "" } //- rjf: override file links - {SetFileReplacementPath 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } + {SetFileReplacementPath 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } //- rjf: setting config paths - {NewUser 1 1 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } - {NewProject 1 1 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } - {OpenUser 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } - {OpenProject 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } - {OpenRecentProject 1 1 0 0 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } - {SaveUser 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } - {SaveProject 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } - {RecordUserAsLastOpened 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } - {RecordProjectInUser 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } + {NewUser 1 1 0 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } + {NewProject 1 1 0 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } + {OpenUser 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } + {OpenProject 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } + {OpenRecentProject 1 1 0 0 0 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } + {SaveUser 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } + {SaveProject 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } + {RecordUserAsLastOpened 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } + {RecordProjectInUser 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } //- rjf: writing config changes - {WriteUserData 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } - {WriteProjectData 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } + {WriteUserData 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } + {WriteProjectData 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } //- rjf: opening user/project settings - {UserSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } - {ProjectSettings 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } + {UserSettings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } + {ProjectSettings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } //- rjf: meta controls - {Edit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } - {Accept 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } - {Cancel 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } - {FocusMenu 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } + {Edit 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } + {Accept 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } + {Cancel 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } + {FocusMenu 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } //- rjf: directional movement & text controls - {MoveLeft 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } - {MoveRight 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } - {MoveUp 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } - {MoveDown 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } - {MoveLeftSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } - {MoveRightSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } - {MoveUpSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } - {MoveDownSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } - {MoveLeftChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPage 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } - {MoveDownPage 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } - {MoveUpWhole 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } - {MoveDownWhole 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } - {MoveLeftChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunkSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPageSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } - {MoveDownPageSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } - {MoveUpWholeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } - {MoveDownWholeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } - {MoveUpReorder 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } - {MoveDownReorder 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } - {MoveHome 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } - {MoveEnd 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } - {MoveHomeSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } - {MoveEndSelect 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } - {SelectAll 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } - {DeleteSingle 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } - {DeleteChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } - {BackspaceSingle 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } - {BackspaceChunk 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } - {Copy 1 1 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "$text_rng," } - {Cut 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } - {Paste 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } - {InsertText 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } + {MoveLeft 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } + {MoveRight 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } + {MoveUp 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } + {MoveDown 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } + {MoveLeftSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } + {MoveRightSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } + {MoveUpSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } + {MoveDownSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } + {MoveLeftChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPage 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } + {MoveDownPage 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } + {MoveUpWhole 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } + {MoveDownWhole 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } + {MoveLeftChunkSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunkSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunkSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunkSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPageSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } + {MoveDownPageSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } + {MoveUpWholeSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } + {MoveDownWholeSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } + {MoveUpReorder 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } + {MoveDownReorder 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } + {MoveHome 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } + {MoveEnd 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } + {MoveHomeSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } + {MoveEndSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } + {SelectAll 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } + {DeleteSingle 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } + {DeleteChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } + {BackspaceSingle 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } + {BackspaceChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } + {Copy 1 1 0 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "$text_rng," } + {Cut 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } + {Paste 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } + {InsertText 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } //- rjf: directionless navigation - {MoveNext 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } - {MovePrev 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } + {MoveNext 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } + {MovePrev 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } //- rjf: code navigation - {GoToLine 1 1 0 0 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } - {GoToAddress 1 1 0 0 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } - {CenterCursor 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } - {ContainCursor 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } - {FindNext 1 1 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } - {FindPrev 1 1 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } + {GoToLine 1 1 0 0 0 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } + {GoToAddress 1 1 0 0 0 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } + {CenterCursor 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } + {ContainCursor 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } + {FindNext 1 1 0 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } + {FindPrev 1 1 0 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } //- rjf: thread finding - {FindThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } - {FindSelectedThread 1 1 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "" } + {FindThread 1 1 0 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } + {FindSelectedThread 1 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "" } //- rjf: name finding - {GoToName 1 1 0 0 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "$text_pt," } - {GoToNameAtCursor 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } + {GoToName 1 1 0 0 0 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "$text_pt," } + {GoToNameAtCursor 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } //- rjf: watch expressions - {ToggleWatchExpression 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "$text_pt," } - {ToggleWatchExpressionAtCursor 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "" } - {ToggleWatchExpressionAtMouse 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } + {ToggleWatchExpression 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "$text_pt," } + {ToggleWatchExpressionAtCursor 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "" } + {ToggleWatchExpressionAtMouse 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } //- rjf: general config operations - {EnableCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } - {DisableCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } - {SelectCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } - {DeselectCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } - {RemoveCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } - {NameCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } - {ConditionCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } - {DuplicateCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } - {RelocateCfg 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } - {SaveToProject 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } + {EnableCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } + {DisableCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } + {SelectCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } + {DeselectCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } + {RemoveCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } + {NameCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } + {ConditionCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } + {DuplicateCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } + {RelocateCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } + {SaveToProject 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } //- rjf: breakpoints - {AddBreakpoint 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } - {AddAddressBreakpoint 1 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "$breakpoints," } - {AddFunctionBreakpoint 1 0 0 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "$breakpoints," } - {ToggleBreakpoint 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "$text_pt," } - {RemoveBreakpoint 1 0 0 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "$breakpoints," } - {EnableBreakpoint 1 1 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } - {DisableBreakpoint 1 1 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } - {ClearBreakpoints 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } + {AddBreakpoint 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } + {AddAddressBreakpoint 1 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "$breakpoints," } + {AddFunctionBreakpoint 1 0 0 0 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "$breakpoints," } + {ToggleBreakpoint 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "$text_pt," } + {RemoveBreakpoint 1 0 0 0 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "$breakpoints," } + {EnableBreakpoint 1 1 0 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } + {DisableBreakpoint 1 1 0 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } + {ClearBreakpoints 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } //- rjf: output - {ClearOutput 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } + {ClearOutput 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } //- rjf: watch pins - {AddWatchPin 1 1 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "$watch_pins," } - {ToggleWatchPin 1 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } + {AddWatchPin 1 1 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "$watch_pins," } + {ToggleWatchPin 1 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } //- rjf: debug infos - {LoadDebugInfo 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "$debug_infos," } - {UnloadDebugInfo 1 1 0 0 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "$debug_infos," } + {LoadDebugInfo 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "$debug_infos," } + {UnloadDebugInfo 1 1 0 0 0 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "$debug_infos," } //- rjf: type views - {AddTypeView 0 0 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } + {AddTypeView 0 0 0 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } //- rjf: file path maps - {AddFilePathMap 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } + {AddFilePathMap 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } //- rjf: themes - {EditUserTheme 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } - {EditProjectTheme 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } - {AddThemeColor 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } - {ForkTheme 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } - {SaveTheme 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } - {SaveAndSetTheme 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } + {EditUserTheme 0 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } + {EditProjectTheme 0 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } + {AddThemeColor 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } + {ForkTheme 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } + {SaveTheme 0 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } + {SaveAndSetTheme 0 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } //- rjf: line operations - {SetNextStatement 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "$text_pt," } + {SetNextStatement 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "$text_pt," } //- rjf: targets - {AddTarget 1 1 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "$targets," } - {SelectTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } - {EnableTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } - {DisableTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } - {RemoveTarget 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } + {AddTarget 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "$targets," } + {SelectTarget 1 1 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } + {EnableTarget 1 1 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } + {DisableTarget 1 1 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } + {RemoveTarget 1 1 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } //- rjf: attaching - {RegisterAsJITDebugger 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } + {RegisterAsJITDebugger 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } //- rjf: snap-to-code-location - {FindCodeLocation 0 1 0 0 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } + {FindCodeLocation 0 1 0 0 0 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } + + //- rjf: snap-to-memory-location + {GoToMemory 1 1 0 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "" } //- rjf: searching - {Search 1 1 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } - {SearchBackwards 1 1 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } + {Search 1 1 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } + {SearchBackwards 1 1 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } //- rjf: queries - {PickFile 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } - {PickFolder 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } - {PickFileOrFolder 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } + {PickFile 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } + {PickFolder 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } + {PickFileOrFolder 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } //- rjf: query stack - {PushQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } - {CompleteQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } - {CancelQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } - {UpdateQuery 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } + {PushQuery 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } + {CompleteQuery 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } + {CancelQuery 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } + {UpdateQuery 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } //- rjf: event buffers - {OpenEventBuffer 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } - {CloseEventBuffer 0 1 0 0 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } + {OpenEventBuffer 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } + {CloseEventBuffer 0 1 0 0 0 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } //- rjf: developer commands - {ToggleDevMenu 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } - {LogMarker 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } + {ToggleDevMenu 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } + {LogMarker 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } } @enum RD_CmdKind: @@ -1265,7 +1268,7 @@ RD_CmdTable: // | | | | @expand(D_CmdTable, a) ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis))|(RD_CmdKindFlag_ListInEval*$(a.eval_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_WatchTabFastPathTable, a) ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}```; @expand(RD_ViewTabFastPathTable, a) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index aad9d6f7..812ae256 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -3173,6 +3173,7 @@ rd_view_ui(Rng2F32 rect) ////////////////////////////// //- rjf: build ui // + E_Eval selected_eval = {0}; B32 pressed = 0; ProfScope("build ui") { @@ -3702,6 +3703,14 @@ rd_view_ui(Rng2F32 rect) B32 cell_toggled = (cell_value_eval.value.u64 != 0); B32 next_cell_toggled = cell_toggled; + //////////////////////// + //- rjf: get selected eval from selected cell + // + if(cell_selected) + { + selected_eval = cell->eval; + } + //////////////////////// //- rjf: determine if cell evaluation's data is fresh and/or bad // @@ -4282,6 +4291,20 @@ rd_view_ui(Rng2F32 rect) pressed = 1; } + // rjf: right-click -> move selection here, open query + if(ui_right_clicked(sig)) + { + selected_eval = cell->eval; + ewv->next_cursor = ewv->next_mark = cell_pt; + pressed = 1; + rd_cmd(RD_CmdKind_PushQuery, + .expr = s("query:eval_commands"), + .do_implicit_root = 1, + .do_lister = 1, + .activate_with_single_click = 1, + .ui_key = cell_box->key); + } + // rjf: reversion if(revert_cell && cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg) { @@ -4580,6 +4603,14 @@ rd_view_ui(Rng2F32 rect) } } + //////////////////////// + //- rjf: fill registers + // + if(cfg_node_child_from_string(view, str8_lit("lister")) == &cfg_nil_node) + { + rd_regs()->expr = e_full_expr_string_from_key(rd_frame_arena(), selected_eval.key); + } + ////////////////////////////// //- rjf: general table-wide press logic // @@ -4791,10 +4822,7 @@ rd_view_setting_addr_from_name(String8 name) E_Eval eval = e_eval_from_string(string); E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind type_kind = e_type_kind_from_key(type_key); - if(eval.irtree.mode == E_Mode_Offset && - (type_kind == E_TypeKind_Struct || - type_kind == E_TypeKind_Union || - type_kind == E_TypeKind_Class)) + if(eval.irtree.mode == E_Mode_Offset && !e_type_kind_is_pointer_or_ref(type_kind)) { result = eval.value.u64; } @@ -5833,6 +5861,7 @@ rd_window_frame(void) Handle(thread); #undef Handle ui_labelf("file_path: \"%S\"", regs->file_path); + ui_labelf("expr: \"%S\"", regs->expr); ui_labelf("cursor: (L:%I64d, C:%I64d)", regs->cursor.line, regs->cursor.column); ui_labelf("mark: (L:%I64d, C:%I64d)", regs->mark.line, regs->mark.column); ui_labelf("unwind_count: %I64u", regs->unwind_count); @@ -8219,7 +8248,7 @@ rd_window_frame(void) //- rjf: pop interaction registers; commit if this is the selected view RD_Regs *view_regs = rd_pop_regs(); - if(panel_is_focused) + if(panel_tree.focused == panel) { MemoryCopyStruct(rd_regs(), view_regs); } @@ -11748,10 +11777,11 @@ rd_frame(void) { String8 names[] = { - str8_lit("commands"), - str8_lit("tab_commands"), - str8_lit("text_pt_commands"), - str8_lit("text_range_commands"), + s("commands"), + s("tab_commands"), + s("text_pt_commands"), + s("text_range_commands"), + s("eval_commands"), }; for EachElement(idx, names) { @@ -15506,6 +15536,92 @@ rd_frame(void) } }break; + //- rjf: snap-to-memory-location + case RD_CmdKind_GoToMemory: + { + // rjf: unpack expr + String8 expr = rd_regs()->expr; + E_Eval eval = e_eval_from_string(expr); + String8 memory_view_expr = {0}; // TODO(rjf): qualify by process when possible + String8 memory_view_cursor_expr = expr; + + // rjf: find existing memory view + CFG_Node *memory_view = &cfg_nil_node; + for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) + { + CFG_Node *window = cfg_node_from_id(ws->cfg_id); + CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window); + for(CFG_PanelNode *panel = panel_tree.root; + panel != &cfg_nil_panel_node; + panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) + { + if(panel->first != &cfg_nil_panel_node) { continue; } + for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next) + { + CFG_Node *tab = tab_n->v; + if(str8_match(tab->string, s("memory"), 0)) + { + memory_view = tab; + } + } + } + if(memory_view != &cfg_nil_node && window->id == rd_regs()->window) + { + break; + } + } + + // rjf: create memory view if it didn't exist + if(memory_view == &cfg_nil_node) + { + // rjf: find biggest panel in active window + CFG_Node *window = cfg_node_from_id(rd_regs()->window); + CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window); + CFG_PanelNode *biggest_panel = &cfg_nil_panel_node; + { + Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000)); + F32 best_panel_area = 0; + for(CFG_PanelNode *panel = panel_tree.root; + panel != &cfg_nil_panel_node; + panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) + { + if(panel->first != &cfg_nil_panel_node) + { + continue; + } + Rng2F32 panel_rect = cfg_target_rect_from_panel_node(root_rect, panel_tree.root, panel); + Vec2F32 panel_rect_dim = dim_2f32(panel_rect); + F32 panel_area = panel_rect_dim.x*panel_rect_dim.y; + if((best_panel_area == 0 || panel_area > best_panel_area)) + { + best_panel_area = panel_area; + biggest_panel = panel; + } + } + } + + // rjf: open new tab on that panel + if(biggest_panel != &cfg_nil_panel_node) + { + memory_view = cfg_node_new(rd_state->cfg, biggest_panel->cfg, s("memory")); + } + } + + // rjf: parameterize memory view, select memory view, snap to cursor + if(memory_view != &cfg_nil_node) + { + CFG_Node *expr_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, memory_view, s("expression")); + cfg_node_new_replace(rd_state->cfg, expr_root, memory_view_expr); + CFG_Node *cursor_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, memory_view, s("cursor")); + cfg_node_new_replace(rd_state->cfg, cursor_root, memory_view_cursor_expr); + CFG_Node *mark_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, memory_view, s("mark")); + cfg_node_new_replace(rd_state->cfg, mark_root, memory_view_cursor_expr); + rd_cmd(RD_CmdKind_FocusPanel, .panel = memory_view->parent->id); + rd_cmd(RD_CmdKind_FocusTab, .tab = memory_view->id); + rd_cmd(RD_CmdKind_CenterCursor, .view = memory_view->id); + } + }break; + //- rjf: queries case RD_CmdKind_PushQuery: { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 028170eb..99e713fd 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -91,6 +91,7 @@ enum RD_CmdKindFlag_ListInTab = (1<<2), RD_CmdKindFlag_ListInTextPt = (1<<3), RD_CmdKindFlag_ListInTextRng = (1<<4), + RD_CmdKindFlag_ListInEval = (1<<5), }; //////////////////////////////// diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 94dca6ff..e897e263 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -31,9 +31,10 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands) { RD_CmdKindInfo *info = &rd_cmd_kind_info_table[k]; if(info->flags & RD_CmdKindFlag_ListInUI && - (!str8_match(type->name, str8_lit("text_pt_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTextPt) && - (!str8_match(type->name, str8_lit("text_range_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTextRng) && - (!str8_match(type->name, str8_lit("tab_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTab)) + (!str8_match(type->name, s("text_pt_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTextPt) && + (!str8_match(type->name, s("text_range_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTextRng) && + (!str8_match(type->name, s("tab_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTab) && + (!str8_match(type->name, s("eval_commands"), 0) || info->flags & RD_CmdKindFlag_ListInEval)) { String8 code_name = info->string; String8 description = info->description; diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index b492075d..8864f285 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -1397,8 +1397,8 @@ internal void ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out) { //- rjf: unpack arguments - Rng1S64 scroll_row_idx_range = r1s64(params->item_range.min, ClampBot(params->item_range.min, params->item_range.max-1)); S64 num_possible_visible_rows = (S64)(params->dim_px.y/params->row_height_px); + Rng1S64 scroll_row_idx_range = r1s64(params->item_range.min, ClampBot(params->item_range.min, params->item_range.max-1)); //- rjf: do keyboard navigation B32 moved = 0; From d7b59e4a39d274e58e084bd26dcdc68ab04184d2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 12:37:28 -0700 Subject: [PATCH 735/850] break when value changes --- src/dbg_engine/dbg_engine_ctrl.c | 11 ++++++++--- src/raddbg/generated/raddbg.meta.c | 8 +++++--- src/raddbg/generated/raddbg.meta.h | 3 ++- src/raddbg/raddbg.mdesk | 5 ++++- src/raddbg/raddbg_core.c | 31 ++++++++++++++++++++++++++++-- src/raddbg/raddbg_eval.c | 11 ++++++----- src/raddbg/raddbg_widgets.c | 14 +++++++++++--- 7 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 918390fc..7b2ff413 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -2533,10 +2533,15 @@ d_ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, D_EvalScope *e else if(bp->vaddr_expr.size != 0) { String8 expr = bp->vaddr_expr; - E_Value value = e_value_from_string(expr); - if(value.u64 != 0 || bp->flags != 0) + E_Eval eval = e_eval_from_string(expr); + U64 vaddr = eval.value.u64; + if(eval.irtree.mode == E_Mode_Value) { - DMN_Trap trap = {process_dmn, value.u64, (U64)bp}; + vaddr = e_value_eval_from_eval(eval).value.u64; + } + if(vaddr != 0 || bp->flags != 0) + { + DMN_Trap trap = {process_dmn, vaddr, (U64)bp}; trap.flags = d_dmn_trap_flags_from_breakpoint_flags(bp->flags); trap.size = bp->size; dmn_trap_chunk_list_push(arena, traps_out, 256, &trap); diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 615c7b7c..d0e2a890 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[366] = +RD_VocabInfo rd_vocab_info_table[367] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -392,6 +392,7 @@ RD_VocabInfo rd_vocab_info_table[366] = {str8_lit_comp("register_as_jit_debugger"), str8_lit_comp(""), str8_lit_comp("Register As Just-In-Time (JIT) Debugger"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("find_code_location"), str8_lit_comp(""), str8_lit_comp("Find Code Location"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("go_to_memory"), str8_lit_comp(""), str8_lit_comp("Go To Memory"), str8_lit_comp(""), RD_IconKind_Grid}, +{str8_lit_comp("break_when_value_changes"), str8_lit_comp(""), str8_lit_comp("Break When Value Changes"), str8_lit_comp(""), RD_IconKind_CircleFilled}, {str8_lit_comp("search"), str8_lit_comp(""), str8_lit_comp("Search"), str8_lit_comp(""), RD_IconKind_Find}, {str8_lit_comp("search_backwards"), str8_lit_comp(""), str8_lit_comp("Search Backwards"), str8_lit_comp(""), RD_IconKind_Find}, {str8_lit_comp("pick_file"), str8_lit_comp(""), str8_lit_comp("Pick File"), str8_lit_comp(""), RD_IconKind_FileOutline}, @@ -583,7 +584,7 @@ Rng1U64 rd_reg_slot_range_table[50] = {OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[254] = +RD_CmdKindInfo rd_cmd_kind_info_table[255] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -800,7 +801,8 @@ RD_CmdKindInfo rd_cmd_kind_info_table[254] = { str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 3bcab9e5..2a0a5007 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -279,6 +279,7 @@ RD_CmdKind_RemoveTarget, RD_CmdKind_RegisterAsJITDebugger, RD_CmdKind_FindCodeLocation, RD_CmdKind_GoToMemory, +RD_CmdKind_BreakWhenValueChanges, RD_CmdKind_Search, RD_CmdKind_SearchBackwards, RD_CmdKind_PickFile, @@ -611,7 +612,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[366]; +extern RD_VocabInfo rd_vocab_info_table[367]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[50]; extern Rng1U64 rd_reg_slot_range_table[50]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 9ca85783..1bb8530c 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1205,7 +1205,10 @@ RD_CmdTable: // | | | | {FindCodeLocation 0 1 0 0 0 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } //- rjf: snap-to-memory-location - {GoToMemory 1 1 0 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "" } + {GoToMemory 0 1 0 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "" } + + //- rjf: break-when-value-changes + {BreakWhenValueChanges 0 1 0 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "" } //- rjf: searching {Search 1 1 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 812ae256..55fadecf 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4129,8 +4129,13 @@ rd_view_ui(Rng2F32 rect) // rjf: apply bindings if(cell->px == 0 && cell->eval.space.kind == RD_EvalSpaceKind_MetaCmd) { - cell_params.flags |= RD_CellFlag_Bindings; - cell_params.bindings_name = rd_cmd_name_from_eval(cell->eval); + String8 cmd_name = rd_cmd_name_from_eval(cell->eval); + RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(cmd_name); + if(info->flags & RD_CmdKindFlag_ListInUI) + { + cell_params.flags |= RD_CellFlag_Bindings; + cell_params.bindings_name = cmd_name; + } } // rjf: apply background override @@ -15622,6 +15627,28 @@ rd_frame(void) } }break; + //- rjf: break-when-value-changes + case RD_CmdKind_BreakWhenValueChanges: + { + E_Eval eval = e_eval_from_string(rd_regs()->expr); + U64 size = e_type_byte_size_from_key(eval.irtree.type_key); + U64 bp_range_size = 1; + if(size > bp_range_size) {bp_range_size = 2;} + if(size > bp_range_size) {bp_range_size = 4;} + if(size > bp_range_size) {bp_range_size = 8;} + CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), s("user")); + CFG_Node *bp = cfg_node_new(rd_state->cfg, user, s("breakpoint")); + CFG_Node *project = cfg_node_new(rd_state->cfg, bp, s("project")); + cfg_node_new(rd_state->cfg, project, rd_state->project_path); + CFG_Node *addr_loc = cfg_node_new(rd_state->cfg, bp, s("address_location")); + cfg_node_new(rd_state->cfg, addr_loc, rd_regs()->expr); + CFG_Node *rng = cfg_node_new(rd_state->cfg, bp, s("address_range_size")); + cfg_node_newf(rd_state->cfg, rng, "%I64u", bp_range_size); + CFG_Node *brk = cfg_node_new(rd_state->cfg, bp, s("break_on_write")); + cfg_node_new(rd_state->cfg, brk, s("1")); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, "$%I64x", bp->id); + }break; + //- rjf: queries case RD_CmdKind_PushQuery: { diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index e897e263..a1355099 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -30,11 +30,12 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands) for EachNonZeroEnumVal(RD_CmdKind, k) { RD_CmdKindInfo *info = &rd_cmd_kind_info_table[k]; - if(info->flags & RD_CmdKindFlag_ListInUI && - (!str8_match(type->name, s("text_pt_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTextPt) && - (!str8_match(type->name, s("text_range_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTextRng) && - (!str8_match(type->name, s("tab_commands"), 0) || info->flags & RD_CmdKindFlag_ListInTab) && - (!str8_match(type->name, s("eval_commands"), 0) || info->flags & RD_CmdKindFlag_ListInEval)) + B32 show = ((str8_match(type->name, s("commands"), 0) && info->flags & RD_CmdKindFlag_ListInUI) || + (str8_match(type->name, s("text_pt_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTextPt) || + (str8_match(type->name, s("text_range_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTextRng) || + (str8_match(type->name, s("tab_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTab) || + (str8_match(type->name, s("eval_commands"), 0) && info->flags & RD_CmdKindFlag_ListInEval)); + if(show) { String8 code_name = info->string; String8 description = info->description; diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 9bd8a16b..3fceac67 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1430,7 +1430,6 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num += 1, line_idx += 1) { D_EntityList line_ips = params->line_ips[line_idx]; - ui_set_next_hover_cursor(WM_Cursor_HandPoint); UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); UI_Parent(line_margin_box) { @@ -1585,9 +1584,9 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe D_EntityList line_ips = params->line_ips[line_idx]; CFG_NodePtrList line_bps = params->line_bps[line_idx]; CFG_NodePtrList line_pins = params->line_pins[line_idx]; - ui_set_next_hover_cursor(WM_Cursor_HandPoint); ui_set_next_background_color(v4f32(0, 0, 0, 0)); - UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); + ui_set_next_text_alignment(UI_TextAlign_Center); + UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawText|UI_BoxFlag_DrawActiveEffects, "###line_margin_%I64x", line_num); UI_Parent(line_margin_box) { //- rjf: build margin thread ip ui @@ -1856,6 +1855,15 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: empty margin interaction UI_Signal line_margin_sig = ui_signal_from_box(line_margin_box); + if(ui_hovering(line_margin_sig)) + { + DR_FStrList fstrs = {0}; + Vec4F32 color = ui_color_from_name(s("breakpoint")); + color.w *= 0.2f; + DR_FStrParams p = {rd_font_from_slot(RD_FontSlot_Icons), rd_raster_flags_from_slot(RD_FontSlot_Icons), color, ui_top_font_size()}; + dr_fstrs_push_new(scratch.arena, &fstrs, &p, rd_icon_kind_text_table[RD_IconKind_CircleFilled]); + ui_box_equip_display_fstrs(line_margin_box, &fstrs); + } if(ui_clicked(line_margin_sig)) { rd_cmd(RD_CmdKind_AddBreakpoint, From 015ae9c62c9e1ba602ac191e66fd40b4c0b3e948 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 12:49:39 -0700 Subject: [PATCH 736/850] set up for memory right clicks --- src/raddbg/generated/raddbg.meta.c | 388 ++++++++++++++-------------- src/raddbg/raddbg.mdesk | 398 ++++++++++++++--------------- src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_eval.c | 3 +- src/raddbg/raddbg_views.c | 19 +- 5 files changed, 414 insertions(+), 395 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index d0e2a890..f532d8cf 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -622,200 +622,200 @@ RD_CmdKindInfo rd_cmd_kind_info_table[255] = { str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, { str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, { str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 1bb8530c..3f971732 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -936,302 +936,302 @@ RD_RegTable: //////////////////////////////// //~ rjf: Command Table -@table(name ui_vis ipc_docs_vis text_pt_vis text_rng_vis eval_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags ctx_filter) -// / | | | | | | \___ _________________________________________________________________/ | | | | | | -// / | | | | | | \ / | | | | | | -RD_CmdTable: // | | | | | | | | | | | | | | +@table(name ui_vis ipc_docs_vis text_pt_vis text_rng_vis eval_vis memory_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags ctx_filter) +// / | | | | | | | \___ _________________________________________________________________/ | | | | | | +// / | | | | | | | \ / | | | | | | +RD_CmdTable: // | | | | | | | | | | | | | | | { //- rjf: exiting - {Exit 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } + {Exit 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } //- rjf: palette - {OpenPalette 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } + {OpenPalette 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } //- rjf: command fast-path - {RunCommand 1 1 0 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } + {RunCommand 1 1 0 0 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } //- rjf: external drivers - {RunExternalDriverTextCommand 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } - {State 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } - {Eval 0 1 0 0 0 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } - {LineFromVAddr 0 1 0 0 0 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } + {RunExternalDriverTextCommand 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } + {State 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } + {Eval 0 1 0 0 0 0 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } + {LineFromVAddr 0 1 0 0 0 0 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } //- rjf: os event passthrough - {WMEvent 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } + {WMEvent 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } //- rjf: thread/frame selection - {SelectThread 1 1 0 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } - {SelectUnwind 0 1 0 0 0 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } - {UpOneFrame 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } - {DownOneFrame 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } - {SelectEntity 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } - {DeselectEntity 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } + {SelectThread 1 1 0 0 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } + {SelectUnwind 0 1 0 0 0 0 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } + {UpOneFrame 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } + {DownOneFrame 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } + {SelectEntity 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } + {DeselectEntity 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } //- rjf: font sizes - {IncWindowFontSize 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } - {DecWindowFontSize 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } - {IncViewFontSize 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } - {DecViewFontSize 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } + {IncWindowFontSize 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } + {DecWindowFontSize 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } + {IncViewFontSize 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } + {DecViewFontSize 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } //- rjf: windows - {OpenWindow 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } - {WindowSettings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } - {CloseWindow 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } - {ToggleFullscreen 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } - {BringToFront 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } + {OpenWindow 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } + {WindowSettings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } + {CloseWindow 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } + {ToggleFullscreen 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } + {BringToFront 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } //- rjf: popups - {PopupAccept 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } - {PopupCancel 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } + {PopupAccept 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } + {PopupCancel 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } //- rjf: keybindings - {ResetToDefaultBindings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } + {ResetToDefaultBindings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } //- rjf: panel splitting - {ResetToDefaultPanels 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } - {ResetToCompactPanels 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } - {ResetToSimplePanels 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } - {NewPanelLeft 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } - {NewPanelUp 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } - {NewPanelRight 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } - {NewPanelDown 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } - {SplitPanel 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } + {ResetToDefaultPanels 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } + {ResetToCompactPanels 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } + {ResetToSimplePanels 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } + {NewPanelLeft 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } + {NewPanelUp 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } + {NewPanelRight 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } + {NewPanelDown 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } + {SplitPanel 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } //- rjf: panel rotation - {RotatePanelColumns 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } + {RotatePanelColumns 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } //- rjf: focused panel changing - {NextPanel 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } - {PrevPanel 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } - {FocusPanel 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } - {FocusPanelRight 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } - {FocusPanelLeft 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } - {FocusPanelUp 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } - {FocusPanelDown 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } + {NextPanel 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } + {PrevPanel 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } + {FocusPanel 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } + {FocusPanelRight 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } + {FocusPanelLeft 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } + {FocusPanelUp 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } + {FocusPanelDown 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } //- rjf: undo/redo - {Undo 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } - {Redo 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } + {Undo 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } + {Redo 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } //- rjf: focus history - {GoBack 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } - {GoForward 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } + {GoBack 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } + {GoForward 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } //- rjf: panel removal - {ClosePanel 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } + {ClosePanel 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } //- rjf: panel tab - {FocusTab 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } - {NextTab 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } - {PrevTab 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } - {MoveTabRight 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "$tab," } - {MoveTabLeft 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "$tab," } - {OpenTab 1 1 0 0 0 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } - {BuildTab 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } - {DuplicateTab 1 1 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "$tab," } - {CopyTabFullPath 0 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "$tab," } - {CloseTab 1 1 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "$tab," } - {MoveView 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } - {TabBarTop 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "$tab," } - {TabBarBottom 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "$tab," } - {TabSettings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } + {FocusTab 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } + {NextTab 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } + {PrevTab 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } + {MoveTabRight 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "$tab," } + {MoveTabLeft 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "$tab," } + {OpenTab 1 1 0 0 0 0 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } + {BuildTab 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } + {DuplicateTab 1 1 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "$tab," } + {CopyTabFullPath 0 0 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "$tab," } + {CloseTab 1 1 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "$tab," } + {MoveView 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } + {TabBarTop 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "$tab," } + {TabBarBottom 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "$tab," } + {TabSettings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } //- rjf: files - {SetCurrentPath 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } - {Open 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } - {OpenSourceFileFromDebugInfo 1 0 0 0 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } - {SwitchToPartnerFile 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } - {ShowFileInExplorer 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "$file," } + {SetCurrentPath 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } + {Open 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } + {OpenSourceFileFromDebugInfo 1 0 0 0 0 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } + {SwitchToPartnerFile 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } + {ShowFileInExplorer 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "$file," } //- rjf: source <-> disasm - {GoToDisassembly 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "$text_pt," } - {GoToSource 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "" } + {GoToDisassembly 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "$text_pt," } + {GoToSource 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "" } //- rjf: override file links - {SetFileReplacementPath 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } + {SetFileReplacementPath 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } //- rjf: setting config paths - {NewUser 1 1 0 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } - {NewProject 1 1 0 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } - {OpenUser 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } - {OpenProject 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } - {OpenRecentProject 1 1 0 0 0 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } - {SaveUser 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } - {SaveProject 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } - {RecordUserAsLastOpened 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } - {RecordProjectInUser 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } + {NewUser 1 1 0 0 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } + {NewProject 1 1 0 0 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } + {OpenUser 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } + {OpenProject 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } + {OpenRecentProject 1 1 0 0 0 0 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } + {SaveUser 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } + {SaveProject 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } + {RecordUserAsLastOpened 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } + {RecordProjectInUser 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } //- rjf: writing config changes - {WriteUserData 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } - {WriteProjectData 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } + {WriteUserData 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } + {WriteProjectData 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } //- rjf: opening user/project settings - {UserSettings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } - {ProjectSettings 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } + {UserSettings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } + {ProjectSettings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } //- rjf: meta controls - {Edit 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } - {Accept 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } - {Cancel 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } - {FocusMenu 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } + {Edit 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } + {Accept 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } + {Cancel 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } + {FocusMenu 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } //- rjf: directional movement & text controls - {MoveLeft 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } - {MoveRight 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } - {MoveUp 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } - {MoveDown 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } - {MoveLeftSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } - {MoveRightSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } - {MoveUpSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } - {MoveDownSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } - {MoveLeftChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPage 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } - {MoveDownPage 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } - {MoveUpWhole 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } - {MoveDownWhole 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } - {MoveLeftChunkSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunkSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunkSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunkSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPageSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } - {MoveDownPageSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } - {MoveUpWholeSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } - {MoveDownWholeSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } - {MoveUpReorder 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } - {MoveDownReorder 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } - {MoveHome 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } - {MoveEnd 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } - {MoveHomeSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } - {MoveEndSelect 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } - {SelectAll 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } - {DeleteSingle 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } - {DeleteChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } - {BackspaceSingle 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } - {BackspaceChunk 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } - {Copy 1 1 0 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "$text_rng," } - {Cut 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } - {Paste 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } - {InsertText 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } + {MoveLeft 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } + {MoveRight 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } + {MoveUp 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } + {MoveDown 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } + {MoveLeftSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } + {MoveRightSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } + {MoveUpSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } + {MoveDownSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } + {MoveLeftChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPage 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } + {MoveDownPage 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } + {MoveUpWhole 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } + {MoveDownWhole 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } + {MoveLeftChunkSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunkSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunkSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunkSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPageSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } + {MoveDownPageSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } + {MoveUpWholeSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } + {MoveDownWholeSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } + {MoveUpReorder 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } + {MoveDownReorder 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } + {MoveHome 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } + {MoveEnd 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } + {MoveHomeSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } + {MoveEndSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } + {SelectAll 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } + {DeleteSingle 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } + {DeleteChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } + {BackspaceSingle 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } + {BackspaceChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } + {Copy 1 1 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "$text_rng," } + {Cut 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } + {Paste 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } + {InsertText 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } //- rjf: directionless navigation - {MoveNext 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } - {MovePrev 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } + {MoveNext 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } + {MovePrev 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } //- rjf: code navigation - {GoToLine 1 1 0 0 0 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } - {GoToAddress 1 1 0 0 0 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } - {CenterCursor 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } - {ContainCursor 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } - {FindNext 1 1 0 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } - {FindPrev 1 1 0 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } + {GoToLine 1 1 0 0 0 0 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } + {GoToAddress 1 1 0 0 0 0 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } + {CenterCursor 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } + {ContainCursor 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } + {FindNext 1 1 0 0 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } + {FindPrev 1 1 0 0 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } //- rjf: thread finding - {FindThread 1 1 0 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } - {FindSelectedThread 1 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "" } + {FindThread 1 1 0 0 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } + {FindSelectedThread 1 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "" } //- rjf: name finding - {GoToName 1 1 0 0 0 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "$text_pt," } - {GoToNameAtCursor 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } + {GoToName 1 1 0 0 0 0 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "$text_pt," } + {GoToNameAtCursor 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } //- rjf: watch expressions - {ToggleWatchExpression 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "$text_pt," } - {ToggleWatchExpressionAtCursor 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "" } - {ToggleWatchExpressionAtMouse 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } + {ToggleWatchExpression 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "$text_pt," } + {ToggleWatchExpressionAtCursor 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "" } + {ToggleWatchExpressionAtMouse 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } //- rjf: general config operations - {EnableCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } - {DisableCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } - {SelectCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } - {DeselectCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } - {RemoveCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } - {NameCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } - {ConditionCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } - {DuplicateCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } - {RelocateCfg 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } - {SaveToProject 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } + {EnableCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } + {DisableCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } + {SelectCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } + {DeselectCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } + {RemoveCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } + {NameCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } + {ConditionCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } + {DuplicateCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } + {RelocateCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } + {SaveToProject 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } //- rjf: breakpoints - {AddBreakpoint 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } - {AddAddressBreakpoint 1 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "$breakpoints," } - {AddFunctionBreakpoint 1 0 0 0 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "$breakpoints," } - {ToggleBreakpoint 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "$text_pt," } - {RemoveBreakpoint 1 0 0 0 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "$breakpoints," } - {EnableBreakpoint 1 1 0 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } - {DisableBreakpoint 1 1 0 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } - {ClearBreakpoints 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } + {AddBreakpoint 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } + {AddAddressBreakpoint 1 0 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "$breakpoints," } + {AddFunctionBreakpoint 1 0 0 0 0 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "$breakpoints," } + {ToggleBreakpoint 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "$text_pt," } + {RemoveBreakpoint 1 0 0 0 0 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "$breakpoints," } + {EnableBreakpoint 1 1 0 0 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } + {DisableBreakpoint 1 1 0 0 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } + {ClearBreakpoints 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } //- rjf: output - {ClearOutput 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } + {ClearOutput 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } //- rjf: watch pins - {AddWatchPin 1 1 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "$watch_pins," } - {ToggleWatchPin 1 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } + {AddWatchPin 1 1 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "$watch_pins," } + {ToggleWatchPin 1 0 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } //- rjf: debug infos - {LoadDebugInfo 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "$debug_infos," } - {UnloadDebugInfo 1 1 0 0 0 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "$debug_infos," } + {LoadDebugInfo 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "$debug_infos," } + {UnloadDebugInfo 1 1 0 0 0 0 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "$debug_infos," } //- rjf: type views - {AddTypeView 0 0 0 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } + {AddTypeView 0 0 0 0 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } //- rjf: file path maps - {AddFilePathMap 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } + {AddFilePathMap 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } //- rjf: themes - {EditUserTheme 0 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } - {EditProjectTheme 0 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } - {AddThemeColor 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } - {ForkTheme 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } - {SaveTheme 0 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } - {SaveAndSetTheme 0 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } + {EditUserTheme 0 0 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } + {EditProjectTheme 0 0 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } + {AddThemeColor 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } + {ForkTheme 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } + {SaveTheme 0 0 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } + {SaveAndSetTheme 0 0 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } //- rjf: line operations - {SetNextStatement 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "$text_pt," } + {SetNextStatement 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "$text_pt," } //- rjf: targets - {AddTarget 1 1 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "$targets," } - {SelectTarget 1 1 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } - {EnableTarget 1 1 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } - {DisableTarget 1 1 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } - {RemoveTarget 1 1 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } + {AddTarget 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "$targets," } + {SelectTarget 1 1 0 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } + {EnableTarget 1 1 0 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } + {DisableTarget 1 1 0 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } + {RemoveTarget 1 1 0 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } //- rjf: attaching - {RegisterAsJITDebugger 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } + {RegisterAsJITDebugger 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } //- rjf: snap-to-code-location - {FindCodeLocation 0 1 0 0 0 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } + {FindCodeLocation 0 1 0 0 0 0 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } //- rjf: snap-to-memory-location - {GoToMemory 0 1 0 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "" } + {GoToMemory 0 1 0 0 1 0 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "" } //- rjf: break-when-value-changes - {BreakWhenValueChanges 0 1 0 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "" } + {BreakWhenValueChanges 0 1 0 0 1 0 "" Expr null Nil Null 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "" } //- rjf: searching - {Search 1 1 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } - {SearchBackwards 1 1 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } + {Search 1 1 0 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } + {SearchBackwards 1 1 0 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } //- rjf: queries - {PickFile 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } - {PickFolder 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } - {PickFileOrFolder 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } + {PickFile 0 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } + {PickFolder 0 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } + {PickFileOrFolder 0 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } //- rjf: query stack - {PushQuery 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } - {CompleteQuery 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } - {CancelQuery 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } - {UpdateQuery 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } + {PushQuery 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } + {CompleteQuery 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } + {CancelQuery 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } + {UpdateQuery 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } //- rjf: event buffers - {OpenEventBuffer 0 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } - {CloseEventBuffer 0 1 0 0 0 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } + {OpenEventBuffer 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } + {CloseEventBuffer 0 1 0 0 0 0 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } //- rjf: developer commands - {ToggleDevMenu 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } - {LogMarker 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } + {ToggleDevMenu 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } + {LogMarker 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } } @enum RD_CmdKind: @@ -1271,7 +1271,7 @@ RD_CmdTable: // | | | | @expand(D_CmdTable, a) ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis))|(RD_CmdKindFlag_ListInEval*$(a.eval_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis))|(RD_CmdKindFlag_ListInEval*$(a.eval_vis))|(RD_CmdKindFlag_ListInMemory*$(a.memory_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_WatchTabFastPathTable, a) ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}```; @expand(RD_ViewTabFastPathTable, a) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 99e713fd..235c122c 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -92,6 +92,7 @@ enum RD_CmdKindFlag_ListInTextPt = (1<<3), RD_CmdKindFlag_ListInTextRng = (1<<4), RD_CmdKindFlag_ListInEval = (1<<5), + RD_CmdKindFlag_ListInMemory = (1<<6), }; //////////////////////////////// diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index a1355099..9d9befcc 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -34,7 +34,8 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands) (str8_match(type->name, s("text_pt_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTextPt) || (str8_match(type->name, s("text_range_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTextRng) || (str8_match(type->name, s("tab_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTab) || - (str8_match(type->name, s("eval_commands"), 0) && info->flags & RD_CmdKindFlag_ListInEval)); + (str8_match(type->name, s("eval_commands"), 0) && info->flags & RD_CmdKindFlag_ListInEval) || + (str8_match(type->name, s("memory_commands"), 0) && info->flags & RD_CmdKindFlag_ListInMemory)); if(show) { String8 code_name = info->string; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 05c39aaf..85189195 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -4054,7 +4054,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } // rjf: click & drag -> select - if(ui_dragging(sig) && mouse_hover_byte_num != 0) + if((ui_dragging(sig) || ui_right_clicked(sig)) && mouse_hover_byte_num != 0) { if(!contains_2f32(sig.box->rect, ui_mouse())) { @@ -4067,6 +4067,17 @@ RD_VIEW_UI_FUNCTION_DEF(memory) } } + // rjf: right-click -> push query + if(ui_right_clicked(sig)) + { + rd_cmd(RD_CmdKind_PushQuery, + .expr = s("query:memory_commands"), + .do_implicit_root = 1, + .do_lister = 1, + .activate_with_single_click = 1, + .ui_key = sig.box->key); + } + // rjf: ctrl+scroll -> change font size if(ui_hovering(sig)) { @@ -4406,6 +4417,12 @@ RD_VIEW_UI_FUNCTION_DEF(memory) mark_base_vaddr = clamp_1u64(cursor_valid_rng, mark_base_vaddr); } + ////////////////////////////// + //- rjf: fill registers + // + rd_regs()->eval_space = eval.space; + rd_regs()->vaddr_range = selection; + ////////////////////////////// //- rjf: save parameters // From 09f78fdae493965a02c225c37c630d6cd19237ee Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 14:28:06 -0700 Subject: [PATCH 737/850] small parameterization to query watches --- src/raddbg/generated/raddbg.meta.c | 6 ++++-- src/raddbg/generated/raddbg.meta.h | 7 +++++-- src/raddbg/raddbg.mdesk | 1 + src/raddbg/raddbg_core.c | 23 ++++++++++++++++++++++- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index f532d8cf..15a90e62 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -476,7 +476,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[39] = {str8_lit_comp("thread"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, }; -String8 rd_reg_slot_code_name_table[50] = +String8 rd_reg_slot_code_name_table[51] = { {0}, str8_lit_comp("machine"), @@ -524,13 +524,14 @@ str8_lit_comp("non_graphical"), str8_lit_comp("prefer_new_tab"), str8_lit_comp("activate_with_single_click"), str8_lit_comp("disable_addresses"), +str8_lit_comp("small_size"), str8_lit_comp("dir2"), str8_lit_comp("string"), str8_lit_comp("cmd_name"), str8_lit_comp("wm_event"), }; -Rng1U64 rd_reg_slot_range_table[50] = +Rng1U64 rd_reg_slot_range_table[51] = { {0}, {OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(D_Handle)}, @@ -578,6 +579,7 @@ Rng1U64 rd_reg_slot_range_table[50] = {OffsetOf(RD_Regs, prefer_new_tab), OffsetOf(RD_Regs, prefer_new_tab) + sizeof(B32)}, {OffsetOf(RD_Regs, activate_with_single_click), OffsetOf(RD_Regs, activate_with_single_click) + sizeof(B32)}, {OffsetOf(RD_Regs, disable_addresses), OffsetOf(RD_Regs, disable_addresses) + sizeof(B32)}, +{OffsetOf(RD_Regs, small_size), OffsetOf(RD_Regs, small_size) + sizeof(B32)}, {OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)}, {OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)}, {OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 2a0a5007..5eb85370 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -54,6 +54,7 @@ RD_RegSlot_NonGraphical, RD_RegSlot_PreferNewTab, RD_RegSlot_ActivateWithSingleClick, RD_RegSlot_DisableAddresses, +RD_RegSlot_SmallSize, RD_RegSlot_Dir2, RD_RegSlot_String, RD_RegSlot_CmdName, @@ -503,6 +504,7 @@ B32 non_graphical; B32 prefer_new_tab; B32 activate_with_single_click; B32 disable_addresses; +B32 small_size; Dir2 dir2; String8 string; String8 cmd_name; @@ -604,6 +606,7 @@ Z(getting_started)\ .prefer_new_tab = rd_regs()->prefer_new_tab,\ .activate_with_single_click = rd_regs()->activate_with_single_click,\ .disable_addresses = rd_regs()->disable_addresses,\ +.small_size = rd_regs()->small_size,\ .dir2 = rd_regs()->dir2,\ .string = rd_regs()->string,\ .cmd_name = rd_regs()->cmd_name,\ @@ -614,8 +617,8 @@ extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; extern RD_VocabInfo rd_vocab_info_table[367]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; -extern String8 rd_reg_slot_code_name_table[50]; -extern Rng1U64 rd_reg_slot_range_table[50]; +extern String8 rd_reg_slot_code_name_table[51]; +extern Rng1U64 rd_reg_slot_range_table[51]; extern String8 rd_binding_version_remap_old_name_table[9]; extern String8 rd_binding_version_remap_new_name_table[9]; extern String8 rd_icon_kind_text_table[75]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 3f971732..70e376b3 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -896,6 +896,7 @@ RD_RegTable: {B32 prefer_new_tab PreferNewTab } {B32 activate_with_single_click ActivateWithSingleClick } {B32 disable_addresses DisableAddresses } + {B32 small_size SmallSize } {Dir2 dir2 Dir2 } {String8 string String } {String8 cmd_name CmdName } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 55fadecf..cb8cf93a 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -6424,6 +6424,7 @@ rd_window_frame(void) CFG_Node *view = cfg_node_child_from_string_or_alloc(rd_state->cfg, root, str8_lit("watch")); CFG_Node *query = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit("query")); B32 is_lister = (cfg_node_child_from_string(view, str8_lit("lister")) != &cfg_nil_node); + B32 is_small = (cfg_node_child_from_string(view, str8_lit("small")) != &cfg_nil_node); B32 root_is_explicit = (cfg_node_child_from_string(view, str8_lit("explicit_root")) != &cfg_nil_node); RD_ViewState *vs = rd_view_state_from_cfg(view); @@ -6494,6 +6495,16 @@ rd_window_frame(void) EV_BlockTree predicted_block_tree = ev_block_tree_from_eval(scratch.arena, rd_view_eval_view(), rd_view_query_input(), query_eval); F32 query_width_px = floor_f32(content_rect_dim.x * 0.35f); F32 max_query_height_px = content_rect_dim.y*0.8f; + if(is_small) + { + query_width_px = floor_f32(content_rect_dim.x * 0.15f); + max_query_height_px = content_rect_dim.y*0.3f; + } + if(!ui_key_match(ui_key_zero(), ws->query_regs->ui_key)) + { + query_width_px = is_small ? (ui_top_font_size()*25.f) : (ui_top_font_size()*60.f); + max_query_height_px = is_small ? (ui_top_font_size()*40.f) : (ui_top_font_size()*80.f); + } F32 query_height_px = max_query_height_px; if(size_query_by_expr_eval) { @@ -6516,7 +6527,7 @@ rd_window_frame(void) { rect.x0 = anchor_box->rect.x0 + ws->query_regs->off_px.x; rect.y0 = anchor_box->rect.y1 + ws->query_regs->off_px.y; - rect.x1 = rect.x0 + ui_top_font_size()*60.f; + rect.x1 = rect.x0 + query_width_px; rect.y1 = rect.y0 + query_height_px; } } @@ -8640,7 +8651,9 @@ rd_window_frame(void) .expr = str8_lit("query:tab_commands"), .panel = panel->cfg->id, .do_implicit_root = 1, + .small_size = 1, .do_lister = 1, + .activate_with_single_click = 1, .ui_key = add_new_box->key); } } @@ -15717,6 +15730,14 @@ rd_frame(void) { cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit("lister")); } + if(!rd_regs()->small_size) + { + cfg_node_release(rd_state->cfg, cfg_node_child_from_string(view, str8_lit("small"))); + } + else + { + cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit("small")); + } if(!rd_regs()->activate_with_single_click) { cfg_node_release(rd_state->cfg, cfg_node_child_from_string(view, str8_lit("activate_with_single_click"))); From dc613f3a0875ff77729b2ab7110f34c05da95ce3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 3 Jun 2026 14:43:50 -0700 Subject: [PATCH 738/850] correctly handle voff evaluations in generalized watch window completion path (offline evaluation in everything palette case) --- src/raddbg/raddbg_core.c | 56 ++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index cb8cf93a..b80ff483 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2447,30 +2447,46 @@ rd_view_ui(Rng2F32 rect) { default: { - String8 name = {0}; + // rjf: unpack voff / dbgi key from evaluation + U64 voff = 0; + DI_Key dbgi_key = {0}; + if(eval.space.kind == D_EvalSpaceKind_Entity) { U64 vaddr = eval.value.u64; - D_Entity *process = d_entity_from_handle(rd_regs()->process); + D_Entity *process = rd_ctrl_entity_from_eval_space(eval.space); D_Entity *module = d_module_from_process_vaddr(process, vaddr); - DI_Key dbgi_key = d_dbgi_key_from_module(module); - U64 voff = d_voff_from_vaddr(module, vaddr); - { - Access *access = access_open(); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); - if(name.size == 0) - { - RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); - name.str = rdi_name_from_procedure(rdi, procedure, &name.size); - } - if(name.size == 0) - { - RDI_Symbol *gvar = rdi_global_variable_from_voff(rdi, voff); - name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size); - } - access_close(access); - } + dbgi_key = d_dbgi_key_from_module(module); + voff = d_voff_from_vaddr(module, vaddr); } - if(name.size != 0) + else + { + voff = eval.value.u64; + E_DbgInfo *dbg_info = e_dbg_info_from_type_key(eval.irtree.type_key); + dbgi_key = dbg_info->dbgi_key; + } + + // rjf: map voff / dbgi key to name + String8 name = {0}; + B32 nav_to_name = 0; + { + Access *access = access_open(); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0); + if(name.size == 0) + { + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); + name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, procedure); + nav_to_name = (name.size != 0); + } + if(name.size == 0) + { + RDI_Symbol *gvar = rdi_global_variable_from_voff(rdi, voff); + name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, gvar); + } + access_close(access); + } + + // rjf: go to name if we can, otherwise just evaluate it in a sub-query + if(name.size != 0 && nav_to_name) { rd_cmd(RD_CmdKind_GoToName, .string = name); } From 1ef94cb7591d4195e84cf04a676144cbc567b8f5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 6 Jun 2026 15:37:24 -0700 Subject: [PATCH 739/850] fix find-code-location snap rule when src/disasm occupy same panel & they are found by different rules; conflicting panels must be checked across *all* cases --- src/raddbg/raddbg_core.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index b80ff483..0d94229b 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5891,6 +5891,7 @@ rd_window_frame(void) ui_labelf("lang_kind: '%S'", txt_extension_from_lang_kind(regs->lang_kind)); ui_labelf("vaddr_range: [0x%I64x, 0x%I64x)", regs->vaddr_range.min, regs->vaddr_range.max); ui_labelf("voff_range: [0x%I64x, 0x%I64x)", regs->voff_range.min, regs->voff_range.max); + ui_labelf("prefer_disasm: %i", regs->prefer_disasm); } ui_divider(ui_em(1.f, 1.f)); @@ -15295,6 +15296,8 @@ rd_frame(void) }; FindCodeLocTask *first_task = 0; FindCodeLocTask *last_task = 0; + CFG_PanelNode *did_src_code_panel = &cfg_nil_panel_node; + CFG_PanelNode *did_disasm_panel = &cfg_nil_panel_node; B32 did_src_code_snap = 0; B32 did_disasm_snap = 0; for(WindowInfo *info = first_window_info; info != 0; info = info->next) @@ -15327,8 +15330,8 @@ rd_frame(void) t->view_w_auto = info->view_w_auto; t->panel_w_disasm = info->panel_w_disasm; t->view_w_disasm = info->view_w_disasm; - if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; } - if(disasm_dst_panel != &cfg_nil_panel_node) { did_disasm_snap = 1; } + if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; did_src_code_panel = src_code_dst_panel; } + if(disasm_dst_panel != &cfg_nil_panel_node) { did_disasm_snap = 1; did_disasm_panel = disasm_dst_panel; } } } @@ -15365,8 +15368,8 @@ rd_frame(void) t->view_w_auto = info->view_w_auto; t->panel_w_disasm = info->panel_w_disasm; t->view_w_disasm = info->view_w_disasm; - if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; } - if(disasm_dst_panel != &cfg_nil_panel_node) { did_disasm_snap = 1; } + if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; did_src_code_panel = src_code_dst_panel; } + if(disasm_dst_panel != &cfg_nil_panel_node) { did_disasm_snap = 1; did_disasm_panel = disasm_dst_panel; } } } @@ -15394,7 +15397,7 @@ rd_frame(void) t->view_w_auto = info->view_w_auto; t->panel_w_disasm = info->panel_w_disasm; t->view_w_disasm = info->view_w_disasm; - if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; } + if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; did_src_code_panel = src_code_dst_panel; } } } @@ -15437,6 +15440,8 @@ rd_frame(void) t->view_w_auto = info->view_w_auto; t->panel_w_disasm = info->panel_w_disasm; t->view_w_disasm = info->view_w_disasm; + if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; did_src_code_panel = src_code_dst_panel; } + if(disasm_dst_panel != &cfg_nil_panel_node) { did_disasm_snap = 1; did_disasm_panel = disasm_dst_panel; } } } @@ -15449,16 +15454,13 @@ rd_frame(void) // rjf: if disasm and source code match: // if disasm preferred, cancel source // if source preferred, cancel disasm - if(disasm_dst_panel == src_code_dst_panel) + if(disasm_dst_panel == did_src_code_panel && !rd_regs()->prefer_disasm) { - if(rd_regs()->prefer_disasm) - { - src_code_dst_panel = &cfg_nil_panel_node; - } - else - { - disasm_dst_panel = &cfg_nil_panel_node; - } + disasm_dst_panel = &cfg_nil_panel_node; + } + if(src_code_dst_panel == did_disasm_panel && rd_regs()->prefer_disasm) + { + src_code_dst_panel = &cfg_nil_panel_node; } // rjf: if disasm is not preferred, and we have no disassembly view From 5c664261a3244c05433ab1c6f112654df2af3a66 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 8 Jun 2026 11:10:14 -0700 Subject: [PATCH 740/850] symbol server abstraction layer; http layer; fix to 'prefer_disasm' rule when no disassembly tabs are open; small fixes / cleanup --- project.4coder | 2 +- src/base/base_core.c | 6 +- src/base/base_core.h | 10 +- src/base/base_entry_point.c | 9 + src/base/base_files.c | 2 +- src/base/base_inc.c | 1 + src/base/base_inc.h | 1 + src/base/base_processes.h | 1 - src/base/base_ring.c | 135 +++++ src/base/base_ring.h | 56 ++ src/dbg_engine/dbg_engine_ctrl.c | 40 +- src/dbg_engine/dbg_engine_ctrl.h | 2 - src/http/http.c | 33 ++ src/http/http.h | 170 ++++++ src/http/http_inc.c | 9 + src/http/http_inc.h | 14 + src/http/http_stub.c | 22 + src/http/http_stub.h | 7 + src/mutable_text/mutable_text.c | 16 +- src/raddbg/generated/raddbg.meta.c | 6 +- src/raddbg/raddbg.mdesk | 4 +- src/raddbg/raddbg_core.c | 91 +++- src/raddbg/raddbg_core.h | 5 + src/raddbg/raddbg_main.c | 13 +- src/raddbg/raddbg_views.c | 4 +- src/symbol_server/symbol_server.c | 2 + src/symbol_server/symbol_server.h | 10 + src/symbol_server/symbol_server_inc.c | 9 + src/symbol_server/symbol_server_inc.h | 14 + src/symbol_server/symbol_server_stub.c | 13 + src/symbol_server/symbol_server_stub.h | 7 + src/ui/ui_basic_widgets.c | 4 + src/win32/base/win32_base.c | 18 - src/win32/http/win32_http.c | 501 ++++++++++++++++++ src/win32/http/win32_http.h | 58 ++ src/win32/symbol_server/win32_symbol_server.c | 114 ++++ src/win32/symbol_server/win32_symbol_server.h | 17 + test2.project | 2 + 38 files changed, 1347 insertions(+), 81 deletions(-) create mode 100644 src/base/base_ring.c create mode 100644 src/base/base_ring.h create mode 100644 src/http/http.c create mode 100644 src/http/http.h create mode 100644 src/http/http_inc.c create mode 100644 src/http/http_inc.h create mode 100644 src/http/http_stub.c create mode 100644 src/http/http_stub.h create mode 100644 src/symbol_server/symbol_server.c create mode 100644 src/symbol_server/symbol_server.h create mode 100644 src/symbol_server/symbol_server_inc.c create mode 100644 src/symbol_server/symbol_server_inc.h create mode 100644 src/symbol_server/symbol_server_stub.c create mode 100644 src/symbol_server/symbol_server_stub.h create mode 100644 src/win32/http/win32_http.c create mode 100644 src/win32/http/win32_http.h create mode 100644 src/win32/symbol_server/win32_symbol_server.c create mode 100644 src/win32/symbol_server/win32_symbol_server.h create mode 100644 test2.project diff --git a/project.4coder b/project.4coder index 0b10da9c..8819400a 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/base/base_core.c b/src/base/base_core.c index c450648a..34c5d6e2 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -623,10 +623,10 @@ date_time_from_unix_time(U64 unix_time) } //////////////////////////////// -//~ rjf: Non-Fancy Ring Buffer Reads/Writes +//~ rjf: Wrapped Ring Buffer Reads/Writes internal U64 -ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size) +wrapped_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size) { Assert(src_data_size <= ring_size); { @@ -643,7 +643,7 @@ ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_d } internal U64 -ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size) +wrapped_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size) { Assert(read_size <= ring_size); { diff --git a/src/base/base_core.h b/src/base/base_core.h index 2bad9a82..ebef4649 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -1107,12 +1107,12 @@ internal void sleep_ms(U32 ms); internal Guid make_guid(void); //////////////////////////////// -//~ rjf: Non-Fancy Ring Buffer Reads/Writes +//~ rjf: Wrapped Ring Buffer Reads/Writes -internal U64 ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size); -internal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size); -#define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) -#define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) +internal U64 wrapped_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size); +internal U64 wrapped_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size); +#define wrapped_write_struct(ring_base, ring_size, ring_pos, ptr) wrapped_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) +#define wrapped_read_struct(ring_base, ring_size, ring_pos, ptr) wrapped_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr))) //////////////////////////////// //~ rjf: Sorts diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index a3ab9aa8..f05a9e39 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -58,6 +58,12 @@ main_thread_base_entry_point(int arguments_count, char **arguments) } //- rjf: initialize all included layers +#if defined(HTTP_H) && !defined(HTTP_INIT_MANUAL) + http_init(); +#endif +#if defined(SYMBOL_SERVER_H) && !defined(SMSV_INIT_MANUAL) + smsv_init(); +#endif #if defined(ARTIFACT_CACHE_H) && !defined(AC_INIT_MANUAL) ac_init(); #endif @@ -215,6 +221,9 @@ async_thread_entry_point(void *params) #if defined(FILE_STREAM_H) fs_async_tick(); #endif +#if defined(HTTP_H) + http_async_tick(); +#endif #if defined(DBG_INFO_H) di_async_tick(); #endif diff --git a/src/base/base_files.c b/src/base/base_files.c index 9a500f81..ca63d390 100644 --- a/src/base/base_files.c +++ b/src/base/base_files.c @@ -78,7 +78,7 @@ write_data_list_to_file_path(String8 path, String8List list) else { U64 bytes_to_copy = Min(write_buffer_available_size, n->string.size - n_off); - write_buffer_write_pos += ring_write(write_buffer, write_buffer_size, write_buffer_write_pos, n->string.str + n_off, bytes_to_copy); + write_buffer_write_pos += wrapped_write(write_buffer, write_buffer_size, write_buffer_write_pos, n->string.str + n_off, bytes_to_copy); n_off += bytes_to_copy; } } diff --git a/src/base/base_inc.c b/src/base/base_inc.c index 90467069..5a102437 100644 --- a/src/base/base_inc.c +++ b/src/base/base_inc.c @@ -17,6 +17,7 @@ #include "base_hash.c" #include "base_system.c" #include "base_threads.c" +#include "base_ring.c" #include "base_thread_context.c" #include "base_files.c" #include "base_shared_memory.c" diff --git a/src/base/base_inc.h b/src/base/base_inc.h index 3a378ec0..f83f8858 100644 --- a/src/base/base_inc.h +++ b/src/base/base_inc.h @@ -19,6 +19,7 @@ #include "base_hash.h" #include "base_system.h" #include "base_threads.h" +#include "base_ring.h" #include "base_thread_context.h" #include "base_files.h" #include "base_shared_memory.h" diff --git a/src/base/base_processes.h b/src/base/base_processes.h index 21e33cf1..33d3bb13 100644 --- a/src/base/base_processes.h +++ b/src/base/base_processes.h @@ -15,7 +15,6 @@ struct ProcessInfo String8 user_program_config_data_path; String8 user_program_cache_data_path; String8 user_program_logs_data_path; - String8 symbol_cache_path; String8List module_load_paths; String8List environment; }; diff --git a/src/base/base_ring.c b/src/base/base_ring.c new file mode 100644 index 00000000..d43f0955 --- /dev/null +++ b/src/base/base_ring.c @@ -0,0 +1,135 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Ring Functions + +internal Ring * +make_ring(Arena *arena, U64 size) +{ + Ring *ring = push_array(arena, Ring, 1); + ring->size = size; + ring->base = push_array(arena, U8, ring->size); + return ring; +} + +internal B32 +ring_try_write(Ring *ring, U64 size, void *ptr) +{ + U64 bytes_unconsumed = (ring->write_pos - ring->read_pos); + U64 bytes_available = ring->size - bytes_unconsumed; + B32 result = 0; + if(bytes_available >= size) + { + result = 1; + ring->write_pos += wrapped_write(ring->base, ring->size, ring->write_pos, ptr, size); + } + return result; +} + +internal B32 +ring_try_read(Ring *ring, U64 size, void *ptr) +{ + U64 bytes_unconsumed = (ring->write_pos - ring->read_pos); + B32 result = 0; + if(bytes_unconsumed >= size) + { + result = 1; + ring->read_pos += wrapped_read(ring->base, ring->size, ring->read_pos, ptr, size); + } + return result; +} + +//////////////////////////////// +//~ rjf: Guarded Ring Functions + +internal GuardedRing * +guarded_ring_alloc(Arena *arena, U64 size) +{ + GuardedRing *gr = push_array(arena, GuardedRing, 1); + gr->ring = make_ring(arena, size); + gr->mutex = mutex_alloc(); + gr->cv = cond_var_alloc(); + return gr; +} + +internal void +guarded_ring_release(GuardedRing *ring) +{ + mutex_release(ring->mutex); + cond_var_release(ring->cv); +} + +internal RingGuard +guarded_ring_open(GuardedRing *ring) +{ + RingGuard guard = {ring}; + mutex_take(ring->mutex); + return guard; +} + +internal void +guarded_ring_close(RingGuard *guard) +{ + mutex_drop(guard->r->mutex); +} + +internal B32 +guarded_ring_try_write(RingGuard *guard, U64 size, void *ptr) +{ + B32 result = ring_try_write(guard->r->ring, size, ptr); + if(result) + { + cond_var_broadcast(guard->r->cv); + } + return result; +} + +internal B32 +guarded_ring_try_read(RingGuard *guard, U64 size, void *ptr) +{ + B32 result = ring_try_read(guard->r->ring, size, ptr); + if(result) + { + cond_var_broadcast(guard->r->cv); + } + return result; +} + +internal B32 +guarded_ring_write_or_wait(RingGuard *guard, U64 size, void *ptr, U64 endt_us) +{ + B32 write_good = 0; + for(;!write_good;) + { + write_good = guarded_ring_try_write(guard, size, ptr); + if(now_time_us() >= endt_us) + { + break; + } + if(!write_good) + { + cond_var_wait(guard->r->cv, guard->r->mutex, endt_us); + } + } + return write_good; +} + +internal B32 +guarded_ring_read_or_wait(RingGuard *guard, U64 size, void *ptr, U64 endt_us) +{ + B32 read_good = 0; + for(;!read_good;) + { + read_good = guarded_ring_try_read(guard, size, ptr); + if(now_time_us() >= endt_us) + { + break; + } + if(!read_good) + { + cond_var_wait(guard->r->cv, guard->r->mutex, endt_us); + } + } + return read_good; +} diff --git a/src/base/base_ring.h b/src/base/base_ring.h new file mode 100644 index 00000000..59b07b86 --- /dev/null +++ b/src/base/base_ring.h @@ -0,0 +1,56 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef BASE_RING_H +#define BASE_RING_H + +typedef struct Ring Ring; +struct Ring +{ + U8 *base; + U64 size; + U64 write_pos; + U64 read_pos; +}; + +typedef struct GuardedRing GuardedRing; +struct GuardedRing +{ + Ring *ring; + Mutex mutex; + CondVar cv; +}; + +typedef struct RingGuard RingGuard; +struct RingGuard +{ + GuardedRing *r; +}; + +//////////////////////////////// +//~ rjf: Ring Functions + +internal Ring *make_ring(Arena *arena, U64 size); +internal B32 ring_try_write(Ring *ring, U64 size, void *ptr); +internal B32 ring_try_read(Ring *ring, U64 size, void *ptr); +#define ring_try_write_struct(ring, ptr) ring_try_write((ring), sizeof(*(ptr)), (ptr)) +#define ring_try_read_struct(ring, ptr) ring_try_read((ring), sizeof(*(ptr)), (ptr)) + +//////////////////////////////// +//~ rjf: Guarded Ring Functions + +internal GuardedRing *guarded_ring_alloc(Arena *arena, U64 size); +internal void guarded_ring_release(GuardedRing *ring); +internal RingGuard guarded_ring_open(GuardedRing *ring); +internal void guarded_ring_close(RingGuard *guard); +internal B32 guarded_ring_try_write(RingGuard *guard, U64 size, void *ptr); +internal B32 guarded_ring_try_read(RingGuard *guard, U64 size, void *ptr); +#define guarded_ring_try_write_struct(ring, ptr) guarded_ring_try_write((ring), sizeof(*(ptr)), (ptr)) +#define guarded_ring_try_read_struct(ring, ptr) guarded_ring_try_read((ring), sizeof(*(ptr)), (ptr)) +internal B32 guarded_ring_write_or_wait(RingGuard *guard, U64 size, void *ptr, U64 endt_us); +internal B32 guarded_ring_read_or_wait(RingGuard *guard, U64 size, void *ptr, U64 endt_us); +#define guarded_ring_write_struct_or_wait(ring, ptr, endt_us) guarded_ring_write_or_wait((ring), sizeof(*(ptr)), (ptr), (endt_us)) +#define guarded_ring_read_struct_or_wait(ring, ptr, endt_us) guarded_ring_read_or_wait((ring), sizeof(*(ptr)), (ptr), (endt_us)) +#define guarded_ring_write_string_or_wait(ring, string, endt_us) guarded_ring_write_or_wait((ring), (string).size, (string).str, (endt_us)) + +#endif // BASE_RING_H diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 7b2ff413..1b4081a2 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -2144,8 +2144,8 @@ d_u2c_push_msgs(D_MsgList *msgs, U64 endt_us) U64 needed_size = sizeof(msgs_srlzed_baked.size) + msgs_srlzed_baked.size; if(available_size >= needed_size) { - d_ctrl_state->u2c_ring_write_pos += ring_write_struct(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size); - d_ctrl_state->u2c_ring_write_pos += ring_write(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size); + d_ctrl_state->u2c_ring_write_pos += wrapped_write_struct(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size); + d_ctrl_state->u2c_ring_write_pos += wrapped_write(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size); good = 1; break; } @@ -2174,10 +2174,10 @@ d_u2c_pop_msgs(Arena *arena) if(unconsumed_size >= sizeof(U64)) { U64 size_to_decode = 0; - d_ctrl_state->u2c_ring_read_pos += ring_read_struct(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_read_pos, &size_to_decode); + d_ctrl_state->u2c_ring_read_pos += wrapped_read_struct(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_read_pos, &size_to_decode); msgs_srlzed_baked.size = size_to_decode; msgs_srlzed_baked.str = push_array_no_zero(scratch.arena, U8, msgs_srlzed_baked.size); - d_ctrl_state->u2c_ring_read_pos += ring_read(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode); + d_ctrl_state->u2c_ring_read_pos += wrapped_read(d_ctrl_state->u2c_ring_base, d_ctrl_state->u2c_ring_size, d_ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode); break; } cond_var_wait(d_ctrl_state->u2c_ring_cv, d_ctrl_state->u2c_ring_mutex, max_U64); @@ -2210,8 +2210,8 @@ d_c2u_push_events(D_EventList *events) U64 needed_size = sizeof(event_srlzed.size) + event_srlzed.size; if(available_size >= needed_size) { - d_ctrl_state->c2u_ring_write_pos += ring_write_struct(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_write_pos, &event_srlzed.size); - d_ctrl_state->c2u_ring_write_pos += ring_write(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); + d_ctrl_state->c2u_ring_write_pos += wrapped_write_struct(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_write_pos, &event_srlzed.size); + d_ctrl_state->c2u_ring_write_pos += wrapped_write(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size); break; } cond_var_wait(d_ctrl_state->c2u_ring_cv, d_ctrl_state->c2u_ring_mutex, now_time_us()+100); @@ -2238,11 +2238,11 @@ d_c2u_pop_events(Arena *arena) if(unconsumed_size >= sizeof(U64)) { U64 size_to_decode = 0; - d_ctrl_state->c2u_ring_read_pos += ring_read_struct(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_read_pos, &size_to_decode); + d_ctrl_state->c2u_ring_read_pos += wrapped_read_struct(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_read_pos, &size_to_decode); String8 event_srlzed = {0}; event_srlzed.size = size_to_decode; event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size); - d_ctrl_state->c2u_ring_read_pos += ring_read(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); + d_ctrl_state->c2u_ring_read_pos += wrapped_read(d_ctrl_state->c2u_ring_base, d_ctrl_state->c2u_ring_size, d_ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size); D_Event *new_event = d_event_list_push(arena, &events); *new_event = d_event_from_serialized_string(arena, event_srlzed); } @@ -2683,28 +2683,11 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM } ////////////////////////////// - //- rjf: determine debug info unique identifier + //- rjf: no found debug info path -> try to fall back on symbol server // - String8 debug_info_unique_identifier = {0}; - if(module_info->debug_info_path.size != 0) + if(initial_debug_info_path.size == 0) { - Guid guid = module_info->debug_info_guid; - debug_info_unique_identifier = str8f(scratch.arena, "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x", - guid.data1, guid.data2, guid.data3, guid.data4[0], guid.data4[1], guid.data4[2], guid.data4[3], guid.data4[4], guid.data4[5], guid.data4[6], guid.data4[7], module_info->debug_info_age); - } - - ////////////////////////////// - //- rjf: build local server cache debug info path - // - String8 local_server_cache_debug_info_path = {0}; - if(debug_info_unique_identifier.size != 0 && module_info->debug_info_path.size != 0) - { - // TODO(rjf): this is not complete - assuming stripped etc. - just following pattern from ntdll.dll for now - String8 symbol_cache_path = get_process_info()->symbol_cache_path; - String8 module_name = str8_skip_last_slash(module_info->module_path); - String8 dbg_name = str8_skip_last_slash(module_info->debug_info_path); - String8 path = str8f(scratch.arena, "%S/%S/%S/stripped/%S", symbol_cache_path, module_name, debug_info_unique_identifier, dbg_name); - local_server_cache_debug_info_path = path_normalized_from_string(arena, path); + initial_debug_info_path = smsv_local_path_from_key(arena, str8_skip_last_slash(module_info->module_path), str8_skip_last_slash(module_info->debug_info_path), module_info->debug_info_guid, module_info->debug_info_age); } ////////////////////////////// @@ -2725,7 +2708,6 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM info.unwinder = unwinder; info.unwind_info = unwind_info_opaque; info.local_debug_info_path = initial_debug_info_path; - info.debug_info_unique_identifier = debug_info_unique_identifier; info.raddbg_attached_marker_voff = module_info->raddbg_is_attached_marker_voff; info.raddbg_data = raddbg_data; } diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 48616ca3..1617dfb6 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -169,8 +169,6 @@ struct D_ModuleInfo UWND_Unwinder unwinder; void *unwind_info; String8 local_debug_info_path; - String8 local_server_cache_debug_info_path; - String8 debug_info_unique_identifier; U64 raddbg_attached_marker_voff; String8 raddbg_data; }; diff --git a/src/http/http.c b/src/http/http.c new file mode 100644 index 00000000..db9ec6ca --- /dev/null +++ b/src/http/http.c @@ -0,0 +1,33 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ rjf: Basic Type Functions + +internal HTTP_StatusKind +http_status_kind_from_code(HTTP_StatusCode code) +{ + HTTP_StatusKind kind = HTTP_StatusKind_Null; + if(0){} + else if(HTTP_StatusCode_FirstInformational <= code && code <= HTTP_StatusCode_LastInformational) + { + kind = HTTP_StatusKind_Informational; + } + else if(HTTP_StatusCode_FirstSuccessful <= code && code <= HTTP_StatusCode_LastSuccessful) + { + kind = HTTP_StatusKind_Successful; + } + else if(HTTP_StatusCode_FirstRedirection <= code && code <= HTTP_StatusCode_LastRedirection) + { + kind = HTTP_StatusKind_Redirection; + } + else if(HTTP_StatusCode_FirstClientError <= code && code <= HTTP_StatusCode_LastClientError) + { + kind = HTTP_StatusKind_ClientError; + } + else if(HTTP_StatusCode_FirstServerError <= code && code <= HTTP_StatusCode_LastServerError) + { + kind = HTTP_StatusKind_ServerError; + } + return kind; +} diff --git a/src/http/http.h b/src/http/http.h new file mode 100644 index 00000000..d52179cd --- /dev/null +++ b/src/http/http.h @@ -0,0 +1,170 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef HTTP_H +#define HTTP_H + +//////////////////////////////////////////////////////////////// +//~ rjf: Status Codes + +typedef enum HTTP_StatusKind +{ + HTTP_StatusKind_Null, + HTTP_StatusKind_Informational, + HTTP_StatusKind_Successful, + HTTP_StatusKind_Redirection, + HTTP_StatusKind_ClientError, + HTTP_StatusKind_ServerError, + HTTP_StatusKind_COUNT +} +HTTP_StatusKind; + +typedef U32 HTTP_StatusCode; +typedef enum HTTP_StatusCodeEnum +{ + //- rjf: informational messages + HTTP_StatusCode_FirstInformational = 100, + HTTP_StatusCode_LastInformational = 199, + HTTP_StatusCode_Continue = 100, + HTTP_StatusCode_SwitchingProtocols = 101, + HTTP_StatusCode_Processing = 102, + HTTP_StatusCode_EarlyHints = 103, + + //- rjf: successful messages + HTTP_StatusCode_FirstSuccessful = 200, + HTTP_StatusCode_LastSuccessful = 299, + HTTP_StatusCode_OK = 200, + HTTP_StatusCode_Created = 201, + HTTP_StatusCode_Accepted = 202, + HTTP_StatusCode_NonAuthoritativeInformation = 203, + HTTP_StatusCode_NoContent = 204, + HTTP_StatusCode_ResetContent = 205, + HTTP_StatusCode_PartialContent = 206, + HTTP_StatusCode_MultiStatus = 207, + HTTP_StatusCode_AlreadyReported = 208, + HTTP_StatusCode_IMUsed = 226, + + //- rjf: redirection messages + HTTP_StatusCode_FirstRedirection = 300, + HTTP_StatusCode_LastRedirection = 399, + HTTP_StatusCode_MultipleChoices = 300, + HTTP_StatusCode_MovedPermanently = 301, + HTTP_StatusCode_Found = 302, + HTTP_StatusCode_SeeOther = 303, + HTTP_StatusCode_NotModified = 304, + HTTP_StatusCode_UseProxy = 305, + HTTP_StatusCode_TemporaryRedirect = 307, + HTTP_StatusCode_PermanentRedirect = 308, + + //- rjf: client error responses + HTTP_StatusCode_FirstClientError = 400, + HTTP_StatusCode_LastClientError = 499, + HTTP_StatusCode_BadRequest = 400, + HTTP_StatusCode_Unauthorized = 401, + HTTP_StatusCode_PaymentRequired = 402, + HTTP_StatusCode_Forbidden = 403, + HTTP_StatusCode_NotFound = 404, + HTTP_StatusCode_MethodNotAllowed = 405, + HTTP_StatusCode_NotAcceptable = 406, + HTTP_StatusCode_ProxyAuthenticationRequired = 407, + HTTP_StatusCode_RequestTimeout = 408, + HTTP_StatusCode_Conflict = 409, + HTTP_StatusCode_Gone = 410, + HTTP_StatusCode_LengthRequired = 411, + HTTP_StatusCode_PreconditionFailed = 412, + HTTP_StatusCode_PayloadTooLarge = 413, + HTTP_StatusCode_URITooLong = 414, + HTTP_StatusCode_UnsupportedMediaType = 415, + HTTP_StatusCode_RangeNotSatisfiable = 416, + HTTP_StatusCode_ExpectationFailed = 417, + HTTP_StatusCode_ImATeapot = 418, + HTTP_StatusCode_MisdirectedRequest = 421, + HTTP_StatusCode_UnprocessableContent = 422, + HTTP_StatusCode_Locked = 423, + HTTP_StatusCode_FailedDependency = 424, + HTTP_StatusCode_TooEarly = 425, + HTTP_StatusCode_UpgradeRequired = 426, + HTTP_StatusCode_PreconditionRequired = 428, + HTTP_StatusCode_TooManyRequests = 429, + HTTP_StatusCode_RequestHeaderFieldsTooLarge = 431, + HTTP_StatusCode_UnavailableForLegalReasons = 451, + + //- rjf: servor error responses + HTTP_StatusCode_FirstServerError = 500, + HTTP_StatusCode_LastServerError = 599, + HTTP_StatusCode_InternalServerError = 500, + HTTP_StatusCode_NotImplemented = 501, + HTTP_StatusCode_BadGateway = 502, + HTTP_StatusCode_ServiceUnavailable = 503, + HTTP_StatusCode_GatewayTimeout = 504, + HTTP_StatusCode_HTTPVersionNotSupported = 505, + HTTP_StatusCode_VariantAlsoNegotiates = 506, + HTTP_StatusCode_InsufficientStorage = 507, + HTTP_StatusCode_LoopDetected = 508, + HTTP_StatusCode_NotExtended = 510, + HTTP_StatusCode_NetworkAuthenticationRequired = 511, +} +HTTP_StatusCodeEnum; + +//////////////////////////////////////////////////////////////// +//~ rjf: Method Kinds + +typedef enum HTTP_Method +{ + HTTP_Method_Get, + HTTP_Method_Head, + HTTP_Method_Post, + HTTP_Method_Put, + HTTP_Method_Delete, + HTTP_Method_Connect, + HTTP_Method_Options, + HTTP_Method_Trace, + HTTP_Method_Patch, + HTTP_Method_COUNT +} +HTTP_Method; + +//////////////////////////////////////////////////////////////// +//~ rjf: Request Parameters Bundle + +typedef struct HTTP_RequestParams HTTP_RequestParams; +struct HTTP_RequestParams +{ + U64 id; + HTTP_Method method; + String8 url; + String8 body; + String8 user_agent; + String8 authorization; + String8 content_type; +}; + +//////////////////////////////////////////////////////////////// +//~ rjf: Response + +typedef struct HTTP_Response HTTP_Response; +struct HTTP_Response +{ + U64 id; + HTTP_StatusCode code; + String8 body; +}; + +//////////////////////////////////////////////////////////////// +//~ rjf: Basic Type Functions + +internal HTTP_StatusKind http_status_kind_from_code(HTTP_StatusCode code); + +//////////////////////////////////////////////////////////////// +//~ rjf: @per_os_impl Top-Level Layer Calls + +internal void http_init(void); +internal void http_async_tick(void); + +//////////////////////////////////////////////////////////////// +//~ rjf: @per_os_impl I/O Ring Functions + +internal B32 http_push_request(GuardedRing *out_ring, HTTP_RequestParams *params, U64 endt_us); +internal B32 http_pop_response(Arena *arena, GuardedRing *out_ring, HTTP_Response *response_out, U64 endt_us); + +#endif // HTTP_H diff --git a/src/http/http_inc.c b/src/http/http_inc.c new file mode 100644 index 00000000..b8242b35 --- /dev/null +++ b/src/http/http_inc.c @@ -0,0 +1,9 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "http.c" +#if OS_WINDOWS +# include "win32/http/win32_http.c" +#else +# include "http_stub.c" +#endif diff --git a/src/http/http_inc.h b/src/http/http_inc.h new file mode 100644 index 00000000..a839a7f1 --- /dev/null +++ b/src/http/http_inc.h @@ -0,0 +1,14 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef HTTP_INC_H +#define HTTP_INC_H + +#include "http.h" +#if OS_WINDOWS +# include "win32/http/win32_http.h" +#else +# include "http_stub.h" +#endif + +#endif // HTTP_INC_H diff --git a/src/http/http_stub.c b/src/http/http_stub.c new file mode 100644 index 00000000..5074dcd8 --- /dev/null +++ b/src/http/http_stub.c @@ -0,0 +1,22 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////////////////////////////////////// +//~ rjf: @per_os_impl Top-Level Layer Calls + +internal void http_init(void){} + +//////////////////////////////////////////////////////////////// +//~ rjf: @per_os_impl I/O Ring Functions + +internal B32 +http_push_request(GuardedRing *out_ring, HTTP_RequestParams *params, U64 endt_us) +{ + return 0; +} + +internal B32 +http_pop_response(Arena *arena, GuardedRing *out_ring, HTTP_Response *response_out, U64 endt_us) +{ + return 0; +} diff --git a/src/http/http_stub.h b/src/http/http_stub.h new file mode 100644 index 00000000..d644b7d0 --- /dev/null +++ b/src/http/http_stub.h @@ -0,0 +1,7 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef HTTP_STUB_H +#define HTTP_STUB_H + +#endif // HTTP_STUB_H diff --git a/src/mutable_text/mutable_text.c b/src/mutable_text/mutable_text.c index 420c5e94..ecaf58e5 100644 --- a/src/mutable_text/mutable_text.c +++ b/src/mutable_text/mutable_text.c @@ -59,10 +59,10 @@ mtx_enqueue_op(MTX_MutThread *thread, C_Key buffer_key, MTX_Op op) U64 needed_size = sizeof(buffer_key) + sizeof(op.range) + sizeof(op.replace.size) + op.replace.size; if(available_size >= needed_size) { - thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &buffer_key); - thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.range); - thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.replace.size); - thread->ring_write_pos += ring_write(thread->ring_base, thread->ring_size, thread->ring_write_pos, op.replace.str, op.replace.size); + thread->ring_write_pos += wrapped_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &buffer_key); + thread->ring_write_pos += wrapped_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.range); + thread->ring_write_pos += wrapped_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.replace.size); + thread->ring_write_pos += wrapped_write(thread->ring_base, thread->ring_size, thread->ring_write_pos, op.replace.str, op.replace.size); break; } cond_var_wait(thread->cv, thread->mutex, max_U64); @@ -78,11 +78,11 @@ mtx_dequeue_op(Arena *arena, MTX_MutThread *thread, C_Key *buffer_key_out, MTX_O U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos; if(unconsumed_size >= sizeof(*buffer_key_out) + sizeof(op_out->range) + sizeof(op_out->replace.size)) { - thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, buffer_key_out); - thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->range); - thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->replace.size); + thread->ring_read_pos += wrapped_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, buffer_key_out); + thread->ring_read_pos += wrapped_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->range); + thread->ring_read_pos += wrapped_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->replace.size); op_out->replace.str = push_array_no_zero(arena, U8, op_out->replace.size); - thread->ring_read_pos += ring_read(thread->ring_base, thread->ring_size, thread->ring_read_pos, op_out->replace.str, op_out->replace.size); + thread->ring_read_pos += wrapped_read(thread->ring_base, thread->ring_size, thread->ring_read_pos, op_out->replace.str, op_out->replace.size); break; } cond_var_wait(thread->cv, thread->mutex, max_U64); diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 15a90e62..bafabca8 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -626,7 +626,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[255] = { str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, { str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, @@ -845,7 +845,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[255] = { str8_lit_comp("geo3d"), str8_lit_comp("Opens a Geometry (3D) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, }; -struct {String8 string; CFG_Binding binding;} rd_default_binding_table[114] = +struct {String8 string; CFG_Binding binding;} rd_default_binding_table[116] = { {str8_lit_comp("kill_all"), {WM_Key_F5, 0 |WM_Modifier_Shift }}, {str8_lit_comp("step_into_inst"), {WM_Key_F11, 0 |WM_Modifier_Alt}}, @@ -944,7 +944,9 @@ struct {String8 string; CFG_Binding binding;} rd_default_binding_table[114] = {str8_lit_comp("goto_line"), {WM_Key_G, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("goto_address"), {WM_Key_G, 0 |WM_Modifier_Alt}}, {str8_lit_comp("search"), {WM_Key_F, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("search"), {WM_Key_Slash, 0 }}, {str8_lit_comp("search_backwards"), {WM_Key_R, 0 |WM_Modifier_Ctrl }}, +{str8_lit_comp("search_backwards"), {WM_Key_Slash, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("find_next"), {WM_Key_F3, 0 }}, {str8_lit_comp("find_prev"), {WM_Key_F3, 0 |WM_Modifier_Ctrl }}, {str8_lit_comp("find_selected_thread"), {WM_Key_F4, 0 }}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 70e376b3..aa6a68b4 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -949,7 +949,7 @@ RD_CmdTable: // | | | | {OpenPalette 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } //- rjf: command fast-path - {RunCommand 1 1 0 0 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } + {RunCommand 0 0 0 0 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } //- rjf: external drivers {RunExternalDriverTextCommand 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } @@ -1415,7 +1415,9 @@ RD_DefaultBindingTable: { "goto_line" G ctrl 0 0 } { "goto_address" G 0 0 alt } { "search" F ctrl 0 0 } + { "search" Slash 0 0 0 } { "search_backwards" R ctrl 0 0 } + { "search_backwards" Slash ctrl 0 0 } { "find_next" F3 0 0 0 } { "find_prev" F3 shift 0 0 } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 0d94229b..edb3c81f 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1685,7 +1685,7 @@ rd_view_ui(Rng2F32 rect) //- rjf: build container UI_Box *search_row = &ui_nil_box; - UI_PrefHeight(ui_px(search_row_height, 1.f)) UI_TagF("focus") + UI_PrefHeight(ui_px(search_row_height, 1.f)) // UI_TagF("focus") { if(!vs->contents_are_focused) { @@ -6633,12 +6633,19 @@ rd_window_frame(void) UI_PermissionFlag_KeyboardSecondary|UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX|UI_PermissionFlag_ScrollY : UI_PermissionFlag_All) { + B32 has_footer = (is_lister && !is_anchored); + F32 container_corner_top_radius_px = is_lister ? ui_top_font_size()*1.f : ui_top_font_size()*0.15f; + F32 container_corner_bottom_radius_px = has_footer ? ui_top_font_size()*1.f : ui_top_font_size()*0.15f; + // rjf: build top-level container box UI_Box *container = &ui_nil_box; UI_Rect(rect) UI_ChildLayoutAxis(Axis2_Y) UI_Squish(0.1f-0.1f*open_t) UI_Transparency(1.f-open_t) - UI_CornerRadius(ui_top_font_size()*0.25f) + UI_CornerRadius00(container_corner_top_radius_px) + UI_CornerRadius10(container_corner_top_radius_px) + UI_CornerRadius01(container_corner_bottom_radius_px) + UI_CornerRadius11(container_corner_bottom_radius_px) { container = ui_build_box_from_stringf(UI_BoxFlag_Clickable| UI_BoxFlag_DrawBorder| @@ -6680,7 +6687,7 @@ rd_window_frame(void) // rjf: build contents F32 total_height_px = dim_2f32(rect).y; F32 footer_height_px = 0; - if(is_lister && !is_anchored) + if(has_footer) { footer_height_px = ui_top_font_size()*4.f; } @@ -7573,6 +7580,29 @@ rd_window_frame(void) ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL)); } + // rjf: update available? + if(rd_state->newer_update_available) + UI_FontSize(ui_top_font_size()*0.85f) + UI_PrefWidth(ui_text_dim(10, 1)) + UI_TextAlignment(UI_TextAlign_Center) + { + DR_FStrList fstrs = {0}; + ui_set_next_hover_cursor(WM_Cursor_HandPoint); + UI_Box *label = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, "##update"); + UI_Signal sig = ui_signal_from_box(label); + DR_FStrParams p = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(s("text")), ui_top_font_size()}; + if(ui_key_match(ui_hot_key(), label->key)) + { + p.underline_thickness = ui_top_font_size()*0.2f; + } + dr_fstrs_push_new(scratch.arena, &fstrs, &p, s("Update Available")); + ui_box_equip_display_fstrs(label, &fstrs); + if(ui_clicked(sig)) + { + wm_open_in_browser(s("https://github.com/EpicGamesExt/raddebugger/releases/latest")); + } + } + scratch_end(scratch); } } @@ -7910,6 +7940,7 @@ rd_window_frame(void) // if(content_rect.x1 > content_rect.x0 && content_rect.y1 > content_rect.y0) { + B32 any_disasm_open = 0; ProfScope("leaf panel UI") for(CFG_PanelNode *panel = panel_tree.root; panel != &cfg_nil_panel_node; @@ -7924,6 +7955,10 @@ rd_window_frame(void) panel_tree.focused == panel); CFG_Node *selected_tab = panel->selected_tab; RD_ViewState *selected_tab_view_state = rd_view_state_from_cfg(selected_tab); + if(str8_match(selected_tab->string, s("disasm"), 0)) + { + any_disasm_open = 1; + } ProfScope("leaf panel UI work - %.*s: %.*s", str8_varg(selected_tab->string), str8_varg(rd_expr_from_cfg(selected_tab))) UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off) { @@ -8752,6 +8787,10 @@ rd_window_frame(void) } } } + if(!any_disasm_open && rd_regs()->prefer_disasm) + { + rd_regs()->prefer_disasm = 0; + } } //////////////////////////// @@ -9342,6 +9381,8 @@ rd_window_frame(void) FNT_Tag font = rd_font_from_slot(RD_FontSlot_Code); Vec2F32 p = ui_mouse(); dr_rect(hover_debug_box->rect, v4f32(1, 1, 1, 0.2f), 0, 0, 0); + R_Rect2DInst *border = dr_rect(hover_debug_box->rect, v4f32(1, 0, 0, 1.f), 0, 0, 0); + MemoryCopyArray(border->corner_radii, hover_debug_box->corner_radii); dr_text(font, 12.f, 0, 0, FNT_RasterFlag_Hinted, p, v4f32(1, 1, 1, 1), push_str8f(scratch.arena, "key: 0x%I64x", hover_debug_box->key.u64[0])); p.y += 20.f; dr_text(font, 12.f, 0, 0, FNT_RasterFlag_Hinted, p, v4f32(1, 1, 1, 1), push_str8f(scratch.arena, "string: '%S'", hover_debug_box->string)); @@ -10641,6 +10682,19 @@ rd_init(CmdLine *cmdln) rd_state->drag_drop_regs = push_array(rd_state->drag_drop_arena, RD_Regs, 1); rd_state->top_regs = &rd_state->base_regs; + // rjf: set up update check http ring & send request + { + rd_state->update_check_http_ring = guarded_ring_alloc(arena, KB(8)); + HTTP_RequestParams p = + { + .id = 1, + .method = HTTP_Method_Get, + .url = s("https://api.github.com/repos/EpicGamesExt/raddebugger/releases/latest"), + .user_agent = s("raddebugger"), + }; + http_push_request(rd_state->update_check_http_ring, &p, 0); + } + // rjf: set up schemas { rd_state->cfg_schema_table = push_array(rd_state->arena, CFG_SchemaTable, 1); @@ -11043,6 +11097,33 @@ rd_frame(void) MemoryZeroStruct(&rd_state->cmd_outputs); } + ////////////////////////////// + //- rjf: check for updates + // + if(!rd_state->got_update_check) + { + Temp scratch = scratch_begin(0, 0); + HTTP_Response response = {0}; + if(http_pop_response(scratch.arena, rd_state->update_check_http_ring, &response, 0)) + { + rd_state->got_update_check = 1; + MD_Node *root = md_tree_from_string(scratch.arena, response.body)->first; + MD_Node *html_url = md_child_from_string(root, s("html_url"), 0); + String8 newest_release_url = html_url->first->string; + U64 tag_pos = str8_find_needle(newest_release_url, 0, s("tag/v"), 0); + String8 tag_name = str8_skip(newest_release_url, tag_pos); + U64 suffix_pos = str8_find_needle(tag_name, 0, s("-"), 0); + String8 version_name = str8_prefix(tag_name, suffix_pos); + U64 release_version = version_from_str8(version_name); + U64 current_version = Version(BUILD_VERSION_MAJOR, BUILD_VERSION_MINOR, BUILD_VERSION_PATCH); + if(current_version < release_version) + { + rd_state->newer_update_available = 1; + } + } + scratch_end(scratch); + } + ////////////////////////////// //- rjf: iterate all tabs, touch their view-states // @@ -11082,6 +11163,7 @@ rd_frame(void) ////////////////////////////// //- rjf: apply debug info config trees -> loaded debug info cache // + ProfScope("apply debug info config trees -> loaded debug info cache") { U64 current_update_tick_idx = update_tick_idx(); @@ -12883,7 +12965,8 @@ rd_frame(void) { rd_cmd(RD_CmdKind_PushQuery, .do_implicit_root = 1, - .do_lister = info->query.expr.size != 0); + .do_lister = (info->query.expr.size != 0), + .expr = info->query.expr); } }break; diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 235c122c..e592b2e6 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -394,6 +394,11 @@ struct RD_State S32 frame_depth; U64 frame_eval_memread_endt_us; + // rjf: update checker + B32 got_update_check; + B32 newer_update_available; + GuardedRing *update_check_http_ring; + // rjf: config bucket paths Arena *user_path_arena; String8 user_path; diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 5d4f8d49..8f1326eb 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,7 @@ //////////////////////////////// //~ rjf: post-0.9.26 TODO notes // +// [ ] unwinding crash - f5 on bp in w32_http_status_callback to repro // [ ] jeff stepping bug // [ ] wassim memory bug // [ ] switch off spoofs for step-over @@ -309,6 +310,8 @@ #include "minidump/minidump_parse.h" #include "mdesk/mdesk.h" #include "window_manager/window_manager_inc.h" +#include "http/http_inc.h" +#include "symbol_server/symbol_server_inc.h" #include "config/config_inc.h" #include "content/content.h" #include "file_stream/file_stream.h" @@ -366,6 +369,8 @@ #include "minidump/minidump_parse.c" #include "mdesk/mdesk.c" #include "window_manager/window_manager_inc.c" +#include "http/http_inc.c" +#include "symbol_server/symbol_server_inc.c" #include "config/config_inc.c" #include "content/content.c" #include "file_stream/file_stream.c" @@ -468,8 +473,8 @@ ipc_signaler_thread__entry_point(void *p) U64 available_size = (sizeof(ipc_s2m_ring_buffer) - unconsumed_size); if(available_size >= sizeof(U64)+sizeof(msg.size)) { - ipc_s2m_ring_write_pos += ring_write_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, &msg.size); - ipc_s2m_ring_write_pos += ring_write(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, msg.str, msg.size); + ipc_s2m_ring_write_pos += wrapped_write_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, &msg.size); + ipc_s2m_ring_write_pos += wrapped_write(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, msg.str, msg.size); break; } cond_var_wait(ipc_s2m_ring_cv, ipc_s2m_ring_mutex, max_U64); @@ -659,10 +664,10 @@ entry_point(CmdLine *cmd_line) { consumed = 1; ipc_command_frame = 1; - ipc_s2m_ring_read_pos += ring_read_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, &msg.size); + ipc_s2m_ring_read_pos += wrapped_read_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, &msg.size); msg.size = Min(msg.size, unconsumed_size); msg.str = push_array(scratch.arena, U8, msg.size); - ipc_s2m_ring_read_pos += ring_read(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, msg.str, msg.size); + ipc_s2m_ring_read_pos += wrapped_read(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, msg.str, msg.size); } } if(consumed) diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 85189195..6dd2aab3 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2543,12 +2543,12 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) } ////////////////////////////// - //- rjf: unpack cursor info + //- rjf: unpack cursor info / fill regs // + rd_regs()->prefer_disasm = 1; if(!is_loading && has_disasm) { U64 off = dasm_line_array_code_off_from_idx(&dasm_info.lines, rd_regs()->cursor.line-1); - rd_regs()->prefer_disasm = 1; rd_regs()->vaddr = range.min+off; rd_regs()->vaddr_range = r1u64(range.min+off, range.min+off); rd_regs()->voff_range = d_voff_range_from_vaddr_range(dasm_module, rd_regs()->vaddr_range); diff --git a/src/symbol_server/symbol_server.c b/src/symbol_server/symbol_server.c new file mode 100644 index 00000000..ae447aab --- /dev/null +++ b/src/symbol_server/symbol_server.c @@ -0,0 +1,2 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) diff --git a/src/symbol_server/symbol_server.h b/src/symbol_server/symbol_server.h new file mode 100644 index 00000000..bc8ef932 --- /dev/null +++ b/src/symbol_server/symbol_server.h @@ -0,0 +1,10 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef SYMBOL_SERVER_H +#define SYMBOL_SERVER_H + +internal void smsv_init(void); +internal String8 smsv_local_path_from_key(Arena *arena, String8 module_name, String8 dbg_name, Guid guid, U64 age); + +#endif // SYMBOL_SERVER_H diff --git a/src/symbol_server/symbol_server_inc.c b/src/symbol_server/symbol_server_inc.c new file mode 100644 index 00000000..ca6cf968 --- /dev/null +++ b/src/symbol_server/symbol_server_inc.c @@ -0,0 +1,9 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#include "symbol_server.c" +#if OS_WINDOWS +# include "win32/symbol_server/win32_symbol_server.c" +#else +# include "symbol_server_stub.c" +#endif diff --git a/src/symbol_server/symbol_server_inc.h b/src/symbol_server/symbol_server_inc.h new file mode 100644 index 00000000..8edabf00 --- /dev/null +++ b/src/symbol_server/symbol_server_inc.h @@ -0,0 +1,14 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef SYMBOL_SERVER_INC_H +#define SYMBOL_SERVER_INC_H + +#include "symbol_server.h" +#if OS_WINDOWS +# include "win32/symbol_server/win32_symbol_server.h" +#else +# include "symbol_server_stub.h" +#endif + +#endif // SYMBOL_SERVER_INC_H diff --git a/src/symbol_server/symbol_server_stub.c b/src/symbol_server/symbol_server_stub.c new file mode 100644 index 00000000..4284f3ee --- /dev/null +++ b/src/symbol_server/symbol_server_stub.c @@ -0,0 +1,13 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +smsv_init(void) +{ +} + +internal String8 +smsv_local_path_from_key(Arena *arena, String8 module_name, String8 dbg_name, Guid guid, U64 age) +{ + return s(""); +} diff --git a/src/symbol_server/symbol_server_stub.h b/src/symbol_server/symbol_server_stub.h new file mode 100644 index 00000000..61ddc1c9 --- /dev/null +++ b/src/symbol_server/symbol_server_stub.h @@ -0,0 +1,7 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef SYMBOL_SERVER_STUB_H +#define SYMBOL_SERVER_STUB_H + +#endif // SYMBOL_SERVER_STUB_H diff --git a/src/ui/ui_basic_widgets.c b/src/ui/ui_basic_widgets.c index 8864f285..dffd3c34 100644 --- a/src/ui/ui_basic_widgets.c +++ b/src/ui/ui_basic_widgets.c @@ -1289,6 +1289,8 @@ ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_ran UI_Flags(UI_BoxFlag_DrawBorder|disabled_flags) UI_TextAlignment(UI_TextAlign_Center) UI_Font(ui_icon_font()) + UI_TextRasterFlags(FNT_RasterFlag_Smooth) + UI_TagF("weak") { String8 arrow_string = ui_icon_string_from_kind(axis == Axis2_X ? UI_IconKind_LeftArrow : UI_IconKind_UpArrow); min_scroll_sig = ui_buttonf("%S##_min_scroll_%i", arrow_string, axis); @@ -1339,6 +1341,8 @@ ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_ran UI_Flags(UI_BoxFlag_DrawBorder|disabled_flags) UI_TextAlignment(UI_TextAlign_Center) UI_Font(ui_icon_font()) + UI_TextRasterFlags(FNT_RasterFlag_Smooth) + UI_TagF("weak") { String8 arrow_string = ui_icon_string_from_kind(axis == Axis2_X ? UI_IconKind_RightArrow : UI_IconKind_DownArrow); max_scroll_sig = ui_buttonf("%S##_max_scroll_%i", arrow_string, axis); diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index 1d9f8e1e..79945203 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1942,30 +1942,12 @@ w32_entry_point_caller(int argc, WCHAR **wargv) { String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx); String8 string = str8_from_16(arena, string16); - if(str8_match(string, s("_NT_SYMBOL_PATH="), StringMatchFlag_RightSideSloppy)) - { - info->symbol_cache_path = str8_skip(string, 16); - info->symbol_cache_path = str8_skip_chop_whitespace(info->symbol_cache_path); - } str8_list_push(arena, &info->environment, string); start_idx = idx+1; } } } } - if(info->symbol_cache_path.size == 0) - { - Temp scratch = scratch_begin(0, 0); - U64 size = KB(32); - U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_LOCAL_APPDATA, 0, 0, (WCHAR*)buffer))) - { - String8 local_appdata = str8_from_16(scratch.arena, str16_cstring(buffer)); - info->symbol_cache_path = str8f(arena, "%S\\Temp\\SymbolCache", local_appdata); - - } - scratch_end(scratch); - } } //- rjf: set up entity storage diff --git a/src/win32/http/win32_http.c b/src/win32/http/win32_http.c new file mode 100644 index 00000000..59cebb50 --- /dev/null +++ b/src/win32/http/win32_http.c @@ -0,0 +1,501 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Status Callback + +internal void +w32_http_status_callback(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, void *lpvStatusInformation, DWORD dwStatusInformationLength) +{ + W32_HTTP_Request *req = (W32_HTTP_Request *)dwContext; + B32 reloop = 1; + switch(dwInternetStatus) + { + default:{reloop = 0;}break; + case WINHTTP_CALLBACK_STATUS_REQUEST_ERROR: + { + ins_atomic_u32_eval_assign(&req->status, W32_HTTP_RequestStatus_Failed); + }break; + case WINHTTP_CALLBACK_STATUS_REQUEST_SENT: + { + ins_atomic_u32_eval_cond_assign(&req->status, W32_HTTP_RequestStatus_Sent, W32_HTTP_RequestStatus_PendingSend); + }break; + case WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE: + { + req->next_body_piece = 0; + req->next_body_piece_size = 0; + ins_atomic_u32_eval_cond_assign(&req->status, W32_HTTP_RequestStatus_Recvd, W32_HTTP_RequestStatus_PendingRecv); + }break; + case WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE: + { + DWORD *size_ptr = (DWORD *)lpvStatusInformation; + req->next_body_piece_size = size_ptr[0]; + if(size_ptr[0] != 0) + { + ins_atomic_u32_eval_assign(&req->status, W32_HTTP_RequestStatus_DataSized); + } + else + { + ins_atomic_u32_eval_assign(&req->status, W32_HTTP_RequestStatus_Done); + } + }break; + case WINHTTP_CALLBACK_STATUS_READ_COMPLETE: + { + req->next_body_piece_size = dwStatusInformationLength; + ins_atomic_u32_eval_assign(&req->status, W32_HTTP_RequestStatus_Recvd); + }break; + } + if(reloop) + { + ins_atomic_u32_eval_assign(&async_loop_again, 1); + cond_var_broadcast(async_tick_start_cond_var); + } +} + +//////////////////////////////// +//~ rjf: @per_os_impl Top-Level Layer Calls + +internal void +http_init(void) +{ + Arena *arena = arena_alloc(); + w32_http_state = push_array(arena, W32_HTTP_State, 1); + w32_http_state->arena = arena; + w32_http_state->request_ring = guarded_ring_alloc(arena, MB(1)); + for EachElement(idx, w32_http_state->active_requests) + { + w32_http_state->active_requests[idx].arena = arena_alloc(); + } + w32_http_state->hSession = WinHttpOpen(0, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC); + WinHttpSetStatusCallback(w32_http_state->hSession, w32_http_status_callback, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0); +} + +internal void +http_async_tick(void) +{ + //- rjf: pop requests, fill active request slots + if(lane_idx() == 0) + { + for(;;) + { + Temp scratch = scratch_begin(0, 0); + + //- rjf: find a free active request slot + U64 free_slot_num = 0; + for EachElement(idx, w32_http_state->active_requests) + { + if(!w32_http_state->active_requests[idx].active) + { + free_slot_num = idx+1; + break; + } + } + + //- rjf: if we got one -> pop request data + String8 request_data = {0}; + if(free_slot_num != 0) + { + RingGuard guard = guarded_ring_open(w32_http_state->request_ring); + guarded_ring_try_read_struct(&guard, &request_data.size); + if(request_data.size != 0) + { + request_data.str = push_array(scratch.arena, U8, request_data.size); + guarded_ring_read_or_wait(&guard, request_data.size, request_data.str, max_U64); + } + guarded_ring_close(&guard); + } + + //- rjf: deserialize + GuardedRing *out_ring = 0; + HTTP_RequestParams params = {0}; + if(request_data.size != 0) + { + U64 off = 0; + off += str8_deserial_read_struct(request_data, off, &out_ring); + off += str8_deserial_read_struct(request_data, off, ¶ms.id); + off += str8_deserial_read_struct(request_data, off, ¶ms.method); + off += str8_deserial_read_struct(request_data, off, ¶ms.url.size); + params.url = str8_substr(request_data, r1u64(off, off+params.url.size)); + off += params.url.size; + off += str8_deserial_read_struct(request_data, off, ¶ms.body.size); + params.body = str8_substr(request_data, r1u64(off, off+params.body.size)); + off += params.body.size; + off += str8_deserial_read_struct(request_data, off, ¶ms.user_agent.size); + params.user_agent = str8_substr(request_data, r1u64(off, off+params.user_agent.size)); + off += params.user_agent.size; + off += str8_deserial_read_struct(request_data, off, ¶ms.authorization.size); + params.authorization = str8_substr(request_data, r1u64(off, off+params.authorization.size)); + off += params.authorization.size; + off += str8_deserial_read_struct(request_data, off, ¶ms.content_type.size); + params.content_type = str8_substr(request_data, r1u64(off, off+params.content_type.size)); + off += params.content_type.size; + } + + //- rjf: fill active request slot + W32_HTTP_Request *req = 0; + if(free_slot_num != 0 && request_data.size != 0) + { + req = &w32_http_state->active_requests[free_slot_num-1]; + req->active = 1; + arena_clear(req->arena); + req->out_ring = out_ring; + req->id = params.id; + req->status = W32_HTTP_RequestStatus_Null; + } + + //- rjf: kick off request + if(req != 0) + { + B32 good = 0; + + //- rjf: unpack + HTTP_Method method = params.method; + String8 url = params.url; + String8 body = params.body; + String8 user_agent = params.user_agent; + String8 authorization = params.authorization; + String8 content_type = params.content_type; + + //- rjf: extract URL info + String8 url_protocol_part = {0}; + String8 url_port_part = {0}; + String8 url_hostname_part = {0}; + String8 url_path_part = {0}; + { + U64 protocol_delimiter_pos = str8_find_needle(url, 0, s("://"), 0); + U64 post_protocol_pos = 0; + if(protocol_delimiter_pos < url.size) + { + post_protocol_pos = protocol_delimiter_pos+3; + url_protocol_part = str8_prefix(url, post_protocol_pos); + } + U64 last_colon_pos = str8_find_needle(url, post_protocol_pos, s(":"), 0); + if(last_colon_pos < url.size) + { + url_port_part = str8_skip(url, last_colon_pos+1); + } + U64 first_non_protocol_slash_pos = str8_find_needle(url, post_protocol_pos, s("/"), 0); + if(first_non_protocol_slash_pos < url.size) + { + url_hostname_part = str8_prefix(url, first_non_protocol_slash_pos); + url_hostname_part = str8_skip(url_hostname_part, post_protocol_pos); + url_path_part = str8_skip(url, first_non_protocol_slash_pos); + } + else + { + url_hostname_part = str8_skip(url, post_protocol_pos); + } + } + + //- rjf: convert url parts to connection parameters + U16 port = INTERNET_DEFAULT_HTTPS_PORT; + String16 hostname16 = {0}; + { + if(url_port_part.size != 0) + { + port = (U16)u64_from_str8(url_port_part, 10); + } + else if(str8_match(url_protocol_part, s("https://"), StringMatchFlag_CaseInsensitive)) + { + port = INTERNET_DEFAULT_HTTPS_PORT; + } + else if(str8_match(url_protocol_part, s("http://"), StringMatchFlag_CaseInsensitive)) + { + port = INTERNET_DEFAULT_HTTP_PORT; + } + else if(str8_match(url_protocol_part, s("ftp://"), StringMatchFlag_CaseInsensitive)) + { + port = 21; + } + else if(str8_match(url_protocol_part, s("ssh://"), StringMatchFlag_CaseInsensitive)) + { + port = 22; + } + hostname16 = str16_from_8(scratch.arena, url_hostname_part); + } + + //- rjf: convert method to verb wchar + WCHAR *verb = L"GET"; + switch(method) + { + default: + case HTTP_Method_Get: {verb = L"GET";}break; + case HTTP_Method_Head: {verb = L"HEAD";}break; + case HTTP_Method_Post: {verb = L"POST";}break; + case HTTP_Method_Put: {verb = L"PUT";}break; + case HTTP_Method_Delete: {verb = L"DELETE";}break; + case HTTP_Method_Connect: {verb = L"CONNECT";}break; + case HTTP_Method_Options: {verb = L"OPTIONS";}break; + case HTTP_Method_Trace: {verb = L"TRACE";}break; + case HTTP_Method_Patch: {verb = L"PATCH";}break; + } + + //- rjf: convert url parts to request parameters + WCHAR *path_name = L""; + if(url_path_part.size != 0) + { + String16 url_path_part16 = str16_from_8(scratch.arena, url_path_part); + path_name = (WCHAR *)url_path_part16.str; + } + + //- rjf: unpack body params + String16 header16 = {0}; + { + String8List header_strings = {0}; + if(user_agent.size != 0) { str8_list_pushf(scratch.arena, &header_strings, "User-Agent: %S\n", user_agent); } + if(authorization.size != 0) { str8_list_pushf(scratch.arena, &header_strings, "Authorization: %S\n", authorization); } + if(content_type.size != 0) { str8_list_pushf(scratch.arena, &header_strings, "Content-Type: %S\n", content_type); } + String8 header = str8_list_join(scratch.arena, &header_strings, 0); + header16 = str16_from_8(scratch.arena, header); + } + + //- rjf: convert body/header info to winhttp expected params + WCHAR *header = WINHTTP_NO_ADDITIONAL_HEADERS; + U64 header_size = 0; + void *optional = WINHTTP_NO_REQUEST_DATA; + U64 optional_size = 0; + if(header16.size != 0) + { + header = (WCHAR *)header16.str; + header_size = header16.size; + } + if(body.size != 0) + { + String8 body_copy = str8_copy(req->arena, body); + optional = body_copy.str; + optional_size = body_copy.size; + } + + //- rjf: open connection + HINTERNET hConnect = 0; + if(w32_http_state->hSession != 0) + { + hConnect = WinHttpConnect(w32_http_state->hSession, (WCHAR *)hostname16.str, port, 0); + good = (hConnect != 0); + } + + //- rjf: open request + HINTERNET hRequest = 0; + if(good) + { + hRequest = WinHttpOpenRequest(hConnect, verb, path_name, 0, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); + good = (hRequest != 0); + } + + //- rjf: fill info + if(good) + { + req->status = W32_HTTP_RequestStatus_PendingSend; + } + else + { + req->status = W32_HTTP_RequestStatus_Failed; + } + req->hConnect = hConnect; + req->hRequest = hRequest; + + //- rjf: send request + if(good) + { + WinHttpSendRequest(hRequest, header, header_size, optional, optional_size, optional_size, (DWORD_PTR)req); + } + } + + scratch_end(scratch); + if(free_slot_num == 0 || request_data.size == 0) + { + break; + } + } + } + lane_sync(); + + //- rjf: kick off receives + { + Rng1U64 range = lane_range(ArrayCount(w32_http_state->active_requests)); + for EachInRange(idx, range) + { + W32_HTTP_Request *req = &w32_http_state->active_requests[idx]; + if(req->active && ins_atomic_u32_eval(&req->status) == W32_HTTP_RequestStatus_Sent) + { + ins_atomic_u32_eval_assign(&req->status, W32_HTTP_RequestStatus_PendingRecv); + WinHttpReceiveResponse(req->hRequest, 0); + } + } + } + + //- rjf: kick off body size queries + { + Rng1U64 range = lane_range(ArrayCount(w32_http_state->active_requests)); + for EachInRange(idx, range) + { + W32_HTTP_Request *req = &w32_http_state->active_requests[idx]; + if(req->active && ins_atomic_u32_eval(&req->status) == W32_HTTP_RequestStatus_Recvd) + { + if(req->next_body_piece_size != 0) + { + str8_list_push(req->arena, &req->finished_body_pieces, str8((U8 *)req->next_body_piece, req->next_body_piece_size)); + } + ins_atomic_u32_eval_assign(&req->status, W32_HTTP_RequestStatus_PendingDataSize); + WinHttpQueryDataAvailable(req->hRequest, 0); + } + } + } + + //- rjf: kick off body reads + { + Rng1U64 range = lane_range(ArrayCount(w32_http_state->active_requests)); + for EachInRange(idx, range) + { + W32_HTTP_Request *req = &w32_http_state->active_requests[idx]; + if(req->active && ins_atomic_u32_eval(&req->status) == W32_HTTP_RequestStatus_DataSized) + { + req->next_body_piece = push_array(req->arena, U8, req->next_body_piece_size); + ins_atomic_u32_eval_assign(&req->status, W32_HTTP_RequestStatus_PendingRead); + WinHttpReadData(req->hRequest, req->next_body_piece, req->next_body_piece_size, 0); + } + } + } + + //- rjf: complete requests + { + Rng1U64 range = lane_range(ArrayCount(w32_http_state->active_requests)); + for EachInRange(idx, range) + { + W32_HTTP_Request *req = &w32_http_state->active_requests[idx]; + W32_HTTP_RequestStatus status = ins_atomic_u32_eval(&req->status); + if(req->active && + (status == W32_HTTP_RequestStatus_Done || + status == W32_HTTP_RequestStatus_Failed)) + { + Temp scratch = scratch_begin(0, 0); + B32 good = (status == W32_HTTP_RequestStatus_Done); + + //- rjf: unpack + HINTERNET hRequest = req->hRequest; + + //- rjf: read response code + HTTP_StatusCode code = 0; + if(good) + { + DWORD status_code = 0; + DWORD status_code_size = sizeof(status_code); + WinHttpQueryHeaders(hRequest, + WINHTTP_QUERY_STATUS_CODE|WINHTTP_QUERY_FLAG_NUMBER, + WINHTTP_HEADER_NAME_BY_INDEX, + &status_code, &status_code_size, WINHTTP_NO_HEADER_INDEX); + code = status_code; + } + + //- rjf: serialize response + String8 response_data = {0}; + U64 response_data_min_size = sizeof(U64) + sizeof(U64) + sizeof(HTTP_StatusCode) + sizeof(U64); + U64 response_data_max_size = req->out_ring->ring->size; + B32 response_is_possible = (response_data_min_size < response_data_max_size); + if(response_is_possible) + { + U64 body_size = req->finished_body_pieces.total_size; + String8List pieces = {0}; + str8_list_push(scratch.arena, &pieces, str8_struct(&req->id)); + str8_list_push(scratch.arena, &pieces, str8_struct(&code)); + str8_list_push(scratch.arena, &pieces, str8_struct(&body_size)); + str8_list_concat_in_place(&pieces, &req->finished_body_pieces); + U64 data_size = pieces.total_size; + str8_list_push_front(scratch.arena, &pieces, str8_struct(&data_size)); + if(data_size + sizeof(U64) > response_data_max_size) + { + U64 overkill = data_size + sizeof(U64) - response_data_max_size; + data_size -= overkill; + } + response_data = str8_list_join(scratch.arena, &pieces, 0); + response_data.size = data_size + sizeof(U64); + } + + //- rjf: write response + if(response_is_possible) + { + RingGuard g = guarded_ring_open(req->out_ring); + guarded_ring_write_string_or_wait(&g, response_data, max_U64); + guarded_ring_close(&g); + } + + //- rjf: free this request slot + req->active = 0; + arena_clear(req->arena); + MemoryZeroStruct(&req->finished_body_pieces); + req->next_body_piece = 0; + req->next_body_piece_size = 0; + WinHttpCloseHandle(req->hConnect); + WinHttpCloseHandle(req->hRequest); + + scratch_end(scratch); + } + } + } +} + +//////////////////////////////// +//~ rjf: @per_os_impl I/O Ring Functions + +internal B32 +http_push_request(GuardedRing *out_ring, HTTP_RequestParams *params, U64 endt_us) +{ + Temp scratch = scratch_begin(0, 0); + B32 result = 0; + + // rjf: serialize + String8 data = {0}; + { + String8List pieces = {0}; + str8_list_push(scratch.arena, &pieces, str8_struct(&out_ring)); + str8_list_push(scratch.arena, &pieces, str8_struct(¶ms->id)); + str8_list_push(scratch.arena, &pieces, str8_struct(¶ms->method)); + str8_list_push(scratch.arena, &pieces, str8_struct(¶ms->url.size)); + str8_list_push(scratch.arena, &pieces, params->url); + str8_list_push(scratch.arena, &pieces, str8_struct(¶ms->body.size)); + str8_list_push(scratch.arena, &pieces, params->body); + str8_list_push(scratch.arena, &pieces, str8_struct(¶ms->user_agent.size)); + str8_list_push(scratch.arena, &pieces, params->user_agent); + str8_list_push(scratch.arena, &pieces, str8_struct(¶ms->authorization.size)); + str8_list_push(scratch.arena, &pieces, params->authorization); + str8_list_push(scratch.arena, &pieces, str8_struct(¶ms->content_type.size)); + str8_list_push(scratch.arena, &pieces, params->content_type); + U64 data_size = pieces.total_size; + str8_list_push_front(scratch.arena, &pieces, str8_struct(&data_size)); + data = str8_list_join(scratch.arena, &pieces, 0); + } + + // rjf: write + if(data.size < w32_http_state->request_ring->ring->size) + { + RingGuard g = guarded_ring_open(w32_http_state->request_ring); + result = guarded_ring_write_string_or_wait(&g, data, endt_us); + guarded_ring_close(&g); + } + + scratch_end(scratch); + return result; +} + +internal B32 +http_pop_response(Arena *arena, GuardedRing *out_ring, HTTP_Response *response_out, U64 endt_us) +{ + U64 data_size = 0; + RingGuard g = guarded_ring_open(out_ring); + B32 result = guarded_ring_read_struct_or_wait(&g, &data_size, endt_us); + if(result) + { + String8 data = {0}; + data.size = data_size; + data.str = push_array(arena, U8, data.size); + guarded_ring_read_or_wait(&g, data.size, data.str, max_U64); + U64 off = 0; + off += str8_deserial_read_struct(data, off, &response_out->id); + off += str8_deserial_read_struct(data, off, &response_out->code); + off += str8_deserial_read_struct(data, off, &response_out->body.size); + response_out->body.str = push_array(arena, U8, response_out->body.size); + off += str8_deserial_read(data, off, response_out->body.str, response_out->body.size, 1); + } + guarded_ring_close(&g); + return result; +} diff --git a/src/win32/http/win32_http.h b/src/win32/http/win32_http.h new file mode 100644 index 00000000..337c37b8 --- /dev/null +++ b/src/win32/http/win32_http.h @@ -0,0 +1,58 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef WIN32_HTTP_H +#define WIN32_HTTP_H + +#include +#pragma comment(lib, "winhttp") + +typedef enum W32_HTTP_RequestStatus +{ + W32_HTTP_RequestStatus_Null, + W32_HTTP_RequestStatus_PendingSend, + W32_HTTP_RequestStatus_Sent, + W32_HTTP_RequestStatus_PendingRecv, + W32_HTTP_RequestStatus_Recvd, + W32_HTTP_RequestStatus_PendingDataSize, + W32_HTTP_RequestStatus_DataSized, + W32_HTTP_RequestStatus_PendingRead, + W32_HTTP_RequestStatus_Done, + W32_HTTP_RequestStatus_Failed, +} +W32_HTTP_RequestStatus; + +typedef struct W32_HTTP_Request W32_HTTP_Request; +struct W32_HTTP_Request +{ + B32 active; + Arena *arena; + GuardedRing *out_ring; + U64 id; + W32_HTTP_RequestStatus status; + HINTERNET hConnect; + HINTERNET hRequest; + void *optional; // NOTE(rjf): must persist with in-flight requests + U64 optional_size; + String8List finished_body_pieces; + void *next_body_piece; + U64 next_body_piece_size; +}; + +typedef struct W32_HTTP_State W32_HTTP_State; +struct W32_HTTP_State +{ + Arena *arena; + HINTERNET hSession; + GuardedRing *request_ring; + W32_HTTP_Request active_requests[16]; +}; + +global W32_HTTP_State *w32_http_state = 0; + +//////////////////////////////// +//~ rjf: Status Callback + +internal void w32_http_status_callback(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, void *lpvStatusInformation, DWORD dwStatusInformationLength); + +#endif // WIN32_HTTP_H diff --git a/src/win32/symbol_server/win32_symbol_server.c b/src/win32/symbol_server/win32_symbol_server.c new file mode 100644 index 00000000..0fa06df6 --- /dev/null +++ b/src/win32/symbol_server/win32_symbol_server.c @@ -0,0 +1,114 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +internal void +smsv_init(void) +{ + Arena *arena = arena_alloc(); + w32_smsv_state = push_array(arena, W32_SMSV_State, 1); + w32_smsv_state->arena = arena; + { + // rjf: extract parameterizations from _NT_SYMBOL_PATH + { + // rjf: get rules string from environment + String8 rules = {0}; + for EachNode(n, String8Node, get_process_info()->environment.first) + { + String8 string = n->string; + if(str8_match(string, s("_NT_SYMBOL_PATH="), StringMatchFlag_RightSideSloppy)) + { + rules = str8_skip(string, 16); + } + } + + // rjf: parse rules string + { + Temp scratch = scratch_begin(0, 0); + if(str8_match(rules, s("srv*"), StringMatchFlag_RightSideSloppy)) + { + String8List parts = str8_split(scratch.arena, rules, (U8 *)"*", 1, 0); + for EachNode(n, String8Node, parts.first) + { + PathStyle style = path_style_from_str8(n->string); + if(w32_smsv_state->symbol_cache_path.size != 0 && style == PathStyle_WindowsAbsolute) + { + w32_smsv_state->symbol_cache_path = n->string; + } + else if(str8_match(n->string, s("https://"), StringMatchFlag_RightSideSloppy) || + str8_match(n->string, s("http://"), StringMatchFlag_RightSideSloppy)) + { + str8_list_push(arena, &w32_smsv_state->symbol_server_urls, n->string); + } + else if(str8_match(n->string, s("\\\\"), StringMatchFlag_RightSideSloppy)) + { + // TODO(rjf): network share; currently unsupported + } + } + } + else + { + w32_smsv_state->symbol_cache_path = str8_skip_chop_whitespace(rules); + } + scratch_end(scratch); + } + } + + // rjf: always fall back to public MS server + { + String8 public_ms_server = s("https://msdl.microsoft.com/download/symbols"); + B32 public_ms_server_already_present = 0; + for EachNode(n, String8Node, w32_smsv_state->symbol_server_urls.first) + { + if(str8_match(public_ms_server, n->string, 0)) + { + public_ms_server_already_present = 1; + break; + } + } + if(!public_ms_server_already_present) + { + str8_list_push(arena, &w32_smsv_state->symbol_server_urls, public_ms_server); + } + } + + // rjf fall back to using local appdata temp symbol cache folder + if(w32_smsv_state->symbol_cache_path.size == 0) + { + Temp scratch = scratch_begin(0, 0); + U64 size = KB(32); + U16 *buffer = push_array_no_zero(scratch.arena, U16, size); + if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_LOCAL_APPDATA, 0, 0, (WCHAR*)buffer))) + { + String8 local_appdata = str8_from_16(scratch.arena, str16_cstring(buffer)); + w32_smsv_state->symbol_cache_path = str8f(arena, "%S\\Temp\\SymbolCache", local_appdata); + } + scratch_end(scratch); + } + } +} + +internal String8 +smsv_local_path_from_key(Arena *arena, String8 module_name, String8 dbg_name, Guid guid, U64 age) +{ + String8 result = {0}; + Temp scratch = scratch_begin(&arena, 1); + { + // rjf: form unique identifier based on guid + String8 debug_info_unique_identifier = {0}; + { + debug_info_unique_identifier = str8f(scratch.arena, "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x", + guid.data1, guid.data2, guid.data3, guid.data4[0], guid.data4[1], guid.data4[2], guid.data4[3], guid.data4[4], guid.data4[5], guid.data4[6], guid.data4[7], age); + } + + // rjf: form full path + if(debug_info_unique_identifier.size != 0) + { + // TODO(rjf): assuming 'stripped' for now + String8 symbol_cache_path = w32_smsv_state->symbol_cache_path; + String8 path = str8f(scratch.arena, "%S/%S/%S/stripped/%S", symbol_cache_path, module_name, debug_info_unique_identifier, dbg_name); + result = path_normalized_from_string(arena, path); + } + } + scratch_end(scratch); + return result; +} diff --git a/src/win32/symbol_server/win32_symbol_server.h b/src/win32/symbol_server/win32_symbol_server.h new file mode 100644 index 00000000..fbab9932 --- /dev/null +++ b/src/win32/symbol_server/win32_symbol_server.h @@ -0,0 +1,17 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef WIN32_SYMBOL_SERVER_H +#define WIN32_SYMBOL_SERVER_H + +typedef struct W32_SMSV_State W32_SMSV_State; +struct W32_SMSV_State +{ + Arena *arena; + String8 symbol_cache_path; + String8List symbol_server_urls; +}; + +global W32_SMSV_State *w32_smsv_state = 0; + +#endif // WIN32_SYMBOL_SERVER_H diff --git a/test2.project b/test2.project new file mode 100644 index 00000000..efb3fb81 --- /dev/null +++ b/test2.project @@ -0,0 +1,2 @@ +// raddbg 0.9.27 project file + From 2d6260fc68c89a827a3da2a38d6c27c1b80de38c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 8 Jun 2026 11:13:07 -0700 Subject: [PATCH 741/850] remove dummy test file --- test2.project | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 test2.project diff --git a/test2.project b/test2.project deleted file mode 100644 index efb3fb81..00000000 --- a/test2.project +++ /dev/null @@ -1,2 +0,0 @@ -// raddbg 0.9.27 project file - From 536ca53d186bf21caa0299d95038231a17e92161 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 8 Jun 2026 11:26:17 -0700 Subject: [PATCH 742/850] rdi_from_pdb: sketch out paths for LF_ALIAS --- src/rdi_from_pdb/rdi_from_pdb.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index f3632ffa..69a3aa5b 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -2110,6 +2110,14 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U8 *name_ptr = (U8 *)(lf_enum+1); name = str8_cstring_capped(name_ptr, itype_leaf_opl); }break; + + //- rjf: ALIAS + case CV_LeafKind_ALIAS: + { + CV_LeafAlias *lf = (CV_LeafAlias *)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; } } @@ -2708,6 +2716,25 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } }break; + //- rjf: alias + case CV_LeafKind_ALIAS: + { + // rjf: unpack leaf + CV_LeafAlias *lf = (CV_LeafAlias *)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Alias; + dst_type->name = name; + dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype); + if(dst_type->direct_type != 0) + { + dst_type->byte_size = dst_type->direct_type->byte_size; + } + }break; + //- rjf: UNION case CV_LeafKind_UNION: { From b22f9f2d8b6f4a2727046b19a010653b74c4534b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 8 Jun 2026 17:32:07 -0700 Subject: [PATCH 743/850] checkpoint on symbol server --- project.raddbg | 6 + src/base/base_entry_point.c | 3 + src/base/base_thread_context.c | 1 - src/dbg_engine/dbg_engine_ctrl.c | 4 +- src/dbg_info/dbg_info.c | 24 +- src/dbg_info/dbg_info.h | 1 + src/http/http.c | 18 + src/http/http.h | 6 + src/pdb/pdb_parse.c | 44 ++- src/pdb/pdb_parse.h | 1 + src/raddbg/raddbg_core.c | 34 +- src/raddbg/raddbg_core.h | 2 + src/raddbg/raddbg_main.c | 29 ++ src/rdi_from_pdb/rdi_from_pdb.c | 97 ++++- src/rdi_from_pdb/rdi_from_pdb.h | 1 + src/symbol_server/symbol_server.h | 11 +- src/symbol_server/symbol_server_stub.c | 14 +- src/win32/http/win32_http.c | 152 +++++--- src/win32/http/win32_http.h | 2 + src/win32/symbol_server/win32_symbol_server.c | 335 +++++++++++++++++- src/win32/symbol_server/win32_symbol_server.h | 50 +++ 21 files changed, 736 insertions(+), 99 deletions(-) diff --git a/project.raddbg b/project.raddbg index 6f67590f..c9bf248d 100644 --- a/project.raddbg +++ b/project.raddbg @@ -47,3 +47,9 @@ target: working_directory: build arguments: "--bin --quiet --rdi --out:C:/devel/raddebugger_stable/build/radbin.rdi --thread_count:1 C:/devel/raddebugger_stable/build/radbin.exe" } +target: +{ + executable: "build/raddbg.exe" + working_directory: "build/" + arguments: "--bin --rdi C:\\SymbolCache\\ntdll.pdb\\180BF1B90AA75697D0EFEA5E5630AC7E1\\ntdll.pdb --thread_count=1" +} diff --git a/src/base/base_entry_point.c b/src/base/base_entry_point.c index f05a9e39..a08a50b5 100644 --- a/src/base/base_entry_point.c +++ b/src/base/base_entry_point.c @@ -224,6 +224,9 @@ async_thread_entry_point(void *params) #if defined(HTTP_H) http_async_tick(); #endif +#if defined(SYMBOL_SERVER_H) + smsv_async_tick(); +#endif #if defined(DBG_INFO_H) di_async_tick(); #endif diff --git a/src/base/base_thread_context.c b/src/base/base_thread_context.c index d87471e6..42163610 100644 --- a/src/base/base_thread_context.c +++ b/src/base/base_thread_context.c @@ -79,7 +79,6 @@ tctx_get_scratch(Arena **conflicts, U64 count) break; } } - Assert(result); return result; } diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 1b4081a2..98a49899 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -2685,10 +2685,12 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM ////////////////////////////// //- rjf: no found debug info path -> try to fall back on symbol server // +#if 0 if(initial_debug_info_path.size == 0) { - initial_debug_info_path = smsv_local_path_from_key(arena, str8_skip_last_slash(module_info->module_path), str8_skip_last_slash(module_info->debug_info_path), module_info->debug_info_guid, module_info->debug_info_age); + initial_debug_info_path = smsv_local_path_from_key(arena, str8_skip_last_slash(module_info->debug_info_path), module_info->debug_info_guid, module_info->debug_info_age); } +#endif ////////////////////////////// //- rjf: write 1 at attachment marker, to signify attachment diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 9e6519e9..30acce03 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -680,8 +680,22 @@ di_async_tick(void) } } + //- rjf: check with the symbol server to see if we are actively downloading O.G. + B32 og_is_downloading = 0; + { + B32 file_is_present = (properties_from_file_path(og_path).modified != 0); + if(!file_is_present) + { + SMSV_Status status = smsv_status_from_local_path(og_path); + if(status == SMSV_Status_Pending) + { + og_is_downloading = 1; + } + } + } + //- rjf: analyze O.G. debug info - if(!t->og_analyzed) + if(!t->og_analyzed && !og_is_downloading) { t->og_analyzed = 1; File file = file_open(AccessFlag_ShareRead|AccessFlag_Read, og_path); @@ -714,7 +728,7 @@ di_async_tick(void) } //- rjf: determine if RDI is stale - if(!t->rdi_analyzed) + if(!t->rdi_analyzed && !og_is_downloading) { t->rdi_analyzed = 1; File file = file_open(AccessFlag_ShareRead|AccessFlag_Read, rdi_path); @@ -737,7 +751,7 @@ di_async_tick(void) B32 rdi_is_stale = t->rdi_is_stale; //- rjf: calculate thread counts for conversion processes - if(!og_is_rdi && rdi_is_stale && t->thread_count == 0) + if(!og_is_rdi && rdi_is_stale && t->thread_count == 0 && !og_is_downloading) { U64 thread_count = 1; U64 max_thread_count = get_system_info()->logical_processor_count/2; @@ -768,7 +782,7 @@ di_async_tick(void) //- rjf: if this conversion will overwrite an RDI we already have in cache, // then we need to evict the old one from the cache. - B32 ready_to_launch_conversion = (threads_available && !og_is_rdi && rdi_is_stale && t->thread_count != 0 && t->status != DI_LoadTaskStatus_Active); + B32 ready_to_launch_conversion = (!og_is_downloading && threads_available && !og_is_rdi && rdi_is_stale && t->thread_count != 0 && t->status != DI_LoadTaskStatus_Active); if(ready_to_launch_conversion) { U64 path2key_hash = u64_hash_from_str8(og_path); @@ -863,7 +877,7 @@ di_async_tick(void) //- rjf: if the RDI for this task is not stale, then we're already done - mark this // task as done & prepped for storing into the cache - if(!rdi_is_stale) + if(!rdi_is_stale && !og_is_downloading) { t->status = DI_LoadTaskStatus_Done; } diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 0cff1bea..096d0b2a 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -140,6 +140,7 @@ struct DI_LoadTask B32 og_analyzed; B32 og_is_rdi; U64 og_size; + B32 og_is_downloading; B32 rdi_analyzed; B32 rdi_is_stale; diff --git a/src/http/http.c b/src/http/http.c index db9ec6ca..5358979b 100644 --- a/src/http/http.c +++ b/src/http/http.c @@ -31,3 +31,21 @@ http_status_kind_from_code(HTTP_StatusCode code) } return kind; } + +//////////////////////////////////////////////////////////////// +//~ rjf: Synchronous Request Helper + +internal HTTP_Response +http_request(Arena *arena, HTTP_RequestParams *params) +{ + HTTP_Response response = {0}; + Temp scratch = scratch_begin(&arena, 1); + GuardedRing *gr = guarded_ring_alloc(scratch.arena, KB(64)); + { + http_push_request(gr, params, max_U64); + http_pop_response(arena, gr, &response, max_U64); + } + guarded_ring_release(gr); + scratch_end(scratch); + return response; +} diff --git a/src/http/http.h b/src/http/http.h index d52179cd..a6cb3d96 100644 --- a/src/http/http.h +++ b/src/http/http.h @@ -146,6 +146,7 @@ typedef struct HTTP_Response HTTP_Response; struct HTTP_Response { U64 id; + B32 has_more; HTTP_StatusCode code; String8 body; }; @@ -155,6 +156,11 @@ struct HTTP_Response internal HTTP_StatusKind http_status_kind_from_code(HTTP_StatusCode code); +//////////////////////////////////////////////////////////////// +//~ rjf: Synchronous Request Helper + +internal HTTP_Response http_request(Arena *arena, HTTP_RequestParams *params); + //////////////////////////////////////////////////////////////// //~ rjf: @per_os_impl Top-Level Layer Calls diff --git a/src/pdb/pdb_parse.c b/src/pdb/pdb_parse.c index e8833598..f42f3d16 100644 --- a/src/pdb/pdb_parse.c +++ b/src/pdb/pdb_parse.c @@ -5,17 +5,21 @@ //~ PDB Parser Functions internal PDB_Info* -pdb_info_from_data(Arena *arena, String8 data){ +pdb_info_from_data(Arena *arena, String8 data) +{ ProfBegin("pdb_info_from_data"); + PDB_Info *result = push_array(arena, PDB_Info, 1); // get header PDB_InfoHeader *header = 0; - if (data.size >= sizeof(*header)){ + if(data.size >= sizeof(*header)) + { header = (PDB_InfoHeader *)data.str; } - PDB_Info *result = 0; - if (header != 0){ + // rjf: parse info given header + if(header != 0) + { // read guid Guid *auth_guid = 0; U32 after_auth_guid_off = sizeof(*header); @@ -122,7 +126,6 @@ pdb_info_from_data(Arena *arena, String8 data){ } ProfEnd(); - return(result); } @@ -757,6 +760,37 @@ pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, COFF_Sect return result; } +internal PDB_CompUnitContribution * +pdb_comp_unit_contribution_from_voff__binary_search(PDB_CompUnitContributionArray *array, U64 voff) +{ + PDB_CompUnitContribution *result = 0; + if(array->count != 0) + { + U64 first_idx = 0; + U64 last_idx = array->count-1; + for(;first_idx < last_idx;) + { + U64 mid_idx = (last_idx + first_idx) / 2; + U64 mid_voff_first = array->contributions[mid_idx].voff_first; + U64 mid_voff_opl = array->contributions[mid_idx].voff_opl; + if(voff < mid_voff_first) + { + last_idx = mid_idx; + } + else if(mid_voff_opl <= voff) + { + first_idx = mid_idx+1; + } + else + { + result = &array->contributions[mid_idx]; + break; + } + } + } + return result; +} + //////////////////////////////// //~ PDB Dbi Functions diff --git a/src/pdb/pdb_parse.h b/src/pdb/pdb_parse.h index a01b2592..0170b692 100644 --- a/src/pdb/pdb_parse.h +++ b/src/pdb/pdb_parse.h @@ -212,6 +212,7 @@ internal PDB_CompUnitArray* pdb_comp_unit_array_from_data(Arena *arena, String8 module_info_data); internal PDB_CompUnitContributionArray pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 seccontrib_data, COFF_SectionHeaderArray sections); +internal PDB_CompUnitContribution *pdb_comp_unit_contribution_from_voff__binary_search(PDB_CompUnitContributionArray *array, U64 voff); //////////////////////////////// //~ PDB Dbi Functions diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index edb3c81f..3e5b5ed4 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10684,7 +10684,8 @@ rd_init(CmdLine *cmdln) // rjf: set up update check http ring & send request { - rd_state->update_check_http_ring = guarded_ring_alloc(arena, KB(8)); + rd_state->update_check_arena = arena_alloc(); + rd_state->update_check_http_ring = guarded_ring_alloc(rd_state->update_check_arena, KB(8)); HTTP_RequestParams p = { .id = 1, @@ -11102,12 +11103,24 @@ rd_frame(void) // if(!rd_state->got_update_check) { - Temp scratch = scratch_begin(0, 0); - HTTP_Response response = {0}; - if(http_pop_response(scratch.arena, rd_state->update_check_http_ring, &response, 0)) + // rjf: pop all responses that we can + B32 done = 0; + for(HTTP_Response response = {0}; http_pop_response(rd_state->update_check_arena, rd_state->update_check_http_ring, &response, 0);) + { + str8_list_push(rd_state->update_check_arena, &rd_state->update_check_response_body_pieces, response.body); + if(response.has_more == 0) + { + done = 1; + } + } + + // rjf: if we're done -> parse response & determine if there is a new version + if(done) { rd_state->got_update_check = 1; - MD_Node *root = md_tree_from_string(scratch.arena, response.body)->first; + Temp scratch = scratch_begin(0, 0); + String8 response_body = str8_list_join(rd_state->update_check_arena, &rd_state->update_check_response_body_pieces, 0); + MD_Node *root = md_tree_from_string(scratch.arena, response_body)->first; MD_Node *html_url = md_child_from_string(root, s("html_url"), 0); String8 newest_release_url = html_url->first->string; U64 tag_pos = str8_find_needle(newest_release_url, 0, s("tag/v"), 0); @@ -11120,8 +11133,13 @@ rd_frame(void) { rd_state->newer_update_available = 1; } + guarded_ring_release(rd_state->update_check_http_ring); + arena_release(rd_state->update_check_arena); + rd_state->update_check_arena = 0; + rd_state->update_check_http_ring = 0; + MemoryZeroStruct(&rd_state->update_check_response_body_pieces); + scratch_end(scratch); } - scratch_end(scratch); } ////////////////////////////// @@ -17380,7 +17398,9 @@ rd_frame(void) D_Entity *module = d_entity_from_handle(evt->entity); D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); String8 new_path = debug_info_path->string; - if(new_path.size != 0 && file_path_exists(new_path)) + B32 file_exists = file_path_exists(new_path); + B32 file_is_pending = (!file_exists ? smsv_status_from_local_path(new_path) == SMSV_Status_Pending : 0); + if(new_path.size != 0 && (file_exists || file_is_pending)) { CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("debug_info")); B32 path_found = 0; diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index e592b2e6..8be923bb 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -397,6 +397,8 @@ struct RD_State // rjf: update checker B32 got_update_check; B32 newer_update_available; + Arena *update_check_arena; + String8List update_check_response_body_pieces; GuardedRing *update_check_http_ring; // rjf: config bucket paths diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 8f1326eb..0e896bd8 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -5,6 +5,7 @@ //~ rjf: post-0.9.26 TODO notes // // [ ] unwinding crash - f5 on bp in w32_http_status_callback to repro +// [ ] unwinding in jit page - fail // [ ] jeff stepping bug // [ ] wassim memory bug // [ ] switch off spoofs for step-over @@ -514,6 +515,34 @@ entry_point(CmdLine *cmd_line) { Temp scratch = scratch_begin(0, 0); + //- TODO(rjf): test symbol server download +#if 0 + { + GuardedRing *out_ring = guarded_ring_alloc(scratch.arena, KB(64)); + { + HTTP_RequestParams p = + { + .id = 1, + .method = HTTP_Method_Get, + .url = s("https://msdl.microsoft.com/download/symbols/ntdll.pdb/E84AF4A1E3CDFABC99A41209581EB6861/ntdll.pdb"), + }; + http_push_request(out_ring, &p, max_U64); + String8List pieces = {0}; + for(HTTP_Response r = {0}; http_pop_response(scratch.arena, out_ring, &r, max_U64);) + { + str8_list_push(scratch.arena, &pieces, r.body); + if(r.has_more == 0) + { + int x = 0; + break; + } + } + int x = 0; + } + guarded_ring_release(out_ring); + } +#endif + //- rjf: unpack command line arguments ExecMode exec_mode = ExecMode_Normal; B32 auto_run = 0; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 69a3aa5b..5d7c3cd2 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -397,22 +397,18 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) { Temp scratch = scratch_begin(&arena, 1); - Arena *scratch_conflicts[2] = { scratch.arena, arena }; - ////////////////////////////////////////////////////////////// //- rjf: do base MSF parse // MSF_Parsed *msf = 0; ProfScope("do base MSF parse") { - Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); - // rjf: setup output buckets MSF_RawStreamTable *msf_raw_stream_table = 0; U64 *msf_stream_take_counter = 0; if(lane_idx() == 0) { - msf_raw_stream_table = msf_raw_stream_table_from_data(scratch2.arena, params->input_pdb_data); + msf_raw_stream_table = msf_raw_stream_table_from_data(scratch.arena, params->input_pdb_data); msf = push_array(scratch.arena, MSF_Parsed, 1); msf->page_size = msf_raw_stream_table->page_size; msf->page_count = msf_raw_stream_table->total_page_count; @@ -437,8 +433,6 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } } lane_sync(); - - scratch_end(scratch2); } lane_sync(); @@ -677,7 +671,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) // U64 exe_voff_max = 0; { - Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); + Temp scratch2 = scratch_begin(&scratch.arena, 1); // rjf: set up U64 *lane_voff_maxes = 0; @@ -827,7 +821,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) //- rjf: do wide gather ProfScope("do wide gather") { - Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); + Temp scratch2 = scratch_begin(&scratch.arena, 1); //- rjf: build local hash table to dedup files within this lane U64 hit_path_slots_count = 4096; @@ -1758,7 +1752,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } //- rjf: walk dependent types, push to chain - Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); + Temp scratch2 = scratch_begin(&scratch.arena, 1); P2R_TypeIdChain start_walk_task = {0, itype}; P2R_TypeIdChain *first_walk_task = &start_walk_task; P2R_TypeIdChain *last_walk_task = &start_walk_task; @@ -1767,7 +1761,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) walk_task = walk_task->next) { CV_TypeId walk_itype = itype_fwd_map[walk_task->itype] ? itype_fwd_map[walk_task->itype] : walk_task->itype; - if(walk_itype < tpi_leaf->itype_first) + if(walk_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= walk_itype) { continue; } @@ -2041,7 +2035,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) U64 all_namespace_slots_count = 0; ProfScope("gather all unique namespaces from types") { - Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); + Temp scratch2 = scratch_begin(&scratch.arena, 1); //- rjf: find all unique namespaces on this lane U64 namespace_slots_count = (U64)itype_opl / lane_count(); @@ -2874,7 +2868,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) RDIM_SubsetFlag_Types)) ProfScope("gather all namespaces which are only encoded in symbols (not found in types)") { - Temp scratch2 = scratch_begin(scratch_conflicts, ArrayCount(scratch_conflicts)); + Temp scratch2 = scratch_begin(&scratch.arena, 1); U64 lane_namespace_slots_count = 4096; String8Node **lane_namespace_slots = push_array(scratch2.arena, String8Node *, lane_namespace_slots_count); @@ -3537,6 +3531,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(n->voff == voff) { link_name = n->name; + ins_atomic_u64_inc_eval(&n->referencing_symbol_count); break; } } @@ -4183,6 +4178,82 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) } lane_sync(); + ////////////////////////////////////////////////////////////// + //- rjf: produce stub procedures from all pub32 symbols + // + if(lane_idx() == 0) + { + CV_SymParsed *sym = all_syms[0]; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + RDIM_Unit *sym_unit = &all_units_ptr->first->v[0]; + RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; + RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; + RDIM_ScopeChunkList *sym_scopes = &sym_unit->scopes; + switch(iter.kind) + { + default:{}break; + case CV_SymKind_PUB32: + { + // rjf: unpack record + CV_SymPub32 *pub32 = (CV_SymPub32 *)iter.struct_base; + String8 name = str8_cstring_capped(pub32+1, iter.opl); + COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= coff_sections.count) ? &coff_sections.v[pub32->sec-1] : 0; + U64 voff = 0; + if(section != 0) + { + voff = section->voff + pub32->off; + } + + // rjf: determine if this pub32 was covered by another symbol record + B32 was_in_other_record = 0; + { + U64 hash = p2r_hash_from_voff(voff); + U64 slot_idx = hash%link_name_map->buckets_count; + for(P2R_LinkNameNode *n = link_name_map->buckets[slot_idx]; n != 0; n = n->next) + { + if(n->voff == voff) + { + was_in_other_record = (n->referencing_symbol_count != 0); + break; + } + } + } + + // rjf: find compilation unit contribution to determine pub32's size + U64 voff_opl = voff+1; + if(!was_in_other_record) + { + PDB_CompUnitContribution *contrib = pdb_comp_unit_contribution_from_voff__binary_search(comp_unit_contributions, voff); + if(contrib != 0) + { + voff_opl = contrib->voff_opl; + } + } + + // rjf: if this pub32 was *not* covered by another symbol record, build a symbol for it + if(!was_in_other_record) + { + B32 is_procedure = (pub32->flags & (CV_Pub32Flag_Code|CV_Pub32Flag_Function)); + RDIM_SymbolChunkList *symbols = is_procedure ? sym_procedures : sym_global_variables; + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, symbols, 64); + symbol->name = name; + symbol->link_name = name; + if(is_procedure) + { + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, 64); + scope->symbol = symbol; + RDIM_Rng1U64 range = {voff, voff_opl}; + rdim_scope_push_voff_range(arena, sym_scopes, scope, range); + symbol->root_scope = scope; + } + } + }break; + } + } + } + lane_sync(); + ////////////////////////////////////////////////////////////// //- rjf: upgrade namespace nodes with scopes info, if they match a scope // diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index ae7e102b..3b2236cb 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -29,6 +29,7 @@ struct P2R_LinkNameNode P2R_LinkNameNode *next; U64 voff; String8 name; + U64 referencing_symbol_count; }; typedef struct P2R_LinkNameMap P2R_LinkNameMap; diff --git a/src/symbol_server/symbol_server.h b/src/symbol_server/symbol_server.h index bc8ef932..b0f38b5d 100644 --- a/src/symbol_server/symbol_server.h +++ b/src/symbol_server/symbol_server.h @@ -4,7 +4,16 @@ #ifndef SYMBOL_SERVER_H #define SYMBOL_SERVER_H +typedef enum SMSV_Status +{ + SMSV_Status_Null, + SMSV_Status_Pending, +} +SMSV_Status; + internal void smsv_init(void); -internal String8 smsv_local_path_from_key(Arena *arena, String8 module_name, String8 dbg_name, Guid guid, U64 age); +internal void smsv_async_tick(void); +internal String8 smsv_local_path_from_key(Arena *arena, String8 dbg_name, Guid guid, U64 age); +internal SMSV_Status smsv_status_from_local_path(String8 path); #endif // SYMBOL_SERVER_H diff --git a/src/symbol_server/symbol_server_stub.c b/src/symbol_server/symbol_server_stub.c index 4284f3ee..db1e737b 100644 --- a/src/symbol_server/symbol_server_stub.c +++ b/src/symbol_server/symbol_server_stub.c @@ -6,8 +6,20 @@ smsv_init(void) { } +internal void +smsv_async_tick(void) +{ +} + internal String8 -smsv_local_path_from_key(Arena *arena, String8 module_name, String8 dbg_name, Guid guid, U64 age) +smsv_local_path_from_key(Arena *arena, String8 dbg_name, Guid guid, U64 age) { return s(""); } + +internal SMSV_Status +smsv_status_from_local_path(String8 path) +{ + SMSV_Status status = SMSV_Status_Null; + return status; +} diff --git a/src/win32/http/win32_http.c b/src/win32/http/win32_http.c index 59cebb50..10239c31 100644 --- a/src/win32/http/win32_http.c +++ b/src/win32/http/win32_http.c @@ -293,6 +293,7 @@ http_async_tick(void) } req->hConnect = hConnect; req->hRequest = hRequest; + req->arena_start_body_read_pos = arena_pos(req->arena); //- rjf: send request if(good) @@ -324,6 +325,95 @@ http_async_tick(void) } } + //- rjf: push response output + { + Rng1U64 range = lane_range(ArrayCount(w32_http_state->active_requests)); + for EachInRange(idx, range) + { + W32_HTTP_Request *req = &w32_http_state->active_requests[idx]; + W32_HTTP_RequestStatus status = ins_atomic_u32_eval(&req->status); + if(req->active && (status == W32_HTTP_RequestStatus_Done || + status == W32_HTTP_RequestStatus_Failed || + req->finished_body_pieces.total_size >= req->out_ring->ring->size/2)) + { + Temp scratch = scratch_begin(0, 0); + + // rjf: figure out status code + if(req->status_code == 0) + { + DWORD status_code = 0; + DWORD status_code_size = sizeof(status_code); + WinHttpQueryHeaders(req->hRequest, + WINHTTP_QUERY_STATUS_CODE|WINHTTP_QUERY_FLAG_NUMBER, + WINHTTP_HEADER_NAME_BY_INDEX, + &status_code, &status_code_size, WINHTTP_NO_HEADER_INDEX); + req->status_code = status_code; + } + + // rjf: join all currently read body contents + String8 body = str8_list_join(scratch.arena, &req->finished_body_pieces, 0); + + // rjf: clear current body output + arena_pop_to(req->arena, req->arena_start_body_read_pos); + MemoryZeroStruct(&req->finished_body_pieces); + + // rjf: compute size per record header + U64 max_record_size = req->out_ring->ring->size; + U64 bytes_per_record_header = sizeof(U64) + sizeof(U64) + sizeof(B32) + sizeof(HTTP_StatusCode); + + // rjf: push response records + for(U64 off = 0, next_off = 0; off <= body.size; off = next_off) + { + // rjf: determine how much of the body we can fit into this record + U64 body_data_size = (body.size - off); + if(bytes_per_record_header + body_data_size > max_record_size) + { + body_data_size = max_record_size - bytes_per_record_header; + } + + // rjf: advance by that amount of the body + next_off = off + body_data_size; + + // rjf: serialize this record + String8 record_data = {0}; + { + String8List pieces = {0}; + U64 record_size = bytes_per_record_header + (next_off - off); + B32 is_last = (next_off == body.size && (status == W32_HTTP_RequestStatus_Done || status == W32_HTTP_RequestStatus_Failed)); + B32 has_more = !is_last; + str8_list_push(scratch.arena, &pieces, str8_struct(&record_size)); + str8_list_push(scratch.arena, &pieces, str8_struct(&req->id)); + str8_list_push(scratch.arena, &pieces, str8_struct(&has_more)); + str8_list_push(scratch.arena, &pieces, str8_struct(&req->status_code)); + str8_list_push(scratch.arena, &pieces, str8_substr(body, r1u64(off, next_off))); + record_data = str8_list_join(scratch.arena, &pieces, 0); + } + + // rjf: push this record + { + // TODO(rjf): can't wait here technically, because we might be waiting for other + // work in the async threads to pop! so we'll just deadlock right here. two options: + // + // (a) http requests need to be on another timeline + // (b) we need to prepare for this to fail & batch it up or something. + // + RingGuard g = guarded_ring_open(req->out_ring); + guarded_ring_write_string_or_wait(&g, record_data, max_U64); + guarded_ring_close(&g); + } + + // rjf: cancel on no movement + if(next_off == off) + { + break; + } + } + + scratch_end(scratch); + } + } + } + //- rjf: kick off body size queries { Rng1U64 range = lane_range(ArrayCount(w32_http_state->active_requests)); @@ -364,62 +454,10 @@ http_async_tick(void) { W32_HTTP_Request *req = &w32_http_state->active_requests[idx]; W32_HTTP_RequestStatus status = ins_atomic_u32_eval(&req->status); - if(req->active && + if(req->active && req->finished_body_pieces.total_size == 0 && req->next_body_piece_size == 0 && (status == W32_HTTP_RequestStatus_Done || status == W32_HTTP_RequestStatus_Failed)) { - Temp scratch = scratch_begin(0, 0); - B32 good = (status == W32_HTTP_RequestStatus_Done); - - //- rjf: unpack - HINTERNET hRequest = req->hRequest; - - //- rjf: read response code - HTTP_StatusCode code = 0; - if(good) - { - DWORD status_code = 0; - DWORD status_code_size = sizeof(status_code); - WinHttpQueryHeaders(hRequest, - WINHTTP_QUERY_STATUS_CODE|WINHTTP_QUERY_FLAG_NUMBER, - WINHTTP_HEADER_NAME_BY_INDEX, - &status_code, &status_code_size, WINHTTP_NO_HEADER_INDEX); - code = status_code; - } - - //- rjf: serialize response - String8 response_data = {0}; - U64 response_data_min_size = sizeof(U64) + sizeof(U64) + sizeof(HTTP_StatusCode) + sizeof(U64); - U64 response_data_max_size = req->out_ring->ring->size; - B32 response_is_possible = (response_data_min_size < response_data_max_size); - if(response_is_possible) - { - U64 body_size = req->finished_body_pieces.total_size; - String8List pieces = {0}; - str8_list_push(scratch.arena, &pieces, str8_struct(&req->id)); - str8_list_push(scratch.arena, &pieces, str8_struct(&code)); - str8_list_push(scratch.arena, &pieces, str8_struct(&body_size)); - str8_list_concat_in_place(&pieces, &req->finished_body_pieces); - U64 data_size = pieces.total_size; - str8_list_push_front(scratch.arena, &pieces, str8_struct(&data_size)); - if(data_size + sizeof(U64) > response_data_max_size) - { - U64 overkill = data_size + sizeof(U64) - response_data_max_size; - data_size -= overkill; - } - response_data = str8_list_join(scratch.arena, &pieces, 0); - response_data.size = data_size + sizeof(U64); - } - - //- rjf: write response - if(response_is_possible) - { - RingGuard g = guarded_ring_open(req->out_ring); - guarded_ring_write_string_or_wait(&g, response_data, max_U64); - guarded_ring_close(&g); - } - - //- rjf: free this request slot req->active = 0; arena_clear(req->arena); MemoryZeroStruct(&req->finished_body_pieces); @@ -427,8 +465,6 @@ http_async_tick(void) req->next_body_piece_size = 0; WinHttpCloseHandle(req->hConnect); WinHttpCloseHandle(req->hRequest); - - scratch_end(scratch); } } } @@ -485,14 +521,16 @@ http_pop_response(Arena *arena, GuardedRing *out_ring, HTTP_Response *response_o B32 result = guarded_ring_read_struct_or_wait(&g, &data_size, endt_us); if(result) { + U64 data_size_minus_size_prefix = data_size - sizeof(data_size); String8 data = {0}; - data.size = data_size; + data.size = data_size_minus_size_prefix; data.str = push_array(arena, U8, data.size); guarded_ring_read_or_wait(&g, data.size, data.str, max_U64); U64 off = 0; off += str8_deserial_read_struct(data, off, &response_out->id); + off += str8_deserial_read_struct(data, off, &response_out->has_more); off += str8_deserial_read_struct(data, off, &response_out->code); - off += str8_deserial_read_struct(data, off, &response_out->body.size); + response_out->body.size = (data.size - off); response_out->body.str = push_array(arena, U8, response_out->body.size); off += str8_deserial_read(data, off, response_out->body.str, response_out->body.size, 1); } diff --git a/src/win32/http/win32_http.h b/src/win32/http/win32_http.h index 337c37b8..c95e4e61 100644 --- a/src/win32/http/win32_http.h +++ b/src/win32/http/win32_http.h @@ -34,6 +34,8 @@ struct W32_HTTP_Request HINTERNET hRequest; void *optional; // NOTE(rjf): must persist with in-flight requests U64 optional_size; + HTTP_StatusCode status_code; + U64 arena_start_body_read_pos; String8List finished_body_pieces; void *next_body_piece; U64 next_body_piece_size; diff --git a/src/win32/symbol_server/win32_symbol_server.c b/src/win32/symbol_server/win32_symbol_server.c index 0fa06df6..7d0eaf29 100644 --- a/src/win32/symbol_server/win32_symbol_server.c +++ b/src/win32/symbol_server/win32_symbol_server.c @@ -7,6 +7,8 @@ smsv_init(void) Arena *arena = arena_alloc(); w32_smsv_state = push_array(arena, W32_SMSV_State, 1); w32_smsv_state->arena = arena; + + // rjf: get symbol server configuration from environment { // rjf: extract parameterizations from _NT_SYMBOL_PATH { @@ -71,24 +73,257 @@ smsv_init(void) } } - // rjf fall back to using local appdata temp symbol cache folder + // rjf fall back to using C:/SymbolCache (or wherever windows is located) if(w32_smsv_state->symbol_cache_path.size == 0) { Temp scratch = scratch_begin(0, 0); U64 size = KB(32); U16 *buffer = push_array_no_zero(scratch.arena, U16, size); - if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_LOCAL_APPDATA, 0, 0, (WCHAR*)buffer))) + if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_SYSTEM, 0, 0, (WCHAR*)buffer))) { - String8 local_appdata = str8_from_16(scratch.arena, str16_cstring(buffer)); - w32_smsv_state->symbol_cache_path = str8f(arena, "%S\\Temp\\SymbolCache", local_appdata); + String8 system32 = str8_from_16(scratch.arena, str16_cstring(buffer)); + String8 containing_drive = str8_prefix(system32, str8_find_needle(system32, 0, s("/"), StringMatchFlag_SlashInsensitive)); + w32_smsv_state->symbol_cache_path = str8f(arena, "%S\\SymbolCache", containing_drive); } scratch_end(scratch); } } + + // rjf: set up task cache + { + w32_smsv_state->task_slots_count = 256; + w32_smsv_state->task_slots = push_array(arena, W32_SMSV_TaskSlot, w32_smsv_state->task_slots_count); + w32_smsv_state->task_stripes = stripe_array_alloc(arena); + } + + // rjf: set up rings + w32_smsv_state->http_response_ring = guarded_ring_alloc(arena, KB(256)); + w32_smsv_state->new_task_ring = guarded_ring_alloc(arena, KB(8)); + w32_smsv_state->retry_arena = arena_alloc(); +} + +internal void +smsv_async_tick(void) +{ + Temp scratch = scratch_begin(0, 0); + + //- rjf: pop new tasks from new task ring, gather them + W32_SMSV_TaskNode *first_request_task = 0; + W32_SMSV_TaskNode *last_request_task = 0; + U64 request_task_count = 0; + if(lane_idx() == 0) + { + for(B32 done = 0;!done;) + { + // rjf: get the next task ID to start + U64 task_id = 0; + { + RingGuard g = guarded_ring_open(w32_smsv_state->new_task_ring); + if(!guarded_ring_try_read_struct(&g, &task_id)) + { + done = 1; + } + guarded_ring_close(&g); + } + + // rjf: gather + if(!done) + { + W32_SMSV_Task *task = (W32_SMSV_Task *)task_id; + W32_SMSV_TaskNode *n = push_array(scratch.arena, W32_SMSV_TaskNode, 1); + n->task = task; + SLLQueuePush(first_request_task, last_request_task, n); + request_task_count += 1; + } + } + } + lane_sync(); + + //- rjf: gather tasks from the retry batch + if(lane_idx() == 0) + { + for(W32_SMSV_TaskNode *t = w32_smsv_state->first_retry_request; t != 0; t = t->next) + { + W32_SMSV_TaskNode *n = push_array(scratch.arena, W32_SMSV_TaskNode, 1); + n->task = t->task; + SLLQueuePush(first_request_task, last_request_task, n); + request_task_count += 1; + } + arena_clear(w32_smsv_state->retry_arena); + w32_smsv_state->first_retry_request = w32_smsv_state->last_retry_request = 0; + } + lane_sync(); + + //- rjf: pop responses -> for any responses that suggest that a particular debug info + // is not present on the server, we need to generate new request nodes for those tasks, + // to fall back to subsequent server URLS. + W32_SMSV_TaskNode *first_finish_task = 0; + W32_SMSV_TaskNode *last_finish_task = 0; + U64 finish_task_count = 0; + if(lane_idx() == 0) + { + for(HTTP_Response r = {0}; http_pop_response(scratch.arena, w32_smsv_state->http_response_ring, &r, 0);) + { + W32_SMSV_Task *task = (W32_SMSV_Task *)r.id; + if(task != 0) + { + if(r.body.size != 0) + { + str8_list_push(task->arena, &task->file_pieces, str8_copy(task->arena, r.body)); + } + if(r.has_more == 0 && task->status != W32_SMSV_TaskStatus_DoneDownloading) + { + task->status = W32_SMSV_TaskStatus_DoneDownloading; + W32_SMSV_TaskNode *n = push_array(scratch.arena, W32_SMSV_TaskNode, 1); + n->task = task; + SLLQueuePush(first_finish_task, last_finish_task, n); + finish_task_count += 1; + } + } + } + } + lane_sync(); + + //- rjf: flatten all request tasks + W32_SMSV_Task **request_tasks = 0; + if(lane_idx() == 0) + { + request_tasks = push_array(scratch.arena, W32_SMSV_Task *, request_task_count); + { + U64 idx = 0; + for EachNode(n, W32_SMSV_TaskNode, first_request_task) + { + request_tasks[idx] = n->task; + idx += 1; + } + } + } + lane_sync_u64(&request_tasks, 0); + + //- rjf: do all request tasks + { + Rng1U64 range = lane_range(request_task_count); + for EachInRange(idx, range) + { + W32_SMSV_Task *task = request_tasks[idx]; + + // rjf: adjust the server URL node that we're using for this task + if(task->status == W32_SMSV_TaskStatus_Failed || task->status == W32_SMSV_TaskStatus_Null) + { + if(task->current_server_url_node == 0) + { + task->current_server_url_node = w32_smsv_state->symbol_server_urls.first; + } + else + { + task->current_server_url_node = task->current_server_url_node->next; + } + } + + // rjf: get server URL + String8 server_url = {0}; + if(task->current_server_url_node != 0) + { + server_url = task->current_server_url_node->string; + } + + // rjf: kick off request if we have a server URL + if(server_url.size != 0) + { + task->status = W32_SMSV_TaskStatus_Requested; + Guid guid = task->guid; + U64 age = task->age; + String8 debug_info_unique_identifier = {0}; + { + debug_info_unique_identifier = str8f(scratch.arena, "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%I64x", + guid.data1, guid.data2, guid.data3, guid.data4[0], guid.data4[1], guid.data4[2], guid.data4[3], guid.data4[4], guid.data4[5], guid.data4[6], guid.data4[7], age); + } + HTTP_RequestParams params = + { + .id = (U64)task, + .method = HTTP_Method_Get, + .url = str8f(scratch.arena, "%S/%S/%S/%S", server_url, task->dbg_name, debug_info_unique_identifier, task->dbg_name), + }; + if(!http_push_request(w32_smsv_state->http_response_ring, ¶ms, 0)) + { + W32_SMSV_TaskNode *n = push_array(w32_smsv_state->retry_arena, W32_SMSV_TaskNode, 1); + SLLQueuePush(w32_smsv_state->first_retry_request, w32_smsv_state->last_retry_request, n); + n->task = task; + ins_atomic_u32_eval_assign(&async_loop_again, 1); + cond_var_broadcast(async_tick_start_cond_var); + } + } + + // rjf: if we don't have a server URL, mark this task as failed + else + { + task->status = W32_SMSV_TaskStatus_Failed; + W32_SMSV_TaskNode *n = push_array(scratch.arena, W32_SMSV_TaskNode, 1); + n->task = task; + SLLQueuePush(first_finish_task, last_finish_task, n); + finish_task_count += 1; + } + } + } + + //- rjf: flatten all finish tasks + W32_SMSV_Task **finish_tasks = 0; + if(lane_idx() == 0) + { + finish_tasks = push_array(scratch.arena, W32_SMSV_Task *, finish_task_count); + { + U64 idx = 0; + for EachNode(n, W32_SMSV_TaskNode, first_finish_task) + { + finish_tasks[idx] = n->task; + idx += 1; + } + } + } + lane_sync_u64(&finish_tasks, 0); + + //- rjf: do all finish tasks + { + Rng1U64 range = lane_range(finish_task_count); + for EachInRange(idx, range) + { + W32_SMSV_Task *task = finish_tasks[idx]; + + // rjf: successful task -> write to local path + if(task->status != W32_SMSV_TaskStatus_Failed) + { + String8 directory = str8_chop_last_slash(task->local_path); + for(U64 slash_pos = 0; slash_pos <= directory.size;) + { + slash_pos = str8_find_needle(directory, slash_pos+1, s("/"), StringMatchFlag_SlashInsensitive); + String8 root_dir = str8_substr(directory, r1u64(0, slash_pos)); + make_directory(root_dir); + if(slash_pos == directory.size) + { + break; + } + } + write_data_list_to_file_path(task->local_path, task->file_pieces); + } + + // rjf: evict task from cache + U64 hash = u64_hash_from_str8(task->local_path); + U64 slot_idx = hash%w32_smsv_state->task_slots_count; + W32_SMSV_TaskSlot *slot = &w32_smsv_state->task_slots[slot_idx]; + Stripe *stripe = stripe_from_slot_idx(&w32_smsv_state->task_stripes, slot_idx); + RWMutexScope(stripe->rw_mutex, 1) + { + DLLRemove(slot->first, slot->last, task); + arena_release(task->arena); + } + } + } + + scratch_end(scratch); } internal String8 -smsv_local_path_from_key(Arena *arena, String8 module_name, String8 dbg_name, Guid guid, U64 age) +smsv_local_path_from_key(Arena *arena, String8 dbg_name, Guid guid, U64 age) { String8 result = {0}; Temp scratch = scratch_begin(&arena, 1); @@ -96,19 +331,103 @@ smsv_local_path_from_key(Arena *arena, String8 module_name, String8 dbg_name, Gu // rjf: form unique identifier based on guid String8 debug_info_unique_identifier = {0}; { - debug_info_unique_identifier = str8f(scratch.arena, "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x", + debug_info_unique_identifier = str8f(scratch.arena, "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%I64x", guid.data1, guid.data2, guid.data3, guid.data4[0], guid.data4[1], guid.data4[2], guid.data4[3], guid.data4[4], guid.data4[5], guid.data4[6], guid.data4[7], age); } // rjf: form full path if(debug_info_unique_identifier.size != 0) { - // TODO(rjf): assuming 'stripped' for now String8 symbol_cache_path = w32_smsv_state->symbol_cache_path; - String8 path = str8f(scratch.arena, "%S/%S/%S/stripped/%S", symbol_cache_path, module_name, debug_info_unique_identifier, dbg_name); + String8 path = str8f(scratch.arena, "%S/%S/%S/%S", symbol_cache_path, dbg_name, debug_info_unique_identifier, dbg_name); result = path_normalized_from_string(arena, path); } + + // rjf: determine if we already have this debug info stored locally + B32 already_cached_locally = (properties_from_file_path(result).modified != 0); + + // rjf: if not cached: record (local path -> download task) mapping + B32 task_is_new = 0; + U64 task_id = 0; + if(!already_cached_locally) + { + U64 hash = u64_hash_from_str8(result); + U64 slot_idx = hash%w32_smsv_state->task_slots_count; + W32_SMSV_TaskSlot *slot = &w32_smsv_state->task_slots[slot_idx]; + Stripe *stripe = stripe_from_slot_idx(&w32_smsv_state->task_stripes, slot_idx); + for(B32 write_mode = 0; write_mode <= 1; write_mode += 1) + { + B32 already_exists = 0; + RWMutexScope(stripe->rw_mutex, write_mode) + { + W32_SMSV_Task *node = 0; + for(W32_SMSV_Task *n = slot->first; n != 0; n = n->next) + { + if(MemoryMatchStruct(&n->guid, &guid)) + { + already_exists = 1; + node = n; + break; + } + } + if(node == 0 && write_mode) + { + Arena *arena = arena_alloc(); + node = push_array(arena, W32_SMSV_Task, 1); + node->arena = arena; + node->local_path = str8_copy(arena, result); + node->dbg_name = str8_copy(arena, dbg_name); + node->guid = guid; + node->age = age; + DLLPushBack(slot->first, slot->last, node); + task_is_new = 1; + task_id = (U64)node; + } + } + if(already_exists) + { + break; + } + } + } + + // rjf: if the task is new -> push request to start task + if(task_is_new) + { + RingGuard g = guarded_ring_open(w32_smsv_state->new_task_ring); + guarded_ring_write_struct_or_wait(&g, &task_id, max_U64); + guarded_ring_close(&g); + ins_atomic_u32_eval_assign(&async_loop_again, 1); + cond_var_broadcast(async_tick_start_cond_var); + } } scratch_end(scratch); return result; } + +internal SMSV_Status +smsv_status_from_local_path(String8 path) +{ + SMSV_Status status = SMSV_Status_Null; + { + Temp scratch = scratch_begin(0, 0); + String8 path_normalized = path_normalized_from_string(scratch.arena, path); + U64 hash = u64_hash_from_str8(path_normalized); + U64 slot_idx = hash%w32_smsv_state->task_slots_count; + W32_SMSV_TaskSlot *slot = &w32_smsv_state->task_slots[slot_idx]; + Stripe *stripe = stripe_from_slot_idx(&w32_smsv_state->task_stripes, slot_idx); + RWMutexScope(stripe->rw_mutex, 0) + { + for(W32_SMSV_Task *n = slot->first; n != 0; n = n->next) + { + if(str8_match(n->local_path, path, 0)) + { + status = SMSV_Status_Pending; + break; + } + } + } + scratch_end(scratch); + } + return status; +} diff --git a/src/win32/symbol_server/win32_symbol_server.h b/src/win32/symbol_server/win32_symbol_server.h index fbab9932..ae9f02a4 100644 --- a/src/win32/symbol_server/win32_symbol_server.h +++ b/src/win32/symbol_server/win32_symbol_server.h @@ -4,12 +4,62 @@ #ifndef WIN32_SYMBOL_SERVER_H #define WIN32_SYMBOL_SERVER_H +typedef enum W32_SMSV_TaskStatus +{ + W32_SMSV_TaskStatus_Null, + W32_SMSV_TaskStatus_Requested, + W32_SMSV_TaskStatus_DoneDownloading, + W32_SMSV_TaskStatus_Failed, +} +W32_SMSV_TaskStatus; + +typedef struct W32_SMSV_Task W32_SMSV_Task; +struct W32_SMSV_Task +{ + W32_SMSV_Task *next; + W32_SMSV_Task *prev; + + // rjf: key / parameters + Arena *arena; + String8 local_path; + String8 dbg_name; + Guid guid; + U64 age; + + // rjf: working state + W32_SMSV_TaskStatus status; + String8Node *current_server_url_node; + String8List file_pieces; +}; + +typedef struct W32_SMSV_TaskNode W32_SMSV_TaskNode; +struct W32_SMSV_TaskNode +{ + W32_SMSV_TaskNode *next; + W32_SMSV_Task *task; +}; + +typedef struct W32_SMSV_TaskSlot W32_SMSV_TaskSlot; +struct W32_SMSV_TaskSlot +{ + W32_SMSV_Task *first; + W32_SMSV_Task *last; +}; + typedef struct W32_SMSV_State W32_SMSV_State; struct W32_SMSV_State { Arena *arena; String8 symbol_cache_path; String8List symbol_server_urls; + U64 task_slots_count; + W32_SMSV_TaskSlot *task_slots; + StripeArray task_stripes; + GuardedRing *http_response_ring; + GuardedRing *new_task_ring; + Arena *retry_arena; + W32_SMSV_TaskNode *first_retry_request; + W32_SMSV_TaskNode *last_retry_request; }; global W32_SMSV_State *w32_smsv_state = 0; From 132751777fc4bd0aeb27594f3de13c96c2153acd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 8 Jun 2026 21:06:44 -0700 Subject: [PATCH 744/850] eliminate unnecessary info in debug engine entity abstraction / demon events; adjust symbol server / debug info loading such that the debug info loader is the one who decides to kick off downloads based on presence in cache path; use cache path as key, unpack info for download requests --- project.raddbg | 8 +- src/dbg_engine/dbg_engine_core.h | 16 +- src/dbg_engine/dbg_engine_ctrl.c | 43 +---- src/dbg_engine/dbg_engine_ctrl.h | 1 - src/dbg_engine/dbg_engine_user.c | 125 ------------- src/dbg_engine/dbg_engine_user.h | 9 +- src/dbg_info/dbg_info.c | 12 +- src/dbg_info/dbg_info.h | 1 - src/http/http.c | 18 -- src/http/http.h | 5 - src/raddbg/raddbg_core.c | 8 +- src/raddbg/raddbg_views.c | 2 +- src/raddbg/raddbg_widgets.c | 59 ++++--- src/symbol_server/symbol_server.h | 2 + src/symbol_server/symbol_server_stub.c | 11 ++ src/win32/http/win32_http.c | 16 +- src/win32/http/win32_http.h | 8 + src/win32/symbol_server/win32_symbol_server.c | 164 +++++++++++------- src/win32/symbol_server/win32_symbol_server.h | 9 +- 19 files changed, 199 insertions(+), 318 deletions(-) diff --git a/project.raddbg b/project.raddbg index c9bf248d..76b56383 100644 --- a/project.raddbg +++ b/project.raddbg @@ -50,6 +50,12 @@ target: target: { executable: "build/raddbg.exe" - working_directory: "build/" + working_directory: build arguments: "--bin --rdi C:\\SymbolCache\\ntdll.pdb\\180BF1B90AA75697D0EFEA5E5630AC7E1\\ntdll.pdb --thread_count=1" } +target: +{ + executable: "build/raddbg.exe" + working_directory: build + arguments: "--bin --rdi --thread_count=1 C:/SymbolCache/kernelbase.pdb/53B51385668728BA4297C9C78EEC92DD1/kernelbase.pdb" +} diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 26a90c6e..7dae3be5 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -102,17 +102,6 @@ struct D_BreakpointList U64 count; }; -//////////////////////////////// -//~ Dynamic Linker Types - -typedef U32 D_TlsModel; -enum -{ - D_TlsModel_Null, - D_TlsModel_WinodwsNt, - D_TlsModel_Gnu -}; - //////////////////////////////// //~ rjf: Entity Types @@ -136,11 +125,8 @@ struct D_Entity U64 timestamp; D_BreakpointFlags bp_flags; String8 string; - D_TlsModel tls_model; - U64 tls_index; - U64 tls_offset; U64 tls_root_vaddr; - OperatingSystem target_os; + OperatingSystem os; D_MsgID src_msg_id; }; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 98a49899..4e7b78d6 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -42,20 +42,6 @@ d_exception_kind_from_dmn(DMN_ExceptionKind kind) return result; } -internal D_TlsModel -d_tls_model_from_dmn(DMN_TlsModel type) -{ - D_TlsModel result = D_TlsModel_Null; - switch(type) - { - default:{}break; - case DMN_TlsModel_Null: {result = D_TlsModel_Null;}break; - case DMN_TlsModel_WinodwsNt: {result = D_TlsModel_WinodwsNt;}break; - case DMN_TlsModel_Gnu: {result = D_TlsModel_Gnu;}break; - } - return result; -} - internal String8 d_string_from_event_kind(D_EventKind kind) { @@ -645,8 +631,7 @@ d_serialized_string_from_event(Arena *arena, D_Event *event, U64 max) str8_serial_push_struct(scratch.arena, &srl, &event->exception_code); str8_serial_push_struct(scratch.arena, &srl, &event->rgba); str8_serial_push_struct(scratch.arena, &srl, &event->bp_flags); - str8_serial_push_struct(scratch.arena, &srl, &event->target_os); - str8_serial_push_struct(scratch.arena, &srl, &event->tls_model); + str8_serial_push_struct(scratch.arena, &srl, &event->os); str8_serial_push_struct(scratch.arena, &srl, &event->tls_index); str8_serial_push_struct(scratch.arena, &srl, &event->tls_offset); String8 string = event->string; @@ -682,8 +667,7 @@ d_event_from_serialized_string(Arena *arena, String8 string) read_off += str8_deserial_read_struct(string, read_off, &event.exception_code); read_off += str8_deserial_read_struct(string, read_off, &event.rgba); read_off += str8_deserial_read_struct(string, read_off, &event.bp_flags); - read_off += str8_deserial_read_struct(string, read_off, &event.target_os); - read_off += str8_deserial_read_struct(string, read_off, &event.tls_model); + read_off += str8_deserial_read_struct(string, read_off, &event.os); read_off += str8_deserial_read_struct(string, read_off, &event.tls_index); read_off += str8_deserial_read_struct(string, read_off, &event.tls_offset); read_off += str8_deserial_read_struct(string, read_off, &event.string.size); @@ -1300,8 +1284,7 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) if(machine != &d_entity_nil) { D_Entity *process = d_entity_alloc(store, machine, D_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id); - process->tls_model = event->tls_model; - process->target_os = event->target_os; + process->os = event->os; process->src_msg_id = event->msg_id; d_entity_equip_string(store, process, event->string); } @@ -1437,8 +1420,6 @@ d_entity_store_apply_events(D_EntityCtxRWStore *store, D_EventList *list) d_entity_equip_string(store, module, event->string); module->timestamp = event->timestamp; module->vaddr_range = event->vaddr_rng; - module->tls_index = event->tls_index; - module->tls_offset = event->tls_offset; D_Entity *first_module = d_entity_child_from_kind(process, D_EntityKind_Module); if(first_module == module && process->string.size == 0) { @@ -1565,7 +1546,7 @@ d_thread_read_reg_block(D_Handle handle, void *reg_block) if(thread_ctx != 0) { Arch arch = thread->arch; - OperatingSystem os = process->target_os; + OperatingSystem os = process->os; result = arch_os_write_reg_block_from_thread_ctx(arch, os, reg_block, thread_ctx); } } @@ -2683,14 +2664,12 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM } ////////////////////////////// - //- rjf: no found debug info path -> try to fall back on symbol server + //- rjf: no found debug info path -> try to fall back on symbol server cache path // -#if 0 if(initial_debug_info_path.size == 0) { initial_debug_info_path = smsv_local_path_from_key(arena, str8_skip_last_slash(module_info->debug_info_path), module_info->debug_info_guid, module_info->debug_info_age); } -#endif ////////////////////////////// //- rjf: write 1 at attachment marker, to signify attachment @@ -3154,8 +3133,7 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D out_evt->entity = d_handle_from_dmn(D_MachineID_Local, event->process); out_evt->arch = event->arch; out_evt->entity_id = event->code; - out_evt->tls_model = d_tls_model_from_dmn(event->tls_model); - out_evt->target_os = OperatingSystem_CURRENT; // TODO: operating system of the remote target machine + out_evt->os = OperatingSystem_CURRENT; // TODO: operating system of the remote target machine d_ctrl_state->process_counter += 1; }break; case DMN_EventKind_CreateThread: @@ -3985,7 +3963,7 @@ d_ctrl_thread__open_crash_dump(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) evt->msg_id = msg->msg_id; evt->entity = process; evt->arch = process_arch; - evt->target_os = process_os; + evt->os = process_os; evt->string = path; } @@ -6064,11 +6042,8 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 dst_e->stack_base = src_e->stack_base; dst_e->timestamp = src_e->timestamp; dst_e->bp_flags = src_e->bp_flags; - dst_e->string = push_str8_copy(scratch.arena, src_e->string); - dst_e->tls_index = src_e->tls_index; - dst_e->tls_offset = src_e->tls_offset; - dst_e->target_os = src_e->target_os; - dst_e->tls_model = src_e->tls_model; + dst_e->string = str8_copy(scratch.arena, src_e->string); + dst_e->os = src_e->os; } if(dst_parent == &d_entity_nil) { diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 1617dfb6..eb2f35e9 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -404,7 +404,6 @@ read_only global D_ModuleInfo d_module_info_nil = {0}; internal U64 d_hash_from_handle(D_Handle handle); internal D_EventCause d_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); internal D_ExceptionKind d_exception_kind_from_dmn(DMN_ExceptionKind kind); -internal D_TlsModel d_tls_model_from_dmn(DMN_TlsModel type); internal String8 d_string_from_event_kind(D_EventKind kind); internal String8 d_string_from_msg_kind(D_MsgKind kind); internal D_EntityKind d_entity_kind_from_string(String8 string); diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 91e55c68..7c7ba17a 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -1326,80 +1326,6 @@ d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num, U return list; } -//////////////////////////////// -//~ rjf: Process/Thread/Module Info Lookups - -internal U64 -d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr) -{ - ProfBeginFunction(); - U64 base_vaddr = 0; - if(!d_ctrl_targets_running()) - { - Temp scratch = scratch_begin(0, 0); - - //- rjf: unpack module info - D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); - U64 addr_size = byte_size_from_arch(process->arch); - - switch(process->tls_model) - { - case D_TlsModel_Null: {}break; - case D_TlsModel_WinodwsNt: - { - // read thread local base pointer out of TEB - U64 thread_local_base = root_vaddr; - U64 tls_addr_array = 0; - D_ProcessMemorySlice tls_addr_array_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_local_base, thread_local_base + addr_size), 0, 0); - String8 tls_array_vaddr_data = tls_addr_array_slice.data; - if(tls_array_vaddr_data.size == addr_size) - { - U64 tls_array_vaddr = 0; - MemoryCopyStr8(&tls_array_vaddr, tls_array_vaddr_data); - - // read thread local storage pointer (array of TLS pointers, one per module) - U64 tls_ptr_vaddr = tls_array_vaddr + module->tls_index * addr_size; - D_ProcessMemorySlice result_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_ptr_vaddr, tls_ptr_vaddr + addr_size), 0, 0); - String8 result_data = result_slice.data; - if(result_data.size == addr_size) - { - MemoryCopyStr8(&base_vaddr, result_data); - } - } - }break; - case D_TlsModel_Gnu: - { - if(module->tls_index > 0) // zero is reserved for the generation counter - { - // read dynamic thread vector pointer (one per dynamic module) - U64 dtv_base = root_vaddr; - U64 dtv_size = addr_size * 2; // union dtv { size_t counter; struct dtv_pointer { void *val, *to_free; }; }; - U64 dtv_pointer_vaddr = dtv_base + module->tls_index * dtv_size; - D_ProcessMemorySlice dtv_pointer_slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(dtv_pointer_vaddr, dtv_pointer_vaddr + dtv_size), 0, 0); - String8 dtv_pointer_data = dtv_pointer_slice.data; - if(dtv_pointer_data.size == dtv_size) - { - U64 dtv_pointer = 0; - MemoryCopyStr8(&dtv_pointer, dtv_pointer_data); - - // verify that TLS block was allocated - U64 tls_dtv_unallocated = addr_size == 4 ? max_U32 : max_U64; - if(dtv_pointer != tls_dtv_unallocated) - { - base_vaddr = dtv_pointer + module->tls_offset; // add tls_offset because DT_NEEDED modules share TLS block with the main exe - } - } - } - }break; - default: {InvalidPath;}break; - } - - scratch_end(scratch); - } - ProfEnd(); - return base_vaddr; -} - //////////////////////////////// //~ rjf: Target Controls @@ -1509,57 +1435,6 @@ d_query_cached_cfa_from_thread_unwind(D_Entity *thread, U64 unwind_count) return cfa; } -internal U64 -d_query_cached_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr) -{ - U64 result = 0; - for(U64 cache_idx = 0; cache_idx < ArrayCount(d_user_state->tls_base_caches); cache_idx += 1) - { - D_RunTLSBaseCache *cache = &d_user_state->tls_base_caches[(d_user_state->tls_base_cache_gen+cache_idx)%ArrayCount(d_user_state->tls_base_caches)]; - if(cache_idx == 0 && cache->slots_count == 0) - { - cache->slots_count = 256; - cache->slots = push_array(cache->arena, D_RunTLSBaseCacheSlot, cache->slots_count); - } - else if(cache->slots_count == 0) - { - break; - } - D_Handle handle = process->handle; - U64 hash = d_hash_from_seed_string(d_hash_from_string(str8_struct(&handle)), str8_struct(&rip_vaddr)); - U64 slot_idx = hash%cache->slots_count; - D_RunTLSBaseCacheSlot *slot = &cache->slots[slot_idx]; - D_RunTLSBaseCacheNode *node = 0; - for(D_RunTLSBaseCacheNode *n = slot->first; n != 0; n = n->hash_next) - { - if(d_handle_match(n->process, handle) && n->root_vaddr == root_vaddr && n->rip_vaddr == rip_vaddr) - { - node = n; - break; - } - } - if(node == 0) - { - U64 tls_base_vaddr = d_tls_base_vaddr_from_process_root_rip(process, root_vaddr, rip_vaddr); - if(tls_base_vaddr != 0) - { - node = push_array(cache->arena, D_RunTLSBaseCacheNode, 1); - SLLQueuePush_N(slot->first, slot->last, node, hash_next); - node->process = handle; - node->root_vaddr = root_vaddr; - node->rip_vaddr = rip_vaddr; - node->tls_base_vaddr = tls_base_vaddr; - } - } - if(node != 0 && node->tls_base_vaddr != 0) - { - result = node->tls_base_vaddr; - break; - } - } - return result; -} - internal E_String2NumMap * d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) { diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index ae9a95d7..0236384d 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -313,8 +313,7 @@ struct D_Event U32 rgba; D_BreakpointFlags bp_flags; String8 string; - OperatingSystem target_os; - D_TlsModel tls_model; + OperatingSystem os; }; typedef struct D_EventNode D_EventNode; @@ -443,11 +442,6 @@ internal D_LineListArray d_lines_array_from_file_path_line_range(Arena *arena, S internal D_LineList d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num, U64 max_voffs_per_line); internal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num, U64 max_voffs_per_line); -//////////////////////////////// -//~ rjf: Process/Thread/Module Info Lookups - -internal U64 d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr); - //////////////////////////////// //~ rjf: Target Controls @@ -473,7 +467,6 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); internal U64 d_query_cached_rip_from_thread(D_Entity *thread); internal U64 d_query_cached_rip_from_thread_unwind(D_Entity *thread, U64 unwind_count); internal U64 d_query_cached_cfa_from_thread_unwind(D_Entity *thread, U64 unwind_count); -internal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr); internal E_String2NumMap *d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); internal E_String2NumMap *d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 30acce03..79c3d77b 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -680,16 +680,22 @@ di_async_tick(void) } } - //- rjf: check with the symbol server to see if we are actively downloading O.G. + //- rjf: kick off symbol server download, or check to see if we are actively downloading O.G. B32 og_is_downloading = 0; { B32 file_is_present = (properties_from_file_path(og_path).modified != 0); if(!file_is_present) { - SMSV_Status status = smsv_status_from_local_path(og_path); - if(status == SMSV_Status_Pending) + String8 symbol_cache_path = smsv_cache_path(); + if(str8_match(symbol_cache_path, og_path, StringMatchFlag_RightSideSloppy|StringMatchFlag_SlashInsensitive)) { og_is_downloading = 1; + smsv_fill_local_path(og_path); + SMSV_Status status = smsv_status_from_local_path(og_path); + if(status == SMSV_Status_Null) + { + og_is_downloading = 0; + } } } } diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 096d0b2a..0cff1bea 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -140,7 +140,6 @@ struct DI_LoadTask B32 og_analyzed; B32 og_is_rdi; U64 og_size; - B32 og_is_downloading; B32 rdi_analyzed; B32 rdi_is_stale; diff --git a/src/http/http.c b/src/http/http.c index 5358979b..db9ec6ca 100644 --- a/src/http/http.c +++ b/src/http/http.c @@ -31,21 +31,3 @@ http_status_kind_from_code(HTTP_StatusCode code) } return kind; } - -//////////////////////////////////////////////////////////////// -//~ rjf: Synchronous Request Helper - -internal HTTP_Response -http_request(Arena *arena, HTTP_RequestParams *params) -{ - HTTP_Response response = {0}; - Temp scratch = scratch_begin(&arena, 1); - GuardedRing *gr = guarded_ring_alloc(scratch.arena, KB(64)); - { - http_push_request(gr, params, max_U64); - http_pop_response(arena, gr, &response, max_U64); - } - guarded_ring_release(gr); - scratch_end(scratch); - return response; -} diff --git a/src/http/http.h b/src/http/http.h index a6cb3d96..24f73a9f 100644 --- a/src/http/http.h +++ b/src/http/http.h @@ -156,11 +156,6 @@ struct HTTP_Response internal HTTP_StatusKind http_status_kind_from_code(HTTP_StatusCode code); -//////////////////////////////////////////////////////////////// -//~ rjf: Synchronous Request Helper - -internal HTTP_Response http_request(Arena *arena, HTTP_RequestParams *params); - //////////////////////////////////////////////////////////////// //~ rjf: @per_os_impl Top-Level Layer Calls diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 3e5b5ed4..2ad9f1c4 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -13066,7 +13066,6 @@ rd_frame(void) str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " exception_code: 0x%I64x\n", (U64)evt.exception_code); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " bp_flags: 0x%I64x\n", (U64)evt.bp_flags); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " string: \"%S\"\n", escaped_from_raw_str8(scratch.arena, evt.string)); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " tls_model: 0x%I64x\n", evt.tls_model); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " explanation: \"%S\"\n", escaped_from_raw_str8(scratch.arena, explanation_string)); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " }\n"); } @@ -17393,14 +17392,13 @@ rd_frame(void) } } }break; - case D_EventKind_NewModule: + case D_EventKind_ModuleDebugInfoPathChange: { D_Entity *module = d_entity_from_handle(evt->entity); D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); String8 new_path = debug_info_path->string; - B32 file_exists = file_path_exists(new_path); - B32 file_is_pending = (!file_exists ? smsv_status_from_local_path(new_path) == SMSV_Status_Pending : 0); - if(new_path.size != 0 && (file_exists || file_is_pending)) + B32 file_exists = 1; // file_path_exists(new_path); + if(new_path.size != 0 && file_exists) { CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit("debug_info")); B32 path_found = 0; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 6dd2aab3..73411fc2 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2268,7 +2268,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) default: { String8 checksum_value = rd_checksum_value_from_hash_kind(scratch.arena, hash, checksum_kind); - file_is_out_of_date = !memory_is_zero(checksum_value.str, checksum_value.size) && !str8_match(checksum_value, checksum_expected, 0); + file_is_out_of_date = checksum_expected.size != 0 && !memory_is_zero(checksum_value.str, checksum_value.size) && !str8_match(checksum_value, checksum_expected, 0); }break; case RDI_ChecksumKind_Timestamp: { diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 3fceac67..fa235759 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -562,39 +562,50 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, D_Entity *entity, B32 include_extr ARCH_Info *arch_info = arch_info_from_arch(entity->arch); B32 call_stack_high_priority = d_handle_match(entity->handle, rd_base_regs()->thread); D_CallStack call_stack = d_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + B32 did_first_in_main_module = 0; B32 did_first_known = 0; + U64 num_pushed = 0; + D_Entity *first_module = d_entity_child_from_kind(process, D_EntityKind_Module); for(U64 idx = 0, limit = 10; - idx < call_stack.frames_count && idx < limit; + idx < call_stack.frames_count && num_pushed < limit; idx += 1) { D_CallStackFrame *f = &call_stack.frames[call_stack.frames_count - 1 - idx]; - U64 rip_vaddr = arch_ip_from_reg_block(arch_info, f->regs); - D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); - U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); - String8 name = {0}; + if(f->inline_depth == 0) { - DI_Key dbgi_key = d_dbgi_key_from_module(module); - RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); - if(rdi != &rdi_parsed_nil) + U64 rip_vaddr = arch_ip_from_reg_block(arch_info, f->regs); + D_Entity *module = d_module_from_process_vaddr(process, rip_vaddr); + if(did_first_in_main_module || module == first_module) { - RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, rip_voff); - name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size); - name = push_str8_copy(arena, name); - } - if(name.size == 0 && did_first_known) - { - name = str8_lit("???"); - } - if(name.size != 0) - { - did_first_known = 1; - dr_fstrs_push_new(arena, &result, ¶ms, name, .size = extras_size, .color = symbol_color); - if(idx+1 < call_stack.frames_count) + did_first_in_main_module = 1; + U64 rip_voff = d_voff_from_vaddr(module, rip_vaddr); + String8 name = {0}; { - dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" > "), .color = secondary_color, .size = extras_size); - if(idx+1 == limit) + DI_Key dbgi_key = d_dbgi_key_from_module(module); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + if(rdi != &rdi_parsed_nil) { - dr_fstrs_push_new(arena, &result, ¶ms, str8_lit("..."), .color = secondary_color, .size = extras_size); + RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, rip_voff); + name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size); + name = push_str8_copy(arena, name); + } + if(name.size == 0 && did_first_known) + { + name = str8_lit("???"); + } + if(name.size != 0) + { + did_first_known = 1; + num_pushed += 1; + dr_fstrs_push_new(arena, &result, ¶ms, name, .size = extras_size, .color = symbol_color); + if(idx+1 < call_stack.frames_count) + { + dr_fstrs_push_new(arena, &result, ¶ms, str8_lit(" > "), .color = secondary_color, .size = extras_size); + if(num_pushed+1 == limit) + { + dr_fstrs_push_new(arena, &result, ¶ms, str8_lit("..."), .color = secondary_color, .size = extras_size); + } + } } } } diff --git a/src/symbol_server/symbol_server.h b/src/symbol_server/symbol_server.h index b0f38b5d..f41b9cc2 100644 --- a/src/symbol_server/symbol_server.h +++ b/src/symbol_server/symbol_server.h @@ -13,7 +13,9 @@ SMSV_Status; internal void smsv_init(void); internal void smsv_async_tick(void); +internal String8 smsv_cache_path(void); internal String8 smsv_local_path_from_key(Arena *arena, String8 dbg_name, Guid guid, U64 age); +internal void smsv_fill_local_path(String8 path); internal SMSV_Status smsv_status_from_local_path(String8 path); #endif // SYMBOL_SERVER_H diff --git a/src/symbol_server/symbol_server_stub.c b/src/symbol_server/symbol_server_stub.c index db1e737b..bbd71e35 100644 --- a/src/symbol_server/symbol_server_stub.c +++ b/src/symbol_server/symbol_server_stub.c @@ -11,12 +11,23 @@ smsv_async_tick(void) { } +internal String8 +smsv_cache_path(void) +{ + return s(""); +} + internal String8 smsv_local_path_from_key(Arena *arena, String8 dbg_name, Guid guid, U64 age) { return s(""); } +internal void +smsv_fill_local_path(String8 path) +{ +} + internal SMSV_Status smsv_status_from_local_path(String8 path) { diff --git a/src/win32/http/win32_http.c b/src/win32/http/win32_http.c index 10239c31..0f6c3059 100644 --- a/src/win32/http/win32_http.c +++ b/src/win32/http/win32_http.c @@ -390,20 +390,20 @@ http_async_tick(void) } // rjf: push this record + B32 push_failed = 0; { - // TODO(rjf): can't wait here technically, because we might be waiting for other - // work in the async threads to pop! so we'll just deadlock right here. two options: - // - // (a) http requests need to be on another timeline - // (b) we need to prepare for this to fail & batch it up or something. - // RingGuard g = guarded_ring_open(req->out_ring); - guarded_ring_write_string_or_wait(&g, record_data, max_U64); + if(!guarded_ring_write_string_or_wait(&g, record_data, 0)) + { + push_failed = 1; + String8 unpushed_body_piece = str8_substr(body, r1u64(off, next_off)); + str8_list_push(req->arena, &req->finished_body_pieces, str8_copy(req->arena, unpushed_body_piece)); + } guarded_ring_close(&g); } // rjf: cancel on no movement - if(next_off == off) + if(next_off == off || push_failed) { break; } diff --git a/src/win32/http/win32_http.h b/src/win32/http/win32_http.h index c95e4e61..75fe3d5c 100644 --- a/src/win32/http/win32_http.h +++ b/src/win32/http/win32_http.h @@ -41,6 +41,14 @@ struct W32_HTTP_Request U64 next_body_piece_size; }; +typedef struct W32_HTTP_Response W32_HTTP_Response; +struct W32_HTTP_Response +{ + W32_HTTP_Response *next; + GuardedRing *out_ring; + String8 record; +}; + typedef struct W32_HTTP_State W32_HTTP_State; struct W32_HTTP_State { diff --git a/src/win32/symbol_server/win32_symbol_server.c b/src/win32/symbol_server/win32_symbol_server.c index 7d0eaf29..9b54a49b 100644 --- a/src/win32/symbol_server/win32_symbol_server.c +++ b/src/win32/symbol_server/win32_symbol_server.c @@ -1,6 +1,36 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: Helpers + +internal String8 +w32_smsv_dbg_name_from_local_path(String8 path) +{ + String8 result = str8_skip_last_slash(path); + return result; +} + +internal String8 +w32_smsv_unique_identifier_from_local_path(String8 path) +{ + U64 local_cache_path_pos = str8_find_needle(path, 0, w32_smsv_state->symbol_cache_path, StringMatchFlag_SlashInsensitive); + U64 first_slash_pos = str8_find_needle(path, local_cache_path_pos, s("/"), StringMatchFlag_SlashInsensitive); + String8 cache_relative_path = str8_skip(path, first_slash_pos); + U64 second_slash_pos = str8_find_needle(cache_relative_path, 0, s("/"), StringMatchFlag_SlashInsensitive); + String8 name_root = str8_skip(cache_relative_path, second_slash_pos+1); + U64 third_slash_pos = str8_find_needle(name_root, 0, s("/"), 0); + String8 name = str8_skip(name_root, third_slash_pos+1); + U64 fourth_slash_pos = str8_find_needle(name, 0, s("/"), StringMatchFlag_SlashInsensitive); + String8 unique_identifier = str8_skip(name, fourth_slash_pos+1); + U64 last_slash_pos = str8_find_needle(unique_identifier, 0, s("/"), StringMatchFlag_SlashInsensitive); + unique_identifier = str8_prefix(unique_identifier, last_slash_pos); + return unique_identifier; +} + +//////////////////////////////// +//~ rjf: Implementation + internal void smsv_init(void) { @@ -231,18 +261,13 @@ smsv_async_tick(void) if(server_url.size != 0) { task->status = W32_SMSV_TaskStatus_Requested; - Guid guid = task->guid; - U64 age = task->age; - String8 debug_info_unique_identifier = {0}; - { - debug_info_unique_identifier = str8f(scratch.arena, "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%I64x", - guid.data1, guid.data2, guid.data3, guid.data4[0], guid.data4[1], guid.data4[2], guid.data4[3], guid.data4[4], guid.data4[5], guid.data4[6], guid.data4[7], age); - } + String8 dbg_name = w32_smsv_dbg_name_from_local_path(task->local_path); + String8 debug_info_unique_identifier = w32_smsv_unique_identifier_from_local_path(task->local_path); HTTP_RequestParams params = { .id = (U64)task, .method = HTTP_Method_Get, - .url = str8f(scratch.arena, "%S/%S/%S/%S", server_url, task->dbg_name, debug_info_unique_identifier, task->dbg_name), + .url = str8f(scratch.arena, "%S/%S/%S/%S", server_url, dbg_name, debug_info_unique_identifier, dbg_name), }; if(!http_push_request(w32_smsv_state->http_response_ring, ¶ms, 0)) { @@ -322,6 +347,12 @@ smsv_async_tick(void) scratch_end(scratch); } +internal String8 +smsv_cache_path(void) +{ + return w32_smsv_state->symbol_cache_path; +} + internal String8 smsv_local_path_from_key(Arena *arena, String8 dbg_name, Guid guid, U64 age) { @@ -342,69 +373,70 @@ smsv_local_path_from_key(Arena *arena, String8 dbg_name, Guid guid, U64 age) String8 path = str8f(scratch.arena, "%S/%S/%S/%S", symbol_cache_path, dbg_name, debug_info_unique_identifier, dbg_name); result = path_normalized_from_string(arena, path); } - - // rjf: determine if we already have this debug info stored locally - B32 already_cached_locally = (properties_from_file_path(result).modified != 0); - - // rjf: if not cached: record (local path -> download task) mapping - B32 task_is_new = 0; - U64 task_id = 0; - if(!already_cached_locally) - { - U64 hash = u64_hash_from_str8(result); - U64 slot_idx = hash%w32_smsv_state->task_slots_count; - W32_SMSV_TaskSlot *slot = &w32_smsv_state->task_slots[slot_idx]; - Stripe *stripe = stripe_from_slot_idx(&w32_smsv_state->task_stripes, slot_idx); - for(B32 write_mode = 0; write_mode <= 1; write_mode += 1) - { - B32 already_exists = 0; - RWMutexScope(stripe->rw_mutex, write_mode) - { - W32_SMSV_Task *node = 0; - for(W32_SMSV_Task *n = slot->first; n != 0; n = n->next) - { - if(MemoryMatchStruct(&n->guid, &guid)) - { - already_exists = 1; - node = n; - break; - } - } - if(node == 0 && write_mode) - { - Arena *arena = arena_alloc(); - node = push_array(arena, W32_SMSV_Task, 1); - node->arena = arena; - node->local_path = str8_copy(arena, result); - node->dbg_name = str8_copy(arena, dbg_name); - node->guid = guid; - node->age = age; - DLLPushBack(slot->first, slot->last, node); - task_is_new = 1; - task_id = (U64)node; - } - } - if(already_exists) - { - break; - } - } - } - - // rjf: if the task is new -> push request to start task - if(task_is_new) - { - RingGuard g = guarded_ring_open(w32_smsv_state->new_task_ring); - guarded_ring_write_struct_or_wait(&g, &task_id, max_U64); - guarded_ring_close(&g); - ins_atomic_u32_eval_assign(&async_loop_again, 1); - cond_var_broadcast(async_tick_start_cond_var); - } } scratch_end(scratch); return result; } +internal void +smsv_fill_local_path(String8 path) +{ + // rjf: determine if we already have this debug info stored locally + B32 already_cached_locally = (properties_from_file_path(path).modified != 0); + + // rjf: if not cached: record (local path -> download task) mapping + B32 task_is_new = 0; + U64 task_id = 0; + if(!already_cached_locally) + { + U64 hash = u64_hash_from_str8(path); + U64 slot_idx = hash%w32_smsv_state->task_slots_count; + W32_SMSV_TaskSlot *slot = &w32_smsv_state->task_slots[slot_idx]; + Stripe *stripe = stripe_from_slot_idx(&w32_smsv_state->task_stripes, slot_idx); + for(B32 write_mode = 0; write_mode <= 1; write_mode += 1) + { + B32 already_exists = 0; + RWMutexScope(stripe->rw_mutex, write_mode) + { + W32_SMSV_Task *node = 0; + for(W32_SMSV_Task *n = slot->first; n != 0; n = n->next) + { + if(path_match_normalized(n->local_path, path)) + { + already_exists = 1; + node = n; + break; + } + } + if(node == 0 && write_mode) + { + Arena *arena = arena_alloc(); + node = push_array(arena, W32_SMSV_Task, 1); + node->arena = arena; + node->local_path = path_normalized_from_string(arena, path); + DLLPushBack(slot->first, slot->last, node); + task_is_new = 1; + task_id = (U64)node; + } + } + if(already_exists) + { + break; + } + } + } + + // rjf: if the task is new -> push request to start task + if(task_is_new) + { + RingGuard g = guarded_ring_open(w32_smsv_state->new_task_ring); + guarded_ring_write_struct_or_wait(&g, &task_id, max_U64); + guarded_ring_close(&g); + ins_atomic_u32_eval_assign(&async_loop_again, 1); + cond_var_broadcast(async_tick_start_cond_var); + } +} + internal SMSV_Status smsv_status_from_local_path(String8 path) { diff --git a/src/win32/symbol_server/win32_symbol_server.h b/src/win32/symbol_server/win32_symbol_server.h index ae9f02a4..0ebc1b36 100644 --- a/src/win32/symbol_server/win32_symbol_server.h +++ b/src/win32/symbol_server/win32_symbol_server.h @@ -22,9 +22,6 @@ struct W32_SMSV_Task // rjf: key / parameters Arena *arena; String8 local_path; - String8 dbg_name; - Guid guid; - U64 age; // rjf: working state W32_SMSV_TaskStatus status; @@ -64,4 +61,10 @@ struct W32_SMSV_State global W32_SMSV_State *w32_smsv_state = 0; +//////////////////////////////// +//~ rjf: Helpers + +internal String8 w32_smsv_dbg_name_from_local_path(String8 path); +internal String8 w32_smsv_unique_identifier_from_local_path(String8 path); + #endif // WIN32_SYMBOL_SERVER_H From 9955c8c1a781ce13735832cd2a6baa00b0a5cc39 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 09:27:23 -0700 Subject: [PATCH 745/850] temporarily turn off symbol server stuff - switch off spoof for step-over --- project.raddbg | 4 +- src/codeview/codeview.h | 12 +- src/dbg_engine/dbg_engine_core.h | 7 +- src/dbg_engine/dbg_engine_ctrl.c | 107 ++++++++++-------- src/dbg_engine/dbg_engine_user.c | 14 ++- src/dbg_info/dbg_info.c | 1 + src/http/http.h | 2 + src/lib_rdi/rdi.h | 1 + src/lib_rdi_make/rdi_make.h | 1 + src/raddbg/raddbg_core.c | 12 +- src/rdi/rdi.mdesk | 1 + src/rdi_from_pdb/rdi_from_pdb.c | 30 +++++ src/rdi_make/rdi_make_local.c | 6 +- src/win32/http/win32_http.c | 28 ++++- src/win32/http/win32_http.h | 2 + src/win32/symbol_server/win32_symbol_server.c | 7 +- 16 files changed, 159 insertions(+), 76 deletions(-) diff --git a/project.raddbg b/project.raddbg index 76b56383..929febbb 100644 --- a/project.raddbg +++ b/project.raddbg @@ -5,7 +5,7 @@ target: { executable: "build/raddbg.exe" working_directory: "../raddebugger" - arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project" + arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project --capture" debug_subprocesses: 0 enabled: 1 } @@ -57,5 +57,5 @@ target: { executable: "build/raddbg.exe" working_directory: build - arguments: "--bin --rdi --thread_count=1 C:/SymbolCache/kernelbase.pdb/53B51385668728BA4297C9C78EEC92DD1/kernelbase.pdb" + arguments: "--bin --rdi --thread_count=1 C:/SymbolCache/kernel32.pdb/E02F64ED8DA50EC6E7691C0AC0BC25781/kernel32.pdb" } diff --git a/src/codeview/codeview.h b/src/codeview/codeview.h index f4a6a12f..7e4672e4 100644 --- a/src/codeview/codeview.h +++ b/src/codeview/codeview.h @@ -1044,12 +1044,12 @@ CV_ThunkOrdinalEnum; typedef struct CV_SymThunk32 CV_SymThunk32; struct CV_SymThunk32 { - U32 parent; - U32 end; - U32 next; - U32 off; - U16 sec; - U16 len; + U32 parent; + U32 end; + U32 next; + U32 off; + U16 sec; + U16 len; CV_ThunkOrdinal ord; // U8[] name (null terminated) // U8[] variant (null terminated) diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 7dae3be5..bc80c2d1 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -270,9 +270,10 @@ enum { D_TrapFlag_IgnoreStackPointerCheck = (1<<0), D_TrapFlag_SingleStepAfterHit = (1<<1), - D_TrapFlag_SaveStackPointer = (1<<2), - D_TrapFlag_BeginSpoofMode = (1<<3), - D_TrapFlag_EndStepping = (1<<4), + D_TrapFlag_SaveStackPointerBefore = (1<<2), + D_TrapFlag_SaveStackPointerAfter = (1<<3), + D_TrapFlag_BeginSpoofMode = (1<<4), + D_TrapFlag_EndStepping = (1<<5), }; typedef struct D_Trap D_Trap; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 4e7b78d6..af3c1627 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -2666,10 +2666,12 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM ////////////////////////////// //- rjf: no found debug info path -> try to fall back on symbol server cache path // +#if 0 if(initial_debug_info_path.size == 0) { initial_debug_info_path = smsv_local_path_from_key(arena, str8_skip_last_slash(module_info->debug_info_path), module_info->debug_info_guid, module_info->debug_info_age); } +#endif ////////////////////////////// //- rjf: write 1 at attachment marker, to signify attachment @@ -3086,25 +3088,25 @@ d_ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, D_Msg *msg, D { d_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); } - } - } - - //- rjf: irrespective of what event came back, we should ALWAYS check the - // spoof's thread and see if it hit the spoof address, because we may have - // simply been sent other debug events first - if(spoof != 0) - { - D_Entity *thread = d_entity_from_handle(spoof->thread); - Arch arch = thread->arch; - ARCH_Info *arch_info = arch_info_from_arch(arch); - U64 arch_reg_block_size = arch_info->reg_block_size; - void *regs_block = push_array(scratch.arena, U8, arch_reg_block_size); - d_thread_read_reg_block(spoof->thread, regs_block); - U64 spoof_thread_rip = arch_ip_from_reg_block(arch_info, regs_block); - if(spoof_thread_rip == spoof->new_ip_value) - { - arch_reg_block_write_ip(arch_info, regs_block, spoof_old_ip_value); - d_thread_write_reg_block(spoof->thread, regs_block); + + // rjf: irrespective of what event came back, we should ALWAYS check the + // spoof's thread and see if it hit the spoof address, because we may have + // simply been sent other debug events first + if(spoof != 0) + { + D_Entity *thread = d_entity_from_handle(spoof->thread); + Arch arch = thread->arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 arch_reg_block_size = arch_info->reg_block_size; + void *regs_block = push_array(scratch.arena, U8, arch_reg_block_size); + d_thread_read_reg_block(spoof->thread, regs_block); + U64 spoof_thread_rip = arch_ip_from_reg_block(arch_info, regs_block); + if(spoof_thread_rip == spoof->new_ip_value) + { + arch_reg_block_write_ip(arch_info, regs_block, spoof_old_ip_value); + d_thread_write_reg_block(spoof->thread, regs_block); + } + } } } @@ -5154,22 +5156,38 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } } - //- rjf: trap net on on-target threads trigger trap net logic - B32 use_trap_net_logic = 0; - if(!hard_stop && use_stepping_logic && hit_trap_net_bp) + //- rjf: trap net logic: stack pointer check on target thread + B32 stack_pointer_check_passes = 0; + if(!hard_stop && use_stepping_logic && hit_trap_net_bp && dmn_handle_match(event->thread, d_dmn_from_handle(target_thread))) { - if(dmn_handle_match(event->thread, d_dmn_from_handle(target_thread))) + U64 sp = d_sp_from_thread(target_thread); + stack_pointer_check_passes = ((hit_trap_flags & D_TrapFlag_IgnoreStackPointerCheck) || (sp == sp_check_value)); + } + + //- rjf: trap net on on-target threads trigger trap net logic, *if* the stack pointer check passes. + // if it doesn't -> step over trap net & continue + B32 use_trap_net_logic = 0; + if(!hard_stop && use_stepping_logic && hit_trap_net_bp && dmn_handle_match(event->thread, d_dmn_from_handle(target_thread))) + { + if(stack_pointer_check_passes) { use_trap_net_logic = 1; } + else + { + step_past_trap_net = 1; + use_stepping_logic = 0; + } } - //- rjf: trap net logic: stack pointer check - B32 stack_pointer_matches = 0; - if(use_trap_net_logic) + //- rjf: trap net logic: save stack pointer *before* step-over + if(!hard_stop && use_trap_net_logic) { - U64 sp = d_sp_from_thread(target_thread); - stack_pointer_matches = (sp == sp_check_value); + if(hit_trap_flags & D_TrapFlag_SaveStackPointerBefore) + { + sp_check_value = d_sp_from_thread(target_thread); + log_infof("sp_check_value = 0x%I64x\n", sp_check_value); + } } //- rjf: trap net logic: single step after hit @@ -5217,6 +5235,16 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } } + //- rjf: trap net logic: save stack pointer *after* step-over + if(!hard_stop && use_trap_net_logic) + { + if(hit_trap_flags & D_TrapFlag_SaveStackPointerAfter) + { + sp_check_value = d_sp_from_thread(target_thread); + log_infof("sp_check_value = 0x%I64x\n", sp_check_value); + } + } + //- rjf: trap net logic: begin spoof mode B32 begin_spoof_mode = 0; if(!hard_stop && use_trap_net_logic) @@ -5234,33 +5262,14 @@ d_ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, D_Msg *msg) } } - //- rjf: trap net logic: save stack pointer - B32 save_stack_pointer = 0; - if(!hard_stop && use_trap_net_logic) - { - if(hit_trap_flags & D_TrapFlag_SaveStackPointer) - { - if(stack_pointer_matches) LogInfoNamedBlockF("trap_net__save_sp") - { - save_stack_pointer = 1; - sp_check_value = d_sp_from_thread(target_thread); - log_infof("sp_check_value = 0x%I64x\n", sp_check_value); - } - } - } - //- rjf: trap net logic: end stepping B32 trap_net_stop = 0; if(!hard_stop && use_trap_net_logic) { if(hit_trap_flags & D_TrapFlag_EndStepping) LogInfoNamedBlockF("trap_net__end_step") { - if((hit_trap_flags & D_TrapFlag_IgnoreStackPointerCheck) || - stack_pointer_matches) - { - trap_net_stop = 1; - use_trap_net_logic = 0; - } + trap_net_stop = 1; + use_trap_net_logic = 0; } } diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 7c7ba17a..b3fc7594 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -516,16 +516,24 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread) } + // rjf: call => save stack pointer before, single-step to go into call; trap on return + else if(point->inst_flags & DASM_InstFlag_Call) + { + flags |= (D_TrapFlag_SaveStackPointerBefore|D_TrapFlag_SingleStepAfterHit); + } + +#if 0 // TODO(rjf): @spoof_stepping // rjf: call => place spoof at return spot in stack, single-step after hitting else if(point->inst_flags & DASM_InstFlag_Call) { flags |= (D_TrapFlag_BeginSpoofMode|D_TrapFlag_SingleStepAfterHit); } +#endif - // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping + // rjf: instruction changes stack pointer => single-step over, save off the stack pointer, keep stepping else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) { - flags |= (D_TrapFlag_SingleStepAfterHit|D_TrapFlag_SaveStackPointer); + flags |= (D_TrapFlag_SingleStepAfterHit|D_TrapFlag_SaveStackPointerAfter); } // rjf: add if appropriate @@ -734,7 +742,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread) // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer) { - flags |= (D_TrapFlag_SingleStepAfterHit|D_TrapFlag_SaveStackPointer); + flags |= (D_TrapFlag_SingleStepAfterHit|D_TrapFlag_SaveStackPointerAfter); } // rjf: add if appropriate diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 79c3d77b..bb12c6fe 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -682,6 +682,7 @@ di_async_tick(void) //- rjf: kick off symbol server download, or check to see if we are actively downloading O.G. B32 og_is_downloading = 0; + if(og_path.size != 0) { B32 file_is_present = (properties_from_file_path(og_path).modified != 0); if(!file_is_present) diff --git a/src/http/http.h b/src/http/http.h index 24f73a9f..c7d570b8 100644 --- a/src/http/http.h +++ b/src/http/http.h @@ -146,6 +146,8 @@ typedef struct HTTP_Response HTTP_Response; struct HTTP_Response { U64 id; + U64 off; + U64 off_opl; B32 has_more; HTTP_StatusCode code; String8 body; diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index f5c65910..a1b93520 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -396,6 +396,7 @@ typedef RDI_U8 RDI_SymbolFlags; typedef enum RDI_SymbolFlagsEnum { RDI_SymbolFlag_IsParam = 0x1, +RDI_SymbolFlag_IsThunk = 0x2, } RDI_SymbolFlagsEnum; typedef RDI_U8 RDI_LocationKind; diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index 66d6c826..f7ee2a40 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -849,6 +849,7 @@ typedef struct RDIM_Symbol RDIM_Symbol; struct RDIM_Symbol { struct RDIM_SymbolChunkNode *chunk; + RDI_S32 is_thunk; RDI_S32 is_extern; RDI_S32 is_param; RDIM_String8 name; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 2ad9f1c4..309e5628 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -6634,18 +6634,14 @@ rd_window_frame(void) UI_PermissionFlag_All) { B32 has_footer = (is_lister && !is_anchored); - F32 container_corner_top_radius_px = is_lister ? ui_top_font_size()*1.f : ui_top_font_size()*0.15f; - F32 container_corner_bottom_radius_px = has_footer ? ui_top_font_size()*1.f : ui_top_font_size()*0.15f; + F32 container_corner_radius_px = has_footer ? ui_top_font_size()*1.f : ui_top_font_size()*0.15f; // rjf: build top-level container box UI_Box *container = &ui_nil_box; UI_Rect(rect) UI_ChildLayoutAxis(Axis2_Y) UI_Squish(0.1f-0.1f*open_t) UI_Transparency(1.f-open_t) - UI_CornerRadius00(container_corner_top_radius_px) - UI_CornerRadius10(container_corner_top_radius_px) - UI_CornerRadius01(container_corner_bottom_radius_px) - UI_CornerRadius11(container_corner_bottom_radius_px) + UI_CornerRadius(container_corner_radius_px) { container = ui_build_box_from_stringf(UI_BoxFlag_Clickable| UI_BoxFlag_DrawBorder| @@ -11108,7 +11104,7 @@ rd_frame(void) for(HTTP_Response response = {0}; http_pop_response(rd_state->update_check_arena, rd_state->update_check_http_ring, &response, 0);) { str8_list_push(rd_state->update_check_arena, &rd_state->update_check_response_body_pieces, response.body); - if(response.has_more == 0) + if(!response.has_more) { done = 1; } @@ -12318,7 +12314,7 @@ rd_frame(void) }); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = collection_type_key; - expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity); + expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key); } diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 28baa269..a06ac207 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1020,6 +1020,7 @@ RDI_LocationKindTable: RDI_SymbolFlagTable: { {IsParam 0x1} + {IsThunk 0x2} } @table(name type desc) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 5d7c3cd2..19072fe5 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -3194,6 +3194,7 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) default:{}break; case CV_SymKind_LPROC32: case CV_SymKind_GPROC32: + case CV_SymKind_THUNK32: { procedure_record_count += 1; scope_record_count += 1; @@ -3600,6 +3601,35 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) proc_flags = proc32->flags; }break; + //- rjf: THUNK32 + case CV_SymKind_THUNK32: + { + // rjf: unpack record + CV_SymThunk32 *thunk32 = (CV_SymThunk32 *)iter.struct_base; + String8 name = str8_cstring_capped(thunk32+1, iter.opl); + COFF_SectionHeader *section = (0 < thunk32->sec && thunk32->sec <= coff_sections.count) ? &coff_sections.v[thunk32->sec-1] : 0; + U64 voff_first = 0; + U64 voff_opl = 0; + if(section != 0) + { + voff_first = section->voff + thunk32->off; + voff_opl = voff_first + thunk32->len; + } + + // rjf: build symbol / scope + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); + symbol->name = name; + symbol->is_thunk = 1; + if(voff_first != voff_opl) + { + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); + RDIM_Rng1U64 range = {voff_first, voff_opl}; + rdim_scope_push_voff_range(arena, sym_scopes, scope, range); + scope->symbol = symbol; + symbol->root_scope = scope; + } + }break; + //- rjf: REGREL32 case CV_SymKind_REGREL32: { diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index c788c0fa..095672d7 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -3353,10 +3353,14 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 dst->root_scope_idx = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32 dst->link_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->link_name); - if (src->is_param) + if(src->is_param) { dst->symbol_flags |= RDI_SymbolFlag_IsParam; } + if(src->is_thunk) + { + dst->symbol_flags |= RDI_SymbolFlag_IsThunk; + } // rjf: fill container info if(src->is_extern) diff --git a/src/win32/http/win32_http.c b/src/win32/http/win32_http.c index 0f6c3059..daa6f850 100644 --- a/src/win32/http/win32_http.c +++ b/src/win32/http/win32_http.c @@ -344,12 +344,24 @@ http_async_tick(void) DWORD status_code = 0; DWORD status_code_size = sizeof(status_code); WinHttpQueryHeaders(req->hRequest, - WINHTTP_QUERY_STATUS_CODE|WINHTTP_QUERY_FLAG_NUMBER, + WINHTTP_QUERY_STATUS_CODE|WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, &status_code, &status_code_size, WINHTTP_NO_HEADER_INDEX); req->status_code = status_code; } + // rjf: figure out total bytes + if(req->total_response_bytes == 0) + { + DWORD buffer_size = sizeof(req->total_response_bytes); + WinHttpQueryHeaders(req->hRequest, + WINHTTP_QUERY_CONTENT_LENGTH|WINHTTP_QUERY_FLAG_NUMBER64, + WINHTTP_HEADER_NAME_BY_INDEX, + &req->total_response_bytes, + &buffer_size, + WINHTTP_NO_HEADER_INDEX); + } + // rjf: join all currently read body contents String8 body = str8_list_join(scratch.arena, &req->finished_body_pieces, 0); @@ -359,7 +371,7 @@ http_async_tick(void) // rjf: compute size per record header U64 max_record_size = req->out_ring->ring->size; - U64 bytes_per_record_header = sizeof(U64) + sizeof(U64) + sizeof(B32) + sizeof(HTTP_StatusCode); + U64 bytes_per_record_header = sizeof(U64) + sizeof(U64) + sizeof(U64) + sizeof(U64) + sizeof(B32) + sizeof(HTTP_StatusCode); // rjf: push response records for(U64 off = 0, next_off = 0; off <= body.size; off = next_off) @@ -383,6 +395,8 @@ http_async_tick(void) B32 has_more = !is_last; str8_list_push(scratch.arena, &pieces, str8_struct(&record_size)); str8_list_push(scratch.arena, &pieces, str8_struct(&req->id)); + str8_list_push(scratch.arena, &pieces, str8_struct(&req->total_response_bytes_sent)); + str8_list_push(scratch.arena, &pieces, str8_struct(&req->total_response_bytes)); str8_list_push(scratch.arena, &pieces, str8_struct(&has_more)); str8_list_push(scratch.arena, &pieces, str8_struct(&req->status_code)); str8_list_push(scratch.arena, &pieces, str8_substr(body, r1u64(off, next_off))); @@ -396,12 +410,18 @@ http_async_tick(void) if(!guarded_ring_write_string_or_wait(&g, record_data, 0)) { push_failed = 1; - String8 unpushed_body_piece = str8_substr(body, r1u64(off, next_off)); + String8 unpushed_body_piece = str8_substr(body, r1u64(off, body.size)); str8_list_push(req->arena, &req->finished_body_pieces, str8_copy(req->arena, unpushed_body_piece)); } guarded_ring_close(&g); } + // rjf: advance total bytes sent + if(!push_failed) + { + req->total_response_bytes_sent += (next_off - off); + } + // rjf: cancel on no movement if(next_off == off || push_failed) { @@ -528,6 +548,8 @@ http_pop_response(Arena *arena, GuardedRing *out_ring, HTTP_Response *response_o guarded_ring_read_or_wait(&g, data.size, data.str, max_U64); U64 off = 0; off += str8_deserial_read_struct(data, off, &response_out->id); + off += str8_deserial_read_struct(data, off, &response_out->off); + off += str8_deserial_read_struct(data, off, &response_out->off_opl); off += str8_deserial_read_struct(data, off, &response_out->has_more); off += str8_deserial_read_struct(data, off, &response_out->code); response_out->body.size = (data.size - off); diff --git a/src/win32/http/win32_http.h b/src/win32/http/win32_http.h index 75fe3d5c..d1fc8ac6 100644 --- a/src/win32/http/win32_http.h +++ b/src/win32/http/win32_http.h @@ -35,6 +35,8 @@ struct W32_HTTP_Request void *optional; // NOTE(rjf): must persist with in-flight requests U64 optional_size; HTTP_StatusCode status_code; + U64 total_response_bytes_sent; + U64 total_response_bytes; U64 arena_start_body_read_pos; String8List finished_body_pieces; void *next_body_piece; diff --git a/src/win32/symbol_server/win32_symbol_server.c b/src/win32/symbol_server/win32_symbol_server.c index 9b54a49b..74f5149c 100644 --- a/src/win32/symbol_server/win32_symbol_server.c +++ b/src/win32/symbol_server/win32_symbol_server.c @@ -201,7 +201,7 @@ smsv_async_tick(void) { str8_list_push(task->arena, &task->file_pieces, str8_copy(task->arena, r.body)); } - if(r.has_more == 0 && task->status != W32_SMSV_TaskStatus_DoneDownloading) + if(!r.has_more && task->status != W32_SMSV_TaskStatus_DoneDownloading) { task->status = W32_SMSV_TaskStatus_DoneDownloading; W32_SMSV_TaskNode *n = push_array(scratch.arena, W32_SMSV_TaskNode, 1); @@ -329,6 +329,11 @@ smsv_async_tick(void) } } write_data_list_to_file_path(task->local_path, task->file_pieces); + if(task->current_server_url_node != 0) + { + String8 origin_path = str8f(scratch.arena, "%S/origin.txt", str8_chop_last_slash(task->local_path)); + write_data_to_file_path(origin_path, task->current_server_url_node->string); + } } // rjf: evict task from cache From ec4fd23e15c79811c9518b1a0bb188cd04ac1868 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 10:38:08 -0700 Subject: [PATCH 746/850] fix incorrect commits in new pe/x64 unwinder; fix bad unwind termination conditions --- project.raddbg | 9 ++++++++- src/dbg_engine/dbg_engine_ctrl.c | 6 ++++-- src/pe/x64/unwind/pe_x64_unwind.c | 12 ++++++------ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/project.raddbg b/project.raddbg index 929febbb..a3b23cac 100644 --- a/project.raddbg +++ b/project.raddbg @@ -5,11 +5,18 @@ target: { executable: "build/raddbg.exe" working_directory: "../raddebugger" - arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project --capture" + arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project" debug_subprocesses: 0 enabled: 1 } target: +{ + executable: "../raddebugger_exemplar/build/raddbg.exe" + working_directory: "../raddebugger" + arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project" + debug_subprocesses: 0 +} +target: { executable: "build/mule_main.exe" working_directory: build diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index af3c1627..11881850 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1900,7 +1900,9 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) } //- rjf: push successful steps to frame list - if(step_is_good && arch_ip_from_reg_block(arch_info, regs_block) != 0 && arch_ip_from_reg_block(arch_info, regs_block) != start_ip) + if(step_is_good && arch_ip_from_reg_block(arch_info, regs_block) != 0 && + (arch_ip_from_reg_block(arch_info, regs_block) != start_ip || + arch_sp_from_reg_block(arch_info, regs_block) != start_sp)) { D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1); D_UnwindFrame *f = &frame_node->v; @@ -1914,7 +1916,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) access_close(access); //- rjf: exit if we made no progress on the unwind - if(arch_ip_from_reg_block(arch_info, regs_block) == start_ip || + if(arch_ip_from_reg_block(arch_info, regs_block) == start_ip && arch_sp_from_reg_block(arch_info, regs_block) == start_sp) { break; diff --git a/src/pe/x64/unwind/pe_x64_unwind.c b/src/pe/x64/unwind/pe_x64_unwind.c index 2db6604b..7c62dbab 100644 --- a/src/pe/x64/unwind/pe_x64_unwind.c +++ b/src/pe/x64/unwind/pe_x64_unwind.c @@ -361,7 +361,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); + U64 *reg_ptr = (U64 *)((U8 *)&new_regs + reg_rng.min); reg_ptr[0] = value; new_regs->rsp = sp + 8; } @@ -430,7 +430,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); + U64 *reg_ptr = (U64 *)((U8 *)&new_regs + reg_rng.min); U64 reg_value = reg_ptr[0]; // rjf: read immediate @@ -608,7 +608,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, if(frame_reg_code != X64_RegCode_nil) { Rng1U16 frame_reg_rng = x64_reg_code_rng_table[frame_reg_code]; - U64 raw_frame_base = *(U64 *)((U8 *)regs + frame_reg_rng.min); + U64 raw_frame_base = *(U64 *)((U8 *)new_regs + frame_reg_rng.min); U64 adjusted_frame_base = raw_frame_base - frame_off*16; frame_base = adjusted_frame_base; } @@ -661,7 +661,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, { X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - *(U64 *)((U8 *)regs + reg_rng.min) = value; + *(U64 *)((U8 *)new_regs + reg_rng.min) = value; new_regs->rsp = rsp + 8; } }break; @@ -720,7 +720,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, { X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - *(U64 *)((U8 *)regs + reg_rng.min) = value; + *(U64 *)((U8 *)new_regs + reg_rng.min) = value; } }break; @@ -742,7 +742,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, { X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - *(U64 *)((U8 *)regs + reg_rng.min) = value; + *(U64 *)((U8 *)new_regs + reg_rng.min) = value; } }break; From 0f02c32c897baec709b66b51dd63cd3c553b6e7d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 10:58:16 -0700 Subject: [PATCH 747/850] pull failed-unwind-step register-block-restore out of each impl, just do it on the caller side; pull out module-less read-the-stack-pointer unwind fallback from pe/x64 unwinder, use in module-less unwinds in all cases; call into from pe/x64 unwinder in fallback case --- src/dbg_engine/dbg_engine_ctrl.c | 10 +++ src/eh_frame/unwind/eh_frame_unwind.c | 17 ++--- src/pe/x64/unwind/pe_x64_unwind.c | 90 +++++++++++---------------- src/unwind/unwind.c | 37 ++++++++++- src/unwind/unwind.h | 5 ++ 5 files changed, 93 insertions(+), 66 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 11881850..fbce7fc1 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1797,6 +1797,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) // void *regs_block = d_cached_reg_block_from_thread(scratch.arena, thread); B32 regs_block_good = (arch != Arch_Null && regs_block != 0); + void *regs_block_restore = push_array(scratch.arena, U8, arch_reg_block_size); ////////////////////////////// //- rjf: grab initial memory @@ -1858,10 +1859,19 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) B32 step_is_good = 0; for(;!unwind.flags;) { + // rjf: remember registers pre-step + MemoryCopy(regs_block_restore, regs_block, arch_reg_block_size); + // rjf: try step U64 cfa = 0; UWND_StepResult step = uwnd_step(unwinder, arch, &memory_map, &unwinder_module_info, tls_vaddr, regs_block, &cfa); + // rjf: if the step failed -> restore original register values + if(step.status != UWND_StepStatus_Good) + { + MemoryCopy(regs_block, regs_block_restore, arch_reg_block_size); + } + // rjf: if we failed to read memory, try to read that memory, equip to memory map. // if it is stale and we run out of time, we will need to mark the whole unwind as // stale. if it can't be read, the unwind fails. diff --git a/src/eh_frame/unwind/eh_frame_unwind.c b/src/eh_frame/unwind/eh_frame_unwind.c index 9354627b..40b42e5f 100644 --- a/src/eh_frame/unwind/eh_frame_unwind.c +++ b/src/eh_frame/unwind/eh_frame_unwind.c @@ -16,10 +16,6 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 ARCH_Info *arch_info = arch_info_from_arch(arch); U64 pc = arch_ip_from_reg_block(arch_info, regs); - //- rjf: set up new register values - void *new_regs = push_array(scratch.arena, U8, arch_info->reg_block_size); - MemoryCopy(new_regs, regs, arch_info->reg_block_size); - //- rjf: find nearest FDE entry to the IP U64 fde_vaddr = 0; if(header->version == 1 && header->fde_count != 0) @@ -590,7 +586,7 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 } if(!done) { - arch_reg_block_write_range(arch_info, new_regs, reg_rng, reg_value_buffer); + arch_reg_block_write_range(arch_info, regs, reg_rng, reg_value_buffer); } temp_end(temp); }break; @@ -598,7 +594,7 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 { U64 reg_value = cfa + rule->s64; Rng1U16 write_range = r1u16(reg_rng.min, Min(reg_rng.max, reg_rng.min + sizeof(reg_value))); - arch_reg_block_write_range(arch_info, new_regs, write_range, ®_value); + arch_reg_block_write_range(arch_info, regs, write_range, ®_value); }break; case DW_UnwindRuleCode_Reg: { @@ -610,7 +606,7 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 U64 read_size = Min(src_reg_size, reg_size); U8 *src_reg_val_buffer = push_array(temp.arena, U8, read_size); arch_reg_block_read_range(arch_info, regs, src_reg_rng, src_reg_val_buffer); - arch_reg_block_write_range(arch_info, new_regs, reg_rng, src_reg_val_buffer); + arch_reg_block_write_range(arch_info, regs, reg_rng, src_reg_val_buffer); temp_end(temp); }break; case DW_UnwindRuleCode_Expr: @@ -638,7 +634,7 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 } else { - arch_reg_block_write_range(arch_info, new_regs, reg_rng, reg_value_buffer); + arch_reg_block_write_range(arch_info, regs, reg_rng, reg_value_buffer); } } temp_end(temp); @@ -658,7 +654,7 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 if(!done) { U512 reg_val = eval.val.u512; - arch_reg_block_write_range(arch_info, new_regs, reg_rng, ®_val); + arch_reg_block_write_range(arch_info, regs, reg_rng, ®_val); } temp_end(temp); }break; @@ -681,14 +677,13 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 // if(!done) { - arch_reg_block_write_sp(arch_info, new_regs, cfa); + arch_reg_block_write_sp(arch_info, regs, cfa); } //- rjf: commit new register values, if we succeeded if(!done) { result.status = UWND_StepStatus_Good; - MemoryCopy(regs, new_regs, arch_info->reg_block_size); } } scratch_end(scratch); diff --git a/src/pe/x64/unwind/pe_x64_unwind.c b/src/pe/x64/unwind/pe_x64_unwind.c index 7c62dbab..88817527 100644 --- a/src/pe/x64/unwind/pe_x64_unwind.c +++ b/src/pe/x64/unwind/pe_x64_unwind.c @@ -98,18 +98,16 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, { B32 done = 0; Temp scratch = scratch_begin(0, 0); - X64_RegBlock *new_regs = push_array(scratch.arena, X64_RegBlock, 1); - MemoryCopyStruct(new_regs, regs); //////////////////////////// //- rjf: on PE/x64, the frame base address is always RSP // - cfa_out[0] = new_regs->rsp; + cfa_out[0] = regs->rsp; //////////////////////////// //- rjf: unpack context from rip // - U64 rip_voff = new_regs->rip - module_info->base_vaddr; + U64 rip_voff = regs->rip - module_info->base_vaddr; PE_IntelPdata *first_pdata = pe_x64_uwnd_intel_pdata_from_voff(unwind_info, rip_voff); //////////////////////////// @@ -117,7 +115,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, // B32 has_pdata_and_in_epilog = 0; U64 instruction_data_size_cap = 256; - Rng1U64 instruction_data_vaddr_range = r1u64(new_regs->rip, new_regs->rip+instruction_data_size_cap); + Rng1U64 instruction_data_vaddr_range = r1u64(regs->rip, regs->rip+instruction_data_size_cap); String8 instruction_data = {0}; if(!done && first_pdata) { @@ -346,7 +344,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, case 0x5C:case 0x5D:case 0x5E:case 0x5F: { // rjf: read value at rsp - U64 sp = new_regs->rsp; + U64 sp = regs->rsp; U64 value = 0; if(memory_map_read_struct(memory_map, sp, &value) != sizeof(value)) { @@ -361,9 +359,9 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - U64 *reg_ptr = (U64 *)((U8 *)&new_regs + reg_rng.min); + U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); reg_ptr[0] = value; - new_regs->rsp = sp + 8; + regs->rsp = sp + 8; } // rjf: not a final instruction, so keep parsing @@ -386,7 +384,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, read_off += sizeof(imm); // rjf: update stack pointer - new_regs->rsp = (U64)(new_regs->rsp + imm); + regs->rsp = (U64)(regs->rsp + imm); // rjf: not a final instruction; keep parsing keep_parsing = 1; @@ -408,7 +406,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, read_off += sizeof(imm); // rjf: update stack pointer - new_regs->rsp = (U64)(new_regs->rsp + imm); + regs->rsp = (U64)(regs->rsp + imm); // rjf: not a final instruction; keep parsing keep_parsing = 1; @@ -430,7 +428,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - U64 *reg_ptr = (U64 *)((U8 *)&new_regs + reg_rng.min); + U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); U64 reg_value = reg_ptr[0]; // rjf: read immediate @@ -462,7 +460,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, // rjf: update stack pointer if(!done) { - new_regs->rsp = (U64)(reg_value + imm); + regs->rsp = (U64)(reg_value + imm); } // rjf: not a final instruction; keep parsing @@ -473,7 +471,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, case 0xC2: { // rjf: read new ip - U64 sp = new_regs->rsp; + U64 sp = regs->rsp; U64 new_ip = 0; if(memory_map_read_struct(memory_map, sp, &new_ip) != sizeof(new_ip)) { @@ -493,8 +491,8 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, // rjf: commit registers if(!done) { - new_regs->rip = new_ip; - new_regs->rsp = new_sp; + regs->rip = new_ip; + regs->rsp = new_sp; } }break; @@ -506,7 +504,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, case 0xC3: { // rjf: read new ip - U64 sp = new_regs->rsp; + U64 sp = regs->rsp; U64 new_ip = 0; if(memory_map_read_struct(memory_map, sp, &new_ip) != sizeof(new_ip)) { @@ -521,8 +519,8 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, // rjf: commit registers if(!done) { - new_regs->rip = new_ip; - new_regs->rsp = new_sp; + regs->rip = new_ip; + regs->rsp = new_sp; } }break; @@ -604,11 +602,11 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, } //- rjf: unpack frame base - U64 frame_base = new_regs->rsp; + U64 frame_base = regs->rsp; if(frame_reg_code != X64_RegCode_nil) { Rng1U16 frame_reg_rng = x64_reg_code_rng_table[frame_reg_code]; - U64 raw_frame_base = *(U64 *)((U8 *)new_regs + frame_reg_rng.min); + U64 raw_frame_base = *(U64 *)((U8 *)regs + frame_reg_rng.min); U64 adjusted_frame_base = raw_frame_base - frame_off*16; frame_base = adjusted_frame_base; } @@ -647,7 +645,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, case PE_UnwindOpCode_PUSH_NONVOL: { // rjf: read value from stack pointer - U64 rsp = new_regs->rsp; + U64 rsp = regs->rsp; U64 value = 0; if(memory_map_read_struct(memory_map, rsp, &value) != sizeof(value)) { @@ -661,8 +659,8 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, { X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - *(U64 *)((U8 *)new_regs + reg_rng.min) = value; - new_regs->rsp = rsp + 8; + *(U64 *)((U8 *)regs + reg_rng.min) = value; + regs->rsp = rsp + 8; } }break; @@ -686,20 +684,20 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, // rjf: advance stack pointer if(!done) { - new_regs->rsp += size; + regs->rsp += size; } }break; case PE_UnwindOpCode_ALLOC_SMALL: { // rjf: advance stack pointer - new_regs->rsp += op_info*8 + 8; + regs->rsp += op_info*8 + 8; }break; case PE_UnwindOpCode_SET_FPREG: { // rjf: put stack pointer back to the frame base - new_regs->rsp = frame_base; + regs->rsp = frame_base; }break; case PE_UnwindOpCode_SAVE_NONVOL: @@ -720,7 +718,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, { X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - *(U64 *)((U8 *)new_regs + reg_rng.min) = value; + *(U64 *)((U8 *)regs + reg_rng.min) = value; } }break; @@ -742,7 +740,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, { X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(op_info); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - *(U64 *)((U8 *)new_regs + reg_rng.min) = value; + *(U64 *)((U8 *)regs + reg_rng.min) = value; } }break; @@ -775,7 +773,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, // rjf: commit to register if(!done) { - void *xmm_reg = (&new_regs->zmm0) + op_info; + void *xmm_reg = (®s->zmm0) + op_info; MemoryCopy(xmm_reg, buf, sizeof(buf)); } }break; @@ -797,7 +795,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, // rjf: commit to register if(!done) { - void *xmm_reg = (&new_regs->zmm0) + op_info; + void *xmm_reg = (®s->zmm0) + op_info; MemoryCopy(xmm_reg, buf, sizeof(buf)); } }break; @@ -812,7 +810,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, } // rjf: unpack stack pointer - U64 sp_og = new_regs->rsp; + U64 sp_og = regs->rsp; U64 sp_adj = sp_og; if(op_info == 1) { @@ -861,10 +859,10 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, // rjf: commit registers if(!done) { - new_regs->rip = ip_value; - new_regs->ss = ss_value; - new_regs->rflags = rflags_value; - new_regs->rsp = sp_value; + regs->rip = ip_value; + regs->ss = ss_value; + regs->rflags = rflags_value; + regs->rsp = sp_value; } // rjf: mark machine frame @@ -898,27 +896,12 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, } ////////////////////////////// - //- rjf: no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer + //- rjf: no pdata, or didn't do machframe in xdata unwind -> module-less unwind // if(!done && (!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe))) { - // rjf: read new ip - U64 sp = new_regs->rsp; - U64 new_ip = 0; - if(memory_map_read_struct(memory_map, sp, &new_ip) != sizeof(new_ip)) - { - done = 1; - result.status = UWND_StepStatus_FailedMemoryRead; - result.missed_read_vaddr_range = r1u64(sp, sp+sizeof(new_ip)); - } - - // rjf: commit - if(!done) - { - U64 new_sp = sp+8; - new_regs->rip = new_ip; - new_regs->rsp = new_sp; - } + result = uwnd_step_moduleless(arch, memory_map, regs); + done = (result.status != UWND_StepStatus_Good); } ////////////////////////////// @@ -927,7 +910,6 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, if(!done) { result.status = UWND_StepStatus_Good; - MemoryCopyStruct(regs, new_regs); } scratch_end(scratch); diff --git a/src/unwind/unwind.c b/src/unwind/unwind.c index 4a073e03..96a2d8f7 100644 --- a/src/unwind/unwind.c +++ b/src/unwind/unwind.c @@ -6,6 +6,41 @@ #include "unwind/generated/unwind.meta.c" +//////////////////////////////// +//~ rjf: Moduleless Unwinder + +internal UWND_StepResult +uwnd_step_moduleless(Arch arch, MemoryMap *memory_map, void *regs) +{ + UWND_StepResult result = {UWND_StepStatus_Error}; + { + B32 done = 0; + ARCH_Info *arch_info = arch_info_from_arch(arch); + U64 addr_size = byte_size_from_arch(arch); + + // rjf: read new ip from stack pointer + U64 sp = arch_sp_from_reg_block(arch_info, regs); + U64 new_ip = 0; + Rng1U64 new_ip_vaddr_range = r1u64(sp, sp+addr_size); + if(memory_map_read(memory_map, new_ip_vaddr_range, &new_ip) != addr_size) + { + done = 1; + result.status = UWND_StepStatus_FailedMemoryRead; + result.missed_read_vaddr_range = new_ip_vaddr_range; + } + + // rjf: commit + if(!done) + { + U64 new_sp = sp+addr_size; + arch_reg_block_write_ip(arch_info, regs, new_ip); + arch_reg_block_write_sp(arch_info, regs, new_sp); + result.status = UWND_StepStatus_Good; + } + } + return result; +} + //////////////////////////////// //~ rjf: Abstracted Unwind Step Functions @@ -15,7 +50,7 @@ uwnd_step(UWND_Unwinder unwinder, Arch arch, MemoryMap *memory_map, UWND_ModuleI UWND_StepResult result = {UWND_StepStatus_Error}; switch(unwinder) { - default:{}break; + default:{result = uwnd_step_moduleless(arch, memory_map, regs);}break; #define X(name, namespace_lower) case UWND_Unwinder_##name:{result = namespace_lower##_uwnd_step(arch, memory_map, module_info, tls_vaddr, regs, cfa_out);}break; UWND_Unwinder_XList #undef X diff --git a/src/unwind/unwind.h b/src/unwind/unwind.h index 40bab81d..72e1789e 100644 --- a/src/unwind/unwind.h +++ b/src/unwind/unwind.h @@ -37,6 +37,11 @@ struct UWND_ModuleInfo void *unwind_info; }; +//////////////////////////////// +//~ rjf: Moduleless Unwinder + +internal UWND_StepResult uwnd_step_moduleless(Arch arch, MemoryMap *memory_map, void *regs); + //////////////////////////////// //~ rjf: Abstracted Unwind Step Functions From 27e1e36f5cdc0c64de455af580f4aae15aff7bfa Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 11:24:54 -0700 Subject: [PATCH 748/850] fix incorrect marking of non-stale results by artifact cache lookup; fix view addr parameterizations when a register value is used --- src/artifact_cache/artifact_cache.c | 2 +- src/dbg_engine/dbg_engine_ctrl.c | 19 +++++++++++-------- src/raddbg/raddbg_core.c | 7 ++++++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 54db8c31..7a5ddec8 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -191,7 +191,7 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 if(!got_artifact && ins_atomic_u64_eval(&node->completion_count) != 0 && ((node->last_completed_gen == params->gen) || !(params->flags & AC_Flag_WaitForFresh) || out_of_time)) { got_artifact = 1; - artifact_is_stale = (node->last_completed_gen == params->gen); + artifact_is_stale = (node->last_completed_gen != params->gen); artifact = node->val; access_touch(access, &node->access_pt, stripe->cv); ins_atomic_u64_eval_assign(&node->last_touched_ac_request_gen, ins_atomic_u64_eval(&ac_shared->request_gen)); diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index fbce7fc1..56279d98 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1857,7 +1857,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) //- rjf: do one unwind step B32 step_is_good = 0; - for(;!unwind.flags;) + for(;!unwind.flags && !step_is_good;) { // rjf: remember registers pre-step MemoryCopy(regs_block_restore, regs_block, arch_reg_block_size); @@ -1905,14 +1905,18 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) { last_frame_node->v.cfa = cfa; step_is_good = 1; - break; } } - //- rjf: push successful steps to frame list - if(step_is_good && arch_ip_from_reg_block(arch_info, regs_block) != 0 && - (arch_ip_from_reg_block(arch_info, regs_block) != start_ip || - arch_sp_from_reg_block(arch_info, regs_block) != start_sp)) + //- rjf: push successful steps to frame list - we disqualify steps that are: + // + // (a) bad + // (b) advance ip to 0 + // (c) do not modify either ip *or* sp (just one is fine) + // + B32 step_made_process = (arch_ip_from_reg_block(arch_info, regs_block) != start_ip || + arch_sp_from_reg_block(arch_info, regs_block) != start_sp); + if(step_is_good && step_made_process && arch_ip_from_reg_block(arch_info, regs_block) != 0) { D_UnwindFrameNode *frame_node = push_array(scratch.arena, D_UnwindFrameNode, 1); D_UnwindFrame *f = &frame_node->v; @@ -1926,8 +1930,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) access_close(access); //- rjf: exit if we made no progress on the unwind - if(arch_ip_from_reg_block(arch_info, regs_block) == start_ip && - arch_sp_from_reg_block(arch_info, regs_block) == start_sp) + if(!step_made_process) { break; } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 309e5628..bbbe7991 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4843,7 +4843,12 @@ rd_view_setting_addr_from_name(String8 name) E_Eval eval = e_eval_from_string(string); E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind type_kind = e_type_kind_from_key(type_key); - if(eval.irtree.mode == E_Mode_Offset && !e_type_kind_is_pointer_or_ref(type_kind)) + if(eval.irtree.mode == E_Mode_Offset && e_space_match(e_base_ctx->thread_reg_space, eval.space)) + { + E_Eval value_eval = e_value_eval_from_eval(eval); + result = value_eval.value.u64; + } + else if(eval.irtree.mode == E_Mode_Offset && !e_type_kind_is_pointer_or_ref(type_kind)) { result = eval.value.u64; } From 0105b06fef978d97d39b666fe9958dafc12b4650 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 13:14:29 -0700 Subject: [PATCH 749/850] fix conflicting lifetimes in http read - batch of retry-response-body-pieces was conflicting with asynchronous reading state! --- src/dbg_engine/dbg_engine_ctrl.c | 2 +- src/raddbg/generated/raddbg.meta.c | 388 ++++++++++++++--------------- src/raddbg/raddbg.mdesk | 4 +- src/raddbg/raddbg_core.c | 20 +- src/raddbg/raddbg_core.h | 14 +- src/raddbg/raddbg_eval.c | 2 +- src/raddbg/raddbg_main.c | 12 +- src/win32/http/win32_http.c | 48 +++- src/win32/http/win32_http.h | 9 +- 9 files changed, 266 insertions(+), 233 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 56279d98..36ab49ce 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -2681,7 +2681,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM ////////////////////////////// //- rjf: no found debug info path -> try to fall back on symbol server cache path // -#if 0 +#if 1 if(initial_debug_info_path.size == 0) { initial_debug_info_path = smsv_local_path_from_key(arena, str8_skip_last_slash(module_info->debug_info_path), module_info->debug_info_guid, module_info->debug_info_age); diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index bafabca8..f55bdebf 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -624,200 +624,200 @@ RD_CmdKindInfo rd_cmd_kind_info_table[255] = { str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*1)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*1)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*1)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, { str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, { str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index aa6a68b4..264b9372 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -937,7 +937,7 @@ RD_RegTable: //////////////////////////////// //~ rjf: Command Table -@table(name ui_vis ipc_docs_vis text_pt_vis text_rng_vis eval_vis memory_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags ctx_filter) +@table(name ui_vis ipc_docs_vis text_pt_vis text_rng_vis mem_eval_vis memory_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags ctx_filter) // / | | | | | | | \___ _________________________________________________________________/ | | | | | | // / | | | | | | | \ / | | | | | | RD_CmdTable: // | | | | | | | | | | | | | | | @@ -1272,7 +1272,7 @@ RD_CmdTable: // | | | | @expand(D_CmdTable, a) ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis))|(RD_CmdKindFlag_ListInEval*$(a.eval_vis))|(RD_CmdKindFlag_ListInMemory*$(a.memory_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis))|(RD_CmdKindFlag_ListInMemoryEval*$(a.mem_eval_vis))|(RD_CmdKindFlag_ListInMemory*$(a.memory_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_WatchTabFastPathTable, a) ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}```; @expand(RD_ViewTabFastPathTable, a) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index bbbe7991..bec8336e 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4318,12 +4318,16 @@ rd_view_ui(Rng2F32 rect) selected_eval = cell->eval; ewv->next_cursor = ewv->next_mark = cell_pt; pressed = 1; - rd_cmd(RD_CmdKind_PushQuery, - .expr = s("query:eval_commands"), - .do_implicit_root = 1, - .do_lister = 1, - .activate_with_single_click = 1, - .ui_key = cell_box->key); + if(cell->eval.space.kind == D_EvalSpaceKind_Entity) + { + rd_cmd(RD_CmdKind_PushQuery, + .expr = s("query:memory_eval_commands"), + .do_implicit_root = 1, + .do_lister = 1, + .activate_with_single_click = 1, + .small_size = 1, + .ui_key = cell_box->key); + } } // rjf: reversion @@ -6524,7 +6528,7 @@ rd_window_frame(void) } if(!ui_key_match(ui_key_zero(), ws->query_regs->ui_key)) { - query_width_px = is_small ? (ui_top_font_size()*25.f) : (ui_top_font_size()*60.f); + query_width_px = is_small ? (ui_top_font_size()*28.f) : (ui_top_font_size()*60.f); max_query_height_px = is_small ? (ui_top_font_size()*40.f) : (ui_top_font_size()*80.f); } F32 query_height_px = max_query_height_px; @@ -11917,7 +11921,7 @@ rd_frame(void) s("tab_commands"), s("text_pt_commands"), s("text_range_commands"), - s("eval_commands"), + s("memory_eval_commands"), }; for EachElement(idx, names) { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 8be923bb..5ce74569 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -86,13 +86,13 @@ enum typedef U32 RD_CmdKindFlags; enum { - RD_CmdKindFlag_ListInUI = (1<<0), - RD_CmdKindFlag_ListInIPCDocs = (1<<1), - RD_CmdKindFlag_ListInTab = (1<<2), - RD_CmdKindFlag_ListInTextPt = (1<<3), - RD_CmdKindFlag_ListInTextRng = (1<<4), - RD_CmdKindFlag_ListInEval = (1<<5), - RD_CmdKindFlag_ListInMemory = (1<<6), + RD_CmdKindFlag_ListInUI = (1<<0), + RD_CmdKindFlag_ListInIPCDocs = (1<<1), + RD_CmdKindFlag_ListInTab = (1<<2), + RD_CmdKindFlag_ListInTextPt = (1<<3), + RD_CmdKindFlag_ListInTextRng = (1<<4), + RD_CmdKindFlag_ListInMemoryEval = (1<<5), + RD_CmdKindFlag_ListInMemory = (1<<6), }; //////////////////////////////// diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 9d9befcc..82203fca 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -34,7 +34,7 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands) (str8_match(type->name, s("text_pt_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTextPt) || (str8_match(type->name, s("text_range_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTextRng) || (str8_match(type->name, s("tab_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTab) || - (str8_match(type->name, s("eval_commands"), 0) && info->flags & RD_CmdKindFlag_ListInEval) || + (str8_match(type->name, s("memory_eval_commands"), 0) && info->flags & RD_CmdKindFlag_ListInMemoryEval) || (str8_match(type->name, s("memory_commands"), 0) && info->flags & RD_CmdKindFlag_ListInMemory)); if(show) { diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 0e896bd8..911ef5fb 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,13 +4,7 @@ //////////////////////////////// //~ rjf: post-0.9.26 TODO notes // -// [ ] unwinding crash - f5 on bp in w32_http_status_callback to repro -// [ ] unwinding in jit page - fail -// [ ] jeff stepping bug // [ ] wassim memory bug -// [ ] switch off spoofs for step-over -// [x] test concepts -> base -// [x] debugger, d2r, p2r exemplar / determinism testing // // [ ] symbol server // [ ] core dump saving/loading @@ -278,6 +272,12 @@ // [x] external window focusing bugs // [x] "autos" collection, which can be evaluated // [x] show "autos" inline in source code near thread? +// [x] switch off spoofs for step-over +// [x] jeff stepping bug +// [x] unwinding crash - f5 on bp in w32_http_status_callback to repro +// [x] unwinding in jit page - fail +// [x] test concepts -> base +// [x] debugger, d2r, p2r exemplar / determinism testing //////////////////////////////// //~ rjf: Build Options diff --git a/src/win32/http/win32_http.c b/src/win32/http/win32_http.c index daa6f850..27ca1aae 100644 --- a/src/win32/http/win32_http.c +++ b/src/win32/http/win32_http.c @@ -65,6 +65,7 @@ http_init(void) for EachElement(idx, w32_http_state->active_requests) { w32_http_state->active_requests[idx].arena = arena_alloc(); + w32_http_state->active_requests[idx].finished_body_arena = arena_alloc(); } w32_http_state->hSession = WinHttpOpen(0, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC); WinHttpSetStatusCallback(w32_http_state->hSession, w32_http_status_callback, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0); @@ -138,6 +139,7 @@ http_async_tick(void) req = &w32_http_state->active_requests[free_slot_num-1]; req->active = 1; arena_clear(req->arena); + arena_clear(req->finished_body_arena); req->out_ring = out_ring; req->id = params.id; req->status = W32_HTTP_RequestStatus_Null; @@ -323,6 +325,7 @@ http_async_tick(void) WinHttpReceiveResponse(req->hRequest, 0); } } + lane_sync(); } //- rjf: push response output @@ -366,7 +369,7 @@ http_async_tick(void) String8 body = str8_list_join(scratch.arena, &req->finished_body_pieces, 0); // rjf: clear current body output - arena_pop_to(req->arena, req->arena_start_body_read_pos); + arena_clear(req->finished_body_arena); MemoryZeroStruct(&req->finished_body_pieces); // rjf: compute size per record header @@ -386,13 +389,16 @@ http_async_tick(void) // rjf: advance by that amount of the body next_off = off + body_data_size; + // rjf: determine if we have more responses after this one + B32 is_last = (next_off == body.size && (status == W32_HTTP_RequestStatus_Done || status == W32_HTTP_RequestStatus_Failed)); + B32 has_more = !is_last; + // rjf: serialize this record String8 record_data = {0}; + if(is_last || next_off != off) { String8List pieces = {0}; U64 record_size = bytes_per_record_header + (next_off - off); - B32 is_last = (next_off == body.size && (status == W32_HTTP_RequestStatus_Done || status == W32_HTTP_RequestStatus_Failed)); - B32 has_more = !is_last; str8_list_push(scratch.arena, &pieces, str8_struct(&record_size)); str8_list_push(scratch.arena, &pieces, str8_struct(&req->id)); str8_list_push(scratch.arena, &pieces, str8_struct(&req->total_response_bytes_sent)); @@ -404,18 +410,24 @@ http_async_tick(void) } // rjf: push this record - B32 push_failed = 0; + B32 push_failed = 1; + if(record_data.size != 0) { RingGuard g = guarded_ring_open(req->out_ring); - if(!guarded_ring_write_string_or_wait(&g, record_data, 0)) - { - push_failed = 1; - String8 unpushed_body_piece = str8_substr(body, r1u64(off, body.size)); - str8_list_push(req->arena, &req->finished_body_pieces, str8_copy(req->arena, unpushed_body_piece)); - } + push_failed = !guarded_ring_write_string_or_wait(&g, record_data, 0); guarded_ring_close(&g); } + // rjf: push failed -> remember unsent portions of body + if(push_failed) + { + String8 unpushed_body_piece = str8_substr(body, r1u64(off, body.size)); + if(unpushed_body_piece.size != 0) + { + str8_list_push(req->finished_body_arena, &req->finished_body_pieces, str8_copy(req->finished_body_arena, unpushed_body_piece)); + } + } + // rjf: advance total bytes sent if(!push_failed) { @@ -432,6 +444,7 @@ http_async_tick(void) scratch_end(scratch); } } + lane_sync(); } //- rjf: kick off body size queries @@ -444,12 +457,16 @@ http_async_tick(void) { if(req->next_body_piece_size != 0) { - str8_list_push(req->arena, &req->finished_body_pieces, str8((U8 *)req->next_body_piece, req->next_body_piece_size)); + str8_list_push(req->finished_body_arena, &req->finished_body_pieces, str8_copy(req->finished_body_arena, str8((U8 *)req->next_body_piece, req->next_body_piece_size))); + req->next_body_piece_size = 0; + req->next_body_piece = 0; + arena_pop_to(req->arena, req->arena_start_body_read_pos); } ins_atomic_u32_eval_assign(&req->status, W32_HTTP_RequestStatus_PendingDataSize); WinHttpQueryDataAvailable(req->hRequest, 0); } } + lane_sync(); } //- rjf: kick off body reads @@ -465,6 +482,7 @@ http_async_tick(void) WinHttpReadData(req->hRequest, req->next_body_piece, req->next_body_piece_size, 0); } } + lane_sync(); } //- rjf: complete requests @@ -480,6 +498,7 @@ http_async_tick(void) { req->active = 0; arena_clear(req->arena); + arena_clear(req->finished_body_arena); MemoryZeroStruct(&req->finished_body_pieces); req->next_body_piece = 0; req->next_body_piece_size = 0; @@ -487,6 +506,7 @@ http_async_tick(void) WinHttpCloseHandle(req->hRequest); } } + lane_sync(); } } @@ -536,15 +556,16 @@ http_push_request(GuardedRing *out_ring, HTTP_RequestParams *params, U64 endt_us internal B32 http_pop_response(Arena *arena, GuardedRing *out_ring, HTTP_Response *response_out, U64 endt_us) { - U64 data_size = 0; RingGuard g = guarded_ring_open(out_ring); + U64 data_size = 0; B32 result = guarded_ring_read_struct_or_wait(&g, &data_size, endt_us); if(result) { + Temp scratch = scratch_begin(&arena, 1); U64 data_size_minus_size_prefix = data_size - sizeof(data_size); String8 data = {0}; data.size = data_size_minus_size_prefix; - data.str = push_array(arena, U8, data.size); + data.str = push_array(scratch.arena, U8, data.size); guarded_ring_read_or_wait(&g, data.size, data.str, max_U64); U64 off = 0; off += str8_deserial_read_struct(data, off, &response_out->id); @@ -555,6 +576,7 @@ http_pop_response(Arena *arena, GuardedRing *out_ring, HTTP_Response *response_o response_out->body.size = (data.size - off); response_out->body.str = push_array(arena, U8, response_out->body.size); off += str8_deserial_read(data, off, response_out->body.str, response_out->body.size, 1); + scratch_end(scratch); } guarded_ring_close(&g); return result; diff --git a/src/win32/http/win32_http.h b/src/win32/http/win32_http.h index d1fc8ac6..190dbaa4 100644 --- a/src/win32/http/win32_http.h +++ b/src/win32/http/win32_http.h @@ -27,8 +27,12 @@ struct W32_HTTP_Request { B32 active; Arena *arena; + + // rjf: request parameters GuardedRing *out_ring; U64 id; + + // rjf: working state W32_HTTP_RequestStatus status; HINTERNET hConnect; HINTERNET hRequest; @@ -38,9 +42,12 @@ struct W32_HTTP_Request U64 total_response_bytes_sent; U64 total_response_bytes; U64 arena_start_body_read_pos; - String8List finished_body_pieces; void *next_body_piece; U64 next_body_piece_size; + + // rjf: finished response body read state + Arena *finished_body_arena; + String8List finished_body_pieces; }; typedef struct W32_HTTP_Response W32_HTTP_Response; From 5ae286d67ea8b85ca04c33768102bba808bb4428 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 14:01:09 -0700 Subject: [PATCH 750/850] setting for auto-downloading missing debug info (off by default); command for manually loading module debug info as-needed --- src/dbg_engine/dbg_engine.mdesk | 3 +++ src/dbg_engine/dbg_engine_ctrl.c | 29 ++++++++++++++++------ src/dbg_engine/dbg_engine_ctrl.h | 4 +++ src/dbg_engine/dbg_engine_user.c | 27 +++++++++++++++++++- src/dbg_engine/dbg_engine_user.h | 3 ++- src/dbg_engine/generated/dbg_engine.meta.h | 1 + src/dbg_info/dbg_info.c | 22 +++++++++++++--- src/dbg_info/dbg_info.h | 8 ++++++ src/raddbg/generated/raddbg.meta.c | 8 +++--- src/raddbg/generated/raddbg.meta.h | 3 ++- src/raddbg/raddbg.mdesk | 4 +++ src/raddbg/raddbg_core.c | 6 +++-- src/raddbg/raddbg_main.c | 3 +++ 13 files changed, 103 insertions(+), 18 deletions(-) diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 98193d7e..cf54339b 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -50,6 +50,9 @@ D_CmdTable: // | | | | {SetEntityColor 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_entity_color" "Set Entity Color" "Sets the passed entity's color." "" "" } {SetEntityName 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_entity_name" "Set Entity Name" "Sets the passed entity's name." "" "" } + //- rjf: modules + {DownloadModuleDebugInfo 1 1 0 0 "query:modules" CtrlEntity null Nil Null 0 0 0 0 0 1 1 Module "download_module_debug_info" "Download Module Debug Info" "Tries to download a module's debug info from symbol server(s)." "" "" } + //- rjf: attaching {Attach 1 1 0 0 "query:unattached_processes" PID null Nil Null 0 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" "" } diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 36ab49ce..172b30e3 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -379,6 +379,7 @@ d_serialized_string_from_msg_list(Arena *arena, D_MsgList *msgs) str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->exit_code); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_inherit); str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->debug_subprocesses); + str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->auto_download_debug_info); str8_serial_push_array (scratch.arena, &msgs_srlzed, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); // rjf: write path string @@ -479,6 +480,7 @@ d_msg_list_from_serialized_string(Arena *arena, String8 string) read_off += str8_deserial_read_struct(string, read_off, &msg->exit_code); read_off += str8_deserial_read_struct(string, read_off, &msg->env_inherit); read_off += str8_deserial_read_struct(string, read_off, &msg->debug_subprocesses); + read_off += str8_deserial_read_struct(string, read_off, &msg->auto_download_debug_info); read_off += str8_deserial_read_array (string, read_off, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters)); // rjf: read path string @@ -2294,6 +2296,7 @@ d_ctrl_thread__entry_point(void *p) MemoryZeroStruct(&d_ctrl_state->msg_user_bp_touched_files); MemoryZeroStruct(&d_ctrl_state->msg_user_bp_touched_symbols); MemoryCopyArray(d_ctrl_state->exception_code_filters, msg->exception_code_filters); + d_ctrl_state->auto_download_debug_info = msg->auto_download_debug_info; } //- rjf: gather all touched symbols by user breakpoints @@ -2384,7 +2387,6 @@ d_ctrl_thread__entry_point(void *p) }break; case D_MsgKind_SetModuleDebugInfoPath: { - D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; String8 path = msg->path; D_Entity *module = d_entity_from_handle(msg->entity); D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); @@ -2433,7 +2435,6 @@ d_ctrl_thread__entry_point(void *p) //- rjf: update thread register cache ProfScope("update thread register cache") { - D_EntityCtx *entity_ctx = &d_ctrl_state->ctrl_thread_entity_store->ctx; D_EntityArray threads = d_entity_array_from_kind(D_EntityKind_Thread); X64_RegBlock *blocks = push_array(scratch.arena, X64_RegBlock, threads.count); { @@ -2636,6 +2637,11 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM } } + ////////////////////////////// + //- rjf: compute local symbol server cache path for this debug info + // + String8 local_symbol_server_cache_path = smsv_local_path_from_key(scratch.arena, str8_skip_last_slash(module_info->debug_info_path), module_info->debug_info_guid, module_info->debug_info_age); + ////////////////////////////// //- rjf: pick default initial debug info path // @@ -2665,6 +2671,11 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM str8_list_pushf(scratch.arena, &candidates, "%S.rdi", exe_path); } + // rjf: push local symbol server cache's path + { + str8_list_push(scratch.arena, &candidates, local_symbol_server_cache_path); + } + // rjf: pick first candidate that works for EachNode(n, String8Node, candidates.first) { @@ -2679,14 +2690,15 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM } ////////////////////////////// - //- rjf: no found debug info path -> try to fall back on symbol server cache path + //- rjf: no found debug info path -> try to fall back on symbol server cache path. // -#if 1 - if(initial_debug_info_path.size == 0) + // if it exists, we can just use it. if it doesn't, then we only want to pick it *if* + // automatic downloads are enabled. + // + if(initial_debug_info_path.size == 0 && d_ctrl_state->auto_download_debug_info) { - initial_debug_info_path = smsv_local_path_from_key(arena, str8_skip_last_slash(module_info->debug_info_path), module_info->debug_info_guid, module_info->debug_info_age); + initial_debug_info_path = str8_copy(arena, local_symbol_server_cache_path); } -#endif ////////////////////////////// //- rjf: write 1 at attachment marker, to signify attachment @@ -2706,6 +2718,9 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM info.unwinder = unwinder; info.unwind_info = unwind_info_opaque; info.local_debug_info_path = initial_debug_info_path; + info.dbg_name = str8_copy(arena, str8_skip_last_slash(module_info->debug_info_path)); + info.dbg_guid = module_info->debug_info_guid; + info.dbg_age = module_info->debug_info_age; info.raddbg_attached_marker_voff = module_info->raddbg_is_attached_marker_voff; info.raddbg_data = raddbg_data; } diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index eb2f35e9..47a8a750 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -169,6 +169,9 @@ struct D_ModuleInfo UWND_Unwinder unwinder; void *unwind_info; String8 local_debug_info_path; + String8 dbg_name; + Guid dbg_guid; + U64 dbg_age; U64 raddbg_attached_marker_voff; String8 raddbg_data; }; @@ -365,6 +368,7 @@ struct D_CtrlState Arena *user_entry_point_arena; String8List user_entry_points; U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64]; + B32 auto_download_debug_info; U64 process_counter; Arena *dbg_dir_arena; D_DbgDirNode *dbg_dir_root; diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index b3fc7594..0130afc1 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -1582,7 +1582,7 @@ d_next_cmd(D_Cmd **cmd) //~ rjf: Main Layer Top-Level Calls internal D_EventList -d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64]) +d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64], B32 auto_download_debug_info) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -1832,6 +1832,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->debug_subprocesses = target->debug_subprocesses; msg->env_inherit = 1; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; str8_list_push(scratch.arena, &msg->entry_points, custom_entry_point_name); msg->env_string_list = env; } @@ -1864,6 +1865,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->exit_code = 1; msg->entity = process->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; } }break; case D_CmdKind_KillAll: @@ -1872,6 +1874,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->kind = D_MsgKind_KillAll; msg->exit_code = 1; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; }break; case D_CmdKind_Detach: { @@ -1886,6 +1889,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->kind = D_MsgKind_Detach; msg->entity = process->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; } }break; case D_CmdKind_Continue: @@ -2111,6 +2115,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); msg->kind = (should_freeze ? D_MsgKind_FreezeThread : D_MsgKind_ThawThread); msg->entity = e->handle; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; } } if(d_ctrl_targets_running()) @@ -2135,6 +2141,22 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P d_entity_equip_string(d_user_state->ctrl_entity_store, entity, params->string); }break; + //- rjf: modules + case D_CmdKind_DownloadModuleDebugInfo: + { + Access *access = access_open(); + D_ModuleInfo *info = d_info_from_module(access, params->entity); + String8 symbol_server_local_cache_path = smsv_local_path_from_key(scratch.arena, info->dbg_name, info->dbg_guid, info->dbg_age); + smsv_fill_local_path(symbol_server_local_cache_path); + D_Msg *msg = d_msg_list_push(scratch.arena, &ctrl_msgs); + msg->kind = D_MsgKind_SetModuleDebugInfoPath; + msg->entity = params->entity; + msg->path = symbol_server_local_cache_path; + MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; + access_close(access); + }break; + //- rjf: attaching case D_CmdKind_Attach: { @@ -2145,6 +2167,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->kind = D_MsgKind_Attach; msg->entity_id = pid; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; } }break; @@ -2156,6 +2179,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->kind = D_MsgKind_OpenCrashDump; msg->path = str8_copy(scratch.arena, file_path); MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; }break; } @@ -2182,6 +2206,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->entity = run_thread->handle; msg->parent = process->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + msg->auto_download_debug_info = auto_download_debug_info; MemoryCopyStruct(&msg->traps, &run_traps); D_BreakpointArray *bp_batches[] = { diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index 0236384d..af29c05d 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -193,6 +193,7 @@ struct D_Msg U32 exit_code; B32 env_inherit; B32 debug_subprocesses; + B32 auto_download_debug_info; U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64]; String8 path; String8List entry_points; @@ -480,6 +481,6 @@ internal B32 d_next_cmd(D_Cmd **cmd); //////////////////////////////// //~ rjf: Main Layer Top-Level Calls -internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64]); +internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64], B32 auto_download_debug_info); #endif // DBG_ENGINE_USER_H diff --git a/src/dbg_engine/generated/dbg_engine.meta.h b/src/dbg_engine/generated/dbg_engine.meta.h index 39032533..87e6284a 100644 --- a/src/dbg_engine/generated/dbg_engine.meta.h +++ b/src/dbg_engine/generated/dbg_engine.meta.h @@ -42,6 +42,7 @@ D_CmdKind_FreezeEntity, D_CmdKind_ThawEntity, D_CmdKind_SetEntityColor, D_CmdKind_SetEntityName, +D_CmdKind_DownloadModuleDebugInfo, D_CmdKind_Attach, D_CmdKind_OpenCrashDump, D_CmdKind_COUNT, diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index bb12c6fe..bb7f7f81 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -100,6 +100,15 @@ di_init(CmdLine *cmdline) di_shared->event_arena = arena_alloc(); } +//////////////////////////////// +//~ rjf: Settings Submission + +internal void +di_set_auto_downloads(B32 auto_downloads) +{ + ins_atomic_u32_eval_assign(&di_shared->auto_downloads, auto_downloads); +} + //////////////////////////////// //~ rjf: Path * Timestamp Cache Submission & Lookup @@ -690,10 +699,17 @@ di_async_tick(void) String8 symbol_cache_path = smsv_cache_path(); if(str8_match(symbol_cache_path, og_path, StringMatchFlag_RightSideSloppy|StringMatchFlag_SlashInsensitive)) { - og_is_downloading = 1; - smsv_fill_local_path(og_path); + if(di_shared->auto_downloads) + { + og_is_downloading = 1; + smsv_fill_local_path(og_path); + } SMSV_Status status = smsv_status_from_local_path(og_path); - if(status == SMSV_Status_Null) + if(status == SMSV_Status_Pending) + { + og_is_downloading = 1; + } + else if(status == SMSV_Status_Null) { og_is_downloading = 0; } diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 0cff1bea..a4272d9c 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -249,6 +249,9 @@ struct DI_Shared U64 load_gen; U64 load_count; + // rjf: settings + B32 auto_downloads; + // rjf: key -> path cache U64 key2path_slots_count; DI_KeySlot *key2path_slots; @@ -315,6 +318,11 @@ internal DI_KeyArray di_key_array_from_list(Arena *arena, DI_KeyList *list); internal void di_init(CmdLine *cmdline); +//////////////////////////////// +//~ rjf: Settings Submission + +internal void di_set_auto_downloads(B32 auto_downloads); + //////////////////////////////// //~ rjf: Path * Timestamp Cache Submission & Lookup diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index f55bdebf..7fd6961c 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -62,7 +62,7 @@ str8_lit_comp(""), str8_lit_comp(""), }; -RD_VocabInfo rd_vocab_info_table[367] = +RD_VocabInfo rd_vocab_info_table[368] = { {str8_lit_comp("type_view"), str8_lit_comp("type_views"), str8_lit_comp("Type View"), str8_lit_comp("Type Views"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -210,6 +210,7 @@ RD_VocabInfo rd_vocab_info_table[367] = {str8_lit_comp("thaw_entity"), str8_lit_comp(""), str8_lit_comp("Thaw Entity"), str8_lit_comp(""), RD_IconKind_Locked}, {str8_lit_comp("set_entity_color"), str8_lit_comp(""), str8_lit_comp("Set Entity Color"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("set_entity_name"), str8_lit_comp(""), str8_lit_comp("Set Entity Name"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("download_module_debug_info"), str8_lit_comp(""), str8_lit_comp("Download Module Debug Info"), str8_lit_comp(""), RD_IconKind_Module}, {str8_lit_comp("attach"), str8_lit_comp(""), str8_lit_comp("Attach"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("open_crash_dump"), str8_lit_comp(""), str8_lit_comp("Open Crash Dump"), str8_lit_comp(""), RD_IconKind_FileOutline}, {str8_lit_comp("exit"), str8_lit_comp(""), str8_lit_comp("Exit"), str8_lit_comp(""), RD_IconKind_X}, @@ -435,7 +436,7 @@ RD_VocabInfo rd_vocab_info_table[367] = RD_NameSchemaInfo rd_name_schema_info_table[39] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n\n //- rjf: symbol server\n @default(0) @display_name('Auto Download Debug Info') @Description(\"Automatically tries to download missing debug info from symbol server(s).\")\n 'auto_download_debug_info': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, @@ -586,7 +587,7 @@ Rng1U64 rd_reg_slot_range_table[51] = {OffsetOf(RD_Regs, wm_event), OffsetOf(RD_Regs, wm_event) + sizeof(WM_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[255] = +RD_CmdKindInfo rd_cmd_kind_info_table[256] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -622,6 +623,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[255] = { str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("download_module_debug_info"), str8_lit_comp("Tries to download a module's debug info from symbol server(s)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CtrlEntity, str8_lit_comp("query:modules"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 5eb85370..ddadfd88 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -98,6 +98,7 @@ RD_CmdKind_FreezeEntity, RD_CmdKind_ThawEntity, RD_CmdKind_SetEntityColor, RD_CmdKind_SetEntityName, +RD_CmdKind_DownloadModuleDebugInfo, RD_CmdKind_Attach, RD_CmdKind_OpenCrashDump, RD_CmdKind_Exit, @@ -615,7 +616,7 @@ Z(getting_started)\ C_LINKAGE_BEGIN extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; -extern RD_VocabInfo rd_vocab_info_table[367]; +extern RD_VocabInfo rd_vocab_info_table[368]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; extern String8 rd_reg_slot_code_name_table[51]; extern Rng1U64 rd_reg_slot_range_table[51]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 264b9372..be68ee88 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -316,6 +316,10 @@ RD_VocabTable: //- rjf: auto-load last project @default(0) @display_name('Auto Load Last Project') @description("Enables loading the most recently opened project, if one is not specified from the command line.") 'auto_load_last_project': bool, + + //- rjf: symbol server + @default(0) @display_name('Auto Download Debug Info') @Description("Automatically tries to download missing debug info from symbol server(s).") + 'auto_download_debug_info': bool, } ``` } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index bec8336e..d3e51a0f 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11186,6 +11186,8 @@ rd_frame(void) ////////////////////////////// //- rjf: apply debug info config trees -> loaded debug info cache // + B32 auto_download_debug_info = rd_setting_b32_from_name(s("auto_download_debug_info")); + di_set_auto_downloads(auto_download_debug_info); ProfScope("apply debug info config trees -> loaded debug info cache") { U64 current_update_tick_idx = update_tick_idx(); @@ -17319,7 +17321,7 @@ rd_frame(void) } //////////////////////////// - //- rjf: gather exception code filters + //- rjf: gather debug engine settings // U64 exception_code_filters[(D_ExceptionCodeKind_COUNT+63)/64] = {0}; { @@ -17344,7 +17346,7 @@ rd_frame(void) } U64 cmd_count_pre_tick = rd_state->cmds[0].count; B32 soft_halt_issued = d_user_state->ctrl_soft_halt_issued; - D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters); + D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters, auto_download_debug_info); //////////////////////////// //- rjf: process debug engine events diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 911ef5fb..bbd74178 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -4,6 +4,9 @@ //////////////////////////////// //~ rjf: post-0.9.26 TODO notes // +// [ ] debug info loading retry mechanism, in cases where the load failed, but settings/filesystem state changes - +// e.g. turn on automatic downloads, already tried to load symbol server cache file that doesn't exist -> +// need to retry // [ ] wassim memory bug // // [ ] symbol server From fde13f52d3f67ed54f8fae718fac81f136174f2c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 14:56:34 -0700 Subject: [PATCH 751/850] fix nil text visualizations; fix auto-load-recent-project --- project.raddbg | 2 +- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 +- src/raddbg/raddbg_core.c | 15 ++++++++------- src/raddbg/raddbg_core.h | 1 + src/text/text.c | 7 ++++++- src/text/text.h | 8 ++++++++ 7 files changed, 26 insertions(+), 11 deletions(-) diff --git a/project.raddbg b/project.raddbg index a3b23cac..4f2ecc8e 100644 --- a/project.raddbg +++ b/project.raddbg @@ -5,7 +5,7 @@ target: { executable: "build/raddbg.exe" working_directory: "../raddebugger" - arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project" + arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 enabled: 1 } diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 7fd6961c..1600a234 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -436,7 +436,7 @@ RD_VocabInfo rd_vocab_info_table[368] = RD_NameSchemaInfo rd_name_schema_info_table[39] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n\n //- rjf: symbol server\n @default(0) @display_name('Auto Download Debug Info') @Description(\"Automatically tries to download missing debug info from symbol server(s).\")\n 'auto_download_debug_info': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n\n //- rjf: symbol server\n @default(0) @display_name('Auto Download Debug Info') @description(\"Automatically tries to download missing debug info from symbol server(s).\")\n 'auto_download_debug_info': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index be68ee88..6ec929b3 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -318,7 +318,7 @@ RD_VocabTable: 'auto_load_last_project': bool, //- rjf: symbol server - @default(0) @display_name('Auto Download Debug Info') @Description("Automatically tries to download missing debug info from symbol server(s).") + @default(0) @display_name('Auto Download Debug Info') @description("Automatically tries to download missing debug info from symbol server(s).") 'auto_download_debug_info': bool, } ``` diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index d3e51a0f..7421284d 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -331,6 +331,7 @@ rd_setting_from_name(String8 name) CfgSeedTask panel_task = {0, &cfg_nil_node, 1}; if(panel_task.cfg == &cfg_nil_node) { panel_task.cfg = cfg_node_from_id(rd_regs()->panel); } if(panel_task.cfg == &cfg_nil_node) { panel_task.cfg = cfg_node_from_id(rd_regs()->window); } + if(panel_task.cfg == &cfg_nil_node) { panel_task.cfg = cfg_node_child_from_string(cfg_node_root(), s("user")); } CfgSeedTask view_task = {&panel_task, view_cfg, 1}; CfgSeedTask *first_task = &view_task; CfgSeedTask *last_task = &panel_task; @@ -11186,8 +11187,7 @@ rd_frame(void) ////////////////////////////// //- rjf: apply debug info config trees -> loaded debug info cache // - B32 auto_download_debug_info = rd_setting_b32_from_name(s("auto_download_debug_info")); - di_set_auto_downloads(auto_download_debug_info); + di_set_auto_downloads(rd_state->auto_download_debug_info); ProfScope("apply debug info config trees -> loaded debug info cache") { U64 current_update_tick_idx = update_tick_idx(); @@ -12757,11 +12757,12 @@ rd_frame(void) //- rjf: evaluate unpacked settings (must be used earlier than this point in the frame, // but cannot evaluate before this point, so we need to prep for next frame // - rd_state->alt_menu_bar_enabled = rd_setting_b32_from_name(str8_lit("focus_menu_bar_with_alt")); - rd_state->use_default_stl_type_views = rd_setting_b32_from_name(str8_lit("use_default_stl_type_views")); - rd_state->use_default_ue_type_views = rd_setting_b32_from_name(str8_lit("use_default_ue_type_views")); + rd_state->alt_menu_bar_enabled = rd_setting_b32_from_name(s("focus_menu_bar_with_alt")); + rd_state->use_default_stl_type_views = rd_setting_b32_from_name(s("use_default_stl_type_views")); + rd_state->use_default_ue_type_views = rd_setting_b32_from_name(s("use_default_ue_type_views")); + rd_state->auto_download_debug_info = rd_setting_b32_from_name(s("auto_download_debug_info")); rd_state->eval_viz_base_string_flags = 0; - if(rd_setting_b32_from_name(str8_lit("display_pointer_addresses_before_contents"))) + if(rd_setting_b32_from_name(s("display_pointer_addresses_before_contents"))) { rd_state->eval_viz_base_string_flags |= EV_StringFlag_AddressesBeforeContent; } @@ -17346,7 +17347,7 @@ rd_frame(void) } U64 cmd_count_pre_tick = rd_state->cmds[0].count; B32 soft_halt_issued = d_user_state->ctrl_soft_halt_issued; - D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters, auto_download_debug_info); + D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters, rd_state->auto_download_debug_info); //////////////////////////// //- rjf: process debug engine events diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 5ce74569..5636788f 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -414,6 +414,7 @@ struct RD_State B32 alt_menu_bar_enabled; B32 use_default_stl_type_views; B32 use_default_ue_type_views; + B32 auto_download_debug_info; EV_StringFlags eval_viz_base_string_flags; // rjf: animation rates diff --git a/src/text/text.c b/src/text/text.c index c64f8c4c..d45addb4 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -3002,13 +3002,18 @@ txt_text_info_from_hash_lang(Access *access, U128 hash, TXT_LangKind lang) } key = {hash, lang}; #pragma pack(pop) String8 key_string = str8_struct(&key); - AC_Artifact artifact = ac_artifact_from_key(access, key_string, txt_artifact_create, txt_artifact_destroy, 0, .flags = AC_Flag_Wide); + B32 stale = 0; + AC_Artifact artifact = ac_artifact_from_key(access, key_string, txt_artifact_create, txt_artifact_destroy, 0, .flags = AC_Flag_Wide, .stale_out = &stale); TXT_Artifact *txt_artifact = (TXT_Artifact *)artifact.u64[0]; TXT_TextInfo info = {0}; if(txt_artifact != 0) { info = txt_artifact->info; } + else if(!stale) + { + info = txt_info_nil; + } return info; } diff --git a/src/text/text.h b/src/text/text.h index 23293f3c..2f039b9e 100644 --- a/src/text/text.h +++ b/src/text/text.h @@ -177,6 +177,14 @@ typedef TXT_TokenArray TXT_LangLexFunctionType(Arena *arena, U64 *bytes_processe //~ rjf: Globals read_only global TXT_ScopeNode txt_scope_node_nil = {0}; +read_only global Rng1U64 txt_info_line_range_nil = {0}; +read_only global TXT_TextInfo txt_info_nil = +{ + 1, + &txt_info_line_range_nil, + 0, + TXT_LineEndKind_Null, +}; //////////////////////////////// //~ rjf: Basic Helpers From e047e84433d17cd993b1feb8e44f92b6f1705606 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 15:01:01 -0700 Subject: [PATCH 752/850] do not assume writable module --- src/dbg_engine/dbg_engine_ctrl.c | 35 +++++++++++++++++--------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 172b30e3..03d71d00 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -2389,24 +2389,27 @@ d_ctrl_thread__entry_point(void *p) { String8 path = msg->path; D_Entity *module = d_entity_from_handle(msg->entity); - D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); - DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); - di_close(old_dbgi_key, 0); - MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + if(module != &d_entity_nil) { - d_entity_equip_string(d_ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); + D_Entity *debug_info_path = d_entity_child_from_kind(module, D_EntityKind_DebugInfoPath); + DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp); + di_close(old_dbgi_key, 0); + MutexScopeW(d_ctrl_state->ctrl_thread_entity_ctx_rw_mutex) + { + d_entity_equip_string(d_ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path)); + } + U64 new_dbgi_timestamp = properties_from_file_path(path).modified; + debug_info_path->timestamp = new_dbgi_timestamp; + DI_Key new_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, new_dbgi_timestamp); + di_open(new_dbgi_key); + D_EventList evts = {0}; + D_Event *evt = d_event_list_push(scratch.arena, &evts); + evt->kind = D_EventKind_ModuleDebugInfoPathChange; + evt->entity = msg->entity; + evt->string = path; + evt->timestamp = new_dbgi_timestamp; + d_c2u_push_events(&evts); } - U64 new_dbgi_timestamp = properties_from_file_path(path).modified; - debug_info_path->timestamp = new_dbgi_timestamp; - DI_Key new_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, new_dbgi_timestamp); - di_open(new_dbgi_key); - D_EventList evts = {0}; - D_Event *evt = d_event_list_push(scratch.arena, &evts); - evt->kind = D_EventKind_ModuleDebugInfoPathChange; - evt->entity = msg->entity; - evt->string = path; - evt->timestamp = new_dbgi_timestamp; - d_c2u_push_events(&evts); }break; case D_MsgKind_FreezeThread: { From 972df1a467b313a4e1636b99b701157dd55cca38 Mon Sep 17 00:00:00 2001 From: Daniel Ribeiro Maciel Date: Sat, 6 Jun 2026 14:38:39 +0200 Subject: [PATCH 753/850] fix delete button on linux --- src/linux/window_manager/linux_window_manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index 49ea308b..7681025f 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -542,7 +542,7 @@ wm_get_events(Arena *arena, B32 wait) for(U64 off = 0; off < text_size;) { UnicodeDecode decode = utf8_decode(text+off, text_size-off); - if(decode.codepoint != 0 && (decode.codepoint >= 32 || decode.codepoint == '\t')) + if(decode.codepoint != 0 && decode.codepoint != 127 && (decode.codepoint >= 32 || decode.codepoint == '\t')) { WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Text); e->window.u64[0] = (U64)window; From 562c2e3e5f65f3ac8821d5e8123072ca3a804dc4 Mon Sep 17 00:00:00 2001 From: Aiden Shi <58456527+voxxal@users.noreply.github.com> Date: Tue, 5 May 2026 17:06:22 -0700 Subject: [PATCH 754/850] fix: use `fp_flags` instead of `flags` --- src/font_cache/font_cache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/font_cache/font_cache.c b/src/font_cache/font_cache.c index 6779aa72..7b9fba5e 100644 --- a/src/font_cache/font_cache.c +++ b/src/font_cache/font_cache.c @@ -725,7 +725,7 @@ fnt_run_from_string(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, F FP_RasterFlags fp_flags = 0; if(flags & FNT_RasterFlag_Smooth) { fp_flags |= FP_RasterFlag_Smooth; } if(flags & FNT_RasterFlag_Hinted) { fp_flags |= FP_RasterFlag_Hinted; } - raster = fp_raster(scratch.arena, font_handle, floor_f32(size), flags, piece_substring); + raster = fp_raster(scratch.arena, font_handle, floor_f32(size), fp_flags, piece_substring); } // rjf: allocate portion of an atlas to upload the rasterization From 2e5a97ebf96b7cea22f7eb31a9407d5588ac1fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Mon, 27 Apr 2026 17:50:13 +0300 Subject: [PATCH 755/850] os/gfx/linux: create x11 window with gl-chosen visual / colormap --- .../window_manager/linux_window_manager.c | 26 ++++++++++++++++--- .../window_manager/linux_window_manager.h | 3 +++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index 7681025f..16ff1117 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -121,15 +121,32 @@ wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title) DLLPushBack(lnx_wm_state->first_window, lnx_wm_state->last_window, w); //- rjf: create window & equip with x11 info + Visual *visual = lnx_wm_state->window_visual; + int depth = lnx_wm_state->window_depth; + Colormap colormap = lnx_wm_state->window_colormap; + unsigned long attr_mask = 0; + XSetWindowAttributes window_attribs = {0}; + if(visual == 0) + { + visual = (Visual *)CopyFromParent; + depth = CopyFromParent; + } + else + { + window_attribs.background_pixmap = None; + window_attribs.border_pixel = 0; + window_attribs.colormap = colormap; + attr_mask = CWBackPixmap|CWBorderPixel|CWColormap; + } w->window = XCreateWindow(lnx_wm_state->display, XDefaultRootWindow(lnx_wm_state->display), 0, 0, resolution.x, resolution.y, 0, - CopyFromParent, + depth, InputOutput, - CopyFromParent, - 0, - 0); + visual, + attr_mask, + &window_attribs); XSelectInput(lnx_wm_state->display, w->window, ExposureMask| PointerMotionMask| @@ -194,6 +211,7 @@ wm_window_first_paint(WM_Window handle) if(wm_window_match(handle, wm_window_zero())) {return;} LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0]; XMapWindow(lnx_wm_state->display, w->window); + XFlush(lnx_wm_state->display); } internal void diff --git a/src/linux/window_manager/linux_window_manager.h b/src/linux/window_manager/linux_window_manager.h index eb93d05b..7ef8cb56 100644 --- a/src/linux/window_manager/linux_window_manager.h +++ b/src/linux/window_manager/linux_window_manager.h @@ -49,6 +49,9 @@ struct LNX_WM_State WM_Cursor last_set_cursor; WM_SystemInfo gfx_info; int wakeup_fd; + Visual *window_visual; + int window_depth; + Colormap window_colormap; }; //////////////////////////////// From eee1a64d1475c42e6313f33fb04f9dac1b34f781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Mon, 27 Apr 2026 17:50:21 +0300 Subject: [PATCH 756/850] render/opengl/linux/glx: publish chosen visual + colormap to os layer --- .../linux/glx/render_opengl_linux_glx.c | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/render/opengl/linux/glx/render_opengl_linux_glx.c b/src/render/opengl/linux/glx/render_opengl_linux_glx.c index 69106f1b..fecdc4a4 100644 --- a/src/render/opengl/linux/glx/render_opengl_linux_glx.c +++ b/src/render/opengl/linux/glx/render_opengl_linux_glx.c @@ -50,12 +50,22 @@ r_ogl_os_init(CmdLine *cmdln) } GLXFBConfig framebuffer_config = framebuffer_configs[0]; XFree(framebuffer_configs); - - //- rjf: construct set-window-attributes - XSetWindowAttributes set_window_attributes = {0}; - set_window_attributes.background_pixmap = None; - set_window_attributes.border_pixel = 0; - set_window_attributes.event_mask = StructureNotifyMask; + + //- extract visual/colormap from chosen fbconfig, publish to os layer + { + XVisualInfo *vi = glXGetVisualFromFBConfig(lnx_wm_state->display, framebuffer_config); + if(vi == 0) + { + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Could not get visual from GLX framebuffer config.")); + abort_self(1); + } + lnx_wm_state->window_visual = vi->visual; + lnx_wm_state->window_depth = vi->depth; + lnx_wm_state->window_colormap = XCreateColormap(lnx_wm_state->display, + XRootWindow(lnx_wm_state->display, vi->screen), + vi->visual, AllocNone); + XFree(vi); + } //- rjf: construct context { From d64912be7eb5bd1bb46e793960e415b9546ed0b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Mon, 27 Apr 2026 17:50:29 +0300 Subject: [PATCH 757/850] render/opengl/linux/egl: pick config in init; pass to context; bind pbuffer --- .../linux/egl/render_opengl_linux_egl.c | 130 ++++++++++-------- .../linux/egl/render_opengl_linux_egl.h | 1 + 2 files changed, 73 insertions(+), 58 deletions(-) diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.c b/src/render/opengl/linux/egl/render_opengl_linux_egl.c index 43e4d541..dc87a62c 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.c +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.c @@ -51,7 +51,63 @@ r_ogl_os_init(CmdLine *cmdln) wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL.")); abort_self(1); } - + + //- choose EGL config, extract matching X11 visual/colormap, publish to os layer + { + EGLint config_filter[] = + { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT, + EGL_CONFORMANT, EGL_OPENGL_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, + EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER, + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_DEPTH_SIZE, 24, + EGL_STENCIL_SIZE, 8, + EGL_NONE, + }; + EGLConfig configs[256] = {0}; + EGLint configs_count = 0; + if(!eglChooseConfig(r_ogl_lnx_state->display, config_filter, configs, ArrayCount(configs), &configs_count) || configs_count == 0) + { + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration.")); + abort_self(1); + } + int screen = DefaultScreen(lnx_wm_state->display); + XVisualInfo vi_template = {0}; + XVisualInfo *vi = 0; + int vi_count = 0; + for(EGLint idx = 0; idx < configs_count && vi == 0; idx += 1) + { + EGLint native_visual_id = 0; + if(!eglGetConfigAttrib(r_ogl_lnx_state->display, configs[idx], EGL_NATIVE_VISUAL_ID, &native_visual_id) || native_visual_id == 0) + { + continue; + } + vi_template.visualid = native_visual_id; + vi_template.screen = screen; + vi = XGetVisualInfo(lnx_wm_state->display, VisualIDMask|VisualScreenMask, &vi_template, &vi_count); + if(vi != 0 && vi_count > 0) + { + r_ogl_lnx_state->config = configs[idx]; + break; + } + if(vi != 0) { XFree(vi); vi = 0; } + } + if(vi == 0 || r_ogl_lnx_state->config == 0) + { + wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find an EGL config with a matching X11 visual.")); + abort_self(1); + } + lnx_wm_state->window_visual = vi->visual; + lnx_wm_state->window_depth = vi->depth; + lnx_wm_state->window_colormap = XCreateColormap(lnx_wm_state->display, + XRootWindow(lnx_wm_state->display, vi->screen), + vi->visual, AllocNone); + XFree(vi); + } + //- rjf: construct context { B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit("opengl_debug")); @@ -66,16 +122,23 @@ r_ogl_os_init(CmdLine *cmdln) debug_mode ? EGL_CONTEXT_OPENGL_DEBUG : EGL_NONE, EGL_TRUE, EGL_NONE, }; - r_ogl_lnx_state->context = eglCreateContext(r_ogl_lnx_state->display, 0, EGL_NO_CONTEXT, options); + r_ogl_lnx_state->context = eglCreateContext(r_ogl_lnx_state->display, r_ogl_lnx_state->config, EGL_NO_CONTEXT, options); if(r_ogl_lnx_state->context == EGL_NO_CONTEXT) { wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't create OpenGL context with EGL.")); abort_self(1); } } - - eglMakeCurrent(r_ogl_lnx_state->display, 0, 0, r_ogl_lnx_state->context); - glDrawBuffer(GL_BACK); + + //- bind context to 1x1 pbuffer so GL calls work before any window exists + { + EGLint pbuffer_attribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE }; + EGLSurface init_surface = eglCreatePbufferSurface(r_ogl_lnx_state->display, r_ogl_lnx_state->config, pbuffer_attribs); + if(init_surface == EGL_NO_SURFACE || !eglMakeCurrent(r_ogl_lnx_state->display, init_surface, init_surface, r_ogl_lnx_state->context)) + { + eglMakeCurrent(r_ogl_lnx_state->display, EGL_NO_SURFACE, EGL_NO_SURFACE, r_ogl_lnx_state->context); + } + } } internal R_Handle @@ -97,60 +160,11 @@ r_ogl_os_window_equip(WM_Window window) EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_SRGB, EGL_NONE, }; - if(r_ogl_lnx_state->config == 0) + w->surface = eglCreateWindowSurface(r_ogl_lnx_state->display, r_ogl_lnx_state->config, window_os->window, surface_options); + if(w->surface == EGL_NO_SURFACE) { - //- rjf: get all EGL configs - EGLConfig configs[256] = {0}; - EGLint configs_count = 0; - { - EGLint options[] = - { - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_CONFORMANT, EGL_OPENGL_BIT, - EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, - EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER, - - EGL_RED_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, - EGL_DEPTH_SIZE, 24, - EGL_STENCIL_SIZE, 8, - - EGL_NONE, - }; - if(!eglChooseConfig(r_ogl_lnx_state->display, options, configs, ArrayCount(configs), &configs_count) || configs_count == 0) - { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't choose EGL configuration.")); - abort_self(1); - } - } - - //- rjf: actually choose the egl config - { - EGLint config_options[] = - { - EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_SRGB, - EGL_NONE, - }; - for(U32 idx = 0; idx < configs_count; idx += 1) - { - w->surface = eglCreateWindowSurface(r_ogl_lnx_state->display, configs[idx], window_os->window, config_options); - if(w->surface != EGL_NO_SURFACE) - { - r_ogl_lnx_state->config = configs[idx]; - break; - } - } - if(r_ogl_lnx_state->config == 0) - { - wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't find a suitable EGL configuration.")); - abort_self(1); - } - } - } - else - { - w->surface = eglCreateWindowSurface(r_ogl_lnx_state->display, r_ogl_lnx_state->config, window_os->window, surface_options); + EGLint surface_options_linear[] = { EGL_NONE }; + w->surface = eglCreateWindowSurface(r_ogl_lnx_state->display, r_ogl_lnx_state->config, window_os->window, surface_options_linear); } if(w->surface == EGL_NO_SURFACE) { diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.h b/src/render/opengl/linux/egl/render_opengl_linux_egl.h index 77d687d7..27a0ba88 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.h +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.h @@ -7,6 +7,7 @@ #define glTexImage3D glTexImage3D__static #define glTexSubImage3D glTexSubImage3D__static #define glActiveTexture glActiveTexture__static +#include #include #include #undef glTexImage3D From 94da046fb675e687f6c1b45cf7ff50cb2f8ff697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Mon, 27 Apr 2026 17:50:36 +0300 Subject: [PATCH 758/850] demon/linux: derive symbol count from GNU_HASH --- src/linux/demon/linux_demon.c | 62 ++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/src/linux/demon/linux_demon.c b/src/linux/demon/linux_demon.c index 06117347..152e3951 100644 --- a/src/linux/demon/linux_demon.c +++ b/src/linux/demon/linux_demon.c @@ -676,12 +676,66 @@ lnx_dmn_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase, B32 is_rebased Assert(0 && "failed to read hash table's chain count out of HASH"); } } - else + else if(dynamic_info.gnu_hash_vaddr) { - // TODO: extract count from GNU_HASH - NotImplemented; + // GNU_HASH header: u32 nbuckets, u32 symoffset, u32 bloom_size, u32 bloom_shift, + // followed by bloom[bloom_size] (word size = 4 on 32-bit ELF, 8 on 64-bit), + // buckets[nbuckets] (u32), chains[...] (u32, terminated by entry w/ LSB set). + U32 gnu_header[4] = {0}; + if(lnx_dmn_read(memory_fd, r1u64(dynamic_info.gnu_hash_vaddr, dynamic_info.gnu_hash_vaddr + sizeof(gnu_header)), gnu_header) == sizeof(gnu_header)) + { + U32 nbuckets = gnu_header[0]; + U32 symoffset = gnu_header[1]; + U32 bloom_size = gnu_header[2]; + U64 bloom_word = (elf_class == ELF_Class_64) ? 8 : 4; + U64 buckets_vaddr = dynamic_info.gnu_hash_vaddr + sizeof(gnu_header) + bloom_size * bloom_word; + U64 chain_vaddr = buckets_vaddr + (U64)nbuckets * sizeof(U32); + + // find largest symbol index referenced by any bucket + U32 max_bucket = 0; + for(U32 b = 0; b < nbuckets; b += 1) + { + U32 entry = 0; + if(lnx_dmn_read(memory_fd, r1u64(buckets_vaddr + b*sizeof(U32), buckets_vaddr + (b+1)*sizeof(U32)), &entry) != sizeof(U32)) + { + break; + } + if(entry > max_bucket) { max_bucket = entry; } + } + + if(max_bucket < symoffset) + { + // no symbols in hash; total count is symoffset + symbol_count = symoffset; + } + else + { + // walk chain from max_bucket until terminator (entry w/ LSB set) + U64 idx = max_bucket; + for(;;) + { + U32 chain_entry = 0; + U64 entry_vaddr = chain_vaddr + (idx - symoffset) * sizeof(U32); + if(lnx_dmn_read(memory_fd, r1u64(entry_vaddr, entry_vaddr + sizeof(U32)), &chain_entry) != sizeof(U32)) + { + break; + } + if(chain_entry & 1) + { + symbol_count = idx + 1; + break; + } + idx += 1; + if(idx - max_bucket > (1u<<24)) + { + // sanity bound: don't loop forever on a corrupt chain + break; + } + } + } + } } - + // scan symbol table for the rendezvous symbol if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count) { From be8ed940bda4c66cd9301e567ef07d354f7cb688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Mon, 27 Apr 2026 18:15:31 +0300 Subject: [PATCH 759/850] eval: implement Swap; soft-fail CallSiteValue; no-op piece markers --- src/eval/eval_interpret.c | 53 +++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 84b5f8a0..dc103061 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -996,20 +996,53 @@ e_interpret(String8 bytecode) } }break; + case RDI_EvalOp_CallSiteValue: + { + // DW_OP_entry_value: requires evaluating the embedded sub-bytecode + // in this frame's entry-time register state (i.e. caller's state + // at the call instruction). that state is not currently plumbed + // into the eval context. interpreting in the current ctx gives + // wrong values for spilled args, so report BadOp instead. + // skip past the embedded sub-bytecode in the outer stream so the + // bytes are not interpreted as outer ops on resume. + U32 sub_size = imm.u32; + if(ptr + sub_size <= opl) + { + ptr += sub_size; + } + result.code = E_InterpretationCode_BadOp; + goto done; + }break; + + case RDI_EvalOp_PartialValue: + { + // DW_OP_piece marker: top-of-stack is a piece of a composite value. + // we do not assemble composites; for single-piece expressions the + // value already on the stack is the result. for multi-piece, only + // the first piece is returned (stack[0] is the final result). + }break; + + case RDI_EvalOp_PartialValueBit: + { + // DW_OP_bit_piece marker. same caveat as PartialValue. + }break; + + case RDI_EvalOp_Swap: + { + if(stack_count + 2 > stack_cap) + { + result.code = E_InterpretationCode_InsufficientStackSpace; + goto done; + } + stack[stack_count + 0] = svals[1]; + stack[stack_count + 1] = svals[0]; + stack_count += 2; + }break; + case RDI_EvalOp_PushCfa: { nval.u64 = e_interpret_ctx->cfa; }break; - - case RDI_EvalOp_CallSiteValue: - case RDI_EvalOp_PartialValue: - case RDI_EvalOp_PartialValueBit: - case RDI_EvalOp_Swap: - { - // TODO(rjf) - result.code = E_InterpretationCode_BadOp; - goto done; - }break; } // rjf: push From c05846aef1ef887a57d285dd7b3e3fe5a8f1b4c3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 15:25:45 -0700 Subject: [PATCH 760/850] fix incorrect impl of RDI_EvalOp_Swap --- src/eval/eval_interpret.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index dc103061..67b07939 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -1013,32 +1013,39 @@ e_interpret(String8 bytecode) result.code = E_InterpretationCode_BadOp; goto done; }break; - + case RDI_EvalOp_PartialValue: { // DW_OP_piece marker: top-of-stack is a piece of a composite value. // we do not assemble composites; for single-piece expressions the // value already on the stack is the result. for multi-piece, only // the first piece is returned (stack[0] is the final result). + result.code = E_InterpretationCode_BadOp; + goto done; }break; - + case RDI_EvalOp_PartialValueBit: { // DW_OP_bit_piece marker. same caveat as PartialValue. + result.code = E_InterpretationCode_BadOp; + goto done; }break; - + case RDI_EvalOp_Swap: { - if(stack_count + 2 > stack_cap) + if(stack_count >= 2) + { + E_Value swap = stack[stack_count-2]; + stack[stack_count-2] = stack[stack_count-1]; + stack[stack_count-1] = swap; + } + else { result.code = E_InterpretationCode_InsufficientStackSpace; goto done; } - stack[stack_count + 0] = svals[1]; - stack[stack_count + 1] = svals[0]; - stack_count += 2; }break; - + case RDI_EvalOp_PushCfa: { nval.u64 = e_interpret_ctx->cfa; From 7f3318309b916b1c8e35eab30915f8a6cb94d267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Sun, 10 May 2026 09:07:19 +0300 Subject: [PATCH 761/850] render/opengl/linux/glx: force GL_DRAW_BUFFER=GL_BACK after make-current --- src/render/opengl/linux/glx/render_opengl_linux_glx.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/render/opengl/linux/glx/render_opengl_linux_glx.c b/src/render/opengl/linux/glx/render_opengl_linux_glx.c index fecdc4a4..993cdf32 100644 --- a/src/render/opengl/linux/glx/render_opengl_linux_glx.c +++ b/src/render/opengl/linux/glx/render_opengl_linux_glx.c @@ -106,6 +106,9 @@ r_ogl_os_select_window(WM_Window os, R_Handle r) { LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; glXMakeCurrent(lnx_wm_state->display, w->window, r_ogl_lnx_ctx); + // ensure default framebuffer writes target the back buffer; on some drivers + // GL_DRAW_BUFFER stays GL_NONE if a context was first made current without a drawable. + glDrawBuffer(GL_BACK); } internal void From 220b2886904a6eb02d4c5eac9c90d37ee69ff09d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=87?= Date: Sun, 10 May 2026 09:07:19 +0300 Subject: [PATCH 762/850] render/opengl/linux/egl: unwrap R_OGL_Window when extracting EGL surface --- src/render/opengl/linux/egl/render_opengl_linux_egl.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.c b/src/render/opengl/linux/egl/render_opengl_linux_egl.c index dc87a62c..16c61038 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.c +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.c @@ -189,15 +189,16 @@ r_ogl_os_window_unequip(WM_Window os, R_Handle r) internal void r_ogl_os_select_window(WM_Window os, R_Handle r) { - LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; - R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0]; + // r is the outer R_OGL_Window* wrapper; the os-layer handle is .os + R_OGL_Window *outer = (R_OGL_Window *)r.u64[0]; + R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)outer->os.u64[0]; eglMakeCurrent(r_ogl_lnx_state->display, w_r->surface, w_r->surface, r_ogl_lnx_state->context); } internal void r_ogl_os_window_swap(WM_Window os, R_Handle r) { - LNX_WM_Window *w = (LNX_WM_Window *)os.u64[0]; - R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0]; + R_OGL_Window *outer = (R_OGL_Window *)r.u64[0]; + R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)outer->os.u64[0]; eglSwapBuffers(r_ogl_lnx_state->display, w_r->surface); } From 2faa9211eb1ece769b4e218c881d870081198bcb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 15:26:56 -0700 Subject: [PATCH 763/850] cleanup --- .../opengl/linux/egl/render_opengl_linux_egl.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/render/opengl/linux/egl/render_opengl_linux_egl.c b/src/render/opengl/linux/egl/render_opengl_linux_egl.c index 16c61038..4b05a425 100644 --- a/src/render/opengl/linux/egl/render_opengl_linux_egl.c +++ b/src/render/opengl/linux/egl/render_opengl_linux_egl.c @@ -51,7 +51,7 @@ r_ogl_os_init(CmdLine *cmdln) wm_graphical_message(1, str8_lit("Fatal Error"), str8_lit("Couldn't initialize EGL API to OpenGL.")); abort_self(1); } - + //- choose EGL config, extract matching X11 visual/colormap, publish to os layer { EGLint config_filter[] = @@ -103,11 +103,11 @@ r_ogl_os_init(CmdLine *cmdln) lnx_wm_state->window_visual = vi->visual; lnx_wm_state->window_depth = vi->depth; lnx_wm_state->window_colormap = XCreateColormap(lnx_wm_state->display, - XRootWindow(lnx_wm_state->display, vi->screen), - vi->visual, AllocNone); + XRootWindow(lnx_wm_state->display, vi->screen), + vi->visual, AllocNone); XFree(vi); } - + //- rjf: construct context { B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit("opengl_debug")); @@ -129,7 +129,7 @@ r_ogl_os_init(CmdLine *cmdln) abort_self(1); } } - + //- bind context to 1x1 pbuffer so GL calls work before any window exists { EGLint pbuffer_attribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE }; @@ -181,7 +181,6 @@ r_ogl_os_window_unequip(WM_Window os, R_Handle r) { R_OGL_LNX_Window *w = (R_OGL_LNX_Window *)r.u64[0]; { - } SLLStackPush(r_ogl_lnx_state->free_window, w); } @@ -189,7 +188,6 @@ r_ogl_os_window_unequip(WM_Window os, R_Handle r) internal void r_ogl_os_select_window(WM_Window os, R_Handle r) { - // r is the outer R_OGL_Window* wrapper; the os-layer handle is .os R_OGL_Window *outer = (R_OGL_Window *)r.u64[0]; R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)outer->os.u64[0]; eglMakeCurrent(r_ogl_lnx_state->display, w_r->surface, w_r->surface, r_ogl_lnx_state->context); From f57137288bcfba1428d906772eab919e52ab2667 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 15:36:59 -0700 Subject: [PATCH 764/850] check if rdi path is writable before deciding to convert to it; if it isn't writable, then redirect to a rdi cache directory --- src/dbg_info/dbg_info.c | 21 +++++++++++++++++++++ src/dbg_info/dbg_info.h | 2 ++ src/http/http_stub.c | 1 + 3 files changed, 24 insertions(+) diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index bb7f7f81..311424b4 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -750,6 +750,27 @@ di_async_tick(void) } } + //- rjf: determine if RDI path is writable; if not, need to write into the writable cache path + if(!t->og_folder_analyzed) + { + t->og_folder_analyzed = 1; + File file = file_open(AccessFlag_Write, rdi_path); + t->og_folder_is_writable = !file_match(file, file_zero()); + file_close(file); + } + + //- rjf: if RDI path is not writable -> adjust into writable cache directory + if(!t->og_folder_is_writable) + { + String8 cache_folder = get_process_info()->user_program_cache_data_path; + String8 raddbg_folder = str8f(scratch.arena, "%S/raddbg", cache_folder); + String8 rdis_folder = str8f(scratch.arena, "%S/rdis", raddbg_folder); + make_directory(cache_folder); + make_directory(raddbg_folder); + make_directory(rdis_folder); + rdi_path = str8f(scratch.arena, "%S/%S.rdi", rdis_folder, str8_chop_last_dot(str8_skip_last_slash(og_path))); + } + //- rjf: determine if RDI is stale if(!t->rdi_analyzed && !og_is_downloading) { diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index a4272d9c..85fb9a03 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -139,6 +139,8 @@ struct DI_LoadTask B32 og_analyzed; B32 og_is_rdi; + B32 og_folder_analyzed; + B32 og_folder_is_writable; U64 og_size; B32 rdi_analyzed; diff --git a/src/http/http_stub.c b/src/http/http_stub.c index 5074dcd8..73db16a5 100644 --- a/src/http/http_stub.c +++ b/src/http/http_stub.c @@ -5,6 +5,7 @@ //~ rjf: @per_os_impl Top-Level Layer Calls internal void http_init(void){} +internal void http_async_tick(void){} //////////////////////////////////////////////////////////////// //~ rjf: @per_os_impl I/O Ring Functions From 8a098c5d45bca49e4bb331c7f22dfad59a9b7c4f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 15:58:58 -0700 Subject: [PATCH 765/850] adjust rules for text view loading; handle non-evaluations / empty evaluations correctly --- src/raddbg/raddbg_core.c | 4 ++++ src/raddbg/raddbg_views.c | 5 +++-- src/text/text.c | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 7421284d..4eadb5ab 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12483,6 +12483,10 @@ rd_frame(void) C_ID id = {u128_hash_from_str8(output_label_string)}; C_Key key = c_key_make(d_user_state->output_log_root, id); U128 hash = c_hash_from_key(key, 0); + if(u128_match(hash, u128_zero())) + { + c_submit_data(key, 0, s("")); + } String8 data = c_data_from_hash(access, hash); E_Space space = e_space_make(E_SpaceKind_HashStoreKey); space.u64_0 = key.root.u64[0]; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 73411fc2..0baf42f8 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2181,7 +2181,8 @@ RD_VIEW_UI_FUNCTION_DEF(text) ////////////////////////////// //- rjf: code is not missing, but not ready -> equip loading info to this view // - if(!file_is_missing && info.lines_count == 0 && eval.msgs.max_kind == E_MsgKind_Null) + B32 is_loading = (!file_is_missing && info.lines_count == 0 && eval.msgs.max_kind == E_MsgKind_Null && eval.space.kind != E_SpaceKind_Null); + if(is_loading) { rd_store_view_loading_info(1, info.bytes_processed, info.bytes_to_process); } @@ -2189,7 +2190,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) ////////////////////////////// //- rjf: build code contents // - if(!file_is_missing) + if(!file_is_missing && eval.space.kind != E_SpaceKind_Null) { RD_CodeViewBuildFlags flags = RD_CodeViewBuildFlag_All; if(rd_regs()->file_path.size == 0) diff --git a/src/text/text.c b/src/text/text.c index d45addb4..2e414aeb 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -3024,7 +3024,10 @@ txt_text_info_from_key_lang(Access *access, C_Key key, TXT_LangKind lang, U128 * for(U64 rewind_idx = 0; rewind_idx < C_KEY_HASH_HISTORY_COUNT; rewind_idx += 1) { U128 hash = c_hash_from_key(key, rewind_idx); - result = txt_text_info_from_hash_lang(access, hash, lang); + if(!u128_match(hash, u128_zero())) + { + result = txt_text_info_from_hash_lang(access, hash, lang); + } if(result.lines_count != 0) { if(hash_out) From ffb79a67efe8d65c6568b584e1d8d560a928e67d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 16:07:16 -0700 Subject: [PATCH 766/850] be robust to missing symbol server support --- src/dbg_engine/dbg_engine_ctrl.c | 3 ++- src/dbg_info/dbg_info.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 03d71d00..bfa17682 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -2675,6 +2675,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM } // rjf: push local symbol server cache's path + if(local_symbol_server_cache_path.size != 0) { str8_list_push(scratch.arena, &candidates, local_symbol_server_cache_path); } @@ -2698,7 +2699,7 @@ d_ctrl_thread__module_open(D_Handle process, D_Handle module, U64 base_vaddr, DM // if it exists, we can just use it. if it doesn't, then we only want to pick it *if* // automatic downloads are enabled. // - if(initial_debug_info_path.size == 0 && d_ctrl_state->auto_download_debug_info) + if(initial_debug_info_path.size == 0 && d_ctrl_state->auto_download_debug_info && local_symbol_server_cache_path.size != 0) { initial_debug_info_path = str8_copy(arena, local_symbol_server_cache_path); } diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 311424b4..b6a381f2 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -697,7 +697,7 @@ di_async_tick(void) if(!file_is_present) { String8 symbol_cache_path = smsv_cache_path(); - if(str8_match(symbol_cache_path, og_path, StringMatchFlag_RightSideSloppy|StringMatchFlag_SlashInsensitive)) + if(symbol_cache_path.size != 0 && str8_match(symbol_cache_path, og_path, StringMatchFlag_RightSideSloppy|StringMatchFlag_SlashInsensitive)) { if(di_shared->auto_downloads) { From 5ddad3638071f1c084d77239503e3de0c509810b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 9 Jun 2026 16:18:47 -0700 Subject: [PATCH 767/850] zero undefined registers in eh unwind --- src/eh_frame/unwind/eh_frame_unwind.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/eh_frame/unwind/eh_frame_unwind.c b/src/eh_frame/unwind/eh_frame_unwind.c index 40b42e5f..0fedf232 100644 --- a/src/eh_frame/unwind/eh_frame_unwind.c +++ b/src/eh_frame/unwind/eh_frame_unwind.c @@ -570,8 +570,11 @@ eh_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, U64 switch(rule->code) { default: - case DW_UnwindRuleCode_Undefined: case DW_UnwindRuleCode_SameVal:{}break; + case DW_UnwindRuleCode_Undefined: + { + MemoryZero((U8 *)regs + reg_rng.min, reg_size); + }break; case DW_UnwindRuleCode_Off: { Temp temp = temp_begin(scratch.arena); From 19cb0331b0d5030d4de1ee56378ff655dbbeb717 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 10 Jun 2026 04:29:32 -0700 Subject: [PATCH 768/850] fix implicit expr parameterization in add-breakpoint margin click path --- src/raddbg/raddbg_widgets.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index fa235759..a45032df 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1880,7 +1880,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe rd_cmd(RD_CmdKind_AddBreakpoint, .file_path = params->line_vaddrs[line_idx] ? str8_zero() : rd_regs()->file_path, .cursor = params->line_vaddrs[line_idx] ? txt_pt(0, 0) : txt_pt(line_num, 1), - .vaddr = params->line_vaddrs[line_idx]); + .vaddr = params->line_vaddrs[line_idx], + .expr = s("")); } } } From 9af4c3d6143eca87c6dad3cc667fdb7844d0c3cb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 10 Jun 2026 04:42:57 -0700 Subject: [PATCH 769/850] W over A win32 window functions; wakeup on WM_CLOSE (manual merge of cbf3fd5587) --- src/win32/window_manager/win32_window_manager.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/win32/window_manager/win32_window_manager.c b/src/win32/window_manager/win32_window_manager.c index 7b209cd5..341b1b98 100644 --- a/src/win32/window_manager/win32_window_manager.c +++ b/src/win32/window_manager/win32_window_manager.c @@ -375,6 +375,7 @@ w32_wm_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_CLOSE: { w32_wm_push_event(WM_EventKind_WindowClose, window); + wm_send_wakeup_event(); }break; case WM_LBUTTONUP: @@ -1499,7 +1500,7 @@ wm_dpi_from_monitor(WM_Monitor monitor) internal void wm_send_wakeup_event(void) { - PostThreadMessageA(w32_wm_state->gfx_thread_tid, 0x401, 0, 0); + PostThreadMessageW(w32_wm_state->gfx_thread_tid, 0x401, 0, 0); } internal WM_EventList @@ -1508,13 +1509,13 @@ wm_get_events(Arena *arena, B32 wait) w32_wm_event_arena = arena; MemoryZeroStruct(&w32_wm_event_list); MSG msg = {0}; - if(!wait || GetMessage(&msg, 0, 0, 0)) + if(!wait || GetMessageW(&msg, 0, 0, 0)) { B32 first_wait = wait; - for(;first_wait || PeekMessage(&msg, 0, 0, 0, PM_REMOVE); first_wait = 0) + for(;first_wait || PeekMessageW(&msg, 0, 0, 0, PM_REMOVE); first_wait = 0) { - DispatchMessage(&msg); TranslateMessage(&msg); + DispatchMessageW(&msg); if(msg.message == WM_QUIT) { w32_wm_push_event(WM_EventKind_WindowClose, 0); @@ -1605,7 +1606,7 @@ hcursor = curs; }break; { if(hcursor != w32_wm_state->hCursor) { - PostMessage(0, WM_SETCURSOR, 0, 0); + PostMessageW(0, WM_SETCURSOR, 0, 0); POINT p = {0}; GetCursorPos(&p); SetCursorPos(p.x, p.y); From 40d9e5839fff0c6011d17fccbaf3fc196741b6fb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 10 Jun 2026 07:57:18 -0700 Subject: [PATCH 770/850] fix torture; adjust raddbg test exemplar dumping to avoid dumping info for anything other than the main module, so that we don't get non-deterministic dumps (for e.g. system PDBs) --- .../exemplar_windows | 9 ----- .../exemplar_windows | 6 ---- .../mule_main_9ff1e58f/mule_main.rdi | 4 +-- .../mule_main_9ff1e58f/mule_module.rdi | 4 +-- project.4coder | 2 +- project.raddbg | 36 ------------------- src/mule/mule_main.cpp | 16 ++++++++- src/raddbg/raddbg_core.c | 1 + src/raddbg/tests/raddbg_tests.c | 23 +++++++----- src/torture/torture_main.c | 4 +++ 10 files changed, 39 insertions(+), 66 deletions(-) diff --git a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows index 96d94635..e4c74f42 100644 --- a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows +++ b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows @@ -58,9 +58,6 @@ lines: } ip_voff: 0x1044 ip_voff_symbol: raddbg_thread_id__impl -lines -ip_voff: 0x15890 -ip_voff_symbol: "" lines: { { @@ -166,9 +163,6 @@ lines: } ip_voff: 0x1044 ip_voff_symbol: raddbg_thread_id__impl -lines -ip_voff: 0x15890 -ip_voff_symbol: "" lines: { { @@ -364,9 +358,6 @@ lines: } ip_voff: 0x1af4 ip_voff_symbol: mule_init -lines -ip_voff: 0x20830 -ip_voff_symbol: "" lines: { { diff --git a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows index 6262f50b..bc6bde92 100644 --- a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows +++ b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows @@ -73,9 +73,6 @@ lines: } ip_voff: 0x1044 ip_voff_symbol: raddbg_thread_id__impl -lines -ip_voff: 0x15890 -ip_voff_symbol: "" lines: { { @@ -271,9 +268,6 @@ lines: } ip_voff: 0x1af4 ip_voff_symbol: mule_init -lines -ip_voff: 0x20830 -ip_voff_symbol: "" lines: { { diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi b/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi index 049f7503..2125b838 100644 --- a/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi +++ b/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:87783650d5ceb1dd991ae3a01ca4a55cefc9eacd54ead4fcc5deb72af4f9b8a3 -size 2667692 +oid sha256:446e9b14f298e3824edccf61d857108d6100a3c1a3a5dcd7fa7d52fe5a1d6a8d +size 2768548 diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_module.rdi b/data/test_inputs/mule_main_9ff1e58f/mule_module.rdi index eaa2a9c0..9e6b1501 100644 --- a/data/test_inputs/mule_main_9ff1e58f/mule_module.rdi +++ b/data/test_inputs/mule_main_9ff1e58f/mule_module.rdi @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3bc47bac888fae6cbeb969e59763431847e30f380e24c9ccfd05565beacc9995 -size 5379652 +oid sha256:73c47bf20d8d12057fa9e4d12873620f6c860b1bc5d4f831b4925f03e9f7c0b4 +size 5518096 diff --git a/project.4coder b/project.4coder index 8819400a..65fc2cce 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 4f2ecc8e..e45bc52e 100644 --- a/project.raddbg +++ b/project.raddbg @@ -10,13 +10,6 @@ target: enabled: 1 } target: -{ - executable: "../raddebugger_exemplar/build/raddbg.exe" - working_directory: "../raddebugger" - arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user --project:C:/devel/raddebugger/build/raddbg_test.project" - debug_subprocesses: 0 -} -target: { executable: "build/mule_main.exe" working_directory: build @@ -37,32 +30,3 @@ target: working_directory: build arguments: "--rdi raddbg" } -target: -{ - executable: "build/debugstringperf.exe" - working_directory: build -} -target: -{ - executable: "build/radbin.exe" - working_directory: build - arguments: "--rdi raddbg.exe --thread_count=1" -} -target: -{ - executable: "build/raddbg.exe" - working_directory: build - arguments: "--bin --quiet --rdi --out:C:/devel/raddebugger_stable/build/radbin.rdi --thread_count:1 C:/devel/raddebugger_stable/build/radbin.exe" -} -target: -{ - executable: "build/raddbg.exe" - working_directory: build - arguments: "--bin --rdi C:\\SymbolCache\\ntdll.pdb\\180BF1B90AA75697D0EFEA5E5630AC7E1\\ntdll.pdb --thread_count=1" -} -target: -{ - executable: "build/raddbg.exe" - working_directory: build - arguments: "--bin --rdi --thread_count=1 C:/SymbolCache/kernel32.pdb/E02F64ED8DA50EC6E7691C0AC0BC25781/kernel32.pdb" -} diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index 8aa12f8b..2d8e933c 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -6,6 +6,10 @@ ** stepping, breakpoints, evaluation, cross-module calls. */ +#if defined(__clang__) +#define _ALLOW_COMPILER_AND_STL_VERSION_MISMATCH 1 +#endif + #if _WIN32 && _DEBUG #pragma comment(linker, "/nodefaultlib:libcmt") #pragma comment(lib, "libcmtd") @@ -2363,7 +2367,8 @@ overloaded_function(int x){ // NOTE(allen): Control Flow Stepping static void -control_flow_stepping_tests(void){ +control_flow_stepping_tests(void) +{ { int a = 1; if (a < 1){ @@ -2532,6 +2537,15 @@ control_flow_stepping_tests(void){ } while (i < 10); } +#if defined(__clang__) + for (int i = 0; i < 1; + ++i, ({ goto exit; })) + { + int x = 0; + } + exit:; +#endif + { int i = 17; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 4eadb5ab..62125b16 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -13059,6 +13059,7 @@ rd_frame(void) RDI_Symbol *procedure = rdi_procedure_from_voff(rdi, voff); String8 name = fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, procedure); name = escaped_from_raw_str8(scratch.arena, name); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_module: \"%S\"\n", str8_skip_last_slash(module->string)); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_voff: 0x%I64x\n", voff); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " ip_voff_symbol: \"%S\"\n", name); access_close(access); diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index 6956d14c..394853ef 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -181,15 +181,20 @@ rd_test__stepping_regressions(Arena *arena, TestCtx *ctx, String8 target_binary, // rjf: if we are ready for the next operation, then accumulate deterministic log info if(ready_for_next_operation) { - MD_Node *lines = md_child_from_string(state, s("lines"), 0); - MD_Node *ip_voff = md_child_from_string(state, s("ip_voff"), 0); - MD_Node *ip_voff_symbol = md_child_from_string(state, s("ip_voff_symbol"), 0); - String8 lines_dump = md_string_from_tree(scratch.arena, lines); - String8 ip_voff_dump = md_string_from_tree(scratch.arena, ip_voff); - String8 ip_voff_symbol_dump = md_string_from_tree(scratch.arena, ip_voff_symbol); - str8_list_push(scratch.arena, &test_log_strings, lines_dump); - str8_list_push(scratch.arena, &test_log_strings, ip_voff_dump); - str8_list_push(scratch.arena, &test_log_strings, ip_voff_symbol_dump); + MD_Node *ip_module = md_child_from_string(state, s("ip_module"), 0); + String8 ip_module_name = ip_module->first->string; + if(str8_match(str8_chop_last_dot(ip_module_name), target_binary, 0)) + { + MD_Node *lines = md_child_from_string(state, s("lines"), 0); + MD_Node *ip_voff = md_child_from_string(state, s("ip_voff"), 0); + MD_Node *ip_voff_symbol = md_child_from_string(state, s("ip_voff_symbol"), 0); + String8 lines_dump = md_string_from_tree(scratch.arena, lines); + String8 ip_voff_dump = md_string_from_tree(scratch.arena, ip_voff); + String8 ip_voff_symbol_dump = md_string_from_tree(scratch.arena, ip_voff_symbol); + str8_list_push(scratch.arena, &test_log_strings, lines_dump); + str8_list_push(scratch.arena, &test_log_strings, ip_voff_dump); + str8_list_push(scratch.arena, &test_log_strings, ip_voff_symbol_dump); + } } // rjf: are we without line info? -> step out diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index 567157c9..bb4fa18d 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -33,6 +33,8 @@ #include "mdesk/mdesk.h" #include "metagen/metagen.h" #include "window_manager/window_manager_inc.h" +#include "http/http_inc.h" +#include "symbol_server/symbol_server_inc.h" #include "config/config_inc.h" #include "content/content.h" #include "file_stream/file_stream.h" @@ -111,6 +113,8 @@ #include "mdesk/mdesk.c" #include "metagen/metagen.c" #include "window_manager/window_manager_inc.c" +#include "http/http_inc.c" +#include "symbol_server/symbol_server_inc.c" #include "config/config_inc.c" #include "content/content.c" #include "file_stream/file_stream.c" From 1577ea569360e0835dcaa94c748bd737ab4e45cb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 10 Jun 2026 08:39:40 -0700 Subject: [PATCH 771/850] fix rdi folder writability test to account for possibly-uncreated directories, so that we don't unnecessarily write into the user-local rdi cache --- project.4coder | 2 +- project.raddbg | 2 +- src/dbg_info/dbg_info.c | 19 +++++++++++++++++-- src/raddbg/raddbg_main.c | 28 ---------------------------- src/raddbg/raddbg_views.c | 8 ++++---- 5 files changed, 23 insertions(+), 36 deletions(-) diff --git a/project.4coder b/project.4coder index 65fc2cce..0b10da9c 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build torture", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index e45bc52e..8b22d04f 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,12 +7,12 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 - enabled: 1 } target: { executable: "build/mule_main.exe" working_directory: build + enabled: 1 } target: { diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index b6a381f2..0ec80608 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -750,13 +750,28 @@ di_async_tick(void) } } - //- rjf: determine if RDI path is writable; if not, need to write into the writable cache path + //- rjf: determine if RDI folder is writable; if not, need to write into the writable cache path if(!t->og_folder_analyzed) { t->og_folder_analyzed = 1; - File file = file_open(AccessFlag_Write, rdi_path); + String8 rdi_folder = str8_chop_last_slash(rdi_path); + for(U64 slash_pos = 0; slash_pos <= rdi_folder.size; slash_pos = str8_find_needle(rdi_folder, slash_pos+1, s("/"), StringMatchFlag_SlashInsensitive)) + { + String8 ancestor_folder = str8_substr(rdi_folder, r1u64(0, slash_pos)); + if(ancestor_folder.size != 0) + { + make_directory(ancestor_folder); + } + if(slash_pos == rdi_folder.size) + { + break; + } + } + String8 dummy_file_path = str8f(scratch.arena, "%S/writability_test", rdi_folder); + File file = file_open(AccessFlag_Write, dummy_file_path); t->og_folder_is_writable = !file_match(file, file_zero()); file_close(file); + delete_file_at_path(dummy_file_path); } //- rjf: if RDI path is not writable -> adjust into writable cache directory diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index bbd74178..a1cddf68 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -518,34 +518,6 @@ entry_point(CmdLine *cmd_line) { Temp scratch = scratch_begin(0, 0); - //- TODO(rjf): test symbol server download -#if 0 - { - GuardedRing *out_ring = guarded_ring_alloc(scratch.arena, KB(64)); - { - HTTP_RequestParams p = - { - .id = 1, - .method = HTTP_Method_Get, - .url = s("https://msdl.microsoft.com/download/symbols/ntdll.pdb/E84AF4A1E3CDFABC99A41209581EB6861/ntdll.pdb"), - }; - http_push_request(out_ring, &p, max_U64); - String8List pieces = {0}; - for(HTTP_Response r = {0}; http_pop_response(scratch.arena, out_ring, &r, max_U64);) - { - str8_list_push(scratch.arena, &pieces, r.body); - if(r.has_more == 0) - { - int x = 0; - break; - } - } - int x = 0; - } - guarded_ring_release(out_ring); - } -#endif - //- rjf: unpack command line arguments ExecMode exec_mode = ExecMode_Normal; B32 auto_run = 0; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 0baf42f8..67f12a86 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -78,24 +78,24 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla case RD_CmdKind_Search: { arena_clear(cv->find_text_arena); - cv->find_text_fwd = push_str8_copy(cv->find_text_arena, cmd->regs->string); + cv->find_text_fwd = str8_copy(cv->find_text_arena, cmd->regs->string); }break; case RD_CmdKind_SearchBackwards: { arena_clear(cv->find_text_arena); - cv->find_text_bwd = push_str8_copy(cv->find_text_arena, cmd->regs->string); + cv->find_text_bwd = str8_copy(cv->find_text_arena, cmd->regs->string); }break; case RD_CmdKind_FindNext: { String8 string = rd_view_query_input(); arena_clear(cv->find_text_arena); - cv->find_text_fwd = push_str8_copy(cv->find_text_arena, string); + cv->find_text_fwd = str8_copy(cv->find_text_arena, string); }break; case RD_CmdKind_FindPrev: { String8 string = rd_view_query_input(); arena_clear(cv->find_text_arena); - cv->find_text_bwd = push_str8_copy(cv->find_text_arena, string); + cv->find_text_bwd = str8_copy(cv->find_text_arena, string); }break; case RD_CmdKind_ToggleWatchExpressionAtMouse: { From f7ba4b2ebea958d2e603b73253cf846dfc0e1879 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 10 Jun 2026 09:54:57 -0700 Subject: [PATCH 772/850] move from fixed flags to list of tags (matching command list evaluation names) for context menu command filtering; pull out code for filling command regs from contextual expressions; add mechanism for contextualizing a whole query, so that we can spawn command listers within the context of some other evaluation, which we'd like to fill registers with (e.g. right-clicking a module -> spawn a module command list, contextualized by the module evaluation itself --- project.raddbg | 2 +- src/dbg_engine/dbg_engine.mdesk | 80 ++--- src/raddbg/generated/raddbg.meta.c | 516 +++++++++++++++-------------- src/raddbg/generated/raddbg.meta.h | 9 +- src/raddbg/raddbg.mdesk | 407 +++++++++++------------ src/raddbg/raddbg_core.c | 79 ++++- src/raddbg/raddbg_core.h | 6 +- src/raddbg/raddbg_eval.c | 8 +- src/raddbg/raddbg_views.c | 19 ++ src/raddbg/raddbg_views.h | 3 + 10 files changed, 614 insertions(+), 515 deletions(-) diff --git a/project.raddbg b/project.raddbg index 8b22d04f..e45bc52e 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,12 +7,12 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 + enabled: 1 } target: { executable: "build/mule_main.exe" working_directory: build - enabled: 1 } target: { diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index cf54339b..ccc65aaf 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -4,60 +4,60 @@ //////////////////////////////// //~ rjf: Built-In Command Tables -@table(name ui_vis ipc_docs_vis text_pt_vis text_rng_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags ctx_filter) -// / | | | | | | \___ _________________________________/ | | | | | | -// / | | | | | | \ / | | | | | | -D_CmdTable: // | | | | | | | | | | | | | | +@table(name ui_vis ipc_docs_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags filter_tags) +// / | | | | \___ _________________________________/ | | | | | | +// / | | | | \ / | | | | | | +D_CmdTable: // | | | | | | | | | | | | { //- rjf: low-level target control operations - {LaunchAndRun 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" "" } - {LaunchAndStepInto 1 1 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 PlayStepForward "launch_and_step_into" "Launch and Step Into" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" "" } - {Kill 1 1 0 0 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 X "kill" "Kill" "Kills the specified existing attached process(es)." "stop,kill" "" } - {KillAll 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all attached processes." "stop,kill,all" "" } - {Detach 1 1 0 0 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Null "detach" "Detach" "Detaches the specified attached process(es)." "detach" "" } - {Continue 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Play "continue" "Continue" "Continues executing all attached processes." "" "" } - {StepIntoInst 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" "" } - {StepOverInst 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" "" } - {StepIntoLine 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" "" } - {StepOverLine 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" "" } - {StepOut 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the first instruction after the current scope is exited." "" "" } - {StepToExit 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_to_exit" "Step To Exit" "Runs to the first encountered instruction which will exit the current scope." "" "" } - {Halt 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all attached processes." "pause" "" } - {SoftHaltRefresh 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all attached processes to collect data, and then resumes them." "" "" } - {SetThreadIP 0 1 0 0 "" Vaddr null Nil Null 0 0 0 0 1 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the specified thread's instruction pointer at the specified address." "" "" } + {LaunchAndRun 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" "" } + {LaunchAndStepInto 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 PlayStepForward "launch_and_step_into" "Launch and Step Into" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" "" } + {Kill 1 1 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 X "kill" "Kill" "Kills the specified existing attached process(es)." "stop,kill" "" } + {KillAll 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all attached processes." "stop,kill,all" "" } + {Detach 1 1 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Null "detach" "Detach" "Detaches the specified attached process(es)." "detach" "" } + {Continue 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "continue" "Continue" "Continues executing all attached processes." "" "" } + {StepIntoInst 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" "" } + {StepOverInst 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" "" } + {StepIntoLine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" "" } + {StepOverLine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" "" } + {StepOut 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the first instruction after the current scope is exited." "" "" } + {StepToExit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_to_exit" "Step To Exit" "Runs to the first encountered instruction which will exit the current scope." "" "" } + {Halt 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all attached processes." "pause" "" } + {SoftHaltRefresh 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all attached processes to collect data, and then resumes them." "" "" } + {SetThreadIP 0 1 "" Vaddr null Nil Null 0 0 0 0 1 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the specified thread's instruction pointer at the specified address." "" "" } //- rjf: high-level composite target control operations - {RunToLine 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" "$text_pt," } - {RunToName 1 1 1 0 "query:procedures" String null Nil Null 0 0 0 0 0 1 1 Play "run_to_name" "Run To Name" "Runs until a particular symbol name is hit." "" "" } - {Run 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" "" } - {Restart 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all attached processes, then launches all active targets." "restart,retry" "" } - {StepInto 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)." "" "" } - {StepOver 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either source lines or instructions." "" "" } + {RunToLine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" "{text_pt_commands}" } + {RunToName 1 1 "query:procedures" String null Nil Null 0 0 0 0 0 1 1 Play "run_to_name" "Run To Name" "Runs until a particular symbol name is hit." "" "{text_pt_commands}" } + {Run 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" "" } + {Restart 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all attached processes, then launches all active targets." "restart,retry" "" } + {StepInto 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)." "" "" } + {StepOver 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either source lines or instructions." "" "" } //- rjf: debug control context management operations - {FreezeThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "callstack,unwind" "" } - {ThawThread 1 1 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" "" } - {FreezeProcess 1 1 0 0 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" "" } - {ThawProcess 1 1 0 0 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" "" } - {FreezeMachine 0 1 0 0 "query:machines" Machine null Nil Machine 0 0 0 0 0 1 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" "" } - {ThawMachine 0 1 0 0 "query:machines" Machine null Nil Machine 0 0 0 0 0 1 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" "" } - {FreezeLocalMachine 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" "" } - {ThawLocalMachine 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" "" } - {FreezeEntity 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Unlocked "freeze_entity" "Freeze Entity" "Freezes an entity." "" "" } - {ThawEntity 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Locked "thaw_entity" "Thaw Entity" "Thaws an entity." "" "" } + {FreezeThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "callstack,unwind" "" } + {ThawThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" "" } + {FreezeProcess 1 1 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" "" } + {ThawProcess 1 1 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" "" } + {FreezeMachine 0 1 "query:machines" Machine null Nil Machine 0 0 0 0 0 1 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" "" } + {ThawMachine 0 1 "query:machines" Machine null Nil Machine 0 0 0 0 0 1 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" "" } + {FreezeLocalMachine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" "" } + {ThawLocalMachine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" "" } + {FreezeEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Unlocked "freeze_entity" "Freeze Entity" "Freezes an entity." "" "" } + {ThawEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Locked "thaw_entity" "Thaw Entity" "Thaws an entity." "" "" } //- rjf: entity decoration - {SetEntityColor 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_entity_color" "Set Entity Color" "Sets the passed entity's color." "" "" } - {SetEntityName 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_entity_name" "Set Entity Name" "Sets the passed entity's name." "" "" } + {SetEntityColor 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_entity_color" "Set Entity Color" "Sets the passed entity's color." "" "" } + {SetEntityName 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_entity_name" "Set Entity Name" "Sets the passed entity's name." "" "" } //- rjf: modules - {DownloadModuleDebugInfo 1 1 0 0 "query:modules" CtrlEntity null Nil Null 0 0 0 0 0 1 1 Module "download_module_debug_info" "Download Module Debug Info" "Tries to download a module's debug info from symbol server(s)." "" "" } + {DownloadModuleDebugInfo 1 1 "query:modules" CtrlEntity null Nil Null 0 0 0 0 0 1 1 Module "download_module_debug_info" "Download Module Debug Info" "Tries to download a module's debug info from symbol server(s)." "" "{module_commands}" } //- rjf: attaching - {Attach 1 1 0 0 "query:unattached_processes" PID null Nil Null 0 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" "" } + {Attach 1 1 "query:unattached_processes" PID null Nil Null 0 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" "" } //- rjf: crash dump opening - {OpenCrashDump 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } + {OpenCrashDump 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } } @enum D_CmdKind: diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 1600a234..07538564 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -477,7 +477,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[39] = {str8_lit_comp("thread"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, }; -String8 rd_reg_slot_code_name_table[51] = +String8 rd_reg_slot_code_name_table[52] = { {0}, str8_lit_comp("machine"), @@ -512,6 +512,7 @@ str8_lit_comp("ui_key"), str8_lit_comp("src_ui_key"), str8_lit_comp("off_px"), str8_lit_comp("reg_slot"), +str8_lit_comp("ctx_expr"), str8_lit_comp("pid"), str8_lit_comp("force_confirm"), str8_lit_comp("force_focus"), @@ -532,7 +533,7 @@ str8_lit_comp("cmd_name"), str8_lit_comp("wm_event"), }; -Rng1U64 rd_reg_slot_range_table[51] = +Rng1U64 rd_reg_slot_range_table[52] = { {0}, {OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(D_Handle)}, @@ -567,6 +568,7 @@ Rng1U64 rd_reg_slot_range_table[51] = {OffsetOf(RD_Regs, src_ui_key), OffsetOf(RD_Regs, src_ui_key) + sizeof(UI_Key)}, {OffsetOf(RD_Regs, off_px), OffsetOf(RD_Regs, off_px) + sizeof(Vec2F32)}, {OffsetOf(RD_Regs, reg_slot), OffsetOf(RD_Regs, reg_slot) + sizeof(RD_RegSlot)}, +{OffsetOf(RD_Regs, ctx_expr), OffsetOf(RD_Regs, ctx_expr) + sizeof(String8)}, {OffsetOf(RD_Regs, pid), OffsetOf(RD_Regs, pid) + sizeof(U32)}, {OffsetOf(RD_Regs, force_confirm), OffsetOf(RD_Regs, force_confirm) + sizeof(B32)}, {OffsetOf(RD_Regs, force_focus), OffsetOf(RD_Regs, force_focus) + sizeof(B32)}, @@ -590,261 +592,261 @@ Rng1U64 rd_reg_slot_range_table[51] = RD_CmdKindInfo rd_cmd_kind_info_table[256] = { {0}, -{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("launch_and_step_into"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the first instruction after the current scope is exited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_to_exit"), str8_lit_comp("Runs to the first encountered instruction which will exit the current scope."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_to_name"), str8_lit_comp("Runs until a particular symbol name is hit."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, -{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, -{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("download_module_debug_info"), str8_lit_comp("Tries to download a module's debug info from symbol server(s)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CtrlEntity, str8_lit_comp("query:modules"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("$tab,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp("$file,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("$text_rng,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*1)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp("$breakpoints,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp("$watch_pins,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp("$debug_infos,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("$text_pt,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp("$targets,"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*1)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*1)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0)|(RD_CmdKindFlag_ListInMemoryEval*0)|(RD_CmdKindFlag_ListInMemory*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("globals"), str8_lit_comp("Opens a Globals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("thread_locals"), str8_lit_comp("Opens a Thread Locals tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("types"), str8_lit_comp("Opens a Types tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("procedures"), str8_lit_comp("Opens a Procedures tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("call_stack"), str8_lit_comp("Opens a Call Stack tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("targets"), str8_lit_comp("Opens a Targets tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("breakpoints"), str8_lit_comp("Opens a Breakpoints tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("watch_pins"), str8_lit_comp("Opens a Watch Pins tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("debug_infos"), str8_lit_comp("Opens a Debug Info tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("threads"), str8_lit_comp("Opens a Threads tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("processes"), str8_lit_comp("Opens a Processes tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("machines"), str8_lit_comp("Opens a Machines tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("modules"), str8_lit_comp("Opens a Modules tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("file_path_maps"), str8_lit_comp("Opens a File Path Map tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("type_views"), str8_lit_comp("Opens a Type Views tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("output"), str8_lit_comp("Opens a Output tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("text"), str8_lit_comp("Opens a Text tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("disasm"), str8_lit_comp("Opens a Disassembly tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("memory"), str8_lit_comp("Opens a Memory tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("bitmap"), str8_lit_comp("Opens a Bitmap tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("color"), str8_lit_comp("Opens a Color tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, -{ str8_lit_comp("geo3d"), str8_lit_comp("Opens a Geometry (3D) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}, +{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("launch_and_step_into"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the first instruction after the current scope is exited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_to_exit"), str8_lit_comp("Runs to the first encountered instruction which will exit the current scope."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_to_name"), str8_lit_comp("Runs until a particular symbol name is hit."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, +{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, +{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, +{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("download_module_debug_info"), str8_lit_comp("Tries to download a module's debug info from symbol server(s)."), str8_lit_comp(""), str8_lit_comp("{module_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CtrlEntity, str8_lit_comp("query:modules"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, +{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("{text_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp("{text_pt_commands}{text_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp("{memory_eval_commands}"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp("{memory_eval_commands}"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("globals"), str8_lit_comp("Opens a Globals tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("thread_locals"), str8_lit_comp("Opens a Thread Locals tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("types"), str8_lit_comp("Opens a Types tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("procedures"), str8_lit_comp("Opens a Procedures tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("call_stack"), str8_lit_comp("Opens a Call Stack tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("targets"), str8_lit_comp("Opens a Targets tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("breakpoints"), str8_lit_comp("Opens a Breakpoints tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("watch_pins"), str8_lit_comp("Opens a Watch Pins tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("debug_infos"), str8_lit_comp("Opens a Debug Info tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("threads"), str8_lit_comp("Opens a Threads tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("processes"), str8_lit_comp("Opens a Processes tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("machines"), str8_lit_comp("Opens a Machines tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("modules"), str8_lit_comp("Opens a Modules tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("file_path_maps"), str8_lit_comp("Opens a File Path Map tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("type_views"), str8_lit_comp("Opens a Type Views tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("output"), str8_lit_comp("Opens a Output tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("text"), str8_lit_comp("Opens a Text tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("disasm"), str8_lit_comp("Opens a Disassembly tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("memory"), str8_lit_comp("Opens a Memory tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("bitmap"), str8_lit_comp("Opens a Bitmap tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("color"), str8_lit_comp("Opens a Color tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, +{ str8_lit_comp("geo3d"), str8_lit_comp("Opens a Geometry (3D) tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, }; struct {String8 string; CFG_Binding binding;} rd_default_binding_table[116] = diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index ddadfd88..bef8328b 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -41,6 +41,7 @@ RD_RegSlot_UIKey, RD_RegSlot_SrcUIKey, RD_RegSlot_OffPx, RD_RegSlot_RegSlot, +RD_RegSlot_CtxExpr, RD_RegSlot_PID, RD_RegSlot_ForceConfirm, RD_RegSlot_ForceFocus, @@ -492,6 +493,7 @@ UI_Key ui_key; UI_Key src_ui_key; Vec2F32 off_px; RD_RegSlot reg_slot; +String8 ctx_expr; U32 pid; B32 force_confirm; B32 force_focus; @@ -528,7 +530,7 @@ struct RD_CmdKindInfo String8 string; String8 description; String8 search_tags; -String8 ctx_filter; +String8 filter_tags; RD_CmdKindFlags flags; RD_Query query; }; @@ -594,6 +596,7 @@ Z(getting_started)\ .src_ui_key = rd_regs()->src_ui_key,\ .off_px = rd_regs()->off_px,\ .reg_slot = rd_regs()->reg_slot,\ +.ctx_expr = rd_regs()->ctx_expr,\ .pid = rd_regs()->pid,\ .force_confirm = rd_regs()->force_confirm,\ .force_focus = rd_regs()->force_focus,\ @@ -618,8 +621,8 @@ extern String8 rd_tab_fast_path_view_name_table[25]; extern String8 rd_tab_fast_path_query_name_table[25]; extern RD_VocabInfo rd_vocab_info_table[368]; extern RD_NameSchemaInfo rd_name_schema_info_table[39]; -extern String8 rd_reg_slot_code_name_table[51]; -extern Rng1U64 rd_reg_slot_range_table[51]; +extern String8 rd_reg_slot_code_name_table[52]; +extern Rng1U64 rd_reg_slot_range_table[52]; extern String8 rd_binding_version_remap_old_name_table[9]; extern String8 rd_binding_version_remap_new_name_table[9]; extern String8 rd_icon_kind_text_table[75]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 6ec929b3..5f6d0837 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -885,6 +885,7 @@ RD_RegTable: {UI_Key src_ui_key SrcUIKey } {Vec2F32 off_px OffPx } {RD_RegSlot reg_slot RegSlot } + {String8 ctx_expr CtxExpr } // rjf: general parameters {U32 pid PID } @@ -941,302 +942,302 @@ RD_RegTable: //////////////////////////////// //~ rjf: Command Table -@table(name ui_vis ipc_docs_vis text_pt_vis text_rng_vis mem_eval_vis memory_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags ctx_filter) -// / | | | | | | | \___ _________________________________________________________________/ | | | | | | -// / | | | | | | | \ / | | | | | | -RD_CmdTable: // | | | | | | | | | | | | | | | +@table(name ui_vis ipc_docs_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags filter_tags) +// / | | | \___ _________________________________________________________________/ | | | | | | +// / | | | \ / | | | | | | +RD_CmdTable: // | | | | | | | | | | | { //- rjf: exiting - {Exit 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } + {Exit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } //- rjf: palette - {OpenPalette 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } + {OpenPalette 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } //- rjf: command fast-path - {RunCommand 0 0 0 0 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } + {RunCommand 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } //- rjf: external drivers - {RunExternalDriverTextCommand 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } - {State 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } - {Eval 0 1 0 0 0 0 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } - {LineFromVAddr 0 1 0 0 0 0 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } + {RunExternalDriverTextCommand 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } + {State 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } + {Eval 0 1 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } + {LineFromVAddr 0 1 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } //- rjf: os event passthrough - {WMEvent 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } + {WMEvent 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } //- rjf: thread/frame selection - {SelectThread 1 1 0 0 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } - {SelectUnwind 0 1 0 0 0 0 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } - {UpOneFrame 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } - {DownOneFrame 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } - {SelectEntity 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } - {DeselectEntity 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } + {SelectThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } + {SelectUnwind 0 1 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } + {UpOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } + {DownOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } + {SelectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } + {DeselectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } //- rjf: font sizes - {IncWindowFontSize 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } - {DecWindowFontSize 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } - {IncViewFontSize 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } - {DecViewFontSize 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } + {IncWindowFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } + {DecWindowFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } + {IncViewFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } + {DecViewFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } //- rjf: windows - {OpenWindow 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } - {WindowSettings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } - {CloseWindow 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } - {ToggleFullscreen 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } - {BringToFront 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } + {OpenWindow 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } + {WindowSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } + {CloseWindow 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } + {ToggleFullscreen 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } + {BringToFront 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } //- rjf: popups - {PopupAccept 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } - {PopupCancel 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } + {PopupAccept 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } + {PopupCancel 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } //- rjf: keybindings - {ResetToDefaultBindings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } + {ResetToDefaultBindings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } //- rjf: panel splitting - {ResetToDefaultPanels 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } - {ResetToCompactPanels 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } - {ResetToSimplePanels 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } - {NewPanelLeft 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } - {NewPanelUp 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } - {NewPanelRight 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } - {NewPanelDown 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } - {SplitPanel 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } + {ResetToDefaultPanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } + {ResetToCompactPanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } + {ResetToSimplePanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } + {NewPanelLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } + {NewPanelUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } + {NewPanelRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } + {NewPanelDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } + {SplitPanel 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } //- rjf: panel rotation - {RotatePanelColumns 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } + {RotatePanelColumns 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } //- rjf: focused panel changing - {NextPanel 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } - {PrevPanel 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } - {FocusPanel 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } - {FocusPanelRight 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } - {FocusPanelLeft 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } - {FocusPanelUp 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } - {FocusPanelDown 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } + {NextPanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } + {PrevPanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } + {FocusPanel 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } + {FocusPanelRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } + {FocusPanelLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } + {FocusPanelUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } + {FocusPanelDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } //- rjf: undo/redo - {Undo 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } - {Redo 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } + {Undo 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } + {Redo 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } //- rjf: focus history - {GoBack 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } - {GoForward 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } + {GoBack 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } + {GoForward 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } //- rjf: panel removal - {ClosePanel 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } + {ClosePanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } //- rjf: panel tab - {FocusTab 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } - {NextTab 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } - {PrevTab 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } - {MoveTabRight 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "$tab," } - {MoveTabLeft 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "$tab," } - {OpenTab 1 1 0 0 0 0 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } - {BuildTab 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } - {DuplicateTab 1 1 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "$tab," } - {CopyTabFullPath 0 0 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "$tab," } - {CloseTab 1 1 0 0 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "$tab," } - {MoveView 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } - {TabBarTop 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "$tab," } - {TabBarBottom 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "$tab," } - {TabSettings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } + {FocusTab 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } + {NextTab 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } + {PrevTab 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } + {MoveTabRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "" } + {MoveTabLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "" } + {OpenTab 1 1 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } + {BuildTab 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } + {DuplicateTab 1 1 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "" } + {CopyTabFullPath 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "" } + {CloseTab 1 1 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "" } + {MoveView 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } + {TabBarTop 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "" } + {TabBarBottom 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "" } + {TabSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } //- rjf: files - {SetCurrentPath 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } - {Open 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } - {OpenSourceFileFromDebugInfo 1 0 0 0 0 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } - {SwitchToPartnerFile 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } - {ShowFileInExplorer 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "$file," } + {SetCurrentPath 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } + {Open 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } + {OpenSourceFileFromDebugInfo 1 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } + {SwitchToPartnerFile 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } + {ShowFileInExplorer 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "" } //- rjf: source <-> disasm - {GoToDisassembly 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "$text_pt," } - {GoToSource 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "" } + {GoToDisassembly 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "{text_pt_commands}" } + {GoToSource 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "{disasm_pt_commands}" } //- rjf: override file links - {SetFileReplacementPath 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } + {SetFileReplacementPath 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } //- rjf: setting config paths - {NewUser 1 1 0 0 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } - {NewProject 1 1 0 0 0 0 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } - {OpenUser 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } - {OpenProject 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } - {OpenRecentProject 1 1 0 0 0 0 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } - {SaveUser 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } - {SaveProject 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } - {RecordUserAsLastOpened 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } - {RecordProjectInUser 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } + {NewUser 1 1 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } + {NewProject 1 1 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } + {OpenUser 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } + {OpenProject 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } + {OpenRecentProject 1 1 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } + {SaveUser 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } + {SaveProject 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } + {RecordUserAsLastOpened 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } + {RecordProjectInUser 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } //- rjf: writing config changes - {WriteUserData 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } - {WriteProjectData 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } + {WriteUserData 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } + {WriteProjectData 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } //- rjf: opening user/project settings - {UserSettings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } - {ProjectSettings 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } + {UserSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } + {ProjectSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } //- rjf: meta controls - {Edit 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } - {Accept 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } - {Cancel 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } - {FocusMenu 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } + {Edit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } + {Accept 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } + {Cancel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } + {FocusMenu 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } //- rjf: directional movement & text controls - {MoveLeft 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } - {MoveRight 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } - {MoveUp 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } - {MoveDown 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } - {MoveLeftSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } - {MoveRightSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } - {MoveUpSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } - {MoveDownSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } - {MoveLeftChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPage 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } - {MoveDownPage 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } - {MoveUpWhole 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } - {MoveDownWhole 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } - {MoveLeftChunkSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunkSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunkSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunkSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPageSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } - {MoveDownPageSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } - {MoveUpWholeSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } - {MoveDownWholeSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } - {MoveUpReorder 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } - {MoveDownReorder 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } - {MoveHome 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } - {MoveEnd 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } - {MoveHomeSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } - {MoveEndSelect 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } - {SelectAll 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } - {DeleteSingle 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } - {DeleteChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } - {BackspaceSingle 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } - {BackspaceChunk 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } - {Copy 1 1 0 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "$text_rng," } - {Cut 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } - {Paste 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } - {InsertText 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } + {MoveLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } + {MoveRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } + {MoveUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } + {MoveDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } + {MoveLeftSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } + {MoveRightSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } + {MoveUpSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } + {MoveDownSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } + {MoveLeftChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPage 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } + {MoveDownPage 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } + {MoveUpWhole 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } + {MoveDownWhole 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } + {MoveLeftChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPageSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } + {MoveDownPageSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } + {MoveUpWholeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } + {MoveDownWholeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } + {MoveUpReorder 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } + {MoveDownReorder 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } + {MoveHome 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } + {MoveEnd 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } + {MoveHomeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } + {MoveEndSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } + {SelectAll 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } + {DeleteSingle 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } + {DeleteChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } + {BackspaceSingle 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } + {BackspaceChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } + {Copy 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "{text_range_commands}" } + {Cut 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } + {Paste 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } + {InsertText 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } //- rjf: directionless navigation - {MoveNext 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } - {MovePrev 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } + {MoveNext 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } + {MovePrev 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } //- rjf: code navigation - {GoToLine 1 1 0 0 0 0 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } - {GoToAddress 1 1 0 0 0 0 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } - {CenterCursor 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } - {ContainCursor 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } - {FindNext 1 1 0 0 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } - {FindPrev 1 1 0 0 0 0 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } + {GoToLine 1 1 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } + {GoToAddress 1 1 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } + {CenterCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } + {ContainCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } + {FindNext 1 1 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } + {FindPrev 1 1 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } //- rjf: thread finding - {FindThread 1 1 0 0 0 0 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } - {FindSelectedThread 1 1 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "" } + {FindThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } + {FindSelectedThread 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "{text_pt_commands}{text_range_commands}" } //- rjf: name finding - {GoToName 1 1 0 0 0 0 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "$text_pt," } - {GoToNameAtCursor 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } + {GoToName 1 1 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } + {GoToNameAtCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "{text_pt_commands}" } //- rjf: watch expressions - {ToggleWatchExpression 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "$text_pt," } - {ToggleWatchExpressionAtCursor 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "" } - {ToggleWatchExpressionAtMouse 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } + {ToggleWatchExpression 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "" } + {ToggleWatchExpressionAtCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "{text_pt_commands}" } + {ToggleWatchExpressionAtMouse 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } //- rjf: general config operations - {EnableCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } - {DisableCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } - {SelectCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } - {DeselectCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } - {RemoveCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } - {NameCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } - {ConditionCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } - {DuplicateCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } - {RelocateCfg 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } - {SaveToProject 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } + {EnableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } + {DisableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } + {SelectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } + {DeselectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } + {RemoveCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } + {NameCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } + {ConditionCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } + {DuplicateCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } + {RelocateCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } + {SaveToProject 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } //- rjf: breakpoints - {AddBreakpoint 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } - {AddAddressBreakpoint 1 0 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "$breakpoints," } - {AddFunctionBreakpoint 1 0 0 0 0 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "$breakpoints," } - {ToggleBreakpoint 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "$text_pt," } - {RemoveBreakpoint 1 0 0 0 0 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "$breakpoints," } - {EnableBreakpoint 1 1 0 0 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } - {DisableBreakpoint 1 1 0 0 0 0 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } - {ClearBreakpoints 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } + {AddBreakpoint 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } + {AddAddressBreakpoint 1 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "" } + {AddFunctionBreakpoint 1 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "" } + {ToggleBreakpoint 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "{text_pt_commands}" } + {RemoveBreakpoint 1 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "" } + {EnableBreakpoint 1 1 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } + {DisableBreakpoint 1 1 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } + {ClearBreakpoints 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } //- rjf: output - {ClearOutput 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } + {ClearOutput 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } //- rjf: watch pins - {AddWatchPin 1 1 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "$watch_pins," } - {ToggleWatchPin 1 0 0 0 0 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } + {AddWatchPin 1 1 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "" } + {ToggleWatchPin 1 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } //- rjf: debug infos - {LoadDebugInfo 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "$debug_infos," } - {UnloadDebugInfo 1 1 0 0 0 0 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "$debug_infos," } + {LoadDebugInfo 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "" } + {UnloadDebugInfo 1 1 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "" } //- rjf: type views - {AddTypeView 0 0 0 0 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } + {AddTypeView 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } //- rjf: file path maps - {AddFilePathMap 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } + {AddFilePathMap 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } //- rjf: themes - {EditUserTheme 0 0 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } - {EditProjectTheme 0 0 0 0 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } - {AddThemeColor 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } - {ForkTheme 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } - {SaveTheme 0 0 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } - {SaveAndSetTheme 0 0 0 0 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } + {EditUserTheme 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } + {EditProjectTheme 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } + {AddThemeColor 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } + {ForkTheme 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } + {SaveTheme 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } + {SaveAndSetTheme 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } //- rjf: line operations - {SetNextStatement 1 1 1 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "$text_pt," } + {SetNextStatement 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "{text_pt_commands}" } //- rjf: targets - {AddTarget 1 1 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "$targets," } - {SelectTarget 1 1 0 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } - {EnableTarget 1 1 0 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } - {DisableTarget 1 1 0 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } - {RemoveTarget 1 1 0 0 0 0 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } + {AddTarget 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "" } + {SelectTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } + {EnableTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } + {DisableTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } + {RemoveTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } //- rjf: attaching - {RegisterAsJITDebugger 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } + {RegisterAsJITDebugger 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } //- rjf: snap-to-code-location - {FindCodeLocation 0 1 0 0 0 0 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } + {FindCodeLocation 0 1 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } //- rjf: snap-to-memory-location - {GoToMemory 0 1 0 0 1 0 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "" } + {GoToMemory 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "{memory_eval_commands}" } //- rjf: break-when-value-changes - {BreakWhenValueChanges 0 1 0 0 1 0 "" Expr null Nil Null 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "" } + {BreakWhenValueChanges 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "{memory_eval_commands}" } //- rjf: searching - {Search 1 1 0 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } - {SearchBackwards 1 1 0 0 0 0 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } + {Search 1 1 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } + {SearchBackwards 1 1 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } //- rjf: queries - {PickFile 0 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } - {PickFolder 0 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } - {PickFileOrFolder 0 0 0 0 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } + {PickFile 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } + {PickFolder 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } + {PickFileOrFolder 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } //- rjf: query stack - {PushQuery 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } - {CompleteQuery 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } - {CancelQuery 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } - {UpdateQuery 0 0 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } + {PushQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } + {CompleteQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } + {CancelQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } + {UpdateQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } //- rjf: event buffers - {OpenEventBuffer 0 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } - {CloseEventBuffer 0 1 0 0 0 0 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } + {OpenEventBuffer 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } + {CloseEventBuffer 0 1 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } //- rjf: developer commands - {ToggleDevMenu 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } - {LogMarker 1 1 0 0 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } + {ToggleDevMenu 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } + {LogMarker 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } } @enum RD_CmdKind: @@ -1265,7 +1266,7 @@ RD_CmdTable: // | | | | `String8 string`; `String8 description`; `String8 search_tags`; - `String8 ctx_filter`; + `String8 filter_tags`; `RD_CmdKindFlags flags`; `RD_Query query`; }; @@ -1274,13 +1275,13 @@ RD_CmdTable: // | | | | { `{0}`, @expand(D_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.filter_tags)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.ctx_filter)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis))|(RD_CmdKindFlag_ListInMemoryEval*$(a.mem_eval_vis))|(RD_CmdKindFlag_ListInMemory*$(a.memory_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.filter_tags)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; @expand(RD_WatchTabFastPathTable, a) - ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}```; + ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}```; @expand(RD_ViewTabFastPathTable, a) - ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}```; + ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}```; } //////////////////////////////// diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 62125b16..b2d5b0d2 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2090,6 +2090,11 @@ rd_view_ui(Rng2F32 rect) // B32 implicit_root = (cfg_node_child_from_string(cfg_node_from_id(rd_regs()->view), str8_lit("explicit_root")) == &cfg_nil_node); + ////////////////////////////// + //- rjf: get root contextual expression + // + String8 ctx_expr = cfg_node_child_from_string(cfg_node_from_id(rd_regs()->view), s("context_expression"))->first->string; + ////////////////////////////// //- rjf: decide single-click-to-activate preference // @@ -2529,7 +2534,19 @@ rd_view_ui(Rng2F32 rect) case RD_EvalSpaceKind_MetaCmd: { String8 cmd_name = rd_cmd_name_from_eval(eval); - rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_name); + RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); + RD_RegsScope() + { + RD_RegSlot ctx_filled_reg_slot = rd_regs_fill_slot_from_cell_ctx(ctx_expr, row); + if(ctx_filled_reg_slot == cmd_kind_info->query.slot || !(cmd_kind_info->query.flags & RD_QueryFlag_Required)) + { + rd_push_cmd(cmd_name, rd_regs()); + } + else + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_name); + } + } }break; case RD_EvalSpaceKind_MetaCtrlEntity: { @@ -4319,6 +4336,7 @@ rd_view_ui(Rng2F32 rect) selected_eval = cell->eval; ewv->next_cursor = ewv->next_mark = cell_pt; pressed = 1; + D_Entity *entity = rd_ctrl_entity_from_eval_space(cell->eval.space); if(cell->eval.space.kind == D_EvalSpaceKind_Entity) { rd_cmd(RD_CmdKind_PushQuery, @@ -4329,6 +4347,17 @@ rd_view_ui(Rng2F32 rect) .small_size = 1, .ui_key = cell_box->key); } + else if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && entity->kind == D_EntityKind_Module) + { + rd_cmd(RD_CmdKind_PushQuery, + .expr = s("query:module_commands"), + .do_implicit_root = 1, + .do_lister = 1, + .activate_with_single_click = 1, + .small_size = 1, + .ui_key = cell_box->key, + .ctx_expr = cell->eval.string); + } } // rjf: reversion @@ -4399,6 +4428,21 @@ rd_view_ui(Rng2F32 rect) // rjf: has a command name? -> push command else if(cell_info.cmd_name.size != 0) { + String8 cmd_name = cell_info.cmd_name; + RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); + RD_RegsScope() + { + RD_RegSlot ctx_filled_reg_slot = rd_regs_fill_slot_from_cell_ctx(ctx_expr, row); + if(ctx_filled_reg_slot == cmd_kind_info->query.slot || !(cmd_kind_info->query.flags & RD_QueryFlag_Required)) + { + rd_push_cmd(cmd_name, rd_regs()); + } + else + { + rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_name); + } + } +#if 0 String8 cmd_name = cell_info.cmd_name; RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); D_Entity *entity = rd_ctrl_entity_from_eval_space(row->eval.space); @@ -4433,6 +4477,7 @@ rd_view_ui(Rng2F32 rect) rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_name); } } +#endif } // rjf: row has callstack info? -> select unwind @@ -10555,6 +10600,35 @@ rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 query_expr, String8 strin } } +internal RD_RegSlot +rd_regs_fill_slot_from_ctx_eval(E_Eval eval) +{ + RD_RegSlot slot = RD_RegSlot_Null; + { + D_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space); + CFG_Node *cfg = rd_cfg_from_eval_space(eval.space); + if(entity != &d_entity_nil) + { + rd_regs()->ctrl_entity = entity->handle; + slot = RD_RegSlot_CtrlEntity; + } + if(cfg != &cfg_nil_node) + { + rd_regs()->cfg = cfg->id; + slot = RD_RegSlot_Cfg; + Temp scratch = scratch_begin(0, 0); + CFG_PanelTree panels = cfg_panel_tree_from_cfg(scratch.arena, cfg); + CFG_PanelNode *parent_panel_node = cfg_panel_node_from_tree_cfg(panels.root, cfg->parent); + if(parent_panel_node != &cfg_nil_panel_node) + { + rd_regs()->tab = rd_regs()->view = cfg->id; + } + scratch_end(scratch); + } + } + return slot; +} + //////////////////////////////// //~ rjf: Commands @@ -11924,6 +11998,7 @@ rd_frame(void) s("text_pt_commands"), s("text_range_commands"), s("memory_eval_commands"), + s("module_commands"), }; for EachElement(idx, names) { @@ -15825,6 +15900,8 @@ rd_frame(void) view = cfg_node_child_from_string_or_alloc(rd_state->cfg, window_query, str8_lit("watch")); CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit("expression")); cfg_node_new_replace(rd_state->cfg, expr, rd_regs()->expr); + CFG_Node *ctx_expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, s("context_expression")); + cfg_node_new_replace(rd_state->cfg, ctx_expr, rd_regs()->ctx_expr); } // rjf: non-floating -> embed in view diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 5636788f..2249fad7 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -88,11 +88,6 @@ enum { RD_CmdKindFlag_ListInUI = (1<<0), RD_CmdKindFlag_ListInIPCDocs = (1<<1), - RD_CmdKindFlag_ListInTab = (1<<2), - RD_CmdKindFlag_ListInTextPt = (1<<3), - RD_CmdKindFlag_ListInTextRng = (1<<4), - RD_CmdKindFlag_ListInMemoryEval = (1<<5), - RD_CmdKindFlag_ListInMemory = (1<<6), }; //////////////////////////////// @@ -842,6 +837,7 @@ internal RD_Regs *rd_push_regs_(RD_Regs *regs); internal RD_Regs *rd_pop_regs(void); #define RD_RegsScope(...) DeferLoop(rd_push_regs(__VA_ARGS__), rd_pop_regs()) internal void rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 query_expr, String8 string); +internal RD_RegSlot rd_regs_fill_slot_from_ctx_eval(E_Eval eval); //////////////////////////////// //~ rjf: Commands diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 82203fca..00acd908 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -27,15 +27,13 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(commands) Temp scratch = scratch_begin(&arena, 1); String8List cmd_names = {0}; E_Type *type = e_type_from_key(eval.irtree.type_key); + String8 collection_name = type->name; + String8 collection_filter_tag = str8f(scratch.arena, "{%S}", collection_name); for EachNonZeroEnumVal(RD_CmdKind, k) { RD_CmdKindInfo *info = &rd_cmd_kind_info_table[k]; B32 show = ((str8_match(type->name, s("commands"), 0) && info->flags & RD_CmdKindFlag_ListInUI) || - (str8_match(type->name, s("text_pt_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTextPt) || - (str8_match(type->name, s("text_range_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTextRng) || - (str8_match(type->name, s("tab_commands"), 0) && info->flags & RD_CmdKindFlag_ListInTab) || - (str8_match(type->name, s("memory_eval_commands"), 0) && info->flags & RD_CmdKindFlag_ListInMemoryEval) || - (str8_match(type->name, s("memory_commands"), 0) && info->flags & RD_CmdKindFlag_ListInMemory)); + (str8_find_needle(info->filter_tags, 0, collection_filter_tag, 0) < info->filter_tags.size)); if(show) { String8 code_name = info->string; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 67f12a86..6062f262 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1972,6 +1972,25 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla return result; } +//- rjf: cell -> fill registers via context + +internal RD_RegSlot +rd_regs_fill_slot_from_cell_ctx(String8 root_ctx_expr, EV_Row *row) +{ + RD_RegSlot ctx_filled_reg_slot = RD_RegSlot_Null; + if(ctx_filled_reg_slot == RD_RegSlot_Null) { ctx_filled_reg_slot = rd_regs_fill_slot_from_ctx_eval(row->eval); } + for(EV_Block *block = row->block; block != &ev_nil_block && ctx_filled_reg_slot == RD_RegSlot_Null; block = block->parent) + { + ctx_filled_reg_slot = rd_regs_fill_slot_from_ctx_eval(block->eval); + } + if(ctx_filled_reg_slot == RD_RegSlot_Null) + { + E_Eval root_ctx_eval = e_eval_from_string(root_ctx_expr); + ctx_filled_reg_slot = rd_regs_fill_slot_from_ctx_eval(root_ctx_eval); + } + return ctx_filled_reg_slot; +} + //- rjf: table coordinates -> text edit state internal RD_WatchViewTextEditState * diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index b5671c92..530d07b5 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -215,6 +215,9 @@ internal RD_WatchRowInfo rd_watch_row_info_from_row(Arena *arena, EV_Row *row); //- rjf: row * cell -> info internal RD_WatchRowCellInfo rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_flags, RD_WatchRowInfo *row_info, RD_WatchCell *cell, FNT_Tag font, F32 font_size, F32 max_size_px); +//- rjf: cell -> fill registers via context +internal RD_RegSlot rd_regs_fill_slot_from_cell_ctx(String8 root_ctx_expr, EV_Row *row); + //- rjf: table coordinates -> text edit state internal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchPt pt); From 645cf46e55bad1ca6c6d9baa19340c29ce36e55b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 10 Jun 2026 11:57:53 -0700 Subject: [PATCH 773/850] explicit process address space evaluation --- src/eval/eval_core.c | 68 ++++++++ src/eval/eval_core.h | 28 ++++ src/eval/eval_interpret.c | 6 +- src/eval/eval_ir.c | 7 + .../eval_visualization_core.c | 7 + .../eval_visualization_core.h | 2 +- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 +- src/raddbg/raddbg_core.c | 25 ++- src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_eval.c | 150 ++++++++++++++++-- src/raddbg/raddbg_eval.h | 8 + src/raddbg/raddbg_views.c | 13 +- 13 files changed, 292 insertions(+), 27 deletions(-) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 615944cd..30dea758 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -869,6 +869,74 @@ e_dbg_info_from_type_key(E_TypeKey type_key) //////////////////////////////// //~ rjf: Cache Accessing Functions +//- rjf: locals/members maps + +internal E_String2NumMap * +e_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) +{ + if(e_cache->locals_map_map_slots_count == 0) + { + e_cache->locals_map_map_slots_count = 8; + e_cache->locals_map_map_slots = push_array(e_cache->arena, E_LocalMapCacheSlot, e_cache->locals_map_map_slots_count); + } + U64 hash = u64_hash_from_seed_str8(voff, str8_struct(&dbgi_key)); + U64 slot_idx = hash%e_cache->locals_map_map_slots_count; + E_LocalMapCacheSlot *slot = &e_cache->locals_map_map_slots[slot_idx]; + E_LocalMapCacheNode *node = 0; + for(E_LocalMapCacheNode *n = slot->first; n != 0; n = n->next) + { + if(di_key_match(n->dbgi_key, dbgi_key) && n->voff == voff) + { + node = n; + } + } + if(node == 0) + { + Access *access = access_open(); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + node = push_array(e_cache->arena, E_LocalMapCacheNode, 1); + SLLQueuePush(slot->first, slot->last, node); + node->dbgi_key = dbgi_key; + node->voff = voff; + node->map = e_push_locals_map_from_rdi_voff(e_cache->arena, rdi, voff); + access_close(access); + } + return node->map; +} + +internal E_String2NumMap * +e_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff) +{ + if(e_cache->member_map_map_slots_count == 0) + { + e_cache->member_map_map_slots_count = 8; + e_cache->member_map_map_slots = push_array(e_cache->arena, E_LocalMapCacheSlot, e_cache->member_map_map_slots_count); + } + U64 hash = u64_hash_from_seed_str8(voff, str8_struct(&dbgi_key)); + U64 slot_idx = hash%e_cache->member_map_map_slots_count; + E_LocalMapCacheSlot *slot = &e_cache->member_map_map_slots[slot_idx]; + E_LocalMapCacheNode *node = 0; + for(E_LocalMapCacheNode *n = slot->first; n != 0; n = n->next) + { + if(di_key_match(n->dbgi_key, dbgi_key) && n->voff == voff) + { + node = n; + } + } + if(node == 0) + { + Access *access = access_open(); + RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0); + node = push_array(e_cache->arena, E_LocalMapCacheNode, 1); + SLLQueuePush(slot->first, slot->last, node); + node->dbgi_key = dbgi_key; + node->voff = voff; + node->map = e_push_member_map_from_rdi_voff(e_cache->arena, rdi, voff); + access_close(access); + } + return node->map; +} + //- rjf: parent key stack internal E_Key diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 925f48f9..b6c0d40e 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -1065,6 +1065,24 @@ struct E_CacheSlot E_CacheNode *last; }; +//- rjf: locals/members cache types + +typedef struct E_LocalMapCacheNode E_LocalMapCacheNode; +struct E_LocalMapCacheNode +{ + E_LocalMapCacheNode *next; + DI_Key dbgi_key; + U64 voff; + E_String2NumMap *map; +}; + +typedef struct E_LocalMapCacheSlot E_LocalMapCacheSlot; +struct E_LocalMapCacheSlot +{ + E_LocalMapCacheNode *first; + E_LocalMapCacheNode *last; +}; + //- rjf: parent stack typedef struct E_CacheParentNode E_CacheParentNode; @@ -1122,6 +1140,12 @@ struct E_Cache U64 type_cache_slots_count; E_TypeCacheSlot *type_cache_slots; + //- rjf: [locals / members] locals/members map maps + E_LocalMapCacheSlot *locals_map_map_slots; + U64 locals_map_map_slots_count; + E_LocalMapCacheSlot *member_map_map_slots; + U64 member_map_map_slots_count; + //- rjf: [ir] ir gen options B32 disallow_autohooks; B32 disallow_chained_fastpaths; @@ -1278,6 +1302,10 @@ internal E_DbgInfo *e_dbg_info_from_type_key(E_TypeKey type_key); // "parent key stack" also implicitly parameterizes all of these (partly // because it is not relevant in 99% of cases). +//- rjf: locals/members maps +internal E_String2NumMap *e_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); +internal E_String2NumMap *e_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff); + //- rjf: parent key stack internal E_Key e_parent_key_push(E_Key key); internal E_Key e_parent_key_pop(void); diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 67b07939..4d09aeec 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -339,9 +339,9 @@ e_interpret(String8 bytecode) case RDI_EvalOp_RegRead: { - U8 rdi_reg_code = (imm.u64&0x0000FF)>>0; - U8 byte_size = (imm.u64&0x00FF00)>>8; - U8 byte_off = (imm.u64&0xFF0000)>>16; + U8 rdi_reg_code = (imm.u64&0x0000FF)>>0; + U8 byte_size = (imm.u64&0x00FF00)>>8; + U8 byte_off = (imm.u64&0xFF0000)>>16; Arch arch = e_interpret_ctx->reg_arch; ARCH_Info *arch_info = arch_info_from_arch(arch); ARCH_RegCode base_reg_code = arch_reg_code_from_rdi(arch, rdi_reg_code); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 34b1742a..ab1974f8 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1305,6 +1305,13 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I int_root = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, ptr_size, int_root, const_root); } E_TypeKey ptr_type = ptr_tree->type_key; + { + E_Type *ptr_type_info = e_type_from_key(ptr_type); + if(ptr_type_info->flags != 0) + { + ptr_type = e_type_key_cons_ptr(ptr_type_info->arch, ptr_type_info->direct_type_key, 1, 0); + } + } if(ptr_is_decay) { ptr_type = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type, 1, 0); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 9996b929..8c5eb508 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1795,6 +1795,13 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) case E_TypeKind_RRef: case E_TypeKind_Array: { + E_Type *type = e_type_from_key(type_key); + if(type->flags & E_TypeFlag_ArrayLikeExpansion) + { + expansion_opener_symbol = str8_lit("["); + expansion_closer_symbol = str8_lit("]"); + goto arrays_and_sets_and_structs; + } if(type_kind == E_TypeKind_Array && it->top_task->redirect_to_sets_and_structs) { expansion_opener_symbol = str8_lit("["); diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 301ae947..d3a4d35b 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -228,7 +228,7 @@ typedef U32 EV_StringFlags; enum { EV_StringFlag_ReadOnlyDisplayRules = (1<<0), - EV_StringFlag_PrettyNames = (1<<1), + EV_StringFlag_DisablePrettyNames = (1<<1), EV_StringFlag_DisableAddresses = (1<<2), EV_StringFlag_DisableStrings = (1<<3), EV_StringFlag_DisableChars = (1<<4), diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 07538564..2077358e 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -472,7 +472,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[39] = {str8_lit_comp("type_view"), 0, str8_lit_comp("@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}")}, {str8_lit_comp("recent_project"), 0, str8_lit_comp("x:{'path':path, 'name':string}")}, {str8_lit_comp("machine"), 0, str8_lit_comp("x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':set, 'processes':set}")}, -{str8_lit_comp("process"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}")}, +{str8_lit_comp("process"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set, @query @no_expand 'memory':address_space}")}, {str8_lit_comp("module"), 0, str8_lit_comp("x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}")}, {str8_lit_comp("thread"), 0, str8_lit_comp("x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':set}")}, }; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 5f6d0837..ba14a0bb 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -806,7 +806,7 @@ RD_VocabTable: //- rjf: @schema process { process, 0, - ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set}```, + ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':set, 'threads':set, @query @no_expand 'memory':address_space}```, } //- rjf: @schema module diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index b2d5b0d2..68cb2fe6 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -707,6 +707,7 @@ rd_ctrl_entity_from_eval_space(E_Space space) D_Entity *entity = &d_entity_nil; if(space.kind == D_EvalSpaceKind_Entity || space.kind == RD_EvalSpaceKind_MetaCtrlEntity || + space.kind == RD_EvalSpaceKind_MetaCallStack || space.kind == RD_EvalSpaceKind_MetaUnattachedProcess) { D_Handle handle; @@ -2058,11 +2059,16 @@ rd_view_ui(Rng2F32 rect) ////////////////////////////// //- rjf: unpack arguments // + B32 is_autocomplete = cfg_node_child_from_string(view, str8_lit("autocomplete")) != &cfg_nil_node; EV_View *eval_view = rd_view_eval_view(); F32 row_height_px = ui_top_px_height(); S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); F32 row_string_max_size_px = dim_2f32(rect).x; EV_StringFlags string_flags = EV_StringFlag_ReadOnlyDisplayRules|rd_state->eval_viz_base_string_flags; + if(is_autocomplete) + { + string_flags |= EV_StringFlag_DisablePrettyNames; + } String8 filter = rd_view_query_input(); Vec4F32 pop_background_rgba = {0}; UI_TagF("pop") pop_background_rgba = ui_color_from_name(str8_lit("background")); @@ -3186,8 +3192,7 @@ rd_view_ui(Rng2F32 rect) ////////////////////////////// //- rjf: autocomplete watches -> feed autocompletion info forward // - if(rd_watch_pt_match(ewv->cursor, ewv->mark) && - cfg_node_child_from_string(view, str8_lit("autocomplete")) != &cfg_nil_node) + if(rd_watch_pt_match(ewv->cursor, ewv->mark) && is_autocomplete) { U64 row_num = ev_num_from_key(&block_ranges, ewv->cursor.key); EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), &block_ranges, row_num); @@ -3195,7 +3200,7 @@ rd_view_ui(Rng2F32 rect) RD_WatchCell *cell = row_info.cells.first; if(cell != 0) { - RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, 0, &row_info, cell, ui_top_font(), ui_top_font_size(), dim_2f32(rect).y); + RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, &row_info, cell, ui_top_font(), ui_top_font_size(), dim_2f32(rect).y); String8 string = dr_string_from_fstrs(ui_build_arena(), &cell_info.eval_fstrs); if(string.size != 0) { @@ -12370,7 +12375,7 @@ rd_frame(void) String8 collection_name = str8_lit("call_stack_tree"); E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, - .flags = E_TypeFlag_StubSingleLineExpansion, + .flags = E_TypeFlag_StubSingleLineExpansion|E_TypeFlag_ArrayLikeExpansion, .access = E_TYPE_ACCESS_FUNCTION_NAME(call_stack_tree), .expand = { @@ -12452,6 +12457,18 @@ rd_frame(void) .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(peek_types), .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(peek_types), })); + e_string2typekey_map_insert(rd_frame_arena(), + rd_state->meta_name2type_map, + str8_lit("call_stack_frame"), + e_type_key_cons(.kind = E_TypeKind_Set, + .name = str8_lit("call_stack_frame"), + .irext = E_TYPE_IREXT_FUNCTION_NAME(call_stack_frame), + .access = E_TYPE_ACCESS_FUNCTION_NAME(call_stack_frame), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(call_stack_frame), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(call_stack_frame), + })); e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit("call_stack"), diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 2249fad7..472bcdab 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -16,6 +16,7 @@ enum RD_EvalSpaceKind_MetaTheme, RD_EvalSpaceKind_MetaView, RD_EvalSpaceKind_MetaCtrlEntity, + RD_EvalSpaceKind_MetaCallStack, RD_EvalSpaceKind_MetaUnattachedProcess, RD_EvalSpaceKind_MetaCallStackTree, }; diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 00acd908..f5fc95ca 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -407,6 +407,8 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) B32 wrap_child_w_meta_expr = 0; B32 is_query_child = md_node_has_tag(child_schema, str8_lit("query"), 0); E_TypeFlags type_flags = (!!is_query_child * E_TypeFlag_IsNotEditable); + B32 is_meta_eval = 1; + E_Mode child_mode = E_Mode_Offset; if(0){} //- rjf: ctrl entity members @@ -476,6 +478,13 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) { child_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, child_schema->string); } + else if(entity != &d_entity_nil && str8_match(child_schema->first->string, s("address_space"), 0)) + { + D_Entity *process = entity; + child_type_key = e_type_key_cons_ptr(process->arch, e_type_key_basic(E_TypeKind_Void), 1, type_flags|E_TypeFlag_StubSingleLineExpansion|E_TypeFlag_ArrayLikeExpansion); + child_mode = E_Mode_Value; + is_meta_eval = 0; + } //- rjf: extend child type with meta-expression information if(wrap_child_w_meta_expr) @@ -574,14 +583,18 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) child_eval_space.u64s[0] = cfg->id; child_eval_space.u64s[1] = e_id_from_string(child_schema->string); } - else + else if(is_meta_eval && entity != &d_entity_nil) { child_eval_space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); child_eval_space.u64s[2] = e_id_from_string(child_schema->string); } + else if(entity != &d_entity_nil) + { + child_eval_space = rd_eval_space_from_ctrl_entity(entity, D_EvalSpaceKind_Entity); + } irtree.root = e_irtree_set_space(arena, child_eval_space, e_push_irnode(arena, RDI_EvalOp_ConstU64)); irtree.type_key = child_type_key; - irtree.mode = E_Mode_Offset; + irtree.mode = child_mode; } } return irtree; @@ -1061,14 +1074,132 @@ E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs_slice) return num; } +//////////////////////////////// +//~ rjf: `call_stack_frame` Type Hooks + +typedef struct RD_CallStackFrameAccel RD_CallStackFrameAccel; +struct RD_CallStackFrameAccel +{ + Arch arch; + D_Handle thread; + D_Handle process; + U64 frame_index; + D_CallStackFrame *call_stack_frame; +}; + +E_TYPE_IREXT_FUNCTION_DEF(call_stack_frame) +{ + RD_CallStackFrameAccel *accel = push_array(arena, RD_CallStackFrameAccel, 1); + { + Temp scratch = scratch_begin(&arena, 1); + E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root); + String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); + E_Interpretation interp = e_interpret(bytecode); + D_Entity *entity = rd_ctrl_entity_from_eval_space(interp.space); + U64 frame_index = interp.value.u64; + if(entity->kind == D_EntityKind_Thread) + { + B32 call_stack_high_priority = d_handle_match(entity->handle, rd_base_regs()->thread); + D_CallStack call_stack = d_call_stack_from_thread(rd_state->frame_access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); + accel->arch = entity->arch; + accel->thread = entity->handle; + accel->process = d_process_from_entity(entity)->handle; + accel->frame_index = frame_index; + if(frame_index < call_stack.frames_count) + { + accel->call_stack_frame = &call_stack.frames[frame_index]; + } + } + scratch_end(scratch); + } + E_IRExt result = {accel}; + return result; +} + +E_TYPE_ACCESS_FUNCTION_DEF(call_stack_frame) +{ + E_IRTreeAndType result = {&e_irnode_nil}; + if(expr->kind == E_ExprKind_MemberAccess) + { + RD_CallStackFrameAccel *accel = (RD_CallStackFrameAccel *)lhs_irtree->user_data; + if(accel->call_stack_frame != 0) + { + if(str8_match(expr->first->next->string, s("address"), 0)) + { + ARCH_Info *arch_info = arch_info_from_arch(accel->arch); + D_CallStackFrame *f = accel->call_stack_frame; + D_Entity *process = d_entity_from_handle(accel->process); + result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity), e_irtree_const_u(arena, arch_ip_from_reg_block(arch_info, f->regs))); + result.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth); + result.mode = E_Mode_Value; + } + else if(str8_match(expr->first->next->string, s("locals"), 0)) + { + D_Entity *thread = d_entity_from_handle(accel->thread); + result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_MetaCallStack), e_irtree_const_u(arena, 0)); + result.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = s("locals")); + result.mode = E_Mode_Value; + } + } + } + return result; +} + +typedef struct RD_CallStackFrameExpandAccel RD_CallStackFrameExpandAccel; +struct RD_CallStackFrameExpandAccel +{ + String8Array names; +}; + +E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack_frame) +{ + RD_CallStackFrameExpandAccel *accel = push_array(arena, RD_CallStackFrameExpandAccel, 1); + { + Temp scratch = scratch_begin(&arena, 1); + String8List members_filtered = {0}; + String8 members[] = + { + s("address"), + s("locals"), + }; + for EachElement(idx, members) + { + FuzzyMatchRangeList fuzzy_match_ranges = fuzzy_match_find(scratch.arena, filter, members[idx]); + if(fuzzy_match_ranges.count == fuzzy_match_ranges.needle_part_count) + { + str8_list_push(scratch.arena, &members_filtered, members[idx]); + } + } + accel->names = str8_array_from_list(arena, &members_filtered); + scratch_end(scratch); + } + E_TypeExpandInfo info = {accel, accel->names.count}; + return info; +} + +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(call_stack_frame) +{ + RD_CallStackFrameExpandAccel *accel = (RD_CallStackFrameExpandAccel *)user_data; + Rng1U64 legal_idx_range = r1u64(0, accel->names.count); + Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range); + U64 read_range_count = dim_1u64(read_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) + { + U64 name_idx = read_range.min + idx; + if(name_idx < accel->names.count) + { + evals_out[idx] = e_eval_wrapf(eval, "$.%S", accel->names.v[name_idx]); + } + } +} + //////////////////////////////// //~ rjf: `call_stack` Type Hooks typedef struct RD_CallStackAccel RD_CallStackAccel; struct RD_CallStackAccel { - Arch arch; - D_Handle process; + D_Handle thread; D_CallStack call_stack; }; @@ -1084,8 +1215,7 @@ E_TYPE_IREXT_FUNCTION_DEF(call_stack) if(entity->kind == D_EntityKind_Thread) { B32 call_stack_high_priority = d_handle_match(entity->handle, rd_base_regs()->thread); - accel->arch = entity->arch; - accel->process = d_process_from_entity(entity)->handle; + accel->thread = entity->handle; accel->call_stack = d_call_stack_from_thread(rd_state->frame_access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0); } scratch_end(scratch); @@ -1104,11 +1234,9 @@ E_TYPE_ACCESS_FUNCTION_DEF(call_stack) D_CallStack *call_stack = &accel->call_stack; if(0 <= rhs_value.u64 && rhs_value.u64 < call_stack->frames_count) { - D_Entity *process = d_entity_from_handle(accel->process); - ARCH_Info *arch_info = arch_info_from_arch(accel->arch); - D_CallStackFrame *f = &call_stack->frames[rhs_value.u64]; - result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity), e_irtree_const_u(arena, arch_ip_from_reg_block(arch_info, f->regs))); - result.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth); + D_Entity *thread = d_entity_from_handle(accel->thread); + result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(thread, RD_EvalSpaceKind_MetaCallStack), e_irtree_const_u(arena, rhs_value.u64)); + result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, s("call_stack_frame")); result.mode = E_Mode_Value; } } diff --git a/src/raddbg/raddbg_eval.h b/src/raddbg/raddbg_eval.h index daba97c3..9ae517dc 100644 --- a/src/raddbg/raddbg_eval.h +++ b/src/raddbg/raddbg_eval.h @@ -73,6 +73,14 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs_slice); E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(cfgs_slice); E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs_slice); +//////////////////////////////// +//~ rjf: `call_stack_frame` Type Hooks + +E_TYPE_IREXT_FUNCTION_DEF(call_stack_frame); +E_TYPE_ACCESS_FUNCTION_DEF(call_stack_frame); +E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack_frame); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(call_stack_frame); + //////////////////////////////// //~ rjf: `call_stack` Type Hooks diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 6062f262..f7b7f018 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1424,7 +1424,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) F32 next_pct = 0; #define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct) rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_CallStackFrame, row->eval, .default_pct = 0.05f, .pct = take_pct()); - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .default_pct = 0.75f, .pct = take_pct()); + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, e_eval_wrapf(row->eval, "$.address"), .default_pct = 0.75f, .pct = take_pct()); rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, (module == &d_entity_nil ? (E_Eval)zero_struct : module_eval), .default_pct = 0.20f, .pct = take_pct()); #undef take_pct @@ -1656,7 +1656,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla String8 expr_string = {0}; // rjf: if this cell has a meta-display-name, then use that - if(expr_string.size == 0) + if(expr_string.size == 0 && !(string_flags & EV_StringFlag_DisablePrettyNames)) { for(E_Type *t = e_type_from_key(cell->eval.irtree.type_key); t != &e_type_nil; @@ -1741,10 +1741,11 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla // do a code-string of ".member_name" String8 member_name = notable_expr->first->next->string; String8 fancy_name = {0}; - if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg || - cell->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity || - cell->eval.space.kind == E_SpaceKind_File || - cell->eval.space.kind == E_SpaceKind_FileSystem) + if(!(string_flags & EV_StringFlag_DisablePrettyNames) && + (cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg || + cell->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity || + cell->eval.space.kind == E_SpaceKind_File || + cell->eval.space.kind == E_SpaceKind_FileSystem)) { fancy_name = rd_display_from_code_name(member_name); } From a980be76649a89d8f609fb0cf13720e66751b9b6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 10 Jun 2026 12:51:52 -0700 Subject: [PATCH 774/850] notes --- project.raddbg | 7 +++++++ src/dbg_engine/dbg_engine_ctrl.c | 1 - src/eval/eval_core.h | 1 - src/raddbg/raddbg_core.c | 1 - src/raddbg/raddbg_main.c | 8 ++++---- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/project.raddbg b/project.raddbg index e45bc52e..f65b157e 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,12 +7,19 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 +} +target: +{ + executable: "build/mule_main.exe" + working_directory: build + output_label: output_a enabled: 1 } target: { executable: "build/mule_main.exe" working_directory: build + output_label: output_b } target: { diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index bfa17682..0d2efd7d 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -3579,7 +3579,6 @@ d_ctrl_thread__eval_scope_begin(Arena *arena, D_BreakpointList *user_bps, D_Enti E_BaseCtx *ctx = &scope->base_ctx; //- rjf: fill instruction pointer info - ctx->thread_ip_vaddr = thread_rip_vaddr; ctx->thread_ip_voff = thread_rip_voff; ctx->thread_arch = thread->arch; ctx->thread_reg_space = e_space_make(D_EvalSpaceKind_Entity); diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index b6c0d40e..770a2dfc 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -786,7 +786,6 @@ typedef struct E_BaseCtx E_BaseCtx; struct E_BaseCtx { // rjf: instruction pointer info - U64 thread_ip_vaddr; U64 thread_ip_voff; E_Space thread_reg_space; E_Space thread_process_space; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 68cb2fe6..cc87d0d5 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11955,7 +11955,6 @@ rd_frame(void) E_BaseCtx *ctx = eval_base_ctx; //- rjf: fill instruction pointer info - ctx->thread_ip_vaddr = rip_vaddr; ctx->thread_ip_voff = rip_voff; ctx->thread_reg_space = rd_eval_space_from_ctrl_entity(thread, D_EvalSpaceKind_Entity); ctx->thread_process_space= rd_eval_space_from_ctrl_entity(process, D_EvalSpaceKind_Entity); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index a1cddf68..690ddb7f 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -33,7 +33,6 @@ // [ ] need to eliminate accelerators from evaluation context, and build them on the fly instead - // this is necessary because, for instance, the correct locals_map varies by expression, if we // want to (we do) support features like "look up call stack to find local" -// [ ] unit / module name qualification // //- memory view pass // [ ] toggleable ascii column @@ -83,8 +82,6 @@ // a way we can defer to the underlying shell in a non-horrible way...? // //- stepping or breakpoint oddness/fixes -// [ ] halting during a spoof-ridden step leaves the spoofs in place!!! -// (repro via LOTS of code on one line & halting) // [ ] stepping-onto a line with a conditional breakpoint, which fails, causes a // single step over the first instruction of that line, even if the thread // would've stopped at the first instruction due to the step, were that bp not @@ -185,7 +182,6 @@ // [ ] investigate /DEBUG:FASTLINK - can we somehow alert that we do not // support it? // [ ] just-in-time debugging -// [ ] step-out-of-loop // //- late-conversion performance improvements // [ ] live++ investigations - ctrl+alt+f11 in UE? @@ -281,6 +277,10 @@ // [x] unwinding in jit page - fail // [x] test concepts -> base // [x] debugger, d2r, p2r exemplar / determinism testing +// [x] halting during a spoof-ridden step leaves the spoofs in place!!! +// (repro via LOTS of code on one line & halting) +// [x] unit / module name qualification +// [x] step-out-of-loop //////////////////////////////// //~ rjf: Build Options From 82fd06c8e4ad72852e443292723fd118fd8941a3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 11 Jun 2026 08:51:47 -0700 Subject: [PATCH 775/850] specialize text right-click menus by disasm vs. source --- project.raddbg | 8 +- src/dbg_engine/dbg_engine.mdesk | 4 +- src/raddbg/generated/raddbg.meta.c | 16 +- src/raddbg/raddbg.mdesk | 388 ++++++++++++++--------------- src/raddbg/raddbg_core.c | 3 +- src/raddbg/raddbg_widgets.c | 11 +- 6 files changed, 217 insertions(+), 213 deletions(-) diff --git a/project.raddbg b/project.raddbg index f65b157e..7570552c 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,19 +7,13 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 -} -target: -{ - executable: "build/mule_main.exe" - working_directory: build - output_label: output_a enabled: 1 } target: { executable: "build/mule_main.exe" working_directory: build - output_label: output_b + output_label: output_a } target: { diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index ccc65aaf..2eaba2aa 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -27,8 +27,8 @@ D_CmdTable: // | | | {SetThreadIP 0 1 "" Vaddr null Nil Null 0 0 0 0 1 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the specified thread's instruction pointer at the specified address." "" "" } //- rjf: high-level composite target control operations - {RunToLine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" "{text_pt_commands}" } - {RunToName 1 1 "query:procedures" String null Nil Null 0 0 0 0 0 1 1 Play "run_to_name" "Run To Name" "Runs until a particular symbol name is hit." "" "{text_pt_commands}" } + {RunToLine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" "{text_pt_commands}{disasm_pt_commands}" } + {RunToName 1 1 "query:procedures" String null Nil Null 0 0 0 0 0 1 1 Play "run_to_name" "Run To Name" "Runs until a particular symbol name is hit." "" "" } {Run 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" "" } {Restart 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all attached processes, then launches all active targets." "restart,retry" "" } {StepInto 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)." "" "" } diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 2077358e..325cabec 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -607,8 +607,8 @@ RD_CmdKindInfo rd_cmd_kind_info_table[256] = { str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_to_name"), str8_lit_comp("Runs until a particular symbol name is hit."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("run_to_name"), str8_lit_comp("Runs until a particular symbol name is hit."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, @@ -749,7 +749,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[256] = { str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("{text_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("{text_range_commands}{disasm_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, @@ -762,11 +762,11 @@ RD_CmdKindInfo rd_cmd_kind_info_table[256] = { str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp("{text_pt_commands}{text_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp("{text_pt_commands}{text_range_commands}{disasm_pt_commands}{disasm_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, @@ -781,7 +781,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[256] = { str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, @@ -799,7 +799,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[256] = { str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, { str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index ba14a0bb..1e70f9c4 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -948,296 +948,296 @@ RD_RegTable: RD_CmdTable: // | | | | | | | | | | | { //- rjf: exiting - {Exit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } + {Exit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } //- rjf: palette - {OpenPalette 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } + {OpenPalette 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } //- rjf: command fast-path - {RunCommand 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } + {RunCommand 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } //- rjf: external drivers - {RunExternalDriverTextCommand 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } - {State 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } - {Eval 0 1 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } - {LineFromVAddr 0 1 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } + {RunExternalDriverTextCommand 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } + {State 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } + {Eval 0 1 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } + {LineFromVAddr 0 1 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } //- rjf: os event passthrough - {WMEvent 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } + {WMEvent 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } //- rjf: thread/frame selection - {SelectThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } - {SelectUnwind 0 1 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } - {UpOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } - {DownOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } - {SelectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } - {DeselectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } + {SelectThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } + {SelectUnwind 0 1 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } + {UpOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } + {DownOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } + {SelectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } + {DeselectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } //- rjf: font sizes - {IncWindowFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } - {DecWindowFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } - {IncViewFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } - {DecViewFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } + {IncWindowFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } + {DecWindowFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } + {IncViewFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } + {DecViewFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } //- rjf: windows - {OpenWindow 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } - {WindowSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } - {CloseWindow 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } - {ToggleFullscreen 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } - {BringToFront 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } + {OpenWindow 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } + {WindowSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } + {CloseWindow 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } + {ToggleFullscreen 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } + {BringToFront 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } //- rjf: popups - {PopupAccept 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } - {PopupCancel 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } + {PopupAccept 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } + {PopupCancel 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } //- rjf: keybindings - {ResetToDefaultBindings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } + {ResetToDefaultBindings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } //- rjf: panel splitting - {ResetToDefaultPanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } - {ResetToCompactPanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } - {ResetToSimplePanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } - {NewPanelLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } - {NewPanelUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } - {NewPanelRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } - {NewPanelDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } - {SplitPanel 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } + {ResetToDefaultPanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } + {ResetToCompactPanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } + {ResetToSimplePanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } + {NewPanelLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } + {NewPanelUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } + {NewPanelRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } + {NewPanelDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } + {SplitPanel 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } //- rjf: panel rotation - {RotatePanelColumns 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } + {RotatePanelColumns 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } //- rjf: focused panel changing - {NextPanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } - {PrevPanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } - {FocusPanel 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } - {FocusPanelRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } - {FocusPanelLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } - {FocusPanelUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } - {FocusPanelDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } + {NextPanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } + {PrevPanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } + {FocusPanel 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } + {FocusPanelRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } + {FocusPanelLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } + {FocusPanelUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } + {FocusPanelDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } //- rjf: undo/redo - {Undo 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } - {Redo 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } + {Undo 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } + {Redo 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } //- rjf: focus history - {GoBack 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } - {GoForward 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } + {GoBack 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } + {GoForward 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } //- rjf: panel removal - {ClosePanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } + {ClosePanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } //- rjf: panel tab - {FocusTab 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } - {NextTab 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } - {PrevTab 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } - {MoveTabRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "" } - {MoveTabLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "" } - {OpenTab 1 1 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } - {BuildTab 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } - {DuplicateTab 1 1 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "" } - {CopyTabFullPath 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "" } - {CloseTab 1 1 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "" } - {MoveView 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } - {TabBarTop 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "" } - {TabBarBottom 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "" } - {TabSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } + {FocusTab 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } + {NextTab 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } + {PrevTab 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } + {MoveTabRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "" } + {MoveTabLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "" } + {OpenTab 1 1 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } + {BuildTab 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } + {DuplicateTab 1 1 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "" } + {CopyTabFullPath 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "" } + {CloseTab 1 1 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "" } + {MoveView 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } + {TabBarTop 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "" } + {TabBarBottom 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "" } + {TabSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } //- rjf: files - {SetCurrentPath 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } - {Open 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } - {OpenSourceFileFromDebugInfo 1 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } - {SwitchToPartnerFile 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } - {ShowFileInExplorer 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "" } + {SetCurrentPath 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } + {Open 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } + {OpenSourceFileFromDebugInfo 1 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } + {SwitchToPartnerFile 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } + {ShowFileInExplorer 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "" } //- rjf: source <-> disasm - {GoToDisassembly 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "{text_pt_commands}" } - {GoToSource 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "{disasm_pt_commands}" } + {GoToDisassembly 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "{text_pt_commands}" } + {GoToSource 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "{disasm_pt_commands}" } //- rjf: override file links - {SetFileReplacementPath 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } + {SetFileReplacementPath 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } //- rjf: setting config paths - {NewUser 1 1 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } - {NewProject 1 1 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } - {OpenUser 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } - {OpenProject 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } - {OpenRecentProject 1 1 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } - {SaveUser 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } - {SaveProject 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } - {RecordUserAsLastOpened 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } - {RecordProjectInUser 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } + {NewUser 1 1 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } + {NewProject 1 1 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } + {OpenUser 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } + {OpenProject 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } + {OpenRecentProject 1 1 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } + {SaveUser 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } + {SaveProject 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } + {RecordUserAsLastOpened 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } + {RecordProjectInUser 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } //- rjf: writing config changes - {WriteUserData 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } - {WriteProjectData 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } + {WriteUserData 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } + {WriteProjectData 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } //- rjf: opening user/project settings - {UserSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } - {ProjectSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } + {UserSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } + {ProjectSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } //- rjf: meta controls - {Edit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } - {Accept 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } - {Cancel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } - {FocusMenu 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } + {Edit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } + {Accept 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } + {Cancel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } + {FocusMenu 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } //- rjf: directional movement & text controls - {MoveLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } - {MoveRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } - {MoveUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } - {MoveDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } - {MoveLeftSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } - {MoveRightSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } - {MoveUpSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } - {MoveDownSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } - {MoveLeftChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPage 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } - {MoveDownPage 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } - {MoveUpWhole 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } - {MoveDownWhole 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } - {MoveLeftChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPageSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } - {MoveDownPageSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } - {MoveUpWholeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } - {MoveDownWholeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } - {MoveUpReorder 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } - {MoveDownReorder 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } - {MoveHome 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } - {MoveEnd 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } - {MoveHomeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } - {MoveEndSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } - {SelectAll 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } - {DeleteSingle 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } - {DeleteChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } - {BackspaceSingle 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } - {BackspaceChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } - {Copy 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "{text_range_commands}" } - {Cut 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } - {Paste 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } - {InsertText 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } + {MoveLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } + {MoveRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } + {MoveUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } + {MoveDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } + {MoveLeftSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } + {MoveRightSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } + {MoveUpSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } + {MoveDownSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } + {MoveLeftChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPage 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } + {MoveDownPage 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } + {MoveUpWhole 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } + {MoveDownWhole 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } + {MoveLeftChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPageSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } + {MoveDownPageSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } + {MoveUpWholeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } + {MoveDownWholeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } + {MoveUpReorder 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } + {MoveDownReorder 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } + {MoveHome 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } + {MoveEnd 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } + {MoveHomeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } + {MoveEndSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } + {SelectAll 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } + {DeleteSingle 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } + {DeleteChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } + {BackspaceSingle 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } + {BackspaceChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } + {Copy 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "{text_range_commands}{disasm_range_commands}" } + {Cut 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } + {Paste 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } + {InsertText 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } //- rjf: directionless navigation - {MoveNext 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } - {MovePrev 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } + {MoveNext 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } + {MovePrev 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } //- rjf: code navigation - {GoToLine 1 1 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } - {GoToAddress 1 1 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } - {CenterCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } - {ContainCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } - {FindNext 1 1 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } - {FindPrev 1 1 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } + {GoToLine 1 1 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } + {GoToAddress 1 1 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } + {CenterCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } + {ContainCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } + {FindNext 1 1 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } + {FindPrev 1 1 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } //- rjf: thread finding - {FindThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } - {FindSelectedThread 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "{text_pt_commands}{text_range_commands}" } + {FindThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } + {FindSelectedThread 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "{text_pt_commands}{text_range_commands}{disasm_pt_commands}{disasm_range_commands}" } //- rjf: name finding - {GoToName 1 1 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } - {GoToNameAtCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "{text_pt_commands}" } + {GoToName 1 1 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } + {GoToNameAtCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "{text_pt_commands}{disasm_pt_commands}" } //- rjf: watch expressions - {ToggleWatchExpression 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "" } - {ToggleWatchExpressionAtCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "{text_pt_commands}" } - {ToggleWatchExpressionAtMouse 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } + {ToggleWatchExpression 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "" } + {ToggleWatchExpressionAtCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "{text_pt_commands}{disasm_pt_commands}" } + {ToggleWatchExpressionAtMouse 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } //- rjf: general config operations - {EnableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } - {DisableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } - {SelectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } - {DeselectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } - {RemoveCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } - {NameCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } - {ConditionCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } - {DuplicateCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } - {RelocateCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } - {SaveToProject 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } + {EnableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } + {DisableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } + {SelectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } + {DeselectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } + {RemoveCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } + {NameCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } + {ConditionCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } + {DuplicateCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } + {RelocateCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } + {SaveToProject 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } //- rjf: breakpoints - {AddBreakpoint 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } - {AddAddressBreakpoint 1 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "" } - {AddFunctionBreakpoint 1 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "" } - {ToggleBreakpoint 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "{text_pt_commands}" } - {RemoveBreakpoint 1 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "" } - {EnableBreakpoint 1 1 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } - {DisableBreakpoint 1 1 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } - {ClearBreakpoints 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } + {AddBreakpoint 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } + {AddAddressBreakpoint 1 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "" } + {AddFunctionBreakpoint 1 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "" } + {ToggleBreakpoint 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "{text_pt_commands}{disasm_pt_commands}" } + {RemoveBreakpoint 1 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "" } + {EnableBreakpoint 1 1 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } + {DisableBreakpoint 1 1 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } + {ClearBreakpoints 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } //- rjf: output - {ClearOutput 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } + {ClearOutput 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } //- rjf: watch pins - {AddWatchPin 1 1 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "" } - {ToggleWatchPin 1 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } + {AddWatchPin 1 1 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "" } + {ToggleWatchPin 1 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } //- rjf: debug infos - {LoadDebugInfo 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "" } - {UnloadDebugInfo 1 1 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "" } + {LoadDebugInfo 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "" } + {UnloadDebugInfo 1 1 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "" } //- rjf: type views - {AddTypeView 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } + {AddTypeView 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } //- rjf: file path maps - {AddFilePathMap 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } + {AddFilePathMap 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } //- rjf: themes - {EditUserTheme 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } - {EditProjectTheme 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } - {AddThemeColor 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } - {ForkTheme 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } - {SaveTheme 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } - {SaveAndSetTheme 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } + {EditUserTheme 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } + {EditProjectTheme 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } + {AddThemeColor 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } + {ForkTheme 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } + {SaveTheme 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } + {SaveAndSetTheme 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } //- rjf: line operations - {SetNextStatement 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "{text_pt_commands}" } + {SetNextStatement 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "{text_pt_commands}{disasm_pt_commands}" } //- rjf: targets - {AddTarget 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "" } - {SelectTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } - {EnableTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } - {DisableTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } - {RemoveTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } + {AddTarget 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "" } + {SelectTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } + {EnableTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } + {DisableTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } + {RemoveTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } //- rjf: attaching - {RegisterAsJITDebugger 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } + {RegisterAsJITDebugger 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } //- rjf: snap-to-code-location - {FindCodeLocation 0 1 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } + {FindCodeLocation 0 1 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } //- rjf: snap-to-memory-location - {GoToMemory 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "{memory_eval_commands}" } + {GoToMemory 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "{memory_eval_commands}" } //- rjf: break-when-value-changes - {BreakWhenValueChanges 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "{memory_eval_commands}" } + {BreakWhenValueChanges 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "{memory_eval_commands}" } //- rjf: searching - {Search 1 1 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } - {SearchBackwards 1 1 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } + {Search 1 1 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } + {SearchBackwards 1 1 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } //- rjf: queries - {PickFile 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } - {PickFolder 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } - {PickFileOrFolder 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } + {PickFile 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } + {PickFolder 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } + {PickFileOrFolder 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } //- rjf: query stack - {PushQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } - {CompleteQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } - {CancelQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } - {UpdateQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } + {PushQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } + {CompleteQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } + {CancelQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } + {UpdateQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } //- rjf: event buffers - {OpenEventBuffer 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } - {CloseEventBuffer 0 1 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } + {OpenEventBuffer 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } + {CloseEventBuffer 0 1 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } //- rjf: developer commands - {ToggleDevMenu 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } - {LogMarker 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } + {ToggleDevMenu 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } + {LogMarker 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } } @enum RD_CmdKind: diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index cc87d0d5..4b860b7a 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -6579,7 +6579,7 @@ rd_window_frame(void) } if(!ui_key_match(ui_key_zero(), ws->query_regs->ui_key)) { - query_width_px = is_small ? (ui_top_font_size()*28.f) : (ui_top_font_size()*60.f); + query_width_px = is_small ? (ui_top_font_size()*30.f) : (ui_top_font_size()*60.f); max_query_height_px = is_small ? (ui_top_font_size()*40.f) : (ui_top_font_size()*80.f); } F32 query_height_px = max_query_height_px; @@ -12000,6 +12000,7 @@ rd_frame(void) s("commands"), s("tab_commands"), s("text_pt_commands"), + s("disasm_pt_commands"), s("text_range_commands"), s("memory_eval_commands"), s("module_commands"), diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index a45032df..4db60f77 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -2095,9 +2095,18 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe vaddr = params->line_vaddrs[cursor->line - params->line_num_range.min]; lines = params->line_infos[cursor->line - params->line_num_range.min]; } + String8 commands_expr; + if(vaddr != 0) + { + commands_expr = txt_pt_match(*cursor, *mark) ? s("query:disasm_pt_commands") : s("query:disasm_range_commands"); + } + else + { + commands_expr = txt_pt_match(*cursor, *mark) ? s("query:text_pt_commands") : s("query:text_range_commands"); + } rd_cmd(RD_CmdKind_FocusPanel); rd_cmd(RD_CmdKind_PushQuery, - .expr = txt_pt_match(*cursor, *mark) ? s("query:text_pt_commands") : s("query:text_range_commands"), + .expr = commands_expr, .do_implicit_root = 1, .do_lister = 1, .activate_with_single_click = 1, From 90b650354ae06ea91efc6c019b28ee6790052aeb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 11 Jun 2026 09:08:34 -0700 Subject: [PATCH 776/850] eliminate redundant/unused info from command tables in dbg engine / raddbg --- project.raddbg | 2 +- src/dbg_engine/dbg_engine.mdesk | 80 ++--- src/raddbg/generated/raddbg.meta.c | 460 ++++++++++++++--------------- src/raddbg/generated/raddbg.meta.h | 2 - src/raddbg/raddbg.mdesk | 402 +++++++++++++------------ 5 files changed, 471 insertions(+), 475 deletions(-) diff --git a/project.raddbg b/project.raddbg index 7570552c..03f94c70 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,13 +7,13 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 - enabled: 1 } target: { executable: "build/mule_main.exe" working_directory: build output_label: output_a + enabled: 1 } target: { diff --git a/src/dbg_engine/dbg_engine.mdesk b/src/dbg_engine/dbg_engine.mdesk index 2eaba2aa..338c6db4 100644 --- a/src/dbg_engine/dbg_engine.mdesk +++ b/src/dbg_engine/dbg_engine.mdesk @@ -4,60 +4,60 @@ //////////////////////////////// //~ rjf: Built-In Command Tables -@table(name ui_vis ipc_docs_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags filter_tags) -// / | | | | \___ _________________________________/ | | | | | | -// / | | | | \ / | | | | | | -D_CmdTable: // | | | | | | | | | | | | +@table(name ui_vis ipc_docs_vis q_expr q_slot q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags filter_tags) +// / | | | | \__ ______________________________________________________________/ / / | | | | +// / | | | | \ / _________________/ _________________/ | | | | +D_CmdTable: // | | | | | | / / | | | | { //- rjf: low-level target control operations - {LaunchAndRun 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" "" } - {LaunchAndStepInto 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 PlayStepForward "launch_and_step_into" "Launch and Step Into" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" "" } - {Kill 1 1 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 X "kill" "Kill" "Kills the specified existing attached process(es)." "stop,kill" "" } - {KillAll 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all attached processes." "stop,kill,all" "" } - {Detach 1 1 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Null "detach" "Detach" "Detaches the specified attached process(es)." "detach" "" } - {Continue 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "continue" "Continue" "Continues executing all attached processes." "" "" } - {StepIntoInst 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" "" } - {StepOverInst 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" "" } - {StepIntoLine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" "" } - {StepOverLine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" "" } - {StepOut 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the first instruction after the current scope is exited." "" "" } - {StepToExit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOut "step_to_exit" "Step To Exit" "Runs to the first encountered instruction which will exit the current scope." "" "" } - {Halt 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all attached processes." "pause" "" } - {SoftHaltRefresh 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all attached processes to collect data, and then resumes them." "" "" } - {SetThreadIP 0 1 "" Vaddr null Nil Null 0 0 0 0 1 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the specified thread's instruction pointer at the specified address." "" "" } + {LaunchAndRun 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 Play "launch_and_run" "Launch and Run" "Starts debugging a new instance of a target, then runs." "launch,start,run,target" "" } + {LaunchAndStepInto 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 PlayStepForward "launch_and_step_into" "Launch and Step Into" "Starts debugging a new instance of a target, then stops at the program's entry point." "launch,start,entry,point" "" } + {Kill 1 1 "query:processes" Process 0 0 0 0 0 1 1 X "kill" "Kill" "Kills the specified existing attached process(es)." "stop,kill" "" } + {KillAll 1 1 "" Null 0 0 0 0 0 0 0 Stop "kill_all" "Kill All" "Kills all attached processes." "stop,kill,all" "" } + {Detach 1 1 "query:processes" Process 0 0 0 0 0 1 1 Null "detach" "Detach" "Detaches the specified attached process(es)." "detach" "" } + {Continue 1 1 "" Null 0 0 0 0 0 0 0 Play "continue" "Continue" "Continues executing all attached processes." "" "" } + {StepIntoInst 1 1 "" Null 0 0 0 0 0 0 0 StepInto "step_into_inst" "Step Into (Assembly)" "Performs a step that goes into calls, at the instruction level." "single,step,thread" "" } + {StepOverInst 1 1 "" Null 0 0 0 0 0 0 0 StepOver "step_over_inst" "Step Over (Assembly)" "Performs a step that skips calls, at the instruction level." "single,step,thread" "" } + {StepIntoLine 1 1 "" Null 0 0 0 0 0 0 0 StepInto "step_into_line" "Step Into (Line)" "Performs a step that goes into calls, at the source code line level." "step,thread" "" } + {StepOverLine 1 1 "" Null 0 0 0 0 0 0 0 StepOver "step_over_line" "Step Over (Line)" "Performs a step that skips calls, at the source code line level." "step,thread" "" } + {StepOut 1 1 "" Null 0 0 0 0 0 0 0 StepOut "step_out" "Step Out" "Runs to the first instruction after the current scope is exited." "" "" } + {StepToExit 1 1 "" Null 0 0 0 0 0 0 0 StepOut "step_to_exit" "Step To Exit" "Runs to the first encountered instruction which will exit the current scope." "" "" } + {Halt 1 1 "" Null 0 0 0 0 0 0 0 Pause "halt" "Halt" "Halts all attached processes." "pause" "" } + {SoftHaltRefresh 0 0 "" Null 0 0 0 0 0 0 0 Refresh "soft_halt_refresh" "Soft Halt Refresh" "Interrupts all attached processes to collect data, and then resumes them." "" "" } + {SetThreadIP 0 1 "" Vaddr 0 0 0 0 1 1 1 Null "set_thread_ip" "Set Thread IP" "Sets the specified thread's instruction pointer at the specified address." "" "" } //- rjf: high-level composite target control operations - {RunToLine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" "{text_pt_commands}{disasm_pt_commands}" } - {RunToName 1 1 "query:procedures" String null Nil Null 0 0 0 0 0 1 1 Play "run_to_name" "Run To Name" "Runs until a particular symbol name is hit." "" "" } - {Run 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" "" } - {Restart 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all attached processes, then launches all active targets." "restart,retry" "" } - {StepInto 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)." "" "" } - {StepOver 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either source lines or instructions." "" "" } + {RunToLine 1 1 "" Null 0 0 0 0 0 0 0 Play "run_to_line" "Run To Line" "Runs until a particular source line is hit." "" "{text_pt_commands}{disasm_pt_commands}" } + {RunToName 1 1 "query:procedures" String 0 0 0 0 0 1 1 Play "run_to_name" "Run To Name" "Runs until a particular symbol name is hit." "" "" } + {Run 1 1 "" Null 0 0 0 0 0 0 0 Play "run" "Run" "Runs all targets after starting them if they have not been started yet." "play" "" } + {Restart 1 1 "" Null 0 0 0 0 0 0 0 Redo "restart" "Restart" "Kills all attached processes, then launches all active targets." "restart,retry" "" } + {StepInto 1 1 "" Null 0 0 0 0 0 0 0 StepInto "step_into" "Step Into" "Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)." "" "" } + {StepOver 1 1 "" Null 0 0 0 0 0 0 0 StepOver "step_over" "Step Over" "Steps once, always over function calls, for either source lines or instructions." "" "" } //- rjf: debug control context management operations - {FreezeThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "callstack,unwind" "" } - {ThawThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" "" } - {FreezeProcess 1 1 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" "" } - {ThawProcess 1 1 "query:processes" Process null Nil Process 0 0 0 0 0 1 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" "" } - {FreezeMachine 0 1 "query:machines" Machine null Nil Machine 0 0 0 0 0 1 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" "" } - {ThawMachine 0 1 "query:machines" Machine null Nil Machine 0 0 0 0 0 1 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" "" } - {FreezeLocalMachine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" "" } - {ThawLocalMachine 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" "" } - {FreezeEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Unlocked "freeze_entity" "Freeze Entity" "Freezes an entity." "" "" } - {ThawEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Locked "thaw_entity" "Thaw Entity" "Thaws an entity." "" "" } + {FreezeThread 1 1 "query:threads" Thread 0 0 0 0 0 1 1 Locked "freeze_thread" "Freeze Thread" "Freezes the passed thread." "callstack,unwind" "" } + {ThawThread 1 1 "query:threads" Thread 0 0 0 0 0 1 1 Unlocked "thaw_thread" "Thaw Thread" "Thaws the passed thread." "" "" } + {FreezeProcess 1 1 "query:processes" Process 0 0 0 0 0 1 1 Locked "freeze_process" "Freeze Process" "Freezes the passed process." "" "" } + {ThawProcess 1 1 "query:processes" Process 0 0 0 0 0 1 1 Unlocked "thaw_process" "Thaw Process" "Thaws the passed process." "" "" } + {FreezeMachine 0 1 "query:machines" Machine 0 0 0 0 0 1 1 Locked "freeze_machine" "Freeze Machine" "Freezes the passed machine." "" "" } + {ThawMachine 0 1 "query:machines" Machine 0 0 0 0 0 1 1 Unlocked "thaw_machine" "Thaw Machine" "Thaws the passed machine." "" "" } + {FreezeLocalMachine 1 1 "" Null 0 0 0 0 0 0 0 Machine "freeze_local_machine" "Freeze Local Machine" "Freezes the local machine." "" "" } + {ThawLocalMachine 1 1 "" Null 0 0 0 0 0 0 0 Machine "thaw_local_machine" "Thaw Local Machine" "Thaws the local machine." "" "" } + {FreezeEntity 0 0 "" Null 0 0 0 0 0 0 0 Unlocked "freeze_entity" "Freeze Entity" "Freezes an entity." "" "" } + {ThawEntity 0 0 "" Null 0 0 0 0 0 0 0 Locked "thaw_entity" "Thaw Entity" "Thaws an entity." "" "" } //- rjf: entity decoration - {SetEntityColor 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_entity_color" "Set Entity Color" "Sets the passed entity's color." "" "" } - {SetEntityName 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_entity_name" "Set Entity Name" "Sets the passed entity's name." "" "" } + {SetEntityColor 0 0 "" Null 0 0 0 0 0 0 0 Null "set_entity_color" "Set Entity Color" "Sets the passed entity's color." "" "" } + {SetEntityName 0 0 "" Null 0 0 0 0 0 0 0 Null "set_entity_name" "Set Entity Name" "Sets the passed entity's name." "" "" } //- rjf: modules - {DownloadModuleDebugInfo 1 1 "query:modules" CtrlEntity null Nil Null 0 0 0 0 0 1 1 Module "download_module_debug_info" "Download Module Debug Info" "Tries to download a module's debug info from symbol server(s)." "" "{module_commands}" } + {DownloadModuleDebugInfo 1 1 "query:modules" CtrlEntity 0 0 0 0 0 1 1 Module "download_module_debug_info" "Download Module Debug Info" "Tries to download a module's debug info from symbol server(s)." "" "{module_commands}" } //- rjf: attaching - {Attach 1 1 "query:unattached_processes" PID null Nil Null 0 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" "" } + {Attach 1 1 "query:unattached_processes" PID 0 0 0 0 0 1 1 Null "attach" "Attach" "Attaches to a process that is already running on the local machine." "" "" } //- rjf: crash dump opening - {OpenCrashDump 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } + {OpenCrashDump 0 0 `folder:\\"$input\\"` FilePath 0 0 0 0 0 1 1 FileOutline "open_crash_dump" "Open Crash Dump" "Opens a crash dump file and recreates debuggee state at the time of the crash." "" "" } } @enum D_CmdKind: diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 325cabec..a9ed8988 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -592,236 +592,236 @@ Rng1U64 rd_reg_slot_range_table[52] = RD_CmdKindInfo rd_cmd_kind_info_table[256] = { {0}, -{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("launch_and_step_into"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the first instruction after the current scope is exited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_to_exit"), str8_lit_comp("Runs to the first encountered instruction which will exit the current scope."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_to_name"), str8_lit_comp("Runs until a particular symbol name is hit."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes"), str8_lit_comp(""), D_EntityKind_Process}}, -{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, -{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines"), str8_lit_comp(""), D_EntityKind_Machine}}, -{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("download_module_debug_info"), str8_lit_comp("Tries to download a module's debug info from symbol server(s)."), str8_lit_comp(""), str8_lit_comp("{module_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CtrlEntity, str8_lit_comp("query:modules"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands"), str8_lit_comp("commands"), D_EntityKind_Null}}, -{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("{text_range_commands}{disasm_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), D_EntityKind_Thread}}, -{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp("{text_pt_commands}{text_range_commands}{disasm_pt_commands}{disasm_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp("symbol_lister"), D_EntityKind_Null}}, -{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp("{memory_eval_commands}"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp("{memory_eval_commands}"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, -{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), D_EntityKind_Null}}, +{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets")}}, +{ str8_lit_comp("launch_and_step_into"), str8_lit_comp("Starts debugging a new instance of a target, then stops at the program's entry point."), str8_lit_comp("launch,start,entry,point"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets")}}, +{ str8_lit_comp("kill"), str8_lit_comp("Kills the specified existing attached process(es)."), str8_lit_comp("stop,kill"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes")}}, +{ str8_lit_comp("kill_all"), str8_lit_comp("Kills all attached processes."), str8_lit_comp("stop,kill,all"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("detach"), str8_lit_comp("Detaches the specified attached process(es)."), str8_lit_comp("detach"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes")}}, +{ str8_lit_comp("continue"), str8_lit_comp("Continues executing all attached processes."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("step_into_inst"), str8_lit_comp("Performs a step that goes into calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("step_over_inst"), str8_lit_comp("Performs a step that skips calls, at the instruction level."), str8_lit_comp("single,step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("step_into_line"), str8_lit_comp("Performs a step that goes into calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("step_over_line"), str8_lit_comp("Performs a step that skips calls, at the source code line level."), str8_lit_comp("step,thread"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("step_out"), str8_lit_comp("Runs to the first instruction after the current scope is exited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("step_to_exit"), str8_lit_comp("Runs to the first encountered instruction which will exit the current scope."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("halt"), str8_lit_comp("Halts all attached processes."), str8_lit_comp("pause"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("soft_halt_refresh"), str8_lit_comp("Interrupts all attached processes to collect data, and then resumes them."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("set_thread_ip"), str8_lit_comp("Sets the specified thread's instruction pointer at the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp("")}}, +{ str8_lit_comp("run_to_line"), str8_lit_comp("Runs until a particular source line is hit."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("run_to_name"), str8_lit_comp("Runs until a particular symbol name is hit."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures")}}, +{ str8_lit_comp("run"), str8_lit_comp("Runs all targets after starting them if they have not been started yet."), str8_lit_comp("play"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("restart"), str8_lit_comp("Kills all attached processes, then launches all active targets."), str8_lit_comp("restart,retry"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("step_into"), str8_lit_comp("Steps once, possibly into function calls, for either source lines or instructions (whichever is selected)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("step_over"), str8_lit_comp("Steps once, always over function calls, for either source lines or instructions."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("freeze_thread"), str8_lit_comp("Freezes the passed thread."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads")}}, +{ str8_lit_comp("thaw_thread"), str8_lit_comp("Thaws the passed thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads")}}, +{ str8_lit_comp("freeze_process"), str8_lit_comp("Freezes the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes")}}, +{ str8_lit_comp("thaw_process"), str8_lit_comp("Thaws the passed process."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp("query:processes")}}, +{ str8_lit_comp("freeze_machine"), str8_lit_comp("Freezes the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines")}}, +{ str8_lit_comp("thaw_machine"), str8_lit_comp("Thaws the passed machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp("query:machines")}}, +{ str8_lit_comp("freeze_local_machine"), str8_lit_comp("Freezes the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("thaw_local_machine"), str8_lit_comp("Thaws the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("freeze_entity"), str8_lit_comp("Freezes an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("thaw_entity"), str8_lit_comp("Thaws an entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("set_entity_color"), str8_lit_comp("Sets the passed entity's color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("download_module_debug_info"), str8_lit_comp("Tries to download a module's debug info from symbol server(s)."), str8_lit_comp(""), str8_lit_comp("{module_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CtrlEntity, str8_lit_comp("query:modules")}}, +{ str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp("query:unattached_processes")}}, +{ str8_lit_comp("open_crash_dump"), str8_lit_comp("Opens a crash dump file and recreates debuggee state at the time of the crash."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("open_palette"), str8_lit_comp("Opens the palette."), str8_lit_comp("help,cmd,lister"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands")}}, +{ str8_lit_comp("run_ext_driver_text_command"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("state"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("eval"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp("")}}, +{ str8_lit_comp("line_from_vaddr"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Vaddr, str8_lit_comp("")}}, +{ str8_lit_comp("wm_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads")}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack")}}, +{ str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("inc_window_font_size"), str8_lit_comp("Increases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("dec_window_font_size"), str8_lit_comp("Decreases the window's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("inc_view_font_size"), str8_lit_comp("Increases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("dec_view_font_size"), str8_lit_comp("Decreases the view's font size by one point."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("open_window"), str8_lit_comp("Opens a new window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("window_settings"), str8_lit_comp("Opens settings for a window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("close_window"), str8_lit_comp("Closes an opened window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("toggle_fullscreen"), str8_lit_comp("Toggles fullscreen view on the active window."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("bring_to_front"), str8_lit_comp("Brings all windows to the front, and focuses the most recently focused window."), str8_lit_comp("top"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("popup_accept"), str8_lit_comp("Accepts the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("popup_cancel"), str8_lit_comp("Cancels the active popup prompt."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("reset_to_default_bindings"), str8_lit_comp("Resets all keybindings to their defaults."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("reset_to_default_panels"), str8_lit_comp("Resets the window to the default panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("reset_to_compact_panels"), str8_lit_comp("Resets the window to the compact panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("reset_to_simple_panels"), str8_lit_comp("Resets the window to the simple panel layout."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("new_panel_left"), str8_lit_comp("Creates a new panel to the left of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("new_panel_up"), str8_lit_comp("Creates a new panel at the top of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("new_panel_right"), str8_lit_comp("Creates a new panel to the right of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("new_panel_down"), str8_lit_comp("Creates a new panel at the bottom of the active panel."), str8_lit_comp("panel"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("split_panel"), str8_lit_comp("Creates a new panel in a given direction, and moves a tab to it, if specified."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("rotate_panel_columns"), str8_lit_comp("Rotates all panels at the closest column level of the panel hierarchy."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("next_panel"), str8_lit_comp("Cycles the active panel forward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("prev_panel"), str8_lit_comp("Cycles the active panel backwards."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("focus_panel"), str8_lit_comp("Focuses a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("focus_panel_right"), str8_lit_comp("Focuses a panel rightward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("focus_panel_left"), str8_lit_comp("Focuses a panel leftward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("focus_panel_up"), str8_lit_comp("Focuses a panel upward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("focus_panel_down"), str8_lit_comp("Focuses a panel downward of the currently focused panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("undo"), str8_lit_comp("Undoes the previous action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("redo"), str8_lit_comp("Redoes the first previously undone action."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("go_back"), str8_lit_comp("Returns to the previously selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("go_forward"), str8_lit_comp("Returns to the next selected panel and tab in recorded history."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("close_panel"), str8_lit_comp("Closes the currently active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("focus_tab"), str8_lit_comp("Focuses the passed tab within its containing panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("next_tab"), str8_lit_comp("Focuses the next tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("prev_tab"), str8_lit_comp("Focuses the previous tab on the active panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:tab_commands")}}, +{ str8_lit_comp("build_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("duplicate_tab"), str8_lit_comp("Duplicates a tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp("")}}, +{ str8_lit_comp("copy_tab_full_path"), str8_lit_comp("Copies the full path of the file being viewed by this tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp("")}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp("")}}, +{ str8_lit_comp("move_view"), str8_lit_comp("Moves a view to a new panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("tab_settings"), str8_lit_comp("Opens settings for a tab."), str8_lit_comp("view,options"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("set_current_path"), str8_lit_comp("Sets the debugger's current path, which is used as a starting point when browsing for files."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("open"), str8_lit_comp("Opens a file."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("open_source_file_from_debug_info"), str8_lit_comp("Opens a source file found within loaded debug info."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:source_files")}}, +{ str8_lit_comp("switch_to_partner_file"), str8_lit_comp("Switches to the focused file's partner; or from header to implementation or vice versa."), str8_lit_comp("code,source,file"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("show_file_in_explorer"), str8_lit_comp("Opens the operating system's file explorer and shows the selected file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("go_to_disassembly"), str8_lit_comp("Goes to the disassembly, if any, for a given source code line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("{text_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("go_to_source"), str8_lit_comp("Goes to the source code, if any, for a given disassembly line."), str8_lit_comp("code,source,disassembly,disasm"), str8_lit_comp("{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("set_file_replacement_path"), str8_lit_comp("Sets the path which should be used as the replacement for the passed file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("new_user"), str8_lit_comp("Creates a new user file, and sets the current user path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("new_project"), str8_lit_comp("Creates a new project file, and sets the current project path as that file's path."), str8_lit_comp("new,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("open_user"), str8_lit_comp("Opens a user file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("open_project"), str8_lit_comp("Opens a project file path, immediately loading it, and begins autosaving to it."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("open_recent_project"), str8_lit_comp("Opens a recently used project file."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:recent_projects")}}, +{ str8_lit_comp("save_user"), str8_lit_comp("Saves user data to a file, and sets the current user path as that path."), str8_lit_comp("load,user,project,layout"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("save_project"), str8_lit_comp("Saves project data to a file, and sets the current project path as that path."), str8_lit_comp("project,project,session"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("record_user_as_last_opened"), str8_lit_comp("Records a file path as the last opened user."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("record_project_in_user"), str8_lit_comp("Records a file path as a recent project in user data."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("write_user_data"), str8_lit_comp("Writes user data to the active user file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("write_project_data"), str8_lit_comp("Writes project data to the active project file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("user_settings"), str8_lit_comp("Opens user settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("project_settings"), str8_lit_comp("Opens project settings."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("edit"), str8_lit_comp("Edits the current selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("accept"), str8_lit_comp("Accepts current changes, or answers prompts in the affirmative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("cancel"), str8_lit_comp("Rejects current changes, exits temporary menus, or answers prompts in the negative."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("focus_menu"), str8_lit_comp("Focuses the menu for the selected interface, if there is one."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_left"), str8_lit_comp("Moves the cursor or selection left."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_right"), str8_lit_comp("Moves the cursor or selection right."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up"), str8_lit_comp("Moves the cursor or selection up."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down"), str8_lit_comp("Moves the cursor or selection down."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_left_select"), str8_lit_comp("Moves the cursor or selection left, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_right_select"), str8_lit_comp("Moves the cursor or selection right, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up_select"), str8_lit_comp("Moves the cursor or selection up, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down_select"), str8_lit_comp("Moves the cursor or selection down, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_left_chunk"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_right_chunk"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up_chunk"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down_chunk"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up_page"), str8_lit_comp("Moves the cursor or selection up one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down_page"), str8_lit_comp("Moves the cursor or selection down one page."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up_whole"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down_whole"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_left_chunk_select"), str8_lit_comp("Moves the cursor or selection left one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_right_chunk_select"), str8_lit_comp("Moves the cursor or selection right one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up_chunk_select"), str8_lit_comp("Moves the cursor or selection up one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down_chunk_select"), str8_lit_comp("Moves the cursor or selection down one chunk."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up_page_select"), str8_lit_comp("Moves the cursor or selection up one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down_page_select"), str8_lit_comp("Moves the cursor or selection down one page, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up_whole_select"), str8_lit_comp("Moves the cursor or selection to the beginning of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down_whole_select"), str8_lit_comp("Moves the cursor or selection to the end of the relevant content, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_up_reorder"), str8_lit_comp("Moves the cursor or selection up, while swapping the currently selected element with that upward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_down_reorder"), str8_lit_comp("Moves the cursor or selection down, while swapping the currently selected element with that downward."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_home"), str8_lit_comp("Moves the cursor to the beginning of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_end"), str8_lit_comp("Moves the cursor to the end of the line."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_home_select"), str8_lit_comp("Moves the cursor to the beginning of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_end_select"), str8_lit_comp("Moves the cursor to the end of the line, while selecting."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("select_all"), str8_lit_comp("Selects everything possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("delete_single"), str8_lit_comp("Deletes a single element to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("delete_chunk"), str8_lit_comp("Deletes a chunk to the right of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("backspace_single"), str8_lit_comp("Deletes a single element to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("backspace_chunk"), str8_lit_comp("Deletes a chunk to the left of the cursor, or the active selection."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("copy"), str8_lit_comp("Copies the active selection to the clipboard."), str8_lit_comp(""), str8_lit_comp("{text_range_commands}{disasm_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("cut"), str8_lit_comp("Copies the active selection to the clipboard, then deletes it."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("paste"), str8_lit_comp("Pastes the current contents of the clipboard."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("insert_text"), str8_lit_comp("Inserts the text that was used to cause this command."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_next"), str8_lit_comp("Moves the cursor or selection to the next element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("move_prev"), str8_lit_comp("Moves the cursor or selection to the previous element."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("goto_line"), str8_lit_comp("Jumps to a line number in the current code file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp("")}}, +{ str8_lit_comp("goto_address"), str8_lit_comp("Jumps to an address in the current memory or disassembly view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp("")}}, +{ str8_lit_comp("center_cursor"), str8_lit_comp("Snaps the current code view to center the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("contain_cursor"), str8_lit_comp("Snaps the current code view to contain the cursor."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("find_next"), str8_lit_comp("Searches the current code file forward (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("find_prev"), str8_lit_comp("Searches the current code file backwards (from the cursor) for the last searched string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("find_thread"), str8_lit_comp("Jumps to the passed thread in either source code, disassembly, or both if they're already open."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads")}}, +{ str8_lit_comp("find_selected_thread"), str8_lit_comp("Jumps to the selected thread in either source code, disassembly, or both if they're already open."), str8_lit_comp("current,instruction"), str8_lit_comp("{text_pt_commands}{text_range_commands}{disasm_pt_commands}{disasm_range_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("goto_name"), str8_lit_comp("Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures")}}, +{ str8_lit_comp("goto_name_at_cursor"), str8_lit_comp("Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("toggle_watch_expr"), str8_lit_comp("Adds or removes an expression to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("toggle_watch_expr_at_cursor"), str8_lit_comp("Adds or removes the expression that the cursor or selection is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("toggle_watch_expr_at_mouse"), str8_lit_comp("Adds or removes the expression that the mouse is currently over to an opened watch view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("duplicate_cfg"), str8_lit_comp("Duplicates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("relocate_cfg"), str8_lit_comp("Relocates a config tree."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("save_cfg_to_project"), str8_lit_comp("Saves the config tree to the project."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("add_breakpoint"), str8_lit_comp("Places a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("add_address_breakpoint"), str8_lit_comp("Places a breakpoint on the specified address."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp("")}}, +{ str8_lit_comp("add_function_breakpoint"), str8_lit_comp("Places a breakpoint on the first address of the specified function."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("query:procedures")}}, +{ str8_lit_comp("toggle_breakpoint"), str8_lit_comp("Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("remove_breakpoint"), str8_lit_comp("Removes an existing breakpoint."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints")}}, +{ str8_lit_comp("enable_breakpoint"), str8_lit_comp("Enables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints")}}, +{ str8_lit_comp("disable_breakpoint"), str8_lit_comp("Disables a breakpoint."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:breakpoints")}}, +{ str8_lit_comp("clear_breakpoints"), str8_lit_comp("Removes all breakpoints."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("clear_output"), str8_lit_comp("Clears all output."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("add_watch_pin"), str8_lit_comp("Places a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp("")}}, +{ str8_lit_comp("toggle_watch_pin"), str8_lit_comp("Places or removes a watch pin at a given location (file path and line number or address)."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp("")}}, +{ str8_lit_comp("load_debug_info"), str8_lit_comp("Loads a debug info file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("unload_debug_info"), str8_lit_comp("Unloads a debug info file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:debug_infos")}}, +{ str8_lit_comp("add_type_view"), str8_lit_comp("Adds a new type view."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("")}}, +{ str8_lit_comp("add_file_path_map"), str8_lit_comp("Adds a new file path map."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("edit_user_theme"), str8_lit_comp("Edits the current user's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes")}}, +{ str8_lit_comp("edit_project_theme"), str8_lit_comp("Edits the current project's theme."), str8_lit_comp("color"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp("query:themes")}}, +{ str8_lit_comp("add_theme_color"), str8_lit_comp("Adds a new theme color."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("fork_theme"), str8_lit_comp("Imports all colors from the current theme so they can be individually edited."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("save_theme"), str8_lit_comp("Saves all theme colors to a new theme file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("")}}, +{ str8_lit_comp("save_and_set_theme"), str8_lit_comp("Saves all theme colors to a new theme file, and then sets that theme as the selected theme."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("")}}, +{ str8_lit_comp("set_next_statement"), str8_lit_comp("Sets the selected thread's instruction pointer to the cursor's position."), str8_lit_comp(""), str8_lit_comp("{text_pt_commands}{disasm_pt_commands}"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("add_target"), str8_lit_comp("Adds a new target."), str8_lit_comp("application,executable,debug"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("select_target"), str8_lit_comp("Selects a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets")}}, +{ str8_lit_comp("enable_target"), str8_lit_comp("Enables a target, in addition to all targets currently enabled."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets")}}, +{ str8_lit_comp("disable_target"), str8_lit_comp("Disables a target."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets")}}, +{ str8_lit_comp("remove_target"), str8_lit_comp("Removes a target."), str8_lit_comp("delete"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets")}}, +{ str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("find_code_location"), str8_lit_comp("Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("")}}, +{ str8_lit_comp("go_to_memory"), str8_lit_comp("Finds the specified expression in the memory view. Opens the memory view if necessary."), str8_lit_comp(""), str8_lit_comp("{memory_eval_commands}"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp("")}}, +{ str8_lit_comp("break_when_value_changes"), str8_lit_comp("Adds a new write data breakpoint for this variable's range."), str8_lit_comp(""), str8_lit_comp("{memory_eval_commands}"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*0), RD_RegSlot_Expr, str8_lit_comp("")}}, +{ str8_lit_comp("search"), str8_lit_comp("Begins searching within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("")}}, +{ str8_lit_comp("search_backwards"), str8_lit_comp("Begins searching backwards within the active interface."), str8_lit_comp("sort,search,filter,find"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp("")}}, +{ str8_lit_comp("pick_file"), str8_lit_comp("Opens the file browser to pick a file."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("pick_folder"), str8_lit_comp("Opens the file browser to pick a folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("pick_file_or_folder"), str8_lit_comp("Opens the file browser to pick a file or folder."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp("folder:\"$input\"")}}, +{ str8_lit_comp("push_query"), str8_lit_comp("Opens a new temporary query interface."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("complete_query"), str8_lit_comp("Completes and closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("cancel_query"), str8_lit_comp("Closes a query."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("update_query"), str8_lit_comp("Updates a query input."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("open_event_buffer"), str8_lit_comp("Opens a new event buffer, to which debugger events will be written, for external processing."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("close_event_buffer"), str8_lit_comp("Closes an existing event buffer."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp("")}}, +{ str8_lit_comp("toggle_dev_menu"), str8_lit_comp("Opens and closes the developer menu."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, +{ str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("")}}, { str8_lit_comp("watches"), str8_lit_comp("Opens a Watch tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, { str8_lit_comp("locals"), str8_lit_comp("Opens a Locals tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, { str8_lit_comp("registers"), str8_lit_comp("Opens a Registers tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index bef8328b..92db5712 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -520,8 +520,6 @@ struct RD_Query RD_QueryFlags flags; RD_RegSlot slot; String8 expr; -String8 view_name; -D_EntityKind ctrl_entity_kind; }; typedef struct RD_CmdKindInfo RD_CmdKindInfo; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 1e70f9c4..b1ba1b66 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -942,302 +942,302 @@ RD_RegTable: //////////////////////////////// //~ rjf: Command Table -@table(name ui_vis ipc_docs_vis q_expr q_slot q_view q_ent_kind q_ctrl_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags filter_tags) -// / | | | \___ _________________________________________________________________/ | | | | | | -// / | | | \ / | | | | | | -RD_CmdTable: // | | | | | | | | | | | +@table(name ui_vis ipc_docs_vis q_expr q_slot q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_floating q_required canonical_icon string display_name desc search_tags filter_tags) +// / | | | \___ _________________________________________________/ | | | | | | +// / | | | \ / | | | | | | +RD_CmdTable: // | | | | | | | | | | | { //- rjf: exiting - {Exit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } + {Exit 1 1 "" Null 0 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" "" } //- rjf: palette - {OpenPalette 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } + {OpenPalette 1 1 "" Null 0 0 0 0 0 0 0 List "open_palette" "Open Palette" "Opens the palette." "help,cmd,lister" "" } //- rjf: command fast-path - {RunCommand 0 0 "query:commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } + {RunCommand 0 0 "query:commands" CmdName 0 0 0 0 0 1 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" "" } //- rjf: external drivers - {RunExternalDriverTextCommand 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } - {State 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } - {Eval 0 1 "" Expr null Nil Null 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } - {LineFromVAddr 0 1 "" Vaddr null Nil Null 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } + {RunExternalDriverTextCommand 0 0 "" Null 0 0 0 0 0 0 0 Null "run_ext_driver_text_command" "Run External Driver Text Command" "" "" "" } + {State 0 1 "" Null 0 0 0 0 0 0 0 Null "state" "State" "" "" "" } + {Eval 0 1 "" Expr 0 0 0 0 0 0 0 Null "eval" "Eval" "" "" "" } + {LineFromVAddr 0 1 "" Vaddr 0 0 0 0 0 0 0 Null "line_from_vaddr" "Line From Virtual Address" "" "" "" } //- rjf: os event passthrough - {WMEvent 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } + {WMEvent 0 0 "" Null 0 0 0 0 0 0 0 Null "wm_event" "OS Event" "" "" "" } //- rjf: thread/frame selection - {SelectThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } - {SelectUnwind 0 1 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } - {UpOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } - {DownOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } - {SelectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } - {DeselectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } + {SelectThread 1 1 "query:threads" Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } + {SelectUnwind 0 1 "query:call_stack" Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } + {UpOneFrame 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } + {DownOneFrame 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } + {SelectEntity 0 0 "" Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select" "Selects a control entity." "" "" } + {DeselectEntity 0 0 "" Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect" "Deselects a control entity." "" "" } //- rjf: font sizes - {IncWindowFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } - {DecWindowFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } - {IncViewFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } - {DecViewFontSize 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } + {IncWindowFontSize 1 1 "" Null 0 0 0 0 0 0 0 Null "inc_window_font_size" "Increase Window Font Size" "Increases the window's font size by one point." "" "" } + {DecWindowFontSize 1 1 "" Null 0 0 0 0 0 0 0 Null "dec_window_font_size" "Decrease Window Font Size" "Decreases the window's font size by one point." "" "" } + {IncViewFontSize 1 1 "" Null 0 0 0 0 0 0 0 Null "inc_view_font_size" "Increase View Font Size" "Increases the view's font size by one point." "" "" } + {DecViewFontSize 1 1 "" Null 0 0 0 0 0 0 0 Null "dec_view_font_size" "Decrease View Font Size" "Decreases the view's font size by one point." "" "" } //- rjf: windows - {OpenWindow 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } - {WindowSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } - {CloseWindow 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } - {ToggleFullscreen 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } - {BringToFront 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } + {OpenWindow 1 1 "" Null 0 0 0 0 0 0 0 Window "open_window" "Open New Window" "Opens a new window." "" "" } + {WindowSettings 1 1 "" Null 0 0 0 0 0 0 0 Gear "window_settings" "Window Settings" "Opens settings for a window." "" "" } + {CloseWindow 1 1 "" Null 0 0 0 0 0 0 0 Window "close_window" "Close Window" "Closes an opened window." "" "" } + {ToggleFullscreen 1 1 "" Null 0 0 0 0 0 0 0 Window "toggle_fullscreen" "Toggle Fullscreen" "Toggles fullscreen view on the active window." "" "" } + {BringToFront 0 1 "" Null 0 0 0 0 0 0 0 Window "bring_to_front" "Bring To Front" "Brings all windows to the front, and focuses the most recently focused window." "top" "" } //- rjf: popups - {PopupAccept 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } - {PopupCancel 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } + {PopupAccept 0 1 "" Null 0 0 0 0 0 0 0 Null "popup_accept" "Popup Accept" "Accepts the active popup prompt." "" "" } + {PopupCancel 0 1 "" Null 0 0 0 0 0 0 0 Null "popup_cancel" "Popup Cancel" "Cancels the active popup prompt." "" "" } //- rjf: keybindings - {ResetToDefaultBindings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } + {ResetToDefaultBindings 1 1 "" Null 0 0 0 0 0 0 0 Null "reset_to_default_bindings" "Reset To Default Bindings" "Resets all keybindings to their defaults." "" "" } //- rjf: panel splitting - {ResetToDefaultPanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } - {ResetToCompactPanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } - {ResetToSimplePanels 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } - {NewPanelLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } - {NewPanelUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } - {NewPanelRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } - {NewPanelDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } - {SplitPanel 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } + {ResetToDefaultPanels 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_default_panels" "Reset To Default Panel Layout" "Resets the window to the default panel layout." "panel" "" } + {ResetToCompactPanels 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_compact_panels" "Reset To Compact Panel Layout" "Resets the window to the compact panel layout." "panel" "" } + {ResetToSimplePanels 1 1 "" Null 0 0 0 0 0 0 0 Window "reset_to_simple_panels" "Reset To Simple Panel Layout" "Resets the window to the simple panel layout." "panel" "" } + {NewPanelLeft 1 1 "" Null 0 0 0 0 0 0 0 XSplit "new_panel_left" "Split Panel Left" "Creates a new panel to the left of the active panel." "panel" "" } + {NewPanelUp 1 1 "" Null 0 0 0 0 0 0 0 YSplit "new_panel_up" "Split Panel Up" "Creates a new panel at the top of the active panel." "panel" "" } + {NewPanelRight 1 1 "" Null 0 0 0 0 0 0 0 XSplit "new_panel_right" "Split Panel Right" "Creates a new panel to the right of the active panel." "panel" "" } + {NewPanelDown 1 1 "" Null 0 0 0 0 0 0 0 YSplit "new_panel_down" "Split Panel Down" "Creates a new panel at the bottom of the active panel." "panel" "" } + {SplitPanel 0 0 "" Null 0 0 0 0 0 0 0 Null "split_panel" "Split Panel" "Creates a new panel in a given direction, and moves a tab to it, if specified." "" "" } //- rjf: panel rotation - {RotatePanelColumns 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } + {RotatePanelColumns 1 1 "" Null 0 0 0 0 0 0 0 Null "rotate_panel_columns" "Rotate Panel Columns" "Rotates all panels at the closest column level of the panel hierarchy." "" "" } //- rjf: focused panel changing - {NextPanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } - {PrevPanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } - {FocusPanel 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } - {FocusPanelRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } - {FocusPanelLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } - {FocusPanelUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } - {FocusPanelDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } + {NextPanel 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "next_panel" "Focus Next Panel" "Cycles the active panel forward." "" "" } + {PrevPanel 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "prev_panel" "Focus Previous Panel" "Cycles the active panel backwards." "" "" } + {FocusPanel 0 0 "" Null 0 0 0 0 0 0 0 Null "focus_panel" "Focus Panel" "Focuses a new panel." "" "" } + {FocusPanelRight 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "focus_panel_right" "Focus Panel Right" "Focuses a panel rightward of the currently focused panel." "" "" } + {FocusPanelLeft 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "focus_panel_left" "Focus Panel Left" "Focuses a panel leftward of the currently focused panel." "" "" } + {FocusPanelUp 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "focus_panel_up" "Focus Panel Up" "Focuses a panel upward of the currently focused panel." "" "" } + {FocusPanelDown 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "focus_panel_down" "Focus Panel Down" "Focuses a panel downward of the currently focused panel." "" "" } //- rjf: undo/redo - {Undo 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } - {Redo 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } + {Undo 0 0 "" Null 0 0 0 0 0 0 0 Undo "undo" "Undo" "Undoes the previous action." "" "" } + {Redo 0 0 "" Null 0 0 0 0 0 0 0 Redo "redo" "Redo" "Redoes the first previously undone action." "" "" } //- rjf: focus history - {GoBack 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } - {GoForward 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } + {GoBack 0 0 "" Null 0 0 0 0 0 0 0 LeftArrow "go_back" "Go Back" "Returns to the previously selected panel and tab in recorded history." "" "" } + {GoForward 0 0 "" Null 0 0 0 0 0 0 0 RightArrow "go_forward" "Go Forward" "Returns to the next selected panel and tab in recorded history." "" "" } //- rjf: panel removal - {ClosePanel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } + {ClosePanel 1 1 "" Null 0 0 0 0 0 0 0 ClosePanel "close_panel" "Close Panel" "Closes the currently active panel." "" "" } //- rjf: panel tab - {FocusTab 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } - {NextTab 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } - {PrevTab 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } - {MoveTabRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "" } - {MoveTabLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "" } - {OpenTab 1 1 "query:tab_commands" CmdName commands Nil Null 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } - {BuildTab 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } - {DuplicateTab 1 1 "" Tab null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "" } - {CopyTabFullPath 0 0 "" Tab null Nil Null 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "" } - {CloseTab 1 1 "" Tab null Nil Null 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "" } - {MoveView 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } - {TabBarTop 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "" } - {TabBarBottom 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "" } - {TabSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } + {FocusTab 0 0 "" Null 0 0 0 0 0 0 0 Null "focus_tab" "Focus Tab" "Focuses the passed tab within its containing panel." "" "" } + {NextTab 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "next_tab" "Focus Next Tab" "Focuses the next tab on the active panel." "" "" } + {PrevTab 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "prev_tab" "Focus Previous Tab" "Focuses the previous tab on the active panel." "" "" } + {MoveTabRight 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" "" } + {MoveTabLeft 1 1 "" Null 0 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" "" } + {OpenTab 1 1 "query:tab_commands" CmdName 0 0 0 0 0 1 1 Null "open_tab" "Open New Tab" "Opens a new tab." "" "" } + {BuildTab 0 0 "" Null 0 0 0 0 0 0 0 Null "build_tab" "Build Tab" "Opens a new tab with the parameterized view specification." "" "" } + {DuplicateTab 1 1 "" Tab 0 0 0 0 0 0 0 Duplicate "duplicate_tab" "Duplicate Tab" "Duplicates a tab." "" "" } + {CopyTabFullPath 0 0 "" Tab 0 0 0 0 0 0 0 Clipboard "copy_tab_full_path" "Copy Full Path" "Copies the full path of the file being viewed by this tab." "" "" } + {CloseTab 1 1 "" Tab 0 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" "" } + {MoveView 0 0 "" Null 0 0 0 0 0 0 0 Null "move_view" "Move View" "Moves a view to a new panel." "" "" } + {TabBarTop 1 1 "" Null 0 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" "" } + {TabBarBottom 1 1 "" Null 0 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" "" } + {TabSettings 1 1 "" Null 0 0 0 0 0 0 0 Gear "tab_settings" "Selected Tab Settings" "Opens settings for a tab." "view,options" "" } //- rjf: files - {SetCurrentPath 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } - {Open 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } - {OpenSourceFileFromDebugInfo 1 0 "query:source_files" Cfg null RecentFile Null 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } - {SwitchToPartnerFile 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } - {ShowFileInExplorer 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "" } + {SetCurrentPath 0 1 "" Null 0 0 0 0 0 0 0 FileOutline "set_current_path" "Set Current Path" "Sets the debugger's current path, which is used as a starting point when browsing for files." "" "" } + {Open 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 FileOutline "open" "Open" "Opens a file." "code,source,file" "" } + {OpenSourceFileFromDebugInfo 1 0 "query:source_files" Cfg 0 0 0 0 0 1 1 FileOutline "open_source_file_from_debug_info" "Open Source File From Debug Info" "Opens a source file found within loaded debug info." "code,source,file" "" } + {SwitchToPartnerFile 1 1 "" Null 0 0 0 0 0 0 0 FileOutline "switch_to_partner_file" "Switch To Partner File" "Switches to the focused file's partner; or from header to implementation or vice versa." "code,source,file" "" } + {ShowFileInExplorer 1 1 "" Null 0 0 0 0 0 0 0 FolderClosedFilled "show_file_in_explorer" "Show File In Explorer" "Opens the operating system's file explorer and shows the selected file." "" "" } //- rjf: source <-> disasm - {GoToDisassembly 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "{text_pt_commands}" } - {GoToSource 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "{disasm_pt_commands}" } + {GoToDisassembly 1 1 "" Null 0 0 0 0 0 0 0 Glasses "go_to_disassembly" "Go To Disassembly" "Goes to the disassembly, if any, for a given source code line." "code,source,disassembly,disasm" "{text_pt_commands}" } + {GoToSource 1 1 "" Null 0 0 0 0 0 0 0 FileOutline "go_to_source" "Go To Source" "Goes to the source code, if any, for a given disassembly line." "code,source,disassembly,disasm" "{disasm_pt_commands}" } //- rjf: override file links - {SetFileReplacementPath 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } + {SetFileReplacementPath 0 0 "" Null 0 0 0 0 0 0 0 Null "set_file_replacement_path" "Set File Replacement Path" "Sets the path which should be used as the replacement for the passed file." "" "" } //- rjf: setting config paths - {NewUser 1 1 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } - {NewProject 1 1 "" Null null Nil Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } - {OpenUser 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } - {OpenProject 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } - {OpenRecentProject 1 1 "query:recent_projects" Cfg null RecentProject Null 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } - {SaveUser 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } - {SaveProject 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } - {RecordUserAsLastOpened 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } - {RecordProjectInUser 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } + {NewUser 1 1 "" Null 1 0 0 0 0 1 0 Add "new_user" "New User" "Creates a new user file, and sets the current user path as that file's path." "new,user,project,layout" "" } + {NewProject 1 1 "" Null 1 0 0 0 0 1 0 Add "new_project" "New Project" "Creates a new project file, and sets the current project path as that file's path." "new,user,project,layout" "" } + {OpenUser 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Person "open_user" "Open User" "Opens a user file path, immediately loading it, and begins autosaving to it." "load,user,project,layout" "" } + {OpenProject 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Briefcase "open_project" "Open Project" "Opens a project file path, immediately loading it, and begins autosaving to it." "project,project,session" "" } + {OpenRecentProject 1 1 "query:recent_projects" Cfg 0 0 0 0 0 1 1 Briefcase "open_recent_project" "Open Recent Project" "Opens a recently used project file." "project,project,session" "" } + {SaveUser 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Save "save_user" "Save User" "Saves user data to a file, and sets the current user path as that path." "load,user,project,layout" "" } + {SaveProject 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Save "save_project" "Save Project" "Saves project data to a file, and sets the current project path as that path." "project,project,session" "" } + {RecordUserAsLastOpened 0 0 "" Null 0 0 0 0 0 0 0 Null "record_user_as_last_opened" "Record User As Last Opened" "Records a file path as the last opened user." "" "" } + {RecordProjectInUser 0 0 "" Null 0 0 0 0 0 0 0 Null "record_project_in_user" "Records Project In User" "Records a file path as a recent project in user data." "" "" } //- rjf: writing config changes - {WriteUserData 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } - {WriteProjectData 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } + {WriteUserData 0 1 "" Null 0 0 0 0 0 0 0 Null "write_user_data" "Write User Data" "Writes user data to the active user file." "" "" } + {WriteProjectData 0 1 "" Null 0 0 0 0 0 0 0 Null "write_project_data" "Write Project Data" "Writes project data to the active project file." "" "" } //- rjf: opening user/project settings - {UserSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } - {ProjectSettings 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } + {UserSettings 1 1 "" Null 0 0 0 0 0 0 0 Gear "user_settings" "User Settings" "Opens user settings." "" "" } + {ProjectSettings 1 1 "" Null 0 0 0 0 0 0 0 Gear "project_settings" "Project Settings" "Opens project settings." "" "" } //- rjf: meta controls - {Edit 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } - {Accept 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } - {Cancel 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } - {FocusMenu 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } + {Edit 1 1 "" Null 0 0 0 0 0 0 0 Pencil "edit" "Edit" "Edits the current selection." "" "" } + {Accept 1 1 "" Null 0 0 0 0 0 0 0 CheckFilled "accept" "Accept" "Accepts current changes, or answers prompts in the affirmative." "" "" } + {Cancel 1 1 "" Null 0 0 0 0 0 0 0 X "cancel" "Cancel" "Rejects current changes, exits temporary menus, or answers prompts in the negative." "" "" } + {FocusMenu 1 1 "" Null 0 0 0 0 0 0 0 List "focus_menu" "Focus Menu" "Focuses the menu for the selected interface, if there is one." "" "" } //- rjf: directional movement & text controls - {MoveLeft 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } - {MoveRight 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } - {MoveUp 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } - {MoveDown 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } - {MoveLeftSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } - {MoveRightSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } - {MoveUpSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } - {MoveDownSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } - {MoveLeftChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPage 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } - {MoveDownPage 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } - {MoveUpWhole 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } - {MoveDownWhole 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } - {MoveLeftChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } - {MoveRightChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } - {MoveUpChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } - {MoveDownChunkSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } - {MoveUpPageSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } - {MoveDownPageSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } - {MoveUpWholeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } - {MoveDownWholeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } - {MoveUpReorder 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } - {MoveDownReorder 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } - {MoveHome 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } - {MoveEnd 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } - {MoveHomeSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } - {MoveEndSelect 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } - {SelectAll 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } - {DeleteSingle 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } - {DeleteChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } - {BackspaceSingle 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } - {BackspaceChunk 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } - {Copy 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "{text_range_commands}{disasm_range_commands}" } - {Cut 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } - {Paste 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } - {InsertText 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } + {MoveLeft 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left" "Move Left" "Moves the cursor or selection left." "" "" } + {MoveRight 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right" "Move Right" "Moves the cursor or selection right." "" "" } + {MoveUp 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up" "Move Up" "Moves the cursor or selection up." "" "" } + {MoveDown 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down" "Move Down" "Moves the cursor or selection down." "" "" } + {MoveLeftSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_select" "Move Left Select" "Moves the cursor or selection left, while selecting." "" "" } + {MoveRightSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_select" "Move Right Select" "Moves the cursor or selection right, while selecting." "" "" } + {MoveUpSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_select" "Move Up Select" "Moves the cursor or selection up, while selecting." "" "" } + {MoveDownSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_select" "Move Down Select" "Moves the cursor or selection down, while selecting." "" "" } + {MoveLeftChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_chunk" "Move Left Chunk" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_chunk" "Move Right Chunk" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_chunk" "Move Up Chunk" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_chunk" "Move Down Chunk" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPage 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_page" "Move Up Page" "Moves the cursor or selection up one page." "" "" } + {MoveDownPage 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_page" "Move Down Page" "Moves the cursor or selection down one page." "" "" } + {MoveUpWhole 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_whole" "Move Up Whole" "Moves the cursor or selection to the beginning of the relevant content." "" "" } + {MoveDownWhole 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_whole" "Move Down Whole" "Moves the cursor or selection to the end of the relevant content." "" "" } + {MoveLeftChunkSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_left_chunk_select" "Move Left Chunk Select" "Moves the cursor or selection left one chunk." "" "" } + {MoveRightChunkSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_right_chunk_select" "Move Right Chunk Select" "Moves the cursor or selection right one chunk." "" "" } + {MoveUpChunkSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_chunk_select" "Move Up Chunk Select" "Moves the cursor or selection up one chunk." "" "" } + {MoveDownChunkSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_chunk_select" "Move Down Chunk Select" "Moves the cursor or selection down one chunk." "" "" } + {MoveUpPageSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_page_select" "Move Up Page Select" "Moves the cursor or selection up one page, while selecting." "" "" } + {MoveDownPageSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_page_select" "Move Down Page Select" "Moves the cursor or selection down one page, while selecting." "" "" } + {MoveUpWholeSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_whole_select" "Move Up Whole Select" "Moves the cursor or selection to the beginning of the relevant content, while selecting." "" "" } + {MoveDownWholeSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_whole_select" "Move Down Whole Select" "Moves the cursor or selection to the end of the relevant content, while selecting." "" "" } + {MoveUpReorder 1 1 "" Null 0 0 0 0 0 0 0 Null "move_up_reorder" "Move Up Reorder" "Moves the cursor or selection up, while swapping the currently selected element with that upward." "" "" } + {MoveDownReorder 1 1 "" Null 0 0 0 0 0 0 0 Null "move_down_reorder" "Move Down Reorder" "Moves the cursor or selection down, while swapping the currently selected element with that downward." "" "" } + {MoveHome 1 1 "" Null 0 0 0 0 0 0 0 Null "move_home" "Move Home" "Moves the cursor to the beginning of the line." "" "" } + {MoveEnd 1 1 "" Null 0 0 0 0 0 0 0 Null "move_end" "Move End" "Moves the cursor to the end of the line." "" "" } + {MoveHomeSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_home_select" "Move Home Select" "Moves the cursor to the beginning of the line, while selecting." "" "" } + {MoveEndSelect 1 1 "" Null 0 0 0 0 0 0 0 Null "move_end_select" "Move End Select" "Moves the cursor to the end of the line, while selecting." "" "" } + {SelectAll 1 1 "" Null 0 0 0 0 0 0 0 Null "select_all" "Select All" "Selects everything possible." "" "" } + {DeleteSingle 1 1 "" Null 0 0 0 0 0 0 0 Null "delete_single" "Delete Single" "Deletes a single element to the right of the cursor, or the active selection." "" "" } + {DeleteChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "delete_chunk" "Delete Chunk" "Deletes a chunk to the right of the cursor, or the active selection." "" "" } + {BackspaceSingle 1 1 "" Null 0 0 0 0 0 0 0 Null "backspace_single" "Backspace Single" "Deletes a single element to the left of the cursor, or the active selection." "" "" } + {BackspaceChunk 1 1 "" Null 0 0 0 0 0 0 0 Null "backspace_chunk" "Backspace Chunk" "Deletes a chunk to the left of the cursor, or the active selection." "" "" } + {Copy 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "copy" "Copy" "Copies the active selection to the clipboard." "" "{text_range_commands}{disasm_range_commands}" } + {Cut 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "cut" "Cut" "Copies the active selection to the clipboard, then deletes it." "" "" } + {Paste 1 1 "" Null 0 0 0 0 0 0 0 Clipboard "paste" "Paste" "Pastes the current contents of the clipboard." "" "" } + {InsertText 0 1 "" Null 0 0 0 0 0 0 0 Null "insert_text" "Insert Text" "Inserts the text that was used to cause this command." "" "" } //- rjf: directionless navigation - {MoveNext 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } - {MovePrev 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } + {MoveNext 1 1 "" Null 0 0 0 0 0 0 0 Null "move_next" "Move Next" "Moves the cursor or selection to the next element." "" "" } + {MovePrev 1 1 "" Null 0 0 0 0 0 0 0 Null "move_prev" "Move Previous" "Moves the cursor or selection to the previous element." "" "" } //- rjf: code navigation - {GoToLine 1 1 "" Cursor null Nil Null 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } - {GoToAddress 1 1 "" Vaddr null Nil Null 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } - {CenterCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } - {ContainCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } - {FindNext 1 1 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } - {FindPrev 1 1 "" Null null Nil Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } + {GoToLine 1 1 "" Cursor 0 0 0 0 1 0 1 Null "goto_line" "Go To Line" "Jumps to a line number in the current code file." "" "" } + {GoToAddress 1 1 "" Vaddr 0 0 0 0 1 0 1 Null "goto_address" "Go To Address" "Jumps to an address in the current memory or disassembly view." "" "" } + {CenterCursor 1 1 "" Null 0 0 0 0 0 0 0 Null "center_cursor" "Center Cursor" "Snaps the current code view to center the cursor." "" "" } + {ContainCursor 1 1 "" Null 0 0 0 0 0 0 0 Null "contain_cursor" "Contain Cursor" "Snaps the current code view to contain the cursor." "" "" } + {FindNext 1 1 "" Null 0 0 1 0 0 0 0 Find "find_next" "Find Next" "Searches the current code file forward (from the cursor) for the last searched string." "" "" } + {FindPrev 1 1 "" Null 0 0 1 0 0 0 0 Find "find_prev" "Find Previous" "Searches the current code file backwards (from the cursor) for the last searched string." "" "" } //- rjf: thread finding - {FindThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } - {FindSelectedThread 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "{text_pt_commands}{text_range_commands}{disasm_pt_commands}{disasm_range_commands}" } + {FindThread 1 1 "query:threads" Thread 0 0 0 0 0 1 1 Find "find_thread" "Find Thread" "Jumps to the passed thread in either source code, disassembly, or both if they're already open." "" "" } + {FindSelectedThread 1 1 "" Null 0 0 0 0 0 0 0 Find "find_selected_thread" "Find Selected Thread" "Jumps to the selected thread in either source code, disassembly, or both if they're already open." "current,instruction" "{text_pt_commands}{text_range_commands}{disasm_pt_commands}{disasm_range_commands}" } //- rjf: name finding - {GoToName 1 1 "query:procedures" String symbol_lister Nil Null 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } - {GoToNameAtCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "{text_pt_commands}{disasm_pt_commands}" } + {GoToName 1 1 "query:procedures" String 0 0 0 0 1 1 1 Null "goto_name" "Go To Name" "Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible." "" "" } + {GoToNameAtCursor 1 1 "" Null 0 0 0 0 0 0 0 Null "goto_name_at_cursor" "Go To Name At Cursor" "Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible." "" "{text_pt_commands}{disasm_pt_commands}" } //- rjf: watch expressions - {ToggleWatchExpression 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "" } - {ToggleWatchExpressionAtCursor 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "{text_pt_commands}{disasm_pt_commands}" } - {ToggleWatchExpressionAtMouse 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } + {ToggleWatchExpression 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr" "Toggle Watch Expression" "Adds or removes an expression to an opened watch view." "" "" } + {ToggleWatchExpressionAtCursor 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_cursor" "Toggle Watch Expression At Cursor" "Adds or removes the expression that the cursor or selection is currently over to an opened watch view." "" "{text_pt_commands}{disasm_pt_commands}" } + {ToggleWatchExpressionAtMouse 1 1 "" Null 0 0 0 0 0 0 0 Binoculars "toggle_watch_expr_at_mouse" "Toggle Watch Expression At Mouse" "Adds or removes the expression that the mouse is currently over to an opened watch view." "" "" } //- rjf: general config operations - {EnableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } - {DisableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } - {SelectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } - {DeselectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } - {RemoveCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } - {NameCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } - {ConditionCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } - {DuplicateCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } - {RelocateCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } - {SaveToProject 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } + {EnableCfg 0 0 "" Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable" "Enables a config tree." "" "" } + {DisableCfg 0 0 "" Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable" "Disables a config tree." "" "" } + {SelectCfg 0 0 "" Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select" "Selects a config tree, disabling all others of the same kind." "" "" } + {DeselectCfg 0 0 "" Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect" "Deselects a config tree." "" "" } + {RemoveCfg 0 0 "" Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove" "Removes a config tree." "" "" } + {NameCfg 0 0 "" Null 0 0 0 0 0 0 0 Null "name_cfg" "Name" "Equips a config tree with a label." "" "" } + {ConditionCfg 0 0 "" Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition" "Equips a config tree with a condition string." "" "" } + {DuplicateCfg 0 0 "" Null 0 0 0 0 0 0 0 Duplicate "duplicate_cfg" "Duplicate" "Duplicates a config tree." "" "" } + {RelocateCfg 0 0 "" Null 0 0 0 0 0 0 0 Null "relocate_cfg" "Relocate" "Relocates a config tree." "" "" } + {SaveToProject 0 0 "" Null 0 0 0 0 0 0 0 Briefcase "save_cfg_to_project" "Save To Project" "Saves the config tree to the project." "" "" } //- rjf: breakpoints - {AddBreakpoint 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } - {AddAddressBreakpoint 1 0 "" Expr null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "" } - {AddFunctionBreakpoint 1 0 "query:procedures" String null Nil Null 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "" } - {ToggleBreakpoint 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "{text_pt_commands}{disasm_pt_commands}" } - {RemoveBreakpoint 1 0 "query:breakpoints" Cfg null Nil Null 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "" } - {EnableBreakpoint 1 1 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } - {DisableBreakpoint 1 1 "query:breakpoints" Cfg null Breakpoint Null 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } - {ClearBreakpoints 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } + {AddBreakpoint 1 1 "" Null 0 0 0 0 0 0 0 CircleFilled "add_breakpoint" "Add Line Breakpoint" "Places a breakpoint at a given location (file path and line number, address, or symbol name)." "" "" } + {AddAddressBreakpoint 1 0 "" Expr 0 0 0 0 1 1 1 CircleFilled "add_address_breakpoint" "Add Address Breakpoint" "Places a breakpoint on the specified address." "" "" } + {AddFunctionBreakpoint 1 0 "query:procedures" String 0 0 0 0 1 1 1 CircleFilled "add_function_breakpoint" "Add Function Breakpoint" "Places a breakpoint on the first address of the specified function." "" "" } + {ToggleBreakpoint 1 1 "" Null 0 0 0 0 0 0 0 CircleFilled "toggle_breakpoint" "Toggle Line Breakpoint" "Places or removes a breakpoint at a given location (file path and line number, address, or symbol name)." "" "{text_pt_commands}{disasm_pt_commands}" } + {RemoveBreakpoint 1 0 "query:breakpoints" Cfg 0 0 0 0 1 1 1 Trash "remove_breakpoint" "Remove Breakpoint" "Removes an existing breakpoint." "delete" "" } + {EnableBreakpoint 1 1 "query:breakpoints" Cfg 0 0 0 0 1 1 1 CheckFilled "enable_breakpoint" "Enable Breakpoint" "Enables a breakpoint." "" "" } + {DisableBreakpoint 1 1 "query:breakpoints" Cfg 0 0 0 0 1 1 1 CheckHollow "disable_breakpoint" "Disable Breakpoint" "Disables a breakpoint." "" "" } + {ClearBreakpoints 1 1 "" Null 0 0 0 0 0 0 0 Trash "clear_breakpoints" "Clear Breakpoints" "Removes all breakpoints." "" "" } //- rjf: output - {ClearOutput 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } + {ClearOutput 1 1 "" Null 0 0 0 0 0 0 0 Null "clear_output" "Clear Output" "Clears all output." "" "" } //- rjf: watch pins - {AddWatchPin 1 1 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "" } - {ToggleWatchPin 1 0 "" Expr null Nil Null 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } + {AddWatchPin 1 1 "" Expr 0 0 0 0 1 1 1 Pin "add_watch_pin" "Add Watch Pin" "Places a watch pin at a given location (file path and line number or address)." "" "" } + {ToggleWatchPin 1 0 "" Expr 0 0 0 0 1 1 1 Pin "toggle_watch_pin" "Toggle Watch Pin" "Places or removes a watch pin at a given location (file path and line number or address)." "" "" } //- rjf: debug infos - {LoadDebugInfo 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "" } - {UnloadDebugInfo 1 1 "query:debug_infos" Cfg null Nil Null 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "" } + {LoadDebugInfo 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Module "load_debug_info" "Load Debug Info" "Loads a debug info file." "" "" } + {UnloadDebugInfo 1 1 "query:debug_infos" Cfg 0 0 0 0 1 1 1 Module "unload_debug_info" "Unload Debug Info" "Unloads a debug info file." "" "" } //- rjf: type views - {AddTypeView 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } + {AddTypeView 0 0 "" String 0 0 0 0 0 0 0 Binoculars "add_type_view" "Add Type View" "Adds a new type view." "" "" } //- rjf: file path maps - {AddFilePathMap 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } + {AddFilePathMap 0 0 "" Null 0 0 0 0 0 0 0 FileOutline "add_file_path_map" "Add File Path Map" "Adds a new file path map." "" "" } //- rjf: themes - {EditUserTheme 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } - {EditProjectTheme 0 0 "query:themes" String null Nil Null 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } - {AddThemeColor 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } - {ForkTheme 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } - {SaveTheme 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } - {SaveAndSetTheme 0 0 "" String null Nil Null 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } + {EditUserTheme 0 0 "query:themes" String 0 0 0 0 0 0 0 Palette "edit_user_theme" "Edit User Theme" "Edits the current user's theme." "color" "" } + {EditProjectTheme 0 0 "query:themes" String 0 0 0 0 0 0 0 Palette "edit_project_theme" "Edit Project Theme" "Edits the current project's theme." "color" "" } + {AddThemeColor 0 0 "" Null 0 0 0 0 0 0 0 Palette "add_theme_color" "Add Theme Color" "Adds a new theme color." "" "" } + {ForkTheme 0 0 "" Null 0 0 0 0 0 0 0 Palette "fork_theme" "Fork Theme" "Imports all colors from the current theme so they can be individually edited." "" "" } + {SaveTheme 0 0 "" String 1 0 0 0 0 1 1 Save "save_theme" "Save Theme" "Saves all theme colors to a new theme file." "" "" } + {SaveAndSetTheme 0 0 "" String 1 0 0 0 0 1 1 Save "save_and_set_theme" "Save And Set Theme" "Saves all theme colors to a new theme file, and then sets that theme as the selected theme." "" "" } //- rjf: line operations - {SetNextStatement 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "{text_pt_commands}{disasm_pt_commands}" } + {SetNextStatement 1 1 "" Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "{text_pt_commands}{disasm_pt_commands}" } //- rjf: targets - {AddTarget 1 1 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "" } - {SelectTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } - {EnableTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } - {DisableTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } - {RemoveTarget 1 1 "query:targets" Cfg null Target Null 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } + {AddTarget 1 1 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 Target "add_target" "Add Target" "Adds a new target." "application,executable,debug" "" } + {SelectTarget 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 Target "select_target" "Select Target" "Selects a target." "" "" } + {EnableTarget 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 CheckFilled "enable_target" "Enable Target" "Enables a target, in addition to all targets currently enabled." "" "" } + {DisableTarget 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 CheckHollow "disable_target" "Disable Target" "Disables a target." "" "" } + {RemoveTarget 1 1 "query:targets" Cfg 0 0 0 0 0 1 1 Trash "remove_target" "Remove Target" "Removes a target." "delete" "" } //- rjf: attaching - {RegisterAsJITDebugger 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } + {RegisterAsJITDebugger 1 1 "" Null 0 0 0 0 0 0 0 Null "register_as_jit_debugger" "Register As Just-In-Time (JIT) Debugger" "Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system." "" "" } //- rjf: snap-to-code-location - {FindCodeLocation 0 1 "" FilePath null Nil Null 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } + {FindCodeLocation 0 1 "" FilePath 0 0 0 0 0 1 1 FileOutline "find_code_location" "Find Code Location" "Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary." "" "" } //- rjf: snap-to-memory-location - {GoToMemory 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "{memory_eval_commands}" } + {GoToMemory 0 1 "" Expr 0 0 0 0 1 1 0 Grid "go_to_memory" "Go To Memory" "Finds the specified expression in the memory view. Opens the memory view if necessary." "" "{memory_eval_commands}" } //- rjf: break-when-value-changes - {BreakWhenValueChanges 0 1 "" Expr null Nil Null 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "{memory_eval_commands}" } + {BreakWhenValueChanges 0 1 "" Expr 0 0 0 0 1 1 0 CircleFilled "break_when_value_changes" "Break When Value Changes" "Adds a new write data breakpoint for this variable's range." "" "{memory_eval_commands}" } //- rjf: searching - {Search 1 1 "" String null Nil Null 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } - {SearchBackwards 1 1 "" String null Nil Null 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } + {Search 1 1 "" String 0 0 1 1 1 0 1 Find "search" "Search" "Begins searching within the active interface." "sort,search,filter,find" "" } + {SearchBackwards 1 1 "" String 0 0 1 1 1 0 1 Find "search_backwards" "Search Backwards" "Begins searching backwards within the active interface." "sort,search,filter,find" "" } //- rjf: queries - {PickFile 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } - {PickFolder 0 0 `folder:\\"$input\\"` FilePath null Nil Null 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } - {PickFileOrFolder 0 0 `folder:\\"$input\\"` FilePath null Nil Null 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } + {PickFile 0 0 `folder:\\"$input\\"` FilePath 1 0 0 0 0 1 1 FileOutline "pick_file" "Pick File" "Opens the file browser to pick a file." "" "" } + {PickFolder 0 0 `folder:\\"$input\\"` FilePath 0 1 0 0 0 1 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" "" } + {PickFileOrFolder 0 0 `folder:\\"$input\\"` FilePath 1 1 0 0 0 1 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" "" } //- rjf: query stack - {PushQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } - {CompleteQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } - {CancelQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } - {UpdateQuery 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } + {PushQuery 0 0 "" Null 0 0 0 0 0 0 0 Null "push_query" "Push Query" "Opens a new temporary query interface." "" "" } + {CompleteQuery 0 0 "" Null 0 0 0 0 0 0 0 Null "complete_query" "Complete Query" "Completes and closes a query." "" "" } + {CancelQuery 0 0 "" Null 0 0 0 0 0 0 0 Null "cancel_query" "Cancel Query" "Closes a query." "" "" } + {UpdateQuery 0 0 "" Null 0 0 0 0 0 0 0 Null "update_query" "Update Query" "Updates a query input." "" "" } //- rjf: event buffers - {OpenEventBuffer 0 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } - {CloseEventBuffer 0 1 "" Cfg null Nil Null 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } + {OpenEventBuffer 0 1 "" Null 0 0 0 0 0 0 0 Null "open_event_buffer" "Open Event Buffer" "Opens a new event buffer, to which debugger events will be written, for external processing." "" "" } + {CloseEventBuffer 0 1 "" Cfg 0 0 0 0 0 0 0 Null "close_event_buffer" "Close Event Buffer" "Closes an existing event buffer." "" "" } //- rjf: developer commands - {ToggleDevMenu 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } - {LogMarker 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } + {ToggleDevMenu 1 1 "" Null 0 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" "" } + {LogMarker 1 1 "" Null 0 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" "" } } @enum RD_CmdKind: @@ -1257,8 +1257,6 @@ RD_CmdTable: // | | | `RD_QueryFlags flags`; `RD_RegSlot slot`; `String8 expr`; - `String8 view_name`; - `D_EntityKind ctrl_entity_kind`; } @struct RD_CmdKindInfo: @@ -1275,9 +1273,9 @@ RD_CmdTable: // | | | { `{0}`, @expand(D_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.filter_tags)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.filter_tags)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)")}}```; @expand(RD_CmdTable, a) - ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.filter_tags)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)"), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), D_EntityKind_$(a.q_ctrl_ent_kind)}}```; + ```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.filter_tags)"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_expr)")}}```; @expand(RD_WatchTabFastPathTable, a) ```{ str8_lit_comp("$(a.name_lower)"), str8_lit_comp("Opens a $(a.display_name) tab."), {0}, str8_lit_comp("{tab_commands}"), RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs}```; @expand(RD_ViewTabFastPathTable, a) From f1dfe5f6c09c48a86109f3cabea7e969168aba9b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 11 Jun 2026 09:40:39 -0700 Subject: [PATCH 777/850] changelog notes --- CHANGELOG.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0df036ca..0206e008 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,56 @@ +# v0.9.27-alpha + +## Debugger Changes + +- Fixed an issue which would rarely cause steps to take a long time. +- Drastically improved memory usage of PDB -> RDI conversion for some + workloads, notably PDBs with many small compilation units. +- Added the ability to disambiguate symbol names by module name, debug info + name, or compilation unit name in expressions. This can be done using the + usual syntax, e.g. `my_module.dll!foo`, or `my_unit.obj!foo`. `:` can also be + used instead of `!`. +- Added the ability to redirect debug string output to any label on a + per-target basis. Those labels can then be evaluated in any watch window or + text visualizer. By default, all targets write to `output`, which is + automatically visualized by an `Output` tab. But if you want different + targets to route their debug output to different buffers, you can name the + buffers differently, and then view those in separate text views. +- Added a `Run To Name` command. +- Added an `Auto Load Last Project` setting, which will automatically load the + most recently loaded project on startup (the old behavior pre-0.9.26). This + setting is off by default. +- Added right-click menus for watch expressions, to easily find them in a + memory view, or to break when their value changes. +- Added preliminary support for symbol servers. First, the debugger can attempt + to download debug info for any module via the `Download Module Debug Info` + command (also accessible by right-clicking a module). Second, the debugger + can be configured to automatically do this for all modules which don't have + debug info via the `Auto Download Debug Info` setting. The local cache path + and server URLs used by the debugger for downloading symbols are parsed from + the `_NT_SYMBOL_PATH` environment variable. If that environment variable is + not configured, then it falls back to the defaults of `C:/SymbolCache` and + `https://msdl.microsoft.com/download/symbols`. +- Adjusted the default dark theme. +- Made several UI visual improvements. +- Fixed a few issues relating to offline symbol evaluation (evaluation of + symbols in debug info when not debugging); this was sometimes preventing + function listers (e.g. used in `Go To Name`) from working when not debugging. +- Fixed the debugger's snap-to-code-location rule when a `Disassembly` tab is + occupying the same panel as source code tabs. Previously, the debugger would + overly aggressively switch back to source code tabs. Now, it should respect + the preference of disassembly correctly. +- Improved the stability of the step-over-line operation. Our stepping + algorithm would sometimes cause spurious (and rarely, non-spurious) + access violation exceptions when a thread would try to execute at address + `0x38f`. This most regularly surfaced when an exception on one thread (like a + breakpoint being hit) would interrupt stepping on another thread. This has + been resolved, and stepping in such scenarios should be much more reliable. +- Fixed some crashes in the PDB -> RDI converter. (#792, #803) +- Fixed a bug which was sometimes causing a step-over operation to resume the + process without catching the target thread after its step completed. (#804) +- Adjusted evaluation visualizations to include fully qualified symbol names. + (#809) + # v0.9.26-alpha ## Debugger Changes From d45401e8cd4e7bddeee1617181e8d0b287115203 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 11 Jun 2026 10:28:39 -0700 Subject: [PATCH 778/850] pass over default light --- project.raddbg | 2 +- .../dwrite/font_provider_dwrite.c | 13 +- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 159 ++++++++---------- src/raddbg/raddbg_core.c | 2 +- 5 files changed, 82 insertions(+), 96 deletions(-) diff --git a/project.raddbg b/project.raddbg index 03f94c70..7570552c 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,13 +7,13 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 + enabled: 1 } target: { executable: "build/mule_main.exe" working_directory: build output_label: output_a - enabled: 1 } target: { diff --git a/src/font_provider/dwrite/font_provider_dwrite.c b/src/font_provider/dwrite/font_provider_dwrite.c index 7fbe50bf..75a725aa 100644 --- a/src/font_provider/dwrite/font_provider_dwrite.c +++ b/src/font_provider/dwrite/font_provider_dwrite.c @@ -163,6 +163,8 @@ fp_init(void) { ProfBeginFunction(); HRESULT error = 0; + F32 default_gamma = 1.5f; + F32 default_enhanced_contrast = 1.f; //- rjf: initialize main state { @@ -191,8 +193,9 @@ fp_init(void) //- rjf: make sharp-hinted rendering params { FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); - gamma = 1.f; FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); + gamma = default_gamma; + enhanced_contrast = default_enhanced_contrast; if(fp_dwrite_state->dwrite2_is_supported) { error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, @@ -220,8 +223,9 @@ fp_init(void) //- rjf: make sharp-unhinted rendering params { FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); - gamma = 1.f; FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); + gamma = default_gamma; + enhanced_contrast = default_enhanced_contrast; if(fp_dwrite_state->dwrite2_is_supported) { error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, @@ -249,8 +253,9 @@ fp_init(void) //- rjf: make smooth-hinted rendering params { FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params); - gamma = 1.f; FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params); + gamma = default_gamma; + enhanced_contrast = default_enhanced_contrast; if(fp_dwrite_state->dwrite2_is_supported) { error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory, @@ -277,7 +282,7 @@ fp_init(void) //- rjf: make smooth rendering params { - FLOAT gamma = 1.f; + FLOAT gamma = default_gamma; FLOAT enhanced_contrast = 0.f; if(fp_dwrite_state->dwrite2_is_supported) { diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index a9ed8988..314db20a 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -1125,7 +1125,7 @@ str8_lit_comp("far_manager"), String8 rd_theme_preset_cfg_string_table[11] = { str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x1f1f1fff}\n theme_color:{tags: \"alt background\", value: 0x222222ff}\n theme_color:{tags: \"pop background\", value: 0x675331ff}\n theme_color:{tags: \"fresh background\", value: 0x3d3631ff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x404040ff}\n theme_color:{tags: text, value: 0xe5e5e5ff}\n theme_color:{tags: \"weak text\", value: 0xa4a4a4ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xabdeffff}\n theme_color:{tags: \"focus overlay\", value: 0x2292eb14}\n theme_color:{tags: \"focus border\", value: 0x2392ebff}\n theme_color:{tags: cursor, value: 0x8aff00ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x16}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\n theme_color:{tags: \"good_pop border\", value: 0x568761ff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0xecececff}\n theme_color:{tags: code_symbol, value: 0xceaf64ff}\n theme_color:{tags: code_type, value: 0xceaf64ff}\n theme_color:{tags: code_local, value: 0xa7dae8ff}\n theme_color:{tags: code_register, value: 0xb7afd5ff}\n theme_color:{tags: code_keyword, value: 0x838b8fff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x838b8fff}\n theme_color:{tags: code_numeric, value: 0x9cb198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x6d8e67ff}\n theme_color:{tags: code_string, value: 0x9cb198ff}\n theme_color:{tags: code_meta, value: 0xb9819aff}\n theme_color:{tags: code_comment, value: 0x627b5eff}\n theme_color:{tags: line_info_0, value: 0x3c2d25ff}\n theme_color:{tags: line_info_1, value: 0x3c3925ff}\n theme_color:{tags: line_info_2, value: 0x2e4837ff}\n theme_color:{tags: line_info_3, value: 0x2e3d48ff}\n theme_color:{tags: line_info_4, value: 0x3c2d25ff}\n theme_color:{tags: line_info_5, value: 0x3c3925ff}\n theme_color:{tags: line_info_6, value: 0x2e4837ff}\n theme_color:{tags: line_info_7, value: 0x2e3d48ff}\n theme_color:{tags: thread_0, value: 0xebb624ff}\n theme_color:{tags: thread_1, value: 0x26d0d2ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x1b1b1baf}\n theme_color:{tags: \"floating background alt\", value: 0x0000005f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\n theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x333333ff}\n theme_color:{tags: \"tab border\", value: 0x2392ebff}\n theme_color:{tags: \"tab inactive background\", value: 0}\n theme_color:{tags: \"tab inactive border\", value: 0x42494eff}\n theme_color:{tags: \"tab auto background\", value: 0x3e4d6eff}\n theme_color:{tags: \"tab auto inactive background\", value: 0x3e4d6e39}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), -str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0xffffffff }\n theme_color:{ tags: \"alt background\" , value: 0xf8f8f8ff }\n theme_color:{ tags: \"pop background\" , value: 0xcbe4f2ff }\n theme_color:{ tags: \"menu_bar pop background\" , value: 0x5aabd9ff }\n theme_color:{ tags: \"fresh background\" , value: 0xeaddceff }\n theme_color:{ tags: \"match background\" , value: 0xc1e9c4ff }\n theme_color:{ tags: border , value: 0xcbcbcbff }\n theme_color:{ tags: text , value: 0xff }\n theme_color:{ tags: \"weak text\" , value: 0x727272ff }\n theme_color:{ tags: \"good text\" , value: 0x217538ff }\n theme_color:{ tags: \"neutral text\" , value: 0x1a5b7cff }\n theme_color:{ tags: \"bad text\" , value: 0x972717ff }\n theme_color:{ tags: hover , value: 0xff }\n theme_color:{ tags: \"focus overlay\" , value: 0x67ff4b }\n theme_color:{ tags: \"focus border\" , value: 0x67ffff }\n theme_color:{ tags: cursor , value: 0xff }\n theme_color:{ tags: selection , value: 0x283d5166 }\n theme_color:{ tags: \"inactive background\" , value: 0x8 }\n theme_color:{ tags: drop_shadow , value: 0xb }\n theme_color:{ tags: \"good_pop background\" , value: 0x90c09aff }\n theme_color:{ tags: \"good_pop border\" , value: 0x1e7231ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0xa93620ff }\n theme_color:{ tags: \"bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar bad_pop background\" , value: 0xff2a00ff }\n theme_color:{ tags: \"menu_bar bad_pop text\" , value: 0xffffffff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0x80808ff }\n theme_color:{ tags: code_symbol , value: 0x4ac3ff }\n theme_color:{ tags: code_type , value: 0xf46200ff }\n theme_color:{ tags: code_local , value: 0x317c00ff }\n theme_color:{ tags: code_register , value: 0x9a00ffff }\n theme_color:{ tags: code_keyword , value: 0xff0600ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x8a8a8aff }\n theme_color:{ tags: code_numeric , value: 0x7d49ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0xb56aff }\n theme_color:{ tags: code_string , value: 0x63549fff }\n theme_color:{ tags: code_meta , value: 0xd96759ff }\n theme_color:{ tags: code_comment , value: 0x717171ff }\n theme_color:{ tags: line_info_0 , value: 0xe6d5cdff }\n theme_color:{ tags: line_info_1 , value: 0xdbcfb2ff }\n theme_color:{ tags: line_info_2 , value: 0xddeac1ff }\n theme_color:{ tags: line_info_3 , value: 0xddc4bdff }\n theme_color:{ tags: line_info_4 , value: 0xba917eff }\n theme_color:{ tags: thread_0 , value: 0xffa700ff }\n theme_color:{ tags: thread_1 , value: 0xb41fff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xff2800ff }\n theme_color:{ tags: \"floating background\" , value: 0xffffffc7 }\n theme_color:{ tags: \"floating background alt\" , value: 0x23 }\n theme_color:{ tags: \"floating background fresh\" , value: 0xeaddceff }\n theme_color:{ tags: \"floating border\" , value: 0x88888884 }\n theme_color:{ tags: \"scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0xe9e9e9ff }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"menu_bar background\" , value: 0x2b6b9aff }\n theme_color:{ tags: \"menu_bar border\" , value: 0x4d }\n theme_color:{ tags: \"menu_bar text\" , value: 0xffffffff }\n theme_color:{ tags: \"menu_bar text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"good menu_bar text\" , value: 0x70db8dff }\n theme_color:{ tags: \"bad menu_bar text\" , value: 0xffa79bff }\n theme_color:{ tags: \"neutral menu_bar text\" , value: 0xc4dbe7ff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab text\" , value: 0xffffffff }\n theme_color:{ tags: \"tab text weak\" , value: 0xffffffff }\n theme_color:{ tags: \"tab background\" , value: 0xb67e48ff }\n theme_color:{ tags: \"tab border\" , value: 0x875b31ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0xcacacaff }\n theme_color:{ tags: \"tab inactive border\" , value: 0xb5b5b5ff }\n theme_color:{ tags: \"tab auto background\" , value: 0xc41c69ff }\n theme_color:{ tags: \"tab auto border\" , value: 0x981039ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x9b88a3ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x373737ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), +str8_lit_comp("theme:\n{\n theme_color:{tags: background , value: 0xf4f4f4ff}\n theme_color:{tags: \"alt background\" , value: 0xe7e7e7ff}\n theme_color:{tags: \"pop background\" , value: 0xe7b96bff}\n theme_color:{tags: \"fresh background\" , value: 0xe7d7d0ff}\n theme_color:{tags: \"match background\" , value: 0xcbd8deff}\n theme_color:{tags: border , value: 0xb9b9b9ff}\n theme_color:{tags: text , value: 0xff}\n theme_color:{tags: \"weak text\" , value: 0x4d4d4dff}\n theme_color:{tags: \"good text\" , value: 0x32a852ff}\n theme_color:{tags: \"neutral text\" , value: 0x3a90bbff}\n theme_color:{tags: \"bad text\" , value: 0xcf5242ff}\n theme_color:{tags: hover , value: 0xff}\n theme_color:{tags: \"focus overlay\" , value: 0x2192eb49}\n theme_color:{tags: \"focus border\" , value: 0x2392ebff}\n theme_color:{tags: cursor , value: 0xff}\n theme_color:{tags: selection , value: 0x2170be51}\n theme_color:{tags: \"inactive background\" , value: 0xb}\n theme_color:{tags: drop_shadow , value: 0x183d8a53}\n theme_color:{tags: \"good_pop background\" , value: 0x5c9368ff}\n theme_color:{tags: \"good_pop border\" , value: 0x6616ff}\n theme_color:{tags: \"good_pop hover\" , value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\" , value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\" , value: 0xbd5946ff}\n theme_color:{tags: \"bad_pop hover\" , value: 0xff825cff}\n theme_color:{tags: code_default , value: 0xff}\n theme_color:{tags: code_symbol , value: 0x976b00ff}\n theme_color:{tags: code_type , value: 0x976b00ff}\n theme_color:{tags: code_local , value: 0x7fa2ff}\n theme_color:{tags: code_register , value: 0x6a50caff}\n theme_color:{tags: code_keyword , value: 0x1f4253ff}\n theme_color:{tags: code_delimiter_or_operator , value: 0x424b4fff}\n theme_color:{tags: code_numeric , value: 0xb4500ff}\n theme_color:{tags: code_numeric_alt_digit_group , value: 0x3c852fff}\n theme_color:{tags: code_string , value: 0xb4500ff}\n theme_color:{tags: code_meta , value: 0xe3609aff}\n theme_color:{tags: code_comment , value: 0x648e5dff}\n theme_color:{tags: line_info_0 , value: 0xcdb3a5ff}\n theme_color:{tags: line_info_1 , value: 0xcac5a4ff}\n theme_color:{tags: line_info_2 , value: 0xafcebaff}\n theme_color:{tags: line_info_3 , value: 0xacc5d7ff}\n theme_color:{tags: line_info_4 , value: 0x3c2d25ff}\n theme_color:{tags: line_info_5 , value: 0x3c3925ff}\n theme_color:{tags: line_info_6 , value: 0x2e4837ff}\n theme_color:{tags: line_info_7 , value: 0x2e3d48ff}\n theme_color:{tags: thread_0 , value: 0xde8e2aff}\n theme_color:{tags: thread_1 , value: 0x7affff}\n theme_color:{tags: thread_unwound , value: 0xb2ccd8ff}\n theme_color:{tags: thread_error , value: 0xb23219ff}\n theme_color:{tags: breakpoint , value: 0xa72911ff}\n theme_color:{tags: \"floating background\" , value: 0xffffffff}\n theme_color:{tags: \"floating background alt\" , value: 0xefefefff}\n theme_color:{tags: \"floating background fresh\" , value: 0x31393d5f}\n theme_color:{tags: \"floating border\" , value: 0xaeaeaeff}\n theme_color:{tags: \"floating scroll_bar background\" , value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f}\n theme_color:{tags: \"scroll_bar background\" , value: 0xefefefff}\n theme_color:{tags: \"scroll_bar border\" , value: 0xb9b9b9ff}\n theme_color:{tags: \"implicit background\" , value: 0x00000000}\n theme_color:{tags: \"implicit border\" , value: 0x00000000}\n theme_color:{tags: \"hollow background\" , value: 0x00000000}\n theme_color:{tags: \"hollow border\" , value: 0x1f}\n theme_color:{tags: \"tab background\" , value: 0xffffffff}\n theme_color:{tags: \"tab border\" , value: 0x2392ebff}\n theme_color:{tags: \"tab inactive background\" , value: 0}\n theme_color:{tags: \"tab inactive border\" , value: 0x42494eff}\n theme_color:{tags: \"tab auto background\" , value: 0xb9d0ffff}\n theme_color:{tags: \"tab auto inactive background\" , value: 0xc4cde0ff}\n theme_color:{tags: \"drop_site background\" , value: 0xffffff05}\n theme_color:{tags: \"drop_site border\" , value: 0xffffff0f}\n theme_color:{tags: \"bad_pop weak text\" , value: 0xffffffff}\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{ tags: background , value: 0x1f1f1fff }\n theme_color:{ tags: \"alt background\" , value: 0x222222ff }\n theme_color:{ tags: \"pop background\" , value: 0x383167ff }\n theme_color:{ tags: \"fresh background\" , value: 0x31393dff }\n theme_color:{ tags: \"match background\" , value: 0x31393dff }\n theme_color:{ tags: border , value: 0x404040ff }\n theme_color:{ tags: text , value: 0xe5e5e5ff }\n theme_color:{ tags: \"weak text\" , value: 0xa4a4a4ff }\n theme_color:{ tags: \"good text\" , value: 0x32a852ff }\n theme_color:{ tags: \"neutral text\" , value: 0x3a90bbff }\n theme_color:{ tags: \"bad text\" , value: 0xcf5242ff }\n theme_color:{ tags: hover , value: 0xffffffff }\n theme_color:{ tags: \"focus overlay\" , value: 0x7160e81e }\n theme_color:{ tags: \"focus border\" , value: 0x7160e8ff }\n theme_color:{ tags: cursor , value: 0x8aff00ff }\n theme_color:{ tags: selection , value: 0x99ccff0f }\n theme_color:{ tags: \"inactive background\" , value: 0x0000002f }\n theme_color:{ tags: drop_shadow , value: 0x0000007f }\n theme_color:{ tags: \"good_pop background\" , value: 0x2c5b36ff }\n theme_color:{ tags: \"good_pop border\" , value: 0x568761ff }\n theme_color:{ tags: \"good_pop hover\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"good_pop weak text\" , value: 0xe3f5d3ff }\n theme_color:{ tags: \"bad_pop background\" , value: 0x803425ff }\n theme_color:{ tags: \"bad_pop hover\" , value: 0xff825cff }\n theme_color:{ tags: code_default , value: 0xe0e0e0ff }\n theme_color:{ tags: code_symbol , value: 0xdcdcaaff }\n theme_color:{ tags: code_type , value: 0x4ec9b0ff }\n theme_color:{ tags: code_local , value: 0x9cdcfeff }\n theme_color:{ tags: code_register , value: 0xb7afd5ff }\n theme_color:{ tags: code_keyword , value: 0x569cd6ff }\n theme_color:{ tags: code_delimiter_or_operator , value: 0x767676ff }\n theme_color:{ tags: code_numeric , value: 0xb5cea8ff }\n theme_color:{ tags: code_numeric_alt_digit_group , value: 0x7c986dff }\n theme_color:{ tags: code_string , value: 0xd69d85ff }\n theme_color:{ tags: code_meta , value: 0x9b9b9bff }\n theme_color:{ tags: code_comment , value: 0x51a644ff }\n theme_color:{ tags: line_info_0 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_1 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_2 , value: 0x434e2aff }\n theme_color:{ tags: line_info_3 , value: 0x36241fff }\n theme_color:{ tags: line_info_4 , value: 0x4f3022ff }\n theme_color:{ tags: line_info_5 , value: 0x4f3e15ff }\n theme_color:{ tags: line_info_6 , value: 0x434e2aff }\n theme_color:{ tags: line_info_7 , value: 0x36241fff }\n theme_color:{ tags: thread_0 , value: 0xffdc48ff }\n theme_color:{ tags: thread_1 , value: 0xb2ff65ff }\n theme_color:{ tags: thread_2 , value: 0xff99e5ff }\n theme_color:{ tags: thread_3 , value: 0x6598ffff }\n theme_color:{ tags: thread_4 , value: 0x65ffcbff }\n theme_color:{ tags: thread_5 , value: 0xff9819ff }\n theme_color:{ tags: thread_6 , value: 0x9932ffff }\n theme_color:{ tags: thread_7 , value: 0x65ff4cff }\n theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff }\n theme_color:{ tags: thread_error , value: 0xb23219ff }\n theme_color:{ tags: breakpoint , value: 0xa72911ff }\n theme_color:{ tags: \"floating background\" , value: 0x1b1b1baf }\n theme_color:{ tags: \"floating background alt\" , value: 0x0000005f }\n theme_color:{ tags: \"floating background fresh\" , value: 0x31393d5f }\n theme_color:{ tags: \"floating border\" , value: 0xbfbfbf1f }\n theme_color:{ tags: \"floating scroll_bar background\" , value: 0x3b3b3b5f }\n theme_color:{ tags: \"floating scroll_bar border\" , value: 0x5f5f5f5f }\n theme_color:{ tags: \"scroll_bar background\" , value: 0x2b2b2bff }\n theme_color:{ tags: \"scroll_bar border\" , value: 0x3f3f3fff }\n theme_color:{ tags: \"implicit background\" , value: 0x00000000 }\n theme_color:{ tags: \"implicit border\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow background\" , value: 0x00000000 }\n theme_color:{ tags: \"hollow border\" , value: 0xffffff1f }\n theme_color:{ tags: \"tab background\" , value: 0x333333ff }\n theme_color:{ tags: \"tab border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab inactive background\" , value: 0x171717ff }\n theme_color:{ tags: \"tab inactive border\" , value: 0x3e4c57ff }\n theme_color:{ tags: \"tab auto background\" , value: 0x3f386dff }\n theme_color:{ tags: \"tab auto border\" , value: 0x7160e8ff }\n theme_color:{ tags: \"tab auto inactive background\" , value: 0x2f2633ff }\n theme_color:{ tags: \"tab auto inactive border\" , value: 0x685073ff }\n theme_color:{ tags: \"drop_site background\" , value: 0xffffff05 }\n theme_color:{ tags: \"drop_site border\" , value: 0xffffff0f }\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0xffffffff}\n theme_color:{tags: \"alt background\", value: 0xefefefff}\n theme_color:{tags: \"pop background\", value: 0xe3eaf2ff}\n theme_color:{tags: \"fresh background\", value: 0xeccbbeff}\n theme_color:{tags: \"match background\", value: 0xedcbf9ff}\n theme_color:{tags: border, value: 0xe7e7e7ff}\n theme_color:{tags: text, value: 0xff}\n theme_color:{tags: \"weak text\", value: 0x353535ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xa7ffff}\n theme_color:{tags: \"focus overlay\", value: 0x8eff3f}\n theme_color:{tags: \"focus border\", value: 0x8effff}\n theme_color:{tags: cursor, value: 0xff}\n theme_color:{tags: selection, value: 0x56aaff77}\n theme_color:{tags: \"inactive background\", value: 0x17}\n theme_color:{tags: drop_shadow, value: 0xe7b27}\n theme_color:{tags: \"good_pop background\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop border\", value: 0x21a43dff}\n theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"good_pop text\", value: 0xe3f5d3ff}\n theme_color:{tags: \"bad_pop background\", value: 0xcb3f23ff}\n theme_color:{tags: \"bad_pop text\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop text weak\", value: 0xffcdc4ff}\n theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\n theme_color:{tags: code_default, value: 0x000000ff}\n theme_color:{tags: code_symbol, value: 0x74531fff}\n theme_color:{tags: code_type, value: 0x2b91afff}\n theme_color:{tags: code_local, value: 0x1f377fff}\n theme_color:{tags: code_register, value: 0x8a1bffff}\n theme_color:{tags: code_keyword, value: 0x0000ffff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\n theme_color:{tags: code_numeric, value: 0xff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x1d1d1dff}\n theme_color:{tags: code_string, value: 0xa61515ff}\n theme_color:{tags: code_meta, value: 0x808080ff}\n theme_color:{tags: code_comment, value: 0x008000ff}\n theme_color:{tags: line_info_0, value: 0xb5d9c8ff}\n theme_color:{tags: line_info_1, value: 0xa9c1d0ff}\n theme_color:{tags: line_info_2, value: 0x99abc5ff}\n theme_color:{tags: line_info_3, value: 0xc6bcd5ff}\n theme_color:{tags: thread_0, value: 0xffb141ff}\n theme_color:{tags: thread_1, value: 0x66c407ff}\n theme_color:{tags: thread_unwound, value: 0x67b3d7ff}\n theme_color:{tags: thread_error, value: 0xff2900ff}\n theme_color:{tags: breakpoint, value: 0xff2800ff}\n theme_color:{tags: \"floating background\", value: 0xffffffff}\n theme_color:{tags: \"floating background alt\", value: 0x11}\n theme_color:{tags: \"floating background fresh\", value: 0xa0c2d318}\n theme_color:{tags: \"floating border\", value: 0x50}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\n theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\n theme_color:{tags: \"menu_bar background\", value: 0xccd5f0ff}\n theme_color:{tags: \"menu_bar border\", value: 0xbabdc3ff}\n theme_color:{tags: \"scroll_bar background\", value: 0xe4e4e4ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0xf5cc84ff}\n theme_color:{tags: \"tab border\", value: 0xae7718ff}\n theme_color:{tags: \"tab inactive background\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab inactive text\", value: 0xffffffff}\n theme_color:{tags: \"tab inactive border\", value: 0x3b4f81ff}\n theme_color:{tags: \"tab auto background\", value: 0xe99595ff}\n theme_color:{tags: \"tab auto border\", value: 0xff6262ff}\n theme_color:{tags: \"tab auto inactive background\", value: 0xac6060ff}\n theme_color:{tags: \"tab auto inactive border\", value: 0xff6262ff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xa7ffff}\n}\n"), str8_lit_comp("theme:\n{\n theme_color:{tags: background, value: 0x002a35ff}\n theme_color:{tags: \"alt background\", value: 0x053542ff}\n theme_color:{tags: \"pop background\", value: 0x355b6eff}\n theme_color:{tags: \"fresh background\", value: 0x31393dff}\n theme_color:{tags: \"match background\", value: 0x31393dff}\n theme_color:{tags: border, value: 0x65166ff}\n theme_color:{tags: text, value: 0xeee8d5ff}\n theme_color:{tags: \"weak text\", value: 0x93a1a1ff}\n theme_color:{tags: \"good text\", value: 0x32a852ff}\n theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\n theme_color:{tags: \"bad text\", value: 0xcf5242ff}\n theme_color:{tags: hover, value: 0xca4b16ff}\n theme_color:{tags: \"focus overlay\", value: 0xca4b151f}\n theme_color:{tags: \"focus border\", value: 0xca4b16ff}\n theme_color:{tags: cursor, value: 0xca4b16ff}\n theme_color:{tags: selection, value: 0x99ccff0f}\n theme_color:{tags: \"inactive background\", value: 0x0000002f}\n theme_color:{tags: drop_shadow, value: 0x0000007f}\n theme_color:{tags: \"good_pop background\", value: 0x5f8700ff}\n theme_color:{tags: \"good_pop border\", value: 0x5f8700ff}\n theme_color:{tags: \"bad_pop background\", value: 0x810000ff}\n theme_color:{tags: code_default, value: 0x839496ff}\n theme_color:{tags: code_symbol, value: 0xb3880eff}\n theme_color:{tags: code_type, value: 0xb3880eff}\n theme_color:{tags: code_local, value: 0xeee8d5ff}\n theme_color:{tags: code_register, value: 0xeee8d5ff}\n theme_color:{tags: code_keyword, value: 0x849804ff}\n theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\n theme_color:{tags: code_numeric, value: 0x2aa198ff}\n theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\n theme_color:{tags: code_string, value: 0x2aa198ff}\n theme_color:{tags: code_meta, value: 0xca4b16ff}\n theme_color:{tags: code_comment, value: 0x586e75ff}\n theme_color:{tags: line_info_0, value: 0x4f3022ff}\n theme_color:{tags: line_info_1, value: 0x4f3e15ff}\n theme_color:{tags: line_info_2, value: 0x434e2aff}\n theme_color:{tags: line_info_3, value: 0x36241fff}\n theme_color:{tags: thread_0, value: 0xffcb7fff}\n theme_color:{tags: thread_1, value: 0xb2ff65ff}\n theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\n theme_color:{tags: thread_error, value: 0xb23219ff}\n theme_color:{tags: breakpoint, value: 0xa72911ff}\n theme_color:{tags: \"floating background\", value: 0x2a3574}\n theme_color:{tags: \"floating background alt\", value: 0x4f}\n theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\n theme_color:{tags: \"floating scroll_bar background\", value: 0x53542ff}\n theme_color:{tags: \"scroll_bar background\", value: 0x53542ff}\n theme_color:{tags: \"implicit background\", value: 0x00000000}\n theme_color:{tags: \"implicit border\", value: 0x00000000}\n theme_color:{tags: \"hollow background\", value: 0x00000000}\n theme_color:{tags: \"hollow border\", value: 0xffffff1f}\n theme_color:{tags: \"tab background\", value: 0x586e75ff}\n theme_color:{tags: \"tab border\", value: 0x90abb3ff}\n theme_color:{tags: \"tab inactive background\", value: 0x0}\n theme_color:{tags: \"tab inactive border\", value: 0x33494fff}\n theme_color:{tags: \"tab auto background\", value: 0x565ed2ff}\n theme_color:{tags: \"tab auto border\", value: 0xa2a6dfff}\n theme_color:{tags: \"tab auto inactive background\", value: 0}\n theme_color:{tags: \"tab auto inactive border\", value: 0x595fbcff}\n theme_color:{tags: \"drop_site background\", value: 0xffffff05}\n theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\n}\n"), diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index b1ba1b66..40196307 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1667,95 +1667,76 @@ RD_ThemePresetTable: { DefaultLight default_light "Default (Light)", ```theme: { - theme_color:{ tags: background , value: 0xffffffff } - theme_color:{ tags: "alt background" , value: 0xf8f8f8ff } - theme_color:{ tags: "pop background" , value: 0xcbe4f2ff } - theme_color:{ tags: "menu_bar pop background" , value: 0x5aabd9ff } - theme_color:{ tags: "fresh background" , value: 0xeaddceff } - theme_color:{ tags: "match background" , value: 0xc1e9c4ff } - theme_color:{ tags: border , value: 0xcbcbcbff } - theme_color:{ tags: text , value: 0xff } - theme_color:{ tags: "weak text" , value: 0x727272ff } - theme_color:{ tags: "good text" , value: 0x217538ff } - theme_color:{ tags: "neutral text" , value: 0x1a5b7cff } - theme_color:{ tags: "bad text" , value: 0x972717ff } - theme_color:{ tags: hover , value: 0xff } - theme_color:{ tags: "focus overlay" , value: 0x67ff4b } - theme_color:{ tags: "focus border" , value: 0x67ffff } - theme_color:{ tags: cursor , value: 0xff } - theme_color:{ tags: selection , value: 0x283d5166 } - theme_color:{ tags: "inactive background" , value: 0x8 } - theme_color:{ tags: drop_shadow , value: 0xb } - theme_color:{ tags: "good_pop background" , value: 0x90c09aff } - theme_color:{ tags: "good_pop border" , value: 0x1e7231ff } - theme_color:{ tags: "good_pop hover" , value: 0xe3f5d3ff } - theme_color:{ tags: "good_pop weak text" , value: 0xe3f5d3ff } - theme_color:{ tags: "good_pop text" , value: 0xe3f5d3ff } - theme_color:{ tags: "bad_pop background" , value: 0xa93620ff } - theme_color:{ tags: "bad_pop text" , value: 0xffffffff } - theme_color:{ tags: "bad_pop text weak" , value: 0xffffffff } - theme_color:{ tags: "menu_bar bad_pop background" , value: 0xff2a00ff } - theme_color:{ tags: "menu_bar bad_pop text" , value: 0xffffffff } - theme_color:{ tags: "bad_pop hover" , value: 0xff825cff } - theme_color:{ tags: code_default , value: 0x80808ff } - theme_color:{ tags: code_symbol , value: 0x4ac3ff } - theme_color:{ tags: code_type , value: 0xf46200ff } - theme_color:{ tags: code_local , value: 0x317c00ff } - theme_color:{ tags: code_register , value: 0x9a00ffff } - theme_color:{ tags: code_keyword , value: 0xff0600ff } - theme_color:{ tags: code_delimiter_or_operator , value: 0x8a8a8aff } - theme_color:{ tags: code_numeric , value: 0x7d49ff } - theme_color:{ tags: code_numeric_alt_digit_group , value: 0xb56aff } - theme_color:{ tags: code_string , value: 0x63549fff } - theme_color:{ tags: code_meta , value: 0xd96759ff } - theme_color:{ tags: code_comment , value: 0x717171ff } - theme_color:{ tags: line_info_0 , value: 0xe6d5cdff } - theme_color:{ tags: line_info_1 , value: 0xdbcfb2ff } - theme_color:{ tags: line_info_2 , value: 0xddeac1ff } - theme_color:{ tags: line_info_3 , value: 0xddc4bdff } - theme_color:{ tags: line_info_4 , value: 0xba917eff } - theme_color:{ tags: thread_0 , value: 0xffa700ff } - theme_color:{ tags: thread_1 , value: 0xb41fff } - theme_color:{ tags: thread_2 , value: 0xff99e5ff } - theme_color:{ tags: thread_3 , value: 0x6598ffff } - theme_color:{ tags: thread_4 , value: 0x65ffcbff } - theme_color:{ tags: thread_5 , value: 0xff9819ff } - theme_color:{ tags: thread_6 , value: 0x9932ffff } - theme_color:{ tags: thread_7 , value: 0x65ff4cff } - theme_color:{ tags: thread_unwound , value: 0xb2ccd8ff } - theme_color:{ tags: thread_error , value: 0xb23219ff } - theme_color:{ tags: breakpoint , value: 0xff2800ff } - theme_color:{ tags: "floating background" , value: 0xffffffc7 } - theme_color:{ tags: "floating background alt" , value: 0x23 } - theme_color:{ tags: "floating background fresh" , value: 0xeaddceff } - theme_color:{ tags: "floating border" , value: 0x88888884 } - theme_color:{ tags: "scroll_bar background" , value: 0xe9e9e9ff } - theme_color:{ tags: "scroll_bar border" , value: 0x5f5f5f5f } - theme_color:{ tags: "floating scroll_bar background" , value: 0xe9e9e9ff } - theme_color:{ tags: "floating scroll_bar border" , value: 0x5f5f5f5f } - theme_color:{ tags: "menu_bar background" , value: 0x2b6b9aff } - theme_color:{ tags: "menu_bar border" , value: 0x4d } - theme_color:{ tags: "menu_bar text" , value: 0xffffffff } - theme_color:{ tags: "menu_bar text weak" , value: 0xffffffff } - theme_color:{ tags: "good menu_bar text" , value: 0x70db8dff } - theme_color:{ tags: "bad menu_bar text" , value: 0xffa79bff } - theme_color:{ tags: "neutral menu_bar text" , value: 0xc4dbe7ff } - theme_color:{ tags: "implicit background" , value: 0x00000000 } - theme_color:{ tags: "implicit border" , value: 0x00000000 } - theme_color:{ tags: "hollow background" , value: 0x00000000 } - theme_color:{ tags: "hollow border" , value: 0xffffff1f } - theme_color:{ tags: "tab text" , value: 0xffffffff } - theme_color:{ tags: "tab text weak" , value: 0xffffffff } - theme_color:{ tags: "tab background" , value: 0xb67e48ff } - theme_color:{ tags: "tab border" , value: 0x875b31ff } - theme_color:{ tags: "tab inactive background" , value: 0xcacacaff } - theme_color:{ tags: "tab inactive border" , value: 0xb5b5b5ff } - theme_color:{ tags: "tab auto background" , value: 0xc41c69ff } - theme_color:{ tags: "tab auto border" , value: 0x981039ff } - theme_color:{ tags: "tab auto inactive background" , value: 0x9b88a3ff } - theme_color:{ tags: "tab auto inactive border" , value: 0x373737ff } - theme_color:{ tags: "drop_site background" , value: 0xffffff05 } - theme_color:{ tags: "drop_site border" , value: 0xffffff0f } + theme_color:{tags: background , value: 0xf4f4f4ff} + theme_color:{tags: "alt background" , value: 0xe7e7e7ff} + theme_color:{tags: "pop background" , value: 0xe7b96bff} + theme_color:{tags: "fresh background" , value: 0xe7d7d0ff} + theme_color:{tags: "match background" , value: 0xcbd8deff} + theme_color:{tags: border , value: 0xb9b9b9ff} + theme_color:{tags: text , value: 0xff} + theme_color:{tags: "weak text" , value: 0x4d4d4dff} + theme_color:{tags: "good text" , value: 0x32a852ff} + theme_color:{tags: "neutral text" , value: 0x3a90bbff} + theme_color:{tags: "bad text" , value: 0xcf5242ff} + theme_color:{tags: hover , value: 0xff} + theme_color:{tags: "focus overlay" , value: 0x2192eb49} + theme_color:{tags: "focus border" , value: 0x2392ebff} + theme_color:{tags: cursor , value: 0xff} + theme_color:{tags: selection , value: 0x2170be51} + theme_color:{tags: "inactive background" , value: 0xb} + theme_color:{tags: drop_shadow , value: 0x183d8a53} + theme_color:{tags: "good_pop background" , value: 0x5c9368ff} + theme_color:{tags: "good_pop border" , value: 0x6616ff} + theme_color:{tags: "good_pop hover" , value: 0xe3f5d3ff} + theme_color:{tags: "good_pop weak text" , value: 0xe3f5d3ff} + theme_color:{tags: "bad_pop background" , value: 0xbd5946ff} + theme_color:{tags: "bad_pop hover" , value: 0xff825cff} + theme_color:{tags: code_default , value: 0xff} + theme_color:{tags: code_symbol , value: 0x976b00ff} + theme_color:{tags: code_type , value: 0x976b00ff} + theme_color:{tags: code_local , value: 0x7fa2ff} + theme_color:{tags: code_register , value: 0x6a50caff} + theme_color:{tags: code_keyword , value: 0x1f4253ff} + theme_color:{tags: code_delimiter_or_operator , value: 0x424b4fff} + theme_color:{tags: code_numeric , value: 0xb4500ff} + theme_color:{tags: code_numeric_alt_digit_group , value: 0x3c852fff} + theme_color:{tags: code_string , value: 0xb4500ff} + theme_color:{tags: code_meta , value: 0xe3609aff} + theme_color:{tags: code_comment , value: 0x648e5dff} + theme_color:{tags: line_info_0 , value: 0xcdb3a5ff} + theme_color:{tags: line_info_1 , value: 0xcac5a4ff} + theme_color:{tags: line_info_2 , value: 0xafcebaff} + theme_color:{tags: line_info_3 , value: 0xacc5d7ff} + theme_color:{tags: line_info_4 , value: 0x3c2d25ff} + theme_color:{tags: line_info_5 , value: 0x3c3925ff} + theme_color:{tags: line_info_6 , value: 0x2e4837ff} + theme_color:{tags: line_info_7 , value: 0x2e3d48ff} + theme_color:{tags: thread_0 , value: 0xde8e2aff} + theme_color:{tags: thread_1 , value: 0x7affff} + theme_color:{tags: thread_unwound , value: 0xb2ccd8ff} + theme_color:{tags: thread_error , value: 0xb23219ff} + theme_color:{tags: breakpoint , value: 0xa72911ff} + theme_color:{tags: "floating background" , value: 0xffffffff} + theme_color:{tags: "floating background alt" , value: 0xefefefff} + theme_color:{tags: "floating background fresh" , value: 0x31393d5f} + theme_color:{tags: "floating border" , value: 0xaeaeaeff} + theme_color:{tags: "floating scroll_bar background" , value: 0x3b3b3b5f} + theme_color:{tags: "floating scroll_bar border" , value: 0x5f5f5f5f} + theme_color:{tags: "scroll_bar background" , value: 0xefefefff} + theme_color:{tags: "scroll_bar border" , value: 0xb9b9b9ff} + theme_color:{tags: "implicit background" , value: 0x00000000} + theme_color:{tags: "implicit border" , value: 0x00000000} + theme_color:{tags: "hollow background" , value: 0x00000000} + theme_color:{tags: "hollow border" , value: 0x1f} + theme_color:{tags: "tab background" , value: 0xffffffff} + theme_color:{tags: "tab border" , value: 0x2392ebff} + theme_color:{tags: "tab inactive background" , value: 0} + theme_color:{tags: "tab inactive border" , value: 0x42494eff} + theme_color:{tags: "tab auto background" , value: 0xb9d0ffff} + theme_color:{tags: "tab auto inactive background" , value: 0xc4cde0ff} + theme_color:{tags: "drop_site background" , value: 0xffffff05} + theme_color:{tags: "drop_site border" , value: 0xffffff0f} + theme_color:{tags: "bad_pop weak text" , value: 0xffffffff} } ``` } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 4b860b7a..83fd9357 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5780,7 +5780,7 @@ rd_window_frame(void) String8 thread_handle_string = d_string_from_handle(scratch.arena, ctrl_entity->handle); for(U64 idx = 0; idx < 16; idx += 1) { - E_Eval rip_eval = e_eval_from_stringf("query:control.%S.call_stack[%I64u]", thread_handle_string, idx); + E_Eval rip_eval = e_eval_from_stringf("query:control.%S.call_stack[%I64u].address", thread_handle_string, idx); if(rip_eval.irtree.mode != E_Mode_Value) { break; From 2c4882595c31942059c381b60fd88f15fbd17121 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 11 Jun 2026 11:10:28 -0700 Subject: [PATCH 779/850] eval system notes --- src/raddbg/raddbg_main.c | 68 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 690ddb7f..ee618f74 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -2,14 +2,77 @@ // Licensed under the MIT license (https://opensource.org/license/mit/) //////////////////////////////// -//~ rjf: post-0.9.26 TODO notes +//~ rjf: evaluation system pass TODO notes +// +// The first pass of the debugger's evaluation engine has some significant +// problems, and sooner rather than later we need to do a pass which addresses +// them. It's a complicated thing, so I am gathering unstructured notes & +// comments here: +// +// - coupling of some evaluation things to running on the UI thread - for some +// things we don't care, e.g. I don't care to evaluate theme colors literally +// anywhere except for the UI thread. but, for something like a thread's +// call stack, that should pretty unambiguously be accessible via the control +// thread (and thus in conditional breakpoints etc.). +// +// - whether something is available on the control thread or not, we should be +// able to *know* that from the UI thread, so that we can display it clearly. +// +// - there is an uncomfortable bifurcation between establishing evaluation +// context on the UI thread vs. the control thread. ideally, the common +// things (like debug entities) are just common, and there is ~0 extra code. +// +// - currently we lump all sorts of "context" things into the same mechanism. +// the problem is that a lot of this stuff needs to change *mid-expression*. +// for example: +// +// thread.call_stack[1].locals.foo + other_thread.call_stack[2].locals.bar +// +// this requires changing all sorts of things about the context for different +// portions of expression bytecode! currently, the only context that we +// support changing like this is the 'space'. but there is a lot more +// 'volatile context' than just the space. so I think instead of "set space" +// opcodes, we need (also, or to replace? unclear) a "set context" opcode. +// +// this is all completely distinct from "base context", or whatever we want +// to call it, which includes unchanging things, like the set of loaded debug +// infos, modules, etc. +// +// - we need to be able to disambiguate between *processes* too in expressions. +// we can *sort of do this* with addresses, now that we can do +// process.memory + 0x1000. but for example if we had a foo.dll in two +// processes, we can't disambiguate between the two in identifier resolution. +// we can currently do foo.dll!bar, but we'd need to be able to do +// `!foo.dll!bar` too or something. +// +// - there are ambiguous cases in the expression language that we need to shake +// out, notably because of type views. this is because "$" is overloaded. the +// idea was to make it a *chain* of parent expressions, but this seems to be +// confusing and/or not working in some cases - the example that found this +// was `array(...)` used inside of `rows(...)`, e.g. this: +// +// array(cast(char*)$.data, $.size) +// +// working, but this: +// +// rows($, array(cast(char*)$.data, $.size), some_other_member) +// +// not. +// +// - the expression parser, to support C-style syntax, needs identifier +// resolution. I took this out before, but that was a mistake, because people +// just need to be able to do `(foo)&bar` and have it work. to a dumb +// parser without identifier resolution, there is no way to disambiguate that +// from a bitwise &. but that is why we need identifier resolution. + +//////////////////////////////// +//~ rjf: post-0.9.27 TODO notes // // [ ] debug info loading retry mechanism, in cases where the load failed, but settings/filesystem state changes - // e.g. turn on automatic downloads, already tried to load symbol server cache file that doesn't exist -> // need to retry // [ ] wassim memory bug // -// [ ] symbol server // [ ] core dump saving/loading // // [ ] memory_size(...) view for quickly evaluating memory sizes @@ -281,6 +344,7 @@ // (repro via LOTS of code on one line & halting) // [x] unit / module name qualification // [x] step-out-of-loop +// [x] symbol server //////////////////////////////// //~ rjf: Build Options From 3452f2383983ea1b106d2c931955cd61d2cf833a Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 29 May 2026 22:04:20 -0700 Subject: [PATCH 780/850] add a new boot mode to RADLINK for launching as a type server checkpoint --- src/linker/codeview_ext/codeview.c | 17 +- src/linker/lnk_cmd_line.c | 4 +- src/linker/lnk_debug_info.c | 995 ++++++++++++++++++++++++----- src/linker/lnk_debug_info.h | 95 ++- src/linker/lnk_io.c | 1 + src/linker/lnk_obj.h | 40 +- 6 files changed, 946 insertions(+), 206 deletions(-) diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index dc1e7d88..6dc83333 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -1196,14 +1196,23 @@ cv_debug_t_get_leaf(CV_DebugT *debug_t, U64 leaf_idx) internal U64 cv_leaf_idx_from_ti(CV_DebugT *debug_t, CV_TypeIndexSource source, CV_TypeIndex ti) { - Assert(contains_1u64(debug_t->ti_ranges[source], ti)); // validate TI - Assert(!contains_1u64(debug_t->pch_ti_range[source], ti)); // no PCH indirection + // validate TI + Assert(contains_1u64(debug_t->ti_ranges[source], ti)); + + // no PCH indirection + Assert(!contains_1u64(debug_t->pch_ti_range[source], ti)); + U64 leaf_idx = ti; Assert(leaf_idx >= debug_t->ti_ranges[source].min); - leaf_idx -= debug_t->ti_ranges[source].min; // strip type index range + + // strip type index range + leaf_idx -= debug_t->ti_ranges[source].min; Assert(leaf_idx >= dim_1u64(debug_t->pch_ti_range[source])); - leaf_idx -= dim_1u64(debug_t->pch_ti_range[source]); // strip PCH indirection + + // strip PCH indirection + leaf_idx -= dim_1u64(debug_t->pch_ti_range[source]); leaf_idx += debug_t->source_offsets[source]; + Assert(leaf_idx < debug_t->count); return leaf_idx; } diff --git a/src/linker/lnk_cmd_line.c b/src/linker/lnk_cmd_line.c index 7e25ffa4..89c86bd2 100644 --- a/src/linker/lnk_cmd_line.c +++ b/src/linker/lnk_cmd_line.c @@ -12,7 +12,7 @@ lnk_arg_list_parse_windows_rules(Arena *arena, String8 string) U8 *opl = string.str + string.size; while (ptr < opl) { // skip white space and new lines - for (;;) { + while(ptr < opl) { U64 size = (U64)(opl - ptr); UnicodeDecode uni = utf8_decode(ptr, size); if (uni.codepoint != ' ' && uni.codepoint != '\n' && uni.codepoint != '\r') { @@ -21,7 +21,7 @@ lnk_arg_list_parse_windows_rules(Arena *arena, String8 string) ptr += uni.inc; } - if (*ptr == '\0') { + if (ptr >= opl || *ptr == '\0') { break; } diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 40fa31f8..cb9b8830 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -63,17 +63,12 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_h_task) U64 obj_idx = task_id; LNK_CodeViewInput *task = raw_task; - String8List sect_list = task->debug_h_list_arr[obj_idx]; - CV_DebugH *debug_h = &task->debug_h_arr [obj_idx]; + LNK_Obj *obj = task->obj_arr[obj_idx]; + if (obj->debug_h_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *sect_header = lnk_coff_section_header_from_section_number(obj, obj->debug_h_sect_idx + 1); - if (sect_list.node_count > 0) { - if (sect_list.node_count > 1) { - lnk_error_obj(LNK_Warning_GHash, task->obj_arr[obj_idx], - "obj contains multiple .debug$H sections; using first one"); - } - - // select first .debug$H - String8 raw_debug_h = sect_list.first->string; + String8 raw_debug_h = str8_substr(obj->data, r1u64(sect_header->foff, sect_header->foff + sect_header->fsize)); + CV_DebugH *debug_h = &task->debug_h_arr[obj_idx]; LLVM_GHash ghash = {0}; U64 ghash_read_size = str8_deserial_read_struct(raw_debug_h, 0, &ghash); @@ -122,9 +117,9 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_h_task) String8 hashes = str8_substr(raw_debug_h, r1u64(sizeof(ghash), raw_debug_h.size)); debug_h->count = hash_count; debug_h->v = (U64 *)hashes.str; - - exit:; } + + exit:; } internal @@ -175,79 +170,92 @@ THREAD_POOL_TASK_FUNC(lnk_read_type_servers_task) U64 ts_idx = task_id; LNK_TypeServer *ts = &task->ts_arr.v[ts_idx]; - // read PDB from disk - String8 msf_data = lnk_read_data_from_file_path(scratch.arena, task->config->io_flags, ts->ts_path); - - // check magic - if (!msf_check_magic_70(msf_data) && msf_check_magic_20(msf_data)) { goto exit; } - - // read the stream table - MSF_RawStreamTable *st = msf_raw_stream_table_from_data(scratch.arena, msf_data); - if (st == 0) { goto exit; } - - // PDB must have these streams - if (PDB_FixedStream_Tpi >= st->stream_count || PDB_FixedStream_Ipi >= st->stream_count || PDB_FixedStream_Info >= st->stream_count) { goto exit; } - - // read info stream - String8 info_data = msf_data_from_stream_number(scratch.arena, msf_data, st, PDB_FixedStream_Info); - PDB_InfoParse info_parse = {0}; - pdb_info_parse_from_data(info_data, &info_parse); - - // match GUID from obj against one in the type server - if (!MemoryMatchStruct(&info_parse.guid, &ts->ts_info.sig)) { - lnk_error(LNK_Warning_MismatchedTypeServerSignature, - "%S: signature mismatch in type server read from disk, expected %S, got %S", - ts->ts_info.name, - string_from_guid(scratch.arena, ts->ts_info.sig), - string_from_guid(scratch.arena, info_parse.guid)); - goto exit; - } - - MSF_StreamNumber type_streams[CV_TypeIndexSource_COUNT] = {0}; - type_streams[CV_TypeIndexSource_TPI] = PDB_FixedStream_Tpi; - type_streams[CV_TypeIndexSource_IPI] = PDB_FixedStream_Ipi; - - Rng1U64 ti_ranges [CV_TypeIndexSource_COUNT] = {0}; - Rng1U64 leaf_ranges[CV_TypeIndexSource_COUNT] = {0}; - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - MSF_StreamNumber sn = type_streams[ti_source]; - if (sn == 0) { continue; } - if (!pdb_extract_type_server_info(msf_data, st, sn, &ti_ranges[ti_source], &leaf_ranges[ti_source])) { goto exit; } - } - - // alloc buffer where TPI and IPI are adjecent - U64 buffer_size = 0; - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { buffer_size += dim_1u64(leaf_ranges[ti_source]); } - buffer_size = AlignPow2(buffer_size, 4) + ARENA_HEADER_SIZE; - U8 *buffer = push_array(arena, U8, buffer_size); - Arena *fixed = arena_alloc( .reserve_size = buffer_size, .commit_size = buffer_size, .optional_backing_buffer = buffer ); - - // read both streams into a contiguous buffer + String8 type_data_raw = {0}; String8 source_data_arr[CV_TypeIndexSource_COUNT] = {0}; - for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { - MSF_StreamNumber sn = type_streams[ti_source]; - if (sn == 0) { continue; } - source_data_arr[ti_source] = msf_data_from_stream_number_ex(fixed, msf_data, st, sn, leaf_ranges[ti_source], PDB_LEAF_ALIGN); - Assert(source_data_arr[ti_source].size == dim_1u64(leaf_ranges[ti_source])); + Rng1U64 ti_ranges [CV_TypeIndexSource_COUNT] = {0}; + + switch (ts->ts_kind) { + case LNK_TypeServerKind_Null: break; + case LNK_TypeServerKind_RRT: { + type_data_raw = ts->rrt->type_data_raw; + MemoryCopyArray(source_data_arr, ts->rrt->type_data); + MemoryCopyArray(ti_ranges, ts->rrt->ti_ranges); + } break; + case LNK_TypeServerKind_PDB: { + // read PDB from disk + String8 msf_data = lnk_read_data_from_file_path(scratch.arena, task->config->io_flags, ts->ts_path); + + // check magic + if (!msf_check_magic_70(msf_data) && msf_check_magic_20(msf_data)) { goto exit; } + + // read the stream table + MSF_RawStreamTable *st = msf_raw_stream_table_from_data(scratch.arena, msf_data); + if (st == 0) { goto exit; } + + // PDB must have these streams + if (PDB_FixedStream_Tpi >= st->stream_count || PDB_FixedStream_Ipi >= st->stream_count || PDB_FixedStream_Info >= st->stream_count) { goto exit; } + + // read info stream + String8 info_data = msf_data_from_stream_number(scratch.arena, msf_data, st, PDB_FixedStream_Info); + PDB_InfoParse info_parse = {0}; + pdb_info_parse_from_data(info_data, &info_parse); + + // match GUID from obj against one in the type server + if (!MemoryMatchStruct(&info_parse.guid, &ts->ts_info.sig)) { + lnk_error(LNK_Warning_MismatchedTypeServerSignature, + "%S: signature mismatch in type server read from disk, expected %S, got %S", + ts->ts_info.name, + string_from_guid(scratch.arena, ts->ts_info.sig), + string_from_guid(scratch.arena, info_parse.guid)); + goto exit; + } + + MSF_StreamNumber type_streams[CV_TypeIndexSource_COUNT] = {0}; + type_streams[CV_TypeIndexSource_TPI] = PDB_FixedStream_Tpi; + type_streams[CV_TypeIndexSource_IPI] = PDB_FixedStream_Ipi; + + Rng1U64 leaf_ranges[CV_TypeIndexSource_COUNT] = {0}; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + MSF_StreamNumber sn = type_streams[ti_source]; + if (sn == 0) { continue; } + if (!pdb_extract_type_server_info(msf_data, st, sn, &ti_ranges[ti_source], &leaf_ranges[ti_source])) { goto exit; } + } + + // alloc buffer where TPI and IPI are adjacent + U64 buffer_size = 0; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { buffer_size += dim_1u64(leaf_ranges[ti_source]); } + buffer_size = AlignPow2(buffer_size, 4) + ARENA_HEADER_SIZE; + U8 *buffer = push_array(arena, U8, buffer_size); + Arena *fixed = arena_alloc( .reserve_size = buffer_size, .commit_size = buffer_size, .optional_backing_buffer = buffer ); + + // read both streams into a contiguous buffer + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + MSF_StreamNumber sn = type_streams[ti_source]; + if (sn == 0) { continue; } + source_data_arr[ti_source] = msf_data_from_stream_number_ex(fixed, msf_data, st, sn, leaf_ranges[ti_source], PDB_LEAF_ALIGN); + Assert(source_data_arr[ti_source].size == dim_1u64(leaf_ranges[ti_source])); + } + // assert streams are adjacent in the buffer + for (U64 i = 1; i+1 < CV_TypeIndexSource_COUNT; i += 1) { AssertAlways(source_data_arr[i].str + source_data_arr[i].size == source_data_arr[i+1].str); } + type_data_raw = str8(buffer + ARENA_HEADER_SIZE, buffer_size - ARENA_HEADER_SIZE); + } break; + default: InvalidPath; break; } - // assert streams are adjecent in the buffer - for (U64 i = 1; i+1 < CV_TypeIndexSource_COUNT; i += 1) { AssertAlways(source_data_arr[i].str + source_data_arr[i].size == source_data_arr[i+1].str); } - String8 type_data = str8(buffer + ARENA_HEADER_SIZE, buffer_size - ARENA_HEADER_SIZE); // map type server to -> .debug$T U64 obj_idx = task->type_server_indices.v[task_id]; CV_DebugT *debug_t = &task->debug_t_arr[obj_idx]; // read types - CV_DebugT d = cv_debug_t_from_data(arena, type_data, PDB_LEAF_ALIGN); + CV_DebugT d = cv_debug_t_from_data(arena, type_data_raw, PDB_LEAF_ALIGN); - // @type_server .debug$T + // @type_server .debugtype_data debug_t->count = d.count; debug_t->data = d.data; debug_t->offsets = d.offsets; - for EachIndex(i, CV_TypeIndexSource_COUNT) { debug_t->ti_ranges[i] = ti_ranges[i]; } - for EachIndex(i, CV_TypeIndexSource_COUNT) { debug_t->ti_base[i] = IntFromPtr(source_data_arr[i].str - type_data.str); } - MemoryCopyTyped(debug_t->source_counts, d.source_counts, CV_TypeIndexSource_COUNT); + for EachIndex(i, CV_TypeIndexSource_COUNT) { debug_t->ti_ranges[i] = ti_ranges[i]; } + for EachIndex(i, CV_TypeIndexSource_COUNT) { debug_t->ti_base[i] = IntFromPtr(source_data_arr[i].str - type_data_raw.str); } + MemoryCopyTyped(debug_t->source_counts, d.source_counts, CV_TypeIndexSource_COUNT); MemoryCopyTyped(debug_t->source_offsets, d.source_counts, CV_TypeIndexSource_COUNT); u64_array_counts_to_offsets(CV_TypeIndexSource_COUNT, debug_t->source_offsets); @@ -267,44 +275,473 @@ THREAD_POOL_TASK_FUNC(lnk_read_type_servers_task) scratch_end(scratch); } +internal String8List +lnk_string_list_from_rrt(Arena *arena, LNK_RRT *rrt) +{ + ProfBeginFunction(); + + // pack obj file paths + String8 obj_paths = {0}; + { + U64 total_obj_file_path_size = 0; + for EachIndex(i, rrt->obj_count) { + total_obj_file_path_size += rrt->obj_paths.v[i].size + 1; + } + + U8 *file_paths_buffer = push_array_no_zero(arena, U8, total_obj_file_path_size); + U64 file_paths_cursor = 0; + for EachIndex(i, rrt->obj_count) { + MemoryCopyStr8(file_paths_buffer + file_paths_cursor, rrt->obj_paths.v[i]); + file_paths_cursor += rrt->obj_paths.v[i].size; + + file_paths_buffer[file_paths_cursor] = 0; + file_paths_cursor += 1; + } + Assert(file_paths_cursor == total_obj_file_path_size); + + obj_paths = str8(file_paths_buffer, file_paths_cursor); + } + + String8List rrt_data = {0}; + + // (1) magic + str8_list_push(arena, &rrt_data, g_rrt_magic); + + // (2) version + str8_list_push(arena, &rrt_data, str8_struct(&g_rrt_version)); + + // (3) type data ranges + str8_list_push(arena, &rrt_data, str8_array_fixed(rrt->type_data_ranges)); + + // (4) type data + str8_list_push(arena, &rrt_data, rrt->type_data_raw); + + // (5) type index ranges + str8_list_push(arena, &rrt_data, str8_array_fixed(rrt->ti_ranges)); + + // (6) type hashes size + U64 total_hash_count = 0; + for EachIndex(i, CV_TypeIndexSource_COUNT) { total_hash_count += dim_1u64(rrt->ti_ranges[i]); } + U64 type_hashes_size = sizeof(**rrt->type_hashes_unpacked) * total_hash_count; + str8_list_push(arena, &rrt_data, str8_struct(push_u64(arena, type_hashes_size))); + + // (7) type hashes + for EachIndex(i, CV_TypeIndexSource_COUNT) { + U64 type_count = dim_1u64(rrt->ti_ranges[i]); + str8_list_push(arena, &rrt_data, str8_array(rrt->type_hashes_unpacked[i], type_count)); + } + + // (8) object count + str8_list_push(arena, &rrt_data, str8_struct(&rrt->obj_count)); + + // (9) per object type index ranges + str8_list_push(arena, &rrt_data, str8_array(rrt->obj_ti_ranges, rrt->obj_count)); + + // (10) per object time stamps + str8_list_push(arena, &rrt_data, str8_array(rrt->obj_time_stamps, rrt->obj_count)); + + // (11) per object leaf counts + str8_list_push(arena, &rrt_data, str8_array(rrt->obj_leaf_counts, rrt->obj_count)); + + // (12) per object file reverse lookup table for type indices + for EachIndex(obj_idx, rrt->obj_count) { + CV_TypeIndex *obj_ti_map = rrt->obj_ti_maps[obj_idx]; + U64 obj_ti_count = rrt->obj_leaf_counts[obj_idx]; + Assert(dim_1u64(rrt->obj_pch_ti_ranges[obj_idx]) + obj_ti_count <= dim_1u64(rrt->obj_ti_ranges[obj_idx])); + str8_list_push(arena, &rrt_data, str8_array(obj_ti_map, obj_ti_count)); + } + + // (13) object file paths size + str8_list_push(arena, &rrt_data, str8_struct(push_u64(arena, obj_paths.size))); + + // (14) object file paths block + str8_list_push(arena, &rrt_data, obj_paths); + + // (15) PCH type index ranges + str8_list_push(arena, &rrt_data, str8_array(rrt->obj_pch_ti_ranges, rrt->obj_count)); + + // (16) PCH object indices + str8_list_push(arena, &rrt_data, str8_array(rrt->obj_pch_indices, rrt->obj_count)); + + ProfEnd(); + return rrt_data; +} + +internal B32 +lnk_rrt_from_string(Arena *arena, String8 rrt_data, String8 path, LNK_RRT *rrt_out) +{ + B32 is_ok = 0; + U64 cursor = 0; + + // (1) magic + if (rrt_data.size < g_rrt_magic.size || + ! str8_match(str8_prefix(rrt_data, g_rrt_magic.size), g_rrt_magic, 0)) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file has invalid magic value", path); + goto exit; + } + cursor += g_rrt_magic.size; + + // (2) version + U64 version = 0; + U64 version_size = str8_deserial_read_struct(rrt_data, cursor, &version); + if (version_size != sizeof(version)) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file does not contain enough bytes to read the version", path); + goto exit; + } + cursor += version_size; + + // match version + if (version != g_rrt_version) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT version mismatch, got %llu, expected %llu", path, version, g_rrt_version); + goto exit; + } + + // (3) type data ranges + Rng1U64 type_data_ranges[CV_TypeIndexSource_COUNT] = {0}; + U64 type_data_ranges_size = str8_deserial_read_array(rrt_data, cursor, type_data_ranges, ArrayCount(type_data_ranges)); + if (type_data_ranges_size != sizeof(type_data_ranges)) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT is missing type data ranges", path); + goto exit; + } + cursor += type_data_ranges_size; + + // comppute size types from all the sources + U64 total_type_data_size = 0; + for EachElement(i, type_data_ranges) total_type_data_size += dim_1u64(type_data_ranges[i]); + + // (4) type data + String8 type_data_raw = {0}; + U64 type_data_raw_size = str8_deserial_read_block(rrt_data, cursor, total_type_data_size, &type_data_raw); + if (type_data_raw_size != total_type_data_size) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is too small to read type data file (%M)", path, total_type_data_size); + goto exit; + } + cursor += type_data_raw_size; + + // (5) type index ranges + Rng1U64 ti_ranges[CV_TypeIndexSource_COUNT] = {0}; + U64 ti_ranges_size = str8_deserial_read_array(rrt_data, cursor, ti_ranges, ArrayCount(ti_ranges)); + if (ti_ranges_size != sizeof(ti_ranges)) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file does not contain type indices", path); + goto exit; + } + cursor += ti_ranges_size; + + // (6) type hashes size + U64 type_hashes_size = 0; + U64 type_hashes_size_size = str8_deserial_read_struct(rrt_data, cursor, &type_hashes_size); + if (type_hashes_size_size != sizeof(type_hashes_size)) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is too small to read type hashes", path); + goto exit; + } + cursor += type_hashes_size_size; + + // validate type hashes size + if (type_hashes_size) { + U64 type_count = 0; + for EachIndex(i, CV_TypeIndexSource_COUNT) { type_count += dim_1u64(ti_ranges[i]); } + U64 expected_size = type_count * sizeof(U64); + if (expected_size != type_hashes_size) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file type hash size (%llu) does not match expected size (%llu)", path, type_hashes_size, expected_size); + goto exit; + } + } + + // (7) type hashes + String8 type_hashes = {0}; + U64 type_hashes_read_size = str8_deserial_read_block(rrt_data, cursor, type_hashes_size, &type_hashes); + if (type_hashes_read_size != type_hashes_size) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is too small to read type hashes (%M)", path, type_hashes_size); + goto exit; + } + cursor += type_hashes_read_size; + + // hash count must match type count + if (type_hashes_size) { + U64 type_count = 0; + for EachIndex(i, CV_TypeIndexSource_COUNT) { type_count += dim_1u64(ti_ranges[i]); } + U64 hash_count = type_hashes.size / sizeof(U64); + if (type_count != hash_count) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file hash count (%llu) does not match type count (%llu)", path, hash_count, type_count); + goto exit; + } + } + + // (8) object count + U64 obj_count = 0; + U64 obj_count_size = str8_deserial_read_struct(rrt_data, cursor, &obj_count); + if (obj_count_size == 0) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is too small to read the object count", path); + goto exit; + } + cursor += obj_count_size; + + // (9) per object type index ranges + Rng1U64 *obj_ti_ranges = str8_deserial_get_raw_ptr(rrt_data, cursor, sizeof(*obj_ti_ranges) * obj_count); + if (obj_ti_ranges == 0) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is missing the object type index ranges", path); + goto exit; + } + cursor += sizeof(*obj_ti_ranges) * obj_count; + + // (10) last observed time stamp of the object files + U64 *obj_time_stamps = str8_deserial_get_raw_ptr(rrt_data, cursor, sizeof(*obj_time_stamps) * obj_count); + if (obj_time_stamps == 0) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is missing the object timestamps", path); + goto exit; + } + cursor += sizeof(*obj_time_stamps) * obj_count; + + // (11) per object leaf counts + U64 *obj_leaf_counts = str8_deserial_get_raw_ptr(rrt_data, cursor, sizeof(*obj_leaf_counts) * obj_count); + if (obj_leaf_counts == 0) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is missing the object leaf counts", path); + goto exit; + } + cursor += sizeof(*obj_leaf_counts) * obj_count; + + // (12) per object file reverse lookup table for type indices + CV_TypeIndex **obj_ti_maps = push_array(arena, CV_TypeIndex *, obj_count); + for EachIndex(obj_idx, obj_count) { + U64 obj_ti_count = obj_leaf_counts[obj_idx]; + obj_ti_maps[obj_idx] = str8_deserial_get_raw_ptr(rrt_data, cursor, obj_ti_count * sizeof(*obj_ti_maps[obj_idx])); + if (obj_ti_maps[obj_idx] == 0) { + lnk_error(LNK_Error_IllData, "ERROR: %S: failed to read objects type index map from RRT file", path); + goto exit; + } + cursor += obj_ti_count * sizeof(*obj_ti_maps[obj_idx]); + } + + // (13) object file paths size + U64 obj_file_paths_size = 0; + U64 obj_file_paths_size_size = str8_deserial_read_struct(rrt_data, cursor, &obj_file_paths_size); + if (obj_file_paths_size_size == 0) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is too small to read the object file path block size", path); + goto exit; + } + cursor += obj_file_paths_size_size; + + // (14) object file paths block + String8 obj_file_paths_block = {0}; + U64 obj_file_paths_block_size = str8_deserial_read_block(rrt_data, cursor, obj_file_paths_size, &obj_file_paths_block); + if (obj_file_paths_block_size != obj_file_paths_size) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is too small to read the object file path block (%M)", path, obj_file_paths_size); + goto exit; + } + cursor += obj_file_paths_block_size; + + // (15) PCH type index ranges + Rng1U64 *obj_pch_ti_ranges = str8_deserial_get_raw_ptr(rrt_data, cursor, obj_count * sizeof(*obj_pch_ti_ranges)); + if (obj_pch_ti_ranges == 0) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is too small to read object PCH type index ranges"); + goto exit; + } + cursor += obj_count * sizeof(*obj_pch_ti_ranges); + + U32 *obj_pch_indices = str8_deserial_get_raw_ptr(rrt_data, cursor, obj_count * sizeof(*obj_pch_indices)); + if (obj_pch_indices == 0) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT file is too small to read object PCH indices"); + goto exit; + } + cursor += obj_count * sizeof(*obj_pch_indices); + + for EachIndex(obj_idx, obj_count) { + if (dim_1u64(obj_pch_ti_ranges[obj_idx]) + obj_leaf_counts[obj_idx] > dim_1u64(obj_ti_ranges[obj_idx])) { + lnk_error(LNK_Error_IllData, "ERROR: %S: RRT object leaf count exceeds object type index range", path); + goto exit; + } + } + + if (cursor != rrt_data.size) { + lnk_error(LNK_Error_IllData, "ERROR: %S: failed to parse RRT file", path); + goto exit; + } + + // unpack type data + String8 type_data[CV_TypeIndexSource_COUNT] = {0}; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + type_data[ti_source] = str8_substr(type_data_raw, type_data_ranges[ti_source]); + } + + // unpack obj file paths + Temp scratch = scratch_begin(&arena, 1); + String8List obj_file_paths_list = str8_split_by_string_chars(scratch.arena, obj_file_paths_block, str8_lit("\0"), 0); + String8Array obj_paths = str8_array_from_list(arena, &obj_file_paths_list); + scratch_end(scratch); + + // fill out result + if (rrt_out) { + rrt_out->path = path; + rrt_out->type_data_raw = type_data_raw; + rrt_out->type_hashes = type_hashes; + MemoryCopyArray(rrt_out->type_data_ranges, type_data_ranges); + MemoryCopyArray(rrt_out->type_data, type_data); + MemoryCopyArray(rrt_out->ti_ranges, ti_ranges); + rrt_out->obj_count = obj_count; + rrt_out->obj_leaf_counts = obj_leaf_counts; + rrt_out->obj_time_stamps = obj_time_stamps; + rrt_out->obj_ti_ranges = obj_ti_ranges; + rrt_out->obj_ti_maps = obj_ti_maps; + rrt_out->obj_ti_ranges = obj_ti_ranges; + rrt_out->obj_ti_maps = obj_ti_maps; + rrt_out->obj_paths = obj_paths; + rrt_out->obj_pch_ti_ranges = obj_pch_ti_ranges; + rrt_out->obj_pch_indices = obj_pch_indices; + } + + is_ok = 1; + exit:; + return is_ok; +} + +internal LNK_RRT_Array +lnk_rrt_array_from_config(Arena *arena, LNK_Config *config) +{ + ProfBegin("Parse RRT"); + LNK_RRT_Array rrt_arr = { .v = push_array(arena, LNK_RRT, config->input_list[LNK_Input_RRT].node_count) }; + for EachNode(n, String8Node, config->input_list[LNK_Input_RRT].first) { + String8 rrt_path = n->string; + String8 raw_rrt = lnk_read_data_from_file_path(arena, config->io_flags, rrt_path); + if (raw_rrt.size == 0) { + lnk_error(LNK_Error_IllData, "ERROR: failed to open \"%S\"", rrt_path); + continue; + } + LNK_RRT rrt = {0}; + lnk_rrt_from_string(arena, raw_rrt, n->string, &rrt); + rrt_arr.v[rrt_arr.count++] = rrt; + } + ProfEnd(); + return rrt_arr; +} + internal LNK_CodeViewInput -lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 obj_count, LNK_Obj **obj_arr) +lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 obj_count, LNK_Obj **obj_arr, LNK_RRT_Array rrt_input) { ProfBegin("Extract CodeView"); Temp scratch = scratch_begin(0,0); - LNK_CodeViewInput input = { .config = config, .obj_count = obj_count, .count = obj_count, .obj_arr = obj_arr, .ts_obj_range = r1u64(0,0) }; + LNK_CodeViewInput input = { .config = config, .obj_count = obj_count, .count = obj_count, .obj_arr = obj_arr, .rrt_input = rrt_input, .ts_obj_range = r1u64(0,0) }; + + HashMap rrt_hm = {0}; + ProfScope("Make obj path -> RRT hash map") + { + for EachIndex(rrt_idx, rrt_input.count) { + for EachIndex(obj_idx, rrt_input.v[rrt_idx].obj_paths.count) { + hash_map_push_path_u64(scratch.arena, &rrt_hm, rrt_input.v[rrt_idx].obj_paths.v[obj_idx], Compose64Bit(rrt_idx, obj_idx)); + } + } + } + + // pre-build PCH obj hash map (obj_path, obj_idx) + String8 work_dir = get_current_path(scratch.arena); + HashMap debug_p_hm = {0}; + for EachIndex(obj_idx, obj_count) { + LNK_Obj *obj = obj_arr[obj_idx]; + if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { + String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_arr[obj_idx]->path, work_dir); + if (hash_map_search_path_u64(&debug_p_hm, obj_path)) { + lnk_error_obj(LNK_Warning_DuplicateObjPath, obj_arr[obj_idx], "duplicate obj path %S", obj_path); + } else { + hash_map_push_path_u64(scratch.arena, &debug_p_hm, obj_path, obj_idx); + } + } + } + + ProfBegin("Apply RRT to Objs"); + + // hash map (obj path, obj idx) + HashMap obj_path_hm = {0}; + for EachIndex(obj_idx, obj_count) { + hash_map_push_path_u64(scratch.arena, &obj_path_hm, obj_arr[obj_idx]->path, obj_idx); + } + + for EachIndex(obj_idx, obj_count) { + LNK_Obj *obj = obj_arr[obj_idx]; + U64 *packed_rrt_idx = hash_map_search_path_u64(&rrt_hm, obj->path); + + // obj is not part of any input RRT + if (packed_rrt_idx == 0) { continue; } + + // unpack index + U32 rrt_idx = *packed_rrt_idx >> 32; + U32 rrt_obj_idx = *packed_rrt_idx & max_U32; + LNK_RRT *rrt = &rrt_input.v[rrt_idx]; + + // obj was recompiled, do not apply RRT indirection + FileProperties obj_file_props = properties_from_file_path(obj->path); + if (rrt->obj_time_stamps[rrt_obj_idx] != obj_file_props.modified) { continue; } + + // invalidate debug section pointers + obj->debug_t_sect_idx = ~0; + obj->debug_p_sect_idx = ~0; + obj->debug_h_sect_idx = ~0; + + // apply type index map + obj->ti_range = rrt->obj_ti_ranges[rrt_obj_idx]; + obj->ti_map = rrt->obj_ti_maps [rrt_obj_idx]; + + // apply PCH info + U32 rrt_pch_obj_idx = rrt->obj_pch_indices[rrt_obj_idx]; + if (rrt_pch_obj_idx < rrt->obj_count) { + String8 rrt_pch_obj_path = rrt->obj_paths.v[rrt_pch_obj_idx]; + U64 pch_obj_idx = *hash_map_search_path_u64(&obj_path_hm, rrt_pch_obj_path); + obj->pch_ti_range = rrt->obj_pch_ti_ranges[rrt_obj_idx]; + obj->pch_obj_idx = pch_obj_idx; + } else { + obj->pch_ti_range = r1u64(0,0); + obj->pch_obj_idx = ~0; + } + } + ProfEnd(); ProfBegin("Collect CodeView"); input.debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$S"), 0); - input.debug_p_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$P"), 0); - input.debug_t_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$T"), 0); - if (config->ghash) { - input.debug_h_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$H"), 0); - } ProfEnd(); if (lnk_get_log_status(LNK_Log_Debug) || PROFILE_TELEMETRY) { U64 total_debug_s_size = 0, total_debug_t_size = 0, total_debug_p_size = 0, total_debug_h_size = 0; for EachIndex(obj_idx, obj_count) { + LNK_Obj *obj = obj_arr[obj_idx]; + for EachNode(n, String8Node, input.debug_s_list_arr[obj_idx].first) { total_debug_s_size += n->string.size; } - for EachNode(n, String8Node, input.debug_t_list_arr[obj_idx].first) { total_debug_t_size += n->string.size; } - for EachNode(n, String8Node, input.debug_p_list_arr[obj_idx].first) { total_debug_p_size += n->string.size; } - if (config->ghash) { - for EachNode(n, String8Node, input.debug_h_list_arr[obj_idx].first) { total_debug_h_size += n->string.size; } + + if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + total_debug_t_size += section_table[obj->debug_t_sect_idx].fsize; } + if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + total_debug_p_size += section_table[obj->debug_p_sect_idx].fsize; + } + if (config->ghash) { + if (obj->debug_h_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); + total_debug_h_size += section_table[obj->debug_h_sect_idx].fsize; + } + } + } + + U64 total_rrt_type_size = 0; + U64 total_rrt_hash_size = 0; + for EachIndex(rrt_idx, rrt_input.count) { + total_rrt_type_size += rrt_input.v[rrt_idx].type_data_raw.size; + total_rrt_hash_size += rrt_input.v[rrt_idx].type_hashes.size; } ProfNoteV("Total .debug$S Input Size: %M", total_debug_s_size); ProfNoteV("Total .debug$T Input Size: %M", total_debug_t_size); ProfNoteV("Total .debug$P Input Size: %M", total_debug_p_size); ProfNoteV("Total .debug$H Input Size: %M", total_debug_h_size); + ProfNoteV("Total RRT-Type Input Size: %M", total_rrt_type_size); + ProfNoteV("Total RRT-Hash Input Size: %M", total_rrt_hash_size); if (lnk_get_log_status(LNK_Log_Debug)) { lnk_log(LNK_Log_Debug, "[Total .debug$S Input Size %M]", total_debug_s_size); lnk_log(LNK_Log_Debug, "[Total .debug$T Input Size %M]", total_debug_t_size); lnk_log(LNK_Log_Debug, "[Total .debug$P Input Size %M]", total_debug_p_size); lnk_log(LNK_Log_Debug, "[Total .debug$H Input Size %M]", total_debug_h_size); + lnk_log(LNK_Log_Debug, "[Total RRT-Type Input Size %M]", total_rrt_type_size); + lnk_log(LNK_Log_Debug, "[Total RRT-Hash Input Size %M]", total_rrt_hash_size); } } @@ -314,15 +751,34 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, input.obj_count); tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_s_task, &input, "Parse .debug$S"); + String8Array *raw_debug_p_arr = push_array(scratch.arena, String8Array, obj_count); + String8Array *raw_debug_t_arr = push_array(scratch.arena, String8Array, obj_count); + for EachIndex(obj_idx, obj_count) { + LNK_Obj *obj = obj_arr[obj_idx]; + + if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *debug_t_hdr = &lnk_coff_section_table_from_obj(obj)[obj->debug_t_sect_idx]; + raw_debug_t_arr[obj_idx].count = 1; + raw_debug_t_arr[obj_idx].v = push_array(scratch.arena, String8, 1); + raw_debug_t_arr[obj_idx].v[0] = str8_substr(obj->data, r1u64(debug_t_hdr->foff, debug_t_hdr->foff + debug_t_hdr->fsize)); + } + if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { + COFF_SectionHeader *debug_p_hdr = &lnk_coff_section_table_from_obj(obj)[obj->debug_p_sect_idx]; + raw_debug_p_arr[obj_idx].count = 1; + raw_debug_p_arr[obj_idx].v = push_array(scratch.arena, String8, 1); + raw_debug_p_arr[obj_idx].v[0] = str8_substr(obj->data, r1u64(debug_p_hdr->foff, debug_p_hdr->foff + debug_p_hdr->fsize)); + } + } + LNK_ParseCvTypes parse_types = { .input = &input }; debug_p_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); - parse_types.raw_types = str8_array_from_list_arr(scratch.arena, input.debug_p_list_arr, obj_count); + parse_types.raw_types = raw_debug_p_arr; parse_types.out_types = debug_p_arr; tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$P"); tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$P"); input.debug_t_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); - parse_types.raw_types = str8_array_from_list_arr(scratch.arena, input.debug_t_list_arr, obj_count); + parse_types.raw_types = raw_debug_t_arr; parse_types.out_types = input.debug_t_arr; tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$T"); tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$T"); @@ -342,9 +798,10 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; CV_DebugT *debug_p = &debug_p_arr[obj_idx]; U32Array *arr_ptr; - if (debug_p->count > 0 && debug_t->count == 0) { arr_ptr = &input.debug_p_indices; } - else if (cv_debug_t_is_type_server_ref(debug_t)) { arr_ptr = &input.ext_obj_indices; } - else { arr_ptr = &input.int_obj_indices; } + if (hash_map_search_path_u64(&rrt_hm, obj_arr[obj_idx]->path)) { arr_ptr = &input.ext_obj_indices; } + else if (debug_p->count > 0 && debug_t->count == 0) { arr_ptr = &input.debug_p_indices; } + else if (cv_debug_t_is_type_server_ref(debug_t)) { arr_ptr = &input.ext_obj_indices; } + else { arr_ptr = &input.int_obj_indices; } arr_ptr->v[arr_ptr->count++] = obj_idx; if (debug_t->count == 0 && debug_p->count > 0) { @@ -356,7 +813,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, } } - ProfScope("Set up /Zi") + ProfScope("Set up PDB and RRT") { input.obj_to_ts = push_array(tp_arena->v[0], U64, input.count); MemorySet(input.obj_to_ts, 0xff, input.count * sizeof(input.obj_to_ts[0])); @@ -373,11 +830,26 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, for EachIndex(i, input.ext_obj_indices.count) { // first leaf is always type server - U64 obj_idx = input.ext_obj_indices.v[i]; - CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; - CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); - CV_TypeServerInfo ts_info = cv_type_server_info_from_leaf(leaf); - String8 ts_path = lnk_find_first_file(scratch.arena, config->lib_dir_list, ts_info.name); + U64 obj_idx = input.ext_obj_indices.v[i]; + + U64 *packed_rrt_info = hash_map_search_path_u64(&rrt_hm, obj_arr[obj_idx]->path); + + LNK_TypeServerKind ts_kind = LNK_TypeServerKind_Null; + CV_TypeServerInfo ts_info = {0}; + String8 ts_path = {0}; + LNK_RRT *rrt = 0; + if (packed_rrt_info) { + U32 rrt_idx = *packed_rrt_info >> 32; + rrt = &rrt_input.v[rrt_idx]; + ts_kind = LNK_TypeServerKind_RRT; + ts_path = rrt->path; + } else { + CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0); + ts_kind = LNK_TypeServerKind_PDB; + ts_info = cv_type_server_info_from_leaf(leaf); + ts_path = lnk_find_first_file(scratch.arena, config->lib_dir_list, ts_info.name); + } if (ts_path.size == 0) { lnk_discard_cv_debug_info(&input, obj_idx); @@ -393,7 +865,9 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, ts = &n->v; ts->ts_info = ts_info; ts->ts_idx = ts_ht->count; + ts->ts_kind = ts_kind; ts->ts_path = push_str8_copy(tp_arena->v[0], ts_path); + ts->rrt = rrt; hash_table_push_path_raw(scratch.arena, ts_ht, ts->ts_path, ts); } @@ -458,6 +932,18 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, // undiscard null type server input.is_type_server_discarded[0] = 0; + // wire RRT hashes to type servers .debug$H + for EachIndex(ts_idx, ts_arr.count) { + LNK_TypeServer *ts = &ts_arr.v[ts_idx]; + if (ts->rrt) { + U64 ts_obj_idx = input.ts_obj_range.min + ts_idx; + CV_DebugT *debug_t = &input.debug_t_arr[ts_obj_idx]; + CV_DebugH *debug_h = &input.debug_h_arr[ts_obj_idx]; + debug_h->count = ts->rrt->type_hashes.size / sizeof(U64); + debug_h->v = (U64 *)ts->rrt->type_hashes.str; + } + } + // report bad type servers String8List unopen_type_server_list = {0}; for EachIndex(ts_idx, ts_arr.count) { @@ -478,19 +964,6 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, ProfBegin("Set up PCH"); { - // hash_table - String8 work_dir = get_current_path(scratch.arena); - HashTable *debug_p_ht = hash_table_init(scratch.arena, obj_count); - for EachIndex(i, input.debug_p_indices.count) { - U64 obj_idx = input.debug_p_indices.v[i]; - String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_arr[obj_idx]->path, work_dir); - if (hash_table_search_path(debug_p_ht, obj_path)) { - lnk_error_obj(LNK_Warning_DuplicateObjPath, obj_arr[obj_idx], "duplicate obj path %S", obj_path); - } else { - hash_table_push_path_u64(scratch.arena, debug_p_ht, obj_path, obj_idx); - } - } - for EachIndex(i, input.int_obj_indices.count) { U64 obj_idx = input.int_obj_indices.v[i]; CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; @@ -499,22 +972,28 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, if ( ! cv_debug_t_is_pch(debug_t)) { continue; } // find PCH obj - CV_PrecompInfo precomp = cv_precomp_info_from_leaf(cv_debug_t_get_leaf(debug_t, 0)); - String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir); - U64 debug_p_obj_idx = max_U64; - if ( ! hash_table_search_path_u64(debug_p_ht, obj_path, &debug_p_obj_idx)) { - // try alternative directory for the PCH + CV_PrecompInfo precomp = cv_precomp_info_from_leaf(cv_debug_t_get_leaf(debug_t, 0)); + String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir); + U64 *debug_p_obj_idx_ptr = hash_map_search_path_u64(&debug_p_hm, obj_path); + + // try alternative directory for the PCH + if (debug_p_obj_idx_ptr == 0) { String8 obj_name = str8_skip_last_slash(obj_path); for EachNode(alt_dir_n, String8Node, config->alt_pch_dirs.first) { String8 alt_obj_path = str8f(scratch.arena, "%S/%S", alt_dir_n->string, obj_name); - if (hash_table_search_path_u64(debug_p_ht, alt_obj_path, &debug_p_obj_idx)) { break; } - } - if (debug_p_obj_idx == max_U64) { - lnk_error_obj(LNK_Error_PrecompObjNotFound, obj_arr[obj_idx], "LF_PRECOMP references non-existent obj %S; discarding debug info", obj_path); - lnk_discard_cv_debug_info(&input, obj_idx); + debug_p_obj_idx_ptr = hash_map_search_path_u64(&debug_p_hm, alt_obj_path); + if (debug_p_obj_idx_ptr) { break; } } } + if (debug_p_obj_idx_ptr == 0) { + lnk_error_obj(LNK_Error_PrecompObjNotFound, obj_arr[obj_idx], "LF_PRECOMP references non-existent obj %S; discarding debug info", obj_path); + lnk_discard_cv_debug_info(&input, obj_idx); + continue; + } + + U64 debug_p_obj_idx = *debug_p_obj_idx_ptr; + // get PCH leaf data CV_DebugT *debug_p = &input.debug_t_arr[debug_p_obj_idx]; @@ -622,6 +1101,37 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, internal LNK_LeafRef lnk_leaf_ref_from_ti(LNK_CodeViewInput *input, U32 obj_idx, CV_TypeIndexSource source, CV_TypeIndex ti) { + // ti range: external type server + U64 ts_idx = input->obj_to_ts[obj_idx]; + if (ts_idx != max_U64) { + U64 ts_debug_t_idx = input->ts_obj_range.min + ts_idx; + CV_DebugT *ts_debug_t = input->debug_t_arr + ts_debug_t_idx; + LNK_TypeServer *ts = &input->ts_arr.v[ts_idx]; + + // RRT indirection + if (ts->rrt) { + LNK_Obj *obj = input->obj_arr[obj_idx]; + + // RRT-PCH indirection + if (contains_1u64(obj->pch_ti_range, ti)) { + obj_idx = obj->pch_obj_idx; + obj = input->obj_arr[obj_idx]; + } + + Assert(contains_1u64(obj->ti_range, ti)); + + // translate type index to original leaf index + U64 leaf_idx_og = (ti - obj->ti_range.min); + leaf_idx_og -= dim_1u64(obj->pch_ti_range); + + // map original leaf index to RRT type index + CV_TypeIndex final_ti = obj->ti_map[leaf_idx_og]; + return (LNK_LeafRef){ ts_debug_t_idx, cv_leaf_idx_from_ti(ts_debug_t, source, final_ti) }; + } + + return (LNK_LeafRef){ ts_debug_t_idx, cv_leaf_idx_from_ti(ts_debug_t, source, ti) }; + } + CV_DebugT *debug_t = input->debug_t_arr + obj_idx; // ti_range: PCH @@ -630,18 +1140,16 @@ lnk_leaf_ref_from_ti(LNK_CodeViewInput *input, U32 obj_idx, CV_TypeIndexSource s cv_leaf_idx_from_ti(&input->debug_t_arr[debug_t->pch_obj_idx], source, ti) }; } - // ti range: external type server - U64 ts_idx = input->obj_to_ts[obj_idx]; - if (ts_idx != max_U64) { - U64 ts_debug_t_idx = input->ts_obj_range.min + ts_idx; - CV_DebugT *ts_debug_t = input->debug_t_arr + ts_debug_t_idx; - return (LNK_LeafRef){ ts_debug_t_idx, cv_leaf_idx_from_ti(ts_debug_t, source, ti) }; - } - // ti range: internal type server return (LNK_LeafRef){ obj_idx, cv_leaf_idx_from_ti(debug_t, source, ti) }; } +internal U64 +lnk_hash_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref) +{ + return input->debug_h_arr[leaf_ref.obj_idx].v[leaf_ref.leaf_idx]; +} + internal int lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b) { @@ -662,14 +1170,9 @@ lnk_leaf_ref_is_before(void *raw_a, void *raw_b) internal B32 lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef a, LNK_LeafRef b) { - B32 is_match = 0; - U64 a_hash = input->debug_h_arr[a.obj_idx].v[a.leaf_idx]; - U64 b_hash = input->debug_h_arr[b.obj_idx].v[b.leaf_idx]; - if (a_hash == b_hash) { - Assert(cv_debug_t_get_leaf(&input->debug_t_arr[a.obj_idx], a.leaf_idx).kind == cv_debug_t_get_leaf(&input->debug_t_arr[b.obj_idx], b.leaf_idx).kind); - is_match = 1; - } - return is_match; + U64 a_hash = lnk_hash_from_leaf_ref(input, a); + U64 b_hash = lnk_hash_from_leaf_ref(input, b); + return a_hash == b_hash; } internal U64 @@ -904,6 +1407,62 @@ THREAD_POOL_TASK_FUNC(lnk_hash_debug_t_deep_task) ProfEnd(); } +internal +THREAD_POOL_TASK_FUNC(lnk_populate_leaf_ht) +{ + LNK_MergeTypes *task = raw_task; + + U64 obj_idx = task->pop_obj_idx; + CV_DebugT *debug_t = &task->input->debug_t_arr[task->pop_obj_idx]; + CV_DebugH *debug_h = &task->input->debug_h_arr[task->pop_obj_idx]; + + for EachInRange(leaf_idx, task->pop_range[task_id]) { + LNK_LeafRef *bucket = 0; + + // alloc new bucket and assign type ref + if (bucket == 0) { bucket = push_array_no_zero(arena, LNK_LeafRef, 1); } + + // fill bucket + *bucket = (LNK_LeafRef){ .obj_idx = obj_idx, .leaf_idx = leaf_idx }; + + B32 is_inserted_or_updated = 1; + + CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx); // leaf index -> leaf header + CV_LeafKind kind = memory_read16(MemberFromPtr(CV_LeafHeader, header, kind)); // leaf header -> leaf kind + CV_TypeIndexSource leaf_source = cv_type_index_source_from_leaf_kind(kind); // leaf kind -> type stream + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[leaf_source]; // type stream -> hash table + U64 best_idx = debug_h->v[leaf_idx] % leaf_ht->cap; // leaf ref -> hash -> bucket index + U64 idx = best_idx; + do { + // load leaf ref + LNK_LeafRef *curr = ins_atomic_ptr_eval(&leaf_ht->bucket_arr[idx]); + + while (curr == 0) { + // exit if leaf ref is not recent + if (curr != 0 && lnk_leaf_ref_compare(*bucket, *curr) >= 0) { + goto exit; + } + + // try to update the bucket + LNK_LeafRef *cmp = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], bucket, curr); + if (cmp == curr) { + bucket = 0; + goto exit; + } + + // another thread updated the bucket -- retry + curr = cmp; + } + + // advance to next bucket + idx = ((idx + 1) == leaf_ht->cap ? 0 : (idx + 1)); + } while (idx != best_idx); + is_inserted_or_updated = 0; + exit:; + Assert(is_inserted_or_updated); + } +} + internal THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_task) { @@ -911,7 +1470,7 @@ THREAD_POOL_TASK_FUNC(lnk_leaf_dedup_task) U64 obj_idx = task->indices.v[task_id]; CV_DebugT *debug_t = &task->input->debug_t_arr[obj_idx]; CV_DebugH *debug_h = &task->input->debug_h_arr[obj_idx]; - ProfBeginDynamic("dedup in obj 0x%x (%S) leaf count %u", obj_idx, task->input->obj_arr[obj_idx]->path, debug_t->count); + ProfBeginDynamic("dedup in obj 0x%llx (%.*s) leaf count %llu", obj_idx, str8_varg(task->input->obj_arr[obj_idx]->path), debug_t->count); LNK_LeafRef *bucket = 0; for EachIndex(leaf_idx, debug_t->count) { @@ -1223,37 +1782,24 @@ lnk_fixup_cv_type_indices(LNK_MergeTypes *ctx, U32 obj_idx, String8 data, CV_Typ // skip basic types if (ti < ctx->input->min_type_indices[n->source]) { continue; } - CV_DebugT *debug_t; - if (ctx->input->obj_to_ts[obj_idx] != max_U64) { - U64 ts_idx = ctx->input->obj_to_ts[obj_idx]; - U64 debug_t_idx = ctx->input->ts_obj_range.min + ts_idx; - debug_t = ctx->input->debug_t_arr + debug_t_idx; - } else { - debug_t = ctx->input->debug_t_arr + obj_idx; - } - CV_TypeIndex final_ti = 0; - if (contains_1u64(debug_t->ti_ranges[n->source], ti)) { - LNK_LeafRef leaf_ref = lnk_leaf_ref_from_ti(ctx->input, obj_idx, n->source, ti); - LNK_LeafHashTable *leaf_ht = &ctx->leaf_ht_arr[n->source]; - LNK_LeafRef *final_leaf = lnk_leaf_hash_table_search(leaf_ht, ctx->input, leaf_ref); - if (final_leaf) { - U64 final_hash = u64_hash_from_str8(str8_struct(final_leaf)); - final_ti = lnk_assigned_type_ht_search(ctx->assigned_type_caps [n->source], - ctx->assigned_type_hts [n->source], - ctx->min_type_indices [n->source], - ctx->unique_leaf_refs_arr[n->source], - final_leaf, - final_hash); - } -#if BUILD_DEBUG - else { - lnk_error_obj(LNK_Error_InvalidTypeIndex, ctx->input->obj_arr[obj_idx], "no itype 0x%x", ti); - } -#endif - } else { - Assert(0 && "invalid type index"); + LNK_LeafRef leaf_ref = lnk_leaf_ref_from_ti(ctx->input, obj_idx, n->source, ti); + LNK_LeafHashTable *leaf_ht = &ctx->leaf_ht_arr[n->source]; + LNK_LeafRef *final_leaf = lnk_leaf_hash_table_search(leaf_ht, ctx->input, leaf_ref); + if (final_leaf) { + U64 final_hash = u64_hash_from_str8(str8_struct(final_leaf)); + final_ti = lnk_assigned_type_ht_search(ctx->assigned_type_caps [n->source], + ctx->assigned_type_hts [n->source], + ctx->min_type_indices [n->source], + ctx->unique_leaf_refs_arr[n->source], + final_leaf, + final_hash); } +#if BUILD_DEBUG + else { + lnk_error_obj(LNK_Error_InvalidTypeIndex, ctx->input->obj_arr[obj_idx], "no itype 0x%x", ti); + } +#endif memory_write32(ti_ptr, final_ti); } @@ -1331,6 +1877,19 @@ THREAD_POOL_TASK_FUNC(lnk_unbucket_raw_leaves_task) } } +internal +THREAD_POOL_TASK_FUNC(lnk_unbucket_hashes_task) +{ + LNK_MergeTypes *task = raw_task; + Rng1U64 range = task->ranges[task_id]; + for EachInRange(i, range) { + LNK_LeafRef leaf_ref = *task->unique_leaf_refs_arr[task->ti_source].v[i]; + CV_DebugT *debug_t = &task->input->debug_t_arr[leaf_ref.obj_idx]; + String8 raw_leaf = cv_debug_t_get_raw_leaf(debug_t, leaf_ref.leaf_idx); + task->result.hashes[task->ti_source][i] = task->input->debug_h_arr[leaf_ref.obj_idx].v[leaf_ref.leaf_idx]; + } +} + internal THREAD_POOL_TASK_FUNC(lnk_fixup_symbols_task) { @@ -1393,8 +1952,43 @@ THREAD_POOL_TASK_FUNC(lnk_fixup_symbols_task) } } +internal +THREAD_POOL_TASK_FUNC(lnk_build_obj_ti_map) +{ + LNK_MergeTypes *task = raw_task; + LNK_CodeViewInput *input = task->input; + + U64 obj_idx = task_id; + CV_DebugT *debug_t = &input->debug_t_arr[obj_idx]; + CV_TypeIndex *obj_ti_map = task->obj_ti_batch + task->obj_ti_map_offsets[obj_idx]; + + for EachIndex(leaf_idx, debug_t->count) { + CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx); + CV_TypeIndexSource source = cv_type_index_source_from_leaf_kind(leaf.kind); + LNK_LeafRef leaf_ref = { obj_idx, leaf_idx }; + LNK_LeafHashTable *leaf_ht = &task->leaf_ht_arr[source]; + LNK_LeafRef *final_leaf = lnk_leaf_hash_table_search(leaf_ht, input, leaf_ref); + + if (final_leaf) { + U64 final_hash = u64_hash_from_str8(str8_struct(final_leaf)); + CV_TypeIndex final_ti = lnk_assigned_type_ht_search(task->assigned_type_caps [source], + task->assigned_type_hts [source], + task->min_type_indices [source], + task->unique_leaf_refs_arr[source], + final_leaf, + final_hash); + + obj_ti_map[leaf_idx] = final_ti; + } else { + obj_ti_map[leaf_idx] = 0; + } + } + + task->result.obj_ti_maps[obj_idx] = obj_ti_map; +} + internal LNK_MergedTypes -lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) +lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input, LNK_MergeTypeFlags merge_flags) { ProfBeginFunction(); Temp scratch = temp_begin(lnk_get_huge_arena()); @@ -1482,6 +2076,34 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) } ProfEnd(); + U32Array dedup_type_server_indices = input->type_server_indices; + + ProfBegin("Prepopulate hash table with largest type-set"); + { + LNK_TypeServer *largest_ts = 0; + for EachIndex(i, input->ts_arr.count) { + LNK_TypeServer *ts = &input->ts_arr.v[i]; + if (ts->rrt == 0) { continue; } + if (largest_ts == 0 || (largest_ts->rrt->type_data_raw.size < ts->rrt->type_data_raw.size)) { + largest_ts = ts; + } + } + + if (largest_ts) { + task.pop_obj_idx = input->ts_obj_range.min + largest_ts->ts_idx; + task.pop_range = tp_divide_work(scratch.arena, task.input->debug_t_arr[task.pop_obj_idx].count, tp->worker_count); + tp_for_parallel(tp, tp_temp, tp->worker_count, lnk_populate_leaf_ht, &task); + + U32Array new_dedup_type_server_indices = { .v = push_array(scratch.arena, U32, input->type_server_indices.count) }; + for EachIndex(i, input->type_server_indices.count) { + if (input->type_server_indices.v[i] == task.pop_obj_idx) { continue; } + new_dedup_type_server_indices.v[new_dedup_type_server_indices.count++] = input->type_server_indices.v[i]; + } + dedup_type_server_indices = new_dedup_type_server_indices; + } + } + ProfEnd(); + ProfBegin("Leaf Dedup"); task.indices = input->debug_p_indices; tp_for_parallel_prof(tp, tp_temp, task.indices.count, lnk_leaf_dedup_task, &task, ".debug$P"); @@ -1489,7 +2111,7 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) task.indices = input->int_obj_indices; tp_for_parallel_prof(tp, tp_temp, task.indices.count, lnk_leaf_dedup_task, &task, ".debug$T"); - task.indices = input->type_server_indices; + task.indices = dedup_type_server_indices; tp_for_parallel_prof(tp, tp_temp, task.indices.count, lnk_leaf_dedup_task, &task, "Type Servers"); ProfEnd(); @@ -1609,12 +2231,14 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) } ProfEnd(); - task.ranges = tp_divide_work(scratch.arena, input->symbol_input_count, tp->worker_count); - tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_symbols_task, &task, "Fixup Symbol Type Indices"); + if (~merge_flags & LNK_MergeTypeFlag_SkipSymbolTypeFixup) { + task.ranges = tp_divide_work(scratch.arena, input->symbol_input_count, tp->worker_count); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_cv_patcher_symbols_task, &task, "Fixup Symbol Type Indices"); - task.ranges = 0; - task.debug_s_arr = input->debug_s_arr; - tp_for_parallel_prof(tp, 0, input->count, lnk_cv_patcher_inlines_task, &task, "Fixup Inlines Type Indices"); + task.ranges = 0; + task.debug_s_arr = input->debug_s_arr; + tp_for_parallel_prof(tp, 0, input->count, lnk_cv_patcher_inlines_task, &task, "Fixup Inlines Type Indices"); + } for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { task.ti_source = ti_source; @@ -1624,16 +2248,40 @@ lnk_merge_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input) } ProfEnd(); + // @type_server + if (merge_flags & LNK_MergeTypeFlag_BuildObjTiMap) { + task.result.obj_ti_maps = push_array(tp_temp->v[0], CV_TypeIndex *, input->obj_count); + task.obj_ti_map_counts = push_array(scratch.arena, U64, input->obj_count); + for EachIndex(obj_idx, input->obj_count) { + task.obj_ti_map_counts[obj_idx] = input->debug_t_arr[obj_idx].count; + } + + U64 total_ti_count = sum_array_u64(input->obj_count, task.obj_ti_map_counts); + task.obj_ti_map_offsets = offsets_from_counts_array_u64(scratch.arena, task.obj_ti_map_counts, input->obj_count); + task.obj_ti_batch = push_array_no_zero(tp_temp->v[0], CV_TypeIndex, total_ti_count); + task.result.obj_ti_maps = push_array_no_zero(tp_temp->v[0], CV_TypeIndex *, input->obj_count); + + tp_for_parallel_prof(tp, 0, input->obj_count, lnk_build_obj_ti_map, &task, "Build TI Map"); + } + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { LNK_LeafRefArray unique_leaf_refs = task.unique_leaf_refs_arr[ti_source]; + task.ti_source = ti_source; task.result.count[ti_source] = unique_leaf_refs.count; task.result.v [ti_source] = push_array(tp_temp->v[0], U8 *, unique_leaf_refs.count); task.ranges = tp_divide_work(scratch.arena, unique_leaf_refs.count, tp->worker_count); - tp_for_parallel(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task, "Unbucket Leaves"); + + if (merge_flags & LNK_MergeTypeFlag_ExportHashes) { + task.result.hashes[ti_source] = push_array_no_zero(tp_temp->v[0], U64, unique_leaf_refs.count); + tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_unbucket_hashes_task, &task, "Export Hashes"); + } } - tp_for_parallel_prof(tp, 0, input->symbol_input_count, lnk_fixup_symbols_task, &task, "Fixup ID Symbols"); + if (~merge_flags & LNK_MergeTypeFlag_SkipSymbolTypeFixup) { + tp_for_parallel_prof(tp, 0, input->symbol_input_count, lnk_fixup_symbols_task, &task, "Fixup ID Symbols"); + } MemoryCopyTyped(task.result.min_type_indices, input->min_type_indices, CV_TypeIndexSource_COUNT); @@ -2609,4 +3257,3 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config ProfEnd(); return page_data_list; } - diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index 5a16f986..dc094e0f 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -4,14 +4,59 @@ #pragma once //////////////////////////////// -// CodeView +// RRT + +global read_only String8 g_rrt_magic = str8_lit_comp("RAD-TYPE-SERVER\0"); +global read_only U64 g_rrt_version = 2; + +typedef struct LNK_RRT +{ + String8 path; + + String8 type_data_raw; + union { + String8 type_hashes; + U64 **type_hashes_unpacked[CV_TypeIndexSource_COUNT]; + }; + Rng1U64 type_data_ranges[CV_TypeIndexSource_COUNT]; + String8 type_data [CV_TypeIndexSource_COUNT]; + Rng1U64 ti_ranges [CV_TypeIndexSource_COUNT]; + + U64 obj_count; + U64 *obj_leaf_counts; + U64 *obj_time_stamps; + Rng1U64 *obj_ti_ranges; + CV_TypeIndex **obj_ti_maps; + String8Array obj_paths; + Rng1U64 *obj_pch_ti_ranges; + U32 *obj_pch_indices; +} LNK_RRT; typedef struct { - CV_TypeServerInfo ts_info; - U64 ts_idx; - String8 ts_path; - U64List obj_indices; + U64 count; + LNK_RRT *v; +} LNK_RRT_Array; + +//////////////////////////////// +// CodeView + +typedef enum +{ + LNK_TypeServerKind_Null, + LNK_TypeServerKind_PDB, + LNK_TypeServerKind_RRT, +} LNK_TypeServerKind; + +typedef struct +{ + CV_TypeServerInfo ts_info; + U64 ts_idx; + LNK_TypeServerKind ts_kind; + String8 ts_path; + U64List obj_indices; + LNK_RRT *rrt; + CV_DebugH *debug_h; } LNK_TypeServer; typedef struct LNK_TypeServerNode { LNK_TypeServer v; struct LNK_TypeServerNode *next; } LNK_TypeServerNode; typedef struct LNK_TypeServerList { U64 count; LNK_TypeServerNode *first, *last; } LNK_TypeServerList; @@ -29,6 +74,8 @@ typedef struct U64 obj_count; B32 is_stripped; + LNK_RRT_Array rrt_input; + U64 count; LNK_Obj **obj_arr; CV_DebugS *debug_s_arr; @@ -37,9 +84,6 @@ typedef struct U64 *obj_to_ts; String8List *debug_s_list_arr; - String8List *debug_p_list_arr; - String8List *debug_t_list_arr; - String8List *debug_h_list_arr; U32Array int_obj_indices; U32Array ext_obj_indices; @@ -83,11 +127,22 @@ typedef struct LNK_LeafRange } LNK_LeafRange; typedef struct { U64 count; LNK_LeafRange *first, *last; } LNK_LeafRangeList; +typedef enum +{ + LNK_MergeTypeFlag_BuildObjTiMap = (1 << 0), + LNK_MergeTypeFlag_SkipSymbolTypeFixup = (1 << 1), + LNK_MergeTypeFlag_ExportHashes = (1 << 2), +} LNK_MergeTypeFlags; + typedef struct { - CV_TypeIndex min_type_indices[CV_TypeIndexSource_COUNT]; - U64 count[CV_TypeIndexSource_COUNT]; - U8 **v [CV_TypeIndexSource_COUNT]; + CV_TypeIndex min_type_indices[CV_TypeIndexSource_COUNT]; + U64 count [CV_TypeIndexSource_COUNT]; + U8 **v [CV_TypeIndexSource_COUNT]; + + // @type_server + CV_TypeIndex **obj_ti_maps; + U64 *hashes[CV_TypeIndexSource_COUNT]; } LNK_MergedTypes; typedef struct @@ -124,6 +179,13 @@ typedef struct CV_TypeIndex min_type_indices [CV_TypeIndexSource_COUNT]; LNK_LeafRefArray unique_leaf_refs_arr[CV_TypeIndexSource_COUNT]; + U64 *obj_ti_map_counts; + U64 *obj_ti_map_offsets; + CV_TypeIndex *obj_ti_batch; + + U64 pop_obj_idx; + Rng1U64 *pop_range; + LNK_MergedTypes result; } LNK_MergeTypes; @@ -172,10 +234,16 @@ typedef struct String8List *maps; } LNK_TypeNameReplacer; +//////////////////////////////// +// RRT + +internal String8List lnk_string_list_from_rrt(Arena *arena, LNK_RRT *rrt); +internal B32 lnk_rrt_from_string (Arena *arena, String8 rrt_data, String8 path, LNK_RRT *rrt_out); + //////////////////////////////// // CodeView -internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 objs_count, LNK_Obj **objs); +internal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 objs_count, LNK_Obj **objs, LNK_RRT_Array rrt_input); internal int lnk_leaf_ref_compare (LNK_LeafRef a, LNK_LeafRef b); internal int lnk_leaf_ref_is_before (void *raw_a, void *raw_b); @@ -184,11 +252,10 @@ internal U64 lnk_hash_cv_leaf (LNK_CodeViewInput internal void lnk_hash_cv_leaf_deep (Arena *arena, LNK_CodeViewInput *input, LNK_LeafRef leaf_ref, CV_TypeIndexInfoList ti_info_list); internal LNK_LeafRef * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, CV_DebugH *hashes, U64 hash, LNK_LeafRef *new_bucket); internal LNK_LeafRef * lnk_leaf_hash_table_search (LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafRef leaf_ref); -internal LNK_MergedTypes lnk_merge_types (TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input); +internal LNK_MergedTypes lnk_merge_types (TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input, LNK_MergeTypeFlags merge_flags); internal void lnk_replace_type_names_with_hashes (TP_Context *tp, TP_Arena *arena, U64 leaf_count, U8 **leaf_arr, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name); //////////////////////////////// // PDB internal String8List lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config *config, LNK_SymbolTable *symtab, LNK_CodeViewInput *cv, LNK_MergedTypes cv_types, LNK_PDB_BuilderFlags builder_flags); - diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index 499ba728..8af41797 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -45,6 +45,7 @@ lnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_ { File handle = *(File*)raw_handle; U64 write_size = file_write(handle, r1u64(offset, offset + buffer_size), buffer); + Assert(write_size == buffer_size); return write_size; } diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h index 84248631..c23d7d0f 100644 --- a/src/linker/lnk_obj.h +++ b/src/linker/lnk_obj.h @@ -7,20 +7,36 @@ typedef struct LNK_Obj { - String8 path; - String8 data; - U32 debug_t_sect_idx; - U32 debug_p_sect_idx; - U32 debug_h_sect_idx; - U32 input_idx; - COFF_FileHeaderInfo header; - U32 *comdats; - B8 hotpatch; - B8 exclude_from_debug_info; - U32Node **associated_sections; - LNK_SymbolHashTrie **symlinks; + String8 path; + String8 data; + + COFF_FileHeaderInfo header; + + // flags + B8 hotpatch; + B8 exclude_from_debug_info; + + U32 input_idx; + + // COMDAT + U32 *comdats; + U32Node **associated_sections; + LNK_SymbolHashTrie **symlinks; + + // link struct LNK_LibMemberRef *link_member; struct LNK_ObjNode *self; + + // type info + U32 debug_t_sect_idx; + U32 debug_p_sect_idx; + U32 debug_h_sect_idx; + + // @type_server + Rng1U64 ti_range; + CV_TypeIndex *ti_map; + Rng1U64 pch_ti_range; + U64 pch_obj_idx; } LNK_Obj; typedef struct LNK_ObjNode From 42cf820972d6ab5712de0c9d965e193a529262f5 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 6 Jun 2026 17:15:24 -0700 Subject: [PATCH 781/850] cache for section flags modifying the section flags is expensive with COW file mappings, Windows maps are set to 64k granularity --- src/linker/lnk.c | 94 ++++++++++++++++++----------------- src/linker/lnk_debug_info.c | 11 ++-- src/linker/lnk_obj.c | 27 +++++----- src/linker/lnk_obj.h | 2 +- src/linker/lnk_symbol_table.c | 10 ++-- 5 files changed, 72 insertions(+), 72 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 22269a89..c0c09611 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -2307,9 +2307,9 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer String8 debug_strings = {0}; for EachIndex(sect_idx, obj->header.section_count_no_null) { - COFF_SectionHeader *section_header = §ion_table[sect_idx]; - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + if (obj->section_flags[sect_idx] & LNK_SECTION_FLAG_DEBUG) { continue; } + COFF_SectionHeader *section_header = §ion_table[sect_idx]; String8 section_name = coff_name_from_section_header(string_table, section_header); U64 section_number = sect_idx+1; COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, section_header); @@ -2490,17 +2490,15 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) active_thread_count = push_array(scratch.arena, U64, 1); global_batch_list = push_array(scratch.arena, LNK_RelocRefsBatchList, 1); - // alloc live flags for each section + // alloc live flags and set live status on every non-COMDAT section is_live = push_array_no_zero(scratch.arena, U8 *, objs.count); { U64 obj_idx = 0; for EachNode(n, LNK_ObjNode, task->objs.first) { is_live[obj_idx] = push_array(scratch.arena, U8, n->data.header.section_count_no_null + 1); - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(&n->data); for EachIndex(sect_idx, n->data.header.section_count_no_null) { - COFF_SectionHeader *header = §ion_table[sect_idx]; - is_live[obj_idx][sect_idx + 1] = !(header->flags & COFF_SectionFlag_LnkCOMDAT); + is_live[obj_idx][sect_idx + 1] = !(n->data.section_flags[sect_idx] & COFF_SectionFlag_LnkCOMDAT); } obj_idx += 1; @@ -2534,13 +2532,13 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) LNK_Obj *obj = &obj_n->data; for EachIndex(sect_idx, obj->header.section_count_no_null) { U32 section_number = sect_idx+1; - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); + COFF_SectionFlags section_flags = obj->section_flags[sect_idx]; // is section eligible for walking? - if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } - if (section_header->flags & COFF_SectionFlag_LnkCOMDAT) { continue; } - if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + if (section_flags & COFF_SectionFlag_LnkRemove) { continue; } + if (section_flags & COFF_SectionFlag_LnkCOMDAT) { continue; } + if (section_flags & COFF_SectionFlag_LnkInfo) { continue; } + if (section_flags & LNK_SECTION_FLAG_DEBUG) { continue; } // divide relocs and push task for each reloc block COFF_RelocArray relocs = lnk_coff_reloc_info_from_section_number(obj, section_number); @@ -2643,16 +2641,16 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) SLLStackPush(stack, stack_n); } - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(ref_symbol.obj, section_number); + COFF_SectionFlags section_flags = ref_symbol.obj->section_flags[section_number-1]; // on first section visit, set live flag and enqueue section U8 was_visited = ins_atomic_u8_eval_assign(&is_live[ref_symbol.obj->input_idx][section_number], 1); if (was_visited) { continue; } // is section eligible for walking? - if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } - if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + if (section_flags & COFF_SectionFlag_LnkRemove) { continue; } + if (section_flags & COFF_SectionFlag_LnkInfo) { continue; } + if (section_flags & LNK_SECTION_FLAG_DEBUG) { continue; } LNK_RelocRefs refs = {0}; refs.obj = ref_symbol.obj; @@ -2721,14 +2719,15 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) if (is_live[obj->input_idx][section_number]) { continue; } COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); - section_header->flags |= COFF_SectionFlag_LnkRemove; + obj->section_flags[sect_idx] |= COFF_SectionFlag_LnkRemove; + COFF_SectionFlags section_flags = obj->section_flags[sect_idx]; U64 stat_kind = Stat_Null; - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { stat_kind = Stat_Debug; } - else if (section_header->flags & COFF_SectionFlag_CntCode) { stat_kind = Stat_Code; } + if (section_flags & LNK_SECTION_FLAG_DEBUG) { stat_kind = Stat_Debug; } + else if (section_flags & COFF_SectionFlag_CntCode) { stat_kind = Stat_Code; } else { stat_kind = Stat_Data; } - if (section_header->flags & COFF_SectionFlag_CntUninitializedData) { + if (section_flags & COFF_SectionFlag_CntUninitializedData) { stats[stat_kind].vsize += section_header->vsize; } else { stats[stat_kind].fsize += section_header->fsize; @@ -2788,13 +2787,14 @@ THREAD_POOL_TASK_FUNC(lnk_gather_section_definitions_task) for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { COFF_SectionHeader *sect_header = §ion_table[sect_idx]; + COFF_SectionFlags sect_flags = obj->section_flags[sect_idx]; - if (~sect_header->flags & COFF_SectionFlag_LnkRemove && ~sect_header->flags & COFF_SectionFlag_LnkInfo && sect_header->fsize > 0) { + if (~sect_flags & COFF_SectionFlag_LnkRemove && ~sect_flags & COFF_SectionFlag_LnkInfo && sect_header->fsize > 0) { Temp temp = temp_begin(scratch.arena); // was section defined? String8 sect_name = coff_name_from_section_header(string_table, sect_header); - String8 sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, sect_header->flags & ~COFF_SectionFlags_LnkFlags); + String8 sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, sect_flags & ~COFF_SectionFlags_LnkFlags); LNK_SectionDefinition *sect_defn = hash_table_search_string_raw(sect_defn_ht, sect_name_with_flags); // push new section definition @@ -2803,7 +2803,7 @@ THREAD_POOL_TASK_FUNC(lnk_gather_section_definitions_task) sect_defn->name = sect_name; sect_defn->obj = obj; sect_defn->obj_sect_idx = sect_idx; - sect_defn->flags = sect_header->flags & ~COFF_SectionFlags_LnkFlags; + sect_defn->flags = sect_flags & ~COFF_SectionFlags_LnkFlags; sect_name_with_flags = push_str8_copy(arena, sect_name_with_flags); hash_table_push_string_raw(arena, sect_defn_ht, sect_name_with_flags, sect_defn); @@ -2835,25 +2835,26 @@ THREAD_POOL_TASK_FUNC(lnk_gather_section_contribs_task) for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { LNK_SectionContrib *sc = task->null_sc; COFF_SectionHeader *sect_header = §ion_table[sect_idx]; - if (~sect_header->flags & COFF_SectionFlag_LnkRemove && ~sect_header->flags & COFF_SectionFlag_LnkInfo && sect_header->fsize > 0) { + COFF_SectionFlags sect_flags = obj->section_flags[sect_idx]; + if (~sect_flags & COFF_SectionFlag_LnkRemove && ~sect_flags & COFF_SectionFlag_LnkInfo && sect_header->fsize > 0) { LNK_SectionContribChunk *sc_chunk = 0; { Temp temp = temp_begin(scratch.arena); String8 sect_name = coff_name_from_section_header(string_table, sect_header); - String8 sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, sect_header->flags & ~COFF_SectionFlags_LnkFlags); + String8 sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, sect_flags & ~COFF_SectionFlags_LnkFlags); sc_chunk = hash_table_search_string_raw(task->contribs_ht, sect_name_with_flags); temp_end(temp); } if (sc_chunk) { String8 data; - if (sect_header->flags & COFF_SectionFlag_CntUninitializedData) { + if (sect_flags & COFF_SectionFlag_CntUninitializedData) { data = str8(0, sect_header->fsize); } else { data = str8_substr(obj->data, rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize)); } - U16 sc_align = coff_align_size_from_section_flags(sect_header->flags); + U16 sc_align = coff_align_size_from_section_flags(sect_flags); sc = lnk_section_contrib_chunk_push_atomic(sc_chunk, 1); sc->first_data_node.next = 0; sc->first_data_node.string = data; @@ -2881,8 +2882,7 @@ THREAD_POOL_TASK_FUNC(lnk_set_comdat_leaders_contribs_task) for EachIndex(sect_idx, obj->header.section_count_no_null) { U64 section_number = sect_idx+1; - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); - if (~section_header->flags & COFF_SectionFlag_LnkCOMDAT) { continue; } + if (~obj->section_flags[sect_idx] & COFF_SectionFlag_LnkCOMDAT) { continue; } LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(obj, section_number); if (symlink == 0) { continue; } @@ -2906,8 +2906,7 @@ THREAD_POOL_TASK_FUNC(lnk_flag_debug_symbols_task) symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx); COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class); if (interp == COFF_SymbolValueInterp_Regular) { - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number); - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { + if (obj->section_flags[symbol.section_number-1] & LNK_SECTION_FLAG_DEBUG) { task->u.patch_symtabs.was_symbol_patched[obj_idx][symbol_idx] = 1; } } @@ -3248,13 +3247,14 @@ THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher) for EachIndex(sect_idx, obj_header.section_count_no_null) { COFF_SectionHeader *section_header = §ion_table[sect_idx]; + COFF_SectionFlags section_flags = obj->section_flags[sect_idx]; - if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } - if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } - if (section_header->flags & COFF_SectionFlag_CntUninitializedData) { continue; } + if (section_flags & COFF_SectionFlag_LnkInfo) { continue; } + if (section_flags & COFF_SectionFlag_LnkRemove) { continue; } + if (section_flags & COFF_SectionFlag_CntUninitializedData) { continue; } // get section bytes (special case debug info because it is not copied to the image) - String8 data = section_header->flags & LNK_SECTION_FLAG_DEBUG ? obj->data : task->image_data; + String8 data = section_flags & LNK_SECTION_FLAG_DEBUG ? obj->data : task->image_data; Rng1U64 section_frange = rng_1u64(section_header->foff, section_header->foff + section_header->fsize); String8 section_data = str8_substr(data, section_frange); @@ -3285,7 +3285,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher) COFF_SymbolValueInterpType interp = coff_interp_from_parsed_symbol(symbol); if (interp == COFF_SymbolValueInterp_Regular) { if (symbol.section_number == lnk_obj_get_removed_section_number(obj)) { - if (~section_header->flags & LNK_SECTION_FLAG_DEBUG) { + if (~section_flags & LNK_SECTION_FLAG_DEBUG) { String8 sect_name = coff_name_from_section_header(string_table, §ion_table[sect_idx]); lnk_error_obj(LNK_Error_RelocationAgainstRemovedSection, obj, "relocating against symbol that is in a removed section (symbol: %S, reloc-section: %S 0x%llx, reloc-index: 0x%llx)", symbol.name, sect_name, sect_idx+1, reloc_idx); } @@ -3399,10 +3399,9 @@ THREAD_POOL_TASK_FUNC(lnk_flag_hotpatch_contribs_task) symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx); COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class); if (interp == COFF_SymbolValueInterp_Regular && COFF_SymbolType_IsFunc(symbol.type)) { - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number); LNK_SectionContrib *sc = task->sect_map[obj_idx][symbol.section_number-1]; if (sc != task->null_sc) { - sc->hotpatch = !!(section_header->flags & COFF_SectionFlag_CntCode); + sc->hotpatch = !!(obj->section_flags[symbol.section_number-1] & COFF_SectionFlag_CntCode); } } } @@ -3766,7 +3765,7 @@ THREAD_POOL_TASK_FUNC(lnk_patch_virtual_offsets_and_sizes_in_obj_section_headers COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { COFF_SectionHeader *sect_header = §ion_table[sect_idx]; - if (~sect_header->flags & COFF_SectionFlag_LnkRemove) { + if (~obj->section_flags[sect_idx] & COFF_SectionFlag_LnkRemove) { LNK_SectionContrib *sc = task->sect_map[obj_idx][sect_idx]; LNK_Section *sect = task->image_sects.v[sc->u.sect_idx]; sect_header->vsize = lnk_size_from_section_contrib(sc); @@ -3787,8 +3786,9 @@ THREAD_POOL_TASK_FUNC(lnk_patch_file_offsets_and_sizes_in_obj_section_headers_ta COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { COFF_SectionHeader *sect_header = §ion_table[sect_idx]; - B32 patch_section_header = (~sect_header->flags & COFF_SectionFlag_LnkRemove) && - (~sect_header->flags & LNK_SECTION_FLAG_DEBUG); + COFF_SectionFlags sect_flags = obj->section_flags[sect_idx]; + B32 patch_section_header = (~sect_flags & COFF_SectionFlag_LnkRemove) && + (~sect_flags & LNK_SECTION_FLAG_DEBUG); if (patch_section_header) { LNK_SectionContrib *sc = task->sect_map[obj_idx][sect_idx]; LNK_Section *sect = task->image_sects.v[sc->u.sect_idx]; @@ -3819,9 +3819,10 @@ THREAD_POOL_TASK_FUNC(lnk_patch_section_symbols_task) COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); for EachIndex(sect_idx, obj->header.section_count_no_null) { COFF_SectionHeader *section_header = §ion_table[sect_idx]; - if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } - if (section_header->flags & COFF_SectionFlag_LnkInfo) { continue; } - if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + COFF_SectionFlags section_flags = obj->section_flags[sect_idx]; + if (section_flags & COFF_SectionFlag_LnkRemove) { continue; } + if (section_flags & COFF_SectionFlag_LnkInfo) { continue; } + if (section_flags & LNK_SECTION_FLAG_DEBUG) { continue; } COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, section_header); for EachIndex(reloc_idx, relocs.count) { if (relocs.v[reloc_idx].isymbol == symbol_idx) { @@ -3897,7 +3898,7 @@ THREAD_POOL_TASK_FUNC(lnk_gather_base_reloc_pages_task) ProfBeginV("%S", obj->path); for EachIndex(sect_idx, obj->header.section_count_no_null) { COFF_SectionHeader *sect_header = §_table[sect_idx]; - if (sect_header->flags & COFF_SectionFlag_LnkRemove) { continue; } + if (obj->section_flags[sect_idx] & COFF_SectionFlag_LnkRemove) { continue; } COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, sect_header); for EachIndex(reloc_idx, relocs.count) { @@ -5051,7 +5052,7 @@ lnk_obj_sect_idx_from_section(Arena *arena, U64 objs_count, LNK_Obj **objs, LNK_ String8 section_name, section_postfix; coff_parse_section_name(full_section_name, §ion_name, §ion_postfix); - if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; } + if (obj->section_flags[sect_idx] & COFF_SectionFlag_LnkRemove) { continue; } if (section_header->fsize == 0) { continue; } if (lnk_is_section_removed(config, section_name)) { continue; } @@ -5222,7 +5223,8 @@ lnk_build_rad_map(Arena *arena, String8 image_data, LNK_Config *config, U64 objs COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(obj->data, obj->header.section_table_range.min, 0); for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { COFF_SectionHeader *section_header = §ion_table[sect_idx]; - if (~section_header->flags & COFF_SectionFlag_LnkRemove && section_header->flags & LNK_SECTION_FLAG_DEBUG) { + COFF_SectionFlags section_flags = obj->section_flags[sect_idx]; + if (~section_flags & COFF_SectionFlag_LnkRemove && section_flags & LNK_SECTION_FLAG_DEBUG) { LNK_Lib *lib = lnk_obj_get_lib(obj); if (lib) { String8 lib_name = str8_chop_last_dot(str8_skip_last_slash(lib->path)); diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index cb9b8830..ea9c8f2b 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -3050,10 +3050,11 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { COFF_SectionHeader *obj_sect_header = &obj_section_table[sect_idx]; + COFF_SectionFlags obj_sect_flags = obj->section_flags[sect_idx]; - if (obj_sect_header->flags & COFF_SectionFlag_LnkInfo) { continue; } - if (obj_sect_header->flags & COFF_SectionFlag_LnkRemove) { continue; } - if (obj_sect_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; } + if (obj_sect_flags & COFF_SectionFlag_LnkInfo) { continue; } + if (obj_sect_flags & COFF_SectionFlag_LnkRemove) { continue; } + if (obj_sect_flags & LNK_SECTION_FLAG_DEBUG) { continue; } String8 header_name = str8_cstring_capped(obj_sect_header->name, obj_sect_header->name + sizeof(obj_sect_header->name)); if (str8_match(header_name, str8_lit(".pdata"), 0)) { continue; } @@ -3062,7 +3063,7 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) String8 sect_data; U32 sect_off; U32 data_crc; - if (obj_sect_header->flags & COFF_SectionFlag_CntUninitializedData) { + if (obj_sect_flags & COFF_SectionFlag_CntUninitializedData) { if (obj_sect_header->vsize == 0) { continue; } U64 sect_num = rng1u64_array_num_from_value__binary_search(&task->image_section_virt_ranges, obj_sect_header->voff); @@ -3088,7 +3089,7 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) sc->data.base.pad0 = 0; sc->data.base.sec_off = sect_off; sc->data.base.size = obj_sect_header->vsize; - sc->data.base.flags = obj_sect_header->flags; + sc->data.base.flags = obj_sect_flags; sc->data.base.mod = mod->imod; sc->data.base.pad1 = 0; sc->data.data_crc = 0; diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 99760eb0..5037fbe6 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -97,10 +97,12 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) // error check section headers // COFF_SectionHeader *coff_section_table = (COFF_SectionHeader *)raw_coff_section_table.str; + COFF_SectionFlags *section_flags = push_array_no_zero(arena, COFF_SectionFlags, header.section_count_no_null); for (U64 sect_idx = 0; sect_idx < header.section_count_no_null; sect_idx += 1) { COFF_SectionHeader *coff_sect_header = &coff_section_table[sect_idx]; + section_flags[sect_idx] = coff_sect_header->flags; String8 sect_name = coff_name_from_section_header(raw_coff_string_table, coff_sect_header); - if (~coff_sect_header->flags & COFF_SectionFlag_CntUninitializedData) { + if (~section_flags[sect_idx] & COFF_SectionFlag_CntUninitializedData) { if (coff_sect_header->fsize > 0) { Rng1U64 sect_range = rng_1u64(coff_sect_header->foff, coff_sect_header->foff + coff_sect_header->fsize); if (contains_1u64(header.header_range, coff_sect_header->foff) || @@ -166,7 +168,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) if (symbol.storage_class == COFF_SymStorageClass_Static) { if (symbol.section_number > 0 && symbol.section_number <= header.section_count_no_null) { COFF_SectionHeader *sect_header = &coff_section_table[symbol.section_number-1]; - if (sect_header->flags & COFF_SectionFlag_LnkCOMDAT) { + if (section_flags[symbol.section_number-1] & COFF_SectionFlag_LnkCOMDAT) { if (symbol.aux_symbol_count) { U32 section_length = 0; coff_parse_secdef(symbol, header.is_big_obj, 0, 0, §ion_length, 0); @@ -270,14 +272,14 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) // debug info if (str8_starts_with(sect_name, str8_lit(".debug$"))) { - sect_header->flags |= LNK_SECTION_FLAG_DEBUG; + section_flags[sect_idx] |= LNK_SECTION_FLAG_DEBUG; } // function overrides if (str8_ends_with(sect_name, str8_lit("$fo$"), 0) || str8_ends_with(sect_name, str8_lit("$fo_rvas$"), 0) || str8_ends_with(sect_name, str8_lit("$fo_bdd$"), 0)) { - sect_header->flags |= COFF_SectionFlag_LnkInfo; + section_flags[sect_idx] |= COFF_SectionFlag_LnkInfo; } } } @@ -295,7 +297,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) CV_Symbol comp_symbol = {0}; for EachIndex(sect_idx, header.section_count_no_null) { COFF_SectionHeader *sect_header = &coff_section_table[sect_idx]; - if (sect_header->flags & LNK_SECTION_FLAG_DEBUG) { + if (section_flags[sect_idx] & LNK_SECTION_FLAG_DEBUG) { String8 name = str8_cstring_capped(sect_header->name, sect_header->name+sizeof(sect_header->name)); if (str8_match(name, str8_lit(".debug$S"), 0)) { Temp temp = temp_begin(scratch.arena); @@ -332,6 +334,7 @@ THREAD_POOL_TASK_FUNC(lnk_obj_initer) obj->data = input->data; obj->path = push_str8_copy(arena, input->path); obj->header = header; + obj->section_flags = section_flags; obj->comdats = comdats; obj->exclude_from_debug_info = input->exclude_from_debug_info; obj->hotpatch = hotpatch; @@ -414,8 +417,7 @@ THREAD_POOL_TASK_FUNC(lnk_input_coff_symbol_table) switch (interp) { case COFF_SymbolValueInterp_Regular: { if (symbol.storage_class == COFF_SymStorageClass_External) { - COFF_SectionHeader *sect_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number); - if (sect_header->flags & COFF_SectionFlag_LnkRemove) { + if (obj->section_flags[symbol.section_number-1] & COFF_SectionFlag_LnkRemove) { break; } LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx); @@ -459,8 +461,7 @@ lnk_symlinks_from_obj(Arena *arena, LNK_SymbolTable *symtab, LNK_Obj *obj) symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx); COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class); if (interp == COFF_SymbolValueInterp_Regular && symbol.aux_symbol_count == 0 && symbol.storage_class == COFF_SymStorageClass_External) { - COFF_SectionHeader *sect_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number); - if (sect_header->flags & COFF_SectionFlag_LnkCOMDAT) { + if (obj->section_flags[symbol.section_number-1] & COFF_SectionFlag_LnkCOMDAT) { if (symlinks[symbol.section_number] == 0 || symbol.value == 0) { symlinks[symbol.section_number] = lnk_symbol_table_search_(symtab, symbol.name); } @@ -634,7 +635,7 @@ THREAD_POOL_TASK_FUNC(lnk_collect_obj_chunks_task) for (U32 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { COFF_SectionHeader *section_header = §ion_table[sect_idx]; - if (section_header->flags & COFF_SectionFlag_LnkRemove) { + if (obj->section_flags[sect_idx] & COFF_SectionFlag_LnkRemove) { if (!task->collect_discarded) { continue; } @@ -721,10 +722,11 @@ lnk_raw_directives_from_obj(Arena *arena, LNK_Obj *obj) String8List drectve_data = {0}; for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { COFF_SectionHeader *sect_header = §ion_table[sect_idx]; - if (sect_header->flags & COFF_SectionFlag_LnkInfo) { + COFF_SectionFlags sect_flags = obj->section_flags[sect_idx]; + if (sect_flags & COFF_SectionFlag_LnkInfo) { String8 sect_name = str8_cstring_capped(sect_header->name, sect_header->name + sizeof(sect_header->name)); if (str8_match(sect_name, str8_lit(".drectve"), 0)) { - if (sect_header->flags & COFF_SectionFlag_CntUninitializedData) { + if (sect_flags & COFF_SectionFlag_CntUninitializedData) { lnk_error_obj(LNK_Error_IllData, obj, ".drectve section header has flag COFF_SectionFlag_CntUninitializedData"); break; } @@ -797,4 +799,3 @@ lnk_debug_s_from_obj(Arena *arena, LNK_Obj *obj) scratch_end(scratch); return debug_s; } - diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h index c23d7d0f..c6271125 100644 --- a/src/linker/lnk_obj.h +++ b/src/linker/lnk_obj.h @@ -11,6 +11,7 @@ typedef struct LNK_Obj String8 data; COFF_FileHeaderInfo header; + COFF_SectionFlags *section_flags; // flags B8 hotpatch; @@ -153,4 +154,3 @@ internal LNK_DirectiveInfo lnk_directive_info_from_raw_directives(Arena *arena, // --- Debug Info -------------------------------------------------------------- internal CV_DebugS lnk_debug_s_from_obj(Arena *arena, LNK_Obj *obj); - diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index 4b945827..be62e536 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -337,15 +337,13 @@ lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) if (dst_interp == COFF_SymbolValueInterp_Regular) { // remove replaced section from the output - COFF_SectionHeader *dst_sect = lnk_coff_section_header_from_section_number(dst_ref.obj, dst_parsed.section_number); - dst_sect->flags |= COFF_SectionFlag_LnkRemove; + dst_ref.obj->section_flags[dst_parsed.section_number-1] |= COFF_SectionFlag_LnkRemove; // remove associated sections from the output for (U32Node *associated_section = dst_ref.obj->associated_sections[dst_parsed.section_number]; associated_section != 0; associated_section = associated_section->next) { - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(dst_ref.obj, associated_section->data); - section_header->flags |= COFF_SectionFlag_LnkRemove; + dst_ref.obj->section_flags[associated_section->data-1] |= COFF_SectionFlag_LnkRemove; } } @@ -362,8 +360,7 @@ lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) LNK_ObjSymbolRef src_ref = lnk_ref_from_symbol(src); if (src_interp == COFF_SymbolValueInterp_Regular) { - COFF_SectionHeader *src_sect = lnk_coff_section_header_from_section_number(src_ref.obj, src_parsed.section_number); - AssertAlways(~src_sect->flags & COFF_SectionFlag_LnkRemove); + AssertAlways(~src_ref.obj->section_flags[src_parsed.section_number-1] & COFF_SectionFlag_LnkRemove); } } #endif @@ -804,4 +801,3 @@ lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab) ProfEnd(); } - From 9ce6b9504b234d12bbd6102457c1467011d88432 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sat, 6 Jun 2026 18:02:15 -0700 Subject: [PATCH 782/850] centralize section header reads and writes --- src/linker/lnk_debug_info.c | 64 +++++++++---------- src/linker/lnk_obj.c | 112 ++++++++++++++++++++-------------- src/linker/lnk_obj.h | 19 +++++- src/linker/lnk_symbol_table.c | 21 ++++--- 4 files changed, 126 insertions(+), 90 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index ea9c8f2b..4dc7d2ea 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -65,9 +65,9 @@ THREAD_POOL_TASK_FUNC(lnk_parse_debug_h_task) LNK_Obj *obj = task->obj_arr[obj_idx]; if (obj->debug_h_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *sect_header = lnk_coff_section_header_from_section_number(obj, obj->debug_h_sect_idx + 1); + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, obj->debug_h_sect_idx); - String8 raw_debug_h = str8_substr(obj->data, r1u64(sect_header->foff, sect_header->foff + sect_header->fsize)); + String8 raw_debug_h = str8_substr(obj->data, section.frange); CV_DebugH *debug_h = &task->debug_h_arr[obj_idx]; LLVM_GHash ghash = {0}; U64 ghash_read_size = str8_deserial_read_struct(raw_debug_h, 0, &ghash); @@ -706,17 +706,14 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, for EachNode(n, String8Node, input.debug_s_list_arr[obj_idx].first) { total_debug_s_size += n->string.size; } if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - total_debug_t_size += section_table[obj->debug_t_sect_idx].fsize; + total_debug_t_size += lnk_obj_section_from_sect_idx(obj, obj->debug_t_sect_idx).header->fsize; } if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - total_debug_p_size += section_table[obj->debug_p_sect_idx].fsize; + total_debug_p_size += lnk_obj_section_from_sect_idx(obj, obj->debug_p_sect_idx).header->fsize; } if (config->ghash) { if (obj->debug_h_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - total_debug_h_size += section_table[obj->debug_h_sect_idx].fsize; + total_debug_h_size += lnk_obj_section_from_sect_idx(obj, obj->debug_h_sect_idx).header->fsize; } } } @@ -757,16 +754,16 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, LNK_Obj *obj = obj_arr[obj_idx]; if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *debug_t_hdr = &lnk_coff_section_table_from_obj(obj)[obj->debug_t_sect_idx]; + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, obj->debug_t_sect_idx); raw_debug_t_arr[obj_idx].count = 1; raw_debug_t_arr[obj_idx].v = push_array(scratch.arena, String8, 1); - raw_debug_t_arr[obj_idx].v[0] = str8_substr(obj->data, r1u64(debug_t_hdr->foff, debug_t_hdr->foff + debug_t_hdr->fsize)); + raw_debug_t_arr[obj_idx].v[0] = str8_substr(obj->data, section.frange); } if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *debug_p_hdr = &lnk_coff_section_table_from_obj(obj)[obj->debug_p_sect_idx]; + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, obj->debug_p_sect_idx); raw_debug_p_arr[obj_idx].count = 1; raw_debug_p_arr[obj_idx].v = push_array(scratch.arena, String8, 1); - raw_debug_p_arr[obj_idx].v[0] = str8_substr(obj->data, r1u64(debug_p_hdr->foff, debug_p_hdr->foff + debug_p_hdr->fsize)); + raw_debug_p_arr[obj_idx].v[0] = str8_substr(obj->data, section.frange); } } @@ -3044,42 +3041,41 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) PDB_DbiModule *mod = task->mod_arr [obj_idx]; LNK_Obj *obj = task->cv->obj_arr[obj_idx]; - COFF_SectionHeader *obj_section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; - PDB_DbiSectionContribNode *sc_arr = push_array_no_zero(arena, PDB_DbiSectionContribNode, obj->header.section_count_no_null); - U64 sc_count = 0; + PDB_DbiSectionContribNode *sc_arr = push_array_no_zero(arena, PDB_DbiSectionContribNode, obj->header.section_count_no_null); + U64 sc_count = 0; for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { - COFF_SectionHeader *obj_sect_header = &obj_section_table[sect_idx]; - COFF_SectionFlags obj_sect_flags = obj->section_flags[sect_idx]; + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); - if (obj_sect_flags & COFF_SectionFlag_LnkInfo) { continue; } - if (obj_sect_flags & COFF_SectionFlag_LnkRemove) { continue; } - if (obj_sect_flags & LNK_SECTION_FLAG_DEBUG) { continue; } + if (*section.flags & COFF_SectionFlag_LnkInfo) { continue; } + if (*section.flags & COFF_SectionFlag_LnkRemove) { continue; } + if (*section.flags & LNK_SECTION_FLAG_DEBUG) { continue; } - String8 header_name = str8_cstring_capped(obj_sect_header->name, obj_sect_header->name + sizeof(obj_sect_header->name)); - if (str8_match(header_name, str8_lit(".pdata"), 0)) { continue; } + if (str8_match(section.name, str8_lit(".pdata"), 0)) { continue; } U64 sect_number; String8 sect_data; U32 sect_off; U32 data_crc; - if (obj_sect_flags & COFF_SectionFlag_CntUninitializedData) { - if (obj_sect_header->vsize == 0) { continue; } + if (*section.flags & COFF_SectionFlag_CntUninitializedData) { + if (dim_1u64(section.vrange) == 0) { continue; } - U64 sect_num = rng1u64_array_num_from_value__binary_search(&task->image_section_virt_ranges, obj_sect_header->voff); - sect_number = sect_num-1; + U64 search_result = rng1u64_array_num_from_value__binary_search(&task->image_section_virt_ranges, section.vrange.min); + sect_number = search_result-1; Assert(sect_number < task->image_section_virt_ranges.count); + sect_data = str8_zero(); - sect_off = obj_sect_header->voff - task->image_section_virt_ranges.v[sect_number].min; + sect_off = section.vrange.min - task->image_section_virt_ranges.v[sect_number].min; data_crc = 0; } else { - if (obj_sect_header->fsize == 0) { continue; } + if (dim_1u64(section.frange) == 0) { continue; } - U64 sect_num = rng1u64_array_num_from_value__binary_search(&task->image_section_file_ranges, obj_sect_header->foff); - sect_number = sect_num-1; + U64 search_result = rng1u64_array_num_from_value__binary_search(&task->image_section_file_ranges, section.frange.min); + sect_number = search_result-1; Assert(sect_number < task->image_section_file_ranges.count); - sect_data = str8_substr(task->image_data, rng_1u64(obj_sect_header->foff, obj_sect_header->foff + obj_sect_header->fsize)); - sect_off = obj_sect_header->foff - task->image_section_file_ranges.v[sect_number].min; + + sect_data = str8_substr(task->image_data, section.frange); + sect_off = section.frange.min - task->image_section_file_ranges.v[sect_number].min; data_crc = update_crc32(0, sect_data.str, sect_data.size); } @@ -3088,8 +3084,8 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) sc->data.base.sec = (U16)sect_number; sc->data.base.pad0 = 0; sc->data.base.sec_off = sect_off; - sc->data.base.size = obj_sect_header->vsize; - sc->data.base.flags = obj_sect_flags; + sc->data.base.size = dim_1u64(section.vrange); + sc->data.base.flags = *section.flags; sc->data.base.mod = mod->imod; sc->data.base.pad1 = 0; sc->data.data_crc = 0; diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index 5037fbe6..dccdfe4c 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -350,15 +350,13 @@ internal THREAD_POOL_TASK_FUNC(lnk_obj_find_debug_t) { LNK_Obj *obj = &((LNK_ObjNode *)raw_task)[task_id].data; - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); for EachIndex(sect_idx, obj->header.section_count_no_null) { - COFF_SectionHeader *sect_header = §ion_table[sect_idx]; - String8 sect_name = coff_name_from_section_header(str8_zero(), sect_header); - if (str8_match(sect_name, str8_lit(".debug$T"), 0)) { + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); + if (str8_match(section.name, str8_lit(".debug$T"), 0)) { obj->debug_t_sect_idx = sect_idx; - } else if (str8_match(sect_name, str8_lit(".debug$P"), 0)) { + } else if (str8_match(section.name, str8_lit(".debug$P"), 0)) { obj->debug_p_sect_idx = sect_idx; - } else if (str8_match(sect_name, str8_lit(".debug$H"), 0)) { + } else if (str8_match(section.name, str8_lit(".debug$H"), 0)) { obj->debug_h_sect_idx = sect_idx; } } @@ -417,7 +415,8 @@ THREAD_POOL_TASK_FUNC(lnk_input_coff_symbol_table) switch (interp) { case COFF_SymbolValueInterp_Regular: { if (symbol.storage_class == COFF_SymStorageClass_External) { - if (obj->section_flags[symbol.section_number-1] & COFF_SectionFlag_LnkRemove) { + LNK_ObjSection section = lnk_obj_section_from_section_number(obj, symbol.section_number); + if (*section.flags & COFF_SectionFlag_LnkRemove) { break; } LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx); @@ -461,7 +460,8 @@ lnk_symlinks_from_obj(Arena *arena, LNK_SymbolTable *symtab, LNK_Obj *obj) symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx); COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class); if (interp == COFF_SymbolValueInterp_Regular && symbol.aux_symbol_count == 0 && symbol.storage_class == COFF_SymStorageClass_External) { - if (obj->section_flags[symbol.section_number-1] & COFF_SectionFlag_LnkCOMDAT) { + LNK_ObjSection section = lnk_obj_section_from_section_number(obj, symbol.section_number); + if (*section.flags & COFF_SectionFlag_LnkCOMDAT) { if (symlinks[symbol.section_number] == 0 || symbol.value == 0) { symlinks[symbol.section_number] = lnk_symbol_table_search_(symtab, symbol.name); } @@ -551,11 +551,47 @@ lnk_obj_get_comdat_symlink(LNK_Obj *obj, U64 section_number) } internal COFF_SectionHeader * -lnk_coff_section_header_from_section_number(LNK_Obj *obj, U64 section_number) +lnk_coff_section_table_from_obj(LNK_Obj *obj) { - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; - COFF_SectionHeader *section_header = §ion_table[section_number-1]; - return section_header; + return (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; +} + +internal U64 +lnk_obj_sect_idx_from_section_number(LNK_Obj *obj, U64 section_number) +{ + Assert(1 <= section_number && section_number <= obj->header.section_count_no_null); + return section_number-1; +} + +internal U64 +lnk_obj_section_number_from_sect_idx(LNK_Obj *obj, U64 sect_idx) +{ + Assert(sect_idx < obj->header.section_count_no_null); + return sect_idx+1; +} + +internal LNK_ObjSection +lnk_obj_section_from_sect_idx(LNK_Obj *obj, U64 sect_idx) +{ + Assert(sect_idx < obj->header.section_count_no_null); + LNK_ObjSection section = {0}; + section.obj = obj; + section.sect_idx = sect_idx; + section.section_number = sect_idx+1; + section.header = &lnk_coff_section_table_from_obj(obj)[sect_idx]; + section.flags = &obj->section_flags[sect_idx]; + section.name = coff_name_from_section_header(lnk_coff_string_table_from_obj(obj), section.header); + section.vrange = rng_1u64(section.header->voff, section.header->voff + section.header->vsize); + section.frange = rng_1u64(section.header->foff, section.header->foff + section.header->fsize); + section.reloc_count = section.header->reloc_count; + return section; +} + +internal LNK_ObjSection +lnk_obj_section_from_section_number(LNK_Obj *obj, U64 section_number) +{ + U64 sect_idx = lnk_obj_sect_idx_from_section_number(obj, section_number); + return lnk_obj_section_from_sect_idx(obj, sect_idx); } internal COFF_RelocArray @@ -567,12 +603,6 @@ lnk_coff_relocs_from_section_header(LNK_Obj *obj, COFF_SectionHeader *section_he return result; } -internal COFF_SectionHeader * -lnk_coff_section_table_from_obj(LNK_Obj *obj) -{ - return (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; -} - internal String8 lnk_coff_string_table_from_obj(LNK_Obj *obj) { @@ -588,10 +618,10 @@ lnk_coff_symbol_table_from_obj(LNK_Obj *obj) internal COFF_RelocArray lnk_coff_reloc_info_from_section_number(LNK_Obj *obj, U64 section_number) { - COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number); - COFF_RelocInfo reloc_info = coff_reloc_info_from_section_header(obj->data, section_header); - COFF_Reloc *relocs = str8_deserial_get_raw_ptr(obj->data, reloc_info.array_off, sizeof(*relocs)*reloc_info.count); - COFF_RelocArray result = { .count = reloc_info.count, .v = relocs }; + LNK_ObjSection section = lnk_obj_section_from_section_number(obj, section_number); + COFF_RelocInfo reloc_info = coff_reloc_info_from_section_header(obj->data, section.header); + COFF_Reloc *relocs = str8_deserial_get_raw_ptr(obj->data, reloc_info.array_off, sizeof(*relocs)*reloc_info.count); + COFF_RelocArray result = { .count = reloc_info.count, .v = relocs }; return result; } @@ -630,20 +660,17 @@ THREAD_POOL_TASK_FUNC(lnk_collect_obj_chunks_task) LNK_SectionCollector *task = raw_task; LNK_Obj *obj = task->objs[task_id]; - COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str; - String8 string_table = str8_substr(obj->data, obj->header.string_table_range); for (U32 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { - COFF_SectionHeader *section_header = §ion_table[sect_idx]; + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); - if (obj->section_flags[sect_idx] & COFF_SectionFlag_LnkRemove) { + if (*section.flags & COFF_SectionFlag_LnkRemove) { if (!task->collect_discarded) { continue; } } - String8 section_name = coff_name_from_section_header(string_table, section_header); - if (str8_match(section_name, task->name, 0)) { - String8 section_data = str8_substr(obj->data, rng_1u64(section_header->foff, section_header->foff + section_header->fsize)); + if (str8_match(section.name, task->name, 0)) { + String8 section_data = str8_substr(obj->data, section.frange); str8_list_push(arena, &task->out_lists[task_id], section_data); } } @@ -718,28 +745,24 @@ lnk_parse_msvc_linker_directive(Arena *arena, LNK_Obj *obj, LNK_DirectiveInfo *d internal String8List lnk_raw_directives_from_obj(Arena *arena, LNK_Obj *obj) { - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); String8List drectve_data = {0}; for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { - COFF_SectionHeader *sect_header = §ion_table[sect_idx]; - COFF_SectionFlags sect_flags = obj->section_flags[sect_idx]; - if (sect_flags & COFF_SectionFlag_LnkInfo) { - String8 sect_name = str8_cstring_capped(sect_header->name, sect_header->name + sizeof(sect_header->name)); - if (str8_match(sect_name, str8_lit(".drectve"), 0)) { - if (sect_flags & COFF_SectionFlag_CntUninitializedData) { + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); + if (*section.flags & COFF_SectionFlag_LnkInfo) { + if (str8_match(section.name, str8_lit(".drectve"), 0)) { + if (*section.flags & COFF_SectionFlag_CntUninitializedData) { lnk_error_obj(LNK_Error_IllData, obj, ".drectve section header has flag COFF_SectionFlag_CntUninitializedData"); break; } - if (sect_header->fsize < 3) { + if (dim_1u64(section.frange) < 3) { lnk_error_obj(LNK_Error_IllData, obj, "not enough bytes to parse .drectve"); break; } - if (sect_header->reloc_count > 0) { + if (section.reloc_count > 0) { lnk_error_obj(LNK_Error_IllData, obj, ".drectve must not have relocations"); break; } - Rng1U64 sect_range = rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize); - str8_list_push(arena, &drectve_data, str8_substr(obj->data, sect_range)); + str8_list_push(arena, &drectve_data, str8_substr(obj->data, section.frange)); } } } @@ -763,13 +786,10 @@ lnk_debug_s_from_obj(Arena *arena, LNK_Obj *obj) String8List raw_debug_s = {0}; { - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - String8 string_table = lnk_coff_string_table_from_obj(obj); for EachIndex(sect_idx, obj->header.section_count_no_null) { - COFF_SectionHeader *section_header = §ion_table[sect_idx]; - String8 section_name = coff_name_from_section_header(string_table, section_header); - if (str8_match(section_name, str8_lit(".debug$S"), 0)) { - String8 debug_s = str8_substr(obj->data, rng_1u64(section_header->foff, section_header->foff + section_header->fsize)); + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); + if (str8_match(section.name, str8_lit(".debug$S"), 0)) { + String8 debug_s = str8_substr(obj->data, section.frange); str8_list_push(scratch.arena, &raw_debug_s, debug_s); } } diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h index c6271125..02998a95 100644 --- a/src/linker/lnk_obj.h +++ b/src/linker/lnk_obj.h @@ -40,6 +40,19 @@ typedef struct LNK_Obj U64 pch_obj_idx; } LNK_Obj; +typedef struct LNK_ObjSection +{ + LNK_Obj *obj; + U64 sect_idx; + U64 section_number; + COFF_SectionHeader *header; + COFF_SectionFlags *flags; + String8 name; + Rng1U64 vrange; + Rng1U64 frange; + U32 reloc_count; +} LNK_ObjSection; + typedef struct LNK_ObjNode { struct LNK_ObjNode *next; @@ -133,9 +146,11 @@ internal LNK_Symbol * lnk_obj_get_comdat_symlink(LNK_Obj *obj, U64 section_n internal COFF_ParsedSymbol lnk_parsed_symbol_from_coff(LNK_Obj *obj, void *coff_symbol); internal COFF_ParsedSymbol lnk_parsed_symbol_from_coff_symbol_idx(LNK_Obj *obj, U64 symbol_idx); -internal COFF_SectionHeader * lnk_coff_section_header_from_section_number(LNK_Obj *obj, U64 section_number); +internal U64 lnk_obj_sect_idx_from_section_number(LNK_Obj *obj, U64 section_number); +internal U64 lnk_obj_section_number_from_sect_idx(LNK_Obj *obj, U64 sect_idx); +internal LNK_ObjSection lnk_obj_section_from_sect_idx(LNK_Obj *obj, U64 sect_idx); +internal LNK_ObjSection lnk_obj_section_from_section_number(LNK_Obj *obj, U64 section_number); internal COFF_RelocArray lnk_coff_relocs_from_section_header(LNK_Obj *obj, COFF_SectionHeader *section_header); -internal COFF_SectionHeader * lnk_coff_section_table_from_obj(LNK_Obj *obj); internal String8 lnk_coff_string_table_from_obj(LNK_Obj *obj); internal String8 lnk_coff_symbol_table_from_obj(LNK_Obj *obj); internal B32 lnk_try_comdat_props_from_section_number(LNK_Obj *obj, U32 section_number, COFF_ComdatSelectType *select_out, U32 *section_number_out, U32 *section_length_out, U32 *check_sum_out); diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index be62e536..6cd8734e 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -286,11 +286,12 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src) } } break; case COFF_ComdatSelect_ExactMatch: { - COFF_SectionHeader *dst_sect_header = lnk_coff_section_header_from_section_number(dst_obj, dst_parsed.section_number); - COFF_SectionHeader *src_sect_header = lnk_coff_section_header_from_section_number(src_obj, src_parsed.section_number); - String8 dst_data = str8_substr(dst_obj->data, rng_1u64(dst_sect_header->foff, dst_sect_header->foff + dst_sect_header->fsize)); - String8 src_data = str8_substr(src_obj->data, rng_1u64(src_sect_header->foff, src_sect_header->foff + src_sect_header->fsize)); - B32 is_exact_match = 0; + LNK_ObjSection dst_section = lnk_obj_section_from_section_number(dst_obj, dst_parsed.section_number); + LNK_ObjSection src_section = lnk_obj_section_from_section_number(src_obj, src_parsed.section_number); + String8 dst_data = str8_substr(dst_obj->data, dst_section.frange); + String8 src_data = str8_substr(src_obj->data, src_section.frange); + + B32 is_exact_match = 0; if (dst_check_sum != 0 && src_check_sum != 0) { is_exact_match = dst_check_sum == src_check_sum && str8_match(dst_data, src_data, 0); } else { @@ -337,13 +338,15 @@ lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) if (dst_interp == COFF_SymbolValueInterp_Regular) { // remove replaced section from the output - dst_ref.obj->section_flags[dst_parsed.section_number-1] |= COFF_SectionFlag_LnkRemove; + LNK_ObjSection dst_section = lnk_obj_section_from_section_number(dst_ref.obj, dst_parsed.section_number); + *dst_section.flags |= COFF_SectionFlag_LnkRemove; // remove associated sections from the output for (U32Node *associated_section = dst_ref.obj->associated_sections[dst_parsed.section_number]; associated_section != 0; associated_section = associated_section->next) { - dst_ref.obj->section_flags[associated_section->data-1] |= COFF_SectionFlag_LnkRemove; + LNK_ObjSection section = lnk_obj_section_from_section_number(dst_ref.obj, associated_section->data); + *section.flags |= COFF_SectionFlag_LnkRemove; } } @@ -360,7 +363,9 @@ lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) LNK_ObjSymbolRef src_ref = lnk_ref_from_symbol(src); if (src_interp == COFF_SymbolValueInterp_Regular) { - AssertAlways(~src_ref.obj->section_flags[src_parsed.section_number-1] & COFF_SectionFlag_LnkRemove); + LNK_ObjSection src_section = lnk_obj_section_from_section_number(src_ref.obj, src_parsed.section_number); + COFF_SectionFlags src_flags = *src_section.flags; + AssertAlways(~src_flags & COFF_SectionFlag_LnkRemove); } } #endif From 3f6d5df899e9bd86f30aa25cd03bcda7b3122425 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 11:53:06 -0700 Subject: [PATCH 783/850] apply merge fixes --- src/linker/lnk.c | 9 +++++---- src/linker/lnk_config.c | 1 + src/linker/lnk_config.h | 1 + src/linker/lnk_obj.c | 9 +++++++++ src/linker/lnk_obj.h | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index c0c09611..27e3e984 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -5422,8 +5422,9 @@ lnk_run_linker(TP_Context *tp, TP_Arena *arena, LNK_Config *config) // // CodeView // - LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config, debug_info_objs_count, debug_info_objs); - LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv); + LNK_RRT_Array rrt_input = lnk_rrt_array_from_config(arena->v[0], config); + LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config, debug_info_objs_count, debug_info_objs, rrt_input); + LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv, 0); // // Debug Info @@ -5659,8 +5660,8 @@ lnk_run_type_server(TP_Context *tp, TP_Arena *arena, LNK_Config *config) if (debug_t_total_size) { // merge & write types - LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config, objs_count, objs); - LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv); + LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config, objs_count, objs, (LNK_RRT_Array){0}); + LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv, LNK_MergeTypeFlag_BuildObjTiMap|LNK_MergeTypeFlag_SkipSymbolTypeFixup|LNK_MergeTypeFlag_ExportHashes); String8List pdb = lnk_build_pdb(tp, arena, str8_zero(), config, 0, &cv, cv_types, LNK_PDB_BuilderFlag_Tpi|LNK_PDB_BuilderFlag_Ipi); lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb); diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 949fa256..8551ca68 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -121,6 +121,7 @@ global read_only struct { "lib", LNK_Input_Lib }, { "rlib", LNK_Input_Lib }, // rust libs { "res", LNK_Input_Res }, + { "rrt", LNK_Input_RRT }, }; global read_only struct diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 90e5355f..073243f2 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -164,6 +164,7 @@ typedef enum LNK_Input_Lib, LNK_Input_Res, LNK_Input_Manifest, + LNK_Input_RRT, LNK_Input_Count } LNK_InputType; diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index dccdfe4c..dabd77f8 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -638,6 +638,15 @@ lnk_try_comdat_props_from_section_number(LNK_Obj *obj, U32 section_number, COFF_ return 0; } +internal COFF_SectionHeader * +lnk_coff_section_header_from_section_number(LNK_Obj *obj, U64 section_number) +{ + Assert(section_number > 0); + U64 sect_idx = section_number - 1; + COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(obj->data, obj->header.section_table_range.min, dim_1u64(obj->header.section_table_range)); + return §ion_table[sect_idx]; +} + internal COFF_ParsedSymbol lnk_parsed_symbol_from_coff_symbol_idx(LNK_Obj *obj, U64 symbol_idx) { diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h index 02998a95..d13a3d1e 100644 --- a/src/linker/lnk_obj.h +++ b/src/linker/lnk_obj.h @@ -144,7 +144,7 @@ internal LNK_Symbol * lnk_obj_get_comdat_symlink(LNK_Obj *obj, U64 section_n // --- Symbol & Section Helpers ------------------------------------------------ -internal COFF_ParsedSymbol lnk_parsed_symbol_from_coff(LNK_Obj *obj, void *coff_symbol); +internal COFF_SectionHeader * lnk_coff_section_header_from_section_number(LNK_Obj *obj, U64 section_number); internal COFF_ParsedSymbol lnk_parsed_symbol_from_coff_symbol_idx(LNK_Obj *obj, U64 symbol_idx); internal U64 lnk_obj_sect_idx_from_section_number(LNK_Obj *obj, U64 section_number); internal U64 lnk_obj_section_number_from_sect_idx(LNK_Obj *obj, U64 sect_idx); From ac8c3e7a2dc7acdccb397f66d4f063e727769e35 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 12:05:45 -0700 Subject: [PATCH 784/850] do not emit relocation for empty resource entry --- src/linker/lnk.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 27e3e984..f5d600e6 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -670,18 +670,20 @@ lnk_serialize_pe_resource_tree(COFF_ObjWriter *obj_writer, PE_ResourceDir *root_ case PE_ResDataKind_COFF_RESOURCE: { // fill out resource header COFF_ResourceDataEntry *coff_res = push_array(obj_writer->arena, COFF_ResourceDataEntry, 1); - coff_res->data_size = res->u.coff_res.data.size; - coff_res->data_voff = 0; // relocated - coff_res->code_page = 0; // TODO: whats this for? (lld-link writes zero) + coff_res->data_size = res->u.coff_res.data.size; + coff_res->data_voff = 0; // relocated + coff_res->code_page = 0; // TODO: whats this for? - // emit symbol for resource data - U32 resdat_off = safe_cast_u32(rsrc2->data.total_size); - COFF_ObjSymbol *resdat = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("resdat"), resdat_off, rsrc2); + if (res->u.coff_res.data.size >= sizeof(U32)) { + // emit symbol for resource data + U32 resdat_off = safe_cast_u32(rsrc2->data.total_size); + COFF_ObjSymbol *resdat = coff_obj_writer_push_symbol_static(obj_writer, str8_lit("resdat"), resdat_off, rsrc2); - // emit reloc for 'data_voff' - U64 apply_off = rsrc1->data.total_size + OffsetOf(COFF_ResourceDataEntry, data_voff); - U32 apply_off32 = safe_cast_u32(apply_off); - coff_obj_writer_section_push_reloc(obj_writer, rsrc1, apply_off32, resdat, COFF_Reloc_X64_Addr32Nb); + // emit reloc for 'data_voff' + U64 apply_off = rsrc1->data.total_size + OffsetOf(COFF_ResourceDataEntry, data_voff); + U32 apply_off32 = safe_cast_u32(apply_off); + coff_obj_writer_section_push_reloc_voff(obj_writer, rsrc1, apply_off32, resdat); + } // push resource entry & data str8_list_push(obj_writer->arena, &rsrc1->data, str8_struct(coff_res)); From 2a5070bb87f406881bd2bc56d6a5c199ddbd8841 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 13:17:21 -0700 Subject: [PATCH 785/850] update change log --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0206e008..748e1e5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,15 @@ - Adjusted evaluation visualizations to include fully qualified symbol names. (#809) +## Linker Changes +- /OPT:REF Fixed a race in the dead-code-elimination pass where the linker + sometimes erroneously removed live sections. +- Fixed a bug where the linker emitted relocations for empty COFF resource entries, + which lead to "relocating against symbol that is in a removed section" errors. +- Added the /RAD_TYPE_SERVER switch to run the type-dedup pass on object files, + producing RRT files that can be passed back on the next link to improve + linking speed. + # v0.9.26-alpha ## Debugger Changes From 7ad422f8ad510396cffa3f026dc85fd30b038e62 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 13:21:31 -0700 Subject: [PATCH 786/850] make run_tests.sh executable --- run_tests.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 run_tests.sh diff --git a/run_tests.sh b/run_tests.sh old mode 100644 new mode 100755 From ac0c7d94416a83fe5c6c0b5680f7cf1e381d0dc0 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 13:34:49 -0700 Subject: [PATCH 787/850] on checkout do git LFS in github actions --- .github/workflows/builds.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index ff59fb6b..58a20867 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -66,6 +66,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v6 + with: + lfs: true - name: build (vs 2022) shell: cmd run: | @@ -87,6 +89,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v6 + with: + lfs: true - name: Install Dependencies shell: bash run: | @@ -126,6 +130,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v6 + with: + lfs: true - name: Run shell: cmd run: | From 2b20760386e4d9255ac86fcf10a35244deff2e10 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 12 Jun 2026 13:49:37 -0700 Subject: [PATCH 788/850] checkpoint on revised eval system; first pass on interpretation; eliminating all callbacks / eval involvement in contexts/spaces/identifier-resolution/etc. --- src/eval/eval_core.h | 7 - src/eval/eval_interpret.c | 32 -- src/eval2/eval2.c | 617 +++++++++++++++++++++++++++++++ src/eval2/eval2.h | 371 +++++++++++++++++++ src/eval2/eval2.mdesk | 87 +++++ src/eval2/generated/eval2.meta.c | 5 + src/eval2/generated/eval2.meta.h | 87 +++++ src/lib_rdi/rdi.c | 4 +- src/lib_rdi/rdi.h | 6 +- src/raddbg/raddbg_main.c | 2 + src/rdi/rdi.mdesk | 4 +- src/rdi/rdi_local.c | 5 - 12 files changed, 1173 insertions(+), 54 deletions(-) create mode 100644 src/eval2/eval2.c create mode 100644 src/eval2/eval2.h create mode 100644 src/eval2/eval2.mdesk create mode 100644 src/eval2/generated/eval2.meta.c create mode 100644 src/eval2/generated/eval2.meta.h diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index 770a2dfc..ddddebe1 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -1050,13 +1050,6 @@ struct E_CacheNode E_CacheBundle bundle; }; -typedef struct E_CacheLookup E_CacheLookup; -struct E_CacheLookup -{ - E_CacheNode *node; - U64 hash; -}; - typedef struct E_CacheSlot E_CacheSlot; struct E_CacheSlot { diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 4d09aeec..e314ac10 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -360,18 +360,6 @@ e_interpret(String8 bytecode) } }break; - case RDI_EvalOp_RegReadDyn: - { - U64 off = svals[0].u64; - U64 size = bit_size_from_arch(e_interpret_ctx->reg_arch)/8; - B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, 0, r1u64(off, off+size)); - if(!good_read) - { - result.code = E_InterpretationCode_BadRegRead; - goto done; - } - }break; - case RDI_EvalOp_FrameOff: { if(e_interpret_ctx->frame_base != 0) @@ -949,26 +937,6 @@ e_interpret(String8 bytecode) // do nothing - the pop is handled by the control bits }break; - case RDI_EvalOp_Insert: - { - if(stack_count > imm.u64) - { - if(imm.u64 > 0) - { - E_Value tval = stack[stack_count - 1]; - E_Value *dst = stack + stack_count - 1 - imm.u64; - E_Value *shift = dst + 1; - MemoryCopy(shift, dst, imm.u64*sizeof(E_Value)); - *dst = tval; - } - } - else - { - result.code = E_InterpretationCode_BadOp; - goto done; - } - }break; - case RDI_EvalOp_ValueRead: { U64 bytes_to_read = imm.u64; diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c new file mode 100644 index 00000000..15756f59 --- /dev/null +++ b/src/eval2/eval2.c @@ -0,0 +1,617 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "eval2/generated/eval2.meta.c" + +//////////////////////////////// +//~ rjf: Space -> Memory Map Helpers + +internal void +e2_space_map_push(Arena *arena, E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 addr_range, void *data) +{ + if(map->slots_count == 0) + { + map->slots_count = 8; + map->slots = push_array(arena, E2_SpaceMapNode *, map->slots_count); + } + U64 hash = u64_hash_from_str8(str8_struct(&space_id)); + U64 slot_idx = hash%map->slots_count; + E2_SpaceMapNode *node = 0; + for(E2_SpaceMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + { + if(n->space_id == space_id) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(arena, E2_SpaceMapNode, 1); + SLLStackPush(map->slots[slot_idx], node); + } + memory_map_push(arena, &node->memory_map, addr_range, data); +} + +internal U64 +e2_space_map_read(E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 addr_range, void *out) +{ + U64 result = 0; + { + U64 hash = u64_hash_from_str8(str8_struct(&space_id)); + U64 slot_idx = hash%map->slots_count; + E2_SpaceMapNode *node = 0; + for(E2_SpaceMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + { + if(n->space_id == space_id) + { + node = n; + break; + } + } + if(node != 0) + { + result = memory_map_read(&node->memory_map, addr_range, out); + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Name -> Expr Map Helpers + +internal void +e2_expr_map_push(Arena *arena, E2_ExprMap *map, String8 name, E2_Expr *expr) +{ + if(map->slots_count == 0) + { + map->slots_count = 8; + map->slots = push_array(arena, E2_ExprMapNode *, map->slots_count); + } + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%map->slots_count; + E2_ExprMapNode *node = 0; + for(E2_ExprMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->name, name, 0)) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(arena, E2_ExprMapNode, 1); + node->name = str8_copy(arena, name); + node->expr = expr; + SLLStackPush(map->slots[slot_idx], node); + } +} + +internal E2_Expr * +e2_expr_from_name(E2_ExprMap *map, String8 name) +{ + E2_Expr *expr = &e2_expr_nil; + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%map->slots_count; + E2_ExprMapNode *node = 0; + for(E2_ExprMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->name, name, 0)) + { + node = n; + break; + } + } + if(node != 0) + { + expr = node->expr; + } + return expr; +} + +//////////////////////////////// +//~ rjf: String -> Expression + +internal E2_Parse +e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string) +{ + +} + +//////////////////////////////// +//~ rjf: Expression -> Bytecode + +internal String8 +e2_bytecode_from_expr(Arena *arena, E2_Expr *expr) +{ + +} + +//////////////////////////////// +//~ rjf: Bytecode -> Result + +internal E2_Interp +e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_map, String8 bytecode) +{ + E2_Interp interp = {E2_Status_Error}; + { + U64 off = state->bytecode_off; + U64 off_opl = bytecode.size; + B32 done = 0; + B32 good = 1; + for(;off < off_opl && !done && good;) + { + Temp scratch = scratch_begin(&arena, 1); + U64 start_off = off; + + //- rjf: read next opcode + RDI_EvalOp op = 0; + off += str8_deserial_read_struct(bytecode, off, &op); + + //- rjf: opcode -> ctrl bits + U16 ctrlbits = 0; + switch(op) + { + default: + if(op < RDI_EvalOp_COUNT) + { + ctrlbits = rdi_eval_op_ctrlbits_table[op]; + }break; + case E2_EvalOp_SetCtxID:{ctrlbits = RDI_EVAL_CTRLBITS(8, 0, 0);}break; + } + + //- rjf: ctrlbits -> push/pop/decode count + U64 decode_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + U64 push_count = RDI_PUSHN_FROM_CTRLBITS(ctrlbits); + U64 pop_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); + + //- rjf: do extra decode + String8 decode_data = str8_substr(bytecode, r1u64(off, off+decode_size)); + E2_Val decode_val = {0}; + MemoryCopy(&decode_val, decode_data.str, Min(sizeof(decode_val), decode_data.size)); + RDI_EvalTypeGroup type_group = (RDI_EvalTypeGroup)decode_val.u512.u8[0]; + U64 op_arithmetic_size = (U64)decode_val.u512.u8[1]; + off += decode_size; + + //- rjf: prepare popped stack values & to-push stack values + E2_Val *popped_vals = push_array(scratch.arena, E2_Val, pop_count); + E2_Val *push_vals = push_array(scratch.arena, E2_Val, push_count); + { + E2_InterpStackValNode *node = state->top_val; + for(U64 pop_idx = 0; node != 0 && pop_idx < pop_count; pop_idx += 1, node = node->next) + { + popped_vals[pop_idx] = node->val; + } + } + + //- rjf: do opcode + E2_CtxFlags ctx_flags = 0; + U64 ctx_base_addr = 0; + switch(op) + { + default:{}break; + + case E2_EvalOp_SetCtxID: + { + interp.status = E2_Status_NewCtxID; + interp.ctx_id = decode_val.u64; + }break; + + case RDI_EvalOp_Stop: + { + done = 1; + }break; + case RDI_EvalOp_Noop:{}break; + case RDI_EvalOp_Cond: + if(popped_vals[0].u64 != 0) + { + off += decode_val.u64; + }break; + case RDI_EvalOp_Skip: + { + off += decode_val.u64; + }break; + case RDI_EvalOp_MemRead: + { + U64 addr = popped_vals[0].u64; + U64 size = decode_val.u64; + Rng1U64 space_addr_range = r1u64(addr, addr+size); + void *read_dst = &push_vals[0]; + if(size > sizeof(push_vals[0].u512)) + { + read_dst = push_array(arena, U8, size); + } + U64 read_size = e2_space_map_read(space_map, state->selected_ctx.space_id, space_addr_range, read_dst); + arena_pop(arena, size - read_size); + push_vals[0].string = str8(read_dst, read_size); + if(read_size != size) + { + good = 0; + interp.status = E2_Status_MissedSpaceRead; + interp.missed_read_space_addr_range = space_addr_range; + } + }break; + case RDI_EvalOp_RegRead: + { + U8 rdi_reg_code = (decode_val.u64&0x0000FF)>>0; + U8 byte_size = (decode_val.u64&0x00FF00)>>8; + U8 byte_off = (decode_val.u64&0xFF0000)>>16; + Arch arch = state->selected_ctx.arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); + ARCH_RegCode base_reg_code = arch_reg_code_from_rdi(arch, rdi_reg_code); + if(0 <= base_reg_code && base_reg_code < arch_info->reg_code_count) + { + Rng1U16 reg_rng = arch_info->reg_code_rng_table[base_reg_code]; + U64 off = (U64)reg_rng.min + byte_off; + U64 size = (U64)byte_size; + Rng1U64 space_addr_range = r1u64(off, off+size); + U64 read_size = e2_space_map_read(space_map, state->selected_ctx.reg_space_id, space_addr_range, &push_vals[0]); + if(read_size != size) + { + good = 0; + interp.status = E2_Status_MissedSpaceRead; + interp.missed_read_space_addr_range = space_addr_range; + } + } + else + { + good = 0; + interp.status = E2_Status_BadRegCode; + } + }break; + case RDI_EvalOp_FrameOff: {ctx_flags = E2_CtxFlag_HasFrameBase; ctx_base_addr = state->selected_ctx.frame_base_addr;}goto optional_base_off; + case RDI_EvalOp_ModuleOff: {ctx_flags = E2_CtxFlag_HasModuleBase; ctx_base_addr = state->selected_ctx.module_base_addr;}goto optional_base_off; + case RDI_EvalOp_TLSOff: {ctx_flags = E2_CtxFlag_HasTLSBase; ctx_base_addr = state->selected_ctx.tls_base_addr;}goto optional_base_off; + case RDI_EvalOp_PushCfa: {ctx_flags = E2_CtxFlag_HasCFA; ctx_base_addr = state->selected_ctx.cfa_addr;}goto optional_base_off; + optional_base_off:; + { + if(state->selected_ctx.flags & ctx_flags) + { + push_vals[0].u64 = ctx_base_addr + decode_val.u64; + } + else + { + good = 0; + interp.status = E2_Status_MissingCtxFlag; + interp.missing_ctx_flags |= ctx_flags; + } + }break; + + case RDI_EvalOp_ConstU8: + case RDI_EvalOp_ConstU16: + case RDI_EvalOp_ConstU32: + case RDI_EvalOp_ConstU64: + case RDI_EvalOp_ConstU128: + { + push_vals[0] = decode_val; + }break; + + case RDI_EvalOp_ConstString: + { + U64 string_size = decode_val.u64; + String8 string = str8_substr(bytecode, r1u64(off, off+string_size)); + off += string_size; + push_vals[0].string = string; + }break; + + case RDI_EvalOp_Abs: + { + if(0){} +#define CaseA(target_type_group, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].target_type = (popped_vals[0].target_type < 0 ? -popped_vals[0].target_type : +popped_vals[0].target_type);}while(0) +#define CaseB(target_type_group, size, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].target_type = (popped_vals[0].target_type < 0 ? -popped_vals[0].target_type : +popped_vals[0].target_type);}while(0) + CaseA(F32, f32); + CaseA(F64, f64); + CaseB(S, 8, s8); + CaseB(S, 16, s16); + CaseB(S, 32, s32); + CaseB(S, 64, s64); + else { MemoryCopyStruct(&push_vals[0], &popped_vals[0]); } +#undef CaseA +#undef CaseB + }break; + + case RDI_EvalOp_Neg: + { + if(0){} +#define CaseA(target_type_group, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].target_type = (-popped_vals[0].target_type);}while(0) +#define CaseB(target_type_group, size, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].target_type = (-popped_vals[0].target_type);}while(0) + CaseA(F32, f32); + CaseA(F64, f64); + CaseB(S, 8, s8); + CaseB(S, 16, s16); + CaseB(S, 32, s32); + CaseB(S, 64, s64); + else { MemoryCopyStruct(&push_vals[0], &popped_vals[0]); } +#undef CaseA +#undef CaseB + }break; + +#define BinOp(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type;}while(0) +#define SizedBinOp(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type;}while(0) +#define BinOpDiv(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) +#define SizedBinOpDiv(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) +#define BinOpDivFn(target_type_group, dst_type, src_type, fn) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = fn(popped_vals[1].src_type, popped_vals[0].src_type); } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) +#define ArithTypeCasesInt(symbol)\ +SizedBinOp(S, 8, s8, s8, symbol);\ +SizedBinOp(S, 16, s16, s16, symbol);\ +SizedBinOp(S, 32, s32, s32, symbol);\ +SizedBinOp(S, 64, s64, s64, symbol);\ +SizedBinOp(U, 8, u8, u8, symbol);\ +SizedBinOp(U, 16, u16, u16, symbol);\ +SizedBinOp(U, 32, u32, u32, symbol);\ +SizedBinOp(U, 64, u64, u64, symbol); +#define ArithTypeCasesIntDiv(symbol)\ +SizedBinOpDiv(S, 8, s8, s8, symbol);\ +SizedBinOpDiv(S, 16, s16, s16, symbol);\ +SizedBinOpDiv(S, 32, s32, s32, symbol);\ +SizedBinOpDiv(S, 64, s64, s64, symbol);\ +SizedBinOpDiv(U, 8, u8, u8, symbol);\ +SizedBinOpDiv(U, 16, u16, u16, symbol);\ +SizedBinOpDiv(U, 32, u32, u32, symbol);\ +SizedBinOpDiv(U, 64, u64, u64, symbol); +#define LogTypeCases(symbol)\ +BinOp(F32, u64, f32, symbol);\ +BinOp(F64, u64, f64, symbol);\ +ArithTypeCasesInt(symbol) +#define ArithTypeCases(symbol)\ +BinOp(F32, f32, f32, symbol);\ +BinOp(F64, f64, f64, symbol);\ +ArithTypeCasesInt(symbol) +#define ArithTypeCasesDiv(symbol)\ +BinOpDiv(F32, f32, f32, symbol);\ +BinOpDiv(F64, f64, f64, symbol);\ +ArithTypeCasesIntDiv(symbol) +#define ArithTypeCasesIntAllU64(symbol)\ +BinOp(S, u64, u64, symbol);\ +BinOp(U, u64, u64, symbol); +#define Case(name, ...) case RDI_EvalOp_##name:{if(0){} __VA_ARGS__ else {interp.status = E2_Status_BadOpTypes; good = 0;}}break + Case(Add, ArithTypeCases(+)); + Case(Sub, ArithTypeCases(-)); + Case(Mul, ArithTypeCases(*)); + Case(Div, ArithTypeCasesDiv(/)); + Case(Mod, ArithTypeCasesIntDiv(%) BinOpDivFn(F32, f32, f32, mod_f32); BinOpDivFn(F64, f64, f64, mod_f64);); + Case(LShift, ArithTypeCasesInt(<<)); + Case(RShift, ArithTypeCasesInt(>>)); + Case(BitAnd, ArithTypeCasesIntAllU64(&)); + Case(BitOr, ArithTypeCasesIntAllU64(|)); + Case(BitXor, ArithTypeCasesIntAllU64(^)); + Case(LogAnd, ArithTypeCasesIntAllU64(&&)); + Case(LogOr, ArithTypeCasesIntAllU64(||)); + Case(LsEq, LogTypeCases(<=)); + Case(GrEq, LogTypeCases(>=)); + Case(Less, LogTypeCases(<)); + Case(Grtr, LogTypeCases(>)); +#undef Case +#undef BinOp +#undef SizedBinOp +#undef BinOpDiv +#undef SizedBinOpDiv +#undef BinOpDivFn +#undef ArithTypeCasesInt +#undef ArithTypeCasesIntDiv +#undef ArithTypeCases +#undef ArithTypeCasesDiv +#undef ArithTypeCasesIntAllU64 + + case RDI_EvalOp_EqEq: + case RDI_EvalOp_NtEq: + { + if(popped_vals[0].string.size != 0 && popped_vals[1].string.size != 0) + { + push_vals[0].u64 = str8_match(popped_vals[0].string, popped_vals[1].string, 0); + } + else + { + push_vals[0].u64 = MemoryMatchStruct(&popped_vals[0].u512, &popped_vals[1].u512); + } + if(op == RDI_EvalOp_NtEq) + { + push_vals[0].u64 = !push_vals[0].u64; + } + }break; + + case RDI_EvalOp_Trunc: + { + if(0 < decode_val.u64) + { + U64 mask = 0; + if(decode_val.u64 < 64) + { + mask = max_U64 >> (64 - decode_val.u64); + } + push_vals[0].u64 = popped_vals[0].u64&mask; + } + }break; + + case RDI_EvalOp_TruncSigned: + { + if(0 < decode_val.u64) + { + U64 mask = 0; + if(decode_val.u64 < 64) + { + mask = max_U64 >> (64 - decode_val.u64); + } + U64 high = 0; + if(popped_vals[0].u64 & (1 << (decode_val.u64 - 1))) + { + high = ~mask; + } + push_vals[0].u64 = high|(popped_vals[0].u64&mask); + } + }break; + + case RDI_EvalOp_Convert: + { + U32 in = decode_val.u64&0xFF; + U32 out = (decode_val.u64 >> 8)&0xFF; + if(in != 0) + { + switch(in + out*RDI_EvalTypeGroup_COUNT) + { + default:{good = 0; interp.status = E2_Status_BadOpTypes;}break; +#define Case(dst_tg, dst_slot, dst_type, src_tg, src_slot) case RDI_EvalTypeGroup_##src_tg + RDI_EvalTypeGroup_##dst_tg*RDI_EvalTypeGroup_COUNT:{push_vals[0].dst_slot = (dst_type)popped_vals[0].src_slot;}break + Case(U, u64, U64, F32, f32); + Case(U, u64, U64, F64, f64); + Case(S, s64, S64, F32, f32); + Case(S, s64, S64, F64, f64); + Case(F32, f32, F32, S, s64); + Case(F64, f64, F64, S, s64); + Case(F32, f32, F32, U, u64); + Case(F64, f64, F64, U, u64); + Case(F32, f32, F32, F64, f64); + Case(F64, f64, F64, F32, f32); +#undef Case + } + } + }break; + + case RDI_EvalOp_Pick: + { + U64 target_idx = decode_val.u64; + U64 idx = 0; + B32 found = 0; + for(E2_InterpStackValNode *n = state->top_val; n != 0; n = n->next, idx += 1) + { + if(idx == target_idx) + { + found = 1; + push_vals[0] = n->val; + break; + } + } + if(!found) + { + good = 0; + interp.status = E2_Status_InsufficientStackSpace; + } + }break; + + case RDI_EvalOp_Swap: + { + push_vals[0] = popped_vals[1]; + push_vals[1] = popped_vals[0]; + }break; + + case RDI_EvalOp_Pop:{NoOp;}break; + + case RDI_EvalOp_ValueRead: + { + U64 bytes_to_read = decode_val.u64; + U64 offset = popped_vals[0].u64; + if(offset + bytes_to_read <= popped_vals[1].string.size) + { + MemoryCopy(&push_vals[0].u512, popped_vals[1].string.str + offset, bytes_to_read); + } + else + { + good = 0; + interp.status = E2_Status_BadOffset; + } + }break; + + case RDI_EvalOp_ByteSwap: + { + U64 byte_size = decode_val.u64; + switch(byte_size) + { + default: + { + good = 0; + interp.status = E2_Status_UnsupportedOp; + }break; + case 2:{push_vals[0].u16 = bswap_u16(popped_vals[0].u16);}break; + case 4:{push_vals[0].u32 = bswap_u32(popped_vals[0].u32);}break; + case 8:{push_vals[0].u64 = bswap_u64(popped_vals[0].u64);}break; + } + }break; + + case RDI_EvalOp_CallSiteValue: + { + // DW_OP_entry_value: requires evaluating the embedded sub-bytecode + // in this frame's entry-time register state (i.e. caller's state + // at the call instruction). that state is not currently plumbed + // into the eval context. interpreting in the current ctx gives + // wrong values for spilled args, so report BadOp instead. + // skip past the embedded sub-bytecode in the outer stream so the + // bytes are not interpreted as outer ops on resume. + good = 0; + interp.status = E2_Status_UnsupportedOp; + }break; + + case RDI_EvalOp_PartialValue: + { + // DW_OP_piece marker: top-of-stack is a piece of a composite value. + // we do not assemble composites; for single-piece expressions the + // value already on the stack is the result. for multi-piece, only + // the first piece is returned (stack[0] is the final result). + good = 0; + interp.status = E2_Status_UnsupportedOp; + }break; + + case RDI_EvalOp_PartialValueBit: + { + // DW_OP_bit_piece marker. same caveat as PartialValue. + good = 0; + interp.status = E2_Status_UnsupportedOp; + }break; + } + + //- rjf: if opcode successful -> do stack pops + if(good) for EachIndex(pop_idx, pop_count) + { + E2_InterpStackValNode *popped = state->top_val; + if(popped != 0) + { + SLLStackPop(state->top_val); + SLLStackPush(state->free_val, popped); + } + else + { + break; + } + } + + //- rjf: if opcode successful -> do stack pushes + if(good) for EachIndex(push_idx, push_count) + { + E2_InterpStackValNode *node = state->free_val; + if(node != 0) + { + SLLStackPop(state->free_val); + } + else + { + node = push_array(arena, E2_InterpStackValNode, 1); + } + node->val = push_vals[push_idx]; + SLLStackPush(state->top_val, node); + } + + //- rjf: if opcode successful -> commit new bytecode offset + if(good) + { + state->bytecode_off = off; + } + + scratch_end(scratch); + if(off == start_off) + { + break; + } + } + if(off == off_opl && good) + { + interp.status = E2_Status_Good; + if(state->top_val != 0) + { + interp.val = state->top_val->val; + } + } + } + return interp; +} diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h new file mode 100644 index 00000000..56c3f4da --- /dev/null +++ b/src/eval2/eval2.h @@ -0,0 +1,371 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef EVAL2_H +#define EVAL2_H + +//////////////////////////////// +//~ rjf: Generated Code + +#include "eval2/generated/eval2.meta.h" + +//////////////////////////////// +//~ rjf: Extended Opcodes + +enum +{ + E2_EvalOp_SetCtxID = RDI_EvalOp_COUNT, +}; + +//////////////////////////////// +//~ rjf: Compilation Statuses + +typedef enum E2_Status +{ + E2_Status_Good, + + //- rjf: need caller-provided info + E2_Status_MissedSpaceRead, + E2_Status_MissedIdentifierResolution, + E2_Status_Access, + E2_Status_NewCtxID, + + //- rjf: unrecoverable errors + E2_Status_BadRegCode, + E2_Status_MissingCtxFlag, + E2_Status_DivideByZero, + E2_Status_InsufficientStackSpace, + E2_Status_BadOpTypes, + E2_Status_UnsupportedOp, + E2_Status_BadOffset, + E2_Status_Error, +} +E2_Status; + +//////////////////////////////// +//~ rjf: Type Keys + +typedef enum E2_TypeKeyKind +{ + E2_TypeKeyKind_Null, + E2_TypeKeyKind_Basic, + E2_TypeKeyKind_Ext, + E2_TypeKeyKind_Cons, + E2_TypeKeyKind_Reg, +} +E2_TypeKeyKind; + +typedef struct E2_TypeKey E2_TypeKey; +struct E2_TypeKey +{ + E2_TypeKeyKind kind; + U32 u32[3]; + // [0] -> E_TypeKind (Basic, Cons, Ext); Arch (Reg, RegAlias) + // [1] -> Type Index In Debug Info (Ext); Code (Reg, RegAlias); Type Index In Constructed (Cons) + // [2] -> Debug Info Number (Ext) +}; + +typedef struct E2_TypeKeyNode E2_TypeKeyNode; +struct E2_TypeKeyNode +{ + E2_TypeKeyNode *next; + E2_TypeKey v; +}; + +typedef struct E2_TypeKeyList E2_TypeKeyList; +struct E2_TypeKeyList +{ + E2_TypeKeyNode *first; + E2_TypeKeyNode *last; + U64 count; +}; + +//////////////////////////////// +//~ rjf: Unpacked Type Info + +typedef enum E2_MemberKind +{ + E2_MemberKind_Null, + E2_MemberKind_DataField, + E2_MemberKind_StaticData, + E2_MemberKind_Method, + E2_MemberKind_StaticMethod, + E2_MemberKind_VirtualMethod, + E2_MemberKind_VTablePtr, + E2_MemberKind_Base, + E2_MemberKind_VirtualBase, + E2_MemberKind_NestedType, + E2_MemberKind_Padding, + E2_MemberKind_COUNT +} +E2_MemberKind; + +typedef U32 E2_TypeFlags; +enum +{ + E2_TypeFlag_Const = (1<<0), + E2_TypeFlag_Volatile = (1<<1), + E2_TypeFlag_Restrict = (1<<2), +}; + +typedef struct E2_EnumVal E2_EnumVal; +struct E2_EnumVal +{ + String8 name; + U64 val; +}; + +typedef struct E2_Member E2_Member; +struct E2_Member +{ + E2_MemberKind kind; + E2_TypeKey type_key; + String8 name; + U64 off; + E2_TypeKeyList inheritees; +}; + +typedef struct E2_Type E2_Type; +struct E2_Type +{ + E2_TypeKind kind; + E2_TypeFlags flags; + String8 name; + U64 byte_size; + U64 count; + U64 depth; + U32 off; + Arch arch; + E2_TypeKey direct_type_key; + E2_TypeKey owner_type_key; + E2_TypeKey *param_type_keys; + E2_Member *members; + E2_EnumVal *enum_vals; + struct E2_Expr **args; +}; + +//////////////////////////////// +//~ rjf: Evaluation Values + +typedef enum E2_Mode +{ + E2_Mode_Type, // no value content - just type content + E2_Mode_Address, // value is an address into a space + E2_Mode_Value, // value is just a value, does not refer elsewhere + E2_Mode_COUNT +} +E2_Mode; + +typedef struct E2_Val E2_Val; +struct E2_Val +{ + union + { + U512 u512; + U256 u256; + U128 u128; + U64 u64; + U32 u32; + U16 u16; + U8 u8; + S64 s64; + S32 s32; + S16 s16; + S8 s8; + F64 f64; + F32 f32; + }; + String8 string; +}; + +//////////////////////////////// +//~ rjf: Evaluation "Asset" Parameters (Debug Info / Modules) + +typedef U64 E2_SpaceID; + +typedef struct E2_DbgInfo E2_DbgInfo; +struct E2_DbgInfo +{ + DI_Key dbgi_key; + RDI_Parsed *rdi; + String8 name; +}; + +typedef struct E2_Module E2_Module; +struct E2_Module +{ + E2_SpaceID space_id; + Rng1U64 addr_range; + E2_DbgInfo *dbg_info; + Arch arch; + String8 name; +}; + +typedef struct E2_Assets E2_Assets; +struct E2_Assets +{ + E2_Module *modules; + U64 modules_count; + E2_DbgInfo *dbg_infos; + U64 dbg_infos_count; +}; + +//////////////////////////////// +//~ rjf: Evaluation Contexts + +typedef U64 E2_CtxID; + +typedef U32 E2_CtxFlags; +enum +{ + E2_CtxFlag_HasFrameBase = (1<<0), + E2_CtxFlag_HasCFA = (1<<1), + E2_CtxFlag_HasModuleBase = (1<<2), + E2_CtxFlag_HasTLSBase = (1<<3), +}; + +typedef struct E2_Ctx E2_Ctx; +struct E2_Ctx +{ + // rjf: base info + E2_CtxID id; + E2_SpaceID space_id; + E2_SpaceID reg_space_id; + Arch arch; + U64 addr; + + // rjf: optional extensions + E2_CtxFlags flags; + U64 frame_base_addr; + U64 cfa_addr; + U64 module_base_addr; + U64 tls_base_addr; +}; + +//////////////////////////////// +//~ rjf: Expression Tree Building + +typedef struct E2_Expr E2_Expr; +struct E2_Expr +{ + E2_Expr *first; + E2_Expr *last; + E2_Expr *next; + String8 string; + RDI_EvalOp op; + E2_TypeKey type_key; + E2_Mode mode; + E2_Val val; +}; + +typedef struct E2_ExprMapNode E2_ExprMapNode; +struct E2_ExprMapNode +{ + E2_ExprMapNode *next; + String8 name; + E2_Expr *expr; +}; + +typedef struct E2_ExprMap E2_ExprMap; +struct E2_ExprMap +{ + E2_ExprMapNode **slots; + U64 slots_count; +}; + +typedef struct E2_ParseState E2_ParseState; +struct E2_ParseState +{ + U64 string_off; +}; + +typedef struct E2_Parse E2_Parse; +struct E2_Parse +{ + E2_Status status; + E2_SpaceID space_id; + Rng1U64 missed_read_space_addr_range; + E2_CtxID ctx_id; + E2_CtxFlags missing_ctx_flags; + E2_Expr *expr; + E2_Expr *access_expr; +}; + +//////////////////////////////// +//~ rjf: Interpretation + +typedef struct E2_SpaceMapNode E2_SpaceMapNode; +struct E2_SpaceMapNode +{ + E2_SpaceMapNode *next; + E2_SpaceID space_id; + MemoryMap memory_map; +}; + +typedef struct E2_SpaceMap E2_SpaceMap; +struct E2_SpaceMap +{ + E2_SpaceMapNode **slots; + U64 slots_count; +}; + +typedef struct E2_InterpStackValNode E2_InterpStackValNode; +struct E2_InterpStackValNode +{ + E2_InterpStackValNode *next; + E2_Val val; +}; + +typedef struct E2_InterpState E2_InterpState; +struct E2_InterpState +{ + U64 bytecode_off; + E2_Ctx selected_ctx; + E2_InterpStackValNode *top_val; + E2_InterpStackValNode *free_val; +}; + +typedef struct E2_Interp E2_Interp; +struct E2_Interp +{ + E2_Status status; + E2_SpaceID space_id; + Rng1U64 missed_read_space_addr_range; + E2_CtxID ctx_id; + E2_CtxFlags missing_ctx_flags; + E2_Val val; +}; + +//////////////////////////////// +//~ rjf: Globals + +read_only global E2_Expr e2_expr_nil = {&e2_expr_nil, &e2_expr_nil, &e2_expr_nil}; + +//////////////////////////////// +//~ rjf: Space -> Memory Map Helpers + +internal void e2_space_map_push(Arena *arena, E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 addr_range, void *data); +internal U64 e2_space_map_read(E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 addr_range, void *out); + +//////////////////////////////// +//~ rjf: Name -> Expr Map Helpers + +internal void e2_expr_map_push(Arena *arena, E2_ExprMap *map, String8 name, E2_Expr *expr); +internal E2_Expr *e2_expr_from_name(E2_ExprMap *map, String8 name); + +//////////////////////////////// +//~ rjf: String -> Expression + +internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string); + +//////////////////////////////// +//~ rjf: Expression -> Bytecode + +internal String8 e2_bytecode_from_expr(Arena *arena, E2_Expr *expr); + +//////////////////////////////// +//~ rjf: Bytecode -> Result + +internal E2_Interp e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_map, String8 bytecode); + +#endif // EVAL2_H diff --git a/src/eval2/eval2.mdesk b/src/eval2/eval2.mdesk new file mode 100644 index 00000000..5dbaf832 --- /dev/null +++ b/src/eval2/eval2.mdesk @@ -0,0 +1,87 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +@table(name basic_string basic_byte_size) +// NOTE(rjf): basic_byte_size == 0xFF? => address sized +E2_TypeKindTable: +{ + {Null "" 0 } + {Void "void" 0 } + {Handle "HANDLE" 0xFF } + {HResult "HRESULT" 4 } + {Char8 "char8" 1 } + {Char16 "char16" 2 } + {Char32 "char32" 4 } + {UChar8 "uchar8" 1 } + {UChar16 "uchar16" 2 } + {UChar32 "uchar32" 4 } + {U8 "uint8" 1 } + {U16 "uint16" 2 } + {U32 "uint32" 4 } + {U64 "uint64" 8 } + {U128 "uint128" 16 } + {U256 "uint256" 32 } + {U512 "uint512" 64 } + {S8 "int8" 1 } + {S16 "int16" 2 } + {S32 "int32" 4 } + {S64 "int64" 8 } + {S128 "int128" 16 } + {S256 "int256" 32 } + {S512 "int512" 64 } + {Bool "bool" 1 } + {F16 "float16" 2 } + {F32 "float32" 4 } + {F32PP "float32PP" 4 } + {F48 "float48" 6 } + {F64 "float64" 8 } + {F80 "float80" 10 } + {F128 "float128" 16 } + {ComplexF32 "complex_float32" 8 } + {ComplexF64 "complex_float64" 16 } + {ComplexF80 "complex_float80" 20 } + {ComplexF128 "complex_float128" 32 } + {Modifier "modifier" 0 } + {Ptr "ptr" 0 } + {LRef "lref" 0 } + {RRef "rref" 0 } + {Array "array" 0 } + {Function "function" 0 } + {Method "method" 0 } + {MemberPtr "member_ptr" 0 } + {Struct "struct" 0 } + {Class "class" 0 } + {Union "union" 0 } + {Enum "enum" 0 } + {Alias "typedef" 0 } + {IncompleteStruct "struct" 0 } + {IncompleteUnion "union" 0 } + {IncompleteClass "class" 0 } + {IncompleteEnum "enum" 0 } + {Bitfield "bitfield" 0 } + {Variadic "variadic" 0 } + {Set "set" 0 } + {Lens "lens" 0 } + {LensSpec "lens_spec" 0 } + {MetaExpr "meta_expr" 0 } + {MetaDisplayName "meta_display_name" 0 } + {MetaDescription "meta_description" 0 } +} + +@enum E2_TypeKind: +{ + @expand(E2_TypeKindTable a) `$(a.name)`, + COUNT, + `FirstBasic = E2_TypeKind_Void`, + `LastBasic = E2_TypeKind_ComplexF128`, + `FirstInteger = E2_TypeKind_Char8`, + `LastInteger = E2_TypeKind_S512`, + `FirstSigned1 = E2_TypeKind_Char8`, + `LastSigned1 = E2_TypeKind_Char32`, + `FirstSigned2 = E2_TypeKind_S8`, + `LastSigned2 = E2_TypeKind_S512`, + `FirstIncomplete = E2_TypeKind_IncompleteStruct`, + `LastIncomplete = E2_TypeKind_IncompleteEnum`, + `FirstMeta = E2_TypeKind_MetaExpr`, + `LastMeta = E2_TypeKind_MetaDescription`, +} diff --git a/src/eval2/generated/eval2.meta.c b/src/eval2/generated/eval2.meta.c new file mode 100644 index 00000000..0378fad9 --- /dev/null +++ b/src/eval2/generated/eval2.meta.c @@ -0,0 +1,5 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + diff --git a/src/eval2/generated/eval2.meta.h b/src/eval2/generated/eval2.meta.h new file mode 100644 index 00000000..2ba002dd --- /dev/null +++ b/src/eval2/generated/eval2.meta.h @@ -0,0 +1,87 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//- GENERATED CODE + +#ifndef EVAL2_META_H +#define EVAL2_META_H + +typedef enum E2_TypeKind +{ +E2_TypeKind_Null, +E2_TypeKind_Void, +E2_TypeKind_Handle, +E2_TypeKind_HResult, +E2_TypeKind_Char8, +E2_TypeKind_Char16, +E2_TypeKind_Char32, +E2_TypeKind_UChar8, +E2_TypeKind_UChar16, +E2_TypeKind_UChar32, +E2_TypeKind_U8, +E2_TypeKind_U16, +E2_TypeKind_U32, +E2_TypeKind_U64, +E2_TypeKind_U128, +E2_TypeKind_U256, +E2_TypeKind_U512, +E2_TypeKind_S8, +E2_TypeKind_S16, +E2_TypeKind_S32, +E2_TypeKind_S64, +E2_TypeKind_S128, +E2_TypeKind_S256, +E2_TypeKind_S512, +E2_TypeKind_Bool, +E2_TypeKind_F16, +E2_TypeKind_F32, +E2_TypeKind_F32PP, +E2_TypeKind_F48, +E2_TypeKind_F64, +E2_TypeKind_F80, +E2_TypeKind_F128, +E2_TypeKind_ComplexF32, +E2_TypeKind_ComplexF64, +E2_TypeKind_ComplexF80, +E2_TypeKind_ComplexF128, +E2_TypeKind_Modifier, +E2_TypeKind_Ptr, +E2_TypeKind_LRef, +E2_TypeKind_RRef, +E2_TypeKind_Array, +E2_TypeKind_Function, +E2_TypeKind_Method, +E2_TypeKind_MemberPtr, +E2_TypeKind_Struct, +E2_TypeKind_Class, +E2_TypeKind_Union, +E2_TypeKind_Enum, +E2_TypeKind_Alias, +E2_TypeKind_IncompleteStruct, +E2_TypeKind_IncompleteUnion, +E2_TypeKind_IncompleteClass, +E2_TypeKind_IncompleteEnum, +E2_TypeKind_Bitfield, +E2_TypeKind_Variadic, +E2_TypeKind_Set, +E2_TypeKind_Lens, +E2_TypeKind_LensSpec, +E2_TypeKind_MetaExpr, +E2_TypeKind_MetaDisplayName, +E2_TypeKind_MetaDescription, +E2_TypeKind_COUNT, +E2_TypeKind_FirstBasic = E2_TypeKind_Void, +E2_TypeKind_LastBasic = E2_TypeKind_ComplexF128, +E2_TypeKind_FirstInteger = E2_TypeKind_Char8, +E2_TypeKind_LastInteger = E2_TypeKind_S512, +E2_TypeKind_FirstSigned1 = E2_TypeKind_Char8, +E2_TypeKind_LastSigned1 = E2_TypeKind_Char32, +E2_TypeKind_FirstSigned2 = E2_TypeKind_S8, +E2_TypeKind_LastSigned2 = E2_TypeKind_S512, +E2_TypeKind_FirstIncomplete = E2_TypeKind_IncompleteStruct, +E2_TypeKind_LastIncomplete = E2_TypeKind_IncompleteEnum, +E2_TypeKind_FirstMeta = E2_TypeKind_MetaExpr, +E2_TypeKind_LastMeta = E2_TypeKind_MetaDescription, +} E2_TypeKind; + +#endif // EVAL2_META_H diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index c87679b5..16fb2684 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -58,7 +58,7 @@ sizeof(RDI_NameMapNode), sizeof(RDI_U8), }; -RDI_U16 rdi_eval_op_ctrlbits_table[54] = +RDI_U16 rdi_eval_op_ctrlbits_table[52] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), @@ -66,7 +66,6 @@ RDI_EVAL_CTRLBITS(2, 1, 0), RDI_EVAL_CTRLBITS(2, 0, 0), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 1, 1), RDI_EVAL_CTRLBITS(8, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), @@ -105,7 +104,6 @@ RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(2, 1, 1), RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(0, 1, 0), -RDI_EVAL_CTRLBITS(1, 0, 0), RDI_EVAL_CTRLBITS(1, 2, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(4, 0, 0), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index a1b93520..221c40d6 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -423,7 +423,6 @@ RDI_EvalOp_Cond = 2, RDI_EvalOp_Skip = 3, RDI_EvalOp_MemRead = 4, RDI_EvalOp_RegRead = 5, -RDI_EvalOp_RegReadDyn = 6, RDI_EvalOp_FrameOff = 7, RDI_EvalOp_ModuleOff = 8, RDI_EvalOp_TLSOff = 9, @@ -462,7 +461,6 @@ RDI_EvalOp_TruncSigned = 41, RDI_EvalOp_Convert = 42, RDI_EvalOp_Pick = 43, RDI_EvalOp_Pop = 44, -RDI_EvalOp_Insert = 45, RDI_EvalOp_ValueRead = 46, RDI_EvalOp_ByteSwap = 47, RDI_EvalOp_CallSiteValue = 48, @@ -939,7 +937,6 @@ X(Cond)\ X(Skip)\ X(MemRead)\ X(RegRead)\ -X(RegReadDyn)\ X(FrameOff)\ X(ModuleOff)\ X(TLSOff)\ @@ -978,7 +975,6 @@ X(TruncSigned)\ X(Convert)\ X(Pick)\ X(Pop)\ -X(Insert)\ X(ValueRead)\ X(ByteSwap)\ X(CallSiteValue)\ @@ -1480,6 +1476,6 @@ RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTyp RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); extern RDI_U16 rdi_section_element_size_table[44]; -extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; +extern RDI_U16 rdi_eval_op_ctrlbits_table[52]; #endif // RDI_H diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index ee618f74..a854ef14 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -415,6 +415,7 @@ #include "stap/stap_parse.h" #include "demon/demon_inc.h" #include "eval/eval_inc.h" +#include "eval2/eval2.h" #include "dbg_engine/dbg_engine_inc.h" #include "eval_visualization/eval_visualization_inc.h" #include "font_provider/font_provider_inc.h" @@ -474,6 +475,7 @@ #include "stap/stap_parse.c" #include "demon/demon_inc.c" #include "eval/eval_inc.c" +#include "eval2/eval2.c" #include "dbg_engine/dbg_engine_inc.c" #include "eval_visualization/eval_visualization_inc.c" #include "font_provider/font_provider_inc.c" diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index a06ac207..ea802c86 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1202,7 +1202,7 @@ RDI_EvalOpTable: {Skip 3 2 0 0} {MemRead 4 1 1 1} {RegRead 5 4 0 1} - {RegReadDyn 6 0 1 1} + // NOTE(rjf): 6 is free {FrameOff 7 8 0 1} {ModuleOff 8 4 0 1} {TLSOff 9 4 0 1} @@ -1241,7 +1241,7 @@ RDI_EvalOpTable: {Convert 42 2 1 1} {Pick 43 1 0 1} {Pop 44 0 1 0} - {Insert 45 1 0 0} + // NOTE(rjf): 45 is free {ValueRead 46 1 2 1} {ByteSwap 47 1 1 1} {CallSiteValue 48 4 0 0} diff --git a/src/rdi/rdi_local.c b/src/rdi/rdi_local.c index 247cd8bc..6e2fc0f6 100644 --- a/src/rdi/rdi_local.c +++ b/src/rdi/rdi_local.c @@ -351,7 +351,6 @@ rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc) String8 reg_str = rdi_string_from_reg_code(scratch.arena, arch, reg_code); imm_fmt = push_str8f(scratch.arena, "%S+%I64u, Size: %u", reg_str, byte_off, byte_size); } break; - case RDI_EvalOp_RegReadDyn: break; case RDI_EvalOp_FrameOff: { imm_fmt = push_str8f(scratch.arena, "%+lld", *(S64 *)imm.str); } break; @@ -426,10 +425,6 @@ rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc) imm_fmt = push_str8f(scratch.arena, "%u", pick); } break; case RDI_EvalOp_Pop: break; - case RDI_EvalOp_Insert: { - U8 insert = *(U8 *)imm.str; - imm_fmt = push_str8f(scratch.arena, "%u", insert); - } break; case RDI_EvalOp_ValueRead: { U8 bytes_to_read = *(U8 *)imm.str; imm_fmt = push_str8f(scratch.arena, "%u", bytes_to_read); From 7d8aa18e4d70481f2d17fd9a76f5251f99283afc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 13:53:56 -0700 Subject: [PATCH 789/850] make debug hash section tests error number agnostic --- src/linker/tests/linker_tests.c | 20 ++++++++++---------- src/llvm/llvm.c | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/linker/tests/linker_tests.c b/src/linker/tests/linker_tests.c index 90e7bb37..23b5bf0c 100644 --- a/src/linker/tests/linker_tests.c +++ b/src/linker/tests/linker_tests.c @@ -6055,10 +6055,10 @@ TEST(ghash_check_corrupt) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); - String8 expected_line = str8f(arena, "Warning(%03u): %S: .debug$H section is too small to contain the header", LNK_Warning_GHash, debug_obj_path, LLVM_GHash_Magic); + String8 expected_line = str8f(arena, "Warning(*): *: .debug$H section is too small to contain the header"); for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); - is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + is_warning_found = str8_match_wildcard(line, expected_line, StringMatchFlag_CaseInsensitive); } T_Ok(is_warning_found); } @@ -6104,10 +6104,10 @@ TEST(ghash_check_magic) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); - String8 expected_line = str8f(arena, "Warning(%03u): %S: .debug$H contains invalid magic: got 0x7b, expected 0x%x", LNK_Warning_GHash, debug_obj_path, LLVM_GHash_Magic); + String8 expected_line = str8f(arena, "Warning(*): *: .debug$H contains invalid magic: got 0x7b, expected 0x%x", LLVM_GHash_Magic); for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); - is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + is_warning_found = str8_match_wildcard(line, expected_line, StringMatchFlag_CaseInsensitive); } T_Ok(is_warning_found); } @@ -6153,10 +6153,10 @@ TEST(ghash_check_version) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); - String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H version: got %u, expected %u", LNK_Warning_GHash, debug_obj_path, 0xbeef, LLVM_GHash_CurrentVersion); + String8 expected_line = str8f(arena, "Warning(*): *: mismatched .debug$H version: got %u, expected %u", 0xbeef, LLVM_GHash_CurrentVersion); for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); - is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + is_warning_found = str8_match_wildcard(line, expected_line, StringMatchFlag_CaseInsensitive); } T_Ok(is_warning_found); } @@ -6194,10 +6194,10 @@ TEST(ghash_check_hash_alg) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); - String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash algorithm: got SHA1_8, expected BALK3", LNK_Warning_GHash, debug_obj_path); + String8 expected_line = str8f(arena, "Warning(*): *: mismatched .debug$H hash algorithm: got SHA1_8, expected BLAKE3"); for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); - is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + is_warning_found = str8_match_wildcard(line, expected_line, StringMatchFlag_CaseInsensitive); } T_Ok(is_warning_found); } @@ -6236,10 +6236,10 @@ TEST(ghash_match_debug_t) B32 is_warning_found = 0; String8 debug_obj_path = t_make_file_path(arena, str8_lit("debug.obj")); - String8 expected_line = str8f(arena, "Warning(%03u): %S: mismatched .debug$H hash count and type count: got 3 hashes for 2 types", LNK_Warning_GHash, debug_obj_path); + String8 expected_line = str8f(arena, "Warning(*): *: mismatched .debug$H hash count and type count: got 3 hashes for 2 types"); for (String8 i = g_errors; i.size > 0 && !is_warning_found; ) { String8 line = t_chop_line(&i); - is_warning_found = str8_match(expected_line, line, StringMatchFlag_CaseInsensitive); + is_warning_found = str8_match_wildcard(line, expected_line, StringMatchFlag_CaseInsensitive); } T_Ok(is_warning_found); } diff --git a/src/llvm/llvm.c b/src/llvm/llvm.c index d7337bde..f5a0f364 100644 --- a/src/llvm/llvm.c +++ b/src/llvm/llvm.c @@ -7,7 +7,7 @@ llvm_string_from_ghash_alg(LLVM_GHashAlg v) switch (v) { case LLVM_GHashAlg_SHA1: return str8_lit("SHA1"); case LLVM_GHashAlg_SHA1_8: return str8_lit("SHA1_8"); - case LLVM_GHashAlg_BLAKE3: return str8_lit("BALK3"); + case LLVM_GHashAlg_BLAKE3: return str8_lit("BLAKE3"); } return str8_zero(); } From d83f1fad1a4f06871ea339e44a158eabf0762620 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 12 Jun 2026 13:52:13 -0700 Subject: [PATCH 790/850] turn off eval2 for now --- src/raddbg/raddbg_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index a854ef14..3bae0ae7 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -415,7 +415,7 @@ #include "stap/stap_parse.h" #include "demon/demon_inc.h" #include "eval/eval_inc.h" -#include "eval2/eval2.h" +// #include "eval2/eval2.h" #include "dbg_engine/dbg_engine_inc.h" #include "eval_visualization/eval_visualization_inc.h" #include "font_provider/font_provider_inc.h" @@ -475,7 +475,7 @@ #include "stap/stap_parse.c" #include "demon/demon_inc.c" #include "eval/eval_inc.c" -#include "eval2/eval2.c" +// #include "eval2/eval2.c" #include "dbg_engine/dbg_engine_inc.c" #include "eval_visualization/eval_visualization_inc.c" #include "font_provider/font_provider_inc.c" From 083a843bf7e1a3b5931bd758c3cf6a7a2c4939e2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 12 Jun 2026 14:09:45 -0700 Subject: [PATCH 791/850] bump to 28 --- src/base/base_context_cracking.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index 87b32b45..ac27c9de 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -163,7 +163,7 @@ #endif #if !defined(BUILD_VERSION_PATCH) -# define BUILD_VERSION_PATCH 27 +# define BUILD_VERSION_PATCH 28 #endif #define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) From 58c17c2bc388cf6dfabf786bb2b1f449d53769a5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 12 Jun 2026 15:30:30 -0700 Subject: [PATCH 792/850] fix bad rdi opcode tables! --- src/lib_rdi/rdi.c | 4 +++- src/lib_rdi/rdi.h | 6 +++++- src/rdi/rdi.mdesk | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 16fb2684..0820c179 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -58,7 +58,7 @@ sizeof(RDI_NameMapNode), sizeof(RDI_U8), }; -RDI_U16 rdi_eval_op_ctrlbits_table[52] = +RDI_U16 rdi_eval_op_ctrlbits_table[54] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), @@ -66,6 +66,7 @@ RDI_EVAL_CTRLBITS(2, 1, 0), RDI_EVAL_CTRLBITS(2, 0, 0), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(4, 0, 1), +RDI_EVAL_CTRLBITS(0, 0, 1), RDI_EVAL_CTRLBITS(8, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), @@ -104,6 +105,7 @@ RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(2, 1, 1), RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(0, 1, 0), +RDI_EVAL_CTRLBITS(0, 0, 1), RDI_EVAL_CTRLBITS(1, 2, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(4, 0, 0), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index 221c40d6..ac624cdd 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -423,6 +423,7 @@ RDI_EvalOp_Cond = 2, RDI_EvalOp_Skip = 3, RDI_EvalOp_MemRead = 4, RDI_EvalOp_RegRead = 5, +RDI_EvalOp_Unused0 = 6, RDI_EvalOp_FrameOff = 7, RDI_EvalOp_ModuleOff = 8, RDI_EvalOp_TLSOff = 9, @@ -461,6 +462,7 @@ RDI_EvalOp_TruncSigned = 41, RDI_EvalOp_Convert = 42, RDI_EvalOp_Pick = 43, RDI_EvalOp_Pop = 44, +RDI_EvalOp_Unused1 = 45, RDI_EvalOp_ValueRead = 46, RDI_EvalOp_ByteSwap = 47, RDI_EvalOp_CallSiteValue = 48, @@ -937,6 +939,7 @@ X(Cond)\ X(Skip)\ X(MemRead)\ X(RegRead)\ +X(Unused0)\ X(FrameOff)\ X(ModuleOff)\ X(TLSOff)\ @@ -975,6 +978,7 @@ X(TruncSigned)\ X(Convert)\ X(Pick)\ X(Pop)\ +X(Unused1)\ X(ValueRead)\ X(ByteSwap)\ X(CallSiteValue)\ @@ -1476,6 +1480,6 @@ RDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTyp RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out); extern RDI_U16 rdi_section_element_size_table[44]; -extern RDI_U16 rdi_eval_op_ctrlbits_table[52]; +extern RDI_U16 rdi_eval_op_ctrlbits_table[54]; #endif // RDI_H diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index ea802c86..9f392a27 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1202,7 +1202,7 @@ RDI_EvalOpTable: {Skip 3 2 0 0} {MemRead 4 1 1 1} {RegRead 5 4 0 1} - // NOTE(rjf): 6 is free + {Unused0 6 0 0 1} {FrameOff 7 8 0 1} {ModuleOff 8 4 0 1} {TLSOff 9 4 0 1} @@ -1241,7 +1241,7 @@ RDI_EvalOpTable: {Convert 42 2 1 1} {Pick 43 1 0 1} {Pop 44 0 1 0} - // NOTE(rjf): 45 is free + {Unused1 45 0 0 1} {ValueRead 46 1 2 1} {ByteSwap 47 1 1 1} {CallSiteValue 48 4 0 0} From 41e6470d28be963660379323e88070c902c10dd8 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 14:17:23 -0700 Subject: [PATCH 793/850] fix radbin launch in p2r determinism test --- src/rdi_from_pdb/tests/rdi_from_pdb_tests.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c index f391de11..34c09dc2 100644 --- a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c +++ b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c @@ -45,7 +45,7 @@ Test(p2r_determinism) String8 rdi_name = str8f(arena, "repeat_%I64u.rdi", repeat_idx); String8 rdi_path = str8f(arena, "%S/%S", ctx->artifacts_path, rdi_name); str8_list_push(arena, &rdi_paths, rdi_path); - String8 cmdl = str8f(arena, "radbin --rdi --deterministic %S --out:%S", pdb_path, rdi_path); + String8 cmdl = str8f(arena, "%S --rdi --deterministic %S --out:%S", t_radbin_path(), pdb_path, rdi_path); Process process = launch_cmd_line(cmdl); TestCheck(!process_match(process_zero(), process)); process_list_push(arena, &processes, process); @@ -64,7 +64,7 @@ Test(p2r_determinism) String8 rdi_path = n->string; String8 dump_path = str8f(arena, "%S.dump", rdi_path); str8_list_push(arena, &dump_paths, dump_path); - Process process_handle = launch_cmd_linef("radbin --dump --deterministic %S --out:%S", rdi_path, dump_path); + Process process_handle = launch_cmd_linef("%S --dump --deterministic %S --out:%S", t_radbin_path(), rdi_path, dump_path); TestCheck(!process_match(process_zero(), process_handle)); process_list_push(arena, &processes, process_handle); } From c6a4e4c02bea92b3a26748847eaca4591cbb0f0c Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 14:49:22 -0700 Subject: [PATCH 794/850] skip broken tests --- src/raddbg/tests/raddbg_tests.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index 394853ef..d328f464 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -315,17 +315,17 @@ rd_test__eval_regressions(Arena *arena, TestCtx *ctx, String8 target_binary, Str //////////////////////////////// //~ rjf: Tests -Test(mule_main_9ff1e58f_step_regressions_0) +SkippedTest(mule_main_9ff1e58f_step_regressions_0) { rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("mule_main"), 0); } -Test(mule_main_9ff1e58f_step_regressions_1) +SkippedTest(mule_main_9ff1e58f_step_regressions_1) { rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("mule_main"), 1); } -Test(mule_main_9ff1e58f_control_flow_step_regressions) +SkippedTest(mule_main_9ff1e58f_control_flow_step_regressions) { rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("control_flow_stepping_tests"), 0); } From 6ca7f162aa3331a9a81fdc798818a57b173d70dd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 13 Jun 2026 06:17:55 -0700 Subject: [PATCH 795/850] shift temporarily to 27 --- src/base/base_context_cracking.h | 2 +- src/raddbg/tests/raddbg_tests.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index ac27c9de..87b32b45 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -163,7 +163,7 @@ #endif #if !defined(BUILD_VERSION_PATCH) -# define BUILD_VERSION_PATCH 28 +# define BUILD_VERSION_PATCH 27 #endif #define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index d328f464..394853ef 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -315,17 +315,17 @@ rd_test__eval_regressions(Arena *arena, TestCtx *ctx, String8 target_binary, Str //////////////////////////////// //~ rjf: Tests -SkippedTest(mule_main_9ff1e58f_step_regressions_0) +Test(mule_main_9ff1e58f_step_regressions_0) { rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("mule_main"), 0); } -SkippedTest(mule_main_9ff1e58f_step_regressions_1) +Test(mule_main_9ff1e58f_step_regressions_1) { rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("mule_main"), 1); } -SkippedTest(mule_main_9ff1e58f_control_flow_step_regressions) +Test(mule_main_9ff1e58f_control_flow_step_regressions) { rd_test__stepping_regressions(arena, ctx, s("mule_main_9ff1e58f"), s("control_flow_stepping_tests"), 0); } From c030488814861199e3399d5cb5cec08a0241b452 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 12 Jun 2026 22:17:31 -0700 Subject: [PATCH 796/850] fallback on PCH signature when file path match fails --- src/base/base_core.h | 4 +- src/linker/codeview_ext/codeview.c | 16 +-- src/linker/lnk_debug_info.c | 74 ++++++++---- src/linker/tests/linker_tests.c | 187 +++++++++++++++++++++++++++++ 4 files changed, 249 insertions(+), 32 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index ebef4649..858ca47e 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -445,8 +445,8 @@ C_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t s # define this_function_name __func__ #endif -#define TryRead(func__, cursor__, label__) do { U64 size__ = (func__); if (size__ == 0) { Assert(0 && "failed read"); goto label__; } cursor__ += size__; } while (0) -#define TryReadBreak(func__, cursor__) { U64 size__ = (func__); if (size__ == 0) { Assert(0 && "failed read"); break; } cursor__ += size__; } +#define TryRead(func__, cursor__, label__) do { U64 size__ = (func__); if (size__ == 0) { goto label__; } cursor__ += size__; } while (0) +#define TryReadBreak(func__, cursor__) { U64 size__ = (func__); if (size__ == 0) { break; } cursor__ += size__; } //////////////////////////////// //~ rjf: Base Types diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index 6dc83333..ef6b6234 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -84,7 +84,7 @@ internal U64 cv_read_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out) { // do we have enough bytes to read header? - Assert(raw_data.size >= sizeof(CV_LeafHeader)); + if (raw_data.size < sizeof(CV_LeafHeader)) { return 0; } U8 *leaf_ptr = raw_data.str + off; @@ -92,17 +92,18 @@ cv_read_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out) CV_LeafHeader header = { .v = memory_read32(leaf_ptr) }; // leaf size must have enough bytes for the kind enum - Assert(header.size >= sizeof(CV_LeafKind)); + if (header.size < sizeof(CV_LeafKind)) { return 0; } // do we have enough bytes to read leaf data? - Assert(sizeof(CV_LeafSize) + header.size <= raw_data.size); + if (sizeof(CV_LeafSize) + header.size > raw_data.size) { return 0; } // fill out leaf leaf_out->kind = header.kind; leaf_out->data = str8(leaf_ptr + sizeof(CV_LeafHeader), header.size - sizeof(CV_LeafKind)); U64 leaf_size = AlignPow2(sizeof(CV_LeafHeader) + leaf_out->data.size, align); - Assert(leaf_size <= raw_data.size); + if (leaf_size > raw_data.size) { return 0; } + return leaf_size; } @@ -1161,10 +1162,9 @@ count_stop: ProfBegin("store leaf offsets"); debug_t.offsets = push_array_no_zero(arena, U32, debug_t.count); - for (U64 cursor = 0, idx = 0; cursor < data.size;) { - debug_t.offsets[idx++] = cursor; - CV_Leaf leaf; - TryRead(cv_read_leaf(data, cursor, align, &leaf), cursor, store_stop); + for (U64 cursor = 0, idx = 0; cursor < data.size && idx < debug_t.count; idx += 1) { + debug_t.offsets[idx] = cursor; + TryRead(cv_read_leaf(data, cursor, align, &(CV_Leaf){0}), cursor, store_stop); } store_stop: diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 4dc7d2ea..cd751deb 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -632,21 +632,6 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, } } - // pre-build PCH obj hash map (obj_path, obj_idx) - String8 work_dir = get_current_path(scratch.arena); - HashMap debug_p_hm = {0}; - for EachIndex(obj_idx, obj_count) { - LNK_Obj *obj = obj_arr[obj_idx]; - if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { - String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_arr[obj_idx]->path, work_dir); - if (hash_map_search_path_u64(&debug_p_hm, obj_path)) { - lnk_error_obj(LNK_Warning_DuplicateObjPath, obj_arr[obj_idx], "duplicate obj path %S", obj_path); - } else { - hash_map_push_path_u64(scratch.arena, &debug_p_hm, obj_path, obj_idx); - } - } - } - ProfBegin("Apply RRT to Objs"); // hash map (obj path, obj idx) @@ -698,6 +683,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, input.debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(".debug$S"), 0); ProfEnd(); + // profiler info if (lnk_get_log_status(LNK_Log_Debug) || PROFILE_TELEMETRY) { U64 total_debug_s_size = 0, total_debug_t_size = 0, total_debug_p_size = 0, total_debug_h_size = 0; for EachIndex(obj_idx, obj_count) { @@ -745,41 +731,48 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, ProfBegin("Parse CodeView"); CV_DebugT *debug_p_arr; { + // parse .debug$S input.debug_s_arr = push_array(tp_arena->v[0], CV_DebugS, input.obj_count); tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_s_task, &input, "Parse .debug$S"); + // collect .debug$P and .debug$T String8Array *raw_debug_p_arr = push_array(scratch.arena, String8Array, obj_count); String8Array *raw_debug_t_arr = push_array(scratch.arena, String8Array, obj_count); for EachIndex(obj_idx, obj_count) { LNK_Obj *obj = obj_arr[obj_idx]; if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { - LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, obj->debug_t_sect_idx); + LNK_ObjSection debug_t_sect = lnk_obj_section_from_sect_idx(obj, obj->debug_t_sect_idx); raw_debug_t_arr[obj_idx].count = 1; raw_debug_t_arr[obj_idx].v = push_array(scratch.arena, String8, 1); - raw_debug_t_arr[obj_idx].v[0] = str8_substr(obj->data, section.frange); + raw_debug_t_arr[obj_idx].v[0] = str8_substr(obj->data, debug_t_sect.frange); } + if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { - LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, obj->debug_p_sect_idx); + LNK_ObjSection debug_p_sect = lnk_obj_section_from_sect_idx(obj, obj->debug_p_sect_idx); raw_debug_p_arr[obj_idx].count = 1; raw_debug_p_arr[obj_idx].v = push_array(scratch.arena, String8, 1); - raw_debug_p_arr[obj_idx].v[0] = str8_substr(obj->data, section.frange); + raw_debug_p_arr[obj_idx].v[0] = str8_substr(obj->data, debug_p_sect.frange); } } LNK_ParseCvTypes parse_types = { .input = &input }; + + // parse .debug$P debug_p_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); parse_types.raw_types = raw_debug_p_arr; parse_types.out_types = debug_p_arr; tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$P"); tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$P"); + // parse .debug$T input.debug_t_arr = push_array(tp_arena->v[0], CV_DebugT, obj_count); parse_types.raw_types = raw_debug_t_arr; parse_types.out_types = input.debug_t_arr; tp_for_parallel_prof(tp, 0, obj_count, lnk_strip_debug_t_sig_task, &parse_types, "Strip .debug$T"); tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_t_task, &parse_types, "Parse .debug$T"); + // parse .debug$H input.debug_h_arr = push_array(tp_arena->v[0], CV_DebugH, input.obj_count); if (config->ghash) { tp_for_parallel_prof(tp, tp_arena, obj_count, lnk_parse_debug_h_task, &input, "Parse .debug$H"); @@ -961,6 +954,40 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, ProfBegin("Set up PCH"); { + // pre-build PCH obj hash map (obj_path, obj_idx) + HashMap debug_p_hm_path = {0}; + HashMap debug_p_hm_sig = {0}; + for EachIndex(i, input.debug_p_indices.count) { + U64 obj_idx = input.debug_p_indices.v[i]; + LNK_Obj *obj = obj_arr[obj_idx]; + + // register PCH signature + CV_DebugT debug_p = input.debug_t_arr[obj_idx]; + if (debug_p.count > 0) { + CV_Leaf lf = cv_debug_t_get_leaf(&debug_p, debug_p.count - 1); + if (lf.kind == CV_LeafKind_ENDPRECOMP && lf.data.size <= sizeof(CV_LeafEndPreComp)) { + CV_LeafEndPreComp *ender = str8_deserial_get_raw_ptr(lf.data, 0, sizeof(*ender)); + if (ender->sig) { + U64 *extant_obj_idx = hash_map_search_u64_u64(&debug_p_hm_sig, ender->sig); + if (extant_obj_idx == 0) { + hash_map_push_u64_u64(scratch.arena, &debug_p_hm_sig, ender->sig, obj_idx); + } else { + LNK_Obj *extant_obj = obj_arr[*extant_obj_idx]; + lnk_log(LNK_Log_Debug, "%S: PCH signature is already defined in %S", lnk_loc_from_obj(scratch.arena, obj), lnk_loc_from_obj(scratch.arena, extant_obj)); + } + } + } + } + + // register PCH path + String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_arr[obj_idx]->path, config->work_dir); + if (hash_map_search_path_u64(&debug_p_hm_path, obj_path)) { + lnk_error_obj(LNK_Warning_DuplicateObjPath, obj, "duplicate obj path %S", obj_path); + } else { + hash_map_push_path_u64(scratch.arena, &debug_p_hm_path, obj_path, obj_idx); + } + } + for EachIndex(i, input.int_obj_indices.count) { U64 obj_idx = input.int_obj_indices.v[i]; CV_DebugT *debug_t = &input.debug_t_arr[obj_idx]; @@ -970,15 +997,18 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, // find PCH obj CV_PrecompInfo precomp = cv_precomp_info_from_leaf(cv_debug_t_get_leaf(debug_t, 0)); - String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir); - U64 *debug_p_obj_idx_ptr = hash_map_search_path_u64(&debug_p_hm, obj_path); + String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, config->work_dir); + U64 *debug_p_obj_idx_ptr = hash_map_search_path_u64(&debug_p_hm_path, obj_path); + if (debug_p_obj_idx_ptr == 0) { + debug_p_obj_idx_ptr = hash_map_search_u64_u64(&debug_p_hm_sig, precomp.sig); + } // try alternative directory for the PCH if (debug_p_obj_idx_ptr == 0) { String8 obj_name = str8_skip_last_slash(obj_path); for EachNode(alt_dir_n, String8Node, config->alt_pch_dirs.first) { String8 alt_obj_path = str8f(scratch.arena, "%S/%S", alt_dir_n->string, obj_name); - debug_p_obj_idx_ptr = hash_map_search_path_u64(&debug_p_hm, alt_obj_path); + debug_p_obj_idx_ptr = hash_map_search_path_u64(&debug_p_hm_path, alt_obj_path); if (debug_p_obj_idx_ptr) { break; } } } diff --git a/src/linker/tests/linker_tests.c b/src/linker/tests/linker_tests.c index 23b5bf0c..014708bf 100644 --- a/src/linker/tests/linker_tests.c +++ b/src/linker/tests/linker_tests.c @@ -5073,6 +5073,193 @@ TEST(debug_p_sig_mismatch) T_Ok(found_error); } +TEST(pch_sig_fallback) +{ + String8 a_obj_file_path = t_make_file_path(arena, str8_lit("a.obj")); + String8 b_obj_file_path = t_make_file_path(arena, str8_lit("b.obj")); + U32 a_sig = 0xCAFEBABE; + U32 b_sig = 0xCAFEBABE; + + String8 a_debug_s; + { + String8List srl; + str8_serial_begin(arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = a_sig; + String8 obj_name_string = a_obj_file_path; + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); + + String8 comp3_data = cv_make_comp3(arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); + + a_debug_s = str8_serial_end(arena, &srl); + } + String8 a_debug_p; + { + String8List srl; + str8_serial_begin(arena, &srl); + + // signature + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + + // duplicate in a.obj + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + // unique procedure type + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearPascal }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(proc)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + // PCH ender + CV_LeafEndPreComp endprecomp = { .sig = a_sig }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_ENDPRECOMP); + str8_serial_push_struct(arena, &srl, &endprecomp); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + a_debug_p = str8_serial_end(arena, &srl); + } + + String8 b_debug_s; + { + String8List srl; + str8_serial_begin(arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = b_sig; + String8 obj_name_string = a_obj_file_path; + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); + + String8 comp3_data = cv_make_comp3(arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); + + b_debug_s = str8_serial_end(arena, &srl); + } + + String8 b_debug_t; + { + String8List srl; + str8_serial_begin(arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + + String8 corrupt_pch_path = str8_lit("corrupt-pch-file-path.obj"); + + CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 2, sig = b_sig }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + corrupt_pch_path.size + 1); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PRECOMP); + str8_serial_push_struct(arena, &srl, &precomp); + str8_serial_push_cstr(arena, &srl, corrupt_pch_path); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + b_debug_t = str8_serial_end(arena, &srl); + } + + String8 a_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_p", ".debug$P", a_debug_p, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", a_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); + + String8 b_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", b_debug_t, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", b_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); + + T_Ok(write_data_to_file_path(a_obj_file_path, a_obj)); + T_Ok(write_data_to_file_path(b_obj_file_path, b_obj)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code == 0); +} + TEST(debug_p_and_debug_t_in_obj) { U32 pch_sig = 0xCAFEBABE; From 6a2aa95ea347626643cc436f3180fcbf4dfec93a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 13 Jun 2026 06:38:03 -0700 Subject: [PATCH 797/850] okay, *now* bump to 28 --- src/base/base_context_cracking.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index 87b32b45..ac27c9de 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -163,7 +163,7 @@ #endif #if !defined(BUILD_VERSION_PATCH) -# define BUILD_VERSION_PATCH 27 +# define BUILD_VERSION_PATCH 28 #endif #define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) "." Stringify(BUILD_VERSION_MINOR) "." Stringify(BUILD_VERSION_PATCH) From d9efc61b664c06c057cbfb588e6ca4f32a1eb422 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 13 Jun 2026 11:21:42 -0700 Subject: [PATCH 798/850] just dump file name in raddbg state dump; commit to exemplars; keep exemplars more context-free --- .../exemplar_windows | 200 +++++++++--------- .../exemplar_windows | 194 ++++++++--------- .../exemplar_windows | 196 ++++++++--------- src/raddbg/raddbg_core.c | 4 +- 4 files changed, 297 insertions(+), 297 deletions(-) diff --git a/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows index b7a9e2c2..9d339b2b 100644 --- a/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows +++ b/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows @@ -1,7 +1,7 @@ lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2366 column_num: 1 voff_range: @@ -16,7 +16,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2368 column_num: 1 voff_range: @@ -31,7 +31,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2369 column_num: 1 voff_range: @@ -46,7 +46,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2372 column_num: 1 voff_range: @@ -61,7 +61,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2373 column_num: 1 voff_range: @@ -76,7 +76,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2378 column_num: 1 voff_range: @@ -91,7 +91,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2379 column_num: 1 voff_range: @@ -106,7 +106,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2383 column_num: 1 voff_range: @@ -121,7 +121,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2385 column_num: 1 voff_range: @@ -136,7 +136,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2390 column_num: 1 voff_range: @@ -151,7 +151,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2391 column_num: 1 voff_range: @@ -166,7 +166,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2393 column_num: 1 voff_range: @@ -181,7 +181,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2394 column_num: 1 voff_range: @@ -196,7 +196,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2398 column_num: 1 voff_range: @@ -211,7 +211,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2399 column_num: 1 voff_range: @@ -226,7 +226,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2400 column_num: 1 voff_range: @@ -241,7 +241,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2401 column_num: 1 voff_range: @@ -256,7 +256,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2405 column_num: 1 voff_range: @@ -271,7 +271,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2407 column_num: 1 voff_range: @@ -286,7 +286,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2419 column_num: 1 voff_range: @@ -301,7 +301,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2420 column_num: 1 voff_range: @@ -316,7 +316,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2421 column_num: 1 voff_range: @@ -331,7 +331,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2423 column_num: 1 voff_range: @@ -346,7 +346,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2429 column_num: 1 voff_range: @@ -361,7 +361,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2431 column_num: 1 voff_range: @@ -376,7 +376,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2446 column_num: 1 voff_range: @@ -391,7 +391,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2447 column_num: 1 voff_range: @@ -406,7 +406,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2448 column_num: 1 voff_range: @@ -421,7 +421,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2449 column_num: 1 voff_range: @@ -436,7 +436,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2452 column_num: 1 voff_range: @@ -451,7 +451,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2461 column_num: 1 voff_range: @@ -466,7 +466,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -481,7 +481,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -496,7 +496,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -511,7 +511,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -526,7 +526,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -541,7 +541,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -556,7 +556,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -571,7 +571,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -586,7 +586,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -601,7 +601,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -616,7 +616,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -631,7 +631,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -646,7 +646,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -661,7 +661,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -676,7 +676,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -691,7 +691,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -706,7 +706,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -721,7 +721,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -736,7 +736,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -751,7 +751,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -766,7 +766,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -781,7 +781,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -796,7 +796,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -811,7 +811,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -826,7 +826,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -841,7 +841,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -856,7 +856,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -871,7 +871,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -886,7 +886,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2463 column_num: 1 voff_range: @@ -901,7 +901,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2464 column_num: 1 voff_range: @@ -916,7 +916,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2462 column_num: 1 voff_range: @@ -931,7 +931,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2468 column_num: 1 voff_range: @@ -946,7 +946,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -961,7 +961,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -976,7 +976,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -991,7 +991,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1006,7 +1006,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1021,7 +1021,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1036,7 +1036,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1051,7 +1051,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1066,7 +1066,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1081,7 +1081,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1096,7 +1096,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1111,7 +1111,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1126,7 +1126,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1141,7 +1141,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1156,7 +1156,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1171,7 +1171,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1186,7 +1186,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1201,7 +1201,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1216,7 +1216,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1231,7 +1231,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1246,7 +1246,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1261,7 +1261,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1276,7 +1276,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1291,7 +1291,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1306,7 +1306,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1321,7 +1321,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1336,7 +1336,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1351,7 +1351,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1366,7 +1366,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2471 column_num: 1 voff_range: @@ -1381,7 +1381,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2472 column_num: 1 voff_range: @@ -1396,7 +1396,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2469 column_num: 1 voff_range: @@ -1411,7 +1411,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2476 column_num: 1 voff_range: @@ -1426,7 +1426,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2477 column_num: 1 voff_range: @@ -1441,7 +1441,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2478 column_num: 1 voff_range: @@ -1456,7 +1456,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2477 column_num: 1 voff_range: @@ -1471,7 +1471,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2478 column_num: 1 voff_range: @@ -1486,7 +1486,7 @@ ip_voff_symbol: control_flow_stepping_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 2477 column_num: 1 voff_range: diff --git a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows index e4c74f42..619c87e5 100644 --- a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows +++ b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows @@ -1,7 +1,7 @@ lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3193 column_num: 1 voff_range: @@ -16,7 +16,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3194 column_num: 1 voff_range: @@ -31,7 +31,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 245 column_num: 1 voff_range: @@ -46,7 +46,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 246 column_num: 1 voff_range: @@ -61,7 +61,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 246 column_num: 1 voff_range: @@ -76,7 +76,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 247 column_num: 1 voff_range: @@ -91,7 +91,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 248 column_num: 1 voff_range: @@ -106,7 +106,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3194 column_num: 1 voff_range: @@ -121,7 +121,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3195 column_num: 1 voff_range: @@ -136,7 +136,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 245 column_num: 1 voff_range: @@ -151,7 +151,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 246 column_num: 1 voff_range: @@ -166,7 +166,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 246 column_num: 1 voff_range: @@ -181,7 +181,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 247 column_num: 1 voff_range: @@ -196,7 +196,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 248 column_num: 1 voff_range: @@ -211,7 +211,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3195 column_num: 1 voff_range: @@ -226,7 +226,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3196 column_num: 1 voff_range: @@ -241,7 +241,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 239 column_num: 1 voff_range: @@ -256,7 +256,7 @@ ip_voff_symbol: raddbg_is_attached__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 240 column_num: 1 voff_range: @@ -271,7 +271,7 @@ ip_voff_symbol: raddbg_is_attached__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 241 column_num: 1 voff_range: @@ -286,7 +286,7 @@ ip_voff_symbol: raddbg_is_attached__impl lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3196 column_num: 1 voff_range: @@ -301,7 +301,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3198 column_num: 1 voff_range: @@ -316,7 +316,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3201 column_num: 1 voff_range: @@ -331,7 +331,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 39 column_num: 1 voff_range: @@ -346,7 +346,7 @@ ip_voff_symbol: mule_init lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 40 column_num: 1 voff_range: @@ -361,7 +361,7 @@ ip_voff_symbol: mule_init lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 40 column_num: 1 voff_range: @@ -376,7 +376,7 @@ ip_voff_symbol: mule_init lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 41 column_num: 1 voff_range: @@ -391,7 +391,7 @@ ip_voff_symbol: mule_init lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3203 column_num: 1 voff_range: @@ -406,7 +406,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 424 column_num: 1 voff_range: @@ -421,7 +421,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 425 column_num: 1 voff_range: @@ -436,7 +436,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 426 column_num: 1 voff_range: @@ -451,7 +451,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 428 column_num: 1 voff_range: @@ -466,7 +466,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 429 column_num: 1 voff_range: @@ -481,7 +481,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 431 column_num: 1 voff_range: @@ -496,7 +496,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 432 column_num: 1 voff_range: @@ -511,7 +511,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 434 column_num: 1 voff_range: @@ -526,7 +526,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 435 column_num: 1 voff_range: @@ -541,7 +541,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 440 column_num: 1 voff_range: @@ -556,7 +556,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 445 column_num: 1 voff_range: @@ -571,7 +571,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 451 column_num: 1 voff_range: @@ -586,7 +586,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 452 column_num: 1 voff_range: @@ -601,7 +601,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 454 column_num: 1 voff_range: @@ -616,7 +616,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 455 column_num: 1 voff_range: @@ -631,7 +631,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 456 column_num: 1 voff_range: @@ -646,7 +646,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 458 column_num: 1 voff_range: @@ -661,7 +661,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 460 column_num: 1 voff_range: @@ -676,7 +676,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 461 column_num: 1 voff_range: @@ -691,7 +691,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 462 column_num: 1 voff_range: @@ -706,7 +706,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 467 column_num: 1 voff_range: @@ -721,7 +721,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 468 column_num: 1 voff_range: @@ -736,7 +736,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 469 column_num: 1 voff_range: @@ -751,7 +751,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 470 column_num: 1 voff_range: @@ -766,7 +766,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 471 column_num: 1 voff_range: @@ -781,7 +781,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 472 column_num: 1 voff_range: @@ -796,7 +796,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 473 column_num: 1 voff_range: @@ -811,7 +811,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 474 column_num: 1 voff_range: @@ -826,7 +826,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 475 column_num: 1 voff_range: @@ -841,7 +841,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 477 column_num: 1 voff_range: @@ -856,7 +856,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 481 column_num: 1 voff_range: @@ -871,7 +871,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 482 column_num: 1 voff_range: @@ -886,7 +886,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 483 column_num: 1 voff_range: @@ -901,7 +901,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 484 column_num: 1 voff_range: @@ -916,7 +916,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 485 column_num: 1 voff_range: @@ -931,7 +931,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 486 column_num: 1 voff_range: @@ -946,7 +946,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 490 column_num: 1 voff_range: @@ -961,7 +961,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 491 column_num: 1 voff_range: @@ -976,7 +976,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 494 column_num: 1 voff_range: @@ -991,7 +991,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 497 column_num: 1 voff_range: @@ -1006,7 +1006,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 498 column_num: 1 voff_range: @@ -1021,7 +1021,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 499 column_num: 1 voff_range: @@ -1036,7 +1036,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 500 column_num: 1 voff_range: @@ -1051,7 +1051,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 501 column_num: 1 voff_range: @@ -1066,7 +1066,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 504 column_num: 1 voff_range: @@ -1081,7 +1081,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 512 column_num: 1 voff_range: @@ -1096,7 +1096,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 514 column_num: 1 voff_range: @@ -1111,7 +1111,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 515 column_num: 1 voff_range: @@ -1126,7 +1126,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 516 column_num: 1 voff_range: @@ -1141,7 +1141,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 517 column_num: 1 voff_range: @@ -1156,7 +1156,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 518 column_num: 1 voff_range: @@ -1171,7 +1171,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 519 column_num: 1 voff_range: @@ -1186,7 +1186,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 520 column_num: 1 voff_range: @@ -1201,7 +1201,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 521 column_num: 1 voff_range: @@ -1216,7 +1216,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 522 column_num: 1 voff_range: @@ -1231,7 +1231,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 525 column_num: 1 voff_range: @@ -1246,7 +1246,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 526 column_num: 1 voff_range: @@ -1261,7 +1261,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 528 column_num: 1 voff_range: @@ -1276,7 +1276,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 530 column_num: 1 voff_range: @@ -1291,7 +1291,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 533 column_num: 1 voff_range: @@ -1306,7 +1306,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 534 column_num: 1 voff_range: @@ -1321,7 +1321,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 535 column_num: 1 voff_range: @@ -1336,7 +1336,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 536 column_num: 1 voff_range: @@ -1351,7 +1351,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 537 column_num: 1 voff_range: @@ -1366,7 +1366,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 542 column_num: 1 voff_range: @@ -1381,7 +1381,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 543 column_num: 1 voff_range: @@ -1396,7 +1396,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 544 column_num: 1 voff_range: @@ -1411,7 +1411,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 545 column_num: 1 voff_range: @@ -1426,7 +1426,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 549 column_num: 1 voff_range: @@ -1441,7 +1441,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 551 column_num: 1 voff_range: diff --git a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows index bc6bde92..5101e487 100644 --- a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows +++ b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows @@ -1,7 +1,7 @@ lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3193 column_num: 1 voff_range: @@ -16,7 +16,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3194 column_num: 1 voff_range: @@ -31,7 +31,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3195 column_num: 1 voff_range: @@ -46,7 +46,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 245 column_num: 1 voff_range: @@ -61,7 +61,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 246 column_num: 1 voff_range: @@ -76,7 +76,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 246 column_num: 1 voff_range: @@ -91,7 +91,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 247 column_num: 1 voff_range: @@ -106,7 +106,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 248 column_num: 1 voff_range: @@ -121,7 +121,7 @@ ip_voff_symbol: raddbg_thread_id__impl lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3195 column_num: 1 voff_range: @@ -136,7 +136,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3196 column_num: 1 voff_range: @@ -151,7 +151,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 239 column_num: 1 voff_range: @@ -166,7 +166,7 @@ ip_voff_symbol: raddbg_is_attached__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 240 column_num: 1 voff_range: @@ -181,7 +181,7 @@ ip_voff_symbol: raddbg_is_attached__impl lines: { { - file_path: "../../../../src/lib_raddbg_markup/raddbg_markup.h" + file_name: "raddbg_markup.h" line_num: 241 column_num: 1 voff_range: @@ -196,7 +196,7 @@ ip_voff_symbol: raddbg_is_attached__impl lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3196 column_num: 1 voff_range: @@ -211,7 +211,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3198 column_num: 1 voff_range: @@ -226,7 +226,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3201 column_num: 1 voff_range: @@ -241,7 +241,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 39 column_num: 1 voff_range: @@ -256,7 +256,7 @@ ip_voff_symbol: mule_init lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 40 column_num: 1 voff_range: @@ -271,7 +271,7 @@ ip_voff_symbol: mule_init lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 40 column_num: 1 voff_range: @@ -286,7 +286,7 @@ ip_voff_symbol: mule_init lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 41 column_num: 1 voff_range: @@ -301,7 +301,7 @@ ip_voff_symbol: mule_init lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 3203 column_num: 1 voff_range: @@ -316,7 +316,7 @@ ip_voff_symbol: mule_main lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 424 column_num: 1 voff_range: @@ -331,7 +331,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 425 column_num: 1 voff_range: @@ -346,7 +346,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 426 column_num: 1 voff_range: @@ -361,7 +361,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 428 column_num: 1 voff_range: @@ -376,7 +376,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 429 column_num: 1 voff_range: @@ -391,7 +391,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 431 column_num: 1 voff_range: @@ -406,7 +406,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 432 column_num: 1 voff_range: @@ -421,7 +421,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 434 column_num: 1 voff_range: @@ -436,7 +436,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 435 column_num: 1 voff_range: @@ -451,7 +451,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 440 column_num: 1 voff_range: @@ -466,7 +466,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 445 column_num: 1 voff_range: @@ -481,7 +481,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 451 column_num: 1 voff_range: @@ -496,7 +496,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 452 column_num: 1 voff_range: @@ -511,7 +511,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 454 column_num: 1 voff_range: @@ -526,7 +526,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 455 column_num: 1 voff_range: @@ -541,7 +541,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 456 column_num: 1 voff_range: @@ -556,7 +556,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 458 column_num: 1 voff_range: @@ -571,7 +571,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 460 column_num: 1 voff_range: @@ -586,7 +586,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 461 column_num: 1 voff_range: @@ -601,7 +601,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 462 column_num: 1 voff_range: @@ -616,7 +616,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 467 column_num: 1 voff_range: @@ -631,7 +631,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 468 column_num: 1 voff_range: @@ -646,7 +646,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 469 column_num: 1 voff_range: @@ -661,7 +661,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 470 column_num: 1 voff_range: @@ -676,7 +676,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 471 column_num: 1 voff_range: @@ -691,7 +691,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 472 column_num: 1 voff_range: @@ -706,7 +706,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 473 column_num: 1 voff_range: @@ -721,7 +721,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 474 column_num: 1 voff_range: @@ -736,7 +736,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 475 column_num: 1 voff_range: @@ -751,7 +751,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 477 column_num: 1 voff_range: @@ -766,7 +766,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 481 column_num: 1 voff_range: @@ -781,7 +781,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 482 column_num: 1 voff_range: @@ -796,7 +796,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 483 column_num: 1 voff_range: @@ -811,7 +811,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 484 column_num: 1 voff_range: @@ -826,7 +826,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 485 column_num: 1 voff_range: @@ -841,7 +841,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 486 column_num: 1 voff_range: @@ -856,7 +856,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 490 column_num: 1 voff_range: @@ -871,7 +871,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 491 column_num: 1 voff_range: @@ -886,7 +886,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 494 column_num: 1 voff_range: @@ -901,7 +901,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 497 column_num: 1 voff_range: @@ -916,7 +916,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 498 column_num: 1 voff_range: @@ -931,7 +931,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 499 column_num: 1 voff_range: @@ -946,7 +946,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 500 column_num: 1 voff_range: @@ -961,7 +961,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 501 column_num: 1 voff_range: @@ -976,7 +976,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 504 column_num: 1 voff_range: @@ -991,7 +991,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 512 column_num: 1 voff_range: @@ -1006,7 +1006,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 514 column_num: 1 voff_range: @@ -1021,7 +1021,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 515 column_num: 1 voff_range: @@ -1036,7 +1036,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 516 column_num: 1 voff_range: @@ -1051,7 +1051,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 517 column_num: 1 voff_range: @@ -1066,7 +1066,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 518 column_num: 1 voff_range: @@ -1081,7 +1081,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 519 column_num: 1 voff_range: @@ -1096,7 +1096,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 520 column_num: 1 voff_range: @@ -1111,7 +1111,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 521 column_num: 1 voff_range: @@ -1126,7 +1126,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 522 column_num: 1 voff_range: @@ -1141,7 +1141,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 525 column_num: 1 voff_range: @@ -1156,7 +1156,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 526 column_num: 1 voff_range: @@ -1171,7 +1171,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 528 column_num: 1 voff_range: @@ -1186,7 +1186,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 530 column_num: 1 voff_range: @@ -1201,7 +1201,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 533 column_num: 1 voff_range: @@ -1216,7 +1216,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 534 column_num: 1 voff_range: @@ -1231,7 +1231,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 535 column_num: 1 voff_range: @@ -1246,7 +1246,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 536 column_num: 1 voff_range: @@ -1261,7 +1261,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 537 column_num: 1 voff_range: @@ -1276,7 +1276,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 542 column_num: 1 voff_range: @@ -1291,7 +1291,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 543 column_num: 1 voff_range: @@ -1306,7 +1306,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 544 column_num: 1 voff_range: @@ -1321,7 +1321,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 545 column_num: 1 voff_range: @@ -1336,7 +1336,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 549 column_num: 1 voff_range: @@ -1351,7 +1351,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 551 column_num: 1 voff_range: @@ -1366,7 +1366,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 561 column_num: 1 voff_range: @@ -1381,7 +1381,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 562 column_num: 1 voff_range: @@ -1396,7 +1396,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 563 column_num: 1 voff_range: @@ -1411,7 +1411,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 564 column_num: 1 voff_range: @@ -1426,7 +1426,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 565 column_num: 1 voff_range: @@ -1441,7 +1441,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 567 column_num: 1 voff_range: @@ -1456,7 +1456,7 @@ ip_voff_symbol: type_coverage_eval_tests lines: { { - file_path: "../../../../src/mule/mule_main.cpp" + file_name: "mule_main.cpp" line_num: 569 column_num: 1 voff_range: diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 83fd9357..47da6962 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -13206,9 +13206,9 @@ rd_frame(void) for EachNode(n, D_LineNode, lines.first) { D_Line line = n->v; - String8 line_file_path_relative = path_relative_dst_from_absolute_dst_src(scratch.arena, line.file_path, module->string); + String8 line_file_name = str8_skip_last_slash(line.file_path); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " {\n"); - str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " file_path: \"%S\"\n", line_file_path_relative); + str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " file_name: \"%S\"\n", line_file_name); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " line_num: %I64d\n", line.pt.line); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " column_num: %I64d\n", line.pt.column); str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, " voff_range: [0x%I64x, 0x%I64x)\n", line.voff_range.min, line.voff_range.max); From 7f985b35f3cfd427e74f41e412f1156e52179a77 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 13 Jun 2026 20:22:37 -0700 Subject: [PATCH 799/850] only do session-start logic once per tick! --- src/raddbg/raddbg_core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 47da6962..a5c0250e 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -17451,6 +17451,7 @@ rd_frame(void) //////////////////////////// //- rjf: process debug engine events // + B32 did_session_start = 0; for(D_EventNode *n = engine_events.first; n != 0; n = n->next) { D_Event *evt = &n->v; @@ -17462,8 +17463,9 @@ rd_frame(void) D_EntityArray all_processes = d_entity_array_from_kind(D_EntityKind_Process); // rjf: no processes before this one -> new session - if(process_count_pre_tick == 0 && all_processes.count != 0) + if(process_count_pre_tick == 0 && all_processes.count != 0 && !did_session_start) { + did_session_start = 1; D_Entity *process = all_processes.v[0]; CFG_Node *target = cfg_node_from_id(process->src_msg_id); From eb87cb053ea09bb5a9e919dd53272127558c2d63 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 14 Jun 2026 20:20:52 -0700 Subject: [PATCH 800/850] fix bad sub register block address calculation!!! --- src/pe/x64/unwind/pe_x64_unwind.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pe/x64/unwind/pe_x64_unwind.c b/src/pe/x64/unwind/pe_x64_unwind.c index 88817527..5cb00655 100644 --- a/src/pe/x64/unwind/pe_x64_unwind.c +++ b/src/pe/x64/unwind/pe_x64_unwind.c @@ -359,7 +359,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8; X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); + U64 *reg_ptr = (U64 *)((U8 *)regs + reg_rng.min); reg_ptr[0] = value; regs->rsp = sp + 8; } @@ -428,7 +428,7 @@ pe_x64_uwnd_step(Arch arch, MemoryMap *memory_map, UWND_ModuleInfo *module_info, PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8; X64_RegCode reg_code = pe_x64_uwnd_reg_code_from_pe_gpr_reg(gpr_reg); Rng1U16 reg_rng = x64_reg_code_rng_table[reg_code]; - U64 *reg_ptr = (U64 *)((U8 *)®s + reg_rng.min); + U64 *reg_ptr = (U64 *)((U8 *)regs + reg_rng.min); U64 reg_value = reg_ptr[0]; // rjf: read immediate From bcdc6acd0e54a07bd479a7545629554f12882db0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 16 Jun 2026 12:29:03 -0600 Subject: [PATCH 801/850] checkpoint on eval2 parse --- src/eval2/eval2.c | 397 +++++++++++++++++++++++++++++++ src/eval2/eval2.h | 91 +++++++ src/eval2/eval2.mdesk | 43 ++++ src/eval2/generated/eval2.meta.c | 33 +++ src/eval2/generated/eval2.meta.h | 36 +++ src/lib_rdi/rdi.c | 4 +- src/lib_rdi/rdi.h | 86 +++---- src/raddbg/raddbg_main.c | 4 +- src/rdi/rdi.mdesk | 82 +++---- 9 files changed, 688 insertions(+), 88 deletions(-) diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 15756f59..4aa40b17 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -113,13 +113,410 @@ e2_expr_from_name(E2_ExprMap *map, String8 name) return expr; } +//////////////////////////////// +//~ rjf: Messages + +internal E2_Msg * +e2_msg(Arena *arena, E2_MsgList *msgs, U64 src_off, String8 string) +{ + E2_Msg *msg = push_array(arena, E2_Msg, 1); + SLLQueuePush(msgs->first, msgs->last, msg); + msgs->count += 1; + msg->src_off = src_off; + msg->string = str8_copy(arena, string); + return msg; +} + +internal E2_Msg * +e2_msgf(Arena *arena, E2_MsgList *msgs, U64 src_off, char *fmt, ...) +{ + Temp scratch = scratch_begin(&arena, 1); + va_list args; + va_start(args, fmt); + String8 string = str8fv(scratch.arena, fmt, args); + E2_Msg *msg = e2_msg(arena, msgs, src_off, string); + va_end(args); + scratch_end(scratch); + return msg; +} + +//////////////////////////////// +//~ rjf: Types + +internal E2_TypeKey +e2_type_key_basic(E2_TypeKind kind) +{ + E2_TypeKey key = {E2_TypeKeyKind_Basic}; + key.u32[0] = (U32)kind; + return key; +} + //////////////////////////////// //~ rjf: String -> Expression +internal E2_Token +e2_token_from_string(String8 string) +{ + E2_Token token = {E2_TokenKind_Null}; + B32 identifier_tick_mode = 0; + B32 comment_is_explicit_ender = 0; + B32 numeric_exponent = 0; + B32 escaped = 0; + B32 done = 0; + for(U64 off = 0; !done && off <= string.size; off += 1) + { + U8 next_byte = (off < string.size ? string.str[off] : 0); + U8 next2_byte = (off+1 < string.size ? string.str[off+1] : 0); + U8 next3_byte = (off+2 < string.size ? string.str[off+2] : 0); + switch(token.kind) + { + //- rjf: no set token kind => look for starters + default: + { + if(next_byte <= 32) + { + token.kind = E2_TokenKind_Whitespace; + token.range.min = token.range.max = off; + } + else if(next_byte == '$' || next_byte == '_' || next_byte == '`' || + ('A' <= next_byte && next_byte <= 'Z') || + ('a' <= next_byte && next_byte <= 'z')) + { + token.kind = E2_TokenKind_Identifier; + token.range.min = token.range.max = off; + identifier_tick_mode = (next_byte == '`'); + } + else if(('0' <= next_byte && next_byte <= '9') || + (next_byte == '.' && '0' <= next2_byte && next2_byte <= '9')) + { + token.kind = E2_TokenKind_Numeric; + token.range.min = token.range.max = off; + } + else if(next_byte == '\'') + { + token.kind = E2_TokenKind_CharLiteral; + token.range.min = token.range.max = off; + } + else if(next_byte == '"') + { + token.kind = E2_TokenKind_StringLiteral; + token.range.min = token.range.max = off; + } + else if(next_byte == '/' && next2_byte == '/') + { + token.kind = E2_TokenKind_Comment; + token.range.min = token.range.max = off; + } + else if(next_byte == '/' && next2_byte == '*') + { + token.kind = E2_TokenKind_Comment; + token.range.min = token.range.max = off; + comment_is_explicit_ender = 1; + } + else if(next_byte == '~' || next_byte == '!' || next_byte == '%' || + next_byte == '^' || next_byte == '&' || next_byte == '*' || + next_byte == '(' || next_byte == ')' || next_byte == '[' || + next_byte == ']' || next_byte == '{' || next_byte == '}' || + next_byte == '-' || next_byte == '=' || next_byte == '+' || + next_byte == ':' || next_byte == ';' || next_byte == ',' || + next_byte == '.' || next_byte == '<' || next_byte == '>' || + next_byte == '/' || next_byte == '?' || next_byte == '#' || + next_byte == '@' || next_byte == '|') + { + token.kind = E2_TokenKind_Symbol; + token.range.min = token.range.max = off; + } + }break; + + //- rjf: active tokens -> seek enders + case E2_TokenKind_Whitespace: + if(next_byte > 32) + { + done = 1; + }break; + case E2_TokenKind_Comment: + if(comment_is_explicit_ender && next_byte == '*' && next2_byte == '/') + { + done = 1; + token.range.max = off+2; + }break; + case E2_TokenKind_Identifier: + { + if(identifier_tick_mode && (next_byte == '`' || next_byte == '\'')) + { + identifier_tick_mode = 0; + } + else if(!identifier_tick_mode && + (next_byte < 'a' || 'z' < next_byte) && + (next_byte < 'A' || 'Z' < next_byte) && + (next_byte < '0' || '9' < next_byte) && + next_byte != '$' && + next_byte != '_' && + next_byte != '@') + { + done = 1; + token.range.max = off; + } + }break; + case E2_TokenKind_Numeric: + { + if(numeric_exponent && (next_byte == '+' || next_byte == '-')){} + else if((next_byte < 'a' || 'z' < next_byte) && + (next_byte < 'A' || 'Z' < next_byte) && + next_byte != '.' && + next_byte != ':') + { + done = 1; + token.range.max = off; + } + else + { + numeric_exponent = (next_byte == 'e'); + } + }break; + case E2_TokenKind_Symbol: + if(next_byte != '~' && next_byte != '!' && next_byte != '%' && + next_byte != '^' && next_byte != '&' && next_byte != '*' && + next_byte != '(' && next_byte != ')' && next_byte != '[' && + next_byte != ']' && next_byte != '{' && next_byte != '}' && + next_byte != '-' && next_byte != '=' && next_byte != '+' && + next_byte != ':' && next_byte != ';' && next_byte != ',' && + next_byte != '.' && next_byte != '<' && next_byte != '>' && + next_byte != '/' && next_byte != '?' && next_byte != '#' && + next_byte != '@' && next_byte != '|') + { + done = 1; + token.range.max = off; + }break; + case E2_TokenKind_CharLiteral: + case E2_TokenKind_StringLiteral: + { + if(!escaped && next_byte == '\\') + { + escaped = 1; + } + else if(escaped) + { + escaped = 0; + } + else if(!escaped && ((next_byte == '"' && token.kind == E2_TokenKind_StringLiteral) || + (next_byte == '\'' && token.kind == E2_TokenKind_CharLiteral))) + { + done = 1; + token.range.max = off+1; + } + }break; + } + if(token.range.max > off+1) + { + off += (token.range.max - (off+1)); + } + if(!done && off == string.size) + { + done = 1; + token.range.max = off; + } + } + return token; +} + +internal U64 +e2_read_token(String8 string, U64 off, E2_Token *token_out) +{ + E2_Token token = e2_token_from_string(str8_skip(string, off)); + if(token_out != 0) + { + token_out[0] = token; + } + U64 result = dim_1u64(token.range); + return result; +} + +internal B32 +e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out) +{ + B32 result = 0; + U64 off = off_out[0]; + for(;;) + { + E2_Token next_token = {E2_TokenKind_Null}; + off += e2_read_token(string, off, &next_token); + if(next_token.kind == kind && (expected_string.size == 0 || str8_match(str8_substr(string, next_token.range), expected_string, 0))) + { + result = 1; + break; + } + else if(next_token.kind != E2_TokenKind_Comment && next_token.kind != E2_TokenKind_Whitespace) + { + break; + } + } + if(result) + { + off_out[0] = off; + } + return result; +} + internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string) { + U64 off = state->string_off; + E2_Parse parse = {E2_Status_Error, .expr = &e2_expr_nil, .access_expr = &e2_expr_nil}; + //- rjf: parse & attach to top parsing task - if we don't have a top task + // then it is just the result + for(B32 done = 0; !done;) + { + E2_Expr *expr = &e2_expr_nil; + E2_Token token = {0}; + + //- rjf: nested sub-expressions + if(e2_try_token(string, E2_TokenKind_Symbol, s("("), &off, 0)) + { + E2_ParseTask *task = state->free_task; + if(task != 0) + { + SLLStackPop(state->free_task); + } + else + { + task = push_array(arena, E2_ParseTask, 1); + } + task->parent = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(task->parent, &e2_expr_nil); + task->expected_closer = s(")"); + task->child_count_target = 1; + SLLStackPush(state->top_task, task); + } + + //- rjf: prefix unaries + else if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token)) + { + E2_ParseTask *task = state->free_task; + if(task != 0) + { + SLLStackPop(state->free_task); + } + else + { + task = push_array(arena, E2_ParseTask, 1); + } + task->parent = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(task->parent, &e2_expr_nil); + task->child_count_target = 1; + SLLStackPush(state->top_task, task); + } + + //- rjf: leaf identifiers + else if(e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token)) + { + String8 identifier = str8_substr(string, token.range); + expr = e2_expr_from_name(expr_map, identifier); + if(expr == &e2_expr_nil) + { + done = 1; + parse.status = E2_Status_MissedIdentifierResolution; + parse.missed_identifier = identifier; + } + } + + //- rjf: leaf numerics + else if(e2_try_token(string, E2_TokenKind_Numeric, s(""), &off, &token)) + { + String8 numeric_string = str8_substr(string, token.range); + expr = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(expr, &e2_expr_nil); + U64 dot_pos = str8_find_needle(numeric_string, 0, s("."), 0); + B32 f_suffix = str8_match(str8_postfix(numeric_string, 1), s("f"), 0); + U64 colon_pos = str8_find_needle(numeric_string, 0, s(":"), 0); + if(dot_pos < numeric_string.size && f_suffix) + { + expr->val.f32 = (F32)f64_from_str8(numeric_string); + expr->type_key = e2_type_key_basic(E2_TypeKind_F32); + } + else if(dot_pos < numeric_string.size && !f_suffix) + { + expr->val.f64 = f64_from_str8(numeric_string); + expr->type_key = e2_type_key_basic(E2_TypeKind_F64); + } + else if(colon_pos < numeric_string.size) + { + Temp scratch = scratch_begin(&arena, 1); + String8List parts = str8_split(scratch.arena, numeric_string, (U8 *)":", 1, 0); + U64 u64_idx = 0; + for EachNode(n, String8Node, parts.first) + { + if(u64_idx >= ArrayCount(expr->val.u512.u64)) + { + break; + } + try_u64_from_str8_c_rules(n->string, &expr->val.u512.u64[u64_idx]); + u64_idx += 1; + } + switch(u64_idx) + { + case 1:{expr->op = RDI_EvalOp_ConstU64; expr->type_key = e2_type_key_basic(E2_TypeKind_U64);}break; + case 2:{expr->op = RDI_EvalOp_ConstU128; expr->type_key = e2_type_key_basic(E2_TypeKind_U128);}break; + case 4:{expr->op = RDI_EvalOp_ConstU256; expr->type_key = e2_type_key_basic(E2_TypeKind_U256);}break; + case 8:{expr->op = RDI_EvalOp_ConstU512; expr->type_key = e2_type_key_basic(E2_TypeKind_U512);}break; + default: + { + e2_msgf(arena, &parse.msgs, token.range.min, "Invalid number of numeric portions specified (%I64u; must be 2, 4, or 8).", u64_idx); + }break; + } + scratch_end(scratch); + } + else if(try_u64_from_str8_c_rules(numeric_string, &expr->val.u64)) + { + if(expr->val.u64 <= 0xff) + { + expr->op = RDI_EvalOp_ConstU8; + expr->type_key = e2_type_key_basic(E2_TypeKind_U8); + } + else if(expr->val.u64 <= 0xffff) + { + expr->op = RDI_EvalOp_ConstU16; + expr->type_key = e2_type_key_basic(E2_TypeKind_U16); + } + else if(expr->val.u64 <= 0xffffffff) + { + expr->op = RDI_EvalOp_ConstU32; + expr->type_key = e2_type_key_basic(E2_TypeKind_U32); + } + else + { + expr->op = RDI_EvalOp_ConstU64; + expr->type_key = e2_type_key_basic(E2_TypeKind_U64); + } + } + } + + //- rjf: attach formed expressions to task + if(expr != &e2_expr_nil && state->top_task != 0) + { + SLLQueuePush(state->top_task->parent->first, state->top_task->parent->last, expr); + state->top_task->child_count += 1; + if(state->top_task->child_count == state->top_task->child_count_target) + { + // TODO(rjf): pop task, insert to parent, or decay to result - should naturally express below block too + } + } + + //- rjf: no task -> formed expr is result + if(expr != &e2_expr_nil && state->top_task == 0) + { + parse.expr = expr; + break; + } + } + + //- rjf: advance offset if successful + if(parse.status == E2_Status_Good) + { + state->string_off += off; + } + return parse; } //////////////////////////////// diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index 56c3f4da..f9d776fd 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -4,6 +4,28 @@ #ifndef EVAL2_H #define EVAL2_H +//////////////////////////////// +//~ rjf: Operator Info Tables + +typedef enum E2_OpParseKind +{ + E2_OpParseKind_Null, + E2_OpParseKind_UnaryPrefix, + E2_OpParseKind_Binary, +} +E2_OpParseKind; + +typedef struct E2_OpInfo E2_OpInfo; +struct E2_OpInfo +{ + E2_OpParseKind parse_kind; + S64 precedence; + String8 pre; + String8 sep; + String8 post; + String8 chain; +}; + //////////////////////////////// //~ rjf: Generated Code @@ -242,6 +264,31 @@ struct E2_Ctx U64 tls_base_addr; }; +//////////////////////////////// +//~ rjf: Tokens + +typedef enum E2_TokenKind +{ + E2_TokenKind_Null, + E2_TokenKind_Whitespace, + E2_TokenKind_Comment, + E2_TokenKind_Identifier, + E2_TokenKind_Numeric, + E2_TokenKind_Symbol, + E2_TokenKind_CharLiteral, + E2_TokenKind_StringLiteral, + E2_TokenKind_COUNT +} +E2_TokenKind; + +typedef struct E2_Token E2_Token; +struct E2_Token +{ + E2_TokenKind kind; + U32 unused; + Rng1U64 range; +}; + //////////////////////////////// //~ rjf: Expression Tree Building @@ -273,10 +320,38 @@ struct E2_ExprMap U64 slots_count; }; +typedef struct E2_ParseTask E2_ParseTask; +struct E2_ParseTask +{ + E2_ParseTask *next; + E2_Expr *parent; + U64 child_count; + U64 child_count_target; + String8 expected_closer; +}; + typedef struct E2_ParseState E2_ParseState; struct E2_ParseState { U64 string_off; + E2_ParseTask *top_task; + E2_ParseTask *free_task; +}; + +typedef struct E2_Msg E2_Msg; +struct E2_Msg +{ + E2_Msg *next; + U64 src_off; + String8 string; +}; + +typedef struct E2_MsgList E2_MsgList; +struct E2_MsgList +{ + E2_Msg *first; + E2_Msg *last; + U64 count; }; typedef struct E2_Parse E2_Parse; @@ -287,8 +362,10 @@ struct E2_Parse Rng1U64 missed_read_space_addr_range; E2_CtxID ctx_id; E2_CtxFlags missing_ctx_flags; + String8 missed_identifier; E2_Expr *expr; E2_Expr *access_expr; + E2_MsgList msgs; }; //////////////////////////////// @@ -353,9 +430,23 @@ internal U64 e2_space_map_read(E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 ad internal void e2_expr_map_push(Arena *arena, E2_ExprMap *map, String8 name, E2_Expr *expr); internal E2_Expr *e2_expr_from_name(E2_ExprMap *map, String8 name); +//////////////////////////////// +//~ rjf: Messages + +internal E2_Msg *e2_msg(Arena *arena, E2_MsgList *msgs, U64 src_off, String8 string); +internal E2_Msg *e2_msgf(Arena *arena, E2_MsgList *msgs, U64 src_off, char *fmt, ...); + +//////////////////////////////// +//~ rjf: Types + +internal E2_TypeKey e2_type_key_basic(E2_TypeKind kind); + //////////////////////////////// //~ rjf: String -> Expression +internal E2_Token e2_token_from_string(String8 string); +internal U64 e2_read_token(String8 string, U64 off, E2_Token *token_out); +internal B32 e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out); internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string); //////////////////////////////// diff --git a/src/eval2/eval2.mdesk b/src/eval2/eval2.mdesk index 5dbaf832..c2964b95 100644 --- a/src/eval2/eval2.mdesk +++ b/src/eval2/eval2.mdesk @@ -1,6 +1,49 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +@table(name parse_kind precedence pre sep pos chain) +E2_OpTable: +{ + {Deref UnaryPrefix 2 "*" "" "" ""} + {Address UnaryPrefix 2 "&" "" "" ""} + {Pos UnaryPrefix 2 "+" "" "" ""} + {Neg UnaryPrefix 2 "-" "" "" ""} + {LogNot UnaryPrefix 2 "!" "" "" ""} + {BitNot UnaryPrefix 2 "~" "" "" ""} + {Mul Binary 3 "" "*" "" ""} + {Div Binary 3 "" "/" "" ""} + {Mod Binary 3 "" "%" "" ""} + {Add Binary 4 "" "+" "" ""} + {Sub Binary 4 "" "-" "" ""} + {LShift Binary 5 "" "<<" "" ""} + {RShift Binary 5 "" ">>" "" ""} + {Less Binary 6 "" "<" "" ""} + {LtEq Binary 6 "" "<=" "" ""} + {Grtr Binary 6 "" ">" "" ""} + {GrEq Binary 6 "" ">=" "" ""} + {EqEq Binary 7 "" "==" "" ""} + {NtEq Binary 7 "" "!=" "" ""} + {BitAnd Binary 8 "" "&" "" ""} + {BitXor Binary 9 "" "^" "" ""} + {BitOr Binary 10 "" "|" "" ""} + {LogAnd Binary 11 "" "&&" "" ""} + {LogOr Binary 12 "" "||" "" ""} + {Define Binary 13 "" "=" "" ""} +} + +@enum E2_OpKind: +{ + Null, + @expand(E2_OpTable a) `$(a.name)`, + COUNT, +} + +@data(E2_OpInfo) e2_op_kind_info_table: +{ + `{0}`, + @expand(E2_OpTable a) `{E2_OpParseKind_$(a.parse_kind), $(a.precedence), str8_lit_comp("$(a.pre)"), str8_lit_comp("$(a.sep)"), str8_lit_comp("$(a.pos)"), str8_lit_comp("$(a.chain)")}` +} + @table(name basic_string basic_byte_size) // NOTE(rjf): basic_byte_size == 0xFF? => address sized E2_TypeKindTable: diff --git a/src/eval2/generated/eval2.meta.c b/src/eval2/generated/eval2.meta.c index 0378fad9..a56c84c2 100644 --- a/src/eval2/generated/eval2.meta.c +++ b/src/eval2/generated/eval2.meta.c @@ -3,3 +3,36 @@ //- GENERATED CODE +C_LINKAGE_BEGIN +E2_OpInfo e2_op_kind_info_table[26] = +{ +{0}, +{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("~"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("/"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 3, str8_lit_comp(""), str8_lit_comp("%"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 4, str8_lit_comp(""), str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 4, str8_lit_comp(""), str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 5, str8_lit_comp(""), str8_lit_comp("<<"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 5, str8_lit_comp(""), str8_lit_comp(">>"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 6, str8_lit_comp(""), str8_lit_comp("<"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 6, str8_lit_comp(""), str8_lit_comp("<="), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(">"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 6, str8_lit_comp(""), str8_lit_comp(">="), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 7, str8_lit_comp(""), str8_lit_comp("=="), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 7, str8_lit_comp(""), str8_lit_comp("!="), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 8, str8_lit_comp(""), str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 9, str8_lit_comp(""), str8_lit_comp("^"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 10, str8_lit_comp(""), str8_lit_comp("|"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 11, str8_lit_comp(""), str8_lit_comp("&&"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 12, str8_lit_comp(""), str8_lit_comp("||"), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp(""), str8_lit_comp("")}, +}; + +C_LINKAGE_END + diff --git a/src/eval2/generated/eval2.meta.h b/src/eval2/generated/eval2.meta.h index 2ba002dd..453fc77a 100644 --- a/src/eval2/generated/eval2.meta.h +++ b/src/eval2/generated/eval2.meta.h @@ -6,6 +6,37 @@ #ifndef EVAL2_META_H #define EVAL2_META_H +typedef enum E2_OpKind +{ +E2_OpKind_Null, +E2_OpKind_Deref, +E2_OpKind_Address, +E2_OpKind_Pos, +E2_OpKind_Neg, +E2_OpKind_LogNot, +E2_OpKind_BitNot, +E2_OpKind_Mul, +E2_OpKind_Div, +E2_OpKind_Mod, +E2_OpKind_Add, +E2_OpKind_Sub, +E2_OpKind_LShift, +E2_OpKind_RShift, +E2_OpKind_Less, +E2_OpKind_LtEq, +E2_OpKind_Grtr, +E2_OpKind_GrEq, +E2_OpKind_EqEq, +E2_OpKind_NtEq, +E2_OpKind_BitAnd, +E2_OpKind_BitXor, +E2_OpKind_BitOr, +E2_OpKind_LogAnd, +E2_OpKind_LogOr, +E2_OpKind_Define, +E2_OpKind_COUNT, +} E2_OpKind; + typedef enum E2_TypeKind { E2_TypeKind_Null, @@ -84,4 +115,9 @@ E2_TypeKind_FirstMeta = E2_TypeKind_MetaExpr, E2_TypeKind_LastMeta = E2_TypeKind_MetaDescription, } E2_TypeKind; +C_LINKAGE_BEGIN +extern E2_OpInfo e2_op_kind_info_table[26]; + +C_LINKAGE_END + #endif // EVAL2_META_H diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index 0820c179..c892e49f 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -66,7 +66,6 @@ RDI_EVAL_CTRLBITS(2, 1, 0), RDI_EVAL_CTRLBITS(2, 0, 0), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(4, 0, 1), -RDI_EVAL_CTRLBITS(0, 0, 1), RDI_EVAL_CTRLBITS(8, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), @@ -77,6 +76,8 @@ RDI_EVAL_CTRLBITS(2, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), RDI_EVAL_CTRLBITS(8, 0, 1), RDI_EVAL_CTRLBITS(16, 0, 1), +RDI_EVAL_CTRLBITS(32, 0, 1), +RDI_EVAL_CTRLBITS(64, 0, 1), RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(1, 1, 1), @@ -105,7 +106,6 @@ RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(2, 1, 1), RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(0, 1, 0), -RDI_EVAL_CTRLBITS(0, 0, 1), RDI_EVAL_CTRLBITS(1, 2, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(4, 0, 0), diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index ac624cdd..d7ecf52d 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -67,7 +67,7 @@ union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];}; // "raddbg\0\0" #define RDI_MAGIC_CONSTANT 0x0000676264646172 -#define RDI_ENCODING_VERSION 22 +#define RDI_ENCODING_VERSION 23 //////////////////////////////////////////////////////////////// //~ Format Types & Functions @@ -423,46 +423,46 @@ RDI_EvalOp_Cond = 2, RDI_EvalOp_Skip = 3, RDI_EvalOp_MemRead = 4, RDI_EvalOp_RegRead = 5, -RDI_EvalOp_Unused0 = 6, -RDI_EvalOp_FrameOff = 7, -RDI_EvalOp_ModuleOff = 8, -RDI_EvalOp_TLSOff = 9, -RDI_EvalOp_ObjectOff = 10, -RDI_EvalOp_CFA = 11, -RDI_EvalOp_ConstU8 = 12, -RDI_EvalOp_ConstU16 = 13, -RDI_EvalOp_ConstU32 = 14, -RDI_EvalOp_ConstU64 = 15, -RDI_EvalOp_ConstU128 = 16, -RDI_EvalOp_ConstString = 17, -RDI_EvalOp_Abs = 18, -RDI_EvalOp_Neg = 19, -RDI_EvalOp_Add = 20, -RDI_EvalOp_Sub = 21, -RDI_EvalOp_Mul = 22, -RDI_EvalOp_Div = 23, -RDI_EvalOp_Mod = 24, -RDI_EvalOp_LShift = 25, -RDI_EvalOp_RShift = 26, -RDI_EvalOp_BitAnd = 27, -RDI_EvalOp_BitOr = 28, -RDI_EvalOp_BitXor = 29, -RDI_EvalOp_BitNot = 30, -RDI_EvalOp_LogAnd = 31, -RDI_EvalOp_LogOr = 32, -RDI_EvalOp_LogNot = 33, -RDI_EvalOp_EqEq = 34, -RDI_EvalOp_NtEq = 35, -RDI_EvalOp_LsEq = 36, -RDI_EvalOp_GrEq = 37, -RDI_EvalOp_Less = 38, -RDI_EvalOp_Grtr = 39, -RDI_EvalOp_Trunc = 40, -RDI_EvalOp_TruncSigned = 41, -RDI_EvalOp_Convert = 42, -RDI_EvalOp_Pick = 43, -RDI_EvalOp_Pop = 44, -RDI_EvalOp_Unused1 = 45, +RDI_EvalOp_FrameOff = 6, +RDI_EvalOp_ModuleOff = 7, +RDI_EvalOp_TLSOff = 8, +RDI_EvalOp_ObjectOff = 9, +RDI_EvalOp_CFA = 10, +RDI_EvalOp_ConstU8 = 11, +RDI_EvalOp_ConstU16 = 12, +RDI_EvalOp_ConstU32 = 13, +RDI_EvalOp_ConstU64 = 14, +RDI_EvalOp_ConstU128 = 15, +RDI_EvalOp_ConstU256 = 16, +RDI_EvalOp_ConstU512 = 17, +RDI_EvalOp_ConstString = 18, +RDI_EvalOp_Abs = 19, +RDI_EvalOp_Neg = 20, +RDI_EvalOp_Add = 21, +RDI_EvalOp_Sub = 22, +RDI_EvalOp_Mul = 23, +RDI_EvalOp_Div = 24, +RDI_EvalOp_Mod = 25, +RDI_EvalOp_LShift = 26, +RDI_EvalOp_RShift = 27, +RDI_EvalOp_BitAnd = 28, +RDI_EvalOp_BitOr = 29, +RDI_EvalOp_BitXor = 30, +RDI_EvalOp_BitNot = 31, +RDI_EvalOp_LogAnd = 32, +RDI_EvalOp_LogOr = 33, +RDI_EvalOp_LogNot = 34, +RDI_EvalOp_EqEq = 35, +RDI_EvalOp_NtEq = 36, +RDI_EvalOp_LsEq = 37, +RDI_EvalOp_GrEq = 38, +RDI_EvalOp_Less = 39, +RDI_EvalOp_Grtr = 40, +RDI_EvalOp_Trunc = 41, +RDI_EvalOp_TruncSigned = 42, +RDI_EvalOp_Convert = 43, +RDI_EvalOp_Pick = 44, +RDI_EvalOp_Pop = 45, RDI_EvalOp_ValueRead = 46, RDI_EvalOp_ByteSwap = 47, RDI_EvalOp_CallSiteValue = 48, @@ -939,7 +939,6 @@ X(Cond)\ X(Skip)\ X(MemRead)\ X(RegRead)\ -X(Unused0)\ X(FrameOff)\ X(ModuleOff)\ X(TLSOff)\ @@ -950,6 +949,8 @@ X(ConstU16)\ X(ConstU32)\ X(ConstU64)\ X(ConstU128)\ +X(ConstU256)\ +X(ConstU512)\ X(ConstString)\ X(Abs)\ X(Neg)\ @@ -978,7 +979,6 @@ X(TruncSigned)\ X(Convert)\ X(Pick)\ X(Pop)\ -X(Unused1)\ X(ValueRead)\ X(ByteSwap)\ X(CallSiteValue)\ diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 3bae0ae7..a854ef14 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -415,7 +415,7 @@ #include "stap/stap_parse.h" #include "demon/demon_inc.h" #include "eval/eval_inc.h" -// #include "eval2/eval2.h" +#include "eval2/eval2.h" #include "dbg_engine/dbg_engine_inc.h" #include "eval_visualization/eval_visualization_inc.h" #include "font_provider/font_provider_inc.h" @@ -475,7 +475,7 @@ #include "stap/stap_parse.c" #include "demon/demon_inc.c" #include "eval/eval_inc.c" -// #include "eval2/eval2.c" +#include "eval2/eval2.c" #include "dbg_engine/dbg_engine_inc.c" #include "eval_visualization/eval_visualization_inc.c" #include "font_provider/font_provider_inc.c" diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 9f392a27..95ba4a09 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -77,7 +77,7 @@ ""; "// \"raddbg\\0\\0\""; "#define RDI_MAGIC_CONSTANT 0x0000676264646172"; - "#define RDI_ENCODING_VERSION 22"; + "#define RDI_ENCODING_VERSION 23"; ""; "////////////////////////////////////////////////////////////////"; "//~ Format Types & Functions"; @@ -1202,46 +1202,46 @@ RDI_EvalOpTable: {Skip 3 2 0 0} {MemRead 4 1 1 1} {RegRead 5 4 0 1} - {Unused0 6 0 0 1} - {FrameOff 7 8 0 1} - {ModuleOff 8 4 0 1} - {TLSOff 9 4 0 1} - {ObjectOff 10 0 0 0} - {CFA 11 0 0 0} - {ConstU8 12 1 0 1} - {ConstU16 13 2 0 1} - {ConstU32 14 4 0 1} - {ConstU64 15 8 0 1} - {ConstU128 16 16 0 1} - {ConstString 17 1 0 1} - {Abs 18 1 1 1} - {Neg 19 1 1 1} - {Add 20 1 2 1} - {Sub 21 1 2 1} - {Mul 22 1 2 1} - {Div 23 1 2 1} - {Mod 24 1 2 1} - {LShift 25 2 2 1} - {RShift 26 2 2 1} - {BitAnd 27 1 2 1} - {BitOr 28 1 2 1} - {BitXor 29 1 2 1} - {BitNot 30 1 1 1} - {LogAnd 31 1 2 1} - {LogOr 32 1 2 1} - {LogNot 33 1 1 1} - {EqEq 34 1 2 1} - {NtEq 35 1 2 1} - {LsEq 36 1 2 1} - {GrEq 37 1 2 1} - {Less 38 1 2 1} - {Grtr 39 1 2 1} - {Trunc 40 1 1 1} - {TruncSigned 41 1 1 1} - {Convert 42 2 1 1} - {Pick 43 1 0 1} - {Pop 44 0 1 0} - {Unused1 45 0 0 1} + {FrameOff 6 8 0 1} + {ModuleOff 7 4 0 1} + {TLSOff 8 4 0 1} + {ObjectOff 9 0 0 0} + {CFA 10 0 0 0} + {ConstU8 11 1 0 1} + {ConstU16 12 2 0 1} + {ConstU32 13 4 0 1} + {ConstU64 14 8 0 1} + {ConstU128 15 16 0 1} + {ConstU256 16 32 0 1} + {ConstU512 17 64 0 1} + {ConstString 18 1 0 1} + {Abs 19 1 1 1} + {Neg 20 1 1 1} + {Add 21 1 2 1} + {Sub 22 1 2 1} + {Mul 23 1 2 1} + {Div 24 1 2 1} + {Mod 25 1 2 1} + {LShift 26 2 2 1} + {RShift 27 2 2 1} + {BitAnd 28 1 2 1} + {BitOr 29 1 2 1} + {BitXor 30 1 2 1} + {BitNot 31 1 1 1} + {LogAnd 32 1 2 1} + {LogOr 33 1 2 1} + {LogNot 34 1 1 1} + {EqEq 35 1 2 1} + {NtEq 36 1 2 1} + {LsEq 37 1 2 1} + {GrEq 38 1 2 1} + {Less 39 1 2 1} + {Grtr 40 1 2 1} + {Trunc 41 1 1 1} + {TruncSigned 42 1 1 1} + {Convert 43 2 1 1} + {Pick 44 1 0 1} + {Pop 45 0 1 0} {ValueRead 46 1 2 1} {ByteSwap 47 1 1 1} {CallSiteValue 48 4 0 0} From 00da627293d3af3db0f2dfb7b6f0ac62acb44aab Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 16 Jun 2026 14:30:13 -0700 Subject: [PATCH 802/850] checkpoint on eval2 compiler; setting to disable update checking; cache version check to once per day so that we do not send a lot of extra GH requests every time the debugger starts --- project.4coder | 2 +- project.raddbg | 9 +- src/arch/arch.c | 344 +++++++++++++++-------------- src/arch/arch.h | 103 +++++---- src/eval2/eval2.c | 213 +++++++++++++++--- src/eval2/eval2.h | 42 +--- src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 4 + src/raddbg/raddbg_core.c | 137 +++++++----- src/raddbg/raddbg_core.h | 1 + src/scratch/ryan_scratch.c | 64 ++---- 11 files changed, 530 insertions(+), 391 deletions(-) diff --git a/project.4coder b/project.4coder index 0b10da9c..b5fb9e8d 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build ryan_scratch", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 7570552c..2401ecf6 100644 --- a/project.raddbg +++ b/project.raddbg @@ -1,4 +1,4 @@ -// raddbg 0.9.27 project file +// raddbg 0.9.28 project file name: "The RAD Debugger" target: @@ -7,7 +7,6 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 - enabled: 1 } target: { @@ -31,3 +30,9 @@ target: working_directory: build arguments: "--rdi raddbg" } +target: +{ + executable: "build/ryan_scratch.exe" + working_directory: "build/" + enabled: 1 +} diff --git a/src/arch/arch.c b/src/arch/arch.c index 25e07963..50361259 100644 --- a/src/arch/arch.c +++ b/src/arch/arch.c @@ -1,170 +1,174 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Abstracted Architecture Functions - -internal ARCH_Info * -arch_info_from_arch(Arch arch) -{ - ARCH_Info *result = &arch_info_nil; - switch(arch) - { - default:{}break; -#if defined(X64_H) - case Arch_x64: - { - local_persist U8 trap_inst_bytes[] = {0xcc}; - local_persist read_only ARCH_Info info = - { - .reg_block_size = sizeof(X64_RegBlock), - .instruction_pointer_reg_code = X64_RegCode_rip, - .stack_pointer_reg_code = X64_RegCode_rsp, - .reg_code_count = X64_RegCode_COUNT, - .trap_instruction = {trap_inst_bytes, sizeof(trap_inst_bytes)}, - .reg_code_rng_table = x64_reg_code_rng_table, - .reg_code_name_table = x64_reg_code_name_table, - .reg_code_base_table = x64_reg_code_base_table, - .reg_code_is_vector_table = x64_reg_code_is_vector_table, - }; - result = &info; - }break; -#endif - } - return result; -} - -internal ARCH_RegCode -arch_reg_code_from_name(ARCH_Info *arch_info, String8 name) -{ - ARCH_RegCode result = 0; - for EachIndex(code, arch_info->reg_code_count) - { - if(str8_match(arch_info->reg_code_name_table[code], name, 0)) - { - result = code; - break; - } - } - return result; -} - -internal ARCH_RegCode -arch_reg_code_from_rdi(Arch arch, RDI_RegCode code) -{ - ARCH_RegCode result = 0; - { - ARCH_Info *arch_info = arch_info_from_arch(arch); - U8 *rdi_from_reg_code_table = arch_rdi_from_reg_code_table_from_arch(arch); - for EachIndex(c, arch_info->reg_code_count) - { - if(rdi_from_reg_code_table[c] == code) - { - result = c; - break; - } - } - } - return result; -} - -internal ARCH_RegCode -arch_reg_code_from_dw(Arch arch, DW_RegCode code) -{ - ARCH_RegCode result = 0; - { - ARCH_Info *arch_info = arch_info_from_arch(arch); - U8 *dw_from_reg_code_table = arch_dw_from_reg_code_table_from_arch(arch); - for EachIndex(c, arch_info->reg_code_count) - { - if(dw_from_reg_code_table[c] == code) - { - result = c; - break; - } - } - } - return result; -} - -internal B32 -arch_reg_block_read_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *dst) -{ - B32 result = 0; - { - Rng1U16 legal_range = r1u16(0, arch_info->reg_block_size); - Rng1U16 try_range = range; - Rng1U16 read_range = intersect_1u16(legal_range, try_range); - U64 read_size = dim_1u16(read_range); - if(read_size != 0) - { - MemoryCopy(dst, (U8 *)block + read_range.min, read_size); - result = 1; - } - } - return result; -} - -internal B32 -arch_reg_block_write_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *src) -{ - B32 result = 0; - Rng1U16 legal_range = r1u16(0, arch_info->reg_block_size); - Rng1U16 try_range = range; - Rng1U16 write_range = intersect_1u16(legal_range, try_range); - U64 write_size = dim_1u16(write_range); - if(write_size != 0) - { - MemoryCopy((U8 *)block + write_range.min, src, write_size); - result = 1; - } - return result; -} - -internal U64 -arch_ip_from_reg_block(ARCH_Info *arch_info, void *block) -{ - U64 result = 0; - ARCH_RegCode reg_code = arch_info->instruction_pointer_reg_code; - if(reg_code < arch_info->reg_code_count) - { - arch_reg_block_read_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &result); - } - return result; -} - -internal U64 -arch_sp_from_reg_block(ARCH_Info *arch_info, void *block) -{ - U64 result = 0; - ARCH_RegCode reg_code = arch_info->stack_pointer_reg_code; - if(reg_code < arch_info->reg_code_count) - { - arch_reg_block_read_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &result); - } - return result; -} - -internal B32 -arch_reg_block_write_ip(ARCH_Info *arch_info, void *block, U64 ip) -{ - B32 result = 0; - ARCH_RegCode reg_code = arch_info->instruction_pointer_reg_code; - if(reg_code < arch_info->reg_code_count) - { - result = arch_reg_block_write_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &ip); - } - return result; -} - -internal B32 -arch_reg_block_write_sp(ARCH_Info *arch_info, void *block, U64 sp) -{ - B32 result = 0; - ARCH_RegCode reg_code = arch_info->stack_pointer_reg_code; - if(reg_code < arch_info->reg_code_count) - { - result = arch_reg_block_write_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &sp); - } - return result; -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Abstracted Architecture Functions + +internal ARCH_Info * +arch_info_from_arch(Arch arch) +{ + ARCH_Info *result = &arch_info_nil; + switch(arch) + { + default:{}break; +#if defined(X64_H) + case Arch_x64: + { + local_persist U8 trap_inst_bytes[] = {0xcc}; + local_persist read_only ARCH_Info info = + { + .reg_block_size = sizeof(X64_RegBlock), + .instruction_pointer_reg_code = X64_RegCode_rip, + .stack_pointer_reg_code = X64_RegCode_rsp, + .reg_code_count = X64_RegCode_COUNT, + .trap_instruction = {trap_inst_bytes, sizeof(trap_inst_bytes)}, + .reg_code_rng_table = x64_reg_code_rng_table, + .reg_code_name_table = x64_reg_code_name_table, + .reg_code_base_table = x64_reg_code_base_table, + .reg_code_is_vector_table = x64_reg_code_is_vector_table, + }; + result = &info; + }break; +#endif + } + return result; +} + +internal ARCH_RegCode +arch_reg_code_from_name(ARCH_Info *arch_info, String8 name) +{ + ARCH_RegCode result = 0; + for EachIndex(code, arch_info->reg_code_count) + { + if(str8_match(arch_info->reg_code_name_table[code], name, 0)) + { + result = code; + break; + } + } + return result; +} + +internal B32 +arch_reg_block_read_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *dst) +{ + B32 result = 0; + { + Rng1U16 legal_range = r1u16(0, arch_info->reg_block_size); + Rng1U16 try_range = range; + Rng1U16 read_range = intersect_1u16(legal_range, try_range); + U64 read_size = dim_1u16(read_range); + if(read_size != 0) + { + MemoryCopy(dst, (U8 *)block + read_range.min, read_size); + result = 1; + } + } + return result; +} + +internal B32 +arch_reg_block_write_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *src) +{ + B32 result = 0; + Rng1U16 legal_range = r1u16(0, arch_info->reg_block_size); + Rng1U16 try_range = range; + Rng1U16 write_range = intersect_1u16(legal_range, try_range); + U64 write_size = dim_1u16(write_range); + if(write_size != 0) + { + MemoryCopy((U8 *)block + write_range.min, src, write_size); + result = 1; + } + return result; +} + +internal U64 +arch_ip_from_reg_block(ARCH_Info *arch_info, void *block) +{ + U64 result = 0; + ARCH_RegCode reg_code = arch_info->instruction_pointer_reg_code; + if(reg_code < arch_info->reg_code_count) + { + arch_reg_block_read_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &result); + } + return result; +} + +internal U64 +arch_sp_from_reg_block(ARCH_Info *arch_info, void *block) +{ + U64 result = 0; + ARCH_RegCode reg_code = arch_info->stack_pointer_reg_code; + if(reg_code < arch_info->reg_code_count) + { + arch_reg_block_read_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &result); + } + return result; +} + +internal B32 +arch_reg_block_write_ip(ARCH_Info *arch_info, void *block, U64 ip) +{ + B32 result = 0; + ARCH_RegCode reg_code = arch_info->instruction_pointer_reg_code; + if(reg_code < arch_info->reg_code_count) + { + result = arch_reg_block_write_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &ip); + } + return result; +} + +internal B32 +arch_reg_block_write_sp(ARCH_Info *arch_info, void *block, U64 sp) +{ + B32 result = 0; + ARCH_RegCode reg_code = arch_info->stack_pointer_reg_code; + if(reg_code < arch_info->reg_code_count) + { + result = arch_reg_block_write_range(arch_info, block, arch_info->reg_code_rng_table[reg_code], &sp); + } + return result; +} + +#if defined(RDI_H) +internal ARCH_RegCode +arch_reg_code_from_rdi(Arch arch, RDI_RegCode code) +{ + ARCH_RegCode result = 0; + { + ARCH_Info *arch_info = arch_info_from_arch(arch); + U8 *rdi_from_reg_code_table = arch_rdi_from_reg_code_table_from_arch(arch); + for EachIndex(c, arch_info->reg_code_count) + { + if(rdi_from_reg_code_table[c] == code) + { + result = c; + break; + } + } + } + return result; +} +#endif + +#if defined(DWARF_H) +internal ARCH_RegCode +arch_reg_code_from_dw(Arch arch, DW_RegCode code) +{ + ARCH_RegCode result = 0; + { + ARCH_Info *arch_info = arch_info_from_arch(arch); + U8 *dw_from_reg_code_table = arch_dw_from_reg_code_table_from_arch(arch); + for EachIndex(c, arch_info->reg_code_count) + { + if(dw_from_reg_code_table[c] == code) + { + result = c; + break; + } + } + } + return result; +} +#endif diff --git a/src/arch/arch.h b/src/arch/arch.h index dbdb1b28..be53103f 100644 --- a/src/arch/arch.h +++ b/src/arch/arch.h @@ -1,49 +1,54 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#ifndef ARCH_H -#define ARCH_H - -//////////////////////////////// -//~ rjf: Abstraction Backend Info - -typedef U8 ARCH_RegCode; - -typedef struct ARCH_Info ARCH_Info; -struct ARCH_Info -{ - U16 reg_block_size; - ARCH_RegCode instruction_pointer_reg_code; - ARCH_RegCode stack_pointer_reg_code; - U16 reg_code_count; - String8 trap_instruction; - Rng1U16 *reg_code_rng_table; - String8 *reg_code_name_table; - U8 *reg_code_base_table; - B8 *reg_code_is_vector_table; -}; - -//////////////////////////////// -//~ rjf: Globals - -global read_only Rng1U16 arch_reg_code_rng_nil = {0}; -global read_only String8 arch_reg_code_name_nil = {0}; -global read_only U8 arch_reg_code_u8_nil = 0; -global read_only B8 arch_reg_code_b8_nil = 0; -global read_only ARCH_Info arch_info_nil = {0, 0, 0, 0, {0}, &arch_reg_code_rng_nil, &arch_reg_code_name_nil, &arch_reg_code_u8_nil, &arch_reg_code_b8_nil}; - -//////////////////////////////// -//~ rjf: Abstracted Architecture Functions - -internal ARCH_Info *arch_info_from_arch(Arch arch); -internal ARCH_RegCode arch_reg_code_from_name(ARCH_Info *arch_info, String8 name); -internal ARCH_RegCode arch_reg_code_from_rdi(Arch arch, RDI_RegCode code); -internal ARCH_RegCode arch_reg_code_from_dw(Arch arch, DW_RegCode code); -internal B32 arch_reg_block_read_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *dst); -internal B32 arch_reg_block_write_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *src); -internal U64 arch_ip_from_reg_block(ARCH_Info *arch_info, void *block); -internal U64 arch_sp_from_reg_block(ARCH_Info *arch_info, void *block); -internal B32 arch_reg_block_write_ip(ARCH_Info *arch_info, void *block, U64 ip); -internal B32 arch_reg_block_write_sp(ARCH_Info *arch_info, void *block, U64 sp); - -#endif // REGS_H +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef ARCH_H +#define ARCH_H + +//////////////////////////////// +//~ rjf: Abstraction Backend Info + +typedef U8 ARCH_RegCode; + +typedef struct ARCH_Info ARCH_Info; +struct ARCH_Info +{ + U16 reg_block_size; + ARCH_RegCode instruction_pointer_reg_code; + ARCH_RegCode stack_pointer_reg_code; + U16 reg_code_count; + String8 trap_instruction; + Rng1U16 *reg_code_rng_table; + String8 *reg_code_name_table; + U8 *reg_code_base_table; + B8 *reg_code_is_vector_table; +}; + +//////////////////////////////// +//~ rjf: Globals + +global read_only Rng1U16 arch_reg_code_rng_nil = {0}; +global read_only String8 arch_reg_code_name_nil = {0}; +global read_only U8 arch_reg_code_u8_nil = 0; +global read_only B8 arch_reg_code_b8_nil = 0; +global read_only ARCH_Info arch_info_nil = {0, 0, 0, 0, {0}, &arch_reg_code_rng_nil, &arch_reg_code_name_nil, &arch_reg_code_u8_nil, &arch_reg_code_b8_nil}; + +//////////////////////////////// +//~ rjf: Abstracted Architecture Functions + +internal ARCH_Info *arch_info_from_arch(Arch arch); +internal ARCH_RegCode arch_reg_code_from_name(ARCH_Info *arch_info, String8 name); +internal B32 arch_reg_block_read_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *dst); +internal B32 arch_reg_block_write_range(ARCH_Info *arch_info, void *block, Rng1U16 range, void *src); +internal U64 arch_ip_from_reg_block(ARCH_Info *arch_info, void *block); +internal U64 arch_sp_from_reg_block(ARCH_Info *arch_info, void *block); +internal B32 arch_reg_block_write_ip(ARCH_Info *arch_info, void *block, U64 ip); +internal B32 arch_reg_block_write_sp(ARCH_Info *arch_info, void *block, U64 sp); + +#if defined(RDI_H) +internal ARCH_RegCode arch_reg_code_from_rdi(Arch arch, RDI_RegCode code); +#endif +#if defined(DWARF_H) +internal ARCH_RegCode arch_reg_code_from_dw(Arch arch, DW_RegCode code); +#endif + +#endif // REGS_H diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 4aa40b17..4f1295aa 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -117,24 +117,24 @@ e2_expr_from_name(E2_ExprMap *map, String8 name) //~ rjf: Messages internal E2_Msg * -e2_msg(Arena *arena, E2_MsgList *msgs, U64 src_off, String8 string) +e2_msg(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, String8 string) { E2_Msg *msg = push_array(arena, E2_Msg, 1); SLLQueuePush(msgs->first, msgs->last, msg); msgs->count += 1; - msg->src_off = src_off; + msg->src_range = src_range; msg->string = str8_copy(arena, string); return msg; } internal E2_Msg * -e2_msgf(Arena *arena, E2_MsgList *msgs, U64 src_off, char *fmt, ...) +e2_msgf(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, char *fmt, ...) { Temp scratch = scratch_begin(&arena, 1); va_list args; va_start(args, fmt); String8 string = str8fv(scratch.arena, fmt, args); - E2_Msg *msg = e2_msg(arena, msgs, src_off, string); + E2_Msg *msg = e2_msg(arena, msgs, src_range, string); va_end(args); scratch_end(scratch); return msg; @@ -155,7 +155,7 @@ e2_type_key_basic(E2_TypeKind kind) //~ rjf: String -> Expression internal E2_Token -e2_token_from_string(String8 string) +e2_token_from_string_off(String8 string, U64 start_off) { E2_Token token = {E2_TokenKind_Null}; B32 identifier_tick_mode = 0; @@ -163,7 +163,7 @@ e2_token_from_string(String8 string) B32 numeric_exponent = 0; B32 escaped = 0; B32 done = 0; - for(U64 off = 0; !done && off <= string.size; off += 1) + for(U64 off = start_off; !done && off <= string.size; off += 1) { U8 next_byte = (off < string.size ? string.str[off] : 0); U8 next2_byte = (off+1 < string.size ? string.str[off+1] : 0); @@ -173,7 +173,11 @@ e2_token_from_string(String8 string) //- rjf: no set token kind => look for starters default: { - if(next_byte <= 32) + if(next_byte == 0) + { + done = 1; + } + else if(next_byte <= 32) { token.kind = E2_TokenKind_Whitespace; token.range.min = token.range.max = off; @@ -263,6 +267,7 @@ e2_token_from_string(String8 string) if(numeric_exponent && (next_byte == '+' || next_byte == '-')){} else if((next_byte < 'a' || 'z' < next_byte) && (next_byte < 'A' || 'Z' < next_byte) && + (next_byte < '0' || '9' < next_byte) && next_byte != '.' && next_byte != ':') { @@ -323,7 +328,7 @@ e2_token_from_string(String8 string) internal U64 e2_read_token(String8 string, U64 off, E2_Token *token_out) { - E2_Token token = e2_token_from_string(str8_skip(string, off)); + E2_Token token = e2_token_from_string_off(string, off); if(token_out != 0) { token_out[0] = token; @@ -344,6 +349,10 @@ e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *of if(next_token.kind == kind && (expected_string.size == 0 || str8_match(str8_substr(string, next_token.range), expected_string, 0))) { result = 1; + if(token_out != 0) + { + token_out[0] = next_token; + } break; } else if(next_token.kind != E2_TokenKind_Comment && next_token.kind != E2_TokenKind_Whitespace) @@ -351,7 +360,7 @@ e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *of break; } } - if(result) + if(result && off_out != 0) { off_out[0] = off; } @@ -368,6 +377,7 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, // then it is just the result for(B32 done = 0; !done;) { + S64 max_precedence = state->top_task ? state->top_task->max_precedence : max_S64; E2_Expr *expr = &e2_expr_nil; E2_Token token = {0}; @@ -387,25 +397,48 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, MemoryCopyStruct(task->parent, &e2_expr_nil); task->expected_closer = s(")"); task->child_count_target = 1; + task->max_precedence = max_S64; SLLStackPush(state->top_task, task); } //- rjf: prefix unaries else if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token)) { - E2_ParseTask *task = state->free_task; - if(task != 0) + // rjf: string -> operator kind + E2_OpKind op_kind = E2_OpKind_Null; { - SLLStackPop(state->free_task); + String8 token_string = str8_substr(string, token.range); + for EachNonZeroEnumVal(E2_OpKind, k) + { + if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_UnaryPrefix && + e2_op_kind_info_table[k].precedence <= max_precedence && + str8_match(token_string, e2_op_kind_info_table[k].pre, 0)) + { + op_kind = k; + break; + } + } } - else + + // rjf: push task for operand + if(op_kind != E2_OpKind_Null) { - task = push_array(arena, E2_ParseTask, 1); + E2_ParseTask *task = state->free_task; + if(task != 0) + { + SLLStackPop(state->free_task); + } + else + { + task = push_array(arena, E2_ParseTask, 1); + } + task->parent = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(task->parent, &e2_expr_nil); + task->child_count_target = 1; + task->op_kind = op_kind; + task->max_precedence = e2_op_kind_info_table[op_kind].precedence; + SLLStackPush(state->top_task, task); } - task->parent = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(task->parent, &e2_expr_nil); - task->child_count_target = 1; - SLLStackPush(state->top_task, task); } //- rjf: leaf identifiers @@ -462,7 +495,7 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, case 8:{expr->op = RDI_EvalOp_ConstU512; expr->type_key = e2_type_key_basic(E2_TypeKind_U512);}break; default: { - e2_msgf(arena, &parse.msgs, token.range.min, "Invalid number of numeric portions specified (%I64u; must be 2, 4, or 8).", u64_idx); + e2_msgf(arena, &parse.msgs, token.range, "Invalid number of numeric portions specified (%I64u; must be 2, 4, or 8).", u64_idx); }break; } scratch_end(scratch); @@ -492,29 +525,149 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } } - //- rjf: attach formed expressions to task - if(expr != &e2_expr_nil && state->top_task != 0) + //- rjf: extend parsed expression tree with trailing binary operators + if(expr != &e2_expr_nil) { - SLLQueuePush(state->top_task->parent->first, state->top_task->parent->last, expr); - state->top_task->child_count += 1; - if(state->top_task->child_count == state->top_task->child_count_target) + U64 trailing_symbol_off = off; + if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &trailing_symbol_off, &token)) { - // TODO(rjf): pop task, insert to parent, or decay to result - should naturally express below block too + // rjf: token string -> operator kind + E2_OpKind op_kind = E2_OpKind_Null; + { + String8 token_string = str8_substr(string, token.range); + for EachNonZeroEnumVal(E2_OpKind, k) + { + if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_Binary && + e2_op_kind_info_table[k].precedence <= max_precedence && + str8_match(token_string, e2_op_kind_info_table[k].pre, 0)) + { + op_kind = k; + break; + } + } + } + + // rjf: non-null operator kind -> build binary expression node, push task to fill other child + if(op_kind != E2_OpKind_Null) + { + E2_ParseTask *task = state->free_task; + if(task != 0) + { + SLLStackPop(state->free_task); + } + else + { + task = push_array(arena, E2_ParseTask, 1); + } + task->parent = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(task->parent, &e2_expr_nil); + SLLQueuePush_NZ(&e2_expr_nil, task->parent->first, task->parent->last, expr, next); + task->child_count = 1; + task->child_count_target = 2; + task->op_kind = op_kind; + task->max_precedence = e2_op_kind_info_table[op_kind].precedence; + SLLStackPush(state->top_task, task); + } } } - //- rjf: no task -> formed expr is result - if(expr != &e2_expr_nil && state->top_task == 0) + //- rjf: attach formed expressions to parent task exprs; pop tasks when they're done. + // if we have no parent task, then we just fill the result, and we're done with the parse. + if(expr != &e2_expr_nil) { - parse.expr = expr; - break; + //- rjf: pop finished expressions + E2_Expr *finished_expr = expr; + for(;state->top_task != 0;) + { + //- rjf: add finished expression to current parent; increase task child count + E2_Expr *finished_expr_parent = state->top_task->parent; + SLLQueuePush_NZ(&e2_expr_nil, finished_expr_parent->first, finished_expr_parent->last, finished_expr, next); + state->top_task->child_count += 1; + + //- rjf: task child count hits limit -> complete this child + if(state->top_task->child_count >= state->top_task->child_count_target) + { + //- rjf: release task; iterate to this finished expression next + E2_ParseTask *completed_task = state->top_task; + SLLStackPop(state->top_task); + SLLStackPush(state->free_task, completed_task); + + //- rjf: finish expression with operator info, if applicable + { + E2_Expr *root = completed_task->parent; + switch(completed_task->op_kind) + { + default:{}break; + + //- rjf: dereference + case E2_OpKind_Deref: + { + // rjf: unpack operand + E2_Expr *rhs = root->first; + // E2_TypeKey rhs_type_key = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_AllDecorative & ~E2_TypeUnwrapFlag_Enums); + // E2_TypeKind rhs_type_kind = e2_type_kind_from_key(rhs_type_key); + // E2_TypeKey dereferenced_type = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_All & ~E2_TypeUnwrapFlag_Enums); + // U64 dereferenced_type_size = e2_byte_size_from_type_key(dereferenced_type); + + // rjf: collect info about malformed situations + B32 malformed = 0; + // if(dereferenced_type_size == 0 && e2_type_kind_is_ptr_or_ref(rhs_type_kind)) + { + malformed = 1; + // e2_msgf(arena, &parse.msgs, src->root_range, ""); + } + }break; + + case E2_OpKind_Address:{}break; + case E2_OpKind_Pos:{}break; + case E2_OpKind_Neg:{}break; + case E2_OpKind_LogNot:{}break; + case E2_OpKind_BitNot:{}break; + case E2_OpKind_Mul:{}break; + case E2_OpKind_Div:{}break; + case E2_OpKind_Mod:{}break; + case E2_OpKind_Add:{}break; + case E2_OpKind_Sub:{}break; + case E2_OpKind_LShift:{}break; + case E2_OpKind_RShift:{}break; + case E2_OpKind_Less:{}break; + case E2_OpKind_LtEq:{}break; + case E2_OpKind_Grtr:{}break; + case E2_OpKind_GrEq:{}break; + case E2_OpKind_EqEq:{}break; + case E2_OpKind_NtEq:{}break; + case E2_OpKind_BitAnd:{}break; + case E2_OpKind_BitXor:{}break; + case E2_OpKind_BitOr:{}break; + case E2_OpKind_LogAnd:{}break; + case E2_OpKind_LogOr:{}break; + case E2_OpKind_Define:{}break; + } + } + + //- rjf: iterate to the completed task's expression node next, to try & finish it for *its* parent + finished_expr = completed_task->parent; + } + } + + //- rjf: for the last finished expression, if we do not have any further tasks, + // this is our result. + if(finished_expr != &e2_expr_nil && state->top_task == 0) + { + parse.expr = finished_expr; + if(parse.status == E2_Status_Error) + { + parse.status = E2_Status_Good; + } + break; + } } } //- rjf: advance offset if successful if(parse.status == E2_Status_Good) { - state->string_off += off; + state->string_off = off; } return parse; } diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index f9d776fd..e56d35da 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -205,33 +205,6 @@ struct E2_Val typedef U64 E2_SpaceID; -typedef struct E2_DbgInfo E2_DbgInfo; -struct E2_DbgInfo -{ - DI_Key dbgi_key; - RDI_Parsed *rdi; - String8 name; -}; - -typedef struct E2_Module E2_Module; -struct E2_Module -{ - E2_SpaceID space_id; - Rng1U64 addr_range; - E2_DbgInfo *dbg_info; - Arch arch; - String8 name; -}; - -typedef struct E2_Assets E2_Assets; -struct E2_Assets -{ - E2_Module *modules; - U64 modules_count; - E2_DbgInfo *dbg_infos; - U64 dbg_infos_count; -}; - //////////////////////////////// //~ rjf: Evaluation Contexts @@ -298,6 +271,7 @@ struct E2_Expr E2_Expr *first; E2_Expr *last; E2_Expr *next; + Rng1U64 src_range; String8 string; RDI_EvalOp op; E2_TypeKey type_key; @@ -327,6 +301,8 @@ struct E2_ParseTask E2_Expr *parent; U64 child_count; U64 child_count_target; + S64 max_precedence; + E2_OpKind op_kind; String8 expected_closer; }; @@ -342,7 +318,7 @@ typedef struct E2_Msg E2_Msg; struct E2_Msg { E2_Msg *next; - U64 src_off; + Rng1U64 src_range; String8 string; }; @@ -358,10 +334,6 @@ typedef struct E2_Parse E2_Parse; struct E2_Parse { E2_Status status; - E2_SpaceID space_id; - Rng1U64 missed_read_space_addr_range; - E2_CtxID ctx_id; - E2_CtxFlags missing_ctx_flags; String8 missed_identifier; E2_Expr *expr; E2_Expr *access_expr; @@ -433,8 +405,8 @@ internal E2_Expr *e2_expr_from_name(E2_ExprMap *map, String8 name); //////////////////////////////// //~ rjf: Messages -internal E2_Msg *e2_msg(Arena *arena, E2_MsgList *msgs, U64 src_off, String8 string); -internal E2_Msg *e2_msgf(Arena *arena, E2_MsgList *msgs, U64 src_off, char *fmt, ...); +internal E2_Msg *e2_msg(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, String8 string); +internal E2_Msg *e2_msgf(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, char *fmt, ...); //////////////////////////////// //~ rjf: Types @@ -444,7 +416,7 @@ internal E2_TypeKey e2_type_key_basic(E2_TypeKind kind); //////////////////////////////// //~ rjf: String -> Expression -internal E2_Token e2_token_from_string(String8 string); +internal E2_Token e2_token_from_string_off(String8 string, U64 start_off); internal U64 e2_read_token(String8 string, U64 off, E2_Token *token_out); internal B32 e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out); internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string); diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 314db20a..a61108aa 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -436,7 +436,7 @@ RD_VocabInfo rd_vocab_info_table[368] = RD_NameSchemaInfo rd_name_schema_info_table[39] = { -{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n\n //- rjf: symbol server\n @default(0) @display_name('Auto Download Debug Info') @description(\"Automatically tries to download missing debug info from symbol server(s).\")\n 'auto_download_debug_info': bool,\n}\n")}, +{str8_lit_comp("user"), 0, str8_lit_comp("@expand_commands(edit_user_theme) x:\n{\n //- rjf: animations\n @display_name('Animations') @description(\"Enables animations.\")\n @default(1) 'animations': bool,\n @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\n @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\n @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\n @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\n @display_name('Menu Animations') @description(\"Enables menu animations.\")\n @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n @default('') 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n @default('') 'code_font': string,\n\n //- rjf: theme\n @default(\"Default (Dark)\") @display_name('User Theme')\n @description(\"The user's theme, which describes all colors used throughout the UI.\")\n 'theme': string,\n @no_expand @display_name('User Theme')\n 'theme_colors': set,\n\n //- rjf: auto eval\n @display_name('Show Auto Watches In Source / Disassembly') @description(\"Enables the display of auto watch expressions inline in source and disassembly views.\") @default(1)\n 'show_autos_in_src_and_disasm': bool,\n\n //- rjf: autocompletion\n @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\n 'autocompletion_lister': bool,\n @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\n 'view_call_argument_helper': bool,\n\n //- rjf: scope decorations\n @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\n 'cursor_scope_lines': bool,\n @default(1) @display_name('Cursor Scope End Annotations') @description(\"Controls whether or not ending annotations for scopes containing the cursor are drawn.\")\n 'cursor_scope_end_annotations': bool,\n\n //- rjf: cursor decorations\n @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\n 'cursor_trail': bool,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n\n //- rjf: native filesystem dialogues\n @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\n 'use_native_file_system_dialog': bool,\n\n //- rjf: transient tabs\n @default(1) @display_name('Transient Tabs') @description(\"When snapping to source code locations, opens new files in a 'transient' tab if they are not already open. Transient tabs are replaced on subsequent snaps automatically.\")\n 'transient_tabs': bool,\n\n //- rjf: auto-load last project\n @default(0) @display_name('Auto Load Last Project') @description(\"Enables loading the most recently opened project, if one is not specified from the command line.\")\n 'auto_load_last_project': bool,\n\n //- rjf: symbol server\n @default(0) @display_name('Auto Download Debug Info') @description(\"Automatically tries to download missing debug info from symbol server(s).\")\n 'auto_download_debug_info': bool,\n\n //- rjf: update check\n @default(1) @display_name('Check For Updates') @description(\"Enables a small network request to check if there is a newer release version available.\")\n 'check_for_updates': bool,\n}\n")}, {str8_lit_comp("project"), 0, str8_lit_comp("@expand_commands(edit_project_theme) x:\n{\n @display_name('Project Name') 'name': string,\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: visualizers\n @display_name('Display Pointer Addresses Before Contents') @description(\"When visualizing pointers, always shows the address first, before showing contents at the pointer's address.\")\n @default(0) display_pointer_addresses_before_contents: bool,\n @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\n @default(1) use_default_stl_type_views: bool,\n @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\n @default(1) use_default_ue_type_views: bool,\n\n //- rjf: theme\n @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme': string,\n @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\n 'theme_colors': set,\n\n //- rjf: exception settings\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("theme_color"), 0, str8_lit_comp("@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\n@row_commands(duplicate_cfg, remove_cfg)\nx:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), 0, str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n\n //- rjf: theme settings\n @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\n 'use_project_theme': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 40196307..ff696199 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -320,6 +320,10 @@ RD_VocabTable: //- rjf: symbol server @default(0) @display_name('Auto Download Debug Info') @description("Automatically tries to download missing debug info from symbol server(s).") 'auto_download_debug_info': bool, + + //- rjf: update check + @default(1) @display_name('Check For Updates') @description("Enables a small network request to check if there is a newer release version available.") + 'check_for_updates': bool, } ``` } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index a5c0250e..9fec8814 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10771,14 +10771,6 @@ rd_init(CmdLine *cmdln) { rd_state->update_check_arena = arena_alloc(); rd_state->update_check_http_ring = guarded_ring_alloc(rd_state->update_check_arena, KB(8)); - HTTP_RequestParams p = - { - .id = 1, - .method = HTTP_Method_Get, - .url = s("https://api.github.com/repos/EpicGamesExt/raddebugger/releases/latest"), - .user_agent = s("raddebugger"), - }; - http_push_request(rd_state->update_check_http_ring, &p, 0); } // rjf: set up schemas @@ -11183,50 +11175,6 @@ rd_frame(void) MemoryZeroStruct(&rd_state->cmd_outputs); } - ////////////////////////////// - //- rjf: check for updates - // - if(!rd_state->got_update_check) - { - // rjf: pop all responses that we can - B32 done = 0; - for(HTTP_Response response = {0}; http_pop_response(rd_state->update_check_arena, rd_state->update_check_http_ring, &response, 0);) - { - str8_list_push(rd_state->update_check_arena, &rd_state->update_check_response_body_pieces, response.body); - if(!response.has_more) - { - done = 1; - } - } - - // rjf: if we're done -> parse response & determine if there is a new version - if(done) - { - rd_state->got_update_check = 1; - Temp scratch = scratch_begin(0, 0); - String8 response_body = str8_list_join(rd_state->update_check_arena, &rd_state->update_check_response_body_pieces, 0); - MD_Node *root = md_tree_from_string(scratch.arena, response_body)->first; - MD_Node *html_url = md_child_from_string(root, s("html_url"), 0); - String8 newest_release_url = html_url->first->string; - U64 tag_pos = str8_find_needle(newest_release_url, 0, s("tag/v"), 0); - String8 tag_name = str8_skip(newest_release_url, tag_pos); - U64 suffix_pos = str8_find_needle(tag_name, 0, s("-"), 0); - String8 version_name = str8_prefix(tag_name, suffix_pos); - U64 release_version = version_from_str8(version_name); - U64 current_version = Version(BUILD_VERSION_MAJOR, BUILD_VERSION_MINOR, BUILD_VERSION_PATCH); - if(current_version < release_version) - { - rd_state->newer_update_available = 1; - } - guarded_ring_release(rd_state->update_check_http_ring); - arena_release(rd_state->update_check_arena); - rd_state->update_check_arena = 0; - rd_state->update_check_http_ring = 0; - MemoryZeroStruct(&rd_state->update_check_response_body_pieces); - scratch_end(scratch); - } - } - ////////////////////////////// //- rjf: iterate all tabs, touch their view-states // @@ -12867,6 +12815,91 @@ rd_frame(void) rd_state->eval_viz_base_string_flags |= EV_StringFlag_DisplayAddressUnmappedStatus; } + //////////////////////////// + //- rjf: send update check if needed + // + if(!rd_state->sent_update_check && !rd_state->got_update_check && rd_setting_b32_from_name(s("check_for_updates"))) + { + rd_state->sent_update_check = 1; + Temp scratch = scratch_begin(0, 0); + String8 cached_version_check_path = str8f(scratch.arena, "%S/raddbg/last_version_check", get_process_info()->user_program_config_data_path); + String8 cached_version_check_data = data_from_file_path(scratch.arena, cached_version_check_path); + MD_Node *root = md_tree_from_string(scratch.arena, cached_version_check_data)->first; + U64 cached_dense_time = u64_from_str8(root->string, 10); + DateTime cached_date_time = date_time_from_dense_time(cached_dense_time); + DateTime now_date_time = now_time_universal(); + B32 should_rerequest = 0; + if(now_date_time.day != cached_date_time.day || + now_date_time.month != cached_date_time.month || + now_date_time.year != cached_date_time.year) + { + should_rerequest = 1; + } + if(should_rerequest) + { + HTTP_RequestParams p = + { + .id = 1, + .method = HTTP_Method_Get, + .url = s("https://api.github.com/repos/EpicGamesExt/raddebugger/releases/latest"), + .user_agent = s("raddebugger"), + }; + http_push_request(rd_state->update_check_http_ring, &p, 0); + } + else + { + rd_state->got_update_check = 1; + rd_state->newer_update_available = (B32)u64_from_str8(root->first->string, 10); + } + scratch_end(scratch); + } + + ////////////////////////////// + //- rjf: check for updates + // + if(rd_state->sent_update_check && !rd_state->got_update_check) + { + // rjf: pop all responses that we can + B32 done = 0; + for(HTTP_Response response = {0}; http_pop_response(rd_state->update_check_arena, rd_state->update_check_http_ring, &response, 0);) + { + str8_list_push(rd_state->update_check_arena, &rd_state->update_check_response_body_pieces, response.body); + if(!response.has_more) + { + done = 1; + } + } + + // rjf: if we're done -> parse response & determine if there is a new version + if(done) + { + rd_state->got_update_check = 1; + Temp scratch = scratch_begin(0, 0); + String8 response_body = str8_list_join(rd_state->update_check_arena, &rd_state->update_check_response_body_pieces, 0); + MD_Node *root = md_tree_from_string(scratch.arena, response_body)->first; + MD_Node *html_url = md_child_from_string(root, s("html_url"), 0); + String8 newest_release_url = html_url->first->string; + U64 tag_pos = str8_find_needle(newest_release_url, 0, s("tag/v"), 0); + String8 tag_name = str8_skip(newest_release_url, tag_pos); + U64 suffix_pos = str8_find_needle(tag_name, 0, s("-"), 0); + String8 version_name = str8_prefix(tag_name, suffix_pos); + U64 release_version = version_from_str8(version_name); + U64 current_version = Version(BUILD_VERSION_MAJOR, BUILD_VERSION_MINOR, BUILD_VERSION_PATCH); + if(current_version < release_version) + { + rd_state->newer_update_available = 1; + } + String8 cached_version_check_path = str8f(scratch.arena, "%S/raddbg/last_version_check", get_process_info()->user_program_config_data_path); + write_data_to_file_path(cached_version_check_path, str8f(scratch.arena, "%I64u: %i", dense_time_from_date_time(now_time_universal()), !!rd_state->newer_update_available)); + guarded_ring_release(rd_state->update_check_http_ring); + arena_release(rd_state->update_check_arena); + rd_state->update_check_arena = 0; + rd_state->update_check_http_ring = 0; + MemoryZeroStruct(&rd_state->update_check_response_body_pieces); + scratch_end(scratch); + } + } + //////////////////////////// //- rjf: autosave if needed // diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 472bcdab..b7994c02 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -391,6 +391,7 @@ struct RD_State U64 frame_eval_memread_endt_us; // rjf: update checker + B32 sent_update_check; B32 got_update_check; B32 newer_update_available; Arena *update_check_arena; diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 41df35d1..1f2d914e 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -12,19 +12,17 @@ //- rjf: [h] #include "base/base_inc.h" -#include "content/content.h" -#include "artifact_cache/artifact_cache.h" -#include "file_stream/file_stream.h" +#include "x64/x64.h" #include "rdi/rdi_local.h" -#include "dbg_info/dbg_info.h" +#include "arch/arch_inc.h" +#include "eval2/eval2.h" //- rjf: [c] #include "base/base_inc.c" -#include "content/content.c" -#include "artifact_cache/artifact_cache.c" -#include "file_stream/file_stream.c" +#include "x64/x64.c" #include "rdi/rdi_local.c" -#include "dbg_info/dbg_info.c" +#include "arch/arch_inc.c" +#include "eval2/eval2.c" //////////////////////////////// //~ rjf: Entry Point @@ -32,53 +30,17 @@ internal void entry_point(CmdLine *cmdline) { - local_persist char *pdb_paths[] = - { - "C:/devel/raddebugger/build/raddbg.pdb", - // #include "fn_debug_infos.inc" - }; - - DI_Key keys[ArrayCount(pdb_paths)] = {0}; - for EachElement(idx, pdb_paths) - { - String8 path = str8_cstring(pdb_paths[idx]); - keys[idx] = di_key_from_path_timestamp(path, 0); - di_open(keys[idx]); - } - + Temp scratch = scratch_begin(0, 0); + E2_ParseState state = {0}; + E2_SpaceMap space_map = {0}; + E2_ExprMap expr_map = {0}; for(;;) { - Access *access = access_open(); - B32 got_all_rdis = 1; - U64 num_rdis_loaded = 0; - for EachElement(idx, pdb_paths) + E2_Parse parse = e2_parse_from_string(scratch.arena, &state, &space_map, &expr_map, s("!123")); + if(parse.status == E2_Status_Good) { - RDI_Parsed *rdi = di_rdi_from_key(access, keys[idx], 1, 0); - if(rdi == &rdi_parsed_nil) - { - got_all_rdis = 0; - } - else - { - num_rdis_loaded += 1; - } - } - printf("\rloaded [%I64u/%I64u], %I64u active threads, %I64u active processes", num_rdis_loaded, ArrayCount(pdb_paths), di_shared->conversion_thread_count, di_shared->conversion_process_count); - access_close(access); - if(got_all_rdis) - { - Access *access = access_open(); - String8 search_query = str8_lit("rd_"); - DI_SearchItemArray items = di_search_item_array_from_target_query(access, RDI_SectionKind_Procedures, search_query, max_U64); - printf("\n"); - printf("fuzzy searched for %.*s, found %I64u items\n", str8_varg(search_query), items.count); - access_close(access); - - String8 match_query = str8_lit("rd_frame"); - DI_Match match = di_match_from_string(match_query, 0, max_U64); - printf("searched for %.*s, found at %i in [%I64x:%I64x]\n", str8_varg(match_query), match.idx, match.key.u64[0], match.key.u64[1]); - break; } } + scratch_end(scratch); } From 956df5527a70292f08f217886eaf31af4d8546e2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 15 Jun 2026 13:43:18 -0700 Subject: [PATCH 803/850] switch type server from PDB to a custom file format (RRT) --- src/linker/lnk.c | 375 +++++++++++++++++--------------- src/linker/lnk.h | 7 + src/linker/lnk_config.c | 39 ++-- src/linker/lnk_config.h | 3 +- src/linker/lnk_debug_info.c | 26 +-- src/linker/lnk_log.c | 26 +-- src/linker/lnk_log.h | 24 +- src/linker/tests/linker_tests.c | 190 ++++++++++++++++ 8 files changed, 451 insertions(+), 239 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index f5d600e6..250a33c4 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1864,7 +1864,7 @@ lnk_link_inputs(TP_Context *tp, is_addr_import = hash_map_search_stringf_raw(&imports_hm, "__imp_%S", member_ref->link_symbol->name); } if (is_thunk_import != 0 || is_addr_import != 0) { - lnk_log(LNK_Log_Debug, "duplicate import %S member queue detected", member_ref->link_symbol->name); + lnk_log(LNK_Log_Paranoid, "duplicate import member queue detected: %S", member_ref->link_symbol->name); break; } } @@ -2739,17 +2739,16 @@ THREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task) } if (lnk_get_log_status(LNK_Log_Debug)) { - U64 total_vsize = 0, total_fsize = 0, total_section_count = 0; + U64 total_fsize = 0, total_section_count = 0; for EachElement(i, stats) { - total_vsize += stats[i].vsize; total_fsize += stats[i].fsize; total_section_count += stats[i].section_count; } String8List stat_list = {0}; - str8_list_pushf(scratch.arena, &stat_list, "Code : vsize: %M, fsize: %M, section count %llu", stats[Stat_Code].vsize, stats[Stat_Code].fsize, (unsigned long long)stats[Stat_Code].section_count ); - str8_list_pushf(scratch.arena, &stat_list, "Data : vsize: %M, fsize: %M, section count %llu", stats[Stat_Data].vsize, stats[Stat_Data].fsize, (unsigned long long)stats[Stat_Data].section_count ); - str8_list_pushf(scratch.arena, &stat_list, "Debug: vsize: %M, fsize: %M, section count %llu", stats[Stat_Debug].vsize, stats[Stat_Debug].fsize, (unsigned long long)stats[Stat_Debug].section_count); - str8_list_pushf(scratch.arena, &stat_list, "Total: vsize: %M, fsize: %M, section count %llu", total_vsize, total_fsize, total_section_count); + str8_list_pushf(scratch.arena, &stat_list, "Code : %M, %S sections", stats[Stat_Code].fsize, str8_from_count(scratch.arena, stats[Stat_Code].section_count )); + str8_list_pushf(scratch.arena, &stat_list, "Data : %M, %S sections", stats[Stat_Data].fsize, str8_from_count(scratch.arena, stats[Stat_Data].section_count )); + str8_list_pushf(scratch.arena, &stat_list, "Debug: %M, %S sections", stats[Stat_Debug].fsize, str8_from_count(scratch.arena, stats[Stat_Debug].section_count)); + str8_list_pushf(scratch.arena, &stat_list, "Total: %M, %S sections", total_fsize, str8_from_count(scratch.arena, total_section_count)); String8 stat_str = str8_list_join(scratch.arena, &stat_list, &(StringJoin){.pre = str8_lit(" "), .sep = str8_lit("\n ")}); lnk_log(LNK_Log_Debug, "/OPT:REF Stats:\n%S", stat_str); } @@ -5557,29 +5556,112 @@ lnk_run_linker(TP_Context *tp, TP_Arena *arena, LNK_Config *config) ProfEnd(); } +internal +THREAD_POOL_TASK_FUNC(lnk_serialize_rrt_type_data_task) +{ + Temp scratch = scratch_begin(&arena, 1); + + LNK_RRTTypeDataSerializer *task = raw_task; + LNK_MergedTypes *cv_types = task->cv_types; + + // set up per task size array + U64 **source_sizes = 0; + Rng1U64 *ranges[CV_TypeIndexSource_COUNT]; + if (task_id == 0) { + source_sizes = push_array(scratch.arena, U64 *, CV_TypeIndexSource_COUNT); + for EachIndex(i, CV_TypeIndexSource_COUNT) { + source_sizes[i] = push_array(scratch.arena, U64, tp->worker_count); + } + + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + ranges[ti_source] = tp_divide_work(scratch.arena, cv_types->count[ti_source], tp->worker_count); + } + } + tp_broadcast(&source_sizes); + tp_broadcast(&ranges); + + // compute size of each source per task + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + for EachInRange(i, ranges[ti_source][task_id]) { + CV_LeafHeader *leaf = (CV_LeafHeader *)cv_types->v[ti_source][i]; + String8 leaf_data = str8((U8 *)(leaf + 1), leaf->size - sizeof(leaf->kind)); + U64 leaf_size = cv_size_from_leaf(leaf_data, PDB_LEAF_ALIGN); + source_sizes[ti_source][task_id] += leaf_size; + } + } + barrier_wait(tp->barrier); + + // alloc buffer & set up buffer offsets for each task + U64 *chunk_sizes = 0; + U64 *source_base_offsets = 0; + U64 *source_task_offsets = 0; + if (task_id == 0) { + // compute chunk sizes per task + chunk_sizes = push_array(scratch.arena, U64, tp->worker_count); + for EachIndex(i, tp->worker_count) { + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + chunk_sizes[i] += source_sizes[ti_source][i]; + } + } + + // alloc output buffer for the serializer + U64 total_type_size = sum_array_u64(tp->worker_count, chunk_sizes); + *task->type_data_out = str8(push_array_no_zero(arena, U8, total_type_size), total_type_size); + + // output data ranges and source base offsets + source_base_offsets = push_array(scratch.arena, U64, CV_TypeIndexSource_COUNT); + U64 prev_off = 0; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + source_base_offsets[ti_source] = prev_off; + U64 source_size = sum_array_u64(tp->worker_count, source_sizes[ti_source]); + task->type_data_ranges_out[ti_source] = r1u64(prev_off, prev_off + source_size); + prev_off += source_size; + } + + // compute per-source, per-task offsets into the output buffer + source_task_offsets = push_array(scratch.arena, U64, CV_TypeIndexSource_COUNT*tp->worker_count); + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + U64 source_cursor = source_base_offsets[ti_source]; + for EachIndex(worker_idx, tp->worker_count) { + source_task_offsets[ti_source*tp->worker_count + worker_idx] = source_cursor; + source_cursor += source_sizes[ti_source][worker_idx]; + } + } + } + tp_broadcast(&chunk_sizes); + tp_broadcast(&source_task_offsets); + + // serialize types + U64 chunk_cursor = 0; + U8 *type_data_ptr = task->type_data_out->str; + U64 type_data_max = task->type_data_out->size; + for EachIndex(ti_source, CV_TypeIndexSource_COUNT) { + U64 cursor = source_task_offsets[ti_source*tp->worker_count + task_id]; + for EachInRange(i, ranges[ti_source][task_id]) { + CV_LeafHeader *leaf = (CV_LeafHeader *)cv_types->v[ti_source][i]; + String8 leaf_data = str8((U8 *)(leaf + 1), leaf->size - sizeof(leaf->kind)); + U64 write_size = cv_write_leaf(type_data_ptr, cursor, type_data_max, leaf->kind, leaf_data, PDB_LEAF_ALIGN); + cursor += write_size; + chunk_cursor += write_size; + } + Assert(cursor == source_task_offsets[ti_source*tp->worker_count + task_id] + source_sizes[ti_source][task_id]); + } + Assert(chunk_cursor == chunk_sizes[task_id]); + barrier_wait(tp->barrier); + + scratch_end(scratch); +} + internal void lnk_run_type_server(TP_Context *tp, TP_Arena *arena, LNK_Config *config) { ProfBeginFunction(); Temp scratch = scratch_begin(arena->v, arena->count); - // generate GUID - Guid type_server_guid = {0}; - { - blake3_hasher hasher = {0}; - blake3_hasher_init(&hasher); - blake3_hasher_update(&hasher, config->pdb_name.str, config->pdb_name.size); - blake3_hasher_update(&hasher, (U8*)&config->time_stamp, sizeof(config->time_stamp)); - blake3_hasher_finalize(&hasher, type_server_guid.v, sizeof(type_server_guid.v)); - } - // push default type-server switches - lnk_config_pushf(config, "/PDB:\"%S.type_server.pdb\"", str8_chop_last_dot(config->pdb_name)); - lnk_config_pushf(config, "/DEBUG:FULL"); + lnk_config_pushf(config, "/DEBUG:GHASH"); lnk_config_pushf(config, "/NOD"); lnk_config_pushf(config, "/RAD_WRITE_TEMP_FILES"); - lnk_config_pushf(config, "/RAD_MEMORY_MAP_FILES:READ_WRITE"); - lnk_config_pushf(config, "/RAD_GUID:%S", string_from_guid(scratch.arena, type_server_guid)); // load objs U64 objs_count = 0; @@ -5602,177 +5684,122 @@ lnk_run_type_server(TP_Context *tp, TP_Arena *arena, LNK_Config *config) for EachIndex(obj_idx, objs_count) { objs[obj_idx] = &obj_nodes[obj_idx].data; } } - // obj filters + // obj filter + objs = lnk_debug_filter_objs(scratch.arena, objs, objs_count, &objs_count); + + // parse & merge types + LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config, objs_count, objs, (LNK_RRT_Array){0}); + LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv, LNK_MergeTypeFlag_SkipSymbolTypeFixup | LNK_MergeTypeFlag_BuildObjTiMap | LNK_MergeTypeFlag_ExportHashes); + + U64Array include_objs = {0}; { - // internal filter - objs = lnk_debug_filter_objs(scratch.arena, objs, objs_count, &objs_count); - - // command line filter - { - U64 result_count = 0; - LNK_Obj **result = push_array(scratch.arena, LNK_Obj *, objs_count); - for EachIndex(obj_idx, objs_count) { - LNK_Obj *obj = objs[obj_idx]; - - B32 skip = 0; - if (config->type_server_match_obj.node_count) { - skip = 1; - for EachNode(filter_n, String8Node, config->type_server_match_obj.first) { - if (str8_match_wildcard(obj->path, filter_n->string, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive)) { - skip = 0; - break; - } - } - } - if (skip) { continue; } - - result[result_count++] = obj; - } - objs_count = result_count; - objs = result; - } - } - - // compute size of objs compiled with /Z7 - U64 debug_t_total_size = 0; - { - for EachIndex(obj_idx, objs_count) { - LNK_Obj *obj = objs[obj_idx]; - - // register debug info sections - U64 type_sect_indices_count = 0; - U32 type_sect_indices[4] = {0}; - if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { type_sect_indices[type_sect_indices_count++] = obj->debug_t_sect_idx; } - else if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { type_sect_indices[type_sect_indices_count++] = obj->debug_p_sect_idx; } - - for EachIndex(i, type_sect_indices_count) { - U64 section_idx = type_sect_indices[i]; - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - COFF_SectionHeader *debug_t_header = §ion_table[section_idx]; - String8 debug_t_data = str8_substr(obj->data, r1u64(debug_t_header->foff, debug_t_header->foff + debug_t_header->fsize)); - CV_Leaf first_leaf = {0}; - if (cv_read_leaf(debug_t_data, sizeof(CV_Signature), CV_LeafAlign, &first_leaf) >= sizeof(CV_LeafHeader)) { - if ( ! cv_is_leaf_type_server(first_leaf.kind)) { - debug_t_total_size += debug_t_data.size; - } - } - } - } - } - - if (debug_t_total_size) { - // merge & write types - LNK_CodeViewInput cv = lnk_make_code_view_input(tp, arena, config, objs_count, objs, (LNK_RRT_Array){0}); - LNK_MergedTypes cv_types = lnk_merge_types(tp, arena, &cv, LNK_MergeTypeFlag_BuildObjTiMap|LNK_MergeTypeFlag_SkipSymbolTypeFixup|LNK_MergeTypeFlag_ExportHashes); - String8List pdb = lnk_build_pdb(tp, arena, str8_zero(), config, 0, &cv, cv_types, LNK_PDB_BuilderFlag_Tpi|LNK_PDB_BuilderFlag_Ipi); - lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb); - - typedef struct Edit { - struct Edit *next; - String8 data; - U64 offset; - LNK_Obj *obj; - } Edit; - Edit *edits = 0; - + U64List include_obj_list = {0}; for EachIndex(obj_idx, objs_count) { LNK_Obj *obj = objs[obj_idx]; // skip objs in libraries if (obj->link_member) { continue; } - if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - COFF_SectionHeader *section_header = §ion_table[obj->debug_t_sect_idx]; - - // skip type servers - if (cv_debug_t_is_type_server_ref(&cv.debug_t_arr[obj_idx])) { continue; } - - CV_LeafTypeServer2 ts_info = { .sig70 = config->guid, .age = 1 }; - String8List ts_srl = {0}; - str8_list_push(scratch.arena, &ts_srl, str8_struct(&ts_info)); - str8_list_push(scratch.arena, &ts_srl, push_cstr(scratch.arena, config->pdb_name)); - - // type server srl -> CodeView leaf - String8 ts_string = str8_list_join(scratch.arena, &ts_srl, 0); - String8 ts_leaf = cv_make_leaf(scratch.arena, CV_LeafKind_TYPESERVER2, ts_string, CV_LeafAlign); - - // make type server .debug$T - String8List debug_t_list = {0}; - str8_list_push(scratch.arena, &debug_t_list, str8_struct((&(CV_Signature){ CV_Signature_C13 }))); - str8_list_push(scratch.arena, &debug_t_list, ts_leaf); - String8 debug_t = str8_list_join(scratch.arena, &debug_t_list, 0); - - // realloc seciton if there is not enough room in the section header - if (debug_t.size > section_header->fsize) { - section_header->foff = obj->data.size; - section_header->fsize = debug_t.size; - - // append to the obj - struct Edit *e = push_array(scratch.arena, struct Edit, 1); - e->data = debug_t; - e->offset = obj->data.size; - e->obj = obj; - SLLStackPush(edits, e); - } else { - section_header->fsize = debug_t.size; - - Rng1U64 section_frange = rng_1u64(section_header->foff, section_header->foff + section_header->fsize); - String8 section_data = str8_substr(obj->data, section_frange); - MemoryCopyStr8(section_data.str, debug_t); - } - } - - // discard precompiled headers types, they are already in the type server + // does obj have debug types? if (obj->debug_p_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - COFF_SectionHeader *section_header = §ion_table[obj->debug_p_sect_idx]; - section_header->flags |= COFF_SectionFlag_LnkRemove; - } + u64_list_push(scratch.arena, &include_obj_list, obj_idx); + } else if (obj->debug_t_sect_idx < obj->header.section_count_no_null) { + // read first leaf + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, obj->debug_t_sect_idx); + String8 raw_debug_t = str8_substr(obj->data, section.frange); + CV_Leaf leaf = {0}; + cv_read_leaf(raw_debug_t, 0, 1, &leaf); - // discard type hashes sectiosn, there is no /Z7 sections in the file - if (obj->debug_h_sect_idx < obj->header.section_count_no_null) { - COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj); - COFF_SectionHeader *section_header = §ion_table[obj->debug_h_sect_idx]; - section_header->flags |= COFF_SectionFlag_LnkRemove; - } - - // edit obj - if (edits) { - #if OS_WINDOWS - AssertAlways(UnmapViewOfFile(obj->data.str)); - #else - NotImplemented; - #endif - File handle = file_open(AccessFlag_Append|AccessFlag_Read|AccessFlag_Write, obj->path); - for EachNode(e, struct Edit, edits) { - AssertAlways(file_write(handle, r1u64(e->offset, e->offset + e->data.size), e->data.str) == e->data.size); + // is this /Z7 obj? + if ( ! cv_is_leaf_type_server(leaf.kind)) { + u64_list_push(scratch.arena, &include_obj_list, obj_idx); } - file_close(handle); } } + include_objs = u64_array_from_list(scratch.arena, &include_obj_list); } -#if 0 - // relaunch the binary with the same command line, but with boot mode set to LINKER - if (config->type_server == LNK_SwitchState_Yes) { - String8 curr_cmdl = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){.sep=str8_lit(" ")}); - String8 linker_cmdl = str8f(scratch.arena, "%S %S /RAD_TYPE_SERVER:NO /RAD_BOOT_MODE:LINKER", get_process_info()->binary_file_path, curr_cmdl); + LNK_RRT rrt = {0}; + ProfScope("Pack Type Data & Data Ranges") + { + LNK_RRTTypeDataSerializer task = { &cv_types, &rrt.type_data_raw, rrt.type_data_ranges }; + tp_for_parallel(tp, arena, tp->worker_count, lnk_serialize_rrt_type_data_task, &task); - ProcessLaunchParams launch_opts = { - .path = get_process_info()->binary_path, - .inherit_env = 1, - .consoleless = 1, - .cmd_line = lnk_arg_list_parse_windows_rules(scratch.arena, linker_cmdl), - }; - Process process_handle = process_launch(&launch_opts); + // pack type index ranges + for EachIndex(i, CV_TypeIndexSource_COUNT) { + rrt.ti_ranges[i] = r1u64(cv_types.min_type_indices[i], cv_types.min_type_indices[i] + cv_types.count[i]); + } - if (process_match(process_handle, process_zero())) { - String8 e = str8f(scratch.arena, "failed to launch radlink(%S) after type server step\n"); - lnk_invalid_path((char*)e.str); + // copy pointers to type hashes + MemoryCopyArray(rrt.type_hashes_unpacked, cv_types.hashes); + } + + rrt.obj_count = include_objs.count; + + // copy per object leaf counts + rrt.obj_leaf_counts = push_array(scratch.arena, U64, include_objs.count); + for EachIndex(i, include_objs.count) { + U64 obj_idx = include_objs.v[i]; + CV_DebugT *debug_t = &cv.debug_t_arr[obj_idx]; + rrt.obj_leaf_counts[i] = debug_t->count; + } + + // copy per object type index ranges + rrt.obj_ti_ranges = push_array(scratch.arena, Rng1U64, include_objs.count); + for EachIndex(i, include_objs.count) { + U64 obj_idx = include_objs.v[i]; + LNK_Obj *obj = objs[obj_idx]; + CV_DebugT *debug_t = &cv.debug_t_arr[obj_idx]; + rrt.obj_ti_ranges[i] = debug_t->ti_ranges[CV_TypeIndexSource_TPI]; + } + + // copy obj time stamps + rrt.obj_time_stamps = push_array(scratch.arena, U64, include_objs.count); + for EachIndex(i, include_objs.count) { + U64 obj_idx = include_objs.v[i]; + LNK_Obj *obj = objs[obj_idx]; + FileProperties obj_file_props = properties_from_file_path(obj->path); + rrt.obj_time_stamps[i] = obj_file_props.modified; + } + + // copy obj file paths + rrt.obj_paths = str8_array_reserve(scratch.arena, include_objs.count); + for EachIndex(i, include_objs.count) { + U64 obj_idx = include_objs.v[i]; + LNK_Obj *obj = objs[obj_idx]; + rrt.obj_paths.v[rrt.obj_paths.count++] = obj->path; + } + + // wire per object file type index map + rrt.obj_ti_maps = push_array(scratch.arena, CV_TypeIndex *, include_objs.count); + for EachIndex(i, include_objs.count) { + U64 obj_idx = include_objs.v[i]; + rrt.obj_ti_maps[i] = cv_types.obj_ti_maps[obj_idx]; + } + + // obj idx -> RRT obj idx hash map + HashMap obj_to_rrt_obj_hm = {0}; + for EachIndex(i, include_objs.count) { + hash_map_push_u64_u64(scratch.arena, &obj_to_rrt_obj_hm, include_objs.v[i], i); + } + + // pack PCH info + rrt.obj_pch_indices = push_array(scratch.arena, U32, include_objs.count); + rrt.obj_pch_ti_ranges = push_array(scratch.arena, Rng1U64, include_objs.count); + for EachIndex(i, include_objs.count) { + U64 obj_idx = include_objs.v[i]; + CV_DebugT *debug_t = &cv.debug_t_arr[obj_idx]; + if (dim_1u64(debug_t->pch_ti_range[CV_TypeIndexSource_TPI]) > 0) { + rrt.obj_pch_indices [i] = safe_cast_u32(*hash_map_search_u64_u64(&obj_to_rrt_obj_hm, debug_t->pch_obj_idx)); + rrt.obj_pch_ti_ranges[i] = debug_t->pch_ti_range[CV_TypeIndexSource_TPI]; + } else { + rrt.obj_pch_indices [i] = max_U32; + rrt.obj_pch_ti_ranges[i] = r1u64(0,0); } } -#endif + + String8List rrt_data = lnk_string_list_from_rrt(scratch.arena, &rrt); + lnk_write_data_list_to_file_path(config->type_server_name, config->temp_type_server_name, rrt_data); scratch_end(scratch); ProfEnd(); diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 0c1ff4a3..d6388d0a 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -309,6 +309,13 @@ typedef struct U128 *hashes; } LNK_Blake3Hasher; +typedef struct +{ + LNK_MergedTypes *cv_types; + String8 *type_data_out; + Rng1U64 *type_data_ranges_out; +} LNK_RRTTypeDataSerializer; + typedef struct { RDIM_BakeResults bake_results; diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 8551ca68..3d27012c 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -73,7 +73,7 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Rad_MemoryMapFiles, 0, "RAD_MEMORY_MAP_FILES", "[:{NO|READ_ONLY|READ_WRITE}]", "When enabled, files are memory-mapped instead of being read entirely on request." }, { LNK_CmdSwitch_Rad_BootMode, 0, "RAD_BOOT_MODE", "[:LINKER|TYPE_SERVER]", "Overrides default boot program." }, { LNK_CmdSwitch_Rad_Debug, 0, "RAD_DEBUG", "[:NO]", "Emit RAD debug info file." }, - { LNK_CmdSwitch_Rad_DebugAltPath, 0, "RAD_DEBUGALTPATH", ":PATH", "Alternative output path fof the RDI." }, + { LNK_CmdSwitch_Rad_DebugAltPath, 0, "RAD_DEBUGALTPATH", ":PATH", "Alternative output path for the RDI." }, { LNK_CmdSwitch_Rad_DebugName, 0, "RAD_DEBUG_NAME", ":FILENAME", "Set file name for RAD debug info file." }, { LNK_CmdSwitch_Rad_DelayBind, 0, "RAD_DELAY_BIND", "[:NO]", "Emit bindable imports." }, { LNK_CmdSwitch_Rad_DoMerge, 0, "RAD_DO_MERGE", "[:NO]", "Set whether the linker should execute /MERGE." }, @@ -104,8 +104,7 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Rad_Workers, 0, "RAD_WORKERS", ":#", "Set number of workers created in the pool. Number is capped at 1024. When /RAD_SHARED_THREAD_POOL is specified this number cant exceed /RAD_SHARED_THREAD_POOL_MAX_WORKERS." }, { LNK_CmdSwitch_Rad_WorkDir, 0, "RAD_WORK_DIR", ":PATH", "Working directory used for stable debug paths." }, - { LNK_CmdSwitch_RadTypeServer, 0, "RAD_TYPE_SERVER", "", "Boot in type server mode." }, - { LNK_CmdSwitch_RadTypeServer_MatchObj, 0, "RAD_TYPE_SERVER_MATCH_OBJ", ":OBJ_PATH", "Obj paths that match OBJ_PATH have their type server replaced." }, + { LNK_CmdSwitch_RadTypeServer, 0, "RAD_TYPE_SERVER", ":FILENAME", "Merge types and store them in the specified file. The filename must have the .rrt extension." }, { LNK_CmdSwitch_Help, 0, "HELP", "", "" }, { LNK_CmdSwitch_Help, 0, "?", "", "" }, @@ -1119,13 +1118,16 @@ lnk_apply_write_temp_files(Arena *arena, LNK_Config *config) config->temp_rad_chunk_map_name = push_str8f(arena, "%S.tmp%x", config->rad_chunk_map_name, config->time_stamp); } if (config->out_path.size) { - config->temp_out_path = push_str8f(arena, "%S.tmp%x", config->out_path, config->time_stamp); + config->temp_out_path = push_str8f(arena, "%S.tmp%x", config->out_path, config->time_stamp); } if (config->pdb_name.size) { - config->temp_pdb_name = push_str8f(arena, "%S.tmp%x", config->pdb_name, config->time_stamp); + config->temp_pdb_name = push_str8f(arena, "%S.tmp%x", config->pdb_name, config->time_stamp); } if (config->rad_debug_name.size) { - config->temp_rad_debug_name = push_str8f(arena, "%S.tmp%x", config->rad_debug_name, config->time_stamp); + config->temp_rad_debug_name = push_str8f(arena, "%S.tmp%x", config->rad_debug_name, config->time_stamp); + } + if (config->type_server_name.size) { + config->temp_type_server_name = push_str8f(arena, "%S.tmp%x", config->type_server_name, config->time_stamp); } } @@ -2168,16 +2170,18 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } break; case LNK_CmdSwitch_RadTypeServer: { - if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->type_server)) { - if (config->type_server == LNK_SwitchState_Yes) { - config->boot_mode = LNK_BootMode_TypeServer; - } - } - } break; + lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->type_server_name); - case LNK_CmdSwitch_RadTypeServer_MatchObj: { - String8List value_strings_copy = str8_list_copy(config->arena, &value_strings); - str8_list_concat_in_place(&config->type_server_match_obj, &value_strings_copy); + if (config->type_server_name.size) { + String8 ext = str8_postfix(config->type_server_name, s("rrt").size); + if (str8_matchi(ext, s("rrt"))) { + config->boot_mode = LNK_BootMode_TypeServer; + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "missing .rrt file extension after type server name %S", config->type_server_name); + } + } else { + lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "missing type server file path"); + } } break; } @@ -2415,10 +2419,7 @@ lnk_config_init(LNK_CmdLine cmd_line) // create temporary files names if (config->write_temp_files == LNK_SwitchState_Yes) { - config->temp_rad_chunk_map_name = push_str8f(arena, "%S.tmp%x", config->rad_chunk_map_name, config->time_stamp); - config->temp_out_path = push_str8f(arena, "%S.tmp%x", config->out_path , config->time_stamp); - config->temp_pdb_name = push_str8f(arena, "%S.tmp%x", config->pdb_name, config->time_stamp); - config->temp_rad_debug_name = push_str8f(arena, "%S.tmp%x", config->rad_debug_name, config->time_stamp); + lnk_apply_write_temp_files(arena, config); } scratch_end(scratch); diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 073243f2..0b6d7964 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -368,6 +368,7 @@ typedef struct LNK_Config String8 temp_pdb_name; String8 temp_rad_debug_name; String8 temp_rad_chunk_map_name; + String8 temp_type_server_name; String8 delay_load_helper_name; String8List remove_sections; LNK_IO_Flags io_flags; @@ -384,8 +385,8 @@ typedef struct LNK_Config LNK_SwitchState map_lines_for_unresolved_symbols; String8List alt_pch_dirs; LLVM_GHashAlg type_hash_alg; + String8 type_server_name; LNK_SwitchState type_server; - String8List type_server_match_obj; } LNK_Config; // --- MSVC Error Codes -------------------------------------------------------- diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index cd751deb..83f57496 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -571,22 +571,22 @@ lnk_rrt_from_string(Arena *arena, String8 rrt_data, String8 path, LNK_RRT *rrt_o // fill out result if (rrt_out) { - rrt_out->path = path; - rrt_out->type_data_raw = type_data_raw; - rrt_out->type_hashes = type_hashes; + rrt_out->path = path; + rrt_out->type_data_raw = type_data_raw; + rrt_out->type_hashes = type_hashes; MemoryCopyArray(rrt_out->type_data_ranges, type_data_ranges); MemoryCopyArray(rrt_out->type_data, type_data); MemoryCopyArray(rrt_out->ti_ranges, ti_ranges); - rrt_out->obj_count = obj_count; - rrt_out->obj_leaf_counts = obj_leaf_counts; - rrt_out->obj_time_stamps = obj_time_stamps; - rrt_out->obj_ti_ranges = obj_ti_ranges; - rrt_out->obj_ti_maps = obj_ti_maps; - rrt_out->obj_ti_ranges = obj_ti_ranges; - rrt_out->obj_ti_maps = obj_ti_maps; - rrt_out->obj_paths = obj_paths; - rrt_out->obj_pch_ti_ranges = obj_pch_ti_ranges; - rrt_out->obj_pch_indices = obj_pch_indices; + rrt_out->obj_count = obj_count; + rrt_out->obj_leaf_counts = obj_leaf_counts; + rrt_out->obj_time_stamps = obj_time_stamps; + rrt_out->obj_ti_ranges = obj_ti_ranges; + rrt_out->obj_ti_maps = obj_ti_maps; + rrt_out->obj_ti_ranges = obj_ti_ranges; + rrt_out->obj_ti_maps = obj_ti_maps; + rrt_out->obj_paths = obj_paths; + rrt_out->obj_pch_ti_ranges = obj_pch_ti_ranges; + rrt_out->obj_pch_indices = obj_pch_indices; } is_ok = 1; diff --git a/src/linker/lnk_log.c b/src/linker/lnk_log.c index 17777ec0..c15abb0e 100644 --- a/src/linker/lnk_log.c +++ b/src/linker/lnk_log.c @@ -191,29 +191,9 @@ lnk_log(LNK_LogType type, char *fmt, ...) internal LNK_LogType lnk_log_type_from_string(String8 string) { - static struct { - char *name; - LNK_LogType type; - } map[] = { - "Null", LNK_Log_Null, - "Debug", LNK_Log_Debug, - "InputObj", LNK_Log_InputObj, - "InputLib", LNK_Log_InputLib, - "IO_Read", LNK_Log_IO_Read, - "IO_Write", LNK_Log_IO_Write, - "SizeBreakdown", LNK_Log_SizeBreakdown, - "LinkStats", LNK_Log_LinkStats, - "Timers", LNK_Log_Timers, - "Links", LNK_Log_Links, - }; - Assert(ArrayCount(map) == LNK_Log_Count); - - for EachElement(i, map) { - if (str8_match(str8_cstring(map[i].name), string, StringMatchFlag_CaseInsensitive)) { - return map[i].type; - } - } - +#define X(name, ...) if (str8_matchi(str8_lit(Stringify(name)), string)) { return LNK_Log_##name; } +LNK_LogType_XList +#undef X return LNK_Log_Null; } diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index 9890037c..7f24bb30 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -3,18 +3,24 @@ #pragma once +#define LNK_LogType_XList \ + X(Debug) \ + X(Paranoid) \ + X(InputObj) \ + X(InputLib) \ + X(IO_Read) \ + X(IO_Write) \ + X(SizeBreakdown) \ + X(LinkStats) \ + X(Timers) \ + X(Links) + typedef enum { LNK_Log_Null, - LNK_Log_Debug, - LNK_Log_InputObj, - LNK_Log_InputLib, - LNK_Log_IO_Read, - LNK_Log_IO_Write, - LNK_Log_SizeBreakdown, - LNK_Log_LinkStats, - LNK_Log_Timers, - LNK_Log_Links, +#define X(name, ...) LNK_Log_##name, + LNK_LogType_XList +#undef X LNK_Log_Count } LNK_LogType; diff --git a/src/linker/tests/linker_tests.c b/src/linker/tests/linker_tests.c index 014708bf..3221abe0 100644 --- a/src/linker/tests/linker_tests.c +++ b/src/linker/tests/linker_tests.c @@ -5260,6 +5260,196 @@ TEST(pch_sig_fallback) T_Ok(g_last_exit_code == 0); } +TEST(gen_rrt) +{ + String8 a_obj_file_path = t_make_file_path(arena, str8_lit("a.obj")); + String8 b_obj_file_path = t_make_file_path(arena, str8_lit("b.obj")); + U32 a_sig = 0xCAFEBABE; + U32 b_sig = 0xCAFEBABE; + + String8 a_debug_s; + { + String8List srl; + str8_serial_begin(arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = a_sig; + String8 obj_name_string = a_obj_file_path; + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); + + String8 comp3_data = cv_make_comp3(arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); + + a_debug_s = str8_serial_end(arena, &srl); + } + String8 a_debug_p; + { + String8List srl; + str8_serial_begin(arena, &srl); + + // signature + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + + // duplicate in a.obj + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(ptr)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + // unique procedure type + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearPascal }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(proc)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + // PCH ender + CV_LeafEndPreComp endprecomp = { .sig = a_sig }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(endprecomp)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_ENDPRECOMP); + str8_serial_push_struct(arena, &srl, &endprecomp); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + a_debug_p = str8_serial_end(arena, &srl); + } + + String8 b_debug_s; + { + String8List srl; + str8_serial_begin(arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + + CV_C13SubSectionHeader *ss_header = str8_serial_push_size(arena, &srl, sizeof(*ss_header)); + U64 ss_start_off = srl.total_size; + + CV_SymObjName obj_name = {0}; + obj_name.sig = b_sig; + String8 obj_name_string = a_obj_file_path; + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + sizeof(obj_name) + obj_name_string.size + 1); + str8_serial_push_u16(arena, &srl, CV_SymKind_OBJNAME); + str8_serial_push_struct(arena, &srl, &obj_name); + str8_serial_push_cstr(arena, &srl, obj_name_string); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); + + String8 comp3_data = cv_make_comp3(arena, + 0, + CV_Language_C, + CV_Arch_X64, + /* ver_fe_major */ 0, + /* ver_fe_minor */ 0, + /* ver_fe_build */ 0, + /* ver_feqfe */ 0, + /* ver_major */ 14, + /* ver_minor */ 36, + /* ver_build */ 32537, + /* ver_qfe */ 0, + str8_lit(BUILD_TITLE)); + str8_serial_push_u16(arena, &srl, sizeof(CV_SymKind) + comp3_data.size); + str8_serial_push_u16(arena, &srl, CV_SymKind_COMPILE3); + str8_serial_push_string(arena, &srl, comp3_data); + str8_serial_push_align(arena, &srl, CV_SymbolAlign); + + ss_header->kind = CV_C13SubSectionKind_Symbols; + ss_header->size = srl.total_size - ss_start_off; + str8_serial_push_align(arena, &srl, CV_C13SubSectionAlign); + + b_debug_s = str8_serial_end(arena, &srl); + } + + String8 b_debug_t; + { + String8List srl; + str8_serial_begin(arena, &srl); + + CV_Signature sig = CV_Signature_C13; + str8_serial_push_struct(arena, &srl, &sig); + + String8 corrupt_pch_path = str8_lit("corrupt-pch-file-path.obj"); + + CV_LeafPreComp precomp = { .start_index = CV_MinComplexTypeIndex, .count = 2, sig = b_sig }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(precomp) + corrupt_pch_path.size + 1); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PRECOMP); + str8_serial_push_struct(arena, &srl, &precomp); + str8_serial_push_cstr(arena, &srl, corrupt_pch_path); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + CV_LeafPointer ptr = { .itype = CV_BasicType_VOID }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafPointer)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_POINTER); + str8_serial_push_struct(arena, &srl, &ptr); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + CV_LeafProcedure proc = { .ret_itype = 0x1000, .call_kind = CV_CallKind_NearC }; + str8_serial_push_u16(arena, &srl, sizeof(CV_LeafKind) + sizeof(CV_LeafProcedure)); + str8_serial_push_u16(arena, &srl, CV_LeafKind_PROCEDURE); + str8_serial_push_struct(arena, &srl, &proc); + str8_serial_push_align(arena, &srl, CV_LeafAlign); + + b_debug_t = str8_serial_end(arena, &srl); + } + + String8 a_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_p", ".debug$P", a_debug_p, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", a_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); + + String8 b_obj = t_coff_from_def_obj(arena, (T_COFF_DefObj){ + .machine = T_COFF_DefSetMachine(X64), + .sections = (T_COFF_DefSection[]){ + { "debug_t", ".debug$T", b_debug_t, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + { "debug_s", ".debug$S", b_debug_s, .flags = "r:data@1", .raw_flags = COFF_SectionFlag_MemDiscardable }, + {0} + } + }); + + T_Ok(write_data_to_file_path(a_obj_file_path, a_obj)); + T_Ok(write_data_to_file_path(b_obj_file_path, b_obj)); + T_Ok(t_write_entry_obj()); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:full /rad_type_server:foo.rrt a.obj b.obj entry.obj"); + T_Ok(g_last_exit_code == 0); + + t_invoke_linkerf("/subsystem:console /entry:entry /out:a.exe /debug:ghash a.obj foo.rrt b.obj entry.obj"); + T_Ok(g_last_exit_code == 0); +} + TEST(debug_p_and_debug_t_in_obj) { U32 pch_sig = 0xCAFEBABE; From 267b8fc51908548fc387eff6421ee118a9127d96 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 15 Jun 2026 13:55:22 -0700 Subject: [PATCH 804/850] missing count in the range list concat --- src/base/base_math.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/base/base_math.c b/src/base/base_math.c index c80a5360..feb962f7 100644 --- a/src/base/base_math.c +++ b/src/base/base_math.c @@ -758,6 +758,7 @@ rng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat) list->first = to_concat->first; list->last = to_concat->last; } + list->count += to_concat->count; MemoryZeroStruct(to_concat); } } From b8bad9a82ee3674aec4c97312b570d9d704eaeeb Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 15 Jun 2026 14:10:09 -0700 Subject: [PATCH 805/850] range helper that computes max part from min+size --- src/base/base_math.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/base/base_math.h b/src/base/base_math.h index ef219305..6d93ea40 100644 --- a/src/base/base_math.h +++ b/src/base/base_math.h @@ -569,6 +569,7 @@ internal Mat4x4F32 transpose_4x4f32(Mat4x4F32 mat); //~ rjf: Range Ops #define r1u8(min, max) rng_1u8((min), (max)) +#define r1u8s(min, size) rng_1u8((min), (min)+(size)) internal Rng1U8 rng_1u8(U8 min, U8 max); internal Rng1U8 shift_1u8(Rng1U8 r, U8 x); internal Rng1U8 pad_1u8(Rng1U8 r, U8 x); @@ -580,6 +581,7 @@ internal Rng1U8 intersect_1u8(Rng1U8 a, Rng1U8 b); internal U8 clamp_1u8(Rng1U8 r, U8 v); #define r1u16(min, max) rng_1u16((min), (max)) +#define r1u16s(min, size) rng_1u16((min), (min)+(size)) internal Rng1U16 rng_1u16(U16 min, U16 max); internal Rng1U16 shift_1u16(Rng1U16 r, U16 x); internal Rng1U16 pad_1u16(Rng1U16 r, U16 x); @@ -591,6 +593,7 @@ internal Rng1U16 intersect_1u16(Rng1U16 a, Rng1U16 b); internal U16 clamp_1u16(Rng1U16 r, U16 v); #define r1u32(min, max) rng_1u32((min), (max)) +#define r1u32s(min, size) rng_1u32((min), (min)+(size)) internal Rng1U32 rng_1u32(U32 min, U32 max); internal Rng1U32 shift_1u32(Rng1U32 r, U32 x); internal Rng1U32 pad_1u32(Rng1U32 r, U32 x); @@ -602,6 +605,7 @@ internal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b); internal U32 clamp_1u32(Rng1U32 r, U32 v); #define r1s32(min, max) rng_1s32((min), (max)) +#define r1s32s(min,size) rng_1s32((min), (min)+(size)) internal Rng1S32 rng_1s32(S32 min, S32 max); internal Rng1S32 shift_1s32(Rng1S32 r, S32 x); internal Rng1S32 pad_1s32(Rng1S32 r, S32 x); @@ -613,6 +617,7 @@ internal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b); internal S32 clamp_1s32(Rng1S32 r, S32 v); #define r1u64(min, max) rng_1u64((min), (max)) +#define r1u64s(min, size) rng_1u64((min), (min)+(size)) internal Rng1U64 rng_1u64(U64 min, U64 max); internal Rng1U64 shift_1u64(Rng1U64 r, U64 x); internal Rng1U64 pad_1u64(Rng1U64 r, U64 x); @@ -624,6 +629,7 @@ internal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b); internal U64 clamp_1u64(Rng1U64 r, U64 v); #define r1s64(min, max) rng_1s64((min), (max)) +#define r1s64s(min, size) rng_1s64((min), (min)+(size)) internal Rng1S64 rng_1s64(S64 min, S64 max); internal Rng1S64 shift_1s64(Rng1S64 r, S64 x); internal Rng1S64 pad_1s64(Rng1S64 r, S64 x); @@ -635,6 +641,7 @@ internal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b); internal S64 clamp_1s64(Rng1S64 r, S64 v); #define r1f32(min, max) rng_1f32((min), (max)) +#define r1f32s(min, size) rng_1f32((min), (min)+(size)) internal Rng1F32 rng_1f32(F32 min, F32 max); internal Rng1F32 shift_1f32(Rng1F32 r, F32 x); internal Rng1F32 pad_1f32(Rng1F32 r, F32 x); @@ -646,6 +653,7 @@ internal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b); internal F32 clamp_1f32(Rng1F32 r, F32 v); #define r2s16(min, max) rng_2s16((min), (max)) +#define r2s16s(min, size) r2s16((min), (min)+(size)) #define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w))) internal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max); internal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x); @@ -658,6 +666,7 @@ internal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b); internal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v); #define r2s32(min, max) rng_2s32((min), (max)) +#define r2s32s(min, size) r2s32((min), (min)+(size)) #define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w))) internal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max); internal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x); @@ -670,6 +679,7 @@ internal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b); internal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v); #define r2s64(min, max) rng_2s64((min), (max)) +#define r2s64s(min, size) r2s64((min), (min)+(size)) #define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w))) internal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max); internal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x); @@ -682,6 +692,7 @@ internal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b); internal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v); #define r2f32(min, max) rng_2f32((min), (max)) +#define r2f32s(min, size) r2f32((min), (min)+(size)) #define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w))) internal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max); internal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x); From 11b3f25842c36b21d8a8aac75565f90ff7161dd2 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 16 Jun 2026 17:56:35 -0700 Subject: [PATCH 806/850] checkpoint on eval2 --- src/eval2/eval2.c | 2353 ++++++++++++++++++------------------ src/eval2/eval2.h | 25 +- src/scratch/ryan_scratch.c | 8 + 3 files changed, 1218 insertions(+), 1168 deletions(-) diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 4f1295aa..d581552a 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -1,1167 +1,1186 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -//////////////////////////////// -//~ rjf: Generated Code - -#include "eval2/generated/eval2.meta.c" - -//////////////////////////////// -//~ rjf: Space -> Memory Map Helpers - -internal void -e2_space_map_push(Arena *arena, E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 addr_range, void *data) -{ - if(map->slots_count == 0) - { - map->slots_count = 8; - map->slots = push_array(arena, E2_SpaceMapNode *, map->slots_count); - } - U64 hash = u64_hash_from_str8(str8_struct(&space_id)); - U64 slot_idx = hash%map->slots_count; - E2_SpaceMapNode *node = 0; - for(E2_SpaceMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) - { - if(n->space_id == space_id) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(arena, E2_SpaceMapNode, 1); - SLLStackPush(map->slots[slot_idx], node); - } - memory_map_push(arena, &node->memory_map, addr_range, data); -} - -internal U64 -e2_space_map_read(E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 addr_range, void *out) -{ - U64 result = 0; - { - U64 hash = u64_hash_from_str8(str8_struct(&space_id)); - U64 slot_idx = hash%map->slots_count; - E2_SpaceMapNode *node = 0; - for(E2_SpaceMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) - { - if(n->space_id == space_id) - { - node = n; - break; - } - } - if(node != 0) - { - result = memory_map_read(&node->memory_map, addr_range, out); - } - } - return result; -} - -//////////////////////////////// -//~ rjf: Name -> Expr Map Helpers - -internal void -e2_expr_map_push(Arena *arena, E2_ExprMap *map, String8 name, E2_Expr *expr) -{ - if(map->slots_count == 0) - { - map->slots_count = 8; - map->slots = push_array(arena, E2_ExprMapNode *, map->slots_count); - } - U64 hash = u64_hash_from_str8(name); - U64 slot_idx = hash%map->slots_count; - E2_ExprMapNode *node = 0; - for(E2_ExprMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->name, name, 0)) - { - node = n; - break; - } - } - if(node == 0) - { - node = push_array(arena, E2_ExprMapNode, 1); - node->name = str8_copy(arena, name); - node->expr = expr; - SLLStackPush(map->slots[slot_idx], node); - } -} - -internal E2_Expr * -e2_expr_from_name(E2_ExprMap *map, String8 name) -{ - E2_Expr *expr = &e2_expr_nil; - U64 hash = u64_hash_from_str8(name); - U64 slot_idx = hash%map->slots_count; - E2_ExprMapNode *node = 0; - for(E2_ExprMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->name, name, 0)) - { - node = n; - break; - } - } - if(node != 0) - { - expr = node->expr; - } - return expr; -} - -//////////////////////////////// -//~ rjf: Messages - -internal E2_Msg * -e2_msg(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, String8 string) -{ - E2_Msg *msg = push_array(arena, E2_Msg, 1); - SLLQueuePush(msgs->first, msgs->last, msg); - msgs->count += 1; - msg->src_range = src_range; - msg->string = str8_copy(arena, string); - return msg; -} - -internal E2_Msg * -e2_msgf(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, char *fmt, ...) -{ - Temp scratch = scratch_begin(&arena, 1); - va_list args; - va_start(args, fmt); - String8 string = str8fv(scratch.arena, fmt, args); - E2_Msg *msg = e2_msg(arena, msgs, src_range, string); - va_end(args); - scratch_end(scratch); - return msg; -} - -//////////////////////////////// -//~ rjf: Types - -internal E2_TypeKey -e2_type_key_basic(E2_TypeKind kind) -{ - E2_TypeKey key = {E2_TypeKeyKind_Basic}; - key.u32[0] = (U32)kind; - return key; -} - -//////////////////////////////// -//~ rjf: String -> Expression - -internal E2_Token -e2_token_from_string_off(String8 string, U64 start_off) -{ - E2_Token token = {E2_TokenKind_Null}; - B32 identifier_tick_mode = 0; - B32 comment_is_explicit_ender = 0; - B32 numeric_exponent = 0; - B32 escaped = 0; - B32 done = 0; - for(U64 off = start_off; !done && off <= string.size; off += 1) - { - U8 next_byte = (off < string.size ? string.str[off] : 0); - U8 next2_byte = (off+1 < string.size ? string.str[off+1] : 0); - U8 next3_byte = (off+2 < string.size ? string.str[off+2] : 0); - switch(token.kind) - { - //- rjf: no set token kind => look for starters - default: - { - if(next_byte == 0) - { - done = 1; - } - else if(next_byte <= 32) - { - token.kind = E2_TokenKind_Whitespace; - token.range.min = token.range.max = off; - } - else if(next_byte == '$' || next_byte == '_' || next_byte == '`' || - ('A' <= next_byte && next_byte <= 'Z') || - ('a' <= next_byte && next_byte <= 'z')) - { - token.kind = E2_TokenKind_Identifier; - token.range.min = token.range.max = off; - identifier_tick_mode = (next_byte == '`'); - } - else if(('0' <= next_byte && next_byte <= '9') || - (next_byte == '.' && '0' <= next2_byte && next2_byte <= '9')) - { - token.kind = E2_TokenKind_Numeric; - token.range.min = token.range.max = off; - } - else if(next_byte == '\'') - { - token.kind = E2_TokenKind_CharLiteral; - token.range.min = token.range.max = off; - } - else if(next_byte == '"') - { - token.kind = E2_TokenKind_StringLiteral; - token.range.min = token.range.max = off; - } - else if(next_byte == '/' && next2_byte == '/') - { - token.kind = E2_TokenKind_Comment; - token.range.min = token.range.max = off; - } - else if(next_byte == '/' && next2_byte == '*') - { - token.kind = E2_TokenKind_Comment; - token.range.min = token.range.max = off; - comment_is_explicit_ender = 1; - } - else if(next_byte == '~' || next_byte == '!' || next_byte == '%' || - next_byte == '^' || next_byte == '&' || next_byte == '*' || - next_byte == '(' || next_byte == ')' || next_byte == '[' || - next_byte == ']' || next_byte == '{' || next_byte == '}' || - next_byte == '-' || next_byte == '=' || next_byte == '+' || - next_byte == ':' || next_byte == ';' || next_byte == ',' || - next_byte == '.' || next_byte == '<' || next_byte == '>' || - next_byte == '/' || next_byte == '?' || next_byte == '#' || - next_byte == '@' || next_byte == '|') - { - token.kind = E2_TokenKind_Symbol; - token.range.min = token.range.max = off; - } - }break; - - //- rjf: active tokens -> seek enders - case E2_TokenKind_Whitespace: - if(next_byte > 32) - { - done = 1; - }break; - case E2_TokenKind_Comment: - if(comment_is_explicit_ender && next_byte == '*' && next2_byte == '/') - { - done = 1; - token.range.max = off+2; - }break; - case E2_TokenKind_Identifier: - { - if(identifier_tick_mode && (next_byte == '`' || next_byte == '\'')) - { - identifier_tick_mode = 0; - } - else if(!identifier_tick_mode && - (next_byte < 'a' || 'z' < next_byte) && - (next_byte < 'A' || 'Z' < next_byte) && - (next_byte < '0' || '9' < next_byte) && - next_byte != '$' && - next_byte != '_' && - next_byte != '@') - { - done = 1; - token.range.max = off; - } - }break; - case E2_TokenKind_Numeric: - { - if(numeric_exponent && (next_byte == '+' || next_byte == '-')){} - else if((next_byte < 'a' || 'z' < next_byte) && - (next_byte < 'A' || 'Z' < next_byte) && - (next_byte < '0' || '9' < next_byte) && - next_byte != '.' && - next_byte != ':') - { - done = 1; - token.range.max = off; - } - else - { - numeric_exponent = (next_byte == 'e'); - } - }break; - case E2_TokenKind_Symbol: - if(next_byte != '~' && next_byte != '!' && next_byte != '%' && - next_byte != '^' && next_byte != '&' && next_byte != '*' && - next_byte != '(' && next_byte != ')' && next_byte != '[' && - next_byte != ']' && next_byte != '{' && next_byte != '}' && - next_byte != '-' && next_byte != '=' && next_byte != '+' && - next_byte != ':' && next_byte != ';' && next_byte != ',' && - next_byte != '.' && next_byte != '<' && next_byte != '>' && - next_byte != '/' && next_byte != '?' && next_byte != '#' && - next_byte != '@' && next_byte != '|') - { - done = 1; - token.range.max = off; - }break; - case E2_TokenKind_CharLiteral: - case E2_TokenKind_StringLiteral: - { - if(!escaped && next_byte == '\\') - { - escaped = 1; - } - else if(escaped) - { - escaped = 0; - } - else if(!escaped && ((next_byte == '"' && token.kind == E2_TokenKind_StringLiteral) || - (next_byte == '\'' && token.kind == E2_TokenKind_CharLiteral))) - { - done = 1; - token.range.max = off+1; - } - }break; - } - if(token.range.max > off+1) - { - off += (token.range.max - (off+1)); - } - if(!done && off == string.size) - { - done = 1; - token.range.max = off; - } - } - return token; -} - -internal U64 -e2_read_token(String8 string, U64 off, E2_Token *token_out) -{ - E2_Token token = e2_token_from_string_off(string, off); - if(token_out != 0) - { - token_out[0] = token; - } - U64 result = dim_1u64(token.range); - return result; -} - -internal B32 -e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out) -{ - B32 result = 0; - U64 off = off_out[0]; - for(;;) - { - E2_Token next_token = {E2_TokenKind_Null}; - off += e2_read_token(string, off, &next_token); - if(next_token.kind == kind && (expected_string.size == 0 || str8_match(str8_substr(string, next_token.range), expected_string, 0))) - { - result = 1; - if(token_out != 0) - { - token_out[0] = next_token; - } - break; - } - else if(next_token.kind != E2_TokenKind_Comment && next_token.kind != E2_TokenKind_Whitespace) - { - break; - } - } - if(result && off_out != 0) - { - off_out[0] = off; - } - return result; -} - -internal E2_Parse -e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string) -{ - U64 off = state->string_off; - E2_Parse parse = {E2_Status_Error, .expr = &e2_expr_nil, .access_expr = &e2_expr_nil}; - - //- rjf: parse & attach to top parsing task - if we don't have a top task - // then it is just the result - for(B32 done = 0; !done;) - { - S64 max_precedence = state->top_task ? state->top_task->max_precedence : max_S64; - E2_Expr *expr = &e2_expr_nil; - E2_Token token = {0}; - - //- rjf: nested sub-expressions - if(e2_try_token(string, E2_TokenKind_Symbol, s("("), &off, 0)) - { - E2_ParseTask *task = state->free_task; - if(task != 0) - { - SLLStackPop(state->free_task); - } - else - { - task = push_array(arena, E2_ParseTask, 1); - } - task->parent = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(task->parent, &e2_expr_nil); - task->expected_closer = s(")"); - task->child_count_target = 1; - task->max_precedence = max_S64; - SLLStackPush(state->top_task, task); - } - - //- rjf: prefix unaries - else if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token)) - { - // rjf: string -> operator kind - E2_OpKind op_kind = E2_OpKind_Null; - { - String8 token_string = str8_substr(string, token.range); - for EachNonZeroEnumVal(E2_OpKind, k) - { - if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_UnaryPrefix && - e2_op_kind_info_table[k].precedence <= max_precedence && - str8_match(token_string, e2_op_kind_info_table[k].pre, 0)) - { - op_kind = k; - break; - } - } - } - - // rjf: push task for operand - if(op_kind != E2_OpKind_Null) - { - E2_ParseTask *task = state->free_task; - if(task != 0) - { - SLLStackPop(state->free_task); - } - else - { - task = push_array(arena, E2_ParseTask, 1); - } - task->parent = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(task->parent, &e2_expr_nil); - task->child_count_target = 1; - task->op_kind = op_kind; - task->max_precedence = e2_op_kind_info_table[op_kind].precedence; - SLLStackPush(state->top_task, task); - } - } - - //- rjf: leaf identifiers - else if(e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token)) - { - String8 identifier = str8_substr(string, token.range); - expr = e2_expr_from_name(expr_map, identifier); - if(expr == &e2_expr_nil) - { - done = 1; - parse.status = E2_Status_MissedIdentifierResolution; - parse.missed_identifier = identifier; - } - } - - //- rjf: leaf numerics - else if(e2_try_token(string, E2_TokenKind_Numeric, s(""), &off, &token)) - { - String8 numeric_string = str8_substr(string, token.range); - expr = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(expr, &e2_expr_nil); - U64 dot_pos = str8_find_needle(numeric_string, 0, s("."), 0); - B32 f_suffix = str8_match(str8_postfix(numeric_string, 1), s("f"), 0); - U64 colon_pos = str8_find_needle(numeric_string, 0, s(":"), 0); - if(dot_pos < numeric_string.size && f_suffix) - { - expr->val.f32 = (F32)f64_from_str8(numeric_string); - expr->type_key = e2_type_key_basic(E2_TypeKind_F32); - } - else if(dot_pos < numeric_string.size && !f_suffix) - { - expr->val.f64 = f64_from_str8(numeric_string); - expr->type_key = e2_type_key_basic(E2_TypeKind_F64); - } - else if(colon_pos < numeric_string.size) - { - Temp scratch = scratch_begin(&arena, 1); - String8List parts = str8_split(scratch.arena, numeric_string, (U8 *)":", 1, 0); - U64 u64_idx = 0; - for EachNode(n, String8Node, parts.first) - { - if(u64_idx >= ArrayCount(expr->val.u512.u64)) - { - break; - } - try_u64_from_str8_c_rules(n->string, &expr->val.u512.u64[u64_idx]); - u64_idx += 1; - } - switch(u64_idx) - { - case 1:{expr->op = RDI_EvalOp_ConstU64; expr->type_key = e2_type_key_basic(E2_TypeKind_U64);}break; - case 2:{expr->op = RDI_EvalOp_ConstU128; expr->type_key = e2_type_key_basic(E2_TypeKind_U128);}break; - case 4:{expr->op = RDI_EvalOp_ConstU256; expr->type_key = e2_type_key_basic(E2_TypeKind_U256);}break; - case 8:{expr->op = RDI_EvalOp_ConstU512; expr->type_key = e2_type_key_basic(E2_TypeKind_U512);}break; - default: - { - e2_msgf(arena, &parse.msgs, token.range, "Invalid number of numeric portions specified (%I64u; must be 2, 4, or 8).", u64_idx); - }break; - } - scratch_end(scratch); - } - else if(try_u64_from_str8_c_rules(numeric_string, &expr->val.u64)) - { - if(expr->val.u64 <= 0xff) - { - expr->op = RDI_EvalOp_ConstU8; - expr->type_key = e2_type_key_basic(E2_TypeKind_U8); - } - else if(expr->val.u64 <= 0xffff) - { - expr->op = RDI_EvalOp_ConstU16; - expr->type_key = e2_type_key_basic(E2_TypeKind_U16); - } - else if(expr->val.u64 <= 0xffffffff) - { - expr->op = RDI_EvalOp_ConstU32; - expr->type_key = e2_type_key_basic(E2_TypeKind_U32); - } - else - { - expr->op = RDI_EvalOp_ConstU64; - expr->type_key = e2_type_key_basic(E2_TypeKind_U64); - } - } - } - - //- rjf: extend parsed expression tree with trailing binary operators - if(expr != &e2_expr_nil) - { - U64 trailing_symbol_off = off; - if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &trailing_symbol_off, &token)) - { - // rjf: token string -> operator kind - E2_OpKind op_kind = E2_OpKind_Null; - { - String8 token_string = str8_substr(string, token.range); - for EachNonZeroEnumVal(E2_OpKind, k) - { - if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_Binary && - e2_op_kind_info_table[k].precedence <= max_precedence && - str8_match(token_string, e2_op_kind_info_table[k].pre, 0)) - { - op_kind = k; - break; - } - } - } - - // rjf: non-null operator kind -> build binary expression node, push task to fill other child - if(op_kind != E2_OpKind_Null) - { - E2_ParseTask *task = state->free_task; - if(task != 0) - { - SLLStackPop(state->free_task); - } - else - { - task = push_array(arena, E2_ParseTask, 1); - } - task->parent = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(task->parent, &e2_expr_nil); - SLLQueuePush_NZ(&e2_expr_nil, task->parent->first, task->parent->last, expr, next); - task->child_count = 1; - task->child_count_target = 2; - task->op_kind = op_kind; - task->max_precedence = e2_op_kind_info_table[op_kind].precedence; - SLLStackPush(state->top_task, task); - } - } - } - - //- rjf: attach formed expressions to parent task exprs; pop tasks when they're done. - // if we have no parent task, then we just fill the result, and we're done with the parse. - if(expr != &e2_expr_nil) - { - //- rjf: pop finished expressions - E2_Expr *finished_expr = expr; - for(;state->top_task != 0;) - { - //- rjf: add finished expression to current parent; increase task child count - E2_Expr *finished_expr_parent = state->top_task->parent; - SLLQueuePush_NZ(&e2_expr_nil, finished_expr_parent->first, finished_expr_parent->last, finished_expr, next); - state->top_task->child_count += 1; - - //- rjf: task child count hits limit -> complete this child - if(state->top_task->child_count >= state->top_task->child_count_target) - { - //- rjf: release task; iterate to this finished expression next - E2_ParseTask *completed_task = state->top_task; - SLLStackPop(state->top_task); - SLLStackPush(state->free_task, completed_task); - - //- rjf: finish expression with operator info, if applicable - { - E2_Expr *root = completed_task->parent; - switch(completed_task->op_kind) - { - default:{}break; - - //- rjf: dereference - case E2_OpKind_Deref: - { - // rjf: unpack operand - E2_Expr *rhs = root->first; - // E2_TypeKey rhs_type_key = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_AllDecorative & ~E2_TypeUnwrapFlag_Enums); - // E2_TypeKind rhs_type_kind = e2_type_kind_from_key(rhs_type_key); - // E2_TypeKey dereferenced_type = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_All & ~E2_TypeUnwrapFlag_Enums); - // U64 dereferenced_type_size = e2_byte_size_from_type_key(dereferenced_type); - - // rjf: collect info about malformed situations - B32 malformed = 0; - // if(dereferenced_type_size == 0 && e2_type_kind_is_ptr_or_ref(rhs_type_kind)) - { - malformed = 1; - // e2_msgf(arena, &parse.msgs, src->root_range, ""); - } - }break; - - case E2_OpKind_Address:{}break; - case E2_OpKind_Pos:{}break; - case E2_OpKind_Neg:{}break; - case E2_OpKind_LogNot:{}break; - case E2_OpKind_BitNot:{}break; - case E2_OpKind_Mul:{}break; - case E2_OpKind_Div:{}break; - case E2_OpKind_Mod:{}break; - case E2_OpKind_Add:{}break; - case E2_OpKind_Sub:{}break; - case E2_OpKind_LShift:{}break; - case E2_OpKind_RShift:{}break; - case E2_OpKind_Less:{}break; - case E2_OpKind_LtEq:{}break; - case E2_OpKind_Grtr:{}break; - case E2_OpKind_GrEq:{}break; - case E2_OpKind_EqEq:{}break; - case E2_OpKind_NtEq:{}break; - case E2_OpKind_BitAnd:{}break; - case E2_OpKind_BitXor:{}break; - case E2_OpKind_BitOr:{}break; - case E2_OpKind_LogAnd:{}break; - case E2_OpKind_LogOr:{}break; - case E2_OpKind_Define:{}break; - } - } - - //- rjf: iterate to the completed task's expression node next, to try & finish it for *its* parent - finished_expr = completed_task->parent; - } - } - - //- rjf: for the last finished expression, if we do not have any further tasks, - // this is our result. - if(finished_expr != &e2_expr_nil && state->top_task == 0) - { - parse.expr = finished_expr; - if(parse.status == E2_Status_Error) - { - parse.status = E2_Status_Good; - } - break; - } - } - } - - //- rjf: advance offset if successful - if(parse.status == E2_Status_Good) - { - state->string_off = off; - } - return parse; -} - -//////////////////////////////// -//~ rjf: Expression -> Bytecode - -internal String8 -e2_bytecode_from_expr(Arena *arena, E2_Expr *expr) -{ - -} - -//////////////////////////////// -//~ rjf: Bytecode -> Result - -internal E2_Interp -e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_map, String8 bytecode) -{ - E2_Interp interp = {E2_Status_Error}; - { - U64 off = state->bytecode_off; - U64 off_opl = bytecode.size; - B32 done = 0; - B32 good = 1; - for(;off < off_opl && !done && good;) - { - Temp scratch = scratch_begin(&arena, 1); - U64 start_off = off; - - //- rjf: read next opcode - RDI_EvalOp op = 0; - off += str8_deserial_read_struct(bytecode, off, &op); - - //- rjf: opcode -> ctrl bits - U16 ctrlbits = 0; - switch(op) - { - default: - if(op < RDI_EvalOp_COUNT) - { - ctrlbits = rdi_eval_op_ctrlbits_table[op]; - }break; - case E2_EvalOp_SetCtxID:{ctrlbits = RDI_EVAL_CTRLBITS(8, 0, 0);}break; - } - - //- rjf: ctrlbits -> push/pop/decode count - U64 decode_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); - U64 push_count = RDI_PUSHN_FROM_CTRLBITS(ctrlbits); - U64 pop_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); - - //- rjf: do extra decode - String8 decode_data = str8_substr(bytecode, r1u64(off, off+decode_size)); - E2_Val decode_val = {0}; - MemoryCopy(&decode_val, decode_data.str, Min(sizeof(decode_val), decode_data.size)); - RDI_EvalTypeGroup type_group = (RDI_EvalTypeGroup)decode_val.u512.u8[0]; - U64 op_arithmetic_size = (U64)decode_val.u512.u8[1]; - off += decode_size; - - //- rjf: prepare popped stack values & to-push stack values - E2_Val *popped_vals = push_array(scratch.arena, E2_Val, pop_count); - E2_Val *push_vals = push_array(scratch.arena, E2_Val, push_count); - { - E2_InterpStackValNode *node = state->top_val; - for(U64 pop_idx = 0; node != 0 && pop_idx < pop_count; pop_idx += 1, node = node->next) - { - popped_vals[pop_idx] = node->val; - } - } - - //- rjf: do opcode - E2_CtxFlags ctx_flags = 0; - U64 ctx_base_addr = 0; - switch(op) - { - default:{}break; - - case E2_EvalOp_SetCtxID: - { - interp.status = E2_Status_NewCtxID; - interp.ctx_id = decode_val.u64; - }break; - - case RDI_EvalOp_Stop: - { - done = 1; - }break; - case RDI_EvalOp_Noop:{}break; - case RDI_EvalOp_Cond: - if(popped_vals[0].u64 != 0) - { - off += decode_val.u64; - }break; - case RDI_EvalOp_Skip: - { - off += decode_val.u64; - }break; - case RDI_EvalOp_MemRead: - { - U64 addr = popped_vals[0].u64; - U64 size = decode_val.u64; - Rng1U64 space_addr_range = r1u64(addr, addr+size); - void *read_dst = &push_vals[0]; - if(size > sizeof(push_vals[0].u512)) - { - read_dst = push_array(arena, U8, size); - } - U64 read_size = e2_space_map_read(space_map, state->selected_ctx.space_id, space_addr_range, read_dst); - arena_pop(arena, size - read_size); - push_vals[0].string = str8(read_dst, read_size); - if(read_size != size) - { - good = 0; - interp.status = E2_Status_MissedSpaceRead; - interp.missed_read_space_addr_range = space_addr_range; - } - }break; - case RDI_EvalOp_RegRead: - { - U8 rdi_reg_code = (decode_val.u64&0x0000FF)>>0; - U8 byte_size = (decode_val.u64&0x00FF00)>>8; - U8 byte_off = (decode_val.u64&0xFF0000)>>16; - Arch arch = state->selected_ctx.arch; - ARCH_Info *arch_info = arch_info_from_arch(arch); - ARCH_RegCode base_reg_code = arch_reg_code_from_rdi(arch, rdi_reg_code); - if(0 <= base_reg_code && base_reg_code < arch_info->reg_code_count) - { - Rng1U16 reg_rng = arch_info->reg_code_rng_table[base_reg_code]; - U64 off = (U64)reg_rng.min + byte_off; - U64 size = (U64)byte_size; - Rng1U64 space_addr_range = r1u64(off, off+size); - U64 read_size = e2_space_map_read(space_map, state->selected_ctx.reg_space_id, space_addr_range, &push_vals[0]); - if(read_size != size) - { - good = 0; - interp.status = E2_Status_MissedSpaceRead; - interp.missed_read_space_addr_range = space_addr_range; - } - } - else - { - good = 0; - interp.status = E2_Status_BadRegCode; - } - }break; - case RDI_EvalOp_FrameOff: {ctx_flags = E2_CtxFlag_HasFrameBase; ctx_base_addr = state->selected_ctx.frame_base_addr;}goto optional_base_off; - case RDI_EvalOp_ModuleOff: {ctx_flags = E2_CtxFlag_HasModuleBase; ctx_base_addr = state->selected_ctx.module_base_addr;}goto optional_base_off; - case RDI_EvalOp_TLSOff: {ctx_flags = E2_CtxFlag_HasTLSBase; ctx_base_addr = state->selected_ctx.tls_base_addr;}goto optional_base_off; - case RDI_EvalOp_PushCfa: {ctx_flags = E2_CtxFlag_HasCFA; ctx_base_addr = state->selected_ctx.cfa_addr;}goto optional_base_off; - optional_base_off:; - { - if(state->selected_ctx.flags & ctx_flags) - { - push_vals[0].u64 = ctx_base_addr + decode_val.u64; - } - else - { - good = 0; - interp.status = E2_Status_MissingCtxFlag; - interp.missing_ctx_flags |= ctx_flags; - } - }break; - - case RDI_EvalOp_ConstU8: - case RDI_EvalOp_ConstU16: - case RDI_EvalOp_ConstU32: - case RDI_EvalOp_ConstU64: - case RDI_EvalOp_ConstU128: - { - push_vals[0] = decode_val; - }break; - - case RDI_EvalOp_ConstString: - { - U64 string_size = decode_val.u64; - String8 string = str8_substr(bytecode, r1u64(off, off+string_size)); - off += string_size; - push_vals[0].string = string; - }break; - - case RDI_EvalOp_Abs: - { - if(0){} -#define CaseA(target_type_group, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].target_type = (popped_vals[0].target_type < 0 ? -popped_vals[0].target_type : +popped_vals[0].target_type);}while(0) -#define CaseB(target_type_group, size, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].target_type = (popped_vals[0].target_type < 0 ? -popped_vals[0].target_type : +popped_vals[0].target_type);}while(0) - CaseA(F32, f32); - CaseA(F64, f64); - CaseB(S, 8, s8); - CaseB(S, 16, s16); - CaseB(S, 32, s32); - CaseB(S, 64, s64); - else { MemoryCopyStruct(&push_vals[0], &popped_vals[0]); } -#undef CaseA -#undef CaseB - }break; - - case RDI_EvalOp_Neg: - { - if(0){} -#define CaseA(target_type_group, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].target_type = (-popped_vals[0].target_type);}while(0) -#define CaseB(target_type_group, size, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].target_type = (-popped_vals[0].target_type);}while(0) - CaseA(F32, f32); - CaseA(F64, f64); - CaseB(S, 8, s8); - CaseB(S, 16, s16); - CaseB(S, 32, s32); - CaseB(S, 64, s64); - else { MemoryCopyStruct(&push_vals[0], &popped_vals[0]); } -#undef CaseA -#undef CaseB - }break; - -#define BinOp(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type;}while(0) -#define SizedBinOp(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type;}while(0) -#define BinOpDiv(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) -#define SizedBinOpDiv(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) -#define BinOpDivFn(target_type_group, dst_type, src_type, fn) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = fn(popped_vals[1].src_type, popped_vals[0].src_type); } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) -#define ArithTypeCasesInt(symbol)\ -SizedBinOp(S, 8, s8, s8, symbol);\ -SizedBinOp(S, 16, s16, s16, symbol);\ -SizedBinOp(S, 32, s32, s32, symbol);\ -SizedBinOp(S, 64, s64, s64, symbol);\ -SizedBinOp(U, 8, u8, u8, symbol);\ -SizedBinOp(U, 16, u16, u16, symbol);\ -SizedBinOp(U, 32, u32, u32, symbol);\ -SizedBinOp(U, 64, u64, u64, symbol); -#define ArithTypeCasesIntDiv(symbol)\ -SizedBinOpDiv(S, 8, s8, s8, symbol);\ -SizedBinOpDiv(S, 16, s16, s16, symbol);\ -SizedBinOpDiv(S, 32, s32, s32, symbol);\ -SizedBinOpDiv(S, 64, s64, s64, symbol);\ -SizedBinOpDiv(U, 8, u8, u8, symbol);\ -SizedBinOpDiv(U, 16, u16, u16, symbol);\ -SizedBinOpDiv(U, 32, u32, u32, symbol);\ -SizedBinOpDiv(U, 64, u64, u64, symbol); -#define LogTypeCases(symbol)\ -BinOp(F32, u64, f32, symbol);\ -BinOp(F64, u64, f64, symbol);\ -ArithTypeCasesInt(symbol) -#define ArithTypeCases(symbol)\ -BinOp(F32, f32, f32, symbol);\ -BinOp(F64, f64, f64, symbol);\ -ArithTypeCasesInt(symbol) -#define ArithTypeCasesDiv(symbol)\ -BinOpDiv(F32, f32, f32, symbol);\ -BinOpDiv(F64, f64, f64, symbol);\ -ArithTypeCasesIntDiv(symbol) -#define ArithTypeCasesIntAllU64(symbol)\ -BinOp(S, u64, u64, symbol);\ -BinOp(U, u64, u64, symbol); -#define Case(name, ...) case RDI_EvalOp_##name:{if(0){} __VA_ARGS__ else {interp.status = E2_Status_BadOpTypes; good = 0;}}break - Case(Add, ArithTypeCases(+)); - Case(Sub, ArithTypeCases(-)); - Case(Mul, ArithTypeCases(*)); - Case(Div, ArithTypeCasesDiv(/)); - Case(Mod, ArithTypeCasesIntDiv(%) BinOpDivFn(F32, f32, f32, mod_f32); BinOpDivFn(F64, f64, f64, mod_f64);); - Case(LShift, ArithTypeCasesInt(<<)); - Case(RShift, ArithTypeCasesInt(>>)); - Case(BitAnd, ArithTypeCasesIntAllU64(&)); - Case(BitOr, ArithTypeCasesIntAllU64(|)); - Case(BitXor, ArithTypeCasesIntAllU64(^)); - Case(LogAnd, ArithTypeCasesIntAllU64(&&)); - Case(LogOr, ArithTypeCasesIntAllU64(||)); - Case(LsEq, LogTypeCases(<=)); - Case(GrEq, LogTypeCases(>=)); - Case(Less, LogTypeCases(<)); - Case(Grtr, LogTypeCases(>)); -#undef Case -#undef BinOp -#undef SizedBinOp -#undef BinOpDiv -#undef SizedBinOpDiv -#undef BinOpDivFn -#undef ArithTypeCasesInt -#undef ArithTypeCasesIntDiv -#undef ArithTypeCases -#undef ArithTypeCasesDiv -#undef ArithTypeCasesIntAllU64 - - case RDI_EvalOp_EqEq: - case RDI_EvalOp_NtEq: - { - if(popped_vals[0].string.size != 0 && popped_vals[1].string.size != 0) - { - push_vals[0].u64 = str8_match(popped_vals[0].string, popped_vals[1].string, 0); - } - else - { - push_vals[0].u64 = MemoryMatchStruct(&popped_vals[0].u512, &popped_vals[1].u512); - } - if(op == RDI_EvalOp_NtEq) - { - push_vals[0].u64 = !push_vals[0].u64; - } - }break; - - case RDI_EvalOp_Trunc: - { - if(0 < decode_val.u64) - { - U64 mask = 0; - if(decode_val.u64 < 64) - { - mask = max_U64 >> (64 - decode_val.u64); - } - push_vals[0].u64 = popped_vals[0].u64&mask; - } - }break; - - case RDI_EvalOp_TruncSigned: - { - if(0 < decode_val.u64) - { - U64 mask = 0; - if(decode_val.u64 < 64) - { - mask = max_U64 >> (64 - decode_val.u64); - } - U64 high = 0; - if(popped_vals[0].u64 & (1 << (decode_val.u64 - 1))) - { - high = ~mask; - } - push_vals[0].u64 = high|(popped_vals[0].u64&mask); - } - }break; - - case RDI_EvalOp_Convert: - { - U32 in = decode_val.u64&0xFF; - U32 out = (decode_val.u64 >> 8)&0xFF; - if(in != 0) - { - switch(in + out*RDI_EvalTypeGroup_COUNT) - { - default:{good = 0; interp.status = E2_Status_BadOpTypes;}break; -#define Case(dst_tg, dst_slot, dst_type, src_tg, src_slot) case RDI_EvalTypeGroup_##src_tg + RDI_EvalTypeGroup_##dst_tg*RDI_EvalTypeGroup_COUNT:{push_vals[0].dst_slot = (dst_type)popped_vals[0].src_slot;}break - Case(U, u64, U64, F32, f32); - Case(U, u64, U64, F64, f64); - Case(S, s64, S64, F32, f32); - Case(S, s64, S64, F64, f64); - Case(F32, f32, F32, S, s64); - Case(F64, f64, F64, S, s64); - Case(F32, f32, F32, U, u64); - Case(F64, f64, F64, U, u64); - Case(F32, f32, F32, F64, f64); - Case(F64, f64, F64, F32, f32); -#undef Case - } - } - }break; - - case RDI_EvalOp_Pick: - { - U64 target_idx = decode_val.u64; - U64 idx = 0; - B32 found = 0; - for(E2_InterpStackValNode *n = state->top_val; n != 0; n = n->next, idx += 1) - { - if(idx == target_idx) - { - found = 1; - push_vals[0] = n->val; - break; - } - } - if(!found) - { - good = 0; - interp.status = E2_Status_InsufficientStackSpace; - } - }break; - - case RDI_EvalOp_Swap: - { - push_vals[0] = popped_vals[1]; - push_vals[1] = popped_vals[0]; - }break; - - case RDI_EvalOp_Pop:{NoOp;}break; - - case RDI_EvalOp_ValueRead: - { - U64 bytes_to_read = decode_val.u64; - U64 offset = popped_vals[0].u64; - if(offset + bytes_to_read <= popped_vals[1].string.size) - { - MemoryCopy(&push_vals[0].u512, popped_vals[1].string.str + offset, bytes_to_read); - } - else - { - good = 0; - interp.status = E2_Status_BadOffset; - } - }break; - - case RDI_EvalOp_ByteSwap: - { - U64 byte_size = decode_val.u64; - switch(byte_size) - { - default: - { - good = 0; - interp.status = E2_Status_UnsupportedOp; - }break; - case 2:{push_vals[0].u16 = bswap_u16(popped_vals[0].u16);}break; - case 4:{push_vals[0].u32 = bswap_u32(popped_vals[0].u32);}break; - case 8:{push_vals[0].u64 = bswap_u64(popped_vals[0].u64);}break; - } - }break; - - case RDI_EvalOp_CallSiteValue: - { - // DW_OP_entry_value: requires evaluating the embedded sub-bytecode - // in this frame's entry-time register state (i.e. caller's state - // at the call instruction). that state is not currently plumbed - // into the eval context. interpreting in the current ctx gives - // wrong values for spilled args, so report BadOp instead. - // skip past the embedded sub-bytecode in the outer stream so the - // bytes are not interpreted as outer ops on resume. - good = 0; - interp.status = E2_Status_UnsupportedOp; - }break; - - case RDI_EvalOp_PartialValue: - { - // DW_OP_piece marker: top-of-stack is a piece of a composite value. - // we do not assemble composites; for single-piece expressions the - // value already on the stack is the result. for multi-piece, only - // the first piece is returned (stack[0] is the final result). - good = 0; - interp.status = E2_Status_UnsupportedOp; - }break; - - case RDI_EvalOp_PartialValueBit: - { - // DW_OP_bit_piece marker. same caveat as PartialValue. - good = 0; - interp.status = E2_Status_UnsupportedOp; - }break; - } - - //- rjf: if opcode successful -> do stack pops - if(good) for EachIndex(pop_idx, pop_count) - { - E2_InterpStackValNode *popped = state->top_val; - if(popped != 0) - { - SLLStackPop(state->top_val); - SLLStackPush(state->free_val, popped); - } - else - { - break; - } - } - - //- rjf: if opcode successful -> do stack pushes - if(good) for EachIndex(push_idx, push_count) - { - E2_InterpStackValNode *node = state->free_val; - if(node != 0) - { - SLLStackPop(state->free_val); - } - else - { - node = push_array(arena, E2_InterpStackValNode, 1); - } - node->val = push_vals[push_idx]; - SLLStackPush(state->top_val, node); - } - - //- rjf: if opcode successful -> commit new bytecode offset - if(good) - { - state->bytecode_off = off; - } - - scratch_end(scratch); - if(off == start_off) - { - break; - } - } - if(off == off_opl && good) - { - interp.status = E2_Status_Good; - if(state->top_val != 0) - { - interp.val = state->top_val->val; - } - } - } - return interp; -} +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Generated Code + +#include "eval2/generated/eval2.meta.c" + +//////////////////////////////// +//~ rjf: Space -> Memory Map Helpers + +internal void +e2_space_map_push(Arena *arena, E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 addr_range, void *data) +{ + if(map->slots_count == 0) + { + map->slots_count = 8; + map->slots = push_array(arena, E2_SpaceMapNode *, map->slots_count); + } + U64 hash = u64_hash_from_str8(str8_struct(&space_id)); + U64 slot_idx = hash%map->slots_count; + E2_SpaceMapNode *node = 0; + for(E2_SpaceMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + { + if(n->space_id == space_id) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(arena, E2_SpaceMapNode, 1); + SLLStackPush(map->slots[slot_idx], node); + } + memory_map_push(arena, &node->memory_map, addr_range, data); +} + +internal U64 +e2_space_map_read(E2_SpaceMap *map, E2_SpaceID space_id, Rng1U64 addr_range, void *out) +{ + U64 result = 0; + { + U64 hash = u64_hash_from_str8(str8_struct(&space_id)); + U64 slot_idx = hash%map->slots_count; + E2_SpaceMapNode *node = 0; + for(E2_SpaceMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + { + if(n->space_id == space_id) + { + node = n; + break; + } + } + if(node != 0) + { + result = memory_map_read(&node->memory_map, addr_range, out); + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Name -> Expr Map Helpers + +internal void +e2_expr_map_push(Arena *arena, E2_ExprMap *map, String8 name, E2_Expr *expr) +{ + if(map->slots_count == 0) + { + map->slots_count = 8; + map->slots = push_array(arena, E2_ExprMapNode *, map->slots_count); + } + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%map->slots_count; + E2_ExprMapNode *node = 0; + for(E2_ExprMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->name, name, 0)) + { + node = n; + break; + } + } + if(node == 0) + { + node = push_array(arena, E2_ExprMapNode, 1); + node->name = str8_copy(arena, name); + node->expr = expr; + SLLStackPush(map->slots[slot_idx], node); + } +} + +internal E2_Expr * +e2_expr_from_name(E2_ExprMap *map, String8 name) +{ + E2_Expr *expr = &e2_expr_nil; + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%map->slots_count; + E2_ExprMapNode *node = 0; + for(E2_ExprMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->name, name, 0)) + { + node = n; + break; + } + } + if(node != 0) + { + expr = node->expr; + } + return expr; +} + +//////////////////////////////// +//~ rjf: Messages + +internal E2_Msg * +e2_msg(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, String8 string) +{ + E2_Msg *msg = push_array(arena, E2_Msg, 1); + SLLQueuePush(msgs->first, msgs->last, msg); + msgs->count += 1; + msg->src_range = src_range; + msg->string = str8_copy(arena, string); + return msg; +} + +internal E2_Msg * +e2_msgf(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, char *fmt, ...) +{ + Temp scratch = scratch_begin(&arena, 1); + va_list args; + va_start(args, fmt); + String8 string = str8fv(scratch.arena, fmt, args); + E2_Msg *msg = e2_msg(arena, msgs, src_range, string); + va_end(args); + scratch_end(scratch); + return msg; +} + +//////////////////////////////// +//~ rjf: Type Keys + +internal E2_TypeKey +e2_type_key_basic(E2_TypeKind kind) +{ + E2_TypeKey key = {E2_TypeKeyKind_Basic}; + key.u32[0] = (U32)kind; + return key; +} + +//////////////////////////////// +//~ rjf: String -> Expression + +internal E2_Token +e2_token_from_string_off(String8 string, U64 start_off) +{ + E2_Token token = {E2_TokenKind_Null}; + B32 identifier_tick_mode = 0; + B32 comment_is_explicit_ender = 0; + B32 numeric_exponent = 0; + B32 escaped = 0; + B32 done = 0; + for(U64 off = start_off; !done && off <= string.size; off += 1) + { + U8 next_byte = (off < string.size ? string.str[off] : 0); + U8 next2_byte = (off+1 < string.size ? string.str[off+1] : 0); + U8 next3_byte = (off+2 < string.size ? string.str[off+2] : 0); + switch(token.kind) + { + //- rjf: no set token kind => look for starters + default: + { + if(next_byte == 0) + { + done = 1; + } + else if(next_byte <= 32) + { + token.kind = E2_TokenKind_Whitespace; + token.range.min = token.range.max = off; + } + else if(next_byte == '$' || next_byte == '_' || next_byte == '`' || + ('A' <= next_byte && next_byte <= 'Z') || + ('a' <= next_byte && next_byte <= 'z')) + { + token.kind = E2_TokenKind_Identifier; + token.range.min = token.range.max = off; + identifier_tick_mode = (next_byte == '`'); + } + else if(('0' <= next_byte && next_byte <= '9') || + (next_byte == '.' && '0' <= next2_byte && next2_byte <= '9')) + { + token.kind = E2_TokenKind_Numeric; + token.range.min = token.range.max = off; + } + else if(next_byte == '\'') + { + token.kind = E2_TokenKind_CharLiteral; + token.range.min = token.range.max = off; + } + else if(next_byte == '"') + { + token.kind = E2_TokenKind_StringLiteral; + token.range.min = token.range.max = off; + } + else if(next_byte == '/' && next2_byte == '/') + { + token.kind = E2_TokenKind_Comment; + token.range.min = token.range.max = off; + } + else if(next_byte == '/' && next2_byte == '*') + { + token.kind = E2_TokenKind_Comment; + token.range.min = token.range.max = off; + comment_is_explicit_ender = 1; + } + else if(next_byte == '~' || next_byte == '!' || next_byte == '%' || + next_byte == '^' || next_byte == '&' || next_byte == '*' || + next_byte == '(' || next_byte == ')' || next_byte == '[' || + next_byte == ']' || next_byte == '{' || next_byte == '}' || + next_byte == '-' || next_byte == '=' || next_byte == '+' || + next_byte == ':' || next_byte == ';' || next_byte == ',' || + next_byte == '.' || next_byte == '<' || next_byte == '>' || + next_byte == '/' || next_byte == '?' || next_byte == '#' || + next_byte == '@' || next_byte == '|') + { + token.kind = E2_TokenKind_Symbol; + token.range.min = token.range.max = off; + } + }break; + + //- rjf: active tokens -> seek enders + case E2_TokenKind_Whitespace: + if(next_byte > 32) + { + done = 1; + }break; + case E2_TokenKind_Comment: + if(comment_is_explicit_ender && next_byte == '*' && next2_byte == '/') + { + done = 1; + token.range.max = off+2; + }break; + case E2_TokenKind_Identifier: + { + if(identifier_tick_mode && (next_byte == '`' || next_byte == '\'')) + { + identifier_tick_mode = 0; + } + else if(!identifier_tick_mode && + (next_byte < 'a' || 'z' < next_byte) && + (next_byte < 'A' || 'Z' < next_byte) && + (next_byte < '0' || '9' < next_byte) && + next_byte != '$' && + next_byte != '_' && + next_byte != '@') + { + done = 1; + token.range.max = off; + } + }break; + case E2_TokenKind_Numeric: + { + if(numeric_exponent && (next_byte == '+' || next_byte == '-')){} + else if((next_byte < 'a' || 'z' < next_byte) && + (next_byte < 'A' || 'Z' < next_byte) && + (next_byte < '0' || '9' < next_byte) && + next_byte != '.' && + next_byte != ':') + { + done = 1; + token.range.max = off; + } + else + { + numeric_exponent = (next_byte == 'e'); + } + }break; + case E2_TokenKind_Symbol: + if(next_byte != '~' && next_byte != '!' && next_byte != '%' && + next_byte != '^' && next_byte != '&' && next_byte != '*' && + next_byte != '(' && next_byte != ')' && next_byte != '[' && + next_byte != ']' && next_byte != '{' && next_byte != '}' && + next_byte != '-' && next_byte != '=' && next_byte != '+' && + next_byte != ':' && next_byte != ';' && next_byte != ',' && + next_byte != '.' && next_byte != '<' && next_byte != '>' && + next_byte != '/' && next_byte != '?' && next_byte != '#' && + next_byte != '@' && next_byte != '|') + { + done = 1; + token.range.max = off; + }break; + case E2_TokenKind_CharLiteral: + case E2_TokenKind_StringLiteral: + { + if(!escaped && next_byte == '\\') + { + escaped = 1; + } + else if(escaped) + { + escaped = 0; + } + else if(!escaped && ((next_byte == '"' && token.kind == E2_TokenKind_StringLiteral) || + (next_byte == '\'' && token.kind == E2_TokenKind_CharLiteral))) + { + done = 1; + token.range.max = off+1; + } + }break; + } + if(token.range.max > off+1) + { + off += (token.range.max - (off+1)); + } + if(!done && off == string.size) + { + done = 1; + token.range.max = off; + } + } + return token; +} + +internal U64 +e2_read_token(String8 string, U64 off, E2_Token *token_out) +{ + E2_Token token = e2_token_from_string_off(string, off); + if(token_out != 0) + { + token_out[0] = token; + } + U64 result = dim_1u64(token.range); + return result; +} + +internal B32 +e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out) +{ + B32 result = 0; + U64 off = off_out[0]; + for(;;) + { + E2_Token next_token = {E2_TokenKind_Null}; + off += e2_read_token(string, off, &next_token); + if(next_token.kind == kind && (expected_string.size == 0 || str8_match(str8_substr(string, next_token.range), expected_string, 0))) + { + result = 1; + if(token_out != 0) + { + token_out[0] = next_token; + } + break; + } + else if(next_token.kind != E2_TokenKind_Comment && next_token.kind != E2_TokenKind_Whitespace) + { + break; + } + } + if(result && off_out != 0) + { + off_out[0] = off; + } + return result; +} + +internal E2_Parse +e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string) +{ + U64 off = state->string_off; + E2_Parse parse = {E2_Status_Error, .expr = &e2_expr_nil, .access_expr = &e2_expr_nil}; + + //- rjf: parse & attach to top parsing task - if we don't have a top task + // then it is just the result + for(B32 done = 0; !done;) + { + S64 max_precedence = state->top_task ? state->top_task->max_precedence : max_S64; + E2_Expr *expr = &e2_expr_nil; + E2_Token token = {0}; + + //- rjf: nested sub-expressions + if(e2_try_token(string, E2_TokenKind_Symbol, s("("), &off, 0)) + { + E2_ParseTask *task = state->free_task; + if(task != 0) + { + SLLStackPop(state->free_task); + } + else + { + task = push_array(arena, E2_ParseTask, 1); + } + task->parent = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(task->parent, &e2_expr_nil); + task->expected_closer = s(")"); + task->child_count_target = 1; + task->max_precedence = max_S64; + SLLStackPush(state->top_task, task); + } + + //- rjf: prefix unaries + else if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token)) + { + // rjf: string -> operator kind + E2_OpKind op_kind = E2_OpKind_Null; + { + String8 token_string = str8_substr(string, token.range); + for EachNonZeroEnumVal(E2_OpKind, k) + { + if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_UnaryPrefix && + e2_op_kind_info_table[k].precedence <= max_precedence && + str8_match(token_string, e2_op_kind_info_table[k].pre, 0)) + { + op_kind = k; + break; + } + } + } + + // rjf: push task for operand + if(op_kind != E2_OpKind_Null) + { + E2_ParseTask *task = state->free_task; + if(task != 0) + { + SLLStackPop(state->free_task); + } + else + { + task = push_array(arena, E2_ParseTask, 1); + } + task->parent = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(task->parent, &e2_expr_nil); + task->child_count_target = 1; + task->op_kind = op_kind; + task->max_precedence = e2_op_kind_info_table[op_kind].precedence; + SLLStackPush(state->top_task, task); + } + } + + //- rjf: leaf identifiers + else if(e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token)) + { + String8 identifier = str8_substr(string, token.range); + expr = e2_expr_from_name(expr_map, identifier); + if(expr == &e2_expr_nil) + { + done = 1; + parse.status = E2_Status_MissedIdentifierResolution; + parse.missed_identifier = identifier; + } + } + + //- rjf: leaf numerics + else if(e2_try_token(string, E2_TokenKind_Numeric, s(""), &off, &token)) + { + String8 numeric_string = str8_substr(string, token.range); + expr = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(expr, &e2_expr_nil); + U64 dot_pos = str8_find_needle(numeric_string, 0, s("."), 0); + B32 f_suffix = str8_match(str8_postfix(numeric_string, 1), s("f"), 0); + U64 colon_pos = str8_find_needle(numeric_string, 0, s(":"), 0); + if(dot_pos < numeric_string.size && f_suffix) + { + expr->val.f32 = (F32)f64_from_str8(numeric_string); + expr->type_key = e2_type_key_basic(E2_TypeKind_F32); + } + else if(dot_pos < numeric_string.size && !f_suffix) + { + expr->val.f64 = f64_from_str8(numeric_string); + expr->type_key = e2_type_key_basic(E2_TypeKind_F64); + } + else if(colon_pos < numeric_string.size) + { + Temp scratch = scratch_begin(&arena, 1); + String8List parts = str8_split(scratch.arena, numeric_string, (U8 *)":", 1, 0); + U64 u64_idx = 0; + for EachNode(n, String8Node, parts.first) + { + if(u64_idx >= ArrayCount(expr->val.u512.u64)) + { + break; + } + try_u64_from_str8_c_rules(n->string, &expr->val.u512.u64[u64_idx]); + u64_idx += 1; + } + switch(u64_idx) + { + case 1:{expr->op = RDI_EvalOp_ConstU64; expr->type_key = e2_type_key_basic(E2_TypeKind_U64);}break; + case 2:{expr->op = RDI_EvalOp_ConstU128; expr->type_key = e2_type_key_basic(E2_TypeKind_U128);}break; + case 4:{expr->op = RDI_EvalOp_ConstU256; expr->type_key = e2_type_key_basic(E2_TypeKind_U256);}break; + case 8:{expr->op = RDI_EvalOp_ConstU512; expr->type_key = e2_type_key_basic(E2_TypeKind_U512);}break; + default: + { + e2_msgf(arena, &parse.msgs, token.range, "Invalid number of numeric portions specified (%I64u; must be 2, 4, or 8).", u64_idx); + }break; + } + scratch_end(scratch); + } + else if(try_u64_from_str8_c_rules(numeric_string, &expr->val.u64)) + { + if(expr->val.u64 <= 0xff) + { + expr->op = RDI_EvalOp_ConstU8; + expr->type_key = e2_type_key_basic(E2_TypeKind_U8); + } + else if(expr->val.u64 <= 0xffff) + { + expr->op = RDI_EvalOp_ConstU16; + expr->type_key = e2_type_key_basic(E2_TypeKind_U16); + } + else if(expr->val.u64 <= 0xffffffff) + { + expr->op = RDI_EvalOp_ConstU32; + expr->type_key = e2_type_key_basic(E2_TypeKind_U32); + } + else + { + expr->op = RDI_EvalOp_ConstU64; + expr->type_key = e2_type_key_basic(E2_TypeKind_U64); + } + } + } + + //- rjf: extend parsed expression tree with trailing binary operators + if(expr != &e2_expr_nil) + { + U64 trailing_symbol_off = off; + if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &trailing_symbol_off, &token)) + { + // rjf: token string -> operator kind + E2_OpKind op_kind = E2_OpKind_Null; + { + String8 token_string = str8_substr(string, token.range); + for EachNonZeroEnumVal(E2_OpKind, k) + { + if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_Binary && + e2_op_kind_info_table[k].precedence <= max_precedence && + str8_match(token_string, e2_op_kind_info_table[k].pre, 0)) + { + op_kind = k; + break; + } + } + } + + // rjf: non-null operator kind -> build binary expression node, push task to fill other child + if(op_kind != E2_OpKind_Null) + { + E2_ParseTask *task = state->free_task; + if(task != 0) + { + SLLStackPop(state->free_task); + } + else + { + task = push_array(arena, E2_ParseTask, 1); + } + task->parent = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(task->parent, &e2_expr_nil); + SLLQueuePush_NZ(&e2_expr_nil, task->parent->first, task->parent->last, expr, next); + task->child_count = 1; + task->child_count_target = 2; + task->op_kind = op_kind; + task->max_precedence = e2_op_kind_info_table[op_kind].precedence; + SLLStackPush(state->top_task, task); + } + } + } + + //- rjf: attach formed expressions to parent task exprs; pop tasks when they're done. + // if we have no parent task, then we just fill the result, and we're done with the parse. + if(expr != &e2_expr_nil) + { + //- rjf: pop finished expressions + E2_Expr *finished_expr = expr; + for(;state->top_task != 0;) + { + //- rjf: gather finished expression to current task; increase task child count + E2_ExprNode *n = push_array(arena, E2_ExprNode, 1); + SLLQueuePush(state->top_task->first_child, state->top_task->last_child, n); + n->v = finished_expr; + state->top_task->child_count += 1; + + //- rjf: task child count hits limit -> complete this child + if(state->top_task->child_count >= state->top_task->child_count_target) + { + //- rjf: release task; iterate to this finished expression next + E2_ParseTask *completed_task = state->top_task; + SLLStackPop(state->top_task); + SLLStackPush(state->free_task, completed_task); + + //- rjf: finish expression with operator info, if applicable + finished_expr = completed_task->parent; + E2_Expr *lhs = completed_task->first_child ? completed_task->first_child->v : &e2_expr_nil; + E2_Expr *rhs = completed_task->last_child ? completed_task->last_child->v : &e2_expr_nil; + { + E2_Expr *root = finished_expr; + switch(completed_task->op_kind) + { + default:{}break; + + //- rjf: dereference + case E2_OpKind_Deref: + { +#if 0 + // rjf: unpack operand + E2_TypeKey rhs_type_key = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_AllDecorative & ~E2_TypeUnwrapFlag_Enums); + E2_TypeKind rhs_type_kind = e2_type_kind_from_key(rhs_type_key); + E2_TypeKey dereferenced_type = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_All & ~E2_TypeUnwrapFlag_Enums); + U64 dereferenced_type_size = e2_byte_size_from_type_key(dereferenced_type); + + // rjf: collect info about malformed situations + B32 malformed = 0; + if(dereferenced_type_size == 0 && e2_type_kind_is_ptr_or_ref(rhs_type_kind)) + { + malformed = 1; + e2_msgf(arena, &parse.msgs, src->root_range, "Cannot dereference pointers to zero-sized types."); + } + else if(dereferenced_type_size == 0 && rhs_type_kind == E2_TypeKind_Array) + { + malformed = 1; + e2_msgf(arena, &parse.msgs, src->root_range, "Cannot dereference arrays of zero-sized types."); + } + else if(!e2_type_kind_is_ptr_or_ref(rhs_type_kind) && rhs_type_kind != E2_TypeKind_Array) + { + malformed = 1; + e2_msgf(arena, &parse.msgs, src->root_range, "Cannot dereference this type."); + } + + // rjf: not malformed -> equip info + if(!malformed) + { + E2_Expr *addr_value_tree = e2_expr_resolve_to_value(arena, rhs); + SLLQueuePush_NZ(&e2_expr_nil, finished_expr->first, finished_expr->last, addr_value_tree, next); + } +#endif + }break; + + case E2_OpKind_Address:{}break; + case E2_OpKind_Pos:{}break; + case E2_OpKind_Neg:{}break; + case E2_OpKind_LogNot:{}break; + case E2_OpKind_BitNot:{}break; + case E2_OpKind_Mul:{}break; + case E2_OpKind_Div:{}break; + case E2_OpKind_Mod:{}break; + case E2_OpKind_Add:{}break; + case E2_OpKind_Sub:{}break; + case E2_OpKind_LShift:{}break; + case E2_OpKind_RShift:{}break; + case E2_OpKind_Less:{}break; + case E2_OpKind_LtEq:{}break; + case E2_OpKind_Grtr:{}break; + case E2_OpKind_GrEq:{}break; + case E2_OpKind_EqEq:{}break; + case E2_OpKind_NtEq:{}break; + case E2_OpKind_BitAnd:{}break; + case E2_OpKind_BitXor:{}break; + case E2_OpKind_BitOr:{}break; + case E2_OpKind_LogAnd:{}break; + case E2_OpKind_LogOr:{}break; + case E2_OpKind_Define:{}break; + } + } + } + } + + //- rjf: for the last finished expression, if we do not have any further tasks, + // this is our result. + if(finished_expr != &e2_expr_nil && state->top_task == 0) + { + parse.expr = finished_expr; + if(parse.status == E2_Status_Error) + { + parse.status = E2_Status_Good; + } + break; + } + } + } + + //- rjf: advance offset if successful + if(parse.status == E2_Status_Good) + { + state->string_off = off; + } + return parse; +} + +//////////////////////////////// +//~ rjf: Expression -> Bytecode + +internal String8 +e2_bytecode_from_expr(Arena *arena, E2_Expr *expr) +{ + +} + +//////////////////////////////// +//~ rjf: Bytecode -> Result + +internal E2_Interp +e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_map, String8 bytecode) +{ + E2_Interp interp = {E2_Status_Error}; + { + U64 off = state->bytecode_off; + U64 off_opl = bytecode.size; + B32 done = 0; + B32 good = 1; + for(;off < off_opl && !done && good;) + { + Temp scratch = scratch_begin(&arena, 1); + U64 start_off = off; + + //- rjf: read next opcode + RDI_EvalOp op = 0; + off += str8_deserial_read_struct(bytecode, off, &op); + + //- rjf: opcode -> ctrl bits + U16 ctrlbits = 0; + switch(op) + { + default: + if(op < RDI_EvalOp_COUNT) + { + ctrlbits = rdi_eval_op_ctrlbits_table[op]; + }break; + case E2_EvalOp_SetCtxID:{ctrlbits = RDI_EVAL_CTRLBITS(8, 0, 0);}break; + } + + //- rjf: ctrlbits -> push/pop/decode count + U64 decode_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + U64 push_count = RDI_PUSHN_FROM_CTRLBITS(ctrlbits); + U64 pop_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); + + //- rjf: do extra decode + String8 decode_data = str8_substr(bytecode, r1u64(off, off+decode_size)); + E2_Val decode_val = {0}; + MemoryCopy(&decode_val, decode_data.str, Min(sizeof(decode_val), decode_data.size)); + RDI_EvalTypeGroup type_group = (RDI_EvalTypeGroup)decode_val.u512.u8[0]; + U64 op_arithmetic_size = (U64)decode_val.u512.u8[1]; + off += decode_size; + + //- rjf: prepare popped stack values & to-push stack values + E2_Val *popped_vals = push_array(scratch.arena, E2_Val, pop_count); + E2_Val *push_vals = push_array(scratch.arena, E2_Val, push_count); + { + E2_InterpStackValNode *node = state->top_val; + for(U64 pop_idx = 0; node != 0 && pop_idx < pop_count; pop_idx += 1, node = node->next) + { + popped_vals[pop_idx] = node->val; + } + } + + //- rjf: do opcode + E2_CtxFlags ctx_flags = 0; + U64 ctx_base_addr = 0; + switch(op) + { + default:{}break; + + case E2_EvalOp_SetCtxID: + { + interp.status = E2_Status_NewCtxID; + interp.ctx_id = decode_val.u64; + }break; + + case RDI_EvalOp_Stop: + { + done = 1; + }break; + case RDI_EvalOp_Noop:{}break; + case RDI_EvalOp_Cond: + if(popped_vals[0].u64 != 0) + { + off += decode_val.u64; + }break; + case RDI_EvalOp_Skip: + { + off += decode_val.u64; + }break; + case RDI_EvalOp_MemRead: + { + U64 addr = popped_vals[0].u64; + U64 size = decode_val.u64; + Rng1U64 space_addr_range = r1u64(addr, addr+size); + void *read_dst = &push_vals[0]; + if(size > sizeof(push_vals[0].u512)) + { + read_dst = push_array(arena, U8, size); + } + U64 read_size = e2_space_map_read(space_map, state->selected_ctx.space_id, space_addr_range, read_dst); + arena_pop(arena, size - read_size); + push_vals[0].string = str8(read_dst, read_size); + if(read_size != size) + { + good = 0; + interp.status = E2_Status_MissedSpaceRead; + interp.missed_read_space_addr_range = space_addr_range; + } + }break; + case RDI_EvalOp_RegRead: + { + U8 rdi_reg_code = (decode_val.u64&0x0000FF)>>0; + U8 byte_size = (decode_val.u64&0x00FF00)>>8; + U8 byte_off = (decode_val.u64&0xFF0000)>>16; + Arch arch = state->selected_ctx.arch; + ARCH_Info *arch_info = arch_info_from_arch(arch); + ARCH_RegCode base_reg_code = arch_reg_code_from_rdi(arch, rdi_reg_code); + if(0 <= base_reg_code && base_reg_code < arch_info->reg_code_count) + { + Rng1U16 reg_rng = arch_info->reg_code_rng_table[base_reg_code]; + U64 off = (U64)reg_rng.min + byte_off; + U64 size = (U64)byte_size; + Rng1U64 space_addr_range = r1u64(off, off+size); + U64 read_size = e2_space_map_read(space_map, state->selected_ctx.reg_space_id, space_addr_range, &push_vals[0]); + if(read_size != size) + { + good = 0; + interp.status = E2_Status_MissedSpaceRead; + interp.missed_read_space_addr_range = space_addr_range; + } + } + else + { + good = 0; + interp.status = E2_Status_BadRegCode; + } + }break; + case RDI_EvalOp_FrameOff: {ctx_flags = E2_CtxFlag_HasFrameBase; ctx_base_addr = state->selected_ctx.frame_base_addr;}goto optional_base_off; + case RDI_EvalOp_ModuleOff: {ctx_flags = E2_CtxFlag_HasModuleBase; ctx_base_addr = state->selected_ctx.module_base_addr;}goto optional_base_off; + case RDI_EvalOp_TLSOff: {ctx_flags = E2_CtxFlag_HasTLSBase; ctx_base_addr = state->selected_ctx.tls_base_addr;}goto optional_base_off; + case RDI_EvalOp_PushCfa: {ctx_flags = E2_CtxFlag_HasCFA; ctx_base_addr = state->selected_ctx.cfa_addr;}goto optional_base_off; + optional_base_off:; + { + if(state->selected_ctx.flags & ctx_flags) + { + push_vals[0].u64 = ctx_base_addr + decode_val.u64; + } + else + { + good = 0; + interp.status = E2_Status_MissingCtxFlag; + interp.missing_ctx_flags |= ctx_flags; + } + }break; + + case RDI_EvalOp_ConstU8: + case RDI_EvalOp_ConstU16: + case RDI_EvalOp_ConstU32: + case RDI_EvalOp_ConstU64: + case RDI_EvalOp_ConstU128: + { + push_vals[0] = decode_val; + }break; + + case RDI_EvalOp_ConstString: + { + U64 string_size = decode_val.u64; + String8 string = str8_substr(bytecode, r1u64(off, off+string_size)); + off += string_size; + push_vals[0].string = string; + }break; + + case RDI_EvalOp_Abs: + { + if(0){} +#define CaseA(target_type_group, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].target_type = (popped_vals[0].target_type < 0 ? -popped_vals[0].target_type : +popped_vals[0].target_type);}while(0) +#define CaseB(target_type_group, size, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].target_type = (popped_vals[0].target_type < 0 ? -popped_vals[0].target_type : +popped_vals[0].target_type);}while(0) + CaseA(F32, f32); + CaseA(F64, f64); + CaseB(S, 8, s8); + CaseB(S, 16, s16); + CaseB(S, 32, s32); + CaseB(S, 64, s64); + else { MemoryCopyStruct(&push_vals[0], &popped_vals[0]); } +#undef CaseA +#undef CaseB + }break; + + case RDI_EvalOp_Neg: + { + if(0){} +#define CaseA(target_type_group, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].target_type = (-popped_vals[0].target_type);}while(0) +#define CaseB(target_type_group, size, target_type) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].target_type = (-popped_vals[0].target_type);}while(0) + CaseA(F32, f32); + CaseA(F64, f64); + CaseB(S, 8, s8); + CaseB(S, 16, s16); + CaseB(S, 32, s32); + CaseB(S, 64, s64); + else { MemoryCopyStruct(&push_vals[0], &popped_vals[0]); } +#undef CaseA +#undef CaseB + }break; + +#define BinOp(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type;}while(0) +#define SizedBinOp(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type;}while(0) +#define BinOpDiv(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) +#define SizedBinOpDiv(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) +#define BinOpDivFn(target_type_group, dst_type, src_type, fn) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = fn(popped_vals[1].src_type, popped_vals[0].src_type); } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) +#define ArithTypeCasesInt(symbol)\ +SizedBinOp(S, 8, s8, s8, symbol);\ +SizedBinOp(S, 16, s16, s16, symbol);\ +SizedBinOp(S, 32, s32, s32, symbol);\ +SizedBinOp(S, 64, s64, s64, symbol);\ +SizedBinOp(U, 8, u8, u8, symbol);\ +SizedBinOp(U, 16, u16, u16, symbol);\ +SizedBinOp(U, 32, u32, u32, symbol);\ +SizedBinOp(U, 64, u64, u64, symbol); +#define ArithTypeCasesIntDiv(symbol)\ +SizedBinOpDiv(S, 8, s8, s8, symbol);\ +SizedBinOpDiv(S, 16, s16, s16, symbol);\ +SizedBinOpDiv(S, 32, s32, s32, symbol);\ +SizedBinOpDiv(S, 64, s64, s64, symbol);\ +SizedBinOpDiv(U, 8, u8, u8, symbol);\ +SizedBinOpDiv(U, 16, u16, u16, symbol);\ +SizedBinOpDiv(U, 32, u32, u32, symbol);\ +SizedBinOpDiv(U, 64, u64, u64, symbol); +#define LogTypeCases(symbol)\ +BinOp(F32, u64, f32, symbol);\ +BinOp(F64, u64, f64, symbol);\ +ArithTypeCasesInt(symbol) +#define ArithTypeCases(symbol)\ +BinOp(F32, f32, f32, symbol);\ +BinOp(F64, f64, f64, symbol);\ +ArithTypeCasesInt(symbol) +#define ArithTypeCasesDiv(symbol)\ +BinOpDiv(F32, f32, f32, symbol);\ +BinOpDiv(F64, f64, f64, symbol);\ +ArithTypeCasesIntDiv(symbol) +#define ArithTypeCasesIntAllU64(symbol)\ +BinOp(S, u64, u64, symbol);\ +BinOp(U, u64, u64, symbol); +#define Case(name, ...) case RDI_EvalOp_##name:{if(0){} __VA_ARGS__ else {interp.status = E2_Status_BadOpTypes; good = 0;}}break + Case(Add, ArithTypeCases(+)); + Case(Sub, ArithTypeCases(-)); + Case(Mul, ArithTypeCases(*)); + Case(Div, ArithTypeCasesDiv(/)); + Case(Mod, ArithTypeCasesIntDiv(%) BinOpDivFn(F32, f32, f32, mod_f32); BinOpDivFn(F64, f64, f64, mod_f64);); + Case(LShift, ArithTypeCasesInt(<<)); + Case(RShift, ArithTypeCasesInt(>>)); + Case(BitAnd, ArithTypeCasesIntAllU64(&)); + Case(BitOr, ArithTypeCasesIntAllU64(|)); + Case(BitXor, ArithTypeCasesIntAllU64(^)); + Case(LogAnd, ArithTypeCasesIntAllU64(&&)); + Case(LogOr, ArithTypeCasesIntAllU64(||)); + Case(LsEq, LogTypeCases(<=)); + Case(GrEq, LogTypeCases(>=)); + Case(Less, LogTypeCases(<)); + Case(Grtr, LogTypeCases(>)); +#undef Case +#undef BinOp +#undef SizedBinOp +#undef BinOpDiv +#undef SizedBinOpDiv +#undef BinOpDivFn +#undef ArithTypeCasesInt +#undef ArithTypeCasesIntDiv +#undef ArithTypeCases +#undef ArithTypeCasesDiv +#undef ArithTypeCasesIntAllU64 + + case RDI_EvalOp_EqEq: + case RDI_EvalOp_NtEq: + { + if(popped_vals[0].string.size != 0 && popped_vals[1].string.size != 0) + { + push_vals[0].u64 = str8_match(popped_vals[0].string, popped_vals[1].string, 0); + } + else + { + push_vals[0].u64 = MemoryMatchStruct(&popped_vals[0].u512, &popped_vals[1].u512); + } + if(op == RDI_EvalOp_NtEq) + { + push_vals[0].u64 = !push_vals[0].u64; + } + }break; + + case RDI_EvalOp_Trunc: + { + if(0 < decode_val.u64) + { + U64 mask = 0; + if(decode_val.u64 < 64) + { + mask = max_U64 >> (64 - decode_val.u64); + } + push_vals[0].u64 = popped_vals[0].u64&mask; + } + }break; + + case RDI_EvalOp_TruncSigned: + { + if(0 < decode_val.u64) + { + U64 mask = 0; + if(decode_val.u64 < 64) + { + mask = max_U64 >> (64 - decode_val.u64); + } + U64 high = 0; + if(popped_vals[0].u64 & (1 << (decode_val.u64 - 1))) + { + high = ~mask; + } + push_vals[0].u64 = high|(popped_vals[0].u64&mask); + } + }break; + + case RDI_EvalOp_Convert: + { + U32 in = decode_val.u64&0xFF; + U32 out = (decode_val.u64 >> 8)&0xFF; + if(in != 0) + { + switch(in + out*RDI_EvalTypeGroup_COUNT) + { + default:{good = 0; interp.status = E2_Status_BadOpTypes;}break; +#define Case(dst_tg, dst_slot, dst_type, src_tg, src_slot) case RDI_EvalTypeGroup_##src_tg + RDI_EvalTypeGroup_##dst_tg*RDI_EvalTypeGroup_COUNT:{push_vals[0].dst_slot = (dst_type)popped_vals[0].src_slot;}break + Case(U, u64, U64, F32, f32); + Case(U, u64, U64, F64, f64); + Case(S, s64, S64, F32, f32); + Case(S, s64, S64, F64, f64); + Case(F32, f32, F32, S, s64); + Case(F64, f64, F64, S, s64); + Case(F32, f32, F32, U, u64); + Case(F64, f64, F64, U, u64); + Case(F32, f32, F32, F64, f64); + Case(F64, f64, F64, F32, f32); +#undef Case + } + } + }break; + + case RDI_EvalOp_Pick: + { + U64 target_idx = decode_val.u64; + U64 idx = 0; + B32 found = 0; + for(E2_InterpStackValNode *n = state->top_val; n != 0; n = n->next, idx += 1) + { + if(idx == target_idx) + { + found = 1; + push_vals[0] = n->val; + break; + } + } + if(!found) + { + good = 0; + interp.status = E2_Status_InsufficientStackSpace; + } + }break; + + case RDI_EvalOp_Swap: + { + push_vals[0] = popped_vals[1]; + push_vals[1] = popped_vals[0]; + }break; + + case RDI_EvalOp_Pop:{NoOp;}break; + + case RDI_EvalOp_ValueRead: + { + U64 bytes_to_read = decode_val.u64; + U64 offset = popped_vals[0].u64; + if(offset + bytes_to_read <= popped_vals[1].string.size) + { + MemoryCopy(&push_vals[0].u512, popped_vals[1].string.str + offset, bytes_to_read); + } + else + { + good = 0; + interp.status = E2_Status_BadOffset; + } + }break; + + case RDI_EvalOp_ByteSwap: + { + U64 byte_size = decode_val.u64; + switch(byte_size) + { + default: + { + good = 0; + interp.status = E2_Status_UnsupportedOp; + }break; + case 2:{push_vals[0].u16 = bswap_u16(popped_vals[0].u16);}break; + case 4:{push_vals[0].u32 = bswap_u32(popped_vals[0].u32);}break; + case 8:{push_vals[0].u64 = bswap_u64(popped_vals[0].u64);}break; + } + }break; + + case RDI_EvalOp_CallSiteValue: + { + // DW_OP_entry_value: requires evaluating the embedded sub-bytecode + // in this frame's entry-time register state (i.e. caller's state + // at the call instruction). that state is not currently plumbed + // into the eval context. interpreting in the current ctx gives + // wrong values for spilled args, so report BadOp instead. + // skip past the embedded sub-bytecode in the outer stream so the + // bytes are not interpreted as outer ops on resume. + good = 0; + interp.status = E2_Status_UnsupportedOp; + }break; + + case RDI_EvalOp_PartialValue: + { + // DW_OP_piece marker: top-of-stack is a piece of a composite value. + // we do not assemble composites; for single-piece expressions the + // value already on the stack is the result. for multi-piece, only + // the first piece is returned (stack[0] is the final result). + good = 0; + interp.status = E2_Status_UnsupportedOp; + }break; + + case RDI_EvalOp_PartialValueBit: + { + // DW_OP_bit_piece marker. same caveat as PartialValue. + good = 0; + interp.status = E2_Status_UnsupportedOp; + }break; + } + + //- rjf: if opcode successful -> do stack pops + if(good) for EachIndex(pop_idx, pop_count) + { + E2_InterpStackValNode *popped = state->top_val; + if(popped != 0) + { + SLLStackPop(state->top_val); + SLLStackPush(state->free_val, popped); + } + else + { + break; + } + } + + //- rjf: if opcode successful -> do stack pushes + if(good) for EachIndex(push_idx, push_count) + { + E2_InterpStackValNode *node = state->free_val; + if(node != 0) + { + SLLStackPop(state->free_val); + } + else + { + node = push_array(arena, E2_InterpStackValNode, 1); + } + node->val = push_vals[push_idx]; + SLLStackPush(state->top_val, node); + } + + //- rjf: if opcode successful -> commit new bytecode offset + if(good) + { + state->bytecode_off = off; + } + + scratch_end(scratch); + if(off == start_off) + { + break; + } + } + if(off == off_opl && good) + { + interp.status = E2_Status_Good; + if(state->top_val != 0) + { + interp.val = state->top_val->val; + } + } + } + return interp; +} diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index e56d35da..392ecf90 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -205,6 +205,20 @@ struct E2_Val typedef U64 E2_SpaceID; +typedef struct E2_DbgInfo E2_DbgInfo; +struct E2_DbgInfo +{ + DI_Key dbgi_key; + RDI_Parsed *rdi; +}; + +typedef struct E2_Assets E2_Assets; +struct E2_Assets +{ + U32 dbg_infos_count; + E2_DbgInfo *dbg_infos; +}; + //////////////////////////////// //~ rjf: Evaluation Contexts @@ -279,6 +293,13 @@ struct E2_Expr E2_Val val; }; +typedef struct E2_ExprNode E2_ExprNode; +struct E2_ExprNode +{ + E2_ExprNode *next; + E2_Expr *v; +}; + typedef struct E2_ExprMapNode E2_ExprMapNode; struct E2_ExprMapNode { @@ -299,6 +320,8 @@ struct E2_ParseTask { E2_ParseTask *next; E2_Expr *parent; + E2_ExprNode *first_child; + E2_ExprNode *last_child; U64 child_count; U64 child_count_target; S64 max_precedence; @@ -409,7 +432,7 @@ internal E2_Msg *e2_msg(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, Strin internal E2_Msg *e2_msgf(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, char *fmt, ...); //////////////////////////////// -//~ rjf: Types +//~ rjf: Type Keys internal E2_TypeKey e2_type_key_basic(E2_TypeKind kind); diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 1f2d914e..f738bbf2 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -13,14 +13,22 @@ //- rjf: [h] #include "base/base_inc.h" #include "x64/x64.h" +#include "http/http_inc.h" +#include "artifact_cache/artifact_cache.h" +#include "symbol_server/symbol_server_inc.h" #include "rdi/rdi_local.h" +#include "dbg_info/dbg_info.h" #include "arch/arch_inc.h" #include "eval2/eval2.h" //- rjf: [c] #include "base/base_inc.c" #include "x64/x64.c" +#include "http/http_inc.c" +#include "artifact_cache/artifact_cache.c" +#include "symbol_server/symbol_server_inc.c" #include "rdi/rdi_local.c" +#include "dbg_info/dbg_info.c" #include "arch/arch_inc.c" #include "eval2/eval2.c" From cc75260946141d3200f8e29b9176824d0c03cf95 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 17 Jun 2026 17:38:09 -0700 Subject: [PATCH 807/850] checkpoint on eval2; type graph operations, parsing, etc. --- project.4coder | 2 +- project.raddbg | 2 +- src/dbg_engine/dbg_engine_ctrl.c | 20 +- src/eval/eval_types.c | 2 +- src/eval2/eval2.c | 1199 +++++++++++++++++++++++++-- src/eval2/eval2.h | 106 ++- src/eval2/eval2.mdesk | 11 + src/eval2/generated/eval2.meta.c | 130 +++ src/eval2/generated/eval2.meta.h | 2 + src/lib_rdi/rdi.c | 20 +- src/lib_rdi/rdi.h | 8 +- src/lib_rdi_make/rdi_make.c | 18 +- src/rdi/rdi.mdesk | 32 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 4 +- src/rdi_from_pdb/rdi_from_pdb.c | 2 +- src/scratch/ryan_scratch.c | 67 +- 16 files changed, 1473 insertions(+), 152 deletions(-) diff --git a/project.4coder b/project.4coder index b5fb9e8d..865b05ec 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build ryan_scratch", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build ryan_scratch no_meta", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 2401ecf6..1bdae732 100644 --- a/project.raddbg +++ b/project.raddbg @@ -33,6 +33,6 @@ target: target: { executable: "build/ryan_scratch.exe" - working_directory: "build/" + working_directory: build enabled: 1 } diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 0d2efd7d..943f7ad8 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1804,10 +1804,21 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) ////////////////////////////// //- rjf: grab initial memory // + // NOTE(rjf): we can pre-fill memory that we can expect to load here - + // otherwise we will lazily evaluate it via the unwinding backends below + // MemoryMap memory_map = {0}; + if(regs_block_good) { - // NOTE(rjf): we can pre-fill memory that we can expect to load here - - // otherwise we will lazily evaluate it via the unwinding backends below + U64 sp = arch_sp_from_reg_block(arch_info, regs_block); + U64 sp_rounded_down = AlignDownPow2(sp, KB(4)); + Rng1U64 top_of_stack_vaddr_range = r1u64(sp_rounded_down, sp_rounded_down+KB(4)); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process_entity->handle, top_of_stack_vaddr_range, 1, endt_us); + String8 data = slice.data; + if(!slice.stale) + { + memory_map_push(scratch.arena, &memory_map, top_of_stack_vaddr_range, data.str); + } } ////////////////////////////// @@ -1834,7 +1845,6 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) unwind.flags = 0; for(;!unwind.flags;) { - ARCH_Info *arch_info = arch_info_from_arch(arch); U64 start_ip = arch_ip_from_reg_block(arch_info, regs_block); U64 start_sp = arch_sp_from_reg_block(arch_info, regs_block); @@ -1879,7 +1889,7 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) // stale. if it can't be read, the unwind fails. if(step.status == UWND_StepStatus_FailedMemoryRead) { - D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process_entity->handle, step.missed_read_vaddr_range, 1, 0); + D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process_entity->handle, step.missed_read_vaddr_range, 1, endt_us); String8 data = slice.data; if(slice.stale) { @@ -6157,7 +6167,7 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 { pre_reg_gen = d_reg_gen(); pre_mem_gen = d_mem_gen(); - unwind = d_unwind_from_thread(arena, thread_handle, 0); + unwind = d_unwind_from_thread(arena, thread_handle, now_time_us()+100); if(!(unwind.flags & D_UnwindFlag_Stale)) { good = 1; diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 2d7e56f7..d1ca382f 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -758,7 +758,7 @@ e_push_type_from_key(Arena *arena, E_TypeKey key) RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); Arch arch = arch_from_rdi_arch(tli->arch); RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); - if(rdi_type->kind != RDI_TypeKind_NULL) + if(rdi_type->kind != RDI_TypeKind_Null) { E_TypeKind kind = e_type_kind_from_rdi(rdi_type->kind); diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index d581552a..15fcee7e 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -140,9 +140,184 @@ e2_msgf(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, char *fmt, ...) return msg; } +//////////////////////////////// +//~ rjf: Assets + +internal void +e2_select_assets(E2_Assets *assets) +{ + e2_assets = assets; +} + +internal E2_DbgInfo * +e2_dbgi_from_num(U32 num) +{ + E2_DbgInfo *result = &e2_dbg_info_nil; + if(0 < num && num <= e2_assets->dbg_infos_count) + { + result = &e2_assets->dbg_infos[num-1]; + } + return result; +} + //////////////////////////////// //~ rjf: Type Keys +//- rjf: RDI -> eval enum conversions + +internal E2_TypeKind +e2_type_kind_from_rdi(RDI_TypeKind k) +{ + E2_TypeKind result = E2_TypeKind_Null; + switch((RDI_TypeKindEnum)k) + { + case RDI_TypeKind_Null:{}break; + case RDI_TypeKind_COUNT:{}break; + case RDI_TypeKind_Void: {result = E2_TypeKind_Void;}break; + case RDI_TypeKind_Handle: {result = E2_TypeKind_Handle;}break; + case RDI_TypeKind_HResult: {result = E2_TypeKind_HResult;}break; + case RDI_TypeKind_Char8: {result = E2_TypeKind_Char8;}break; + case RDI_TypeKind_Char16: {result = E2_TypeKind_Char16;}break; + case RDI_TypeKind_Char32: {result = E2_TypeKind_Char32;}break; + case RDI_TypeKind_UChar8: {result = E2_TypeKind_UChar8;}break; + case RDI_TypeKind_UChar16: {result = E2_TypeKind_UChar16;}break; + case RDI_TypeKind_UChar32: {result = E2_TypeKind_UChar32;}break; + case RDI_TypeKind_U8: {result = E2_TypeKind_U8;}break; + case RDI_TypeKind_U16: {result = E2_TypeKind_U16;}break; + case RDI_TypeKind_U32: {result = E2_TypeKind_U32;}break; + case RDI_TypeKind_U64: {result = E2_TypeKind_U64;}break; + case RDI_TypeKind_U128: {result = E2_TypeKind_U128;}break; + case RDI_TypeKind_U256: {result = E2_TypeKind_U256;}break; + case RDI_TypeKind_U512: {result = E2_TypeKind_U512;}break; + case RDI_TypeKind_S8: {result = E2_TypeKind_S8;}break; + case RDI_TypeKind_S16: {result = E2_TypeKind_S16;}break; + case RDI_TypeKind_S32: {result = E2_TypeKind_S32;}break; + case RDI_TypeKind_S64: {result = E2_TypeKind_S64;}break; + case RDI_TypeKind_S128: {result = E2_TypeKind_S128;}break; + case RDI_TypeKind_S256: {result = E2_TypeKind_S256;}break; + case RDI_TypeKind_S512: {result = E2_TypeKind_S512;}break; + case RDI_TypeKind_Bool: {result = E2_TypeKind_Bool;}break; + case RDI_TypeKind_F16: {result = E2_TypeKind_F16;}break; + case RDI_TypeKind_F32: {result = E2_TypeKind_F32;}break; + case RDI_TypeKind_F32PP: {result = E2_TypeKind_F32PP;}break; + case RDI_TypeKind_F48: {result = E2_TypeKind_F48;}break; + case RDI_TypeKind_F64: {result = E2_TypeKind_F64;}break; + case RDI_TypeKind_F80: {result = E2_TypeKind_F80;}break; + case RDI_TypeKind_F128: {result = E2_TypeKind_F128;}break; + case RDI_TypeKind_ComplexF32: {result = E2_TypeKind_ComplexF32;}break; + case RDI_TypeKind_ComplexF64: {result = E2_TypeKind_ComplexF64;}break; + case RDI_TypeKind_ComplexF80: {result = E2_TypeKind_ComplexF80;}break; + case RDI_TypeKind_ComplexF128: {result = E2_TypeKind_ComplexF128;}break; + case RDI_TypeKind_Modifier: {result = E2_TypeKind_Modifier;}break; + case RDI_TypeKind_Ptr: {result = E2_TypeKind_Ptr;}break; + case RDI_TypeKind_LRef: {result = E2_TypeKind_LRef;}break; + case RDI_TypeKind_RRef: {result = E2_TypeKind_RRef;}break; + case RDI_TypeKind_Array: {result = E2_TypeKind_Array;}break; + case RDI_TypeKind_Function: {result = E2_TypeKind_Function;}break; + case RDI_TypeKind_Method: {result = E2_TypeKind_Method;}break; + case RDI_TypeKind_MemberPtr: {result = E2_TypeKind_MemberPtr;}break; + case RDI_TypeKind_Struct: {result = E2_TypeKind_Struct;}break; + case RDI_TypeKind_Class: {result = E2_TypeKind_Class;}break; + case RDI_TypeKind_Union: {result = E2_TypeKind_Union;}break; + case RDI_TypeKind_Enum: {result = E2_TypeKind_Enum;}break; + case RDI_TypeKind_Alias: {result = E2_TypeKind_Alias;}break; + case RDI_TypeKind_IncompleteStruct: {result = E2_TypeKind_IncompleteStruct;}break; + case RDI_TypeKind_IncompleteUnion: {result = E2_TypeKind_IncompleteUnion;}break; + case RDI_TypeKind_IncompleteClass: {result = E2_TypeKind_IncompleteClass;}break; + case RDI_TypeKind_IncompleteEnum: {result = E2_TypeKind_IncompleteEnum;}break; + case RDI_TypeKind_Bitfield: {result = E2_TypeKind_Bitfield;}break; + case RDI_TypeKind_Variadic: {result = E2_TypeKind_Variadic;}break; + } + return result; +} + +internal RDI_EvalTypeGroup +e2_type_group_from_kind(E2_TypeKind k) +{ + RDI_EvalTypeGroup result = 0; + switch(k) + { + case E2_TypeKind_Null: case E2_TypeKind_Void: + case E2_TypeKind_F16: case E2_TypeKind_F32PP: case E2_TypeKind_F48: + case E2_TypeKind_F80: case E2_TypeKind_F128: + case E2_TypeKind_ComplexF32: case E2_TypeKind_ComplexF64: + case E2_TypeKind_ComplexF80: case E2_TypeKind_ComplexF128: + case E2_TypeKind_Modifier: case E2_TypeKind_Array: + case E2_TypeKind_Struct: case E2_TypeKind_Class: case E2_TypeKind_Union: + case E2_TypeKind_Enum: case E2_TypeKind_Alias: + case E2_TypeKind_IncompleteStruct: case E2_TypeKind_IncompleteClass: + case E2_TypeKind_IncompleteUnion: case E2_TypeKind_IncompleteEnum: + case E2_TypeKind_Bitfield: + case E2_TypeKind_Variadic: + {result = RDI_EvalTypeGroup_Other;}break; + + case E2_TypeKind_Handle: + case E2_TypeKind_UChar8: case E2_TypeKind_UChar16: case E2_TypeKind_UChar32: + case E2_TypeKind_U8: case E2_TypeKind_U16: case E2_TypeKind_U32: + case E2_TypeKind_U64: case E2_TypeKind_U128: case E2_TypeKind_U256: + case E2_TypeKind_U512: + case E2_TypeKind_Ptr: case E2_TypeKind_LRef: case E2_TypeKind_RRef: + case E2_TypeKind_Function: case E2_TypeKind_Method: case E2_TypeKind_MemberPtr: + {result = RDI_EvalTypeGroup_U;}break; + + case E2_TypeKind_Char8: case E2_TypeKind_Char16: case E2_TypeKind_Char32: + case E2_TypeKind_S8: case E2_TypeKind_S16: case E2_TypeKind_S32: + case E2_TypeKind_S64: case E2_TypeKind_S128: case E2_TypeKind_S256: + case E2_TypeKind_S512: + case E2_TypeKind_Bool: + {result = RDI_EvalTypeGroup_S;}break; + + case E2_TypeKind_F32:{result = RDI_EvalTypeGroup_F32;}break; + case E2_TypeKind_F64:{result = RDI_EvalTypeGroup_F64;}break; + } + return result; +} + +internal B32 +e2_type_kind_is_ptr_or_ref(E2_TypeKind k) +{ + B32 result = (k == E2_TypeKind_Ptr || k == E2_TypeKind_LRef || k == E2_TypeKind_RRef); + return result; +} + +internal B32 +e2_type_kind_is_integer(E2_TypeKind k) +{ + B32 result = (E2_TypeKind_FirstInteger <= k && k <= E2_TypeKind_LastInteger); + return result; +} + +internal B32 +e2_type_kind_is_float(E2_TypeKind k) +{ + B32 result = (k == E2_TypeKind_F32 || k == E2_TypeKind_F64); + return result; +} + +internal B32 +e2_type_kind_is_signed(E2_TypeKind k) +{ + B32 result = ((E2_TypeKind_FirstSigned1 <= k && k <= E2_TypeKind_LastSigned1) || + (E2_TypeKind_FirstSigned2 <= k && k <= E2_TypeKind_LastSigned2)); + return result; +} + +internal B32 +e2_type_kind_is_unsigned(E2_TypeKind k) +{ + B32 result = !e2_type_kind_is_signed(k) && e2_type_kind_is_integer(k); + return result; +} + +//- rjf: basic key constructors + +internal E2_TypeKey +e2_type_key_zero(void) +{ + E2_TypeKey key = {E2_TypeKeyKind_Null}; + return key; +} + internal E2_TypeKey e2_type_key_basic(E2_TypeKind kind) { @@ -151,6 +326,572 @@ e2_type_key_basic(E2_TypeKind kind) return key; } +internal E2_TypeKey +e2_type_key_dbgi(E2_TypeKind kind, U32 dbg_info_num, U32 type_idx) +{ + E2_TypeKey key = {E2_TypeKeyKind_DbgInfo}; + key.u32[0] = kind; + key.u32[1] = dbg_info_num; + key.u32[2] = type_idx; + return key; +} + +internal E2_TypeKey +e2_type_key_reg(Arch arch, ARCH_RegCode reg_code) +{ + E2_TypeKey key = {E2_TypeKeyKind_Reg}; + key.u32[0] = arch; + key.u32[1] = reg_code; + return key; +} + +//- rjf: constructed type constructor + +internal E2_TypeKey +e2_type_key_cons_(E2_ConsTypeParams *params) +{ + E2_TypeKey result = {E2_TypeKeyKind_Null}; + // TODO(rjf) + return result; +} + +//- rjf: basic type key type functions + +internal B32 +e2_type_key_match(E2_TypeKey a, E2_TypeKey b) +{ + B32 result = MemoryMatchStruct(&a, &b); + return result; +} + +//- rjf: type key -> info + +internal E2_TypeKind +e2_type_kind_from_key(E2_TypeKey k) +{ + E2_TypeKind result = E2_TypeKind_Null; + switch(k.kind) + { + case E2_TypeKeyKind_Null:{}break; + case E2_TypeKeyKind_Basic: + case E2_TypeKeyKind_DbgInfo: + case E2_TypeKeyKind_Cons: + { + result = (E2_TypeKind)k.u32[0]; + }break; + case E2_TypeKeyKind_Reg: + { + result = E2_TypeKind_Union; + }break; + } + return result; +} + +internal U64 +e2_byte_size_from_type_key(E2_TypeKey k) +{ + U64 result = 0; + switch(k.kind) + { + case E2_TypeKeyKind_Null:{}break; + case E2_TypeKeyKind_Basic: + { + result = e2_type_kind_basic_byte_size_table[k.u32[0]]; + }break; + case E2_TypeKeyKind_DbgInfo: + { + E2_DbgInfo *dbgi = e2_dbgi_from_type_key(k); + U32 dbgi_type_idx = e2_dbgi_type_idx_from_key(k); + RDI_TypeNode *type_node = rdi_element_from_name_idx(dbgi->rdi, TypeNodes, dbgi_type_idx); + result = type_node->byte_size; + }break; + case E2_TypeKeyKind_Cons: + { + // TODO(rjf) + }break; + case E2_TypeKeyKind_Reg: + { + // TODO(rjf) + }break; + } + return result; +} + +internal U32 +e2_dbgi_num_from_type_key(E2_TypeKey k) +{ + U32 result = 0; + if(k.kind == E2_TypeKeyKind_DbgInfo) + { + result = k.u32[1]; + } + return result; +} + +internal E2_DbgInfo * +e2_dbgi_from_type_key(E2_TypeKey k) +{ + U32 dbgi_num = e2_dbgi_num_from_type_key(k); + E2_DbgInfo *dbg_info = e2_dbgi_from_num(dbgi_num); + return dbg_info; +} + +internal U32 +e2_dbgi_type_idx_from_key(E2_TypeKey k) +{ + U32 result = 0; + if(k.kind == E2_TypeKeyKind_DbgInfo) + { + result = k.u32[2]; + } + return result; +} + +internal U64 +e2_shift_from_type_key(E2_TypeKey k) +{ + U64 result = 0; + if(e2_type_kind_from_key(k) == E2_TypeKind_Bitfield) + { + switch(k.kind) + { + case E2_TypeKeyKind_Null:{}break; + case E2_TypeKeyKind_Basic:{}break; + case E2_TypeKeyKind_DbgInfo: + { + E2_DbgInfo *dbgi = e2_dbgi_from_type_key(k); + U32 dbgi_type_idx = e2_dbgi_type_idx_from_key(k); + RDI_TypeNode *type_node = rdi_element_from_name_idx(dbgi->rdi, TypeNodes, dbgi_type_idx); + result = type_node->bitfield.off; + }break; + case E2_TypeKeyKind_Cons: + { + // TODO(rjf) + }break; + case E2_TypeKeyKind_Reg:{}break; + } + } + return result; +} + +internal U64 +e2_mask_count_from_type_key(E2_TypeKey k) +{ + U64 result = 0; + if(e2_type_kind_from_key(k) == E2_TypeKind_Bitfield) + { + switch(k.kind) + { + case E2_TypeKeyKind_Null:{}break; + case E2_TypeKeyKind_Basic:{}break; + case E2_TypeKeyKind_DbgInfo: + { + E2_DbgInfo *dbgi = e2_dbgi_from_type_key(k); + U32 dbgi_type_idx = e2_dbgi_type_idx_from_key(k); + RDI_TypeNode *type_node = rdi_element_from_name_idx(dbgi->rdi, TypeNodes, dbgi_type_idx); + result = type_node->bitfield.size; + }break; + case E2_TypeKeyKind_Cons: + { + // TODO(rjf) + }break; + case E2_TypeKeyKind_Reg:{}break; + } + } + return result; +} + +internal Arch +e2_arch_from_type_key(E2_TypeKey k) +{ + Arch arch = Arch_Null; + switch(k.kind) + { + case E2_TypeKeyKind_Null:{}break; + case E2_TypeKeyKind_Basic:{}break; + case E2_TypeKeyKind_DbgInfo: + { + E2_DbgInfo *dbgi = e2_dbgi_from_type_key(k); + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(dbgi->rdi, TopLevelInfo, 0); + RDI_Arch rdi_arch = tli->arch; + arch = arch_from_rdi_arch(rdi_arch); + }break; + case E2_TypeKeyKind_Cons: + { + // TODO(rjf) + }break; + case E2_TypeKeyKind_Reg: + { + arch = k.u32[0]; + }break; + } + return arch; +} + +//- rjf: type graph traversal primitives + +internal E2_TypeKey +e2_type_key_direct(E2_TypeKey k) +{ + E2_TypeKey result = {E2_TypeKeyKind_Null}; + switch(k.kind) + { + case E2_TypeKeyKind_Null:{}break; + case E2_TypeKeyKind_Basic:{}break; + case E2_TypeKeyKind_DbgInfo: + { + U32 dbgi_num = e2_dbgi_num_from_type_key(k); + U32 dbgi_type_idx = e2_dbgi_type_idx_from_key(k); + E2_DbgInfo *dbgi = e2_dbgi_from_num(dbgi_num); + RDI_TypeNode *type_node = rdi_element_from_name_idx(dbgi->rdi, TypeNodes, dbgi_type_idx); + U32 direct_type_idx = 0; + if(RDI_TypeKind_FirstConstructed <= type_node->kind && type_node->kind <= RDI_TypeKind_LastConstructed) + { + direct_type_idx = type_node->constructed.direct_type_idx; + } + else if(RDI_TypeKind_FirstUserDefined <= type_node->kind && type_node->kind <= RDI_TypeKind_LastUserDefined) + { + direct_type_idx = type_node->user_defined.direct_type_idx; + } + else if(type_node->kind == RDI_TypeKind_Bitfield) + { + direct_type_idx = type_node->bitfield.direct_type_idx; + } + result = e2_type_key_dbgi(e2_type_kind_from_rdi(type_node->kind), dbgi_num, direct_type_idx); + }break; + case E2_TypeKeyKind_Cons: + { + // TODO(rjf) + }break; + case E2_TypeKeyKind_Reg:{}break; + } + return result; +} + +internal E2_TypeKey +e2_type_key_owner(E2_TypeKey k) +{ + E2_TypeKey result = {E2_TypeKeyKind_Null}; + if(e2_type_kind_from_key(k) == E2_TypeKind_MemberPtr) + { + switch(k.kind) + { + case E2_TypeKeyKind_Null:{}break; + case E2_TypeKeyKind_Basic:{}break; + case E2_TypeKeyKind_DbgInfo: + { + U32 dbgi_num = e2_dbgi_num_from_type_key(k); + U32 dbgi_type_idx = e2_dbgi_type_idx_from_key(k); + E2_DbgInfo *dbgi = e2_dbgi_from_num(dbgi_num); + RDI_TypeNode *type_node = rdi_element_from_name_idx(dbgi->rdi, TypeNodes, dbgi_type_idx); + U32 owner_type_idx = type_node->constructed.owner_type_idx; + result = e2_type_key_dbgi(e2_type_kind_from_rdi(type_node->kind), dbgi_num, owner_type_idx); + }break; + case E2_TypeKeyKind_Cons: + { + // TODO(rjf) + }break; + case E2_TypeKeyKind_Reg:{}break; + } + } + return result; +} + +//- rjf: type unwrapping (helpers for advancing past categories of direct type chains) + +internal E2_TypeKey +e2_type_key_unwrap(E2_TypeKey k, E2_TypeUnwrapFlags flags) +{ + E2_TypeKey result = k; + E2_TypeKind kind = e2_type_kind_from_key(result); + B32 did_ptr = 0; + for(;;) + { + B32 done = 0; + switch(kind) + { + default:{done = 1;}break; + case E2_TypeKind_Modifier: {done = !(flags & E2_TypeUnwrapFlag_Modifiers);}break; + case E2_TypeKind_Lens: {done = !(flags & E2_TypeUnwrapFlag_Lenses);}break; + case E2_TypeKind_MetaDisplayName: + case E2_TypeKind_MetaDescription: + case E2_TypeKind_MetaExpr: {done = !(flags & E2_TypeUnwrapFlag_Meta);}break; + case E2_TypeKind_Enum: {done = !(flags & E2_TypeUnwrapFlag_Enums);}break; + case E2_TypeKind_Alias: {done = !(flags & E2_TypeUnwrapFlag_Aliases);}break; + case E2_TypeKind_Bitfield: {done = !(flags & E2_TypeUnwrapFlag_Bitfields);}break; + case E2_TypeKind_Array: + case E2_TypeKind_Ptr: + case E2_TypeKind_RRef: + case E2_TypeKind_LRef: + case E2_TypeKind_MemberPtr: + { + done = (did_ptr || !(flags & E2_TypeUnwrapFlag_Pointers)); + did_ptr = 1; + }break; + } + if(done) + { + break; + } + result = e2_type_key_direct(result); + kind = e2_type_kind_from_key(result); + } + return result; +} + +//- rjf: type coercion + +internal E2_TypeKey +e2_coerced_type_key_from_operands(E2_TypeKey lhs, E2_TypeKey rhs) +{ + E2_TypeKey result = lhs; + { + E2_TypeKind lhs_kind = e2_type_kind_from_key(lhs); + E2_TypeKind rhs_kind = e2_type_kind_from_key(rhs); + U64 lhs_size = e2_byte_size_from_type_key(lhs); + U64 rhs_size = e2_byte_size_from_type_key(rhs); + + //- rjf: f? + f? -> pick biggest + if(e2_type_kind_is_float(lhs_kind) && e2_type_kind_is_float(rhs_kind) && lhs_size > rhs_size) + { + result = lhs; + } + else if(e2_type_kind_is_float(lhs_kind) && e2_type_kind_is_float(rhs_kind) && lhs_size < rhs_size) + { + result = rhs; + } + + //- rjf: f? + i? -> pick float + else if(e2_type_kind_is_float(lhs_kind) && e2_type_kind_is_integer(rhs_kind)) + { + result = lhs; + } + else if(e2_type_kind_is_integer(lhs_kind) && e2_type_kind_is_float(rhs_kind)) + { + result = rhs; + } + + //- rjf: i? + i? -> pick biggest + else if(e2_type_kind_is_integer(lhs_kind) && e2_type_kind_is_integer(rhs_kind) && lhs_size > rhs_size) + { + result = lhs; + } + else if(e2_type_kind_is_integer(lhs_kind) && e2_type_kind_is_integer(rhs_kind) && lhs_size < rhs_size) + { + result = rhs; + } + + //- rjf: i? + u? -> unsigned wins + else if(e2_type_kind_is_signed(lhs_kind) && e2_type_kind_is_unsigned(rhs_kind) && lhs_size == rhs_size) + { + result = rhs; + } + else if(e2_type_kind_is_unsigned(lhs_kind) && e2_type_kind_is_signed(rhs_kind) && lhs_size == rhs_size) + { + result = lhs; + } + } + return result; +} + +//////////////////////////////// +//~ rjf: Expression Constructors + +internal E2_Expr * +e2_expr(Arena *arena) +{ + E2_Expr *expr = push_array(arena, E2_Expr, 1); + MemoryCopyStruct(expr, &e2_expr_nil); + return expr; +} + +internal E2_Expr * +e2_expr_const_u64_or_smaller(Arena *arena, U64 u) +{ + E2_Expr *e = e2_expr(arena); + { + e->mode = E2_Mode_Value; + e->val.u64 = u; + if(u <= 0x7fffffff) + { + e->op = RDI_EvalOp_ConstU32; + e->type_key = e2_type_key_basic(E2_TypeKind_S32); + } + else if(u <= 0xffffffff) + { + e->op = RDI_EvalOp_ConstU32; + e->type_key = e2_type_key_basic(E2_TypeKind_U32); + } + else if(u <= 0x7fffffffffffffffull) + { + e->op = RDI_EvalOp_ConstU64; + e->type_key = e2_type_key_basic(E2_TypeKind_S64); + } + else if(u <= 0xffffffffffffffffull) + { + e->op = RDI_EvalOp_ConstU64; + e->type_key = e2_type_key_basic(E2_TypeKind_U64); + } + } + return e; +} + +internal E2_Expr * +e2_expr_const_f32(Arena *arena, F32 f32) +{ + E2_Expr *e = e2_expr(arena); + e->mode = E2_Mode_Value; + e->val.f32 = f32; + e->op = RDI_EvalOp_ConstU32; + e->type_key = e2_type_key_basic(E2_TypeKind_F32); + return e; +} + +internal E2_Expr * +e2_expr_const_f64(Arena *arena, F64 f64) +{ + E2_Expr *e = e2_expr(arena); + e->mode = E2_Mode_Value; + e->val.f64 = f64; + e->op = RDI_EvalOp_ConstU64; + e->type_key = e2_type_key_basic(E2_TypeKind_F64); + return e; +} + +internal E2_Expr * +e2_expr_unary_op(Arena *arena, E2_TypeKey type_key, RDI_EvalOp op, E2_Expr *operand) +{ + E2_Expr *e = e2_expr(arena); + e->type_key = type_key; + e->op = op; + e->mode = E2_Mode_Value; + e2_expr_push_child(e, operand); + return e; +} + +internal E2_Expr * +e2_expr_binary_op(Arena *arena, E2_TypeKey type_key, RDI_EvalOp op, E2_Expr *lhs, E2_Expr *rhs) +{ + E2_Expr *e = e2_expr(arena); + e->type_key = type_key; + e->op = op; + e->mode = E2_Mode_Value; + e->val.u512.u8[0] = e2_type_group_from_kind(e2_type_kind_from_key(type_key)); + e->val.u512.u8[1] = 8*e2_byte_size_from_type_key(type_key); + e2_expr_push_child(e, lhs); + e2_expr_push_child(e, rhs); + return e; +} + +internal E2_Expr * +e2_expr_resolve_to_value(Arena *arena, E2_Expr *expr) +{ + E2_Expr *result = expr; + + // rjf: address evaluations of arrays -> create value of pointer to first element + if(expr->mode == E2_Mode_Address && e2_type_kind_from_key(e2_type_key_undecorate(expr->type_key)) == E2_TypeKind_Array) + { + result = e2_expr(arena); + result->type_key = e2_type_key_direct(e2_type_key_undecorate(expr->type_key)); + result->mode = E2_Mode_Value; + e2_expr_push_child(result, expr); + } + + // rjf: address evaluations -> read value from space + else if(expr->mode == E2_Mode_Address) + { + U64 memread_byte_size = e2_byte_size_from_type_key(expr->type_key); + memread_byte_size = Min(64, memread_byte_size); + E2_Expr *memread_expr = e2_expr(arena); + memread_expr->op = RDI_EvalOp_MemRead; + memread_expr->mode = E2_Mode_Value; + memread_expr->type_key = expr->type_key; + memread_expr->val.u64 = memread_byte_size; + e2_expr_push_child(memread_expr, expr); + result = memread_expr; + } + + // rjf: bitfields -> shift & mask + E2_TypeKey core_type_key = e2_type_key_undecorate(expr->type_key); + if(e2_type_kind_from_key(core_type_key) == E2_TypeKind_Bitfield) + { + // rjf: unpack bitfield params + U64 shift = e2_shift_from_type_key(result->type_key); + U64 mask_count = e2_mask_count_from_type_key(result->type_key); + U64 valid_bits_mask = 0; + for EachIndex(idx, mask_count) + { + valid_bits_mask |= (1ull<type_key = dst_type_key; + result->op = dst_type_is_signed ? RDI_EvalOp_TruncSigned : RDI_EvalOp_Trunc; + result->val.u64 = dst_type_byte_size*8; + e2_expr_push_child(result, expr); + } + return result; +} + +internal E2_Expr * +e2_expr_convert_if_possible(Arena *arena, E2_Expr *expr, E2_TypeKey dst_type_key) +{ + E2_Expr *result = expr; + { + // rjf: unpack src / dst types + E2_TypeKey src_type_key = expr->type_key; + E2_TypeKind src_type_kind = e2_type_kind_from_key(src_type_key); + E2_TypeKind dst_type_kind = e2_type_kind_from_key(dst_type_key); + RDI_EvalTypeGroup src_type_group = e2_type_group_from_kind(src_type_kind); + RDI_EvalTypeGroup dst_type_group = e2_type_group_from_kind(dst_type_kind); + U64 src_byte_size = e2_byte_size_from_type_key(src_type_key); + U64 dst_byte_size = e2_byte_size_from_type_key(dst_type_key); + + // rjf: convert from src -> dst + RDI_EvalConversionKind conversion_kind = rdi_eval_conversion_kind_from_typegroups(src_type_group, dst_type_group); + if(conversion_kind == RDI_EvalConversionKind_Legal) + { + result = e2_expr(arena); + result->mode = E2_Mode_Value; + result->type_key = dst_type_key; + result->op = RDI_EvalOp_Convert; + result->val.u64 = src_type_group | (dst_type_group << 8); + e2_expr_push_child(result, expr); + } + + // rjf: if shrinking integer sizes, truncate + if(dst_byte_size < src_byte_size && e2_type_kind_is_integer(dst_type_kind)) + { + result = e2_expr_truncate(arena, expr, dst_type_key); + } + } + return result; +} + +internal void +e2_expr_push_child(E2_Expr *parent, E2_Expr *expr) +{ + SLLQueuePush_NZ(&e2_expr_nil, parent->first, parent->last, expr, next); +} + //////////////////////////////// //~ rjf: String -> Expression @@ -237,6 +978,7 @@ e2_token_from_string_off(String8 string, U64 start_off) if(next_byte > 32) { done = 1; + token.range.max = off; }break; case E2_TokenKind_Comment: if(comment_is_explicit_ender && next_byte == '*' && next2_byte == '/') @@ -292,6 +1034,21 @@ e2_token_from_string_off(String8 string, U64 start_off) { done = 1; token.range.max = off; + String8 token_string = str8_substr(string, token.range); + U64 biggest_match_size = 0; + for EachNonZeroEnumVal(E2_OpKind, k) + { + String8 op_symbol = (e2_op_kind_info_table[k].pre.size != 0) ? e2_op_kind_info_table[k].pre : e2_op_kind_info_table[k].sep; + if(biggest_match_size < op_symbol.size && str8_match(op_symbol, str8_prefix(token_string, op_symbol.size), 0)) + { + biggest_match_size = op_symbol.size; + token.range.max = token.range.min + op_symbol.size; + } + } + if(biggest_match_size == 0) + { + token.range.max = token.range.min + 1; + } }break; case E2_TokenKind_CharLiteral: case E2_TokenKind_StringLiteral: @@ -368,21 +1125,21 @@ e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *of } internal E2_Parse -e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string) +e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, String8 string) { U64 off = state->string_off; E2_Parse parse = {E2_Status_Error, .expr = &e2_expr_nil, .access_expr = &e2_expr_nil}; //- rjf: parse & attach to top parsing task - if we don't have a top task // then it is just the result + E2_Expr *expr = &e2_expr_nil; for(B32 done = 0; !done;) { S64 max_precedence = state->top_task ? state->top_task->max_precedence : max_S64; - E2_Expr *expr = &e2_expr_nil; E2_Token token = {0}; //- rjf: nested sub-expressions - if(e2_try_token(string, E2_TokenKind_Symbol, s("("), &off, 0)) + if(expr == &e2_expr_nil && e2_try_token(string, E2_TokenKind_Symbol, s("("), &off, &token)) { E2_ParseTask *task = state->free_task; if(task != 0) @@ -391,10 +1148,10 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } else { - task = push_array(arena, E2_ParseTask, 1); + task = push_array_no_zero(arena, E2_ParseTask, 1); } - task->parent = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(task->parent, &e2_expr_nil); + MemoryZeroStruct(task); + task->src_range = token.range; task->expected_closer = s(")"); task->child_count_target = 1; task->max_precedence = max_S64; @@ -402,7 +1159,7 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } //- rjf: prefix unaries - else if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token)) + else if(expr == &e2_expr_nil && e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token)) { // rjf: string -> operator kind E2_OpKind op_kind = E2_OpKind_Null; @@ -430,10 +1187,10 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } else { - task = push_array(arena, E2_ParseTask, 1); + task = push_array_no_zero(arena, E2_ParseTask, 1); } - task->parent = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(task->parent, &e2_expr_nil); + MemoryZeroStruct(task); + task->src_range = token.range; task->child_count_target = 1; task->op_kind = op_kind; task->max_precedence = e2_op_kind_info_table[op_kind].precedence; @@ -442,7 +1199,7 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } //- rjf: leaf identifiers - else if(e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token)) + else if(expr == &e2_expr_nil && e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token)) { String8 identifier = str8_substr(string, token.range); expr = e2_expr_from_name(expr_map, identifier); @@ -455,29 +1212,27 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } //- rjf: leaf numerics - else if(e2_try_token(string, E2_TokenKind_Numeric, s(""), &off, &token)) + else if(expr == &e2_expr_nil && e2_try_token(string, E2_TokenKind_Numeric, s(""), &off, &token)) { + U64 u64_val = 0; String8 numeric_string = str8_substr(string, token.range); - expr = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(expr, &e2_expr_nil); U64 dot_pos = str8_find_needle(numeric_string, 0, s("."), 0); B32 f_suffix = str8_match(str8_postfix(numeric_string, 1), s("f"), 0); U64 colon_pos = str8_find_needle(numeric_string, 0, s(":"), 0); if(dot_pos < numeric_string.size && f_suffix) { - expr->val.f32 = (F32)f64_from_str8(numeric_string); - expr->type_key = e2_type_key_basic(E2_TypeKind_F32); + expr = e2_expr_const_f32(arena, (F32)f64_from_str8(numeric_string)); } else if(dot_pos < numeric_string.size && !f_suffix) { - expr->val.f64 = f64_from_str8(numeric_string); - expr->type_key = e2_type_key_basic(E2_TypeKind_F64); + expr = e2_expr_const_f64(arena, f64_from_str8(numeric_string)); } else if(colon_pos < numeric_string.size) { Temp scratch = scratch_begin(&arena, 1); String8List parts = str8_split(scratch.arena, numeric_string, (U8 *)":", 1, 0); U64 u64_idx = 0; + expr = e2_expr(arena); for EachNode(n, String8Node, parts.first) { if(u64_idx >= ArrayCount(expr->val.u512.u64)) @@ -500,28 +1255,9 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } scratch_end(scratch); } - else if(try_u64_from_str8_c_rules(numeric_string, &expr->val.u64)) + else if(try_u64_from_str8_c_rules(numeric_string, &u64_val)) { - if(expr->val.u64 <= 0xff) - { - expr->op = RDI_EvalOp_ConstU8; - expr->type_key = e2_type_key_basic(E2_TypeKind_U8); - } - else if(expr->val.u64 <= 0xffff) - { - expr->op = RDI_EvalOp_ConstU16; - expr->type_key = e2_type_key_basic(E2_TypeKind_U16); - } - else if(expr->val.u64 <= 0xffffffff) - { - expr->op = RDI_EvalOp_ConstU32; - expr->type_key = e2_type_key_basic(E2_TypeKind_U32); - } - else - { - expr->op = RDI_EvalOp_ConstU64; - expr->type_key = e2_type_key_basic(E2_TypeKind_U64); - } + expr = e2_expr_const_u64_or_smaller(arena, u64_val); } } @@ -539,7 +1275,7 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, { if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_Binary && e2_op_kind_info_table[k].precedence <= max_precedence && - str8_match(token_string, e2_op_kind_info_table[k].pre, 0)) + str8_match(token_string, e2_op_kind_info_table[k].sep, 0)) { op_kind = k; break; @@ -557,16 +1293,16 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } else { - task = push_array(arena, E2_ParseTask, 1); + task = push_array_no_zero(arena, E2_ParseTask, 1); } - task->parent = push_array(arena, E2_Expr, 1); - MemoryCopyStruct(task->parent, &e2_expr_nil); - SLLQueuePush_NZ(&e2_expr_nil, task->parent->first, task->parent->last, expr, next); - task->child_count = 1; + MemoryZeroStruct(task); + task->src_range = token.range; + task->child_count = 0; task->child_count_target = 2; task->op_kind = op_kind; task->max_precedence = e2_op_kind_info_table[op_kind].precedence; SLLStackPush(state->top_task, task); + off = trailing_symbol_off; } } } @@ -576,37 +1312,51 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, if(expr != &e2_expr_nil) { //- rjf: pop finished expressions - E2_Expr *finished_expr = expr; for(;state->top_task != 0;) { //- rjf: gather finished expression to current task; increase task child count E2_ExprNode *n = push_array(arena, E2_ExprNode, 1); SLLQueuePush(state->top_task->first_child, state->top_task->last_child, n); - n->v = finished_expr; + n->v = expr; state->top_task->child_count += 1; - //- rjf: task child count hits limit -> complete this child + //- rjf: task child count hits limit -> complete this subtree if(state->top_task->child_count >= state->top_task->child_count_target) { - //- rjf: release task; iterate to this finished expression next + //- rjf: release task E2_ParseTask *completed_task = state->top_task; SLLStackPop(state->top_task); SLLStackPush(state->free_task, completed_task); - //- rjf: finish expression with operator info, if applicable - finished_expr = completed_task->parent; + //- rjf: produced finished expression tree, given all children + E2_Expr *finished_root = &e2_expr_nil; E2_Expr *lhs = completed_task->first_child ? completed_task->first_child->v : &e2_expr_nil; E2_Expr *rhs = completed_task->last_child ? completed_task->last_child->v : &e2_expr_nil; { - E2_Expr *root = finished_expr; + RDI_EvalOp op = RDI_EvalOp_Stop; + E2_TypeKey dst_type_key = {E2_TypeKeyKind_Null}; switch(completed_task->op_kind) { - default:{}break; + //- rjf: no op -> just a sub-expression + default: + { + if(lhs != rhs) + { + finished_root = e2_expr(arena); + for EachNode(n, E2_ExprNode, completed_task->first_child) + { + e2_expr_push_child(finished_root, n->v); + } + } + else + { + finished_root = lhs; + } + }break; //- rjf: dereference case E2_OpKind_Deref: { -#if 0 // rjf: unpack operand E2_TypeKey rhs_type_key = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_AllDecorative & ~E2_TypeUnwrapFlag_Enums); E2_TypeKind rhs_type_kind = e2_type_kind_from_key(rhs_type_key); @@ -618,62 +1368,264 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, if(dereferenced_type_size == 0 && e2_type_kind_is_ptr_or_ref(rhs_type_kind)) { malformed = 1; - e2_msgf(arena, &parse.msgs, src->root_range, "Cannot dereference pointers to zero-sized types."); + e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot dereference pointers to zero-sized types."); } else if(dereferenced_type_size == 0 && rhs_type_kind == E2_TypeKind_Array) { malformed = 1; - e2_msgf(arena, &parse.msgs, src->root_range, "Cannot dereference arrays of zero-sized types."); + e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot dereference arrays of zero-sized types."); } else if(!e2_type_kind_is_ptr_or_ref(rhs_type_kind) && rhs_type_kind != E2_TypeKind_Array) { malformed = 1; - e2_msgf(arena, &parse.msgs, src->root_range, "Cannot dereference this type."); + e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot dereference this type."); } // rjf: not malformed -> equip info if(!malformed) { + B32 is_only_type_eval = (rhs->mode == E2_Mode_Type); E2_Expr *addr_value_tree = e2_expr_resolve_to_value(arena, rhs); - SLLQueuePush_NZ(&e2_expr_nil, finished_expr->first, finished_expr->last, addr_value_tree, next); + addr_value_tree->type_key = dereferenced_type; + if(is_only_type_eval) + { + addr_value_tree->mode = E2_Mode_Type; + } + else + { + addr_value_tree->mode = E2_Mode_Address; + } + finished_root = addr_value_tree; } -#endif }break; - case E2_OpKind_Address:{}break; - case E2_OpKind_Pos:{}break; - case E2_OpKind_Neg:{}break; - case E2_OpKind_LogNot:{}break; - case E2_OpKind_BitNot:{}break; - case E2_OpKind_Mul:{}break; - case E2_OpKind_Div:{}break; - case E2_OpKind_Mod:{}break; - case E2_OpKind_Add:{}break; - case E2_OpKind_Sub:{}break; - case E2_OpKind_LShift:{}break; - case E2_OpKind_RShift:{}break; - case E2_OpKind_Less:{}break; - case E2_OpKind_LtEq:{}break; - case E2_OpKind_Grtr:{}break; - case E2_OpKind_GrEq:{}break; - case E2_OpKind_EqEq:{}break; - case E2_OpKind_NtEq:{}break; - case E2_OpKind_BitAnd:{}break; - case E2_OpKind_BitXor:{}break; - case E2_OpKind_BitOr:{}break; - case E2_OpKind_LogAnd:{}break; - case E2_OpKind_LogOr:{}break; + //- rjf: address-of + case E2_OpKind_Address: + { + // rjf: determine if malformed + B32 malformed = 0; + if(rhs->mode != E2_Mode_Address) + { + malformed = 1; + e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot take an address of a value; it does not exist in memory."); + } + + // rjf: generate + if(!malformed) + { + Arch arch = e2_arch_from_type_key(rhs->type_key); + finished_root = rhs; + finished_root->mode = E2_Mode_Value; + finished_root->type_key = e2_type_key_cons_ptr(arch, rhs->type_key); + } + }break; + + //- rjf: positive (no-op, just take the right-hand-side) + case E2_OpKind_Pos: + { + finished_root = rhs; + }break; + + //- rjf: unary ops + case E2_OpKind_Neg: {op = RDI_EvalOp_Neg;}goto unary_op; + case E2_OpKind_LogNot: {op = RDI_EvalOp_LogNot;}goto unary_op; + case E2_OpKind_BitNot: {op = RDI_EvalOp_BitNot;}goto unary_op; + unary_op:; + { + // rjf: unpack operand + E2_TypeKey rhs_type_key = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_AllDecorative & ~E2_TypeUnwrapFlag_Enums); + E2_TypeKind rhs_type_kind = e2_type_kind_from_key(rhs_type_key); + RDI_EvalTypeGroup rhs_type_group = e2_type_group_from_kind(rhs_type_kind); + + // rjf: determine if malformed + B32 malformed = 0; + if(!rdi_eval_op_typegroup_are_compatible(op, rhs_type_group)) + { + malformed = 1; + e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot use this operator on this type."); + } + + // rjf: generate + if(!malformed) + { + E2_TypeKey dst_type = rhs_type_key; + if(RDI_EvalOp_FirstLogical <= op && op <= RDI_EvalOp_LastLogical) + { + dst_type = e2_type_key_basic(E2_TypeKind_Bool); + } + else if(rhs_type_kind == E2_TypeKind_Bool || + rhs_type_kind == E2_TypeKind_S8 || + rhs_type_kind == E2_TypeKind_S16 || + rhs_type_kind == E2_TypeKind_U8 || + rhs_type_kind == E2_TypeKind_U16) + { + dst_type = e2_type_key_basic(E2_TypeKind_S32); + } + E2_Expr *operand = e2_expr_resolve_to_value(arena, rhs); + E2_Expr *operand__converted = e2_expr_convert_if_possible(arena, operand, dst_type); + finished_root = e2_expr_unary_op(arena, dst_type, op, operand__converted); + } + }break; + + //- rjf: binary ops + case E2_OpKind_Mul: {op = RDI_EvalOp_Mul;}goto binary_op; + case E2_OpKind_Div: {op = RDI_EvalOp_Div;}goto binary_op; + case E2_OpKind_Mod: {op = RDI_EvalOp_Mod;}goto binary_op; + case E2_OpKind_Add: {op = RDI_EvalOp_Add;}goto binary_op; + case E2_OpKind_Sub: {op = RDI_EvalOp_Sub;}goto binary_op; + case E2_OpKind_LShift:{op = RDI_EvalOp_LShift;}goto binary_op; + case E2_OpKind_RShift:{op = RDI_EvalOp_RShift;}goto binary_op; + case E2_OpKind_Less: {op = RDI_EvalOp_Less;}goto binary_op; + case E2_OpKind_LtEq: {op = RDI_EvalOp_LsEq;}goto binary_op; + case E2_OpKind_Grtr: {op = RDI_EvalOp_Grtr;}goto binary_op; + case E2_OpKind_GrEq: {op = RDI_EvalOp_GrEq;}goto binary_op; + case E2_OpKind_EqEq: {op = RDI_EvalOp_EqEq;}goto binary_op; + case E2_OpKind_NtEq: {op = RDI_EvalOp_NtEq;}goto binary_op; + case E2_OpKind_BitAnd:{op = RDI_EvalOp_BitAnd;}goto binary_op; + case E2_OpKind_BitXor:{op = RDI_EvalOp_BitXor;}goto binary_op; + case E2_OpKind_BitOr: {op = RDI_EvalOp_BitOr;}goto binary_op; + case E2_OpKind_LogAnd:{op = RDI_EvalOp_LogAnd;}goto binary_op; + case E2_OpKind_LogOr: {op = RDI_EvalOp_LogOr;}goto binary_op; + binary_op:; + { + // rjf: resolve lhs / rhs to values + E2_Expr *lhs_value = e2_expr_resolve_to_value(arena, lhs); + E2_Expr *rhs_value = e2_expr_resolve_to_value(arena, rhs); + + // rjf: unpack resolved lhs/rhs + E2_TypeKey lhs_type_key = e2_type_key_undecorate(lhs_value->type_key); + E2_TypeKey rhs_type_key = e2_type_key_undecorate(rhs_value->type_key); + E2_TypeKind lhs_type_kind = e2_type_kind_from_key(lhs_type_key); + E2_TypeKind rhs_type_kind = e2_type_kind_from_key(rhs_type_key); + RDI_EvalTypeGroup lhs_type_group = e2_type_group_from_kind(lhs_type_kind); + RDI_EvalTypeGroup rhs_type_group = e2_type_group_from_kind(rhs_type_kind); + U64 lhs_type_size = e2_byte_size_from_type_key(lhs_type_key); + U64 rhs_type_size = e2_byte_size_from_type_key(rhs_type_key); + + // rjf: determine kind of arithmetic + typedef enum ArithKind + { + ArithKind_Normal, + ArithKind_PtrAdd, + ArithKind_PtrSub, + ArithKind_PtrArrayCompare, + ArithKind_TypeCompare, + } + ArithKind; + ArithKind arith_kind = ArithKind_Normal; + { + if(lhs_value->mode == E2_Mode_Type || rhs_value->mode == E2_Mode_Type) + { + arith_kind = ArithKind_TypeCompare; + } + else if((op == RDI_EvalOp_Add || op == RDI_EvalOp_Sub) && + ((e2_type_kind_is_ptr_or_ref(lhs_type_kind) && e2_type_kind_is_integer(rhs_type_kind)) || + (e2_type_kind_is_ptr_or_ref(rhs_type_kind) && e2_type_kind_is_integer(lhs_type_kind)))) + { + arith_kind = ArithKind_PtrAdd; + } + else if(op == RDI_EvalOp_Sub && e2_type_kind_is_ptr_or_ref(lhs_type_kind) && e2_type_kind_is_ptr_or_ref(rhs_type_kind)) + { + arith_kind = ArithKind_PtrSub; + } + else if((op == RDI_EvalOp_EqEq || op == RDI_EvalOp_NtEq) && + ((e2_type_kind_is_ptr_or_ref(lhs_type_kind) && rhs_type_kind == E2_TypeKind_Array) || + (e2_type_kind_is_ptr_or_ref(rhs_type_kind) && lhs_type_kind == E2_TypeKind_Array))) + { + arith_kind = ArithKind_PtrArrayCompare; + } + } + + // rjf: generate + switch(arith_kind) + { + //- rjf: normal arithmetic + case ArithKind_Normal: + { + // rjf: check malformation + B32 malformed = 0; + if(!rdi_eval_op_typegroup_are_compatible(op, lhs_type_group) || + !rdi_eval_op_typegroup_are_compatible(op, rhs_type_group)) + { + malformed = 1; + e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot use this operator on this type."); + } + + // rjf: generate + if(!malformed) + { + E2_TypeKey dst_type_key = lhs_type_key; + if(RDI_EvalOp_FirstLogical <= op && op <= RDI_EvalOp_LastLogical) + { + dst_type_key = e2_type_key_basic(E2_TypeKind_Bool); + } + else + { + dst_type_key = e2_coerced_type_key_from_operands(lhs_type_key, rhs_type_key); + } + E2_Expr *lhs_converted = e2_expr_convert_if_possible(arena, lhs_value, dst_type_key); + E2_Expr *rhs_converted = e2_expr_convert_if_possible(arena, rhs_value, dst_type_key); + finished_root = e2_expr_binary_op(arena, dst_type_key, op, lhs_converted, rhs_converted); + } + }break; + + //- rjf: pointer-add arithmetic + case ArithKind_PtrAdd: + { + + }break; + + //- rjf: pointer-sub arithmetic + case ArithKind_PtrSub: + { + + }break; + + //- rjf: pointer-array comparisons + case ArithKind_PtrArrayCompare: + { + + }break; + + //- rjf: type comparisons + case ArithKind_TypeCompare: + { + + }break; + } + }break; + + //- rjf: definitions (TODO(rjf): tricky with the 'user resolves expressions' model - let's figure it out once basics are in) case E2_OpKind_Define:{}break; } } + + //- rjf: consume expected closers + if(completed_task->expected_closer.size != 0) + { + if(!e2_try_token(string, E2_TokenKind_Symbol, completed_task->expected_closer, &off, 0)) + { + e2_msgf(arena, &parse.msgs, r1u64(off, off), "Expected `%S`.", completed_task->expected_closer); + } + } + + //- rjf: work on the parent of the finished expression next + expr = finished_root; + } + + //- rjf: if the top task is not done -> break & continue - reset expression, because we need to parse another. + else + { + expr = &e2_expr_nil; + break; } } //- rjf: for the last finished expression, if we do not have any further tasks, // this is our result. - if(finished_expr != &e2_expr_nil && state->top_task == 0) + if(state->top_task == 0 && off >= string.size) { - parse.expr = finished_expr; + parse.expr = expr; if(parse.status == E2_Status_Error) { parse.status = E2_Status_Good; @@ -684,7 +1636,7 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, } //- rjf: advance offset if successful - if(parse.status == E2_Status_Good) + if(parse.status == E2_Status_Good || parse.status == E2_Status_Error) { state->string_off = off; } @@ -697,7 +1649,73 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, internal String8 e2_bytecode_from_expr(Arena *arena, E2_Expr *expr) { - + String8 result = {0}; + { + Temp scratch = scratch_begin(&arena, 1); + String8List strings = {0}; + typedef struct Task Task; + struct Task + { + Task *next; + E2_Expr *e; + E2_Expr *last_pushed_child; + U64 pushed_child_count; + }; + Task start_task = {0, expr, &e2_expr_nil}; + Task *top_task = &start_task; + Task *free_task = 0; + for(Task *t = top_task; t != 0; t = top_task) + { + E2_Expr *e = t->e; + + //- rjf: unpack this op + U16 ctrlbits = rdi_eval_op_ctrlbits_table[e->op]; + U64 child_count = RDI_POPN_FROM_CTRLBITS(ctrlbits); + + //- rjf: push the next child task if we can + if(t->pushed_child_count < child_count) + { + t->pushed_child_count += 1; + E2_Expr *next_child = (t->last_pushed_child == &e2_expr_nil ? e->first : t->last_pushed_child->next); + Task *child_task = free_task; + if(child_task != 0) + { + SLLStackPop(free_task); + } + else + { + child_task = push_array_no_zero(scratch.arena, Task, 1); + } + MemoryZeroStruct(child_task); + SLLStackPush(top_task, child_task); + child_task->e = next_child; + child_task->last_pushed_child = &e2_expr_nil; + child_task->pushed_child_count = 0; + t->last_pushed_child = next_child; + } + + //- rjf: did push of all children -> push this expr's op, pop off stack + else + { + U16 ctrlbits = 0; + if(e->op < RDI_EvalOp_COUNT) + { + ctrlbits = rdi_eval_op_ctrlbits_table[e->op]; + } + U64 decode_byte_count = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + U64 op_size = 1 + decode_byte_count; + U8 *op_buffer = push_array(scratch.arena, U8, op_size); + op_buffer[0] = e->op; + MemoryCopy(op_buffer+1, &e->val, decode_byte_count); + str8_list_push(scratch.arena, &strings, str8(op_buffer, op_size)); + SLLStackPop(top_task); + SLLStackPush(free_task, t); + } + } + result = str8_list_join(arena, &strings, 0); + scratch_end(scratch); + } + return result; } //////////////////////////////// @@ -966,6 +1984,15 @@ BinOp(U, u64, u64, symbol); #undef ArithTypeCasesDiv #undef ArithTypeCasesIntAllU64 + case RDI_EvalOp_LogNot: + { + push_vals[0].u64 = !popped_vals[0].u64; + }break; + case RDI_EvalOp_BitNot: + { + push_vals[0].u64 = ~popped_vals[0].u64; + }break; + case RDI_EvalOp_EqEq: case RDI_EvalOp_NtEq: { diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index 392ecf90..f18d8f22 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -61,6 +61,8 @@ typedef enum E2_Status E2_Status_UnsupportedOp, E2_Status_BadOffset, E2_Status_Error, + E2_Status_FirstError = E2_Status_BadRegCode, + E2_Status_LastError = E2_Status_Error, } E2_Status; @@ -71,7 +73,7 @@ typedef enum E2_TypeKeyKind { E2_TypeKeyKind_Null, E2_TypeKeyKind_Basic, - E2_TypeKeyKind_Ext, + E2_TypeKeyKind_DbgInfo, E2_TypeKeyKind_Cons, E2_TypeKeyKind_Reg, } @@ -82,9 +84,9 @@ struct E2_TypeKey { E2_TypeKeyKind kind; U32 u32[3]; - // [0] -> E_TypeKind (Basic, Cons, Ext); Arch (Reg, RegAlias) - // [1] -> Type Index In Debug Info (Ext); Code (Reg, RegAlias); Type Index In Constructed (Cons) - // [2] -> Debug Info Number (Ext) + // [0] -> E_TypeKind (Basic, Cons, DbgInfo); Arch (Reg) + // [1] -> Debug Info Number (DbgInfo); Code (Reg); Type Index In Constructed (Cons) + // [2] -> Type Index In Debug Info (DbgInfo) }; typedef struct E2_TypeKeyNode E2_TypeKeyNode; @@ -319,7 +321,7 @@ typedef struct E2_ParseTask E2_ParseTask; struct E2_ParseTask { E2_ParseTask *next; - E2_Expr *parent; + Rng1U64 src_range; E2_ExprNode *first_child; E2_ExprNode *last_child; U64 child_count; @@ -411,6 +413,8 @@ struct E2_Interp //////////////////////////////// //~ rjf: Globals +thread_static E2_Assets *e2_assets = 0; +read_only global E2_DbgInfo e2_dbg_info_nil = {{0}, &rdi_parsed_nil}; read_only global E2_Expr e2_expr_nil = {&e2_expr_nil, &e2_expr_nil, &e2_expr_nil}; //////////////////////////////// @@ -431,10 +435,100 @@ internal E2_Expr *e2_expr_from_name(E2_ExprMap *map, String8 name); internal E2_Msg *e2_msg(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, String8 string); internal E2_Msg *e2_msgf(Arena *arena, E2_MsgList *msgs, Rng1U64 src_range, char *fmt, ...); +//////////////////////////////// +//~ rjf: Assets + +internal void e2_select_assets(E2_Assets *assets); +internal E2_DbgInfo *e2_dbgi_from_num(U32 num); + //////////////////////////////// //~ rjf: Type Keys +//- rjf: enums +internal E2_TypeKind e2_type_kind_from_rdi(RDI_TypeKind k); +internal RDI_EvalTypeGroup e2_type_group_from_kind(E2_TypeKind k); +internal B32 e2_type_kind_is_ptr_or_ref(E2_TypeKind k); +internal B32 e2_type_kind_is_integer(E2_TypeKind k); +internal B32 e2_type_kind_is_float(E2_TypeKind k); +internal B32 e2_type_kind_is_signed(E2_TypeKind k); +internal B32 e2_type_kind_is_unsigned(E2_TypeKind k); + +//- rjf: basic key constructors +internal E2_TypeKey e2_type_key_zero(void); internal E2_TypeKey e2_type_key_basic(E2_TypeKind kind); +internal E2_TypeKey e2_type_key_dbgi(E2_TypeKind kind, U32 dbg_info_num, U32 type_idx); +internal E2_TypeKey e2_type_key_reg(Arch arch, ARCH_RegCode reg_code); + +//- rjf: constructed type constructor +typedef struct E2_ConsTypeParams E2_ConsTypeParams; +struct E2_ConsTypeParams +{ + Arch arch; + E2_TypeKind kind; + E2_TypeFlags flags; + String8 name; + E2_TypeKey direct_type_key; + U64 count; + U64 depth; + E2_Expr **args; +}; +internal E2_TypeKey e2_type_key_cons_(E2_ConsTypeParams *params); +#define e2_type_key_cons(k, ...) e2_type_key_cons_(&(E2_ConsTypeParams){.kind = (k), __VA_ARGS__}) + +//- rjf: constructed type constructor helpers +#define e2_type_key_cons_array(element_type_key, count_, ...) e2_type_key_cons(E2_TypeKind_Array, .direct_type_key = (element_type_key), .count = (count_), __VA_ARGS__) +#define e2_type_key_cons_ptr(arch, ptee_type_key, ...) e2_type_key_cons(E2_TypeKind_Ptr, .direct_type_key = (ptee_type_key), __VA_ARGS__) + +//- rjf: basic type key type functions +internal B32 e2_type_key_match(E2_TypeKey a, E2_TypeKey b); + +//- rjf: type key -> info +internal E2_TypeKind e2_type_kind_from_key(E2_TypeKey k); +internal U64 e2_byte_size_from_type_key(E2_TypeKey k); +internal U32 e2_dbgi_num_from_type_key(E2_TypeKey k); +internal E2_DbgInfo *e2_dbgi_from_type_key(E2_TypeKey k); +internal U32 e2_dbgi_type_idx_from_key(E2_TypeKey k); +internal U64 e2_shift_from_type_key(E2_TypeKey k); +internal U64 e2_mask_count_from_type_key(E2_TypeKey k); +internal Arch e2_arch_from_type_key(E2_TypeKey k); + +//- rjf: type graph traversal primitives +internal E2_TypeKey e2_type_key_direct(E2_TypeKey k); +internal E2_TypeKey e2_type_key_owner(E2_TypeKey k); + +//- rjf: type unwrapping (helpers for advancing past categories of direct type chains) +typedef U32 E2_TypeUnwrapFlags; +enum +{ + E2_TypeUnwrapFlag_Modifiers = (1<<0), + E2_TypeUnwrapFlag_Pointers = (1<<1), + E2_TypeUnwrapFlag_Lenses = (1<<2), + E2_TypeUnwrapFlag_Meta = (1<<3), + E2_TypeUnwrapFlag_Enums = (1<<4), + E2_TypeUnwrapFlag_Aliases = (1<<5), + E2_TypeUnwrapFlag_Bitfields = (1<<6), + E2_TypeUnwrapFlag_All = 0xffffffff, + E2_TypeUnwrapFlag_AllDecorative = (E2_TypeUnwrapFlag_All & ~(E2_TypeUnwrapFlag_Pointers|E2_TypeUnwrapFlag_Bitfields)) +}; +internal E2_TypeKey e2_type_key_unwrap(E2_TypeKey k, E2_TypeUnwrapFlags flags); +#define e2_type_key_undecorate(k) e2_type_key_unwrap((k), E2_TypeUnwrapFlag_AllDecorative) + +//- rjf: type coercion +internal E2_TypeKey e2_coerced_type_key_from_operands(E2_TypeKey lhs, E2_TypeKey rhs); + +//////////////////////////////// +//~ rjf: Expression Constructors + +internal E2_Expr *e2_expr(Arena *arena); +internal E2_Expr *e2_expr_const_u64_or_smaller(Arena *arena, U64 u); +internal E2_Expr *e2_expr_const_f32(Arena *arena, F32 f32); +internal E2_Expr *e2_expr_const_f64(Arena *arena, F64 f64); +internal E2_Expr *e2_expr_unary_op(Arena *arena, E2_TypeKey type_key, RDI_EvalOp op, E2_Expr *operand); +internal E2_Expr *e2_expr_binary_op(Arena *arena, E2_TypeKey type_key, RDI_EvalOp op, E2_Expr *lhs, E2_Expr *rhs); +internal E2_Expr *e2_expr_resolve_to_value(Arena *arena, E2_Expr *expr); +internal E2_Expr *e2_expr_truncate(Arena *arena, E2_Expr *expr, E2_TypeKey dst_type_key); +internal E2_Expr *e2_expr_convert_if_possible(Arena *arena, E2_Expr *expr, E2_TypeKey dst_type_key); +internal void e2_expr_push_child(E2_Expr *parent, E2_Expr *expr); //////////////////////////////// //~ rjf: String -> Expression @@ -442,7 +536,7 @@ internal E2_TypeKey e2_type_key_basic(E2_TypeKind kind); internal E2_Token e2_token_from_string_off(String8 string, U64 start_off); internal U64 e2_read_token(String8 string, U64 off, E2_Token *token_out); internal B32 e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out); -internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_SpaceMap *space_map, E2_ExprMap *expr_map, String8 string); +internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, String8 string); //////////////////////////////// //~ rjf: Expression -> Bytecode diff --git a/src/eval2/eval2.mdesk b/src/eval2/eval2.mdesk index c2964b95..5460530f 100644 --- a/src/eval2/eval2.mdesk +++ b/src/eval2/eval2.mdesk @@ -128,3 +128,14 @@ E2_TypeKindTable: `FirstMeta = E2_TypeKind_MetaExpr`, `LastMeta = E2_TypeKind_MetaDescription`, } + +@data(U8) e2_type_kind_basic_byte_size_table: +{ + @expand(E2_TypeKindTable a) `$(a.basic_byte_size)` +} + +@data(String8) e2_type_kind_basic_string_table: +{ + @expand(E2_TypeKindTable a) `str8_lit_comp("$(a.basic_string)")` +} + diff --git a/src/eval2/generated/eval2.meta.c b/src/eval2/generated/eval2.meta.c index a56c84c2..7bb0448b 100644 --- a/src/eval2/generated/eval2.meta.c +++ b/src/eval2/generated/eval2.meta.c @@ -34,5 +34,135 @@ E2_OpInfo e2_op_kind_info_table[26] = {E2_OpParseKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp(""), str8_lit_comp("")}, }; +U8 e2_type_kind_basic_byte_size_table[61] = +{ +0, +0, +0xFF, +4, +1, +2, +4, +1, +2, +4, +1, +2, +4, +8, +16, +32, +64, +1, +2, +4, +8, +16, +32, +64, +1, +2, +4, +4, +6, +8, +10, +16, +8, +16, +20, +32, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +}; + +String8 e2_type_kind_basic_string_table[61] = +{ +str8_lit_comp(""), +str8_lit_comp("void"), +str8_lit_comp("HANDLE"), +str8_lit_comp("HRESULT"), +str8_lit_comp("char8"), +str8_lit_comp("char16"), +str8_lit_comp("char32"), +str8_lit_comp("uchar8"), +str8_lit_comp("uchar16"), +str8_lit_comp("uchar32"), +str8_lit_comp("uint8"), +str8_lit_comp("uint16"), +str8_lit_comp("uint32"), +str8_lit_comp("uint64"), +str8_lit_comp("uint128"), +str8_lit_comp("uint256"), +str8_lit_comp("uint512"), +str8_lit_comp("int8"), +str8_lit_comp("int16"), +str8_lit_comp("int32"), +str8_lit_comp("int64"), +str8_lit_comp("int128"), +str8_lit_comp("int256"), +str8_lit_comp("int512"), +str8_lit_comp("bool"), +str8_lit_comp("float16"), +str8_lit_comp("float32"), +str8_lit_comp("float32PP"), +str8_lit_comp("float48"), +str8_lit_comp("float64"), +str8_lit_comp("float80"), +str8_lit_comp("float128"), +str8_lit_comp("complex_float32"), +str8_lit_comp("complex_float64"), +str8_lit_comp("complex_float80"), +str8_lit_comp("complex_float128"), +str8_lit_comp("modifier"), +str8_lit_comp("ptr"), +str8_lit_comp("lref"), +str8_lit_comp("rref"), +str8_lit_comp("array"), +str8_lit_comp("function"), +str8_lit_comp("method"), +str8_lit_comp("member_ptr"), +str8_lit_comp("struct"), +str8_lit_comp("class"), +str8_lit_comp("union"), +str8_lit_comp("enum"), +str8_lit_comp("typedef"), +str8_lit_comp("struct"), +str8_lit_comp("union"), +str8_lit_comp("class"), +str8_lit_comp("enum"), +str8_lit_comp("bitfield"), +str8_lit_comp("variadic"), +str8_lit_comp("set"), +str8_lit_comp("lens"), +str8_lit_comp("lens_spec"), +str8_lit_comp("meta_expr"), +str8_lit_comp("meta_display_name"), +str8_lit_comp("meta_description"), +}; + C_LINKAGE_END diff --git a/src/eval2/generated/eval2.meta.h b/src/eval2/generated/eval2.meta.h index 453fc77a..9262b98c 100644 --- a/src/eval2/generated/eval2.meta.h +++ b/src/eval2/generated/eval2.meta.h @@ -117,6 +117,8 @@ E2_TypeKind_LastMeta = E2_TypeKind_MetaDescription, C_LINKAGE_BEGIN extern E2_OpInfo e2_op_kind_info_table[26]; +extern U8 e2_type_kind_basic_byte_size_table[61]; +extern String8 e2_type_kind_basic_string_table[61]; C_LINKAGE_END diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index c892e49f..f030ca78 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -81,17 +81,17 @@ RDI_EVAL_CTRLBITS(64, 0, 1), RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), RDI_EVAL_CTRLBITS(2, 2, 1), RDI_EVAL_CTRLBITS(2, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 2, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 2, 1), +RDI_EVAL_CTRLBITS(2, 1, 1), RDI_EVAL_CTRLBITS(1, 2, 1), RDI_EVAL_CTRLBITS(1, 2, 1), RDI_EVAL_CTRLBITS(1, 1, 1), @@ -162,7 +162,6 @@ RDI_U8 *result = 0; switch (kind) { default:{}break; -case RDI_TypeKind_NULL: {result = (RDI_U8*)"NULL"; *size_out = sizeof("NULL")-1;}break; case RDI_TypeKind_Void: {result = (RDI_U8*)"Void"; *size_out = sizeof("Void")-1;}break; case RDI_TypeKind_Handle: {result = (RDI_U8*)"Handle"; *size_out = sizeof("Handle")-1;}break; case RDI_TypeKind_HResult: {result = (RDI_U8*)"HResult"; *size_out = sizeof("HResult")-1;}break; @@ -222,7 +221,6 @@ case RDI_TypeKind_IncompleteUnion: {result = (RDI_U8*)"IncompleteUnion"; *size_o case RDI_TypeKind_IncompleteClass: {result = (RDI_U8*)"IncompleteClass"; *size_out = sizeof("IncompleteClass")-1;}break; case RDI_TypeKind_IncompleteEnum: {result = (RDI_U8*)"IncompleteEnum"; *size_out = sizeof("IncompleteEnum")-1;}break; case RDI_TypeKind_Bitfield: {result = (RDI_U8*)"Bitfield"; *size_out = sizeof("Bitfield")-1;}break; -case RDI_TypeKind_COUNT: {result = (RDI_U8*)"COUNT"; *size_out = sizeof("COUNT")-1;}break; } return result; } diff --git a/src/lib_rdi/rdi.h b/src/lib_rdi/rdi.h index d7ecf52d..0cdf1f3c 100644 --- a/src/lib_rdi/rdi.h +++ b/src/lib_rdi/rdi.h @@ -274,7 +274,7 @@ RDI_Language_COUNT = 4, typedef RDI_U16 RDI_TypeKind; typedef enum RDI_TypeKindEnum { -RDI_TypeKind_NULL = 0x0000, +RDI_TypeKind_Null, RDI_TypeKind_Void = 0x0001, RDI_TypeKind_Handle = 0x0002, RDI_TypeKind_HResult = 0x0003, @@ -334,7 +334,6 @@ RDI_TypeKind_IncompleteUnion = 0x2006, RDI_TypeKind_IncompleteClass = 0x2007, RDI_TypeKind_IncompleteEnum = 0x2008, RDI_TypeKind_Bitfield = 0xF000, -RDI_TypeKind_COUNT = 0xF002, RDI_TypeKind_FirstBuiltIn = RDI_TypeKind_Void, RDI_TypeKind_LastBuiltIn = RDI_TypeKind_Variadic, RDI_TypeKind_FirstConstructed = RDI_TypeKind_Modifier, @@ -345,6 +344,7 @@ RDI_TypeKind_FirstIncomplete = RDI_TypeKind_IncompleteStruct, RDI_TypeKind_LastIncomplete = RDI_TypeKind_IncompleteEnum, RDI_TypeKind_FirstRecord = RDI_TypeKind_Struct, RDI_TypeKind_LastUserDefined = RDI_TypeKind_IncompleteEnum, +RDI_TypeKind_COUNT, } RDI_TypeKindEnum; typedef RDI_U16 RDI_TypeModifierFlags; @@ -471,6 +471,8 @@ RDI_EvalOp_PartialValueBit = 50, RDI_EvalOp_Swap = 51, RDI_EvalOp_PushCfa = 52, RDI_EvalOp_COUNT = 53, +RDI_EvalOp_FirstLogical = RDI_EvalOp_LogAnd, +RDI_EvalOp_LastLogical = RDI_EvalOp_Grtr, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; @@ -771,7 +773,6 @@ X(Masm)\ X(COUNT)\ #define RDI_TypeKind_XList \ -X(NULL)\ X(Void)\ X(Handle)\ X(HResult)\ @@ -831,7 +832,6 @@ X(IncompleteUnion)\ X(IncompleteClass)\ X(IncompleteEnum)\ X(Bitfield)\ -X(COUNT)\ #define RDI_TypeModifierFlags_XList \ X(Const)\ diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 5f1e10b6..49be12a0 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -545,7 +545,7 @@ rdim_rng1u64_chunk_list_push(RDIM_Arena *arena, RDIM_Rng1U64ChunkList *list, RDI RDI_PROC RDI_TypeKind rdim_short_type_kind_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; @@ -561,7 +561,7 @@ rdim_short_type_kind_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_unsigned_short_type_kind_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; @@ -577,7 +577,7 @@ rdim_unsigned_short_type_kind_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_int_type_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; @@ -593,7 +593,7 @@ rdim_int_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_unsigned_int_type_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; @@ -609,7 +609,7 @@ rdim_unsigned_int_type_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_long_type_kind_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; @@ -625,7 +625,7 @@ rdim_long_type_kind_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_unsigned_long_type_kind_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; @@ -641,7 +641,7 @@ rdim_unsigned_long_type_kind_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_long_long_type_kind_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; @@ -657,7 +657,7 @@ rdim_long_long_type_kind_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_unsigned_long_long_type_kind_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; @@ -673,7 +673,7 @@ rdim_unsigned_long_long_type_kind_from_data_model(RDIM_DataModel data_model) RDI_PROC RDI_TypeKind rdim_pointer_size_t_type_kind_from_data_model(RDIM_DataModel data_model) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch((RDIM_DataModelEnum)data_model) { case RDIM_DataModel_Null:{}break; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 95ba4a09..84687215 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -718,8 +718,6 @@ RDI_LanguageTable: @table(name value size bookend1 bookend2) RDI_TypeKindTable: { - {NULL 0x0000 0 } - //- {Void 0x0001 0 FirstBuiltIn } {Handle 0x0002 0xFFFFFFFF } {HResult 0x0003 4 } @@ -782,7 +780,6 @@ RDI_TypeKindTable: {IncompleteEnum 0x2008 0 LastIncomplete LastUserDefined} //- {Bitfield 0xF000 0 } - {COUNT 0xF002 0 } } @table(name value) @@ -857,9 +854,11 @@ RDI_EnumMemberTable: @enum(RDI_U16) RDI_TypeKind: { + `Null`, @expand(RDI_TypeKindTable a) `$(a.name .. =>20) = $(a.value)`; @expand(RDI_TypeKindTable a) `$(a.bookend1 != "" -> a.bookend1 .. =>20 .. " = RDI_TypeKind_" .. a.name)`; @expand(RDI_TypeKindTable a) `$(a.bookend2 != "" -> a.bookend2 .. =>20 .. " = RDI_TypeKind_" .. a.name)`; + `COUNT`; } @enum(RDI_U16) RDI_TypeModifierFlags: @@ -1193,7 +1192,7 @@ RDI_LocationSetElementMemberTable: //////////////////////////////// //~ rjf: Evaluation Bytecode Tables -@table(name value num_decodes num_pops num_pushes) +@table(name value num_decodes num_pops num_pushes bookend) RDI_EvalOpTable: { {Stop 0 0 0 0} @@ -1217,18 +1216,18 @@ RDI_EvalOpTable: {ConstString 18 1 0 1} {Abs 19 1 1 1} {Neg 20 1 1 1} - {Add 21 1 2 1} - {Sub 22 1 2 1} - {Mul 23 1 2 1} - {Div 24 1 2 1} - {Mod 25 1 2 1} + {Add 21 2 2 1} + {Sub 22 2 2 1} + {Mul 23 2 2 1} + {Div 24 2 2 1} + {Mod 25 2 2 1} {LShift 26 2 2 1} {RShift 27 2 2 1} - {BitAnd 28 1 2 1} - {BitOr 29 1 2 1} - {BitXor 30 1 2 1} - {BitNot 31 1 1 1} - {LogAnd 32 1 2 1} + {BitAnd 28 2 2 1} + {BitOr 29 2 2 1} + {BitXor 30 2 2 1} + {BitNot 31 2 1 1} + {LogAnd 32 1 2 1 FirstLogical} {LogOr 33 1 2 1} {LogNot 34 1 1 1} {EqEq 35 1 2 1} @@ -1236,7 +1235,7 @@ RDI_EvalOpTable: {LsEq 37 1 2 1} {GrEq 38 1 2 1} {Less 39 1 2 1} - {Grtr 40 1 2 1} + {Grtr 40 1 2 1 LastLogical} {Trunc 41 1 1 1} {TruncSigned 42 1 1 1} {Convert 43 2 1 1} @@ -1280,7 +1279,8 @@ RDI_EvalConversionKindTable: @enum(RDI_U8) RDI_EvalOp: { - @expand(RDI_EvalOpTable a) `$(a.name .. =>20) = $(a.value)` + @expand(RDI_EvalOpTable a) `$(a.name .. =>20) = $(a.value)`, + @expand(RDI_EvalOpTable a) `$(a.bookend != "" -> a.bookend .. " = RDI_EvalOp_" .. a.name)`, } @enum(RDI_U8) RDI_EvalTypeGroup: diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 5e3b8b22..549258ef 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -2104,7 +2104,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // rjf: convert type RDIM_Type *dst_type = 0; - RDI_TypeKind rdi_type_kind = RDI_TypeKind_NULL; + RDI_TypeKind rdi_type_kind = RDI_TypeKind_Null; RDI_TypeModifierFlags rdi_type_modifier_flags = 0; switch(tag.kind) { @@ -2254,7 +2254,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) #define CaseB(rdi_type_kind_, encoding_, bit_size_) else if(encoding == (encoding_) && bitsize == (bit_size_)) { rdi_type_kind = (rdi_type_kind_); } #define CaseC(rdi_type_kind_, encoding_, name_) /* assumes x64/arm64 */ else if(encoding == (encoding_) && str8_match(name, str8_lit(name_), 0)) { rdi_type_kind = (rdi_type_kind_); } #define CaseD(rdi_type_kind_, encoding_, name_, bit_size_) else if(encoding == (encoding_) && bitsize == (bit_size_) && str8_match(name, str8_lit(name_), 0)) { rdi_type_kind = (rdi_type_kind_); } - CaseA(RDI_TypeKind_NULL, DW_ATE_Null) + CaseA(RDI_TypeKind_Null, DW_ATE_Null) CaseA(RDI_TypeKind_Void, DW_ATE_Address) CaseA(RDI_TypeKind_Bool, DW_ATE_Boolean) CaseB(RDI_TypeKind_ComplexF32, DW_ATE_ComplexFloat, 64) diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 19072fe5..2f23d19e 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -199,7 +199,7 @@ p2r_rdi_language_from_cv_language(CV_Language cv_language) internal RDI_TypeKind p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) { - RDI_TypeKind result = RDI_TypeKind_NULL; + RDI_TypeKind result = RDI_TypeKind_Null; switch(basic_type) { case CV_BasicType_VOID: {result = RDI_TypeKind_Void;}break; diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index f738bbf2..f8eec594 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -38,17 +38,66 @@ internal void entry_point(CmdLine *cmdline) { - Temp scratch = scratch_begin(0, 0); - E2_ParseState state = {0}; - E2_SpaceMap space_map = {0}; - E2_ExprMap expr_map = {0}; - for(;;) + String8 strings[] = { - E2_Parse parse = e2_parse_from_string(scratch.arena, &state, &space_map, &expr_map, s("!123")); - if(parse.status == E2_Status_Good) + s("123"), + s("123 + 456"), + s("!1"), + s("!0"), + s("1 + 1 + 1"), + s("40 / 0"), + s("3 * 4"), + s("3 * 4 + 2"), + s("(3 * 4) + 2"), + s("2 + (3 * 4)"), + }; + for EachElement(idx, strings) + { + Temp scratch = scratch_begin(0, 0); + + // rjf: string -> expr + E2_Expr *expr = &e2_expr_nil; { - break; + E2_ParseState state = {0}; + E2_ExprMap expr_map = {0}; + for(;;) + { + E2_Parse parse = e2_parse_from_string(scratch.arena, &state, &expr_map, strings[idx]); + if(parse.status == E2_Status_Good) + { + expr = parse.expr; + break; + } + } } + + // rjf: expr -> bytecode + String8 bytecode = e2_bytecode_from_expr(scratch.arena, expr); + + // rjf: bytecode -> value + E2_Val val = {0}; + { + E2_InterpState state = {0}; + E2_SpaceMap space_map = {0}; + for(;;) + { + E2_Interp interp = e2_interp_from_bytecode(scratch.arena, &state, &space_map, bytecode); + if(interp.status == E2_Status_Good) + { + val = interp.val; + break; + } + else if(E2_Status_FirstError <= interp.status <= E2_Status_LastError) + { + break; + } + } + } + + // rjf: log + printf("%.*s -> %I64u\n", str8_varg(strings[idx]), val.u64); + fflush(stdout); + + scratch_end(scratch); } - scratch_end(scratch); } From 3aad389174778120bb290095588bcbd7a9d6bdf0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 17 Jun 2026 19:30:08 -0700 Subject: [PATCH 808/850] notes --- src/eval2/eval2.h | 1 + src/eval2/eval2.mdesk | 50 ++++++++++++++--------------- src/rdi_from_dwarf/rdi_from_dwarf.c | 7 ++++ 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index f18d8f22..a9a7cd45 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -12,6 +12,7 @@ typedef enum E2_OpParseKind E2_OpParseKind_Null, E2_OpParseKind_UnaryPrefix, E2_OpParseKind_Binary, + E2_OpParseKind_UnaryPostfix, } E2_OpParseKind; diff --git a/src/eval2/eval2.mdesk b/src/eval2/eval2.mdesk index 5460530f..e40299a8 100644 --- a/src/eval2/eval2.mdesk +++ b/src/eval2/eval2.mdesk @@ -4,31 +4,31 @@ @table(name parse_kind precedence pre sep pos chain) E2_OpTable: { - {Deref UnaryPrefix 2 "*" "" "" ""} - {Address UnaryPrefix 2 "&" "" "" ""} - {Pos UnaryPrefix 2 "+" "" "" ""} - {Neg UnaryPrefix 2 "-" "" "" ""} - {LogNot UnaryPrefix 2 "!" "" "" ""} - {BitNot UnaryPrefix 2 "~" "" "" ""} - {Mul Binary 3 "" "*" "" ""} - {Div Binary 3 "" "/" "" ""} - {Mod Binary 3 "" "%" "" ""} - {Add Binary 4 "" "+" "" ""} - {Sub Binary 4 "" "-" "" ""} - {LShift Binary 5 "" "<<" "" ""} - {RShift Binary 5 "" ">>" "" ""} - {Less Binary 6 "" "<" "" ""} - {LtEq Binary 6 "" "<=" "" ""} - {Grtr Binary 6 "" ">" "" ""} - {GrEq Binary 6 "" ">=" "" ""} - {EqEq Binary 7 "" "==" "" ""} - {NtEq Binary 7 "" "!=" "" ""} - {BitAnd Binary 8 "" "&" "" ""} - {BitXor Binary 9 "" "^" "" ""} - {BitOr Binary 10 "" "|" "" ""} - {LogAnd Binary 11 "" "&&" "" ""} - {LogOr Binary 12 "" "||" "" ""} - {Define Binary 13 "" "=" "" ""} + {Deref UnaryPrefix 2 "*" "" "" ""} + {Address UnaryPrefix 2 "&" "" "" ""} + {Pos UnaryPrefix 2 "+" "" "" ""} + {Neg UnaryPrefix 2 "-" "" "" ""} + {LogNot UnaryPrefix 2 "!" "" "" ""} + {BitNot UnaryPrefix 2 "~" "" "" ""} + {Mul Binary 3 "" "*" "" ""} + {Div Binary 3 "" "/" "" ""} + {Mod Binary 3 "" "%" "" ""} + {Add Binary 4 "" "+" "" ""} + {Sub Binary 4 "" "-" "" ""} + {LShift Binary 5 "" "<<" "" ""} + {RShift Binary 5 "" ">>" "" ""} + {Less Binary 6 "" "<" "" ""} + {LtEq Binary 6 "" "<=" "" ""} + {Grtr Binary 6 "" ">" "" ""} + {GrEq Binary 6 "" ">=" "" ""} + {EqEq Binary 7 "" "==" "" ""} + {NtEq Binary 7 "" "!=" "" ""} + {BitAnd Binary 8 "" "&" "" ""} + {BitXor Binary 9 "" "^" "" ""} + {BitOr Binary 10 "" "|" "" ""} + {LogAnd Binary 11 "" "&&" "" ""} + {LogOr Binary 12 "" "||" "" ""} + {Define Binary 13 "" "=" "" ""} } @enum E2_OpKind: diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 549258ef..f0a3a07a 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -3762,6 +3762,13 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } + //- TODO(rjf): Try to statically evaluate the expression here if possible + // (or maybe intermixed above? investigate...), to reduce to simpler bytecode + // forms - reduce pressure on pattern matching + { + // TODO(rjf) + } + //- rjf: apply RDI byte offsets to jump ops { // TODO(rjf): apply RDI byte offsets to jump ops From c411895db5c9cf318d9ede72de2a1dcab12029af Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 18 Jun 2026 08:04:32 -0700 Subject: [PATCH 809/850] sketch out & get building rdi_from_codeview, extract ~90% of pdb conversion into only working given codeview info *or* something the linker could produce --- project.4coder | 2 +- src/radbin/radbin_main.c | 2 + src/rdi_from_codeview/rdi_from_codeview.c | 5075 +++++++++++++++++++++ src/rdi_from_codeview/rdi_from_codeview.h | 223 + 4 files changed, 5301 insertions(+), 1 deletion(-) create mode 100644 src/rdi_from_codeview/rdi_from_codeview.c create mode 100644 src/rdi_from_codeview/rdi_from_codeview.h diff --git a/project.4coder b/project.4coder index 865b05ec..26b9969f 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build ryan_scratch no_meta", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin no_meta", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/radbin/radbin_main.c b/src/radbin/radbin_main.c index 5a7e7bcf..3c1fb526 100644 --- a/src/radbin/radbin_main.c +++ b/src/radbin/radbin_main.c @@ -40,6 +40,7 @@ #include "arch/arch_inc.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" +#include "rdi_from_codeview/rdi_from_codeview.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "rdi_from_dwarf/rdi_from_dwarf.h" #include "radbin/radbin.h" @@ -75,6 +76,7 @@ #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" #include "rdi_from_pdb/rdi_from_pdb.c" +#include "rdi_from_codeview/rdi_from_codeview.c" #include "rdi_from_dwarf/rdi_from_dwarf.c" #include "radbin/radbin.c" diff --git a/src/rdi_from_codeview/rdi_from_codeview.c b/src/rdi_from_codeview/rdi_from_codeview.c new file mode 100644 index 00000000..73641b60 --- /dev/null +++ b/src/rdi_from_codeview/rdi_from_codeview.c @@ -0,0 +1,5075 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 +cv2r_end_of_cplusplus_container_name(String8 str) +{ + // NOTE: This finds the index one past the last "::" contained in str. + // if no "::" is contained in str, then the returned index is 0. + // The intent is that [0,clamp_bot(0,result - 2)) gives the + // "container name" and [result,str.size) gives the leaf name. + U64 result = 0; + if(str.size >= 2) + { + S64 template_nest_depth = 0; + for(U64 i = str.size; i >= 2; i -= 1) + { + if(template_nest_depth == 0 && str.str[i - 2] == ':' && str.str[i - 1] == ':') + { + result = i; + break; + } + if(str.str[i-1] == '>') + { + template_nest_depth += 1; + } + else if(str.str[i-1] == '<') + { + template_nest_depth -= 1; + template_nest_depth = ClampBot(template_nest_depth, 0); + } + } + } + return result; +} + +internal U64 +cv2r_hash_from_voff(U64 voff) +{ + U64 hash = (voff >> 3) ^ ((7 & voff) << 6); + return hash; +} + +internal int +cv2r_namespace_node_is_before(void *raw_a, void *raw_b) +{ + CV2R_NamespaceNode **a = (CV2R_NamespaceNode **)raw_a, **b = (CV2R_NamespaceNode **)raw_b; + return (str8_compar(a[0]->string, b[0]->string, 0) < 0); +} + +internal U64 +cv2r_voff_from_soff(CV2R_Section *sections, U64 sections_count, U64 sec_num, U64 soff) +{ + U64 result = 0; + if(0 < sec_num && sec_num <= sections_count) + { + result = sections[sec_num-1].voff + soff; + } + return result; +} + +//////////////////////////////// +//~ rjf: String Table Functions + +internal String8 +cv2r_string_from_off(CV2R_StringTable *strtbl, U64 off) +{ + U32 strblock_max = strtbl->strblock_max; + U32 full_off_raw = strtbl->strblock_min + off; + U32 full_off = ClampTop(full_off_raw, strblock_max); + String8 result = str8_cstring_capped((char*)(strtbl->data.str + full_off), + (char*)(strtbl->data.str + strblock_max)); + return result; +} + +//////////////////////////////// +//~ rjf: Compilation Unit Contribution Functions + +internal CV2R_CompUnitContribution * +cv2r_comp_unit_contribution_from_voff__binary_search(CV2R_CompUnitContribution *contributions, U64 contributions_count, U64 voff) +{ + CV2R_CompUnitContribution *result = 0; + if(contributions_count != 0) + { + U64 first_idx = 0; + U64 last_idx = contributions_count-1; + for(;first_idx < last_idx;) + { + U64 mid_idx = (last_idx + first_idx) / 2; + U64 mid_voff_first = contributions[mid_idx].voff_first; + U64 mid_voff_opl = contributions[mid_idx].voff_opl; + if(voff < mid_voff_first) + { + last_idx = mid_idx; + } + else if(mid_voff_opl <= voff) + { + first_idx = mid_idx+1; + } + else + { + result = &contributions[mid_idx]; + break; + } + } + } + return result; +} + +//////////////////////////////// +//~ rjf: TPI Hash Table Functions + +internal U32 +cv2r_tpi_hash_from_data(String8 string) +{ + U32 result = 0; + U8 *ptr = string.str; + for(U8 *opl = ptr + (string.size & (~3)); ptr < opl; ptr += 4) + { + result ^= memory_read32(ptr); + } + if((string.size & 2) != 0) + { + result ^= memory_read16(ptr); ptr += 2; + } + if((string.size & 1) != 0) + { + result ^= memory_read8(ptr); + } + result |= 0x20202020; + result ^= (result >> 11); + result ^= (result >> 16); + return result; +} + +internal CV_TypeIdArray +cv2r_itypes_from_name(Arena *arena, CV2R_TPIHash *tpi_hash, CV_LeafParsed *leaf, String8 name, B32 compare_unique_name, U32 output_cap) +{ + CV_TypeIdArray result = {0}; + if(tpi_hash->bucket_count != 0) + { + Temp scratch = scratch_begin(&arena, 1); + U32 hash = cv2r_tpi_hash_from_data(name); + U32 bucket_idx = ((tpi_hash->bucket_mask != 0) ? + hash&tpi_hash->bucket_mask : + hash%tpi_hash->bucket_count); + CV_TypeId itype_first = leaf->itype_first; + CV_TypeId itype_opl = leaf->itype_opl; + String8 data = leaf->data; + struct Chain + { + struct Chain *next; + CV_TypeId itype; + }; + struct Chain *first = 0; + struct Chain *last = 0; + U32 count = 0; + + for(CV2R_TPIHashBlock *block = tpi_hash->buckets[bucket_idx]; + block != 0; + block = block->next) + { + U32 local_count = block->local_count; + CV_TypeId *itype_ptr = block->itypes; + for (U32 i = 0; i < local_count; i += 1, itype_ptr += 1){ + + String8 extracted_name = {0}; + + CV_TypeId itype = *itype_ptr; + if (itype_first <= itype && itype < itype_opl){ + CV_RecRange *range = &leaf->leaf_ranges.ranges[itype - leaf->itype_first]; + if (range->off + range->hdr.size <= data.size){ + U8 *first = data.str + range->off + 2; + U64 cap = range->hdr.size - 2; + + switch (range->hdr.kind){ + default:break; + + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + if (sizeof(CV_LeafStruct) <= cap){ + CV_LeafStruct *lf_struct = (CV_LeafStruct*)first; + + if (!(lf_struct->props & CV_TypeProp_FwdRef)){ + // size + U8 *numeric_ptr = (U8*)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); + + // name + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); + + // unique name + if (compare_unique_name){ + if (lf_struct->props & CV_TypeProp_HasUniqueName) { + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); + extracted_name = unique_name; + } + } + else{ + extracted_name = name; + } + } + } + }break; + + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + if (sizeof(CV_LeafStruct2) <= cap){ + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first; + + if (!(lf_struct->props & CV_TypeProp_FwdRef)){ + // size + U8 *numeric_ptr = (U8*)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); + + // name + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); + + // unique name + if (compare_unique_name){ + if (lf_struct->props & CV_TypeProp_HasUniqueName) { + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); + extracted_name = unique_name; + } + } + else{ + extracted_name = name; + } + } + } + }break; + + case CV_LeafKind_UNION: + { + if (sizeof(CV_LeafUnion) <= cap){ + CV_LeafUnion *lf_union = (CV_LeafUnion*)first; + + if (!(lf_union->props & CV_TypeProp_FwdRef)){ + // size + U8 *numeric_ptr = (U8*)(lf_union + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap); + + // name + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); + + // unique name + if (compare_unique_name){ + if (lf_union->props & CV_TypeProp_HasUniqueName) { + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); + extracted_name = unique_name; + } + } + else{ + extracted_name = name; + } + } + } + }break; + + case CV_LeafKind_ENUM: + { + if (sizeof(CV_LeafEnum) <= cap){ + CV_LeafEnum *lf_enum = (CV_LeafEnum*)first; + + if (!(lf_enum->props & CV_TypeProp_FwdRef)){ + // name + U8 *name_ptr = (U8*)(lf_enum + 1); + String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap)); + + // unique name + if (compare_unique_name){ + if (lf_enum->props & CV_TypeProp_HasUniqueName) { + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap)); + extracted_name = unique_name; + } + } + else{ + extracted_name = name; + } + } + } + }break; + } + } + } + + if (str8_match(extracted_name, name, 0)){ + struct Chain *chain = push_array(scratch.arena, struct Chain, 1); + SLLQueuePush(first, last, chain); + count += 1; + chain->itype = itype; + if (count == output_cap){ + goto dblbreak; + } + } + } + } + + dblbreak:; + + + // assemble result + CV_TypeId *itypes = push_array_aligned(arena, CV_TypeId, count, 8); + { + CV_TypeId *itype_ptr = itypes; + for (struct Chain *node = first; + node != 0; + node = node->next, itype_ptr += 1){ + *itype_ptr = node->itype; + } + } + result.itypes = itypes; + result.count = count; + + scratch_end(scratch); + } + return result; +} + +internal CV_TypeId +cv2r_first_itype_from_name(CV2R_TPIHash *tpi_hash, CV_LeafParsed *tpi_leaf, String8 name, B32 compare_unique_name) +{ + +} + +//////////////////////////////// +//~ rjf: CodeView => RDI Canonical Conversions + +internal RDI_Arch +cv2r_rdi_arch_from_cv_arch(CV_Arch arch) +{ + RDI_Arch result = 0; + switch(arch) + { + case CV_Arch_8086:{}break; + case CV_Arch_X64:{result = RDI_Arch_X64;}break; + //case CV_Arch_8080: break; + //case CV_Arch_80286: break; + //case CV_Arch_80386: break; + //case CV_Arch_80486: break; + //case CV_Arch_PENTIUM: break; + //case CV_Arch_PENTIUMII: break; + //case CV_Arch_PENTIUMIII: break; + //case CV_Arch_MIPS: break; + //case CV_Arch_MIPS16: break; + //case CV_Arch_MIPS32: break; + //case CV_Arch_MIPS64: break; + //case CV_Arch_MIPSI: break; + //case CV_Arch_MIPSII: break; + //case CV_Arch_MIPSIII: break; + //case CV_Arch_MIPSIV: break; + //case CV_Arch_MIPSV: break; + //case CV_Arch_M68000: break; + //case CV_Arch_M68010: break; + //case CV_Arch_M68020: break; + //case CV_Arch_M68030: break; + //case CV_Arch_M68040: break; + //case CV_Arch_ALPHA: break; + //case CV_Arch_ALPHA_21164: break; + //case CV_Arch_ALPHA_21164A: break; + //case CV_Arch_ALPHA_21264: break; + //case CV_Arch_ALPHA_21364: break; + //case CV_Arch_PPC601: break; + //case CV_Arch_PPC603: break; + //case CV_Arch_PPC604: break; + //case CV_Arch_PPC620: break; + //case CV_Arch_PPCFP: break; + //case CV_Arch_PPCBE: break; + //case CV_Arch_SH3: break; + //case CV_Arch_SH3E: break; + //case CV_Arch_SH3DSP: break; + //case CV_Arch_SH4: break; + //case CV_Arch_SHMEDIA: break; + //case CV_Arch_ARM3: break; + //case CV_Arch_ARM4: break; + //case CV_Arch_ARM4T: break; + //case CV_Arch_ARM5: break; + //case CV_Arch_ARM5T: break; + //case CV_Arch_ARM6: break; + //case CV_Arch_ARM_XMAC: break; + //case CV_Arch_ARM_WMMX: break; + //case CV_Arch_ARM7: break; + //case CV_Arch_OMNI: break; + //case CV_Arch_IA64_1: break; + //case CV_Arch_IA64_2: break; + //case CV_Arch_CEE: break; + //case CV_Arch_AM33: break; + //case CV_Arch_M32R: break; + //case CV_Arch_TRICORE: break; + //case CV_Arch_EBC: break; + //case CV_Arch_THUMB: break; + //case CV_Arch_ARMNT: break; + //case CV_Arch_ARM64: break; + //case CV_Arch_D3D11_SHADER: break; + } + return result; +} + +internal RDI_RegCode +cv2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) +{ + RDI_RegCode result = 0; + switch(arch) + { + case RDI_Arch_X64: + { + switch(reg_code) + { +#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break; + CV_Reg_X64_XList(X) +#undef X + } + }break; + } + return(result); +} + +internal RDI_Language +cv2r_rdi_language_from_cv_language(CV_Language language) +{ + RDI_Language result = 0; + switch(language) + { + case CV_Language_C: result = RDI_Language_C; break; + case CV_Language_CXX: result = RDI_Language_CPlusPlus; break; + //case CV_Language_FORTRAN: result = ; break; + //case CV_Language_MASM: result = ; break; + //case CV_Language_PASCAL: result = ; break; + //case CV_Language_BASIC: result = ; break; + //case CV_Language_COBOL: result = ; break; + //case CV_Language_LINK: result = ; break; + //case CV_Language_CVTRES: result = ; break; + //case CV_Language_CVTPGD: result = ; break; + //case CV_Language_CSHARP: result = ; break; + //case CV_Language_VB: result = ; break; + //case CV_Language_ILASM: result = ; break; + //case CV_Language_JAVA: result = ; break; + //case CV_Language_JSCRIPT: result = ; break; + //case CV_Language_MSIL: result = ; break; + //case CV_Language_HLSL: result = ; break; + } + return(result); +} + +internal RDI_TypeKind +cv2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) +{ + RDI_TypeKind result = RDI_TypeKind_Null; + switch(basic_type) + { + case CV_BasicType_VOID: {result = RDI_TypeKind_Void;}break; + case CV_BasicType_HRESULT: {result = RDI_TypeKind_HResult;}break; + + case CV_BasicType_RCHAR: + case CV_BasicType_CHAR: + case CV_BasicType_CHAR8: + {result = RDI_TypeKind_Char8;}break; + + case CV_BasicType_UCHAR: {result = RDI_TypeKind_UChar8;}break; + case CV_BasicType_WCHAR: {result = RDI_TypeKind_UChar16;}break; + case CV_BasicType_CHAR16: {result = RDI_TypeKind_Char16;}break; + case CV_BasicType_CHAR32: {result = RDI_TypeKind_Char32;}break; + + case CV_BasicType_BOOL8: + case CV_BasicType_INT8: + {result = RDI_TypeKind_S8;}break; + + case CV_BasicType_BOOL16: + case CV_BasicType_INT16: + case CV_BasicType_SHORT: + {result = RDI_TypeKind_S16;}break; + + case CV_BasicType_BOOL32: + case CV_BasicType_INT32: + case CV_BasicType_LONG: + {result = RDI_TypeKind_S32;}break; + + case CV_BasicType_BOOL64: + case CV_BasicType_INT64: + case CV_BasicType_QUAD: + {result = RDI_TypeKind_S64;}break; + + case CV_BasicType_INT128: + case CV_BasicType_OCT: + {result = RDI_TypeKind_S128;}break; + + case CV_BasicType_UINT8: {result = RDI_TypeKind_U8;}break; + + case CV_BasicType_UINT16: + case CV_BasicType_USHORT: + {result = RDI_TypeKind_U16;}break; + + case CV_BasicType_UINT32: + case CV_BasicType_ULONG: + {result = RDI_TypeKind_U32;}break; + + case CV_BasicType_UINT64: + case CV_BasicType_UQUAD: + {result = RDI_TypeKind_U64;}break; + + case CV_BasicType_UINT128: + case CV_BasicType_UOCT: + {result = RDI_TypeKind_U128;}break; + + case CV_BasicType_FLOAT16:{result = RDI_TypeKind_F16;}break; + case CV_BasicType_FLOAT32:{result = RDI_TypeKind_F32;}break; + case CV_BasicType_FLOAT32PP:{result = RDI_TypeKind_F32PP;}break; + case CV_BasicType_FLOAT48:{result = RDI_TypeKind_F48;}break; + case CV_BasicType_FLOAT64:{result = RDI_TypeKind_F64;}break; + case CV_BasicType_FLOAT80:{result = RDI_TypeKind_F80;}break; + case CV_BasicType_FLOAT128:{result = RDI_TypeKind_F128;}break; + case CV_BasicType_COMPLEX32:{result = RDI_TypeKind_ComplexF32;}break; + case CV_BasicType_COMPLEX64:{result = RDI_TypeKind_ComplexF64;}break; + case CV_BasicType_COMPLEX80:{result = RDI_TypeKind_ComplexF80;}break; + case CV_BasicType_COMPLEX128:{result = RDI_TypeKind_ComplexF128;}break; + case CV_BasicType_PTR:{result = RDI_TypeKind_Handle;}break; + } + return result; +} + +internal RDI_ChecksumKind +cv2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k) +{ + RDI_ChecksumKind result = RDI_ChecksumKind_NULL; + switch((CV_C13ChecksumKindEnum)k) + { + case CV_C13ChecksumKind_Null: {result = RDI_ChecksumKind_NULL;}break; + case CV_C13ChecksumKind_MD5: {result = RDI_ChecksumKind_MD5;}break; + case CV_C13ChecksumKind_SHA1: {result = RDI_ChecksumKind_SHA1;}break; + case CV_C13ChecksumKind_SHA256:{result = RDI_ChecksumKind_SHA256;}break; + } + return result; +} + +//////////////////////////////// +//~ rjf: Location Info Building Helpers + +internal RDI_RegCode +cv2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg) +{ + RDI_RegCode result = 0; + switch(arch) + { + case RDI_Arch_X64: + { + switch(encoded_reg) + { + case CV_EncodedFramePtrReg_StackPtr: + { + result = RDI_RegCodeX64_rsp; + }break; + case CV_EncodedFramePtrReg_FramePtr: + { + result = RDI_RegCodeX64_rbp; + }break; + case CV_EncodedFramePtrReg_BasePtr: + { + result = RDI_RegCodeX64_r13; + }break; + } + }break; + } + return result; +} + +internal RDIM_Location +cv2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection) +{ + RDIM_Location result = {0}; + if(0 <= offset && offset <= (S64)max_U16) + { + if(extra_indirection) + { + result.kind = RDI_LocationKind_AddrAddrRegPlusOff; + result.reg_code = reg_code; + result.offset = offset; + } + else + { + result.kind = RDI_LocationKind_AddrRegPlusOff; + result.reg_code = reg_code; + result.offset = offset; + } + } + else + { + RDIM_EvalBytecode bytecode = {0}; + U32 regread_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, regread_param); + rdim_bytecode_push_sconst(arena, &bytecode, offset); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); + if(extra_indirection) + { + U64 addr_size = rdi_addr_size_from_arch(arch); + rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size); + } + result.kind = RDI_LocationKind_AddrBytecodeStream; + result.bytecode = bytecode; + } + return result; +} + +internal void +cv2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, Rng1U64 voff_range, CV_LvarAddrGap *gaps, U64 gap_count) +{ + //- rjf: emit location for ranges not coverd by gaps + CV_LvarAddrGap *gap_ptr = gaps; + U64 voff_cursor = voff_range.min; + for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) + { + U64 voff_gap_first = voff_range.min + gap_ptr->off; + U64 voff_gap_opl = voff_gap_first + gap_ptr->len; + if(voff_cursor < voff_gap_first) + { + RDIM_Rng1U64 truncated_voff_range = {voff_cursor, voff_gap_first}; + rdim_location_case_list_push(arena, loc_cases, loc, truncated_voff_range); + } + voff_cursor = voff_gap_opl; + } + + //- rjf: emit remaining range + if(voff_cursor < voff_range.max) + { + RDIM_Rng1U64 remaining_voff_range = {voff_cursor, voff_range.max}; + rdim_location_case_list_push(arena, loc_cases, loc, remaining_voff_range); + } +} + +//////////////////////////////// +//~ rjf: Top-Level Conversion Entry Point + +internal RDIM_BakeParams +cv2r_convert(Arena *arena, CV2R_ConvertParams *params) +{ + Temp scratch = scratch_begin(&arena, 1); + + ////////////////////////////////////////////////////////////// + //- rjf: unpack params + // + U64 all_syms_count = params->all_syms_count; + CV_SymParsed **all_syms = params->all_syms; + CV_C13Parsed **all_c13s = params->all_c13s; + U64 comp_units_count = params->comp_units_count; + CV2R_CompUnit *comp_units = params->comp_units; + U64 sections_count = params->sections_count; + CV2R_Section *sections = params->sections; + CV2R_StringTable *strtbl = params->strtbl; + CV_LeafParsed *tpi_leaf = params->tpi_leaf; + CV_LeafParsed *ipi_leaf = params->ipi_leaf; + CV2R_TPIHash *tpi_hash = params->tpi_hash; + CV2R_TPIHash *ipi_hash = params->ipi_hash; + + ////////////////////////////////////////////////////////////// + //- rjf: hash EXE + // + U64 exe_hash = 0; + if(lane_idx() == lane_from_task_idx(0)) ProfScope("hash EXE") + { + exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size); + } + lane_sync_u64(&exe_hash, 0); + + ////////////////////////////////////////////////////////////// + //- rjf: determine architecture + // + RDI_Arch arch = RDI_Arch_NULL; + U64 arch_addr_size = 0; + { + for EachIndex(idx, all_syms_count) + { + arch = cv2r_rdi_arch_from_cv_arch(all_syms[idx]->info.arch); + if(arch != RDI_Arch_NULL) + { + break; + } + } + arch_addr_size = rdi_addr_size_from_arch(arch); + } + + ////////////////////////////////////////////////////////////// + //- rjf: predict total symbol count + // + U64 symbol_count_prediction = 0; + { + U64 *symbol_count_prediction_ptr = &symbol_count_prediction; + lane_sync_u64(&symbol_count_prediction_ptr, 0); + U64 lane_sym_count = 0; + Rng1U64 range = lane_range(all_syms_count); + for EachInRange(idx, range) + { + lane_sym_count += all_syms[idx]->sym_ranges.count; + } + ins_atomic_u64_add_eval(symbol_count_prediction_ptr, lane_sym_count); + lane_sync(); + symbol_count_prediction = *symbol_count_prediction_ptr; + } + + ////////////////////////////////////////////////////////////// + //- rjf: build link name map + // + CV2R_LinkNameMap *link_name_map = 0; + ProfScope("build link name map") if(all_syms_count != 0 && lane_idx() == 0) + { + // rjf: set up + { + link_name_map = push_array(scratch.arena, CV2R_LinkNameMap, 1); + link_name_map->buckets_count = Max(1, symbol_count_prediction); + link_name_map->buckets = push_array(scratch.arena, CV2R_LinkNameNode *, link_name_map->buckets_count); + } + + // rjf: fill + if(params->subset_flags & RDIM_SubsetFlag_Procedures) + { + CV_SymParsed *sym = all_syms[0]; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + case CV_SymKind_PUB32: + { + // rjf: unpack sym + CV_SymPub32 *pub32 = (CV_SymPub32 *)iter.struct_base; + String8 name = str8_cstring_capped(pub32+1, iter.opl); + U64 voff = cv2r_voff_from_soff(sections, sections_count, pub32->sec, pub32->off); + + // rjf: commit to link name map + U64 hash = cv2r_hash_from_voff(voff); + U64 bucket_idx = hash%link_name_map->buckets_count; + CV2R_LinkNameNode *node = push_array(scratch.arena, CV2R_LinkNameNode, 1); + SLLStackPush(link_name_map->buckets[bucket_idx], node); + node->voff = voff; + node->name = name; + }break; + } + } + } + } + lane_sync_u64(&link_name_map, 0); + + ////////////////////////////////////////////////////////////// + //- rjf: gather all file paths + // + CV2R_SrcFileStubArray *unit_file_stubs = 0; + U64Array *unit_file_paths_hashes = 0; + ProfScope("gather all file paths") + { + //- rjf: prep outputs + ProfScope("prep outputs") if(lane_idx() == 0) + { + unit_file_stubs = push_array(scratch.arena, CV2R_SrcFileStubArray, comp_units_count + 1); + unit_file_paths_hashes = push_array(scratch.arena, U64Array, comp_units_count + 1); + } + lane_sync_u64(&unit_file_stubs, 0); + lane_sync_u64(&unit_file_paths_hashes, 0); + + //- rjf: do wide gather + ProfScope("do wide gather") + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: build local hash table to dedup files within this lane + U64 hit_path_slots_count = 4096; + String8Node **hit_path_slots = push_array(scratch2.arena, String8Node *, hit_path_slots_count); + + //- rjf: take units across lanes, find all file paths + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + ProfScope("take units across lanes, find all file paths") + for(;;) + { + //- rjf: take next unit + U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(unit_idx >= comp_units_count + 1) + { + break; + } + + //- rjf: unpack unit + CV_SymParsed *sym = all_syms[unit_idx]; + CV_C13Parsed *c13 = all_c13s[unit_idx]; + + //- rjf: produce obj name/path + String8 obj_name = str8_lit("*global*"); + if(unit_idx > 0) + { + obj_name = comp_units[unit_idx-1].obj_name; + if(str8_match(obj_name, str8_lit("* Linker *"), 0) || + str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) + { + MemoryZeroStruct(&obj_name); + } + } + String8 obj_folder_path = backslashed_from_str8(scratch2.arena, str8_chop_last_slash(obj_name)); + + //- rjf: find all inline site symbols & gather file stubs + CV2R_SrcFileStubNode *first_src_file_stub = 0; + CV2R_SrcFileStubNode *last_src_file_stub = 0; + U64 src_file_stub_count = 0; + U64 base_voff = 0; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + + //- rjf: LPROC32/GPROC32 (gather base address) + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + base_voff = cv2r_voff_from_soff(sections, sections_count, proc32->sec, proc32->off); + }break; + + //- rjf: INLINESITE + case CV_SymKind_INLINESITE: + { + // rjf: unpack sym + CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; + String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); + + // rjf: map inlinee -> parsed cv c13 inlinee line info + CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0; + { + U64 hash = cv_hash_from_item_id(sym->inlinee); + U64 slot_idx = hash%c13->inlinee_lines_parsed_slots_count; + for(CV_C13InlineeLinesParsedNode *n = c13->inlinee_lines_parsed_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->v.inlinee == sym->inlinee) + { + inlinee_lines_parsed = &n->v; + break; + } + } + } + + // rjf: build line table, fill with parsed binary annotations + if(inlinee_lines_parsed != 0) + { + // rjf: grab checksums sub-section + CV_C13SubSectionNode *file_chksms = c13->file_chksms_sub_section; + + // rjf: gathered lines + U32 last_file_off = max_U32; + U32 curr_file_off = max_U32; + U64 line_count = 0; + CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(inlinee_lines_parsed->file_off, inlinee_lines_parsed->first_source_ln, base_voff); + for(;;) + { + // rjf: step & update + CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots); + if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitFile) + { + last_file_off = curr_file_off; + curr_file_off = step.file_off; + } + if(step.flags == 0 && line_count > 0) + { + last_file_off = curr_file_off; + curr_file_off = max_U32; + } + + // rjf: file updated -> gather new file name + if(last_file_off != max_U32 && last_file_off != curr_file_off) + { + String8 seq_file_name = {0}; + CV_C13ChecksumKind checksum_kind = CV_C13ChecksumKind_Null; + String8 checksum_value = {0}; + if(last_file_off + sizeof(CV_C13Checksum) <= file_chksms->size) + { + CV_C13Checksum *checksum = (CV_C13Checksum *)(c13->data.str + file_chksms->off + last_file_off); + U32 name_off = checksum->name_off; + seq_file_name = cv2r_string_from_off(strtbl, name_off); + checksum_kind = checksum->kind; + checksum_value = str8_skip(c13->data, file_chksms->off + last_file_off + sizeof(*checksum)); + checksum_value.size = Min(checksum->len, checksum_value.size); + } + + // rjf: file name -> sanitized file path + String8 file_path = seq_file_name; + String8 file_path_sanitized = str8_copy(scratch2.arena, str8_skip_chop_whitespace(file_path)); + { + PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); + String8List file_path_sanitized_parts = str8_split_path(scratch2.arena, file_path_sanitized); + if(file_path_sanitized_style == PathStyle_Relative) + { + String8List obj_folder_path_parts = str8_split_path(scratch2.arena, obj_folder_path); + str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); + file_path_sanitized_parts = obj_folder_path_parts; + file_path_sanitized_style = path_style_from_str8(obj_folder_path); + } + str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); + file_path_sanitized = str8_path_list_join_by_style(scratch2.arena, &file_path_sanitized_parts, file_path_sanitized_style); + } + + // rjf: sanitized file path -> source file node + U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); + U64 hit_path_slot = file_path_sanitized_hash%hit_path_slots_count; + String8Node *hit_path_node = 0; + for(String8Node *n = hit_path_slots[hit_path_slot]; n != 0; n = n->next) + { + if(str8_match(n->string, file_path_sanitized, 0)) + { + hit_path_node = n; + break; + } + } + if(hit_path_node == 0) + { + hit_path_node = push_array(scratch2.arena, String8Node, 1); + SLLStackPush(hit_path_slots[hit_path_slot], hit_path_node); + hit_path_node->string = file_path_sanitized; + CV2R_SrcFileStubNode *stub_n = push_array(scratch2.arena, CV2R_SrcFileStubNode, 1); + SLLQueuePush(first_src_file_stub, last_src_file_stub, stub_n); + src_file_stub_count += 1; + stub_n->v.file_path = str8_copy(scratch.arena, file_path_sanitized); + stub_n->v.checksum_kind = checksum_kind; + stub_n->v.checksum = str8_copy(scratch.arena, checksum_value); + } + line_count = 0; + } + + // rjf: count lines + if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitLine) + { + line_count += 1; + } + + // rjf: no more flags -> done + if(step.flags == 0) + { + break; + } + } + } + }break; + } + } + + // rjf: find all files in this unit's (non-inline) line info + if(c13 != 0) + { + ProfScope("find all files in this unit's (non-inline) line info") + for(CV_C13SubSectionNode *node = c13->first_sub_section; + node != 0; + node = node->next) + { + if(node->kind == CV_C13SubSectionKind_Lines) + { + for(CV_C13LinesParsedNode *lines_n = node->lines_first; + lines_n != 0; + lines_n = lines_n->next) + { + // rjf: file name -> sanitized file path + String8 file_path = lines_n->v.file_name; + String8 file_path_sanitized = str8_copy(scratch2.arena, str8_skip_chop_whitespace(file_path)); + { + PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); + String8List file_path_sanitized_parts = str8_split_path(scratch2.arena, file_path_sanitized); + if(file_path_sanitized_style == PathStyle_Relative) + { + String8List obj_folder_path_parts = str8_split_path(scratch2.arena, obj_folder_path); + str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); + file_path_sanitized_parts = obj_folder_path_parts; + file_path_sanitized_style = path_style_from_str8(obj_folder_path); + } + str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); + file_path_sanitized = str8_path_list_join_by_style(scratch2.arena, &file_path_sanitized_parts, file_path_sanitized_style); + } + + // rjf: sanitized file path -> source file node + U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); + U64 hit_path_slot = file_path_sanitized_hash%hit_path_slots_count; + String8Node *hit_path_node = 0; + for(String8Node *n = hit_path_slots[hit_path_slot]; n != 0; n = n->next) + { + if(str8_match(n->string, file_path_sanitized, 0)) + { + hit_path_node = n; + break; + } + } + if(hit_path_node == 0) + { + hit_path_node = push_array(scratch2.arena, String8Node, 1); + SLLStackPush(hit_path_slots[hit_path_slot], hit_path_node); + hit_path_node->string = file_path_sanitized; + CV2R_SrcFileStubNode *stub_n = push_array(scratch2.arena, CV2R_SrcFileStubNode, 1); + SLLQueuePush(first_src_file_stub, last_src_file_stub, stub_n); + src_file_stub_count += 1; + stub_n->v.file_path = str8_copy(scratch.arena, file_path_sanitized); + stub_n->v.checksum_kind = lines_n->v.checksum_kind; + stub_n->v.checksum = str8_copy(scratch.arena, lines_n->v.checksum); + } + } + } + } + } + + //- rjf: merge into array for this unit + unit_file_stubs[unit_idx].count = src_file_stub_count; + unit_file_stubs[unit_idx].v = push_array_no_zero(scratch.arena, CV2R_SrcFileStub, unit_file_stubs[unit_idx].count); + { + U64 idx = 0; + for EachNode(n, CV2R_SrcFileStubNode, first_src_file_stub) + { + unit_file_stubs[unit_idx].v[idx] = n->v; + idx += 1; + } + } + + //- rjf: hash this unit's file paths + U64Array hashes = {0}; + hashes.count = unit_file_stubs[unit_idx].count; + hashes.v = push_array(scratch.arena, U64, hashes.count); + for EachIndex(idx, unit_file_stubs[unit_idx].count) + { + hashes.v[idx] = rdi_hash(unit_file_stubs[unit_idx].v[idx].file_path.str, unit_file_stubs[unit_idx].v[idx].file_path.size); + } + unit_file_paths_hashes[unit_idx] = hashes; + } + lane_sync(); + + scratch_end(scratch2); + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: build unified collection & map for source files + // + RDIM_SrcFileChunkList *all_src_files__sequenceless = 0; + CV2R_SrcFileMap *src_file_map = 0; + if(lane_idx() == 0 && params->subset_flags & (RDIM_SubsetFlag_NormalSourcePathNameMap| + RDIM_SubsetFlag_LineInfo| + RDIM_SubsetFlag_InlineLineInfo)) + { + //- rjf: set up table + U64 total_path_count = 0; + ProfScope("set up table") + { + all_src_files__sequenceless = push_array(scratch.arena, RDIM_SrcFileChunkList, 1); + src_file_map = push_array(scratch.arena, CV2R_SrcFileMap, 1); + for EachIndex(idx, comp_units_count) + { + total_path_count += unit_file_stubs[idx].count; + } + src_file_map->slots_count = total_path_count + total_path_count/2 + 1; + src_file_map->slots = push_array(scratch.arena, CV2R_SrcFileNode *, src_file_map->slots_count); + } + + //- rjf: fill table + ProfScope("fill table") + { + for EachIndex(idx, comp_units_count) + { + CV2R_SrcFileStubArray stubs = unit_file_stubs[idx]; + U64Array hashes = unit_file_paths_hashes[idx]; + for EachIndex(stub_idx, stubs.count) + { + String8 file_path_sanitized = stubs.v[stub_idx].file_path; + CV_C13ChecksumKind c13_checksum_kind = stubs.v[stub_idx].checksum_kind; + String8 checksum = stubs.v[stub_idx].checksum; + U64 file_path_sanitized_hash = hashes.v[stub_idx]; + U64 src_file_slot = file_path_sanitized_hash%src_file_map->slots_count; + CV2R_SrcFileNode *src_file_node = 0; + for(CV2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next) + { + if(str8_match(n->src_file->path, file_path_sanitized, 0)) + { + src_file_node = n; + break; + } + } + if(src_file_node == 0) + { + src_file_node = push_array(arena, CV2R_SrcFileNode, 1); + SLLStackPush(src_file_map->slots[src_file_slot], src_file_node); + src_file_node->src_file = rdim_src_file_chunk_list_push(arena, all_src_files__sequenceless, total_path_count); + src_file_node->src_file->path = str8_copy(arena, file_path_sanitized); + src_file_node->src_file->checksum_kind = p2r_rdi_from_cv_c13_checksum_kind(c13_checksum_kind); + src_file_node->src_file->checksum = str8_copy(arena, checksum); + } + } + } + } + } + lane_sync_u64(&all_src_files__sequenceless, 0); + lane_sync_u64(&src_file_map, 0); + + ////////////////////////////////////////////////////////////// + //- rjf: convert unit header info + // + RDIM_UnitChunkList *all_units_ptr = 0; + RDIM_LineTableChunkList *units_line_tables = 0; + RDIM_LineTable **units_first_inline_site_line_tables = 0; + ProfScope("convert unit header info") + { + //- rjf: set up outputs + ProfScope("set up outputs") if(lane_idx() == 0) + { + all_units_ptr = push_array(scratch.arena, RDIM_UnitChunkList, 1); + if(params->subset_flags & RDIM_SubsetFlag_Units) + { + for EachIndex(idx, comp_units_count + 1) + { + rdim_unit_chunk_list_push(arena, all_units_ptr, comp_units_count + 1); + } + } + units_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, comp_units_count + 1); + units_first_inline_site_line_tables = push_array(scratch.arena, RDIM_LineTable *, comp_units_count + 1); + } + lane_sync_u64(&all_units_ptr, 0); + lane_sync_u64(&units_line_tables, 0); + lane_sync_u64(&units_first_inline_site_line_tables, 0); + RDIM_Unit *units = all_units_ptr->first ? all_units_ptr->first->v : 0; + U64 units_count = all_units_ptr->first ? all_units_ptr->first->count : 0; + + //- rjf: do per-lane work + if(params->subset_flags & (RDIM_SubsetFlag_Units| + RDIM_SubsetFlag_NormalSourcePathNameMap| + RDIM_SubsetFlag_LineInfo| + RDIM_SubsetFlag_InlineLineInfo)) + { + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + ProfScope("wide fill") for(;;) + { + //- rjf: take next unit + U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(unit_idx >= units_count) + { + break; + } + Temp scratch = scratch_begin(&arena, 1); + RDIM_LineTableChunkList *dst_line_tables = &units_line_tables[unit_idx]; + CV2R_CompUnit *src_unit = (unit_idx > 0 ? &comp_units[unit_idx-1] : 0); + CV_SymParsed *src_unit_sym = all_syms[unit_idx]; + CV_C13Parsed *src_unit_c13 = all_c13s[unit_idx]; + RDIM_Unit *dst_unit = 0; + if(params->subset_flags & RDIM_SubsetFlag_Units) { dst_unit = &units[unit_idx]; } + + // rjf: extract unit ranges + RDIM_Rng1U64ChunkList unit_ranges = {0}; + if(src_unit != 0) + { + unit_ranges = src_unit->ranges; + } + + // rjf: extract unit name + String8 unit_name = {0}; + if(src_unit != 0) + { + unit_name = src_unit->obj_name; + if(unit_name.size != 0) + { + String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); + if(unit_name_past_last_slash.size != 0) + { + unit_name = unit_name_past_last_slash; + } + } + } + else + { + unit_name = str8_lit("*global*"); + } + + // rjf: produce obj name/path + String8 obj_name = {0}; + if(src_unit != 0) + { + obj_name = src_unit->obj_name; + if(str8_match(obj_name, str8_lit("* Linker *"), 0) || + str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) + { + MemoryZeroStruct(&obj_name); + } + } + String8 obj_folder_path = backslashed_from_str8(scratch.arena, str8_chop_last_slash(obj_name)); + + // rjf: extract unit group name + String8 group_name = {0}; + if(src_unit != 0) + { + group_name = src_unit->group_name; + } + + //- rjf: main unit line table conversion + RDIM_LineTable *line_table = 0; + if(params->subset_flags & RDIM_SubsetFlag_LineInfo && src_unit_c13 != 0) ProfScope("main unit line table conversion") + { + for(CV_C13SubSectionNode *node = src_unit_c13->first_sub_section; + node != 0; + node = node->next) + { + if(node->kind == CV_C13SubSectionKind_Lines) + { + for(CV_C13LinesParsedNode *lines_n = node->lines_first; + lines_n != 0; + lines_n = lines_n->next) + { + CV_C13LinesParsed *lines = &lines_n->v; + + // rjf: file name -> sanitized file path + String8 file_path = lines->file_name; + String8 file_path_sanitized = str8_copy(scratch.arena, str8_skip_chop_whitespace(file_path)); + { + PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); + String8List file_path_sanitized_parts = str8_split_path(scratch.arena, file_path_sanitized); + if(file_path_sanitized_style == PathStyle_Relative) + { + String8List obj_folder_path_parts = str8_split_path(scratch.arena, obj_folder_path); + str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); + file_path_sanitized_parts = obj_folder_path_parts; + file_path_sanitized_style = path_style_from_str8(obj_folder_path); + } + str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); + file_path_sanitized = str8_path_list_join_by_style(scratch.arena, &file_path_sanitized_parts, file_path_sanitized_style); + } + + // rjf: sanitized file path -> source file node + U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); + U64 src_file_slot = file_path_sanitized_hash%src_file_map->slots_count; + CV2R_SrcFileNode *src_file_node = 0; + if(lines->line_count != 0) + { + for(CV2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next) + { + if(str8_match(n->src_file->path, file_path_sanitized, 0)) + { + src_file_node = n; + break; + } + } + } + + // rjf: push sequence into both line table & source file's line map + if(src_file_node != 0) + { + if(line_table == 0) + { + line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 256); + } + RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, dst_line_tables, line_table, src_file_node->src_file, lines->voffs, lines->line_nums, lines->col_nums, lines->line_count); + } + } + } + } + } + + //- rjf: fill unit + if(dst_unit != 0) + { + dst_unit->unit_name = unit_name; + dst_unit->compiler_name = src_unit_sym->info.compiler_name; + dst_unit->object_file = obj_name; + dst_unit->archive_file = group_name; + dst_unit->language = cv2r_rdi_language_from_cv_language(src_unit_sym->info.language); + dst_unit->line_table = line_table; + dst_unit->voff_ranges = unit_ranges; + } + + //- rjf: build per-inline-site line tables + if(params->subset_flags & RDIM_SubsetFlag_InlineLineInfo) ProfScope("build per-inline-site line tables") + { + U64 base_voff = 0; + for(CV_RecIter iter = {0}; cv_rec_next(src_unit_sym->data, &src_unit_sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + + //- rjf: LPROC32/GPROC32 (gather base address) + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + base_voff = cv2r_voff_from_soff(sections, sections_count, proc32->sec, proc32->off); + }break; + + //- rjf: INLINESITE + case CV_SymKind_INLINESITE: + { + // rjf: unpack sym + CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; + String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); + + // rjf: map inlinee -> parsed cv c13 inlinee line info + CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0; + { + U64 hash = cv_hash_from_item_id(sym->inlinee); + U64 slot_idx = hash%src_unit_c13->inlinee_lines_parsed_slots_count; + for(CV_C13InlineeLinesParsedNode *n = src_unit_c13->inlinee_lines_parsed_slots[slot_idx]; n != 0; n = n->hash_next) + { + if(n->v.inlinee == sym->inlinee) + { + inlinee_lines_parsed = &n->v; + break; + } + } + } + + // rjf: build line table, fill with parsed binary annotations + if(inlinee_lines_parsed != 0) + { + // rjf: grab checksums sub-section + CV_C13SubSectionNode *file_chksms = src_unit_c13->file_chksms_sub_section; + + // rjf: gathered lines + typedef struct LineChunk LineChunk; + struct LineChunk + { + LineChunk *next; + U64 cap; + U64 count; + U64 *voffs; // [line_count + 1] (sorted) + U32 *line_nums; // [line_count] + U16 *col_nums; // [2*line_count] + }; + LineChunk *first_line_chunk = 0; + LineChunk *last_line_chunk = 0; + U64 total_line_chunk_line_count = 0; + U32 last_file_off = max_U32; + U32 curr_file_off = max_U32; + RDIM_LineTable* line_table = 0; + + CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(inlinee_lines_parsed->file_off, inlinee_lines_parsed->first_source_ln, base_voff); + for(;;) + { + // rjf: step & update + CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots); + if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitFile) + { + last_file_off = curr_file_off; + curr_file_off = step.file_off; + } + if(step.flags == 0 && total_line_chunk_line_count > 0) + { + last_file_off = curr_file_off; + curr_file_off = max_U32; + } + + // rjf: file updated -> push line chunks gathered for this file + if(last_file_off != max_U32 && last_file_off != curr_file_off) + { + String8 seq_file_name = {0}; + if(last_file_off + sizeof(CV_C13Checksum) <= file_chksms->size) + { + CV_C13Checksum *checksum = (CV_C13Checksum*)(src_unit_c13->data.str + file_chksms->off + last_file_off); + U32 name_off = checksum->name_off; + seq_file_name = cv2r_string_from_off(strtbl, name_off); + } + + // rjf: file name -> sanitized file path + String8 file_path = seq_file_name; + String8 file_path_sanitized = str8_copy(scratch.arena, str8_skip_chop_whitespace(file_path)); + { + PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); + String8List file_path_sanitized_parts = str8_split_path(scratch.arena, file_path_sanitized); + if(file_path_sanitized_style == PathStyle_Relative) + { + String8List obj_folder_path_parts = str8_split_path(scratch.arena, obj_folder_path); + str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); + file_path_sanitized_parts = obj_folder_path_parts; + file_path_sanitized_style = path_style_from_str8(obj_folder_path); + } + str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); + file_path_sanitized = str8_path_list_join_by_style(scratch.arena, &file_path_sanitized_parts, file_path_sanitized_style); + } + + // rjf: sanitized file path -> source file node + U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); + U64 src_file_slot = file_path_sanitized_hash%src_file_map->slots_count; + CV2R_SrcFileNode *src_file_node = 0; + for(CV2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next) + { + if(str8_match(n->src_file->path, file_path_sanitized, 0)) + { + src_file_node = n; + break; + } + } + + // rjf: gather all lines + RDI_U64 *voffs = 0; + RDI_U32 *line_nums = 0; + RDI_U64 line_count = 0; + if(src_file_node != 0) + { + voffs = push_array_no_zero(arena, RDI_U64, total_line_chunk_line_count+1); + line_nums = push_array_no_zero(arena, RDI_U32, total_line_chunk_line_count); + line_count = total_line_chunk_line_count; + U64 dst_idx = 0; + for(LineChunk *chunk = first_line_chunk; chunk != 0; chunk = chunk->next) + { + MemoryCopy(voffs+dst_idx, chunk->voffs, sizeof(U64)*(chunk->count+1)); + MemoryCopy(line_nums+dst_idx, chunk->line_nums, sizeof(U32)*chunk->count); + dst_idx += chunk->count; + } + } + + // rjf: push + if(line_count != 0) + { + if(line_table == 0) + { + line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 256); + if(units_first_inline_site_line_tables[unit_idx] == 0) + { + units_first_inline_site_line_tables[unit_idx] = line_table; + } + } + rdim_line_table_push_sequence(arena, dst_line_tables, line_table, src_file_node->src_file, voffs, line_nums, 0, line_count); + } + + // rjf: clear line chunks for subsequent sequences + first_line_chunk = last_line_chunk = 0; + total_line_chunk_line_count = 0; + } + + // rjf: new line -> emit to chunk + if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitLine) + { + LineChunk *chunk = last_line_chunk; + if(chunk == 0 || chunk->count+1 >= chunk->cap) + { + chunk = push_array(scratch.arena, LineChunk, 1); + SLLQueuePush(first_line_chunk, last_line_chunk, chunk); + chunk->cap = 8; + chunk->voffs = push_array_no_zero(scratch.arena, U64, chunk->cap); + chunk->line_nums = push_array_no_zero(scratch.arena, U32, chunk->cap); + } + chunk->voffs[chunk->count] = step.line_voff; + chunk->voffs[chunk->count+1] = step.line_voff_end; + chunk->line_nums[chunk->count] = step.ln; + chunk->count += 1; + total_line_chunk_line_count += 1; + } + + // rjf: no more flags -> done + if(step.flags == 0) + { + break; + } + } + } + }break; + } + } + } + + scratch_end(scratch); + } + } + } + lane_sync(); + RDIM_UnitChunkList all_units = *all_units_ptr; + + ////////////////////////////////////////////////////////////// + //- rjf: join all line tables + // + RDIM_LineTableChunkList all_line_tables = {0}; + RDIM_LineTableChunkList *all_line_tables_ptr = &all_line_tables; + ProfScope("join all line tables") if(lane_idx() == 0) + { + for EachIndex(idx, comp_units_count + 1) + { + rdim_line_table_chunk_list_concat_in_place(&all_line_tables, &units_line_tables[idx]); + } + } + lane_sync_u64(&all_line_tables_ptr, 0); + all_line_tables = *all_line_tables_ptr; + + ////////////////////////////////////////////////////////////// + //- rjf: equip source files with line sequences + // + ProfScope("equip source files with line sequences") if(lane_idx() == 0) + { + for(RDIM_LineTableChunkNode *line_table_chunk_n = all_line_tables.first; + line_table_chunk_n != 0; + line_table_chunk_n = line_table_chunk_n->next) + { + for EachIndex(chunk_line_table_idx, line_table_chunk_n->count) + { + RDIM_LineTable *line_table = &line_table_chunk_n->v[chunk_line_table_idx]; + for(RDIM_LineSequenceNode *s = line_table->first_seq; s != 0; s = s->next) + { + rdim_src_file_push_line_sequence(arena, all_src_files__sequenceless, s->v.src_file, &s->v); + } + } + } + } + lane_sync(); + RDIM_SrcFileChunkList all_src_files = *all_src_files__sequenceless; + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 1: produce type forward resolution map + // + // this map is used to resolve usage of "incomplete structs" in codeview's + // type info. this often happens when e.g. "struct Foo" is used to refer to + // a later-defined "Foo", which actually contains members and so on. we want + // to hook types up to their actual destination complete types wherever + // possible, and so this map can be used to do that in subsequent stages. + // + CV_TypeId *itype_fwd_map = 0; + CV_TypeId itype_first = 0; + CV_TypeId itype_opl = 0; + ProfScope("types pass 1: produce type forward resolution map") + { + //- rjf: allocate forward resolution map + if(lane_idx() == 0) + { + itype_first = tpi_leaf->itype_first; + itype_opl = tpi_leaf->itype_opl; + itype_fwd_map = push_array(scratch.arena, CV_TypeId, (U64)itype_opl); + } + lane_sync_u64(&itype_first, 0); + lane_sync_u64(&itype_opl, 0); + lane_sync_u64(&itype_fwd_map, 0); + + //- rjf: do wide fill + if(params->subset_flags & RDIM_SubsetFlag_Types) + { + Rng1U64 range = lane_range(itype_opl); + for EachInRange(idx, range) + { + CV_TypeId itype = (CV_TypeId)idx; + if(itype < itype_first) { continue; } + + //- rjf: determine if this itype resolves to another + CV_TypeId itype_fwd = 0; + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: CLASS/STRUCTURE + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + // rjf: unpack leaf header + CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_struct->props & CV_TypeProp_FwdRef) + { + // rjf: unpack rest of leaf + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: lookup + B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && + ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = cv2r_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + // rjf: unpack leaf header + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_struct->props & CV_TypeProp_FwdRef) + { + // rjf: unpack rest of leaf + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: lookup + B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && + ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = cv2r_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + // rjf: unpack leaf + CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_union + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves tos + if(lf_union->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_union->props & CV_TypeProp_Scoped) != 0) && + ((lf_union->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = cv2r_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + // rjf: unpack leaf + CV_LeafEnum *lf_enum = (CV_LeafEnum*)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf_enum + 1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + U8 *unique_name_ptr = name_ptr + name.size + 1; + String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); + + // rjf: has fwd ref flag -> lookup itype that this itype resolves to + if(lf_enum->props & CV_TypeProp_FwdRef) + { + B32 do_unique_name_lookup = (((lf_enum->props & CV_TypeProp_Scoped) != 0) && + ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0)); + itype_fwd = cv2r_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); + } + }break; + } + } + + //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map + if(itype_fwd != 0 && itype_fwd < tpi_leaf->itype_opl) + { + itype_fwd_map[itype] = itype_fwd; + } + } + } + } + lane_sync(); + + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 2: produce per-itype itype chain + // + // this pass is to ensure that subsequent passes always produce types for + // dependent itypes first - guaranteeing rdi's "only reference backward" + // rule (which eliminates cycles). each itype slot gets a list of itypes, + // starting with the deepest dependency - when types are produced per-itype, + // this chain is walked, so that deeper dependencies are built first, and + // as such, always show up *earlier* in the actually built types. + // + CV2R_TypeIdChain **itype_chains = 0; + ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") + { + //- rjf: allocate itype chain table + if(lane_idx() == 0) + { + itype_chains = push_array(scratch.arena, CV2R_TypeIdChain *, (U64)itype_opl); + } + lane_sync_u64(&itype_chains, 0); + + //- rjf: do wide fill + if(params->subset_flags & RDIM_SubsetFlag_Types) + { + Rng1U64 range = lane_range(itype_opl); + for EachInRange(idx, range) + { + CV_TypeId itype = (CV_TypeId)idx; + + //- rjf: push initial itype - should be final-visited-itype for this itype + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = itype; + SLLStackPush(itype_chains[itype], c); + } + + //- rjf: skip basic types for dependency walk + if(itype < tpi_leaf->itype_first) + { + continue; + } + + //- rjf: walk dependent types, push to chain + Temp scratch2 = scratch_begin(&scratch.arena, 1); + CV2R_TypeIdChain start_walk_task = {0, itype}; + CV2R_TypeIdChain *first_walk_task = &start_walk_task; + CV2R_TypeIdChain *last_walk_task = &start_walk_task; + for(CV2R_TypeIdChain *walk_task = first_walk_task; + walk_task != 0; + walk_task = walk_task->next) + { + CV_TypeId walk_itype = itype_fwd_map[walk_task->itype] ? itype_fwd_map[walk_task->itype] : walk_task->itype; + if(walk_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= walk_itype) + { + continue; + } + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[walk_itype-tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: + { + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: POINTER + case CV_LeafKind_POINTER: + { + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: + { + CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + + // rjf: push return itypes to chain + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk return itype + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-tpi_leaf->itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: push arg types to chain + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk arg types + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: + { + CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLStackPush(itype_chains[itype], c); + } + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLStackPush(itype_chains[itype], c); + } + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->ret_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->arg_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->this_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-tpi_leaf->itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: push arg types to chain + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk arg types + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = arglist_itypes_base[idx]; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: + { + CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; + + // rjf: push dependent itype to chain + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itype + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: ARRAY + case CV_LeafKind_ARRAY: + { + CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLStackPush(itype_chains[itype], c); + } + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->entry_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->index_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + + // rjf: push dependent itypes to chain + { + CV2R_TypeIdChain *c = push_array(scratch.arena, CV2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLStackPush(itype_chains[itype], c); + } + + // rjf: push task to walk dependency itypes + { + CV2R_TypeIdChain *c = push_array(scratch2.arena, CV2R_TypeIdChain, 1); + c->itype = lf->base_itype; + SLLQueuePush(first_walk_task, last_walk_task, c); + } + }break; + } + } + } + scratch_end(scratch2); + } + } + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 3: gather all unique namespaces from types + // + CV2R_NamespaceNode **all_namespace_slots = 0; + U64 all_namespace_slots_count = 0; + ProfScope("gather all unique namespaces from types") + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + //- rjf: find all unique namespaces on this lane + U64 namespace_slots_count = (U64)itype_opl / lane_count(); + namespace_slots_count = Max(1, namespace_slots_count); + String8Node **namespace_slots = push_array(scratch2.arena, String8Node *, namespace_slots_count); + U64 namespace_count = 0; + Rng1U64 range = lane_range(itype_opl); + for EachInRange(idx, range) + { + CV_TypeId itype = (CV_TypeId)idx; + if(itype < itype_first) { continue; } + + // rjf: unpack itype info + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + + // rjf: gather names from types + String8 name = {0}; + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + default:{}break; + + //- rjf: CLASS/STRUCT + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + CV_LeafUnion *lf_struct = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8 *)(lf_struct + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf_enum = (CV_LeafEnum *)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf_enum+1); + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + + //- rjf: ALIAS + case CV_LeafKind_ALIAS: + { + CV_LeafAlias *lf = (CV_LeafAlias *)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }break; + } + } + + // rjf: add namespaces from strings + String8 name_before_templates = str8_prefix(name, str8_find_needle(name, 0, str8_lit("<"), 0)); + for(U64 scope_resolution_operator_pos = 0; + scope_resolution_operator_pos < name_before_templates.size; + scope_resolution_operator_pos = str8_find_needle(name_before_templates, scope_resolution_operator_pos+1, str8_lit("::"), 0)) + { + String8 namespace_fully_qualified_name = str8_substr(name_before_templates, r1u64(0, scope_resolution_operator_pos)); + if(namespace_fully_qualified_name.size != 0) + { + namespace_count += 1; + U64 hash = u64_hash_from_str8(namespace_fully_qualified_name); + U64 slot_idx = hash%namespace_slots_count; + B32 already_exists = 0; + for(String8Node *n = namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, namespace_fully_qualified_name, 0)) + { + already_exists = 1; + break; + } + } + if(!already_exists) + { + String8Node *node = push_array(scratch2.arena, String8Node, 1); + SLLStackPush(namespace_slots[slot_idx], node); + node->string = namespace_fully_qualified_name; + } + } + } + } + + //- rjf: on lane 0 -> combine all unique namespaces to singular map + { + // rjf: gather lane maps + typedef struct LaneNamespaceTable LaneNamespaceTable; + struct LaneNamespaceTable + { + String8Node **slots; + U64 slots_count; + }; + U64 total_namespace_count = 0; + U64 *total_namespace_count_ptr = &total_namespace_count; + LaneNamespaceTable *lane_namespace_tables = 0; + if(lane_idx() == 0) + { + lane_namespace_tables = push_array(scratch2.arena, LaneNamespaceTable, lane_count()); + } + lane_sync_u64(&total_namespace_count_ptr, 0); + lane_sync_u64(&lane_namespace_tables, 0); + lane_namespace_tables[lane_idx()].slots = namespace_slots; + lane_namespace_tables[lane_idx()].slots_count = namespace_slots_count; + ins_atomic_u64_add_eval(total_namespace_count_ptr, namespace_count); + lane_sync(); + + // rjf: combine + if(lane_idx() == 0) + { + all_namespace_slots_count = *total_namespace_count_ptr / 3; + all_namespace_slots_count = Max(all_namespace_slots_count, 1); + all_namespace_slots = push_array(scratch.arena, CV2R_NamespaceNode *, all_namespace_slots_count); + for EachIndex(l_idx, lane_count()) + { + LaneNamespaceTable *tbl = &lane_namespace_tables[l_idx]; + for EachIndex(slot_idx, tbl->slots_count) + { + for(String8Node *n = tbl->slots[slot_idx]; n != 0; n = n->next) + { + U64 hash = u64_hash_from_str8(n->string); + U64 dst_slot_idx = hash%all_namespace_slots_count; + B32 already_exists = 0; + for(CV2R_NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) + { + if(str8_match(dst_n->string, n->string, 0)) + { + already_exists = 1; + break; + } + } + if(!already_exists) + { + CV2R_NamespaceNode *dst_n = push_array(scratch.arena, CV2R_NamespaceNode, 1); + dst_n->string = n->string; + SLLStackPush(all_namespace_slots[dst_slot_idx], dst_n); + } + } + } + } + } + lane_sync_u64(&all_namespace_slots_count, 0); + lane_sync_u64(&all_namespace_slots, 0); + } + scratch_end(scratch2); + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: types pass 4: construct all types from TPI + // + // this doesn't gather struct/class/union/enum members, which is done by + // subsequent passes, to build RDI "UDT" information, which is distinct + // from regular type info. + // + RDIM_TypeChunkList all_types__pre_typedefs = {0}; + RDIM_TypeChunkList *all_types__pre_typedefs_ptr = &all_types__pre_typedefs; + RDIM_Type **itype_type_ptrs = 0; + RDIM_Type **basic_type_ptrs = 0; + if(lane_idx() == 0) ProfScope("types pass 4: construct all root/stub types from TPI") + { +#define p2r_builtin_type_ptr_from_kind(kind) ((basic_type_ptrs && RDI_TypeKind_FirstBuiltIn <= (kind) && (kind) <= RDI_TypeKind_LastBuiltIn) ? (basic_type_ptrs[(kind) - RDI_TypeKind_FirstBuiltIn]) : 0) +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + itype_type_ptrs = push_array(scratch.arena, RDIM_Type *, (U64)(itype_opl)); + basic_type_ptrs = push_array(scratch.arena, RDIM_Type *, (RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1)); + + //////////////////////////// + //- rjf: build basic types + // + if(params->subset_flags & RDIM_SubsetFlag_Types) + { + for(RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; + type_kind <= RDI_TypeKind_LastBuiltIn; + type_kind += 1) + { + RDIM_Type *type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, 512); + type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); + type->kind = type_kind; + type->byte_size = rdi_size_from_basic_type_kind(type_kind); + basic_type_ptrs[type_kind - RDI_TypeKind_FirstBuiltIn] = type; + } + } + + //////////////////////////// + //- rjf: build basic type aliases + // + if(params->subset_flags & RDIM_SubsetFlag_Types) + { + RDIM_DataModel data_model = rdim_data_model_from_os_arch(OperatingSystem_Windows, arch); + RDI_TypeKind short_type = rdim_short_type_kind_from_data_model(data_model); + RDI_TypeKind ushort_type = rdim_unsigned_short_type_kind_from_data_model(data_model); + RDI_TypeKind long_type = rdim_long_type_kind_from_data_model(data_model); + RDI_TypeKind ulong_type = rdim_unsigned_long_type_kind_from_data_model(data_model); + RDI_TypeKind long_long_type = rdim_long_long_type_kind_from_data_model(data_model); + RDI_TypeKind ulong_long_type = rdim_unsigned_long_long_type_kind_from_data_model(data_model); + RDI_TypeKind ptr_type = rdim_pointer_size_t_type_kind_from_data_model(data_model); + struct + { + char * name; + RDI_TypeKind kind_rdi; + CV_LeafKind kind_cv; + } + table[] = + { + { "signed char" , RDI_TypeKind_Char8 , CV_BasicType_CHAR }, + { "short" , short_type , CV_BasicType_SHORT }, + { "long" , long_type , CV_BasicType_LONG }, + { "long long" , long_long_type , CV_BasicType_QUAD }, + { "__int128" , RDI_TypeKind_S128 , CV_BasicType_OCT }, // Clang type + { "unsigned char" , RDI_TypeKind_UChar8 , CV_BasicType_UCHAR }, + { "unsigned short" , ushort_type , CV_BasicType_USHORT }, + { "unsigned long" , ulong_type , CV_BasicType_ULONG }, + { "unsigned long long" , ulong_long_type , CV_BasicType_UQUAD }, + { "__uint128" , RDI_TypeKind_U128 , CV_BasicType_UOCT }, // Clang type + { "bool" , RDI_TypeKind_S8 , CV_BasicType_BOOL8 }, + { "__bool16" , RDI_TypeKind_S16 , CV_BasicType_BOOL16 }, // not real C type + { "__bool32" , RDI_TypeKind_S32 , CV_BasicType_BOOL32 }, // not real C type + { "float" , RDI_TypeKind_F32 , CV_BasicType_FLOAT32 }, + { "double" , RDI_TypeKind_F64 , CV_BasicType_FLOAT64 }, + { "long double" , RDI_TypeKind_F80 , CV_BasicType_FLOAT80 }, + { "__float128" , RDI_TypeKind_F128 , CV_BasicType_FLOAT128 }, // Clang type + { "__float48" , RDI_TypeKind_F48 , CV_BasicType_FLOAT48 }, // not real C type + { "__float32pp" , RDI_TypeKind_F32PP , CV_BasicType_FLOAT32PP }, // not real C type + { "__float16" , RDI_TypeKind_F16 , CV_BasicType_FLOAT16 }, + { "_Complex float" , RDI_TypeKind_ComplexF32 , CV_BasicType_COMPLEX32 }, + { "_Complex double" , RDI_TypeKind_ComplexF64 , CV_BasicType_COMPLEX64 }, + { "_Complex long double" , RDI_TypeKind_ComplexF80 , CV_BasicType_COMPLEX80 }, + { "_Complex __float128" , RDI_TypeKind_ComplexF128, CV_BasicType_COMPLEX128 }, + { "__int8" , RDI_TypeKind_S8 , CV_BasicType_INT8 }, + { "__uint8" , RDI_TypeKind_U8 , CV_BasicType_UINT8 }, + { "__int16" , RDI_TypeKind_S16 , CV_BasicType_INT16 }, + { "__uint16" , RDI_TypeKind_U16 , CV_BasicType_UINT16 }, + { "int" , RDI_TypeKind_S32 , CV_BasicType_INT32 }, + { "int32" , RDI_TypeKind_S32 , CV_BasicType_INT32 }, + { "uint32" , RDI_TypeKind_U32 , CV_BasicType_UINT32 }, + { "__int64" , RDI_TypeKind_S64 , CV_BasicType_INT64 }, + { "__uint64" , RDI_TypeKind_U64 , CV_BasicType_UINT64 }, + { "__int128" , RDI_TypeKind_S128 , CV_BasicType_INT128 }, + { "__uint128" , RDI_TypeKind_U128 , CV_BasicType_UINT128 }, + { "char" , RDI_TypeKind_Char8 , CV_BasicType_RCHAR }, // always ASCII + { "wchar_t" , RDI_TypeKind_UChar16 , CV_BasicType_WCHAR }, // on windows always UTF-16 + { "char8_t" , RDI_TypeKind_Char8 , CV_BasicType_CHAR8 }, // always UTF-8 + { "char16_t" , RDI_TypeKind_Char16 , CV_BasicType_CHAR16 }, // always UTF-16 + { "char32_t" , RDI_TypeKind_Char32 , CV_BasicType_CHAR32 }, // always UTF-32 + { "__pointer" , ptr_type , CV_BasicType_PTR } + }; + for EachElement(idx, table) + { + RDIM_Type *builtin_alias = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, tpi_leaf->itype_opl); + builtin_alias->kind = RDI_TypeKind_Alias; + builtin_alias->name = str8_cstring(table[idx].name); + builtin_alias->direct_type = p2r_builtin_type_ptr_from_kind(table[idx].kind_rdi); + builtin_alias->byte_size = rdi_size_from_basic_type_kind(table[idx].kind_rdi); + itype_type_ptrs[table[idx].kind_cv] = builtin_alias; + } + itype_type_ptrs[CV_BasicType_HRESULT] = basic_type_ptrs[RDI_TypeKind_HResult - RDI_TypeKind_FirstBuiltIn]; + itype_type_ptrs[CV_BasicType_VOID] = basic_type_ptrs[RDI_TypeKind_Void - RDI_TypeKind_FirstBuiltIn]; + } + + //////////////////////////// + //- rjf: build types from TPI + // + if(params->subset_flags & RDIM_SubsetFlag_Types) + { + for(CV_TypeId root_itype = 0; root_itype < itype_opl; root_itype += 1) + { + for(CV2R_TypeIdChain *itype_chain = itype_chains[root_itype]; + itype_chain != 0; + itype_chain = itype_chain->next) + { + CV_TypeId itype = (root_itype != itype_chain->itype && itype_chain->itype < itype_opl && itype_fwd_map[itype_chain->itype]) ? itype_fwd_map[itype_chain->itype] : itype_chain->itype; + B32 itype_is_basic = (itype < tpi_leaf->itype_first); + + ////////////////////////// + //- rjf: skip forward-reference itypes - all future resolutions will + // reference whatever this itype resolves to, and so there is no point + // in filling out this slot + // + if(itype_fwd_map[root_itype] != 0) + { + continue; + } + + ////////////////////////// + //- rjf: skip already produced dependencies + // + if(itype_type_ptrs[itype] != 0) + { + continue; + } + + ////////////////////////// + //- rjf: build basic type + // + if(itype_is_basic) + { + RDIM_Type *dst_type = 0; + + // rjf: unpack itype + CV_BasicPointerKind cv_basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); + CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); + + // rjf: get basic type slot, fill if unfilled + RDIM_Type *basic_type = itype_type_ptrs[cv_basic_type_code]; + if(basic_type == 0) + { + RDI_TypeKind type_kind = p2r_rdi_type_kind_from_cv_basic_type(cv_basic_type_code); + U32 byte_size = rdi_size_from_basic_type_kind(type_kind); + basic_type = dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + if(byte_size == 0xffffffff) + { + byte_size = arch_addr_size; + } + basic_type->kind = type_kind; + basic_type->name = cv_type_name_from_basic_type(cv_basic_type_code); + basic_type->byte_size = byte_size; + } + + // rjf: nonzero ptr kind -> form ptr type to basic tpye + if(cv_basic_ptr_kind != 0) + { + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Ptr; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = basic_type; + } + + // rjf: fill this itype's slot with the finished type + itype_type_ptrs[itype] = dst_type; + } + + ////////////////////////// + //- rjf: build non-basic type + // + if(!itype_is_basic && itype >= itype_first) + { + RDIM_Type *dst_type = 0; + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + if(range->off+range->hdr.size <= tpi_leaf->data.size && + range->off+2+header_struct_size <= tpi_leaf->data.size && + range->hdr.size >= 2) + { + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + switch(kind) + { + //- rjf: MODIFIER + case CV_LeafKind_MODIFIER: + { + // rjf: unpack leaf + CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; + + // rjf: cv -> rdi flags + RDI_TypeModifierFlags flags = 0; + if(lf->flags & CV_ModifierFlag_Const) {flags |= RDI_TypeModifierFlag_Const;} + if(lf->flags & CV_ModifierFlag_Volatile) {flags |= RDI_TypeModifierFlag_Volatile;} + + // rjf: fill type + if(flags == 0) + { + dst_type = p2r_type_ptr_from_itype(lf->itype); + } + else + { + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = flags; + dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype); + dst_type->byte_size = dst_type->direct_type ? dst_type->direct_type->byte_size : 0; + } + }break; + + //- rjf: POINTER + case CV_LeafKind_POINTER: + { + // TODO(rjf): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead + + // rjf: unpack leaf + CV_LeafPointer *lf = (CV_LeafPointer *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); + CV_PointerKind ptr_kind = CV_PointerAttribs_Extract_Kind(lf->attribs); + CV_PointerMode ptr_mode = CV_PointerAttribs_Extract_Mode(lf->attribs); + U32 ptr_size = CV_PointerAttribs_Extract_Size(lf->attribs); + + // rjf: cv -> rdi modifier flags + RDI_TypeModifierFlags modifier_flags = 0; + if(lf->attribs & CV_PointerAttrib_Const) {modifier_flags |= RDI_TypeModifierFlag_Const;} + if(lf->attribs & CV_PointerAttrib_Volatile) {modifier_flags |= RDI_TypeModifierFlag_Volatile;} + if(lf->attribs & CV_PointerAttrib_Restricted) {modifier_flags |= RDI_TypeModifierFlag_Restrict;} + + // rjf: cv info -> rdi pointer type kind + RDI_TypeKind type_kind = RDI_TypeKind_Ptr; + { + if(lf->attribs & CV_PointerAttrib_LRef) + { + type_kind = RDI_TypeKind_LRef; + } + else if(lf->attribs & CV_PointerAttrib_RRef) + { + type_kind = RDI_TypeKind_RRef; + } + if(ptr_mode == CV_PointerMode_LRef) + { + type_kind = RDI_TypeKind_LRef; + } + else if(ptr_mode == CV_PointerMode_RRef) + { + type_kind = RDI_TypeKind_RRef; + } + } + + // rjf: fill type + if(modifier_flags != 0) + { + RDIM_Type *pointer_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Modifier; + dst_type->flags = modifier_flags; + dst_type->direct_type = pointer_type; + dst_type->byte_size = arch_addr_size; + pointer_type->kind = type_kind; + pointer_type->byte_size = arch_addr_size; + pointer_type->direct_type = direct_type; + } + else + { + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = type_kind; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = direct_type; + } + }break; + + //- rjf: PROCEDURE + case CV_LeafKind_PROCEDURE: + { + // TODO(rjf): handle call_kind & attribs + + // rjf: unpack leaf + CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; + RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); + + // rjf: fill type's basics + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Function; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = ret_type; + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: count non-zero arguments + U32 arglist_itypes_nonzero_count = 0; + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + if(arglist_itypes_base[idx] != 0) + { + arglist_itypes_nonzero_count += 1; + } + } + + // rjf: build param type array + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_nonzero_count); + { + U64 dst_idx = 0; + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + if(arglist_itypes_base[idx] != 0) + { + params[dst_idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + dst_idx += 1; + } + } + } + + // rjf: fill dst type + dst_type->count = arglist_itypes_nonzero_count; + dst_type->param_types = params; + }break; + + //- rjf: MFUNCTION + case CV_LeafKind_MFUNCTION: + { + // TODO(rjf): handle call_kind & attribs + // TODO(rjf): preserve "this_adjust" + + // rjf: unpack leaf + CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; + RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = (lf->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function; + dst_type->byte_size = arch_addr_size; + dst_type->direct_type = ret_type; + + // rjf: unpack arglist range + CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; + if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || + arglist_range->hdr.size<2 || + arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) + { + break; + } + U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; + U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; + if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) + { + break; + } + + // rjf: unpack arglist info + CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; + CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); + U32 arglist_itypes_count = arglist->count; + + // rjf: build param type array + U64 num_this_extras = 1; + if(lf->this_itype == 0) + { + num_this_extras = 0; + } + RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count+num_this_extras); + for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) + { + params[idx+num_this_extras] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); + } + if(lf->this_itype != 0) + { + params[0] = p2r_type_ptr_from_itype(lf->this_itype); + } + + // rjf: fill dst type + dst_type->count = arglist_itypes_count+num_this_extras; + dst_type->param_types = params; + }break; + + //- rjf: BITFIELD + case CV_LeafKind_BITFIELD: + { + // rjf: unpack leaf + CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Bitfield; + dst_type->off = lf->pos; + dst_type->count = lf->len; + dst_type->byte_size = direct_type?direct_type->byte_size:0; + dst_type->direct_type = direct_type; + }break; + + //- rjf: ARRAY + case CV_LeafKind_ARRAY: + { + // rjf: unpack leaf + CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->entry_itype); + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 full_size = cv_u64_from_numeric(&array_count); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Array; + dst_type->direct_type = direct_type; + dst_type->byte_size = full_size; + dst_type->count = (direct_type && direct_type->byte_size) ? (dst_type->byte_size/direct_type->byte_size) : 0; + }break; + + //- rjf: CLASS/STRUCTURE + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); + dst_type->name = name; + } + else + { + dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct); + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + }break; + + //- rjf: CLASS2/STRUCT2 + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); + dst_type->name = name; + } + else + { + dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct); + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + }break; + + //- rjf: alias + case CV_LeafKind_ALIAS: + { + // rjf: unpack leaf + CV_LeafAlias *lf = (CV_LeafAlias *)itype_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + dst_type->kind = RDI_TypeKind_Alias; + dst_type->name = name; + dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype); + if(dst_type->direct_type != 0) + { + dst_type->byte_size = dst_type->direct_type->byte_size; + } + }break; + + //- rjf: UNION + case CV_LeafKind_UNION: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U64 size_u64 = cv_u64_from_numeric(&size); + U8 *name_ptr = numeric_ptr + size.encoded_size; + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = RDI_TypeKind_IncompleteUnion; + dst_type->name = name; + } + else + { + dst_type->kind = RDI_TypeKind_Union; + dst_type->byte_size = (U32)size_u64; + dst_type->name = name; + } + }break; + + //- rjf: ENUM + case CV_LeafKind_ENUM: + { + // TODO(rjf): handle props + + // rjf: unpack leaf + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->base_itype); + U8 *name_ptr = (U8 *)(lf + 1); + String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); + + // rjf: fill type + dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); + if(lf->props & CV_TypeProp_FwdRef) + { + dst_type->kind = RDI_TypeKind_IncompleteEnum; + dst_type->name = name; + } + else + { + dst_type->kind = RDI_TypeKind_Enum; + dst_type->direct_type = direct_type; + dst_type->byte_size = direct_type ? direct_type->byte_size : 0; + dst_type->name = name; + } + }break; + } + } + + //- rjf: store finalized type to this itype's slot + itype_type_ptrs[itype] = dst_type; + } + } + } + } +#undef p2r_type_ptr_from_itype +#undef p2r_builtin_type_ptr_from_kind + } + lane_sync_u64(&itype_type_ptrs, 0); + lane_sync_u64(&basic_type_ptrs, 0); + lane_sync_u64(&all_types__pre_typedefs_ptr, 0); + all_types__pre_typedefs = *all_types__pre_typedefs_ptr; + + ////////////////////////////////////////////////////////////// + //- rjf: set bit in all namespace nodes that correspond to scopes + // + if(params->subset_flags & (RDIM_SubsetFlag_Procedures| + RDIM_SubsetFlag_GlobalVariables| + RDIM_SubsetFlag_ThreadVariables| + RDIM_SubsetFlag_Scopes| + RDIM_SubsetFlag_Locals| + RDIM_SubsetFlag_GlobalVariableNameMap| + RDIM_SubsetFlag_ThreadVariableNameMap| + RDIM_SubsetFlag_ProcedureNameMap| + RDIM_SubsetFlag_ConstantNameMap| + RDIM_SubsetFlag_LinkNameProcedureNameMap| + RDIM_SubsetFlag_Types)) + ProfScope("determine which namespace nodes correspond to scopes") + { + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + for(;;) + { + U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(sym_idx >= all_syms_count) + { + break; + } + CV_SymParsed *sym = all_syms[sym_idx]; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + String8 name = str8_cstring_capped(proc32+1, iter.opl); + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, name, 0)) + { + ins_atomic_u32_eval_assign(&n->corresponds_to_scope, 1); + break; + } + } + }break; + } + } + } + } + + ////////////////////////////////////////////////////////////// + //- rjf: gather all namespaces which are only encoded in symbols (not found in types) + // + if(params->subset_flags & (RDIM_SubsetFlag_Procedures| + RDIM_SubsetFlag_GlobalVariables| + RDIM_SubsetFlag_ThreadVariables| + RDIM_SubsetFlag_Scopes| + RDIM_SubsetFlag_Locals| + RDIM_SubsetFlag_GlobalVariableNameMap| + RDIM_SubsetFlag_ThreadVariableNameMap| + RDIM_SubsetFlag_ProcedureNameMap| + RDIM_SubsetFlag_ConstantNameMap| + RDIM_SubsetFlag_LinkNameProcedureNameMap| + RDIM_SubsetFlag_Types)) + ProfScope("gather all namespaces which are only encoded in symbols (not found in types)") + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + U64 lane_namespace_slots_count = 4096; + String8Node **lane_namespace_slots = push_array(scratch2.arena, String8Node *, lane_namespace_slots_count); + + //- rjf: gather from syms + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch2.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + for(;;) + { + U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(sym_idx >= all_syms_count) + { + break; + } + CV_SymParsed *sym = all_syms[sym_idx]; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + // rjf: get global symbol name + String8 symbol_name = {0}; + switch(iter.kind) + { + default:{}break; + case CV_SymKind_GDATA32: + { + CV_SymData32 *data32 = (CV_SymData32 *)iter.struct_base; + symbol_name = str8_cstring_capped(data32+1, iter.opl); + }break; + case CV_SymKind_GPROC32: + { + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + symbol_name = str8_cstring_capped(proc32+1, iter.opl); + }break; + case CV_SymKind_GTHREAD32: + { + CV_SymThread32 *thread32 = (CV_SymThread32 *)iter.struct_base; + symbol_name = str8_cstring_capped(thread32+1, iter.opl); + }break; + } + + // rjf: symbol name -> container name + String8 container_name = str8_chop(str8_prefix(symbol_name, p2r_end_of_cplusplus_container_name(symbol_name)), 2); + + // rjf: non-empty container name -> gather + if(container_name.size != 0) + { + U64 container_name_hash = u64_hash_from_str8(container_name); + + // rjf: first, check if this container already showed up from type info + B32 already_exists = 0; + if(!already_exists) + { + U64 slot_idx = container_name_hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, container_name, 0)) + { + already_exists = 1; + break; + } + } + } + + // rjf: next, check if we've already gathered this namespace for this lane + if(!already_exists) + { + U64 slot_idx = container_name_hash%lane_namespace_slots_count; + for(String8Node *n = lane_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, container_name, 0)) + { + already_exists = 1; + break; + } + } + } + + // rjf: if we didn't find this namespace in either those from types, or already found in this lane, then gather + if(!already_exists) + { + U64 slot_idx = container_name_hash%lane_namespace_slots_count; + String8Node *n = push_array(scratch2.arena, String8Node, 1); + SLLStackPush(lane_namespace_slots[slot_idx], n); + n->string = container_name; + } + } + } + } + lane_sync(); + + //- rjf: combine + fold into the all_namespaces table + { + // rjf: gather lane maps + typedef struct LaneNamespaceTable LaneNamespaceTable; + struct LaneNamespaceTable + { + String8Node **slots; + U64 slots_count; + }; + LaneNamespaceTable *lane_namespace_tables = 0; + if(lane_idx() == 0) + { + lane_namespace_tables = push_array(scratch2.arena, LaneNamespaceTable, lane_count()); + } + lane_sync_u64(&lane_namespace_tables, 0); + lane_namespace_tables[lane_idx()].slots = lane_namespace_slots; + lane_namespace_tables[lane_idx()].slots_count = lane_namespace_slots_count; + lane_sync(); + + // rjf: combine + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + LaneNamespaceTable *tbl = &lane_namespace_tables[l_idx]; + for EachIndex(slot_idx, tbl->slots_count) + { + for(String8Node *n = tbl->slots[slot_idx]; n != 0; n = n->next) + { + U64 hash = u64_hash_from_str8(n->string); + U64 dst_slot_idx = hash%all_namespace_slots_count; + B32 already_exists = 0; + for(CV2R_NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) + { + if(str8_match(dst_n->string, n->string, 0)) + { + already_exists = 1; + break; + } + } + if(!already_exists) + { + CV2R_NamespaceNode *dst_n = push_array(scratch.arena, CV2R_NamespaceNode, 1); + dst_n->string = n->string; + SLLStackPush(all_namespace_slots[dst_slot_idx], dst_n); + } + } + } + } + } + } + lane_sync(); + scratch_end(scratch2); + } + + ////////////////////////////////////////////////////////////// + //- rjf: upgrade namespace nodes with type info, if they match a type + // + ProfScope("upgrade namespace nodes with type info, if they match a type") + { +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + Rng1U64 range = lane_range(all_namespace_slots_count); + for EachInRange(slot_idx, range) + { + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + String8 container_string = n->string; + CV_TypeId container_type_id = cv2r_first_itype_from_name(tpi_hash, tpi_leaf, container_string, 0); + if(container_type_id != 0) + { + n->type = p2r_type_ptr_from_itype(container_type_id); + } + } + } +#undef p2r_type_ptr_from_itype + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: build namespaces, that are not scopes, nor types + // + RDIM_NamespaceChunkList all_namespaces = {0}; + { + // rjf: gather all per-lane namespaces + RDIM_NamespaceChunkList lane_namespaces = {0}; + Rng1U64 range = lane_range(all_namespace_slots_count); + for EachInRange(slot_idx, range) + { + Temp scratch = scratch_begin(&arena, 1); + + // rjf: gather nodes, sort + U64 node_count = 0; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { node_count += 1; } + CV2R_NamespaceNode **nodes = push_array(scratch.arena, CV2R_NamespaceNode *, node_count); + { + U64 idx = 0; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next, idx += 1) + { + nodes[idx] = n; + } + } + radsort(nodes, node_count, p2r_namespace_node_is_before); + + // rjf: build namespaces for this slot + for EachIndex(node_in_slot_idx, node_count) + { + CV2R_NamespaceNode *n = nodes[node_in_slot_idx]; + if(n->corresponds_to_scope || n->scope != 0 || n->type != 0) { continue; } + String8 string = n->string; + RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 32); + ns->name = string; + n->ns = ns; + } + + scratch_end(scratch); + } + + // rjf: combine all per-lane namespaces + RDIM_NamespaceChunkList *lanes_namespaces = 0; + if(lane_idx() == 0) + { + lanes_namespaces = push_array(scratch.arena, RDIM_NamespaceChunkList, lane_count()); + } + lane_sync_u64(&lanes_namespaces, 0); + lanes_namespaces[lane_idx()] = lane_namespaces; + lane_sync(); + + // rjf: join all per-lane namespaces + RDIM_NamespaceChunkList *all_namespaces_ptr = &all_namespaces; + lane_sync_u64(&all_namespaces_ptr, 0); + if(lane_idx() == 0) + { + for EachIndex(l_idx, lane_count()) + { + rdim_namespace_chunk_list_concat_in_place(all_namespaces_ptr, &lanes_namespaces[l_idx]); + } + } + lane_sync(); + all_namespaces = *all_namespaces_ptr; + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: convert symbols from all units + // + typedef struct ScopeNamespaceNode ScopeNamespaceNode; + struct ScopeNamespaceNode + { + ScopeNamespaceNode *next; + String8 string; + RDIM_Scope *scope; + }; + typedef struct ScopeNamespaceList ScopeNamespaceList; + struct ScopeNamespaceList + { + ScopeNamespaceNode *first; + ScopeNamespaceNode *last; + }; + RDIM_TypeChunkList *syms_typedefs = 0; + ScopeNamespaceList *syms_scopes_that_are_namespaces = 0; + ProfScope("produce symbols from all streams") + { +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + + //////////////////////////// + //- rjf: set up + // + if(lane_idx() == 0) + { + syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); + syms_scopes_that_are_namespaces = push_array(arena, ScopeNamespaceList, all_syms_count); + } + lane_sync_u64(&syms_typedefs, 0); + lane_sync_u64(&syms_scopes_that_are_namespaces, 0); + + //////////////////////////// + //- rjf: fill outputs for all unit sym blocks in this lane + // + if(params->subset_flags & (RDIM_SubsetFlag_Procedures| + RDIM_SubsetFlag_GlobalVariables| + RDIM_SubsetFlag_ThreadVariables| + RDIM_SubsetFlag_Scopes| + RDIM_SubsetFlag_Locals| + RDIM_SubsetFlag_GlobalVariableNameMap| + RDIM_SubsetFlag_ThreadVariableNameMap| + RDIM_SubsetFlag_ProcedureNameMap| + RDIM_SubsetFlag_ConstantNameMap| + RDIM_SubsetFlag_LinkNameProcedureNameMap| + RDIM_SubsetFlag_Types)) + { + U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; + lane_sync_u64(&sym_take_counter, 0); + for(;;) + { + //- rjf: take next sym + U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; + if(sym_idx >= all_syms_count) + { + break; + } + + //- rjf: unpack sym + Temp scratch = scratch_begin(&arena, 1); + CV_SymParsed *sym = all_syms[sym_idx]; + RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; + RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; + RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; + RDIM_SymbolChunkList *sym_thread_variables = &sym_unit->thread_variables; + RDIM_SymbolChunkList *sym_constants = &sym_unit->constants; + RDIM_ScopeChunkList *sym_scopes = &sym_unit->scopes; + RDIM_InlineSiteChunkList *sym_inline_sites = &sym_unit->inline_sites; + RDIM_TypeChunkList *typedefs = &syms_typedefs[sym_idx]; + + ////////////////////////// + //- rjf: symbols pass 0: predict symbol chunk counts by record kinds + // + U64 sym_procedures_chunk_cap = sym->sym_ranges.count/4 + 1; + U64 sym_global_variables_chunk_cap = sym->sym_ranges.count/12 + 1; + U64 sym_thread_variables_chunk_cap = sym->sym_ranges.count/12 + 1; + U64 sym_constants_chunk_cap = sym->sym_ranges.count/6 + 1; + U64 sym_scopes_chunk_cap = sym->sym_ranges.count/4 + 1; + U64 sym_inline_sites_chunk_cap = sym->sym_ranges.count/6 + 1; + ProfScope("symbols pass 0: predict symbol chunk counts by record kinds") + { + U64 procedure_record_count = 0; + U64 global_variable_record_count = 0; + U64 thread_variable_record_count = 0; + U64 constant_record_count = 0; + U64 scope_record_count = 0; + U64 inline_site_record_count = 0; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + case CV_SymKind_THUNK32: + { + procedure_record_count += 1; + scope_record_count += 1; + }break; + case CV_SymKind_BLOCK32: + { + scope_record_count += 1; + }break; + case CV_SymKind_INLINESITE: + { + scope_record_count += 1; + inline_site_record_count += 1; + }break; + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + global_variable_record_count += 1; + }break; + case CV_SymKind_CONSTANT: + { + constant_record_count += 1; + }break; + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + { + thread_variable_record_count += 1; + }break; + } + } + sym_procedures_chunk_cap = Max(1, procedure_record_count); + sym_global_variables_chunk_cap = Max(1, global_variable_record_count); + sym_thread_variables_chunk_cap = Max(1, thread_variable_record_count); + sym_constants_chunk_cap = Max(1, constant_record_count); + sym_scopes_chunk_cap = Max(1, scope_record_count); + sym_inline_sites_chunk_cap = Max(1, inline_site_record_count); + } + + ////////////////////////// + //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) + // + U64 procedure_frameprocs_count = 0; + U64 procedure_frameprocs_cap = sym->sym_ranges.count; + CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); + ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") + { + U64 procedure_num = 0; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + + //- rjf: FRAMEPROC + case CV_SymKind_FRAMEPROC: + { + if(procedure_num == 0) { break; } + if(procedure_num > procedure_frameprocs_cap) { break; } + CV_SymFrameproc *frameproc = (CV_SymFrameproc *)iter.struct_base; + procedure_frameprocs[procedure_num-1] = frameproc; + procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + procedure_num += 1; + }break; + } + } + U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); + arena_pop(scratch.arena, scratch_overkill); + } + + ////////////////////////// + //- rjf: symbols pass 2: construct all symbols, given procedure frame info map + // + ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") + { + RDIM_Symbol *defrange_target = 0; + U64 procedure_num = 0; + U64 procedure_base_voff = 0; + CV_ProcFlags proc_flags = 0; + U64 regrel_idx = 0; + RDIM_Symbol *curr_proc_symbol = 0; + typedef struct CV2R_ScopeNode CV2R_ScopeNode; + struct CV2R_ScopeNode + { + CV2R_ScopeNode *next; + RDIM_Scope *scope; + }; + CV2R_ScopeNode *top_scope_node = 0; + CV2R_ScopeNode *free_scope_node = 0; + RDIM_LineTable *inline_site_line_table = sym_idx > 0 ? units_first_inline_site_line_tables[sym_idx-1] : 0; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + switch(iter.kind) + { + default:{}break; + + //- rjf: END + case CV_SymKind_END: + { + CV2R_ScopeNode *n = top_scope_node; + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } + defrange_target = 0; + }break; + + //- rjf: BLOCK32 + case CV_SymKind_BLOCK32: + { + // rjf: unpack sym + CV_SymBlock32 *block32 = (CV_SymBlock32 *)iter.struct_base; + + // rjf: build scope, insert into current parent scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); + { + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + U64 voff_first = cv2r_voff_from_soff(sections, sections_count, block32->sec, block32->off); + if(voff_first != 0) + { + U64 voff_last = voff_first + block32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range); + } + } + + // rjf: push this scope to scope stack + { + CV2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, CV2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + }break; + + //- rjf: LDATA32/GDATA32 + case CV_SymKind_LDATA32: + case CV_SymKind_GDATA32: + { + // rjf: unpack sym + CV_SymData32 *data32 = (CV_SymData32 *)iter.struct_base; + String8 name = str8_cstring_capped(data32+1, iter.opl); + U64 voff = cv2r_voff_from_soff(sections, sections_count, data32->sec, data32->off); + + // rjf: determine if this is an exact duplicate global + // + // PDB likes to have duplicates of these spread across different + // symbol streams so we deduplicate across the entire translation + // context. + // + B32 is_duplicate = 0; + { + // TODO(rjf): @important global symbol dedup + } + + // rjf: is not duplicate -> push new global + if(!is_duplicate) + { + // rjf: unpack global variable's type + RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); + + // rjf: unpack global's container type + B32 got_container = 0; + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); + if(!got_container && container_name.size != 0) + { + CV_TypeId cv_type_id = cv2r_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + got_container = (container_type != 0); + } + + // rjf: unpack global's container scope + RDIM_Scope *container_scope = 0; + if(!got_container && top_scope_node != 0 && iter.kind == CV_SymKind_LDATA32) + { + container_scope = top_scope_node->scope; + got_container = (container_scope != 0); + } + + // rjf: unpack global's container namespace + RDIM_Namespace *container_namespace = 0; + if(!got_container && container_name.size != 0) + { + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(container_name, n->string, 0) && + n->ns != 0) + { + container_namespace = n->ns; + break; + } + } + } + + // rjf: un-namespaceify the symbol name + String8 name__maybe_partially_qualified = name; + if(got_container) + { + name__maybe_partially_qualified = str8_skip(name, container_name_opl); + } + + // rjf: build symbol + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_global_variables, sym_global_variables_chunk_cap); + symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); + symbol->name = name__maybe_partially_qualified; + symbol->type = type; + symbol->container_scope = container_scope; + symbol->container_type = container_type; + symbol->container_namespace = container_namespace; + RDIM_Location loc = {.kind = RDI_LocationKind_ModuleOff, .offset = voff}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &symbol->location_cases, loc, range); + } + }break; + + //- rjf: UDT (typedefs) + case CV_SymKind_UDT: + if(sym == all_syms[0] && top_scope_node == 0) + { + if(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs|RDIM_SubsetFlag_TypeNameMap)) + { + CV_SymUDT *udt = (CV_SymUDT *)iter.struct_base; + String8 name = str8_cstring_capped(udt+1, iter.opl); + RDIM_Type *type = rdim_type_chunk_list_push(arena, typedefs, 4096); + type->kind = RDI_TypeKind_Alias; + type->name = name; + type->direct_type = p2r_type_ptr_from_itype(udt->itype); + if(type->direct_type != 0) + { + type->byte_size = type->direct_type->byte_size; + } + } + }break; + + //- rjf: LPROC32/GPROC32 + case CV_SymKind_LPROC32: + case CV_SymKind_GPROC32: + { + // rjf: unpack sym + CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; + String8 name = str8_cstring_capped(proc32+1, iter.opl); + RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); + + // rjf: unpack proc's container type + B32 got_container = 0; + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); + if(!got_container && container_name.size != 0 && tpi_hash != 0 && tpi_leaf != 0) + { + CV_TypeId cv_type_id = cv2r_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + got_container = (container_type != 0); + } + + // rjf: unpack proc's container scope + RDIM_Scope *container_scope = 0; + if(!got_container && top_scope_node != 0) + { + container_scope = top_scope_node->scope; + got_container = 1; + } + + // rjf: unpack proc's container namespace + RDIM_Namespace *container_namespace = 0; + if(!got_container && container_name.size != 0) + { + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(container_name, n->string, 0) && + n->ns != 0) + { + container_namespace = n->ns; + break; + } + } + } + + // rjf: build procedure's root scope + // + // NOTE: even if there could be a containing scope at this point (which should be + // illegal in C/C++ but not necessarily in another language) we would not use + // it here because these scopes refer to the ranges of code that make up a + // procedure *not* the namespaces, so a procedure's root scope always has + // no parent. + RDIM_Scope *procedure_root_scope = 0; + if(params->subset_flags & RDIM_SubsetFlag_Scopes) + { + procedure_root_scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); + U64 voff_first = cv2r_voff_from_soff(sections, sections_count, proc32->sec, proc32->off); + if(voff_first != 0) + { + U64 voff_last = voff_first + proc32->len; + RDIM_Rng1U64 voff_range = {voff_first, voff_last}; + rdim_scope_push_voff_range(arena, sym_scopes, procedure_root_scope, voff_range); + procedure_base_voff = voff_first; + } + } + + // rjf: root scope voff minimum range -> link name + String8 link_name = {0}; + if(procedure_root_scope && procedure_root_scope->voff_ranges.min != 0) + { + U64 voff = procedure_root_scope->voff_ranges.min; + U64 hash = p2r_hash_from_voff(voff); + U64 bucket_idx = hash%link_name_map->buckets_count; + CV2R_LinkNameNode *node = 0; + for(CV2R_LinkNameNode *n = link_name_map->buckets[bucket_idx]; n != 0; n = n->next) + { + if(n->voff == voff) + { + link_name = n->name; + ins_atomic_u64_inc_eval(&n->referencing_symbol_count); + break; + } + } + } + + // rjf: un-namespaceify the symbol name + String8 name__maybe_partially_qualified = name; + if(got_container) + { + name__maybe_partially_qualified = str8_skip(name, container_name_opl); + } + + // rjf: build procedure symbol + if(params->subset_flags & (RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_ProcedureNameMap)) + { + curr_proc_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); + curr_proc_symbol->is_extern = (iter.kind == CV_SymKind_GPROC32); + curr_proc_symbol->name = name__maybe_partially_qualified; + curr_proc_symbol->link_name = link_name; + curr_proc_symbol->type = type; + curr_proc_symbol->container_scope = container_scope; + curr_proc_symbol->container_type = container_type; + curr_proc_symbol->root_scope = procedure_root_scope; + if(procedure_root_scope != 0) + { + procedure_root_scope->symbol = curr_proc_symbol; + } + } + + // rjf: push scope to scope stack + if(procedure_root_scope) + { + CV2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, CV2R_ScopeNode, 1); } + node->scope = procedure_root_scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: determine if this procedure is a namespace used for types; if so, gather + if(procedure_root_scope != 0) + { + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, name, 0)) + { + ScopeNamespaceNode *node = push_array(arena, ScopeNamespaceNode, 1); + node->scope = procedure_root_scope; + node->string = name; + SLLQueuePush(syms_scopes_that_are_namespaces[sym_idx].first, + syms_scopes_that_are_namespaces[sym_idx].last, + node); + break; + } + } + } + + // rjf: increment procedure counter + procedure_num += 1; + + // reset S_REGREL32 index + regrel_idx = 0; + + proc_flags = proc32->flags; + }break; + + //- rjf: THUNK32 + case CV_SymKind_THUNK32: + { + // rjf: unpack record + CV_SymThunk32 *thunk32 = (CV_SymThunk32 *)iter.struct_base; + String8 name = str8_cstring_capped(thunk32+1, iter.opl); + U64 voff_first = cv2r_voff_from_soff(sections, sections_count, thunk32->sec, thunk32->off); + U64 voff_opl = voff_first + thunk32->len; + + // rjf: build symbol / scope + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); + symbol->name = name; + symbol->is_thunk = 1; + if(voff_first != voff_opl) + { + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); + RDIM_Rng1U64 range = {voff_first, voff_opl}; + rdim_scope_push_voff_range(arena, sym_scopes, scope, range); + scope->symbol = symbol; + symbol->root_scope = scope; + } + }break; + + //- rjf: REGREL32 + case CV_SymKind_REGREL32: + { + if(params->subset_flags & RDIM_SubsetFlag_Locals && !(proc_flags & CV_ProcFlag_OptDbgInfo)) + { + // TODO(rjf): apparently some of the information here may end up being + // redundant with "better" information from CV_SymKind_LOCAL record. + // we don't currently handle this, but if those cases arise then it + // will obviously be better to prefer the better information from both + // records. + + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)iter.struct_base; + String8 name = str8_cstring_capped(regrel32+1, iter.opl); + RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); + CV_Reg cv_reg = regrel32->reg; + U32 var_off = regrel32->reg_off; + + // rjf: determine if this is a parameter + B32 is_param = (regrel_idx < curr_proc_symbol->type->count); + + // rjf: determine if we need an extra indirection to the value + B32 extra_indirection_to_value = 0; + if(type != 0) + { + switch(arch) + { + case RDI_Arch_X64: + { + extra_indirection_to_value = (is_param && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); + }break; + } + } + + // If the return local does not fit in a register MSVC does not assign it a type. + // So we infer the return type from the signature. + // + // rjf: redirect type, if 0, and if outside frame, to the return type of the + // containing procedure + { + B32 is_stack_reg = 0; + switch(arch) + { + default:{}break; + case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP || cv_reg == CV_Regx64_RBP);}break; + } + if(is_stack_reg) + { + if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num <= procedure_frameprocs_count) + { + CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; + if(var_off > frameproc->frame_size && regrel32->itype == 0 && + top_scope_node->scope->symbol != 0 && + top_scope_node->scope->symbol->type != 0) + { + type = top_scope_node->scope->symbol->type->direct_type; + extra_indirection_to_value = 1; + } + } + } + } + + // rjf: build local + { + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + local->container_scope = scope; + local->is_param = is_param; + local->name = name; + local->type = type; + + // rjf: equip location info + { + // rjf: get raddbg register code + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + // TODO(rjf): real byte_size & byte_pos from cv_reg goes here + U32 byte_size = 8; + U32 byte_pos = 0; + + // rjf: build location + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_case_list_push(arena, &local->location_cases, loc, voff_range); + } + } + } + + regrel_idx += 1; + }break; + + //- rjf: LTHREAD32/GTHREAD32 + case CV_SymKind_LTHREAD32: + case CV_SymKind_GTHREAD32: + if(params->subset_flags & (RDIM_SubsetFlag_ThreadVariables|RDIM_SubsetFlag_ThreadVariableNameMap)) + { + // rjf: unpack sym + CV_SymThread32 *thread32 = (CV_SymThread32 *)iter.struct_base; + String8 name = str8_cstring_capped(thread32+1, iter.opl); + U32 tls_off = thread32->tls_off; + RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); + + // rjf: unpack thread variable's container type + B32 got_container = 0; + RDIM_Type *container_type = 0; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); + if(!got_container && container_name.size != 0) + { + CV_TypeId cv_type_id = cv2r_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); + container_type = p2r_type_ptr_from_itype(cv_type_id); + got_container = (container_type != 0); + } + + // rjf: unpack thread variable's container symbol + RDIM_Scope *container_scope = 0; + if(!got_container && top_scope_node != 0) + { + got_container = 1; + container_scope = top_scope_node->scope; + } + + // rjf: unpack proc's container namespace + RDIM_Namespace *container_namespace = 0; + if(!got_container && container_name.size != 0) + { + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(container_name, n->string, 0) && + n->ns != 0) + { + container_namespace = n->ns; + break; + } + } + } + + // rjf: un-namespaceify the symbol name + String8 name__maybe_partially_qualified = name; + if(got_container) + { + name__maybe_partially_qualified = str8_skip(name, container_name_opl); + } + + // rjf: build symbol + RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, sym_thread_variables, sym_thread_variables_chunk_cap); + tvar->name = name__maybe_partially_qualified; + tvar->type = type; + tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); + tvar->container_type = container_type; + tvar->container_scope = container_scope; + tvar->container_namespace = container_namespace; + RDIM_Location loc = {.kind = RDI_LocationKind_TLSOff, .offset = tls_off}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &tvar->location_cases, loc, range); + }break; + + //- rjf: LOCAL + case CV_SymKind_LOCAL: + if(params->subset_flags & (RDIM_SubsetFlag_Locals)) + { + // rjf: no containing scope? -> malformed data; locals cannot be produced + // outside of a containing scope + if(top_scope_node == 0) + { + break; + } + + // rjf: unpack sym + CV_SymLocal *slocal = (CV_SymLocal *)iter.struct_base; + String8 name = str8_cstring_capped(slocal+1, iter.opl); + RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); + + // rjf: determine if this symbol encodes the beginning of a global modification + B32 is_global_modification = 0; + if((slocal->flags & CV_LocalFlag_Global) || + (slocal->flags & CV_LocalFlag_Static)) + { + is_global_modification = 1; + } + + // rjf: is global modification -> emit global modification symbol + if(is_global_modification) + { + // TODO(rjf): add global modification symbols + defrange_target = 0; + } + + // rjf: is not a global modification -> emit a local variable + if(!is_global_modification) + { + // rjf: build local + RDIM_Scope *scope = top_scope_node->scope; + RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); + { + local->container_scope = scope; + local->is_param = !!(slocal->flags & CV_LocalFlag_Param); + local->name = name; + local->type = type; + } + + // rjf: save defrange target, for subsequent defrange symbols + defrange_target = local; + } + }break; + + //- rjf: DEFRANGE_REGISTER + case CV_SymKind_DEFRANGE_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)iter.struct_base; + CV_Reg cv_reg = defrange_register->reg; + CV_LvarAddrRange *range = &defrange_register->range; + U64 range_voff_first = cv2r_voff_from_soff(sections, sections_count, range->sec, range->off); + U64 range_voff_opl = range_voff_first + range->len; + Rng1U64 voff_range = r1u64(range_voff_first, range_voff_opl); + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + + // rjf: build location + RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; + + // rjf: emit locations over ranges + cv2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, voff_range, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)iter.struct_base; + CV_LvarAddrRange *range = &defrange_fprel->range; + U64 range_voff_first = cv2r_voff_from_soff(sections, sections_count, range->sec, range->off); + U64 range_voff_opl = range_voff_first + range->len; + Rng1U64 voff_range = r1u64(range_voff_first, range_voff_opl); + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: select frame pointer register + CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); + RDI_RegCode fp_register_code = cv2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel->off; + RDIM_Location location = cv2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit locations over ranges + cv2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, location, voff_range, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_SUBFIELD_REGISTER + case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)iter.struct_base; + CV_Reg cv_reg = defrange_subfield_register->reg; + CV_LvarAddrRange *range = &defrange_subfield_register->range; + U64 range_voff_first = cv2r_voff_from_soff(sections, sections_count, range->sec, range->off); + U64 range_voff_opl = range_voff_first + range->len; + Rng1U64 voff_range = r1u64(range_voff_first, range_voff_opl); + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); + RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + + // rjf: skip "subfield" location info - currently not supported + if(defrange_subfield_register->field_offset != 0) + { + break; + } + + // rjf: build location + RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; + + // rjf: emit locations over ranges + cv2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, voff_range, gaps, gap_count); + }break; + + //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE + case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: find current procedure's frameproc + CV_SymFrameproc *frameproc = 0; + if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) + { + frameproc = procedure_frameprocs[procedure_num-1]; + } + + // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange + // without having an actually active procedure - break + if(frameproc == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)iter.struct_base; + CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); + RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); + + // rjf: build location + B32 extra_indirection = 0; + U32 byte_size = rdi_addr_size_from_arch(arch); + U32 byte_pos = 0; + S64 var_off = (S64)defrange_fprel_full_scope->off; + RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + + // rjf: emit location over ranges + RDIM_Rng1U64 voff_range = {0, max_U64}; + rdim_location_case_list_push(arena, &defrange_target->location_cases, loc, voff_range); + }break; + + //- rjf: DEFRANGE_REGISTER_REL + case CV_SymKind_DEFRANGE_REGISTER_REL: + { + // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing + // a local - break immediately + if(defrange_target == 0) + { + break; + } + + // rjf: unpack sym + CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)iter.struct_base; + CV_Reg cv_reg = defrange_register_rel->reg; + RDI_RegCode reg_code = cv2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + CV_LvarAddrRange *range = &defrange_register_rel->range; + U64 range_voff_first = cv2r_voff_from_soff(sections, sections_count, range->sec, range->off); + U64 range_voff_opl = range_voff_first + range->len; + Rng1U64 voff_range = r1u64(range_voff_first, range_voff_opl); + CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); + U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); + + // rjf: build location + // TODO(rjf): offset & size from cv_reg code + U32 byte_size = rdi_addr_size_from_arch(arch); + U32 byte_pos = 0; + B32 extra_indirection_to_value = 0; + S64 var_off = defrange_register_rel->reg_off; + RDIM_Location loc = cv2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); + + // rjf: emit locations over ranges + cv2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, voff_range, gaps, gap_count); + }break; + + //- rjf: FILESTATIC + case CV_SymKind_FILESTATIC: + { + CV_SymFileStatic *file_static = (CV_SymFileStatic*)iter.struct_base; + String8 name = str8_cstring_capped(file_static+1, iter.opl); + RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); + // TODO(rjf): emit a global modifier symbol + defrange_target = 0; + }break; + + //- rjf: INLINESITE + case CV_SymKind_INLINESITE: + if(params->subset_flags & (RDIM_SubsetFlag_Scopes)) + { + // rjf: unpack sym + CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; + String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); + + // rjf: extract external info about inline site + String8 name = {0}; + RDIM_Type *type = 0; + RDIM_Type *owner = 0; + if(ipi_leaf != 0 && ipi_leaf->itype_first <= sym->inlinee && sym->inlinee < ipi_leaf->itype_opl) + { + CV_RecRange rec_range = ipi_leaf->leaf_ranges.ranges[sym->inlinee - ipi_leaf->itype_first]; + String8 rec_data = str8_substr(ipi_leaf->data, rng_1u64(rec_range.off, rec_range.off + rec_range.hdr.size)); + void *raw_leaf = rec_data.str + sizeof(U16); + + // rjf: extract method inline info + if(rec_range.hdr.kind == CV_LeafKind_MFUNC_ID && + rec_range.hdr.size >= sizeof(CV_LeafMFuncId)) + { + CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)raw_leaf; + name = str8_cstring_capped(mfunc_id + 1, rec_data.str + rec_data.size); + type = p2r_type_ptr_from_itype(mfunc_id->itype); + owner = mfunc_id->owner_itype != 0 ? p2r_type_ptr_from_itype(mfunc_id->owner_itype) : 0; + } + + // rjf: extract non-method function inline info + else if(rec_range.hdr.kind == CV_LeafKind_FUNC_ID && + rec_range.hdr.size >= sizeof(CV_LeafFuncId)) + { + CV_LeafFuncId *func_id = (CV_LeafFuncId*)raw_leaf; + name = str8_cstring_capped(func_id + 1, rec_data.str + rec_data.size); + type = p2r_type_ptr_from_itype(func_id->itype); + owner = func_id->scope_string_id != 0 ? p2r_type_ptr_from_itype(func_id->scope_string_id) : 0; + } + } + + // rjf: build inline site + RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, sym_inline_sites, sym_inline_sites_chunk_cap); + inline_site->name = name; + inline_site->type = type; + inline_site->owner = owner; + inline_site->line_table = inline_site_line_table; + + // rjf: increment to next inline site line table in this unit + if(inline_site_line_table != 0 && inline_site_line_table->chunk != 0) + { + RDIM_LineTableChunkNode *chunk = inline_site_line_table->chunk; + U64 current_idx = (U64)(inline_site_line_table - chunk->v); + if(current_idx+1 < chunk->count) + { + inline_site_line_table += 1; + } + else + { + chunk = chunk->next; + inline_site_line_table = 0; + if(chunk != 0) + { + inline_site_line_table = chunk->v; + } + } + } + + // rjf: build scope + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); + scope->inline_site = inline_site; + if(top_scope_node == 0) + { + // TODO(rjf): log + } + if(top_scope_node != 0) + { + RDIM_Scope *top_scope = top_scope_node->scope; + SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); + scope->parent_scope = top_scope; + scope->symbol = top_scope->symbol; + } + + // rjf: push this scope to scope stack + { + CV2R_ScopeNode *node = free_scope_node; + if(node != 0) { SLLStackPop(free_scope_node); } + else { node = push_array_no_zero(scratch.arena, CV2R_ScopeNode, 1); } + node->scope = scope; + SLLStackPush(top_scope_node, node); + } + + // rjf: parse offset ranges of this inline site - attach to scope + { + CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(0, 0, procedure_base_voff); + for(;;) + { + CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots); + + if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitRange) + { + // rjf: build new range & add to scope + RDIM_Rng1U64 voff_range = { step.range.min, step.range.max }; + rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range); + } + + if(step.flags & CV_C13InlineSiteDecoderStepFlag_ExtendLastRange) + { + if(scope->voff_ranges.last != 0) + { + scope->voff_ranges.last->v.max = step.range.max; + } + } + + if(step.flags == 0) + { + break; + } + } + } + }break; + + //- rjf: INLINESITE_END + case CV_SymKind_INLINESITE_END: + { + CV2R_ScopeNode *n = top_scope_node; + if(n != 0) + { + SLLStackPop(top_scope_node); + SLLStackPush(free_scope_node, n); + } + defrange_target = 0; + }break; + + //- rjf: CONSTANT + case CV_SymKind_CONSTANT: + if(params->subset_flags & RDIM_SubsetFlag_Constants) + { + // rjf: unpack + CV_SymConstant *sym = (CV_SymConstant *)iter.struct_base; + RDIM_Type *type = p2r_type_ptr_from_itype(sym->itype); + U8 *val_ptr = (U8 *)(sym+1); + CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, iter.opl); + U64 val64 = cv_u64_from_numeric(&val); + U8 *name_ptr = val_ptr + val.encoded_size; + String8 name = str8_cstring_capped(name_ptr, iter.opl); + String8 val_data = str8_struct(&val64); + U64 container_name_opl = 0; + if(type != 0) + { + container_name_opl = p2r_end_of_cplusplus_container_name(type->name); + } + String8 name_qualified = name; + if(container_name_opl != 0) + { + name_qualified = push_str8f(arena, "%S%S", str8_prefix(type->name, container_name_opl), name); + } + + // rjf: build constant symbol + if(name_qualified.size != 0) + { + RDIM_Symbol *cnst = rdim_symbol_chunk_list_push(arena, sym_constants, sym_constants_chunk_cap); + cnst->name = name_qualified; + cnst->type = type; + RDIM_Location loc = {.kind = RDI_LocationKind_ConstantDataOff, .value_data = str8_copy(arena, val_data)}; + RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; + rdim_location_case_list_push(arena, &cnst->location_cases, loc, range); + } + }break; + } + } + } + + scratch_end(scratch); + } + } +#undef p2r_type_ptr_from_itype + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: produce stub procedures from all pub32 symbols + // + if(lane_idx() == 0) + { + CV_SymParsed *sym = all_syms[0]; + for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) + { + RDIM_Unit *sym_unit = &all_units_ptr->first->v[0]; + RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; + RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; + RDIM_ScopeChunkList *sym_scopes = &sym_unit->scopes; + switch(iter.kind) + { + default:{}break; + case CV_SymKind_PUB32: + { + // rjf: unpack record + CV_SymPub32 *pub32 = (CV_SymPub32 *)iter.struct_base; + String8 name = str8_cstring_capped(pub32+1, iter.opl); + U64 voff = cv2r_voff_from_soff(sections, sections_count, pub32->sec, pub32->off); + + // rjf: determine if this pub32 was covered by another symbol record + B32 was_in_other_record = 0; + { + U64 hash = p2r_hash_from_voff(voff); + U64 slot_idx = hash%link_name_map->buckets_count; + for(CV2R_LinkNameNode *n = link_name_map->buckets[slot_idx]; n != 0; n = n->next) + { + if(n->voff == voff) + { + was_in_other_record = (n->referencing_symbol_count != 0); + break; + } + } + } + + // rjf: find compilation unit contribution to determine pub32's size + U64 voff_opl = voff+1; + if(!was_in_other_record) + { + CV2R_CompUnitContribution *contrib = cv2r_comp_unit_contribution_from_voff__binary_search(params->comp_unit_contributions, params->comp_unit_contributions_count, voff); + if(contrib != 0) + { + voff_opl = contrib->voff_opl; + } + } + + // rjf: if this pub32 was *not* covered by another symbol record, build a symbol for it + if(!was_in_other_record) + { + B32 is_procedure = (pub32->flags & (CV_Pub32Flag_Code|CV_Pub32Flag_Function)); + RDIM_SymbolChunkList *symbols = is_procedure ? sym_procedures : sym_global_variables; + RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, symbols, 64); + symbol->name = name; + symbol->link_name = name; + if(is_procedure) + { + RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, 64); + scope->symbol = symbol; + RDIM_Rng1U64 range = {voff, voff_opl}; + rdim_scope_push_voff_range(arena, sym_scopes, scope, range); + symbol->root_scope = scope; + } + } + }break; + } + } + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: upgrade namespace nodes with scopes info, if they match a scope + // + if(lane_idx() == 0) + { + for EachIndex(sym_idx, all_syms_count) + { + ScopeNamespaceList *scopes_that_are_namespaces = &syms_scopes_that_are_namespaces[sym_idx]; + for(ScopeNamespaceNode *scope_n = scopes_that_are_namespaces->first; scope_n != 0; scope_n = scope_n->next) + { + U64 hash = u64_hash_from_str8(scope_n->string); + U64 slot_idx = hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + n->scope = scope_n->scope; + } + } + } + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: upgrade namespaces with container info; trim off container names + // + for EachNode(n, RDIM_NamespaceChunkNode, all_namespaces.first) + { + Rng1U64 range = lane_range(n->count); + for EachInRange(n_idx, range) + { + RDIM_Namespace *ns = &n->v[n_idx]; + U64 container_name_opl = p2r_end_of_cplusplus_container_name(ns->name); + String8 container_name = str8_chop(str8_prefix(ns->name, container_name_opl), 2); + if(container_name.size != 0) + { + String8 leaf_name = str8_skip(ns->name, container_name_opl); + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *ns_n = all_namespace_slots[slot_idx]; ns_n != 0; ns_n = ns_n->next) + { + if(str8_match(ns_n->string, container_name, 0)) + { + ns->parent_scope = ns_n->scope; + ns->parent_type = ns_n->type; + ns->parent_namespace = ns_n->ns; + break; + } + } + ns->name = leaf_name; + } + } + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: join extra types from units + // + RDIM_TypeChunkList all_types = {0}; + { + RDIM_TypeChunkList *all_types_ptr = 0; + if(lane_idx() == 0) + { + all_types_ptr = push_array(scratch.arena, RDIM_TypeChunkList, 1); + } + lane_sync_u64(&all_types_ptr, 0); + if(lane_idx() == lane_from_task_idx(7)) ProfScope("join typedefs") + { + for EachIndex(idx, all_syms_count) + { + rdim_type_chunk_list_concat_in_place(all_types__pre_typedefs_ptr, &syms_typedefs[idx]); + } + *all_types_ptr = *all_types__pre_typedefs_ptr; + } + lane_sync(); + all_types = *all_types_ptr; + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: build UDTs + // + RDIM_UDTChunkList *lanes_udts = 0; + ProfScope("build UDTs") + { +#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) + + //- rjf: gather this lane's UDTs + RDIM_UDTChunkList lane_udts = {0}; + if(params->subset_flags & RDIM_SubsetFlag_Types && + params->subset_flags & RDIM_SubsetFlag_UDTs) + { + U64 udts_chunk_cap = 4096; + RDIM_UDTChunkList *udts = &lane_udts; + Rng1U64 range = lane_range(itype_opl); + for EachInRange(idx, range) + { + //- rjf: skip basics + CV_TypeId itype = (CV_TypeId)idx; + if(itype < itype_first) { continue; } + + //- rjf: grab type for this itype - skip if empty + RDIM_Type *dst_type = itype_type_ptrs[itype]; + if(dst_type == 0) { continue; } + + //- rjf: unpack itype leaf range - skip if out-of-range + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first]; + CV_LeafKind kind = range->hdr.kind; + U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); + U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; + U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; + if(range->off+range->hdr.size > tpi_leaf->data.size || + range->off+2+header_struct_size > tpi_leaf->data.size || + range->hdr.size < 2) + { + continue; + } + + //- rjf: build UDT + String8 udt_name = {0}; + CV_TypeId field_itype = 0; + switch(kind) + { + default:{}break; + + //////////////////////// + //- rjf: structs/unions/classes -> equip members + // + case CV_LeafKind_CLASS: + case CV_LeafKind_STRUCTURE: + { + CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }goto equip_members; + case CV_LeafKind_UNION: + { + CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + field_itype = lf->field_itype; + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); + }goto equip_members; + case CV_LeafKind_CLASS2: + case CV_LeafKind_STRUCT2: + { + CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + U8 *numeric_ptr = (U8*)(lf + 1); + CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); + U8 *name_ptr = numeric_ptr + size.encoded_size; + udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); + field_itype = lf->field_itype; + }goto equip_members; + equip_members: + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: grab UDT info + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); + dst_udt->self_type = dst_type; + } + + //- rjf: gather all fields + typedef struct FieldListTask FieldListTask; + struct FieldListTask + { + FieldListTask *next; + CV_TypeId itype; + }; + FieldListTask start_fl_task = {0, field_itype}; + FieldListTask *fl_todo_stack = &start_fl_task; + FieldListTask *fl_done_stack = 0; + for(;fl_todo_stack != 0;) + { + //- rjf: take & unpack task + FieldListTask *fl_task = fl_todo_stack; + SLLStackPop(fl_todo_stack); + SLLStackPush(fl_done_stack, fl_task); + CV_TypeId field_list_itype = fl_task->itype; + + //- rjf: skip bad itypes + if(field_list_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= field_list_itype) + { + continue; + } + + //- rjf: field list itype -> range + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-tpi_leaf->itype_first]; + + //- rjf: skip bad headers + if(range->off+range->hdr.size > tpi_leaf->data.size || + range->hdr.size < 2 || + range->hdr.kind != CV_LeafKind_FIELDLIST) + { + continue; + } + + //- rjf: loop over all fields + { + U8 *field_list_first = tpi_leaf->data.str+range->off+2; + U8 *field_list_opl = field_list_first+range->hdr.size-2; + for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; + read_ptr < field_list_opl; + read_ptr = next_read_ptr) + { + // rjf: unpack field + CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; + U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); + U8 *field_leaf_first = read_ptr+2; + U8 *field_leaf_opl = field_list_opl; + next_read_ptr = field_leaf_opl; + + // rjf: skip out-of-bounds fields + if(field_leaf_first+field_leaf_header_size > field_list_opl) + { + continue; + } + + // rjf: process field + switch(field_kind) + { + //- rjf: unhandled/invalid cases + default: + { + // TODO(rjf): log + }break; + + //- rjf: INDEX + case CV_LeafKind_INDEX: + { + // rjf: unpack leaf + CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; + CV_TypeId new_itype = lf->itype; + + // rjf: bump next read pointer past header + next_read_ptr = (U8 *)(lf+1); + + // rjf: determine if index itype is new + B32 is_new = 1; + for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) + { + if(t->itype == new_itype) + { + is_new = 0; + break; + } + } + + // rjf: if new -> push task to follow new itype + if(is_new) + { + FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); + SLLStackPush(fl_todo_stack, new_task); + new_task->itype = new_itype; + } + }break; + + //- rjf: MEMBER + case CV_LeafKind_MEMBER: + { + // TODO(rjf): log on bad offset + + // rjf: unpack leaf + CV_LeafMember *lf = (CV_LeafMember *)field_leaf_first; + U8 *offset_ptr = (U8 *)(lf+1); + CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); + U64 offset64 = cv_u64_from_numeric(&offset); + U8 *name_ptr = offset_ptr + offset.encoded_size; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_DataField; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + mem->off = (U32)offset64; + }break; + + //- rjf: STMEMBER + case CV_LeafKind_STMEMBER: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafStMember *lf = (CV_LeafStMember *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticData; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: METHOD + case CV_LeafKind_METHOD: + { + // rjf: unpack leaf + CV_LeafMethod *lf = (CV_LeafMethod *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + //- rjf: method list itype -> range + CV_RecRange *method_list_range = &tpi_leaf->leaf_ranges.ranges[lf->list_itype-tpi_leaf->itype_first]; + + //- rjf: skip bad method lists + if(method_list_range->off+method_list_range->hdr.size > tpi_leaf->data.size || + method_list_range->hdr.size < 2 || + method_list_range->hdr.kind != CV_LeafKind_METHODLIST) + { + break; + } + + //- rjf: loop through all methods & emit members + U8 *method_list_first = tpi_leaf->data.str + method_list_range->off + 2; + U8 *method_list_opl = method_list_first + method_list_range->hdr.size-2; + for(U8 *method_read_ptr = method_list_first, *next_method_read_ptr = method_list_opl; + method_read_ptr < method_list_opl; + method_read_ptr = next_method_read_ptr) + { + CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)method_read_ptr; + CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(method->attribs); + RDIM_Type *method_type = p2r_type_ptr_from_itype(method->itype); + next_method_read_ptr = (U8 *)(method+1); + + // TODO(allen): PROBLEM + // We only get offsets for virtual functions (the "vbaseoff") from + // "Intro" and "PureIntro". In C++ inheritance, when we have a chain + // of inheritance (let's just talk single inheritance for now) the + // first class in the chain that introduces a new virtual function + // has this "Intro" method. If a later class in the chain redefines + // the virtual function it only has a "Virtual" method which does + // not update the offset. There is a "Virtual" and "PureVirtual" + // variant of "Virtual". The "Pure" in either case means there + // is no concrete procedure. When there is no "Pure" the method + // should have a corresponding procedure symbol id. + // + // The issue is we will want to mark all of our virtual methods as + // virtual and give them an offset, but that means we have to do + // some extra figuring to propogate offsets from "Intro" methods + // to "Virtual" methods in inheritance trees. That is - IF we want + // to start preserving the offsets of virtuals. There is room in + // the method struct to make this work, but for now I've just + // decided to drop this information. It is not urgently useful to + // us and greatly complicates matters. + + // rjf: read vbaseoff + U32 vbaseoff = 0; + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + if(next_method_read_ptr+4 <= method_list_opl) + { + vbaseoff = *(U32 *)next_method_read_ptr; + } + next_method_read_ptr += 4; + } + + // rjf: emit method + switch(prop) + { + default: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Method; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Static: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticMethod; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Virtual: + case CV_MethodProp_PureVirtual: + case CV_MethodProp_Intro: + case CV_MethodProp_PureIntro: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualMethod; + mem->name = name; + mem->type = method_type; + }break; + } + } + + }break; + + //- rjf: ONEMETHOD + case CV_LeafKind_ONEMETHOD: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafOneMethod *lf = (CV_LeafOneMethod *)field_leaf_first; + CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(lf->attribs); + U8 *vbaseoff_ptr = (U8 *)(lf+1); + U8 *vbaseoff_opl_ptr = vbaseoff_ptr; + U32 vbaseoff = 0; + if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) + { + vbaseoff = *(U32 *)(vbaseoff_ptr); + vbaseoff_opl_ptr += sizeof(U32); + } + U8 *name_ptr = vbaseoff_opl_ptr; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + RDIM_Type *method_type = p2r_type_ptr_from_itype(lf->itype); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit method + switch(prop) + { + default: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Method; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Static: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_StaticMethod; + mem->name = name; + mem->type = method_type; + }break; + case CV_MethodProp_Virtual: + case CV_MethodProp_PureVirtual: + case CV_MethodProp_Intro: + case CV_MethodProp_PureIntro: + { + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualMethod; + mem->name = name; + mem->type = method_type; + }break; + } + }break; + + //- rjf: NESTTYPE + case CV_LeafKind_NESTTYPE: + { + // rjf: unpack leaf + CV_LeafNestType *lf = (CV_LeafNestType *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_NestedType; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: NESTTYPEEX + case CV_LeafKind_NESTTYPEEX: + { + // TODO(rjf): handle attribs + + // rjf: unpack leaf + CV_LeafNestTypeEx *lf = (CV_LeafNestTypeEx *)field_leaf_first; + U8 *name_ptr = (U8 *)(lf+1); + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_NestedType; + mem->name = name; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: BCLASS + case CV_LeafKind_BCLASS: + { + // TODO(rjf): log on bad offset + + // rjf: unpack leaf + CV_LeafBClass *lf = (CV_LeafBClass *)field_leaf_first; + U8 *offset_ptr = (U8 *)(lf+1); + CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); + U64 offset64 = cv_u64_from_numeric(&offset); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = offset_ptr+offset.encoded_size; + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_Base; + mem->type = p2r_type_ptr_from_itype(lf->itype); + mem->off = (U32)offset64; + }break; + + //- rjf: VBCLASS/IVBCLASS + case CV_LeafKind_VBCLASS: + case CV_LeafKind_IVBCLASS: + { + // TODO(rjf): log on bad offsets + // TODO(rjf): handle attribs + // TODO(rjf): offsets? + + // rjf: unpack leaf + CV_LeafVBClass *lf = (CV_LeafVBClass *)field_leaf_first; + U8 *num1_ptr = (U8 *)(lf+1); + CV_NumericParsed num1 = cv_numeric_from_data_range(num1_ptr, field_leaf_opl); + U8 *num2_ptr = num1_ptr + num1.encoded_size; + CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); + + // rjf: bump next read pointer past header + next_read_ptr = (U8 *)(lf+1); + + // rjf: emit member + RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); + mem->kind = RDI_MemberKind_VirtualBase; + mem->type = p2r_type_ptr_from_itype(lf->itype); + }break; + + //- rjf: VFUNCTAB + case CV_LeafKind_VFUNCTAB: + { + CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first; + + // rjf: bump next read pointer past header + next_read_ptr = (U8 *)(lf+1); + + // NOTE(rjf): currently no-op this case + (void)lf; + }break; + } + + // rjf: align-up next field + next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); + } + } + } + + scratch_end(scratch); + }break; + + //////////////////////// + //- rjf: enums -> equip enumerates + // + case CV_LeafKind_ENUM: + { + CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; + if(lf->props & CV_TypeProp_FwdRef) + { + break; + } + U8 *name_ptr = (U8 *)(lf + 1); + udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); + field_itype = lf->field_itype; + }goto equip_enum_vals; + equip_enum_vals:; + { + Temp scratch = scratch_begin(&arena, 1); + + //- rjf: grab UDT info + RDIM_UDT *dst_udt = dst_type->udt; + if(dst_udt == 0) + { + dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); + dst_udt->self_type = dst_type; + } + + //- rjf: gather all fields + typedef struct FieldListTask FieldListTask; + struct FieldListTask + { + FieldListTask *next; + CV_TypeId itype; + }; + FieldListTask start_fl_task = {0, field_itype}; + FieldListTask *fl_todo_stack = &start_fl_task; + FieldListTask *fl_done_stack = 0; + for(;fl_todo_stack != 0;) + { + //- rjf: take & unpack task + FieldListTask *fl_task = fl_todo_stack; + SLLStackPop(fl_todo_stack); + SLLStackPush(fl_done_stack, fl_task); + CV_TypeId field_list_itype = fl_task->itype; + + //- rjf: skip bad itypes + if(field_list_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= field_list_itype) + { + continue; + } + + //- rjf: field list itype -> range + CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-tpi_leaf->itype_first]; + + //- rjf: skip bad headers + if(range->off+range->hdr.size > tpi_leaf->data.size || + range->hdr.size < 2 || + range->hdr.kind != CV_LeafKind_FIELDLIST) + { + continue; + } + + //- rjf: loop over all fields + { + U8 *field_list_first = tpi_leaf->data.str+range->off+2; + U8 *field_list_opl = field_list_first+range->hdr.size-2; + for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; + read_ptr < field_list_opl; + read_ptr = next_read_ptr) + { + // rjf: unpack field + CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; + U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); + U8 *field_leaf_first = read_ptr+2; + U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; + next_read_ptr = field_leaf_opl; + + // rjf: skip out-of-bounds fields + if(field_leaf_first+field_leaf_header_size > field_list_opl) + { + continue; + } + + // rjf: process field + switch(field_kind) + { + //- rjf: unhandled/invalid cases + default: + { + // TODO(rjf): log + }break; + + //- rjf: INDEX + case CV_LeafKind_INDEX: + { + // rjf: unpack leaf + CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; + CV_TypeId new_itype = lf->itype; + + // rjf: determine if index itype is new + B32 is_new = 1; + for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) + { + if(t->itype == new_itype) + { + is_new = 0; + break; + } + } + + // rjf: if new -> push task to follow new itype + if(is_new) + { + FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); + SLLStackPush(fl_todo_stack, new_task); + new_task->itype = new_itype; + } + }break; + + //- rjf: ENUMERATE + case CV_LeafKind_ENUMERATE: + { + // TODO(rjf): attribs + + // rjf: unpack leaf + CV_LeafEnumerate *lf = (CV_LeafEnumerate *)field_leaf_first; + U8 *val_ptr = (U8 *)(lf+1); + CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, field_leaf_opl); + U64 val64 = cv_u64_from_numeric(&val); + U8 *name_ptr = val_ptr + val.encoded_size; + String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); + + // rjf: bump next read pointer past variable length parts + next_read_ptr = name.str+name.size+1; + + // rjf: emit member + RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt); + enum_val->name = name; + enum_val->val = val64; + }break; + } + + // rjf: align-up next field + next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); + } + } + } + + scratch_end(scratch); + }break; + } + + //- rjf: find container, given name's namespaces + if(dst_type != 0 && dst_type->udt != 0 && udt_name.size != 0) + { + // rjf: unpack fully qualified namespace from udt name + U64 container_name_opl = p2r_end_of_cplusplus_container_name(udt_name); + String8 container_name = str8_chop(str8_prefix(udt_name, container_name_opl), 2); + String8 leaf_name = str8_skip(udt_name, container_name_opl); + + // rjf: look up namespace node associated with namespace + CV2R_NamespaceNode *ns_node = 0; + { + U64 hash = u64_hash_from_str8(container_name); + U64 slot_idx = hash%all_namespace_slots_count; + for(CV2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) + { + if(str8_match(n->string, container_name, 0)) + { + ns_node = n; + break; + } + } + } + + // rjf: equip container info to udt, equip partial name to type + if(ns_node != 0) + { + RDIM_UDT *udt = dst_type->udt; + if(ns_node->scope != 0) + { + udt->container_scope = ns_node->scope; + } + else if(ns_node->ns != 0) + { + udt->container_namespace = ns_node->ns; + } + else if(ns_node->type != 0) + { + udt->container_type = ns_node->type; + } + dst_type->name = leaf_name; + } + } + } + } + + //- rjf: collect all lanes + if(lane_idx() == 0) + { + lanes_udts = push_array(scratch.arena, RDIM_UDTChunkList, lane_count()); + } + lane_sync_u64(&lanes_udts, 0); + lanes_udts[lane_idx()] = lane_udts; +#undef p2r_type_ptr_from_itype + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: join all UDTs + // + RDIM_UDTChunkList all_udts = {0}; + ProfScope("join all UDTs") if(lane_idx() == 0) + { + for EachIndex(idx, lane_count()) + { + rdim_udt_chunk_list_concat_in_place(&all_udts, &lanes_udts[idx]); + } + } + lane_sync(); + RDIM_UDTChunkList *all_udts_ptr = &all_udts; + lane_sync_u64(&all_udts_ptr, 0); + all_udts = *all_udts_ptr; + + ////////////////////////////////////////////////////////////// + //- rjf: bundle all outputs + // + RDIM_BakeParams result = {0}; + { + //- rjf: produce top-level-info + RDIM_TopLevelInfo top_level_info = {0}; + { + top_level_info.arch = arch; + top_level_info.exe_name = str8_skip_last_slash(params->exe_name); + top_level_info.exe_hash = exe_hash; + top_level_info.voff_max = params->exe_voff_max; + if(!params->deterministic) + { + MemoryCopy(&top_level_info.guid, ¶ms->guid, Min(sizeof top_level_info.guid, sizeof params->guid)); + top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); + } + } + + //- rjf: build binary sections list + RDIM_BinarySectionList binary_sections = {0}; + if(params->subset_flags & RDIM_SubsetFlag_BinarySections) ProfScope("build binary section list") + { + for EachIndex(idx, sections_count) + { + CV2R_Section *src_sec = §ions[idx]; + RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections); + sec->name = src_sec->name; + sec->flags = src_sec->flags; + sec->voff_first = src_sec->voff; + sec->voff_opl = src_sec->voff+src_sec->vsize; + sec->foff_first = src_sec->foff; + sec->foff_opl = src_sec->foff+src_sec->fsize; + } + } + + //- rjf: fill + result.subset_flags = params->subset_flags; + result.top_level_info = top_level_info; + result.binary_sections = binary_sections; + result.units = all_units; + result.namespaces = all_namespaces; + result.types = all_types; + result.udts = all_udts; + result.src_files = all_src_files; + result.line_tables = all_line_tables; + } + + lane_sync(); + scratch_end(scratch); + return result; +} diff --git a/src/rdi_from_codeview/rdi_from_codeview.h b/src/rdi_from_codeview/rdi_from_codeview.h new file mode 100644 index 00000000..724c4e08 --- /dev/null +++ b/src/rdi_from_codeview/rdi_from_codeview.h @@ -0,0 +1,223 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#ifndef RDI_FROM_CODEVIEW_H +#define RDI_FROM_CODEVIEW_H + +//////////////////////////////// +//~ rjf: Conversion Parameters + +typedef struct CV2R_CompUnit CV2R_CompUnit; +struct CV2R_CompUnit +{ + String8 obj_name; + String8 group_name; + RDIM_Rng1U64ChunkList ranges; +}; + +typedef struct CV2R_Section CV2R_Section; +struct CV2R_Section +{ + String8 name; + RDI_BinarySectionFlags flags; + U64 voff; + U64 vsize; + U64 foff; + U64 fsize; +}; + +typedef struct CV2R_StringTable CV2R_StringTable; +struct CV2R_StringTable +{ + String8 data; + U32 bucket_count; + U32 strblock_min; + U32 strblock_max; + U32 buckets_min; + U32 buckets_max; +}; + +typedef struct CV2R_TPIHashBlock CV2R_TPIHashBlock; +struct CV2R_TPIHashBlock +{ + CV2R_TPIHashBlock *next; + U32 local_count; + CV_TypeId itypes[13]; // 13 = (64 - 12)/4 +}; + +typedef struct CV2R_TPIHash CV2R_TPIHash; +struct CV2R_TPIHash +{ + String8 data; + String8 aux_data; + CV2R_TPIHashBlock **buckets; + U32 bucket_count; + U32 bucket_mask; +}; + +typedef struct CV2R_CompUnitContribution CV2R_CompUnitContribution; +struct CV2R_CompUnitContribution +{ + U32 mod; + U64 voff_first; + U64 voff_opl; +}; + +typedef struct CV2R_ConvertParams CV2R_ConvertParams; +struct CV2R_ConvertParams +{ + // rjf: info extracted from either linker / pdb + String8 exe_name; + String8 exe_data; + Guid guid; + U64 all_syms_count; + CV_SymParsed **all_syms; + CV_C13Parsed **all_c13s; + U64 comp_units_count; + CV2R_CompUnit *comp_units; + U64 comp_unit_contributions_count; + CV2R_CompUnitContribution *comp_unit_contributions; + U64 sections_count; + CV2R_Section *sections; + U64 exe_voff_max; + CV2R_StringTable *strtbl; + CV_LeafParsed *tpi_leaf; + CV_LeafParsed *ipi_leaf; + CV2R_TPIHash *tpi_hash; + CV2R_TPIHash *ipi_hash; + + // rjf: generation params + RDIM_SubsetFlags subset_flags; + B32 deterministic; +}; + +//////////////////////////////// +//~ rjf: Conversion Helper Types + +//- rjf: link name map (voff -> string) + +typedef struct CV2R_LinkNameNode CV2R_LinkNameNode; +struct CV2R_LinkNameNode +{ + CV2R_LinkNameNode *next; + U64 voff; + String8 name; + U64 referencing_symbol_count; +}; + +typedef struct CV2R_LinkNameMap CV2R_LinkNameMap; +struct CV2R_LinkNameMap +{ + CV2R_LinkNameNode **buckets; + U64 buckets_count; + U64 bucket_collision_count; + U64 link_name_count; +}; + +//- rjf: deduplicated namespace map type + +typedef struct CV2R_NamespaceNode CV2R_NamespaceNode; +struct CV2R_NamespaceNode +{ + CV2R_NamespaceNode *next; + String8 string; + B32 corresponds_to_scope; + RDIM_Scope *scope; + RDIM_Type *type; + RDIM_Namespace *ns; +}; + +//- rjf: normalized file path -> source file map + +typedef struct CV2R_SrcFileStub CV2R_SrcFileStub; +struct CV2R_SrcFileStub +{ + String8 file_path; + CV_C13ChecksumKind checksum_kind; + String8 checksum; +}; + +typedef struct CV2R_SrcFileStubArray CV2R_SrcFileStubArray; +struct CV2R_SrcFileStubArray +{ + CV2R_SrcFileStub *v; + U64 count; +}; + +typedef struct CV2R_SrcFileStubNode CV2R_SrcFileStubNode; +struct CV2R_SrcFileStubNode +{ + CV2R_SrcFileStubNode *next; + CV2R_SrcFileStub v; +}; + +typedef struct CV2R_SrcFileNode CV2R_SrcFileNode; +struct CV2R_SrcFileNode +{ + CV2R_SrcFileNode *next; + RDIM_SrcFile *src_file; +}; + +typedef struct CV2R_SrcFileMap CV2R_SrcFileMap; +struct CV2R_SrcFileMap +{ + CV2R_SrcFileNode **slots; + U64 slots_count; +}; + +//- rjf: itype chains + +typedef struct CV2R_TypeIdChain CV2R_TypeIdChain; +struct CV2R_TypeIdChain +{ + CV2R_TypeIdChain *next; + CV_TypeId itype; +}; + +//////////////////////////////// +//~ rjf: Basic Helpers + +internal U64 cv2r_end_of_cplusplus_container_name(String8 str); +internal U64 cv2r_hash_from_voff(U64 voff); +internal int cv2r_namespace_node_is_before(void *raw_a, void *raw_b); +internal U64 cv2r_voff_from_soff(CV2R_Section *sections, U64 sections_count, U64 sec_idx, U64 soff); + +//////////////////////////////// +//~ rjf: String Table Functions + +internal String8 cv2r_string_from_off(CV2R_StringTable *strtbl, U64 off); + +//////////////////////////////// +//~ rjf: Compilation Unit Contribution Functions + +internal CV2R_CompUnitContribution *cv2r_comp_unit_contribution_from_voff__binary_search(CV2R_CompUnitContribution *contributions, U64 contributions_count, U64 voff); + +//////////////////////////////// +//~ rjf: TPI Hash Table Functions + +internal U32 cv2r_tpi_hash_from_data(String8 string); +internal CV_TypeIdArray cv2r_itypes_from_name(Arena *arena, CV2R_TPIHash *tpi_hash, CV_LeafParsed *leaf, String8 name, B32 compare_unique_name, U32 output_cap); +internal CV_TypeId cv2r_first_itype_from_name(CV2R_TPIHash *tpi_hash, CV_LeafParsed *tpi_leaf, String8 name, B32 compare_unique_name); + +//////////////////////////////// +//~ rjf: CodeView => RDI Canonical Conversions + +internal RDI_Arch cv2r_rdi_arch_from_cv_arch(CV_Arch arch); +internal RDI_RegCode cv2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code); +internal RDI_Language cv2r_rdi_language_from_cv_language(CV_Language language); +internal RDI_TypeKind cv2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); +internal RDI_ChecksumKind cv2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k); + +//////////////////////////////// +//~ rjf: Location Info Building Helpers + +internal RDI_RegCode cv2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); +internal RDIM_Location cv2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); +internal void cv2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, Rng1U64 voff_range, CV_LvarAddrGap *gaps, U64 gap_count); + +//////////////////////////////// +//~ rjf: Top-Level Conversion Entry Point + +internal RDIM_BakeParams cv2r_convert(Arena *arena, CV2R_ConvertParams *params); + +#endif // RDI_FROM_CODEVIEW_H From d56cd83cacfdb81c7abc763f8e0b01187fab9241 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 18 Jun 2026 08:24:02 -0700 Subject: [PATCH 810/850] sketch out revised pdb conversion path which just uses the codeview conversion pass --- src/rdi_from_codeview/rdi_from_codeview.c | 40 ++- src/rdi_from_codeview/rdi_from_codeview.h | 1 - src/rdi_from_pdb/rdi_from_pdb.c | 372 ++++++++++++++++++++++ src/rdi_from_pdb/rdi_from_pdb.h | 5 + 4 files changed, 416 insertions(+), 2 deletions(-) diff --git a/src/rdi_from_codeview/rdi_from_codeview.c b/src/rdi_from_codeview/rdi_from_codeview.c index 73641b60..bc460ee5 100644 --- a/src/rdi_from_codeview/rdi_from_codeview.c +++ b/src/rdi_from_codeview/rdi_from_codeview.c @@ -671,6 +671,44 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) } lane_sync_u64(&exe_hash, 0); + ////////////////////////////////////////////////////////////// + //- rjf: calculate EXE's max voff + // + U64 exe_voff_max = 0; + { + Temp scratch2 = scratch_begin(&scratch.arena, 1); + + // rjf: set up + U64 *lane_voff_maxes = 0; + if(lane_idx() == 0) + { + lane_voff_maxes = push_array(scratch2.arena, U64, lane_count()); + } + lane_sync_u64(&lane_voff_maxes, 0); + + // rjf: compute each lane's max + { + U64 lane_voff_max = 0; + Rng1U64 range = lane_range(sections_count); + for EachInRange(idx, range) + { + lane_voff_max = Max(lane_voff_max, sections[idx].voff + sections[idx].vsize); + } + lane_voff_maxes[lane_idx()] = lane_voff_max; + } + lane_sync(); + + // rjf: find max from all lanes + U64 exe_voff_max = 0; + for EachIndex(l_idx, lane_count()) + { + exe_voff_max = Max(exe_voff_max, lane_voff_maxes[l_idx]); + } + lane_sync(); + + scratch_end(scratch2); + } + ////////////////////////////////////////////////////////////// //- rjf: determine architecture // @@ -5032,7 +5070,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) top_level_info.arch = arch; top_level_info.exe_name = str8_skip_last_slash(params->exe_name); top_level_info.exe_hash = exe_hash; - top_level_info.voff_max = params->exe_voff_max; + top_level_info.voff_max = exe_voff_max; if(!params->deterministic) { MemoryCopy(&top_level_info.guid, ¶ms->guid, Min(sizeof top_level_info.guid, sizeof params->guid)); diff --git a/src/rdi_from_codeview/rdi_from_codeview.h b/src/rdi_from_codeview/rdi_from_codeview.h index 724c4e08..77ad61e9 100644 --- a/src/rdi_from_codeview/rdi_from_codeview.h +++ b/src/rdi_from_codeview/rdi_from_codeview.h @@ -79,7 +79,6 @@ struct CV2R_ConvertParams CV2R_CompUnitContribution *comp_unit_contributions; U64 sections_count; CV2R_Section *sections; - U64 exe_voff_max; CV2R_StringTable *strtbl; CV_LeafParsed *tpi_leaf; CV_LeafParsed *ipi_leaf; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 2f23d19e..dae27006 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -5136,3 +5136,375 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) scratch_end(scratch); return result; } + +//////////////////////////////// +//~ rjf: Top-Level Conversion Entry Point (Revised) + +internal RDIM_BakeParams +p2r_convert2(Arena *arena, P2R_ConvertParams *params) +{ + Temp scratch = scratch_begin(&arena, 1); + + ////////////////////////////////////////////////////////////// + //- rjf: do base MSF parse + // + MSF_Parsed *msf = 0; + ProfScope("do base MSF parse") + { + // rjf: setup output buckets + MSF_RawStreamTable *msf_raw_stream_table = 0; + U64 *msf_stream_take_counter = 0; + if(lane_idx() == 0) + { + msf_raw_stream_table = msf_raw_stream_table_from_data(scratch.arena, params->input_pdb_data); + msf = push_array(scratch.arena, MSF_Parsed, 1); + msf->page_size = msf_raw_stream_table->page_size; + msf->page_count = msf_raw_stream_table->total_page_count; + msf->stream_count = msf_raw_stream_table->stream_count; + msf->streams = push_array(scratch.arena, String8, msf->stream_count); + msf_stream_take_counter = push_array(scratch.arena, U64, 1); + } + lane_sync_u64(&msf, 0); + lane_sync_u64(&msf_raw_stream_table, 0); + + // rjf: do wide fill + { + lane_sync_u64(&msf_stream_take_counter, 0); + for(;;) + { + U64 stream_idx = ins_atomic_u64_inc_eval(msf_stream_take_counter) - 1; + if(stream_idx >= msf->stream_count) + { + break; + } + msf->streams[stream_idx] = msf_data_from_stream_number(arena, params->input_pdb_data, msf_raw_stream_table, stream_idx); + } + } + lane_sync(); + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: do top-level MSF/PDB extraction + // + PDB_Info *pdb_info = 0; + PDB_NamedStreamTable *named_streams = 0; + ProfScope("do top-level MSF/PDB extraction") if(lane_idx() == 0) + { + ProfScope("parse PDB info") + { + String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_Info); + pdb_info = pdb_info_from_data(scratch.arena, info_data); + if(pdb_info->features & PDB_FeatureFlag_MINIMAL_DBG_INFO) + { + log_user_error(str8_lit("PDB was linked with /DEBUG:FASTLINK; partial debug info is not supported. Please relink using /DEBUG:FULL.")); + } + } + ProfScope("parse named streams table") + { + named_streams = pdb_named_stream_table_from_info(scratch.arena, pdb_info); + } + } + lane_sync_u64(&pdb_info, 0); + lane_sync_u64(&named_streams, 0); + + ////////////////////////////////////////////////////////////// + //- rjf: parse PDB strtbl & top-level streams + // + PDB_Strtbl *strtbl = 0; + String8 raw_strtbl = {0}; + PDB_DbiParsed *dbi = 0; + PDB_TpiParsed *tpi = 0; + PDB_TpiParsed *ipi = 0; + ProfScope("parse PDB strtbl & top-level streams") + { + if(lane_idx() == lane_from_task_idx(0)) ProfScope("parse PDB strtbl") + { + MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_StringTable]; + String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); + strtbl = pdb_strtbl_from_data(scratch.arena, strtbl_data); + raw_strtbl = str8_substr(strtbl_data, rng_1u64(strtbl->strblock_min, strtbl->strblock_max)); + } + if(lane_idx() == lane_from_task_idx(1)) ProfScope("parse DBI") + { + String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); + dbi = pdb_dbi_from_data(scratch.arena, dbi_data); + } + if(lane_idx() == lane_from_task_idx(2)) ProfScope("parse TPI") + { + String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi); + tpi = pdb_tpi_from_data(scratch.arena, tpi_data); + } + if(lane_idx() == lane_from_task_idx(3)) ProfScope("parse IPI") + { + String8 ipi_data = msf_data_from_stream(msf, PDB_FixedStream_Ipi); + ipi = pdb_tpi_from_data(scratch.arena, ipi_data); + } + } + lane_sync_u64(&strtbl, lane_from_task_idx(0)); + lane_sync_u64(&raw_strtbl.size, lane_from_task_idx(0)); + lane_sync_u64(&raw_strtbl.str, lane_from_task_idx(0)); + lane_sync_u64(&dbi, lane_from_task_idx(1)); + lane_sync_u64(&tpi, lane_from_task_idx(2)); + lane_sync_u64(&ipi, lane_from_task_idx(3)); + + ////////////////////////////////////////////////////////////// + //- rjf: unpack DBI + // + COFF_SectionHeaderArray coff_sections = {0}; + PDB_GsiParsed *gsi = 0; + PDB_GsiParsed *psi_gsi_part = 0; + ProfScope("unpack DBI") + { + if(lane_idx() == lane_from_task_idx(0)) ProfScope("parse COFF sections") + { + MSF_StreamNumber section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]; + String8 section_data = msf_data_from_stream(msf, section_stream); + coff_sections = pdb_coff_section_array_from_data(scratch.arena, section_data); + } + if(lane_idx() == lane_from_task_idx(1)) ProfScope("parse GSI") + { + String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn); + gsi = pdb_gsi_from_data(scratch.arena, gsi_data); + } + if(lane_idx() == lane_from_task_idx(2)) ProfScope("parse GSI part of PSI") + { + String8 psi_data = msf_data_from_stream(msf, dbi->psi_sn); + String8 psi_data_gsi_part = str8_range(psi_data.str + sizeof(PDB_PsiHeader), psi_data.str + psi_data.size); + psi_gsi_part = pdb_gsi_from_data(scratch.arena, psi_data_gsi_part); + } + } + lane_sync_u64(&coff_sections.v, lane_from_task_idx(0)); + lane_sync_u64(&coff_sections.count, lane_from_task_idx(0)); + lane_sync_u64(&gsi, lane_from_task_idx(1)); + lane_sync_u64(&psi_gsi_part, lane_from_task_idx(2)); + + ////////////////////////////////////////////////////////////// + //- rjf: hash EXE, parse TPI/IPI hash/leaf & global symbol stream & comp units + // + PDB_TpiHashParsed *tpi_hash = 0; + CV_LeafParsed *tpi_leaf = 0; + PDB_TpiHashParsed *ipi_hash = 0; + CV_LeafParsed *ipi_leaf = 0; + PDB_CompUnitArray *comp_units = 0; + PDB_CompUnitContributionArray *comp_unit_contributions = 0; + ProfScope("hash EXE, parse TPI/IPI hash/leaf & global symbol stream & comp units") + { + if(lane_idx() == lane_from_task_idx(0)) ProfScope("parse TPI hash") + { + String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn); + String8 aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); + if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs))) + { + hash_data = aux_data = str8_zero(); + } + tpi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, tpi, hash_data, aux_data); + } + if(lane_idx() == lane_from_task_idx(1)) ProfScope("parse TPI leaf") + { + String8 leaf_data = pdb_leaf_data_from_tpi(tpi); + tpi_leaf = cv_leaf_from_data(scratch.arena, leaf_data, tpi->itype_first); + } + if(lane_idx() == lane_from_task_idx(2)) ProfScope("parse IPI hash") + { + String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn); + String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); + if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs))) + { + hash_data = aux_data = str8_zero(); + } + ipi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, ipi, hash_data, aux_data); + } + if(lane_idx() == lane_from_task_idx(3)) ProfScope("parse IPI leaf") + { + String8 leaf_data = pdb_leaf_data_from_tpi(ipi); + ipi_leaf = cv_leaf_from_data(scratch.arena, leaf_data, ipi->itype_first); + } + if(lane_idx() == lane_from_task_idx(4)) ProfScope("parse compilation units") + { + String8 comp_units_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); + comp_units = pdb_comp_unit_array_from_data(scratch.arena, comp_units_data); + } + if(lane_idx() == lane_from_task_idx(5)) ProfScope("parse compilation unit contributions") + { + String8 contribs_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon); + comp_unit_contributions = push_array(scratch.arena, PDB_CompUnitContributionArray, 1); + comp_unit_contributions[0] = pdb_comp_unit_contribution_array_from_data(scratch.arena, contribs_data, coff_sections); + } + } + lane_sync_u64(&tpi_hash, lane_from_task_idx(0)); + lane_sync_u64(&tpi_leaf, lane_from_task_idx(1)); + lane_sync_u64(&ipi_hash, lane_from_task_idx(2)); + lane_sync_u64(&ipi_leaf, lane_from_task_idx(3)); + lane_sync_u64(&comp_units, lane_from_task_idx(4)); + lane_sync_u64(&comp_unit_contributions, lane_from_task_idx(5)); + + ////////////////////////////////////////////////////////////// + //- rjf: bucket compilation unit contributions + // + RDIM_Rng1U64ChunkList *unit_ranges = 0; + ProfScope("bucket compilation unit contributions") if(lane_idx() == 0) + { + unit_ranges = push_array(scratch.arena, RDIM_Rng1U64ChunkList, comp_units->count + 1); + for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_contributions->count; comp_unit_idx += 1) + { + PDB_CompUnitContribution *contribution = &comp_unit_contributions->contributions[comp_unit_idx]; + if(contribution->mod < comp_units->count) + { + RDIM_Rng1U64 r = {contribution->voff_first, contribution->voff_opl}; + rdim_rng1u64_chunk_list_push(arena, &unit_ranges[contribution->mod + 1], 256, r); + } + } + } + lane_sync_u64(&unit_ranges, 0); + + ////////////////////////////////////////////////////////////// + //- rjf: parse all syms & c13 line info streams + // + U64 all_syms_count = 0; + CV_SymParsed **all_syms = 0; + CV_C13Parsed **all_c13s = 0; + ProfScope("parse all syms & c13 line info streams") + { + //- rjf: setup outputs + U64 *task_counter = 0; + if(lane_idx() == 0) + { + all_syms_count = comp_units->count+1; // +1 for global symbol stream from DBI + all_syms = push_array(scratch.arena, CV_SymParsed *, all_syms_count); + all_c13s = push_array(scratch.arena, CV_C13Parsed *, all_syms_count); + task_counter = push_array(scratch.arena, U64, 1); + } + lane_sync_u64(&all_syms_count, 0); + lane_sync_u64(&all_syms, 0); + lane_sync_u64(&all_c13s, 0); + + //- rjf: wide fill + { + lane_sync_u64(&task_counter, 0); + U64 task_count = all_syms_count; + for(;;) + { + U64 task_idx = ins_atomic_u64_inc_eval(task_counter) - 1; + if(task_idx >= task_count) + { + break; + } + if(task_idx > 0) + { + PDB_CompUnit *unit = comp_units->units[task_idx-1]; + String8 unit_sym_data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); + String8 unit_c13_data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13); + all_syms[task_idx] = cv_sym_from_data(arena, unit_sym_data, 4); + all_c13s[task_idx] = cv_c13_parsed_from_data(arena, unit_c13_data, raw_strtbl, coff_sections); + } + else + { + String8 global_sym_data = msf_data_from_stream(msf, dbi->sym_sn); + all_syms[task_idx] = cv_sym_from_data(arena, global_sym_data, 4); + } + } + } + } + lane_sync(); + + ////////////////////////////////////////////////////////////// + //- rjf: produce cv2r units from pdb's units + // + U64 cv2r_comp_units_count = comp_units->count; + CV2R_CompUnit *cv2r_comp_units = 0; + { + if(lane_idx() == 0) + { + cv2r_comp_units = push_array(scratch.arena, CV2R_CompUnit, cv2r_comp_units_count); + } + lane_sync_u64(&cv2r_comp_units, 0); + Rng1U64 range = lane_range(cv2r_comp_units_count); + for EachInRange(idx, range) + { + cv2r_comp_units[idx].obj_name = comp_units->units[idx]->obj_name; + cv2r_comp_units[idx].group_name = comp_units->units[idx]->group_name; + cv2r_comp_units[idx].ranges = unit_ranges[idx-1]; + } + lane_sync(); + } + + ////////////////////////////////////////////////////////////// + //- rjf: produce cv2r comp unit contributions + // + U64 cv2r_comp_unit_contributions_count = comp_unit_contributions->count; + CV2R_CompUnitContribution *cv2r_comp_unit_contributions = 0; + { + if(lane_idx() == 0) + { + cv2r_comp_unit_contributions = push_array(scratch.arena, CV2R_CompUnitContribution, cv2r_comp_unit_contributions_count); + } + lane_sync_u64(&cv2r_comp_unit_contributions, 0); + Rng1U64 range = lane_range(cv2r_comp_unit_contributions_count); + for EachInRange(idx, range) + { + cv2r_comp_unit_contributions[idx].mod = comp_unit_contributions->contributions[idx].mod; + cv2r_comp_unit_contributions[idx].voff_first = comp_unit_contributions->contributions[idx].voff_first; + cv2r_comp_unit_contributions[idx].voff_opl = comp_unit_contributions->contributions[idx].voff_opl; + } + lane_sync(); + } + + ////////////////////////////////////////////////////////////// + //- rjf: produce cv2r sections from coff + // + U64 cv2r_sections_count = coff_sections.count; + CV2R_Section *cv2r_sections = 0; + { + if(lane_idx() == 0) + { + cv2r_sections = push_array(scratch.arena, CV2R_Section, cv2r_sections_count); + } + lane_sync_u64(&cv2r_sections, 0); + Rng1U64 range = lane_range(cv2r_sections_count); + for EachInRange(idx, range) + { + COFF_SectionHeader *src = &coff_sections.v[idx]; + CV2R_Section *dst = &cv2r_sections[idx]; + char *name_first = (char *)src->name; + char *name_opl = name_first + sizeof(src->name); + dst->name = str8_cstring_capped(name_first, name_opl); + dst->flags = p2r_rdi_binary_section_flags_from_coff_section_flags(src->flags); + dst->voff = src->voff; + dst->vsize = src->vsize; + dst->foff = src->foff; + dst->fsize = src->fsize; + } + lane_sync(); + } + + ////////////////////////////////////////////////////////////// + //- rjf: bundle codeview conversion parameters + // + CV2R_ConvertParams cv2r_params = {0}; + { + cv2r_params.exe_name = params->input_exe_name; + cv2r_params.exe_data = params->input_exe_data; + cv2r_params.guid = pdb_info->auth_guid; + cv2r_params.all_syms_count = all_syms_count; + cv2r_params.all_syms = all_syms; + cv2r_params.all_c13s = all_c13s; + cv2r_params.comp_units_count = cv2r_comp_units_count; + cv2r_params.comp_units = cv2r_comp_units; + cv2r_params.comp_unit_contributions_count = cv2r_comp_unit_contributions_count; + cv2r_params.comp_unit_contributions = cv2r_comp_unit_contributions; + cv2r_params.sections_count = cv2r_sections_count; + cv2r_params.sections = cv2r_sections; + cv2r_params.tpi_leaf = tpi_leaf; + cv2r_params.ipi_leaf = ipi_leaf; + } + + ////////////////////////////////////////////////////////////// + //- rjf: convert from top-level & all parsed codeview datas + // + RDIM_BakeParams result = cv2r_convert(arena, &cv2r_params); + + lane_sync(); + scratch_end(scratch); + return result; +} diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index 3b2236cb..8406e218 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -134,4 +134,9 @@ internal void p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDI internal RDIM_BakeParams p2r_convert(Arena *arena, P2R_ConvertParams *params); +//////////////////////////////// +//~ rjf: Top-Level Conversion Entry Point (Revised) + +internal RDIM_BakeParams p2r_convert2(Arena *arena, P2R_ConvertParams *params); + #endif // RDI_FROM_PDB_H From a441a5eef3ad13c499ed50d687840674a63fc690 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 18 Jun 2026 08:54:41 -0700 Subject: [PATCH 811/850] plug in codeview-conversion-backed pdb converison --- src/pdb/pdb_parse.c | 3 +- src/pdb/pdb_parse.h | 8 +- src/radbin/radbin.c | 9 +- src/raddbg/raddbg_main.c | 2 + src/rdi_from_codeview/rdi_from_codeview.c | 10 +- src/rdi_from_codeview/rdi_from_codeview.h | 1 - src/rdi_from_pdb/rdi_from_pdb.c | 174 ++++++++++++++++++++-- src/rdi_from_pdb/rdi_from_pdb.h | 5 + src/torture/torture_main.c | 2 + 9 files changed, 187 insertions(+), 27 deletions(-) diff --git a/src/pdb/pdb_parse.c b/src/pdb/pdb_parse.c index f42f3d16..ac7ca4a9 100644 --- a/src/pdb/pdb_parse.c +++ b/src/pdb/pdb_parse.c @@ -324,7 +324,7 @@ pdb_tpi_from_data(Arena *arena, String8 data) } internal PDB_TpiHashParsed* -pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data, String8 aux_data) +pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data) { ProfBeginFunction(); PDB_TpiHashParsed *result = push_array(arena, PDB_TpiHashParsed, 1); @@ -442,7 +442,6 @@ pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, Str // fill result result->data = data; - result->aux_data = aux_data; result->buckets = buckets; result->bucket_count = bucket_count; result->bucket_mask = bucket_mask; diff --git a/src/pdb/pdb_parse.h b/src/pdb/pdb_parse.h index 0170b692..d33e0e9a 100644 --- a/src/pdb/pdb_parse.h +++ b/src/pdb/pdb_parse.h @@ -163,8 +163,6 @@ typedef struct PDB_TpiHashBlock typedef struct PDB_TpiHashParsed { String8 data; - String8 aux_data; - PDB_TpiHashBlock **buckets; U32 bucket_count; U32 bucket_mask; @@ -198,11 +196,7 @@ internal PDB_Strtbl* pdb_strtbl_from_data(Arena *arena, String8 strtbl_ internal PDB_DbiParsed* pdb_dbi_from_data(Arena *arena, String8 dbi_data); internal PDB_TpiParsed* pdb_tpi_from_data(Arena *arena, String8 tpi_data); -internal PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena, - PDB_Strtbl *strtbl, - PDB_TpiParsed *tpi, - String8 tpi_hash_data, - String8 tpi_hash_aux_data); +internal PDB_TpiHashParsed* pdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 tpi_hash_data); internal PDB_GsiParsed* pdb_gsi_from_data(Arena *arena, String8 gsi_data); internal U64 pdb_gsi_symbol_from_string(PDB_GsiParsed *gsi, String8 symbol_data, String8 string); diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 58ce02ae..94c6aec0 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -874,7 +874,14 @@ rb_thread_entry_point(void *p) convert_params.subset_flags = subset_flags; convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } - ProfScope("convert") pdb_bake_params = p2r_convert(arena, &convert_params); + if(cmd_line_has_flag(cmdline, s("a"))) + { + ProfScope("convert") pdb_bake_params = p2r_convert(arena, &convert_params); + } + else + { + ProfScope("convert") pdb_bake_params = p2r_convert2(arena, &convert_params); + } } //- rjf: RDI inputs => RDI joining diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index a854ef14..04eab70e 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -406,6 +406,7 @@ #include "unwind/unwind_inc.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" +#include "rdi_from_codeview/rdi_from_codeview.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "rdi_from_dwarf/rdi_from_dwarf.h" #include "radbin/radbin.h" @@ -466,6 +467,7 @@ #include "unwind/unwind_inc.c" #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" +#include "rdi_from_codeview/rdi_from_codeview.c" #include "rdi_from_pdb/rdi_from_pdb.c" #include "rdi_from_dwarf/rdi_from_dwarf.c" #include "radbin/radbin.c" diff --git a/src/rdi_from_codeview/rdi_from_codeview.c b/src/rdi_from_codeview/rdi_from_codeview.c index bc460ee5..a05a8805 100644 --- a/src/rdi_from_codeview/rdi_from_codeview.c +++ b/src/rdi_from_codeview/rdi_from_codeview.c @@ -331,7 +331,15 @@ cv2r_itypes_from_name(Arena *arena, CV2R_TPIHash *tpi_hash, CV_LeafParsed *leaf, internal CV_TypeId cv2r_first_itype_from_name(CV2R_TPIHash *tpi_hash, CV_LeafParsed *tpi_leaf, String8 name, B32 compare_unique_name) { - + Temp scratch = scratch_begin(0, 0); + CV_TypeIdArray array = cv2r_itypes_from_name(scratch.arena, tpi_hash, tpi_leaf, name, compare_unique_name, 1); + CV_TypeId result = 0; + if(array.count > 0) + { + result = array.itypes[0]; + } + scratch_end(scratch); + return result; } //////////////////////////////// diff --git a/src/rdi_from_codeview/rdi_from_codeview.h b/src/rdi_from_codeview/rdi_from_codeview.h index 77ad61e9..71d47fe4 100644 --- a/src/rdi_from_codeview/rdi_from_codeview.h +++ b/src/rdi_from_codeview/rdi_from_codeview.h @@ -49,7 +49,6 @@ typedef struct CV2R_TPIHash CV2R_TPIHash; struct CV2R_TPIHash { String8 data; - String8 aux_data; CV2R_TPIHashBlock **buckets; U32 bucket_count; U32 bucket_mask; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index dae27006..59b37521 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -550,12 +550,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(lane_idx() == lane_from_task_idx(1)) ProfScope("parse TPI hash") { String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn); - String8 aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs))) { - hash_data = aux_data = str8_zero(); + hash_data = str8_zero(); } - tpi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, tpi, hash_data, aux_data); + tpi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, tpi, hash_data); } if(lane_idx() == lane_from_task_idx(2)) ProfScope("parse TPI leaf") { @@ -565,12 +564,11 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) if(lane_idx() == lane_from_task_idx(3)) ProfScope("parse IPI hash") { String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn); - String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs))) { - hash_data = aux_data = str8_zero(); + hash_data = str8_zero(); } - ipi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, ipi, hash_data, aux_data); + ipi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, ipi, hash_data); } if(lane_idx() == lane_from_task_idx(4)) ProfScope("parse IPI leaf") { @@ -5137,6 +5135,136 @@ p2r_convert(Arena *arena, P2R_ConvertParams *params) return result; } +//////////////////////////////// +//~ rjf: PDB -> (Codeview -> RDI) TPI Hash Table Building + +internal CV2R_TPIHash * +p2r_cv2r_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data) +{ + CV2R_TPIHash *result = push_array(arena, CV2R_TPIHash, 1); + U32 stride = tpi->hash_key_size; + U32 bucket_count = tpi->hash_bucket_count; + if(1 <= stride && stride <= 8 && bucket_count > 0 && data.size != 0) + { + // allocate buckets + CV2R_TPIHashBlock **buckets = push_array(arena, CV2R_TPIHashBlock*, bucket_count); + + // extract "hash" array + U8 *hashes = data.str + tpi->hash_vals_off; + U8 *hash_opl = hashes + tpi->hash_vals_size; + + // for each index in the array... + CV_TypeId itype = tpi->itype_first; + U8 *hash_cursor = hashes; + for(;hash_cursor + stride <= hash_opl;) + { + // read index + U64 bucket_idx = 0; + MemoryCopy(&bucket_idx, hash_cursor, stride); + + // save to map + if(bucket_idx < bucket_count) + { + CV2R_TPIHashBlock *block = buckets[bucket_idx]; + if(block == 0 || block->local_count == ArrayCount(block->itypes)) + { + block = push_array(arena, CV2R_TPIHashBlock, 1); + SLLStackPush(buckets[bucket_idx], block); + } + if(block->local_count != 0) + { + MemoryCopy(block->itypes+1, block->itypes, sizeof(CV_TypeId)*block->local_count); + } + block->itypes[0] = itype; + block->local_count += 1; + } + + // advance cursor + hash_cursor += stride; + itype += 1; + } + + //- rjf: compute bucket mask + U32 bucket_mask = 0; + if(IsPow2OrZero(bucket_count)) + { + bucket_mask = bucket_count-1; + } + + //- rjf: apply hash adjustments, to pull correct type IDs to the front of + // the chains + if(tpi->hash_adj_size != 0) + { + // NOTE(rjf): this table is laid out in the following format: + // + // pair_count: U32 -> # of name_index/type_index pairs + // slot_count: U32 -> # of slots in this hash table + // present_bit_array_count: U32 -> count for next array + // present_bit_array: U32[present_bit_array_count] -> 1 bit per slot, "is present" + // deleted_bit_array_count: U32 -> count for next array + // deleted_bit_array: U32[deleted_bit_array_count] -> 1 bit per slot, "is deleted" + // (U32, U32)[pair_count] -> array of name_index/type_index pairs + // + U8 *adjs = data.str + tpi->hash_adj_off; + U8 *adjs_opl = adjs + tpi->hash_adj_size; + U8 *adjs_cursor = adjs; + U32 pair_count = *(U32 *)adjs_cursor; + adjs_cursor += sizeof(U32); + U32 slot_count = *(U32 *)adjs_cursor; + adjs_cursor += sizeof(U32); + U32 present_bit_array_count = *(U32 *)adjs_cursor; // skip present_bit_array + adjs_cursor += sizeof(U32); + adjs_cursor += present_bit_array_count*sizeof(U32); + U32 deleted_bit_array_count = *(U32 *)adjs_cursor; // skip deleted_bit_array + adjs_cursor += sizeof(U32); + adjs_cursor += deleted_bit_array_count*sizeof(U32); + U32 adjs_stride = sizeof(U32)*2; + U32 pair_idx = 0; + for(;adjs_cursor < adjs_opl && pair_idx < pair_count; + adjs_cursor += adjs_stride, pair_idx += 1) + { + U32 name_off = ((U32 *)adjs_cursor)[0]; + CV_TypeId type_id = ((CV_TypeId *)adjs_cursor)[1]; + String8 string = pdb_strtbl_string_from_off(strtbl, name_off); + U32 hash = pdb_hash_v1(string); + U32 bucket_idx = ((bucket_mask != 0) ? hash&bucket_mask : hash%bucket_count); + CV2R_TPIHashBlock *prev_block = 0; + for(CV2R_TPIHashBlock *block = buckets[bucket_idx]; + block != 0; + prev_block = block, block = block->next) + { + for(U32 local_idx = 0; + local_idx < block->local_count && local_idx < ArrayCount(block->itypes); + local_idx += 1) + { + if(block->itypes[local_idx] == type_id) + { + if(prev_block != 0) + { + prev_block->next = block->next; + block->next = buckets[bucket_idx]; + buckets[bucket_idx] = block; + } + if(local_idx != 0) + { + Swap(CV_TypeId, block->itypes[0], block->itypes[local_idx]); + } + break; + } + } + } + } + } + + // fill result + result->data = data; + result->buckets = buckets; + result->bucket_count = bucket_count; + result->bucket_mask = bucket_mask; + } + return result; +} + //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point (Revised) @@ -5282,9 +5410,9 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) ////////////////////////////////////////////////////////////// //- rjf: hash EXE, parse TPI/IPI hash/leaf & global symbol stream & comp units // - PDB_TpiHashParsed *tpi_hash = 0; + CV2R_TPIHash *tpi_hash = 0; CV_LeafParsed *tpi_leaf = 0; - PDB_TpiHashParsed *ipi_hash = 0; + CV2R_TPIHash *ipi_hash = 0; CV_LeafParsed *ipi_leaf = 0; PDB_CompUnitArray *comp_units = 0; PDB_CompUnitContributionArray *comp_unit_contributions = 0; @@ -5293,12 +5421,11 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) if(lane_idx() == lane_from_task_idx(0)) ProfScope("parse TPI hash") { String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn); - String8 aux_data = msf_data_from_stream(msf, tpi->hash_sn_aux); if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs))) { - hash_data = aux_data = str8_zero(); + hash_data = str8_zero(); } - tpi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, tpi, hash_data, aux_data); + tpi_hash = p2r_cv2r_tpi_hash_from_data(scratch.arena, strtbl, tpi, hash_data); } if(lane_idx() == lane_from_task_idx(1)) ProfScope("parse TPI leaf") { @@ -5308,12 +5435,11 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) if(lane_idx() == lane_from_task_idx(2)) ProfScope("parse IPI hash") { String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn); - String8 aux_data = msf_data_from_stream(msf, ipi->hash_sn_aux); if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs))) { - hash_data = aux_data = str8_zero(); + hash_data = str8_zero(); } - ipi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, ipi, hash_data, aux_data); + ipi_hash = p2r_cv2r_tpi_hash_from_data(scratch.arena, strtbl, ipi, hash_data); } if(lane_idx() == lane_from_task_idx(3)) ProfScope("parse IPI leaf") { @@ -5424,7 +5550,7 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) { cv2r_comp_units[idx].obj_name = comp_units->units[idx]->obj_name; cv2r_comp_units[idx].group_name = comp_units->units[idx]->group_name; - cv2r_comp_units[idx].ranges = unit_ranges[idx-1]; + cv2r_comp_units[idx].ranges = unit_ranges[idx+1]; } lane_sync(); } @@ -5478,6 +5604,19 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) lane_sync(); } + ////////////////////////////////////////////////////////////// + //- rjf: produce cv2r string table + // + CV2R_StringTable cv2r_strtbl = {0}; + { + cv2r_strtbl.data = strtbl->data; + cv2r_strtbl.bucket_count = strtbl->bucket_count; + cv2r_strtbl.strblock_min = strtbl->strblock_min; + cv2r_strtbl.strblock_max = strtbl->strblock_max; + cv2r_strtbl.buckets_min = strtbl->buckets_min; + cv2r_strtbl.buckets_max = strtbl->buckets_max; + } + ////////////////////////////////////////////////////////////// //- rjf: bundle codeview conversion parameters // @@ -5495,8 +5634,13 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) cv2r_params.comp_unit_contributions = cv2r_comp_unit_contributions; cv2r_params.sections_count = cv2r_sections_count; cv2r_params.sections = cv2r_sections; + cv2r_params.strtbl = &cv2r_strtbl; cv2r_params.tpi_leaf = tpi_leaf; cv2r_params.ipi_leaf = ipi_leaf; + cv2r_params.tpi_hash = tpi_hash; + cv2r_params.ipi_hash = ipi_hash; + cv2r_params.subset_flags = params->subset_flags; + cv2r_params.deterministic = params->deterministic; } ////////////////////////////////////////////////////////////// diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index 8406e218..a4dfc87a 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -134,6 +134,11 @@ internal void p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDI internal RDIM_BakeParams p2r_convert(Arena *arena, P2R_ConvertParams *params); +//////////////////////////////// +//~ rjf: PDB -> (Codeview -> RDI) TPI Hash Table Building + +internal CV2R_TPIHash *p2r_cv2r_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data); + //////////////////////////////// //~ rjf: Top-Level Conversion Entry Point (Revised) diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index bb4fa18d..75cae873 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -66,6 +66,7 @@ #include "llvm/llvm.h" #include "rdi_from_coff/rdi_from_coff.h" #include "rdi_from_elf/rdi_from_elf.h" +#include "rdi_from_codeview/rdi_from_codeview.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "rdi_from_dwarf/rdi_from_dwarf.h" #include "obj/obj.h" @@ -145,6 +146,7 @@ #include "llvm/llvm.c" #include "rdi_from_coff/rdi_from_coff.c" #include "rdi_from_elf/rdi_from_elf.c" +#include "rdi_from_codeview/rdi_from_codeview.c" #include "rdi_from_pdb/rdi_from_pdb.c" #include "rdi_from_dwarf/rdi_from_dwarf.c" #include "obj/obj.c" From 66bca76eddcd40e3ebf9377c9d65f92ec689d620 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 18 Jun 2026 08:59:51 -0700 Subject: [PATCH 812/850] delete non-codeview-backed pdb conversion path, switch over to codeview conversion totally --- src/radbin/radbin.c | 9 +- src/rdi_from_codeview/rdi_from_codeview.c | 41 +- src/rdi_from_pdb/rdi_from_pdb.c | 5136 +-------------------- src/rdi_from_pdb/rdi_from_pdb.h | 33 - 4 files changed, 25 insertions(+), 5194 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 94c6aec0..24d21823 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -874,14 +874,7 @@ rb_thread_entry_point(void *p) convert_params.subset_flags = subset_flags; convert_params.deterministic = cmd_line_has_flag(cmdline, str8_lit("deterministic")); } - if(cmd_line_has_flag(cmdline, s("a"))) - { - ProfScope("convert") pdb_bake_params = p2r_convert(arena, &convert_params); - } - else - { - ProfScope("convert") pdb_bake_params = p2r_convert2(arena, &convert_params); - } + ProfScope("convert") pdb_bake_params = p2r_convert2(arena, &convert_params); } //- rjf: RDI inputs => RDI joining diff --git a/src/rdi_from_codeview/rdi_from_codeview.c b/src/rdi_from_codeview/rdi_from_codeview.c index a05a8805..0dc2494d 100644 --- a/src/rdi_from_codeview/rdi_from_codeview.c +++ b/src/rdi_from_codeview/rdi_from_codeview.c @@ -1,6 +1,11 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +// TODO(rjf): eliminate redundant null checks, just always allocate +// empty results, and have nulls gracefully fall through +// +// (search for != 0 instances, inserted to prevent prior crashes) + //////////////////////////////// //~ rjf: Basic Helpers @@ -1134,7 +1139,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) SLLStackPush(src_file_map->slots[src_file_slot], src_file_node); src_file_node->src_file = rdim_src_file_chunk_list_push(arena, all_src_files__sequenceless, total_path_count); src_file_node->src_file->path = str8_copy(arena, file_path_sanitized); - src_file_node->src_file->checksum_kind = p2r_rdi_from_cv_c13_checksum_kind(c13_checksum_kind); + src_file_node->src_file->checksum_kind = cv2r_rdi_from_cv_c13_checksum_kind(c13_checksum_kind); src_file_node->src_file->checksum = str8_copy(arena, checksum); } } @@ -2360,7 +2365,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) RDIM_Type *basic_type = itype_type_ptrs[cv_basic_type_code]; if(basic_type == 0) { - RDI_TypeKind type_kind = p2r_rdi_type_kind_from_cv_basic_type(cv_basic_type_code); + RDI_TypeKind type_kind = cv2r_rdi_type_kind_from_cv_basic_type(cv_basic_type_code); U32 byte_size = rdi_size_from_basic_type_kind(type_kind); basic_type = dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); if(byte_size == 0xffffffff) @@ -2900,7 +2905,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) } // rjf: symbol name -> container name - String8 container_name = str8_chop(str8_prefix(symbol_name, p2r_end_of_cplusplus_container_name(symbol_name)), 2); + String8 container_name = str8_chop(str8_prefix(symbol_name, cv2r_end_of_cplusplus_container_name(symbol_name)), 2); // rjf: non-empty container name -> gather if(container_name.size != 0) @@ -3050,7 +3055,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) nodes[idx] = n; } } - radsort(nodes, node_count, p2r_namespace_node_is_before); + radsort(nodes, node_count, cv2r_namespace_node_is_before); // rjf: build namespaces for this slot for EachIndex(node_in_slot_idx, node_count) @@ -3367,7 +3372,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // rjf: unpack global's container type B32 got_container = 0; RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + U64 container_name_opl = cv2r_end_of_cplusplus_container_name(name); String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); if(!got_container && container_name.size != 0) { @@ -3453,7 +3458,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // rjf: unpack proc's container type B32 got_container = 0; RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + U64 container_name_opl = cv2r_end_of_cplusplus_container_name(name); String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); if(!got_container && container_name.size != 0 && tpi_hash != 0 && tpi_leaf != 0) { @@ -3513,7 +3518,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) if(procedure_root_scope && procedure_root_scope->voff_ranges.min != 0) { U64 voff = procedure_root_scope->voff_ranges.min; - U64 hash = p2r_hash_from_voff(voff); + U64 hash = cv2r_hash_from_voff(voff); U64 bucket_idx = hash%link_name_map->buckets_count; CV2R_LinkNameNode *node = 0; for(CV2R_LinkNameNode *n = link_name_map->buckets[bucket_idx]; n != 0; n = n->next) @@ -3694,13 +3699,13 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // rjf: equip location info { // rjf: get raddbg register code - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + RDI_RegCode reg_code = cv2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); // TODO(rjf): real byte_size & byte_pos from cv_reg goes here U32 byte_size = 8; U32 byte_pos = 0; // rjf: build location - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); + RDIM_Location loc = cv2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); RDIM_Rng1U64 voff_range = {0, max_U64}; rdim_location_case_list_push(arena, &local->location_cases, loc, voff_range); } @@ -3724,7 +3729,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // rjf: unpack thread variable's container type B32 got_container = 0; RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); + U64 container_name_opl = cv2r_end_of_cplusplus_container_name(name); String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); if(!got_container && container_name.size != 0) { @@ -3846,7 +3851,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) Rng1U64 voff_range = r1u64(range_voff_first, range_voff_opl); CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + RDI_RegCode reg_code = cv2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); // rjf: build location RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; @@ -3922,7 +3927,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) Rng1U64 voff_range = r1u64(range_voff_first, range_voff_opl); CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); + RDI_RegCode reg_code = cv2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); // rjf: skip "subfield" location info - currently not supported if(defrange_subfield_register->field_offset != 0) @@ -3964,14 +3969,14 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // rjf: unpack sym CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)iter.struct_base; CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); - RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); + RDI_RegCode fp_register_code = cv2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); // rjf: build location B32 extra_indirection = 0; U32 byte_size = rdi_addr_size_from_arch(arch); U32 byte_pos = 0; S64 var_off = (S64)defrange_fprel_full_scope->off; - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); + RDIM_Location loc = cv2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); // rjf: emit location over ranges RDIM_Rng1U64 voff_range = {0, max_U64}; @@ -4169,7 +4174,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) U64 container_name_opl = 0; if(type != 0) { - container_name_opl = p2r_end_of_cplusplus_container_name(type->name); + container_name_opl = cv2r_end_of_cplusplus_container_name(type->name); } String8 name_qualified = name; if(container_name_opl != 0) @@ -4224,7 +4229,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // rjf: determine if this pub32 was covered by another symbol record B32 was_in_other_record = 0; { - U64 hash = p2r_hash_from_voff(voff); + U64 hash = cv2r_hash_from_voff(voff); U64 slot_idx = hash%link_name_map->buckets_count; for(CV2R_LinkNameNode *n = link_name_map->buckets[slot_idx]; n != 0; n = n->next) { @@ -4300,7 +4305,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) for EachInRange(n_idx, range) { RDIM_Namespace *ns = &n->v[n_idx]; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(ns->name); + U64 container_name_opl = cv2r_end_of_cplusplus_container_name(ns->name); String8 container_name = str8_chop(str8_prefix(ns->name, container_name_opl), 2); if(container_name.size != 0) { @@ -4999,7 +5004,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) if(dst_type != 0 && dst_type->udt != 0 && udt_name.size != 0) { // rjf: unpack fully qualified namespace from udt name - U64 container_name_opl = p2r_end_of_cplusplus_container_name(udt_name); + U64 container_name_opl = cv2r_end_of_cplusplus_container_name(udt_name); String8 container_name = str8_chop(str8_prefix(udt_name, container_name_opl), 2); String8 leaf_name = str8_skip(udt_name, container_name_opl); diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 59b37521..b5d59c8e 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -1,5140 +1,6 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -// TODO(rjf): eliminate redundant null checks, just always allocate -// empty results, and have nulls gracefully fall through -// -// (search for != 0 instances, inserted to prevent prior crashes) - -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 -p2r_end_of_cplusplus_container_name(String8 str) -{ - // NOTE: This finds the index one past the last "::" contained in str. - // if no "::" is contained in str, then the returned index is 0. - // The intent is that [0,clamp_bot(0,result - 2)) gives the - // "container name" and [result,str.size) gives the leaf name. - U64 result = 0; - if(str.size >= 2) - { - S64 template_nest_depth = 0; - for(U64 i = str.size; i >= 2; i -= 1) - { - if(template_nest_depth == 0 && str.str[i - 2] == ':' && str.str[i - 1] == ':') - { - result = i; - break; - } - if(str.str[i-1] == '>') - { - template_nest_depth += 1; - } - else if(str.str[i-1] == '<') - { - template_nest_depth -= 1; - template_nest_depth = ClampBot(template_nest_depth, 0); - } - } - } - return result; -} - -internal U64 -p2r_hash_from_voff(U64 voff) -{ - U64 hash = (voff >> 3) ^ ((7 & voff) << 6); - return hash; -} - -internal int -p2r_namespace_node_is_before(void *raw_a, void *raw_b) -{ - P2R_NamespaceNode **a = (P2R_NamespaceNode **)raw_a, **b = (P2R_NamespaceNode **)raw_b; - return (str8_compar(a[0]->string, b[0]->string, 0) < 0); -} - -//////////////////////////////// -//~ rjf: COFF <-> RDI Canonical Conversions - -internal RDI_BinarySectionFlags -p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags) -{ - RDI_BinarySectionFlags result = 0; - if(flags & COFF_SectionFlag_MemRead) - { - result |= RDI_BinarySectionFlag_Read; - } - if(flags & COFF_SectionFlag_MemWrite) - { - result |= RDI_BinarySectionFlag_Write; - } - if(flags & COFF_SectionFlag_MemExecute) - { - result |= RDI_BinarySectionFlag_Execute; - } - return(result); -} - -//////////////////////////////// -//~ rjf: CodeView <-> RDI Canonical Conversions - -internal RDI_Arch -p2r_rdi_arch_from_cv_arch(CV_Arch cv_arch) -{ - RDI_Arch result = 0; - switch(cv_arch) - { - case CV_Arch_8086:{}break; - case CV_Arch_X64:{result = RDI_Arch_X64;}break; - //case CV_Arch_8080: break; - //case CV_Arch_80286: break; - //case CV_Arch_80386: break; - //case CV_Arch_80486: break; - //case CV_Arch_PENTIUM: break; - //case CV_Arch_PENTIUMII: break; - //case CV_Arch_PENTIUMIII: break; - //case CV_Arch_MIPS: break; - //case CV_Arch_MIPS16: break; - //case CV_Arch_MIPS32: break; - //case CV_Arch_MIPS64: break; - //case CV_Arch_MIPSI: break; - //case CV_Arch_MIPSII: break; - //case CV_Arch_MIPSIII: break; - //case CV_Arch_MIPSIV: break; - //case CV_Arch_MIPSV: break; - //case CV_Arch_M68000: break; - //case CV_Arch_M68010: break; - //case CV_Arch_M68020: break; - //case CV_Arch_M68030: break; - //case CV_Arch_M68040: break; - //case CV_Arch_ALPHA: break; - //case CV_Arch_ALPHA_21164: break; - //case CV_Arch_ALPHA_21164A: break; - //case CV_Arch_ALPHA_21264: break; - //case CV_Arch_ALPHA_21364: break; - //case CV_Arch_PPC601: break; - //case CV_Arch_PPC603: break; - //case CV_Arch_PPC604: break; - //case CV_Arch_PPC620: break; - //case CV_Arch_PPCFP: break; - //case CV_Arch_PPCBE: break; - //case CV_Arch_SH3: break; - //case CV_Arch_SH3E: break; - //case CV_Arch_SH3DSP: break; - //case CV_Arch_SH4: break; - //case CV_Arch_SHMEDIA: break; - //case CV_Arch_ARM3: break; - //case CV_Arch_ARM4: break; - //case CV_Arch_ARM4T: break; - //case CV_Arch_ARM5: break; - //case CV_Arch_ARM5T: break; - //case CV_Arch_ARM6: break; - //case CV_Arch_ARM_XMAC: break; - //case CV_Arch_ARM_WMMX: break; - //case CV_Arch_ARM7: break; - //case CV_Arch_OMNI: break; - //case CV_Arch_IA64_1: break; - //case CV_Arch_IA64_2: break; - //case CV_Arch_CEE: break; - //case CV_Arch_AM33: break; - //case CV_Arch_M32R: break; - //case CV_Arch_TRICORE: break; - //case CV_Arch_EBC: break; - //case CV_Arch_THUMB: break; - //case CV_Arch_ARMNT: break; - //case CV_Arch_ARM64: break; - //case CV_Arch_D3D11_SHADER: break; - } - return result; -} - -internal RDI_RegCode -p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code) -{ - RDI_RegCode result = 0; - switch(arch) - { - case RDI_Arch_X64: - { - switch(reg_code) - { -#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break; - CV_Reg_X64_XList(X) -#undef X - } - }break; - } - return(result); -} - -internal RDI_Language -p2r_rdi_language_from_cv_language(CV_Language cv_language) -{ - RDI_Language result = 0; - switch(cv_language) - { - case CV_Language_C: result = RDI_Language_C; break; - case CV_Language_CXX: result = RDI_Language_CPlusPlus; break; - //case CV_Language_FORTRAN: result = ; break; - //case CV_Language_MASM: result = ; break; - //case CV_Language_PASCAL: result = ; break; - //case CV_Language_BASIC: result = ; break; - //case CV_Language_COBOL: result = ; break; - //case CV_Language_LINK: result = ; break; - //case CV_Language_CVTRES: result = ; break; - //case CV_Language_CVTPGD: result = ; break; - //case CV_Language_CSHARP: result = ; break; - //case CV_Language_VB: result = ; break; - //case CV_Language_ILASM: result = ; break; - //case CV_Language_JAVA: result = ; break; - //case CV_Language_JSCRIPT: result = ; break; - //case CV_Language_MSIL: result = ; break; - //case CV_Language_HLSL: result = ; break; - } - return(result); -} - -internal RDI_TypeKind -p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type) -{ - RDI_TypeKind result = RDI_TypeKind_Null; - switch(basic_type) - { - case CV_BasicType_VOID: {result = RDI_TypeKind_Void;}break; - case CV_BasicType_HRESULT: {result = RDI_TypeKind_HResult;}break; - - case CV_BasicType_RCHAR: - case CV_BasicType_CHAR: - case CV_BasicType_CHAR8: - {result = RDI_TypeKind_Char8;}break; - - case CV_BasicType_UCHAR: {result = RDI_TypeKind_UChar8;}break; - case CV_BasicType_WCHAR: {result = RDI_TypeKind_UChar16;}break; - case CV_BasicType_CHAR16: {result = RDI_TypeKind_Char16;}break; - case CV_BasicType_CHAR32: {result = RDI_TypeKind_Char32;}break; - - case CV_BasicType_BOOL8: - case CV_BasicType_INT8: - {result = RDI_TypeKind_S8;}break; - - case CV_BasicType_BOOL16: - case CV_BasicType_INT16: - case CV_BasicType_SHORT: - {result = RDI_TypeKind_S16;}break; - - case CV_BasicType_BOOL32: - case CV_BasicType_INT32: - case CV_BasicType_LONG: - {result = RDI_TypeKind_S32;}break; - - case CV_BasicType_BOOL64: - case CV_BasicType_INT64: - case CV_BasicType_QUAD: - {result = RDI_TypeKind_S64;}break; - - case CV_BasicType_INT128: - case CV_BasicType_OCT: - {result = RDI_TypeKind_S128;}break; - - case CV_BasicType_UINT8: {result = RDI_TypeKind_U8;}break; - - case CV_BasicType_UINT16: - case CV_BasicType_USHORT: - {result = RDI_TypeKind_U16;}break; - - case CV_BasicType_UINT32: - case CV_BasicType_ULONG: - {result = RDI_TypeKind_U32;}break; - - case CV_BasicType_UINT64: - case CV_BasicType_UQUAD: - {result = RDI_TypeKind_U64;}break; - - case CV_BasicType_UINT128: - case CV_BasicType_UOCT: - {result = RDI_TypeKind_U128;}break; - - case CV_BasicType_FLOAT16:{result = RDI_TypeKind_F16;}break; - case CV_BasicType_FLOAT32:{result = RDI_TypeKind_F32;}break; - case CV_BasicType_FLOAT32PP:{result = RDI_TypeKind_F32PP;}break; - case CV_BasicType_FLOAT48:{result = RDI_TypeKind_F48;}break; - case CV_BasicType_FLOAT64:{result = RDI_TypeKind_F64;}break; - case CV_BasicType_FLOAT80:{result = RDI_TypeKind_F80;}break; - case CV_BasicType_FLOAT128:{result = RDI_TypeKind_F128;}break; - case CV_BasicType_COMPLEX32:{result = RDI_TypeKind_ComplexF32;}break; - case CV_BasicType_COMPLEX64:{result = RDI_TypeKind_ComplexF64;}break; - case CV_BasicType_COMPLEX80:{result = RDI_TypeKind_ComplexF80;}break; - case CV_BasicType_COMPLEX128:{result = RDI_TypeKind_ComplexF128;}break; - case CV_BasicType_PTR:{result = RDI_TypeKind_Handle;}break; - } - return result; -} - -internal RDI_ChecksumKind -p2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k) -{ - RDI_ChecksumKind result = RDI_ChecksumKind_NULL; - switch((CV_C13ChecksumKindEnum)k) - { - case CV_C13ChecksumKind_Null: {result = RDI_ChecksumKind_NULL;}break; - case CV_C13ChecksumKind_MD5: {result = RDI_ChecksumKind_MD5;}break; - case CV_C13ChecksumKind_SHA1: {result = RDI_ChecksumKind_SHA1;}break; - case CV_C13ChecksumKind_SHA256:{result = RDI_ChecksumKind_SHA256;}break; - } - return result; -} - -//////////////////////////////// -//~ rjf: Location Info Building Helpers - -internal RDI_RegCode -p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg) -{ - RDI_RegCode result = 0; - switch(arch) - { - case RDI_Arch_X64: - { - switch(encoded_reg) - { - case CV_EncodedFramePtrReg_StackPtr: - { - result = RDI_RegCodeX64_rsp; - }break; - case CV_EncodedFramePtrReg_FramePtr: - { - result = RDI_RegCodeX64_rbp; - }break; - case CV_EncodedFramePtrReg_BasePtr: - { - result = RDI_RegCodeX64_r13; - }break; - } - }break; - } - return result; -} - -internal RDIM_Location -p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection) -{ - RDIM_Location result = {0}; - if(0 <= offset && offset <= (S64)max_U16) - { - if(extra_indirection) - { - result.kind = RDI_LocationKind_AddrAddrRegPlusOff; - result.reg_code = reg_code; - result.offset = offset; - } - else - { - result.kind = RDI_LocationKind_AddrRegPlusOff; - result.reg_code = reg_code; - result.offset = offset; - } - } - else - { - RDIM_EvalBytecode bytecode = {0}; - U32 regread_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos); - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, regread_param); - rdim_bytecode_push_sconst(arena, &bytecode, offset); - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0); - if(extra_indirection) - { - U64 addr_size = rdi_addr_size_from_arch(arch); - rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size); - } - result.kind = RDI_LocationKind_AddrBytecodeStream; - result.bytecode = bytecode; - } - return result; -} - -internal void -p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count) -{ - //- rjf: extract range info - U64 voff_first = 0; - U64 voff_opl = 0; - if(section != 0) - { - voff_first = section->voff + range->off; - voff_opl = voff_first + range->len; - } - - //- rjf: emit location for ranges not coverd by gaps - CV_LvarAddrGap *gap_ptr = gaps; - U64 voff_cursor = voff_first; - for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1) - { - U64 voff_gap_first = voff_first + gap_ptr->off; - U64 voff_gap_opl = voff_gap_first + gap_ptr->len; - if(voff_cursor < voff_gap_first) - { - RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first}; - rdim_location_case_list_push(arena, loc_cases, loc, voff_range); - } - voff_cursor = voff_gap_opl; - } - - //- rjf: emit remaining range - if(voff_cursor < voff_opl) - { - RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl}; - rdim_location_case_list_push(arena, loc_cases, loc, voff_range); - } -} - -//////////////////////////////// -//~ rjf: Top-Level Conversion Entry Point - -internal RDIM_BakeParams -p2r_convert(Arena *arena, P2R_ConvertParams *params) -{ - Temp scratch = scratch_begin(&arena, 1); - - ////////////////////////////////////////////////////////////// - //- rjf: do base MSF parse - // - MSF_Parsed *msf = 0; - ProfScope("do base MSF parse") - { - // rjf: setup output buckets - MSF_RawStreamTable *msf_raw_stream_table = 0; - U64 *msf_stream_take_counter = 0; - if(lane_idx() == 0) - { - msf_raw_stream_table = msf_raw_stream_table_from_data(scratch.arena, params->input_pdb_data); - msf = push_array(scratch.arena, MSF_Parsed, 1); - msf->page_size = msf_raw_stream_table->page_size; - msf->page_count = msf_raw_stream_table->total_page_count; - msf->stream_count = msf_raw_stream_table->stream_count; - msf->streams = push_array(scratch.arena, String8, msf->stream_count); - msf_stream_take_counter = push_array(scratch.arena, U64, 1); - } - lane_sync_u64(&msf, 0); - lane_sync_u64(&msf_raw_stream_table, 0); - - // rjf: do wide fill - { - lane_sync_u64(&msf_stream_take_counter, 0); - for(;;) - { - U64 stream_idx = ins_atomic_u64_inc_eval(msf_stream_take_counter) - 1; - if(stream_idx >= msf->stream_count) - { - break; - } - msf->streams[stream_idx] = msf_data_from_stream_number(arena, params->input_pdb_data, msf_raw_stream_table, stream_idx); - } - } - lane_sync(); - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: do top-level MSF/PDB extraction - // - PDB_Info *pdb_info = 0; - PDB_NamedStreamTable *named_streams = 0; - ProfScope("do top-level MSF/PDB extraction") if(lane_idx() == 0) - { - ProfScope("parse PDB info") - { - String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_Info); - pdb_info = pdb_info_from_data(scratch.arena, info_data); - if(pdb_info->features & PDB_FeatureFlag_MINIMAL_DBG_INFO) - { - log_user_error(str8_lit("PDB was linked with /DEBUG:FASTLINK; partial debug info is not supported. Please relink using /DEBUG:FULL.")); - } - } - ProfScope("parse named streams table") - { - named_streams = pdb_named_stream_table_from_info(scratch.arena, pdb_info); - } - } - lane_sync_u64(&pdb_info, 0); - lane_sync_u64(&named_streams, 0); - - ////////////////////////////////////////////////////////////// - //- rjf: parse PDB strtbl & top-level streams - // - PDB_Strtbl *strtbl = 0; - String8 raw_strtbl = {0}; - PDB_DbiParsed *dbi = 0; - PDB_TpiParsed *tpi = 0; - PDB_TpiParsed *ipi = 0; - ProfScope("parse PDB strtbl & top-level streams") - { - if(lane_idx() == lane_from_task_idx(0)) ProfScope("parse PDB strtbl") - { - MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_StringTable]; - String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn); - strtbl = pdb_strtbl_from_data(scratch.arena, strtbl_data); - raw_strtbl = str8_substr(strtbl_data, rng_1u64(strtbl->strblock_min, strtbl->strblock_max)); - } - if(lane_idx() == lane_from_task_idx(1)) ProfScope("parse DBI") - { - String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi); - dbi = pdb_dbi_from_data(scratch.arena, dbi_data); - } - if(lane_idx() == lane_from_task_idx(2)) ProfScope("parse TPI") - { - String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi); - tpi = pdb_tpi_from_data(scratch.arena, tpi_data); - } - if(lane_idx() == lane_from_task_idx(3)) ProfScope("parse IPI") - { - String8 ipi_data = msf_data_from_stream(msf, PDB_FixedStream_Ipi); - ipi = pdb_tpi_from_data(scratch.arena, ipi_data); - } - } - lane_sync_u64(&strtbl, lane_from_task_idx(0)); - lane_sync_u64(&raw_strtbl.size, lane_from_task_idx(0)); - lane_sync_u64(&raw_strtbl.str, lane_from_task_idx(0)); - lane_sync_u64(&dbi, lane_from_task_idx(1)); - lane_sync_u64(&tpi, lane_from_task_idx(2)); - lane_sync_u64(&ipi, lane_from_task_idx(3)); - - ////////////////////////////////////////////////////////////// - //- rjf: unpack DBI - // - COFF_SectionHeaderArray coff_sections = {0}; - PDB_GsiParsed *gsi = 0; - PDB_GsiParsed *psi_gsi_part = 0; - ProfScope("unpack DBI") - { - if(lane_idx() == lane_from_task_idx(0)) ProfScope("parse COFF sections") - { - MSF_StreamNumber section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]; - String8 section_data = msf_data_from_stream(msf, section_stream); - coff_sections = pdb_coff_section_array_from_data(scratch.arena, section_data); - } - if(lane_idx() == lane_from_task_idx(1)) ProfScope("parse GSI") - { - String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn); - gsi = pdb_gsi_from_data(scratch.arena, gsi_data); - } - if(lane_idx() == lane_from_task_idx(2)) ProfScope("parse GSI part of PSI") - { - String8 psi_data = msf_data_from_stream(msf, dbi->psi_sn); - String8 psi_data_gsi_part = str8_range(psi_data.str + sizeof(PDB_PsiHeader), psi_data.str + psi_data.size); - psi_gsi_part = pdb_gsi_from_data(scratch.arena, psi_data_gsi_part); - } - } - lane_sync_u64(&coff_sections.v, lane_from_task_idx(0)); - lane_sync_u64(&coff_sections.count, lane_from_task_idx(0)); - lane_sync_u64(&gsi, lane_from_task_idx(1)); - lane_sync_u64(&psi_gsi_part, lane_from_task_idx(2)); - - ////////////////////////////////////////////////////////////// - //- rjf: hash EXE, parse TPI/IPI hash/leaf & global symbol stream & comp units - // - U64 exe_hash = 0; - PDB_TpiHashParsed *tpi_hash = 0; - CV_LeafParsed *tpi_leaf = 0; - PDB_TpiHashParsed *ipi_hash = 0; - CV_LeafParsed *ipi_leaf = 0; - PDB_CompUnitArray *comp_units = 0; - PDB_CompUnitContributionArray *comp_unit_contributions = 0; - ProfScope("hash EXE, parse TPI/IPI hash/leaf & global symbol stream & comp units") - { - if(lane_idx() == lane_from_task_idx(0)) ProfScope("hash EXE") - { - exe_hash = rdi_hash(params->input_exe_data.str, params->input_exe_data.size); - } - if(lane_idx() == lane_from_task_idx(1)) ProfScope("parse TPI hash") - { - String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn); - if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs))) - { - hash_data = str8_zero(); - } - tpi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, tpi, hash_data); - } - if(lane_idx() == lane_from_task_idx(2)) ProfScope("parse TPI leaf") - { - String8 leaf_data = pdb_leaf_data_from_tpi(tpi); - tpi_leaf = cv_leaf_from_data(scratch.arena, leaf_data, tpi->itype_first); - } - if(lane_idx() == lane_from_task_idx(3)) ProfScope("parse IPI hash") - { - String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn); - if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs))) - { - hash_data = str8_zero(); - } - ipi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, ipi, hash_data); - } - if(lane_idx() == lane_from_task_idx(4)) ProfScope("parse IPI leaf") - { - String8 leaf_data = pdb_leaf_data_from_tpi(ipi); - ipi_leaf = cv_leaf_from_data(scratch.arena, leaf_data, ipi->itype_first); - } - if(lane_idx() == lane_from_task_idx(5)) ProfScope("parse compilation units") - { - String8 comp_units_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo); - comp_units = pdb_comp_unit_array_from_data(scratch.arena, comp_units_data); - } - if(lane_idx() == lane_from_task_idx(6)) ProfScope("parse compilation unit contributions") - { - String8 contribs_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon); - comp_unit_contributions = push_array(scratch.arena, PDB_CompUnitContributionArray, 1); - comp_unit_contributions[0] = pdb_comp_unit_contribution_array_from_data(scratch.arena, contribs_data, coff_sections); - } - } - lane_sync_u64(&exe_hash, lane_from_task_idx(0)); - lane_sync_u64(&tpi_hash, lane_from_task_idx(1)); - lane_sync_u64(&tpi_leaf, lane_from_task_idx(2)); - lane_sync_u64(&ipi_hash, lane_from_task_idx(3)); - lane_sync_u64(&ipi_leaf, lane_from_task_idx(4)); - lane_sync_u64(&comp_units, lane_from_task_idx(5)); - lane_sync_u64(&comp_unit_contributions, lane_from_task_idx(6)); - - ////////////////////////////////////////////////////////////// - //- rjf: bucket compilation unit contributions - // - RDIM_Rng1U64ChunkList *unit_ranges = 0; - ProfScope("bucket compilation unit contributions") if(lane_idx() == 0) - { - unit_ranges = push_array(scratch.arena, RDIM_Rng1U64ChunkList, comp_units->count + 1); - for(U64 comp_unit_idx = 0; comp_unit_idx < comp_unit_contributions->count; comp_unit_idx += 1) - { - PDB_CompUnitContribution *contribution = &comp_unit_contributions->contributions[comp_unit_idx]; - if(contribution->mod < comp_units->count) - { - RDIM_Rng1U64 r = {contribution->voff_first, contribution->voff_opl}; - rdim_rng1u64_chunk_list_push(arena, &unit_ranges[contribution->mod + 1], 256, r); - } - } - } - lane_sync_u64(&unit_ranges, 0); - - ////////////////////////////////////////////////////////////// - //- rjf: parse all syms & c13 line info streams - // - U64 all_syms_count = 0; - CV_SymParsed **all_syms = 0; - CV_C13Parsed **all_c13s = 0; - ProfScope("parse all syms & c13 line info streams") - { - //- rjf: setup outputs - U64 *task_counter = 0; - if(lane_idx() == 0) - { - all_syms_count = comp_units->count+1; // +1 for global symbol stream from DBI - all_syms = push_array(scratch.arena, CV_SymParsed *, all_syms_count); - all_c13s = push_array(scratch.arena, CV_C13Parsed *, all_syms_count); - task_counter = push_array(scratch.arena, U64, 1); - } - lane_sync_u64(&all_syms_count, 0); - lane_sync_u64(&all_syms, 0); - lane_sync_u64(&all_c13s, 0); - - //- rjf: wide fill - { - lane_sync_u64(&task_counter, 0); - U64 task_count = all_syms_count; - for(;;) - { - U64 task_idx = ins_atomic_u64_inc_eval(task_counter) - 1; - if(task_idx >= task_count) - { - break; - } - if(task_idx > 0) - { - PDB_CompUnit *unit = comp_units->units[task_idx-1]; - String8 unit_sym_data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols); - String8 unit_c13_data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13); - all_syms[task_idx] = cv_sym_from_data(arena, unit_sym_data, 4); - all_c13s[task_idx] = cv_c13_parsed_from_data(arena, unit_c13_data, raw_strtbl, coff_sections); - } - else - { - String8 global_sym_data = msf_data_from_stream(msf, dbi->sym_sn); - all_syms[task_idx] = cv_sym_from_data(arena, global_sym_data, 4); - } - } - } - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: calculate EXE's max voff - // - U64 exe_voff_max = 0; - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - // rjf: set up - U64 *lane_voff_maxes = 0; - if(lane_idx() == 0) - { - lane_voff_maxes = push_array(scratch2.arena, U64, lane_count()); - } - lane_sync_u64(&lane_voff_maxes, 0); - - // rjf: compute each lane's max - { - U64 lane_voff_max = 0; - COFF_SectionHeader *sections = coff_sections.v; - Rng1U64 range = lane_range(coff_sections.count); - for EachInRange(idx, range) - { - lane_voff_max = Max(lane_voff_max, sections[idx].voff + sections[idx].vsize); - } - lane_voff_maxes[lane_idx()] = lane_voff_max; - } - lane_sync(); - - // rjf: find max from all lanes - U64 exe_voff_max = 0; - for EachIndex(l_idx, lane_count()) - { - exe_voff_max = Max(exe_voff_max, lane_voff_maxes[l_idx]); - } - lane_sync(); - - scratch_end(scratch2); - } - - ////////////////////////////////////////////////////////////// - //- rjf: determine architecture - // - RDI_Arch arch = RDI_Arch_NULL; - U64 arch_addr_size = 0; - { - // - // TODO(rjf): in some cases, the first compilation unit has a zero - // architecture, as it's sometimes used as a "nil" unit. this causes bugs - // in later stages of conversion - particularly, this was detected via - // busted location info. so i've converted this to a scan-until-we-find-an- - // architecture. however, this may still be fundamentally insufficient, - // because Nick has informed me that x86 units can be linked with x64 - // units, meaning the appropriate architecture at any point in time is not - // a top-level concept, and is rather dependent on to which compilation - // unit particular symbols belong. so in the future, to support that (odd) - // case, we'll need to not only have this be a top-level "contextual" piece - // of info, but to use the appropriate compilation unit's architecture when - // possible. assuming, of course, that we care about supporting that case. - // - for EachIndex(idx, all_syms_count) - { - arch = p2r_rdi_arch_from_cv_arch(all_syms[idx]->info.arch); - if(arch != RDI_Arch_NULL) - { - break; - } - } - arch_addr_size = rdi_addr_size_from_arch(arch); - } - - ////////////////////////////////////////////////////////////// - //- rjf: predict total symbol count - // - U64 symbol_count_prediction = 0; - { - U64 *symbol_count_prediction_ptr = &symbol_count_prediction; - lane_sync_u64(&symbol_count_prediction_ptr, 0); - U64 lane_sym_count = 0; - Rng1U64 range = lane_range(all_syms_count); - for EachInRange(idx, range) - { - lane_sym_count += all_syms[idx]->sym_ranges.count; - } - ins_atomic_u64_add_eval(symbol_count_prediction_ptr, lane_sym_count); - lane_sync(); - symbol_count_prediction = *symbol_count_prediction_ptr; - } - - ////////////////////////////////////////////////////////////// - //- rjf: build link name map - // - P2R_LinkNameMap *link_name_map = 0; - ProfScope("build link name map") if(all_syms_count != 0 && lane_idx() == 0) - { - // rjf: set up - { - link_name_map = push_array(scratch.arena, P2R_LinkNameMap, 1); - link_name_map->buckets_count = Max(1, symbol_count_prediction); - link_name_map->buckets = push_array(scratch.arena, P2R_LinkNameNode *, link_name_map->buckets_count); - } - - // rjf: fill - if(params->subset_flags & RDIM_SubsetFlag_Procedures) - { - CV_SymParsed *sym = all_syms[0]; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - case CV_SymKind_PUB32: - { - // rjf: unpack sym - CV_SymPub32 *pub32 = (CV_SymPub32 *)iter.struct_base; - String8 name = str8_cstring_capped(pub32+1, iter.opl); - COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= coff_sections.count) ? &coff_sections.v[pub32->sec-1] : 0; - U64 voff = 0; - if(section != 0) - { - voff = section->voff + pub32->off; - } - - // rjf: commit to link name map - U64 hash = p2r_hash_from_voff(voff); - U64 bucket_idx = hash%link_name_map->buckets_count; - P2R_LinkNameNode *node = push_array(scratch.arena, P2R_LinkNameNode, 1); - SLLStackPush(link_name_map->buckets[bucket_idx], node); - node->voff = voff; - node->name = name; - }break; - } - } - } - } - lane_sync_u64(&link_name_map, 0); - - ////////////////////////////////////////////////////////////// - //- rjf: gather all file paths - // - P2R_SrcFileStubArray *unit_file_stubs = 0; - U64Array *unit_file_paths_hashes = 0; - ProfScope("gather all file paths") - { - //- rjf: prep outputs - ProfScope("prep outputs") if(lane_idx() == 0) - { - unit_file_stubs = push_array(scratch.arena, P2R_SrcFileStubArray, comp_units->count + 1); - unit_file_paths_hashes = push_array(scratch.arena, U64Array, comp_units->count + 1); - } - lane_sync_u64(&unit_file_stubs, 0); - lane_sync_u64(&unit_file_paths_hashes, 0); - - //- rjf: do wide gather - ProfScope("do wide gather") - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - //- rjf: build local hash table to dedup files within this lane - U64 hit_path_slots_count = 4096; - String8Node **hit_path_slots = push_array(scratch2.arena, String8Node *, hit_path_slots_count); - - //- rjf: take units across lanes, find all file paths - U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; - lane_sync_u64(&sym_take_counter, 0); - ProfScope("take units across lanes, find all file paths") - for(;;) - { - //- rjf: take next unit - U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(unit_idx >= comp_units->count + 1) - { - break; - } - - //- rjf: unpack unit - CV_SymParsed *sym = all_syms[unit_idx]; - CV_C13Parsed *c13 = all_c13s[unit_idx]; - - //- rjf: produce obj name/path - String8 obj_name = str8_lit("*global*"); - if(unit_idx > 0) - { - PDB_CompUnit *comp_unit = comp_units->units[unit_idx-1]; - obj_name = comp_unit->obj_name; - if(str8_match(obj_name, str8_lit("* Linker *"), 0) || - str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) - { - MemoryZeroStruct(&obj_name); - } - } - String8 obj_folder_path = backslashed_from_str8(scratch2.arena, str8_chop_last_slash(obj_name)); - - //- rjf: find all inline site symbols & gather file stubs - P2R_SrcFileStubNode *first_src_file_stub = 0; - P2R_SrcFileStubNode *last_src_file_stub = 0; - U64 src_file_stub_count = 0; - U64 base_voff = 0; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - - //- rjf: LPROC32/GPROC32 (gather base address) - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0; - if(section != 0) - { - base_voff = section->voff + proc32->off; - } - }break; - - //- rjf: INLINESITE - case CV_SymKind_INLINESITE: - { - // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; - String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); - - // rjf: map inlinee -> parsed cv c13 inlinee line info - CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0; - { - U64 hash = cv_hash_from_item_id(sym->inlinee); - U64 slot_idx = hash%c13->inlinee_lines_parsed_slots_count; - for(CV_C13InlineeLinesParsedNode *n = c13->inlinee_lines_parsed_slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->v.inlinee == sym->inlinee) - { - inlinee_lines_parsed = &n->v; - break; - } - } - } - - // rjf: build line table, fill with parsed binary annotations - if(inlinee_lines_parsed != 0) - { - // rjf: grab checksums sub-section - CV_C13SubSectionNode *file_chksms = c13->file_chksms_sub_section; - - // rjf: gathered lines - U32 last_file_off = max_U32; - U32 curr_file_off = max_U32; - U64 line_count = 0; - CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(inlinee_lines_parsed->file_off, inlinee_lines_parsed->first_source_ln, base_voff); - for(;;) - { - // rjf: step & update - CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots); - if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitFile) - { - last_file_off = curr_file_off; - curr_file_off = step.file_off; - } - if(step.flags == 0 && line_count > 0) - { - last_file_off = curr_file_off; - curr_file_off = max_U32; - } - - // rjf: file updated -> gather new file name - if(last_file_off != max_U32 && last_file_off != curr_file_off) - { - String8 seq_file_name = {0}; - CV_C13ChecksumKind checksum_kind = CV_C13ChecksumKind_Null; - String8 checksum_value = {0}; - if(last_file_off + sizeof(CV_C13Checksum) <= file_chksms->size) - { - CV_C13Checksum *checksum = (CV_C13Checksum *)(c13->data.str + file_chksms->off + last_file_off); - U32 name_off = checksum->name_off; - seq_file_name = pdb_strtbl_string_from_off(strtbl, name_off); - checksum_kind = checksum->kind; - checksum_value = str8_skip(c13->data, file_chksms->off + last_file_off + sizeof(*checksum)); - checksum_value.size = Min(checksum->len, checksum_value.size); - } - - // rjf: file name -> sanitized file path - String8 file_path = seq_file_name; - String8 file_path_sanitized = str8_copy(scratch2.arena, str8_skip_chop_whitespace(file_path)); - { - PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); - String8List file_path_sanitized_parts = str8_split_path(scratch2.arena, file_path_sanitized); - if(file_path_sanitized_style == PathStyle_Relative) - { - String8List obj_folder_path_parts = str8_split_path(scratch2.arena, obj_folder_path); - str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); - file_path_sanitized_parts = obj_folder_path_parts; - file_path_sanitized_style = path_style_from_str8(obj_folder_path); - } - str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); - file_path_sanitized = str8_path_list_join_by_style(scratch2.arena, &file_path_sanitized_parts, file_path_sanitized_style); - } - - // rjf: sanitized file path -> source file node - U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); - U64 hit_path_slot = file_path_sanitized_hash%hit_path_slots_count; - String8Node *hit_path_node = 0; - for(String8Node *n = hit_path_slots[hit_path_slot]; n != 0; n = n->next) - { - if(str8_match(n->string, file_path_sanitized, 0)) - { - hit_path_node = n; - break; - } - } - if(hit_path_node == 0) - { - hit_path_node = push_array(scratch2.arena, String8Node, 1); - SLLStackPush(hit_path_slots[hit_path_slot], hit_path_node); - hit_path_node->string = file_path_sanitized; - P2R_SrcFileStubNode *stub_n = push_array(scratch2.arena, P2R_SrcFileStubNode, 1); - SLLQueuePush(first_src_file_stub, last_src_file_stub, stub_n); - src_file_stub_count += 1; - stub_n->v.file_path = str8_copy(scratch.arena, file_path_sanitized); - stub_n->v.checksum_kind = checksum_kind; - stub_n->v.checksum = str8_copy(scratch.arena, checksum_value); - } - line_count = 0; - } - - // rjf: count lines - if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitLine) - { - line_count += 1; - } - - // rjf: no more flags -> done - if(step.flags == 0) - { - break; - } - } - } - }break; - } - } - - // rjf: find all files in this unit's (non-inline) line info - if(c13 != 0) - { - ProfScope("find all files in this unit's (non-inline) line info") - for(CV_C13SubSectionNode *node = c13->first_sub_section; - node != 0; - node = node->next) - { - if(node->kind == CV_C13SubSectionKind_Lines) - { - for(CV_C13LinesParsedNode *lines_n = node->lines_first; - lines_n != 0; - lines_n = lines_n->next) - { - // rjf: file name -> sanitized file path - String8 file_path = lines_n->v.file_name; - String8 file_path_sanitized = str8_copy(scratch2.arena, str8_skip_chop_whitespace(file_path)); - { - PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); - String8List file_path_sanitized_parts = str8_split_path(scratch2.arena, file_path_sanitized); - if(file_path_sanitized_style == PathStyle_Relative) - { - String8List obj_folder_path_parts = str8_split_path(scratch2.arena, obj_folder_path); - str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); - file_path_sanitized_parts = obj_folder_path_parts; - file_path_sanitized_style = path_style_from_str8(obj_folder_path); - } - str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); - file_path_sanitized = str8_path_list_join_by_style(scratch2.arena, &file_path_sanitized_parts, file_path_sanitized_style); - } - - // rjf: sanitized file path -> source file node - U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); - U64 hit_path_slot = file_path_sanitized_hash%hit_path_slots_count; - String8Node *hit_path_node = 0; - for(String8Node *n = hit_path_slots[hit_path_slot]; n != 0; n = n->next) - { - if(str8_match(n->string, file_path_sanitized, 0)) - { - hit_path_node = n; - break; - } - } - if(hit_path_node == 0) - { - hit_path_node = push_array(scratch2.arena, String8Node, 1); - SLLStackPush(hit_path_slots[hit_path_slot], hit_path_node); - hit_path_node->string = file_path_sanitized; - P2R_SrcFileStubNode *stub_n = push_array(scratch2.arena, P2R_SrcFileStubNode, 1); - SLLQueuePush(first_src_file_stub, last_src_file_stub, stub_n); - src_file_stub_count += 1; - stub_n->v.file_path = str8_copy(scratch.arena, file_path_sanitized); - stub_n->v.checksum_kind = lines_n->v.checksum_kind; - stub_n->v.checksum = str8_copy(scratch.arena, lines_n->v.checksum); - } - } - } - } - } - - //- rjf: merge into array for this unit - unit_file_stubs[unit_idx].count = src_file_stub_count; - unit_file_stubs[unit_idx].v = push_array_no_zero(scratch.arena, P2R_SrcFileStub, unit_file_stubs[unit_idx].count); - { - U64 idx = 0; - for EachNode(n, P2R_SrcFileStubNode, first_src_file_stub) - { - unit_file_stubs[unit_idx].v[idx] = n->v; - idx += 1; - } - } - - //- rjf: hash this unit's file paths - U64Array hashes = {0}; - hashes.count = unit_file_stubs[unit_idx].count; - hashes.v = push_array(scratch.arena, U64, hashes.count); - for EachIndex(idx, unit_file_stubs[unit_idx].count) - { - hashes.v[idx] = rdi_hash(unit_file_stubs[unit_idx].v[idx].file_path.str, unit_file_stubs[unit_idx].v[idx].file_path.size); - } - unit_file_paths_hashes[unit_idx] = hashes; - } - lane_sync(); - - scratch_end(scratch2); - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: build unified collection & map for source files - // - RDIM_SrcFileChunkList *all_src_files__sequenceless = 0; - P2R_SrcFileMap *src_file_map = 0; - if(lane_idx() == 0 && params->subset_flags & (RDIM_SubsetFlag_NormalSourcePathNameMap| - RDIM_SubsetFlag_LineInfo| - RDIM_SubsetFlag_InlineLineInfo)) - { - //- rjf: set up table - U64 total_path_count = 0; - ProfScope("set up table") - { - all_src_files__sequenceless = push_array(scratch.arena, RDIM_SrcFileChunkList, 1); - src_file_map = push_array(scratch.arena, P2R_SrcFileMap, 1); - for EachIndex(idx, comp_units->count) - { - total_path_count += unit_file_stubs[idx].count; - } - src_file_map->slots_count = total_path_count + total_path_count/2 + 1; - src_file_map->slots = push_array(scratch.arena, P2R_SrcFileNode *, src_file_map->slots_count); - } - - //- rjf: fill table - ProfScope("fill table") - { - for EachIndex(idx, comp_units->count) - { - P2R_SrcFileStubArray stubs = unit_file_stubs[idx]; - U64Array hashes = unit_file_paths_hashes[idx]; - for EachIndex(stub_idx, stubs.count) - { - String8 file_path_sanitized = stubs.v[stub_idx].file_path; - CV_C13ChecksumKind c13_checksum_kind = stubs.v[stub_idx].checksum_kind; - String8 checksum = stubs.v[stub_idx].checksum; - U64 file_path_sanitized_hash = hashes.v[stub_idx]; - U64 src_file_slot = file_path_sanitized_hash%src_file_map->slots_count; - P2R_SrcFileNode *src_file_node = 0; - for(P2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next) - { - if(str8_match(n->src_file->path, file_path_sanitized, 0)) - { - src_file_node = n; - break; - } - } - if(src_file_node == 0) - { - src_file_node = push_array(arena, P2R_SrcFileNode, 1); - SLLStackPush(src_file_map->slots[src_file_slot], src_file_node); - src_file_node->src_file = rdim_src_file_chunk_list_push(arena, all_src_files__sequenceless, total_path_count); - src_file_node->src_file->path = str8_copy(arena, file_path_sanitized); - src_file_node->src_file->checksum_kind = p2r_rdi_from_cv_c13_checksum_kind(c13_checksum_kind); - src_file_node->src_file->checksum = str8_copy(arena, checksum); - } - } - } - } - } - lane_sync_u64(&all_src_files__sequenceless, 0); - lane_sync_u64(&src_file_map, 0); - - ////////////////////////////////////////////////////////////// - //- rjf: convert unit header info - // - RDIM_UnitChunkList *all_units_ptr = 0; - RDIM_LineTableChunkList *units_line_tables = 0; - RDIM_LineTable **units_first_inline_site_line_tables = 0; - ProfScope("convert unit header info") - { - //- rjf: set up outputs - ProfScope("set up outputs") if(lane_idx() == 0) - { - all_units_ptr = push_array(scratch.arena, RDIM_UnitChunkList, 1); - if(params->subset_flags & RDIM_SubsetFlag_Units) - { - for EachIndex(idx, comp_units->count + 1) - { - rdim_unit_chunk_list_push(arena, all_units_ptr, comp_units->count + 1); - } - } - units_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, comp_units->count + 1); - units_first_inline_site_line_tables = push_array(scratch.arena, RDIM_LineTable *, comp_units->count + 1); - } - lane_sync_u64(&all_units_ptr, 0); - lane_sync_u64(&units_line_tables, 0); - lane_sync_u64(&units_first_inline_site_line_tables, 0); - RDIM_Unit *units = all_units_ptr->first ? all_units_ptr->first->v : 0; - U64 units_count = all_units_ptr->first ? all_units_ptr->first->count : 0; - - //- rjf: do per-lane work - if(params->subset_flags & (RDIM_SubsetFlag_Units| - RDIM_SubsetFlag_NormalSourcePathNameMap| - RDIM_SubsetFlag_LineInfo| - RDIM_SubsetFlag_InlineLineInfo)) - { - U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; - lane_sync_u64(&sym_take_counter, 0); - ProfScope("wide fill") for(;;) - { - //- rjf: take next unit - U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(unit_idx >= units_count) - { - break; - } - Temp scratch = scratch_begin(&arena, 1); - RDIM_LineTableChunkList *dst_line_tables = &units_line_tables[unit_idx]; - PDB_CompUnit *src_unit = (unit_idx > 0 ? comp_units->units[unit_idx-1] : 0); - CV_SymParsed *src_unit_sym = all_syms[unit_idx]; - CV_C13Parsed *src_unit_c13 = all_c13s[unit_idx]; - RDIM_Unit *dst_unit = 0; - if(params->subset_flags & RDIM_SubsetFlag_Units) { dst_unit = &units[unit_idx]; } - - // rjf: extract unit name - String8 unit_name = {0}; - if(src_unit != 0) - { - unit_name = src_unit->obj_name; - if(unit_name.size != 0) - { - String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name); - if(unit_name_past_last_slash.size != 0) - { - unit_name = unit_name_past_last_slash; - } - } - } - else - { - unit_name = str8_lit("*global*"); - } - - // rjf: produce obj name/path - String8 obj_name = {0}; - if(src_unit != 0) - { - obj_name = src_unit->obj_name; - if(str8_match(obj_name, str8_lit("* Linker *"), 0) || - str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) - { - MemoryZeroStruct(&obj_name); - } - } - String8 obj_folder_path = backslashed_from_str8(scratch.arena, str8_chop_last_slash(obj_name)); - - // rjf: extract unit group name - String8 group_name = {0}; - if(src_unit != 0) - { - group_name = src_unit->group_name; - } - - //- rjf: main unit line table conversion - RDIM_LineTable *line_table = 0; - if(params->subset_flags & RDIM_SubsetFlag_LineInfo && src_unit_c13 != 0) ProfScope("main unit line table conversion") - { - for(CV_C13SubSectionNode *node = src_unit_c13->first_sub_section; - node != 0; - node = node->next) - { - if(node->kind == CV_C13SubSectionKind_Lines) - { - for(CV_C13LinesParsedNode *lines_n = node->lines_first; - lines_n != 0; - lines_n = lines_n->next) - { - CV_C13LinesParsed *lines = &lines_n->v; - - // rjf: file name -> sanitized file path - String8 file_path = lines->file_name; - String8 file_path_sanitized = str8_copy(scratch.arena, str8_skip_chop_whitespace(file_path)); - { - PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); - String8List file_path_sanitized_parts = str8_split_path(scratch.arena, file_path_sanitized); - if(file_path_sanitized_style == PathStyle_Relative) - { - String8List obj_folder_path_parts = str8_split_path(scratch.arena, obj_folder_path); - str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); - file_path_sanitized_parts = obj_folder_path_parts; - file_path_sanitized_style = path_style_from_str8(obj_folder_path); - } - str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); - file_path_sanitized = str8_path_list_join_by_style(scratch.arena, &file_path_sanitized_parts, file_path_sanitized_style); - } - - // rjf: sanitized file path -> source file node - U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); - U64 src_file_slot = file_path_sanitized_hash%src_file_map->slots_count; - P2R_SrcFileNode *src_file_node = 0; - if(lines->line_count != 0) - { - for(P2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next) - { - if(str8_match(n->src_file->path, file_path_sanitized, 0)) - { - src_file_node = n; - break; - } - } - } - - // rjf: push sequence into both line table & source file's line map - if(src_file_node != 0) - { - if(line_table == 0) - { - line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 256); - } - RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, dst_line_tables, line_table, src_file_node->src_file, lines->voffs, lines->line_nums, lines->col_nums, lines->line_count); - } - } - } - } - } - - //- rjf: fill unit - if(dst_unit != 0) - { - dst_unit->unit_name = unit_name; - dst_unit->compiler_name = src_unit_sym->info.compiler_name; - dst_unit->object_file = obj_name; - dst_unit->archive_file = group_name; - dst_unit->language = p2r_rdi_language_from_cv_language(src_unit_sym->info.language); - dst_unit->line_table = line_table; - dst_unit->voff_ranges = unit_ranges[unit_idx]; - } - - //- rjf: build per-inline-site line tables - if(params->subset_flags & RDIM_SubsetFlag_InlineLineInfo) ProfScope("build per-inline-site line tables") - { - U64 base_voff = 0; - for(CV_RecIter iter = {0}; cv_rec_next(src_unit_sym->data, &src_unit_sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - - //- rjf: LPROC32/GPROC32 (gather base address) - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0; - if(section != 0) - { - base_voff = section->voff + proc32->off; - } - }break; - - //- rjf: INLINESITE - case CV_SymKind_INLINESITE: - { - // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; - String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); - - // rjf: map inlinee -> parsed cv c13 inlinee line info - CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0; - { - U64 hash = cv_hash_from_item_id(sym->inlinee); - U64 slot_idx = hash%src_unit_c13->inlinee_lines_parsed_slots_count; - for(CV_C13InlineeLinesParsedNode *n = src_unit_c13->inlinee_lines_parsed_slots[slot_idx]; n != 0; n = n->hash_next) - { - if(n->v.inlinee == sym->inlinee) - { - inlinee_lines_parsed = &n->v; - break; - } - } - } - - // rjf: build line table, fill with parsed binary annotations - if(inlinee_lines_parsed != 0) - { - // rjf: grab checksums sub-section - CV_C13SubSectionNode *file_chksms = src_unit_c13->file_chksms_sub_section; - - // rjf: gathered lines - typedef struct LineChunk LineChunk; - struct LineChunk - { - LineChunk *next; - U64 cap; - U64 count; - U64 *voffs; // [line_count + 1] (sorted) - U32 *line_nums; // [line_count] - U16 *col_nums; // [2*line_count] - }; - LineChunk *first_line_chunk = 0; - LineChunk *last_line_chunk = 0; - U64 total_line_chunk_line_count = 0; - U32 last_file_off = max_U32; - U32 curr_file_off = max_U32; - RDIM_LineTable* line_table = 0; - - CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(inlinee_lines_parsed->file_off, inlinee_lines_parsed->first_source_ln, base_voff); - for(;;) - { - // rjf: step & update - CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots); - if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitFile) - { - last_file_off = curr_file_off; - curr_file_off = step.file_off; - } - if(step.flags == 0 && total_line_chunk_line_count > 0) - { - last_file_off = curr_file_off; - curr_file_off = max_U32; - } - - // rjf: file updated -> push line chunks gathered for this file - if(last_file_off != max_U32 && last_file_off != curr_file_off) - { - String8 seq_file_name = {0}; - if(last_file_off + sizeof(CV_C13Checksum) <= file_chksms->size) - { - CV_C13Checksum *checksum = (CV_C13Checksum*)(src_unit_c13->data.str + file_chksms->off + last_file_off); - U32 name_off = checksum->name_off; - seq_file_name = pdb_strtbl_string_from_off(strtbl, name_off); - } - - // rjf: file name -> sanitized file path - String8 file_path = seq_file_name; - String8 file_path_sanitized = str8_copy(scratch.arena, str8_skip_chop_whitespace(file_path)); - { - PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized); - String8List file_path_sanitized_parts = str8_split_path(scratch.arena, file_path_sanitized); - if(file_path_sanitized_style == PathStyle_Relative) - { - String8List obj_folder_path_parts = str8_split_path(scratch.arena, obj_folder_path); - str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts); - file_path_sanitized_parts = obj_folder_path_parts; - file_path_sanitized_style = path_style_from_str8(obj_folder_path); - } - str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style); - file_path_sanitized = str8_path_list_join_by_style(scratch.arena, &file_path_sanitized_parts, file_path_sanitized_style); - } - - // rjf: sanitized file path -> source file node - U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size); - U64 src_file_slot = file_path_sanitized_hash%src_file_map->slots_count; - P2R_SrcFileNode *src_file_node = 0; - for(P2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next) - { - if(str8_match(n->src_file->path, file_path_sanitized, 0)) - { - src_file_node = n; - break; - } - } - - // rjf: gather all lines - RDI_U64 *voffs = 0; - RDI_U32 *line_nums = 0; - RDI_U64 line_count = 0; - if(src_file_node != 0) - { - voffs = push_array_no_zero(arena, RDI_U64, total_line_chunk_line_count+1); - line_nums = push_array_no_zero(arena, RDI_U32, total_line_chunk_line_count); - line_count = total_line_chunk_line_count; - U64 dst_idx = 0; - for(LineChunk *chunk = first_line_chunk; chunk != 0; chunk = chunk->next) - { - MemoryCopy(voffs+dst_idx, chunk->voffs, sizeof(U64)*(chunk->count+1)); - MemoryCopy(line_nums+dst_idx, chunk->line_nums, sizeof(U32)*chunk->count); - dst_idx += chunk->count; - } - } - - // rjf: push - if(line_count != 0) - { - if(line_table == 0) - { - line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 256); - if(units_first_inline_site_line_tables[unit_idx] == 0) - { - units_first_inline_site_line_tables[unit_idx] = line_table; - } - } - rdim_line_table_push_sequence(arena, dst_line_tables, line_table, src_file_node->src_file, voffs, line_nums, 0, line_count); - } - - // rjf: clear line chunks for subsequent sequences - first_line_chunk = last_line_chunk = 0; - total_line_chunk_line_count = 0; - } - - // rjf: new line -> emit to chunk - if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitLine) - { - LineChunk *chunk = last_line_chunk; - if(chunk == 0 || chunk->count+1 >= chunk->cap) - { - chunk = push_array(scratch.arena, LineChunk, 1); - SLLQueuePush(first_line_chunk, last_line_chunk, chunk); - chunk->cap = 8; - chunk->voffs = push_array_no_zero(scratch.arena, U64, chunk->cap); - chunk->line_nums = push_array_no_zero(scratch.arena, U32, chunk->cap); - } - chunk->voffs[chunk->count] = step.line_voff; - chunk->voffs[chunk->count+1] = step.line_voff_end; - chunk->line_nums[chunk->count] = step.ln; - chunk->count += 1; - total_line_chunk_line_count += 1; - } - - // rjf: no more flags -> done - if(step.flags == 0) - { - break; - } - } - } - }break; - } - } - } - - scratch_end(scratch); - } - } - } - lane_sync(); - RDIM_UnitChunkList all_units = *all_units_ptr; - - ////////////////////////////////////////////////////////////// - //- rjf: join all line tables - // - RDIM_LineTableChunkList all_line_tables = {0}; - RDIM_LineTableChunkList *all_line_tables_ptr = &all_line_tables; - ProfScope("join all line tables") if(lane_idx() == 0) - { - for EachIndex(idx, comp_units->count + 1) - { - rdim_line_table_chunk_list_concat_in_place(&all_line_tables, &units_line_tables[idx]); - } - } - lane_sync_u64(&all_line_tables_ptr, 0); - all_line_tables = *all_line_tables_ptr; - - ////////////////////////////////////////////////////////////// - //- rjf: equip source files with line sequences - // - ProfScope("equip source files with line sequences") if(lane_idx() == 0) - { - for(RDIM_LineTableChunkNode *line_table_chunk_n = all_line_tables.first; - line_table_chunk_n != 0; - line_table_chunk_n = line_table_chunk_n->next) - { - for EachIndex(chunk_line_table_idx, line_table_chunk_n->count) - { - RDIM_LineTable *line_table = &line_table_chunk_n->v[chunk_line_table_idx]; - for(RDIM_LineSequenceNode *s = line_table->first_seq; s != 0; s = s->next) - { - rdim_src_file_push_line_sequence(arena, all_src_files__sequenceless, s->v.src_file, &s->v); - } - } - } - } - lane_sync(); - RDIM_SrcFileChunkList all_src_files = *all_src_files__sequenceless; - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 1: produce type forward resolution map - // - // this map is used to resolve usage of "incomplete structs" in codeview's - // type info. this often happens when e.g. "struct Foo" is used to refer to - // a later-defined "Foo", which actually contains members and so on. we want - // to hook types up to their actual destination complete types wherever - // possible, and so this map can be used to do that in subsequent stages. - // - CV_TypeId *itype_fwd_map = 0; - CV_TypeId itype_first = 0; - CV_TypeId itype_opl = 0; - ProfScope("types pass 1: produce type forward resolution map") - { - //- rjf: allocate forward resolution map - if(lane_idx() == 0) - { - itype_first = tpi_leaf->itype_first; - itype_opl = tpi_leaf->itype_opl; - itype_fwd_map = push_array(scratch.arena, CV_TypeId, (U64)itype_opl); - } - lane_sync_u64(&itype_first, 0); - lane_sync_u64(&itype_opl, 0); - lane_sync_u64(&itype_fwd_map, 0); - - //- rjf: do wide fill - if(params->subset_flags & RDIM_SubsetFlag_Types) - { - Rng1U64 range = lane_range(itype_opl); - for EachInRange(idx, range) - { - CV_TypeId itype = (CV_TypeId)idx; - if(itype < itype_first) { continue; } - - //- rjf: determine if this itype resolves to another - CV_TypeId itype_fwd = 0; - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= tpi_leaf->data.size && - range->off+2+header_struct_size <= tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) - { - default:{}break; - - //- rjf: CLASS/STRUCTURE - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - // rjf: unpack leaf header - CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_struct->props & CV_TypeProp_FwdRef) - { - // rjf: unpack rest of leaf - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: lookup - B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && - ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: CLASS2/STRUCT2 - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - // rjf: unpack leaf header - CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_struct->props & CV_TypeProp_FwdRef) - { - // rjf: unpack rest of leaf - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: lookup - B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) && - ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: UNION - case CV_LeafKind_UNION: - { - // rjf: unpack leaf - CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first; - U8 *numeric_ptr = (U8 *)(lf_union + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: has fwd ref flag -> lookup itype that this itype resolves tos - if(lf_union->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = (((lf_union->props & CV_TypeProp_Scoped) != 0) && - ((lf_union->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - // rjf: unpack leaf - CV_LeafEnum *lf_enum = (CV_LeafEnum*)itype_leaf_first; - U8 *name_ptr = (U8 *)(lf_enum + 1); - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - U8 *unique_name_ptr = name_ptr + name.size + 1; - String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl); - - // rjf: has fwd ref flag -> lookup itype that this itype resolves to - if(lf_enum->props & CV_TypeProp_FwdRef) - { - B32 do_unique_name_lookup = (((lf_enum->props & CV_TypeProp_Scoped) != 0) && - ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0)); - itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup); - } - }break; - } - } - - //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map - if(itype_fwd != 0 && itype_fwd < tpi_leaf->itype_opl) - { - itype_fwd_map[itype] = itype_fwd; - } - } - } - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 2: produce per-itype itype chain - // - // this pass is to ensure that subsequent passes always produce types for - // dependent itypes first - guaranteeing rdi's "only reference backward" - // rule (which eliminates cycles). each itype slot gets a list of itypes, - // starting with the deepest dependency - when types are produced per-itype, - // this chain is walked, so that deeper dependencies are built first, and - // as such, always show up *earlier* in the actually built types. - // - P2R_TypeIdChain **itype_chains = 0; - ProfScope("types pass 2: produce per-itype itype chain (for producing dependent types first)") - { - //- rjf: allocate itype chain table - if(lane_idx() == 0) - { - itype_chains = push_array(scratch.arena, P2R_TypeIdChain *, (U64)itype_opl); - } - lane_sync_u64(&itype_chains, 0); - - //- rjf: do wide fill - if(params->subset_flags & RDIM_SubsetFlag_Types) - { - Rng1U64 range = lane_range(itype_opl); - for EachInRange(idx, range) - { - CV_TypeId itype = (CV_TypeId)idx; - - //- rjf: push initial itype - should be final-visited-itype for this itype - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = itype; - SLLStackPush(itype_chains[itype], c); - } - - //- rjf: skip basic types for dependency walk - if(itype < tpi_leaf->itype_first) - { - continue; - } - - //- rjf: walk dependent types, push to chain - Temp scratch2 = scratch_begin(&scratch.arena, 1); - P2R_TypeIdChain start_walk_task = {0, itype}; - P2R_TypeIdChain *first_walk_task = &start_walk_task; - P2R_TypeIdChain *last_walk_task = &start_walk_task; - for(P2R_TypeIdChain *walk_task = first_walk_task; - walk_task != 0; - walk_task = walk_task->next) - { - CV_TypeId walk_itype = itype_fwd_map[walk_task->itype] ? itype_fwd_map[walk_task->itype] : walk_task->itype; - if(walk_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= walk_itype) - { - continue; - } - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[walk_itype-tpi_leaf->itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= tpi_leaf->data.size && - range->off+2+header_struct_size <= tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) - { - default:{}break; - - //- rjf: MODIFIER - case CV_LeafKind_MODIFIER: - { - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: POINTER - case CV_LeafKind_POINTER: - { - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: PROCEDURE - case CV_LeafKind_PROCEDURE: - { - CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; - - // rjf: push return itypes to chain - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk return itype - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-tpi_leaf->itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: push arg types to chain - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk arg types - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: MFUNCTION - case CV_LeafKind_MFUNCTION: - { - CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLStackPush(itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLStackPush(itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->this_itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->ret_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->arg_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->this_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-tpi_leaf->itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: push arg types to chain - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk arg types - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = arglist_itypes_base[idx]; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: BITFIELD - case CV_LeafKind_BITFIELD: - { - CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; - - // rjf: push dependent itype to chain - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itype - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: ARRAY - case CV_LeafKind_ARRAY: - { - CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->entry_itype; - SLLStackPush(itype_chains[itype], c); - } - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->index_itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->entry_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->index_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; - - // rjf: push dependent itypes to chain - { - P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1); - c->itype = lf->base_itype; - SLLStackPush(itype_chains[itype], c); - } - - // rjf: push task to walk dependency itypes - { - P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1); - c->itype = lf->base_itype; - SLLQueuePush(first_walk_task, last_walk_task, c); - } - }break; - } - } - } - scratch_end(scratch2); - } - } - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 3: gather all unique namespaces from types - // - P2R_NamespaceNode **all_namespace_slots = 0; - U64 all_namespace_slots_count = 0; - ProfScope("gather all unique namespaces from types") - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - //- rjf: find all unique namespaces on this lane - U64 namespace_slots_count = (U64)itype_opl / lane_count(); - namespace_slots_count = Max(1, namespace_slots_count); - String8Node **namespace_slots = push_array(scratch2.arena, String8Node *, namespace_slots_count); - U64 namespace_count = 0; - Rng1U64 range = lane_range(itype_opl); - for EachInRange(idx, range) - { - CV_TypeId itype = (CV_TypeId)idx; - if(itype < itype_first) { continue; } - - // rjf: unpack itype info - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - - // rjf: gather names from types - String8 name = {0}; - if(range->off+range->hdr.size <= tpi_leaf->data.size && - range->off+2+header_struct_size <= tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) - { - default:{}break; - - //- rjf: CLASS/STRUCT - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first; - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; - name = str8_cstring_capped(name_ptr, itype_leaf_opl); - }break; - - //- rjf: CLASS2/STRUCT2 - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first; - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; - name = str8_cstring_capped(name_ptr, itype_leaf_opl); - }break; - - //- rjf: UNION - case CV_LeafKind_UNION: - { - CV_LeafUnion *lf_struct = (CV_LeafUnion *)itype_leaf_first; - U8 *numeric_ptr = (U8 *)(lf_struct + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size; - name = str8_cstring_capped(name_ptr, itype_leaf_opl); - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - CV_LeafEnum *lf_enum = (CV_LeafEnum *)itype_leaf_first; - U8 *name_ptr = (U8 *)(lf_enum+1); - name = str8_cstring_capped(name_ptr, itype_leaf_opl); - }break; - - //- rjf: ALIAS - case CV_LeafKind_ALIAS: - { - CV_LeafAlias *lf = (CV_LeafAlias *)itype_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - name = str8_cstring_capped(name_ptr, itype_leaf_opl); - }break; - } - } - - // rjf: add namespaces from strings - String8 name_before_templates = str8_prefix(name, str8_find_needle(name, 0, str8_lit("<"), 0)); - for(U64 scope_resolution_operator_pos = 0; - scope_resolution_operator_pos < name_before_templates.size; - scope_resolution_operator_pos = str8_find_needle(name_before_templates, scope_resolution_operator_pos+1, str8_lit("::"), 0)) - { - String8 namespace_fully_qualified_name = str8_substr(name_before_templates, r1u64(0, scope_resolution_operator_pos)); - if(namespace_fully_qualified_name.size != 0) - { - namespace_count += 1; - U64 hash = u64_hash_from_str8(namespace_fully_qualified_name); - U64 slot_idx = hash%namespace_slots_count; - B32 already_exists = 0; - for(String8Node *n = namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->string, namespace_fully_qualified_name, 0)) - { - already_exists = 1; - break; - } - } - if(!already_exists) - { - String8Node *node = push_array(scratch2.arena, String8Node, 1); - SLLStackPush(namespace_slots[slot_idx], node); - node->string = namespace_fully_qualified_name; - } - } - } - } - - //- rjf: on lane 0 -> combine all unique namespaces to singular map - { - // rjf: gather lane maps - typedef struct LaneNamespaceTable LaneNamespaceTable; - struct LaneNamespaceTable - { - String8Node **slots; - U64 slots_count; - }; - U64 total_namespace_count = 0; - U64 *total_namespace_count_ptr = &total_namespace_count; - LaneNamespaceTable *lane_namespace_tables = 0; - if(lane_idx() == 0) - { - lane_namespace_tables = push_array(scratch2.arena, LaneNamespaceTable, lane_count()); - } - lane_sync_u64(&total_namespace_count_ptr, 0); - lane_sync_u64(&lane_namespace_tables, 0); - lane_namespace_tables[lane_idx()].slots = namespace_slots; - lane_namespace_tables[lane_idx()].slots_count = namespace_slots_count; - ins_atomic_u64_add_eval(total_namespace_count_ptr, namespace_count); - lane_sync(); - - // rjf: combine - if(lane_idx() == 0) - { - all_namespace_slots_count = *total_namespace_count_ptr / 3; - all_namespace_slots_count = Max(all_namespace_slots_count, 1); - all_namespace_slots = push_array(scratch.arena, P2R_NamespaceNode *, all_namespace_slots_count); - for EachIndex(l_idx, lane_count()) - { - LaneNamespaceTable *tbl = &lane_namespace_tables[l_idx]; - for EachIndex(slot_idx, tbl->slots_count) - { - for(String8Node *n = tbl->slots[slot_idx]; n != 0; n = n->next) - { - U64 hash = u64_hash_from_str8(n->string); - U64 dst_slot_idx = hash%all_namespace_slots_count; - B32 already_exists = 0; - for(P2R_NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) - { - if(str8_match(dst_n->string, n->string, 0)) - { - already_exists = 1; - break; - } - } - if(!already_exists) - { - P2R_NamespaceNode *dst_n = push_array(scratch.arena, P2R_NamespaceNode, 1); - dst_n->string = n->string; - SLLStackPush(all_namespace_slots[dst_slot_idx], dst_n); - } - } - } - } - } - lane_sync_u64(&all_namespace_slots_count, 0); - lane_sync_u64(&all_namespace_slots, 0); - } - scratch_end(scratch2); - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: types pass 4: construct all types from TPI - // - // this doesn't gather struct/class/union/enum members, which is done by - // subsequent passes, to build RDI "UDT" information, which is distinct - // from regular type info. - // - RDIM_TypeChunkList all_types__pre_typedefs = {0}; - RDIM_TypeChunkList *all_types__pre_typedefs_ptr = &all_types__pre_typedefs; - RDIM_Type **itype_type_ptrs = 0; - RDIM_Type **basic_type_ptrs = 0; - if(lane_idx() == 0) ProfScope("types pass 4: construct all root/stub types from TPI") - { -#define p2r_builtin_type_ptr_from_kind(kind) ((basic_type_ptrs && RDI_TypeKind_FirstBuiltIn <= (kind) && (kind) <= RDI_TypeKind_LastBuiltIn) ? (basic_type_ptrs[(kind) - RDI_TypeKind_FirstBuiltIn]) : 0) -#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) - itype_type_ptrs = push_array(scratch.arena, RDIM_Type *, (U64)(itype_opl)); - basic_type_ptrs = push_array(scratch.arena, RDIM_Type *, (RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1)); - - //////////////////////////// - //- rjf: build basic types - // - if(params->subset_flags & RDIM_SubsetFlag_Types) - { - for(RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; - type_kind <= RDI_TypeKind_LastBuiltIn; - type_kind += 1) - { - RDIM_Type *type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, 512); - type->name.str = rdi_string_from_type_kind(type_kind, &type->name.size); - type->kind = type_kind; - type->byte_size = rdi_size_from_basic_type_kind(type_kind); - basic_type_ptrs[type_kind - RDI_TypeKind_FirstBuiltIn] = type; - } - } - - //////////////////////////// - //- rjf: build basic type aliases - // - if(params->subset_flags & RDIM_SubsetFlag_Types) - { - RDIM_DataModel data_model = rdim_data_model_from_os_arch(OperatingSystem_Windows, arch); - RDI_TypeKind short_type = rdim_short_type_kind_from_data_model(data_model); - RDI_TypeKind ushort_type = rdim_unsigned_short_type_kind_from_data_model(data_model); - RDI_TypeKind long_type = rdim_long_type_kind_from_data_model(data_model); - RDI_TypeKind ulong_type = rdim_unsigned_long_type_kind_from_data_model(data_model); - RDI_TypeKind long_long_type = rdim_long_long_type_kind_from_data_model(data_model); - RDI_TypeKind ulong_long_type = rdim_unsigned_long_long_type_kind_from_data_model(data_model); - RDI_TypeKind ptr_type = rdim_pointer_size_t_type_kind_from_data_model(data_model); - struct - { - char * name; - RDI_TypeKind kind_rdi; - CV_LeafKind kind_cv; - } - table[] = - { - { "signed char" , RDI_TypeKind_Char8 , CV_BasicType_CHAR }, - { "short" , short_type , CV_BasicType_SHORT }, - { "long" , long_type , CV_BasicType_LONG }, - { "long long" , long_long_type , CV_BasicType_QUAD }, - { "__int128" , RDI_TypeKind_S128 , CV_BasicType_OCT }, // Clang type - { "unsigned char" , RDI_TypeKind_UChar8 , CV_BasicType_UCHAR }, - { "unsigned short" , ushort_type , CV_BasicType_USHORT }, - { "unsigned long" , ulong_type , CV_BasicType_ULONG }, - { "unsigned long long" , ulong_long_type , CV_BasicType_UQUAD }, - { "__uint128" , RDI_TypeKind_U128 , CV_BasicType_UOCT }, // Clang type - { "bool" , RDI_TypeKind_S8 , CV_BasicType_BOOL8 }, - { "__bool16" , RDI_TypeKind_S16 , CV_BasicType_BOOL16 }, // not real C type - { "__bool32" , RDI_TypeKind_S32 , CV_BasicType_BOOL32 }, // not real C type - { "float" , RDI_TypeKind_F32 , CV_BasicType_FLOAT32 }, - { "double" , RDI_TypeKind_F64 , CV_BasicType_FLOAT64 }, - { "long double" , RDI_TypeKind_F80 , CV_BasicType_FLOAT80 }, - { "__float128" , RDI_TypeKind_F128 , CV_BasicType_FLOAT128 }, // Clang type - { "__float48" , RDI_TypeKind_F48 , CV_BasicType_FLOAT48 }, // not real C type - { "__float32pp" , RDI_TypeKind_F32PP , CV_BasicType_FLOAT32PP }, // not real C type - { "__float16" , RDI_TypeKind_F16 , CV_BasicType_FLOAT16 }, - { "_Complex float" , RDI_TypeKind_ComplexF32 , CV_BasicType_COMPLEX32 }, - { "_Complex double" , RDI_TypeKind_ComplexF64 , CV_BasicType_COMPLEX64 }, - { "_Complex long double" , RDI_TypeKind_ComplexF80 , CV_BasicType_COMPLEX80 }, - { "_Complex __float128" , RDI_TypeKind_ComplexF128, CV_BasicType_COMPLEX128 }, - { "__int8" , RDI_TypeKind_S8 , CV_BasicType_INT8 }, - { "__uint8" , RDI_TypeKind_U8 , CV_BasicType_UINT8 }, - { "__int16" , RDI_TypeKind_S16 , CV_BasicType_INT16 }, - { "__uint16" , RDI_TypeKind_U16 , CV_BasicType_UINT16 }, - { "int" , RDI_TypeKind_S32 , CV_BasicType_INT32 }, - { "int32" , RDI_TypeKind_S32 , CV_BasicType_INT32 }, - { "uint32" , RDI_TypeKind_U32 , CV_BasicType_UINT32 }, - { "__int64" , RDI_TypeKind_S64 , CV_BasicType_INT64 }, - { "__uint64" , RDI_TypeKind_U64 , CV_BasicType_UINT64 }, - { "__int128" , RDI_TypeKind_S128 , CV_BasicType_INT128 }, - { "__uint128" , RDI_TypeKind_U128 , CV_BasicType_UINT128 }, - { "char" , RDI_TypeKind_Char8 , CV_BasicType_RCHAR }, // always ASCII - { "wchar_t" , RDI_TypeKind_UChar16 , CV_BasicType_WCHAR }, // on windows always UTF-16 - { "char8_t" , RDI_TypeKind_Char8 , CV_BasicType_CHAR8 }, // always UTF-8 - { "char16_t" , RDI_TypeKind_Char16 , CV_BasicType_CHAR16 }, // always UTF-16 - { "char32_t" , RDI_TypeKind_Char32 , CV_BasicType_CHAR32 }, // always UTF-32 - { "__pointer" , ptr_type , CV_BasicType_PTR } - }; - for EachElement(idx, table) - { - RDIM_Type *builtin_alias = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, tpi_leaf->itype_opl); - builtin_alias->kind = RDI_TypeKind_Alias; - builtin_alias->name = str8_cstring(table[idx].name); - builtin_alias->direct_type = p2r_builtin_type_ptr_from_kind(table[idx].kind_rdi); - builtin_alias->byte_size = rdi_size_from_basic_type_kind(table[idx].kind_rdi); - itype_type_ptrs[table[idx].kind_cv] = builtin_alias; - } - itype_type_ptrs[CV_BasicType_HRESULT] = basic_type_ptrs[RDI_TypeKind_HResult - RDI_TypeKind_FirstBuiltIn]; - itype_type_ptrs[CV_BasicType_VOID] = basic_type_ptrs[RDI_TypeKind_Void - RDI_TypeKind_FirstBuiltIn]; - } - - //////////////////////////// - //- rjf: build types from TPI - // - if(params->subset_flags & RDIM_SubsetFlag_Types) - { - for(CV_TypeId root_itype = 0; root_itype < itype_opl; root_itype += 1) - { - for(P2R_TypeIdChain *itype_chain = itype_chains[root_itype]; - itype_chain != 0; - itype_chain = itype_chain->next) - { - CV_TypeId itype = (root_itype != itype_chain->itype && itype_chain->itype < itype_opl && itype_fwd_map[itype_chain->itype]) ? itype_fwd_map[itype_chain->itype] : itype_chain->itype; - B32 itype_is_basic = (itype < tpi->itype_first); - - ////////////////////////// - //- rjf: skip forward-reference itypes - all future resolutions will - // reference whatever this itype resolves to, and so there is no point - // in filling out this slot - // - if(itype_fwd_map[root_itype] != 0) - { - continue; - } - - ////////////////////////// - //- rjf: skip already produced dependencies - // - if(itype_type_ptrs[itype] != 0) - { - continue; - } - - ////////////////////////// - //- rjf: build basic type - // - if(itype_is_basic) - { - RDIM_Type *dst_type = 0; - - // rjf: unpack itype - CV_BasicPointerKind cv_basic_ptr_kind = CV_BasicPointerKindFromTypeId(itype); - CV_BasicType cv_basic_type_code = CV_BasicTypeFromTypeId(itype); - - // rjf: get basic type slot, fill if unfilled - RDIM_Type *basic_type = itype_type_ptrs[cv_basic_type_code]; - if(basic_type == 0) - { - RDI_TypeKind type_kind = p2r_rdi_type_kind_from_cv_basic_type(cv_basic_type_code); - U32 byte_size = rdi_size_from_basic_type_kind(type_kind); - basic_type = dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - if(byte_size == 0xffffffff) - { - byte_size = arch_addr_size; - } - basic_type->kind = type_kind; - basic_type->name = cv_type_name_from_basic_type(cv_basic_type_code); - basic_type->byte_size = byte_size; - } - - // rjf: nonzero ptr kind -> form ptr type to basic tpye - if(cv_basic_ptr_kind != 0) - { - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Ptr; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = basic_type; - } - - // rjf: fill this itype's slot with the finished type - itype_type_ptrs[itype] = dst_type; - } - - ////////////////////////// - //- rjf: build non-basic type - // - if(!itype_is_basic && itype >= itype_first) - { - RDIM_Type *dst_type = 0; - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - if(range->off+range->hdr.size <= tpi_leaf->data.size && - range->off+2+header_struct_size <= tpi_leaf->data.size && - range->hdr.size >= 2) - { - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - switch(kind) - { - //- rjf: MODIFIER - case CV_LeafKind_MODIFIER: - { - // rjf: unpack leaf - CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first; - - // rjf: cv -> rdi flags - RDI_TypeModifierFlags flags = 0; - if(lf->flags & CV_ModifierFlag_Const) {flags |= RDI_TypeModifierFlag_Const;} - if(lf->flags & CV_ModifierFlag_Volatile) {flags |= RDI_TypeModifierFlag_Volatile;} - - // rjf: fill type - if(flags == 0) - { - dst_type = p2r_type_ptr_from_itype(lf->itype); - } - else - { - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Modifier; - dst_type->flags = flags; - dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype); - dst_type->byte_size = dst_type->direct_type ? dst_type->direct_type->byte_size : 0; - } - }break; - - //- rjf: POINTER - case CV_LeafKind_POINTER: - { - // TODO(rjf): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead - - // rjf: unpack leaf - CV_LeafPointer *lf = (CV_LeafPointer *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); - CV_PointerKind ptr_kind = CV_PointerAttribs_Extract_Kind(lf->attribs); - CV_PointerMode ptr_mode = CV_PointerAttribs_Extract_Mode(lf->attribs); - U32 ptr_size = CV_PointerAttribs_Extract_Size(lf->attribs); - - // rjf: cv -> rdi modifier flags - RDI_TypeModifierFlags modifier_flags = 0; - if(lf->attribs & CV_PointerAttrib_Const) {modifier_flags |= RDI_TypeModifierFlag_Const;} - if(lf->attribs & CV_PointerAttrib_Volatile) {modifier_flags |= RDI_TypeModifierFlag_Volatile;} - if(lf->attribs & CV_PointerAttrib_Restricted) {modifier_flags |= RDI_TypeModifierFlag_Restrict;} - - // rjf: cv info -> rdi pointer type kind - RDI_TypeKind type_kind = RDI_TypeKind_Ptr; - { - if(lf->attribs & CV_PointerAttrib_LRef) - { - type_kind = RDI_TypeKind_LRef; - } - else if(lf->attribs & CV_PointerAttrib_RRef) - { - type_kind = RDI_TypeKind_RRef; - } - if(ptr_mode == CV_PointerMode_LRef) - { - type_kind = RDI_TypeKind_LRef; - } - else if(ptr_mode == CV_PointerMode_RRef) - { - type_kind = RDI_TypeKind_RRef; - } - } - - // rjf: fill type - if(modifier_flags != 0) - { - RDIM_Type *pointer_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Modifier; - dst_type->flags = modifier_flags; - dst_type->direct_type = pointer_type; - dst_type->byte_size = arch_addr_size; - pointer_type->kind = type_kind; - pointer_type->byte_size = arch_addr_size; - pointer_type->direct_type = direct_type; - } - else - { - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = type_kind; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = direct_type; - } - }break; - - //- rjf: PROCEDURE - case CV_LeafKind_PROCEDURE: - { - // TODO(rjf): handle call_kind & attribs - - // rjf: unpack leaf - CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first; - RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); - - // rjf: fill type's basics - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Function; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = ret_type; - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: count non-zero arguments - U32 arglist_itypes_nonzero_count = 0; - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - if(arglist_itypes_base[idx] != 0) - { - arglist_itypes_nonzero_count += 1; - } - } - - // rjf: build param type array - RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_nonzero_count); - { - U64 dst_idx = 0; - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - if(arglist_itypes_base[idx] != 0) - { - params[dst_idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); - dst_idx += 1; - } - } - } - - // rjf: fill dst type - dst_type->count = arglist_itypes_nonzero_count; - dst_type->param_types = params; - }break; - - //- rjf: MFUNCTION - case CV_LeafKind_MFUNCTION: - { - // TODO(rjf): handle call_kind & attribs - // TODO(rjf): preserve "this_adjust" - - // rjf: unpack leaf - CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first; - RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = (lf->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function; - dst_type->byte_size = arch_addr_size; - dst_type->direct_type = ret_type; - - // rjf: unpack arglist range - CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first]; - if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST || - arglist_range->hdr.size<2 || - arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size) - { - break; - } - U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2; - U8 *arglist_opl = arglist_first+arglist_range->hdr.size-2; - if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl) - { - break; - } - - // rjf: unpack arglist info - CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first; - CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1); - U32 arglist_itypes_count = arglist->count; - - // rjf: build param type array - U64 num_this_extras = 1; - if(lf->this_itype == 0) - { - num_this_extras = 0; - } - RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count+num_this_extras); - for(U32 idx = 0; idx < arglist_itypes_count; idx += 1) - { - params[idx+num_this_extras] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]); - } - if(lf->this_itype != 0) - { - params[0] = p2r_type_ptr_from_itype(lf->this_itype); - } - - // rjf: fill dst type - dst_type->count = arglist_itypes_count+num_this_extras; - dst_type->param_types = params; - }break; - - //- rjf: BITFIELD - case CV_LeafKind_BITFIELD: - { - // rjf: unpack leaf - CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Bitfield; - dst_type->off = lf->pos; - dst_type->count = lf->len; - dst_type->byte_size = direct_type?direct_type->byte_size:0; - dst_type->direct_type = direct_type; - }break; - - //- rjf: ARRAY - case CV_LeafKind_ARRAY: - { - // rjf: unpack leaf - CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->entry_itype); - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 full_size = cv_u64_from_numeric(&array_count); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Array; - dst_type->direct_type = direct_type; - dst_type->byte_size = full_size; - dst_type->count = (direct_type && direct_type->byte_size) ? (dst_type->byte_size/direct_type->byte_size) : 0; - }break; - - //- rjf: CLASS/STRUCTURE - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - if(lf->props & CV_TypeProp_FwdRef) - { - dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); - dst_type->name = name; - } - else - { - dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct); - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - }break; - - //- rjf: CLASS2/STRUCT2 - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - if(lf->props & CV_TypeProp_FwdRef) - { - dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct); - dst_type->name = name; - } - else - { - dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct); - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - }break; - - //- rjf: alias - case CV_LeafKind_ALIAS: - { - // rjf: unpack leaf - CV_LeafAlias *lf = (CV_LeafAlias *)itype_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - dst_type->kind = RDI_TypeKind_Alias; - dst_type->name = name; - dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype); - if(dst_type->direct_type != 0) - { - dst_type->byte_size = dst_type->direct_type->byte_size; - } - }break; - - //- rjf: UNION - case CV_LeafKind_UNION: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U64 size_u64 = cv_u64_from_numeric(&size); - U8 *name_ptr = numeric_ptr + size.encoded_size; - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - if(lf->props & CV_TypeProp_FwdRef) - { - dst_type->kind = RDI_TypeKind_IncompleteUnion; - dst_type->name = name; - } - else - { - dst_type->kind = RDI_TypeKind_Union; - dst_type->byte_size = (U32)size_u64; - dst_type->name = name; - } - }break; - - //- rjf: ENUM - case CV_LeafKind_ENUM: - { - // TODO(rjf): handle props - - // rjf: unpack leaf - CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; - RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->base_itype); - U8 *name_ptr = (U8 *)(lf + 1); - String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl); - - // rjf: fill type - dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl); - if(lf->props & CV_TypeProp_FwdRef) - { - dst_type->kind = RDI_TypeKind_IncompleteEnum; - dst_type->name = name; - } - else - { - dst_type->kind = RDI_TypeKind_Enum; - dst_type->direct_type = direct_type; - dst_type->byte_size = direct_type ? direct_type->byte_size : 0; - dst_type->name = name; - } - }break; - } - } - - //- rjf: store finalized type to this itype's slot - itype_type_ptrs[itype] = dst_type; - } - } - } - } -#undef p2r_type_ptr_from_itype -#undef p2r_builtin_type_ptr_from_kind - } - lane_sync_u64(&itype_type_ptrs, 0); - lane_sync_u64(&basic_type_ptrs, 0); - lane_sync_u64(&all_types__pre_typedefs_ptr, 0); - all_types__pre_typedefs = *all_types__pre_typedefs_ptr; - - ////////////////////////////////////////////////////////////// - //- rjf: set bit in all namespace nodes that correspond to scopes - // - if(params->subset_flags & (RDIM_SubsetFlag_Procedures| - RDIM_SubsetFlag_GlobalVariables| - RDIM_SubsetFlag_ThreadVariables| - RDIM_SubsetFlag_Scopes| - RDIM_SubsetFlag_Locals| - RDIM_SubsetFlag_GlobalVariableNameMap| - RDIM_SubsetFlag_ThreadVariableNameMap| - RDIM_SubsetFlag_ProcedureNameMap| - RDIM_SubsetFlag_ConstantNameMap| - RDIM_SubsetFlag_LinkNameProcedureNameMap| - RDIM_SubsetFlag_Types)) - ProfScope("determine which namespace nodes correspond to scopes") - { - U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; - lane_sync_u64(&sym_take_counter, 0); - for(;;) - { - U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) - { - break; - } - CV_SymParsed *sym = all_syms[sym_idx]; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; - String8 name = str8_cstring_capped(proc32+1, iter.opl); - U64 hash = u64_hash_from_str8(name); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->string, name, 0)) - { - ins_atomic_u32_eval_assign(&n->corresponds_to_scope, 1); - break; - } - } - }break; - } - } - } - } - - ////////////////////////////////////////////////////////////// - //- rjf: gather all namespaces which are only encoded in symbols (not found in types) - // - if(params->subset_flags & (RDIM_SubsetFlag_Procedures| - RDIM_SubsetFlag_GlobalVariables| - RDIM_SubsetFlag_ThreadVariables| - RDIM_SubsetFlag_Scopes| - RDIM_SubsetFlag_Locals| - RDIM_SubsetFlag_GlobalVariableNameMap| - RDIM_SubsetFlag_ThreadVariableNameMap| - RDIM_SubsetFlag_ProcedureNameMap| - RDIM_SubsetFlag_ConstantNameMap| - RDIM_SubsetFlag_LinkNameProcedureNameMap| - RDIM_SubsetFlag_Types)) - ProfScope("gather all namespaces which are only encoded in symbols (not found in types)") - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - U64 lane_namespace_slots_count = 4096; - String8Node **lane_namespace_slots = push_array(scratch2.arena, String8Node *, lane_namespace_slots_count); - - //- rjf: gather from syms - U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch2.arena, U64, 1) : 0; - lane_sync_u64(&sym_take_counter, 0); - for(;;) - { - U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) - { - break; - } - CV_SymParsed *sym = all_syms[sym_idx]; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - // rjf: get global symbol name - String8 symbol_name = {0}; - switch(iter.kind) - { - default:{}break; - case CV_SymKind_GDATA32: - { - CV_SymData32 *data32 = (CV_SymData32 *)iter.struct_base; - symbol_name = str8_cstring_capped(data32+1, iter.opl); - }break; - case CV_SymKind_GPROC32: - { - CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; - symbol_name = str8_cstring_capped(proc32+1, iter.opl); - }break; - case CV_SymKind_GTHREAD32: - { - CV_SymThread32 *thread32 = (CV_SymThread32 *)iter.struct_base; - symbol_name = str8_cstring_capped(thread32+1, iter.opl); - }break; - } - - // rjf: symbol name -> container name - String8 container_name = str8_chop(str8_prefix(symbol_name, p2r_end_of_cplusplus_container_name(symbol_name)), 2); - - // rjf: non-empty container name -> gather - if(container_name.size != 0) - { - U64 container_name_hash = u64_hash_from_str8(container_name); - - // rjf: first, check if this container already showed up from type info - B32 already_exists = 0; - if(!already_exists) - { - U64 slot_idx = container_name_hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->string, container_name, 0)) - { - already_exists = 1; - break; - } - } - } - - // rjf: next, check if we've already gathered this namespace for this lane - if(!already_exists) - { - U64 slot_idx = container_name_hash%lane_namespace_slots_count; - for(String8Node *n = lane_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->string, container_name, 0)) - { - already_exists = 1; - break; - } - } - } - - // rjf: if we didn't find this namespace in either those from types, or already found in this lane, then gather - if(!already_exists) - { - U64 slot_idx = container_name_hash%lane_namespace_slots_count; - String8Node *n = push_array(scratch2.arena, String8Node, 1); - SLLStackPush(lane_namespace_slots[slot_idx], n); - n->string = container_name; - } - } - } - } - lane_sync(); - - //- rjf: combine + fold into the all_namespaces table - { - // rjf: gather lane maps - typedef struct LaneNamespaceTable LaneNamespaceTable; - struct LaneNamespaceTable - { - String8Node **slots; - U64 slots_count; - }; - LaneNamespaceTable *lane_namespace_tables = 0; - if(lane_idx() == 0) - { - lane_namespace_tables = push_array(scratch2.arena, LaneNamespaceTable, lane_count()); - } - lane_sync_u64(&lane_namespace_tables, 0); - lane_namespace_tables[lane_idx()].slots = lane_namespace_slots; - lane_namespace_tables[lane_idx()].slots_count = lane_namespace_slots_count; - lane_sync(); - - // rjf: combine - if(lane_idx() == 0) - { - for EachIndex(l_idx, lane_count()) - { - LaneNamespaceTable *tbl = &lane_namespace_tables[l_idx]; - for EachIndex(slot_idx, tbl->slots_count) - { - for(String8Node *n = tbl->slots[slot_idx]; n != 0; n = n->next) - { - U64 hash = u64_hash_from_str8(n->string); - U64 dst_slot_idx = hash%all_namespace_slots_count; - B32 already_exists = 0; - for(P2R_NamespaceNode *dst_n = all_namespace_slots[dst_slot_idx]; dst_n != 0; dst_n = dst_n->next) - { - if(str8_match(dst_n->string, n->string, 0)) - { - already_exists = 1; - break; - } - } - if(!already_exists) - { - P2R_NamespaceNode *dst_n = push_array(scratch.arena, P2R_NamespaceNode, 1); - dst_n->string = n->string; - SLLStackPush(all_namespace_slots[dst_slot_idx], dst_n); - } - } - } - } - } - } - lane_sync(); - scratch_end(scratch2); - } - - ////////////////////////////////////////////////////////////// - //- rjf: upgrade namespace nodes with type info, if they match a type - // - ProfScope("upgrade namespace nodes with type info, if they match a type") - { -#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) - Rng1U64 range = lane_range(all_namespace_slots_count); - for EachInRange(slot_idx, range) - { - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - String8 container_string = n->string; - CV_TypeId container_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_string, 0); - if(container_type_id != 0) - { - n->type = p2r_type_ptr_from_itype(container_type_id); - } - } - } -#undef p2r_type_ptr_from_itype - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: build namespaces, that are not scopes, nor types - // - RDIM_NamespaceChunkList all_namespaces = {0}; - { - // rjf: gather all per-lane namespaces - RDIM_NamespaceChunkList lane_namespaces = {0}; - Rng1U64 range = lane_range(all_namespace_slots_count); - for EachInRange(slot_idx, range) - { - Temp scratch = scratch_begin(&arena, 1); - - // rjf: gather nodes, sort - U64 node_count = 0; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) { node_count += 1; } - P2R_NamespaceNode **nodes = push_array(scratch.arena, P2R_NamespaceNode *, node_count); - { - U64 idx = 0; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next, idx += 1) - { - nodes[idx] = n; - } - } - radsort(nodes, node_count, p2r_namespace_node_is_before); - - // rjf: build namespaces for this slot - for EachIndex(node_in_slot_idx, node_count) - { - P2R_NamespaceNode *n = nodes[node_in_slot_idx]; - if(n->corresponds_to_scope || n->scope != 0 || n->type != 0) { continue; } - String8 string = n->string; - RDIM_Namespace *ns = rdim_namespace_chunk_list_push(arena, &lane_namespaces, 32); - ns->name = string; - n->ns = ns; - } - - scratch_end(scratch); - } - - // rjf: combine all per-lane namespaces - RDIM_NamespaceChunkList *lanes_namespaces = 0; - if(lane_idx() == 0) - { - lanes_namespaces = push_array(scratch.arena, RDIM_NamespaceChunkList, lane_count()); - } - lane_sync_u64(&lanes_namespaces, 0); - lanes_namespaces[lane_idx()] = lane_namespaces; - lane_sync(); - - // rjf: join all per-lane namespaces - RDIM_NamespaceChunkList *all_namespaces_ptr = &all_namespaces; - lane_sync_u64(&all_namespaces_ptr, 0); - if(lane_idx() == 0) - { - for EachIndex(l_idx, lane_count()) - { - rdim_namespace_chunk_list_concat_in_place(all_namespaces_ptr, &lanes_namespaces[l_idx]); - } - } - lane_sync(); - all_namespaces = *all_namespaces_ptr; - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: convert symbols from all units - // - typedef struct ScopeNamespaceNode ScopeNamespaceNode; - struct ScopeNamespaceNode - { - ScopeNamespaceNode *next; - String8 string; - RDIM_Scope *scope; - }; - typedef struct ScopeNamespaceList ScopeNamespaceList; - struct ScopeNamespaceList - { - ScopeNamespaceNode *first; - ScopeNamespaceNode *last; - }; - RDIM_TypeChunkList *syms_typedefs = 0; - ScopeNamespaceList *syms_scopes_that_are_namespaces = 0; - ProfScope("produce symbols from all streams") - { -#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) - - //////////////////////////// - //- rjf: set up - // - if(lane_idx() == 0) - { - syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); - syms_scopes_that_are_namespaces = push_array(arena, ScopeNamespaceList, all_syms_count); - } - lane_sync_u64(&syms_typedefs, 0); - lane_sync_u64(&syms_scopes_that_are_namespaces, 0); - - //////////////////////////// - //- rjf: fill outputs for all unit sym blocks in this lane - // - if(params->subset_flags & (RDIM_SubsetFlag_Procedures| - RDIM_SubsetFlag_GlobalVariables| - RDIM_SubsetFlag_ThreadVariables| - RDIM_SubsetFlag_Scopes| - RDIM_SubsetFlag_Locals| - RDIM_SubsetFlag_GlobalVariableNameMap| - RDIM_SubsetFlag_ThreadVariableNameMap| - RDIM_SubsetFlag_ProcedureNameMap| - RDIM_SubsetFlag_ConstantNameMap| - RDIM_SubsetFlag_LinkNameProcedureNameMap| - RDIM_SubsetFlag_Types)) - { - U64 *sym_take_counter = lane_idx() == 0 ? push_array(scratch.arena, U64, 1) : 0; - lane_sync_u64(&sym_take_counter, 0); - for(;;) - { - //- rjf: take next sym - U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) - { - break; - } - - //- rjf: unpack sym - Temp scratch = scratch_begin(&arena, 1); - CV_SymParsed *sym = all_syms[sym_idx]; - RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; - RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; - RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; - RDIM_SymbolChunkList *sym_thread_variables = &sym_unit->thread_variables; - RDIM_SymbolChunkList *sym_constants = &sym_unit->constants; - RDIM_ScopeChunkList *sym_scopes = &sym_unit->scopes; - RDIM_InlineSiteChunkList *sym_inline_sites = &sym_unit->inline_sites; - RDIM_TypeChunkList *typedefs = &syms_typedefs[sym_idx]; - - ////////////////////////// - //- rjf: symbols pass 0: predict symbol chunk counts by record kinds - // - U64 sym_procedures_chunk_cap = sym->sym_ranges.count/4 + 1; - U64 sym_global_variables_chunk_cap = sym->sym_ranges.count/12 + 1; - U64 sym_thread_variables_chunk_cap = sym->sym_ranges.count/12 + 1; - U64 sym_constants_chunk_cap = sym->sym_ranges.count/6 + 1; - U64 sym_scopes_chunk_cap = sym->sym_ranges.count/4 + 1; - U64 sym_inline_sites_chunk_cap = sym->sym_ranges.count/6 + 1; - ProfScope("symbols pass 0: predict symbol chunk counts by record kinds") - { - U64 procedure_record_count = 0; - U64 global_variable_record_count = 0; - U64 thread_variable_record_count = 0; - U64 constant_record_count = 0; - U64 scope_record_count = 0; - U64 inline_site_record_count = 0; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - case CV_SymKind_THUNK32: - { - procedure_record_count += 1; - scope_record_count += 1; - }break; - case CV_SymKind_BLOCK32: - { - scope_record_count += 1; - }break; - case CV_SymKind_INLINESITE: - { - scope_record_count += 1; - inline_site_record_count += 1; - }break; - case CV_SymKind_LDATA32: - case CV_SymKind_GDATA32: - { - global_variable_record_count += 1; - }break; - case CV_SymKind_CONSTANT: - { - constant_record_count += 1; - }break; - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - { - thread_variable_record_count += 1; - }break; - } - } - sym_procedures_chunk_cap = Max(1, procedure_record_count); - sym_global_variables_chunk_cap = Max(1, global_variable_record_count); - sym_thread_variables_chunk_cap = Max(1, thread_variable_record_count); - sym_constants_chunk_cap = Max(1, constant_record_count); - sym_scopes_chunk_cap = Max(1, scope_record_count); - sym_inline_sites_chunk_cap = Max(1, inline_site_record_count); - } - - ////////////////////////// - //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info) - // - U64 procedure_frameprocs_count = 0; - U64 procedure_frameprocs_cap = sym->sym_ranges.count; - CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap); - ProfScope("symbols pass 1: produce procedure frame info map (procedure -> frame info)") - { - U64 procedure_num = 0; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - - //- rjf: FRAMEPROC - case CV_SymKind_FRAMEPROC: - { - if(procedure_num == 0) { break; } - if(procedure_num > procedure_frameprocs_cap) { break; } - CV_SymFrameproc *frameproc = (CV_SymFrameproc *)iter.struct_base; - procedure_frameprocs[procedure_num-1] = frameproc; - procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num); - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - procedure_num += 1; - }break; - } - } - U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count); - arena_pop(scratch.arena, scratch_overkill); - } - - ////////////////////////// - //- rjf: symbols pass 2: construct all symbols, given procedure frame info map - // - ProfScope("symbols pass 2: construct all symbols, given procedure frame info map") - { - RDIM_Symbol *defrange_target = 0; - U64 procedure_num = 0; - U64 procedure_base_voff = 0; - CV_ProcFlags proc_flags = 0; - U64 regrel_idx = 0; - RDIM_Symbol *curr_proc_symbol = 0; - typedef struct P2R_ScopeNode P2R_ScopeNode; - struct P2R_ScopeNode - { - P2R_ScopeNode *next; - RDIM_Scope *scope; - }; - P2R_ScopeNode *top_scope_node = 0; - P2R_ScopeNode *free_scope_node = 0; - RDIM_LineTable *inline_site_line_table = sym_idx > 0 ? units_first_inline_site_line_tables[sym_idx-1] : 0; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - switch(iter.kind) - { - default:{}break; - - //- rjf: END - case CV_SymKind_END: - { - P2R_ScopeNode *n = top_scope_node; - if(n != 0) - { - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); - } - defrange_target = 0; - }break; - - //- rjf: BLOCK32 - case CV_SymKind_BLOCK32: - { - // rjf: unpack sym - CV_SymBlock32 *block32 = (CV_SymBlock32 *)iter.struct_base; - - // rjf: build scope, insert into current parent scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); - { - if(top_scope_node == 0) - { - // TODO(rjf): log - } - if(top_scope_node != 0) - { - RDIM_Scope *top_scope = top_scope_node->scope; - SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); - scope->parent_scope = top_scope; - scope->symbol = top_scope->symbol; - } - COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= coff_sections.count) ? &coff_sections.v[block32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + block32->off; - U64 voff_last = voff_first + block32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range); - } - } - - // rjf: push this scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = scope; - SLLStackPush(top_scope_node, node); - } - }break; - - //- rjf: LDATA32/GDATA32 - case CV_SymKind_LDATA32: - case CV_SymKind_GDATA32: - { - // rjf: unpack sym - CV_SymData32 *data32 = (CV_SymData32 *)iter.struct_base; - String8 name = str8_cstring_capped(data32+1, iter.opl); - COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= coff_sections.count) ? &coff_sections.v[data32->sec-1] : 0; - U64 voff = (section ? section->voff : 0) + data32->off; - - // rjf: determine if this is an exact duplicate global - // - // PDB likes to have duplicates of these spread across different - // symbol streams so we deduplicate across the entire translation - // context. - // - B32 is_duplicate = 0; - { - // TODO(rjf): @important global symbol dedup - } - - // rjf: is not duplicate -> push new global - if(!is_duplicate) - { - // rjf: unpack global variable's type - RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype); - - // rjf: unpack global's container type - B32 got_container = 0; - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); - if(!got_container && container_name.size != 0) - { - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - got_container = (container_type != 0); - } - - // rjf: unpack global's container scope - RDIM_Scope *container_scope = 0; - if(!got_container && top_scope_node != 0 && iter.kind == CV_SymKind_LDATA32) - { - container_scope = top_scope_node->scope; - got_container = (container_scope != 0); - } - - // rjf: unpack global's container namespace - RDIM_Namespace *container_namespace = 0; - if(!got_container && container_name.size != 0) - { - U64 hash = u64_hash_from_str8(container_name); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(container_name, n->string, 0) && - n->ns != 0) - { - container_namespace = n->ns; - break; - } - } - } - - // rjf: un-namespaceify the symbol name - String8 name__maybe_partially_qualified = name; - if(got_container) - { - name__maybe_partially_qualified = str8_skip(name, container_name_opl); - } - - // rjf: build symbol - RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_global_variables, sym_global_variables_chunk_cap); - symbol->is_extern = (iter.kind == CV_SymKind_GDATA32); - symbol->name = name__maybe_partially_qualified; - symbol->type = type; - symbol->container_scope = container_scope; - symbol->container_type = container_type; - symbol->container_namespace = container_namespace; - RDIM_Location loc = {.kind = RDI_LocationKind_ModuleOff, .offset = voff}; - RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; - rdim_location_case_list_push(arena, &symbol->location_cases, loc, range); - } - }break; - - //- rjf: UDT (typedefs) - case CV_SymKind_UDT: - if(sym == all_syms[0] && top_scope_node == 0) - { - if(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs|RDIM_SubsetFlag_TypeNameMap)) - { - CV_SymUDT *udt = (CV_SymUDT *)iter.struct_base; - String8 name = str8_cstring_capped(udt+1, iter.opl); - RDIM_Type *type = rdim_type_chunk_list_push(arena, typedefs, 4096); - type->kind = RDI_TypeKind_Alias; - type->name = name; - type->direct_type = p2r_type_ptr_from_itype(udt->itype); - if(type->direct_type != 0) - { - type->byte_size = type->direct_type->byte_size; - } - } - }break; - - //- rjf: LPROC32/GPROC32 - case CV_SymKind_LPROC32: - case CV_SymKind_GPROC32: - { - // rjf: unpack sym - CV_SymProc32 *proc32 = (CV_SymProc32 *)iter.struct_base; - String8 name = str8_cstring_capped(proc32+1, iter.opl); - RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype); - - // rjf: unpack proc's container type - B32 got_container = 0; - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); - if(!got_container && container_name.size != 0 && tpi_hash != 0 && tpi_leaf != 0) - { - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - got_container = (container_type != 0); - } - - // rjf: unpack proc's container scope - RDIM_Scope *container_scope = 0; - if(!got_container && top_scope_node != 0) - { - container_scope = top_scope_node->scope; - got_container = 1; - } - - // rjf: unpack proc's container namespace - RDIM_Namespace *container_namespace = 0; - if(!got_container && container_name.size != 0) - { - U64 hash = u64_hash_from_str8(container_name); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(container_name, n->string, 0) && - n->ns != 0) - { - container_namespace = n->ns; - break; - } - } - } - - // rjf: build procedure's root scope - // - // NOTE: even if there could be a containing scope at this point (which should be - // illegal in C/C++ but not necessarily in another language) we would not use - // it here because these scopes refer to the ranges of code that make up a - // procedure *not* the namespaces, so a procedure's root scope always has - // no parent. - RDIM_Scope *procedure_root_scope = 0; - if(params->subset_flags & RDIM_SubsetFlag_Scopes) - { - procedure_root_scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); - COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0; - if(section != 0) - { - U64 voff_first = section->voff + proc32->off; - U64 voff_last = voff_first + proc32->len; - RDIM_Rng1U64 voff_range = {voff_first, voff_last}; - rdim_scope_push_voff_range(arena, sym_scopes, procedure_root_scope, voff_range); - procedure_base_voff = voff_first; - } - } - - // rjf: root scope voff minimum range -> link name - String8 link_name = {0}; - if(procedure_root_scope && procedure_root_scope->voff_ranges.min != 0) - { - U64 voff = procedure_root_scope->voff_ranges.min; - U64 hash = p2r_hash_from_voff(voff); - U64 bucket_idx = hash%link_name_map->buckets_count; - P2R_LinkNameNode *node = 0; - for(P2R_LinkNameNode *n = link_name_map->buckets[bucket_idx]; n != 0; n = n->next) - { - if(n->voff == voff) - { - link_name = n->name; - ins_atomic_u64_inc_eval(&n->referencing_symbol_count); - break; - } - } - } - - // rjf: un-namespaceify the symbol name - String8 name__maybe_partially_qualified = name; - if(got_container) - { - name__maybe_partially_qualified = str8_skip(name, container_name_opl); - } - - // rjf: build procedure symbol - if(params->subset_flags & (RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_ProcedureNameMap)) - { - curr_proc_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); - curr_proc_symbol->is_extern = (iter.kind == CV_SymKind_GPROC32); - curr_proc_symbol->name = name__maybe_partially_qualified; - curr_proc_symbol->link_name = link_name; - curr_proc_symbol->type = type; - curr_proc_symbol->container_scope = container_scope; - curr_proc_symbol->container_type = container_type; - curr_proc_symbol->root_scope = procedure_root_scope; - if(procedure_root_scope != 0) - { - procedure_root_scope->symbol = curr_proc_symbol; - } - } - - // rjf: push scope to scope stack - if(procedure_root_scope) - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = procedure_root_scope; - SLLStackPush(top_scope_node, node); - } - - // rjf: determine if this procedure is a namespace used for types; if so, gather - if(procedure_root_scope != 0) - { - U64 hash = u64_hash_from_str8(name); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->string, name, 0)) - { - ScopeNamespaceNode *node = push_array(arena, ScopeNamespaceNode, 1); - node->scope = procedure_root_scope; - node->string = name; - SLLQueuePush(syms_scopes_that_are_namespaces[sym_idx].first, - syms_scopes_that_are_namespaces[sym_idx].last, - node); - break; - } - } - } - - // rjf: increment procedure counter - procedure_num += 1; - - // reset S_REGREL32 index - regrel_idx = 0; - - proc_flags = proc32->flags; - }break; - - //- rjf: THUNK32 - case CV_SymKind_THUNK32: - { - // rjf: unpack record - CV_SymThunk32 *thunk32 = (CV_SymThunk32 *)iter.struct_base; - String8 name = str8_cstring_capped(thunk32+1, iter.opl); - COFF_SectionHeader *section = (0 < thunk32->sec && thunk32->sec <= coff_sections.count) ? &coff_sections.v[thunk32->sec-1] : 0; - U64 voff_first = 0; - U64 voff_opl = 0; - if(section != 0) - { - voff_first = section->voff + thunk32->off; - voff_opl = voff_first + thunk32->len; - } - - // rjf: build symbol / scope - RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap); - symbol->name = name; - symbol->is_thunk = 1; - if(voff_first != voff_opl) - { - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); - RDIM_Rng1U64 range = {voff_first, voff_opl}; - rdim_scope_push_voff_range(arena, sym_scopes, scope, range); - scope->symbol = symbol; - symbol->root_scope = scope; - } - }break; - - //- rjf: REGREL32 - case CV_SymKind_REGREL32: - { - if(params->subset_flags & RDIM_SubsetFlag_Locals && !(proc_flags & CV_ProcFlag_OptDbgInfo)) - { - // TODO(rjf): apparently some of the information here may end up being - // redundant with "better" information from CV_SymKind_LOCAL record. - // we don't currently handle this, but if those cases arise then it - // will obviously be better to prefer the better information from both - // records. - - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)iter.struct_base; - String8 name = str8_cstring_capped(regrel32+1, iter.opl); - RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype); - CV_Reg cv_reg = regrel32->reg; - U32 var_off = regrel32->reg_off; - - // rjf: determine if this is a parameter - B32 is_param = (regrel_idx < curr_proc_symbol->type->count); - - // rjf: determine if we need an extra indirection to the value - B32 extra_indirection_to_value = 0; - if(type != 0) - { - switch(arch) - { - case RDI_Arch_X64: - { - extra_indirection_to_value = (is_param && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size))); - }break; - } - } - - // If the return local does not fit in a register MSVC does not assign it a type. - // So we infer the return type from the signature. - // - // rjf: redirect type, if 0, and if outside frame, to the return type of the - // containing procedure - { - B32 is_stack_reg = 0; - switch(arch) - { - default:{}break; - case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP || cv_reg == CV_Regx64_RBP);}break; - } - if(is_stack_reg) - { - if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num <= procedure_frameprocs_count) - { - CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1]; - if(var_off > frameproc->frame_size && regrel32->itype == 0 && - top_scope_node->scope->symbol != 0 && - top_scope_node->scope->symbol->type != 0) - { - type = top_scope_node->scope->symbol->type->direct_type; - extra_indirection_to_value = 1; - } - } - } - } - - // rjf: build local - { - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); - local->container_scope = scope; - local->is_param = is_param; - local->name = name; - local->type = type; - - // rjf: equip location info - { - // rjf: get raddbg register code - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - // TODO(rjf): real byte_size & byte_pos from cv_reg goes here - U32 byte_size = 8; - U32 byte_pos = 0; - - // rjf: build location - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value); - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_case_list_push(arena, &local->location_cases, loc, voff_range); - } - } - } - - regrel_idx += 1; - }break; - - //- rjf: LTHREAD32/GTHREAD32 - case CV_SymKind_LTHREAD32: - case CV_SymKind_GTHREAD32: - if(params->subset_flags & (RDIM_SubsetFlag_ThreadVariables|RDIM_SubsetFlag_ThreadVariableNameMap)) - { - // rjf: unpack sym - CV_SymThread32 *thread32 = (CV_SymThread32 *)iter.struct_base; - String8 name = str8_cstring_capped(thread32+1, iter.opl); - U32 tls_off = thread32->tls_off; - RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype); - - // rjf: unpack thread variable's container type - B32 got_container = 0; - RDIM_Type *container_type = 0; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(name); - String8 container_name = str8_chop(str8_prefix(name, container_name_opl), 2); - if(!got_container && container_name.size != 0) - { - CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0); - container_type = p2r_type_ptr_from_itype(cv_type_id); - got_container = (container_type != 0); - } - - // rjf: unpack thread variable's container symbol - RDIM_Scope *container_scope = 0; - if(!got_container && top_scope_node != 0) - { - got_container = 1; - container_scope = top_scope_node->scope; - } - - // rjf: unpack proc's container namespace - RDIM_Namespace *container_namespace = 0; - if(!got_container && container_name.size != 0) - { - U64 hash = u64_hash_from_str8(container_name); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(container_name, n->string, 0) && - n->ns != 0) - { - container_namespace = n->ns; - break; - } - } - } - - // rjf: un-namespaceify the symbol name - String8 name__maybe_partially_qualified = name; - if(got_container) - { - name__maybe_partially_qualified = str8_skip(name, container_name_opl); - } - - // rjf: build symbol - RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, sym_thread_variables, sym_thread_variables_chunk_cap); - tvar->name = name__maybe_partially_qualified; - tvar->type = type; - tvar->is_extern = (iter.kind == CV_SymKind_GTHREAD32); - tvar->container_type = container_type; - tvar->container_scope = container_scope; - tvar->container_namespace = container_namespace; - RDIM_Location loc = {.kind = RDI_LocationKind_TLSOff, .offset = tls_off}; - RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; - rdim_location_case_list_push(arena, &tvar->location_cases, loc, range); - }break; - - //- rjf: LOCAL - case CV_SymKind_LOCAL: - if(params->subset_flags & (RDIM_SubsetFlag_Locals)) - { - // rjf: no containing scope? -> malformed data; locals cannot be produced - // outside of a containing scope - if(top_scope_node == 0) - { - break; - } - - // rjf: unpack sym - CV_SymLocal *slocal = (CV_SymLocal *)iter.struct_base; - String8 name = str8_cstring_capped(slocal+1, iter.opl); - RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype); - - // rjf: determine if this symbol encodes the beginning of a global modification - B32 is_global_modification = 0; - if((slocal->flags & CV_LocalFlag_Global) || - (slocal->flags & CV_LocalFlag_Static)) - { - is_global_modification = 1; - } - - // rjf: is global modification -> emit global modification symbol - if(is_global_modification) - { - // TODO(rjf): add global modification symbols - defrange_target = 0; - } - - // rjf: is not a global modification -> emit a local variable - if(!is_global_modification) - { - // rjf: build local - RDIM_Scope *scope = top_scope_node->scope; - RDIM_Symbol *local = rdim_symbol_chunk_list_push(arena, &scope->locals, 8); - { - local->container_scope = scope; - local->is_param = !!(slocal->flags & CV_LocalFlag_Param); - local->name = name; - local->type = type; - } - - // rjf: save defrange target, for subsequent defrange symbols - defrange_target = local; - } - }break; - - //- rjf: DEFRANGE_REGISTER - case CV_SymKind_DEFRANGE_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)iter.struct_base; - CV_Reg cv_reg = defrange_register->reg; - CV_LvarAddrRange *range = &defrange_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1); - U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - - // rjf: build location - RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; - - // rjf: emit locations over ranges - p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)iter.struct_base; - CV_LvarAddrRange *range = &defrange_fprel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1); - U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: select frame pointer register - CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); - RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = rdi_addr_size_from_arch(arch); - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel->off; - RDIM_Location location = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit locations over ranges - p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, location, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_SUBFIELD_REGISTER - case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)iter.struct_base; - CV_Reg cv_reg = defrange_subfield_register->reg; - CV_LvarAddrRange *range = &defrange_subfield_register->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1); - U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - - // rjf: skip "subfield" location info - currently not supported - if(defrange_subfield_register->field_offset != 0) - { - break; - } - - // rjf: build location - RDIM_Location loc = {RDI_LocationKind_ValReg, reg_code}; - - // rjf: emit locations over ranges - p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); - }break; - - //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE - case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: find current procedure's frameproc - CV_SymFrameproc *frameproc = 0; - if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0) - { - frameproc = procedure_frameprocs[procedure_num-1]; - } - - // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange - // without having an actually active procedure - break - if(frameproc == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)iter.struct_base; - CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target->is_param); - RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg); - - // rjf: build location - B32 extra_indirection = 0; - U32 byte_size = rdi_addr_size_from_arch(arch); - U32 byte_pos = 0; - S64 var_off = (S64)defrange_fprel_full_scope->off; - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection); - - // rjf: emit location over ranges - RDIM_Rng1U64 voff_range = {0, max_U64}; - rdim_location_case_list_push(arena, &defrange_target->location_cases, loc, voff_range); - }break; - - //- rjf: DEFRANGE_REGISTER_REL - case CV_SymKind_DEFRANGE_REGISTER_REL: - { - // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing - // a local - break immediately - if(defrange_target == 0) - { - break; - } - - // rjf: unpack sym - CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)iter.struct_base; - CV_Reg cv_reg = defrange_register_rel->reg; - RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg); - CV_LvarAddrRange *range = &defrange_register_rel->range; - COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0; - CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1); - U64 gap_count = ((U8*)iter.opl - (U8*)gaps) / sizeof(*gaps); - - // rjf: build location - // TODO(rjf): offset & size from cv_reg code - U32 byte_size = rdi_addr_size_from_arch(arch); - U32 byte_pos = 0; - B32 extra_indirection_to_value = 0; - S64 var_off = defrange_register_rel->reg_off; - RDIM_Location loc = p2r_location_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value); - - // rjf: emit locations over ranges - p2r_location_case_list_push_over_lvar_addr_range(arena, &defrange_target->location_cases, loc, range, range_section, gaps, gap_count); - }break; - - //- rjf: FILESTATIC - case CV_SymKind_FILESTATIC: - { - CV_SymFileStatic *file_static = (CV_SymFileStatic*)iter.struct_base; - String8 name = str8_cstring_capped(file_static+1, iter.opl); - RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype); - // TODO(rjf): emit a global modifier symbol - defrange_target = 0; - }break; - - //- rjf: INLINESITE - case CV_SymKind_INLINESITE: - if(params->subset_flags & (RDIM_SubsetFlag_Scopes)) - { - // rjf: unpack sym - CV_SymInlineSite *sym = (CV_SymInlineSite *)iter.struct_base; - String8 binary_annots = str8((U8 *)(sym+1), (U64)((U8 *)iter.opl - (U8 *)(sym+1))); - - // rjf: extract external info about inline site - String8 name = {0}; - RDIM_Type *type = 0; - RDIM_Type *owner = 0; - if(ipi_leaf != 0 && ipi_leaf->itype_first <= sym->inlinee && sym->inlinee < ipi_leaf->itype_opl) - { - CV_RecRange rec_range = ipi_leaf->leaf_ranges.ranges[sym->inlinee - ipi_leaf->itype_first]; - String8 rec_data = str8_substr(ipi_leaf->data, rng_1u64(rec_range.off, rec_range.off + rec_range.hdr.size)); - void *raw_leaf = rec_data.str + sizeof(U16); - - // rjf: extract method inline info - if(rec_range.hdr.kind == CV_LeafKind_MFUNC_ID && - rec_range.hdr.size >= sizeof(CV_LeafMFuncId)) - { - CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)raw_leaf; - name = str8_cstring_capped(mfunc_id + 1, rec_data.str + rec_data.size); - type = p2r_type_ptr_from_itype(mfunc_id->itype); - owner = mfunc_id->owner_itype != 0 ? p2r_type_ptr_from_itype(mfunc_id->owner_itype) : 0; - } - - // rjf: extract non-method function inline info - else if(rec_range.hdr.kind == CV_LeafKind_FUNC_ID && - rec_range.hdr.size >= sizeof(CV_LeafFuncId)) - { - CV_LeafFuncId *func_id = (CV_LeafFuncId*)raw_leaf; - name = str8_cstring_capped(func_id + 1, rec_data.str + rec_data.size); - type = p2r_type_ptr_from_itype(func_id->itype); - owner = func_id->scope_string_id != 0 ? p2r_type_ptr_from_itype(func_id->scope_string_id) : 0; - } - } - - // rjf: build inline site - RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, sym_inline_sites, sym_inline_sites_chunk_cap); - inline_site->name = name; - inline_site->type = type; - inline_site->owner = owner; - inline_site->line_table = inline_site_line_table; - - // rjf: increment to next inline site line table in this unit - if(inline_site_line_table != 0 && inline_site_line_table->chunk != 0) - { - RDIM_LineTableChunkNode *chunk = inline_site_line_table->chunk; - U64 current_idx = (U64)(inline_site_line_table - chunk->v); - if(current_idx+1 < chunk->count) - { - inline_site_line_table += 1; - } - else - { - chunk = chunk->next; - inline_site_line_table = 0; - if(chunk != 0) - { - inline_site_line_table = chunk->v; - } - } - } - - // rjf: build scope - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap); - scope->inline_site = inline_site; - if(top_scope_node == 0) - { - // TODO(rjf): log - } - if(top_scope_node != 0) - { - RDIM_Scope *top_scope = top_scope_node->scope; - SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling); - scope->parent_scope = top_scope; - scope->symbol = top_scope->symbol; - } - - // rjf: push this scope to scope stack - { - P2R_ScopeNode *node = free_scope_node; - if(node != 0) { SLLStackPop(free_scope_node); } - else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); } - node->scope = scope; - SLLStackPush(top_scope_node, node); - } - - // rjf: parse offset ranges of this inline site - attach to scope - { - CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(0, 0, procedure_base_voff); - for(;;) - { - CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots); - - if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitRange) - { - // rjf: build new range & add to scope - RDIM_Rng1U64 voff_range = { step.range.min, step.range.max }; - rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range); - } - - if(step.flags & CV_C13InlineSiteDecoderStepFlag_ExtendLastRange) - { - if(scope->voff_ranges.last != 0) - { - scope->voff_ranges.last->v.max = step.range.max; - } - } - - if(step.flags == 0) - { - break; - } - } - } - }break; - - //- rjf: INLINESITE_END - case CV_SymKind_INLINESITE_END: - { - P2R_ScopeNode *n = top_scope_node; - if(n != 0) - { - SLLStackPop(top_scope_node); - SLLStackPush(free_scope_node, n); - } - defrange_target = 0; - }break; - - //- rjf: CONSTANT - case CV_SymKind_CONSTANT: - if(params->subset_flags & RDIM_SubsetFlag_Constants) - { - // rjf: unpack - CV_SymConstant *sym = (CV_SymConstant *)iter.struct_base; - RDIM_Type *type = p2r_type_ptr_from_itype(sym->itype); - U8 *val_ptr = (U8 *)(sym+1); - CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, iter.opl); - U64 val64 = cv_u64_from_numeric(&val); - U8 *name_ptr = val_ptr + val.encoded_size; - String8 name = str8_cstring_capped(name_ptr, iter.opl); - String8 val_data = str8_struct(&val64); - U64 container_name_opl = 0; - if(type != 0) - { - container_name_opl = p2r_end_of_cplusplus_container_name(type->name); - } - String8 name_qualified = name; - if(container_name_opl != 0) - { - name_qualified = push_str8f(arena, "%S%S", str8_prefix(type->name, container_name_opl), name); - } - - // rjf: build constant symbol - if(name_qualified.size != 0) - { - RDIM_Symbol *cnst = rdim_symbol_chunk_list_push(arena, sym_constants, sym_constants_chunk_cap); - cnst->name = name_qualified; - cnst->type = type; - RDIM_Location loc = {.kind = RDI_LocationKind_ConstantDataOff, .value_data = str8_copy(arena, val_data)}; - RDIM_Rng1U64 range = {0, 0xffffffffffffffffull}; - rdim_location_case_list_push(arena, &cnst->location_cases, loc, range); - } - }break; - } - } - } - - scratch_end(scratch); - } - } -#undef p2r_type_ptr_from_itype - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: produce stub procedures from all pub32 symbols - // - if(lane_idx() == 0) - { - CV_SymParsed *sym = all_syms[0]; - for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) - { - RDIM_Unit *sym_unit = &all_units_ptr->first->v[0]; - RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; - RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; - RDIM_ScopeChunkList *sym_scopes = &sym_unit->scopes; - switch(iter.kind) - { - default:{}break; - case CV_SymKind_PUB32: - { - // rjf: unpack record - CV_SymPub32 *pub32 = (CV_SymPub32 *)iter.struct_base; - String8 name = str8_cstring_capped(pub32+1, iter.opl); - COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= coff_sections.count) ? &coff_sections.v[pub32->sec-1] : 0; - U64 voff = 0; - if(section != 0) - { - voff = section->voff + pub32->off; - } - - // rjf: determine if this pub32 was covered by another symbol record - B32 was_in_other_record = 0; - { - U64 hash = p2r_hash_from_voff(voff); - U64 slot_idx = hash%link_name_map->buckets_count; - for(P2R_LinkNameNode *n = link_name_map->buckets[slot_idx]; n != 0; n = n->next) - { - if(n->voff == voff) - { - was_in_other_record = (n->referencing_symbol_count != 0); - break; - } - } - } - - // rjf: find compilation unit contribution to determine pub32's size - U64 voff_opl = voff+1; - if(!was_in_other_record) - { - PDB_CompUnitContribution *contrib = pdb_comp_unit_contribution_from_voff__binary_search(comp_unit_contributions, voff); - if(contrib != 0) - { - voff_opl = contrib->voff_opl; - } - } - - // rjf: if this pub32 was *not* covered by another symbol record, build a symbol for it - if(!was_in_other_record) - { - B32 is_procedure = (pub32->flags & (CV_Pub32Flag_Code|CV_Pub32Flag_Function)); - RDIM_SymbolChunkList *symbols = is_procedure ? sym_procedures : sym_global_variables; - RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, symbols, 64); - symbol->name = name; - symbol->link_name = name; - if(is_procedure) - { - RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, 64); - scope->symbol = symbol; - RDIM_Rng1U64 range = {voff, voff_opl}; - rdim_scope_push_voff_range(arena, sym_scopes, scope, range); - symbol->root_scope = scope; - } - } - }break; - } - } - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: upgrade namespace nodes with scopes info, if they match a scope - // - if(lane_idx() == 0) - { - for EachIndex(sym_idx, all_syms_count) - { - ScopeNamespaceList *scopes_that_are_namespaces = &syms_scopes_that_are_namespaces[sym_idx]; - for(ScopeNamespaceNode *scope_n = scopes_that_are_namespaces->first; scope_n != 0; scope_n = scope_n->next) - { - U64 hash = u64_hash_from_str8(scope_n->string); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - n->scope = scope_n->scope; - } - } - } - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: upgrade namespaces with container info; trim off container names - // - for EachNode(n, RDIM_NamespaceChunkNode, all_namespaces.first) - { - Rng1U64 range = lane_range(n->count); - for EachInRange(n_idx, range) - { - RDIM_Namespace *ns = &n->v[n_idx]; - U64 container_name_opl = p2r_end_of_cplusplus_container_name(ns->name); - String8 container_name = str8_chop(str8_prefix(ns->name, container_name_opl), 2); - if(container_name.size != 0) - { - String8 leaf_name = str8_skip(ns->name, container_name_opl); - U64 hash = u64_hash_from_str8(container_name); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *ns_n = all_namespace_slots[slot_idx]; ns_n != 0; ns_n = ns_n->next) - { - if(str8_match(ns_n->string, container_name, 0)) - { - ns->parent_scope = ns_n->scope; - ns->parent_type = ns_n->type; - ns->parent_namespace = ns_n->ns; - break; - } - } - ns->name = leaf_name; - } - } - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: join extra types from units - // - RDIM_TypeChunkList all_types = {0}; - { - RDIM_TypeChunkList *all_types_ptr = 0; - if(lane_idx() == 0) - { - all_types_ptr = push_array(scratch.arena, RDIM_TypeChunkList, 1); - } - lane_sync_u64(&all_types_ptr, 0); - if(lane_idx() == lane_from_task_idx(7)) ProfScope("join typedefs") - { - for EachIndex(idx, all_syms_count) - { - rdim_type_chunk_list_concat_in_place(all_types__pre_typedefs_ptr, &syms_typedefs[idx]); - } - *all_types_ptr = *all_types__pre_typedefs_ptr; - } - lane_sync(); - all_types = *all_types_ptr; - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: build UDTs - // - RDIM_UDTChunkList *lanes_udts = 0; - ProfScope("build UDTs") - { -#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0) - - //- rjf: gather this lane's UDTs - RDIM_UDTChunkList lane_udts = {0}; - if(params->subset_flags & RDIM_SubsetFlag_Types && - params->subset_flags & RDIM_SubsetFlag_UDTs) - { - U64 udts_chunk_cap = 4096; - RDIM_UDTChunkList *udts = &lane_udts; - Rng1U64 range = lane_range(itype_opl); - for EachInRange(idx, range) - { - //- rjf: skip basics - CV_TypeId itype = (CV_TypeId)idx; - if(itype < itype_first) { continue; } - - //- rjf: grab type for this itype - skip if empty - RDIM_Type *dst_type = itype_type_ptrs[itype]; - if(dst_type == 0) { continue; } - - //- rjf: unpack itype leaf range - skip if out-of-range - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first]; - CV_LeafKind kind = range->hdr.kind; - U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind); - U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2; - U8 *itype_leaf_opl = itype_leaf_first + range->hdr.size-2; - if(range->off+range->hdr.size > tpi_leaf->data.size || - range->off+2+header_struct_size > tpi_leaf->data.size || - range->hdr.size < 2) - { - continue; - } - - //- rjf: build UDT - String8 udt_name = {0}; - CV_TypeId field_itype = 0; - switch(kind) - { - default:{}break; - - //////////////////////// - //- rjf: structs/unions/classes -> equip members - // - case CV_LeafKind_CLASS: - case CV_LeafKind_STRUCTURE: - { - CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); - }goto equip_members; - case CV_LeafKind_UNION: - { - CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - field_itype = lf->field_itype; - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); - }goto equip_members; - case CV_LeafKind_CLASS2: - case CV_LeafKind_STRUCT2: - { - CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - U8 *numeric_ptr = (U8*)(lf + 1); - CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl); - U8 *name_ptr = numeric_ptr + size.encoded_size; - udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); - field_itype = lf->field_itype; - }goto equip_members; - equip_members: - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: grab UDT info - RDIM_UDT *dst_udt = dst_type->udt; - if(dst_udt == 0) - { - dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); - dst_udt->self_type = dst_type; - } - - //- rjf: gather all fields - typedef struct FieldListTask FieldListTask; - struct FieldListTask - { - FieldListTask *next; - CV_TypeId itype; - }; - FieldListTask start_fl_task = {0, field_itype}; - FieldListTask *fl_todo_stack = &start_fl_task; - FieldListTask *fl_done_stack = 0; - for(;fl_todo_stack != 0;) - { - //- rjf: take & unpack task - FieldListTask *fl_task = fl_todo_stack; - SLLStackPop(fl_todo_stack); - SLLStackPush(fl_done_stack, fl_task); - CV_TypeId field_list_itype = fl_task->itype; - - //- rjf: skip bad itypes - if(field_list_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= field_list_itype) - { - continue; - } - - //- rjf: field list itype -> range - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-tpi_leaf->itype_first]; - - //- rjf: skip bad headers - if(range->off+range->hdr.size > tpi_leaf->data.size || - range->hdr.size < 2 || - range->hdr.kind != CV_LeafKind_FIELDLIST) - { - continue; - } - - //- rjf: loop over all fields - { - U8 *field_list_first = tpi_leaf->data.str+range->off+2; - U8 *field_list_opl = field_list_first+range->hdr.size-2; - for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; - read_ptr < field_list_opl; - read_ptr = next_read_ptr) - { - // rjf: unpack field - CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; - U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); - U8 *field_leaf_first = read_ptr+2; - U8 *field_leaf_opl = field_list_opl; - next_read_ptr = field_leaf_opl; - - // rjf: skip out-of-bounds fields - if(field_leaf_first+field_leaf_header_size > field_list_opl) - { - continue; - } - - // rjf: process field - switch(field_kind) - { - //- rjf: unhandled/invalid cases - default: - { - // TODO(rjf): log - }break; - - //- rjf: INDEX - case CV_LeafKind_INDEX: - { - // rjf: unpack leaf - CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; - CV_TypeId new_itype = lf->itype; - - // rjf: bump next read pointer past header - next_read_ptr = (U8 *)(lf+1); - - // rjf: determine if index itype is new - B32 is_new = 1; - for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) - { - if(t->itype == new_itype) - { - is_new = 0; - break; - } - } - - // rjf: if new -> push task to follow new itype - if(is_new) - { - FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); - SLLStackPush(fl_todo_stack, new_task); - new_task->itype = new_itype; - } - }break; - - //- rjf: MEMBER - case CV_LeafKind_MEMBER: - { - // TODO(rjf): log on bad offset - - // rjf: unpack leaf - CV_LeafMember *lf = (CV_LeafMember *)field_leaf_first; - U8 *offset_ptr = (U8 *)(lf+1); - CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); - U64 offset64 = cv_u64_from_numeric(&offset); - U8 *name_ptr = offset_ptr + offset.encoded_size; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_DataField; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - mem->off = (U32)offset64; - }break; - - //- rjf: STMEMBER - case CV_LeafKind_STMEMBER: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafStMember *lf = (CV_LeafStMember *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_StaticData; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: METHOD - case CV_LeafKind_METHOD: - { - // rjf: unpack leaf - CV_LeafMethod *lf = (CV_LeafMethod *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - //- rjf: method list itype -> range - CV_RecRange *method_list_range = &tpi_leaf->leaf_ranges.ranges[lf->list_itype-tpi_leaf->itype_first]; - - //- rjf: skip bad method lists - if(method_list_range->off+method_list_range->hdr.size > tpi_leaf->data.size || - method_list_range->hdr.size < 2 || - method_list_range->hdr.kind != CV_LeafKind_METHODLIST) - { - break; - } - - //- rjf: loop through all methods & emit members - U8 *method_list_first = tpi_leaf->data.str + method_list_range->off + 2; - U8 *method_list_opl = method_list_first + method_list_range->hdr.size-2; - for(U8 *method_read_ptr = method_list_first, *next_method_read_ptr = method_list_opl; - method_read_ptr < method_list_opl; - method_read_ptr = next_method_read_ptr) - { - CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)method_read_ptr; - CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(method->attribs); - RDIM_Type *method_type = p2r_type_ptr_from_itype(method->itype); - next_method_read_ptr = (U8 *)(method+1); - - // TODO(allen): PROBLEM - // We only get offsets for virtual functions (the "vbaseoff") from - // "Intro" and "PureIntro". In C++ inheritance, when we have a chain - // of inheritance (let's just talk single inheritance for now) the - // first class in the chain that introduces a new virtual function - // has this "Intro" method. If a later class in the chain redefines - // the virtual function it only has a "Virtual" method which does - // not update the offset. There is a "Virtual" and "PureVirtual" - // variant of "Virtual". The "Pure" in either case means there - // is no concrete procedure. When there is no "Pure" the method - // should have a corresponding procedure symbol id. - // - // The issue is we will want to mark all of our virtual methods as - // virtual and give them an offset, but that means we have to do - // some extra figuring to propogate offsets from "Intro" methods - // to "Virtual" methods in inheritance trees. That is - IF we want - // to start preserving the offsets of virtuals. There is room in - // the method struct to make this work, but for now I've just - // decided to drop this information. It is not urgently useful to - // us and greatly complicates matters. - - // rjf: read vbaseoff - U32 vbaseoff = 0; - if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) - { - if(next_method_read_ptr+4 <= method_list_opl) - { - vbaseoff = *(U32 *)next_method_read_ptr; - } - next_method_read_ptr += 4; - } - - // rjf: emit method - switch(prop) - { - default: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_Method; - mem->name = name; - mem->type = method_type; - }break; - case CV_MethodProp_Static: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_StaticMethod; - mem->name = name; - mem->type = method_type; - }break; - case CV_MethodProp_Virtual: - case CV_MethodProp_PureVirtual: - case CV_MethodProp_Intro: - case CV_MethodProp_PureIntro: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualMethod; - mem->name = name; - mem->type = method_type; - }break; - } - } - - }break; - - //- rjf: ONEMETHOD - case CV_LeafKind_ONEMETHOD: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafOneMethod *lf = (CV_LeafOneMethod *)field_leaf_first; - CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(lf->attribs); - U8 *vbaseoff_ptr = (U8 *)(lf+1); - U8 *vbaseoff_opl_ptr = vbaseoff_ptr; - U32 vbaseoff = 0; - if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) - { - vbaseoff = *(U32 *)(vbaseoff_ptr); - vbaseoff_opl_ptr += sizeof(U32); - } - U8 *name_ptr = vbaseoff_opl_ptr; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - RDIM_Type *method_type = p2r_type_ptr_from_itype(lf->itype); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit method - switch(prop) - { - default: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_Method; - mem->name = name; - mem->type = method_type; - }break; - case CV_MethodProp_Static: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_StaticMethod; - mem->name = name; - mem->type = method_type; - }break; - case CV_MethodProp_Virtual: - case CV_MethodProp_PureVirtual: - case CV_MethodProp_Intro: - case CV_MethodProp_PureIntro: - { - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualMethod; - mem->name = name; - mem->type = method_type; - }break; - } - }break; - - //- rjf: NESTTYPE - case CV_LeafKind_NESTTYPE: - { - // rjf: unpack leaf - CV_LeafNestType *lf = (CV_LeafNestType *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_NestedType; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: NESTTYPEEX - case CV_LeafKind_NESTTYPEEX: - { - // TODO(rjf): handle attribs - - // rjf: unpack leaf - CV_LeafNestTypeEx *lf = (CV_LeafNestTypeEx *)field_leaf_first; - U8 *name_ptr = (U8 *)(lf+1); - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_NestedType; - mem->name = name; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: BCLASS - case CV_LeafKind_BCLASS: - { - // TODO(rjf): log on bad offset - - // rjf: unpack leaf - CV_LeafBClass *lf = (CV_LeafBClass *)field_leaf_first; - U8 *offset_ptr = (U8 *)(lf+1); - CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl); - U64 offset64 = cv_u64_from_numeric(&offset); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = offset_ptr+offset.encoded_size; - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_Base; - mem->type = p2r_type_ptr_from_itype(lf->itype); - mem->off = (U32)offset64; - }break; - - //- rjf: VBCLASS/IVBCLASS - case CV_LeafKind_VBCLASS: - case CV_LeafKind_IVBCLASS: - { - // TODO(rjf): log on bad offsets - // TODO(rjf): handle attribs - // TODO(rjf): offsets? - - // rjf: unpack leaf - CV_LeafVBClass *lf = (CV_LeafVBClass *)field_leaf_first; - U8 *num1_ptr = (U8 *)(lf+1); - CV_NumericParsed num1 = cv_numeric_from_data_range(num1_ptr, field_leaf_opl); - U8 *num2_ptr = num1_ptr + num1.encoded_size; - CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl); - - // rjf: bump next read pointer past header - next_read_ptr = (U8 *)(lf+1); - - // rjf: emit member - RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt); - mem->kind = RDI_MemberKind_VirtualBase; - mem->type = p2r_type_ptr_from_itype(lf->itype); - }break; - - //- rjf: VFUNCTAB - case CV_LeafKind_VFUNCTAB: - { - CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first; - - // rjf: bump next read pointer past header - next_read_ptr = (U8 *)(lf+1); - - // NOTE(rjf): currently no-op this case - (void)lf; - }break; - } - - // rjf: align-up next field - next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); - } - } - } - - scratch_end(scratch); - }break; - - //////////////////////// - //- rjf: enums -> equip enumerates - // - case CV_LeafKind_ENUM: - { - CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first; - if(lf->props & CV_TypeProp_FwdRef) - { - break; - } - U8 *name_ptr = (U8 *)(lf + 1); - udt_name = str8_cstring_capped(name_ptr, itype_leaf_opl); - field_itype = lf->field_itype; - }goto equip_enum_vals; - equip_enum_vals:; - { - Temp scratch = scratch_begin(&arena, 1); - - //- rjf: grab UDT info - RDIM_UDT *dst_udt = dst_type->udt; - if(dst_udt == 0) - { - dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap); - dst_udt->self_type = dst_type; - } - - //- rjf: gather all fields - typedef struct FieldListTask FieldListTask; - struct FieldListTask - { - FieldListTask *next; - CV_TypeId itype; - }; - FieldListTask start_fl_task = {0, field_itype}; - FieldListTask *fl_todo_stack = &start_fl_task; - FieldListTask *fl_done_stack = 0; - for(;fl_todo_stack != 0;) - { - //- rjf: take & unpack task - FieldListTask *fl_task = fl_todo_stack; - SLLStackPop(fl_todo_stack); - SLLStackPush(fl_done_stack, fl_task); - CV_TypeId field_list_itype = fl_task->itype; - - //- rjf: skip bad itypes - if(field_list_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= field_list_itype) - { - continue; - } - - //- rjf: field list itype -> range - CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-tpi_leaf->itype_first]; - - //- rjf: skip bad headers - if(range->off+range->hdr.size > tpi_leaf->data.size || - range->hdr.size < 2 || - range->hdr.kind != CV_LeafKind_FIELDLIST) - { - continue; - } - - //- rjf: loop over all fields - { - U8 *field_list_first = tpi_leaf->data.str+range->off+2; - U8 *field_list_opl = field_list_first+range->hdr.size-2; - for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl; - read_ptr < field_list_opl; - read_ptr = next_read_ptr) - { - // rjf: unpack field - CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr; - U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind); - U8 *field_leaf_first = read_ptr+2; - U8 *field_leaf_opl = field_leaf_first+range->hdr.size-2; - next_read_ptr = field_leaf_opl; - - // rjf: skip out-of-bounds fields - if(field_leaf_first+field_leaf_header_size > field_list_opl) - { - continue; - } - - // rjf: process field - switch(field_kind) - { - //- rjf: unhandled/invalid cases - default: - { - // TODO(rjf): log - }break; - - //- rjf: INDEX - case CV_LeafKind_INDEX: - { - // rjf: unpack leaf - CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first; - CV_TypeId new_itype = lf->itype; - - // rjf: determine if index itype is new - B32 is_new = 1; - for(FieldListTask *t = fl_done_stack; t != 0; t = t->next) - { - if(t->itype == new_itype) - { - is_new = 0; - break; - } - } - - // rjf: if new -> push task to follow new itype - if(is_new) - { - FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1); - SLLStackPush(fl_todo_stack, new_task); - new_task->itype = new_itype; - } - }break; - - //- rjf: ENUMERATE - case CV_LeafKind_ENUMERATE: - { - // TODO(rjf): attribs - - // rjf: unpack leaf - CV_LeafEnumerate *lf = (CV_LeafEnumerate *)field_leaf_first; - U8 *val_ptr = (U8 *)(lf+1); - CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, field_leaf_opl); - U64 val64 = cv_u64_from_numeric(&val); - U8 *name_ptr = val_ptr + val.encoded_size; - String8 name = str8_cstring_capped(name_ptr, field_leaf_opl); - - // rjf: bump next read pointer past variable length parts - next_read_ptr = name.str+name.size+1; - - // rjf: emit member - RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt); - enum_val->name = name; - enum_val->val = val64; - }break; - } - - // rjf: align-up next field - next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4); - } - } - } - - scratch_end(scratch); - }break; - } - - //- rjf: find container, given name's namespaces - if(dst_type != 0 && dst_type->udt != 0 && udt_name.size != 0) - { - // rjf: unpack fully qualified namespace from udt name - U64 container_name_opl = p2r_end_of_cplusplus_container_name(udt_name); - String8 container_name = str8_chop(str8_prefix(udt_name, container_name_opl), 2); - String8 leaf_name = str8_skip(udt_name, container_name_opl); - - // rjf: look up namespace node associated with namespace - P2R_NamespaceNode *ns_node = 0; - { - U64 hash = u64_hash_from_str8(container_name); - U64 slot_idx = hash%all_namespace_slots_count; - for(P2R_NamespaceNode *n = all_namespace_slots[slot_idx]; n != 0; n = n->next) - { - if(str8_match(n->string, container_name, 0)) - { - ns_node = n; - break; - } - } - } - - // rjf: equip container info to udt, equip partial name to type - if(ns_node != 0) - { - RDIM_UDT *udt = dst_type->udt; - if(ns_node->scope != 0) - { - udt->container_scope = ns_node->scope; - } - else if(ns_node->ns != 0) - { - udt->container_namespace = ns_node->ns; - } - else if(ns_node->type != 0) - { - udt->container_type = ns_node->type; - } - dst_type->name = leaf_name; - } - } - } - } - - //- rjf: collect all lanes - if(lane_idx() == 0) - { - lanes_udts = push_array(scratch.arena, RDIM_UDTChunkList, lane_count()); - } - lane_sync_u64(&lanes_udts, 0); - lanes_udts[lane_idx()] = lane_udts; -#undef p2r_type_ptr_from_itype - } - lane_sync(); - - ////////////////////////////////////////////////////////////// - //- rjf: join all UDTs - // - RDIM_UDTChunkList all_udts = {0}; - ProfScope("join all UDTs") if(lane_idx() == 0) - { - for EachIndex(idx, lane_count()) - { - rdim_udt_chunk_list_concat_in_place(&all_udts, &lanes_udts[idx]); - } - } - lane_sync(); - RDIM_UDTChunkList *all_udts_ptr = &all_udts; - lane_sync_u64(&all_udts_ptr, 0); - all_udts = *all_udts_ptr; - - ////////////////////////////////////////////////////////////// - //- rjf: bundle all outputs - // - RDIM_BakeParams result = {0}; - { - //- rjf: produce top-level-info - RDIM_TopLevelInfo top_level_info = {0}; - { - top_level_info.arch = arch; - top_level_info.exe_name = str8_skip_last_slash(params->input_exe_name); - top_level_info.exe_hash = exe_hash; - top_level_info.voff_max = exe_voff_max; - if(!params->deterministic) - { - MemoryCopy(&top_level_info.guid.u8[0], &pdb_info->auth_guid.v[0], Min(sizeof top_level_info.guid.u8, sizeof pdb_info->auth_guid.v)); - top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL); - } - } - - //- rjf: build binary sections list - RDIM_BinarySectionList binary_sections = {0}; - if(params->subset_flags & RDIM_SubsetFlag_BinarySections) ProfScope("build binary section list") - { - COFF_SectionHeader *coff_ptr = coff_sections.v; - COFF_SectionHeader *coff_opl = coff_ptr + coff_sections.count; - for(;coff_ptr < coff_opl; coff_ptr += 1) - { - char *name_first = (char *)coff_ptr->name; - char *name_opl = name_first + sizeof(coff_ptr->name); - RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections); - sec->name = str8_cstring_capped(name_first, name_opl); - sec->flags = p2r_rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags); - sec->voff_first = coff_ptr->voff; - sec->voff_opl = coff_ptr->voff+coff_ptr->vsize; - sec->foff_first = coff_ptr->foff; - sec->foff_opl = coff_ptr->foff+coff_ptr->fsize; - } - } - - //- rjf: fill - result.subset_flags = params->subset_flags; - result.top_level_info = top_level_info; - result.binary_sections = binary_sections; - result.units = all_units; - result.namespaces = all_namespaces; - result.types = all_types; - result.udts = all_udts; - result.src_files = all_src_files; - result.line_tables = all_line_tables; - } - - lane_sync(); - scratch_end(scratch); - return result; -} - //////////////////////////////// //~ rjf: PDB -> (Codeview -> RDI) TPI Hash Table Building @@ -5595,7 +461,7 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) char *name_first = (char *)src->name; char *name_opl = name_first + sizeof(src->name); dst->name = str8_cstring_capped(name_first, name_opl); - dst->flags = p2r_rdi_binary_section_flags_from_coff_section_flags(src->flags); + dst->flags = c2r_rdi_binary_section_flags_from_coff_section_flags(src->flags); dst->voff = src->voff; dst->vsize = src->vsize; dst->foff = src->foff; diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index a4dfc87a..47df66f4 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -101,39 +101,6 @@ struct P2R_TypeIdChain CV_TypeId itype; }; -//////////////////////////////// -//~ rjf: Basic Helpers - -internal U64 p2r_end_of_cplusplus_container_name(String8 str); -internal U64 p2r_hash_from_voff(U64 voff); -internal int p2r_namespace_node_is_before(void *raw_a, void *raw_b); - -//////////////////////////////// -//~ rjf: COFF => RDI Canonical Conversions - -internal RDI_BinarySectionFlags p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags); - -//////////////////////////////// -//~ rjf: CodeView => RDI Canonical Conversions - -internal RDI_Arch p2r_rdi_arch_from_cv_arch(CV_Arch arch); -internal RDI_RegCode p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code); -internal RDI_Language p2r_rdi_language_from_cv_language(CV_Language language); -internal RDI_TypeKind p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type); -internal RDI_ChecksumKind p2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k); - -//////////////////////////////// -//~ rjf: Location Info Building Helpers - -internal RDI_RegCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg); -internal RDIM_Location p2r_location_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection); -internal void p2r_location_case_list_push_over_lvar_addr_range(Arena *arena, RDIM_LocationCaseList *loc_cases, RDIM_Location loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count); - -//////////////////////////////// -//~ rjf: Top-Level Conversion Entry Point - -internal RDIM_BakeParams p2r_convert(Arena *arena, P2R_ConvertParams *params); - //////////////////////////////// //~ rjf: PDB -> (Codeview -> RDI) TPI Hash Table Building From 3b22b1f13ec46cd31c7ef841abb625d2c3408425 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 19 Jun 2026 12:37:43 -0700 Subject: [PATCH 813/850] fix incorrect work happening w/ subsets turned off for psym generation --- src/lib_rdi_make/rdi_make.c | 2 +- src/rdi_make/rdi_make_local.c | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 49be12a0..86f9970d 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -1623,7 +1623,7 @@ RDI_PROC RDI_U32 rdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idxes, RDI_U32 count) { RDI_U32 idx = 0; - if(count != 0) + if(count != 0 && map->slots_count != 0) { RDI_U64 hash = rdim_hash_from_idx_run(idxes, count); RDI_U64 slot_idx = hash%map->slots_count; diff --git a/src/rdi_make/rdi_make_local.c b/src/rdi_make/rdi_make_local.c index 095672d7..258e2531 100644 --- a/src/rdi_make/rdi_make_local.c +++ b/src/rdi_make/rdi_make_local.c @@ -1948,7 +1948,12 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) RDI_U64 nodes_count; }; BakedNameMaps *baked_name_maps = 0; - ProfScope("bake name maps") + if(lane_idx() == 0) + { + baked_name_maps = push_array(scratch.arena, BakedNameMaps, 1); + } + lane_sync_u64(&baked_name_maps, 0); + if(params->subset_flags & RDIM_SubsetFlag_NameMaps) ProfScope("bake name maps") { Temp scratch2 = scratch_begin(&scratch.arena, 1); @@ -2022,7 +2027,6 @@ rdim_bake(Arena *arena, RDIM_BakeParams *params) // rjf: setup ProfScope("setup") if(lane_idx() == 0) { - baked_name_maps = push_array(scratch.arena, BakedNameMaps, 1); baked_name_maps->name_maps_count = RDI_NameMapKind_COUNT; baked_name_maps->name_maps = push_array(arena, RDI_NameMap, baked_name_maps->name_maps_count); RDI_U32 bucket_off = 0; From 9f82a6fe911b60616676b0e4e1f0baca05badac1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 19 Jun 2026 12:41:17 -0700 Subject: [PATCH 814/850] fix flipped interpretation of scope address ranges in dwarf - address class implies opl, not size --- src/radbin/radbin.c | 7 ++++++- src/rdi_from_dwarf/rdi_from_dwarf.c | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index 24d21823..ddf9c9ef 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -1137,13 +1137,18 @@ rb_thread_entry_point(void *p) RDI_Scope *root_scope = rdi_element_from_name_idx(rdi, Scopes, proc->root_scope_idx); if(root_scope->voff_range_opl > root_scope->voff_range_first) { + // rjf: dump function record RDIM_Rng1U64 voff_range = { *rdi_element_from_name_idx(rdi, ScopeVOffData, root_scope->voff_range_first), *rdi_element_from_name_idx(rdi, ScopeVOffData, root_scope->voff_range_opl - 1), }; - str8_list_pushf(arena, out, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, str8_from_rdi_string_idx(rdi, proc->name_string_idx)); + { + Temp scratch = scratch_begin(0, 0); + str8_list_pushf(arena, out, "FUNC %I64x %I64x %I64x %S\n", voff_range.min, voff_range.max-voff_range.min, 0ull, fully_qualified_str8_from_rdi_symbol(scratch.arena, rdi, proc)); + scratch_end(scratch); + } // rjf: dump function lines U64 unit_vmap_count = 0; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index f0a3a07a..b7412885 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -3080,11 +3080,11 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U64 voff_opl = 0; if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<val.u128.u64[0]; + voff_opl = hipc_attrib->val.addr; } else { - voff_opl = hipc_attrib->val.addr; + voff_opl = voff_base + hipc_attrib->val.u128.u64[0]; } rdim_rng1u64_list_push(arena, &ranges, (RDIM_Rng1U64){voff_base, voff_opl}); } From 15601d48d4c947f6fd204f0c19632fadf2a7708b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 19 Jun 2026 20:11:50 -0700 Subject: [PATCH 815/850] rdi_from_dwarf: use sibling tag attributes to gather root-level tag offsets when present - 15x speedup in the gather on webkit DWARFs... --- src/elf/elf_dump.c | 190 ++++++++++++++-------------- src/rdi_from_dwarf/rdi_from_dwarf.c | 47 +++++-- 2 files changed, 133 insertions(+), 104 deletions(-) diff --git a/src/elf/elf_dump.c b/src/elf/elf_dump.c index c948ed3c..b7e530ca 100644 --- a/src/elf/elf_dump.c +++ b/src/elf/elf_dump.c @@ -5,162 +5,162 @@ internal String8List elf_dump_note(Arena *arena, String8 raw_notes, ELF_Class elf_class, ELF_MachineKind e_machine) { Temp scratch = scratch_begin(&arena, 1); - + B32 is_bad_parse = 1; String8List strings = {0}; U64 cursor = 0; - + for (;cursor < raw_notes.size;) { U32 owner_size; U64 owner_size_size = str8_deserial_read_struct(raw_notes, cursor, &owner_size); if (owner_size_size == 0) { goto exit; } cursor += owner_size_size; - + U32 desc_size; U64 desc_size_size = str8_deserial_read_struct(raw_notes, cursor, &desc_size); if (desc_size_size == 0) { goto exit; } cursor += desc_size_size; - + ELF_NoteType note_type; U64 type_size = str8_deserial_read_struct(raw_notes, cursor, ¬e_type); if (type_size == 0) { goto exit; } cursor += type_size; - + if (cursor + owner_size > raw_notes.size) { goto exit; } String8 owner = str8_cstring_capped(raw_notes.str + cursor, raw_notes.str + cursor + owner_size); cursor += owner_size; - + if (cursor + desc_size > raw_notes.size) { goto exit; } String8 raw_desc = str8_substr(raw_notes, r1u64(cursor, cursor + desc_size)); cursor += desc_size; cursor = AlignPow2(cursor, 4); - + String8List desc_fmt = {0}; String8 note_type_str = {0}; if (str8_match(owner, str8_lit("GNU"), StringMatchFlag_CaseInsensitive)) { // format description switch (note_type) { - case GNU_NoteType_Abi: { - U64 desc_cursor = 0; - - GNU_AbiTag os = 0; - U64 os_size = str8_deserial_read_struct(raw_desc, desc_cursor, &os); - if (os_size == 0) { goto exit; } - cursor += os_size; - - U32 major = 0; - U64 major_size = str8_deserial_read_struct(raw_desc, desc_cursor, &major); - if (major_size == 0) { goto exit; } - cursor += major_size; - - U32 minor = 0; - U64 minor_size = str8_deserial_read_struct(raw_desc, desc_cursor, &minor); - if (minor_size == 0) { goto exit; } - cursor += minor_size; - - U32 sub_minor = 0; - U64 sub_minor_size = str8_deserial_read_struct(raw_desc, desc_cursor, &sub_minor); - if (sub_minor_size == 0) { goto exit; } - cursor += sub_minor_size; - - String8 os_str = gnu_string_from_abi_tag(os); - if (os_str.size == 0) os_str = str8f(scratch.arena, "0x%x", os); - - str8_list_pushf(scratch.arena, &desc_fmt, "OS: %S, ABI: %u.%u.%u", os_str, major, minor, sub_minor); - } break; - case GNU_NoteType_BuildId: { - String8List build_id = {0}; - for EachIndex(desc_cursor, desc_size) { - U8 v = 0; - U64 v_size = str8_deserial_read_struct(raw_desc, desc_cursor, &v); - if (v_size == 0) { goto exit; } - desc_cursor += v_size; - str8_list_pushf(scratch.arena, &build_id, "%02x", v); - } - String8 build_id_str = str8_list_join(scratch.arena, &build_id, 0); - str8_list_pushf(scratch.arena, &desc_fmt, "Build ID: %S", build_id_str); - } break; - case GNU_NoteType_PropertyType0: { - U64 align = elf_class == ELF_Class_64 ? 8 : 4; - for (U64 desc_cursor = 0; desc_cursor < raw_desc.size; ) { - GNU_Property type = 0; - U64 type_size = str8_deserial_read_struct(raw_desc, desc_cursor, &type); - if (type_size == 0) { goto exit; } - desc_cursor += type_size; - - U32 size = 0; - U64 size_size = str8_deserial_read_struct(raw_desc, desc_cursor, &size); - if (size_size == 0) { goto exit; } - desc_cursor += size_size; - - U32 flags = 0; - if (size == 4) { - U64 flags_size = str8_deserial_read_struct(raw_desc, desc_cursor, &flags); - if (flags_size == 0) { goto exit; } - desc_cursor += flags_size; + case GNU_NoteType_Abi: { + U64 desc_cursor = 0; + + GNU_AbiTag os = 0; + U64 os_size = str8_deserial_read_struct(raw_desc, desc_cursor, &os); + if (os_size == 0) { goto exit; } + cursor += os_size; + + U32 major = 0; + U64 major_size = str8_deserial_read_struct(raw_desc, desc_cursor, &major); + if (major_size == 0) { goto exit; } + cursor += major_size; + + U32 minor = 0; + U64 minor_size = str8_deserial_read_struct(raw_desc, desc_cursor, &minor); + if (minor_size == 0) { goto exit; } + cursor += minor_size; + + U32 sub_minor = 0; + U64 sub_minor_size = str8_deserial_read_struct(raw_desc, desc_cursor, &sub_minor); + if (sub_minor_size == 0) { goto exit; } + cursor += sub_minor_size; + + String8 os_str = gnu_string_from_abi_tag(os); + if (os_str.size == 0) os_str = str8f(scratch.arena, "0x%x", os); + + str8_list_pushf(scratch.arena, &desc_fmt, "OS: %S, ABI: %u.%u.%u", os_str, major, minor, sub_minor); + } break; + case GNU_NoteType_BuildId: { + String8List build_id = {0}; + for EachIndex(desc_cursor, desc_size) { + U8 v = 0; + U64 v_size = str8_deserial_read_struct(raw_desc, desc_cursor, &v); + if (v_size == 0) { goto exit; } + desc_cursor += v_size; + str8_list_pushf(scratch.arena, &build_id, "%02x", v); } - - switch (e_machine) { - case ELF_MachineKind_None: break; - case ELF_MachineKind_X86_64: { - String8 features = gnu_string_from_property_flags_x86(scratch.arena, type, flags); - str8_list_pushf(scratch.arena, &desc_fmt, "x86 features: %S", features); - } break; - default: NotImplemented; break; + String8 build_id_str = str8_list_join(scratch.arena, &build_id, 0); + str8_list_pushf(scratch.arena, &desc_fmt, "Build ID: %S", build_id_str); + } break; + case GNU_NoteType_PropertyType0: { + U64 align = elf_class == ELF_Class_64 ? 8 : 4; + for (U64 desc_cursor = 0; desc_cursor < raw_desc.size; ) { + GNU_Property type = 0; + U64 type_size = str8_deserial_read_struct(raw_desc, desc_cursor, &type); + if (type_size == 0) { goto exit; } + desc_cursor += type_size; + + U32 size = 0; + U64 size_size = str8_deserial_read_struct(raw_desc, desc_cursor, &size); + if (size_size == 0) { goto exit; } + desc_cursor += size_size; + + U32 flags = 0; + if (size == 4) { + U64 flags_size = str8_deserial_read_struct(raw_desc, desc_cursor, &flags); + if (flags_size == 0) { goto exit; } + desc_cursor += flags_size; + } + + switch (e_machine) { + case ELF_MachineKind_None: break; + case ELF_MachineKind_X86_64: { + String8 features = gnu_string_from_property_flags_x86(scratch.arena, type, flags); + str8_list_pushf(scratch.arena, &desc_fmt, "x86 features: %S", features); + } break; + default:{}break; + } + + desc_cursor = AlignPow2(desc_cursor, align); } - - desc_cursor = AlignPow2(desc_cursor, align); - } - } break; - default: NotImplemented; break; + } break; + default:{}break; } - + note_type_str = gnu_string_from_note_type(note_type); } else if (str8_match(owner, str8_lit("stapsdt"), StringMatchFlag_CaseInsensitive)) { if (note_type == ELF_NoteType_STapSdt) { U64 desc_cursor = 0; U64 addr_size = elf_class == ELF_Class_64 ? 8 : 4; - + U64 pc = 0; U64 pc_size = str8_deserial_read(raw_desc, desc_cursor, &pc, addr_size, addr_size); if (pc_size == 0) { goto exit; } desc_cursor += pc_size; - + U64 base_addr = 0; U64 base_addr_size = str8_deserial_read(raw_desc, desc_cursor, &base_addr, addr_size, addr_size); if (base_addr_size == 0) { goto exit; } desc_cursor += base_addr_size; - + U64 semaphore = 0; U64 semaphore_size = str8_deserial_read(raw_desc, desc_cursor, &semaphore, addr_size, addr_size); if (semaphore_size == 0) { goto exit; } desc_cursor += semaphore_size; - + String8 provider = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size); desc_cursor += provider.size + 1; if (desc_cursor > raw_desc.size) { goto exit; } - + String8 probe = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size); desc_cursor += probe.size + 1; if (desc_cursor > raw_desc.size) { goto exit; } - + String8 args = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size); desc_cursor += args.size + 1; if (desc_cursor > raw_desc.size) { goto exit; } - + str8_list_pushf(scratch.arena, &desc_fmt, "Provider: %S", provider); str8_list_pushf(scratch.arena, &desc_fmt, "Probe: %S", probe); str8_list_pushf(scratch.arena, &desc_fmt, "PC: 0x%I64x", pc); str8_list_pushf(scratch.arena, &desc_fmt, "Base: 0x%I64x", base_addr); str8_list_pushf(scratch.arena, &desc_fmt, "Semaphore: 0x%I64x", semaphore); str8_list_pushf(scratch.arena, &desc_fmt, "Arguments: %S", args); - + note_type_str = str8_lit("NT_STAPSDT"); } } - + if (note_type_str.size == 0) note_type_str = str8f(scratch.arena, "0x%x", note_type); - + str8_list_pushf(arena, &strings, "{"); str8_list_pushf(arena, &strings, " Owner: %S", owner); str8_list_pushf(arena, &strings, " Data Size: 0x%x", desc_size); @@ -173,9 +173,9 @@ elf_dump_note(Arena *arena, String8 raw_notes, ELF_Class elf_class, ELF_MachineK } str8_list_pushf(arena, &strings, "}"); } - + is_bad_parse = 0; -exit:; + exit:; if (is_bad_parse) { str8_list_pushf(arena, &strings, "ERROR: unable to parse data @ 0x%Ix64", cursor); } @@ -187,10 +187,10 @@ internal String8List elf_dump(Arena *arena, String8 raw_elf, ELF_DumpSubsetFlags flags) { Temp scratch = scratch_begin(&arena, 1); - + String8List strings = {0}; ELF_Bin elf = elf_bin_from_data(scratch.arena, raw_elf); - + if (flags & ELF_DumpSubsetFlag_Note) { for EachIndex(sect_idx, elf.shdrs.count) { ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx]; @@ -205,11 +205,11 @@ elf_dump(Arena *arena, String8 raw_elf, ELF_DumpSubsetFlags flags) } } } - + String8 out = str8_list_join(arena, &strings, &(StringJoin){.sep=str8_lit("\n"), .post=str8_lit("\n")}); String8List result = {0}; str8_list_push(arena, &result, out); - + scratch_end(scratch); return result; } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index b7412885..5520f3b7 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1002,14 +1002,36 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW2_Tag tag = {0}; off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); - //- rjf: do tree navigations - if(tag.has_children) + //- rjf: look for sibling attribute fast path + B32 sibling_encoded = 0; + U64 sibling_off = 0; + for EachNode(n, DW2_AttribNode, tag.attribs.first) { - depth += 1; + if(n->v.attrib_kind == DW_AttribKind_Sibling) + { + sibling_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); + sibling_encoded = 1; + break; + } } - if(tag.kind == DW_TagKind_Null) + + //- rjf: if we have a sibling link, follow it -> depth stays the same + if(sibling_encoded && sibling_off >= off) { - depth -= 1; + off = sibling_off; + } + + //- rjf: otherwise, do tree navigations... + else + { + if(tag.has_children) + { + depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } } scratch_end(scratch3); @@ -1149,7 +1171,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) for EachInRange(unit_idx, range) { Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - unit_deduped_tag_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 256 + 1; + unit_deduped_tag_maps[unit_idx].slots_count = dim_1u64(unit_info_tag_range) / 32 + 1; unit_deduped_tag_maps[unit_idx].slots = push_array(scratch.arena, D2R_UnitDedupedTagNode *, unit_deduped_tag_maps[unit_idx].slots_count); } lane_sync(); @@ -1168,6 +1190,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { break; } + ProfBegin("gather unique tags work"); Temp work_scratch = scratch_begin(&scratch.arena, 1); //- rjf: unpack work @@ -1188,6 +1211,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U64 container_ancestor_info_off; U64 hash_seed; }; + U64 tags_to_dedup_count = 0; D2R_TagNode *first_tag_to_dedup = 0; D2R_TagNode *last_tag_to_dedup = 0; for(U64 root_tag_idx = origin_unit_root_tag_idx_range.min; @@ -1265,6 +1289,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) n->container_ancestor_info_off = container_ancestor_info_off; n->hash_seed = top_parent ? top_parent->hash_seed : 0; SLLQueuePush(first_tag_to_dedup, last_tag_to_dedup, n); + tags_to_dedup_count += 1; } // rjf: compute hash seed for this tag @@ -1321,6 +1346,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } //- rjf: hash all tags we need to deduplicate & gather + U64 total_tag_count_this_work = 0; for(D2R_TagNode *tag_n = first_tag_to_dedup; tag_n != 0; tag_n = tag_n->next) { Temp dedup_root_scratch = scratch_begin(&scratch.arena, 1); @@ -1331,6 +1357,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //- rjf: hash all tags & dependency tag trees U64 hash = hash_seed; + ProfScope("hash tag trees & dependencies") { typedef struct TagTask TagTask; struct TagTask @@ -1373,6 +1400,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // rjf: read tag DW2_Tag tag = {0}; t_off += dw2_read_tag(tag_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, t_off, &tag); + total_tag_count_this_work += 1; // rjf: determine if tag should be skipped from hashing B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || @@ -1624,7 +1652,8 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } scratch_end(dedup_root_scratch); } - + // ProfMsg("work_idx %I64u: %I64u tags encountered", work_idx, total_tag_count_this_work); + ProfEnd(); scratch_end(work_scratch); } lane_sync(); @@ -2896,7 +2925,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { U64 voff_base = lopc_attrib->val.addr - base_vaddr; U64 voff_opl = 0; - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<version, unit_parse_ctx->exts, hipc_attrib->val.kind) & DW_AttribClass_Address) { voff_opl = voff_base + hipc_attrib->val.u128.u64[0]; } @@ -3078,7 +3107,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { U64 voff_base = lopc_attrib->val.addr - base_vaddr; U64 voff_opl = 0; - if(dw_attrib_class_from_form_kind(unit_parse_ctx->version, unit_parse_ctx->exts, hipc_attrib->val.kind) & (1<version, unit_parse_ctx->exts, hipc_attrib->val.kind) & DW_AttribClass_Address) { voff_opl = hipc_attrib->val.addr; } From 3fd7b40f4d87507b3cdd757084bb4cb09ca55a1d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 18 Jun 2026 09:12:58 -0700 Subject: [PATCH 816/850] remove 'global stream' specialities in codeview -> rdi conversion; just have the caller pass all units, and in the case of pdb conversion, we simply make a global unit at that layer. --- project.raddbg | 2 +- src/rdi_from_codeview/rdi_from_codeview.c | 78 ++++++++++------------- src/rdi_from_codeview/rdi_from_codeview.h | 5 +- src/rdi_from_pdb/rdi_from_pdb.c | 21 ++++-- 4 files changed, 49 insertions(+), 57 deletions(-) diff --git a/project.raddbg b/project.raddbg index 1bdae732..27a3760b 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,6 +7,7 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 + enabled: 1 } target: { @@ -34,5 +35,4 @@ target: { executable: "build/ryan_scratch.exe" working_directory: build - enabled: 1 } diff --git a/src/rdi_from_codeview/rdi_from_codeview.c b/src/rdi_from_codeview/rdi_from_codeview.c index 0dc2494d..0fceeffc 100644 --- a/src/rdi_from_codeview/rdi_from_codeview.c +++ b/src/rdi_from_codeview/rdi_from_codeview.c @@ -661,9 +661,6 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) ////////////////////////////////////////////////////////////// //- rjf: unpack params // - U64 all_syms_count = params->all_syms_count; - CV_SymParsed **all_syms = params->all_syms; - CV_C13Parsed **all_c13s = params->all_c13s; U64 comp_units_count = params->comp_units_count; CV2R_CompUnit *comp_units = params->comp_units; U64 sections_count = params->sections_count; @@ -728,9 +725,9 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) RDI_Arch arch = RDI_Arch_NULL; U64 arch_addr_size = 0; { - for EachIndex(idx, all_syms_count) + for EachIndex(idx, comp_units_count) { - arch = cv2r_rdi_arch_from_cv_arch(all_syms[idx]->info.arch); + arch = cv2r_rdi_arch_from_cv_arch(comp_units[idx].sym->info.arch); if(arch != RDI_Arch_NULL) { break; @@ -747,10 +744,10 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) U64 *symbol_count_prediction_ptr = &symbol_count_prediction; lane_sync_u64(&symbol_count_prediction_ptr, 0); U64 lane_sym_count = 0; - Rng1U64 range = lane_range(all_syms_count); + Rng1U64 range = lane_range(comp_units_count); for EachInRange(idx, range) { - lane_sym_count += all_syms[idx]->sym_ranges.count; + lane_sym_count += comp_units[idx].sym->sym_ranges.count; } ins_atomic_u64_add_eval(symbol_count_prediction_ptr, lane_sym_count); lane_sync(); @@ -761,7 +758,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) //- rjf: build link name map // CV2R_LinkNameMap *link_name_map = 0; - ProfScope("build link name map") if(all_syms_count != 0 && lane_idx() == 0) + ProfScope("build link name map") if(comp_units_count != 0 && lane_idx() == 0) { // rjf: set up { @@ -773,7 +770,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // rjf: fill if(params->subset_flags & RDIM_SubsetFlag_Procedures) { - CV_SymParsed *sym = all_syms[0]; + CV_SymParsed *sym = comp_units[0].sym; for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) { switch(iter.kind) @@ -810,8 +807,8 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) //- rjf: prep outputs ProfScope("prep outputs") if(lane_idx() == 0) { - unit_file_stubs = push_array(scratch.arena, CV2R_SrcFileStubArray, comp_units_count + 1); - unit_file_paths_hashes = push_array(scratch.arena, U64Array, comp_units_count + 1); + unit_file_stubs = push_array(scratch.arena, CV2R_SrcFileStubArray, comp_units_count); + unit_file_paths_hashes = push_array(scratch.arena, U64Array, comp_units_count); } lane_sync_u64(&unit_file_stubs, 0); lane_sync_u64(&unit_file_paths_hashes, 0); @@ -833,26 +830,15 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) { //- rjf: take next unit U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(unit_idx >= comp_units_count + 1) + if(unit_idx >= comp_units_count) { break; } //- rjf: unpack unit - CV_SymParsed *sym = all_syms[unit_idx]; - CV_C13Parsed *c13 = all_c13s[unit_idx]; - - //- rjf: produce obj name/path - String8 obj_name = str8_lit("*global*"); - if(unit_idx > 0) - { - obj_name = comp_units[unit_idx-1].obj_name; - if(str8_match(obj_name, str8_lit("* Linker *"), 0) || - str8_match(obj_name, str8_lit("Import:"), StringMatchFlag_RightSideSloppy)) - { - MemoryZeroStruct(&obj_name); - } - } + CV_SymParsed *sym = comp_units[unit_idx].sym; + CV_C13Parsed *c13 = comp_units[unit_idx].c13; + String8 obj_name = comp_units[unit_idx].obj_name; String8 obj_folder_path = backslashed_from_str8(scratch2.arena, str8_chop_last_slash(obj_name)); //- rjf: find all inline site symbols & gather file stubs @@ -1163,13 +1149,13 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) all_units_ptr = push_array(scratch.arena, RDIM_UnitChunkList, 1); if(params->subset_flags & RDIM_SubsetFlag_Units) { - for EachIndex(idx, comp_units_count + 1) + for EachIndex(idx, comp_units_count) { - rdim_unit_chunk_list_push(arena, all_units_ptr, comp_units_count + 1); + rdim_unit_chunk_list_push(arena, all_units_ptr, comp_units_count); } } - units_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, comp_units_count + 1); - units_first_inline_site_line_tables = push_array(scratch.arena, RDIM_LineTable *, comp_units_count + 1); + units_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, comp_units_count); + units_first_inline_site_line_tables = push_array(scratch.arena, RDIM_LineTable *, comp_units_count); } lane_sync_u64(&all_units_ptr, 0); lane_sync_u64(&units_line_tables, 0); @@ -1195,9 +1181,9 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) } Temp scratch = scratch_begin(&arena, 1); RDIM_LineTableChunkList *dst_line_tables = &units_line_tables[unit_idx]; - CV2R_CompUnit *src_unit = (unit_idx > 0 ? &comp_units[unit_idx-1] : 0); - CV_SymParsed *src_unit_sym = all_syms[unit_idx]; - CV_C13Parsed *src_unit_c13 = all_c13s[unit_idx]; + CV2R_CompUnit *src_unit = &comp_units[unit_idx]; + CV_SymParsed *src_unit_sym = comp_units[unit_idx].sym; + CV_C13Parsed *src_unit_c13 = comp_units[unit_idx].c13; RDIM_Unit *dst_unit = 0; if(params->subset_flags & RDIM_SubsetFlag_Units) { dst_unit = &units[unit_idx]; } @@ -1525,7 +1511,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) RDIM_LineTableChunkList *all_line_tables_ptr = &all_line_tables; ProfScope("join all line tables") if(lane_idx() == 0) { - for EachIndex(idx, comp_units_count + 1) + for EachIndex(idx, comp_units_count) { rdim_line_table_chunk_list_concat_in_place(&all_line_tables, &units_line_tables[idx]); } @@ -2818,11 +2804,11 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) for(;;) { U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) + if(sym_idx >= comp_units_count) { break; } - CV_SymParsed *sym = all_syms[sym_idx]; + CV_SymParsed *sym = comp_units[sym_idx].sym; for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) { switch(iter.kind) @@ -2875,11 +2861,11 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) for(;;) { U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) + if(sym_idx >= comp_units_count) { break; } - CV_SymParsed *sym = all_syms[sym_idx]; + CV_SymParsed *sym = comp_units[sym_idx].sym; for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) { // rjf: get global symbol name @@ -3123,8 +3109,8 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // if(lane_idx() == 0) { - syms_typedefs = push_array(arena, RDIM_TypeChunkList, all_syms_count); - syms_scopes_that_are_namespaces = push_array(arena, ScopeNamespaceList, all_syms_count); + syms_typedefs = push_array(arena, RDIM_TypeChunkList, comp_units_count); + syms_scopes_that_are_namespaces = push_array(arena, ScopeNamespaceList, comp_units_count); } lane_sync_u64(&syms_typedefs, 0); lane_sync_u64(&syms_scopes_that_are_namespaces, 0); @@ -3150,14 +3136,14 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) { //- rjf: take next sym U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter) - 1; - if(sym_idx >= all_syms_count) + if(sym_idx >= comp_units_count) { break; } //- rjf: unpack sym Temp scratch = scratch_begin(&arena, 1); - CV_SymParsed *sym = all_syms[sym_idx]; + CV_SymParsed *sym = comp_units[sym_idx].sym; RDIM_Unit *sym_unit = &all_units_ptr->first->v[sym_idx]; RDIM_SymbolChunkList *sym_procedures = &sym_unit->procedures; RDIM_SymbolChunkList *sym_global_variables = &sym_unit->global_variables; @@ -3429,7 +3415,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) //- rjf: UDT (typedefs) case CV_SymKind_UDT: - if(sym == all_syms[0] && top_scope_node == 0) + if(sym == comp_units[0].sym && top_scope_node == 0) { if(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs|RDIM_SubsetFlag_TypeNameMap)) { @@ -4209,7 +4195,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // if(lane_idx() == 0) { - CV_SymParsed *sym = all_syms[0]; + CV_SymParsed *sym = comp_units[0].sym; for(CV_RecIter iter = {0}; cv_rec_next(sym->data, &sym->sym_ranges, 0, &iter);) { RDIM_Unit *sym_unit = &all_units_ptr->first->v[0]; @@ -4280,7 +4266,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) // if(lane_idx() == 0) { - for EachIndex(sym_idx, all_syms_count) + for EachIndex(sym_idx, comp_units_count) { ScopeNamespaceList *scopes_that_are_namespaces = &syms_scopes_that_are_namespaces[sym_idx]; for(ScopeNamespaceNode *scope_n = scopes_that_are_namespaces->first; scope_n != 0; scope_n = scope_n->next) @@ -4341,7 +4327,7 @@ cv2r_convert(Arena *arena, CV2R_ConvertParams *params) lane_sync_u64(&all_types_ptr, 0); if(lane_idx() == lane_from_task_idx(7)) ProfScope("join typedefs") { - for EachIndex(idx, all_syms_count) + for EachIndex(idx, comp_units_count) { rdim_type_chunk_list_concat_in_place(all_types__pre_typedefs_ptr, &syms_typedefs[idx]); } diff --git a/src/rdi_from_codeview/rdi_from_codeview.h b/src/rdi_from_codeview/rdi_from_codeview.h index 71d47fe4..85e49df6 100644 --- a/src/rdi_from_codeview/rdi_from_codeview.h +++ b/src/rdi_from_codeview/rdi_from_codeview.h @@ -13,6 +13,8 @@ struct CV2R_CompUnit String8 obj_name; String8 group_name; RDIM_Rng1U64ChunkList ranges; + CV_SymParsed *sym; + CV_C13Parsed *c13; }; typedef struct CV2R_Section CV2R_Section; @@ -69,9 +71,6 @@ struct CV2R_ConvertParams String8 exe_name; String8 exe_data; Guid guid; - U64 all_syms_count; - CV_SymParsed **all_syms; - CV_C13Parsed **all_c13s; U64 comp_units_count; CV2R_CompUnit *comp_units; U64 comp_unit_contributions_count; diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index b5d59c8e..e5bc7465 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -403,7 +403,7 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) ////////////////////////////////////////////////////////////// //- rjf: produce cv2r units from pdb's units // - U64 cv2r_comp_units_count = comp_units->count; + U64 cv2r_comp_units_count = comp_units->count + 1; // +1 for global info stream CV2R_CompUnit *cv2r_comp_units = 0; { if(lane_idx() == 0) @@ -414,9 +414,19 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) Rng1U64 range = lane_range(cv2r_comp_units_count); for EachInRange(idx, range) { - cv2r_comp_units[idx].obj_name = comp_units->units[idx]->obj_name; - cv2r_comp_units[idx].group_name = comp_units->units[idx]->group_name; - cv2r_comp_units[idx].ranges = unit_ranges[idx+1]; + if(idx > 0) + { + PDB_CompUnit *src_unit = comp_units->units[idx-1]; + cv2r_comp_units[idx].obj_name = src_unit->obj_name; + cv2r_comp_units[idx].group_name = src_unit->group_name; + } + else + { + cv2r_comp_units[idx].obj_name = s("*global"); + } + cv2r_comp_units[idx].ranges = unit_ranges[idx]; + cv2r_comp_units[idx].sym = all_syms[idx]; + cv2r_comp_units[idx].c13 = all_c13s[idx]; } lane_sync(); } @@ -491,9 +501,6 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) cv2r_params.exe_name = params->input_exe_name; cv2r_params.exe_data = params->input_exe_data; cv2r_params.guid = pdb_info->auth_guid; - cv2r_params.all_syms_count = all_syms_count; - cv2r_params.all_syms = all_syms; - cv2r_params.all_c13s = all_c13s; cv2r_params.comp_units_count = cv2r_comp_units_count; cv2r_params.comp_units = cv2r_comp_units; cv2r_params.comp_unit_contributions_count = cv2r_comp_unit_contributions_count; From fe2aa4d14c8c161b9a09ea72a5d9fe161d797c39 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 18 Jun 2026 22:06:04 -0600 Subject: [PATCH 817/850] com shim for launching raddbg in cli mode, for proper console subsystem style usage of packaged bin utilities; checkpoint on eval2 --- build.bat | 10 +- project.4coder | 2 +- project.raddbg | 2 +- src/base/base_processes.h | 2 +- src/com_shim/com_shim_main.c | 64 +++++ src/dbg_info/dbg_info.c | 2 + src/eval2/eval2.c | 457 ++++++++++++++++++++++++++----- src/eval2/eval2.h | 89 ++++-- src/eval2/eval2.mdesk | 56 ++-- src/eval2/generated/eval2.meta.c | 8 +- src/eval2/generated/eval2.meta.h | 8 +- src/lib_rdi/rdi.c | 4 +- src/linux/base/linux_base.c | 4 +- src/raddbg/raddbg_main.c | 10 + src/rdi/rdi.mdesk | 4 +- src/rdi_from_pdb/rdi_from_pdb.c | 2 +- src/scratch/ryan_scratch.c | 62 ++++- src/win32/base/win32_base.c | 4 +- 18 files changed, 638 insertions(+), 152 deletions(-) create mode 100644 src/com_shim/com_shim_main.c diff --git a/build.bat b/build.bat index 5c9c71d4..bc8b1c38 100644 --- a/build.bat +++ b/build.bat @@ -36,8 +36,8 @@ if "%debug%"=="1" set release=0 && echo [debug mode] if "%release%"=="1" set debug=0 && echo [release mode] if "%msvc%"=="1" set clang=0 && echo [msvc compile] if "%clang%"=="1" set msvc=0 && echo [clang compile] -if "%~1"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 -if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 +if "%~1"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1&& set com_shim=1&& set raddbg_com_shim=1 +if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1&& set com_shim=1&& set raddbg_com_shim=1 :: --- Unpack Command Line Build Arguments ------------------------------------ set auto_compile_flags= @@ -141,6 +141,7 @@ popd pushd build if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg.exe || exit /b 1 if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% -DWM_STUB=1 -DR_BACKEND=R_BACKEND_STUB ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg_non_graphical.exe || exit /b 1 +if "%com_shim%"=="1" set didbuild=1 && %compile% ..\src\com_shim\com_shim_main.c %compile_link% %out%com_shim.exe || exit /b 1 if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% %linker% /NOIMPLIB %linker% /NATVIS:"%~dp0\src\linker\linker.natvis" %out%radlink.exe || exit /b 1 if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% %out%radbin.exe || exit /b 1 if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% %out%raddump.exe || exit /b 1 @@ -166,6 +167,11 @@ if "%mule_peb_trample%"=="1" ( ) popd +:: --- Set Up Debugger Com Shim ----------------------------------------------- +pushd build +if "%raddbg_com_shim%"=="1" copy /y com_shim.exe raddbg.com +popd + :: --- Warn On No Builds ------------------------------------------------------ if "%didbuild%"=="" ( echo [WARNING] no valid build target specified; must use build target names as arguments to this script, like `build raddbg` or `build rdi_from_pdb`. diff --git a/project.4coder b/project.4coder index 26b9969f..49daa1cc 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin no_meta", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build ryan_scratch && pushd build && ryan_scratch.exe", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 27a3760b..1bdae732 100644 --- a/project.raddbg +++ b/project.raddbg @@ -7,7 +7,6 @@ target: working_directory: "../raddebugger" arguments: "--user:C:/devel/raddebugger/build/raddbg_test.user" debug_subprocesses: 0 - enabled: 1 } target: { @@ -35,4 +34,5 @@ target: { executable: "build/ryan_scratch.exe" working_directory: build + enabled: 1 } diff --git a/src/base/base_processes.h b/src/base/base_processes.h index 33d3bb13..ce50a222 100644 --- a/src/base/base_processes.h +++ b/src/base/base_processes.h @@ -70,7 +70,7 @@ internal Process launch_cmd_linef(char *fmt, ...); //////////////////////////////// //~ rjf: @per_os_impl Aborting -internal void abort_self(S32 exit_code); +internal void abort_self(U64 exit_code); //////////////////////////////// //~ rjf: @per_os_impl Process Info diff --git a/src/com_shim/com_shim_main.c b/src/com_shim/com_shim_main.c new file mode 100644 index 00000000..5ccce4c0 --- /dev/null +++ b/src/com_shim/com_shim_main.c @@ -0,0 +1,64 @@ +// Copyright (c) Epic Games Tools +// Licensed under the MIT license (https://opensource.org/license/mit/) + +#define NO_ASYNC 1 +#define BUILD_CONSOLE_INTERFACE 1 +#define BUILD_TITLE "The RAD Debugger (Command Line Launcher)" +#include "base/base_inc.h" +#include "base/base_inc.c" + +internal void +entry_point(CmdLine *cmd_line) +{ + Temp scratch = scratch_begin(0, 0); + B32 wait_for_process = cmd_line_has_flag(cmd_line, s("cli")) || cmd_line_has_flag(cmd_line, s("bin")); + String8List command_parts = {0}; + String8 exe_name = str8f(scratch.arena, "%S.exe", str8_chop_last_dot(cmd_line->exe_name)); + if(str8_match(exe_name, cmd_line->exe_name, 0)) + { + fprintf(stderr, + "ERROR: Attempting to launch %.*s recursively.\n" + "\n" + "This executable needs to be used with a .com extension next to the real target\n" + "executable, with the same name, but with a .exe extension. This guarantees that\n" + "cmd.exe will prefer launching this .com file when the executable name is used,\n" + "allowing the same executable to be used in the Windows command-line subsystem\n" + "style when launched from the command line, but used graphically when launched\n" + "via Explorer.\n\n", str8_varg(exe_name)); + fflush(stderr); + } + else + { + // NOTE(rjf): sub-processes must be killed if the parent process + // is killed, if we're waiting for it + if(wait_for_process) + { +#if OS_WINDOWS + HANDLE job_handle = CreateJobObjectA(0, 0); + JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { .BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE }; + SetInformationJobObject(job_handle, JobObjectExtendedLimitInformation, &job_info, sizeof(job_info)); + AssignProcessToJobObject(job_handle, GetCurrentProcess()); +#endif + } + str8_list_push(scratch.arena, &command_parts, exe_name); + for EachIndex(idx, cmd_line->argc) + { + String8 arg = str8_cstring(cmd_line->argv[idx]); + str8_list_push(scratch.arena, &command_parts, arg); + } + StringJoin join = {.sep = s(" ")}; + String8 command = str8_list_join(scratch.arena, &command_parts, &join); + Process process = launch_cmd_line(command); + if(wait_for_process) + { + U64 exit_code = 0; + process_join(process, max_U64, &exit_code); + abort_self(exit_code); + } + else + { + process_detach(process); + } + } + scratch_end(scratch); +} diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 0ec80608..fbbe8f63 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -693,6 +693,7 @@ di_async_tick(void) B32 og_is_downloading = 0; if(og_path.size != 0) { +#if defined(SYMBOL_SERVER_H) B32 file_is_present = (properties_from_file_path(og_path).modified != 0); if(!file_is_present) { @@ -715,6 +716,7 @@ di_async_tick(void) } } } +#endif } //- rjf: analyze O.G. debug info diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 15fcee7e..4754c20d 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -95,20 +95,23 @@ internal E2_Expr * e2_expr_from_name(E2_ExprMap *map, String8 name) { E2_Expr *expr = &e2_expr_nil; - U64 hash = u64_hash_from_str8(name); - U64 slot_idx = hash%map->slots_count; - E2_ExprMapNode *node = 0; - for(E2_ExprMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) + if(map->slots_count != 0) { - if(str8_match(n->name, name, 0)) + U64 hash = u64_hash_from_str8(name); + U64 slot_idx = hash%map->slots_count; + E2_ExprMapNode *node = 0; + for(E2_ExprMapNode *n = map->slots[slot_idx]; n != 0; n = n->next) { - node = n; - break; + if(str8_match(n->name, name, 0)) + { + node = n; + break; + } + } + if(node != 0) + { + expr = node->expr; } - } - if(node != 0) - { - expr = node->expr; } return expr; } @@ -765,6 +768,8 @@ e2_expr_unary_op(Arena *arena, E2_TypeKey type_key, RDI_EvalOp op, E2_Expr *oper e->type_key = type_key; e->op = op; e->mode = E2_Mode_Value; + e->val.u512.u8[0] = e2_type_group_from_kind(e2_type_kind_from_key(type_key)); + e->val.u512.u8[1] = 8*e2_byte_size_from_type_key(type_key); e2_expr_push_child(e, operand); return e; } @@ -1125,21 +1130,40 @@ e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *of } internal E2_Parse -e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, String8 string) +e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, E2_Expr *access_result, String8 string) { U64 off = state->string_off; - E2_Parse parse = {E2_Status_Error, .expr = &e2_expr_nil, .access_expr = &e2_expr_nil}; + E2_Parse parse = {E2_ParseStatus_Error, .expr = &e2_expr_nil, .params_expr = &e2_expr_nil}; + E2_Expr *next_access_result = access_result; //- rjf: parse & attach to top parsing task - if we don't have a top task // then it is just the result E2_Expr *expr = &e2_expr_nil; for(B32 done = 0; !done;) { + U64 start_off = off; S64 max_precedence = state->top_task ? state->top_task->max_precedence : max_S64; + B32 need_new_expr = (expr == &e2_expr_nil && !state->caller_info_completes_task); E2_Token token = {0}; + //- rjf: skip leading whitespace / comments + for(;;) + { + E2_Token next_token = {0}; + U64 next_off = off + e2_read_token(string, off, &next_token); + if(next_token.kind == E2_TokenKind_Whitespace || + next_token.kind == E2_TokenKind_Comment) + { + off = next_off; + } + else + { + break; + } + } + //- rjf: nested sub-expressions - if(expr == &e2_expr_nil && e2_try_token(string, E2_TokenKind_Symbol, s("("), &off, &token)) + if(need_new_expr && e2_try_token(string, E2_TokenKind_Symbol, s("("), &off, &token)) { E2_ParseTask *task = state->free_task; if(task != 0) @@ -1158,11 +1182,12 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S SLLStackPush(state->top_task, task); } - //- rjf: prefix unaries - else if(expr == &e2_expr_nil && e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token)) + //- rjf: symbols (possible prefix unaries, *or* unexpected) + else if(need_new_expr && e2_try_token(string, E2_TokenKind_Symbol, s(""), &off, &token)) { // rjf: string -> operator kind E2_OpKind op_kind = E2_OpKind_Null; + String8 closer = {0}; { String8 token_string = str8_substr(string, token.range); for EachNonZeroEnumVal(E2_OpKind, k) @@ -1172,6 +1197,7 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S str8_match(token_string, e2_op_kind_info_table[k].pre, 0)) { op_kind = k; + closer = e2_op_kind_info_table[k].post; break; } } @@ -1194,25 +1220,106 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S task->child_count_target = 1; task->op_kind = op_kind; task->max_precedence = e2_op_kind_info_table[op_kind].precedence; + task->expected_closer = closer; SLLStackPush(state->top_task, task); } + + // rjf: report unexpected symbols + if(op_kind == E2_OpKind_Null) + { + String8 token_string = str8_substr(string, token.range); + e2_msgf(arena, &parse.msgs, token.range, "Unexpected `%S`.", token_string); + } } - //- rjf: leaf identifiers - else if(expr == &e2_expr_nil && e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token)) + //- rjf: identifiers with an active dot op kind -> member access + else if(need_new_expr && state->top_task != 0 && state->top_task->op_kind == E2_OpKind_Dot && e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token)) { - String8 identifier = str8_substr(string, token.range); - expr = e2_expr_from_name(expr_map, identifier); - if(expr == &e2_expr_nil) + // rjf: if we have a caller-provided access result, use that as our new expression + if(next_access_result != &e2_expr_nil) + { + expr = next_access_result; + next_access_result = &e2_expr_nil; + } + + // rjf: if we don't, ask for it - reset the offset to before this token + else { done = 1; - parse.status = E2_Status_MissedIdentifierResolution; + parse.status = E2_ParseStatus_MemberAccess; + parse.expr = state->top_task->first_child ? state->top_task->first_child->v : &e2_expr_nil; + parse.member_name = str8_substr(string, token.range); + state->last_requested_member_name = parse.member_name; + off = start_off; + } + } + + //- rjf: standalone identifiers (also could be operator keyword) + else if(need_new_expr && e2_try_token(string, E2_TokenKind_Identifier, s(""), &off, &token)) + { + String8 identifier = str8_substr(string, token.range); + B32 identifier_mapped = 0; + + // rjf: first try to resolve as an operator name + if(!identifier_mapped) + { + // rjf: string -> op kind + E2_OpKind op_kind = E2_OpKind_Null; + { + String8 token_string = str8_substr(string, token.range); + for EachNonZeroEnumVal(E2_OpKind, k) + { + if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_UnaryPrefix && + e2_op_kind_info_table[k].precedence <= max_precedence && + str8_match(token_string, str8_skip_chop_whitespace(e2_op_kind_info_table[k].pre), 0)) + { + op_kind = k; + break; + } + } + } + + // rjf: push task for operand + if(op_kind != E2_OpKind_Null) + { + identifier_mapped = 1; + E2_ParseTask *task = state->free_task; + if(task != 0) + { + SLLStackPop(state->free_task); + } + else + { + task = push_array_no_zero(arena, E2_ParseTask, 1); + } + MemoryZeroStruct(task); + task->src_range = token.range; + task->child_count_target = 1; + task->op_kind = op_kind; + task->max_precedence = e2_op_kind_info_table[op_kind].precedence; + SLLStackPush(state->top_task, task); + } + } + + // rjf: try to resolve via caller-provided named expressions + if(!identifier_mapped) + { + expr = e2_expr_from_name(expr_map, identifier); + identifier_mapped = (expr != &e2_expr_nil); + } + + // rjf: couldn't map -> ask caller to resolve it + if(!identifier_mapped) + { + done = 1; + parse.status = E2_ParseStatus_MissedIdentifierResolution; parse.missed_identifier = identifier; + off = start_off; } } //- rjf: leaf numerics - else if(expr == &e2_expr_nil && e2_try_token(string, E2_TokenKind_Numeric, s(""), &off, &token)) + else if(need_new_expr && e2_try_token(string, E2_TokenKind_Numeric, s(""), &off, &token)) { U64 u64_val = 0; String8 numeric_string = str8_substr(string, token.range); @@ -1261,22 +1368,34 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S } } - //- rjf: extend parsed expression tree with trailing binary operators - if(expr != &e2_expr_nil) + //- rjf: extend parsed expression tree with trailing operators + if(!state->caller_info_completes_task && expr != &e2_expr_nil) { U64 trailing_symbol_off = off; if(e2_try_token(string, E2_TokenKind_Symbol, s(""), &trailing_symbol_off, &token)) { // rjf: token string -> operator kind E2_OpKind op_kind = E2_OpKind_Null; + U64 child_count_target = 2; + String8 splitter = {0}; + String8 closer = {0}; + B32 splitter_is_required = 0; { String8 token_string = str8_substr(string, token.range); for EachNonZeroEnumVal(E2_OpKind, k) { - if(e2_op_kind_info_table[k].parse_kind == E2_OpParseKind_Binary && - e2_op_kind_info_table[k].precedence <= max_precedence && - str8_match(token_string, e2_op_kind_info_table[k].sep, 0)) + E2_OpInfo *op_info = &e2_op_kind_info_table[k]; + if(op_info->precedence <= max_precedence && str8_match(token_string, op_info->sep, 0)) { + switch(op_info->parse_kind) + { + default:{}break; + case E2_OpParseKind_Binary: {child_count_target = 2;}break; + case E2_OpParseKind_Ternary: {child_count_target = 3; splitter_is_required = 1;}break; + case E2_OpParseKind_Call: {child_count_target = max_U64;}break; + } + splitter = op_info->chain; + closer = op_info->post; op_kind = k; break; } @@ -1298,9 +1417,12 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S MemoryZeroStruct(task); task->src_range = token.range; task->child_count = 0; - task->child_count_target = 2; + task->child_count_target = child_count_target; task->op_kind = op_kind; task->max_precedence = e2_op_kind_info_table[op_kind].precedence; + task->expected_splitter = splitter; + task->expected_closer = closer; + task->splitter_is_required = splitter_is_required; SLLStackPush(state->top_task, task); off = trailing_symbol_off; } @@ -1309,29 +1431,52 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S //- rjf: attach formed expressions to parent task exprs; pop tasks when they're done. // if we have no parent task, then we just fill the result, and we're done with the parse. - if(expr != &e2_expr_nil) + if(state->caller_info_completes_task || expr != &e2_expr_nil) { //- rjf: pop finished expressions - for(;state->top_task != 0;) + for(;state->top_task != 0 && !done;) { //- rjf: gather finished expression to current task; increase task child count - E2_ExprNode *n = push_array(arena, E2_ExprNode, 1); - SLLQueuePush(state->top_task->first_child, state->top_task->last_child, n); - n->v = expr; - state->top_task->child_count += 1; - - //- rjf: task child count hits limit -> complete this subtree - if(state->top_task->child_count >= state->top_task->child_count_target) + if(!state->caller_info_completes_task) { - //- rjf: release task + E2_ExprNode *n = push_array(arena, E2_ExprNode, 1); + SLLQueuePush(state->top_task->first_child, state->top_task->last_child, n); + n->v = expr; + state->top_task->child_count += 1; + } + + //- rjf: consume expected splitters + if(!state->caller_info_completes_task && + state->top_task->child_count > 1 && + state->top_task->expected_splitter.size != 0 && + state->top_task->child_count < state->top_task->child_count_target) + { + if(!e2_try_token(string, E2_TokenKind_Symbol, state->top_task->expected_splitter, &off, 0) && state->top_task->splitter_is_required) + { + e2_msgf(arena, &parse.msgs, r1u64(off, off), "Expected `%S`.", state->top_task->expected_splitter); + } + } + + //- rjf: consume expected closers - can terminate a child list early + B32 closer_found = 0; + if(!state->caller_info_completes_task && state->top_task->expected_closer.size != 0) + { + closer_found = e2_try_token(string, E2_TokenKind_Symbol, state->top_task->expected_closer, &off, 0); + } + + //- rjf: caller-provided info completes a task, *or* closer found, + // *or* task child count hits limit -> complete this subtree + if(state->caller_info_completes_task || closer_found || state->top_task->child_count >= state->top_task->child_count_target) + { + B32 completed_with_caller_info = state->caller_info_completes_task; + state->caller_info_completes_task = 0; E2_ParseTask *completed_task = state->top_task; - SLLStackPop(state->top_task); - SLLStackPush(state->free_task, completed_task); //- rjf: produced finished expression tree, given all children E2_Expr *finished_root = &e2_expr_nil; E2_Expr *lhs = completed_task->first_child ? completed_task->first_child->v : &e2_expr_nil; E2_Expr *rhs = completed_task->last_child ? completed_task->last_child->v : &e2_expr_nil; + E2_Expr *mhs = completed_task->child_count == 3 ? lhs->next : &e2_expr_nil; { RDI_EvalOp op = RDI_EvalOp_Stop; E2_TypeKey dst_type_key = {E2_TypeKeyKind_Null}; @@ -1354,8 +1499,77 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S } }break; - //- rjf: dereference + //- rjf: member accesses -> at this point we should have a resolved access + // expression submitted to us by the user (the parser reports it first) + // stored as the second child in the list. we just want to use the + // second expression - the initial child was just the accessed evaluation. + case E2_OpKind_Dot: + { + finished_root = rhs; + }break; + + //- rjf: indexes + case E2_OpKind_Index: + { + E2_TypeKey lhs_type_key = e2_type_key_undecorate(lhs->type_key); + E2_TypeKind lhs_type_kind = e2_type_kind_from_key(lhs_type_key); + + // rjf: array/pointer *address* indexes + if(lhs_type_kind == E2_TypeKind_Ptr || lhs_type_kind == E2_TypeKind_Array) + { + E2_TypeKey element_type_key = e2_type_key_direct(lhs_type_key); + U64 element_byte_size = e2_byte_size_from_type_key(element_type_key); + E2_Expr *base_addr_value_expr = e2_expr_resolve_to_value(arena, lhs); + E2_Expr *index_value_expr = e2_expr_resolve_to_value(arena, rhs); + E2_Expr *offset_value_expr = index_value_expr; + if(element_byte_size != 1) + { + E2_Expr *element_size_value_expr = e2_expr_const_u64_or_smaller(arena, element_byte_size); + offset_value_expr = e2_expr_binary_op(arena, e2_type_key_basic(E2_TypeKind_U64), RDI_EvalOp_Mul, index_value_expr, element_size_value_expr); + } + E2_Expr *element_addr_value_expr = e2_expr_binary_op(arena, e2_type_key_basic(E2_TypeKind_U64), RDI_EvalOp_Add, base_addr_value_expr, offset_value_expr); + element_addr_value_expr->type_key = element_type_key; + element_addr_value_expr->mode = E2_Mode_Address; + finished_root = element_addr_value_expr; + } + + // rjf: fallback case: ask the caller for fancy indexing operations + else + { + if(next_access_result != &e2_expr_nil) + { + finished_root = next_access_result; + next_access_result = &e2_expr_nil; + } + else + { + done = 1; + parse.status = E2_ParseStatus_IndexAccess; + parse.expr = lhs; + parse.params_expr = rhs; + state->caller_info_completes_task = 1; + } + } + }break; + + //- rjf: calls + case E2_OpKind_Call: + { + // TODO(rjf) + }break; + + //- rjf: sizeof + case E2_OpKind_SizeOf: + { + E2_TypeKey rhs_type_key = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_AllDecorative & ~E2_TypeUnwrapFlag_Enums); + U64 rhs_size = e2_byte_size_from_type_key(rhs_type_key); + finished_root = e2_expr_const_u64_or_smaller(arena, rhs_size); + finished_root->type_key = e2_type_key_basic(E2_TypeKind_U64); + }break; + + //- rjf: dereferences case E2_OpKind_Deref: + case E2_OpKind_DerefAsm: { // rjf: unpack operand E2_TypeKey rhs_type_key = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_AllDecorative & ~E2_TypeUnwrapFlag_Enums); @@ -1375,12 +1589,26 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S malformed = 1; e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot dereference arrays of zero-sized types."); } - else if(!e2_type_kind_is_ptr_or_ref(rhs_type_kind) && rhs_type_kind != E2_TypeKind_Array) + else if(!e2_type_kind_is_ptr_or_ref(rhs_type_kind) && rhs_type_kind != E2_TypeKind_Array && + completed_task->op_kind != E2_OpKind_DerefAsm) { malformed = 1; e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot dereference this type."); } + // rjf: asm-style deref -> go to u64 if the address expression isn't + // an array or pointer + // + // TODO(rjf): probably we should get an absolute-fallback-architecture here, + // which ultimately is sourced by the selected thread, to choose an address-sized + // integer type. + // + if(!e2_type_kind_is_ptr_or_ref(rhs_type_kind) && rhs_type_kind != E2_TypeKind_Array && + completed_task->op_kind == E2_OpKind_DerefAsm) + { + dereferenced_type = e2_type_key_basic(E2_TypeKind_U64); + } + // rjf: not malformed -> equip info if(!malformed) { @@ -1597,20 +1825,30 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S //- rjf: definitions (TODO(rjf): tricky with the 'user resolves expressions' model - let's figure it out once basics are in) case E2_OpKind_Define:{}break; + + //- rjf: conditionals + case E2_OpKind_Cond: + { + // TODO(rjf) + }break; } } - //- rjf: consume expected closers - if(completed_task->expected_closer.size != 0) + //- rjf: report missing closers + if(!completed_with_caller_info && completed_task->expected_closer.size != 0 && !closer_found) { - if(!e2_try_token(string, E2_TokenKind_Symbol, completed_task->expected_closer, &off, 0)) - { - e2_msgf(arena, &parse.msgs, r1u64(off, off), "Expected `%S`.", completed_task->expected_closer); - } + e2_msgf(arena, &parse.msgs, r1u64(off, off), "Expected `%S`.", completed_task->expected_closer); } //- rjf: work on the parent of the finished expression next expr = finished_root; + + //- rjf: release task + if(!done) + { + SLLStackPop(state->top_task); + SLLStackPush(state->free_task, completed_task); + } } //- rjf: if the top task is not done -> break & continue - reset expression, because we need to parse another. @@ -1626,20 +1864,70 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, S if(state->top_task == 0 && off >= string.size) { parse.expr = expr; - if(parse.status == E2_Status_Error) + if(parse.status == E2_ParseStatus_Error) { - parse.status = E2_Status_Good; + parse.status = E2_ParseStatus_Good; } break; } } + + //- rjf: we're always done if there's nothing left to parse + if(off >= string.size) + { + done = 1; + } } - //- rjf: advance offset if successful - if(parse.status == E2_Status_Good || parse.status == E2_Status_Error) + //- rjf: asking caller for info? -> if we already did this at this offset, + // the user couldn't provide the info, so we just fail out. + if(e2_parse_status_is_caller_request(parse.status)) + { + if(state->caller_request_count > 0 && state->last_caller_request_string_off == state->string_off) + { + if(parse.status == E2_ParseStatus_MissedIdentifierResolution) + { + e2_msgf(arena, &parse.msgs, r1u64(state->string_off, state->string_off + parse.missed_identifier.size), "`%S` couldn't be resolved.", parse.missed_identifier); + } + parse.status = E2_ParseStatus_Error; + } + state->caller_request_count += 1; + state->last_caller_request_string_off = state->string_off; + } + + //- rjf: report incomplete tasks + if(off >= string.size && !e2_parse_status_is_caller_request(parse.status)) + { + for(E2_ParseTask *t = state->top_task; t != 0; t = t->next) + { + if(t->child_count == 1 && t->child_count_target == 2 && t->op_kind == E2_OpKind_Dot) + { + e2_msgf(arena, &parse.msgs, t->src_range, "Couldn't access member `%S`.", state->last_requested_member_name); + } + else if(t->child_count == 2 && t->child_count_target == 2 && t->op_kind == E2_OpKind_Index) + { + e2_msgf(arena, &parse.msgs, t->src_range, "Couldn't index into this type."); + } + else if(t->child_count == 1 && t->child_count_target == 2 && t->op_kind != E2_OpKind_Null) + { + e2_msgf(arena, &parse.msgs, t->src_range, "Expected expression after binary operator `%S`.", e2_op_kind_info_table[t->op_kind].sep); + } + else if(t->child_count == 0 && t->child_count_target == 1 && t->op_kind != E2_OpKind_Null) + { + e2_msgf(arena, &parse.msgs, t->src_range, "Expected expression after unary operator `%S`.", e2_op_kind_info_table[t->op_kind].pre); + } + else + { + e2_msgf(arena, &parse.msgs, t->src_range, "Expected expression."); + } + } + } + + //- rjf: commit offset { state->string_off = off; } + return parse; } @@ -1724,12 +2012,14 @@ e2_bytecode_from_expr(Arena *arena, E2_Expr *expr) internal E2_Interp e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_map, String8 bytecode) { - E2_Interp interp = {E2_Status_Error}; + E2_Interp interp = {E2_InterpStatus_Error}; { U64 off = state->bytecode_off; U64 off_opl = bytecode.size; B32 done = 0; B32 good = 1; + + //- rjf: execute bytecode for(;off < off_opl && !done && good;) { Temp scratch = scratch_begin(&arena, 1); @@ -1784,7 +2074,7 @@ e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_ case E2_EvalOp_SetCtxID: { - interp.status = E2_Status_NewCtxID; + interp.status = E2_InterpStatus_NewCtxID; interp.ctx_id = decode_val.u64; }break; @@ -1818,7 +2108,7 @@ e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_ if(read_size != size) { good = 0; - interp.status = E2_Status_MissedSpaceRead; + interp.status = E2_InterpStatus_MissedSpaceRead; interp.missed_read_space_addr_range = space_addr_range; } }break; @@ -1840,14 +2130,14 @@ e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_ if(read_size != size) { good = 0; - interp.status = E2_Status_MissedSpaceRead; + interp.status = E2_InterpStatus_MissedSpaceRead; interp.missed_read_space_addr_range = space_addr_range; } } else { good = 0; - interp.status = E2_Status_BadRegCode; + interp.status = E2_InterpStatus_BadRegCode; } }break; case RDI_EvalOp_FrameOff: {ctx_flags = E2_CtxFlag_HasFrameBase; ctx_base_addr = state->selected_ctx.frame_base_addr;}goto optional_base_off; @@ -1863,7 +2153,7 @@ e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_ else { good = 0; - interp.status = E2_Status_MissingCtxFlag; + interp.status = E2_InterpStatus_MissingCtxFlag; interp.missing_ctx_flags |= ctx_flags; } }break; @@ -1919,9 +2209,9 @@ e2_interp_from_bytecode(Arena *arena, E2_InterpState *state, E2_SpaceMap *space_ #define BinOp(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type;}while(0) #define SizedBinOp(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type;}while(0) -#define BinOpDiv(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) -#define SizedBinOpDiv(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) -#define BinOpDivFn(target_type_group, dst_type, src_type, fn) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = fn(popped_vals[1].src_type, popped_vals[0].src_type); } else {interp.status = E2_Status_DivideByZero; good = 0;} }while(0) +#define BinOpDiv(target_type_group, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_InterpStatus_DivideByZero; good = 0;} }while(0) +#define SizedBinOpDiv(target_type_group, size, dst_type, src_type, symbol) else if(type_group == (RDI_EvalTypeGroup_##target_type_group) && op_arithmetic_size == (size)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = popped_vals[1].src_type symbol popped_vals[0].src_type; } else {interp.status = E2_InterpStatus_DivideByZero; good = 0;} }while(0) +#define BinOpDivFn(target_type_group, dst_type, src_type, fn) else if(type_group == (RDI_EvalTypeGroup_##target_type_group)) do{if(popped_vals[0].src_type != 0) { push_vals[0].dst_type = fn(popped_vals[1].src_type, popped_vals[0].src_type); } else {interp.status = E2_InterpStatus_DivideByZero; good = 0;} }while(0) #define ArithTypeCasesInt(symbol)\ SizedBinOp(S, 8, s8, s8, symbol);\ SizedBinOp(S, 16, s16, s16, symbol);\ @@ -1955,7 +2245,7 @@ ArithTypeCasesIntDiv(symbol) #define ArithTypeCasesIntAllU64(symbol)\ BinOp(S, u64, u64, symbol);\ BinOp(U, u64, u64, symbol); -#define Case(name, ...) case RDI_EvalOp_##name:{if(0){} __VA_ARGS__ else {interp.status = E2_Status_BadOpTypes; good = 0;}}break +#define Case(name, ...) case RDI_EvalOp_##name:{if(0){} __VA_ARGS__ else {interp.status = E2_InterpStatus_BadOpTypes; good = 0;}}break Case(Add, ArithTypeCases(+)); Case(Sub, ArithTypeCases(-)); Case(Mul, ArithTypeCases(*)); @@ -2049,7 +2339,7 @@ BinOp(U, u64, u64, symbol); { switch(in + out*RDI_EvalTypeGroup_COUNT) { - default:{good = 0; interp.status = E2_Status_BadOpTypes;}break; + default:{good = 0; interp.status = E2_InterpStatus_BadOpTypes;}break; #define Case(dst_tg, dst_slot, dst_type, src_tg, src_slot) case RDI_EvalTypeGroup_##src_tg + RDI_EvalTypeGroup_##dst_tg*RDI_EvalTypeGroup_COUNT:{push_vals[0].dst_slot = (dst_type)popped_vals[0].src_slot;}break Case(U, u64, U64, F32, f32); Case(U, u64, U64, F64, f64); @@ -2083,7 +2373,7 @@ BinOp(U, u64, u64, symbol); if(!found) { good = 0; - interp.status = E2_Status_InsufficientStackSpace; + interp.status = E2_InterpStatus_InsufficientStackSpace; } }break; @@ -2106,7 +2396,7 @@ BinOp(U, u64, u64, symbol); else { good = 0; - interp.status = E2_Status_BadOffset; + interp.status = E2_InterpStatus_BadOffset; } }break; @@ -2118,7 +2408,7 @@ BinOp(U, u64, u64, symbol); default: { good = 0; - interp.status = E2_Status_UnsupportedOp; + interp.status = E2_InterpStatus_UnsupportedOp; }break; case 2:{push_vals[0].u16 = bswap_u16(popped_vals[0].u16);}break; case 4:{push_vals[0].u32 = bswap_u32(popped_vals[0].u32);}break; @@ -2136,7 +2426,7 @@ BinOp(U, u64, u64, symbol); // skip past the embedded sub-bytecode in the outer stream so the // bytes are not interpreted as outer ops on resume. good = 0; - interp.status = E2_Status_UnsupportedOp; + interp.status = E2_InterpStatus_UnsupportedOp; }break; case RDI_EvalOp_PartialValue: @@ -2146,14 +2436,14 @@ BinOp(U, u64, u64, symbol); // value already on the stack is the result. for multi-piece, only // the first piece is returned (stack[0] is the final result). good = 0; - interp.status = E2_Status_UnsupportedOp; + interp.status = E2_InterpStatus_UnsupportedOp; }break; case RDI_EvalOp_PartialValueBit: { // DW_OP_bit_piece marker. same caveat as PartialValue. good = 0; - interp.status = E2_Status_UnsupportedOp; + interp.status = E2_InterpStatus_UnsupportedOp; }break; } @@ -2200,9 +2490,34 @@ BinOp(U, u64, u64, symbol); break; } } + + //- rjf: asking caller for info? -> if we already did this at this offset, + // the user couldn't provide the info, so we just fail out. + if(e2_interp_status_is_caller_request(interp.status)) + { + if(state->caller_request_count > 0 && state->last_caller_request_bytecode_off == state->bytecode_off) + { + switch(interp.status) + { + default:{}break; + case E2_InterpStatus_MissedSpaceRead: + { + e2_msgf(arena, &interp.msgs, r1u64(state->bytecode_off, state->bytecode_off+1), "Couldn't read address range [0x%I64x, 0x%I64x) in space 0x%I64x.", + interp.missed_read_space_addr_range.min, + interp.missed_read_space_addr_range.max, + interp.space_id); + }break; + } + interp.status = E2_InterpStatus_Error; + } + state->caller_request_count += 1; + state->last_caller_request_bytecode_off = state->bytecode_off; + } + + //- rjf: if we're done with the bytecode stream, report success / value if(off == off_opl && good) { - interp.status = E2_Status_Good; + interp.status = E2_InterpStatus_Good; if(state->top_val != 0) { interp.val = state->top_val->val; diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index a9a7cd45..f920d69e 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -12,7 +12,8 @@ typedef enum E2_OpParseKind E2_OpParseKind_Null, E2_OpParseKind_UnaryPrefix, E2_OpParseKind_Binary, - E2_OpParseKind_UnaryPostfix, + E2_OpParseKind_Ternary, + E2_OpParseKind_Call, } E2_OpParseKind; @@ -41,31 +42,57 @@ enum }; //////////////////////////////// -//~ rjf: Compilation Statuses +//~ rjf: Parse Statuses -typedef enum E2_Status +typedef enum E2_ParseStatus { - E2_Status_Good, + //- rjf: terminals + E2_ParseStatus_Good, + E2_ParseStatus_Error, + E2_ParseStatus_FirstTerminal = E2_ParseStatus_Good, + E2_ParseStatus_LastTerminal = E2_ParseStatus_Error, - //- rjf: need caller-provided info - E2_Status_MissedSpaceRead, - E2_Status_MissedIdentifierResolution, - E2_Status_Access, - E2_Status_NewCtxID, - - //- rjf: unrecoverable errors - E2_Status_BadRegCode, - E2_Status_MissingCtxFlag, - E2_Status_DivideByZero, - E2_Status_InsufficientStackSpace, - E2_Status_BadOpTypes, - E2_Status_UnsupportedOp, - E2_Status_BadOffset, - E2_Status_Error, - E2_Status_FirstError = E2_Status_BadRegCode, - E2_Status_LastError = E2_Status_Error, + //- rjf: caller-provided info + E2_ParseStatus_MissedIdentifierResolution, + E2_ParseStatus_MemberAccess, + E2_ParseStatus_IndexAccess, + E2_ParseStatus_Call, + E2_ParseStatus_FirstCallerRequest = E2_ParseStatus_MissedIdentifierResolution, + E2_ParseStatus_LastCallerRequest = E2_ParseStatus_Call, } -E2_Status; +E2_ParseStatus; + +#define e2_parse_status_is_terminal(s) (E2_ParseStatus_FirstTerminal <= (s) && (s) <= E2_ParseStatus_LastTerminal) +#define e2_parse_status_is_caller_request(s) (E2_ParseStatus_FirstCallerRequest <= (s) && (s) <= E2_ParseStatus_LastCallerRequest) + +//////////////////////////////// +//~ rjf: Interpretation Statuses + +typedef enum E2_InterpStatus +{ + //- rjf: terminals + E2_InterpStatus_Good, + E2_InterpStatus_BadRegCode, + E2_InterpStatus_MissingCtxFlag, + E2_InterpStatus_DivideByZero, + E2_InterpStatus_InsufficientStackSpace, + E2_InterpStatus_BadOpTypes, + E2_InterpStatus_UnsupportedOp, + E2_InterpStatus_BadOffset, + E2_InterpStatus_Error, + E2_InterpStatus_FirstTerminal = E2_InterpStatus_Good, + E2_InterpStatus_LastTerminal = E2_InterpStatus_Error, + + //- rjf: caller-provided info + E2_InterpStatus_MissedSpaceRead, + E2_InterpStatus_NewCtxID, + E2_InterpStatus_FirstCallerRequest = E2_InterpStatus_MissedSpaceRead, + E2_InterpStatus_LastCallerRequest = E2_InterpStatus_NewCtxID, +} +E2_InterpStatus; + +#define e2_interp_status_is_terminal(s) (E2_InterpStatus_FirstTerminal <= (s) && (s) <= E2_InterpStatus_LastTerminal) +#define e2_interp_status_is_caller_request(s) (E2_InterpStatus_FirstCallerRequest <= (s) && (s) <= E2_InterpStatus_LastCallerRequest) //////////////////////////////// //~ rjf: Type Keys @@ -330,6 +357,8 @@ struct E2_ParseTask S64 max_precedence; E2_OpKind op_kind; String8 expected_closer; + String8 expected_splitter; + B32 splitter_is_required; }; typedef struct E2_ParseState E2_ParseState; @@ -338,6 +367,10 @@ struct E2_ParseState U64 string_off; E2_ParseTask *top_task; E2_ParseTask *free_task; + U64 last_caller_request_string_off; + U64 caller_request_count; + String8 last_requested_member_name; + B32 caller_info_completes_task; }; typedef struct E2_Msg E2_Msg; @@ -359,10 +392,11 @@ struct E2_MsgList typedef struct E2_Parse E2_Parse; struct E2_Parse { - E2_Status status; + E2_ParseStatus status; String8 missed_identifier; E2_Expr *expr; - E2_Expr *access_expr; + String8 member_name; + E2_Expr *params_expr; E2_MsgList msgs; }; @@ -398,17 +432,20 @@ struct E2_InterpState E2_Ctx selected_ctx; E2_InterpStackValNode *top_val; E2_InterpStackValNode *free_val; + U64 last_caller_request_bytecode_off; + U64 caller_request_count; }; typedef struct E2_Interp E2_Interp; struct E2_Interp { - E2_Status status; + E2_InterpStatus status; E2_SpaceID space_id; Rng1U64 missed_read_space_addr_range; E2_CtxID ctx_id; E2_CtxFlags missing_ctx_flags; E2_Val val; + E2_MsgList msgs; }; //////////////////////////////// @@ -537,7 +574,7 @@ internal void e2_expr_push_child(E2_Expr *parent, E2_Expr *expr); internal E2_Token e2_token_from_string_off(String8 string, U64 start_off); internal U64 e2_read_token(String8 string, U64 off, E2_Token *token_out); internal B32 e2_try_token(String8 string, E2_TokenKind kind, String8 expected_string, U64 *off_out, E2_Token *token_out); -internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, String8 string); +internal E2_Parse e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, E2_Expr *access_result, String8 string); //////////////////////////////// //~ rjf: Expression -> Bytecode diff --git a/src/eval2/eval2.mdesk b/src/eval2/eval2.mdesk index e40299a8..2f07c727 100644 --- a/src/eval2/eval2.mdesk +++ b/src/eval2/eval2.mdesk @@ -4,31 +4,37 @@ @table(name parse_kind precedence pre sep pos chain) E2_OpTable: { - {Deref UnaryPrefix 2 "*" "" "" ""} - {Address UnaryPrefix 2 "&" "" "" ""} - {Pos UnaryPrefix 2 "+" "" "" ""} - {Neg UnaryPrefix 2 "-" "" "" ""} - {LogNot UnaryPrefix 2 "!" "" "" ""} - {BitNot UnaryPrefix 2 "~" "" "" ""} - {Mul Binary 3 "" "*" "" ""} - {Div Binary 3 "" "/" "" ""} - {Mod Binary 3 "" "%" "" ""} - {Add Binary 4 "" "+" "" ""} - {Sub Binary 4 "" "-" "" ""} - {LShift Binary 5 "" "<<" "" ""} - {RShift Binary 5 "" ">>" "" ""} - {Less Binary 6 "" "<" "" ""} - {LtEq Binary 6 "" "<=" "" ""} - {Grtr Binary 6 "" ">" "" ""} - {GrEq Binary 6 "" ">=" "" ""} - {EqEq Binary 7 "" "==" "" ""} - {NtEq Binary 7 "" "!=" "" ""} - {BitAnd Binary 8 "" "&" "" ""} - {BitXor Binary 9 "" "^" "" ""} - {BitOr Binary 10 "" "|" "" ""} - {LogAnd Binary 11 "" "&&" "" ""} - {LogOr Binary 12 "" "||" "" ""} - {Define Binary 13 "" "=" "" ""} + {Dot Binary 1 "" "." "" "" } + {Index Binary 1 "" "[" "]" "" } + {Call Call 1 "" "(" ")" ","} + {DerefAsm UnaryPrefix 1 "[" "" "]" "" } + {SizeOf UnaryPrefix 1 "sizeof " "" "" "" } + {Deref UnaryPrefix 2 "*" "" "" "" } + {Address UnaryPrefix 2 "&" "" "" "" } + {Pos UnaryPrefix 2 "+" "" "" "" } + {Neg UnaryPrefix 2 "-" "" "" "" } + {LogNot UnaryPrefix 2 "!" "" "" "" } + {BitNot UnaryPrefix 2 "~" "" "" "" } + {Mul Binary 3 "" "*" "" "" } + {Div Binary 3 "" "/" "" "" } + {Mod Binary 3 "" "%" "" "" } + {Add Binary 4 "" "+" "" "" } + {Sub Binary 4 "" "-" "" "" } + {LShift Binary 5 "" "<<" "" "" } + {RShift Binary 5 "" ">>" "" "" } + {Less Binary 6 "" "<" "" "" } + {LtEq Binary 6 "" "<=" "" "" } + {Grtr Binary 6 "" ">" "" "" } + {GrEq Binary 6 "" ">=" "" "" } + {EqEq Binary 7 "" "==" "" "" } + {NtEq Binary 7 "" "!=" "" "" } + {BitAnd Binary 8 "" "&" "" "" } + {BitXor Binary 9 "" "^" "" "" } + {BitOr Binary 10 "" "|" "" "" } + {LogAnd Binary 11 "" "&&" "" "" } + {LogOr Binary 12 "" "||" "" "" } + {Define Binary 13 "" "=" "" "" } + {Cond Ternary 14 "" "?" "" ":"} } @enum E2_OpKind: diff --git a/src/eval2/generated/eval2.meta.c b/src/eval2/generated/eval2.meta.c index 7bb0448b..0b8b63b1 100644 --- a/src/eval2/generated/eval2.meta.c +++ b/src/eval2/generated/eval2.meta.c @@ -4,9 +4,14 @@ //- GENERATED CODE C_LINKAGE_BEGIN -E2_OpInfo e2_op_kind_info_table[26] = +E2_OpInfo e2_op_kind_info_table[32] = { {0}, +{E2_OpParseKind_Binary, 1, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Binary, 1, str8_lit_comp(""), str8_lit_comp("["), str8_lit_comp("]"), str8_lit_comp("")}, +{E2_OpParseKind_Call, 1, str8_lit_comp(""), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(",")}, +{E2_OpParseKind_UnaryPrefix, 1, str8_lit_comp("["), str8_lit_comp(""), str8_lit_comp("]"), str8_lit_comp("")}, +{E2_OpParseKind_UnaryPrefix, 1, str8_lit_comp("sizeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, {E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, {E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, {E2_OpParseKind_UnaryPrefix, 2, str8_lit_comp("+"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, @@ -32,6 +37,7 @@ E2_OpInfo e2_op_kind_info_table[26] = {E2_OpParseKind_Binary, 11, str8_lit_comp(""), str8_lit_comp("&&"), str8_lit_comp(""), str8_lit_comp("")}, {E2_OpParseKind_Binary, 12, str8_lit_comp(""), str8_lit_comp("||"), str8_lit_comp(""), str8_lit_comp("")}, {E2_OpParseKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp(""), str8_lit_comp("")}, +{E2_OpParseKind_Ternary, 14, str8_lit_comp(""), str8_lit_comp("?"), str8_lit_comp(""), str8_lit_comp(":")}, }; U8 e2_type_kind_basic_byte_size_table[61] = diff --git a/src/eval2/generated/eval2.meta.h b/src/eval2/generated/eval2.meta.h index 9262b98c..eedb460f 100644 --- a/src/eval2/generated/eval2.meta.h +++ b/src/eval2/generated/eval2.meta.h @@ -9,6 +9,11 @@ typedef enum E2_OpKind { E2_OpKind_Null, +E2_OpKind_Dot, +E2_OpKind_Index, +E2_OpKind_Call, +E2_OpKind_DerefAsm, +E2_OpKind_SizeOf, E2_OpKind_Deref, E2_OpKind_Address, E2_OpKind_Pos, @@ -34,6 +39,7 @@ E2_OpKind_BitOr, E2_OpKind_LogAnd, E2_OpKind_LogOr, E2_OpKind_Define, +E2_OpKind_Cond, E2_OpKind_COUNT, } E2_OpKind; @@ -116,7 +122,7 @@ E2_TypeKind_LastMeta = E2_TypeKind_MetaDescription, } E2_TypeKind; C_LINKAGE_BEGIN -extern E2_OpInfo e2_op_kind_info_table[26]; +extern E2_OpInfo e2_op_kind_info_table[32]; extern U8 e2_type_kind_basic_byte_size_table[61]; extern String8 e2_type_kind_basic_string_table[61]; diff --git a/src/lib_rdi/rdi.c b/src/lib_rdi/rdi.c index f030ca78..84f35ba9 100644 --- a/src/lib_rdi/rdi.c +++ b/src/lib_rdi/rdi.c @@ -79,8 +79,8 @@ RDI_EVAL_CTRLBITS(16, 0, 1), RDI_EVAL_CTRLBITS(32, 0, 1), RDI_EVAL_CTRLBITS(64, 0, 1), RDI_EVAL_CTRLBITS(1, 0, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), -RDI_EVAL_CTRLBITS(1, 1, 1), +RDI_EVAL_CTRLBITS(2, 1, 1), +RDI_EVAL_CTRLBITS(2, 1, 1), RDI_EVAL_CTRLBITS(2, 2, 1), RDI_EVAL_CTRLBITS(2, 2, 1), RDI_EVAL_CTRLBITS(2, 2, 1), diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index d9675138..44212e92 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -1187,9 +1187,9 @@ make_directory(String8 path) //~ rjf: @per_os_impl Aborting internal void -abort_self(S32 exit_code) +abort_self(U64 exit_code) { - exit(exit_code); + exit((int)exit_code); } //////////////////////////////// diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 04eab70e..bc34f32a 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -586,6 +586,16 @@ entry_point(CmdLine *cmd_line) { Temp scratch = scratch_begin(0, 0); + //- rjf: re-open stdout handles if cli +#if OS_WINDOWS + if(cmd_line_has_flag(cmd_line, s("bin"))) + { + AttachConsole(ATTACH_PARENT_PROCESS); + freopen("CONOUT$", "wt", stdout); + freopen("CONOUT$", "wt", stderr); + } +#endif + //- rjf: unpack command line arguments ExecMode exec_mode = ExecMode_Normal; B32 auto_run = 0; diff --git a/src/rdi/rdi.mdesk b/src/rdi/rdi.mdesk index 84687215..36509832 100644 --- a/src/rdi/rdi.mdesk +++ b/src/rdi/rdi.mdesk @@ -1214,8 +1214,8 @@ RDI_EvalOpTable: {ConstU256 16 32 0 1} {ConstU512 17 64 0 1} {ConstString 18 1 0 1} - {Abs 19 1 1 1} - {Neg 20 1 1 1} + {Abs 19 2 1 1} + {Neg 20 2 1 1} {Add 21 2 2 1} {Sub 22 2 2 1} {Mul 23 2 2 1} diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index e5bc7465..3ec2ba2c 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -422,7 +422,7 @@ p2r_convert2(Arena *arena, P2R_ConvertParams *params) } else { - cv2r_comp_units[idx].obj_name = s("*global"); + cv2r_comp_units[idx].obj_name = s("*global*"); } cv2r_comp_units[idx].ranges = unit_ranges[idx]; cv2r_comp_units[idx].sym = all_syms[idx]; diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index f8eec594..8c19eaf3 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -13,9 +13,7 @@ //- rjf: [h] #include "base/base_inc.h" #include "x64/x64.h" -#include "http/http_inc.h" #include "artifact_cache/artifact_cache.h" -#include "symbol_server/symbol_server_inc.h" #include "rdi/rdi_local.h" #include "dbg_info/dbg_info.h" #include "arch/arch_inc.h" @@ -24,9 +22,7 @@ //- rjf: [c] #include "base/base_inc.c" #include "x64/x64.c" -#include "http/http_inc.c" #include "artifact_cache/artifact_cache.c" -#include "symbol_server/symbol_server_inc.c" #include "rdi/rdi_local.c" #include "dbg_info/dbg_info.c" #include "arch/arch_inc.c" @@ -40,6 +36,10 @@ entry_point(CmdLine *cmdline) { String8 strings[] = { + s("[123]"), + s("foo"), + s("foo.bar"), + s("123[456]"), s("123"), s("123 + 456"), s("!1"), @@ -50,22 +50,47 @@ entry_point(CmdLine *cmdline) s("3 * 4 + 2"), s("(3 * 4) + 2"), s("2 + (3 * 4)"), + s("123 | 456"), + s("123 + "), + s("-123"), + s("sizeof 123"), + s("1 ? 123 : 456"), + s("123(1, 2, 3)"), }; for EachElement(idx, strings) { Temp scratch = scratch_begin(0, 0); + String8List msgs = {0}; // rjf: string -> expr E2_Expr *expr = &e2_expr_nil; { E2_ParseState state = {0}; E2_ExprMap expr_map = {0}; + E2_Expr *access_expr = &e2_expr_nil; for(;;) { - E2_Parse parse = e2_parse_from_string(scratch.arena, &state, &expr_map, strings[idx]); - if(parse.status == E2_Status_Good) + E2_Parse parse = e2_parse_from_string(scratch.arena, &state, &expr_map, access_expr, strings[idx]); + expr = parse.expr; + access_expr = &e2_expr_nil; + for EachNode(n, E2_Msg, parse.msgs.first) + { + str8_list_push(scratch.arena, &msgs, n->string); + } + if(parse.status == E2_ParseStatus_MissedIdentifierResolution) + { + e2_expr_map_push(scratch.arena, &expr_map, parse.missed_identifier, e2_expr_const_u64_or_smaller(scratch.arena, 123)); + } + if(parse.status == E2_ParseStatus_IndexAccess) + { + access_expr = e2_expr_const_u64_or_smaller(scratch.arena, 111); + } + if(parse.status == E2_ParseStatus_MemberAccess) + { + access_expr = e2_expr_const_u64_or_smaller(scratch.arena, 456); + } + if(e2_parse_status_is_terminal(parse.status)) { - expr = parse.expr; break; } } @@ -82,20 +107,29 @@ entry_point(CmdLine *cmdline) for(;;) { E2_Interp interp = e2_interp_from_bytecode(scratch.arena, &state, &space_map, bytecode); - if(interp.status == E2_Status_Good) - { - val = interp.val; - break; - } - else if(E2_Status_FirstError <= interp.status <= E2_Status_LastError) + val = interp.val; + if(e2_interp_status_is_terminal(interp.status)) { + if(interp.status != E2_InterpStatus_Good) + { + str8_list_pushf(scratch.arena, &msgs, "Interpretation error (%i).", interp.status); + } break; } } } + // rjf: message string list -> string + StringJoin join = {.sep = s(" ")}; + String8 msgs_string = str8_list_join(scratch.arena, &msgs, &join); + // rjf: log - printf("%.*s -> %I64u\n", str8_varg(strings[idx]), val.u64); + printf("%.*s -> %I64d *%s* %s%.*s\n", str8_varg(strings[idx]), + val.s64, + expr->mode == E2_Mode_Type ? "type" : + expr->mode == E2_Mode_Value ? "value" : + "address", + msgs_string.size != 0 ? " // " : "", str8_varg(msgs_string)); fflush(stdout); scratch_end(scratch); diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index 79945203..f77846c0 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -1276,9 +1276,9 @@ make_directory(String8 path) //~ rjf: @per_os_impl Aborting internal void -abort_self(S32 exit_code) +abort_self(U64 exit_code) { - ExitProcess(exit_code); + ExitProcess((int)exit_code); } //////////////////////////////// From 0d62c49c52239b4bec9550af25454f23eb010f57 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 18 Jun 2026 22:43:27 -0600 Subject: [PATCH 818/850] only rewrite stdout/stderr/etc. if passed cli specifically --- src/com_shim/com_shim_main.c | 1 + src/raddbg/raddbg_main.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com_shim/com_shim_main.c b/src/com_shim/com_shim_main.c index 5ccce4c0..6f9c5aba 100644 --- a/src/com_shim/com_shim_main.c +++ b/src/com_shim/com_shim_main.c @@ -41,6 +41,7 @@ entry_point(CmdLine *cmd_line) #endif } str8_list_push(scratch.arena, &command_parts, exe_name); + str8_list_push(scratch.arena, &command_parts, s("--cli")); for EachIndex(idx, cmd_line->argc) { String8 arg = str8_cstring(cmd_line->argv[idx]); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index bc34f32a..35313923 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -588,7 +588,7 @@ entry_point(CmdLine *cmd_line) //- rjf: re-open stdout handles if cli #if OS_WINDOWS - if(cmd_line_has_flag(cmd_line, s("bin"))) + if(cmd_line_has_flag(cmd_line, s("cli"))) { AttachConsole(ATTACH_PARENT_PROCESS); freopen("CONOUT$", "wt", stdout); From 8ef58def99ef69807e9b9e80447b2a67cf33c9ad Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 18 Jun 2026 22:39:37 -0700 Subject: [PATCH 819/850] update torture * factor test registration logic out of the macro to improve debuggability * expand the test registration logic * rename group -> layer for consistency * fix indentation in the slow tests summary --- src/base/base_test.c | 20 ++++++++++ src/base/base_test.h | 89 ++++++++++++++++++++----------------------- src/torture/torture.c | 39 +++++++++---------- src/torture/torture.h | 44 ++++++++++----------- 4 files changed, 101 insertions(+), 91 deletions(-) diff --git a/src/base/base_test.c b/src/base/base_test.c index ae447aab..5a2e302f 100644 --- a/src/base/base_test.c +++ b/src/base/base_test.c @@ -1,2 +1,22 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) + +#if BUILD_TESTS + +internal void +base_register_test(char *func_name_cstr, TestFunctionType *fn, char *file_path_cstr, int line, int skip) +{ + String8 file_path = str8_cstring(file_path_cstr); + U64 src_min = str8_find_needle(file_path, 0, s("src/"), StringMatchFlag_SlashInsensitive); + U64 src_max = src_min + str8_lit("src/").size; + U64 layer_slash_max = str8_find_needle(file_path, src_max, s("/"), StringMatchFlag_SlashInsensitive); + + TestInfo *t = &test_infos[test_infos_count++]; + t->layer = str8_substr(file_path, r1u64(src_max, layer_slash_max)); + t->label = str8_cstring(func_name_cstr); + t->decl_line = line; + t->skip = skip; + t->test_fn = fn; +} + +#endif diff --git a/src/base/base_test.h b/src/base/base_test.h index 7d4f3c9a..f17c8f1c 100644 --- a/src/base/base_test.h +++ b/src/base/base_test.h @@ -17,20 +17,20 @@ TestStatus; typedef struct TestResult TestResult; struct TestResult { - TestStatus status; - char *fail_file; - int fail_line; - char *fail_cond; + TestStatus status; + char *fail_file; + int fail_line; + char *fail_cond; }; typedef struct TestCtx TestCtx; struct TestCtx { - CmdLine *cmdline; - String8 exemplars_path; - String8 artifacts_path; - String8 input_data_path; - TestResult *result_out; + CmdLine *cmdline; + String8 exemplars_path; + String8 artifacts_path; + String8 input_data_path; + TestResult *result_out; String8List *test_out; }; @@ -41,39 +41,33 @@ typedef TEST_FUNCTION_SIG(TestFunctionType); typedef struct TestInfo TestInfo; struct TestInfo { - String8 layer; - String8 label; - S64 decl_line; - B32 skip; + String8 layer; + String8 label; + S64 decl_line; + B32 skip; TestFunctionType *test_fn; }; #if BUILD_TESTS -global U64 test_infos_count = 0; + +// alloc storage for the tests +global U16 test_infos_count = 0; global TestInfo test_infos[0xffff] = {0}; -#define AddTest(name, file_name, line, skip_, ...) \ -TEST_FUNCTION_DEF(name);\ -__VA_ARGS__ void add_test__##name(void)\ -{\ -String8 file = str8_lit(file_name);\ -U64 src_pos = str8_find_needle(file, 0, s("src/"), StringMatchFlag_SlashInsensitive);\ -String8 layer_folder = str8_skip(file, src_pos+4);\ -U64 layer_slash_pos = str8_find_needle(layer_folder, 0, s("/"), StringMatchFlag_SlashInsensitive);\ -String8 layer_name = str8_prefix(layer_folder, layer_slash_pos);\ -test_infos[test_infos_count].layer = layer_name;\ -test_infos[test_infos_count].label = str8_lit(#name);\ -test_infos[test_infos_count].decl_line = (line);\ -test_infos[test_infos_count].skip = (skip_);\ -test_infos[test_infos_count].test_fn = test__##name;\ -test_infos_count += 1;\ -} + +internal void base_register_test(char *func_name, TestFunctionType *fn, char *file_path, int line, int skip); + +#define AddTest(name, file_path, line, skip_, ...) \ + TEST_FUNCTION_DEF(name); \ + __VA_ARGS__ void add_test__##name(void) { base_register_test(Stringify(name), test__##name, file_path, line, skip_); } + # if COMPILER_MSVC # pragma section(".CRT$XCU", read) -# define DeclareTest(name, skip) \ -AddTest(name, __FILE__, __LINE__, (skip))\ -__declspec(allocate(".CRT$XCU")) void (*add_test_ptr__##name)(void) = add_test__##name;\ -__pragma(comment(linker, "/include:" Stringify(add_test_ptr__##name))) +# define DeclareTest(name, skip) \ + /* register test */ AddTest(name, __FILE__, __LINE__, (skip)) \ + /* alloc function pointer */ __declspec(allocate(".CRT$XCU")) void (*add_test_ptr__##name)(void) = add_test__##name; \ + /* do not GC test caller */ __pragma(comment(linker, "/include:" Stringify(add_test_ptr__##name))) # elif COMPILER_GCC || COMPILER_CLANG +// clang and gcc allocate memory for the function pointer automatically # define DeclareTest(name, skip) AddTest(name, __FILE__, __LINE__, (skip), __attribute__((constructor))) # else # error DeclareTest not defined for this compiler. @@ -82,23 +76,22 @@ __pragma(comment(linker, "/include:" Stringify(add_test_ptr__##name))) # define DeclareTest(name, skip) #endif -#define Test(name) DeclareTest(name, 0)\ -TEST_FUNCTION_DEF(name) -#define SkippedTest(name) DeclareTest(name, 1)\ -TEST_FUNCTION_DEF(name) +#define Test(name) DeclareTest(name, 0) TEST_FUNCTION_DEF(name) +#define SkippedTest(name) DeclareTest(name, 1) TEST_FUNCTION_DEF(name) -#define test_out(string) str8_list_push(arena, ctx->test_out, (string)) -#define test_outf(...) str8_list_pushf(arena, ctx->test_out, __VA_ARGS__) - -#define TestCheck(c) do { if (!(c)) {\ -ctx->result_out[0] = (TestResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) };\ -if(debugger_is_attached()) { Trap(); }\ -return;\ +#define TestCheck(c) do { if (!(c)) { \ + /* record failed check */ ctx->result_out[0] = (TestResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) }; \ + /* under debugger? -> trap */ if(debugger_is_attached()) { Trap(); } \ + /* exit test */ return; \ } } while(0) -#define TestSkip() do {\ -ctx->result_out[0] = (TestResult){ .status = TestStatus_Skip };\ -return;\ +#define TestSkip() do { \ + ctx->result_out[0] = (TestResult){ .status = TestStatus_Skip }; \ + return; \ } while(0) +// test log +#define test_out(string) str8_list_push(arena, ctx->test_out, (string)) +#define test_outf(...) str8_list_pushf(arena, ctx->test_out, __VA_ARGS__) + #endif // BASE_TEST_H diff --git a/src/torture/torture.c b/src/torture/torture.c index d50a5426..fa48d96d 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -40,7 +40,7 @@ t_name_from_test_info(Arena *arena, TestInfo *test_info) } internal String8List -t_test_group_from_name(Arena *arena, String8 pattern) +t_test_layer_from_name(Arena *arena, String8 pattern) { Temp scratch = scratch_begin(&arena, 1); String8List matches = {0}; @@ -120,6 +120,7 @@ t_delete_dir(String8 path) if (info.props.flags & FilePropertyFlag_IsFolder) { t_delete_dir(str8f(scratch.arena, "%S/%S", path, info.name)); + continue; } @@ -1030,7 +1031,7 @@ t_help(void) fprintf(stderr, " Usage: torture [Options] \n\n"); fprintf(stderr, " Options:\n"); fprintf(stderr, " -list Print available test targets\n"); - fprintf(stderr, " --gui Launch debugger with window\n"); + fprintf(stderr, " -gui Launch debugger with window\n"); fprintf(stderr, " -cl: Override default cl path\n"); fprintf(stderr, " -clang: Override default clang path\n"); fprintf(stderr, " -gcc: Override default gcc path\n"); @@ -1155,17 +1156,12 @@ t_entry_point(CmdLine *cmdline) String8 test_name = t_name_from_test_info(scratch.arena, test_info); if (str8_match_wildcard(test_name, t, StringMatchFlag_CaseInsensitive)) { - // TODO(rjf): do we really need to mutate the test infos here? this test won't - // even run, so I am not sure what setting the bit does - we already collect - // the tests that we *will* run -#if 0 // set skip flag switch (mode) { case Mode_Default: break; - case Mode_Skip: g_torture_tests[test_idx]->skip = 1; break; - case Mode_Force: g_torture_tests[test_idx]->skip = 0; break; + case Mode_Skip: test_info->skip = 1; break; + case Mode_Force: test_info->skip = 0; break; } -#endif // append test when not in skipping mode if ( ! hash_map_search_string_u64(&hm, test_name)) { @@ -1238,12 +1234,12 @@ t_entry_point(CmdLine *cmdline) U64Array target_indices = u64_array_from_list(scratch.arena, &targets); U64 max_label_size = 0; - U64 max_group_size = 0; + U64 max_layer_size = 0; for EachIndex(i, target_indices.count) { U64 test_idx = target_indices.v[i]; TestInfo *test_info = g_sorted_test_infos[test_idx]; max_label_size = Max(max_label_size, test_info->label.size); - max_group_size = Max(max_group_size, test_info->layer.size); + max_layer_size = Max(max_layer_size, test_info->layer.size); } U64 run_counters[TestStatus_COUNT] = {0}; @@ -1258,7 +1254,7 @@ t_entry_point(CmdLine *cmdline) for EachIndex(i, target_indices.count) { if (i == 0) { PrintHeader("Tests"); } - + U64 target_idx = target_indices.v[i]; TestInfo *test = g_sorted_test_infos[target_idx]; @@ -1268,7 +1264,7 @@ t_entry_point(CmdLine *cmdline) U64 curr_digit_count = count_digits_u64(i+1, 10); int idx_align_space_count = (int)(max_digit_count - curr_digit_count); fprintf(stdout, "[%.*s%llu/%llu] ", idx_align_space_count, spaces, (unsigned long long)i+1, (unsigned long long)target_indices.count); - fprintf(stdout, "%.*s %.*s/ %.*s", str8_varg(test->layer), (int)(max_group_size - test->layer.size), spaces, str8_varg(test->label)); + fprintf(stdout, "%.*s %.*s/ %.*s", str8_varg(test->layer), (int)(max_layer_size - test->layer.size), spaces, str8_varg(test->label)); fprintf(stdout, " %.*s ", (int)dots_count, dots); fflush(stdout); @@ -1375,6 +1371,7 @@ t_entry_point(CmdLine *cmdline) fprintf(stderr, " Skipped %llu\n", (unsigned long long)run_counters[TestStatus_Skip]); fprintf(stderr, " Time %.*s\n", str8_varg(total_time_str)); + // count slow tests U64 slow_count = 0; for EachElement(i, slowest) { Slowest s = slowest[i]; @@ -1382,26 +1379,28 @@ t_entry_point(CmdLine *cmdline) slow_count += 1; } - if (slow_count > 3) { + if (slow_count > 1) { U64 label_max = 0; - U64 group_max = 0; + U64 layer_max = 0; for EachElement(i, slowest) { Slowest s = slowest[i]; label_max = Max(g_sorted_test_infos[s.target_idx]->label.size, label_max); - group_max = Max(g_sorted_test_infos[s.target_idx]->layer.size, group_max); + layer_max = Max(g_sorted_test_infos[s.target_idx]->layer.size, layer_max); } fprintf(stderr, " \nSlow Tests\n"); for EachElement(i, slowest) { Slowest s = slowest[i]; if (s.target_idx >= test_infos_count) { break; } - TestInfo *test_info = g_sorted_test_infos[i]; - String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); + + TestInfo *test_info = g_sorted_test_infos[s.target_idx]; + String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); + fprintf(stderr, " %.*s %.*s/ %.*s %.*s %.*s\n", str8_varg(test_info->layer), - (int)(group_max - test_info->layer.size), spaces, + (int)(layer_max - test_info->layer.size), spaces, str8_varg(test_info->label), - (int)(label_max - test_info->layer.size) + 4, dots, + (int)(label_max - test_info->label.size) + 4, dots, str8_varg(elapsed_time)); } } diff --git a/src/torture/torture.h b/src/torture/torture.h index 78b8df15..56578809 100644 --- a/src/torture/torture.h +++ b/src/torture/torture.h @@ -5,12 +5,6 @@ //////////////////////////////// -#define T_RESET "\x1b[0m" -#define T_RED "\x1b[31m" -#define T_GREEN "\x1b[32m" -#define T_YELLOW "\x1b[33m" -#define T_BLUE "\x1b[34m" - typedef struct { TestInfo *test; @@ -19,14 +13,7 @@ typedef struct TestResult result; } T_RunCtx; -#define TEST(name) Test(name) -#define SKIP(name) SkippedTest(name) -#define T_Ok(c) TestCheck(c) - -#define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) -#define t_outf(...) str8_list_pushf(arena, ctx->test_out, ## __VA_ARGS__) - -//////////////////////////////////////////////////////////////// +//////////////////////////////// #define TIMEOUT_US(x) (x) #define TIMEOUT_MS(x) TIMEOUT_US((x)*1000ull) @@ -36,11 +23,19 @@ typedef struct #define ENDT_MS(x) TIMEOUT_US((x)*1000ull) #define ENDT_SEC(x) TIMEOUT_MS((x)*1000ull) -//////////////////////////////////////////////////////////////// +//////////////////////////////// -// output directory -internal B32 t_write_file_list(String8 name, String8List data); -internal B32 t_write_file(String8 name, String8 data); +#define T_RESET "\x1b[0m" +#define T_RED "\x1b[31m" +#define T_GREEN "\x1b[32m" +#define T_YELLOW "\x1b[33m" +#define T_BLUE "\x1b[34m" + +//////////////////////////////// + +// artifacts directory helpers +internal B32 t_write_file_list(String8 name, String8List data); +internal B32 t_write_file(String8 name, String8 data); internal String8 t_read_file(Arena *arena, String8 name); internal B32 t_delete_file(String8 name); internal String8 t_make_file_path(Arena *arena, String8 name); @@ -59,6 +54,7 @@ internal String8 t_radlink_path(void); internal String8 t_cwd_path(void); internal String8 t_src_path(void); +// process helpers internal B32 t_invoke(String8 exe, String8 cmdline, U64 timeout); internal B32 t_invoke_cl(char *fmt, ...); internal B32 t_invoke_linkerf(char *fmt, ...); @@ -68,16 +64,18 @@ internal void t_kill_all(String8 pattern); #define t_invoke_linker_timeoutf(t, f, ...) t_invoke_linker_timeout(push_str8f(arena, f, ##__VA_ARGS__), t) #define t_invoke_linker(c) t_invoke_linker_timeout(c, max_U64) -internal void t_kill_all(String8 pattern); - internal String8 t_chop_line(String8 *string); -internal B32 t_match_line(String8 *output, String8 expected_line); -internal B32 t_match_linef(String8 *output, char *fmt, ...); +internal B32 t_match_line(String8 *output, String8 expected_line); +internal B32 t_match_linef(String8 *output, char *fmt, ...); +#define T_MatchLinef(out, ...) T_Ok(t_match_linef(out, __VA_ARGS__)) // files helper internal String8List t_file_paths_from_dir(Arena *arena, String8 dir); -// printer +// TODO: deprecate internal void t_infof(char *fmt, ...); internal void t_errorf(char *fmt, ...); +#define TEST(name) Test(name) +#define SKIP(name) SkippedTest(name) +#define T_Ok(c) TestCheck(c) From ba32d7fdec926bd5b976bd4c5e1731aafefebccb Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 19 Jun 2026 10:42:26 -0700 Subject: [PATCH 820/850] use CL driver when compiling with clang on windows to simplify compile and link lines --- build.bat | 114 +++++++++++++++++++++++------------------------------- 1 file changed, 48 insertions(+), 66 deletions(-) diff --git a/build.bat b/build.bat index bc8b1c38..4df25f43 100644 --- a/build.bat +++ b/build.bat @@ -16,7 +16,7 @@ cd /D "%~dp0" :: `build raddbg clang` :: `build raddbg release` :: `build raddbg asan telemetry` -:: `build rdi_from_pdb` +:: `build radbin` :: :: For a full list of possible build targets and their build command lines, :: search for @build_targets in this file. @@ -33,20 +33,20 @@ for %%a in (%*) do set "%%~a=1" if not "%msvc%"=="1" if not "%clang%"=="1" set msvc=1 if not "%release%"=="1" set debug=1 if "%debug%"=="1" set release=0 && echo [debug mode] -if "%release%"=="1" set debug=0 && echo [release mode] -if "%msvc%"=="1" set clang=0 && echo [msvc compile] -if "%clang%"=="1" set msvc=0 && echo [clang compile] -if "%~1"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1&& set com_shim=1&& set raddbg_com_shim=1 -if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1&& set com_shim=1&& set raddbg_com_shim=1 +if "%release%"=="1" set debug=0 && echo [release mode] +if "%msvc%"=="1" set clang=0 && echo [msvc compile] +if "%clang%"=="1" set msvc=0 && echo [clang compile] +if "%~1"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 && set com_shim=1 && set raddbg_com_shim=1 +if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 && set com_shim=1 && set raddbg_com_shim=1 :: --- Unpack Command Line Build Arguments ------------------------------------ set auto_compile_flags= -if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled] -if "%spall%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_SPALL=1 && echo [spall profiling enabled] -if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled] -if "%ubsan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=undefined && echo [ubsan enabled] +if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled] +if "%spall%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_SPALL=1 && echo [spall profiling enabled] +if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled] +if "%ubsan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=undefined && echo [ubsan enabled] if "%opengl%"=="1" set auto_compile_flags=%auto_compile_flags% -DR_BACKEND=R_BACKEND_OPENGL && echo [opengl render backend] -if "%dwarf%"=="1" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gdwarf && echo [dwarf debug info] +if "%dwarf%"=="1" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gdwarf && echo [dwarf debug info] if "%dwarf%"=="" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gcodeview if "%pgo%"=="1" ( where llvm-profdata /q || echo llvm-profdata is not in the PATH || exit /b 1 @@ -68,49 +68,31 @@ if "%pgo%"=="1" ( ) :: --- Compile/Link Line Definitions ------------------------------------------ -set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /Zc:preprocessor -set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% -set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% -set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" /noexp /nocoffgrpinfo /opt:ref /opt:icf -set cl_out= /out: -set cl_obj_out= /Fo: -set cl_linker= -set clang_common= -mcx16 -msha -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% -set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% -set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:noicf -set clang_out= -o -set clang_obj_out= -o -set clang_linker= -Xlinker +set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /Zc:preprocessor +set cl_debug= /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% +set cl_release= /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% +set clang_common= --driver-mode=cl %cl_common% -fuse-ld=lld -D_USE_MATH_DEFINES -Dgnu_printf=printf -Dstrdup=_strdup -msha -mcx16 -fdiagnostics-absolute-paths -Wno-unused-command-line-argument -Wno-initializer-overrides -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-initializer-overrides -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std +set clang_debug= %clang_common% %cl_debug% +set clang_release= %clang_common% %cl_release% +set link_common= /link /MANIFEST:EMBED /INCREMENTAL:NO /NOEXP /PDBALTPATH:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" +if "%msvc%"=="1" set link_common=%link_common% /NOCOFFGRPINFO +set link_debug= %link_common% /DYNAMICBASE:NO +set link_release= %link_common% /OPT:REF /OPT:ICF :: --- Per-Build Settings ----------------------------------------------------- set link_icon=logo.res -if "%msvc%"=="1" set linker=%cl_linker% -if "%clang%"=="1" set linker=%clang_linker% -if "%msvc%"=="1" set only_compile=/c -if "%clang%"=="1" set only_compile=-c -if "%msvc%"=="1" set EHsc=/EHsc -if "%clang%"=="1" set EHsc= -if "%msvc%"=="1" set no_aslr=/DYNAMICBASE:NO -if "%clang%"=="1" set no_aslr=-Wl,/DYNAMICBASE:NO if "%msvc%"=="1" set rc=call rc if "%clang%"=="1" set rc=call llvm-rc -if "%msvc%"=="1" set link_dll=/link /DLL -if "%clang%"=="1" set link_dll=-Xlinker -DLL :: --- Choose Compile/Link Lines ---------------------------------------------- -if "%msvc%"=="1" set compile_debug=%cl_debug% -if "%msvc%"=="1" set compile_release=%cl_release% -if "%msvc%"=="1" set compile_link=%cl_link% -if "%msvc%"=="1" set out=%cl_out% -if "%msvc%"=="1" set obj_out=%cl_obj_out% -if "%clang%"=="1" set compile_debug=%clang_debug% -if "%clang%"=="1" set compile_release=%clang_release% -if "%clang%"=="1" set compile_link=%clang_link% -if "%clang%"=="1" set out=%clang_out% -if "%clang%"=="1" set obj_out=%clang_obj_out% +if "%msvc%"=="1" set compile_debug=call cl %cl_debug% +if "%msvc%"=="1" set compile_release=call cl %cl_release% +if "%clang%"=="1" set compile_debug=call clang %clang_debug% +if "%clang%"=="1" set compile_release=call clang %clang_release% if "%debug%"=="1" set compile=%compile_debug% +if "%debug%"=="1" set compile_link=%link_debug% if "%release%"=="1" set compile=%compile_release% +if "%release%"=="1" set compile_link=%link_release% :: --- Prep Directories ------------------------------------------------------- if not exist build mkdir build @@ -129,7 +111,7 @@ for /f %%i in ('call git rev-parse HEAD') do set compile=%compile% pushd build if "%meta%"=="1" ( echo [building metagen] - %compile_debug% ..\src\metagen\metagen_main.c %compile_link% %out%metagen.exe || exit /b 1 + %compile_debug% ..\src\metagen\metagen_main.c %compile_link% /OUT:metagen.exe || exit /b 1 ) if "%no_meta%"=="" if exist metagen.exe ( echo [running metagen] @@ -139,30 +121,30 @@ popd :: --- Build Everything (@build_targets) -------------------------------------- pushd build -if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg.exe || exit /b 1 -if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% -DWM_STUB=1 -DR_BACKEND=R_BACKEND_STUB ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg_non_graphical.exe || exit /b 1 -if "%com_shim%"=="1" set didbuild=1 && %compile% ..\src\com_shim\com_shim_main.c %compile_link% %out%com_shim.exe || exit /b 1 -if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% %linker% /NOIMPLIB %linker% /NATVIS:"%~dp0\src\linker\linker.natvis" %out%radlink.exe || exit /b 1 -if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% %out%radbin.exe || exit /b 1 -if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% %out%raddump.exe || exit /b 1 -if "%ryan_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 -if "%textperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\textperf.c %compile_link% %out%textperf.exe || exit /b 1 -if "%convertperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\convertperf.c %compile_link% %out%convertperf.exe || exit /b 1 -if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\debugstringperf.c %compile_link% %out%debugstringperf.exe || exit /b 1 -if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% %out%parse_inline_sites.exe || exit /b 1 -if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_lib_debug\strip_lib_debug.c %compile_link% %out%strip_lib_debug.exe || exit /b 1 -if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp %obj_out%mule_inline.obj && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp %obj_out%mule_o2.obj && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 -if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %link_dll% %out%mule_module.dll || exit /b 1 -if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 -if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% %out%torture.exe || exit /b1 -if "%dwarf_expr_test%"=="1" set didbuild=1 && %compile% ..\src\torture\dwarf_expr_test.c %compile_link% %out%dwarf_expr_test.exe || exit /b1 -if "%unit_sizes_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\scratch\unit_sizes_from_pdb.c %compile_link% %out%unit_sizes_from_pdb.exe || exit /b1 +if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% /OUT:raddbg.exe %link_icon% || exit /b 1 +if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c -DWM_STUB=1 -DR_BACKEND=R_BACKEND_STUB %compile_link% /OUT:raddbg_non_graphical.exe %link_icon% || exit /b 1 +if "%com_shim%"=="1" set didbuild=1 && %compile% ..\src\com_shim\com_shim_main.c %compile_link% /OUT:com_shim.exe || exit /b 1 +if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% /OUT:radlink.exe /NOIMPLIB /NATVIS:"%~dp0\src\linker\linker.natvis" || exit /b 1 +if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% /OUT:radbin.exe || exit /b 1 +if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% /OUT:raddump.exe || exit /b 1 +if "%ryan_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\ryan_scratch.c %compile_link% /OUT:ryan_scratch.exe || exit /b 1 +if "%textperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\textperf.c %compile_link% /OUT:textperf.exe || exit /b 1 +if "%convertperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\convertperf.c %compile_link% /OUT:convertperf.exe || exit /b 1 +if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\debugstringperf.c %compile_link% /OUT:debugstringperf.exe || exit /b 1 +if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% /OUT:parse_inline_sites.exe || exit /b 1 +if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_lib_debug\strip_lib_debug.c %compile_link% /OUT:strip_lib_debug.exe || exit /b 1 +if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% /c ..\src\mule\mule_inline.cpp /Fo:mule_inline.obj && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp /Fo:mule_o2.obj && %compile_debug% /EHsc ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% /DYNAMICBASE:NO /OUT:mule_main.exe || exit /b 1 +if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %compile_link% /OUT:mule_module.dll /DLL || exit /b 1 +if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% /DLL /OUT:mule_hotload_module.dll || exit /b 1 +if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% /OUT:torture.exe || exit /b 1 +if "%dwarf_expr_test%"=="1" set didbuild=1 && %compile% ..\src\torture\dwarf_expr_test.c %compile_link% /OUT:dwarf_expr_test.exe || exit /b 1 +if "%unit_sizes_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\scratch\unit_sizes_from_pdb.c %compile_link% /OUT:unit_sizes_from_pdb.exe || exit /b 1 if "%mule_peb_trample%"=="1" ( set didbuild=1 if exist mule_peb_trample.exe move mule_peb_trample.exe mule_peb_trample_old_%random%.exe if exist mule_peb_trample_new.pdb move mule_peb_trample_new.pdb mule_peb_trample_old_%random%.pdb if exist mule_peb_trample_new.rdi move mule_peb_trample_new.rdi mule_peb_trample_old_%random%.rdi - %compile% ..\src\mule\mule_peb_trample.c %compile_link% %out%mule_peb_trample_new.exe || exit /b 1 + %compile% ..\src\mule\mule_peb_trample.c %compile_link% /OUT:mule_peb_trample_new.exe || exit /b 1 move mule_peb_trample_new.exe mule_peb_trample.exe ) popd @@ -174,7 +156,7 @@ popd :: --- Warn On No Builds ------------------------------------------------------ if "%didbuild%"=="" ( - echo [WARNING] no valid build target specified; must use build target names as arguments to this script, like `build raddbg` or `build rdi_from_pdb`. + echo [WARNING] no valid build target specified; must use build target names as arguments to this script, like `build raddbg` or `build radbin`. exit /b 1 ) From 871f94a2023c77e83e6555a0b901842523119320 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 17 Jun 2026 16:37:31 -0700 Subject: [PATCH 821/850] use vectorized memory functions in the base strings --- src/base/base_core.c | 20 + src/base/base_core.h | 1 + src/base/base_strings.c | 85 +- src/base/base_strings.h | 1 - src/coff/coff.c | 9 +- src/linker/codeview_ext/codeview.c | 8 +- src/third_party/martins_memfun/memfun.h | 2683 +++++++++++++++++++++++ 7 files changed, 2738 insertions(+), 69 deletions(-) create mode 100644 src/third_party/martins_memfun/memfun.h diff --git a/src/base/base_core.c b/src/base/base_core.c index 34c5d6e2..10c9c3cc 100644 --- a/src/base/base_core.c +++ b/src/base/base_core.c @@ -692,6 +692,26 @@ u64_array_bsearch(U64 *arr, U64 count, U64 value) //////////////////////////////// +internal U32 +idx_of_zero_byte64(U8 *ptr, U64 size) +{ + Assert(size == 8); +#if ARCH_X64 + __m128i v = _mm_loadl_epi64((__m128i*)ptr); + __m128i m = _mm_cmpeq_epi8(v, _mm_setzero_si128()); + U32 bits = _mm_movemask_epi8(m); + return ctz32(bits); +#else + U64 x; + MemoryCopyStruct(&x, ptr); + U64 splat = ~0ULL / 255; + U64 mask_lsb = 0x01 * splat; + U64 mask_msb = 0x80 * splat; + U64 t = (x - mask_lsb) & (~x & mask_msb); + return ctz64(t) / 8; +#endif +} + internal U64 index_of_zero_u32(U32 *ptr, U64 count) { diff --git a/src/base/base_core.h b/src/base/base_core.h index 858ca47e..6df8361b 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -1125,6 +1125,7 @@ internal U64 u64_array_bsearch(U64 *arr, U64 count, U64 value); //////////////////////////////// +internal U32 idx_of_zero_byte64(U8 *ptr, U64 size); // size must be exactly 8 bytes internal U64 index_of_zero_u32(U32 *ptr, U64 count); internal U64 index_of_zero_u64(U64 *ptr, U64 count); internal U64 count_digits_u64(U64 v, U64 radix); diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 8825d479..54715487 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -1,6 +1,13 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// + +#if !defined(MEM_STATIC) +# define MEM_STATIC +# include "third_party/martins_memfun/memfun.h" +#endif + //////////////////////////////// //~ rjf: Character Classification & Conversion Functions @@ -211,12 +218,9 @@ str32_cstring(U32 *c) internal String8 str8_cstring_capped(void *cstr, void *cap) { - char *ptr = (char *)cstr; - char *opl = (char *)cap; - for (;ptr < opl && *ptr != 0; ptr += 1); - U64 size = (U64)(ptr - (char *)cstr); - String8 result = str8((U8*)cstr, size); - return result; + U64 cap_size = (U64)((U8 *)cap - (U8 *)cstr); + U64 size = MemFind(cstr, cap_size, 0); + return str8(cstr, size); } internal String16 @@ -230,24 +234,6 @@ str16_cstring_capped(void *cstr, void *cap) return result; } -internal String8 -str8_cstring_capped_reverse(void *raw_start, void *raw_cap) -{ - U8 *start = raw_start; - U8 *ptr = raw_cap; - for(; ptr > start; ) - { - ptr -= 1; - if (*ptr == '\0') - { - break; - } - } - U64 size = (U64)(ptr - start); - String8 result = str8(start, size); - return result; -} - //////////////////////////////// //~ rjf: String Stylization @@ -293,7 +279,11 @@ str8_match(String8 a, String8 b, StringMatchFlags flags) B32 result = 0; if(a.size == b.size && flags == 0) { - result = MemoryMatch(a.str, b.str, b.size); + result = MemIsEqual(a.str, b.str, b.size); + } + else if(a.size == b.size && flags == StringMatchFlag_CaseInsensitive) + { + result = MemCompareI(a.str, b.str, a.size) == 0; } else if(a.size == b.size || (flags & StringMatchFlag_RightSideSloppy)) { @@ -3088,45 +3078,28 @@ str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) internal int str8_compar(String8 a, String8 b, B32 ignore_case) { - int cmp = 0; + int cmp = 0; U64 size = Min(a.size, b.size); - if (ignore_case) { - for (U64 i = 0; i < size; ++i) { - U8 la = lower_from_char(a.str[i]); - U8 lb = lower_from_char(b.str[i]); - if (la < lb) { - cmp = -1; - break; - } else if (la > lb) { - cmp = +1; - break; - } - } - } else { - for (U64 i = 0; i < size; ++i) { - if (a.str[i] < b.str[i]) { - cmp = -1; - break; - } else if (a.str[i] > b.str[i]) { - cmp = +1; - break; - } - } + if (ignore_case) + { + cmp = MemCompareI(a.str, b.str, size); + } + else + { + cmp = MemCompare(a.str, b.str, size); } - if (cmp == 0) { - // shorter prefix must precede longer prefixes - if (a.size > b.size) { - cmp = +1; - } else if (b.size > a.size) { - cmp = -1; - } + // shorter prefix must precede longer prefixes + if (cmp == 0) + { + cmp = (a.size > b.size) - (b.size - a.size); } return cmp; } -internal int str8_compar_ignore_case(const void *a, const void *b) +internal int +str8_compar_ignore_case(const void *a, const void *b) { return str8_compar(*(String8*)a, *(String8*)b, 1); } diff --git a/src/base/base_strings.h b/src/base/base_strings.h index 6c1796a0..84cd6aa0 100644 --- a/src/base/base_strings.h +++ b/src/base/base_strings.h @@ -185,7 +185,6 @@ internal String16 str16_cstring(U16 *c); internal String32 str32_cstring(U32 *c); internal String8 str8_cstring_capped(void *cstr, void *cap); internal String16 str16_cstring_capped(void *cstr, void *cap); -internal String8 str8_cstring_capped_reverse(void *raw_start, void *raw_cap); //////////////////////////////// //~ rjf: String Stylization diff --git a/src/coff/coff.c b/src/coff/coff.c index b7534ee8..7541f1a2 100644 --- a/src/coff/coff.c +++ b/src/coff/coff.c @@ -92,13 +92,8 @@ coff_read_symbol_name(String8 string_table, COFF_SymbolName *name) if (name->long_name.zeroes == 0) { str8_deserial_read_cstr(string_table, name->long_name.string_table_offset, &name_str); } else { - U32 i; - for (i = 0; i < sizeof(name->short_name); ++i) { - if (name->short_name[i] == '\0') { - break; - } - } - name_str = str8(name->short_name, i); + U32 name_size = idx_of_zero_byte64(name->short_name, sizeof(name->short_name)); + name_str = str8(name->short_name, name_size); } return name_str; } diff --git a/src/linker/codeview_ext/codeview.c b/src/linker/codeview_ext/codeview.c index ef6b6234..4c55c73d 100644 --- a/src/linker/codeview_ext/codeview.c +++ b/src/linker/codeview_ext/codeview.c @@ -142,18 +142,16 @@ cv_type_server_info_from_leaf(CV_Leaf leaf) CV_TypeServerInfo result = {0}; switch (leaf.kind) { case CV_LeafKind_TYPESERVER: { - CV_LeafTypeServer *ts = (CV_LeafTypeServer *) leaf.data.str; - - result.name = str8_cstring_capped_reverse(ts + 1, leaf.data.str + leaf.data.size); + CV_LeafTypeServer *ts = (CV_LeafTypeServer *) leaf.data.str; + result.name = str8_cstring_capped(ts + 1, leaf.data.str + leaf.data.size); result.sig.data1 = ts->sig; result.age = ts->age; } break; case CV_LeafKind_TYPESERVER2: { CV_LeafTypeServer2 *ts = (CV_LeafTypeServer2 *) leaf.data.str; - Assert(sizeof(result.sig) == sizeof(ts->sig70)); MemoryCopy(&result.sig, &ts->sig70, sizeof(ts->sig70)); - result.name = str8_cstring_capped_reverse(ts + 1, leaf.data.str + leaf.data.size); + result.name = str8_cstring_capped(ts + 1, leaf.data.str + leaf.data.size); result.age = ts->age; } break; case CV_LeafKind_TYPESERVER_ST: { diff --git a/src/third_party/martins_memfun/memfun.h b/src/third_party/martins_memfun/memfun.h new file mode 100644 index 00000000..95260bb6 --- /dev/null +++ b/src/third_party/martins_memfun/memfun.h @@ -0,0 +1,2683 @@ +#pragma once + +#include +#include +#include + +#if !defined(MEM_API) +# if defined(MEM_STATIC) +# define MEM_API static inline +# else +# define MEM_API extern +# endif +#endif + +// +// interface +// + +#ifdef __cplusplus +extern "C" { +#endif + +// compares bytes in lexicographic order and returns: +// < 0 if ptr1 comes before ptr2 +// = 0 if ptr1 contains same values as ptr2 +// > 0 if ptr1 comes after ptr2 +MEM_API int MemCompare(const void* ptr1, const void* ptr2, size_t size); + +// same as above, but case insensitive for ASCII characters +// value returned is produced as if comparing bytes converted to ASCII lowercase +MEM_API int MemCompareI(const void* ptr1, const void* ptr2, size_t size); + +// returns true if all bytes of ptr1 are the same as ptr2 +MEM_API bool MemIsEqual(const void* ptr1, const void* ptr2, size_t size); + +// returns first offset of "value" byte, or "size" if not found +MEM_API size_t MemFind(const void* ptr, size_t size, uint8_t value); + + +MEM_API int MemCompare_sse2 (const void* ptr1, const void* ptr2, size_t size); +MEM_API int MemCompare_avx2 (const void* ptr1, const void* ptr2, size_t size); +MEM_API int MemCompare_avx512(const void* ptr1, const void* ptr2, size_t size); +MEM_API int MemCompare_arm64 (const void* ptr1, const void* ptr2, size_t size); +MEM_API int MemCompare_rvv (const void* ptr1, const void* ptr2, size_t size); + + +MEM_API int MemCompareI_sse2 (const void* ptr1, const void* ptr2, size_t size); +MEM_API int MemCompareI_avx2 (const void* ptr1, const void* ptr2, size_t size); +MEM_API int MemCompareI_avx512(const void* ptr1, const void* ptr2, size_t size); +MEM_API int MemCompareI_arm64 (const void* ptr1, const void* ptr2, size_t size); +MEM_API int MemCompareI_rvv (const void* ptr1, const void* ptr2, size_t size); + + +MEM_API bool MemIsEqual_sse2 (const void* ptr1, const void* ptr2, size_t size); +MEM_API bool MemIsEqual_avx2 (const void* ptr1, const void* ptr2, size_t size); +MEM_API bool MemIsEqual_avx512(const void* ptr1, const void* ptr2, size_t size); +MEM_API bool MemIsEqual_arm64 (const void* ptr1, const void* ptr2, size_t size); +MEM_API bool MemIsEqual_rvv (const void* ptr1, const void* ptr2, size_t size); + + +MEM_API size_t MemFind_sse2 (const void* ptr, size_t size, uint8_t value); +MEM_API size_t MemFind_avx2 (const void* ptr, size_t size, uint8_t value); +MEM_API size_t MemFind_avx512(const void* ptr, size_t size, uint8_t value); +MEM_API size_t MemFind_arm64 (const void* ptr, size_t size, uint8_t value); +MEM_API size_t MemFind_rvv (const void* ptr, size_t size, uint8_t value); + + +#ifdef __cplusplus +} +#endif + +// +// implementation +// + +#if defined(MEM_STATIC) || defined(MEM_IMPLEMENTATION) + +// compiler +#if defined(__clang__) +# define MEM_COMPILER_CLANG 1 +#elif defined(__GNUC__) +# define MEM_COMPILER_GCC 1 +#elif defined(_MSC_VER) +# define MEM_COMPILER_MSVC 1 +# include +#else +# error unknown compiler +#endif + +// architecture +#if defined(__x86_64__) || defined(_M_AMD64) +# define MEM_ARCH_X64 1 +# include +#elif defined(__aarch64__) || defined(_M_ARM64) +# define MEM_ARCH_ARM64 1 +# include +#elif defined(__riscv) && __riscv_v >= 1000000 +# define MEM_ARCH_RVV 1 +# include +#else +# error unsupported arch +#endif + +// cpuid, only for x64 +#if MEM_ARCH_X64 +# if MEM_COMPILER_CLANG || MEM_COMPILER_GCC +# include +# define MEM_CPUID(x, info) __cpuid(x, info[0], info[1], info[2], info[3]) +# define MEM_CPUID2(x, y, info) __cpuid_count(x, y, info[0], info[1], info[2], info[3]) +# define MEM_XGETBV(x) __builtin_ia32_xgetbv(x) +# define MEM_GET32_RELAXED(ptr) __atomic_load_n(ptr, __ATOMIC_RELAXED) +# define MEM_SET32_RELAXED(ptr, value) __atomic_store_n(ptr, value, __ATOMIC_RELAXED); +# elif MEM_COMPILER_MSVC +# define MEM_CPUID(x, info) __cpuid(info, x) +# define MEM_CPUID2(x, y, info) __cpuidex(info, x, y) +# define MEM_XGETBV(x) _xgetbv(x) +# define MEM_GET32_RELAXED(ptr) __iso_volatile_load32(ptr) +# define MEM_SET32_RELAXED(ptr, value) __iso_volatile_store32(ptr, value); +# endif +#endif + +// unaligned memory access +#pragma pack(push, 1) +typedef struct { uint16_t value; } MemUnalignedPtr16; +typedef struct { uint32_t value; } MemUnalignedPtr32; +typedef struct { uint64_t value; } MemUnalignedPtr64; +#define MEM_PTR16U(ptr) (((MemUnalignedPtr16*)(ptr))->value) +#define MEM_PTR32U(ptr) (((MemUnalignedPtr32*)(ptr))->value) +#define MEM_PTR64U(ptr) (((MemUnalignedPtr64*)(ptr))->value) +#pragma pack(pop) + +// big-endian load, only for x64, compiles to movbe +#if MEM_ARCH_X64 +# if MEM_COMPILER_MSVC +# define MEM_GET16BE(ptr) _load_be_u16(ptr) +# define MEM_GET32BE(ptr) _load_be_u32(ptr) +# define MEM_GET64BE(ptr) _load_be_u64(ptr) +# elif MEM_COMPILER_CLANG || MEM_COMPILER_GCC +# define MEM_GET16BE(ptr) __builtin_bswap16(MEM_PTR16U(ptr)) +# define MEM_GET32BE(ptr) __builtin_bswap32(MEM_PTR32U(ptr)) +# define MEM_GET64BE(ptr) __builtin_bswap64(MEM_PTR64U(ptr)) +# endif +#endif + +// byteswap +#if MEM_COMPILER_CLANG || MEM_COMPILER_GCC +# define MEM_BSWAP64(x) __builtin_bswap64(x) +#elif MEM_COMPILER_MSVC +# define MEM_BSWAP64(x) _byteswap_uint64(x) +#endif + +// count trailing zeroes +#if MEM_COMPILER_CLANG || MEM_COMPILER_GCC +# define MEM_CTZ32(x) (size_t)__builtin_ctz(x) +# define MEM_CTZ64(x) (size_t)__builtin_ctzll(x) +#elif MEM_COMPILER_MSVC +# if MEM_ARCH_X64 +# define MEM_CTZ32(x) (size_t)_tzcnt_u32(x) +# define MEM_CTZ64(x) (size_t)_tzcnt_u64(x) +# elif MEM_ARCH_ARM64 +# define MEM_CTZ32(x) (size_t)_CountTrailingZeros(x) +# define MEM_CTZ64(x) (size_t)_CountTrailingZeros64(x) +# endif +#endif + +// shrx for x64 +#if MEM_ARCH_X64 +# if MEM_COMPILER_MSVC +# define MEM_SHRX_32(x, n) _shrx_u32(x, n) +# elif MEM_COMPILER_CLANG || MEM_COMPILER_GCC +# define MEM_SHRX_32(x, n) ((x) >> (n)) +# endif +#endif + +// x64 function attributes +#if MEM_ARCH_X64 && (MEM_COMPILER_CLANG || MEM_COMPILER_GCC) +# define MEM_TARGET_XSAVE __attribute__((target("xsave"))) +# define MEM_TARGET_AVX2 __attribute__((target("avx2,bmi,bmi2,movbe"))) +# define MEM_TARGET_AVX512 __attribute__((target("avx512f,avx512bw,avx512vbmi,bmi,bmi2"))) +#else +# define MEM_TARGET_XSAVE +# define MEM_TARGET_AVX2 +# define MEM_TARGET_AVX512 +#endif + +static inline uint8_t MemToLower1(uint8_t x) +{ + return (uint8_t)(x - 'A') <= ('Z' - 'A') ? (x + 'a' - 'A') : x; +} + +static inline uint64_t MemToLower8(uint64_t x) +{ + const uint64_t splat = ~0ULL / 255; + uint64_t heptets = x & (0x7F * splat); + uint64_t is_ascii = ~x & (0x80 * splat); + uint64_t is_gt_Z = heptets + (0x7F - 'Z') * splat; + uint64_t is_ge_A = heptets + (0x80 - 'A') * splat; + uint64_t is_upper = (is_ge_A ^ is_gt_Z) & is_ascii; + return x | (is_upper >> 2); +} + + +#if MEM_ARCH_X64 + +static inline __m128i MemToLower16(__m128i x) +{ + __m128i tmp = _mm_sub_epi8(x, _mm_set1_epi8('A' - 128)); + tmp = _mm_cmpgt_epi8(tmp, _mm_set1_epi8('Z' - 'A' - 128)); + tmp = _mm_andnot_si128(tmp, _mm_set1_epi8('a' - 'A')); + return _mm_add_epi8(x, tmp); +} + +MEM_TARGET_AVX2 +static inline __m256i MemToLower32(__m256i x) +{ + __m256i tmp = _mm256_sub_epi8(x, _mm256_set1_epi8('A' - 128)); + tmp = _mm256_cmpgt_epi8(tmp, _mm256_set1_epi8('Z' - 'A' - 128)); + tmp = _mm256_andnot_si256(tmp, _mm256_set1_epi8('a' - 'A')); + return _mm256_add_epi8(x, tmp); +} + +MEM_TARGET_AVX512 +static inline __m512i MemToLower64(__m512i x) +{ +#if 0 // version without VBMI + __m512i tmp = _mm512_sub_epi8(x, _mm512_set1_epi8('A')); + __mmask64 mask = _mm512_cmple_epu8_mask(tmp, _mm512_set1_epi8('Z' - 'A')); + return _mm512_mask_add_epi8(x, mask, x, _mm512_set1_epi8('a' - 'A')); +#else + static const uint8_t table[] = + { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + }; + const __m512i c0 = _mm512_loadu_epi8(table + 0x00); + const __m512i c1 = _mm512_loadu_epi8(table + 0x40); + __mmask64 mask = _mm512_cmplt_epu8_mask(x, _mm512_set1_epi8((char)0x80)); + return _mm512_mask2_permutex2var_epi8(c0, x, mask, c1); +#endif +} + +int MemCompare_sse2(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return 0; + } + + if (size <= 16) + { + const uint32_t PAGE_SIZE = 4096; + + uint32_t address = (uint32_t)(uintptr_t)p1 | (uint32_t)(uintptr_t)p2; + if ((address & (PAGE_SIZE - 1)) <= PAGE_SIZE - 16) + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint32_t mask = (1 + (uint16_t)_mm_movemask_epi8(r0)) & ((1 << size) - 1); + if (mask) + { + size_t index = MEM_CTZ32(mask); + return p1[index] - p2[index]; + } + return 0; + } + + if (size < 2) // size == 1 + { + return p1[0] - p2[0]; + } + + uint64_t a0, b0, a1, b1; + if (size < 4) // 2 <= size < 4 + { + a0 = MEM_PTR16U(p1); + b0 = MEM_PTR16U(p2); + a1 = MEM_PTR16U(p1 + size - 2); + b1 = MEM_PTR16U(p2 + size - 2); + } + else if (size < 8) // 4 <= size < 8 + { + a0 = MEM_PTR32U(p1); + b0 = MEM_PTR32U(p2); + a1 = MEM_PTR32U(p1 + size - 4); + b1 = MEM_PTR32U(p2 + size - 4); + } + else // 8 <= size <= 16 + { + a0 = MEM_PTR64U(p1); + b0 = MEM_PTR64U(p2); + a1 = MEM_PTR64U(p1 + size - 8); + b1 = MEM_PTR64U(p2 + size - 8); + } + + uint64_t a = MEM_BSWAP64(a0 != b0 ? a0 : a1); + uint64_t b = MEM_BSWAP64(a0 != b0 ? b0 : b1); + return (a > b) - (a < b); + } + + while (size >= 64) + { + __m128i a0 = _mm_loadu_si128((const __m128i*)(p1 + 0x00)); + __m128i b0 = _mm_loadu_si128((const __m128i*)(p2 + 0x00)); + __m128i a1 = _mm_loadu_si128((const __m128i*)(p1 + 0x10)); + __m128i b1 = _mm_loadu_si128((const __m128i*)(p2 + 0x10)); + __m128i a2 = _mm_loadu_si128((const __m128i*)(p1 + 0x20)); + __m128i b2 = _mm_loadu_si128((const __m128i*)(p2 + 0x20)); + __m128i a3 = _mm_loadu_si128((const __m128i*)(p1 + 0x30)); + __m128i b3 = _mm_loadu_si128((const __m128i*)(p2 + 0x30)); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + __m128i r1 = _mm_cmpeq_epi8(a1, b1); + __m128i r2 = _mm_cmpeq_epi8(a2, b2); + __m128i r3 = _mm_cmpeq_epi8(a3, b3); + __m128i r = _mm_and_si128(_mm_and_si128(r0, r1), _mm_and_si128(r2, r3)); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r); + if (mask) + { + mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = 0x00 + MEM_CTZ32(mask); + return p1[index] - p2[index]; + } + + mask = 1 + (uint16_t)_mm_movemask_epi8(r1); + if (mask) + { + size_t index = 0x10 + MEM_CTZ32(mask); + return p1[index] - p2[index]; + } + + mask = 1 + (uint16_t)_mm_movemask_epi8(r2); + if (mask) + { + size_t index = 0x20 + MEM_CTZ32(mask); + return p1[index] - p2[index]; + } + + mask = 1 + (uint16_t)_mm_movemask_epi8(r3); + size_t index = 0x30 + MEM_CTZ32(mask); + return p1[index] - p2[index]; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask); + return p1[index] - p2[index]; + } + + __m128i a1 = _mm_loadu_si128((const __m128i*)(p1 + 0x10)); + __m128i b1 = _mm_loadu_si128((const __m128i*)(p2 + 0x10)); + __m128i r1 = _mm_cmpeq_epi8(a1, b1); + + mask = 1 + (uint16_t)_mm_movemask_epi8(r1); + if (mask) + { + size_t index = 0x10 + MEM_CTZ32(mask); + return p1[index] - p2[index]; + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size & 16) // 16 <= size < 32 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask); + return p1[index] - p2[index]; + } + + size -= 16; + p1 += 16; + p2 += 16; + } + + if (size) // size < 16 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)(p1 + size - 16)); + __m128i b0 = _mm_loadu_si128((const __m128i*)(p2 + size - 16)); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask) + size - 16; + return p1[index] - p2[index]; + } + } + + return 0; +} + +int MemCompareI_sse2(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return 0; + } + + if (size <= 16) + { + const uint32_t PAGE_SIZE = 4096; + + uint32_t address = (uint32_t)(uintptr_t)p1 | (uint32_t)(uintptr_t)p2; + if ((address & (PAGE_SIZE - 1)) <= PAGE_SIZE - 16) + { + __m128i a0 = MemToLower16(_mm_loadu_si128((const __m128i*)p1)); + __m128i b0 = MemToLower16(_mm_loadu_si128((const __m128i*)p2)); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint32_t mask = (1 + (uint16_t)_mm_movemask_epi8(r0)) & ((1 << size) - 1); + if (mask) + { + size_t index = MEM_CTZ32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + return 0; + } + + if (size < 2) // size == 1 + { + return MemToLower1(p1[0]) - MemToLower1(p2[0]); + } + + uint64_t a0, b0, a1, b1; + if (size < 4) // 2 <= size < 4 + { + a0 = MEM_PTR16U(p1); + b0 = MEM_PTR16U(p2); + a1 = MEM_PTR16U(p1 + size - 2); + b1 = MEM_PTR16U(p2 + size - 2); + } + else if (size < 8) // 4 <= size < 8 + { + a0 = MEM_PTR32U(p1); + b0 = MEM_PTR32U(p2); + a1 = MEM_PTR32U(p1 + size - 4); + b1 = MEM_PTR32U(p2 + size - 4); + } + else // 8 <= size <= 16 + { + a0 = MEM_PTR64U(p1); + b0 = MEM_PTR64U(p2); + a1 = MEM_PTR64U(p1 + size - 8); + b1 = MEM_PTR64U(p2 + size - 8); + } + + uint64_t a = MemToLower8(MEM_BSWAP64(a0 != b0 ? a0 : a1)); + uint64_t b = MemToLower8(MEM_BSWAP64(a0 != b0 ? b0 : b1)); + return (a > b) - (a < b); + } + + while (size >= 64) + { + __m128i a0 = MemToLower16(_mm_loadu_si128((const __m128i*)(p1 + 0x00))); + __m128i b0 = MemToLower16(_mm_loadu_si128((const __m128i*)(p2 + 0x00))); + __m128i a1 = MemToLower16(_mm_loadu_si128((const __m128i*)(p1 + 0x10))); + __m128i b1 = MemToLower16(_mm_loadu_si128((const __m128i*)(p2 + 0x10))); + __m128i a2 = MemToLower16(_mm_loadu_si128((const __m128i*)(p1 + 0x20))); + __m128i b2 = MemToLower16(_mm_loadu_si128((const __m128i*)(p2 + 0x20))); + __m128i a3 = MemToLower16(_mm_loadu_si128((const __m128i*)(p1 + 0x30))); + __m128i b3 = MemToLower16(_mm_loadu_si128((const __m128i*)(p2 + 0x30))); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + __m128i r1 = _mm_cmpeq_epi8(a1, b1); + __m128i r2 = _mm_cmpeq_epi8(a2, b2); + __m128i r3 = _mm_cmpeq_epi8(a3, b3); + __m128i r = _mm_and_si128(_mm_and_si128(r0, r1), _mm_and_si128(r2, r3)); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r); + if (mask) + { + mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = 0x00 + MEM_CTZ32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + mask = 1 + (uint16_t)_mm_movemask_epi8(r1); + if (mask) + { + size_t index = 0x10 + MEM_CTZ32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + mask = 1 + (uint16_t)_mm_movemask_epi8(r2); + if (mask) + { + size_t index = 0x20 + MEM_CTZ32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + mask = 1 + (uint16_t)_mm_movemask_epi8(r3); + size_t index = 0x30 + MEM_CTZ32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + __m128i a0 = MemToLower16(_mm_loadu_si128((const __m128i*)p1)); + __m128i b0 = MemToLower16(_mm_loadu_si128((const __m128i*)p2)); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + __m128i a1 = MemToLower16(_mm_loadu_si128((const __m128i*)(p1 + 0x10))); + __m128i b1 = MemToLower16(_mm_loadu_si128((const __m128i*)(p2 + 0x10))); + __m128i r1 = _mm_cmpeq_epi8(a1, b1); + + mask = 1 + (uint16_t)_mm_movemask_epi8(r1); + if (mask) + { + size_t index = 0x10 + MEM_CTZ32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size & 16) // 16 <= size < 32 + { + __m128i a0 = MemToLower16(_mm_loadu_si128((const __m128i*)p1)); + __m128i b0 = MemToLower16(_mm_loadu_si128((const __m128i*)p2)); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + size -= 16; + p1 += 16; + p2 += 16; + } + + if (size) // size < 16 + { + __m128i a0 = MemToLower16(_mm_loadu_si128((const __m128i*)(p1 + size - 16))); + __m128i b0 = MemToLower16(_mm_loadu_si128((const __m128i*)(p2 + size - 16))); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask) + size - 16; + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + } + + return 0; +} + +bool MemIsEqual_sse2(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return true; + } + + if (size <= 16) + { + const uint32_t PAGE_SIZE = 4096; + + uint32_t address = (uint32_t)(uintptr_t)p1 | (uint32_t)(uintptr_t)p2; + if ((address & (PAGE_SIZE - 1)) <= PAGE_SIZE - 16) + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint32_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + return (mask << (32 - size)) == 0; + } + + if (size < 2) // size == 1 + { + return p1[0] == p2[0]; + } + + uint64_t a0, b0, a1, b1; + if (size < 4) // 2 <= size < 4 + { + a0 = MEM_PTR16U(p1); + b0 = MEM_PTR16U(p2); + a1 = MEM_PTR16U(p1 + size - 2); + b1 = MEM_PTR16U(p2 + size - 2); + } + else if (size < 8) // 4 <= size < 8 + { + a0 = MEM_PTR32U(p1); + b0 = MEM_PTR32U(p2); + a1 = MEM_PTR32U(p1 + size - 4); + b1 = MEM_PTR32U(p2 + size - 4); + } + else // 8 <= size <= 16 + { + a0 = MEM_PTR64U(p1); + b0 = MEM_PTR64U(p2); + a1 = MEM_PTR64U(p1 + size - 8); + b1 = MEM_PTR64U(p2 + size - 8); + } + + return (a0 == b0) & (a1 == b1); + } + + while (size >= 64) + { + __m128i a0 = _mm_loadu_si128((const __m128i*)(p1 + 0x00)); + __m128i b0 = _mm_loadu_si128((const __m128i*)(p2 + 0x00)); + __m128i a1 = _mm_loadu_si128((const __m128i*)(p1 + 0x10)); + __m128i b1 = _mm_loadu_si128((const __m128i*)(p2 + 0x10)); + __m128i a2 = _mm_loadu_si128((const __m128i*)(p1 + 0x20)); + __m128i b2 = _mm_loadu_si128((const __m128i*)(p2 + 0x20)); + __m128i a3 = _mm_loadu_si128((const __m128i*)(p1 + 0x30)); + __m128i b3 = _mm_loadu_si128((const __m128i*)(p2 + 0x30)); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + __m128i r1 = _mm_cmpeq_epi8(a1, b1); + __m128i r2 = _mm_cmpeq_epi8(a2, b2); + __m128i r3 = _mm_cmpeq_epi8(a3, b3); + __m128i r = _mm_and_si128(_mm_and_si128(r0, r1), _mm_and_si128(r2, r3)); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r); + if (mask) + { + return false; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i a1 = _mm_loadu_si128((const __m128i*)(p1 + 0x10)); + __m128i b1 = _mm_loadu_si128((const __m128i*)(p2 + 0x10)); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + __m128i r1 = _mm_cmpeq_epi8(a1, b1); + __m128i r = _mm_and_si128(r0, r1); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r); + if (mask) + { + return false; + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size & 16) // 16 <= size < 32 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + return false; + } + + size -= 16; + p1 += 16; + p2 += 16; + } + + if (size) // size < 16 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)(p1 + size - 16)); + __m128i b0 = _mm_loadu_si128((const __m128i*)(p2 + size - 16)); + __m128i r0 = _mm_cmpeq_epi8(a0, b0); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + return false; + } + } + + return true; +} + +size_t MemFind_sse2(const void* ptr, size_t size, uint8_t value) +{ + const uint8_t* p = (const uint8_t*)ptr; + const __m128i value16 = _mm_set1_epi8((char)value); + + if (size == 0) + { + return 0; + } + + if (size <= 16) + { + size_t address = (uint32_t)(uintptr_t)p % 16; + size_t extra = (address + size) <= 16 ? address : 0; + + __m128i a0 = _mm_loadu_si128((const __m128i*)(p - extra)); + __m128i r0 = _mm_cmpeq_epi8(a0, value16); + uint32_t mask = ((uint16_t)_mm_movemask_epi8(r0) >> extra) & ((1 << size) - 1); + + return mask ? MEM_CTZ32(mask) : size; + } + + size_t offset = 0; + while (size >= 64) + { + __m128i a0 = _mm_loadu_si128((const __m128i*)(p + 0x00)); + __m128i a1 = _mm_loadu_si128((const __m128i*)(p + 0x10)); + __m128i a2 = _mm_loadu_si128((const __m128i*)(p + 0x20)); + __m128i a3 = _mm_loadu_si128((const __m128i*)(p + 0x30)); + __m128i r0 = _mm_cmpeq_epi8(a0, value16); + __m128i r1 = _mm_cmpeq_epi8(a1, value16); + __m128i r2 = _mm_cmpeq_epi8(a2, value16); + __m128i r3 = _mm_cmpeq_epi8(a3, value16); + __m128i r = _mm_or_si128(_mm_or_si128(r0, r1), _mm_or_si128(r2, r3)); + + uint16_t mask = (uint16_t)_mm_movemask_epi8(r); + if (mask) + { + uint64_t m0 = (uint16_t)_mm_movemask_epi8(r0); + uint64_t m1 = (uint16_t)_mm_movemask_epi8(r1); + uint64_t m2 = (uint16_t)_mm_movemask_epi8(r2); + uint64_t m3 = mask; // if r0=r1=r2=0, then r3=r + + uint64_t m4 = (m3 << 48) | (m2 << 32) | (m1 << 16) | m0; + size_t index = MEM_CTZ64(m4); + return offset + index; + } + + offset += 64; + size -= 64; + p += 64; + } + + if (size & 32) + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p); + __m128i r0 = _mm_cmpeq_epi8(a0, value16); + + uint16_t mask = (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask); + return offset + index; + } + + __m128i a1 = _mm_loadu_si128((const __m128i*)(p + 0x10)); + __m128i r1 = _mm_cmpeq_epi8(a1, value16); + + mask = (uint16_t)_mm_movemask_epi8(r1); + if (mask) + { + size_t index = 0x10 + MEM_CTZ32(mask); + return offset + index; + } + + offset += 32; + size -= 32; + p += 32; + } + + if (size & 16) + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p); + __m128i r0 = _mm_cmpeq_epi8(a0, value16); + + uint16_t mask = (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask); + return offset + index; + } + + offset += 16; + size -= 16; + p += 16; + } + + if (size) // size < 16 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)(p + size - 16)); + __m128i r0 = _mm_cmpeq_epi8(a0, value16); + + uint16_t mask = (uint16_t)_mm_movemask_epi8(r0); + if (mask) + { + size_t index = MEM_CTZ32(mask) + size - 16; + return offset + index; + } + + offset += size; + } + + return offset; +} + +MEM_TARGET_AVX2 +int MemCompare_avx2(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return 0; + } + + if (size <= 32) + { + const uint32_t PAGE_SIZE = 4096; + + uint32_t address = (uint32_t)(uintptr_t)p1 | (uint32_t)(uintptr_t)p2; + if ((address & (PAGE_SIZE - 1)) <= PAGE_SIZE - 32) + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)p1); + __m256i b0 = _mm256_loadu_si256((const __m256i*)p2); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = _bzhi_u32(1 + (uint32_t)_mm256_movemask_epi8(r0), (uint32_t)size); + if (mask) + { + size_t index = _tzcnt_u32(mask); + return p1[index] - p2[index]; + } + + return 0; + } + + if (size < 2) // size == 1 + { + return p1[0] - p2[0]; + } + else if (size < 4) // 2 <= size < 4 + { + uint32_t a0 = MEM_GET16BE(p1); + uint32_t b0 = MEM_GET16BE(p2); + uint32_t a1 = MEM_GET16BE(p1 + size - 2); + uint32_t b1 = MEM_GET16BE(p2 + size - 2); + uint32_t a = (a0 != b0 ? a0 : a1); + uint32_t b = (a0 != b0 ? b0 : b1); + return a - b; + } + else if (size < 8) // 4 <= size < 8 + { + uint32_t a0 = MEM_GET32BE(p1); + uint32_t b0 = MEM_GET32BE(p2); + uint32_t a1 = MEM_GET32BE(p1 + size - 4); + uint32_t b1 = MEM_GET32BE(p2 + size - 4); + uint32_t a = (a0 != b0 ? a0 : a1); + uint32_t b = (a0 != b0 ? b0 : b1); + return (a > b) - (a < b); + } + else if (size <= 16) // 8 <= size <= 16 + { + uint64_t a0 = MEM_GET64BE(p1); + uint64_t b0 = MEM_GET64BE(p2); + uint64_t a1 = MEM_GET64BE(p1 + size - 8); + uint64_t b1 = MEM_GET64BE(p2 + size - 8); + uint64_t a = (a0 != b0 ? a0 : a1); + uint64_t b = (a0 != b0 ? b0 : b1); + return (a > b) - (a < b); + } + else // 16 < size <= 32 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i a1 = _mm_loadu_si128((const __m128i*)(p1 + size - 16)); + __m128i b1 = _mm_loadu_si128((const __m128i*)(p2 + size - 16)); + __m256i a = _mm256_inserti128_si256(_mm256_castsi128_si256(a0), a1, 1); + __m256i b = _mm256_inserti128_si256(_mm256_castsi128_si256(b0), b1, 1); + __m256i r = _mm256_cmpeq_epi8(a, b); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r); + if (mask) + { + size_t index = _tzcnt_u64(mask); + + // index = (index < 16) ? index : (index - 16) + (size - 16); + size -= 32; + index += index < 16 ? 0 : size; + + return p1[index] - p2[index]; + } + + return 0; + } + } + + while (size >= 128) + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)(p1 + 0x00)); + __m256i b0 = _mm256_loadu_si256((const __m256i*)(p2 + 0x00)); + __m256i a1 = _mm256_loadu_si256((const __m256i*)(p1 + 0x20)); + __m256i b1 = _mm256_loadu_si256((const __m256i*)(p2 + 0x20)); + __m256i a2 = _mm256_loadu_si256((const __m256i*)(p1 + 0x40)); + __m256i b2 = _mm256_loadu_si256((const __m256i*)(p2 + 0x40)); + __m256i a3 = _mm256_loadu_si256((const __m256i*)(p1 + 0x60)); + __m256i b3 = _mm256_loadu_si256((const __m256i*)(p2 + 0x60)); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + __m256i r1 = _mm256_cmpeq_epi8(a1, b1); + __m256i r2 = _mm256_cmpeq_epi8(a2, b2); + __m256i r3 = _mm256_cmpeq_epi8(a3, b3); + __m256i r = _mm256_and_si256(_mm256_and_si256(r0, r1), _mm256_and_si256(r2, r3)); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r); + if (mask) + { + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = 0x00 + _tzcnt_u32(mask); + return p1[index] - p2[index]; + } + + mask = 1 + (uint32_t)_mm256_movemask_epi8(r1); + if (mask) + { + size_t index = 0x20 + _tzcnt_u32(mask); + return p1[index] - p2[index]; + } + + mask = 1 + (uint32_t)_mm256_movemask_epi8(r2); + if (mask) + { + size_t index = 0x40 + _tzcnt_u32(mask); + return p1[index] - p2[index]; + } + + mask = 1 + (uint32_t)_mm256_movemask_epi8(r3); + size_t index = 0x60 + _tzcnt_u32(mask); + return p1[index] - p2[index]; + } + + size -= 128; + p1 += 128; + p2 += 128; + } + + if (size & 64) // 64 <= size < 128 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)p1); + __m256i b0 = _mm256_loadu_si256((const __m256i*)p2); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask); + return p1[index] - p2[index]; + } + + __m256i a1 = _mm256_loadu_si256((const __m256i*)(p1 + 0x20)); + __m256i b1 = _mm256_loadu_si256((const __m256i*)(p2 + 0x20)); + __m256i r1 = _mm256_cmpeq_epi8(a1, b1); + + mask = 1 + (uint32_t)_mm256_movemask_epi8(r1); + if (mask) + { + size_t index = 0x20 + _tzcnt_u32(mask); + return p1[index] - p2[index]; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)p1); + __m256i b0 = _mm256_loadu_si256((const __m256i*)p2); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask); + return p1[index] - p2[index]; + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size) // size < 32 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)(p1 + size - 32)); + __m256i b0 = _mm256_loadu_si256((const __m256i*)(p2 + size - 32)); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask) + size - 32; + return p1[index] - p2[index]; + } + } + + return 0; +} + +MEM_TARGET_AVX2 +int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return 0; + } + + if (size <= 32) + { + const uint32_t PAGE_SIZE = 4096; + + uint32_t address = (uint32_t)(uintptr_t)p1 | (uint32_t)(uintptr_t)p2; + if ((address & (PAGE_SIZE - 1)) <= PAGE_SIZE - 32) + { + __m256i a0 = MemToLower32(_mm256_loadu_si256((const __m256i*)p1)); + __m256i b0 = MemToLower32(_mm256_loadu_si256((const __m256i*)p2)); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = _bzhi_u32(1 + (uint32_t)_mm256_movemask_epi8(r0), (uint32_t)size); + if (mask) + { + size_t index = _tzcnt_u32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + return 0; + } + + if (size < 2) // size == 1 + { + return MemToLower1(p1[0]) - MemToLower1(p2[0]); + } + else if (size < 4) // 2 <= size < 4 + { + uint32_t a0 = MEM_GET16BE(p1); + uint32_t b0 = MEM_GET16BE(p2); + uint32_t a1 = MEM_GET16BE(p1 + size - 2); + uint32_t b1 = MEM_GET16BE(p2 + size - 2); + uint32_t a = (a0 != b0 ? a0 : a1); + uint32_t b = (a0 != b0 ? b0 : b1); + uint64_t tmp = MemToLower8(((uint64_t)a << 32) | b); + a = (uint32_t)(tmp >> 32); + b = (uint32_t)(tmp); + return a - b; + } + else if (size < 8) // 4 <= size < 8 + { + uint32_t a0 = MEM_GET32BE(p1); + uint32_t b0 = MEM_GET32BE(p2); + uint32_t a1 = MEM_GET32BE(p1 + size - 4); + uint32_t b1 = MEM_GET32BE(p2 + size - 4); + uint32_t a = (a0 != b0 ? a0 : a1); + uint32_t b = (a0 != b0 ? b0 : b1); + uint64_t tmp = MemToLower8(((uint64_t)a << 32) | b); + a = (uint32_t)(tmp >> 32); + b = (uint32_t)(tmp); + return (a > b) - (a < b); + } + else if (size <= 16) // 8 <= size <= 16 + { + uint64_t a0 = MEM_GET64BE(p1); + uint64_t b0 = MEM_GET64BE(p2); + uint64_t a1 = MEM_GET64BE(p1 + size - 8); + uint64_t b1 = MEM_GET64BE(p2 + size - 8); + uint64_t a = MemToLower8(a0 != b0 ? a0 : a1); + uint64_t b = MemToLower8(a0 != b0 ? b0 : b1); + return (a > b) - (a < b); + } + else // 16 < size <= 32 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i a1 = _mm_loadu_si128((const __m128i*)(p1 + size - 16)); + __m128i b1 = _mm_loadu_si128((const __m128i*)(p2 + size - 16)); + __m256i a = MemToLower32(_mm256_inserti128_si256(_mm256_castsi128_si256(a0), a1, 1)); + __m256i b = MemToLower32(_mm256_inserti128_si256(_mm256_castsi128_si256(b0), b1, 1)); + __m256i r = _mm256_cmpeq_epi8(a, b); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r); + if (mask) + { + size_t index = _tzcnt_u64(mask); + + // index = (index < 16) ? index : (index - 16) + (size - 16); + size -= 32; + index += index < 16 ? 0 : size; + + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + return 0; + } + } + + while (size >= 128) + { + __m256i a0 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p1 + 0x00))); + __m256i b0 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p2 + 0x00))); + __m256i a1 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p1 + 0x20))); + __m256i b1 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p2 + 0x20))); + __m256i a2 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p1 + 0x40))); + __m256i b2 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p2 + 0x40))); + __m256i a3 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p1 + 0x60))); + __m256i b3 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p2 + 0x60))); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + __m256i r1 = _mm256_cmpeq_epi8(a1, b1); + __m256i r2 = _mm256_cmpeq_epi8(a2, b2); + __m256i r3 = _mm256_cmpeq_epi8(a3, b3); + __m256i r = _mm256_and_si256(_mm256_and_si256(r0, r1), _mm256_and_si256(r2, r3)); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r); + if (mask) + { + mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = 0x00 + _tzcnt_u32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + mask = 1 + (uint32_t)_mm256_movemask_epi8(r1); + if (mask) + { + size_t index = 0x20 + _tzcnt_u32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + mask = 1 + (uint32_t)_mm256_movemask_epi8(r2); + if (mask) + { + size_t index = 0x40 + _tzcnt_u32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + mask = 1 + (uint32_t)_mm256_movemask_epi8(r3); + size_t index = 0x60 + _tzcnt_u32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + size -= 128; + p1 += 128; + p2 += 128; + } + + if (size & 64) // 64 <= size < 128 + { + __m256i a0 = MemToLower32(_mm256_loadu_si256((const __m256i*)p1)); + __m256i b0 = MemToLower32(_mm256_loadu_si256((const __m256i*)p2)); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + __m256i a1 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p1 + 0x20))); + __m256i b1 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p2 + 0x20))); + __m256i r1 = _mm256_cmpeq_epi8(a1, b1); + + mask = 1 + (uint32_t)_mm256_movemask_epi8(r1); + if (mask) + { + size_t index = 0x20 + _tzcnt_u32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + __m256i a0 = MemToLower32(_mm256_loadu_si256((const __m256i*)p1)); + __m256i b0 = MemToLower32(_mm256_loadu_si256((const __m256i*)p2)); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask); + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size) // size < 32 + { + __m256i a0 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p1 + size - 32))); + __m256i b0 = MemToLower32(_mm256_loadu_si256((const __m256i*)(p2 + size - 32))); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask) + size - 32; + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + } + + return 0; +} + +MEM_TARGET_AVX2 +bool MemIsEqual_avx2(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return true; + } + + if (size <= 32) + { + const uint32_t PAGE_SIZE = 4096; + + uint32_t address = (uint32_t)(uintptr_t)p1 | (uint32_t)(uintptr_t)p2; + if ((address & (PAGE_SIZE - 1)) <= PAGE_SIZE - 32) + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)p1); + __m256i b0 = _mm256_loadu_si256((const __m256i*)p2); + __m256i r0 = _mm256_cmpeq_epi8(a0, b0); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + return _bzhi_u32(mask, (uint32_t)size) == 0; + } + + if (size < 2) // size == 1 + { + return p1[0] == p2[0]; + } + else if (size < 4) // 2 <= size < 4 + { + uint32_t a0 = MEM_PTR16U(p1); + uint32_t b0 = MEM_PTR16U(p2); + uint32_t a1 = MEM_PTR16U(p1 + size - 2); + uint32_t b1 = MEM_PTR16U(p2 + size - 2); + return (a0 == b0) & (a1 == b1); + } + else if (size < 8) // 4 <= size < 8 + { + uint32_t a0 = MEM_PTR32U(p1); + uint32_t b0 = MEM_PTR32U(p2); + uint32_t a1 = MEM_PTR32U(p1 + size - 4); + uint32_t b1 = MEM_PTR32U(p2 + size - 4); + return (a0 == b0) & (a1 == b1); + } + else if (size <= 16) // 8 <= size <= 16 + { + uint64_t a0 = MEM_PTR64U(p1); + uint64_t b0 = MEM_PTR64U(p2); + uint64_t a1 = MEM_PTR64U(p1 + size - 8); + uint64_t b1 = MEM_PTR64U(p2 + size - 8); + return (a0 == b0) & (a1 == b1); + } + else // 16 < size <= 32 + { + __m128i a0 = _mm_loadu_si128((const __m128i*)p1); + __m128i b0 = _mm_loadu_si128((const __m128i*)p2); + __m128i a1 = _mm_loadu_si128((const __m128i*)(p1 + size - 16)); + __m128i b1 = _mm_loadu_si128((const __m128i*)(p2 + size - 16)); + __m256i a = _mm256_inserti128_si256(_mm256_castsi128_si256(a1), a0, 1); + __m256i b = _mm256_inserti128_si256(_mm256_castsi128_si256(b1), b0, 1); + __m256i r = _mm256_xor_si256(a, b); + return !!_mm256_testz_si256(r, r); + } + } + + while (size >= 128) + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)(p1 + 0x00)); + __m256i b0 = _mm256_loadu_si256((const __m256i*)(p2 + 0x00)); + __m256i a1 = _mm256_loadu_si256((const __m256i*)(p1 + 0x20)); + __m256i b1 = _mm256_loadu_si256((const __m256i*)(p2 + 0x20)); + __m256i a2 = _mm256_loadu_si256((const __m256i*)(p1 + 0x40)); + __m256i b2 = _mm256_loadu_si256((const __m256i*)(p2 + 0x40)); + __m256i a3 = _mm256_loadu_si256((const __m256i*)(p1 + 0x60)); + __m256i b3 = _mm256_loadu_si256((const __m256i*)(p2 + 0x60)); + __m256i r0 = _mm256_xor_si256(a0, b0); + __m256i r1 = _mm256_xor_si256(a1, b1); + __m256i r2 = _mm256_xor_si256(a2, b2); + __m256i r3 = _mm256_xor_si256(a3, b3); + __m256i r = _mm256_or_si256(_mm256_or_si256(r0, r1), _mm256_or_si256(r2, r3)); + + if (!_mm256_testz_si256(r, r)) + { + return false; + } + + size -= 128; + p1 += 128; + p2 += 128; + } + + if (size & 64) // 64 <= size < 128 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)p1); + __m256i b0 = _mm256_loadu_si256((const __m256i*)p2); + __m256i a1 = _mm256_loadu_si256((const __m256i*)(p1 + 0x20)); + __m256i b1 = _mm256_loadu_si256((const __m256i*)(p2 + 0x20)); + __m256i r0 = _mm256_xor_si256(a0, b0); + __m256i r1 = _mm256_xor_si256(a1, b1); + __m256i r = _mm256_or_si256(r0, r1); + + if (!_mm256_testz_si256(r, r)) + { + return false; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)p1); + __m256i b0 = _mm256_loadu_si256((const __m256i*)p2); + __m256i r0 = _mm256_xor_si256(a0, b0); + + if (!_mm256_testz_si256(r0, r0)) + { + return false; + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size) // size < 32 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)(p1 + size - 32)); + __m256i b0 = _mm256_loadu_si256((const __m256i*)(p2 + size - 32)); + __m256i r0 = _mm256_xor_si256(a0, b0); + + if (!_mm256_testz_si256(r0, r0)) + { + return false; + } + } + + return true; +} + +MEM_TARGET_AVX2 +size_t MemFind_avx2(const void* ptr, size_t size, uint8_t value) +{ + const uint8_t* p = (const uint8_t*)ptr; + __m256i value32 = _mm256_set1_epi8((char)value); + + if (size == 0) + { + return 0; + } + + if (size <= 32) + { + size_t address = (uint32_t)(uintptr_t)p % 32; + size_t extra = (address + size) <= 32 ? address : 0; + + __m256i a0 = _mm256_loadu_si256((const __m256i*)(p - extra)); + __m256i r0 = _mm256_cmpeq_epi8(value32, a0); + + uint32_t mask = _mm256_movemask_epi8(r0); + mask = _bzhi_u32(MEM_SHRX_32(mask, (uint32_t)extra), (uint32_t)size); + + return mask ? _tzcnt_u32(mask) : size; + } + + size_t offset = 0; + while (size >= 128) + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)(p + 0x00)); + __m256i a1 = _mm256_loadu_si256((const __m256i*)(p + 0x20)); + __m256i a2 = _mm256_loadu_si256((const __m256i*)(p + 0x40)); + __m256i a3 = _mm256_loadu_si256((const __m256i*)(p + 0x60)); + __m256i r0 = _mm256_cmpeq_epi8(value32, a0); + __m256i r1 = _mm256_cmpeq_epi8(value32, a1); + __m256i r2 = _mm256_cmpeq_epi8(value32, a2); + __m256i r3 = _mm256_cmpeq_epi8(value32, a3); + __m256i r = _mm256_or_si256(_mm256_or_si256(r0, r1), _mm256_or_si256(r2, r3)); + + uint32_t mask = (uint32_t)_mm256_movemask_epi8(r); + if (mask) + { + uint64_t m0 = (uint32_t)_mm256_movemask_epi8(r0); + uint64_t m1 = (uint32_t)_mm256_movemask_epi8(r1); + uint64_t m2 = (uint32_t)_mm256_movemask_epi8(r2); + uint64_t m3 = mask; // if r0=r1=r2=0, then r3=r + + uint64_t m01 = (m1 << 32) | m0; + uint64_t m23 = (m3 << 32) | m2; + + size_t idx0 = _tzcnt_u64(m01); + size_t idx1 = _tzcnt_u64(m23); + + offset += idx0; + offset += m01 ? 0 : idx1; + return offset; + } + + offset += 128; + size -= 128; + p += 128; + } + + if (size & 64) // 64 <= size < 128 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)p); + __m256i r0 = _mm256_cmpeq_epi8(value32, a0); + + uint32_t mask = (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask); + return offset + index; + } + + __m256i a1 = _mm256_loadu_si256((const __m256i*)(p + 0x20)); + __m256i r1 = _mm256_cmpeq_epi8(value32, a1); + + mask = (uint32_t)_mm256_movemask_epi8(r1); + if (mask) + { + size_t index = 0x20 + _tzcnt_u32(mask); + return offset + index; + } + + offset += 64; + size -= 64; + p += 64; + } + + if (size & 32) // 32 <= size < 64 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)p); + __m256i r0 = _mm256_cmpeq_epi8(value32, a0); + + uint32_t mask = (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask); + return offset + index; + } + + offset += 32; + size -= 32; + p += 32; + } + + if (size) // size < 32 + { + __m256i a0 = _mm256_loadu_si256((const __m256i*)(p + size - 32)); + __m256i r0 = _mm256_cmpeq_epi8(value32, a0); + + uint32_t mask = (uint32_t)_mm256_movemask_epi8(r0); + if (mask) + { + size_t index = _tzcnt_u32(mask) + size - 32; + return offset + index; + } + + offset += size; + } + + return offset; +} + +MEM_TARGET_AVX512 +int MemCompare_avx512(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + size_t extra = size & 63; + if (extra) + { + __mmask64 mask = _cvtu64_mask64(_bzhi_u64(~0ULL, (uint32_t)extra)); + + __m512i a = _mm512_maskz_loadu_epi8(mask, p1); + __m512i b = _mm512_maskz_loadu_epi8(mask, p2); + + __mmask64 m = _mm512_cmpneq_epu8_mask(a, b); + if (!_kortestz_mask64_u8(m, m)) + { + int r1 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(a, b))); + int r2 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(b, a))); + return r1 - r2; + } + + size -= extra; + p1 += extra; + p2 += extra; + } + + if (size & 64) + { + __m512i a = _mm512_loadu_epi8(p1); + __m512i b = _mm512_loadu_epi8(p2); + + __mmask64 m = _mm512_cmpneq_epu8_mask(a, b); + if (!_kortestz_mask64_u8(m, m)) + { + int r1 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(a, b))); + int r2 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(b, a))); + return r1 - r2; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + while (size) + { + __m512i a0 = _mm512_loadu_epi8(p1 + 0x00); + __m512i b0 = _mm512_loadu_epi8(p2 + 0x00); + __m512i a1 = _mm512_loadu_epi8(p1 + 0x40); + __m512i b1 = _mm512_loadu_epi8(p2 + 0x40); + + __mmask64 m0 = _mm512_cmpneq_epu8_mask(a0, b0); + __mmask64 m1 = _mm512_cmpneq_epu8_mask(a1, b1); + if (!_kortestz_mask64_u8(m0, m1)) + { + int r10 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(a0, b0))); + int r20 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(b0, a0))); + int r11 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(a1, b1))); + int r21 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(b1, a1))); + + int r1 = (r10 == r20) ? r11 : r10; + int r2 = (r10 == r20) ? r21 : r20; + return r1 - r2; + } + + size -= 128; + p1 += 128; + p2 += 128; + } + + return 0; +} + +MEM_TARGET_AVX512 +int MemCompareI_avx512(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + size_t extra = size & 63; + if (extra) + { + __mmask64 mask = _cvtu64_mask64(_bzhi_u64(~0ULL, (uint32_t)extra)); + + __m512i a = MemToLower64(_mm512_maskz_loadu_epi8(mask, p1)); + __m512i b = MemToLower64(_mm512_maskz_loadu_epi8(mask, p2)); + + __mmask64 m = _mm512_cmpneq_epu8_mask(a, b); + if (!_kortestz_mask64_u8(m, m)) + { + int r1 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(a, b))); + int r2 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(b, a))); + return r1 - r2; + } + + size -= extra; + p1 += extra; + p2 += extra; + } + + if (size & 64) + { + __m512i a = MemToLower64(_mm512_loadu_epi8(p1)); + __m512i b = MemToLower64(_mm512_loadu_epi8(p2)); + + __mmask64 m = _mm512_cmpneq_epu8_mask(a, b); + if (!_kortestz_mask64_u8(m, m)) + { + int r1 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(a, b))); + int r2 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(b, a))); + return r1 - r2; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + while (size) + { + __m512i a0 = MemToLower64(_mm512_loadu_epi8(p1 + 0x00)); + __m512i b0 = MemToLower64(_mm512_loadu_epi8(p2 + 0x00)); + __m512i a1 = MemToLower64(_mm512_loadu_epi8(p1 + 0x40)); + __m512i b1 = MemToLower64(_mm512_loadu_epi8(p2 + 0x40)); + + __mmask64 m0 = _mm512_cmpneq_epu8_mask(a0, b0); + __mmask64 m1 = _mm512_cmpneq_epu8_mask(a1, b1); + if (!_kortestz_mask64_u8(m0, m1)) + { + int r10 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(a0, b0))); + int r20 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(b0, a0))); + int r11 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(a1, b1))); + int r21 = (int)_tzcnt_u64(_cvtmask64_u64(_mm512_cmplt_epu8_mask(b1, a1))); + + int r1 = (r10 == r20) ? r11 : r10; + int r2 = (r10 == r20) ? r21 : r20; + return r1 - r2; + } + + size -= 128; + p1 += 128; + p2 += 128; + } + + return 0; +} + +MEM_TARGET_AVX512 +bool MemIsEqual_avx512(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + size_t extra = size & 63; + if (extra) + { + __mmask64 mask = _cvtu64_mask64(_bzhi_u64(~0ULL, (uint32_t)extra)); + + __m512i a = _mm512_maskz_loadu_epi8(mask, p1); + __m512i b = _mm512_maskz_loadu_epi8(mask, p2); + + __mmask64 m = _mm512_cmpneq_epu8_mask(a, b); + if (!_kortestz_mask64_u8(m, m)) + { + return false; + } + + size -= extra; + p1 += extra; + p2 += extra; + } + + if (size & 64) + { + __m512i a = _mm512_loadu_epi8(p1); + __m512i b = _mm512_loadu_epi8(p2); + + __mmask64 m = _mm512_cmpneq_epu8_mask(a, b); + if (!_kortestz_mask64_u8(m, m)) + { + return false; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + while (size) + { + __m512i a0 = _mm512_loadu_epi8(p1 + 0x00); + __m512i b0 = _mm512_loadu_epi8(p2 + 0x00); + __m512i a1 = _mm512_loadu_epi8(p1 + 0x40); + __m512i b1 = _mm512_loadu_epi8(p2 + 0x40); + + __mmask64 m0 = _mm512_cmpneq_epu8_mask(a0, b0); + __mmask64 m1 = _mm512_cmpneq_epu8_mask(a1, b1); + + if (!_kortestz_mask64_u8(m0, m1)) + { + return false; + } + + size -= 128; + p1 += 128; + p2 += 128; + } + + return true; +} + +MEM_TARGET_AVX512 +size_t MemFind_avx512(const void* ptr, size_t size, uint8_t value) +{ + const uint8_t* p = (const uint8_t*)ptr; + const __m512i value64 = _mm512_set1_epi8((char)value); + + size_t offset = 0; + + size_t extra = size & 63; + if (extra) + { + __mmask64 mask = _cvtu64_mask64(_bzhi_u64(~0ULL, (uint32_t)extra)); + + __m512i a = _mm512_mask_loadu_epi8(_mm512_set1_epi8((char)~value), mask, p); + + __mmask64 m = _mm512_cmpeq_epu8_mask(value64, a); + if (!_kortestz_mask64_u8(m, m)) + { + return (size_t)_tzcnt_u64(_cvtmask64_u64(m)); + } + + offset += extra; + size -= extra; + p += extra; + } + + if (size & 64) + { + __m512i a = _mm512_loadu_epi8(p); + + __mmask64 m = _mm512_cmpeq_epu8_mask(value64, a); + if (!_kortestz_mask64_u8(m, m)) + { + return offset + (size_t)_tzcnt_u64(_cvtmask64_u64(m)); + } + + offset += 64; + size -= 64; + p += 64; + } + + while (size) + { + __m512i a0 = _mm512_loadu_epi8(p + 0x00); + __m512i a1 = _mm512_loadu_epi8(p + 0x40); + + __mmask64 m0 = _mm512_cmpeq_epu8_mask(value64, a0); + __mmask64 m1 = _mm512_cmpeq_epu8_mask(value64, a1); + + if (!_kortestz_mask64_u8(m0, m1)) + { + size_t r0 = _tzcnt_u64(_cvtmask64_u64(m0)); + size_t r1 = _tzcnt_u64(_cvtmask64_u64(m1)); + + offset += r0; + offset += r0 == 64 ? r1 : 0; + return offset; + } + + offset += 128; + size -= 128; + p += 128; + } + + return offset; +} + +#endif + + +#if MEM_ARCH_ARM64 + +static inline uint8x16_t MemToLower16(uint8x16_t x) +{ + uint8x16_t tmp = vsubq_u8(x, vdupq_n_u8('A')); + tmp = vcleq_u8(tmp, vdupq_n_u8('Z' - 'A')); + tmp = vandq_u8(tmp, vdupq_n_u8('a' - 'A')); + return vaddq_u8(x, tmp); +} + +int MemCompare_arm64(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return 0; + } + + if (size <= 16) + { + if (size < 2) // size == 1 + { + return p1[0] - p2[0]; + } + + uint64_t a0, b0, a1, b1; + if (size < 4) // 2 <= size < 4 + { + a0 = MEM_PTR16U(p1); + b0 = MEM_PTR16U(p2); + a1 = MEM_PTR16U(p1 + size - 2); + b1 = MEM_PTR16U(p2 + size - 2); + } + else if (size < 8) // 4 <= size < 8 + { + a0 = MEM_PTR32U(p1); + b0 = MEM_PTR32U(p2); + a1 = MEM_PTR32U(p1 + size - 4); + b1 = MEM_PTR32U(p2 + size - 4); + } + else // 8 <= size <= 16 + { + a0 = MEM_PTR64U(p1); + b0 = MEM_PTR64U(p2); + a1 = MEM_PTR64U(p1 + size - 8); + b1 = MEM_PTR64U(p2 + size - 8); + } + + uint64_t a = MEM_BSWAP64(a0 != b0 ? a0 : a1); + uint64_t b = MEM_BSWAP64(a0 != b0 ? b0 : b1); + return (a > b) - (a < b); + } + + uint8x16_t va = vdupq_n_u8(0); + uint8x16_t vb = vdupq_n_u8(0); + + while (size >= 64) + { + uint8x16x4_t a = vld1q_u8_x4(p1); + uint8x16x4_t b = vld1q_u8_x4(p2); + + uint8x16_t c0 = vceqq_u8(a.val[0], b.val[0]); + uint8x16_t c1 = vceqq_u8(a.val[1], b.val[1]); + uint8x16_t c2 = vceqq_u8(a.val[2], b.val[2]); + uint8x16_t c3 = vceqq_u8(a.val[3], b.val[3]); + uint8x16_t c = vandq_u8(vandq_u8(c0, c1), vandq_u8(c2, c3)); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(c), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles + 1) + { + uint8x16_t vm; + va = a.val[3]; + vb = b.val[3]; + + vm = vdupq_n_u8(vminvq_u8(c2)); + va = vbslq_u8(vm, va, a.val[2]); + vb = vbslq_u8(vm, vb, b.val[2]); + + vm = vdupq_n_u8(vminvq_u8(c1)); + va = vbslq_u8(vm, va, a.val[1]); + vb = vbslq_u8(vm, vb, b.val[1]); + + vm = vdupq_n_u8(vminvq_u8(c0)); + va = vbslq_u8(vm, va, a.val[0]); + vb = vbslq_u8(vm, vb, b.val[0]); + + goto done; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + uint8x16x2_t a = vld1q_u8_x2(p1); + uint8x16x2_t b = vld1q_u8_x2(p2); + + uint8x16_t c0 = vceqq_u8(a.val[0], b.val[0]); + uint8x16_t c1 = vceqq_u8(a.val[1], b.val[1]); + + uint8x8_t mask0 = vshrn_n_u16(vreinterpretq_u16_u8(c0), 4); + uint64_t nibbles0 = vget_lane_u64(vreinterpret_u64_u8(mask0), 0); + if (nibbles0 + 1) + { + va = a.val[0]; + vb = b.val[0]; + goto done; + } + + uint8x8_t mask1 = vshrn_n_u16(vreinterpretq_u16_u8(c1), 4); + uint64_t nibbles1 = vget_lane_u64(vreinterpret_u64_u8(mask1), 0); + if (nibbles1 + 1) + { + va = a.val[1]; + vb = b.val[1]; + goto done; + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size & 16) // 16 <= size < 32 + { + va = vld1q_u8(p1); + vb = vld1q_u8(p2); + + uint8x16_t c = vceqq_u8(va, vb); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(c), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles + 1) + { + goto done; + } + + size -= 16; + p1 += 16; + p2 += 16; + } + + if (size) // size < 16 + { + va = vld1q_u8(p1 + size - 16); + vb = vld1q_u8(p2 + size - 16); + } + +done:; + uint64x2_t a64 = vreinterpretq_u64_u8(vrev64q_u8(va)); + uint64x2_t b64 = vreinterpretq_u64_u8(vrev64q_u8(vb)); + uint64_t a0 = vgetq_lane_u64(a64, 0); + uint64_t b0 = vgetq_lane_u64(b64, 0); + uint64_t a1 = vgetq_lane_u64(a64, 1); + uint64_t b1 = vgetq_lane_u64(b64, 1); + uint64_t a = (a0 != b0 ? a0 : a1); + uint64_t b = (a0 != b0 ? b0 : b1); + return (a > b) - (a < b); +} + +int MemCompareI_arm64(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return 0; + } + + if (size <= 16) + { + if (size < 2) // size == 1 + { + return MemToLower1(p1[0]) - MemToLower1(p2[0]); + } + + uint64_t a0, b0, a1, b1; + if (size < 4) // 2 <= size < 4 + { + a0 = MEM_PTR16U(p1); + b0 = MEM_PTR16U(p2); + a1 = MEM_PTR16U(p1 + size - 2); + b1 = MEM_PTR16U(p2 + size - 2); + } + else if (size < 8) // 4 <= size < 8 + { + a0 = MEM_PTR32U(p1); + b0 = MEM_PTR32U(p2); + a1 = MEM_PTR32U(p1 + size - 4); + b1 = MEM_PTR32U(p2 + size - 4); + } + else // 8 <= size <= 16 + { + a0 = MEM_PTR64U(p1); + b0 = MEM_PTR64U(p2); + a1 = MEM_PTR64U(p1 + size - 8); + b1 = MEM_PTR64U(p2 + size - 8); + } + + uint64_t a = MemToLower8(MEM_BSWAP64(a0 != b0 ? a0 : a1)); + uint64_t b = MemToLower8(MEM_BSWAP64(a0 != b0 ? b0 : b1)); + return (a > b) - (a < b); + } + + uint8x16_t va = vdupq_n_u8(0); + uint8x16_t vb = vdupq_n_u8(0); + + while (size >= 64) + { + uint8x16x4_t a = vld1q_u8_x4(p1); + uint8x16x4_t b = vld1q_u8_x4(p2); + + a.val[0] = MemToLower16(a.val[0]); + b.val[0] = MemToLower16(b.val[0]); + a.val[1] = MemToLower16(a.val[1]); + b.val[1] = MemToLower16(b.val[1]); + a.val[2] = MemToLower16(a.val[2]); + b.val[2] = MemToLower16(b.val[2]); + a.val[3] = MemToLower16(a.val[3]); + b.val[3] = MemToLower16(b.val[3]); + + uint8x16_t c0 = vceqq_u8(a.val[0], b.val[0]); + uint8x16_t c1 = vceqq_u8(a.val[1], b.val[1]); + uint8x16_t c2 = vceqq_u8(a.val[2], b.val[2]); + uint8x16_t c3 = vceqq_u8(a.val[3], b.val[3]); + uint8x16_t c = vandq_u8(vandq_u8(c0, c1), vandq_u8(c2, c3)); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(c), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles + 1) + { + uint8x16_t vm; + va = a.val[3]; + vb = b.val[3]; + + vm = vdupq_n_u8(vminvq_u8(c2)); + va = vbslq_u8(vm, va, a.val[2]); + vb = vbslq_u8(vm, vb, b.val[2]); + + vm = vdupq_n_u8(vminvq_u8(c1)); + va = vbslq_u8(vm, va, a.val[1]); + vb = vbslq_u8(vm, vb, b.val[1]); + + vm = vdupq_n_u8(vminvq_u8(c0)); + va = vbslq_u8(vm, va, a.val[0]); + vb = vbslq_u8(vm, vb, b.val[0]); + + goto done; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + uint8x16x2_t a = vld1q_u8_x2(p1); + uint8x16x2_t b = vld1q_u8_x2(p2); + + a.val[0] = MemToLower16(a.val[0]); + b.val[0] = MemToLower16(b.val[0]); + a.val[1] = MemToLower16(a.val[1]); + b.val[1] = MemToLower16(b.val[1]); + + uint8x16_t c0 = vceqq_u8(a.val[0], b.val[0]); + uint8x16_t c1 = vceqq_u8(a.val[1], b.val[1]); + + uint8x8_t mask0 = vshrn_n_u16(vreinterpretq_u16_u8(c0), 4); + uint64_t nibbles0 = vget_lane_u64(vreinterpret_u64_u8(mask0), 0); + if (nibbles0 + 1) + { + va = a.val[0]; + vb = b.val[0]; + goto done; + } + + uint8x8_t mask1 = vshrn_n_u16(vreinterpretq_u16_u8(c1), 4); + uint64_t nibbles1 = vget_lane_u64(vreinterpret_u64_u8(mask1), 0); + if (nibbles1 + 1) + { + va = a.val[1]; + vb = b.val[1]; + goto done; + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size & 16) // 16 <= size < 32 + { + va = MemToLower16(vld1q_u8(p1)); + vb = MemToLower16(vld1q_u8(p2)); + + uint8x16_t c = vceqq_u8(va, vb); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(c), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles + 1) + { + goto done; + } + + size -= 16; + p1 += 16; + p2 += 16; + } + + if (size) // size < 16 + { + va = MemToLower16(vld1q_u8(p1 + size - 16)); + vb = MemToLower16(vld1q_u8(p2 + size - 16)); + } + +done:; + uint64x2_t a64 = vreinterpretq_u64_u8(vrev64q_u8(va)); + uint64x2_t b64 = vreinterpretq_u64_u8(vrev64q_u8(vb)); + uint64_t a0 = vgetq_lane_u64(a64, 0); + uint64_t b0 = vgetq_lane_u64(b64, 0); + uint64_t a1 = vgetq_lane_u64(a64, 1); + uint64_t b1 = vgetq_lane_u64(b64, 1); + uint64_t a = (a0 != b0 ? a0 : a1); + uint64_t b = (a0 != b0 ? b0 : b1); + return (a > b) - (a < b); +} + +bool MemIsEqual_arm64(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + if (size == 0) + { + return true; + } + + if (size <= 16) + { + if (size < 2) // size == 1 + { + return p1[0] == p2[0]; + } + + uint64_t a0, b0, a1, b1; + if (size < 4) // 2 <= size < 4 + { + a0 = MEM_PTR16U(p1); + b0 = MEM_PTR16U(p2); + a1 = MEM_PTR16U(p1 + size - 2); + b1 = MEM_PTR16U(p2 + size - 2); + } + else if (size < 8) // 4 <= size < 8 + { + a0 = MEM_PTR32U(p1); + b0 = MEM_PTR32U(p2); + a1 = MEM_PTR32U(p1 + size - 4); + b1 = MEM_PTR32U(p2 + size - 4); + } + else // 8 <= size <= 16 + { + a0 = MEM_PTR64U(p1); + b0 = MEM_PTR64U(p2); + a1 = MEM_PTR64U(p1 + size - 8); + b1 = MEM_PTR64U(p2 + size - 8); + } + + return (a0 == b0) & (a1 == b1); + } + + while (size >= 64) + { + uint8x16x4_t a = vld1q_u8_x4(p1); + uint8x16x4_t b = vld1q_u8_x4(p2); + + uint8x16_t c0 = vceqq_u8(a.val[0], b.val[0]); + uint8x16_t c1 = vceqq_u8(a.val[1], b.val[1]); + uint8x16_t c2 = vceqq_u8(a.val[2], b.val[2]); + uint8x16_t c3 = vceqq_u8(a.val[3], b.val[3]); + uint8x16_t c = vandq_u8(vandq_u8(c0, c1), vandq_u8(c2, c3)); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(c), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles + 1) + { + return false; + } + + size -= 64; + p1 += 64; + p2 += 64; + } + + if (size & 32) // 32 <= size < 64 + { + uint8x16x2_t a = vld1q_u8_x2(p1); + uint8x16x2_t b = vld1q_u8_x2(p2); + + uint8x16_t c0 = vceqq_u8(a.val[0], b.val[0]); + uint8x16_t c1 = vceqq_u8(a.val[1], b.val[1]); + uint8x16_t c = vandq_u8(c0, c1); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(c), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles + 1) + { + return false; + } + + size -= 32; + p1 += 32; + p2 += 32; + } + + if (size & 16) // 16 <= size < 32 + { + uint8x16_t a = vld1q_u8(p1); + uint8x16_t b = vld1q_u8(p2); + uint8x16_t c = vceqq_u8(a, b); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(c), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles + 1) + { + return false; + } + + size -= 16; + p1 += 16; + p2 += 16; + } + + if (size) // size < 16 + { + uint8x16_t a = vld1q_u8(p1 + size - 16); + uint8x16_t b = vld1q_u8(p2 + size - 16); + uint8x16_t c = vceqq_u8(a, b); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(c), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles + 1) + { + return false; + } + } + + return true; +} + +size_t MemFind_arm64(const void* ptr, size_t size, uint8_t value) +{ + const uint8_t* p = (const uint8_t*)ptr; + + const uint8x16_t index4 = vreinterpretq_u8_u64(vdupq_n_u64(0x8040201008040201)); + const uint8x16_t value16 = vdupq_n_u8(value); + + if (size == 0) + { + return 0; + } + + if (size <= 16) + { + size_t address = (uint32_t)(uintptr_t)p % 16; + size_t extra = (address + size) <= 16 ? address : 0; + + uint8x16_t a = vld1q_u8(p - extra); + uint8x16_t b = vceqq_u8(a, value16); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(b), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles) + { + size_t index = MEM_CTZ64(nibbles >> (4*extra)) / 4; + return index < size ? index : size; + } + + return size; + } + + size_t offset = 0; + while (size >= 64) + { + uint8x16x4_t a = vld1q_u8_x4(p); + uint8x16_t b0 = vceqq_u8(a.val[0], value16); + uint8x16_t b1 = vceqq_u8(a.val[1], value16); + uint8x16_t b2 = vceqq_u8(a.val[2], value16); + uint8x16_t b3 = vceqq_u8(a.val[3], value16); + uint8x16_t b = vorrq_u8(vorrq_u8(b0, b1), vorrq_u8(b2, b3)); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(b), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles) + { + uint8x16_t mask0 = vandq_u8(b0, index4); + uint8x16_t mask1 = vandq_u8(b1, index4); + uint8x16_t mask2 = vandq_u8(b2, index4); + uint8x16_t mask3 = vandq_u8(b3, index4); + + uint8x16_t sum = vpaddq_u8(vpaddq_u8(mask0, mask1), vpaddq_u8(mask2, mask3)); + uint64_t sum64 = vgetq_lane_u64(vreinterpretq_u64_u8(vpaddq_u8(sum, sum)), 0); + return offset + MEM_CTZ64(sum64); + } + + offset += 64; + size -= 64; + p += 64; + } + + if (size & 32) // 32 <= size < 64 + { + uint8x16x2_t a = vld1q_u8_x2(p); + uint8x16_t b0 = vceqq_u8(a.val[0], value16); + uint8x16_t b1 = vceqq_u8(a.val[1], value16); + + uint8x16_t mask0 = vandq_u8(b0, index4); + uint8x16_t mask1 = vandq_u8(b1, index4); + + uint8x16_t sum1 = vpaddq_u8(mask0, mask1); + uint8x16_t sum2 = vpaddq_u8(sum1, sum1); + uint32_t sum32 = vgetq_lane_u32(vreinterpretq_u32_u8(vpaddq_u8(sum2, sum2)), 0); + if (sum32) + { + return offset + MEM_CTZ32(sum32); + } + + offset += 32; + size -= 32; + p += 32; + } + + if (size & 16) // 16 <= size < 32 + { + uint8x16_t a = vld1q_u8(p); + uint8x16_t b = vceqq_u8(a, value16); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(b), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles) + { + return offset + MEM_CTZ64(nibbles) / 4; + } + + offset += 16; + size -= 16; + p += 16; + } + + if (size) // size < 16 + { + uint8x16_t a = vld1q_u8(p + size - 16); + uint8x16_t b = vceqq_u8(a, value16); + + uint8x8_t mask = vshrn_n_u16(vreinterpretq_u16_u8(b), 4); + uint64_t nibbles = vget_lane_u64(vreinterpret_u64_u8(mask), 0); + if (nibbles) + { + return offset + MEM_CTZ64(nibbles) / 4 + size - 16; + } + offset += size; + } + + return offset; +} + +#endif // MEM_ARCH_ARM64 + + +#if MEM_ARCH_RVV + +int MemCompare_rvv(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + do + { + size_t vl = __riscv_vsetvl_e8m8(size); + + vuint8m8_t a = __riscv_vle8_v_u8m8(p1, vl); + vuint8m8_t b = __riscv_vle8_v_u8m8(p2, vl); + vbool1_t m = __riscv_vmsne_vv_u8m8_b1(a, b, vl); + + long index = __riscv_vfirst_m_b1(m, vl); + if (index >= 0) + { + return p1[index] - p2[index]; + } + + size -= vl; + p1 += vl; + p2 += vl; + } + while (size); + + return 0; +} + +int MemCompareI_rvv(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + do + { + size_t vl = __riscv_vsetvl_e8m8(size); + + vuint8m8_t a = __riscv_vle8_v_u8m8(p1, vl); + vuint8m8_t b = __riscv_vle8_v_u8m8(p2, vl); + + // mask = (uint8_t)(x - 'A') <= ('Z' - 'A') + vbool1_t am = __riscv_vmsleu_vx_u8m8_b1(__riscv_vsub_vx_u8m8(a, 'A', vl), 'Z' - 'A', vl); + vbool1_t bm = __riscv_vmsleu_vx_u8m8_b1(__riscv_vsub_vx_u8m8(b, 'A', vl), 'Z' - 'A', vl); + + // x = mask ? (x + 'a' - 'A') : x + a = __riscv_vadd_vx_u8m8_mu(am, a, a, 'a' - 'A', vl); + b = __riscv_vadd_vx_u8m8_mu(bm, b, b, 'a' - 'A', vl); + + vbool1_t m = __riscv_vmsne_vv_u8m8_b1(a, b, vl); + + long index = __riscv_vfirst_m_b1(m, vl); + if (index >= 0) + { + a = __riscv_vslidedown_vx_u8m8(a, index, vl); + b = __riscv_vslidedown_vx_u8m8(b, index, vl); + return __riscv_vmv_x_s_u8m8_u8(a) - __riscv_vmv_x_s_u8m8_u8(b); + } + + size -= vl; + p1 += vl; + p2 += vl; + } + while (size); + + return 0; +} + +bool MemIsEqual_rvv(const void* ptr1, const void* ptr2, size_t size) +{ + const uint8_t* p1 = (const uint8_t*)ptr1; + const uint8_t* p2 = (const uint8_t*)ptr2; + + do + { + size_t vl = __riscv_vsetvl_e8m8(size); + + vuint8m8_t a = __riscv_vle8_v_u8m8(p1, vl); + vuint8m8_t b = __riscv_vle8_v_u8m8(p2, vl); + vbool1_t m = __riscv_vmsne_vv_u8m8_b1(a, b, vl); + + if (__riscv_vcpop_m_b1(m, vl)) + { + return false; + } + + size -= vl; + p1 += vl; + p2 += vl; + } + while (size); + + return true; +} + +size_t MemFind_rvv(const void* ptr, size_t size, uint8_t value) +{ + const uint8_t* p = (const uint8_t*)ptr; + + size_t offset = 0; + do + { + size_t vl = __riscv_vsetvl_e8m8(size); + + vuint8m8_t a = __riscv_vle8_v_u8m8(p, vl); + vbool1_t m = __riscv_vmseq_vx_u8m8_b1(a, value, vl); + + long index = __riscv_vfirst_m_b1(m, vl); + if (index >= 0) + { + return offset + index; + } + + offset += vl; + size -= vl; + p += vl; + } + while (size); + + return offset; +} + +#endif // MEM_ARCH_RVV + + +#if MEM_ARCH_X64 + +#define MEM_CPUID_INIT (1 << 0) +#define MEM_CPUID_AVX2 (1 << 1) +#define MEM_CPUID_AVX512 (1 << 2) + +MEM_TARGET_XSAVE +static int MemDoCPUID(void) +{ + int info[4]; + + MEM_CPUID(1, info); + int movbe = info[2] & (1 << 22); + int xsave = info[2] & (1 << 26); + + MEM_CPUID2(7, 0, info); + int bmi1 = info[1] & (1 << 3); + int avx2 = info[1] & (1 << 5); + int bmi2 = info[1] & (1 << 8); + + int avx512f = info[1] & (1 << 16); + int avx512bw = info[1] & (1 << 30); + int avx512vbmi = info[2] & (1 << 1); + + uint64_t xcr0 = xsave ? MEM_XGETBV(0) : 0; + int ymm = (xcr0 & 0x04) == 0x04; + int zmm = (xcr0 & 0xe0) == 0xe0; + + int cpuid = 0; + cpuid |= (ymm && avx2 && bmi1 && bmi2 && movbe) ? MEM_CPUID_AVX2 : 0; + cpuid |= (zmm && avx512f && avx512bw && avx512vbmi && bmi1 && bmi2) ? MEM_CPUID_AVX512 : 0; + return cpuid; +} + +#if MEM_COMPILER_MSVC +__forceinline +#endif +static int MemCPUID(void) +{ + int result = 0; + +#if (MEM_COMPILER_CLANG || MEM_COMPILER_GCC) && defined(__AVX512F__) && defined(__AVX512BW__) && defined(__AVX512VBMI__) && defined(__BMI__) && defined(__BMI2__) + result |= MEM_CPUID_AVX512; +#endif +#if MEM_COMPILER_MSVC && defined(__AVX512F__) && defined(__AVX512BW__) + result |= MEM_CPUID_AVX512; +#endif +#if (MEM_COMPILER_CLANG || MEM_COMPILER_GCC) && defined(__AVX2__) && defined(__BMI__) && defined(__BMI2__) && defined(__MOVBE__) + result |= MEM_CPUID_AVX2; +#endif +#if MEM_COMPILER_MSVC && defined(__AVX2__) + result |= MEM_CPUID_AVX2; +#endif + + if (result == 0) + { + static int cpuid; + + result = MEM_GET32_RELAXED(&cpuid); + if (result == 0) + { + result = MEM_CPUID_INIT | MemDoCPUID(); + MEM_SET32_RELAXED(&cpuid, result); + } + } + + return result; +} + +#endif // MEM_ARCH_X64 + + +int MemCompare(const void* ptr1, const void* ptr2, size_t size) +{ +#if MEM_ARCH_X64 + int cpuid = MemCPUID(); + if (cpuid & MEM_CPUID_AVX512) + { + return MemCompare_avx512(ptr1, ptr2, size); + } + else if (cpuid & MEM_CPUID_AVX2) + { + return MemCompare_avx2(ptr1, ptr2, size); + } + return MemCompare_sse2(ptr1, ptr2, size); +#elif MEM_ARCH_ARM64 + return MemCompare_arm64(ptr1, ptr2, size); +#elif MEM_ARCH_RVV + return MemCompare_rvv(ptr1, ptr2, size); +#else +# error N/A +#endif +} + +int MemCompareI(const void* ptr1, const void* ptr2, size_t size) +{ +#if MEM_ARCH_X64 + int cpuid = MemCPUID(); + if (cpuid & MEM_CPUID_AVX512) + { + return MemCompareI_avx512(ptr1, ptr2, size); + } + else if (cpuid & MEM_CPUID_AVX2) + { + return MemCompareI_avx2(ptr1, ptr2, size); + } + return MemCompareI_sse2(ptr1, ptr2, size); +#elif MEM_ARCH_ARM64 + return MemCompareI_arm64(ptr1, ptr2, size); +#elif MEM_ARCH_RVV + return MemCompareI_rvv(ptr1, ptr2, size); +#else +# error N/A +#endif +} + +bool MemIsEqual(const void* ptr1, const void* ptr2, size_t size) +{ +#if MEM_ARCH_X64 + int cpuid = MemCPUID(); + if (cpuid & MEM_CPUID_AVX512) + { + return MemIsEqual_avx512(ptr1, ptr2, size); + } + else if (cpuid & MEM_CPUID_AVX2) + { + return MemIsEqual_avx2(ptr1, ptr2, size); + } + return MemIsEqual_sse2(ptr1, ptr2, size); +#elif MEM_ARCH_ARM64 + return MemIsEqual_arm64(ptr1, ptr2, size); +#elif MEM_ARCH_RVV + return MemIsEqual_rvv(ptr1, ptr2, size); +#else +# error N/A +#endif +} + +size_t MemFind(const void* ptr, size_t size, uint8_t value) +{ +#if MEM_ARCH_X64 + int cpuid = MemCPUID(); + if (cpuid & MEM_CPUID_AVX512) + { + return MemFind_avx512(ptr, size, value); + } + else if (cpuid & MEM_CPUID_AVX2) + { + return MemFind_avx2(ptr, size, value); + } + return MemFind_sse2(ptr, size, value); +#elif MEM_ARCH_ARM64 + return MemFind_arm64(ptr, size, value); +#elif MEM_ARCH_RVV + return MemFind_rvv(ptr, size, value); +#else +# error N/A +#endif +} + +#endif // defined(MEM_STATIC) || defined(MEM_IMPLEMENTATION) From 9616307503516df75deb68cad2ae0591bcddad1d Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 17 Jun 2026 16:55:59 -0700 Subject: [PATCH 822/850] add extra node to the symbol ref for better insertion per --- src/linker/lnk.c | 11 ++++++----- src/linker/lnk_symbol_table.c | 19 +++++++++---------- src/linker/lnk_symbol_table.h | 3 ++- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 250a33c4..e2c2c2c0 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1782,9 +1782,9 @@ lnk_link_inputs(TP_Context *tp, if (link_whole_archive) { local_persist LNK_Symbol *null_symbol = 0; if (null_symbol == 0) { - null_symbol = push_array(inputer->arena, LNK_Symbol, 1); - null_symbol->refs = push_array(inputer->arena, LNK_ObjSymbolRefNode, 1); - null_symbol->refs->v.obj = &link->objs.first->data; + null_symbol = push_array(inputer->arena, LNK_Symbol, 1); + null_symbol->first_ref = push_array(inputer->arena, LNK_ObjSymbolRefNode, 1); + null_symbol->first_ref->v.obj = &link->objs.first->data; } LNK_LibMemberRef *member_refs = push_array(scratch.arena, LNK_LibMemberRef, lib->member_count); for EachIndex(member_idx, lib->member_count) { @@ -1876,10 +1876,11 @@ lnk_link_inputs(TP_Context *tp, LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB)); // same import symbol must never be queued more than once, if it is, there is a bug in the link set logic - AssertAlways(member_ref->link_symbol->refs != import_stub->refs); + AssertAlways(member_ref->link_symbol->first_ref != import_stub->first_ref); // replace the import symbol with a stub, which is later replaced with the real import symbol once import obj is ready. - member_ref->link_symbol->refs = import_stub->refs; + member_ref->link_symbol->first_ref = import_stub->first_ref; + member_ref->link_symbol->last_ref = import_stub->last_ref; // push import member for import obj generation lnk_lib_member_ref_list_push_node(&link->imports, member_ref); diff --git a/src/linker/lnk_symbol_table.c b/src/linker/lnk_symbol_table.c index 6cd8734e..8cb6c4e5 100644 --- a/src/linker/lnk_symbol_table.c +++ b/src/linker/lnk_symbol_table.c @@ -8,9 +8,9 @@ lnk_make_symbol(Arena *arena, String8 name, LNK_Obj *obj, U32 symbol_idx) ref->v.obj = obj; ref->v.symbol_idx = symbol_idx; - LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); - symbol->name = name; - symbol->refs = ref; + LNK_Symbol *symbol = push_array(arena, LNK_Symbol, 1); + symbol->name = name; + SLLQueuePush(symbol->first_ref, symbol->last_ref, ref); return symbol; } @@ -351,9 +351,8 @@ lnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src) } // merge symbol refs - LNK_ObjSymbolRefNode *src_last_ref; - for (src_last_ref = src->refs; src_last_ref->next != 0; src_last_ref = src_last_ref->next); - src_last_ref->next = dst->refs; + src->last_ref->next = dst->first_ref; + src->last_ref = dst->last_ref; // assert leader section is live #if BUILD_DEBUG @@ -494,14 +493,14 @@ lnk_array_from_symbol_hash_trie_chunk_list(Arena *arena, LNK_SymbolHashTrieChunk internal LNK_ObjSymbolRef lnk_ref_from_symbol(LNK_Symbol *symbol) { - return symbol->refs->v; + return symbol->first_ref->v; } internal U64 lnk_ref_count_from_symbol(LNK_Symbol *symbol) { U64 count = 0; - for (LNK_ObjSymbolRefNode *node = symbol->refs; node != 0; node = node->next, count += 1); + for (LNK_ObjSymbolRefNode *node = symbol->first_ref; node != 0; node = node->next, count += 1); return count; } @@ -512,7 +511,7 @@ lnk_ref_from_symbol_many(Arena *arena, LNK_Symbol *symbol, U64 *count_out) U64 refs_count = lnk_ref_count_from_symbol(symbol); LNK_ObjSymbolRef **refs = push_array(arena, LNK_ObjSymbolRef *, refs_count); U64 i = 0; - for (LNK_ObjSymbolRefNode *node = symbol->refs; node != 0; node = node->next, i += 1) { + for (LNK_ObjSymbolRefNode *node = symbol->first_ref; node != 0; node = node->next, i += 1) { refs[i] = &node->v; } radsort(refs, refs_count, lnk_obj_symbol_ref_ptr_is_before); @@ -785,7 +784,7 @@ THREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task) symbol16->storage_class = COFF_SymStorageClass_External; } } else { - symbol->refs->v = resolve; + symbol->first_ref->v = resolve; } } } diff --git a/src/linker/lnk_symbol_table.h b/src/linker/lnk_symbol_table.h index cdf38304..da579bb1 100644 --- a/src/linker/lnk_symbol_table.h +++ b/src/linker/lnk_symbol_table.h @@ -20,7 +20,8 @@ typedef struct LNK_ObjSymbolRefNode typedef struct LNK_Symbol { String8 name; - LNK_ObjSymbolRefNode *refs; + LNK_ObjSymbolRefNode *first_ref; + LNK_ObjSymbolRefNode *last_ref; } LNK_Symbol; // --- Symbol Containers ------------------------------------------------------- From 3534100e8d59fd8f78489337e72e1b82fd928780 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 17 Jun 2026 16:56:22 -0700 Subject: [PATCH 823/850] lazy touch obj string tables --- src/linker/lnk_debug_info.c | 5 +++-- src/linker/lnk_obj.c | 42 ++++++++++++++++++++++++------------- src/linker/lnk_obj.h | 3 ++- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 83f57496..3b6eabb4 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -3074,14 +3074,15 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) PDB_DbiSectionContribNode *sc_arr = push_array_no_zero(arena, PDB_DbiSectionContribNode, obj->header.section_count_no_null); U64 sc_count = 0; - for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { + for EachIndex(sect_idx, obj->header.section_count_no_null) { LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); if (*section.flags & COFF_SectionFlag_LnkInfo) { continue; } if (*section.flags & COFF_SectionFlag_LnkRemove) { continue; } if (*section.flags & LNK_SECTION_FLAG_DEBUG) { continue; } - if (str8_match(section.name, str8_lit(".pdata"), 0)) { continue; } + String8 section_name = lnk_obj_section_name_from_sect_idx(obj, sect_idx); + if (str8_match(section_name, str8_lit(".pdata"), 0)) { continue; } U64 sect_number; String8 sect_data; diff --git a/src/linker/lnk_obj.c b/src/linker/lnk_obj.c index dabd77f8..c2f9649e 100644 --- a/src/linker/lnk_obj.c +++ b/src/linker/lnk_obj.c @@ -351,12 +351,12 @@ THREAD_POOL_TASK_FUNC(lnk_obj_find_debug_t) { LNK_Obj *obj = &((LNK_ObjNode *)raw_task)[task_id].data; for EachIndex(sect_idx, obj->header.section_count_no_null) { - LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); - if (str8_match(section.name, str8_lit(".debug$T"), 0)) { + String8 section_name = lnk_obj_section_name_from_sect_idx(obj, sect_idx); + if (str8_match(section_name, str8_lit(".debug$T"), 0)) { obj->debug_t_sect_idx = sect_idx; - } else if (str8_match(section.name, str8_lit(".debug$P"), 0)) { + } else if (str8_match(section_name, str8_lit(".debug$P"), 0)) { obj->debug_p_sect_idx = sect_idx; - } else if (str8_match(section.name, str8_lit(".debug$H"), 0)) { + } else if (str8_match(section_name, str8_lit(".debug$H"), 0)) { obj->debug_h_sect_idx = sect_idx; } } @@ -570,6 +570,20 @@ lnk_obj_section_number_from_sect_idx(LNK_Obj *obj, U64 sect_idx) return sect_idx+1; } +internal String8 +lnk_obj_section_name_from_sect_idx(LNK_Obj *obj, U64 sect_idx) +{ + COFF_SectionHeader *section_header = &lnk_coff_section_table_from_obj(obj)[sect_idx]; + return coff_name_from_section_header(lnk_coff_string_table_from_obj(obj), section_header); +} + +internal String8 +lnk_obj_section_name_from_section_number(LNK_Obj *obj, U64 section_number) +{ + Assert(section_number > 0); + return lnk_obj_section_name_from_sect_idx(obj, section_number-1); +} + internal LNK_ObjSection lnk_obj_section_from_sect_idx(LNK_Obj *obj, U64 sect_idx) { @@ -580,7 +594,6 @@ lnk_obj_section_from_sect_idx(LNK_Obj *obj, U64 sect_idx) section.section_number = sect_idx+1; section.header = &lnk_coff_section_table_from_obj(obj)[sect_idx]; section.flags = &obj->section_flags[sect_idx]; - section.name = coff_name_from_section_header(lnk_coff_string_table_from_obj(obj), section.header); section.vrange = rng_1u64(section.header->voff, section.header->voff + section.header->vsize); section.frange = rng_1u64(section.header->foff, section.header->foff + section.header->fsize); section.reloc_count = section.header->reloc_count; @@ -669,16 +682,15 @@ THREAD_POOL_TASK_FUNC(lnk_collect_obj_chunks_task) LNK_SectionCollector *task = raw_task; LNK_Obj *obj = task->objs[task_id]; - for (U32 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { + for EachIndex(sect_idx, obj->header.section_count_no_null) { LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); - if (*section.flags & COFF_SectionFlag_LnkRemove) { - if (!task->collect_discarded) { - continue; - } + if (*section.flags & COFF_SectionFlag_LnkRemove && !task->collect_discarded) { + continue; } - if (str8_match(section.name, task->name, 0)) { + String8 section_name = lnk_obj_section_name_from_sect_idx(obj, sect_idx); + if (str8_match(section_name, task->name, 0)) { String8 section_data = str8_substr(obj->data, section.frange); str8_list_push(arena, &task->out_lists[task_id], section_data); } @@ -758,7 +770,8 @@ lnk_raw_directives_from_obj(Arena *arena, LNK_Obj *obj) for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) { LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); if (*section.flags & COFF_SectionFlag_LnkInfo) { - if (str8_match(section.name, str8_lit(".drectve"), 0)) { + String8 section_name = lnk_obj_section_name_from_sect_idx(obj, sect_idx); + if (str8_match(section_name, str8_lit(".drectve"), 0)) { if (*section.flags & COFF_SectionFlag_CntUninitializedData) { lnk_error_obj(LNK_Error_IllData, obj, ".drectve section header has flag COFF_SectionFlag_CntUninitializedData"); break; @@ -796,8 +809,9 @@ lnk_debug_s_from_obj(Arena *arena, LNK_Obj *obj) String8List raw_debug_s = {0}; { for EachIndex(sect_idx, obj->header.section_count_no_null) { - LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); - if (str8_match(section.name, str8_lit(".debug$S"), 0)) { + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); + String8 section_name = lnk_obj_section_name_from_sect_idx(obj, sect_idx); + if (str8_match(section_name, str8_lit(".debug$S"), 0)) { String8 debug_s = str8_substr(obj->data, section.frange); str8_list_push(scratch.arena, &raw_debug_s, debug_s); } diff --git a/src/linker/lnk_obj.h b/src/linker/lnk_obj.h index d13a3d1e..9a21de59 100644 --- a/src/linker/lnk_obj.h +++ b/src/linker/lnk_obj.h @@ -47,7 +47,6 @@ typedef struct LNK_ObjSection U64 section_number; COFF_SectionHeader *header; COFF_SectionFlags *flags; - String8 name; Rng1U64 vrange; Rng1U64 frange; U32 reloc_count; @@ -148,6 +147,8 @@ internal COFF_SectionHeader * lnk_coff_section_header_from_section_number(LNK_Ob internal COFF_ParsedSymbol lnk_parsed_symbol_from_coff_symbol_idx(LNK_Obj *obj, U64 symbol_idx); internal U64 lnk_obj_sect_idx_from_section_number(LNK_Obj *obj, U64 section_number); internal U64 lnk_obj_section_number_from_sect_idx(LNK_Obj *obj, U64 sect_idx); +internal String8 lnk_obj_section_name_from_section_number(LNK_Obj *obj, U64 section_number); +internal String8 lnk_obj_section_name_from_sect_idx(LNK_Obj *obj, U64 sect_idx); internal LNK_ObjSection lnk_obj_section_from_sect_idx(LNK_Obj *obj, U64 sect_idx); internal LNK_ObjSection lnk_obj_section_from_section_number(LNK_Obj *obj, U64 section_number); internal COFF_RelocArray lnk_coff_relocs_from_section_header(LNK_Obj *obj, COFF_SectionHeader *section_header); From c81c072018d86a5ff3b74c9e4fcd89074ff4b1e3 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 18 Jun 2026 16:30:49 -0700 Subject: [PATCH 824/850] includes for rdi_from_codeview --- src/linker/lnk.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index e2c2c2c0..a10d291f 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -64,13 +64,17 @@ #include "thread_pool/thread_pool.h" #include "codeview_ext/codeview.h" #include "pdb_ext/msf_builder.h" -#include "pdb_ext/pdb.h" -#include "pdb_ext/pdb_helpers.h" -#include "pdb_ext/pdb_builder.h" #include "base_ext/base_inc.c" #include "thread_pool/thread_pool.c" #include "codeview_ext/codeview.c" + +// --- PDB Extensions- --------------------------------------------------------- + +#include "pdb_ext/pdb.h" +#include "pdb_ext/pdb_helpers.h" +#include "pdb_ext/pdb_builder.h" + #include "pdb_ext/msf_builder.c" #include "pdb_ext/pdb.c" #include "pdb_ext/pdb_helpers.c" @@ -82,6 +86,7 @@ #include "rdi/rdi_local.h" #include "rdi_make/rdi_make_local.h" #include "rdi_from_coff/rdi_from_coff.h" +#include "rdi_from_codeview/rdi_from_codeview.h" #include "rdi_from_pdb/rdi_from_pdb.h" #include "arch/arch_inc.h" @@ -89,6 +94,7 @@ #include "rdi/rdi_local.c" #include "rdi_make/rdi_make_local.c" #include "rdi_from_coff/rdi_from_coff.c" +#include "rdi_from_codeview/rdi_from_codeview.c" #include "rdi_from_pdb/rdi_from_pdb.c" #include "arch/arch_inc.c" @@ -5317,7 +5323,7 @@ THREAD_POOL_TASK_FUNC(lnk_p2r_worker) lane_ctx(lctx); Arena *bake_arena = arena_alloc(); - RDIM_BakeParams bake_params = p2r_convert(bake_arena, &p2r_params); + RDIM_BakeParams bake_params = p2r_convert2(bake_arena, &p2r_params); barrier_wait(tp->barrier); RDIM_BakeResults bake_results = rdim_bake(arena, &bake_params); From 6ea9bfc5a302ad974b854c45846da431d261ce25 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 18 Jun 2026 16:30:20 -0700 Subject: [PATCH 825/850] fix tail comparisons --- src/base/base_strings.c | 6 +- src/third_party/martins_memfun/memfun.h | 89 ++++++++++++++----------- 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index 54715487..c5d5a717 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -3,8 +3,9 @@ //////////////////////////////// -#if !defined(MEM_STATIC) +#ifndef MEM_STATIC # define MEM_STATIC +# define MEM_API ASAN_NO_ADDR static inline # include "third_party/martins_memfun/memfun.h" #endif @@ -281,7 +282,7 @@ str8_match(String8 a, String8 b, StringMatchFlags flags) { result = MemIsEqual(a.str, b.str, b.size); } - else if(a.size == b.size && flags == StringMatchFlag_CaseInsensitive) + else if (a.size == b.size && flags == StringMatchFlag_CaseInsensitive) { result = MemCompareI(a.str, b.str, a.size) == 0; } @@ -3087,6 +3088,7 @@ str8_compar(String8 a, String8 b, B32 ignore_case) else { cmp = MemCompare(a.str, b.str, size); + cmp = cmp > 0 ? 1 : cmp < 0 ? -1 : 0; } // shorter prefix must precede longer prefixes diff --git a/src/third_party/martins_memfun/memfun.h b/src/third_party/martins_memfun/memfun.h index 95260bb6..1aae26b4 100644 --- a/src/third_party/martins_memfun/memfun.h +++ b/src/third_party/martins_memfun/memfun.h @@ -457,33 +457,42 @@ int MemCompareI_sse2(const void* ptr1, const void* ptr2, size_t size) { return MemToLower1(p1[0]) - MemToLower1(p2[0]); } - - uint64_t a0, b0, a1, b1; - if (size < 4) // 2 <= size < 4 + else if (size < 4) // 2 <= size < 4 { - a0 = MEM_PTR16U(p1); - b0 = MEM_PTR16U(p2); - a1 = MEM_PTR16U(p1 + size - 2); - b1 = MEM_PTR16U(p2 + size - 2); + uint16_t a0 = MEM_GET16BE(p1); + uint16_t b0 = MEM_GET16BE(p2); + uint16_t a1 = MEM_GET16BE(p1 + size - 2); + uint16_t b1 = MEM_GET16BE(p2 + size - 2); + uint64_t tmp = ((uint64_t)a1 << 48) | ((uint64_t)a0 << 32) | ((uint64_t)b1 << 16) | ((uint64_t)b0); + tmp = MemToLower8(tmp); + uint32_t a = (uint32_t)(tmp >> 32); + uint32_t b = (uint32_t)(tmp >> 0); + return (a > b) - (a < b); } else if (size < 8) // 4 <= size < 8 { - a0 = MEM_PTR32U(p1); - b0 = MEM_PTR32U(p2); - a1 = MEM_PTR32U(p1 + size - 4); - b1 = MEM_PTR32U(p2 + size - 4); + uint32_t a0 = MEM_GET32BE(p1); + uint32_t b0 = MEM_GET32BE(p2); + uint32_t a1 = MEM_GET32BE(p1 + size - 4); + uint32_t b1 = MEM_GET32BE(p2 + size - 4); + uint64_t a = MemToLower8(((uint64_t)a1 << 32) | a0); + uint64_t b = MemToLower8(((uint64_t)b1 << 32) | b0); + return (a > b) - (a < b); } else // 8 <= size <= 16 { - a0 = MEM_PTR64U(p1); - b0 = MEM_PTR64U(p2); - a1 = MEM_PTR64U(p1 + size - 8); - b1 = MEM_PTR64U(p2 + size - 8); + uint64_t a0 = MEM_GET64BE(p1); + uint64_t b0 = MEM_GET64BE(p2); + uint64_t a1 = MEM_GET64BE(p1 + size - 8); + uint64_t b1 = MEM_GET64BE(p2 + size - 8); + a0 = MemToLower8(a0); + b0 = MemToLower8(b0); + a1 = MemToLower8(a1); + b1 = MemToLower8(b1); + uint64_t a = (a0 != b0 ? a0 : a1); + uint64_t b = (a0 != b0 ? b0 : b1); + return (a > b) - (a < b); } - - uint64_t a = MemToLower8(MEM_BSWAP64(a0 != b0 ? a0 : a1)); - uint64_t b = MemToLower8(MEM_BSWAP64(a0 != b0 ? b0 : b1)); - return (a > b) - (a < b); } while (size >= 64) @@ -1096,16 +1105,15 @@ int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) } else if (size < 4) // 2 <= size < 4 { - uint32_t a0 = MEM_GET16BE(p1); - uint32_t b0 = MEM_GET16BE(p2); - uint32_t a1 = MEM_GET16BE(p1 + size - 2); - uint32_t b1 = MEM_GET16BE(p2 + size - 2); - uint32_t a = (a0 != b0 ? a0 : a1); - uint32_t b = (a0 != b0 ? b0 : b1); - uint64_t tmp = MemToLower8(((uint64_t)a << 32) | b); - a = (uint32_t)(tmp >> 32); - b = (uint32_t)(tmp); - return a - b; + uint16_t a0 = MEM_GET16BE(p1); + uint16_t b0 = MEM_GET16BE(p2); + uint16_t a1 = MEM_GET16BE(p1 + size - 2); + uint16_t b1 = MEM_GET16BE(p2 + size - 2); + uint64_t tmp = ((uint64_t)a1 << 48) | ((uint64_t)a0 << 32) | ((uint64_t)b1 << 16) | ((uint64_t)b0); + tmp = MemToLower8(tmp); + uint32_t a = (uint32_t)(tmp >> 32); + uint32_t b = (uint32_t)(tmp >> 0); + return (a > b) - (a < b); } else if (size < 8) // 4 <= size < 8 { @@ -1113,11 +1121,8 @@ int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) uint32_t b0 = MEM_GET32BE(p2); uint32_t a1 = MEM_GET32BE(p1 + size - 4); uint32_t b1 = MEM_GET32BE(p2 + size - 4); - uint32_t a = (a0 != b0 ? a0 : a1); - uint32_t b = (a0 != b0 ? b0 : b1); - uint64_t tmp = MemToLower8(((uint64_t)a << 32) | b); - a = (uint32_t)(tmp >> 32); - b = (uint32_t)(tmp); + uint64_t a = MemToLower8(((uint64_t)a1 << 32) | a0); + uint64_t b = MemToLower8(((uint64_t)b1 << 32) | b0); return (a > b) - (a < b); } else if (size <= 16) // 8 <= size <= 16 @@ -1126,8 +1131,12 @@ int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) uint64_t b0 = MEM_GET64BE(p2); uint64_t a1 = MEM_GET64BE(p1 + size - 8); uint64_t b1 = MEM_GET64BE(p2 + size - 8); - uint64_t a = MemToLower8(a0 != b0 ? a0 : a1); - uint64_t b = MemToLower8(a0 != b0 ? b0 : b1); + a0 = MemToLower8(a0); + b0 = MemToLower8(b0); + a1 = MemToLower8(a1); + b1 = MemToLower8(b1); + uint64_t a = (a0 != b0 ? a0 : a1); + uint64_t b = (a0 != b0 ? b0 : b1); return (a > b) - (a < b); } else // 16 < size <= 32 @@ -2592,7 +2601,7 @@ static int MemCPUID(void) #endif // MEM_ARCH_X64 -int MemCompare(const void* ptr1, const void* ptr2, size_t size) +MEM_API int MemCompare(const void* ptr1, const void* ptr2, size_t size) { #if MEM_ARCH_X64 int cpuid = MemCPUID(); @@ -2614,7 +2623,7 @@ int MemCompare(const void* ptr1, const void* ptr2, size_t size) #endif } -int MemCompareI(const void* ptr1, const void* ptr2, size_t size) +MEM_API int MemCompareI(const void* ptr1, const void* ptr2, size_t size) { #if MEM_ARCH_X64 int cpuid = MemCPUID(); @@ -2636,7 +2645,7 @@ int MemCompareI(const void* ptr1, const void* ptr2, size_t size) #endif } -bool MemIsEqual(const void* ptr1, const void* ptr2, size_t size) +MEM_API bool MemIsEqual(const void* ptr1, const void* ptr2, size_t size) { #if MEM_ARCH_X64 int cpuid = MemCPUID(); @@ -2658,7 +2667,7 @@ bool MemIsEqual(const void* ptr1, const void* ptr2, size_t size) #endif } -size_t MemFind(const void* ptr, size_t size, uint8_t value) +MEM_API size_t MemFind(const void* ptr, size_t size, uint8_t value) { #if MEM_ARCH_X64 int cpuid = MemCPUID(); From 9b63131f37f37d6b73dc12d6b43db32f1c6281fc Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 18 Jun 2026 16:27:48 -0700 Subject: [PATCH 826/850] ditch semaphores in thread pool in favor of barriers --- src/base/base_threads.c | 10 ++++ src/base/base_threads.h | 1 + src/linker/thread_pool/thread_pool.c | 72 +++++++++------------------- src/linux/base/linux_base.c | 14 +++--- src/win32/base/win32_base.c | 5 +- 5 files changed, 44 insertions(+), 58 deletions(-) diff --git a/src/base/base_threads.c b/src/base/base_threads.c index a8c72585..2c2d1d99 100644 --- a/src/base/base_threads.c +++ b/src/base/base_threads.c @@ -192,3 +192,13 @@ slow_barrier_wait(Barrier barrier) ProfEnd(); } + +//////////////////////////////// +///~ Semaphore + +internal void +semaphore_drop(Semaphore semaphore) +{ + semaphore_drop_count(semaphore, 1); +} + diff --git a/src/base/base_threads.h b/src/base/base_threads.h index b34286cc..3aae2ea6 100644 --- a/src/base/base_threads.h +++ b/src/base/base_threads.h @@ -129,6 +129,7 @@ internal Semaphore semaphore_open(String8 name); internal void semaphore_close(Semaphore semaphore); internal B32 semaphore_take(Semaphore semaphore, U64 endt_us); internal void semaphore_drop(Semaphore semaphore); +internal void semaphore_drop_count(Semaphore semaphore, U64 drop_count); //- rjf: barriers internal Barrier barrier_alloc(U64 count); diff --git a/src/linker/thread_pool/thread_pool.c b/src/linker/thread_pool/thread_pool.c index 71003bb9..0d16213c 100644 --- a/src/linker/thread_pool/thread_pool.c +++ b/src/linker/thread_pool/thread_pool.c @@ -4,6 +4,8 @@ internal void tp_run_tasks(TP_Context *pool, TP_Worker *worker) { + barrier_wait(pool->barrier); + for (;;) { S64 task_left = ins_atomic_u64_dec_eval(&pool->task_left); @@ -20,12 +22,11 @@ tp_run_tasks(TP_Context *pool, TP_Worker *worker) // cache task count so we dont touch pool memory after atomic inc U64 task_count = pool->task_count; - // on last task ping main thread - U64 task_done = ins_atomic_u64_inc_eval(&pool->task_done); - if (task_done == task_count) { - semaphore_drop(pool->main_semaphore); - } + // update task done count + ins_atomic_u64_inc_eval(&pool->task_done); } + + barrier_wait(pool->barrier); } internal void @@ -34,9 +35,7 @@ tp_worker_main(void *raw_worker) TP_Worker *worker = raw_worker; TP_Context *pool = worker->pool; for (; pool->is_live; ) { - if (semaphore_take(pool->task_semaphore, max_U64)) { - tp_run_tasks(pool, worker); - } + tp_run_tasks(pool, worker); } } @@ -47,9 +46,7 @@ tp_worker_main_shared(void *raw_worker) TP_Context *pool = worker->pool; for (; pool->is_live; ) { if (semaphore_take(pool->exec_semaphore, max_U64)) { - if (semaphore_take(pool->task_semaphore, max_U64)) { - tp_run_tasks(pool, worker); - } + tp_run_tasks(pool, worker); } } } @@ -63,17 +60,11 @@ tp_alloc(Arena *arena, U32 worker_count, U32 max_worker_count, String8 name) B32 is_shared = (name.size > 0); // alloc semaphores - Semaphore main_semaphore = {0}; - Semaphore task_semaphore = {0}; Semaphore exec_semaphore = {0}; if (worker_count > 1) { - main_semaphore = semaphore_alloc(0, 1, str8_zero()); if (is_shared) { AssertAlways(worker_count <= max_worker_count); - task_semaphore = semaphore_alloc(0, max_worker_count, name); exec_semaphore = semaphore_alloc(0, worker_count, str8_zero()); - } else { - task_semaphore = semaphore_alloc(0, worker_count, str8_zero()); } } @@ -81,14 +72,12 @@ tp_alloc(Arena *arena, U32 worker_count, U32 max_worker_count, String8 name) void *worker_entry = is_shared ? tp_worker_main_shared : tp_worker_main; // init pool - TP_Context *pool = push_array(arena, TP_Context, 1); - pool->exec_semaphore = exec_semaphore; - pool->task_semaphore = task_semaphore; - pool->main_semaphore = main_semaphore; - pool->barrier = barrier_alloc(worker_count); - pool->is_live = 1; - pool->worker_count = worker_count; - pool->worker_arr = push_array(arena, TP_Worker, worker_count); + TP_Context *pool = push_array(arena, TP_Context, 1); + pool->exec_semaphore = exec_semaphore; + pool->barrier = barrier_alloc(worker_count); + pool->is_live = 1; + pool->worker_count = worker_count; + pool->worker_arr = push_array(arena, TP_Worker, worker_count); // init worker data for (U64 i = 0; i < worker_count; i += 1) { @@ -118,9 +107,6 @@ tp_release(TP_Context *pool) semaphore_drop(pool->exec_semaphore); } } - for EachIndex(i, pool->worker_count) { - semaphore_drop(pool->task_semaphore); - } for (U64 i = 1; i < pool->worker_count; i += 1) { thread_detach(pool->worker_arr[i].handle); } @@ -128,8 +114,6 @@ tp_release(TP_Context *pool) semaphore_release(pool->exec_semaphore); } barrier_release(pool->barrier); - semaphore_release(pool->task_semaphore); - semaphore_release(pool->main_semaphore); MemoryZeroStruct(pool); } @@ -199,34 +183,24 @@ tp_temp_end(TP_Temp temp) internal void tp_for_parallel(TP_Context *pool, TP_Arena *task_arena, U64 task_count, TP_TaskFunc *task_func, void *task_data) { - if (task_count > 0) { + if (task_count) { // init run pool->task_arena = task_arena; pool->task_func = task_func; pool->task_data = task_data; pool->task_count = task_count; pool->task_done = 0; - ins_atomic_u64_eval_assign(&pool->task_left, task_count); + pool->task_left = task_count; - U64 drop_count = Min(task_count, pool->worker_count); + // if we are in shared mode -> ping + if (*pool->exec_semaphore.u64) { + U64 drop_count64 = Min(task_count, pool->worker_count); + U32 drop_count = safe_cast_u32(drop_count64); + semaphore_drop_count(pool->exec_semaphore, drop_count); + } - // if we are in shared mode ping local semaphore - if (pool->exec_semaphore.u64[0] != 0) { - for (U64 worker_idx = 0; worker_idx < drop_count; worker_idx +=1) { - semaphore_drop(pool->exec_semaphore); - } - } - - // ping shared semaphore - for (U64 worker_idx = 0; worker_idx < drop_count; worker_idx += 1) { - semaphore_drop(pool->task_semaphore); - } - // run tasks on main worker - tp_run_tasks(pool, &pool->worker_arr[0]); - - // wait for workers to finish tasks - semaphore_take(pool->main_semaphore, max_U64); + tp_run_tasks(pool, pool->worker_arr); } } diff --git a/src/linux/base/linux_base.c b/src/linux/base/linux_base.c index 44212e92..67c26313 100644 --- a/src/linux/base/linux_base.c +++ b/src/linux/base/linux_base.c @@ -697,13 +697,15 @@ semaphore_take(Semaphore semaphore, U64 endt_us) } internal void -semaphore_drop(Semaphore semaphore) +semaphore_drop_count(Semaphore semaphore, U64 count) { - int err = -1; - if(semaphore.u64[0] != 0) - { - err = LNX_RETRY_ON_EINTR(sem_post((sem_t*)semaphore.u64[0])); - Assert(err == 0); + for EachIndex(i, count) { + int err = -1; + if(semaphore.u64[0] != 0) + { + err = LNX_RETRY_ON_EINTR(sem_post((sem_t*)*semaphore.u64)); + Assert(err == 0); + } } } diff --git a/src/win32/base/win32_base.c b/src/win32/base/win32_base.c index f77846c0..d2f9171a 100644 --- a/src/win32/base/win32_base.c +++ b/src/win32/base/win32_base.c @@ -686,10 +686,9 @@ semaphore_take(Semaphore semaphore, U64 endt_us) } internal void -semaphore_drop(Semaphore semaphore) +semaphore_drop_count(Semaphore semaphore, U64 drop_count) { - HANDLE handle = (HANDLE)semaphore.u64[0]; - ReleaseSemaphore(handle, 1, 0); + ReleaseSemaphore((HANDLE)*semaphore.u64, drop_count, 0); } //- rjf: barriers From 05a024ddb388d5a09b71a6955668b2df9ea77f45 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 19 Jun 2026 15:45:10 -0700 Subject: [PATCH 827/850] remove /RAD_ALT_PCH_DIR * Instead of matching on file path in LF_PRECOMP, loop over the objects with .debug$P and probe leaves at the index specified in LF_PRECOMP. If signatures match, use the PCH. * Demote LNK_Error_PrecompObjNotFound to a recoverable error. --- build.bat | 2 +- src/linker/lnk_config.c | 10 ------ src/linker/lnk_config.h | 2 -- src/linker/lnk_debug_info.c | 64 +++++++++++++++++-------------------- src/linker/lnk_log.h | 2 +- 5 files changed, 32 insertions(+), 48 deletions(-) diff --git a/build.bat b/build.bat index 4df25f43..8dc8dbb1 100644 --- a/build.bat +++ b/build.bat @@ -164,7 +164,7 @@ if "%didbuild%"=="" ( if "%pgo_run%"=="1" ( if "%radlink%"=="1" ( pushd local\lyra_pgo - call %~dp0build\radlink @lyra.rsp /rad_alt_pch_dir:%~dp0local\lyra_pgo || exit /b 1 + call %~dp0build\radlink @lyra.rsp || exit /b 1 popd ) goto restart diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 3d27012c..c3e17e6b 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -62,7 +62,6 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_WholeArchive, 0, "WHOLEARCHIVE", "[:LIBNAME]", "Force linker to pull in all objs from the specified lib." }, { LNK_CmdSwitch_Rad_Age, 0, "RAD_AGE", ":#", "Age embeded in EXE and PDB, used to validate incremental build. Default is 1." }, - { LNK_CmdSwitch_Rad_AltPchDir, 0, "RAD_ALT_PCH_DIR", ":PATH", "Alternative directory to search for PCH object files." }, //{ LNK_CmdSwitch_Rad_BuildExp, 0, "RAD_BUILD_EXP", "[:NO]", "Build export data." }, { LNK_CmdSwitch_Rad_BuildInfo, 0, "RAD_BUILD_INFO", "", "Print build info and exit." }, { LNK_CmdSwitch_Rad_BuildImpLib, 0, "RAD_BUILD_IMPLIB", "[:NO]", "Build import library." }, @@ -1805,15 +1804,6 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List lnk_cmd_switch_parse_u32(obj, cmd_switch, value_strings, &config->age, 0); } break; - case LNK_CmdSwitch_Rad_AltPchDir: { - if (value_strings.node_count == 0) { - lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, "missing parameters"); - break; - } - String8List dirs = str8_list_copy(config->arena, &value_strings); - str8_list_concat_in_place(&config->alt_pch_dirs, &dirs); - } break; - //case LNK_CmdSwitch_Rad_BuildExp: { // LNK_SwitchState state; // if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) { diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 0b6d7964..267124c8 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -96,7 +96,6 @@ typedef enum LNK_CmdSwitch_WholeArchive, LNK_CmdSwitch_Rad_Age, - LNK_CmdSwitch_Rad_AltPchDir, LNK_CmdSwitch_Rad_BuildExp, LNK_CmdSwitch_Rad_BuildInfo, LNK_CmdSwitch_Rad_BuildImpLib, @@ -383,7 +382,6 @@ typedef struct LNK_Config U64 unresolved_symbol_limit; U64 unresolved_symbol_ref_limit; LNK_SwitchState map_lines_for_unresolved_symbols; - String8List alt_pch_dirs; LLVM_GHashAlg type_hash_alg; String8 type_server_name; LNK_SwitchState type_server; diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index 3b6eabb4..fe125133 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -954,38 +954,29 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, ProfBegin("Set up PCH"); { - // pre-build PCH obj hash map (obj_path, obj_idx) + // register PCH file paths HashMap debug_p_hm_path = {0}; - HashMap debug_p_hm_sig = {0}; + HashMap debug_p_hm_name = {0}; // (obj name, U64List of PCH obj indices) for EachIndex(i, input.debug_p_indices.count) { U64 obj_idx = input.debug_p_indices.v[i]; LNK_Obj *obj = obj_arr[obj_idx]; - // register PCH signature - CV_DebugT debug_p = input.debug_t_arr[obj_idx]; - if (debug_p.count > 0) { - CV_Leaf lf = cv_debug_t_get_leaf(&debug_p, debug_p.count - 1); - if (lf.kind == CV_LeafKind_ENDPRECOMP && lf.data.size <= sizeof(CV_LeafEndPreComp)) { - CV_LeafEndPreComp *ender = str8_deserial_get_raw_ptr(lf.data, 0, sizeof(*ender)); - if (ender->sig) { - U64 *extant_obj_idx = hash_map_search_u64_u64(&debug_p_hm_sig, ender->sig); - if (extant_obj_idx == 0) { - hash_map_push_u64_u64(scratch.arena, &debug_p_hm_sig, ender->sig, obj_idx); - } else { - LNK_Obj *extant_obj = obj_arr[*extant_obj_idx]; - lnk_log(LNK_Log_Debug, "%S: PCH signature is already defined in %S", lnk_loc_from_obj(scratch.arena, obj), lnk_loc_from_obj(scratch.arena, extant_obj)); - } - } - } - } - - // register PCH path + // register file path -> obj idx map String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_arr[obj_idx]->path, config->work_dir); if (hash_map_search_path_u64(&debug_p_hm_path, obj_path)) { lnk_error_obj(LNK_Warning_DuplicateObjPath, obj, "duplicate obj path %S", obj_path); } else { hash_map_push_path_u64(scratch.arena, &debug_p_hm_path, obj_path, obj_idx); } + + // register file name -> obj idx map + String8 obj_name = str8_skip_last_slash(obj_path); + U64List *match_indices = hash_map_search_path_raw(&debug_p_hm_name, obj_name); + if (match_indices == 0) { + match_indices = push_array(scratch.arena, U64List, 1); + hash_map_push_path_raw(scratch.arena, &debug_p_hm_name, obj_name, match_indices); + } + u64_list_push(scratch.arena, match_indices, obj_idx); } for EachIndex(i, input.int_obj_indices.count) { @@ -995,32 +986,37 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, // skip objs that do not depend on PCH if ( ! cv_debug_t_is_pch(debug_t)) { continue; } - // find PCH obj + // find PCH obj by file path CV_PrecompInfo precomp = cv_precomp_info_from_leaf(cv_debug_t_get_leaf(debug_t, 0)); String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, config->work_dir); U64 *debug_p_obj_idx_ptr = hash_map_search_path_u64(&debug_p_hm_path, obj_path); - if (debug_p_obj_idx_ptr == 0) { - debug_p_obj_idx_ptr = hash_map_search_u64_u64(&debug_p_hm_sig, precomp.sig); - } + U64 debug_p_obj_idx = debug_p_obj_idx_ptr ? *debug_p_obj_idx_ptr : max_U64; - // try alternative directory for the PCH + // find PCH obj by signature if (debug_p_obj_idx_ptr == 0) { - String8 obj_name = str8_skip_last_slash(obj_path); - for EachNode(alt_dir_n, String8Node, config->alt_pch_dirs.first) { - String8 alt_obj_path = str8f(scratch.arena, "%S/%S", alt_dir_n->string, obj_name); - debug_p_obj_idx_ptr = hash_map_search_path_u64(&debug_p_hm_path, alt_obj_path); - if (debug_p_obj_idx_ptr) { break; } + for EachIndex(pch_i, input.debug_p_indices.count) { + U64 pch_obj_idx = input.debug_p_indices.v[pch_i]; + CV_DebugT *pch_debug_t = &input.debug_t_arr[pch_obj_idx]; + if (precomp.leaf_count >= pch_debug_t->count) { continue; } + + CV_Leaf end_leaf = cv_debug_t_get_leaf(pch_debug_t, precomp.leaf_count); + if (end_leaf.kind != CV_LeafKind_ENDPRECOMP) { continue; } + if (end_leaf.data.size < sizeof(CV_LeafEndPreComp)) { continue; } + + CV_LeafEndPreComp *end_precomp = str8_deserial_get_raw_ptr(end_leaf.data, 0, sizeof(*end_precomp)); + if (end_precomp->sig != precomp.sig) { continue; } + + debug_p_obj_idx = pch_obj_idx; + break; } } - if (debug_p_obj_idx_ptr == 0) { + if (debug_p_obj_idx > input.obj_count) { lnk_error_obj(LNK_Error_PrecompObjNotFound, obj_arr[obj_idx], "LF_PRECOMP references non-existent obj %S; discarding debug info", obj_path); lnk_discard_cv_debug_info(&input, obj_idx); continue; } - U64 debug_p_obj_idx = *debug_p_obj_idx_ptr; - // get PCH leaf data CV_DebugT *debug_p = &input.debug_t_arr[debug_p_obj_idx]; diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index 7f24bb30..8c087009 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -43,7 +43,6 @@ typedef enum LNK_Error_NoAccess, LNK_Error_NoSubsystem, LNK_Error_OutOfExportOrdinals, - LNK_Error_PrecompObjNotFound, LNK_Error_Telemetry, LNK_Error_UnsupportedMachine, LNK_Error_Mt, @@ -78,6 +77,7 @@ typedef enum LNK_Error_InvalidLib, LNK_Error_UnresolvedSymbol, LNK_Error_PrecompSigMismatch, + LNK_Error_PrecompObjNotFound, LNK_Error_ContinueLast, LNK_Warning_First, From 4f899ac67858bf86295c60312f595bd49e6acc86 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Fri, 19 Jun 2026 17:16:21 -0700 Subject: [PATCH 828/850] update memfun --- src/third_party/martins_memfun/memfun.h | 198 +++++++++++++++--------- 1 file changed, 125 insertions(+), 73 deletions(-) diff --git a/src/third_party/martins_memfun/memfun.h b/src/third_party/martins_memfun/memfun.h index 1aae26b4..7e8168cf 100644 --- a/src/third_party/martins_memfun/memfun.h +++ b/src/third_party/martins_memfun/memfun.h @@ -4,11 +4,23 @@ #include #include +#if !defined(MEM_NO_ASAN) +# if defined(__SANITIZE_ADDRESS__) +# if defined(_MSC_VER) && !defined(__clang__) +# define MEM_NO_ASAN __declspec(no_sanitize_address) +# else +# define MEM_NO_ASAN __attribute__((no_sanitize("address"))) +# endif +# else +# define MEM_NO_ASAN +# endif +#endif + #if !defined(MEM_API) # if defined(MEM_STATIC) -# define MEM_API static inline +# define MEM_API static inline MEM_NO_ASAN # else -# define MEM_API extern +# define MEM_API extern MEM_NO_ASAN # endif #endif @@ -245,6 +257,7 @@ static inline __m512i MemToLower64(__m512i x) #endif } +MEM_NO_ASAN int MemCompare_sse2(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -422,6 +435,7 @@ int MemCompare_sse2(const void* ptr1, const void* ptr2, size_t size) return 0; } +MEM_NO_ASAN int MemCompareI_sse2(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -457,41 +471,51 @@ int MemCompareI_sse2(const void* ptr1, const void* ptr2, size_t size) { return MemToLower1(p1[0]) - MemToLower1(p2[0]); } - else if (size < 4) // 2 <= size < 4 + + if (size < 4) // 2 <= size < 4 { - uint16_t a0 = MEM_GET16BE(p1); - uint16_t b0 = MEM_GET16BE(p2); - uint16_t a1 = MEM_GET16BE(p1 + size - 2); - uint16_t b1 = MEM_GET16BE(p2 + size - 2); - uint64_t tmp = ((uint64_t)a1 << 48) | ((uint64_t)a0 << 32) | ((uint64_t)b1 << 16) | ((uint64_t)b0); - tmp = MemToLower8(tmp); + uint64_t a0 = MEM_PTR16U(p1); + uint64_t b0 = MEM_PTR16U(p2); + uint64_t a1 = MEM_PTR16U(p1 + size - 2); + uint64_t b1 = MEM_PTR16U(p2 + size - 2); + uint64_t tmp = MEM_BSWAP64(MemToLower8(a0 | (a1 << 16) | (b0 << 32) | (b1 << 48))); uint32_t a = (uint32_t)(tmp >> 32); - uint32_t b = (uint32_t)(tmp >> 0); + uint32_t b = (uint32_t)tmp; return (a > b) - (a < b); } else if (size < 8) // 4 <= size < 8 { - uint32_t a0 = MEM_GET32BE(p1); - uint32_t b0 = MEM_GET32BE(p2); - uint32_t a1 = MEM_GET32BE(p1 + size - 4); - uint32_t b1 = MEM_GET32BE(p2 + size - 4); - uint64_t a = MemToLower8(((uint64_t)a1 << 32) | a0); - uint64_t b = MemToLower8(((uint64_t)b1 << 32) | b0); + uint64_t a0 = MEM_PTR32U(p1); + uint64_t b0 = MEM_PTR32U(p2); + uint64_t a1 = MEM_PTR32U(p1 + size - 4); + uint64_t b1 = MEM_PTR32U(p2 + size - 4); + uint64_t a = MEM_BSWAP64(MemToLower8(a0 | (a1 << 32))); + uint64_t b = MEM_BSWAP64(MemToLower8(b0 | (b1 << 32))); return (a > b) - (a < b); } else // 8 <= size <= 16 { - uint64_t a0 = MEM_GET64BE(p1); - uint64_t b0 = MEM_GET64BE(p2); - uint64_t a1 = MEM_GET64BE(p1 + size - 8); - uint64_t b1 = MEM_GET64BE(p2 + size - 8); - a0 = MemToLower8(a0); - b0 = MemToLower8(b0); - a1 = MemToLower8(a1); - b1 = MemToLower8(b1); - uint64_t a = (a0 != b0 ? a0 : a1); - uint64_t b = (a0 != b0 ? b0 : b1); - return (a > b) - (a < b); + __m128i a0 = _mm_loadl_epi64((const __m128i*)p1); + __m128i b0 = _mm_loadl_epi64((const __m128i*)p2); + __m128i a1 = _mm_loadl_epi64((const __m128i*)(p1 + size - 8)); + __m128i b1 = _mm_loadl_epi64((const __m128i*)(p2 + size - 8)); + __m128i a = MemToLower16(_mm_unpacklo_epi64(a0, a1)); + __m128i b = MemToLower16(_mm_unpacklo_epi64(b0, b1)); + __m128i r = _mm_cmpeq_epi8(a, b); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r); + if (mask) + { + size_t index = MEM_CTZ32(mask); + + // index = (index < 8) ? index : (index - 8) + (size - 8); + size -= 16; + index += index < 8 ? 0 : size; + + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + return 0; } } @@ -609,6 +633,7 @@ int MemCompareI_sse2(const void* ptr1, const void* ptr2, size_t size) return 0; } +MEM_NO_ASAN bool MemIsEqual_sse2(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -746,6 +771,7 @@ bool MemIsEqual_sse2(const void* ptr1, const void* ptr2, size_t size) return true; } +MEM_NO_ASAN size_t MemFind_sse2(const void* ptr, size_t size, uint8_t value) { const uint8_t* p = (const uint8_t*)ptr; @@ -861,6 +887,7 @@ size_t MemFind_sse2(const void* ptr, size_t size, uint8_t value) return offset; } +MEM_NO_ASAN MEM_TARGET_AVX2 int MemCompare_avx2(const void* ptr1, const void* ptr2, size_t size) { @@ -1067,6 +1094,7 @@ int MemCompare_avx2(const void* ptr1, const void* ptr2, size_t size) return 0; } +MEM_NO_ASAN MEM_TARGET_AVX2 int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) { @@ -1105,39 +1133,48 @@ int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) } else if (size < 4) // 2 <= size < 4 { - uint16_t a0 = MEM_GET16BE(p1); - uint16_t b0 = MEM_GET16BE(p2); - uint16_t a1 = MEM_GET16BE(p1 + size - 2); - uint16_t b1 = MEM_GET16BE(p2 + size - 2); - uint64_t tmp = ((uint64_t)a1 << 48) | ((uint64_t)a0 << 32) | ((uint64_t)b1 << 16) | ((uint64_t)b0); - tmp = MemToLower8(tmp); - uint32_t a = (uint32_t)(tmp >> 32); - uint32_t b = (uint32_t)(tmp >> 0); + uint64_t a0 = MEM_GET16BE(p1); + uint64_t b0 = MEM_GET16BE(p2); + uint64_t a1 = MEM_GET16BE(p1 + size - 2); + uint64_t b1 = MEM_GET16BE(p2 + size - 2); + uint64_t tmp = MemToLower8(a0 | (a1 << 16) | (b0 << 32) | (b1 << 48)); + uint64_t a = (uint32_t)tmp; + uint64_t b = (uint32_t)(tmp >> 32); return (a > b) - (a < b); } else if (size < 8) // 4 <= size < 8 { - uint32_t a0 = MEM_GET32BE(p1); - uint32_t b0 = MEM_GET32BE(p2); - uint32_t a1 = MEM_GET32BE(p1 + size - 4); - uint32_t b1 = MEM_GET32BE(p2 + size - 4); - uint64_t a = MemToLower8(((uint64_t)a1 << 32) | a0); - uint64_t b = MemToLower8(((uint64_t)b1 << 32) | b0); + uint64_t a0 = MEM_GET32BE(p1); + uint64_t b0 = MEM_GET32BE(p2); + uint64_t a1 = MEM_GET32BE(p1 + size - 4); + uint64_t b1 = MEM_GET32BE(p2 + size - 4); + uint64_t a = MemToLower8(a0 | (a1 << 32)); + uint64_t b = MemToLower8(b0 | (b1 << 32)); return (a > b) - (a < b); } else if (size <= 16) // 8 <= size <= 16 { - uint64_t a0 = MEM_GET64BE(p1); - uint64_t b0 = MEM_GET64BE(p2); - uint64_t a1 = MEM_GET64BE(p1 + size - 8); - uint64_t b1 = MEM_GET64BE(p2 + size - 8); - a0 = MemToLower8(a0); - b0 = MemToLower8(b0); - a1 = MemToLower8(a1); - b1 = MemToLower8(b1); - uint64_t a = (a0 != b0 ? a0 : a1); - uint64_t b = (a0 != b0 ? b0 : b1); - return (a > b) - (a < b); + __m128i a0 = _mm_loadl_epi64((const __m128i*)p1); + __m128i b0 = _mm_loadl_epi64((const __m128i*)p2); + __m128i a1 = _mm_loadl_epi64((const __m128i*)(p1 + size - 8)); + __m128i b1 = _mm_loadl_epi64((const __m128i*)(p2 + size - 8)); + __m128i a = MemToLower16(_mm_unpacklo_epi64(a0, a1)); + __m128i b = MemToLower16(_mm_unpacklo_epi64(b0, b1)); + __m128i r = _mm_cmpeq_epi8(a, b); + + uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r); + if (mask) + { + size_t index = MEM_CTZ32(mask); + + // index = (index < 8) ? index : (index - 8) + (size - 8); + size -= 16; + index += index < 8 ? 0 : size; + + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + return 0; } else // 16 < size <= 32 { @@ -1278,6 +1315,7 @@ int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) return 0; } +MEM_NO_ASAN MEM_TARGET_AVX2 bool MemIsEqual_avx2(const void* ptr1, const void* ptr2, size_t size) { @@ -1422,6 +1460,7 @@ bool MemIsEqual_avx2(const void* ptr1, const void* ptr2, size_t size) return true; } +MEM_NO_ASAN MEM_TARGET_AVX2 size_t MemFind_avx2(const void* ptr, size_t size, uint8_t value) { @@ -1838,6 +1877,7 @@ static inline uint8x16_t MemToLower16(uint8x16_t x) return vaddq_u8(x, tmp); } +MEM_NO_ASAN int MemCompare_arm64(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -1993,6 +2033,7 @@ done:; return (a > b) - (a < b); } +MEM_NO_ASAN int MemCompareI_arm64(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -2010,32 +2051,41 @@ int MemCompareI_arm64(const void* ptr1, const void* ptr2, size_t size) return MemToLower1(p1[0]) - MemToLower1(p2[0]); } - uint64_t a0, b0, a1, b1; if (size < 4) // 2 <= size < 4 { - a0 = MEM_PTR16U(p1); - b0 = MEM_PTR16U(p2); - a1 = MEM_PTR16U(p1 + size - 2); - b1 = MEM_PTR16U(p2 + size - 2); + uint64_t a0 = MEM_PTR16U(p1); + uint64_t b0 = MEM_PTR16U(p2); + uint64_t a1 = MEM_PTR16U(p1 + size - 2); + uint64_t b1 = MEM_PTR16U(p2 + size - 2); + uint64_t tmp = MEM_BSWAP64(MemToLower8(a0 | (a1 << 16) | (b0 << 32) | (b1 << 48))); + uint32_t a = (uint32_t)(tmp >> 32); + uint32_t b = (uint32_t)tmp; + return (a > b) - (a < b); } else if (size < 8) // 4 <= size < 8 { - a0 = MEM_PTR32U(p1); - b0 = MEM_PTR32U(p2); - a1 = MEM_PTR32U(p1 + size - 4); - b1 = MEM_PTR32U(p2 + size - 4); + uint64_t a0 = MEM_PTR32U(p1); + uint64_t b0 = MEM_PTR32U(p2); + uint64_t a1 = MEM_PTR32U(p1 + size - 4); + uint64_t b1 = MEM_PTR32U(p2 + size - 4); + uint64_t a = MEM_BSWAP64(MemToLower8(a0 | (a1 << 32))); + uint64_t b = MEM_BSWAP64(MemToLower8(b0 | (b1 << 32))); + return (a > b) - (a < b); } else // 8 <= size <= 16 { - a0 = MEM_PTR64U(p1); - b0 = MEM_PTR64U(p2); - a1 = MEM_PTR64U(p1 + size - 8); - b1 = MEM_PTR64U(p2 + size - 8); + uint8x16_t va = vcombine_u8(vld1_u8(p1), vld1_u8(p1 + size - 8)); + uint8x16_t vb = vcombine_u8(vld1_u8(p2), vld1_u8(p2 + size - 8)); + uint64x2_t a64 = vreinterpretq_u64_u8(vrev64q_u8(MemToLower16(va))); + uint64x2_t b64 = vreinterpretq_u64_u8(vrev64q_u8(MemToLower16(vb))); + uint64_t a0 = vgetq_lane_u64(a64, 0); + uint64_t b0 = vgetq_lane_u64(b64, 0); + uint64_t a1 = vgetq_lane_u64(a64, 1); + uint64_t b1 = vgetq_lane_u64(b64, 1); + uint64_t a = (a0 != b0 ? a0 : a1); + uint64_t b = (a0 != b0 ? b0 : b1); + return (a > b) - (a < b); } - - uint64_t a = MemToLower8(MEM_BSWAP64(a0 != b0 ? a0 : a1)); - uint64_t b = MemToLower8(MEM_BSWAP64(a0 != b0 ? b0 : b1)); - return (a > b) - (a < b); } uint8x16_t va = vdupq_n_u8(0); @@ -2162,6 +2212,7 @@ done:; return (a > b) - (a < b); } +MEM_NO_ASAN bool MemIsEqual_arm64(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -2284,6 +2335,7 @@ bool MemIsEqual_arm64(const void* ptr1, const void* ptr2, size_t size) return true; } +MEM_NO_ASAN size_t MemFind_arm64(const void* ptr, size_t size, uint8_t value) { const uint8_t* p = (const uint8_t*)ptr; @@ -2601,7 +2653,7 @@ static int MemCPUID(void) #endif // MEM_ARCH_X64 -MEM_API int MemCompare(const void* ptr1, const void* ptr2, size_t size) +int MemCompare(const void* ptr1, const void* ptr2, size_t size) { #if MEM_ARCH_X64 int cpuid = MemCPUID(); @@ -2623,7 +2675,7 @@ MEM_API int MemCompare(const void* ptr1, const void* ptr2, size_t size) #endif } -MEM_API int MemCompareI(const void* ptr1, const void* ptr2, size_t size) +int MemCompareI(const void* ptr1, const void* ptr2, size_t size) { #if MEM_ARCH_X64 int cpuid = MemCPUID(); @@ -2645,7 +2697,7 @@ MEM_API int MemCompareI(const void* ptr1, const void* ptr2, size_t size) #endif } -MEM_API bool MemIsEqual(const void* ptr1, const void* ptr2, size_t size) +bool MemIsEqual(const void* ptr1, const void* ptr2, size_t size) { #if MEM_ARCH_X64 int cpuid = MemCPUID(); @@ -2667,7 +2719,7 @@ MEM_API bool MemIsEqual(const void* ptr1, const void* ptr2, size_t size) #endif } -MEM_API size_t MemFind(const void* ptr, size_t size, uint8_t value) +size_t MemFind(const void* ptr, size_t size, uint8_t value) { #if MEM_ARCH_X64 int cpuid = MemCPUID(); From d3d35e40d74dc2298efca01733e67cb7373ae073 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 19 Jun 2026 20:53:01 -0700 Subject: [PATCH 829/850] rdi_from_dwarf: use sibling tags to advance in hash path too - set up for deduplicating hash work --- project.4coder | 2 +- project.raddbg | 17 ++- src/rdi_from_dwarf/rdi_from_dwarf.c | 184 +++++++++++++++++----------- 3 files changed, 128 insertions(+), 75 deletions(-) diff --git a/project.4coder b/project.4coder index 49daa1cc..de54dc3c 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build ryan_scratch && pushd build && ryan_scratch.exe", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin no_meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 1bdae732..b43ee327 100644 --- a/project.raddbg +++ b/project.raddbg @@ -9,6 +9,13 @@ target: debug_subprocesses: 0 } target: +{ + executable: "build/raddbg.exe" + working_directory: "../raddebugger" + arguments: "--user:test123" + debug_subprocesses: 0 +} +target: { executable: "build/mule_main.exe" working_directory: build @@ -32,7 +39,13 @@ target: } target: { - executable: "build/ryan_scratch.exe" - working_directory: build + executable: "build/release_version/raddbg.exe" + working_directory: "build/release_version" +} +target: +{ + executable: "build/radbin.exe" + working_directory: "build/" + arguments: "--breakpad fat.so --capture" enabled: 1 } diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 5520f3b7..fe5cb060 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1003,17 +1003,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); //- rjf: look for sibling attribute fast path - B32 sibling_encoded = 0; - U64 sibling_off = 0; - for EachNode(n, DW2_AttribNode, tag.attribs.first) - { - if(n->v.attrib_kind == DW_AttribKind_Sibling) - { - sibling_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); - sibling_encoded = 1; - break; - } - } + DW2_Attrib *sibling_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Sibling); + B32 sibling_encoded = (sibling_attrib != &dw2_attrib_nil); + U64 sibling_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &sibling_attrib->val); //- rjf: if we have a sibling link, follow it -> depth stays the same if(sibling_encoded && sibling_off >= off) @@ -1226,6 +1218,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW_TagKind tag_kind; U64 info_off; U64 hash_seed; + B32 disable_dedup; }; D2R_ParentTagNode *top_parent = 0; D2R_ParentTagNode *free_parent = 0; @@ -1239,35 +1232,67 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW2_Tag tag = {0}; off += dw2_read_tag(tag_scratch.arena, raw, origin_unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + // rjf: look for sibling attribute fast path + DW2_Attrib *sibling_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Sibling); + B32 sibling_encoded = (sibling_attrib != &dw2_attrib_nil); + U64 sibling_off = dw2_reference_info_off_from_form_val(origin_unit_parse_ctx, &sibling_attrib->val); + + // rjf: determine if we'll deduplicate children of this tag + // + // three possible cases: + // + // (1) namespaced by a function - we do *not* want to deduplicate. + // functions are not deduplicated, and even if types defined + // within many functions match structurally, we consider them + // unique, given that they have different definition sites & + // names (fully qualified) still. + // + // (2) namespaced by a type - we do *not* want to deduplicate. the + // root-level type will already be deduplicated, so we'll only + // produce it once, and that'll catch all sub-types etc. + // + // (3) namespaced by a namespace - we *do* want to deduplicate. the + // children of a namespace are functionally top-level, and even + // if the same namespace definition is used across units, the + // debug info for each unit will contain fragmentary parts of it, + // since presumably unused pieces of the namespace will be stripped. + // thus, we need to visit namespace children as if they're top-level. + B32 children_should_be_deduped = 0; + if(tag.kind == DW_TagKind_Namespace) + { + children_should_be_deduped = 1; + } + // rjf: is this one of the tags we'd like to dedup? -> gather - if(tag.kind == DW_TagKind_ArrayType || - tag.kind == DW_TagKind_ClassType || - tag.kind == DW_TagKind_EnumerationType || - tag.kind == DW_TagKind_PointerType || - tag.kind == DW_TagKind_ReferenceType || - tag.kind == DW_TagKind_StringType || - tag.kind == DW_TagKind_StructureType || - tag.kind == DW_TagKind_SubroutineType || - tag.kind == DW_TagKind_SubProgram || - tag.kind == DW_TagKind_Typedef || - tag.kind == DW_TagKind_UnionType || - tag.kind == DW_TagKind_PtrToMemberType || - tag.kind == DW_TagKind_SetType || - tag.kind == DW_TagKind_BaseType || - tag.kind == DW_TagKind_ConstType || - tag.kind == DW_TagKind_FileType || - tag.kind == DW_TagKind_PackedType || - tag.kind == DW_TagKind_VolatileType || - tag.kind == DW_TagKind_RestrictType || - tag.kind == DW_TagKind_InterfaceType || - tag.kind == DW_TagKind_UnspecifiedType || - tag.kind == DW_TagKind_SharedType || - tag.kind == DW_TagKind_RValueReferenceType || - tag.kind == DW_TagKind_CoarrayType || - tag.kind == DW_TagKind_DynamicType || - tag.kind == DW_TagKind_AtomicType || - tag.kind == DW_TagKind_ImmutableType || - tag.kind == DW_TagKind_Namespace) + if((top_parent == 0 || !top_parent->disable_dedup) && + (tag.kind == DW_TagKind_ArrayType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_EnumerationType || + tag.kind == DW_TagKind_PointerType || + tag.kind == DW_TagKind_ReferenceType || + tag.kind == DW_TagKind_StringType || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_Typedef || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_PtrToMemberType || + tag.kind == DW_TagKind_SetType || + tag.kind == DW_TagKind_BaseType || + tag.kind == DW_TagKind_ConstType || + tag.kind == DW_TagKind_FileType || + tag.kind == DW_TagKind_PackedType || + tag.kind == DW_TagKind_VolatileType || + tag.kind == DW_TagKind_RestrictType || + tag.kind == DW_TagKind_InterfaceType || + tag.kind == DW_TagKind_UnspecifiedType || + tag.kind == DW_TagKind_SharedType || + tag.kind == DW_TagKind_RValueReferenceType || + tag.kind == DW_TagKind_CoarrayType || + tag.kind == DW_TagKind_DynamicType || + tag.kind == DW_TagKind_AtomicType || + tag.kind == DW_TagKind_ImmutableType || + tag.kind == DW_TagKind_Namespace)) { U64 container_ancestor_info_off = 0; for EachNode(n, D2R_ParentTagNode, top_parent) @@ -1307,33 +1332,44 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } - // rjf: update depth / parent stack - if(tag.has_children) + // rjf: if we have a sibling offset encoded, and if we do not need to dedup children, + // then skip + if(!children_should_be_deduped && sibling_encoded && sibling_off >= off) { - depth += 1; - D2R_ParentTagNode *n = free_parent; - if(n != 0) - { - SLLStackPop(free_parent); - } - else - { - n = push_array(work_scratch.arena, D2R_ParentTagNode, 1); - } - SLLStackPush(top_parent, n); - n->tag_kind = tag.kind; - n->info_off = start_off; - n->hash_seed = hash_seed; + off = sibling_off; } - if(tag.kind == DW_TagKind_Null) + + // rjf: otherwise, update depth / parent stack + else { - depth -= 1; - depth = Max(0, depth); - if(top_parent != 0) + if(tag.has_children) { - D2R_ParentTagNode *popped = top_parent; - SLLStackPop(top_parent); - SLLStackPush(free_parent, popped); + depth += 1; + D2R_ParentTagNode *n = free_parent; + if(n != 0) + { + SLLStackPop(free_parent); + } + else + { + n = push_array(work_scratch.arena, D2R_ParentTagNode, 1); + } + SLLStackPush(top_parent, n); + n->tag_kind = tag.kind; + n->info_off = start_off; + n->hash_seed = hash_seed; + n->disable_dedup = !children_should_be_deduped; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + depth = Max(0, depth); + if(top_parent != 0) + { + D2R_ParentTagNode *popped = top_parent; + SLLStackPop(top_parent); + SLLStackPush(free_parent, popped); + } } } @@ -1379,8 +1415,8 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // rjf: record this task in our seen task table { - U64 hash = u64_hash_from_str8(str8_struct(&t->off)); - U64 slot_idx = hash%seen_task_slots_count; + U64 off_hash = u64_hash_from_str8(str8_struct(&t->off)); + U64 slot_idx = off_hash%seen_task_slots_count; SLLStackPush(seen_task_slots[slot_idx], t); } @@ -1388,8 +1424,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; - // rjf: read/hash the full tag tree at `t_off`; kick off additional - // tasks for referenced dependency types + // rjf: read/hash the full tag tree at `t_off`; kick + // off additional tasks for referenced dependency types + U64 t_hash = 0; S64 depth = 0; B32 hash_should_include_children = 1; for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max && (depth > 0 || t_off == t->off);) @@ -1416,7 +1453,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) if(!should_skip_tag) { // rjf: combine tag's kind - hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); + t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&tag.kind)); // rjf: combine non-reference attributes (references could be different, // because of deduping, but they could match ultimately). for any @@ -1444,18 +1481,18 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) n->v.attrib_kind != DW_AttribKind_LowPc && n->v.attrib_kind != DW_AttribKind_HighPc))) { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); + t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&n->v.val.kind)); if(n->v.val.string.size != 0) { - hash = u64_hash_from_seed_str8(hash, n->v.val.string); + t_hash = u64_hash_from_seed_str8(t_hash, n->v.val.string); } else if(n->v.val.addr != 0) { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.addr)); + t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&n->v.val.addr)); } else { - hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); + t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&n->v.val.u128)); } } @@ -1485,7 +1522,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // rjf: if we've seen -> hash the order if(already_seen) { - hash = u64_hash_from_seed_str8(hash, str8_struct(&already_seen_order_idx)); + t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&already_seen_order_idx)); } // rjf: if we've not seen -> descend @@ -1533,6 +1570,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } scratch_end(tag_scratch); } + + // rjf: combine t_hash -> main hash + hash = u64_hash_from_seed_str8(hash, str8_struct(&t_hash)); } } From ed6afcb1809355782bd520f00e23c56af19aa98a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 21 Jun 2026 15:53:38 -0700 Subject: [PATCH 830/850] checkpoint on rdi_from_dwarf pass, start addressing O(N lg N) hashing problem for type content, use sibling tags, etc.; remove test inputs from data/, just rely on local folder (filled via data server) --- .../mule_main_9ff1e58f/inline_body.cpp | 8 - data/test_inputs/mule_main_9ff1e58f/mule_c.c | 126 - data/test_inputs/mule_main_9ff1e58f/mule_c.h | 10 - .../mule_main_9ff1e58f/mule_inline.cpp | 64 - .../mule_main_9ff1e58f/mule_main.cpp | 3270 ----------------- .../mule_main_9ff1e58f/mule_main.pdb | 3 - .../mule_main_9ff1e58f/mule_main.rdi | 3 - .../mule_main_9ff1e58f/mule_main_9ff1e58f.exe | 3 - .../mule_main_9ff1e58f/mule_module.cpp | 60 - .../mule_main_9ff1e58f/mule_module.dll | Bin 667648 -> 0 bytes .../mule_main_9ff1e58f/mule_module.pdb | 3 - .../mule_main_9ff1e58f/mule_module.rdi | 3 - .../mule_main_9ff1e58f/mule_o2.cpp | 119 - src/rdi_from_dwarf/rdi_from_dwarf.c | 241 +- src/rdi_from_dwarf/rdi_from_dwarf.h | 11 + src/torture/torture.c | 10 +- 16 files changed, 238 insertions(+), 3696 deletions(-) delete mode 100644 data/test_inputs/mule_main_9ff1e58f/inline_body.cpp delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_c.c delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_c.h delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_inline.cpp delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_main.cpp delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_main.pdb delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_main.rdi delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_main_9ff1e58f.exe delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_module.cpp delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_module.dll delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_module.pdb delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_module.rdi delete mode 100644 data/test_inputs/mule_main_9ff1e58f/mule_o2.cpp diff --git a/data/test_inputs/mule_main_9ff1e58f/inline_body.cpp b/data/test_inputs/mule_main_9ff1e58f/inline_body.cpp deleted file mode 100644 index 12514c38..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/inline_body.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -bias = (bias^x)&7; -x -= bias; -x *= 2; -x *= x; -x += bias; \ No newline at end of file diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_c.c b/data/test_inputs/mule_main_9ff1e58f/mule_c.c deleted file mode 100644 index 286ad44d..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/mule_c.c +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -/* -* Program to run in debugger organized to provide tests for -* single threaded stepping, breakpoints, evaluation. -*/ - -//////////////////////////////// -// NOTE(allen): Complex Types - -#include - -void -c_type_coverage_eval_tests(void){ -#if _WIN32 - _Fcomplex x = _FCbuild(0.f, 1.f); - _Dcomplex y = _Cbuild(0.f, -1.f); - -#else - float complex x = 0.f + 1.f*I; - double complex y = 0.0 - 1.0*I; - -#endif -} - -//////////////////////////////// -// NOTE(allen): Reuse Type Names From Another Module - -#include - -typedef struct Basics{ - double a; - float b; - unsigned long long c; - long long d; - unsigned int e; - int f; - unsigned short g; - short h; - unsigned char i; - char j; - - int z; -} Basics; - -typedef struct Basics_Stdint{ - double x1; - float x2; - uint64_t x3; - int64_t x4; - uint32_t x5; - int32_t x6; - uint16_t x7; - int16_t x8; - uint8_t x9; - int8_t x0; -} Basics_Stdint; - -typedef struct Pair{ - int i; - float f; -} Pair; - -void -c_versions_of_same_types(void){ - Basics basics = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; - Basics_Stdint basics_stdint = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, }; - Pair memory_[] = { - {100, 1.f}, - {101, 2.f}, - {102, 4.f}, - {103, 8.f}, - {104, 16.f}, - {105, 32.f}, - }; - - int x = memory_[3].i + basics.f; -} - -//////////////////////////////// -//~ NOTE(rjf): Bitfields - -typedef struct TypeWithBitfield TypeWithBitfield; -struct TypeWithBitfield -{ - int v : 14; - int w : 4; - int x : 32; - int y : 4; - int z : 10; -}; - -typedef struct BitfieldType64 BitfieldType64; -struct BitfieldType64 -{ - uint64_t size : 63; - uint64_t is_free : 1; -}; - -static int mut_xarray[4] = {100, 101, 102, 103}; -static float mut_farray[4] = {100.5f, 101.5f, 102.5f, 103.5f}; - -void -c_type_with_bitfield_usage(void) -{ - TypeWithBitfield b = {0}; - b.v = 100; - b.w = 6; - b.x = 434512; - b.y = 7; - b.z = 12; - int x = (b.v + b.x); - int y = (b.y - b.z); - int z = (b.w) + 5; - BitfieldType64 b64 = {0}; - b64.size = 524288; - b64.is_free = 1; - int abc = mut_xarray[0]; - mut_xarray[0] += 1; - abc += mut_xarray[0]; - abc += mut_xarray[1]; - abc += mut_xarray[2]; - float f = mut_farray[0] + mut_farray[1] + mut_farray[2] + mut_farray[3]; - int w = 0; -} diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_c.h b/data/test_inputs/mule_main_9ff1e58f/mule_c.h deleted file mode 100644 index 2a9c8bb8..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/mule_c.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -/* -* Program to run in debugger organized to provide tests for -* single threaded stepping, breakpoints, evaluation. -*/ - -void c_type_coverage_eval_tests(void); -void c_type_with_bitfield_usage(void); \ No newline at end of file diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_inline.cpp b/data/test_inputs/mule_main_9ff1e58f/mule_inline.cpp deleted file mode 100644 index d9a0ad11..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/mule_inline.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -/* -** Make sure we have an inlined function -*/ - -#if defined(_MSC_VER) -# define FORCE_INLINE __forceinline -#elif defined(__clang__) || defined(__GNUC__) -# define FORCE_INLINE __attribute__((always_inline)) -#else -# error need force inline for this compiler -#endif - -//////////////////////////////// -// NOTE(allen): Inline Stepping - -unsigned int fixed_frac_bits = 5; -static unsigned int bias = 7; - -static FORCE_INLINE unsigned int -fixed_mul(unsigned int a, unsigned int b){ - unsigned int c = (((a - bias)*(b - bias)) >> fixed_frac_bits) + bias; - return(c); -} - -static FORCE_INLINE unsigned int -multi_file_inlinesite(unsigned int x){ - // force compiler to generate annotations for code that's inside another file -#include "inline_body.cpp" - return x >> fixed_frac_bits; -} - -static unsigned int test_value = 0; - -unsigned int -inline_stepping_tests(void){ - bias = 15; - - // NOTE(nick): Interesting that CL does not generate inline site symbols in order of apperance here unlike clang. - - // CL: - // BinaryAnnotations: CodeLengthAndCodeOffset d 0 - // BinaryAnnotation Length: 4 bytes (1 bytes padding) - // - // Clang: - // BinaryAnnotations: LineOffset 1 CodeLength d - // BinaryAnnotation Length: 4 bytes (0 bytes padding) - unsigned int x = fixed_mul(5001, 7121); - - // CL: - // BinaryAnnotations: CodeOffsetAndLineOffset d File 0 CodeOffsetAndLineOffset 22 LineOffset 1e - // CodeLengthAndCodeOffset 2 3 - // BinaryAnnotation Length: 12 bytes (1 bytes padding) - // - // Clang: - // BinaryAnnotations: File 18 LineOffset ffffffe6 CodeOffset d CodeOffsetAndLineOffset 22 - // File 0 LineOffset 1e CodeOffset 3 CodeLength 2 - // BinaryAnnotation Length: 16 bytes (0 bytes padding) - unsigned int z = multi_file_inlinesite(x); - return(z); -} - diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main.cpp b/data/test_inputs/mule_main_9ff1e58f/mule_main.cpp deleted file mode 100644 index 69c9ba19..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/mule_main.cpp +++ /dev/null @@ -1,3270 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -/* -** Program to run in debugger organized to provide tests for -** stepping, breakpoints, evaluation, cross-module calls. -*/ - -#if _WIN32 && _DEBUG -#pragma comment(linker, "/nodefaultlib:libcmt") -#pragma comment(lib, "libcmtd") -#endif - -#include -#include -#include -#include -#if !_WIN32 -# define RADDBG_MARKUP_STUBS -#endif -#define RADDBG_MARKUP_IMPLEMENTATION -#include "lib_raddbg_markup/raddbg_markup.h" - -//////////////////////////////// -// NOTE(allen): System For DLL Testing - -typedef void TestFunction(void); - -static void mule_init(void); -static TestFunction* mule_get_module_function(char *name); - -#if _WIN32 - -#include - -HMODULE mule_dll = 0; - -static void -mule_init(void){ - mule_dll = LoadLibraryA("mule_module.dll"); -} - -static TestFunction* -mule_get_module_function(char *name){ - TestFunction *result = (TestFunction*)GetProcAddress(mule_dll, name); - return(result); -} - -#else - -static void -mule_init(void){ - // TODO(allen): implement -} - -static TestFunction* -mule_get_module_function(char *name){ - // TODO(allen): implement - return(0); -} - -#endif - - -//////////////////////////////// -// NOTE(nick): Entry Point - -int -mule_main(int argc, char **argv); - -#if _WIN32 -#include -#include -int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ - int argc = __argc; - char **argv = __argv; - int result = mule_main(argc, argv); - return(result); -} -#else -int main(int argc, char **argv){ - return(mule_main(argc, argv)); -} -#endif - -//////////////////////////////// -// NOTE(nick): BSS section test - -#if defined(__clang__) -# pragma clang section bss="muleBSS" -#elif defined(_MSC_VER) -// NOTE(nick): clang-cl is borken it allocates memory and sets Initialized Flag on the seciton. -// This is was reported by Jeff => https://bugs.llvm.org/show_bug.cgi?id=47939 -// -// This is still unresolved, last checked Sep 11, 2023. -# pragma bss_seg("muleBSS") -#else -# error "bss not defined" -#endif -char global_variable_in_bss[4096*10000]; - -//////////////////////////////// -// NOTE(allen): Inline Stepping (Built In Separate Unit) - -extern unsigned int fixed_frac_bits; -unsigned int inline_stepping_tests(void); - - -//////////////////////////////// -// NOTE(rjf): -O2 Optimized Code (Built In Separate Unit) - -void optimized_build_eval_tests(void); -void optimized_struct_parameters_eval_tests(void); - -//////////////////////////////// -// NOTE(allen): Type Coverage Eval - -#include - -struct Basics -{ - char a; - unsigned char b; - short c; - unsigned short d; - int e; - unsigned int f; - long long g; - unsigned long long h; - float i; - double j; - int z; -}; - -struct Basics_Stdint -{ - int8_t a; - uint8_t b; - int16_t c; - uint16_t d; - int32_t e; - uint32_t f; - int64_t g; - uint64_t h; - float i; - double j; -}; - -struct Pair -{ - int x; - float y; -}; - -struct Fixed_Array -{ - Pair pairs[10]; - int count; -}; - -struct Dynamic_Array -{ - Pair *pairs; - int count; -}; -raddbg_type_view(Dynamic_Array, slice($)); - -template -struct TemplatedDynamicArray -{ - T *v; - int count; -}; -raddbg_type_view(TemplatedDynamicArray, rows($, count, array(v, count))); - -template -struct OpaqueTemplatedDynamicArray -{ - void *v; - int count; -}; -raddbg_type_view(OpaqueTemplatedDynamicArray, array(cast(type *)v, count)); - -struct Struct_With_Embedded_Arrays -{ - int x; - float y; - Pair pairs[10]; - char z; -}; - -typedef unsigned int Custom_Index_Type; - -typedef void Function_No_Params_Type(void); -typedef void Function_Few_Params_Type(Pair *pairs, int count, Function_No_Params_Type *no_params_type); - -static Function_No_Params_Type *ty_no_params = 0; -static Function_Few_Params_Type *ty_few_params = 0; - -struct Callback{ - Function_Few_Params_Type *few_params; - Function_No_Params_Type *no_params; - Pair pair; -}; - -union Vector_R2 -{ - struct - { - float x; - float y; - }; - float v[2]; -}; -raddbg_type_view(Vector_R2, rows($, x, y)); - -typedef union Matrix4x4F32 Matrix4x4F32; -union Matrix4x4F32 -{ - float elements[4][4]; -}; -raddbg_type_view(Matrix4x4F32, columns($.elements, $[0], $[1], $[2], $[3])); - -union PackedF16 -{ - uint16_t v; - struct - { - uint16_t mantissa : 10; - uint16_t exponent : 5; - uint16_t sign : 1; - }; -}; -raddbg_type_view(PackedF16, - exponent == 0 ? (0.00006103515625f*mantissa/1024.f) : - (exponent == 31 && mantissa == 0 && sign == 1) ? "-infinity" : - (exponent == 31 && mantissa == 0 && sign == 1) ? "+infinity" : - (exponent == 31) ? "NaN" : - (exponent < 15) ? (1.f/(1<<(15 - exponent)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) : - (exponent > 15) ? ((1<<(exponent-15)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) : - ((sign * -2 + 1) * 1.f + mantissa/1024.f)); - -enum Kind -{ - Kind_Negative = -1, - Kind_None, - Kind_First, - Kind_Second, - Kind_Third, - Kind_Fourth, - Kind_COUNT, -}; - -enum Flag -{ - Flag_None = 0, - Flag_First = 1, - Flag_Second = 2, - Flag_Third = 4, - Flag_Fourth = 8, - Flag_AllMoreNarrow = 0xFF, - Flag_AllNarrow = 0xFFFF, - Flag_All = 0xFFFFFFFF, -}; - -struct Has_Enums -{ - Kind kind; - Flag flags; -}; - -struct Discriminated_Union -{ - Kind kind; - union - { - struct - { - int x; - int y; - Vector_R2 vector; - } first; - Pair second; - struct - { - Function_Few_Params_Type *few_params; - Pair pairs[4]; - } third; - struct - { - Kind sub_kind; - Flag flags; - } fourth; - }; -}; -raddbg_type_view(Discriminated_Union, - kind == Kind.First ? first : - kind == Kind.Second ? second : - kind == Kind.Third ? third : - kind == Kind.Fourth ? fourth : - $); - -struct Crazy_Union -{ - Kind kind; - union - { - struct - { - int first_and_third__x; - int first_and_third__y; - int first_and_third__z; - } first_and_third; - struct - { - char *second__name; - Pair second__pairs[16]; - } second; - }; - union - { - struct - { - char *first__name; - int first__x; - } first; - struct - { - char *third__name; - Function_Few_Params_Type *third__few_params; - } third; - }; -}; -raddbg_type_view(Crazy_Union, - kind == Kind.First ? rows($, first_and_third, first) : - kind == Kind.Second ? rows($, second) : - kind == Kind.Third ? rows($, first_and_third, third) : - kind == Kind.Fourth ? kind : - $); - -struct Linked_List{ - Linked_List *next; - Linked_List *prev; - int x; -}; - -enum{ - Anonymous_A, - Anonymous_B, - Anonymous_C, - Anonymous_D, -}; - -typedef uint32_t SizedKind; -enum SizedKindEnum -{ - SizedKind_A, - SizedKind_B, - SizedKind_C, - SizedKind_D, -}; - -typedef Kind Alias1; -typedef Flag Alias2; -typedef Has_Enums Alias3; -typedef Discriminated_Union Alias4; - -struct Has_A_Pre_Forward_Reference{ - struct Gets_Referenced_Forwardly *pointer; -}; - -struct Gets_Referenced_Forwardly{ - int x; - int y; -}; - -struct Has_A_Post_Forward_Reference{ - struct Gets_Referenced_Forwardly value; -}; - -struct TypeWithMemberFunction -{ - int x; - int y; - int z; - char *name; - __declspec(noinline) void SetInfo(int _x, int _y, char *_name) - { - x = _x; - y = _y; - z = 0; - name = _name; - OutputDebugStringA("setting info\n"); - } -}; - -static void -no_params1(void){ - -} - -static void -few_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){ - -} - -// -// NOTE(rjf): this doesn't work because MSVC - despite GENERATING DEBUG INFO -// FOR THE MyByte TYPEDEF - does not actually *reference* this typedef -// anywhere, and instead treats all `MyByte *`s as `char *`s, thus completely -// eliminating the point of the typedef and view. :( -// -typedef char MyByte; -raddbg_type_view(MyByte *, no_string($)); - -static void -variadic_params(char *fmt, ...) -{ - int x = 0; -} - -static void -type_coverage_eval_tests(void) -{ - Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; - Basics_Stdint basics_stdint = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; - - uint32_t a = (1<<31); - int32_t b = (1<<31); - - uint32_t abcd = 0xaabbccdd; - int64_t abcd64 = (int64_t)abcd; - - char string[] = "Hello World!"; - char longer_text[] = - "Suppose there was some text\n" - "With multiple lines in it\r\n" - "\t> What ways might it be rendered?\n" - "\t> How would it deal with line endings?\r\n"; - wchar_t a_wide_string[] = - L"This is a string, but instead of being encoded in a stream of bytes,\n" - L"it is encoded in a stream of 2-byte packages!\n"; - char some_data_with_a_string[] = - { - 'H', 'e', 'l', 'l', 'o', 27, 27, 2, 27, 125, - }; - struct SomeDataStructured - { - char data[4]; - }; - SomeDataStructured *some_data = (SomeDataStructured *)&some_data_with_a_string[0]; - char *string_ptr = &string[0]; - - const char *const_string = "Hello, World!"; - const char const_string_array[] = "Hello, World!"; - const char *const const_ptr_const_string = "Hello, World!"; - - MyByte *non_string_byte_ptr = "Hello, World!"; - - void *pointer = &basics; - Basics *pointer_to_basics = &basics; - Basics **pointer_to_pointer_to_basics = &pointer_to_basics; - - Fixed_Array fixed = - { - { - { 3, 4.f}, - { 5, 6.f}, - { 7, 8.f}, - { 9, 10.f}, - {11, 12.f}, - {13, 14.f}, - {15, 16.f}, - {17, 18.f}, - {19, 20.f}, - }, - 9 - }; - Pair memory_[] = - { - {100, 1.f}, - {101, 2.f}, - {102, 4.f}, - {103, 8.f}, - {104, 16.f}, - {105, 32.f}, - }; - Dynamic_Array dynamic = - { - memory_, - 6 - }; - - TemplatedDynamicArray templated_dynamic = {dynamic.pairs, dynamic.count}; - TemplatedDynamicArray templated_dynamics[] = - { - {dynamic.pairs, dynamic.count}, - {dynamic.pairs, dynamic.count}, - {dynamic.pairs, dynamic.count}, - {dynamic.pairs, dynamic.count}, - {dynamic.pairs, dynamic.count}, - }; - - OpaqueTemplatedDynamicArray otd = {dynamic.pairs, dynamic.count}; - - raddbg_pin(columns(sequence(6), fixed.pairs[$], memory_[$])); - raddbg_pin(basics); - raddbg_pin(fixed); - raddbg_pin(pointer); - raddbg_pin(dynamic); - - Struct_With_Embedded_Arrays swea = {0}; - { - swea.x = 4; - swea.y = 23.5f; - swea.pairs[0].x = 100; - swea.pairs[0].y = 123.f; - swea.pairs[2].x = 300; - swea.pairs[2].y = 323.f; - swea.pairs[5].x = 600; - swea.pairs[5].y = 623.f; - swea.z = 'z'; - } - - Struct_With_Embedded_Arrays *swea_ptr = &swea; - int access_via_ptr_member = swea_ptr->x; - - Custom_Index_Type custom_index = 42; - Custom_Index_Type more_custom_indices[] = { - 04,13,22,31,40 - }; - - Function_No_Params_Type *ptr_no_params = no_params1; - Function_No_Params_Type **ptr_ptr_no_params = &ptr_no_params; - Function_Few_Params_Type *ptr_few_params = few_params1; - Function_Few_Params_Type **ptr_ptr_few_params = &ptr_few_params; - Callback callback = {few_params1, no_params1, {1, 2.f}}; - - Matrix4x4F32 matrix = - { - { - {1.f, 0.f, 0.f, 0.f}, - {0.f, 1.f, 0.f, 0.f}, - {0.f, 0.f, 1.f, 0.f}, - {0.f, 0.f, 0.f, 1.f}, - } - }; - - Vector_R2 vector = {1.f, 2.f}; - - Has_Enums has_enums = {(Kind)4, (Flag)7}; - - struct EnumBitfields - { - Kind k1 : 4; - Kind k2 : 3; - Kind k3 : 1; - Kind k4 : 16; - }; - - EnumBitfields enum_bitfields = {}; - enum_bitfields.k1 = Kind_First; - enum_bitfields.k2 = Kind_Second; - enum_bitfields.k3 = Kind_None; - enum_bitfields.k4 = Kind_Fourth; - - Crazy_Union crazy_union = {}; - - crazy_union.kind = Kind_First; - crazy_union.kind = Kind_Second; - crazy_union.kind = Kind_Third; - crazy_union.kind = Kind_Fourth; - - Discriminated_Union discriminated_union = {}; - - discriminated_union.kind = Kind_First; - discriminated_union.first.x = 16; - discriminated_union.first.y = 8; - discriminated_union.first.vector.x = 4.f; - discriminated_union.first.vector.y = 2.f; - - discriminated_union.kind = Kind_Second; - discriminated_union.second.x = 123; - discriminated_union.second.y = 3.14f; - - discriminated_union.kind = Kind_Third; - discriminated_union.third.few_params = few_params1; - discriminated_union.third.pairs[0] = memory_[0]; - discriminated_union.third.pairs[1] = memory_[1]; - discriminated_union.third.pairs[2] = memory_[2]; - discriminated_union.third.pairs[3] = memory_[3]; - - discriminated_union.kind = Kind_Fourth; - discriminated_union.fourth.sub_kind = Kind_First; - discriminated_union.fourth.flags = (Flag)7; - - Linked_List list = {&list, &list, 0}; - - struct SLLNode - { - SLLNode *next; - SLLNode *the_real_next_ptr; - int x; - }; - SLLNode node6 = {0, 0, 6}; - SLLNode node5 = {0, &node6, 5}; - SLLNode node4 = {0, &node5, 4}; - SLLNode node3 = {0, &node4, 3}; - SLLNode node2 = {0, &node3, 2}; - SLLNode node1 = {0, &node2, 1}; - raddbg_pin(list(node1, the_real_next_ptr)); - - node6.next = &node1; - - Alias1 a1 = has_enums.kind; - Alias2 a2 = has_enums.flags; - Alias3 a3 = has_enums; - Alias4 a4 = discriminated_union; - - Has_A_Pre_Forward_Reference r1 = {0}; - Has_A_Post_Forward_Reference r2 = {0}; - - Basics &basics_ref = basics; - const Basics *basics_const_ptr = &basics; - const Basics &basics_const_ref = basics; - - union - { - int x; - char y[4]; - } integer_slicing = {123456789}; - - typedef struct stks - { - void *left; - size_t len; - } stks; - stks stks_test[256] = {0}; - stks *stks_first = &stks_test[0]; - stks *stks_ptr = stks_first + 8; - - TypeWithMemberFunction twmf = {0}; - twmf.SetInfo(123, 456, "foobar"); - - TestFunction *function = mule_get_module_function("dll_type_eval_tests"); - function(); - - int abc = 0; - for(int i = 0; i < 1000; i += 1) - { - if(i == 500) - { - abc+= 1; - } - int a = i + abc; - int b = a*5; - } - - char *names[] = - { - "samwise gamgee", "mithrandir", "grima wormtongue", "theodred", "theoden", "eomer", "eowyn", - "arwen", "sauron", "baggins", "proudfoot", "hardbottle", "bag end", "hobbiton", - "bree", "imladris", "isengard", "moria", "mount doom", "helm's deep", "bracegirdle", - "buckleberry ferry", "amun sul", "frodo", "bilbo", "buckland", "fangorn", "elrond", - "numenor", "treebeard", "shadowfax", "brego", "erod", "azufel", "dunedain", - "saruman", "aragorn", "gandalf", "meriadoc brandybuck", "peregrine took", "faramir", "boromir", - "ecthelion", "denethor", "mithrandil", "isildur", "haldir", "elessar", "elendil", - "dead marsh", "rohan", "gondor", "anarion", "earendil", "cirith ungol", "minas morghul", - "minas tirith", "barad-dur", "rivendell", "pellenor", "ithilien", "anduril", "narsil", - "edoras", "mordor", "osgiliath", - }; - - for(int i = 0; i < sizeof(names)/sizeof(names[0]); i += 1) - { - OutputDebugStringA(names[i]); - OutputDebugStringA("\n"); - } - - if(1) - { - OutputDebugStringA("this is inside a branch!\n"); - OutputDebugStringA("foo"); - OutputDebugStringA("bar"); - OutputDebugStringA("baz"); - } - - const int32_t x1 = 3; - const int32_t y1 = -10; - const int32_t z1 = x1 + y1; - - std::string small_cplusplus_string = "smallstr"; - std::string cplusplus_string = "This is a C++ string!"; - - std::vector int_vector; - int_vector.push_back(1); - int_vector.push_back(2); - int_vector.push_back(3); - int_vector.push_back(4); - int_vector.push_back(5); - int_vector.push_back(6); - int_vector.push_back(7); - -#if 0 - std::unordered_map people = - { - {"Peter", 1}, - {"Oliver", 2}, - {"Jack", 3}, - }; -#endif - - std::vector *pint_vector = &int_vector; - std::vector &rint_vector = int_vector; - - std::vector dynamic_array_vector; - dynamic_array_vector.push_back(dynamic); - dynamic_array_vector.push_back(dynamic); - dynamic_array_vector.push_back(dynamic); - dynamic_array_vector.push_back(dynamic); - - SizedKind sized_kind = SizedKind_C; - - int x = (int)(Anonymous_D); - - variadic_params("foo", 123, 456); -} - -//////////////////////////////// -// NOTE(allen): Mutating Variables Eval - -static const int con_some_constant = 4; -static const float con_some_constant_f = 0.04f; - -static int mut_x = 0; -static int mut_y; -static int mut_xarray[4] = {0, 1, 2, 3}; -static int *mut_xptr; - -static float mut_f = 0; -static float mut_g; -static float mut_farray[4] = {0.5f, 1.5f, 2.5f, 3.5f}; -static float *mut_fptr; - -static float mut_arrayarray[3][3]; - -static Linked_List mut_link; - -static void -mutate_in_function(int *array, int count){ - for (int i = 0; i < count; i += 1){ - array[i] += 1; - } - - for (int i = 0; i < 4; i += 1){ - mut_farray[i] += 1.f; - } -} - -static void -mutating_variables_eval_tests(void){ - //////////////////////////////// - // NOTE(allen): Basics - - int array_literal[10] = { - 10, 20, 30, 40, 50, 60, 70, 80, 90, - }; - - Basics struct_literal = { - -1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001, - }; - - array_literal[0] = struct_literal.e = 9; - - int x = mut_x; - int y = x + 10 + con_some_constant; - mut_y = y; - mut_xarray[0] += 0; - mut_xarray[1] += x; - mut_xarray[2] += y; - mut_xarray[3] += x + y; - - mut_xptr = &mut_xarray[2]; - - *mut_xptr -= (y - x)/2; - *(mut_xptr - 1) += 11; - - float f = mut_f + .333f + con_some_constant_f; - float g = f + 10.1f; - mut_g = g; - mut_farray[0] += 0.000001f; - mut_farray[1] += f; - mut_farray[2] += g; - mut_farray[3] += f + g; - - mut_fptr = &mut_farray[3]; - - *mut_fptr -= (g - f)*0.5f; - *(mut_fptr - 1) += 1.f; - - float a = 0.777f; - for (int i = 0; i < 3; i += 1){ - float b = a*a - 1.f; - for (int j = 0; j < 3; j += 1){ - mut_arrayarray[i][j] = b; - b += 0.111f; - } - a += 0.333f; - } - - //////////////////////////////// - // NOTE(allen): Changes in functions - - mutate_in_function(array_literal, 10); - - mutate_in_function(array_literal, 10); - - //////////////////////////////// - // NOTE(allen): Changes through pointers - - Basics basic = struct_literal; - Basics advanced = struct_literal; - - Basics *struct_pointer = &basic; - - basic.a += 1; - advanced.a += 1; - struct_pointer->a += 1; - - struct_pointer = &advanced; - - basic.b += 1; - advanced.b += 1; - struct_pointer->b += 1; - - Linked_List links[5]; - for (int i = 0; i < 5; i += 1){ - links[i].next = &links[i + 1]; - links[i].prev = &links[i - 1]; - links[i].x = i; - } - links[0].prev = 0; - links[4].next = &mut_link; - mut_link.prev = &links[4]; - mut_link.next = 0; - mut_link.x = 1000; - - Linked_List *link_ptr = links; - - link_ptr = link_ptr->next; - - link_ptr = &links[4]; - link_ptr = &mut_link; - - Linked_List sentinel = {0}; - sentinel.x = -1; - sentinel.next = &links[0]; - links[0].prev = &sentinel; - sentinel.prev = &mut_link; - mut_link.next = &sentinel; - - link_ptr = &sentinel; -} - -//////////////////////////////// -// NOTE(allen): Global Eval - -struct NestedNodeInner{ - unsigned int small0; - unsigned int small1; - unsigned int big0; - unsigned int big1; -}; - -struct NestedNodeOuter{ - NestedNodeOuter *next; - NestedNodeInner *inner_nodes; - unsigned int inner_node_count; -}; - -static void -nested_types_eval_tests(void){ - // doing some setup - NestedNodeOuter *outer1 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); - NestedNodeOuter *outer2 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); - NestedNodeOuter *outer3 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter)); - - outer1->next = outer2; - outer2->next = outer3; - outer3->next = 0; - - outer1->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); - outer1->inner_node_count = 10; - - outer2->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); - outer2->inner_node_count = 10; - - outer3->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10); - outer3->inner_node_count = 10; - - for (unsigned int i = 0; i < 10; i += 1){ - outer1->inner_nodes[i].small0 = i; - outer1->inner_nodes[i].small1 = 2*i; - outer1->inner_nodes[i].big0 = 0xFFFFFF + 0xF*i; - outer1->inner_nodes[i].big1 = 0xFFFFFF + 0xFF*i; - - outer2->inner_nodes[i].small0 = 1 + i; - outer2->inner_nodes[i].small1 = 3*i; - outer2->inner_nodes[i].big0 = 0x1000000 + 0x10*i; - outer2->inner_nodes[i].big1 = 0x1000000 + 0x101*i; - - outer3->inner_nodes[i].small0 = 2 + i; - outer3->inner_nodes[i].small1 = 4*i; - outer3->inner_nodes[i].big0 = 0x8000000 + 0xF0*i; - outer3->inner_nodes[i].big1 = 0x8000000 + 0xF0F*i; - } - - // okay eval it here - int x = 0; -} - -//////////////////////////////// -// NOTE(rjf): Struct Parameters Eval - -static void -struct_parameter_helper(Basics basics) -{ - basics.a += 1; - basics.a += 1; - basics.a += 1; -} - -static void -struct_parameters_eval_tests(void) -{ - Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; - struct_parameter_helper(basics); -} - -//////////////////////////////// -// NOTE(allen): Global Eval - -static int g_abc = 100; -static float g_xyz = 21.f; -static Alias1 g_kind = Kind_First; - -static void -complicated_global_mutation(int *x){ - *x = (int)g_xyz; -} - -static void -cross_unit_global_mutation(void){ - fixed_frac_bits = 10; -} - -static int -function_with_duplicate_local_statics(void) -{ - static char *l_abc = "foobar"; - static int l_xyz = 123; - static Kind l_kind = Kind_First; - int x = l_xyz + (int)(int64_t)(l_abc); - return x; -} - -static void -global_eval_tests(void) -{ - g_abc = 11*11; - g_xyz = (float)g_abc - 21.f; - - int z = g_abc; - complicated_global_mutation(&z); - - complicated_global_mutation(&g_abc); - - if (g_kind == Kind_First){ - g_abc -= 1; - g_kind = Kind_None; - } - - cross_unit_global_mutation(); - - static int l_abc = 200; - static float l_xyz = 42.f; - static Alias1 l_kind = Kind_Second; - - l_abc = g_abc*2; - l_xyz = g_xyz*2; - l_kind = (Alias1)(g_kind + 1); - - function_with_duplicate_local_statics(); -} - -//////////////////////////////// -// NOTE(allen): Return Eval - -static int -complicated_return_expression(void){ - int x = 171717; - return((x % 13) <= 5?(x % 19)*11:(x - 500)%200); -} - -static void -return_eval_tests(void){ - complicated_return_expression(); -} - -//////////////////////////////// -// NOTE(allen): TLS Eval - -#if _WIN32 -# define thread_var __declspec(thread) -#else -# define thread_var __thread -#endif - -thread_var int tls_a = 100; -thread_var int tls_b = 999; - -static void -tls_eval_tests(void){ - tls_a = (tls_a + tls_b)/2; - tls_b = tls_b - tls_a; - - TestFunction *dll_tls_eval_test = mule_get_module_function("dll_tls_eval_test"); - if (dll_tls_eval_test != 0){ - dll_tls_eval_test(); - } -} - -//////////////////////////////// -// NOTE(allen): Complicated Type Coverage Eval - -struct Complicated_Type_Members{ - int x600[2][2][2][2]; - int *x601[2][2][2][2]; - int (*x602)[2][2][2][2]; - int (*x603[2])[2][2][2]; - int (*(*x604[2])[2])[2][2]; - int (*(*(*x605[2])[2])[2])[2]; - - int (*x33[2])(void); - int (*x34[3])(void); - int (*x35[2][2])(void); - - int (*(*z33)(void))[2]; - int (*(*z34)(void))[3]; - int (*(*z35)(void))[2][2]; - - int (*(*f2)(void))(void); - int (*(*(*f3)(void))(void))(void); - int (*(*f4)(int))(void); - int (*(*f5)(void))(int); - int (*(*f6)(int))(int); - int (*(*(*f7_growing)(char))(short))(int); - int (*(*(*f7_shrinking)(int))(short))(char); -}; - -static void -complicated_type_coverage_tests(void){ - Complicated_Type_Members m = {0}; - - int x1 = {0}; - int *x2 = {0}; - int **x3 = {0}; - - int x4a[2] = {0}; - int *x4[2] = {0}; - int x5a[3] = {0}; - int *x5[3] = {0}; - int *x6[2][2] = {0}; - int (*x7)[2] = {0}; - int (*x8)[3] = {0}; - int (*x9)[2][2] = {0}; - - int x600[2][2][2][2] = {0}; - int *x601[2][2][2][2] = {0}; - int (*x602)[2][2][2][2] = {0}; - int (*x603[2])[2][2][2] = {0}; - int (*(*x604[2])[2])[2][2] = {0}; - int (*(*(*x605[2])[2])[2])[2] = {0}; - - int x606_growing [2][3][4][5] = {0}; - int x606_shrinking[5][4][3][2] = {0}; - - int (*(*(*x607_growing [2])[3])[4])[5] = {0}; - int (*(*(*x607_shrinking[5])[4])[3])[2] = {0}; - - int **x10[2] = {0}; - int **x11[3] = {0}; - int **x12[2][2] = {0}; - int *(*x13)[2] = {0}; - int *(*x14)[3] = {0}; - int *(*x15)[2][2] = {0}; - int **x16[2] = {0}; - int **x17[3] = {0}; - int **x18[2][2] = {0}; - - int (*y1[2])[2] = {0}; - int (*y2[3])[2] = {0}; - int (*y3[2][2])[2] = {0}; - int (*y4[2])[3] = {0}; - int (*y5[3])[3] = {0}; - int (*y6[2][2])[3] = {0}; - int (*y7[2])[2][2] = {0}; - int (*y8[3])[2][2] = {0}; - int (*y9[2][2])[2][2] = {0}; - - int (*x19)(void) = {0}; - int (*x20)(int) = {0}; - int (*x21)(int, int) = {0}; - int (*x22)(int*, int) = {0}; - int (*x23)(int**, int) = {0}; - int (*x24)(int**, int*) = {0}; - int (*x25)(int**, int**) = {0}; - - int *(*x26)(void) = {0}; - int *(*x27)(int) = {0}; - int *(*x28)(int, int) = {0}; - int *(*x29)(int*, int) = {0}; - int *(*x30)(int**, int) = {0}; - int *(*x31)(int**, int*) = {0}; - int *(*x32)(int**, int**) = {0}; - - int (*x33[2])(void) = {0}; - int (*x34[3])(void) = {0}; - int (*x35[2][2])(void) = {0}; - - int (*x36[2])(int) = {0}; - int (*x37[3])(int) = {0}; - int (*x38[2][2])(int) = {0}; - - int (*x39[2])(int, int) = {0}; - int (*x40[3])(int, int) = {0}; - int (*x41[2][2])(int, int) = {0}; - - int (*x42[2])(int*, int) = {0}; - int (*x43[3])(int*, int) = {0}; - int (*x44[2][2])(int*, int) = {0}; - - int (*x45[2])(int**, int) = {0}; - int (*x46[3])(int**, int) = {0}; - int (*x47[2][2])(int**, int) = {0}; - - int (*x48[2])(int**, int*) = {0}; - int (*x49[3])(int**, int*) = {0}; - int (*x50[2][2])(int**, int*) = {0}; - - int (*x51[2])(int**, int**) = {0}; - int (*x52[3])(int**, int**) = {0}; - int (*x53[2][2])(int**, int**) = {0}; - - int (*(*z33)(void))[2] = {0}; - int (*(*z34)(void))[3] = {0}; - int (*(*z35)(void))[2][2] = {0}; - - int (*(*z36)(int))[2] = {0}; - int (*(*z37)(int))[3] = {0}; - int (*(*z38)(int))[2][2] = {0}; - - int (*(*z39)(int, int))[2] = {0}; - int (*(*z40)(int, int))[3] = {0}; - int (*(*z41)(int, int))[2][2] = {0}; - - int (*(*z42)(int*, int))[2] = {0}; - int (*(*z43)(int*, int))[3] = {0}; - int (*(*z44)(int*, int))[2][2] = {0}; - - int (*(*z45)(int**, int))[2] = {0}; - int (*(*z46)(int**, int))[3] = {0}; - int (*(*z47)(int**, int))[2][2] = {0}; - - int (*(*z48)(int**, int*))[2] = {0}; - int (*(*z49)(int**, int*))[3] = {0}; - int (*(*z50)(int**, int*))[2][2] = {0}; - - int (*(*z51)(int**, int**))[2] = {0}; - int (*(*z52)(int**, int**))[3] = {0}; - int (*(*z53)(int**, int**))[2][2] = {0}; - - int (*(*z303[2])(void)) = {0}; - int (*(*z304[3])(void)) = {0}; - int (*(*z305[2][2])(void)) = {0}; - - int (*(*z306[2])(int)) = {0}; - int (*(*z307[3])(int)) = {0}; - int (*(*z308[2][2])(int)) = {0}; - - int (*(*z309[2])(int, int)) = {0}; - int (*(*z400[3])(int, int)) = {0}; - int (*(*z401[2][2])(int, int)) = {0}; - - int (*(*z402[2])(int*, int)) = {0}; - int (*(*z403[3])(int*, int)) = {0}; - int (*(*z404[2][2])(int*, int)) = {0}; - - int (*(*z405[2])(int**, int)) = {0}; - int (*(*z406[3])(int**, int)) = {0}; - int (*(*z407[2][2])(int**, int)) = {0}; - - int (*(*z408[2])(int**, int*)) = {0}; - int (*(*z409[3])(int**, int*)) = {0}; - int (*(*z500[2][2])(int**, int*)) = {0}; - - int (*(*z501[2])(int**, int**)) = {0}; - int (*(*z502[3])(int**, int**)) = {0}; - int (*(*z503[2][2])(int**, int**)) = {0}; - - int (*(*f2)(void))(void) = {0}; - int (*(*(*f3)(void))(void))(void) = {0}; - int (*(*f4)(int))(void) = {0}; - int (*(*f5)(void))(int) = {0}; - int (*(*f6)(int))(int) = {0}; - int (*(*(*f7_growing)(char))(short))(int) = {0}; - int (*(*(*f7_shrinking)(int))(short))(char) = {0}; - - int (*f8)(int (*)(void)) = {0}; - int (*f9)(void (*)(int)) = {0}; - void (*f10)(int (*)(int)) = {0}; - int (*f11)(int, int (*)(void)) = {0}; - int (*f12)(int (*)(void), int) = {0}; - int (*f13)(int (*)(void), int (*)(void)) = {0}; - - int (*f14)(int (*)(void)) = {0}; - int (*f15)(int (*)(int (*)(void))) = {0}; - int (*f16)(int (*)(int (*)(int (*)(void)))) = {0}; - int (*f17)(int (*)(int (*)(int (*)(int (*)(void))))) = {0}; - - int (*f18)(int (*)(void)) = {0}; - int (*f19)(int (*(*)(void))(void)) = {0}; - int (*f20)(int (*(*(*)(void))(void))(void)) = {0}; - int (*f21)(int (*(*(*(*)(void))(void))(void))(void)) = {0}; - - int (*(*(*(*f22)(void))(void))(void))(void) = {0}; - int (*(*(*(*f23)(int [2]))(void))(void))(void) = {0}; - int (*(*(*(*f24)(int *[2]))(int [3]))(void))(void) = {0}; - int (*(*(*(*f25)(int (*)[2]))(int *[3]))(int [4]))(void) = {0}; - int (*(*(*(*f26)(int **(**)[2]))(int (*)[3]))(int *[4]))(int [5]) = {0}; - - int x = 0; -} - -//////////////////////////////// -// NOTE(allen): Extended Type Coverage Eval - -template -struct Template_Example{ - X x; - int y; -}; - -template -struct Template_Example2{ - X x; - Y y; -}; - -template -struct Template_Example3{ - X x; - Y y; - Template_Example3(X x, Y y) - { - this->x = x; - this->y = y; - } - ~Template_Example3() - { - int x = 2; - int y = 5; - int z = x + y; - } -}; - -struct SingleInheritanceBase -{ - int x; - int y; -}; - -struct SingleInheritanceDerived : SingleInheritanceBase -{ - int z; - int w; -}; - -struct Has_Members{ - int a; - int b; - uint64_t c; - uint64_t d; - Basics bas; - - int w(void){ return a; } - int x(void){ return b; } - uint64_t y(void){ return c; } - uint64_t z(void){ return d; } - Basics bas_f(void){ return bas; } -}; - -struct Has_Static_Members{ - int a; - int b; - static uint64_t c; - static uint64_t d; - - int w(void){ return a; } - int x(void){ return b; } - static uint64_t y(void){ return c; } - static uint64_t z(void){ return d; } -}; - -uint64_t Has_Static_Members::c = 0; -uint64_t Has_Static_Members::d = 0; - -struct Pointer_To_Member{ - int Has_Members::*member_ptr_int; - uint64_t Has_Members::*member_ptr_u64; - Basics Has_Members::*member_ptr_bas; - - int (Has_Members::*method_ptr_int)(void); - uint64_t (Has_Members::*method_ptr_u64)(void); - Basics (Has_Members::*method_ptr_bas)(void); -}; - -struct Has_Sub_Types{ - struct Sub_Type1{ - int x; - int y; - }; - - struct Sub_Type2{ - float x; - float y; - }; - - Sub_Type1 a; - Sub_Type2 b; -}; - -struct Conflicting_Type_Names{ - struct Sub_Type1{ - uint64_t z; - }; - - struct Sub_Type2{ - int64_t z; - }; - - Sub_Type1 a; - Sub_Type2 b; -}; - -struct Has_Private_Sub_Types{ - Has_Private_Sub_Types(char x1, char y1, - float x2, int y2, - int x3, float y3){ - this->a.x = x1; - this->a.y = y1; - this->b.x = x2; - this->b.y = y2; - this->c.x = x3; - this->c.y = y3; - } - - struct Public_Sub_Type{ - char x; - char y; - }; - Public_Sub_Type a; - - protected: - struct Protected_Sub_Type{ - float x; - int y; - }; - Protected_Sub_Type b; - - private: - struct Private_Sub_Type{ - int x; - float y; - }; - Private_Sub_Type c; -}; - -struct Vtable_Parent{ - virtual void a_virtual_function(void) = 0; - virtual void b_virtual_function(void) = 0; - virtual void c_virtual_function(void) = 0; - - void a_virtual_function(int r){ - for (int i = 0; i < r; i += 1){ - a_virtual_function(); - } - } -}; - -struct Vtable_Child : Vtable_Parent{ - int x; - int y; - - Vtable_Child(int a, int b){ - x = a; - y = b; - } - virtual void a_virtual_function(void){ - x = 0; - }; - virtual void b_virtual_function(void){ - y = 0; - }; - virtual void c_virtual_function(void){ - x = y; - }; -}; - -struct Vinheritance_Base{ - int x; - int y; - - virtual void a_virtual_function(void){ - x = 0; - }; - virtual void b_virtual_function(void){ - y = 0; - }; - virtual void x_virtual_function(void){ - y = x; - }; -}; - -struct Vinheritance_MidLeft : virtual Vinheritance_Base{ - float left; - - virtual void c1_virtual_function(void){ - left = 0; - }; - virtual void c2_virtual_function(void){ - left = 0; - }; -}; - -struct Vinheritance_MidRight : virtual Vinheritance_Base{ - float right; - - virtual void d_virtual_function(void){ - right = 0; - }; -}; - -struct Vinheritance_Child : Vinheritance_MidLeft, Vinheritance_MidRight{ - char *name; - - virtual void a_virtual_function(void){ - x = 1; - }; - virtual void c1_virtual_function(void){ - left = 1; - }; -}; - -struct Minheritance_Base{ - int x; - int y; -}; - -struct Minheritance_MidLeft : Minheritance_Base{ - float left; -}; - -struct Minheritance_MidRight : Minheritance_Base{ - float right; -}; - -struct Minheritance_Child : Minheritance_MidLeft, Minheritance_MidRight{ - char *name; -}; - -struct Pure -{ - virtual ~Pure() = default; - virtual void Foo() = 0; -}; - -struct PureChild : Pure -{ - virtual ~PureChild() = default; - virtual void Foo() {a += 1;} - double a = 0; -}; - -struct Base -{ - int x; - int y; - int z; - Base(){x = 1; y = 2; z = 3;} - virtual ~Base() = default; - virtual void Foo() = 0; -}; - -struct Derived : Base -{ - int r; - int g; - int b; - int a; - virtual ~Derived() = default; - virtual void Foo() - { - x += 1; - y += 1; - y += 1; - z += 1; - z += 1; - z += 1; - a += 1; - a += 1; - a += 1; - a += 1; - } -}; - -struct DerivedA : Base -{ - float a; - float b; - DerivedA() {a = 123.f; b = 123.f;} - virtual void Foo() {a += 1;} - virtual ~DerivedA() = default; -}; - -struct DerivedB : Base -{ - double c; - double d; - DerivedB() {c = 123.0; d = 123.0;} - virtual void Foo() {c += 1;} - virtual ~DerivedB() = default; -}; - -struct NonVirtualBase -{ - int x; - int y; - int z; -}; - -struct NonVirtualDerived : NonVirtualBase -{ - int r; - int g; - int b; - int a; -}; - -struct OverloadedMethods{ - int x; - int cool_method(void){ - return(x); - } - int cool_method(int z){ - int r = x; - x = z; - return(r); - } - void cool_method(int y, int z){ - if (x < z){ - x = y; - } - else{ - x = z; - } - } -}; - -struct HasStaticConstMembers -{ - int a; - int b; - static int c; - static int d; - static const int e = 789; - static const int f = 101112; -}; - -int HasStaticConstMembers::c = 123; -int HasStaticConstMembers::d = 456; - -struct Has_A_Constructor{ - int n; - int d; - Has_A_Constructor(int a, int b){ - int gcd = 1; - { - int x = a; - int y = b; - if (x < y){ - y = a; - x = b; - } - for (;y > 0;){ - int z = x%y; - x = y; - y = z; - } - gcd = x; - } - n = a/gcd; - d = b/gcd; - } - - static int N; - static int D; - ~Has_A_Constructor(){ - int m = N*d + n*D; - int e = d*D; - N = m; - D = d; - } -}; - -int Has_A_Constructor::N = 0; -int Has_A_Constructor::D = 1; - -struct Constructor_Gotcha_Test{ - int x; - int y; - void Constructor_Gotcha(void){ - x = y = 0; - } -}; - -struct Has_A_Friend{ - friend struct Modifies_Other; - int get_x(void){ return x; } - int get_y(void){ return y; } - - private: - int x; - int y; -}; - -struct Modifies_Other{ - int x; - int y; - - void talk_to_friend(Has_A_Friend *other){ - other->x = y; - other->y = x; - } -}; - -namespace UserNamespace{ - namespace SubA{ - struct Foo{ - int x; - int y; - }; - }; - namespace SubB{ - struct Foo{ - float u; - float v; - }; - }; - - SubA::Foo foo_a = {10, 20}; - SubB::Foo foo_b = {0.1f, 0.05f}; - - static void namespaced_function(void){ - foo_a.x = (int)(foo_a.y*foo_b.u); - foo_b.v = (float)(foo_a.x*foo_b.v); - } -}; - -static void -call_with_pass_by_reference(int &x){ - x += 1; -} - -static void -call_with_pass_by_const_reference(const int &x){ - int y = x; -} - -static void -extended_type_coverage_eval_tests(void){ - //////////////////////////////// - // NOTE(allen): Extensions to base type system. - { - int x = 0; - const int *x_ptr = &x; - int *const x_cptr = &x; - - call_with_pass_by_reference(x); - - call_with_pass_by_const_reference(x); - } - - //////////////////////////////// - // NOTE(allen): Extensions to user defined types - { - Template_Example temp_f = {1.f, 2}; - Template_Example temp_v = {(void*)&temp_f, 2}; - Template_Example > temp_tf = {temp_f, 2}; - Template_Example2 temp_if = {2, 1.f}; - Template_Example3 temp3_if(2, 1.f); - Template_Example3 temp3_vi((void *)&temp3_if, 1.f); - Template_Example3> temp3_itif(123, temp_if); - - SingleInheritanceDerived sid; - sid.x = 123; - sid.y = 456; - sid.z = 789; - sid.w = 999; - - Pointer_To_Member pointer_to_member = { - &Has_Members::a, &Has_Members::c, &Has_Members::bas, - &Has_Members::x, &Has_Members::z, &Has_Members::bas_f, - }; - - Has_Static_Members has_static_members = { 10, 20 }; - Has_Static_Members::c = 100; - Has_Static_Members::d = 110; - has_static_members.x(); - has_static_members.y(); - has_static_members.z(); - has_static_members.w(); - - Has_Sub_Types has_sub_types = { - {100, 200}, - {.1f, .2f}, - }; - - Conflicting_Type_Names conflicting_type_names = { - {10}, {-20}, - }; - - Has_Private_Sub_Types has_private_sub_types(1, 2, 4, 8, 16, 32); - - Vtable_Child vtable_child(1, 2); - vtable_child.a_virtual_function(); - - Vinheritance_Child vinheritance_child; - vinheritance_child.name = "foobar"; - vinheritance_child.left = 10.5f; - vinheritance_child.right = 13.0f; - vinheritance_child.x = -1; - vinheritance_child.y = -1; - - Minheritance_Child minheritance_child; - minheritance_child.name = "foobar"; - minheritance_child.left = 10.5f; - minheritance_child.right = 13.0f; - minheritance_child.Minheritance_MidLeft::x = -1; - minheritance_child.Minheritance_MidLeft::y = -1; - minheritance_child.Minheritance_MidRight::x = +1; - minheritance_child.Minheritance_MidRight::y = +1; - - Pure *child = new PureChild(); - child->Foo(); - child->Foo(); - child->Foo(); - delete child; - - Base *derived = new Derived(); - derived->Foo(); - derived->Foo(); - derived->Foo(); - delete derived; - - NonVirtualBase *non_virtual_derived = new NonVirtualDerived(); - non_virtual_derived->x += 1; - non_virtual_derived->x += 1; - non_virtual_derived->x += 1; - - std::unique_ptr ridiculous_cplusplus_base_class = std::make_unique(); - - std::vector> ridiculous_cplusplus_array; - for(int i = 0; i < 1024; i += 1) - { - if((i & 1) == 1) - { - ridiculous_cplusplus_array.push_back(std::make_unique()); - } - else - { - ridiculous_cplusplus_array.push_back(std::make_unique()); - } - } - - Base *base_array[1024] = {0}; - for(int i = 0; i < sizeof(base_array)/sizeof(base_array[0]); i += 1) - { - if((i & 1) == 1) - { - base_array[i] = new DerivedA(); - } - else - { - base_array[i] = new DerivedB(); - } - } - - OverloadedMethods overloaded_methods; - { - overloaded_methods.x = 0; - int a = overloaded_methods.cool_method(); - overloaded_methods.cool_method(-10, 100); - int b = overloaded_methods.cool_method(100); - overloaded_methods.cool_method(b*2, a*2); - int c = overloaded_methods.cool_method(a + b); - int z = c; - } - - Has_A_Constructor construct_me(360, 25); - - Has_A_Friend has_a_friend; - - Modifies_Other modifies_other; - modifies_other.x = 57; - modifies_other.y = 66; - - modifies_other.talk_to_friend(&has_a_friend); - - int x = has_a_friend.get_x(); - int y = has_a_friend.get_y(); - int z = x; - - HasStaticConstMembers static_const_members = {0}; - static_const_members.a = 123 + HasStaticConstMembers::c * HasStaticConstMembers::e; - static_const_members.b = 456 + HasStaticConstMembers::d * HasStaticConstMembers::f; - } - - //////////////////////////////// - // NOTE(allen): Namespaces - { - UserNamespace::namespaced_function(); - } -} - -//////////////////////////////// -//~ rjf: Templated Function Eval Tests - -typedef struct TemplateArg TemplateArg; -struct TemplateArg -{ - int x; - int y; - int z; - float a; - float b; - float c; - char *name; -}; - -template static T -templated_factorial(T t) -{ - T result = t; - if(t > 1) - { - result *= templated_factorial(t-1); - } - return result; -} - -template static T -compute_template_arg_info(T t) -{ - int sum = t.x + t.y + t.z; - int size = sizeof(t); - float sum_f = t.a + t.b + t.c; - OutputDebugStringA(t.name); - return t; -} - -static void -templated_function_eval_tests(void) -{ - int int_factorial = templated_factorial(10); - float float_factorial = templated_factorial(10); - TemplateArg arg = {1, 2, 3, 4.f, 5.f, 6.f, "my template arg"}; - compute_template_arg_info(arg); - int x = 0; -} - -//////////////////////////////// -//~ NOTE(allen): C Type Coverage - -extern "C"{ -#include "mule_c.h" -} - -//////////////////////////////// -//~ rjf: Basic Inline Line Info Tests - -#if defined(_MSC_VER) -# define FORCE_INLINE __forceinline -#elif defined(__clang__) -# define FORCE_INLINE __attribute__((always_inline)) -#else -# error need force inline for this compiler -#endif - -static FORCE_INLINE void -basic_inlinee(int inlinee_param_x, int inlinee_param_y, int inlinee_param_z) -{ - OutputDebugStringA("A\n"); - OutputDebugStringA("B\n"); - OutputDebugStringA("C\n"); - OutputDebugStringA("D\n"); -} - -static void -basic_inline_tests(void) -{ - OutputDebugStringA("{\n"); - basic_inlinee(12, 34, 56); - OutputDebugStringA("}\n"); -} - -//////////////////////////////// -//~ rjf: Fancy Visualization Eval Tests - -struct PackedBits -{ - unsigned char b1 : 1; - unsigned char b2 : 1; - unsigned char b3 : 1; - unsigned char b4 : 1; - unsigned char b5 : 1; - unsigned char b6 : 1; -}; -raddbg_type_view(unsigned char : 1, bool($)); - -struct Bitmap -{ - unsigned char *base; - int width; - int height; -}; -raddbg_type_view(Bitmap, bitmap(base, width, height)); - -static unsigned int -mule_bswap_u32(unsigned int x) -{ - unsigned int result = (((x & 0xFF000000) >> 24) | - ((x & 0x00FF0000) >> 8) | - ((x & 0x0000FF00) << 8) | - ((x & 0x000000FF) << 24)); - return result; -} - -static void -fancy_viz_eval_tests(void) -{ - //- rjf: windows -> GetLastError -#if _WIN32 - DWORD error_code = 0; - SetLastError(1234); - error_code = GetLastError(); - SetLastError(4567); - error_code = GetLastError(); - (void)error_code; -#endif - - //- rjf: booleans (checkboxes) - bool bool1 = 0; raddbg_pin(bool1); - bool bool2 = 1; raddbg_pin(bool2); - bool bool3 = 0; raddbg_pin(bool3); - PackedBits packed_bits = {}; - packed_bits.b1 = 1; - packed_bits.b3 = 1; - packed_bits.b5 = 1; - - //- rjf: sliders - float slide1 = 500.f; raddbg_pin(range1(slide1, 0, 1000)); - double slide2 = 0.75; raddbg_pin(range1(slide2, 0, 1.0)); - int slide3 = 25; raddbg_pin(range1(slide3, 0, 100)); - - //- rjf: colors - float example_color_4f32[4] = {1.00f, 0.85f, 0.25f, 1.00f}; - unsigned int example_color_u32 = 0xff6f30ff; - struct {float r, g, b, a;} example_color_struct = {0.50f, 0.95f, 0.75f, 1.00f}; - int x0 = 0; - raddbg_pin(color(example_color_4f32)); - raddbg_pin(color(example_color_u32)); - raddbg_pin(color(example_color_struct)); - - //- rjf: multiline text - char *long_string = ("This is an example of some very long text with line breaks\n" - "in it. This is a very common kind of data which is inspected\n" - "in the debugger while programming, and it is often a pain\n" - "when it is poorly supported.\n"); - char *code_string = ("#include \n" - "\n" - "int main(int argc, char**argv)\n" - "{\n" - " printf(\"Hello, World!\\n\");\n" - " return 0;\n" - "}\n\n"); - int x1 = 0; - raddbg_pin(text(long_string)); - raddbg_pin(text(code_string, lang=c)); - raddbg_pin(disasm(fancy_viz_eval_tests)); - - //- rjf: programmatic memory annotations - void *some_block_of_memory = malloc(256); - memset(some_block_of_memory, 0x27, 256); - raddbg_annotate_vaddr_range(some_block_of_memory, 256, "test memory annotation"); - - //- rjf: half-floats - PackedF16 f16s[] = - { - {0x0001}, // ~0.000000059604645 - {0x03ff}, // ~0.000060975552 - {0x0400}, // ~0.00006103515625 - {0x3555}, // ~0.33325195 - {0x3bff}, // ~0.99951172 - {0x3c00}, // 1 - {0x3c01}, // 1.00097656 - {0x7bff}, // 65504, - {0x7c00}, // +inf - {0xfc00}, // -inf - }; - - //- rjf: table index lookups - struct - { - char *name; - int x; - int y; - int z; - } - nodes[] = - { - {"---", 1, 7, 3}, - {"---", 5, 4, 2}, - {"second", 12, 41, 22}, - {"---", 8, 9, 1}, - {"---", 1, 1, 1}, - {"first", 50, 50, 50}, - {"fourth", 7, 7, 7}, - {"---", 7, 12, 1}, - {"third", 27, 43, 41}, - {"---", 2, 17, 50}, - }; - int node_indices[] = - { - 5, 2, 8, 6 - }; - raddbg_pin(columns(node_indices, nodes[$])); - - //- rjf: bitmaps - unsigned int background_color = 0x00000000; - unsigned int main_color = 0xff2424ff; - unsigned int shine_color = 0xff5693ff; - unsigned int shadow_color = 0xff238faf; - unsigned int bg = mule_bswap_u32(background_color); - unsigned int cl = mule_bswap_u32(main_color); - unsigned int sn = mule_bswap_u32(shine_color); - unsigned int sh = mule_bswap_u32(shadow_color); - unsigned int pixels[] = - { - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, bg, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, cl, cl, bg, cl, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, cl, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, cl, sh, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, cl, sn, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, sh, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, sh, cl, cl, cl, sh, sh, bg, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, sh, sh, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, - bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, - }; - raddbg_pin(bitmap(pixels, 18, 18)); - for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) - { - unsigned int r = pixels[i]&0x000000ff; - unsigned int a = pixels[i]&0xff000000; - pixels[i] = pixels[i]>>8; - pixels[i] &= ~0xffff0000; - pixels[i] |= (r<<16); - pixels[i] |= (a); - } - for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) - { - unsigned int r = pixels[i]&0x000000ff; - unsigned int a = pixels[i]&0xff000000; - pixels[i] = pixels[i]>>8; - pixels[i] &= ~0xffff0000; - pixels[i] |= (r<<16); - pixels[i] |= (a); - } - for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1) - { - unsigned int r = pixels[i]&0x000000ff; - unsigned int a = pixels[i]&0xff000000; - pixels[i] = pixels[i]>>8; - pixels[i] &= ~0xffff0000; - pixels[i] |= (r<<16); - pixels[i] |= (a); - } - int x2 = 0; - - //- rjf: type-viewed bitmaps - Bitmap foo = {(unsigned char *)&pixels[0], 18, 18}; - raddbg_pin(foo); - - //- rjf: name collisions with debugger rules - Function_Few_Params_Type *raw = 0; - char *text = "some_important_text_here\n"; - Bitmap bitmap = foo; - int x3 = 0; - - //- rjf: 3D geometry - float vertex_data[] = // pos.x, pos.y, pos.z, nor.x, nor.y, nor.z, tex.u, tex.v, col.r, col.g, col.b, ... - { - -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 10.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 2.0f, 0.973f, 0.480f, 0.002f, - 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 2.0f, 0.973f, 0.480f, 0.002f, - -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 8.0f, 0.973f, 0.480f, 0.002f, - 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 8.0f, 0.973f, 0.480f, 0.002f, - -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 10.0f, 0.973f, 0.480f, 0.002f, - -0.6f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 2.0f, 10.0f, 0.973f, 0.480f, 0.002f, - 0.6f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 8.0f, 10.0f, 0.973f, 0.480f, 0.002f, - 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 10.0f, 10.0f, 0.973f, 0.480f, 0.002f, - 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 2.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 8.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 8.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 2.0f, 10.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 8.0f, 10.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 10.0f, 10.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 10.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 2.0f, 0.612f, 0.000f, 0.069f, - -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 2.0f, 0.612f, 0.000f, 0.069f, - 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 8.0f, 0.612f, 0.000f, 0.069f, - -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 8.0f, 0.612f, 0.000f, 0.069f, - 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.612f, 0.000f, 0.069f, - 0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 2.0f, 10.0f, 0.612f, 0.000f, 0.069f, - -0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 8.0f, 10.0f, 0.612f, 0.000f, 0.069f, - -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 10.0f, 10.0f, 0.612f, 0.000f, 0.069f, - -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 10.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 2.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 8.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 8.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 2.0f, 10.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 8.0f, 10.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 10.0f, 10.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 8.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 1.0f, 0.6f, 0.0f, 1.0f, 0.0f, 2.0f, 2.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 1.0f, 0.6f, 0.0f, 1.0f, 0.0f, 8.0f, 2.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 1.0f, -0.6f, 0.0f, 1.0f, 0.0f, 2.0f, 8.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 1.0f, -0.6f, 0.0f, 1.0f, 0.0f, 8.0f, 8.0f, 0.000f, 0.254f, 0.637f, - -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 10.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 2.0f, 10.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 8.0f, 10.0f, 0.000f, 0.254f, 0.637f, - 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 10.0f, 10.0f, 0.000f, 0.254f, 0.637f, - -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 2.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 8.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 10.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -1.0f, -0.6f, 0.0f, -1.0f, 0.0f, 2.0f, 2.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -1.0f, -0.6f, 0.0f, -1.0f, 0.0f, 8.0f, 2.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -1.0f, 0.6f, 0.0f, -1.0f, 0.0f, 2.0f, 8.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -1.0f, 0.6f, 0.0f, -1.0f, 0.0f, 8.0f, 8.0f, 0.001f, 0.447f, 0.067f, - -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 10.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 2.0f, 10.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 8.0f, 10.0f, 0.001f, 0.447f, 0.067f, - 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 10.0f, 10.0f, 0.001f, 0.447f, 0.067f, - -0.6f, 0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, -0.6f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, 0.6f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, -0.6f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, -0.6f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, -0.6f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - -0.6f, 0.6f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, 0.6f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.973f, 0.480f, 0.002f, - 1.0f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 1.0f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.897f, 0.163f, 0.011f, - 0.6f, 0.6f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, -0.6f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, 0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, -0.6f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, -0.6f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, -0.6f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - 0.6f, 0.6f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, 0.6f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.612f, 0.000f, 0.069f, - -1.0f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, -0.6f, 0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, -0.6f, -0.6f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 0.6f, 0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -1.0f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, 0.6f, -0.6f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.127f, 0.116f, 0.408f, - -0.6f, 1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, 1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - 0.6f, 0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.000f, 0.254f, 0.637f, - -0.6f, -0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -1.0f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -1.0f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -0.6f, -0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -1.0f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -0.6f, 0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -0.6f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -1.0f, -0.6f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -1.0f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -0.6f, -0.6f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - -0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -0.6f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - 0.6f, -1.0f, 0.6f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.001f, 0.447f, 0.067f, - }; - unsigned int index_data[] = - { - 0, 1, 9, 9, 8, 0, 1, 2, 5, 5, 4, 1, 6, 7, 10, 10, 9, 6, 2, 3, 11, 11, 10, 2, - 12, 13, 21, 21, 20, 12, 13, 14, 17, 17, 16, 13, 18, 19, 22, 22, 21, 18, 14, 15, 23, 23, 22, 14, - 24, 25, 33, 33, 32, 24, 25, 26, 29, 29, 28, 25, 30, 31, 34, 34, 33, 30, 26, 27, 35, 35, 34, 26, - 36, 37, 45, 45, 44, 36, 37, 38, 41, 41, 40, 37, 42, 43, 46, 46, 45, 42, 38, 39, 47, 47, 46, 38, - 48, 49, 57, 57, 56, 48, 49, 50, 53, 53, 52, 49, 54, 55, 58, 58, 57, 54, 50, 51, 59, 59, 58, 50, - 60, 61, 69, 69, 68, 60, 61, 62, 65, 65, 64, 61, 66, 67, 70, 70, 69, 66, 62, 63, 71, 71, 70, 62, - 72, 73, 74, 74, 75, 72, 76, 77, 78, 78, 79, 76, 80, 81, 82, 82, 83, 80, 84, 85, 86, 86, 87, 84, - 88, 89, 90, 90, 91, 88, 92, 93, 94, 94, 95, 92, 96, 97, 98, 98, 99, 96, 100, 101, 102, 102, 103, 100, - 104, 105, 106, 106, 107, 104, 108, 109, 110, 110, 111, 108, 112, 113, 114, 114, 115, 112, 116, 117, 118, 118, 119, 116, - 120, 121, 122, 122, 123, 120, 124, 125, 126, 126, 127, 124, 128, 129, 130, 130, 131, 128, 132, 133, 134, 134, 135, 132, - 136, 137, 138, 138, 139, 136, 140, 141, 142, 142, 143, 140, 144, 145, 146, 146, 147, 144, 148, 149, 150, 150, 151, 148, - 152, 153, 154, 154, 155, 152, 156, 157, 158, 158, 159, 156, 160, 161, 162, 162, 163, 160, 164, 165, 166, 166, 167, 164, - }; - int count = (sizeof index_data/4); - float *vtx = vertex_data; - int vtx_size = sizeof vertex_data; - raddbg_pin(geo3d(index_data, count = count, vtx = vtx, vtx_size = vtx_size)); - int x4 = 0; -} - -//////////////////////////////// -//~ rjf: Markup Tests - -static void -markup_tests(void) -{ - int x = 0; - raddbg_add_breakpoint(&x, sizeof(x), 0, 1, 0); - for(int i = 0; i < 10000; i += 1) - { - if(i == 5000) - { - x += 1; - } - } - raddbg_remove_breakpoint(&x, sizeof(x), 0, 1, 0); -} - -//////////////////////////////// -//~ NOTE(allen): Function Overload Resolution - -static int -overloaded_function(float y){ - int r = (int)(y + 0.5f); - return(r); -} - -static int -overloaded_function(float y, int x){ - int r = overloaded_function(y) + x; - return(r); -} - -static int -overloaded_function(int x){ - float y = (float)x; - int r = overloaded_function(y, 1); - return(r); -} - -//////////////////////////////// -// NOTE(allen): Control Flow Stepping - -static void -control_flow_stepping_tests(void){ - { - int a = 1; - if (a < 1){ - a += 1; - } - if (a < 2){ - a += 2; - } - } - - { - int a = 1; - if (a < 1) - { - a += 1; - } - if (a < 2) - { - a += 2; - } - } - - { - int a = 1; - if (a < 1) - a += 1; - if (a < 2) - a += 2; - } - - { - int a = 1; - int b = 2; - if (a <= b){ - if (a == b){ - b += 1; - } - else{ - a += 1; - } - } - else{ - if (a%2){ - a = b; - } - else{ - a = b - 1; - } - } - } - - { - int a = 1; - int b = 2; - if (a <= b) - { - if (a == b) - { - b += 1; - } - else - { - a += 1; - } - } - else - { - if (a%2) - { - a = b; - } - else - { - a = b - 1; - } - } - } - - { - int a = 1; - int b = 2; - if (a <= b) - if (a == b) - b += 1; - else - a += 1; - else - if (a%2) - a = b; - else - a = b - 1; - } - - { - int x = 0; - for (int i = 0; i < 10; i += 1){ - x += i; - } - } - - { - int x = 0; - for (int i = 0; i < 10; i += 1) - { - x += i; - } - } - - { - int x = 0; - for (int i = 0; i < 10; i += 1) - x += i; - } - - { - int x = 0; - for (int i = 0; i < 10; i += 1) x += i; - } - - { - int a = 1; - for (;a < 10;){ - switch (a){ - case 0: case 1: case 2: - { - a += 2; - }break; - - default: - case 4: - case 5: - { - a += 1; - }break; - - case 6: a += 1; break; - case 7: a += 1; - case 8: - case 9: a += 1; - } - } - } - - { - int i = 0; - while (i < 5){ - i += 1; - } - - while (i < 10) - { - i += 1; - } - - while (i < 15) - i += 1; - - while (i < 20) i += 1; - } - - { - int i = 0; - do - { - i += 1; - } while (i < 10); - } - - { - int i = 17; - - check_again: - if (i <= 1) goto done; - if ((i&1) == 0) goto even_case; - - // odd_case: - i = 3*i + 1; - - even_case: - i /= 2; - goto check_again; - - done:; - } - - { - int x = 15; - label_same_line:; x -= 1; if(x > 0) { goto label_same_line; } else { goto end_label_same_line; } - } - end_label_same_line:; -} - -//////////////////////////////// -// NOTE(allen): Indirect Call/Jump Stepping Tests - -typedef int FunctionType(int); - -static int -function_foo(int a){ - if (a < 1){ - a += 1; - } - if (a < 2){ - a += 2; - } - return(a); -} - -static int -function_bar(int x){ - for (int i = 0; i < 10; i += 1){ - x += i; - } - return(x); -} - - -static void -indirect_call_jump_stepping_tests(void){ - int z = 1; - FunctionType *ptr = function_foo; - z = ptr(z); - if ((z & 1) == 0){ - ptr = function_bar; - } - z = ptr(z); - - switch (z&7){ - case 0: - { - z += 2; - ptr = function_bar; - }break; - - case 1: - { - z += 1; - ptr = function_bar; - }break; - - case 2: - { - z *= 2; - ptr = function_bar; - }break; - - case 3: - { - z -= 10; - ptr = function_foo; - }break; - - case 4: - { - z -= 5; - ptr = function_foo; - }break; - - case 5: - { - z = z ^ 0x10; - ptr = function_foo; - }break; - - case 6: - { - z = z & ~0x10; - ptr = function_foo; - }break; - - case 7: - { - z = z | 0x10; - ptr = function_foo; - }break; - } - - z = ptr(z); -} - -//////////////////////////////// -// NOTE(rjf): alloca (Variable-Width Stack Changes) Stepping Tests - -static void -alloca_stepping_tests(void) -{ - int x = 1; - int y = 3; - int z = 5; - -#if _WIN32 - int *mem = (int *)_alloca((x+y+z)*sizeof(int)); - mem[0] = x; - mem[1] = y; - mem[2] = z; -#else - int *mem = (int *)__builtin_alloca((x+y+z)*sizeof(int)); - mem[0] = x; - mem[1] = y; - mem[2] = z; -#endif -} - -//////////////////////////////// -// NOTE(allen): Overloaded Line Stepping - -static int -function_get_integer(void){ - return(1); -} - -static void -function_with_multiple_parameters(int x, int y){ - x += y; -} - -static int -recursive_single_line(int x){ return(x <= 1?0:x + recursive_single_line(x/2)); } - -static int shared_1(int x) { return(x); } static int shared_2(int x) { return(1 + shared_1(x)); } - -static void -overloaded_line_stepping_tests(void){ - function_with_multiple_parameters(function_get_integer(), function_get_integer()); - function_with_multiple_parameters(function_get_integer(), function_get_integer()); - function_with_multiple_parameters(function_get_integer(), function_get_integer()); - - recursive_single_line(50); - recursive_single_line(50); - recursive_single_line(50); - - shared_2(5); - shared_2(5); - shared_2(5); - - function_get_integer(); shared_1(1); shared_1(2); - - if ((shared_2(10) && shared_2(-1)) || - shared_2(function_get_integer())){ - int x = 0; - } - else{ - int y = 0; - } -} - -//////////////////////////////// -// NOTE(allen): Long Jump Stepping - -#include - -static jmp_buf global_jump_buffer; -static int global_jump_x; - -static void -long_jump_from_function(void){ - int spin = 0; - for (; spin < 5; spin += 1); - longjmp(global_jump_buffer, 2); - global_jump_x = spin; -} - -static void -long_jump_wrapped_in_function(void){ - global_jump_x = 0; - int val = setjmp(global_jump_buffer); - if (val == 0){ - global_jump_x = 1; - longjmp(global_jump_buffer, 1); - } - else if (val == 1){ - if (global_jump_x == 1){ - global_jump_x = 2; - long_jump_from_function(); - } - } - else if (val == 2){ - global_jump_x = 3; - } -} - -static void -long_jump_stepping_tests(void){ - - long_jump_wrapped_in_function(); - - long_jump_wrapped_in_function(); - - long_jump_wrapped_in_function(); - -} - -//////////////////////////////// -// NOTE(allen): Recursion Stepping - -static int -recursive_call(int x){ - if (x <= 1){ - return(x); - } - - int r1 = recursive_call(x - 1); - int r2 = recursive_call(x - 2); - return(r1 + r2); -} - -static int -tail_recursive_call(int x, int m){ - if (x <= 1){ - return(m); - } - return(tail_recursive_call(x - 1, x*m)); -} - -static void -recursion_stepping_tests(void){ - - recursive_call(4); - - recursive_call(4); - - tail_recursive_call(5, 1); - - tail_recursive_call(5, 1); - -} - -//////////////////////////////// -// NOTE(rjf): Thread Stepping - -#if _WIN32 -DWORD thread_step_thread(void *p) -{ - int x = 0; - for(int i = 0; i < 100000; i += 1) - { - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - x += 1; - } - return 0; -} -#endif - -void thread_stepping_tests(void) -{ -#if _WIN32 - HANDLE h[8] = {0}; - for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) - { - DWORD id = 0; - h[i] = CreateThread(0, 0, thread_step_thread, 0, CREATE_SUSPENDED, &id); - raddbg_thread_id_name(id, "thread_step_thread_%i", i); - raddbg_thread_id_color_u32(id, 0xff9f23ff); - } - for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) - { - ResumeThread(h[i]); - } - for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1) - { - WaitForSingleObject(h[i], INFINITE); - } -#endif -} - -//////////////////////////////// -// NOTE(rjf): Debug Strings - -static void -debug_string_tests(void) -{ - for(int i = 0; i < 100; i += 1) - { - printf("here is a number: %i\n", i); - fflush(stdout); - } -#if _WIN32 - for(int i = 0; i < 100; i += 1) - { - OutputDebugStringA("Hello, World!\n"); - } - char message[65409+1]; - memset(&message[0], '=', sizeof(message)); - for(int i = 1; i < sizeof(message); i += 128) - { - message[i] = '\n'; - } - message[sizeof(message) - 1] = 0; - OutputDebugStringA(message); -#endif -} - -//////////////////////////////// -//~ rjf: Thread Name Test - -#if _WIN32 -DWORD dummy_thread(void *p) -{ - Sleep(10); - return 0; -} -#endif - -static void -thread_name_tests(void) -{ -#if _WIN32 - DWORD id = 0; - HANDLE h = CreateThread(0, 0, dummy_thread, 0, CREATE_SUSPENDED, &id); - raddbg_thread_id_name(id, "dummy_thread"); - raddbg_thread_id_color_u32(id, 0xff1f23ff); - ResumeThread(h); - WaitForSingleObject(h, INFINITE); -#endif -} - -//////////////////////////////// -//~ rjf: Interrupt Stepping Tests - -#include - -static void -interrupt_stepping_tests(void) -{ - __debugbreak(); - __debugbreak(); - __debugbreak(); - __debugbreak(); - for(int i = 0; i < 1000; i += 1) - { - if(i == 999) - { - __debugbreak(); - } - } - for(int i = 0; i < 1000; i += 1) - { - if(i == 999) - { - assert(0); - } - } - int x = 0; -} - -//////////////////////////////// -//~ rjf: JIT Stepping Tests - -static void -jit_stepping_tests(void) -{ - OutputDebugString("A\n"); - VOID *code = VirtualAlloc(0, 0x1000, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE); - *((uint32_t*)code) = 0xC39090CC; - ((void (__fastcall *)()) code)(); - OutputDebugString("B\n"); -} - -//////////////////////////////// -// NOTE(allen): Exception Stepping - -static void -exception_filter_test(void) -{ - __try - { - RaiseException(0xc0000095, 0, 0, 0); - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - OutputDebugStringA("did an exception\n"); - } -} - -int *global_null_read_pointer = 0; -static void -trip(void){ - *global_null_read_pointer = 0; -} - -static void -cpp_exception_in_function(void){ - int v = 0; - try{ - throw 1; - } - catch (...){ - v = 1; - } -} - -static void -cpp_throw_in_function(void){ - throw 1; -} - -static void -win32_exception_in_function(void){ -#if _WIN32 - int v = 0; - __try{ - trip(); - v = 1; - } - __except (EXCEPTION_EXECUTE_HANDLER){ - v = 2; - } - - v = 3; - __try{ - trip(); - v = 4; - } - __except (EXCEPTION_EXECUTE_HANDLER){ - v = 5; - } -#endif -} - -static void -cpp_recursive_exception(int x){ - try{ - if (x > 1){ - throw 1; - } - } - catch (...){ - x -= 1; - cpp_recursive_exception(x); - x += 1; - } -} - -static void -win32_recursive_exception(int x){ -#if _WIN32 - __try{ - if (x > 1){ - throw 1; - } - } - __except (EXCEPTION_EXECUTE_HANDLER){ - x -= 1; - win32_recursive_exception(x); - x += 1; - } -#endif -} - -static void -exception_stepping_tests(void){ - { - int v = 0; - try{ - throw 1; - } - catch (...){ - v = 1; - } - } - - { - int v = 0; - try{ - cpp_throw_in_function(); - } - catch (...){ - v = 1; - } - } - - cpp_exception_in_function(); - cpp_exception_in_function(); - -#if _WIN32 - win32_exception_in_function(); - win32_exception_in_function(); -#endif - - // NOTE(allen): Exception in catch tests - { - int v = 0; - try{ - v = 1; - throw 1; - } - catch (...){ - try{ - v = 2; - throw 2; - } - catch (...){ - v = 3; - } - } - } - - { - int v = 0; - try{ - v = 1; - throw 1; - } - catch (...){ - cpp_exception_in_function(); - } - } - -#if _WIN32 - { - int v = 0; - try{ - v = 1; - throw 1; - } - catch (...){ - win32_exception_in_function(); - } - } -#endif - - cpp_recursive_exception(4); - cpp_recursive_exception(4); - cpp_recursive_exception(4); - -#if _WIN32 - win32_recursive_exception(4); - win32_recursive_exception(4); - win32_recursive_exception(4); -#endif - - // NOTE(allen): Try in try tests - { - int v = 0; - try{ - try{ - v = 1; - throw 1; - } - catch (...){ - v = 2; - } - throw 2; - } - catch (...){ - v = 3; - } - } - - { - int v = 0; - try{ - try{ - v = 1; - cpp_throw_in_function(); - } - catch (...){ - v = 2; - } - throw 2; - } - catch (...){ - v = 3; - } - } - - { - int v = 0; - try{ - cpp_exception_in_function(); - throw 2; - } - catch (...){ - v = 3; - } - } - -#if _WIN32 - { - int v = 0; - try{ - win32_exception_in_function(); - throw 2; - } - catch (...){ - v = 3; - } - } -#endif - -} - -typedef void (*callback_t)(int a); -static void -dynamic_step_test(void){ -#if _WIN32 -#if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( _M_AMD64 ) - void *page = VirtualAlloc(0, 4096, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); - char *ptr = (char*)page; - *ptr++ = 0x51; // push rcx - *ptr++ = 0x59; // pop rcx - *ptr++ = 0xC3; // ret - callback_t cb = (callback_t)page; - cb(1); -#endif -#endif -} - -//////////////////////////////// - -raddbg_entry_point(mule_main); - -int -mule_main(int argc, char** argv) -{ - raddbg_thread_name("mule_main_thread"); - raddbg_thread_color_rgba(0.4f, 0.9f, 0.2f, 1); - if(raddbg_is_attached()) - { - raddbg_log("raddbg is attached!\n"); - } - - mule_init(); - - type_coverage_eval_tests(); - - mutating_variables_eval_tests(); - - nested_types_eval_tests(); - - struct_parameters_eval_tests(); - - global_eval_tests(); - - return_eval_tests(); - - tls_eval_tests(); - - complicated_type_coverage_tests(); - - extended_type_coverage_eval_tests(); - - templated_function_eval_tests(); - - c_type_coverage_eval_tests(); - - c_type_with_bitfield_usage(); - - optimized_build_eval_tests(); - - optimized_struct_parameters_eval_tests(); - - fancy_viz_eval_tests(); - - exception_filter_test(); - - control_flow_stepping_tests(); - - indirect_call_jump_stepping_tests(); - - alloca_stepping_tests(); - - basic_inline_tests(); - - inline_stepping_tests(); - - overloaded_line_stepping_tests(); - - overloaded_function(100); - - dynamic_step_test(); - - long_jump_stepping_tests(); - - recursion_stepping_tests(); - - thread_stepping_tests(); - - debug_string_tests(); - - thread_name_tests(); - - jit_stepping_tests(); - - interrupt_stepping_tests(); - - markup_tests(); - - exception_stepping_tests(); - - return(0); -} diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main.pdb b/data/test_inputs/mule_main_9ff1e58f/mule_main.pdb deleted file mode 100644 index 5116f2ce..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/mule_main.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2b10fe04ef539796a329790987f781e645707a737e32db863f3e49a1766bf5a -size 4763648 diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi b/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi deleted file mode 100644 index 2125b838..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/mule_main.rdi +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:446e9b14f298e3824edccf61d857108d6100a3c1a3a5dcd7fa7d52fe5a1d6a8d -size 2768548 diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_main_9ff1e58f.exe b/data/test_inputs/mule_main_9ff1e58f/mule_main_9ff1e58f.exe deleted file mode 100644 index e61f158f..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/mule_main_9ff1e58f.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ac765d8dfa6d3a3830b3efc76d8b52f6dd201004e9fead477138ac7b4d1015a -size 264704 diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_module.cpp b/data/test_inputs/mule_main_9ff1e58f/mule_module.cpp deleted file mode 100644 index 155d588f..00000000 --- a/data/test_inputs/mule_main_9ff1e58f/mule_module.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#if _WIN32 -#define export_function extern "C" __declspec(dllexport) -#else -#define export_function extern "C" -#endif - -#if _WIN32 -# define thread_var __declspec(thread) -#else -# define thread_var __thread -#endif - -typedef struct OnlyInModule OnlyInModule; -struct OnlyInModule -{ - int x; - int y; - int z; - char *name; -}; - -typedef struct Basics Basics; -struct Basics -{ - int a; - int b; - int c; - int d; -}; - -static OnlyInModule only_in_module_global = -{ - 1, 2, 3, "foobar", -}; - -thread_var float tls_a = 1.015625f; -thread_var int tls_b = -100; - -export_function void -dll_tls_eval_test(void) -{ - tls_a *= 1.5f; - tls_b *= -2; - only_in_module_global.x += 1; - only_in_module_global.y += 2; - only_in_module_global.z += 3; -} - -export_function void -dll_type_eval_tests(void) -{ - Basics basics1 = {1, 2, 3, 4}; - Basics basics2 = {4, 5, 6, 7}; - OnlyInModule only_in_module = {123, 456, 789, "this type is only in the module!"}; - int x = 0; - (void)x; -} diff --git a/data/test_inputs/mule_main_9ff1e58f/mule_module.dll b/data/test_inputs/mule_main_9ff1e58f/mule_module.dll deleted file mode 100644 index 257b90fa0c3588e2b58926c713f095ebd94dcc27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 667648 zcmeEvd3=o5_y1%WnIL8?A(k>oH1-hML@XIHJVQb(seP-Zw01M7H983JI?4i`w*4EZD9krIAnBV(-pGhR4%jfg?e!s8ZA4y+5&%O7Yd+xdC-h1x3 z=RVI!=(RxOr_pHq@xRBT(QL(&f3X7oHPHEJG^MI-FQwTOc&PeTpZG)7yA2yY-Z*C5 z=$FO~9BCXhaMY;LR^y99jN@#hjKfD6<2rRUjvPIBNQ0oD;-OyFpI3Zn$(i& z8{X&Z;@M^RpkZv|&w7+-)@TOL3e?!Emw!2z=DMbav4n4_dYXDVjmGFJimw~+;Qty; zGPgQRb@|08+J5?&Hb4x8##R%^Xl?buF$57aYCddZ5N=$ye}h zaUoV>#XwC|zT(`ZF)UEj&#n-ti4}r+F^R=BSsd^``DL&ebscqll1xiV##l~N>`h*p)Z1;FP{1SVo7HmF`h-G*w-=Mu_*ThU3!Cvh(SYN z(r9edQ8Mrx=8z}oVjBz{V;%V7h#`^0FYxlK^aNdcgKWKd&u&_ctNGOcjq8A)pT<>bgTKc0um-Z$CB7QhnmQ;u77EbxZGe;w zAbzhN5F0B4d@%#WC3h9mxIRe-*uE4bU-U%XdUcWg><~y+*Ywf2p7|Kn;@g0@e_w#_ zt^?SXf!Kd35a-&V#>dg9VcP@Z@Hmv&N1*QJav&Lg3#o1fq$b{jxU)8cBw7dJ?{6Y? zYX?}hP6lEdu>*8$<1M6o>!QZAcR}+07!W^;!FKIj1I`<)Ajw)zehX1{^(L}O7SIjb zhHQm?Xl-%~zzwD%HUc}y21M)L;BuQyp6ZOUH^+g&YaPI^`VwH5?m_A@W}WL1dwHQ9 zz)!4EGZ=`gGeBbNj=GBm0TG#q)R|V48%R;MDhstXW(rXuw@`*AY~ zbw_?p{S5?(`(AimQbTuOfiF!*&~PllsxvL4kO?B#>=0Pf+y7WV_TXHPJV zy@s+|0Vpfq8`)P&AvLBmur*tP=?8mJ_g~*4J83*p4fle0^JRd93joQST-TN&bvPQS z=pLw>QWbRVb|TyFS)`hdL_ZRLM^@;xR~wYAdIe?W?xO56MH@8_DaTN>cDxuEe3As2 z8~hAe-hK^qr{(~g(-zoXY(r~DSvpgZQE0c{4y1m*2I4DSP`A?r(6xUX40<*L=cuVD zo1X!?ag^mmeGqs110eG~khETllw}=Amc9m%lMc>T@1v~t7NoL&K()H@04=Q`p7|wG zA>rUM<5dv%JAft!o&j<8RS0fiN4^7+wBkse9tyg06M=Y%-CE5~ z4_S)rg1)F$nM-`!W-xuV8_KR%0Lg(KV731=K>gN0e96UrZV`wVa;n^JjI1#TO#8#+ zx*iQf)_DQhIj;d!8x96-&7k|HE5N3~;L_Rbd&loh>mAV?mwJlvpbVq%VO8FPcZuJM)I0~FiH&OO} z8xXIc@#u9Q?5FJkHg-D@&!(f=5(Qi{ulKfsD!0Lzzy0|@bC7+?}ga_3g=uzWZ2_WuRf$-tfi~R!F(I(WL40p-(1+_My3bOhkAYM5g z+2}YBcWVUVlTA>TrU5AZHHd#d4!Z7K70Vle{bCNl`8a@=ZlkOtS5y$yd0a-_Z>hg| zMx>5@hqA#N0csuxNi(uas0_rOGf18N2~B>`1}W!IFg-sOh%FtEy)zoA=;u%)g2XwE z&_;QZ1hxhCU^jGnKGiW>8=q`>#_FpvSQ(J&!_ExZ(%;8!5FMx=3 z08=Id`^W?0eZF9|Ru9mLcH@N$0DXN?ZEFfr6a4^w^#%B-5{Q5Q4Jr2v5c29fU>dDQ zY7g6;4M)bcF$GL-YzM1Ej{eu*fy;JkvU(+?5?cb%t~auys({tB5R^5i86MOVO#88+ z)MY3e@i|EB9YDOW0p)h;-vHAvvWiUv-R$K+ z{K(ZfZ4gqEDg(6Q9RG0=%9?UxX;KnErbSOnMcJw_fDyE7Yb{KAK?V1CzxjxFYkC5`` z+`YynG@%tpZigZDB`0v%MU+_!kgycJtd{`JdbTzz9;w&gMp-%>Q&;8X$QC0geIMEL zKOpr7_o!buJKz2csZefDUsH+8*{*X61RwJpvacABT|%QeuqQzB7$82gqgtI}sCI(c z>_JFftB0~*7eLZgp-9E`N6LO2vV8XevcsDKgscUF-dr;+xsLj-1onDofNwhiv@VIh zo%k9}emEE;p4}k+wI}sQ16Ab~QnzLT`wJ&mu-I#DVEQ@dc(Dxt2`qb;12BIDYV2JA zrhS`$RV;^WG~2Di?jP-nl#sb*4Iq|>A$$5?V0C>9uqTJJE^S0oJP^7HNS*r<*cTQ+ zzHOAC`70=!9|W+gE)c1`P-bu-b)+L2?{yYp+@ngaEJRraZYN8+0kMpRVnH=zS8zky zxDYAr>p=WOb(ZY~_B*+eM!yL<4VS??oTq7YkG4IBlywYxq+bg5qqvv`(vH8+hV&HU z1J(#`2D-bPb-U@}r0oK*%md>0@}R5v84#@#(Z;k>K>Rcq{8rHJHuiwQ!)8DXphGp0 z^I)eLh@?xP`?52@w=A2Lh16I5z$N@$)Hp|NwB-)bc>q|YoJNh8ih;qp7NGli1j@qc zc}%2N^+A7t6E{&KbQ(bBo0NGXQWsVs^%FaD)*p2jCZSsADM*Dh1!(gGv<8T25ym4u1-!uIEu!jyA0SOk_VE zg>3z{z;2okaF#OP3_y*CQAjN%UAtodlb;2)vjnEeZeVXs26lg6WSa&6@$Ok$jqr9r zR1QS7s-FP#rJv|O0AgHz26UU}0%#SG9Q*-gQ)uw+)I{p5NVFyu2be-vw_|P4?W37% z5(w<3r441d$c6YbHxcVJ^Kq$5>@4$BHBvYWRc)p-KS z=I#PNJ=@q%#lC6=c))QxavQ1Tls>R4vJYN?EJrBwytQcj3oZ@aEMRlE8n;&jSWFl3 zdT+K-2X$Zk1lg~CBVB)hKWJlXP}$Ylw+HJ%w`BJVDXqPdQt2eqpSY9z4TEDps>^!{IS0Q>4A zq!!U#@M{b%bzVoxO!gxrWaW7vUh*=s16@cZzJ%6hXi#k@4c-N=g(wedyn%p;>*Y?U z@dK?{70%*w9M$O**VF=ZC7S~AIX(FHrNJ*_E@}*T7TFcF8+W)9|L`MfES&{JCQrS^ zy8*jw9qP{IvAOO9q$V5zzn{4`uJs2=iT+5f8v?reBf(%Q52Kk31WY!f>;j#q58ESK zA`DHw{5(=l`W8Rk18~;@NwKZ~1HS;5bZ$zQ27${cPL%|Iwi}AFPhJQ1@LQm3L4)`E z1EfBoEGs(#8^#)g9|6&@BC@l%KE}R?8uj`hJLnnEH5dw#k@Ha&OU|u00FAkWjpYvU z?m=WdvjAS~10lbm$xXR}R2%NPA6OvsSaNB?bK@m9YMkLtvX6e^_eYU!bC)t712&;H zKsib^egn!Tb7LO)6*#BRW|yG*yOS&Bh6jiq^U=l>c7HV$)@TIkW(@%L7FB%400y7( zoEL5e_CPjjOgID*7ngIn7lHNAacxh!+n*wp$k0o>Nbno_0cP_PKU4R|g0j*`xI-aZv?9iFu+;cQ)yi2gAHnMfT z2FWxYrkaGIp`1h@?sF(o5pQ(OVJKoY;~3 zV}Up}5S)F&kzM){8n=H3nV*YBwWK)!8cNzB2Oy1WE9?%iRUUyjlGe5cWjR61_5J{W z@n3;oo$W}u&H+1yKJev4q-KSHLC_t5?{|XaGOcaLbzpUfwkcbOtcTc*TnlEN%Hw#9 ztju<=wnSOeDrjiyEu@anQ2hEONKU6BrEu^*AxRn~Fi!{51vGti*MOu~d0^iT0(R|2 zFv#J?ylw!>DxL&(Zg=!3fU^8p5hTMI?K$-t`B5bk4uGGH^W`nh`!yRtcahHGwsD|4 z&l5&YDIiKw2S3aLLRS^-o@y{ken%v)YuUq z>C+Zo(`C3^ZFl}C*#{gArEHFK3-ZZzjcXh)Fr{{h(=4S=}a1Jxp?0dcZ6 zQfU=Xc4!A0w^Ea>N+7lO57gM!5{NkryEYsMy476CuXE8YdLLl-QGkUFz-7bFAP#4s zqVjj3YervXW)8~g^#IuM5$HPpjQMJx@e9WfNCOSMt;W;^Pb#m*H;9%+zj9t?Z&+ika{-)bpsMm zWBF#J623u=Jwwp_5{xd)qRge~KWFtt>OD4Ii>caefQ_XSbCSVAU&?ZOBP3|TDKLLC zNVY!&@id-_9&qdMqbvSnCcqH7QK#6!iHt&w;u-9#rI5g%!PaVw@ZDby2HR!=%;g|Y zVc<87ZiVR^R10|p*<0n%+UD!1yNvVY{Z0^L#|@Aa=U6u4G@HXIRn3aBGc-`sBxK*E z<^Q}rz)enue>ngilm>QwRg~T5v3W==QsO*)c_eDAt^?4SdvZuMq-N9Um_8LXW)4G> zJ*dCR<$!Gv2E;SrNPYM%xSS=cN<0wV_5mWBk%SzM;3Gx?gMLKW-53zRN&R(XP`f7^ z>O&7IW(7cd?zKm2BBdD!L>roxQZ$0jK4?6VTn5p&HK6KBe+1&C3&8I^dSv~m$z|+i zI)faY7NOnE4B%{_x1Px0{If5B%hf9=dzI&ux%77{bONGnD-ipTOAiI99UW2jV=vHI znj)nO1@PmpTZ{h27q!sPmmHK8>}mt9vc3-hn%9Lu?HC3c+7Mh)_W>NFl^TByWiPY@ z$q9yD=1v5cui3#`7LaH^2Y4$Ob*Drib&-xubT`P7-U%dYmLOY$9%#@+a0xjFk~Uoc z*3CiIME^OYAL{xILu!{V5J|5hdz@#mOzt?vsF$D>$bQK4YFTbsyXZ_LWFTv$!#tXL z?$`%y{EHs)TnDnBy$61iDb=g*0^vUctVSP2>JIHyMS2-ueu>nMYC!Ctgw!?$2TrA< z+Dr72T1SD^1_o;1Vk{$uHgPh;)`7HF2JSO|^a7W05)id%M#^!vzZrtMuNeRamO?6r>`i_G*2^)NbYDv`4-4dWHYXa7HI=YZ_6WH*( z$jXeDjCvMjCeFmU&5-ird~Wt4u>azw9#5vXx+B#(0sQV&2i=&_$Ue`b`A&{jqwOF$ zJ_;a*2Bi+C{6jaul^y`Mm~EK>;#E9KH|JD7X#lG;TxvJCb0#iAY753qV1d%#1&wd(5t%5?dd0;t-8~o)M60z ziw@|__naG_J%`jrZrhH!Ab!9A$>(&6iq8Q9%a2HDc(}MsF?uaWb|7ba9CcdxKC;KE zgG<6DWQBa!++gr)GTNv=4rRt9RD1J9)EIRH2uoj-9p|;3p0lYE&mY=VDC_eDz>Wlf ztE}-U!8B@vomv8{JoKfCG01DFhYt1$0?8)<$Zn+Wm(2iBHly9= zxpf@l$gJ`K*mM<$92(zU^#M|c0xYToAeRBt@3XVAUf0X61OCC^_*c6tYB<{dX6^&-Og34WL6X|4o!_JO<+G3d-uS+UM-i47E(9A2Kd5_8vYbRejVA(l=M|v$52kz8A(7qio&40O}G194($|Yj5Vo5s_2qf}t`v_~p{Gs2fDxyQXCl$-h*u7El`K>Ki- zHQ`Kb$E|H1*K}}aG^yk1xGep!1|)7lLtD-TlHK%1O2q>lrF%4@5s1aR0h=p>bMP&Y ze4mK2EgU!BYXIUMk>i{jnY@D7b|!Qtxd*wf&8e?aV!XYZqkSp({R}j$tZ;txKCByMqh6{A|!QeHC=?rz16}6~Is) z*n+u1cH_yb9YY6Q`XN=jCD_kR0#@c?pSJ>KVPv&-6-YiA59~S~v>#Fj?{jxVO*eIAUJfwSh9%h=qnr%-Jl7v~;sXt%NfdUXWx&-8}J@Vt727QGUqR@!)! z9b|R~k8?}N?;{R;EZcpv1Gp4Bff_#S<>2DTMs7p3?M8sbB=P5k$8KJ}i1W-x9DwWF zP-9RcYAkmFyw0^ScMQt<(>+?wL9qlP`+hdSXLLmFzmCQi)3UCg3~-I7#bP`;oZz8h z0ZrfM6ufmUwA+Gy&Inq#oRJV{9vN6}gE)B}K;^YSd^`*7-WUkF(6;~vae}OF2Sn}3 zkfmgOlznXg$vCd_k@Jy?n}oW5@C>nYB+5=OMjNUJ-9#GI30(W1wuRuoR{=QC9A%>z z5Yk2fB(4Nq1vdWja)7XlV6eUy%08hp`=|ndqbX__ISRAs?6jp`TG&8*knZK>cTskS zJI<$+K8_4>^gz_2TNX&BV>$v%j04H2t>}WOCrHwHXr1vT=pHdT-DodT>n{Ltq#K0n zMYqSoCO6Rp*{S>Omr*0S1?bjN3_mV|T^x#sv~_(b?w}t5t}X=Pb~Z@L)j;YbJ)U{{ zkX_am-~rI=KC~je?!^s7twgt3*dZVH?ZA! z2J7$!%GUV+^yDJB%kar;3i*o(HOxG{Z#s{%%pt(evx1cm%ajF3O=Mu}<)x6|(`F!< z+8)*1r9rolUSA`6f^TsnedQ-$%h1BTz7sX>^0*ZFBFajQMGbM6YT%soFt)UrzO8d2 zvU9n+_;IAuz6ZbI+=(NW0i5L;EK?ioE3)Uucc6{TNhqsB<7TdpR3aDlJ3J~hAl0s=W4tjz5g1@I?n*p^hHR$w-?oxZ$aZdxkDUe-(JZ;*>e=5#WH}oe}KW)Zz45| z)@L|h3i*;{osIz<;}L2@4yuKgL$(8ts-vs`!5qetoL3djp|zE?{Pj1WtQ$9$&%?oG zCzsl)@4;Xb2cXqCkQ}ax8v9~_UD^_<$iYZ$?*PPwA6SP`(E^Hx_h{c#I5YS4(yWc&{J0d|VTVZEpfm?^%>pdjSlVXpsHwD_|F0 zMcHT`gPL($v~&ZASc)3+C!_IS7>G(uLpGb$ro4w57ui~Mx~5}FA+?*{=47gFG0zK4 zs-VUZs;(JBB|md42XF#ETM13BD~^V=JhNvH0AdZ-`O0&swt;ccx7govc98t|3lPhG z0)ys^zr3*ysaZ8p)*=>ka~QWcOCg)l%N6%@)(^p6W-otXjj?>i3 zmj&V=bw8y)$~uk$aUe$~bS_xk;>Pl_1om(50m<==DCJYE;z6Rz(23@lXVPG_JmP?-%qM_oNbPhk^ zg?$Q=I2zFT79c8BL8>Q@Wd5A;6^^1t`9omUliNf*L%?h3Mb>y8b(`|Fye8a3J8^E* z*$q|TNTXWP1?+oxBNASBJK;9N7%jrukg*qg&4u7j4k+=~FWxP;bm3hbi?5JGic=5#zpscQ2qK9#fh zjRwem%u)5Jj?`P6CB3NDG*G00A`KL2phyEn8Yt30 zkp_x1P^5t(4HRjhNCQP0DAGWY2L3NKuvO=y(a7m?P}jsj%@9d07l!W=HIiI%|1G`2 z-{+RTr?&5z0FA7TRPiMRe!Hl3Op^UGZs|+=`)>93atSKT}ePWhOd1hrXC zXDcR$zfRVE*CJ5kNq1-u<0)$o0@~Ak9opR@n<27(4((PXb{A5PWWUlwlC>v*k|Os= zj=0d+%(ze^#L?gx>Z?A({nTeYfAxv)uLQn{R(;|tXpzTvJL0Ls?_RKe$t*C!(}3Sv z(@0Kjtq{BmZC(g%DZ#C#Q%qScszeC`Ou;I zYAIBRMv4itG!N9+3{pmhVQ5Z<$7A!^EoJO8xc0tNm<#)rddwPa|JBDDPEg){-^W_~ zao?0%`#m1FR=NJA$D`kzF8XVcv-xz@L}Ll5>H5VPB8%_np89c)ytu~XIqK0aix1QYy}5lOv99`rMo6+X6fcdNBVnR_L}n6dDnmc2Cv@Lx$A!89}N5v1m4;|87r~L;IjZphnq=hJ|*G z_7*$4pyRgZl(HCJ<<)Hf7op8e?RzNaAGFaPiiREltIuK(}}YZz*7R%@!#8gl78!AnqGmD*h_@+_s7cXO6Z!XU+(`t|RZYexR@ z*#8wF1gY;8q?nkLyCqLpS%~1RQKz|Kwh_N@sS%k7e zEFe!jY=!+w)V2y3JWuc>&_J;P_$3RC=1^@c?jJ3f$!~KnkmInr9NKT%qa`QP_H>vT zZ4&dcb{!uMZ8eaSG8XBYD9Y5{lL9pqBU5_|DO!|F?L%*Bs}5P|m2_H>+bEMV{e9T- z<8nFZx97+>-rty8=p)HNA4$&3-VuI*-IC{Q{T7Ztiy*g?nw4zPp!=e479rbbnP}R#> zq*T59>`mo%m3sLBWpX!IH%B=iWWPI#-u75mSjfTyTPPpT9o*3^)KF-==bXsvOsuyv zzo9*a-bC(zALqd28}Px*%i6E_aA+HVJX2c^Q0+`9q}Uld%&=yHLBcapW7EN-kWea$ zOHC*axUfFcDy=xSS-^L*3c7v#}x%%gHXsBC0qH|rVUH370-G@j#YunbO#(UT$X z!>02oD#oKM(IWe&OAi12?)^~PJK0cM^-uq+Nm59sT+2o-<5)>P?FrT%r&@O4lYVHc zTWF#rA2CO!dxCF&i*l@~rV_f7C^_Rpdr0UIzA2_5&Eg7-z^W%=05jo{`vhlC@NU+G z9T-NF)&DOic5K%d9!oMs)cc&0M0y|t#Tfvb;t3w^m8Cgl8NeooJw=wiM2smY%k!w| z$+UZXr>+yy^y~eX@=#T=Ns@d;m?&pLh?Hp#VUIn*O@(yk5XoUSc!H}T2e-Hp(N6nBBICqM1zbkIX^J`Dj~`(U`-0-4pyOC83l^4^h+XlgKA9kM1}Vu6v~n zft1&ukaAn(CrUZl$hKh?F2vt;rqDc8_Z#dj&YB=QIOJYMw4}mi+3W`b2lF129|9$QdlWZv|#T*@1!X%q?ei>3s z_PCN3dq#LdOqT6ZWcqH4obj|_bajC^ls$EyHEe4Fellcew2!T_geGS;*Cm?qFAbL3 zj^9s1aW`Fveo^}F#_9R_;E3lR7J<2kLeYnjF!5NB)$wVlgg>)|XgsFT2lxuM1+!d8lA5u3;P55bG@83Ax9iS|E!{b@+Q&5p! zUgQCXeCl%HkS|u-%7;@rEhEN8MrD-i?~6=;GIli@yYdvCLZ*qIz_siMl7a+YzheZ? z1lG_Huk&$_4k7#xm(uH9;k}o)|KVdREqpLZJ|xMRp5Tri&e3k6Jz!#C(}Y(t0-Ha4 z?O1dRuE{evoE1_}URKET@ExHL114iOb_X$eeuRsw48y?E(Nt`7{|ihuaPaCU1qTjM zr6a6&E@R?S_t^sWYHi$al#!o`%U;xAzMIHf8(?%Ihw4XblW@wB>{*^$ z`WagM(kJ)En|LtGC$fLwu~+*IppOv7*n2mA4h%j=7LL-nJ^Sk?`i&z|hIbWcU!R7< z<|JuQ&>keP_s!(PZ~x3_u`2p+Rab>6#MUjo?k@e7&gCTgt`N!ZsD6t{tjl<3$^F=1 zLoG2!ts!#zlJPMa!^z%MPgePCKo*-sWKk%cMlgSzCZKJNN^$m>JMXeg?VYGapz@+G(qQ$}w9>Wjhuc z4os&b>m4`Q09CT*^6BIX&l;N0>&n3$U*n`gm<^rnU@f^3RLI zexys1oNGg4|3KxLSMb|fn15au^X38JmHEpD4%ObqIF9lj96pQ#_88OFY(#RDl{gj`#(Sd!mXKqfgCy3xZLy>YS3F@-{4hB)=7kAIH;3 zGxtzu|K?tqe{TI%8Y9Afv71mtoU`>Xr5-G+$a#X(AlRL_&^|s}`LECp)tk{x$io^1 zW-tC3*vhh)E7;w<_RJI9jXlJ$G~1@`Wjb4gG)Tf;<|9^Z&D_1rC&X64{-sX}xR#m_ zgw$Q6H2TH4t1jQxT%aqMrXE;A_yG&|<@y1lea<;y`6aocB;T7EGidzC^R`g?ln{Sg zRk^Ei=6$2~jfz&I^R;vLNBn|tz=YtL_cgK0e5^sj@WYd&!QZWHnh*94#NPVr6b1Vd z(#pxSyhTw!8Z{&KAGK}gGoO5*!w|PvyGEyRmqApA$|&Xu{^>6CV&AQkV$O|osXL8m zt}wd-yk>kTcqM;Skk`_G$ZHouXp)R@9shR*o0gNCcKZrE>h727?t)J+(dXdfK?Th- zD$SAtGy&U87@I@2A5$JYD0pL^ig#*V%fL|1K<)mhW~rNQshcgu?3!2#uIMuq6&mpM zh$vrv4(c8VntM4=C_9rnI%Hl{+%e*F^6YVY{Y4r)OjxgH!l3+*|BM=vEk>}z_mB_@4BB@}(nBBwS< zaC(}Ob9v_Ss9TVS5j>WvJW3bf@w7nzuiSCSlj-c61!SrNB}(K+3$NXYu3~gBM(|I? z08PE~6yyy z!$%FVlsGCY;zTj?R=XjiY$d*RN*?`c`JSy`*!5N(y_BiV3d2s83=5p8{RT-K!#pk0 zi}`4*;VlN>hp4U9Ta4kOl6L*Q2M8(}Cx%M+MKAt`I{NoA#+Qqewbfb%YE1SlpE!rM z9Fpz;l$Aij9J$XV-!RKZ&GKpc!+@!=CZ{QYGRimOFKHlPzUjG)g71C4^OsKvmJ(AApDf4P$7r z=Ed}>zacAYm!bB?^Y$!Vrgj#R+|C`^6r@adGK|(2?ODc5?MP(l2|Bc|Ahk`S@ymwX zU6GEfxero3gqUXLV)ogd7cJD-)ohoI@y`Y*wg*K5#)9x{rnWkglonOWAn6VOQ6Lif z?Y~qQUsBRX8 zqw$e)j!HFyzC=~Y5%dKf&3z`6kn9(}M)m_Q!{G73f*~3@Uv_*T9!=ALf)sra+DMn= z5eQ|8K)rpB;je=lxr^)ngJzNNtR!F+0jmmV6tISXp#s(tFdVS(+0E3=lw^9r1 zTUi!&K*x;z6J+dD4;VE1ly}u+Ngr!vpi5fh6BfTcbcP~4*@*nlnGgK*=`&jjhawz~ zbN{cfCaqQBioAf7vI{;TwzyLGQC+SOM50=u7+#-`NoZE`O9xN6LB65uf}R{uYrI0 zOJk8o8!dIOxZXiJPCk<0x36_xZyhLOj@=zU1BxWd)8gS z+0F-jH96Wzab&TBLjFbILF?aQ^C7}yKEAh@gp|KXZcZ5ZLCCVa?NBWYf zzp0<8uc^=fCo9Lr7zNgV>jk)kc;dd+)j>^)bSrP#B8#|6Y5EKBwHAn{qqOiBB=6IE zZj(<-a-dR-E@mc;CB2pcXR`uyKhFD8I>{cLw@wSBA>-1es<%pcSAYe?dMuahBV}@; zYEa`VPbMoeau%OITBp0@P zz#Rd-1pS6uR;?so=V{{vtcfH)@&y0?+DW?%jS~T0p)e^+{>+M05_^(+^EJt zpAr9)%TB}$-oSw6#rC2hCo%y_XT)#*Jhpe6gUtJX_`S11&|m`QKtoP`J!UNPezP&)EwLsfk2uWE$n$O`>Qx0c9TuU7UFzZTzgJE9!`vv zWK#sy|Gb3vE%07LY00lMLW7oYr86}{)zO5*%lPHy8BuR^YP6AGPLhpmMAa4{~9 zt-aMuxKa(e$!qF~gyb|CC}7^&Rcf%JoY=!1C`DJYVnTI6zmC~%I$JZ!3quu|?!Hri z51gau$lRFwAYaKZ!#>$xGqrsDp!WXKpe{O#Trx0zkbm(6zYL3Ct}_n~`Odj=G{RUj zTXkvE=DfAc%vK4V@GL&F6^F-K!(CQ!zU}eYCq-zc>y+1!^hj8ch}80sAP(#!Q7Abk zq3gYM$^en+5w3(z`Kzw0eFme`sxef;Sx-(hqPtdHAhi}FAISlRqFZBtH5k~t?wZ0O z#?IgTSqw0)o{S7Qh0~rY6ERC2ux$`4qHwsapw2LVl`Wvg!O;ln+*pU0x9_Os@G}aQ z&sNJL3YRyZEc#j4j{+|vVyWnkK7|g9B$p9sJJK_oiK#!uJ{eQrCbxcK>JOCUahT~) zf^#}XQ7S3<-IJ>{NYX zd58e)8-h)SH9U`vs1q-@HpIuof)Su@f-kP+?aeecJPS)#a9wFT3C^c6U8B96Bfz=2 zxG%z%fbGx|+yOMA6)C2j5Vf7Rg&5I-I*4MSJyv3&l-GVZI%Bn`BdQ1|$5GnR*?`x% z#QRQh@~$X@wGy^rlP5i@wCxVP&=L|}{KB@>5tlRE+za_ZxlM3y&4f1%=8^-(H6zZU zDjx*@RlAezf88$QiQ+voZ(vW`1!7nR-4#;YWFO^|d|fb6(IW~fIojwPQw-cL3~}(2 zNKTk#hiZd{M;qHZus6d2ETtY)eG!ff8PEBn3H_%uleTx zxc#XG+kf`|y8Q=;(dF+yehvTsRR2>8w*Tz^aQlz#f(ahFEUW?M;V{^>>4P{Kz4Oq7 z2%a@;dkCkbYnG~#=U|Nkc2gf?Fd222j+}>$w$nx^d%Q%Y(-0vDUcXDIZ4U15&*qz_ zZvVX|gRggYrA_%eTaw?rc>M&tKTEq7kzam&N-|_%AEp%ULo>AxVP5e%N^%Dsf|=fK z(%|t*&1>~CN#)?hhwV9c9kpZbRJHfzM8{5M*M0Pz@MIqY3iR<-`u}bpaT%e$3yWC)TAGkjwz|HJw`!je&&t< zjlS1)yaf??3~}A?ABS4>({Cv2a2E8WOU`+;meQb8xI0#)6ug%k{v#^IqmrQGl``Ik zk?$(c!k}Ql`6?H;wnNI=SD^qnco?Q{c$$oz1$F=%YXk@gW*3J%-9>NF@CA?lxalaGBW)HbDM7gVs)g!jr%^O_3jJn}5%aP&0b z1tZ)v)5~oqIn%h5oLwQpOtQ)5_JLUFRso}Q}V6|^BlZ~CEmQrHm97m z2B4B@uTTAWyfe`hpTwB!W^mq}oTv^6yzD4`l+$ho@_1YHFAvv+=1^Xr?17K_WX2%{ zeTsLKW|x}8;jDrg5r@!FlS1O3FD!nBDLEbD`@|!Zh{#AbMQ-v~uh>W3e z!g3WD8Zr00u_3(7b`O%)1Xxo?q`$YTg{vIX2zibl$!k;r2SjtM<1&VIv8nZ-mK&JL;wx9Ml{b!2P}j`2M* z{fMja^Tb;|2iw5HqjIUPa?mJAl3xi8`k2VJO$tcNPb;>F@Fo^t% zs6&>rg9jXRJCTe3X)n;{>EFvME-fFg=;ZvoM*rKq^2@brT7F(N|BhF#Zt4A;DWF3r z3u?sYfXXUyQ}Ogo{GZhCJLu0<{&)4^7AURZ3IExU{at;^U)OtIg&Fz8R`qxFv0W># zjsNrZIR*XHS*J7AO&60e_ckkU%#F#f8Zf09pP13rK3S)kp1?ao+`$}q1veM5B3=@b zZ{@`cXIS_wxX%c{8DQ`xd?efnTO>j?t#yv}27HK!$ld`Z&}%jR;hIzXYuW&Dc5#o5 zvKaL9mx%RI2J0~%FT2<0M*2)zEM7hie)xsDI8Dtm=9suRvtf?i!vS!uf<^1@N8)ah zey3!BH=5`)Jp$>3+R69)CgQq~?>K!77I=HbU-HYw>mknI{met~OW3R2)lALy#W~ur zsf8$?)4|(DS+`a>`}Zp~-=Zy)EU5d~G@<)0xXkG&G#^~ZY-V9wbw`SE$ZrAn@K^~G zkJEq9#*G1**f}(KSSs1wpX+&5N#qvd%AH}1$}+gzbB|ym+D+mWyQpWHyd5T+SJ+l5ggYE^&w%b z{XU0z5MEr>?*6>sFkfOGN_v3kgS!H{;^=@;)~-eIoUR5*Z^pp}oAA@EO2NT=JeKz8 zKy?{eO$@nPW1yBEA{LUnXO*$3BUW9)Y7qfOSr667oeT~M7bRt#?R^|2@HWS{@G$@B zMg-17YFx=~zcXoKG?$ifE( zzV7lJWdAJOmBAGGwvpqqbautJfZ@wGd>lJN621w}eUFH5q0=qKTj<~`&!qQhj{L3e zOnRgEb~cr+W`cY@UcSg6Run#1jmIlQ5#ST6oE}c^*X*3;Bj2?|m$#NS<+L^M8}B&B zR}|A$%(0kH9Qp9MmaV+%0w6?!t9s=_tQc4S(!@R@Hq;`&pyP%<#w=$lX}~7%^`GOs zDR9pKZKR-mNZP6vxh-BshzrG)N->MWKhz|*HJEr~A=( zhIg5Q@y@oKxlIG3VycKogO~EIc|0FMID7^0 zJ@RNWcr6y%Xe~-ts-iY_-&-0xIIZ>zF#9@ani8CpS zeRvjqh?hrZ$$d`=4Z17jRqlt%aZ!^D({=jIJq%QBGeW)DSolvwb> zoo^4}%7bME7vy%v0T)YjUZh7VGyQ_P;8!dDc7#uA4)99W!OF$WGi z%uz~o9^PR-&vJY+=`NMW5AU_wjQRNm=A*x>((Cf$T`zK^&>lk&<}B|b0AF<(ILxQ= zq@I}93P#X6TwRwKjRp4e19*d-h5*~i6zS!qN!cw5l} z>RDcDTvW>@!5cu_rnjn2V z*pNVp#E~st4ySV_>=2rabw?`qU*kX@{>JK)pE8eb9Gh*@hbw|IzHl8o~;=~7| zoOUWfZlE^8z890I73W0NpspH6ZNi`m zQAM!fabr0)iW zB0SH~odpE+-KuZq0>Hk3F=Qn9=m*#`S{sDaIF>oJ$%1)n z-DBfE0&mrzaqrd?Nlot%^_wa>qsQ48;)Ig6%tvcxr4VW#Jq- zW-+Vk@UXHCF(%V`SeS&^+-dvk=z`O>Dz;41di=hIIww|@nD`~3^^|jD$AOAV z8xb07N`B~P4HqrfP`A9t2JdmptS7tO{-nqiArm{es9jCeu2{gHVIK2asFN$_=E@M3ytRUz+#o+urPW4 zjr*l z&InZHNhvXozJYLBRmBU}Q$Ii8>5{(Q6K%Lz_X$ahKb91I(}oGtg9BSHU7TZ_8axtn zWk21+55a`rwbG0mOznWtdwN9MgeAkR0nd--B2^>tPR{Qo- zPAj5s-i6l;(Vv3dOGJt2o@fAl#FB!jc|C=6)O5nWK+$FYJYgsjk zb!*iz8Ixh_Ns-`FP^8!1`Wunfz%&*V=__&EffuWal3(wtc}&))y1+g17$(lfbW@F8 z&12R#UTg9!a-Q$epysSz2t)R;5`+tcX5SU4@Vx2 zyRj+dKE80nk311@`DN1nx6J=3Wqwa7(?6xG z%u~vIpC~)3j!ky6j`0TNAtFs~biYHvIdBhW1m+Djhqp zn&2?L4cZ<+mjP;I+*3ZnvzL*_nh0f^L_$^Nb@xiRMVyX1;!Xo_t7pY~aA-uigz&X@ z_zoyx;3h>2d2A)vH@?$|o~CucU9&#r%p)|`0B<<@%m{}X=rjf=V0N=Bvv4ZF2bfN6 za}=;DMwM?tdOx%jH-7{8a?=?8gfD-lHSxcCP3do}&68*`uc;$LlKR7i1?P8iR1ba1 zeds?q3d6pI^MUs!P5L6tk#HToPgOr66UvOz=~I#gZLD=HDp>RGy~Mm-&-3?1vhd)A zQ*(CCY%Wg?!iL@vWb8{TzYe$A%wKfUxDo8p+SR;p6&<+t$Mp+>W*Fsf8LrA!4&WH# z;#oWYIx;KjGD1wy;fD)f_o&=9#WGjh6jy$t%^CAVn>aRV+=we`a~6m^BWms{sOgnQ za)>IF9Ylvw2|-Ipa#9uOfGQC0VmO$?@~_eVRe$qOY*T*2G>((msQiSPzp=M!p{$6` zc&GRg<$zcc=oW2P(^ydTRnr|wm1hF}18cRN>s`I#{`ahvI#>UqZzWWt>-rZ5U#!|b zumB^BpJ*iPwH*I-(rc1sTYb}EpN?LBjyr6Dc z!mhiwkc8Qd({hbZE!z8kX1_l~^y0tJNWnFnXVb^Pv`h+7eCI|F`tzPgr3a!%?34CzDBv<5+Xa3 zGF{oInuDuu98e|4w9oJZr)$s(7A#EzSUW}L2u@uX5^dQOu|#mImXwJ#f@i`SE|N^8 zKL)@($b@6K=Lj}~{&`bOW9_Qmh2U-HBg(fRQ^jhS8&qD5`J`Sh{-(t1oqk@yt$~7CKJ0!@5;yM&;1I4f7mRVmlO!0A z6^s$APHHF^2a~Zg31Z=;1oIlDvlwvPG$yR!Eth!#uT@urS42fZ-;rM9u1@`7Nc)0&9tpIWrG%*@6{tRBo5ZvEbOwZ>`Hjpu z-wI8qsC*rvw-G$wxBHxW+^ZpGN@NJw5cZ2Y{14r6ZvIUWbWe zto7`!Hr5yHE+1=Wf_Q=^1Puu)5R}1Bn(9;Qp$e2f70PqhM`AP*ndWoc=UqK;5rCp@ zY7sITmsu@}R*N`duEr>mkJ^7t(5LJ|p8t470)dgBEI}!PK)hF`PyLD%7yMl7FlcCo zJki2)>X4trkke7XGeNA{lS(gGiR5WH_<{3hT!N_YNmPS^G^FFSIH{k%A96_cX_uja zjZDf3*9yGi@li*NKTK#a{OQaz&XOK5N;+KVl94(OFDtJg4DXu3`cAD4ZMk%apd%eP z3u!&l_Iv%U!{Z$?N6nNR9crsCyWN8*@@VT5-vNEa`3vBK2=8wM}J7AcXT(nenb}2A;O$;$6DM1S5ReZk`J5g zk2>mS^ZhG*${p~w-;?yS*HRrRX8}<`pE8T(u25@?-DR}a@YK zIV#=svmXhCTmiJZI$1lBV@rbi1i_-?cYy?tYUD9V<$Vi0&@D!-T_e<@>tuTgrxlPI zNm?FFY(pNZXp7Tdd2}KGuP!*ucvZ3QwcJJNU6FWu0`fevjo!)KAK_agSZhk`jmIVi zZCz$9u|FPA?qFw;6P`^yY^w_q&^U!FHdUCg{Oh2Cs?~ikydZ}at0pYy;P|PERPnoAH|)Ro-pTOMrz`?TF!nC6f1z8DJU?Ua0=w4|*F=~!3qY?fw5BP7 z*mlx{-x9*9(qTK7x7KEi5bMm^gKNy>d_kZ4E@xXFEV0CJjtd$Ly?H;;jdQ@~5_bNw zQi9gIUg{ldIOOtPV2oA0A2E$YM`;1L`jvr@i)y11IeDl)>_A*XJDOvm?ofwwPAbM| z(F05aSCT$u83;Mz&lA)lD2=hVmV|0&ldw1j)8dT9#}Hzfx?Vy>;OY{06=`+WV=^C5 zwnqOy_TB|Ps_I(&Pe?)%UMDEQs3@@p#bPyxkAxs(Ufs|8zIsai#9F%TpX6arKMZ3V5>J&qRCHoPqJ|E|5ynM?vIdTnoi z_g_CUIgfqzW9_xqT6?{=Ou1ma1H!W?Bp}SddPD>l>qp|Xe<7Qj$ExX>MpOX|!y@ntPmFf>}l0$HVziPwG9)9e+CkD7WSAu=75;fCw=QJS6 zsdp780^$3;O_0@z97`2nv{-z=b%wEZUOOs%lzol;9qFRl;e%M)`eEE@J7;6iepapR zcwvhAhrCDDb$`waehQ$cQx8yrHIcXlj`MjUit#}g!QOsZE!MQHlRLjNFXT25MVEUb z#zd{YWmBvrRhDlZne*yJ47FAsOA4&)X!A49?%v4z(F6Uh`7a2lL_U8VjY;%R2crji z-8Md4-S7$$=z(tGQ#tgG5}vAU;eOEr-NX6O0|k+}$?HuG$tflVEIG-uT%?g?$k33a z&!f}1CeM!^=o3CGdY~vgD0<+ia7pw)zi?05jg0Wd$NVjMqDSZ6PNG-S*62Q-!exn4=W&_fGo~C1L4}`;uKCHWJ55^WH`Iz}+YB#9`vL>*nayg#3L zt6sN4tGz>Zdh9h(m21_@o`a-)R{hU-t1oPG5e`T9vPoFWd*h7I&1#s+O^78rUORkV z%F2v~ma3m419+B8Rwx+;c#1N9n;HrGgguG3tMKqGR|)f~K=%-g&0ZSwEg$wu;%KUK zKb*8J@eVaKu;-eESV|oB(Cmb4t>noK=1F+XoKPxH#@ z%`zTp`XimDJ6^ie;VD{!o4||&x^Kqee7IK-?HhchF_Sq_SDqs}AmhQ;4d0ar{H zaAp~%hQ#73siBu?8vNCOI7cc0FtZZxA-lS-wW(!;Dsfu?j{DD+KF(fh<~OA$&Y3^K zp#AJHWsgI6d1u_A8L3`PMjRK9rdfI$b2P={7kT7CP2z6|Tj{DW8i)-?*YAmbIMA9; zDrnMYIGEUb_f1GwBz2WQ031lIqO*y0!ByYt8^%?7CyFI`RpE@fNwsSoR)uy7y0feT z^z#d3hNdCIx2gfn0s_xcgbvf&rbE9%zZa~$v#ch3R>r3_YP|kbT6DjyKlEEq`u@6)>u`ytu9Kqmmw5c%dTx9ICb zSUh#9j~Jf}%N-)9&`owlW}+K!>pIcGi&(CmCb|dBc7}f`PXzt~FEMpx)Slf@`=z&c ztz8&p*V-Q*-?jGDJULwLIQ^Dqg}oj4n74mcW(#g$4)lh(aIo|?b~pe`ceNtjQK}m1 zR0a8@PkE1ha#g1vwkl`dJWmTRu^Mh=sRW|4MbRNPS6{>RMaFI3Z~sR2uCjHp>i;HJ zX790x^{i~vM|%6BNpP!rCcuPh;@KpFnWe5p)C`e^M|h#^O@1r|KtgL_p3o<|NJOTF zlm{;~{$Sf7GMFgZeiDmScK{Z)kj@NCB_yy4a3nVJSMSCpkFE~2MZHr`ntMqOm6*@p zs2gr8aklZi^S%M7op9SL*+ky$Kd>CsK-%K57Qat34(nH1SzXQ z9P+FuVD8N9jO;`&tq2iViN;~0eu;~^n0R00hO|}35>`z1_oIj^w&o9(;?~MdT7713 z#|oYps%yxYvLEqX=9F!#PEVPhkzP(W=iZjt#V@*Dj2vgJgpqP8sumr-4!eUeya(1L z$BHm7q|5X-axz_^voP<|1%N-HD4mth=1=81u}FU_cY7?)M6VfIhK>Ingp&De2P65YtNXDZ?jpNahArEKlS2l?jJ4)(*eN8hp#{ z%-rMu_8D|#_<#TXe**&KE|=4CYlbxiViVdV`*J8rd)NMsZoqKQj4@ zY31#5b*ol>$sW4qa8ch~>}vDgsnc}8@rPnbw<(U^Me5MDv|-PQU&v;P)K!eK>hIDQ zlf(TGUfXo0tBq>#ASjfSKzQQuGH2WEuMD+`23c>ZVJBCK93A7e_PF4W_PAK4ehfuR z$T`fY2e(n~5C7qmi-#0n%N7|$;WE*|E>mBpaPrGEM4-=Lry<=H-EL@EEClzQq;$?K z)U%@bh|ONEYLN%o->?;J)8^it2{sx$kp@G`5jr~15ci%xey;>`vCX~Bqy4+Q*+Yy! z97mV*zNLbbQhLXPu$Q+AQ5;X5 zncw1@3J|h<_Abw=cP&r!&)Fg$%<0FFQ1gr*jz`*F`IntEMc6Vs;&C>1cvlo z8tQQhb03|(5vlBD9@njubW_|2a@wvLAx{=tL! zfD52iuk)U0v;PM52y4M0+D46NJ3#0OU)2cxR*P>Ja1~_M29CFA<1M;0kTy1|)gnK| zC*>#0`Qq4*{~}+1vB-QekZJ&5tC}-Pz&ERio=Oj;x3+I8D#bnm%tC;<3t-MB{IgC( zzIVg<-k$sA0j~)+L&6{i1%FRp!(OZ50TDRtZ;615VhzK2Wpx-gN$G#`+6>g71t(@D z{3S%J)4UD)kwjyWt(c!g2Fr^1b~v!i7tjv`^oem)ZhDQtNj->`N$ROBDC82=Yp#3A|3}0qKHM3$Lc4r%xfcXV_#04bX~08U>@S5+eQ@Lc5~2LNyaEob|9+GbS=X6 zmTHW-=YUkpRrfE-yiY73bI0-(5|$Z)%5PKqA(zI6v{+E>Xap|Kx>?MD0+3I&=`{IB zvM`e@MX0PLxR0>~m#s;BuwLCDYV+AkA@SO}74`>h-(tPjHb!ZCi`bJ-lz!kfNR`V5 zf+wPB*1h^~?vg)}x4OZ^BwPoA3B0&z^0P=29{*ZdBdje;tHdj5rYPTOizb zl!mku%s+^LJ2>OyR7v|8*Hv5-@zu@Bz9urtWING56V}QiX6R^FjwR9CdKH38;lU^> z2wf&V`kCn7oLk*>NB;E*1x{AoboTL1s`8J-TGJ;FCug8zAMpj5u1+6z!8uO()IMm- zKpdS28BghN3oU?jTPu5TN{5H#ZB&DKS%z3;_%?-D>e>OKMXf?v<&Kdh-Kzehgo*t% zRoU8q6z;qy81wD&#(b%|eV0ditWw4gKH1};EH)eA(>-<*gk_Ll4y%Y6XTW`zTMb{L z3Za)W;l0p>BnHTX*z6q{1*v!|6~86>Tqz$-Tx!+JK}(olt@;Pu3z0p`AX!!&NSi_N`OuFwX6a6R-K zxc`n7W7s`zY+~Kl%tbm{eWENX02dGKQic6>u|1A`0edO-g_PJAa9Rgq%)TbkkDY0j zltBpbCrdA>f0#Vjx++Wh`(CTv$7zX zC=XvQm~yfFoG(8W@^hp7Xh)VJvFSs0g-<5h3?lrsmPtI7N&FKRExx5{ z#)tLlr(en>vHy74Sf<>Ww@!9I!xMvsIAIYCq*gO~I3;OnC8UcT1n>s#t@6iXtvt$J z7fpC@Wn(zZn^phca)G~D{RS>Pb;A(^B{-a-qe+--)!!`dXP2WCnZuR64dvLp=C%*T zU1M~&9I!=0jRSvgJx|<>VWO+Bdw3<`M`$tYM?DI?)y5W`foHjT5vj&CwuF{Tx|n4n znG&)1EmzYuaW1k+GiLA)$DQR^&_tR>-vn#W%_UFpEW0}W(Rm#onbOX;-bMzr*B80g z5L>c8jboqCcc#Z^W=xCwPZARCSZU}mBJwu1Fx_V*oT+TIbXoVxX~4x5-5c8Rky|>m ze}mDe%{>`i9Ln;8*XL)6`whc88$xG`J#ff^JQC*!B?;gmzimWgG`k;pRNuB~M#?WIRJL ztiU9LZUe!9d}YI#OpY4ZVXJD@cA@*qgtNF3nwBAZiVP`!uuP2zZ^Ci@$AViLZqq24PJSuRjR7-yV07f#_pPF<#MYhn)RiXt{dS%Ge%I-UwN0JV_s7ao zDN~%h`E$1OO#|O(L6=3eS6$DZnYro6;Q#iqtd^^z2RxDCA6P}GK=|ZhKH<24PG<$& zb(qEm&={%qllP=eV(r^Aglput7t}+i3KHoQwfckr3`^m%8aW|Aa`jdpaWq>ebUvb+ zw0@+dtA1p+z}J31Wbf<{Q(*?)if)pf?@~_uA#%ac6qR5Rga|1YG;dYoMKy7KW4F`K z9g%ZuUfu9(BIEE4815&(qbJ(3&L3MStRFw-(;`=UE3(7C=4~Z!yYaTU<8AJp-6@kl zC)X3*nBpoGsWLKvBR+*`RA`OqsL&eO#8zi+Vu|6HwVqFN=At4e4jxAzvUO{X5MhLb zT10n}cVl*b%r_OWHicMgNqVY^*p&HJ{eK9CR-%d!M_c4X5kHU#Hcvi81YN>8o+1yl zs8h8_N8LssSg1zw0AjpQEV<>j@BWx?enwnJh!ww(m9Ads=d9;Yix3mZ7}x|(7-4pa z0QGNY$Y`ZzQHlV1^(USP$8+*zBpv5F-n~VC)FhN9<^wI8EL4x_^1g-kl>2pW7$iFn z@g)@3b4NMcTuHi4g{P2k68n!r2K7EPItp|tZLBBv;e)-tAK zi7It^XL5;^gB;1zRAK;~5F_-7x`mRDY9SCEQI-`RX%bB7DUWxa@+GPXdZe>Ufn@@X z>!4$3Wg9`gC235YqD+*8D!q4pwb z@Dwz9i&E((^j=TS$C!b#Q=2j*tUGGS@~x4zHqj-kUUn~f{W?LTvj$66@I*j6<_ zFFn_aBU$xle2k2eZkPH^Xp_zpkQs|RT}yasGUWBqGjuabK|@49M)a$Y&cY=p(N%|T zl&YWR%8h1QpDky=*_!`2;pWj#kuyN1t7G5n95`}CsXsoGb0*&0Yy3{hgJ6x_?XPS*+;zQ_pC zs|p9#S`VW;73Re_^NzYi#N|zzhq99uhoMsKCse8i!I6pXkC8f|MINUu?WGIxY^+m}46UPDS; z^$dD=Z%!*Z`#@}glocg@HL1EeP1AOtHAh=hoXwkF6^BAi%fvx!p`G1vry# z1!kYbD*Sm#8;b#n4&AiGW3MGN*B8G&8}))!f30D5mTa%i)3jg&vcevh6jX}LqFMP4 z5kvn2c?j0HLyHro+4AnDCBgXlPxAbYGssk94C?j_oMi5AHjkq3) zx*;b)lt{{MjV3C?UyddU!o6jQHM~t5-uPEw!`dd#F&a|)lU4bwz)FAZCK;^*0rk^- zm=y-$5%^YP`o*36@9dfc1XzgwQkeLFJ8R{bR8*biuN4iU`7)k2jp_iQx|Ryk->#xG z$~q5wVa6MxcRSB0J6{>NlmG@!|!!w+&t-?xdm-m(0D|sz>vr zM>rmDd@eN&IoZ89&b>g=HLs9z&4pyV*M-~Ni+ANh$jcjCB<@3E706)&`n_9Xy?e3R zy^w%PUCT1}Vu^e4W4YLuXEj_*O;AoqCFkb33unYQYvEZeCF2h;qGE1M_+mpG-$Vxq zakT0;=?nVP>RvqKUOeGm{L;O6z`gjPTu40hEBoD<>617Px~$Q_ghxgb-NV;;hP)6y zfxZ)X!p|4vr;q%Y=-MCYuO~3L;$ZEn#2@IYM=M~pcm?sbF{pgZEK8C%x#y8^Yt%mcdAG+a#{Usj}1Y+`cL{%R&Ey3C*@MCZ# zrxCB(nH$V$Qa?Y@ZOBS~cf>{3!e4_eR{d?XAfxhI^%uF*>US?jxfkcU7i>w*TtVs0 z1(e5JAhPJGZ}{0h12jS8s4CVdo%f@PG(}L~K{)G7@9xoy)ro^%62mz~42Zc<6>G)o zJ*?<{V4t{vdZnuuTlFKj2hLXgk6cW-$Gs?aU-jaG`LXJ6cVEqri+$a#hFsl4!6tyl$%x^QSNJAenmH01(tfiysW>^vw;PLre6 z9R`O?oaC&7KzNf>_q_b*h~(9B^*deH4C*pdeFImWrur=KU!H+3jmJ>kW(Oc)ew|A zZoxJR;+X`M&wJiy=pL0W5n?BpW(eLR>`h$0!e10Q_*`vG%xCb1!WJj)?SNhfdLBHd z13mwW;F2cmqLn@-t@VMyZdE7lJD4)axGLJzW-WN4o$}D_=>9w_`jFfhXYQAWQ)iCQ z^CfC=mpU^eU^Jl;XDLC3!Sa(qL-OdY43CC|%B!BNx5OrfBX^Fh)uR5!G&&Gg-(#C( zvb`gWRnq{98?O=(gqGPyUZWz|l3_na)R7)3IOI0lPZiqU)E|1ewt(7YWF{ zQxqmn3ZAchC{$Qz)lM}Pd9-f!ZlYddl+Mti%!W3*8Fn0#fP9Ys@F-1>xzxGlnuHcN zsgt4phRrwWZ4FMW$h~eW*|d^T_emXwcIdXs$VO+9^K?n+_+55hCMrtor$lz3W%_*b z^|(5Zm(gyN3cFNS?3bR3^H!#UqEk7Fks$1_jakROi|&1gF2@Mq7oB579T{Mxp9wx^3td7(vEnk*c(Z5;`pjq zD^vkV{L~n@VDj9?(b>lAHli#%8ihf_WGzYPd=EQa`=8#-5+_ZkvHv0J1>-Vfw&TQN z`~(AHYQ~cclbcrCSvddfyVzPNmTjy4ety|;J}AQ3EMbv4t4p8gzCKoc6Yml``Qhsv zZ-$q;0gHri&n7B*t)r0IC;%52t0uO1c!?x_2~Ux4jc~39t-B!Kz*Qy)yCM=ym(kCF zienMmsB+*)2@KC>DKQDb%07A$zQdx(oCN3o&`GEVl7eiqhfdroGHT)yt9~7KGSDkL zLt4p?voA-cojvn~N`qF_kHAwo2AymK{$02ctTV4kmfG|4Hph=x0Mf-Ga zD}gW0{}DUJA+#5yCSMxyRK|7F-o!!j-iqVMMZ>c2Hum7)B+jDs5iVE%U0~{|+c!Ca zc3b=`wT_i}SQe}t7#YGMzMsv%8_J<$I5sf_%N)=yQ!k6GQ!A@2o;TopU6d^%tN3!U zy+c5K%cQ)J;$`ZWQdq35w0KSA1aHOo?8q^7-{|&bITTGW#k6iWc^eBTQWhEOt?*|@ zs_SNv%W61Da?(Yd4w8^K@9hz~RY8Hom-Pb3d&WExd`ZmYQC-Cq_(?>L5#lbiL^q=@ zKbGDsmCoXVrEZ5Q>={>-RgLSZk7~aIE-`M@n+#^sHUWtYMh4X}pg+L7c+&<&p^|0l zuUh#ZT4qmbN|s7(rPL;*aFVG_aswoJyA$0ZANjWF6%p$hyF}-wF)(xJRi%iYD4`6! z`hjjKlV1G;15!SPj6$qZAa*538{R@>;T=vMOZy!OU-H-bIM`z!5%lC=df<$FQbYvo z_wYx;vcp-Bs{+O_!jX`^HgUT#`jfb49Ud7YL6C5z*XB?n^41a`Lk7c*q1c$E5I(i= z;K5XMc6Bz82asENgFe>_Ng9mopOB1}GA9AZl*kbkY~BKuCx(yn^HV6fBtgJPFMWUx zud|Y{RoZhV4kpF!TkL}NAV)nvh+trN5)xv8u4S_@y7r^dZTtT*`8 z4E03+;&Ipnx#Wn^{RL%Q&jh$8o@G0kRo3Hf`C~PNdG7%B0%*Huxh!=(BjTq5BNM^V zZ||OaRdg1oC0|C&&rXh-afQBn-)BxetU=W&C0~COiBbezElEeZ<3Du<#LvE<>#50t zC7V&m`y@x%-L&kn+xNWcIl0|lOX865Nm0ocqI8e)?nB{(SFSKs$j4$x$KoWJe)8({ zb1{|3b4??q|3W7XT1`jKx#uPC$?b5%c-|GdxXCIhq7X%?iocwnb&Py2 z_C6W#fJaYrK_?|0@Tub|n>GQ z2W7ZCtyl9{gkoI#Mi=8+hs$Lrf$N_UnDHs-+2M-n^-R`FdK^u3v+4u-37+>?%aeTt z;VDKt^Q7o@?%X8`oEpZE@0$Kb>Yj*mmG1g2^hB$8Cf!e|`RbUzfzu{^-~Du0T_Qb= zpYZ5VlIz_9Aad@0Z|wR<%yx0Uj+)t^qO{7G@Nc->k1^2Ca-7Nc zExu7yAglL00WQ!y&uMACfoei;F?{zM;UHga)vBlxam|QLxgRQEPXWYS_0mxT(l~vH z`5vLA%a~)C+J>*Qq)jGegzlHrg;`qQaO#||qSR^9DCg_(p2{{rJJC9USb-GT_fKdp zXSj<1s5dsXXze&jf`4lAEg8ER=~hW_EFnTKp$p0Of`kZk26IeDOp7VlSIW6dPX1F`-NL>+LB!xEJNf#2tKhJd$X zD#?0I$N1rBdRf=uqnP;cZJAT`HI{Kij$!*1T5Wm3Dq|Y6lNY7s5{(_*MST*R;torr zC+^xZEZ}cOb_x74V@5}J>5)+BodS-|Qb@?I#c}oDIS^e^{;B__X+L4QlJDK|*-yKX5u|Ycu;t`|WkcOCDNrRa$?Q6`m-#!(ueyamOdX zzS!)yKyx<+nO6hBhqoMjcuS38PiB_Xd9p^&LK&ggXxa;3s~8%K#7Tun(NqQXlns-R^Gl){83~cdO!M#i-&M!ft zn{tr?qN$>pC&kCHW9(Jp&spuS+ICxBuxi~cy}hz^U$3UgR%4(C{lJhd{+#t3oG^sL z9h(|+do0KnA22oyk@x+zEqKi(b3Q|l166Ie6yVIcpqrlvI3~my5|}wyd^-i;C5~rj zkuzDT;!}bG^ftWJI2p0E+8K4)M4g0RlI9LAxXGf{Z-Ak9K)QEZ~zG7^f{U+ zolU9YHeP=c#5?NOmG2)y_K}MUDz7NAF1UjJZ6tb5y>Tl1r`DOg9KrU|Lp(Rr^-K(D zAA<)@H1=M-8gWkDB(`sH1yvQYtufK(M$52CXs!@49f6J++G>!{VDs|vE-%@}{)9)v zp2HI~ET_>hY0j5^l;AT-I6^zPf68S40SP1X{&_8N=w_t$@IV7|v3$eLMcw8E!E60T zWCjJPKMEhxbyREX5Llq|8lWmjAIe2Ape#EU z+QL)vv(yTNNj$BB{;1|ix!$-x+W~f|4Ejnf$>?`5!Ow8wO)E>)Z)nCuaPHGZG#$D} z92Gf*iPO1I;N)s8dZy$+kq!;PD5pxgsam&CM>0oM5fIu$!C!a7{EZ)Pzv`#IT@k3RQK(%OV#$tCW33 znW$h{ANKmpc3!2OWQFH(8owM(@ONY^$!GoXaop&Il-MDy&ds?jf_uie+@#W9voH_5 zj?;$DkW%h6;va%LtndTDI>KnoZLx8^uaq!5;_uQU^2V( za&K%_k-zpBqQ+tthMlcNd>Xz`oNnvijr7z}!EI`_ab#G=7NboqdI=g)|3-Ki^3gLV zcTx_~TTuipmU1GjFH=+5?<5N);mzEOsMOmSD)&}Ic3Smki7^BHv3J2^dTt4!<+e>n zb?hXnqeIz}5p#BjlRQOxGfruCwKkB94Qf4`+~ji~z2^V7-)P+LlzDi1*&;NLGr$2y zGvjOAt5a5NmwZ(XkF)y`OtKn&uJ`$~x((axk3A(gLwT9%p#7Dap#6~SlE?%S2=8;}a_WHU}qr3}#vyAtWW@%hDH%qm&BSdTW>q8r=pj045Ir9xM-ezeYXOCwzQrO;GrV8CCS7PVjP{8w zazihK3hDHeYxxr%>$j2JF%OE5^)JV0AM3Luy(gA^gf_AcwTCC7%oW=sx6pf<;ig<} z)Xmx>fJzy~j6saTd>EI4jO9{EfG7h`k7XnuB&SQZ-@%=nvnypU6hG&5>c|*ZX}b58 zj7xf-yzkJDKNR7+0~#aKUv1ZOAY(>FhDOJT6o?AOYfazM6{wEJtMrt^#)Glinqce~ zf)zR_D>jlK_)d&`gE~jZ4GziTT|_)I4#|S=nGVVS+w1c4YF}0aMAhU#yG-(*J;my7 z65!Z*-}^c-b;H(ZRU4_$?*q4iAs+5{I{4-NOB&Bw20v5%eMeN&Gg_TjD3q&9SiW#68Z9 zjgl-epBqANu_HxL{CTp`s*1Q0FrKkc_dlPYl}x9y`xf`WQz5fL)t9KBA)Y1td~RG| zTGZ__%{au-D%(I6(p$hLF&DwR7E5XI`jtL;-sGmYd@3lBm5?)R&7H`-J{>T$gpX8^nULoE;U3al9`)Z1 zn>GSp=u}O(RrD>{O+7~!PL+?u9kcs(na7LCyTfX|L8kB`y<}ll0?22mf&hf$7&|t5 zQF|?cW-Q@Tiv{QeBMfFfd9wp;m&}>Q4dWHslDN#&bGfPKSn5eWLA|GPpZv?`Me6>~ z*Q04UvYJc97wh@R+jL`^il=R9P;zX=lOrTv@VgWgfPe8=A)PwTp9vHSDp{_;!mSPw zZBbtl8vG75YiUmsnlPJNRVfmQ6Np`nHSBtS^clg)tnihrkgXq!-F>SJcH8%BEEXi+ z4Pt>Nc5|xugW(2^k2Yv*x}we$vH7bY+YWkNSE31ii*%P<3`greg+%?X-NIYcFU1-l z#~^9c+ohhBH6$Ucp=rWH`GDQ# zY0MfiG18ZZIh`I_D_f)cLUYdwmx}n&%y)6miigP5kix@$-+1JYeL3{$ z;#d5Yi*x3VW&*avC*-Yqt)S<+dCz4nfU|6}R=nNY)4n>}@^11(U+*3+@eqjv!d4Bgw2dgR=1Z19GJd%;Bhjw63rM~uKUd3-mUgP;YN-6^0IZ|6 z+_N5rvLb61pc0z0B5MX$62P+}YZ_OAOe?Z#xY|z}E3!(t+O4muxq6eUVVkv1V}(R# zCnTHw3Q4G+SkG16zRF0k^lQc6nF<$eB%G>lUzPJFYkJ3<@A0O6`|+FiygZMXH!2YY z2jK1|bpSuhslr}|4(J&J^Cp40JlI<@`^!A)NlwP-&JvDC+*`l_M|(N$AORvLkFqz- zTUSTVk_B>A&6Ov*vwQdyzU&qrz;AB2h+l%9o}xT8^+@*Mw;-9zZ=qI0f0WkiA5GEz zck55v1vBzeK|(z?x~qw3-``V(>sY89Cs0mC&`AEUro_9EhG_|h8KAeT6}T}(s$~0|OJu&~?$43c`kY;u6`zLQ?VCd0{IxH1 zoG$jkFj4Mni_CP{)}JE25a{=44RZ_`p*Ch(WS*rooBL$W+MKLL()gkW-hu+W+(RTa zD=mn^49&4;_`1kZ-UUbb$TKY|Q@hIx&98hDHWsXuQv-{b5+mbu>x%=DC%i6 z)1zOI*N&EC5sU9p#2wM4JS0N5F&=DGSXHV#sX)5N7s|u&vodX^|qG!&*#Xvkca71G_YxiCP-LRu@EFa`xutAa7DHSkF4sL0D} zM0e z(WBr9I^R`VP3G!`ta{neaxS0fB4IPp#93}+MYdtPlV#(KSWsvp4iIb+tJbS?sM~CA z+f<;*pb@p#O6^XO-?jon(sUo9JO9r$ya*iTMYRZ><%fAO5#dx)&>m7%9PNPHjn&VX z;m*AP+klLxF&pUjLo0K>qx^mrIaMFEB03U5X&j#&yTQ-32rEv|+7FiJ_>S#7)SPuD zyS}vP8x`F&LE?YBsGG(I*S7PrI$7)EGHo~0JmoW2z$|vW4pG^tu5K}4X5z0}si^^1w`nbLAV9aAJW!b~(hDj_2!r zjS({!BbA*H@kP5pPe~g2mb^47wqZZ0nS3o$8uhKvv zv;U>>g&sN1ZPJrTx+f+WU0fk0Wn)Jw=KX!lj*J>*18KHliT|d_4t{CX|AKpQwyW32 z{zzVa^eQ`^mA=%_51dtC#ALhMjJhVn86}_Y81FM&>FDh*oaG6{|HacXcW$pTLzwI4 z7G=*pUA%PI_T^nm|JgDpIYD&XX3ZzXI}rjZ=9AYG5)PMo3Zb$xb}a zlr&rxb*QX?Ff7lvc6zM7c z1*s-qPIDw_JyB>qkyX_iDdv;o`9zjiKj~g{_0h?(JUm6$v)Lr^Z6rNAbreV)t2^o_ zu%75vwaRK3C@UqNm*dnU@iNpy0zHQ!m1|05^ea3H#rmr)s2n;}d}ebOto)U1Wr!uB z0LEqhRU$NUhi6E`1EOoS>6SMNkro)Rr1vjA?J=#<;T1g-C#do;|r{zt&%Jm zF?BmAEDq|3P);@{RI)Qr9%LjYT&U*rz^p&$OK71Q@|-NXZOlaS`Yzv|-SyiE>2IIW z-|iB=dAbh(7Bk6sx&`dN%f85C{}H#;WQp-4ea7)5UH=p#Af=^UA(mWk(0)RY#uFV` z7(P#AvqifHiNRNog8^tJ6NTBUkMcV=^^ zulty5nyJhtMUfO5)`X9*bFItt$|&DEuD$b?$zwJ;re_Dn4ZJK$mH{5YsiL< z&D~HwLvrfm?$tF%ob4%r?>98vj(?swe$4^N&DS3cDn!W-gV9?)s(YOWInA-Ld~lT* zIK%irMGxbtWoCl$HOnc3NBL`45nu9RA&glPmE^3#cR#P4TL(xKcVwz`SdrevLaenS zaC>J(AdAYX-wuqm8hC|V%*w8gAR;!Ane|dRhEq?z+N-y|+k}J~ucEvMvmJR%(-=ej z*l^W2XEi_r)rZ)hG{?VGM%b$QiNQvEu8iwdb@Cc-YM##Tr_HC0@wJK9l&tp7!PFMgl%*3@xzO*5^IinQT* zUmaPuc63p<98xM*=U^_ z0D&j{y}dp#WOE>Aoo`69&u;DTq)dn>Wmo)`KDhr4Ya)@eSc`GX!q2Q-caWE~9?4;W zd7{syl0~vRgpGD{Sn+CK&MINW9C_Jei0-~yo%G*tJ;@Qcuu#y06CcHiK?}f|tEzK0 zfiBTCezzgMboP|)Sq7fVkW*?vkAS`1LrPow{U9Ndc)Jc5)+7>`dDZF64bRoh!=6*u zz!?_#?fSAs!W!tnV5zy(Yu{bAm?uHrd|%#(;S3(FMuNH8y6fBre=fR_ z5biG1Tsn5Q&N(1d1c|7xKX#9Po+|#!NumTYpCsGp#uRps>^u?^5l+)^`Lq`fOr|@| zZK8$2Zn>SHWo_zDDC;pViCCsqZ|>2+6lin;V1_FvF#+LBN0+ zr@$Y5uA6FMZ%xZkBHdmEc9@Uw;3IeBC$)F-$F`@oiUsrt+tP5o+(9s%-hQ8;mgo={ z>Jd2DBM72V2r{NYAy_2XqY7|V)8|=e7nZH+DZRJogf+gyVGXF1fi=qq3f3HoTj=&& zRMNZG`^shrD$ZLYSpRX8mN9>sm!F77Ez4vsalH~e!j#rAmoK_=c>r-=7}{q*C3y9^ z!~wSI(kFimzi7yXt2@{Z|J_xP70Z#4!X{k=Nxz3%tCf801W{y`k^11}sX=@GQXu(! zg~pQ0S5p;X&nc9G<>(3~+$?m=Gf`Tm77m@*4C~O%s3oAy7Xq1e8 zOP_>(3ymOnKd;|ZHd$4z;XJkPcMPHv88&s>y~ETR-IofVp`xr9yZ3e6<4A|c%g^Am zqED6>r*$_-P20k7i}mVZQ&}2Z(ro%aXp~K)qY4rSeLj_rQ z$*~B8tEP&7@NPkt-Fq8PIaT59X6gL86dr6B&d6ujfAA`xz*+N&>W4-hWYLbZ;s=2#4+N*He9~+K7$;X!U8y z`zj9%5+(E1%wHZ%okde!L{UAjQm@^6ywnAzSn3O~(3ZS&xd#Oe4t5e?4Q`R^B3?X{ zHnbqt>xce$uXQUH<5!}VJgmFWH*QsVs>zTP_SvI}+Pu}QW92U8>nA)oje0=#j zCMMpCjJ<>ACiVK0jygDf!W+Czoq8o2b71vTW)%#hVVr2ZZw>NJ?TbdLZ0^Lsxe zl^Tf)nTzl&dlk7BvOQK&0e=Hp1k+_d?p<0(XzWv@+b>0CiN1rnGoe#Cz$D*OD^P`q z)oBK9(KGz^H3e#^Jc&)N(dm08SE%pn5}a-h>0RqBtH=(T6QN_1r!jfZf!jrnJ3-zQ+uX{f)4;j7zqBmcOeYKSo2V9Z|{ zj1jLDn^@$J`3v+p!`L!fs>R@kAn8}U-mMa1jABPK(Z+Zuj=O(7rcl&R)lw>%g{&*2 zsmA4EhXVXlv^BeHTMIsQTWlgh^kGfJRK+|bCinD;dD#Ct;`-WbvknYT_QpH~22Hx& z+oKD3XFlV)(o+b5O>|7Nf`jDf-F9O0mr3N>RHQzyz#rypbJg9+OEh4Q;5!?2v8M$-vs%8|- z=?;B+5zg`H7#Ad@f)!GlrQZBC^+(rKICH`YJ%m>HV;%IS@z`MeqU;67dE^x2FHQLF zL5}fh4QlDUy*W30vc~`m$Cvuk1oVw}pC*tG4r%jf(8osSwl^1qdwA?_C_Hnq&$Kre zW!&}}wi%zD+zR#;k*~BjcMD(TAs>&Y@~H6mKy9~RPAd%*GPj2|(CV`<`p~oGZ89l^ z&+yo23j?{Kc%YzaZMZPC+EcZ8=G)2s9wK0qMNj3ka9%hqi4~=rhtyZ?&Dr5HDlRY; z-_yD0t3CF_54XHcKfq!P)4?IIWA;bb%tb5!6>&NLRJ87p$?x(&qVR(8-tT@#5PDSy z`V~6JT=?3REOg_TVxpFIPXp@LjQ(+tu*tlNJF@hmW80_lA;~Tq` zWlQxA{<9a?f>Mxukl#clszJX3DP@O;aI{+;m9F$OQ)z@#pU@TLdToEM4uYiQ2K62$ zBWD?WyfVyzy~sMA_AIzqp)kJkaBoa(On5KQpId3dY~J%8(o3Y1;N$ckDn8wDoHu8O zU*^$+@z~RP1#LXNT6NB)y+QkRH39Ql$ex6k?d~9l?cErt9aj_&VZ*qytiVpNwqySI zfCb*Fa8>S{3*=A1+;IWBSD9u6NLHNl@fz!@)>~DCTW*eoy4b<0US7M%$1dQQKzt%+ zdUOjQIQPeh5nbKSQ}x`;cjc!$neM-x>?i5=rI|o&a6u8{gj!=hxk~&x5PZWJc0uwQ znXa^!`v}pX3pSfu=r&jph-C|q!+kuqAK)Se^}@DO2*J#(yDKeB+maAue$hg z;s=tuaBNkuBzI0v`BPwh>pngrCi;~SCLw$C_;{~@?9;=2J+>#eGJDR6{Dm3i&Mo#< z4ZX9-TlMwaxjlSUYrOW`Udy{0y?Jz1zp58!uJ@4EO@d)0ja0Qsh`ah@N_S)Z7U zB(8q<^R%paSm1w#hsX?FX+P6o5W2=sKTFZcaA@B)_>iS8M&w?L&msnr))EAKwZA&4glK@1Gp1dH*;#M5|~)9Vo-28XmE! zsS|Ypw==B1F?r*U&C_am@_?@pLvT+#)fWlV;V*aplVE5+!N|G*Py@#H-7J9Y0HD7lWLK94a>f^ga&Wb&<-`+C%|0Ap z@jQ7_&x-~twUN7A+ip6+_pVnu;QJd<5Poj(bytKxhNg3M3;t&O=d3b2Tl)!N^X#FY z_-j{-E$n%b-yL3bXBi0=Ja`VBe|aNIgslmv+#xd7R~lir(g?dv$PN$;WXlrrBo=&p zIVqvb4)}y}@rk*nZ1fuiS=0?B!kPXOwlZVL<296xxBX>l3%a)%8p$E4cV~9X(7b@A zkJ7Wuf}Q#w7~;^!bXkW$iqM@|BT{`x{@*0Bz4Sy6gKlZrULMdB>78`ybLo-n-SmKu zq(@tn1D(tsNq79wBw=uyCB8@mdJ*6|6EqiD{z-pbxp_OZSRME+XkRsX@-02pZn?Dm zlat-Vg^M%5cF2R+j3tliie^oYoTHZLiY87Li~Xs7u*6@rALE<7 zMfAM=lkci;rYlB2A~N4K&1%|zf0R%mva-5F*U2`tLv^U1SDEMH7wF2!>G7!(O*>kw z?9f+qygvx_W`Oc>#x5ao@eg%Z664KZBby*?PZJl8QW-HSuq(heT>W;VPGL$D>QPfy z4XNEK)PqjN>OQ%!FRw6G2fK%sr~Ntp8Wa|&!i3(Ji^w5TKSIn4Mz3e&Vv&cnWPF5f zeTV61O-Dc1qUI6dsipc4LW}q-@+t>GOCS{-4JWr<__hEJGlbX8%`~-LF6;{{w4@Q# zsb9tw=>0o;7e?a4dT|1iCrU3wd{GafEh^WwBAm?NM%zUl!;9u{40PN55H_S$x_Biy zWNs`qSx^7;nN;2yCDS@nS9j|EP3uq{U8)$h`2qptw0F9b--QUo5-!jqpTr-1N{)-; zlo`Y`eP#~D`kG?LNwMER0o`I!*9lS%$B!(^6`FEKNx68Ja>Y`P7$hl|ZOZkKauR2h zSzm7{C;keQ+n3bc>n7#S&n$Py-o@Dia-21b5(~OX^GpJiZ z3)m`Xza6maQxgShfvUAuy$%Mz;@hwUz=iOytG|Z}JCfB2xIF_^uUZYO1hzMZ?5ESP z-RQ!0_Lekk=cI})?lNGz5!g;o0NbgLcY-a}B45XMV*~bD`a4Yen}+bSxq+&8tcK}8 zI5hup-ERZwi5ZG?2h#d%Goal}E$`0DsD#Ih$^eiRp+ezzjj^wg3EgC|Mify z|Hn3W%#oR?;+wh4z)ykI^KSyH7F4*M*ZzYY-wk)xzHast);^$_>=FPrq~IhdZ9b%a z1LfgVExEk~8PDZ9xuP>M~kp;9LI8 zz&Eg8pkw_UBw4Rz2n>ZkqdXJeNuuc7ueAID(^yJXngM-}3#wi$RbRz`5a<_(9dIHTT5 zsn_9ggG{|=NWBm3KcwE3fA8q<*A826ru_Iao&NBR?pg4xc<}))Tn@Q|Yc-zg5g&0t zq~`^x;%lipiRJS+>NQ$d2J?}EgG29KT`vgC~jXo?d$``42ucO)h-FZ4!?4abAyRf<#6Q)%pj7L@|w#AU8X@_h6)FkUfjNP7Pg( zXw@OO@`-`9sH3YBSTzB z{!LwhdCh?Eu)l|+ftN*JKo_$udb=ooIN#!7rZQL?Ae`ZxzIO;5XBG@g1#>pAV(k~% zBZ^^1jCMmEwcb#(n?{Ft1(uzp4+&{Hx`iT?+#gdK4J~``oV}z^AqQm6TKrdL4w3Sn zRMST^;K6jX>}C^5c@>UuD8frb9x9cc;^0qd*zN)?4%sdu zf+xpQV6W3k2HtCZgJUZcCxedlApvhCPGUJ6@j?;?v`srECODb2c2+Lx)NoJr)c27T z;{Ea^Yvoopc~i50$`;FBVx0C1i0t!^#Q4lGptg?ud;HK)%9-uWx zMt8@|(wKaFqvl61dRE@FJtn!KhxryzWM zzz&Hkl2zZ+Eh2$Hm=}_xs4*K$o;`^I^l}#nq3d{)i%{)YOadF!0KA4g(K-DJtcC~W zedS22UX=26{!3tK^@XlFW_0A_UaO_qNh5O5u(%25ePseo{O9vsGL36swddo zv>@kJQM#X0AstjrqU5sMw8dzHT0*7CO8G_{joQQ4rfYstmT5-K;c=eE?q#_IlRUR) zduo-vPd18n3w!h?!4_n?u-H)U)V7myV>@Y9$79P={pF{x{PdEae0~&{w zBgeM_gKq(7L1%oM$qa*U&im8!`%d_F5d|vm=oKlfyd&4bTSV@1?<};(^l}hxOl~H| zc?er~Fs}O^2jjjdSR@#Cl3W;!t7#vT`#(pyhuAND9Ln7Tkv#r$B5|O?8sEVUc?s+RtMM^1X20a-de(^=Q%y^I^gTjQfCZ!3!8#WIAt9&;8hDgdcaqI>oW|P z33p@y@o~z`7Rhl$;u7BkMP@_KZax_Iqg{u!{hssR)w#45#B<9S3HSQ#hs#=}DAGxv zps?gN$wu}xsVl^f+2lr;(#yWRz#giWeVZ7~yUX@co_x2`$}-)`#s$H$iQ41qZryG$ zcAZ3{Ovh4pXITZ-x^j``Fu%Q^4L)l1gR)ZZD_blT;ain9fq&+#KA#O1L+(BjSS;=g ziy{My2Uz8w2P~5JecrIBo^;7&9S#zh4!2=Cl*~kk8Wkr&?X~F;x$8G#)WcgMX#Y}l zVj+94xa?1p-2o(myVTSCej!5@2E>G@*c3-`&}v48rTkQi%z6VLt8x#d|_!*94$*F69f zqO(c~wv-cI)TMH7&ni_D^u>kZKvjbyFLX*M!Qnv4ugH`l{$ z?zWz$srvO&^}e6#riiE;sos@q8=uWL^o8C6wNzKoqbzmPP_q6v5s+$g(9c6Z0P7~JbP-~TMw-s%m0kY_)ihL(o?ce_46)CNI49=_S5~cjpW@aYVHxs!iL)DH;#$_2(dg zZ&Ck=R}xy-!McnmMRpcWyaq-y_;T)gPil>~>iR|D=~#=uug|?}Z1_HX0(e3DItggm z7{qaN8Z-~H!{kPghrbAqz6DYVDM}YpnyYF;`4`J0)cwA_!bKoe+CIS)s2{)!_$PF2g5by&g8(6rsqd=7OM-U+fdryv|}8D)@(c1P)5m=jta^!4f7@$W&&fNNo5Q z{U?v+tr6POLE^8R()=jSN*h%(`)p=>vHJUbxhP&!3~iG8Z{ybSygG4?{7#Ts@x)f6 z<$@UOY5tghu*%ji%lNRXC;GXpjOw^$69(A+|uj;Mj$@6WP#hfCDF9}~_sYt})lL2})D z>|6cOzjR9uR9|(Thx@6kxwL1@QkU_!rFxb`QADADch8p(qH}S`BcH(64yMAV2Wl^5 zpUI)OIh%~}TNE4Fj$$KQ6dSHLvg{nIcC#nS;7@;IAcjgyIPKx6^eUb^{OJiU)tVoH zeTF}M2lB5TmwVw)zt9&Be}a_^){s!^mhxWs)AN)*V*Yf$RDFeM3jQ=og>>!kC$GNf z#GhXHVh4YEZHVDdRaB5TiXV}!XM}`7K~g2R!*5}5E|ZF-nbh2mU{X`1#O%E=snJrR zAxqF9K54Hejq%VjO%HItLsh8Wr)HQGT%`+>T2RF~w$W@V@Y>fe3dT>kW7@%#@S62r zWwaZG9 zrv_@LWGN4~LE&7Iz{jwoo0e#HG{lp7J`jBtz0VtSf6wbumAIGA(34aX{g_roU#x~( z!Q14d#)iH0NOL3!mt~FEla_YjMw<1&jRd}YFWg8oDB(tJ9o$H}I;xVtrRb$V&Yn^S zI8UD{-Naubh1VmA+j--7f{63pvCd*RRu;qIocF|uMV$A#6m*?IlQ`JD=O za!!%LrR0#nYme?=^~dKXHlYj_-D=%c!ZP->=U0a>0uN3EKn!>Ot{U@ZGeh&7xPG~;?%zD;({PwiE-QFWqz=K! zvh66!+{>D@=<_O}Xo#{zVeJ*JW4~wB=R;Q18K@<_Y+%coY_I*ePQU86pEeQQ(OE^L z!X5Tps<`KGm}IOADbY1nPA&@j=8X(pIA&+~{COiU9>d>rBs#Z(N`m$aasYzJIU)uM z(s_}4z&eC-!MYwGoS4E5e?;P?6cP#Q$mm>=>22wW{z7sjP@VqFhtGGMIAbtey{XBi zx#>zW!L%x~r?#S}P!mLamLuHXU8ZTUj=VP#KEbtz3iy{I;NPQjC>SBXzO0T$JwjUL z;GeXlj~lSHP#X;F*#&`U%R3pezR3C1jPThQ%-J8RohsxmJV-q%2J@UX;p5#$J=Fc? zk?`0$z#W+)3!SqgJHRPQ0v&Y^1nqmuL~uYjm@GdN@rg$k_s2~q1#H#wq$2H4BP$(- zDuB0ki70NMkZP{FPir2myOP?=>^>9AKW|Nw3^pTcjOsS~UwgH7k-w&wwIX~8CL(;@ z-50dgd-cKY3gGCWhUJV=v^w_h7IVd7&^RdT2QoEjfmOdimd4R2IlcCSqMz~Fzme@d z;tLDn%d#N$|Jp2wzlc6h7KGPX5F?xgakgx`rfCl*s>L5duL`{iSQWx*^gg^){TR7K z)`R30hGmMlfrz+O1#u;d&W50WQ_}hC4`AaIG1OZxh|nVS1jXRhiw<1~v#NYct?2J$ z5%`4JjjGXVhZSEIMsI2;FeYoUmB;<_b1T<9@$zm|#Y&^l8nI(v46 z7&f!Z)oHRtaUR%H%(G&i;lqeMno=rXN^l!_&tE&GjZIydS~`bEInA82ZJzW{|7D(} z7s93OzUQkWWD3jxqkzwzwBQi*X9NNu2lwM_;Sp`h89|oJtOMxd-v$5UCsbUc<64k? zH-9{@7gx?n_^$do98o`x*;9~Uyh%sM?J2FMOVZYcJ4GW?#C5@GzJ`I6N{FCf(r2iI*UL6=+W9w z{v^AOYO&|~yZE;qArwEk*x~HpX7?>Q649Ayp{RkVms&LRp)DHN$1 zgA)5vE{JXuUr+lbHXf=F&16E-3DTnzy?6zC$kkxoE!$LY)daqf#QAs&4^HZgIYzVh zEzBed*^Wl<=#>?z(tQ@y;LKzEwKtZsZY^~K$_;&dh7)%`KIo-+G1FxK1mes*w5)RRuA7=DZlLww}1VOn5yBd_>nLVk|P#VxEX~ z#;E>Q^F$<3?qoNmrSDX6Y8(DO9QIVNOY^;!#HfHLQkw5!M&*3aSg)I4CyQu?izk8pi*m_VNPC6a;ftBT-0<_F;U4nuxLeaLc>isu!$y4PT1J zPZmgvnsgJmE_)Rj@;I+O!C4{0c_iaGvVnN3TCI4#d}2=+oP0nM;mT6lsQ$=qJJBMz zrFB^-wb5;>zhHZ-oL)9D0ywL!dhtsJ?2)em@tm2p^X@Rqtqe_^3TZ#NYKFeR z3>|Hp+1&{_DMuQX1agoay;;Hdpl)VX*qVzC!_oNaq*2u!;VYe*Hhy@+nn=Xzk4XXx zf_gkf3rOV{^PsNslo7R9PW)K4Hx}?${(tO!3w#vS_5W^?B@YO@L4!dBBdi(?N+4Jh z5_Biog<06xAR_oi(G&|z;dVNk1H}Ipdms*2HbF9Dg?% z^Gci)AmfHL7=tq)bQKI)_&3O@4`5*=LBxVZP%NvUMupt)GfE8BMAkm3q#wQN-+s+n z?hoC8M`&;s+ZKnInQE^PW`lY~PtXOgfavYU<=yLs6+PudZ2z8Q=)yv-l;i^9b%ceB zS}b5UZ`fj-$iaL-@j524cpV&CVKov6L$;xZK&|UrC58!Y4(tdoz{*fqk|K=6aHlB4 zoqi2;OJ4|*ux(Yk6schft`Uk!O^D<9+#2i;CA90yJAoWdK1H9AAm4uvkjklRz(bt< z9uZ4W5O}nlB##WmpF#1R%)3wq(EwTaFD3*(dn70-_kj zongUe1JmR~jIGlt*z2DnZ@8No7*;gEPsF?74PRHwv&e9PX`(0g-2*w?%GA&Lntv()M-{53mT0 zhNBhhY3Dk4B353>J1T<5cL2Vm%Gbjp=YgAP2x?%jEh9tTtN$J6Bs@u#O{@_eXdL`$ zQ~2BxhB_*oe?igs0@FAYJ%y){e4L(;Uy^$NOZA>~V`bl@Q+MksU?w@3Xc5(h2Kf91 z$2}AwCS5sv7(Blb+j~^su(>DU^>>FC=W-yiDI_GqwPFKrL7TMGF$}Z*l{`<-nXur%vME>L4#<|xi;8m= zFD)#m<@0I0_`0#4h=MepXKWHt#Y{}Z2e0I9(n3@~yTzcfJh=>FXaQA(jhXTYmY9|! zU&yL1&*r6Tawq`6booULr%l?!gm_!wvT4G(Es9|oGL}X@1gQ!;UtuqNkhK&$L6EP8 z?BeCOFz0CZkHV@IdDne6`3kVN>+yDr$%Kl~3_CdqMx2R(50gj2;jSY))%7 zoa3{kNl8+wCsX`g3iK-gjK(*|2E;~3l@Hi}{^jIafe8zskYhtO+5wMPdtud;Bx>77 zI_`&qPc8&n#h=LU;Byu)!Cmns7~!B%r;&TX7PinQ_oJSY`#>TRHgRSSi5~D#;m@^V z#wsFF@0{J3fg%{6wc@XXtJY)J= z0Fse78i-o}_d)4%%mZoDUDwQ6s6IV#uxaIb)$SPZ0YiwWauR1dyOT4d@oQ! z@+03|`7+q_ROB-;57DVF5+%MLSVu=aTs$Q zEcNADbL}L^@eo^a0G@D>Uv>*xc=qbP-tciKoFMdvsDWTBYUH_W zl2Ba^SJ!0BD?_M2yq_Wz6&vh0xggc*!Fxq?YdJJ&G#2r2JC)WTHzT+XpLD~YQobDn(|_7P=sMWEI`FHHzM zB{|kYF2~-dC6P!4y;Q_rvX4f*ITUXd`c^gWCMVJ(+J)Ix$KpJVeUN++EUTF9^a`^> zDR0wS3`tE9G|7&D@XHhkPhKW9$|JxVq@D0WOp)IMNfQ?>!o(x#tfMey1~K!lVcU!; z!IDCrMZ(7F1BmE^eX8;-Oj8?ntrB;o$js9FWazjX0t$li-h}UXOnC@Rt2nf9Mc?Tk z+KY}+&O>LQi$(Xt>X?RvJd`S$aoF1Uc_KgKYG^%Mq+%^eBV>e@lkn7<*z8!Em83yv zbISU92Fv1S+?16he})^ZVKFFy3Qa}Cbk*i^5Pl`Be4|o6u!@%htN6XY3a*|;jEpBz ztGu)V-+`<7v*6!uSWW-PtN}d8bR~LX1I>mv*=%DD2?A)Z(UlHB%eR5{I~L_>?oW}g zL(;<&6a*b0u*~Rh+;!AA$9w9|AMU1GZ@F=ud@feS9+3yqZ^vPcc@Aucf#X}XpZFSL zb=70dcIUxlWzDwQxCec;P*}R1Y)9E%;&+SaXF4GZFVDE0Xg&BXz)rH=aX=00M9u{~ ziF=qVS89Z_PIIHxY&gwbjHI+^k$gU`Dua+Skp>!J83CG@ z0(R{0f+H!M1BkJM4C^x#o?JLNMYxim0gcw{N(WQP_LAcspGO@iE<$`Vr#dCbq${~g7M zLx?!&vA=f;{Y@^$ymG@Q1zyX%WI#oq^uvMn_B7OXz$PUb+$j|tB@>&}H`mbQlc$qm z2>qWaUjj+QeGUL+CaD^e?G7w4E6Z{UGPtmV%p-p#_-5Q^NMgp3bhHQUqb1uFz(;+~ z>&63gU-cd#d62mA=NnJXbc^}?4Xu#T{eZPwrl-@yh2vx^=B|94gfR>~bTOil2wMY- z<$rDXy^UI)Dr|CCVnWthzX8U-u;El@PBk0{P*+m5>W@J_g=<=;WBmP zE}<><-}`wMYwJ@&~>3`P@W?VN3CrDYAvsL%4hEWAYj5V^wh(m1Gdi~7kA-b{=En*f2Z#V!B>2zdJX={<2dW(PEnDqQuLR4oiSN9$bq<_l5 z*+H1rDM0aQiw3DA_ROP#01CQ#6}sEal)A#tZ9s$vy$`Oz993+6F>J zvLK2DXYkU1E_4Q~n1PDV?SOe9jSskWr7dMc=9;~PUDYx0##Z1ZY+`|9$1YiexeX4Y z04=wj7qONaAz(s>ItKC1ds27_Z!kgN4Tw11tZI|17KPDXSS)cYJMY9soA- zS)@j*=Tp`jvcZsY%j_@+siAq$ANe9&%)YRBG|PiS`E8Q4!5N|Vs-1Dh_1XDtaJfj8 z=YXcbh6+nLomUeioD)f4uu)^IaeyW*@1)4p5Dc)Ghx?6E5jhvj^N{2C3XyI}a=Mcq z;|^ycIZH87!%FD>L50oNd1fWEY&w%30Y>dt5JJ+jT|Dfjo)+4X!Vx2YtyVJO;3u2( z536`1LJm&M4)s$d%Pyc}8ug`R)FCSxNNy;5Efkvu5jp2#5*#lqyuZ{U%`iZowNnTH z(;Hf@=$O5aO={;>X-(B%3OY;mA^X`RlT4>xy?iHFa!XOseaVbGxtkdqw@OLSS_NZ@ z-jJxzfW!Ml$TnnKSC`qO6q~q6c?e7RM23)aDF|pNG4jJBnp80E<`GexE`0>$2GbmI z-%_kali3qNyT%1OKQhGeC9VR^~|1pV+8f0Pxsq4-9=@M;v7*0~cANrML8 zL^F>^e>*)5sbjC}I3o*|U8il3bxPQ5oH=I%MN)1kzmJ+9vX19p#6z{f1OuV1Yx7-x znh}cA@F{p1j}c#jq3|D&R#7-2`tpv&aNBh1MnBz0!|N^HWw1>yeUoCR9`?3!y$;ep zwZn5kMy-FEs~xVW(4SWg#_0{d7VW(sZfu>83XByTeWVnBWXCboPYdgIw9Ple3~ z`XD=?5>L2#XfPT%fps--F-NU3a(!DtTv1;#)fco3a-hYk zF{C_@P3puA^ae1_gfBbC`+K5xqo`wr-hSY0q}@~45U6Wy0cRu8T1yiiMmYN@@H`{X zo$jA^bay9p(ppJ~d|OGVM2Eue60Sm%D5}jB@&HDgXF{IYEbF06gG$lxK`=PeCV^uA zT^;SW`-zCcu1>qcgD8Yd9N6{}wV>^LSnud0nOrFfF z*IBeGjCD3e1RP4lCmYn(lX<8bpQC&@;MsNPv|abE#`L6CId&KVUk<4NIkaMv$1Gda zgaUfQWOkM$dNN<43IKt*M1B^b$kI04a`lEqT2?Y%eK^DN*$p<0F^Nw|hE4tf` zwZjPft;6f6^K7+_RQVOuflgs7v{KLKN|JNsi7Flv-USP&(Q8vUY^v8>A$dzCMTi3td@_EO#D7dXgG#&MNwp6*Z+7 z76{p3$Odas1AQ$lLJ>$lvtiY?42h4ej&_|r4QIWi;55bW+?#Q)wd*LRQWG!D0@}|{ zaV$zgup81GfDSO#K1yZ;H~1t@{d6> zZ4F&=*4EMG{Ix`T-Dj_@qRSa;AD~OWwGO)I)-J~dPA6+paD@~ne~U$aaf!jLr?VHx zPK>-SXyIR+mEy{RrV(~N#VQl#tkk{gVWn(L*@1ZsKb0d3r8Ie{l}t9UU!Dc?z#~#$ z`9Y|~5iyi_BebIZ*x_N4LDD@UpGBwiIQc9a`B-2P2}+6lFrGjz^PZF9?GM_scn{2L z(smG~{3gfVtN8a@710g#X5NfvSXYpm)|dc3$DXTlTdnW6+VUY7`*lt5#4jts6DdTh z#N2um-yFZs1JFWsQRw(Qn2r@22}qnX-$v31`7w5B&@1Ft0&h*X4 zl7Tu;~+ODonu$%;1aRJzrH=ZowJ0#`?YxSt<&-Ec+nG8k)KN z7Z@CC+L6!*$&k@&fc4Fm901t@%Y{Y8H5=ChxPnty+8GE$%ilx`qSBT9&E}*cQ+C4R zew+LPLeMe*-}cUk z=&uT|m3H9>_6$$vfcpRdsa1L(@mP^W?XRPD;)Vxs8(2F~l*W#kZ3y-RJ|n#i@D=*N zHzF8(*?#b4dcoIE1s?{@oe=3{Jmt&u9r+npq5&D9pWN_c1u9|RQ|A~h0Mkf=cRKDc z@^C+Z2L-S`^;Z;j(vx{U>o8ht^^EJN%1v6A6^-=sd5bf5k& zSvmfW$+b2~ci+cE8MfOBbsO=>ejX<^_$eL#{swFQHeSqp1<%mjoOSXiFusH~a}%Q> zu8)9vI18AyS?k)w?ua&TaGBJXC_OqLo#RcDh(hK$io48a7fvQIV`GbQ*6KLS2i2;b zC0{u4xaZA*=)0IDx4 zg~N)_i5B-An8FbJ?kgZI{d3AY0Cd7MEh~^UxFyp)3XqF*6JIz6@{`k)f}@!E!UFq$ z#dMKX#@-h*D{&)l9D_Ozqc+Nv-=;e(3o4VIEp*|O-A=Ku!!Spk!T5XRaV-fP*Q>$v zz2o{7@B-t?c0s`2_urr)^<=JLYR2Uo!1e%42VH1PD+;?arnSB?r3vI6)29i0U^NF3 z?iLsUv66Z5Y%7)*Ve+cHYN%Zg1D0vkP?LVedfwCGzQXEBCjBb8F1a?5_pH;u za|N<7PnUtwVX_Ped5(vs>O;c0sKvh0RCzpG=!4%>`yZ*2)aFu;#*J#WnnoR}OQtwX zw1=)ZTSzKSwI}1H{M%Yb0XR&fY5&gw}rGW`v^+H@%AX{ggz9=S>QZ{?Ap z_PpvQdlr2)t>DK{8SvPhn!f`X=tT2&*=_JZ_5E1r)0}t{dVmH4eQa<W* zONa3Yj29jC3_r0Ke7G_frmaOdMSN~HH`PX(X#OEm2E_b8+<++`IwRbAws7wb#hAc2 zSYa+Kv}ahV+c^E|7EZqc*55{~M_E0Iq{j8tuhv#@qQ>fINI;UFRUmsX%G;YN9PPjd z{HEGhQQsO~%Scr4N89Ex?oko>ppC zN`*ztqaL7Bz?FSUn}iW4YwyPzWu#6BL+A`egYt&jXS_l6y6$FJKvi+Rs$AI&TXqOA zvy4KE2{8<0W5^=wD<&$UVsH^$gHLSGBfL!p6;bym(0YX_b+}j016On^vgv1#=-A<^ z$fC^7kt(<3gRDC`Xi-6Bp6y1NW#P*N+tpIZw2;9UCJ0cSt^sdu;2mQ$_Je*V3&Por zGC32O+__xRG1 z&K{6n>`O;F|9s)7uHiYk8)Zg>FGI4q{+%}Ym9a$Xf;F&FP`A}_s|V`R-+5R9#F6Rq z$3j|zZN_@|fDLye_{P17W%^fOA#UUkZ?hIPE;!ek*v4k0JPo!YW-5~ZGLksHvStZm zRYXBNvJ9iIp5PZ?2FgxoweK>)v_QUWG&Y#gc24==IDE!A_!g# zN#ZH9_lDOy^wj}M$3Xd2C>q|ey#~1J${_{AIruAA(6D+khy09m-^)j!e}JX@RaBzs zm%ecg6it)ZDghHsGvpjJq&wsKhYsVq6m1c8x8pZ>Twk^Yjq78V`Nvg6y327jphlmN zdKPZvYXYhm$I>T%T+?s9_gP&_7?lR1sW>*1$5h855JF{z9amRMQvog}TR( zwo}}KLGmb!H5hTKZ0$n{vX$%ZrlO+mVY+m&b|mSpSL>y3j8)V0jf;_1zj2HA8^`?L z7(hiu-8ppW@*DpICQ?7B-d#uw=g9YB-m`W;s$=cOwjkXqJW^d){iZD+M^<6-WI$at zN?jD@ht+kn(mtwdUgvfBmL2jD4QA|Es)ykDV|fn;pY(%}X1xj*6s94=VUU4&eI#kW zchTfRUv!SG9-IXu>T;+-qV9;yl&f!Y8H&pLa3xo%2n!d!UMUGi$C;U#wdW1g#o9AL zeim~opeesZwZ5kO2s1ILDNekHrYumJ@)NZww?@^JP5C?AL%GWKv2gI#@;HGOUKPZ^ zATdsXUwI}g>@D6Th5%U|P66{)#yp!C zGgR-ee~6Z^rF91Rt8yPu`(k{ryaar=!F`)eI_S3XIAVhLtgkG-jP-SW@mS$XOf9ze-t%T;DF;DKKMQiyQPY>1m90`7<^~iq;K8jJWk!> zakMS!SO7FY3TOflD_muZJej@AKwQqErvt@WWgUzz48-MD@hSxGN|8lWTIL+R0AKF| zO~?Lce8`SG70l(NM@}Q1VY-iJGa$bW1VGUVDC(LHAk*R;HmhYTFkS&ePfvjw<~_2g z!h6TR#)-uStZ^Q3>#0-C7ooY%Wmpk}b#}PI$c_j8MNOu z8kRU*Rs4X@7sUX`;%LqRamSwf8AJ*iK*afE(T6$3!~xqRV)P z`b@=@ekapAtl#IO-;Z3)`n}|Wz<%2wbuCo-JOlZzyQ1zh`Lv|Ecs3c7bPm3=X;T^5 z*VwZJ2$~Ae{CU%1@>B9i)%5a=1kh2hmg�a1@t-KC2H*#QXAi?^*_d*+gy!yy9xe zwh$L>6>yr%MjUD`e=wPPt1Rkc)-bD4r~Xe-*1sUy`q6sGYpHxu`q@}MhWkPy78nBL zBLDM!ShB_QD?*;D_JSbY|IfpymmTZ_L3(|FE*zY{zkp#JtuZr>-htzXQMObW4F5lfB7%2UDFhco&{f@Drie$fXGOnI>T7 ztzkZ;tcAl-ZTbO-jnid~S>*R9@0nn9rPpZnEBtpN*c-@}!2BqkIy+X9eRhO^^vwb3 z>jTnr0@9QGY505=wJwD1Njb;d8FC*H=7kzq1=#mpPhP>M0@*-<#`OL3!;dN1LFiwR z`(OG5avV4U$;&Swt;*r!5DgdPE>*r6LE7<{Wc}q-G^_xw)^%4vT~qvZ)p_f>80W>Q zbzRw6T`WW;TWQ4ddOwtuld*7zy({U-baOVlk!ojSYMQ=rDbngUZufpe>xcP3Dk|#Eqf6v(xE?>qdhI$7Rp6@-1%^+?hatO~jWf%n z?Phq|VZC7|d2-RTDIkk1Omkd@luwDKVkv~&F=Qe8v6bsfes6RS(=x-RAelLOxua(p5GmjK_F@nBCO zaO{@P%#C<2yw8l~ZH!EKpBdf7k)LIz<5}1KG*afj-|Akux4Tu2(SCo7mp~t!?xaI) z%|Y~L#^A8@hUikLEaQvcC~5P*#I8;3!(#hSDxj6vq|C41gy<)2u)_C0e-s>a%E+l@ zi!FZwT(myo^KUR%-*4mJ-)Jk^sGOS1=YCSJ0k-jt-zMU~JYM>i*N<-}XOTpt%Gc~kZHw%$23HlU#(5n_zEPW^L+j{|6$+0~6lyL9)iBfn{IeZ!GUA%G*!lMSpBB z$3*yl?k}*mlpY|TA*-_#8}UnJ#b*oKRKbR(l{qJ7l{rggt8+3U-cB^g2fbQ=B1(1ovy1jL#=kA0i+3Goo>(MI#$2&vC&& z=q40aDtLVt1~*C9_J&VJ$$T5>uK6jMM@ZQ-FaxL(E@~GKb#DakynF%!a-w4c!NlM= zsDI`_c)Md{1J^Il4C<5Xnlpm#sXhuN2u`0)yCTS8 z-agn|tCb&wGTow~6;SyyAay;ZSSQMI8~yu%uxB$V1+fa9RxO-fa(Kr+t=&z$Y%o`w zA@i(`p;X5{AVxiB1aglYn|= zV-8p|n6d%?@XDzwPl5y}R!zf&SPp{xWt(d`BcA3UomYV$*e5t1nKta7<;AM$R1~`~ z#8ewXMcTycv&>@EOl11{=xabgqD&eT)D}a`+5!qBR_#fL*J#ye`1LmJdNgg4w`u6% zT-MPi>G;7;8>+VX)Pmg!k0XY!fW~r6EXI;R6oc{Xq)ojurb@d{MOdD2o8t5Il%R1Z zJdT~r2`^#mKFy8K)7a9yur@ssbl-p+#SDaZ8?`X%k#ucM@7zKdv97zkb(LJ?t?O97 z9@aJ3Th}T$H7V_SwWoD$AE5T}scdguclNZd8gE@2eDE67)4B@1buGX#^hzH$_w52+ zianKA4XU_i2U=8*K)LTAkt#M-tmY_2*wA-w?r4RDzR>x1UV_m-+V8y3gSI`|lkbFm zhc;qjpIkOa;vYmwa!F3KiU#gg2>r-6W4r0cs=q`TDajPTf;v=o(Bs91Pb>!YVKAtli=v%JusWl z7Q0r(gfgX7F{4W7~#5@4;PAEcGc7S5O+=w!GwDj)d^zZ`)#=n^hmgNa~42+jBFdD;vk?|G` z8uK{12) z*ia@Nrb7j-fYKetGIQ-6#vilLC4{jB^rDG#e2$os^aOjI57~7%mypLg1r|M6m`fG| zlU|;S_N_$wD0H(_Q$S5ep_%leKou=Ai+5JyGk4bF{|R&LoxeqV&6;QM2F21WCr*xt zr_a?RL!JYpAwL5yZHI&j+@Th&FpS*9Qo+b|j*TAok7#z8_@WkjPR+-Qaqv<%F|<5ju12g>HmQQpySA&9z3XOF5sX+8v%_*o=xh2G0CV@^%Q!2wh3wW^wo^ zTI|j1sH#W3HQ3*IlNNu_n=3u;RiVSztM{Ga#>2mh1#XNpD!4)Mf~niz3vK`6*-{J4bh;{pXg%BXjPfFFJEr3=ZUR7DUT_r`Hv47u%C2!_0p z5eY*c_Euqkn_&p*x#Rxh?l*cBB|22@#gQor{aE=8qaWq{iCpMr{l<$UCT1zES&54! z|4T3Z*xM!jfUB=O6ozu5AJ7AXaO68WkeBGkY@#2tgXza?q90!{`ax^IKKkKs=AjK( zB|)HEhjTQgS;%)rRbaJNX$c5PJvEsT5`17TeE`&CHc^u~L`~*^n#=(;nG--w?(k8Q zmx!9!#FuEI+eBw8&Hh%b$CSukxG?xQUieXC*)12t%iUC%Iwh61$Z zW)_J$5^b4%(rJqqkvhen+$Up!Kc8aFmhgvSI|S00?-751HbimefZ{}lLreVp3G}A} z4n?9r9wCVSToyuqhWqHx-u4hI8Uec!I8+!c3PXQppM3fgibrAPn1B7si$^CS$NU;A zpFb2iW-_?~^qL&==AjTSl?n^k4^)n6SrH4|xc{6VmK;+>(^|ogUXf#-{BH<`e323f zL&DIJ??I07`I$g_{0L%+z>!BnF`4kLAVF)UvRwx9fTB~&>mcbsoJ(v@WSa6-0a`Sv zFgfl_dTlz>!bw9?l_IZ}tn3nlqHKnr7^sS(D6`EcUXs@7Rf+Wrf3W$?5eHE&)OKG* z?H)tzW&!$@cEfG#fK^-~%NH{T>BWf^Vm>LRS9Y`2Oua)aORskSFq~Cnnu!s2+GW&~8E{J8YifvlM*J zT|Ja4`dh|JE(Ee$kipR?jcVX9Q2odhauYUpI!6!S3t40BseILOYUKj#8+nxy3zHCQ z9JsMXUUJ|V#*giT8Vo_6+9W^mHS%zp7}6%h3lZO-S1{a_$T!ugTTQX)4IDeli24dz zgxWsftCG!o`*c;LK22wRdJNrz*HoANdiJZ1{c51ThUwSy$d6gS*#08N8UY}qEqHbW zU$nx@kt6TUEUW&VR7C$~zN-8T=7ZsApRoYg&LOHbFqI)`;FO~Wig|*W!{qIm$33GO zT}~ z0;@r`H<;H(c@X3#>>m9T(Fx%IYcv%Q*5MYTYt{O)GUd|7| zOa1DJV|<7?P(e&65}jb?CzzPgK=XC1Z}vJgu|DVBW}DX)ZuT6WF4#_D4o|61bl7%P)JxVKu%On*&ENg9zQzzjp+2|9?yr14Q%`A{M8%(F~ z`6jyA@Fy5i{G+E|)f;5G8*|~rVfoMgF^A&_Z*fM_~FDHmS1S1qtOj8U-U9818Fd3b42h-lpb7qwJvmyL=RJq#?;-NWT#hcqdQ~*i!?|e0Nq}b{od$)B zNT*}ClS3_hj!V&8kbSO>=GRv9R(Pv}p|9gCW97R6_JM!9w)#FQOZ|+t396 z(A8;cV{GZ@br?RA7;_jNI~W}d2crqS3By3V=jt>xL_RxfXV1dIKFD5&kY6XL2cDn6 zz#mIJ@UG9I1OHRnK=309UN4yIx}^u6C@lXD(HP_)marTJlXf(e{2DaDkILUWEPJlI zh){rIuDe|J&*-3;ghuo-G`l~?dk)L7$9n;myQ8%B)WiF#mth%1OZBTG$`_!TF?kkt z?9K{WPnmIoD& zoRoY6y*K7$`SA~>zbZ$h){{;lTAI={Pw|13uEUz5zTLMu;w>vS9Bxy6Ewj;a&#<5j8(tz zGIP)zIAJ*c;eRoQqbEvZ(s^jYDFVkWJ;uiy;1dRXd^iLjqg*x#!AQ^c=rHo{(7SsV zlHH-pDo*wsmi^I z`ZC5Y3V9j32SVJB)Wt)3K*7s?{eE<_U@M$L{3FNr0%1N0a7;rdVhqQh?1>JJKZl3h zDFVly%Xm%yVQ`FQIh*h<#O){qBY(0fI!KO1BYGE-k?3-mx!rSEE`VqYoQy3jvp$Uu zmS1BLwYOmzNSCdh(B+fy>?F{dr=Up3nAUv0Il56j2TkbRQSFT}JqcrzurKCgbL&UZ zjmSnh>Z+uN}04gS|zonh(8z`%9QZ#ca{ zdjgJAFYXRIbe%X(VJBCJndUmhd`=I@Omna?x`E3<6Z`}B4f?ZE`;9&$A-3DZ!rRbe z3d>uuo*RawoCqx6+7cZs{{g>>QwWwl7Z=VzM*z!T0H?aU`+)E-#9R}Cne}U*LoO&%=)8Sz&B%Js-@Y zSe(RQMqyV+khTzlty(eZ0TJwyx1t-$g=m6*D1V@K_1AXB9FF?7=-@a4O*lp1*mF7h zr*Ihw!}K~^?xuf2*P!x!qVF?cG^$68PKM=tPX+xNu!`aD05nDFerz)8!p-8HqV9S@=qH zkSs$ZdKV*43SE8xvTn>_nX^7RSZdLT-iGC=N0+g!rs9PBP&Pn=j*gym41=ReC-i{i zcxcj&T;lRby!e<0e%9F~u~8yzg~LL+(?D}&cvY0nHJAYtO( z#OfKv^`!&ddh1&0Dm~P=Tfd?K-v~_C@Ad%I9j?-fnpWj0+7Kqs$vt13z0km~)f$#l zz+}W0d$ws_O68GDgv3z|>jHLlZrT)O*$PK{$C^_s9O0^_x}z$;QhTT|$$mz4tB`)E zF+u2Cbrfx{T$q41SK&|y&ocev1QOq0<&n7z4Bji6p=6*$V7k&ZIRKviv=?@h!@x5z zkIpG}B?yBZF0GL1IFc$DI7fTBkY2fO#-XOKa1tni6pi#X3<(R)rlyxh;a4kM%+YJZ z*lU9wdvQkgR~SmXS>f0>qk^m1CiKGznADk$H7T{?%y0z0qth|j={Go-OZi;ne0D~w zFWw<{EjL9yFC3>b4&~@TiH~fOtE}cT`v5t6;Q)YBgFcgWRn#^5EKR7?j{+z*Vy$6Cs05Q$tygz~K>oHXxzf^B&7y2NPYfm-RjpRLzczk&MR~T-6O)bXXIc{5V>cUi$ z{+(t=!#4L2=eVbf2YK&baQAnPdl&apl;>?Y4r4-H2DZ)Pyvamo$@9Va=~PXVT!}NHY{rx+*G=_Ju&Vvf0M0gP3=YY#iEkOn57Z(Z;H9HwI7VWC{Q6&f zBY532G}kORI>O?eY{gU`9i^h4F{MsAItfHMNh1sDIxqcLnQJ9|Xs#vGT)P5EFu3!q z&L1bxJmaMO_^6oX*ph&C9pW3`Vy+!rpcbBUp)xN9^-7);ySW`(>grUP1vcIlTl0`mc% zG4lbIb-9hMztDZrM|#H!N^nIx^~;|^YRym4IlM5xFN$%w4X$eC@yGh*%jogZpvUW6 zcPfwZf$8*kE`Z^GyU{gHdHj)nIY*BV1U+tY;V3>7$ESy}#BbRs%}>XtFQs8}B_kVW z1Ld(Epob`YlX0|uc_BzA@(Wo07ixa7e);)IzKP|NR7vH{`sJxgKF{)3tNAwl@~?5^ z2uvVw0rCq zN-Nk1>sN1da_<&3Ik~47q!cyje@^9!nieKH8uvIkVh{^>Nzbhzxk|I{yko`#)}64(%<~>X9uN=Z)~b0xyaj}iWm^7~-8vz}et7 z_)t$7maUE>9{XrKa~$F3=^RIHSkRX%+A!}tjNH8o2hsanZc{~(LVXw#dgTF|l*|=v znO{u!BCY52uQWp_;G|7O+c@bx2nJk{OWMbz0>UOp1`0MoJ^*I*{n~}q5RXk#_zOxL zw@H67?m?UJw4&x?A+w?|3-ZFaKlxBrev;&cW+pF;hrEC&;Y?mAfV@DRrO46C6rlmd zlI$7y)e2+qn;=}q70C-O50VS$sr^F7W^kja;6_X$(1YPf>)n^5u*ks!9s+c140f9YPGzKkR<%=wCvb z{;_V3c<-J6vv&{(TpHlI{a4476X|gS!-?xjn0(kLY5m<0--_pn87BgRfN|)~xdGCn%9#K=>?ypnN&_*^cXq&bnNMsA&@>{R zzi5`Y(Wbh62tCielS1Uk(XP`!+=i5JsimetU!4gi$T?)KzM2jcq?B;8a{sMTT&u5n z8!2g0j#WBNUM^Boqnz|S@Q(vNmS*wNNHs_3kHe`Jr}BqCacnS&lXDzP@-%wq9=zOA znupJ5TyCYJchMCH{2i)-hNXXZq4yCFrYpq+BELLjm=@vFw8)+55xkvm+nnDy+uB*ht3;(D%vP%=dkN zmxUC5#zzv$~QTGjet}m)a1Be?8U} ztVPG|X}t7-dxeEhsfrLQ(F|dnTG-k}x%E^E{=z zH>y4qPo5M{9Hh7uM+lPk8H+oEq4-~3Lm?*>zvs_LIgmoL zfN}E`Jj18&Qc}RUTaj{+B-b^@DSEKsb%t=e!Zw1?4^2*%bwDO}Ke--jQf{66yWf%V zT4;5=$xeK*r#s$c=S%2o9>EJze;hF_*$FauHytNBE>5vxO17EA{^r6NdH1ENv(Y_} z5Y@5wFk!FQpYT^+@PEfVbS!J4ko*UNE2rGkSl@B-lAZ%Ds6F}?f% zG@L*j)Q0Hg_du~>I5?#$00)PWUcNRDpI7vpib8{+=N+XcSVSh8D#VOaUOQKOwZ3ot z{12pi?*SM)Xz_mid_ANsg{NQi6jEL3=Lf;P6rOH-8mSob^tpdzh_^dzlYRQR^*$g? zKlxY0+I8}Th&=sQsOE(9^HH!^czHUEO4<6#oC%Dc3xm_5Z0|T*M5U`2k+kWx zcb*n>HI9pl{S%hZ6S2MPK)z$coe-LaNh}Q*=zv*$t<7YuE1dq>H7D;bEVIF@qw4_dW z{GS$kdHi#~jPrQ^GE#g^bNE1#QakAHFTv0g8@l>B$Yp1Ab^HS=kDrWBo?dh{&f{ak zbc#L`bN?81Xa9!Bsp93;Mf1jq<?Botgk2d*4GD; z1vI|C4u%%@Qwqb=cRd;_I$DiM7s%5?>1cu1Cjatjv$h%M|*uiR%pkMr`F`O3WksCUK7byoNTGCfE-;trNL#B0c>I3=kxqF0ULTJiJ15TL;F*wUEaKCT$Arf>f{23D#$bJY_T9m_7`iUB z8EPTJ#nc4>xENnwKe6?755})6-u^2HRSIvv=PsnWvdQnCk3x*Mzd94C81wdWSp0!- zU97KLfK1@+?TStQpSMKf?I*mxzG{}Aw})9@FPnsRF#Y{WaQV1RKCZV%(AyUSQ)5F% zjhLf>JUx_-K2WaG(I;Tz^6~T^G#!oe@|f`Q|3S!$4Gum7^{z7H7V_sejeYa~~{)}RapF9~jqm#e9 zsn>YI4_UD%U^<~5*s=?4YRc~I{Kq)RXX|{5^-K0-@oqL zzkV@PFW_Jd*4Oi({RQG+=sM6XUU{+}x{ePAE2!NbRF@1#?yZSBX*ZO zJ%1t!F`iDY5wYg!E8+43#Oq>xUAz*6tDpPLU$=mK#|9T|cXZC< zon{pmN0S#)+=ov8@XNGOC`K`4FE0Tb?t;fJft022`144E?@Dja8IMAY$7dBH6=S`9 z6WDgwJpQ-fsNnH0qIcl&lR(bG$B;c?9{&&^(g}~BO2#H;gMaFVIFFC7uXnk={w2^P zHgxsBSa|A8ciPUYbafq2__U&{I3K3mEN!q#l}bqY277Wn1(bKE+oT3wswzh)D}K9d zb(VYh#BIDd$z+q7BrdO}VVTZS(u{OU;gDNjOdBq6*HjH@R_NBIhjeAl;b9iKe^? zi`dudFqw{9B@^b*PInuh+sZo{68P;$IFaYAqN&qq`KmmsNstdu)jfWng$^63)8v^2(2e@t#%=%(8wnW+`|0Uzq!K zO$~bzoc#<5ZRSgMah2=9NY`<78&Q36;r)H<){WLS?9nA9Cp2=k3082`GHH^@{TE9v z2ew+GrNbsuEFuT0&^dGUQ3WNz&I^zCDLzhd+>6hr5Zd6qjYK1MbP#zIy2nHwlgH*v z;)wEDrG_$TCns6+YT8Iq*da{DbPJ$NIf8hth@2P0_gE^<>NRUpRXjD zol3OH=Cqbu>ULVCDzeY`=c#I6XQJ65j8siDO-4P}xGyOw&s^79T(}?| zvZg9uawK5-%{J@0Z?^HWi%s!%#^D*q&)%Cy%*14qeDhu9RaWPj92sSKsmUg7z&T)f zaA#2ju2Rlv@>od5;v9R}%txXj4+_Dq6hJQ#K$9!SEtkb;L1UHdbEC27QB9BJ<;`}csu+gnAVTt@HqA0 z;WNATX#EHyO6x~D9tM>hu<^age3vUoEj?O6inlY;id-C?ilHRj`eqzI{S-$@g|{u* zqFz5LtNB=6{4$Bz&ZkRirj=LOgU{h|Ww)#O4PW_^lgaKQSM^(3uN#oHO% z^}aYf|9^*Pbn7}a?St2+Xy$)^>r;OGjrT)YpNfwMbGkplbEZJ;Iq%Uni#(6CFp63w=E;MaPylxDy?HQOQllJYJe@EZ`-}OWqo23zSoTtg1#5p#2EMkUxFm}UeIk+K6iM+>T zpo^4Zsx4&q8q~x&j(UU?&a=)^v~%gJOcf{S8oGijwP|ipo6sQrJ4d_GrXk_lR3Wl9 zIW!5Ojau35M)AO?9BhosqC_4N+1M$>iy1bNORdHG$`=A_WDiJXDP86#ZF z8Ij5%FC398z}}5o&c=(1twUs6%e*xybbx+4ucwwPKviS9SCxW0mi!$y>f{r%|(q-=BTBqN^YAe~o%p91{z$h0v`teQ?mRkQ{EHrhmOD9ZXffE2^o zAIf*p%>wH4m=o(W0iZ|y{=UE8{qZ)7kIn=pM5ewy>VH??ceHxMsy*o%jac;=e*NgD zHV3FYmtnNHsME#;U}&$jvqQs9GMv8e@5jeUp`X#s=Pu_|uhNxMWz2p^FpFZI#m7z& zbpvFE?%}(b0VuB{87%D8G?{nohy1)t71DTVgFL>^F;8tNwsM6yPN9uw3GUq2kb*MLV6591xbr#&8iX3EMygyrC5(TG-Q)gJH?q)Iff4=+Kq zOkla;@_cRJC6Pos`HQc<^YD&mDXj?sNr$p;Mp5?RD9X-=qU;q>lx?J{Y-GiWF;>898A(eU~2@nX#*fDkb!X_rm9C&eZeSOJdu z<7k33G24>=nN8}epW0xmJHShYW$3;%G0P?m!o^^t-b_SqY%q;EZN_Y~c!$wsuD!!( zwjssSZ8_aegOYfM@do;tN%ylW^vi1I;=4A{S;;Qf8nbOQKs=0)uwFb@i(L5{f`jB- zgtW9%{y_fDQzkXr#OEl(Dt&0G+ak{e1qHK~oU9l5n`Hg5@367`w?^uwRk{(KnU4+b z|Ke`tZsBga_2vkp8iYpOy1_WP-cb=yG5Z4IbF+AHQT7xC;?MIz0RQTNP60k1?IwT& z)Bt!V&~^aC8vO9|W22vPO$C0ZQF5ln!9WLW_l`-k*=W|_XSSwupv&d|4TSd0FL38z zpwE>OtUs=G!1}=K$P!R%r>q&OjbpcwY^%fd+?Q?*cX`Y2fg*4zO?ih9P@) ze}?SyYrL>GFcSnJJI|0Ejol(|L?;OL7Ftm_!&KJ}y^4(kkbM9i0N)AGf$w-R7~hu? zzAq(w$EtxDKfw2;4BwX$zAq(wU+TwqUVKc!cQfJpwZ=Rf#tHcTHsQNXe4DV?CO-BA zE@F*_j3zZn_?3&l2^^bE{|3-$CcLf8gbz%0TjdJSS2i@Pi7U`Q!#p?w$`mvYo@hUb^I#lA3hzAF3taG~ z{~nMY>MPTY`7wF9cTB?0j~CH78k3mJ53mAEkl0O)YiWRdOybo~!%U5dpcO$=W8a~Z zIyH!16{4Bmae4q^f;WABKz?RG`gU&_aK)~8`HD*K@P(aH`_Wrv_`XM8zAzP0JAK2H zwl@qf|KsN&ldAN8L6fT2czNYF+J;Yc&ZLZ_WF{Z{(C&F@yCjkkoz}OPQ^Ij1LAZi< zE*Dr@Yfman5iYXiH#pinW>F*7kv)E;R;*Jj@^xf+=fw$FVJaEEZd5}gAu0Zyp25vi zMe8n(HT0XHf6NEpSmlpuDBzNWK7|?fgq2>q6VVsaIqZ7Ag`@byn*0W4mLmN_9biRY z;vI#M|Bu+Mq&5_IGXHdLvZivGK_kNWXYYq&bH^KCxtf~dPU5AhDJ19T$vK$65)!<$ z6B>#q^Ip8e*T7={H3*QJk`+ZoejQVqS`z+`nZ)2=AT{w~T60N&%?t|MBkg4Pk`l~y zDRo)|xjwUQTU`@3X1mar_cYdN>$X)l*#Cnh9u>G#hg+WCjStfkeKRs=A+TuLn zFgK==CwEr8WxFl6iK|O8@SdjH1Qa_M3DMD9GAz<#uPM)2vd893|GxsAruc@119<&A zO}spdD+nfiM-hjTMge8x|Un&*v)R(CzUd zELG}jLYrb)->A#GuCMEHQ`&Z6jNA4>H`>-UKKNlbZgedAYLn6s=0t0i9yP$w&s7#1 z?i4btP{2HmlwWcv$&_UOhG2$Ai|k3}IxYeGP#Dp0PD-HJ4sWD7ZEXT(dtCxo*J@@- zb6rDqoBcl_Gm~21@h^mOb|}E?EMD7v2} z!8!wLJMQ(X6L?1x)*O@^@;wRe7VqSSQx52?WIFSa;D^Xp>{qatp$WU}dRg~11Vv|Q zmSVcX+iEJX;!QQ>AS}Z3&x*{h(Lml6j0R)yPB{K4 z?Cy+z)=bJ_(nN1vnQf9Ra)!DINu1Qqt(yUDCZ*xitd6aBGCVnmXZPg#^YbMa^lvv3U4f>j~NL1tcG_FqWd27Aausj=S zO>y?ZG_czStNz)Bc`21gF5&9h>)Sm|dh{Y-Tn)e2LrQk%QHOlop}$ko%d zaBt<<^l`VKo<71mthRdmCJ3*&|5zq9x?f(y%AK=@AmBdJv9FJyr~1+y`w|45`;S&> zgRO|*>8e5jZp_E_pPI)s*zZ(2w~b1jN96~iV*>mz+tUSorEA8a#;^2`HMx^t)4CJ6 zy6tB2Y2>6?446btD4DL|VSDgN_MwAA?$85JJt<<^)jB0TA zCnUgVj@gE%qZ)~PL5%B$YiHo}IVtHl4##o$G{IrPXkfyI1xl9$6{o3U&0LLs^)*SH ze)W-xqV4+XwICN2=At%z^-D;-xf{OYpvV<9>zw0X0u64W6r;wCEbnblJ|t)&SMSi* zjKe#Y>Nb7NY$WJ9hOVHZH{l9uYhB}|$q=!#7pCf06H#uQmsa68dWn!Us?80u>>U4m zho>HT+Td2`vVm$$qfZrPxwe3M5n(=xt3@&y@`)~&g8+dXH^N-uBg?x`z)O~onw?gK zG*4AX^OcN%mayL|*za&gnkTBH`C6d@r1@4Nh$Zw>KtJU~ny=1pb59_GyOYTC`zl%9 zh&uWRO{}K3EV)g>YWE8;p1A)Cvg__hleyd-pvf8plB(B1D59 zAP!!)H53QU$oWCxprXe#%KePY%vFyQ|CW(1f-$MYm3QjCzEnqA2TT7uAiXOfy*VJ= z7?6G=ApJr>`gZ~8M+4F|0qMm7={erCliOCDx-c2x&>eE#Iw$vZ@gVhXD(>F(-CeN` z3y!SS{t3M{51pzg+Mr+lbI?jeSs$ZcJ|C&I2DTw+gWho?-A#v+8!L4i?wloQ6_8<< zPoyUYyidjlJQ+z(DpJ*VE)95c7NyG^6@oa{xM3c-}oXR|K9=mTLbbp2js6t zdTm8N^~-+^c=Ee|H|S_(?-yzU@*TeXdH1X>$ATu>Iqx2&lQW zq~2e()?`rLxJu2rbnTwAl$=Y|oO7Jz7wT6xR^&E;d!;TM=uWFYn*q9Yej4&~o3Mk- zK1{!QyR+n7=Y*#n?SmGiI*trlkVGSg1WaoB@l6i-ijZOS4`?r?Y|=lh;*AEYI4jF4 z&d(+R0gU4=NaJ6_(hKHu)at~NwWrl8PCQ_BPL_G;=HVpG*QWudRD(zuiYK2PZ5STua7fQ4_f(Zm;xGtBG5i{lKhVhLO@POHP-r<;e9+|Se2xpJ5c z@*=s+1ob?2?VSf-gdb9So3JALLu&7UA6R>DhXce93BIpkh4++cucHB{pLIbX?*7Ng zXfUWnH)%w7+PoI_*4_tlY}?%D2iWFoKKkLo`6(D-e`vU|Z|6yBv*ODI-_Dsn-#YF( zMYtdbT)5AP(`iwAvnT%$U(;qcG@J6YEhcutyX!pougO2#_#F->)>oS$P4b2F4fet0 zJcs=o+7?bd2wwH2bNv_APRT*b#RV@vBv+%l241({2L%mst%G!ncJsi5*`woqJobeM2i<rq*XtG|*+a_C96@`oS5J4gRcDV%~^%|+{%&f%r;*k6-Uuc?G=T~d?82{-VPgRsOV zm8MAL2-L8z-=QY0kgjI)g>zE`#2EM`m4QuO&UyDcPtkfo=PAv0CyKMOd8yQ3uESv` z4S=MD1$ZizX1nGehj%IZgw+h#h4Odgw*_E7J>cOykwYHX z+46tkDnVJ{O5lA~NUcO}MOoLGs60qyJ}qxld(v#xxsCkP6~AewzhLV4NDSxL|NCZmfUlE3Y$m!Se8?Bh zGT6_KM3dal^3K1K`;^Uj>FWb^8cFgxSUH%3RePeodK}0ck%g4P{`%@d+yE)bmCEK^ zGTi2zk3&sIaN=czy5ePK@mX>n!i9XU#91I`vy86CiJZ*>Ir{^VGtNuSu)WOdTVi44 zY;#9)R%b55_cnr}$wt_5XkKVx52;*Y1c6(D>h!B78f#z*CMzx|n7%s8n`oi=4w|-r ze(s{59QqlEzUXV-Vz|9g{ur=yJ;G+%Mp=SeB|GrGa!KJO_^Oa*l|GQ&+d%B*$``(+ ze119Jbi7H>(b`iTSE8=h@kOrivil}j#0%XPz{2$hVRLCd>)hogyM)gK1i6qy>NnGwC3U#9_B6+p3HAZ5Jp{b=1PuCR`f6HO zR4C&tP{yCBl<{rYcDOj{hfK?pHNWjEA^ zFoe)G3Uv@s9f#{_N$R5R)CtL6LrL~J*r?2@G9WuBoPnrkPsOhV2A}w4t|R{&*R@2o zNC>+L37lNS$d(mr^nSAClfp`k@I~XDXSQOK5{Y2fsUp}+ysC&`!)Zbied^~;yiQXL z1nCy~nM6N+5$t}#!8hLn;h9aTzd{Ic-_BLG2gqRJ7UW$WDprvUb_K~`qeupO0N-M7 zDMDClXz6f5*fn^kQy~l$W(y|#4iiS=H&+;n-%Euv@C%xB26c}lFqa;Sw)sB)_*=9ezAxZ46j`ZfbuINpOB=*!B9c85sl9+IBSJVcz zhDu@P2sJx-c$rT033)ZY0lkSJel2D!s(a#>9STzzs>1}dQ1Q!(vaYjHdDJuZhxbCK zG)B?tAb}OWN}_p3<&H1B$6y~3D2_>12))>I77Ekk8N+QX1oH|3= z90@CohU`}o39f%35r&3rqU;XZTxy$2Ln5nk65#^dzFNo`>;_Z8Jz0u8G7PGkdkB;^ z-a{)6Oyz?jXs*RtfpX))dtp_%U$VxWaLu7=+?zpa+|40$qMRIj!Z+!-C2K& zOkG@GpUwhJSNfZ(wGj<@p(71hLCR9$T?TtzL>dyH*1fuesdcVd^p^8gRVy2k8eS_a zK`EbBb~(KgtycCBks#8_o+J{~Q?2X@aAnfUN_<+Ggz9>zl^tU&Z=?K1Q-D_1@AYt6 zS-;mnoaV}Bt4iTIycw*Oy$IS7td%`UG)L9!RITjKs!~_o;dSy33a^z-Bl<-mX9TTG zRmM`h%2<+D8PmE{Wh~okrb=LDs<2ua(YFp-*@wvVX=NLH6fRIJy9h*^X=S96fwG4h ztETc&FdfP;72Ks#I3sCXJtA=e%wi{AZKyJKi>i$M<$XmN!`5w&3+C)@D`U3+J0gii zuBE658d;}ilpmhN6WbQ|TzLo_kpO9a;1k%u3G@+Q2)OxnZE`x6P-1W*PNX6o_ zwWFarVBKvMYEZN?roRvsp(Q8K4t@0>l!P#YD9Lpp32T6c1;Rpmp2^uvTkVt4v2*?iEg;}#v z5J3b5G!Ri}Mc9R4I0Bm}%eYF_wrXv)wf>9ND)kCrl_WqC?!ybTDjtnlNOtDUn>X+M-tT_D_j@+{jdR~ghMD{Jq}iG78MusbPZbF#vB^wcN;L_6fKr^D%;D!0Bc{Y&HcVby60o*Zgy;eH zozlj?$=_d(SAAB@NUSZJuO~AmE^n|EyB7))xvIipEinfy z>GW3DxCgxy$QZC#RK_@imN5`tAhz(XVnW(A zh`1%4Un8pDzyc0LHHY^?==?tb*Huyd?qRQ}2JcT2>@_j27l<}UWYhk^Fhq7!i!|gZ zXqCL?6?uIT2vC;S_dOp%UT>~$CwW~%MBIVo_3vH?B+FO?YkTFjQ@}3nLan^M3Ihlb z(zNE?N+JCx5N-R5)u?`<^|UsRXf14=cmjfgR6+}0pU@K8^WS?3&Gi%r!-&bClV4W8 zh#RD4D9Mu5Vmb9h1X}U)UMkb!ipkSYNourcWE&MK8}N6K5i_#)J%g)T*?v54NZMqG zgrJlzhkr(t{>k;K`hXPx6)eyy71UcS*KnJ#=jF509E|KoRoy6{1wd?n1PmAbI|Pa0kLS%?W1X6036JCiQ# z{v#;(PH91ty6`3FhgKIRZ@RY$MHik5)-|kR5=&-u4`Fg6Pob(c=*4n2~$oP$}5RA|4{Ma_U3$6iy09|pbNhU zrw>GQZ@d>m7yb#juIj?u-Chw5U0Ba_Ve&Z{DS0LAot26Ut6G)Sh~1?`!R~qZt9Q>Kfqfe;W8Ald5ZFb{3Tz}KguuR(1a<~b z=?Mda1mL4mJzs(%u`zWJ4_=iRRye6yl~)F<#3`*;iGL63jjFBL7T$V&$XWQ^+GSPqs zSH%z8kWP{zzm}{x$OTw&5DT#4AQfQ6K`5My=}2^^;%}Ur!(Y8S3B09=S(5vBw%yYc z4$K}@vIs1qT{v~TMOVHoQzviw`s7Jps4?^f4|m^o;7(954Oc-i+=?Y0u=}f<*FdME zdbOJzE_M9GPU>X~T5e(=-^lnsa?UerMp1^*$ z|CIVoyKjDJ#)9Z@GF$@c7Ne-s;h!r52jAvN`+7~7lePsFTRUm4iokxi|D?4rPcQyK znI|5p*G)*-c;D90{F1gE2So~&FQP-YX*Vna5DQxufEWq46kwEw#Vz}zB4%k+1U**# zHr*)=uM!dI(VxuuX^Kx41o27Ak`&A*4?TK1P34lO!<@?NQStPcN-uwGf#$AyEj&G$eCfn{3|Ld+?LxZ8J%Da#NzE*-q;Nx|8Ha}syS?Q*yFS<|_l;17 zJ|*3RCaQt{O@7e7hIQ#=^hfR4$%H`*yy-6w1?p{o4y_NYV#T4dXZVwi)_!u81?oSc z^|mX5WxSHPg&t_lrz>F_v{oCN64aaalJ+gY{Bkf9e_c6>Ft^#j0OxVLrdKgTQ?B1A%(a6QOy_%679g!sjd>Jl3(bnHG4; zd(P7c)_1{j>ByR63$Xt6eWwwu<6(SsWLURNH{S)f*m@63j9a7Rq9HeJSh{&@_1?*+ z;G3Vr0~Yx>Po|!ErhcmhUT`a1?a<{4^RU?liw~5_A#m}*%vIdm3g!8^xq)JwlnVci zx3=)*+X*Q8-~%w1+P)Id0!*%fkG*|h^2nW0g^3G__(_7vFffhwfl0-$qY9I^Vbz}` zm|P5|#_S+@!Qk-_w8L{1ly+Tp(9%)$l21A$qP{JPZ~^qUU6E$XMPY&|q@tG_6Tn9gNC2yhE z*?(uBMGlwpMMx~^9G4C6Ay@e#Sb!j!Sq@#Z!$3K7W3W{(*4`ParvC{G>KTTVmhu4Q z;T@OF{KT$nmj2|C#M>#F7wO}?X(?Z$$TmvmSeC6@0>^T8Gs>%9pK{8>?vvkpo8cg8 z>sa#UU@T@tM?`5XPeIoSvri@VMc9?8PR!Wb!hKPm7x``fiJ1?HCms4#TLuFv^Y2&L zs&M<||K3$$PioWSDS|>Ey|*x`;MyKD(=q&!7XCb6q_l z@rPey~bG;>BcctqF z`8t8F|AjwvP)T|299uV*agr91s&w*z6q9R3cpG>Jja&CmzU~?*t(mYh8R5VjK^SADek=Czm%U1 zwOy_}>!Ln8Z{Q@HGucPjpq_pva8K3FPr&OqM+Y&J1ZjVsq^>(e^S9Y~9*mi4{XAa> z`{C?7yHA68-UNHB_49lOxWUJ#JcFm72K0PrUR&n*vE^sy`Sh6Q zdMt&vo^QXn?Cd;usClNn4cHf4qaBd z(HPY3%}_OQ1;zWH@)cBXa(<(1mbDar@35BO?;I<2%xcZV--XuR_zN}s8`Oig%G7X5 zEP!jKhEpaiTr)LXj^gK2O6<_XIeEi;up<7n{039RAH_8(?s#LC<_)HbzbUKYJJ32) z#pmLJsp7XWRUG^K(6by{Uu-!njgi&yI8^bf;|4tbrSf>FZ3r}SdhFH62b9>QNvLw_ zwQ`?^Px^UtcyXh(ZFunyun;J3XYt|;!;9E9;>B+f3v(7P&OClmG_!5|VhJ2lXYu09 z!;9A@w+%05+RoyI`wY}Cev4%WV0)|e&Z7Be@#3_^3vu%V@7a0cmrz5e3-zXhlq&=I zS-fX=3S#`PzlhffImp^#YQ$0*_l7y|jZ*0F_G2@a&F3n9&o0L=%jPQf(WQ&GrrBLF z*5UN08)fsvdFM#G`5{yLw@a5SK&m224P-wyiL0n$7n7~$*^k{~J!n5x%vHXEqMUt{ z?(>yfQB@8_-7bAQ7B?(4(6Kw0U2n~?yJlKnpyr>YKTp%waMWhJZ4teB2+Yns3#ms^ zIlOc#?!C=^M!; zT2+|m-<{1E!MPZi<95D<|AaXz`>TbI4tj-TW1`xKfCgmR_%JuMu#{rmO4W8s90K zmOLZ~?OP<)DLF#dr=vg8>xFU{OCO}hk@K?HkNs>-_SEtDM;5<`t^Ek|usC0m_kfH~ zMB3SOv)D;{)Fy7JXjme8{bq5O^c2<#m8psaEN-lE#h_cZ zaTc){y*@#`Hu*Q1q%>(wEfP1I#op_)si!@ao~DZ3sH2^zpItrme7y;4G4)SFWYTaMsyTkCmtMNBsxUO@&LmQJ>)M zr2u9(pdt}eoFzzSUY9>#us!MeH$HFYJZx`=!Q7KY1#vZDylr+K)6jRzq-)IJHNejCyP(O_jUkEKFDXbPT$tr#`<-u!-(M z7T;sCI9al3YRrO~$aN@K#3=@|7^6V}3^j(KK)gw>cXwy)n#DKG;x_63(Bx`NNBZJB z#DdHkDFzrYU10diX1+yywFKa6vN<%qGCWZ5m16CR8ikx4QqmO6krStYn#C!(W^q0` zUM85uPkH4S(3{(T!OrIz_@B5!KCm$5(C42K@Ke`Zb}aQ0xLg0IkX+p$Ic>FD2;<0!@^a(bmmK^{-)5>9zE$4e@k?v zlMQoClAsOJ>3(8X(UMMmz$aTToxTD3MN>LmcU{}1(-i7cbfr@wnvAM+x^q-$d<`v~ zW8}(BQS=rZKVgHZfk9&l{YjiqYgrEY}Qul z4F(z7R@#X^`efAqfUWeKt3p$E^rX>37`oB0l@5()voz98h@v!dfG@UQ8r^bZbfwW| zSdwkEm3D$|qAZQ>Mw3yMMjz*g#@Eo&=!2rO(&*&MB9cQlz-c#;$C;C=%Wl7)%TA2n z_>R8_8ke_`x$BP4Sat_jA(HFh`1oamxQb15`31S_zKF5r(VuSiFUVbY9PYY0Je2N- z$HKLay#Zg{8g?<+dXD}0E!I!%$Kk7c5=A-tq(#F~Z#Ax^Qt%PiJ-D(TzjN6&)FZzM<~q^bgn#a3(4RZUetfRAul+dr z=Z@Q~Tl3$wWxzkzNBU1Lo~G9GvU5&e?tf7)-2wwoam#gu;Zt6g3&)KPSIjMUaHZ)J zWB}B-|++YW_WYJ$XmO-9qQvghx(Hsr+|q=y~H|wwpqlLM<@1C`cZAnuUovX zyv(BGDn2JHDHC+u{p8NF!0*P(=_1YIZt10Ki2u(g$D0|BH&c#B@x9q5S_UkU$m2!m z3r}0`BIg3t&qkiDgHjQ&QI#DRh8k!m43ziO8_99?x_c=+Y3@apTdg+x%!4{O&bm>H z-uL|6W(TG9Ffbtsw!>|9klbdq-ik6L;j7yrJze1Yz_af2v{lF<2Im<3N;{;bsJ0qz z)XJ@;v%Su)TP#i-55n+ZqT+ZJ#8KEzH!8)}%Pdxx-;LC6ah@9B!B&qW5oo~cd52E$ zjMAK-?S}@un20^EUNm^t=j}RI2;$(fr|YI^XB}P5u=ddQfIlO4l!D0OhwSxd#%7rr z8=ZGLg4a*zFqMGy6FzGvjxWjI$yI)UhqU0(7nH${8Dr}wj5#0kTR))$s`9eN`OwH* ze^%a`H4-=Mm@%xMOiTP=T53p~APiKNVd)-#XyuVXYajt^%a_{&i zxHol3UR9whEUSQj_cd0`&SckF?qph4VZ9~>ULowwZxj^tXqkT#G(aW#FdRo#8O>%Q3|&1E(R;$_Zbw(>5+54o>}HeA~;x zsV6cAH^puVmxF&xyrq>KT>NDV9NY-Q$`pH|RUG^XpwuD<{}g(R`hjLR_`gt1;ox&* z4o+}yB@4Ic?`R4UR2Hrv!n6FUE$WKJ4P+^uU9o6}TSxXNEFF8wc7L|s1|549P&phO z`zk0cvW|TRm~(hK_GtKYy*l=TAgX3`?4?w%b{J_EpX_+K&rP^$DRPwutg5dYd+8nhdu|@PN|MvMb?Nve?F^Y zhryCV>)4W?vqRRgcWqIb@llFTLfTRmpJa3{-D-3$Kv2<)g}ykYg-V)*G!?ox0z261JT8>kiiL0DygmxiR>3dC_63@=|0E-%;xQBThh#>BIj9W|J#KN_94r}^s>5VOfHJ#6k z+kBBt(qM2Le5T%do;>d0*rx9n|D%nuO^p=Aa}L}Gs)`Qa7Avt$Q<(dMVw*l&YW5Ec z^2Rou&mdGJ)+4}4S_(O$<{9HE4qzfQK~4!2kb!~@MZ6H zZ!{r$f9)_jOPY|s`@mgWcfs123auEl}|FC%bZ?X$xP1^nP`S^4=tGC9YbU> zDk7?wLW}Fw!)`-K<^i%~Hpiau3g;a@;oOLFqv(~*B$e-wrScIHZBtctEe9LJH)ZvS zfYLMX@fzSVb@tPJyGy4z=W-SdFcFaWcGDtyHG!xWjD&Di3 zNjB%~6OYpfihRPE8YST@H{#Pe+Y0wJ)K|=K7($y+ zsT+%l27U&|ME?icDTH=e`r^BMPR0^hYI_JPC$~UX=Lbsdk%Kj(Nb}QnK~oGvpOeQW zdm5SC{%X)!xqb3va5TOYz8qimY7=t2O*Zsjp>>C8Lyx1XPcXvXE*+(taBb+zUm#ZYNwKU-Z$k6q; z%6~_8!`Y83p?jaP&^=1YgUGuVdMTn-dKFrxYbE={oeQs(L-*EGqc78+7rdc+cS;*b z;@+Z!?$!0i&Gl;N9)Cf7KxoKyV2tje{;_)vh~2~1TX&lDTne7{_K)4;SG_B37(k-- zGsRf`5pf^J++vu;U$Y1hhe?7X`b%u~ROCP$|5`eFPG28FTYNjw70luSa#%}ln8jt8 zR-Eax7-WMsfB)Q1w;h zB(KeW>YZH|;|mqpZOY%d_*sjx z1vfa>4-sm+q`zR=RT)aKm`uj*1-ot6nZ(W1F&6Cy6G+YD?%$_A?sHkNAN7bVVDzS5 zpRJ=y>WUgGQg6!NvUnXP4i@eon1x#m3->q7e4P*Lt%O;)yQDfWGeI2f+g|$)KnoW$ z`JeY&95W?e{N9*{cPr*G3wP!ot^Zl_`k!f=?H*|&Y(YWXBm1BG(+gacX^&a-jV6VS z2HR{$y3eEFzcgHFhGKN+m5~Vc<1w~;u4=-*CSLDHulMnP-O*inn+uTKY9R?;~N(xWNq)+Ki!N%wDXu;@v;IdI6GCX(*c^COgW zZ^76+sgiDWmkuQ9R-~PkbYV%P_N^4Yyu13(?IG{_l5y6u4X4wq@@{o{xbp6&1dY7Q zhFaO24fkWe=H%UQxGzG3WL{G0SCfz7kt`}Og^5P}i* z(eM4mT*U7;IYyTbW84BwG0I~sjE}gF>UmW1L^cBMkpU^hxm3zTb^-I1=EAMp_CaDc z{rlO489+e?v^9fp{_odCj0{bWb7u_3Sq@Xb9mY8kI#Fcvv5pRf0yQ-Go2Wc*;#Y9S zo34+e7I1c@Gd@pqJxFssKy&@}b-wyrHP^3euK($~<_*-i;0*nX+?&hJu@1vN>TEgb zr%P|^>*QlLvF-Ak?5<8o@`+5HEIDXTy27qxWE;q--o%dW+O$p?7!5%4--~*e0~EXi zzvJMHq~A)of#`P`77yrm_Rl}E-@VH7PrJ(H8-XnJe1=kgW|DmW4AfaF{|j(@hair_ zae>%i?cmcaV&@_Z;F=KC4L_H`Itj(rE2t03|R;vmZ~g_Qd%L$=2?Cxm3&_ zuKtGmZMD18TD?1FNVUZ=&QMW}NcHYwtu>8Kgxo73lcO{Bp&R3La{5KoKsin)6M|W* zX4LYfjJtHIS}qbdUZ0VR^&zPkqphgsD$0QmL2P!8AW}8-z0e|FjX`X+juHzoh=M%I zkUBt~fnzj?vL**nXyB?kgDBGK3NQi}jUaySq&VIBPWYtYC@`R0=P1Mo80Qbk!h^;_ z1t$g8m!PMufb~h~n|MR3`W6xoW;0QHvhiT+#M1>2`lF|4-OFuoFk8 zHBUd@bBNOe_<#la7KrqgARbU8h>M8_c&q~v{g_Cdz7T0A(AV+kYZoG5X~hpedblbs zfXKgua0o%As2&qcR_=;0oy6m6SNWGA;~q|xErV<`#&NG9^xIOn%FWc5HkcJSHmb8Kla2yU}>!rw8rt_U{3qOgvsB{)?G8LAhJjlY>KO7DhUF5QKB z5S$M|is<+ax)_}fK?oNM_F+0(JTKO|J7cYKES?E_C8M+aDeOlyItsFp>v*g?0aS)_ zh<6L(y@^z#vRdGb^+azt@L4QOqcc*cLw|yg;uy_kLjk#}ev|8I-;n;u*AW z#D}tr#9BZpQ*c-^kg(a3F>L+k=1hALAh1fmGDh&!u8QGTH5l2YaaA>#VL-(IDnQ!4(PWc%Bz$jPIgs4gYTQ4gt8xFd*L%pd zk&evQeqJAbBkkCLmD^7~L|NiX_zUYxj`(?i`q|E*WyIU83G@?&59n9NP7MtVYj+>e zbFOe`U??nvlSl(xRRNA4m&RakO?}gjpeNvr^%?+OKWm;4&Ixb?btXqpNqxbv`MOZ9 zAaa?PYW+cchjj=A*}uVbA$9w=>>Zlily|5=_6}*OhfP5c^}tiasHaS(o-#%~E%=HC z!$}uKUr_?ochZ@hP5Fw3wX?6N^z(3NMu%>8IGUOLt%hdyA8Z571gK8y0$oN#K;$>- z@PwoB+WLG*!88QRT1y=~F{mKw!0JN8vZXt@?M{Jy)&8<&?5E+-$^Nf9Ae|JTQ(oD! z_JcOiNwAuAX33Uzql;s(OwUZZ$OYeR+2302?tpZWg-&_t;*s~x(uJ}X7c4KNY44v( zo$EE&wo%l%wn?X0=ZXUlZkcB8LpM8|&UHkw(V63R#=C8xnX@`qlyt5?!s<9i0*Sf zk$>M&>R0TQ?~@^{>G}J+ zAH_}@z4e09apuz7-=G?{6TQ9vcFXj(bMskxQ~3IG5ZWCR&(dl04F#WzzTG`s)es8T zr?7p5>`Tk)*gO^*R$38=kGxDPjTu+uj#hF~4S@%pGIhv2m&qaG`q>ag7I7CP{U?be z4T7$Z#iw%_gHF{}mPJ;H;|iY?1FJRQeU&9^Bw8*waC++`8gdi}j!B3RorU<~x#`4l z(sRCI!*`BNEOE?2c<}-08z!T;iWf+{v0O8HgwLvS>h~zs>=2Me2?Ga`py!|B zafd}Cdp6Qw!=({JZHqMWHM9L�wYH`7?k<2G=x)E1!S?g@G#{z@#~~xFV;ubd3Pg zGKQht7lOvM_qURbM*k_#2fpTizYwaZ_Ia;*|NE(An`z#k4NBAAFCiOF^L$#s^9evd z?ekx$?fLZYp#5vZBoj~^C#yjw6(my9!JO)xeK}j}4B7g6!@%CmT0!VPY_?3=Y?iK* z?!(1ne^1UM2EaKN0MvWb-=6+aq^5FCDRYkvM;k97V&>WK5->=YBAtJz`W=tQHH+g*)<-zTzd>E^ zcw-EStw5 zYZdjriRY8IH~)ME92T-#7`px6xA6Yloz1_$9Ljcc?Oy^#v$^Mw15=xO-cL1uni&5b zs(IDKbMrQ}{TKEArwh39RZDCKasUN9`^G!0;Ab4I!pZ*yz4t>iZSDjWH}zhBZ#RR# zcb<0&gP;A!JAJ{=7I;Ay{H(aT>ApPlX4B6~z38xm@w4;*+j1T9+b7rKkKP0X#2MwMaTuWvH@ZwrBjn0c}I`2bC_=h?<9T?XPUH#{3B-os9 zu7>!YN{gOThZ6~|vALqWGAV2cB@}}b@5;9S3@;{ILgI{#Ecugzm`IXz1wINoAAqz= z#KuParVDkq%perMgX|TI)}3IYIB7$!kX+6x6yofUYMdO6FoKbPQ@hP(0c#x*tqLjq zpQA|@0uFbV%;DaVmdpJs4dQMy#Mv@;qXi)Q31o$0S)w?jB#2i@lmE_!l}^0|`x>#K zGY#u1q4;feR8>1Ls(#Az_-EPkPBbXg*e=cY&V@XvIh4bWmccMJk*{~PagLnN`p?l< zNkMbuf?)N{(Z5**%^dv~v@468w#-p$act)^{{0^m-2Y4c`rj|G|9``Dw!QyN;n?j^ z`alDb;@IIe{x~)fK|lUDHXdq{564Ec=RO?!2@AQ}L7h?@yHp;Gmk&4+f^e)7N~RCT zN?8RBjtzrppdC)6d_XjV>FjgO2Rk8c09i=ceR073_<;L@fcu<)`wNwO1B+>)d{gO2 z_TwRvG!WYq#P0<0m>}MmSYDQ?qoa$rOJBhii|}0Jx|(L-moMt-I)R))BXT^IhnMD* z=j*JOQ>9BWxyUf&9ObbejTOY&1@SC3m-AY^{dgQ_+U;DV7h?D4|Gao7k_}w}&Vsiu zp|>yKUhQHQ^;}gif!pv2V$llq0#~qIaNelrJ=Mniy2S^0v04roQ&x^!5j7Uccu&Cb z+TwWgF#Tu9c$32!uNgk;Gi1Ey!L{7t{N7l9#*B9m+{`VG_ja(~Gh}{8z^UBgco!i! zrUQ=`&ZXt(A;tav9^^^CufkhQzbhY?f8WQn(tSB(75(mm(m=n5{wn|K$@zqPw{q`# zO1@8msz>F=$fJSZ8i0#_e;{WMe!qdomVVz?-s6?;jDJZkAFTA}Ev5e3uyLt=Uvh@w zw+EFYekoHB^@68CaOf-cS$pNCSW_e;^vHT0tx!v!KLPmLH)m?nrmFAQtAEBzCCGl9 zT9QYvCHr1`A^5c&BC^}lza#qwjHCA2>z9NiGb;@C^(-_PZU!gCGD!p|=!6(xHrZ zj>S#~K@S&73Rk%YRUvNoaVvj^tMc3ouF{DMoF~dTDXLktA56vxp?g@0=)yeinmvw( zsKo3v3>KVmh(zwSDQ}o9tv-h0v5hOQj&od{VyMy^R@J-iMG57WZm zg|W6ysT`yph!}Cd9B%E;pnJo;+q2Nw6-G_P_PL0$78B)@1fY#i0!|nrH!1ubCN12x z*E}A?&^pjOUIzM)WFD{H7|A^LL+#UL9*0IokCp#yY93=`dVCW!Bh%xfxGJ#|LDGSr zj3Dp9g_a-@Rx+$9itH;>Bn}E~o+O|7Lu6CA3@kW&k{pNHr+6yazLv0fYlL&T9>OU! zO`fW`d@n+>d?JU))0b)b3t9PXk>bcjx{QNo|c{jfAnmwAj(?(kqVq37{b$(@-G zMK+cBFb~6@%4F0&#Zwus4w3DOa4u~if{rzpzhmy{@J+NkVY-Jumpp2p^0^GqA;8+3 z)FGnrY!x53iT(-pJRNpTvu`nf1nzCUBoXpVaa;^~fI$am>IJwjWS@sze~PdEiTj(W zk7YD$!QP4pbY!^CL@d8B0Jb>1<8`AD%s+|+^XKf7UVue{%xHb`WCZQ>j#4|jpcDh;Lib0Gy~EKR@VCG@ zGTqk0=!junj8Q3U77%vNHmF}Hvp9Dcz6g0=#0~Oi{}lvEZ$a4K{@0U?y@vno_n~59 z$dP=zC&n$?iU9+6I3xV{)RsOTH0~z9-5G8|s0iT?{1YhX%?_M&zKY^Fl7NTE&OR`-WZk3kPNoPg*!xa1=EPP7^jy7Nr=Sqj0oKAr$usjpS-` zn2t&U23uLZbci6DQs6wZU8*p18%{(M%h6QMK7QSF9NZ^$2VbqXQ|riupmX<=ugPg9 zYnIc=J9YCW`|%jt*FZ8j_=>Pyv*;*&jd}I{saG9)rbc`_P1=FMDxVX?qBOYm91nd4 z*Bo*spmPN&w*RZ#S9)G~UWN^a(#=@XQxusiZ!dSvUfGA|t_&NS9S8uywwdu*&-3DM zv@W7OCoiL~;mygC|BLpV=IBGL1A&CXnWH?o^rJgRx8UO^ZI0H0Ew|$wk!q>^NBYkyJ_9i@zZjli z#dbj6yUWsVk0qZ7eND5=GKqDw2_=Sbp_T3a6ZS`w%26BIy|JCz)wff-&p;9Y4)f&I zw;0=P_Vu)Sq_<5KikFkvv^bZOIJeN!l9Nxn+8Ng%cGdm246v5n+ z{&b^1N%rGN@l#4MFm^r-dIM{MUNzgR(=7RWY&A^B3{;X^5Uj18>n%^8`D6ST65~vt z#}nYVr^^_%ypOI)X305^6iS2s%~iezy+R>4uJUtjH`{!7&E(enBsq{7+iJXd4)!%*V^v{8%c>g0=`ACU z|4M2g=G?k8GU(*un^A*~tP2LyRg~a!9|B|A3ZIb=M+ToXd^3vh3F1SDArkpst81jL zIO()j0+!{T*CVhxWo>g`AM3(hr*HD+?L@z zVLDD`XZ7d~j*OE0hI#L7XjDtb`bw)el)zuX>JIajKIV*27n}LM{6l z9h1Mqt+)d!kXrt^rkpIJ4JBQbukFx0$<@5^vZg#;Q~tQ7Jds)&+f8X{h33iEh(VUW zJ@40Qf8JwdqcNU&lhv|1lx;AiuomW#s|OI`R;;DcgMH-E%hl4y*!vd)&?Q;5%qY`?Fa zuQb;mYp&ncTyND}zph?0A0L*taW?RNBlkwFAnrAaV|%UUYrg2pAFkC~;Yov&yEIW} z?TK@ad9eY6CfOIl@;mCW#(84hvGy($#Mi{OJ^%Kr-fODyzJl1DNSLeIF3nl>qi4N` z%}`AkpV(m$w;EUNBQH9g0iDOE*m{>QO4C{6d5_K=$J-MiHU1*VV>~ z27-Ba!G1SjjzgLO^X*cP1q|R=l>n%<@setHmG-E=O*YmC%>uyNq%IC0fSYa-`wccv zyn&yHrpF5Ph6Ydy_6R8X>BRU8dc^C59AvCRq8uoP*n%mPFR~!`!VD&3AF1Q+r&Fv2 z@vg-3rSdLCg!UaeN|yea^X=q;v5hlgRU+4f6pCXseZpDd=}q>_q}RK9uzs=Ts8jP- zqf>SHSK3y%ueKMad)!8g^EdJU#{mZBbfcJH5pOg!+a`SA7^_))lUf{r7D?^3V3Kln zNZ&(mwm5IfzM z>=TyP_;uPSc7ohDNHM6dL5c3md?*1)KO4ewzCdDb8b6i4nZK!>Hx_7wCFEK-cyJ)G z6?kwnG1%7N!ST6a;lV#jql^cIm?iL)2=L%CbRiNvI1YiW!GokFrx_mX?bHf9m_Q7$ zHF)sdufxKFr(t+Rl^+yfRwKiM3($o~@ZdWLR1F^J;k8jk#3|E4c=@))d7oT$9Ywte&WBk80!pcxv;*3OAWCF( zaTQOa!~%netCF7zqMaBsxeeeoAg4jHQe?@Sm1ymOb2I3<^e|XJ37@~&8t*AccgK-z z5$q>oY-Y7FatDRm*qGqPJawega+UpIsJdvI8n!!GyN7-$aL^{25oDgs3orm zoO<&qHTX0#vbjq^+#EG}83Z-tB+|>{gduIEml+UfQKOeW!Hq>gFJFV&T2C+gptQD? zUT%OC2mnTu>BS6DN^;{Yy?{ZUfS5js^fKq3DA3DLYY>XGUcMZHy%d0N5zxyU%z4yW z`SO<)ZKsz@g8Lt3dg%)pdRo(qfuxIUqeBzJ=6u;mzX_*btGXCe2H4}3d!S4h^G0&_ z*E0?4u0&(*QswlNx1eqMDPc*himZgm`w9P*QBJyrc!Zj$_$##q`+2UP?!{_&buT8c z;q9I)jfb5lAa2R4ctP1P(z}ZBtSoqRM?ceKz3O7-I8KL(MavwDIwgpS&}zWkn5HJ! zb#RU&fEoGjug{p*Ok)?Z#`*_0=IE|zOC^kpNb%Z?u`l+3N zwsTs6MS!M7WB&tL^2OCqvtGccQKINif_OESd9F^eVbphr81*RsQDdFQJL;m?M&=}Q zxK(!obA71ZeYn?|OW~SZWYi{9Q1qs09ZzS93jX#2pJ+$?eW?5l!e8mGi17D)=$xkp zfA63AKZC#5!=KfT`1>ZjNM{WH&Ac-r{5_YH{!_w#cTG7R@E7a%{^1PW)L02y9IWw8 zuD{On+oIQE{d&kpjX{jnWUhi_Bn)9Jykh}+77YBk*lkpr&X(n|p#816_$VSD%#{3C z)diH`2YsH~#M_fR?vX+kDFR0*LL$Fj;6@?oL7nvVZ9gI|qLZM<8ZiFOMMOlW@=}CN z#Od?hU4{H3)_6pAxMTF#T)?s$c#|=Ti{-Q1_z0Gb*;xKSW1+xO!Qo9jsVHC=$}w|s zBO3}*4+ak93is7)C`KBJMLf)gQfI+X3Z4CaX%RO`{n>C51bvzrYvgP=3CeJ;bSGQ# z4`Vo-#~o|bU#a8~oI`O7@{y_Oa*eG#1H%G>WlbU|fPYb)b;{wsi@5 z#&d7<)`Tf^Mv)v{V-dGuR?K1_>Ei2ItcPt_`O<8i)ns2f@G=`h(-K0ymWns<-ujUM zt@P!1_9kLx5)hWddCZ*|xhYtjgEtu<2)!@SyzT>ty)Fh2;VR3> z!A2m8K2&7*B>jdGg|K{N%GHh?*zPw%2kn1hF9A-w;u>A#mPTGzp-eICG%4Kd~&&S+(B;i zHnB!7b&h+&e!Q=fKgf+?C58#(ZxEbwGHQh7U$P)w`^=5HI@50aJA{AV;NKBl5l+qO z#B(WdHrhudQ6Ft7TuOY#kvOWR|1Y=9^ez@Bmtp7QLW{$6r{I_{4Li+lqeG@I#}3Vn zXb8I=aV{C{bXNB!=j^LDxhW@H&Q_@oT+qJTN6VKSia|DKv1p_H&onb9 z%9nhjvvT6iZdBeV{k0gGS|_EKFFC>r|H}#=V1*fCy|8>U!DHH#=(gLfxb8Bv7y zsu5wp`?H%vz`3rFfLKNuzrX(`YViKuuc8X?pNEG5Z|hAV;605MwjaE`X3$)i zL8WOH$MkeL#)@T$fOpU&m~uX|IA&HCiN}m9XYMHy8}TC{pE-W$@~8lnBA!dpxl@dJ z7g@T+%ad{2*EAUtQ(pF4#3BQf9Im1sBEJZSCG-|558KWusyxh9(hdh+{K>T+zbNG@ zo?>-y@fekerm+GrUl4Epl4&^5L8@8Qa8dq|1zAPTF?uQ8bOMp{KihJQxicG;Q)-rc zc>z~hNewt|{u2MY7fZ*Ww2WRk*U^v({zUzS6)o7Po}2pOpRVm3i(|u zju{#0q)2^v0osBhwPZH7=46XU-2Ri1oiNV8Yb#+kIP z3eMzw8472%GJNpEnO9LnIP)G&FyYM8tPU<{UrabSlc?a#P#I@_gV*c~XDDy4iZe^4 zkAX8Kqa8CA{7e|4Ak7XSO%7cD;bYC1+atl6zNj4r))*&+z?#9Vu;XD3^l}!aLrX)> z=Q0`*0R@XF1*}^Tnp;CvK7D23}?dOc`%%G_H{l=9uGNv<*Gb5uEwlBC& zIsUEm<2?J4fJHrEHhtv+78x^2iS-yWW`Xb6h6vc}Ft*NA9*VY&8H*KieG>i-P^)VM zEjLxZZ;c0TSvMD9kqK@ckXi(QA>)%eQH2K>XIXa2i{TUL1x zRV|Jst1XVACykD$kK$Ik32P}>{AZ|N0fglb*Xyl=(PdjIm@$@-oDx<0(eR_kl?Ah$ za$g&S{7trrm7daxLjI2n#<|}E_qFz?VZx8JC>~7EJ=|OGattQN&z{l~*t=-`!SxkF8#!B~0P_cKVHATF+ zLN1-lN=e*_PKFEEU-2+}H?S57S6HykP1B}E*=TH*+eP+J@!u@YNKq0k%@yo3tAW#| z>^jpPl8E@%h<`_cVXEA;kLZQ;@`oc$Asm)n3!Pky+WY zK)DnkW2W~}RwxUUUaU~V8sMEQgJ+2ZkP^gi`2Uwv$=;i}-Wsu1cgRe=1YL-VP z{5uLf^7%N0M{fPBwLEe$916rEO{b7Yf;Bb}pWN0GpIkw#L*bLO{@(@)9kd zyb*kIGV#d?GM~hOMeke9K)p^R_u>6l8EQ63g{eQg2T_F=yv5jh$+)5XRGNnm$gHwE zN-{>PymB(i!{C*Z$A;pSMpo+2D`#DM=JQHPuky;+Pc-}^1jD!&ZiN6kgc}I+E9(YMEDN4kL?`cx8#B6}<9ySnO_@SJoDV;FbSih5n$6KCd*3 zIwSY$R>j?KF1fH)_P=8l0Oj6gfD-$`IMrQ`y|*#!mGTtuu2pf~{mF-G;%tLxgKMwD zH8BXSUI$J=|CI~*dlvQ@QoTu_^G)f$Whmi(U%iR45BUElIJ#RLd?JaiShFKVP}c*R zE)Q6;^F^>{Tf_@^vC+i6>VhDJx?5EFnXQL3eY7`eLd-Cj6GNcBjpm&OSSA-N7*WS( z>*4&b=UHk~X1OlT$W&JYkm__Z90`<45m`~WinYYN#aO|icRh_uo_lq8h8gN9nt%Y0 zG3MTtY3nH!fx%$aQjFzZ%@sVbx?^E(r)@|CXvE#p9*9$HIyi_}Z|9h|?K@)(<(@%2 zXZmW*3DW#x4Xc!wj?{ev&~cR_-gA!GgUpgi2JVe|d-Wdo`OYy<4DYMnKjZG^9J3Mk zljP@H(R`60c3IWkf@L0yBi1=;&6N)PWx?_29r$vm--!=aVe1#Y5xEJc2y^y#J2=ZV}PPHljTch|LaHUHF zb)n|t82eT%(Z+UhxgSOWmR@2F6&`DfU3LtD9kt67ik72VoUJ?l>aD}^H^w^Hl;61EO1^GPww|vaGmu;s^wf5#N&JCY zqo%OGtBc@BM33E98d3d_dpCRcBmT&T?)PZZH@i*2+LBVYGmeRKchTI_V&`;PWx>9hy}uw*1^!{e8K`6OTndc+PA5XrYD@uyy9VCIPN<*$EJWOCjNqHWs#xbh=1k2YauqVa7 zE2hN$;~>t|=qz}9%C+zFrK4!@R0`FCtdGP}QiuKYWR z5|`llO_Sx{>3ihg8Slxzv(h>Ce9mR^?_5e#g8J60<=;|DP=fo#U(jzwMmc((lEyB{ zGNz;?C?(~uFaGgI>SboM2wQSW@(*w;YQX;hqG9tpb5)zNYFy9Jeg1o#{b9P`^Y?Qr z{)DUbcVKXMVSX1>dOR1v@V#B*8ZAG5k6Xdh z<3_*7wXRF(F@5?%cJVlyrTNMD^dOohR|1NWejuBT03$@@n=*!SEAqf-QJ%}n4=Lrt zxfKKCasw;ht&|(N6-jcrz{;zXatpWOTbT7|XDlm!LMgwVTX8@xpTx?^Q%2vt2|$#~ zr=xt{d@7s4t@wvrHjB!pQP~`B#iMfBTq-N1GAp;DQZ6f{vMZ@V1XQ~H;PB;th5VD^155kmp;DA zOXl_=*gVJRK*o9ZVEN8{2?!QvmKlg5uM^LQyifM!ab*eWIqQ8nA@`&T$j=F&lxu2`2g?pd4L~MAfb%5QPUI<-A01cbE|G;f!*8fgzrp;HVz~XPZ04i+b|3?6M#8*oNYn{TM$l-hOQIf-XF= zD)qY>``IEYLdlU(0y`AP`=vpvxO})5W%mpw zt)h-;6=R@PT%yq`Xs~`-MIF;B>h#uOcqPVqIiD{r_yu1#nzV}1idIplw_OYcN)T^= zh7#2SHnVT-sIhG^^_GM>pcGUtCG_}H7zHZpek*6j>7j&8fsJAx#PfG0MFylDZ( zk-JO~-{!H)ZWaVJQcREYGlTGw-quL~$8z&D>$s1x_JJ)-HV)arKBM0~#IG1ag8p0P zK9{`{D;xnw^E0Icam$%#5h*#=TV)fy{0r}tO}vz7Gcubf4F-M2 zGJ9>JKaa#`{EZv0P4pD3Yv_I_%_f>u4tqqliPrnsL@c=^o^?>0=(Z@?L@;_n*hDp| zO$4JSgiTbd+C)%YL)b){&e}wznuc!^T@b=1ii0h*z|S6n2d7DUXlQ7A2+C!5D3^P$ z@RIoai&T3kYzwHUc(*KP_}6ZM41}~XIg5A8mJsBQYz6%pqS((05~+Y$L3hblFa{Rm zD#!}Dl?vtjuBdV&?)=T1QS{tv2IYC5`^=n+d}W9+mrbAUDD#>=Wah}G&v6WZ%!i@O z%#lr>&y}*_%*>HZpM6Rh>~6)(2{L~aGbhOWQOukm^XGC%CiKJ4{5eN1^D}=s$z^`# z&v%4R2$Rs7KOeT){Mqhr{%mT_{Nb6otf~kwe`Fm&Hi7(=gb+5+{;+JI%V78@>d%e~ z6dMT2Lx2tBz8lH|bcca(;K{l}pt0lC9j=v)8C7>6UtI{@K`sW==|AWW%m9*g2S0;} z=?-U2pXMxsGy7Q+@gjk-BDCP=-63)ai}!K>Ma&k>q9AsJAl7KYI(lkd|wl z2SYr#hHq(ES-=@cliX(?si@=G7~V){DjcwRN@;{ADF}1k zXNA!iY1nk49qZ8#)v@*rbF6n@YFgy>@u7y=2nS14IAAO0G{rm4tT)1&(-jy(i{m_x z4Jm;6C7!}@W`3Z~XTj^?jq@3>>Xy0u(91&LZhux7RowOZXu;dkh2mp5?~7kJ7wQrE z0w?KxsXuy_|IBveo`covQg;vKt}7yT5Uqo|SvN zpF({5JLjG3+kK=I`t}L-ZJYzruk^wX#ZB%@@Li=4TUD{D6IXg+ox3|uU(hd2LKw?= z&=%Y=In_#Eyc_ac>QK`%&pu-G`%UrXaj%6p1G5Xz^&n<-IV+SWybV&l3Hr5< zxZ}O1#%9|P-q;TH3kRD^E(tNXajY;J*xbbUnv*$m52$o2t`BddC(aFLq>C>OG1A*u zVKheCDw$KUUmfcc>%trBE6S`ktBC#vo}wU(UCavGjIm9Q(>~(Wcbmf5nyTjUxGt7}z_6cXCaiK=~%>WvHG)CIYTwY8g z3S_m+Zn@&+@aA$Q`re}EcOe@~facdtGr;zck5|9h)YvAx6yDgLLl0XV+nDqaXgY)y zwwVf>z)|~%U+-&bY>QqDZ)_id*SD<6-U00=hz2LH!f0Tos}lOO#;r)2D>|C5$(L2p&xc5kz-HPzNT9P8T{^bCRQ9F8cXHYX}=<}}+T!J(;km&)zRV|LJ(X{G&qL>n}6 zHF}&fXzL+3oD@|I)Syx%H;rYpPsrM?LQj>DZE_OF97=>=#n*b?xzZf<4ch z*hx%s^-Ko&5i(HrI3h7Gx}B#%x9&iU3lnrYG$ByxH98s()P%o1TwUaHY8`EUa-Q7gH02xnl>2Mxp3WV^ zHcN_27g$OL!v?HE;(*SgOvkuPBx{ne?UM0@gOEtx`3!*d#o{XHs5L8{o-JaAncno3os|^i6kM+dLq$8*xCLel&C~-eYv=nSt zI|4-!d$#j*5K%}5@TT-R3h=CtnEX0wqQ=`OAbRLcRiL44mm0uu@J>7m1o6N0wPE<0 zAl7;PjJYH=n)Nek$E#lZ$xtzQ1itSR%2U9tnNYTJ)c3B^?+N8`MLxv5!`Kc@OCC%z4Iy6I#<1?FxZRWb^$3C`=7KU^ zV#`<4VARTDKiNI|=i?z|H>EFS=p#^KPi#VStOjBb`x_{I2mgs6KEMj{lk>3Pjkrx` z{45f3&=R}Y7p3UX(f=aMP;fjUzxTcs@^-sqgg-buy|HFfz?_K5H~dkZkoVo)q!(d) z06WEG1Bz*@cOPKjcsM=iJ8MbM;rG51G`!7CP6p{C((E3136mI)nwguVFQCq-a}|JR zZ$GZ~fRw*%^gy1PUNkkGrNM;eN<+Duq(5sKQX9l?sQIT8@kWe?x7K=@n0%-D6@~y# zc!1=u2r>d}^Uc4`(!84%ugH zx5GL^a?KwUn835&N$ThQbYB@J=hCMElg`5JAITK5Uyzp>T0mK*D@up3SOTS>0$g-u z{17;Kr9Xk{9Px$pRjA!@I0!yfdIqKzeJ%;SW+k4xT{y8Jl-@{VqB$3nJImd+c9m8E zC+*3{9*fh_IS>AC37(7k0$@Avdnry|-yzdZ&ifEc&p@TYre2)8{s;Wqw&6)^hLfI$ zLkolL?uq{dlj+%H|B;*b=32d*I#vQw8$t|7qbF!#EFe{?vuimh=^8YR%LaV4Cw*1^ zPyV)e-b%FWJ`dF{K{d~Ir2`F~)FXNEI#2TLc#NzwAF;6ne#-ZaFW_cXzEOquly5M4 zxRZ#;nLLYn0dSxfPG1ec&zW3Ak31JG^%l<*#JG#Hi9?9Oba6Q;vo%s;hIdc4-*YJ6 z>7pUAM(Xcnk;>TOGtv2+_g7;ov!Gz-N+-He^p~x(d@K~vH~r~sKc=_!#2zt` z^S%n8Y-uCRa||R~&;522h%6W^u4lob(30zM@NoKd;tl$J?C5d&&8bEYxreJgN|xTx z_rGONF|z(Ns9y9ZiAI)!ktz9j*|;{bVRp8>0}!w&^~E53Lr6jg@l`em z>IVU(2cerkVWKViPj2rpaGBa03`;$mDKJ}LsQKD_0SFz~W-Z}=$Tn3PhX~A;7W*|c zEujVYsx&%__2_+@sU)e{93x~2t$u-0P$RcAN#}5qpS1A7EUqOt&>$ez~xEHEQPObgpk;0n|$^-~v>I6Kqz>874-hg)P2S;W# znBQ!$EJ6HUho z;%@LmPwF}<2NN7ZX^(U9%#txl5K+N`J`vhlpt7KFI^9q{1b`>qlj>m2-Gm+NFi@M; zWYm#Djxsx}9LfedW;@rD`YyF#FHQs@)fJ@ZJ*m4;0L?azS^L4nz{U!j&a3NyuZzcW zZ%nbJc~V#5UFz?&#JVxm)(YHHOE*G~QC7*(VyJ#nd$7o@8EJ|Fbwv*3^#MvlmhVX& zf_9J=I@^$2mIA)!C`+WiQp;s%`CS4`w)7IHkv0?uHNph} zBAD|ah=8T9qj)SH{@w4y1EjjgOI;!E;R^zs=kn_w0rE)91V%Fx8iC%hudav(RlSl(-T)AS!7T1#gzy5&i4cD2BLsm6 z!JraC5$quJ0}d4s0&5=^={Z|Hsf+1Vu@Xn-;%k+1%krJQIuWQf7o}^6@YFh{as+W& zJ*j`di#c1xqn=bVHG$SAc~XCgOR&cjWcloB|IuSjfMy)u3u6?W1Rf!0hg1t))#60h zGrow#mPl$jKbsO-PMy|fyWWc!Aua?*GLLl%#-YHUURh1NEBz;(7!+)j*De1~c>-kL6mJEb?7nZ%Al(3}JTQ;{%n7Ie9qwNR?39Y5~zHeeyI zX#AxQKvv}J5gRZM<~O$$QK+9;taU$08MUUPX&Fvpcb~NsVuC{yL1u%A%*aTG`n(l{ z!ZN`@ z@6p%yO4jlG;cC6bIo4z0OnVBQ!#kUuy?)H^Y{jV|)dEuTTDXFSB5o8`U&eR@t^f|0 zMoWIf0_^=Ho(uj@IET2eGy&(Hqysx@-JetHq>l=naoh6~1f*d#*^ebJ?B(Rac#^Zm$AV28YvNqwFIav&4gUCrmi2>h zgQv-OnuDA`?>HA>lYNaD;~k0YP-ds#F>|JdYn=VMqniivQ><6cODJ-V*PBJ;_$i=) zf+CJu^7kxga9;hD{aE*f>FbiwCMAd4YW)%~?frlD&ILTG>RS9sCKJLVOi+RWM4|+Z z1~eMf#DHdCB4=cx;1l0iG^IW&!VC`;4NjsNj&n;NR_*m#TWxDwduv;Z;4_mz5?)H6 z3O-PLRL?Lz@C5;d`Ty2F=S(Ka1VnAW`@i4ylbkc>?7hy~Yp=cb+H0@1c1132Ymwo! zRjykNL;1#^ z&~^1K#?Y_!#6$V8UDtlM`Q+7>iDl`bv&I>>Q9LwhOv|K_9xEQ$D-wQrEFN z#cY>sMv7v#+CNYPa+MPl|Okr?~CIQBfM#kXccSbX0i>30hwFLr*?qn z?CYjFs;Pu*Wo})Pq>0@So+H?Ir)L9NyRr<#aGA@%J{K?tPD+J0JdqnUKze|*T&%61E96*o(L&iUT&Cz%JKp~ zw9u4%rm8-AQ}h+;5g49Je#es7PuzsTdr+N-5oq;sEzsAy!_)d1+u&(!<_@SjG@kdf zB1P5nzSt8t?hs8lE&5Xh<-B~Y;?sE-dCKOh)=bGYPPEX&h;oYY+55@Z368@zYNK8T z)2iW(?p+()!EF|@q#tMjSuJ#4K1qK4PD#7L(NmLh1wVEc1wCtSRp_||z5Ar0b(hN? zbeuKGBr=bQNU9X6jY=t}J0X{*Ge$}d=CrDAOmL7tQ_M^1xUS0m@xYf5ss|59aB+>N z{KUYOJ(ysvRo>i}xcj|iGJh>5c;8|IPXjz4{az-7mK#}zDuyWC$V4g}Vfc`030`P8 zTJgf<&)|i5I~6aO>F-TmxG;$qMq60Qnd`&e zt?0leOI+BUC18Z>Wx37qT*4A+G5zmj3B^HGdYg}BQ$chcx*AUszvr5^CR0yWsmGJf zHJDme%G6F43gq#|z+pxvL(m<*dK_ztl0v#epw|f`Z*U!73m9H~vmDtL zx?rlWm_z7Vy^(zmjwaJ8_W6(U>8z@-B1fvq#%Bk1X>sP{#%#^eu2r-I-j+J1UWyDe zUO^qOw%yLdY`pqi`3bW7B#U@|V}<-yc)k(%*sXt#*~Rz`&-9k)e=A;3w9Wsnln*7! zOS@tl&I%9M;p3FNQ1x`5{+59CX~nHts7kBWv%F*&^~PH#)s8Pq3vm2gJ3qX||EShq z)EpN~r3uEJ=&ZE-3RXo(p6cmmhYCxo9q)UCE!mtt7kIjKwKsHmnsI11tQ`p~z*
      j-8rX2y+yeB(&i)XiBE!sAVFA3Q#bC9UG|qf8#hP$Xj+yAK9YmDpa* z1j7Y>_#Vj_+FCDvk4rm)4@w5+-#o!j?dkMvc%guK^FqW|wa#IHvQHT(_F)lVl4j8* ztTsX=@&L5S-8V>8`CRlO?z|N({*mH%7c@>F+1uFpeO*sBYOaTy=k(Qr(F||J3xT&t z*;W(Wb6TLUH+*IWn}30;YJ%G-y=Uxv5^^<3>BrOOINVECdW&ChFP|!Sx9?^g?A%g4 z{KL|XzEM%JQOq#zKp$l}DEa(xp<#h(9rFQ}*sYF~)!7#1XEjE(pjuz))&C()xP)b$ ziTxXj`)y)HeSv?{$6RkCb;PC;{$oFC#(KLTnUe(Nyi7WYRVTa^&eruT;*l; z9In3Ga3+A(3KWbwGtm3uc_)JiRD7bdPh`DayjhFvari3U_8-PrVSK&MlI0IO<8e>8 zGTS&Atyfhx3Y@|N-e7AsNBc!fg;iu+v!UUtdsZRe-*|1CJ-RWq1wK?_NY(xWwG|h1 z)(Kg4e%G~5%#RqV)<5VWg$l&oiOCQ0GusxP71-&GuM#=rb3{cBZF4KDy;pxp2zxH- zk0pjqLJUomk0gnqlM)|gKnGvo-HXN%JVOjU3||>RGm2d;NkiVDcx%n1 z^2`OGLXXBrH<+Y!^6HhqX*29r)7IS;hrhg&(qz znEr`c=*(;eNdec~*yX0BG}M=V8(E8u4Ls3XqmlqbF(76c z+gdh+Ro}mbp$@vAYs$y}Ah1ii7|~*O@lk3if51+Dib0oV_4It@S(Bot|M_b7o}Sy; z({0wv1NZb{z&CsPy4SuJHCY%!LH^?dJEYtmR= z&o@>23!=lIy1l42gp4LxS2Ar)l@&#OqiKc!odT?v>=msp-5Aen&+k-nj!UM^Qk+&f zaH$N$@uCqZ#^1LnZBf$AdePUiy~X1SMbVMg2Oft=OSvxRAFHJRhUmZsPeWjfFAsX4k9L)>Ai1d#$e7t&Qp_h$~Y?KF4$}rmCn^ufg$D${k zGxkG9Soq9rysn2EWnHnIRm4lOuIN`2+^wWV6;F^BKDDVTrqK094XhE( zfca~JQKZGY6jkeuh(NK{8(Q&8A_Pjb_C40RBip}FfTCh66+1MxGGTK z<9TQ1C5EE^E=|7;ZaQ6y#2q!brCfG=Am8<*r|=3{L=>q-L^j&=)rB+s!@yC#c^OIo zs(|r4PHP@nn{Z?TO9;dP4EO0^dkI0B%L_aCbdThL=Y13J;lE>)up7_;)6Uo)C%3h% z=Zq)>z9~C7CCN3vV5d8f!(n^1H)p0{9?OcIZG0rEMyQY46mC#= zSJ4z&=p5$gHe;mHJ6&4%qFkd2Vh~-XFMbsH^=L*QC)kz|Qa@TI=M%JpLzHqIl{Gfo zF{zwitUl>}vG$RI<-mVMwgdXc^R^6Plm+|Cwr`h>FSBgz!Xlcf%6fB+mF;`tEt7ci zHOk)COIbxn%Oz*1P_W|SY>t+}L{>u$bAfnecHkowUnfnKCPvTVUDww14(Evdz{%(V zr*>h!nn}{FsW&lR!pF)K2WRVW{++U+OQV&6GHDdn4|nVv8D8o8FF zVQ5Fa>Vm!TitKL$S856H>ND&is|YprDm8>MLbbrSO)cwb`cq12n>v7$m%l?jM!q`3 zQ`7Og-^lD-mL^&p<*ifr*y8H}-E2uJKD+G2ug_;Cy_D@XUQI^+w3C-RUa-D_Li6-` zS}(g=G-9B3Yjs1Q)3UM9#^aX z4wfdeM`hCFKZWk!m?r13g0g8cO+m6~;^9Z{G&x!o{g=^1@~x?VZsmD_H>bL$np5if zr=C;9=OLa~!&_Dg-7>-fFIS|GeT`nUR*8J&XDBg$#EM$)&8zr}YOFX>0y>>MZ-Q@O z+MBZdL;^?UJPf=(%gbTgi?YM#WEzirVs}x;nnV{Bc41qrpC=}>?LOFc$2`juf{nqx zFtFH|EM@SwyUfmVh8GNo9V#oFp4@sj-x6h136O8ep{aTEK<$1E^P9<$h%O^nBD=X;*mSKGi++-bsHu2jZe>GJ>^TvC%8^2D#F2sv z{t2vqxhXI*#ZP1A2G|`>rAnvrqllvb8^;4$PmB3D@BxRK_IU#;%dRW(hvg%&yM&`f zqgB9xsbH6G6z6CG%&0K_D4X=+`r!Xv7f+a}Np24ZIUJIDx#w-dci}X1eX0eo5-!2Z zNS!UIg{I|_Od-F;UDWAYC7kBZ?0h6T?1A;*cC|s?T@UUKtEB@p7t_ zlG4YEj6ZcPZ2JYmclO+>=E5ejB*^?%+F0f;@;hXeo3!XP2M3Ked6{r7lc!bO1OAa0 zhz)s$>~Ajq;32FL*o0pDo@EoNUy9uZhkO{+z1%7LZ{Z7S<9UB{D6`1mc-|oHSeI@< zyJjMNM7WN{!z{|d2eSNRNXwc4ewZqMaCN?{a60F^&rUNgrF9~9OS*~U$~3mu z_y)Btq{MNhDUR)zN#dA#EG7`|Ry|7`7l=7W!^~Q193}hq9{gvM;Ebk6az0H-I<{Fgl%GGjRgS@$}+{yyiAa?=3OZZ*F?@E4G@_Q=3 zr}BFSzh`KUH9VTlqaB)~$xCEYVA+zihVl`XH1!Fosr^LdzL@>TWF!p^nNRmZpS!{$LD2XbKUD$w(`V9#Lj{!kM6GY_y zK}?*a#>tS>IK%CyVduITP_sN;f}Hyrhef0UbZ36Hs@);UJ~YYUlGGiNUdUz4dqqlr zgL%BCwEE^x#Fq~hIdz_%|CHUJpe-uYN05K$4TGAK^Te3BVN&OoG2b;?KD(kRL#L0Q zr{xFC8*?FQi0wa)&TScR(w}E^Ay@#E4@HtF!wJ^!K`sQ!SChLWl zHODH&&cW?AFDq72yu1$I1mhCc)D|y)W%oRMpi^1QVtI zxL`EXKOz{-@#hA2r~4&i7<0|<3LR;3z1O4i<=(*HR_DEm$3uCnZ;2fi{PL>+Rz_r4 zt8=0CR-Zl~q3kD_sw85!@_-h5v5nzsH6P1_8C#K*XDP`B)7SXXGpWZ{LMLYUFp&l$ z`Iczj%dWMoY;GBV?-n}`J1>PhLg!`T;I4&!TEK`4pOsbf*&ne=e#R?(kFU59Zw8kZ zZ(ZWfcQ<&lOSHvt85y@4l-Y0@)r+@Kq91#Z~kl4t~r_XzcFeWzEAyK6rs z|C0G0HP+TMY9&w2;ty)^?xfG>Ucxt3;NNU~+r&7tTlZ$-QYV^%YY;la;@x6Cbk$Af z`!bJDjpyC=B_Z=TSdZfoRZui$KP~7rq;te}JW|m-=ZhttLUzW_FT79`je=MKCz?-8 zcP(p+^{-evcR-70!0duJXGFHm+aa0hmSnKU`MN$iQx)Pjgsfd_)z798 zT`N9IMK+;l`-)qA;jp~-6|+fwkKn`3{Lq~lM5)(i=en2p(%z2^+L@6dKMN)<@nyds z%Q$H@dk55!Hp=ni!B~1=ee4Y3nRA9Jl6k@tf5}111;LJ?^RsLF=7uL0#8B$ZUpV`0 z14v`TVgZ5=EVSJ;2W2KKoh7g#5H>uZfCR34J>Lo}B#By&!1S5#(7y13{*o~|gOpz*|$B6+tk zT?Jg&7++pa@3zIGTZPnmz0?+_tRy*toJvd3O0DP%G9QGG*mTF(L_}f6-`t% zQPD(I6BSKVHBr$-RnumB9TCyiypGi}wRt6v;xY@8rVE&Kfh7A|>@`XZEVaM=ci7$S z^*j2DM{)+xCZibT3m;^C2RtRdqW9PUBhG-m>Up?rQ0+ zlDE*&8W`F2InwCZi;xVYr*Rtdfz#@Ms0reR?o;}i2}*B}?XUWrmFRSV^BJp({*1#C z8J~qbkh6egES4!R50#rrWCIpsggMU(`B!9I{W;DCbvwmt+pK~97|Pksj7t}Pwv4v4 z2&)U{!0H7=+!Dg_FORtWx*XqoIZOU_nm#et@7A67T!|1>n}z;EwcrZbZA|l%Tkn1$ zZR~0lerXJRR;@{XX{y5_(khO?AD`?!N12MXLlo;Fbl1%n&|U1~P(u2w`R~%zIL+N< zR;4#kpVjPPLOub>A#mU#gr~%*;}}yZyAD@28;7B3F73TVsox}Y0~F)h32Oqfzv?4k zwsAU`g>rty1Mu8Oo9T*&xeZ(I91q8klEbtQfs2t35w&n$k$elcZZz}gEToWKn_1AwE3>@r`~+_d zyKZ7H?Ig9PfrupCPxCt^@R8(LDRdH`ciWoljJsQkenA5t;sZ1g>(5#t_oY!*?g?Z- zO8A9kCw3tf^C7Mx%8u%6J(mW^T+K*ghAwTC`B}zKi3B+>#DSXpLLD+OPh*Vu!lUnm z@*e#&T!q8erI+J1EoZiS9AB`mEpZ3;Ip@R{#|<^P%UN-*CrLM^e`ZeYgL$xACjN?! zz|pvJW@@1aWr7V|kzW(K;&3f|8#+((3Z|hn6rAYGGQt_s1(LGtN(;tHUTWd9^Ak(i z_3W495>k*6y3K~?s#kvJ2!f-_E-O6RKc?*BbpJ7~Wp0#(K@}V34=!#B-<%#ETvY2j zH9ym_7dMr_=aSI2Y-oTSg=Y?1v5&9RW)mB-N-JI;_(DHB(^7Vi7iG6Vl-)xr)|0G? z{TQMIoGXSp(qimqJ0F!BmYmLe<)#lecXFeJ?v!@MGW1yJhuP6X;lc6|U(A7}>c8Ym zGR;7huI>7Q)j7T;)wCkl7oOmNx82Xl+~W%$Ug?dzlUeOp%RJ{U8|pv3?2>eUIoeQ$ zC`6u$#`%R+Y{t45?-4a{?qTjFeLRj;?rhIV`5wnhR+)L*M1d$97QjLf$;Ri?SNuib zzab(RF8=rt(d>^6ew;~Cl#g@#ITd>Yv~xszzS+(ZjdDXfNBmiCXy=Frx$zahVRfk% zzHor*NTQ%e;i_|3M@=Y03!j@I^d$D=1>>nN;_(^T)a zZ7mPK&W^Q7zpi*zVjILi0}dnqiOi|S9bzgF!=7u|rpmfoGlmB8`8rI%M2lU9BSfav zx2P65RoreWNv3QpObQYvd7uO{d|G*TmacX$?*k)8FJ;_VUCsW9`I18FB|1DRp>sm*Q`^(v<{SB2fDM_=zOvd*V(>`~0CuTkZm zNGd0IFqF_X+{+IWJnrp$sqm1O(gt}cc+Bs7-`NISbfZ@!UL@hq3#l|Q@vd}ZH0vL> ztwzas>BCpe4vfg0B^@XxnS#X&GG&wp4l^+XlsNLQHNIeq)Z3VfRwp`;8No8X3R6wR z^nRe;>uk5+{%b&5JSP2Sw%Nk{&cr*ZgOr3;Qs;+>=c>K(LT|U~oSS$jbwntdbxun> zS9Rn?qRtVCcb&MomrIOQ)RB0_GAMzc`BKRH&Q~`2>$ob)`o{KCX@@DTBIn9=c6!l?C&|K1Z9%I zjG88lCpuwV*ab%41HlmP5jZ6M5Tl|?yzcr*g8GrAjWwZkH8M=&QxF&zRqui@AAip*u#$H^?R0=u2i>2_{)RQBZfA0wI3j*&k{1$R4Q z!xu+SmdAOEqcacTI%#qA5O~<{#P$~`$M&~4`X@m8zmOU`%Ee zL9Uk{HqLJU!cH3hP-y%Ei^f+8O)ir^7YU8M7LCucXgtxRacqo5+moc^Sou>Ve@4ll zBjnFe`7_v}?Eq-&@8f#vQ_?V~oW#ALmw2q^|BJ$l^D|g8lc}qN3@%#~@^079n@Z!b ziQB)xZo)|a4JO%ZOtN1o1iD22Tp(m;;bxM3vPt$zMfTVjo6sdvGP$exdAK|~O#U2V z61qP)__L%5sLo7IoI6kI+IcHq(j@ZbTR4_U8}bQ=&rOb@Co^{GPW@FCBfmP3YwZ22 zJy}IRLl1ju0u18SCXSR%P9XuDX1_rLqJ`O!K{L%?nRCKfq{a zy#H%y%gNigm)O?(LE?4p11BWPf8Q>@Qp!I`dCDy3-c>h?#RZigHY>a8rt{mYXI1O} ztS)}vtG^LDwwk?Nolxo*jr%a7(Il2l4tMSN%nAMp?y_;2{!^1OT5R;Pj*fhZk8C&F zO+t^onC56LX^Qs#N{ITJ|9UMn;uFkTv6(;&^wCMT!7@U=89tA2pG~eiek{M2(-!$} zBoRQa;B7oI;R?`46;L|Ucod-0iFKD#K#=o>{BLCYLMQ)-FKGI{a)03hSKZG+So+VW ze?d}?NoC_swZoCaXJ;5$ZNlP842dwf0Fbfs2;=dFFU*jI$#_&oSgl?cD0;IuT%GPM zZq*!ZJ1-*_I`(G61Q6A%dghAu;{Nily)e z+{?3fx#HA!n2|#zy2`S6ub0Qc z=y~S_$R zv3bhJ`cU1J7~~1DzVi;RVzX+h>fd$Mjg)mc0FMt(#aOl0xQf|FNsVO`GXC-)pDRE4 z58V6jLjwGs8;}c(Q&L09pJXKlZj0Xa7d*1Qmg) zB*rt43=D=KF;P#3rHn7{;Qkh2=$a4^SVfmA1bIKIerLK zMS=^uNsh~97g^s|kK9&nj|sU!vWju@13Rr)^-o0*t!)OiPSG(8n6Yz2bm%WjC-@oA zA~_`4K#hCX>opTYt6eZUqQ5xKL( z#^1RYvGFIaN^HFR$7Hebb9t@A#(okjbeA1XSZMx#5Ch*BM@xQ45=U_!P&#Od#DQUB zkOYJ1GL^Dvq)D0;@v4?wYQlc4TDgmuwK(bdD+w|oGty`LP{YhvkHobUF1(M_YG9gA z|4eePNK%w|OYQg)Vj-<<|FhGL2dE%9k}^*>KK_Mt+5on{R{PyPDu*vjH#YuGjkw`j zu$8eT00Vz#Mrx)k6Hinn{9@<7OY+n{&(L+oNvK5Mm^f7IO;0Zol~Pe@M1o4!r${>| zDPe_HC*U(_(W<_1^mZl3l(thGI%=Gz^ja}AN*r$N&H;Q?i=*4dakP5B8h zCicHDjsC!Lp0@Bk&;@00D7&Caj6`c!+GIA{nc^(bqnUx1ijY%2A8#<;tr;Naud<-Y zTlo@pzYZ-px`|hE$mncj8NySc4O{mXS}kJ^Q*>%S-5Y`2P4Fc9=O*9Vb|rY?NNOnq z4m`dc-9yel{QiG(HDy-1iMVRV5D{PDoR5)P@w{}JKm*dH0o}eTW5^j*B4ADFMu--z zrqgU1i;YOZ4&|((j7^yP71TfeLqYu`FSY1HqI>DAOy^QjunS72b6^(pC&(g7Jl&|KJ`sigqs1^U3gN<7Z!iv#K{ZUkRMU zO*kKzaH0ZdKx#OF-r&>;oZ%)MzX|6ifwQu2N_-~t2Im2RGs1*(w+SaCaBfWvCr5?e zr=ZV2(nz#T$eFX18;G-#OZ3#9K%h-~ZZ9-`oH}ar6fh5%V16TDc3`WwX=`7B^W)y& zEEPDS3;^d=6HdLrc{DYgX}!UjEpTMt4>*^ZaIO(JoMe&;pFzFB(F6``DR9P_a3%jSf0Ur4*sQo|Y48ytg5D{@UZ|1jZf6*wIJl#)IJdZF_M zfiuX2^Na~+mB5*u8qWRug>z_6I7O-9czc60OYmX8Qs{HOiO=PN&o*R|-QV_=ejl`7 zID>n_xi2-Gb`=VrLdI)?Po4>9oQcl_!Dnh}I6v+UPLaS7ry<%k*n~4e;AE$UGp#o` zX#z*i>Ja|ftH#9_T%wK0ew!}#Rp`?joPSVhMZO7Vr3q)1z*&$QPJ6#z_~#LUGt`9h zGZW4|0;eQ3oWJx2r$pLygbC+xlRl$`J_cqzyFK=mcHPt)oP2@9j)meC+ma<2nYGDyv&L2THw9@zzlA8Ar+W1VcFow>H*KjH*IXKh1G(y3C=jjX zPqqHUt_}Eys$9VY7%VriLx%TXv8EM9H zRx~K-V>=&T(ZSOX{twmt6Kkr3~4@m@+u;(x~Bo+3y-~iKD~1~y|XvbI|H?fEw1`W zbb2&IA+P?}UbAyp{M(&#a$9HTq){@S*W7A$jyF90aSBRgNjUF_H|U3Pp!T=Y!7 zX?(J@bCL3`xaI3t?$w5(@AidHt_ffO`_QY`?X$R`5tl~^kgte9pjFZTQhe~lKAR87 zux$>~v1YTxcu08D^Q%lAn5lT+1+&A4y$%oLDPyDmEc4Oxp9>GXV8mH>L#=TZ4?y;< zK(MTwNQ_<~wTiB6z7#CNz zgCy;hCGSQL^IP)n^Tdd<T{cvi6Qm&O1tTR$3JAt+W3q4*pzo_MExiMGH{wD?-WuZ@4OZJdXsk$Ph3}(&~smA@wQnp z!P|v^wt2gN``A;dsQ1mDnZ6_{Oq!X1*ui+-s%D4-lTC}~UBazJl}aQHQA2r8zC!c= zicL(Yf~%|y@^Ie8p9+_)HSRZG47Rw;j2*!0b`yZ$92$CnNJy;}3!G)Uu>D+|4zdSG zR50S%Um>U+#j5|KFEV8Ee1{7NY~vEvh8Z)cO$q;CadT+JOs1?S#4kL=hX3->8EFSV zBJs^%W~BJ$tL8UfG{3n{ee-bR0|{14_02H{`OQ(OzIlrI&0_PLMe3WwjRn1ZbNOEm zuAR@Pr)cL<<~I*Bzd2ZabA*xE+c!O5@0+IW$$1TH2-TG*NLL<7SC;O`Fbxz(b3<$yiT)>D>squ^r`8v8guD|`s1 zRR`nMsdFmym-V{~8+hi!afOYDpB2gplJY}&fT>ItXdv95OqOBBv1Dpys5pJ1{3W|bt7$N+e?mj!$D1D z`(eIx=EX%^SWWLTWDfmU4Vg?XP&tQ7Sj#ZR?nONA<4{)LRw{Zz;PUCnC+`?xk z+WiX!gr3svI0i1zU*-p$PZV#W=g-3zAU4MA`2ac*hvU%mq@JdZ-R;B(3*G2*KL`t5 z=$yncJ_qu5Pu1V@%o;;i5r?iCC$9IZaU;#f<(iEfsv4JVOd}|!a}Yg%J=)lIS1N@l z1wBik=OU^Bm1!jX8m4pyJ3I0%`$Pj*u?F73b%g7#8kN5iG4ga%jlNY}fNah?i&ZgiYCYF6nEHf3B1B?egGbu<$RV(=J9kv1OAB=!op6=EC zRMAS}Gz#dwV)e~eStH6gD7C-(NKEzHJzVIw2f2i`EaPbFs{@!h(Zpx-$r!$s+!HtO zj7bKZGJD^~P)$zJSJ2M+%ATI%a*B=5_zx65W4VCODO|!@j`4FgpoEVKWe_sFWE9dX zY9PW?{G^HNjW$-E_E6leA806k0_DDwq1c7a4q9g(j@O0GcbjxxWYYOgMdyLWbDx;) z8X$g{FB;i`KMA#N2QxOdQQGx3$&~)vTIq7x@H!C5O<8F7`CYrEh3cd}L57GgQ$Ad2 zA~V%Q=3<2m=iOPzPQH5ue3uEL{F7EJIhZr}Z*7$H0V4R#U^VdU6 z&s~%d87Gw@gYQ;Kjr=5t`fl@lE`C6u^)h31QByb(*qF^K(pGMM(qKu&11L8SqaFwg z%@C4&Q!Sup?{*n$tve-0i7iPJGOfU*&mfaN!?=XC!N$2C*<(#bqCLPGSVBbC8sk{M zbuxPjebUCl;wd}U5_UQp1SA(1IGDUN$sS@W4b?|~=RzMn$0e-g882`=f%MPe>}5;L z0sGx*8{3YfjAntAaTdef{${FcFTB0_3!7&w4-#SSY8#W`nvc1vf!mV3#`H;C_ILj@WTkR z=+RtcnRljqR(HCR3eGhPUTqeUZ)D?7;DXfuO}6pZ5F)BEO@OdIMDdDS#WJq!OdpDHnU*6DmchkXcqiK zQo)zaf~{u34XWTF##FOlD5>Cjv*2@PK`Ad&{xN33SxE)gnFXIU3%00&gN=Rf)9TcN zwX+Mq)4RlYobs_XHg2~0Jj9+1U41hbIwr_P&OEzRP-HNkXZ!&db<4(kCY^th4Ir@s z$={{`^yLD8L%4*szQ!;MK<8+_N&#wCYq+mHaG-+lvPzXD=7W-_WWPWQ=X~!YrY)5o zGM;z#<7&I0TmEh#U}D~9;q1I|AZ<7EiZBI?SO5gIvsL#SR35e&0;6HSUzp_3O>+E9 z$T6kA;p4CciwL*i#(24^8jt&bsMW_+wL?uJWST_C5h9#}_nN9Ev1EP^dk)4G;+xNp zQZs#XiFTwcK}3fVrOFfb4hT=f0lW==S>q(iQZ$|LnRiz_Ia(6$8kc;3(d zo7(k__{=`Q%iggPUK+iCB1AGKKy)H4{GvNAPKMv*rS*em43ePMtmT*j;?2vkkMI{0 zkm)X`N~PL|xKK_)g40-;gtZ0|qRlcMxtmUetFiE8JSK~`o%p-@3%}>8Gf$NEpaRQ2 z*xkaQGxN3Z?9AuW3b=Q?L7E$18H+#t`aSWA3ALrP`o@}S82Ag1m)=>gMRsQex1E9Cd7Bm<+$iB2Ay0eJ zlB@<#dzl>C$BD%f))6GT zDIUW!*+`zSa;zX73BGj(DYCP)@Zqa9eLM?$&znVBurUMODSckQTHl*xwNVMpYVo{T zwwO@Qo&F)xbNvWIULlLfo&7xpOMxc)XuZ*2YTybEG+-Ju|t4CTZIEc$4taSECiZA{B*%{7it<0Cl@fJCr zG`P>gtgCo$Z8~v^B?}^5Qc7a1+|pYs3spzg8p*j_DVYWWor8)!)+1A{hvk zUe%g}EG;M{9&dtsjL>QTDkNdY#%O?R!NLj#HB7Sj%QObr9FnloI&(<(w9#4me&@RA zQ_~f}f37HuDtyS_*C@tozfPI(n{%~_HwaFxc*9TfuQ&b2@F`qnZ|O+GL%}TGht}=E zADaY(xmtJ<=`dRZTW!JFWy$n4n6$IKmNBGajejVadzCnsFDZf3kcs`xji+->4jmoq8Yi`!*RD`iL7T zsg-WgHm#+=F^grs=&rJM!G}_Jnqcxg0;UOhAWbhFF&aqBN}JZMsAM!1bN8ZFxN(YS0GjO zHA2kNrcQd|_kH6HbRXBZZ{ym@Gx{saf7Y1F>!qML5HNb1_-kwlXOn&r=yd=!V0m;e>zVi1z+Rn~QybuE``chKE=C%8L9 zfaR%F!)lY!tOEMsv-Zkd;`+JGc@S#rGpJLMZJFdkkM%7-E0f5mU=!kPL*P?ErfcRA zrT;Q(jg$rq3r711?hZ4vaew3Uxpq*i>2%X`Yg4(n>#qx#<+$LbRfnhKRwEo`!_6B$ zFQ03rH#{ZV=+AV}jqjx0$efdl>BvydDdy!=^HRpeCX4_#?n4z}_C?1_AfcYun$OW4 zI-fJP*m5KnL$d1=iIuBL?J6n9+uTHsH;JjHPY^aaqo0<3dy9T+qu-`yazv`Mw<03_CO{4`uAXD}hmlo- zt?>66=So+dv{SW)#C+ii9mnE-F_fG4<%W4`!bfsLnBRo;+*Fl*DA_^#xx>{CW9JXl z$U0S?90KD!mTrrk(jD5S7qsBMbXT1UK9@lED9v*}lZ&r)@XP-5Pjxq>h7 z>!jDvgWa+Y+x&eR9E@i$1lS{%)y5;>nVC$FGz!+qcCz zo!9BHLGipNe+g4WX`XR)vksc{JpVuQoKxaSSHO&`6?=)eNu}pVCFbt?d4IsU-~K@Nc}wO7`<)5T=~ds$yLPll z8m)ALnxEGYo5#AkOIcMul;fsg;yL*CHSqznV-yIbPHfON2?!N;MH*~oxahg;lP7;# z-BWAzSG}~y7jnK-nDj04``vXk_Ej|Ww9&|3RFd=PV21?Tu}Ha0_YPjFMNv@{v?57I zQT%0=*Q^R$3w-2R4^J(?Mv!e>E|Q{Ct16TU zqbcX9_(EQFDpS`w(r0okQ$FA*+qEDl9uPi?e)uwTa7uvltKT#4x&8iCqW^Q?Aoric zo2tR8kI2=e=^sGbsVqD%JQ8+gTAS(g$Q>LTo3F;tVOppfcOy<Ya&nNtjj!ZgY zioj%0Ck!#0ewxa`*9lQ&cGdy@s`g8x`OmhY(@mHsWa<#3BVtACY|1wkE5C!rDa8sV zfCIR@N`FMRUXtje)3L1c8}8faAx*4z58+2MBmMH?LW zyuPXHEJ`_#zQ(-^RX0)EJ!-X8{Il-GQ~7-$_hHBFYCsh_mNKWEBUqiKR}|lp9h74X z^|_>aF0GH>#zyB_b zt)(!Nks&$$sv50~!L^HaU^CP&{{Yr&G=9gbA~e0Ac99qo^~*n34}YQ_7AnahlwwH= zBhKiR5f4C!zobXEN+MkZB=X6}6w5g5V@R&vShYTFu-;^LopWcCQb*oK9bw4PST!AU zG@ERGAzLMzB+sU+B=j;dPnG?HO1UdAUJ!rh;L5UI1}Hen3;RVp$cfi?VT=b#CUZHnYu4z~f^rh^`-UuI8!nzBv$F>FHuXwCtu3N8$P>)<=RsZ z5!`D0W46%DIg|2iri{rGm@jFOJz2icI5f{yVnYoNXk-Uq1ABLEh_eX#*Y1q@S*=;< z8>9kS#fAU@9J03}SN2yP>^b7T<9z|?LzOE*-^1$Sy2k06Be4)L`^czc1!v4F5?O9oooJf(43NZ-aS9&t!lxS`2n)s<($uJIt zNE~JqGUZrV?pojvGp94|5F1IUDhFJJGDxxPcX&hDQCa=pDIc@{neJ$(NDxzzIc zvwm+){8sXRR|FsNw53U+*_;>Z*VxbGccsjbeGAoun&4xVh`_i@jJ_3H{Ku;N2F3#O zr=&+)Yus_G5=Yly(Nw-4iJjcuD57Mh<*)OK@#J*b|8Uhk1kan$hgr}$_IbirhhaGy zVj_`YJzvQ4&v_nqzRF(_j=z`Y1+Ln$c*@{Au)}J>GtvTsSES{_zUQ7}4wF8{!l}}+ zWU*cy7@>uy9Ns!9S8TSL9CIG(-#V#4em$NZJ6t^>g-OUk5dp$Gxy0T+sc}E5x3JuP z|EpW=FFOxLD9|Sodh;r@mg$^*MF!4VW82w#;yV`49DF;|KyYROjhHFMr&0UotVBOC zdxa)DF4;lWc^ zML*u?8d(dRv{fGl`mNf#IfAszqIf~tqL;}^` zaAu|JqSdaEm1#9KHFiGq8rO}H8do5##<(0x;Aof1t zC3@n!xzU|J`9S)UM6_hwrb{1z5>=(-e~!3=+sw|Rk%%as(0?1e6&vZijkLC(99T5a zjd8)B?Tt6mj{))oZtxbjQzk$zRgO;K*P3eK_Xxmz#T$H%_Ueiz|L6pLR(Q!I( ztv;nM1HuIb0^wb_V<_z4r{vN>5#c;hqRCwli+CbGe|%pR;}2Cx}zLv_Wg)vk$~ z0MgF~qJ#M){MjAdMsIP%ThSDl?=9X)PoNTjF7W6{Uvaz7u~E<+)xAIcc7F;dV1{c7 zybqgzY{XwI^f+41jDsmaHqy*dv0i9bK}P+WrHWd~Z@-&v{Mt~kFK+MB-)}-f_s&SV zAJr^#8pD`gb=5u3)5Lgo)jiHndvJaz9ng-aZxdNrH`)W7Q*t^1qi*TyS#9l0;3TjCr!$w zP~g4&v{jf`@a=4we~2Y7Q{we+lP(8lOZq%n`Uwwpk$%2#<{-*ovi1)W(Q1z$FTMO3 zrMowU@-VR~f2b10iGGn9pY(*Uukq;-;eYu|%~FL7^OuO?PVP2YTNCkzjA-BPt61Z8 zO>CzFr%DI*?0u2p8XS76%nHK7_I$AFi$EHjY|jPu`~~xVGx_gJh5xOc_$PDkH^86$ zR5hz5o-J%ADEBr66Q=Q z{Dh-mr<_@V5J>0`uDU<;CTz?Jw^~n{$C8CjrV^$-q+K<0SbK-eRGIK+Gh{$mh_rzY zh#IeBgA%gP;_y|f{WcHwX#d4Bh4p0TZiCWp>^Hb3`r9S_Eo#?y(ch+2?dNTwd!PAQMz$S$L;saxuwRr_vCXZ$8k;xK;)62Cul-I!kE>U?kh?tE{S-`r?_ z$9%szu@NZaBN+jXYfS#Rj`h!5UG%5_)0h93>&tWAl>UyW#gTa`Lc3Z}qK??>-5boM zXK(9Wgt1!X9-`KttYu`0(|w_Pg1yi^*cGn$xR`5jWWUm1Ot&DV1MEQA1g(_oTYF*K zQ{3BYTCY9(cVGYf&sopv&W&5UjK}|5&xi`^s{6n7j5WjjdoC=V+hwA#ueP0zJUwD( zepM^a@DH&MIzI28jpgnPM4Vn5T)t%zs!!S^H+G6f4bIWP9nZjls9mgKILndX#qUW7(gH7-y(?+o$*S zK4pK1rMuhpe493^$vX;vV5273kv)IfTn9>tX+_<%O^dgAM@78#O@VT33LPc>q25R| z(>|aFZFSTd-za>qqa4e)+{AIm?Y{apx9gsWn;la(+pIk{WxJx+x#!u_VRS0dBGD19`o(~dIClY6t*=quGUO`cNh43#gsbFM z8p8B6FAS5w@=|DQCBkllLCJ^VBtz5fgO9ESO8eeHQU_$=!uw zMymZJz40w)ZDeXgc1tA{zQ?QT@*@^ywPcLtRHY?#s+2E0GksjT`*~dTIHqQq;a*-s zUAO*WC($GSbb1pk6kOHETb~uk_cS;-6N(-mt$go!~a7 zdr5QbR84&Xq?r?}xi7pHKqVMlt5`aJv<5&m*Juf4oDYvs``<6aaUq+ZAP_5cgUc>t|r$3TGbXZb;XD(3H=kUuqtcUH9e42vEQx5+VbyXFO&bw&v9&3 zm(N+Xc2cV{<3)Evc2&c4&P)|g=&6Kvl@Q)lNqARRZ|H6#^nd41pZ>ZxbSdYTUB?dN z+>1EP$>W`^ZU1SBp3x~yzH#BL3TM5VN(3Cbj?TzpS>2iF1rEwR& zX+Hf4C9gc3^Me2qFWM3gimx2&(KlGa0;deO>t_+)xZqpxaVM;`%0!W(f6(_iFE zlAVlS1;&+9826|dN%=M`XNRerq48bxY$`flVC7^iDQ)!5G;nyXS`sDIDNbXqb5;c# z`)c>Gc`?6Qq;>-sK7AB_yrC)EAeuKga|>g>Ft{`xV>92sZJ3wMen!wlb-2b(8B5`_(v2gbF6B5@CD5m( z&sZ&dWqSRGx1G3TQo8h|;MU+k4!dh_D?&#>Dj7{aIg;kgWI34K(BHMp%>0Ir!1;g1 zvp)Dqy5`ubIbP9ZKLpwEl#D7)*Fz*%Y5JMjwPhv# zi#+<7nQqP`UD(IHYfHj*^^DFCN${X*jBZB>7ez zQ{zR3rHny|rSLdf)L^39)ELFIJ(PjD*&LG7lL#D{H`quk3eQc%c2Ytyw2pX$yQFWJRMAY;mMpA{PJ1h0j0)t1-SVs zneJtn9*g6HP`^@qZLYVEtqR(?qrWLb?x$WCUcDv1IyASy-Hl=KWyQC459uR?OxAp2 zF>EKhPC!%fAlzWrMvGnB60^rk_8bGdveC6c%`w8O?)Zxy6yE|ZxEE1#I1_`JW)il2 zNwKH!Uto?c-VUv#pkqGQp3B_j3c`dtl^_SujW6!{*L z%uCEO!tCkBH8^ao)oi@uY+kSvzf!sYR6}D034cD#cD4boj-5% zgfmet+p8VTXH&v>t6X)(Pqgl*x}At8%t16q`TSw)s={4rWalJ@L(op|%+)f_IodcX z%s3SnVp`TUGphKqclX6h&-)6_3?Ru-GZ zEEF2O^(zCV?%+PP)-<}THCOp~y~*gh)@)?0+2}rM!;+?0(S$UXPhdk*`-gqyXWaT= z?57hXpNRQrDUTNEv0BrOsWM3{Fxc?SOQcvn80z<4Haf+0+P37j6$d}HTHoT+NnXdv zdK&|3-TEj*3tuusEnBUXY7eGZiuV@l)*EGch{Nn~(NU$|({d1l8doiqtZ}E0iLDgB zxotk)*YZl7={8wfR&cl5pA&XJO@4!U&dQT^#vGN)5aSQ1*>7iawyXX<0j3{jStryI zNSh!FAy@rcd6igTQo?PH6)Y8*rK@9OlS~v?EO3U21e`pEqj>(miwEGGzOewBLE!{pFW@& z=AKkLJ{?YH&L>O0J;pZq94sK$s9|>VDWr*wV7_)JX*(tI z$>f-Wsd<$o$1~-#nPZ=Hy**fSG1GVNqu_u3o7#n(r0d{tGRugT(6jPu)P!n9ZB=3n z(G8#Eik6e?0(mmDa&hBx)fK`}p`pCXsd z1v@fb|M6$wm0ei^=2wo<#e`FSUm4H?moAUnWioTJJ^e}mO{I$Gl3GO6edu3U)i6*#Ik`0p$Z0XgEJz7LidhB41%h9R zTY0XEB8;n?gpL|}s?_W@sGP!qA6aW$Ew5C(L##MB;c=V{(*lDCg;=}Jk@QYVqIBW;OWeZ6r;7$l zfJC^u05&0vdb4jP2hoPB8io7?#^#fu!J-266pV^hyAKcs@euk(k1z;bJuDP!&}=!n zSknF6Lb{)KzG)zY)fv6eNkX`~M}%l%+<;24+~9=!VnP=Q5&7HNRn z9TMDd!qPiDGTq}3uSM|FBMrP7BbWS4l5ohmq$ z;mrgfx|^$R6he_f?y4Kcji>CS0HT)J;81=sbDS9M$4yn)O+|rhS$ZuwO@{M%`5yh; z0q(_nl%zj~gmmSYj)lAhh-fk5F)@73+SMG@S|lpIGrsb_D%n1mbabw|M|k2|mQ@q# z6TM&EGMi+`LAu(at33Ky*>3cb+lt*4(OZvp>n&8_0N$sFzn9EuZhZ~1gPn?75g=QS zR*E`NRhac>Y6Me8=eRs&^U~#Xmr410Wp->z%cPQYRI}DeV`S2ZRRGbH_9k550aZY{ zCE8wry;FhpuTpl>SYKc0N_pZ%+@J@|KqlH1)GS5)ULM0UCe zqy8Xm3ZtW2lUSK>$42ALNneADk4ISb;Nqd`;kOAq>!mHh375Rr+gQ8?OI3>w{bzHgySq}D%>`n*aem7QGV?hzl~qCBdr;(t9`qp zcFzuuVBlD&9z0Tc9zn?*tYsc`R!Pv(51(NunF%1-s(PaEA;7S3c%OaQs#4-nC-h}| zjXq{cf-&0bsv=x=qdRfLihi-66}2s?*2`@_V^)EqldRv9(Iy&)pTbAD5e*^g?y~VBgThG~CU9oBIFfeMYI&Mu( zXi_G(5w2OGL!%>TTlkK&qIg`b@#c9J?@3D=ls0#~6mLbts0A$7!nAC4ElOi8U2%S0 z{+wY}JBIAS@VbeGop;n)<1JW9jsrl1tu+RpCDKmf4olY=mzVHEv`aal>oS704;1qJ zor{4UW5(3mf)kE@r?)Y4Vsp}%>72g~EjC9!2UPDz1u3P)Jx0zE>Y+J-Ne_KPZOin9 zVB&$b4}aT{wmhv++(z5s;VmmhWU?u)7QmlGpN{jX%^g9Trw>&uQ$(ehqOvsPz z5K?Y`>!>MBb~Fl_^H4(2)TD>r*86LgJoAZmVkjEp@CRT2fT0LotL1 zI4DI)ok3}>j6G#11hUP&)Yu45*^TM)3-eZ5%(Y}P&8i;W=-su2cn?RlzRtrZXUGCb z6bxy}3}eYL!gyG4$=0$!77^Fdm>E`M$|WDwyvd6r9NZS?bi6Id#|YN(84;tO7Js3} z-M_IW6P&^%FCtBPzrs1~YZX|xa@mB-PaRI`Rjvvjry*-Pw@4r7Yq zfVGR$V~@0)S(4s*ruwGJ3&$#cmZ(;Aw`o7Oc10z(S<-m>cif^wcS-uDwN|#NNa!R( zbG05-r}c?0Eg3R53e(A~;;LKAWLwRicwG}W?y`JWofsGFO}etnl{&rNs5n8ozY2AF zYC@epQ8*Jl+T0_r)>o;-Q7;&eFkz#vVmj$lcDYzgF2`aLy$-OxnKQC&!$}@i3Rm43 z@>Qi>XQ_GL2fKmf zbG)o4yz$7Svcm@kc8PzK!nWF47@)-)8-}UHKtFfc737>#Y!7~uJ)vV_6YZuZH4`$W zQC+ltsr?gG+f`Q}!{z_6_b%{JRo4P{l9@n&gcFo#6wxTLO%2d!P?HX7Cd|l;OcWm| zUSC)gZL4icW_Tz_a1zXLJe5|gZLhZWZEwBRK9q;A3}6!80hEVS2|mv-sQ4lYD)ar< zK4&HgB#5=`cfb2xeoW@fIs5F#+H0-7_F8MN#d}(FeERPdBO_aw8TG1M= zUsnQwiof^oK+G@D2DZHJvZcRyT&n=w_7};o(mRwQForq`Rp8e}w<<^?I{4;_k)rCu zQv`332}{vnp}aC%Q9sDs#Eu6na7v~ChPfkPoE~}EAu?%|=G`s4L#ipexQHMw==`q4 zl0p-B8_b`Tt#*vV?0H)UiYe?~Z)$8TV~xBfGV6DyQ8P+8jC6s>O@fbt0+JMofDp6P z8em={Q7O*0gG(h=;)~(vmvR1lP*sNhME;7=lH;-B1^RPYW#;_|F6E&z)ugs$Zpkz)&`~?L&58xH)Q$yHQ5G^K>fC}O#lIQRi$MA#b@NN_MUpHvHST;n4iMwc zPbdRBL${>7@OjH#>I(p?o^;?wYir15hfbVc3Nv~FC2U4ZcFASz+%*qWvVt$ni7$(L z?y$|i5u1Po3UOJ|2sC90xUjg5i)XhU7Q}E?<;wktf<0K{bpTB#t zFOdBCZ{2XBYybI8kX{Y#i2KjKp4!XEey(mFINY-{@^*nSNDgCW$?t0 zvfM`$e}%Ow*2u~lnY&lGtNA^)sxVa#aXk^5IfzKGI1nSCSCs`^O@bcjz~L zdf=9)8&hdC&t$WR27sF#T~Vh_Qa7y`NGbsEJk{^SDqK_ahAnSu)=PxB1BCY@&~2E4X;l3mFK*%$&uFmpdxWS-^UWe zQWIXo^So8o^Y$HL^dEsAea>IF)3uOy;Sdx%F<0EASoJ%=7j22MuAb|b_0nw%Q-Mgu zKHsSmO>0SIw&x@LE52{*l!G{ih9yy`OzwbVh#e^+kG@4)vcdfH_Mo zo8znd1d{zAT$y`tc9yneb!>FL>@zZ^Mfinuosl|PnLM}9WeZH|6gIc^Mboc5(GB5+ zt(!N{Il&}4cm#FQ8^e1c=Z)&7rBjf#%XaHM>KJCilX69cYAH}BqCg$>`;-E;f+#)6 zJW(?nv4=^KSUo2QShNOZ=N6EZ2s~n91`)OBY!t&p(CYke7B1tw3=CefHOKE@qj^1# z!W{>L#q#4)e)y(t=h7Gbq@P(S&r(6Ob`gFXSHftVg9}XyE6NYHj7`@T{6eH#UOi6L zBY8^sF~F{r$iW-UPtWR6={x+SQi7>A`lD|-svKi>mF`4pDw}&1hPDliyu@RS%T)VC zk&LYr#b!N|jpx!xtkxxWT^ulig=5^>bAy#-W}A8202xIhn1kbFqRB;>IlJRU3Jv3h z;qhS15UV7TdwU*I-o7|ee18R}{>(6(2QN`khz8gcisMa#j7#~tiQ)Yp7dt)=oqIgD z^oQD#9agxhKVp!8Gm3#(>HMO{c5~;5Wx*bJ`>^#ZiR*8z?+e%82M@a09KiMdY#=@# z*E`rr9;P~dUETc0aXl7?CoqoKM_;qXlk|J5PVt`#ANwVn30WQBtx84l?i1}RdL-P<|Y3_`Z7 zC$iTIe0fXqT;ebcb*r0S!YrmB zB>mDF&ZJ9pNA(4BjlFDIbW2VSQLLCBDZP6udLKo#vdDFVaqRg~N2c4+u;1p~ga{scEt3)E|w-{m@atS^#N3j#>(k({6N zlJ3ijx194GLTbEhrrxp9@)870qT5%9_BUc#eqrQ08Zo+$y+2OfNG zruoBg!p5=DswV_Z6dZGB?MtMAVTVEs=YUcVKeNhGd(Q4!|H+PfBtu6b7U>oaBp z%N;(~#^4AhH-lrf-RJV=+|*q9$j|kLg?=omy$KkWpcMuLZv(!VO04@^$F4lgy^4ydkXQh(XuZpa5t>Z6;! zq*0kcbiXF7`UmhoXapzNESutNV&mC089d|ra`{$l#Xii_xqLD!u(b*|p;EzNUUc-^ z30-RrmEoaLxJ<>f7ey|5y8^MBGph0UZeD?fPFYdJhG|8%7vz%DPuym+G`>JCD%25w zE^g&hZGIo6k0AIghK>t%U$fEkeiH64Bh{^XM5yOj@);qcoq=?!*kF%olCi!fQnD}@ zUiqPVCGRrK;6d_w<@mWU-$N!O=JI)5)0OU=1{xR;`>HI(7Cb?S*u_Kmss8a}fz-{n zL(1?yLw>Iyo>8*AVw*i=9bu&wZmFdf9965Axu#$5>+GJPJ=a+kXR7Bq`@LTt%{n_o z#-|op)>^u7jJ?#F@1a1j*S{VUs>@kgiZK--Kvme)8>umn7 z<(I6p=kStRXI~PSE9$WunWq|2%kD#HsjX){r}-cL)sx?XgR+(h?N#Y5csWWQ42$*@ zEt=nKSJZcgBwZ1|be%*zO=iHl%PEgwp|5FNzVauppr4|PIdqG0m9?2XLXR!}r8=-f zI-t@p3^3o?ui74{8t9!%ePRiShtw^&6+YEcJRNe4swkZ<+72hY*Zn$4JBqJez!-bs zSv|@O>%GijFvfFqb#R;o(XYU)wf zU&9kvHFB7hWEqA~q2S&JxJ~4bL*UWdPg}Me{+z9#!}cjGKyjcxbIIMpX%w36$pO}_ zGu+RIJ5DezEzmApqmrG_pmFK*;R7ca?gDMR+RE54Nu6V*F;=YYmUYb>i;|`E9fo0L9|pjyo!tCEOC?GB zM8*|%jSig|Fvev}^Olzdzq&k^n?A#k!FY^|66X6K%5-b>Z%biMRH21`EqC=6VmmF46?`o0qG~Lse2htHXyd zL3yq26fXS6^%-OnHu5%1XUbS`+(^f=@u?p#nuL_fBz2G4BuT^ZiZVMlBVTel*_k|gA$bmTvQZrr$p|QaHm4WPp_Qlk5o*QyfbDEWZDb;A2zsNZUFQ7dnba-D4d^J z#DXUtyLE*X+`(0?GjnFS_yeJlMKHqqv?#3bdWE9>(#>uhS)kL?I)pgb*&$JtfMUgH zR8{7AoPVSy(XzgkNgwC0lBRlbW$V#1Wyi*s*os?W5D-B2I`jA5s-))3yks})t$sh- zN}X~7R)2CkS4!SSPQ$B7vTDr|-w+(triko#x;DY;npB_iff2j& zv~c;j&`9{i>0ZGdfu>G9}=LWPz-( zC3~9p3GahpPV_Ep_cX`}SHp*JDUK&bb)jEhFMTTu7_}l_2aHGLSfn}UJ&WmFKob%f zAfVGIr-+-UU09xdCr66sCuBZqE`kU6^;K2HtF$F@mSSjH@fuNCG+HVPka&~SDvYQp zP~6m4p~ol$i!`cgEp};6*T_oo0+TB~rQEJqxX-+udn^buD(X1#@2!<3Pi%W!Y$eCa za#p!`rs+m91tG4K63eBFetn%eNA&E5@d!TwKZ7WD&JMNvbdGNajC#54evVO7c72tR zeZG0uyPZiGUrEnmJ9ua{2a4Uq8lom3c(vE4g4A!5glQn@a%XN@f$+Jj;dAsM%kq*5 zWiAz$9c@Wtm2nBn_{vDXRLAmYNM>>$4O9`ufYHXTQ;n%no4LoNaS%+adzjAI12Eq} zZ08-76HZ%FU(2Iu@>~4D0(!mJ63`$wCKurGo5BY|A*>w_+|3iCQr*9ZMR-lPGZ-4l z{kp^MPYVs57JhaC_sc>9r+KCJT7KB~Mumn*5HNY?8C7mY>|AFtn!190GM59URy1wW@xUs(sds$~1e* zN6rfEx7-eV#siP=G~mDm3iFHE%qyOS!NSRuDh`fVD!3AGb<_~`Do|KvPZj6or>m+% zmy*<&QIxR)7sc5MfO{Z;l)be|Uq!4akf|EI9yey0^U|c_p{$q*`=A)4BScw{T+glq zh1MN<(=9ju@89P_KrM~J=akM2-ntCO^)&OZA9PA4$O%f7dK&BTJ}sJ#ZA7xOaMQ>v z(ph5&nBLEv5vQp2R)<5@FIQUdyk$6a1y7|GN=R|@xVWers>x@ac=48?Nv0;M5a?PDA5>~pFn4FnWN*Uq# zrK*tZpD6THSE2i)P!U{R3Jq3;I;2pJ`NLG9IGc{VpWMe}3%_TJBOb0+G@l=UCKL~r z=o7M8Sj{__CEh+2kl-SVo1IU8MS1pr=8Ig&WMJ(5*r%JqJ=U5_S;6?Gi1`v*0Wnzb zF$J7!&DYfT2J>b0{emUKsEu7}qw+6_PSFz~VfA+fm>^H20*4-7fgG&@IejFzE&vz9 z%_s)&)sFd$d5momVcNRc8YyO29HSa-2f)4N(tir>Szi~&^z;RX@xbHRKRy53g4TlnU&`rXDi3e)b{3%#i0ydCD%LM}QFzi4W>!}f(q z(Gr4(o}Oo^Ph0jo)L7=9-xQGp^|eCl;j&4cB98pG%2HEJ!`&SD14gwoQZ~&S`AWdJ zlZbu&-OpaixB_}k_Dvah*>SD5$VG1Pz|B1OW=WmAK?%<0iwOW_jCy@4VQh@deD&xh zkt=sA4USeX+si8bssgH&XcWb*hzJwxc}BHNUBAHE%%NI|PUSoj(P~3alfL*0yE- zUdia?(=(@q;b7LTN&?~_h$#I^C$KCK?eswNQ*OtmioiJ)|ADqlM4YUm*k#;!R#4Lo z@2cOa)e&1IO>)TuwECN^%UK!YwEC;hid9Kf@nT@w`iK6pSJN0jHn0n0G?KuoTi$Y4%YD5$4>X{U8pp zm=deNv3c@FxH%uG?Jh~KmqGjEXbnbK3kIm~yS1iH||!}zNXyCL=6=B#k*FAB?UmQpMMC^rbOb-lL4f&5Jf z5Y7r&*INAtpoyF!*-Y*7%10_U`n`oR4YDP@T-1a({-}NB{8chvUHiZ5R>IP7XJt#F z1Y;o}SlPXWvTJlJLDeV6GL`9ueQ$*Tyz+gJo^Jfqt-lg5W)?BM6@D^BQ%eOz%*G2k zcILW^Tc94cXAp2`514;~8lN28+h~elE=yr15oP0y4*#Zb6Z($KyZ+2UocdD8HTD%z z?C3AVM)Pexj+}d#96K9%=--L|U#6|YXooF-tGLi^lhRf z{oSv7E+`VkTJdUa$&d?~umSGkR++GPLIy3}&ztq7^llna z=cbJF8(ybBLdT$_@?haNLr(M!5}Ksi9E+CVqDY;p3)0Ha>UYuu+3XPmF)|(jX{%qq zxWKJDx0a93CTKJl?gZyyvbRd!GVBZC1DSK$;>UuG!NLBiC^(#3{Tz#?06WY~t^RJQ zZ+y1b@ZAB*m(XWfwr;;RL&BO$tbx0IMtuRdOVQs#6J|d1p>LqNZ`co(CwQ8OPCJ!l zA7`n~dDGdoJxI>0WwJz?Q2t9{L8NKPr_sr)nbE8MMtYZ8w29BjZnspCpH@ zLIY%gk?}+0Il@jt{jHy@dU^Hq3qqP;IB)Xdf@R7+kFHFUU7=5eW?`|BKv_|80?hcU z!U#~#pn6C`(%i~T?s?n6ZLCyKA1Vg)X4Orq&7BH-GqE7{J@z~;v zzLtrajQYP(#>$z6msw~mefdV2S)65zYKx?4}X^cO)REbc+aTdap67b z!9n2zX9lyCC1s^j*uu)Yn`uSIi#4oFttw@f@VVsV?io4)bK}^2h)I-(KupD41D z^?g^>hx}tqQgw}1b%nl_{4FtD2)%T5vixB6Jb0lzkE4vXdKyrrf^3tmUgoP>LpZ2d zzeO8NE!fMg->c{Wza8#{A6G1Fio=SmdYqJ#7_02Ej~5De!Gwgu+oZ?ySILxir||#R zsR8^g3*V8O5$sQ&!?<4rh%@-WL9V{lCL}zHCPrnTPMdd;4Q0X%((Z*nP5jY0V382zhUIBChxO+1*cl;<_TTU0LZtAD8c>`*Ym?|^?zhe=j$emv2_R8g=Zc{LtATZMT#l&7< z9rj}k3sAh&a2f@GcZQN7r+Ej)SECCPS2j+9(6Dwu$aV3pKI6jm!4405bXDZBC3l) zCcLVEU`J;)#@{+ZcRsfdU$gq~7`V{A4`)apwB@@qYLY$J_7C-dwdA^oSxf9Z50RYj zi72d#qlz)lc2pU8SNGFA;ybao$ebn8gV^JERV_-0mt41)e?>ACVTT`Shc9ik=cQh? zT*mHZIRrKW19d8>Kpn3jz8XP5f@He@z+BbfR-2j2OPtVwa(p9J#z$jbr@aaZQd}~P z$%99;MZ)qzd|&g#x78}!Ut2;i;;kZGU5mFB^KoQvD!7-YJTn7uX!Um?VUpEB1(cmB z9r&KCxKmfl{>tYWfn~nOlAk;?f#0g&l65e0{@z+ae?4<$O>(u~hhl9iuEniL)-C1_ z-=LB4>7_fZW^k}aU8QsO$T>Sc&!(l4A3Gk3J95~qWQ`E!Vewsah3a+G{8tyXpQrRXU=X^)zt$gA>8Dy>yHPvCJpJk>6 z;oB3@3MX%o2~(`(Ykhh|cx`MlHlZU>Zr3B5hP(T?6wu)g=>Y0pRQYjTaA3lfsY~P^36g+y3}Cq6s4!GTjNcY_(``Ce^Y7@T`Dze zyWJ0}YvnK_oft2TvB2tC0;~BkwIP~lmCxnY^R-mqE8b|1weIChF@BD+ehP%mQ>|-( zkNF51TA%S(*Xcty;8w9Lat59+5XO!%M|G(l&x^)txdDO!S z1vko7;y(MU`PVYu1WA(+LFaWz{Zjr+%T{G%*2qiDJn!Y}>V-u}`#I)k;xmhAyR%h5 zaG0lv)Nvwhjb-KCml`eC&HR{ooy|=*RpMEcEaN;BzKR(UQoB7^Y;| zHI~ZaqAQiYo_QR&Ro_CqTKyDMmZ6cBZSLn=l~FKn@sH^&a^krt`f#eV9)8MVAZk#K z1>l~LIsszFsD06qJJZz{aaV&+TqrZ-CQ`c3^>T2v> zzoe{tasrgbX}!1YcUFqbS`*cnVwdr!mybg@y0 zBg6Y$`49d2tA72{fa|T9r)iS^QIrq*Mt5RceIwsK?c%jQ$7c%f56*a9sd$@wu2+ME zzIlhE8O5(^Pi1LO4RthRI~v#b0wUQO{bNx< zI6;SFRj{B6<~J-*yheKphpMNthmgo>NCU_0F0*=Ic2RLpd`P(n&EM-okYyo1@Es=8 z(zWMuhwxVfHX^!U0Am?$Kg9UhjMv!czo%xWbz^5DHj;g##L#=Is{V~20khVbKG>*u z!XUl4mx^16c?*k;+_|?<^g#B_%eYB0nGEgj7&rao(26`%SRoB-k010!9xE)9YhWJv zTVV;8qLz84u!t*l1YTl56B_UZe>-}^$@s<+w*MZH!K+-K&A54jF=n)1%$NuLuJ)M) z@VJ><{x+h&SM*#$999}o~q)5)Iak# zq7H+N$2iH)h1SrIAq4c>)|C)sX`Ku*cCGBj8|{4X zea$~FD?FBlOOxYF1kurM@B95%{CfMeMLyRjGluycud*MgVQr(*wN{Vf@e?Ew zF^_=XO!#KEM?U>se=!D+_8Hdw4eFJ7rqA`^^fEewb~Si1wv0gWhQ8WI#Ujj2^EMNw zFg8P=>iVoEf04iVU7zc{8JcR(0!}a<&*Qe=^^V14uxR$L>d&&W)NpSPAnRvF0~fluESlhZG6upT%w! zy*rVQ1YIS}mte5yLIkTNjJiTz{oX<$FA+91*=EdNCG?lnk@Q8bJ&E^!!7sJ`h@#cn z9QpP4CB}+y8v^XDCJ>eNXLHbHKF#*fUJ$NZ+nHFZPX1bwQ|gcusU(71C8otD(cj`q zd>jU^0m;P(;mY13RdEhcB47-NKU!711;2kuR2DjI+9GzM&Vkc#e=__TVhrPS+Me`K zEbg-DOFhS8(yhoZrAQFvA%b-q+|g%@lbmM+Q)>)KAdUgt)9Pml%1R?AVD1jwdC;h2 z{ZV3Hs#81|WWK~g-<)e% zCFm(D_SI-tdz?@u(~AVaA>|LKaE9Ome>MltG7DZz&FG5e)QqMCQK&6QOhk(`L%9_V z4g~A8LG!-ucNK=9d6V03d@>%>CV}fn(hbSDctgk)eW#WNtAp-;$!hkDGeTx+>Eb zr2et{hrpM~0|JWm9WU_Z&*spWL!lKsO@KKZg6j>Kn?oZ!4MWU(k-uzqIhtW~W0z_e zitSmTE+)xd5`P5V15?0UV8i>op3l3%TdTW4F}4&3e6?4YYxQNS7!xaSA9fhrIa9V1 zDc|ONb6@yZ!#z1$`ik1u`jgGn!MKs!*K9Tm)4MOe>_^y?XTCYb7K%NHd5DBpHFAJK z8{#aKe0;fJ=J1sK)rkGNQ2S%L_EaTkdl_gO+5=Rx>Q)CwOj|_sgWBD8gF~I0_v~Mh z9^%BqQ@(WMyt>t)T{71qR3aC&!+zKul;M}&b@R34&EyD<{H^dyn0o$IlBCHvd*|bw z33vE41g4k$#V?m4uz+w;?W&!AqcZWK_B{gSb_||bqt`9SzPw+W&(V}zd}#pHy-Z`Jo2CV$)3j}kV)y?#8wc%~R<&NcjoBZ>hb+sb2zkkh*C4}H zXg_Lp>(SyBZdX*hXQMp1cY#lJd_!V4)pn*!-RUZTpZv^_pBb^=s%C0B9rDu=6Xk+D zb;?g?Ornp=Pt~u?_?>dyPagG)e^0La%XR#X=yay>w<2PmL)4wUPG@eAbs zAh{kCFO_RGB2;GUC_EmqU&6fHOW(er3k}^3^Y1DPR5LF8Rue zkCCqd@lo`!$gbCE=dkVJlGR}HN+hF-MzqCIw{`N&nIBA{3~ZP67I`=wpO=bL=K#iyFjOg?w< zspoSqpZodzjL$FmJj&;BK2Pz8N~k=A^mtPQYD^R#uca)_D6 zxI7V_os||W^d;aF2WAe0Z}0bHo!|_;%cj)_`_Q+9cc+u5m;$8aEK|yI>PVRa@avIC zNMQ+rbhHpZG=72Tvp6}<5b#I{$8zVFzw!!6I5N$rpH|GhyH|udziV8Yi$X_2ppRH# zw<<69BOXFH3aZ<|b1EjKG&kYBQ+#+%uzkI53c*Nk^+o1Zvt*t1AF^b<;KP^LLsCP) zh}@>PVJpcpKV@g3KidFzP$6G+Z>~NoyZvENLwZpNa13PQu+12}i?D9pgxNd%T2^9( zIgjj?fvNitr23a8VyzVR>!jgE@p2)3-lrntwb(~|=69yCot=56&u|mQH9B*kZ|OcH z0RG_y*|yItqb^@Dy%8aiX}rDJv2GnM1jm}+UnVms?(V^X&1nKHGq+38(2f{iKHf~NiGXI<6oGDy7 z43VY_yn5(Edz|||3{NJ4Cl%m{4?LL&o(!Cv#FH%Iu1;YG?$z4@`W}>Gq@Cv+JX)vK zrn$Q_;c7N!rOzSJkw*{B^0Le8Piz;DUJd5df(#ygBNIe|%wAB(BNV$iFttP0^coan zXzhFsL?s`X6IIwA)#}cZ2VHn_UJ`|Tpis+90_Y+C@7@Oun4QlF`s^0;naEUXb(y?s zqfowBXp5I9U1M)}q}7R2iw8|Ggdtt-LLWMB{*)NN?r_RLjUaxg}#0?$K zTrV_?plNPG$y&Numul;asURjE$2f%h$fj;!KXkPuY3?l{MqqSyU-Z`UtN;vpnuj(!}T+g6Abdzxcvt|V| zKnvqIE(JI94{&=KTIj_1Xl1rd4f{U(iG&NdBuSv7&B#+27QU*?6bYf-)T2!EyF4o0 zPgptqWsJ{Pc2pqig(zP}3C)DuKPu&A z+PHqix?f=4hjTb9>8u#5x z7(VY*?9i~74(p6hs7xe?6U{qTrX+}yU=PZ=8LJSI!f>(sY1XEB2op0s=2h%O3H>4u zh=^XgGj@Wyeup~F>8fKpSfyTyk!7f79hk3jx(Yr{!Pr*HkYC!DW}fzptRyW0J){&! z#HZKF$}2axo-fO?TvwO@AzDkAfn%88`>Xv^pD(9>9?b}0Ji~f`*FC!3aDyVmT1y<#Y`z9~!vLnCN_8CFPJAX=o> z>xD@gzcJOMg$0Lp*77Q-7Cw%A_-~8v-5YO^Gq>Tr$VZ&H#ULFa+^xi>nAHL0H&yJD z#3R9h7EM;P2}vF|BT15HUTKk}FMf^rb6B!Xk`=;(5d=~^nClb|o@lnPQV2<^ViV2y zf7?HM=fPN@1^bfg#v^KeZEkbC*$L;jr}jU=Gd1b)dEMrIdsl%wC=j129G(88CjWTx z2K04N`E|09+a7nR$>xd7b^z(Lm)U+ON%J+SMv^o?8KIH`GRaI&!Zc@z=NM~H4<295 z5`61XZ-slCzN5M)bF5M;sd)Sab_kPOf637R0VrWgRIZx$1ChDMOM2$Hr-10qe1DbC z*WEg2Dd(Q+X_$Kf-*5AIk54-vx!<4rn)#{Xv)+wQOFWD6$=RXfJY{otshwZ5Jz|f( zHhzwoyF)R`6ApW9x%bA09`=B}0&a;jMM^g&9dG`SovMiMvZ#yiLshdm&u(1WJyyMs z!$~W#Y8K~y;R+|xEV6Ao)eJ%IMQYxb$dhEm zAd5qam(A70#b~2h`bVNil+C?BGNe|0)hy(vI6exXB_PT*1rR)e{O>Ho^--kcf3t*a z?|DNfn9snbZQ{9Jh!BS$B@v>%7NtPWWw)`9MMU%^PQQVH+L#vm0gLYuuujR3%AVGx zYhoL*#@zEL^rt+q`kUH+agF}vleQV7%rUAT*)pGq7bzQ;c@SZZz0WSuPq;B_a*gXy z&eOQlh--u1T)H`tw|)?Sh7Tuv|LQ~|*B%`YUVo#<6}{^PfYdv^s&RJ{o|2AItfd@b zz4DTbw9=i=OXG&~6!%g&p!rkq%4*t_NC1xgetl@WITF(n<2l}_N@)I#dZ$s9uK9Pk zcHPx14qKeR^t6L!wyzVM%*tz^9G;G98*pep!G{w6R5TE{Z+y@mO?-$&DGOy2^AWmO zEYHsR#5`|(VwPJR0E|(4OE^cq+=k-7pJFJ`TLpYA9Q$$>5B*xOBniAViAI6lCScd% zajm{!GEwyQILg`MX^X&&Z6VF+bd9pp3kiI>c z0sZ4D$NmZW;`T?DWTlzcupeYXN2v+jpucZV=&N^e0Ibi6oG`Vn{ZZZqHamRhy#cn= zYyvoLy{#(?p-C`p4sO#K5 z>S77c>P8#jT)}dm(85I>=5LX=O846e%4>YaqiIAoB2iV4m~yk&&t1|A-7bFwJC^xv zwt&9yB^`KpUNX4$mYfbzHJ#f$J}WJ4;J~Kw+4!`dNv5krlmnvEKg1)LBdz0GsVlV9 zr+-LHum^uDI3+Abv=>1+bRj;%%6{7oW}kN{`s0giL`gc@_>4cRj*Bv&)92biGBbT+ zB5y94g;hsf2bG%K9NN`|ly5|D?R8bJ&IY)JrIzULLzx9>Y16-E9%S$O^Z;NO$v1!T zdxRFXX=Fg?=SBDsH9Pv$m8A*elK$ostU`6vkJJhJVkUQfv_$fhEgMrPUPZG2OK@`3u*v%cdR ze$TfZX*I}oB!@fu@tf%^nL_jrebINRdSoM2@Arl0m_>=u1?KH6T@v@F2!+;h#oL2} zT-!q@E&B*PMLc`i$MTiAjF2v%2#foj%$#~V!rOAd!PMD3G^Yv7&DjX}Vbu6mq(aas z5Gsfyf{UqD=6(Jr zwG2Qrw(-|D^%K87=2PMF-!K=jU1#$7g?4orPs5qT-*Ti?L|^a60zCOwP|j42DN7a# z=c=ZPGEU8Ws8XElB z``8u~&mYA5CsxKzVEU}lmoeFr+#YhDC{!`o63G=+NRsK^m+_;Ws$R<-O0(*07`O_e zPInD|^%fBI+ZLkso7xjm$0|hK@96++NTrVO~o%}v}d_; z_Ce(}XK?rliqHS1V04u1<2Z&umO~|fN#lM`E2HhtuBf#revZvgwqAi1i2Pmz4q4Lb@|0KZAhmOpEu$_Xm_><@q3joAcb_v^X$f;e6{sVm?S&lmU0jBry ziBSkXRIs6?;o4UA2+o!!Pir|-o87X|v+2CTgAM$Ziqfg&GjxgMQW2l%&jHWpK34Ec zrB5ipISr>wGAP{eb9GL_;hTz7wuxC37C>h`(pkwVGgPr}YcfZeZz@|rOCry+i)3Fr zf#&c;-sD$gpJaLv^jWPuY&I;kB(Enq7RqE0YV|7l0xPklwn4BD7j zfCVhe{JJplp4#oC9l5XA`bjxPPRZVS1Nho~ybM$@Rt9Sg^mOx6eY{>hN?DK-GkouG9$!1FGe>ivCqwi_{ImGb4~b5O(jy}L3GCh zQuW1egUlwo@**&j8u;59y8Y+tnG$FWKv)Z_O=j@P;3ySv1Y^-eK9fc1ftiLYQE(JU z2oL~=y2Jb!hZbzckAV0#>!|#NMFU~{rh4gfZ?_aKDS-u9C@>WSVQO-Yp?lIXuY?ib zj>{Cuw=QvdW$K;L34j)@P%A5~?^Njx$3!CiBjd9Yc^P02c*IriPS!9OhT8q$YWI2B zIKYt}(GYI^0~(K3S@@d0l2(GaV3Wb>%*o%NXQk*!yvIvs@`(5Oz|;@qOp5NE$Iagp zMyg7G*B||?Um$WjK_YYBjsO!$9yYe|BE2p)Wy^rHi*!#%5ryCOa=ydS7Kq&Zi$vZf zU_->aMD#0@e(x^3qbQV3Y6bI`Xuai*U%x1y4A7CPrx|s`5gC^iD8Ko6Elgf4j)}bL zC;3?*a@~9SwuSu~y!S=s-fx9On%}9ShSnQsFJxEL&hkEq9$jQ)e|A2jo8Y+j@6x4; zvhv{I#0oNzArkw;2Q%lqBl)v`5SKD~-CikEsXZ0wIR8TJx!;`n1mYy&lZe|@ydvU# zocxHtATDcQYD<-?MZ3?)0BoX)$=uT*O%1i1TD)DVS(wq_$sy!Sl;ACX*M>Rop*Fm0 zINF(n-?5=e_Lf`CyWog2YO44>RUl;1;RAHURGn>@lYYK>d+VIHv7~P#_@+k5d#&BKha$B1I2Qa}dULol+0?#nO+8LiyHr!F(C=GKWzm%1 z@v&EbE1=)r9Qz4C4H(1M-_x16M6Zj>kj5I|MbZlR~+{047-na8Z!-JgtW z;E5f6+?doq?q_Wp?AI%im$If+mXGz%CG7W%^nfe$3oSf{4wA|=8LfP)>PIcg5jEoZ zJjH7yK1|#;^sSQfR6sH%`TRy19vHyNR3?8^z~oG!0mG{)>i6pF&~)98UA$_Ec@vDw zqYUJAVy}zLeNbK!a6c%HAI2mtpx=x}Y+WMn+dG6VwYqjHBjSJYq~{%5BbPfp<)H_) zyTztcJNLeUq4SsKaLJ+K`?@MJDn6p7`&2E3b}bU4Haz#ibnWiPxk`-7N{n;rmpgq5 z1P^gbp^gqUR6QNrOMF-iQg;<|3WkX8lNWR*U?2x4==UmGtX$|kr@=Gu{6w?h{?ul_ zt8vaQPx?4#{7S(~&gc*@e^N8AbnwcHGFR?}&XVLSjp~)CyfVQVA2FWEIv+Gub6Q!; z%sGw9^a!=VlICuO!X3)>+lte1Kb%v}rpVz~&Y%dlN!r5yZTb6p!Om4fm zKLo@Az1V?daN=qDYMI3)FIuyxc5${SVyOq@WMTM=h{!29lr1ZSW5tKy_`Y~jY&35~ z)|*7_kw7XusDc>aR8|3d4!mEK$a{^n$k62jjaK*=rR}iA{VzBc!5Mozw-u_GCQB!h zK*e15Gx~(@i=KIMsl9U66;|+swVoB9<=%}cNy#8NCt)O#wcgL^52F6rOFgN~)l#pP zcv70z1jX~H!sq(9rf^|D_|@2fp#h2USxt@{bPf#;37BEj6<#3eTU^_xZ)3bAa4_sC zmI6@4bSU1gVBrxpJJS3bCKXs8gVm)ZeZ14Paynj5A5Z_WOnB2~OOinPzE|~J+{3q{ zMiEuLjL}lme+SQ`*H!eBFHJtZ!LjbANjPpj^Yh^N;uS{&M=e|jj-+5YnixzzVlYh$ zcMJ^WgvV!POlx-Ju>0ox3S5gXf$I4-RM+S?hS`XOHK{NO-gKcthdcar(4qjT#*vylDl7#bjiHv5S#htb`C$%pp3p!GLRE1y zOBg-Z?v|4zGI4+2m|Dy3EfnwwQLOxpHE{w+hysH6PK9l`a$ieWpd{@7Ro|TNK;Zrg z68b`Cmfe~?&vQslY=y|4q5=Vj&$|PL+I!B*`g42atgLD@_dtBLQo5Pe-a|~%-5j;soz?P zkMq93)R^+v`@k#0>-(~;;d}?#!~wNf2qUw{kV8bkUAkHTE~jF}^rfIBOS<_LRPRhd zY>Dgu7><#1?j;IBq&o0NKSett+rsSKl?y$cn3Lu-qEvsCgPXBA{@03d9owXMB<86&? z;Fnj&*%fWII1>|#h-lU3*Kv3MK+8?jXJy5npa>vptP-8)dYJ>5H>wXTsErsBR#%kG zSyMK5k~Oa2IWnfwy*^uQVk zAFd9|Y*oq%FTJGa#0yX4U9nE!itv*6%{6K~`rPew+uQnqHpJUTrw7q#aeG1)T0p_u zxP&v0#AFpZ{t%*xj2okl$?N!15&8H=6lbw83YtU4tc)kC_oEN52xiuve`4?yp*Fj& zlNhlOVC*7Z)V*&MH>&{h_?;v<#|@HJ=AT4$|1+u){j{0=BNlyBT&RM3#u^)cKMzDG z#6?MhB^{zDWC++h@&8#AHFK=9i-L;E-M57Gwjga8_Qo{xx`wDORv^h1?@TC#SLUhKgAUH6lqB-T zwMZQ~*~!v7mChvdQ&^2JT-cF@DQseiF~NR79jHC{^>s=Kk* z>;MRh=y(yo07ySBi9qkqG6QsH-~6dVpGS`-+ADTcqQT0Q-BNG4l#(`s9Mkh)Qnwhd zWX&4w%2@^Xs`(1G0zz-?^~@o&vkWZ58oj%*@p5=I>!FwB1wDd&tn? z?fsr0jb9?VFnw%Eu$}0j46Xn3hoxenLABpFTYI=M7Li$x zqu*gtOKM$b6H#&Az&UJO#-)o_^TKHS+dfBhVQ%e#lHmTj&6s;#uLLJ89G5sP8lQMx z8jD5f)MfBbjtB)grRQ_(Sm>~N6wC}C92I)*tkv=5DyUoNls?M6Lb>3N<69*xsM^=1 z%#J|)i_W?Qs9s=z5W;qqV1}zhXFV;;pHNG+S_2VJStBi>L4tNhCXZ~YC`mVuMKP_f zjQy7s=4|@v(#EEAj%zf!wM)?3`F`Sawa)DS^l3bf{{>&Z;G=$U$Y)%S0c2BCzmj;~ z!VJzTW}^R#XFO4&_IvI`3l+?JtI3fztC$Yl>cMGnibwA+(y-|U?RevuxTDEIcKNk{ zvOM_F!Nvwh?fGYhG85yS@ss^5(j07b*UrJ!GxRZ+65$$4k6FbE&M+)Ra!+rRL(u0R z`k9nHuEc6@JXTmCxmoA$ZA6}jH^fJP;G%4cF{&QdlT1byrDeH@*AlJ8g z_#_O%dJz)QPp>wu9~4IWQNE z7mSGVaF&2vU&+1A-qQW;FDF*esp|QOF`UWK?tYlQmo_%n=L;`P%T0^a59KQIWG;W@ zB+)HY$qMP#TXfI8!SXso9$VrC5x+gCWZv)?zu53eA|c1maH=h!8qQ98iG-tfxWliX z;*Q2L-Nl~}Hp-a1+qdQQ#9HmyKwZ$o-n{)q*k@E+@HSK$&Vk{Mni-?ORFBm>DZHdH zskd5ER$$@?nlmazhM7}X9h0y|IOtBSkvb??SRH?gj(Tw)8LUSWQTkOEbh}oEK9Ivx)xKucTY#F@TrbcQX5m&5 z$(rlsScUwyhool9XBZytnZI#!l&M|@YW!mTzYUI~Y4u+L$0Ybt;2hLi8M)$%!%;{o z_E-2sIB||vC-6HGmKN~57c7<7)JZJWo+XhF7z)NU%8WOGI2N{giUp6|a&{h@CRijW zG~U2S5v;4!L3xGf(b&o0y20?$ z2DK0=r7}W6FK=5Y_KZTN=gt9-KoG(I;&zn#2cz$0`izsFmDf0TXP)s0(#Kn;sGVZP z!VO#6B6Y*1FtJ5F@RjK9jEF+Qh(f(s9pYpAPBnf`7lzxM+Or;KuvbtJpFjOjSPTSK ziVWiyC&yZGbYndQZ_NRNqLqr2^v14n615bfdG74b8K>AUJ;p8RjFn+}^;K%b{%Bi9 zYRI0*Z-w0W5-h>65UjLG%Rj$E*y7B=GAUe~(NR<+}P zig&}$O2subg}Op6Po%D1-n1cy5z?ND*doN65xs)> z^y=i_cpy226>5g;c?`H3yXNrYA2Nq0;!#veaFU0az`xv^n!qb+Qxhm_*M4CipD^_P z(h(W@LE1|Wom0?9JM>r@Yq8h$A~0=J2&+Kl)&K6*DoMYtCda3ZTjP<#Sn zc4KYack8cu^(cJKJ|bvo*o%z4~^qYgOnNH-Q!}jQs6kc{5TkFT!y8!w2=D zcY}A@<6Cjfs?_UL0lDNU(sE^FvAV-NszD+@xLqs6#fJ{ZAHs`ig0!R6{YZ7VHPsfq ze4wi>y-xj*<_Hei0v4$eBrA;-aFBX+=t&RaTcK57CG}ZnN~9&Q(d$~P)yJ4T=v`2w z8)^577t(c5VGQW$`u{Px|^Jr2Y9BS&K~r}^7yO2}KUt1a3k9==*#m|0K+wv%TH%Qnk}A~2Zb z(PJ3|795o%u9D9quG?wECb`&+s=*|o#V+G#`;PYAU|~s;T@^}K{~H$YPhnSo6x)Z9 z^YE=l$*wA3vOU<<4*^<=UF9T~msp#y7hzW06vg5but6>kXI8A4-8hx}Qfz8t=3{^-u9k&m ztj(1WM0@b08&Lr!ac>dk3iD+4*Ea4o-YG+;FGB0b!bcQGY8OT%$I0K73wwOsI8xu^ ziw#q}Xj_UGT~QeH>brX3L`60yQocfzIh+qwz=yVp0NooO+L+`+v%B%3XOET-H6NJ| zrPz|;`VsG>U`lKf_zU+}u@wvLVu*_C$ZLq!%JI@abx6NTed^yEX$ z79V07`@jRmgRa)Q@Sx$x;K6bDHrRNubheEL76(%6wWqKU4s_McJvmUJR)4L-Le{97uqHbmnXUDaXq(d+hiPB_>Cz8w8Sk~HEL(YTh=FJ@FAybx*d@qg_Vq0XF@55Wk)$G$MC3}v0 zAz@v2X>~hbA@1kJ*duC>YPO78-5P$WA#5cuKSNVc`&LWZnxDAukc>vp8I5kkSK`5F>e@7OU~Okfa8Sil z>2XqFMH{m7(YbgWocC!7;q=w)D_-e$HT$(o2u`wH239``D5xQM8cG>eD4U$!Zf!B@ zfhH@nsiD*&SRVbN@SML&)Fw(*jkWQAo1*$3(k}hqOaBLf|AWB43Iew6BO_o`IwfiQ z4v$Xif~ZpzB1-9Io-iY%zGvLw$=LL+uVyjKk1{s!(7JZU3Y}rP8oYj$Vs*!PS~zBgNO=Gq&HxR z>7#dIgYoEYr%tdR1bgLqVlE5QY`8}@IVo2=n^13=W-GF1kEfpxpW{Xy2|gZu0P$`; zu7RPGN*hHJdW;^p+vzUnPiP>@dQ8OcVy`(XX`?xGo;`X-0B?7xB0cD!q}0+F9FdH- zif*G`W&m~BG0w{Jz(8l{WvR9?^k%PhV(Q!MbI2)H{xacg0(w}_SXn*#=79EitDYWk zuosK+7mpzi@#79HD}B|TjpD>ZSP1ewIY{}@Gs~Ym-;{cuwe%E<6|Y#SRNg(BO$}SQ ziAb_-`*hd*y%GlBqYoj207e?Mi=W7DP5*}M1uo>9ozhantai>3w-VG zBkB=o!qGvw&`!HAs&|pmwsQMor@7_~v2twiL}oaB(O3ZzMg8i?#aYs1LK-F1TAJIn zN4p23IAM2O+XKa~BJ}-GPj{C)2Ze^X z6RRbjVK|1X@s_!<`0>oJyBHVXR{zwf9#|l#`Jl7Lfi?m>)9T&;`d&ToxYHPa(5qj2 zj{uiB_mE_vnn#hx3a9WDJo#yvTK97W{4L(@DgKbHg?fS#$ z5H-sJrwZTC9=4F~mx`vPOr6`nEacx}qNUl=78uk>pWWfl9Mg~Ib?K_^Szz@vo*6*U zW%dGvMUr2lk?AMS1X^Zwi6~j++BoBQpVG_<2KgP)Dvm{Ik3(#YRj%fl=j)3VcsWha zBy&F%KN%YsC(jG~gVqxFZpL6g(^LGv&y)}$*2PkaH^7J$1L!;woTv8z`VvJ4p3nCbtl&QqpuezUc^C~z3Bn8h9z30 z1cg_C{0K77ROZ$(JRMh)EvBZ(Z3~>P!P7tTM2>^LgD0in=Qb{571~^W+mD^0ev#v# zeNut1RHFF&RRvNJF)G~1-q-bJ)ladh|GTguAV=dDcU!zl8zYy(yY>{oD=*E$_aMYr_YPo3daXGZl8R64=vyP3kjB+SW4;-{tTHq%+Mp3g@Fevbq9X{Bxz1m;BU`#$3$r)bvh zX{0B5Ivd`RUg_G!PG#qMAPva}J++fBu*_Ok2A-al_C$KDkV-|(@R3I+xW>-lUiISj z9R6AXuO1ETp;orl};pJOmmWZq_B-1di3)x{hd0rp`TPJCJbOm z?2v(KI3fd@=TZsr^@|yTJ=(4|RVfC~JElfChJFH#p|9&PbZgj-sB#4Md8}|B;|#DAnS8tTm))-B8dAt? zQvBVcoADuj9karFB6Spa^p1eO8!i$tWNxkg>MK3^n7bud>B+7gTKy~Ff-wR0-eNWJ zR>@d1cfA~VSg910a-c{5q}|H@BX)+%F)$+M4Z(xv!pLGnFvfb($nMWFt2^(-kWRXy zCYT^0v{eBvc}l{B3nO*vhF@v*HtMQxp+^O+{Ny8&`e$)esjL2O9iuY!3xSaHg^o=a zEYxqS5}{I${xU3Zxzuu&DDessE8VVFwE9d|CE~!?FpdmP;e+76IpQ>#>v)0uP`MP< ztQ;re%ovLh(kXEk5|0IWVbW?QbQ=pS8q4@i-D zv4{?xC(<_{7Un46F0f$yaDmJMDkFJ;z_Je&rU@{i?tR?A#u>axKLIqkUbqi5ASd`> zKl%rts?V6s@~`M|C2P7q^d9)nJrJjD>|)O${3pg@yfZ|$SNm=DFS%}Akgn!5ve48z z-3jRe>%MB5X_cmvUGhe9>9t@514wq8LzU+12#f6En(Z~=%Y1Rv7SScSy4b$vJx;+s zR)~#LSbeSd8R?n-k;t$elB)Zqr74{sonxc8g7_exUEG;ye@$|Oi{xe5t#Mn`>SlqM zdW&reO4_XpQ7!w7vGrnjmXoCyWbik50SS2zv0MMfDTc*I_-p=ZUT30`BtaKo1(n-k zyv9bYJb#DQi|yL)*k-zeY#eiVLqULXcK>D%VwpEJMg{>j^;v|48xUF#OnFfDYluYeK@0wYt~n1mYr- zuiY(9%YJ=r>^JJ(IaS78&hSCj%Ju5^DRzgzA~&l;Qk6jdEYlpWmJ{;);IyQMV3%bW z7L%dSN(#ki$TISMtM9>YS$z)ZJ5wFLhYo|Wjfk$jb~t#p)!FH%({7*5nOD)4XcWA% zuDTOAPl~zo0HBIZIcHtubl@J_&Y-L1b8QM`-L=mOdkC>lRbko{RH z?9tz~9+&P!w!u$oY#lz6!(|0|0|>E#M4qXC5qh*r#l*S_mFg=wudITRco=B=PMg0^ zw$_h4){n~OIz!%*f7ZKhBb$9Ui^zSfTS5+h*WuCD{ze`irXVL0+^Mk_0lkwU9`0 zcej;9u-M!&Oa}grY?q+Ec@vafr;zI`-DcN^DU*jp*GFha%OKsf5v?KHs z=s{0cuy-=D7xcu>OV$3y>sk}qE)ou`RLOLUx^RybQMi(cx zT-g7Yd9Z((72wOgtM(&gga)fc_t^qPd>yxt)P51q5s}YZDiP5wPD4!kP>zApW|Vj%1%AV))Lg8wHx(9u*w!*IFJCYf z#F195O)aq(MM{ueuB2>nz3WyvVm(TpExX-= zHjRs1@e?@kS}K$PW>zbNXAmxRTvFdj2$Du`(9qVCp@z1{D zBi_d4DNUvE=yuN5$TUN#+SjTXLgu^sld?uDR2|TtoX9i0o4?EMGEjJHAQGx2KWZRS z)!>2Wp&&FjqJW0y-Rgc`5W>=U_b2{Mby{3g@0fGHhaSBFySh@URpFtTCH~UwD8cI! z#)KTr7e&)O5l+Y9E@z=^StU+;^fqB9&CA7+8q^)*TPB((%VBy&=rmt_XK-*kr!r|3 zv0! z=`Q7>W@&q?dj!E8GrYJjIyr_J^vIucT@bZBymcfmZJv z0@q%Fa+xA)DH12LSLSlLfLc{)e*cQ!^3t#Dmo`$K5U;U?d^3Wv%2GZ#=^vh$=YH-K zItp~entm<~w4W@DyGvuo{bVv-uWyi89cUz9=z)!ib_vMkE zpweWEwnzGbq({2PDD3BTvj{pEZF$>WOyH&VRytAwPl6xSFILPbqjWXA zD8v1XxQ7ZyIwSmBX<9TR(p327MZmvmF>HyQwz=n65i>%IVv8t(Z+-C&_7`}fH+dW% zcpdxP;e$0ZpTp}NPxOmnENf-!JO>3JOt`o)<&J(u{bD#u>1N9v-B^tFZZrHu)X5%U zD>$XU<{q>eFKS~k`fjNwQ=habzSJTrL}nJ>obXM?;xxBoqZ`{j>gv#)`Fmi*#+10;ehE#DEXP1`$JLkZMoYWCADXpmAf^kdIeLq zyI!@h3|H$Ww{koGK=5V8SNp^`Nv$#q79!w_U*a|{R6ggGJ^ipBumF?vIR{SQbT2OF z4=ff}Y=uY93AQ91&IQYh@sjVw<$THamCHGNGU;$Gh2wMDcZo~6ke%gMo+-3M_zHWV zZr83u#;7gu3c;4{SKi;!y1ST=GKN&AA1vK`h^zYr-P^T*rhLDpcz1Vq!RJW5Ah%7e zkSMj@#BH+z?uq?k3=B4QK{uD~-D-F9TY0t1v%5sLho|x6Fjq<6(Ry}E->klvwIcW$ zIn!yjch7Dq+s(5(4{tD!Zpb*iu8rC~d%+}K(K4H5lpk;44Xa2uKnWWQNY0}+Cf!dT z^nnSML%x0RKw*Ja7vyE(D9^EgX>}h#0LqOuE*GVZIEh1QqRA6bT3Z0yMZ7X%-BhYw z$3}4z7r!g5?hnFN6o;v)8Lrn$f5lB)D!^w|etI2m$IfEG{(sne7x<{EYw>^bf;>5c z5RHlwB`Av2Xs}I)l$kKW8JH+mQGCauDYe#8m=S!EH~}*p$8uZkTkGw$z1rJ{?X^JS zgFJX7fRNw|ijM?ZJ>zJN*oJ`B`G40wXC^Ztywux!f1iK-Namb<_H*sE*IsMwwbvRL z5W3yFrN#2Mwflb~gMLJ^<9^Dt4)1XVLsC%e@8VX#k|Sn`DR5MKZOjsL7_5cy(DiW( zyf1!5Agfvzdq)8o$f?z*#Re>5vKsJ<$1>n>whW_u3zlpqfL^n3SuDaWRCH<;J4H)d zjoi&?PpOr6z#?2MF}DB<_5tSCmLX~dt^RmARH0A)H`6fuC2iS$;8Jng(+{VUp)&MU zG`A{mxJSrM$u3b%%VF8`ygKy*mSOmHPRlSn@c1KA5Ug>e1eZx8&QN+OWJ(Of>(w_) zVFuHS7F)g&5EHv_DF*1Ih^e`4G3~+~kw-*zTV)zh*3(^Okckm`;BnQ-gtoX~pt_y5 zQPtj#Wq3lhazKoiZ*0o`8v&%$tgwU%<=nAaS!8km4JFr>y~D%}ScV@KC!_(R4Xz}H z6MNwsjoNGDIC1*yI8HcMY!qF|S^xy^R1B$jzFZ0L?wDzKv9|25Y>^frd5o_I*=KSk zAHtDrqq#sWt4Byz%jzL{5E<>*mz5ZH$ClMehgw#$GscO;nUt_h!5uLTV5zLo<*b&^ zg}yxoYYBb(?v$gXZx>W2)3^Hs-ZA=?%dQ|BLb!=FslfJowK&luJs}SR)W{1nq_kym zQbbCe4sG>|;i*>tEeZwhS-EJ@NWF5UD+t#pyJuzEzQ~WPmY_P9O3mf_wEMp=UAgX| zILZ0I6|7n*^oBTMRS#8_uT!^B6rK6j4T4iu`Z{i*JbDW_bTECM*jfEGqBO5S9(H*bhxuWU*UD-WG{Dn6Rj}k_bz65@ES4Mp#r^M@?8% zwaJ8~*d#3CSx^Ye5+N+r$%JKtY3l7ic;*!~@n1JE^N(}?!8m_zeCA(5<0mt3krHuy z2Pr9qlq~vEGASw5mIX{3Z^uD2#CKaV{g}%_@Ldh^_~s1zSZFg#XQj~(*%ia?$<9^9V%vQSAWyRGw%V&#JVsKJW>UP>Ev8{~d5jF6 zFo+DMD6S)NazO3#w#ac}+Fd#E)ku~z6>lV_ZFeOKirMK*O_FVQ;O-)?EpFSrOvLvj z>u$&SrggW3HF7>{T6b5iR2%L(k`&CgBbq+^kb96_H+MWAwusZK*j=j=h@%7CS|!RK zm0kDrQ0}mpUAJ?}R$_6j*moGa?seF8uZ!7r3ypE!yoimB@t>)b2QfX)er@i{I#Di|4>Zm{E|78(@ef!+Htboonp5gz~4epG2Nt zW4dpNnS_Zk*fF|^QNEPMvxn&I#;bIO{km8=squ|fK5cv>CfN`Kl)n(MB3}b5Y*QBF zYe=@9*u>4JWOxkqrrP@>{4jQ%)EAydo3VTn%jPAtAo4EH?XhQUvBjb;=HoqXCr_Yo z<3B`g5*R1#C)(>L`6gqTMrNW!)JQg!__NO=^0JYWvrRD*v{0 z%ItUM!G%F_EGJ+9l+!8mn9!@g<_TV7_XNLD;0Z1&6jOIIMqS;zq8I1fXw_@hxlw(Q z1b*}Cb)|HTxZ};9;H)Po{FHWOGnXn{`bUH%(IYNBBEdozID^yM5x=zhYQ%VN=*C=G zg0n-5F#aA>bXUN zP79*>Ed=eAvCF{-oaurL?f$cP)K&u+#xl2j!|j*XEzK3jqWAd z(J#vNgdVJ;9=HAjnWrket^;=mjh3#7k}k(4qRg7W6$BTChG>(FsYpW7TTv@e15)Y` zH4q0Jupg=(V?S)5)KOv9;R$`mM)NdX>}*s|7*AB;Es&-Q^;ZZ8m0oEU7)b$_epAt0 z+_nDf6ME=uxPEEFbxWNMkJj?m@QD0%mA|De|2Ypapj}dheQn4ze4V(yiq_~{qhxh9 z+4u?7eHpGe(0~5oVK_|0wUyo$a|i2e$h9|QrxAJlmAd@`l6$vDX3D&o(4JO$b&79_ zwklg&Rgpp%@-y*Pk5Ae9i)0kG+KPq;imBh$@W2H5N!w~>yLYEM(3)C$lD|bpPG8hy zN<3Y=$BxVXQl~a@IR7rOYj$TLiN(BJR46IMq&P^KEh!F3na$e*QmeUGDv8z9KHk*SnA=O`kd9g%X76mSg}BNE(umF(N;U}t_fD$ z?bMeqVKl@RT`r^I_d&b*9SOAT%L~oti|z8E*nF8mU+v2s))#tje{i<-g+AMtS6g3Z z@0CvrtWVXvjl39IFk=bRuw4Axe zmAqg5>+OFB0-~er5}r286SRQ}Smk08m)?*Pd4FGPEu@j>k&(Cdwc0Qg@n<`g*Tdg8 zN4`V~{&M^$gzmFVh(@Q1iN@_7XCoBN_WSNgfqd?c`oC0nAR4vX7N6^E6jt;1IPBiJ zqP69nVMWt&Yo|A)kMaZ}DgO7eH+k@((va;5c~ZjHUnkhyg`Gn9d+fYN4;PDfKiKE= zu#f51hRRO<8T{+zU%$-{xyTs#da5L*e5ft0+=0i~X5$02d*XAN8xQ^*w_eq3g_o|q zr`P7w^y}V5)zxei%pAh$bec*uolc7(31$FG;I59^>$E#?I*ZCQ3>HRK;%aTEz(;e% zIoz=``C5U-AQ?sfK)FEYj>eyirW;u2(?_p-VwgXF<3*-x=ZlI{dIPgY+o>(GR6e#C zx%ddp;``}T8+k(&Nb!x4`xjWx*aGwHHf%%?i?Ijb7=U*V)$s^pzi;@{;%55(DNgsD1?@yVLaP zh0%80!4kgpRIhlW=g4l8aXTz7-p%z{ndR@VfCq#U+~&jsHrAuJpH5^X@&EdvSTCsv zRw|ZNdMmnI9K()oj|}JYbGY^CtH6DB6DBU)Zxi>~f1Atxh$CJ9FBK|s5n~KZDw)cu zsE#!K5oja^;14y6d19$VY;>5xGLZ{E_A0NkFv(t_LLL%>aFt-!4fU!Hlbh2QhZnGo`RKz56DXJ zSaGC$k?4g>k@MurtJ+MkW|J6gZ!Qo?$akiEm$)HH+TI+^Uu&jgnI{5C8O0c<3Y!8_ z9Nm4#!_bQr$dVSl_;mF0ZyZw}Gres1;sCYyCYqoDdU+bhMgL5Cx#Ft$_&+VZ+{>lJ zW2TqOFBpKpH@LqtKrb(|An>`;%S~a&Bugh{>7kNzKjZi~g#IZ}x0ICs!*hntFM1PU zq%TAJQiyFfUbqX~<$0I0u<_IIoRrdM6_PU3O!+S}WdbP=|S4hk- z6Nj0JqSGO<|7A6n4<^c3bfx+!&x@FeuSw!jugb%3^8;&EVl)-ZiR+tGm%t=afCZ`K^yls+@T+dqs8#ma4Sw_vEKAU-nkEBY`s+J zjPzdPbm=+vHFG zxUd*}dh|I&nv^ZIDT6}y%wz>2?X)nu1|J&gJUoR~88)Bcn!kyx5$gD!c zSl{9Qz|0vTY-C1SSE{Y4mYl>C(MAr_>~2(A7bCYh3bm0l(DAs@XagOW?+PRaPxFA z!VGC{vR`aBALsHo*Lnb)etVIum06jjTx6y+ zn<;iurkW|gHB;u2vdB#NshLtu%Gb@56_Rqq9o3X=K-&3W>w?;aHq7HWjA5Vr$qT7$1y8Ddl6y1w#9<}dtbKB;@ynSqnqH7wHpmU( zIb>1G(i{4Xl=0}5w$PpREK+^j=etaexu?fYZkCRd&DYvX7xEJRHWIZn$XFhcL2308 z_(*PQ7g=SxjajP9pUwUE%Ti_w-E{`XaQuREEw}!hlyo+ZAXUg77iJ3OB8|<#fI}B& zIvX{<3~a!Z;WIn%n;aGj?UYJFGwjYrd#nc8%&FmdGMM$MOtFms5+WHwm;TN8smh`1 zmug};pe$yN4~;vekv2S0LUf;mSj+Dnj14Bj_%^>1)eEg}_^*f{Zv6^-B+tU+(J0c= zUNJGbGWey+;N+snU#);VF-X?+GIV{tzJ8PrzKFme7BiyJbRjSzRG6&HxJ(6FQhE`$KZ2P$`ka1 zgK@g|4d~vYM7sAG<^QCG`%ixP%yfox^x8sGeo;r7;rjsCmMu-_Ty5do&F5TszQufI zecHm;o6jnbFfrs;d1k2RA1+s-8j@a>aC~yL_9EWBwdt z`&g-{4f^+{|9#Wl4ODFK6jB$LJGqEz))8o&Eo6ryVt*E!|FG|+*dkwPYGyD>PhgBy z49E^4Lphua-bNc3WUz`~6}{sn6os>Z)!uA;6CEzUkzFMn8w1x;snlysl}?FehL~Cm z(Vc^^;s`Q`SO0@_82>9JeeU3#UM}0C43 z^W7pYpb*St8~(5K4P8cBYm;=X#Yp`|^YDr7p3sF{Fo11GLcbW_tqf5m4@O zXliBXp3=(Dw_fsuo-OK>%%O`OqaYpOXkO};E~_5wK=DMQs=LxMT~{A-dX4A!q&m+j zu{zv(M%s;aPk&LB|Dnn>^azl=?l3&A~t4yK0_DLSuZfG=CM=a0Eq=p2ko=Iaz zp|x1ArN_5e&CMDnRm~+A^@y7k2Bwp`gS*1MwmdB7kLnnCrtOdqn>Vq!p4|d|a=9^%BXwFAQKwfoSFwXdz zw5{ucS;jTyvmlUhi9CmNp$k-gsab*00N$osmCM^J#sya8%rtLjns2fcq^SaV)pfxl z;~yugrUY+{Uh`Sd!}zoLEcDLUp`Mj7+pVbZ1M3PupZK!_v{-ExsDJQwR;G3g*)2}l z@c_HUr3t&m2XIfKbcQ!M35y?e%*Hv4g)M^D&Bjc{P!R}ln=zg)uK^Uc$QeodMV=bU zgN1xDn$DNa#vOcA-pn23(;s4qZI)N>5b;5iP;A+lKl#U&G;?NPY(kpeXcO_@xb<)QSYZ&htDo5DNVJuNKo-Q?> zBsIzt^D+Uqr|RdRZSRN)hwFd#K>vRY27V6xUxSQndDp*MYWy7fALlt#l-UDbeW#dr zenF1G`GaemK7rOW)v%h19zhW`6$8ve6<6YRNuaz}+&qntIn3hzO$~mpBIaz38kjBl zP#GK*`4tcDz(-Mk5%U)F4>5TDST@XX7}kc0PsjhHwi^2^2l2pDq(+(Ixst^<%tP2z zf48ztm3Ha7|I4cS(X@8?U7v(1W+$*a(gWk`?ZByhF@Oj?sm9YN7d}6NGd@Lu0u9KQ|R>$_CL^Z8dt4y|CeIQG#oyXsbI#_WXCT zi3Ij}+Un^LA>z~Xf($5!`4itH_WaQ>*U}boTJbm{WJu4b{R6V6gj%dG>L#VmV^3EU zcBhh?n?${9xDj?ypWS=DC(yy3#yMaKK_gpgD#|W&`}=repPQR1+H5|VMeaOKj0XLu zxv^1_dc{WRr;sLbPLwGPa9@Sw8`=Z~gxls`j|9s!?wEWm7AJ}R!`=Ew4^l5cqj!2c z(M)T~E}ZG#hh8DDKMf8kIK4pZ35aniJ$KOaK!2LPQGFRBdHlm08HFwKMd8W>fAnpU zvsIEyTa5*27gu`M)&%-bygj$Z88B|-PydOF32D(1dBdr9FqGh|(F}x(nm02>)C_6H z>nsX=mc6fKxb|?X*3^^5{lU{adC26UzSEx;ybBTkXeFYdSNOnswqPK;^G<7=75+XQ z;i6wbz*+D)j`2J>(UCFkXT9`Ix2J#F!9bFsJZZQA2hNJb4hiV=Xe+idt;uF=3ZKQb zGo~1zk@E^ryIBxU&-lgf;;8+UN(mb$Lvfvr4&D^5xg&yA+crYk`Yscr8GX9FQLZhFYbkHh>LtWFqf_JBx5I?t!Q*>`EqfVf4_lN<%o^jh zWoD&26oBknlaYn}1_LVaP2dG{7)3out8tZ`r!7;H72U{-?;ZePh9G75TK#5faO0`J^d6F8vO zZF8hYW&#QUO`tlbzt2_P>^om;`i4E$E$NfL&^^!}Z|D*LX#woJd1?->09Ysy_H_oj zq1_J@sUbk}o`iCGLq9EQrhmw41(;eGd+Y4<5XKbwWdthoLB5(TT>0P)5TI2vn@pkNzvZQceDTzwzySS*c5aTk=XRkd?YkR%*hsIs+y| zE!0fbDGr_^p7;WL6H^Z`Vv=lKvO+4#CSQ`YXW`yTZF227D&u6 z*_2+Jv$=@b++%HG3G?){W$f@NA)N>#3>naF=?6dq=*dn&>3eF*&hst7(CgWEQ*6e4 zbc*#opZA~gF0xew;|`L(NYay5(hf6e97(^ll02%Qe|%Gp%~lwhq(iXSCGN>sBbOay zOTqxmhXEKO@~BEa+)dG#pq6Qg{EWY#4#nu^F|N@0tnATZI)kl%(6>` z=a`^$j@J@1ItmPm%$NRDOCA9TLt z4lXIQ`~wPh?5d)}$WT41Uj0MjXgPt;G>@)@(!czpiLG7z?s=T^{+;j=>9h3FXBeAH z)Kukp09~dhZL24!MY8Y62;CEnq=oz`<@@ekyR2EP|J(pnkYKi{wPkwlR*)<-?-?iW z#EH;MepaxRJ(}Y&S@>~VlEAygReGulv6PC{Fx>dA6wEcgLqW1vr|sKW$;ZMa&yvFC7vx_rGuW(Dxpb2(-3jKAaw1bvU9wOuHh|1 z5j2q){x(dlie+z7CN$rHy3(b;&?KCQeC<6|eXakws`2?+e)!BeT$8Xrl4GltLq3J( z0FG^n=@22r9-8x4dC!Fj5giZfLlreuYg>))siHm)S11G&bswoKR7K84E}5~SGkV_^ zTGh^)&M~S~H~klyN}vK~V>Wr*dZ)g*GUOa)Tn_Du?18O@CRGbs&KI0qz=|%89m*>b ztgL8aTjhBZ{_k&<7M)kTE4znmh%&7Z!FL{yZ-{o4veT%BHItihbJg!=x4z~vm>uH* z0Ir9gRzQVJ?%Qc@ntHq5o6OEe^Zhf@xDLqN4G)eDO;3ryC50XnNW;n&8mr(f_=YAs z?^aC&BNdb;e0Nrtbe+$3FUM2Hy{9K;(_^N${e(M*HQJhV}lEqnPq68YvZ)Jc=1l8)l zujl|~QEIhjicx6b1>t#?{hkK&83nk%Tw)5Ih5F`X205C42NlV7GF#O`sCHTMZ7@x` z#-h(NWzXOZ>2LyH6?wDTRd)Mm-v!=zGnBkp=+;LVzcx9%!hpu*ob|yQuu>Q?AUKuJ z80|ls8Y1KShNt*3!r*p6#?0M9NeX-;(GdwH*{>)`3T5@-3Bu)X%@LU3K)4jP|KKtF z(P@t10lrGpY7Eh{71_E#AFkxe;q<$}mno7}aCl_48U?B}`njH6dGgnh7jGNw?^gH| z87rCnlU1fK#B2PGSt9}L*$QEMA7!rC;PSMlb2D9Ki$%+ELjo0yWV(W1vRJwYiemKe zsnJRF5IXn`4(bs4ZuoqTV-ivLGe286ZOLR7LVxYigAn@l;ey1y#>?tAj?7u$l>VTs z<00{RKu(M1@0})7=+8QBxVhJ}lRv2FqngW-v%p7Hk>o)o^u^GnDUosVQ1+lKdmpou zkUx$5V+Ok`t;54YsX_a=4kdg7 z;YsLR;(QGuA6_Q%;l&~kz5yrvRi%mbeVO-P^DctiC6;nlza-NYx|lGIqP7(&Fq(hq zmt}%{N*aumN#>vaqdyusm#iwADflTFFq&VaGAp+nBSd^;E`~+(ub)a-q(S0iLg$a- zQK?Y#N6=gGp;%L%?Hl1rSE|%LnzNhO9lTpB=P{lL)E6h#3#!OHGn zrD5DD38AWPb${T|$Ar=c8-&rdu3~$Gs}#KmrisvTDm1;&2NRY5wl7SAgXmO(Br#w1X_ zxQ?wruka&UW>knlA;H!L@$rlozcTj~(-zuV|2%pjXcT|hM zGQG;MDZhS0JY;@EbF-(({Ah=BdE8-J4U zu|_7zWk83rgEDUoqElDb1Brs^DuSuO;7%;%S`c|6CrsR-*m}LKrGIRo`;$O(8ooJQ zErZ2&>sI#c!$sUXJdqLm2T_D($RVBGI05y6bp+kGzdy<~6DcLqhR2vJPs> z+ZUZ-l{_V0l53fn(>S=s>aF< zpNlXb&&-44GF%Obde)<(M}(agHMIX!C&>A-g){!+vT(S*ptz|@{+rB5Sp3hUB@Be>{=uA3;Egpn8!Wa84t&1)53$ zuFap%k&Z{qlr|eLporA_!;1c+udEjTM+>~6@xQo}oqz!>ajsPp5|3Y^t!5j!Cbh;{ zzHQOT+Nus`pUaz?;$uPGCsV4e%1vQHB^C!Q8h_$MShWpjF@lh)soLsZ{gb0C{79^@ zwz_#@zkdWkMiniVql-a%FYb93$nIV3l~soS$WogxS8nbW1|AbAe9Tc7U*^XrBypPm z*PdhRc?9d(m*uI$(?xXY?RMkKY?Ic)?*97#ejP+3kG!5&$$Cy@#ez8OL=X=S{w>Uj>`g5$BA7pL9=iIfjN`^W?5QS%XsEk<5}z#YJ&^AYhWo? zlbpiO&lbe8&QWAwuej@AC8A3gzkpeekWnG@iJ2(&>Bz?PYm|NVWyjoe`EXxTRV>u-m zJme%We{L@^emdsx&6JpL6<}vHKPYT9?z$?A-SeIkAzTF_{Dm-gRXV=4D`8?WzMfse!={HaHjdhjIPa$mHiV;&X7iLXyr)bOXA*X1O zT%{BIJ<4-pxJnB5-8)4UK098xP!&GOxgxhHUV2(W>2AeEhBcC097~Dzk+TtXe$XT* zj&#r%2F3BtGlT>F3q%|@a_%(3BF*FmS(p1{A^>$^=D-JcBjz3QpXRPRV8hsA@fYy# zp~0;!=J*MOQN}rH z5d9)t#RsvGL6GmeV#KcH%L-g?qn8NRdZ%l=G>(3JTe zO@?OmmX$@W=4z|Npya-_Lr(1YEtNmTcnPwrT1{@Wgl*$_sYLI0mVMEzrbYTD)tu+& z?2Z@WP>qs=x-!X0;?GDF8dg>8E_uP|g$TMsH@o8pOxNR5S?T2?uYGRo`u}o8$$LaK z28qg6w9BdY%Zar_AsQiKHY0@P2-b?e(QLQ5fvG>nz)@V< zM1~QAF_p+~frErB&U)(Joh|f1&sY$Qt34emWoIKNy&NFjFfk1j?sSJ{qj*2?@!~5) zkK`!Xz5?E_zGyOexkJr42Z2(2Xok{a2AXe*!K9<%p`sF@HWQnP8(XYGM|*)9Vd~q3 zD}=M&6wSYoCd7J3HH>Kc4dH0()=AHfX@ft6o`~7lX@ck$w9|k{tCvV8%5WwxF!kHN z7eLj&MUwOR(XtD5JAA>|jXDrQvaFkIMBiLQhMM37zW)}_Is;IHO=8Sjd1f5EsOrhwF$kOnKoYo?Ss*Vs`?pa7j` z4PqliCBpH=W+MeI%G$(lg}D*d83a-1$_JbEyq=XT7k!@VSI^jsxnkRvVBS0GSLUz) zT(LvoG9?_Ox%p!;!8)wOIAY!hflog1PjYT>mZmrZH%_+kRGi}6=u}R}L>mb^mUKvd zecQ5*C0h9fcl}Y)^8kfkUZZ=H)6HiMN-YM^D zjCKOu)4ZXg=9zl>{)#?VH!6!Kq2JTr?pGIOk#{d36JPtyum1cE({Zgf-Sm+*y)-2- zZ?Y{i8WKWiR7A7+6mA2XTqrTN8eig2QLa9p$x{5>z^-5{Yw-v`{=%Wab2uoE`psv9 z@}C)TfU~6^Jj^9vV0v@yP3@&0;~owChvdmED3-N@WsM!%QQ^*D`bmFbuH*f6 z)8W%%9Uhs`VL1bcTx+fu*&Pan8&h46=GTrFcGrJgH2=17oW{4Kjx(M{aTUSKA32q8 zuC>rPMwKU{+Rdo8xm)%#s?pm$dTx8|OAj~Z4TwopRF-P8SfG@9K9OH5sC?$(s$nZz z4lF)|jw$NduDTh`k1!QX%JI?sou|ddGnVnFiOjGjW?k`6o3Di<2m87_=~rymL;AWL zzhbbj%M-W|C%!HZ>*{jSzW!)%Zei^`{mTF4-`EiGf2k6IE;QcM=_q#T=$(^?gt zmYj3I;s@PaL2wrY-G%tlfEO=xhuoRQcc3YQ_noNiQwW)-Xv{Q!i~@PsZaguuAmqlkMO9zB1nNuE;hOlb#7tP+r4AaE>e`m@ldq{> zTKvncMTPNz(rTv)dqa8cKSPeu*L(Gk;mZ`4CMT|ccZVi7&w@kq>X-LUKq2YNt(}tX zA71P2ElrPP)ZWxv`jIz{dEoyyJ>~sc;5hbNCqAfcwiWi;11D+qTZM6FL#REF=ReNF zp~S@6vTR(>qL}$Zc0^Pj4P4OJ>h_(zf(mL6WcxEVq-94I z!meyc%ai@z8F&k$=k%6Yq1?WP%iE_!u0Xu3CLdlfd@s_PSPmk>EZW^Kf@gKMuauJ9 z^2BmAl=lM~QM|-@smmKmhnL80saWA^DSg7>&&o}$Xy7rD(J;!B_L^+LOD4XF5<&( zghTIP{tY$%c^o?{1TahlFiJnVIFw!i-$|4*PkFBvxK%LVnLMVwGW3nVW23_D8Sns! zO7K8VJzn&W7DPCgs@3WM~SXKxuF2fudTf zt>H{%0qiI-;^kEkWP#G;D53b0F@g>RJLOZEnM13Wm~YJ49uA5?jGjK1QR;q9tcHCz z$m&^8Q@-BMjqHhGu^Osjc`iXD1XJ8C2ZjNbnvH3BluvI4UAkt5a+_DUE?m;!Dx1RX z8&CPicN;2eGDbNXZf(CXazjnotwjq2rQY!U%)PM{@e#QM>ynBzn-Frej0d)+t{raQd;!R@l zKk(N(uZ3aN{6u8_W+(8Jak1(IoGr5Q5=bCH8N8wVDdhF)T(C#h@{qY?JEgpoVD?&> zfc6!x(e?({NG6~a?Mmw1Z_9^@4X*YJvlA+_#-ixnAl!G)gX*2Ka3h*d{qImcA$dX& zs`MTXH)iSeA637YWt$b6+;{n1!|O^P>mg|}!y?S6~m-2%~yeQ)sgPKjIvFa-}Gvw=q$4cIvGP5z z*ID`l77$1G)!yAzX7dl%+rrC*4$Rx^PQ&lXRngjV+ubNuc834P;OR?bBqm$wi%*0E zFC6We_KS%YUyrtGRE73@{Yml)D?ZBbz#we2olSA1itq$#k2X8Y zaXEw?E`jvI;?@v~&E6(h$GWQ0A83=gbwjc_d2L~fxP`CuT`-eH?rgZcWeVL$U3mHm zwk9bm%gik8(d(_!xgDTxIr-B3N6vSl^k(9Yh@HEh`U{?Uos88uiEY`^a87)aX-3N} z(Wg}WoRaO0as$Hn9eG@OyD19J%NMD`IGqhCJVMw9Iv2|S&AR?*@=oN|A8M5$Vi7p8 zZQl+yrPiq@brgME+mo8zK0TD4Rng#WohtOAR-p5Ljb417BuLgip7xNtE)I>ZaL?Q6 zg?kWTztvN|ebLv~$|fL&l(I?r%J`e-KheWBoizL1|NfP&Vm6DZycqX>Uak|~z)t{DVBz}Ye zn>IUKhFVbI4OSQ83O%mfE3B0JP`fSdUa>LxeQ=@BW|ZuaRUy15t3uj#i&A5@9QezT zta%~pI!nR#Lrm?G6?`Wdk-wT1y#ub96&Vk_0u6X7NyGHrhZWo4HMs=Q;~D7jTAg*W z&n>+@-+0`r=08+5N>X2q2I;yNseQAkpJr2orGBC)k=pJUXz*)h;fTiFT*Agv?z?ZW zVs`LwB|JF9D853wM=Is*t1Vz{|XN^!1@DQiQs&pScN^1VNqq5W8WEG0e-lcX&-M zyRD-B^4?Od{@*F%tV2cygeMp`(ilzMsG1T8hQG&m6|~yN12FF`P1Tmo=UGn9x6RbO zy%S)@W@yh}-dnboZgG~v(U-XP=UCw}-Y0JIomaleKOVcmeVz5K{xQZsIL)Gwf54Jh z78H-Z1d;g>d;c&X%! z|77FWs=i#BG=5AA8*Q09hNn}jxXgb6HYmjy{i+mDP&lRHd#N_p3bT_+(wU{_w#^K> zJ}72?Z__^!a~ix8%c51|cKhytxb;qPPHFLd3p?CzI2(pXUy!`sv;+Eq8M5D1)^GP+ zCP@`5yuIblDILB_ayp$2nlp4qzm+%og5)iCP1){0GnV&4$$KJs^Ub{blk!5*U%=X@ z*y#CKop994k+rCR9I(@OepjTa^p=WJUvKF>n2^fRBYbLcH2(+0#X?-Eu6k7?U52BSF8S_+p+XFX0P6=X z3FTH)!53ZiyiBRKIX~@J-4#uXhP%|s4K0f&@xShkM#J;yRWx54k!Hi<9%PNe z09mB&y|6rH(5J9m2MhFnQ(Ly22mO<9kRRL_o@8{8hb7Z7Q0g0?z9P3jH81pY9yxFx z{C|KCKL%3xPt6+N-^>^v2-pWKo53$w;dGQMr{L^f_i1h;cCuvb-D`ncb~kvK8`>nC z1;KKPQhdXWN)GcP-NwR~mHtS%oIHp5|*U`@r@t8DMaLs z4Dw@VpwCkFs@cYrEo2PLn*cG{Y%IdwNyKcW(wD`p#(WGjHNXqaaVtCfYIoq~W?NwD z_aVDO>k9vUQG%`zTbyR&ZSenyy4xqA`v<8CA5w{*L3ew|{=Wjb9lHNL3kUcAJA}VD zV*kTT$3gvnNhN-U{>P@uyesO|ntDg!O?_OmOXpB$=ab$4=>3Opq8I|^DAz{6hDi#h z8S{6>_vGvsu&+~V0TvFsKw@x-Te@97%~+~3bCROI7z=ofy~LV5{)p3PWl#{}77aKLOE=VqgY=6aNIsO8ECzs7i zcW4i96scKUM$ldH7Qv&ku`=He*;DgFyuWmi#xUx^mc-Z(gF$1kKD?>)0N=(E1IV}@ z&XrGjhKoG0QN`OE>bNGU2Z5;{d@a?Ms)gzx8)0!io%DGNgh0D;I{^wi-Ho!R@ZZuJ zw|4J#k?zN}xXU}yWjOKX0K+#K^Ue}@vV|wO8>xu@dY584b^A>ce0SO=j%6`tg_T=0 zPVAyC7LLyDmQ7v$tEJZ4n%ih8qwrTLwzkF+64f}IXScgw>~>=vvai!Uu2touEbeu= z1(3N{n~R?e3MBXYXx~sp&#lpxa^*ZQ^=(8Po3<>>-x_Vg4*qr5Xp3H)EaPpi(LOrm zP1+&VsL?K;^dIW^+(|#-SF2xUmg)RZd+Wm*?aKFRv~$;M%gM^=nlVn}}U`Rc;HN?BbuOrcVB~e6XK#8Tt6lJ6Zi+^{2hsRh#(N zDx(C3r;JnSbMqpquUC<#^0dpheJX9Pp&M1z*XCcPe(mp2 zW&U&jN%f!;V_Nj`u`bZ5q$~26j}&lw57qHNNpcP@+R>M691A@m-QcByJ=m^BCwl;O2)qa!>d}>e`G)94$1qGeUg*kb-O=! z@|3yO!=(3V6@YcC)bmxgt9a>ZY+tv#r*R7vsJan@AtO!0K3o+42YLKb+e^n_cU6 zho2ljU3D`2$?t2x>!bV0AzH)2`T*We}R$Y{qk{zk8kqX`2Mc`XhOZ_@{QmBkla5sbN^9t z&ri<1614m}pM7WYFk2o3KNs_$NF6vIkW%MUDv~Z&krG-uT9W>+e4ir(xc{NIk86Fg z+uC0Tzt=3=RH;?A$M0tkdfl>YQ;qtrtu}9Q4gRj`d(jvdb7eUA9amF&OQ75Cicy>8K4m@$}gG_arzIN5!C61H%7($Z5f z(1hfVMyCk^kGI*HHNoP<5-s5ZiVWn}ev57&sUx$oS)4SCOYExvApV^WNW*K)Z0)S8 z_^0vH=wVJPl1!%d+slhG6FW#_@qB^q=A4!xb16`(KLFpk#!-t#j}~eWFdJ>WpmBXh z)@Mz53t@p8ZD?g9C*o|vq25^8ksQwEMHsErT$`P;+^fOrbEm3BQ#e(vnUPZ^(WzF9 zORH>+jN%#OkL2*nVu*0XrTeYTxnv^3gYp>${ziD@|i=mgcx0G@-kAxj4vZKP_>L&Sq3a4R5ajCHJAe46!LS5xs1RY z5|u|It#VTY$GNhGvKrMAO68uo&c&G))`_|0j(af&O;3w+TpLO1al8~TU+Q{l!APR| zI&-?z-_D#aS$vE&l>4xa{}jc`IV{MBoQGJVFc(nHf*8n5Vg!-mtWz-tiM)sK1c4se zYf|-AHky{6G*aX--PvX2w6hM^6Ec6(0e+)w$di+>Jx2RG@c3j9cC* zP|J}Hn8=dTS<<&w&De*>4&SrC~09G}X{Bw;%jkLO5 z;BRNYv5VfU(A+s>Pq53*VgLLcMgj773IMfCVhZ*PttWTDss(xq_w6{jnYqttSJP|0 zWtwl9=39DByHZ}sFmYfW*j<>@zVA;`Diu^X#(gb@kB*oH8wN7Ba^4oaZZ?6Oh}Cuv zckgeW&#kOKT_(4(T8joWx;npkd<~f3xc@avzI@cH}y7qbf z=n03HM8kh#Ld3Ku4HY9nCCgi4cR0oAN$lq4d9j6Htd`W9Boz8%sDWeX~Qi*259uezA`2~Keg z!`U)Mu5BDZe2DT_=caDSF0`?<&Z$_!#l^R1zV@C%oA?{3%uKlFUo}B)GM>>cy#t~; z5Y>UG4n#vYD}%*o4UOE9GiD~GT>?%ej(QJk5fD;^My!;17T=r$H zegsqiw{D^7+ozk&5Y)++fS+E0#^~QYrTTA7J>-pX3SOQCz#RmNg6Mjpil%2`^|d#8wkUVm9GHWXua zBo*2DF72-%sbN^yE*!HMk33M+%pk;fPBx(6f}zYx%zX|{I_Qitzl`1YdTYC76CGQx z|EyniKBUaYIhRlnPsu-LNvdtFkY?@@K8U4(^mTfs(eo4|3EY)w^9}C}%o^>8Q7e^e^GbLO)=LkY>xfXK7dqMGYLo>do^1rMCNtNsZVU;&4 zdC|Ry zz+5o3)!C57!2tH=Z-}AX3-aeg=Y~|9QNFf6`poHM4;C1&3D&el#%vg7bFSe3EN4TC zC)#0NJLO<~ArXhnA?derVxlfRu|dhXV&SK9wqu>o#qVu7Eq`MK|Bj6tXBUVDZ@Nmc zr}k+z8&fB-T)%>6>>E;K@Nie2&_Wa!Rr;pEgRikhUy}wq985LG|B4KKlNvw%oy(2# z=M%>Ndo})XxIF$c+oqU#Wl0PsPauq*A(-jG3{${hxe8{n-^$>{OiDpO`7--dsC$_C zPo8`&aq``2_5qZM0AgFFZ+7qdJ2%-5g#&U{7(;@N0VMe1a|1wl6-581A^{LP3?9VC zA4dYag#=eCBuEB=GO!y82+6pBKeYikY=|Ml6ypoe4!~jC@BWvN0eG1A$y|Du_@6q_ z_`x%DOHOfFqot}_;2W35H4TlfX8R?G_Erz_6MC@fw*r{KJ*Ww$4)owHxS1pNAbPkS#9)9AEfWUc zlPWD3OdhfaNiewSFg?KP--N+3Earv=Kzt4`ua5O#WI_-A@S7vTV0Yu8VG!>@8awzQ zdk}+x5ZynCV@f=tEbF)f7Xy`gJJ#NX9(G%!888Y1pfF-kU2?am1Os|3yJJPAobeb3 z5fn(eNfev&!?kre06W&Uo<54Uh8;XCY^8>7Dq&1kF*T$P>008D29IZmHtyj@+>paL zL>qtk6m6V#jN?f86m9(R7~42y=r+JA{FW8s^P~#;(R!e__2Iolm{vl>3(#jITm#_4e>)_B>%Fszth( zFM*8~IG-0yjaUIYa3Fw*enWigZRUo@B}4eu zJ5G%QZ>GjwNImLuxwd)-CBH<;PZo`FXsfmzq3AZlF;KK$-#l@fKNDX~%Wh+qyl{~V zOwW1949L)Qn7cIxdDp|;(>j@x#M%7kKYR5Si9rL4404|6o!D9fKQ&TYJ(H+`t)j6` zw@+;Gy`#6c7-RSCYzdE@*gl{vwYn=4WmgwhE!)D`>OLyEV6A?eOr$u=Jqy)?SD#}b z2bn6jx;t~j+;Tx8U0r2&hNjnw*UBq!e#m8tnzQid+~;yIdl@)Mj1+0Bx*|Sp^&Gog zAzXB(wyKp}j)7cuZPg}E%!T6UOzc5cZI4X%l>N9AoWZC#cwHeLzY0D23Q6#WD(xr< zCWzeSQ~}GKL|Z|dQfRyh{z*IVW9j@BmR{E{Qh8Ok<#I?{-70d^d?s)9XPvu}?cx1M z)yf}{-UZyxkwBqm%AeEGX!!Dt`G_&rQqE>QLCqth^^9x3or)S#&$yi5VBW?2r8ft8 zIy{&chfoxXCQN@vd1%<#ooW;BzP?k%BX1_I6^s^0jbVpqh*PBDYY>TTkxJttaGfhr z{_~AX_=I1(vy44tBs}l&TGL!9G(OH!~8dr=SM2f{*M>qQ2(26n)!<%x_LY9OEEqD zIh6-QbakRJE)=z-Bbq7BIhJz_i-4=A>n=i#3#DidL<6!OL{>?*!v0=XA9vJ4;G)rp<5{+VTl+v3)r5$!q zH-p0rV7aPqo%`U;Rq>Rldot#crDPYrbUq=DG#gkkG2+tr#iLl>&+1Z?Tk-^G<(d^w zQWdjBh{t|`$)OC0=`*ZS-p3coV9dGcV$PBX^&nl5!T@)mdIw75e*DyO5nnDVhB?2W zrvIj#CibI3r*vFL6K!=q7M(&pGGdQGLFJfl<>+E&ENJXX-#xva~Z85f~d%fXuizm{XGBltc#4@u>qdmCd^;%B(G!R^UR*798Z7(hQ!-F)IN*iccL z;tI~3oPc`a5CFwxUbU+{qw)r>)L!Xtc{OWP{5doWK3iVLTKin>;P7Pe_K1MP zB|D+ZOO)IsPsPd)fE>@5*Bj(Q!vf=Z8LTG+)vo9gy-9Ec_t24gD=NUP1{h zlE0Xb#}?l){2p@7Zee6h%@A|upEh{T{($oNh;w!i6MN8{%~y$^Va}}n`(hVW=5YkP z7o7fKo4Gvjti3BDOJv*JqgWzerBr;0%#kWsBF|HuN1kPg^uMZ>$giUL&%Z1LlW+I_ zOumVSwr|h|^b3wO@m}}_S68V`F7F`rav=E%9EULX@zn*HweH6p!@R|^%5{=|JZ$lQ zLDPWF9XO4B-n4sBdtf1a2F#)HA{pI*ak4XUtteK7skc^nDA8r$VN|#bRSQ z?`~LF&c%=)jt^9GMi!{%s#*YUB2b-a3%CoSW+|IeAjn>sSbe-5c?ft4NB_+PoiexpkPrUB0jC)8)os-V-VQNpdLcdW3B~Z`Np%b?h+0dA-{2XN~rMNS40N zSf&l%7iewFbeDfj{N=zIG$QAMvR}%rJa$TljFf9l!BZo9n&twh(99>O`_ofV|oGFW?^eT@u8O?M1|l8Y+=e zNpt_|_lBH%V6ElN9IaOj0Agkg5Jf5RDG@(d;Xhh<7VDAN-zifh42O2Z;k7yg?SxqC zA=K@3EPmPp9qC+t>p|l%y&c2UO{f@}dUCYsUHH`RNRgLZZTcpZZcXoulDAAgnO0P1 znpRX}rrI2c^rjV+|G2tMV!sv1CVv(d@lEe!V*KZ*MXnEo9lo*7x^VMSvge^Wclby1 zy@06j6ylOI54@kqPptEw;+OIEwM_HP6eHUdF>NwO?Cfj73dj{3abF7-e=cjleJys) zWsSG5rBHKiB6lk4hNkc+Rwyw>4$}|eD~*pK7uXOyG0j(nwb-#X+!|<4p+y>QRSoA5 z0dEvoJAtOv&taP165fo`Bq4*=w0Bf^^*~x*NdZ6#9{^!f&nSftOt}wypjjXIz@`*4))IWEw(wzu z!iPNYL1x>D@u2WLpoBc6`t0UIntv3nYG6TNlSAQ#V9%#Uin{${alPR`DR3a_&yQQ~ zj&J^iu)VdX($Ophv1N2&$Z1wZTw+k{>}#Ipn;}c4Ck1PLSuB#4ZsATk&zTA|vWWVc z6L6~8#Hr?^!6~7i=6z26fWEWt?XhW@X~wrvh`96}_@2RRHVyMsdnGnhw68UFXH_x- zoISFTd6RX_?9c^X;>(!lfmO`Qr&+{%%tah=_)c-wMbskBbp}3i_>YrC9LY7;u$p2t z?Hir@I$h&h$Gz#wX>*mgYW3Wl!f+SZ*)c*?=#ymvjD=_7oIuh%-xu-342t`g3C5ohe#P#P$-EAMkK!)HL(EQK#ts7rwSFbeUxBj2Qn8l`^_?Zr zz@D*~Kk8wQgv2S=T6!dYKZ=c)KojEg5zNrhw?5OSIqLiF$mVt|g5sWik?AC+V>PHX zy_K~nTX~QP?D;5i4#_EIayH4r4+i#p63HhST$bE9i!uXyKE{RQ+jbJ|#2_OvchPWn zU|V5e&-=pbHp$%wwLuuI{{iQLrWP)LgIrr)wh?bDySTEPvrmGFKl3262s*?|7DvR~1*&@Q>Y-gu&Ge_l2rGGwr-Zg=H7NipEM37(s(N1dlw~~L4@$V`A z@u9NQp9@m>AKO^@6nh&Am`duRPC1l7BSozoUsQ{aXpsfYql(3F0mgNxK~P#&0bdUd zR#r;}2T!o+CCv))z)ldanwnfZ5tj!72_hIT8MHzW?E|!T&=G{<0E|3jWvs z3i!W{p&jtQ8u(v9gBJX?tD9N=fLVa9K&@TPb!ZS^Hkp`LGN@UZs}ie?H$ZcX3S7xK zsyPugcG_rHMQ)e$JZpJatAzb32s2S zxX;D>EAsBtrD}nZL!;hw;qW2W6&3siZk;pc3A*2fgPs zC-{L>-;>|D^OjV8@O$<_-*X4$PkzsCPJYj6P9Ky%`8_-FyV^hODqzAIg?Yh@Wpg-w z|G6lh;9Tvtf?#?PsFaSLCl}V01poOsok;0)x9l!-=X5ILZ{>fyXxN3r{F*aX&s6G( z4Cl)5WFD{`>T6E%T|mj72l|KKeRfI5n&Du&_VbeFzP3W&n2i}(WE0}EG2^4l%_pP* z`!z@fu3*NyB$= z*UrLjRGaVtvKXEboB<<+xVaoM`EL`tjV? z&oWV2O3mQOJi{nR_S3EG>HNC&2Z~nm%U43*i2t-D#%0iJZNdg^f@#7!KN)I=o-+$R zBbN(2k8Zq6WW3d}@pdMRcd<3z4rnRYL0gx`{40DCgY}_+5AEy z7&s0Mc{O?-h!4D)8C`O;0~cIkS>fR+ZnF$5%uuNP%9=((p^mmfp}xymad}&4Zpz)M z9EfnB;$V;1ED!kRmeaADIBr3e7mJko0u#^qkI598DEc^62%lRmEX;i2X%^7m*+&tR z!7+!PIfN&HAHa}7&*&?ZjZp5maAJZNpbpi_{xV0CKwE6dWajqvOr5Dc%rE?18 zCPG&`5xNG#j|F;q(FPh{X%Gd_&46}d4^|p1CN7dl=rMNv7mdH@YE$AgeRDKFt&Jx2 zs!X{j@`>mSbup>9*?x@szbO(!+vH+dGf?6|U3#_d#}39+Mm|Bxa8ZG6Q}8QYZ{63K zx3m^#%Hx{HZQ@33dQt7v|2PNw;k)1oWDxQcOO?fuQ#WMjlCGy01-jRgFaAkt!}D}A zGcch|zQxMK(gyeAQ15XO-@?1W?~rlxYL@kV@Vh9FPKX!csNe`Udf(f5RJ9>^+&T&AK8?QVl7AZo!1edL2AgUST%Q2eNH(9v}-wp-1L!>9KNi!e-F);V@ zuUA|3j<#xNC3XfGmGvFI^Nrsu6$JGiZ)$?Fl}zqGx%R^pZB-kxNqwJhgrh#{&v4Yg z=SwFbd8!$?9OSkxJ*fK*N3jA2I*Z=SH*8G?V{Ai-#iLMd9@BXQ)8sLQN7+XuGB0=C z4)5)iumP7{aV4TgHzl0fS&KMs%{bu{i_fhuY9`sE-!(zs3z>o7Uyha;aloN=28T9b zFT%!%@2GWpi^Nj|k5v#c5fykrc6g|$kUmPH+l3Ittj<;hNpYj{r&|6Xn3%*$er0o! z-^Z-qr}#AQ z-)IvAi{uzy^>P|7O0E=P@mA=PVx1kbMK<$E1ee+WX7b9N@?N*Dn;$}dAHzN|F#E^; zWX903bFqy%?xkrp$NahL|6}h<;F~J8|8Kg`g-XI+7A5ROD1=2UlqH20QfMLU1=OZX zN()^=n?O;JU_q!6t%``a)%8_Tsfq}$DF_rqDB!~4QV?wrm*N7&h5pZ(Ig{Mnwk+@W z{_pqx@1Myh_uTKCS zum~Ns39kvu+&R6HeGC`N_uOQe9R)c-C18)pQ+cM-sd|r#9>kU&b_leQ!cfYrSF-Ia zU8U?bdpD{ta4Q16iK{nZzYmM|_2& z5|GT#9kB5g<^F6KK0Z5Anfr6^k>&m*24uN^z?BQL8Sa4P1z`k@z4i#)j0gE4Cc69ABl{75a+5)%ocWU6gho$G>4Zx7L z13tcucf?lEY6?#PdR*%O10c|a8vG*`9TUv$;%ThLM2Cwl4vuwPjB&u(9Yr-=Vz6*( z;#U5+r1{!JRZ-1_Ge1Jx1hxUzHu37WzYQt4Zaa3Ui)#KnbA)r?R6`h~l8_s!F2b#G zVFzb6lgY+J)hnL|D+8a3S_)JTy^biLCa6QJ-UA+#z)<$GI{-TSn!t5;!prUIQedcO z1%3djEvmT$<=pQ~8pJ1ayQmGi9tW<4gE8De;8bo0-tFL>`GsK+FTXdT-y3Cqn<*Ty zz|Y8H{}$>odioUXAmm;YGQ@pmAFx10e(IG@xI;xWR~Nm>-NTwLe$E7Z!c_rd?|tCY z*P?G!>RI&}>i&Cf53_}`2f>+KaE?zNJEj}n7IeigvwK(4N+{p_D328t60G)z^zbu3 zS6n;*3-_0`giYi2us~q*x--{fIM9pU0O7zke|5M$ei9o`(W@VUP5oUu*g!)aH|Tsu zQKcqs(CLigl|7yWw<|9C!vN5-bjP|Lc>D((5DAdNiS4_WP3OawT(LOP#AGCIxX#ar=>aXv_$IdzpJ2|a<&z?v~~fPw$SrDausX> zNunF-oj3#oyS}3uaK;%T8jA0HI&}nQMa|zAPPmT(fiLw>f>)>_kewQ~4xPPvSX*GG zvZ2|%;N|B8=ncUUy?d>Ju3YH*t*YM!NtWOkRA>q;*VH-kRMY=w?r?8Hc~<~h7XuEa z6hh;yLp|_b6xcwc1AP)iOO9T z^Mt`HAk2V&b3?_MAec?OaA@#^U??5~CqVRq5du?X#0d6cgjSsNBSwH1qq+ZH zviAdf2pz+!I1@&eDzJ2Y0_!Ra4p>2fOUx5BMe$*p^E(3EAo%=_U<7fRB12ff`5hWJ z@H@Xl>jo-^KcAF}p~kllHNGu*<7?BgAcFnR_GUNQOC0;1ZO<{BhX_#wtIh^-{1*yS zQ4=_L*ovC!dX+SA7}~?G2T?@^t*U65Ub6BaP1=*d(K(om#jqa)6V(LE`5-)#37Hy) zy4YYmI|hSv#Au7EzkxI5i(??e;iPr$(ctBChQ=|*M9#**6AUA65Bo|RUEQFU4a>OJ zLO=&_i~Rbw$6sSF-kS3>T6i<2v`reJ>m~I)&gdsJO$eVpk{&` zF~;H`RAmgjOaQ?tK4@w5?wOfu92WSGZ7;mq19%!WXbdKe+B#L#=q!@eXwtX_&@3tsXu#qRth%jKIDz&QP-VCfCi-$Ahl6dL_Oe zVV^q$UbfV$J_h7+-AP?)J0Q2nFf|EBHSr$W4j4eg*GzZ~FM~$XO7CJk0^ke*%cVd^ zz#|L;fm=P?uH?6|e83N`P=KK2)Vf|=4eEq`s@C-p#0~E{15u=|cwsMr-CWbbo{Iuc zUI-0z1_HT8GHX<#mvt|>H5Y+<@Y3?X4tS4WgwKN0nDGNW-QW|@;f;s0nDIsaT&&|8 z{1!S0$LONZ1{zlVXdB3$I`8w{?m?rw^*U9tr61d10~8}R*tiHUIdJGMo@|s++%XZp z=kqrdcfg@g3)a2Dgy>xf>hZg9CuuxFB!~rgHjXXtuEMF+o!}GK2;17=$AJDB#WzGH z>#Y8cyT{{-Q+QoxCn&(_NHOmk znJBl6yTpWnnPoUE1RDe+b~ch&{{u9xi@6O>B=auY{}ZjVwev;|>=%RT)f@KckHVBI z?1Ym958g~IJ3|tbeJ*bB`54C~?A>TU*=#EO1*pcbFT_C10X!3%pM=d759|N2dkN}h zM_BK56+ej88%~$9fUmfyg%L1E4dWC2@5YDPbR5SW8}2Z`#0>kEtp|EGVHwck8eS88 z6@{ZU;Ocd@!pHD|BFgmmOH|f!1y?yaww;$A-hx3Qp!5GG!SYPhWwY z_mP5tpT+fsjp`?cyCr}PJJ>cWj`%QFGZDWn@$6a@4MefEfCNBFhTATj83{QP3u1HK za=G8e75lFJ3rTXDIL#SFJrjmm2^*S2F@jjQF$)ZX1Te+THxhNX< zZf^#k*Q(BHibf6|1g~RkY5SyBvSrfnkaxOt!I|7f`Tb& z53By5C(|`OdK;t%CMC>HD5G&v$~0jc9|&IzW0Fh*MUw7lDN7P8QgBj-8G1g@)@xm7 z;U({i>%eW$N;gQKiCOkYfawT0w-^R)G%yev4nsEAlt9SI25B_W*%upikP2loSw=mt zk)?`dlmq%!SI(%Hmo<`*N0{Y5pHU6u=Xq2#@;Gjw->CfGs%7#wk}ES{Lx3yh%GWS% z)F4;(G0T5JuJ9_>l`l_s*Eek4#Ck+%zF`o@rY;_ai=?e$MLeoQ=elVDJO~fMS1aoI zb@koZ*GanKW?l~6fy!rlaZC4l=%Q0yteH5jq;tS|ix?SxY3_P03s(P+hBgU~ zZh0Q=9i1F?uI&(|33xzEtON;v(wK0*E7j+nl1io_{#Fok4C z2e2@&IqYGu<{*@P7|A#qQygMYk7xF8^Jsql08X4R;1`8p;4>!Jt`r6+U!5S18Squ!fP#y?>#5~;S+F&!E4aJoQ3cjwx>Pz*y_rJ>^F zkObIZF&^b^5JNm048fB+n8xAkTG-PR9^%qYxANhG5VXXsfpnuHB&lvWOs`_vqIUob zA_5ll|GGP2h||_d2vxuQZ8o3Zy>c)xDsf-a%dh^1{e<~pBPdK2N{jC&Y=jMl%kXSN z=+j*98d!i`WbDznj%2_3-MtlFnu1w$K(!o6G+?j+`C*4}tJRYkHxIXi$}Suuyg zO=X+PY`vlTAzrBQC`c&b#lcXzKfAi3?U79=2kL;LjI+4mz!LA8!3#b{hE>E9PJ=S{ z@3cT!`W}X!BWnXspe=}6 ztUA9#Wet5h915qa0A9HGo;Avkpw9GI#Xgl#d<*Q^H!#sL1%_5&AJba+6gVC~k3A5N zGaMZa72gEJ`yWqOJ2t@8B@=QeE}%!o`J=3H>U8+RasR4S(_kepy!j)j(ZSGVn7lXAv8W;Y@ylWxU4Z|UMX?Txu`EY`m=cGX0sgcDQ$rxIfA zk)8Ka^n)g$xDC9R!CIfh!6y>nbu2ugZ&jjt%n@^fqjOIUznNQ7Q1d|*LT?UJ$C(oT`SmiC%f)q*FEft=eF1P{D@sYX4ix4dWc<*uEEW7iYx`X#%5&8{ce^&58mmR)Pu^$fe7W!E3s^=EcH$F9G!>+kG(fn6`M>!0lU zH@nuetLjOV)1O@f*)@n=L)f)ByI#kxYIbeOuC3X%ExWd7*ADF3iCwQ}*DmbZm0i2D zYfpCV&8~gewJ*Cyvg-hL9muYO+4UxNy_sE4J_eg)c-kBI2p{UPYxu2o_2dtNoBV0ANi0_}=1%z&J=Nd;vtfMNvsJb?$ z;uH+Rt7Ds2K{pQu8K5EkHAbDMIZ_Rq9Ol9qN|s8P_R53Ppe!fh#(D()AF5{p{=BMt zl?`@{b8657I)c@aew1{qEs-|Ek!iRtfN_3yeQqru+&yVP7lQ zpA^4!mWyCH1jC8Wp3tj=xzAd-F7C$Sg^pc@+6M92cJOE`;Kl#?ZCIzy;?bQNYwwIW znBTpD^^Ow!ooBbH->m|faL=LWeL^gF20-vvln$RWj*69sZKL6ndH8bnkfG>QEzEVt zfa;)+69Z~fTm2yMPFNWRJ7^W{fcZG5u!Bd#kLq{fTyXf(Yh>p?RCuV{D_Hp*Rgftd zB5ZPW5_SeXRSWxY&pLq#Y=ujkAqJKc7!BqIi-%_jD*O|SFe6s|`SG~!M=@eujQYKg z;{Er*!!JP{w>KWdz_3EWFC08({RrG6{Sf`&_B&OMstd=vSJm%>!xGf*?E{~y4l|FC zVKGsfMEGzp#tz#@{TvUco1b^8ZLkUoiU6Ee6{8-WCg}^VOGw+B=wC_Dx(AEJ*;67% z|1}g>2Ex1+%w}N^0dj(UxH=t&{b5l-ecQh_`bi}XdI$UW*Y`XHoPUiBzEFG`@M*xO z0iOnZ8t`errvaY^d>Zg+z^4J927DUuX~3rep9Xvy@M*xO0iOnZ8t`errvaY^d>Zg+ zz^4J927DUuX~3rep9Xvy@M*xO0iOnZ8t`errvaY^d>Zg+z^4J927DUuX~3rep9Xvy z@M*xO0iOnx8t{BiTVJi@A(rub4u7!W_g)^p(szB&&_>)VUHPz213nG-G~m;KPXj&; z_%z_tfKLNH4fr(R(|}I{J`Mc$X+Sw%pv0aO&w@P<9T(%_q`{Y9gQJGKyuq%Ea6%sJ zm|moUJqNcQj(GA%R;~n?jWxpXrO7!0sQ-3m{ zc=oy2;@KBr`{dbw$F7-OzY}bJ0q_UfT-uqzjk*hNX%2@07tj6`?EhpgAw0mp0saep z{q7aU1rgYJ9uPRF+gXyK&US)8+Qnh8pS$YUF|et-sungZTJV}m@>k#WC2X{q5FMBS zXi+=3F~iN`>&^%Muow3;TJ?&iuKvSsmW4Z2km&fLlU?GA&S>NN?v3wzDAB(HHU*c! z{~|MZ><1pzs}F$0-tzDId$|h!FK=ZPI7@@<5##iVUZMU zOI@#fTRZUM!Gj=o#{ilR6{?J0Q;>l9RPO&jK*d zg1cZ%z&vAxF~rVE2`8nTlyl7VjMpU&>kfkf`?d7S_{|$G__DYF8X`D3^nlISj z5nHh5Zfm^#THAK_Ul;0mGZh9k4KrNiH#SyAmPOcD?JP-f_&Fv7!!B+U!eZ51r?yBa zmWmCqr+cv>EOw2t#ZKS@4;*Zr5DL5uV8*U7gzkh5*)ocQca}Ip!S5J2MQrPYX0TIf zY_UE7_|4Ft2v-&)dIP6p{J?MQ8oi$<{;dPT(_qKjxjUENOD!I{<1HTA(H+>C+olh5kvzq~h}>1pZU-kuw_~IVn1@p8yBa z>i1e7WndTGPtV_Ym|F;p~}~wFZ137r8X& zE7aC-P@Vyvov_8ZS`*MRM%^+5cB@S2>r8Z1#>1&w)`jXmsd{h%mRhjUfsGbzG-^#)OWUg$B5W?Y zTpdxtV-B!(l*QLlg+il*5TLCVT&k`9YVh2Wb~5%nn|ycwsT%O)Clto>6+zZE>aD8b z0im|ZhWZLPUpEfyY(K=mV0MAN|;X;+6 zs3JJNdqw=Joz_qAB+gE7QbFZ4mkgPFunqo&V}=)D^MA>z&M3J@14j(4JZw!a3$pzh zzm3GYGyWZkzm}~qI5bdfVgK;p1pj@83y0$eAByjO#Og9QjCJ5|3Y?)h-ca$q2JVN! z{Q$b}3is`~btoL3xE+qb4X%gNj$?x_vFqRL`WL(Y$*zB}>qU00`ycjCW$A@CE!fj_ z{)Gyb;_E42ZiRe_udlRDh0K{`;7r>$jb)H`{=m5xJb&I|8B^p6UZhUMUd@Fn%B6$< zOfGrkRhDpU+=}Xg^SiN91^ETVs->+T7avR2PrOm_w{^jEsyQDHE5hX2&KW?OPR^pE z_0Th`IOAu%nakhOHW!YH3pPZ@whXoZg+z^4J92Ab4>eg>R(qcu3bzb8=-$J=OcJ>zUE&UTXV;NWtw#shG)a5}A< z!F`--DSYr~7+VKn!r+F39jX%nr|ZCp(bxSk9p`%EERGp)WOSm*HRlE%s7`t0Ed;^5 z58k^XDo~P~>UD6osN0c#8cH33PKpzC_GL+uH5*R!g(%^)_C&Cci&zoG4zq$_;v$L) z!vky+nQfs~8~9KMYexcI5x{}h;J#4X4S=nOYZS~MfN*dQwE^^kfhGmJ`k-ZTQiSWr za~JAM_QYvnxKDD#Y4Jp$TjyTg=$c{eJ=NgrOky!pms?A4iYlBRe(RZ(aG^#>A07z^ zXV+l@4X#bCnMf88$zpK4hiBUx9Ld41htR$_$pm5=Fzs+eoohL_%Y-BtcEh2DDgzvL zr~@B(OlkyDgJV?*50y!&NGuXZ zTr5bdPrlkjvl5|9&xuxzr)MYHE7G%>+hw|5fE&l!GLWIz0FwT5se7yLLcQx24Dw%> zI!q$VOw2D=JyeE0`a*VCJ1ELsW<8ZAVJ(y!$HREYsB7RO7d^GgQ>q<_QLfeX7wU_a zX(bzE?Gxyj&Sx7|bO#jY!7J|IMY$E+uwonnH>?PU!#U;=u0U8S0|S`NUsvII?(ag` zDsiQOYzD_#Cj^G2+ck}0sQAT(h-)dyJX1x>0mnycV;!q1F;vIHM}fH7HI*#AtNfBI zS?KuMlGR@=Pu90kSW8^@LQr4pKKPq;lB3s=SuY=Z9= ztnjA`^%RL$1a1ejuH<0ol^nFal7ruVyn+lzns6Yr+a;h8?aH)J?|*sz*H_?w&^SL+ z#Q#(y{O#~elz8Ub8)3^c(bNckJI>v3?=c=W%PDt0v8NJr2ejy*fo*70-sDk#>(@{- z+wrVu9`)`<*!E=>$=aMba=ie2QQt&SbqgX3=gvmLK{4E=?A+PLion_pAc;`&a8DSX z#CiqtvLX=PzkyiTv-`frxk)Y?Ffb9Gs_agJTvczw>dnS#ijZ$(%~Q74 zixuG_-yu5n{@#A6@anm|hg{wgDMQ{J>YZ5R%Mx@6p6G6kxl@dN|KJrDvGZ;XTXFGv zqydASX9L**&WfVu_KszXb$T_-e{o{dL3lsFLZg+z^4J927DUuX~3rep9Xvy`2S7=Fka&`J`MOZ@PAhW`)_Gx$9ZL8E)I~q@P*di zSh(|1p9XvyxUvR8)-WjAkpc9QLKor-A=_8pz1YOHIj#Z+|nh z3bfWG7PA&;UT*dhZC0+MoZ^$Khx97cQ-VfeV3nL@%Myp@ET5x+#iFIC`j z1$Gh^@>UTR@>LUVPT|)o{QpIm*pf7p>jPIRpa~`{!f!)Z^g+W3!{#Z>bXH)k!hH_~ zKSF`~DX@;P$e$4kzMimIk>t*(Zh1@~-a@gj*3`Pq;JTOv11pgP9Tqf183|t>6bI@%Xxv z|0u#82`3TO61EfWLb!}@FTzI^{_6;f_9bjKk5A}dLl_spp$R7}-0KJn`EDUB+M`Uu zLjQ$?Tkznd62c-q<%EU)juP%k?t|xW`FaqJA}sisg!>Y|l&}cjNmxsK7vXM%!{_qw zBM2J_-$-~3;ZB6h35)jHNw_8Pj}jK`r?S0tDcno9@c2de5rp04i?Gm7CgBbgpE7)9 z`=)H4l=WNL9+;^7i}q1j{?}0aZ7F^q`S)rdIXN|@z??3MtCXCamTpeVb_nD%XQUKZ<#>@f&6<}lY?6~L`Q`$1{vva7ZeFfg7H(R$aFm>EPD#z; zEQoJ$R)#fsAh{HHkOB{OV~aI^=nz5@$Pdw3^Rv>d+$uTQmYb5DH80nk&MX91Bv_kk zUW^QFx;fiy#_f|>DvzYT!Absd365L?D?hB1YWF-9Y z9{$)?Mvl5s8UPgA6$nNe0sg_cGzw@xpb>o}=}w@x!G9_Idx58=aC0N@`@%mG{sZ9O z6aJ&X(+CKl7u+v}|84L$Ey}Q_q-L9YgI_eJMX3smIUu;e$G&b}hTFoFod*uI1=bX6 zR+@I6EhRtQ&12!A5_9Ld?I3(8C!i&;w_yeo$HcRns}DRhbiu@vOzGx~6kE1co0gX= zg3zXA=M~uU-D%+Qf>4n(2iVN10gK#+-rvxI3QAD}{>s&dRsi zK!fR71(xiTG;@wQ*Q(7)u?W4GGqqPEqRHdVquWMAl)1Yq5lv}%mL-=_w#k-m)#jV6 zw)|XoHk;xMl4G7yHUOp71Olg0a2p|lsTUck%@C-EzD4FtdaCip2AT2-3 z;%UAl?HFv<#%8A!6v(*R6suM|A((eBcQN_-DN9KI@V+NJVm)%Om=sdV;!Q)9D^nrkL)tR)(i=F)wPk0+6Cb0KvQu(W(^FtG z$-FH7a0fe2{O+ik+hx7A(lSinB2YTE+2+DKkm1G*0ZvJuZz}*d0(+H9S*ws~&W5gl z$Rba?;*px3VolNJm~&F0zRDjb3V%#EltZYyG5<|RE4)keAa`T&coG(t{H#S#Yxjf{>o{;lnAjlX*u;pguc z%abFF1N33e&wyr+xiIJ2a`1-54L7~;50|v;tl`5`umQ$iHSiHzvT~E5Q9zqMb0z7H z3@BU6kiv5k>?)7hSMyfBK&Ki;$2>X8*zGp3h%uwJS={PQGk;s4HKbB?!Sj|EoyMP)s7ym z6`(wokH07}>MQ{Mf-lBn1@;#n6twm22>u%)jXGH(T{iVX|iP8^x4TSF| z#aJ!k>j7iE7iPTzuLT?|m_YAS;QJLAb^`Ho|9}ENsK5^?@D@LB|8FX=Oq9#shAFsC z1y;6aAqqb3e4((yr-u|CA0laq0lIV>bdUTb;0uG;1Xz@ArF-E{P;_6`MEF=QMQt=o z{iSrM7p#*lFlq4Zn?F5fpf~%z)j8~YZ(w#Z6>2wRff?{|Z zF5@2g)&!3{i0y#I8|~G|Qw#33;17*luRqkOyq+)9FM8vawEnL<^_LQeZzTFi1g}pA zs2)zgk>h!-yz6BtxnD*0v%)!lz)()Nx8?K<^=n=uemm-SamhW`>_5EatW(HcMtBI( zD53#GbwoWOUfUfkAZW0LfQ8V^eP!9gF8&hQHk14S1q1}*4>Ey%{()GxJbB_5>?ipL z12b3(!lM=ZgZw3bDKH3J1Yy{I*lr?^o8V?rGyJn3S_K6M;h+7OJMI?U2eThKqOf@k z?y!*azipZ^A@Qo>?I`HXKNxYdV838V6@YrUPw6IYLS$SJDF`$f1RBLZ*C4w5kJF!Mw+vG~?F2qwjezwiF&Ix7 z(YN{RG0PZg*k9~%>JZk{!uR$JZ z=Hofc0c?HQ{S-yTHuF$dhMpmhrcGpJNy#B*OFc-_1e;F0QZ+mZ+e!uJQl#$lHOWyf4T58=PSYod@boc z3huSnP#z){G%imByv5mAAG8k(Eds|v;a0TUr3*cBQgrTkvE3C$xOZNo`!BB1{a@GU z{_*^#LJ4f7Hcw@W;?m!`O|(cQx#< zAVoW*xIPnk_^v8=7%uunisMBXt_J>ShwG7A(I4%*!XNE#f=fuf(OWIv7Q zET9P6)^OaK=hvM1BE`6h%rCnLa)I=@RNwZpxQXIlG-x1JM$qM~Q0h;CwsL zTB63K++K`hZ6NF-s#`|>h*lFd-bwz5YL;^>#=#;88;F{SZX+sB!{zS1$EO;Oqoso$ ztuU%(h4Hi;pkfrPv9UCa=Stx`GBlP!}6N9Ben!nj&_l;J34xz=z{7Szu_ zBTqJz%QVnpHt73yru!_g!Ld!x=;Odf(kZO2q_?KS&x7&O0*DK>fjKUZQ73|LK(7>^ z1zH|Vkr~1+fN(R}_-qP{2jRG_XI!>1onvHI3LnGFXQRLKyuwpTeC2SKfJ8WooB{F* z$#_mSNc2_6#cNVNNGHO=5}}mp%IPa)TH|#PLlR}HVMtuc#?y&%h|#!6NTU_{LIsc~ z`5+UQG#ygC_zJRO42_46VWmNsm=jhQF^`1MQJ+|jazLXth%*fkFU#IJ-&9I?ddyNG z_*0Jad#4~B!o?bsC(VO0oCiKGuX7&q)rT+F5T*%p!@E{Cp0^kSmh?rWHTk@Ne7+zR z_^3g-!4xXTOnG>X&3j<3SU}Tx;0I?QA|WSG=Z&@6jn_0$9)yhEdgqe00uqyN9tX<| zVk}t&F_WgnyG6!65Aub<4Bj4CRRHP>X76S7$8S^YQ3lCYTKai6v4keMLN7FDo8f)hYLLtQL4E6^h z9G(r+vvSPFd~;e>fjOoClZX~PZgEwl3mr7jXCrdXfMv_EeAOx!S+1`}{TPNrvUNiFvTLl{>?CFnRvKq$d{x3Vhmv@vtsC1=hv5 zMUYy6dwhQphF5}dwp=#(sT(|0Fo^bB!~5YnqC<#A5gkEPPc)XOfvAya646Yeg+x~p zEg||i(Ndz%5iKM7GSPCPTZnEW`Yur?(GQ7M60IUyP4ow%zY!JT|3w&%YG?CRVMN1; zMi7l63g@^pchiX`5j7FD5M4tQ+j}${2$vDvMzoUXQKBxQbwq>j;qiqNjUcKgnnct> z)J}8*(K4djh*lCkO4LQPj%cuh;v*VCG>WK!XcAEi(KSRj5EbE<5#C0$Qt*k^5)HnW z$Ezh8MO07JK-5IEglHL2uI2xX>oi-gln5&Xro)H#0-5&kC_f{ZZ;2;#<9M>$6^}m70WU9 zKXLSc%fsXIU>;wA%mw$$A`hN-0<{dxn<2%y1 zn+Ks=H^FDJW@Y2^DNW56>%o0v^G703m7jk=V6&j$kkIB~*R@bU{kTU9?@hb??!$SMP{EH}>rp*?)j;;Gn@nZW?-X)Ue^v@af5Deax7#v2o+Z8{#KS zOh}wG**InDwCOWu&Ptj+XYMVx-j-}iNrmq%Gv;Mx&0mn6lbdH*m|tMEEm~Z-DIVgL8_u5&_Q>aEq!i6=@Cu(;LVd%3GOPyU217v9k8mMs8A=U;zcs+az! z50s`K7+3W``Cm`}zqo+>uczmKnx9wdAT-Tq9fbe&^#6Hg|c>v5%#Joo$#za;zj84+3MO}rnC^D1b15ccO#>PHyoRnSBc4&+cW z5az3TVEltHj_;yLB8>A+XiS7dIFvF8>j5>jr|sgu4*d5Y`e7C)|~=mT))15rn%F))DSOIErvj z!g|8J2pb6ZCTt`uUSyL9;~FD0Cc=F=lrjm6cMA()dX_ zN7zKzpRk2+0AaD-E0D0A_{|8H5Dp?-N;sHsIpGk(Vtl+gVJGp!2v-rlj&L>M7KCdF zs|ic5a(!wDYY4X_EY`8LA}rRiwI-}3_iYI42)8AyC)|#(k#IO+6X6boErdG~wiE6| zxP)+L!li_-CtObW2EtClT?khZ))KBJ+?8-G;ckSb&0Ig-32O-VAgm?aldz6(FT#4l zy$Kr$_aST|d?R5C;l70Jg!>ULAsk7#obUj`PQrr-R}mgUxSH@yglh>8B`lTm^xjNZ zLpX}CmhdpbI>N&V>j_5_HWD61*hF|VVGChBVLRa%!X<>q5-ueiOV~*`j&K#>afGW0 zk0)G9IG(Wd8c**8!WzO832O-_5Y`c%L|9LFGGQZOBViNase~j{?>n!cO6zaFy`igZr-*{t4F#|AeKjJblrGHH1|W+`pD^2w@%JP{MlQ zz8`mQ6z&O|gnPmk;ab-9j_rgy5-uUkxxTAU1OI&* z5GxE)X=MPe^A|>ZpJJdH=`@S+Gjo($E$)H*IOmZ()ZDdh+ zxIP;VejkGdzk@-OOX21cwh*?EdtAkj23H!O!FBv-3Lped7ZT;G7;vRO8eE-^23KUD z$%2%iv5`Mq9e}35oh~k4Hm!!pruZ{R-bIwoOj;9=0$)j>F_T<56mAM=0?h*QhpYP0 zWRic}p90MSa=(DWD}Yt-XlxX&mEyNhIP)kTTm_B>S45y$K&wk~+U zjWKT^#S-$tF|K9j8sr$uOeB1>-%Ng>8 zJXqckPbWT>vq+d@7XEV~MTo_?1D3l;n3)!QEPt3@5kHp0NI=3pmPf=Qek_+Lk8qFW z6ZI$3Umz_6jPvE(6o9soFZ6-sHWH+z#~Q?r;Z1jkhvgXM6X9Wb#`Mu+5v0NRX2|jj z^)<#lmyYEe;}iPDZ*4IDMEqFpBSAVb&VuD1vCtpZ1B_3k59>oDxEA9$ST8Vrd^HVz ze{eg)bKsf)$V%mrlF#amy!>GOi3Hyweds2V=dHyT|$$38ht} zkAGb=&Ygc)A2B^b{v4LxM0a}ey9jyt;QKu#y7h_m7r)~Zd9gi^V{8|^F|RKoeb`RO`8ljSc*4i_L(VTygoo`3=8p(3 zjiq-ylrV0voss7!Z*M#y^7aNx;B4lBw>KCfFL4VYJ*c5Elta0!K6~;vhvnBKx4wD% z6faGo_<8#>)?I)2IxCNSxULUlOCtBYeHr7%ikEc{^jMVG5nqM(KKXOs;I406 zf4FXk8?L_?cl*Zm=V|Y`{>HlNX8|ieJpGNy!_(tQzmQL?1>*80xa${}Z<wMBhk zc+=d^e~t~Z@__tFvi<{NqdWbc_XysCVEK?6G4CRt7h;~PA31VX@^Jy)n}@vvXr54n zQAPZtWKm7{IN@5tuL%!(d3dFSHH7actR;Mqu#WJjg!P0E6E+flk+6yIcET3I9}>0` z{(^7`VKL8EN_ao<%L#u#*h#pOu!ZK$`Vg)n{$qq|2`?b5BlleiYxZ${q!AYL;wr*g z;*0*IjxcP$%Z#4zTZF|tx|nA-5nt3F1La=;xwjBs^pEU>R}uDZM^fzmX?;yU3;twJ$eZ=)C<~cKoA544= z@t-BECHygA9pRS=>k02AY$W_3VH4rE30ny7B5WtTg>VVs&j^LE+>3|u#@mf!c~M%5UwWt72#UK#|TRw^Yrf~tbdu~?u0eO zHxn)-zF1eFC4M&XlZfAou#Whd!awCtC}BPE69{i0|NRLYiC;k2PX3z{HW7avVGH5s zg?qxU5-uSup6{iEw-Udc@VkV?Jib`B;3WPU;)`_!HxsTRzL>{fL-K|R_rw?PC#96$ z0mQE*zLl_8rxH$BI>7U1Ghq#3@qSlA@m)uJE%7H4&ZPJv2OMo;{^Ig}*gM-w&@e(ts4HW8nXM!?=#lwTu=Zz29F!gj*{AY4Lt5#dt8j}xvXc{&g-C;nW*QKZjqgq_4s zCtOANeZtj*cM`58TuxXz#Pzw2u!itQgtdhC5UwNnIuh0q{}#exUhEsfdgAXOY$E&~ zVLRa$2$vFml(0nU?L^o~{EdXG2;VCBQrC2S&oD&cVA z-$2+xd=ueH;twHgC;pR!O9|gW*hKDo6Lu0mi*Oa;Ji^t4{R!6+K1EnM!u4B1SVQ<} z!dk+w6V?%aiLjpVIKoE47Q#N_)4+eT2Kf91?!3kgAJ0jFaTz&Ig;@|ePN&&IF`i_0 zfBVh-XThwK-2Hr-jTG(|(5$1t*)S_6cb^R-({hYsdUBixqik}#P{GGp1UVmP0p!>- zE5zkpB1` z|B3mN9GbP|^QrUPqi%e>G6iN;xZya}EicEOl>h<@`8oEahvO`_d>qer=Re1}itsJ& z^2+&QR$Gj};&=XX`8?&HyT9FCKKXbgmJ;Ef=a+asaef-)ot%$*&v|2S|G4{{obTED zfQRSFZ;t1=^N-_9clqHs2ljxIhnMTlKh77k`C`1)BGV_P$Fui?a4*U)$2f~558vi4 z-<-cl79P$|nPnK~3(*xfd_FhJtxrDxE>?5kdJdfL7ONNd`VOogqI~lC22c4BShPx3BDh`z^Fyp&L5%wJ)K`x2$_?N5b-sJA4L<)o&#f;$U%bFwKlpsC zM}9G1Dr^u(LhB*)$LE(9xZ8I=KQC6P;QqTfe=k*NWH> zutoUG2~-;606Smy0J(oL!y1*>v1gZ z=Q}T5{MwlQs>tZ@%c4ue|QV-!Mw%^Ec|nv>6VXU+^LfrjtkuF z3CC9V^Omo#@xLnJW<6G&k*a=Q6+KX#)@i@a^m0^;ev|Is?G>hXS0g&{BH z_wAcLc+=lZ1a_vZ9B{~i+f;o;R84_<5=ogK^kOPXUP=5_tXq<*f7>$b6duile! z3`p6SfVv4OwOYxnMa|yRWRu-f=@hoj+t;erQ3_gMrua9m;dXx4_MpIc3$_w^*>}EyHRuGI|xm)>V~-~lXJ6fyd%8x zDPut2Azu#oskbrh(S>_oXm@79eG&bG+vnxRcg*d8+SU*1rGF*Bn192?PYshVa zjQL{Ot;0Thw8QMW&QT9apS5}8?(K`8zdhyBTdn4&z|6qume;SHw{xbp%evu?p&^e2 zXIb8R-@HhB_QPI}J>iUDf}hjc>0as9 z+H%|O6EC*ee(coO`D$~*#E8Z1s?X=_cwp?5gL@zDJ!8|U&w77X_V^30jRb#^enQm` zztyhkzI<0sXi{Fl2V-~M8d+xuZuwK^*`)S`z*4*__yU`yn7`~l zm=#-h?(<7JHzo7fGd&kATf1-)l%VuKzbl&ai~5yW>sr2Pmonb$qdj0;jE#9rTR4#iTY88~B8$l;{07e4Bh zGIMoN=lK=Ct+p+4#r8WmzBJ~^z~H^3n!R1>sytXT!}-U_*JD*bm*1)FQP4C0(29%O zPQM!1Hb|cuef#8FpF1!(=G5ez9Cg=U2G9IYMV&&QOM;1rN-|%W=m+{)D zSJodo@W(wTKK^Rb-OkJzPv4sLdhv)>Jr>3-)4)z*oqJDcpF8W-)E{0d?)LMSe?GJI z^v@^T|MFhOVEdXaH;?MK?SlutdbvYz`fs01nqPlYi}^F>wb_0`zc2d6!pz48EjYGo z^Y8CwrT2pLoc=A@{^#aHGkz@7PI#1u zzf>}}+pxip+k$SN_`sR*k&7?pZmiKaZ}(x{gJGK585@9a6oadGbx4>T{>ytF=W zRpi+6EL-2mek*6ap!vB=m88FY&$p@DT=Ul))qK0*LUY2%sIps`P^0a+#^r6Vt&eV0wxou-{)E!4VEIE+BXm{aL+rM2h$$#Bx z)^teH(`P=pB|C4~>Bnl0MPGb6FLm*hA&%Xy*?qrC`f9|%r228)+Af_{HrrOyYudcU z?bF`+?rd`C-``{na}B81pFBS4>H7;#gq(i-r^)lKd#de=pS}6!`4;P=3Le-Ie|G;PeUl#^9i=}1#sk_m zHy0lIdd#7UueyzDJL~Js_auM&`(nqwnrG)u9pFE5a?O}f2v^d4`Pa$#}B#Hz}}^Q!C0UY!@c_mwwhR%SPU;)#c)3d7uy_q;#hx1qGP!tCxah<{xO@hX2fYeMy`MG6V17R_w&=k!zzZZ{&Q1d zn?9ST{59;6vpw7D`X)4Q;s12>h)WS~|Fvdu(%2`rJ$HI!!H!?XE!~i6y=G#&fTHv8UfFBcpCk++9#L zFX#JaWsgm%`^EpmXHHHn9o}8@`HKasV&6X2>Y#u4YRhB8znJQp`uew%{%jvK;DyBZ zPkz2Bbn=g>_ulct_5)q@8J|c+ZJ++m_RaoZ`V3gP0(En`{o?dLe?PKt#TJN1!d}9CVgwwh|o0)_jiqa{^p5q?0{V-)`>PttDum0-$!P`S%x0F<(*ZJv>Eev$Nl5#zKr_r@amwf_J{mBUOM;Ys8=^_- z!@m2Qy|wS`YvaF|81lqEzb|&(H|4v5_L)2HD@z(MWXuf#jyB(ZaH;iQ^?~XoY4iRb z`f0`@(BS??)!CCvzu3M>+xf=hceFQ#&^g&vGyU` zUDn%%Zp_^^@U4=eyT(LR-nZn{9$&SE>CC0p*(p;#?0Dkshu?f+(z&ONH5b2FxI8VW?^6T5dZHV~Cuxe`yKThG zn-_l*_3TF@CqH?3MZYI6JZIf=apxm7o##iLPJa1u$FD(u{IKTJmn-IsI$a2q?n^fed-~y))#@QhBie6ScizzZy;;4M_CM~hm6q6}TW>uP zSzYWhRJHXsB}C%jHl1-6n@&B7(WW;aNFK|SGw!AQwJ z_$J9eWR&C|YLEg#r%D0MZq#vV}?CUo`zv=ftY2QXMWz9~F7}yQ5i=6!Do5+$VdNCGK~I{2xED{^xFyJ7dyx= zBaG{lrvi2=uuF!aI7;C^@c3{=KBmV=7+0)gcy<{^ewhrTd{r_$8E~BpV|pTf6!|fY zeRGp3!&pB`WH=76Q-(1=YGoM9WB5;=@Dc&*Wf;?wDZ{9r4Kj@ScFHi850?z1zJh=D zgpc_jCBw4;n`C$<;1a^P0vOY?jWFgP>QBs1V}4C z@dcKC;qeQ7it;5e1o1C5VjYkO6lVf(C+RF0{gm(6t+dyIt6Ug0!yG~=?>>w z8h6L{w$5i`uXuh?t_XrroMFj^@Rb}c6`tzj&A|~tj}#J{p~#Yjh zg8Q=1gYiO6g;Q_;INplqvEjIT78|Yg-mP84FXH3wFf`;yKrcNHCGCrJt!Wjczeo=C6l{tF z3>xO27RKeZ5DxCpo&xzV#+^y52Kght%Wj%qAXtnl(}lT~B6ER~qnj(06mNG;)iOT+ z=?M?#F$*F597rAND<4wmZM?(9*$ZqhJZZq0!F-luI1hpI^x{N0@3P?S4r?8z2xm9& z3rVD&IS!OS>HbP`db@8ZCzd`?NTmaZ=-aNvSZjduOoM>bjRC2Jp0hwG<1jI;d+}?uMit^$Ipt>vYf*b zEjLQ{xB>#_iZP|U^rJsKGr|Tj@$z;#|NQ(ttnrwy9;1v0pK4mrCFUibOLryrm|M77 z2J0C5@lHj<{Nc|pd^+Is!&A?ca^O?G(4E$%pq_W37i+dB|n+cE?*l^yO&@ggYxp?OqiQZ#QG%D^`!e zz7OssAzVyW@WaA7h6QPc280Di2KWbrX*9unXS=CT4?O2yYT+F(AAYF6u5j*kD8zvX zOBa^p;gDu;GXh#%xeG0X#>>2xg^cTk@TAmSX_S}8{%~?df3m@Ngh^y20Yk(b$zbJq zCfF4~XjuNVkgmS))580ox8w=n3QIn=Kc03+gv)8I_>9NfTB@!0wy0h1jq4QrU^lzo z-+jw&RNhdkXGZO9TdTmH;G`Dc_G){_M<=}GER^A!9$px6^NVG2Wg1(@9&x+xIV$z5 z(Lejk`53oeA%NRGx3BhKWdfK3lZVf+$NdauK2`9m+<4=oX!g1>cfZSxS#WjtI~j$` z-$CL|PRqUBOFt>_IR%DkWHMa;^~(kRZaPZvrrZ4|yWa-+irx6BDd&Q^$EUh+ZT+p4 zL+m5m7{kFZMR=$#Klm$(fnfjJD4t-0V~#Um+@eRrSnXtG=lb}1w4h**Jog{$N6G)d zYs!>7`QBXAi{+Ee3y_)~-fl%&x@g@Uj3y3Qfz%lM*h-|%g_l+%wU^xHKw3Nho%@iM z7KJ{5wEE3AA4F=LoV*UHG%aX7(yE=WJc6|Lxv7sL)n5F4BT~!GM;=F7+AQixq~*Il zdx~Mz+oedgCs#j>)af_l8Aj)IeHLj+%O4rFtF}FdxH{^t=aFi*PkaHXzNpPVkUBSf z!D!VV&z3R#()<^ZR=ucu2`R|IsI>9zO^8d@-uW_8&8IQ1AT3=O@G4SE`ff(cUtPT! zu`{9vE6=sPRx(<0_!~xb{l>nAeEpDT7&V=hUPr8%n#^c*=6j49b)DWo`|7enMs-I% zWwdnjpe<-$HR^swwJXjts#`psm3LFuXBpMoFLAnV_EvOXd+QcP%fD>#7GkMQ7NaKB zPDXVvbl%47{TDH+3qQ!H{=44W(Y_?d&S>eYM;QhEyp8sy$!i$3RDI28`CmidLHnxH zYZ=uQpJr75{qT3u-V*!(qngv-Fmui<4*La zy>ASsRauPM&zCT2Qf*_jy7ntZb-MyTWa+rGAEQ;Br*T}mgwv2xMx~_PjOyVn ztyp`jdm)NZXE0hi(!r?ikHsu zd(HP@eD*v0GivHHh0)UY3mCPGTF+>0*)~SCmyR>48}&D*SzSIt|N7-Ij9TnzjMiqa zVzfN=9~=kmWz@O#dq#Cr!uF#-7$I6wtJh=swa*!THEqZMs)?94xoRiM~oW(p3A7I*HT8S zM?B7{{#{1xgT7$2s^wqY{;N(0(SOyW(TtXknaimC*zJs3ZrjLc$)W9x)($$xXz5*b zj2f$(SF!jPbz)Q((3eq7@o+}TE-PJYA;>QsOFdTjOwCaV6^s* zHyJf<`H)f5=_8yU_6?)XzP~W48LK*k@$08*IGx>vQC(7hMy1Ik8Lb+bz-VcYxr|!; z=QCG(&^|EgT)%_S@==Evt^Mk2MlFkfV$>A;H>0HwG(U{; z7+ZH_)Uq~$QH^vnqq+rgj8+|(#;DXcmE+|WM)e=x$*8IIT1K@~A7iw%_(evmx4*^d zsa=eg2YkY)vCAn&or7u_)sDWzs3kUx^(V{6bY!%8SOlY*8;3IL)!ziUnYmy4dbf8& zUmy9&b^Qltsb3p8>+qef>mEKZGAk!FI`-EiBWH~o`uz8EejC~RgOejN$9_1n<@3A$ z4}0$dP(}5w|F79>U~`qLf}#T6@RFk9HJL%9A}@(XhG~k5Mny`9g=L9mMrmb6Wo2qc zMrB22MP)`sWo3nCrDjECrDe56R8-XeXU*(^?RJCqt@AtQe~u%M&pT`0S?gWzy3TFw zj8E@6lDM*a+vpjSk0*Zm*3Pm;BljkT#}D~yd!bODpWSs$sMV%ceDP;_i-$c`%O%^M zziH_6iGlI`?Anci>U)R0F8+G*4~bzLMzr0mc&Tsyd}vhFf!`8;KhUy`-_1VihnDi3 zyPhmh9QEN9{77Dq8aVyaKgGCk^~F~_ayl>kKJoe|`@a186+!CA-@Jxy8WyTPzu}1$ zJ1=OicKPk_`lqM0R{yFy+`nqwp~OOa&If6G4Ko>+3h% zwBq}=YKE8Z({FdOsfHcR)o~N94La1%OC2_O&i>GAL)3wj3qD(?`l#O(h40-GAEx$P zbze}>b*xHoy|uE%k;E1K zJg&${3Rg2)-CVS2i@$o?GjlpkeZGbI%*2)Nk0=aQ=T~}VR0OwBYi&ITb@%C^4*a3( zPw$7dP#+yR^Z3(mc2sX)Q1!}vHOCVl^c(TvV?Elbq5iW|_RKtzI6eIX+lI|;)MZ0Q zAK4ooqn7pTIX0<954BJK%npk_Z>1Lev8Z*)#J1}09i5Mi7}{Pf@{ipfy(~oa`N{e~ zieDG?#MCvu1&>iR4@0+^%;}fT}@kib6xMKj_T;u zlRob{t+N{6sUmpO1rciBPpl z*z@b5gVYxH%$&0)GhB_BcK7~$_w`n%-FVZ%6-yJh+TeOAz&GPl{9v7p2{Pft~2XX?`4oM}Ux6SRUwz(_jz3K72)zn#w zM`h&nk^~LmsRhx@@s4INSx2|4rzPe@HyVa#n zMXQe-8W)@KRifI@{@5MOUb3k_e6r+~c7>{X=%F?Tf#yfr0nn~5oVn1oGuD&es%jh5a zsAH<{nlyLxK(*QOZ71u-^jCL&9XG$bf4o}teR5G{=>EhtV}A>r64XHr{<>GQ{O%pq z&ufEP?oj_oyyMehw+)@zPK|lK;FA1to@(awm$sePBS!T-m0hebWvZ7X>R|Zw2L}z+_!m)+Qh3xX>abE z5q+L2Hjm6*wBDZB`Nv6qZEx4q7dLoUJlwK2@!8itiOP;s)dzfIFY%iar;hKo`kipU zlZhAkME!bUS|9a}>%D5@e>qZX!5;`)md)V5zVUs0&_ zQ}66DJ0R$a-s&M`(hIYD{-R zYWeN2NBS>_QGc;TKmO6?^VQTZ-b(fq{na0?&FJ{<{aw}XyT01-`uy&M1ijWn4GqeCV|w8L zwdLX$E3+;;mUu(wds9j^SUj)w;HiB#PVxIUq?IYs}9YuEm-5N zsWE9qyWdV2r254V4z$12U!BtGs|7Ld^u-w;;o(4&}TOs8UIqW`t6OMPl+DaQ%&jg z?15iy@2nQ>Jz0}ETvMA}xo6HB8!uAJ)?9l0n&s!K&lOL+{i$oas$2eOHv7HJ7pPSu zlPZRncUB+YKI`UTGn3Si=2aEe zu!qmlXtid?Pd+*KbyqLE+q&pbt6}PxXO4b9`cGATYwB*{bKQlG{$Yfg@ngS*tEZ=^ z_SOFTUz~c8nzt|I#pA&})DO25FKo4OxH|R5k`v=fJE*OPw)B1Xv%%`h$C7*}emYpq zN$t34Oy3LDjM%t7+i&ZqZhbu|enX4)YV}{UZ~5!qBz5lRx<^gv{{M0LpgiJ>tc#;UjG?Hr*#+DYyD z^x$h&*48EVwC%S%eMyY^&8&HIhCP3&>ig@I6Y_RsH{b)Gt> z_?yE0-UHP`x$m5pa3o1>ms&YBKx2?UE05IH}p%&auDaeNwaBdtvQ|drxTP z`;?cxH=odcSKhd};Dr;~)vwu~>v{hPZFlO!PqoZDq2>Lod^GTi6WYv{yJp`%@PyVz z-{2~RzZ2Ts3u}M+>gVIy$E{cGQa(PeeKYU%8#7)wuH8MiO}px)$F+oRWofV8bX;4P zJF8&r_~TmZZG-tcuC*Lj_hh$D$F;oj>G!?je_Z?E?d0*(tLrqs$2{&Dv%OCH^%Lcx z>o?YE_x~`#^X1|?ZOGlnuI#v|PK)~R2L9@_g_i_uDN3)??6vPH_i2Q$>OSC=j&)j9 z`8*Hrz&dTwJq!Q5{opa}uvgJtUB5l1-J%vwJzjB4t9;{~up?`aY3)u%bZztCF>O)r zor&4E9@9Mk-1yUvQ;%sQTkTmt@6u!1XI|Tfrt~|e?I_4j>KlDbD~{dKbC}ODE$+o9 zHY}_@s!do@GAJI;h-y6{5jw4!bnSbr>oFm!`H~r-I z=J+F8)!wh_N>h$#zjS+S?gt4+w9Y?PUUDq@i1y_YC1hm45$$Ni^84O7QmbkG_TN1E zms;(Mi1>SyFKV@cC%N!=yHF^9E_T3nU4<-)_-JtqdgZ%;U^ZTRk@xpD0eYd&+9 zU!Na(Sj(B`H@?bpSZk3{-8`fEkoIA}3$8o-!y#?brgi*ZAtEBTLwLGNGq=_9C-2l9M789JZs(|t>x89-<3BU(vHNAx^~~BL)w!=&%a~j z=tEj&jNjNzLk?-*mET=9ruQK&X|i(D(RPQlq8EB*y&QH(^J<=+G0*dmR(D?Kgv>(+ zwO_+4%f|hBPx0_+6~RBmHe)|k;qRdK*zj*B-*=!!8{paF>8hV= zwBg-$ZM~GaV>>2Kt-Yv5 z8}a9J@tp?NXm_^#vct6VYP3;fCv1KOV#ezaxWtOHt#_jd>Gx#oaY+hyg%&#pS4 zy_4VdSk&kP+C`yNYiD0{KwG!rigCLK9?*`qzV?stJq~DZ2X!6#Q@aD&tH19}zbWE? zwq#4Z5*ctn%dk{**`yrMvU)u6)`COT+ORDrp1Ab)YVF~IVdWjFsrAXI5*Sl&|KzoK>yuUs{k8JE2-zchmj1J$_lWwzT~v{8ek? zGFm+Rnp&-Wzv0pRF$vXLmylJlN|$Oa|5(ht*V&N}tTSL2FeQ^7Jt@XUs&wG8oUmIH$RTumI zey#H#7bOjSbHDb}8`W3Od1=4)&@C+|z5eumZAEZZq_SeawtV&Cg3F5bYu|KTa(n6B z`?ZjWdBG9$_G=5iY883+P5ZUkGl$&eHGRLP^r}m}Cv(3R&}r7hHskhdAANcJ$=65i z*UtacH*jLgey#n*3HJnQ`?cUrefZn2tu6oKu0`GUYrW&I`Zc}XeywB5(~yft<$0%Xb;-8AE(ZG`MJe*Z9&iwTg(FXe=F;}@)o=H!QqR2JI=Ig$3kW=f8|=c zR`<;Qts^GewS}{CSN%EGu2~blKK$?~yY_x&^UarBV%LJKgZV@6;`y(A(BH1LoY3}_ z`{V7}-p)7GWyaYxo7FNeDcY{}yLnXK_7Ujon_Vm5huEz)yS(qmX0ow&?*IRp9>|_? z^)zW2+%p~tHe@Gr!yIy5xKDw6HeCN} zvG4ELPj&3`wY|QjJNCmJ`x%aXb6vtL$9|;ac#dP=Tz56!u^-_$Uf|eo?$|GM?3?ey zFLCV0I*u=M?6-65FL&&l&&F3d_B%L^7d!SlI`&H)`;OiJ5}KNyBXVZkBxYVSU4Ol6 z%8Z#h=S?#9CviX~Jc$E3bHL9|L@8%=M zNBPJgVIGtHmh7unacq_2m^^-NJLiFO9ysTL|0^DN_k_3D2tEO?gBq|KdR~?%p^vzKIC_Zyj>J+}r-Pk0|Kq zBT~VcHhJDMC%qCUS)ME7GByPYe zi++qa%`}|tk?FYGOkH^_j&qlxm(_@_^ZC-AQYXDl$nNZsahhp3+auF)x0$-~SSshn z#rcTZMs%Iem-Zx~Yi{Yt?(C6qnrS%OBhzuWnY!{=KIfL9SJ;TI^ZC-AN+-QN$nNZs zahhp3+auF)x0$-~SPAE*boLPu;7pseC&NiEAK9HfGEOrMXM1Ei?lx0b9xK^MU6%1S zqU(IVJkRc|*X7jsWnAXwY=?~B-R5jZKIdi-U%X44?#`2b$#>FQB4ww2^BftcnTE4H zG97oDsVk3F;!`_%+#7SJdPYkH1*+}ODNJ4J!8+7jfa~?S7fpZ=>=YfC81CgPMu&!pkvRGqYEu&Q|im-5LqgXjM z#7Ic?-@)NF5uWEG!ZW=^c!HM*?-gA27Y|M?94q5lUMH5-C~afhU%DIlL8pBq7UJ}> z2(Mn2)L>t$@J+A@-_c$@UvroH1btW$L0P6r{k_^m}!~$ z@M-BKS|&6TEpwY!h2?~1$aH1CULlU9H(^6to6a&G{oK)(RHd1hXhwdUk>6&${Ny7{ zq1Y5*!!Js(B7!Hw4nHYAitv&9dfozrZ?2a^-zsdm)*O!v=~a#!K8RNWtRf)6R|Jgq zO4Y-CEW!uh)W>JW>(KX+`>{fpc2Aiv#2?^d?3S#@Af`bbmFm|95TB^F)5q z$WMZ&2n#Xtq~}Zb5;nj}l)s3|3=&ak%|ui}poq$iuv0TCL&_aKFny=%aXc*mJ|93T?8oIgi+$?%RFFHa0J&^dGR75 zvxkU4Cjy<|ss>x%x=Im)CMcpybi;k?`nIW;voGcBLpkHG(T;L!EIh`b|C0b=2<=FAuEM4%|H>d&XH!6^lLx-+Wj=Y>i&xL7qNMfA~rKZ#3r;5vDNkcrk=-0?!mOoY|EJ3 zMzmBS1SO-Ftt^vL-Qz+;#>#Q2r3j-;oXc#9T+VR!bM$HJM* z;1xIt7SMSs~P| z9@MRlqPab+Dx@-~+~|pnj3_N_q9yg9CH0^scC@T^oNKcP+d6B!UiY@OqVBb%?nP4f zBB*;|r`J7>x8is!j<-^pH`KjWzSPMOjs1-!rIGkGa%p&# zt}n|%j$KW)3A4QPx*a5Zw>sL9=_8ZPxLjH0X?H8~)slQglCKEz)m#`YuA#rEFJm)3 z*{1WN@Lel>hkx;f;W?*sT-%$OwriW$=X@a|pxR-(?h_w;V#6oi_{2*@_Hyz`FMOhp zXKwm|=DwmibC>3{$>zEAj#YZ^m{IRfd9IlUy+5(gpST$>O`T|85uMeDj-C&vKH3~3 zUD;L7%@|m3ldG=lzPoevFdydQHqmUfV?OSB-ap-Umqw$uxLg~!`orAU%h1i7&ec}4 zEX?!F{j+8ByindT$g^_o;vwWOi+Lx=887u!9-j=$bn`62(+qFSJ~Lf+`Pb*g%!$*O z6DKeh^s4XQb7WePQ63_Y@ljrnoHEXyY2NL~L!;++4iufUJVk5z?ADnfqIFuZXieYM zdR?TwMOApYO#7^_e_Z{q`yqfam-a@U>c?C?Jecqx!kdY(b;eli6JZe%>%!vAx%K=k zMXUzlF*cobTWpT&KgaCa^_=GD_XQU+$Cd2v97XRZ=rfrQL^2*yz%IA*a} zg$MI?ONKFX*ROlbGIeEFU$`rC^PHyoE!o%5&qOdUk4UhIh+g{0q1OqewLj(NN4fb@ zZa$QoO|4Jo6gU%zk>Z=*_Yc6gO>2-@mz_pP#3 zdX*dZFl1e~5Le5W6`_Hau{MK|p9kl&@4VHg<#LS~*_C>n)r@-s(IU|9U*%hAEBDIr z%&^7_QOwKKGL8E;D#8vT+S_zq^Ohol-d03+_T~1I{=e~`o{qd{BW;)L>QC7xR-c|1 zdGD#{6-E3Ae#3Uja)11*iU@J|^Lyl~xc)Tzt81TA#ADzv{gt`t_T=Kff6$J7^!|aqD$~(djW%pF z>&_y6N9T<@75zR;4ZIUbmi?1tb30Q!b%lyJ?{4F~tKktqvW!8px%ue#F1df{a_>@V zv|OZ!B|yq+V7WD=@3&YH^MKTR7?zvit04NkX7qW1B4VjipBL>fqVrma=*;FKIxSp8 zb6pr+-O%SncA^}W4kEzrSLIXbUGAA<&G3k~q{=Zf$cSDt*3%J-8+03}+n86GA`PUfrzx_5vUuW|)d(3kk_C>a_ zG9LJg;HAE)^86CV`SO|Z&-9P?ZZ#a^BlWqiG27cCmGseIF8x=pEryOGt<=b7ituJ` zCga=gh_B>x!=7NLyqj^2<=A8}(a{&`r?$`$9+S{hi}(2lceEaMSND`K>X>ZW*a!!6zf;a}r5}^7HOkd27sZEr z?4v#7>*v8Tj`{dSGUq7Xl!4rLty`}9jzt;m~&~Z@pYy_Z{&yR=17$B7HCOtVrfrk<7CqN4s2Cn*P-Ld4KvYKl(1_ZKIv~ zF1_FMr%e1P6JHUYEAP(YAH6-hxt0vEh>%>r)ZkD>_&Lg;(xnXK`N_48y5H0oW7=o3 zESn*u-NZT0ZAe_#FsALQZoC}@aI6J*%}qOU+wRbv0={;m-)MO>R$gY_Om?kj?>Z zU2^clgYXGHU00`w*MXEJ%dNisHkQ7wWt?AcyJ<_1C*x0Z!K{zb$WT^v@D%+Xo16P(ZT&^tig51JgmIrHRJ7%OSlg`)cUcv8_p8p*E_e3- zKeyHNuURIsR_>2_$>*Xur<9qYmlNYDuhYFn^!Xm52PhtCyo(frvTIlq*EaR>RQ2`{ ze}R2Y@wkQ={hxQ^&*;oNw6N&+IhC_y!`F|xtrz8TBF=U;I);75^J96A667U<=!b*o z=YmH28-CR1ppEo_P4sz2`X4LQ-AdQGo88Qi?<@!IU-RvQsm&r`Bne8V0Bcr@t|JbR#T-ri?Uj9M5 ziO4y%-Q2&z#m|4Y-TWOtn|0pge^~cZ$ct;;ulvLBV{5yUA9a8IJM})FH09Q9`oCB2 zOB`{^c)ixTl*fNs@AbOl=kjdcb>C^M(4R;7i-26mJ4o_;=jQ^l%(#B7uY+fL7sj>j zo@u|ax?t87lh1N&+Kx|M+nDt4%by$dAK%U`MT-n z^|JjtWo-J${Nbwy3AkFxX;PhR{!prYuV{~r{4>8H@;<& zw%np-oS~hYW#7cOw#*TijIZyD|5EwK`ZB-qVSZy1u{f5MUF8?pb zzIg0nzSxHOBJYQoSAF_?aT9)UZIeIzYLutnUZ?VO?JLZDxNCbZx{7*;SUAbqd|E~U*@2@ad_s_N2 zy{h!*MEcyW&=KFsH%|5U*<9nDjZS^JnRVsg>L+FX{(n3UmNim;v>%Ojcim4;?M`oB z|H3$UhBmkdo6I&?`Shvv;lHdL|Bdmkv9@g1Ig`(FjuJ8R^tL_C&uG_4%*X1l+w^q* z-SI7jwB@$%hBLHpnJ4B1k&U$Ld`CQ5nM*m!`_!}>U-P{ZvpqHz-qd*3)G?R-N0Ijo z^O|wLFpzr|0itcgJK9_+(ntQ&<9b<~K8J9<&i&i_|J1HCo$u(o{2Ark-1meyDx16PZ2)a?=%CpqJ8Cw>Bh_lr1j&6T&*xhrtrs~k&^tJJ9vx&KT z6W2N=ZpL<5F1PM7=3P&J>oo6jwTry*3@F~1&!6G`_!;I}+p)u(YsvICJ>@b^H|4L! z<~wIOzp>?=KEIh`HRd;CyqxAY`rPc_xj)yRH04(JckfF#GQY`k#5ea97r#j#$ma$o z>)$}M;oY1@z8Nv~O#Zj;pSjkdf4Z-iy_oL?`XL5i`g%l>`v#Ogq^9sJ>zlt z9(oh~`tqJZ`eolkX2VcJD>baU63U z=XWr3T(Q}SN+<2;goR7sjj@?PT(tqye&ptL!5eeQp z%lYb4=)MV#pQZkBbkFnQyOxe;H=iGi{?*`HH}RYPt!J~&nR85Y-()kqF*fxi^NvXU z{W>$;JkPNo*`04YGAsDL<2}(@*?7vgomGwn*c*L^P#@b|pS`)8Cpx{KWTx+~&iPw~ zKlg;VH*MU<*PnR?iGZz+XP&NkFym@0+&nJR%JUGunNHtPna4sK`Toj0Znix$4R>~% zx>9F8KG*%?^xd_2+}*jZJ~VazjW}BP@?H+_?Jafvnwocq;^p_alliVP{j~3K<#Ww4 zi_sz0*Po{524=o>okqTWYHVC~&3|KhXXyWpXAoK9)Hm~ucTeJtOFGB9ux{qe|CSBy zeME>d+WDP1{Yx_G&jQn*X8AfevMXyS=cV&Z<_g}!OcU~}Ua7yt)Hmy$d7kNO-A``5 zHFa0V%s5PTi7T>${6009?^AOc~j_dv@=ex_3wBJp-uJO2Q+qz9|&TTB*w8hM`YZ~V9vt=_LS9Y8q87bF~ zGS;t<{YjG1G#lEHnNCynt*LiC&-DF@-X7$)&y9Si>T0*S@91OP%`Y#X<0)6n)~)&Vo-dS;#uqSyWzPw|zDuA_)`s=qcd{c8HhO&?;$TU_cX zdcWi;CU$Z&zm{_vbKQ>IPA47iGY2UQX%$M08 zMmqV#9K*Uk=P7bQ3paL{`Epl3nm_9)dVs_3%39`sGUI`Mt?aT+i{574%uoC+%!xgX z>oom4J9C8<;xXHgc}?faj^pm^-1xGm=)9h~>?VJ~(muwRkahZMFZFA%EkOUgS3Jc^ zcjw4w$Bys*%(7g8?sMQhH~OaU>$$0VZRXRJoytv?ZM{Ey!Kjy06*uLIwc+Z`_ zs{T7hv(CzMMl<)(`N-wa%8F zx<*4&-%=UlnwxP&+Or#b@=jUD#je}>Pwv&YJ2!&$1Jd}O7XL-$vThDv-8ZD;QqSGh zecgAByrbnNJ^9T&^E&hWwG6o;njBx^Wuk0u+n00M%ekyRHn64~c1JOvIBmT+e^256 zqxqGubG$BV@aXo1oVqTLT*qg3s5oUUpRJBHquk}Ey?ie&i1*@*HSU6P8{UhP-zt{f zWAueTA2aTIM7H%6ZPQpENcIO#evrC*9J#T_!cK25@jKY<+9$}h0NkWg--g{BGt!W2fRIkEk%k-x z#`}ATm;f(fi8K7x8F_@$zEPTv{z9g!w||$lAdhOg@)TX_f{rHj7yrk-Ep z6Fw0fXc4TPrjPm3hD{y3!~yV$!-l|)UZOA9?bw$#IPzw!h0qH-f-NF=op0)y*58Oc zPkv`U!tJ--sWNdHcZ8>im@ik*3`q@kG>k^)!1^4^{kNsYy@DIKS1`@(y@F`-`uYsl z9+92>xF0b>v`~h)jYpVvn`4++FU@jrH@7i$O&ycXaFbo*GWGQFqglgRZ)Ui8o<2{J zYpHUb!`LR*Qq_IiShyaa(|g^n`yn{;rMpxs^x z=AWhh0KO4S#-1VW^d0x(%)aC<;#~?>yV0%pkzNK3_aGzDbzQ?v`ZmXKZG&$cn~ync zFxJLBbx!>4U@!3(@acT|+|~8oiD_SC4EH#cyM+EmZl$GM+7e_uh8Ho!(>d=B-j`d* zweX$7mQX0-lfA^dVE0`O-)7&Mx+i_IxBwl{ z|L%r(T*GvmS&PG51J?M))k`D|^%5U|g8FkULeM_WHr(wq2fdt}?kAsV-_KL{v2Ktb z_gRdUCul!>&o0}M^kKBjG}~$SV;y}#`tLS%Uz`1`YuPn*4X^vc%{`2!&T*s@te1y; zCz|;n-v*ie!l+y?@hF()rX2?BbIsG%yeT)&eQ&y#czK4GxY*6Pir(*^x;~AbZ#~XN z?w9HLb8}s%&yP-B&)HbJ`;>cYcGIp;vbiR^-b=)}v&$T}Ot!K1HSM5&?&KKH-1X<4 zGrhz_u+?3>^sOPhuY1aRqG607@4BvnV>FcDR(uaky=gVNg+06~v@*E7S^c$Rhuaxr zK(%W+a{g66o;IvmE@PD633o_{W!;^Yr>;Gf%33abXPohcO?+Y`t^fbzOrENlyrLA(WrT&}O45R zupag`;WjfI2THwD!x&hJN4SY6lDT@AGFO;ae0u&JbK4mC{JLh2uvIJ+RnHRVb6z6b zOh?+b`&MDwcAFml$yzT_Xdc4`sp}f%8iz5*KFS>1?sjf$KGRT|`-tXBvS?-xsPZfK z$+2a4r+UR3HAVODwhKf-v6tAihIJN}Hu%>ytg*RBeL0(Bq`p2#t@AT2eT@<6n^LoG zn0>wrNA~3Xe%4}bo5nh>39RGFJxu4j8ZwST!}Nyn)g_L4d(3+0%I^B7X3VEte+$4} zm>HM5WA4J_7|b(|7HKfwF*3Kxk>)G%-Us0kghvq0I*LZP{w{bBKHz%?`oy-m^|?>g z&vRTao|Z@bI;x5F?#*Y??rewL2gc?9dH$tyLzo=PXMopw%pZxNE&g|V$O&uu&Eb4aNl z?YN$gY%ABpk6}IhHu`fsd8|s0iMaGUH9Yr}!N#)=;~QV8TmS6T#UGKZAIjQG4fn1b zYsfj8G4-j5bva$*;y2;K)4FhN+L`qk+Z*q1WElAla^%B(zT?PuC-U9CKHrV%^IKyr zGCNc63y5hz!#yEBQ_fZzBhn$~yS%(--HOA~l?w^kI5+m~h zcwfo0%KY_%nC4!hc@5X@6@kK&d$Lunyv5Eaeo>e)NNzE}HO#!`s{id2-QGr?@#@DM zYul}J%=J6@T^@N^7{8ox`us=wqd+FiW|X1(`zfXk#(kur4fl~Oj&t4hY5ydwv3Y_l zGwur*-;M=}mZR&}Bg`e)-rUfx0jQ(e>L-db=J_slAIwniFJ2|o2})|&HcAJtnV zfjiustJlqh<|1;Pn>9RTn{@sLHB8>~Wc}gMu6J;--FYqW(atkQj_K#IcCowj&bIvB ztgjR-=O^S>uD4|7^@e0`aT|ETHLr3mZnkBU^**QJ9)NjVujjtJSH)W7^0$ffef_-$ ztMJM&_Vw#i-o1*y(p&TgrH?kWP1mqU{r#Di&U20W_h-tD=$MxWTqxHZYsGbY3$EKk zxo&TE0V~YgtyShVdzM4jwcpd*ovcTWdjCIe-?Xc#YstT()6_U(#?zFJTo-q~)BIh2 zgHgknw>yyf9>6^$f025fx9FPfE#@q5C|B1ov%gdLCO(AcEcL&IVa_A;{;9G4;9m%r zd6mz5^mN?3zaj0IPrWehku2+pUhkdW<2&0nsE-?`UT5jQMYY&of(=OSBs_L1*{ z`SqqoF^hMe=jp%uHKgG;k)|y17SllzK9ejrecr)&M&06`KrhGdOX%szInt^3gCgY| zH7kHQXcTi$W6f=uX1N}lyiegLTIC0b=2?LvIH8>gX0Ga+ zbIfpAcXo4snQ>NztB-n%W#%z#b{BS99O#{vo_sijt*6*ePxyR~wR$C>n+U0ZF?Oe;7 z+mT{#-ANb;3)qhE85W!5rdZDiRt6viEz^7DVbBJU7dB!wbx}|KYd2d4Y@P(X5DyG z{_L9#a|RE&Ao;?JE>5{*=&<17kmyfw3ee9M0E$05OO|;Q!7-VF*(P|j| zzt$yxCu9EytFdCS)_0G^3=|pjXU~su_-xJhhVaBw2G3hrRVSsS+X{3pLI0g6cRm?y z96s&;c_)mZBnQ88mimJo`mdt@`Rd)PTZ*4o?^$iG7Tu6cef+mQp`S5|H3vrRoUk)m zOx$_x&Rz|Q4r$&O+rO(iB1F&I%rj3@`BwtuxFa_+vI61j>uc^b!KwEfWn?Z*NYK;g6(;46a&WuxA6QhVfs~KK?CR|Nj(Ed5ebr zPTJjF8$4$6q|Awvva@GQNt&6LnUr)&b{f;4nm=V~PTn;$rn{WuPQNkTQxf_=y5r7Y z$(K&Le(I$&GN(F~g*&||S(9>I)Py^|95;$?_1q-vPES|6EN@cYteLLKyH9`8HD_gK zp1cEh&GczAobvsDv|5~&?TlO@?7-H`MFKf+DF8UvQfc3y{~tpM&Md+u?m6m3P#Z z&lTcJP(}D|IHCaC2#m^2!!zy>B8zw`;1eJn zIbxv@*Mbb>W$-aD2RZCc@(LCsXTZxPko^mV(7*=d;qVl&7C8%E2`Z4+!XJY5$VGSI zC$Jg022Q@4S0s>^!ROt>Z-XGG-plW6FA>7phx_FB3o!-^N6vt61LKkHaNttP8aV>) z3o?<%!wW%sSo79%f!9|w8J#qfGC2YCY={~+a! zoCd!PqWk)YZLr5f=nz~Tn>K&Qb@}V?+2;K;t}THART!Xd<=|74trFH37{&GIN`5=ze+uaM?6LzG|B~D z2lk*-0e4=U$i;#mxLUM)lz;i>R%z>Wxb?Ht4dgg@CFq8{8&;pg z=g8yXN5CND68L8@9JvPWxfVYoC&4#>^`u(>zXUcQm&5x(1+sV^eXtoh3BCbrLtYMt zzJQ;RJ#rO!$DTRxLm&!yIlSWs&P6BgNBp@D zdytF%5@IJPLEZ<)@29Mh7r<}TkS}ard=P&gqMc&H@Wb5m0qe1$3O)+Lh+oul-cfwZ zxs~v*z$)W}hu7gZMLY)5$?ta9liyuQMGk_;fd$Ap@G~GDxeWfbk0P@0TS8w&TnCB>&xc$0Q$&@_ zJNz)%P5G{c0|zQ16F-!|<%x<&MlMtp(e(o2M@~ytMCFAF$MOF~intkU!_Er$o}r4^ zLwLb3ew%u@BG!_wZG<8YfoQ@LF6BIsL3q?i@|#L|VMF^-iZ~yn5S|2o4N{To;67=J z=!RSYzjXz^#m>!RsV^Xjyof6maT&-$E`m3WQ$#-cbH-yAh{A7!u2RG_P(YuY0}q>^ zh(hEA@GoE&vY4odvA~9Y4*Wi-A$%A7ScW39kvGFVCn=%=IRm~Kl*m3AUIEIGtKbu$ z9N9Km5xqbu@*sE|ScRMkKLeH_Z-Bo9S;)KKr=}<(2YEZ(Arm{1`@?fVI`R_u6_9~k z4tq@{&r%1T0V_OfKCuPxgkkjF{AVun2LtVXA5kX1R z6L=A*C7vblhU=&^$mQ9J_zlFNQwL{UPklq41HS;4BX5A8m`?pcw#`t4nnPO1i(&s< z;zBNi-<(N(L#~5c%~C`$auIy%O|)O+TDVs}GPWhb4*(l-3H%1ALZ=+w3hc<+C4)Wk zTsUYp_9Mr^FMtTnt%R4|jLpauw@_E-C}R8&^x=zd;~4UC__n$D2)PWdD4<>;+vX`^ zGU$(-55EQKWSnsG`MmQ@cpN+(_#+p5Gsv;YFYvxd?s>Y)9S>hc2K@ zkq5!6K^gJ}_?bJ%FS2c+B97jP-!H<3Lf%ohn|g@64_>>7{3GvzA78A9=!>xpUULua z0eKg^?q2+of<5rp4=7?W;b9NbE*_;9^|4Gig@%1+93MlS1aO{C$XRS zD`1bO@DFktJnw1REc*T>^u5p0UXU}NQ^bp)_CoaGi`LS=T_DFLGG6Tmyz9=WoJ?U;%RK zM~qh>75}e-KL+W@Rj}8`q=g&=Ujed^=fIDGCCHWVpI{ksEqvoA^exEC;BruiycwRk znSKd*IlL9DN3MdSJ|&OHS@0L1QGbvJeNI_{(o5(+;g>-Xa&jeOF^ERahx>2A9^_T< zJ0K2uGh78~h-VM{$yVwQ;npwcS3!T|6!;NPhfXQH1;i7+3r^Zb`$8^*YrsBqlD|~M z#;?#B%9!%CB9?BaJdlHSDB{zd_y>8=H;VXf7d}B=@~tAC1JTIq;m<(<@^<(DSc_cs zog$8bIArVhif9W8k>lVCzO9Ct&VuKIB;-PPHON6Og+Bpx$hC0P zpY+Mdaqt*mL(YWn1VPA4;Ef;xdBIx19=I&9i$^$k0_!O$S1A-a0)0uPJ{0Ug~%oF9RTh09{0PWFE`fgrRafITxTm*; zxdQzad@Be-UJQQ(O3~R43)WBAbOnBc6M(o3eK-r0jH3^PmxKOeh##($;bUpnu+@kC zH0*&@P%xSH1>X#^kPG1`zE@9ArM<)3K?bt$vxp*)g}ebyWsS=m3H2DjsP5DF&XEBK-?izr5356^8*+UV54A4K2>ZN~h{&cc#qiq-v7~!F zZ4(~bj`#^*4nN)ABJ9Zf;KLm(V%c@f&pYxPV4W;t3Hr6L=uE!QNro@&!am_k;77aS zTl9x_vxv*jqkIWp20zgqzoEYy{;LP&NO(fLMQA-Oq73~S_;4@uDbxPFE#iFEM9M*4 z4{zv0S)(ud@-0t4!ii@%Jf^=zM9cW$)dTP~@uUs3h;irR2f~-bPYxoFGF|wOMEpQ_ zyvlErY4`&DeQ|LHME#sf8-c&L z*dl82ZCHv$w7vv=!ZYA&hEit;?>~$@4#%H_Z-c)XA=mm~j&Z3)%pQpk2@guOh{#dY zCG?Bn$428T!gs+xT}D|G-agGD&byp^$#db^W00wz-L9a{r(+-b`EbEl>_oo;{_INf zE8`z$5iQ44CkfvL|8y1hldtv@ETZc~d`^C|;aM5jLwFhd&Lr|he)A^tyKGaipYRRv zd;A7LDf-r_)SqeCNq8ze_G!@WEvkkxe}Lk5JDa zLkHg`FQ<=Mfq&7jguhs25sT4Jd%_~_eiA=mPeidrv|59X%p<(A#3FVPPxLd?&*!L< z*s~k{^?BMg@npSV5jT|57s-6V@h{UBh^HL>=oQL^@Zqo0cFM4yc(%h~Z=ypy#qjfQ z;Wy%m-)IrN%Pk@e{q^u~@8T=s$$yXXdLN$>UI(B2kaUTsV3S3>`Y~}5Px2=gaq*|* zmv}b8TRx}#qMufYkGJ9@!lS>ih|XW)Pr}#2uY66q#M6JfMda;72me^Vp$>dYS)gCK zo8RO6*&^c5Spawch5CS;4qJYuOp&|6UxA<*wBamm@UNhXvCIyK#*!}MNEEDr6vn<3_&TsGgLVx+ z3|0}(D)>FHjj?hw{1-?j&RV!tJA8B%eFc0mun|uxJQL(IhR%Ukg38hO7XAd(UPGC} zhe07}iS{0%9k3BkH+Upi#(13$-vaVUcLDq~ScUzi@E0JSeqa}T5~Si2TL%x(737nz z1o#RNpHA7qw}bu@nH#__g0L&;E8uT{brODty*qk{67m}a_XfL2cMv=g3@5)?@FFk> zJ4@jcU@`uW?&KjZ07;CeneZ|Yk6Z?Ci^FE}64x1@b@33}@k25EeOC`rK>YFDi2FS1 z4}PnFk9H>1cwBUiz;fgWPH zwC#Kk(E}7COU?&tktN>=Dv+trB0=>K5%{VCu1z8yd{sEuL)?7<``F{3>>&a#@(_C{ zui{HQM9-m|b2)ti`~xWDTN;$btb$YEFsRY5gy_R5I>%@;L(>- zhsk?B>@^Z!P%hozH$VYCuY#wi63?}?cQ|&Ghv-ImrNCc-49cPozWH)&!&l?Sc!=C9 z@e%gqkMj^mCU}Ta?AbMuGMYj?WPTWxNqkw97xqM5Lmsm|#BRzW>v|6nmqT5`p6zh| zJoK<9XqJcg^d=9HhCOrgJw)GI=qs>iH#}r6{>PrE0@~Jm${2fU?xI{4QLpgNa=7I^ zv{~$#1Al(6huDlg?eFstGnP=M*i!)yTuNTBXBqs{1H_Mi`WJbK2SGOWtcA~ekh+IG zsqph42YV78_7GPsqdt>X3B2VI50OP$QIC3v3m>BnlhzXWrR9_hY1P54S8y(AWx;o? zr0$W{Hn`_150OV&DezMunY1>*kxx)>NGor(hZyywhiFe)h49p3!bxj6Jo_o~LRzKp zqBZ!0a<70_K2152)^_;i66zIc6+cTq21+K zC?b#D-t-VVHjrP^N`8y_xsi5D9>>4UclGZO59ON&$Gk_mW5Z&2!29Hv@-2pUeM~s^ zblXhb+d^8{Q@NFPx1BnJJ?T3<#QXfl>LBc?`p!e#`x9da_H5YgAv*7+j$u#oZ`46M z?G$^;_tVY}(-yF&@Q8<4aFX_qJyyjkX7gL6gRp12w^dBxH>1X5&nCXisiDrx?9D@c&q4-4dZ)qZf~nti+_eEaBg3# zNTUDD>_@r-tRjwfS~AcoViT<*1$)Zjfk~t*{R7Xuz{7I0tYRPKwG19Vns~5h3B2$!t0=}l6>wpiRcyvTb1t`vUSq6c6ZT}l zgRh`muxAe3E8WU@gu~6pT1Bb!58UBOs~C;KXDm^gCzX3Yl>COVx8Hw(m(JOQ_;bmLO5ocRpen$ z3j6~o!XDezR`DK)!=4)Wo-Fc+J?r61ufhM=lLyCLi%;-RI$RBcuqWa=t5^q0WO>1h zv+)W3*#M8Z-YV>}KEunWTSXM{Y=#%lpuEV}26#@6m1`aPLpb{e>K^edhsWnqF2u7K z9zGL&@---ratAr`dI5eMBq0aQvWi=7w2JM-za73HpZbITDmd_Ft0*Jy+3?O=u#-HN z&#{WWx1!HjnFhaon^o-L+^D%$ac2QGbM9_<^nA*cb4%ei3y6nv#T}F#$Rgc%_;S!6 zIRjn+mdHL6{tYBhe`?`g3n_Qo z9qH!7Z{9^&pznXTRg7FjJm{~2?TfJ=JCpCBJnto6=-0y9eaQGW6@D0OB3~u&Um%G( zFP2!v#b62g>2S0At)db?41y1U?dV4@wTiDnDe+q$zy`2N#t-i-q8_3j_MlZ90s?#D zA7b6fhdCGhR5)Q7>7ri%w|azjgwLxUqkmgYdE=`j_&yMXuhJiOqni+KYg7tqJ52jgLbijwDHNDx2&S= zM$+co6!;GiL77IpZ56+QJnWAuw~FH+0{i#9L;l{w2IlkQ;erbMhP)ZJzmI*$gFc{r ze@I(EUJF-lB9F*XA5m5xQ^$}O!y`6hGd?VbZ~u&TMR*N-;TGx);k)3aTgju;fwz1? zy+V%IW)(MlMH=YazNUW$8<6+G$G1~1$kv^VDZB7>4t?ymR?+=u@_qy5`zv*3FFrvo z`OPXiS7QURe+^{|mZ4t@uRnLEa1(){z(FGC1-$ex5-cfS(2N$eZB&6WEDd439a9 zZO9AYB;hHxA?Ltd6i+c8IUTlHJVg$20{kaffE?xFDLwdbGfy!Hc>z2-2>&2&hUW!)icI8E_)oA0S%i3s%RwP>HoQp!c^~W@ zO1_YT;G2LyauNI^*hKxQg@eQJGjarcC0LA{4cCDZ z6>=P$1FFb-G5ihKgKTTzDcS)$asgZcqVpId;3$4;A`UqoUJBxo*TUa`2;{6tPw_Mm z$Yt;`U_Vk}dmst95^fPoxk?@Q zevpd19PZSP_-8R@!9ChjH;^;oyTBmiBKTF1j$97^1ll9-gPV1r9FZg7!5{&7I6MnP zAs4_Upd0dfcozsmw!>39QYVp@z?(q)EQ*a&r?hoNSPw{Kc8|OL_EmLRZr1R^At-+D+8Vn zDhXc)R}Dw%eHP9Z$?Li&OKuf6k+ZnHY?_zkfo zIWY2IRydGAOo?<)VNgYB5wm00AM0Hk4P^ zPwR)RvQXSMWh%{DugyAjc%U+~X|17J2%xShh?3HMuKXsr?YeWeKep2zbI$jCzPh@) z@4e4`?tK-G{9dlR7e0^5_zFCXLe%eA*DQXHYSdqGakF?8`Ke>DHj8IbojOP0m)8?7 zd>JnPE9O!54PJ#RluyAQUP8_XxHs9F#l1+6Ps1|O;pgBxNZ`9R(6>wZEZ5ox@3AvS z+lfDa2zMrG!@J=fs78GSS~l`o%JtpN;yx6jd>Z}))$xbm=#|V7J_n|H2$8}WocKmmN)ZNwFM z@m}~v2EP-wDGgh)=_&2j~O-6iF1qhvAE;MxPJCe3<;fSK#P_ShAKl2FrjQ7Ki-Rv#+9(Vx7@l|;7qpT^s7rub@<7@Ed z2y=&zz$_%8Sr)XG>6K--sy3El$_Av3;p4}C*+yca%+9Qgh4Baahj zycynu!gvL)_%b<(x56Hz;QL?_74TE=I)(A$r{OhG@)JJ__o50hEW+_I?nji*!82p5 zf4muPM^)-5a33l#kLGx@_;`Z-2=9j@Npkge+JWz&Dau<@j1kS@d*F-6M4cn>6KQe_ zZ-;lFZoC3tKu&xGUNFwQ%lfb@!?<>kWAJtq!MA0bMFP3;qq%1B6msIH;hU()XN`I8 zzi1k7fmfgs-U0Vck~7q|6@r-KYs4{yJ;n8{`4~vB2f~=nviw zpGGBo35suWPo=&AUW9a?qYk_g>G6KJ>lxai&S7}j->|n+?uL_Sj`H?mv*<-8Ssz~X zE&7J{z;R^87vX8o(ogx>e`*$wAuB!&UqTN2A$aQZK^aZ|q{4+U&KLW)| z#0}pC&-ho?6kdVD6>|6U?D_ERe`73o+mE?t{e(HdABK<3u{No{A09>{c=0kZe1$p1 z_rdl5P7dJP4zdK1@ZbCx%M;qjIY9b z|AYGuelN8BoVmyEgWG>WJnx_my!%b&4!;*}dW(9p9Dcq|4Dn_7;kU_cya~SiOY#HX z{SKe~71zSIzsoxPHEoWPCqg5ZEYS!n-U8c?(})r3*x?73@{B~h6`tFq5pld5wlr(R z489XSq|t~ed>ww6^XmF&CjjecAAY4yBc4Yg{1N!TGL6`SKMX(kK8*u`n$PDz~_Cm{VC^yp~JN4hbNsv-|!X~Kb1OoahgW-qY>(l!qp!p z2WZC+529U^>kJycpOX{R&z+$WmvSy&j`9G!@GOlO#e3jhp1E0<_0Oj7XeIS`!aw^M zb40lVuI}Kol<$L=pQ{lE@O60Yd9;If^UTgYsGTw9VCsB6OMi@?(1<})#Rp-FnR&!_ zzz<(QeDOW-RaC_5FVu+bD2U$$-$4<)^&*Y98LedABd}>D@x=GQzE5gIH{S7=8u5cq z5ffQ%(TIo9E_?|FR%wJEABW3V(^tF+K7tP5i||!6i(hy?m^?e|8_0G~ON0CH9{j?y z$mBU?>5DZ&P%b%*R^SU(jd*#zMwIaj&kU1iidipVZBj0I6H4PHM^O=9fo7YA-^{X> z;pPqG?Y*=KU%ZrjljWB&*T_V<-p+M5YQ!n{{oUl(mBa@hhEJjpz6x*N#QMa~!go+N zUhmL|RacW+()VaY5{2;xU%gb_IUf#RgOA?8`0+FF z4P?BZ``wKiaS<}%yWqd0{r9oHJmd_T#Rs5a8)Lzbz>5Z$3;Z7V;voIRcX&186%@v| z-Nc$g?f5iI`}jP*3WtVRr(7!npFvi9RhIeLBk&{e_+es#?}Q54{{U+WUUm!lgZJOc z*hi>?H^F~GRqBh|G(vkj{h{0nx9lKp_#8BRj(o=Nf*qe{?NGlP-gE~s#81JW-o;wL z@BIQE%}~E7#GZy`@rU90cavjb+J`CBhM$GGdo-dGUxBrI$uWHAPU7)6*LsNfM_J2b zIf_#3krNM3ZB3?3tX7CHoS6X;}k~~N0^aAUbI+8ZD5-+(8 z+3`g<{uJ|quYFY`E_j;#lm09`-$|bRq@V+oOMV~C;XA&j5!vr^AHmy78u1*m;l&Tx zpHZAKdf_O_;rGISK>COIZUBFd1itMbxu>IcycuppI(!ej7uEP|1b!FQ@iS2K9DT;O z!8K?vz7M8<#JwJ`o8^p2WT2fI{KiYH6Y1f;e__6)hd=#Sjo67_QDNTyjXvZ3@CfR` z8-C1QiaMqL340i_;ydTab2NwVgFDb6dY}z?#OF1x`v&(! z%2)o3`zG>J9)KA%ir)t>_z(Jwcfj4hAZPIYH~HRzM(`1+yv3e?pM$|V`HU~XzkHi@ zg!jUC(Js8{mm2YzcZij&1Luw~UcBX3w2$`VbMW$aY5x({IK1T7%nLp!DYU{S%i+LM ztuW#{nzZ7iX07PK+u@&Rcz!tE0y8Lw-w!{f)r$RiCwv>#xt2kv6^|{`iZb5(KCLjc zYQ^Yo<{f?=`SCOG7buMv$7{vkBfaz|XvJ>Sg+Bz(J(17ji*S0mR&?XN@7Idc+c?7l zAA}cvfIi^e@HKRp{^(EAig3G@zh|WnAJU3T(JXaF-~}gZ`K=u7zzDKG$~s+eW{o_% zCUPpzC8u2S8)zloa++4$g#38Eh>B6AC8=dkPIS=naZTK1ZC+BHJ z6W#!ws1+Z8$A4TaN_amU`~>~Md(B$$#6?=M7w=iA71~c~MI3K}mvWwq4IhDTt=5VV zUf;#FP}di^Pr(gq=?^{t_3P*l-V94fhZh%fE#$|CVF8Wci|`{><^ykm529W8!g{T^ z`ZBFh@C(m4k>{T@U9A;G$|aqsEI-@BTwlYrzr^?aYqetTI>tr0!>JYDMk^_=z+^A6 z#g}1rGv#|IhuJNh_a!}?>Z4tJ4Q_JL4)wk8N2rtX!|>|sxfb3JUqTLi9iF|Fxu(7u zeg+-D_rXWdC_WDV7LDLbP`HURz7=+$J@`)8hr01z7)CaH1Wu#9_!)Q@6{_pFp$tIQ%Z!g)hOMpq=MR3+=;qz{`*y?|?TV58ewS zXg_0LcwUJ-%j8Y8lXA)B+n8_s4E(_WF~PSD5<@hL_rT-5@FO>A#i>5} zPaP{fh>pn54r%%RLky|YHOlq(YQ?k2M7d=r<;aWo!Z5Pq6<9=Wd2rZD#el*8K})QX>>z9{{9i2O%Y%JmPkZ|oxP6=Dk?+08uyFCJx` zqB3z_%n`l_T`Bs855sk7 z);Qh|PZ%e+@SSiL`SFGfxqw>7s1J{xKOw2fa(|~>@&shX+w;uDB>9F{;C|%6n+jTS z3-aU3aOqdbC44)49Odvu_^Bt!XS^3agQ|FCFX!N(8h+|&?oCL$GcTgZ<;2$z3U zCwkVlG#JD8;eQB!it1}x8eFzQ$Ac}1KRgG`;3Y3dv-s=ac2r*9B6h$W+KGP}{ty{9 zw1^kr&yXGe7F>RYj{5;^!t+oBe*x@9I{Z~|7`gGc!rjP>-vggU<*hB^oA3o>9cmFT z!M9{N{#WpWXA)=psqhmhjsGOvg!;DgZy)$sbRfW94R@pTZL|-cLbLcHd>#dFZ)xxl zK8Jq`o_H4h-@&K~o_uC3hhY#3RUs) zZ2HsDe(K1xq*oyW|NfQdT{}^Tf3wSTv%iUKczG`LArzpFJiEDtGo~tdc}DSBsEL20 z$@2lb&@R5$$us|)=m1`x!?y!<@x4o)tG5RQ@$%fcuOScLbL9C}KSFx;e0hFV9j(Ok zV-Il-+Jm>iZK(7F_aLaqa@P3be~S@VjKE?979+42fyD?cM&OSv0#looHHLIR{Pj0rA_6vDo0e_uToL@q{{s&XH>qT z@=cYk*UVq{bd{YdyHsAG@&=V7DnlxFt4yl=y2|gUoK^X{%6C;RSM%jGmFKAJQh9|+ zugX8R_4@n9Q`3cV2gZ;`q}}%Z#z#pmhXJJ-{&9h^;|h{bN@gePoizU za=_g?(C2aWtv&kC^>zIozstuHVVgI){J;0@RmWZI@~;{8`CJ2jyKiudYiLN6o4Z}U zZT$nie%H|=F|~C4koscKx6Z|Ly?wmt8scN(b4`~IyL{X2F5mTozHPk&TNuSK!|;jK zzuWryKCx~=X}8g}UYoV=8tY}`KNcWvwL-{x91!~k5*@AdTG;@W8I zAM#uIh$zsbF4yMaty^8bqdi&DXv5!2aJ=hzNcbj^kk{HU*f;EPSsMY`#N({iUUBJK z+j)O+jy&j3d{D-7K9FkzLg8BUoCn?C=<2f%54jsrZ(LP;dEtBOJiIwyexJOCt#`=3 z*5?}};sF`)1+OGf=MHKvnixh}Q2dOz#>o$_;+bh$h(|L?r9dqEt2 z>qDys`Zjv|2O4n~2b;S+L#yP&`gz{1^mOmjy`Ev0cwN4tbMvoWm9N(MTrM%QM8ej; z+1E>oy(GsYCwo<2A5+W|!{1zL8|>{<-(MRbh8r2v79KxuAM9_;bfoEu-u@xivFzi? zuQIOoE!~519_5UY4|gqD8|XilXYt>jn?}pg_e$j_<#X=2-db6z=IMOS@XX<*H0zxo zXt3cMgAtD}S;wka;~5-siCDw0>*s(n*;?ZYdmCk!vdm=BCh-iJL`3@g*2n?%Zgq)& zUc%K@t+5O79eLf$)^3pgpe$Wumx(2Q-SC6kNO$5g;9A8oD)Qa;N;Zj)HfgAIYs}4m_10A~ z&lbG#>0V!d?`Aoov*kMIc5U<8d;MvE@>L^ zabC5qf3w_29{v5<$GSOLqi#v$jh_VPDZp|>UF;$2jz~kwn3JSYkonC;?dcfFBR)$t5*)Wd|j^Vdx^Jg&H64OZY4j5 zx6N-S^A%+*=VWW@HYRh2=ZMem7=81b1JApbHDp?JbI^b|S4NmEd1%n%TI2V5=4<(c zZvInpiex=nzO#{k8`+_RxTE2(aLs4t!?KNy{$p2|CdO51oLBONd@*0jSMs&In9xrcCQK8S3HyX|!aEV12u~;zg^A)sX`(Vw zn-G)wNyDUR(lTkEbWVCFgOlM&WwJ0?oGeXNCTo*)!p?8bWEd2^Vo*$qMX@VR#j6CB zu%ajhrKpsYic(WVR39}&O;JnK9(6{&(O@(jRicGxF1tTI*`6ES_v5St&dGvTgXmji`nUHDO=6fv$~u<*Pb)vj5*=uH*NICoeVN3&a^x2 zO$XAYbU9r~SJSn0JuSv{^J02Jhj*B3_b)$_+ zyc(~?>v56LCG?5*gdt%}m=flMC1Fk26OM#4;ZArHfkZG7N`w=Ugpx=n3W=#iF)^Je zCCZ6PqME2B>Isq5CH2Ynq#>ZIaAHlGrDYh)|fSCt;~#@S&?&+W)pI&}Wu!;eyd&?<2lAnOB%jVt<)`!Id^KOs>n7SKj1%Sw>x5&%JrS4) zO++Tr6H^n@^uJ2qb@bavpRJRQN%v%6GBg>POixZtPEVF6tCRIfq41kUzMSclcEzZe z6|3S<+)6+RDG?>DOexb!S*a>@MHg+48l&c@HR_1Eqk(8B8i}T(Q_<;YIa(!~WiA^V zdF*K9aHx^LQ;poMlDE28d(0R!$E-0&%pD8FLa|6J9h-_x$I7v4tRBG)K9I$kET>Tw-8Wh9@hkf6lP?Z(B|x4; z$dM`XqfBnplRC1(NJd!61~-`yA`8-~snm3;%o?hvbm?~1kU1?1I?+ZvlvE*AOqEg< z)|W`@Sz)HMC2dbTStG%8IIW}$=^|^T!a5PG5d-VP!rE}ME`sCXab>(PUK}rtSH^4O zBBRe3GNz0rW6wA<-b^qP&M28erkE*ZDw$eFWc67?c7FXjS-Zh(m~~rV&6cv2Y%MET zv4)(99n+q3=Dh#+yJnH!*^=wx|9sC3$COwhR*aQml~^q%;`+EDZi-vtM|Z(+T!|Or z#ds-RVfPX2JO*|h3pFfxp!g{9S1HH}41)ewY0JGB&x3{}1}F z=kF=#XZe4xA>E62wMY2}*r1V62QWW{Sp+=mI+;Ic!EhR++m#JlX^ -#endif - -static void -do_something_with_intermediate_values(void) -{ - static int another_important_s32 = 0; - static float another_important_f32 = 0; - - another_important_s32 = (int)important_f32; - another_important_f32 = (float)important_s32; - -#if _WIN32 - char buffer[256] = "Hello, World!\n"; - buffer[0] += important_s32 + another_important_s32; - buffer[1] += (int)another_important_f32 * important_f32; - OutputDebugStringA(buffer); -#endif -} - -static void -store_important_s32(int *ptr) -{ - important_s32 = *ptr; -} - -static void -store_important_f32(float *ptr) -{ - important_f32 = *ptr; -} - -void -optimized_build_eval_tests(void) -{ - int simple_sum = 0; - for(int i = 0; i < 10000; i += 1) - { - simple_sum += i; - } - store_important_s32(&simple_sum); - - do_something_with_intermediate_values(); - - static struct {float x, y;} vec2s[] = - { - { 10.f, 76.f }, - { 40.f, 50.f }, - { -230.f, 20.f }, - { 27.f, 27.f }, - { 57.f, -57.f }, - { -37.f, 97.f }, - { 99.f, 67.f }, - { 99.f, 37.f }, - { 99.f, 57.f }, - }; - { - struct{float x, y;}sum = {0}; - int count = sizeof(vec2s)/sizeof(vec2s[0]); - for(int i = 0; i < count; i += 1) - { - sum.x += vec2s[i].x; - sum.y += vec2s[i].y; - } - struct{float x, y;}avg = {sum.x/count, sum.y/count}; - float f32 = avg.x * avg.y; - store_important_f32(&f32); - } - - do_something_with_intermediate_values(); - - int factorial = 1; - for(int i = 10; i > 0; i -= 1) - { - factorial *= i; - } - store_important_s32(&factorial); - - do_something_with_intermediate_values(); -} - -//////////////////////////////// -// NOTE(allen): Struct Parameters Eval - -struct OptimizedBasics{ - char a; - unsigned char b; - short c; - unsigned short d; - int e; - unsigned int f; - long long g; - unsigned long long h; - float i; - double j; -}; - -static void -optimized_struct_parameter_helper(int *ptr, OptimizedBasics basics) -{ - basics.a += *ptr; - basics.a += 1; - basics.a += 1; -} - -void -optimized_struct_parameters_eval_tests(void) -{ - int x = 10; - OptimizedBasics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001}; - optimized_struct_parameter_helper(&x, basics); -} diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index fe5cb060..48691925 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -930,6 +930,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //- rjf: find all offsets of top-level tag trees across all units // U64Array *unit_info_root_tag_offs = 0; + U64 *unit_tag_counts__first_pass = 0; // only includes roots + any descendants of roots who *don't* have a 'sibling' attribute U64 total_root_tag_count = 0; U64 *total_root_tag_count_ptr = &total_root_tag_count; lane_sync_u64(&total_root_tag_count_ptr, 0); @@ -938,8 +939,10 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) if(lane_idx() == 0) { unit_info_root_tag_offs = push_array(scratch.arena, U64Array, unit_count); + unit_tag_counts__first_pass = push_array(scratch.arena, U64, unit_count); } lane_sync_u64(&unit_info_root_tag_offs, 0); + lane_sync_u64(&unit_tag_counts__first_pass, 0); typedef struct D2R_UnitTagTreeOffChunkNode D2R_UnitTagTreeOffChunkNode; struct D2R_UnitTagTreeOffChunkNode { @@ -1001,6 +1004,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //- rjf: reading the next tag DW2_Tag tag = {0}; off += dw2_read_tag(scratch3.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + unit_tag_counts__first_pass[unit_idx] += 1; //- rjf: look for sibling attribute fast path DW2_Attrib *sibling_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Sibling); @@ -1104,6 +1108,190 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) lane_sync_u64(&sub_unit_works_count, 0); lane_sync_u64(&sub_unit_works, 0); + //////////////////////////// + //- rjf: predict the total number of tags in all units + // + U64 total_tag_count_estimate = 1; + { + U64 tag_size_estimate = 32; + for EachIndex(unit_idx, unit_count) + { + total_tag_count_estimate += dim_1u64(unit_info_tag_ranges[unit_idx]) / tag_size_estimate; + } + } + + //////////////////////////// + //- rjf: hash all tags / attributes related to type info in all works, + // for combining into type content hashes later. type content hashes + // require combining a tree of several tag hashes - this just does the + // tag hash portion. + // + // record into (off -> hash) map. + // + U64 tag_hash_slots_count = total_tag_count_estimate/8 + 1; + D2R_TagHashNode **tag_hash_slots = 0; + if(lane_idx() == 0) + { + tag_hash_slots = push_array(scratch.arena, D2R_TagHashNode *, tag_hash_slots_count); + } + lane_sync_u64(&tag_hash_slots, 0); + ProfScope("hash all tags / attributes related to type info in all works, for combining into type content hashes later") + { + U64 work_take_idx_ = 0; + U64 *work_take_idx_ptr = &work_take_idx_; + lane_sync_u64(&work_take_idx_ptr, 0); + for(;;) + { + //- rjf: take next work + U64 work_idx = ins_atomic_u64_inc_eval(work_take_idx_ptr) - 1; + if(work_idx >= sub_unit_works_count) + { + break; + } + ProfBegin("hash work"); + + //- rjf: unpack work + U64 unit_idx = sub_unit_works[work_idx].unit_idx; + Rng1U64 unit_root_tag_idx_range = sub_unit_works[work_idx].root_tag_idx_range; + + //- rjf: unpack unit info + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; + + //- rjf: hash all relevant tags + for(U64 root_tag_idx = unit_root_tag_idx_range.min; + root_tag_idx < unit_root_tag_idx_range.max; + root_tag_idx += 1) + { + U64 root_tag_start_off = unit_info_root_tag_offs[unit_idx].v[root_tag_idx]; + S64 depth = 0; + for(U64 off = root_tag_start_off; contains_1u64(unit_info_tag_range, off) && (depth > 0 || off == root_tag_start_off);) + { + Temp tag_scratch = scratch_begin(&scratch.arena, 1); + U64 start_off = off; + + // rjf: read tag + DW2_Tag tag = {0}; + off += dw2_read_tag(tag_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, off, &tag); + + // rjf: determine if we need this tag's hash + B32 need_tag_hash = (tag.kind == DW_TagKind_ArrayType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_EnumerationType || + tag.kind == DW_TagKind_PointerType || + tag.kind == DW_TagKind_ReferenceType || + tag.kind == DW_TagKind_StringType || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_SubroutineType || + tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_Typedef || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_PtrToMemberType || + tag.kind == DW_TagKind_SetType || + tag.kind == DW_TagKind_BaseType || + tag.kind == DW_TagKind_ConstType || + tag.kind == DW_TagKind_FileType || + tag.kind == DW_TagKind_PackedType || + tag.kind == DW_TagKind_VolatileType || + tag.kind == DW_TagKind_RestrictType || + tag.kind == DW_TagKind_InterfaceType || + tag.kind == DW_TagKind_UnspecifiedType || + tag.kind == DW_TagKind_SharedType || + tag.kind == DW_TagKind_RValueReferenceType || + tag.kind == DW_TagKind_CoarrayType || + tag.kind == DW_TagKind_DynamicType || + tag.kind == DW_TagKind_AtomicType || + tag.kind == DW_TagKind_ImmutableType || + tag.kind == DW_TagKind_Namespace); + + // rjf: hash <:= tag kind + U64 hash = 0; + if(need_tag_hash) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); + } + + // rjf: hash <:= non-reference attributes + if(need_tag_hash) for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) + { + if(n->v.val.kind != DW_FormKind_RefAddr && + n->v.val.kind != DW_FormKind_Ref1 && + n->v.val.kind != DW_FormKind_Ref2 && + n->v.val.kind != DW_FormKind_Ref4 && + n->v.val.kind != DW_FormKind_Ref8 && + n->v.val.kind != DW_FormKind_RefUData && + n->v.val.kind != DW_FormKind_RefSup4 && + n->v.val.kind != DW_FormKind_RefSig8 && + ((tag.kind != DW_TagKind_SubProgram && + tag.kind != DW_TagKind_FormalParameter) || + (n->v.attrib_kind != DW_AttribKind_Name && + n->v.attrib_kind != DW_AttribKind_DeclFile && + n->v.attrib_kind != DW_AttribKind_DeclLine && + n->v.attrib_kind != DW_AttribKind_Prototyped && + n->v.attrib_kind != DW_AttribKind_External && + n->v.attrib_kind != DW_AttribKind_FrameBase && + n->v.attrib_kind != DW_AttribKind_Location && + n->v.attrib_kind != DW_AttribKind_LowPc && + n->v.attrib_kind != DW_AttribKind_HighPc))) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.kind)); + if(n->v.val.string.size != 0) + { + hash = u64_hash_from_seed_str8(hash, n->v.val.string); + } + else if(n->v.val.addr != 0) + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.addr)); + } + else + { + hash = u64_hash_from_seed_str8(hash, str8_struct(&n->v.val.u128)); + } + } + } + + // rjf: store + if(need_tag_hash) + { + U64 off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 slot_idx = off_hash%tag_hash_slots_count; + D2R_TagHashNode *n = push_array(scratch.arena, D2R_TagHashNode, 1); + n->info_off = start_off; + n->hash = hash; + for(B32 inserted = 0; !inserted;) + { + U64 slot_head_val = (U64)ins_atomic_u64_eval(&tag_hash_slots[slot_idx]); + n->next = (D2R_TagHashNode *)slot_head_val; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&tag_hash_slots[slot_idx], (U64)n, slot_head_val)) + { + inserted = 1; + } + } + } + + // rjf: tree nav + if(tag.has_children) + { + depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + depth -= 1; + } + + scratch_end(tag_scratch); + if(off == start_off) + { + break; + } + } + } + + ProfEnd(); + } + lane_sync(); + } + //////////////////////////// //- rjf: build built-in types // @@ -1128,18 +1316,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) lane_sync_u64(&builtin_type_from_kind_map, 0); #define d2r_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] : builtin_type_from_kind_map[RDI_TypeKind_Void]) - //////////////////////////// - //- rjf: predict the total number of tags in all units - // - U64 total_tag_count_estimate = 1; - { - U64 tag_size_estimate = 32; - for EachIndex(unit_idx, unit_count) - { - total_tag_count_estimate += dim_1u64(unit_info_tag_ranges[unit_idx]) / tag_size_estimate; - } - } - //////////////////////////// //- rjf: gather all unique, to-be-deduplicated tags across all units (types, namespaces) // @@ -1245,11 +1421,14 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // functions are not deduplicated, and even if types defined // within many functions match structurally, we consider them // unique, given that they have different definition sites & - // names (fully qualified) still. + // names (fully qualified) still. (technically, if two UDTs + // match structurally, we could even dedup members - so two + // UDT records, w/ different decl sites/names/etc., but point + // at the same members) // - // (2) namespaced by a type - we do *not* want to deduplicate. the - // root-level type will already be deduplicated, so we'll only - // produce it once, and that'll catch all sub-types etc. + // (2) namespaced by a type - we *do* want to deduplicate. the + // root-level type will be deduplicated, but children are + // fragmentary - see (3). // // (3) namespaced by a namespace - we *do* want to deduplicate. the // children of a namespace are functionally top-level, and even @@ -1257,8 +1436,12 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // debug info for each unit will contain fragmentary parts of it, // since presumably unused pieces of the namespace will be stripped. // thus, we need to visit namespace children as if they're top-level. + // B32 children_should_be_deduped = 0; - if(tag.kind == DW_TagKind_Namespace) + if(tag.kind == DW_TagKind_Namespace || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_UnionType) { children_should_be_deduped = 1; } @@ -1381,7 +1564,10 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } - //- rjf: hash all tags we need to deduplicate & gather + //- rjf: produce tree hash for all tags we need to deduplicate & gather + // + // the tree hash is formed by combining the tag hashes for all dependency tags + // U64 total_tag_count_this_work = 0; for(D2R_TagNode *tag_n = first_tag_to_dedup; tag_n != 0; tag_n = tag_n->next) { @@ -1412,14 +1598,31 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { next = 0; U64 t_off = t->off; + U64 off_hash = u64_hash_from_str8(str8_struct(&t->off)); // rjf: record this task in our seen task table { - U64 off_hash = u64_hash_from_str8(str8_struct(&t->off)); U64 slot_idx = off_hash%seen_task_slots_count; SLLStackPush(seen_task_slots[slot_idx], t); } + // rjf: find tag hash for this task + U64 tag_hash = 0; + { + U64 slot_idx = off_hash%tag_hash_slots_count; + for(D2R_TagHashNode *n = tag_hash_slots[slot_idx]; n != 0; n = n->next) + { + if(n->info_off == t_off) + { + tag_hash = n->hash; + break; + } + } + } + + // rjf: combine tag hash into tree hash + hash = u64_hash_from_seed_str8(hash, str8_struct(&tag_hash)); + // rjf: unpack unit Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index c796f4e9..ea7847e7 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -4,6 +4,17 @@ #ifndef RDI_FROM_DWARF_H #define RDI_FROM_DWARF_H +//////////////////////////////// +//~ rjf: Tag Hash Cache Types + +typedef struct D2R_TagHashNode D2R_TagHashNode; +struct D2R_TagHashNode +{ + D2R_TagHashNode *next; + U64 info_off; + U64 hash; +}; + //////////////////////////////// //~ rjf: Unique Tag Tree Deduplication Types diff --git a/src/torture/torture.c b/src/torture/torture.c index fa48d96d..302606a4 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -120,7 +120,7 @@ t_delete_dir(String8 path) if (info.props.flags & FilePropertyFlag_IsFolder) { t_delete_dir(str8f(scratch.arena, "%S/%S", path, info.name)); - + continue; } @@ -1254,7 +1254,7 @@ t_entry_point(CmdLine *cmdline) for EachIndex(i, target_indices.count) { if (i == 0) { PrintHeader("Tests"); } - + U64 target_idx = target_indices.v[i]; TestInfo *test = g_sorted_test_infos[target_idx]; @@ -1279,7 +1279,7 @@ t_entry_point(CmdLine *cmdline) { String8 binary_dir_path = get_process_info()->binary_path; String8 root_dir_path = str8_chop_last_slash(binary_dir_path); - g_input_data_dir = str8f(scratch.arena, "%S/data/test_inputs", root_dir_path); + g_input_data_dir = str8f(scratch.arena, "%S/local/test_inputs", root_dir_path); } // setup output directory @@ -1392,10 +1392,10 @@ t_entry_point(CmdLine *cmdline) for EachElement(i, slowest) { Slowest s = slowest[i]; if (s.target_idx >= test_infos_count) { break; } - + TestInfo *test_info = g_sorted_test_infos[s.target_idx]; String8 elapsed_time = string_from_elapsed_time(scratch.arena, date_time_from_micro_seconds(s.d)); - + fprintf(stderr, " %.*s %.*s/ %.*s %.*s %.*s\n", str8_varg(test_info->layer), (int)(layer_max - test_info->layer.size), spaces, From fa4c003f790442394878bb48e39d29b95649c44a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 21 Jun 2026 16:20:37 -0700 Subject: [PATCH 831/850] run_tests.bat -> download test data if stale --- run_tests.bat | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/run_tests.bat b/run_tests.bat index 9049980a..ca487581 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -8,6 +8,42 @@ set RAW_ARGS=%* set TORTURE_ARGS= set RUN_TORTURE=1 +:: Make test data directories +if not exist local mkdir local +pushd local +if not exist test_inputs mkdir test_inputs +popd + +:: Check if we need new test data version +pushd local +set need_test_data=0 +curl -s -o test_data_version_latest.txt https://data.raddbg.com/public/raddbg_test_data_version.txt +if exist "test_data_version_current.txt" ( + fc /b "test_data_version_latest.txt" "test_data_version_current.txt" > nul +) else ( + echo Test data not present. + set need_test_data=1 +) +if errorlevel 1 ( + echo Test data out-of-date. + set need_test_data=1 +) +popd + +:: Download test data if stale +if "%need_test_data%"=="1" ( + echo Downloading test data... + pushd local + pushd test_inputs + curl -s -o test_inputs.zip https://data.raddbg.com/public/raddbg_test_inputs.zip + tar -xf test_inputs.zip + del test_inputs.zip + popd + copy /y test_data_version_latest.txt test_data_version_current.txt + popd +) +popd + :parse_args if "%~1" == "" goto parse_done if "%~1" == "--" goto parse_torture_args From bc324a9041da153381a6eb9e32b77c940142f297 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 21 Jun 2026 19:54:37 -0700 Subject: [PATCH 832/850] remove exemplars from repo; switch to storing on test data server --- .../exemplar_windows | 1500 ----------------- .../exemplar_windows | 1455 ---------------- .../exemplar_windows | 1470 ---------------- run_tests.bat | 10 +- src/torture/torture.c | 4 +- 5 files changed, 7 insertions(+), 4432 deletions(-) delete mode 100644 data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows delete mode 100644 data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows delete mode 100644 data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows diff --git a/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows deleted file mode 100644 index 9d339b2b..00000000 --- a/data/test_exemplars/mule_main_9ff1e58f_control_flow_step_regressions/exemplar_windows +++ /dev/null @@ -1,1500 +0,0 @@ -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2366 - column_num: 1 - voff_range: - [ - 0xea20 - 0xea24 - ) - } -} -ip_voff: 0xea20 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2368 - column_num: 1 - voff_range: - [ - 0xea24 - 0xea2c - ) - } -} -ip_voff: 0xea24 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2369 - column_num: 1 - voff_range: - [ - 0xea2c - 0xea33 - ) - } -} -ip_voff: 0xea2c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2372 - column_num: 1 - voff_range: - [ - 0xea3d - 0xea44 - ) - } -} -ip_voff: 0xea3d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2373 - column_num: 1 - voff_range: - [ - 0xea44 - 0xea4f - ) - } -} -ip_voff: 0xea44 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2378 - column_num: 1 - voff_range: - [ - 0xea4f - 0xea57 - ) - } -} -ip_voff: 0xea4f -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2379 - column_num: 1 - voff_range: - [ - 0xea57 - 0xea5e - ) - } -} -ip_voff: 0xea57 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2383 - column_num: 1 - voff_range: - [ - 0xea68 - 0xea6f - ) - } -} -ip_voff: 0xea68 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2385 - column_num: 1 - voff_range: - [ - 0xea6f - 0xea7a - ) - } -} -ip_voff: 0xea6f -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2390 - column_num: 1 - voff_range: - [ - 0xea7a - 0xea82 - ) - } -} -ip_voff: 0xea7a -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2391 - column_num: 1 - voff_range: - [ - 0xea82 - 0xea89 - ) - } -} -ip_voff: 0xea82 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2393 - column_num: 1 - voff_range: - [ - 0xea93 - 0xea9a - ) - } -} -ip_voff: 0xea93 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2394 - column_num: 1 - voff_range: - [ - 0xea9a - 0xeaa5 - ) - } -} -ip_voff: 0xea9a -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2398 - column_num: 1 - voff_range: - [ - 0xeaa5 - 0xeaad - ) - } -} -ip_voff: 0xeaa5 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2399 - column_num: 1 - voff_range: - [ - 0xeaad - 0xeab5 - ) - } -} -ip_voff: 0xeaad -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2400 - column_num: 1 - voff_range: - [ - 0xeab5 - 0xeabf - ) - } -} -ip_voff: 0xeab5 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2401 - column_num: 1 - voff_range: - [ - 0xeabf - 0xeac9 - ) - } -} -ip_voff: 0xeabf -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2405 - column_num: 1 - voff_range: - [ - 0xead5 - 0xeadf - ) - } -} -ip_voff: 0xead5 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2407 - column_num: 1 - voff_range: - [ - 0xeadf - 0xeae1 - ) - } -} -ip_voff: 0xeadf -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2419 - column_num: 1 - voff_range: - [ - 0xeb05 - 0xeb0d - ) - } -} -ip_voff: 0xeb05 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2420 - column_num: 1 - voff_range: - [ - 0xeb0d - 0xeb15 - ) - } -} -ip_voff: 0xeb0d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2421 - column_num: 1 - voff_range: - [ - 0xeb15 - 0xeb1f - ) - } -} -ip_voff: 0xeb15 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2423 - column_num: 1 - voff_range: - [ - 0xeb1f - 0xeb29 - ) - } -} -ip_voff: 0xeb1f -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2429 - column_num: 1 - voff_range: - [ - 0xeb35 - 0xeb3f - ) - } -} -ip_voff: 0xeb35 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2431 - column_num: 1 - voff_range: - [ - 0xeb3f - 0xeb41 - ) - } -} -ip_voff: 0xeb3f -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2446 - column_num: 1 - voff_range: - [ - 0xeb65 - 0xeb6d - ) - } -} -ip_voff: 0xeb65 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2447 - column_num: 1 - voff_range: - [ - 0xeb6d - 0xeb75 - ) - } -} -ip_voff: 0xeb6d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2448 - column_num: 1 - voff_range: - [ - 0xeb75 - 0xeb7f - ) - } -} -ip_voff: 0xeb75 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2449 - column_num: 1 - voff_range: - [ - 0xeb7f - 0xeb89 - ) - } -} -ip_voff: 0xeb7f -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2452 - column_num: 1 - voff_range: - [ - 0xeb95 - 0xeba1 - ) - } -} -ip_voff: 0xeb95 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2461 - column_num: 1 - voff_range: - [ - 0xebc5 - 0xebcd - ) - } -} -ip_voff: 0xebc5 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebcd -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2463 - column_num: 1 - voff_range: - [ - 0xebe8 - 0xebf8 - ) - } -} -ip_voff: 0xebe8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2464 - column_num: 1 - voff_range: - [ - 0xebf8 - 0xebfa - ) - } -} -ip_voff: 0xebf8 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2462 - column_num: 1 - voff_range: - [ - 0xebcd - 0xebe8 - ) - } -} -ip_voff: 0xebd7 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2468 - column_num: 1 - voff_range: - [ - 0xebfa - 0xec02 - ) - } -} -ip_voff: 0xebfa -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec02 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2471 - column_num: 1 - voff_range: - [ - 0xec1d - 0xec2d - ) - } -} -ip_voff: 0xec1d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2472 - column_num: 1 - voff_range: - [ - 0xec2d - 0xec2f - ) - } -} -ip_voff: 0xec2d -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2469 - column_num: 1 - voff_range: - [ - 0xec02 - 0xec1d - ) - } -} -ip_voff: 0xec0c -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2476 - column_num: 1 - voff_range: - [ - 0xec2f - 0xec37 - ) - } -} -ip_voff: 0xec2f -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2477 - column_num: 1 - voff_range: - [ - 0xec37 - 0xec52 - ) - } -} -ip_voff: 0xec37 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2478 - column_num: 1 - voff_range: - [ - 0xec52 - 0xec64 - ) - } -} -ip_voff: 0xec52 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2477 - column_num: 1 - voff_range: - [ - 0xec37 - 0xec52 - ) - } -} -ip_voff: 0xec41 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2478 - column_num: 1 - voff_range: - [ - 0xec52 - 0xec64 - ) - } -} -ip_voff: 0xec52 -ip_voff_symbol: control_flow_stepping_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 2477 - column_num: 1 - voff_range: - [ - 0xec37 - 0xec52 - ) - } -} -ip_voff: 0xec41 -ip_voff_symbol: control_flow_stepping_tests diff --git a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows deleted file mode 100644 index 619c87e5..00000000 --- a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_0/exemplar_windows +++ /dev/null @@ -1,1455 +0,0 @@ -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3193 - column_num: 1 - voff_range: - [ - 0x1bb0 - 0x1bbd - ) - } -} -ip_voff: 0x1bb0 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3194 - column_num: 1 - voff_range: - [ - 0x1bbd - 0x1bd0 - ) - } -} -ip_voff: 0x1bbd -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 245 - column_num: 1 - voff_range: - [ - 0x1040 - 0x1044 - ) - } -} -ip_voff: 0x1040 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 246 - column_num: 1 - voff_range: - [ - 0x1044 - 0x104e - ) - } -} -ip_voff: 0x1044 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 246 - column_num: 1 - voff_range: - [ - 0x1044 - 0x104e - ) - } -} -ip_voff: 0x104a -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 247 - column_num: 1 - voff_range: - [ - 0x104e - 0x1052 - ) - } -} -ip_voff: 0x104e -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 248 - column_num: 1 - voff_range: - [ - 0x1052 - 0x1057 - ) - } -} -ip_voff: 0x1052 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3194 - column_num: 1 - voff_range: - [ - 0x1bbd - 0x1bd0 - ) - } -} -ip_voff: 0x1bc2 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3195 - column_num: 1 - voff_range: - [ - 0x1bd0 - 0x1be2 - ) - } -} -ip_voff: 0x1bd0 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 245 - column_num: 1 - voff_range: - [ - 0x1040 - 0x1044 - ) - } -} -ip_voff: 0x1040 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 246 - column_num: 1 - voff_range: - [ - 0x1044 - 0x104e - ) - } -} -ip_voff: 0x1044 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 246 - column_num: 1 - voff_range: - [ - 0x1044 - 0x104e - ) - } -} -ip_voff: 0x104a -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 247 - column_num: 1 - voff_range: - [ - 0x104e - 0x1052 - ) - } -} -ip_voff: 0x104e -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 248 - column_num: 1 - voff_range: - [ - 0x1052 - 0x1057 - ) - } -} -ip_voff: 0x1052 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3195 - column_num: 1 - voff_range: - [ - 0x1bd0 - 0x1be2 - ) - } -} -ip_voff: 0x1bd5 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3196 - column_num: 1 - voff_range: - [ - 0x1be2 - 0x1beb - ) - } -} -ip_voff: 0x1be2 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 239 - column_num: 1 - voff_range: - [ - 0x1000 - 0x1004 - ) - } -} -ip_voff: 0x1000 -ip_voff_symbol: raddbg_is_attached__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 240 - column_num: 1 - voff_range: - [ - 0x1004 - 0x102f - ) - } -} -ip_voff: 0x1004 -ip_voff_symbol: raddbg_is_attached__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 241 - column_num: 1 - voff_range: - [ - 0x102f - 0x1034 - ) - } -} -ip_voff: 0x102f -ip_voff_symbol: raddbg_is_attached__impl -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3196 - column_num: 1 - voff_range: - [ - 0x1be2 - 0x1beb - ) - } -} -ip_voff: 0x1be7 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3198 - column_num: 1 - voff_range: - [ - 0x1beb - 0x1bf8 - ) - } -} -ip_voff: 0x1beb -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3201 - column_num: 1 - voff_range: - [ - 0x1bf8 - 0x1bfd - ) - } -} -ip_voff: 0x1bf8 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 39 - column_num: 1 - voff_range: - [ - 0x1af0 - 0x1af4 - ) - } -} -ip_voff: 0x1af0 -ip_voff_symbol: mule_init -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 40 - column_num: 1 - voff_range: - [ - 0x1af4 - 0x1b08 - ) - } -} -ip_voff: 0x1af4 -ip_voff_symbol: mule_init -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 40 - column_num: 1 - voff_range: - [ - 0x1af4 - 0x1b08 - ) - } -} -ip_voff: 0x1b01 -ip_voff_symbol: mule_init -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 41 - column_num: 1 - voff_range: - [ - 0x1b08 - 0x1b0d - ) - } -} -ip_voff: 0x1b08 -ip_voff_symbol: mule_init -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3203 - column_num: 1 - voff_range: - [ - 0x1bfd - 0x1c02 - ) - } -} -ip_voff: 0x1bfd -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 424 - column_num: 1 - voff_range: - [ - 0x1d20 - 0x1d42 - ) - } -} -ip_voff: 0x1d20 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 425 - column_num: 1 - voff_range: - [ - 0x1d42 - 0x1dd0 - ) - } -} -ip_voff: 0x1d42 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 426 - column_num: 1 - voff_range: - [ - 0x1dd0 - 0x1e4a - ) - } -} -ip_voff: 0x1dd0 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 428 - column_num: 1 - voff_range: - [ - 0x1e4a - 0x1e55 - ) - } -} -ip_voff: 0x1e4a -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 429 - column_num: 1 - voff_range: - [ - 0x1e55 - 0x1e60 - ) - } -} -ip_voff: 0x1e55 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 431 - column_num: 1 - voff_range: - [ - 0x1e60 - 0x1e68 - ) - } -} -ip_voff: 0x1e60 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 432 - column_num: 1 - voff_range: - [ - 0x1e68 - 0x1e74 - ) - } -} -ip_voff: 0x1e68 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 434 - column_num: 1 - voff_range: - [ - 0x1e74 - 0x1e90 - ) - } -} -ip_voff: 0x1e74 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 435 - column_num: 1 - voff_range: - [ - 0x1e90 - 0x1eac - ) - } -} -ip_voff: 0x1e90 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 440 - column_num: 1 - voff_range: - [ - 0x1eac - 0x1ec8 - ) - } -} -ip_voff: 0x1eac -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 445 - column_num: 1 - voff_range: - [ - 0x1ec8 - 0x1f18 - ) - } -} -ip_voff: 0x1ec8 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 451 - column_num: 1 - voff_range: - [ - 0x1f18 - 0x1f31 - ) - } -} -ip_voff: 0x1f18 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 452 - column_num: 1 - voff_range: - [ - 0x1f31 - 0x1f4a - ) - } -} -ip_voff: 0x1f31 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 454 - column_num: 1 - voff_range: - [ - 0x1f4a - 0x1f59 - ) - } -} -ip_voff: 0x1f4a -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 455 - column_num: 1 - voff_range: - [ - 0x1f59 - 0x1f75 - ) - } -} -ip_voff: 0x1f59 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 456 - column_num: 1 - voff_range: - [ - 0x1f75 - 0x1f84 - ) - } -} -ip_voff: 0x1f75 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 458 - column_num: 1 - voff_range: - [ - 0x1f84 - 0x1f93 - ) - } -} -ip_voff: 0x1f84 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 460 - column_num: 1 - voff_range: - [ - 0x1f93 - 0x1fa3 - ) - } -} -ip_voff: 0x1f93 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 461 - column_num: 1 - voff_range: - [ - 0x1fa3 - 0x1fb3 - ) - } -} -ip_voff: 0x1fa3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 462 - column_num: 1 - voff_range: - [ - 0x1fb3 - 0x1fc3 - ) - } -} -ip_voff: 0x1fb3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 467 - column_num: 1 - voff_range: - [ - 0x1fc3 - 0x1fdf - ) - } -} -ip_voff: 0x1fc3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 468 - column_num: 1 - voff_range: - [ - 0x1fdf - 0x1ffb - ) - } -} -ip_voff: 0x1fdf -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 469 - column_num: 1 - voff_range: - [ - 0x1ffb - 0x2017 - ) - } -} -ip_voff: 0x1ffb -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 470 - column_num: 1 - voff_range: - [ - 0x2017 - 0x2033 - ) - } -} -ip_voff: 0x2017 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 471 - column_num: 1 - voff_range: - [ - 0x2033 - 0x204f - ) - } -} -ip_voff: 0x2033 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 472 - column_num: 1 - voff_range: - [ - 0x204f - 0x206b - ) - } -} -ip_voff: 0x204f -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 473 - column_num: 1 - voff_range: - [ - 0x206b - 0x2087 - ) - } -} -ip_voff: 0x206b -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 474 - column_num: 1 - voff_range: - [ - 0x2087 - 0x20a3 - ) - } -} -ip_voff: 0x2087 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 475 - column_num: 1 - voff_range: - [ - 0x20a3 - 0x20d3 - ) - } -} -ip_voff: 0x20a3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 477 - column_num: 1 - voff_range: - [ - 0x20d3 - 0x20de - ) - } -} -ip_voff: 0x20d3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 481 - column_num: 1 - voff_range: - [ - 0x20de - 0x20fa - ) - } -} -ip_voff: 0x20de -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 482 - column_num: 1 - voff_range: - [ - 0x20fa - 0x2116 - ) - } -} -ip_voff: 0x20fa -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 483 - column_num: 1 - voff_range: - [ - 0x2116 - 0x2132 - ) - } -} -ip_voff: 0x2116 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 484 - column_num: 1 - voff_range: - [ - 0x2132 - 0x214e - ) - } -} -ip_voff: 0x2132 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 485 - column_num: 1 - voff_range: - [ - 0x214e - 0x216a - ) - } -} -ip_voff: 0x214e -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 486 - column_num: 1 - voff_range: - [ - 0x216a - 0x2186 - ) - } -} -ip_voff: 0x216a -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 490 - column_num: 1 - voff_range: - [ - 0x2186 - 0x2193 - ) - } -} -ip_voff: 0x2186 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 491 - column_num: 1 - voff_range: - [ - 0x2193 - 0x219b - ) - } -} -ip_voff: 0x2193 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 494 - column_num: 1 - voff_range: - [ - 0x219b - 0x21b3 - ) - } -} -ip_voff: 0x219b -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 497 - column_num: 1 - voff_range: - [ - 0x21b3 - 0x21cb - ) - } -} -ip_voff: 0x21b3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 498 - column_num: 1 - voff_range: - [ - 0x21cb - 0x21e3 - ) - } -} -ip_voff: 0x21cb -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 499 - column_num: 1 - voff_range: - [ - 0x21e3 - 0x21fb - ) - } -} -ip_voff: 0x21e3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 500 - column_num: 1 - voff_range: - [ - 0x21fb - 0x2213 - ) - } -} -ip_voff: 0x21fb -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 501 - column_num: 1 - voff_range: - [ - 0x2213 - 0x222b - ) - } -} -ip_voff: 0x2213 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 504 - column_num: 1 - voff_range: - [ - 0x222b - 0x2243 - ) - } -} -ip_voff: 0x222b -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 512 - column_num: 1 - voff_range: - [ - 0x2243 - 0x2257 - ) - } -} -ip_voff: 0x2243 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 514 - column_num: 1 - voff_range: - [ - 0x2257 - 0x2262 - ) - } -} -ip_voff: 0x2257 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 515 - column_num: 1 - voff_range: - [ - 0x2262 - 0x2273 - ) - } -} -ip_voff: 0x2262 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 516 - column_num: 1 - voff_range: - [ - 0x2273 - 0x2287 - ) - } -} -ip_voff: 0x2273 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 517 - column_num: 1 - voff_range: - [ - 0x2287 - 0x22a1 - ) - } -} -ip_voff: 0x2287 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 518 - column_num: 1 - voff_range: - [ - 0x22a1 - 0x22b5 - ) - } -} -ip_voff: 0x22a1 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 519 - column_num: 1 - voff_range: - [ - 0x22b5 - 0x22cf - ) - } -} -ip_voff: 0x22b5 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 520 - column_num: 1 - voff_range: - [ - 0x22cf - 0x22e3 - ) - } -} -ip_voff: 0x22cf -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 521 - column_num: 1 - voff_range: - [ - 0x22e3 - 0x22fd - ) - } -} -ip_voff: 0x22e3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 522 - column_num: 1 - voff_range: - [ - 0x22fd - 0x2305 - ) - } -} -ip_voff: 0x22fd -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 525 - column_num: 1 - voff_range: - [ - 0x2305 - 0x2315 - ) - } -} -ip_voff: 0x2305 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 526 - column_num: 1 - voff_range: - [ - 0x2315 - 0x2326 - ) - } -} -ip_voff: 0x2315 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 528 - column_num: 1 - voff_range: - [ - 0x2326 - 0x2331 - ) - } -} -ip_voff: 0x2326 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 530 - column_num: 1 - voff_range: - [ - 0x2331 - 0x2368 - ) - } -} -ip_voff: 0x2331 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 533 - column_num: 1 - voff_range: - [ - 0x2368 - 0x2377 - ) - } -} -ip_voff: 0x2368 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 534 - column_num: 1 - voff_range: - [ - 0x2377 - 0x2387 - ) - } -} -ip_voff: 0x2377 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 535 - column_num: 1 - voff_range: - [ - 0x2387 - 0x2396 - ) - } -} -ip_voff: 0x2387 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 536 - column_num: 1 - voff_range: - [ - 0x2396 - 0x23a6 - ) - } -} -ip_voff: 0x2396 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 537 - column_num: 1 - voff_range: - [ - 0x23a6 - 0x23e0 - ) - } -} -ip_voff: 0x23a6 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 542 - column_num: 1 - voff_range: - [ - 0x23e0 - 0x2415 - ) - } -} -ip_voff: 0x23e0 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 543 - column_num: 1 - voff_range: - [ - 0x2415 - 0x244a - ) - } -} -ip_voff: 0x2415 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 544 - column_num: 1 - voff_range: - [ - 0x244a - 0x247f - ) - } -} -ip_voff: 0x244a -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 545 - column_num: 1 - voff_range: - [ - 0x247f - 0x24b4 - ) - } -} -ip_voff: 0x247f -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 549 - column_num: 1 - voff_range: - [ - 0x24b4 - 0x24d6 - ) - } -} -ip_voff: 0x24b4 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 551 - column_num: 1 - voff_range: - [ - 0x24d6 - 0x24e6 - ) - } -} -ip_voff: 0x24d6 -ip_voff_symbol: type_coverage_eval_tests diff --git a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows b/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows deleted file mode 100644 index 5101e487..00000000 --- a/data/test_exemplars/mule_main_9ff1e58f_step_regressions_1/exemplar_windows +++ /dev/null @@ -1,1470 +0,0 @@ -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3193 - column_num: 1 - voff_range: - [ - 0x1bb0 - 0x1bbd - ) - } -} -ip_voff: 0x1bb0 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3194 - column_num: 1 - voff_range: - [ - 0x1bbd - 0x1bd0 - ) - } -} -ip_voff: 0x1bbd -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3195 - column_num: 1 - voff_range: - [ - 0x1bd0 - 0x1be2 - ) - } -} -ip_voff: 0x1bd0 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 245 - column_num: 1 - voff_range: - [ - 0x1040 - 0x1044 - ) - } -} -ip_voff: 0x1040 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 246 - column_num: 1 - voff_range: - [ - 0x1044 - 0x104e - ) - } -} -ip_voff: 0x1044 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 246 - column_num: 1 - voff_range: - [ - 0x1044 - 0x104e - ) - } -} -ip_voff: 0x104a -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 247 - column_num: 1 - voff_range: - [ - 0x104e - 0x1052 - ) - } -} -ip_voff: 0x104e -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 248 - column_num: 1 - voff_range: - [ - 0x1052 - 0x1057 - ) - } -} -ip_voff: 0x1052 -ip_voff_symbol: raddbg_thread_id__impl -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3195 - column_num: 1 - voff_range: - [ - 0x1bd0 - 0x1be2 - ) - } -} -ip_voff: 0x1bd5 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3196 - column_num: 1 - voff_range: - [ - 0x1be2 - 0x1beb - ) - } -} -ip_voff: 0x1be2 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 239 - column_num: 1 - voff_range: - [ - 0x1000 - 0x1004 - ) - } -} -ip_voff: 0x1000 -ip_voff_symbol: raddbg_is_attached__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 240 - column_num: 1 - voff_range: - [ - 0x1004 - 0x102f - ) - } -} -ip_voff: 0x1004 -ip_voff_symbol: raddbg_is_attached__impl -lines: -{ - { - file_name: "raddbg_markup.h" - line_num: 241 - column_num: 1 - voff_range: - [ - 0x102f - 0x1034 - ) - } -} -ip_voff: 0x102f -ip_voff_symbol: raddbg_is_attached__impl -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3196 - column_num: 1 - voff_range: - [ - 0x1be2 - 0x1beb - ) - } -} -ip_voff: 0x1be7 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3198 - column_num: 1 - voff_range: - [ - 0x1beb - 0x1bf8 - ) - } -} -ip_voff: 0x1beb -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3201 - column_num: 1 - voff_range: - [ - 0x1bf8 - 0x1bfd - ) - } -} -ip_voff: 0x1bf8 -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 39 - column_num: 1 - voff_range: - [ - 0x1af0 - 0x1af4 - ) - } -} -ip_voff: 0x1af0 -ip_voff_symbol: mule_init -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 40 - column_num: 1 - voff_range: - [ - 0x1af4 - 0x1b08 - ) - } -} -ip_voff: 0x1af4 -ip_voff_symbol: mule_init -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 40 - column_num: 1 - voff_range: - [ - 0x1af4 - 0x1b08 - ) - } -} -ip_voff: 0x1b01 -ip_voff_symbol: mule_init -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 41 - column_num: 1 - voff_range: - [ - 0x1b08 - 0x1b0d - ) - } -} -ip_voff: 0x1b08 -ip_voff_symbol: mule_init -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 3203 - column_num: 1 - voff_range: - [ - 0x1bfd - 0x1c02 - ) - } -} -ip_voff: 0x1bfd -ip_voff_symbol: mule_main -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 424 - column_num: 1 - voff_range: - [ - 0x1d20 - 0x1d42 - ) - } -} -ip_voff: 0x1d20 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 425 - column_num: 1 - voff_range: - [ - 0x1d42 - 0x1dd0 - ) - } -} -ip_voff: 0x1d42 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 426 - column_num: 1 - voff_range: - [ - 0x1dd0 - 0x1e4a - ) - } -} -ip_voff: 0x1dd0 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 428 - column_num: 1 - voff_range: - [ - 0x1e4a - 0x1e55 - ) - } -} -ip_voff: 0x1e4a -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 429 - column_num: 1 - voff_range: - [ - 0x1e55 - 0x1e60 - ) - } -} -ip_voff: 0x1e55 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 431 - column_num: 1 - voff_range: - [ - 0x1e60 - 0x1e68 - ) - } -} -ip_voff: 0x1e60 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 432 - column_num: 1 - voff_range: - [ - 0x1e68 - 0x1e74 - ) - } -} -ip_voff: 0x1e68 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 434 - column_num: 1 - voff_range: - [ - 0x1e74 - 0x1e90 - ) - } -} -ip_voff: 0x1e74 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 435 - column_num: 1 - voff_range: - [ - 0x1e90 - 0x1eac - ) - } -} -ip_voff: 0x1e90 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 440 - column_num: 1 - voff_range: - [ - 0x1eac - 0x1ec8 - ) - } -} -ip_voff: 0x1eac -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 445 - column_num: 1 - voff_range: - [ - 0x1ec8 - 0x1f18 - ) - } -} -ip_voff: 0x1ec8 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 451 - column_num: 1 - voff_range: - [ - 0x1f18 - 0x1f31 - ) - } -} -ip_voff: 0x1f18 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 452 - column_num: 1 - voff_range: - [ - 0x1f31 - 0x1f4a - ) - } -} -ip_voff: 0x1f31 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 454 - column_num: 1 - voff_range: - [ - 0x1f4a - 0x1f59 - ) - } -} -ip_voff: 0x1f4a -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 455 - column_num: 1 - voff_range: - [ - 0x1f59 - 0x1f75 - ) - } -} -ip_voff: 0x1f59 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 456 - column_num: 1 - voff_range: - [ - 0x1f75 - 0x1f84 - ) - } -} -ip_voff: 0x1f75 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 458 - column_num: 1 - voff_range: - [ - 0x1f84 - 0x1f93 - ) - } -} -ip_voff: 0x1f84 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 460 - column_num: 1 - voff_range: - [ - 0x1f93 - 0x1fa3 - ) - } -} -ip_voff: 0x1f93 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 461 - column_num: 1 - voff_range: - [ - 0x1fa3 - 0x1fb3 - ) - } -} -ip_voff: 0x1fa3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 462 - column_num: 1 - voff_range: - [ - 0x1fb3 - 0x1fc3 - ) - } -} -ip_voff: 0x1fb3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 467 - column_num: 1 - voff_range: - [ - 0x1fc3 - 0x1fdf - ) - } -} -ip_voff: 0x1fc3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 468 - column_num: 1 - voff_range: - [ - 0x1fdf - 0x1ffb - ) - } -} -ip_voff: 0x1fdf -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 469 - column_num: 1 - voff_range: - [ - 0x1ffb - 0x2017 - ) - } -} -ip_voff: 0x1ffb -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 470 - column_num: 1 - voff_range: - [ - 0x2017 - 0x2033 - ) - } -} -ip_voff: 0x2017 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 471 - column_num: 1 - voff_range: - [ - 0x2033 - 0x204f - ) - } -} -ip_voff: 0x2033 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 472 - column_num: 1 - voff_range: - [ - 0x204f - 0x206b - ) - } -} -ip_voff: 0x204f -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 473 - column_num: 1 - voff_range: - [ - 0x206b - 0x2087 - ) - } -} -ip_voff: 0x206b -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 474 - column_num: 1 - voff_range: - [ - 0x2087 - 0x20a3 - ) - } -} -ip_voff: 0x2087 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 475 - column_num: 1 - voff_range: - [ - 0x20a3 - 0x20d3 - ) - } -} -ip_voff: 0x20a3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 477 - column_num: 1 - voff_range: - [ - 0x20d3 - 0x20de - ) - } -} -ip_voff: 0x20d3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 481 - column_num: 1 - voff_range: - [ - 0x20de - 0x20fa - ) - } -} -ip_voff: 0x20de -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 482 - column_num: 1 - voff_range: - [ - 0x20fa - 0x2116 - ) - } -} -ip_voff: 0x20fa -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 483 - column_num: 1 - voff_range: - [ - 0x2116 - 0x2132 - ) - } -} -ip_voff: 0x2116 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 484 - column_num: 1 - voff_range: - [ - 0x2132 - 0x214e - ) - } -} -ip_voff: 0x2132 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 485 - column_num: 1 - voff_range: - [ - 0x214e - 0x216a - ) - } -} -ip_voff: 0x214e -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 486 - column_num: 1 - voff_range: - [ - 0x216a - 0x2186 - ) - } -} -ip_voff: 0x216a -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 490 - column_num: 1 - voff_range: - [ - 0x2186 - 0x2193 - ) - } -} -ip_voff: 0x2186 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 491 - column_num: 1 - voff_range: - [ - 0x2193 - 0x219b - ) - } -} -ip_voff: 0x2193 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 494 - column_num: 1 - voff_range: - [ - 0x219b - 0x21b3 - ) - } -} -ip_voff: 0x219b -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 497 - column_num: 1 - voff_range: - [ - 0x21b3 - 0x21cb - ) - } -} -ip_voff: 0x21b3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 498 - column_num: 1 - voff_range: - [ - 0x21cb - 0x21e3 - ) - } -} -ip_voff: 0x21cb -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 499 - column_num: 1 - voff_range: - [ - 0x21e3 - 0x21fb - ) - } -} -ip_voff: 0x21e3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 500 - column_num: 1 - voff_range: - [ - 0x21fb - 0x2213 - ) - } -} -ip_voff: 0x21fb -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 501 - column_num: 1 - voff_range: - [ - 0x2213 - 0x222b - ) - } -} -ip_voff: 0x2213 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 504 - column_num: 1 - voff_range: - [ - 0x222b - 0x2243 - ) - } -} -ip_voff: 0x222b -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 512 - column_num: 1 - voff_range: - [ - 0x2243 - 0x2257 - ) - } -} -ip_voff: 0x2243 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 514 - column_num: 1 - voff_range: - [ - 0x2257 - 0x2262 - ) - } -} -ip_voff: 0x2257 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 515 - column_num: 1 - voff_range: - [ - 0x2262 - 0x2273 - ) - } -} -ip_voff: 0x2262 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 516 - column_num: 1 - voff_range: - [ - 0x2273 - 0x2287 - ) - } -} -ip_voff: 0x2273 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 517 - column_num: 1 - voff_range: - [ - 0x2287 - 0x22a1 - ) - } -} -ip_voff: 0x2287 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 518 - column_num: 1 - voff_range: - [ - 0x22a1 - 0x22b5 - ) - } -} -ip_voff: 0x22a1 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 519 - column_num: 1 - voff_range: - [ - 0x22b5 - 0x22cf - ) - } -} -ip_voff: 0x22b5 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 520 - column_num: 1 - voff_range: - [ - 0x22cf - 0x22e3 - ) - } -} -ip_voff: 0x22cf -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 521 - column_num: 1 - voff_range: - [ - 0x22e3 - 0x22fd - ) - } -} -ip_voff: 0x22e3 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 522 - column_num: 1 - voff_range: - [ - 0x22fd - 0x2305 - ) - } -} -ip_voff: 0x22fd -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 525 - column_num: 1 - voff_range: - [ - 0x2305 - 0x2315 - ) - } -} -ip_voff: 0x2305 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 526 - column_num: 1 - voff_range: - [ - 0x2315 - 0x2326 - ) - } -} -ip_voff: 0x2315 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 528 - column_num: 1 - voff_range: - [ - 0x2326 - 0x2331 - ) - } -} -ip_voff: 0x2326 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 530 - column_num: 1 - voff_range: - [ - 0x2331 - 0x2368 - ) - } -} -ip_voff: 0x2331 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 533 - column_num: 1 - voff_range: - [ - 0x2368 - 0x2377 - ) - } -} -ip_voff: 0x2368 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 534 - column_num: 1 - voff_range: - [ - 0x2377 - 0x2387 - ) - } -} -ip_voff: 0x2377 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 535 - column_num: 1 - voff_range: - [ - 0x2387 - 0x2396 - ) - } -} -ip_voff: 0x2387 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 536 - column_num: 1 - voff_range: - [ - 0x2396 - 0x23a6 - ) - } -} -ip_voff: 0x2396 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 537 - column_num: 1 - voff_range: - [ - 0x23a6 - 0x23e0 - ) - } -} -ip_voff: 0x23a6 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 542 - column_num: 1 - voff_range: - [ - 0x23e0 - 0x2415 - ) - } -} -ip_voff: 0x23e0 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 543 - column_num: 1 - voff_range: - [ - 0x2415 - 0x244a - ) - } -} -ip_voff: 0x2415 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 544 - column_num: 1 - voff_range: - [ - 0x244a - 0x247f - ) - } -} -ip_voff: 0x244a -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 545 - column_num: 1 - voff_range: - [ - 0x247f - 0x24b4 - ) - } -} -ip_voff: 0x247f -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 549 - column_num: 1 - voff_range: - [ - 0x24b4 - 0x24d6 - ) - } -} -ip_voff: 0x24b4 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 551 - column_num: 1 - voff_range: - [ - 0x24d6 - 0x24e6 - ) - } -} -ip_voff: 0x24d6 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 561 - column_num: 1 - voff_range: - [ - 0x24e6 - 0x24f7 - ) - } -} -ip_voff: 0x24e6 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 562 - column_num: 1 - voff_range: - [ - 0x24f7 - 0x2505 - ) - } -} -ip_voff: 0x24f7 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 563 - column_num: 1 - voff_range: - [ - 0x2505 - 0x2513 - ) - } -} -ip_voff: 0x2505 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 564 - column_num: 1 - voff_range: - [ - 0x2513 - 0x251f - ) - } -} -ip_voff: 0x2513 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 565 - column_num: 1 - voff_range: - [ - 0x251f - 0x2530 - ) - } -} -ip_voff: 0x251f -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 567 - column_num: 1 - voff_range: - [ - 0x2530 - 0x2544 - ) - } -} -ip_voff: 0x2530 -ip_voff_symbol: type_coverage_eval_tests -lines: -{ - { - file_name: "mule_main.cpp" - line_num: 569 - column_num: 1 - voff_range: - [ - 0x2544 - 0x254f - ) - } -} -ip_voff: 0x2544 -ip_voff_symbol: type_coverage_eval_tests diff --git a/run_tests.bat b/run_tests.bat index ca487581..55d13f51 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -11,7 +11,7 @@ set RUN_TORTURE=1 :: Make test data directories if not exist local mkdir local pushd local -if not exist test_inputs mkdir test_inputs +if not exist test_data mkdir test_data popd :: Check if we need new test data version @@ -34,10 +34,10 @@ popd if "%need_test_data%"=="1" ( echo Downloading test data... pushd local - pushd test_inputs - curl -s -o test_inputs.zip https://data.raddbg.com/public/raddbg_test_inputs.zip - tar -xf test_inputs.zip - del test_inputs.zip + pushd test_data + curl -s -o test_data.zip https://data.raddbg.com/public/raddbg_test_data.zip + tar -xf test_data.zip + del test_data.zip popd copy /y test_data_version_latest.txt test_data_version_current.txt popd diff --git a/src/torture/torture.c b/src/torture/torture.c index 302606a4..e9d15efb 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -1272,14 +1272,14 @@ t_entry_point(CmdLine *cmdline) { String8 binary_dir_path = get_process_info()->binary_path; String8 root_dir_path = str8_chop_last_slash(binary_dir_path); - g_exemplar_dir = str8f(scratch.arena, "%S/data/test_exemplars/%S", root_dir_path, test->label); + g_exemplar_dir = str8f(scratch.arena, "%S/local/test_data/exemplars/%S", root_dir_path, test->label); } // rjf: find input data directory { String8 binary_dir_path = get_process_info()->binary_path; String8 root_dir_path = str8_chop_last_slash(binary_dir_path); - g_input_data_dir = str8f(scratch.arena, "%S/local/test_inputs", root_dir_path); + g_input_data_dir = str8f(scratch.arena, "%S/local/test_data/inputs", root_dir_path); } // setup output directory From c890b806d5689d071684436ec338c6d15c53d768 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 21 Jun 2026 20:13:44 -0700 Subject: [PATCH 833/850] pull out test input/exemplar path formation helpers to base; fix torture crash --- src/base/base_test.c | 23 +++++++++- src/base/base_test.h | 49 +++++++++++---------- src/raddbg/tests/raddbg_tests.c | 11 +---- src/rdi_from_pdb/tests/rdi_from_pdb_tests.c | 25 +---------- src/torture/torture.c | 4 +- 5 files changed, 54 insertions(+), 58 deletions(-) diff --git a/src/base/base_test.c b/src/base/base_test.c index 5a2e302f..28b67153 100644 --- a/src/base/base_test.c +++ b/src/base/base_test.c @@ -3,6 +3,27 @@ #if BUILD_TESTS +internal String8 +test_input_path(Arena *arena, TestCtx *ctx, String8 name) +{ + String8 path = str8f(arena, "%S/%S", ctx->input_data_path, name); + return path; +} + +internal String8 +test_input_exe_path(Arena *arena, TestCtx *ctx, String8 name) +{ + String8 path = str8f(arena, "%S/%S%S", ctx->input_data_path, name, program_ext_postfix_from_os(OperatingSystem_CURRENT, 1)); + return path; +} + +internal String8 +test_exemplar_path(Arena *arena, TestCtx *ctx, String8 name) +{ + String8 path = str8f(arena, "%S/%S", ctx->exemplars_path, name); + return path; +} + internal void base_register_test(char *func_name_cstr, TestFunctionType *fn, char *file_path_cstr, int line, int skip) { @@ -10,7 +31,7 @@ base_register_test(char *func_name_cstr, TestFunctionType *fn, char *file_path_c U64 src_min = str8_find_needle(file_path, 0, s("src/"), StringMatchFlag_SlashInsensitive); U64 src_max = src_min + str8_lit("src/").size; U64 layer_slash_max = str8_find_needle(file_path, src_max, s("/"), StringMatchFlag_SlashInsensitive); - + TestInfo *t = &test_infos[test_infos_count++]; t->layer = str8_substr(file_path, r1u64(src_max, layer_slash_max)); t->label = str8_cstring(func_name_cstr); diff --git a/src/base/base_test.h b/src/base/base_test.h index f17c8f1c..827c59bb 100644 --- a/src/base/base_test.h +++ b/src/base/base_test.h @@ -17,20 +17,20 @@ TestStatus; typedef struct TestResult TestResult; struct TestResult { - TestStatus status; - char *fail_file; - int fail_line; - char *fail_cond; + TestStatus status; + char *fail_file; + int fail_line; + char *fail_cond; }; typedef struct TestCtx TestCtx; struct TestCtx { - CmdLine *cmdline; - String8 exemplars_path; - String8 artifacts_path; - String8 input_data_path; - TestResult *result_out; + CmdLine *cmdline; + String8 exemplars_path; + String8 artifacts_path; + String8 input_data_path; + TestResult *result_out; String8List *test_out; }; @@ -41,10 +41,10 @@ typedef TEST_FUNCTION_SIG(TestFunctionType); typedef struct TestInfo TestInfo; struct TestInfo { - String8 layer; - String8 label; - S64 decl_line; - B32 skip; + String8 layer; + String8 label; + S64 decl_line; + B32 skip; TestFunctionType *test_fn; }; @@ -54,18 +54,21 @@ struct TestInfo global U16 test_infos_count = 0; global TestInfo test_infos[0xffff] = {0}; +internal String8 test_input_path(Arena *arena, TestCtx *ctx, String8 name); +internal String8 test_input_exe_path(Arena *arena, TestCtx *ctx, String8 name); +internal String8 test_exemplar_path(Arena *arena, TestCtx *ctx, String8 name); internal void base_register_test(char *func_name, TestFunctionType *fn, char *file_path, int line, int skip); #define AddTest(name, file_path, line, skip_, ...) \ - TEST_FUNCTION_DEF(name); \ - __VA_ARGS__ void add_test__##name(void) { base_register_test(Stringify(name), test__##name, file_path, line, skip_); } +TEST_FUNCTION_DEF(name); \ +__VA_ARGS__ void add_test__##name(void) { base_register_test(Stringify(name), test__##name, file_path, line, skip_); } # if COMPILER_MSVC # pragma section(".CRT$XCU", read) # define DeclareTest(name, skip) \ - /* register test */ AddTest(name, __FILE__, __LINE__, (skip)) \ - /* alloc function pointer */ __declspec(allocate(".CRT$XCU")) void (*add_test_ptr__##name)(void) = add_test__##name; \ - /* do not GC test caller */ __pragma(comment(linker, "/include:" Stringify(add_test_ptr__##name))) +/* register test */ AddTest(name, __FILE__, __LINE__, (skip)) \ +/* alloc function pointer */ __declspec(allocate(".CRT$XCU")) void (*add_test_ptr__##name)(void) = add_test__##name; \ +/* do not GC test caller */ __pragma(comment(linker, "/include:" Stringify(add_test_ptr__##name))) # elif COMPILER_GCC || COMPILER_CLANG // clang and gcc allocate memory for the function pointer automatically # define DeclareTest(name, skip) AddTest(name, __FILE__, __LINE__, (skip), __attribute__((constructor))) @@ -80,14 +83,14 @@ internal void base_register_test(char *func_name, TestFunctionType *fn, char *fi #define SkippedTest(name) DeclareTest(name, 1) TEST_FUNCTION_DEF(name) #define TestCheck(c) do { if (!(c)) { \ - /* record failed check */ ctx->result_out[0] = (TestResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) }; \ - /* under debugger? -> trap */ if(debugger_is_attached()) { Trap(); } \ - /* exit test */ return; \ +/* record failed check */ ctx->result_out[0] = (TestResult){ .fail_file = __FILE__, .fail_line = __LINE__, .fail_cond = Stringify(c) }; \ +/* under debugger? -> trap */ if(debugger_is_attached()) { Trap(); } \ +/* exit test */ return; \ } } while(0) #define TestSkip() do { \ - ctx->result_out[0] = (TestResult){ .status = TestStatus_Skip }; \ - return; \ +ctx->result_out[0] = (TestResult){ .status = TestStatus_Skip }; \ +return; \ } while(0) // test log diff --git a/src/raddbg/tests/raddbg_tests.c b/src/raddbg/tests/raddbg_tests.c index 394853ef..231eb0a2 100644 --- a/src/raddbg/tests/raddbg_tests.c +++ b/src/raddbg/tests/raddbg_tests.c @@ -4,13 +4,6 @@ //////////////////////////////// //~ rjf: Debugger Testing IPC Driving Helpers -internal String8 -rd_test__test_binary_path(Arena *arena, TestCtx *ctx, String8 name) -{ - String8 path = str8f(arena, "%S/%S/%S%S", ctx->input_data_path, name, name, program_ext_postfix_from_os(OperatingSystem_CURRENT, 1)); - return path; -} - internal String8 rd_test__raddbg_path(Arena *arena, CmdLine *cmdline) { @@ -114,7 +107,7 @@ rd_test__stepping_regressions(Arena *arena, TestCtx *ctx, String8 target_binary, String8List test_log_strings = {0}; // rjf: get binary path - String8 binary_path = rd_test__test_binary_path(arena, ctx, target_binary); + String8 binary_path = test_input_exe_path(arena, ctx, str8f(scratch.arena, "%S/%S", target_binary, target_binary)); B32 binary_exists_locally = (properties_from_file_path(binary_path).modified != 0); // rjf: if binary does not exist -> skip this test, @@ -233,7 +226,7 @@ rd_test__eval_regressions(Arena *arena, TestCtx *ctx, String8 target_binary, Str String8List test_log_strings = {0}; // rjf: get binary path - String8 binary_path = rd_test__test_binary_path(arena, ctx, target_binary); + String8 binary_path = test_input_exe_path(arena, ctx, str8f(scratch.arena, "%S/%S", target_binary, target_binary)); B32 binary_exists_locally = (properties_from_file_path(binary_path).modified != 0); // rjf: if binary does not exist -> skip this test, diff --git a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c index 34c09dc2..2005a726 100644 --- a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c +++ b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c @@ -1,36 +1,15 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -internal String8 -p2r_test__test_path(Arena *arena, TestCtx *ctx, String8 id, String8 name) -{ - String8 path = str8f(arena, "%S/%S/%S", ctx->input_data_path, id, name); - return path; -} - Test(p2r_determinism) { U64 num_repeats_per_pdb = 16; String8 pdb_paths[] = { - p2r_test__test_path(arena, ctx, s("mule_main_9ff1e58f"), s("mule_main.pdb")), - p2r_test__test_path(arena, ctx, s("mule_main_9ff1e58f"), s("mule_module.pdb")), + test_input_path(arena, ctx, s("mule_main_9ff1e58f/mule_main.pdb")), + test_input_path(arena, ctx, s("mule_main_9ff1e58f/mule_module.pdb")), }; - B32 all_pdbs_exist_locally = 1; for EachElement(pdb_idx, pdb_paths) - { - String8 pdb_path = pdb_paths[pdb_idx]; - if(properties_from_file_path(pdb_path).modified == 0) - { - all_pdbs_exist_locally = 0; - break; - } - } - if(!all_pdbs_exist_locally) - { - TestSkip(); - } - else for EachElement(pdb_idx, pdb_paths) { // rjf: unpack paths, make output directory String8 pdb_path = pdb_paths[pdb_idx]; diff --git a/src/torture/torture.c b/src/torture/torture.c index e9d15efb..70a77111 100644 --- a/src/torture/torture.c +++ b/src/torture/torture.c @@ -1382,14 +1382,14 @@ t_entry_point(CmdLine *cmdline) if (slow_count > 1) { U64 label_max = 0; U64 layer_max = 0; - for EachElement(i, slowest) { + for EachIndex(i, slow_count) { Slowest s = slowest[i]; label_max = Max(g_sorted_test_infos[s.target_idx]->label.size, label_max); layer_max = Max(g_sorted_test_infos[s.target_idx]->layer.size, layer_max); } fprintf(stderr, " \nSlow Tests\n"); - for EachElement(i, slowest) { + for EachIndex(i, slow_count) { Slowest s = slowest[i]; if (s.target_idx >= test_infos_count) { break; } From 286589f4dedbbff2b92dd92ec7d5155ba4c001ca Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 21 Jun 2026 20:37:52 -0700 Subject: [PATCH 834/850] rdi_from_pdb: exemplar tests --- src/base/base_test.c | 8 +++ src/base/base_test.h | 1 + src/rdi_from_pdb/tests/rdi_from_pdb_tests.c | 69 ++++++++++++++++++++- 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/base/base_test.c b/src/base/base_test.c index 28b67153..149352fc 100644 --- a/src/base/base_test.c +++ b/src/base/base_test.c @@ -3,6 +3,14 @@ #if BUILD_TESTS +internal String8 +test_build_exe_path(Arena *arena, String8 name) +{ + String8 folder = get_process_info()->binary_path; + String8 path = str8f(arena, "%S/%S%S", folder, name, program_ext_postfix_from_os(OperatingSystem_CURRENT, 0)); + return path; +} + internal String8 test_input_path(Arena *arena, TestCtx *ctx, String8 name) { diff --git a/src/base/base_test.h b/src/base/base_test.h index 827c59bb..c7a225ee 100644 --- a/src/base/base_test.h +++ b/src/base/base_test.h @@ -54,6 +54,7 @@ struct TestInfo global U16 test_infos_count = 0; global TestInfo test_infos[0xffff] = {0}; +internal String8 test_build_exe_path(Arena *arena, String8 name); internal String8 test_input_path(Arena *arena, TestCtx *ctx, String8 name); internal String8 test_input_exe_path(Arena *arena, TestCtx *ctx, String8 name); internal String8 test_exemplar_path(Arena *arena, TestCtx *ctx, String8 name); diff --git a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c index 2005a726..a06fb53e 100644 --- a/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c +++ b/src/rdi_from_pdb/tests/rdi_from_pdb_tests.c @@ -1,9 +1,74 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +Test(p2r_regressions) +{ + String8 radbin_path = test_build_exe_path(arena, s("radbin")); + String8 pdb_paths[] = + { + test_input_path(arena, ctx, s("mule_main_9ff1e58f/mule_main.pdb")), + test_input_path(arena, ctx, s("mule_main_9ff1e58f/mule_module.pdb")), + }; + + // rjf: generate RDIs + { + ProcessList processes = {0}; + for EachElement(pdb_idx, pdb_paths) + { + String8 pdb_path = pdb_paths[pdb_idx]; + String8 rdi_path = str8f(arena, "%S/%I64u.rdi", ctx->artifacts_path, pdb_idx); + Process process = launch_cmd_line(str8f(arena, "%S --rdi --deterministic %S --out:%S", radbin_path, pdb_path, rdi_path)); + process_list_push(arena, &processes, process); + } + for EachNode(n, ProcessNode, processes.first) + { + process_join(n->v, max_U64, 0); + } + } + + // rjf: generate dumps + { + ProcessList processes = {0}; + for EachElement(pdb_idx, pdb_paths) + { + String8 rdi_path = str8f(arena, "%S/%I64u.rdi", ctx->artifacts_path, pdb_idx); + String8 dump_path = str8f(arena, "%S/current_%I64u", ctx->artifacts_path, pdb_idx); + Process process = launch_cmd_line(str8f(arena, "%S --dump --deterministic %S --out:%S", radbin_path, rdi_path, dump_path)); + process_list_push(arena, &processes, process); + } + for EachNode(n, ProcessNode, processes.first) + { + process_join(n->v, max_U64, 0); + } + } + + // rjf: check against exemplars + { + for EachElement(pdb_idx, pdb_paths) + { + Temp scratch = scratch_begin(&arena, 1); + String8 dump_path_current = str8f(scratch.arena, "%S/current_%I64u", ctx->artifacts_path, pdb_idx); + String8 dump_data_current = data_from_file_path(scratch.arena, dump_path_current); + String8 dump_path_exemplar = test_exemplar_path(scratch.arena, ctx, str8f(scratch.arena, "exemplar_%I64u", pdb_idx)); + String8 dump_data_exemplar = data_from_file_path(scratch.arena, dump_path_exemplar); + B32 dump_matches = str8_match(dump_data_current, dump_data_exemplar, 0); + if(!dump_matches) + { + String8 diff_cmd = str8f(scratch.arena, "diff %S %S", + path_normalized_from_string(scratch.arena, dump_path_current), + path_normalized_from_string(scratch.arena, dump_path_exemplar)); + test_outf("Current log does not match exemplar; run `%S`\n", diff_cmd); + } + TestCheck(dump_matches); + scratch_end(scratch); + } + } +} + Test(p2r_determinism) { U64 num_repeats_per_pdb = 16; + String8 radbin_path = test_build_exe_path(arena, s("radbin")); String8 pdb_paths[] = { test_input_path(arena, ctx, s("mule_main_9ff1e58f/mule_main.pdb")), @@ -24,7 +89,7 @@ Test(p2r_determinism) String8 rdi_name = str8f(arena, "repeat_%I64u.rdi", repeat_idx); String8 rdi_path = str8f(arena, "%S/%S", ctx->artifacts_path, rdi_name); str8_list_push(arena, &rdi_paths, rdi_path); - String8 cmdl = str8f(arena, "%S --rdi --deterministic %S --out:%S", t_radbin_path(), pdb_path, rdi_path); + String8 cmdl = str8f(arena, "%S --rdi --deterministic %S --out:%S", radbin_path, pdb_path, rdi_path); Process process = launch_cmd_line(cmdl); TestCheck(!process_match(process_zero(), process)); process_list_push(arena, &processes, process); @@ -43,7 +108,7 @@ Test(p2r_determinism) String8 rdi_path = n->string; String8 dump_path = str8f(arena, "%S.dump", rdi_path); str8_list_push(arena, &dump_paths, dump_path); - Process process_handle = launch_cmd_linef("%S --dump --deterministic %S --out:%S", t_radbin_path(), rdi_path, dump_path); + Process process_handle = launch_cmd_linef("%S --dump --deterministic %S --out:%S", radbin_path, rdi_path, dump_path); TestCheck(!process_match(process_zero(), process_handle)); process_list_push(arena, &processes, process_handle); } From dac63d6bef13853bc7bcd35ad4cc331f071d5515 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 21 Jun 2026 20:47:09 -0700 Subject: [PATCH 835/850] fix linux build --- build.sh | 2 +- project.raddbg | 5 +++-- src/base/base_core.h | 2 ++ src/eval2/eval2.c | 18 ++++++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index 361b5fa4..8dccc60f 100755 --- a/build.sh +++ b/build.sh @@ -18,7 +18,7 @@ git_hash_full=$(git rev-parse HEAD) # --- Compile/Link Line Definitions ------------------------------------------- cc_cflags_gcc="" -cc_cflags_clang=${cc_sanitize}" -fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef" +cc_cflags_clang=${cc_sanitize}" -fdiagnostics-absolute-paths -Wno-for-loop-analysis -Wno-incompatible-pointer-types-discards-qualifiers -Wno-initializer-overrides -Wno-compare-distinct-pointer-types -Wno-single-bit-bitfield-constant-conversion -Wno-deprecated-declarations -Wno-writable-strings -Wno-unknown-warning-option -Wno-deprecated-register -Wno-unused-local-typedef -msse2" cc_common="-mcx16 -I../src/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\"$git_hash\" -DBUILD_GIT_HASH_FULL=\"$git_hash_full\" -Wall -Wno-missing-braces -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-value -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf" cc_debug="-g -O0 -DBUILD_DEBUG=1 ${cc_common}" cc_release="-g -O2 -DBUILD_DEBUG=0 ${cc_common}" diff --git a/project.raddbg b/project.raddbg index b43ee327..67496dda 100644 --- a/project.raddbg +++ b/project.raddbg @@ -25,6 +25,8 @@ target: { executable: "build/torture.exe" working_directory: build + enabled: 1 + arguments: "raddbg/*" } target: { @@ -45,7 +47,6 @@ target: target: { executable: "build/radbin.exe" - working_directory: "build/" + working_directory: build arguments: "--breakpad fat.so --capture" - enabled: 1 } diff --git a/src/base/base_core.h b/src/base/base_core.h index 6df8361b..34410b19 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -272,6 +272,8 @@ # error Atomic intrinsics not defined for this compiler / architecture combination. # endif #elif COMPILER_CLANG || COMPILER_GCC +#include +#include # define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)__atomic_compare_exchange_n((__int128 *)(x),(__int128 *)(c),*(__int128 *)(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST) # define ins_atomic_u64_eval(x) __atomic_load_n((U64 *)(x), __ATOMIC_SEQ_CST) # define ins_atomic_u64_inc_eval(x) __atomic_add_fetch((U64 *)(x), 1, __ATOMIC_SEQ_CST) diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 4754c20d..9ee5e7be 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -230,6 +230,15 @@ e2_type_kind_from_rdi(RDI_TypeKind k) case RDI_TypeKind_IncompleteEnum: {result = E2_TypeKind_IncompleteEnum;}break; case RDI_TypeKind_Bitfield: {result = E2_TypeKind_Bitfield;}break; case RDI_TypeKind_Variadic: {result = E2_TypeKind_Variadic;}break; + + case RDI_TypeKind_BF16: + case RDI_TypeKind_F96: + case RDI_TypeKind_Decimal32: + case RDI_TypeKind_Decimal64: + case RDI_TypeKind_Decimal128: + { + // NOTE(rjf): currently unsupported + }break; } return result; } @@ -240,6 +249,8 @@ e2_type_group_from_kind(E2_TypeKind k) RDI_EvalTypeGroup result = 0; switch(k) { + case E2_TypeKind_COUNT:{}break; + case E2_TypeKind_Null: case E2_TypeKind_Void: case E2_TypeKind_F16: case E2_TypeKind_F32PP: case E2_TypeKind_F48: case E2_TypeKind_F80: case E2_TypeKind_F128: @@ -252,6 +263,13 @@ e2_type_group_from_kind(E2_TypeKind k) case E2_TypeKind_IncompleteUnion: case E2_TypeKind_IncompleteEnum: case E2_TypeKind_Bitfield: case E2_TypeKind_Variadic: + case E2_TypeKind_HResult: + case E2_TypeKind_Set: + case E2_TypeKind_Lens: + case E2_TypeKind_LensSpec: + case E2_TypeKind_MetaExpr: + case E2_TypeKind_MetaDisplayName: + case E2_TypeKind_MetaDescription: {result = RDI_EvalTypeGroup_Other;}break; case E2_TypeKind_Handle: From 73e9f3c9dab11c91ab9cf48002de4d2183aa0246 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sun, 21 Jun 2026 20:56:46 -0700 Subject: [PATCH 836/850] rdi_from_dwarf: determinism / regression tests --- .../tests/rdi_from_dwarf_tests.c | 746 ++++-------------- 1 file changed, 166 insertions(+), 580 deletions(-) diff --git a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c index fa635619..0c5802df 100644 --- a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c +++ b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c @@ -1,599 +1,185 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -// TODO: -// -// [ ] d2r_types alias size and byte size on __float80 typedef mismatch - -#if 0 // TODO(rjf): this uses concepts from the old parser - replace with p2r-style exemplar testing to catch regressions - -internal RDI_Parsed * -d2r_rdi_from_dwarf_writer(Arena *arena, DW_Writer *writer) +Test(d2r_regressions) { - Temp scratch = scratch_begin(&arena, 1); - - RDI_Parsed *rdi = push_array(arena, RDI_Parsed, 1); - - String8 raw_coff; + String8 radbin_path = test_build_exe_path(arena, s("radbin")); + String8 bin_paths[] = { - OBJ *obj = obj_alloc(0, Arch_x64); - OBJ_Section *text_section = obj_push_section(obj, str8_lit(".text"), OBJ_SectionFlag_Read|OBJ_SectionFlag_Exec|OBJ_SectionFlag_Load); - str8_serial_push_u8(obj->arena, &text_section->data, 0xc3); - obj_push_symbol(obj, str8_lit("main"), OBJ_SymbolScope_Global, OBJ_RefKind_Section, text_section); - dw_writer_emit_to_obj(writer, obj); - raw_coff = coff_from_obj(scratch.arena, obj); - obj_release(&obj); - } - - Assert(t_write_file(str8_lit("a.obj"), raw_coff)); - t_invoke(t_radlink_path(), str8_lit("/subsystem:console /out:a.exe /entry:main /DEBUG:FULL /opt:noref /opt:noicf a.obj"), max_U64); - Assert(g_last_exit_code == 0); - String8 exe = t_read_file(scratch.arena, str8_lit("a.exe")); - Assert(exe.size > 0); - - B32 was_pdb_deleted = delete_file_at_path(t_make_file_path(scratch.arena, str8_lit("a.pdb"))); - Assert(was_pdb_deleted); - - t_invoke(t_radbin_path(), str8_lit("-rdi a.exe -out:a.rdi"), max_U64); - if (g_last_exit_code != 0) { - t_errorf("ERROR: failed to invoke radbin: %S\n", g_errors); - goto exit; - } - - String8 raw_rdi = t_read_file(arena, str8_lit("a.rdi")); - Assert(raw_rdi.size > 0); - - RDI_ParseStatus rdi_parse_status = rdi_parse(raw_rdi.str, raw_rdi.size, rdi); - Assert(rdi_parse_status == RDI_ParseStatus_Good); - - exit:; - scratch_end(scratch); - return rdi; -} - -internal RDI_TypeNode * -d2rt_type_from_name(RDI_Parsed *rdi, RDI_ParsedNameMap *map, char *name) -{ - String8 s = str8_cstring(name); - RDI_NameMapNode *node = rdi_name_map_lookup(rdi, map, s.str, s.size); - - U32 id_count = 0; - U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count); - - if (id_count == 1) { - return rdi_element_from_name_idx(rdi, TypeNodes, ids[0]); - } - return 0; -} - -TEST(d2r_types) -{ - DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - { - dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); - -#define DeclBaseType(tt, n, e, s) \ -DW_WriterTag *tt = dw_writer_tag_begin(writer, DW_TagKind_BaseType); \ -dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, s); \ -dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_##e); \ -dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ -dw_writer_tag_end(writer); - DeclBaseType(char_type, "char", SignedChar, 1); - DeclBaseType(unsigned_char_type, "unsigned char", UnsignedChar, 1); - DeclBaseType(char8_type, "char8_t", Utf, 1); - DeclBaseType(char16_type, "char16_t", Utf, 2); - DeclBaseType(char32_type, "char32_t", Utf, 4); - DeclBaseType(wchar_type, "wchar_t", Signed, 4); - DeclBaseType(bool_type, "_Bool", Boolean, 1); - DeclBaseType(short_type, "short", Signed, 2); - DeclBaseType(unsigned_short_type, "unsigned short", Unsigned, 2); - DeclBaseType(short_unsigned_int_type, "short unsigned int", Unsigned, 2); - DeclBaseType(short_int_type, "short int", Signed, 2); - DeclBaseType(unsigned_int_type, "unsigned int", Unsigned, 4); - DeclBaseType(int_type, "int", Signed, 4); - DeclBaseType(long_int_type, "long int", Signed, 8); - DeclBaseType(long_unsigned_int_type, "long unsigned int", Unsigned, 8); - DeclBaseType(long_long_int_type, "long long int", Signed, 8); - DeclBaseType(long_long_unsigned_int, "long long unsigned int", Unsigned, 8); - DeclBaseType(float_type, "float", Float, 4); - DeclBaseType(double_type, "double", Float, 8); - DeclBaseType(long_double_type, "long double", Float, 16); - DeclBaseType(int128_type, "__int128", Signed, 16); - DeclBaseType(uint128_type, "__int128 unsigned", Unsigned, 16); - DeclBaseType(float16_type, "_Float16", Float, 2); - DeclBaseType(bfloat16_type, "__bf16", Float, 2); - //DeclBaseType(float80_type, "__float80", Float, 16); - DeclBaseType(float128_type, "_float128", Float, 16); - DeclBaseType(complex_float_type, "complex float", ComplexFloat, 8); - DeclBaseType(complex_doulbe_type, "complex double", ComplexFloat, 16); - DeclBaseType(complex_long_double_type, "complex long double", ComplexFloat, 32); - DeclBaseType(decimal32_type, "_Decimal32", DecimalFloat, 4); - DeclBaseType(decimal64_type, "_Decimal64", DecimalFloat, 8); - DeclBaseType(decimal128_type, "_Decimal128", DecimalFloat, 16); -#undef DeclBaseType - -#define DeclStdint(n, a) \ -do { \ -dw_writer_tag_begin(writer, DW_TagKind_Typedef); \ -dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, n); \ -dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, a); \ -dw_writer_tag_end(writer); \ -} while (0) - DeclStdint("uint8_t", unsigned_char_type); - DeclStdint("uint16_t", unsigned_short_type); - DeclStdint("uint32_t", unsigned_int_type); - DeclStdint("uint64_t", long_unsigned_int_type); - DeclStdint("int8_t", char_type); - DeclStdint("int16_t", short_type); - DeclStdint("int32_t", int_type); - DeclStdint("int64_t", long_int_type); -#undef DeclStdInt - // TODO: @native_vector_support - // - // typedef int __attribute__((vector_size(32))) int256 - // typedef unsigned int __attribute__((vector_size(32))) uint256 - // typedef int __attribute__((vector_size(64))) int512 - // typedef unsigned int __attribute__((vector_size(64))) uint512 - // -#if 0 - dw_writer_tag_begin(writer, DW_TagKind_ArrayType); - dw_writer_push_attrib_flag(writer, DW_AttribKind_GNU_Vector, 1); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, int_type); - dw_writer_tag_begin(writer, DW_TagKind_SubrangeType); - dw_writer_push_attrib_uint(writer, DW_AttribKind_UpperBound, 15); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); -#endif - - dw_writer_tag_end(writer); - } - - RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); - RDI_NameMap *types_nm = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Types); - T_Ok(types_nm); - - RDI_ParsedNameMap types_map = {0}; - rdi_parsed_from_name_map(rdi, types_nm, &types_map); - -#define TestBuiltinType(n, bs, r) \ -do { \ -RDI_TypeNode *alias = d2rt_type_from_name(rdi, &types_map, n); \ -T_Ok(alias); \ -T_Ok(alias->kind == RDI_TypeKind_Alias); \ -T_Ok(alias->flags == 0); \ -T_Ok(alias->byte_size == bs); \ -RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, alias->user_defined.direct_type_idx); \ -T_Ok(type); \ -T_Ok(type->kind == RDI_TypeKind_##r); \ -T_Ok(type->flags == 0); \ -T_Ok(type->byte_size == alias->byte_size); \ -U64 expected_name_size = 0; \ -U8 *expected_name = rdi_string_from_type_kind(RDI_TypeKind_##r, &expected_name_size); \ -T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8(expected_name, expected_name_size), 0)); \ -} while (0) - TestBuiltinType("char", 1, Char8); - TestBuiltinType("char8_t", 1, UChar8); - TestBuiltinType("char16_t", 2, UChar16); - TestBuiltinType("char32_t", 4, UChar32); - TestBuiltinType("unsigned char", 1, UChar8); - TestBuiltinType("wchar_t", 4, Char32); - TestBuiltinType("_Bool", 1, Bool); - TestBuiltinType("short", 2, S16); - TestBuiltinType("unsigned short", 2, U16); - TestBuiltinType("short unsigned int", 2, U16); - TestBuiltinType("short int", 2, S16); - TestBuiltinType("unsigned int", 4, U32); - TestBuiltinType("int", 4, S32); - TestBuiltinType("long int", 8, S64); - TestBuiltinType("long unsigned int", 8, U64); - TestBuiltinType("long long int", 8, S64); - TestBuiltinType("float", 4, F32); - TestBuiltinType("double", 8, F64); - TestBuiltinType("long double", 16, F128); - TestBuiltinType("__int128", 16, S128); - TestBuiltinType("__int128 unsigned", 16, U128); - TestBuiltinType("_Float16", 2, F16); - TestBuiltinType("__bf16", 2, BF16); - //TestBuiltinType("__float80", 16, F80); - TestBuiltinType("_float128", 16, F128); - TestBuiltinType("complex float", 8, ComplexF32); - TestBuiltinType("complex double", 16, ComplexF64); - TestBuiltinType("complex long double", 32, ComplexF128); - TestBuiltinType("_Decimal32", 4, Decimal32); - TestBuiltinType("_Decimal64", 8, Decimal64); - TestBuiltinType("_Decimal128", 16, Decimal128); -#undef TestBuiltinType - -#define TestStdint(n, s, t) \ -do { \ -RDI_TypeNode *td = d2rt_type_from_name(rdi, &types_map, n); \ -T_Ok(td); \ -T_Ok(td->kind == RDI_TypeKind_Alias); \ -T_Ok(td->flags == 0); \ -T_Ok(td->byte_size == s); \ -RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, td->user_defined.direct_type_idx); \ -T_Ok(type); \ -T_Ok(type->kind == RDI_TypeKind_Alias); \ -T_Ok(type->flags == 0); \ -T_Ok(type->byte_size = td->byte_size); \ -T_Ok(str8_match(str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx), str8_lit(t), 0)); \ -} while (0) - TestStdint("uint8_t", 1, "unsigned char"); - TestStdint("uint16_t", 2, "unsigned short"); - TestStdint("uint32_t", 4, "unsigned int"); - TestStdint("uint64_t", 8, "long unsigned int"); - TestStdint("int8_t", 1, "char"); - TestStdint("int16_t", 2, "short"); - TestStdint("int32_t", 4, "int"); - TestStdint("int64_t", 8, "long int"); -#undef TestStdint - - dw_writer_end(&writer); -} - -SKIP(d2r_line_table) -{ - DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - String8 comp_dir = str8_lit("c:/DEVEL/"); - String8 comp_name = str8_lit("test.c"); - - DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/C/Devel/foo.c")); - DW_WriterFile *comp_file = dw_writer_new_file(writer, str8f(arena, "%S%S", comp_dir, comp_name)); - - struct { - DW_WriterFile *file; U64 ln; U64 line_size; U64 voff; - } test_table[] = { - { comp_file, 6, 1 }, - { comp_file, 4, 2 }, - { comp_file, 2, 3 }, - { comp_file, 1, 4 }, - { comp_file, 8, 5 }, - { foo_file, 1, 3 }, - { foo_file, 100, 1 }, - { comp_file, max_U32 - 0x100, 10 }, + test_input_path(arena, ctx, s("raddbg_linux_dac63d6b/raddbg")), }; - U64 exe_base = coff_default_exe_base_from_machine(COFF_MachineType_X64); - U64 voff = 0x1000; - for EachElement(i, test_table) { - test_table[i].voff = voff; - dw_writer_line_emit(writer, test_table[i].file, test_table[i].ln, 0, exe_base + voff); - voff += test_table[i].line_size; - } - - // emit one past last line - dw_writer_line_emit(writer, - test_table[ArrayCount(test_table) - 1].file, - test_table[ArrayCount(test_table) - 1].ln, - 0, - exe_base + voff); - - dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, comp_dir); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, comp_name); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, exe_base); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, exe_base + voff); - dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); - dw_writer_tag_end(writer); - - d2r_rdi_from_dwarf_writer(arena, writer); - - for EachElement(i, test_table) { - for EachIndex(k, test_table[i].line_size) { - String8 cmdl = str8f(arena, "-voff2line -voff:0x%llx %S", test_table[i].voff + k, t_make_file_path(arena, str8_lit("a.rdi"))); - t_invoke_radbin((char *)cmdl.str); - - if (g_last_exit_code != 0) { - t_errorf("radbin exited with %llu on \"%S\"\n", (unsigned long long)g_last_exit_code, cmdl); - T_Ok(0); - } - - if ( ! t_match_linef(&g_output, "%S:%llu", test_table[i].file->path, test_table[i].ln)) { - t_errorf("ERROR: conversion produced unexpected output for \"radbin %S\"\n" \ - " Expected: %S:%llu\n" \ - " Got: %S\n", - cmdl, - test_table[i].file->path, (unsigned long long)test_table[i].ln, - g_output); - - if (g_verbose) { - t_invoke_radbin("-dump -only:line_tables a.rdi"); - t_errorf("\n================================================================================\n"); - t_errorf("RDI:\n%S\n", g_output); - - t_errorf("================================================================================\n"); - t_invoke_radbin("-dump -only:debug_line a.exe"); - t_errorf("DWARF:\n%S\n", g_output); - - g_output = str8_zero(); - } - - T_Ok(0); - } + // rjf: generate RDIs + { + ProcessList processes = {0}; + for EachElement(bin_idx, bin_paths) + { + String8 bin_path = bin_paths[bin_idx]; + String8 rdi_path = str8f(arena, "%S/%I64u.rdi", ctx->artifacts_path, bin_idx); + Process process = launch_cmd_line(str8f(arena, "%S --rdi --deterministic %S --out:%S", radbin_path, bin_path, rdi_path)); + process_list_push(arena, &processes, process); + } + for EachNode(n, ProcessNode, processes.first) + { + process_join(n->v, max_U64, 0); } } - dw_writer_end(&writer); + // rjf: generate dumps + { + ProcessList processes = {0}; + for EachElement(bin_idx, bin_paths) + { + String8 rdi_path = str8f(arena, "%S/%I64u.rdi", ctx->artifacts_path, bin_idx); + String8 dump_path = str8f(arena, "%S/current_%I64u", ctx->artifacts_path, bin_idx); + Process process = launch_cmd_line(str8f(arena, "%S --dump --deterministic %S --out:%S", radbin_path, rdi_path, dump_path)); + process_list_push(arena, &processes, process); + } + for EachNode(n, ProcessNode, processes.first) + { + process_join(n->v, max_U64, 0); + } + } + + // rjf: check against exemplars + { + for EachElement(bin_idx, bin_paths) + { + Temp scratch = scratch_begin(&arena, 1); + String8 dump_path_current = str8f(scratch.arena, "%S/current_%I64u", ctx->artifacts_path, bin_idx); + String8 dump_data_current = data_from_file_path(scratch.arena, dump_path_current); + String8 dump_path_exemplar = test_exemplar_path(scratch.arena, ctx, str8f(scratch.arena, "exemplar_%I64u", bin_idx)); + String8 dump_data_exemplar = data_from_file_path(scratch.arena, dump_path_exemplar); + B32 dump_matches = str8_match(dump_data_current, dump_data_exemplar, 0); + if(!dump_matches) + { + String8 diff_cmd = str8f(scratch.arena, "diff %S %S", + path_normalized_from_string(scratch.arena, dump_path_current), + path_normalized_from_string(scratch.arena, dump_path_exemplar)); + test_outf("Current log does not match exemplar; run `%S`\n", diff_cmd); + } + TestCheck(dump_matches); + scratch_end(scratch); + } + } } -SKIP(d2r_checksums) +Test(d2r_determinism) { - DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - - B32 is_ok = 0; - - DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/c/devel/foo.c")); - DW_WriterFile *comp_file = dw_writer_new_file(writer, str8_lit("/home/main.c")); - foo_file->md5 = *(U128 *)&(U8[16]){ 0x04, 0x70, 0xe9, 0x6b, 0xa3, 0x05, 0x2c, 0xc8, 0x2d, 0x70, 0xc5, 0xe9, 0x80, 0x8e, 0x8a, 0x4e, }; - comp_file->md5 = *(U128 *)&(U8[16]){ 0x82, 0x3c, 0xc6, 0x02, 0x82, 0x9e, 0xf6, 0xce, 0x53, 0xff, 0x5a, 0x93, 0xb6, 0x6e, 0x59, 0x38 }; - comp_file->time_stamp = 123; // convert must pick MD5 checksum over time stamp - - dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string(writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_string(writer, DW_AttribKind_CompDir, str8_chop_last_slash(comp_file->path)); - dw_writer_push_attrib_string(writer, DW_AttribKind_Name, str8_skip_last_slash(comp_file->path)); - dw_writer_push_attrib_line_ptr(writer, DW_AttribKind_StmtList, 0); - dw_writer_tag_end(writer); - - RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); - U64 checksum_count = 0; - RDI_MD5 *checksums = rdi_table_from_name(rdi, MD5Checksums, &checksum_count); - if (checksum_count != writer->line.file_count + 1) { goto exit; } - - RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)foo_file->path.str); - if (foo_src_file == 0) { - t_errorf("ERROR: RDI is missing file %S\n", foo_file->path); - goto exit; - } - if (foo_src_file->checksum_kind != RDI_ChecksumKind_MD5) { - t_errorf("ERROR: File %S has unexpected checksum value %u, expected %u\n", foo_file->path, foo_src_file->checksum_kind, RDI_ChecksumKind_MD5); - goto exit; - } - if (MemoryMatch(&foo_file->md5, &checksums[foo_src_file->checksum_idx], sizeof(U128)) != 1) { - t_errorf("ERROR mismatched checksum in file %S\n", foo_file->path); - goto exit; - } - - RDI_SourceFile *comp_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)comp_file->path.str); - if (comp_src_file == 0) { - t_errorf("ERROR: RDI is missing file %S\n", comp_file->path); - goto exit; - } - if (comp_src_file->checksum_kind != RDI_ChecksumKind_MD5) { - t_errorf("ERROR: File %S has unexpected checksum value %u, expected %u\n", comp_file->path, comp_src_file->checksum_kind, RDI_ChecksumKind_MD5); - goto exit; - } - if (MemoryMatch(&comp_file->md5, &checksums[comp_src_file->checksum_idx], sizeof(U128)) != 1) { - t_errorf("ERROR mismatched checksum in file %S\n", comp_file->path); - goto exit; - } - - is_ok = 1; - exit:; - if ( ! is_ok) { - t_errorf("Converter repro: \"radbin -rdi %S\"\n", t_make_file_path(arena, str8_lit("a.exe"))); - t_invoke(t_radbin_path(), str8_lit("-dump -only:source_files a.rdi"), max_U64); - t_errorf("RDI:\n%S\n", g_output); - t_invoke(t_radbin_path(), str8_lit("-dump -only:debug_line a.exe"), max_U64); - t_errorf("DWARF:\n%S\n", g_output); - } - dw_writer_end(&writer); -} - -#if SUBPROGRAM_CONVERSION_TEST -TEST(d2r_subprogram) -{ - DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); - - U64 image_lo = coff_default_exe_base_from_machine(COFF_MachineType_X64); - U64 image_hi = image_lo + 0x10000; - U64 subprogram_lo = image_lo + 0x1000; - U64 subprogram_hi = subprogram_lo + 0x100; - U64 subprogram_entry_addr = subprogram_lo + 5; - String8 subprogram_link_name = str8_lit("@FOOBAR!"); - String8 subprogram_name = str8_lit("foobar"); - - dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_string (writer, DW_AttribKind_Producer, str8_lit("RAD DWARF WRITER")); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, image_lo); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, image_hi); - - DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); - dw_writer_push_attrib_sint (writer, DW_AttribKind_ByteSize, 1); - dw_writer_push_attrib_sint (writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); - dw_writer_tag_end(writer); - - DW_WriterTag *char_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); - dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 8); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, char_type); - dw_writer_tag_end(writer); - - DW_WriterTag *int_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); - dw_writer_push_attrib_sint (writer, DW_AttribKind_ByteSize, 4); - dw_writer_push_attrib_sint (writer, DW_AttribKind_Encoding, DW_ATE_Signed); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "int"); - dw_writer_tag_end(writer); - - DW_WriterTag *int_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); - dw_writer_push_attrib_uint(writer, DW_AttribKind_ByteSize, 8); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_type); - dw_writer_tag_end(writer); - - dw_writer_tag_begin(writer, DW_TagKind_SubProgram); - dw_writer_push_attrib_enum (writer, DW_AttribKind_Accessibility, DW_AccessKind_Private); - dw_writer_push_attrib_enum (writer, DW_AttribKind_AddressClass, DW_AddrClassKind_None); - dw_writer_push_attrib_uint (writer, DW_AttribKind_Alignment, 32); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Artificial, 1); - dw_writer_push_attrib_enum (writer, DW_AttribKind_CallingConvention, DW_CallingConventionKind_Program); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Deleted, 1); - dw_writer_push_attrib_address(writer, DW_AttribKind_EntryPc, subprogram_entry_addr); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Explicit, 1); - dw_writer_push_attrib_flag (writer, DW_AttribKind_External, 1); - dw_writer_push_attrib_exprv (writer, DW_AttribKind_FrameBase, DW_ExprEnc_Op(Reg7)); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, subprogram_hi); - dw_writer_push_attrib_enum (writer, DW_AttribKind_Inline, DW_Inl_DeclaredNotInlined); - dw_writer_push_attrib_string (writer, DW_AttribKind_LinkageName, subprogram_link_name); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, subprogram_lo); - dw_writer_push_attrib_flag (writer, DW_AttribKind_MainSubProgram, 1); - dw_writer_push_attrib_string (writer, DW_AttribKind_Name, subprogram_name); - dw_writer_push_attrib_flag (writer, DW_AttribKind_NoReturn, 1); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Prototyped, 1); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Pure, 1); - dw_writer_push_attrib_flag (writer, DW_AttribKind_Recursive, 1); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_type); - dw_writer_push_attrib_enum (writer, DW_AttribKind_Visibility, DW_Vis_Local); - // TODO: DW_AttribKind_ObjectPointer - // TODO: DW_AttribKind_Ranges - // TODO: DW_AttribKind_StartScope - dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "a"); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); - dw_writer_push_attrib_exprv (writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg2)); // rcx - dw_writer_tag_end(writer); - - dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "b"); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, char_ptr_type); - dw_writer_push_attrib_exprv (writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg5)); // rdi - dw_writer_tag_end(writer); - - dw_writer_tag_begin(writer, DW_TagKind_UnspecifiedParameters); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); - - // -------------------------------------------------------------------------------- - - DW_WriterTag *my_struct_type = dw_writer_tag_reserve(writer, DW_TagKind_StructureType); - - DW_WriterTag *const_my_struct_type = dw_writer_tag_begin(writer, DW_TagKind_ConstType); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_type); - dw_writer_tag_end(writer); - - DW_WriterTag *my_struct_ptr_type = dw_writer_tag_begin(writer, DW_TagKind_PointerType); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, const_my_struct_type); - dw_writer_tag_end(writer); - - dw_writer_tag_begin_reserved(writer, my_struct_type); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyStructure"); - dw_writer_push_attrib_uint (writer, DW_AttribKind_ByteSize, 0x100); - - dw_writer_tag_begin(writer, DW_TagKind_SubProgram); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "MyMethod"); - dw_writer_push_attrib_ref (writer, DW_AttribKind_Type, int_ptr_type); - - dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, my_struct_ptr_type); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); - - // -------------------------------------------------------------------------------- - - dw_writer_tag_end(writer); - - RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); - RDI_Procedure *proc = rdi_procedure_from_name_cstr(rdi, (char *)subprogram_name.str); - RDI_TypeNode *proc_type = rdi_element_from_name_idx(rdi, TypeNodes, proc->type_idx); - String8 proc_string = rdi_string_from_type(arena, rdi, proc, proc_type); - - dw_writer_end(&writer); -} -#endif - -TEST(d2r_general) -{ - DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); + U64 num_repeats_per_bin = 16; + String8 radbin_path = test_build_exe_path(arena, s("radbin")); + String8 bin_paths[] = { - dw_writer_tag_begin(writer, DW_TagKind_CompileUnit); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Producer, "Test"); - // declare char type - DW_WriterTag *char_type = dw_writer_tag_begin(writer, DW_TagKind_BaseType); - dw_writer_push_attrib_sint(writer, DW_AttribKind_ByteSize, 1); - dw_writer_push_attrib_enum(writer, DW_AttribKind_Encoding, DW_ATE_SignedChar); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "char"); - dw_writer_tag_end(writer); - // declare function - dw_writer_tag_begin(writer, DW_TagKind_SubProgram); - dw_writer_push_attrib_address(writer, DW_AttribKind_LowPc, 0x140173f9); - dw_writer_push_attrib_address(writer, DW_AttribKind_HighPc, 0x14017474b); - dw_writer_push_attrib_flag(writer, DW_AttribKind_External, 1); - dw_writer_push_attrib_flag(writer, DW_AttribKind_Prototyped, 1); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "FooBar"); - // declare local - dw_writer_tag_begin(writer, DW_TagKind_Variable); - dw_writer_push_attrib_exprv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestLocal"); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); - dw_writer_tag_end(writer); - // declare param - dw_writer_tag_begin(writer, DW_TagKind_FormalParameter); - dw_writer_push_attrib_exprv(writer, DW_AttribKind_Location, DW_ExprEnc_Op(Reg7)); - dw_writer_push_attrib_stringf(writer, DW_AttribKind_Name, "TestParam"); - dw_writer_push_attrib_ref(writer, DW_AttribKind_Type, char_type); - dw_writer_tag_end(writer); - dw_writer_tag_end(writer); - } - - RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); - - RDI_Symbol *proc = rdi_procedure_from_name_cstr(rdi, "FooBar"); - T_Ok(proc); - String8 proc_name = str8_from_rdi_string_idx(rdi, proc->name_string_idx); - T_Ok(str8_match(proc_name, str8_lit("FooBar"), 0)); - - RDI_Scope *root_scope = rdi_root_scope_from_procedure(rdi, proc); - T_Ok(root_scope); - T_Ok(root_scope->local_count == 2); - + test_input_path(arena, ctx, s("raddbg_linux_dac63d6b/raddbg")), + }; + for EachElement(bin_idx, bin_paths) { - RDI_Symbol *test_local = rdi_element_from_name_idx(rdi, LocalVariables, root_scope->local_first + 0); - T_Ok(test_local); - T_Ok((test_local->symbol_flags & RDI_SymbolFlag_IsParam) == 0); - String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); - T_Ok(str8_match(test_local_name, str8_lit("TestLocal"), 0)); + // rjf: unpack paths, make output directory + String8 bin_path = bin_paths[bin_idx]; - RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); - T_Ok(test_local_type); - T_Ok(test_local_type->kind == RDI_TypeKind_Alias); - T_Ok(test_local_type->flags == 0); - String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); - T_Ok(str8_match(alias_name, str8_lit("char"), 0)); + // rjf: generate all RDIs + String8List rdi_paths = {0}; + String8List dump_paths = {0}; + { + ProcessList processes = {0}; + for EachIndex(repeat_idx, num_repeats_per_bin) + { + String8 rdi_name = str8f(arena, "repeat_%I64u.rdi", repeat_idx); + String8 rdi_path = str8f(arena, "%S/%S", ctx->artifacts_path, rdi_name); + str8_list_push(arena, &rdi_paths, rdi_path); + String8 cmdl = str8f(arena, "%S --rdi --deterministic %S --out:%S", radbin_path, bin_path, rdi_path); + Process process = launch_cmd_line(cmdl); + TestCheck(!process_match(process_zero(), process)); + process_list_push(arena, &processes, process); + } + for EachNode(n, ProcessNode, processes.first) + { + process_join(n->v, max_U64, 0); + } + } - RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); - T_Ok(char_type); - T_Ok(char_type->kind == RDI_TypeKind_Char8); - T_Ok(char_type->flags == 0); - T_Ok(char_type->byte_size == 1); - String8 char_type_name = str8_from_rdi_string_idx(rdi, char_type->built_in.name_string_idx); - T_Ok(str8_match(char_type_name, str8_lit("Char8"), 0)); + // rjf: generate all dumps + { + ProcessList processes = {0}; + for EachNode(n, String8Node, rdi_paths.first) + { + String8 rdi_path = n->string; + String8 dump_path = str8f(arena, "%S.dump", rdi_path); + str8_list_push(arena, &dump_paths, dump_path); + Process process_handle = launch_cmd_linef("%S --dump --deterministic %S --out:%S", radbin_path, rdi_path, dump_path); + TestCheck(!process_match(process_zero(), process_handle)); + process_list_push(arena, &processes, process_handle); + } + for EachNode(n, ProcessNode, processes.first) + { + process_join(n->v, max_U64, 0); + } + } + + // rjf: gather all hashes/paths + U64 rdi_hashes_count = rdi_paths.node_count; + U128 *rdi_hashes = push_array(arena, U128, rdi_hashes_count); + String8 *rdi_paths_array = push_array(arena, String8, rdi_hashes_count); + U64 dump_hashes_count = dump_paths.node_count; + U128 *dump_hashes = push_array(arena, U128, dump_hashes_count); + String8 *dump_paths_array = push_array(arena, String8, dump_hashes_count); + { + U64 idx = 0; + for EachNode(n, String8Node, rdi_paths.first) + { + Temp scratch = scratch_begin(0, 0); + String8 rdi_path = n->string; + String8 path = rdi_path; + String8 data = data_from_file_path(scratch.arena, path); + TestCheck(data.size != 0); + rdi_hashes[idx] = u128_hash_from_str8(data); + rdi_paths_array[idx] = path; + scratch_end(scratch); + idx += 1; + } + } + { + U64 idx = 0; + for EachNode(n, String8Node, dump_paths.first) + { + Temp scratch = scratch_begin(0, 0); + String8 path = n->string; + String8 data = data_from_file_path(scratch.arena, path); + TestCheck(data.size != 0); + dump_hashes[idx] = u128_hash_from_str8(data); + dump_paths_array[idx] = path; + scratch_end(scratch); + idx += 1; + } + } + + // rjf: determine if all hashes match + U64 mismatch_num = 0; + for EachIndex(idx, rdi_hashes_count) + { + if(!u128_match(rdi_hashes[idx], rdi_hashes[0])) + { + mismatch_num = idx+1; + break; + } + } + for EachIndex(idx, dump_hashes_count) + { + if(!u128_match(dump_hashes[idx], dump_hashes[0])) + { + mismatch_num = idx+1; + break; + } + } + + // rjf: output bad case info + if(mismatch_num != 0) + { + U64 idx = mismatch_num-1; + test_outf(" bin[%I64u] \"%S\"\n", idx, bin_path); + test_outf(" rdi[%I64u] 0x%I64x:%I64x \"%S\"\n", idx, rdi_hashes[idx].u64[0], rdi_hashes[idx].u64[1], rdi_paths_array[idx]); + test_outf(" dump[%I64u] 0x%I64x:%I64x \"%S\"\n", idx, dump_hashes[idx].u64[0], dump_hashes[idx].u64[1], dump_paths_array[idx]); + } + TestCheck(mismatch_num == 0); } - - { - RDI_Symbol *test_local = rdi_element_from_name_idx(rdi, LocalVariables, root_scope->local_first + 1); - T_Ok(test_local); - T_Ok((test_local->symbol_flags & RDI_SymbolFlag_IsParam) != 0); - String8 test_local_name = str8_from_rdi_string_idx(rdi, test_local->name_string_idx); - T_Ok(str8_match(test_local_name, str8_lit("TestParam"), 0)); - - RDI_TypeNode *test_local_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local->type_idx); - T_Ok(test_local_type); - T_Ok(test_local_type->kind == RDI_TypeKind_Alias); - T_Ok(test_local_type->flags == 0); - String8 alias_name = str8_from_rdi_string_idx(rdi, test_local_type->user_defined.name_string_idx); - T_Ok(str8_match(alias_name, str8_lit("char"), 0)); - - RDI_TypeNode *char_type = rdi_element_from_name_idx(rdi, TypeNodes, test_local_type->user_defined.direct_type_idx); - T_Ok(char_type); - T_Ok(char_type->kind == RDI_TypeKind_Char8); - T_Ok(char_type->flags == 0); - T_Ok(char_type->byte_size == 1); - String8 char_type_name = str8_from_rdi_string_idx(rdi, char_type->built_in.name_string_idx); - T_Ok(str8_match(char_type_name, str8_lit("Char8"), 0)); - } - - dw_writer_end(&writer); } -#endif From 28d037a92428490f55528e058781bd6585d39aff Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 22 Jun 2026 13:31:08 -0700 Subject: [PATCH 837/850] checkpoint on faster rdi_from_dwarf type/namespace deduping --- project.4coder | 2 +- project.raddbg | 9 +- src/base/base_core.h | 4 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 484 ++++++++++++++-------------- src/rdi_from_dwarf/rdi_from_dwarf.h | 1 + 5 files changed, 255 insertions(+), 245 deletions(-) diff --git a/project.4coder b/project.4coder index de54dc3c..850ffd88 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin no_meta telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin no_meta debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index 67496dda..d81b9d31 100644 --- a/project.raddbg +++ b/project.raddbg @@ -25,7 +25,6 @@ target: { executable: "build/torture.exe" working_directory: build - enabled: 1 arguments: "raddbg/*" } target: @@ -50,3 +49,11 @@ target: working_directory: build arguments: "--breakpad fat.so --capture" } +target: +{ + executable: "build/radbin.exe" + working_directory: build + arguments: "--rdi raddbg" + enabled: 1 +} +watch_pin: expression: tag_hash_slots diff --git a/src/base/base_core.h b/src/base/base_core.h index 34410b19..a5b2a964 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -272,8 +272,8 @@ # error Atomic intrinsics not defined for this compiler / architecture combination. # endif #elif COMPILER_CLANG || COMPILER_GCC -#include -#include +# include +# include # define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)__atomic_compare_exchange_n((__int128 *)(x),(__int128 *)(c),*(__int128 *)(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST) # define ins_atomic_u64_eval(x) __atomic_load_n((U64 *)(x), __ATOMIC_SEQ_CST) # define ins_atomic_u64_inc_eval(x) __atomic_add_fetch((U64 *)(x), 1, __ATOMIC_SEQ_CST) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 48691925..1c032a5f 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1074,7 +1074,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) D2R_SubUnitWork *sub_unit_works = 0; ProfScope("produce sub-unit work division") if(lane_idx() == 0) { - U64 root_tags_per_work = 1024; + U64 root_tags_per_work = 4096; for(B32 build = 0; build <= 1; build += 1) { U64 sub_unit_work_idx = 0; @@ -1128,7 +1128,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // // record into (off -> hash) map. // - U64 tag_hash_slots_count = total_tag_count_estimate/8 + 1; + U64 tag_hash_slots_count = total_tag_count_estimate/2 + 1; D2R_TagHashNode **tag_hash_slots = 0; if(lane_idx() == 0) { @@ -1163,6 +1163,15 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) root_tag_idx < unit_root_tag_idx_range.max; root_tag_idx += 1) { + typedef struct D2R_ParentTagNode D2R_ParentTagNode; + struct D2R_ParentTagNode + { + D2R_ParentTagNode *next; + U64 container_ancestor_info_off; + U64 hash_seed; + }; + D2R_ParentTagNode *top_parent = 0; + D2R_ParentTagNode *free_parent = 0; U64 root_tag_start_off = unit_info_root_tag_offs[unit_idx].v[root_tag_idx]; S64 depth = 0; for(U64 off = root_tag_start_off; contains_1u64(unit_info_tag_range, off) && (depth > 0 || off == root_tag_start_off);) @@ -1202,16 +1211,21 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) tag.kind == DW_TagKind_DynamicType || tag.kind == DW_TagKind_AtomicType || tag.kind == DW_TagKind_ImmutableType || + tag.kind == DW_TagKind_Member || + tag.kind == DW_TagKind_FormalParameter || tag.kind == DW_TagKind_Namespace); + // rjf: get top hash seed + U64 hash_seed = top_parent ? top_parent->hash_seed : 0; + // rjf: hash <:= tag kind - U64 hash = 0; + U64 hash = hash_seed; if(need_tag_hash) { hash = u64_hash_from_seed_str8(hash, str8_struct(&tag.kind)); } - // rjf: hash <:= non-reference attributes + // rjf: hash <:= non-reference attributes, if(need_tag_hash) for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) { if(n->v.val.kind != DW_FormKind_RefAddr && @@ -1269,14 +1283,63 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } - // rjf: tree nav + // rjf: push parents if(tag.has_children) { + // rjf: increase depth depth += 1; + + // rjf: determine hash seed - only add new hash seeds for namespaces + U64 n_hash_seed = hash_seed; + if(tag.kind == DW_TagKind_Namespace || + tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_UnionType) + { + n_hash_seed = hash; + } + + // rjf: determine container ancestor info off + U64 container_ancestor_info_off = top_parent ? top_parent->container_ancestor_info_off : 0; + if(tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_ClassType || + tag.kind == DW_TagKind_SubProgram || + tag.kind == DW_TagKind_LexicalBlock || + tag.kind == DW_TagKind_Namespace) + { + container_ancestor_info_off = start_off; + } + + // rjf: push node for this parent + D2R_ParentTagNode *n = free_parent; + if(n != 0) + { + SLLStackPop(free_parent); + } + else + { + n = push_array_no_zero(scratch.arena, D2R_ParentTagNode, 1); + } + MemoryZeroStruct(n); + SLLStackPush(top_parent, n); + n->hash_seed = n_hash_seed; + n->container_ancestor_info_off = container_ancestor_info_off; } + + // rjf: pop parents if(tag.kind == DW_TagKind_Null) { + // rjf: decrease depth depth -= 1; + + // rjf: pop + if(top_parent != 0) + { + D2R_ParentTagNode *popped = top_parent; + SLLStackPop(top_parent); + SLLStackPush(free_parent, popped); + } } scratch_end(tag_scratch); @@ -1292,30 +1355,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) lane_sync(); } - //////////////////////////// - //- rjf: build built-in types - // - RDIM_TypeChunkList *builtin_types = 0; - RDIM_Type **builtin_type_from_kind_map = 0; // [RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1] - U64 builtin_type_count = RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1; - ProfScope("build built-in types") if(lane_idx() == 0) - { - builtin_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); - builtin_type_from_kind_map = push_array(scratch.arena, RDIM_Type *, builtin_type_count); - for(RDI_TypeKind k = RDI_TypeKind_FirstBuiltIn; k <= RDI_TypeKind_LastBuiltIn; k += 1) - { - RDIM_Type *type = rdim_type_chunk_list_push(arena, builtin_types, builtin_type_count); - type->kind = k; - type->name.str = rdi_string_from_type_kind(k, &type->name.size); - type->byte_size = rdi_size_from_basic_type_kind(k); - if(type->byte_size == max_U32) { type->byte_size = byte_size_from_arch(arch); } - builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] = type; - } - } - lane_sync_u64(&builtin_types, 0); - lane_sync_u64(&builtin_type_from_kind_map, 0); -#define d2r_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] : builtin_type_from_kind_map[RDI_TypeKind_Void]) - //////////////////////////// //- rjf: gather all unique, to-be-deduplicated tags across all units (types, namespaces) // @@ -1374,10 +1413,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) struct D2R_TagNode { D2R_TagNode *next; - D2R_UniqueTagKind kind; U64 info_off; - U64 container_ancestor_info_off; - U64 hash_seed; }; U64 tags_to_dedup_count = 0; D2R_TagNode *first_tag_to_dedup = 0; @@ -1477,25 +1513,8 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) tag.kind == DW_TagKind_ImmutableType || tag.kind == DW_TagKind_Namespace)) { - U64 container_ancestor_info_off = 0; - for EachNode(n, D2R_ParentTagNode, top_parent) - { - if(n->tag_kind == DW_TagKind_StructureType || - n->tag_kind == DW_TagKind_UnionType || - n->tag_kind == DW_TagKind_ClassType || - n->tag_kind == DW_TagKind_SubProgram || - n->tag_kind == DW_TagKind_LexicalBlock || - n->tag_kind == DW_TagKind_Namespace) - { - container_ancestor_info_off = n->info_off; - break; - } - } D2R_TagNode *n = push_array(work_scratch.arena, D2R_TagNode, 1); - n->kind = (tag.kind == DW_TagKind_Namespace ? D2R_UniqueTagKind_Namespace : D2R_UniqueTagKind_Type); n->info_off = start_off; - n->container_ancestor_info_off = container_ancestor_info_off; - n->hash_seed = top_parent ? top_parent->hash_seed : 0; SLLQueuePush(first_tag_to_dedup, last_tag_to_dedup, n); tags_to_dedup_count += 1; } @@ -1572,214 +1591,191 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) for(D2R_TagNode *tag_n = first_tag_to_dedup; tag_n != 0; tag_n = tag_n->next) { Temp dedup_root_scratch = scratch_begin(&scratch.arena, 1); - U64 start_off = tag_n->info_off; - D2R_UniqueTagKind unique_tag_kind = tag_n->kind; - U64 container_ancestor_info_off = tag_n->container_ancestor_info_off; - U64 hash_seed = tag_n->hash_seed; - //- rjf: hash all tags & dependency tag trees - U64 hash = hash_seed; - ProfScope("hash tag trees & dependencies") + //- rjf: compute tree hash + U64 start_off = tag_n->info_off; + U64 hash = 0; + D2R_UniqueTagKind unique_tag_kind = D2R_UniqueTagKind_Type; + U64 container_ancestor_info_off = 0; { + typedef struct SeenTask SeenTask; + struct SeenTask + { + SeenTask *next; + U64 off; + U64 tag_hash; + }; typedef struct TagTask TagTask; struct TagTask { TagTask *next; + DW_TagKind root_tag_kind; + U64 container_ancestor_info_off; U64 unit_idx; + U64 start_off; U64 off; - U64 order_idx; + S64 depth; + U64 hash; }; - TagTask start_task = {0, origin_unit_idx, start_off}; + U64 seen_task_slots_count = 16; + SeenTask **seen_task_slots = push_array(dedup_root_scratch.arena, SeenTask *, seen_task_slots_count); + TagTask start_task = {0, DW_TagKind_Null, 0, origin_unit_idx, start_off, start_off, 0}; TagTask *top_task = &start_task; TagTask *free_task = 0; - U64 seen_task_slots_count = 16; - TagTask **seen_task_slots = push_array(dedup_root_scratch.arena, TagTask *, seen_task_slots_count); - for(TagTask *t = top_task, *next = 0; t != 0; t = next) + for(;top_task != 0;) { - next = 0; - U64 t_off = t->off; - U64 off_hash = u64_hash_from_str8(str8_struct(&t->off)); + //- rjf: determine if we're done with this hash + B32 done = (top_task->depth == 0 && top_task->start_off != top_task->off); - // rjf: record this task in our seen task table - { - U64 slot_idx = off_hash%seen_task_slots_count; - SLLStackPush(seen_task_slots[slot_idx], t); - } - - // rjf: find tag hash for this task - U64 tag_hash = 0; - { - U64 slot_idx = off_hash%tag_hash_slots_count; - for(D2R_TagHashNode *n = tag_hash_slots[slot_idx]; n != 0; n = n->next) - { - if(n->info_off == t_off) - { - tag_hash = n->hash; - break; - } - } - } - - // rjf: combine tag hash into tree hash - hash = u64_hash_from_seed_str8(hash, str8_struct(&tag_hash)); - - // rjf: unpack unit - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[t->unit_idx]; - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[t->unit_idx]; - - // rjf: read/hash the full tag tree at `t_off`; kick - // off additional tasks for referenced dependency types - U64 t_hash = 0; - S64 depth = 0; - B32 hash_should_include_children = 1; - for(;unit_info_tag_range.min <= t_off && t_off < unit_info_tag_range.max && (depth > 0 || t_off == t->off);) + //- rjf: if we're not done -> make progress computing the hash ourselves + if(!done) { Temp tag_scratch = scratch_begin(&dedup_root_scratch.arena, 1); - U64 t_start_off = t_off; - // rjf: read tag + // rjf: unpack unit + Rng1U64 unit_info_tag_range = unit_info_tag_ranges[top_task->unit_idx]; + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[top_task->unit_idx]; + + // rjf: read next tag DW2_Tag tag = {0}; - t_off += dw2_read_tag(tag_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, t_off, &tag); - total_tag_count_this_work += 1; + U64 start_off = top_task->off; + top_task->off += dw2_read_tag(tag_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, top_task->off, &tag); - // rjf: determine if tag should be skipped from hashing - B32 should_skip_tag = (tag.kind == DW_TagKind_LexicalBlock || - tag.kind == DW_TagKind_Variable); - - // rjf: determine if we want to consider tag children as part of the content hash - if(t_start_off == t->off && tag.kind == DW_TagKind_Namespace) + // rjf: look up this tag's hash / ancestor + U64 tag_hash = 0; + U64 container_ancestor_info_off = 0; { - hash_should_include_children = 0; - } - - // rjf: if we want to combine this tag into the hash -> combine - if(!should_skip_tag) - { - // rjf: combine tag's kind - t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&tag.kind)); - - // rjf: combine non-reference attributes (references could be different, - // because of deduping, but they could match ultimately). for any - // referenced dependency types, kick them off - for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) + U64 hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 slot_idx = hash%tag_hash_slots_count; + for(D2R_TagHashNode *n = tag_hash_slots[slot_idx]; n != 0; n = n->next) { - // rjf: non-reference? -> combine attribute value info - if(n->v.val.kind != DW_FormKind_RefAddr && - n->v.val.kind != DW_FormKind_Ref1 && - n->v.val.kind != DW_FormKind_Ref2 && - n->v.val.kind != DW_FormKind_Ref4 && - n->v.val.kind != DW_FormKind_Ref8 && - n->v.val.kind != DW_FormKind_RefUData && - n->v.val.kind != DW_FormKind_RefSup4 && - n->v.val.kind != DW_FormKind_RefSig8 && - ((tag.kind != DW_TagKind_SubProgram && - tag.kind != DW_TagKind_FormalParameter) || - (n->v.attrib_kind != DW_AttribKind_Name && - n->v.attrib_kind != DW_AttribKind_DeclFile && - n->v.attrib_kind != DW_AttribKind_DeclLine && - n->v.attrib_kind != DW_AttribKind_Prototyped && - n->v.attrib_kind != DW_AttribKind_External && - n->v.attrib_kind != DW_AttribKind_FrameBase && - n->v.attrib_kind != DW_AttribKind_Location && - n->v.attrib_kind != DW_AttribKind_LowPc && - n->v.attrib_kind != DW_AttribKind_HighPc))) + if(n->info_off == start_off) { - t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&n->v.val.kind)); - if(n->v.val.string.size != 0) - { - t_hash = u64_hash_from_seed_str8(t_hash, n->v.val.string); - } - else if(n->v.val.addr != 0) - { - t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&n->v.val.addr)); - } - else - { - t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&n->v.val.u128)); - } - } - - // rjf: type reference? -> if seen, combine the order; if not, recurse - if(n->v.attrib_kind == DW_AttribKind_Type) - { - // rjf: unpack reference - U64 ref_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &n->v.val); - - // rjf: determine if we've seen this reference - B32 already_seen = 0; - U64 already_seen_order_idx = 0; - { - U64 off_hash = u64_hash_from_str8(str8_struct(&ref_info_off)); - U64 off_slot_idx = off_hash%seen_task_slots_count; - for(TagTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) - { - if(t->off == ref_info_off) - { - already_seen = 1; - already_seen_order_idx = t->order_idx; - break; - } - } - } - - // rjf: if we've seen -> hash the order - if(already_seen) - { - t_hash = u64_hash_from_seed_str8(t_hash, str8_struct(&already_seen_order_idx)); - } - - // rjf: if we've not seen -> descend - if(!already_seen) - { - TagTask *dependency_task = free_task; - if(dependency_task != 0) - { - SLLStackPop(free_task); - } - else - { - dependency_task = push_array(dedup_root_scratch.arena, TagTask, 1); - } - dependency_task->next = next; - next = dependency_task; - dependency_task->off = ref_info_off; - dependency_task->unit_idx = t->unit_idx; - if(!contains_1u64(unit_info_tag_range, dependency_task->off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, dependency_task->off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - dependency_task->unit_idx = new_unit_num-1; - } - } - dependency_task->order_idx = t->order_idx+1; - } + tag_hash = n->hash; + container_ancestor_info_off = n->container_ancestor_info_off; + break; } } } - // rjf: tree nav if we need to - if(hash_should_include_children) + // rjf: remember root tag info + if(start_off == top_task->start_off) { - if(tag.has_children) + top_task->root_tag_kind = tag.kind; + top_task->container_ancestor_info_off = container_ancestor_info_off; + } + + // rjf: remember that we saw this task, for recursive references + if(start_off == top_task->start_off) + { + U64 off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 off_slot_idx = off_hash%seen_task_slots_count; + SeenTask *t = push_array(dedup_root_scratch.arena, SeenTask, 1); + t->off = start_off; + t->tag_hash = tag_hash; + SLLStackPush(seen_task_slots[off_slot_idx], t); + } + + // rjf: combine tag's hash to tree hash + top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&tag_hash)); + + // rjf: tree navigations + if(tag.has_children) + { + top_task->depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + top_task->depth -= 1; + } + + // rjf: unpack type reference in this tag + DW2_Attrib *type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); + U64 type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + + // rjf: if this type reference is recursive, just merge the referenced type's tag hash + B32 type_ref_is_recursive = 0; + if(type_info_off != 0) + { + U64 off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); + U64 off_slot_idx = off_hash%seen_task_slots_count; + for(SeenTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) { - depth += 1; - } - if(tag.kind == DW_TagKind_Null) - { - depth -= 1; - depth = Max(0, depth); + if(t->off == type_info_off) + { + type_ref_is_recursive = 1; + top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&t->tag_hash)); + break; + } } } + + // rjf: if this tag has a non-recursive type reference -> push a new task to hash the type. + if(!type_ref_is_recursive && type_info_off != 0) + { + U64 unit_idx = top_task->unit_idx; + if(!contains_1u64(unit_info_tag_range, type_info_off)) + { + U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, type_info_off); + if(0 < new_unit_num && new_unit_num <= unit_count) + { + unit_idx = new_unit_num-1; + } + } + TagTask *task = free_task; + if(task != 0) + { + SLLStackPop(free_task); + } + else + { + task = push_array_no_zero(dedup_root_scratch.arena, TagTask, 1); + } + MemoryZeroStruct(task); + SLLStackPush(top_task, task); + task->unit_idx = unit_idx; + task->start_off = task->off = type_info_off; + } + scratch_end(tag_scratch); } - // rjf: combine t_hash -> main hash - hash = u64_hash_from_seed_str8(hash, str8_struct(&t_hash)); + //- rjf: if we're done -> pop this task off the stack, merge into parent hash + if(done && top_task != 0) + { + TagTask *popped = top_task; + SLLStackPop(top_task); + SLLStackPush(free_task, popped); + if(top_task != 0) + { + top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&popped->hash)); + } + } + } + hash = start_task.hash; + unique_tag_kind = (start_task.root_tag_kind == DW_TagKind_Namespace ? D2R_UniqueTagKind_Namespace : D2R_UniqueTagKind_Type); + container_ancestor_info_off = start_task.container_ancestor_info_off; + } + + //- rjf: record in the per-unit (offset -> hash) table + { + U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; + D2R_UnitDedupedTagNode *n = push_array(scratch.arena, D2R_UnitDedupedTagNode, 1); + n->src_info_off = start_off; + n->dst_hash = hash; + for(B32 inserted = 0; !inserted;) + { + U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); + n->next = (D2R_UnitDedupedTagNode *)slot_head_val; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) + { + inserted = 1; + } } } - //- rjf: atomically gather this hash if not already gathered + //- rjf: record this in the (hash -> offset) deduplicated table { B32 gathered = 0; U64 slot_idx = hash%unique_tag_slots_count; @@ -1874,25 +1870,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } } - //- rjf: atomically record this (info_off -> hash) mapping, so that when we have - // later references to this type, we can redirect to the deduplicated type with - // the right hash later. - { - U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; - D2R_UnitDedupedTagNode *n = push_array(scratch.arena, D2R_UnitDedupedTagNode, 1); - n->src_info_off = start_off; - n->dst_hash = hash; - for(B32 inserted = 0; !inserted;) - { - U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); - n->next = (D2R_UnitDedupedTagNode *)slot_head_val; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) - { - inserted = 1; - } - } - } scratch_end(dedup_root_scratch); } // ProfMsg("work_idx %I64u: %I64u tags encountered", work_idx, total_tag_count_this_work); @@ -1962,6 +1939,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { for EachNode(n, D2R_UniqueTagNode, unique_tag_slots[slot_idx]) { + raddbg_log("0x%I64x -> 0x%I64x\n", n->info_off, n->hash); deduped_tag_counts[n->kind] += 1; } } @@ -2209,6 +2187,30 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) lane_sync(); } + //////////////////////////// + //- rjf: build built-in types + // + RDIM_TypeChunkList *builtin_types = 0; + RDIM_Type **builtin_type_from_kind_map = 0; // [RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1] + U64 builtin_type_count = RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1; + ProfScope("build built-in types") if(lane_idx() == 0) + { + builtin_types = push_array(scratch.arena, RDIM_TypeChunkList, 1); + builtin_type_from_kind_map = push_array(scratch.arena, RDIM_Type *, builtin_type_count); + for(RDI_TypeKind k = RDI_TypeKind_FirstBuiltIn; k <= RDI_TypeKind_LastBuiltIn; k += 1) + { + RDIM_Type *type = rdim_type_chunk_list_push(arena, builtin_types, builtin_type_count); + type->kind = k; + type->name.str = rdi_string_from_type_kind(k, &type->name.size); + type->byte_size = rdi_size_from_basic_type_kind(k); + if(type->byte_size == max_U32) { type->byte_size = byte_size_from_arch(arch); } + builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] = type; + } + } + lane_sync_u64(&builtin_types, 0); + lane_sync_u64(&builtin_type_from_kind_map, 0); +#define d2r_type_from_builtin_kind(k) ((RDI_TypeKind_FirstBuiltIn <= (k) && (k) <= RDI_TypeKind_LastBuiltIn) ? builtin_type_from_kind_map[k - RDI_TypeKind_FirstBuiltIn] : builtin_type_from_kind_map[RDI_TypeKind_Void]) + //////////////////////////// //- rjf: build all types - build types w/ 1 dependency (leaves) first, then 2, 3, etc., // to ensure dependencies always travel backwards diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index ea7847e7..9885aa1d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -11,6 +11,7 @@ typedef struct D2R_TagHashNode D2R_TagHashNode; struct D2R_TagHashNode { D2R_TagHashNode *next; + U64 container_ancestor_info_off; U64 info_off; U64 hash; }; From e2430fa23e32a116bd7ee262f5716162727a59ee Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 22 Jun 2026 13:43:15 -0700 Subject: [PATCH 838/850] remove redundant incs of xxhash - undef cpuid macro before xxhash is included, so that we don't have conflicting definitions due to memfun --- src/base/base_strings.c | 3 +++ src/dbg_engine/dbg_engine_user.c | 15 +-------------- src/dbg_engine/dbg_engine_user.h | 1 - src/eval/eval_core.c | 8 +------- src/eval_visualization/eval_visualization_core.c | 8 +------- src/font_cache/font_cache.c | 6 ------ 6 files changed, 6 insertions(+), 35 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index c5d5a717..da8a85f6 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -3240,12 +3240,15 @@ str8_buffer_write_string_list(String8Node *buf, U64 *pos, String8List list) //////////////////////////////// //~ rjf: Basic String Hashes +#pragma push_macro("__cpuid") +#undef __cpuid #if !defined(XXH_IMPLEMENTATION) # define XXH_INLINE_ALL # define XXH_IMPLEMENTATION # define XXH_STATIC_LINKING_ONLY # include "third_party/xxHash/xxhash.h" #endif +#pragma pop_macro("__cpuid") internal U64 u64_hash_from_seed_str8(U64 seed, String8 string) diff --git a/src/dbg_engine/dbg_engine_user.c b/src/dbg_engine/dbg_engine_user.c index 0130afc1..bafedc75 100644 --- a/src/dbg_engine/dbg_engine_user.c +++ b/src/dbg_engine/dbg_engine_user.c @@ -7,23 +7,10 @@ //////////////////////////////// //~ rjf: Basic Helpers -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - -internal U64 -d_hash_from_seed_string(U64 seed, String8 string) -{ - U64 result = XXH3_64bits_withSeed(string.str, string.size, seed); - return result; -} - internal U64 d_hash_from_string(String8 string) { - return d_hash_from_seed_string(5381, string); + return u64_hash_from_seed_str8(5381, string); } internal U64 diff --git a/src/dbg_engine/dbg_engine_user.h b/src/dbg_engine/dbg_engine_user.h index af29c05d..2a81e8a8 100644 --- a/src/dbg_engine/dbg_engine_user.h +++ b/src/dbg_engine/dbg_engine_user.h @@ -391,7 +391,6 @@ global D_UserState *d_user_state = 0; //////////////////////////////// //~ rjf: Basic Helpers -internal U64 d_hash_from_seed_string(U64 seed, String8 string); internal U64 d_hash_from_string(String8 string); internal U64 d_hash_from_seed_string__case_insensitive(U64 seed, String8 string); internal U64 d_hash_from_string__case_insensitive(String8 string); diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index 30dea758..c8d19db4 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -9,16 +9,10 @@ //////////////////////////////// //~ rjf: Basic Helpers -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - internal U64 e_hash_from_string(U64 seed, String8 string) { - U64 result = XXH3_64bits_withSeed(string.str, string.size, seed); + U64 result = u64_hash_from_seed_str8(seed, string); return result; } diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 8c5eb508..23cd64e3 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -13,12 +13,6 @@ EV_EXPAND_RULE_INFO_FUNCTION_DEF(nil) //////////////////////////////// //~ rjf: Key Functions -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - internal EV_Key ev_key_make(U64 parent_hash, U64 child_id) { @@ -54,7 +48,7 @@ ev_key_match(EV_Key a, EV_Key b) internal U64 ev_hash_from_seed_string(U64 seed, String8 string) { - U64 result = XXH3_64bits_withSeed(string.str, string.size, seed); + U64 result = u64_hash_from_seed_str8(seed, string); return result; } diff --git a/src/font_cache/font_cache.c b/src/font_cache/font_cache.c index 7b9fba5e..c84cb17b 100644 --- a/src/font_cache/font_cache.c +++ b/src/font_cache/font_cache.c @@ -4,12 +4,6 @@ //////////////////////////////// //~ rjf: Basic Functions -#if !defined(XXH_IMPLEMENTATION) -# define XXH_IMPLEMENTATION -# define XXH_STATIC_LINKING_ONLY -# include "third_party/xxHash/xxhash.h" -#endif - internal U128 fnt_hash_from_string(String8 string) { From c8c8e02ab0ca024fcbb34e98cc7073ba1f5c9a2d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 22 Jun 2026 13:44:18 -0700 Subject: [PATCH 839/850] Revert "use CL driver when compiling with clang on windows to simplify compile and link lines" This reverts commit ba32d7fdec926bd5b976bd4c5e1731aafefebccb. This causes tons of compatibility issues, some of which were preventing Clang builds on specific Clang versions due to command line incompatibility between lld-link and link. --- build.bat | 114 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 66 insertions(+), 48 deletions(-) diff --git a/build.bat b/build.bat index 8dc8dbb1..6cf6abf8 100644 --- a/build.bat +++ b/build.bat @@ -16,7 +16,7 @@ cd /D "%~dp0" :: `build raddbg clang` :: `build raddbg release` :: `build raddbg asan telemetry` -:: `build radbin` +:: `build rdi_from_pdb` :: :: For a full list of possible build targets and their build command lines, :: search for @build_targets in this file. @@ -33,20 +33,20 @@ for %%a in (%*) do set "%%~a=1" if not "%msvc%"=="1" if not "%clang%"=="1" set msvc=1 if not "%release%"=="1" set debug=1 if "%debug%"=="1" set release=0 && echo [debug mode] -if "%release%"=="1" set debug=0 && echo [release mode] -if "%msvc%"=="1" set clang=0 && echo [msvc compile] -if "%clang%"=="1" set msvc=0 && echo [clang compile] -if "%~1"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 && set com_shim=1 && set raddbg_com_shim=1 -if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1 && set com_shim=1 && set raddbg_com_shim=1 +if "%release%"=="1" set debug=0 && echo [release mode] +if "%msvc%"=="1" set clang=0 && echo [msvc compile] +if "%clang%"=="1" set msvc=0 && echo [clang compile] +if "%~1"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1&& set com_shim=1&& set raddbg_com_shim=1 +if "%~1"=="release" if "%~2"=="" echo [default mode, assuming `raddbg` build] && set raddbg=1&& set com_shim=1&& set raddbg_com_shim=1 :: --- Unpack Command Line Build Arguments ------------------------------------ set auto_compile_flags= -if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled] -if "%spall%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_SPALL=1 && echo [spall profiling enabled] -if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled] -if "%ubsan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=undefined && echo [ubsan enabled] +if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled] +if "%spall%"=="1" set auto_compile_flags=%auto_compile_flags% -DPROFILE_SPALL=1 && echo [spall profiling enabled] +if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled] +if "%ubsan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=undefined && echo [ubsan enabled] if "%opengl%"=="1" set auto_compile_flags=%auto_compile_flags% -DR_BACKEND=R_BACKEND_OPENGL && echo [opengl render backend] -if "%dwarf%"=="1" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gdwarf && echo [dwarf debug info] +if "%dwarf%"=="1" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gdwarf && echo [dwarf debug info] if "%dwarf%"=="" if "%clang%"=="1" set auto_compile_flags=%auto_compile_flags% -gcodeview if "%pgo%"=="1" ( where llvm-profdata /q || echo llvm-profdata is not in the PATH || exit /b 1 @@ -68,31 +68,49 @@ if "%pgo%"=="1" ( ) :: --- Compile/Link Line Definitions ------------------------------------------ -set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /Zc:preprocessor -set cl_debug= /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% -set cl_release= /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% -set clang_common= --driver-mode=cl %cl_common% -fuse-ld=lld -D_USE_MATH_DEFINES -Dgnu_printf=printf -Dstrdup=_strdup -msha -mcx16 -fdiagnostics-absolute-paths -Wno-unused-command-line-argument -Wno-initializer-overrides -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-initializer-overrides -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -set clang_debug= %clang_common% %cl_debug% -set clang_release= %clang_common% %cl_release% -set link_common= /link /MANIFEST:EMBED /INCREMENTAL:NO /NOEXP /PDBALTPATH:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" -if "%msvc%"=="1" set link_common=%link_common% /NOCOFFGRPINFO -set link_debug= %link_common% /DYNAMICBASE:NO -set link_release= %link_common% /OPT:REF /OPT:ICF +set cl_common= /I..\src\ /I..\local\ /nologo /FC /Z7 /Zc:preprocessor +set cl_debug= call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% +set cl_release= call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags% +set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% /NATVIS:"%~dp0\src\natvis\base.natvis" /noexp /nocoffgrpinfo /opt:ref /opt:icf +set cl_out= /out: +set cl_obj_out= /Fo: +set cl_linker= +set clang_common= -mcx16 -msha -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 +set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% +set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% +set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:noicf +set clang_out= -o +set clang_obj_out= -o +set clang_linker= -Xlinker :: --- Per-Build Settings ----------------------------------------------------- set link_icon=logo.res +if "%msvc%"=="1" set linker=%cl_linker% +if "%clang%"=="1" set linker=%clang_linker% +if "%msvc%"=="1" set only_compile=/c +if "%clang%"=="1" set only_compile=-c +if "%msvc%"=="1" set EHsc=/EHsc +if "%clang%"=="1" set EHsc= +if "%msvc%"=="1" set no_aslr=/DYNAMICBASE:NO +if "%clang%"=="1" set no_aslr=-Wl,/DYNAMICBASE:NO if "%msvc%"=="1" set rc=call rc if "%clang%"=="1" set rc=call llvm-rc +if "%msvc%"=="1" set link_dll=/link /DLL +if "%clang%"=="1" set link_dll=-Xlinker -DLL :: --- Choose Compile/Link Lines ---------------------------------------------- -if "%msvc%"=="1" set compile_debug=call cl %cl_debug% -if "%msvc%"=="1" set compile_release=call cl %cl_release% -if "%clang%"=="1" set compile_debug=call clang %clang_debug% -if "%clang%"=="1" set compile_release=call clang %clang_release% +if "%msvc%"=="1" set compile_debug=%cl_debug% +if "%msvc%"=="1" set compile_release=%cl_release% +if "%msvc%"=="1" set compile_link=%cl_link% +if "%msvc%"=="1" set out=%cl_out% +if "%msvc%"=="1" set obj_out=%cl_obj_out% +if "%clang%"=="1" set compile_debug=%clang_debug% +if "%clang%"=="1" set compile_release=%clang_release% +if "%clang%"=="1" set compile_link=%clang_link% +if "%clang%"=="1" set out=%clang_out% +if "%clang%"=="1" set obj_out=%clang_obj_out% if "%debug%"=="1" set compile=%compile_debug% -if "%debug%"=="1" set compile_link=%link_debug% if "%release%"=="1" set compile=%compile_release% -if "%release%"=="1" set compile_link=%link_release% :: --- Prep Directories ------------------------------------------------------- if not exist build mkdir build @@ -111,7 +129,7 @@ for /f %%i in ('call git rev-parse HEAD') do set compile=%compile% pushd build if "%meta%"=="1" ( echo [building metagen] - %compile_debug% ..\src\metagen\metagen_main.c %compile_link% /OUT:metagen.exe || exit /b 1 + %compile_debug% ..\src\metagen\metagen_main.c %compile_link% %out%metagen.exe || exit /b 1 ) if "%no_meta%"=="" if exist metagen.exe ( echo [running metagen] @@ -121,30 +139,30 @@ popd :: --- Build Everything (@build_targets) -------------------------------------- pushd build -if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% /OUT:raddbg.exe %link_icon% || exit /b 1 -if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c -DWM_STUB=1 -DR_BACKEND=R_BACKEND_STUB %compile_link% /OUT:raddbg_non_graphical.exe %link_icon% || exit /b 1 -if "%com_shim%"=="1" set didbuild=1 && %compile% ..\src\com_shim\com_shim_main.c %compile_link% /OUT:com_shim.exe || exit /b 1 -if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% /OUT:radlink.exe /NOIMPLIB /NATVIS:"%~dp0\src\linker\linker.natvis" || exit /b 1 -if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% /OUT:radbin.exe || exit /b 1 -if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% /OUT:raddump.exe || exit /b 1 -if "%ryan_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\ryan_scratch.c %compile_link% /OUT:ryan_scratch.exe || exit /b 1 -if "%textperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\textperf.c %compile_link% /OUT:textperf.exe || exit /b 1 -if "%convertperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\convertperf.c %compile_link% /OUT:convertperf.exe || exit /b 1 -if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\debugstringperf.c %compile_link% /OUT:debugstringperf.exe || exit /b 1 -if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% /OUT:parse_inline_sites.exe || exit /b 1 -if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_lib_debug\strip_lib_debug.c %compile_link% /OUT:strip_lib_debug.exe || exit /b 1 -if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% /c ..\src\mule\mule_inline.cpp /Fo:mule_inline.obj && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp /Fo:mule_o2.obj && %compile_debug% /EHsc ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% /DYNAMICBASE:NO /OUT:mule_main.exe || exit /b 1 -if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %compile_link% /OUT:mule_module.dll /DLL || exit /b 1 -if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% /DLL /OUT:mule_hotload_module.dll || exit /b 1 -if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% /OUT:torture.exe || exit /b 1 -if "%dwarf_expr_test%"=="1" set didbuild=1 && %compile% ..\src\torture\dwarf_expr_test.c %compile_link% /OUT:dwarf_expr_test.exe || exit /b 1 -if "%unit_sizes_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\scratch\unit_sizes_from_pdb.c %compile_link% /OUT:unit_sizes_from_pdb.exe || exit /b 1 +if "%raddbg%"=="1" set didbuild=1 && %compile% ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg.exe || exit /b 1 +if "%raddbg_non_graphical%"=="1" set didbuild=1 && %compile% -DWM_STUB=1 -DR_BACKEND=R_BACKEND_STUB ..\src\raddbg\raddbg_main.c %compile_link% %link_icon% %out%raddbg_non_graphical.exe || exit /b 1 +if "%com_shim%"=="1" set didbuild=1 && %compile% ..\src\com_shim\com_shim_main.c %compile_link% %out%com_shim.exe || exit /b 1 +if "%radlink%"=="1" set didbuild=1 && %compile% ..\src\linker\lnk.c %compile_link% %linker% /NOIMPLIB %linker% /NATVIS:"%~dp0\src\linker\linker.natvis" %out%radlink.exe || exit /b 1 +if "%radbin%"=="1" set didbuild=1 && %compile% ..\src\radbin\radbin_main.c %compile_link% %out%radbin.exe || exit /b 1 +if "%raddump%"=="1" set didbuild=1 && %compile% ..\src\raddump\raddump_main.c %compile_link% %out%raddump.exe || exit /b 1 +if "%ryan_scratch%"=="1" set didbuild=1 && %compile% ..\src\scratch\ryan_scratch.c %compile_link% %out%ryan_scratch.exe || exit /b 1 +if "%textperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\textperf.c %compile_link% %out%textperf.exe || exit /b 1 +if "%convertperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\convertperf.c %compile_link% %out%convertperf.exe || exit /b 1 +if "%debugstringperf%"=="1" set didbuild=1 && %compile% ..\src\scratch\debugstringperf.c %compile_link% %out%debugstringperf.exe || exit /b 1 +if "%parse_inline_sites%"=="1" set didbuild=1 && %compile% ..\src\scratch\parse_inline_sites.c %compile_link% %out%parse_inline_sites.exe || exit /b 1 +if "%strip_lib_debug%"=="1" set didbuild=1 && %compile% ..\src\strip_lib_debug\strip_lib_debug.c %compile_link% %out%strip_lib_debug.exe || exit /b 1 +if "%mule_main%"=="1" set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\src\mule\mule_inline.cpp %obj_out%mule_inline.obj && %compile_release% %only_compile% ..\src\mule\mule_o2.cpp %obj_out%mule_o2.obj && %compile_debug% %EHsc% ..\src\mule\mule_main.cpp ..\src\mule\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1 +if "%mule_module%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_module.cpp %link_dll% %out%mule_module.dll || exit /b 1 +if "%mule_hotload%"=="1" set didbuild=1 && %compile% ..\src\mule\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\src\mule\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1 +if "%torture%"=="1" set didbuild=1 && %compile% ..\src\torture\torture_main.c %compile_link% %out%torture.exe || exit /b1 +if "%dwarf_expr_test%"=="1" set didbuild=1 && %compile% ..\src\torture\dwarf_expr_test.c %compile_link% %out%dwarf_expr_test.exe || exit /b1 +if "%unit_sizes_from_pdb%"=="1" set didbuild=1 && %compile% ..\src\scratch\unit_sizes_from_pdb.c %compile_link% %out%unit_sizes_from_pdb.exe || exit /b1 if "%mule_peb_trample%"=="1" ( set didbuild=1 if exist mule_peb_trample.exe move mule_peb_trample.exe mule_peb_trample_old_%random%.exe if exist mule_peb_trample_new.pdb move mule_peb_trample_new.pdb mule_peb_trample_old_%random%.pdb if exist mule_peb_trample_new.rdi move mule_peb_trample_new.rdi mule_peb_trample_old_%random%.rdi - %compile% ..\src\mule\mule_peb_trample.c %compile_link% /OUT:mule_peb_trample_new.exe || exit /b 1 + %compile% ..\src\mule\mule_peb_trample.c %compile_link% %out%mule_peb_trample_new.exe || exit /b 1 move mule_peb_trample_new.exe mule_peb_trample.exe ) popd @@ -156,7 +174,7 @@ popd :: --- Warn On No Builds ------------------------------------------------------ if "%didbuild%"=="" ( - echo [WARNING] no valid build target specified; must use build target names as arguments to this script, like `build raddbg` or `build radbin`. + echo [WARNING] no valid build target specified; must use build target names as arguments to this script, like `build raddbg` or `build rdi_from_pdb`. exit /b 1 ) From 76fa2be5a9be4358b865562a90de1eb93bfdf4e9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 22 Jun 2026 13:45:53 -0700 Subject: [PATCH 840/850] correct arch flags to clang --- build.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.bat b/build.bat index 6cf6abf8..345f4c46 100644 --- a/build.bat +++ b/build.bat @@ -75,7 +75,7 @@ set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%% set cl_out= /out: set cl_obj_out= /Fo: set cl_linker= -set clang_common= -mcx16 -msha -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 +set clang_common= -mcx16 -msha -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -msse2 -mavx512f -mavx512bw -mavx512dq -mavx512vbmi -mbmi2 set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:noicf From 401383bbd8bf6ea2265613f5afeb01fe8df3f06d Mon Sep 17 00:00:00 2001 From: Martins Mozeiko Date: Mon, 22 Jun 2026 14:08:24 -0700 Subject: [PATCH 841/850] reorganize intrinsic includes to make clang happy --- build.bat | 2 +- src/base/base_context_cracking.h | 44 ++++ src/linker/base_ext/base_blake3.h | 25 --- src/linker/lnk.c | 10 +- src/third_party/blake3/c/blake3_dispatch.c | 4 +- src/third_party/martins_memfun/memfun.h | 230 ++++++++++----------- 6 files changed, 160 insertions(+), 155 deletions(-) diff --git a/build.bat b/build.bat index 345f4c46..f636ea9c 100644 --- a/build.bat +++ b/build.bat @@ -75,7 +75,7 @@ set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%% set cl_out= /out: set cl_obj_out= /Fo: set cl_linker= -set clang_common= -mcx16 -msha -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -msse2 -mavx512f -mavx512bw -mavx512dq -mavx512vbmi -mbmi2 +set clang_common= -mcx16 -I..\src\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 set clang_debug= call clang -g -O0 -DBUILD_DEBUG=1 -D_DEBUG %clang_common% %auto_compile_flags% set clang_release= call clang -g -O2 -DBUILD_DEBUG=0 -DNDEBUG %clang_common% %auto_compile_flags% set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:"%~dp0\src\natvis\base.natvis" -Xlinker /opt:ref -Xlinker /opt:noicf diff --git a/src/base/base_context_cracking.h b/src/base/base_context_cracking.h index ac27c9de..76011874 100644 --- a/src/base/base_context_cracking.h +++ b/src/base/base_context_cracking.h @@ -248,4 +248,48 @@ # error You tried to build with an unsupported architecture. Currently, only building in x64 mode is supported. #endif +//////////////////////////////// +// extra intrinisc includes, so older clang versions are happy +// when optiona intrinsics like avx2 & avx512 are used later +// these must come first before any other intrinsic includes +// otherwise compiler will define macros that prevent declarations +// of intrinsics when included next time + +#if ARCH_X64 && COMPILER_CLANG +# if defined(__IMMINTRIN_H) +# error "include this header before immintrin.h / x86intrin.h / intrin.h" +# endif +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wreserved-macro-identifier" +# pragma push_macro("__SHA__") +# pragma push_macro("__AVX__") +# pragma push_macro("__AVX2__") +# pragma push_macro("__BMI2__") +# pragma push_macro("__SSE4_1__") +# pragma push_macro("__AVX512F__") +# pragma push_macro("__AVX512VL__") +# pragma push_macro("__AVX512BW__") +# pragma push_macro("__AVX512VBMI__") +# define __SHA__ 1 +# define __AVX__ 1 +# define __AVX2__ 1 +# define __BMI2__ 1 +# define __SSE4_1__ 1 +# define __AVX512F__ 1 +# define __AVX512VL__ 1 +# define __AVX512BW__ 1 +# define __AVX512VBMI__ 1 +# include +# pragma pop_macro("__AVX512VBMI__") +# pragma pop_macro("__AVX512BW__") +# pragma pop_macro("__AVX512VL__") +# pragma pop_macro("__AVX512F__") +# pragma pop_macro("__SSE4_1__") +# pragma pop_macro("__BMI2__") +# pragma pop_macro("__AVX2__") +# pragma pop_macro("__AVX__") +# pragma pop_macro("__SHA__") +# pragma clang diagnostic pop +#endif + #endif // BASE_CONTEXT_CRACKING_H diff --git a/src/linker/base_ext/base_blake3.h b/src/linker/base_ext/base_blake3.h index 4c426ea2..e80c1e35 100644 --- a/src/linker/base_ext/base_blake3.h +++ b/src/linker/base_ext/base_blake3.h @@ -6,31 +6,6 @@ #define BLAKE3_API static #define BLAKE3_PRIVATE static -#if defined(__clang__) && defined(__x86_64__) -# if defined(__IMMINTRIN_H) -# error "include this header before immintrin.h / x86intrin.h / intrin.h" -# endif -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wreserved-macro-identifier" -# pragma push_macro("__AVX__") -# pragma push_macro("__AVX2__") -# pragma push_macro("__SSE4_1__") -# pragma push_macro("__AVX512F__") -# pragma push_macro("__AVX512VL__") -# define __AVX__ 1 -# define __AVX2__ 1 -# define __SSE4_1__ 1 -# define __AVX512F__ 1 -# define __AVX512VL__ 1 -# include -# pragma pop_macro("__AVX512VL__") -# pragma pop_macro("__AVX512F__") -# pragma pop_macro("__SSE4_1__") -# pragma pop_macro("__AVX2__") -# pragma pop_macro("__AVX__") -# pragma clang diagnostic pop -#endif - #include "third_party/blake3/c/blake3.h" static void diff --git a/src/linker/lnk.c b/src/linker/lnk.c index a10d291f..e82c62ff 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -9,11 +9,6 @@ #define ARENA_FREE_LIST 1 #define NO_ASYNC 1 -// --- Third Party ------------------------------------------------------------- - -#include "base_ext/base_blake3.h" -#include "base_ext/base_blake3.c" - // --- Code Base --------------------------------------------------------------- #include "base/base_inc.h" @@ -58,6 +53,11 @@ #include "llvm/llvm.c" #include "dwarf/x64/dwarf_x64.c" +// --- Third Party ------------------------------------------------------------- + +#include "base_ext/base_blake3.h" +#include "base_ext/base_blake3.c" + // --- Code Base Extensions ---------------------------------------------------- #include "base_ext/base_inc.h" diff --git a/src/third_party/blake3/c/blake3_dispatch.c b/src/third_party/blake3/c/blake3_dispatch.c index 0082f974..88f6bc88 100644 --- a/src/third_party/blake3/c/blake3_dispatch.c +++ b/src/third_party/blake3/c/blake3_dispatch.c @@ -55,7 +55,7 @@ static uint64_t xgetbv(void) { } static void cpuid(uint32_t out[4], uint32_t id) { -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) __cpuid((int *)out, id); #elif defined(__i386__) || defined(_M_IX86) __asm__ __volatile__("movl %%ebx, %1\n" @@ -71,7 +71,7 @@ static void cpuid(uint32_t out[4], uint32_t id) { } static void cpuidex(uint32_t out[4], uint32_t id, uint32_t sid) { -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) __cpuidex((int *)out, id, sid); #elif defined(__i386__) || defined(_M_IX86) __asm__ __volatile__("movl %%ebx, %1\n" diff --git a/src/third_party/martins_memfun/memfun.h b/src/third_party/martins_memfun/memfun.h index 7e8168cf..b8ee0eb3 100644 --- a/src/third_party/martins_memfun/memfun.h +++ b/src/third_party/martins_memfun/memfun.h @@ -4,23 +4,23 @@ #include #include -#if !defined(MEM_NO_ASAN) +#if !defined(MEM_DISABLE_ASAN) # if defined(__SANITIZE_ADDRESS__) # if defined(_MSC_VER) && !defined(__clang__) -# define MEM_NO_ASAN __declspec(no_sanitize_address) +# define MEM_DISABLE_ASAN __declspec(no_sanitize_address) # else -# define MEM_NO_ASAN __attribute__((no_sanitize("address"))) +# define MEM_DISABLE_ASAN __attribute__((no_sanitize("address"))) # endif # else -# define MEM_NO_ASAN +# define MEM_DISABLE_ASAN # endif #endif #if !defined(MEM_API) # if defined(MEM_STATIC) -# define MEM_API static inline MEM_NO_ASAN +# define MEM_API static inline MEM_DISABLE_ASAN # else -# define MEM_API extern MEM_NO_ASAN +# define MEM_API extern MEM_DISABLE_ASAN # endif #endif @@ -257,7 +257,7 @@ static inline __m512i MemToLower64(__m512i x) #endif } -MEM_NO_ASAN +MEM_DISABLE_ASAN int MemCompare_sse2(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -435,7 +435,7 @@ int MemCompare_sse2(const void* ptr1, const void* ptr2, size_t size) return 0; } -MEM_NO_ASAN +MEM_DISABLE_ASAN int MemCompareI_sse2(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -472,51 +472,51 @@ int MemCompareI_sse2(const void* ptr1, const void* ptr2, size_t size) return MemToLower1(p1[0]) - MemToLower1(p2[0]); } + size_t n; + __m128i a0, b0, a1, b1; + if (size < 4) // 2 <= size < 4 { - uint64_t a0 = MEM_PTR16U(p1); - uint64_t b0 = MEM_PTR16U(p2); - uint64_t a1 = MEM_PTR16U(p1 + size - 2); - uint64_t b1 = MEM_PTR16U(p2 + size - 2); - uint64_t tmp = MEM_BSWAP64(MemToLower8(a0 | (a1 << 16) | (b0 << 32) | (b1 << 48))); - uint32_t a = (uint32_t)(tmp >> 32); - uint32_t b = (uint32_t)tmp; - return (a > b) - (a < b); + a0 = _mm_loadu_si16((const __m128i*)p1); + b0 = _mm_loadu_si16((const __m128i*)p2); + a1 = _mm_loadu_si16((const __m128i*)(p1 + size - 2)); + b1 = _mm_loadu_si16((const __m128i*)(p2 + size - 2)); + n = 2; } else if (size < 8) // 4 <= size < 8 { - uint64_t a0 = MEM_PTR32U(p1); - uint64_t b0 = MEM_PTR32U(p2); - uint64_t a1 = MEM_PTR32U(p1 + size - 4); - uint64_t b1 = MEM_PTR32U(p2 + size - 4); - uint64_t a = MEM_BSWAP64(MemToLower8(a0 | (a1 << 32))); - uint64_t b = MEM_BSWAP64(MemToLower8(b0 | (b1 << 32))); - return (a > b) - (a < b); + a0 = _mm_loadu_si32((const __m128i*)p1); + b0 = _mm_loadu_si32((const __m128i*)p2); + a1 = _mm_loadu_si32((const __m128i*)(p1 + size - 4)); + b1 = _mm_loadu_si32((const __m128i*)(p2 + size - 4)); + n = 4; } else // 8 <= size <= 16 { - __m128i a0 = _mm_loadl_epi64((const __m128i*)p1); - __m128i b0 = _mm_loadl_epi64((const __m128i*)p2); - __m128i a1 = _mm_loadl_epi64((const __m128i*)(p1 + size - 8)); - __m128i b1 = _mm_loadl_epi64((const __m128i*)(p2 + size - 8)); - __m128i a = MemToLower16(_mm_unpacklo_epi64(a0, a1)); - __m128i b = MemToLower16(_mm_unpacklo_epi64(b0, b1)); - __m128i r = _mm_cmpeq_epi8(a, b); - - uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r); - if (mask) - { - size_t index = MEM_CTZ32(mask); - - // index = (index < 8) ? index : (index - 8) + (size - 8); - size -= 16; - index += index < 8 ? 0 : size; - - return MemToLower1(p1[index]) - MemToLower1(p2[index]); - } - - return 0; + a0 = _mm_loadu_si64((const __m128i*)p1); + b0 = _mm_loadu_si64((const __m128i*)p2); + a1 = _mm_loadu_si64((const __m128i*)(p1 + size - 8)); + b1 = _mm_loadu_si64((const __m128i*)(p2 + size - 8)); + n = 8; } + + __m128i a = _mm_unpacklo_epi64(a0, a1); + __m128i b = _mm_unpacklo_epi64(b0, b1); + __m128i r = _mm_cmpeq_epi8(MemToLower16(a), MemToLower16(b)); + + uint16_t mask = (1 + (uint16_t)_mm_movemask_epi8(r)); + if (mask) + { + size_t index = MEM_CTZ32(mask); + + // index = (index < 8) ? index : (index - 8) + (size - n); + size -= 8 + n; + index += index < 8 ? 0 : size; + + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + return 0; } while (size >= 64) @@ -633,7 +633,7 @@ int MemCompareI_sse2(const void* ptr1, const void* ptr2, size_t size) return 0; } -MEM_NO_ASAN +MEM_DISABLE_ASAN bool MemIsEqual_sse2(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -771,7 +771,7 @@ bool MemIsEqual_sse2(const void* ptr1, const void* ptr2, size_t size) return true; } -MEM_NO_ASAN +MEM_DISABLE_ASAN size_t MemFind_sse2(const void* ptr, size_t size, uint8_t value) { const uint8_t* p = (const uint8_t*)ptr; @@ -815,7 +815,7 @@ size_t MemFind_sse2(const void* ptr, size_t size, uint8_t value) uint64_t m2 = (uint16_t)_mm_movemask_epi8(r2); uint64_t m3 = mask; // if r0=r1=r2=0, then r3=r - uint64_t m4 = (m3 << 48) | (m2 << 32) | (m1 << 16) | m0; + uint64_t m4 = m0 | (m1 << 16) | (m2 << 32) | (m3 << 48); size_t index = MEM_CTZ64(m4); return offset + index; } @@ -887,7 +887,7 @@ size_t MemFind_sse2(const void* ptr, size_t size, uint8_t value) return offset; } -MEM_NO_ASAN +MEM_DISABLE_ASAN MEM_TARGET_AVX2 int MemCompare_avx2(const void* ptr1, const void* ptr2, size_t size) { @@ -932,7 +932,7 @@ int MemCompare_avx2(const void* ptr1, const void* ptr2, size_t size) uint32_t b1 = MEM_GET16BE(p2 + size - 2); uint32_t a = (a0 != b0 ? a0 : a1); uint32_t b = (a0 != b0 ? b0 : b1); - return a - b; + return (int)a - (int)b; } else if (size < 8) // 4 <= size < 8 { @@ -999,7 +999,7 @@ int MemCompare_avx2(const void* ptr1, const void* ptr2, size_t size) uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r); if (mask) { - uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); + mask = 1 + (uint32_t)_mm256_movemask_epi8(r0); if (mask) { size_t index = 0x00 + _tzcnt_u32(mask); @@ -1094,7 +1094,7 @@ int MemCompare_avx2(const void* ptr1, const void* ptr2, size_t size) return 0; } -MEM_NO_ASAN +MEM_DISABLE_ASAN MEM_TARGET_AVX2 int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) { @@ -1131,74 +1131,60 @@ int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) { return MemToLower1(p1[0]) - MemToLower1(p2[0]); } - else if (size < 4) // 2 <= size < 4 + + size_t n; + __m128i a0, b0, a1, b1; + + if (size < 4) // 2 <= size < 4 { - uint64_t a0 = MEM_GET16BE(p1); - uint64_t b0 = MEM_GET16BE(p2); - uint64_t a1 = MEM_GET16BE(p1 + size - 2); - uint64_t b1 = MEM_GET16BE(p2 + size - 2); - uint64_t tmp = MemToLower8(a0 | (a1 << 16) | (b0 << 32) | (b1 << 48)); - uint64_t a = (uint32_t)tmp; - uint64_t b = (uint32_t)(tmp >> 32); - return (a > b) - (a < b); + a0 = _mm_loadu_si16((const __m128i*)p1); + b0 = _mm_loadu_si16((const __m128i*)p2); + a1 = _mm_loadu_si16((const __m128i*)(p1 + size - 2)); + b1 = _mm_loadu_si16((const __m128i*)(p2 + size - 2)); + n = 2; } else if (size < 8) // 4 <= size < 8 { - uint64_t a0 = MEM_GET32BE(p1); - uint64_t b0 = MEM_GET32BE(p2); - uint64_t a1 = MEM_GET32BE(p1 + size - 4); - uint64_t b1 = MEM_GET32BE(p2 + size - 4); - uint64_t a = MemToLower8(a0 | (a1 << 32)); - uint64_t b = MemToLower8(b0 | (b1 << 32)); - return (a > b) - (a < b); + a0 = _mm_loadu_si32((const __m128i*)p1); + b0 = _mm_loadu_si32((const __m128i*)p2); + a1 = _mm_loadu_si32((const __m128i*)(p1 + size - 4)); + b1 = _mm_loadu_si32((const __m128i*)(p2 + size - 4)); + n = 4; } - else if (size <= 16) // 8 <= size <= 16 + else if (size < 16) // 8 <= size < 16 { - __m128i a0 = _mm_loadl_epi64((const __m128i*)p1); - __m128i b0 = _mm_loadl_epi64((const __m128i*)p2); - __m128i a1 = _mm_loadl_epi64((const __m128i*)(p1 + size - 8)); - __m128i b1 = _mm_loadl_epi64((const __m128i*)(p2 + size - 8)); - __m128i a = MemToLower16(_mm_unpacklo_epi64(a0, a1)); - __m128i b = MemToLower16(_mm_unpacklo_epi64(b0, b1)); - __m128i r = _mm_cmpeq_epi8(a, b); - - uint16_t mask = 1 + (uint16_t)_mm_movemask_epi8(r); - if (mask) - { - size_t index = MEM_CTZ32(mask); - - // index = (index < 8) ? index : (index - 8) + (size - 8); - size -= 16; - index += index < 8 ? 0 : size; - - return MemToLower1(p1[index]) - MemToLower1(p2[index]); - } - - return 0; + a0 = _mm_loadu_si64((const __m128i*)p1); + b0 = _mm_loadu_si64((const __m128i*)p2); + a1 = _mm_loadu_si64((const __m128i*)(p1 + size - 8)); + b1 = _mm_loadu_si64((const __m128i*)(p2 + size - 8)); + n = 8; } - else // 16 < size <= 32 + else // 16 <= size <= 32 { - __m128i a0 = _mm_loadu_si128((const __m128i*)p1); - __m128i b0 = _mm_loadu_si128((const __m128i*)p2); - __m128i a1 = _mm_loadu_si128((const __m128i*)(p1 + size - 16)); - __m128i b1 = _mm_loadu_si128((const __m128i*)(p2 + size - 16)); - __m256i a = MemToLower32(_mm256_inserti128_si256(_mm256_castsi128_si256(a0), a1, 1)); - __m256i b = MemToLower32(_mm256_inserti128_si256(_mm256_castsi128_si256(b0), b1, 1)); - __m256i r = _mm256_cmpeq_epi8(a, b); - - uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r); - if (mask) - { - size_t index = _tzcnt_u64(mask); - - // index = (index < 16) ? index : (index - 16) + (size - 16); - size -= 32; - index += index < 16 ? 0 : size; - - return MemToLower1(p1[index]) - MemToLower1(p2[index]); - } - return 0; + a0 = _mm_loadu_si128((const __m128i*)p1); + b0 = _mm_loadu_si128((const __m128i*)p2); + a1 = _mm_loadu_si128((const __m128i*)(p1 + size - 16)); + b1 = _mm_loadu_si128((const __m128i*)(p2 + size - 16)); + n = 16; } + + __m256i a = _mm256_inserti128_si256(_mm256_castsi128_si256(a0), a1, 1); + __m256i b = _mm256_inserti128_si256(_mm256_castsi128_si256(b0), b1, 1); + __m256i r = _mm256_cmpeq_epi8(MemToLower32(a), MemToLower32(b)); + + uint32_t mask = 1 + (uint32_t)_mm256_movemask_epi8(r); + if (mask) + { + size_t index = _tzcnt_u64(mask); + + // index = (index < 16) ? index : (index - 16) + (size - n); + size -= 16 + n; + index += index < 16 ? 0 : size; + + return MemToLower1(p1[index]) - MemToLower1(p2[index]); + } + + return 0; } while (size >= 128) @@ -1315,7 +1301,7 @@ int MemCompareI_avx2(const void* ptr1, const void* ptr2, size_t size) return 0; } -MEM_NO_ASAN +MEM_DISABLE_ASAN MEM_TARGET_AVX2 bool MemIsEqual_avx2(const void* ptr1, const void* ptr2, size_t size) { @@ -1460,7 +1446,7 @@ bool MemIsEqual_avx2(const void* ptr1, const void* ptr2, size_t size) return true; } -MEM_NO_ASAN +MEM_DISABLE_ASAN MEM_TARGET_AVX2 size_t MemFind_avx2(const void* ptr, size_t size, uint8_t value) { @@ -1480,7 +1466,7 @@ size_t MemFind_avx2(const void* ptr, size_t size, uint8_t value) __m256i a0 = _mm256_loadu_si256((const __m256i*)(p - extra)); __m256i r0 = _mm256_cmpeq_epi8(value32, a0); - uint32_t mask = _mm256_movemask_epi8(r0); + uint32_t mask = (uint32_t)_mm256_movemask_epi8(r0); mask = _bzhi_u32(MEM_SHRX_32(mask, (uint32_t)extra), (uint32_t)size); return mask ? _tzcnt_u32(mask) : size; @@ -1507,8 +1493,8 @@ size_t MemFind_avx2(const void* ptr, size_t size, uint8_t value) uint64_t m2 = (uint32_t)_mm256_movemask_epi8(r2); uint64_t m3 = mask; // if r0=r1=r2=0, then r3=r - uint64_t m01 = (m1 << 32) | m0; - uint64_t m23 = (m3 << 32) | m2; + uint64_t m01 = m0 | (m1 << 32); + uint64_t m23 = m2 | (m3 << 32); size_t idx0 = _tzcnt_u64(m01); size_t idx1 = _tzcnt_u64(m23); @@ -1877,7 +1863,7 @@ static inline uint8x16_t MemToLower16(uint8x16_t x) return vaddq_u8(x, tmp); } -MEM_NO_ASAN +MEM_DISABLE_ASAN int MemCompare_arm64(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -2033,7 +2019,7 @@ done:; return (a > b) - (a < b); } -MEM_NO_ASAN +MEM_DISABLE_ASAN int MemCompareI_arm64(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -2212,7 +2198,7 @@ done:; return (a > b) - (a < b); } -MEM_NO_ASAN +MEM_DISABLE_ASAN bool MemIsEqual_arm64(const void* ptr1, const void* ptr2, size_t size) { const uint8_t* p1 = (const uint8_t*)ptr1; @@ -2335,7 +2321,7 @@ bool MemIsEqual_arm64(const void* ptr1, const void* ptr2, size_t size) return true; } -MEM_NO_ASAN +MEM_DISABLE_ASAN size_t MemFind_arm64(const void* ptr, size_t size, uint8_t value) { const uint8_t* p = (const uint8_t*)ptr; @@ -2510,8 +2496,8 @@ int MemCompareI_rvv(const void* ptr1, const void* ptr2, size_t size) long index = __riscv_vfirst_m_b1(m, vl); if (index >= 0) { - a = __riscv_vslidedown_vx_u8m8(a, index, vl); - b = __riscv_vslidedown_vx_u8m8(b, index, vl); + a = __riscv_vslidedown_vx_u8m8(a, (unsigned long)index, vl); + b = __riscv_vslidedown_vx_u8m8(b, (unsigned long)index, vl); return __riscv_vmv_x_s_u8m8_u8(a) - __riscv_vmv_x_s_u8m8_u8(b); } @@ -2566,7 +2552,7 @@ size_t MemFind_rvv(const void* ptr, size_t size, uint8_t value) long index = __riscv_vfirst_m_b1(m, vl); if (index >= 0) { - return offset + index; + return offset + (unsigned long)index; } offset += vl; From fef78609d83332fa12dc8889f9a2ae53fb3e927e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 22 Jun 2026 14:24:05 -0700 Subject: [PATCH 842/850] turn off d2r tests for now while new deduper is in progress; better tag skipping in dedup hashing --- src/rdi_from_dwarf/rdi_from_dwarf.c | 64 ++++++++++++++++--- .../tests/rdi_from_dwarf_tests.c | 4 +- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 1c032a5f..bf124c8d 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1592,6 +1592,14 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { Temp dedup_root_scratch = scratch_begin(&scratch.arena, 1); + { + DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[origin_unit_idx]; + DW2_Tag tag = {0}; + dw2_read_tag(dedup_root_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, tag_n->info_off, &tag); + String8 name = dw2_attrib_from_kind(&tag, DW_AttribKind_Name)->val.string; + ProfBegin("%.*s (%.*s)", str8_varg(name), str8_varg(dw_string_from_tag_kind(unit_parse_ctx->version, unit_parse_ctx->exts, tag.kind))); + } + //- rjf: compute tree hash U64 start_off = tag_n->info_off; U64 hash = 0; @@ -1620,6 +1628,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U64 seen_task_slots_count = 16; SeenTask **seen_task_slots = push_array(dedup_root_scratch.arena, SeenTask *, seen_task_slots_count); TagTask start_task = {0, DW_TagKind_Null, 0, origin_unit_idx, start_off, start_off, 0}; + ProfBegin("task"); TagTask *top_task = &start_task; TagTask *free_task = 0; for(;top_task != 0;) @@ -1627,7 +1636,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) //- rjf: determine if we're done with this hash B32 done = (top_task->depth == 0 && top_task->start_off != top_task->off); - //- rjf: if we're not done -> make progress computing the hash ourselves + //- rjf: if we're not done -> continue contributing to the task's hash if(!done) { Temp tag_scratch = scratch_begin(&dedup_root_scratch.arena, 1); @@ -1641,9 +1650,26 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U64 start_off = top_task->off; top_task->off += dw2_read_tag(tag_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, top_task->off, &tag); + // rjf: determine whether or not to include this tag + B32 include_tag_in_hash = 1; + if(top_task->depth > 0) + { + if(top_task->root_tag_kind == DW_TagKind_SubProgram) + { + include_tag_in_hash = (tag.kind == DW_TagKind_FormalParameter); + } + else if(top_task->root_tag_kind == DW_TagKind_StructureType || + top_task->root_tag_kind == DW_TagKind_ClassType || + top_task->root_tag_kind == DW_TagKind_UnionType) + { + include_tag_in_hash = (tag.kind == DW_TagKind_Member); + } + } + // rjf: look up this tag's hash / ancestor U64 tag_hash = 0; U64 container_ancestor_info_off = 0; + if(include_tag_in_hash) { U64 hash = u64_hash_from_str8(str8_struct(&start_off)); U64 slot_idx = hash%tag_hash_slots_count; @@ -1677,21 +1703,35 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } // rjf: combine tag's hash to tree hash - top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&tag_hash)); + if(include_tag_in_hash) + { + top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&tag_hash)); + } + + // rjf: determine if we want to descend to children + B32 descend = (tag.kind != DW_TagKind_Namespace); // rjf: tree navigations - if(tag.has_children) + if(descend) { - top_task->depth += 1; - } - if(tag.kind == DW_TagKind_Null) - { - top_task->depth -= 1; + if(tag.has_children) + { + top_task->depth += 1; + } + if(tag.kind == DW_TagKind_Null) + { + top_task->depth -= 1; + } } // rjf: unpack type reference in this tag - DW2_Attrib *type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); - U64 type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + DW2_Attrib *type_attrib = &dw2_attrib_nil; + U64 type_info_off = 0; + if(include_tag_in_hash) + { + type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); + type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); + } // rjf: if this type reference is recursive, just merge the referenced type's tag hash B32 type_ref_is_recursive = 0; @@ -1735,6 +1775,8 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) SLLStackPush(top_task, task); task->unit_idx = unit_idx; task->start_off = task->off = type_info_off; + String8 name = dw2_attrib_from_kind(&tag, DW_AttribKind_Name)->val.string; + ProfBegin("%.*s (%.*s)", str8_varg(name), str8_varg(dw_string_from_tag_kind(unit_parse_ctx->version, unit_parse_ctx->exts, tag.kind))); } scratch_end(tag_scratch); @@ -1750,6 +1792,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&popped->hash)); } + ProfEnd(); } } hash = start_task.hash; @@ -1871,6 +1914,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } scratch_end(dedup_root_scratch); + ProfEnd(); } // ProfMsg("work_idx %I64u: %I64u tags encountered", work_idx, total_tag_count_this_work); ProfEnd(); diff --git a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c index 0c5802df..f9a069cd 100644 --- a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c +++ b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c @@ -1,7 +1,7 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) -Test(d2r_regressions) +SkippedTest(d2r_regressions) { String8 radbin_path = test_build_exe_path(arena, s("radbin")); String8 bin_paths[] = @@ -64,7 +64,7 @@ Test(d2r_regressions) } } -Test(d2r_determinism) +SkippedTest(d2r_determinism) { U64 num_repeats_per_bin = 16; String8 radbin_path = test_build_exe_path(arena, s("radbin")); From a425936f56c561a454622bdbba68b5a96383b0bb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 22 Jun 2026 14:42:50 -0700 Subject: [PATCH 843/850] run_tests test data download -> fail if curl fails, follow http redirects --- run_tests.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/run_tests.bat b/run_tests.bat index 55d13f51..4d8fd1ed 100644 --- a/run_tests.bat +++ b/run_tests.bat @@ -17,7 +17,7 @@ popd :: Check if we need new test data version pushd local set need_test_data=0 -curl -s -o test_data_version_latest.txt https://data.raddbg.com/public/raddbg_test_data_version.txt +curl -sfL -o test_data_version_latest.txt https://data.raddbg.com/public/raddbg_test_data_version.txt || exit /b 1 if exist "test_data_version_current.txt" ( fc /b "test_data_version_latest.txt" "test_data_version_current.txt" > nul ) else ( @@ -35,8 +35,8 @@ if "%need_test_data%"=="1" ( echo Downloading test data... pushd local pushd test_data - curl -s -o test_data.zip https://data.raddbg.com/public/raddbg_test_data.zip - tar -xf test_data.zip + curl -sfL -o test_data.zip https://data.raddbg.com/public/raddbg_test_data.zip || exit /b 1 + tar -xf test_data.zip || exit /b 1 del test_data.zip popd copy /y test_data_version_latest.txt test_data_version_current.txt From 28009ec01e1fb6e777d52dc924858806379433b9 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 23 Jun 2026 10:05:28 -0700 Subject: [PATCH 844/850] rdi_from_dwarf type dedup hashing experiments checkpoint --- src/rdi_from_dwarf/rdi_from_dwarf.c | 53 ++++++++----------- .../tests/rdi_from_dwarf_tests.c | 2 +- 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index bf124c8d..81164c33 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1074,13 +1074,13 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) D2R_SubUnitWork *sub_unit_works = 0; ProfScope("produce sub-unit work division") if(lane_idx() == 0) { - U64 root_tags_per_work = 4096; for(B32 build = 0; build <= 1; build += 1) { U64 sub_unit_work_idx = 0; for EachIndex(unit_idx, unit_count) { U64 root_tags_in_this_unit = unit_info_root_tag_offs[unit_idx].count; + U64 root_tags_per_work = (root_tags_in_this_unit + lane_count()-1) / lane_count(); U64 works_per_this_unit = (root_tags_in_this_unit+root_tags_per_work-1) / root_tags_per_work; if(build) { @@ -1228,7 +1228,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // rjf: hash <:= non-reference attributes, if(need_tag_hash) for(DW2_AttribNode *n = tag.attribs.first; n != 0; n = n->next) { - if(n->v.val.kind != DW_FormKind_RefAddr && + B32 is_name = (n->v.attrib_kind == DW_AttribKind_Name); + if(((tag.kind != DW_TagKind_SubProgram && tag.kind != DW_TagKind_FormalParameter) || !is_name) && + n->v.val.kind != DW_FormKind_RefAddr && n->v.val.kind != DW_FormKind_Ref1 && n->v.val.kind != DW_FormKind_Ref2 && n->v.val.kind != DW_FormKind_Ref4 && @@ -1408,7 +1410,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) DW2_ParseCtx *origin_unit_parse_ctx = &unit_parse_ctxs[origin_unit_idx]; Rng1U64 origin_unit_info_tag_range = unit_info_tag_ranges[origin_unit_idx]; - //- rjf: gather all tags which we want to deduplicate + //- rjf: gather all tags which we want to deduplicate in this work typedef struct D2R_TagNode D2R_TagNode; struct D2R_TagNode { @@ -1592,16 +1594,10 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { Temp dedup_root_scratch = scratch_begin(&scratch.arena, 1); - { - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[origin_unit_idx]; - DW2_Tag tag = {0}; - dw2_read_tag(dedup_root_scratch.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, tag_n->info_off, &tag); - String8 name = dw2_attrib_from_kind(&tag, DW_AttribKind_Name)->val.string; - ProfBegin("%.*s (%.*s)", str8_varg(name), str8_varg(dw_string_from_tag_kind(unit_parse_ctx->version, unit_parse_ctx->exts, tag.kind))); - } + //- rjf: unpack tag node + U64 start_off = tag_n->info_off; //- rjf: compute tree hash - U64 start_off = tag_n->info_off; U64 hash = 0; D2R_UniqueTagKind unique_tag_kind = D2R_UniqueTagKind_Type; U64 container_ancestor_info_off = 0; @@ -1628,7 +1624,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U64 seen_task_slots_count = 16; SeenTask **seen_task_slots = push_array(dedup_root_scratch.arena, SeenTask *, seen_task_slots_count); TagTask start_task = {0, DW_TagKind_Null, 0, origin_unit_idx, start_off, start_off, 0}; - ProfBegin("task"); TagTask *top_task = &start_task; TagTask *free_task = 0; for(;top_task != 0;) @@ -1691,17 +1686,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) top_task->container_ancestor_info_off = container_ancestor_info_off; } - // rjf: remember that we saw this task, for recursive references - if(start_off == top_task->start_off) - { - U64 off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 off_slot_idx = off_hash%seen_task_slots_count; - SeenTask *t = push_array(dedup_root_scratch.arena, SeenTask, 1); - t->off = start_off; - t->tag_hash = tag_hash; - SLLStackPush(seen_task_slots[off_slot_idx], t); - } - // rjf: combine tag's hash to tree hash if(include_tag_in_hash) { @@ -1709,7 +1693,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } // rjf: determine if we want to descend to children - B32 descend = (tag.kind != DW_TagKind_Namespace); + B32 descend = (top_task->root_tag_kind != DW_TagKind_Namespace); // rjf: tree navigations if(descend) @@ -1733,7 +1717,21 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); } - // rjf: if this type reference is recursive, just merge the referenced type's tag hash + // rjf: remember that we visited this tag, to detect cycles later + if(include_tag_in_hash && + (tag.kind == DW_TagKind_StructureType || + tag.kind == DW_TagKind_UnionType || + tag.kind == DW_TagKind_ClassType)) + { + U64 off_hash = u64_hash_from_str8(str8_struct(&start_off)); + U64 off_slot_idx = off_hash%seen_task_slots_count; + SeenTask *t = push_array(dedup_root_scratch.arena, SeenTask, 1); + t->off = start_off; + t->tag_hash = tag_hash; + SLLStackPush(seen_task_slots[off_slot_idx], t); + } + + // rjf: if this type reference is recursive, just merge an ancestor identifier into the hash B32 type_ref_is_recursive = 0; if(type_info_off != 0) { @@ -1775,8 +1773,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) SLLStackPush(top_task, task); task->unit_idx = unit_idx; task->start_off = task->off = type_info_off; - String8 name = dw2_attrib_from_kind(&tag, DW_AttribKind_Name)->val.string; - ProfBegin("%.*s (%.*s)", str8_varg(name), str8_varg(dw_string_from_tag_kind(unit_parse_ctx->version, unit_parse_ctx->exts, tag.kind))); } scratch_end(tag_scratch); @@ -1792,7 +1788,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&popped->hash)); } - ProfEnd(); } } hash = start_task.hash; @@ -1914,7 +1909,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) } scratch_end(dedup_root_scratch); - ProfEnd(); } // ProfMsg("work_idx %I64u: %I64u tags encountered", work_idx, total_tag_count_this_work); ProfEnd(); @@ -1983,7 +1977,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) { for EachNode(n, D2R_UniqueTagNode, unique_tag_slots[slot_idx]) { - raddbg_log("0x%I64x -> 0x%I64x\n", n->info_off, n->hash); deduped_tag_counts[n->kind] += 1; } } diff --git a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c index f9a069cd..36209f00 100644 --- a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c +++ b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c @@ -64,7 +64,7 @@ SkippedTest(d2r_regressions) } } -SkippedTest(d2r_determinism) +Test(d2r_determinism) { U64 num_repeats_per_bin = 16; String8 radbin_path = test_build_exe_path(arena, s("radbin")); From 98b7b5859c093990fea4d9f47c37b11297f99bf0 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 23 Jun 2026 12:32:11 -0700 Subject: [PATCH 845/850] rdi_from_dwarf: stub out pointers for now, cache as we go, merge type dependency count calculation with hash computation --- src/dwarf/dwarf_parse_coff.c | 2 +- src/dwarf/dwarf_parse_coff.h | 2 +- src/dwarf/tests/dwarf_tests.c | 2 +- src/radbin/radbin.c | 30 +- src/rdi_from_dwarf/rdi_from_dwarf.c | 348 ++++-------------- src/rdi_from_dwarf/rdi_from_dwarf.h | 1 + .../tests/rdi_from_dwarf_tests.c | 2 +- 7 files changed, 90 insertions(+), 297 deletions(-) diff --git a/src/dwarf/dwarf_parse_coff.c b/src/dwarf/dwarf_parse_coff.c index 617f06ec..2c28d8be 100644 --- a/src/dwarf/dwarf_parse_coff.c +++ b/src/dwarf/dwarf_parse_coff.c @@ -20,7 +20,7 @@ dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, } internal DW_Raw -dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table) +dw_raw_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table) { DW_Raw input = {0}; B32 sect_status[ArrayCount(input.sec)] = {0}; diff --git a/src/dwarf/dwarf_parse_coff.h b/src/dwarf/dwarf_parse_coff.h index 9523f053..d7367928 100644 --- a/src/dwarf/dwarf_parse_coff.h +++ b/src/dwarf/dwarf_parse_coff.h @@ -5,6 +5,6 @@ #define DWARF_PARSE_COFF_H internal B32 dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, COFF_SectionHeader *section_table); -internal DW_Raw dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); +internal DW_Raw dw_raw_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table); #endif // DWARF_PARSE_COFF_H diff --git a/src/dwarf/tests/dwarf_tests.c b/src/dwarf/tests/dwarf_tests.c index f6137a08..0ccca30d 100644 --- a/src/dwarf/tests/dwarf_tests.c +++ b/src/dwarf/tests/dwarf_tests.c @@ -206,7 +206,7 @@ dw_input_from_writer(Arena *arena, DW_Writer *writer) PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, exe); COFF_SectionHeader *section_table = (COFF_SectionHeader *)(exe.str + pe.section_table_range.min); String8 string_table = str8_substr(exe, pe.string_table_range); - DW_Raw input = dw_input_from_coff_section_table(arena, exe, string_table, pe.section_count, section_table); + DW_Raw input = dw_raw_from_coff_section_table(arena, exe, string_table, pe.section_count, section_table); obj_release(&obj); scratch_end(scratch); diff --git a/src/radbin/radbin.c b/src/radbin/radbin.c index ddf9c9ef..a89b0fb8 100644 --- a/src/radbin/radbin.c +++ b/src/radbin/radbin.c @@ -824,7 +824,7 @@ rb_thread_entry_point(void *p) String8 string_table = str8_substr(exe_data, pe.string_table_range); convert_params.arch = pe.arch; convert_params.base_vaddr = pe.image_base; - convert_params.raw = dw_input_from_coff_section_table(scratch.arena, exe_data, string_table, pe.section_count, section_table); + convert_params.raw = dw_raw_from_coff_section_table(arena, exe_data, string_table, pe.section_count, section_table); convert_params.path_style = PathStyle_WindowsAbsolute; convert_params.binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, exe_data, string_table, pe.section_count, section_table); scratch_end(scratch); @@ -836,7 +836,7 @@ rb_thread_entry_point(void *p) ELF_Bin bin = elf_bin_from_data(scratch.arena, dbg_data); convert_params.arch = arch_from_elf_machine(bin.hdr.e_machine); convert_params.base_vaddr = elf_base_addr_from_bin(&bin); - convert_params.raw = dw_raw_from_elf_bin(scratch.arena, dbg_data, &bin); + convert_params.raw = dw_raw_from_elf_bin(arena, dbg_data, &bin); convert_params.path_style = PathStyle_UnixAbsolute; convert_params.binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, dbg_data, &bin, &bin.shdrs); scratch_end(scratch); @@ -1333,7 +1333,7 @@ rb_thread_entry_point(void *p) fprintf(stderr, "-------------------------------------------------------------------------------\n\n"); fprintf(stderr, "DWARF Sections:\n"); -#define X(_N, _L, ...) fprintf(stderr, _L "\n"); +#define X(_N, _L, ...) if(DW_SectionKind_##_N != DW_SectionKind_Null) { fprintf(stderr, " - " _L "\n"); } DW_SectionKind_XList #undef X fprintf(stderr, "\n"); @@ -1389,7 +1389,7 @@ rb_thread_entry_point(void *p) } } - //- rjf: dump input files in ordere + //- rjf: dump input files in order for(RB_FileNode *n = input_files.first; n != 0; n = n->next) { RB_File *f = n->v; @@ -1403,15 +1403,15 @@ rb_thread_entry_point(void *p) lane_sync(); //- rjf: unpack file parses - Arch arch = Arch_Null; - PE_BinInfo pe = {0}; - ELF_Bin elf = {0}; - COFF_FileHeaderInfo coff_obj = {0}; - DW_Raw dw = {0}; - U64 eh_frame_hdr_vaddr = 0; - U64 eh_frame_vaddr = 0; - String8 eh_frame_hdr = {0}; - String8 eh_frame = {0}; + Arch arch = Arch_Null; + PE_BinInfo pe = {0}; + ELF_Bin elf = {0}; + COFF_FileHeaderInfo coff_obj = {0}; + DW_Raw dw = {0}; + U64 eh_frame_hdr_vaddr = 0; + U64 eh_frame_vaddr = 0; + String8 eh_frame_hdr = {0}; + String8 eh_frame = {0}; { if(f->format == RB_FileFormat_PE) { @@ -1424,7 +1424,7 @@ rb_thread_entry_point(void *p) String8 string_table = str8_substr(f->data, coff_obj.string_table_range); U64 section_count = coff_obj.section_count_no_null; COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(f->data, coff_obj.section_table_range).str; - dw = dw_input_from_coff_section_table(arena, f->data, string_table, section_count, section_table); + dw = dw_raw_from_coff_section_table(arena, f->data, string_table, section_count, section_table); } else if(f->format == RB_FileFormat_ELF32 || f->format == RB_FileFormat_ELF64) { @@ -1454,7 +1454,7 @@ rb_thread_entry_point(void *p) U64 section_count = raw_sections.size / sizeof(COFF_SectionHeader); COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_sections.str; String8 string_table = str8_substr(f->data, pe.string_table_range); - dw = dw_input_from_coff_section_table(arena, f->data, string_table, section_count, section_table); + dw = dw_raw_from_coff_section_table(arena, f->data, string_table, section_count, section_table); } else if(f->format == RB_FileFormat_ELF32 || f->format == RB_FileFormat_ELF64) diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 81164c33..c8f88b84 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -1601,35 +1601,52 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U64 hash = 0; D2R_UniqueTagKind unique_tag_kind = D2R_UniqueTagKind_Type; U64 container_ancestor_info_off = 0; + U64 dependency_count = 0; { - typedef struct SeenTask SeenTask; - struct SeenTask - { - SeenTask *next; - U64 off; - U64 tag_hash; - }; typedef struct TagTask TagTask; struct TagTask { TagTask *next; DW_TagKind root_tag_kind; U64 container_ancestor_info_off; + U64 dependency_count; U64 unit_idx; U64 start_off; U64 off; S64 depth; U64 hash; }; - U64 seen_task_slots_count = 16; - SeenTask **seen_task_slots = push_array(dedup_root_scratch.arena, SeenTask *, seen_task_slots_count); - TagTask start_task = {0, DW_TagKind_Null, 0, origin_unit_idx, start_off, start_off, 0}; + TagTask start_task = {0, DW_TagKind_Null, 0, 0, origin_unit_idx, start_off, start_off, 0}; TagTask *top_task = &start_task; TagTask *free_task = 0; for(;top_task != 0;) { + //- rjf: try to find an already-computed hash for this task + U64 already_computed_hash = 0; + B32 found_already_computed_hash = 0; + { + U64 off_hash = u64_hash_from_str8(str8_struct(&top_task->start_off)); + U64 off_slot_idx = off_hash%unit_deduped_tag_maps[top_task->unit_idx].slots_count; + D2R_UnitDedupedTagNode *slot_head = (D2R_UnitDedupedTagNode *)ins_atomic_u64_eval(&unit_deduped_tag_maps[top_task->unit_idx].slots[off_slot_idx]); + for(D2R_UnitDedupedTagNode *n = slot_head; n != 0; n = n->next) + { + if(n->src_info_off == top_task->start_off) + { + found_already_computed_hash = 1; + already_computed_hash = n->dst_hash; + break; + } + } + } + + //- rjf: if we found an already-computed hash, just write it into this task as its result + if(found_already_computed_hash) + { + top_task->hash = already_computed_hash; + } + //- rjf: determine if we're done with this hash - B32 done = (top_task->depth == 0 && top_task->start_off != top_task->off); + B32 done = (found_already_computed_hash || (top_task->depth == 0 && top_task->start_off != top_task->off)); //- rjf: if we're not done -> continue contributing to the task's hash if(!done) @@ -1711,38 +1728,27 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // rjf: unpack type reference in this tag DW2_Attrib *type_attrib = &dw2_attrib_nil; U64 type_info_off = 0; - if(include_tag_in_hash) + if(include_tag_in_hash && + tag.kind != DW_TagKind_PointerType && + tag.kind != DW_TagKind_ReferenceType && + tag.kind != DW_TagKind_RValueReferenceType && + tag.kind != DW_TagKind_PtrToMemberType) { type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &type_attrib->val); } - // rjf: remember that we visited this tag, to detect cycles later - if(include_tag_in_hash && - (tag.kind == DW_TagKind_StructureType || - tag.kind == DW_TagKind_UnionType || - tag.kind == DW_TagKind_ClassType)) - { - U64 off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 off_slot_idx = off_hash%seen_task_slots_count; - SeenTask *t = push_array(dedup_root_scratch.arena, SeenTask, 1); - t->off = start_off; - t->tag_hash = tag_hash; - SLLStackPush(seen_task_slots[off_slot_idx], t); - } - // rjf: if this type reference is recursive, just merge an ancestor identifier into the hash B32 type_ref_is_recursive = 0; if(type_info_off != 0) { - U64 off_hash = u64_hash_from_str8(str8_struct(&type_info_off)); - U64 off_slot_idx = off_hash%seen_task_slots_count; - for(SeenTask *t = seen_task_slots[off_slot_idx]; t != 0; t = t->next) + U64 ancestor_idx = 0; + for(TagTask *t = top_task; t != 0; t = t->next, ancestor_idx += 1) { - if(t->off == type_info_off) + if(t->start_off == type_info_off) { type_ref_is_recursive = 1; - top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&t->tag_hash)); + top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&ancestor_idx)); break; } } @@ -1751,6 +1757,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // rjf: if this tag has a non-recursive type reference -> push a new task to hash the type. if(!type_ref_is_recursive && type_info_off != 0) { + top_task->dependency_count += 1; U64 unit_idx = top_task->unit_idx; if(!contains_1u64(unit_info_tag_range, type_info_off)) { @@ -1778,7 +1785,26 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) scratch_end(tag_scratch); } - //- rjf: if we're done -> pop this task off the stack, merge into parent hash + //- rjf: if we're done, and if we computed the hash on this lane -> record in the per-unit (offset -> hash) table + if(done && !found_already_computed_hash) + { + U64 info_off_hash = u64_hash_from_str8(str8_struct(&top_task->start_off)); + U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[top_task->unit_idx].slots_count; + D2R_UnitDedupedTagNode *n = push_array(scratch.arena, D2R_UnitDedupedTagNode, 1); + n->src_info_off = top_task->start_off; + n->dst_hash = top_task->hash; + for(B32 inserted = 0; !inserted;) + { + U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); + n->next = (D2R_UnitDedupedTagNode *)slot_head_val; + if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) + { + inserted = 1; + } + } + } + + //- rjf: if we're done -> pop this task off the stack, merge into parent task if(done && top_task != 0) { TagTask *popped = top_task; @@ -1787,30 +1813,14 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) if(top_task != 0) { top_task->hash = u64_hash_from_seed_str8(top_task->hash, str8_struct(&popped->hash)); + top_task->dependency_count += popped->dependency_count; } } } hash = start_task.hash; unique_tag_kind = (start_task.root_tag_kind == DW_TagKind_Namespace ? D2R_UniqueTagKind_Namespace : D2R_UniqueTagKind_Type); container_ancestor_info_off = start_task.container_ancestor_info_off; - } - - //- rjf: record in the per-unit (offset -> hash) table - { - U64 info_off_hash = u64_hash_from_str8(str8_struct(&start_off)); - U64 info_off_slot_idx = info_off_hash%unit_deduped_tag_maps[origin_unit_idx].slots_count; - D2R_UnitDedupedTagNode *n = push_array(scratch.arena, D2R_UnitDedupedTagNode, 1); - n->src_info_off = start_off; - n->dst_hash = hash; - for(B32 inserted = 0; !inserted;) - { - U64 slot_head_val = ins_atomic_u64_eval(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx]); - n->next = (D2R_UnitDedupedTagNode *)slot_head_val; - if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unit_deduped_tag_maps[origin_unit_idx].slots[info_off_slot_idx], (U64)n, slot_head_val)) - { - inserted = 1; - } - } + dependency_count = start_task.dependency_count; } //- rjf: record this in the (hash -> offset) deduplicated table @@ -1895,6 +1905,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) n->hash = hash; n->info_off = start_off; n->container_ancestor_info_off = container_ancestor_info_off; + n->dependency_count = dependency_count; U64 new_head_val = (U64)n; if(slot_head_val == ins_atomic_u64_eval_cond_assign(&unique_tag_slots[slot_idx], new_head_val, slot_head_val)) { @@ -2002,228 +2013,6 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U64 namespace_count = deduped_tag_counts[D2R_UniqueTagKind_Namespace]; D2R_UniqueTagNode **namespace_tag_nodes = deduped_tag_nodes[D2R_UniqueTagKind_Namespace]; - //////////////////////////// - //- rjf: gather per-type dependency chains - // - typedef struct TypeDepChain TypeDepChain; - struct TypeDepChain - { - TypeDepChain *next; - U64 type_idx; - }; - U64 *type_dep_chains_counts = 0; - ProfScope("gather per-type dependency chains") - { - if(lane_idx() == 0) - { - type_dep_chains_counts = push_array(scratch.arena, U64, type_count); - } - lane_sync_u64(&type_dep_chains_counts, 0); - Rng1U64 range = lane_range(type_count); - for EachInRange(root_type_idx, range) - { - typedef struct TypeChainTask TypeChainTask; - struct TypeChainTask - { - TypeChainTask *next; - U64 hash; - }; - TypeChainTask start_task = {0, type_tag_nodes[root_type_idx]->hash}; - TypeChainTask *top_task = &start_task; - TypeChainTask *free_task = 0; - TypeChainTask *last_t = 0; - for(TypeChainTask *t = top_task; t != 0; (last_t = t, t = t->next)) - { - Temp scratch2 = scratch_begin(&scratch.arena, 1); - - // rjf: recycle old tasks - if(last_t != 0) - { - SLLStackPush(free_task, last_t); - } - - // rjf: unpack task - U64 hash = t->hash; - - // rjf: hash -> unique type tag node - D2R_UniqueTagNode *type_tag_node = 0; - { - U64 slot_idx = hash%unique_tag_slots_count; - for(D2R_UniqueTagNode *n = unique_tag_slots[slot_idx]; n != 0; n = n->next) - { - if(n->hash == hash) - { - type_tag_node = n; - break; - } - } - } - - // rjf: unpack type tag node - U64 info_off = 0; - U64 unit_idx = 0; - if(type_tag_node != 0) - { - info_off = type_tag_node->info_off; - U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); - unit_idx = unit_num > 0 ? unit_num-1 : 0; - } - - // rjf: record this type in the dependency chain count - if(type_tag_node != 0) - { - type_dep_chains_counts[root_type_idx] += 1; - } - - // rjf: unpack unit - DW2_ParseCtx *unit_parse_ctx = &unit_parse_ctxs[unit_idx]; - Rng1U64 unit_info_tag_range = unit_info_tag_ranges[unit_idx]; - - // rjf: parse this type's tag - U64 read_off = info_off; - DW2_Tag tag = {0}; - read_off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, read_off, &tag); - - // rjf: find direct types from this type tag - typedef struct DirectTypeNode DirectTypeNode; - struct DirectTypeNode - { - DirectTypeNode *next; - U64 info_off; - U64 unit_idx; - }; - DirectTypeNode *first_direct_type = 0; - DirectTypeNode *last_direct_type = 0; - switch(tag.kind) - { - default:{}break; - case DW_TagKind_PointerType: - case DW_TagKind_ReferenceType: - case DW_TagKind_RValueReferenceType: - case DW_TagKind_RestrictType: - case DW_TagKind_VolatileType: - case DW_TagKind_ConstType: - case DW_TagKind_ArrayType: - case DW_TagKind_Typedef: - case DW_TagKind_SubProgram: - case DW_TagKind_SubroutineType: - case DW_TagKind_EnumerationType: - { - // rjf: gather direct type - { - DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&tag, DW_AttribKind_Type); - U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - U64 direct_type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - direct_type_unit_idx = new_unit_num-1; - } - } - DirectTypeNode *n = push_array(scratch2.arena, DirectTypeNode, 1); - n->info_off = direct_type_info_off; - n->unit_idx = direct_type_unit_idx; - SLLQueuePush(first_direct_type, last_direct_type, n); - } - - // rjf: functions -> gather parameters - if(tag.has_children && (tag.kind == DW_TagKind_SubProgram || tag.kind == DW_TagKind_SubroutineType)) - { - S64 depth = 1; - for(;depth > 0 && contains_1u64(unit_info_tag_range, read_off);) - { - U64 start_read_off = read_off; - - // rjf: read child tag - DW2_Tag child_tag = {0}; - read_off += dw2_read_tag(scratch2.arena, raw, unit_parse_ctx, raw->sec[DW_SectionKind_Info].data, read_off, &child_tag); - - // rjf: formal parameters -> gather direct types - if(depth == 1 && child_tag.kind == DW_TagKind_FormalParameter) - { - DW2_Attrib *direct_type_attrib = dw2_attrib_from_kind(&child_tag, DW_AttribKind_Type); - U64 direct_type_info_off = dw2_reference_info_off_from_form_val(unit_parse_ctx, &direct_type_attrib->val); - U64 direct_type_unit_idx = unit_idx; - if(!contains_1u64(unit_info_tag_range, direct_type_info_off)) - { - U64 new_unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, direct_type_info_off); - if(0 < new_unit_num && new_unit_num <= unit_count) - { - direct_type_unit_idx = new_unit_num-1; - } - } - DirectTypeNode *n = push_array(scratch2.arena, DirectTypeNode, 1); - n->info_off = direct_type_info_off; - n->unit_idx = direct_type_unit_idx; - SLLQueuePush(first_direct_type, last_direct_type, n); - } - - // rjf: tree navigations - if(child_tag.has_children) - { - depth += 1; - } - if(child_tag.kind == DW_TagKind_Null) - { - depth -= 1; - } - - if(read_off == start_read_off) - { - break; - } - } - } - }break; - } - - // rjf: for each dependency type, look up their hash, + spawn new tasks for them - for EachNode(n, DirectTypeNode, first_direct_type) - { - U64 direct_type_info_off = n->info_off; - U64 direct_type_unit_idx = n->unit_idx; - - // rjf: direct type info offset -> hash - U64 direct_type_hash = 0; - { - U64 off_hash = u64_hash_from_str8(str8_struct(&direct_type_info_off)); - U64 off_slot_idx = off_hash%unit_deduped_tag_maps[direct_type_unit_idx].slots_count; - for(D2R_UnitDedupedTagNode *n = unit_deduped_tag_maps[direct_type_unit_idx].slots[off_slot_idx]; n != 0; n = n->next) - { - if(n->src_info_off == direct_type_info_off) - { - direct_type_hash = n->dst_hash; - break; - } - } - } - - // rjf: spawn task - if(direct_type_hash != 0) - { - TypeChainTask *new_task = free_task; - if(new_task != 0) - { - SLLStackPop(free_task); - } - else - { - new_task = push_array(scratch.arena, TypeChainTask, 1); - } - new_task->next = t->next; - new_task->hash = direct_type_hash; - t->next = new_task; - } - } - - scratch_end(scratch2); - } - } - lane_sync(); - } - //////////////////////////// //- rjf: build built-in types // @@ -2288,7 +2077,7 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) lane_sync_u64(&all_types, 0); lane_sync_u64(&type_from_idx_map, 0); Rng1U64 range = lane_range(type_count); - U64 max_chain_count = 1; + U64 max_chain_count = 0; for(;max_chain_count < max_U64;) { Temp scratch2 = scratch_begin(&scratch.arena, 1); @@ -2301,6 +2090,9 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) U64 lane_types_chunk_count = 256; for EachInRange(type_idx, range) { + // rjf: idx -> type tag node + D2R_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + // rjf: if this type has a higher chain count than the current, // but it is lower than our next maximum chain count, collect it, // so we will hit @@ -2308,19 +2100,19 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) // if this type has a lower chain count than the current, // we should've already built it from a previous pass. // - if(type_dep_chains_counts[type_idx] > max_chain_count) + U64 dependency_count = type_tag_node->dependency_count; + if(dependency_count > max_chain_count) { - next_max_chain_count = Min(type_dep_chains_counts[type_idx], next_max_chain_count); + next_max_chain_count = Min(dependency_count, next_max_chain_count); continue; } - else if(type_dep_chains_counts[type_idx] < max_chain_count) + else if(dependency_count < max_chain_count) { continue; } Temp temp = temp_begin(scratch2.arena); - // rjf: idx -> type tag node - D2R_UniqueTagNode *type_tag_node = type_tag_nodes[type_idx]; + // rjf: unpack type tag node U64 info_off = type_tag_node->info_off; U64 unit_num = rng1u64_array_num_from_value__binary_search(&unit_info_tag_ranges_array, info_off); U64 unit_idx = unit_num > 0 ? unit_num-1 : 0; diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index 9885aa1d..85bb78ad 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -35,6 +35,7 @@ struct D2R_UniqueTagNode U64 hash; U64 info_off; U64 container_ancestor_info_off; + U64 dependency_count; U64 order_idx; }; diff --git a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c index 36209f00..f9a069cd 100644 --- a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c +++ b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c @@ -64,7 +64,7 @@ SkippedTest(d2r_regressions) } } -Test(d2r_determinism) +SkippedTest(d2r_determinism) { U64 num_repeats_per_bin = 16; String8 radbin_path = test_build_exe_path(arena, s("radbin")); From 84d025e9402ad6a08fa2613a1719813ecca10e13 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 22 Jun 2026 18:18:16 -0700 Subject: [PATCH 846/850] force inline string compars --- src/base/base_strings.c | 27 +++++++++++---------------- src/linker/pdb_ext/pdb_builder.c | 17 +++++++---------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/base/base_strings.c b/src/base/base_strings.c index da8a85f6..aa65537d 100644 --- a/src/base/base_strings.c +++ b/src/base/base_strings.c @@ -3076,43 +3076,38 @@ str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out) //////////////////////////////// -internal int +force_inline int str8_compar(String8 a, String8 b, B32 ignore_case) { - int cmp = 0; U64 size = Min(a.size, b.size); - if (ignore_case) - { - cmp = MemCompareI(a.str, b.str, size); - } - else - { - cmp = MemCompare(a.str, b.str, size); - cmp = cmp > 0 ? 1 : cmp < 0 ? -1 : 0; - } - + int cmp = ignore_case ? MemCompareI(a.str, b.str, size) : MemCompare(a.str, b.str, size); + + // normalize compar result + cmp = cmp > 0 ? 1 : cmp < 0 ? -1 : 0; + // shorter prefix must precede longer prefixes if (cmp == 0) { - cmp = (a.size > b.size) - (b.size - a.size); + cmp = a.size < b.size ? -1 : + a.size > b.size ? +1 : 0; } return cmp; } -internal int +force_inline int str8_compar_ignore_case(const void *a, const void *b) { return str8_compar(*(String8*)a, *(String8*)b, 1); } -internal int +force_inline int str8_compar_case_sensitive(const void *a, const void *b) { return str8_compar(*(String8*)a, *(String8*)b, 0); } -internal int +force_inline int str8_is_before_case_sensitive(const void *a, const void *b) { int cmp = str8_compar_case_sensitive(a, b); diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index 0c6e5809..be696012 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -1845,7 +1845,7 @@ gsi_symbol_is_before(void *raw_a, void *raw_b) return is_before; } -internal int +force_inline int gsi_pub_symbol_is_before(void *raw_a, void *raw_b) { CV_Symbol *a = *(CV_Symbol **)raw_a; @@ -1870,7 +1870,6 @@ gsi_pub_symbol_is_before(void *raw_a, void *raw_b) } } } - is_before = cmp < 0; } @@ -1888,10 +1887,8 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) CV_SymbolList bucket = task->bucket_arr[bucket_idx]; CV_Symbol **symbol_arr = push_array(scratch.arena, CV_Symbol *, bucket.count); - { - U64 i = 0; - for EachNode(n, CV_SymbolNode, bucket.first) { symbol_arr[i++] = &n->data; } - } + U64 symbol_arr_count = 0; + for EachNode(n, CV_SymbolNode, bucket.first) { symbol_arr[symbol_arr_count++] = &n->data; } // sort symbols within bucket radsort(symbol_arr, bucket.count, gsi_pub_symbol_is_before); @@ -1906,10 +1903,10 @@ THREAD_POOL_TASK_FUNC(gsi_serialize_pub32) for EachIndex(i, bucket.count) { Assert(symbol_arr[i]->kind == CV_SymKind_PUB32); - CV_SymPub32 *pub32 = (CV_SymPub32 *)symbol_arr[i]->data.str; - U8 *str_ptr = (U8 *)(pub32 + 1); - U64 str_size = symbol_arr[i]->data.size - sizeof(*pub32); - String8 name = str8(str_ptr, str_size); + CV_SymPub32 *pub32 = (CV_SymPub32 *)symbol_arr[i]->data.str; + U8 *str_ptr = (U8 *)(pub32 + 1); + U64 str_cap = symbol_arr[i]->data.size - sizeof(*pub32); + String8 name = str8_cstring_capped(str_ptr, str_ptr + str_cap); // init sort record PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx]; From 8dbced69959ef673404df3b68cb135b47fb25af6 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 22 Jun 2026 16:23:26 -0700 Subject: [PATCH 847/850] set flag on import member from the originally linked library, otherwise on subsequent passes linker may queue same import --- src/linker/lnk.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index e82c62ff..0783c957 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -1589,10 +1589,10 @@ lnk_queue_lib_member(Arena *arena, is_addr_import ? is_addr_import : 0; if (is_queued_import) { - // do not queue second import member link -- flag member and continue + // do not queue second import member link -> flag member and continue U8 flag = str8_starts_with(link_symbol->name, str8_lit("__imp_")) ? LNK_LibMemberFlag_LinkedImp : LNK_LibMemberFlag_LinkedRegular; LNK_LibMemberInfo *import_member_infos = hash_map_search_raw_raw(&lib_member_info_hm, is_queued_import->lib); - ins_atomic_u8_or(&import_member_infos[member_idx].flags, flag); + ins_atomic_u8_or(&import_member_infos[is_queued_import->member_idx].flags, flag); } else { B32 do_queue; if (str8_starts_with(link_symbol->name, str8_lit("__imp_"))) { @@ -1816,7 +1816,6 @@ lnk_link_inputs(TP_Context *tp, // sort library member refs to match the order of their appearance in obj symbol tables LNK_LibMemberRef **member_refs = lnk_array_from_lib_member_list(scratch.arena, queued_members); - //qsort(member_refs, queued_members.count, sizeof(member_refs[0]), lnk_lib_member_ref_compar); g_sort_lib_member_context = lib_member_infos; radsort(member_refs, queued_members.count, lnk_lib_member_ref_is_before); From ad20900fc09420ab09a0061a007921b5364d4c17 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 22 Jun 2026 19:22:23 -0700 Subject: [PATCH 848/850] import hash table -> hash map --- src/linker/lnk.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 0783c957..db55faa2 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -2002,8 +2002,8 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer // make imports // { - HashTable *static_imports_ht = hash_table_init(scratch.arena, 0x1000); - HashTable *delayed_imports_ht = hash_table_init(scratch.arena, 0x1000); + HashMap static_imports_hm = {0}; + HashMap delayed_imports_hm = {0}; String8List delayed_dll_names = {0}; String8List static_dll_names = {0}; @@ -2035,36 +2035,36 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer // find DLL with import symbols B32 is_delay_load = lnk_is_dll_delay_load(config, import_header.dll_name); String8List *dll_names = is_delay_load ? &delayed_dll_names : &static_dll_names; - HashTable *imports_ht = is_delay_load ? delayed_imports_ht : static_imports_ht; - PE_MakeImportList *import_symbols = hash_table_search_path_raw(imports_ht, import_header.dll_name); + HashMap *imports_hm = is_delay_load ? &delayed_imports_hm : &static_imports_hm; + PE_MakeImportList *import_symbols = hash_map_search_path_raw(imports_hm, import_header.dll_name); // create record for a first time-DLL if (import_symbols == 0) { import_symbols = push_array(scratch.arena, PE_MakeImportList, 1); str8_list_push(scratch.arena, dll_names, import_header.dll_name); - hash_table_push_path_raw(scratch.arena, imports_ht, import_header.dll_name, import_symbols); + hash_map_push_path_raw(scratch.arena, imports_hm, import_header.dll_name, import_symbols); } // push make import info B32 make_jump_thunk = !!(member_infos[member_idx].flags & LNK_LibMemberFlag_LinkedRegular); pe_make_import_header_list_push(scratch.arena, import_symbols, (PE_MakeImport){ .header = member_info.data, .make_jump_thunk = make_jump_thunk }); } - AssertAlways(delayed_dll_names.node_count == delayed_imports_ht->count); - AssertAlways(static_dll_names.node_count == static_imports_ht->count); + AssertAlways(delayed_dll_names.node_count == delayed_imports_hm.count); + AssertAlways(static_dll_names.node_count == static_imports_hm.count); // make and input delayed imports - if (delayed_imports_ht->count) { + if (delayed_imports_hm.count) { ProfBegin("Build Delay Import Table"); COFF_TimeStamp time_stamp = COFF_TimeStamp_Max; B32 emit_biat = config->import_table_emit_biat == LNK_SwitchState_Yes; B32 emit_uiat = config->import_table_emit_uiat == LNK_SwitchState_Yes; - for (String8Node *dll_name_n = delayed_dll_names.first; dll_name_n != 0; dll_name_n = dll_name_n->next) { - PE_MakeImportList *imports = hash_table_search_path_raw(delayed_imports_ht, dll_name_n->string); - String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string); - String8 import_obj = pe_make_import_dll_obj_delayed(arena->v[0], time_stamp, config->machine, dll_name_n->string, config->delay_load_helper_name, import_debug_symbols, *imports, emit_biat, emit_uiat); - lnk_inputer_push_obj(inputer, 0, str8f(inputer->arena, "Import:%S", dll_name_n->string), import_obj); + for EachNode(name, String8Node, delayed_dll_names.first) { + PE_MakeImportList *imports = hash_map_search_path_raw(&delayed_imports_hm, name->string); + String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, name->string); + String8 import_obj = pe_make_import_dll_obj_delayed(arena->v[0], time_stamp, config->machine, name->string, config->delay_load_helper_name, import_debug_symbols, *imports, emit_biat, emit_uiat); + lnk_inputer_push_obj(inputer, 0, str8f(inputer->arena, "Import:%S", name->string), import_obj); } String8 linker_debug_symbols = lnk_make_linker_debug_symbols(arena->v[0], config->machine); @@ -2077,13 +2077,13 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer } // make and input static imports - if (static_imports_ht->count) { + if (static_imports_hm.count) { ProfBegin("Build Static Import Table"); COFF_TimeStamp time_stamp = COFF_TimeStamp_Max; for (String8Node *dll_name_n = static_dll_names.first; dll_name_n != 0; dll_name_n = dll_name_n->next) { - PE_MakeImportList *imports = hash_table_search_path_raw(static_imports_ht, dll_name_n->string); + PE_MakeImportList *imports = hash_map_search_path_raw(&static_imports_hm, dll_name_n->string); String8 import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string); String8 import_obj = pe_make_import_dll_obj_static(arena->v[0], time_stamp, config->machine, dll_name_n->string, import_debug_symbols, *imports); lnk_inputer_push_obj(inputer, 0, str8f(inputer->arena, "Import:%S", dll_name_n->string), import_obj); @@ -2100,9 +2100,9 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer // warn about unused delayloads if (config->flags & LNK_ConfigFlag_CheckUnusedDelayLoadDll) { - for (String8Node *dll_name_n = config->delay_load_dll_list.first; dll_name_n != 0; dll_name_n = dll_name_n->next) { - if (!hash_table_search_path_raw(delayed_imports_ht, dll_name_n->string)) { - lnk_error(LNK_Warning_UnusedDelayLoadDll, "/DELAYLOAD: %S found no imports", dll_name_n->string); + for EachNode(name, String8Node, config->delay_load_dll_list.first) { + if (!hash_map_search_path_raw(&delayed_imports_hm, name->string)) { + lnk_error(LNK_Warning_UnusedDelayLoadDll, "/DELAYLOAD: found no imports in %S", name->string); } } } From 765b61152d4cb4af709dab2789dc36f89dd63b42 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 22 Jun 2026 22:11:39 -0700 Subject: [PATCH 849/850] sort import library member refs by input index --- src/linker/lnk.c | 39 ++++++++++++++++++++++++++++++++------- src/linker/lnk_config.c | 5 +++++ src/linker/lnk_config.h | 8 +++++--- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index db55faa2..2850b08b 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -168,6 +168,7 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line) "/RAD_MAP_LINES_FOR_UNRESOLVED_SYMBOLS", "/RAD_UNRESOLVED_SYMBOL_LIMIT:1000", "/RAD_UNRESOLVED_SYMBOL_REF_LIMIT:10", + "/RAD_SORT_IMPORTS", (char*)str8f(scratch.arena, "/RAD_MT_PATH:%s", LNK_MANIFEST_MERGE_TOOL_NAME).str, (char*)str8f(scratch.arena, "/RAD_DATA_DIR_COUNT:%u", PE_DataDirectoryIndex_COUNT).str, }; @@ -1247,11 +1248,27 @@ lnk_lib_member_ref_list_concat_in_place_array(LNK_LibMemberRefList *list, LNK_Li static LNK_LibMemberInfo *g_sort_lib_member_context; -internal int +force_inline int lnk_lib_member_ref_is_before(void *raw_a, void *raw_b) { LNK_LibMemberRef **a = raw_a, **b = raw_b; - return lnk_symbol_is_before(g_sort_lib_member_context[(*a)->member_idx].link, g_sort_lib_member_context[(*b)->member_idx].link); + return lnk_symbol_is_before(g_sort_lib_member_context[(*a)->member_idx].link, + g_sort_lib_member_context[(*b)->member_idx].link); +} + +force_inline int +lnk_import_ref_is_before(void *raw_a, void *raw_b) +{ + LNK_LibMemberRef **a_ptr = raw_a, **b_ptr = raw_b; + LNK_LibMemberRef *a = *a_ptr, *b = *b_ptr; + int cmp = u64_compar(&a->lib->input_idx, &b->lib->input_idx); + if (cmp == 0) { + cmp = u32_compar(&a->member_idx, &b->member_idx); + } +#if LNK_PARANOID + if (a != b) Assert(cmp != 0); +#endif + return cmp < 0; } internal LNK_LibMemberRef ** @@ -2002,12 +2019,20 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer // make imports // { - HashMap static_imports_hm = {0}; - HashMap delayed_imports_hm = {0}; - String8List delayed_dll_names = {0}; - String8List static_dll_names = {0}; + HashMap static_imports_hm = {0}; + HashMap delayed_imports_hm = {0}; + String8List delayed_dll_names = {0}; + String8List static_dll_names = {0}; - for EachNode(member_ref, LNK_LibMemberRef, link->imports.first) { + LNK_LibMemberRef **import_member_refs = lnk_array_from_lib_member_list(scratch.arena, link->imports); + + // optionally sort import library member refs by input index + if (config->sort_imports == LNK_SwitchState_Yes) { + radsort(import_member_refs, link->imports.count, lnk_import_ref_is_before); + } + + for EachIndex(import_member_idx, link->imports.count) { + LNK_LibMemberRef *member_ref = import_member_refs[import_member_idx]; LNK_Lib *lib = member_ref->lib; U64 member_idx = member_ref->member_idx; LNK_LibMemberInfo *member_infos = hash_map_search_raw_raw(&link->lib_member_infos_hm, lib); diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index c3e17e6b..84495620 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -92,6 +92,7 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] = { LNK_CmdSwitch_Rad_RemoveSection, 0, "RAD_REMOVE_SECTION", ":NAME", "Removes a section from the image." }, { LNK_CmdSwitch_Rad_SharedThreadPool, 0, "RAD_SHARED_THREAD_POOL", "[:STRING]", "Default value \"" LNK_DEFAULT_THREAD_POOL_NAME "\"" }, { LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, 0, "RAD_SHARED_THREAD_POOL_MAX_WORKERS", ":#", "Set maximum number of workers in a thread pool." }, + { LNK_CmdSwitch_Rad_SortImports, 0, "RAD_SORT_IMPORTS", "[:NO]", "Sort static and delayed import tables by their order of appearance in libs, without assuming link order." }, { LNK_CmdSwitch_Rad_Ignore, 0, "RAD_IGNORE", ":#", "Ignore the specified RAD linker warning." }, { LNK_CmdSwitch_Rad_ImageAltPath, 0, "RAD_IMAGEALTPATH", ":FILENAME", "Alternative name for the image" }, { LNK_CmdSwitch_Rad_WriteTempFiles, 0, "RAD_WRITE_TEMP_FILES", "[:NO]", "When speicifed linker writes image and debug info to temporary files and renames after link is done." }, @@ -2081,6 +2082,10 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } } break; + case LNK_CmdSwitch_Rad_SortImports: { + lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->sort_imports); + } break; + case LNK_CmdSwitch_Rad_Ignore: { S64List error_code_list = {0}; if ( ! lnk_cmd_switch_parse_s64_list(scratch.arena, obj, cmd_switch, value_strings, &error_code_list, 0)) { diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index 267124c8..a781d664 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -96,14 +96,14 @@ typedef enum LNK_CmdSwitch_WholeArchive, LNK_CmdSwitch_Rad_Age, + LNK_CmdSwitch_Rad_BootMode, LNK_CmdSwitch_Rad_BuildExp, - LNK_CmdSwitch_Rad_BuildInfo, LNK_CmdSwitch_Rad_BuildImpLib, + LNK_CmdSwitch_Rad_BuildInfo, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, LNK_CmdSwitch_Rad_DataDirCount, LNK_CmdSwitch_Rad_Debug, LNK_CmdSwitch_Rad_DebugAltPath, - LNK_CmdSwitch_Rad_BootMode, LNK_CmdSwitch_Rad_DebugName, LNK_CmdSwitch_Rad_DelayBind, LNK_CmdSwitch_Rad_DoMerge, @@ -130,13 +130,14 @@ typedef enum LNK_CmdSwitch_Rad_RemoveSection, LNK_CmdSwitch_Rad_SharedThreadPool, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, + LNK_CmdSwitch_Rad_SortImports, LNK_CmdSwitch_Rad_TimeStamp, LNK_CmdSwitch_Rad_TypeHashAlg, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, LNK_CmdSwitch_Rad_Version, - LNK_CmdSwitch_Rad_Workers, LNK_CmdSwitch_Rad_WorkDir, + LNK_CmdSwitch_Rad_Workers, LNK_CmdSwitch_Rad_WriteTempFiles, LNK_CmdSwitch_RadTypeServer, @@ -385,6 +386,7 @@ typedef struct LNK_Config LLVM_GHashAlg type_hash_alg; String8 type_server_name; LNK_SwitchState type_server; + LNK_SwitchState sort_imports; } LNK_Config; // --- MSVC Error Codes -------------------------------------------------------- From 4daefad31e681ccbb0cdecc7c9f2366bb535c806 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 22 Jun 2026 22:15:20 -0700 Subject: [PATCH 850/850] map GNU lib extension --- src/linker/lnk_config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 84495620..ac624c0e 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -119,6 +119,7 @@ global read_only struct { "obj", LNK_Input_Obj }, { "lib", LNK_Input_Lib }, { "rlib", LNK_Input_Lib }, // rust libs + { "a", LNK_Input_Lib }, // GNU lib { "res", LNK_Input_Res }, { "rrt", LNK_Input_RRT }, };